/home/lnzliplg/.cagefs/tmp/phpztZUc0
PK�"�\��$$licenses/alt-libaom/LICENSEnu�[���Copyright (c) 2016, Alliance for Open Media. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in
   the documentation and/or other materials provided with the
   distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

PK�"�\[8�FFlicenses/alt-libaom/PATENTSnu�[���Alliance for Open Media Patent License 1.0

1. License Terms.

1.1. Patent License. Subject to the terms and conditions of this License, each
     Licensor, on behalf of itself and successors in interest and assigns,
     grants Licensee a non-sublicensable, perpetual, worldwide, non-exclusive,
     no-charge, royalty-free, irrevocable (except as expressly stated in this
     License) patent license to its Necessary Claims to make, use, sell, offer
     for sale, import or distribute any Implementation.

1.2. Conditions.

1.2.1. Availability. As a condition to the grant of rights to Licensee to make,
       sell, offer for sale, import or distribute an Implementation under
       Section 1.1, Licensee must make its Necessary Claims available under
       this License, and must reproduce this License with any Implementation
       as follows:

       a. For distribution in source code, by including this License in the
          root directory of the source code with its Implementation.

       b. For distribution in any other form (including binary, object form,
          and/or hardware description code (e.g., HDL, RTL, Gate Level Netlist,
          GDSII, etc.)), by including this License in the documentation, legal
          notices, and/or other written materials provided with the
          Implementation.

1.2.2. Additional Conditions. This license is directly from Licensor to
       Licensee.  Licensee acknowledges as a condition of benefiting from it
       that no rights from Licensor are received from suppliers, distributors,
       or otherwise in connection with this License.

1.3. Defensive Termination. If any Licensee, its Affiliates, or its agents
     initiates patent litigation or files, maintains, or voluntarily
     participates in a lawsuit against another entity or any person asserting
     that any Implementation infringes Necessary Claims, any patent licenses
     granted under this License directly to the Licensee are immediately
     terminated as of the date of the initiation of action unless 1) that suit
     was in response to a corresponding suit regarding an Implementation first
     brought against an initiating entity, or 2) that suit was brought to
     enforce the terms of this License (including intervention in a third-party
     action by a Licensee).

1.4. Disclaimers. The Reference Implementation and Specification are provided
     "AS IS" and without warranty. The entire risk as to implementing or
     otherwise using the Reference Implementation or Specification is assumed
     by the implementer and user. Licensor expressly disclaims any warranties
     (express, implied, or otherwise), including implied warranties of
     merchantability, non-infringement, fitness for a particular purpose, or
     title, related to the material. IN NO EVENT WILL LICENSOR BE LIABLE TO
     ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL,
     INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF
     ACTION OF ANY KIND WITH RESPECT TO THIS LICENSE, WHETHER BASED ON BREACH
     OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR
     NOT THE OTHER PARTRY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

2. Definitions.

2.1. Affiliate.  "Affiliate" means an entity that directly or indirectly
     Controls, is Controlled by, or is under common Control of that party.

2.2. Control. "Control" means direct or indirect control of more than 50% of
     the voting power to elect directors of that corporation, or for any other
     entity, the power to direct management of such entity.

2.3. Decoder.  "Decoder" means any decoder that conforms fully with all
     non-optional portions of the Specification.

2.4. Encoder.  "Encoder" means any encoder that produces a bitstream that can
     be decoded by a Decoder only to the extent it produces such a bitstream.

2.5. Final Deliverable.  "Final Deliverable" means the final version of a
     deliverable approved by the Alliance for Open Media as a Final
     Deliverable.

2.6. Implementation.  "Implementation" means any implementation, including the
     Reference Implementation, that is an Encoder and/or a Decoder. An
     Implementation also includes components of an Implementation only to the
     extent they are used as part of an Implementation.

2.7. License. "License" means this license.

2.8. Licensee. "Licensee" means any person or entity who exercises patent
     rights granted under this License.

2.9. Licensor.  "Licensor" means (i) any Licensee that makes, sells, offers
     for sale, imports or distributes any Implementation, or (ii) a person
     or entity that has a licensing obligation to the Implementation as a
     result of its membership and/or participation in the Alliance for Open
     Media working group that developed the Specification.

2.10. Necessary Claims.  "Necessary Claims" means all claims of patents or
      patent applications, (a) that currently or at any time in the future,
      are owned or controlled by the Licensor, and (b) (i) would be an
      Essential Claim as defined by the W3C Policy as of February 5, 2004
      (https://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential)
      as if the Specification was a W3C Recommendation; or (ii) are infringed
      by the Reference Implementation.

2.11. Reference Implementation. "Reference Implementation" means an Encoder
      and/or Decoder released by the Alliance for Open Media as a Final
      Deliverable.

2.12. Specification. "Specification" means the specification designated by
      the Alliance for Open Media as a Final Deliverable for which this
      License was issued.

PK�(�\C.��H�Hman/man1/python3.7.1nu�[���.TH PYTHON "1"

.\" To view this file while editing, run it through groff:
.\"   groff -Tascii -man python.man | less

.SH NAME
python \- an interpreted, interactive, object-oriented programming language
.SH SYNOPSIS
.B python
[
.B \-B
]
[
.B \-b
]
[
.B \-d
]
[
.B \-E
]
[
.B \-h
]
[
.B \-i
]
[
.B \-I
]
.br
       [
.B \-m
.I module-name
]
[
.B \-q
]
[
.B \-O
]
[
.B \-OO
]
[
.B \-s
]
[
.B \-S
]
[
.B \-u
]
.br
       [
.B \-v
]
[
.B \-V
]
[
.B \-W
.I argument
]
[
.B \-x
]
[
[
.B \-X
.I option
]
.B \-?
]
.br
       [
.B \--check-hash-based-pycs
.I default
|
.I always
|
.I never
]
.br
       [
.B \-c
.I command
|
.I script
|
\-
]
[
.I arguments
]
.SH DESCRIPTION
Python is an interpreted, interactive, object-oriented programming
language that combines remarkable power with very clear syntax.
For an introduction to programming in Python, see the Python Tutorial.
The Python Library Reference documents built-in and standard types,
constants, functions and modules.
Finally, the Python Reference Manual describes the syntax and
semantics of the core language in (perhaps too) much detail.
(These documents may be located via the
.B "INTERNET RESOURCES"
below; they may be installed on your system as well.)
.PP
Python's basic power can be extended with your own modules written in
C or C++.
On most systems such modules may be dynamically loaded.
Python is also adaptable as an extension language for existing
applications.
See the internal documentation for hints.
.PP
Documentation for installed Python modules and packages can be
viewed by running the
.B pydoc
program.
.SH COMMAND LINE OPTIONS
.TP
.B \-B
Don't write
.I .pyc
files on import. See also PYTHONDONTWRITEBYTECODE.
.TP
.B \-b
Issue warnings about str(bytes_instance), str(bytearray_instance)
and comparing bytes/bytearray with str. (-bb: issue errors)
.TP
.BI "\-c " command
Specify the command to execute (see next section).
This terminates the option list (following options are passed as
arguments to the command).
.TP
.BI "\-\-check-hash-based-pycs " mode
Configure how Python evaluates the up-to-dateness of hash-based .pyc files.
.TP
.B \-d
Turn on parser debugging output (for expert only, depending on
compilation options).
.TP
.B \-E
Ignore environment variables like PYTHONPATH and PYTHONHOME that modify
the behavior of the interpreter.
.TP
.B \-h ", " \-? ", "\-\-help
Prints the usage for the interpreter executable and exits.
.TP
.B \-i
When a script is passed as first argument or the \fB\-c\fP option is
used, enter interactive mode after executing the script or the
command.  It does not read the $PYTHONSTARTUP file.  This can be
useful to inspect global variables or a stack trace when a script
raises an exception.
.TP
.B \-I
Run Python in isolated mode. This also implies \fB\-E\fP and \fB\-s\fP. In
isolated mode sys.path contains neither the script's directory nor the user's
site-packages directory. All PYTHON* environment variables are ignored, too.
Further restrictions may be imposed to prevent the user from injecting
malicious code.
.TP
.BI "\-m " module-name
Searches
.I sys.path
for the named module and runs the corresponding
.I .py
file as a script.
.TP
.B \-O
Remove assert statements and any code conditional on the value of
__debug__; augment the filename for compiled (bytecode) files by
adding .opt-1 before the .pyc extension.
.TP
.B \-OO
Do \fB-O\fP and also discard docstrings; change the filename for
compiled (bytecode) files by adding .opt-2 before the .pyc extension.
.TP
.B \-q
Do not print the version and copyright messages. These messages are
also suppressed in non-interactive mode.
.TP
.B \-s
Don't add user site directory to sys.path.
.TP
.B \-S
Disable the import of the module
.I site
and the site-dependent manipulations of
.I sys.path
that it entails.  Also disable these manipulations if
.I site
is explicitly imported later.
.TP
.B \-u
Force the stdout and stderr streams to be unbuffered.
This option has no effect on the stdin stream.
.TP
.B \-v
Print a message each time a module is initialized, showing the place
(filename or built-in module) from which it is loaded.  When given
twice, print a message for each file that is checked for when
searching for a module.  Also provides information on module cleanup
at exit.
.TP
.B \-V ", " \-\-version
Prints the Python version number of the executable and exits.  When given
twice, print more information about the build.
.TP
.BI "\-W " argument
Warning control.  Python sometimes prints warning message to
.IR sys.stderr .
A typical warning message has the following form:
.IB file ":" line ": " category ": " message.
By default, each warning is printed once for each source line where it
occurs.  This option controls how often warnings are printed.
Multiple
.B \-W
options may be given; when a warning matches more than one
option, the action for the last matching option is performed.
Invalid
.B \-W
options are ignored (a warning message is printed about invalid
options when the first warning is issued).  Warnings can also be
controlled from within a Python program using the
.I warnings
module.

The simplest form of
.I argument
is one of the following
.I action
strings (or a unique abbreviation):
.B ignore
to ignore all warnings;
.B default
to explicitly request the default behavior (printing each warning once
per source line);
.B all
to print a warning each time it occurs (this may generate many
messages if a warning is triggered repeatedly for the same source
line, such as inside a loop);
.B module
to print each warning only the first time it occurs in each
module;
.B once
to print each warning only the first time it occurs in the program; or
.B error
to raise an exception instead of printing a warning message.

The full form of
.I argument
is
.IB action : message : category : module : line.
Here,
.I action
is as explained above but only applies to messages that match the
remaining fields.  Empty fields match all values; trailing empty
fields may be omitted.  The
.I message
field matches the start of the warning message printed; this match is
case-insensitive.  The
.I category
field matches the warning category.  This must be a class name; the
match test whether the actual warning category of the message is a
subclass of the specified warning category.  The full class name must
be given.  The
.I module
field matches the (fully-qualified) module name; this match is
case-sensitive.  The
.I line
field matches the line number, where zero matches all line numbers and
is thus equivalent to an omitted line number.
.TP
.BI "\-X " option
Set implementation specific option. The following options are available:

    -X faulthandler: enable faulthandler

    -X showrefcount: output the total reference count and number of used
        memory blocks when the program finishes or after each statement in the
        interactive interpreter. This only works on debug builds

    -X tracemalloc: start tracing Python memory allocations using the
        tracemalloc module. By default, only the most recent frame is stored in a
        traceback of a trace. Use -X tracemalloc=NFRAME to start tracing with a
        traceback limit of NFRAME frames

    -X showalloccount: output the total count of allocated objects for each
        type when the program finishes. This only works when Python was built with
        COUNT_ALLOCS defined

    -X importtime: show how long each import takes. It shows module name,
        cumulative time (including nested imports) and self time (excluding
        nested imports). Note that its output may be broken in multi-threaded
        application. Typical usage is python3 -X importtime -c 'import asyncio'

    -X dev: enable CPython’s “development mode”, introducing additional runtime
        checks which are too expensive to be enabled by default. It will not be
        more verbose than the default if the code is correct: new warnings are
        only emitted when an issue is detected. Effect of the developer mode:
           * Add default warning filter, as -W default
           * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks() C function
           * Enable the faulthandler module to dump the Python traceback on a crash
           * Enable asyncio debug mode
           * Set the dev_mode attribute of sys.flags to True

    -X utf8: enable UTF-8 mode for operating system interfaces, overriding the default
        locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would
        otherwise activate automatically). See PYTHONUTF8 for more details

    -X int_max_str_digits=number: limit the size of int<->str conversions.
       This helps avoid denial of service attacks when parsing untrusted data.
       The default is sys.int_info.default_max_str_digits.  0 disables.

.TP
.B \-x
Skip the first line of the source.  This is intended for a DOS
specific hack only.  Warning: the line numbers in error messages will
be off by one!
.SH INTERPRETER INTERFACE
The interpreter interface resembles that of the UNIX shell: when
called with standard input connected to a tty device, it prompts for
commands and executes them until an EOF is read; when called with a
file name argument or with a file as standard input, it reads and
executes a
.I script
from that file;
when called with
.B \-c
.IR command ,
it executes the Python statement(s) given as
.IR command .
Here
.I command
may contain multiple statements separated by newlines.
Leading whitespace is significant in Python statements!
In non-interactive mode, the entire input is parsed before it is
executed.
.PP
If available, the script name and additional arguments thereafter are
passed to the script in the Python variable
.IR sys.argv ,
which is a list of strings (you must first
.I import sys
to be able to access it).
If no script name is given,
.I sys.argv[0]
is an empty string; if
.B \-c
is used,
.I sys.argv[0]
contains the string
.I '-c'.
Note that options interpreted by the Python interpreter itself
are not placed in
.IR sys.argv .
.PP
In interactive mode, the primary prompt is `>>>'; the second prompt
(which appears when a command is not complete) is `...'.
The prompts can be changed by assignment to
.I sys.ps1
or
.IR sys.ps2 .
The interpreter quits when it reads an EOF at a prompt.
When an unhandled exception occurs, a stack trace is printed and
control returns to the primary prompt; in non-interactive mode, the
interpreter exits after printing the stack trace.
The interrupt signal raises the
.I Keyboard\%Interrupt
exception; other UNIX signals are not caught (except that SIGPIPE is
sometimes ignored, in favor of the
.I IOError
exception).  Error messages are written to stderr.
.SH FILES AND DIRECTORIES
These are subject to difference depending on local installation
conventions; ${prefix} and ${exec_prefix} are installation-dependent
and should be interpreted as for GNU software; they may be the same.
The default for both is \fI/usr/local\fP.
.IP \fI${exec_prefix}/bin/python\fP
Recommended location of the interpreter.
.PP
.I ${prefix}/lib/python<version>
.br
.I ${exec_prefix}/lib/python<version>
.RS
Recommended locations of the directories containing the standard
modules.
.RE
.PP
.I ${prefix}/include/python<version>
.br
.I ${exec_prefix}/include/python<version>
.RS
Recommended locations of the directories containing the include files
needed for developing Python extensions and embedding the
interpreter.
.RE
.SH ENVIRONMENT VARIABLES
.IP PYTHONHOME
Change the location of the standard Python libraries.  By default, the
libraries are searched in ${prefix}/lib/python<version> and
${exec_prefix}/lib/python<version>, where ${prefix} and ${exec_prefix}
are installation-dependent directories, both defaulting to
\fI/usr/local\fP.  When $PYTHONHOME is set to a single directory, its value
replaces both ${prefix} and ${exec_prefix}.  To specify different values
for these, set $PYTHONHOME to ${prefix}:${exec_prefix}.
.IP PYTHONPATH
Augments the default search path for module files.
The format is the same as the shell's $PATH: one or more directory
pathnames separated by colons.
Non-existent directories are silently ignored.
The default search path is installation dependent, but generally
begins with ${prefix}/lib/python<version> (see PYTHONHOME above).
The default search path is always appended to $PYTHONPATH.
If a script argument is given, the directory containing the script is
inserted in the path in front of $PYTHONPATH.
The search path can be manipulated from within a Python program as the
variable
.IR sys.path .
.IP PYTHONSTARTUP
If this is the name of a readable file, the Python commands in that
file are executed before the first prompt is displayed in interactive
mode.
The file is executed in the same name space where interactive commands
are executed so that objects defined or imported in it can be used
without qualification in the interactive session.
You can also change the prompts
.I sys.ps1
and
.I sys.ps2
in this file.
.IP PYTHONOPTIMIZE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-O\fP option. If set to an integer, it is equivalent to
specifying \fB\-O\fP multiple times.
.IP PYTHONDEBUG
If this is set to a non-empty string it is equivalent to specifying
the \fB\-d\fP option. If set to an integer, it is equivalent to
specifying \fB\-d\fP multiple times.
.IP PYTHONDONTWRITEBYTECODE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-B\fP option (don't try to write
.I .pyc
files).
.IP PYTHONINSPECT
If this is set to a non-empty string it is equivalent to specifying
the \fB\-i\fP option.
.IP PYTHONIOENCODING
If this is set before running the interpreter, it overrides the encoding used
for stdin/stdout/stderr, in the syntax
.IB encodingname ":" errorhandler
The
.IB errorhandler
part is optional and has the same meaning as in str.encode. For stderr, the
.IB errorhandler
 part is ignored; the handler will always be \'backslashreplace\'.
.IP PYTHONNOUSERSITE
If this is set to a non-empty string it is equivalent to specifying the
\fB\-s\fP option (Don't add the user site directory to sys.path).
.IP PYTHONUNBUFFERED
If this is set to a non-empty string it is equivalent to specifying
the \fB\-u\fP option.
.IP PYTHONVERBOSE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-v\fP option. If set to an integer, it is equivalent to
specifying \fB\-v\fP multiple times.
.IP PYTHONWARNINGS
If this is set to a comma-separated string it is equivalent to
specifying the \fB\-W\fP option for each separate value.
.IP PYTHONHASHSEED
If this variable is set to "random", a random value is used to seed the hashes
of str, bytes and datetime objects.

If PYTHONHASHSEED is set to an integer value, it is used as a fixed seed for
generating the hash() of the types covered by the hash randomization.  Its
purpose is to allow repeatable hashing, such as for selftests for the
interpreter itself, or to allow a cluster of python processes to share hash
values.

The integer must be a decimal number in the range [0,4294967295].  Specifying
the value 0 will disable hash randomization.
.IP PYTHONINTMAXSTRDIGITS
Limit the maximum digit characters in an int value
when converting from a string and when converting an int back to a str.
A value of 0 disables the limit.  Conversions to or from bases 2, 4, 8,
16, and 32 are never limited.
.IP PYTHONMALLOC
Set the Python memory allocators and/or install debug hooks. The available
memory allocators are
.IR malloc
and
.IR pymalloc .
The available debug hooks are
.IR debug ,
.IR malloc_debug ,
and
.IR pymalloc_debug .
.IP
When Python is compiled in debug mode, the default is
.IR pymalloc_debug
and the debug hooks are automatically used. Otherwise, the default is
.IR pymalloc .
.IP PYTHONMALLOCSTATS
If set to a non-empty string, Python will print statistics of the pymalloc
memory allocator every time a new pymalloc object arena is created, and on
shutdown.
.IP
This variable is ignored if the
.RB $ PYTHONMALLOC
environment variable is used to force the
.BR malloc (3)
allocator of the C library, or if Python is configured without pymalloc support.
.IP PYTHONASYNCIODEBUG
If this environment variable is set to a non-empty string, enable the debug
mode of the asyncio module.
.IP PYTHONTRACEMALLOC
If this environment variable is set to a non-empty string, start tracing
Python memory allocations using the tracemalloc module.
.IP
The value of the variable is the maximum number of frames stored in a
traceback of a trace. For example,
.IB PYTHONTRACEMALLOC=1
stores only the most recent frame.
.IP PYTHONFAULTHANDLER
If this environment variable is set to a non-empty string,
.IR faulthandler.enable()
is called at startup: install a handler for SIGSEGV, SIGFPE, SIGABRT, SIGBUS
and SIGILL signals to dump the Python traceback.
.IP
This is equivalent to the \fB-X faulthandler\fP option.
.IP PYTHONEXECUTABLE
If this environment variable is set,
.IB sys.argv[0]
will be set to its value instead of the value got through the C runtime. Only
works on Mac OS X.
.IP PYTHONUSERBASE
Defines the user base directory, which is used to compute the path of the user
.IR site-packages
directory and Distutils installation paths for
.IR "python setup\.py install \-\-user" .
.IP PYTHONPROFILEIMPORTTIME
If this environment variable is set to a non-empty string, Python will
show how long each import takes. This is exactly equivalent to setting
\fB\-X importtime\fP on the command line.
.IP PYTHONBREAKPOINT
If this environment variable is set to 0, it disables the default debugger. It
can be set to the callable of your debugger of choice.
.SS Debug-mode variables
Setting these variables only has an effect in a debug build of Python, that is,
if Python was configured with the
\fB\--with-pydebug\fP build option.
.IP PYTHONTHREADDEBUG
If this environment variable is set, Python will print threading debug info.
.IP PYTHONDUMPREFS
If this environment variable is set, Python will dump objects and reference
counts still alive after shutting down the interpreter.
.SH AUTHOR
The Python Software Foundation: https://www.python.org/psf/
.SH INTERNET RESOURCES
Main website:  https://www.python.org/
.br
Documentation:  https://docs.python.org/
.br
Developer resources:  https://devguide.python.org/
.br
Downloads:  https://www.python.org/downloads/
.br
Module repository:  https://pypi.org/
.br
Newsgroups:  comp.lang.python, comp.lang.python.announce
.SH LICENSING
Python is distributed under an Open Source license.  See the file
"LICENSE" in the Python source distribution for information on terms &
conditions for accessing and otherwise using Python and for a
DISCLAIMER OF ALL WARRANTIES.
PK�(�\��kk!doc/alt-python37-idna/LICENSE.rstnu�[���License
-------

Copyright (c) 2013-2017, Kim Davies. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

#. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

#. Redistributions in binary form must reproduce the above
   copyright notice, this list of conditions and the following
   disclaimer in the documentation and/or other materials provided with
   the distribution.

#. Neither the name of the copyright holder nor the names of the 
   contributors may be used to endorse or promote products derived 
   from this software without specific prior written permission.

#. THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS "AS IS" AND ANY
   EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR 
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
   USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
   DAMAGE.

Portions of the codec implementation and unit tests are derived from the
Python standard library, which carries the `Python Software Foundation
License <https://docs.python.org/2/license.html>`_:

   Copyright (c) 2001-2014 Python Software Foundation; All Rights Reserved

Portions of the unit tests are derived from the Unicode standard, which 
is subject to the Unicode, Inc. License Agreement:

   Copyright (c) 1991-2014 Unicode, Inc. All rights reserved.
   Distributed under the Terms of Use in 
   <http://www.unicode.org/copyright.html>.

   Permission is hereby granted, free of charge, to any person obtaining
   a copy of the Unicode data files and any associated documentation
   (the "Data Files") or Unicode software and any associated documentation
   (the "Software") to deal in the Data Files or Software
   without restriction, including without limitation the rights to use,
   copy, modify, merge, publish, distribute, and/or sell copies of
   the Data Files or Software, and to permit persons to whom the Data Files
   or Software are furnished to do so, provided that
   
   (a) this copyright and permission notice appear with all copies 
   of the Data Files or Software,

   (b) this copyright and permission notice appear in associated 
   documentation, and

   (c) there is clear notice in each modified Data File or in the Software
   as well as in the documentation associated with the Data File(s) or
   Software that the data or software has been modified.

   THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
   ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
   WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   NONINFRINGEMENT OF THIRD PARTY RIGHTS.
   IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
   NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
   DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
   DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
   TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
   PERFORMANCE OF THE DATA FILES OR SOFTWARE.

   Except as contained in this notice, the name of a copyright holder
   shall not be used in advertising or otherwise to promote the sale,
   use or other dealings in these Data Files or Software without prior
   written authorization of the copyright holder.
PK�(�\���t��!doc/alt-python37-idna/HISTORY.rstnu�[���.. :changelog:

History
-------

2.5 (2017-03-07)
++++++++++++++++

- Fix bug with Katakana middle dot context-rule (Thanks, Greg
  Shikhman.)

2.4 (2017-03-01)
++++++++++++++++

- Restore IDNAError to be a subclass of UnicodeError, as some users of
  this library are only looking for the latter to catch invalid strings.

2.3 (2017-02-28)
++++++++++++++++

- Fix bugs relating to deriving IDNAError from UnicodeError.
- More memory footprint improvements (Thanks, Alex Gaynor)

2.2 (2016-12-21)
++++++++++++++++

- Made some changes to the UTS 46 data that should allow Jython to get around
  64kb Java class limits. (Thanks, John A. Booth and Marcin Płonka.)
- In Python 2.6, skip two tests that rely on data not present in that
  Python version's unicodedata module.
- Use relative imports to help downstream users.

2.1 (2016-03-20)
++++++++++++++++

- Memory consumption optimizations. The library should consume significantly
  less memory through smarter data structures being used to represent
  relevant Unicode properties. Many thanks to Shivaram Lingamneni for this
  patch.
- Patches to make library work better with Python 2.6. The core library
  currently works however the unit testing does not. (Thanks, Robert
  Buchholz)
- Better affix all Unicode codepoint properties to a specific version.

2.0 (2015-05-18)
++++++++++++++++

- Added support for Unicode IDNA Compatibility Processing (aka Unicode
  Technical Standard #46). Big thanks to Jon Ribbens who contributed this
  functionality.

1.1 (2015-01-27)
++++++++++++++++

- Use IDNA properties from Unicode 6.3.0. Internet Architecture Board (IAB)
  issued statement recommending against the use of Unicode 7.0.0 until
  issues relating to U+08A1 codepoint are resolved. See http://goo.gl/Ed1n0K
- Identify some cases when label would be too longer to be a legal DNS name
  and raise an exception. (Thanks, Ed Lewis)

1.0 (2014-10-12)
++++++++++++++++

- Update IDNA properties for Unicode 7.0.0.

0.9 (2014-07-18)
++++++++++++++++

- Fix issue with non-UTF-8 environments reading the README file
  now that it contains non-ASCII. (Thanks, Tom Prince)
- Codec functions are useful, so they are separated into their own
  module, rather than just existing for compatibility reasons.
- Add LICENSE file.

0.8 (2014-07-09)
++++++++++++++++

- Added MANIFEST.in for correct source distribution compilation.

0.7 (2014-07-09)
++++++++++++++++

- Filled out missing tests for various functions.
- Fix bug in CONTEXTO validation for Greek lower numeral sign (U+0375)
- Fix bug in CONTEXTO validation for Japanese middle dot (U+30FB)
- Improved documentation
- Move designation to Stable

0.6 (2014-04-29)
++++++++++++++++

- Minor improvements to Python 3 support, tests (Thanks, Derek Wilson)

0.5 (2014-02-05)
++++++++++++++++

- Update IDNA properties for Unicode 6.3.0.

0.4 (2014-01-07)
++++++++++++++++

- Fix trove classifier for Python 3. (Thanks, Hynek Schlawack)

0.3 (2013-07-18)
++++++++++++++++

- Ported to Python 3.

0.2 (2013-07-16)
++++++++++++++++

- Improve packaging.
- More conformant, passes all relevant tests in the Unicode TR46 test suite.

0.1 (2013-05-27)
++++++++++++++++

- First proof-of-concept version.
PK�(�\��F��� doc/alt-python37-idna/README.rstnu�[���Internationalized Domain Names in Applications (IDNA)
=====================================================

Support for the Internationalised Domain Names in Applications
(IDNA) protocol as specified in `RFC 5891 <http://tools.ietf.org/html/rfc5891>`_.
This is the latest version of the protocol and is sometimes referred to as
“IDNA 2008”.

This library also provides support for Unicode Technical Standard 46,
`Unicode IDNA Compatibility Processing <http://unicode.org/reports/tr46/>`_.

This acts as a suitable replacement for the “encodings.idna” module that
comes with the Python standard library, but only supports the
old, deprecated IDNA specification (`RFC 3490 <http://tools.ietf.org/html/rfc3490>`_).

Basic functions are simply executed:

.. code-block:: pycon

    # Python 3
    >>> import idna
    >>> idna.encode('ドメイン.テスト')
    b'xn--eckwd4c7c.xn--zckzah'
    >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
    ドメイン.テスト

    # Python 2
    >>> import idna
    >>> idna.encode(u'ドメイン.テスト')
    'xn--eckwd4c7c.xn--zckzah'
    >>> print idna.decode('xn--eckwd4c7c.xn--zckzah')
    ドメイン.テスト

Packages
--------

The latest tagged release version is published in the PyPI repository:

.. image:: https://badge.fury.io/py/idna.svg
   :target: http://badge.fury.io/py/idna


Installation
------------

To install this library, you can use pip:

.. code-block:: bash

    $ pip install idna

Alternatively, you can install the package using the bundled setup script:

.. code-block:: bash

    $ python setup.py install

This library works with Python 2.6 or later, and Python 3.3 or later.


Usage
-----

For typical usage, the ``encode`` and ``decode`` functions will take a domain
name argument and perform a conversion to A-labels or U-labels respectively.

.. code-block:: pycon

    # Python 3
    >>> import idna
    >>> idna.encode('ドメイン.テスト')
    b'xn--eckwd4c7c.xn--zckzah'
    >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))
    ドメイン.テスト

You may use the codec encoding and decoding methods using the
``idna.codec`` module:

.. code-block:: pycon

    # Python 2
    >>> import idna.codec
    >>> print u'домена.испытание'.encode('idna')
    xn--80ahd1agd.xn--80akhbyknj4f
    >>> print 'xn--80ahd1agd.xn--80akhbyknj4f'.decode('idna')
    домена.испытание

Conversions can be applied at a per-label basis using the ``ulabel`` or ``alabel``
functions if necessary:

.. code-block:: pycon

    # Python 2
    >>> idna.alabel(u'测试')
    'xn--0zwm56d'

Compatibility Mapping (UTS #46)
+++++++++++++++++++++++++++++++

As described in `RFC 5895 <http://tools.ietf.org/html/rfc5895>`_, the IDNA
specification no longer normalizes input from different potential ways a user
may input a domain name. This functionality, known as a “mapping”, is now
considered by the specification to be a local user-interface issue distinct
from IDNA conversion functionality.

This library provides one such mapping, that was developed by the Unicode
Consortium. Known as `Unicode IDNA Compatibility Processing <http://unicode.org/reports/tr46/>`_,
it provides for both a regular mapping for typical applications, as well as
a transitional mapping to help migrate from older IDNA 2003 applications.

For example, “Königsgäßchen” is not a permissible label as *LATIN CAPITAL
LETTER K* is not allowed (nor are capital letters in general). UTS 46 will
convert this into lower case prior to applying the IDNA conversion.

.. code-block:: pycon

    # Python 3
    >>> import idna
    >>> idna.encode(u'Königsgäßchen')
    ...
    idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed
    >>> idna.encode('Königsgäßchen', uts46=True)
    b'xn--knigsgchen-b4a3dun'
    >>> print(idna.decode('xn--knigsgchen-b4a3dun'))
    königsgäßchen

Transitional processing provides conversions to help transition from the older
2003 standard to the current standard. For example, in the original IDNA
specification, the *LATIN SMALL LETTER SHARP S* (ß) was converted into two
*LATIN SMALL LETTER S* (ss), whereas in the current IDNA specification this
conversion is not performed.

.. code-block:: pycon

    # Python 2
    >>> idna.encode(u'Königsgäßchen', uts46=True, transitional=True)
    'xn--knigsgsschen-lcb0w'

Implementors should use transitional processing with caution, only in rare
cases where conversion from legacy labels to current labels must be performed
(i.e. IDNA implementations that pre-date 2008). For typical applications
that just need to convert labels, transitional processing is unlikely to be
beneficial and could produce unexpected incompatible results.

``encodings.idna`` Compatibility
++++++++++++++++++++++++++++++++

Function calls from the Python built-in ``encodings.idna`` module are
mapped to their IDNA 2008 equivalents using the ``idna.compat`` module.
Simply substitute the ``import`` clause in your code to refer to the
new module name.

Exceptions
----------

All errors raised during the conversion following the specification should
raise an exception derived from the ``idna.IDNAError`` base class.

More specific exceptions that may be generated as ``idna.IDNABidiError``
when the error reflects an illegal combination of left-to-right and right-to-left
characters in a label; ``idna.InvalidCodepoint`` when a specific codepoint is
an illegal character in an IDN label (i.e. INVALID); and ``idna.InvalidCodepointContext``
when the codepoint is illegal based on its positional context (i.e. it is CONTEXTO
or CONTEXTJ but the contextual requirements are not satisfied.)

Testing
-------

The library has a test suite based on each rule of the IDNA specification, as
well as tests that are provided as part of the Unicode Technical Standard 46,
`Unicode IDNA Compatibility Processing <http://unicode.org/reports/tr46/>`_.

The tests are run automatically on each commit at Travis CI:

.. image:: https://travis-ci.org/kjd/idna.svg?branch=master
   :target: https://travis-ci.org/kjd/idna
PK�(�\�Yď#doc/alt-python37-setuptools/LICENSEnu�[���Copyright Jason R. Coombs

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
PK�(�\_��#doc/alt-python37-setuptools/zpl.txtnu�[���Zope Public License (ZPL) Version 2.1

A copyright notice accompanies this license document that identifies the
copyright holders.

This license has been certified as open source. It has also been designated as
GPL compatible by the Free Software Foundation (FSF).

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions in source code must retain the accompanying copyright
notice, this list of conditions, and the following disclaimer.

2. Redistributions in binary form must reproduce the accompanying copyright
notice, this list of conditions, and the following disclaimer in the
documentation and/or other materials provided with the distribution.

3. Names of the copyright holders must not be used to endorse or promote
products derived from this software without prior written permission from the
copyright holders.

4. The right to distribute this software or to use it for any purpose does not
give you the right to use Servicemarks (sm) or Trademarks (tm) of the
copyright
holders. Use of them is covered by separate agreement with the copyright
holders.

5. If any files are modified, you must cause the modified files to carry
prominent notices stating that you changed the files and the date of any
change.

Disclaimer

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK�(�\SoD �1�1$doc/alt-python37-setuptools/psfl.txtnu�[���A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com).  In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property.  Zope Corporation is a sponsoring member of
the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016 Python Software Foundation; All Rights
Reserved" are retained in Python alone or in any derivative version prepared by
Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
PK�(�\���*doc/alt-python37-setuptools/docs/index.rstnu�[���setuptools
==========

Setuptools is a fully-featured, actively-maintained, and stable library
designed to facilitate packaging Python projects.

.. toctree::
   :maxdepth: 1
   :hidden:

   User guide <userguide/index>
   build_meta
   pkg_resources
   references/keywords
   roadmap
   setuptools
   Development guide <development/index>
   Backward compatibility & deprecated practice <deprecated/index>
   Changelog <history>

.. tidelift-referral-banner::
PK�(�\��U��<doc/alt-python37-setuptools/docs/deprecated/easy_install.rstnu�[���============
Easy Install
============

.. warning::
    Easy Install is deprecated. Do not use it. Instead use pip. If
    you think you need Easy Install, please reach out to the PyPA
    team (a ticket to pip or setuptools is fine), describing your
    use-case.

Easy Install is a python module (``easy_install``) bundled with ``setuptools``
that lets you automatically download, build, install, and manage Python
packages.

Please share your experiences with us! If you encounter difficulty installing
a package, please contact us via the `distutils mailing list
<http://mail.python.org/pipermail/distutils-sig/>`_.  (Note: please DO NOT send
private email directly to the author of setuptools; it will be discarded.  The
mailing list is a searchable archive of previously-asked and answered
questions; you should begin your research there before reporting something as a
bug -- and then do so via list discussion first.)

(Also, if you'd like to learn about how you can use ``setuptools`` to make your
own packages work better with EasyInstall, or provide EasyInstall-like features
without requiring your users to use EasyInstall directly, you'll probably want
to check out the full documentation as well.)

Using "Easy Install"
====================


.. _installation instructions:

Installing "Easy Install"
-------------------------

Please see the `setuptools PyPI page <https://pypi.org/project/setuptools/>`_
for download links and basic installation instructions for each of the
supported platforms.

You will need at least Python 3.5 or 2.7.  An ``easy_install`` script will be
installed in the normal location for Python scripts on your platform.

Note that the instructions on the setuptools PyPI page assume that you are
are installing to Python's primary ``site-packages`` directory.  If this is
not the case, you should consult the section below on `Custom Installation
Locations`_ before installing.  (And, on Windows, you should not use the
``.exe`` installer when installing to an alternate location.)

Note that ``easy_install`` normally works by downloading files from the
internet.  If you are behind an NTLM-based firewall that prevents Python
programs from accessing the net directly, you may wish to first install and use
the `APS proxy server <http://ntlmaps.sf.net/>`_, which lets you get past such
firewalls in the same way that your web browser(s) do.

(Alternately, if you do not wish easy_install to actually download anything, you
can restrict it from doing so with the ``--allow-hosts`` option; see the
sections on `restricting downloads with --allow-hosts`_ and `command-line
options`_ for more details.)


Troubleshooting
~~~~~~~~~~~~~~~

If EasyInstall/setuptools appears to install correctly, and you can run the
``easy_install`` command but it fails with an ``ImportError``, the most likely
cause is that you installed to a location other than ``site-packages``,
without taking any of the steps described in the `Custom Installation
Locations`_ section below.  Please see that section and follow the steps to
make sure that your custom location will work correctly.  Then re-install.

Similarly, if you can run ``easy_install``, and it appears to be installing
packages, but then you can't import them, the most likely issue is that you
installed EasyInstall correctly but are using it to install packages to a
non-standard location that hasn't been properly prepared.  Again, see the
section on `Custom Installation Locations`_ for more details.


Windows Notes
~~~~~~~~~~~~~

Installing setuptools will provide an ``easy_install`` command according to
the techniques described in `Executables and Launchers`_. If the
``easy_install`` command is not available after installation, that section
provides details on how to configure Windows to make the commands available.


Downloading and Installing a Package
------------------------------------

For basic use of ``easy_install``, you need only supply the filename or URL of
a source distribution or .egg file (`Python Egg`__).

__ http://peak.telecommunity.com/DevCenter/PythonEggs

**Example 1**. Install a package by name, searching PyPI for the latest
version, and automatically downloading, building, and installing it::

    easy_install SQLObject

**Example 2**. Install or upgrade a package by name and version by finding
links on a given "download page"::

    easy_install -f http://pythonpaste.org/package_index.html SQLObject

**Example 3**. Download a source distribution from a specified URL,
automatically building and installing it::

    easy_install http://example.com/path/to/MyPackage-1.2.3.tgz

**Example 4**. Install an already-downloaded .egg file::

    easy_install /my_downloads/OtherPackage-3.2.1-py2.3.egg

**Example 5**.  Upgrade an already-installed package to the latest version
listed on PyPI::

    easy_install --upgrade PyProtocols

**Example 6**.  Install a source distribution that's already downloaded and
extracted in the current directory (New in 0.5a9)::

    easy_install .

**Example 7**.  (New in 0.6a1) Find a source distribution or Subversion
checkout URL for a package, and extract it or check it out to
``~/projects/sqlobject`` (the name will always be in all-lowercase), where it
can be examined or edited.  (The package will not be installed, but it can
easily be installed with ``easy_install ~/projects/sqlobject``.  See `Editing
and Viewing Source Packages`_ below for more info.)::

    easy_install --editable --build-directory ~/projects SQLObject

**Example 7**. (New in 0.6.11) Install a distribution within your home dir::

    easy_install --user SQLAlchemy

Easy Install accepts URLs, filenames, PyPI package names (i.e., ``distutils``
"distribution" names), and package+version specifiers.  In each case, it will
attempt to locate the latest available version that meets your criteria.

When downloading or processing downloaded files, Easy Install recognizes
distutils source distribution files with extensions of .tgz, .tar, .tar.gz,
.tar.bz2, or .zip.  And of course it handles already-built .egg
distributions as well as ``.win32.exe`` installers built using distutils.

By default, packages are installed to the running Python installation's
``site-packages`` directory, unless you provide the ``-d`` or ``--install-dir``
option to specify an alternative directory, or specify an alternate location
using distutils configuration files.  (See `Configuration Files`_, below.)

By default, any scripts included with the package are installed to the running
Python installation's standard script installation location.  However, if you
specify an installation directory via the command line or a config file, then
the default directory for installing scripts will be the same as the package
installation directory, to ensure that the script will have access to the
installed package.  You can override this using the ``-s`` or ``--script-dir``
option.

Installed packages are added to an ``easy-install.pth`` file in the install
directory, so that Python will always use the most-recently-installed version
of the package.  If you would like to be able to select which version to use at
runtime, you should use the ``-m`` or ``--multi-version`` option.


Upgrading a Package
-------------------

You don't need to do anything special to upgrade a package: just install the
new version, either by requesting a specific version, e.g.::

    easy_install "SomePackage==2.0"

a version greater than the one you have now::

    easy_install "SomePackage>2.0"

using the upgrade flag, to find the latest available version on PyPI::

    easy_install --upgrade SomePackage

or by using a download page, direct download URL, or package filename::

    easy_install -f http://example.com/downloads ExamplePackage

    easy_install http://example.com/downloads/ExamplePackage-2.0-py2.4.egg

    easy_install my_downloads/ExamplePackage-2.0.tgz

If you're using ``-m`` or ``--multi-version`` , using the ``require()``
function at runtime automatically selects the newest installed version of a
package that meets your version criteria.  So, installing a newer version is
the only step needed to upgrade such packages.

If you're installing to a directory on PYTHONPATH, or a configured "site"
directory (and not using ``-m``), installing a package automatically replaces
any previous version in the ``easy-install.pth`` file, so that Python will
import the most-recently installed version by default.  So, again, installing
the newer version is the only upgrade step needed.

If you haven't suppressed script installation (using ``--exclude-scripts`` or
``-x``), then the upgraded version's scripts will be installed, and they will
be automatically patched to ``require()`` the corresponding version of the
package, so that you can use them even if they are installed in multi-version
mode.

``easy_install`` never actually deletes packages (unless you're installing a
package with the same name and version number as an existing package), so if
you want to get rid of older versions of a package, please see `Uninstalling
Packages`_, below.


Changing the Active Version
---------------------------

If you've upgraded a package, but need to revert to a previously-installed
version, you can do so like this::

    easy_install PackageName==1.2.3

Where ``1.2.3`` is replaced by the exact version number you wish to switch to.
If a package matching the requested name and version is not already installed
in a directory on ``sys.path``, it will be located via PyPI and installed.

If you'd like to switch to the latest installed version of ``PackageName``, you
can do so like this::

    easy_install PackageName

This will activate the latest installed version.  (Note: if you have set any
``find_links`` via distutils configuration files, those download pages will be
checked for the latest available version of the package, and it will be
downloaded and installed if it is newer than your current version.)

Note that changing the active version of a package will install the newly
active version's scripts, unless the ``--exclude-scripts`` or ``-x`` option is
specified.


Uninstalling Packages
---------------------

If you have replaced a package with another version, then you can just delete
the package(s) you don't need by deleting the PackageName-versioninfo.egg file
or directory (found in the installation directory).

If you want to delete the currently installed version of a package (or all
versions of a package), you should first run::

    easy_install -m PackageName

This will ensure that Python doesn't continue to search for a package you're
planning to remove. After you've done this, you can safely delete the .egg
files or directories, along with any scripts you wish to remove.


Managing Scripts
----------------

Whenever you install, upgrade, or change versions of a package, EasyInstall
automatically installs the scripts for the selected package version, unless
you tell it not to with ``-x`` or ``--exclude-scripts``.  If any scripts in
the script directory have the same name, they are overwritten.

Thus, you do not normally need to manually delete scripts for older versions of
a package, unless the newer version of the package does not include a script
of the same name.  However, if you are completely uninstalling a package, you
may wish to manually delete its scripts.

EasyInstall's default behavior means that you can normally only run scripts
from one version of a package at a time.  If you want to keep multiple versions
of a script available, however, you can simply use the ``--multi-version`` or
``-m`` option, and rename the scripts that EasyInstall creates.  This works
because EasyInstall installs scripts as short code stubs that ``require()`` the
matching version of the package the script came from, so renaming the script
has no effect on what it executes.

For example, suppose you want to use two versions of the ``rst2html`` tool
provided by the `docutils <http://docutils.sf.net/>`_ package.  You might
first install one version::

    easy_install -m docutils==0.3.9

then rename the ``rst2html.py`` to ``r2h_039``, and install another version::

    easy_install -m docutils==0.3.10

This will create another ``rst2html.py`` script, this one using docutils
version 0.3.10 instead of 0.3.9.  You now have two scripts, each using a
different version of the package.  (Notice that we used ``-m`` for both
installations, so that Python won't lock us out of using anything but the most
recently-installed version of the package.)


Executables and Launchers
-------------------------

On Unix systems, scripts are installed with as natural files with a "#!"
header and no extension and they launch under the Python version indicated in
the header.

On Windows, there is no mechanism to "execute" files without extensions, so
EasyInstall provides two techniques to mirror the Unix behavior. The behavior
is indicated by the SETUPTOOLS_LAUNCHER environment variable, which may be
"executable" (default) or "natural".

Regardless of the technique used, the script(s) will be installed to a Scripts
directory (by default in the Python installation directory). It is recommended
for EasyInstall that you ensure this directory is in the PATH environment
variable. The easiest way to ensure the Scripts directory is in the PATH is
to run ``Tools\Scripts\win_add2path.py`` from the Python directory.

Note that instead of changing your ``PATH`` to include the Python scripts
directory, you can also retarget the installation location for scripts so they
go on a directory that's already on the ``PATH``.  For more information see
`Command-Line Options`_ and `Configuration Files`_.  During installation,
pass command line options (such as ``--script-dir``) to control where
scripts will be installed.


Windows Executable Launcher
~~~~~~~~~~~~~~~~~~~~~~~~~~~

If the "executable" launcher is used, EasyInstall will create a '.exe'
launcher of the same name beside each installed script (including
``easy_install`` itself). These small .exe files launch the script of the
same name using the Python version indicated in the '#!' header.

This behavior is currently default. To force
the use of executable launchers, set ``SETUPTOOLS_LAUNCHER`` to "executable".

Natural Script Launcher
~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall also supports deferring to an external launcher such as
`pylauncher <https://bitbucket.org/pypa/pylauncher>`_ for launching scripts.
Enable this experimental functionality by setting the
``SETUPTOOLS_LAUNCHER`` environment variable to "natural". EasyInstall will
then install scripts as simple
scripts with a .pya (or .pyw) extension appended. If these extensions are
associated with the pylauncher and listed in the PATHEXT environment variable,
these scripts can then be invoked simply and directly just like any other
executable. This behavior may become default in a future version.

EasyInstall uses the .pya extension instead of simply
the typical '.py' extension. This distinct extension is necessary to prevent
Python
from treating the scripts as importable modules (where name conflicts exist).
Current releases of pylauncher do not yet associate with .pya files by
default, but future versions should do so.


Tips & Techniques
-----------------

Multiple Python Versions
~~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall installs itself under two names:
``easy_install`` and ``easy_install-N.N``, where ``N.N`` is the Python version
used to install it.  Thus, if you install EasyInstall for both Python 3.2 and
2.7, you can use the ``easy_install-3.2`` or ``easy_install-2.7`` scripts to
install packages for the respective Python version.

Setuptools also supplies easy_install as a runnable module which may be
invoked using ``python -m easy_install`` for any Python with Setuptools
installed.

Restricting Downloads with ``--allow-hosts``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

You can use the ``--allow-hosts`` (``-H``) option to restrict what domains
EasyInstall will look for links and downloads on.  ``--allow-hosts=None``
prevents downloading altogether.  You can also use wildcards, for example
to restrict downloading to hosts in your own intranet.  See the section below
on `Command-Line Options`_ for more details on the ``--allow-hosts`` option.

By default, there are no host restrictions in effect, but you can change this
default by editing the appropriate `configuration files`_ and adding:

.. code-block:: ini

    [easy_install]
    allow_hosts = *.myintranet.example.com,*.python.org

The above example would then allow downloads only from hosts in the
``python.org`` and ``myintranet.example.com`` domains, unless overridden on the
command line.


Installing on Un-networked Machines
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Just copy the eggs or source packages you need to a directory on the target
machine, then use the ``-f`` or ``--find-links`` option to specify that
directory's location.  For example::

    easy_install -H None -f somedir SomePackage

will attempt to install SomePackage using only eggs and source packages found
in ``somedir`` and disallowing all remote access.  You should of course make
sure you have all of SomePackage's dependencies available in somedir.

If you have another machine of the same operating system and library versions
(or if the packages aren't platform-specific), you can create the directory of
eggs using a command like this::

    easy_install -zmaxd somedir SomePackage

This will tell EasyInstall to put zipped eggs or source packages for
SomePackage and all its dependencies into ``somedir``, without creating any
scripts or .pth files.  You can then copy the contents of ``somedir`` to the
target machine.  (``-z`` means zipped eggs, ``-m`` means multi-version, which
prevents .pth files from being used, ``-a`` means to copy all the eggs needed,
even if they're installed elsewhere on the machine, and ``-d`` indicates the
directory to place the eggs in.)

You can also build the eggs from local development packages that were installed
with the ``setup.py develop`` command, by including the ``-l`` option, e.g.::

    easy_install -zmaxld somedir SomePackage

This will use locally-available source distributions to build the eggs.


Packaging Others' Projects As Eggs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Need to distribute a package that isn't published in egg form?  You can use
EasyInstall to build eggs for a project.  You'll want to use the ``--zip-ok``,
``--exclude-scripts``, and possibly ``--no-deps`` options (``-z``, ``-x`` and
``-N``, respectively).  Use ``-d`` or ``--install-dir`` to specify the location
where you'd like the eggs placed.  By placing them in a directory that is
published to the web, you can then make the eggs available for download, either
in an intranet or to the internet at large.

If someone distributes a package in the form of a single ``.py`` file, you can
wrap it in an egg by tacking an ``#egg=name-version`` suffix on the file's URL.
So, something like this::

    easy_install -f "http://some.example.com/downloads/foo.py#egg=foo-1.0" foo

will install the package as an egg, and this::

    easy_install -zmaxd. \
        -f "http://some.example.com/downloads/foo.py#egg=foo-1.0" foo

will create a ``.egg`` file in the current directory.


Creating your own Package Index
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In addition to local directories and the Python Package Index, EasyInstall can
find download links on most any web page whose URL is given to the ``-f``
(``--find-links``) option.  In the simplest case, you can simply have a web
page with links to eggs or Python source packages, even an automatically
generated directory listing (such as the Apache web server provides).

If you are setting up an intranet site for package downloads, you may want to
configure the target machines to use your download site by default, adding
something like this to their `configuration files`_:

.. code-block:: ini

    [easy_install]
    find_links = http://mypackages.example.com/somedir/
                 http://turbogears.org/download/
                 http://peak.telecommunity.com/dist/

As you can see, you can list multiple URLs separated by whitespace, continuing
on multiple lines if necessary (as long as the subsequent lines are indented.

If you are more ambitious, you can also create an entirely custom package index
or PyPI mirror.  See the ``--index-url`` option under `Command-Line Options`_,
below, and also the section on `Package Index "API"`_.


Password-Protected Sites
------------------------

If a site you want to download from is password-protected using HTTP "Basic"
authentication, you can specify your credentials in the URL, like so::

    http://some_userid:some_password@some.example.com/some_path/

You can do this with both index page URLs and direct download URLs.  As long
as any HTML pages read by easy_install use *relative* links to point to the
downloads, the same user ID and password will be used to do the downloading.

Using .pypirc Credentials
-------------------------

In additional to supplying credentials in the URL, ``easy_install`` will also
honor credentials if present in the .pypirc file. Teams maintaining a private
repository of packages may already have defined access credentials for
uploading packages according to the distutils documentation. ``easy_install``
will attempt to honor those if present. Refer to the distutils documentation
for Python 2.5 or later for details on the syntax.

Controlling Build Options
~~~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall respects standard distutils `Configuration Files`_, so you can use
them to configure build options for packages that it installs from source.  For
example, if you are on Windows using the MinGW compiler, you can configure the
default compiler by putting something like this:

.. code-block:: ini

    [build]
    compiler = mingw32

into the appropriate distutils configuration file.  In fact, since this is just
normal distutils configuration, it will affect any builds using that config
file, not just ones done by EasyInstall.  For example, if you add those lines
to ``distutils.cfg`` in the ``distutils`` package directory, it will be the
default compiler for *all* packages you build.  See `Configuration Files`_
below for a list of the standard configuration file locations, and links to
more documentation on using distutils configuration files.


Editing and Viewing Source Packages
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sometimes a package's source distribution  contains additional documentation,
examples, configuration files, etc., that are not part of its actual code.  If
you want to be able to examine these files, you can use the ``--editable``
option to EasyInstall, and EasyInstall will look for a source distribution
or Subversion URL for the package, then download and extract it or check it out
as a subdirectory of the ``--build-directory`` you specify.  If you then wish
to install the package after editing or configuring it, you can do so by
rerunning EasyInstall with that directory as the target.

Note that using ``--editable`` stops EasyInstall from actually building or
installing the package; it just finds, obtains, and possibly unpacks it for
you.  This allows you to make changes to the package if necessary, and to
either install it in development mode using ``setup.py develop`` (if the
package uses setuptools, that is), or by running ``easy_install projectdir``
(where ``projectdir`` is the subdirectory EasyInstall created for the
downloaded package.

In order to use ``--editable`` (``-e`` for short), you *must* also supply a
``--build-directory`` (``-b`` for short).  The project will be placed in a
subdirectory of the build directory.  The subdirectory will have the same
name as the project itself, but in all-lowercase.  If a file or directory of
that name already exists, EasyInstall will print an error message and exit.

Also, when using ``--editable``, you cannot use URLs or filenames as arguments.
You *must* specify project names (and optional version requirements) so that
EasyInstall knows what directory name(s) to create.  If you need to force
EasyInstall to use a particular URL or filename, you should specify it as a
``--find-links`` item (``-f`` for short), and then also specify
the project name, e.g.::

    easy_install -eb ~/projects \
     -fhttp://prdownloads.sourceforge.net/ctypes/ctypes-0.9.6.tar.gz?download \
     ctypes==0.9.6


Dealing with Installation Conflicts
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(NOTE: As of 0.6a11, this section is obsolete; it is retained here only so that
people using older versions of EasyInstall can consult it.  As of version
0.6a11, installation conflicts are handled automatically without deleting the
old or system-installed packages, and without ignoring the issue.  Instead,
eggs are automatically shifted to the front of ``sys.path`` using special
code added to the ``easy-install.pth`` file.  So, if you are using version
0.6a11 or better of setuptools, you do not need to worry about conflicts,
and the following issues do not apply to you.)

EasyInstall installs distributions in a "managed" way, such that each
distribution can be independently activated or deactivated on ``sys.path``.
However, packages that were not installed by EasyInstall are "unmanaged",
in that they usually live all in one directory and cannot be independently
activated or deactivated.

As a result, if you are using EasyInstall to upgrade an existing package, or
to install a package with the same name as an existing package, EasyInstall
will warn you of the conflict.  (This is an improvement over ``setup.py
install``, because the ``distutils`` just install new packages on top of old
ones, possibly combining two unrelated packages or leaving behind modules that
have been deleted in the newer version of the package.)

EasyInstall will stop the installation if it detects a conflict
between an existing, "unmanaged" package, and a module or package in any of
the distributions you're installing.  It will display a list of all of the
existing files and directories that would need to be deleted for the new
package to be able to function correctly.  To proceed, you must manually
delete these conflicting files and directories and re-run EasyInstall.

Of course, once you've replaced all of your existing "unmanaged" packages with
versions managed by EasyInstall, you won't have any more conflicts to worry
about!


Compressed Installation
~~~~~~~~~~~~~~~~~~~~~~~

EasyInstall tries to install packages in zipped form, if it can.  Zipping
packages can improve Python's overall import performance if you're not using
the ``--multi-version`` option, because Python processes zipfile entries on
``sys.path`` much faster than it does directories.

As of version 0.5a9, EasyInstall analyzes packages to determine whether they
can be safely installed as a zipfile, and then acts on its analysis.  (Previous
versions would not install a package as a zipfile unless you used the
``--zip-ok`` option.)

The current analysis approach is fairly conservative; it currently looks for:

 * Any use of the ``__file__`` or ``__path__`` variables (which should be
   replaced with ``pkg_resources`` API calls)

 * Possible use of ``inspect`` functions that expect to manipulate source files
   (e.g. ``inspect.getsource()``)

 * Top-level modules that might be scripts used with ``python -m`` (Python 2.4)

If any of the above are found in the package being installed, EasyInstall will
assume that the package cannot be safely run from a zipfile, and unzip it to
a directory instead.  You can override this analysis with the ``-zip-ok`` flag,
which will tell EasyInstall to install the package as a zipfile anyway.  Or,
you can use the ``--always-unzip`` flag, in which case EasyInstall will always
unzip, even if its analysis says the package is safe to run as a zipfile.

Normally, however, it is simplest to let EasyInstall handle the determination
of whether to zip or unzip, and only specify overrides when needed to work
around a problem.  If you find you need to override EasyInstall's guesses, you
may want to contact the package author and the EasyInstall maintainers, so that
they can make appropriate changes in future versions.

(Note: If a package uses ``setuptools`` in its setup script, the package author
has the option to declare the package safe or unsafe for zipped usage via the
``zip_safe`` argument to ``setup()``.  If the package author makes such a
declaration, EasyInstall believes the package's author and does not perform its
own analysis.  However, your command-line option, if any, will still override
the package author's choice.)


Reference Manual
================

Configuration Files
-------------------

(New in 0.4a2)

You may specify default options for EasyInstall using the standard
distutils configuration files, under the command heading ``easy_install``.
EasyInstall will look first for a ``setup.cfg`` file in the current directory,
then a ``~/.pydistutils.cfg`` or ``$HOME\\pydistutils.cfg`` (on Unix-like OSes
and Windows, respectively), and finally a ``distutils.cfg`` file in the
``distutils`` package directory.  Here's a simple example:

.. code-block:: ini

    [easy_install]

    # set the default location to install packages
    install_dir = /home/me/lib/python

    # Notice that indentation can be used to continue an option
    # value; this is especially useful for the "--find-links"
    # option, which tells easy_install to use download links on
    # these pages before consulting PyPI:
    #
    find_links = http://sqlobject.org/
                 http://peak.telecommunity.com/dist/

In addition to accepting configuration for its own options under
``[easy_install]``, EasyInstall also respects defaults specified for other
distutils commands.  For example, if you don't set an ``install_dir`` for
``[easy_install]``, but *have* set an ``install_lib`` for the ``[install]``
command, this will become EasyInstall's default installation directory.  Thus,
if you are already using distutils configuration files to set default install
locations, build options, etc., EasyInstall will respect your existing settings
until and unless you override them explicitly in an ``[easy_install]`` section.

For more information, see also the current Python documentation on the `use and
location of distutils configuration files <https://docs.python.org/install/index.html#inst-config-files>`_.

Notice that ``easy_install`` will use the ``setup.cfg`` from the current
working directory only if it was triggered from ``setup.py`` through the
``install_requires`` option. The standalone command will not use that file.

Command-Line Options
--------------------

``--zip-ok, -z``
    Install all packages as zip files, even if they are marked as unsafe for
    running as a zipfile.  This can be useful when EasyInstall's analysis
    of a non-setuptools package is too conservative, but keep in mind that
    the package may not work correctly.  (Changed in 0.5a9; previously this
    option was required in order for zipped installation to happen at all.)

``--always-unzip, -Z``
    Don't install any packages as zip files, even if the packages are marked
    as safe for running as a zipfile.  This can be useful if a package does
    something unsafe, but not in a way that EasyInstall can easily detect.
    EasyInstall's default analysis is currently very conservative, however, so
    you should only use this option if you've had problems with a particular
    package, and *after* reporting the problem to the package's maintainer and
    to the EasyInstall maintainers.

    (Note: the ``-z/-Z`` options only affect the installation of newly-built
    or downloaded packages that are not already installed in the target
    directory; if you want to convert an existing installed version from
    zipped to unzipped or vice versa, you'll need to delete the existing
    version first, and re-run EasyInstall.)

``--multi-version, -m``
    "Multi-version" mode. Specifying this option prevents ``easy_install`` from
    adding an ``easy-install.pth`` entry for the package being installed, and
    if an entry for any version the package already exists, it will be removed
    upon successful installation. In multi-version mode, no specific version of
    the package is available for importing, unless you use
    ``pkg_resources.require()`` to put it on ``sys.path``. This can be as
    simple as::

        from pkg_resources import require
        require("SomePackage", "OtherPackage", "MyPackage")

    which will put the latest installed version of the specified packages on
    ``sys.path`` for you. (For more advanced uses, like selecting specific
    versions and enabling optional dependencies, see the ``pkg_resources`` API
    doc.)

    Changed in 0.6a10: this option is no longer silently enabled when
    installing to a non-PYTHONPATH, non-"site" directory.  You must always
    explicitly use this option if you want it to be active.

``--upgrade, -U``   (New in 0.5a4)
    By default, EasyInstall only searches online if a project/version
    requirement can't be met by distributions already installed
    on sys.path or the installation directory.  However, if you supply the
    ``--upgrade`` or ``-U`` flag, EasyInstall will always check the package
    index and ``--find-links`` URLs before selecting a version to install.  In
    this way, you can force EasyInstall to use the latest available version of
    any package it installs (subject to any version requirements that might
    exclude such later versions).

``--install-dir=DIR, -d DIR``
    Set the installation directory. It is up to you to ensure that this
    directory is on ``sys.path`` at runtime, and to use
    ``pkg_resources.require()`` to enable the installed package(s) that you
    need.

    (New in 0.4a2) If this option is not directly specified on the command line
    or in a distutils configuration file, the distutils default installation
    location is used.  Normally, this would be the ``site-packages`` directory,
    but if you are using distutils configuration files, setting things like
    ``prefix`` or ``install_lib``, then those settings are taken into
    account when computing the default installation directory, as is the
    ``--prefix`` option.

``--script-dir=DIR, -s DIR``
    Set the script installation directory.  If you don't supply this option
    (via the command line or a configuration file), but you *have* supplied
    an ``--install-dir`` (via command line or config file), then this option
    defaults to the same directory, so that the scripts will be able to find
    their associated package installation.  Otherwise, this setting defaults
    to the location where the distutils would normally install scripts, taking
    any distutils configuration file settings into account.

``--exclude-scripts, -x``
    Don't install scripts.  This is useful if you need to install multiple
    versions of a package, but do not want to reset the version that will be
    run by scripts that are already installed.

``--user`` (New in 0.6.11)
    Use the user-site-packages as specified in :pep:`370`
    instead of the global site-packages.

``--always-copy, -a``   (New in 0.5a4)
    Copy all needed distributions to the installation directory, even if they
    are already present in a directory on sys.path.  In older versions of
    EasyInstall, this was the default behavior, but now you must explicitly
    request it.  By default, EasyInstall will no longer copy such distributions
    from other sys.path directories to the installation directory, unless you
    explicitly gave the distribution's filename on the command line.

    Note that as of 0.6a10, using this option excludes "system" and
    "development" eggs from consideration because they can't be reliably
    copied.  This may cause EasyInstall to choose an older version of a package
    than what you expected, or it may cause downloading and installation of a
    fresh copy of something that's already installed.  You will see warning
    messages for any eggs that EasyInstall skips, before it falls back to an
    older version or attempts to download a fresh copy.

``--find-links=URLS_OR_FILENAMES, -f URLS_OR_FILENAMES``
    Scan the specified "download pages" or directories for direct links to eggs
    or other distributions.  Any existing file or directory names or direct
    download URLs are immediately added to EasyInstall's search cache, and any
    indirect URLs (ones that don't point to eggs or other recognized archive
    formats) are added to a list of additional places to search for download
    links.  As soon as EasyInstall has to go online to find a package (either
    because it doesn't exist locally, or because ``--upgrade`` or ``-U`` was
    used), the specified URLs will be downloaded and scanned for additional
    direct links.

    Eggs and archives found by way of ``--find-links`` are only downloaded if
    they are needed to meet a requirement specified on the command line; links
    to unneeded packages are ignored.

    If all requested packages can be found using links on the specified
    download pages, the Python Package Index will not be consulted unless you
    also specified the ``--upgrade`` or ``-U`` option.

    (Note: if you want to refer to a local HTML file containing links, you must
    use a ``file:`` URL, as filenames that do not refer to a directory, egg, or
    archive are ignored.)

    You may specify multiple URLs or file/directory names with this option,
    separated by whitespace.  Note that on the command line, you will probably
    have to surround the URL list with quotes, so that it is recognized as a
    single option value.  You can also specify URLs in a configuration file;
    see `Configuration Files`_, above.

    Changed in 0.6a10: previously all URLs and directories passed to this
    option were scanned as early as possible, but from 0.6a10 on, only
    directories and direct archive links are scanned immediately; URLs are not
    retrieved unless a package search was already going to go online due to a
    package not being available locally, or due to the use of the ``--update``
    or ``-U`` option.

``--no-find-links`` Blocks the addition of any link.
    This parameter is useful if you want to avoid adding links defined in a
    project easy_install is installing (whether it's a requested project or a
    dependency). When used, ``--find-links`` is ignored.

    Added in Distribute 0.6.11 and Setuptools 0.7.

``--index-url=URL, -i URL`` (New in 0.4a1; default changed in 0.6c7)
    Specifies the base URL of the Python Package Index.  The default is
    https://pypi.org/simple/ if not specified.  When a package is requested
    that is not locally available or linked from a ``--find-links`` download
    page, the package index will be searched for download pages for the needed
    package, and those download pages will be searched for links to download
    an egg or source distribution.

``--editable, -e`` (New in 0.6a1)
    Only find and download source distributions for the specified projects,
    unpacking them to subdirectories of the specified ``--build-directory``.
    EasyInstall will not actually build or install the requested projects or
    their dependencies; it will just find and extract them for you.  See
    `Editing and Viewing Source Packages`_ above for more details.

``--build-directory=DIR, -b DIR`` (UPDATED in 0.6a1)
    Set the directory used to build source packages.  If a package is built
    from a source distribution or checkout, it will be extracted to a
    subdirectory of the specified directory.  The subdirectory will have the
    same name as the extracted distribution's project, but in all-lowercase.
    If a file or directory of that name already exists in the given directory,
    a warning will be printed to the console, and the build will take place in
    a temporary directory instead.

    This option is most useful in combination with the ``--editable`` option,
    which forces EasyInstall to *only* find and extract (but not build and
    install) source distributions.  See `Editing and Viewing Source Packages`_,
    above, for more information.

``--verbose, -v, --quiet, -q`` (New in 0.4a4)
    Control the level of detail of EasyInstall's progress messages.  The
    default detail level is "info", which prints information only about
    relatively time-consuming operations like running a setup script, unpacking
    an archive, or retrieving a URL.  Using ``-q`` or ``--quiet`` drops the
    detail level to "warn", which will only display installation reports,
    warnings, and errors.  Using ``-v`` or ``--verbose`` increases the detail
    level to include individual file-level operations, link analysis messages,
    and distutils messages from any setup scripts that get run.  If you include
    the ``-v`` option more than once, the second and subsequent uses are passed
    down to any setup scripts, increasing the verbosity of their reporting as
    well.

``--dry-run, -n`` (New in 0.4a4)
    Don't actually install the package or scripts.  This option is passed down
    to any setup scripts run, so packages should not actually build either.
    This does *not* skip downloading, nor does it skip extracting source
    distributions to a temporary/build directory.

``--optimize=LEVEL``, ``-O LEVEL`` (New in 0.4a4)
    If you are installing from a source distribution, and are *not* using the
    ``--zip-ok`` option, this option controls the optimization level for
    compiling installed ``.py`` files to ``.pyo`` files.  It does not affect
    the compilation of modules contained in ``.egg`` files, only those in
    ``.egg`` directories.  The optimization level can be set to 0, 1, or 2;
    the default is 0 (unless it's set under ``install`` or ``install_lib`` in
    one of your distutils configuration files).

``--record=FILENAME``  (New in 0.5a4)
    Write a record of all installed files to FILENAME.  This is basically the
    same as the same option for the standard distutils "install" command, and
    is included for compatibility with tools that expect to pass this option
    to "setup.py install".

``--site-dirs=DIRLIST, -S DIRLIST``   (New in 0.6a1)
    Specify one or more custom "site" directories (separated by commas).
    "Site" directories are directories where ``.pth`` files are processed, such
    as the main Python ``site-packages`` directory.  As of 0.6a10, EasyInstall
    automatically detects whether a given directory processes ``.pth`` files
    (or can be made to do so), so you should not normally need to use this
    option.  It is is now only necessary if you want to override EasyInstall's
    judgment and force an installation directory to be treated as if it
    supported ``.pth`` files.

``--no-deps, -N``  (New in 0.6a6)
    Don't install any dependencies.  This is intended as a convenience for
    tools that wrap eggs in a platform-specific packaging system.  (We don't
    recommend that you use it for anything else.)

``--allow-hosts=PATTERNS, -H PATTERNS``   (New in 0.6a6)
    Restrict downloading and spidering to hosts matching the specified glob
    patterns.  E.g. ``-H *.python.org`` restricts web access so that only
    packages listed and downloadable from machines in the ``python.org``
    domain.  The glob patterns must match the *entire* user/host/port section of
    the target URL(s).  For example, ``*.python.org`` will NOT accept a URL
    like ``http://python.org/foo`` or ``http://www.python.org:8080/``.
    Multiple patterns can be specified by separating them with commas.  The
    default pattern is ``*``, which matches anything.

    In general, this option is mainly useful for blocking EasyInstall's web
    access altogether (e.g. ``-Hlocalhost``), or to restrict it to an intranet
    or other trusted site.  EasyInstall will do the best it can to satisfy
    dependencies given your host restrictions, but of course can fail if it
    can't find suitable packages.  EasyInstall displays all blocked URLs, so
    that you can adjust your ``--allow-hosts`` setting if it is more strict
    than you intended.  Some sites may wish to define a restrictive default
    setting for this option in their `configuration files`_, and then manually
    override the setting on the command line as needed.

``--prefix=DIR`` (New in 0.6a10)
    Use the specified directory as a base for computing the default
    installation and script directories.  On Windows, the resulting default
    directories will be ``prefix\\Lib\\site-packages`` and ``prefix\\Scripts``,
    while on other platforms the defaults will be
    ``prefix/lib/python2.X/site-packages`` (with the appropriate version
    substituted) for libraries and ``prefix/bin`` for scripts.

    Note that the ``--prefix`` option only sets the *default* installation and
    script directories, and does not override the ones set on the command line
    or in a configuration file.

``--local-snapshots-ok, -l`` (New in 0.6c6)
    Normally, EasyInstall prefers to only install *released* versions of
    projects, not in-development ones, because such projects may not
    have a currently-valid version number.  So, it usually only installs them
    when their ``setup.py`` directory is explicitly passed on the command line.

    However, if this option is used, then any in-development projects that were
    installed using the ``setup.py develop`` command, will be used to build
    eggs, effectively upgrading the "in-development" project to a snapshot
    release.  Normally, this option is used only in conjunction with the
    ``--always-copy`` option to create a distributable snapshot of every egg
    needed to run an application.

    Note that if you use this option, you must make sure that there is a valid
    version number (such as an SVN revision number tag) for any in-development
    projects that may be used, as otherwise EasyInstall may not be able to tell
    what version of the project is "newer" when future installations or
    upgrades are attempted.


.. _non-root installation:

Custom Installation Locations
-----------------------------

By default, EasyInstall installs python packages into Python's main ``site-packages`` directory,
and manages them using a custom ``.pth`` file in that same directory.

Very often though, a user or developer wants ``easy_install`` to install and manage python packages
in an alternative location, usually for one of 3 reasons:

1. They don't have access to write to the main Python site-packages directory.

2. They want a user-specific stash of packages, that is not visible to other users.

3. They want to isolate a set of packages to a specific python application, usually to minimize
   the possibility of version conflicts.

Historically, there have been many approaches to achieve custom installation.
The following section lists only the easiest and most relevant approaches [1]_.

`Use the "--user" option`_

`Use the "--user" option and customize "PYTHONUSERBASE"`_

`Use "virtualenv"`_

.. [1] There are older ways to achieve custom installation using various ``easy_install`` and ``setup.py install`` options, combined with ``PYTHONPATH`` and/or ``PYTHONUSERBASE`` alterations, but all of these are effectively deprecated by the User scheme brought in by `PEP-370`_.

.. _PEP-370: http://www.python.org/dev/peps/pep-0370/


Use the "--user" option
~~~~~~~~~~~~~~~~~~~~~~~
Python provides a User scheme for installation, which means that all
python distributions support an alternative install location that is specific to a user [3]_.
The Default location for each OS is explained in the python documentation
for the ``site.USER_BASE`` variable.  This mode of installation can be turned on by
specifying the ``--user`` option to ``setup.py install`` or ``easy_install``.
This approach serves the need to have a user-specific stash of packages.

.. [3] Prior to the User scheme, there was the Home scheme, which is still available, but requires more effort than the User scheme to get packages recognized.

Use the "--user" option and customize "PYTHONUSERBASE"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The User scheme install location can be customized by setting the ``PYTHONUSERBASE`` environment
variable, which updates the value of ``site.USER_BASE``.  To isolate packages to a specific
application, simply set the OS environment of that application to a specific value of
``PYTHONUSERBASE``, that contains just those packages.

Use "virtualenv"
~~~~~~~~~~~~~~~~
"virtualenv" is a 3rd-party python package that effectively "clones" a python installation, thereby
creating an isolated location to install packages.  The evolution of "virtualenv" started before the existence
of the User installation scheme.  "virtualenv" provides a version of ``easy_install`` that is
scoped to the cloned python install and is used in the normal way. "virtualenv" does offer various features
that the User installation scheme alone does not provide, e.g. the ability to hide the main python site-packages.

Please refer to the `virtualenv`_ documentation for more details.

.. _virtualenv: https://pypi.org/project/virtualenv/



Package Index "API"
-------------------

Custom package indexes (and PyPI) must follow the following rules for
EasyInstall to be able to look up and download packages:

1. Except where stated otherwise, "pages" are HTML or XHTML, and "links"
   refer to ``href`` attributes.

2. Individual project version pages' URLs must be of the form
   ``base/projectname/version``, where ``base`` is the package index's base URL.

3. Omitting the ``/version`` part of a project page's URL (but keeping the
   trailing ``/``) should result in a page that is either:

   a) The single active version of that project, as though the version had been
      explicitly included, OR

   b) A page with links to all of the active version pages for that project.

4. Individual project version pages should contain direct links to downloadable
   distributions where possible.  It is explicitly permitted for a project's
   "long_description" to include URLs, and these should be formatted as HTML
   links by the package index, as EasyInstall does no special processing to
   identify what parts of a page are index-specific and which are part of the
   project's supplied description.

5. Where available, MD5 information should be added to download URLs by
   appending a fragment identifier of the form ``#md5=...``, where ``...`` is
   the 32-character hex MD5 digest.  EasyInstall will verify that the
   downloaded file's MD5 digest matches the given value.

6. Individual project version pages should identify any "homepage" or
   "download" URLs using ``rel="homepage"`` and ``rel="download"`` attributes
   on the HTML elements linking to those URLs. Use of these attributes will
   cause EasyInstall to always follow the provided links, unless it can be
   determined by inspection that they are downloadable distributions. If the
   links are not to downloadable distributions, they are retrieved, and if they
   are HTML, they are scanned for download links. They are *not* scanned for
   additional "homepage" or "download" links, as these are only processed for
   pages that are part of a package index site.

7. The root URL of the index, if retrieved with a trailing ``/``, must result
   in a page containing links to *all* projects' active version pages.

   (Note: This requirement is a workaround for the absence of case-insensitive
   ``safe_name()`` matching of project names in URL paths. If project names are
   matched in this fashion (e.g. via the PyPI server, mod_rewrite, or a similar
   mechanism), then it is not necessary to include this all-packages listing
   page.)

8. If a package index is accessed via a ``file://`` URL, then EasyInstall will
   automatically use ``index.html`` files, if present, when trying to read a
   directory with a trailing ``/`` on the URL.
PK�(�\�Ӹ�5doc/alt-python37-setuptools/docs/deprecated/index.rstnu�[���======================================================
Guides on backward compatibility & deprecated practice
======================================================

``Setuptools`` has undergone tremendous changes since its first debut. As its
development continues to roll forward, many of the practice and mechanisms it
had established are now considered deprecated. But they still remain relevant
as a plethora of libraries continue to depend on them. Many people also find
it necessary to equip themselves with the knowledge to better support backward
compatibility. This guide aims to provide the essential information for such
objectives.

.. toctree::
    :maxdepth: 1

    python3
    python_eggs
    easy_install
    distutils/index
    distutils-legacy
    functionalities
PK�(�\@�G���?doc/alt-python37-setuptools/docs/deprecated/distutils/index.rstnu�[���.. _distutils-index:

##############################################
  Distributing Python Modules (Legacy version)
##############################################

:Authors: Greg Ward, Anthony Baxter
:Email: distutils-sig@python.org

.. seealso::

   :ref:`distributing-index`
      The up to date module distribution documentations

.. include:: ./_setuptools_disclaimer.rst

.. note::

   This guide only covers the basic tools for building and distributing
   extensions that are provided as part of this version of Python. Third party
   tools offer easier to use and more secure alternatives. Refer to the `quick
   recommendations section <https://packaging.python.org/guides/tool-recommendations/>`__
   in the Python Packaging User Guide for more information.

This document describes the Python Distribution Utilities ("Distutils") from
the module developer's point of view, describing the underlying capabilities
that ``setuptools`` builds on to allow Python developers to make Python modules
and extensions readily available to a wider audience.

.. toctree::
   :maxdepth: 2
   :numbered:

   introduction.rst
   setupscript.rst
   configfile.rst
   sourcedist.rst
   builtdist.rst
   examples.rst
   extending.rst
   commandref.rst
   apiref.rst
PK�(�\R����Cdoc/alt-python37-setuptools/docs/deprecated/distutils/extending.rstnu�[���.. _extending-distutils:

*******************
Extending Distutils
*******************

.. include:: ./_setuptools_disclaimer.rst

Distutils can be extended in various ways.  Most extensions take the form of new
commands or replacements for existing commands.  New commands may be written to
support new types of platform-specific packaging, for example, while
replacements for existing commands may be made to modify details of how the
command operates on a package.

Most extensions of the distutils are made within :file:`setup.py` scripts that
want to modify existing commands; many simply add a few file extensions that
should be copied into packages in addition to :file:`.py` files as a
convenience.

Most distutils command implementations are subclasses of the
:class:`distutils.cmd.Command` class.  New commands may directly inherit from
:class:`~distutils.cmd.Command`, while replacements often derive from :class:`~distutils.cmd.Command`
indirectly, directly subclassing the command they are replacing.  Commands are
required to derive from :class:`~distutils.cmd.Command`.

.. % \section{Extending existing commands}
.. % \label{extend-existing}

.. % \section{Writing new commands}
.. % \label{new-commands}
.. % \XXX{Would an uninstall command be a good example here?}


Integrating new commands
========================

There are different ways to integrate new command implementations into
distutils.  The most difficult is to lobby for the inclusion of the new features
in distutils itself, and wait for (and require) a version of Python that
provides that support.  This is really hard for many reasons.

The most common, and possibly the most reasonable for most needs, is to include
the new implementations with your :file:`setup.py` script, and cause the
:func:`distutils.core.setup` function use them::

   from distutils.command.build_py import build_py as _build_py
   from distutils.core import setup

   class build_py(_build_py):
       """Specialized Python source builder."""

       # implement whatever needs to be different...

   setup(cmdclass={'build_py': build_py},
         ...)

This approach is most valuable if the new implementations must be used to use a
particular package, as everyone interested in the package will need to have the
new command implementation.

Beginning with Python 2.4, a third option is available, intended to allow new
commands to be added which can support existing :file:`setup.py` scripts without
requiring modifications to the Python installation.  This is expected to allow
third-party extensions to provide support for additional packaging systems, but
the commands can be used for anything distutils commands can be used for.  A new
configuration option, ``command_packages`` (command-line option
:option:`!--command-packages`), can be used to specify additional packages to be
searched for modules implementing commands.  Like all distutils options, this
can be specified on the command line or in a configuration file.  This option
can only be set in the ``[global]`` section of a configuration file, or before
any commands on the command line.  If set in a configuration file, it can be
overridden from the command line; setting it to an empty string on the command
line causes the default to be used.  This should never be set in a configuration
file provided with a package.

This new option can be used to add any number of packages to the list of
packages searched for command implementations; multiple package names should be
separated by commas.  When not specified, the search is only performed in the
:mod:`distutils.command` package.  When :file:`setup.py` is run with the option
``--command-packages distcmds,buildcmds``, however, the packages
:mod:`distutils.command`, ``distcmds``, and ``buildcmds`` will be searched
in that order.  New commands are expected to be implemented in modules of the
same name as the command by classes sharing the same name.  Given the example
command line option above, the command :command:`bdist_openpkg` could be
implemented by the class ``distcmds.bdist_openpkg.bdist_openpkg`` or
``buildcmds.bdist_openpkg.bdist_openpkg``.


Adding new distribution types
=============================

Commands that create distributions (files in the :file:`dist/` directory) need
to add ``(command, filename)`` pairs to ``self.distribution.dist_files`` so that
:command:`upload` can upload it to PyPI.  The *filename* in the pair contains no
path information, only the name of the file itself.  In dry-run mode, pairs
should still be added to represent what would have been created.


PK�(�\�Y�
&
&Ddoc/alt-python37-setuptools/docs/deprecated/distutils/sourcedist.rstnu�[���.. _source-dist:

******************************
Creating a Source Distribution
******************************

.. include:: ./_setuptools_disclaimer.rst

As shown in section :ref:`distutils-simple-example`, you use the :command:`sdist` command
to create a source distribution.  In the simplest case, ::

   python setup.py sdist

(assuming you haven't specified any :command:`sdist` options in the setup script
or config file), :command:`sdist` creates the archive of the default format for
the current platform.  The default format is a gzip'ed tar file
(:file:`.tar.gz`) on Unix, and ZIP file on Windows.

You can specify as many formats as you like using the :option:`!--formats`
option, for example::

   python setup.py sdist --formats=gztar,zip

to create a gzipped tarball and a zip file.  The available formats are:

+-----------+-------------------------+---------+
| Format    | Description             | Notes   |
+===========+=========================+=========+
| ``zip``   | zip file (:file:`.zip`) | (1),(3) |
+-----------+-------------------------+---------+
| ``gztar`` | gzip'ed tar file        | \(2)    |
|           | (:file:`.tar.gz`)       |         |
+-----------+-------------------------+---------+
| ``bztar`` | bzip2'ed tar file       |         |
|           | (:file:`.tar.bz2`)      |         |
+-----------+-------------------------+---------+
| ``xztar`` | xz'ed tar file          |         |
|           | (:file:`.tar.xz`)       |         |
+-----------+-------------------------+---------+
| ``ztar``  | compressed tar file     | \(4)    |
|           | (:file:`.tar.Z`)        |         |
+-----------+-------------------------+---------+
| ``tar``   | tar file (:file:`.tar`) |         |
+-----------+-------------------------+---------+

.. versionchanged:: 3.5
   Added support for the ``xztar`` format.

Notes:

(1)
   default on Windows

(2)
   default on Unix

(3)
   requires either external :program:`zip` utility or :mod:`zipfile` module (part
   of the standard Python library since Python 1.6)

(4)
   requires the :program:`compress` program. Notice that this format is now
   pending for deprecation and will be removed in the future versions of Python.

When using any ``tar`` format (``gztar``, ``bztar``, ``xztar``, ``ztar`` or
``tar``), under Unix you can specify the ``owner`` and ``group`` names
that will be set for each member of the archive.

For example, if you want all files of the archive to be owned by root::

    python setup.py sdist --owner=root --group=root


.. _manifest:

Specifying the files to distribute
==================================

If you don't supply an explicit list of files (or instructions on how to
generate one), the :command:`sdist` command puts a minimal default set into the
source distribution:

* all Python source files implied by the ``py_modules`` and
  ``packages`` options

* all C source files mentioned in the ``ext_modules`` or
  ``libraries`` options

  .. XXX getting C library sources currently broken---no
         :meth:`get_source_files` method in :file:`build_clib.py`!

* scripts identified by the ``scripts`` option
  See :ref:`distutils-installing-scripts`.

* anything that looks like a test script: :file:`test/test\*.py` (currently, the
  Distutils don't do anything with test scripts except include them in source
  distributions, but in the future there will be a standard for testing Python
  module distributions)

* Any of the standard README files (:file:`README`, :file:`README.txt`,
  or :file:`README.rst`), :file:`setup.py` (or whatever you called your setup
  script), and :file:`setup.cfg`.

* all files that matches the ``package_data`` metadata.
  See :ref:`distutils-installing-package-data`.

* all files that matches the ``data_files`` metadata.
  See :ref:`distutils-additional-files`.

Sometimes this is enough, but usually you will want to specify additional files
to distribute.  The typical way to do this is to write a *manifest template*,
called :file:`MANIFEST.in` by default.  The manifest template is just a list of
instructions for how to generate your manifest file, :file:`MANIFEST`, which is
the exact list of files to include in your source distribution.  The
:command:`sdist` command processes this template and generates a manifest based
on its instructions and what it finds in the filesystem.

If you prefer to roll your own manifest file, the format is simple: one filename
per line, regular files (or symlinks to them) only.  If you do supply your own
:file:`MANIFEST`, you must specify everything: the default set of files
described above does not apply in this case.

.. versionchanged:: 3.1
   An existing generated :file:`MANIFEST` will be regenerated without
   :command:`sdist` comparing its modification time to the one of
   :file:`MANIFEST.in` or :file:`setup.py`.

.. versionchanged:: 3.1.3
   :file:`MANIFEST` files start with a comment indicating they are generated.
   Files without this comment are not overwritten or removed.

.. versionchanged:: 3.2.2
   :command:`sdist` will read a :file:`MANIFEST` file if no :file:`MANIFEST.in`
   exists, like it used to do.

.. versionchanged:: 3.7
   :file:`README.rst` is now included in the list of distutils standard READMEs.


The manifest template has one command per line, where each command specifies a
set of files to include or exclude from the source distribution.  For an
example, again we turn to the Distutils' own manifest template:

.. code-block:: none

   include *.txt
   recursive-include examples *.txt *.py
   prune examples/sample?/build

The meanings should be fairly clear: include all files in the distribution root
matching :file:`\*.txt`, all files anywhere under the :file:`examples` directory
matching :file:`\*.txt` or :file:`\*.py`, and exclude all directories matching
:file:`examples/sample?/build`.  All of this is done *after* the standard
include set, so you can exclude files from the standard set with explicit
instructions in the manifest template.  (Or, you can use the
:option:`!--no-defaults` option to disable the standard set entirely.)  There are
several other commands available in the manifest template mini-language; see
section :ref:`sdist-cmd`.

The order of commands in the manifest template matters: initially, we have the
list of default files as described above, and each command in the template adds
to or removes from that list of files.  Once we have fully processed the
manifest template, we remove files that should not be included in the source
distribution:

* all files in the Distutils "build" tree (default :file:`build/`)

* all files in directories named :file:`RCS`, :file:`CVS`, :file:`.svn`,
  :file:`.hg`, :file:`.git`, :file:`.bzr` or :file:`_darcs`

Now we have our complete list of files, which is written to the manifest for
future reference, and then used to build the source distribution archive(s).

You can disable the default set of included files with the
:option:`!--no-defaults` option, and you can disable the standard exclude set
with :option:`!--no-prune`.

Following the Distutils' own manifest template, let's trace how the
:command:`sdist` command builds the list of files to include in the Distutils
source distribution:

#. include all Python source files in the :file:`distutils` and
   :file:`distutils/command` subdirectories (because packages corresponding to
   those two directories were mentioned in the ``packages`` option in the
   setup script---see section :ref:`setup-script`)

#. include :file:`README.txt`, :file:`setup.py`, and :file:`setup.cfg` (standard
   files)

#. include :file:`test/test\*.py` (standard files)

#. include :file:`\*.txt` in the distribution root (this will find
   :file:`README.txt` a second time, but such redundancies are weeded out later)

#. include anything matching :file:`\*.txt` or :file:`\*.py` in the sub-tree
   under :file:`examples`,

#. exclude all files in the sub-trees starting at directories matching
   :file:`examples/sample?/build`\ ---this may exclude files included by the
   previous two steps, so it's important that the ``prune`` command in the manifest
   template comes after the ``recursive-include`` command

#. exclude the entire :file:`build` tree, and any :file:`RCS`, :file:`CVS`,
   :file:`.svn`, :file:`.hg`, :file:`.git`, :file:`.bzr` and :file:`_darcs`
   directories

Just like in the setup script, file and directory names in the manifest template
should always be slash-separated; the Distutils will take care of converting
them to the standard representation on your platform. That way, the manifest
template is portable across operating systems.


.. _manifest-options:

Manifest-related options
========================

The normal course of operations for the :command:`sdist` command is as follows:

* if the manifest file (:file:`MANIFEST` by default) exists and the first line
  does not have a comment indicating it is generated from :file:`MANIFEST.in`,
  then it is used as is, unaltered

* if the manifest file doesn't exist or has been previously automatically
  generated, read :file:`MANIFEST.in` and create the manifest

* if neither :file:`MANIFEST` nor :file:`MANIFEST.in` exist, create a manifest
  with just the default file set

* use the list of files now in :file:`MANIFEST` (either just generated or read
  in) to create the source distribution archive(s)

There are a couple of options that modify this behaviour.  First, use the
:option:`!--no-defaults` and :option:`!--no-prune` to disable the standard
"include" and "exclude" sets.

Second, you might just want to (re)generate the manifest, but not create a source
distribution::

   python setup.py sdist --manifest-only

:option:`!-o` is a shortcut for :option:`!--manifest-only`.
PK�(�\f�m�(�(Bdoc/alt-python37-setuptools/docs/deprecated/distutils/examples.rstnu�[���.. _distutils_examples:

******************
Distutils Examples
******************

.. include:: ./_setuptools_disclaimer.rst

This chapter provides a number of basic examples to help get started with
distutils.  Additional information about using distutils can be found in the
Distutils Cookbook.


.. seealso::

   `Distutils Cookbook <https://wiki.python.org/moin/Distutils/Cookbook>`_
      Collection of recipes showing how to achieve more control over distutils.


.. _pure-mod:

Pure Python distribution (by module)
====================================

If you're just distributing a couple of modules, especially if they don't live
in a particular package, you can specify them individually using the
``py_modules`` option in the setup script.

In the simplest case, you'll have two files to worry about: a setup script and
the single module you're distributing, :file:`foo.py` in this example::

   <root>/
           setup.py
           foo.py

(In all diagrams in this section, *<root>* will refer to the distribution root
directory.)  A minimal setup script to describe this situation would be::

   from distutils.core import setup
   setup(name='foo',
         version='1.0',
         py_modules=['foo'],
         )

Note that the name of the distribution is specified independently with the
``name`` option, and there's no rule that says it has to be the same as
the name of the sole module in the distribution (although that's probably a good
convention to follow).  However, the distribution name is used to generate
filenames, so you should stick to letters, digits, underscores, and hyphens.

Since ``py_modules`` is a list, you can of course specify multiple
modules, eg. if you're distributing modules ``foo`` and ``bar``, your
setup might look like this::

   <root>/
           setup.py
           foo.py
           bar.py

and the setup script might be  ::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         py_modules=['foo', 'bar'],
         )

You can put module source files into another directory, but if you have enough
modules to do that, it's probably easier to specify modules by package rather
than listing them individually.


.. _pure-pkg:

Pure Python distribution (by package)
=====================================

If you have more than a couple of modules to distribute, especially if they are
in multiple packages, it's probably easier to specify whole packages rather than
individual modules.  This works even if your modules are not in a package; you
can just tell the Distutils to process modules from the root package, and that
works the same as any other package (except that you don't have to have an
:file:`__init__.py` file).

The setup script from the last example could also be written as  ::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         packages=[''],
         )

(The empty string stands for the root package.)

If those two files are moved into a subdirectory, but remain in the root
package, e.g.::

   <root>/
           setup.py
           src/      foo.py
                     bar.py

then you would still specify the root package, but you have to tell the
Distutils where source files in the root package live::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         package_dir={'': 'src'},
         packages=[''],
         )

More typically, though, you will want to distribute multiple modules in the same
package (or in sub-packages).  For example, if the ``foo``  and ``bar``
modules belong in package ``foobar``, one way to layout your source tree is
::

   <root>/
           setup.py
           foobar/
                    __init__.py
                    foo.py
                    bar.py

This is in fact the default layout expected by the Distutils, and the one that
requires the least work to describe in your setup script::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         packages=['foobar'],
         )

If you want to put modules in directories not named for their package, then you
need to use the ``package_dir`` option again.  For example, if the
:file:`src` directory holds modules in the ``foobar`` package::

   <root>/
           setup.py
           src/
                    __init__.py
                    foo.py
                    bar.py

an appropriate setup script would be  ::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         package_dir={'foobar': 'src'},
         packages=['foobar'],
         )

Or, you might put modules from your main package right in the distribution
root::

   <root>/
           setup.py
           __init__.py
           foo.py
           bar.py

in which case your setup script would be  ::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         package_dir={'foobar': ''},
         packages=['foobar'],
         )

(The empty string also stands for the current directory.)

If you have sub-packages, they must be explicitly listed in ``packages``,
but any entries in ``package_dir`` automatically extend to sub-packages.
(In other words, the Distutils does *not* scan your source tree, trying to
figure out which directories correspond to Python packages by looking for
:file:`__init__.py` files.)  Thus, if the default layout grows a sub-package::

   <root>/
           setup.py
           foobar/
                    __init__.py
                    foo.py
                    bar.py
                    subfoo/
                              __init__.py
                              blah.py

then the corresponding setup script would be  ::

   from distutils.core import setup
   setup(name='foobar',
         version='1.0',
         packages=['foobar', 'foobar.subfoo'],
         )


.. _single-ext:

Single extension module
=======================

Extension modules are specified using the ``ext_modules`` option.
``package_dir`` has no effect on where extension source files are found;
it only affects the source for pure Python modules.  The simplest  case, a
single extension module in a single C source file, is::

   <root>/
           setup.py
           foo.c

If the ``foo`` extension belongs in the root package, the setup script for
this could be  ::

   from distutils.core import setup
   from distutils.extension import Extension
   setup(name='foobar',
         version='1.0',
         ext_modules=[Extension('foo', ['foo.c'])],
         )

If the extension actually belongs in a package, say ``foopkg``, then

With exactly the same source tree layout, this extension can be put in the
``foopkg`` package simply by changing the name of the extension::

   from distutils.core import setup
   from distutils.extension import Extension
   setup(name='foobar',
         version='1.0',
         ext_modules=[Extension('foopkg.foo', ['foo.c'])],
         )

Checking a package
==================

The ``check`` command allows you to verify if your package meta-data
meet the minimum requirements to build a distribution.

To run it, just call it using your :file:`setup.py` script. If something is
missing, ``check`` will display a warning.

Let's take an example with a simple script::

    from distutils.core import setup

    setup(name='foobar')

Running the ``check`` command will display some warnings:

.. code-block:: shell-session

    $ python setup.py check
    running check
    warning: check: missing required meta-data: version, url
    warning: check: missing meta-data: either (author and author_email) or
             (maintainer and maintainer_email) should be supplied


If you use the reStructuredText syntax in the ``long_description`` field and
`docutils`_  is installed you can check if the syntax is fine with the
``check`` command, using the ``restructuredtext`` option.

For example, if the :file:`setup.py` script is changed like this::

    from distutils.core import setup

    desc = """\
    My description
    ==============

    This is the description of the ``foobar`` package.
    """

    setup(name='foobar', version='1', author='tarek',
        author_email='tarek@ziade.org',
        url='http://example.com', long_description=desc)

Where the long description is broken, ``check`` will be able to detect it
by using the :mod:`docutils` parser:

.. code-block:: shell-session

    $ python setup.py check --restructuredtext
    running check
    warning: check: Title underline too short. (line 2)
    warning: check: Could not finish the parsing.

Reading the metadata
=====================

The :func:`distutils.core.setup` function provides a command-line interface
that allows you to query the metadata fields of a project through the
``setup.py`` script of a given project:

.. code-block:: shell-session

    $ python setup.py --name
    distribute

This call reads the ``name`` metadata by running the
:func:`distutils.core.setup`  function. Although, when a source or binary
distribution is created with Distutils, the metadata fields are written
in a static file called :file:`PKG-INFO`. When a Distutils-based project is
installed in Python, the :file:`PKG-INFO` file is copied alongside the modules
and packages of the distribution under :file:`NAME-VERSION-pyX.X.egg-info`,
where ``NAME`` is the name of the project, ``VERSION`` its version as defined
in the Metadata, and ``pyX.X`` the major and minor version of Python like
``2.7`` or ``3.2``.

You can read back this static file, by using the
:class:`distutils.dist.DistributionMetadata` class and its
:func:`~distutils.dist.DistributionMetadata.read_pkg_file` method::

    >>> from distutils.dist import DistributionMetadata
    >>> metadata = DistributionMetadata()
    >>> metadata.read_pkg_file(open('distribute-0.6.8-py2.7.egg-info'))
    >>> metadata.name
    'distribute'
    >>> metadata.version
    '0.6.8'
    >>> metadata.description
    'Easily download, build, install, upgrade, and uninstall Python packages'

Notice that the class can also be instantiated with a metadata file path to
loads its values::

    >>> pkg_info_path = 'distribute-0.6.8-py2.7.egg-info'
    >>> DistributionMetadata(pkg_info_path).name
    'distribute'


.. % \section{Multiple extension modules}
.. % \label{multiple-ext}

.. % \section{Putting it all together}


.. _docutils: http://docutils.sourceforge.net
PK�(�\U��)�z�zEdoc/alt-python37-setuptools/docs/deprecated/distutils/setupscript.rstnu�[���.. _setup-script:

************************
Writing the Setup Script
************************

.. include:: ./_setuptools_disclaimer.rst

The setup script is the centre of all activity in building, distributing, and
installing modules using the Distutils.  The main purpose of the setup script is
to describe your module distribution to the Distutils, so that the various
commands that operate on your modules do the right thing.  As we saw in section
:ref:`distutils-simple-example` above, the setup script consists mainly of a call to :func:`~distutils.core.setup`, and most information
supplied to the Distutils by the module developer is supplied as keyword
arguments to :func:`~distutils.core.setup`.

Here's a slightly more involved example, which we'll follow for the next couple
of sections: the Distutils' own setup script.  (Keep in mind that although the
Distutils are included with Python 1.6 and later, they also have an independent
existence so that Python 1.5.2 users can use them to install other module
distributions.  The Distutils' own setup script, shown here, is used to install
the package into Python 1.5.2.) ::

    #!/usr/bin/env python

    from distutils.core import setup

    setup(name='Distutils',
          version='1.0',
          description='Python Distribution Utilities',
          author='Greg Ward',
          author_email='gward@python.net',
          url='https://www.python.org/sigs/distutils-sig/',
          packages=['distutils', 'distutils.command'],
         )

There are only two differences between this and the trivial one-file
distribution presented in section :ref:`distutils-simple-example`: more metadata, and the
specification of pure Python modules by package, rather than by module.  This is
important since the Distutils consist of a couple of dozen modules split into
(so far) two packages; an explicit list of every module would be tedious to
generate and difficult to maintain.  For more information on the additional
meta-data, see section :ref:`meta-data`.

Note that any pathnames (files or directories) supplied in the setup script
should be written using the Unix convention, i.e. slash-separated.  The
Distutils will take care of converting this platform-neutral representation into
whatever is appropriate on your current platform before actually using the
pathname.  This makes your setup script portable across operating systems, which
of course is one of the major goals of the Distutils.  In this spirit, all
pathnames in this document are slash-separated.

This, of course, only applies to pathnames given to Distutils functions.  If
you, for example, use standard Python functions such as :func:`glob.glob` or
:func:`os.listdir` to specify files, you should be careful to write portable
code instead of hardcoding path separators::

    glob.glob(os.path.join('mydir', 'subdir', '*.html'))
    os.listdir(os.path.join('mydir', 'subdir'))


.. _listing-packages:

Listing whole packages
======================

The ``packages`` option tells the Distutils to process (build, distribute,
install, etc.) all pure Python modules found in each package mentioned in the
``packages`` list.  In order to do this, of course, there has to be a
correspondence between package names and directories in the filesystem.  The
default correspondence is the most obvious one, i.e. package :mod:`distutils` is
found in the directory :file:`distutils` relative to the distribution root.
Thus, when you say ``packages = ['foo']`` in your setup script, you are
promising that the Distutils will find a file :file:`foo/__init__.py` (which
might be spelled differently on your system, but you get the idea) relative to
the directory where your setup script lives.  If you break this promise, the
Distutils will issue a warning but still process the broken package anyway.

If you use a different convention to lay out your source directory, that's no
problem: you just have to supply the ``package_dir`` option to tell the
Distutils about your convention.  For example, say you keep all Python source
under :file:`lib`, so that modules in the "root package" (i.e., not in any
package at all) are in :file:`lib`, modules in the ``foo`` package are in
:file:`lib/foo`, and so forth.  Then you would put ::

    package_dir = {'': 'lib'}

in your setup script.  The keys to this dictionary are package names, and an
empty package name stands for the root package.  The values are directory names
relative to your distribution root.  In this case, when you say ``packages =
['foo']``, you are promising that the file :file:`lib/foo/__init__.py` exists.

Another possible convention is to put the ``foo`` package right in
:file:`lib`, the ``foo.bar`` package in :file:`lib/bar`, etc.  This would be
written in the setup script as ::

    package_dir = {'foo': 'lib'}

A ``package: dir`` entry in the ``package_dir`` dictionary implicitly
applies to all packages below *package*, so the ``foo.bar`` case is
automatically handled here.  In this example, having ``packages = ['foo',
'foo.bar']`` tells the Distutils to look for :file:`lib/__init__.py` and
:file:`lib/bar/__init__.py`.  (Keep in mind that although ``package_dir``
applies recursively, you must explicitly list all packages in
``packages``: the Distutils will *not* recursively scan your source tree
looking for any directory with an :file:`__init__.py` file.)


.. _listing-modules:

Listing individual modules
==========================

For a small module distribution, you might prefer to list all modules rather
than listing packages---especially the case of a single module that goes in the
"root package" (i.e., no package at all).  This simplest case was shown in
section :ref:`distutils-simple-example`; here is a slightly more involved example::

    py_modules = ['mod1', 'pkg.mod2']

This describes two modules, one of them in the "root" package, the other in the
``pkg`` package.  Again, the default package/directory layout implies that
these two modules can be found in :file:`mod1.py` and :file:`pkg/mod2.py`, and
that :file:`pkg/__init__.py` exists as well. And again, you can override the
package/directory correspondence using the ``package_dir`` option.


.. _describing-extensions:

Describing extension modules
============================

Just as writing Python extension modules is a bit more complicated than writing
pure Python modules, describing them to the Distutils is a bit more complicated.
Unlike pure modules, it's not enough just to list modules or packages and expect
the Distutils to go out and find the right files; you have to specify the
extension name, source file(s), and any compile/link requirements (include
directories, libraries to link with, etc.).

.. XXX read over this section

All of this is done through another keyword argument to
:func:`~distutils.core.setup`, the
``ext_modules`` option.  ``ext_modules`` is just a list of
:class:`~distutils.core.Extension` instances, each of which describes a
single extension module.
Suppose your distribution includes a single extension, called ``foo`` and
implemented by :file:`foo.c`.  If no additional instructions to the
compiler/linker are needed, describing this extension is quite simple::

    Extension('foo', ['foo.c'])

The :class:`~distutils.extension.Extension` class can be imported from :mod:`distutils.core` along
with :func:`~distutils.core.setup`.  Thus, the setup script for a module distribution that
contains only this one extension and nothing else might be::

    from distutils.core import setup, Extension
    setup(name='foo',
          version='1.0',
          ext_modules=[Extension('foo', ['foo.c'])],
          )

The :class:`~distutils.extension.Extension` class (actually, the underlying extension-building
machinery implemented by the :command:`build_ext` command) supports a great deal
of flexibility in describing Python extensions, which is explained in the
following sections.


Extension names and packages
----------------------------

The first argument to the :class:`~distutils.core.Extension` constructor is
always the name of the extension, including any package names.  For example, ::

    Extension('foo', ['src/foo1.c', 'src/foo2.c'])

describes an extension that lives in the root package, while ::

    Extension('pkg.foo', ['src/foo1.c', 'src/foo2.c'])

describes the same extension in the ``pkg`` package.  The source files and
resulting object code are identical in both cases; the only difference is where
in the filesystem (and therefore where in Python's namespace hierarchy) the
resulting extension lives.

If you have a number of extensions all in the same package (or all under the
same base package), use the ``ext_package`` keyword argument to
:func:`~distutils.core.setup`.  For example, ::

    setup(...,
          ext_package='pkg',
          ext_modules=[Extension('foo', ['foo.c']),
                       Extension('subpkg.bar', ['bar.c'])],
         )

will compile :file:`foo.c` to the extension ``pkg.foo``, and
:file:`bar.c` to ``pkg.subpkg.bar``.


Extension source files
----------------------

The second argument to the :class:`~distutils.core.Extension` constructor is
a list of source
files.  Since the Distutils currently only support C, C++, and Objective-C
extensions, these are normally C/C++/Objective-C source files.  (Be sure to use
appropriate extensions to distinguish C++ source files: :file:`.cc` and
:file:`.cpp` seem to be recognized by both Unix and Windows compilers.)

However, you can also include SWIG interface (:file:`.i`) files in the list; the
:command:`build_ext` command knows how to deal with SWIG extensions: it will run
SWIG on the interface file and compile the resulting C/C++ file into your
extension.

.. XXX SWIG support is rough around the edges and largely untested!

This warning notwithstanding, options to SWIG can be currently passed like
this::

    setup(...,
          ext_modules=[Extension('_foo', ['foo.i'],
                                 swig_opts=['-modern', '-I../include'])],
          py_modules=['foo'],
         )

Or on the commandline like this::

    > python setup.py build_ext --swig-opts="-modern -I../include"

On some platforms, you can include non-source files that are processed by the
compiler and included in your extension.  Currently, this just means Windows
message text (:file:`.mc`) files and resource definition (:file:`.rc`) files for
Visual C++. These will be compiled to binary resource (:file:`.res`) files and
linked into the executable.


Preprocessor options
--------------------

Three optional arguments to :class:`~distutils.core.Extension` will help if
you need to specify include directories to search or preprocessor macros to
define/undefine: ``include_dirs``, ``define_macros``, and ``undef_macros``.

For example, if your extension requires header files in the :file:`include`
directory under your distribution root, use the ``include_dirs`` option::

    Extension('foo', ['foo.c'], include_dirs=['include'])

You can specify absolute directories there; if you know that your extension will
only be built on Unix systems with X11R6 installed to :file:`/usr`, you can get
away with ::

    Extension('foo', ['foo.c'], include_dirs=['/usr/include/X11'])

You should avoid this sort of non-portable usage if you plan to distribute your
code: it's probably better to write C code like  ::

    #include <X11/Xlib.h>

If you need to include header files from some other Python extension, you can
take advantage of the fact that header files are installed in a consistent way
by the Distutils :command:`install_headers` command.  For example, the Numerical
Python header files are installed (on a standard Unix installation) to
:file:`/usr/local/include/python1.5/Numerical`. (The exact location will differ
according to your platform and Python installation.)  Since the Python include
directory---\ :file:`/usr/local/include/python1.5` in this case---is always
included in the search path when building Python extensions, the best approach
is to write C code like  ::

    #include <Numerical/arrayobject.h>

If you must put the :file:`Numerical` include directory right into your header
search path, though, you can find that directory using the Distutils
:mod:`distutils.sysconfig` module::

    from distutils.sysconfig import get_python_inc
    incdir = os.path.join(get_python_inc(plat_specific=1), 'Numerical')
    setup(...,
          Extension(..., include_dirs=[incdir]),
          )

Even though this is quite portable---it will work on any Python installation,
regardless of platform---it's probably easier to just write your C code in the
sensible way.

You can define and undefine pre-processor macros with the ``define_macros`` and
``undef_macros`` options. ``define_macros`` takes a list of ``(name, value)``
tuples, where ``name`` is the name of the macro to define (a string) and
``value`` is its value: either a string or ``None``.  (Defining a macro ``FOO``
to ``None`` is the equivalent of a bare ``#define FOO`` in your C source: with
most compilers, this sets ``FOO`` to the string ``1``.)  ``undef_macros`` is
just a list of macros to undefine.

For example::

    Extension(...,
              define_macros=[('NDEBUG', '1'),
                             ('HAVE_STRFTIME', None)],
              undef_macros=['HAVE_FOO', 'HAVE_BAR'])

is the equivalent of having this at the top of every C source file::

    #define NDEBUG 1
    #define HAVE_STRFTIME
    #undef HAVE_FOO
    #undef HAVE_BAR


Library options
---------------

You can also specify the libraries to link against when building your extension,
and the directories to search for those libraries.  The ``libraries`` option is
a list of libraries to link against, ``library_dirs`` is a list of directories
to search for libraries at  link-time, and ``runtime_library_dirs`` is a list of
directories to  search for shared (dynamically loaded) libraries at run-time.

For example, if you need to link against libraries known to be in the standard
library search path on target systems ::

    Extension(...,
              libraries=['gdbm', 'readline'])

If you need to link with libraries in a non-standard location, you'll have to
include the location in ``library_dirs``::

    Extension(...,
              library_dirs=['/usr/X11R6/lib'],
              libraries=['X11', 'Xt'])

(Again, this sort of non-portable construct should be avoided if you intend to
distribute your code.)

.. XXX Should mention clib libraries here or somewhere else!


Other options
-------------

There are still some other options which can be used to handle special cases.

The ``optional`` option is a boolean; if it is true,
a build failure in the extension will not abort the build process, but
instead simply not install the failing extension.

The ``extra_objects`` option is a list of object files to be passed to the
linker. These files must not have extensions, as the default extension for the
compiler is used.

``extra_compile_args`` and ``extra_link_args`` can be used to
specify additional command line options for the respective compiler and linker
command lines.

``export_symbols`` is only useful on Windows.  It can contain a list of
symbols (functions or variables) to be exported. This option is not needed when
building compiled extensions: Distutils  will automatically add ``initmodule``
to the list of exported symbols.

The ``depends`` option is a list of files that the extension depends on
(for example header files). The build command will call the compiler on the
sources to rebuild extension if any on this files has been modified since the
previous build.

Relationships between Distributions and Packages
================================================

A distribution may relate to packages in three specific ways:

#. It can require packages or modules.

#. It can provide packages or modules.

#. It can obsolete packages or modules.

These relationships can be specified using keyword arguments to the
:func:`distutils.core.setup` function.

Dependencies on other Python modules and packages can be specified by supplying
the *requires* keyword argument to :func:`~distutils.core.setup`. The
value must be a list of
strings.  Each string specifies a package that is required, and optionally what
versions are sufficient.

To specify that any version of a module or package is required, the string
should consist entirely of the module or package name. Examples include
``'mymodule'`` and ``'xml.parsers.expat'``.

If specific versions are required, a sequence of qualifiers can be supplied in
parentheses.  Each qualifier may consist of a comparison operator and a version
number.  The accepted comparison operators are::

    <    >    ==
    <=   >=   !=

These can be combined by using multiple qualifiers separated by commas (and
optional whitespace).  In this case, all of the qualifiers must be matched; a
logical AND is used to combine the evaluations.

Let's look at a bunch of examples:

+-------------------------+----------------------------------------------+
| Requires Expression     | Explanation                                  |
+=========================+==============================================+
| ``==1.0``               | Only version ``1.0`` is compatible           |
+-------------------------+----------------------------------------------+
| ``>1.0, !=1.5.1, <2.0`` | Any version after ``1.0`` and before ``2.0`` |
|                         | is compatible, except ``1.5.1``              |
+-------------------------+----------------------------------------------+

Now that we can specify dependencies, we also need to be able to specify what we
provide that other distributions can require.  This is done using the *provides*
keyword argument to :func:`~distutils.core.setup`. The value for this keyword is a list of
strings, each of which names a Python module or package, and optionally
identifies the version.  If the version is not specified, it is assumed to match
that of the distribution.

Some examples:

+---------------------+----------------------------------------------+
| Provides Expression | Explanation                                  |
+=====================+==============================================+
| ``mypkg``           | Provide ``mypkg``, using the distribution    |
|                     | version                                      |
+---------------------+----------------------------------------------+
| ``mypkg (1.1)``     | Provide ``mypkg`` version 1.1, regardless of |
|                     | the distribution version                     |
+---------------------+----------------------------------------------+

A package can declare that it obsoletes other packages using the *obsoletes*
keyword argument.  The value for this is similar to that of the *requires*
keyword: a list of strings giving module or package specifiers.  Each specifier
consists of a module or package name optionally followed by one or more version
qualifiers.  Version qualifiers are given in parentheses after the module or
package name.

The versions identified by the qualifiers are those that are obsoleted by the
distribution being described.  If no qualifiers are given, all versions of the
named module or package are understood to be obsoleted.

.. _distutils-installing-scripts:

Installing Scripts
==================

So far we have been dealing with pure and non-pure Python modules, which are
usually not run by themselves but imported by scripts.

Scripts are files containing Python source code, intended to be started from the
command line.  Scripts don't require Distutils to do anything very complicated.
The only clever feature is that if the first line of the script starts with
``#!`` and contains the word "python", the Distutils will adjust the first line
to refer to the current interpreter location. By default, it is replaced with
the current interpreter location.  The :option:`!--executable` (or :option:`!-e`)
option will allow the interpreter path to be explicitly overridden.

The ``scripts`` option simply is a list of files to be handled in this
way.  From the PyXML setup script::

    setup(...,
          scripts=['scripts/xmlproc_parse', 'scripts/xmlproc_val']
          )

.. versionchanged:: 3.1
   All the scripts will also be added to the ``MANIFEST`` file if no template is
   provided.  See :ref:`manifest`.


.. _distutils-installing-package-data:

Installing Package Data
=======================

Often, additional files need to be installed into a package.  These files are
often data that's closely related to the package's implementation, or text files
containing documentation that might be of interest to programmers using the
package.  These files are called :dfn:`package data`.

Package data can be added to packages using the ``package_data`` keyword
argument to the :func:`~distutils.core.setup` function.  The value must be a mapping from
package name to a list of relative path names that should be copied into the
package.  The paths are interpreted as relative to the directory containing the
package (information from the ``package_dir`` mapping is used if appropriate);
that is, the files are expected to be part of the package in the source
directories. They may contain glob patterns as well.

The path names may contain directory portions; any necessary directories will be
created in the installation.

For example, if a package should contain a subdirectory with several data files,
the files can be arranged like this in the source tree::

    setup.py
    src/
        mypkg/
            __init__.py
            module.py
            data/
                tables.dat
                spoons.dat
                forks.dat

The corresponding call to :func:`~distutils.core.setup` might be::

    setup(...,
          packages=['mypkg'],
          package_dir={'mypkg': 'src/mypkg'},
          package_data={'mypkg': ['data/*.dat']},
          )


.. versionchanged:: 3.1
   All the files that match ``package_data`` will be added to the ``MANIFEST``
   file if no template is provided.  See :ref:`manifest`.


.. _distutils-additional-files:

Installing Additional Files
===========================

The ``data_files`` option can be used to specify additional files needed
by the module distribution: configuration files, message catalogs, data files,
anything which doesn't fit in the previous categories.

``data_files`` specifies a sequence of (*directory*, *files*) pairs in the
following way::

    setup(...,
          data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
                      ('config', ['cfg/data.cfg'])],
         )

Each (*directory*, *files*) pair in the sequence specifies the installation
directory and the files to install there.

Each file name in *files* is interpreted relative to the :file:`setup.py`
script at the top of the package source distribution. Note that you can
specify the directory where the data files will be installed, but you cannot
rename the data files themselves.

The *directory* should be a relative path. It is interpreted relative to the
installation prefix (Python's ``sys.prefix`` for system installations;
``site.USER_BASE`` for user installations). Distutils allows *directory* to be
an absolute installation path, but this is discouraged since it is
incompatible with the wheel packaging format. No directory information from
*files* is used to determine the final location of the installed file; only
the name of the file is used.

You can specify the ``data_files`` options as a simple sequence of files
without specifying a target directory, but this is not recommended, and the
:command:`install` command will print a warning in this case. To install data
files directly in the target directory, an empty string should be given as the
directory.

.. versionchanged:: 3.1
   All the files that match ``data_files`` will be added to the ``MANIFEST``
   file if no template is provided.  See :ref:`manifest`.


.. _meta-data:

Additional meta-data
====================

The setup script may include additional meta-data beyond the name and version.
This information includes:

+----------------------+---------------------------+-----------------+--------+
| Meta-Data            | Description               | Value           | Notes  |
+======================+===========================+=================+========+
| ``name``             | name of the package       | short string    | \(1)   |
+----------------------+---------------------------+-----------------+--------+
| ``version``          | version of this release   | short string    | (1)(2) |
+----------------------+---------------------------+-----------------+--------+
| ``author``           | package author's name     | short string    | \(3)   |
+----------------------+---------------------------+-----------------+--------+
| ``author_email``     | email address of the      | email address   | \(3)   |
|                      | package author            |                 |        |
+----------------------+---------------------------+-----------------+--------+
| ``maintainer``       | package maintainer's name | short string    | \(3)   |
+----------------------+---------------------------+-----------------+--------+
| ``maintainer_email`` | email address of the      | email address   | \(3)   |
|                      | package maintainer        |                 |        |
+----------------------+---------------------------+-----------------+--------+
| ``url``              | home page for the package | URL             | \(1)   |
+----------------------+---------------------------+-----------------+--------+
| ``description``      | short, summary            | short string    |        |
|                      | description of the        |                 |        |
|                      | package                   |                 |        |
+----------------------+---------------------------+-----------------+--------+
| ``long_description`` | longer description of the | long string     | \(4)   |
|                      | package                   |                 |        |
+----------------------+---------------------------+-----------------+--------+
| ``download_url``     | location where the        | URL             |        |
|                      | package may be downloaded |                 |        |
+----------------------+---------------------------+-----------------+--------+
| ``classifiers``      | a list of classifiers     | list of strings | (6)(7) |
+----------------------+---------------------------+-----------------+--------+
| ``platforms``        | a list of platforms       | list of strings | (6)(8) |
+----------------------+---------------------------+-----------------+--------+
| ``keywords``         | a list of keywords        | list of strings | (6)(8) |
+----------------------+---------------------------+-----------------+--------+
| ``license``          | license for the package   | short string    | \(5)   |
+----------------------+---------------------------+-----------------+--------+

Notes:

(1)
    These fields are required.

(2)
    It is recommended that versions take the form *major.minor[.patch[.sub]]*.

(3)
    Either the author or the maintainer must be identified. If maintainer is
    provided, distutils lists it as the author in :file:`PKG-INFO`.

(4)
    The ``long_description`` field is used by PyPI when you publish a package,
    to build its project page.

(5)
    The ``license`` field is a text indicating the license covering the
    package where the license is not a selection from the "License" Trove
    classifiers. See the ``Classifier`` field. Notice that
    there's a ``licence`` distribution option which is deprecated but still
    acts as an alias for ``license``.

(6)
    This field must be a list.

(7)
    The valid classifiers are listed on
    `PyPI <https://pypi.org/classifiers>`_.

(8)
    To preserve backward compatibility, this field also accepts a string. If
    you pass a comma-separated string ``'foo, bar'``, it will be converted to
    ``['foo', 'bar']``, Otherwise, it will be converted to a list of one
    string.

'short string'
    A single line of text, not more than 200 characters.

'long string'
    Multiple lines of plain text in reStructuredText format (see
    http://docutils.sourceforge.net/).

'list of strings'
    See below.

Encoding the version information is an art in itself. Python packages generally
adhere to the version format *major.minor[.patch][sub]*. The major number is 0
for initial, experimental releases of software. It is incremented for releases
that represent major milestones in a package. The minor number is incremented
when important new features are added to the package. The patch number
increments when bug-fix releases are made. Additional trailing version
information is sometimes used to indicate sub-releases.  These are
"a1,a2,...,aN" (for alpha releases, where functionality and API may change),
"b1,b2,...,bN" (for beta releases, which only fix bugs) and "pr1,pr2,...,prN"
(for final pre-release release testing). Some examples:

0.1.0
    the first, experimental release of a package

1.0.1a2
    the second alpha release of the first patch version of 1.0

``classifiers`` must be specified in a list::

    setup(...,
          classifiers=[
              'Development Status :: 4 - Beta',
              'Environment :: Console',
              'Environment :: Web Environment',
              'Intended Audience :: End Users/Desktop',
              'Intended Audience :: Developers',
              'Intended Audience :: System Administrators',
              'License :: OSI Approved :: Python Software Foundation License',
              'Operating System :: MacOS :: MacOS X',
              'Operating System :: Microsoft :: Windows',
              'Operating System :: POSIX',
              'Programming Language :: Python',
              'Topic :: Communications :: Email',
              'Topic :: Office/Business',
              'Topic :: Software Development :: Bug Tracking',
              ],
          )

.. versionchanged:: 3.7
   :class:`~distutils.core.setup` now warns when ``classifiers``, ``keywords``
   or ``platforms`` fields are not specified as a list or a string.

.. _debug-setup-script:

Debugging the setup script
==========================

Sometimes things go wrong, and the setup script doesn't do what the developer
wants.

Distutils catches any exceptions when running the setup script, and print a
simple error message before the script is terminated.  The motivation for this
behaviour is to not confuse administrators who don't know much about Python and
are trying to install a package.  If they get a big long traceback from deep
inside the guts of Distutils, they may think the package or the Python
installation is broken because they don't read all the way down to the bottom
and see that it's a permission problem.

On the other hand, this doesn't help the developer to find the cause of the
failure. For this purpose, the :envvar:`DISTUTILS_DEBUG` environment variable can be set
to anything except an empty string, and distutils will now print detailed
information about what it is doing, dump the full traceback when an exception
occurs, and print the whole command line when an external program (like a C
compiler) fails.
PK�(�\�W��Ddoc/alt-python37-setuptools/docs/deprecated/distutils/commandref.rstnu�[���.. _reference:

*****************
Command Reference
*****************

.. include:: ./_setuptools_disclaimer.rst

.. % \section{Building modules: the \protect\command{build} command family}
.. % \label{build-cmds}
.. % \subsubsection{\protect\command{build}}
.. % \label{build-cmd}
.. % \subsubsection{\protect\command{build\_py}}
.. % \label{build-py-cmd}
.. % \subsubsection{\protect\command{build\_ext}}
.. % \label{build-ext-cmd}
.. % \subsubsection{\protect\command{build\_clib}}
.. % \label{build-clib-cmd}


.. _install-cmd:

Installing modules: the :command:`install` command family
=========================================================

The install command ensures that the build commands have been run and then runs
the subcommands :command:`install_lib`, :command:`install_data` and
:command:`install_scripts`.

.. % \subsubsection{\protect\command{install\_lib}}
.. % \label{install-lib-cmd}


.. _install-data-cmd:

:command:`install_data`
-----------------------

This command installs all data files provided with the distribution.


.. _install-scripts-cmd:

:command:`install_scripts`
--------------------------

This command installs all (Python) scripts in the distribution.

.. % \subsection{Cleaning up: the \protect\command{clean} command}
.. % \label{clean-cmd}


.. _sdist-cmd:

Creating a source distribution: the :command:`sdist` command
============================================================

.. XXX fragment moved down from above: needs context!

The manifest template commands are:

+-------------------------------------------+-----------------------------------------------+
| Command                                   | Description                                   |
+===========================================+===============================================+
| :command:`include pat1 pat2 ...`          | include all files matching any of the listed  |
|                                           | patterns                                      |
+-------------------------------------------+-----------------------------------------------+
| :command:`exclude pat1 pat2 ...`          | exclude all files matching any of the listed  |
|                                           | patterns                                      |
+-------------------------------------------+-----------------------------------------------+
| :command:`recursive-include dir pat1 pat2 | include all files under *dir* matching any of |
| ...`                                      | the listed patterns                           |
+-------------------------------------------+-----------------------------------------------+
| :command:`recursive-exclude dir pat1 pat2 | exclude all files under *dir* matching any of |
| ...`                                      | the listed patterns                           |
+-------------------------------------------+-----------------------------------------------+
| :command:`global-include pat1 pat2 ...`   | include all files anywhere in the source tree |
|                                           | matching --- & any of the listed patterns     |
+-------------------------------------------+-----------------------------------------------+
| :command:`global-exclude pat1 pat2 ...`   | exclude all files anywhere in the source tree |
|                                           | matching --- & any of the listed patterns     |
+-------------------------------------------+-----------------------------------------------+
| :command:`prune dir`                      | exclude all files under *dir*                 |
+-------------------------------------------+-----------------------------------------------+
| :command:`graft dir`                      | include all files under *dir*                 |
+-------------------------------------------+-----------------------------------------------+

The patterns here are Unix-style "glob" patterns: ``*`` matches any sequence of
regular filename characters, ``?`` matches any single regular filename
character, and ``[range]`` matches any of the characters in *range* (e.g.,
``a-z``, ``a-zA-Z``, ``a-f0-9_.``).  The definition of "regular filename
character" is platform-specific: on Unix it is anything except slash; on Windows
anything except backslash or colon.

.. XXX Windows support not there yet

.. % \section{Creating a built distribution: the
.. % \protect\command{bdist} command family}
.. % \label{bdist-cmds}

.. % \subsection{\protect\command{bdist}}
.. % \subsection{\protect\command{bdist\_dumb}}
.. % \subsection{\protect\command{bdist\_rpm}}
.. % \subsection{\protect\command{bdist\_wininst}}


PK�(�\.<��ZZCdoc/alt-python37-setuptools/docs/deprecated/distutils/builtdist.rstnu�[���.. _built-dist:

****************************
Creating Built Distributions
****************************

.. include:: ./_setuptools_disclaimer.rst

A "built distribution" is what you're probably used to thinking of either as a
"binary package" or an "installer" (depending on your background).  It's not
necessarily binary, though, because it might contain only Python source code
and/or byte-code; and we don't call it a package, because that word is already
spoken for in Python.  (And "installer" is a term specific to the world of
mainstream desktop systems.)

A built distribution is how you make life as easy as possible for installers of
your module distribution: for users of RPM-based Linux systems, it's a binary
RPM; for Windows users, it's an executable installer; for Debian-based Linux
users, it's a Debian package; and so forth.  Obviously, no one person will be
able to create built distributions for every platform under the sun, so the
Distutils are designed to enable module developers to concentrate on their
specialty---writing code and creating source distributions---while an
intermediary species called *packagers* springs up to turn source distributions
into built distributions for as many platforms as there are packagers.

Of course, the module developer could be their own packager; or the packager could
be a volunteer "out there" somewhere who has access to a platform which the
original developer does not; or it could be software periodically grabbing new
source distributions and turning them into built distributions for as many
platforms as the software has access to.  Regardless of who they are, a packager
uses the setup script and the :command:`bdist` command family to generate built
distributions.

As a simple example, if I run the following command in the Distutils source
tree::

   python setup.py bdist

then the Distutils builds my module distribution (the Distutils itself in this
case), does a "fake" installation (also in the :file:`build` directory), and
creates the default type of built distribution for my platform.  The default
format for built distributions is a "dumb" tar file on Unix, and a simple
executable installer on Windows.  (That tar file is considered "dumb" because it
has to be unpacked in a specific location to work.)

Thus, the above command on a Unix system creates
:file:`Distutils-1.0.{plat}.tar.gz`; unpacking this tarball from the right place
installs the Distutils just as though you had downloaded the source distribution
and run ``python setup.py install``.  (The "right place" is either the root of
the filesystem or  Python's :file:`{prefix}` directory, depending on the options
given to the :command:`bdist_dumb` command; the default is to make dumb
distributions relative to :file:`{prefix}`.)

Obviously, for pure Python distributions, this isn't any simpler than just
running ``python setup.py install``\ ---but for non-pure distributions, which
include extensions that would need to be compiled, it can mean the difference
between someone being able to use your extensions or not.  And creating "smart"
built distributions, such as an RPM package or an executable installer for
Windows, is far more convenient for users even if your distribution doesn't
include any extensions.

The :command:`bdist` command has a :option:`!--formats` option, similar to the
:command:`sdist` command, which you can use to select the types of built
distribution to generate: for example, ::

   python setup.py bdist --format=zip

would, when run on a Unix system, create
:file:`Distutils-1.0.{plat}.zip`\ ---again, this archive would be unpacked
from the root directory to install the Distutils.

The available formats for built distributions are:

+-------------+------------------------------+---------+
| Format      | Description                  | Notes   |
+=============+==============================+=========+
| ``gztar``   | gzipped tar file             | \(1)    |
|             | (:file:`.tar.gz`)            |         |
+-------------+------------------------------+---------+
| ``bztar``   | bzipped tar file             |         |
|             | (:file:`.tar.bz2`)           |         |
+-------------+------------------------------+---------+
| ``xztar``   | xzipped tar file             |         |
|             | (:file:`.tar.xz`)            |         |
+-------------+------------------------------+---------+
| ``ztar``    | compressed tar file          | \(3)    |
|             | (:file:`.tar.Z`)             |         |
+-------------+------------------------------+---------+
| ``tar``     | tar file (:file:`.tar`)      |         |
+-------------+------------------------------+---------+
| ``zip``     | zip file (:file:`.zip`)      | (2),(4) |
+-------------+------------------------------+---------+
| ``rpm``     | RPM                          | \(5)    |
+-------------+------------------------------+---------+
| ``pkgtool`` | Solaris :program:`pkgtool`   |         |
+-------------+------------------------------+---------+
| ``sdux``    | HP-UX :program:`swinstall`   |         |
+-------------+------------------------------+---------+
| ``wininst`` | self-extracting ZIP file for | \(4)    |
|             | Windows                      |         |
+-------------+------------------------------+---------+
| ``msi``     | Microsoft Installer.         |         |
+-------------+------------------------------+---------+

.. versionchanged:: 3.5
   Added support for the ``xztar`` format.


Notes:

(1)
   default on Unix

(2)
   default on Windows

(3)
   requires external :program:`compress` utility.

(4)
   requires either external :program:`zip` utility or :mod:`zipfile` module (part
   of the standard Python library since Python 1.6)

(5)
   requires external :program:`rpm` utility, version 3.0.4 or better (use ``rpm
   --version`` to find out which version you have)

You don't have to use the :command:`bdist` command with the :option:`!--formats`
option; you can also use the command that directly implements the format you're
interested in.  Some of these :command:`bdist` "sub-commands" actually generate
several similar formats; for instance, the :command:`bdist_dumb` command
generates all the "dumb" archive formats (``tar``, ``gztar``, ``bztar``,
``xztar``, ``ztar``, and ``zip``), and :command:`bdist_rpm` generates both
binary and source RPMs.  The :command:`bdist` sub-commands, and the formats
generated by each, are:

+--------------------------+-------------------------------------+
| Command                  | Formats                             |
+==========================+=====================================+
| :command:`bdist_dumb`    | tar, gztar, bztar, xztar, ztar, zip |
+--------------------------+-------------------------------------+
| :command:`bdist_rpm`     | rpm, srpm                           |
+--------------------------+-------------------------------------+
| :command:`bdist_wininst` | wininst                             |
+--------------------------+-------------------------------------+
| :command:`bdist_msi`     | msi                                 |
+--------------------------+-------------------------------------+

.. note::
   bdist_wininst is deprecated since Python 3.8.

.. note::
   bdist_msi is deprecated since Python 3.9.

The following sections give details on the individual :command:`bdist_\*`
commands.


.. .. _creating-dumb:

.. Creating dumb built distributions
.. =================================

.. XXX Need to document absolute vs. prefix-relative packages here, but first
   I have to implement it!


.. _creating-rpms:

Creating RPM packages
=====================

The RPM format is used by many popular Linux distributions, including Red Hat,
SuSE, and Mandrake.  If one of these (or any of the other RPM-based Linux
distributions) is your usual environment, creating RPM packages for other users
of that same distribution is trivial. Depending on the complexity of your module
distribution and differences between Linux distributions, you may also be able
to create RPMs that work on different RPM-based distributions.

The usual way to create an RPM of your module distribution is to run the
:command:`bdist_rpm` command::

   python setup.py bdist_rpm

or the :command:`bdist` command with the :option:`!--format` option::

   python setup.py bdist --formats=rpm

The former allows you to specify RPM-specific options; the latter allows  you to
easily specify multiple formats in one run.  If you need to do both, you can
explicitly specify multiple :command:`bdist_\*` commands and their options::

   python setup.py bdist_rpm --packager="John Doe <jdoe@example.org>" \
                   bdist_wininst --target-version="2.0"

Creating RPM packages is driven by a :file:`.spec` file, much as using the
Distutils is driven by the setup script.  To make your life easier, the
:command:`bdist_rpm` command normally creates a :file:`.spec` file based on the
information you supply in the setup script, on the command line, and in any
Distutils configuration files.  Various options and sections in the
:file:`.spec` file are derived from options in the setup script as follows:

+------------------------------------------+----------------------------------------------+
| RPM :file:`.spec` file option or section | Distutils setup script option                |
+==========================================+==============================================+
| Name                                     | ``name``                                     |
+------------------------------------------+----------------------------------------------+
| Summary (in preamble)                    | ``description``                              |
+------------------------------------------+----------------------------------------------+
| Version                                  | ``version``                                  |
+------------------------------------------+----------------------------------------------+
| Vendor                                   | ``author`` and ``author_email``,             |
|                                          | or  --- & ``maintainer`` and                 |
|                                          | ``maintainer_email``                         |
+------------------------------------------+----------------------------------------------+
| Copyright                                | ``license``                                  |
+------------------------------------------+----------------------------------------------+
| Url                                      | ``url``                                      |
+------------------------------------------+----------------------------------------------+
| %description (section)                   | ``long_description``                         |
+------------------------------------------+----------------------------------------------+

Additionally, there are many options in :file:`.spec` files that don't have
corresponding options in the setup script.  Most of these are handled through
options to the :command:`bdist_rpm` command as follows:

+-------------------------------+-----------------------------+-------------------------+
| RPM :file:`.spec` file option | :command:`bdist_rpm` option | default value           |
| or section                    |                             |                         |
+===============================+=============================+=========================+
| Release                       | ``release``                 | "1"                     |
+-------------------------------+-----------------------------+-------------------------+
| Group                         | ``group``                   | "Development/Libraries" |
+-------------------------------+-----------------------------+-------------------------+
| Vendor                        | ``vendor``                  | (see above)             |
+-------------------------------+-----------------------------+-------------------------+
| Packager                      | ``packager``                | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Provides                      | ``provides``                | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Requires                      | ``requires``                | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Conflicts                     | ``conflicts``               | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Obsoletes                     | ``obsoletes``               | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Distribution                  | ``distribution_name``       | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| BuildRequires                 | ``build_requires``          | (none)                  |
+-------------------------------+-----------------------------+-------------------------+
| Icon                          | ``icon``                    | (none)                  |
+-------------------------------+-----------------------------+-------------------------+

Obviously, supplying even a few of these options on the command-line would be
tedious and error-prone, so it's usually best to put them in the setup
configuration file, :file:`setup.cfg`\ ---see section :ref:`setup-config`.  If
you distribute or package many Python module distributions, you might want to
put options that apply to all of them in your personal Distutils configuration
file (:file:`~/.pydistutils.cfg`).  If you want to temporarily disable
this file, you can pass the :option:`!--no-user-cfg` option to :file:`setup.py`.

There are three steps to building a binary RPM package, all of which are
handled automatically by the Distutils:

#. create a :file:`.spec` file, which describes the package (analogous  to the
   Distutils setup script; in fact, much of the information in the  setup script
   winds up in the :file:`.spec` file)

#. create the source RPM

#. create the "binary" RPM (which may or may not contain binary code, depending
   on whether your module distribution contains Python extensions)

Normally, RPM bundles the last two steps together; when you use the Distutils,
all three steps are typically bundled together.

If you wish, you can separate these three steps.  You can use the
:option:`!--spec-only` option to make :command:`bdist_rpm` just create the
:file:`.spec` file and exit; in this case, the :file:`.spec` file will be
written to the "distribution directory"---normally :file:`dist/`, but
customizable with the :option:`!--dist-dir` option.  (Normally, the :file:`.spec`
file winds up deep in the "build tree," in a temporary directory created by
:command:`bdist_rpm`.)

.. % \XXX{this isn't implemented yet---is it needed?!}
.. % You can also specify a custom \file{.spec} file with the
.. % \longprogramopt{spec-file} option; used in conjunction with
.. % \longprogramopt{spec-only}, this gives you an opportunity to customize
.. % the \file{.spec} file manually:
.. %
.. % \ begin{verbatim}
.. % > python setup.py bdist_rpm --spec-only
.. % # ...edit dist/FooBar-1.0.spec
.. % > python setup.py bdist_rpm --spec-file=dist/FooBar-1.0.spec
.. % \ end{verbatim}
.. %
.. % (Although a better way to do this is probably to override the standard
.. % \command{bdist\_rpm} command with one that writes whatever else you want
.. % to the \file{.spec} file.)


.. _creating-wininst:

Creating Windows Installers
===========================

.. warning::
   bdist_wininst is deprecated since Python 3.8.

.. warning::
   bdist_msi is deprecated since Python 3.9.

Executable installers are the natural format for binary distributions on
Windows.  They display a nice graphical user interface, display some information
about the module distribution to be installed taken from the metadata in the
setup script, let the user select a few options, and start or cancel the
installation.

Since the metadata is taken from the setup script, creating Windows installers
is usually as easy as running::

   python setup.py bdist_wininst

or the :command:`bdist` command with the :option:`!--formats` option::

   python setup.py bdist --formats=wininst

If you have a pure module distribution (only containing pure Python modules and
packages), the resulting installer will be version independent and have a name
like :file:`foo-1.0.win32.exe`. Note that creating ``wininst`` binary
distributions in only supported on Windows systems.

If you have a non-pure distribution, the extensions can only be created on a
Windows platform, and will be Python version dependent. The installer filename
will reflect this and now has the form :file:`foo-1.0.win32-py2.0.exe`.  You
have to create a separate installer for every Python version you want to
support.

The installer will try to compile pure modules into :term:`bytecode` after installation
on the target system in normal and optimizing mode.  If you don't want this to
happen for some reason, you can run the :command:`bdist_wininst` command with
the :option:`!--no-target-compile` and/or the :option:`!--no-target-optimize`
option.

By default the installer will display the cool "Python Powered" logo when it is
run, but you can also supply your own 152x261 bitmap which must be a Windows
:file:`.bmp` file with the :option:`!--bitmap` option.

The installer will also display a large title on the desktop background window
when it is run, which is constructed from the name of your distribution and the
version number.  This can be changed to another text by using the
:option:`!--title` option.

The installer file will be written to the "distribution directory" --- normally
:file:`dist/`, but customizable with the :option:`!--dist-dir` option.

.. _cross-compile-windows:

Cross-compiling on Windows
==========================

Starting with Python 2.6, distutils is capable of cross-compiling between
Windows platforms.  In practice, this means that with the correct tools
installed, you can use a 32bit version of Windows to create 64bit extensions
and vice-versa.

To build for an alternate platform, specify the :option:`!--plat-name` option
to the build command.  Valid values are currently 'win32', and  'win-amd64'.
For example, on a 32bit version of Windows, you could execute::

   python setup.py build --plat-name=win-amd64

to build a 64bit version of your extension.  The Windows Installers also
support this option, so the command::

   python setup.py build --plat-name=win-amd64 bdist_wininst

would create a 64bit installation executable on your 32bit version of Windows.

To cross-compile, you must download the Python source code and cross-compile
Python itself for the platform you are targeting - it is not possible from a
binary installation of Python (as the .lib etc file for other platforms are
not included.)  In practice, this means the user of a 32 bit operating
system will need to use Visual Studio 2008 to open the
:file:`PCbuild/PCbuild.sln` solution in the Python source tree and build the
"x64" configuration of the 'pythoncore' project before cross-compiling
extensions is possible.

Note that by default, Visual Studio 2008 does not install 64bit compilers or
tools.  You may need to reexecute the Visual Studio setup process and select
these tools (using Control Panel->[Add/Remove] Programs is a convenient way to
check or modify your existing install.)

.. _postinstallation-script:

The Postinstallation script
---------------------------

Starting with Python 2.3, a postinstallation script can be specified with the
:option:`!--install-script` option.  The basename of the script must be
specified, and the script filename must also be listed in the scripts argument
to the setup function.

This script will be run at installation time on the target system after all the
files have been copied, with ``argv[1]`` set to :option:`!-install`, and again at
uninstallation time before the files are removed with ``argv[1]`` set to
:option:`!-remove`.

The installation script runs embedded in the windows installer, every output
(``sys.stdout``, ``sys.stderr``) is redirected into a buffer and will be
displayed in the GUI after the script has finished.

Some functions especially useful in this context are available as additional
built-in functions in the installation script.


.. function:: directory_created(path)
              file_created(path)

   These functions should be called when a directory or file is created by the
   postinstall script at installation time.  It will register *path* with the
   uninstaller, so that it will be removed when the distribution is uninstalled.
   To be safe, directories are only removed if they are empty.


.. function:: get_special_folder_path(csidl_string)

   This function can be used to retrieve special folder locations on Windows like
   the Start Menu or the Desktop.  It returns the full path to the folder.
   *csidl_string* must be one of the following strings::

      "CSIDL_APPDATA"

      "CSIDL_COMMON_STARTMENU"
      "CSIDL_STARTMENU"

      "CSIDL_COMMON_DESKTOPDIRECTORY"
      "CSIDL_DESKTOPDIRECTORY"

      "CSIDL_COMMON_STARTUP"
      "CSIDL_STARTUP"

      "CSIDL_COMMON_PROGRAMS"
      "CSIDL_PROGRAMS"

      "CSIDL_FONTS"

   If the folder cannot be retrieved, :exc:`OSError` is raised.

   Which folders are available depends on the exact Windows version, and probably
   also the configuration.  For details refer to Microsoft's documentation of the
   :c:func:`SHGetSpecialFolderPath` function.


.. function:: create_shortcut(target, description, filename[, arguments[, workdir[, iconpath[, iconindex]]]])

   This function creates a shortcut. *target* is the path to the program to be
   started by the shortcut. *description* is the description of the shortcut.
   *filename* is the title of the shortcut that the user will see. *arguments*
   specifies the command line arguments, if any. *workdir* is the working directory
   for the program. *iconpath* is the file containing the icon for the shortcut,
   and *iconindex* is the index of the icon in the file *iconpath*.  Again, for
   details consult the Microsoft documentation for the :class:`IShellLink`
   interface.


Vista User Access Control (UAC)
===============================

Starting with Python 2.6, bdist_wininst supports a :option:`!--user-access-control`
option.  The default is 'none' (meaning no UAC handling is done), and other
valid values are 'auto' (meaning prompt for UAC elevation if Python was
installed for all users) and 'force' (meaning always prompt for elevation).

.. note::
   bdist_wininst is deprecated since Python 3.8.

.. note::
   bdist_msi is deprecated since Python 3.9.
PK�(�\:X���Cdoc/alt-python37-setuptools/docs/deprecated/distutils/uploading.rstnu�[���:orphan:

***************************************
Uploading Packages to the Package Index
***************************************

References to up to date PyPI documentation can be found at
:ref:`publishing-python-packages`.
PK�(�\n�O���Pdoc/alt-python37-setuptools/docs/deprecated/distutils/_setuptools_disclaimer.rstnu�[���.. note::

   This document is being retained solely until the ``setuptools`` documentation
   at https://setuptools.readthedocs.io/en/latest/setuptools.html
   independently covers all of the relevant information currently included here.
PK�(�\>�yq�!�!Fdoc/alt-python37-setuptools/docs/deprecated/distutils/introduction.rstnu�[���.. _distutils-intro:

****************************
An Introduction to Distutils
****************************

.. include:: ./_setuptools_disclaimer.rst

This document covers using the Distutils to distribute your Python modules,
concentrating on the role of developer/distributor: if you're looking for
information on installing Python modules, you should refer to the
:ref:`install-index` chapter.


.. _distutils-concepts:

Concepts & Terminology
======================

Using the Distutils is quite simple, both for module developers and for
users/administrators installing third-party modules.  As a developer, your
responsibilities (apart from writing solid, well-documented and well-tested
code, of course!) are:

* write a setup script (:file:`setup.py` by convention)

* (optional) write a setup configuration file

* create a source distribution

* (optional) create one or more built (binary) distributions

Each of these tasks is covered in this document.

Not all module developers have access to a multitude of platforms, so it's not
always feasible to expect them to create a multitude of built distributions.  It
is hoped that a class of intermediaries, called *packagers*, will arise to
address this need.  Packagers will take source distributions released by module
developers, build them on one or more platforms, and release the resulting built
distributions.  Thus, users on the most popular platforms will be able to
install most popular Python module distributions in the most natural way for
their platform, without having to run a single setup script or compile a line of
code.


.. _distutils-simple-example:

A Simple Example
================

The setup script is usually quite simple, although since it's written in Python,
there are no arbitrary limits to what you can do with it, though you should be
careful about putting arbitrarily expensive operations in your setup script.
Unlike, say, Autoconf-style configure scripts, the setup script may be run
multiple times in the course of building and installing your module
distribution.

If all you want to do is distribute a module called ``foo``, contained in a
file :file:`foo.py`, then your setup script can be as simple as this::

   from distutils.core import setup
   setup(name='foo',
         version='1.0',
         py_modules=['foo'],
         )

Some observations:

* most information that you supply to the Distutils is supplied as keyword
  arguments to the :func:`~distutils.core.setup` function

* those keyword arguments fall into two categories: package metadata (name,
  version number) and information about what's in the package (a list of pure
  Python modules, in this case)

* modules are specified by module name, not filename (the same will hold true
  for packages and extensions)

* it's recommended that you supply a little more metadata, in particular your
  name, email address and a URL for the project (see section :ref:`setup-script`
  for an example)

To create a source distribution for this module, you would create a setup
script, :file:`setup.py`, containing the above code, and run this command from a
terminal::

   python setup.py sdist

For Windows, open a command prompt window (:menuselection:`Start -->
Accessories`) and change the command to::

   setup.py sdist

:command:`sdist` will create an archive file (e.g., tarball on Unix, ZIP file on Windows)
containing your setup script :file:`setup.py`, and your module :file:`foo.py`.
The archive file will be named :file:`foo-1.0.tar.gz` (or :file:`.zip`), and
will unpack into a directory :file:`foo-1.0`.

If an end-user wishes to install your ``foo`` module, all they have to do is
download :file:`foo-1.0.tar.gz` (or :file:`.zip`), unpack it, and---from the
:file:`foo-1.0` directory---run ::

   python setup.py install

which will ultimately copy :file:`foo.py` to the appropriate directory for
third-party modules in their Python installation.

This simple example demonstrates some fundamental concepts of the Distutils.
First, both developers and installers have the same basic user interface, i.e.
the setup script.  The difference is which Distutils *commands* they use: the
:command:`sdist` command is almost exclusively for module developers, while
:command:`install` is more often for installers (although most developers will
want to install their own code occasionally).

If you want to make things really easy for your users, you can create one or
more built distributions for them.  For instance, if you are running on a
Windows machine, and want to make things easy for other Windows users, you can
create an executable installer (the most appropriate type of built distribution
for this platform) with the :command:`bdist_wininst` command.  For example::

   python setup.py bdist_wininst

will create an executable installer, :file:`foo-1.0.win32.exe`, in the current
directory.

Other useful built distribution formats are RPM, implemented by the
:command:`bdist_rpm` command, Solaris :program:`pkgtool`
(:command:`bdist_pkgtool`), and HP-UX :program:`swinstall`
(:command:`bdist_sdux`).  For example, the following command will create an RPM
file called :file:`foo-1.0.noarch.rpm`::

   python setup.py bdist_rpm

(The :command:`bdist_rpm` command uses the :command:`rpm` executable, therefore
this has to be run on an RPM-based system such as Red Hat Linux, SuSE Linux, or
Mandrake Linux.)

You can find out what distribution formats are available at any time by running
::

   python setup.py bdist --help-formats


.. _python-terms:

General Python terminology
==========================

If you're reading this document, you probably have a good idea of what modules,
extensions, and so forth are.  Nevertheless, just to be sure that everyone is
operating from a common starting point, we offer the following glossary of
common Python terms:

module
   the basic unit of code reusability in Python: a block of code imported by some
   other code.  Three types of modules concern us here: pure Python modules,
   extension modules, and packages.

pure Python module
   a module written in Python and contained in a single :file:`.py` file (and
   possibly associated :file:`.pyc` files).  Sometimes referred to as a
   "pure module."

extension module
   a module written in the low-level language of the Python implementation: C/C++
   for Python, Java for Jython. Typically contained in a single dynamically
   loadable pre-compiled file, e.g. a shared object (:file:`.so`) file for Python
   extensions on Unix, a DLL (given the :file:`.pyd` extension) for Python
   extensions on Windows, or a Java class file for Jython extensions.  (Note that
   currently, the Distutils only handles C/C++ extensions for Python.)

package
   a module that contains other modules; typically contained in a directory in the
   filesystem and distinguished from other directories by the presence of a file
   :file:`__init__.py`.

root package
   the root of the hierarchy of packages.  (This isn't really a package, since it
   doesn't have an :file:`__init__.py` file.  But we have to call it something.)
   The vast majority of the standard library is in the root package, as are many
   small, standalone third-party modules that don't belong to a larger module
   collection. Unlike regular packages, modules in the root package can be found in
   many directories: in fact, every directory listed in ``sys.path`` contributes
   modules to the root package.


.. _distutils-term:

Distutils-specific terminology
==============================

The following terms apply more specifically to the domain of distributing Python
modules using the Distutils:

module distribution
   a collection of Python modules distributed together as a single downloadable
   resource and meant to be installed *en masse*.  Examples of some well-known
   module distributions are NumPy, SciPy, Pillow,
   or mxBase.  (This would be called a *package*, except that term is
   already taken in the Python context: a single module distribution may contain
   zero, one, or many Python packages.)

pure module distribution
   a module distribution that contains only pure Python modules and packages.
   Sometimes referred to as a "pure distribution."

non-pure module distribution
   a module distribution that contains at least one extension module.  Sometimes
   referred to as a "non-pure distribution."

distribution root
   the top-level directory of your source tree (or  source distribution); the
   directory where :file:`setup.py` exists.  Generally  :file:`setup.py` will be
   run from this directory.
PK�(�\I���Fdoc/alt-python37-setuptools/docs/deprecated/distutils/packageindex.rstnu�[���:orphan:

.. _package-index:

*******************************
The Python Package Index (PyPI)
*******************************

The `Python Package Index (PyPI)`_ stores metadata describing distributions
packaged with distutils and other publishing tools, as well the distribution
archives themselves.

References to up to date PyPI documentation can be found at
:ref:`publishing-python-packages`.

.. _Python Package Index (PyPI): https://pypi.org
PK�(�\�ׁ���Ddoc/alt-python37-setuptools/docs/deprecated/distutils/configfile.rstnu�[���.. _setup-config:

************************************
Writing the Setup Configuration File
************************************

.. include:: ./_setuptools_disclaimer.rst

Often, it's not possible to write down everything needed to build a distribution
*a priori*: you may need to get some information from the user, or from the
user's system, in order to proceed.  As long as that information is fairly
simple---a list of directories to search for C header files or libraries, for
example---then providing a configuration file, :file:`setup.cfg`, for users to
edit is a cheap and easy way to solicit it.  Configuration files also let you
provide default values for any command option, which the installer can then
override either on the command-line or by editing the config file.

The setup configuration file is a useful middle-ground between the setup
script---which, ideally, would be opaque to installers [#]_---and the command-line to
the setup script, which is outside of your control and entirely up to the
installer.  In fact, :file:`setup.cfg` (and any other Distutils configuration
files present on the target system) are processed after the contents of the
setup script, but before the command-line.  This has  several useful
consequences:

.. % (If you have more advanced needs, such as determining which extensions
.. % to build based on what capabilities are present on the target system,
.. % then you need the Distutils ``auto-configuration'' facility.  This
.. % started to appear in Distutils 0.9 but, as of this writing, isn't mature
.. % or stable enough yet for real-world use.)

* installers can override some of what you put in :file:`setup.py` by editing
  :file:`setup.cfg`

* you can provide non-standard defaults for options that are not easily set in
  :file:`setup.py`

* installers can override anything in :file:`setup.cfg` using the command-line
  options to :file:`setup.py`

The basic syntax of the configuration file is simple:

.. code-block:: ini

   [command]
   option=value
   ...

where *command* is one of the Distutils commands (e.g. :command:`build_py`,
:command:`install`), and *option* is one of the options that command supports.
Any number of options can be supplied for each command, and any number of
command sections can be included in the file.  Blank lines are ignored, as are
comments, which run from a ``'#'`` character until the end of the line.  Long
option values can be split across multiple lines simply by indenting the
continuation lines.

You can find out the list of options supported by a particular command with the
universal :option:`!--help` option, e.g.

.. code-block:: shell-session

   $ python setup.py --help build_ext
   [...]
   Options for 'build_ext' command:
     --build-lib (-b)     directory for compiled extension modules
     --build-temp (-t)    directory for temporary files (build by-products)
     --inplace (-i)       ignore build-lib and put compiled extensions into the
                          source directory alongside your pure Python modules
     --include-dirs (-I)  list of directories to search for header files
     --define (-D)        C preprocessor macros to define
     --undef (-U)         C preprocessor macros to undefine
     --swig-opts          list of SWIG command line options
   [...]

Note that an option spelled :option:`!--foo-bar` on the command-line  is spelled
``foo_bar`` in configuration files.

.. _distutils-build-ext-inplace:

For example, say you want your extensions to be built "in-place"---that is, you
have an extension ``pkg.ext``, and you want the compiled extension file
(:file:`ext.so` on Unix, say) to be put in the same source directory as your
pure Python modules ``pkg.mod1`` and ``pkg.mod2``.  You can always use the
:option:`!--inplace` option on the command-line to ensure this:

.. code-block:: sh

   python setup.py build_ext --inplace

But this requires that you always specify the :command:`build_ext` command
explicitly, and remember to provide :option:`!--inplace`. An easier way is to
"set and forget" this option, by encoding it in :file:`setup.cfg`, the
configuration file for this distribution:

.. code-block:: ini

   [build_ext]
   inplace=1

This will affect all builds of this module distribution, whether or not you
explicitly specify :command:`build_ext`.  If you include :file:`setup.cfg` in
your source distribution, it will also affect end-user builds---which is
probably a bad idea for this option, since always building extensions in-place
would break installation of the module distribution.  In certain peculiar cases,
though, modules are built right in their installation directory, so this is
conceivably a useful ability.  (Distributing extensions that expect to be built
in their installation directory is almost always a bad idea, though.)

Another example: certain commands take a lot of options that don't change from
run to run; for example, :command:`bdist_rpm` needs to know everything required
to generate a "spec" file for creating an RPM distribution.  Some of this
information comes from the setup script, and some is automatically generated by
the Distutils (such as the list of files installed).  But some of it has to be
supplied as options to :command:`bdist_rpm`, which would be very tedious to do
on the command-line for every run.  Hence, here is a snippet from the Distutils'
own :file:`setup.cfg`:

.. code-block:: ini

   [bdist_rpm]
   release = 1
   packager = Greg Ward <gward@python.net>
   doc_files = CHANGES.txt
               README.txt
               USAGE.txt
               doc/
               examples/

Note that the ``doc_files`` option is simply a whitespace-separated string
split across multiple lines for readability.


.. seealso::

   :ref:`inst-config-syntax` in "Installing Python Modules"
      More information on the configuration files is available in the manual for
      system administrators.


.. rubric:: Footnotes

.. [#] This ideal probably won't be achieved until auto-configuration is fully
   supported by the Distutils.

PK�(�\I��xzxz@doc/alt-python37-setuptools/docs/deprecated/distutils/apiref.rstnu�[���.. _api-reference:

*************
API Reference
*************

.. seealso::

   `New and changed setup.py arguments in setuptools`_
      The ``setuptools`` project adds new capabilities to the ``setup`` function
      and other APIs, makes the API consistent across different Python versions,
      and is hence recommended over using ``distutils`` directly.

.. _New and changed setup.py arguments in setuptools: https://setuptools.readthedocs.io/en/latest/setuptools.html#new-and-changed-setup-keywords

.. include:: ./_setuptools_disclaimer.rst

:mod:`distutils.core` --- Core Distutils functionality
======================================================

.. module:: distutils.core
   :synopsis: The core Distutils functionality


The :mod:`distutils.core` module is the only module that needs to be installed
to use the Distutils. It provides the :func:`setup` (which is called from the
setup script). Indirectly provides the  :class:`distutils.dist.Distribution` and
:class:`distutils.cmd.Command` class.


.. function:: setup(arguments)

   The basic do-everything function that does most everything you could ever ask
   for from a Distutils method.

   The setup function takes a large number of arguments. These are laid out in the
   following table.

   .. tabularcolumns:: |l|L|L|

   +--------------------+--------------------------------+-------------------------------------------------------------+
   | argument name      | value                          | type                                                        |
   +====================+================================+=============================================================+
   | *name*             | The name of the package        | a string                                                    |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *version*          | The version number of the      | a string                                                    |
   |                    | package; see                   |                                                             |
   |                    | :mod:`distutils.version`       |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *description*      | A single line describing the   | a string                                                    |
   |                    | package                        |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *long_description* | Longer description of the      | a string                                                    |
   |                    | package                        |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *author*           | The name of the package author | a string                                                    |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *author_email*     | The email address of the       | a string                                                    |
   |                    | package author                 |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *maintainer*       | The name of the current        | a string                                                    |
   |                    | maintainer, if different from  |                                                             |
   |                    | the author. Note that if       |                                                             |
   |                    | the maintainer is provided,    |                                                             |
   |                    | distutils will use it as the   |                                                             |
   |                    | author in :file:`PKG-INFO`     |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *maintainer_email* | The email address of the       | a string                                                    |
   |                    | current maintainer, if         |                                                             |
   |                    | different from the author      |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *url*              | A URL for the package          | a string                                                    |
   |                    | (homepage)                     |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *download_url*     | A URL to download the package  | a string                                                    |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *packages*         | A list of Python packages that | a list of strings                                           |
   |                    | distutils will manipulate      |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *py_modules*       | A list of Python modules that  | a list of strings                                           |
   |                    | distutils will manipulate      |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *scripts*          | A list of standalone script    | a list of strings                                           |
   |                    | files to be built and          |                                                             |
   |                    | installed                      |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *ext_modules*      | A list of Python extensions to | a list of instances of                                      |
   |                    | be built                       | :class:`distutils.core.Extension`                           |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *classifiers*      | A list of categories for the   | a list of strings; valid classifiers are listed on `PyPI    |
   |                    | package                        | <https://pypi.org/classifiers>`_.                           |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *distclass*        | the :class:`Distribution`      | a subclass of                                               |
   |                    | class to use                   | :class:`distutils.core.Distribution`                        |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *script_name*      | The name of the setup.py       | a string                                                    |
   |                    | script - defaults to           |                                                             |
   |                    | ``sys.argv[0]``                |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *script_args*      | Arguments to supply to the     | a list of strings                                           |
   |                    | setup script                   |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *options*          | default options for the setup  | a dictionary                                                |
   |                    | script                         |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *license*          | The license for the package    | a string                                                    |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *keywords*         | Descriptive meta-data, see     | a list of strings or a comma-separated string               |
   |                    | :pep:`314`                     |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *platforms*        |                                | a list of strings or a comma-separated string               |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *cmdclass*         | A mapping of command names to  | a dictionary                                                |
   |                    | :class:`Command` subclasses    |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *data_files*       | A list of data files to        | a list                                                      |
   |                    | install                        |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+
   | *package_dir*      | A mapping of package to        | a dictionary                                                |
   |                    | directory names                |                                                             |
   +--------------------+--------------------------------+-------------------------------------------------------------+



.. function:: run_setup(script_name[, script_args=None, stop_after='run'])

   Run a setup script in a somewhat controlled environment, and return  the
   :class:`distutils.dist.Distribution` instance that drives things.   This is
   useful if you need to find out the distribution meta-data  (passed as keyword
   args from *script* to :func:`setup`), or  the contents of the config files or
   command-line.

   *script_name* is a file that will be read and run with :func:`exec`.  ``sys.argv[0]``
   will be replaced with *script* for the duration of the call.  *script_args* is a
   list of strings; if supplied, ``sys.argv[1:]`` will be replaced by *script_args*
   for the duration  of the call.

   *stop_after* tells :func:`setup` when to stop processing; possible  values:

   .. tabularcolumns:: |l|L|

   +---------------+---------------------------------------------+
   | value         | description                                 |
   +===============+=============================================+
   | *init*        | Stop after the :class:`Distribution`        |
   |               | instance has been created  and populated    |
   |               | with the keyword arguments to :func:`setup` |
   +---------------+---------------------------------------------+
   | *config*      | Stop after config files have been parsed    |
   |               | (and their data stored in the               |
   |               | :class:`Distribution` instance)             |
   +---------------+---------------------------------------------+
   | *commandline* | Stop after the command-line                 |
   |               | (``sys.argv[1:]`` or  *script_args*) have   |
   |               | been parsed (and the data stored in the     |
   |               | :class:`Distribution` instance.)            |
   +---------------+---------------------------------------------+
   | *run*         | Stop after all commands have been run (the  |
   |               | same as  if :func:`setup` had been called   |
   |               | in the usual way). This is the default      |
   |               | value.                                      |
   +---------------+---------------------------------------------+

In addition, the :mod:`distutils.core` module exposed a number of  classes that
live elsewhere.

* :class:`~distutils.extension.Extension` from :mod:`distutils.extension`

* :class:`~distutils.cmd.Command` from :mod:`distutils.cmd`

* :class:`~distutils.dist.Distribution` from :mod:`distutils.dist`

A short description of each of these follows, but see the relevant module for
the full reference.


.. class:: Extension

   The Extension class describes a single C or C++ extension module in a setup
   script. It accepts the following keyword arguments in its constructor:

   .. tabularcolumns:: |l|L|l|

   +------------------------+--------------------------------+---------------------------+
   | argument name          | value                          | type                      |
   +========================+================================+===========================+
   | *name*                 | the full name of the           | a string                  |
   |                        | extension, including any       |                           |
   |                        | packages --- ie. *not* a       |                           |
   |                        | filename or pathname, but      |                           |
   |                        | Python dotted name             |                           |
   +------------------------+--------------------------------+---------------------------+
   | *sources*              | list of source filenames,      | a list of strings         |
   |                        | relative to the distribution   |                           |
   |                        | root (where the setup script   |                           |
   |                        | lives), in Unix form           |                           |
   |                        | (slash-separated) for          |                           |
   |                        | portability.                   |                           |
   |                        | Source files may be C, C++,    |                           |
   |                        | SWIG (.i), platform-specific   |                           |
   |                        | resource files, or whatever    |                           |
   |                        | else is recognized by the      |                           |
   |                        | :command:`build_ext` command   |                           |
   |                        | as source for a Python         |                           |
   |                        | extension.                     |                           |
   +------------------------+--------------------------------+---------------------------+
   | *include_dirs*         | list of directories to search  | a list of strings         |
   |                        | for C/C++ header files (in     |                           |
   |                        | Unix form for portability)     |                           |
   +------------------------+--------------------------------+---------------------------+
   | *define_macros*        | list of macros to define; each | a list of tuples          |
   |                        | macro is defined using a       |                           |
   |                        | 2-tuple ``(name, value)``,     |                           |
   |                        | where *value* is               |                           |
   |                        | either the string to define it |                           |
   |                        | to or ``None`` to define it    |                           |
   |                        | without a particular value     |                           |
   |                        | (equivalent of ``#define FOO`` |                           |
   |                        | in source or :option:`!-DFOO`  |                           |
   |                        | on Unix C compiler command     |                           |
   |                        | line)                          |                           |
   +------------------------+--------------------------------+---------------------------+
   | *undef_macros*         | list of macros to undefine     | a list of strings         |
   |                        | explicitly                     |                           |
   +------------------------+--------------------------------+---------------------------+
   | *library_dirs*         | list of directories to search  | a list of strings         |
   |                        | for C/C++ libraries at link    |                           |
   |                        | time                           |                           |
   +------------------------+--------------------------------+---------------------------+
   | *libraries*            | list of library names (not     | a list of strings         |
   |                        | filenames or paths) to link    |                           |
   |                        | against                        |                           |
   +------------------------+--------------------------------+---------------------------+
   | *runtime_library_dirs* | list of directories to search  | a list of strings         |
   |                        | for C/C++ libraries at run     |                           |
   |                        | time (for shared extensions,   |                           |
   |                        | this is when the extension is  |                           |
   |                        | loaded)                        |                           |
   +------------------------+--------------------------------+---------------------------+
   | *extra_objects*        | list of extra files to link    | a list of strings         |
   |                        | with (eg. object files not     |                           |
   |                        | implied by 'sources', static   |                           |
   |                        | library that must be           |                           |
   |                        | explicitly specified, binary   |                           |
   |                        | resource files, etc.)          |                           |
   +------------------------+--------------------------------+---------------------------+
   | *extra_compile_args*   | any extra platform- and        | a list of strings         |
   |                        | compiler-specific information  |                           |
   |                        | to use when compiling the      |                           |
   |                        | source files in 'sources'. For |                           |
   |                        | platforms and compilers where  |                           |
   |                        | a command line makes sense,    |                           |
   |                        | this is typically a list of    |                           |
   |                        | command-line arguments, but    |                           |
   |                        | for other platforms it could   |                           |
   |                        | be anything.                   |                           |
   +------------------------+--------------------------------+---------------------------+
   | *extra_link_args*      | any extra platform- and        | a list of strings         |
   |                        | compiler-specific information  |                           |
   |                        | to use when linking object     |                           |
   |                        | files together to create the   |                           |
   |                        | extension (or to create a new  |                           |
   |                        | static Python interpreter).    |                           |
   |                        | Similar interpretation as for  |                           |
   |                        | 'extra_compile_args'.          |                           |
   +------------------------+--------------------------------+---------------------------+
   | *export_symbols*       | list of symbols to be exported | a list of strings         |
   |                        | from a shared extension. Not   |                           |
   |                        | used on all platforms, and not |                           |
   |                        | generally necessary for Python |                           |
   |                        | extensions, which typically    |                           |
   |                        | export exactly one symbol:     |                           |
   |                        | ``init`` + extension_name.     |                           |
   +------------------------+--------------------------------+---------------------------+
   | *depends*              | list of files that the         | a list of strings         |
   |                        | extension depends on           |                           |
   +------------------------+--------------------------------+---------------------------+
   | *language*             | extension language (i.e.       | a string                  |
   |                        | ``'c'``, ``'c++'``,            |                           |
   |                        | ``'objc'``). Will be detected  |                           |
   |                        | from the source extensions if  |                           |
   |                        | not provided.                  |                           |
   +------------------------+--------------------------------+---------------------------+
   | *optional*             | specifies that a build failure | a boolean                 |
   |                        | in the extension should not    |                           |
   |                        | abort the build process, but   |                           |
   |                        | simply skip the extension.     |                           |
   +------------------------+--------------------------------+---------------------------+

   .. versionchanged:: 3.8

      On Unix, C extensions are no longer linked to libpython except on
      Android and Cygwin.


.. class:: Distribution

   A :class:`Distribution` describes how to build, install and package up a Python
   software package.

   See the :func:`setup` function for a list of keyword arguments accepted  by the
   Distribution constructor. :func:`setup` creates a Distribution instance.

   .. versionchanged:: 3.7
      :class:`~distutils.core.Distribution` now warns if ``classifiers``,
      ``keywords`` and ``platforms`` fields are not specified as a list or
      a string.

.. class:: Command

   A :class:`Command` class (or rather, an instance of one of its subclasses)
   implement a single distutils command.


:mod:`distutils.ccompiler` --- CCompiler base class
===================================================

.. module:: distutils.ccompiler
   :synopsis: Abstract CCompiler class


This module provides the abstract base class for the :class:`CCompiler`
classes.  A :class:`CCompiler` instance can be used for all the compile  and
link steps needed to build a single project. Methods are provided to  set
options for the compiler --- macro definitions, include directories,  link path,
libraries and the like.

This module provides the following functions.


.. function:: gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries)

   Generate linker options for searching library directories and linking with
   specific libraries.  *libraries* and *library_dirs* are, respectively, lists of
   library names (not filenames!) and search directories.  Returns a list of
   command-line options suitable for use with some compiler (depending on the two
   format strings passed in).


.. function:: gen_preprocess_options(macros, include_dirs)

   Generate C pre-processor options (:option:`!-D`, :option:`!-U`, :option:`!-I`) as
   used by at least two types of compilers: the typical Unix compiler and Visual
   C++. *macros* is the usual thing, a list of 1- or 2-tuples, where ``(name,)``
   means undefine (:option:`!-U`) macro *name*, and ``(name, value)`` means define
   (:option:`!-D`) macro *name* to *value*.  *include_dirs* is just a list of
   directory names to be added to the header file search path (:option:`!-I`).
   Returns a list of command-line options suitable for either Unix compilers or
   Visual C++.


.. function:: get_default_compiler(osname, platform)

   Determine the default compiler to use for the given platform.

   *osname* should be one of the standard Python OS names (i.e. the ones returned
   by ``os.name``) and *platform* the common value returned by ``sys.platform`` for
   the platform in question.

   The default values are ``os.name`` and ``sys.platform`` in case the parameters
   are not given.


.. function:: new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0)

   Factory function to generate an instance of some CCompiler subclass for the
   supplied platform/compiler combination. *plat* defaults to ``os.name`` (eg.
   ``'posix'``, ``'nt'``), and *compiler*  defaults to the default compiler for
   that platform. Currently only ``'posix'`` and ``'nt'`` are supported, and the
   default compilers are "traditional Unix interface" (:class:`UnixCCompiler`
   class) and Visual C++ (:class:`MSVCCompiler` class).  Note that it's perfectly
   possible to ask for a Unix compiler object under Windows, and a Microsoft
   compiler object under Unix---if you supply a value for *compiler*, *plat* is
   ignored.

   .. % Is the posix/nt only thing still true? Mac OS X seems to work, and
   .. % returns a UnixCCompiler instance. How to document this... hmm.


.. function:: show_compilers()

   Print list of available compilers (used by the :option:`!--help-compiler` options
   to :command:`build`, :command:`build_ext`, :command:`build_clib`).


.. class:: CCompiler([verbose=0, dry_run=0, force=0])

   The abstract base class :class:`CCompiler` defines the interface that  must be
   implemented by real compiler classes.  The class also has  some utility methods
   used by several compiler classes.

   The basic idea behind a compiler abstraction class is that each instance can be
   used for all the compile/link steps in building a single project.  Thus,
   attributes common to all of those compile and link steps --- include
   directories, macros to define, libraries to link against, etc. --- are
   attributes of the compiler instance.  To allow for variability in how individual
   files are treated, most of those attributes may be varied on a per-compilation
   or per-link basis.

   The constructor for each subclass creates an instance of the Compiler object.
   Flags are *verbose* (show verbose output), *dry_run* (don't actually execute the
   steps) and *force* (rebuild everything, regardless of dependencies). All of
   these flags default to ``0`` (off). Note that you probably don't want to
   instantiate :class:`CCompiler` or one of its subclasses directly - use the
   :func:`distutils.CCompiler.new_compiler` factory function instead.

   The following methods allow you to manually alter compiler options for  the
   instance of the Compiler class.


   .. method:: CCompiler.add_include_dir(dir)

      Add *dir* to the list of directories that will be searched for header files.
      The compiler is instructed to search directories in the order in which they are
      supplied by successive calls to :meth:`add_include_dir`.


   .. method:: CCompiler.set_include_dirs(dirs)

      Set the list of directories that will be searched to *dirs* (a list of strings).
      Overrides any preceding calls to :meth:`add_include_dir`; subsequent calls to
      :meth:`add_include_dir` add to the list passed to :meth:`set_include_dirs`.
      This does not affect any list of standard include directories that the compiler
      may search by default.


   .. method:: CCompiler.add_library(libname)

      Add *libname* to the list of libraries that will be included in all links driven
      by this compiler object.  Note that *libname* should \*not\* be the name of a
      file containing a library, but the name of the library itself: the actual
      filename will be inferred by the linker, the compiler, or the compiler class
      (depending on the platform).

      The linker will be instructed to link against libraries in the order they were
      supplied to :meth:`add_library` and/or :meth:`set_libraries`.  It is perfectly
      valid to duplicate library names; the linker will be instructed to link against
      libraries as many times as they are mentioned.


   .. method:: CCompiler.set_libraries(libnames)

      Set the list of libraries to be included in all links driven by this compiler
      object to *libnames* (a list of strings).  This does not affect any standard
      system libraries that the linker may include by default.


   .. method:: CCompiler.add_library_dir(dir)

      Add *dir* to the list of directories that will be searched for libraries
      specified to :meth:`add_library` and :meth:`set_libraries`.  The linker will be
      instructed to search for libraries in the order they are supplied to
      :meth:`add_library_dir` and/or :meth:`set_library_dirs`.


   .. method:: CCompiler.set_library_dirs(dirs)

      Set the list of library search directories to *dirs* (a list of strings).  This
      does not affect any standard library search path that the linker may search by
      default.


   .. method:: CCompiler.add_runtime_library_dir(dir)

      Add *dir* to the list of directories that will be searched for shared libraries
      at runtime.


   .. method:: CCompiler.set_runtime_library_dirs(dirs)

      Set the list of directories to search for shared libraries at runtime to *dirs*
      (a list of strings).  This does not affect any standard search path that the
      runtime linker may search by default.


   .. method:: CCompiler.define_macro(name[, value=None])

      Define a preprocessor macro for all compilations driven by this compiler object.
      The optional parameter *value* should be a string; if it is not supplied, then
      the macro will be defined without an explicit value and the exact outcome
      depends on the compiler used.

      .. XXX true? does ANSI say anything about this?


   .. method:: CCompiler.undefine_macro(name)

      Undefine a preprocessor macro for all compilations driven by this compiler
      object.  If the same macro is defined by :meth:`define_macro` and
      undefined by :meth:`undefine_macro` the last call takes precedence
      (including multiple redefinitions or undefinitions).  If the macro is
      redefined/undefined on a per-compilation basis (ie. in the call to
      :meth:`compile`), then that takes precedence.


   .. method:: CCompiler.add_link_object(object)

      Add *object* to the list of object files (or analogues, such as explicitly named
      library files or the output of "resource compilers") to be included in every
      link driven by this compiler object.


   .. method:: CCompiler.set_link_objects(objects)

      Set the list of object files (or analogues) to be included in every link to
      *objects*.  This does not affect any standard object files that the linker may
      include by default (such as system libraries).

   The following methods implement methods for autodetection of compiler  options,
   providing some functionality similar to GNU :program:`autoconf`.


   .. method:: CCompiler.detect_language(sources)

      Detect the language of a given file, or list of files. Uses the  instance
      attributes :attr:`~CCompiler.language_map` (a dictionary), and  :attr:`~CCompiler.language_order` (a
      list) to do the job.


   .. method:: CCompiler.find_library_file(dirs, lib[, debug=0])

      Search the specified list of directories for a static or shared library file
      *lib* and return the full path to that file.  If *debug* is true, look for a
      debugging version (if that makes sense on the current platform).  Return
      ``None`` if *lib* wasn't found in any of the specified directories.


   .. method:: CCompiler.has_function(funcname [, includes=None, include_dirs=None, libraries=None, library_dirs=None])

      Return a boolean indicating whether *funcname* is supported on the current
      platform.  The optional arguments can be used to augment the compilation
      environment by providing additional include files and paths and libraries and
      paths.


   .. method:: CCompiler.library_dir_option(dir)

      Return the compiler option to add *dir* to the list of directories searched for
      libraries.


   .. method:: CCompiler.library_option(lib)

      Return the compiler option to add *lib* to the list of libraries linked into the
      shared library or executable.


   .. method:: CCompiler.runtime_library_dir_option(dir)

      Return the compiler option to add *dir* to the list of directories searched for
      runtime libraries.


   .. method:: CCompiler.set_executables(**args)

      Define the executables (and options for them) that will be run to perform the
      various stages of compilation.  The exact set of executables that may be
      specified here depends on the compiler class (via the 'executables' class
      attribute), but most will have:

      +--------------+------------------------------------------+
      | attribute    | description                              |
      +==============+==========================================+
      | *compiler*   | the C/C++ compiler                       |
      +--------------+------------------------------------------+
      | *linker_so*  | linker used to create shared objects and |
      |              | libraries                                |
      +--------------+------------------------------------------+
      | *linker_exe* | linker used to create binary executables |
      +--------------+------------------------------------------+
      | *archiver*   | static library creator                   |
      +--------------+------------------------------------------+

      On platforms with a command-line (Unix, DOS/Windows), each of these is a string
      that will be split into executable name and (optional) list of arguments.
      (Splitting the string is done similarly to how Unix shells operate: words are
      delimited by spaces, but quotes and backslashes can override this.  See
      :func:`distutils.util.split_quoted`.)

   The following methods invoke stages in the build process.


   .. method:: CCompiler.compile(sources[, output_dir=None, macros=None, include_dirs=None, debug=0, extra_preargs=None, extra_postargs=None, depends=None])

      Compile one or more source files. Generates object files (e.g.  transforms a
      :file:`.c` file to a :file:`.o` file.)

      *sources* must be a list of filenames, most likely C/C++ files, but in reality
      anything that can be handled by a particular compiler and compiler class (eg.
      :class:`MSVCCompiler` can handle resource files in *sources*).  Return a list of
      object filenames, one per source filename in *sources*.  Depending on the
      implementation, not all source files will necessarily be compiled, but all
      corresponding object filenames will be returned.

      If *output_dir* is given, object files will be put under it, while retaining
      their original path component.  That is, :file:`foo/bar.c` normally compiles to
      :file:`foo/bar.o` (for a Unix implementation); if *output_dir* is *build*, then
      it would compile to :file:`build/foo/bar.o`.

      *macros*, if given, must be a list of macro definitions.  A macro definition is
      either a ``(name, value)`` 2-tuple or a ``(name,)`` 1-tuple. The former defines
      a macro; if the value is ``None``, the macro is defined without an explicit
      value.  The 1-tuple case undefines a macro.  Later
      definitions/redefinitions/undefinitions take precedence.

      *include_dirs*, if given, must be a list of strings, the directories to add to
      the default include file search path for this compilation only.

      *debug* is a boolean; if true, the compiler will be instructed to output debug
      symbols in (or alongside) the object file(s).

      *extra_preargs* and *extra_postargs* are implementation-dependent. On platforms
      that have the notion of a command-line (e.g. Unix, DOS/Windows), they are most
      likely lists of strings: extra command-line arguments to prepend/append to the
      compiler command line.  On other platforms, consult the implementation class
      documentation.  In any event, they are intended as an escape hatch for those
      occasions when the abstract compiler framework doesn't cut the mustard.

      *depends*, if given, is a list of filenames that all targets depend on.  If a
      source file is older than any file in depends, then the source file will be
      recompiled.  This supports dependency tracking, but only at a coarse
      granularity.

      Raises :exc:`CompileError` on failure.


   .. method:: CCompiler.create_static_lib(objects, output_libname[, output_dir=None, debug=0, target_lang=None])

      Link a bunch of stuff together to create a static library file. The "bunch of
      stuff" consists of the list of object files supplied as *objects*, the extra
      object files supplied to :meth:`add_link_object` and/or
      :meth:`set_link_objects`, the libraries supplied to :meth:`add_library` and/or
      :meth:`set_libraries`, and the libraries supplied as *libraries* (if any).

      *output_libname* should be a library name, not a filename; the filename will be
      inferred from the library name.  *output_dir* is the directory where the library
      file will be put.

      .. XXX defaults to what?

      *debug* is a boolean; if true, debugging information will be included in the
      library (note that on most platforms, it is the compile step where this matters:
      the *debug* flag is included here just for consistency).

      *target_lang* is the target language for which the given objects are being
      compiled. This allows specific linkage time treatment of certain languages.

      Raises :exc:`LibError` on failure.


   .. method:: CCompiler.link(target_desc, objects, output_filename[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None])

      Link a bunch of stuff together to create an executable or shared library file.

      The "bunch of stuff" consists of the list of object files supplied as *objects*.
      *output_filename* should be a filename.  If *output_dir* is supplied,
      *output_filename* is relative to it (i.e. *output_filename* can provide
      directory components if needed).

      *libraries* is a list of libraries to link against.  These are library names,
      not filenames, since they're translated into filenames in a platform-specific
      way (eg. *foo* becomes :file:`libfoo.a` on Unix and :file:`foo.lib` on
      DOS/Windows).  However, they can include a directory component, which means the
      linker will look in that specific directory rather than searching all the normal
      locations.

      *library_dirs*, if supplied, should be a list of directories to search for
      libraries that were specified as bare library names (ie. no directory
      component).  These are on top of the system default and those supplied to
      :meth:`add_library_dir` and/or :meth:`set_library_dirs`.  *runtime_library_dirs*
      is a list of directories that will be embedded into the shared library and used
      to search for other shared libraries that \*it\* depends on at run-time.  (This
      may only be relevant on Unix.)

      *export_symbols* is a list of symbols that the shared library will export.
      (This appears to be relevant only on Windows.)

      *debug* is as for :meth:`compile` and :meth:`create_static_lib`,  with the
      slight distinction that it actually matters on most platforms (as opposed to
      :meth:`create_static_lib`, which includes a *debug* flag mostly for form's
      sake).

      *extra_preargs* and *extra_postargs* are as for :meth:`compile`  (except of
      course that they supply command-line arguments for the particular linker being
      used).

      *target_lang* is the target language for which the given objects are being
      compiled. This allows specific linkage time treatment of certain languages.

      Raises :exc:`LinkError` on failure.


   .. method:: CCompiler.link_executable(objects, output_progname[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, debug=0, extra_preargs=None, extra_postargs=None, target_lang=None])

      Link an executable.  *output_progname* is the name of the file executable, while
      *objects* are a list of object filenames to link in. Other arguments  are as for
      the :meth:`link` method.


   .. method:: CCompiler.link_shared_lib(objects, output_libname[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None])

      Link a shared library. *output_libname* is the name of the output  library,
      while *objects* is a list of object filenames to link in.  Other arguments are
      as for the :meth:`link` method.


   .. method:: CCompiler.link_shared_object(objects, output_filename[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None])

      Link a shared object. *output_filename* is the name of the shared object that
      will be created, while *objects* is a list of object filenames  to link in.
      Other arguments are as for the :meth:`link` method.


   .. method:: CCompiler.preprocess(source[, output_file=None, macros=None, include_dirs=None, extra_preargs=None, extra_postargs=None])

      Preprocess a single C/C++ source file, named in *source*. Output will be written
      to file named *output_file*, or *stdout* if *output_file* not supplied.
      *macros* is a list of macro definitions as for :meth:`compile`, which will
      augment the macros set with :meth:`define_macro` and :meth:`undefine_macro`.
      *include_dirs* is a list of directory names that will be added to the  default
      list, in the same way as :meth:`add_include_dir`.

      Raises :exc:`PreprocessError` on failure.

   The following utility methods are defined by the :class:`CCompiler` class, for
   use by the various concrete subclasses.


   .. method:: CCompiler.executable_filename(basename[, strip_dir=0, output_dir=''])

      Returns the filename of the executable for the given *basename*.  Typically for
      non-Windows platforms this is the same as the basename,  while Windows will get
      a :file:`.exe` added.


   .. method:: CCompiler.library_filename(libname[, lib_type='static', strip_dir=0, output_dir=''])

      Returns the filename for the given library name on the current platform. On Unix
      a library with *lib_type* of ``'static'`` will typically  be of the form
      :file:`liblibname.a`, while a *lib_type* of ``'dynamic'``  will be of the form
      :file:`liblibname.so`.


   .. method:: CCompiler.object_filenames(source_filenames[, strip_dir=0, output_dir=''])

      Returns the name of the object files for the given source files.
      *source_filenames* should be a list of filenames.


   .. method:: CCompiler.shared_object_filename(basename[, strip_dir=0, output_dir=''])

      Returns the name of a shared object file for the given file name *basename*.


   .. method:: CCompiler.execute(func, args[, msg=None, level=1])

      Invokes :func:`distutils.util.execute`. This method invokes a  Python function
      *func* with the given arguments *args*, after  logging and taking into account
      the *dry_run* flag.


   .. method:: CCompiler.spawn(cmd)

      Invokes :func:`distutils.spawn.spawn`. This invokes an external  process to run
      the given command.


   .. method:: CCompiler.mkpath(name[, mode=511])

      Invokes :func:`distutils.dir_util.mkpath`. This creates a directory  and any
      missing ancestor directories.


   .. method:: CCompiler.move_file(src, dst)

      Invokes :meth:`distutils.file_util.move_file`. Renames *src* to  *dst*.


   .. method:: CCompiler.announce(msg[, level=1])

      Write a message using :func:`distutils.log.debug`.


   .. method:: CCompiler.warn(msg)

      Write a warning message *msg* to standard error.


   .. method:: CCompiler.debug_print(msg)

      If the *debug* flag is set on this :class:`CCompiler` instance, print  *msg* to
      standard output, otherwise do nothing.

.. % \subsection{Compiler-specific modules}
.. %
.. % The following modules implement concrete subclasses of the abstract
.. % \class{CCompiler} class. They should not be instantiated directly, but should
.. % be created using \function{distutils.ccompiler.new_compiler()} factory
.. % function.


:mod:`distutils.unixccompiler` --- Unix C Compiler
==================================================

.. module:: distutils.unixccompiler
   :synopsis: UNIX C Compiler


This module provides the :class:`UnixCCompiler` class, a subclass of
:class:`CCompiler` that handles the typical Unix-style command-line  C compiler:

* macros defined with :option:`!-Dname[=value]`

* macros undefined with :option:`!-Uname`

* include search directories specified with :option:`!-Idir`

* libraries specified with :option:`!-llib`

* library search directories specified with :option:`!-Ldir`

* compile handled by :program:`cc` (or similar) executable with :option:`!-c`
  option: compiles :file:`.c` to :file:`.o`

* link static library handled by :program:`ar` command (possibly with
  :program:`ranlib`)

* link shared library handled by :program:`cc` :option:`!-shared`


:mod:`distutils.msvccompiler` --- Microsoft Compiler
====================================================

.. module:: distutils.msvccompiler
   :synopsis: Microsoft Compiler

.. XXX: This is *waaaaay* out of date!

This module provides :class:`MSVCCompiler`, an implementation of the abstract
:class:`CCompiler` class for Microsoft Visual Studio. Typically, extension
modules need to be compiled with the same compiler that was used to compile
Python. For Python 2.3 and earlier, the compiler was Visual Studio 6. For Python
2.4 and 2.5, the compiler is Visual Studio .NET 2003.

:class:`MSVCCompiler` will normally choose the right compiler, linker etc. on
its own. To override this choice, the environment variables *DISTUTILS_USE_SDK*
and *MSSdk* must be both set. *MSSdk* indicates that the current environment has
been setup by the SDK's ``SetEnv.Cmd`` script, or that the environment variables
had been registered when the SDK was installed; *DISTUTILS_USE_SDK* indicates
that the distutils user has made an explicit choice to override the compiler
selection by :class:`MSVCCompiler`.


:mod:`distutils.bcppcompiler` --- Borland Compiler
==================================================

.. module:: distutils.bcppcompiler


This module provides :class:`BorlandCCompiler`, a subclass of the abstract
:class:`CCompiler` class for the Borland C++ compiler.


:mod:`distutils.cygwinccompiler` --- Cygwin Compiler
====================================================

.. module:: distutils.cygwinccompiler


This module provides the :class:`CygwinCCompiler` class, a subclass of
:class:`UnixCCompiler` that handles the Cygwin port of the GNU C compiler to
Windows.  It also contains the Mingw32CCompiler class which handles the mingw32
port of GCC (same as cygwin in no-cygwin mode).


:mod:`distutils.archive_util` ---  Archiving utilities
======================================================

.. module:: distutils.archive_util
   :synopsis: Utility functions for creating archive files (tarballs, zip files, ...)


This module provides a few functions for creating archive files, such as
tarballs or zipfiles.


.. function:: make_archive(base_name, format[, root_dir=None, base_dir=None, verbose=0, dry_run=0])

   Create an archive file (eg. ``zip`` or ``tar``).  *base_name*  is the name of
   the file to create, minus any format-specific extension;  *format* is the
   archive format: one of ``zip``, ``tar``, ``gztar``, ``bztar``, ``xztar``, or
   ``ztar``. *root_dir* is a directory that will be the root directory of the
   archive; ie. we typically ``chdir`` into *root_dir* before  creating the
   archive.  *base_dir* is the directory where we start  archiving from; ie.
   *base_dir* will be the common prefix of all files and directories in the
   archive.  *root_dir* and *base_dir* both default to the current directory.
   Returns the name of the archive file.

   .. versionchanged:: 3.5
      Added support for the ``xztar`` format.


.. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=0, dry_run=0])

   'Create an (optional compressed) archive as a tar file from all files in and
   under *base_dir*. *compress* must be ``'gzip'`` (the default),
   ``'bzip2'``, ``'xz'``, ``'compress'``, or ``None``.  For the ``'compress'``
   method the compression utility named by :program:`compress` must be on the
   default program search path, so this is probably Unix-specific.  The output
   tar file will be named :file:`base_dir.tar`, possibly plus the appropriate
   compression extension (``.gz``, ``.bz2``, ``.xz`` or ``.Z``).  Return the
   output filename.

   .. versionchanged:: 3.5
      Added support for the ``xz`` compression.


.. function:: make_zipfile(base_name, base_dir[, verbose=0, dry_run=0])

   Create a zip file from all files in and under *base_dir*.  The output zip file
   will be named *base_name* + :file:`.zip`.  Uses either the  :mod:`zipfile` Python
   module (if available) or the InfoZIP :file:`zip`  utility (if installed and
   found on the default search path).  If neither  tool is available, raises
   :exc:`DistutilsExecError`.   Returns the name of the output zip file.


:mod:`distutils.dep_util` --- Dependency checking
=================================================

.. module:: distutils.dep_util
   :synopsis: Utility functions for simple dependency checking


This module provides functions for performing simple, timestamp-based
dependency of files and groups of files; also, functions based entirely  on such
timestamp dependency analysis.


.. function:: newer(source, target)

   Return true if *source* exists and is more recently modified than *target*, or
   if *source* exists and *target* doesn't. Return false if both exist and *target*
   is the same age or newer  than *source*. Raise :exc:`DistutilsFileError` if
   *source* does not exist.


.. function:: newer_pairwise(sources, targets)

   Walk two filename lists in parallel, testing if each source is newer than its
   corresponding target.  Return a pair of lists (*sources*, *targets*) where
   source is newer than target, according to the semantics of :func:`newer`.

   .. % % equivalent to a listcomp...


.. function:: newer_group(sources, target[, missing='error'])

   Return true if *target* is out-of-date with respect to any file listed in
   *sources*.  In other words, if *target* exists and is newer than every file in
   *sources*, return false; otherwise return true. *missing* controls what we do
   when a source file is missing; the default (``'error'``) is to blow up with an
   :exc:`OSError` from  inside :func:`os.stat`; if it is ``'ignore'``, we silently
   drop any missing source files; if it is ``'newer'``, any missing source files
   make us assume that *target* is out-of-date (this is handy in "dry-run" mode:
   it'll make you pretend to carry out commands that wouldn't work because inputs
   are missing, but that doesn't matter because you're not actually going to run
   the commands).


:mod:`distutils.dir_util` --- Directory tree operations
=======================================================

.. module:: distutils.dir_util
   :synopsis: Utility functions for operating on directories and directory trees


This module provides functions for operating on directories and trees of
directories.


.. function:: mkpath(name[, mode=0o777, verbose=0, dry_run=0])

   Create a directory and any missing ancestor directories.  If the directory
   already exists (or if *name* is the empty string, which means the current
   directory, which of course exists), then do nothing.  Raise
   :exc:`DistutilsFileError` if unable to create some directory along the way (eg.
   some sub-path exists, but is a file rather than a directory).  If *verbose* is
   true, print a one-line summary of each mkdir to stdout.  Return the list of
   directories actually created.


.. function:: create_tree(base_dir, files[, mode=0o777, verbose=0, dry_run=0])

   Create all the empty directories under *base_dir* needed to put *files* there.
   *base_dir* is just the name of a directory which doesn't necessarily exist
   yet; *files* is a list of filenames to be interpreted relative to *base_dir*.
   *base_dir* + the directory portion of every file in *files* will be created if
   it doesn't already exist.  *mode*, *verbose* and *dry_run* flags  are as for
   :func:`mkpath`.


.. function:: copy_tree(src, dst[, preserve_mode=1, preserve_times=1, preserve_symlinks=0, update=0, verbose=0, dry_run=0])

   Copy an entire directory tree *src* to a new location *dst*.  Both *src* and
   *dst* must be directory names.  If *src* is not a directory, raise
   :exc:`DistutilsFileError`.  If *dst* does  not exist, it is created with
   :func:`mkpath`.  The end result of the  copy is that every file in *src* is
   copied to *dst*, and  directories under *src* are recursively copied to *dst*.
   Return the list of files that were copied or might have been copied, using their
   output name. The return value is unaffected by *update* or *dry_run*: it is
   simply the list of all files under *src*, with the names changed to be under
   *dst*.

   *preserve_mode* and *preserve_times* are the same as for
   :func:`distutils.file_util.copy_file`; note that they only apply to
   regular files, not to
   directories.  If *preserve_symlinks* is true, symlinks will be copied as
   symlinks (on platforms that support them!); otherwise (the default), the
   destination of the symlink will be copied.  *update* and *verbose* are the same
   as for :func:`~distutils.file_util.copy_file`.

   Files in *src* that begin with :file:`.nfs` are skipped (more information on
   these files is available in answer D2 of the `NFS FAQ page
   <http://nfs.sourceforge.net/#section_d>`_).

   .. versionchanged:: 3.3.1
      NFS files are ignored.

.. function:: remove_tree(directory[, verbose=0, dry_run=0])

   Recursively remove *directory* and all files and directories underneath it. Any
   errors are ignored (apart from being reported to ``sys.stdout`` if *verbose* is
   true).


:mod:`distutils.file_util` --- Single file operations
=====================================================

.. module:: distutils.file_util
   :synopsis: Utility functions for operating on single files


This module contains some utility functions for operating on individual files.


.. function:: copy_file(src, dst[, preserve_mode=1, preserve_times=1, update=0, link=None, verbose=0, dry_run=0])

   Copy file *src* to *dst*. If *dst* is a directory, then *src* is copied there
   with the same name; otherwise, it must be a filename. (If the file exists, it
   will be ruthlessly clobbered.) If *preserve_mode* is true (the default), the
   file's mode (type and permission bits, or whatever is analogous on the
   current platform) is copied. If *preserve_times* is true (the default), the
   last-modified and last-access times are copied as well. If *update* is true,
   *src* will only be copied if *dst* does not exist, or if *dst* does exist but
   is older than *src*.

   *link* allows you to make hard links (using :func:`os.link`) or symbolic links
   (using :func:`os.symlink`) instead of copying: set it to ``'hard'`` or
   ``'sym'``; if it is ``None`` (the default), files are copied. Don't set *link*
   on systems that don't support it: :func:`copy_file` doesn't check if hard or
   symbolic linking is available.  It uses :func:`~distutils.file_util._copy_file_contents` to copy file
   contents.

   Return a tuple ``(dest_name, copied)``: *dest_name* is the actual  name of the
   output file, and *copied* is true if the file was copied  (or would have been
   copied, if *dry_run* true).

   .. % XXX if the destination file already exists, we clobber it if
   .. % copying, but blow up if linking.  Hmmm.  And I don't know what
   .. % macostools.copyfile() does.  Should definitely be consistent, and
   .. % should probably blow up if destination exists and we would be
   .. % changing it (ie. it's not already a hard/soft link to src OR
   .. % (not update) and (src newer than dst)).


.. function:: move_file(src, dst[, verbose, dry_run])

   Move file *src* to *dst*. If *dst* is a directory, the file will be moved into
   it with the same name; otherwise, *src* is just renamed to *dst*.  Returns the
   new full name of the file.

   .. warning::

      Handles cross-device moves on Unix using :func:`copy_file`.  What about
      other systems?


.. function:: write_file(filename, contents)

   Create a file called *filename* and write *contents* (a sequence of strings
   without line terminators) to it.


:mod:`distutils.util` --- Miscellaneous other utility functions
===============================================================

.. module:: distutils.util
   :synopsis: Miscellaneous other utility functions


This module contains other assorted bits and pieces that don't fit into  any
other utility module.


.. function:: get_platform()

   Return a string that identifies the current platform.  This is used mainly to
   distinguish platform-specific build directories and platform-specific built
   distributions.  Typically includes the OS name and version and the
   architecture (as supplied by 'os.uname()'), although the exact information
   included depends on the OS; e.g., on Linux, the kernel version isn't
   particularly important.

   Examples of returned values:

   * ``linux-i586``
   * ``linux-alpha``
   * ``solaris-2.6-sun4u``

   For non-POSIX platforms, currently just returns ``sys.platform``.

   For Mac OS X systems the OS version reflects the minimal version on which
   binaries will run (that is, the value of ``MACOSX_DEPLOYMENT_TARGET``
   during the build of Python), not the OS version of the current system.

   For universal binary builds on Mac OS X the architecture value reflects
   the universal binary status instead of the architecture of the current
   processor. For 32-bit universal binaries the architecture is ``fat``,
   for 64-bit universal binaries the architecture is ``fat64``, and
   for 4-way universal binaries the architecture is ``universal``. Starting
   from Python 2.7 and Python 3.2 the architecture ``fat3`` is used for
   a 3-way universal build (ppc, i386, x86_64) and ``intel`` is used for
   a universal build with the i386 and x86_64 architectures

   Examples of returned values on Mac OS X:

   * ``macosx-10.3-ppc``

   * ``macosx-10.3-fat``

   * ``macosx-10.5-universal``

   * ``macosx-10.6-intel``

   For AIX, Python 3.9 and later return a string starting with "aix", followed
   by additional fields (separated by ``'-'``) that represent the combined
   values of AIX Version, Release and Technology Level (first field), Build Date
   (second field), and bit-size (third field). Python 3.8 and earlier returned
   only a single additional field with the AIX Version and Release.

   Examples of returned values on AIX:

   * ``aix-5307-0747-32`` # 32-bit build on AIX ``oslevel -s``: 5300-07-00-0000

   * ``aix-7105-1731-64`` # 64-bit build on AIX ``oslevel -s``: 7100-05-01-1731

   * ``aix-7.2``          # Legacy form reported in Python 3.8 and earlier

   .. versionchanged:: 3.9
      The AIX platform string format now also includes the technology level,
      build date, and ABI bit-size.


.. function:: convert_path(pathname)

   Return 'pathname' as a name that will work on the native filesystem, i.e. split
   it on '/' and put it back together again using the current directory separator.
   Needed because filenames in the setup script are always supplied in Unix style,
   and have to be converted to the local convention before we can actually use them
   in the filesystem.  Raises :exc:`ValueError` on non-Unix-ish systems if
   *pathname* either  starts or ends with a slash.


.. function:: change_root(new_root, pathname)

   Return *pathname* with *new_root* prepended.  If *pathname* is relative, this is
   equivalent to ``os.path.join(new_root,pathname)`` Otherwise, it requires making
   *pathname* relative and then joining the two, which is tricky on DOS/Windows.


.. function:: check_environ()

   Ensure that 'os.environ' has all the environment variables we guarantee that
   users can use in config files, command-line options, etc.  Currently this
   includes:

   * :envvar:`HOME` - user's home directory (Unix only)
   * :envvar:`PLAT` - description of the current platform, including hardware and
     OS (see :func:`get_platform`)


.. function:: subst_vars(s, local_vars)

   Perform shell/Perl-style variable substitution on *s*.  Every occurrence of
   ``$`` followed by a name is considered a variable, and variable is substituted
   by the value found in the *local_vars* dictionary, or in ``os.environ`` if it's
   not in *local_vars*. *os.environ* is first checked/augmented to guarantee that
   it contains certain values: see :func:`check_environ`.  Raise :exc:`ValueError`
   for any variables not found in either *local_vars* or ``os.environ``.

   Note that this is not a fully-fledged string interpolation function. A valid
   ``$variable`` can consist only of upper and lower case letters, numbers and an
   underscore. No { } or ( ) style quoting is available.


.. function:: split_quoted(s)

   Split a string up according to Unix shell-like rules for quotes and backslashes.
   In short: words are delimited by spaces, as long as those spaces are not escaped
   by a backslash, or inside a quoted string. Single and double quotes are
   equivalent, and the quote characters can be backslash-escaped.  The backslash is
   stripped from any two-character escape sequence, leaving only the escaped
   character.  The quote characters are stripped from any quoted string.  Returns a
   list of words.

   .. % Should probably be moved into the standard library.


.. function:: execute(func, args[, msg=None, verbose=0, dry_run=0])

   Perform some action that affects the outside world (for instance, writing to the
   filesystem).  Such actions are special because they are disabled by the
   *dry_run* flag.  This method takes  care of all that bureaucracy for you; all
   you have to do is supply the function to call and an argument tuple for it (to
   embody the "external action" being performed), and an optional message to print.


.. function:: strtobool(val)

   Convert a string representation of truth to true (1) or false (0).

   True values are ``y``, ``yes``, ``t``, ``true``, ``on``  and ``1``; false values
   are ``n``, ``no``, ``f``, ``false``,  ``off`` and ``0``.  Raises
   :exc:`ValueError` if *val*  is anything else.


.. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None])

   Byte-compile a collection of Python source files to :file:`.pyc` files in a
   :file:`__pycache__` subdirectory (see :pep:`3147` and :pep:`488`).
   *py_files* is a list of files to compile; any files that don't end in
   :file:`.py` are silently skipped.  *optimize* must be one of the following:

   * ``0`` - don't optimize
   * ``1`` - normal optimization (like ``python -O``)
   * ``2`` - extra optimization (like ``python -OO``)

   If *force* is true, all files are recompiled regardless of timestamps.

   The source filename encoded in each :term:`bytecode` file defaults to the filenames
   listed in *py_files*; you can modify these with *prefix* and *basedir*.
   *prefix* is a string that will be stripped off of each source filename, and
   *base_dir* is a directory name that will be prepended (after *prefix* is
   stripped).  You can supply either or both (or neither) of *prefix* and
   *base_dir*, as you wish.

   If *dry_run* is true, doesn't actually do anything that would affect the
   filesystem.

   Byte-compilation is either done directly in this interpreter process with the
   standard :mod:`py_compile` module, or indirectly by writing a temporary script
   and executing it.  Normally, you should let :func:`byte_compile` figure out to
   use direct compilation or not (see the source for details).  The *direct* flag
   is used by the script generated in indirect mode; unless you know what you're
   doing, leave it set to ``None``.

   .. versionchanged:: 3.2.3
      Create ``.pyc`` files with an :func:`import magic tag
      <imp.get_tag>` in their name, in a :file:`__pycache__` subdirectory
      instead of files without tag in the current directory.

   .. versionchanged:: 3.5
      Create ``.pyc`` files according to :pep:`488`.


.. function:: rfc822_escape(header)

   Return a version of *header* escaped for inclusion in an :rfc:`822` header, by
   ensuring there are 8 spaces space after each newline. Note that it does no other
   modification of the string.

   .. % this _can_ be replaced

.. % \subsection{Distutils objects}


:mod:`distutils.dist` --- The Distribution class
================================================

.. module:: distutils.dist
   :synopsis: Provides the Distribution class, which represents the module distribution being
              built/installed/distributed


This module provides the :class:`~distutils.core.Distribution` class, which
represents the module distribution being built/installed/distributed.


:mod:`distutils.extension` --- The Extension class
==================================================

.. module:: distutils.extension
   :synopsis: Provides the Extension class, used to describe C/C++ extension modules in setup
              scripts


This module provides the :class:`~distutils.extension.Extension` class,
used to describe C/C++ extension modules in setup scripts.

.. % \subsection{Ungrouped modules}
.. % The following haven't been moved into a more appropriate section yet.


:mod:`distutils.debug` --- Distutils debug mode
===============================================

.. module:: distutils.debug
   :synopsis: Provides the debug flag for distutils


This module provides the DEBUG flag.


:mod:`distutils.errors` --- Distutils exceptions
================================================

.. module:: distutils.errors
   :synopsis: Provides standard distutils exceptions


Provides exceptions used by the Distutils modules.  Note that Distutils modules
may raise standard exceptions; in particular, SystemExit is usually raised for
errors that are obviously the end-user's fault (eg. bad command-line arguments).

This module is safe to use in ``from ... import *`` mode; it only exports
symbols whose names start with ``Distutils`` and end with ``Error``.


:mod:`distutils.fancy_getopt` --- Wrapper around the standard getopt module
===========================================================================

.. module:: distutils.fancy_getopt
   :synopsis: Additional getopt functionality


This module provides a wrapper around the standard :mod:`getopt`  module that
provides the following additional features:

* short and long options are tied together

* options have help strings, so :func:`fancy_getopt` could potentially  create a
  complete usage summary

* options set attributes of a passed-in object

* boolean options can have "negative aliases" --- eg. if :option:`!--quiet` is
  the "negative alias" of :option:`!--verbose`, then :option:`!--quiet` on the
  command line sets *verbose* to false.

.. function:: fancy_getopt(options, negative_opt, object, args)

   Wrapper function. *options* is a list of ``(long_option, short_option,
   help_string)`` 3-tuples as described in the constructor for
   :class:`FancyGetopt`. *negative_opt* should be a dictionary mapping option names
   to option names, both the key and value should be in the *options* list.
   *object* is an object which will be used to store values (see the :meth:`~FancyGetopt.getopt`
   method of the :class:`FancyGetopt` class). *args* is the argument list. Will use
   ``sys.argv[1:]`` if you  pass ``None`` as *args*.


.. function:: wrap_text(text, width)

   Wraps *text* to less than *width* wide.


.. class:: FancyGetopt([option_table=None])

   The option_table is a list of 3-tuples: ``(long_option, short_option,
   help_string)``

   If an option takes an argument, its *long_option* should have ``'='`` appended;
   *short_option* should just be a single character, no ``':'`` in any case.
   *short_option* should be ``None`` if a *long_option*  doesn't have a
   corresponding *short_option*. All option tuples must have long options.

The :class:`FancyGetopt` class provides the following methods:


.. method:: FancyGetopt.getopt([args=None, object=None])

   Parse command-line options in args. Store as attributes on *object*.

   If *args* is ``None`` or not supplied, uses ``sys.argv[1:]``.  If *object* is
   ``None`` or not supplied, creates a new :class:`OptionDummy` instance, stores
   option values there, and returns a tuple ``(args, object)``.  If *object* is
   supplied, it is modified in place and :func:`getopt` just returns *args*; in
   both cases, the returned *args* is a modified copy of the passed-in *args* list,
   which is left untouched.

   .. % and args returned are?


.. method:: FancyGetopt.get_option_order()

   Returns the list of ``(option, value)`` tuples processed by the previous run of
   :meth:`getopt`  Raises :exc:`RuntimeError` if :meth:`getopt` hasn't been called
   yet.


.. method:: FancyGetopt.generate_help([header=None])

   Generate help text (a list of strings, one per suggested line of output) from
   the option table for this :class:`FancyGetopt` object.

   If supplied, prints the supplied *header* at the top of the help.


:mod:`distutils.filelist` --- The FileList class
================================================

.. module:: distutils.filelist
   :synopsis: The FileList class, used for poking about the file system and
              building lists of files.


This module provides the :class:`FileList` class, used for poking about the
filesystem and building lists of files.


:mod:`distutils.log` --- Simple :pep:`282`-style logging
========================================================

.. module:: distutils.log
   :synopsis: A simple logging mechanism, :pep:`282`-style


:mod:`distutils.spawn` --- Spawn a sub-process
==============================================

.. module:: distutils.spawn
   :synopsis: Provides the spawn() function


This module provides the :func:`~distutils.spawn.spawn` function, a
front-end to  various platform-specific functions for launching another
program in a  sub-process.
Also provides :func:`~distutils.spawn.find_executable` to search the path for a given executable
name.


:mod:`distutils.sysconfig` --- System configuration information
===============================================================

.. module:: distutils.sysconfig
   :synopsis: Low-level access to configuration information of the Python interpreter.
.. moduleauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
.. moduleauthor:: Greg Ward <gward@python.net>
.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>


The :mod:`distutils.sysconfig` module provides access to Python's low-level
configuration information.  The specific configuration variables available
depend heavily on the platform and configuration. The specific variables depend
on the build process for the specific version of Python being run; the variables
are those found in the :file:`Makefile` and configuration header that are
installed with Python on Unix systems.  The configuration header is called
:file:`pyconfig.h` for Python versions starting with 2.2, and :file:`config.h`
for earlier versions of Python.

Some additional functions are provided which perform some useful manipulations
for other parts of the :mod:`distutils` package.


.. data:: PREFIX

   The result of ``os.path.normpath(sys.prefix)``.


.. data:: EXEC_PREFIX

   The result of ``os.path.normpath(sys.exec_prefix)``.


.. function:: get_config_var(name)

   Return the value of a single variable.  This is equivalent to
   ``get_config_vars().get(name)``.


.. function:: get_config_vars(...)

   Return a set of variable definitions.  If there are no arguments, this returns a
   dictionary mapping names of configuration variables to values.  If arguments are
   provided, they should be strings, and the return value will be a sequence giving
   the associated values. If a given name does not have a corresponding value,
   ``None`` will be included for that variable.


.. function:: get_config_h_filename()

   Return the full path name of the configuration header.  For Unix, this will be
   the header generated by the :program:`configure` script; for other platforms the
   header will have been supplied directly by the Python source distribution.  The
   file is a platform-specific text file.


.. function:: get_makefile_filename()

   Return the full path name of the :file:`Makefile` used to build Python.  For
   Unix, this will be a file generated by the :program:`configure` script; the
   meaning for other platforms will vary.  The file is a platform-specific text
   file, if it exists. This function is only useful on POSIX platforms.


.. function:: get_python_inc([plat_specific[, prefix]])

   Return the directory for either the general or platform-dependent C include
   files.  If *plat_specific* is true, the platform-dependent include directory is
   returned; if false or omitted, the platform-independent directory is returned.
   If *prefix* is given, it is used as either the prefix instead of
   :const:`PREFIX`, or as the exec-prefix instead of :const:`EXEC_PREFIX` if
   *plat_specific* is true.


.. function:: get_python_lib([plat_specific[, standard_lib[, prefix]]])

   Return the directory for either the general or platform-dependent library
   installation.  If *plat_specific* is true, the platform-dependent include
   directory is returned; if false or omitted, the platform-independent directory
   is returned.  If *prefix* is given, it is used as either the prefix instead of
   :const:`PREFIX`, or as the exec-prefix instead of :const:`EXEC_PREFIX` if
   *plat_specific* is true.  If *standard_lib* is true, the directory for the
   standard library is returned rather than the directory for the installation of
   third-party extensions.

The following function is only intended for use within the :mod:`distutils`
package.


.. function:: customize_compiler(compiler)

   Do any platform-specific customization of a
   :class:`distutils.ccompiler.CCompiler` instance.

   This function is only needed on Unix at this time, but should be called
   consistently to support forward-compatibility.  It inserts the information that
   varies across Unix flavors and is stored in Python's :file:`Makefile`.  This
   information includes the selected compiler, compiler and linker options, and the
   extension used by the linker for shared objects.

This function is even more special-purpose, and should only be used from
Python's own build procedures.


.. function:: set_python_build()

   Inform the :mod:`distutils.sysconfig` module that it is being used as part of
   the build process for Python.  This changes a lot of relative locations for
   files, allowing them to be located in the build area rather than in an installed
   Python.


:mod:`distutils.text_file` --- The TextFile class
=================================================

.. module:: distutils.text_file
   :synopsis: Provides the TextFile class, a simple interface to text files


This module provides the :class:`TextFile` class, which gives an interface  to
text files that (optionally) takes care of stripping comments, ignoring  blank
lines, and joining lines with backslashes.


.. class:: TextFile([filename=None, file=None, **options])

   This class provides a file-like object that takes care of all  the things you
   commonly want to do when processing a text file  that has some line-by-line
   syntax: strip comments (as long as ``#``  is your comment character), skip blank
   lines, join adjacent lines by escaping the newline (ie. backslash at end of
   line), strip leading and/or trailing whitespace.  All of these are optional and
   independently controllable.

   The class provides a :meth:`warn` method so you can generate  warning messages
   that report physical line number, even if the  logical line in question spans
   multiple physical lines.  Also  provides :meth:`unreadline` for implementing
   line-at-a-time lookahead.

   :class:`TextFile` instances are create with either *filename*, *file*, or both.
   :exc:`RuntimeError` is raised if both are ``None``. *filename* should be a
   string, and *file* a file object (or something that provides :meth:`readline`
   and :meth:`close`  methods).  It is recommended that you supply at least
   *filename*,  so that :class:`TextFile` can include it in warning messages.  If
   *file* is not supplied, :class:`TextFile` creates its own using the
   :func:`open` built-in function.

   The options are all boolean, and affect the values returned by :meth:`readline`

   .. tabularcolumns:: |l|L|l|

   +------------------+--------------------------------+---------+
   | option name      | description                    | default |
   +==================+================================+=========+
   | *strip_comments* | strip from ``'#'`` to          | true    |
   |                  | end-of-line, as well as any    |         |
   |                  | whitespace leading up to the   |         |
   |                  | ``'#'``\ ---unless it is       |         |
   |                  | escaped by a backslash         |         |
   +------------------+--------------------------------+---------+
   | *lstrip_ws*      | strip leading whitespace from  | false   |
   |                  | each line before returning it  |         |
   +------------------+--------------------------------+---------+
   | *rstrip_ws*      | strip trailing whitespace      | true    |
   |                  | (including line terminator!)   |         |
   |                  | from each line before          |         |
   |                  | returning it.                  |         |
   +------------------+--------------------------------+---------+
   | *skip_blanks*    | skip lines that are empty      | true    |
   |                  | \*after\* stripping comments   |         |
   |                  | and whitespace.  (If both      |         |
   |                  | lstrip_ws and rstrip_ws are    |         |
   |                  | false, then some lines may     |         |
   |                  | consist of solely whitespace:  |         |
   |                  | these will \*not\* be skipped, |         |
   |                  | even if *skip_blanks* is       |         |
   |                  | true.)                         |         |
   +------------------+--------------------------------+---------+
   | *join_lines*     | if a backslash is the last     | false   |
   |                  | non-newline character on a     |         |
   |                  | line after stripping comments  |         |
   |                  | and whitespace, join the       |         |
   |                  | following line to it to form   |         |
   |                  | one logical line; if N         |         |
   |                  | consecutive lines end with a   |         |
   |                  | backslash, then N+1 physical   |         |
   |                  | lines will be joined to form   |         |
   |                  | one logical line.              |         |
   +------------------+--------------------------------+---------+
   | *collapse_join*  | strip leading whitespace from  | false   |
   |                  | lines that are joined to their |         |
   |                  | predecessor; only matters if   |         |
   |                  | ``(join_lines and not          |         |
   |                  | lstrip_ws)``                   |         |
   +------------------+--------------------------------+---------+

   Note that since *rstrip_ws* can strip the trailing newline, the semantics of
   :meth:`readline` must differ from those of the built-in file object's
   :meth:`readline` method!  In particular, :meth:`readline`  returns ``None`` for
   end-of-file: an empty string might just be a  blank line (or an all-whitespace
   line), if *rstrip_ws* is true  but *skip_blanks* is not.


   .. method:: TextFile.open(filename)

      Open a new file *filename*.  This overrides any *file* or *filename*
      constructor arguments.


   .. method:: TextFile.close()

      Close the current file and forget everything we know about it (including the
      filename and the current line number).


   .. method:: TextFile.warn(msg[,line=None])

      Print (to stderr) a warning message tied to the current logical line in the
      current file.  If the current logical line in the file spans multiple physical
      lines, the warning refers to the whole range, such as ``"lines 3-5"``.  If
      *line* is supplied,  it overrides the current line number; it may be a list or
      tuple  to indicate a range of physical lines, or an integer for a  single
      physical line.


   .. method:: TextFile.readline()

      Read and return a single logical line from the current file (or from an internal
      buffer if lines have previously been "unread" with :meth:`unreadline`).  If the
      *join_lines* option  is true, this may involve reading multiple physical lines
      concatenated into a single string.  Updates the current line number,  so calling
      :meth:`warn` after :meth:`readline` emits a warning  about the physical line(s)
      just read.  Returns ``None`` on end-of-file,  since the empty string can occur
      if *rstrip_ws* is true but  *strip_blanks* is not.


   .. method:: TextFile.readlines()

      Read and return the list of all logical lines remaining in the current file.
      This updates the current line number to the last line of the file.


   .. method:: TextFile.unreadline(line)

      Push *line* (a string) onto an internal buffer that will be checked by future
      :meth:`readline` calls.  Handy for implementing a parser with line-at-a-time
      lookahead. Note that lines that are "unread" with :meth:`unreadline` are not
      subsequently re-cleansed (whitespace  stripped, or whatever) when read with
      :meth:`readline`. If multiple calls are made to :meth:`unreadline` before a call
      to :meth:`readline`, the lines will be returned most in most recent first order.


:mod:`distutils.version` --- Version number classes
===================================================

.. module:: distutils.version
   :synopsis: Implements classes that represent module version numbers.


.. % todo
.. % \section{Distutils Commands}
.. %
.. % This part of Distutils implements the various Distutils commands, such
.. % as \code{build}, \code{install} \&c. Each command is implemented as a
.. % separate module, with the command name as the name of the module.


:mod:`distutils.cmd` --- Abstract base class for Distutils commands
===================================================================

.. module:: distutils.cmd
   :synopsis: Provides the abstract base class :class:`~distutils.cmd.Command`. This class
              is subclassed by the modules in the distutils.command subpackage.


This module supplies the abstract base class :class:`Command`.


.. class:: Command(dist)

   Abstract base class for defining command classes, the "worker bees" of the
   Distutils.  A useful analogy for command classes is to think of them as
   subroutines with local variables called *options*.  The options are declared
   in :meth:`initialize_options` and defined (given their final values) in
   :meth:`finalize_options`, both of which must be defined by every command
   class.  The distinction between the two is necessary because option values
   might come from the outside world (command line, config file, ...), and any
   options dependent on other options must be computed after these outside
   influences have been processed --- hence :meth:`finalize_options`.  The body
   of the subroutine, where it does all its work based on the values of its
   options, is the :meth:`run` method, which must also be implemented by every
   command class.

   The class constructor takes a single argument *dist*, a
   :class:`~distutils.core.Distribution` instance.


Creating a new Distutils command
================================

This section outlines the steps to create a new Distutils command.

A new command lives in a module in the :mod:`distutils.command` package. There
is a sample template in that directory called :file:`command_template`.  Copy
this file to a new module with the same name as the new command you're
implementing.  This module should implement a class with the same name as the
module (and the command).  So, for instance, to create the command
``peel_banana`` (so that users can run ``setup.py peel_banana``), you'd copy
:file:`command_template` to :file:`distutils/command/peel_banana.py`, then edit
it so that it's implementing the class ``peel_banana``, a subclass of
:class:`distutils.cmd.Command`.

Subclasses of :class:`Command` must define the following methods.

.. method:: Command.initialize_options()

   Set default values for all the options that this command supports.  Note that
   these defaults may be overridden by other commands, by the setup script, by
   config files, or by the command-line.  Thus, this is not the place to code
   dependencies between options; generally, :meth:`initialize_options`
   implementations are just a bunch of ``self.foo = None`` assignments.


.. method:: Command.finalize_options()

   Set final values for all the options that this command supports. This is
   always called as late as possible, ie.  after any option assignments from the
   command-line or from other commands have been done.  Thus, this is the place
   to code option dependencies: if *foo* depends on *bar*, then it is safe to
   set *foo* from *bar* as long as *foo* still has the same value it was
   assigned in :meth:`initialize_options`.


.. method:: Command.run()

   A command's raison d'etre: carry out the action it exists to perform, controlled
   by the options initialized in :meth:`initialize_options`, customized by other
   commands, the setup script, the command-line, and config files, and finalized in
   :meth:`finalize_options`.  All terminal output and filesystem interaction should
   be done by :meth:`run`.


.. attribute:: Command.sub_commands

   *sub_commands* formalizes the notion of a "family" of commands,
   e.g. ``install`` as the parent with sub-commands ``install_lib``,
   ``install_headers``, etc.  The parent of a family of commands defines
   *sub_commands* as a class attribute; it's a list of 2-tuples ``(command_name,
   predicate)``, with *command_name* a string and *predicate* a function, a
   string or ``None``.  *predicate* is a method of the parent command that
   determines whether the corresponding command is applicable in the current
   situation.  (E.g. ``install_headers`` is only applicable if we have any C
   header files to install.)  If *predicate* is ``None``, that command is always
   applicable.

   *sub_commands* is usually defined at the *end* of a class, because
   predicates can be methods of the class, so they must already have been
   defined.  The canonical example is the :command:`install` command.


:mod:`distutils.command` --- Individual Distutils commands
==========================================================

.. module:: distutils.command
   :synopsis: Contains one module for each standard Distutils command.


.. % \subsubsection{Individual Distutils commands}
.. % todo


:mod:`distutils.command.bdist` --- Build a binary installer
===========================================================

.. module:: distutils.command.bdist
   :synopsis: Build a binary installer for a package


.. % todo


:mod:`distutils.command.bdist_packager` --- Abstract base class for packagers
=============================================================================

.. module:: distutils.command.bdist_packager
   :synopsis: Abstract base class for packagers


.. % todo


:mod:`distutils.command.bdist_dumb` --- Build a "dumb" installer
================================================================

.. module:: distutils.command.bdist_dumb
   :synopsis: Build a "dumb" installer - a simple archive of files


.. % todo


:mod:`distutils.command.bdist_msi` --- Build a Microsoft Installer binary package
=================================================================================

.. module:: distutils.command.bdist_msi
   :synopsis: Build a binary distribution as a Windows MSI file

.. class:: bdist_msi

.. deprecated:: 3.9
   Use bdist_wheel (wheel packages) instead.

   Builds a `Windows Installer`_ (.msi) binary package.

   .. _Windows Installer: https://msdn.microsoft.com/en-us/library/cc185688(VS.85).aspx

   In most cases, the ``bdist_msi`` installer is a better choice than the
   ``bdist_wininst`` installer, because it provides better support for
   Win64 platforms, allows administrators to perform non-interactive
   installations, and allows installation through group policies.


:mod:`distutils.command.bdist_rpm` --- Build a binary distribution as a Redhat RPM and SRPM
===========================================================================================

.. module:: distutils.command.bdist_rpm
   :synopsis: Build a binary distribution as a Redhat RPM and SRPM


.. % todo


:mod:`distutils.command.bdist_wininst` --- Build a Windows installer
====================================================================

.. module:: distutils.command.bdist_wininst
   :synopsis: Build a Windows installer

.. deprecated:: 3.8
   Use bdist_wheel (wheel packages) instead.


.. % todo


:mod:`distutils.command.sdist` --- Build a source distribution
==============================================================

.. module:: distutils.command.sdist
   :synopsis: Build a source distribution


.. % todo


:mod:`distutils.command.build` --- Build all files of a package
===============================================================

.. module:: distutils.command.build
   :synopsis: Build all files of a package


.. % todo


:mod:`distutils.command.build_clib` --- Build any C libraries in a package
==========================================================================

.. module:: distutils.command.build_clib
   :synopsis: Build any C libraries in a package


.. % todo


:mod:`distutils.command.build_ext` --- Build any extensions in a package
========================================================================

.. module:: distutils.command.build_ext
   :synopsis: Build any extensions in a package


.. % todo


:mod:`distutils.command.build_py` --- Build the .py/.pyc files of a package
===========================================================================

.. module:: distutils.command.build_py
   :synopsis: Build the .py/.pyc files of a package


.. class:: build_py


:mod:`distutils.command.build_scripts` --- Build the scripts of a package
=========================================================================

.. module:: distutils.command.build_scripts
   :synopsis: Build the scripts of a package


.. % todo


:mod:`distutils.command.clean` --- Clean a package build area
=============================================================

.. module:: distutils.command.clean
   :synopsis: Clean a package build area

This command removes the temporary files created by :command:`build`
and its subcommands, like intermediary compiled object files.  With
the ``--all`` option, the complete build directory will be removed.

Extension modules built :ref:`in place <distutils-build-ext-inplace>`
will not be cleaned, as they are not in the build directory.


:mod:`distutils.command.config` --- Perform package configuration
=================================================================

.. module:: distutils.command.config
   :synopsis: Perform package configuration


.. % todo


:mod:`distutils.command.install` --- Install a package
======================================================

.. module:: distutils.command.install
   :synopsis: Install a package


.. % todo


:mod:`distutils.command.install_data` --- Install data files from a package
===========================================================================

.. module:: distutils.command.install_data
   :synopsis: Install data files from a package


.. % todo


:mod:`distutils.command.install_headers` --- Install C/C++ header files from a package
======================================================================================

.. module:: distutils.command.install_headers
   :synopsis: Install C/C++ header files from a package


.. % todo


:mod:`distutils.command.install_lib` --- Install library files from a package
=============================================================================

.. module:: distutils.command.install_lib
   :synopsis: Install library files from a package


.. % todo


:mod:`distutils.command.install_scripts` --- Install script files from a package
================================================================================

.. module:: distutils.command.install_scripts
   :synopsis: Install script files from a package


.. % todo


:mod:`distutils.command.register` --- Register a module with the Python Package Index
=====================================================================================

.. module:: distutils.command.register
   :synopsis: Register a module with the Python Package Index


The ``register`` command registers the package with the Python Package  Index.
This is described in more detail in :pep:`301`.

.. % todo


:mod:`distutils.command.check` --- Check the meta-data of a package
===================================================================

.. module:: distutils.command.check
   :synopsis: Check the meta-data of a package


The ``check`` command performs some tests on the meta-data of a package.
For example, it verifies that all required meta-data are provided as
the arguments passed to the :func:`~distutils.core.setup` function.

.. % todo
PK�(�\2�����@doc/alt-python37-setuptools/docs/deprecated/distutils-legacy.rstnu�[���Porting from Distutils
======================

Setuptools and the PyPA have a `stated goal <https://github.com/pypa/packaging-problems/issues/127>`_ to make Setuptools the reference API for distutils.

Since the 49.1.2 release, Setuptools includes a local, vendored copy of distutils (from late copies of CPython) that is disabled by default. To enable the use of this copy of distutils when invoking setuptools, set the enviroment variable:

	SETUPTOOLS_USE_DISTUTILS=local

This behavior is planned to become the default.

Prefer Setuptools
-----------------

As Distutils is deprecated, any usage of functions or objects from distutils is similarly discouraged, and Setuptools aims to replace or deprecate all such uses. This section describes the recommended replacements.

``distutils.core.setup`` → ``setuptools.setup``

``distutils.cmd.Command`` → ``setuptools.Command``

``distutils.log`` → (no replacement yet)

``distutils.version.*`` → ``packaging.version.*``

If a project relies on uses of ``distutils`` that do not have a suitable replacement above, please search the `Setuptools issue tracker <https://github.com/pypa/setuptools/issues/>`_ and file a request, describing the use-case so that Setuptools' maintainers can investigate. Please provide enough detail to help the maintainers understand how distutils is used, what value it provides, and why that behavior should be supported.
PK�(�\�j'��?doc/alt-python37-setuptools/docs/deprecated/functionalities.rstnu�[���"Eggsecutable" Scripts
----------------------

.. deprecated:: 45.3.0

Occasionally, there are situations where it's desirable to make an ``.egg``
file directly executable.  You can do this by including an entry point such
as the following::

    setup(
        # other arguments here...
        entry_points={
            "setuptools.installation": [
                "eggsecutable = my_package.some_module:main_func",
            ]
        }
    )

Any eggs built from the above setup script will include a short executable
prelude that imports and calls ``main_func()`` from ``my_package.some_module``.
The prelude can be run on Unix-like platforms (including Mac and Linux) by
invoking the egg with ``/bin/sh``, or by enabling execute permissions on the
``.egg`` file.  For the executable prelude to run, the appropriate version of
Python must be available via the ``PATH`` environment variable, under its
"long" name.  That is, if the egg is built for Python 2.3, there must be a
``python2.3`` executable present in a directory on ``PATH``.

IMPORTANT NOTE: Eggs with an "eggsecutable" header cannot be renamed, or
invoked via symlinks.  They *must* be invoked using their original filename, in
order to ensure that, once running, ``pkg_resources`` will know what project
and version is in use.  The header script will check this and exit with an
error if the ``.egg`` file has been renamed or is invoked via a symlink that
changes its base name.PK�(�\eO<�x�x;doc/alt-python37-setuptools/docs/deprecated/python_eggs.rstnu�[���=====================================
The Internal Structure of Python Eggs
=====================================

STOP! This is not the first document you should read!



----------------------
Eggs and their Formats
----------------------

A "Python egg" is a logical structure embodying the release of a
specific version of a Python project, comprising its code, resources,
and metadata. There are multiple formats that can be used to physically
encode a Python egg, and others can be developed. However, a key
principle of Python eggs is that they should be discoverable and
importable. That is, it should be possible for a Python application to
easily and efficiently find out what eggs are present on a system, and
to ensure that the desired eggs' contents are importable.

There are two basic formats currently implemented for Python eggs:

1. ``.egg`` format: a directory or zipfile *containing* the project's
   code and resources, along with an ``EGG-INFO`` subdirectory that
   contains the project's metadata

2. ``.egg-info`` format: a file or directory placed *adjacent* to the
   project's code and resources, that directly contains the project's
   metadata.

Both formats can include arbitrary Python code and resources, including
static data files, package and non-package directories, Python
modules, C extension modules, and so on.  But each format is optimized
for different purposes.

The ``.egg`` format is well-suited to distribution and the easy
uninstallation or upgrades of code, since the project is essentially
self-contained within a single directory or file, unmingled with any
other projects' code or resources.  It also makes it possible to have
multiple versions of a project simultaneously installed, such that
individual programs can select the versions they wish to use.

The ``.egg-info`` format, on the other hand, was created to support
backward-compatibility, performance, and ease of installation for system
packaging tools that expect to install all projects' code and resources
to a single directory (e.g. ``site-packages``).  Placing the metadata
in that same directory simplifies the installation process, since it
isn't necessary to create ``.pth`` files or otherwise modify
``sys.path`` to include each installed egg.

Its disadvantage, however, is that it provides no support for clean
uninstallation or upgrades, and of course only a single version of a
project can be installed to a given directory. Thus, support from a
package management tool is required. (This is why setuptools' "install"
command refers to this type of egg installation as "single-version,
externally managed".)  Also, they lack sufficient data to allow them to
be copied from their installation source.  easy_install can "ship" an
application by copying ``.egg`` files or directories to a target
location, but it cannot do this for ``.egg-info`` installs, because
there is no way to tell what code and resources belong to a particular
egg -- there may be several eggs "scrambled" together in a single
installation location, and the ``.egg-info`` format does not currently
include a way to list the files that were installed.  (This may change
in a future version.)


Code and Resources
==================

The layout of the code and resources is dictated by Python's normal
import layout, relative to the egg's "base location".

For the ``.egg`` format, the base location is the ``.egg`` itself. That
is, adding the ``.egg`` filename or directory name to ``sys.path``
makes its contents importable.

For the ``.egg-info`` format, however, the base location is the
directory that *contains* the ``.egg-info``, and thus it is the
directory that must be added to ``sys.path`` to make the egg importable.
(Note that this means that the "normal" installation of a package to a
``sys.path`` directory is sufficient to make it an "egg" if it has an
``.egg-info`` file or directory installed alongside of it.)


Project Metadata
=================

If eggs contained only code and resources, there would of course be
no difference between them and any other directory or zip file on
``sys.path``.  Thus, metadata must also be included, using a metadata
file or directory.

For the ``.egg`` format, the metadata is placed in an ``EGG-INFO``
subdirectory, directly within the ``.egg`` file or directory.  For the
``.egg-info`` format, metadata is stored directly within the
``.egg-info`` directory itself.

The minimum project metadata that all eggs must have is a standard
Python ``PKG-INFO`` file, named ``PKG-INFO`` and placed within the
metadata directory appropriate to the format.  Because it's possible for
this to be the only metadata file included, ``.egg-info`` format eggs
are not required to be a directory; they can just be a ``.egg-info``
file that directly contains the ``PKG-INFO`` metadata.  This eliminates
the need to create a directory just to store one file.  This option is
*not* available for ``.egg`` formats, since setuptools always includes
other metadata.  (In fact, setuptools itself never generates
``.egg-info`` files, either; the support for using files was added so
that the requirement could easily be satisfied by other tools, such
as distutils).

In addition to the ``PKG-INFO`` file, an egg's metadata directory may
also include files and directories representing various forms of
optional standard metadata (see the section on `Standard Metadata`_,
below) or user-defined metadata required by the project.  For example,
some projects may define a metadata format to describe their application
plugins, and metadata in this format would then be included by plugin
creators in their projects' metadata directories.


Filename-Embedded Metadata
==========================

To allow introspection of installed projects and runtime resolution of
inter-project dependencies, a certain amount of information is embedded
in egg filenames.  At a minimum, this includes the project name, and
ideally will also include the project version number.  Optionally, it
can also include the target Python version and required runtime
platform if platform-specific C code is included.  The syntax of an
egg filename is as follows::

    name ["-" version ["-py" pyver ["-" required_platform]]] "." ext

The "name" and "version" should be escaped using the ``to_filename()``
function provided by ``pkg_resources``, after first processing them with
``safe_name()`` and ``safe_version()`` respectively.  These latter two
functions can also be used to later "unescape" these parts of the
filename.  (For a detailed description of these transformations, please
see the "Parsing Utilities" section of the ``pkg_resources`` manual.)

The "pyver" string is the Python major version, as found in the first
3 characters of ``sys.version``.  "required_platform" is essentially
a distutils ``get_platform()`` string, but with enhancements to properly
distinguish Mac OS versions.  (See the ``get_build_platform()``
documentation in the "Platform Utilities" section of the
``pkg_resources`` manual for more details.)

Finally, the "ext" is either ``.egg`` or ``.egg-info``, as appropriate
for the egg's format.

Normally, an egg's filename should include at least the project name and
version, as this allows the runtime system to find desired project
versions without having to read the egg's PKG-INFO to determine its
version number.

Setuptools, however, only includes the version number in the filename
when an ``.egg`` file is built using the ``bdist_egg`` command, or when
an ``.egg-info`` directory is being installed by the
``install_egg_info`` command. When generating metadata for use with the
original source tree, it only includes the project name, so that the
directory will not have to be renamed each time the project's version
changes.

This is especially important when version numbers change frequently, and
the source metadata directory is kept under version control with the
rest of the project.  (As would be the case when the project's source
includes project-defined metadata that is not generated from by
setuptools from data in the setup script.)


Egg Links
=========

In addition to the ``.egg`` and ``.egg-info`` formats, there is a third
egg-related extension that you may encounter on occasion: ``.egg-link``
files.

These files are not eggs, strictly speaking. They simply provide a way
to reference an egg that is not physically installed in the desired
location. They exist primarily as a cross-platform alternative to
symbolic links, to support "installing" code that is being developed in
a different location than the desired installation location. For
example, if a user is developing an application plugin in their home
directory, but the plugin needs to be "installed" in an application
plugin directory, running "setup.py develop -md /path/to/app/plugins"
will install an ``.egg-link`` file in ``/path/to/app/plugins``, that
tells the egg runtime system where to find the actual egg (the user's
project source directory and its ``.egg-info`` subdirectory).

``.egg-link`` files are named following the format for ``.egg`` and
``.egg-info`` names, but only the project name is included; no version,
Python version, or platform information is included.  When the runtime
searches for available eggs, ``.egg-link`` files are opened and the
actual egg file/directory name is read from them.

Each ``.egg-link`` file should contain a single file or directory name,
with no newlines.  This filename should be the base location of one or
more eggs.  That is, the name must either end in ``.egg``, or else it
should be the parent directory of one or more ``.egg-info`` format eggs.

As of setuptools 0.6c6, the path may be specified as a platform-independent
(i.e. ``/``-separated) relative path from the directory containing the
``.egg-link`` file, and a second line may appear in the file, specifying a
platform-independent relative path from the egg's base directory to its
setup script directory.  This allows installation tools such as EasyInstall
to find the project's setup directory and build eggs or perform other setup
commands on it.


-----------------
Standard Metadata
-----------------

In addition to the minimum required ``PKG-INFO`` metadata, projects can
include a variety of standard metadata files or directories, as
described below.  Except as otherwise noted, these files and directories
are automatically generated by setuptools, based on information supplied
in the setup script or through analysis of the project's code and
resources.

Most of these files and directories are generated via "egg-info
writers" during execution of the setuptools ``egg_info`` command, and
are listed in the ``egg_info.writers`` entry point group defined by
setuptools' own ``setup.py`` file.

Project authors can register their own metadata writers as entry points
in this group (as described in the setuptools manual under "Adding new
EGG-INFO Files") to cause setuptools to generate project-specific
metadata files or directories during execution of the ``egg_info``
command.  It is up to project authors to document these new metadata
formats, if they create any.


``.txt`` File Formats
=====================

Files described in this section that have ``.txt`` extensions have a
simple lexical format consisting of a sequence of text lines, each line
terminated by a linefeed character (regardless of platform).  Leading
and trailing whitespace on each line is ignored, as are blank lines and
lines whose first nonblank character is a ``#`` (comment symbol).  (This
is the parsing format defined by the ``yield_lines()`` function of
the ``pkg_resources`` module.)

All ``.txt`` files defined by this section follow this format, but some
are also "sectioned" files, meaning that their contents are divided into
sections, using square-bracketed section headers akin to Windows
``.ini`` format.  Note that this does *not* imply that the lines within
the sections follow an ``.ini`` format, however.  Please see an
individual metadata file's documentation for a description of what the
lines and section names mean in that particular file.

Sectioned files can be parsed using the ``split_sections()`` function;
see the "Parsing Utilities" section of the ``pkg_resources`` manual for
for details.


Dependency Metadata
===================


``requires.txt``
----------------

This is a "sectioned" text file.  Each section is a sequence of
"requirements", as parsed by the ``parse_requirements()`` function;
please see the ``pkg_resources`` manual for the complete requirement
parsing syntax.

The first, unnamed section (i.e., before the first section header) in
this file is the project's core requirements, which must be installed
for the project to function.  (Specified using the ``install_requires``
keyword to ``setup()``).

The remaining (named) sections describe the project's "extra"
requirements, as specified using the ``extras_require`` keyword to
``setup()``.  The section name is the name of the optional feature, and
the section body lists that feature's dependencies.

Note that it is not normally necessary to inspect this file directly;
``pkg_resources.Distribution`` objects have a ``requires()`` method
that can be used to obtain ``Requirement`` objects describing the
project's core and optional dependencies.


``setup_requires.txt``
----------------------

Much like ``requires.txt`` except represents the requirements
specified by the ``setup_requires`` parameter to the Distribution.


``dependency_links.txt``
------------------------

A list of dependency URLs, one per line, as specified using the
``dependency_links`` keyword to ``setup()``.  These may be direct
download URLs, or the URLs of web pages containing direct download
links. Please see the setuptools manual for more information on
specifying this option.


``depends.txt`` -- Obsolete, do not create!
-------------------------------------------

This file follows an identical format to ``requires.txt``, but is
obsolete and should not be used.  The earliest versions of setuptools
required users to manually create and maintain this file, so the runtime
still supports reading it, if it exists.  The new filename was created
so that it could be automatically generated from ``setup()`` information
without overwriting an existing hand-created ``depends.txt``, if one
was already present in the project's source ``.egg-info`` directory.


``namespace_packages.txt`` -- Namespace Package Metadata
========================================================

A list of namespace package names, one per line, as supplied to the
``namespace_packages`` keyword to ``setup()``.  Please see the manuals
for setuptools and ``pkg_resources`` for more information about
namespace packages.


``entry_points.txt`` -- "Entry Point"/Plugin Metadata
=====================================================

This is a "sectioned" text file, whose contents encode the
``entry_points`` keyword supplied to ``setup()``.  All sections are
named, as the section names specify the entry point groups in which the
corresponding section's entry points are registered.

Each section is a sequence of "entry point" lines, each parseable using
the ``EntryPoint.parse`` classmethod; please see the ``pkg_resources``
manual for the complete entry point parsing syntax.

Note that it is not necessary to parse this file directly; the
``pkg_resources`` module provides a variety of APIs to locate and load
entry points automatically.  Please see the setuptools and
``pkg_resources`` manuals for details on the nature and uses of entry
points.


The ``scripts`` Subdirectory
============================

This directory is currently only created for ``.egg`` files built by
the setuptools ``bdist_egg`` command.  It will contain copies of all
of the project's "traditional" scripts (i.e., those specified using the
``scripts`` keyword to ``setup()``).  This is so that they can be
reconstituted when an ``.egg`` file is installed.

The scripts are placed here using the distutils' standard
``install_scripts`` command, so any ``#!`` lines reflect the Python
installation where the egg was built.  But instead of copying the
scripts to the local script installation directory, EasyInstall writes
short wrapper scripts that invoke the original scripts from inside the
egg, after ensuring that sys.path includes the egg and any eggs it
depends on.  For more about `script wrappers`_, see the section below on
`Installation and Path Management Issues`_.


Zip Support Metadata
====================


``native_libs.txt``
-------------------

A list of C extensions and other dynamic link libraries contained in
the egg, one per line.  Paths are ``/``-separated and relative to the
egg's base location.

This file is generated as part of ``bdist_egg`` processing, and as such
only appears in ``.egg`` files (and ``.egg`` directories created by
unpacking them).  It is used to ensure that all libraries are extracted
from a zipped egg at the same time, in case there is any direct linkage
between them.  Please see the `Zip File Issues`_ section below for more
information on library and resource extraction from ``.egg`` files.


``eager_resources.txt``
-----------------------

A list of resource files and/or directories, one per line, as specified
via the ``eager_resources`` keyword to ``setup()``.  Paths are
``/``-separated and relative to the egg's base location.

Resource files or directories listed here will be extracted
simultaneously, if any of the named resources are extracted, or if any
native libraries listed in ``native_libs.txt`` are extracted.  Please
see the setuptools manual for details on what this feature is used for
and how it works, as well as the `Zip File Issues`_ section below.


``zip-safe`` and ``not-zip-safe``
---------------------------------

These are zero-length files, and either one or the other should exist.
If ``zip-safe`` exists, it means that the project will work properly
when installed as an ``.egg`` zipfile, and conversely the existence of
``not-zip-safe`` means the project should not be installed as an
``.egg`` file.  The ``zip_safe`` option to setuptools' ``setup()``
determines which file will be written. If the option isn't provided,
setuptools attempts to make its own assessment of whether the package
can work, based on code and content analysis.

If neither file is present at installation time, EasyInstall defaults
to assuming that the project should be unzipped.  (Command-line options
to EasyInstall, however, take precedence even over an existing
``zip-safe`` or ``not-zip-safe`` file.)

Note that these flag files appear only in ``.egg`` files generated by
``bdist_egg``, and in ``.egg`` directories created by unpacking such an
``.egg`` file.



``top_level.txt`` -- Conflict Management Metadata
=================================================

This file is a list of the top-level module or package names provided
by the project, one Python identifier per line.

Subpackages are not included; a project containing both a ``foo.bar``
and a ``foo.baz`` would include only one line, ``foo``, in its
``top_level.txt``.

This data is used by ``pkg_resources`` at runtime to issue a warning if
an egg is added to ``sys.path`` when its contained packages may have
already been imported.

(It was also once used to detect conflicts with non-egg packages at
installation time, but in more recent versions, setuptools installs eggs
in such a way that they always override non-egg packages, thus
preventing a problem from arising.)


``SOURCES.txt`` -- Source Files Manifest
========================================

This file is roughly equivalent to the distutils' ``MANIFEST`` file.
The differences are as follows:

* The filenames always use ``/`` as a path separator, which must be
  converted back to a platform-specific path whenever they are read.

* The file is automatically generated by setuptools whenever the
  ``egg_info`` or ``sdist`` commands are run, and it is *not*
  user-editable.

Although this metadata is included with distributed eggs, it is not
actually used at runtime for any purpose.  Its function is to ensure
that setuptools-built *source* distributions can correctly discover
what files are part of the project's source, even if the list had been
generated using revision control metadata on the original author's
system.

In other words, ``SOURCES.txt`` has little or no runtime value for being
included in distributed eggs, and it is possible that future versions of
the ``bdist_egg`` and ``install_egg_info`` commands will strip it before
installation or distribution.  Therefore, do not rely on its being
available outside of an original source directory or source
distribution.


------------------------------
Other Technical Considerations
------------------------------


Zip File Issues
===============

Although zip files resemble directories, they are not fully
substitutable for them.  Most platforms do not support loading dynamic
link libraries contained in zipfiles, so it is not possible to directly
import C extensions from ``.egg`` zipfiles.  Similarly, there are many
existing libraries -- whether in Python or C -- that require actual
operating system filenames, and do not work with arbitrary "file-like"
objects or in-memory strings, and thus cannot operate directly on the
contents of zip files.

To address these issues, the ``pkg_resources`` module provides a
"resource API" to support obtaining either the contents of a resource,
or a true operating system filename for the resource.  If the egg
containing the resource is a directory, the resource's real filename
is simply returned.  However, if the egg is a zipfile, then the
resource is first extracted to a cache directory, and the filename
within the cache is returned.

The cache directory is determined by the ``pkg_resources`` API; please
see the ``set_cache_path()`` and ``get_default_cache()`` documentation
for details.


The Extraction Process
----------------------

Resources are extracted to a cache subdirectory whose name is based
on the enclosing ``.egg`` filename and the path to the resource.  If
there is already a file of the correct name, size, and timestamp, its
filename is returned to the requester.  Otherwise, the desired file is
extracted first to a temporary name generated using
``mkstemp(".$extract",target_dir)``, and then its timestamp is set to
match the one in the zip file, before renaming it to its final name.
(Some collision detection and resolution code is used to handle the
fact that Windows doesn't overwrite files when renaming.)

If a resource directory is requested, all of its contents are
recursively extracted in this fashion, to ensure that the directory
name can be used as if it were valid all along.

If the resource requested for extraction is listed in the
``native_libs.txt`` or ``eager_resources.txt`` metadata files, then
*all* resources listed in *either* file will be extracted before the
requested resource's filename is returned, thus ensuring that all
C extensions and data used by them will be simultaneously available.


Extension Import Wrappers
-------------------------

Since Python's built-in zip import feature does not support loading
C extension modules from zipfiles, the setuptools ``bdist_egg`` command
generates special import wrappers to make it work.

The wrappers are ``.py`` files (along with corresponding ``.pyc``
and/or ``.pyo`` files) that have the same module name as the
corresponding C extension.  These wrappers are located in the same
package directory (or top-level directory) within the zipfile, so that
say, ``foomodule.so`` will get a corresponding ``foo.py``, while
``bar/baz.pyd`` will get a corresponding ``bar/baz.py``.

These wrapper files contain a short stanza of Python code that asks
``pkg_resources`` for the filename of the corresponding C extension,
then reloads the module using the obtained filename.  This will cause
``pkg_resources`` to first ensure that all of the egg's C extensions
(and any accompanying "eager resources") are extracted to the cache
before attempting to link to the C library.

Note, by the way, that ``.egg`` directories will also contain these
wrapper files.  However, Python's default import priority is such that
C extensions take precedence over same-named Python modules, so the
import wrappers are ignored unless the egg is a zipfile.


Installation and Path Management Issues
=======================================

Python's initial setup of ``sys.path`` is very dependent on the Python
version and installation platform, as well as how Python was started
(i.e., script vs. ``-c`` vs. ``-m`` vs. interactive interpreter).
In fact, Python also provides only two relatively robust ways to affect
``sys.path`` outside of direct manipulation in code: the ``PYTHONPATH``
environment variable, and ``.pth`` files.

However, with no cross-platform way to safely and persistently change
environment variables, this leaves ``.pth`` files as EasyInstall's only
real option for persistent configuration of ``sys.path``.

But ``.pth`` files are rather strictly limited in what they are allowed
to do normally.  They add directories only to the *end* of ``sys.path``,
after any locally-installed ``site-packages`` directory, and they are
only processed *in* the ``site-packages`` directory to start with.

This is a double whammy for users who lack write access to that
directory, because they can't create a ``.pth`` file that Python will
read, and even if a sympathetic system administrator adds one for them
that calls ``site.addsitedir()`` to allow some other directory to
contain ``.pth`` files, they won't be able to install newer versions of
anything that's installed in the systemwide ``site-packages``, because
their paths will still be added *after* ``site-packages``.

So EasyInstall applies two workarounds to solve these problems.

The first is that EasyInstall leverages ``.pth`` files' "import" feature
to manipulate ``sys.path`` and ensure that anything EasyInstall adds
to a ``.pth`` file will always appear before both the standard library
and the local ``site-packages`` directories.  Thus, it is always
possible for a user who can write a Python-read ``.pth`` file to ensure
that their packages come first in their own environment.

Second, when installing to a ``PYTHONPATH`` directory (as opposed to
a "site" directory like ``site-packages``) EasyInstall will also install
a special version of the ``site`` module.  Because it's in a
``PYTHONPATH`` directory, this module will get control before the
standard library version of ``site`` does.  It will record the state of
``sys.path`` before invoking the "real" ``site`` module, and then
afterwards it processes any ``.pth`` files found in ``PYTHONPATH``
directories, including all the fixups needed to ensure that eggs always
appear before the standard library in sys.path, but are in a relative
order to one another that is defined by their ``PYTHONPATH`` and
``.pth``-prescribed sequence.

The net result of these changes is that ``sys.path`` order will be
as follows at runtime:

1. The ``sys.argv[0]`` directory, or an empty string if no script
   is being executed.

2. All eggs installed by EasyInstall in any ``.pth`` file in each
   ``PYTHONPATH`` directory, in order first by ``PYTHONPATH`` order,
   then normal ``.pth`` processing order (which is to say alphabetical
   by ``.pth`` filename, then by the order of listing within each
   ``.pth`` file).

3. All eggs installed by EasyInstall in any ``.pth`` file in each "site"
   directory (such as ``site-packages``), following the same ordering
   rules as for the ones on ``PYTHONPATH``.

4. The ``PYTHONPATH`` directories themselves, in their original order

5. Any paths from ``.pth`` files found on ``PYTHONPATH`` that were *not*
   eggs installed by EasyInstall, again following the same relative
   ordering rules.

6. The standard library and "site" directories, along with the contents
   of any ``.pth`` files found in the "site" directories.

Notice that sections 1, 4, and 6 comprise the "normal" Python setup for
``sys.path``.  Sections 2 and 3 are inserted to support eggs, and
section 5 emulates what the "normal" semantics of ``.pth`` files on
``PYTHONPATH`` would be if Python natively supported them.

For further discussion of the tradeoffs that went into this design, as
well as notes on the actual magic inserted into ``.pth`` files to make
them do these things, please see also the following messages to the
distutils-SIG mailing list:

* http://mail.python.org/pipermail/distutils-sig/2006-February/006026.html
* http://mail.python.org/pipermail/distutils-sig/2006-March/006123.html


Script Wrappers
---------------

EasyInstall never directly installs a project's original scripts to
a script installation directory.  Instead, it writes short wrapper
scripts that first ensure that the project's dependencies are active
on sys.path, before invoking the original script.  These wrappers
have a #! line that points to the version of Python that was used to
install them, and their second line is always a comment that indicates
the type of script wrapper, the project version required for the script
to run, and information identifying the script to be invoked.

The format of this marker line is::

    "# EASY-INSTALL-" script_type ": " tuple_of_strings "\n"

The ``script_type`` is one of ``SCRIPT``, ``DEV-SCRIPT``, or
``ENTRY-SCRIPT``.  The ``tuple_of_strings`` is a comma-separated
sequence of Python string constants.  For ``SCRIPT`` and ``DEV-SCRIPT``
wrappers, there are two strings: the project version requirement, and
the script name (as a filename within the ``scripts`` metadata
directory).  For ``ENTRY-SCRIPT`` wrappers, there are three:
the project version requirement, the entry point group name, and the
entry point name.  (See the "Automatic Script Creation" section in the
setuptools manual for more information about entry point scripts.)

In each case, the project version requirement string will be a string
parseable with the ``pkg_resources`` modules' ``Requirement.parse()``
classmethod.  The only difference between a ``SCRIPT`` wrapper and a
``DEV-SCRIPT`` is that a ``DEV-SCRIPT`` actually executes the original
source script in the project's source tree, and is created when the
"setup.py develop" command is run.  A ``SCRIPT`` wrapper, on the other
hand, uses the "installed" script written to the ``EGG-INFO/scripts``
subdirectory of the corresponding ``.egg`` zipfile or directory.
(``.egg-info`` eggs do not have script wrappers associated with them,
except in the "setup.py develop" case.)

The purpose of including the marker line in generated script wrappers is
to facilitate introspection of installed scripts, and their relationship
to installed eggs.  For example, an uninstallation tool could use this
data to identify what scripts can safely be removed, and/or identify
what scripts would stop working if a particular egg is uninstalled.
PK�(�\4W�pppp2doc/alt-python37-setuptools/docs/pkg_resources.rstnu�[���=============================================================
Package Discovery and Resource Access using ``pkg_resources``
=============================================================

The ``pkg_resources`` module distributed with ``setuptools`` provides an API
for Python libraries to access their resource files, and for extensible
applications and frameworks to automatically discover plugins.  It also
provides runtime support for using C extensions that are inside zipfile-format
eggs, support for merging packages that have separately-distributed modules or
subpackages, and APIs for managing Python's current "working set" of active
packages.

Use of ``pkg_resources`` is discouraged in favor of
`importlib.resources <https://docs.python.org/3/library/importlib.html#module-importlib.resources>`_,
`importlib.metadata <https://docs.python.org/3/library/importlib.metadata.html>`_,
and their backports (`resources <https://pypi.org/project/importlib_resources>`_,
`metadata <https://pypi.org/project/importlib_metadata>`_).
Please consider using those libraries instead of pkg_resources.


--------
Overview
--------

The ``pkg_resources`` module provides runtime facilities for finding,
introspecting, activating and using installed Python distributions. Some
of the more advanced features (notably the support for parallel installation
of multiple versions) rely specifically on the "egg" format (either as a
zip archive or subdirectory), while others (such as plugin discovery) will
work correctly so long as "egg-info" metadata directories are available for
relevant distributions.

Eggs are a distribution format for Python modules, similar in concept to
Java's "jars" or Ruby's "gems", or the "wheel" format defined in PEP 427.
However, unlike a pure distribution format, eggs can also be installed and
added directly to ``sys.path`` as an import location. When installed in
this way, eggs are *discoverable*, meaning that they carry metadata that
unambiguously identifies their contents and dependencies. This means that
an installed egg can be *automatically* found and added to ``sys.path`` in
response to simple requests of the form, "get me everything I need to use
docutils' PDF support". This feature allows mutually conflicting versions of
a distribution to co-exist in the same Python installation, with individual
applications activating the desired version at runtime by manipulating the
contents of ``sys.path`` (this differs from the virtual environment
approach, which involves creating isolated environments for each
application).

The following terms are needed in order to explain the capabilities offered
by this module:

project
    A library, framework, script, plugin, application, or collection of data
    or other resources, or some combination thereof.  Projects are assumed to
    have "relatively unique" names, e.g. names registered with PyPI.

release
    A snapshot of a project at a particular point in time, denoted by a version
    identifier.

distribution
    A file or files that represent a particular release.

importable distribution
    A file or directory that, if placed on ``sys.path``, allows Python to
    import any modules contained within it.

pluggable distribution
    An importable distribution whose filename unambiguously identifies its
    release (i.e. project and version), and whose contents unambiguously
    specify what releases of other projects will satisfy its runtime
    requirements.

extra
    An "extra" is an optional feature of a release, that may impose additional
    runtime requirements.  For example, if docutils PDF support required a
    PDF support library to be present, docutils could define its PDF support as
    an "extra", and list what other project releases need to be available in
    order to provide it.

environment
    A collection of distributions potentially available for importing, but not
    necessarily active.  More than one distribution (i.e. release version) for
    a given project may be present in an environment.

working set
    A collection of distributions actually available for importing, as on
    ``sys.path``.  At most one distribution (release version) of a given
    project may be present in a working set, as otherwise there would be
    ambiguity as to what to import.

eggs
    Eggs are pluggable distributions in one of the three formats currently
    supported by ``pkg_resources``.  There are built eggs, development eggs,
    and egg links.  Built eggs are directories or zipfiles whose name ends
    with ``.egg`` and follows the egg naming conventions, and contain an
    ``EGG-INFO`` subdirectory (zipped or otherwise).  Development eggs are
    normal directories of Python code with one or more ``ProjectName.egg-info``
    subdirectories. The development egg format is also used to provide a
    default version of a distribution that is available to software that
    doesn't use ``pkg_resources`` to request specific versions. Egg links
    are ``*.egg-link`` files that contain the name of a built or
    development egg, to support symbolic linking on platforms that do not
    have native symbolic links (or where the symbolic link support is
    limited).

(For more information about these terms and concepts, see also this
`architectural overview`_ of ``pkg_resources`` and Python Eggs in general.)

.. _architectural overview: http://mail.python.org/pipermail/distutils-sig/2005-June/004652.html


.. -----------------
.. Developer's Guide
.. -----------------

.. This section isn't written yet.  Currently planned topics include
    Accessing Resources
    Finding and Activating Package Distributions
        get_provider()
        require()
        WorkingSet
        iter_distributions
    Running Scripts
    Configuration
    Namespace Packages
    Extensible Applications and Frameworks
        Locating entry points
        Activation listeners
        Metadata access
        Extended Discovery and Installation
    Supporting Custom PEP 302 Implementations
.. For now, please check out the extensive `API Reference`_ below.


-------------
API Reference
-------------

Namespace Package Support
=========================

A namespace package is a package that only contains other packages and modules,
with no direct contents of its own.  Such packages can be split across
multiple, separately-packaged distributions.  They are normally used to split
up large packages produced by a single organization, such as in the ``zope``
namespace package for Zope Corporation packages, and the ``peak`` namespace
package for the Python Enterprise Application Kit.

To create a namespace package, you list it in the ``namespace_packages``
argument to ``setup()``, in your project's ``setup.py``.  (See the
:ref:`setuptools documentation on namespace packages <Namespace Packages>` for
more information on this.)  Also, you must add a ``declare_namespace()`` call
in the package's ``__init__.py`` file(s):

``declare_namespace(name)``
    Declare that the dotted package name ``name`` is a "namespace package" whose
    contained packages and modules may be spread across multiple distributions.
    The named package's ``__path__`` will be extended to include the
    corresponding package in all distributions on ``sys.path`` that contain a
    package of that name.  (More precisely, if an importer's
    ``find_module(name)`` returns a loader, then it will also be searched for
    the package's contents.)  Whenever a Distribution's ``activate()`` method
    is invoked, it checks for the presence of namespace packages and updates
    their ``__path__`` contents accordingly.

Applications that manipulate namespace packages or directly alter ``sys.path``
at runtime may also need to use this API function:

``fixup_namespace_packages(path_item)``
    Declare that ``path_item`` is a newly added item on ``sys.path`` that may
    need to be used to update existing namespace packages.  Ordinarily, this is
    called for you when an egg is automatically added to ``sys.path``, but if
    your application modifies ``sys.path`` to include locations that may
    contain portions of a namespace package, you will need to call this
    function to ensure they are added to the existing namespace packages.

Although by default ``pkg_resources`` only supports namespace packages for
filesystem and zip importers, you can extend its support to other "importers"
compatible with PEP 302 using the ``register_namespace_handler()`` function.
See the section below on `Supporting Custom Importers`_ for details.


``WorkingSet`` Objects
======================

The ``WorkingSet`` class provides access to a collection of "active"
distributions.  In general, there is only one meaningful ``WorkingSet``
instance: the one that represents the distributions that are currently active
on ``sys.path``.  This global instance is available under the name
``working_set`` in the ``pkg_resources`` module.  However, specialized
tools may wish to manipulate working sets that don't correspond to
``sys.path``, and therefore may wish to create other ``WorkingSet`` instances.

It's important to note that the global ``working_set`` object is initialized
from ``sys.path`` when ``pkg_resources`` is first imported, but is only updated
if you do all future ``sys.path`` manipulation via ``pkg_resources`` APIs.  If
you manually modify ``sys.path``, you must invoke the appropriate methods on
the ``working_set`` instance to keep it in sync.  Unfortunately, Python does
not provide any way to detect arbitrary changes to a list object like
``sys.path``, so ``pkg_resources`` cannot automatically update the
``working_set`` based on changes to ``sys.path``.

``WorkingSet(entries=None)``
    Create a ``WorkingSet`` from an iterable of path entries.  If ``entries``
    is not supplied, it defaults to the value of ``sys.path`` at the time
    the constructor is called.

    Note that you will not normally construct ``WorkingSet`` instances
    yourself, but instead you will implicitly or explicitly use the global
    ``working_set`` instance.  For the most part, the ``pkg_resources`` API
    is designed so that the ``working_set`` is used by default, such that you
    don't have to explicitly refer to it most of the time.

All distributions available directly on ``sys.path`` will be activated
automatically when ``pkg_resources`` is imported. This behaviour can cause
version conflicts for applications which require non-default versions of
those distributions. To handle this situation, ``pkg_resources`` checks for a
``__requires__`` attribute in the ``__main__`` module when initializing the
default working set, and uses this to ensure a suitable version of each
affected distribution is activated. For example::

    __requires__ = ["CherryPy < 3"] # Must be set before pkg_resources import
    import pkg_resources


Basic ``WorkingSet`` Methods
----------------------------

The following methods of ``WorkingSet`` objects are also available as module-
level functions in ``pkg_resources`` that apply to the default ``working_set``
instance.  Thus, you can use e.g. ``pkg_resources.require()`` as an
abbreviation for ``pkg_resources.working_set.require()``:


``require(*requirements)``
    Ensure that distributions matching ``requirements`` are activated

    ``requirements`` must be a string or a (possibly-nested) sequence
    thereof, specifying the distributions and versions required.  The
    return value is a sequence of the distributions that needed to be
    activated to fulfill the requirements; all relevant distributions are
    included, even if they were already activated in this working set.

    For the syntax of requirement specifiers, see the section below on
    `Requirements Parsing`_.

    In general, it should not be necessary for you to call this method
    directly.  It's intended more for use in quick-and-dirty scripting and
    interactive interpreter hacking than for production use. If you're creating
    an actual library or application, it's strongly recommended that you create
    a "setup.py" script using ``setuptools``, and declare all your requirements
    there.  That way, tools like pip can automatically detect what requirements
    your package has, and deal with them accordingly.

    Note that calling ``require('SomePackage')`` will not install
    ``SomePackage`` if it isn't already present.  If you need to do this, you
    should use the ``resolve()`` method instead, which allows you to pass an
    ``installer`` callback that will be invoked when a needed distribution
    can't be found on the local machine.  You can then have this callback
    display a dialog, automatically download the needed distribution, or
    whatever else is appropriate for your application. See the documentation
    below on the ``resolve()`` method for more information, and also on the
    ``obtain()`` method of ``Environment`` objects.

``run_script(requires, script_name)``
    Locate distribution specified by ``requires`` and run its ``script_name``
    script.  ``requires`` must be a string containing a requirement specifier.
    (See `Requirements Parsing`_ below for the syntax.)

    The script, if found, will be executed in *the caller's globals*.  That's
    because this method is intended to be called from wrapper scripts that
    act as a proxy for the "real" scripts in a distribution.  A wrapper script
    usually doesn't need to do anything but invoke this function with the
    correct arguments.

    If you need more control over the script execution environment, you
    probably want to use the ``run_script()`` method of a ``Distribution``
    object's `Metadata API`_ instead.

``iter_entry_points(group, name=None)``
    Yield entry point objects from ``group`` matching ``name``

    If ``name`` is None, yields all entry points in ``group`` from all
    distributions in the working set, otherwise only ones matching both
    ``group`` and ``name`` are yielded.  Entry points are yielded from the active
    distributions in the order that the distributions appear in the working
    set.  (For the global ``working_set``, this should be the same as the order
    that they are listed in ``sys.path``.)  Note that within the entry points
    advertised by an individual distribution, there is no particular ordering.

    Please see the section below on `Entry Points`_ for more information.


``WorkingSet`` Methods and Attributes
-------------------------------------

These methods are used to query or manipulate the contents of a specific
working set, so they must be explicitly invoked on a particular ``WorkingSet``
instance:

``add_entry(entry)``
    Add a path item to the ``entries``, finding any distributions on it.  You
    should use this when you add additional items to ``sys.path`` and you want
    the global ``working_set`` to reflect the change.  This method is also
    called by the ``WorkingSet()`` constructor during initialization.

    This method uses ``find_distributions(entry,True)`` to find distributions
    corresponding to the path entry, and then ``add()`` them.  ``entry`` is
    always appended to the ``entries`` attribute, even if it is already
    present, however. (This is because ``sys.path`` can contain the same value
    more than once, and the ``entries`` attribute should be able to reflect
    this.)

``__contains__(dist)``
    True if ``dist`` is active in this ``WorkingSet``.  Note that only one
    distribution for a given project can be active in a given ``WorkingSet``.

``__iter__()``
    Yield distributions for non-duplicate projects in the working set.
    The yield order is the order in which the items' path entries were
    added to the working set.

``find(req)``
    Find a distribution matching ``req`` (a ``Requirement`` instance).
    If there is an active distribution for the requested project, this
    returns it, as long as it meets the version requirement specified by
    ``req``.  But, if there is an active distribution for the project and it
    does *not* meet the ``req`` requirement, ``VersionConflict`` is raised.
    If there is no active distribution for the requested project, ``None``
    is returned.

``resolve(requirements, env=None, installer=None)``
    List all distributions needed to (recursively) meet ``requirements``

    ``requirements`` must be a sequence of ``Requirement`` objects.  ``env``,
    if supplied, should be an ``Environment`` instance.  If
    not supplied, an ``Environment`` is created from the working set's
    ``entries``.  ``installer``, if supplied, will be invoked with each
    requirement that cannot be met by an already-installed distribution; it
    should return a ``Distribution`` or ``None``.  (See the ``obtain()`` method
    of `Environment Objects`_, below, for more information on the ``installer``
    argument.)

``add(dist, entry=None)``
    Add ``dist`` to working set, associated with ``entry``

    If ``entry`` is unspecified, it defaults to ``dist.location``.  On exit from
    this routine, ``entry`` is added to the end of the working set's ``.entries``
    (if it wasn't already present).

    ``dist`` is only added to the working set if it's for a project that
    doesn't already have a distribution active in the set.  If it's
    successfully added, any  callbacks registered with the ``subscribe()``
    method will be called.  (See `Receiving Change Notifications`_, below.)

    Note: ``add()`` is automatically called for you by the ``require()``
    method, so you don't normally need to use this method directly.

``entries``
    This attribute represents a "shadow" ``sys.path``, primarily useful for
    debugging.  If you are experiencing import problems, you should check
    the global ``working_set`` object's ``entries`` against ``sys.path``, to
    ensure that they match.  If they do not, then some part of your program
    is manipulating ``sys.path`` without updating the ``working_set``
    accordingly.  IMPORTANT NOTE: do not directly manipulate this attribute!
    Setting it equal to ``sys.path`` will not fix your problem, any more than
    putting black tape over an "engine warning" light will fix your car!  If
    this attribute is out of sync with ``sys.path``, it's merely an *indicator*
    of the problem, not the cause of it.


Receiving Change Notifications
------------------------------

Extensible applications and frameworks may need to receive notification when
a new distribution (such as a plug-in component) has been added to a working
set.  This is what the ``subscribe()`` method and ``add_activation_listener()``
function are for.

``subscribe(callback)``
    Invoke ``callback(distribution)`` once for each active distribution that is
    in the set now, or gets added later.  Because the callback is invoked for
    already-active distributions, you do not need to loop over the working set
    yourself to deal with the existing items; just register the callback and
    be prepared for the fact that it will be called immediately by this method.

    Note that callbacks *must not* allow exceptions to propagate, or they will
    interfere with the operation of other callbacks and possibly result in an
    inconsistent working set state.  Callbacks should use a try/except block
    to ignore, log, or otherwise process any errors, especially since the code
    that caused the callback to be invoked is unlikely to be able to handle
    the errors any better than the callback itself.

``pkg_resources.add_activation_listener()`` is an alternate spelling of
``pkg_resources.working_set.subscribe()``.


Locating Plugins
----------------

Extensible applications will sometimes have a "plugin directory" or a set of
plugin directories, from which they want to load entry points or other
metadata.  The ``find_plugins()`` method allows you to do this, by scanning an
environment for the newest version of each project that can be safely loaded
without conflicts or missing requirements.

``find_plugins(plugin_env, full_env=None, fallback=True)``
   Scan ``plugin_env`` and identify which distributions could be added to this
   working set without version conflicts or missing requirements.

   Example usage::

       distributions, errors = working_set.find_plugins(
           Environment(plugin_dirlist)
       )
       map(working_set.add, distributions)  # add plugins+libs to sys.path
       print "Couldn't load", errors        # display errors

   The ``plugin_env`` should be an ``Environment`` instance that contains only
   distributions that are in the project's "plugin directory" or directories.
   The ``full_env``, if supplied, should be an ``Environment`` instance that
   contains all currently-available distributions.

   If ``full_env`` is not supplied, one is created automatically from the
   ``WorkingSet`` this method is called on, which will typically mean that
   every directory on ``sys.path`` will be scanned for distributions.

   This method returns a 2-tuple: (``distributions``, ``error_info``), where
   ``distributions`` is a list of the distributions found in ``plugin_env`` that
   were loadable, along with any other distributions that are needed to resolve
   their dependencies.  ``error_info`` is a dictionary mapping unloadable plugin
   distributions to an exception instance describing the error that occurred.
   Usually this will be a ``DistributionNotFound`` or ``VersionConflict``
   instance.

   Most applications will use this method mainly on the master ``working_set``
   instance in ``pkg_resources``, and then immediately add the returned
   distributions to the working set so that they are available on sys.path.
   This will make it possible to find any entry points, and allow any other
   metadata tracking and hooks to be activated.

   The resolution algorithm used by ``find_plugins()`` is as follows.  First,
   the project names of the distributions present in ``plugin_env`` are sorted.
   Then, each project's eggs are tried in descending version order (i.e.,
   newest version first).

   An attempt is made to resolve each egg's dependencies. If the attempt is
   successful, the egg and its dependencies are added to the output list and to
   a temporary copy of the working set.  The resolution process continues with
   the next project name, and no older eggs for that project are tried.

   If the resolution attempt fails, however, the error is added to the error
   dictionary.  If the ``fallback`` flag is true, the next older version of the
   plugin is tried, until a working version is found.  If false, the resolution
   process continues with the next plugin project name.

   Some applications may have stricter fallback requirements than others. For
   example, an application that has a database schema or persistent objects
   may not be able to safely downgrade a version of a package. Others may want
   to ensure that a new plugin configuration is either 100% good or else
   revert to a known-good configuration.  (That is, they may wish to revert to
   a known configuration if the ``error_info`` return value is non-empty.)

   Note that this algorithm gives precedence to satisfying the dependencies of
   alphabetically prior project names in case of version conflicts. If two
   projects named "AaronsPlugin" and "ZekesPlugin" both need different versions
   of "TomsLibrary", then "AaronsPlugin" will win and "ZekesPlugin" will be
   disabled due to version conflict.


``Environment`` Objects
=======================

An "environment" is a collection of ``Distribution`` objects, usually ones
that are present and potentially importable on the current platform.
``Environment`` objects are used by ``pkg_resources`` to index available
distributions during dependency resolution.

``Environment(search_path=None, platform=get_supported_platform(), python=PY_MAJOR)``
    Create an environment snapshot by scanning ``search_path`` for distributions
    compatible with ``platform`` and ``python``.  ``search_path`` should be a
    sequence of strings such as might be used on ``sys.path``.  If a
    ``search_path`` isn't supplied, ``sys.path`` is used.

    ``platform`` is an optional string specifying the name of the platform
    that platform-specific distributions must be compatible with.  If
    unspecified, it defaults to the current platform.  ``python`` is an
    optional string naming the desired version of Python (e.g. ``'2.4'``);
    it defaults to the currently-running version.

    You may explicitly set ``platform`` (and/or ``python``) to ``None`` if you
    wish to include *all* distributions, not just those compatible with the
    running platform or Python version.

    Note that ``search_path`` is scanned immediately for distributions, and the
    resulting ``Environment`` is a snapshot of the found distributions.  It
    is not automatically updated if the system's state changes due to e.g.
    installation or removal of distributions.

``__getitem__(project_name)``
    Returns a list of distributions for the given project name, ordered
    from newest to oldest version.  (And highest to lowest format precedence
    for distributions that contain the same version of the project.)  If there
    are no distributions for the project, returns an empty list.

``__iter__()``
    Yield the unique project names of the distributions in this environment.
    The yielded names are always in lower case.

``add(dist)``
    Add ``dist`` to the environment if it matches the platform and python version
    specified at creation time, and only if the distribution hasn't already
    been added. (i.e., adding the same distribution more than once is a no-op.)

``remove(dist)``
    Remove ``dist`` from the environment.

``can_add(dist)``
    Is distribution ``dist`` acceptable for this environment?  If it's not
    compatible with the ``platform`` and ``python`` version values specified
    when the environment was created, a false value is returned.

``__add__(dist_or_env)``  (``+`` operator)
    Add a distribution or environment to an ``Environment`` instance, returning
    a *new* environment object that contains all the distributions previously
    contained by both.  The new environment will have a ``platform`` and
    ``python`` of ``None``, meaning that it will not reject any distributions
    from being added to it; it will simply accept whatever is added.  If you
    want the added items to be filtered for platform and Python version, or
    you want to add them to the *same* environment instance, you should use
    in-place addition (``+=``) instead.

``__iadd__(dist_or_env)``  (``+=`` operator)
    Add a distribution or environment to an ``Environment`` instance
    *in-place*, updating the existing instance and returning it.  The
    ``platform`` and ``python`` filter attributes take effect, so distributions
    in the source that do not have a suitable platform string or Python version
    are silently ignored.

``best_match(req, working_set, installer=None)``
    Find distribution best matching ``req`` and usable on ``working_set``

    This calls the ``find(req)`` method of the ``working_set`` to see if a
    suitable distribution is already active.  (This may raise
    ``VersionConflict`` if an unsuitable version of the project is already
    active in the specified ``working_set``.)  If a suitable distribution isn't
    active, this method returns the newest distribution in the environment
    that meets the ``Requirement`` in ``req``.  If no suitable distribution is
    found, and ``installer`` is supplied, then the result of calling
    the environment's ``obtain(req, installer)`` method will be returned.

``obtain(requirement, installer=None)``
    Obtain a distro that matches requirement (e.g. via download).  In the
    base ``Environment`` class, this routine just returns
    ``installer(requirement)``, unless ``installer`` is None, in which case
    None is returned instead.  This method is a hook that allows subclasses
    to attempt other ways of obtaining a distribution before falling back
    to the ``installer`` argument.

``scan(search_path=None)``
    Scan ``search_path`` for distributions usable on ``platform``

    Any distributions found are added to the environment.  ``search_path`` should
    be a sequence of strings such as might be used on ``sys.path``.  If not
    supplied, ``sys.path`` is used.  Only distributions conforming to
    the platform/python version defined at initialization are added.  This
    method is a shortcut for using the ``find_distributions()`` function to
    find the distributions from each item in ``search_path``, and then calling
    ``add()`` to add each one to the environment.


``Requirement`` Objects
=======================

``Requirement`` objects express what versions of a project are suitable for
some purpose.  These objects (or their string form) are used by various
``pkg_resources`` APIs in order to find distributions that a script or
distribution needs.


Requirements Parsing
--------------------

``parse_requirements(s)``
    Yield ``Requirement`` objects for a string or iterable of lines.  Each
    requirement must start on a new line.  See below for syntax.

``Requirement.parse(s)``
    Create a ``Requirement`` object from a string or iterable of lines.  A
    ``ValueError`` is raised if the string or lines do not contain a valid
    requirement specifier, or if they contain more than one specifier.  (To
    parse multiple specifiers from a string or iterable of strings, use
    ``parse_requirements()`` instead.)

    The syntax of a requirement specifier is defined in full in PEP 508.

    Some examples of valid requirement specifiers::

        FooProject >= 1.2
        Fizzy [foo, bar]
        PickyThing>1.6,<=1.9,!=1.8.6
        SomethingWhoseVersionIDontCareAbout
        SomethingWithMarker[foo]>1.0;python_version<"2.7"

    The project name is the only required portion of a requirement string, and
    if it's the only thing supplied, the requirement will accept any version
    of that project.

    The "extras" in a requirement are used to request optional features of a
    project, that may require additional project distributions in order to
    function.  For example, if the hypothetical "Report-O-Rama" project offered
    optional PDF support, it might require an additional library in order to
    provide that support.  Thus, a project needing Report-O-Rama's PDF features
    could use a requirement of ``Report-O-Rama[PDF]`` to request installation
    or activation of both Report-O-Rama and any libraries it needs in order to
    provide PDF support.  For example, you could use::

        pip install Report-O-Rama[PDF]

    To install the necessary packages using pip, or call
    ``pkg_resources.require('Report-O-Rama[PDF]')`` to add the necessary
    distributions to sys.path at runtime.

    The "markers" in a requirement are used to specify when a requirement
    should be installed -- the requirement will be installed if the marker
    evaluates as true in the current environment. For example, specifying
    ``argparse;python_version<"3.0"`` will not install in an Python 3
    environment, but will in a Python 2 environment.

``Requirement`` Methods and Attributes
--------------------------------------

``__contains__(dist_or_version)``
    Return true if ``dist_or_version`` fits the criteria for this requirement.
    If ``dist_or_version`` is a ``Distribution`` object, its project name must
    match the requirement's project name, and its version must meet the
    requirement's version criteria.  If ``dist_or_version`` is a string, it is
    parsed using the ``parse_version()`` utility function.  Otherwise, it is
    assumed to be an already-parsed version.

    The ``Requirement`` object's version specifiers (``.specs``) are internally
    sorted into ascending version order, and used to establish what ranges of
    versions are acceptable.  Adjacent redundant conditions are effectively
    consolidated (e.g. ``">1, >2"`` produces the same results as ``">2"``, and
    ``"<2,<3"`` produces the same results as ``"<2"``). ``"!="`` versions are
    excised from the ranges they fall within.  The version being tested for
    acceptability is then checked for membership in the resulting ranges.

``__eq__(other_requirement)``
    A requirement compares equal to another requirement if they have
    case-insensitively equal project names, version specifiers, and "extras".
    (The order that extras and version specifiers are in is also ignored.)
    Equal requirements also have equal hashes, so that requirements can be
    used in sets or as dictionary keys.

``__str__()``
    The string form of a ``Requirement`` is a string that, if passed to
    ``Requirement.parse()``, would return an equal ``Requirement`` object.

``project_name``
    The name of the required project

``key``
    An all-lowercase version of the ``project_name``, useful for comparison
    or indexing.

``extras``
    A tuple of names of "extras" that this requirement calls for.  (These will
    be all-lowercase and normalized using the ``safe_extra()`` parsing utility
    function, so they may not exactly equal the extras the requirement was
    created with.)

``specs``
    A list of ``(op,version)`` tuples, sorted in ascending parsed-version
    order.  The ``op`` in each tuple is a comparison operator, represented as
    a string.  The ``version`` is the (unparsed) version number.

``marker``
    An instance of ``packaging.markers.Marker`` that allows evaluation
    against the current environment. May be None if no marker specified.

``url``
    The location to download the requirement from if specified.

Entry Points
============

Entry points are a simple way for distributions to "advertise" Python objects
(such as functions or classes) for use by other distributions.  Extensible
applications and frameworks can search for entry points with a particular name
or group, either from a specific distribution or from all active distributions
on sys.path, and then inspect or load the advertised objects at will.

Entry points belong to "groups" which are named with a dotted name similar to
a Python package or module name.  For example, the ``setuptools`` package uses
an entry point named ``distutils.commands`` in order to find commands defined
by distutils extensions.  ``setuptools`` treats the names of entry points
defined in that group as the acceptable commands for a setup script.

In a similar way, other packages can define their own entry point groups,
either using dynamic names within the group (like ``distutils.commands``), or
possibly using predefined names within the group.  For example, a blogging
framework that offers various pre- or post-publishing hooks might define an
entry point group and look for entry points named "pre_process" and
"post_process" within that group.

To advertise an entry point, a project needs to use ``setuptools`` and provide
an ``entry_points`` argument to ``setup()`` in its setup script, so that the
entry points will be included in the distribution's metadata.  For more
details, see :ref:`Advertising Behavior<dynamic discovery of services and plugins>`.

Each project distribution can advertise at most one entry point of a given
name within the same entry point group.  For example, a distutils extension
could advertise two different ``distutils.commands`` entry points, as long as
they had different names.  However, there is nothing that prevents *different*
projects from advertising entry points of the same name in the same group.  In
some cases, this is a desirable thing, since the application or framework that
uses the entry points may be calling them as hooks, or in some other way
combining them.  It is up to the application or framework to decide what to do
if multiple distributions advertise an entry point; some possibilities include
using both entry points, displaying an error message, using the first one found
in sys.path order, etc.


Convenience API
---------------

In the following functions, the ``dist`` argument can be a ``Distribution``
instance, a ``Requirement`` instance, or a string specifying a requirement
(i.e. project name, version, etc.).  If the argument is a string or
``Requirement``, the specified distribution is located (and added to sys.path
if not already present).  An error will be raised if a matching distribution is
not available.

The ``group`` argument should be a string containing a dotted identifier,
identifying an entry point group.  If you are defining an entry point group,
you should include some portion of your package's name in the group name so as
to avoid collision with other packages' entry point groups.

``load_entry_point(dist, group, name)``
    Load the named entry point from the specified distribution, or raise
    ``ImportError``.

``get_entry_info(dist, group, name)``
    Return an ``EntryPoint`` object for the given ``group`` and ``name`` from
    the specified distribution.  Returns ``None`` if the distribution has not
    advertised a matching entry point.

``get_entry_map(dist, group=None)``
    Return the distribution's entry point map for ``group``, or the full entry
    map for the distribution.  This function always returns a dictionary,
    even if the distribution advertises no entry points.  If ``group`` is given,
    the dictionary maps entry point names to the corresponding ``EntryPoint``
    object.  If ``group`` is None, the dictionary maps group names to
    dictionaries that then map entry point names to the corresponding
    ``EntryPoint`` instance in that group.

``iter_entry_points(group, name=None)``
    Yield entry point objects from ``group`` matching ``name``.

    If ``name`` is None, yields all entry points in ``group`` from all
    distributions in the working set on sys.path, otherwise only ones matching
    both ``group`` and ``name`` are yielded.  Entry points are yielded from
    the active distributions in the order that the distributions appear on
    sys.path.  (Within entry points for a particular distribution, however,
    there is no particular ordering.)

    (This API is actually a method of the global ``working_set`` object; see
    the section above on `Basic WorkingSet Methods`_ for more information.)


Creating and Parsing
--------------------

``EntryPoint(name, module_name, attrs=(), extras=(), dist=None)``
    Create an ``EntryPoint`` instance.  ``name`` is the entry point name.  The
    ``module_name`` is the (dotted) name of the module containing the advertised
    object.  ``attrs`` is an optional tuple of names to look up from the
    module to obtain the advertised object.  For example, an ``attrs`` of
    ``("foo","bar")`` and a ``module_name`` of ``"baz"`` would mean that the
    advertised object could be obtained by the following code::

        import baz
        advertised_object = baz.foo.bar

    The ``extras`` are an optional tuple of "extra feature" names that the
    distribution needs in order to provide this entry point.  When the
    entry point is loaded, these extra features are looked up in the ``dist``
    argument to find out what other distributions may need to be activated
    on sys.path; see the ``load()`` method for more details.  The ``extras``
    argument is only meaningful if ``dist`` is specified.  ``dist`` must be
    a ``Distribution`` instance.

``EntryPoint.parse(src, dist=None)`` (classmethod)
    Parse a single entry point from string ``src``

    Entry point syntax follows the form::

        name = some.module:some.attr [extra1,extra2]

    The entry name and module name are required, but the ``:attrs`` and
    ``[extras]`` parts are optional, as is the whitespace shown between
    some of the items.  The ``dist`` argument is passed through to the
    ``EntryPoint()`` constructor, along with the other values parsed from
    ``src``.

``EntryPoint.parse_group(group, lines, dist=None)`` (classmethod)
    Parse ``lines`` (a string or sequence of lines) to create a dictionary
    mapping entry point names to ``EntryPoint`` objects.  ``ValueError`` is
    raised if entry point names are duplicated, if ``group`` is not a valid
    entry point group name, or if there are any syntax errors.  (Note: the
    ``group`` parameter is used only for validation and to create more
    informative error messages.)  If ``dist`` is provided, it will be used to
    set the ``dist`` attribute of the created ``EntryPoint`` objects.

``EntryPoint.parse_map(data, dist=None)`` (classmethod)
    Parse ``data`` into a dictionary mapping group names to dictionaries mapping
    entry point names to ``EntryPoint`` objects.  If ``data`` is a dictionary,
    then the keys are used as group names and the values are passed to
    ``parse_group()`` as the ``lines`` argument.  If ``data`` is a string or
    sequence of lines, it is first split into .ini-style sections (using
    the ``split_sections()`` utility function) and the section names are used
    as group names.  In either case, the ``dist`` argument is passed through to
    ``parse_group()`` so that the entry points will be linked to the specified
    distribution.


``EntryPoint`` Objects
----------------------

For simple introspection, ``EntryPoint`` objects have attributes that
correspond exactly to the constructor argument names: ``name``,
``module_name``, ``attrs``, ``extras``, and ``dist`` are all available.  In
addition, the following methods are provided:

``load()``
    Load the entry point, returning the advertised Python object.  Effectively
    calls ``self.require()`` then returns ``self.resolve()``.

``require(env=None, installer=None)``
    Ensure that any "extras" needed by the entry point are available on
    sys.path.  ``UnknownExtra`` is raised if the ``EntryPoint`` has ``extras``,
    but no ``dist``, or if the named extras are not defined by the
    distribution.  If ``env`` is supplied, it must be an ``Environment``, and it
    will be used to search for needed distributions if they are not already
    present on sys.path.  If ``installer`` is supplied, it must be a callable
    taking a ``Requirement`` instance and returning a matching importable
    ``Distribution`` instance or None.

``resolve()``
    Resolve the entry point from its module and attrs, returning the advertised
    Python object. Raises ``ImportError`` if it cannot be obtained.

``__str__()``
    The string form of an ``EntryPoint`` is a string that could be passed to
    ``EntryPoint.parse()`` to produce an equivalent ``EntryPoint``.


``Distribution`` Objects
========================

``Distribution`` objects represent collections of Python code that may or may
not be importable, and may or may not have metadata and resources associated
with them.  Their metadata may include information such as what other projects
the distribution depends on, what entry points the distribution advertises, and
so on.


Getting or Creating Distributions
---------------------------------

Most commonly, you'll obtain ``Distribution`` objects from a ``WorkingSet`` or
an ``Environment``.  (See the sections above on `WorkingSet Objects`_ and
`Environment Objects`_, which are containers for active distributions and
available distributions, respectively.)  You can also obtain ``Distribution``
objects from one of these high-level APIs:

``find_distributions(path_item, only=False)``
    Yield distributions accessible via ``path_item``.  If ``only`` is true, yield
    only distributions whose ``location`` is equal to ``path_item``.  In other
    words, if ``only`` is true, this yields any distributions that would be
    importable if ``path_item`` were on ``sys.path``.  If ``only`` is false, this
    also yields distributions that are "in" or "under" ``path_item``, but would
    not be importable unless their locations were also added to ``sys.path``.

``get_distribution(dist_spec)``
    Return a ``Distribution`` object for a given ``Requirement`` or string.
    If ``dist_spec`` is already a ``Distribution`` instance, it is returned.
    If it is a ``Requirement`` object or a string that can be parsed into one,
    it is used to locate and activate a matching distribution, which is then
    returned.

However, if you're creating specialized tools for working with distributions,
or creating a new distribution format, you may also need to create
``Distribution`` objects directly, using one of the three constructors below.

These constructors all take an optional ``metadata`` argument, which is used to
access any resources or metadata associated with the distribution.  ``metadata``
must be an object that implements the ``IResourceProvider`` interface, or None.
If it is None, an ``EmptyProvider`` is used instead.  ``Distribution`` objects
implement both the `IResourceProvider`_ and `IMetadataProvider Methods`_ by
delegating them to the ``metadata`` object.

``Distribution.from_location(location, basename, metadata=None, **kw)`` (classmethod)
    Create a distribution for ``location``, which must be a string such as a
    URL, filename, or other string that might be used on ``sys.path``.
    ``basename`` is a string naming the distribution, like ``Foo-1.2-py2.4.egg``.
    If ``basename`` ends with ``.egg``, then the project's name, version, python
    version and platform are extracted from the filename and used to set those
    properties of the created distribution.  Any additional keyword arguments
    are forwarded to the ``Distribution()`` constructor.

``Distribution.from_filename(filename, metadata=None**kw)`` (classmethod)
    Create a distribution by parsing a local filename.  This is a shorter way
    of saying  ``Distribution.from_location(normalize_path(filename),
    os.path.basename(filename), metadata)``.  In other words, it creates a
    distribution whose location is the normalize form of the filename, parsing
    name and version information from the base portion of the filename.  Any
    additional keyword arguments are forwarded to the ``Distribution()``
    constructor.

``Distribution(location,metadata,project_name,version,py_version,platform,precedence)``
    Create a distribution by setting its properties.  All arguments are
    optional and default to None, except for ``py_version`` (which defaults to
    the current Python version) and ``precedence`` (which defaults to
    ``EGG_DIST``; for more details see ``precedence`` under `Distribution
    Attributes`_ below).  Note that it's usually easier to use the
    ``from_filename()`` or ``from_location()`` constructors than to specify
    all these arguments individually.


``Distribution`` Attributes
---------------------------

location
    A string indicating the distribution's location.  For an importable
    distribution, this is the string that would be added to ``sys.path`` to
    make it actively importable.  For non-importable distributions, this is
    simply a filename, URL, or other way of locating the distribution.

project_name
    A string, naming the project that this distribution is for.  Project names
    are defined by a project's setup script, and they are used to identify
    projects on PyPI.  When a ``Distribution`` is constructed, the
    ``project_name`` argument is passed through the ``safe_name()`` utility
    function to filter out any unacceptable characters.

key
    ``dist.key`` is short for ``dist.project_name.lower()``.  It's used for
    case-insensitive comparison and indexing of distributions by project name.

extras
    A list of strings, giving the names of extra features defined by the
    project's dependency list (the ``extras_require`` argument specified in
    the project's setup script).

version
    A string denoting what release of the project this distribution contains.
    When a ``Distribution`` is constructed, the ``version`` argument is passed
    through the ``safe_version()`` utility function to filter out any
    unacceptable characters.  If no ``version`` is specified at construction
    time, then attempting to access this attribute later will cause the
    ``Distribution`` to try to discover its version by reading its ``PKG-INFO``
    metadata file.  If ``PKG-INFO`` is unavailable or can't be parsed,
    ``ValueError`` is raised.

parsed_version
    The ``parsed_version`` is an object representing a "parsed" form of the
    distribution's ``version``.  ``dist.parsed_version`` is a shortcut for
    calling ``parse_version(dist.version)``.  It is used to compare or sort
    distributions by version.  (See the `Parsing Utilities`_ section below for
    more information on the ``parse_version()`` function.)  Note that accessing
    ``parsed_version`` may result in a ``ValueError`` if the ``Distribution``
    was constructed without a ``version`` and without ``metadata`` capable of
    supplying the missing version info.

py_version
    The major/minor Python version the distribution supports, as a string.
    For example, "2.7" or "3.4".  The default is the current version of Python.

platform
    A string representing the platform the distribution is intended for, or
    ``None`` if the distribution is "pure Python" and therefore cross-platform.
    See `Platform Utilities`_ below for more information on platform strings.

precedence
    A distribution's ``precedence`` is used to determine the relative order of
    two distributions that have the same ``project_name`` and
    ``parsed_version``.  The default precedence is ``pkg_resources.EGG_DIST``,
    which is the highest (i.e. most preferred) precedence.  The full list
    of predefined precedences, from most preferred to least preferred, is:
    ``EGG_DIST``, ``BINARY_DIST``, ``SOURCE_DIST``, ``CHECKOUT_DIST``, and
    ``DEVELOP_DIST``.  Normally, precedences other than ``EGG_DIST`` are used
    only by the ``setuptools.package_index`` module, when sorting distributions
    found in a package index to determine their suitability for installation.
    "System" and "Development" eggs (i.e., ones that use the ``.egg-info``
    format), however, are automatically given a precedence of ``DEVELOP_DIST``.



``Distribution`` Methods
------------------------

``activate(path=None)``
    Ensure distribution is importable on ``path``.  If ``path`` is None,
    ``sys.path`` is used instead.  This ensures that the distribution's
    ``location`` is in the ``path`` list, and it also performs any necessary
    namespace package fixups or declarations.  (That is, if the distribution
    contains namespace packages, this method ensures that they are declared,
    and that the distribution's contents for those namespace packages are
    merged with the contents provided by any other active distributions.  See
    the section above on `Namespace Package Support`_ for more information.)

    ``pkg_resources`` adds a notification callback to the global ``working_set``
    that ensures this method is called whenever a distribution is added to it.
    Therefore, you should not normally need to explicitly call this method.
    (Note that this means that namespace packages on ``sys.path`` are always
    imported as soon as ``pkg_resources`` is, which is another reason why
    namespace packages should not contain any code or import statements.)

``as_requirement()``
    Return a ``Requirement`` instance that matches this distribution's project
    name and version.

``requires(extras=())``
    List the ``Requirement`` objects that specify this distribution's
    dependencies.  If ``extras`` is specified, it should be a sequence of names
    of "extras" defined by the distribution, and the list returned will then
    include any dependencies needed to support the named "extras".

``clone(**kw)``
    Create a copy of the distribution.  Any supplied keyword arguments override
    the corresponding argument to the ``Distribution()`` constructor, allowing
    you to change some of the copied distribution's attributes.

``egg_name()``
    Return what this distribution's standard filename should be, not including
    the ".egg" extension.  For example, a distribution for project "Foo"
    version 1.2 that runs on Python 2.3 for Windows would have an ``egg_name()``
    of ``Foo-1.2-py2.3-win32``.  Any dashes in the name or version are
    converted to underscores.  (``Distribution.from_location()`` will convert
    them back when parsing a ".egg" file name.)

``__cmp__(other)``, ``__hash__()``
    Distribution objects are hashed and compared on the basis of their parsed
    version and precedence, followed by their key (lowercase project name),
    location, Python version, and platform.

The following methods are used to access ``EntryPoint`` objects advertised
by the distribution.  See the section above on `Entry Points`_ for more
detailed information about these operations:

``get_entry_info(group, name)``
    Return the ``EntryPoint`` object for ``group`` and ``name``, or None if no
    such point is advertised by this distribution.

``get_entry_map(group=None)``
    Return the entry point map for ``group``.  If ``group`` is None, return
    a dictionary mapping group names to entry point maps for all groups.
    (An entry point map is a dictionary of entry point names to ``EntryPoint``
    objects.)

``load_entry_point(group, name)``
    Short for ``get_entry_info(group, name).load()``.  Returns the object
    advertised by the named entry point, or raises ``ImportError`` if
    the entry point isn't advertised by this distribution, or there is some
    other import problem.

In addition to the above methods, ``Distribution`` objects also implement all
of the `IResourceProvider`_ and `IMetadataProvider Methods`_ (which are
documented in later sections):

* ``has_metadata(name)``
* ``metadata_isdir(name)``
* ``metadata_listdir(name)``
* ``get_metadata(name)``
* ``get_metadata_lines(name)``
* ``run_script(script_name, namespace)``
* ``get_resource_filename(manager, resource_name)``
* ``get_resource_stream(manager, resource_name)``
* ``get_resource_string(manager, resource_name)``
* ``has_resource(resource_name)``
* ``resource_isdir(resource_name)``
* ``resource_listdir(resource_name)``

If the distribution was created with a ``metadata`` argument, these resource and
metadata access methods are all delegated to that ``metadata`` provider.
Otherwise, they are delegated to an ``EmptyProvider``, so that the distribution
will appear to have no resources or metadata.  This delegation approach is used
so that supporting custom importers or new distribution formats can be done
simply by creating an appropriate `IResourceProvider`_ implementation; see the
section below on `Supporting Custom Importers`_ for more details.

.. _ResourceManager API:

``ResourceManager`` API
=======================

The ``ResourceManager`` class provides uniform access to package resources,
whether those resources exist as files and directories or are compressed in
an archive of some kind.

Normally, you do not need to create or explicitly manage ``ResourceManager``
instances, as the ``pkg_resources`` module creates a global instance for you,
and makes most of its methods available as top-level names in the
``pkg_resources`` module namespace.  So, for example, this code actually
calls the ``resource_string()`` method of the global ``ResourceManager``::

    import pkg_resources
    my_data = pkg_resources.resource_string(__name__, "foo.dat")

Thus, you can use the APIs below without needing an explicit
``ResourceManager`` instance; just import and use them as needed.


Basic Resource Access
---------------------

In the following methods, the ``package_or_requirement`` argument may be either
a Python package/module name (e.g. ``foo.bar``) or a ``Requirement`` instance.
If it is a package or module name, the named module or package must be
importable (i.e., be in a distribution or directory on ``sys.path``), and the
``resource_name`` argument is interpreted relative to the named package.  (Note
that if a module name is used, then the resource name is relative to the
package immediately containing the named module.  Also, you should not use use
a namespace package name, because a namespace package can be spread across
multiple distributions, and is therefore ambiguous as to which distribution
should be searched for the resource.)

If it is a ``Requirement``, then the requirement is automatically resolved
(searching the current ``Environment`` if necessary) and a matching
distribution is added to the ``WorkingSet`` and ``sys.path`` if one was not
already present.  (Unless the ``Requirement`` can't be satisfied, in which
case an exception is raised.)  The ``resource_name`` argument is then interpreted
relative to the root of the identified distribution; i.e. its first path
segment will be treated as a peer of the top-level modules or packages in the
distribution.

Note that resource names must be ``/``-separated paths rooted at the package,
cannot contain relative names like ``".."``, and cannot be absolute.  Do *not* use
``os.path`` routines to manipulate resource paths, as they are *not* filesystem
paths.

``resource_exists(package_or_requirement, resource_name)``
    Does the named resource exist?  Return ``True`` or ``False`` accordingly.

``resource_stream(package_or_requirement, resource_name)``
    Return a readable file-like object for the specified resource; it may be
    an actual file, a ``StringIO``, or some similar object.  The stream is
    in "binary mode", in the sense that whatever bytes are in the resource
    will be read as-is.

``resource_string(package_or_requirement, resource_name)``
    Return the specified resource as a string.  The resource is read in
    binary fashion, such that the returned string contains exactly the bytes
    that are stored in the resource.

``resource_isdir(package_or_requirement, resource_name)``
    Is the named resource a directory?  Return ``True`` or ``False``
    accordingly.

``resource_listdir(package_or_requirement, resource_name)``
    List the contents of the named resource directory, just like ``os.listdir``
    except that it works even if the resource is in a zipfile.

Note that only ``resource_exists()`` and ``resource_isdir()`` are insensitive
as to the resource type.  You cannot use ``resource_listdir()`` on a file
resource, and you can't use ``resource_string()`` or ``resource_stream()`` on
directory resources.  Using an inappropriate method for the resource type may
result in an exception or undefined behavior, depending on the platform and
distribution format involved.


Resource Extraction
-------------------

``resource_filename(package_or_requirement, resource_name)``
    Sometimes, it is not sufficient to access a resource in string or stream
    form, and a true filesystem filename is needed.  In such cases, you can
    use this method (or module-level function) to obtain a filename for a
    resource.  If the resource is in an archive distribution (such as a zipped
    egg), it will be extracted to a cache directory, and the filename within
    the cache will be returned.  If the named resource is a directory, then
    all resources within that directory (including subdirectories) are also
    extracted.  If the named resource is a C extension or "eager resource"
    (see the ``setuptools`` documentation for details), then all C extensions
    and eager resources are extracted at the same time.

    Archived resources are extracted to a cache location that can be managed by
    the following two methods:

``set_extraction_path(path)``
    Set the base path where resources will be extracted to, if needed.

    If you do not call this routine before any extractions take place, the
    path defaults to the return value of ``get_default_cache()``.  (Which is
    based on the ``PYTHON_EGG_CACHE`` environment variable, with various
    platform-specific fallbacks.  See that routine's documentation for more
    details.)

    Resources are extracted to subdirectories of this path based upon
    information given by the resource provider.  You may set this to a
    temporary directory, but then you must call ``cleanup_resources()`` to
    delete the extracted files when done.  There is no guarantee that
    ``cleanup_resources()`` will be able to remove all extracted files.  (On
    Windows, for example, you can't unlink .pyd or .dll files that are still
    in use.)

    Note that you may not change the extraction path for a given resource
    manager once resources have been extracted, unless you first call
    ``cleanup_resources()``.

``cleanup_resources(force=False)``
    Delete all extracted resource files and directories, returning a list
    of the file and directory names that could not be successfully removed.
    This function does not have any concurrency protection, so it should
    generally only be called when the extraction path is a temporary
    directory exclusive to a single process.  This method is not
    automatically called; you must call it explicitly or register it as an
    ``atexit`` function if you wish to ensure cleanup of a temporary
    directory used for extractions.


"Provider" Interface
--------------------

If you are implementing an ``IResourceProvider`` and/or ``IMetadataProvider``
for a new distribution archive format, you may need to use the following
``IResourceManager`` methods to coordinate extraction of resources to the
filesystem.  If you're not implementing an archive format, however, you have
no need to use these methods.  Unlike the other methods listed above, they are
*not* available as top-level functions tied to the global ``ResourceManager``;
you must therefore have an explicit ``ResourceManager`` instance to use them.

``get_cache_path(archive_name, names=())``
    Return absolute location in cache for ``archive_name`` and ``names``

    The parent directory of the resulting path will be created if it does
    not already exist.  ``archive_name`` should be the base filename of the
    enclosing egg (which may not be the name of the enclosing zipfile!),
    including its ".egg" extension.  ``names``, if provided, should be a
    sequence of path name parts "under" the egg's extraction location.

    This method should only be called by resource providers that need to
    obtain an extraction location, and only for names they intend to
    extract, as it tracks the generated names for possible cleanup later.

``extraction_error()``
    Raise an ``ExtractionError`` describing the active exception as interfering
    with the extraction process.  You should call this if you encounter any
    OS errors extracting the file to the cache path; it will format the
    operating system exception for you, and add other information to the
    ``ExtractionError`` instance that may be needed by programs that want to
    wrap or handle extraction errors themselves.

``postprocess(tempname, filename)``
    Perform any platform-specific postprocessing of ``tempname``.
    Resource providers should call this method ONLY after successfully
    extracting a compressed resource.  They must NOT call it on resources
    that are already in the filesystem.

    ``tempname`` is the current (temporary) name of the file, and ``filename``
    is the name it will be renamed to by the caller after this routine
    returns.


Metadata API
============

The metadata API is used to access metadata resources bundled in a pluggable
distribution.  Metadata resources are virtual files or directories containing
information about the distribution, such as might be used by an extensible
application or framework to connect "plugins".  Like other kinds of resources,
metadata resource names are ``/``-separated and should not contain ``..`` or
begin with a ``/``.  You should not use ``os.path`` routines to manipulate
resource paths.

The metadata API is provided by objects implementing the ``IMetadataProvider``
or ``IResourceProvider`` interfaces.  ``Distribution`` objects implement this
interface, as do objects returned by the ``get_provider()`` function:

``get_provider(package_or_requirement)``
    If a package name is supplied, return an ``IResourceProvider`` for the
    package.  If a ``Requirement`` is supplied, resolve it by returning a
    ``Distribution`` from the current working set (searching the current
    ``Environment`` if necessary and adding the newly found ``Distribution``
    to the working set).  If the named package can't be imported, or the
    ``Requirement`` can't be satisfied, an exception is raised.

    NOTE: if you use a package name rather than a ``Requirement``, the object
    you get back may not be a pluggable distribution, depending on the method
    by which the package was installed.  In particular, "development" packages
    and "single-version externally-managed" packages do not have any way to
    map from a package name to the corresponding project's metadata.  Do not
    write code that passes a package name to ``get_provider()`` and then tries
    to retrieve project metadata from the returned object.  It may appear to
    work when the named package is in an ``.egg`` file or directory, but
    it will fail in other installation scenarios.  If you want project
    metadata, you need to ask for a *project*, not a package.


``IMetadataProvider`` Methods
-----------------------------

The methods provided by objects (such as ``Distribution`` instances) that
implement the ``IMetadataProvider`` or ``IResourceProvider`` interfaces are:

``has_metadata(name)``
    Does the named metadata resource exist?

``metadata_isdir(name)``
    Is the named metadata resource a directory?

``metadata_listdir(name)``
    List of metadata names in the directory (like ``os.listdir()``)

``get_metadata(name)``
    Return the named metadata resource as a string.  The data is read in binary
    mode; i.e., the exact bytes of the resource file are returned.

``get_metadata_lines(name)``
    Yield named metadata resource as list of non-blank non-comment lines.  This
    is short for calling ``yield_lines(provider.get_metadata(name))``.  See the
    section on `yield_lines()`_ below for more information on the syntax it
    recognizes.

``run_script(script_name, namespace)``
    Execute the named script in the supplied namespace dictionary.  Raises
    ``ResolutionError`` if there is no script by that name in the ``scripts``
    metadata directory.  ``namespace`` should be a Python dictionary, usually
    a module dictionary if the script is being run as a module.


Exceptions
==========

``pkg_resources`` provides a simple exception hierarchy for problems that may
occur when processing requests to locate and activate packages::

    ResolutionError
        DistributionNotFound
        VersionConflict
        UnknownExtra

    ExtractionError

``ResolutionError``
    This class is used as a base class for the other three exceptions, so that
    you can catch all of them with a single "except" clause.  It is also raised
    directly for miscellaneous requirement-resolution problems like trying to
    run a script that doesn't exist in the distribution it was requested from.

``DistributionNotFound``
    A distribution needed to fulfill a requirement could not be found.

``VersionConflict``
    The requested version of a project conflicts with an already-activated
    version of the same project.

``UnknownExtra``
    One of the "extras" requested was not recognized by the distribution it
    was requested from.

``ExtractionError``
    A problem occurred extracting a resource to the Python Egg cache.  The
    following attributes are available on instances of this exception:

    manager
        The resource manager that raised this exception

    cache_path
        The base directory for resource extraction

    original_error
        The exception instance that caused extraction to fail


Supporting Custom Importers
===========================

By default, ``pkg_resources`` supports normal filesystem imports, and
``zipimport`` importers.  If you wish to use the ``pkg_resources`` features
with other (PEP 302-compatible) importers or module loaders, you may need to
register various handlers and support functions using these APIs:

``register_finder(importer_type, distribution_finder)``
    Register ``distribution_finder`` to find distributions in ``sys.path`` items.
    ``importer_type`` is the type or class of a PEP 302 "Importer" (``sys.path``
    item handler), and ``distribution_finder`` is a callable that, when passed a
    path item, the importer instance, and an ``only`` flag, yields
    ``Distribution`` instances found under that path item.  (The ``only`` flag,
    if true, means the finder should yield only ``Distribution`` objects whose
    ``location`` is equal to the path item provided.)

    See the source of the ``pkg_resources.find_on_path`` function for an
    example finder function.

``register_loader_type(loader_type, provider_factory)``
    Register ``provider_factory`` to make ``IResourceProvider`` objects for
    ``loader_type``.  ``loader_type`` is the type or class of a PEP 302
    ``module.__loader__``, and ``provider_factory`` is a function that, when
    passed a module object, returns an `IResourceProvider`_ for that module,
    allowing it to be used with the `ResourceManager API`_.

``register_namespace_handler(importer_type, namespace_handler)``
    Register ``namespace_handler`` to declare namespace packages for the given
    ``importer_type``.  ``importer_type`` is the type or class of a PEP 302
    "importer" (sys.path item handler), and ``namespace_handler`` is a callable
    with a signature like this::

        def namespace_handler(importer, path_entry, moduleName, module):
            # return a path_entry to use for child packages

    Namespace handlers are only called if the relevant importer object has
    already agreed that it can handle the relevant path item.  The handler
    should only return a subpath if the module ``__path__`` does not already
    contain an equivalent subpath.  Otherwise, it should return None.

    For an example namespace handler, see the source of the
    ``pkg_resources.file_ns_handler`` function, which is used for both zipfile
    importing and regular importing.


IResourceProvider
-----------------

``IResourceProvider`` is an abstract class that documents what methods are
required of objects returned by a ``provider_factory`` registered with
``register_loader_type()``.  ``IResourceProvider`` is a subclass of
``IMetadataProvider``, so objects that implement this interface must also
implement all of the `IMetadataProvider Methods`_ as well as the methods
shown here.  The ``manager`` argument to the methods below must be an object
that supports the full `ResourceManager API`_ documented above.

``get_resource_filename(manager, resource_name)``
    Return a true filesystem path for ``resource_name``, coordinating the
    extraction with ``manager``, if the resource must be unpacked to the
    filesystem.

``get_resource_stream(manager, resource_name)``
    Return a readable file-like object for ``resource_name``.

``get_resource_string(manager, resource_name)``
    Return a string containing the contents of ``resource_name``.

``has_resource(resource_name)``
    Does the package contain the named resource?

``resource_isdir(resource_name)``
    Is the named resource a directory?  Return a false value if the resource
    does not exist or is not a directory.

``resource_listdir(resource_name)``
    Return a list of the contents of the resource directory, ala
    ``os.listdir()``.  Requesting the contents of a non-existent directory may
    raise an exception.

Note, by the way, that your provider classes need not (and should not) subclass
``IResourceProvider`` or ``IMetadataProvider``!  These classes exist solely
for documentation purposes and do not provide any useful implementation code.
You may instead wish to subclass one of the `built-in resource providers`_.


Built-in Resource Providers
---------------------------

``pkg_resources`` includes several provider classes that are automatically used
where appropriate.  Their inheritance tree looks like this::

    NullProvider
        EggProvider
            DefaultProvider
                PathMetadata
            ZipProvider
                EggMetadata
        EmptyProvider
            FileMetadata


``NullProvider``
    This provider class is just an abstract base that provides for common
    provider behaviors (such as running scripts), given a definition for just
    a few abstract methods.

``EggProvider``
    This provider class adds in some egg-specific features that are common
    to zipped and unzipped eggs.

``DefaultProvider``
    This provider class is used for unpacked eggs and "plain old Python"
    filesystem modules.

``ZipProvider``
    This provider class is used for all zipped modules, whether they are eggs
    or not.

``EmptyProvider``
    This provider class always returns answers consistent with a provider that
    has no metadata or resources.  ``Distribution`` objects created without
    a ``metadata`` argument use an instance of this provider class instead.
    Since all ``EmptyProvider`` instances are equivalent, there is no need
    to have more than one instance.  ``pkg_resources`` therefore creates a
    global instance of this class under the name ``empty_provider``, and you
    may use it if you have need of an ``EmptyProvider`` instance.

``PathMetadata(path, egg_info)``
    Create an ``IResourceProvider`` for a filesystem-based distribution, where
    ``path`` is the filesystem location of the importable modules, and ``egg_info``
    is the filesystem location of the distribution's metadata directory.
    ``egg_info`` should usually be the ``EGG-INFO`` subdirectory of ``path`` for an
    "unpacked egg", and a ``ProjectName.egg-info`` subdirectory of ``path`` for
    a "development egg".  However, other uses are possible for custom purposes.

``EggMetadata(zipimporter)``
    Create an ``IResourceProvider`` for a zipfile-based distribution.  The
    ``zipimporter`` should be a ``zipimport.zipimporter`` instance, and may
    represent a "basket" (a zipfile containing multiple ".egg" subdirectories)
    a specific egg *within* a basket, or a zipfile egg (where the zipfile
    itself is a ".egg").  It can also be a combination, such as a zipfile egg
    that also contains other eggs.

``FileMetadata(path_to_pkg_info)``
    Create an ``IResourceProvider`` that provides exactly one metadata
    resource: ``PKG-INFO``.  The supplied path should be a distutils PKG-INFO
    file.  This is basically the same as an ``EmptyProvider``, except that
    requests for ``PKG-INFO`` will be answered using the contents of the
    designated file.  (This provider is used to wrap ``.egg-info`` files
    installed by vendor-supplied system packages.)


Utility Functions
=================

In addition to its high-level APIs, ``pkg_resources`` also includes several
generally-useful utility routines.  These routines are used to implement the
high-level APIs, but can also be quite useful by themselves.


Parsing Utilities
-----------------

``parse_version(version)``
    Parsed a project's version string as defined by PEP 440. The returned
    value will be an object that represents the version. These objects may
    be compared to each other and sorted. The sorting algorithm is as defined
    by PEP 440 with the addition that any version which is not a valid PEP 440
    version will be considered less than any valid PEP 440 version and the
    invalid versions will continue sorting using the original algorithm.

.. _yield_lines():

``yield_lines(strs)``
    Yield non-empty/non-comment lines from a string/unicode or a possibly-
    nested sequence thereof.  If ``strs`` is an instance of ``basestring``, it
    is split into lines, and each non-blank, non-comment line is yielded after
    stripping leading and trailing whitespace.  (Lines whose first non-blank
    character is ``#`` are considered comment lines.)

    If ``strs`` is not an instance of ``basestring``, it is iterated over, and
    each item is passed recursively to ``yield_lines()``, so that an arbitrarily
    nested sequence of strings, or sequences of sequences of strings can be
    flattened out to the lines contained therein.  So for example, passing
    a file object or a list of strings to ``yield_lines`` will both work.
    (Note that between each string in a sequence of strings there is assumed to
    be an implicit line break, so lines cannot bridge two strings in a
    sequence.)

    This routine is used extensively by ``pkg_resources`` to parse metadata
    and file formats of various kinds, and most other ``pkg_resources``
    parsing functions that yield multiple values will use it to break up their
    input.  However, this routine is idempotent, so calling ``yield_lines()``
    on the output of another call to ``yield_lines()`` is completely harmless.

``split_sections(strs)``
    Split a string (or possibly-nested iterable thereof), yielding ``(section,
    content)`` pairs found using an ``.ini``-like syntax.  Each ``section`` is
    a whitespace-stripped version of the section name ("``[section]``")
    and each ``content`` is a list of stripped lines excluding blank lines and
    comment-only lines.  If there are any non-blank, non-comment lines before
    the first section header, they're yielded in a first ``section`` of
    ``None``.

    This routine uses ``yield_lines()`` as its front end, so you can pass in
    anything that ``yield_lines()`` accepts, such as an open text file, string,
    or sequence of strings.  ``ValueError`` is raised if a malformed section
    header is found (i.e. a line starting with ``[`` but not ending with
    ``]``).

    Note that this simplistic parser assumes that any line whose first nonblank
    character is ``[`` is a section heading, so it can't support .ini format
    variations that allow ``[`` as the first nonblank character on other lines.

``safe_name(name)``
    Return a "safe" form of a project's name, suitable for use in a
    ``Requirement`` string, as a distribution name, or a PyPI project name.
    All non-alphanumeric runs are condensed to single "-" characters, such that
    a name like "The $$$ Tree" becomes "The-Tree".  Note that if you are
    generating a filename from this value you should combine it with a call to
    ``to_filename()`` so all dashes ("-") are replaced by underscores ("_").
    See ``to_filename()``.

``safe_version(version)``
    This will return the normalized form of any PEP 440 version. If the version
    string is not PEP 440 compatible, this function behaves similar to
    ``safe_name()`` except that spaces in the input become dots, and dots are
    allowed to exist in the output.  As with ``safe_name()``, if you are
    generating a filename from this you should replace any "-" characters in
    the output with underscores.

``safe_extra(extra)``
    Return a "safe" form of an extra's name, suitable for use in a requirement
    string or a setup script's ``extras_require`` keyword.  This routine is
    similar to ``safe_name()`` except that non-alphanumeric runs are replaced
    by a single underbar (``_``), and the result is lowercased.

``to_filename(name_or_version)``
    Escape a name or version string so it can be used in a dash-separated
    filename (or ``#egg=name-version`` tag) without ambiguity.  You
    should only pass in values that were returned by ``safe_name()`` or
    ``safe_version()``.


Platform Utilities
------------------

``get_build_platform()``
    Return this platform's identifier string.  For Windows, the return value
    is ``"win32"``, and for macOS it is a string of the form
    ``"macosx-10.4-ppc"``.  All other platforms return the same uname-based
    string that the ``distutils.util.get_platform()`` function returns.
    This string is the minimum platform version required by distributions built
    on the local machine.  (Backward compatibility note: setuptools versions
    prior to 0.6b1 called this function ``get_platform()``, and the function is
    still available under that name for backward compatibility reasons.)

``get_supported_platform()`` (New in 0.6b1)
    This is the similar to ``get_build_platform()``, but is the maximum
    platform version that the local machine supports.  You will usually want
    to use this value as the ``provided`` argument to the
    ``compatible_platforms()`` function.

``compatible_platforms(provided, required)``
    Return true if a distribution built on the ``provided`` platform may be used
    on the ``required`` platform.  If either platform value is ``None``, it is
    considered a wildcard, and the platforms are therefore compatible.
    Likewise, if the platform strings are equal, they're also considered
    compatible, and ``True`` is returned.  Currently, the only non-equal
    platform strings that are considered compatible are macOS platform
    strings with the same hardware type (e.g. ``ppc``) and major version
    (e.g. ``10``) with the ``provided`` platform's minor version being less than
    or equal to the ``required`` platform's minor version.

``get_default_cache()``
    Determine the default cache location for extracting resources from zipped
    eggs.  This routine returns the ``PYTHON_EGG_CACHE`` environment variable,
    if set.  Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of
    the user's "Application Data" directory.  On all other systems, it returns
    ``os.path.expanduser("~/.python-eggs")`` if ``PYTHON_EGG_CACHE`` is not
    set.


PEP 302 Utilities
-----------------

``get_importer(path_item)``
    A deprecated alias for ``pkgutil.get_importer()``


File/Path Utilities
-------------------

``ensure_directory(path)``
    Ensure that the parent directory (``os.path.dirname``) of ``path`` actually
    exists, using ``os.makedirs()`` if necessary.

``normalize_path(path)``
    Return a "normalized" version of ``path``, such that two paths represent
    the same filesystem location if they have equal ``normalized_path()``
    values.  Specifically, this is a shortcut for calling ``os.path.realpath``
    and ``os.path.normcase`` on ``path``.  Unfortunately, on certain platforms
    (notably Cygwin and macOS) the ``normcase`` function does not accurately
    reflect the platform's case-sensitivity, so there is always the possibility
    of two apparently-different paths being equal on such platforms.

History
-------

0.6c9
 * Fix ``resource_listdir('')`` always returning an empty list for zipped eggs.

0.6c7
 * Fix package precedence problem where single-version eggs installed in
   ``site-packages`` would take precedence over ``.egg`` files (or directories)
   installed in ``site-packages``.

0.6c6
 * Fix extracted C extensions not having executable permissions under Cygwin.

 * Allow ``.egg-link`` files to contain relative paths.

 * Fix cache dir defaults on Windows when multiple environment vars are needed
   to construct a path.

0.6c4
 * Fix "dev" versions being considered newer than release candidates.

0.6c3
 * Python 2.5 compatibility fixes.

0.6c2
 * Fix a problem with eggs specified directly on ``PYTHONPATH`` on
   case-insensitive filesystems possibly not showing up in the default
   working set, due to differing normalizations of ``sys.path`` entries.

0.6b3
 * Fixed a duplicate path insertion problem on case-insensitive filesystems.

0.6b1
 * Split ``get_platform()`` into ``get_supported_platform()`` and
   ``get_build_platform()`` to work around a Mac versioning problem that caused
   the behavior of ``compatible_platforms()`` to be platform specific.

 * Fix entry point parsing when a standalone module name has whitespace
   between it and the extras.

0.6a11
 * Added ``ExtractionError`` and ``ResourceManager.extraction_error()`` so that
   cache permission problems get a more user-friendly explanation of the
   problem, and so that programs can catch and handle extraction errors if they
   need to.

0.6a10
 * Added the ``extras`` attribute to ``Distribution``, the ``find_plugins()``
   method to ``WorkingSet``, and the ``__add__()`` and ``__iadd__()`` methods
   to ``Environment``.

 * ``safe_name()`` now allows dots in project names.

 * There is a new ``to_filename()`` function that escapes project names and
   versions for safe use in constructing egg filenames from a Distribution
   object's metadata.

 * Added ``Distribution.clone()`` method, and keyword argument support to other
   ``Distribution`` constructors.

 * Added the ``DEVELOP_DIST`` precedence, and automatically assign it to
   eggs using ``.egg-info`` format.

0.6a9
 * Don't raise an error when an invalid (unfinished) distribution is found
   unless absolutely necessary.  Warn about skipping invalid/unfinished eggs
   when building an Environment.

 * Added support for ``.egg-info`` files or directories with version/platform
   information embedded in the filename, so that system packagers have the
   option of including ``PKG-INFO`` files to indicate the presence of a
   system-installed egg, without needing to use ``.egg`` directories, zipfiles,
   or ``.pth`` manipulation.

 * Changed ``parse_version()`` to remove dashes before pre-release tags, so
   that ``0.2-rc1`` is considered an *older* version than ``0.2``, and is equal
   to ``0.2rc1``.  The idea that a dash *always* meant a post-release version
   was highly non-intuitive to setuptools users and Python developers, who
   seem to want to use ``-rc`` version numbers a lot.

0.6a8
 * Fixed a problem with ``WorkingSet.resolve()`` that prevented version
   conflicts from being detected at runtime.

 * Improved runtime conflict warning message to identify a line in the user's
   program, rather than flagging the ``warn()`` call in ``pkg_resources``.

 * Avoid giving runtime conflict warnings for namespace packages, even if they
   were declared by a different package than the one currently being activated.

 * Fix path insertion algorithm for case-insensitive filesystems.

 * Fixed a problem with nested namespace packages (e.g. ``peak.util``) not
   being set as an attribute of their parent package.

0.6a6
 * Activated distributions are now inserted in ``sys.path`` (and the working
   set) just before the directory that contains them, instead of at the end.
   This allows e.g. eggs in ``site-packages`` to override unmanaged modules in
   the same location, and allows eggs found earlier on ``sys.path`` to override
   ones found later.

 * When a distribution is activated, it now checks whether any contained
   non-namespace modules have already been imported and issues a warning if
   a conflicting module has already been imported.

 * Changed dependency processing so that it's breadth-first, allowing a
   depender's preferences to override those of a dependee, to prevent conflicts
   when a lower version is acceptable to the dependee, but not the depender.

 * Fixed a problem extracting zipped files on Windows, when the egg in question
   has had changed contents but still has the same version number.

0.6a4
 * Fix a bug in ``WorkingSet.resolve()`` that was introduced in 0.6a3.

0.6a3
 * Added ``safe_extra()`` parsing utility routine, and use it for Requirement,
   EntryPoint, and Distribution objects' extras handling.

0.6a1
 * Enhanced performance of ``require()`` and related operations when all
   requirements are already in the working set, and enhanced performance of
   directory scanning for distributions.

 * Fixed some problems using ``pkg_resources`` w/PEP 302 loaders other than
   ``zipimport``, and the previously-broken "eager resource" support.

 * Fixed ``pkg_resources.resource_exists()`` not working correctly, along with
   some other resource API bugs.

 * Many API changes and enhancements:

   * Added ``EntryPoint``, ``get_entry_map``, ``load_entry_point``, and
     ``get_entry_info`` APIs for dynamic plugin discovery.

   * ``list_resources`` is now ``resource_listdir`` (and it actually works)

   * Resource API functions like ``resource_string()`` that accepted a package
     name and resource name, will now also accept a ``Requirement`` object in
     place of the package name (to allow access to non-package data files in
     an egg).

   * ``get_provider()`` will now accept a ``Requirement`` instance or a module
     name.  If it is given a ``Requirement``, it will return a corresponding
     ``Distribution`` (by calling ``require()`` if a suitable distribution
     isn't already in the working set), rather than returning a metadata and
     resource provider for a specific module.  (The difference is in how
     resource paths are interpreted; supplying a module name means resources
     path will be module-relative, rather than relative to the distribution's
     root.)

   * ``Distribution`` objects now implement the ``IResourceProvider`` and
     ``IMetadataProvider`` interfaces, so you don't need to reference the (no
     longer available) ``metadata`` attribute to get at these interfaces.

   * ``Distribution`` and ``Requirement`` both have a ``project_name``
     attribute for the project name they refer to.  (Previously these were
     ``name`` and ``distname`` attributes.)

   * The ``path`` attribute of ``Distribution`` objects is now ``location``,
     because it isn't necessarily a filesystem path (and hasn't been for some
     time now).  The ``location`` of ``Distribution`` objects in the filesystem
     should always be normalized using ``pkg_resources.normalize_path()``; all
     of the setuptools' code that generates distributions from the filesystem
     (including ``Distribution.from_filename()``) ensure this invariant, but if
     you use a more generic API like ``Distribution()`` or
     ``Distribution.from_location()`` you should take care that you don't
     create a distribution with an un-normalized filesystem path.

   * ``Distribution`` objects now have an ``as_requirement()`` method that
     returns a ``Requirement`` for the distribution's project name and version.

   * Distribution objects no longer have an ``installed_on()`` method, and the
     ``install_on()`` method is now ``activate()`` (but may go away altogether
     soon).  The ``depends()`` method has also been renamed to ``requires()``,
     and ``InvalidOption`` is now ``UnknownExtra``.

   * ``find_distributions()`` now takes an additional argument called ``only``,
     that tells it to only yield distributions whose location is the passed-in
     path.  (It defaults to False, so that the default behavior is unchanged.)

   * ``AvailableDistributions`` is now called ``Environment``, and the
     ``get()``, ``__len__()``, and ``__contains__()`` methods were removed,
     because they weren't particularly useful.  ``__getitem__()`` no longer
     raises ``KeyError``; it just returns an empty list if there are no
     distributions for the named project.

   * The ``resolve()`` method of ``Environment`` is now a method of
     ``WorkingSet`` instead, and the ``best_match()`` method now uses a working
     set instead of a path list as its second argument.

   * There is a new ``pkg_resources.add_activation_listener()`` API that lets
     you register a callback for notifications about distributions added to
     ``sys.path`` (including the distributions already on it).  This is
     basically a hook for extensible applications and frameworks to be able to
     search for plugin metadata in distributions added at runtime.

0.5a13
 * Fixed a bug in resource extraction from nested packages in a zipped egg.

0.5a12
 * Updated extraction/cache mechanism for zipped resources to avoid inter-
   process and inter-thread races during extraction.  The default cache
   location can now be set via the ``PYTHON_EGGS_CACHE`` environment variable,
   and the default Windows cache is now a ``Python-Eggs`` subdirectory of the
   current user's "Application Data" directory, if the ``PYTHON_EGGS_CACHE``
   variable isn't set.

0.5a10
 * Fix a problem with ``pkg_resources`` being confused by non-existent eggs on
   ``sys.path`` (e.g. if a user deletes an egg without removing it from the
   ``easy-install.pth`` file).

 * Fix a problem with "basket" support in ``pkg_resources``, where egg-finding
   never actually went inside ``.egg`` files.

 * Made ``pkg_resources`` import the module you request resources from, if it's
   not already imported.

0.5a4
 * ``pkg_resources.AvailableDistributions.resolve()`` and related methods now
   accept an ``installer`` argument: a callable taking one argument, a
   ``Requirement`` instance.  The callable must return a ``Distribution``
   object, or ``None`` if no distribution is found.  This feature is used by
   EasyInstall to resolve dependencies by recursively invoking itself.

0.4a4
 * Fix problems with ``resource_listdir()``, ``resource_isdir()`` and resource
   directory extraction for zipped eggs.

0.4a3
 * Fixed scripts not being able to see a ``__file__`` variable in ``__main__``

 * Fixed a problem with ``resource_isdir()`` implementation that was introduced
   in 0.4a2.

0.4a1
 * Fixed a bug in requirements processing for exact versions (i.e. ``==`` and
   ``!=``) when only one condition was included.

 * Added ``safe_name()`` and ``safe_version()`` APIs to clean up handling of
   arbitrary distribution names and versions found on PyPI.

0.3a4
 * ``pkg_resources`` now supports resource directories, not just the resources
   in them.  In particular, there are ``resource_listdir()`` and
   ``resource_isdir()`` APIs.

 * ``pkg_resources`` now supports "egg baskets" -- .egg zipfiles which contain
   multiple distributions in subdirectories whose names end with ``.egg``.
   Having such a "basket" in a directory on ``sys.path`` is equivalent to
   having the individual eggs in that directory, but the contained eggs can
   be individually added (or not) to ``sys.path``.  Currently, however, there
   is no automated way to create baskets.

 * Namespace package manipulation is now protected by the Python import lock.

0.3a1
 * Initial release.
PK�(�\�0�7�78doc/alt-python37-setuptools/docs/references/keywords.rstnu�[���========
Keywords
========

``name``
    A string specifying the name of the package.

``version``
    A string specifying the version number of the package.

``description``
    A string describing the package in a single line.

``long_description``
    A string providing a longer description of the package.

``long_description_content_type``
    A string specifying the content type is used for the ``long_description``
    (e.g. ``text/markdown``)

``author``
    A string specifying the author of the package.

``author_email``
    A string specifying the email address of the package author.

``maintainer``
    A string specifying the name of the current maintainer, if different from
    the author. Note that if the maintainer is provided, setuptools will use it
    as the author in ``PKG-INFO``.

``maintainer_email``
    A string specifying the email address of the current maintainer, if
    different from the author.

``url``
    A string specifying the URL for the package homepage.

``download_url``
    A string specifying the URL to download the package.

``packages``
    A list of strings specifying the packages that setuptools will manipulate.

``py_modules``
    A list of strings specifying the modules that setuptools will manipulate.

``scripts``
    A list of strings specifying the standalone script files to be built and
    installed.

``ext_package``
    A string specifying the base package name for the extensions provided by
    this package.

``ext_modules``
    A list of instances of ``setuptools.Extension`` providing the list of
    Python extensions to be built.

``classifiers``
    A list of strings describing the categories for the package.

``distclass``
    A subclass of ``Distribution`` to use.

``script_name``
    A string specifying the name of the setup.py script -- defaults to
    ``sys.argv[0]``

``script_args``
    A list of strings defining the arguments to supply to the setup script.

``options``
    A dictionary providing the default options for the setup script.

``license``
    A string specifying the license of the package.

``license_file``

    .. warning::
        ``license_file`` is deprecated. Use ``license_files`` instead.

``license_files``

    A list of glob patterns for license related files that should be included.
    If neither ``license_file`` nor ``license_files`` is specified, this option
    defaults to ``LICEN[CS]E*``, ``COPYING*``, ``NOTICE*``, and ``AUTHORS*``.

``keywords``
    A list of strings or a comma-separated string providing descriptive
    meta-data. See: `PEP 0314`_.

.. _PEP 0314: https://www.python.org/dev/peps/pep-0314/

``platforms``
    A list of strings or comma-separated string.

``cmdclass``
    A dictionary providing a mapping of command names to ``Command``
    subclasses.

``data_files``

    .. warning::
        ``data_files`` is deprecated. It does not work with wheels, so it
        should be avoided.

    A list of strings specifying the data files to install.

``package_dir``
    A dictionary providing a mapping of package to directory names.

``requires``

   .. warning::
      ``requires`` is superseded by ``install_requires`` and should not be used
      anymore.

``obsoletes``

   .. warning::
      ``obsoletes`` is currently ignored by ``pip``.

   List of strings describing packages which this package renders obsolete,
   meaning that the two projects should not be installed at the same time.

   Version declarations can be supplied. Version numbers must be in the format
   specified in Version specifiers (e.g. ``foo (<3.0)``).

   This field may be followed by an environment marker after a semicolon (e.g.
   ``foo; os_name == "posix"``)

   The most common use of this field will be in case a project name changes,
   e.g. Gorgon 2.3 gets subsumed into Torqued Python 1.0. When you install
   Torqued Python, the Gorgon distribution should be removed.

``provides``

   .. warning::
      ``provides`` is currently ignored by ``pip``.

   List of strings describing package- and virtual package names contained
   within this package.

   A package may provide additional names, e.g. to indicate that multiple
   projects have been bundled together. For instance, source distributions of
   the ZODB project have historically included the transaction project, which
   is now available as a separate distribution. Installing such a source
   distribution satisfies requirements for both ZODB and transaction.

   A package may also provide a “virtual” project name, which does not
   correspond to any separately-distributed project: such a name might be used
   to indicate an abstract capability which could be supplied by one of
   multiple projects. E.g., multiple projects might supply RDBMS bindings for
   use by a given ORM: each project might declare that it provides
   ORM-bindings, allowing other projects to depend only on having at most one
   of them installed.

   A version declaration may be supplied and must follow the rules described in
   Version specifiers. The distribution’s version number will be implied if
   none is specified (e.g. ``foo (<3.0)``).

   Each package may be followed by an environment marker after a semicolon
   (e.g. ``foo; os_name == "posix"``).

.. Below are setuptools keywords, above are distutils

``include_package_data``
    If set to ``True``, this tells ``setuptools`` to automatically include any
    data files it finds inside your package directories that are specified by
    your ``MANIFEST.in`` file.  For more information, see the section on
    :ref:`Including Data Files`.

``exclude_package_data``
    A dictionary mapping package names to lists of glob patterns that should
    be *excluded* from your package directories.  You can use this to trim back
    any excess files included by ``include_package_data``.  For a complete
    description and examples, see the section on :ref:`Including Data Files`.

``package_data``
    A dictionary mapping package names to lists of glob patterns.  For a
    complete description and examples, see the section on :ref:`Including Data
    Files`.  You do not need to use this option if you are using
    ``include_package_data``, unless you need to add e.g. files that are
    generated by your setup script and build process.  (And are therefore not
    in source control or are files that you don't want to include in your
    source distribution.)

``zip_safe``
    A boolean (True or False) flag specifying whether the project can be
    safely installed and run from a zip file.  If this argument is not
    supplied, the ``bdist_egg`` command will have to analyze all of your
    project's contents for possible problems each time it builds an egg.

``install_requires``
    A string or list of strings specifying what other distributions need to
    be installed when this one is.  See the section on :ref:`Declaring
    Dependencies` for details and examples of the format of this argument.

``entry_points``
    A dictionary mapping entry point group names to strings or lists of strings
    defining the entry points.  Entry points are used to support dynamic
    discovery of services or plugins provided by a project.  See :ref:`Dynamic
    Discovery of Services and Plugins` for details and examples of the format
    of this argument.  In addition, this keyword is used to support
    :ref:`Automatic Script Creation <entry_points>`.

``extras_require``
    A dictionary mapping names of "extras" (optional features of your project)
    to strings or lists of strings specifying what other distributions must be
    installed to support those features.  See the section on :ref:`Declaring
    Dependencies` for details and examples of the format of this argument.

``python_requires``
    A string corresponding to a version specifier (as defined in PEP 440) for
    the Python version, used to specify the Requires-Python defined in PEP 345.

``setup_requires``

    .. warning::
        Using ``setup_requires`` is discouraged in favor of `PEP-518`_

    A string or list of strings specifying what other distributions need to
    be present in order for the *setup script* to run.  ``setuptools`` will
    attempt to obtain these (even going so far as to download them using
    ``EasyInstall``) before processing the rest of the setup script or commands.
    This argument is needed if you are using distutils extensions as part of
    your build process; for example, extensions that process setup() arguments
    and turn them into EGG-INFO metadata files.

    (Note: projects listed in ``setup_requires`` will NOT be automatically
    installed on the system where the setup script is being run.  They are
    simply downloaded to the ./.eggs directory if they're not locally available
    already.  If you want them to be installed, as well as being available
    when the setup script is run, you should add them to ``install_requires``
    **and** ``setup_requires``.)

.. _PEP-518: http://www.python.org/dev/peps/pep-0518/

``dependency_links``

    .. warning::
        ``dependency_links`` is deprecated. It is not supported anymore by pip.

    A list of strings naming URLs to be searched when satisfying dependencies.
    These links will be used if needed to install packages specified by
    ``setup_requires`` or ``tests_require``.  They will also be written into
    the egg's metadata for use by tools like EasyInstall to use when installing
    an ``.egg`` file.

``namespace_packages``
    A list of strings naming the project's "namespace packages".  A namespace
    package is a package that may be split across multiple project
    distributions.  For example, Zope 3's ``zope`` package is a namespace
    package, because subpackages like ``zope.interface`` and ``zope.publisher``
    may be distributed separately.  The egg runtime system can automatically
    merge such subpackages into a single parent package at runtime, as long
    as you declare them in each project that contains any subpackages of the
    namespace package, and as long as the namespace package's ``__init__.py``
    does not contain any code other than a namespace declaration.  See the
    section on :ref:`Namespace Packages` for more information.

``test_suite``
    A string naming a ``unittest.TestCase`` subclass (or a package or module
    containing one or more of them, or a method of such a subclass), or naming
    a function that can be called with no arguments and returns a
    ``unittest.TestSuite``.  If the named suite is a module, and the module
    has an ``additional_tests()`` function, it is called and the results are
    added to the tests to be run.  If the named suite is a package, any
    submodules and subpackages are recursively added to the overall test suite.

    Specifying this argument enables use of the :ref:`test` command to run the
    specified test suite, e.g. via ``setup.py test``.  See the section on the
    :ref:`test` command below for more details.

    New in 41.5.0: Deprecated the test command.

``tests_require``
    If your project's tests need one or more additional packages besides those
    needed to install it, you can use this option to specify them.  It should
    be a string or list of strings specifying what other distributions need to
    be present for the package's tests to run.  When you run the ``test``
    command, ``setuptools`` will  attempt to obtain these (even going
    so far as to download them using ``EasyInstall``).  Note that these
    required projects will *not* be installed on the system where the tests
    are run, but only downloaded to the project's setup directory if they're
    not already installed locally.

    New in 41.5.0: Deprecated the test command.

.. _test_loader:

``test_loader``
    If you would like to use a different way of finding tests to run than what
    setuptools normally uses, you can specify a module name and class name in
    this argument.  The named class must be instantiable with no arguments, and
    its instances must support the ``loadTestsFromNames()`` method as defined
    in the Python ``unittest`` module's ``TestLoader`` class.  Setuptools will
    pass only one test "name" in the ``names`` argument: the value supplied for
    the ``test_suite`` argument.  The loader you specify may interpret this
    string in any way it likes, as there are no restrictions on what may be
    contained in a ``test_suite`` string.

    The module name and class name must be separated by a ``:``.  The default
    value of this argument is ``"setuptools.command.test:ScanningLoader"``.  If
    you want to use the default ``unittest`` behavior, you can specify
    ``"unittest:TestLoader"`` as your ``test_loader`` argument instead.  This
    will prevent automatic scanning of submodules and subpackages.

    The module and class you specify here may be contained in another package,
    as long as you use the ``tests_require`` option to ensure that the package
    containing the loader class is available when the ``test`` command is run.

    New in 41.5.0: Deprecated the test command.

``eager_resources``
    A list of strings naming resources that should be extracted together, if
    any of them is needed, or if any C extensions included in the project are
    imported.  This argument is only useful if the project will be installed as
    a zipfile, and there is a need to have all of the listed resources be
    extracted to the filesystem *as a unit*.  Resources listed here
    should be '/'-separated paths, relative to the source root, so to list a
    resource ``foo.png`` in package ``bar.baz``, you would include the string
    ``bar/baz/foo.png`` in this argument.

    If you only need to obtain resources one at a time, or you don't have any C
    extensions that access other files in the project (such as data files or
    shared libraries), you probably do NOT need this argument and shouldn't
    mess with it.  For more details on how this argument works, see the section
    below on :ref:`Automatic Resource Extraction`.

``project_urls``
    An arbitrary map of URL names to hyperlinks, allowing more extensible
    documentation of where various resources can be found than the simple
    ``url`` and ``download_url`` options provide.
PK�(�\�'��ss/doc/alt-python37-setuptools/docs/build_meta.rstnu�[���=======================================
Build System Support
=======================================

What is it?
-------------

Python packaging has come `a long way <https://bernat.tech/posts/pep-517-518/>`_.

The traditional ``setuptools`` way of packaging Python modules
uses a ``setup()`` function within the ``setup.py`` script. Commands such as
``python setup.py bdist`` or ``python setup.py bdist_wheel`` generate a 
distribution bundle and ``python setup.py install`` installs the distribution. 
This interface makes it difficult to choose other packaging tools without an 
overhaul. Because ``setup.py`` scripts allowed for arbitrary execution, it
proved difficult to provide a reliable user experience across environments
and history.

`PEP 517 <https://www.python.org/dev/peps/pep-0517/>`_ therefore came to
rescue and specified a new standard to 
package and distribute Python modules. Under PEP 517:

    a ``pyproject.toml`` file is used to specify what program to use
    for generating distribution. 

    Then, two functions provided by the program, ``build_wheel(directory: str)`` 
    and ``build_sdist(directory: str)`` create the distribution bundle at the 
    specified ``directory``. The program is free to use its own configuration 
    script or extend the ``.toml`` file. 

    Lastly, ``pip install *.whl`` or ``pip install *.tar.gz`` does the actual
    installation. If ``*.whl`` is available, ``pip`` will go ahead and copy
    the files into ``site-packages`` directory. If not, ``pip`` will look at
    ``pyproject.toml`` and decide what program to use to 'build from source' 
    (the default is ``setuptools``)

With this standard, switching between packaging tools becomes a lot easier. ``build_meta``
implements ``setuptools``' build system support.

How to use it?
--------------

Starting with a package that you want to distribute. You will need your source
scripts, a ``pyproject.toml`` file and a ``setup.cfg`` file::

    ~/meowpkg/
        pyproject.toml
        setup.cfg
        meowpkg/__init__.py

The pyproject.toml file is required to specify the build system (i.e. what is 
being used to package your scripts and install from source). To use it with 
setuptools, the content would be::

    [build-system]
    requires = ["setuptools", "wheel"]
    build-backend = "setuptools.build_meta"

The ``setuptools`` package implements the ``build_sdist``
command and the ``wheel`` package implements the ``build_wheel``
command; both are required to be compliant with PEP 517.

Use ``setuptools``' :ref:`declarative config <declarative config>` to
specify the package information::

    [metadata]
    name = meowpkg
    version = 0.0.1
    description = a package that meows
    
    [options]
    packages = find:

Now generate the distribution. To build the package, use
`PyPA build <https://pypa-build.readthedocs.io/en/latest/>`_::

    $ pip install -q build
    $ python -m build

And now it's done! The ``.whl`` file  and ``.tar.gz`` can then be distributed 
and installed::

    dist/
        meowpkg-0.0.1.whl
        meowpkg-0.0.1.tar.gz

    $ pip install dist/meowpkg-0.0.1.whl

or::

    $ pip install dist/meowpkg-0.0.1.tar.gz
PK�(�\��s���/doc/alt-python37-setuptools/docs/setuptools.rstnu�[���==================================================
Building and Distributing Packages with Setuptools
==================================================

``Setuptools`` is a collection of enhancements to the Python ``distutils``
that allow developers to more easily build and
distribute Python packages, especially ones that have dependencies on other
packages.

Packages built and distributed using ``setuptools`` look to the user like
ordinary Python packages based on the ``distutils``.

Feature Highlights:

* Create `Python Eggs <http://peak.telecommunity.com/DevCenter/PythonEggs>`_ -
  a single-file importable distribution format

* Enhanced support for accessing data files hosted in zipped packages.

* Automatically include all packages in your source tree, without listing them
  individually in setup.py

* Automatically include all relevant files in your source distributions,
  without needing to create a ``MANIFEST.in`` file, and without having to force
  regeneration of the ``MANIFEST`` file when your source tree changes.

* Automatically generate wrapper scripts or Windows (console and GUI) .exe
  files for any number of "main" functions in your project.  (Note: this is not
  a py2exe replacement; the .exe files rely on the local Python installation.)

* Transparent Cython support, so that your setup.py can list ``.pyx`` files and
  still work even when the end-user doesn't have Cython installed (as long as
  you include the Cython-generated C in your source distribution)

* Command aliases - create project-specific, per-user, or site-wide shortcut
  names for commonly used commands and options

* Deploy your project in "development mode", such that it's available on
  ``sys.path``, yet can still be edited directly from its source checkout.

* Easily extend the distutils with new commands or ``setup()`` arguments, and
  distribute/reuse your extensions for multiple projects, without copying code.

* Create extensible applications and frameworks that automatically discover
  extensions, using simple "entry points" declared in a project's setup script.

* Full support for PEP 420 via ``find_namespace_packages()``, which is also backwards
  compatible to the existing ``find_packages()`` for Python >= 3.3.

-----------------
Developer's Guide
-----------------

The developer's guide has been updated. See the :doc:`most recent version <userguide/index>`.































TRANSITIONAL NOTE
~~~~~~~~~~~~~~~~~

Setuptools automatically calls ``declare_namespace()`` for you at runtime,
but future versions may *not*.  This is because the automatic declaration
feature has some negative side effects, such as needing to import all namespace
packages during the initialization of the ``pkg_resources`` runtime, and also
the need for ``pkg_resources`` to be explicitly imported before any namespace
packages work at all.  In some future releases, you'll be responsible
for including your own declaration lines, and the automatic declaration feature
will be dropped to get rid of the negative side effects.

During the remainder of the current development cycle, therefore, setuptools
will warn you about missing ``declare_namespace()`` calls in your
``__init__.py`` files, and you should correct these as soon as possible
before the compatibility support is removed.
Namespace packages without declaration lines will not work
correctly once a user has upgraded to a later version, so it's important that
you make this change now in order to avoid having your code break in the field.
Our apologies for the inconvenience, and thank you for your patience.

















setup.cfg-only projects
=======================

.. versionadded:: 40.9.0

If ``setup.py`` is missing from the project directory when a :pep:`517`
build is invoked, ``setuptools`` emulates a dummy ``setup.py`` file containing
only a ``setuptools.setup()`` call.

.. note::

    :pep:`517` doesn't support editable installs so this is currently
    incompatible with ``pip install -e .``.

This means that you can have a Python project with all build configuration
specified in ``setup.cfg``, without a ``setup.py`` file, if you **can rely
on** your project always being built by a :pep:`517`/:pep:`518` compatible
frontend.

To use this feature:

* Specify build requirements and :pep:`517` build backend in
  ``pyproject.toml``.
  For example:

  .. code-block:: toml

      [build-system]
      requires = [
        "setuptools >= 40.9.0",
        "wheel",
      ]
      build-backend = "setuptools.build_meta"

* Use a :pep:`517` compatible build frontend, such as ``pip >= 19`` or ``build``.

  .. warning::

      As :pep:`517` is new, support is not universal, and frontends that
      do support it may still have bugs. For compatibility, you may want to
      put a ``setup.py`` file containing only a ``setuptools.setup()``
      invocation.


Configuration API
=================

Some automation tools may wish to access data from a configuration file.

``Setuptools`` exposes a ``read_configuration()`` function for
parsing ``metadata`` and ``options`` sections into a dictionary.


.. code-block:: python

    from setuptools.config import read_configuration

    conf_dict = read_configuration("/home/user/dev/package/setup.cfg")


By default, ``read_configuration()`` will read only the file provided
in the first argument. To include values from other configuration files
which could be in various places, set the ``find_others`` keyword argument
to ``True``.

If you have only a configuration file but not the whole package, you can still
try to get data out of it with the help of the ``ignore_option_errors`` keyword
argument. When it is set to ``True``, all options with errors possibly produced
by directives, such as ``attr:`` and others, will be silently ignored.
As a consequence, the resulting dictionary will include no such options.











Mailing List and Bug Tracker
============================

Please use the `distutils-sig mailing list`_ for questions and discussion about
setuptools, and the `setuptools bug tracker`_ ONLY for issues you have
confirmed via the list are actual bugs, and which you have reduced to a minimal
set of steps to reproduce.

.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
.. _setuptools bug tracker: https://github.com/pypa/setuptools/
PK�(�\ƺ4�{{4doc/alt-python37-setuptools/docs/userguide/index.rstnu�[���==================================================
Building and Distributing Packages with Setuptools
==================================================

``Setuptools`` is a collection of enhancements to the Python ``distutils``
that allow developers to more easily build and
distribute Python packages, especially ones that have dependencies on other
packages.

Packages built and distributed using ``setuptools`` look to the user like
ordinary Python packages based on the ``distutils``.

Transition to PEP517
====================

Since setuptools no longer serves as the default build tool, one must explicitly
opt in (by providing a :file:`pyproject.toml` file) to use this library. The user
facing part is provided by tools such as pip and
backend interface is described :doc:`in this document <../build_meta>`. The
quickstart provides an overview of the new workflow.

.. toctree::
    :maxdepth: 1

    quickstart
    package_discovery
    entry_point
    dependency_management
    datafiles
    development_mode
    distribution
    extension
    declarative_config
    keywords
    commands
    functionalities_rewrite
    miscellaneous
PK�(�\���@�
�
?doc/alt-python37-setuptools/docs/userguide/development_mode.rstnu�[���"Development Mode"
==================

Under normal circumstances, the ``distutils`` assume that you are going to
build a distribution of your project, not use it in its "raw" or "unbuilt"
form.  However, if you were to use the ``distutils`` to build a distribution,
you would have to rebuild and reinstall your project every time you made a
change to it during development.

Another problem that sometimes comes up with the ``distutils`` is that you may
need to do development on two related projects at the same time.  You may need
to put both projects' packages in the same directory to run them, but need to
keep them separate for revision control purposes.  How can you do this?

Setuptools allows you to deploy your projects for use in a common directory or
staging area, but without copying any files.  Thus, you can edit each project's
code in its checkout directory, and only need to run build commands when you
change a project's C extensions or similarly compiled files.  You can even
deploy a project into another project's checkout directory, if that's your
preferred way of working (as opposed to using a common independent staging area
or the site-packages directory).

To do this, use the ``setup.py develop`` command.  It works very similarly to
``setup.py install``, except that it doesn't actually install anything.
Instead, it creates a special ``.egg-link`` file in the deployment directory,
that links to your project's source code.  And, if your deployment directory is
Python's ``site-packages`` directory, it will also update the
``easy-install.pth`` file to include your project's source code, thereby making
it available on ``sys.path`` for all programs using that Python installation.

In addition, the ``develop`` command creates wrapper scripts in the target
script directory that will run your in-development scripts after ensuring that
all your ``install_requires`` packages are available on ``sys.path``.

You can deploy the same project to multiple staging areas, e.g. if you have
multiple projects on the same machine that are sharing the same project you're
doing development work.

When you're done with a given development task, you can remove the project
source from a staging area using ``setup.py develop --uninstall``, specifying
the desired staging area if it's not the default.

There are several options to control the precise behavior of the ``develop``
command; see the section on the :ref:`develop <develop>` command below for more details.

Note that you can also apply setuptools commands to non-setuptools projects,
using commands like this::

   python -c "import setuptools; with open('setup.py') as f: exec(compile(f.read(), 'setup.py', 'exec'))" develop

That is, you can simply list the normal setup commands and options following
the quoted part.
PK�(�\G��N��9doc/alt-python37-setuptools/docs/userguide/quickstart.rstnu�[���==========================
``setuptools`` Quickstart
==========================

Installation
============

To install the latest version of setuptools, use::

    pip install --upgrade setuptools


Python packaging at a glance
============================
The landscape of Python packaging is shifting and ``Setuptools`` has evolved to
only provide backend support, no longer being the de-facto packaging tool in
the market. All python package must provide a ``pyproject.toml`` and specify
the backend (build system) it wants to use. The distribution can then
be generated with whatever tools that provides a ``build sdist``-alike
functionality. While this may appear cumbersome, given the added pieces,
it in fact tremendously enhances the portability of your package. The
change is driven under :pep:`PEP 517 <517#build-requirements>`. To learn more about Python packaging in general,
navigate to the :ref:`bottom <packaging-resources>` of this page.


Basic Use
=========
For basic use of setuptools, you will need a ``pyproject.toml`` with the
exact following info, which declares you want to use ``setuptools`` to
package your project:

.. code-block:: toml

    [build-system]
    requires = ["setuptools", "wheel"]
    build-backend = "setuptools.build_meta"

Then, you will need a ``setup.cfg`` or ``setup.py`` to specify your package
information, such as metadata, contents, dependencies, etc. Here we demonstrate
the minimum

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = mypackage
        version = 0.0.1

        [options]
        packages = mypackage
        install_requires =
            requests
            importlib; python_version == "2.6"

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup

        setup(
            name='mypackage',
            version='0.0.1',
            packages=['mypackage'],
            install_requires=[
                'requests',
                'importlib; python_version == "2.6"',
            ],
        )

This is what your project would look like::

    ~/mypackage/
        pyproject.toml
        setup.cfg # or setup.py
        mypackage/__init__.py

Then, you need an builder, such as :std:doc:`PyPA build <pypa-build:index>`
which you can obtain via ``pip install build``. After downloading it, invoke
the builder::

    python -m build

You now have your distribution ready (e.g. a ``tar.gz`` file and a ``.whl``
file in the ``dist`` directory), which you can upload to PyPI!

Of course, before you release your project to PyPI, you'll want to add a bit
more information to your setup script to help people find or learn about your
project.  And maybe your project will have grown by then to include a few
dependencies, and perhaps some data files and scripts. In the next few sections,
we will walk through those additional but essential information you need
to specify to properly package your project.


Automatic package discovery
===========================
For simple projects, it's usually easy enough to manually add packages to
the ``packages`` keyword in ``setup.cfg``.  However, for very large projects
, it can be a big burden to keep the package list updated. ``setuptools``
therefore provides two convenient tools to ease the burden: :literal:`find:\ ` and
:literal:`find_namespace:\ `. To use it in your project:

.. code-block:: ini

    [options]
    packages = find:

    [options.packages.find] #optional
    include=pkg1, pkg2
    exclude=pk3, pk4

When you pass the above information, alongside other necessary ones,
``setuptools`` walks through the directory specified in ``where`` (omitted
here as the package reside in current directory) and filters the packages
it can find following the ``include``  (default to none), then remove
those that match the ``exclude`` and return a list of Python packages. Note
that each entry in the ``[options.packages.find]`` is optional. The above
setup also allows you to adopt a ``src/`` layout. For more details and advanced
use, go to :ref:`package_discovery`


Entry points and automatic script creation
===========================================
Setuptools support automatic creation of scripts upon installation, that runs
code within your package if you specify them with the ``entry_points`` keyword.
This is what allows you to run commands like ``pip install`` instead of having
to type ``python -m pip install``. To accomplish this, add the entry_points
keyword in your ``setup.cfg``:

.. code-block:: ini

    [options.entry_points]
    console_scripts =
        main = mypkg:some_func

When this project is installed, a ``main`` script will be installed and will
invoke the ``some_func`` in the ``__init__.py`` file when called by the user.
For detailed usage, including managing the additional or optional dependencies,
go to :doc:`entry_point`.


Dependency management
=====================
``setuptools`` supports automatically installing dependencies when a package is
installed. The simplest way to include requirement specifiers is to use the
``install_requires`` argument to ``setup.cfg``.  It takes a string or list of
strings containing requirement specifiers (A version specifier is one of the
operators <, >, <=, >=, == or !=, followed by a version identifier):

.. code-block:: ini

    [options]
    install_requires =
        docutils >= 0.3
        requests <= 0.4

When your project is installed, all of the dependencies not already installed
will be located (via PyPI), downloaded, built (if necessary), and installed.
This, of course, is a simplified scenarios. ``setuptools`` also provide
additional keywords such as ``setup_requires`` that allows you to install
dependencies before running the script, and ``extras_requires`` that take
care of those needed by automatically generated scripts. It also provides
mechanisms to handle dependencies that are not in PyPI. For more advanced use,
see :doc:`dependency_management`


.. _Including Data Files:

Including Data Files
====================
The distutils have traditionally allowed installation of "data files", which
are placed in a platform-specific location. Setuptools offers three ways to
specify data files to be included in your packages. For the simplest use, you
can simply use the ``include_package_data`` keyword:

.. code-block:: ini

    [options]
    include_package_data = True

This tells setuptools to install any data files it finds in your packages.
The data files must be specified via the distutils' ``MANIFEST.in`` file.
For more details, see :doc:`datafiles`


Development mode
================
``setuptools`` allows you to install a package without copying any files
to your interpreter directory (e.g. the ``site-packages`` directory). This
allows you to modify your source code and have the changes take effect without
you having to rebuild and reinstall. This is currently incompatible with
PEP 517 and therefore it requires a ``setup.py`` script with the following
content::

    import setuptools
    setuptools.setup()

Then::

    pip install --editable .

This creates a link file in your interpreter site package directory which
associate with your source code. For more information, see :doc:`development_mode`.


Uploading your package to PyPI
==============================
After generating the distribution files, next step would be to upload your
distribution so others can use it. This functionality is provided by
`twine <https://pypi.org/project/twine/>`_ and we will only demonstrate the
basic use here.


Transitioning from ``setup.py`` to ``setup.cfg``
================================================
To avoid executing arbitrary scripts and boilerplate code, we are transitioning
into a full-fledged ``setup.cfg`` to declare your package information instead
of running ``setup()``. This inevitably brings challenges due to a different
syntax. Here we provide a quick guide to understanding how ``setup.cfg`` is
parsed by ``setuptool`` to ease the pain of transition.

.. _packaging-resources:

Resources on Python packaging
=============================
Packaging in Python is hard. Here we provide a list of links for those that
want to learn more.
PK�(�\P��d��8doc/alt-python37-setuptools/docs/userguide/datafiles.rstnu�[���====================
Data Files Support
====================

The distutils have traditionally allowed installation of "data files", which
are placed in a platform-specific location.  However, the most common use case
for data files distributed with a package is for use *by* the package, usually
by including the data files in the package directory.

Setuptools offers three ways to specify data files to be included in your
packages.  First, you can simply use the ``include_package_data`` keyword,
e.g.::

    from setuptools import setup, find_packages
    setup(
        ...
        include_package_data=True
    )

This tells setuptools to install any data files it finds in your packages.
The data files must be specified via the distutils' ``MANIFEST.in`` file.
(They can also be tracked by a revision control system, using an appropriate
plugin.  See the section below on :ref:`Adding Support for Revision
Control Systems` for information on how to write such plugins.)

If you want finer-grained control over what files are included (for example,
if you have documentation files in your package directories and want to exclude
them from installation), then you can also use the ``package_data`` keyword,
e.g.::

    from setuptools import setup, find_packages
    setup(
        ...
        package_data={
            # If any package contains *.txt or *.rst files, include them:
            "": ["*.txt", "*.rst"],
            # And include any *.msg files found in the "hello" package, too:
            "hello": ["*.msg"],
        }
    )

The ``package_data`` argument is a dictionary that maps from package names to
lists of glob patterns.  The globs may include subdirectory names, if the data
files are contained in a subdirectory of the package.  For example, if the
package tree looks like this::

    setup.py
    src/
        mypkg/
            __init__.py
            mypkg.txt
            data/
                somefile.dat
                otherdata.dat

The setuptools setup file might look like this::

    from setuptools import setup, find_packages
    setup(
        ...
        packages=find_packages("src"),  # include all packages under src
        package_dir={"": "src"},   # tell distutils packages are under src

        package_data={
            # If any package contains *.txt files, include them:
            "": ["*.txt"],
            # And include any *.dat files found in the "data" subdirectory
            # of the "mypkg" package, also:
            "mypkg": ["data/*.dat"],
        }
    )

Notice that if you list patterns in ``package_data`` under the empty string,
these patterns are used to find files in every package, even ones that also
have their own patterns listed.  Thus, in the above example, the ``mypkg.txt``
file gets included even though it's not listed in the patterns for ``mypkg``.

Also notice that if you use paths, you *must* use a forward slash (``/``) as
the path separator, even if you are on Windows.  Setuptools automatically
converts slashes to appropriate platform-specific separators at build time.

If datafiles are contained in a subdirectory of a package that isn't a package
itself (no ``__init__.py``), then the subdirectory names (or ``*``) are required
in the ``package_data`` argument (as shown above with ``"data/*.dat"``).

When building an ``sdist``, the datafiles are also drawn from the
``package_name.egg-info/SOURCES.txt`` file, so make sure that this is removed if
the ``setup.py`` ``package_data`` list is updated before calling ``setup.py``.

(Note: although the ``package_data`` argument was previously only available in
``setuptools``, it was also added to the Python ``distutils`` package as of
Python 2.4; there is `some documentation for the feature`__ available on the
python.org website.  If using the setuptools-specific ``include_package_data``
argument, files specified by ``package_data`` will *not* be automatically
added to the manifest unless they are listed in the MANIFEST.in file.)

__ https://docs.python.org/3/distutils/setupscript.html#installing-package-data

Sometimes, the ``include_package_data`` or ``package_data`` options alone
aren't sufficient to precisely define what files you want included.  For
example, you may want to include package README files in your revision control
system and source distributions, but exclude them from being installed.  So,
setuptools offers an ``exclude_package_data`` option as well, that allows you
to do things like this::

    from setuptools import setup, find_packages
    setup(
        ...
        packages=find_packages("src"),  # include all packages under src
        package_dir={"": "src"},   # tell distutils packages are under src

        include_package_data=True,    # include everything in source control

        # ...but exclude README.txt from all packages
        exclude_package_data={"": ["README.txt"]},
    )

The ``exclude_package_data`` option is a dictionary mapping package names to
lists of wildcard patterns, just like the ``package_data`` option.  And, just
as with that option, a key of ``""`` will apply the given pattern(s) to all
packages.  However, any files that match these patterns will be *excluded*
from installation, even if they were listed in ``package_data`` or were
included as a result of using ``include_package_data``.

In summary, the three options allow you to:

``include_package_data``
    Accept all data files and directories matched by ``MANIFEST.in``.

``package_data``
    Specify additional patterns to match files that may or may
    not be matched by ``MANIFEST.in`` or found in source control.

``exclude_package_data``
    Specify patterns for data files and directories that should *not* be
    included when a package is installed, even if they would otherwise have
    been included due to the use of the preceding options.

NOTE: Due to the way the distutils build process works, a data file that you
include in your project and then stop including may be "orphaned" in your
project's build directories, requiring you to run ``setup.py clean --all`` to
fully remove them.  This may also be important for your users and contributors
if they track intermediate revisions of your project using Subversion; be sure
to let them know when you make changes that remove files from inclusion so they
can run ``setup.py clean --all``.


.. _Accessing Data Files at Runtime:

Accessing Data Files at Runtime
-------------------------------

Typically, existing programs manipulate a package's ``__file__`` attribute in
order to find the location of data files.  However, this manipulation isn't
compatible with PEP 302-based import hooks, including importing from zip files
and Python Eggs.  It is strongly recommended that, if you are using data files,
you should use the :ref:`ResourceManager API` of ``pkg_resources`` to access
them.  The ``pkg_resources`` module is distributed as part of setuptools, so if
you're using setuptools to distribute your package, there is no reason not to
use its resource management API.  See also `Importlib Resources`_ for
a quick example of converting code that uses ``__file__`` to use
``pkg_resources`` instead.

.. _Importlib Resources: https://docs.python.org/3/library/importlib.html#module-importlib.resources


Non-Package Data Files
----------------------

Historically, ``setuptools`` by way of ``easy_install`` would encapsulate data
files from the distribution into the egg (see `the old docs
<https://github.com/pypa/setuptools/blob/52aacd5b276fedd6849c3a648a0014f5da563e93/docs/setuptools.txt#L970-L1001>`_). As eggs are deprecated and pip-based installs
fall back to the platform-specific location for installing data files, there is
no supported facility to reliably retrieve these resources.

Instead, the PyPA recommends that any data files you wish to be accessible at
run time be included in the package.
PK�(�\��f�n)n)Adoc/alt-python37-setuptools/docs/userguide/declarative_config.rstnu�[���.. _declarative config:

-----------------------------------------
Configuring setup() using setup.cfg files
-----------------------------------------

.. note:: New in 30.3.0 (8 Dec 2016).

.. important::
    If compatibility with legacy builds (i.e. those not using the :pep:`517`
    build API) is desired, a ``setup.py`` file containing a ``setup()`` function
    call is still required even if your configuration resides in ``setup.cfg``.

``Setuptools`` allows using configuration files (usually :file:`setup.cfg`)
to define a package’s metadata and other options that are normally supplied
to the ``setup()`` function (declarative config).

This approach not only allows automation scenarios but also reduces
boilerplate code in some cases.

.. _example-setup-config:

.. code-block:: ini

    [metadata]
    name = my_package
    version = attr: src.VERSION
    description = My package description
    long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst
    keywords = one, two
    license = BSD 3-Clause License
    classifiers =
        Framework :: Django
        License :: OSI Approved :: BSD License
        Programming Language :: Python :: 3
        Programming Language :: Python :: 3.5

    [options]
    zip_safe = False
    include_package_data = True
    packages = find:
    scripts =
        bin/first.py
        bin/second.py
    install_requires =
        requests
        importlib; python_version == "2.6"

    [options.package_data]
    * = *.txt, *.rst
    hello = *.msg

    [options.entry_points]
    console_scripts =
        executable-name = package.module:function

    [options.extras_require]
    pdf = ReportLab>=1.2; RXP
    rest = docutils>=0.3; pack ==1.1, ==1.3

    [options.packages.find]
    exclude =
        src.subpackage1
        src.subpackage2

    [options.data_files]
    /etc/my_package =
        site.d/00_default.conf
        host.d/00_default.conf
    data = data/img/logo.png, data/svg/icon.svg
    fonts = data/fonts/*.ttf, data/fonts/*.otf

Metadata and options are set in the config sections of the same name.

* Keys are the same as the keyword arguments one provides to the ``setup()``
  function.

* Complex values can be written comma-separated or placed one per line
  in *dangling* config values. The following are equivalent:

  .. code-block:: ini

      [metadata]
      keywords = one, two

      [metadata]
      keywords =
          one
          two

* In some cases, complex values can be provided in dedicated subsections for
  clarity.

* Some keys allow ``file:``, ``attr:``, ``find:``, and ``find_namespace:`` directives in
  order to cover common usecases.

* Unknown keys are ignored.


Using a ``src/`` layout
=======================

One commonly used package configuration has all the module source code in a
subdirectory (often called the ``src/`` layout), like this::

    ├── src
    │   └── mypackage
    │       ├── __init__.py
    │       └── mod1.py
    ├── setup.py
    └── setup.cfg

You can set up your ``setup.cfg`` to automatically find all your packages in
the subdirectory like this:

.. code-block:: ini

    # This example contains just the necessary options for a src-layout, set up
    # the rest of the file as described above.

    [options]
    package_dir=
        =src
    packages=find:

    [options.packages.find]
    where=src

Specifying values
=================

Some values are treated as simple strings, some allow more logic.

Type names used below:

* ``str`` - simple string
* ``list-comma`` - dangling list or string of comma-separated values
* ``list-semi`` - dangling list or string of semicolon-separated values
* ``bool`` - ``True`` is 1, yes, true
* ``dict`` - list-comma where keys are separated from values by ``=``
* ``section`` - values are read from a dedicated (sub)section


Special directives:

* ``attr:`` - Value is read from a module attribute.  ``attr:`` supports
  callables and iterables; unsupported types are cast using ``str()``.

  In order to support the common case of a literal value assigned to a variable
  in a module containing (directly or indirectly) third-party imports,
  ``attr:`` first tries to read the value from the module by examining the
  module's AST.  If that fails, ``attr:`` falls back to importing the module.

* ``file:`` - Value is read from a list of files and then concatenated

  .. note::
      The ``file:`` directive is sandboxed and won't reach anything outside
      the directory containing ``setup.py``.


Metadata
--------

.. note::
    The aliases given below are supported for compatibility reasons,
    but their use is not advised.

==============================  =================  =================  =============== ==========
Key                             Aliases            Type               Minimum Version Notes
==============================  =================  =================  =============== ==========
name                                               str
version                                            attr:, file:, str  39.2.0          [#meta-1]_
url                             home-page          str
download_url                    download-url       str
project_urls                                       dict               38.3.0
author                                             str
author_email                    author-email       str
maintainer                                         str
maintainer_email                maintainer-email   str
classifiers                     classifier         file:, list-comma
license                                            str
license_files                   license_file       list-comma         42.0.0
description                     summary            file:, str
long_description                long-description   file:, str
long_description_content_type                      str                38.6.0
keywords                                           list-comma
platforms                       platform           list-comma
provides                                           list-comma
requires                                           list-comma
obsoletes                                          list-comma
==============================  =================  =================  =============== ==========

**Notes**:

.. [#meta-1] The ``version`` file attribute has only been supported since 39.2.0.

   A version loaded using the ``file:`` directive must comply with PEP 440.
   It is easy to accidentally put something other than a valid version
   string in such a file, so validation is stricter in this case.


Options
-------

=======================  ===================================  =============== =========
Key                      Type                                 Minimum Version Notes
=======================  ===================================  =============== =========
zip_safe                 bool
setup_requires           list-semi                            36.7.0
install_requires         list-semi
extras_require           section                                              [#opt-2]_
python_requires          str                                  34.4.0
entry_points             file:, section                       51.0.0
scripts                  list-comma
eager_resources          list-comma
dependency_links         list-comma
tests_require            list-semi
include_package_data     bool
packages                 find:, find_namespace:, list-comma                   [#opt-3]_
package_dir              dict
package_data             section                                              [#opt-1]_
exclude_package_data     section
namespace_packages       list-comma
py_modules               list-comma                            34.4.0
data_files               dict                                 40.6.0
=======================  ===================================  =============== =========

**Notes**:

.. [#opt-1] In the ``package_data`` section, a key named with a single asterisk
   (``*``) refers to all packages, in lieu of the empty string used in ``setup.py``.
 
.. [#opt-2] In the ``extras_require`` section, values are parsed as ``list-semi``.
   This implies that in order to include markers, they **must** be *dangling*:
 
   .. code-block:: ini

      [options.extras_require]
      rest = docutils>=0.3; pack ==1.1, ==1.3
      pdf =
        ReportLab>=1.2
        RXP
        importlib-metadata; python_version < "3.8"

.. [#opt-3] The ``find:`` and ``find_namespace:`` directive can be further configured
   in a dedicated subsection ``options.packages.find``. This subsection accepts the
   same keys as the ``setuptools.find_packages`` and the
   ``setuptools.find_namespace_packages`` function:
   ``where``, ``include``, and ``exclude``.

   The ``find_namespace:`` directive is supported since Python >=3.3.


Compatibility with other tools
==============================

Historically, several tools explored declarative package configuration
in parallel. And several of them chose to place the packaging
configuration within the project's :file:`setup.cfg` file.
One of the first was ``distutils2``, which development has stopped in
2013. Other include ``pbr`` which is still under active development or
``d2to1``, which was a plug-in that backports declarative configuration
to ``distutils``, but has had no release since Oct. 2015.
As a way to harmonize packaging tools, ``setuptools``, having held the
position of *de facto* standard, has gradually integrated those
features as part of its core features.

Still this has lead to some confusion and feature incompatibilities:

- some tools support features others don't;
- some have similar features but the declarative syntax differs;

The table below tries to summarize the differences. But, please, refer
to each tool documentation for up-to-date information.

=========================== ========== ========== ===== ===
feature                     setuptools distutils2 d2to1 pbr
=========================== ========== ========== ===== ===
[metadata] description-file S          Y          Y     Y
[files]                     S          Y          Y     Y
entry_points                Y          Y          Y     S
[backwards_compat]          N          Y          Y     Y
=========================== ========== ========== ===== ===

Y: supported, N: unsupported, S: syntax differs (see
:ref:`above example<example-setup-config>`).

Also note that some features were only recently added to ``setuptools``.
Please refer to the previous sections to find out when.
PK�(�\��cߑ�@doc/alt-python37-setuptools/docs/userguide/package_discovery.rstnu�[���.. _`package_discovery`:

========================================
Package Discovery and Namespace Package
========================================

.. note::
    a full specification for the keyword supplied to ``setup.cfg`` or
    ``setup.py`` can be found at :doc:`keywords reference <keywords>`

.. note::
    the examples provided here are only to demonstrate the functionality
    introduced. More metadata and options arguments need to be supplied
    if you want to replicate them on your system. If you are completely
    new to setuptools, the :doc:`quickstart section <quickstart>` is a good
    place to start.

``Setuptools`` provide powerful tools to handle package discovery, including
support for namespace package. Normally, you would specify the package to be
included manually in the following manner:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        packages =
            mypkg1
            mypkg2

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=['mypkg1', 'mypkg2']
        )

This can get tiresome really quickly. To speed things up, we introduce two
functions provided by setuptools:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        packages = find:
        #or
        packages = find_namespace:

.. tab:: setup.py

    .. code-block:: python

        from setuptools import find_packages

        # or
        from setuptools import find_namespace_packages


Using ``find:`` or ``find_packages``
====================================
Let's start with the first tool. ``find:`` (``find_packages``) takes a source
directory and two lists of package name patterns to exclude and include, and
then return a list of ``str`` representing the packages it could find. To use
it, consider the following directory

.. code-block:: bash

    mypkg/
        src/
            pkg1/__init__.py
            pkg2/__init__.py
            additional/__init__.py

        setup.cfg #or setup.py

To have your setup.cfg or setup.py to automatically include packages found
in ``src`` that starts with the name ``pkg`` and not ``additional``:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        packages = find:
        package_dir =
            =src

        [options.packages.find]
        where = src
        include = pkg*
        exclude = additional

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=find_packages(
                where='src',
                include=['pkg*'],
                exclude=['additional'],
            ),
            package_dir={"": "src"}
            # ...
        )


.. _Namespace Packages:

Using ``find_namespace:`` or ``find_namespace_packages``
========================================================
``setuptools``  provides the ``find_namespace:`` (``find_namespace_packages``)
which behaves similarly to ``find:`` but works with namespace package. Before
diving in, it is important to have a good understanding of what namespace
packages are. Here is a quick recap:

Suppose you have two packages named as follows:

.. code-block:: bash

    /Users/Desktop/timmins/foo/__init__.py
    /Library/timmins/bar/__init__.py

If both ``Desktop`` and ``Library`` are on your ``PYTHONPATH``, then a
namespace package called ``timmins`` will be created automatically for you when
you invoke the import mechanism, allowing you to accomplish the following

.. code-block:: pycon

    >>> import timmins.foo
    >>> import timmins.bar

as if there is only one ``timmins`` on your system. The two packages can then
be distributed separately and installed individually without affecting the
other one. Suppose you are packaging the ``foo`` part:

.. code-block:: bash

    foo/
        src/
            timmins/foo/__init__.py
        setup.cfg # or setup.py

and you want the ``foo`` to be automatically included, ``find:`` won't work
because timmins doesn't contain ``__init__.py`` directly, instead, you have
to use ``find_namespace:``:

.. code-block:: ini

    [options]
    package_dir =
        =src
    packages = find_namespace:

    [options.packages.find]
    where = src

When you install the zipped distribution, ``timmins.foo`` would become
available to your interpreter.

You can think of ``find_namespace:`` as identical to ``find:`` except it
would count a directory as a package even if it doesn't contain ``__init__.py``
file directly. As a result, this creates an interesting side effect. If you
organize your package like this:

.. code-block:: bash

    foo/
        timmins/
            foo/__init__.py
        setup.cfg # or setup.py
        tests/
            test_foo/__init__.py

a naive ``find_namespace:`` would include tests as part of your package to
be installed. A simple way to fix it is to adopt the aforementioned
``src`` layout.


Legacy Namespace Packages
=========================
The fact you can create namespace package so effortlessly above is credited
to `PEP 420 <https://www.python.org/dev/peps/pep-0420/>`_. It use to be more
cumbersome to accomplish the same result. Historically, there were two methods
to create namespace packages. One is the ``pkg_resources`` style supported by
``setuptools`` and the other one being ``pkgutils`` style offered by
``pkgutils`` module in Python. Both are now considered deprecated despite the
fact they still linger in many existing packages. These two differ in many
subtle yet significant aspects and you can find out more on `Python packaging
user guide <https://packaging.python.org/guides/packaging-namespace-packages/>`_


``pkg_resource`` style namespace package
----------------------------------------
This is the method ``setuptools`` directly supports. Starting with the same
layout, there are two pieces you need to add to it. First, an ``__init__.py``
file directly under your namespace package directory that contains the
following:

.. code-block:: python

    __import__("pkg_resources").declare_namespace(__name__)

And the ``namespace_packages`` keyword in your ``setup.cfg`` or ``setup.py``:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        namespace_packages = timmins

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            namespace_packages=['timmins']
        )

And your directory should look like this

.. code-block:: bash

    /foo/
        src/
            timmins/
                __init__.py
                foo/__init__.py
        setup.cfg #or setup.py

Repeat the same for other packages and you can achieve the same result as
the previous section.

``pkgutil`` style namespace package
-----------------------------------
This method is almost identical to the ``pkg_resource`` except that the
``namespace_packages`` declaration is omitted and the ``__init__.py``
file contains the following:

.. code-block:: python

    __path__ = __import__('pkgutil').extend_path(__path__, __name__)

The project layout remains the same and ``setup.cfg`` remains the same.
PK�(�\�!�**8doc/alt-python37-setuptools/docs/userguide/extension.rstnu�[���.. _Creating ``distutils`` Extensions:

Creating ``distutils`` Extensions
=================================

It can be hard to add new commands or setup arguments to the distutils.  But
the ``setuptools`` package makes it a bit easier, by allowing you to distribute
a distutils extension as a separate project, and then have projects that need
the extension just refer to it in their ``setup_requires`` argument.

With ``setuptools``, your distutils extension projects can hook in new
commands and ``setup()`` arguments just by defining "entry points".  These
are mappings from command or argument names to a specification of where to
import a handler from.  (See the section on :ref:`Dynamic Discovery of
Services and Plugins` above for some more background on entry points.)


Adding Commands
---------------

You can add new ``setup`` commands by defining entry points in the
``distutils.commands`` group.  For example, if you wanted to add a ``foo``
command, you might add something like this to your distutils extension
project's setup script::

    setup(
        # ...
        entry_points={
            "distutils.commands": [
                "foo = mypackage.some_module:foo",
            ],
        },
    )

(Assuming, of course, that the ``foo`` class in ``mypackage.some_module`` is
a ``setuptools.Command`` subclass.)

Once a project containing such entry points has been activated on ``sys.path``,
(e.g. by running "install" or "develop" with a site-packages installation
directory) the command(s) will be available to any ``setuptools``-based setup
scripts.  It is not necessary to use the ``--command-packages`` option or
to monkeypatch the ``distutils.command`` package to install your commands;
``setuptools`` automatically adds a wrapper to the distutils to search for
entry points in the active distributions on ``sys.path``.  In fact, this is
how setuptools' own commands are installed: the setuptools project's setup
script defines entry points for them!

Adding ``setup()`` Arguments
----------------------------

.. warning:: Adding arguments to setup is discouraged as such arguments
   are only supported through imperative execution and not supported through
   declarative config.

Sometimes, your commands may need additional arguments to the ``setup()``
call.  You can enable this by defining entry points in the
``distutils.setup_keywords`` group.  For example, if you wanted a ``setup()``
argument called ``bar_baz``, you might add something like this to your
distutils extension project's setup script::

    setup(
        # ...
        entry_points={
            "distutils.commands": [
                "foo = mypackage.some_module:foo",
            ],
            "distutils.setup_keywords": [
                "bar_baz = mypackage.some_module:validate_bar_baz",
            ],
        },
    )

The idea here is that the entry point defines a function that will be called
to validate the ``setup()`` argument, if it's supplied.  The ``Distribution``
object will have the initial value of the attribute set to ``None``, and the
validation function will only be called if the ``setup()`` call sets it to
a non-None value.  Here's an example validation function::

    def assert_bool(dist, attr, value):
        """Verify that value is True, False, 0, or 1"""
        if bool(value) != value:
            raise DistutilsSetupError(
                "%r must be a boolean value (got %r)" % (attr,value)
            )

Your function should accept three arguments: the ``Distribution`` object,
the attribute name, and the attribute value.  It should raise a
``DistutilsSetupError`` (from the ``distutils.errors`` module) if the argument
is invalid.  Remember, your function will only be called with non-None values,
and the default value of arguments defined this way is always None.  So, your
commands should always be prepared for the possibility that the attribute will
be ``None`` when they access it later.

If more than one active distribution defines an entry point for the same
``setup()`` argument, *all* of them will be called.  This allows multiple
distutils extensions to define a common argument, as long as they agree on
what values of that argument are valid.

Also note that as with commands, it is not necessary to subclass or monkeypatch
the distutils ``Distribution`` class in order to add your arguments; it is
sufficient to define the entry points in your extension, as long as any setup
script using your extension lists your project in its ``setup_requires``
argument.


Customizing Distribution Options
--------------------------------

Plugins may wish to extend or alter the options on a Distribution object to
suit the purposes of that project. For example, a tool that infers the
``Distribution.version`` from SCM-metadata may need to hook into the
option finalization. To enable this feature, Setuptools offers an entry
point "setuptools.finalize_distribution_options". That entry point must
be a callable taking one argument (the Distribution instance).

If the callable has an ``.order`` property, that value will be used to
determine the order in which the hook is called. Lower numbers are called
first and the default is zero (0).

Plugins may read, alter, and set properties on the distribution, but each
plugin is encouraged to load the configuration/settings for their behavior
independently.


.. _Adding new EGG-INFO Files:

Adding new EGG-INFO Files
-------------------------

Some extensible applications or frameworks may want to allow third parties to
develop plugins with application or framework-specific metadata included in
the plugins' EGG-INFO directory, for easy access via the ``pkg_resources``
metadata API.  The easiest way to allow this is to create a distutils extension
to be used from the plugin projects' setup scripts (via ``setup_requires``)
that defines a new setup keyword, and then uses that data to write an EGG-INFO
file when the ``egg_info`` command is run.

The ``egg_info`` command looks for extension points in an ``egg_info.writers``
group, and calls them to write the files.  Here's a simple example of a
distutils extension defining a setup argument ``foo_bar``, which is a list of
lines that will be written to ``foo_bar.txt`` in the EGG-INFO directory of any
project that uses the argument::

    setup(
        # ...
        entry_points={
            "distutils.setup_keywords": [
                "foo_bar = setuptools.dist:assert_string_list",
            ],
            "egg_info.writers": [
                "foo_bar.txt = setuptools.command.egg_info:write_arg",
            ],
        },
    )

This simple example makes use of two utility functions defined by setuptools
for its own use: a routine to validate that a setup keyword is a sequence of
strings, and another one that looks up a setup argument and writes it to
a file.  Here's what the writer utility looks like::

    def write_arg(cmd, basename, filename):
        argname = os.path.splitext(basename)[0]
        value = getattr(cmd.distribution, argname, None)
        if value is not None:
            value = "\n".join(value) + "\n"
        cmd.write_or_delete_file(argname, filename, value)

As you can see, ``egg_info.writers`` entry points must be a function taking
three arguments: a ``egg_info`` command instance, the basename of the file to
write (e.g. ``foo_bar.txt``), and the actual full filename that should be
written to.

In general, writer functions should honor the command object's ``dry_run``
setting when writing files, and use the ``distutils.log`` object to do any
console output.  The easiest way to conform to this requirement is to use
the ``cmd`` object's ``write_file()``, ``delete_file()``, and
``write_or_delete_file()`` methods exclusively for your file operations.  See
those methods' docstrings for more details.


.. _Adding Support for Revision Control Systems:

Adding Support for Revision Control Systems
-------------------------------------------------

If the files you want to include in the source distribution are tracked using
Git, Mercurial or SVN, you can use the following packages to achieve that:

- Git and Mercurial: `setuptools_scm <https://pypi.org/project/setuptools_scm/>`_
- SVN: `setuptools_svn <https://pypi.org/project/setuptools_svn/>`_

If you would like to create a plugin for ``setuptools`` to find files tracked
by another revision control system, you can do so by adding an entry point to
the ``setuptools.file_finders`` group.  The entry point should be a function
accepting a single directory name, and should yield all the filenames within
that directory (and any subdirectories thereof) that are under revision
control.

For example, if you were going to create a plugin for a revision control system
called "foobar", you would write a function something like this:

.. code-block:: python

    def find_files_for_foobar(dirname):
        ...  # loop to yield paths that start with `dirname`

And you would register it in a setup script using something like this::

    entry_points={
        "setuptools.file_finders": [
            "foobar = my_foobar_module:find_files_for_foobar",
        ]
    }

Then, anyone who wants to use your plugin can simply install it, and their
local setuptools installation will be able to find the necessary files.

It is not necessary to distribute source control plugins with projects that
simply use the other source control system, or to specify the plugins in
``setup_requires``.  When you create a source distribution with the ``sdist``
command, setuptools automatically records what files were found in the
``SOURCES.txt`` file.  That way, recipients of source distributions don't need
to have revision control at all.  However, if someone is working on a package
by checking out with that system, they will need the same plugin(s) that the
original author is using.

A few important points for writing revision control file finders:

* Your finder function MUST return relative paths, created by appending to the
  passed-in directory name.  Absolute paths are NOT allowed, nor are relative
  paths that reference a parent directory of the passed-in directory.

* Your finder function MUST accept an empty string as the directory name,
  meaning the current directory.  You MUST NOT convert this to a dot; just
  yield relative paths.  So, yielding a subdirectory named ``some/dir`` under
  the current directory should NOT be rendered as ``./some/dir`` or
  ``/somewhere/some/dir``, but *always* as simply ``some/dir``

* Your finder function SHOULD NOT raise any errors, and SHOULD deal gracefully
  with the absence of needed programs (i.e., ones belonging to the revision
  control system itself.  It *may*, however, use ``distutils.log.warn()`` to
  inform the user of the missing program(s).
PK�(�\C���"�"7doc/alt-python37-setuptools/docs/userguide/keywords.rstnu�[���New and Changed ``setup()`` Keywords
====================================

The following keyword arguments to ``setup()`` are added or changed by
``setuptools``.  All of them are optional; you do not have to supply them
unless you need the associated ``setuptools`` feature.

``include_package_data``
    If set to ``True``, this tells ``setuptools`` to automatically include any
    data files it finds inside your package directories that are specified by
    your ``MANIFEST.in`` file.  For more information, see the section on
    :ref:`Including Data Files`.

``exclude_package_data``
    A dictionary mapping package names to lists of glob patterns that should
    be *excluded* from your package directories.  You can use this to trim back
    any excess files included by ``include_package_data``.  For a complete
    description and examples, see the section on :ref:`Including Data Files`.

``package_data``
    A dictionary mapping package names to lists of glob patterns.  For a
    complete description and examples, see the section on :ref:`Including
    Data Files`.  You do not need to use this option if you are using
    ``include_package_data``, unless you need to add e.g. files that are
    generated by your setup script and build process.  (And are therefore not
    in source control or are files that you don't want to include in your
    source distribution.)

``zip_safe``
    A boolean (True or False) flag specifying whether the project can be
    safely installed and run from a zip file.  If this argument is not
    supplied, the ``bdist_egg`` command will have to analyze all of your
    project's contents for possible problems each time it builds an egg.

``install_requires``
    A string or list of strings specifying what other distributions need to
    be installed when this one is.  See the section on :ref:`Declaring
    Dependencies` for details and examples of the format of this argument.

``entry_points``
    A dictionary mapping entry point group names to strings or lists of strings
    defining the entry points.  Entry points are used to support dynamic
    discovery of services or plugins provided by a project.  See :ref:`Dynamic
    Discovery of Services and Plugins` for details and examples of the format
    of this argument.  In addition, this keyword is used to support
    :ref:`Automatic Script Creation <entry_points>`.

``extras_require``
    A dictionary mapping names of "extras" (optional features of your project)
    to strings or lists of strings specifying what other distributions must be
    installed to support those features.  See the section on :ref:`Declaring
    Dependencies` for details and examples of the format of this argument.

``python_requires``
    A string corresponding to a version specifier (as defined in PEP 440) for
    the Python version, used to specify the Requires-Python defined in PEP 345.

``setup_requires``
    A string or list of strings specifying what other distributions need to
    be present in order for the *setup script* to run.  ``setuptools`` will
    attempt to obtain these (using pip if available) before processing the
    rest of the setup script or commands.  This argument is needed if you
    are using distutils extensions as part of your build process; for
    example, extensions that process setup() arguments and turn them into
    EGG-INFO metadata files.

    (Note: projects listed in ``setup_requires`` will NOT be automatically
    installed on the system where the setup script is being run.  They are
    simply downloaded to the ./.eggs directory if they're not locally available
    already.  If you want them to be installed, as well as being available
    when the setup script is run, you should add them to ``install_requires``
    **and** ``setup_requires``.)

``dependency_links``
    A list of strings naming URLs to be searched when satisfying dependencies.
    These links will be used if needed to install packages specified by
    ``setup_requires`` or ``tests_require``.  They will also be written into
    the egg's metadata for use during install by tools that support them.

``namespace_packages``
    A list of strings naming the project's "namespace packages".  A namespace
    package is a package that may be split across multiple project
    distributions.  For example, Zope 3's ``zope`` package is a namespace
    package, because subpackages like ``zope.interface`` and ``zope.publisher``
    may be distributed separately.  The egg runtime system can automatically
    merge such subpackages into a single parent package at runtime, as long
    as you declare them in each project that contains any subpackages of the
    namespace package, and as long as the namespace package's ``__init__.py``
    does not contain any code other than a namespace declaration.  See the
    section below on :ref:`Namespace Packages` for more information.

``test_suite``
    A string naming a ``unittest.TestCase`` subclass (or a package or module
    containing one or more of them, or a method of such a subclass), or naming
    a function that can be called with no arguments and returns a
    ``unittest.TestSuite``.  If the named suite is a module, and the module
    has an ``additional_tests()`` function, it is called and the results are
    added to the tests to be run.  If the named suite is a package, any
    submodules and subpackages are recursively added to the overall test suite.

    Specifying this argument enables use of the :ref:`test <test>` command to run the
    specified test suite, e.g. via ``setup.py test``.  See the section on the
    :ref:`test <test>` command below for more details.

    New in 41.5.0: Deprecated the test command.

``tests_require``
    If your project's tests need one or more additional packages besides those
    needed to install it, you can use this option to specify them.  It should
    be a string or list of strings specifying what other distributions need to
    be present for the package's tests to run.  When you run the ``test``
    command, ``setuptools`` will  attempt to obtain these (using pip if
    available).  Note that these required projects will *not* be installed on
    the system where the tests are run, but only downloaded to the project's setup
    directory if they're not already installed locally.

    New in 41.5.0: Deprecated the test command.

.. _test_loader:

``test_loader``
    If you would like to use a different way of finding tests to run than what
    setuptools normally uses, you can specify a module name and class name in
    this argument.  The named class must be instantiable with no arguments, and
    its instances must support the ``loadTestsFromNames()`` method as defined
    in the Python ``unittest`` module's ``TestLoader`` class.  Setuptools will
    pass only one test "name" in the ``names`` argument: the value supplied for
    the ``test_suite`` argument.  The loader you specify may interpret this
    string in any way it likes, as there are no restrictions on what may be
    contained in a ``test_suite`` string.

    The module name and class name must be separated by a ``:``.  The default
    value of this argument is ``"setuptools.command.test:ScanningLoader"``.  If
    you want to use the default ``unittest`` behavior, you can specify
    ``"unittest:TestLoader"`` as your ``test_loader`` argument instead.  This
    will prevent automatic scanning of submodules and subpackages.

    The module and class you specify here may be contained in another package,
    as long as you use the ``tests_require`` option to ensure that the package
    containing the loader class is available when the ``test`` command is run.

    New in 41.5.0: Deprecated the test command.

``eager_resources``
    A list of strings naming resources that should be extracted together, if
    any of them is needed, or if any C extensions included in the project are
    imported.  This argument is only useful if the project will be installed as
    a zipfile, and there is a need to have all of the listed resources be
    extracted to the filesystem *as a unit*.  Resources listed here
    should be "/"-separated paths, relative to the source root, so to list a
    resource ``foo.png`` in package ``bar.baz``, you would include the string
    ``bar/baz/foo.png`` in this argument.

    If you only need to obtain resources one at a time, or you don't have any C
    extensions that access other files in the project (such as data files or
    shared libraries), you probably do NOT need this argument and shouldn't
    mess with it.  For more details on how this argument works, see the section
    below on :ref:`Automatic Resource Extraction`.

``project_urls``
    An arbitrary map of URL names to hyperlinks, allowing more extensible
    documentation of where various resources can be found than the simple
    ``url`` and ``download_url`` options provide.
PK�(�\4/o�*�*Ddoc/alt-python37-setuptools/docs/userguide/dependency_management.rstnu�[���=====================================
Dependencies Management in Setuptools
=====================================

There are three types of dependency styles offered by setuptools:
1) build system requirement, 2) required dependency and 3) optional
dependency.

.. Note::
    Packages that are added to dependency can be optionally specified with the
    version by following `PEP 440 <https://www.python.org/dev/peps/pep-0440/>`_


Build system requirement
========================

Package requirement
-------------------
After organizing all the scripts and files and getting ready for packaging,
there needs to be a way to tell Python what programs it needs to actually
do the packaging (in our case, ``setuptools`` of course). Usually,
you also need the ``wheel`` package as well since it is recommended that you
upload a ``.whl`` file to PyPI alongside your ``.tar.gz`` file. Unlike the
other two types of dependency keyword, this one is specified in your
``pyproject.toml`` file (if you have forgot what this is, go to
:doc:`quickstart` or (WIP)):

.. code-block:: ini

    [build-system]
    requires = ["setuptools", "wheel"]
    #...

.. note::
    This used to be accomplished with the ``setup_requires`` keyword but is
    now considered deprecated in favor of the PEP 517 style described above.
    To peek into how this legacy keyword is used, consult our :doc:`guide on
    deprecated practice (WIP) <../deprecated/index>`


.. _Declaring Dependencies:

Declaring required dependency
=============================
This is where a package declares its core dependencies, without which it won't
be able to run. ``setuptools`` support automatically download and install
these dependencies when the package is installed. Although there is more
finesse to it, let's start with a simple example.

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        install_requires =
            docutils
            BazSpam ==1.1

.. tab:: setup.py

    .. code-block:: python

        setup(
            ...,
            install_requires=[
                'docutils',
                'BazSpam ==1.1',
            ],
        )


When your project is installed (e.g. using pip), all of the dependencies not
already installed will be located (via PyPI), downloaded, built (if necessary),
and installed and 2) Any scripts in your project will be installed with wrappers
that verify the availability of the specified dependencies at runtime.


Platform specific dependencies
------------------------------
Setuptools offer the capability to evaluate certain conditions before blindly
installing everything listed in ``install_requires``. This is great for platform
specific dependencies. For example, the ``enum`` package was added in Python
3.4, therefore, package that depends on it can elect to install it only when
the Python version is older than 3.4. To accomplish this

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        install_requires =
            enum34;python_version<'3.4'

.. tab:: setup.py

    .. code-block:: python

        setup(
            ...,
            install_requires=[
                "enum34;python_version<'3.4'",
            ],
        )

Similarly, if you also wish to declare ``pywin32`` with a minimal version of 1.0
and only install it if the user is using a Windows operating system:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        install_requires =
            enum34;python_version<'3.4'
            pywin32 >= 1.0;platform_system=='Windows'

.. tab:: setup.py

    .. code-block:: python

        setup(
            ...,
            install_requires=[
                "enum34;python_version<'3.4'",
                "pywin32 >= 1.0;platform_system=='Windows'",
            ],
        )

The environmental markers that may be used for testing platform types are
detailed in `PEP 508 <https://www.python.org/dev/peps/pep-0508/>`_.


Dependencies that aren't in PyPI
--------------------------------
.. warning::
    Dependency links support has been dropped by pip starting with version
    19.0 (released 2019-01-22).

If your project depends on packages that don't exist on PyPI, you may still be
able to depend on them, as long as they are available for download as:

- an egg, in the standard distutils ``sdist`` format,
- a single ``.py`` file, or
- a VCS repository (Subversion, Mercurial, or Git).

You just need to add some URLs to the ``dependency_links`` argument to
``setup()``.

The URLs must be either:

1. direct download URLs,
2. the URLs of web pages that contain direct download links, or
3. the repository's URL

In general, it's better to link to web pages, because it is usually less
complex to update a web page than to release a new version of your project.
You can also use a SourceForge ``showfiles.php`` link in the case where a
package you depend on is distributed via SourceForge.

If you depend on a package that's distributed as a single ``.py`` file, you
must include an ``"#egg=project-version"`` suffix to the URL, to give a project
name and version number.  (Be sure to escape any dashes in the name or version
by replacing them with underscores.)  EasyInstall will recognize this suffix
and automatically create a trivial ``setup.py`` to wrap the single ``.py`` file
as an egg.

In the case of a VCS checkout, you should also append ``#egg=project-version``
in order to identify for what package that checkout should be used. You can
append ``@REV`` to the URL's path (before the fragment) to specify a revision.
Additionally, you can also force the VCS being used by prepending the URL with
a certain prefix. Currently available are:

-  ``svn+URL`` for Subversion,
-  ``git+URL`` for Git, and
-  ``hg+URL`` for Mercurial

A more complete example would be:

    ``vcs+proto://host/path@revision#egg=project-version``

Be careful with the version. It should match the one inside the project files.
If you want to disregard the version, you have to omit it both in the
``requires`` and in the URL's fragment.

This will do a checkout (or a clone, in Git and Mercurial parlance) to a
temporary folder and run ``setup.py bdist_egg``.

The ``dependency_links`` option takes the form of a list of URL strings.  For
example, this will cause a search of the specified page for eggs or source
distributions, if the package's dependencies aren't already installed:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        dependency_links = http://peak.telecommunity.com/snapshots/

.. tab:: setup.py

    .. code-block:: python

        setup(
            ...,
            dependency_links=[
                "http://peak.telecommunity.com/snapshots/",
            ],
        )


Optional dependencies
=====================
Setuptools allows you to declare dependencies that only get installed under
specific circumstances. These dependencies are specified with ``extras_require``
keyword and are only installed if another package depends on it (either
directly or indirectly) This makes it convenient to declare dependencies for
ancillary functions such as "tests" and "docs".

.. note::
    ``tests_require`` is now deprecated

For example, Package-A offers optional PDF support and requires two other
dependencies for it to work:

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Package-A

        [options.extras_require]
        PDF = ReportLab>=1.2; RXP


.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Project-A",
            ...,
            extras_require={
                "PDF": ["ReportLab>=1.2", "RXP"],
            },
        )

The name ``PDF`` is an arbitrary identifier of such a list of dependencies, to
which other components can refer and have them installed. There are two common
use cases.

First is the console_scripts entry point:

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Project A
        #...

        [options]
        #...
        entry_points=
            [console_scripts]
            rst2pdf = project_a.tools.pdfgen [PDF]
            rst2html = project_a.tools.htmlgen

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Project-A",
            ...,
            entry_points={
                "console_scripts": [
                    "rst2pdf = project_a.tools.pdfgen [PDF]",
                    "rst2html = project_a.tools.htmlgen",
                ],
            },
        )

This syntax indicates that the entry point (in this case a console script)
is only valid when the PDF extra is installed. It is up to the installer
to determine how to handle the situation where PDF was not indicated
(e.g. omit the console script, provide a warning when attempting to load
the entry point, assume the extras are present and let the implementation
fail later).

The second use case is that other package can use this "extra" for their
own dependencies. For example, if "Project-B" needs "project A" with PDF support
installed, it might declare the dependency like this:

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Project-B
        #...

        [options]
        #...
        install_requires =
            Project-A[PDF]

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Project-B",
            install_requires=["Project-A[PDF]"],
            ...,
        )

This will cause ReportLab to be installed along with project A, if project B is
installed -- even if project A was already installed.  In this way, a project
can encapsulate groups of optional "downstream dependencies" under a feature
name, so that packages that depend on it don't have to know what the downstream
dependencies are.  If a later version of Project A builds in PDF support and
no longer needs ReportLab, or if it ends up needing other dependencies besides
ReportLab in order to provide PDF support, Project B's setup information does
not need to change, but the right packages will still be installed if needed.

.. note::
    Best practice: if a project ends up not needing any other packages to
    support a feature, it should keep an empty requirements list for that feature
    in its ``extras_require`` argument, so that packages depending on that feature
    don't break (due to an invalid feature name).


Python requirement
==================
In some cases, you might need to specify the minimum required python version.
This is handled with the ``python_requires`` keyword supplied to ``setup.cfg``
or ``setup.py``.


.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Project-B
        #...

        [options]
        #...
        python_requires = >=3.6

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Project-B",
            python_requires=[">=3.6"],
            ...,
        )
PK�(�\Ѩ���1�1;doc/alt-python37-setuptools/docs/userguide/distribution.rstnu�[���Tagging and "Daily Build" or "Snapshot" Releases
------------------------------------------------

When a set of related projects are under development, it may be important to
track finer-grained version increments than you would normally use for e.g.
"stable" releases.  While stable releases might be measured in dotted numbers
with alpha/beta/etc. status codes, development versions of a project often
need to be tracked by revision or build number or even build date.  This is
especially true when projects in development need to refer to one another, and
therefore may literally need an up-to-the-minute version of something!

To support these scenarios, ``setuptools`` allows you to "tag" your source and
egg distributions by adding one or more of the following to the project's
"official" version identifier:

* A manually-specified pre-release tag, such as "build" or "dev", or a
  manually-specified post-release tag, such as a build or revision number
  (``--tag-build=STRING, -bSTRING``)

* An 8-character representation of the build date (``--tag-date, -d``), as
  a postrelease tag

You can add these tags by adding ``egg_info`` and the desired options to
the command line ahead of the ``sdist`` or ``bdist`` commands that you want
to generate a daily build or snapshot for.  See the section below on the
:ref:`egg_info <egg_info>` command for more details.

(Also, before you release your project, be sure to see the section on
:ref:`Specifying Your Project's Version` for more information about how pre- and
post-release tags affect how version numbers are interpreted.  This is
important in order to make sure that dependency processing tools will know
which versions of your project are newer than others.)

Finally, if you are creating builds frequently, and either building them in a
downloadable location or are copying them to a distribution server, you should
probably also check out the :ref:`rotate <rotate>` command, which lets you automatically
delete all but the N most-recently-modified distributions matching a glob
pattern.  So, you can use a command line like::

    setup.py egg_info -rbDEV bdist_egg rotate -m.egg -k3

to build an egg whose version info includes "DEV-rNNNN" (where NNNN is the
most recent Subversion revision that affected the source tree), and then
delete any egg files from the distribution directory except for the three
that were built most recently.

If you have to manage automated builds for multiple packages, each with
different tagging and rotation policies, you may also want to check out the
:ref:`alias <alias>` command, which would let each package define an alias like ``daily``
that would perform the necessary tag, build, and rotate commands.  Then, a
simpler script or cron job could just run ``setup.py daily`` in each project
directory.  (And, you could also define sitewide or per-user default versions
of the ``daily`` alias, so that projects that didn't define their own would
use the appropriate defaults.)

Generating Source Distributions
-------------------------------

``setuptools`` enhances the distutils' default algorithm for source file
selection with pluggable endpoints for looking up files to include. If you are
using a revision control system, and your source distributions only need to
include files that you're tracking in revision control, use a corresponding
plugin instead of writing a ``MANIFEST.in`` file. See the section below on
:ref:`Adding Support for Revision Control Systems` for information on plugins.

If you need to include automatically generated files, or files that are kept in
an unsupported revision control system, you'll need to create a ``MANIFEST.in``
file to specify any files that the default file location algorithm doesn't
catch.  See the distutils documentation for more information on the format of
the ``MANIFEST.in`` file.

But, be sure to ignore any part of the distutils documentation that deals with
``MANIFEST`` or how it's generated from ``MANIFEST.in``; setuptools shields you
from these issues and doesn't work the same way in any case.  Unlike the
distutils, setuptools regenerates the source distribution manifest file
every time you build a source distribution, and it builds it inside the
project's ``.egg-info`` directory, out of the way of your main project
directory.  You therefore need not worry about whether it is up-to-date or not.

Indeed, because setuptools' approach to determining the contents of a source
distribution is so much simpler, its ``sdist`` command omits nearly all of
the options that the distutils' more complex ``sdist`` process requires.  For
all practical purposes, you'll probably use only the ``--formats`` option, if
you use any option at all.


Making "Official" (Non-Snapshot) Releases
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When you make an official release, creating source or binary distributions,
you will need to override the tag settings from ``setup.cfg``, so that you
don't end up registering versions like ``foobar-0.7a1.dev-r34832``.  This is
easy to do if you are developing on the trunk and using tags or branches for
your releases - just make the change to ``setup.cfg`` after branching or
tagging the release, so the trunk will still produce development snapshots.

Alternately, if you are not branching for releases, you can override the
default version options on the command line, using something like::

    setup.py egg_info -Db "" sdist bdist_egg

The first part of this command (``egg_info -Db ""``) will override the
configured tag information, before creating source and binary eggs. Thus, these
commands will use the plain version from your ``setup.py``, without adding the
build designation string.

Of course, if you will be doing this a lot, you may wish to create a personal
alias for this operation, e.g.::

    setup.py alias -u release egg_info -Db ""

You can then use it like this::

    setup.py release sdist bdist_egg

Or of course you can create more elaborate aliases that do all of the above.
See the sections below on the :ref:`egg_info <egg_info>` and
:ref:`alias <alias>` commands for more ideas.

Distributing Extensions compiled with Cython
--------------------------------------------

``setuptools`` will detect at build time whether Cython is installed or not.
If Cython is not found ``setuptools`` will ignore pyx files.

To ensure Cython is available, include Cython in the build-requires section
of your pyproject.toml::

    [build-system]
    requires=[..., "cython"]

Built with pip 10 or later, that declaration is sufficient to include Cython
in the build. For broader compatibility, declare the dependency in your
setup-requires of setup.cfg::

    [options]
    setup_requires =
        ...
        cython

As long as Cython is present in the build environment, ``setuptools`` includes
transparent support for building Cython extensions, as
long as extensions are defined using ``setuptools.Extension``.

If you follow these rules, you can safely list ``.pyx`` files as the source
of your ``Extension`` objects in the setup script.  If it is, then ``setuptools``
will use it.

Of course, for this to work, your source distributions must include the C
code generated by Cython, as well as your original ``.pyx`` files.  This means
that you will probably want to include current ``.c`` files in your revision
control system, rebuilding them whenever you check changes in for the ``.pyx``
source files.  This will ensure that people tracking your project in a revision
control system will be able to build it even if they don't have Cython
installed, and that your source releases will be similarly usable with or
without Cython.


.. _Specifying Your Project's Version:

Specifying Your Project's Version
---------------------------------

Setuptools can work well with most versioning schemes. Over the years,
setuptools has tried to closely follow the 
`PEP 440 <https://www.python.org/dev/peps/pep-0440/>`_ scheme, but it
also supports legacy versions. There are, however, a
few special things to watch out for, in order to ensure that setuptools and
other tools can always tell what version of your package is newer than another
version.  Knowing these things will also help you correctly specify what
versions of other projects your project depends on.

A version consists of an alternating series of release numbers and pre-release
or post-release tags.  A release number is a series of digits punctuated by
dots, such as ``2.4`` or ``0.5``.  Each series of digits is treated
numerically, so releases ``2.1`` and ``2.1.0`` are different ways to spell the
same release number, denoting the first subrelease of release 2.  But  ``2.10``
is the *tenth* subrelease of release 2, and so is a different and newer release
from ``2.1`` or ``2.1.0``.  Leading zeros within a series of digits are also
ignored, so ``2.01`` is the same as ``2.1``, and different from ``2.0.1``.

Following a release number, you can have either a pre-release or post-release
tag.  Pre-release tags make a version be considered *older* than the version
they are appended to.  So, revision ``2.4`` is *newer* than revision ``2.4c1``,
which in turn is newer than ``2.4b1`` or ``2.4a1``.  Postrelease tags make
a version be considered *newer* than the version they are appended to.  So,
revisions like ``2.4-1`` are newer than ``2.4``, but *older*
than ``2.4.1`` (which has a higher release number).

In the case of legacy versions (for example, ``2.4pl1``), they are considered
older than non-legacy versions. Taking that in count, a revision ``2.4pl1``
is *older* than ``2.4``

A pre-release tag is a series of letters that are alphabetically before
"final".  Some examples of prerelease tags would include ``alpha``, ``beta``,
``a``, ``c``, ``dev``, and so on.  You do not have to place a dot or dash
before the prerelease tag if it's immediately after a number, but it's okay to
do so if you prefer.  Thus, ``2.4c1`` and ``2.4.c1`` and ``2.4-c1`` all
represent release candidate 1 of version ``2.4``, and are treated as identical
by setuptools.

In addition, there are three special prerelease tags that are treated as if
they were the letter ``c``: ``pre``, ``preview``, and ``rc``.  So, version
``2.4rc1``, ``2.4pre1`` and ``2.4preview1`` are all the exact same version as
``2.4c1``, and are treated as identical by setuptools.

A post-release tag is either a series of letters that are alphabetically
greater than or equal to "final", or a dash (``-``).  Post-release tags are
generally used to separate patch numbers, port numbers, build numbers, revision
numbers, or date stamps from the release number.  For example, the version
``2.4-r1263`` might denote Subversion revision 1263 of a post-release patch of
version ``2.4``.  Or you might use ``2.4-20051127`` to denote a date-stamped
post-release.

Notice that after each pre or post-release tag, you are free to place another
release number, followed again by more pre- or post-release tags.  For example,
``0.6a9.dev-r41475`` could denote Subversion revision 41475 of the in-
development version of the ninth alpha of release 0.6.  Notice that ``dev`` is
a pre-release tag, so this version is a *lower* version number than ``0.6a9``,
which would be the actual ninth alpha of release 0.6.  But the ``-r41475`` is
a post-release tag, so this version is *newer* than ``0.6a9.dev``.

For the most part, setuptools' interpretation of version numbers is intuitive,
but here are a few tips that will keep you out of trouble in the corner cases:

* Don't stick adjoining pre-release tags together without a dot or number
  between them.  Version ``1.9adev`` is the ``adev`` prerelease of ``1.9``,
  *not* a development pre-release of ``1.9a``.  Use ``.dev`` instead, as in
  ``1.9a.dev``, or separate the prerelease tags with a number, as in
  ``1.9a0dev``.  ``1.9a.dev``, ``1.9a0dev``, and even ``1.9.a.dev`` are
  identical versions from setuptools' point of view, so you can use whatever
  scheme you prefer.

* If you want to be certain that your chosen numbering scheme works the way
  you think it will, you can use the ``pkg_resources.parse_version()`` function
  to compare different version numbers::

    >>> from pkg_resources import parse_version
    >>> parse_version("1.9.a.dev") == parse_version("1.9a0dev")
    True
    >>> parse_version("2.1-rc2") < parse_version("2.1")
    True
    >>> parse_version("0.6a9dev-r41475") < parse_version("0.6a9")
    True

Once you've decided on a version numbering scheme for your project, you can
have setuptools automatically tag your in-development releases with various
pre- or post-release tags.  See the following sections for more details:

* `Tagging and "Daily Build" or "Snapshot" Releases`_
* The :ref:`egg_info <egg_info>` command
PK�(�\\��ى�:doc/alt-python37-setuptools/docs/userguide/entry_point.rstnu�[���.. _`entry_points`:

============
Entry Points
============

Packages may provide commands to be run at the console (console scripts),
such as the ``pip`` command. These commands are defined for a package
as a specific kind of entry point in the ``setup.cfg`` or
``setup.py``.


Console Scripts
===============

First consider an example without entry points. Imagine a package
defined thus:

.. code-block:: bash

    timmins/
        timmins/__init__.py
        timmins/__main__.py
        setup.cfg # or setup.py
        #other necessary files

with ``__init__.py`` as:

.. code-block:: python

    def hello_world():
        print("Hello world")

and ``__main__.py`` providing a hook:

.. code-block:: python

    from . import hello_world

    if __name__ == '__main__':
        hello_world()

After installing the package, the function may be invoked through the
`runpy <https://docs.python.org/3/library/runpy.html>`_ module:

.. code-block:: bash

    python -m timmins

Adding a console script entry point allows the package to define a
user-friendly name for installers of the package to execute. Installers
like pip will create wrapper scripts to execute a function. In the
above example, to create a command ``hello-world`` that invokes
``timmins.hello_world``, add a console script entry point to
``setup.cfg``:

.. code-block:: ini

    [options.entry_points]
    console_scripts =
        hello-world = timmins:hello_world

After installing the package, a user may invoke that function by simply calling
``hello-world`` on the command line.

The syntax for entry points is specified as follows:

.. code-block:: ini

    <name> = [<package>.[<subpackage>.]]<module>[:<object>.<object>]

where ``name`` is the name for the script you want to create, the left hand
side of ``:`` is the module that contains your function and the right hand
side is the object you want to invoke (e.g. a function).

In addition to ``console_scripts``, Setuptools supports ``gui_scripts``, which
will launch a GUI application without running in a terminal window.


.. _dynamic discovery of services and plugins:

Advertising Behavior
====================

Console scripts are one use of the more general concept of entry points. Entry
points more generally allow a packager to advertise behavior for discovery by
other libraries and applications. This feature enables "plug-in"-like
functionality, where one library solicits entry points and any number of other
libraries provide those entry points.

A good example of this plug-in behavior can be seen in
`pytest plugins <https://docs.pytest.org/en/latest/writing_plugins.html>`_,
where pytest is a test framework that allows other libraries to extend
or modify its functionality through the ``pytest11`` entry point.

The console scripts work similarly, where libraries advertise their commands
and tools like ``pip`` create wrapper scripts that invoke those commands.

For a project wishing to solicit entry points, Setuptools recommends the
`importlib.metadata <https://docs.python.org/3/library/importlib.metadata.html>`_
module (part of stdlib since Python 3.8) or its backport,
`importlib_metadata <https://pypi.org/project/importlib_metadata>`_.

For example, to find the console script entry points from the example above:

.. code-block:: pycon

    >>> from importlib import metadata
    >>> eps = metadata.entry_points()['console_scripts']

``eps`` is now a list of ``EntryPoint`` objects, one of which corresponds
to the ``hello-world = timmins:hello_world`` defined above. Each ``EntryPoint``
contains the ``name``, ``group``, and ``value``. It also supplies a ``.load()``
method to import and load that entry point (module or object).

.. code-block:: ini

    [options.entry_points]
    my.plugins =
        hello-world = timmins:hello_world

Then, a different project wishing to load 'my.plugins' plugins could run
the following routine to load (and invoke) such plugins:

.. code-block:: pycon

    >>> from importlib import metadata
    >>> eps = metadata.entry_points()['my.plugins']
    >>> for ep in eps:
    ...     plugin = ep.load()
    ...     plugin()
    ...

The project soliciting the entry points needs not to have any dependency
or prior knowledge about the libraries implementing the entry points, and
downstream users are able to compose functionality by pulling together
libraries implementing the entry points.


Dependency Management
=====================

Some entry points may require additional dependencies to properly function.
For such an entry point, declare in square brackets any number of dependency
``extras`` following the entry point definition. Such entry points will only
be viable if their extras were declared and installed. See the
:doc:`guide on dependencies management <dependency_management>` for
more information on defining extra requirements. Consider from the
above example:

.. code-block:: ini

    [options.entry_points]
    console_scripts =
        hello-world = timmins:hello_world [pretty-printer]

In this case, the ``hello-world`` script is only viable if the ``pretty-printer``
extra is indicated, and so a plugin host might exclude that entry point
(i.e. not install a console script) if the relevant extra dependencies are not
installed.
PK�(�\'��*VVFdoc/alt-python37-setuptools/docs/userguide/functionalities_rewrite.rstnu�[���========================================================
Using setuptools to package and distribute your project
========================================================

``setuptools`` offers a variety of functionalities that make it easy to
build and distribute your python package. Here we provide an overview on
the commonly used ones.


PK�(�\���@�j�j7doc/alt-python37-setuptools/docs/userguide/commands.rstnu�[���-----------------
Command Reference
-----------------

.. _alias:

``alias`` - Define shortcuts for commonly used commands
=======================================================

Sometimes, you need to use the same commands over and over, but you can't
necessarily set them as defaults.  For example, if you produce both development
snapshot releases and "stable" releases of a project, you may want to put
the distributions in different places, or use different ``egg_info`` tagging
options, etc.  In these cases, it doesn't make sense to set the options in
a distutils configuration file, because the values of the options changed based
on what you're trying to do.

Setuptools therefore allows you to define "aliases" - shortcut names for
an arbitrary string of commands and options, using ``setup.py alias aliasname
expansion``, where aliasname is the name of the new alias, and the remainder of
the command line supplies its expansion.  For example, this command defines
a sitewide alias called "daily", that sets various ``egg_info`` tagging
options::

    setup.py alias --global-config daily egg_info --tag-build=development

Once the alias is defined, it can then be used with other setup commands,
e.g.::

    setup.py daily bdist_egg        # generate a daily-build .egg file
    setup.py daily sdist            # generate a daily-build source distro
    setup.py daily sdist bdist_egg  # generate both

The above commands are interpreted as if the word ``daily`` were replaced with
``egg_info --tag-build=development``.

Note that setuptools will expand each alias *at most once* in a given command
line.  This serves two purposes.  First, if you accidentally create an alias
loop, it will have no effect; you'll instead get an error message about an
unknown command.  Second, it allows you to define an alias for a command, that
uses that command.  For example, this (project-local) alias::

    setup.py alias bdist_egg bdist_egg rotate -k1 -m.egg

redefines the ``bdist_egg`` command so that it always runs the ``rotate``
command afterwards to delete all but the newest egg file.  It doesn't loop
indefinitely on ``bdist_egg`` because the alias is only expanded once when
used.

You can remove a defined alias with the ``--remove`` (or ``-r``) option, e.g.::

    setup.py alias --global-config --remove daily

would delete the "daily" alias we defined above.

Aliases can be defined on a project-specific, per-user, or sitewide basis.  The
default is to define or remove a project-specific alias, but you can use any of
the `configuration file options`_ (listed under the `saveopts`_ command, below)
to determine which distutils configuration file an aliases will be added to
(or removed from).

Note that if you omit the "expansion" argument to the ``alias`` command,
you'll get output showing that alias' current definition (and what
configuration file it's defined in).  If you omit the alias name as well,
you'll get a listing of all current aliases along with their configuration
file locations.


``bdist_egg`` - Create a Python Egg for the project
===================================================

.. warning::
    **eggs** are deprecated in favor of wheels, and not supported by pip.

This command generates a Python Egg (``.egg`` file) for the project.  Python
Eggs are the preferred binary distribution format for EasyInstall, because they
are cross-platform (for "pure" packages), directly importable, and contain
project metadata including scripts and information about the project's
dependencies.  They can be simply downloaded and added to ``sys.path``
directly, or they can be placed in a directory on ``sys.path`` and then
automatically discovered by the egg runtime system.

This command runs the `egg_info`_ command (if it hasn't already run) to update
the project's metadata (``.egg-info``) directory.  If you have added any extra
metadata files to the ``.egg-info`` directory, those files will be included in
the new egg file's metadata directory, for use by the egg runtime system or by
any applications or frameworks that use that metadata.

You won't usually need to specify any special options for this command; just
use ``bdist_egg`` and you're done.  But there are a few options that may
be occasionally useful:

``--dist-dir=DIR, -d DIR``
    Set the directory where the ``.egg`` file will be placed.  If you don't
    supply this, then the ``--dist-dir`` setting of the ``bdist`` command
    will be used, which is usually a directory named ``dist`` in the project
    directory.

``--plat-name=PLATFORM, -p PLATFORM``
    Set the platform name string that will be embedded in the egg's filename
    (assuming the egg contains C extensions).  This can be used to override
    the distutils default platform name with something more meaningful.  Keep
    in mind, however, that the egg runtime system expects to see eggs with
    distutils platform names, so it may ignore or reject eggs with non-standard
    platform names.  Similarly, the EasyInstall program may ignore them when
    searching web pages for download links.  However, if you are
    cross-compiling or doing some other unusual things, you might find a use
    for this option.

``--exclude-source-files``
    Don't include any modules' ``.py`` files in the egg, just compiled Python,
    C, and data files.  (Note that this doesn't affect any ``.py`` files in the
    EGG-INFO directory or its subdirectories, since for example there may be
    scripts with a ``.py`` extension which must still be retained.)  We don't
    recommend that you use this option except for packages that are being
    bundled for proprietary end-user applications, or for "embedded" scenarios
    where space is at an absolute premium.  On the other hand, if your package
    is going to be installed and used in compressed form, you might as well
    exclude the source because Python's ``traceback`` module doesn't currently
    understand how to display zipped source code anyway, or how to deal with
    files that are in a different place from where their code was compiled.

There are also some options you will probably never need, but which are there
because they were copied from similar ``bdist`` commands used as an example for
creating this one.  They may be useful for testing and debugging, however,
which is why we kept them:

``--keep-temp, -k``
    Keep the contents of the ``--bdist-dir`` tree around after creating the
    ``.egg`` file.

``--bdist-dir=DIR, -b DIR``
    Set the temporary directory for creating the distribution.  The entire
    contents of this directory are zipped to create the ``.egg`` file, after
    running various installation commands to copy the package's modules, data,
    and extensions here.

``--skip-build``
    Skip doing any "build" commands; just go straight to the
    install-and-compress phases.


.. _develop:

``develop`` - Deploy the project source in "Development Mode"
=============================================================

This command allows you to deploy your project's source for use in one or more
"staging areas" where it will be available for importing.  This deployment is
done in such a way that changes to the project source are immediately available
in the staging area(s), without needing to run a build or install step after
each change.

The ``develop`` command works by creating an ``.egg-link`` file (named for the
project) in the given staging area.  If the staging area is Python's
``site-packages`` directory, it also updates an ``easy-install.pth`` file so
that the project is on ``sys.path`` by default for all programs run using that
Python installation.

The ``develop`` command also installs wrapper scripts in the staging area (or
a separate directory, as specified) that will ensure the project's dependencies
are available on ``sys.path`` before running the project's source scripts.
And, it ensures that any missing project dependencies are available in the
staging area, by downloading and installing them if necessary.

Last, but not least, the ``develop`` command invokes the ``build_ext -i``
command to ensure any C extensions in the project have been built and are
up-to-date, and the ``egg_info`` command to ensure the project's metadata is
updated (so that the runtime and wrappers know what the project's dependencies
are).  If you make any changes to the project's setup script or C extensions,
you should rerun the ``develop`` command against all relevant staging areas to
keep the project's scripts, metadata and extensions up-to-date.  Most other
kinds of changes to your project should not require any build operations or
rerunning ``develop``, but keep in mind that even minor changes to the setup
script (e.g. changing an entry point definition) require you to re-run the
``develop`` or ``test`` commands to keep the distribution updated.

Here are some of the options that the ``develop`` command accepts.  Note that
they affect the project's dependencies as well as the project itself, so if you
have dependencies that need to be installed and you use ``--exclude-scripts``
(for example), the dependencies' scripts will not be installed either!  For
this reason, you may want to use pip to install the project's dependencies
before using the ``develop`` command, if you need finer control over the
installation options for dependencies.

``--uninstall, -u``
    Un-deploy the current project.  You may use the ``--install-dir`` or ``-d``
    option to designate the staging area.  The created ``.egg-link`` file will
    be removed, if present and it is still pointing to the project directory.
    The project directory will be removed from ``easy-install.pth`` if the
    staging area is Python's ``site-packages`` directory.

    Note that this option currently does *not* uninstall script wrappers!  You
    must uninstall them yourself, or overwrite them by using pip to install a
    different version of the package.  You can also avoid installing script
    wrappers in the first place, if you use the ``--exclude-scripts`` (aka
    ``-x``) option when you run ``develop`` to deploy the project.

``--multi-version, -m``
    "Multi-version" mode. Specifying this option prevents ``develop`` from
    adding an ``easy-install.pth`` entry for the project(s) being deployed, and
    if an entry for any version of a project already exists, the entry will be
    removed upon successful deployment.  In multi-version mode, no specific
    version of the package is available for importing, unless you use
    ``pkg_resources.require()`` to put it on ``sys.path``, or you are running
    a wrapper script generated by ``setuptools``.  (In which case the wrapper
    script calls ``require()`` for you.)

    Note that if you install to a directory other than ``site-packages``,
    this option is automatically in effect, because ``.pth`` files can only be
    used in ``site-packages`` (at least in Python 2.3 and 2.4). So, if you use
    the ``--install-dir`` or ``-d`` option (or they are set via configuration
    file(s)) your project and its dependencies will be deployed in multi-
    version mode.

``--install-dir=DIR, -d DIR``
    Set the installation directory (staging area).  If this option is not
    directly specified on the command line or in a distutils configuration
    file, the distutils default installation location is used.  Normally, this
    will be the ``site-packages`` directory, but if you are using distutils
    configuration files, setting things like ``prefix`` or ``install_lib``,
    then those settings are taken into account when computing the default
    staging area.

``--script-dir=DIR, -s DIR``
    Set the script installation directory.  If you don't supply this option
    (via the command line or a configuration file), but you *have* supplied
    an ``--install-dir`` (via command line or config file), then this option
    defaults to the same directory, so that the scripts will be able to find
    their associated package installation.  Otherwise, this setting defaults
    to the location where the distutils would normally install scripts, taking
    any distutils configuration file settings into account.

``--exclude-scripts, -x``
    Don't deploy script wrappers.  This is useful if you don't want to disturb
    existing versions of the scripts in the staging area.

``--always-copy, -a``
    Copy all needed distributions to the staging area, even if they
    are already present in another directory on ``sys.path``.  By default, if
    a requirement can be met using a distribution that is already available in
    a directory on ``sys.path``, it will not be copied to the staging area.

``--egg-path=DIR``
    Force the generated ``.egg-link`` file to use a specified relative path
    to the source directory.  This can be useful in circumstances where your
    installation directory is being shared by code running under multiple
    platforms (e.g. Mac and Windows) which have different absolute locations
    for the code under development, but the same *relative* locations with
    respect to the installation directory.  If you use this option when
    installing, you must supply the same relative path when uninstalling.

In addition to the above options, the ``develop`` command also accepts all of
the same options accepted by ``easy_install``.  If you've configured any
``easy_install`` settings in your ``setup.cfg`` (or other distutils config
files), the ``develop`` command will use them as defaults, unless you override
them in a ``[develop]`` section or on the command line.


.. _egg_info:

``egg_info`` - Create egg metadata and set build tags
=====================================================

This command performs two operations: it updates a project's ``.egg-info``
metadata directory (used by the ``bdist_egg``, ``develop``, and ``test``
commands), and it allows you to temporarily change a project's version string,
to support "daily builds" or "snapshot" releases.  It is run automatically by
the ``sdist``, ``bdist_egg``, ``develop``, and ``test`` commands in order to
update the project's metadata, but you can also specify it explicitly in order
to temporarily change the project's version string while executing other
commands.  (It also generates the ``.egg-info/SOURCES.txt`` manifest file, which
is used when you are building source distributions.)

In addition to writing the core egg metadata defined by ``setuptools`` and
required by ``pkg_resources``, this command can be extended to write other
metadata files as well, by defining entry points in the ``egg_info.writers``
group.  See the section on :ref:`Adding new EGG-INFO Files` below for more details.
Note that using additional metadata writers may require you to include a
``setup_requires`` argument to ``setup()`` in order to ensure that the desired
writers are available on ``sys.path``.


Release Tagging Options
-----------------------

The following options can be used to modify the project's version string for
all remaining commands on the setup command line.  The options are processed
in the order shown, so if you use more than one, the requested tags will be
added in the following order:

``--tag-build=NAME, -b NAME``
    Append NAME to the project's version string.  Due to the way setuptools
    processes "pre-release" version suffixes beginning with the letters "a"
    through "e" (like "alpha", "beta", and "candidate"), you will usually want
    to use a tag like ".build" or ".dev", as this will cause the version number
    to be considered *lower* than the project's default version.  (If you
    want to make the version number *higher* than the default version, you can
    always leave off --tag-build and then use one or both of the following
    options.)

    If you have a default build tag set in your ``setup.cfg``, you can suppress
    it on the command line using ``-b ""`` or ``--tag-build=""`` as an argument
    to the ``egg_info`` command.

``--tag-date, -d``
    Add a date stamp of the form "-YYYYMMDD" (e.g. "-20050528") to the
    project's version number.

``--no-date, -D``
    Don't include a date stamp in the version number.  This option is included
    so you can override a default setting in ``setup.cfg``.


(Note: Because these options modify the version number used for source and
binary distributions of your project, you should first make sure that you know
how the resulting version numbers will be interpreted by automated tools
like pip.  See the section above on :ref:`Specifying Your Project's Version` for an
explanation of pre- and post-release tags, as well as tips on how to choose and
verify a versioning scheme for your project.)

For advanced uses, there is one other option that can be set, to change the
location of the project's ``.egg-info`` directory.  Commands that need to find
the project's source directory or metadata should get it from this setting:


Other ``egg_info`` Options
--------------------------

``--egg-base=SOURCEDIR, -e SOURCEDIR``
    Specify the directory that should contain the .egg-info directory.  This
    should normally be the root of your project's source tree (which is not
    necessarily the same as your project directory; some projects use a ``src``
    or ``lib`` subdirectory as the source root).  You should not normally need
    to specify this directory, as it is normally determined from the
    ``package_dir`` argument to the ``setup()`` function, if any.  If there is
    no ``package_dir`` set, this option defaults to the current directory.


``egg_info`` Examples
---------------------

Creating a dated "nightly build" snapshot egg::

    setup.py egg_info --tag-date --tag-build=DEV bdist_egg

Creating a release with no version tags, even if some default tags are
specified in ``setup.cfg``::

    setup.py egg_info -RDb "" sdist bdist_egg

(Notice that ``egg_info`` must always appear on the command line *before* any
commands that you want the version changes to apply to.)

.. _rotate:

``rotate`` - Delete outdated distribution files
===============================================

As you develop new versions of your project, your distribution (``dist``)
directory will gradually fill up with older source and/or binary distribution
files.  The ``rotate`` command lets you automatically clean these up, keeping
only the N most-recently modified files matching a given pattern.

``--match=PATTERNLIST, -m PATTERNLIST``
    Comma-separated list of glob patterns to match.  This option is *required*.
    The project name and ``-*`` is prepended to the supplied patterns, in order
    to match only distributions belonging to the current project (in case you
    have a shared distribution directory for multiple projects).  Typically,
    you will use a glob pattern like ``.zip`` or ``.egg`` to match files of
    the specified type.  Note that each supplied pattern is treated as a
    distinct group of files for purposes of selecting files to delete.

``--keep=COUNT, -k COUNT``
    Number of matching distributions to keep.  For each group of files
    identified by a pattern specified with the ``--match`` option, delete all
    but the COUNT most-recently-modified files in that group.  This option is
    *required*.

``--dist-dir=DIR, -d DIR``
    Directory where the distributions are.  This defaults to the value of the
    ``bdist`` command's ``--dist-dir`` option, which will usually be the
    project's ``dist`` subdirectory.

**Example 1**: Delete all .tar.gz files from the distribution directory, except
for the 3 most recently modified ones::

    setup.py rotate --match=.tar.gz --keep=3

**Example 2**: Delete all Python 2.3 or Python 2.4 eggs from the distribution
directory, except the most recently modified one for each Python version::

    setup.py rotate --match=-py2.3*.egg,-py2.4*.egg --keep=1


.. _saveopts:

``saveopts`` - Save used options to a configuration file
========================================================

Finding and editing ``distutils`` configuration files can be a pain, especially
since you also have to translate the configuration options from command-line
form to the proper configuration file format.  You can avoid these hassles by
using the ``saveopts`` command.  Just add it to the command line to save the
options you used.  For example, this command builds the project using
the ``mingw32`` C compiler, then saves the --compiler setting as the default
for future builds (even those run implicitly by the ``install`` command)::

    setup.py build --compiler=mingw32 saveopts

The ``saveopts`` command saves all options for every command specified on the
command line to the project's local ``setup.cfg`` file, unless you use one of
the `configuration file options`_ to change where the options are saved.  For
example, this command does the same as above, but saves the compiler setting
to the site-wide (global) distutils configuration::

    setup.py build --compiler=mingw32 saveopts -g

Note that it doesn't matter where you place the ``saveopts`` command on the
command line; it will still save all the options specified for all commands.
For example, this is another valid way to spell the last example::

    setup.py saveopts -g build --compiler=mingw32

Note, however, that all of the commands specified are always run, regardless of
where ``saveopts`` is placed on the command line.


Configuration File Options
--------------------------

Normally, settings such as options and aliases are saved to the project's
local ``setup.cfg`` file.  But you can override this and save them to the
global or per-user configuration files, or to a manually-specified filename.

``--global-config, -g``
    Save settings to the global ``distutils.cfg`` file inside the ``distutils``
    package directory.  You must have write access to that directory to use
    this option.  You also can't combine this option with ``-u`` or ``-f``.

``--user-config, -u``
    Save settings to the current user's ``~/.pydistutils.cfg`` (POSIX) or
    ``$HOME/pydistutils.cfg`` (Windows) file.  You can't combine this option
    with ``-g`` or ``-f``.

``--filename=FILENAME, -f FILENAME``
    Save settings to the specified configuration file to use.  You can't
    combine this option with ``-g`` or ``-u``.  Note that if you specify a
    non-standard filename, the ``distutils`` and ``setuptools`` will not
    use the file's contents.  This option is mainly included for use in
    testing.

These options are used by other ``setuptools`` commands that modify
configuration files, such as the `alias`_ and `setopt`_ commands.


.. _setopt:

``setopt`` - Set a distutils or setuptools option in a config file
==================================================================

This command is mainly for use by scripts, but it can also be used as a quick
and dirty way to change a distutils configuration option without having to
remember what file the options are in and then open an editor.

**Example 1**.  Set the default C compiler to ``mingw32`` (using long option
names)::

    setup.py setopt --command=build --option=compiler --set-value=mingw32

**Example 2**.  Remove any setting for the distutils default package
installation directory (short option names)::

    setup.py setopt -c install -o install_lib -r


Options for the ``setopt`` command:

``--command=COMMAND, -c COMMAND``
    Command to set the option for.  This option is required.

``--option=OPTION, -o OPTION``
    The name of the option to set.  This option is required.

``--set-value=VALUE, -s VALUE``
    The value to set the option to.  Not needed if ``-r`` or ``--remove`` is
    set.

``--remove, -r``
    Remove (unset) the option, instead of setting it.

In addition to the above options, you may use any of the `configuration file
options`_ (listed under the `saveopts`_ command, above) to determine which
distutils configuration file the option will be added to (or removed from).


.. _test:

``test`` - Build package and run a unittest suite
=================================================

.. warning::
    ``test`` is deprecated and will be removed in a future version. Users
    looking for a generic test entry point independent of test runner are
    encouraged to use `tox <https://tox.readthedocs.io>`_.

When doing test-driven development, or running automated builds that need
testing before they are deployed for downloading or use, it's often useful
to be able to run a project's unit tests without actually deploying the project
anywhere, even using the ``develop`` command.  The ``test`` command runs a
project's unit tests without actually deploying it, by temporarily putting the
project's source on ``sys.path``, after first running ``build_ext -i`` and
``egg_info`` to ensure that any C extensions and project metadata are
up-to-date.

To use this command, your project's tests must be wrapped in a ``unittest``
test suite by either a function, a ``TestCase`` class or method, or a module
or package containing ``TestCase`` classes.  If the named suite is a module,
and the module has an ``additional_tests()`` function, it is called and the
result (which must be a ``unittest.TestSuite``) is added to the tests to be
run.  If the named suite is a package, any submodules and subpackages are
recursively added to the overall test suite.  (Note: if your project specifies
a ``test_loader``, the rules for processing the chosen ``test_suite`` may
differ; see the :ref:`test_loader <test_loader>` documentation for more details.)

Note that many test systems including ``doctest`` support wrapping their
non-``unittest`` tests in ``TestSuite`` objects.  So, if you are using a test
package that does not support this, we suggest you encourage its developers to
implement test suite support, as this is a convenient and standard way to
aggregate a collection of tests to be run under a common test harness.

By default, tests will be run in the "verbose" mode of the ``unittest``
package's text test runner, but you can get the "quiet" mode (just dots) if
you supply the ``-q`` or ``--quiet`` option, either as a global option to
the setup script (e.g. ``setup.py -q test``) or as an option for the ``test``
command itself (e.g. ``setup.py test -q``).  There is one other option
available:

``--test-suite=NAME, -s NAME``
    Specify the test suite (or module, class, or method) to be run
    (e.g. ``some_module.test_suite``).  The default for this option can be
    set by giving a ``test_suite`` argument to the ``setup()`` function, e.g.::

        setup(
            # ...
            test_suite="my_package.tests.test_all"
        )

    If you did not set a ``test_suite`` in your ``setup()`` call, and do not
    provide a ``--test-suite`` option, an error will occur.

New in 41.5.0: Deprecated the test command.


.. _upload:

``upload`` - Upload source and/or egg distributions to PyPI
===========================================================

The ``upload`` command was deprecated in version 40.0 and removed in version
42.0. Use `twine <https://pypi.org/p/twine>`_ instead.

For  more information on the current best practices in uploading your packages
to PyPI, see the Python Packaging User Guide's "Packaging Python Projects"
tutorial specifically the section on `uploading the distribution archives
<https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives>`_.
PK�(�\��`''<doc/alt-python37-setuptools/docs/userguide/miscellaneous.rstnu�[���.. _Automatic Resource Extraction:

Automatic Resource Extraction
-----------------------------

If you are using tools that expect your resources to be "real" files, or your
project includes non-extension native libraries or other files that your C
extensions expect to be able to access, you may need to list those files in
the ``eager_resources`` argument to ``setup()``, so that the files will be
extracted together, whenever a C extension in the project is imported.

This is especially important if your project includes shared libraries *other*
than distutils-built C extensions, and those shared libraries use file
extensions other than ``.dll``, ``.so``, or ``.dylib``, which are the
extensions that setuptools 0.6a8 and higher automatically detects as shared
libraries and adds to the ``native_libs.txt`` file for you.  Any shared
libraries whose names do not end with one of those extensions should be listed
as ``eager_resources``, because they need to be present in the filesystem when
he C extensions that link to them are used.

The ``pkg_resources`` runtime for compressed packages will automatically
extract *all* C extensions and ``eager_resources`` at the same time, whenever
*any* C extension or eager resource is requested via the ``resource_filename()``
API.  (C extensions are imported using ``resource_filename()`` internally.)
This ensures that C extensions will see all of the "real" files that they
expect to see.

Note also that you can list directory resource names in ``eager_resources`` as
well, in which case the directory's contents (including subdirectories) will be
extracted whenever any C extension or eager resource is requested.

Please note that if you're not sure whether you need to use this argument, you
don't!  It's really intended to support projects with lots of non-Python
dependencies and as a last resort for crufty projects that can't otherwise
handle being compressed.  If your package is pure Python, Python plus data
files, or Python plus C, you really don't need this.  You've got to be using
either C or an external program that needs "real" files in your project before
there's any possibility of ``eager_resources`` being relevant to your project.

Defining Additional Metadata
----------------------------

Some extensible applications and frameworks may need to define their own kinds
of metadata to include in eggs, which they can then access using the
``pkg_resources`` metadata APIs.  Ordinarily, this is done by having plugin
developers include additional files in their ``ProjectName.egg-info``
directory.  However, since it can be tedious to create such files by hand, you
may want to create a distutils extension that will create the necessary files
from arguments to ``setup()``, in much the same way that ``setuptools`` does
for many of the ``setup()`` arguments it adds.  See the section below on
:ref:`Creating ``distutils\`\` Extensions` for more details, especially the
subsection on :ref:`Adding new EGG-INFO Files`.

Setting the ``zip_safe`` flag
-----------------------------

For some use cases (such as bundling as part of a larger application), Python
packages may be run directly from a zip file.
Not all packages, however, are capable of running in compressed form, because
they may expect to be able to access either source code or data files as
normal operating system files.  So, ``setuptools`` can install your project
as a zipfile or a directory, and its default choice is determined by the
project's ``zip_safe`` flag.

You can pass a True or False value for the ``zip_safe`` argument to the
``setup()`` function, or you can omit it.  If you omit it, the ``bdist_egg``
command will analyze your project's contents to see if it can detect any
conditions that would prevent it from working in a zipfile.  It will output
notices to the console about any such conditions that it finds.

Currently, this analysis is extremely conservative: it will consider the
project unsafe if it contains any C extensions or datafiles whatsoever.  This
does *not* mean that the project can't or won't work as a zipfile!  It just
means that the ``bdist_egg`` authors aren't yet comfortable asserting that
the project *will* work.  If the project contains no C or data files, and does
no ``__file__`` or ``__path__`` introspection or source code manipulation, then
there is an extremely solid chance the project will work when installed as a
zipfile.  (And if the project uses ``pkg_resources`` for all its data file
access, then C extensions and other data files shouldn't be a problem at all.
See the :ref:`Accessing Data Files at Runtime` section above for more information.)

However, if ``bdist_egg`` can't be *sure* that your package will work, but
you've checked over all the warnings it issued, and you are either satisfied it
*will* work (or if you want to try it for yourself), then you should set
``zip_safe`` to ``True`` in your ``setup()`` call.  If it turns out that it
doesn't work, you can always change it to ``False``, which will force
``setuptools`` to install your project as a directory rather than as a zipfile.

In the future, as we gain more experience with different packages and become
more satisfied with the robustness of the ``pkg_resources`` runtime, the
"zip safety" analysis may become less conservative.  However, we strongly
recommend that you determine for yourself whether your project functions
correctly when installed as a zipfile, correct any problems if you can, and
then make an explicit declaration of ``True`` or ``False`` for the ``zip_safe``
flag, so that it will not be necessary for ``bdist_egg`` to try to guess
whether your project can work as a zipfile.
PK�(�\�S��
�
4doc/alt-python37-setuptools/docs/python 2 sunset.rstnu�[���:orphan:

Python 2 Sunset
===============

Since January 2020 and the release of Setuptools 45, Python 2 is no longer
supported by the most current release (`discussion
<https://github.com/pypa/setuptools/issues/1458>`_). Setuptools as a project
continues to support Python 2 with bugfixes and important features on
Setuptools 44.x.

By design, most users will be unaffected by this change. That's because
Setuptools 45 declares its supported Python versions to exclude Python 2.7,
and installers such as pip 9 or later will honor this declaration and prevent
installation of Setuptools 45 or later in Python 2 environments.

Users that do import any portion of Setuptools 45 or later on Python 2 are
directed to this documentation to provide guidance on how to work around the
issues.

Workarounds
-----------

The best recommendation is to avoid Python 2 and move to Python 3 where
possible. This project acknowledges that not all environments can drop Python
2 support, so provides other options.

In less common scenarios, later versions of Setuptools can be installed on
unsupported Python versions. In these environments, the installer is advised
to first install ``setuptools<45`` to "pin Setuptools" to a compatible
version.

- When using older versions of pip (before 9.0), the ``Requires-Python``
  directive is not honored and invalid versions can be installed. Users are
  advised first to upgrade pip and retry or to pin Setuptools. Use ``pip
  --version`` to determine the version of pip.
- When using ``easy_install``, ``Requires-Python`` is not honored and later
  versions can be installed. In this case, users are advised to pin
  Setuptools. This applies to ``setup.py install`` invocations as well, as
  they use Setuptools under the hood.

It's still not working
----------------------

If after trying the above steps, the Python environment still has incompatible
versions of Setuptools installed, here are some things to try.

1. Uninstall and reinstall Setuptools. Run ``pip uninstall -y setuptools`` for
   the relevant environment. Repeat until there is no Setuptools installed.
   Then ``pip install setuptools``.
2. If possible, attempt to replicate the problem in a second environment
   (virtual machine, friend's computer, etc). If the issue is isolated to just
   one unique environment, first determine what is different about those
   environments (or reinstall/reset the failing one to defaults).
3. End users who are not themselves the maintainers for the package they are
   trying to install should contact the support channels for the relevant
   application. Please be considerate of those projects by searching for
   existing issues and following the latest guidance before reaching out for
   support. When filing an issue, be sure to give as much detail as possible
   to help the maintainers understand what factors led to the issue after
   following their recommended guidance.
4. Reach out to your local support groups. There's a good chance someone
   nearby has the expertise and willingness to help.
5. If all else fails, `file this template
   <https://github.com/pypa/setuptools/issues/new?assignees=&labels=Python+2&template=setuptools-warns-about-python-2-incompatibility.md&title=Incompatible+install+in+(summarize+your+environment)>`_
   with Setuptools. Please complete the whole template, providing as much
   detail about what factors led to the issue. Setuptools maintainers will
   summarily close tickets filed without any meaningful detail or engagement
   with the issue.
PK�(�\
`�nPP(doc/alt-python37-setuptools/docs/conf.pynu�[���extensions = ['sphinx.ext.autodoc', 'jaraco.packaging.sphinx', 'rst.linker']

master_doc = "index"

link_files = {
    '../CHANGES.rst': dict(
        using=dict(
            BB='https://bitbucket.org',
            GH='https://github.com',
        ),
        replace=[
            dict(
                pattern=r'(Issue )?#(?P<issue>\d+)',
                url='{package_url}/issues/{issue}',
            ),
            dict(
                pattern=r'BB Pull Request ?#(?P<bb_pull_request>\d+)',
                url='{BB}/pypa/setuptools/pull-request/{bb_pull_request}',
            ),
            dict(
                pattern=r'Distribute #(?P<distribute>\d+)',
                url='{BB}/tarek/distribute/issue/{distribute}',
            ),
            dict(
                pattern=r'Buildout #(?P<buildout>\d+)',
                url='{GH}/buildout/buildout/issues/{buildout}',
            ),
            dict(
                pattern=r'Old Setuptools #(?P<old_setuptools>\d+)',
                url='http://bugs.python.org/setuptools/issue{old_setuptools}',
            ),
            dict(
                pattern=r'Jython #(?P<jython>\d+)',
                url='http://bugs.jython.org/issue{jython}',
            ),
            dict(
                pattern=r'(Python #|bpo-)(?P<python>\d+)',
                url='http://bugs.python.org/issue{python}',
            ),
            dict(
                pattern=r'Interop #(?P<interop>\d+)',
                url='{GH}/pypa/interoperability-peps/issues/{interop}',
            ),
            dict(
                pattern=r'Pip #(?P<pip>\d+)',
                url='{GH}/pypa/pip/issues/{pip}',
            ),
            dict(
                pattern=r'Packaging #(?P<packaging>\d+)',
                url='{GH}/pypa/packaging/issues/{packaging}',
            ),
            dict(
                pattern=r'[Pp]ackaging (?P<packaging_ver>\d+(\.\d+)+)',
                url='{GH}/pypa/packaging/blob/{packaging_ver}/CHANGELOG.rst',
            ),
            dict(
                pattern=r'PEP[- ](?P<pep_number>\d+)',
                url='https://www.python.org/dev/peps/pep-{pep_number:0>4}/',
            ),
            dict(
                pattern=r'setuptools_svn #(?P<setuptools_svn>\d+)',
                url='{GH}/jaraco/setuptools_svn/issues/{setuptools_svn}',
            ),
            dict(
                pattern=r'pypa/distutils#(?P<distutils>\d+)',
                url='{GH}/pypa/distutils/issues/{distutils}',
            ),
            dict(
                pattern=r'^(?m)((?P<scm_version>v?\d+(\.\d+){1,2}))\n[-=]+\n',
                with_scm='{text}\n{rev[timestamp]:%d %b %Y}\n',
            ),
        ],
    ),
}

# Be strict about any broken references:
nitpicky = True

intersphinx_mapping = {
    'pypa-build': ('https://pypa-build.readthedocs.io/en/latest/', None)
}

# Add support for linking usernames
github_url = 'https://github.com'
github_sponsors_url = f'{github_url}/sponsors'
extlinks = {
    'user': (f'{github_sponsors_url}/%s', '@'),  # noqa: WPS323
}
extensions += ['sphinx.ext.extlinks', 'sphinx.ext.intersphinx']

# Ref: https://github.com/python-attrs/attrs/pull/571/files\
#      #diff-85987f48f1258d9ee486e3191495582dR82
default_role = 'any'

# HTML theme
html_theme = 'furo'

# Add support for inline tabs
extensions += ['sphinx_inline_tabs']

# Support for distutils

# Ref: https://stackoverflow.com/a/30624034/595220
nitpick_ignore = [
    ('c:func', 'SHGetSpecialFolderPath'),  # ref to MS docs
    ('envvar', 'DISTUTILS_DEBUG'),  # undocumented
    ('envvar', 'HOME'),  # undocumented
    ('envvar', 'PLAT'),  # undocumented
    ('py:attr', 'CCompiler.language_map'),  # undocumented
    ('py:attr', 'CCompiler.language_order'),  # undocumented
    ('py:class', 'distutils.dist.Distribution'),  # undocumented
    ('py:class', 'distutils.extension.Extension'),  # undocumented
    ('py:class', 'BorlandCCompiler'),  # undocumented
    ('py:class', 'CCompiler'),  # undocumented
    ('py:class', 'CygwinCCompiler'),  # undocumented
    ('py:class', 'distutils.dist.DistributionMetadata'),  # undocumented
    ('py:class', 'FileList'),  # undocumented
    ('py:class', 'IShellLink'),  # ref to MS docs
    ('py:class', 'MSVCCompiler'),  # undocumented
    ('py:class', 'OptionDummy'),  # undocumented
    ('py:class', 'UnixCCompiler'),  # undocumented
    ('py:exc', 'CompileError'),  # undocumented
    ('py:exc', 'DistutilsExecError'),  # undocumented
    ('py:exc', 'DistutilsFileError'),  # undocumented
    ('py:exc', 'LibError'),  # undocumented
    ('py:exc', 'LinkError'),  # undocumented
    ('py:exc', 'PreprocessError'),  # undocumented
    ('py:func', 'distutils.CCompiler.new_compiler'),  # undocumented
    # undocumented:
    ('py:func', 'distutils.dist.DistributionMetadata.read_pkg_file'),
    ('py:func', 'distutils.file_util._copy_file_contents'),  # undocumented
    ('py:func', 'distutils.log.debug'),  # undocumented
    ('py:func', 'distutils.spawn.find_executable'),  # undocumented
    ('py:func', 'distutils.spawn.spawn'),  # undocumented
    # TODO: check https://docutils.rtfd.io in the future
    ('py:mod', 'docutils'),  # there's no Sphinx site documenting this
]

# Allow linking objects on other Sphinx sites seamlessly:
intersphinx_mapping.update(
    python=('https://docs.python.org/3', None),
    python2=('https://docs.python.org/2', None),
)

# Add support for the unreleased "next-version" change notes
extensions += ['sphinxcontrib.towncrier']
# Extension needs a path from here to the towncrier config.
towncrier_draft_working_directory = '..'
# Avoid an empty section for unpublished changes.
towncrier_draft_include_empty = False

extensions += ['jaraco.tidelift']
PK�(�\c�g���,doc/alt-python37-setuptools/docs/roadmap.rstnu�[���=======
Roadmap
=======

Setuptools maintains a series of `milestones
<https://github.com/pypa/setuptools/milestones>`_ to track
a roadmap of large-scale goals.
PK�(�\�&5pp,doc/alt-python37-setuptools/docs/history.rstnu�[���:tocdepth: 2

.. _changes:

History
*******

.. towncrier-draft-entries:: DRAFT, unreleased as on |today|

.. include:: ../CHANGES (links).rst

Credits
*******

* The original design for the ``.egg`` format and the ``pkg_resources`` API was
  co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first
  version of ``pkg_resources``, and supplied the macOS operating system version
  compatibility algorithm.

* Ian Bicking implemented many early "creature comfort" features of
  easy_install, including support for downloading via Sourceforge and
  Subversion repositories. Ian's comments on the Web-SIG about WSGI
  application deployment also inspired the concept of "entry points" in eggs,
  and he has given talks at PyCon and elsewhere to inform and educate the
  community about eggs and setuptools.

* Jim Fulton contributed time and effort to build automated tests of various
  aspects of ``easy_install``, and supplied the doctests for the command-line
  ``.exe`` wrappers on Windows.

* Phillip J. Eby is the seminal author of setuptools, and
  first proposed the idea of an importable binary distribution format for
  Python application plug-ins.

* Significant parts of the implementation of setuptools were funded by the Open
  Source Applications Foundation, to provide a plug-in infrastructure for the
  Chandler PIM application. In addition, many OSAF staffers (such as Mike
  "Code Bear" Taylor) contributed their time and stress as guinea pigs for the
  use of eggs and setuptools, even before eggs were "cool".  (Thanks, guys!)

* Tarek Ziadé is the principal author of the Distribute fork, which
  re-invigorated the community on the project, encouraged renewed innovation,
  and addressed many defects.

* Jason R. Coombs performed the merge with Distribute, maintaining the
  project for several years in coordination with the Python Packaging
  Authority (PyPA).
PK�(�\$dگ�6doc/alt-python37-setuptools/docs/development/index.rstnu�[���-------------------------
Development on Setuptools
-------------------------

Setuptools is maintained by the Python community under the Python Packaging
Authority (PyPA) and led by Jason R. Coombs.

This document describes the process by which Setuptools is developed.
This document assumes the reader has some passing familiarity with
*using* setuptools, the ``pkg_resources`` module, and pip.  It
does not attempt to explain basic concepts like inter-project
dependencies, nor does it contain detailed lexical syntax for most
file formats.  Neither does it explain concepts like "namespace
packages" or "resources" in any detail, as all of these subjects are
covered at length in the setuptools developer's guide and the
``pkg_resources`` reference manual.

Instead, this is **internal** documentation for how those concepts and
features are *implemented* in concrete terms.  It is intended for people
who are working on the setuptools code base, who want to be able to
troubleshoot setuptools problems, want to write code that reads the file
formats involved, or want to otherwise tinker with setuptools-generated
files and directories.

Note, however, that these are all internal implementation details and
are therefore subject to change; stick to the published API if you don't
want to be responsible for keeping your code from breaking when
setuptools changes.  You have been warned.

.. toctree::
   :maxdepth: 1

   developer-guide
   releases
PK�(�\�rE��9doc/alt-python37-setuptools/docs/development/releases.rstnu�[���===============
Release Process
===============

In order to allow for rapid, predictable releases, Setuptools uses a
mechanical technique for releases, enacted on tagged commits by
continuous integration.

To finalize a release, run ``tox -e finalize``, review, then push
the changes.

If tests pass, the release will be uploaded to PyPI.

Release Frequency
-----------------

Some have asked why Setuptools is released so frequently. Because Setuptools
uses a mechanical release process, it's very easy to make releases whenever the
code is stable (tests are passing). As a result, the philosophy is to release
early and often.

While some find the frequent releases somewhat surprising, they only empower
the user. Although releases are made frequently, users can choose the frequency
at which they use those releases. If instead Setuptools contributions were only
released in batches, the user would be constrained to only use Setuptools when
those official releases were made. With frequent releases, the user can govern
exactly how often he wishes to update.

Frequent releases also then obviate the need for dev or beta releases in most
cases. Because releases are made early and often, bugs are discovered and
corrected quickly, in many cases before other users have yet to encounter them.

Release Managers
----------------

Additionally, anyone with push access to the master branch has access to cut
releases.
PK�(�\�
���@doc/alt-python37-setuptools/docs/development/developer-guide.rstnu�[���================================
Developer's Guide for Setuptools
================================

If you want to know more about contributing on Setuptools, this is the place.


-------------------
Recommended Reading
-------------------

Please read `How to write the perfect pull request
<https://blog.jaraco.com/how-to-write-perfect-pull-request/>`_ for some tips
on contributing to open source projects. Although the article is not
authoritative, it was authored by the maintainer of Setuptools, so reflects
his opinions and will improve the likelihood of acceptance and quality of
contribution.

------------------
Project Management
------------------

Setuptools is maintained primarily in GitHub at `this home
<https://github.com/pypa/setuptools>`_. Setuptools is maintained under the
Python Packaging Authority (PyPA) with several core contributors. All bugs
for Setuptools are filed and the canonical source is maintained in GitHub.

User support and discussions are done through the issue tracker (for specific)
issues, through the `distutils-sig mailing list <https://mail.python.org/mailman3/lists/distutils-sig.python.org/>`_, or on IRC (Freenode) at
#pypa.

Discussions about development happen on the distutils-sig mailing list or on
`Gitter <https://gitter.im/pypa/setuptools>`_.

-----------------
Authoring Tickets
-----------------

Before authoring any source code, it's often prudent to file a ticket
describing the motivation behind making changes. First search to see if a
ticket already exists for your issue. If not, create one. Try to think from
the perspective of the reader. Explain what behavior you expected, what you
got instead, and what factors might have contributed to the unexpected
behavior. In GitHub, surround a block of code or traceback with the triple
backtick "\`\`\`" so that it is formatted nicely.

Filing a ticket provides a forum for justification, discussion, and
clarification. The ticket provides a record of the purpose for the change and
any hard decisions that were made. It provides a single place for others to
reference when trying to understand why the software operates the way it does
or why certain changes were made.

Setuptools makes extensive use of hyperlinks to tickets in the changelog so
that system integrators and other users can get a quick summary, but then
jump to the in-depth discussion about any subject referenced.

---------------------
Making a pull request
---------------------

When making a pull request, please
:ref:`include a short summary of the changes <Adding change notes
with your PRs>` and a reference to any issue tickets that the PR is
intended to solve.
All PRs with code changes should include tests. All changes should
include a changelog entry.

.. include:: ../../changelog.d/README.rst

-------------------
Auto-Merge Requests
-------------------

To support running all code through CI, even lightweight contributions,
the project employs Mergify to auto-merge pull requests tagged as
auto-merge.

Use ``hub pull-request -l auto-merge`` to create such a pull request
from the command line after pushing a new branch.

-------
Testing
-------

The primary tests are run using tox.  Make sure you have tox installed,
and invoke it::

    $ tox

Under continuous integration, additional tests may be run. See the
``.travis.yml`` file for full details on the tests run under Travis-CI.

-------------------
Semantic Versioning
-------------------

Setuptools follows ``semver``.

.. explain value of reflecting meaning in versions.

----------------------
Building Documentation
----------------------

Setuptools relies on the `Sphinx`_ system for building documentation.
The `published documentation`_ is hosted on Read the Docs.

To build the docs locally, use tox::

    $ tox -e docs

.. _Sphinx: http://www.sphinx-doc.org/en/master/
.. _published documentation: https://setuptools.readthedocs.io/en/latest/

---------------------
Vendored Dependencies
---------------------

Setuptools has some dependencies, but due to `bootstrapping issues
<https://github.com/pypa/setuptools/issues/980>`_, those dependencies
cannot be declared as they won't be resolved soon enough to build
setuptools from source. Eventually, this limitation may be lifted as
PEP 517/518 reach ubiquitous adoption, but for now, Setuptools
cannot declare dependencies other than through
``setuptools/_vendor/vendored.txt`` and
``pkg_resources/_vendor/vendored.txt`` and refreshed by way of
``paver update_vendored`` (pavement.py).
PK�(�\O�mm)doc/alt-python37-distlib/CONTRIBUTORS.txtnu�[���=======================
Distutils2 Contributors
=======================

The Distutils2 project was started by Tarek Ziadé and is currently
maintained by Éric Araujo.  Many people have contributed to the project.

distlib has started off using some of the code from distutil2.

If you're making a patch, please add your name below in alphabetical order,
and welcome into the Fellowship of the Packaging!

Thanks to:

- Rajiv Abraham
- Ali Afshar
- David Barnett
- Pior Bastida
- Anthony Baxter
- Erik Bray
- C. Titus Brown
- Francisco Martín Brugué
- Nicolas Cadou
- Godefroid Chapelle
- Julien Courteau
- Christophe Combelles
- Jason R. Coombs
- Pierre-Yves David
- Ned Deily
- Konrad Delong
- Josip Djolonga
- John Edmonds
- André Espaze
- Boris Feld
- Andrew Francis
- Hallvard B Furuseth
- Patrice Gauthier
- Yannick Gingras
- Filip Gruszczyński
- Walker Hale IV
- Alexandre Hamelin
- Kelsey Hightower
- Thomas Holmes
- Preston Holmes
- Christian Hudon
- Julien Jehannet
- Jeremy Kloth
- Thomas Kluyver
- Amos Latteier
- Mathieu Leduc-Hamel
- Pierre Paul Lefebvre
- Tshepang Lekhonkhobe
- Alain Leufroy
- Janusz Lewandowski
- Martin von Löwis
- Hugo Lopes Tavares
- Guillermo López-Anglada
- Justin Love
- Simon Mathieu
- Carl Meyer
- Alexis Métaireau
- Julien Miotte
- Zubin Mithra
- Derek McTavish Mounce
- Paul Moore
- Michael Mulich
- Louis Munro
- Gaël Pasgrimaud
- George Peristerakis
- Mathieu Perreault
- Guillaume Pratte
- Sean Reifschneider
- Antoine Reversat
- Arc Riley
- C. Anthony Risinger
- Elson Rodriguez
- Luis Rojas
- Erik Rose
- Brian Rosner
- Vinay Sajip
- Victor Stinner
- Alexandre Vassalotti
- Nadeem Vawda
PK�(�\�ԝ�8�8$doc/alt-python37-distlib/LICENSE.txtnu�[���A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com).  In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property.  Zope Corporation is a sponsoring member of
the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.2             2.1.1       2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2.1           2.2         2002        PSF         yes
    2.2.2           2.2.1       2002        PSF         yes
    2.2.3           2.2.2       2003        PSF         yes
    2.3             2.2.2       2002-2003   PSF         yes
    2.3.1           2.3         2002-2003   PSF         yes
    2.3.2           2.3.1       2002-2003   PSF         yes
    2.3.3           2.3.2       2002-2003   PSF         yes
    2.3.4           2.3.3       2004        PSF         yes
    2.3.5           2.3.4       2005        PSF         yes
    2.4             2.3         2004        PSF         yes
    2.4.1           2.4         2005        PSF         yes
    2.4.2           2.4.1       2005        PSF         yes
    2.4.3           2.4.2       2006        PSF         yes
    2.4.4           2.4.3       2006        PSF         yes
    2.5             2.4         2006        PSF         yes
    2.5.1           2.5         2007        PSF         yes
    2.5.2           2.5.1       2008        PSF         yes
    2.5.3           2.5.2       2008        PSF         yes
    2.6             2.5         2008        PSF         yes
    2.6.1           2.6         2008        PSF         yes
    2.6.2           2.6.1       2009        PSF         yes
    2.6.3           2.6.2       2009        PSF         yes
    2.6.4           2.6.3       2009        PSF         yes
    2.6.5           2.6.4       2010        PSF         yes
    3.0             2.6         2008        PSF         yes
    3.0.1           3.0         2009        PSF         yes
    3.1             3.0.1       2009        PSF         yes
    3.1.1           3.1         2009        PSF         yes
    3.1.2           3.1         2010        PSF         yes
    3.2             3.1         2010        PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Python Software Foundation; All Rights Reserved" are retained in Python alone or
in any derivative version prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
PK�(�\-�9�[�[$doc/alt-python37-distlib/CHANGES.rstnu�[���Change log for ``distlib``
--------------------------

0.3.5 (future)
~~~~~~~~~~~~~~

Released: Not yet.

0.3.4
~~~~~

Released: 2021-12-08

- database

    - Fixed #153: Raise warnings in get_distributions() if bad metadata seen, but keep
      going.

- markers

    - Fixed #154: Determine Python versions correctly for Python >= 3.10.

- scripts

    - Updated launcher executables.

Code relating to support for Python 2.6 was also removed.

0.3.3
~~~~~

Released: 2021-09-22

- compat

    - Fixed #152: Removed splituser() function which wasn't used and is deprecated.

- markers

    - Fixed #149: Handle version comparisons correctly in environment markers.

- scripts

    - Add ARM-64 launchers and support code to use them. Thanks to Niyas Sait and
      Adrian Vladu for their contributions.

- util

    - Fixed #148: Handle a single trailing comma following a version. Thanks to Blazej
      Floch for the report and suggested fix.

- version

    - Fixed #150: Fix incorrect handling of epochs.

- wheel

    - Reverted handling of tags for Python >= 3.10 (use 310 rather than 3_10). This is
      because PEP 641 was rejected.

- tests

    - Made changes relating to implementing CI using GitHub Actions.

0.3.2
~~~~~

Released: 2021-05-29

- locators

    - Fixed #141: removed unused regular expression.

- metadata

    - Fixed #140: allowed "Obsoletes" in more scenarios, to better handle faulty
      metadata already on PyPI.

- resources

    - Fixed #146: added entry for SourcelessFileLoader to the finder registry.

- scripts

    - Made the generation of scripts more configurable:

        - the ``variant_separator`` attribute can be set to determine the separator used
          between a script basename and its X.Y variant. The default value is ``'-'``
          and would result in a final script basename like ``'foo-X.Y'``, whereas
          setting it to ``''`` would result in a final script basename like
          ``'fooX.Y'``.

        - You can also subclass and override the ``get_script_filenames()`` method to
          provide a more customised set of file basenames.

- util

    - Fixed #140: allowed a trailing comma in constraints, to better handle faulty
      metadata already on PyPI.

    - Moved get_platform() logic from distutils to here.

    - Fixed #143: removed normcase() to avoid some problems on Windows.

- wheel

    - Dropped any trailing data when computing the Python tag.

    - Added support for manylinux tags.

    - Changed handling of tags for Python >= 3.10 (use 3_10 rather than 310).

    - Fixed #147: permission bits are now preserved on POSIX when installing from a
      wheel.

- tests

   - Fixed #139: improved handling of errors related to the test PyPI server.

0.3.1
~~~~~

Released: 2020-06-27

The repository has been migrated to Git. References to earlier changesets (commits) in
issue comments, etc. will be invalid.

- scripts

    - Fixed #132: Added documentation to help with relative interpreter paths. Thanks
      to Paul Kienzle for the patch.

    - Fixed #134: Allowed specifying a different target Python version when generating
      scripts.

    - Fixed #135: Exposed the ``enquote_executable`` function previously implemented
      as an internal function.

    - Addressed #138: Improved metadata support for newer metadata versions. Thanks to
      James Tocknell for the patch.

- wheel

    - Changed the output of flags in entry point definitions. Thanks to frostming (明希)
      for the patch.

    - Stopped writing JSON metadata. Only old-style metadata is written now.

0.3.0
~~~~~

Released: 2019-10-29

- database

    - Issue #102 (partial): modules attribute of InstalledDistribution was
      incorrectly computed as a list of bytes, rather than a list of str. This
      has now been corrected.

- locators

    - Updated Locator._get_digest to check PyPI JSON responses for a "digests"
      dictionary before trying "algo_digest" keys. Thanks to Jeffery To for the
      patch.

- scripts

    - Fixed #123: Improved error message if a resource isn't found.

    - Fixed #124: Stopped norm-casing the executable written into shebangs, as
      it doesn't work for some non-ASCII paths.

    - Fixed #125: Updated launchers with versions that correctly report errors
      containing non-ASCII characters. The updated launchers now also support
      relative paths (see http://bit.ly/2JxmOoi for more information).

    - Changed Python version handling to accommodate versions like e.g. 3.10
      (no longer assume a version X.Y where X and Y are single digits).

- util

    - Fixed #127: Allowed hyphens in flags in export specifications.

- wheel

    - Changed Python version handling to accommodate versions like e.g. 3.10
      (no longer assume a version X.Y where X and Y are single digits).


0.2.9
~~~~~

Released: 2019-05-14

- index

    - Updated default PyPI URL to https://pypi.org/pypi.

- locators

    - Updated default PyPI URL to https://pypi.org/pypi.

- metadata

    - Relaxed metadata format checks to ignore 'Provides'.

- scripts

    - Fixed #33, #34: Simplified script template.

    - Updated Windows launchers.

- util

    - Fixed #116: Corrected parsing of credentials from URLs.

- wheel

    - Fixed #115: Relaxed check for '..' in wheel archive entries by not
      checking filename parts, only directory segments.

    - Skip entries in archive entries ending with '/' (directories) when
      verifying or installing.

- docs

    - Updated default PyPI URL to https://pypi.org/pypi.

    - Commented out Disqus comment section.

    - Changed theme configuration.

    - Updated some out-of-date argument lists.

- tests

    - Updated default PyPI URL to https://pypi.org/pypi.

    - Preserved umask on POSIX across a test.


0.2.8
~~~~~

Released: 2018-10-01

- database

    - Fixed #108: Updated metadata scan to look for the METADATA file as well
      as the JSON formats.

- locators

    - Fixed #112: Handled wheel tags and platform-dependent downloads correctly
      in SimpleScrapingLocator.

- metadata

    - Fixed #107: Updated documentation on testing to include information on
      setting PYTHONHASHSEED.

- scripts

    - Fixed #111: Avoided unnecessary newlines in script preambles, which caused
      problems with detecting encoding declarations. Thanks to Wim Glenn for the
      report and patch.

- util

    - Fixed #109: Removed existing files (which might have been symlinks) before
      overwriting.


0.2.7
~~~~~

Released: 2018-04-16

- compat

    - Fixed #105: cache_from_source is now imported from importlib.util where
      available.

- database

    - Addressed #102: InstalledDistributions now have a modules attribute which
      is a list of top-level modules as read from top_level.txt, if that is in
      the distribution info.

- locators

    - Fixed #103: Thanks to Saulius Žemaitaitis for the patch.

- metadata

    - Added support for PEP 566 / Metadata 1.3.

- scripts

    - Fixed #104: Updated launcher binaries. Thanks to Atsushi Odagiri for
      the diagnosis and fix.


0.2.6
~~~~~

Released: 2017-10-28

- compat

    - Fixed #99: Updated to handle a case where sys.getfilesystemencoding()
      returns None.

- database

    - Fixed #97: Eliminated a crash in EggInfoDistribution.list_distinfo_files()
      which was caused by trying to open a non-existent file.

    - Handled a case where an installed distribution didn't have 'Provides:'
      metadata.

- locators

    - Fixed #96: SimpleScrapingLocator no longer fails prematurely when scraping
      links due to invalid versions.

- markers

    - Improved error messages issued when interpreting markers

- scripts

    - Improved the shebangs written into installed scripts when the interpreter
      path is very long or contains spaces (to cater for a limitation in shebang
      line parsing on Linux)

    - Updated launcher binaries.

- tests

    - Numerous test refinements, not detailed further here.


0.2.5
~~~~~

Released: 2017-05-06

- general

    - Changed regular expressions to be compatible with 3.6 as regards escape
      sequences. Thanks to Ville Skyttä for the patch.

    - closed some resource leaks related to XML-RPC proxies.

    - Removed Python 2.6 from the support list.

- locators

    - Made downloadability a factor in scoring URLs for preferences.

- markers

    - Replaced the implementation with code which parses requirements in
      accordance with PEP 508 and evaluates marker expressions according to
      PEP 508.

- util

    - Changed _csv_open to use utf-8 across all platforms on Python 3.x. Thanks
      to Alastair McCormack for the patch.

- wheel

    - Changed to look for metadata in metadata.json as well as pydist.json.

- version

    - Updated requirement parsing in version matchers to use the new
      PEP 508-compliant code.

- tests

    - Numerous test refinements, not detailed further here.


0.2.4
~~~~~

Released: 2016-09-30

- compat

    - Updated to not fail on import if SSL is unavailable.

- index

    - Switch from using gpg in preference to gpg2 for signing. This is
      to avoid gpg2's behaviour of prompting for passwords, which interferes
      with the tests on some machines.

- locators

    - Changed project name comparisons to follow PEP 503. Thanks to Steven
      Arcangeli for the patch.

    - Added errors queue to Locator.

- manifest

    - Changed match logic to work under Python 3.6, due to differences in
      how fnmatch.translate behaves.

- resources

    - Updated finder registry logic to reflect changes in Python 3.6.

- scripts

    - Fixed regular expression in generated script boilerplate.

- util

    - Updated to not fail on import if SSL is unavailable.

    - Added normalize_name for project name comparisons using PEP 503.

- tests

    - Updated to skip certain tests if SSL is unavailable.

    - Numerous other test refinements, not detailed further here.


0.2.3
~~~~~

Released: 2016-04-30

- util

    - Changed get_executable to return Unicode rather than bytes.

    - Fixed #84: Allow + character in output script names.

    - Relaxed too-stringent test looking for application/json in headers.

- wheel

    - sorted the entries in RECORD before writing to file.

- tests

    - Numerous test refinements, not detailed further here.


0.2.2
~~~~~

Released: 2016-01-30

- database

    - Issue #81: Added support for detecting distributions installed by wheel
      versions >= 0.23 (which use metadata.json rather than pydist.json).
      Thanks to Te-jé Rodgers for the patch.

- locators

    - Updated default PyPI URL to https://pypi.python.org/pypi

- metadata

    - Updated to use different formatting for description field for V1.1
      metadata.

    - Corrected "classifier" to "classifiers" in the mapping for V1.0
      metadata.

- scripts

    - Improved support for Jython when quoting executables in output scripts.

- util

    - Issue #77: Made the internal URL used for extended metadata fetches
      configurable via a module attribute.

    - Issue #78: Improved entry point parsing to handle leading spaces in
      ini-format files.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - renamed environment variable SKIP_SLOW to SKIP_ONLINE in tests and
      applied to some more tests.

    - Numerous other test refinements, not detailed further here.


0.2.1
~~~~~

Released: 2015-07-07

- locators

    - Issue #58: Return a Distribution instance or None from ``locate()``.

    - Issue #59: Skipped special keys when looking for versions.

    - Improved behaviour of PyPIJSONLocator to be analogous to that of other
      locators.

- resource

    - Added resource iterator functionality.

- scripts

    - Issue #71: Updated launchers to decode shebangs using UTF-8. This allows
      non-ASCII pathnames to be correctly handled.

    - Ensured that the executable written to shebangs is normcased.

    - Changed ScriptMaker to work better under Jython.

- util

    - Changed the mode setting method to work better under Jython.

    - Changed get_executable() to return a normcased value.

- wheel

    - Handled multiple-architecture wheel filenames correctly.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.2.0
~~~~~

Released: 2014-12-17

- compat

    - Updated ``match_hostname`` to use the latest Python implementation.

- database

    - Added `download_urls` and `digests` attributes to ``Distribution``.

- locators

    - Issue #48: Fixed the problem of adding a tuple containing a set
      (unhashable) to a set, by wrapping with frozenset().

    - Issue #55: Return multiple download URLs for distributions, if
      available.

- manifest

    - Issue #57: Remove unhelpful warnings about pattern matches.

- metadata

    - Updated to reflect changes to PEP 426.

- resources

    - Issue #50: The type of the path needs to be preserved on 2.x.

- scripts

    - Updated (including launchers) to support providing arguments to
      interpreters in shebang lines.

    - The launcher sources are now included in the repository and the
      source distribution (they are to be found in the PC directory).

    - Added frames support in IronPython (patch by Pawel Jasinski).

    - Issue #51: encode shebang executable using utf-8 rather than fsencode.

- util

    - Removed reference to __PYVENV_LAUNCHER__ when determining executable
      for scripts (relevant only on OS X).

    - Updated to support changes to PEP 426.

- version

    - Updated to reflect changes to versioning proposed in PEP 440.

- wheel

    - Updated build() code to respect interpreter arguments in prebuilt
      scripts.

    - Updated to support changes to PEP 426 / PEP 440.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.1.9
~~~~~

Released: 2014-05-19

- index

    - Added ``keystore`` keyword argument to signing and verification
      APIs.

- scripts

    - Issue #47: Updated binary launchers to fix double-quoting bug where
      script executable paths have spaces.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.1.8
~~~~~

Released: 2014-03-18

- index

    - Improved thread-safety in SimpleScrapingLocator (issue #45).

    - Replaced absolute imports with relative ones.

    - Added ``search`` method to ``PackageIndex``.

- locators

    - Improved thread-safety in ``SimpleScrapingLocator`` (issue #45).

- metadata

    - Fixed bug in add_requirements implementation.

- resources

    - The ``Cache`` class was refactored into ``distlib.util.Cache``
      and ``distlib.resources.ResourceCache`` classes.

- scripts

    - Implement quoting for executables with spaces in them.

- util

    - Gained the ``Cache`` class, which is also used in ``distlib.wheel``.

- version

    - Allowed versions with a single numeric component and a local
      version component.

    - Adjusted pre-release computation for legacy versions to be the same as
      the logic in the setuptools documentation.

- wheel

    - Added ``verify``, ``update``, ``is_compatible`` and ``is_mountable``
      methods to the ``Wheel`` class.

    - Converted local version separators from '-' to '_' and back.

    - If SOABI not available, used Py_DEBUG, Py_UNICODE_SIZE and
      WITH_PYMALLOC to derive the ABI.

    - Added "exists" property to Wheel instances.

    - Factored out RECORD writing and zip building to separate methods.

    - Provided the ability to determine the location where extensions are
      extracted, by using the ``distlib.util.Cache`` class.

    - Avoided using ``pydist.json`` in 1.0 wheels (``bdist_wheel`` writes a
      non-conforming ``pydist.json``.)

    - Improved computation of compatible tags on OS X, and made COMPATIBLE_TAGS
      a set.

- _backport/sysconfig

    - Replaced an absolute import with a relative one.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.1.7
~~~~~

Released: 2014-01-16

- metadata

    - Added some more fields to the metadata for the index.

- resources

    - Use native literal string in cache path.

    - Issue #40: Now does path adjustments differently for files and zips.

- scripts

    - Improved checking for venvs when generating scripts.

- util

    - Issue #39: Fall back to temporary directory for cache if home directory
      unavailable.

- wheel

    - Use native literal string in cache path.

0.1.6
~~~~~

Released: 2013-12-31

- scripts

    - Updated binary launchers because the wrong variant was shipped
      with the previous release.

- version

    - Added support for local component in PEP 440 versions.

- tests

    - Numerous test refinements, not detailed further here.


0.1.5
~~~~~

Released: 2013-12-15

- compat

    - Changed source of import for unescape in Python >= 3.4.

- index

    - Used dummy_threading when threading isn't available.

    - Used https for default index.

- locators

    - Used dummy_threading when threading isn't available.

- scripts

    - Defaulted to setting script mode bits on POSIX.

    - Use uncompressed executable launchers, since some anti-virus
      products raise false positive errors.

- util

    - Used dummy_threading when threading isn't available.

- docs

    - Updated out-of-date links in overview.

- tests

    - Used dummy_threading when threading isn't available.


0.1.4
~~~~~

Released: 2013-10-31

- scripts

    - Updated the logic for finding the distlib package using a relative,
      rather than absolute method. This fixes a problem for pip, where
      distlib is kept in the pip.vendor.distlib package.

- _backport/sysconfig

    - The analogous change to that made for scripts, described above.

0.1.3
~~~~~

Released: 2013-10-18

- database

    - Added support for PEP 426 JSON metadata (pydist.json).

    - Generalised digests to support e.g. SHA256.

    - Fixed a bug in parsing legacy metadata from .egg directories.

    - Removed duplicated code relating to parsing "provides" fields.

- index

    - Changes relating to support for PEP 426 JSON metadata (pydist.json).

- locators

    - Changes relating to support for PEP 426 JSON metadata (pydist.json).

    - Fixed a bug in scoring download URLs for preference when multiple URLs
      are available.

    - The legacy scheme is used for the default locator.

    - Made changes relating to parsing "provides" fields.

    - Generalised digests to support e.g. SHA256.

    - If no release version is found for a requirement, prereleases are
      now considered even if not explicitly requested.

- markers

    - Added support for markers as specified in PEP 426.

- metadata

    - Added support for PEP 426 JSON metadata (pydist.json). The old
      metadata class is renamed to LegacyMetadata, and the (new)
      Metadata class wraps the JSON format (and also the legacy format,
      through LegacyMetadata).

    - Removed code which was only used if docutils was installed. This code
      implemented validation of .rst descriptions, which is not done in
      distlib.

- scripts

    - Updated the logic for writing executable files to deal as best we can
      with files which are already in use and hence cannot be deleted on
      Windows.

    - Changed the script generation when launchers are used to write a
      single executable which wraps a script (whether pre-built or generated)
      and includes a manifest to avoid UAC prompts on Windows.

    - Changed the interface for script generation options: the ``make`` and
      ``make_multiple`` methods of ``ScriptMaker`` now take an optional
      ``options`` dictionary.

- util

    - Added extract_by_key() to copy selected keys from one dict to another.

    - Added parse_name_and_version() for use in parsing "provides" fields.

    - Made split_filename more flexible.

- version

    - Added support for PEP 440 version matching.

    - Removed AdaptiveVersion, AdaptiveMatcher etc. as they don't add
      sufficient value to justify keeping them in.

- wheel

    - Added wheel_version kwarg to Wheel.build API.

    - Changed Wheel.install API (after consultation on distutils-sig).

    - Added support for PEP 426 JSON metadata (pydist.json).

    - Added lib_only flag to install() method.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.1.2
~~~~~

Released: 2013-04-30

- compat

    - Added BaseConfigurator backport for 2.6.

- database

    - Return RECORD path from write_installed_files (or None if dry_run).

    - Explicitly return None from write_shared_locations if dry run.

- metadata

    - Added missing condition in :meth:`todict`.

- scripts

    - Add variants and clobber flag for generation of foo/fooX/foo-X.Y.

    - Added .exe manifests for Windows.

- util

    - Regularised recording of written files.

    - Added Configurator.

- version

    - Tidyups, most suggested by Donald Stufft: Made key functions private,
      removed _Common class, removed checking for huge version numbers, made
      UnsupportedVersionError a ValueError.

- wheel

    - Replaced absolute import with relative.

    - Handle None return from write_shared_locations correctly.

    - Fixed bug in Mounter for extension modules not in sub-packages.

    - Made dylib-cache Python version-specific.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.

- other

    - Corrected setup.py to ensure that sysconfig.cfg is included.


0.1.1
~~~~~

Released: 2013-03-22

- database

    - Updated requirements logic to use extras and environment markers.

    - Made it easier to subclass Distribution and EggInfoDistribution.

- locators

    - Added method to clear locator caches.

    - Added the ability to skip pre-releases.

- manifest

    - Fixed bug which caused side-effect when sorting a manifest.

- metadata

    - Updated to handle most 2.0 fields, though PEP 426 is still a draft.

    - Added the option to skip unset fields when writing.

- resources

    - Made separate subclasses ResourceBase, Resource and ResourceContainer
      from Resource. Thanks to Thomas Kluyver for the suggestion and patch.

- scripts

    - Fixed bug which prevented writing shebang lines correctly on Windows.

- util

    - Made get_cache_base more useful by parameterising the suffix to use.

    - Fixed a bug when reading CSV streams from .zip files under 3.x.

- version

    - Added is_prerelease property to versions.

    - Moved to PEP 426 version formats and sorting.

- wheel

    - Fixed CSV stream reading under 3.x and handled UTF-8 in zip entries
      correctly.

    - Added metadata and info properties, and updated the install method to
      return the installed distribution.

    - Added mount/unmount functionality.

    - Removed compatible_tags() function in favour of COMPATIBLE_TAGS
      attribute.

- docs

    - Numerous documentation updates, not detailed further here.

- tests

    - Numerous test refinements, not detailed further here.


0.1.0
~~~~~

Released: 2013-03-02

- Initial release.
PK�(�\o���#doc/alt-python37-distlib/README.rstnu�[���.. image:: https://img.shields.io/appveyor/build/vsajip/distlib
   :alt: AppVeyor

.. image:: https://coveralls.io/repos/github/vsajip/distlib/badge.svg?branch=master
   :target: https://coveralls.io/github/vsajip/distlib?branch=master

What is it?
-----------

Distlib is a library which implements low-level functions that relate to
packaging and distribution of Python software. It is intended to be used as the
basis for third-party packaging tools. The documentation is available at

https://distlib.readthedocs.io/

Main features
-------------

Distlib currently offers the following features:

* The package ``distlib.database``, which implements a database of installed
  distributions, as defined by :pep:`376`, and distribution dependency graph
  logic. Support is also provided for non-installed distributions (i.e.
  distributions registered with metadata on an index like PyPI), including
  the ability to scan for dependencies and building dependency graphs.
* The package ``distlib.index``, which implements an interface to perform
  operations on an index, such as registering a project, uploading a
  distribution or uploading documentation. Support is included for verifying
  SSL connections (with domain matching) and signing/verifying packages using
  GnuPG.
* The package ``distlib.metadata``, which implements distribution metadata as
  defined by :pep:`426`, :pep:`345`, :pep:`314` and :pep:`241`.
* The package ``distlib.markers``, which implements environment markers as
  defined by :pep:`426`.
* The package ``distlib.manifest``, which implements lists of files used
  in packaging source distributions.
* The package ``distlib.locators``, which allows finding distributions, whether
  on PyPI (XML-RPC or via the "simple" interface), local directories or some
  other source.
* The package ``distlib.resources``, which allows access to data files stored
  in Python packages, both in the file system and in .zip files.
* The package ``distlib.scripts``, which allows installing of scripts with
  adjustment of shebang lines and support for native Windows executable
  launchers.
* The package ``distlib.version``, which implements version specifiers as
  defined by :pep:`440` / :pep:`426`, but also support for working with
  "legacy" versions (``setuptools``/``distribute``) and semantic versions.
* The package ``distlib.wheel``, which provides support for building and
  installing from the Wheel format for binary distributions (see :pep:`427`).
* The package ``distlib.util``, which contains miscellaneous functions and
  classes which are useful in packaging, but which do not fit neatly into
  one of the other packages in ``distlib``.* The package implements enhanced
  globbing functionality such as the ability to use ``**`` in patterns to
  specify recursing into subdirectories.


Python version and platform compatibility
-----------------------------------------

Distlib is intended to be used on any Python version >= 2.7 and is tested on
Python versions 2.7 and 3.3-3.6 on Linux, Windows, and Mac OS X (not
all versions are tested on all platforms, but are expected to work correctly).

Project status
--------------

The project has reached a mature status in its development: there is a test
suite and it has been exercised on Windows, Ubuntu and Mac OS X. The project is
used by well-known projects such as `pip <https://pypi.org/pypi/pip>`_ and
`caniusepython3 <https://pypi.org/pypi/caniusepython3>`_.

Code of Conduct
---------------

Everyone interacting in the distlib project's codebases, issue trackers, chat
rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.

.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
PK�(�\�O�j>	>	+doc/alt-python37-lxml/ZopePublicLicense.txtnu�[���Zope Public License (ZPL) Version 2.0
-----------------------------------------------

This software is Copyright (c) Zope Corporation (tm) and
Contributors. All rights reserved.

This license has been certified as open source. It has also
been designated as GPL compatible by the Free Software
Foundation (FSF).

Redistribution and use in source and binary forms, with or
without modification, are permitted provided that the
following conditions are met:

1. Redistributions in source code must retain the above
   copyright notice, this list of conditions, and the following
   disclaimer.

2. Redistributions in binary form must reproduce the above
   copyright notice, this list of conditions, and the following
   disclaimer in the documentation and/or other materials
   provided with the distribution.

3. The name Zope Corporation (tm) must not be used to
   endorse or promote products derived from this software
   without prior written permission from Zope Corporation.

4. The right to distribute this software or to use it for
   any purpose does not give you the right to use Servicemarks
   (sm) or Trademarks (tm) of Zope Corporation. Use of them is
   covered in a separate agreement (see
   http://www.zope.com/Marks).

5. If any files are modified, you must cause the modified
   files to carry prominent notices stating that you changed
   the files and the date of any change.

Disclaimer

  THIS SOFTWARE IS PROVIDED BY ZOPE CORPORATION ``AS IS''
  AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
  NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
  NO EVENT SHALL ZOPE CORPORATION OR ITS CONTRIBUTORS BE
  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  DAMAGE.


This software consists of contributions made by Zope
Corporation and many individuals on behalf of Zope
Corporation.  Specific attributions are listed in the
accompanying credits file.
PK�(�\���U��"doc/alt-python37-lxml/LICENSES.txtnu�[���lxml is copyright Infrae and distributed under the BSD license (see
doc/licenses/BSD.txt), with the following exceptions:

Some code, such a selftest.py, selftest2.py and
src/lxml/_elementpath.py are derived from ElementTree and
cElementTree. See doc/licenses/elementtree.txt for the license text.

lxml.cssselect and lxml.html are copyright Ian Bicking and distributed
under the BSD license (see doc/licenses/BSD.txt).

test.py, the test-runner script, is GPL and copyright Shuttleworth
Foundation. See doc/licenses/GPL.txt. It is believed the unchanged
inclusion of test.py to run the unit test suite falls under the
"aggregation" clause of the GPL and thus does not affect the license
of the rest of the package.

The isoschematron implementation uses several XSL and RelaxNG resources:
 * The (XML syntax) RelaxNG schema for schematron, copyright International
   Organization for Standardization (see 
   src/lxml/isoschematron/resources/rng/iso-schematron.rng for the license
   text)
 * The skeleton iso-schematron-xlt1 pure-xslt schematron implementation
   xsl stylesheets, copyright Rick Jelliffe and Academia Sinica Computing
   Center, Taiwan (see the xsl files here for the license text: 
   src/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/)
 * The xsd/rng schema schematron extraction xsl transformations are unlicensed
   and copyright the respective authors as noted (see 
   src/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl and
   src/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl)
PK�(�\t�
\
\
 doc/alt-python37-lxml/README.rstnu�[���What is lxml?
=============

lxml is the most feature-rich and easy-to-use library for processing XML and HTML in the Python language.
It's also very fast and memory friendly, just so you know.

For an introduction and further documentation, see `doc/main.txt`_.

For installation information, see `INSTALL.txt`_.

For issue tracker, see https://bugs.launchpad.net/lxml

Support the project
-------------------

lxml has been downloaded from the `Python Package Index`_
millions of times and is also available directly in many package
distributions, e.g. for Linux or MacOS-X.

.. _`Python Package Index`: https://pypi.python.org/pypi/lxml

Most people who use lxml do so because they like using it.
You can show us that you like it by blogging about your experience
with it and linking to the project website.

If you are using lxml for your work and feel like giving a bit of
your own benefit back to support the project, consider sending us
money through GitHub Sponsors, Tidelift or PayPal that we can use
to buy us free time for the maintenance of this great library, to
fix bugs in the software, review and integrate code contributions,
and improving its features and documentation.  Please read the
Legal Notice below, at the bottom of this page.
Thank you for your support.

.. class:: center

  Support lxml through `GitHub Sponsors <https://github.com/users/scoder/sponsorship>`_

  (Note: GitHub will currently double your donation!)

  via `Tidelift <https://tidelift.com/subscription/pkg/pypi-lxml>`_

  or via PayPal:

  |Donate|_

.. _`Donate`: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=R56JE3VCPDA9N

Please `contact Stefan Behnel <http://consulting.behnel.de/>`_
for other ways to support the lxml project,
as well as commercial consulting, customisations and trainings on lxml and
fast Python XML processing.

.. |Donate| image:: https://lxml.de/paypal_btn_donateCC_LG.png
            :width: 160
            :height: 47
            :alt: Donate to the lxml project

.. _`doc/main.txt`: https://github.com/lxml/lxml/blob/master/doc/main.txt
.. _`INSTALL.txt`: http://lxml.de/installation.html

`Travis-CI <https://travis-ci.org/>`_ and `AppVeyor <https://www.appveyor.com/>`_
support the lxml project with their build and CI servers.
Jetbrains supports the lxml project by donating free licenses of their
`PyCharm IDE <https://www.jetbrains.com/pycharm/>`_.
Another supporter of the lxml project is
`COLOGNE Webdesign <https://www.colognewebdesign.de/>`_.


Legal Notice for Donations
--------------------------

Any donation that you make to the lxml project is voluntary and
is not a fee for any services, goods, or advantages.  By making
a donation to the lxml project, you acknowledge that we have the
right to use the money you donate in any lawful way and for any
lawful purpose we see fit and we are not obligated to disclose
the way and purpose to any party unless required by applicable
law.  Although lxml is free software, to the best of our knowledge
the lxml project does not have any tax exempt status.  The lxml
project is neither a registered non-profit corporation nor a
registered charity in any country.  Your donation may or may not
be tax-deductible; please consult your tax advisor in this matter.
We will not publish or disclose your name and/or e-mail address
without your consent, unless required by applicable law.  Your
donation is non-refundable.
PK�(�\���� doc/alt-python37-lxml/readme.txtnu�[���ISO SCHEMATRON 2010

XSLT implementation by Rick Jelliffe with assistance from members of Schematron-love-in maillist.

2010-04-21

Two distributions are available. One is for XSLT1 engines. 
The other is for XSLT2 engines, such as SAXON 9.


This version of Schematron splits the process into a pipeline of several different XSLT stages.

1) First, preprocess your Schematron schema with iso_dsdl_include.xsl.  
This is a macro processor to assemble the schema from various parts. 
If your schema is not in separate parts, you can skip this stage.
This stage also generates error messages for some common XPath syntax problems.

2) Second, preprocess the output from stage 1 with iso_abstract_expand.xsl.  
This is a macro processor to convert abstract patterns to real patterns. 
If your schema does not use abstract patterns, you can skip this
stage.

3) Third, compile the Schematron schema into an XSLT script. 
This will typically use iso_svrl_for_xslt1.xsl or iso_svrl_for_xslt2.xsl 
(which in turn invoke iso_schematron_skeleton_for_xslt1.xsl or iso_schematron_skeleton_for_saxon.xsl)
However, other "meta-stylesheets" are also in common use; the principle of operation is the same.
If your schema uses Schematron phases, supply these as command line/invocation parameters
to this process.

4) Fourth, run the script generated by stage 3 against the document being validated.
If you are using the SVRL script, then the output of validation will be an XML document.
If your schema uses Schematron parameters, supply these as command line/invocation parameters
to this process. 


The XSLT2 distribution also features several next generation features, 
such as validating multiple documents. See the source code for details.

Schematron assertions can be written in any language, of course; the file
sch-messages-en.xhtml contains the diagnostics messages from the XSLT2 skeleton
in English, and this can be used as template to localize the skeleton's
error messages. Note that typically programming errors in Schematron are XPath
errors, which requires localized messages from the XSLT engine.

ANT
---
To give an example of how to process a document, here is a sample ANT task.

<target  name="schematron-compile-test" >

	   <!-- expand inclusions -->
	   <xslt basedir="test/schematron"
	   		style="iso_dsdl_include.xsl" in="test.sch"  out="test1.sch"> 
	   				<classpath>
	   					<pathelement location="${lib.dir}/saxon9.jar"/>
	   				</classpath>
	   </xslt>

	   <!-- expand abstract patterns -->
	   <xslt basedir="test/schematron"
	   		style="iso_abstract_expand.xsl" in="test1.sch"  out="test2.sch"> 
	   				<classpath>
	   					<pathelement location="${lib.dir}/saxon9.jar"/>
	   				</classpath>
	   </xslt>



	   <!-- compile it -->
	   <xslt basedir="test/schematron"
	   		style="iso_svrl_for_xslt2.xsl" in="test2.sch"  out="test.xsl"> 
	   				<classpath>
	   					<pathelement location="${lib.dir}/saxon9.jar"/>
	   				</classpath>
	   </xslt>
	   
	   <!-- validate -->
	   <xslt basedir="test/schematron"
		   		style="test.xsl" in="instance.xml"  out="instance.svrlt"> 
		   				<classpath>
		   					<pathelement location="${lib.dir}/saxon9.jar"/>
		   				</classpath>
	</xslt>
		</target>
PK�(�\SI���"doc/alt-python37-attrs/AUTHORS.rstnu�[���Credits
=======

``attrs`` is written and maintained by `Hynek Schlawack <https://hynek.me/>`_.

The development is kindly supported by `Variomedia AG <https://www.variomedia.de/>`_.

A full list of contributors can be found in `GitHub's overview <https://github.com/python-attrs/attrs/graphs/contributors>`_.

It’s the spiritual successor of `characteristic <https://characteristic.readthedocs.io/>`_ and aspires to fix some of it clunkiness and unfortunate decisions.
Both were inspired by Twisted’s `FancyEqMixin <https://twistedmatrix.com/documents/current/api/twisted.python.util.FancyEqMixin.html>`_ but both are implemented using class decorators because `subclassing is bad for you <https://www.youtube.com/watch?v=3MNVP9-hglc>`_, m’kay?
PK�(�\���::doc/alt-python37-attrs/LICENSEnu�[���The MIT License (MIT)

Copyright (c) 2015 Hynek Schlawack

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
PK�(�\^�|���!doc/alt-python37-attrs/README.rstnu�[���.. raw:: html

   <p align="center">
      <a href="https://www.attrs.org/">
         <img src="./docs/_static/attrs_logo.svg" width="35%" alt="attrs" />
      </a>
   </p>
   <p align="center">
      <a href="https://www.attrs.org/en/stable/?badge=stable">
          <img src="https://readthedocs.org/projects/attrs/badge/?version=stable" alt="Documentation Status" />
      </a>
      <a href="https://github.com/python-attrs/attrs/actions?workflow=CI">
          <img src="https://github.com/python-attrs/attrs/workflows/CI/badge.svg?branch=main" alt="CI Status" />
      </a>
      <a href="https://codecov.io/github/python-attrs/attrs">
          <img src="https://codecov.io/github/python-attrs/attrs/branch/main/graph/badge.svg" alt="Test Coverage" />
      </a>
      <a href="https://github.com/psf/black">
          <img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code style: black" />
      </a>
   </p>

.. teaser-begin

``attrs`` is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka `dunder <https://nedbatchelder.com/blog/200605/dunder.html>`_ methods).
`Trusted by NASA <https://docs.github.com/en/github/setting-up-and-managing-your-github-profile/personalizing-your-profile#list-of-qualifying-repositories-for-mars-2020-helicopter-contributor-badge>`_ for Mars missions since 2020!

Its main goal is to help you to write **concise** and **correct** software without slowing down your code.

.. teaser-end

For that, it gives you a class decorator and a way to declaratively define the attributes on that class:

.. -code-begin-

.. code-block:: pycon

   >>> import attr

   >>> @attr.s
   ... class SomeClass(object):
   ...     a_number = attr.ib(default=42)
   ...     list_of_numbers = attr.ib(factory=list)
   ...
   ...     def hard_math(self, another_number):
   ...         return self.a_number + sum(self.list_of_numbers) * another_number


   >>> sc = SomeClass(1, [1, 2, 3])
   >>> sc
   SomeClass(a_number=1, list_of_numbers=[1, 2, 3])

   >>> sc.hard_math(3)
   19
   >>> sc == SomeClass(1, [1, 2, 3])
   True
   >>> sc != SomeClass(2, [3, 2, 1])
   True

   >>> attr.asdict(sc)
   {'a_number': 1, 'list_of_numbers': [1, 2, 3]}

   >>> SomeClass()
   SomeClass(a_number=42, list_of_numbers=[])

   >>> C = attr.make_class("C", ["a", "b"])
   >>> C("foo", "bar")
   C(a='foo', b='bar')


After *declaring* your attributes ``attrs`` gives you:

- a concise and explicit overview of the class's attributes,
- a nice human-readable ``__repr__``,
- a complete set of comparison methods (equality and ordering),
- an initializer,
- and much more,

*without* writing dull boilerplate code again and again and *without* runtime performance penalties.

On Python 3.6 and later, you can often even drop the calls to ``attr.ib()`` by using `type annotations <https://www.attrs.org/en/latest/types.html>`_.

This gives you the power to use actual classes with actual types in your code instead of confusing ``tuple``\ s or `confusingly behaving <https://www.attrs.org/en/stable/why.html#namedtuples>`_ ``namedtuple``\ s.
Which in turn encourages you to write *small classes* that do `one thing well <https://www.destroyallsoftware.com/talks/boundaries>`_.
Never again violate the `single responsibility principle <https://en.wikipedia.org/wiki/Single_responsibility_principle>`_ just because implementing ``__init__`` et al is a painful drag.


.. -getting-help-

Getting Help
============

Please use the ``python-attrs`` tag on `StackOverflow <https://stackoverflow.com/questions/tagged/python-attrs>`_ to get help.

Answering questions of your fellow developers is also a great way to help the project!


.. -project-information-

Project Information
===================

``attrs`` is released under the `MIT <https://choosealicense.com/licenses/mit/>`_ license,
its documentation lives at `Read the Docs <https://www.attrs.org/>`_,
the code on `GitHub <https://github.com/python-attrs/attrs>`_,
and the latest release on `PyPI <https://pypi.org/project/attrs/>`_.
It’s rigorously tested on Python 2.7, 3.5+, and PyPy.

We collect information on **third-party extensions** in our `wiki <https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs>`_.
Feel free to browse and add your own!

If you'd like to contribute to ``attrs`` you're most welcome and we've written `a little guide <https://www.attrs.org/en/latest/contributing.html>`_ to get you started!


``attrs`` for Enterprise
------------------------

Available as part of the Tidelift Subscription.

The maintainers of ``attrs`` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications.
Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
`Learn more. <https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=referral&utm_campaign=enterprise&utm_term=repo>`_
PK�(�\2���II#doc/alt-python37-docopt/LICENSE-MITnu�[���Copyright (c) 2012 Vladimir Keleshev, <vladimir@keleshev.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in 
the Software without restriction, including without limitation the rights to 
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
of the Software, and to permit persons to whom the Software is furnished to do 
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all 
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
SOFTWARE.
PK�(�\��)dkCkC"doc/alt-python37-docopt/README.rstnu�[���``docopt`` creates *beautiful* command-line interfaces
======================================================================

Video introduction to **docopt**: `PyCon UK 2012: Create *beautiful*
command-line interfaces with Python <http://youtu.be/pXhcPJK5cMc>`_

    New in version 0.6.1:

    - Fix issue `#85 <https://github.com/docopt/docopt/issues/85>`_
      which caused improper handling of ``[options]`` shortcut
      if it was present several times.

    New in version 0.6.0:

    - New argument ``options_first``, disallows interspersing options
      and arguments.  If you supply ``options_first=True`` to
      ``docopt``, it will interpret all arguments as positional
      arguments after first positional argument.

    - If option with argument could be repeated, its default value
      will be interpreted as space-separated list. E.g. with
      ``[default: ./here ./there]`` will be interpreted as
      ``['./here', './there']``.

    Breaking changes:

    - Meaning of ``[options]`` shortcut slightly changed. Previously
      it ment *"any known option"*. Now it means *"any option not in
      usage-pattern"*.  This avoids the situation when an option is
      allowed to be repeated unintentionaly.

    - ``argv`` is ``None`` by default, not ``sys.argv[1:]``.
      This allows ``docopt`` to always use the *latest* ``sys.argv``,
      not ``sys.argv`` during import time.

Isn't it awesome how ``optparse`` and ``argparse`` generate help
messages based on your code?!

*Hell no!*  You know what's awesome?  It's when the option parser *is*
generated based on the beautiful help message that you write yourself!
This way you don't need to write this stupid repeatable parser-code,
and instead can write only the help message--*the way you want it*.

**docopt** helps you create most beautiful command-line interfaces
*easily*:

.. code:: python

    """Naval Fate.

    Usage:
      naval_fate.py ship new <name>...
      naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
      naval_fate.py ship shoot <x> <y>
      naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
      naval_fate.py (-h | --help)
      naval_fate.py --version

    Options:
      -h --help     Show this screen.
      --version     Show version.
      --speed=<kn>  Speed in knots [default: 10].
      --moored      Moored (anchored) mine.
      --drifting    Drifting mine.

    """
    from docopt import docopt


    if __name__ == '__main__':
        arguments = docopt(__doc__, version='Naval Fate 2.0')
        print(arguments)

Beat that! The option parser is generated based on the docstring above
that is passed to ``docopt`` function.  ``docopt`` parses the usage
pattern (``"Usage: ..."``) and option descriptions (lines starting
with dash "``-``") and ensures that the program invocation matches the
usage pattern; it parses options, arguments and commands based on
that. The basic idea is that *a good help message has all necessary
information in it to make a parser*.

Also, `PEP 257 <http://www.python.org/dev/peps/pep-0257/>`_ recommends
putting help message in the module docstrings.

Installation
======================================================================

Use `pip <http://pip-installer.org>`_ or easy_install::

    pip install docopt==0.6.2

Alternatively, you can just drop ``docopt.py`` file into your
project--it is self-contained.

**docopt** is tested with Python 2.5, 2.6, 2.7, 3.2, 3.3 and PyPy.

API
======================================================================

.. code:: python

    from docopt import docopt

.. code:: python

    docopt(doc, argv=None, help=True, version=None, options_first=False)

``docopt`` takes 1 required and 4 optional arguments:

- ``doc`` could be a module docstring (``__doc__``) or some other
  string that contains a **help message** that will be parsed to
  create the option parser.  The simple rules of how to write such a
  help message are given in next sections.  Here is a quick example of
  such a string:

.. code:: python

    """Usage: my_program.py [-hso FILE] [--quiet | --verbose] [INPUT ...]

    -h --help    show this
    -s --sorted  sorted output
    -o FILE      specify output file [default: ./test.txt]
    --quiet      print less text
    --verbose    print more text

    """

- ``argv`` is an optional argument vector; by default ``docopt`` uses
  the argument vector passed to your program (``sys.argv[1:]``).
  Alternatively you can supply a list of strings like ``['--verbose',
  '-o', 'hai.txt']``.

- ``help``, by default ``True``, specifies whether the parser should
  automatically print the help message (supplied as ``doc``) and
  terminate, in case ``-h`` or ``--help`` option is encountered
  (options should exist in usage pattern, more on that below). If you
  want to handle ``-h`` or ``--help`` options manually (as other
  options), set ``help=False``.

- ``version``, by default ``None``, is an optional argument that
  specifies the version of your program. If supplied, then, (assuming
  ``--version`` option is mentioned in usage pattern) when parser
  encounters the ``--version`` option, it will print the supplied
  version and terminate.  ``version`` could be any printable object,
  but most likely a string, e.g. ``"2.1.0rc1"``.

    Note, when ``docopt`` is set to automatically handle ``-h``,
    ``--help`` and ``--version`` options, you still need to mention
    them in usage pattern for this to work. Also, for your users to
    know about them.

- ``options_first``, by default ``False``.  If set to ``True`` will
  disallow mixing options and positional argument.  I.e. after first
  positional argument, all arguments will be interpreted as positional
  even if the look like options.  This can be used for strict
  compatibility with POSIX, or if you want to dispatch your arguments
  to other programs.

The **return** value is a simple dictionary with options, arguments
and commands as keys, spelled exactly like in your help message.  Long
versions of options are given priority. For example, if you invoke the
top example as::

    naval_fate.py ship Guardian move 100 150 --speed=15

the return dictionary will be:

.. code:: python

    {'--drifting': False,    'mine': False,
     '--help': False,        'move': True,
     '--moored': False,      'new': False,
     '--speed': '15',        'remove': False,
     '--version': False,     'set': False,
     '<name>': ['Guardian'], 'ship': True,
     '<x>': '100',           'shoot': False,
     '<y>': '150'}

Help message format
======================================================================

Help message consists of 2 parts:

- Usage pattern, e.g.::

    Usage: my_program.py [-hso FILE] [--quiet | --verbose] [INPUT ...]

- Option descriptions, e.g.::

    -h --help    show this
    -s --sorted  sorted output
    -o FILE      specify output file [default: ./test.txt]
    --quiet      print less text
    --verbose    print more text

Their format is described below; other text is ignored.

Usage pattern format
----------------------------------------------------------------------

**Usage pattern** is a substring of ``doc`` that starts with
``usage:`` (case *insensitive*) and ends with a *visibly* empty line.
Minimum example:

.. code:: python

    """Usage: my_program.py

    """

The first word after ``usage:`` is interpreted as your program's name.
You can specify your program's name several times to signify several
exclusive patterns:

.. code:: python

    """Usage: my_program.py FILE
              my_program.py COUNT FILE

    """

Each pattern can consist of the following elements:

- **<arguments>**, **ARGUMENTS**. Arguments are specified as either
  upper-case words, e.g. ``my_program.py CONTENT-PATH`` or words
  surrounded by angular brackets: ``my_program.py <content-path>``.
- **--options**.  Options are words started with dash (``-``), e.g.
  ``--output``, ``-o``.  You can "stack" several of one-letter
  options, e.g. ``-oiv`` which will be the same as ``-o -i -v``. The
  options can have arguments, e.g.  ``--input=FILE`` or ``-i FILE`` or
  even ``-iFILE``. However it is important that you specify option
  descriptions if you want for option to have an argument, a default
  value, or specify synonymous short/long versions of option (see next
  section on option descriptions).
- **commands** are words that do *not* follow the described above
  conventions of ``--options`` or ``<arguments>`` or ``ARGUMENTS``,
  plus two special commands: dash "``-``" and double dash "``--``"
  (see below).

Use the following constructs to specify patterns:

- **[ ]** (brackets) **optional** elements.  e.g.: ``my_program.py
  [-hvqo FILE]``
- **( )** (parens) **required** elements.  All elements that are *not*
  put in **[ ]** are also required, e.g.: ``my_program.py
  --path=<path> <file>...`` is the same as ``my_program.py
  (--path=<path> <file>...)``.  (Note, "required options" might be not
  a good idea for your users).
- **|** (pipe) **mutualy exclusive** elements. Group them using **(
  )** if one of the mutually exclusive elements is required:
  ``my_program.py (--clockwise | --counter-clockwise) TIME``. Group
  them using **[ ]** if none of the mutually-exclusive elements are
  required: ``my_program.py [--left | --right]``.
- **...** (ellipsis) **one or more** elements. To specify that
  arbitrary number of repeating elements could be accepted, use
  ellipsis (``...``), e.g.  ``my_program.py FILE ...`` means one or
  more ``FILE``-s are accepted.  If you want to accept zero or more
  elements, use brackets, e.g.: ``my_program.py [FILE ...]``. Ellipsis
  works as a unary operator on the expression to the left.
- **[options]** (case sensitive) shortcut for any options.  You can
  use it if you want to specify that the usage pattern could be
  provided with any options defined below in the option-descriptions
  and do not want to enumerate them all in usage-pattern.  -
  "``[--]``". Double dash "``--``" is used by convention to separate
  positional arguments that can be mistaken for options. In order to
  support this convention add "``[--]``" to you usage patterns.  -
  "``[-]``". Single dash "``-``" is used by convention to signify that
  ``stdin`` is used instead of a file. To support this add "``[-]``"
  to you usage patterns. "``-``" act as a normal command.

If your pattern allows to match argument-less option (a flag) several
times::

    Usage: my_program.py [-v | -vv | -vvv]

then number of occurences of the option will be counted. I.e.
``args['-v']`` will be ``2`` if program was invoked as ``my_program
-vv``. Same works for commands.

If your usage patterns allows to match same-named option with argument
or positional argument several times, the matched arguments will be
collected into a list::

    Usage: my_program.py <file> <file> --path=<path>...

I.e. invoked with ``my_program.py file1 file2 --path=./here
--path=./there`` the returned dict will contain ``args['<file>'] ==
['file1', 'file2']`` and ``args['--path'] == ['./here', './there']``.


Option descriptions format
----------------------------------------------------------------------

**Option descriptions** consist of a list of options that you put
below your usage patterns.

It is necessary to list option descriptions in order to specify:

- synonymous short and long options,
- if an option has an argument,
- if option's argument has a default value.

The rules are as follows:

- Every line in ``doc`` that starts with ``-`` or ``--`` (not counting
  spaces) is treated as an option description, e.g.::

    Options:
      --verbose   # GOOD
      -o FILE     # GOOD
    Other: --bad  # BAD, line does not start with dash "-"

- To specify that option has an argument, put a word describing that
  argument after space (or equals "``=``" sign) as shown below. Follow
  either <angular-brackets> or UPPER-CASE convention for options'
  arguments.  You can use comma if you want to separate options. In
  the example below, both lines are valid, however you are recommended
  to stick to a single style.::

    -o FILE --output=FILE       # without comma, with "=" sign
    -i <file>, --input <file>   # with comma, wihtout "=" sing

- Use two spaces to separate options with their informal description::

    --verbose More text.   # BAD, will be treated as if verbose option had
                           # an argument "More", so use 2 spaces instead
    -q        Quit.        # GOOD
    -o FILE   Output file. # GOOD
    --stdout  Use stdout.  # GOOD, 2 spaces

- If you want to set a default value for an option with an argument,
  put it into the option-description, in form ``[default:
  <my-default-value>]``::

    --coefficient=K  The K coefficient [default: 2.95]
    --output=FILE    Output file [default: test.txt]
    --directory=DIR  Some directory [default: ./]

- If the option is not repeatable, the value inside ``[default: ...]``
  will be interpeted as string.  If it *is* repeatable, it will be
  splited into a list on whitespace::

    Usage: my_program.py [--repeatable=<arg> --repeatable=<arg>]
                         [--another-repeatable=<arg>]...
                         [--not-repeatable=<arg>]

    # will be ['./here', './there']
    --repeatable=<arg>          [default: ./here ./there]

    # will be ['./here']
    --another-repeatable=<arg>  [default: ./here]

    # will be './here ./there', because it is not repeatable
    --not-repeatable=<arg>      [default: ./here ./there]

Examples
----------------------------------------------------------------------

We have an extensive list of `examples
<https://github.com/docopt/docopt/tree/master/examples>`_ which cover
every aspect of functionality of **docopt**.  Try them out, read the
source if in doubt.

Subparsers, multi-level help and *huge* applications (like git)
----------------------------------------------------------------------

If you want to split your usage-pattern into several, implement
multi-level help (whith separate help-screen for each subcommand),
want to interface with existing scripts that don't use **docopt**, or
you're building the next "git", you will need the new ``options_first``
parameter (described in API section above). To get you started quickly
we implemented a subset of git command-line interface as an example:
`examples/git
<https://github.com/docopt/docopt/tree/master/examples/git>`_


Data validation
----------------------------------------------------------------------

**docopt** does one thing and does it well: it implements your
command-line interface.  However it does not validate the input data.
On the other hand there are libraries like `python schema
<https://github.com/halst/schema>`_ which make validating data a
breeze.  Take a look at `validation_example.py
<https://github.com/docopt/docopt/tree/master/examples/validation_example.py>`_
which uses **schema** to validate data and report an error to the
user.

Development
======================================================================

We would *love* to hear what you think about **docopt** on our `issues
page <http://github.com/docopt/docopt/issues>`_

Make pull requrests, report bugs, suggest ideas and discuss
**docopt**. You can also drop a line directly to
<vladimir@keleshev.com>.

Porting ``docopt`` to other languages
======================================================================

We think **docopt** is so good, we want to share it beyond the Python
community!

The follosing ports are available:

- `Ruby port <http://github.com/docopt/docopt.rb>`_
- `CoffeeScript port <http://github.com/docopt/docopt.coffee>`_
- `Lua port <http://github.com/docopt/docopt.lua>`_
- `PHP port <http://github.com/docopt/docopt.php>`_

But you can always create a port for your favorite language!  You are
encouraged to use the Python version as a reference implementation.  A
Language-agnostic test suite is bundled with `Python implementation
<http://github.com/docopt/docopt>`_.

Porting discussion is on `issues page
<http://github.com/docopt/docopt/issues>`_.

Changelog
======================================================================

**docopt** follows `semantic versioning <http://semver.org>`_.  The
first release with stable API will be 1.0.0 (soon).  Until then, you
are encouraged to specify explicitly the version in your dependency
tools, e.g.::

    pip install docopt==0.6.2

- 0.6.2 `Wheel <http://pythonwheels.com/>`_ support.
- 0.6.1 Bugfix release.
- 0.6.0 ``options_first`` parameter.
  **Breaking changes**: Corrected ``[options]`` meaning.
  ``argv`` defaults to ``None``.
- 0.5.0 Repeated options/commands are counted or accumulated into a
  list.
- 0.4.2 Bugfix release.
- 0.4.0 Option descriptions become optional,
  support for "``--``" and "``-``" commands.
- 0.3.0 Support for (sub)commands like `git remote add`.
  Introduce ``[options]`` shortcut for any options.
  **Breaking changes**: ``docopt`` returns dictionary.
- 0.2.0 Usage pattern matching. Positional arguments parsing based on
  usage patterns.
  **Breaking changes**: ``docopt`` returns namespace (for arguments),
  not list. Usage pattern is formalized.
- 0.1.0 Initial release. Options-parsing only (based on options
  description).
PK�(�\'�0��	�	doc/alt-python37-pip/README.rstnu�[���pip - The Python Package Installer
==================================

.. image:: https://img.shields.io/pypi/v/pip.svg
   :target: https://pypi.org/project/pip/

.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
   :target: https://pip.pypa.io/en/latest

pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.

Please take a look at our documentation for how to install and use pip:

* `Installation`_
* `Usage`_

We release updates regularly, with a new version every 3 months. Find more details in our documentation:

* `Release notes`_
* `Release process`_

In 2020, we're working on improvements to the heart of pip. Please `learn more and take our survey`_ to help us do it right.

If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:

* `Issue tracking`_
* `Discourse channel`_
* `User IRC`_

If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:

* `GitHub page`_
* `Development documentation`_
* `Development mailing list`_
* `Development IRC`_

Code of Conduct
---------------

Everyone interacting in the pip project's codebases, issue trackers, chat
rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_.

.. _package installer: https://packaging.python.org/guides/tool-recommendations/
.. _Python Package Index: https://pypi.org
.. _Installation: https://pip.pypa.io/en/stable/installing.html
.. _Usage: https://pip.pypa.io/en/stable/
.. _Release notes: https://pip.pypa.io/en/stable/news.html
.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
.. _GitHub page: https://github.com/pypa/pip
.. _Development documentation: https://pip.pypa.io/en/latest/development
.. _learn more and take our survey: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
.. _Issue tracking: https://github.com/pypa/pip/issues
.. _Discourse channel: https://discuss.python.org/c/packaging
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
.. _User IRC: https://webchat.freenode.net/?channels=%23pypa
.. _Development IRC: https://webchat.freenode.net/?channels=%23pypa-dev
.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
PK�(�\���;;+doc/alt-python37-importlib_metadata/LICENSEnu�[���Copyright 2017-2019 Jason R. Coombs, Barry Warsaw

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
PK�(�\>]q)�>�>/doc/alt-python37-importlib_metadata/CHANGES.rstnu�[���v4.6.0
======

* #326: Performance tests now rely on
  `pytest-perf <https://pypi.org/project/pytest-perf>`_.
  To disable these tests, which require network access
  and a git checkout, pass ``-p no:perf`` to pytest.

v4.5.0
======

* #319: Remove ``SelectableGroups`` deprecation exception
  for flake8.

v4.4.0
======

* #300: Restore compatibility in the result from
  ``Distribution.entry_points`` (``EntryPoints``) to honor
  expectations in older implementations and issuing
  deprecation warnings for these cases:

  - ``EntryPoints`` objects are once again mutable, allowing
    for ``sort()`` and other list-based mutation operations.
    Avoid deprecation warnings by casting to a
    mutable sequence (e.g.
    ``list(dist.entry_points).sort()``).

  - ``EntryPoints`` results once again allow
    for access by index. To avoid deprecation warnings,
    cast the result to a Sequence first
    (e.g. ``tuple(dist.entry_points)[0]``).

v4.3.1
======

* #320: Fix issue where normalized name for eggs was
  incorrectly solicited, leading to metadata being
  unavailable for eggs.

v4.3.0
======

* #317: De-duplication of distributions no longer requires
  loading the full metadata for ``PathDistribution`` objects,
  entry point loading performance by ~10x.

v4.2.0
======

* Prefer f-strings to ``.format`` calls.

v4.1.0
======

* #312: Add support for metadata 2.2 (``Dynamic`` field).

* #315: Add ``SimplePath`` protocol for interface clarity
  in ``PathDistribution``.

v4.0.1
======

* #306: Clearer guidance about compatibility in readme.

v4.0.0
======

* #304: ``PackageMetadata`` as returned by ``metadata()``
  and ``Distribution.metadata()`` now provides normalized
  metadata honoring PEP 566:

  - If a long description is provided in the payload of the
    RFC 822 value, it can be retrieved as the ``Description``
    field.
  - Any multi-line values in the metadata will be returned as
    such.
  - For any multi-line values, line continuation characters
    are removed. This backward-incompatible change means
    that any projects relying on the RFC 822 line continuation
    characters being present must be tolerant to them having
    been removed.
  - Add a ``json`` property that provides the metadata
    converted to a JSON-compatible form per PEP 566.


v3.10.1
=======

* Minor tweaks from CPython.

v3.10.0
=======

* #295: Internal refactoring to unify section parsing logic.

v3.9.1
======

* #296: Exclude 'prepare' package.
* #297: Fix ValueError when entry points contains comments.

v3.9.0
======

* Use of Mapping (dict) interfaces on ``SelectableGroups``
  is now flagged as deprecated. Instead, users are advised
  to use the select interface for future compatibility.

  Suppress the warning with this filter:
  ``ignore:SelectableGroups dict interface``.

  Or with this invocation in the Python environment:
  ``warnings.filterwarnings('ignore', 'SelectableGroups dict interface')``.

  Preferably, switch to the ``select`` interface introduced
  in 3.7.0. See the
  `entry points documentation <https://importlib-metadata.readthedocs.io/en/latest/using.html#entry-points>`_ and changelog for the 3.6
  release below for more detail.

  For some use-cases, especially those that rely on
  ``importlib.metadata`` in Python 3.8 and 3.9 or
  those relying on older ``importlib_metadata`` (especially
  on Python 3.5 and earlier),
  `backports.entry_points_selectable <https://pypi.org/project/backports.entry_points_selectable>`_
  was created to ease the transition. Please have a look
  at that project if simply relying on importlib_metadata 3.6+
  is not straightforward. Background in #298.

* #283: Entry point parsing no longer relies on ConfigParser
  and instead uses a custom, one-pass parser to load the
  config, resulting in a ~20% performance improvement when
  loading entry points.

v3.8.2
======

* #293: Re-enabled lazy evaluation of path lookup through
  a FreezableDefaultDict.

v3.8.1
======

* #293: Workaround for error in distribution search.

v3.8.0
======

* #290: Add mtime-based caching for ``FastPath`` and its
  lookups, dramatically increasing performance for repeated
  distribution lookups.

v3.7.3
======

* Docs enhancements and cleanup following review in
  `GH-24782 <https://github.com/python/cpython/pull/24782>`_.

v3.7.2
======

* Cleaned up cruft in entry_points docstring.

v3.7.1
======

* Internal refactoring to facilitate ``entry_points() -> dict``
  deprecation.

v3.7.0
======

* #131: Added ``packages_distributions`` to conveniently
  resolve a top-level package or module to its distribution(s).

v3.6.0
======

* #284: Introduces new ``EntryPoints`` object, a tuple of
  ``EntryPoint`` objects but with convenience properties for
  selecting and inspecting the results:

  - ``.select()`` accepts ``group`` or ``name`` keyword
    parameters and returns a new ``EntryPoints`` tuple
    with only those that match the selection.
  - ``.groups`` property presents all of the group names.
  - ``.names`` property presents the names of the entry points.
  - Item access (e.g. ``eps[name]``) retrieves a single
    entry point by name.

  ``entry_points`` now accepts "selection parameters",
  same as ``EntryPoint.select()``.

  ``entry_points()`` now provides a future-compatible
  ``SelectableGroups`` object that supplies the above interface
  (except item access) but remains a dict for compatibility.

  In the future, ``entry_points()`` will return an
  ``EntryPoints`` object for all entry points.

  If passing selection parameters to ``entry_points``, the
  future behavior is invoked and an ``EntryPoints`` is the
  result.

* #284: Construction of entry points using
  ``dict([EntryPoint, ...])`` is now deprecated and raises
  an appropriate DeprecationWarning and will be removed in
  a future version.

* #300: ``Distribution.entry_points`` now presents as an
  ``EntryPoints`` object and access by index is no longer
  allowed. If access by index is required, cast to a sequence
  first.

v3.5.0
======

* #280: ``entry_points`` now only returns entry points for
  unique distributions (by name).

v3.4.0
======

* #10: Project now declares itself as being typed.
* #272: Additional performance enhancements to distribution
  discovery.
* #111: For PyPA projects, add test ensuring that
  ``MetadataPathFinder._search_paths`` honors the needed
  interface. Method is still private.

v3.3.0
======

* #265: ``EntryPoint`` objects now expose a ``.dist`` object
  referencing the ``Distribution`` when constructed from a
  Distribution.

v3.2.0
======

* The object returned by ``metadata()`` now has a
  formally-defined protocol called ``PackageMetadata``
  with declared support for the ``.get_all()`` method.
  Fixes #126.

v3.1.1
======

v2.1.1
======

* #261: Restored compatibility for package discovery for
  metadata without version in the name and for legacy
  eggs.

v3.1.0
======

* Merge with 2.1.0.

v2.1.0
======

* #253: When querying for package metadata, the lookup
  now honors
  `package normalization rules <https://packaging.python.org/specifications/recording-installed-packages/>`_.

v3.0.0
======

* Require Python 3.6 or later.

v2.0.0
======

* ``importlib_metadata`` no longer presents a
  ``__version__`` attribute. Consumers wishing to
  resolve the version of the package should query it
  directly with
  ``importlib_metadata.version('importlib-metadata')``.
  Closes #71.

v1.7.0
======

* ``PathNotFoundError`` now has a custom ``__str__``
  mentioning "package metadata" being missing to help
  guide users to the cause when the package is installed
  but no metadata is present. Closes #124.

v1.6.1
======

* Added ``Distribution._local()`` as a provisional
  demonstration of how to load metadata for a local
  package. Implicitly requires that
  `pep517 <https://pypi.org/project/pep517>`_ is
  installed. Ref #42.
* Ensure inputs to FastPath are Unicode. Closes #121.
* Tests now rely on ``importlib.resources.files`` (and
  backport) instead of the older ``path`` function.
* Support any iterable from ``find_distributions``.
  Closes #122.

v1.6.0
======

* Added ``module`` and ``attr`` attributes to ``EntryPoint``

v1.5.2
======

* Fix redundant entries from ``FastPath.zip_children``.
  Closes #117.

v1.5.1
======

* Improve reliability and consistency of compatibility
  imports for contextlib and pathlib when running tests.
  Closes #116.

v1.5.0
======

* Additional performance optimizations in FastPath now
  saves an additional 20% on a typical call.
* Correct for issue where PyOxidizer finder has no
  ``__module__`` attribute. Closes #110.

v1.4.0
======

* Through careful optimization, ``distribution()`` is
  3-4x faster. Thanks to Antony Lee for the
  contribution. Closes #95.

* When searching through ``sys.path``, if any error
  occurs attempting to list a path entry, that entry
  is skipped, making the system much more lenient
  to errors. Closes #94.

v1.3.0
======

* Improve custom finders documentation. Closes #105.

v1.2.0
======

* Once again, drop support for Python 3.4. Ref #104.

v1.1.3
======

* Restored support for Python 3.4 due to improper version
  compatibility declarations in the v1.1.0 and v1.1.1
  releases. Closes #104.

v1.1.2
======

* Repaired project metadata to correctly declare the
  ``python_requires`` directive. Closes #103.

v1.1.1
======

* Fixed ``repr(EntryPoint)`` on PyPy 3 also. Closes #102.

v1.1.0
======

* Dropped support for Python 3.4.
* EntryPoints are now pickleable. Closes #96.
* Fixed ``repr(EntryPoint)`` on PyPy 2. Closes #97.

v1.0.0
======

* Project adopts semver for versioning.

* Removed compatibility shim introduced in 0.23.

* For better compatibility with the stdlib implementation and to
  avoid the same distributions being discovered by the stdlib and
  backport implementations, the backport now disables the
  stdlib DistributionFinder during initialization (import time).
  Closes #91 and closes #100.

0.23
====

* Added a compatibility shim to prevent failures on beta releases
  of Python before the signature changed to accept the
  "context" parameter on find_distributions. This workaround
  will have a limited lifespan, not to extend beyond release of
  Python 3.8 final.

0.22
====

* Renamed ``package`` parameter to ``distribution_name``
  as `recommended <https://bugs.python.org/issue34632#msg349423>`_
  in the following functions: ``distribution``, ``metadata``,
  ``version``, ``files``, and ``requires``. This
  backward-incompatible change is expected to have little impact
  as these functions are assumed to be primarily used with
  positional parameters.

0.21
====

* ``importlib.metadata`` now exposes the ``DistributionFinder``
  metaclass and references it in the docs for extending the
  search algorithm.
* Add ``Distribution.at`` for constructing a Distribution object
  from a known metadata directory on the file system. Closes #80.
* Distribution finders now receive a context object that
  supplies ``.path`` and ``.name`` properties. This change
  introduces a fundamental backward incompatibility for
  any projects implementing a ``find_distributions`` method
  on a ``MetaPathFinder``. This new layer of abstraction
  allows this context to be supplied directly or constructed
  on demand and opens the opportunity for a
  ``find_distributions`` method to solicit additional
  context from the caller. Closes #85.

0.20
====

* Clarify in the docs that calls to ``.files`` could return
  ``None`` when the metadata is not present. Closes #69.
* Return all requirements and not just the first for dist-info
  packages. Closes #67.

0.19
====

* Restrain over-eager egg metadata resolution.
* Add support for entry points with colons in the name. Closes #75.

0.18
====

* Parse entry points case sensitively.  Closes #68
* Add a version constraint on the backport configparser package.  Closes #66

0.17
====

* Fix a permission problem in the tests on Windows.

0.16
====

* Don't crash if there exists an EGG-INFO directory on sys.path.

0.15
====

* Fix documentation.

0.14
====

* Removed ``local_distribution`` function from the API.
  **This backward-incompatible change removes this
  behavior summarily**. Projects should remove their
  reliance on this behavior. A replacement behavior is
  under review in the `pep517 project
  <https://github.com/pypa/pep517>`_. Closes #42.

0.13
====

* Update docstrings to match PEP 8. Closes #63.
* Merged modules into one module. Closes #62.

0.12
====

* Add support for eggs.  !65; Closes #19.

0.11
====

* Support generic zip files (not just wheels).  Closes #59
* Support zip files with multiple distributions in them.  Closes #60
* Fully expose the public API in ``importlib_metadata.__all__``.

0.10
====

* The ``Distribution`` ABC is now officially part of the public API.
  Closes #37.
* Fixed support for older single file egg-info formats.  Closes #43.
* Fixed a testing bug when ``$CWD`` has spaces in the path.  Closes #50.
* Add Python 3.8 to the ``tox`` testing matrix.

0.9
===

* Fixed issue where entry points without an attribute would raise an
  Exception.  Closes #40.
* Removed unused ``name`` parameter from ``entry_points()``. Closes #44.
* ``DistributionFinder`` classes must now be instantiated before
  being placed on ``sys.meta_path``.

0.8
===

* This library can now discover/enumerate all installed packages. **This
  backward-incompatible change alters the protocol finders must
  implement to support distribution package discovery.** Closes #24.
* The signature of ``find_distributions()`` on custom installer finders
  should now accept two parameters, ``name`` and ``path`` and
  these parameters must supply defaults.
* The ``entry_points()`` method no longer accepts a package name
  but instead returns all entry points in a dictionary keyed by the
  ``EntryPoint.group``. The ``resolve`` method has been removed. Instead,
  call ``EntryPoint.load()``, which has the same semantics as
  ``pkg_resources`` and ``entrypoints``.  **This is a backward incompatible
  change.**
* Metadata is now always returned as Unicode text regardless of
  Python version. Closes #29.
* This library can now discover metadata for a 'local' package (found
  in the current-working directory). Closes #27.
* Added ``files()`` function for resolving files from a distribution.
* Added a new ``requires()`` function, which returns the requirements
  for a package suitable for parsing by
  ``packaging.requirements.Requirement``. Closes #18.
* The top-level ``read_text()`` function has been removed.  Use
  ``PackagePath.read_text()`` on instances returned by the ``files()``
  function.  **This is a backward incompatible change.**
* Release dates are now automatically injected into the changelog
  based on SCM tags.

0.7
===

* Fixed issue where packages with dashes in their names would
  not be discovered. Closes #21.
* Distribution lookup is now case-insensitive. Closes #20.
* Wheel distributions can no longer be discovered by their module
  name. Like Path distributions, they must be indicated by their
  distribution package name.

0.6
===

* Removed ``importlib_metadata.distribution`` function. Now
  the public interface is primarily the utility functions exposed
  in ``importlib_metadata.__all__``. Closes #14.
* Added two new utility functions ``read_text`` and
  ``metadata``.

0.5
===

* Updated README and removed details about Distribution
  class, now considered private. Closes #15.
* Added test suite support for Python 3.4+.
* Fixed SyntaxErrors on Python 3.4 and 3.5. !12
* Fixed errors on Windows joining Path elements. !15

0.4
===

* Housekeeping.

0.3
===

* Added usage documentation.  Closes #8
* Add support for getting metadata from wheels on ``sys.path``.  Closes #9

0.2
===

* Added ``importlib_metadata.entry_points()``.  Closes #1
* Added ``importlib_metadata.resolve()``.  Closes #12
* Add support for Python 2.7.  Closes #4

0.1
===

* Initial release.


..
   Local Variables:
   mode: change-log-mode
   indent-tabs-mode: nil
   sentence-end-double-space: t
   fill-column: 78
   coding: utf-8
   End:
PK�(�\������.doc/alt-python37-importlib_metadata/README.rstnu�[���.. image:: https://img.shields.io/pypi/v/importlib_metadata.svg
   :target: `PyPI link`_

.. image:: https://img.shields.io/pypi/pyversions/importlib_metadata.svg
   :target: `PyPI link`_

.. _PyPI link: https://pypi.org/project/importlib_metadata

.. image:: https://github.com/python/importlib_metadata/workflows/tests/badge.svg
   :target: https://github.com/python/importlib_metadata/actions?query=workflow%3A%22tests%22
   :alt: tests

.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
   :target: https://github.com/psf/black
   :alt: Code style: Black

.. image:: https://readthedocs.org/projects/importlib-metadata/badge/?version=latest
   :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest

.. image:: https://img.shields.io/badge/skeleton-2021-informational
   :target: https://blog.jaraco.com/skeleton


Library to access the metadata for a Python package.

This package supplies third-party access to the functionality of
`importlib.metadata <https://docs.python.org/3/library/importlib.metadata.html>`_
including improvements added to subsequent Python versions.


Compatibility
=============

New features are introduced in this third-party library and later merged
into CPython. The following table indicates which versions of this library
were contributed to different versions in the standard library:

.. list-table::
   :header-rows: 1

   * - importlib_metadata
     - stdlib
   * - 4.4
     - 3.10
   * - 1.4
     - 3.8


Usage
=====

See the `online documentation <https://importlib_metadata.readthedocs.io/>`_
for usage details.

`Finder authors
<https://docs.python.org/3/reference/import.html#finders-and-loaders>`_ can
also add support for custom package installers.  See the above documentation
for details.


Caveats
=======

This project primarily supports third-party packages installed by PyPA
tools (or other conforming packages). It does not support:

- Packages in the stdlib.
- Packages installed without metadata.

Project details
===============

 * Project home: https://github.com/python/importlib_metadata
 * Report bugs at: https://github.com/python/importlib_metadata/issues
 * Code hosting: https://github.com/python/importlib_metadata
 * Documentation: https://importlib_metadata.readthedocs.io/
PK�(�\�E�=U,U,"doc/alt-python37-multidict/LICENSEnu�[���                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2016-2017 Andrew Svetlov

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
PK�(�\��$˖�%doc/alt-python37-multidict/README.rstnu�[���=========
multidict
=========

.. image:: https://github.com/aio-libs/multidict/workflows/CI/badge.svg
   :target: https://github.com/aio-libs/multidict/actions?query=workflow%3ACI
   :alt: GitHub status for master branch

.. image:: https://codecov.io/gh/aio-libs/multidict/branch/master/graph/badge.svg
   :target: https://codecov.io/gh/aio-libs/multidict
   :alt: Coverage metrics

.. image:: https://img.shields.io/pypi/v/multidict.svg
   :target: https://pypi.org/project/multidict
   :alt: PyPI

.. image:: https://readthedocs.org/projects/multidict/badge/?version=latest
   :target: http://multidict.readthedocs.org/en/latest/?badge=latest
   :alt: Documentationb

.. image:: https://img.shields.io/pypi/pyversions/multidict.svg
   :target: https://pypi.org/project/multidict
   :alt: Python versions

.. image:: https://badges.gitter.im/Join%20Chat.svg
   :target: https://gitter.im/aio-libs/Lobby
   :alt: Chat on Gitter

Multidict is dict-like collection of *key-value pairs* where key
might be occurred more than once in the container.

Introduction
------------

*HTTP Headers* and *URL query string* require specific data structure:
*multidict*. It behaves mostly like a regular ``dict`` but it may have
several *values* for the same *key* and *preserves insertion ordering*.

The *key* is ``str`` (or ``istr`` for case-insensitive dictionaries).

``multidict`` has four multidict classes:
``MultiDict``, ``MultiDictProxy``, ``CIMultiDict``
and ``CIMultiDictProxy``.

Immutable proxies (``MultiDictProxy`` and
``CIMultiDictProxy``) provide a dynamic view for the
proxied multidict, the view reflects underlying collection changes. They
implement the ``collections.abc.Mapping`` interface.

Regular mutable (``MultiDict`` and ``CIMultiDict``) classes
implement ``collections.abc.MutableMapping`` and allows to change
their own content.


*Case insensitive* (``CIMultiDict`` and
``CIMultiDictProxy``) ones assume the *keys* are case
insensitive, e.g.::

   >>> dct = CIMultiDict(key='val')
   >>> 'Key' in dct
   True
   >>> dct['Key']
   'val'

*Keys* should be ``str`` or ``istr`` instances.

The library has optional C Extensions for sake of speed.


License
-------

Apache 2

Library Installation
--------------------

.. code-block:: bash

   $ pip install multidict

The library is Python 3 only!

PyPI contains binary wheels for Linux, Windows and MacOS.  If you want to install
``multidict`` on another operation system (or *Alpine Linux* inside a Docker) the
Tarball will be used to compile the library from sources.  It requires C compiler and
Python headers installed.

To skip the compilation please use `MULTIDICT_NO_EXTENSIONS` environment variable,
e.g.:

.. code-block:: bash

   $ MULTIDICT_NO_EXTENSIONS=1 pip install multidict

Please note, Pure Python (uncompiled) version is about 20-50 times slower depending on
the usage scenario!!!



Changelog
---------
See `RTD page <http://multidict.readthedocs.org/en/latest/changes.html>`_.
PK�(�\�@yttdoc/alt-python37-raven/PKG-INFOnu�[���Metadata-Version: 1.1
Name: raven
Version: 6.3.0
Summary: Raven is a client for Sentry (https://getsentry.com)
Home-page: https://github.com/getsentry/raven-python
Author: Sentry
Author-email: hello@getsentry.com
License: BSD
Description: 
        Raven
        =====
        
        Raven is a Python client for `Sentry <http://getsentry.com/>`_. It provides
        full out-of-the-box support for many of the popular frameworks, including
        `Django <djangoproject.com>`_, `Flask <http://flask.pocoo.org/>`_, and `Pylons
        <http://www.pylonsproject.org/>`_. Raven also includes drop-in support for any
        `WSGI <https://wsgi.readthedocs.io/>`_-compatible web application.
        
Platform: UNKNOWN
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: System Administrators
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development
PK�(�\Z{�^��doc/alt-python37-raven/LICENSEnu�[���Copyright (c) 2015 Functional Software, Inc and individual contributors.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    3. Neither the name of the Raven nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK�(�\��
�
!doc/alt-python37-raven/README.rstnu�[���.. raw:: html

    <p align="center">

.. image:: docs/_static/logo.png
    :target: https://sentry.io
    :align: center
    :width: 116
    :alt: Sentry website

.. raw:: html

    </p>

Raven - Sentry for Python
=========================

.. image:: https://img.shields.io/pypi/v/raven.svg
    :target: https://pypi.python.org/pypi/raven
    :alt: PyPi page link -- version

.. image:: https://travis-ci.org/getsentry/raven-python.svg?branch=master
    :target: https://travis-ci.org/getsentry/raven-python

.. image:: https://img.shields.io/pypi/l/raven.svg
    :target: https://pypi.python.org/pypi/raven
    :alt: PyPi page link -- MIT licence

.. image:: https://img.shields.io/pypi/pyversions/raven.svg
    :target: https://pypi.python.org/pypi/raven
    :alt: PyPi page link -- Python versions

.. image:: https://codeclimate.com/github/getsentry/raven-python/badges/gpa.svg
   :target: https://codeclimate.com/github/codeclimate/codeclimate
   :alt: Code Climate


Raven is the official Python client for `Sentry`_, officially supports
Python 2.6–2.7 & 3.3–3.7, and runs on PyPy and Google App Engine.

It tracks errors and exceptions that happen during the
execution of your application and provides instant notification with detailed
information needed to prioritize, identify, reproduce and fix each issue.

It provides full out-of-the-box support for many of the popular python frameworks, including
Django, and Flask. Raven also includes drop-in support for any WSGI-compatible
web application.

Your application doesn't live on the web? No problem! Raven is easy to use in
any Python application.

For more information, see our `Python Documentation`_ for framework integrations and other goodies.


Features
--------

- Automatically report (un)handled exceptions and errors
- Send customized diagnostic data
- Process and sanitize data before sending it over the network


Quickstart
----------

It's really easy to get started with Raven. After you complete setting up a project in Sentry,
you’ll be given a value which we call a DSN, or Data Source Name. You will need it to configure the client.


Install the latest package with *pip* and configure the client::

    pip install raven --upgrade

Create a client and capture an example exception:

.. sourcecode:: python

    from raven import Client

    client = Client('___DSN___')

    try:
        1 / 0
    except ZeroDivisionError:
        client.captureException()


Raven Python is more than that however. Checkout our `Python Documentation`_.


Contributing
------------

Raven is under active development and contributions are more than welcome!
There are many ways to contribute:

* Join in on discussions on our `Mailing List`_ or in our `IRC Channel`_.

* Report bugs on our `Issue Tracker`_.

* Submit a pull request!


Resources
---------

* `Sentry`_
* `Python Documentation`_
* `Issue Tracker`_
* `Code`_ on Github
* `Mailing List`_
* `IRC Channel`_ (irc.freenode.net, #sentry)
* `Travis CI`_

.. _Sentry: https://getsentry.com/
.. _Python Documentation: https://docs.getsentry.com/hosted/clients/python/
.. _SDKs for other platforms: https://docs.sentry.io/#platforms
.. _Issue Tracker: https://github.com/getsentry/raven-python/issues
.. _Code: https://github.com/getsentry/raven-python
.. _Mailing List: https://groups.google.com/group/getsentry
.. _IRC Channel: irc://irc.freenode.net/sentry
.. _Travis CI: http://travis-ci.org/getsentry/raven-python





Not using Python? Check out our `SDKs for other platforms`_.
PK�(�\-�5��(�('doc/alt-python37-simplejson/LICENSE.txtnu�[���simplejson is dual-licensed software. It is available under the terms
of the MIT license, or the Academic Free License version 2.1. The full
text of each license agreement is included below. This code is also
licensed to the Python Software Foundation (PSF) under a Contributor
Agreement.

MIT License
===========

Copyright (c) 2006 Bob Ippolito

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Academic Free License v. 2.1
============================

Copyright (c) 2006 Bob Ippolito.  All rights reserved.

This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work:

Licensed under the Academic Free License version 2.1

1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license to do the following:

a) to reproduce the Original Work in copies;

b) to prepare derivative works ("Derivative Works") based upon the Original Work;

c) to distribute copies of the Original Work and Derivative Works to the public;

d) to perform the Original Work publicly; and

e) to display the Original Work publicly.

2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and Derivative Works.

3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor hereby agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work, and by publishing the address of that information repository in a notice immediately following the copyright notice that applies to the Original Work.

4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior written permission of the Licensor. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor except as expressly stated herein. No patent license is granted to make, use, sell or offer to sell embodiments of any patent claims other than the licensed claims defined in Section 2. No right is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any Original Work that Licensor otherwise would have a right to license.

5) This section intentionally omitted.

6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work.

7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately proceeding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to Original Work is granted hereunder except under this disclaimer.

8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to liability for death or personal injury resulting from Licensor's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.

9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions.

10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware.

11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License.

12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License.

13) Miscellaneous. This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.

14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You.

This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner.
PK�(�\�s��&doc/alt-python37-simplejson/README.rstnu�[���simplejson
----------

.. image:: https://travis-ci.org/simplejson/simplejson.svg?branch=master
    :target: https://travis-ci.org/simplejson/simplejson

simplejson is a simple, fast, complete, correct and extensible
JSON <http://json.org> encoder and decoder for Python 2.5+
and Python 3.3+.  It is pure Python code with no dependencies,
but includes an optional C extension for a serious speed boost.

The latest documentation for simplejson can be read online here:
https://simplejson.readthedocs.io/

simplejson is the externally maintained development version of the
json library included with Python 2.6 and Python 3.0, but maintains
backwards compatibility with Python 2.5.

The encoder can be specialized to provide serialization in any kind of
situation, without any special support by the objects to be serialized
(somewhat like pickle). This is best done with the ``default`` kwarg
to dumps.

The decoder can handle incoming JSON strings of any specified encoding
(UTF-8 by default). It can also be specialized to post-process JSON
objects with the ``object_hook`` or ``object_pairs_hook`` kwargs. This
is particularly useful for implementing protocols such as JSON-RPC
that have a richer type system than JSON itself.

For those of you that have legacy systems to maintain, there is a
very old fork of simplejson in the `python2.2`_ branch that supports
Python 2.2. This is based off of a very old version of simplejson,
is not maintained, and should only be used as a last resort.

.. _python2.2: https://github.com/simplejson/simplejson/tree/python2.2
PK�(�\D��
R
R'doc/alt-python37-simplejson/CHANGES.txtnu�[���Version 3.12.0 released 2017-11-05

* Fix threaded import race condition
  https://github.com/simplejson/simplejson/issues/184
* Move RawJSON implementation to simplejson.raw_json module
* Move JSONDecodeError implementation to simplejson.errors module

Version 3.11.1 released 2017-06-19

* Fix issue with item_sort_key when speedups are available, and add
  auto-discovery to test suites to prevent similar regressions
  https://github.com/simplejson/simplejson/issues/173

Version 3.11.0 released 2017-06-18

* docstring fix in JSONEncoder
  https://github.com/simplejson/simplejson/pull/172
* Call PyObject_IsTrue() only once for the strict argument of scanner
  https://github.com/simplejson/simplejson/pull/170
* Fix a crash with unencodable encoding in the encoder
  https://github.com/simplejson/simplejson/pull/171
* Remove unused imports
  https://github.com/simplejson/simplejson/pull/162
* Remove remnants of Python 2.4 support
  https://github.com/simplejson/simplejson/pull/168
* Fix argument checking errors in _speedups.c
  https://github.com/simplejson/simplejson/pull/169
* Remove the `__init__` methods in extension classes
  https://github.com/simplejson/simplejson/pull/166
* Fix typo in the doc for loads
  https://github.com/simplejson/simplejson/issues/161
* Add Python 3.6 to testing matrix and PyPI metadata
  https://github.com/simplejson/simplejson/pull/153
  https://github.com/simplejson/simplejson/pull/152

Version 3.10.0 released 2016-10-28

* Add RawJSON class to allow a faster path for already encoded JSON.
  https://github.com/simplejson/simplejson/pull/143

Version 3.9.0 released 2016-10-21

* Workaround for bad behavior in string subclasses
  https://github.com/simplejson/simplejson/issues/144
* Fix warnings flagged by -3
  https://github.com/simplejson/simplejson/pull/146
* Update readthedocs documentation links
  https://github.com/simplejson/simplejson/pull/137
* Add build status badge to README
  https://github.com/simplejson/simplejson/pull/134

Version 3.8.2 released 2016-02-14

* Fix implicit cast compiler warning in _speedups.c
* simplejson is now available as wheels for OS X and Windows thanks to Travis-CI
  and AppVeyor respectively! Many thanks to @aebrahim for getting this party
  started.
  https://github.com/simplejson/simplejson/pull/130
  https://github.com/simplejson/simplejson/issues/122

Version 3.8.1 released 2015-10-27

* Fix issue with iterable_as_array and indent option
  https://github.com/simplejson/simplejson/issues/128
* Fix typo in keyword argument name introduced in 3.8.0
  https://github.com/simplejson/simplejson/pull/123

Version 3.8.0 released 2015-07-18

* New iterable_as_array encoder option to perform lazy serialization of
  any iterable objects, without having to convert to tuple or list.

Version 3.7.3 released 2015-05-31

* Fix typo introduced in 3.7.0 (behavior should be indistinguishable)
  https://github.com/simplejson/simplejson/commit/e18cc09b688ea1f3305c27616fd3cadd2adc6d31#commitcomment-11443842

Version 3.7.2 released 2015-05-22

* Do not cache Decimal class in encoder, only reference the decimal module.
  This may make reload work in more common scenarios.

Version 3.7.1 released 2015-05-18

* Fix compilation with MSVC
  https://github.com/simplejson/simplejson/pull/119

Version 3.7.0 released 2015-05-18

* simplejson no longer trusts custom str/repr methods for int, long, float
  subclasses. These instances are now formatted as if they were exact
  instances of those types.
  https://github.com/simplejson/simplejson/issues/118

Version 3.6.5 released 2014-10-24

* Importing bug fix for reference leak when an error occurs during
  dict encoding
  https://github.com/simplejson/simplejson/issues/109

Version 3.6.4 released 2014-09-29

* Important bug fix for dump when only sort_keys is set
  https://github.com/simplejson/simplejson/issues/106

Version 3.6.3 released 2014-08-18

* Documentation updates
  https://github.com/simplejson/simplejson/issues/103

Version 3.6.2 released 2014-08-09

* Documentation updates
  http://bugs.python.org/issue21514

Version 3.6.1 released 2014-08-09

* Documentation updates
  https://github.com/simplejson/simplejson/issues/102

Version 3.6.0 released 2014-07-21

* Automatically strip any UTF-8 BOM from input to more closely
  follow the latest specs
  https://github.com/simplejson/simplejson/pull/101

Version 3.5.3 released 2014-06-24

* Fix lower bound checking in scan_once / raw_decode API
  https://github.com/simplejson/simplejson/issues/98

Version 3.5.2 released 2014-05-22

* Fix Windows build with VS2008
  https://github.com/simplejson/simplejson/pull/97

Version 3.5.1 released 2014-05-21

* Consistently reject int_as_string_bitcount settings that are not
  positive integers

Version 3.5.0 released 2014-05-20

* Added int_as_string_bitcount encoder option
  https://github.com/simplejson/pull/96
* Fixed potential crash when encoder created with incorrect options

Version 3.4.1 released 2014-04-30

* Fixed tests to run on Python 3.4

Version 3.4.0 released 2014-04-02

* Native setuptools support re-introduced
  https://github.com/simplejson/simplejson/pull/92

Version 3.3.3 released 2014-02-14

* Improve test suite's Python 3.4 compatibility
  https://github.com/simplejson/simplejson/issues/87

Version 3.3.2 released 2014-01-06

* Docstring fix for decoded string types
  https://github.com/simplejson/simplejson/pull/82

Version 3.3.1 released 2013-10-05

* JSONDecodeError exceptions can now be pickled
  https://github.com/simplejson/simplejson/pull/78

Version 3.3.0 released 2013-05-07

* Unpaired surrogates once again pass through the decoder, to match older
  behavior and the RFC-4627 spec.
  https://github.com/simplejson/simplejson/issues/62

Version 3.2.0 released 2013-05-01

* New ignore_nan kwarg in encoder that serializes out
  of range floats (Infinity, -Infinity, NaN) as null for ECMA-262
  compliance.
  https://github.com/simplejson/simplejson/pull/63
* New for_json kwarg in encoder to make it possible to for
  subclasses of dict and list to be specialized.
  https://github.com/simplejson/simplejson/pull/69

Version 3.1.3 released 2013-04-06

* Updated documentation to discourage subclassing whenever possible.
   default, object_hook, and object_pairs_hook provide almost all of
   the functionality of subclassing.

Version 3.1.2 released 2013-03-20

* Updated documentation to reflect separators behavior when indent is
  not None
  https://github.com/simplejson/simplejson/issues/59
* Test suite should be compatible with debug builds of Python 2.x and 3.x
  https://github.com/simplejson/simplejson/pull/65

Version 3.1.1 released 2013-02-21

* setup.py now has another workaround for Windows machines without
  MSVC installed
  http://bugs.python.org/issue7511

Version 3.1.0 released 2013-02-21

* Updated JSON conformance test suite
  http://bugs.python.org/issue16559
* simplejson.tool tests and bugfix for Python 3.x
  http://bugs.python.org/issue16549
* Improve error messages for certain kinds of truncated input
  http://bugs.python.org/issue16009
* Moved JSONDecodeError to json.scanner (still available for import
  from json.decoder)
* Changed scanner to use JSONDecodeError directly rather than
  StopIteration to improve error messages

Version 3.0.9 released 2013-02-21

* Fix an off-by-one error in the colno property of JSONDecodeError
  (when lineno == 1)
  http://bugs.python.org/issue17225

Version 3.0.8 released 2013-02-19

* Fix a Python 2.x compiler warning for narrow unicode builds
  https://github.com/simplejson/simplejson/issues/56

Version 3.0.7 released 2013-01-11

* NOTE: this release only changes the license.
* simplejson is now dual-licensed software, MIT or AFL v2.1. It is
  also made explicit that this code is also licensed to the PSF under
  a Contributor Agreement.

Version 3.0.6 released 2013-01-11

* Fix for major Python 2.x ensure_ascii=False encoding regression
  introduced in simplejson 3.0.0. If you use this setting, please
  upgrade immediately.
  https://github.com/simplejson/simplejson/issues/50

Version 3.0.5 released 2013-01-03

* NOTE: this release only changes the tests, it is
  not essential to upgrade
* Tests now run with deprecation warnings printed
* Fixed Python 3 syntax error in simplejson.tool
  https://github.com/simplejson/simplejson/issues/49
* Fixed Python 3.3 deprecation warnings in test suite
  https://github.com/simplejson/simplejson/issues/48

Version 3.0.4 released 2013-01-02

* MSVC compatibility for Python 3.3
  https://github.com/simplejson/simplejson/pull/47

Version 3.0.3 released 2013-01-01

* Fixes for bugs introduced in 3.0.2
* Fixes for Python 2.5 compatibility
* MSVC compatibility for Python 2.x
  https://github.com/simplejson/simplejson/pull/46

Version 3.0.2 released 2013-01-01

* THIS VERSION HAS BEEN REMOVED
* Missed a changeset to _speedups.c in the 3.0.1 branch cut

Version 3.0.1 released 2013-01-01

* THIS VERSION HAS BEEN REMOVED
* Add accumulator optimization to encoder, equivalent to the usage of
  `_Py_Accu` in the Python 3.3 json library. Only relevant if encoding
  very large JSON documents.

Version 3.0.0 released 2012-12-30

* Python 3.3 is now supported, thanks to Vinay Sajip
  https://github.com/simplejson/simplejson/issues/8
* `sort_keys`/`item_sort_key` now sort on the stringified version of the
  key, rather than the original object. This ensures that the sort
  only compares string types and makes the behavior consistent between
  Python 2.x and Python 3.x.
* Like other number types, Decimal instances used as keys are now
  coerced to strings when use_decimal is True.

Version 2.6.2 released 2012-09-21

* JSONEncoderForHTML was not exported in the simplejson module
  https://github.com/simplejson/simplejson/issues/41

Version 2.6.1 released 2012-07-27

* raw_decode() now skips whitespace before the object
  https://github.com/simplejson/simplejson/pull/38

Version 2.6.0 released 2012-06-26

* Error messages changed to match proposal for Python 3.3.1
  http://bugs.python.org/issue5067

Version 2.5.2 released 2012-05-10

* Fix for regression introduced in 2.5.1
  https://github.com/simplejson/simplejson/issues/35

Version 2.5.1 released 2012-05-10

* Support for use_decimal=True in environments that use Python
  sub-interpreters such as uWSGI
  https://github.com/simplejson/simplejson/issues/34

Version 2.5.0 released 2012-03-29

* New item_sort_key option for encoder to allow fine grained control of sorted
  output

Version 2.4.0 released 2012-03-06

* New bigint_as_string option for encoder to trade JavaScript number precision
  issues for type issues.
  https://github.com/simplejson/simplejson/issues/31

Version 2.3.3 released 2012-02-27

* Allow unknown numerical types for indent parameter
  https://github.com/simplejson/simplejson/pull/29

Version 2.3.2 released 2011-12-30

* Fix crashing regression in speedups introduced in 2.3.1

Version 2.3.1 released 2011-12-29

* namedtuple_as_object now checks _asdict to ensure that it
  is callable.
  https://github.com/simplejson/simplejson/issues/26

Version 2.3.0 released 2011-12-05

* Any objects with _asdict() methods are now considered for
  namedtuple_as_object.
  https://github.com/simplejson/simplejson/pull/22

Version 2.2.1 released 2011-09-06

* Fix MANIFEST.in issue when building a sdist from a sdist.
  https://github.com/simplejson/simplejson/issues/16

Version 2.2.0 released 2011-09-04

* Remove setuptools requirement, reverted to pure distutils
* use_decimal default for encoding (dump, dumps, JSONEncoder) is now True
* tuple encoding as JSON objects can be turned off with new
  tuple_as_array=False option.
  https://github.com/simplejson/simplejson/pull/6
* namedtuple (or other tuple subclasses with _asdict methods) are now
  encoded as JSON objects rather than arrays by default. Can be disabled
  and treated as a tuple with the new namedtuple_as_object=False option.
  https://github.com/simplejson/simplejson/pull/6
* JSONDecodeError is now raised instead of ValueError when a document
  ends with an opening quote and the C speedups are in use.
  https://github.com/simplejson/simplejson/issues/15
* Updated documentation with information about JSONDecodeError
* Force unicode linebreak characters to be escaped (U+2028 and U+2029)
  http://timelessrepo.com/json-isnt-a-javascript-subset
* Moved documentation from a git submodule to
  https://simplejson.readthedocs.io/

Version 2.1.6 released 2011-05-08

* Prevent segfaults with deeply nested JSON documents
  https://github.com/simplejson/simplejson/issues/11
* Fix compatibility with Python 2.5
  https://github.com/simplejson/simplejson/issues/5

Version 2.1.5 released 2011-04-17

* Built sdist tarball with setuptools_git installed. Argh.

Version 2.1.4 released 2011-04-17

* Does not try to build the extension when using PyPy
* Trailing whitespace after commas no longer emitted when indent is used
* Migrated to github http://github.com/simplejson/simplejson

Version 2.1.3 released 2011-01-17

* Support the sort_keys option in C encoding speedups
  http://code.google.com/p/simplejson/issues/detail?id=86
* Allow use_decimal to work with dump()
  http://code.google.com/p/simplejson/issues/detail?id=87

Version 2.1.2 released 2010-11-01

* Correct wrong end when object_pairs_hook is used
  http://code.google.com/p/simplejson/issues/detail?id=85
* Correct output for indent=0
  http://bugs.python.org/issue10019
* Correctly raise TypeError when non-string keys are used with speedups
  http://code.google.com/p/simplejson/issues/detail?id=82
* Fix the endlineno, endcolno attributes of the JSONDecodeError exception.
  http://code.google.com/p/simplejson/issues/detail?id=81

Version 2.1.1 released 2010-03-31

* Change how setup.py imports ez_setup.py to try and workaround old versions
  of setuptools.
  http://code.google.com/p/simplejson/issues/detail?id=75
* Fix compilation on Windows platform (and other platforms with very
  picky compilers)
* Corrected simplejson.__version__ and other minor doc changes.
* Do not fail speedups tests if speedups could not be built.
  http://code.google.com/p/simplejson/issues/detail?id=73

Version 2.1.0 released 2010-03-10

* Decimal serialization officially supported for encoding with
  use_decimal=True. For encoding this encodes Decimal objects and
  for decoding it implies parse_float=Decimal
* Python 2.4 no longer supported (may still work, but no longer tested)
* Decoding performance and memory utilization enhancements
  http://bugs.python.org/issue7451
* JSONEncoderForHTML class for escaping &, <, >
  http://code.google.com/p/simplejson/issues/detail?id=66
* Memoization of object keys during encoding (when using speedups)
* Encoder changed to use PyIter_Next for list iteration to avoid
  potential threading issues
* Encoder changed to use iteritems rather than PyDict_Next in order to
  support dict subclasses that have a well defined ordering
  http://bugs.python.org/issue6105
* indent encoding parameter changed to be a string rather than an integer
  (integer use still supported for backwards compatibility)
  http://code.google.com/p/simplejson/issues/detail?id=56
* Test suite (python setup.py test) now automatically runs with and without
  speedups
  http://code.google.com/p/simplejson/issues/detail?id=55
* Fixed support for older versions of easy_install (e.g. stock Mac OS X config)
  http://code.google.com/p/simplejson/issues/detail?id=54
* Fixed str/unicode mismatches when using ensure_ascii=False
  http://code.google.com/p/simplejson/issues/detail?id=48
* Fixed error message when parsing an array with trailing comma with speedups
  http://code.google.com/p/simplejson/issues/detail?id=46
* Refactor decoder errors to raise JSONDecodeError instead of ValueError
  http://code.google.com/p/simplejson/issues/detail?id=45
* New ordered_pairs_hook feature in decoder which makes it possible to
  preserve key order. http://bugs.python.org/issue5381
* Fixed containerless unicode float decoding (same bug as 2.0.4, oops!)
  http://code.google.com/p/simplejson/issues/detail?id=43
* Share PosInf definition between encoder and decoder
* Minor reformatting to make it easier to backport simplejson changes
  to Python 2.7/3.1 json module

Version 2.0.9 released 2009-02-18

* Adds cyclic GC to the Encoder and Scanner speedups, which could've
  caused uncollectible cycles in some cases when using custom parser
  or encoder functions

Version 2.0.8 released 2009-02-15

* Documentation fixes
* Fixes encoding True and False as keys
* Fixes checking for True and False by identity for several parameters

Version 2.0.7 released 2009-01-04

* Documentation fixes
* C extension now always returns unicode strings when the input string is
  unicode, even for empty strings

Version 2.0.6 released 2008-12-19

* Windows build fixes

Version 2.0.5 released 2008-11-23

* Fixes a segfault in the C extension when using check_circular=False and
  encoding an invalid document

Version 2.0.4 released 2008-10-24

* Fixes a parsing error in the C extension when the JSON document is (only)
  a floating point number. It would consume one too few characters in that
  case, and claim the document invalid.

Version 2.0.3 released 2008-10-11

* Fixes reference leaks in the encoding speedups (sorry about that!)
* Fixes doctest suite for Python 2.6
* More optimizations for the decoder

Version 2.0.2 released 2008-10-06

* Fixes MSVC2003 build regression
* Fixes Python 2.4 compatibility in _speedups.c

Version 2.0.1 released 2008-09-29

* Fixes long encoding regression introduced in 2.0.0
* Fixes MinGW build regression introduced in 2.0.0

Version 2.0.0 released 2008-09-27

* optimized Python encoding path
* optimized Python decoding path
* optimized C encoding path
* optimized C decoding path
* switched to sphinx docs (nearly the same as the json module in python 2.6)

Version 1.9.3 released 2008-09-23

* Decoding is significantly faster (for our internal benchmarks)
* Pretty-printing tool changed from simplejson to simplejson.tool for better
  Python 2.6 comaptibility
* Misc. bug fixes

Version 1.9 released 2008-05-03

* Rewrote test suite with unittest and doctest (no more nosetest dependency)
* Better PEP 7 and PEP 8 source compliance
* Removed simplejson.jsonfilter demo module
* simplejson.jsonfilter is no longer included

Version 1.8.1 released 2008-03-24

* Optional C extension for accelerating the decoding of JSON strings
* Command line interface for pretty-printing JSON (via python -msimplejson)
* Decoding of integers and floats is now extensible (e.g. to use Decimal) via
  parse_int, parse_float options.
* Subversion and issue tracker moved to google code:
  http://code.google.com/p/simplejson/
* "/" is no longer escaped, so if you're embedding JSON directly in HTML
  you'll want to use .replace("/", "\\/") to prevent a close-tag attack.

Version 1.7 released 2007-03-18

* Improves encoding performance with an optional C extension to speed up
  str/unicode encoding (by 10-150x or so), which yields an overall speed
  boost of 2x+ (JSON is string-heavy).
* Support for encoding unicode code points outside the BMP to UTF-16
  surrogate code pairs (specified by the Strings section of RFC 4627).

Version 1.6 released 2007-03-03

* Improved str support for encoding. Previous versions of simplejson
  integrated strings directly into the output stream, this version ensures
  they're of a particular encoding (default is UTF-8) so that the output
  stream is valid.

Version 1.5 released 2007-01-18

* Better Python 2.5 compatibility
* Better Windows compatibility
* indent encoding parameter for pretty printing
* separators encoding parameter for generating optimally compact JSON

Version 1.3 released 2006-04-01

* The optional object_hook function is called upon decoding of any JSON
  object literal, and its return value is used instead of the dict that
  would normally be used. This can be used to efficiently implement
  features such as JSON-RPC class hinting, or other custom decodings of
  JSON. See the documentation for more information.

Version 1.1 released 2005-12-31

* Renamed from simple_json to simplejson to comply with PEP 8 module naming
  guidelines
* Full set of documentation
* More tests
* The encoder and decoder have been extended to understand NaN, Infinity, and
  -Infinity (but this can be turned off via allow_nan=False for strict JSON
  compliance)
* The decoder's scanner has been fixed so that it no longer accepts invalid
  JSON documents
* The decoder now reports line and column information as well as character
  numbers for easier debugging
* The encoder now has a circular reference checker, which can be optionally
  disabled with check_circular=False
* dump, dumps, load, loads now accept an optional cls kwarg to use an
  alternate JSONEncoder or JSONDecoder class for convenience.
* The read/write compatibility shim for json-py now have deprecation warnings

Version 1.0 released 2005-12-25

 * Initial release
PK�(�\�/�(__"doc/alt-python37-unshare/README.mdnu�[���# unshare

[![PyPI](https://img.shields.io/pypi/v/unshare.svg?color=green&logo=unshare&style=plastic)](https://pypi.org/project/unshare/)


```bash
pip3 install unshare
```

<hr>

Python extension for C's unshare call. <br>
See [man 2 unshare](http://man7.org/linux/man-pages/man2/unshare.2.html).


**Note**: This is targeted for only Linux based platforms.


# Usage

`unshare(flags)` where supported flags are `CLONE_NEWNS`, `CLONE_NEWUTS`, `CLONE_NEWPID`, `CLONE_NEWUSER`, `CLONE_NEWIPC`, `CLONE_NEWNET`, `CLONE_THREAD`. <br>
Multiple flags can be used using the bitwise or operator.

# Example usage

```python3
import unshare
unshare.unshare(unshare.CLONE_NEWUTS)
```

The following screenshot is taken from a sample script which uses the unshare library.

![](https://i.imgur.com/B8X0LT8.png)


# License

This project is licensed under [GPLv3](./LICENSE).PK�(�\�y��|�|$doc/alt-python37-pyrsistent/PKG-INFOnu�[���Metadata-Version: 1.1
Name: pyrsistent
Version: 0.14.11
Summary: Persistent/Functional/Immutable data structures
Home-page: http://github.com/tobgu/pyrsistent/
Author: Tobias Gustafsson
Author-email: tobias.l.gustafsson@gmail.com
License: MIT
Description: Pyrsistent
        ==========
        .. image:: https://travis-ci.org/tobgu/pyrsistent.png?branch=master
            :target: https://travis-ci.org/tobgu/pyrsistent
        
        .. image:: https://badge.fury.io/py/pyrsistent.svg
            :target: https://badge.fury.io/py/pyrsistent
        
        .. image:: https://coveralls.io/repos/tobgu/pyrsistent/badge.svg?branch=master&service=github
            :target: https://coveralls.io/github/tobgu/pyrsistent?branch=master
        
        
        .. _Pyrthon: https://www.github.com/tobgu/pyrthon/
        
        Pyrsistent is a number of persistent collections (by some referred to as functional data structures). Persistent in 
        the sense that they are immutable.
        
        All methods on a data structure that would normally mutate it instead return a new copy of the structure containing the
        requested updates. The original structure is left untouched.
        
        This will simplify the reasoning about what a program does since no hidden side effects ever can take place to these
        data structures. You can rest assured that the object you hold a reference to will remain the same throughout its
        lifetime and need not worry that somewhere five stack levels below you in the darkest corner of your application
        someone has decided to remove that element that you expected to be there.
        
        Pyrsistent is influenced by persistent data structures such as those found in the standard library of Clojure. The
        data structures are designed to share common elements through path copying.
        It aims at taking these concepts and make them as pythonic as possible so that they can be easily integrated into any python
        program without hassle.
        
        If you want to go all in on persistent data structures and use literal syntax to define them in your code rather
        than function calls check out Pyrthon_.
        
        Examples
        --------
        .. _Sequence: collections_
        .. _Hashable: collections_
        .. _Mapping: collections_
        .. _Mappings: collections_
        .. _Set: collections_
        .. _collections: https://docs.python.org/3/library/collections.abc.html
        .. _documentation: http://pyrsistent.readthedocs.org/
        
        The collection types and key features currently implemented are:
        
        * PVector_, similar to a python list
        * PMap_, similar to dict
        * PSet_, similar to set
        * PRecord_, a PMap on steroids with fixed fields, optional type and invariant checking and much more
        * PClass_, a Python class fixed fields, optional type and invariant checking and much more
        * `Checked collections`_, PVector, PMap and PSet with optional type and invariance checks and more
        * PBag, similar to collections.Counter
        * PList, a classic singly linked list
        * PDeque, similar to collections.deque
        * Immutable object type (immutable) built on the named tuple
        * freeze_ and thaw_ functions to convert between pythons standard collections and pyrsistent collections.
        * Flexible transformations_ of arbitrarily complex structures built from PMaps and PVectors.
        
        Below are examples of common usage patterns for some of the structures and features. More information and
        full documentation for all data structures is available in the documentation_.
        
        .. _PVector:
        
        PVector
        ~~~~~~~
        With full support for the Sequence_ protocol PVector is meant as a drop in replacement to the built in list from a readers
        point of view. Write operations of course differ since no in place mutation is done but naming should be in line
        with corresponding operations on the built in list.
        
        Support for the Hashable_ protocol also means that it can be used as key in Mappings_.
        
        Appends are amortized O(1). Random access and insert is log32(n) where n is the size of the vector.
        
        .. code:: python
        
            >>> from pyrsistent import v, pvector
        
            # No mutation of vectors once created, instead they
            # are "evolved" leaving the original untouched
            >>> v1 = v(1, 2, 3)
            >>> v2 = v1.append(4)
            >>> v3 = v2.set(1, 5)
            >>> v1
            pvector([1, 2, 3])
            >>> v2
            pvector([1, 2, 3, 4])
            >>> v3
            pvector([1, 5, 3, 4])
        
            # Random access and slicing
            >>> v3[1]
            5
            >>> v3[1:3]
            pvector([5, 3])
        
            # Iteration
            >>> list(x + 1 for x in v3)
            [2, 6, 4, 5]
            >>> pvector(2 * x for x in range(3))
            pvector([0, 2, 4])
        
        .. _PMap:
        
        PMap
        ~~~~
        With full support for the Mapping_ protocol PMap is meant as a drop in replacement to the built in dict from a readers point
        of view. Support for the Hashable_ protocol also means that it can be used as key in other Mappings_.
        
        Random access and insert is log32(n) where n is the size of the map.
        
        .. code:: python
        
            >>> from pyrsistent import m, pmap, v
        
            # No mutation of maps once created, instead they are
            # "evolved" leaving the original untouched
            >>> m1 = m(a=1, b=2)
            >>> m2 = m1.set('c', 3)
            >>> m3 = m2.set('a', 5)
            >>> m1
            pmap({'a': 1, 'b': 2})
            >>> m2
            pmap({'a': 1, 'c': 3, 'b': 2})
            >>> m3
            pmap({'a': 5, 'c': 3, 'b': 2})
            >>> m3['a']
            5
        
            # Evolution of nested persistent structures
            >>> m4 = m(a=5, b=6, c=v(1, 2))
            >>> m4.transform(('c', 1), 17)
            pmap({'a': 5, 'c': pvector([1, 17]), 'b': 6})
            >>> m5 = m(a=1, b=2)
        
            # Evolve by merging with other mappings
            >>> m5.update(m(a=2, c=3), {'a': 17, 'd': 35})
            pmap({'a': 17, 'c': 3, 'b': 2, 'd': 35})
            >>> pmap({'x': 1, 'y': 2}) + pmap({'y': 3, 'z': 4})
            pmap({'y': 3, 'x': 1, 'z': 4})
        
            # Dict-like methods to convert to list and iterate
            >>> m3.items()
            pvector([('a', 5), ('c', 3), ('b', 2)])
            >>> list(m3)
            ['a', 'c', 'b']
        
        .. _PSet:
        
        PSet
        ~~~~
        With full support for the Set_ protocol PSet is meant as a drop in replacement to the built in set from a readers point
        of view. Support for the Hashable_ protocol also means that it can be used as key in Mappings_.
        
        Random access and insert is log32(n) where n is the size of the set.
        
        .. code:: python
        
            >>> from pyrsistent import s
        
            # No mutation of sets once created, you know the story...
            >>> s1 = s(1, 2, 3, 2)
            >>> s2 = s1.add(4)
            >>> s3 = s1.remove(1)
            >>> s1
            pset([1, 2, 3])
            >>> s2
            pset([1, 2, 3, 4])
            >>> s3
            pset([2, 3])
        
            # Full support for set operations
            >>> s1 | s(3, 4, 5)
            pset([1, 2, 3, 4, 5])
            >>> s1 & s(3, 4, 5)
            pset([3])
            >>> s1 < s2
            True
            >>> s1 < s(3, 4, 5)
            False
        
        .. _PRecord:
        
        PRecord
        ~~~~~~~
        A PRecord is a PMap with a fixed set of specified fields. Records are declared as python classes inheriting
        from PRecord. Because it is a PMap it has full support for all Mapping methods such as iteration and element
        access using subscript notation.
        
        .. code:: python
        
            >>> from pyrsistent import PRecord, field
            >>> class ARecord(PRecord):
            ...     x = field()
            ...
            >>> r = ARecord(x=3)
            >>> r
            ARecord(x=3)
            >>> r.x
            3
            >>> r.set(x=2)
            ARecord(x=2)
            >>> r.set(y=2)
            Traceback (most recent call last):
            AttributeError: 'y' is not among the specified fields for ARecord
        
        Type information
        ****************
        It is possible to add type information to the record to enforce type checks. Multiple allowed types can be specified
        by providing an iterable of types.
        
        .. code:: python
        
            >>> class BRecord(PRecord):
            ...     x = field(type=int)
            ...     y = field(type=(int, type(None)))
            ...
            >>> BRecord(x=3, y=None)
            BRecord(y=None, x=3)
            >>> BRecord(x=3.0)
            Traceback (most recent call last):
            PTypeError: Invalid type for field BRecord.x, was float
        
        
        Custom types (classes) that are iterable should be wrapped in a tuple to prevent their
        members being added to the set of valid types.  Although Enums in particular are now 
        supported without wrapping, see #83 for more information.
        
        Mandatory fields
        ****************
        Fields are not mandatory by default but can be specified as such. If fields are missing an
        *InvariantException* will be thrown which contains information about the missing fields.
        
        .. code:: python
        
            >>> from pyrsistent import InvariantException
            >>> class CRecord(PRecord):
            ...     x = field(mandatory=True)
            ...
            >>> r = CRecord(x=3)
            >>> try:
            ...    r.discard('x')
            ... except InvariantException as e:
            ...    print(e.missing_fields)
            ...
            ('CRecord.x',)
        
        Invariants
        **********
        It is possible to add invariants that must hold when evolving the record. Invariants can be
        specified on both field and record level. If invariants fail an *InvariantException* will be
        thrown which contains information about the failing invariants. An invariant function should
        return a tuple consisting of a boolean that tells if the invariant holds or not and an object
        describing the invariant. This object can later be used to identify which invariant that failed.
        
        The global invariant function is only executed if all field invariants hold.
        
        Global invariants are inherited to subclasses.
        
        .. code:: python
        
            >>> class RestrictedVector(PRecord):
            ...     __invariant__ = lambda r: (r.y >= r.x, 'x larger than y')
            ...     x = field(invariant=lambda x: (x > 0, 'x negative'))
            ...     y = field(invariant=lambda y: (y > 0, 'y negative'))
            ...
            >>> r = RestrictedVector(y=3, x=2)
            >>> try:
            ...    r.set(x=-1, y=-2)
            ... except InvariantException as e:
            ...    print(e.invariant_errors)
            ...
            ('y negative', 'x negative')
            >>> try:
            ...    r.set(x=2, y=1)
            ... except InvariantException as e:
            ...    print(e.invariant_errors)
            ...
            ('x larger than y',)
        
        Invariants may also contain multiple assertions. For those cases the invariant function should
        return a tuple of invariant tuples as described above. This structure is reflected in the
        invariant_errors attribute of the exception which will contain tuples with data from all failed
        invariants. Eg:
        
        .. code:: python
        
            >>> class EvenX(PRecord):
            ...     x = field(invariant=lambda x: ((x > 0, 'x negative'), (x % 2 == 0, 'x odd')))
            ...
            >>> try:
            ...    EvenX(x=-1)
            ... except InvariantException as e:
            ...    print(e.invariant_errors)
            ...
            (('x negative', 'x odd'),)
        
        
        Factories
        *********
        It's possible to specify factory functions for fields. The factory function receives whatever
        is supplied as field value and the actual returned by the factory is assigned to the field
        given that any type and invariant checks hold.
        PRecords have a default factory specified as a static function on the class, create(). It takes
        a *Mapping* as argument and returns an instance of the specific record.
        If a record has fields of type PRecord the create() method of that record will
        be called to create the "sub record" if no factory has explicitly been specified to override
        this behaviour.
        
        .. code:: python
        
            >>> class DRecord(PRecord):
            ...     x = field(factory=int)
            ...
            >>> class ERecord(PRecord):
            ...     d = field(type=DRecord)
            ...
            >>> ERecord.create({'d': {'x': '1'}})
            ERecord(d=DRecord(x=1))
        
        Collection fields
        *****************
        It is also possible to have fields with ``pyrsistent`` collections.
        
        .. code:: python
        
           >>> from pyrsistent import pset_field, pmap_field, pvector_field
           >>> class MultiRecord(PRecord):
           ...     set_of_ints = pset_field(int)
           ...     map_int_to_str = pmap_field(int, str)
           ...     vector_of_strs = pvector_field(str)
           ...
        	
        Serialization
        *************
        PRecords support serialization back to dicts. Default serialization will take keys and values
        "as is" and output them into a dict. It is possible to specify custom serialization functions
        to take care of fields that require special treatment.
        
        .. code:: python
        
            >>> from datetime import date
            >>> class Person(PRecord):
            ...     name = field(type=unicode)
            ...     birth_date = field(type=date,
            ...                        serializer=lambda format, d: d.strftime(format['date']))
            ...
            >>> john = Person(name=u'John', birth_date=date(1985, 10, 21))
            >>> john.serialize({'date': '%Y-%m-%d'})
            {'birth_date': '1985-10-21', 'name': u'John'}
        
        
        .. _instar: https://github.com/boxed/instar/
        
        .. _PClass:
        
        PClass
        ~~~~~~
        A PClass is a python class with a fixed set of specified fields. PClasses are declared as python classes inheriting
        from PClass. It is defined the same way that PRecords are and behaves like a PRecord in all aspects except that it
        is not a PMap and hence not a collection but rather a plain Python object.
        
        .. code:: python
        
            >>> from pyrsistent import PClass, field
            >>> class AClass(PClass):
            ...     x = field()
            ...
            >>> a = AClass(x=3)
            >>> a
            AClass(x=3)
            >>> a.x
            3
        
        
        Checked collections
        ~~~~~~~~~~~~~~~~~~~
        Checked collections currently come in three flavors: CheckedPVector, CheckedPMap and CheckedPSet.
        
        .. code:: python
        
            >>> from pyrsistent import CheckedPVector, CheckedPMap, CheckedPSet, thaw
            >>> class Positives(CheckedPSet):
            ...     __type__ = (long, int)
            ...     __invariant__ = lambda n: (n >= 0, 'Negative')
            ...
            >>> class Lottery(PRecord):
            ...     name = field(type=str)
            ...     numbers = field(type=Positives, invariant=lambda p: (len(p) > 0, 'No numbers'))
            ...
            >>> class Lotteries(CheckedPVector):
            ...     __type__ = Lottery
            ...
            >>> class LotteriesByDate(CheckedPMap):
            ...     __key_type__ = date
            ...     __value_type__ = Lotteries
            ...
            >>> lotteries = LotteriesByDate.create({date(2015, 2, 15): [{'name': 'SuperLotto', 'numbers': {1, 2, 3}},
            ...                                                         {'name': 'MegaLotto',  'numbers': {4, 5, 6}}],
            ...                                     date(2015, 2, 16): [{'name': 'SuperLotto', 'numbers': {3, 2, 1}},
            ...                                                         {'name': 'MegaLotto',  'numbers': {6, 5, 4}}]})
            >>> lotteries
            LotteriesByDate({datetime.date(2015, 2, 15): Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')]), datetime.date(2015, 2, 16): Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')])})
        
            # The checked versions support all operations that the corresponding
            # unchecked types do
            >>> lottery_0215 = lotteries[date(2015, 2, 15)]
            >>> lottery_0215.transform([0, 'name'], 'SuperDuperLotto')
            Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperDuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')])
        
            # But also makes asserts that types and invariants hold
            >>> lottery_0215.transform([0, 'name'], 999)
            Traceback (most recent call last):
            PTypeError: Invalid type for field Lottery.name, was int
        
            >>> lottery_0215.transform([0, 'numbers'], set())
            Traceback (most recent call last):
            InvariantException: Field invariant failed
        
            # They can be converted back to python built ins with either thaw()
            # or serialize() (which provides possibilities to customize serialization)
            >>> thaw(lottery_0215)
            [{'numbers': set([1, 2, 3]), 'name': 'SuperLotto'}, {'numbers': set([4, 5, 6]), 'name': 'MegaLotto'}]
            >>> lottery_0215.serialize()
            [{'numbers': set([1, 2, 3]), 'name': 'SuperLotto'}, {'numbers': set([4, 5, 6]), 'name': 'MegaLotto'}]
        
        .. _transformations:
        
        Transformations
        ~~~~~~~~~~~~~~~
        Transformations are inspired by the cool library instar_ for Clojure. They let you evolve PMaps and PVectors
        with arbitrarily deep/complex nesting using simple syntax and flexible matching syntax.
        
        The first argument to transformation is the path that points out the value to transform. The
        second is the transformation to perform. If the transformation is callable it will be applied
        to the value(s) matching the path. The path may also contain callables. In that case they are
        treated as matchers. If the matcher returns True for a specific key it is considered for transformation.
        
        .. code:: python
        
            # Basic examples
            >>> from pyrsistent import inc, freeze, thaw, rex, ny, discard
            >>> v1 = freeze([1, 2, 3, 4, 5])
            >>> v1.transform([2], inc)
            pvector([1, 2, 4, 4, 5])
            >>> v1.transform([lambda ix: 0 < ix < 4], 8)
            pvector([1, 8, 8, 8, 5])
            >>> v1.transform([lambda ix, v: ix == 0 or v == 5], 0)
            pvector([0, 2, 3, 4, 0])
        
            # The (a)ny matcher can be used to match anything
            >>> v1.transform([ny], 8)
            pvector([8, 8, 8, 8, 8])
        
            # Regular expressions can be used for matching
            >>> scores = freeze({'John': 12, 'Joseph': 34, 'Sara': 23})
            >>> scores.transform([rex('^Jo')], 0)
            pmap({'Joseph': 0, 'Sara': 23, 'John': 0})
        
            # Transformations can be done on arbitrarily deep structures
            >>> news_paper = freeze({'articles': [{'author': 'Sara', 'content': 'A short article'},
            ...                                   {'author': 'Steve', 'content': 'A slightly longer article'}],
            ...                      'weather': {'temperature': '11C', 'wind': '5m/s'}})
            >>> short_news = news_paper.transform(['articles', ny, 'content'], lambda c: c[:25] + '...' if len(c) > 25 else c)
            >>> very_short_news = news_paper.transform(['articles', ny, 'content'], lambda c: c[:15] + '...' if len(c) > 15 else c)
            >>> very_short_news.articles[0].content
            'A short article'
            >>> very_short_news.articles[1].content
            'A slightly long...'
        
            # When nothing has been transformed the original data structure is kept
            >>> short_news is news_paper
            True
            >>> very_short_news is news_paper
            False
            >>> very_short_news.articles[0] is news_paper.articles[0]
            True
        
            # There is a special transformation that can be used to discard elements. Also
            # multiple transformations can be applied in one call
            >>> thaw(news_paper.transform(['weather'], discard, ['articles', ny, 'content'], discard))
            {'articles': [{'author': 'Sara'}, {'author': 'Steve'}]}
        
        Evolvers
        ~~~~~~~~
        PVector, PMap and PSet all have support for a concept dubbed *evolvers*. An evolver acts like a mutable
        view of the underlying persistent data structure with "transaction like" semantics. No updates of the original
        data structure is ever performed, it is still fully immutable.
        
        The evolvers have a very limited API by design to discourage excessive, and inappropriate, usage as that would
        take us down the mutable road. In principle only basic mutation and element access functions are supported.
        Check out the documentation_ of each data structure for specific examples.
        
        Examples of when you may want to use an evolver instead of working directly with the data structure include:
        
        * Multiple updates are done to the same data structure and the intermediate results are of no
          interest. In this case using an evolver may be a more efficient and easier to work with.
        * You need to pass a vector into a legacy function or a function that you have no control
          over which performs in place mutations. In this case pass an evolver instance
          instead and then create a new pvector from the evolver once the function returns.
        
        .. code:: python
        
            >>> from pyrsistent import v
        
            # In place mutation as when working with the built in counterpart
            >>> v1 = v(1, 2, 3)
            >>> e = v1.evolver()
            >>> e[1] = 22
            >>> e = e.append(4)
            >>> e = e.extend([5, 6])
            >>> e[5] += 1
            >>> len(e)
            6
        
            # The evolver is considered *dirty* when it contains changes compared to the underlying vector
            >>> e.is_dirty()
            True
        
            # But the underlying pvector still remains untouched
            >>> v1
            pvector([1, 2, 3])
        
            # Once satisfied with the updates you can produce a new pvector containing the updates.
            # The new pvector will share data with the original pvector in the same way that would have
            # been done if only using operations on the pvector.
            >>> v2 = e.persistent()
            >>> v2
            pvector([1, 22, 3, 4, 5, 7])
        
            # The evolver is now no longer considered *dirty* as it contains no differences compared to the
            # pvector just produced.
            >>> e.is_dirty()
            False
        
            # You may continue to work with the same evolver without affecting the content of v2
            >>> e[0] = 11
        
            # Or create a new evolver from v2. The two evolvers can be updated independently but will both
            # share data with v2 where possible.
            >>> e2 = v2.evolver()
            >>> e2[0] = 1111
            >>> e.persistent()
            pvector([11, 22, 3, 4, 5, 7])
            >>> e2.persistent()
            pvector([1111, 22, 3, 4, 5, 7])
        
        .. _freeze:
        .. _thaw:
        
        freeze and thaw
        ~~~~~~~~~~~~~~~
        These functions are great when your cozy immutable world has to interact with the evil mutable world outside.
        
        .. code:: python
        
            >>> from pyrsistent import freeze, thaw, v, m
            >>> freeze([1, {'a': 3}])
            pvector([1, pmap({'a': 3})])
            >>> thaw(v(1, m(a=3)))
            [1, {'a': 3}]
        
        Compatibility
        -------------
        
        Pyrsistent is developed and tested on Python 2.6, 2.7, 3.4, 3.5, 3.6 and PyPy (Python 2 and 3 compatible). It will most
        likely work on all other versions >= 3.4 but no guarantees are given. :)
        
        Compatibility issues
        ~~~~~~~~~~~~~~~~~~~~
        
        .. _27: https://github.com/tobgu/pyrsistent/issues/27
        
        There is currently one known compatibility issue when comparing built in sets and frozensets to PSets as discussed in 27_.
        It affects python 2 versions < 2.7.8 and python 3 versions < 3.4.0 and is due to a bug described in
        http://bugs.python.org/issue8743.
        
        Comparisons will fail or be incorrect when using the set/frozenset as left hand side of the comparison. As a workaround
        you need to either upgrade Python to a more recent version, avoid comparing sets/frozensets with PSets or always make
        sure to convert both sides of the comparison to the same type before performing the comparison.
        
        Performance
        -----------
        
        Pyrsistent is developed with performance in mind. Still, while some operations are nearly on par with their built in, 
        mutable, counterparts in terms of speed, other operations are slower. In the cases where attempts at
        optimizations have been done, speed has generally been valued over space.
        
        Pyrsistent comes with two API compatible flavors of PVector (on which PMap and PSet are based), one pure Python 
        implementation and one implemented as a C extension. The latter generally being 2 - 20 times faster than the former.
        The C extension will be used automatically when possible.
        
        The pure python implementation is fully PyPy compatible. Running it under PyPy speeds operations up considerably if 
        the structures are used heavily (if JITed), for some cases the performance is almost on par with the built in counterparts.
        
        Type hints
        ----------
        
        PEP 561 style type hints for use with mypy and various editors are available for most types and functions in pyrsistent.
        
        Type classes for annotating your own code with pyrsistent types are also available under pyrsistent.typing.
        
        Installation
        ------------
        
        pip install pyrsistent
        
        Documentation
        -------------
        
        Available at http://pyrsistent.readthedocs.org/
        
        Brief presentation available at http://slides.com/tobiasgustafsson/immutability-and-python/
        
        Contributors
        ------------
        
        Tobias Gustafsson https://github.com/tobgu
        
        Christopher Armstrong https://github.com/radix
        
        Anders Hovmöller https://github.com/boxed
        
        Itamar Turner-Trauring https://github.com/itamarst
        
        Jonathan Lange https://github.com/jml
        
        Richard Futrell https://github.com/Futrell
        
        Jakob Hollenstein https://github.com/jkbjh
        
        David Honour https://github.com/foolswood
        
        David R. MacIver https://github.com/DRMacIver
        
        Marcus Ewert https://github.com/sarum90
        
        Jean-Paul Calderone https://github.com/exarkun
        
        Douglas Treadwell https://github.com/douglas-treadwell
        
        Travis Parker https://github.com/teepark
        
        Julian Berman https://github.com/Julian
        
        Dennis Tomas https://github.com/dtomas
        
        Neil Vyas https://github.com/neilvyas
        
        doozr https://github.com/doozr
        
        Kamil Galuszka https://github.com/galuszkak
        
        Tsuyoshi Hombashi https://github.com/thombashi
        
        nattofriends https://github.com/nattofriends
        
        agberk https://github.com/agberk
        
        Waleed Khan https://github.com/arxanas
        
        Jean-Louis Fuchs https://github.com/ganwell
        
        Carlos Corbacho https://github.com/ccorbacho
        
        Felix Yan https://github.com/felixonmars
        
        benrg https://github.com/benrg
        
        Contributing
        ------------
        
        Want to contribute? That's great! If you experience problems please log them on GitHub. If you want to contribute code,
        please fork the repository and submit a pull request.
        
        Run tests
        ~~~~~~~~~
        .. _tox: https://tox.readthedocs.io/en/latest/
        
        Tests can be executed using tox_.
        
        Install tox: ``pip install tox``
        
        Run test for Python 2.7: ``tox -epy27``
        
        Release
        ~~~~~~~
        * Update CHANGES.txt
        * Update README with any new contributors and potential info needed.
        * Update _pyrsistent_version.py
        * python setup.py sdist upload
        * Commit and tag with new version: git add -u . && git commit -m 'Prepare version vX.Y.Z' && git tag -a vX.Y.Z -m 'vX.Y.Z'
        * Push commit and tags: git push && git push --tags
        
        Project status
        --------------
        Pyrsistent can be considered stable and mature (who knows, there may even be a 1.0 some day :-)). The project is
        maintained, bugs fixed, PRs reviewed and merged and new releases made. I currently do not have time for development
        of new features or functionality which I don't have use for myself. I'm more than happy to take PRs for new
        functionality though!
        
        There are a bunch of issues marked with ``enhancement`` and ``help wanted`` that contain requests for new functionality
        that would be nice to include. The level of difficulty and extend of the issues varies, please reach out to me if you're
        interested in working on any of them.
        
        If you feel that you have a grand master plan for where you would like Pyrsistent to go and have the time to put into
        it please don't hesitate to discuss this with me and submit PRs for it. If all goes well I'd be more than happy to add
        additional maintainers to the project!
        
Platform: UNKNOWN
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: PyPy
PK�(�\�?��c�c"doc/alt-python37-pyrsistent/READMEnu�[���Pyrsistent
==========
.. image:: https://travis-ci.org/tobgu/pyrsistent.png?branch=master
    :target: https://travis-ci.org/tobgu/pyrsistent

.. image:: https://badge.fury.io/py/pyrsistent.svg
    :target: https://badge.fury.io/py/pyrsistent

.. image:: https://coveralls.io/repos/tobgu/pyrsistent/badge.svg?branch=master&service=github
    :target: https://coveralls.io/github/tobgu/pyrsistent?branch=master


.. _Pyrthon: https://www.github.com/tobgu/pyrthon/

Pyrsistent is a number of persistent collections (by some referred to as functional data structures). Persistent in 
the sense that they are immutable.

All methods on a data structure that would normally mutate it instead return a new copy of the structure containing the
requested updates. The original structure is left untouched.

This will simplify the reasoning about what a program does since no hidden side effects ever can take place to these
data structures. You can rest assured that the object you hold a reference to will remain the same throughout its
lifetime and need not worry that somewhere five stack levels below you in the darkest corner of your application
someone has decided to remove that element that you expected to be there.

Pyrsistent is influenced by persistent data structures such as those found in the standard library of Clojure. The
data structures are designed to share common elements through path copying.
It aims at taking these concepts and make them as pythonic as possible so that they can be easily integrated into any python
program without hassle.

If you want to go all in on persistent data structures and use literal syntax to define them in your code rather
than function calls check out Pyrthon_.

Examples
--------
.. _Sequence: collections_
.. _Hashable: collections_
.. _Mapping: collections_
.. _Mappings: collections_
.. _Set: collections_
.. _collections: https://docs.python.org/3/library/collections.abc.html
.. _documentation: http://pyrsistent.readthedocs.org/

The collection types and key features currently implemented are:

* PVector_, similar to a python list
* PMap_, similar to dict
* PSet_, similar to set
* PRecord_, a PMap on steroids with fixed fields, optional type and invariant checking and much more
* PClass_, a Python class fixed fields, optional type and invariant checking and much more
* `Checked collections`_, PVector, PMap and PSet with optional type and invariance checks and more
* PBag, similar to collections.Counter
* PList, a classic singly linked list
* PDeque, similar to collections.deque
* Immutable object type (immutable) built on the named tuple
* freeze_ and thaw_ functions to convert between pythons standard collections and pyrsistent collections.
* Flexible transformations_ of arbitrarily complex structures built from PMaps and PVectors.

Below are examples of common usage patterns for some of the structures and features. More information and
full documentation for all data structures is available in the documentation_.

.. _PVector:

PVector
~~~~~~~
With full support for the Sequence_ protocol PVector is meant as a drop in replacement to the built in list from a readers
point of view. Write operations of course differ since no in place mutation is done but naming should be in line
with corresponding operations on the built in list.

Support for the Hashable_ protocol also means that it can be used as key in Mappings_.

Appends are amortized O(1). Random access and insert is log32(n) where n is the size of the vector.

.. code:: python

    >>> from pyrsistent import v, pvector

    # No mutation of vectors once created, instead they
    # are "evolved" leaving the original untouched
    >>> v1 = v(1, 2, 3)
    >>> v2 = v1.append(4)
    >>> v3 = v2.set(1, 5)
    >>> v1
    pvector([1, 2, 3])
    >>> v2
    pvector([1, 2, 3, 4])
    >>> v3
    pvector([1, 5, 3, 4])

    # Random access and slicing
    >>> v3[1]
    5
    >>> v3[1:3]
    pvector([5, 3])

    # Iteration
    >>> list(x + 1 for x in v3)
    [2, 6, 4, 5]
    >>> pvector(2 * x for x in range(3))
    pvector([0, 2, 4])

.. _PMap:

PMap
~~~~
With full support for the Mapping_ protocol PMap is meant as a drop in replacement to the built in dict from a readers point
of view. Support for the Hashable_ protocol also means that it can be used as key in other Mappings_.

Random access and insert is log32(n) where n is the size of the map.

.. code:: python

    >>> from pyrsistent import m, pmap, v

    # No mutation of maps once created, instead they are
    # "evolved" leaving the original untouched
    >>> m1 = m(a=1, b=2)
    >>> m2 = m1.set('c', 3)
    >>> m3 = m2.set('a', 5)
    >>> m1
    pmap({'a': 1, 'b': 2})
    >>> m2
    pmap({'a': 1, 'c': 3, 'b': 2})
    >>> m3
    pmap({'a': 5, 'c': 3, 'b': 2})
    >>> m3['a']
    5

    # Evolution of nested persistent structures
    >>> m4 = m(a=5, b=6, c=v(1, 2))
    >>> m4.transform(('c', 1), 17)
    pmap({'a': 5, 'c': pvector([1, 17]), 'b': 6})
    >>> m5 = m(a=1, b=2)

    # Evolve by merging with other mappings
    >>> m5.update(m(a=2, c=3), {'a': 17, 'd': 35})
    pmap({'a': 17, 'c': 3, 'b': 2, 'd': 35})
    >>> pmap({'x': 1, 'y': 2}) + pmap({'y': 3, 'z': 4})
    pmap({'y': 3, 'x': 1, 'z': 4})

    # Dict-like methods to convert to list and iterate
    >>> m3.items()
    pvector([('a', 5), ('c', 3), ('b', 2)])
    >>> list(m3)
    ['a', 'c', 'b']

.. _PSet:

PSet
~~~~
With full support for the Set_ protocol PSet is meant as a drop in replacement to the built in set from a readers point
of view. Support for the Hashable_ protocol also means that it can be used as key in Mappings_.

Random access and insert is log32(n) where n is the size of the set.

.. code:: python

    >>> from pyrsistent import s

    # No mutation of sets once created, you know the story...
    >>> s1 = s(1, 2, 3, 2)
    >>> s2 = s1.add(4)
    >>> s3 = s1.remove(1)
    >>> s1
    pset([1, 2, 3])
    >>> s2
    pset([1, 2, 3, 4])
    >>> s3
    pset([2, 3])

    # Full support for set operations
    >>> s1 | s(3, 4, 5)
    pset([1, 2, 3, 4, 5])
    >>> s1 & s(3, 4, 5)
    pset([3])
    >>> s1 < s2
    True
    >>> s1 < s(3, 4, 5)
    False

.. _PRecord:

PRecord
~~~~~~~
A PRecord is a PMap with a fixed set of specified fields. Records are declared as python classes inheriting
from PRecord. Because it is a PMap it has full support for all Mapping methods such as iteration and element
access using subscript notation.

.. code:: python

    >>> from pyrsistent import PRecord, field
    >>> class ARecord(PRecord):
    ...     x = field()
    ...
    >>> r = ARecord(x=3)
    >>> r
    ARecord(x=3)
    >>> r.x
    3
    >>> r.set(x=2)
    ARecord(x=2)
    >>> r.set(y=2)
    Traceback (most recent call last):
    AttributeError: 'y' is not among the specified fields for ARecord

Type information
****************
It is possible to add type information to the record to enforce type checks. Multiple allowed types can be specified
by providing an iterable of types.

.. code:: python

    >>> class BRecord(PRecord):
    ...     x = field(type=int)
    ...     y = field(type=(int, type(None)))
    ...
    >>> BRecord(x=3, y=None)
    BRecord(y=None, x=3)
    >>> BRecord(x=3.0)
    Traceback (most recent call last):
    PTypeError: Invalid type for field BRecord.x, was float


Custom types (classes) that are iterable should be wrapped in a tuple to prevent their
members being added to the set of valid types.  Although Enums in particular are now 
supported without wrapping, see #83 for more information.

Mandatory fields
****************
Fields are not mandatory by default but can be specified as such. If fields are missing an
*InvariantException* will be thrown which contains information about the missing fields.

.. code:: python

    >>> from pyrsistent import InvariantException
    >>> class CRecord(PRecord):
    ...     x = field(mandatory=True)
    ...
    >>> r = CRecord(x=3)
    >>> try:
    ...    r.discard('x')
    ... except InvariantException as e:
    ...    print(e.missing_fields)
    ...
    ('CRecord.x',)

Invariants
**********
It is possible to add invariants that must hold when evolving the record. Invariants can be
specified on both field and record level. If invariants fail an *InvariantException* will be
thrown which contains information about the failing invariants. An invariant function should
return a tuple consisting of a boolean that tells if the invariant holds or not and an object
describing the invariant. This object can later be used to identify which invariant that failed.

The global invariant function is only executed if all field invariants hold.

Global invariants are inherited to subclasses.

.. code:: python

    >>> class RestrictedVector(PRecord):
    ...     __invariant__ = lambda r: (r.y >= r.x, 'x larger than y')
    ...     x = field(invariant=lambda x: (x > 0, 'x negative'))
    ...     y = field(invariant=lambda y: (y > 0, 'y negative'))
    ...
    >>> r = RestrictedVector(y=3, x=2)
    >>> try:
    ...    r.set(x=-1, y=-2)
    ... except InvariantException as e:
    ...    print(e.invariant_errors)
    ...
    ('y negative', 'x negative')
    >>> try:
    ...    r.set(x=2, y=1)
    ... except InvariantException as e:
    ...    print(e.invariant_errors)
    ...
    ('x larger than y',)

Invariants may also contain multiple assertions. For those cases the invariant function should
return a tuple of invariant tuples as described above. This structure is reflected in the
invariant_errors attribute of the exception which will contain tuples with data from all failed
invariants. Eg:

.. code:: python

    >>> class EvenX(PRecord):
    ...     x = field(invariant=lambda x: ((x > 0, 'x negative'), (x % 2 == 0, 'x odd')))
    ...
    >>> try:
    ...    EvenX(x=-1)
    ... except InvariantException as e:
    ...    print(e.invariant_errors)
    ...
    (('x negative', 'x odd'),)


Factories
*********
It's possible to specify factory functions for fields. The factory function receives whatever
is supplied as field value and the actual returned by the factory is assigned to the field
given that any type and invariant checks hold.
PRecords have a default factory specified as a static function on the class, create(). It takes
a *Mapping* as argument and returns an instance of the specific record.
If a record has fields of type PRecord the create() method of that record will
be called to create the "sub record" if no factory has explicitly been specified to override
this behaviour.

.. code:: python

    >>> class DRecord(PRecord):
    ...     x = field(factory=int)
    ...
    >>> class ERecord(PRecord):
    ...     d = field(type=DRecord)
    ...
    >>> ERecord.create({'d': {'x': '1'}})
    ERecord(d=DRecord(x=1))

Collection fields
*****************
It is also possible to have fields with ``pyrsistent`` collections.

.. code:: python

   >>> from pyrsistent import pset_field, pmap_field, pvector_field
   >>> class MultiRecord(PRecord):
   ...     set_of_ints = pset_field(int)
   ...     map_int_to_str = pmap_field(int, str)
   ...     vector_of_strs = pvector_field(str)
   ...
	
Serialization
*************
PRecords support serialization back to dicts. Default serialization will take keys and values
"as is" and output them into a dict. It is possible to specify custom serialization functions
to take care of fields that require special treatment.

.. code:: python

    >>> from datetime import date
    >>> class Person(PRecord):
    ...     name = field(type=unicode)
    ...     birth_date = field(type=date,
    ...                        serializer=lambda format, d: d.strftime(format['date']))
    ...
    >>> john = Person(name=u'John', birth_date=date(1985, 10, 21))
    >>> john.serialize({'date': '%Y-%m-%d'})
    {'birth_date': '1985-10-21', 'name': u'John'}


.. _instar: https://github.com/boxed/instar/

.. _PClass:

PClass
~~~~~~
A PClass is a python class with a fixed set of specified fields. PClasses are declared as python classes inheriting
from PClass. It is defined the same way that PRecords are and behaves like a PRecord in all aspects except that it
is not a PMap and hence not a collection but rather a plain Python object.

.. code:: python

    >>> from pyrsistent import PClass, field
    >>> class AClass(PClass):
    ...     x = field()
    ...
    >>> a = AClass(x=3)
    >>> a
    AClass(x=3)
    >>> a.x
    3


Checked collections
~~~~~~~~~~~~~~~~~~~
Checked collections currently come in three flavors: CheckedPVector, CheckedPMap and CheckedPSet.

.. code:: python

    >>> from pyrsistent import CheckedPVector, CheckedPMap, CheckedPSet, thaw
    >>> class Positives(CheckedPSet):
    ...     __type__ = (long, int)
    ...     __invariant__ = lambda n: (n >= 0, 'Negative')
    ...
    >>> class Lottery(PRecord):
    ...     name = field(type=str)
    ...     numbers = field(type=Positives, invariant=lambda p: (len(p) > 0, 'No numbers'))
    ...
    >>> class Lotteries(CheckedPVector):
    ...     __type__ = Lottery
    ...
    >>> class LotteriesByDate(CheckedPMap):
    ...     __key_type__ = date
    ...     __value_type__ = Lotteries
    ...
    >>> lotteries = LotteriesByDate.create({date(2015, 2, 15): [{'name': 'SuperLotto', 'numbers': {1, 2, 3}},
    ...                                                         {'name': 'MegaLotto',  'numbers': {4, 5, 6}}],
    ...                                     date(2015, 2, 16): [{'name': 'SuperLotto', 'numbers': {3, 2, 1}},
    ...                                                         {'name': 'MegaLotto',  'numbers': {6, 5, 4}}]})
    >>> lotteries
    LotteriesByDate({datetime.date(2015, 2, 15): Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')]), datetime.date(2015, 2, 16): Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')])})

    # The checked versions support all operations that the corresponding
    # unchecked types do
    >>> lottery_0215 = lotteries[date(2015, 2, 15)]
    >>> lottery_0215.transform([0, 'name'], 'SuperDuperLotto')
    Lotteries([Lottery(numbers=Positives([1, 2, 3]), name='SuperDuperLotto'), Lottery(numbers=Positives([4, 5, 6]), name='MegaLotto')])

    # But also makes asserts that types and invariants hold
    >>> lottery_0215.transform([0, 'name'], 999)
    Traceback (most recent call last):
    PTypeError: Invalid type for field Lottery.name, was int

    >>> lottery_0215.transform([0, 'numbers'], set())
    Traceback (most recent call last):
    InvariantException: Field invariant failed

    # They can be converted back to python built ins with either thaw()
    # or serialize() (which provides possibilities to customize serialization)
    >>> thaw(lottery_0215)
    [{'numbers': set([1, 2, 3]), 'name': 'SuperLotto'}, {'numbers': set([4, 5, 6]), 'name': 'MegaLotto'}]
    >>> lottery_0215.serialize()
    [{'numbers': set([1, 2, 3]), 'name': 'SuperLotto'}, {'numbers': set([4, 5, 6]), 'name': 'MegaLotto'}]

.. _transformations:

Transformations
~~~~~~~~~~~~~~~
Transformations are inspired by the cool library instar_ for Clojure. They let you evolve PMaps and PVectors
with arbitrarily deep/complex nesting using simple syntax and flexible matching syntax.

The first argument to transformation is the path that points out the value to transform. The
second is the transformation to perform. If the transformation is callable it will be applied
to the value(s) matching the path. The path may also contain callables. In that case they are
treated as matchers. If the matcher returns True for a specific key it is considered for transformation.

.. code:: python

    # Basic examples
    >>> from pyrsistent import inc, freeze, thaw, rex, ny, discard
    >>> v1 = freeze([1, 2, 3, 4, 5])
    >>> v1.transform([2], inc)
    pvector([1, 2, 4, 4, 5])
    >>> v1.transform([lambda ix: 0 < ix < 4], 8)
    pvector([1, 8, 8, 8, 5])
    >>> v1.transform([lambda ix, v: ix == 0 or v == 5], 0)
    pvector([0, 2, 3, 4, 0])

    # The (a)ny matcher can be used to match anything
    >>> v1.transform([ny], 8)
    pvector([8, 8, 8, 8, 8])

    # Regular expressions can be used for matching
    >>> scores = freeze({'John': 12, 'Joseph': 34, 'Sara': 23})
    >>> scores.transform([rex('^Jo')], 0)
    pmap({'Joseph': 0, 'Sara': 23, 'John': 0})

    # Transformations can be done on arbitrarily deep structures
    >>> news_paper = freeze({'articles': [{'author': 'Sara', 'content': 'A short article'},
    ...                                   {'author': 'Steve', 'content': 'A slightly longer article'}],
    ...                      'weather': {'temperature': '11C', 'wind': '5m/s'}})
    >>> short_news = news_paper.transform(['articles', ny, 'content'], lambda c: c[:25] + '...' if len(c) > 25 else c)
    >>> very_short_news = news_paper.transform(['articles', ny, 'content'], lambda c: c[:15] + '...' if len(c) > 15 else c)
    >>> very_short_news.articles[0].content
    'A short article'
    >>> very_short_news.articles[1].content
    'A slightly long...'

    # When nothing has been transformed the original data structure is kept
    >>> short_news is news_paper
    True
    >>> very_short_news is news_paper
    False
    >>> very_short_news.articles[0] is news_paper.articles[0]
    True

    # There is a special transformation that can be used to discard elements. Also
    # multiple transformations can be applied in one call
    >>> thaw(news_paper.transform(['weather'], discard, ['articles', ny, 'content'], discard))
    {'articles': [{'author': 'Sara'}, {'author': 'Steve'}]}

Evolvers
~~~~~~~~
PVector, PMap and PSet all have support for a concept dubbed *evolvers*. An evolver acts like a mutable
view of the underlying persistent data structure with "transaction like" semantics. No updates of the original
data structure is ever performed, it is still fully immutable.

The evolvers have a very limited API by design to discourage excessive, and inappropriate, usage as that would
take us down the mutable road. In principle only basic mutation and element access functions are supported.
Check out the documentation_ of each data structure for specific examples.

Examples of when you may want to use an evolver instead of working directly with the data structure include:

* Multiple updates are done to the same data structure and the intermediate results are of no
  interest. In this case using an evolver may be a more efficient and easier to work with.
* You need to pass a vector into a legacy function or a function that you have no control
  over which performs in place mutations. In this case pass an evolver instance
  instead and then create a new pvector from the evolver once the function returns.

.. code:: python

    >>> from pyrsistent import v

    # In place mutation as when working with the built in counterpart
    >>> v1 = v(1, 2, 3)
    >>> e = v1.evolver()
    >>> e[1] = 22
    >>> e = e.append(4)
    >>> e = e.extend([5, 6])
    >>> e[5] += 1
    >>> len(e)
    6

    # The evolver is considered *dirty* when it contains changes compared to the underlying vector
    >>> e.is_dirty()
    True

    # But the underlying pvector still remains untouched
    >>> v1
    pvector([1, 2, 3])

    # Once satisfied with the updates you can produce a new pvector containing the updates.
    # The new pvector will share data with the original pvector in the same way that would have
    # been done if only using operations on the pvector.
    >>> v2 = e.persistent()
    >>> v2
    pvector([1, 22, 3, 4, 5, 7])

    # The evolver is now no longer considered *dirty* as it contains no differences compared to the
    # pvector just produced.
    >>> e.is_dirty()
    False

    # You may continue to work with the same evolver without affecting the content of v2
    >>> e[0] = 11

    # Or create a new evolver from v2. The two evolvers can be updated independently but will both
    # share data with v2 where possible.
    >>> e2 = v2.evolver()
    >>> e2[0] = 1111
    >>> e.persistent()
    pvector([11, 22, 3, 4, 5, 7])
    >>> e2.persistent()
    pvector([1111, 22, 3, 4, 5, 7])

.. _freeze:
.. _thaw:

freeze and thaw
~~~~~~~~~~~~~~~
These functions are great when your cozy immutable world has to interact with the evil mutable world outside.

.. code:: python

    >>> from pyrsistent import freeze, thaw, v, m
    >>> freeze([1, {'a': 3}])
    pvector([1, pmap({'a': 3})])
    >>> thaw(v(1, m(a=3)))
    [1, {'a': 3}]

Compatibility
-------------

Pyrsistent is developed and tested on Python 2.6, 2.7, 3.4, 3.5, 3.6 and PyPy (Python 2 and 3 compatible). It will most
likely work on all other versions >= 3.4 but no guarantees are given. :)

Compatibility issues
~~~~~~~~~~~~~~~~~~~~

.. _27: https://github.com/tobgu/pyrsistent/issues/27

There is currently one known compatibility issue when comparing built in sets and frozensets to PSets as discussed in 27_.
It affects python 2 versions < 2.7.8 and python 3 versions < 3.4.0 and is due to a bug described in
http://bugs.python.org/issue8743.

Comparisons will fail or be incorrect when using the set/frozenset as left hand side of the comparison. As a workaround
you need to either upgrade Python to a more recent version, avoid comparing sets/frozensets with PSets or always make
sure to convert both sides of the comparison to the same type before performing the comparison.

Performance
-----------

Pyrsistent is developed with performance in mind. Still, while some operations are nearly on par with their built in, 
mutable, counterparts in terms of speed, other operations are slower. In the cases where attempts at
optimizations have been done, speed has generally been valued over space.

Pyrsistent comes with two API compatible flavors of PVector (on which PMap and PSet are based), one pure Python 
implementation and one implemented as a C extension. The latter generally being 2 - 20 times faster than the former.
The C extension will be used automatically when possible.

The pure python implementation is fully PyPy compatible. Running it under PyPy speeds operations up considerably if 
the structures are used heavily (if JITed), for some cases the performance is almost on par with the built in counterparts.

Type hints
----------

PEP 561 style type hints for use with mypy and various editors are available for most types and functions in pyrsistent.

Type classes for annotating your own code with pyrsistent types are also available under pyrsistent.typing.

Installation
------------

pip install pyrsistent

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

Available at http://pyrsistent.readthedocs.org/

Brief presentation available at http://slides.com/tobiasgustafsson/immutability-and-python/

Contributors
------------

Tobias Gustafsson https://github.com/tobgu

Christopher Armstrong https://github.com/radix

Anders Hovmöller https://github.com/boxed

Itamar Turner-Trauring https://github.com/itamarst

Jonathan Lange https://github.com/jml

Richard Futrell https://github.com/Futrell

Jakob Hollenstein https://github.com/jkbjh

David Honour https://github.com/foolswood

David R. MacIver https://github.com/DRMacIver

Marcus Ewert https://github.com/sarum90

Jean-Paul Calderone https://github.com/exarkun

Douglas Treadwell https://github.com/douglas-treadwell

Travis Parker https://github.com/teepark

Julian Berman https://github.com/Julian

Dennis Tomas https://github.com/dtomas

Neil Vyas https://github.com/neilvyas

doozr https://github.com/doozr

Kamil Galuszka https://github.com/galuszkak

Tsuyoshi Hombashi https://github.com/thombashi

nattofriends https://github.com/nattofriends

agberk https://github.com/agberk

Waleed Khan https://github.com/arxanas

Jean-Louis Fuchs https://github.com/ganwell

Carlos Corbacho https://github.com/ccorbacho

Felix Yan https://github.com/felixonmars

benrg https://github.com/benrg

Contributing
------------

Want to contribute? That's great! If you experience problems please log them on GitHub. If you want to contribute code,
please fork the repository and submit a pull request.

Run tests
~~~~~~~~~
.. _tox: https://tox.readthedocs.io/en/latest/

Tests can be executed using tox_.

Install tox: ``pip install tox``

Run test for Python 2.7: ``tox -epy27``

Release
~~~~~~~
* Update CHANGES.txt
* Update README with any new contributors and potential info needed.
* Update _pyrsistent_version.py
* python setup.py sdist upload
* Commit and tag with new version: git add -u . && git commit -m 'Prepare version vX.Y.Z' && git tag -a vX.Y.Z -m 'vX.Y.Z'
* Push commit and tags: git push && git push --tags

Project status
--------------
Pyrsistent can be considered stable and mature (who knows, there may even be a 1.0 some day :-)). The project is
maintained, bugs fixed, PRs reviewed and merged and new releases made. I currently do not have time for development
of new features or functionality which I don't have use for myself. I'm more than happy to take PRs for new
functionality though!

There are a bunch of issues marked with ``enhancement`` and ``help wanted`` that contain requests for new functionality
that would be nice to include. The level of difficulty and extend of the issues varies, please reach out to me if you're
interested in working on any of them.

If you feel that you have a grand master plan for where you would like Pyrsistent to go and have the time to put into
it please don't hesitate to discuss this with me and submit PRs for it. If all goes well I'd be more than happy to add
additional maintainers to the project!
PK�(�\�;Θ$$'doc/alt-python37-pyrsistent/LICENCE.mitnu�[���Copyright (c) 2019 Tobias Gustafsson

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.PK�(�\�*=�@5@5'doc/alt-python37-pyrsistent/CHANGES.txtnu�[���Revision history
----------------
0.14.11, 2019-02-21
 * Fix #152 Don't use __builtin_popcount, this hopefully fixes #147 Error in pvectorc.cp37-win_amd64.pyd file, as well.
   Thanks @benrg for this!
 * Fix #151 Fix compatibility for hypothesis 4. Thanks @felixonmars for this!

0.14.10, 2019-02-09
 * Fix #148, only require pytest-runner if running tests. Thanks @ccorbacho for this!

0.14.9, 2019-01-06
 * Fix #144, Compile pvectormodule.c on windows. Thanks @ganwell for this!

0.14.8, 2018-12-19
 * Fix #142, Improve type stubs. Thanks @arxanas for this!

0.14.7, 2018-11-20
 * Fix #102, add PEP 561 type annotation stubs for most pyrsistent types. Thanks @nattofriends for this!

0.14.6, 2018-11-17
 * Fix #135, Type classes for Python 3 type annotations of pyrsistent types. Thanks @nattofriends for this!
 * Fix #128, Allow PClass and PRecord to ignore input parameters to constructor that are not part of the spec
   instead of blowing up with a type error. Thanks @agberk for this!

0.14.5, 2018-10-14
 * Fix #137, deprecation warnings in Python 3.7. Thanks @thombashi for this!
 * Fix #129, building via setuptools and setup.py. Thanks @galuszkak for this!

0.14.4, 2018-07-08
 * Fix #133, minor Python 3.7 compatibility issue. Pyrsistent is now officially Python 3.7 compliant!

v0.14.3, 2018-06-11
 * Fix #123 regression where type names break sequence fields. Thanks @doozr for this!
 * Fix #124 using the class name to make AttributeError on __getattr__ more informative for PRecords.
   Thanks @neilvyas for this!
 * Fix #125 how fields handle type arguments. Thanks @neilvyas for this!

v0.14.2, 2017-12-06
 * Fix #121, regression in PClass.set() introduced in 0.14.1.

v0.14.1, 2017-11-27
 * Equality check performance improvements for pvectors and pmaps. Thanks @dtomas for this!
 * Avoid calling factories multiple times for fields that do not change, see PR #120 for for
   details. Thanks @teepark for this!

v0.14.0, 2017-10-08
 * Fix #117, pmap now accepts iterators as input to constructor. Thanks @Julian for this!
 * Drop support for Python 2.6. Nothing has been done in this release that will explicitly
   break pyrsistent for 2.6 but it will not be considered moving forward.  Dropping 2.6
   support is the reason for stepping the second decimal instead of the third.

v0.13.0, 2017-09-01
 * Fix #113, Skip field factories when loading pickled objects. There is a
   minor backwards incompatibilty in the behaviour because of this. Thanks
   @teepark for fi this!
 * Fix #116, negative indexing for pdeques. Thanks @Julian for this!

v0.12.3, 2017-06-04
 * Fix #83, make it possible to use Python 3 enums as field type without having to wrap it in
   a list or tuple. Thanks @douglas-treadwell for this!

v0.12.2, 2017-05-30
 * Fix #108, now possible to use the values in predicates to transform. Thanks @exarkus for this!
 * Fix #107, support multiple level of __invariant__ inheritance. Thanks @exarkus for this!

v0.12.1, 2017-02-26
 * Fix #97, initialize CheckedPVector from iterator-
 * Fix #97, cache hash value on PMap. Thanks @sarum90 for this!

v0.12.0, 2017-01-06
 * Fix #87, add function get_in() for access to elements in deeply nested structures.
 * Fix #91, add method update() to pset and pbag.
 * Fix #92, incorrect discard of elements in transform on pvector
 * This is a release candidate for 1.0 as I now consider pyrsistent fairly stable.

v0.11.13, 2016-04-03
 * Fix #84, pvector segfault in CPython 3 when repr of contained object raises Exception.
 * Update README to cover for issue described in #83.

v0.11.12, 2016-02-06
 * Minor modifications of tests to allow testing as requested in #79 and #80.
 * Also run CI tests under python 3.5

v0.11.11, 2016-01-31
 * #78, include tests in pypi dist.

v0.11.10, 2015-12-27, NOTE! This release contains a backwards incompatible change
                      despite only stepping the patch version number. See below.
 * Implement #74, attribute access on PClass evolver
 * Implement #75, lazily evaluated invariant messages by providing a
   callable with no arguments.
 * Initial values on fields can now be evaluated on object creation
   by providing a callable with no arguments.

   NOTE! If you previously had callables as initial values this change means that those
         will be called upon object creation which may not be what you want. As
         a temporary workaround a callable returning a callable can be used. This
         feature and the concept of initial values will likely change slightly in the future.
         See #77 and and #76 for more information.

v0.11.9, 2015-11-01
 * Added PVector.remove(), thanks @radix for initiating this!

v0.11.8, 2015-10-18
 * Fix #66, UnicodeDecodeError when doing pip install in environments with ascii encoding as default.
   Thanks @foolswood!
 * Implement support for multiple types in pmap_field(), pvector_field() and pset_field(). Thanks @itamarst!

v0.11.7, 2015-10-03
 * Fix #52, occasional SEGFAULTs due to misplaced call to PyObject_GC_Track. Thanks @jkbjh for this!
 * Fix #42, complete support for delete. Now also on the C-implementation of the PVectorEvolver.
   Thanks @itamarst for contributing a whole bunch of Hypothesis test cases covering the evolver operations!

v0.11.6, 2015-09-30
 * Add +, -, & and | operations to PBag. Thanks @Futrell for this!

v0.11.5, 2015-09-29
 * Fix bug introduced in 0.11.4 that prevented multi level inheritance from PClass.
 * Make PClassMeta public for friendlier subclassing

v0.11.4, 2015-09-28
 * Fix #59, make it possible to create weakrefs to all collection types.
   Thanks @itamarst for reporting it.
 * Fix #58, add __str__ to InvariantException. Thanks @tomprince for reporting it.

v0.11.3, 2015-09-15
  * Fix #57, support pickling of PClasses and PRecords using pmap_field, pvector_field, and pset_field.
    Thanks @radix for reporting this and submitting a fix for it!

v0.11.2, 2015-09-09
  * Fix bug causing potential element loss when reallocating PMap. Thanks to @jml for finding
    this and submitting a PR with a fix!
  * Removed python 3.2 test build from Travis. There is nothing breaking 3.2 compatibility in this
    release but there will be no effort moving forward to keep the 3.2 compatibility.

v0.11.1, 2015-08-24
  * Fix #51, PClass.set() broken when used with string+value argument.
  * #50, make it possible to specify more than one assertion in an invariant
  * #48, make it possible to make recursive type references by using a string
    as type specification.

v0.11.0, 2015-07-11
  * #42, delete() function added to PVector to allow deletion of elements by index
    and range. Will perform a full copy of the vector, no structural sharing.
    Thanks @radix for helping out with this one!
  * Fix #39, explicitly disallow ordering for PMap and PBag, Python 3 style
  * Fix #37, PMap.values()/keys()/items() now returns PVectors instead of lists

v0.10.3, 2015-06-13
  * Fix #40, make it possible to disable the C extension by setting the
    PYRSISTENT_NO_C_EXTENSION environment variable.

v0.10.2, 2015-06-07
  * Fix #38, construction from serialized object for pvector/pset/pmap fields.

v0.10.1, 2015-04-27
  * Fix broken README.rst

v10.0.0, 2015-04-27
  * New type PClass, a persistent version of a Python object. Related to issues #30 and #32.
    Thanks @exarkun and @radix for input on this one!
  * Rename PRecordTypeError -> PTypeError, it is now also raised by PClass
  * New convenience functions, pvector_field, pmap_field and pset_field to create PRecord/PClass
    fields for checked collections. Issues #26 and #36. Thanks to @itamarst for this!
  * Removed deprecated function set_in() on PMap and PVector.
  * Removed deprecated factory function pclass.
  * Major internal restructuring breaking pyrsistent.py into multiple files. This should
    not affect those only using the public interface but if you experience problems please
    let me know.

v0.9.4, 2015-04-20
  * Fix #34, PVector now compares against built in list type

v0.9.3, 2015-04-06
  * Rename pclass back to immutable and deprecate the usage of the pclass function. PClass will be used by
    a new, different type in upcoming releases.
  * Documentation strings for the exceptions introduced in 0.9.2.

v0.9.2, 2015-04-03
  * More informative type errors from checked types, issue #30
  * Support multiple optional types, issue #28

v0.9.1, 2015-02-25
  * Multi level serialization for checked types

v0.9.0, 2015-02-25, Lots of new stuff in this release!
  * Checked types, checked versions of PVector, PMap, PSet that support type and invariant specification.
    Currently lacking proper documentation but I'm working on it.
  * set_in() on PVector and PMap are now deprecated and will be removed in the next release.
    Use transform() instead. set_in() has been updated to use transform() for this release
    this means that some corner error cases behave slightly different than before.
  * Refactoring of the PVector to unify the type. Should not have any user impact as long as
    only the public interface of pyrsistent has been used. PVector is now an abstract base class
    with which the different implementations are registered.
  * Evolvers have been updated to return themselves for evolving operations to allow function chaining.
  * Richer exception messages for KeyErrors and IndexErrors specifying the key/index that caused the failure.
    Thanks @radix for this.
  * Missing attribute on PMaps when accessing with dot-notation now raises an AttributeError instead of a
    KeyError. Issue #21.
  * New function decorator @mutant that freezes all input arguments to a function and the return value.
  * Add __version__ to pyrsistent.py. Issue #23.
  * Fix pickling for pset. Issue #24.

v0.8.0, 2015-01-21
  * New type PRecord. Subtype of PMap that allows explicit, declarative field specification. Thanks @boxed
    for inspiration!
  * Efficient transformations of arbitrary complexity on PMap and PVector. Thanks @boxed for inspiration!
  * Breaking change to the evolver interface. What used to be .pvector(), .pmap() and .pset()
    on the different evolvers has now been unified so that all evolvers have one method .persistent()
    to produce the persistent counterpart. Sorry for any inconvenience.
  * Removed the tests directory from the package.
  * PMap and PSet now contains a copy-function to closer mimic the interface of the dict and set. These
    functions will simply return a reference to self.
  * Removed deprecated alias 'immutable' from pclass.

v0.7.1, 2015-01-17
  * Fixes #14 where a file executed (unexpectedly) during installation was not python 3 compatible.

v0.7.0, 2015-01-04, No 1.0, instead a bunch of new stuff and one API breaking change to PMap.remove().
  * Evolvers for pvector, pmap and pset to allow simple and efficient updates of multiple elements
    in the collection. See the documentation for a closer description.
  * New method mset on pvector to update multiple values in one operation
  * Remove deprecated methods merge and merge_with on PMap
  * Change behavior of PMap.remove, it will now raise a KeyError if the element is not present.
    New method PMap.discard will instead return the original pmap if the element is not present.
    This aligns the PMap with how things are done in the PSet and is closer to the behavior of the
    built in counterparts.

v0.6.3, 2014-11-27
  * Python 2.6 support, thanks @wrmsr!
  * PMap.merge/merge_with renamed to update/update_with. merge/merge_with remains but will be
    removed for 1.0.
  * This is a release candidate for 1.0! Please be aware that PMap.merge/merge_with and immutable()
    will be removed for 1.0.

v0.6.2, 2014-11-03
  * Fix typo causing the pure python vector to be used even if the C implementation was
    available. Thanks @zerc for finding it!

v0.6.1, 2014-10-31
  * Renamed 'immutable' to 'pclass' for consistency but left immutable for compatibility.

v0.6.0, 2014-10-25
  * New data structure, persistent linked list
  * New data structure, persistent double ended queue

v0.5.0, 2014-09-24
  * New data structure, persistent bag / multiset
  * New functions freeze and thaw to recursively convert between python
    built in data types and corresponding pyrsistent data types.
  * All data structures can now be pickled
  * New function merge_in on persistent map which allows a user
    supplied function to implement the merge strategy.

v0.4.0, 2014-09-20
  * Full Python 3 support.
  * Immutable object implemented.
  * Bug fixes in PVector.__repr__() and PMap.__hash__() and index check of PVector.
  * Repr changed to be fully cut and paste compatible
  * Changed assoc() -> set(), assoc_in() -> set_in(), massoc() -> mset().
    Sorry for the API breaking change but I think those names are more pythonic.
  * Improved documentation.

v0.3.1, 2014-06-29
  * assoc() on PSet renamed back to add()

v0.3.0, 2014-06-28
  * Full Sequence protocol support for PVector
  * Full Mapping protocol support for PMap
  * Full Set protocol support for PSet
  * assoc_in() support for both PMap and PVector
  * merge() support for PMap
  * Performance improvements to the PVector C extension speed up allocation

v0.2.1, 2014-06-21
  * Supply the tests with the distribution

v0.2.0, 2014-06-21
  * New C extension with an optimized version of the persistent vector
  * Updated API slightly

v0.1.0, 2013-11-10
  * Initial release.


TODO (in no particular order)
-----------------------------
- Versioned data structure where the different versions can be accessed by index?
- Ordered sets and maps
- A good performance measurement suite
PK�(�\�����$doc/alt-python37-markupsafe/PKG-INFOnu�[���Metadata-Version: 2.1
Name: MarkupSafe
Version: 2.0.1
Summary: Safely add untrusted strings to HTML/XML markup.
Home-page: https://palletsprojects.com/p/markupsafe/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
Maintainer: Pallets
Maintainer-email: contact@palletsprojects.com
License: BSD-3-Clause
Project-URL: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://markupsafe.palletsprojects.com/
Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/markupsafe/
Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/
Project-URL: Twitter, https://twitter.com/PalletsTeam
Project-URL: Chat, https://discord.gg/pallets
Description: MarkupSafe
        ==========
        
        MarkupSafe implements a text object that escapes characters so it is
        safe to use in HTML and XML. Characters that have special meanings are
        replaced so that they display as the actual characters. This mitigates
        injection attacks, meaning untrusted user input can safely be displayed
        on a page.
        
        
        Installing
        ----------
        
        Install and update using `pip`_:
        
        .. code-block:: text
        
            pip install -U MarkupSafe
        
        .. _pip: https://pip.pypa.io/en/stable/quickstart/
        
        
        Examples
        --------
        
        .. code-block:: pycon
        
            >>> from markupsafe import Markup, escape
        
            >>> # escape replaces special characters and wraps in Markup
            >>> escape("<script>alert(document.cookie);</script>")
            Markup('&lt;script&gt;alert(document.cookie);&lt;/script&gt;')
        
            >>> # wrap in Markup to mark text "safe" and prevent escaping
            >>> Markup("<strong>Hello</strong>")
            Markup('<strong>hello</strong>')
        
            >>> escape(Markup("<strong>Hello</strong>"))
            Markup('<strong>hello</strong>')
        
            >>> # Markup is a str subclass
            >>> # methods and operators escape their arguments
            >>> template = Markup("Hello <em>{name}</em>")
            >>> template.format(name='"World"')
            Markup('Hello <em>&#34;World&#34;</em>')
        
        
        Donate
        ------
        
        The Pallets organization develops and supports MarkupSafe and other
        popular packages. In order to grow the community of contributors and
        users, and allow the maintainers to devote more time to the projects,
        `please donate today`_.
        
        .. _please donate today: https://palletsprojects.com/donate
        
        
        Links
        -----
        
        -   Documentation: https://markupsafe.palletsprojects.com/
        -   Changes: https://markupsafe.palletsprojects.com/changes/
        -   PyPI Releases: https://pypi.org/project/MarkupSafe/
        -   Source Code: https://github.com/pallets/markupsafe/
        -   Issue Tracker: https://github.com/pallets/markupsafe/issues/
        -   Website: https://palletsprojects.com/p/markupsafe/
        -   Twitter: https://twitter.com/PalletsTeam
        -   Chat: https://discord.gg/pallets
        
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Text Processing :: Markup :: HTML
Requires-Python: >=3.6
Description-Content-Type: text/x-rst
PK�(�\[a���'doc/alt-python37-markupsafe/LICENSE.rstnu�[���Copyright 2010 Pallets

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

1.  Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

2.  Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

3.  Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK�(�\
��pXX'doc/alt-python37-markupsafe/CHANGES.rstnu�[���Version 2.0.1
-------------

Released 2021-05-18

-   Mark top-level names as exported so type checking understands
    imports in user projects. :pr:`215`
-   Fix some types that weren't available in Python 3.6.0. :pr:`215`


Version 2.0.0
-------------

Released 2021-05-11

-   Drop Python 2.7, 3.4, and 3.5 support.
-   ``Markup.unescape`` uses :func:`html.unescape` to support HTML5
    character references. :pr:`117`
-   Add type annotations for static typing tools. :pr:`149`


Version 1.1.1
-------------

Released 2019-02-23

-   Fix segfault when ``__html__`` method raises an exception when using
    the C speedups. The exception is now propagated correctly. :pr:`109`


Version 1.1.0
-------------

Released 2018-11-05

-   Drop support for Python 2.6 and 3.3.
-   Build wheels for Linux, Mac, and Windows, allowing systems without
    a compiler to take advantage of the C extension speedups. :pr:`104`
-   Use newer CPython API on Python 3, resulting in a 1.5x speedup.
    :pr`64`
-   ``escape`` wraps ``__html__`` result in ``Markup``, consistent with
    documented behavior. :pr:`69`


Version 1.0
-----------

Released 2017-03-07

-   Fixed custom types not invoking ``__unicode__`` when used with
    ``format()``.
-   Added ``__version__`` module attribute.
-   Improve unescape code to leave lone ampersands alone.


Version 0.18
------------

Released 2013-05-22

-   Fixed ``__mul__`` and string splitting on Python 3.


Version 0.17
------------

Released 2013-05-21

-   Fixed a bug with broken interpolation on tuples.


Version 0.16
------------

Released 2013-05-20

-   Improved Python 3 Support and removed 2to3.
-   Removed support for Python 3.2 and 2.5.


Version 0.15
------------

Released 2011-07-20

-   Fixed a typo that caused the library to fail to install on pypy and
    jython.


Version 0.14
------------

Released 2011-07-20

-   Release fix for 0.13.


Version 0.13
------------

Released 2011-07-20

-   Do not attempt to compile extension for PyPy or Jython.
-   Work around some 64bit Windows issues.


Version 0.12
------------

Released 2011-02-17

-   Improved PyPy compatibility.
PK�(�\�b"���&doc/alt-python37-markupsafe/README.rstnu�[���MarkupSafe
==========

MarkupSafe implements a text object that escapes characters so it is
safe to use in HTML and XML. Characters that have special meanings are
replaced so that they display as the actual characters. This mitigates
injection attacks, meaning untrusted user input can safely be displayed
on a page.


Installing
----------

Install and update using `pip`_:

.. code-block:: text

    pip install -U MarkupSafe

.. _pip: https://pip.pypa.io/en/stable/quickstart/


Examples
--------

.. code-block:: pycon

    >>> from markupsafe import Markup, escape

    >>> # escape replaces special characters and wraps in Markup
    >>> escape("<script>alert(document.cookie);</script>")
    Markup('&lt;script&gt;alert(document.cookie);&lt;/script&gt;')

    >>> # wrap in Markup to mark text "safe" and prevent escaping
    >>> Markup("<strong>Hello</strong>")
    Markup('<strong>hello</strong>')

    >>> escape(Markup("<strong>Hello</strong>"))
    Markup('<strong>hello</strong>')

    >>> # Markup is a str subclass
    >>> # methods and operators escape their arguments
    >>> template = Markup("Hello <em>{name}</em>")
    >>> template.format(name='"World"')
    Markup('Hello <em>&#34;World&#34;</em>')


Donate
------

The Pallets organization develops and supports MarkupSafe and other
popular packages. In order to grow the community of contributors and
users, and allow the maintainers to devote more time to the projects,
`please donate today`_.

.. _please donate today: https://palletsprojects.com/donate


Links
-----

-   Documentation: https://markupsafe.palletsprojects.com/
-   Changes: https://markupsafe.palletsprojects.com/changes/
-   PyPI Releases: https://pypi.org/project/MarkupSafe/
-   Source Code: https://github.com/pallets/markupsafe/
-   Issue Tracker: https://github.com/pallets/markupsafe/issues/
-   Website: https://palletsprojects.com/p/markupsafe/
-   Twitter: https://twitter.com/PalletsTeam
-   Chat: https://discord.gg/pallets
PK�(�\�m���#�#doc/alt-python37-six/CHANGESnu�[���Changelog for six
=================

This file lists the changes in each six version.

1.15.0
------

- Pull request #331: Optimize `six.ensure_str` and `six.ensure_binary`.

1.14.0
------

- Issue #288, pull request #289: Add `six.assertNotRegex`.

- Issue #317: `six.moves._dummy_thread` now points to the `_thread` module on
  Python 3.9+. Python 3.7 and later requires threading and deprecated the
  `_dummy_thread` module.

- Issue #308, pull request #314: Remove support for Python 2.6 and Python 3.2.

- Issue #250, issue #165, pull request #251: `six.wraps` now ignores missing
  attributes. This follows the Python 3.2+ standard library behavior.

1.13.0
------

- Issue #298, pull request #299: Add `six.moves.dbm_ndbm`.

- Issue #155: Add `six.moves.collections_abc`, which aliases the `collections`
  module on Python 2-3.2 and the `collections.abc` on Python 3.3 and greater.

- Pull request #304: Re-add distutils fallback in `setup.py`.

- Pull request #305: On Python 3.7, `with_metaclass` supports classes using PEP
  560 features.

1.12.0
------

- Issue #259, pull request #260: `six.add_metaclass` now preserves
  `__qualname__` from the original class.

- Pull request #204: Add `six.ensure_binary`, `six.ensure_text`, and
  `six.ensure_str`.

1.11.0
------

- Pull request #178: `with_metaclass` now properly proxies `__prepare__` to the
  underlying metaclass.

- Pull request #191: Allow `with_metaclass` to work with metaclasses implemented
  in C.

- Pull request #203: Add parse_http_list and parse_keqv_list to moved
  urllib.request.

- Pull request #172 and issue #171: Add unquote_to_bytes to moved urllib.parse.

- Pull request #167: Add `six.moves.getoutput`.

- Pull request #80: Add `six.moves.urllib_parse.splitvalue`.

- Pull request #75: Add `six.moves.email_mime_image`.

- Pull request #72: Avoid creating reference cycles through tracebacks in
  `reraise`.

1.10.0
------

- Issue #122: Improve the performance of `six.int2byte` on Python 3.

- Pull request #55 and issue #99: Don't add the `winreg` module to `six.moves`
  on non-Windows platforms.

- Pull request #60 and issue #108: Add `six.moves.getcwd` and
  `six.moves.getcwdu`.

- Pull request #64: Add `create_unbound_method` to create unbound methods.

1.9.0
-----

- Issue #106: Support the `flush` parameter to `six.print_`.

- Pull request #48 and issue #15: Add the `python_2_unicode_compatible`
  decorator.

- Pull request #57 and issue #50: Add several compatibility methods for unittest
  assertions that were renamed between Python 2 and 3.

- Issue #105 and pull request #58: Ensure `six.wraps` respects the *updated* and
  *assigned* arguments.

- Issue #102: Add `raise_from` to abstract out Python 3's raise from syntax.

- Issue #97: Optimize `six.iterbytes` on Python 2.

- Issue #98: Fix `six.moves` race condition in multi-threaded code.

- Pull request #51: Add `six.view(keys|values|itmes)`, which provide dictionary
  views on Python 2.7+.

- Issue #112: `six.moves.reload_module` now uses the importlib module on
  Python 3.4+.

1.8.0
-----

- Issue #90: Add `six.moves.shlex_quote`.

- Issue #59: Add `six.moves.intern`.

- Add `six.urllib.parse.uses_(fragment|netloc|params|query|relative)`.

- Issue #88: Fix add_metaclass when the class has `__slots__` containing
  `__weakref__` or `__dict__`.

- Issue #89: Make six use absolute imports.

- Issue #85: Always accept *updated* and *assigned* arguments for `wraps()`.

- Issue #86: In `reraise()`, instantiate the exception if the second argument is
  `None`.

- Pull request #45: Add `six.moves.email_mime_nonmultipart`.

- Issue #81: Add `six.urllib.request.splittag` mapping.

- Issue #80: Add `six.urllib.request.splituser` mapping.

1.7.3
-----

- Issue #77: Fix import six on Python 3.4 with a custom loader.

- Issue #74: `six.moves.xmlrpc_server` should map to `SimpleXMLRPCServer` on Python
  2 as documented not `xmlrpclib`.

1.7.2
-----

- Issue #72: Fix installing on Python 2.

1.7.1
-----

- Issue #71: Make the six.moves meta path importer handle reloading of the six
  module gracefully.

1.7.0
-----

- Pull request #30: Implement six.moves with a PEP 302 meta path hook.

- Pull request #32: Add six.wraps, which is like functools.wraps but always sets
  the __wrapped__ attribute.

- Pull request #35: Improve add_metaclass, so that it doesn't end up inserting
  another class into the hierarchy.

- Pull request #34: Add import mappings for dummy_thread.

- Pull request #33: Add import mappings for UserDict and UserList.

- Pull request #31: Select the implementations of dictionary iterator routines
  at import time for a 20% speed boost.

1.6.1
-----

- Raise an AttributeError for six.moves.X when X is a module not available in
  the current interpreter.

1.6.0
-----

- Raise an AttributeError for every attribute of unimportable modules.

- Issue #56: Make the fake modules six.moves puts into sys.modules appear not to
  have a __path__ unless they are loaded.

- Pull request #28: Add support for SplitResult.

- Issue #55: Add move mapping for xmlrpc.server.

- Pull request #29: Add move for urllib.parse.splitquery.

1.5.2
-----

- Issue #53: Make the fake modules six.moves puts into sys.modules appear not to
  have a __name__ unless they are loaded.

1.5.1
-----

- Issue #51: Hack around the Django autoreloader after recent six.moves changes.

1.5.0
-----

- Removed support for Python 2.4. This is because py.test no longer supports
  2.4.

- Fix various import problems including issues #19 and #41. six.moves modules
  are now lazy wrappers over the underlying modules instead of the actual
  modules themselves.

- Issue #49: Add six.moves mapping for tkinter.ttk.

- Pull request #24: Add __dir__ special method to six.moves modules.

- Issue #47: Fix add_metaclass on classes with a string for the __slots__
  variable.

- Issue #44: Fix interpretation of backslashes on Python 2 in the u() function.

- Pull request #21: Add import mapping for urllib's proxy_bypass function.

- Issue #43: Add import mapping for the Python 2 xmlrpclib module.

- Issue #39: Add import mapping for the Python 2 thread module.

- Issue #40: Add import mapping for the Python 2 gdbm module.

- Issue #35: On Python versions less than 2.7, print_ now encodes unicode
  strings when outputing to standard streams. (Python 2.7 handles this
  automatically.)

1.4.1
-----

- Issue #32: urllib module wrappings don't work when six is not a toplevel file.

1.4.0
-----

- Issue #31: Add six.moves mapping for UserString.

- Pull request #12: Add six.add_metaclass, a decorator for adding a metaclass to
  a class.

- Add six.moves.zip_longest and six.moves.filterfalse, which correspond
  respectively to itertools.izip_longest and itertools.ifilterfalse on Python 2
  and itertools.zip_longest and itertools.filterfalse on Python 3.

- Issue #25: Add the unichr function, which returns a string for a Unicode
  codepoint.

- Issue #26: Add byte2int function, which complements int2byte.

- Add a PY2 constant with obvious semantics.

- Add helpers for indexing and iterating over bytes: iterbytes and indexbytes.

- Add create_bound_method() wrapper.

- Issue #23: Allow multiple base classes to be passed to with_metaclass.

- Issue #24: Add six.moves.range alias. This exactly the same as the current
  xrange alias.

- Pull request #5: Create six.moves.urllib, which contains abstractions for a
  bunch of things which are in urllib in Python 3 and spread out across urllib,
  urllib2, and urlparse in Python 2.

1.3.0
-----

- Issue #21: Add methods to access the closure and globals of a function.

- In six.iter(items/keys/values/lists), passed keyword arguments through to the
  underlying method.

- Add six.iterlists().

- Issue #20: Fix tests if tkinter is not available.

- Issue #17: Define callable to be builtin callable when it is available again
  in Python 3.2+.

- Issue #16: Rename Python 2 exec_'s arguments, so casually calling exec_ with
  keyword arguments will raise.

- Issue #14: Put the six.moves package in sys.modules based on the name six is
  imported under.

- Fix Jython detection.

- Pull request #4: Add email_mime_multipart, email_mime_text, and
  email_mime_base to six.moves.

1.2.0
-----

- Issue #13: Make iterkeys/itervalues/iteritems return iterators on Python 3
  instead of iterables.

- Issue #11: Fix maxsize support on Jython.

- Add six.next() as an alias for six.advance_iterator().

- Use the builtin next() function for advance_iterator() where is available
  (2.6+), not just Python 3.

- Add the Iterator class for writing portable iterators.

1.1.0
-----

- Add the int2byte function.

- Add compatibility mappings for iterators over the keys, values, and items of a
  dictionary.

- Fix six.MAXSIZE on platforms where sizeof(long) != sizeof(Py_ssize_t).

- Issue #3: Add six.moves mappings for filter, map, and zip.

1.0.0
-----

- Issue #2: u() on Python 2.x now resolves unicode escapes.

- Expose an API for adding mappings to six.moves.

1.0 beta 1
----------

- Reworked six into one .py file.  This breaks imports.  Please tell me if you
  are interested in an import compatibility layer.
PK�(�\C�^&��doc/alt-python37-six/PKG-INFOnu�[���Metadata-Version: 1.2
Name: six
Version: 1.15.0
Summary: Python 2 and 3 compatibility utilities
Home-page: https://github.com/benjaminp/six
Author: Benjamin Peterson
Author-email: benjamin@python.org
License: MIT
Description: .. image:: https://img.shields.io/pypi/v/six.svg
           :target: https://pypi.org/project/six/
           :alt: six on PyPI
        
        .. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
           :target: https://travis-ci.org/benjaminp/six
           :alt: six on TravisCI
        
        .. image:: https://readthedocs.org/projects/six/badge/?version=latest
           :target: https://six.readthedocs.io/
           :alt: six's documentation on Read the Docs
        
        .. image:: https://img.shields.io/badge/license-MIT-green.svg
           :target: https://github.com/benjaminp/six/blob/master/LICENSE
           :alt: MIT License badge
        
        Six is a Python 2 and 3 compatibility library.  It provides utility functions
        for smoothing over the differences between the Python versions with the goal of
        writing Python code that is compatible on both Python versions.  See the
        documentation for more information on what is provided.
        
        Six supports Python 2.7 and 3.3+.  It is contained in only one Python
        file, so it can be easily copied into your project. (The copyright and license
        notice must be retained.)
        
        Online documentation is at https://six.readthedocs.io/.
        
        Bugs can be reported to https://github.com/benjaminp/six.  The code can also
        be found there.
        
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 3
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Utilities
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*
PK�(�\�^خ**doc/alt-python37-six/LICENSEnu�[���Copyright (c) 2010-2020 Benjamin Peterson

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PK�(�\�tٚ�doc/alt-python37-six/README.rstnu�[���.. image:: https://img.shields.io/pypi/v/six.svg
   :target: https://pypi.org/project/six/
   :alt: six on PyPI

.. image:: https://travis-ci.org/benjaminp/six.svg?branch=master
   :target: https://travis-ci.org/benjaminp/six
   :alt: six on TravisCI

.. image:: https://readthedocs.org/projects/six/badge/?version=latest
   :target: https://six.readthedocs.io/
   :alt: six's documentation on Read the Docs

.. image:: https://img.shields.io/badge/license-MIT-green.svg
   :target: https://github.com/benjaminp/six/blob/master/LICENSE
   :alt: MIT License badge

Six is a Python 2 and 3 compatibility library.  It provides utility functions
for smoothing over the differences between the Python versions with the goal of
writing Python code that is compatible on both Python versions.  See the
documentation for more information on what is provided.

Six supports Python 2.7 and 3.3+.  It is contained in only one Python
file, so it can be easily copied into your project. (The copyright and license
notice must be retained.)

Online documentation is at https://six.readthedocs.io/.

Bugs can be reported to https://github.com/benjaminp/six.  The code can also
be found there.
PK�(�\?rfYGG"doc/alt-python37-filelock/PKG-INFOnu�[���Metadata-Version: 2.1
Name: filelock
Version: 3.4.2
Summary: A platform independent file lock.
Home-page: https://github.com/tox-dev/py-filelock
Author: Benedikt Schmitt
Author-email: benedikt@benediktschmitt.de
License: Unlicense
Download-URL: https://github.com/tox-dev/py-filelock/archive/main.zip
Project-URL: Source, https://github.com/tox-dev/py-filelock
Project-URL: Tracker, https://github.com/tox-dev/py-filelock/issues
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: Public Domain
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Topic :: Internet
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: System
Requires-Python: >=3.7
Description-Content-Type: text/markdown
Provides-Extra: docs
Provides-Extra: testing
License-File: LICENSE

# py-filelock

[![PyPI](https://img.shields.io/pypi/v/filelock?style=flat-square)](https://pypi.org/project/filelock/)
[![Supported Python
versions](https://img.shields.io/pypi/pyversions/filelock.svg)](https://pypi.org/project/filelock/)
[![Documentation
status](https://readthedocs.org/projects/py-filelock/badge/?version=latest&style=flat-square)](https://py-filelock.readthedocs.io/en/latest/?badge=latest)
[![Code style:
black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Downloads](https://pepy.tech/badge/filelock/month)](https://pepy.tech/project/filelock/month)
[![check](https://github.com/tox-dev/py-filelock/actions/workflows/check.yml/badge.svg)](https://github.com/tox-dev/py-filelock/actions/workflows/check.yml)

For more information checkout the [official documentation](https://py-filelock.readthedocs.io/en/latest/api.html).


PK�(�\���a��!doc/alt-python37-filelock/LICENSEnu�[���This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

For more information, please refer to <http://unlicense.org>
PK�(�\�Ts�~~#doc/alt-python37-filelock/README.mdnu�[���# py-filelock

[![PyPI](https://img.shields.io/pypi/v/filelock?style=flat-square)](https://pypi.org/project/filelock/)
[![Supported Python
versions](https://img.shields.io/pypi/pyversions/filelock.svg)](https://pypi.org/project/filelock/)
[![Documentation
status](https://readthedocs.org/projects/py-filelock/badge/?version=latest&style=flat-square)](https://py-filelock.readthedocs.io/en/latest/?badge=latest)
[![Code style:
black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![Downloads](https://pepy.tech/badge/filelock/month)](https://pepy.tech/project/filelock/month)
[![check](https://github.com/tox-dev/py-filelock/actions/workflows/check.yml/badge.svg)](https://github.com/tox-dev/py-filelock/actions/workflows/check.yml)

For more information checkout the [official documentation](https://py-filelock.readthedocs.io/en/latest/api.html).
PK�(�\!���
�
 doc/alt-python37-jinja2/PKG-INFOnu�[���Metadata-Version: 2.1
Name: Jinja2
Version: 3.0.3
Summary: A very fast and expressive template engine.
Home-page: https://palletsprojects.com/p/jinja/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
Maintainer: Pallets
Maintainer-email: contact@palletsprojects.com
License: BSD-3-Clause
Project-URL: Donate, https://palletsprojects.com/donate
Project-URL: Documentation, https://jinja.palletsprojects.com/
Project-URL: Changes, https://jinja.palletsprojects.com/changes/
Project-URL: Source Code, https://github.com/pallets/jinja/
Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/
Project-URL: Twitter, https://twitter.com/PalletsTeam
Project-URL: Chat, https://discord.gg/pallets
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Text Processing :: Markup :: HTML
Requires-Python: >=3.6
Description-Content-Type: text/x-rst
Provides-Extra: i18n
License-File: LICENSE.rst

Jinja
=====

Jinja is a fast, expressive, extensible templating engine. Special
placeholders in the template allow writing code similar to Python
syntax. Then the template is passed data to render the final document.

It includes:

-   Template inheritance and inclusion.
-   Define and import macros within templates.
-   HTML templates can use autoescaping to prevent XSS from untrusted
    user input.
-   A sandboxed environment can safely render untrusted templates.
-   AsyncIO support for generating templates and calling async
    functions.
-   I18N support with Babel.
-   Templates are compiled to optimized Python code just-in-time and
    cached, or can be compiled ahead-of-time.
-   Exceptions point to the correct line in templates to make debugging
    easier.
-   Extensible filters, tests, functions, and even syntax.

Jinja's philosophy is that while application logic belongs in Python if
possible, it shouldn't make the template designer's job difficult by
restricting functionality too much.


Installing
----------

Install and update using `pip`_:

.. code-block:: text

    $ pip install -U Jinja2

.. _pip: https://pip.pypa.io/en/stable/getting-started/


In A Nutshell
-------------

.. code-block:: jinja

    {% extends "base.html" %}
    {% block title %}Members{% endblock %}
    {% block content %}
      <ul>
      {% for user in users %}
        <li><a href="{{ user.url }}">{{ user.username }}</a></li>
      {% endfor %}
      </ul>
    {% endblock %}


Donate
------

The Pallets organization develops and supports Jinja and other popular
packages. In order to grow the community of contributors and users, and
allow the maintainers to devote more time to the projects, `please
donate today`_.

.. _please donate today: https://palletsprojects.com/donate


Links
-----

-   Documentation: https://jinja.palletsprojects.com/
-   Changes: https://jinja.palletsprojects.com/changes/
-   PyPI Releases: https://pypi.org/project/Jinja2/
-   Source Code: https://github.com/pallets/jinja/
-   Issue Tracker: https://github.com/pallets/jinja/issues/
-   Website: https://palletsprojects.com/p/jinja/
-   Twitter: https://twitter.com/PalletsTeam
-   Chat: https://discord.gg/pallets


PK�(�\��ֲ��#doc/alt-python37-jinja2/LICENSE.rstnu�[���Copyright 2007 Pallets

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

1.  Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

2.  Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

3.  Neither the name of the copyright holder nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK�(�\���+��2doc/alt-python37-jinja2/examples/basic/debugger.pynu�[���from jinja2 import Environment
from jinja2.loaders import FileSystemLoader

env = Environment(loader=FileSystemLoader("templates"))
tmpl = env.get_template("broken.html")
print(tmpl.render(seq=[3, 2, 4, 5, 3, 2, 0, 2, 1]))
PK�(�\�\����Hdoc/alt-python37-jinja2/examples/basic/test_filter_and_linestatements.pynu�[���from jinja2 import Environment

env = Environment(
    line_statement_prefix="%", variable_start_string="${", variable_end_string="}"
)
tmpl = env.from_string(
    """\
% macro foo()
    ${caller(42)}
% endmacro
<ul>
% for item in seq
    <li>${item}</li>
% endfor
</ul>
% call(var) foo()
    [${var}]
% endcall
% filter escape
    <hello world>
    % for item in [1, 2, 3]
      -  ${item}
    % endfor
% endfilter
"""
)
print(tmpl.render(seq=range(10)))
PK�(�\��k��.doc/alt-python37-jinja2/examples/basic/test.pynu�[���from jinja2 import Environment
from jinja2.loaders import DictLoader

env = Environment(
    loader=DictLoader(
        {
            "child.html": """\
{% extends default_layout or 'default.html' %}
{% include helpers = 'helpers.html' %}
{% macro get_the_answer() %}42{% endmacro %}
{% title = 'Hello World' %}
{% block body %}
    {{ get_the_answer() }}
    {{ helpers.conspirate() }}
{% endblock %}
""",
            "default.html": """\
<!doctype html>
<title>{{ title }}</title>
{% block body %}{% endblock %}
""",
            "helpers.html": """\
{% macro conspirate() %}23{% endmacro %}
""",
        }
    )
)
tmpl = env.get_template("child.html")
print(tmpl.render())
PK�(�\�ͼ���5doc/alt-python37-jinja2/examples/basic/inheritance.pynu�[���from jinja2 import Environment
from jinja2.loaders import DictLoader

env = Environment(
    loader=DictLoader(
        {
            "a": "[A[{% block body %}{% endblock %}]]",
            "b": "{% extends 'a' %}{% block body %}[B]{% endblock %}",
            "c": "{% extends 'b' %}{% block body %}###{{ super() }}###{% endblock %}",
        }
    )
)
print(env.get_template("c").render())
PK�(�\֩'1  3doc/alt-python37-jinja2/examples/basic/translate.pynu�[���from jinja2 import Environment

env = Environment(extensions=["jinja2.ext.i18n"])
env.globals["gettext"] = {"Hello %(user)s!": "Hallo %(user)s!"}.__getitem__
env.globals["ngettext"] = lambda s, p, n: {
    "%(count)s user": "%(count)d Benutzer",
    "%(count)s users": "%(count)d Benutzer",
}[s if n == 1 else p]
print(
    env.from_string(
        """\
{% trans %}Hello {{ user }}!{% endtrans %}
{% trans count=users|count -%}
{{ count }} user{% pluralize %}{{ count }} users
{% endtrans %}
"""
    ).render(user="someone", users=[1, 2, 3])
)
PK�(�\�*D	@@?doc/alt-python37-jinja2/examples/basic/templates/subbroken.htmlnu�[���{% macro may_break(item) -%}
  [{{ item / 0 }}]
{%- endmacro %}
PK�(�\���x||<doc/alt-python37-jinja2/examples/basic/templates/broken.htmlnu�[���{% from 'subbroken.html' import may_break %}
<ul>
{% for item in seq %}
  <li>{{ may_break(item) }}</li>
{% endfor %}
</ul>
PK�(�\�9�:--/doc/alt-python37-jinja2/examples/basic/cycle.pynu�[���from jinja2 import Environment

env = Environment(
    line_statement_prefix="#", variable_start_string="${", variable_end_string="}"
)
print(
    env.from_string(
        """\
<ul>
# for item in range(10)
    <li class="${loop.cycle('odd', 'even')}">${item}</li>
# endfor
</ul>\
"""
    ).render()
)
PK�(�\���--:doc/alt-python37-jinja2/examples/basic/test_loop_filter.pynu�[���from jinja2 import Environment

tmpl = Environment().from_string(
    """\
<ul>
{%- for item in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] if item % 2 == 0 %}
    <li>{{ loop.index }} / {{ loop.length }}: {{ item }}</li>
{%- endfor %}
</ul>
if condition: {{ 1 if foo else 0 }}
"""
)
print(tmpl.render(foo=True))
PK�(�\�������#doc/alt-python37-jinja2/CHANGES.rstnu�[���.. currentmodule:: jinja2

Version 3.0.3
-------------

Released 2021-11-09

-   Fix traceback rewriting internals for Python 3.10 and 3.11.
    :issue:`1535`
-   Fix how the native environment treats leading and trailing spaces
    when parsing values on Python 3.10. :pr:`1537`
-   Improve async performance by avoiding checks for common types.
    :issue:`1514`
-   Revert change to ``hash(Node)`` behavior. Nodes are hashed by id
    again :issue:`1521`
-   ``PackageLoader`` works when the package is a single module file.
    :issue:`1512`


Version 3.0.2
-------------

Released 2021-10-04

-   Fix a loop scoping bug that caused assignments in nested loops
    to still be referenced outside of it. :issue:`1427`
-   Make ``compile_templates`` deterministic for filter and import
    names. :issue:`1452, 1453`
-   Revert an unintended change that caused ``Undefined`` to act like
    ``StrictUndefined`` for the ``in`` operator. :issue:`1448`
-   Imported macros have access to the current template globals in async
    environments. :issue:`1494`
-   ``PackageLoader`` will not include a current directory (.) path
    segment. This allows loading templates from the root of a zip
    import. :issue:`1467`


Version 3.0.1
-------------

Released 2021-05-18

-   Update MarkupSafe dependency to >= 2.0. :pr:`1418`
-   Mark top-level names as exported so type checking understands
    imports in user projects. :issue:`1426`
-   Fix some types that weren't available in Python 3.6.0. :issue:`1433`
-   The deprecation warning for unneeded ``autoescape`` and ``with_``
    extensions shows more relevant context. :issue:`1429`
-   Fixed calling deprecated ``jinja2.Markup`` without an argument.
    Use ``markupsafe.Markup`` instead. :issue:`1438`
-   Calling sync ``render`` for an async template uses ``asyncio.run``
    on Python >= 3.7. This fixes a deprecation that Python 3.10
    introduces. :issue:`1443`


Version 3.0.0
-------------

Released 2021-05-11

-   Drop support for Python 2.7 and 3.5.
-   Bump MarkupSafe dependency to >=1.1.
-   Bump Babel optional dependency to >=2.1.
-   Remove code that was marked deprecated.
-   Add type hinting. :pr:`1412`
-   Use :pep:`451` API to load templates with
    :class:`~loaders.PackageLoader`. :issue:`1168`
-   Fix a bug that caused imported macros to not have access to the
    current template's globals. :issue:`688`
-   Add ability to ignore ``trim_blocks`` using ``+%}``. :issue:`1036`
-   Fix a bug that caused custom async-only filters to fail with
    constant input. :issue:`1279`
-   Fix UndefinedError incorrectly being thrown on an undefined variable
    instead of ``Undefined`` being returned on
    ``NativeEnvironment`` on Python 3.10. :issue:`1335`
-   Blocks can be marked as ``required``. They must be overridden at
    some point, but not necessarily by the direct child. :issue:`1147`
-   Deprecate the ``autoescape`` and ``with`` extensions, they are
    built-in to the compiler. :issue:`1203`
-   The ``urlize`` filter recognizes ``mailto:`` links and takes
    ``extra_schemes`` (or ``env.policies["urlize.extra_schemes"]``) to
    recognize other schemes. It tries to balance parentheses within a
    URL instead of ignoring trailing characters. The parsing in general
    has been updated to be more efficient and match more cases. URLs
    without a scheme are linked as ``https://`` instead of ``http://``.
    :issue:`522, 827, 1172`, :pr:`1195`
-   Filters that get attributes, such as ``map`` and ``groupby``, can
    use a false or empty value as a default. :issue:`1331`
-   Fix a bug that prevented variables set in blocks or loops from
    being accessed in custom context functions. :issue:`768`
-   Fix a bug that caused scoped blocks from accessing special loop
    variables. :issue:`1088`
-   Update the template globals when calling
    ``Environment.get_template(globals=...)`` even if the template was
    already loaded. :issue:`295`
-   Do not raise an error for undefined filters in unexecuted
    if-statements and conditional expressions. :issue:`842`
-   Add ``is filter`` and ``is test`` tests to test if a name is a
    registered filter or test. This allows checking if a filter is
    available in a template before using it. Test functions can be
    decorated with ``@pass_environment``, ``@pass_eval_context``,
    or ``@pass_context``. :issue:`842`, :pr:`1248`
-   Support ``pgettext`` and ``npgettext`` (message contexts) in i18n
    extension. :issue:`441`
-   The ``|indent`` filter's ``width`` argument can be a string to
    indent by. :pr:`1167`
-   The parser understands hex, octal, and binary integer literals.
    :issue:`1170`
-   ``Undefined.__contains__`` (``in``) raises an ``UndefinedError``
    instead of a ``TypeError``. :issue:`1198`
-   ``Undefined`` is iterable in an async environment. :issue:`1294`
-   ``NativeEnvironment`` supports async mode. :issue:`1362`
-   Template rendering only treats ``\n``, ``\r\n`` and ``\r`` as line
    breaks. Other characters are left unchanged. :issue:`769, 952, 1313`
-   ``|groupby`` filter takes an optional ``default`` argument.
    :issue:`1359`
-   The function and filter decorators have been renamed and unified.
    The old names are deprecated. :issue:`1381`

    -   ``pass_context`` replaces ``contextfunction`` and
        ``contextfilter``.
    -   ``pass_eval_context`` replaces ``evalcontextfunction`` and
        ``evalcontextfilter``
    -   ``pass_environment`` replaces ``environmentfunction`` and
        ``environmentfilter``.

-   Async support no longer requires Jinja to patch itself. It must
    still be enabled with ``Environment(enable_async=True)``.
    :issue:`1390`
-   Overriding ``Context.resolve`` is deprecated, override
    ``resolve_or_missing`` instead. :issue:`1380`


Version 2.11.3
--------------

Released 2021-01-31

-   Improve the speed of the ``urlize`` filter by reducing regex
    backtracking. Email matching requires a word character at the start
    of the domain part, and only word characters in the TLD. :pr:`1343`


Version 2.11.2
--------------

Released 2020-04-13

-   Fix a bug that caused callable objects with ``__getattr__``, like
    :class:`~unittest.mock.Mock` to be treated as a
    :func:`contextfunction`. :issue:`1145`
-   Update ``wordcount`` filter to trigger :class:`Undefined` methods
    by wrapping the input in :func:`soft_str`. :pr:`1160`
-   Fix a hang when displaying tracebacks on Python 32-bit.
    :issue:`1162`
-   Showing an undefined error for an object that raises
    ``AttributeError`` on access doesn't cause a recursion error.
    :issue:`1177`
-   Revert changes to :class:`~loaders.PackageLoader` from 2.10 which
    removed the dependency on setuptools and pkg_resources, and added
    limited support for namespace packages. The changes caused issues
    when using Pytest. Due to the difficulty in supporting Python 2 and
    :pep:`451` simultaneously, the changes are reverted until 3.0.
    :pr:`1182`
-   Fix line numbers in error messages when newlines are stripped.
    :pr:`1178`
-   The special ``namespace()`` assignment object in templates works in
    async environments. :issue:`1180`
-   Fix whitespace being removed before tags in the middle of lines when
    ``lstrip_blocks`` is enabled. :issue:`1138`
-   :class:`~nativetypes.NativeEnvironment` doesn't evaluate
    intermediate strings during rendering. This prevents early
    evaluation which could change the value of an expression.
    :issue:`1186`


Version 2.11.1
--------------

Released 2020-01-30

-   Fix a bug that prevented looking up a key after an attribute
    (``{{ data.items[1:] }}``) in an async template. :issue:`1141`


Version 2.11.0
--------------

Released 2020-01-27

-   Drop support for Python 2.6, 3.3, and 3.4. This will be the last
    version to support Python 2.7 and 3.5.
-   Added a new ``ChainableUndefined`` class to support getitem and
    getattr on an undefined object. :issue:`977`
-   Allow ``{%+`` syntax (with NOP behavior) when ``lstrip_blocks`` is
    disabled. :issue:`748`
-   Added a ``default`` parameter for the ``map`` filter. :issue:`557`
-   Exclude environment globals from
    :func:`meta.find_undeclared_variables`. :issue:`931`
-   Float literals can be written with scientific notation, like
    2.56e-3. :issue:`912`, :pr:`922`
-   Int and float literals can be written with the '_' separator for
    legibility, like 12_345. :pr:`923`
-   Fix a bug causing deadlocks in ``LRUCache.setdefault``. :pr:`1000`
-   The ``trim`` filter takes an optional string of characters to trim.
    :pr:`828`
-   A new ``jinja2.ext.debug`` extension adds a ``{% debug %}`` tag to
    quickly dump the current context and available filters and tests.
    :issue:`174`, :pr:`798, 983`
-   Lexing templates with large amounts of whitespace is much faster.
    :issue:`857`, :pr:`858`
-   Parentheses around comparisons are preserved, so
    ``{{ 2 * (3 < 5) }}`` outputs "2" instead of "False".
    :issue:`755`, :pr:`938`
-   Add new ``boolean``, ``false``, ``true``, ``integer`` and ``float``
    tests. :pr:`824`
-   The environment's ``finalize`` function is only applied to the
    output of expressions (constant or not), not static template data.
    :issue:`63`
-   When providing multiple paths to ``FileSystemLoader``, a template
    can have the same name as a directory. :issue:`821`
-   Always return :class:`Undefined` when omitting the ``else`` clause
    in a ``{{ 'foo' if bar }}`` expression, regardless of the
    environment's ``undefined`` class. Omitting the ``else`` clause is a
    valid shortcut and should not raise an error when using
    :class:`StrictUndefined`. :issue:`710`, :pr:`1079`
-   Fix behavior of ``loop`` control variables such as ``length`` and
    ``revindex0`` when looping over a generator. :issue:`459, 751, 794`,
    :pr:`993`
-   Async support is only loaded the first time an environment enables
    it, in order to avoid a slow initial import. :issue:`765`
-   In async environments, the ``|map`` filter will await the filter
    call if needed. :pr:`913`
-   In for loops that access ``loop`` attributes, the iterator is not
    advanced ahead of the current iteration unless ``length``,
    ``revindex``, ``nextitem``, or ``last`` are accessed. This makes it
    less likely to break ``groupby`` results. :issue:`555`, :pr:`1101`
-   In async environments, the ``loop`` attributes ``length`` and
    ``revindex`` work for async iterators. :pr:`1101`
-   In async environments, values from attribute/property access will
    be awaited if needed. :pr:`1101`
-   :class:`~loader.PackageLoader` doesn't depend on setuptools or
    pkg_resources. :issue:`970`
-   ``PackageLoader`` has limited support for :pep:`420` namespace
    packages. :issue:`1097`
-   Support :class:`os.PathLike` objects in
    :class:`~loader.FileSystemLoader` and :class:`~loader.ModuleLoader`.
    :issue:`870`
-   :class:`~nativetypes.NativeTemplate` correctly handles quotes
    between expressions. ``"'{{ a }}', '{{ b }}'"`` renders as the tuple
    ``('1', '2')`` rather than the string ``'1, 2'``. :issue:`1020`
-   Creating a :class:`~nativetypes.NativeTemplate` directly creates a
    :class:`~nativetypes.NativeEnvironment` instead of a default
    :class:`Environment`. :issue:`1091`
-   After calling ``LRUCache.copy()``, the copy's queue methods point to
    the correct queue. :issue:`843`
-   Compiling templates always writes UTF-8 instead of defaulting to the
    system encoding. :issue:`889`
-   ``|wordwrap`` filter treats existing newlines as separate paragraphs
    to be wrapped individually, rather than creating short intermediate
    lines. :issue:`175`
-   Add ``break_on_hyphens`` parameter to ``|wordwrap`` filter.
    :issue:`550`
-   Cython compiled functions decorated as context functions will be
    passed the context. :pr:`1108`
-   When chained comparisons of constants are evaluated at compile time,
    the result follows Python's behavior of returning ``False`` if any
    comparison returns ``False``, rather than only the last one.
    :issue:`1102`
-   Tracebacks for exceptions in templates show the correct line numbers
    and source for Python >= 3.7. :issue:`1104`
-   Tracebacks for template syntax errors in Python 3 no longer show
    internal compiler frames. :issue:`763`
-   Add a ``DerivedContextReference`` node that can be used by
    extensions to get the current context and local variables such as
    ``loop``. :issue:`860`
-   Constant folding during compilation is applied to some node types
    that were previously overlooked. :issue:`733`
-   ``TemplateSyntaxError.source`` is not empty when raised from an
    included template. :issue:`457`
-   Passing an ``Undefined`` value to ``get_template`` (such as through
    ``extends``, ``import``, or ``include``), raises an
    ``UndefinedError`` consistently. ``select_template`` will show the
    undefined message in the list of attempts rather than the empty
    string. :issue:`1037`
-   ``TemplateSyntaxError`` can be pickled. :pr:`1117`


Version 2.10.3
--------------

Released 2019-10-04

-   Fix a typo in Babel entry point in ``setup.py`` that was preventing
    installation.


Version 2.10.2
--------------

Released 2019-10-04

-   Fix Python 3.7 deprecation warnings.
-   Using ``range`` in the sandboxed environment uses ``xrange`` on
    Python 2 to avoid memory use. :issue:`933`
-   Use Python 3.7's better traceback support to avoid a core dump when
    using debug builds of Python 3.7. :issue:`1050`


Version 2.10.1
--------------

Released 2019-04-06

-   ``SandboxedEnvironment`` securely handles ``str.format_map`` in
    order to prevent code execution through untrusted format strings.
    The sandbox already handled ``str.format``.


Version 2.10
------------

Released 2017-11-08

-   Added a new extension node called ``OverlayScope`` which can be used
    to create an unoptimized scope that will look up all variables from
    a derived context.
-   Added an ``in`` test that works like the in operator. This can be
    used in combination with ``reject`` and ``select``.
-   Added ``previtem`` and ``nextitem`` to loop contexts, providing
    access to the previous/next item in the loop. If such an item does
    not exist, the value is undefined.
-   Added ``changed(*values)`` to loop contexts, providing an easy way
    of checking whether a value has changed since the last iteration (or
    rather since the last call of the method)
-   Added a ``namespace`` function that creates a special object which
    allows attribute assignment using the ``set`` tag. This can be used
    to carry data across scopes, e.g. from a loop body to code that
    comes after the loop.
-   Added a ``trimmed`` modifier to ``{% trans %}`` to strip linebreaks
    and surrounding whitespace. Also added a new policy to enable this
    for all ``trans`` blocks.
-   The ``random`` filter is no longer incorrectly constant folded and
    will produce a new random choice each time the template is rendered.
    :pr:`478`
-   Added a ``unique`` filter. :pr:`469`
-   Added ``min`` and ``max`` filters. :pr:`475`
-   Added tests for all comparison operators: ``eq``, ``ne``, ``lt``,
    ``le``, ``gt``, ``ge``. :pr:`665`
-   ``import`` statement cannot end with a trailing comma. :pr:`617`,
    :pr:`618`
-   ``indent`` filter will not indent blank lines by default. :pr:`685`
-   Add ``reverse`` argument for ``dictsort`` filter. :pr:`692`
-   Add a ``NativeEnvironment`` that renders templates to native Python
    types instead of strings. :pr:`708`
-   Added filter support to the block ``set`` tag. :pr:`489`
-   ``tojson`` filter marks output as safe to match documented behavior.
    :pr:`718`
-   Resolved a bug where getting debug locals for tracebacks could
    modify template context.
-   Fixed a bug where having many ``{% elif ... %}`` blocks resulted in
    a "too many levels of indentation" error. These blocks now compile
    to native ``elif ..:`` instead of ``else: if ..:`` :issue:`759`


Version 2.9.6
-------------

Released 2017-04-03

-   Fixed custom context behavior in fast resolve mode :issue:`675`


Version 2.9.5
-------------

Released 2017-01-28

-   Restored the original repr of the internal ``_GroupTuple`` because
    this caused issues with ansible and it was an unintended change.
    :issue:`654`
-   Added back support for custom contexts that override the old
    ``resolve`` method since it was hard for people to spot that this
    could cause a regression.
-   Correctly use the buffer for the else block of for loops. This
    caused invalid syntax errors to be caused on 2.x and completely
    wrong behavior on Python 3 :issue:`669`
-   Resolve an issue where the ``{% extends %}`` tag could not be used
    with async environments. :issue:`668`
-   Reduce memory footprint slightly by reducing our unicode database
    dump we use for identifier matching on Python 3 :issue:`666`
-   Fixed autoescaping not working for macros in async compilation mode.
    :issue:`671`


Version 2.9.4
-------------

Released 2017-01-10

-   Solved some warnings for string literals. :issue:`646`
-   Increment the bytecode cache version which was not done due to an
    oversight before.
-   Corrected bad code generation and scoping for filtered loops.
    :issue:`649`
-   Resolved an issue where top-level output silencing after known
    extend blocks could generate invalid code when blocks where
    contained in if statements. :issue:`651`
-   Made the ``truncate.leeway`` default configurable to improve
    compatibility with older templates.


Version 2.9.3
-------------

Released 2017-01-08

-   Restored the use of blocks in macros to the extend that was possible
    before. On Python 3 it would render a generator repr instead of the
    block contents. :issue:`645`
-   Set a consistent behavior for assigning of variables in inner scopes
    when the variable is also read from an outer scope. This now sets
    the intended behavior in all situations however it does not restore
    the old behavior where limited assignments to outer scopes was
    possible. For more information and a discussion see :issue:`641`
-   Resolved an issue where ``block scoped`` would not take advantage of
    the new scoping rules. In some more exotic cases a variable
    overridden in a local scope would not make it into a block.
-   Change the code generation of the ``with`` statement to be in line
    with the new scoping rules. This resolves some unlikely bugs in edge
    cases. This also introduces a new internal ``With`` node that can be
    used by extensions.


Version 2.9.2
-------------

Released 2017-01-08

-   Fixed a regression that caused for loops to not be able to use the
    same variable for the target as well as source iterator.
    :issue:`640`
-   Add support for a previously unknown behavior of macros. It used to
    be possible in some circumstances to explicitly provide a caller
    argument to macros. While badly buggy and unintended it turns out
    that this is a common case that gets copy pasted around. To not
    completely break backwards compatibility with the most common cases
    it's now possible to provide an explicit keyword argument for caller
    if it's given an explicit default. :issue:`642`


Version 2.9.1
-------------

Released 2017-01-07

-   Resolved a regression with call block scoping for macros. Nested
    caller blocks that used the same identifiers as outer macros could
    refer to the wrong variable incorrectly.


Version 2.9
-----------

Released 2017-01-07, codename Derivation

-   Change cache key definition in environment. This fixes a performance
    regression introduced in 2.8.
-   Added support for ``generator_stop`` on supported Python versions
    (Python 3.5 and later)
-   Corrected a long standing issue with operator precedence of math
    operations not being what was expected.
-   Added support for Python 3.6 async iterators through a new async
    mode.
-   Added policies for filter defaults and similar things.
-   Urlize now sets "rel noopener" by default.
-   Support attribute fallback for old-style classes in 2.x.
-   Support toplevel set statements in extend situations.
-   Restored behavior of Cycler for Python 3 users.
-   Subtraction now follows the same behavior as other operators on
    undefined values.
-   ``map`` and friends will now give better error messages if you
    forgot to quote the parameter.
-   Depend on MarkupSafe 0.23 or higher.
-   Improved the ``truncate`` filter to support better truncation in
    case the string is barely truncated at all.
-   Change the logic for macro autoescaping to be based on the runtime
    autoescaping information at call time instead of macro define time.
-   Ported a modified version of the ``tojson`` filter from Flask to
    Jinja and hooked it up with the new policy framework.
-   Block sets are now marked ``safe`` by default.
-   On Python 2 the asciification of ASCII strings can now be disabled
    with the ``compiler.ascii_str`` policy.
-   Tests now no longer accept an arbitrary expression as first argument
    but a restricted one. This means that you can now properly use
    multiple tests in one expression without extra parentheses. In
    particular you can now write ``foo is divisibleby 2 or foo is
    divisibleby 3`` as you would expect.
-   Greatly changed the scoping system to be more consistent with what
    template designers and developers expect. There is now no more magic
    difference between the different include and import constructs.
    Context is now always propagated the same way. The only remaining
    differences is the defaults for ``with context`` and ``without
    context``.
-   The ``with`` and ``autoescape`` tags are now built-in.
-   Added the new ``select_autoescape`` function which helps configuring
    better autoescaping easier.
-   Fixed a runtime error in the sandbox when attributes of async
    generators were accessed.


Version 2.8.1
-------------

Released 2016-12-29

-   Fixed the ``for_qs`` flag for ``urlencode``.
-   Fixed regression when applying ``int`` to non-string values.
-   SECURITY: if the sandbox mode is used format expressions are now
    sandboxed with the same rules as in Jinja. This solves various
    information leakage problems that can occur with format strings.


Version 2.8
-----------

Released 2015-07-26, codename Replacement

-   Added ``target`` parameter to urlize function.
-   Added support for ``followsymlinks`` to the file system loader.
-   The truncate filter now counts the length.
-   Added equalto filter that helps with select filters.
-   Changed cache keys to use absolute file names if available instead
    of load names.
-   Fixed loop length calculation for some iterators.
-   Changed how Jinja enforces strings to be native strings in Python 2
    to work when people break their default encoding.
-   Added ``make_logging_undefined`` which returns an undefined
    object that logs failures into a logger.
-   If unmarshalling of cached data fails the template will be reloaded
    now.
-   Implemented a block ``set`` tag.
-   Default cache size was increased to 400 from a low 50.
-   Fixed ``is number`` test to accept long integers in all Python
    versions.
-   Changed ``is number`` to accept Decimal as a number.
-   Added a check for default arguments followed by non-default
    arguments. This change makes ``{% macro m(x, y=1, z) %}`` a syntax
    error. The previous behavior for this code was broken anyway
    (resulting in the default value being applied to ``y``).
-   Add ability to use custom subclasses of
    ``jinja2.compiler.CodeGenerator`` and ``jinja2.runtime.Context`` by
    adding two new attributes to the environment
    (``code_generator_class`` and ``context_class``). :pr:`404`
-   Added support for context/environment/evalctx decorator functions on
    the finalize callback of the environment.
-   Escape query strings for urlencode properly. Previously slashes were
    not escaped in that place.
-   Add 'base' parameter to 'int' filter.


Version 2.7.3
-------------

Released 2014-06-06

-   Security issue: Corrected the security fix for the cache folder.
    This fix was provided by RedHat.


Version 2.7.2
-------------

Released 2014-01-10

-   Prefix loader was not forwarding the locals properly to inner
    loaders. This is now fixed.
-   Security issue: Changed the default folder for the filesystem cache
    to be user specific and read and write protected on UNIX systems.
    See `Debian bug 734747`_ for more information.

.. _Debian bug 734747: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=734747


Version 2.7.1
-------------

Released 2013-08-07

-   Fixed a bug with ``call_filter`` not working properly on environment
    and context filters.
-   Fixed lack of Python 3 support for bytecode caches.
-   Reverted support for defining blocks in included templates as this
    broke existing templates for users.
-   Fixed some warnings with hashing of undefineds and nodes if Python
    is run with warnings for Python 3.
-   Added support for properly hashing undefined objects.
-   Fixed a bug with the title filter not working on already uppercase
    strings.


Version 2.7
-----------

Released 2013-05-20, codename Translation

-   Choice and prefix loaders now dispatch source and template lookup
    separately in order to work in combination with module loaders as
    advertised.
-   Fixed filesizeformat.
-   Added a non-silent option for babel extraction.
-   Added ``urlencode`` filter that automatically quotes values for URL
    safe usage with utf-8 as only supported encoding. If applications
    want to change this encoding they can override the filter.
-   Added ``keep-trailing-newline`` configuration to environments and
    templates to optionally preserve the final trailing newline.
-   Accessing ``last`` on the loop context no longer causes the iterator
    to be consumed into a list.
-   Python requirement changed: 2.6, 2.7 or >= 3.3 are required now,
    supported by same source code, using the "six" compatibility
    library.
-   Allow ``contextfunction`` and other decorators to be applied to
    ``__call__``.
-   Added support for changing from newline to different signs in the
    ``wordwrap`` filter.
-   Added support for ignoring memcache errors silently.
-   Added support for keeping the trailing newline in templates.
-   Added finer grained support for stripping whitespace on the left
    side of blocks.
-   Added ``map``, ``select``, ``reject``, ``selectattr`` and
    ``rejectattr`` filters.
-   Added support for ``loop.depth`` to figure out how deep inside a
    recursive loop the code is.
-   Disabled py_compile for pypy and python 3.


Version 2.6
-----------

Released 2011-07-24, codename Convolution

-   Internal attributes now raise an internal attribute error now
    instead of returning an undefined. This fixes problems when passing
    undefined objects to Python semantics expecting APIs.
-   Traceback support now works properly for PyPy. (Tested with 1.4)
-   Implemented operator intercepting for sandboxed environments. This
    allows application developers to disable builtin operators for
    better security. (For instance limit the mathematical operators to
    actual integers instead of longs)
-   Groupby filter now supports dotted notation for grouping by
    attributes of attributes.
-   Scoped blocks now properly treat toplevel assignments and imports.
    Previously an import suddenly "disappeared" in a scoped block.
-   Automatically detect newer Python interpreter versions before
    loading code from bytecode caches to prevent segfaults on invalid
    opcodes. The segfault in earlier Jinja versions here was not a
    Jinja bug but a limitation in the underlying Python interpreter. If
    you notice Jinja segfaulting in earlier versions after an upgrade
    of the Python interpreter you don't have to upgrade, it's enough to
    flush the bytecode cache. This just no longer makes this necessary,
    Jinja will automatically detect these cases now.
-   The sum filter can now sum up values by attribute. This is a
    backwards incompatible change. The argument to the filter previously
    was the optional starting index which defaults to zero. This now
    became the second argument to the function because it's rarely used.
-   Like sum, sort now also makes it possible to order items by
    attribute.
-   Like sum and sort, join now also is able to join attributes of
    objects as string.
-   The internal eval context now has a reference to the environment.
-   Added a mapping test to see if an object is a dict or an object with
    a similar interface.


Version 2.5.5
-------------

Released 2010-10-18

-   Built documentation is no longer part of release.


Version 2.5.4
-------------

Released 2010-10-17

-   Fixed extensions not loading properly with overlays.
-   Work around a bug in cpython for the debugger that causes segfaults
    on 64bit big-endian architectures.


Version 2.5.3
-------------

Released 2010-10-17

-   Fixed an operator precedence error introduced in 2.5.2. Statements
    like "-foo.bar" had their implicit parentheses applied around the
    first part of the expression ("(-foo).bar") instead of the more
    correct "-(foo.bar)".


Version 2.5.2
-------------

Released 2010-08-18

-   Improved setup.py script to better work with assumptions people
    might still have from it (``--with-speedups``).
-   Fixed a packaging error that excluded the new debug support.


Version 2.5.1
-------------

Released 2010-08-17

-   StopIteration exceptions raised by functions called from templates
    are now intercepted and converted to undefineds. This solves a lot
    of debugging grief. (StopIteration is used internally to abort
    template execution)
-   Improved performance of macro calls slightly.
-   Babel extraction can now properly extract newstyle gettext calls.
-   Using the variable ``num`` in newstyle gettext for something else
    than the pluralize count will no longer raise a :exc:`KeyError`.
-   Removed builtin markup class and switched to markupsafe. For
    backwards compatibility the pure Python implementation still exists
    but is pulled from markupsafe by the Jinja developers. The debug
    support went into a separate feature called "debugsupport" and is
    disabled by default because it is only relevant for Python 2.4
-   Fixed an issue with unary operators having the wrong precedence.


Version 2.5
-----------

Released 2010-05-29, codename Incoherence

-   Improved the sort filter (should have worked like this for a long
    time) by adding support for case insensitive searches.
-   Fixed a bug for getattribute constant folding.
-   Support for newstyle gettext translations which result in a nicer
    in-template user interface and more consistent catalogs.
-   It's now possible to register extensions after an environment was
    created.


Version 2.4.1
-------------

Released 2010-04-20

-   Fixed an error reporting bug for undefined.


Version 2.4
-----------

Released 2010-04-13, codename Correlation

-   The environment template loading functions now transparently pass
    through a template object if it was passed to it. This makes it
    possible to import or extend from a template object that was passed
    to the template.
-   Added a ``ModuleLoader`` that can load templates from
    precompiled sources. The environment now features a method to
    compile the templates from a configured loader into a zip file or
    folder.
-   The _speedups C extension now supports Python 3.
-   Added support for autoescaping toggling sections and support for
    evaluation contexts.
-   Extensions have a priority now.


Version 2.3.1
-------------

Released 2010-02-19

-   Fixed an error reporting bug on all python versions
-   Fixed an error reporting bug on Python 2.4


Version 2.3
-----------

Released 2010-02-10, codename 3000 Pythons

-   Fixes issue with code generator that causes unbound variables to be
    generated if set was used in if-blocks and other small identifier
    problems.
-   Include tags are now able to select between multiple templates and
    take the first that exists, if a list of templates is given.
-   Fixed a problem with having call blocks in outer scopes that have an
    argument that is also used as local variable in an inner frame
    :issue:`360`.
-   Greatly improved error message reporting :pr:`339`
-   Implicit tuple expressions can no longer be totally empty. This
    change makes ``{% if %}`` a syntax error now. :issue:`364`
-   Added support for translator comments if extracted via babel.
-   Added with-statement extension.
-   Experimental Python 3 support.


Version 2.2.1
-------------

Released 2009-09-14

-   Fixes some smaller problems for Jinja on Jython.


Version 2.2
-----------

Released 2009-09-13, codename Kong

-   Include statements can now be marked with ``ignore missing`` to skip
    non existing templates.
-   Priority of ``not`` raised. It's now possible to write ``not foo in
    bar`` as an alias to ``foo not in bar`` like in python. Previously
    the grammar required parentheses (``not (foo in bar)``) which was
    odd.
-   Fixed a bug that caused syntax errors when defining macros or using
    the ``{% call %}`` tag inside loops.
-   Fixed a bug in the parser that made ``{{ foo[1, 2] }}`` impossible.
-   Made it possible to refer to names from outer scopes in included
    templates that were unused in the callers frame :issue:`327`
-   Fixed a bug that caused internal errors if names where used as
    iteration variable and regular variable *after* the loop if that
    variable was unused *before* the loop. :pr:`331`
-   Added support for optional ``scoped`` modifier to blocks.
-   Added support for line-comments.
-   Added the ``meta`` module.
-   Renamed (undocumented) attribute "overlay" to "overlayed" on the
    environment because it was clashing with a method of the same name.
-   Speedup extension is now disabled by default.


Version 2.1.1
-------------

Released 2008-12-25

-   Fixed a translation error caused by looping over empty recursive
    loops.


Version 2.1
-----------

Released 2008-11-23, codename Yasuzō

-   Fixed a bug with nested loops and the special loop variable. Before
    the change an inner loop overwrote the loop variable from the outer
    one after iteration.
-   Fixed a bug with the i18n extension that caused the explicit
    pluralization block to look up the wrong variable.
-   Fixed a limitation in the lexer that made ``{{ foo.0.0 }}``
    impossible.
-   Index based subscribing of variables with a constant value returns
    an undefined object now instead of raising an index error. This was
    a bug caused by eager optimizing.
-   The i18n extension looks up ``foo.ugettext`` now followed by
    ``foo.gettext`` if an translations object is installed. This makes
    dealing with custom translations classes easier.
-   Fixed a confusing behavior with conditional extending. loops were
    partially executed under some conditions even though they were not
    part of a visible area.
-   Added ``sort`` filter that works like ``dictsort`` but for arbitrary
    sequences.
-   Fixed a bug with empty statements in macros.
-   Implemented a bytecode cache system.
-   The template context is now weakref-able
-   Inclusions and imports "with context" forward all variables now, not
    only the initial context.
-   Added a cycle helper called ``cycler``.
-   Added a joining helper called ``joiner``.
-   Added a ``compile_expression`` method to the environment that allows
    compiling of Jinja expressions into callable Python objects.
-   Fixed an escaping bug in urlize


Version 2.0
-----------

Released 2008-07-17, codename Jinjavitus

-   The subscribing of objects (looking up attributes and items) changed
    from slightly. It's now possible to give attributes or items a
    higher priority by either using dot-notation lookup or the bracket
    syntax. This also changed the AST slightly. ``Subscript`` is gone
    and was replaced with ``Getitem`` and ``Getattr``.
-   Added support for preprocessing and token stream filtering for
    extensions. This would allow extensions to allow simplified gettext
    calls in template data and something similar.
-   Added ``TemplateStream.dump``.
-   Added missing support for implicit string literal concatenation.
    ``{{ "foo" "bar" }}`` is equivalent to ``{{ "foobar" }}``
-   ``else`` is optional for conditional expressions. If not given it
    evaluates to ``false``.
-   Improved error reporting for undefined values by providing a
    position.
-   ``filesizeformat`` filter uses decimal prefixes now per default and
    can be set to binary mode with the second parameter.
-   Fixed bug in finalizer


Version 2.0rc1
--------------

Released 2008-06-09

-   First release of Jinja 2.
PK�(�\U����"doc/alt-python37-jinja2/README.rstnu�[���Jinja
=====

Jinja is a fast, expressive, extensible templating engine. Special
placeholders in the template allow writing code similar to Python
syntax. Then the template is passed data to render the final document.

It includes:

-   Template inheritance and inclusion.
-   Define and import macros within templates.
-   HTML templates can use autoescaping to prevent XSS from untrusted
    user input.
-   A sandboxed environment can safely render untrusted templates.
-   AsyncIO support for generating templates and calling async
    functions.
-   I18N support with Babel.
-   Templates are compiled to optimized Python code just-in-time and
    cached, or can be compiled ahead-of-time.
-   Exceptions point to the correct line in templates to make debugging
    easier.
-   Extensible filters, tests, functions, and even syntax.

Jinja's philosophy is that while application logic belongs in Python if
possible, it shouldn't make the template designer's job difficult by
restricting functionality too much.


Installing
----------

Install and update using `pip`_:

.. code-block:: text

    $ pip install -U Jinja2

.. _pip: https://pip.pypa.io/en/stable/getting-started/


In A Nutshell
-------------

.. code-block:: jinja

    {% extends "base.html" %}
    {% block title %}Members{% endblock %}
    {% block content %}
      <ul>
      {% for user in users %}
        <li><a href="{{ user.url }}">{{ user.username }}</a></li>
      {% endfor %}
      </ul>
    {% endblock %}


Donate
------

The Pallets organization develops and supports Jinja and other popular
packages. In order to grow the community of contributors and users, and
allow the maintainers to devote more time to the projects, `please
donate today`_.

.. _please donate today: https://palletsprojects.com/donate


Links
-----

-   Documentation: https://jinja.palletsprojects.com/
-   Changes: https://jinja.palletsprojects.com/changes/
-   PyPI Releases: https://pypi.org/project/Jinja2/
-   Source Code: https://github.com/pallets/jinja/
-   Issue Tracker: https://github.com/pallets/jinja/issues/
-   Website: https://palletsprojects.com/p/jinja/
-   Twitter: https://twitter.com/PalletsTeam
-   Chat: https://discord.gg/pallets
PK�(�\2���II#doc/alt-python37-schema/LICENSE-MITnu�[���Copyright (c) 2012 Vladimir Keleshev, <vladimir@keleshev.com>

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in 
the Software without restriction, including without limitation the rights to 
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
of the Software, and to permit persons to whom the Software is furnished to do 
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all 
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
SOFTWARE.
PK�(�\;�m�xx"doc/alt-python37-schema/README.rstnu�[���Schema validation just got Pythonic
===============================================================================

**schema** is a library for validating Python data structures, such as those
obtained from config-files, forms, external services or command-line
parsing, converted from JSON/YAML (or something else) to Python data-types.


.. image:: https://secure.travis-ci.org/keleshev/schema.svg?branch=master
    :target: https://travis-ci.org/keleshev/schema

.. image:: https://img.shields.io/codecov/c/github/keleshev/schema.svg
    :target: http://codecov.io/github/keleshev/schema

Example
----------------------------------------------------------------------------

Here is a quick example to get a feeling of **schema**, validating a list of
entries with personal information:

.. code:: python

    >>> from schema import Schema, And, Use, Optional

    >>> schema = Schema([{'name': And(str, len),
    ...                   'age':  And(Use(int), lambda n: 18 <= n <= 99),
    ...                   Optional('gender'): And(str, Use(str.lower),
    ...                                           lambda s: s in ('squid', 'kid'))}])

    >>> data = [{'name': 'Sue', 'age': '28', 'gender': 'Squid'},
    ...         {'name': 'Sam', 'age': '42'},
    ...         {'name': 'Sacha', 'age': '20', 'gender': 'KID'}]

    >>> validated = schema.validate(data)

    >>> assert validated == [{'name': 'Sue', 'age': 28, 'gender': 'squid'},
    ...                      {'name': 'Sam', 'age': 42},
    ...                      {'name': 'Sacha', 'age' : 20, 'gender': 'kid'}]


If data is valid, ``Schema.validate`` will return the validated data
(optionally converted with `Use` calls, see below).

If data is invalid, ``Schema`` will raise ``SchemaError`` exception.
If you just want to check that the data is valid, ``schema.is_valid(data)`` will
return ``True`` or ``False``.


Installation
-------------------------------------------------------------------------------

Use `pip <http://pip-installer.org>`_ or easy_install::

    pip install schema

Alternatively, you can just drop ``schema.py`` file into your project—it is
self-contained.

- **schema** is tested with Python 2.6, 2.7, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7 and PyPy.
- **schema** follows `semantic versioning <http://semver.org>`_.

How ``Schema`` validates data
-------------------------------------------------------------------------------

Types
~~~~~

If ``Schema(...)`` encounters a type (such as ``int``, ``str``, ``object``,
etc.), it will check if the corresponding piece of data is an instance of that type,
otherwise it will raise ``SchemaError``.

.. code:: python

    >>> from schema import Schema

    >>> Schema(int).validate(123)
    123

    >>> Schema(int).validate('123')
    Traceback (most recent call last):
    ...
    SchemaUnexpectedTypeError: '123' should be instance of 'int'

    >>> Schema(object).validate('hai')
    'hai'

Callables
~~~~~~~~~

If ``Schema(...)`` encounters a callable (function, class, or object with
``__call__`` method) it will call it, and if its return value evaluates to
``True`` it will continue validating, else—it will raise ``SchemaError``.

.. code:: python

    >>> import os

    >>> Schema(os.path.exists).validate('./')
    './'

    >>> Schema(os.path.exists).validate('./non-existent/')
    Traceback (most recent call last):
    ...
    SchemaError: exists('./non-existent/') should evaluate to True

    >>> Schema(lambda n: n > 0).validate(123)
    123

    >>> Schema(lambda n: n > 0).validate(-12)
    Traceback (most recent call last):
    ...
    SchemaError: <lambda>(-12) should evaluate to True

"Validatables"
~~~~~~~~~~~~~~

If ``Schema(...)`` encounters an object with method ``validate`` it will run
this method on corresponding data as ``data = obj.validate(data)``. This method
may raise ``SchemaError`` exception, which will tell ``Schema`` that that piece
of data is invalid, otherwise—it will continue validating.

An example of "validatable" is ``Regex``, that tries to match a string or a
buffer with the given regular expression (itself as a string, buffer or
compiled regex ``SRE_Pattern``):

.. code:: python

    >>> from schema import Regex
    >>> import re

    >>> Regex(r'^foo').validate('foobar')
    'foobar'

    >>> Regex(r'^[A-Z]+$', flags=re.I).validate('those-dashes-dont-match')
    Traceback (most recent call last):
    ...
    SchemaError: Regex('^[A-Z]+$', flags=re.IGNORECASE) does not match 'those-dashes-dont-match'

For a more general case, you can use ``Use`` for creating such objects.
``Use`` helps to use a function or type to convert a value while validating it:

.. code:: python

    >>> from schema import Use

    >>> Schema(Use(int)).validate('123')
    123

    >>> Schema(Use(lambda f: open(f, 'a'))).validate('LICENSE-MIT')
    <open file 'LICENSE-MIT', mode 'a' at 0x...>

Dropping the details, ``Use`` is basically:

.. code:: python

    class Use(object):

        def __init__(self, callable_):
            self._callable = callable_

        def validate(self, data):
            try:
                return self._callable(data)
            except Exception as e:
                raise SchemaError('%r raised %r' % (self._callable.__name__, e))


Sometimes you need to transform and validate part of data, but keep original data unchanged.
``Const`` helps to keep your data safe:

.. code:: python

    >> from schema import Use, Const, And, Schema

    >> from datetime import datetime

    >> is_future = lambda date: datetime.now() > date

    >> to_json = lambda v: {"timestamp": v}

    >> Schema(And(Const(And(Use(datetime.fromtimestamp), is_future)), Use(to_json))).validate(1234567890)
    {"timestamp": 1234567890}

Now you can write your own validation-aware classes and data types.

Lists, similar containers
~~~~~~~~~~~~~~~~~~~~~~~~~

If ``Schema(...)`` encounters an instance of ``list``, ``tuple``, ``set`` or
``frozenset``, it will validate contents of corresponding data container
against schemas listed inside that container:


.. code:: python

    >>> Schema([1, 0]).validate([1, 1, 0, 1])
    [1, 1, 0, 1]

    >>> Schema((int, float)).validate((5, 7, 8, 'not int or float here'))
    Traceback (most recent call last):
    ...
    SchemaError: Or(<type 'int'>, <type 'float'>) did not validate 'not int or float here'
    'not int or float here' should be instance of 'float'

Dictionaries
~~~~~~~~~~~~

If ``Schema(...)`` encounters an instance of ``dict``, it will validate data
key-value pairs:

.. code:: python

    >>> d = Schema({'name': str,
    ...             'age': lambda n: 18 <= n <= 99}).validate({'name': 'Sue', 'age': 28})

    >>> assert d == {'name': 'Sue', 'age': 28}

You can specify keys as schemas too:

.. code:: python

    >>> schema = Schema({str: int,  # string keys should have integer values
    ...                  int: None})  # int keys should be always None

    >>> data = schema.validate({'key1': 1, 'key2': 2,
    ...                         10: None, 20: None})

    >>> schema.validate({'key1': 1,
    ...                   10: 'not None here'})
    Traceback (most recent call last):
    ...
    SchemaError: Key '10' error:
    None does not match 'not None here'

This is useful if you want to check certain key-values, but don't care
about others:

.. code:: python

    >>> schema = Schema({'<id>': int,
    ...                  '<file>': Use(open),
    ...                  str: object})  # don't care about other str keys

    >>> data = schema.validate({'<id>': 10,
    ...                         '<file>': 'README.rst',
    ...                         '--verbose': True})

You can mark a key as optional as follows:

.. code:: python

    >>> from schema import Optional
    >>> Schema({'name': str,
    ...         Optional('occupation'): str}).validate({'name': 'Sam'})
    {'name': 'Sam'}

``Optional`` keys can also carry a ``default``, to be used when no key in the
data matches:

.. code:: python

    >>> from schema import Optional
    >>> Schema({Optional('color', default='blue'): str,
    ...         str: str}).validate({'texture': 'furry'}
    ...       ) == {'color': 'blue', 'texture': 'furry'}
    True

Defaults are used verbatim, not passed through any validators specified in the
value.

default can also be a callable:

.. code:: python

    >>> from schema import Schema, Optional
    >>> Schema({Optional('data', default=dict): {}}).validate({}) == {'data': {}}
    True

Also, a caveat: If you specify types, **schema** won't validate the empty dict:

.. code:: python

    >>> Schema({int:int}).is_valid({})
    False

To do that, you need ``Schema(Or({int:int}, {}))``. This is unlike what happens with
lists, where ``Schema([int]).is_valid([])`` will return True.


**schema** has classes ``And`` and ``Or`` that help validating several schemas
for the same data:

.. code:: python

    >>> from schema import And, Or

    >>> Schema({'age': And(int, lambda n: 0 < n < 99)}).validate({'age': 7})
    {'age': 7}

    >>> Schema({'password': And(str, lambda s: len(s) > 6)}).validate({'password': 'hai'})
    Traceback (most recent call last):
    ...
    SchemaError: Key 'password' error:
    <lambda>('hai') should evaluate to True

    >>> Schema(And(Or(int, float), lambda x: x > 0)).validate(3.1415)
    3.1415

In a dictionary, you can also combine two keys in a "one or the other" manner. To do
so, use the `Or` class as a key:

.. code:: python

    >>> from schema import Or, Schema
    >>> schema = Schema({
    ...    Or("key1", "key2", only_one=True): str
    ... })

    >>> schema.validate({"key1": "test"}) # Ok
    {'key1': 'test'}

    >>> schema.validate({"key1": "test", "key2": "test"}) # SchemaError
    Traceback (most recent call last):
    ...
    SchemaOnlyOneAllowedError: There are multiple keys present from the Or('key1', 'key2') condition

Hooks
~~~~~~~~~~
You can define hooks which are functions that are executed whenever a valid key:value is found. 
The `Forbidden` class is an example of this.

You can mark a key as forbidden as follows:

.. code:: python

    >>> from schema import Forbidden
    >>> Schema({Forbidden('age'): object}).validate({'age': 50})
    Traceback (most recent call last):
    ...
    SchemaForbiddenKeyError: Forbidden key encountered: 'age' in {'age': 50}

A few things are worth noting. First, the value paired with the forbidden
key determines whether it will be rejected:

.. code:: python

    >>> Schema({Forbidden('age'): str, 'age': int}).validate({'age': 50})
    {'age': 50}

Note: if we hadn't supplied the 'age' key here, the call would have failed too, but with
SchemaWrongKeyError, not SchemaForbiddenKeyError.

Second, Forbidden has a higher priority than standard keys, and consequently than Optional.
This means we can do that:

.. code:: python

    >>> Schema({Forbidden('age'): object, Optional(str): object}).validate({'age': 50})
    Traceback (most recent call last):
    ...
    SchemaForbiddenKeyError: Forbidden key encountered: 'age' in {'age': 50}

You can also define your own hooks. The following hook will call `_my_function` if `key` is encountered.

.. code:: python

    from schema import Hook
    def _my_function(key, scope, error):
        print(key, scope, error)

    Hook("key", handler=_my_function)

Here's an example where a `Deprecated` class is added to log warnings whenever a key is encountered:

.. code:: python

    from schema import Hook, Schema
    class Deprecated(Hook):
        def __init__(self, *args, **kwargs):
            kwargs["handler"] = lambda key, *args: logging.warn(f"`{key}` is deprecated. " + (self._error or ""))
            super(Deprecated, self).__init__(*args, **kwargs)

    Schema({Deprecated("test", "custom error message."): object}, ignore_extra_keys=True).validate({"test": "value"})
    ...
    WARNING: `test` is deprecated. custom error message.

Extra Keys
~~~~~~~~~~

The ``Schema(...)`` parameter ``ignore_extra_keys`` causes validation to ignore extra keys in a dictionary, and also to not return them after validating.

.. code:: python

    >>> schema = Schema({'name': str}, ignore_extra_keys=True)
    >>> schema.validate({'name': 'Sam', 'age': '42'})
    {'name': 'Sam'}

If you would like any extra keys returned, use ``object: object`` as one of the key/value pairs, which will match any key and any value.
Otherwise, extra keys will raise a ``SchemaError``.

User-friendly error reporting
-------------------------------------------------------------------------------

You can pass a keyword argument ``error`` to any of validatable classes
(such as ``Schema``, ``And``, ``Or``, ``Regex``, ``Use``) to report this error
instead of a built-in one.

.. code:: python

    >>> Schema(Use(int, error='Invalid year')).validate('XVII')
    Traceback (most recent call last):
    ...
    SchemaError: Invalid year

You can see all errors that occurred by accessing exception's ``exc.autos``
for auto-generated error messages, and ``exc.errors`` for errors
which had ``error`` text passed to them.

You can exit with ``sys.exit(exc.code)`` if you want to show the messages
to the user without traceback. ``error`` messages are given precedence in that
case.

A JSON API example
-------------------------------------------------------------------------------

Here is a quick example: validation of
`create a gist <http://developer.github.com/v3/gists/>`_
request from github API.

.. code:: python

    >>> gist = '''{"description": "the description for this gist",
    ...            "public": true,
    ...            "files": {
    ...                "file1.txt": {"content": "String file contents"},
    ...                "other.txt": {"content": "Another file contents"}}}'''

    >>> from schema import Schema, And, Use, Optional

    >>> import json

    >>> gist_schema = Schema(And(Use(json.loads),  # first convert from JSON
    ...                          # use basestring since json returns unicode
    ...                          {Optional('description'): basestring,
    ...                           'public': bool,
    ...                           'files': {basestring: {'content': basestring}}}))

    >>> gist = gist_schema.validate(gist)

    # gist:
    {u'description': u'the description for this gist',
     u'files': {u'file1.txt': {u'content': u'String file contents'},
                u'other.txt': {u'content': u'Another file contents'}},
     u'public': True}

Using **schema** with `docopt <http://github.com/docopt/docopt>`_
-------------------------------------------------------------------------------

Assume you are using **docopt** with the following usage-pattern:

    Usage: my_program.py [--count=N] <path> <files>...

and you would like to validate that ``<files>`` are readable, and that
``<path>`` exists, and that ``--count`` is either integer from 0 to 5, or
``None``.

Assuming **docopt** returns the following dict:

.. code:: python

    >>> args = {'<files>': ['LICENSE-MIT', 'setup.py'],
    ...         '<path>': '../',
    ...         '--count': '3'}

this is how you validate it using ``schema``:

.. code:: python

    >>> from schema import Schema, And, Or, Use
    >>> import os

    >>> s = Schema({'<files>': [Use(open)],
    ...             '<path>': os.path.exists,
    ...             '--count': Or(None, And(Use(int), lambda n: 0 < n < 5))})

    >>> args = s.validate(args)

    >>> args['<files>']
    [<open file 'LICENSE-MIT', mode 'r' at 0x...>, <open file 'setup.py', mode 'r' at 0x...>]

    >>> args['<path>']
    '../'

    >>> args['--count']
    3

As you can see, **schema** validated data successfully, opened files and
converted ``'3'`` to ``int``.

JSON schema
-----------

You can also generate standard `draft-07 JSON schema <https://json-schema.org/>`_ from a dict ``Schema``.
This can be used to add word completion, validation, and documentation directly in code editors.
The output schema can also be used with JSON schema compatible libraries.

JSON: Generating
~~~~~~~~~~~~~~~~

Just define your schema normally and call ``.json_schema()`` on it. The output is a Python dict, you need to dump it to JSON.

.. code:: python

    >>> from schema import Optional, Schema
    >>> import json
    >>> s = Schema({"test": str,
    ...             "nested": {Optional("other"): str}
    ...             })
    >>> json_schema = json.dumps(s.json_schema("https://example.com/my-schema.json"))

    # json_schema
    {
        "type":"object",
        "properties": {
            "test": {"type": "string"},
            "nested": {
                "type":"object",
                "properties": {
                    "other": {"type": "string"}
                },
                "required": [],
                "additionalProperties": false
            }
        },
        "required":[
            "test",
            "nested"
        ],
        "additionalProperties":false,
        "$id":"https://example.com/my-schema.json",
        "$schema":"http://json-schema.org/draft-07/schema#"
    }

You can add descriptions for the schema elements using the ``Literal`` object instead of a string. The main schema can also have a description.

These will appear in IDEs to help your users write a configuration.

.. code:: python

    >>> from schema import Literal, Schema
    >>> import json
    >>> s = Schema({Literal("project_name", description="Names must be unique"): str}, description="Project schema")
    >>> json_schema = json.dumps(s.json_schema("https://example.com/my-schema.json"), indent=4)

    # json_schema
    {
        "type": "object",
        "properties": {
            "project_name": {
                "description": "Names must be unique",
                "type": "string"
            }
        },
        "required": [
            "project_name"
        ],
        "additionalProperties": false,
        "$id": "https://example.com/my-schema.json",
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Project schema"
    }


JSON: Supported validations
~~~~~~~~~~~~~~~~~~~~~~~~~~~

The main schema must be a dict. i.e. ``Schema({"test": str})`` works but ``Schema(str)`` does not.
The following examples will assume the main schema is a dict.

The resulting JSON schema is not guaranteed to accept the same objects as the library would accept, since some validations are not implemented or
have no JSON schema equivalent. This is the case of the ``Use`` and ``Hook`` objects for example.

Implemented
'''''''''''

`Object properties <https://json-schema.org/understanding-json-schema/reference/object.html#properties>`_
    Use a dict literal. The dict keys are the JSON schema properties.

    Example:

    ``Schema({"test": str})``

    becomes

    ``{'type': 'object', 'properties': {'test': {'type': 'string'}}, 'required': ['test'], 'additionalProperties': False}``.

    Please note that attributes are required by default. To create optional attributes use ``Optional``, like so:

    ``Schema({Optional("test"): str})``

    becomes

    ``{'type': 'object', 'properties': {'test': {'type': 'string'}}, 'required': [], 'additionalProperties': False}``

Types
    Use the Python type name directly. It will be converted to the JSON name:

    - ``str`` -> `string <https://json-schema.org/understanding-json-schema/reference/string.html>`_
    - ``int`` -> `integer <https://json-schema.org/understanding-json-schema/reference/numeric.html#integer>`_
    - ``float`` -> `number <https://json-schema.org/understanding-json-schema/reference/numeric.html#number>`_
    - ``bool`` -> `boolean <https://json-schema.org/understanding-json-schema/reference/boolean.html>`_
    - ``list`` -> `array <https://json-schema.org/understanding-json-schema/reference/array.html>`_
    - ``dict`` -> `object <https://json-schema.org/understanding-json-schema/reference/object.html>`_

    Example:

    ``Schema(float)``

    becomes

    ``{"type": "number"}``

`Array items <https://json-schema.org/understanding-json-schema/reference/array.html#items>`_
    Surround a schema with ``[]``.

    Example:

    ``Schema([str])`` means an array of string and becomes:

    ``{'type': 'array', 'items': {'type': 'string'}}``

`Enumerated values <https://json-schema.org/understanding-json-schema/reference/generic.html#enumerated-values>`_
    List the accepted values.

    Example:

    ``Schema([1, 2, 3])`` becomes

    ``{"enum": [1, 2, 3]}``

`Constant values <https://json-schema.org/understanding-json-schema/reference/generic.html#constant-values>`_
    Use the value itself.

    Example:

    ``Schema("name")`` becomes

    ``{"const": "name"}``

`Regular expressions <https://json-schema.org/understanding-json-schema/reference/regular_expressions.html>`_
    Use ``Regex``.

    Example:

    ``Regex("^v\d+")`` becomes

    ``{'type': 'string', 'pattern': '^v\\d+'}``

`Annotations (title and description) <https://json-schema.org/understanding-json-schema/reference/generic.html#annotations>`_
    You can use the ``name`` and ``description`` parameters of the ``Schema`` object init method.

    To add description to keys, replace a str with a ``Literal`` object.

    Example:

    ``Schema({Literal("test", description="A description"): str})``

    is equivalent to

    ``Schema({"test": str})``

    with the description added to the resulting JSON schema.

`Combining schemas with allOf <https://json-schema.org/understanding-json-schema/reference/combining.html#allof>`_
    Use ``And``

    Example:

    ``Schema(And(str, "value")``

    becomes

    ``{"allOf": [{"type": "string"}, {"const": "value"}]}``

    Note that this example is not really useful in the real world, since ``const`` already implies the type.

`Combining schemas with anyOf <https://json-schema.org/understanding-json-schema/reference/combining.html#anyof>`_
    Use ``Or``

    Example:

    ``Schema(Or(str, int))``

    becomes

    ``{"anyOf": [{"type": "string"}, {"type": "integer"}]}``


Not implemented
'''''''''''''''

The following JSON schema validations cannot be generated from this library.

- `String length <https://json-schema.org/understanding-json-schema/reference/string.html#length>`_
    However, those can be implemented using ``Regex``
- `String format <https://json-schema.org/understanding-json-schema/reference/string.html#format>`_
    However, those can be implemented using ``Regex``
- `Object dependencies <https://json-schema.org/understanding-json-schema/reference/object.html#dependencies>`_
- `Array length <https://json-schema.org/understanding-json-schema/reference/array.html#length>`_
- `Array uniqueness <https://json-schema.org/understanding-json-schema/reference/array.html#uniqueness>`_
- `Numeric multiples <https://json-schema.org/understanding-json-schema/reference/numeric.html#multiples>`_
- `Numeric ranges <https://json-schema.org/understanding-json-schema/reference/numeric.html#range>`_
- `Property Names <https://json-schema.org/understanding-json-schema/reference/object.html#property-names>`_
    Not implemented. We suggest listing the possible keys instead. As a tip, you can use ``Or`` as a dict key.

    Example:

    ``Schema({Or("name1", "name2"): str})``
- `Annotations (default and examples) <https://json-schema.org/understanding-json-schema/reference/generic.html#annotations>`_
- `Combining schemas with oneOf <https://json-schema.org/understanding-json-schema/reference/combining.html#oneof>`_
- `Not <https://json-schema.org/understanding-json-schema/reference/combining.html#not>`_
- `Object size <https://json-schema.org/understanding-json-schema/reference/object.html#size>`_


JSON: Minimizing output size
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Explicit Reuse
''''''''''''''

If your JSON schema is big and has a lot of repetition, it can be made simpler and smaller by defining Schema objects as reference.
These references will be placed in a "definitions" section in the main schema.

`You can look at the JSON schema documentation for more information <https://json-schema.org/understanding-json-schema/structuring.html#reuse>`_

.. code:: python

    >>> from schema import Optional, Schema
    >>> import json
    >>> s = Schema({"test": str,
    ...             "nested": Schema({Optional("other"): str}, name="nested", as_reference=True)
    ...             })
    >>> json_schema = json.dumps(s.json_schema("https://example.com/my-schema.json"), indent=4)

    # json_schema
    {
        "type": "object",
        "properties": {
            "test": {
                "type": "string"
            },
            "nested": {
                "$ref": "#/definitions/nested"
            }
        },
        "required": [
            "test",
            "nested"
        ],
        "additionalProperties": false,
        "$id": "https://example.com/my-schema.json",
        "$schema": "http://json-schema.org/draft-07/schema#",
        "definitions": {
            "nested": {
                "type": "object",
                "properties": {
                    "other": {
                        "type": "string"
                    }
                },
                "required": [],
                "additionalProperties": false
            }
        }
    }

This becomes really useful when using the same object several times

.. code:: python

    >>> from schema import Optional, Or, Schema
    >>> import json
    >>> language_configuration = Schema({"autocomplete": bool, "stop_words": [str]}, name="language", as_reference=True)
    >>> s = Schema({Or("ar", "cs", "de", "el", "eu", "en", "es", "fr"): language_configuration})
    >>> json_schema = json.dumps(s.json_schema("https://example.com/my-schema.json"), indent=4)

    # json_schema
    {
        "type": "object",
        "properties": {
            "ar": {
                "$ref": "#/definitions/language"
            },
            "cs": {
                "$ref": "#/definitions/language"
            },
            "de": {
                "$ref": "#/definitions/language"
            },
            "el": {
                "$ref": "#/definitions/language"
            },
            "eu": {
                "$ref": "#/definitions/language"
            },
            "en": {
                "$ref": "#/definitions/language"
            },
            "es": {
                "$ref": "#/definitions/language"
            },
            "fr": {
                "$ref": "#/definitions/language"
            }
        },
        "required": [],
        "additionalProperties": false,
        "$id": "https://example.com/my-schema.json",
        "$schema": "http://json-schema.org/draft-07/schema#",
        "definitions": {
            "language": {
                "type": "object",
                "properties": {
                    "autocomplete": {
                        "type": "boolean"
                    },
                    "stop_words": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                },
                "required": [
                    "autocomplete",
                    "stop_words"
                ],
                "additionalProperties": false
            }
        }
    }

Automatic reuse
'''''''''''''''

If you want to minimize the output size without using names explicitly, you can have the library generate hashes of parts of the output JSON
schema and use them as references throughout.

Enable this behaviour by providing the parameter ``use_refs`` to the json_schema method.

Be aware that this method is less often compatible with IDEs and JSON schema libraries.
It produces a JSON schema that is more difficult to read by humans.

.. code:: python

    >>> from schema import Optional, Or, Schema
    >>> import json
    >>> language_configuration = Schema({"autocomplete": bool, "stop_words": [str]})
    >>> s = Schema({Or("ar", "cs", "de", "el", "eu", "en", "es", "fr"): language_configuration})
    >>> json_schema = json.dumps(s.json_schema("https://example.com/my-schema.json", use_refs=True), indent=4)

    # json_schema
    {
        "type": "object",
        "properties": {
            "ar": {
                "type": "object",
                "properties": {
                    "autocomplete": {
                        "type": "boolean",
                        "$id": "#6456104181059880193"
                    },
                    "stop_words": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "$id": "#1856069563381977338"
                        }
                    }
                },
                "required": [
                    "autocomplete",
                    "stop_words"
                ],
                "additionalProperties": false
            },
            "cs": {
                "type": "object",
                "properties": {
                    "autocomplete": {
                        "$ref": "#6456104181059880193"
                    },
                    "stop_words": {
                        "type": "array",
                        "items": {
                            "$ref": "#1856069563381977338"
                        },
                        "$id": "#-5377945144312515805"
                    }
                },
                "required": [
                    "autocomplete",
                    "stop_words"
                ],
                "additionalProperties": false
            },
            "de": {
                "type": "object",
                "properties": {
                    "autocomplete": {
                        "$ref": "#6456104181059880193"
                    },
                    "stop_words": {
                        "$ref": "#-5377945144312515805"
                    }
                },
                "required": [
                    "autocomplete",
                    "stop_words"
                ],
                "additionalProperties": false,
                "$id": "#-8142886105174600858"
            },
            "el": {
                "$ref": "#-8142886105174600858"
            },
            "eu": {
                "$ref": "#-8142886105174600858"
            },
            "en": {
                "$ref": "#-8142886105174600858"
            },
            "es": {
                "$ref": "#-8142886105174600858"
            },
            "fr": {
                "$ref": "#-8142886105174600858"
            }
        },
        "required": [],
        "additionalProperties": false,
        "$id": "https://example.com/my-schema.json",
        "$schema": "http://json-schema.org/draft-07/schema#"
    }
PK�(�\�Yď)doc/alt-python37-setuptools-wheel/LICENSEnu�[���Copyright Jason R. Coombs

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
PK�(�\�>��1�1doc/alt-python37-libs/LICENSEnu�[���A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations, which became
Zope Corporation.  In 2001, the Python Software Foundation (PSF, see
https://www.python.org/psf/) was formed, a non-profit organization
created specifically to own Python-related Intellectual Property.
Zope Corporation was a sponsoring member of the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation;
All Rights Reserved" are retained in Python alone or in any derivative version
prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
PK�(�\�$,ee+doc/alt-python37-libs/systemtap-example.stpnu�[���/*
    Example usage of the Python systemtap tapset to show a nested view of all
    Python function calls (and returns) across the whole system.

    Run this using
        stap systemtap-example.stp
    to instrument all Python processes on the system, or (for example) using
        stap systemtap-example.stp -c COMMAND
    to instrument a specific program (implemented in Python)
*/
probe python.function.entry
{
  printf("%s => %s in %s:%d\n", thread_indent(1), funcname, filename, lineno);
}

probe python.function.return
{
  printf("%s <= %s in %s:%d\n", thread_indent(-1), funcname, filename, lineno);
}
PK�(�\"z���&�& doc/alt-python37-libs/README.rstnu�[���This is Python version 3.7.17
=============================

.. image:: https://travis-ci.org/python/cpython.svg?branch=3.7
   :alt: CPython build status on Travis CI
   :target: https://travis-ci.org/python/cpython/branches

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=3.7
   :alt: CPython build status on Azure Pipelines
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=3.7

.. image:: https://codecov.io/gh/python/cpython/branch/3.7/graph/badge.svg
   :alt: CPython code coverage on Codecov
   :target: https://codecov.io/gh/python/cpython/branch/3.7

Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

See the end of this file for further copyright and license information.

.. contents::

General Information
-------------------

- Website: https://www.python.org
- Source code: https://github.com/python/cpython
- Issue tracker: https://github.com/python/cpython/issues/
- Documentation: https://docs.python.org
- Developer's Guide: https://devguide.python.org/

Contributing to CPython
-----------------------

For more complete instructions on contributing to CPython development,
see the `Developer Guide`_.

.. _Developer Guide: https://devguide.python.org/

Using Python
------------

Installable Python kits, and information about using Python, are available at
`python.org`_.

.. _python.org: https://www.python.org/

Build Instructions
------------------

On Unix, Linux, BSD, macOS, and Cygwin::

    ./configure
    make
    make test
    sudo make install

This will install Python as ``python3``.

You can pass many options to the configure script; run ``./configure --help``
to find out more.  On macOS case-insensitive file systems and on Cygwin,
the executable is called ``python.exe``; elsewhere it's just ``python``.

Building a complete Python installation requires the use of various
additional third-party libraries, depending on your build platform and
configure options.  Not all standard library modules are buildable or
useable on all platforms.  Refer to the
`Install dependencies <https://devguide.python.org/setup/#install-dependencies>`_
section of the `Developer Guide`_ for current detailed information on
dependencies for various Linux distributions and macOS.

On macOS, there are additional configure and build options related
to macOS framework and universal builds.  Refer to `Mac/README.rst
<https://github.com/python/cpython/blob/3.7/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/3.7/PCbuild/readme.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the toplevel first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.


Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavour. Note that this is just an intermediary step.  The
binary resulting from this step is not good for real life workloads as it has
profiling instructions embedded inside.

After the instrumented interpreter is built, the Makefile will run a training
workload.  This is necessary in order to profile the interpreter execution.
Note also that any output, both stdout and stderr, that may appear at this step
is suppressed.

The final step is to build the actual interpreter, using the information
collected from the instrumented one.  The end result will be a Python binary
that is optimized; suitable for distribution or production installation.


Link Time Optimization
^^^^^^^^^^^^^^^^^^^^^^

Enabled via configure's ``--with-lto`` flag.  LTO takes advantage of the
ability of recent compiler toolchains to optimize across the otherwise
arbitrary ``.o`` file boundary when building final executables or shared
libraries for additional performance gains.


What's New
----------

We have a comprehensive overview of the changes in the `What's New in Python
3.7 <https://docs.python.org/3.7/whatsnew/3.7.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/blob/3.7/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/3.7>`_.

If you want to install multiple versions of Python see the section below
entitled "Installing multiple versions".


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

`Documentation for Python 3.7 <https://docs.python.org/3.7/>`_ is online,
updated daily.

It can also be downloaded in many formats for faster access.  The documentation
is downloadable in HTML, PDF, and reStructuredText formats; the latter version
is primarily for documentation authors, translators, and people with special
formatting requirements.

For information about building Python's documentation, refer to `Doc/README.rst
<https://github.com/python/cpython/blob/3.7/Doc/README.rst>`_.


Converting From Python 2.x to 3.x
---------------------------------

Significant backward incompatible changes were made for the release of Python
3.0, which may cause programs written for Python 2 to fail when run with Python
3.  For more information about porting your code from Python 2 to Python 3, see
the `Porting HOWTO <https://docs.python.org/3/howto/pyporting.html>`_.


Testing
-------

To test the interpreter, type ``make test`` in the top-level directory.  The
test set produces some output.  You can generally ignore the messages about
skipped tests due to optional features which can't be imported.  If a message
is printed about a failed test or a traceback or core dump is produced,
something is wrong.

By default, tests are prevented from overusing resources like disk space and
memory.  To enable these tests, run ``make testall``.

If any tests fail, you can re-run the failing test(s) in verbose mode.  For
example, if ``test_os`` and ``test_gdb`` failed, you can run::

    make test TESTOPTS="-v test_os test_gdb"

If the failure persists and appears to be a problem with Python rather than
your environment, you can `file a bug report <https://github.com/python/cpython/issues/>`_ and
include relevant output from that command to show the issue.

See `Running & Writing Tests <https://devguide.python.org/runtests/>`_
for more on running tests.

Installing multiple versions
----------------------------

On Unix and Mac systems if you intend to install multiple versions of Python
using the same installation prefix (``--prefix`` argument to the configure
script) you must take care that your primary python executable is not
overwritten by the installation of a different version.  All files and
directories installed using ``make altinstall`` contain the major and minor
version and can thus live side-by-side.  ``make install`` also creates
``${prefix}/bin/python3`` which refers to ``${prefix}/bin/pythonX.Y``.  If you
intend to install multiple versions using the same prefix you must decide which
version (if any) is your "primary" version.  Install that version using ``make
install``.  Install all other versions using ``make altinstall``.

For example, if you want to install Python 2.7, 3.6, and 3.7 with 3.7 being the
primary version, you would execute ``make install`` in your 3.7 build directory
and ``make altinstall`` in the others.


Issue Tracker and Mailing List
------------------------------

Bug reports are welcome!  You can use the `issue tracker
<https://github.com/python/cpython/issues/>`_ to report bugs, and/or submit pull requests `on
GitHub <https://github.com/python/cpython>`_.

You can also follow development discussion on the `python-dev mailing list
<https://mail.python.org/mailman/listinfo/python-dev/>`_.


Proposals for enhancement
-------------------------

If you have a proposal to change Python, you may want to send an email to the
comp.lang.python or `python-ideas`_ mailing lists for initial feedback.  A
Python Enhancement Proposal (PEP) may be submitted if your idea gains ground.
All current PEPs, as well as guidelines for submitting a new PEP, are listed at
`python.org/dev/peps/ <https://www.python.org/dev/peps/>`_.

.. _python-ideas: https://mail.python.org/mailman/listinfo/python-ideas/


Release Schedule
----------------

See :pep:`537` for Python 3.7 release details.


Copyright and License Information
---------------------------------

Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

Copyright © 2000 BeOpen.com.  All rights reserved.

Copyright © 1995-2001 Corporation for National Research Initiatives.  All
rights reserved.

Copyright © 1991-1995 Stichting Mathematisch Centrum.  All rights reserved.

See the file "LICENSE" for information on the history of this software, terms &
conditions for usage, and a DISCLAIMER OF ALL WARRANTIES.

This Python distribution contains *no* GNU General Public License (GPL) code,
so it may be used in proprietary projects.  There are interfaces to some GNU
code but these are entirely optional.

All trademarks referenced herein are property of their respective holders.
PK�(�\5�Ә"doc/alt-python37-libs/pyfuntop.stpnu�[���#!/usr/bin/stap 

global fn_calls;

probe python.function.entry
{ 
  fn_calls[pid(), filename, funcname, lineno] += 1;
}

probe timer.ms(1000) {
    printf("\033[2J\033[1;1H") /* clear screen */
    printf("%6s %80s %6s %30s %6s\n",
           "PID", "FILENAME", "LINE", "FUNCTION", "CALLS")
    foreach ([pid, filename, funcname, lineno] in fn_calls- limit 20) {
        printf("%6d %80s %6d %30s %6d\n",
            pid, filename, lineno, funcname,
            fn_calls[pid, filename, funcname, lineno]);
    }

    delete fn_calls;
}
PK�(�\���3{"{"+doc/alt-python37-devel/valgrind-python.suppnu�[���#
# This is a valgrind suppression file that should be used when using valgrind.
#
#  Here's an example of running valgrind:
#
#	cd python/dist/src
#	valgrind --tool=memcheck --suppressions=Misc/valgrind-python.supp \
#		./python -E ./Lib/test/regrtest.py -u gui,network
#
# You must edit Objects/obmalloc.c and uncomment Py_USING_MEMORY_DEBUGGER
# to use the preferred suppressions with address_in_range.
#
# If you do not want to recompile Python, you can uncomment
# suppressions for _PyObject_Free and _PyObject_Realloc.
#
# See Misc/README.valgrind for more information.

# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
{
   ADDRESS_IN_RANGE/Invalid read of size 4
   Memcheck:Addr4
   fun:address_in_range
}

{
   ADDRESS_IN_RANGE/Invalid read of size 4
   Memcheck:Value4
   fun:address_in_range
}

{
   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
   Memcheck:Value8
   fun:address_in_range
}

{
   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
   Memcheck:Cond
   fun:address_in_range
}

#
# Leaks (including possible leaks)
#    Hmmm, I wonder if this masks some real leaks.  I think it does.
#    Will need to fix that.
#

{
   Suppress leaking the GIL.  Happens once per process, see comment in ceval.c.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_allocate_lock
   fun:PyEval_InitThreads
}

{
   Suppress leaking the GIL after a fork.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_allocate_lock
   fun:PyEval_ReInitThreads
}

{
   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_create_key
   fun:_PyGILState_Init
   fun:Py_InitializeEx
   fun:Py_Main
}

{
   Hmmm, is this a real leak or like the GIL?
   Memcheck:Leak
   fun:malloc
   fun:PyThread_ReInitTLS
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:realloc
   fun:_PyObject_GC_Resize
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:malloc
   fun:_PyObject_GC_New
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:malloc
   fun:_PyObject_GC_NewVar
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

#
# Non-python specific leaks
#

{
   Handle pthread issue (possibly leaked)
   Memcheck:Leak
   fun:calloc
   fun:allocate_dtv
   fun:_dl_allocate_tls_storage
   fun:_dl_allocate_tls
}

{
   Handle pthread issue (possibly leaked)
   Memcheck:Leak
   fun:memalign
   fun:_dl_allocate_tls_storage
   fun:_dl_allocate_tls
}

###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Addr4
###   fun:_PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Value4
###   fun:_PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Addr8
###   fun:_PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Value8
###   fun:_PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
###   Memcheck:Cond
###   fun:_PyObject_Free
###}

###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Addr4
###   fun:_PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Value4
###   fun:_PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Addr8
###   fun:_PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Use of uninitialised value of size 8
###   Memcheck:Value8
###   fun:_PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
###   Memcheck:Cond
###   fun:_PyObject_Realloc
###}

###
### All the suppressions below are for errors that occur within libraries
### that Python uses.  The problems to not appear to be related to Python's
### use of the libraries.
###

{
   Generic ubuntu ld problems
   Memcheck:Addr8
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
}

{
   Generic gentoo ld problems
   Memcheck:Cond
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
}

{
   DBM problems, see test_dbm
   Memcheck:Param
   write(buf)
   fun:write
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_close
}

{
   DBM problems, see test_dbm
   Memcheck:Value8
   fun:memmove
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   DBM problems, see test_dbm
   Memcheck:Cond
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   DBM problems, see test_dbm
   Memcheck:Cond
   fun:memmove
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   GDBM problems, see test_gdbm
   Memcheck:Param
   write(buf)
   fun:write
   fun:gdbm_open

}

{
   Uninitialised byte(s) false alarm, see bpo-35561
   Memcheck:Param
   epoll_ctl(event)
   fun:epoll_ctl
   fun:pyepoll_internal_ctl
}

{
   ZLIB problems, see test_gzip
   Memcheck:Cond
   obj:/lib/libz.so.1.2.3
   obj:/lib/libz.so.1.2.3
   fun:deflate
}

{
   Avoid problems w/readline doing a putenv and leaking on exit
   Memcheck:Leak
   fun:malloc
   fun:xmalloc
   fun:sh_set_lines_and_columns
   fun:_rl_get_screen_size
   fun:_rl_init_terminal_io
   obj:/lib/libreadline.so.4.3
   fun:rl_initialize
}

# Valgrind emits "Conditional jump or move depends on uninitialised value(s)"
# false alarms on GCC builtin strcmp() function. The GCC code is correct.
#
# Valgrind bug: https://bugs.kde.org/show_bug.cgi?id=264936
{
   bpo-38118: Valgrind emits false alarm on GCC builtin strcmp()
   Memcheck:Cond
   fun:PyUnicode_Decode
}


###
### These occur from somewhere within the SSL, when running
###  test_socket_sll.  They are too general to leave on by default.
###
###{
###   somewhere in SSL stuff
###   Memcheck:Cond
###   fun:memset
###}
###{
###   somewhere in SSL stuff
###   Memcheck:Value4
###   fun:memset
###}
###
###{
###   somewhere in SSL stuff
###   Memcheck:Cond
###   fun:MD5_Update
###}
###
###{
###   somewhere in SSL stuff
###   Memcheck:Value4
###   fun:MD5_Update
###}

# Fedora's package "openssl-1.0.1-0.1.beta2.fc17.x86_64" on x86_64
# See http://bugs.python.org/issue14171
{
   openssl 1.0.1 prng 1
   Memcheck:Cond
   fun:bcmp
   fun:fips_get_entropy
   fun:FIPS_drbg_instantiate
   fun:RAND_init_fips
   fun:OPENSSL_init_library
   fun:SSL_library_init
   fun:init_hashlib
}

{
   openssl 1.0.1 prng 2
   Memcheck:Cond
   fun:fips_get_entropy
   fun:FIPS_drbg_instantiate
   fun:RAND_init_fips
   fun:OPENSSL_init_library
   fun:SSL_library_init
   fun:init_hashlib
}

{
   openssl 1.0.1 prng 3
   Memcheck:Value8
   fun:_x86_64_AES_encrypt_compact
   fun:AES_encrypt
}

#
# All of these problems come from using test_socket_ssl
#
{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_bin2bn
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_num_bits_word
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:BN_num_bits_word
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_mod_exp_mont_word
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_mod_exp_mont
}

{
   from test_socket_ssl
   Memcheck:Param
   write(buf)
   fun:write
   obj:/usr/lib/libcrypto.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:RSA_verify
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:RSA_verify
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:DES_set_key_unchecked
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:DES_encrypt2
}

{
   from test_socket_ssl
   Memcheck:Cond
   obj:/usr/lib/libssl.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Value4
   obj:/usr/lib/libssl.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BUF_MEM_grow_clean
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:memcpy
   fun:ssl3_read_bytes
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:SHA1_Update
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:SHA1_Update
}

{
   test_buffer_non_debug
   Memcheck:Addr4
   fun:PyUnicodeUCS2_FSConverter
}

{
   test_buffer_non_debug
   Memcheck:Addr4
   fun:PyUnicode_FSConverter
}

{
   wcscmp_false_positive
   Memcheck:Addr8
   fun:wcscmp
   fun:_PyOS_GetOpt
   fun:Py_Main
   fun:main
}

# Additional suppressions for the unified decimal tests:
{
   test_decimal
   Memcheck:Addr4
   fun:PyUnicodeUCS2_FSConverter
}

{
   test_decimal2
   Memcheck:Addr4
   fun:PyUnicode_FSConverter
}

PK�(�\{\�?��doc/alt-python37-devel/gdbinitnu�[���# If you use the GNU debugger gdb to debug the Python C runtime, you
# might find some of the following commands useful.  Copy this to your
# ~/.gdbinit file and it'll get loaded into gdb automatically when you
# start it up.  Then, at the gdb prompt you can do things like:
#
#    (gdb) pyo apyobjectptr
#    <module 'foobar' (built-in)>
#    refcounts: 1
#    address    : 84a7a2c
#    $1 = void
#    (gdb)
#
# NOTE: If you have gdb 7 or later, it supports debugging of Python directly
# with embedded macros that you may find superior to what is in here.
# See Tools/gdb/libpython.py and http://bugs.python.org/issue8032.

# Prints a representation of the object to stderr, along with the
# number of reference counts it current has and the hex address the
# object is allocated at.  The argument must be a PyObject*
define pyo
    # side effect of calling _PyObject_Dump is to dump the object's
    # info - assigning just prevents gdb from printing the
    # NULL return value
    set $_unused_void = _PyObject_Dump($arg0)
end

# Prints a representation of the object to stderr, along with the
# number of reference counts it current has and the hex address the
# object is allocated at.  The argument must be a PyGC_Head*
define pyg
    print _PyGC_Dump($arg0)
end

# print the local variables of the current frame
define pylocals
    set $_i = 0
    while $_i < f->f_code->co_nlocals
	if f->f_localsplus + $_i != 0
	    set $_names = f->f_code->co_varnames
	    set $_name = PyUnicode_AsUTF8(PyTuple_GetItem($_names, $_i))
	    printf "%s:\n", $_name
            pyo f->f_localsplus[$_i]
	end
        set $_i = $_i + 1
    end
end

# A rewrite of the Python interpreter's line number calculator in GDB's
# command language
define lineno
    set $__continue = 1
    set $__co = f->f_code
    set $__lasti = f->f_lasti
    set $__sz = ((PyVarObject *)$__co->co_lnotab)->ob_size/2
    set $__p = (unsigned char *)((PyBytesObject *)$__co->co_lnotab)->ob_sval
    set $__li = $__co->co_firstlineno
    set $__ad = 0
    while ($__sz-1 >= 0 && $__continue)
      set $__sz = $__sz - 1
      set $__ad = $__ad + *$__p
      set $__p = $__p + 1
      if ($__ad > $__lasti)
	set $__continue = 0
      else
        set $__li = $__li + *$__p
        set $__p = $__p + 1
      end
    end
    printf "%d", $__li
end

# print the current frame - verbose
define pyframev
    pyframe
    pylocals
end

define pyframe
    set $__fn = PyUnicode_AsUTF8(f->f_code->co_filename)
    set $__n = PyUnicode_AsUTF8(f->f_code->co_name)
    printf "%s (", $__fn
    lineno
    printf "): %s\n", $__n
### Uncomment these lines when using from within Emacs/XEmacs so it will
### automatically track/display the current Python source line
#    printf "%c%c%s:", 032, 032, $__fn
#    lineno
#    printf ":1\n"
end

### Use these at your own risk.  It appears that a bug in gdb causes it
### to crash in certain circumstances.

#define up
#    up-silently 1
#    printframe
#end

#define down
#    down-silently 1
#    printframe
#end

define printframe
    if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	pyframe
    else
        frame
    end
end

# Here's a somewhat fragile way to print the entire Python stack from gdb.
# It's fragile because the tests for the value of $pc depend on the layout
# of specific functions in the C source code.

# Explanation of while and if tests: We want to pop up the stack until we
# land in Py_Main (this is probably an incorrect assumption in an embedded
# interpreter, but the test can be extended by an interested party).  If
# Py_Main <= $pc <= Py_GetArgcArv is true, $pc is in Py_Main(), so the while
# tests succeeds as long as it's not true.  In a similar fashion the if
# statement tests to see if we are in PyEval_EvalFrameEx().

# Note: The name of the main interpreter function and the function which
# follow it has changed over time.  This version of pystack works with this
# version of Python.  If you try using it with older or newer versions of
# the interpreter you may will have to change the functions you compare with
# $pc.

# print the entire Python call stack
define pystack
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	    pyframe
        end
        up-silently 1
    end
    select-frame 0
end

# print the entire Python call stack - verbose mode
define pystackv
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	    pyframev
        end
        up-silently 1
    end
    select-frame 0
end

# generally useful macro to print a Unicode string
define pu
  set $uni = $arg0
  set $i = 0
  while (*$uni && $i++<100)
    if (*$uni < 0x80)
      print *(char*)$uni++
    else
      print /x *(short*)$uni++
    end
  end
end
PK�(�\Vx�;��&doc/alt-python37-devel/README.valgrindnu�[���This document describes some caveats about the use of Valgrind with
Python.  Valgrind is used periodically by Python developers to try
to ensure there are no memory leaks or invalid memory reads/writes.

UPDATE: Python 3.6 now supports PYTHONMALLOC=malloc environment variable which
can be used to force the usage of the malloc() allocator of the C library.

If you don't want to read about the details of using Valgrind, there
are still two things you must do to suppress the warnings.  First,
you must use a suppressions file.  One is supplied in
Misc/valgrind-python.supp.  Second, you must do one of the following:

  * Uncomment Py_USING_MEMORY_DEBUGGER in Objects/obmalloc.c,
    then rebuild Python
  * Uncomment the lines in Misc/valgrind-python.supp that
    suppress the warnings for PyObject_Free and PyObject_Realloc

If you want to use Valgrind more effectively and catch even more
memory leaks, you will need to configure python --without-pymalloc.
PyMalloc allocates a few blocks in big chunks and most object
allocations don't call malloc, they use chunks doled about by PyMalloc
from the big blocks.  This means Valgrind can't detect
many allocations (and frees), except for those that are forwarded
to the system malloc.  Note: configuring python --without-pymalloc
makes Python run much slower, especially when running under Valgrind.
You may need to run the tests in batches under Valgrind to keep
the memory usage down to allow the tests to complete.  It seems to take
about 5 times longer to run --without-pymalloc.

Apr 15, 2006:
  test_ctypes causes Valgrind 3.1.1 to fail (crash).
  test_socket_ssl should be skipped when running valgrind.
	The reason is that it purposely uses uninitialized memory.
	This causes many spurious warnings, so it's easier to just skip it.


Details:
--------
Python uses its own small-object allocation scheme on top of malloc,
called PyMalloc.

Valgrind may show some unexpected results when PyMalloc is used.
Starting with Python 2.3, PyMalloc is used by default.  You can disable
PyMalloc when configuring python by adding the --without-pymalloc option.
If you disable PyMalloc, most of the information in this document and
the supplied suppressions file will not be useful.  As discussed above,
disabling PyMalloc can catch more problems.

If you use valgrind on a default build of Python,  you will see
many errors like:

        ==6399== Use of uninitialised value of size 4
        ==6399== at 0x4A9BDE7E: PyObject_Free (obmalloc.c:711)
        ==6399== by 0x4A9B8198: dictresize (dictobject.c:477)

These are expected and not a problem.  Tim Peters explains
the situation:

        PyMalloc needs to know whether an arbitrary address is one
	that's managed by it, or is managed by the system malloc.
	The current scheme allows this to be determined in constant
	time, regardless of how many memory areas are under pymalloc's
	control.

        The memory pymalloc manages itself is in one or more "arenas",
	each a large contiguous memory area obtained from malloc.
	The base address of each arena is saved by pymalloc
	in a vector.  Each arena is carved into "pools", and a field at
	the start of each pool contains the index of that pool's arena's
	base address in that vector.

        Given an arbitrary address, pymalloc computes the pool base
	address corresponding to it, then looks at "the index" stored
	near there.  If the index read up is out of bounds for the
	vector of arena base addresses pymalloc maintains, then
	pymalloc knows for certain that this address is not under
	pymalloc's control.  Otherwise the index is in bounds, and
	pymalloc compares

            the arena base address stored at that index in the vector

        to

            the arbitrary address pymalloc is investigating

        pymalloc controls this arbitrary address if and only if it lies
        in the arena the address's pool's index claims it lies in.

        It doesn't matter whether the memory pymalloc reads up ("the
	index") is initialized.  If it's not initialized, then
	whatever trash gets read up will lead pymalloc to conclude
	(correctly) that the address isn't controlled by it, either
	because the index is out of bounds, or the index is in bounds
	but the arena it represents doesn't contain the address.

        This determination has to be made on every call to one of
	pymalloc's free/realloc entry points, so its speed is critical
	(Python allocates and frees dynamic memory at a ferocious rate
	-- everything in Python, from integers to "stack frames",
	lives in the heap).
PK�(�\�t*^��"doc/alt-python37-requests/PKG-INFOnu�[���Metadata-Version: 2.1
Name: requests
Version: 2.26.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: Apache 2.0
Project-URL: Documentation, https://requests.readthedocs.io
Project-URL: Source, https://github.com/psf/requests
Description: # Requests
        
        **Requests** is a simple, yet elegant, HTTP library.
        
        ```python
        >>> import requests
        >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
        >>> r.status_code
        200
        >>> r.headers['content-type']
        'application/json; charset=utf8'
        >>> r.encoding
        'utf-8'
        >>> r.text
        '{"type":"User"...'
        >>> r.json()
        {'disk_usage': 368627, 'private_gists': 484, ...}
        ```
        
        Requests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method!
        
        Requests is one of the most downloaded Python package today, pulling in around `14M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `500,000+` repositories. You may certainly put your trust in this code.
        
        [![Downloads](https://pepy.tech/badge/requests/month)](https://pepy.tech/project/requests/month)
        [![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests)
        [![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors)
        
        ## Installing Requests and Supported Versions
        
        Requests is available on PyPI:
        
        ```console
        $ python -m pip install requests
        ```
        
        Requests officially supports Python 2.7 & 3.6+.
        
        ## Supported Features & Best–Practices
        
        Requests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today.
        
        - Keep-Alive & Connection Pooling
        - International Domains and URLs
        - Sessions with Cookie Persistence
        - Browser-style TLS/SSL Verification
        - Basic & Digest Authentication
        - Familiar `dict`–like Cookies
        - Automatic Content Decompression and Decoding
        - Multi-part File Uploads
        - SOCKS Proxy Support
        - Connection Timeouts
        - Streaming Downloads
        - Automatic honoring of `.netrc`
        - Chunked HTTP Requests
        
        ## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io)
        
        [![Read the Docs](https://raw.githubusercontent.com/psf/requests/master/ext/ss.png)](https://requests.readthedocs.io)
        
        ## Cloning the repository
        
        When cloning the Requests repository, you may need to add the `-c
        fetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit (see
        [this issue](https://github.com/psf/requests/issues/2690) for more background):
        
        ```shell
        git clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git
        ```
        
        You can also apply this setting to your global Git config:
        
        ```shell
        git config --global fetch.fsck.badTimezone ignore
        ```
        
        ---
        
        [![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/master/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/master/ext/psf.png)](https://www.python.org/psf)
        
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*
Description-Content-Type: text/markdown
Provides-Extra: security
Provides-Extra: socks
Provides-Extra: use_chardet_on_py3
PK�(�\��˞'�'!doc/alt-python37-requests/LICENSEnu�[���
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.
PK�(�\��xi�i�$doc/alt-python37-requests/HISTORY.mdnu�[���Release History
===============

dev
---

-   \[Short description of non-trivial change.\]

2.26.0 (2021-07-13)
-------------------

**Improvements**

- Requests now supports Brotli compression, if either the `brotli` or
  `brotlicffi` package is installed. (#5783)

- `Session.send` now correctly resolves proxy configurations from both
  the Session and Request. Behavior now matches `Session.request`. (#5681)

**Bugfixes**

- Fixed a race condition in zip extraction when using Requests in parallel
  from zip archive. (#5707)

**Dependencies**

- Instead of `chardet`, use the MIT-licensed `charset_normalizer` for Python3
  to remove license ambiguity for projects bundling requests. If `chardet`
  is already installed on your machine it will be used instead of `charset_normalizer`
  to keep backwards compatibility. (#5797)

  You can also install `chardet` while installing requests by
  specifying `[use_chardet_on_py3]` extra as follows:

    ```shell
    pip install "requests[use_chardet_on_py3]"
    ```

  Python2 still depends upon the `chardet` module.

- Requests now supports `idna` 3.x on Python 3. `idna` 2.x will continue to
  be used on Python 2 installations. (#5711)

**Deprecations**

- The `requests[security]` extra has been converted to a no-op install.
  PyOpenSSL is no longer the recommended secure option for Requests. (#5867)

- Requests has officially dropped support for Python 3.5. (#5867)

2.25.1 (2020-12-16)
-------------------

**Bugfixes**

- Requests now treats `application/json` as `utf8` by default. Resolving
  inconsistencies between `r.text` and `r.json` output. (#5673)

**Dependencies**

- Requests now supports chardet v4.x.

2.25.0 (2020-11-11)
------------------

**Improvements**

- Added support for NETRC environment variable. (#5643)

**Dependencies**

- Requests now supports urllib3 v1.26.

**Deprecations**

- Requests v2.25.x will be the last release series with support for Python 3.5.
- The `requests[security]` extra is officially deprecated and will be removed
  in Requests v2.26.0.

2.24.0 (2020-06-17)
-------------------

**Improvements**

- pyOpenSSL TLS implementation is now only used if Python
  either doesn't have an `ssl` module or doesn't support
  SNI. Previously pyOpenSSL was unconditionally used if available.
  This applies even if pyOpenSSL is installed via the
  `requests[security]` extra (#5443)

- Redirect resolution should now only occur when
  `allow_redirects` is True. (#5492)

- No longer perform unnecessary Content-Length calculation for
  requests that won't use it. (#5496)

2.23.0 (2020-02-19)
-------------------

**Improvements**

- Remove defunct reference to `prefetch` in Session `__attrs__` (#5110)

**Bugfixes**

- Requests no longer outputs password in basic auth usage warning. (#5099)

**Dependencies**

- Pinning for `chardet` and `idna` now uses major version instead of minor.
  This hopefully reduces the need for releases everytime a dependency is updated.

2.22.0 (2019-05-15)
-------------------

**Dependencies**

- Requests now supports urllib3 v1.25.2.
  (note: 1.25.0 and 1.25.1 are incompatible)

**Deprecations**

- Requests has officially stopped support for Python 3.4.

2.21.0 (2018-12-10)
-------------------

**Dependencies**

- Requests now supports idna v2.8.

2.20.1 (2018-11-08)
-------------------

**Bugfixes**

- Fixed bug with unintended Authorization header stripping for
  redirects using default ports (http/80, https/443).

2.20.0 (2018-10-18)
-------------------

**Bugfixes**

-   Content-Type header parsing is now case-insensitive (e.g.
    charset=utf8 v Charset=utf8).
-   Fixed exception leak where certain redirect urls would raise
    uncaught urllib3 exceptions.
-   Requests removes Authorization header from requests redirected
    from https to http on the same hostname. (CVE-2018-18074)
-   `should_bypass_proxies` now handles URIs without hostnames (e.g.
    files).

**Dependencies**

- Requests now supports urllib3 v1.24.

**Deprecations**

- Requests has officially stopped support for Python 2.6.

2.19.1 (2018-06-14)
-------------------

**Bugfixes**

-   Fixed issue where status\_codes.py's `init` function failed trying
    to append to a `__doc__` value of `None`.

2.19.0 (2018-06-12)
-------------------

**Improvements**

-   Warn user about possible slowdown when using cryptography version
    &lt; 1.3.4
-   Check for invalid host in proxy URL, before forwarding request to
    adapter.
-   Fragments are now properly maintained across redirects. (RFC7231
    7.1.2)
-   Removed use of cgi module to expedite library load time.
-   Added support for SHA-256 and SHA-512 digest auth algorithms.
-   Minor performance improvement to `Request.content`.
-   Migrate to using collections.abc for 3.7 compatibility.

**Bugfixes**

-   Parsing empty `Link` headers with `parse_header_links()` no longer
    return one bogus entry.
-   Fixed issue where loading the default certificate bundle from a zip
    archive would raise an `IOError`.
-   Fixed issue with unexpected `ImportError` on windows system which do
    not support `winreg` module.
-   DNS resolution in proxy bypass no longer includes the username and
    password in the request. This also fixes the issue of DNS queries
    failing on macOS.
-   Properly normalize adapter prefixes for url comparison.
-   Passing `None` as a file pointer to the `files` param no longer
    raises an exception.
-   Calling `copy` on a `RequestsCookieJar` will now preserve the cookie
    policy correctly.

**Dependencies**

-   We now support idna v2.7.
-   We now support urllib3 v1.23.

2.18.4 (2017-08-15)
-------------------

**Improvements**

-   Error messages for invalid headers now include the header name for
    easier debugging

**Dependencies**

-   We now support idna v2.6.

2.18.3 (2017-08-02)
-------------------

**Improvements**

-   Running `$ python -m requests.help` now includes the installed
    version of idna.

**Bugfixes**

-   Fixed issue where Requests would raise `ConnectionError` instead of
    `SSLError` when encountering SSL problems when using urllib3 v1.22.

2.18.2 (2017-07-25)
-------------------

**Bugfixes**

-   `requests.help` no longer fails on Python 2.6 due to the absence of
    `ssl.OPENSSL_VERSION_NUMBER`.

**Dependencies**

-   We now support urllib3 v1.22.

2.18.1 (2017-06-14)
-------------------

**Bugfixes**

-   Fix an error in the packaging whereby the `*.whl` contained
    incorrect data that regressed the fix in v2.17.3.

2.18.0 (2017-06-14)
-------------------

**Improvements**

-   `Response` is now a context manager, so can be used directly in a
    `with` statement without first having to be wrapped by
    `contextlib.closing()`.

**Bugfixes**

-   Resolve installation failure if multiprocessing is not available
-   Resolve tests crash if multiprocessing is not able to determine the
    number of CPU cores
-   Resolve error swallowing in utils set\_environ generator

2.17.3 (2017-05-29)
-------------------

**Improvements**

-   Improved `packages` namespace identity support, for monkeypatching
    libraries.

2.17.2 (2017-05-29)
-------------------

**Improvements**

-   Improved `packages` namespace identity support, for monkeypatching
    libraries.

2.17.1 (2017-05-29)
-------------------

**Improvements**

-   Improved `packages` namespace identity support, for monkeypatching
    libraries.

2.17.0 (2017-05-29)
-------------------

**Improvements**

-   Removal of the 301 redirect cache. This improves thread-safety.

2.16.5 (2017-05-28)
-------------------

-   Improvements to `$ python -m requests.help`.

2.16.4 (2017-05-27)
-------------------

-   Introduction of the `$ python -m requests.help` command, for
    debugging with maintainers!

2.16.3 (2017-05-27)
-------------------

-   Further restored the `requests.packages` namespace for compatibility
    reasons.

2.16.2 (2017-05-27)
-------------------

-   Further restored the `requests.packages` namespace for compatibility
    reasons.

No code modification (noted below) should be necessary any longer.

2.16.1 (2017-05-27)
-------------------

-   Restored the `requests.packages` namespace for compatibility
    reasons.
-   Bugfix for `urllib3` version parsing.

**Note**: code that was written to import against the
`requests.packages` namespace previously will have to import code that
rests at this module-level now.

For example:

    from requests.packages.urllib3.poolmanager import PoolManager

Will need to be re-written to be:

    from requests.packages import urllib3
    urllib3.poolmanager.PoolManager

Or, even better:

    from urllib3.poolmanager import PoolManager

2.16.0 (2017-05-26)
-------------------

-   Unvendor ALL the things!

2.15.1 (2017-05-26)
-------------------

-   Everyone makes mistakes.

2.15.0 (2017-05-26)
-------------------

**Improvements**

-   Introduction of the `Response.next` property, for getting the next
    `PreparedResponse` from a redirect chain (when
    `allow_redirects=False`).
-   Internal refactoring of `__version__` module.

**Bugfixes**

-   Restored once-optional parameter for
    `requests.utils.get_environ_proxies()`.

2.14.2 (2017-05-10)
-------------------

**Bugfixes**

-   Changed a less-than to an equal-to and an or in the dependency
    markers to widen compatibility with older setuptools releases.

2.14.1 (2017-05-09)
-------------------

**Bugfixes**

-   Changed the dependency markers to widen compatibility with older pip
    releases.

2.14.0 (2017-05-09)
-------------------

**Improvements**

-   It is now possible to pass `no_proxy` as a key to the `proxies`
    dictionary to provide handling similar to the `NO_PROXY` environment
    variable.
-   When users provide invalid paths to certificate bundle files or
    directories Requests now raises `IOError`, rather than failing at
    the time of the HTTPS request with a fairly inscrutable certificate
    validation error.
-   The behavior of `SessionRedirectMixin` was slightly altered.
    `resolve_redirects` will now detect a redirect by calling
    `get_redirect_target(response)` instead of directly querying
    `Response.is_redirect` and `Response.headers['location']`. Advanced
    users will be able to process malformed redirects more easily.
-   Changed the internal calculation of elapsed request time to have
    higher resolution on Windows.
-   Added `win_inet_pton` as conditional dependency for the `[socks]`
    extra on Windows with Python 2.7.
-   Changed the proxy bypass implementation on Windows: the proxy bypass
    check doesn't use forward and reverse DNS requests anymore
-   URLs with schemes that begin with `http` but are not `http` or
    `https` no longer have their host parts forced to lowercase.

**Bugfixes**

-   Much improved handling of non-ASCII `Location` header values in
    redirects. Fewer `UnicodeDecodeErrors` are encountered on Python 2,
    and Python 3 now correctly understands that Latin-1 is unlikely to
    be the correct encoding.
-   If an attempt to `seek` file to find out its length fails, we now
    appropriately handle that by aborting our content-length
    calculations.
-   Restricted `HTTPDigestAuth` to only respond to auth challenges made
    on 4XX responses, rather than to all auth challenges.
-   Fixed some code that was firing `DeprecationWarning` on Python 3.6.
-   The dismayed person emoticon (`/o\\`) no longer has a big head. I'm
    sure this is what you were all worrying about most.

**Miscellaneous**

-   Updated bundled urllib3 to v1.21.1.
-   Updated bundled chardet to v3.0.2.
-   Updated bundled idna to v2.5.
-   Updated bundled certifi to 2017.4.17.

2.13.0 (2017-01-24)
-------------------

**Features**

-   Only load the `idna` library when we've determined we need it. This
    will save some memory for users.

**Miscellaneous**

-   Updated bundled urllib3 to 1.20.
-   Updated bundled idna to 2.2.

2.12.5 (2017-01-18)
-------------------

**Bugfixes**

-   Fixed an issue with JSON encoding detection, specifically detecting
    big-endian UTF-32 with BOM.

2.12.4 (2016-12-14)
-------------------

**Bugfixes**

-   Fixed regression from 2.12.2 where non-string types were rejected in
    the basic auth parameters. While support for this behaviour has been
    readded, the behaviour is deprecated and will be removed in the
    future.

2.12.3 (2016-12-01)
-------------------

**Bugfixes**

-   Fixed regression from v2.12.1 for URLs with schemes that begin with
    "http". These URLs have historically been processed as though they
    were HTTP-schemed URLs, and so have had parameters added. This was
    removed in v2.12.2 in an overzealous attempt to resolve problems
    with IDNA-encoding those URLs. This change was reverted: the other
    fixes for IDNA-encoding have been judged to be sufficient to return
    to the behaviour Requests had before v2.12.0.

2.12.2 (2016-11-30)
-------------------

**Bugfixes**

-   Fixed several issues with IDNA-encoding URLs that are technically
    invalid but which are widely accepted. Requests will now attempt to
    IDNA-encode a URL if it can but, if it fails, and the host contains
    only ASCII characters, it will be passed through optimistically.
    This will allow users to opt-in to using IDNA2003 themselves if they
    want to, and will also allow technically invalid but still common
    hostnames.
-   Fixed an issue where URLs with leading whitespace would raise
    `InvalidSchema` errors.
-   Fixed an issue where some URLs without the HTTP or HTTPS schemes
    would still have HTTP URL preparation applied to them.
-   Fixed an issue where Unicode strings could not be used in basic
    auth.
-   Fixed an issue encountered by some Requests plugins where
    constructing a Response object would cause `Response.content` to
    raise an `AttributeError`.

2.12.1 (2016-11-16)
-------------------

**Bugfixes**

-   Updated setuptools 'security' extra for the new PyOpenSSL backend in
    urllib3.

**Miscellaneous**

-   Updated bundled urllib3 to 1.19.1.

2.12.0 (2016-11-15)
-------------------

**Improvements**

-   Updated support for internationalized domain names from IDNA2003 to
    IDNA2008. This updated support is required for several forms of IDNs
    and is mandatory for .de domains.
-   Much improved heuristics for guessing content lengths: Requests will
    no longer read an entire `StringIO` into memory.
-   Much improved logic for recalculating `Content-Length` headers for
    `PreparedRequest` objects.
-   Improved tolerance for file-like objects that have no `tell` method
    but do have a `seek` method.
-   Anything that is a subclass of `Mapping` is now treated like a
    dictionary by the `data=` keyword argument.
-   Requests now tolerates empty passwords in proxy credentials, rather
    than stripping the credentials.
-   If a request is made with a file-like object as the body and that
    request is redirected with a 307 or 308 status code, Requests will
    now attempt to rewind the body object so it can be replayed.

**Bugfixes**

-   When calling `response.close`, the call to `close` will be
    propagated through to non-urllib3 backends.
-   Fixed issue where the `ALL_PROXY` environment variable would be
    preferred over scheme-specific variables like `HTTP_PROXY`.
-   Fixed issue where non-UTF8 reason phrases got severely mangled by
    falling back to decoding using ISO 8859-1 instead.
-   Fixed a bug where Requests would not correctly correlate cookies set
    when using custom Host headers if those Host headers did not use the
    native string type for the platform.

**Miscellaneous**

-   Updated bundled urllib3 to 1.19.
-   Updated bundled certifi certs to 2016.09.26.

2.11.1 (2016-08-17)
-------------------

**Bugfixes**

-   Fixed a bug when using `iter_content` with `decode_unicode=True` for
    streamed bodies would raise `AttributeError`. This bug was
    introduced in 2.11.
-   Strip Content-Type and Transfer-Encoding headers from the header
    block when following a redirect that transforms the verb from
    POST/PUT to GET.

2.11.0 (2016-08-08)
-------------------

**Improvements**

-   Added support for the `ALL_PROXY` environment variable.
-   Reject header values that contain leading whitespace or newline
    characters to reduce risk of header smuggling.

**Bugfixes**

-   Fixed occasional `TypeError` when attempting to decode a JSON
    response that occurred in an error case. Now correctly returns a
    `ValueError`.
-   Requests would incorrectly ignore a non-CIDR IP address in the
    `NO_PROXY` environment variables: Requests now treats it as a
    specific IP.
-   Fixed a bug when sending JSON data that could cause us to encounter
    obscure OpenSSL errors in certain network conditions (yes, really).
-   Added type checks to ensure that `iter_content` only accepts
    integers and `None` for chunk sizes.
-   Fixed issue where responses whose body had not been fully consumed
    would have the underlying connection closed but not returned to the
    connection pool, which could cause Requests to hang in situations
    where the `HTTPAdapter` had been configured to use a blocking
    connection pool.

**Miscellaneous**

-   Updated bundled urllib3 to 1.16.
-   Some previous releases accidentally accepted non-strings as
    acceptable header values. This release does not.

2.10.0 (2016-04-29)
-------------------

**New Features**

-   SOCKS Proxy Support! (requires PySocks;
    `$ pip install requests[socks]`)

**Miscellaneous**

-   Updated bundled urllib3 to 1.15.1.

2.9.2 (2016-04-29)
------------------

**Improvements**

-   Change built-in CaseInsensitiveDict (used for headers) to use
    OrderedDict as its underlying datastore.

**Bugfixes**

-   Don't use redirect\_cache if allow\_redirects=False
-   When passed objects that throw exceptions from `tell()`, send them
    via chunked transfer encoding instead of failing.
-   Raise a ProxyError for proxy related connection issues.

2.9.1 (2015-12-21)
------------------

**Bugfixes**

-   Resolve regression introduced in 2.9.0 that made it impossible to
    send binary strings as bodies in Python 3.
-   Fixed errors when calculating cookie expiration dates in certain
    locales.

**Miscellaneous**

-   Updated bundled urllib3 to 1.13.1.

2.9.0 (2015-12-15)
------------------

**Minor Improvements** (Backwards compatible)

-   The `verify` keyword argument now supports being passed a path to a
    directory of CA certificates, not just a single-file bundle.
-   Warnings are now emitted when sending files opened in text mode.
-   Added the 511 Network Authentication Required status code to the
    status code registry.

**Bugfixes**

-   For file-like objects that are not sought to the very beginning, we
    now send the content length for the number of bytes we will actually
    read, rather than the total size of the file, allowing partial file
    uploads.
-   When uploading file-like objects, if they are empty or have no
    obvious content length we set `Transfer-Encoding: chunked` rather
    than `Content-Length: 0`.
-   We correctly receive the response in buffered mode when uploading
    chunked bodies.
-   We now handle being passed a query string as a bytestring on Python
    3, by decoding it as UTF-8.
-   Sessions are now closed in all cases (exceptional and not) when
    using the functional API rather than leaking and waiting for the
    garbage collector to clean them up.
-   Correctly handle digest auth headers with a malformed `qop`
    directive that contains no token, by treating it the same as if no
    `qop` directive was provided at all.
-   Minor performance improvements when removing specific cookies by
    name.

**Miscellaneous**

-   Updated urllib3 to 1.13.

2.8.1 (2015-10-13)
------------------

**Bugfixes**

-   Update certificate bundle to match `certifi` 2015.9.6.2's weak
    certificate bundle.
-   Fix a bug in 2.8.0 where requests would raise `ConnectTimeout`
    instead of `ConnectionError`
-   When using the PreparedRequest flow, requests will now correctly
    respect the `json` parameter. Broken in 2.8.0.
-   When using the PreparedRequest flow, requests will now correctly
    handle a Unicode-string method name on Python 2. Broken in 2.8.0.

2.8.0 (2015-10-05)
------------------

**Minor Improvements** (Backwards Compatible)

-   Requests now supports per-host proxies. This allows the `proxies`
    dictionary to have entries of the form
    `{'<scheme>://<hostname>': '<proxy>'}`. Host-specific proxies will
    be used in preference to the previously-supported scheme-specific
    ones, but the previous syntax will continue to work.
-   `Response.raise_for_status` now prints the URL that failed as part
    of the exception message.
-   `requests.utils.get_netrc_auth` now takes an `raise_errors` kwarg,
    defaulting to `False`. When `True`, errors parsing `.netrc` files
    cause exceptions to be thrown.
-   Change to bundled projects import logic to make it easier to
    unbundle requests downstream.
-   Changed the default User-Agent string to avoid leaking data on
    Linux: now contains only the requests version.

**Bugfixes**

-   The `json` parameter to `post()` and friends will now only be used
    if neither `data` nor `files` are present, consistent with the
    documentation.
-   We now ignore empty fields in the `NO_PROXY` environment variable.
-   Fixed problem where `httplib.BadStatusLine` would get raised if
    combining `stream=True` with `contextlib.closing`.
-   Prevented bugs where we would attempt to return the same connection
    back to the connection pool twice when sending a Chunked body.
-   Miscellaneous minor internal changes.
-   Digest Auth support is now thread safe.

**Updates**

-   Updated urllib3 to 1.12.

2.7.0 (2015-05-03)
------------------

This is the first release that follows our new release process. For
more, see [our
documentation](https://requests.readthedocs.io/en/latest/community/release-process/).

**Bugfixes**

-   Updated urllib3 to 1.10.4, resolving several bugs involving chunked
    transfer encoding and response framing.

2.6.2 (2015-04-23)
------------------

**Bugfixes**

-   Fix regression where compressed data that was sent as chunked data
    was not properly decompressed. (\#2561)

2.6.1 (2015-04-22)
------------------

**Bugfixes**

-   Remove VendorAlias import machinery introduced in v2.5.2.
-   Simplify the PreparedRequest.prepare API: We no longer require the
    user to pass an empty list to the hooks keyword argument. (c.f.
    \#2552)
-   Resolve redirects now receives and forwards all of the original
    arguments to the adapter. (\#2503)
-   Handle UnicodeDecodeErrors when trying to deal with a unicode URL
    that cannot be encoded in ASCII. (\#2540)
-   Populate the parsed path of the URI field when performing Digest
    Authentication. (\#2426)
-   Copy a PreparedRequest's CookieJar more reliably when it is not an
    instance of RequestsCookieJar. (\#2527)

2.6.0 (2015-03-14)
------------------

**Bugfixes**

-   CVE-2015-2296: Fix handling of cookies on redirect. Previously a
    cookie without a host value set would use the hostname for the
    redirected URL exposing requests users to session fixation attacks
    and potentially cookie stealing. This was disclosed privately by
    Matthew Daley of [BugFuzz](https://bugfuzz.com). This affects all
    versions of requests from v2.1.0 to v2.5.3 (inclusive on both ends).
-   Fix error when requests is an `install_requires` dependency and
    `python setup.py test` is run. (\#2462)
-   Fix error when urllib3 is unbundled and requests continues to use
    the vendored import location.
-   Include fixes to `urllib3`'s header handling.
-   Requests' handling of unvendored dependencies is now more
    restrictive.

**Features and Improvements**

-   Support bytearrays when passed as parameters in the `files`
    argument. (\#2468)
-   Avoid data duplication when creating a request with `str`, `bytes`,
    or `bytearray` input to the `files` argument.

2.5.3 (2015-02-24)
------------------

**Bugfixes**

-   Revert changes to our vendored certificate bundle. For more context
    see (\#2455, \#2456, and <https://bugs.python.org/issue23476>)

2.5.2 (2015-02-23)
------------------

**Features and Improvements**

-   Add sha256 fingerprint support.
    ([shazow/urllib3\#540](https://github.com/shazow/urllib3/pull/540))
-   Improve the performance of headers.
    ([shazow/urllib3\#544](https://github.com/shazow/urllib3/pull/544))

**Bugfixes**

-   Copy pip's import machinery. When downstream redistributors remove
    requests.packages.urllib3 the import machinery will continue to let
    those same symbols work. Example usage in requests' documentation
    and 3rd-party libraries relying on the vendored copies of urllib3
    will work without having to fallback to the system urllib3.
-   Attempt to quote parts of the URL on redirect if unquoting and then
    quoting fails. (\#2356)
-   Fix filename type check for multipart form-data uploads. (\#2411)
-   Properly handle the case where a server issuing digest
    authentication challenges provides both auth and auth-int
    qop-values. (\#2408)
-   Fix a socket leak.
    ([shazow/urllib3\#549](https://github.com/shazow/urllib3/pull/549))
-   Fix multiple `Set-Cookie` headers properly.
    ([shazow/urllib3\#534](https://github.com/shazow/urllib3/pull/534))
-   Disable the built-in hostname verification.
    ([shazow/urllib3\#526](https://github.com/shazow/urllib3/pull/526))
-   Fix the behaviour of decoding an exhausted stream.
    ([shazow/urllib3\#535](https://github.com/shazow/urllib3/pull/535))

**Security**

-   Pulled in an updated `cacert.pem`.
-   Drop RC4 from the default cipher list.
    ([shazow/urllib3\#551](https://github.com/shazow/urllib3/pull/551))

2.5.1 (2014-12-23)
------------------

**Behavioural Changes**

-   Only catch HTTPErrors in raise\_for\_status (\#2382)

**Bugfixes**

-   Handle LocationParseError from urllib3 (\#2344)
-   Handle file-like object filenames that are not strings (\#2379)
-   Unbreak HTTPDigestAuth handler. Allow new nonces to be negotiated
    (\#2389)

2.5.0 (2014-12-01)
------------------

**Improvements**

-   Allow usage of urllib3's Retry object with HTTPAdapters (\#2216)
-   The `iter_lines` method on a response now accepts a delimiter with
    which to split the content (\#2295)

**Behavioural Changes**

-   Add deprecation warnings to functions in requests.utils that will be
    removed in 3.0 (\#2309)
-   Sessions used by the functional API are always closed (\#2326)
-   Restrict requests to HTTP/1.1 and HTTP/1.0 (stop accepting HTTP/0.9)
    (\#2323)

**Bugfixes**

-   Only parse the URL once (\#2353)
-   Allow Content-Length header to always be overridden (\#2332)
-   Properly handle files in HTTPDigestAuth (\#2333)
-   Cap redirect\_cache size to prevent memory abuse (\#2299)
-   Fix HTTPDigestAuth handling of redirects after authenticating
    successfully (\#2253)
-   Fix crash with custom method parameter to Session.request (\#2317)
-   Fix how Link headers are parsed using the regular expression library
    (\#2271)

**Documentation**

-   Add more references for interlinking (\#2348)
-   Update CSS for theme (\#2290)
-   Update width of buttons and sidebar (\#2289)
-   Replace references of Gittip with Gratipay (\#2282)
-   Add link to changelog in sidebar (\#2273)

2.4.3 (2014-10-06)
------------------

**Bugfixes**

-   Unicode URL improvements for Python 2.
-   Re-order JSON param for backwards compat.
-   Automatically defrag authentication schemes from host/pass URIs.
    ([\#2249](https://github.com/psf/requests/issues/2249))

2.4.2 (2014-10-05)
------------------

**Improvements**

-   FINALLY! Add json parameter for uploads!
    ([\#2258](https://github.com/psf/requests/pull/2258))
-   Support for bytestring URLs on Python 3.x
    ([\#2238](https://github.com/psf/requests/pull/2238))

**Bugfixes**

-   Avoid getting stuck in a loop
    ([\#2244](https://github.com/psf/requests/pull/2244))
-   Multiple calls to iter\* fail with unhelpful error.
    ([\#2240](https://github.com/psf/requests/issues/2240),
    [\#2241](https://github.com/psf/requests/issues/2241))

**Documentation**

-   Correct redirection introduction
    ([\#2245](https://github.com/psf/requests/pull/2245/))
-   Added example of how to send multiple files in one request.
    ([\#2227](https://github.com/psf/requests/pull/2227/))
-   Clarify how to pass a custom set of CAs
    ([\#2248](https://github.com/psf/requests/pull/2248/))

2.4.1 (2014-09-09)
------------------

-   Now has a "security" package extras set,
    `$ pip install requests[security]`
-   Requests will now use Certifi if it is available.
-   Capture and re-raise urllib3 ProtocolError
-   Bugfix for responses that attempt to redirect to themselves forever
    (wtf?).

2.4.0 (2014-08-29)
------------------

**Behavioral Changes**

-   `Connection: keep-alive` header is now sent automatically.

**Improvements**

-   Support for connect timeouts! Timeout now accepts a tuple (connect,
    read) which is used to set individual connect and read timeouts.
-   Allow copying of PreparedRequests without headers/cookies.
-   Updated bundled urllib3 version.
-   Refactored settings loading from environment -- new
    Session.merge\_environment\_settings.
-   Handle socket errors in iter\_content.

2.3.0 (2014-05-16)
------------------

**API Changes**

-   New `Response` property `is_redirect`, which is true when the
    library could have processed this response as a redirection (whether
    or not it actually did).
-   The `timeout` parameter now affects requests with both `stream=True`
    and `stream=False` equally.
-   The change in v2.0.0 to mandate explicit proxy schemes has been
    reverted. Proxy schemes now default to `http://`.
-   The `CaseInsensitiveDict` used for HTTP headers now behaves like a
    normal dictionary when references as string or viewed in the
    interpreter.

**Bugfixes**

-   No longer expose Authorization or Proxy-Authorization headers on
    redirect. Fix CVE-2014-1829 and CVE-2014-1830 respectively.
-   Authorization is re-evaluated each redirect.
-   On redirect, pass url as native strings.
-   Fall-back to autodetected encoding for JSON when Unicode detection
    fails.
-   Headers set to `None` on the `Session` are now correctly not sent.
-   Correctly honor `decode_unicode` even if it wasn't used earlier in
    the same response.
-   Stop advertising `compress` as a supported Content-Encoding.
-   The `Response.history` parameter is now always a list.
-   Many, many `urllib3` bugfixes.

2.2.1 (2014-01-23)
------------------

**Bugfixes**

-   Fixes incorrect parsing of proxy credentials that contain a literal
    or encoded '\#' character.
-   Assorted urllib3 fixes.

2.2.0 (2014-01-09)
------------------

**API Changes**

-   New exception: `ContentDecodingError`. Raised instead of `urllib3`
    `DecodeError` exceptions.

**Bugfixes**

-   Avoid many many exceptions from the buggy implementation of
    `proxy_bypass` on OS X in Python 2.6.
-   Avoid crashing when attempting to get authentication credentials
    from \~/.netrc when running as a user without a home directory.
-   Use the correct pool size for pools of connections to proxies.
-   Fix iteration of `CookieJar` objects.
-   Ensure that cookies are persisted over redirect.
-   Switch back to using chardet, since it has merged with charade.

2.1.0 (2013-12-05)
------------------

-   Updated CA Bundle, of course.
-   Cookies set on individual Requests through a `Session` (e.g. via
    `Session.get()`) are no longer persisted to the `Session`.
-   Clean up connections when we hit problems during chunked upload,
    rather than leaking them.
-   Return connections to the pool when a chunked upload is successful,
    rather than leaking it.
-   Match the HTTPbis recommendation for HTTP 301 redirects.
-   Prevent hanging when using streaming uploads and Digest Auth when a
    401 is received.
-   Values of headers set by Requests are now always the native string
    type.
-   Fix previously broken SNI support.
-   Fix accessing HTTP proxies using proxy authentication.
-   Unencode HTTP Basic usernames and passwords extracted from URLs.
-   Support for IP address ranges for no\_proxy environment variable
-   Parse headers correctly when users override the default `Host:`
    header.
-   Avoid munging the URL in case of case-sensitive servers.
-   Looser URL handling for non-HTTP/HTTPS urls.
-   Accept unicode methods in Python 2.6 and 2.7.
-   More resilient cookie handling.
-   Make `Response` objects pickleable.
-   Actually added MD5-sess to Digest Auth instead of pretending to like
    last time.
-   Updated internal urllib3.
-   Fixed @Lukasa's lack of taste.

2.0.1 (2013-10-24)
------------------

-   Updated included CA Bundle with new mistrusts and automated process
    for the future
-   Added MD5-sess to Digest Auth
-   Accept per-file headers in multipart file POST messages.
-   Fixed: Don't send the full URL on CONNECT messages.
-   Fixed: Correctly lowercase a redirect scheme.
-   Fixed: Cookies not persisted when set via functional API.
-   Fixed: Translate urllib3 ProxyError into a requests ProxyError
    derived from ConnectionError.
-   Updated internal urllib3 and chardet.

2.0.0 (2013-09-24)
------------------

**API Changes:**

-   Keys in the Headers dictionary are now native strings on all Python
    versions, i.e. bytestrings on Python 2, unicode on Python 3.
-   Proxy URLs now *must* have an explicit scheme. A `MissingSchema`
    exception will be raised if they don't.
-   Timeouts now apply to read time if `Stream=False`.
-   `RequestException` is now a subclass of `IOError`, not
    `RuntimeError`.
-   Added new method to `PreparedRequest` objects:
    `PreparedRequest.copy()`.
-   Added new method to `Session` objects: `Session.update_request()`.
    This method updates a `Request` object with the data (e.g. cookies)
    stored on the `Session`.
-   Added new method to `Session` objects: `Session.prepare_request()`.
    This method updates and prepares a `Request` object, and returns the
    corresponding `PreparedRequest` object.
-   Added new method to `HTTPAdapter` objects:
    `HTTPAdapter.proxy_headers()`. This should not be called directly,
    but improves the subclass interface.
-   `httplib.IncompleteRead` exceptions caused by incorrect chunked
    encoding will now raise a Requests `ChunkedEncodingError` instead.
-   Invalid percent-escape sequences now cause a Requests `InvalidURL`
    exception to be raised.
-   HTTP 208 no longer uses reason phrase `"im_used"`. Correctly uses
    `"already_reported"`.
-   HTTP 226 reason added (`"im_used"`).

**Bugfixes:**

-   Vastly improved proxy support, including the CONNECT verb. Special
    thanks to the many contributors who worked towards this improvement.
-   Cookies are now properly managed when 401 authentication responses
    are received.
-   Chunked encoding fixes.
-   Support for mixed case schemes.
-   Better handling of streaming downloads.
-   Retrieve environment proxies from more locations.
-   Minor cookies fixes.
-   Improved redirect behaviour.
-   Improved streaming behaviour, particularly for compressed data.
-   Miscellaneous small Python 3 text encoding bugs.
-   `.netrc` no longer overrides explicit auth.
-   Cookies set by hooks are now correctly persisted on Sessions.
-   Fix problem with cookies that specify port numbers in their host
    field.
-   `BytesIO` can be used to perform streaming uploads.
-   More generous parsing of the `no_proxy` environment variable.
-   Non-string objects can be passed in data values alongside files.

1.2.3 (2013-05-25)
------------------

-   Simple packaging fix

1.2.2 (2013-05-23)
------------------

-   Simple packaging fix

1.2.1 (2013-05-20)
------------------

-   301 and 302 redirects now change the verb to GET for all verbs, not
    just POST, improving browser compatibility.
-   Python 3.3.2 compatibility
-   Always percent-encode location headers
-   Fix connection adapter matching to be most-specific first
-   new argument to the default connection adapter for passing a block
    argument
-   prevent a KeyError when there's no link headers

1.2.0 (2013-03-31)
------------------

-   Fixed cookies on sessions and on requests
-   Significantly change how hooks are dispatched - hooks now receive
    all the arguments specified by the user when making a request so
    hooks can make a secondary request with the same parameters. This is
    especially necessary for authentication handler authors
-   certifi support was removed
-   Fixed bug where using OAuth 1 with body `signature_type` sent no
    data
-   Major proxy work thanks to @Lukasa including parsing of proxy
    authentication from the proxy url
-   Fix DigestAuth handling too many 401s
-   Update vendored urllib3 to include SSL bug fixes
-   Allow keyword arguments to be passed to `json.loads()` via the
    `Response.json()` method
-   Don't send `Content-Length` header by default on `GET` or `HEAD`
    requests
-   Add `elapsed` attribute to `Response` objects to time how long a
    request took.
-   Fix `RequestsCookieJar`
-   Sessions and Adapters are now picklable, i.e., can be used with the
    multiprocessing library
-   Update charade to version 1.0.3

The change in how hooks are dispatched will likely cause a great deal of
issues.

1.1.0 (2013-01-10)
------------------

-   CHUNKED REQUESTS
-   Support for iterable response bodies
-   Assume servers persist redirect params
-   Allow explicit content types to be specified for file data
-   Make merge\_kwargs case-insensitive when looking up keys

1.0.3 (2012-12-18)
------------------

-   Fix file upload encoding bug
-   Fix cookie behavior

1.0.2 (2012-12-17)
------------------

-   Proxy fix for HTTPAdapter.

1.0.1 (2012-12-17)
------------------

-   Cert verification exception bug.
-   Proxy fix for HTTPAdapter.

1.0.0 (2012-12-17)
------------------

-   Massive Refactor and Simplification
-   Switch to Apache 2.0 license
-   Swappable Connection Adapters
-   Mountable Connection Adapters
-   Mutable ProcessedRequest chain
-   /s/prefetch/stream
-   Removal of all configuration
-   Standard library logging
-   Make Response.json() callable, not property.
-   Usage of new charade project, which provides python 2 and 3
    simultaneous chardet.
-   Removal of all hooks except 'response'
-   Removal of all authentication helpers (OAuth, Kerberos)

This is not a backwards compatible change.

0.14.2 (2012-10-27)
-------------------

-   Improved mime-compatible JSON handling
-   Proxy fixes
-   Path hack fixes
-   Case-Insensitive Content-Encoding headers
-   Support for CJK parameters in form posts

0.14.1 (2012-10-01)
-------------------

-   Python 3.3 Compatibility
-   Simply default accept-encoding
-   Bugfixes

0.14.0 (2012-09-02)
-------------------

-   No more iter\_content errors if already downloaded.

0.13.9 (2012-08-25)
-------------------

-   Fix for OAuth + POSTs
-   Remove exception eating from dispatch\_hook
-   General bugfixes

0.13.8 (2012-08-21)
-------------------

-   Incredible Link header support :)

0.13.7 (2012-08-19)
-------------------

-   Support for (key, value) lists everywhere.
-   Digest Authentication improvements.
-   Ensure proxy exclusions work properly.
-   Clearer UnicodeError exceptions.
-   Automatic casting of URLs to strings (fURL and such)
-   Bugfixes.

0.13.6 (2012-08-06)
-------------------

-   Long awaited fix for hanging connections!

0.13.5 (2012-07-27)
-------------------

-   Packaging fix

0.13.4 (2012-07-27)
-------------------

-   GSSAPI/Kerberos authentication!
-   App Engine 2.7 Fixes!
-   Fix leaking connections (from urllib3 update)
-   OAuthlib path hack fix
-   OAuthlib URL parameters fix.

0.13.3 (2012-07-12)
-------------------

-   Use simplejson if available.
-   Do not hide SSLErrors behind Timeouts.
-   Fixed param handling with urls containing fragments.
-   Significantly improved information in User Agent.
-   client certificates are ignored when verify=False

0.13.2 (2012-06-28)
-------------------

-   Zero dependencies (once again)!
-   New: Response.reason
-   Sign querystring parameters in OAuth 1.0
-   Client certificates no longer ignored when verify=False
-   Add openSUSE certificate support

0.13.1 (2012-06-07)
-------------------

-   Allow passing a file or file-like object as data.
-   Allow hooks to return responses that indicate errors.
-   Fix Response.text and Response.json for body-less responses.

0.13.0 (2012-05-29)
-------------------

-   Removal of Requests.async in favor of
    [grequests](https://github.com/kennethreitz/grequests)
-   Allow disabling of cookie persistence.
-   New implementation of safe\_mode
-   cookies.get now supports default argument
-   Session cookies not saved when Session.request is called with
    return\_response=False
-   Env: no\_proxy support.
-   RequestsCookieJar improvements.
-   Various bug fixes.

0.12.1 (2012-05-08)
-------------------

-   New `Response.json` property.
-   Ability to add string file uploads.
-   Fix out-of-range issue with iter\_lines.
-   Fix iter\_content default size.
-   Fix POST redirects containing files.

0.12.0 (2012-05-02)
-------------------

-   EXPERIMENTAL OAUTH SUPPORT!
-   Proper CookieJar-backed cookies interface with awesome dict-like
    interface.
-   Speed fix for non-iterated content chunks.
-   Move `pre_request` to a more usable place.
-   New `pre_send` hook.
-   Lazily encode data, params, files.
-   Load system Certificate Bundle if `certify` isn't available.
-   Cleanups, fixes.

0.11.2 (2012-04-22)
-------------------

-   Attempt to use the OS's certificate bundle if `certifi` isn't
    available.
-   Infinite digest auth redirect fix.
-   Multi-part file upload improvements.
-   Fix decoding of invalid %encodings in URLs.
-   If there is no content in a response don't throw an error the second
    time that content is attempted to be read.
-   Upload data on redirects.

0.11.1 (2012-03-30)
-------------------

-   POST redirects now break RFC to do what browsers do: Follow up with
    a GET.
-   New `strict_mode` configuration to disable new redirect behavior.

0.11.0 (2012-03-14)
-------------------

-   Private SSL Certificate support
-   Remove select.poll from Gevent monkeypatching
-   Remove redundant generator for chunked transfer encoding
-   Fix: Response.ok raises Timeout Exception in safe\_mode

0.10.8 (2012-03-09)
-------------------

-   Generate chunked ValueError fix
-   Proxy configuration by environment variables
-   Simplification of iter\_lines.
-   New trust\_env configuration for disabling system/environment hints.
-   Suppress cookie errors.

0.10.7 (2012-03-07)
-------------------

-   encode\_uri = False

0.10.6 (2012-02-25)
-------------------

-   Allow '=' in cookies.

0.10.5 (2012-02-25)
-------------------

-   Response body with 0 content-length fix.
-   New async.imap.
-   Don't fail on netrc.

0.10.4 (2012-02-20)
-------------------

-   Honor netrc.

0.10.3 (2012-02-20)
-------------------

-   HEAD requests don't follow redirects anymore.
-   raise\_for\_status() doesn't raise for 3xx anymore.
-   Make Session objects picklable.
-   ValueError for invalid schema URLs.

0.10.2 (2012-01-15)
-------------------

-   Vastly improved URL quoting.
-   Additional allowed cookie key values.
-   Attempted fix for "Too many open files" Error
-   Replace unicode errors on first pass, no need for second pass.
-   Append '/' to bare-domain urls before query insertion.
-   Exceptions now inherit from RuntimeError.
-   Binary uploads + auth fix.
-   Bugfixes.

0.10.1 (2012-01-23)
-------------------

-   PYTHON 3 SUPPORT!
-   Dropped 2.5 Support. (*Backwards Incompatible*)

0.10.0 (2012-01-21)
-------------------

-   `Response.content` is now bytes-only. (*Backwards Incompatible*)
-   New `Response.text` is unicode-only.
-   If no `Response.encoding` is specified and `chardet` is available,
    `Response.text` will guess an encoding.
-   Default to ISO-8859-1 (Western) encoding for "text" subtypes.
-   Removal of decode\_unicode. (*Backwards Incompatible*)
-   New multiple-hooks system.
-   New `Response.register_hook` for registering hooks within the
    pipeline.
-   `Response.url` is now Unicode.

0.9.3 (2012-01-18)
------------------

-   SSL verify=False bugfix (apparent on windows machines).

0.9.2 (2012-01-18)
------------------

-   Asynchronous async.send method.
-   Support for proper chunk streams with boundaries.
-   session argument for Session classes.
-   Print entire hook tracebacks, not just exception instance.
-   Fix response.iter\_lines from pending next line.
-   Fix but in HTTP-digest auth w/ URI having query strings.
-   Fix in Event Hooks section.
-   Urllib3 update.

0.9.1 (2012-01-06)
------------------

-   danger\_mode for automatic Response.raise\_for\_status()
-   Response.iter\_lines refactor

0.9.0 (2011-12-28)
------------------

-   verify ssl is default.

0.8.9 (2011-12-28)
------------------

-   Packaging fix.

0.8.8 (2011-12-28)
------------------

-   SSL CERT VERIFICATION!
-   Release of Cerifi: Mozilla's cert list.
-   New 'verify' argument for SSL requests.
-   Urllib3 update.

0.8.7 (2011-12-24)
------------------

-   iter\_lines last-line truncation fix
-   Force safe\_mode for async requests
-   Handle safe\_mode exceptions more consistently
-   Fix iteration on null responses in safe\_mode

0.8.6 (2011-12-18)
------------------

-   Socket timeout fixes.
-   Proxy Authorization support.

0.8.5 (2011-12-14)
------------------

-   Response.iter\_lines!

0.8.4 (2011-12-11)
------------------

-   Prefetch bugfix.
-   Added license to installed version.

0.8.3 (2011-11-27)
------------------

-   Converted auth system to use simpler callable objects.
-   New session parameter to API methods.
-   Display full URL while logging.

0.8.2 (2011-11-19)
------------------

-   New Unicode decoding system, based on over-ridable
    Response.encoding.
-   Proper URL slash-quote handling.
-   Cookies with `[`, `]`, and `_` allowed.

0.8.1 (2011-11-15)
------------------

-   URL Request path fix
-   Proxy fix.
-   Timeouts fix.

0.8.0 (2011-11-13)
------------------

-   Keep-alive support!
-   Complete removal of Urllib2
-   Complete removal of Poster
-   Complete removal of CookieJars
-   New ConnectionError raising
-   Safe\_mode for error catching
-   prefetch parameter for request methods
-   OPTION method
-   Async pool size throttling
-   File uploads send real names
-   Vendored in urllib3

0.7.6 (2011-11-07)
------------------

-   Digest authentication bugfix (attach query data to path)

0.7.5 (2011-11-04)
------------------

-   Response.content = None if there was an invalid response.
-   Redirection auth handling.

0.7.4 (2011-10-26)
------------------

-   Session Hooks fix.

0.7.3 (2011-10-23)
------------------

-   Digest Auth fix.

0.7.2 (2011-10-23)
------------------

-   PATCH Fix.

0.7.1 (2011-10-23)
------------------

-   Move away from urllib2 authentication handling.
-   Fully Remove AuthManager, AuthObject, &c.
-   New tuple-based auth system with handler callbacks.

0.7.0 (2011-10-22)
------------------

-   Sessions are now the primary interface.
-   Deprecated InvalidMethodException.
-   PATCH fix.
-   New config system (no more global settings).

0.6.6 (2011-10-19)
------------------

-   Session parameter bugfix (params merging).

0.6.5 (2011-10-18)
------------------

-   Offline (fast) test suite.
-   Session dictionary argument merging.

0.6.4 (2011-10-13)
------------------

-   Automatic decoding of unicode, based on HTTP Headers.
-   New `decode_unicode` setting.
-   Removal of `r.read/close` methods.
-   New `r.faw` interface for advanced response usage.\*
-   Automatic expansion of parameterized headers.

0.6.3 (2011-10-13)
------------------

-   Beautiful `requests.async` module, for making async requests w/
    gevent.

0.6.2 (2011-10-09)
------------------

-   GET/HEAD obeys allow\_redirects=False.

0.6.1 (2011-08-20)
------------------

-   Enhanced status codes experience `\o/`
-   Set a maximum number of redirects (`settings.max_redirects`)
-   Full Unicode URL support
-   Support for protocol-less redirects.
-   Allow for arbitrary request types.
-   Bugfixes

0.6.0 (2011-08-17)
------------------

-   New callback hook system
-   New persistent sessions object and context manager
-   Transparent Dict-cookie handling
-   Status code reference object
-   Removed Response.cached
-   Added Response.request
-   All args are kwargs
-   Relative redirect support
-   HTTPError handling improvements
-   Improved https testing
-   Bugfixes

0.5.1 (2011-07-23)
------------------

-   International Domain Name Support!
-   Access headers without fetching entire body (`read()`)
-   Use lists as dicts for parameters
-   Add Forced Basic Authentication
-   Forced Basic is default authentication type
-   `python-requests.org` default User-Agent header
-   CaseInsensitiveDict lower-case caching
-   Response.history bugfix

0.5.0 (2011-06-21)
------------------

-   PATCH Support
-   Support for Proxies
-   HTTPBin Test Suite
-   Redirect Fixes
-   settings.verbose stream writing
-   Querystrings for all methods
-   URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as
    explicitly raised
    `r.requests.get('hwe://blah'); r.raise_for_status()`

0.4.1 (2011-05-22)
------------------

-   Improved Redirection Handling
-   New 'allow\_redirects' param for following non-GET/HEAD Redirects
-   Settings module refactoring

0.4.0 (2011-05-15)
------------------

-   Response.history: list of redirected responses
-   Case-Insensitive Header Dictionaries!
-   Unicode URLs

0.3.4 (2011-05-14)
------------------

-   Urllib2 HTTPAuthentication Recursion fix (Basic/Digest)
-   Internal Refactor
-   Bytes data upload Bugfix

0.3.3 (2011-05-12)
------------------

-   Request timeouts
-   Unicode url-encoded data
-   Settings context manager and module

0.3.2 (2011-04-15)
------------------

-   Automatic Decompression of GZip Encoded Content
-   AutoAuth Support for Tupled HTTP Auth

0.3.1 (2011-04-01)
------------------

-   Cookie Changes
-   Response.read()
-   Poster fix

0.3.0 (2011-02-25)
------------------

-   Automatic Authentication API Change
-   Smarter Query URL Parameterization
-   Allow file uploads and POST data together
-   

    New Authentication Manager System

    :   -   Simpler Basic HTTP System
        -   Supports all build-in urllib2 Auths
        -   Allows for custom Auth Handlers

0.2.4 (2011-02-19)
------------------

-   Python 2.5 Support
-   PyPy-c v1.4 Support
-   Auto-Authentication tests
-   Improved Request object constructor

0.2.3 (2011-02-15)
------------------

-   

    New HTTPHandling Methods

    :   -   Response.\_\_nonzero\_\_ (false if bad HTTP Status)
        -   Response.ok (True if expected HTTP Status)
        -   Response.error (Logged HTTPError if bad HTTP Status)
        -   Response.raise\_for\_status() (Raises stored HTTPError)

0.2.2 (2011-02-14)
------------------

-   Still handles request in the event of an HTTPError. (Issue \#2)
-   Eventlet and Gevent Monkeypatch support.
-   Cookie Support (Issue \#1)

0.2.1 (2011-02-14)
------------------

-   Added file attribute to POST and PUT requests for multipart-encode
    file uploads.
-   Added Request.url attribute for context and redirects

0.2.0 (2011-02-14)
------------------

-   Birth!

0.0.1 (2011-02-13)
------------------

-   Frustration
-   Conception
PK�(�\t�C0ww#doc/alt-python37-requests/README.mdnu�[���# Requests

**Requests** is a simple, yet elegant, HTTP library.

```python
>>> import requests
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
'{"type":"User"...'
>>> r.json()
{'disk_usage': 368627, 'private_gists': 484, ...}
```

Requests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs, or to form-encode your `PUT` & `POST` data — but nowadays, just use the `json` method!

Requests is one of the most downloaded Python package today, pulling in around `14M downloads / week`— according to GitHub, Requests is currently [depended upon](https://github.com/psf/requests/network/dependents?package_id=UGFja2FnZS01NzA4OTExNg%3D%3D) by `500,000+` repositories. You may certainly put your trust in this code.

[![Downloads](https://pepy.tech/badge/requests/month)](https://pepy.tech/project/requests/month)
[![Supported Versions](https://img.shields.io/pypi/pyversions/requests.svg)](https://pypi.org/project/requests)
[![Contributors](https://img.shields.io/github/contributors/psf/requests.svg)](https://github.com/psf/requests/graphs/contributors)

## Installing Requests and Supported Versions

Requests is available on PyPI:

```console
$ python -m pip install requests
```

Requests officially supports Python 2.7 & 3.6+.

## Supported Features & Best–Practices

Requests is ready for the demands of building robust and reliable HTTP–speaking applications, for the needs of today.

- Keep-Alive & Connection Pooling
- International Domains and URLs
- Sessions with Cookie Persistence
- Browser-style TLS/SSL Verification
- Basic & Digest Authentication
- Familiar `dict`–like Cookies
- Automatic Content Decompression and Decoding
- Multi-part File Uploads
- SOCKS Proxy Support
- Connection Timeouts
- Streaming Downloads
- Automatic honoring of `.netrc`
- Chunked HTTP Requests

## API Reference and User Guide available on [Read the Docs](https://requests.readthedocs.io)

[![Read the Docs](https://raw.githubusercontent.com/psf/requests/master/ext/ss.png)](https://requests.readthedocs.io)

## Cloning the repository

When cloning the Requests repository, you may need to add the `-c
fetch.fsck.badTimezone=ignore` flag to avoid an error about a bad commit (see
[this issue](https://github.com/psf/requests/issues/2690) for more background):

```shell
git clone -c fetch.fsck.badTimezone=ignore https://github.com/psf/requests.git
```

You can also apply this setting to your global Git config:

```shell
git config --global fetch.fsck.badTimezone ignore
```

---

[![Kenneth Reitz](https://raw.githubusercontent.com/psf/requests/master/ext/kr.png)](https://kennethreitz.org) [![Python Software Foundation](https://raw.githubusercontent.com/psf/requests/master/ext/psf.png)](https://www.python.org/psf)
PK�(�\k�_GWGW$doc/alt-python37-pyjwt/CHANGELOG.rstnu�[���Changelog
=========

All notable changes to this project will be documented in this file.
This project adheres to `Semantic Versioning <https://semver.org/>`__.

`Unreleased <https://github.com/jpadilla/pyjwt/compare/2.1.0...HEAD>`__
-----------------------------------------------------------------------

Changed
~~~~~~~

Fixed
~~~~~

Added
~~~~~

`v2.1.0 <https://github.com/jpadilla/pyjwt/compare/2.0.1...2.1.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

- Allow claims validation without making JWT signature validation mandatory. `#608 <https://github.com/jpadilla/pyjwt/pull/608>`__

Fixed
~~~~~

- Remove padding from JWK test data. `#628 <https://github.com/jpadilla/pyjwt/pull/628>`__
- Make `kty` mandatory in JWK to be compliant with RFC7517. `#624 <https://github.com/jpadilla/pyjwt/pull/624>`__
- Allow JWK without `alg` to be compliant with RFC7517. `#624 <https://github.com/jpadilla/pyjwt/pull/624>`__
- Allow to verify with private key on ECAlgorithm, as well as on Ed25519Algorithm. `#645 <https://github.com/jpadilla/pyjwt/pull/645>`__

Added
~~~~~

- Add caching by default to PyJWKClient `#611 <https://github.com/jpadilla/pyjwt/pull/611>`__
- Add missing exceptions.InvalidKeyError to jwt module __init__ imports `#620 <https://github.com/jpadilla/pyjwt/pull/620>`__
- Add support for ES256K algorithm `#629 <https://github.com/jpadilla/pyjwt/pull/629>`__
- Add `from_jwk()` to Ed25519Algorithm `#621 <https://github.com/jpadilla/pyjwt/pull/621>`__
- Add `to_jwk()` to Ed25519Algorithm `#643 <https://github.com/jpadilla/pyjwt/pull/643>`__
- Export `PyJWK` and `PyJWKSet` `#652 <https://github.com/jpadilla/pyjwt/pull/652>`__

`v2.0.1 <https://github.com/jpadilla/pyjwt/compare/2.0.0...2.0.1>`__
--------------------------------------------------------------------

Changed
~~~~~~~

- Rename CHANGELOG.md to CHANGELOG.rst and include in docs `#597 <https://github.com/jpadilla/pyjwt/pull/597>`__

Fixed
~~~~~

- Fix `from_jwk()` for all algorithms `#598 <https://github.com/jpadilla/pyjwt/pull/598>`__

Added
~~~~~

`v2.0.0 <https://github.com/jpadilla/pyjwt/compare/1.7.1...2.0.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

Drop support for Python 2 and Python 3.0-3.5
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Python 3.5 is EOL so we decide to drop its support. Version ``1.7.1`` is
the last one supporting Python 3.0-3.5.

Require cryptography >= 3
^^^^^^^^^^^^^^^^^^^^^^^^^

Drop support for PyCrypto and ECDSA
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

We've kept this around for a long time, mostly for environments that
didn't allow installing cryptography.

Drop CLI
^^^^^^^^

Dropped the included cli entry point.

Improve typings
^^^^^^^^^^^^^^^

We no longer need to use mypy Python 2 compatibility mode (comments)

``jwt.encode(...)`` return type
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Tokens are returned as string instead of a byte string

Dropped deprecated errors
^^^^^^^^^^^^^^^^^^^^^^^^^

Removed ``ExpiredSignature``, ``InvalidAudience``, and
``InvalidIssuer``. Use ``ExpiredSignatureError``,
``InvalidAudienceError``, and ``InvalidIssuerError`` instead.

Dropped deprecated ``verify_expiration`` param in ``jwt.decode(...)``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Use
``jwt.decode(encoded, key, algorithms=["HS256"], options={"verify_exp": False})``
instead.

Dropped deprecated ``verify`` param in ``jwt.decode(...)``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Use ``jwt.decode(encoded, key, options={"verify_signature": False})``
instead.

Require explicit ``algorithms`` in ``jwt.decode(...)`` by default
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Example: ``jwt.decode(encoded, key, algorithms=["HS256"])``.

Dropped deprecated ``require_*`` options in ``jwt.decode(...)``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

For example, instead of
``jwt.decode(encoded, key, algorithms=["HS256"], options={"require_exp": True})``,
use
``jwt.decode(encoded, key, algorithms=["HS256"], options={"require": ["exp"]})``.

Added
~~~~~

Introduce better experience for JWKs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Introduce ``PyJWK``, ``PyJWKSet``, and ``PyJWKClient``.

.. code:: python

    import jwt
    from jwt import PyJWKClient

    token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik5FRTFRVVJCT1RNNE16STVSa0ZETlRZeE9UVTFNRGcyT0Rnd1EwVXpNVGsxUWpZeVJrUkZRdyJ9.eyJpc3MiOiJodHRwczovL2Rldi04N2V2eDlydS5hdXRoMC5jb20vIiwic3ViIjoiYVc0Q2NhNzl4UmVMV1V6MGFFMkg2a0QwTzNjWEJWdENAY2xpZW50cyIsImF1ZCI6Imh0dHBzOi8vZXhwZW5zZXMtYXBpIiwiaWF0IjoxNTcyMDA2OTU0LCJleHAiOjE1NzIwMDY5NjQsImF6cCI6ImFXNENjYTc5eFJlTFdVejBhRTJINmtEME8zY1hCVnRDIiwiZ3R5IjoiY2xpZW50LWNyZWRlbnRpYWxzIn0.PUxE7xn52aTCohGiWoSdMBZGiYAHwE5FYie0Y1qUT68IHSTXwXVd6hn02HTah6epvHHVKA2FqcFZ4GGv5VTHEvYpeggiiZMgbxFrmTEY0csL6VNkX1eaJGcuehwQCRBKRLL3zKmA5IKGy5GeUnIbpPHLHDxr-GXvgFzsdsyWlVQvPX2xjeaQ217r2PtxDeqjlf66UYl6oY6AqNS8DH3iryCvIfCcybRZkc_hdy-6ZMoKT6Piijvk_aXdm7-QQqKJFHLuEqrVSOuBqqiNfVrG27QzAPuPOxvfXTVLXL2jek5meH6n-VWgrBdoMFH93QEszEDowDAEhQPHVs0xj7SIzA"
    kid = "NEE1QURBOTM4MzI5RkFDNTYxOTU1MDg2ODgwQ0UzMTk1QjYyRkRFQw"
    url = "https://dev-87evx9ru.auth0.com/.well-known/jwks.json"

    jwks_client = PyJWKClient(url)
    signing_key = jwks_client.get_signing_key_from_jwt(token)

    data = jwt.decode(
        token,
        signing_key.key,
        algorithms=["RS256"],
        audience="https://expenses-api",
        options={"verify_exp": False},
    )
    print(data)

Support for JWKs containing ECDSA keys
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Add support for Ed25519 / EdDSA
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Pull Requests
~~~~~~~~~~~~~

-  Add PyPy3 to the test matrix (#550) by @jdufresne
-  Require tweak (#280) by @psafont
-  Decode return type is dict[str, Any] (#393) by @jacopofar
-  Fix linter error in test\_cli (#414) by @jaraco
-  Run mypy with tox (#421) by @jpadilla
-  Document (and prefer) pyjwt[crypto] req format (#426) by @gthb
-  Correct type for json\_encoder argument (#438) by @jdufresne
-  Prefer https:// links where available (#439) by @jdufresne
-  Pass python\_requires argument to setuptools (#440) by @jdufresne
-  Rename [wheel] section to [bdist\_wheel] as the former is legacy
   (#441) by @jdufresne
-  Remove setup.py test command in favor of pytest and tox (#442) by
   @jdufresne
-  Fix mypy errors (#449) by @jpadilla
-  DX Tweaks (#450) by @jpadilla
-  Add support of python 3.8 (#452) by @Djailla
-  Fix 406 (#454) by @justinbaur
-  Add support for Ed25519 / EdDSA, with unit tests (#455) by
   @Someguy123
-  Remove Python 2.7 compatibility (#457) by @Djailla
-  Fix simple typo: encododed -> encoded (#462) by @timgates42
-  Enhance tracebacks. (#477) by @JulienPalard
-  Simplify ``python_requires`` (#478) by @michael-k
-  Document top-level .encode and .decode to close #459 (#482) by
   @dimaqq
-  Improve documentation for audience usage (#484) by @CorreyL
-  Correct README on how to run tests locally (#489) by @jdufresne
-  Fix ``tox -e lint`` warnings and errors (#490) by @jdufresne
-  Run pyupgrade across project to use modern Python 3 conventions
   (#491) by @jdufresne
-  Add Python-3-only trove classifier and remove "universal" from wheel
   (#492) by @jdufresne
-  Emit warnings about user code, not pyjwt code (#494) by @mgedmin
-  Move setup information to declarative setup.cfg (#495) by @jdufresne
-  CLI options for verifying audience and issuer (#496) by
   @GeoffRichards
-  Specify the target Python version for mypy (#497) by @jdufresne
-  Remove unnecessary compatibility shims for Python 2 (#498) by
   @jdufresne
-  Setup GH Actions (#499) by @jpadilla
-  Implementation of ECAlgorithm.from\_jwk (#500) by @jpadilla
-  Remove cli entry point (#501) by @jpadilla
-  Expose InvalidKeyError on jwt module (#503) by @russellcardullo
-  Avoid loading token twice in pyjwt.decode (#506) by @CaselIT
-  Default links to stable version of documentation (#508) by @salcedo
-  Update README.md badges (#510) by @jpadilla
-  Introduce better experience for JWKs (#511) by @jpadilla
-  Fix tox conditional extras (#512) by @jpadilla
-  Return tokens as string not bytes (#513) by @jpadilla
-  Drop support for legacy contrib algorithms (#514) by @jpadilla
-  Drop deprecation warnings (#515) by @jpadilla
-  Update Auth0 sponsorship link (#519) by @Sambego
-  Update return type for jwt.encode (#521) by @moomoolive
-  Run tests against Python 3.9 and add trove classifier (#522) by
   @michael-k
-  Removed redundant ``default_backend()`` (#523) by @rohitkg98
-  Documents how to use private keys with passphrases (#525) by @rayluo
-  Update version to 2.0.0a1 (#528) by @jpadilla
-  Fix usage example (#530) by @nijel
-  add EdDSA to docs (#531) by @CircleOnCircles
-  Remove support for EOL Python 3.5 (#532) by @jdufresne
-  Upgrade to isort 5 and adjust configurations (#533) by @jdufresne
-  Remove unused argument "verify" from PyJWS.decode() (#534) by
   @jdufresne
-  Update typing syntax and usage for Python 3.6+ (#535) by @jdufresne
-  Run pyupgrade to simplify code and use Python 3.6 syntax (#536) by
   @jdufresne
-  Drop unknown pytest config option: strict (#537) by @jdufresne
-  Upgrade black version and usage (#538) by @jdufresne
-  Remove "Command line" sections from docs (#539) by @jdufresne
-  Use existing key\_path() utility function throughout tests (#540) by
   @jdufresne
-  Replace force\_bytes()/force\_unicode() in tests with literals (#541)
   by @jdufresne
-  Remove unnecessary Unicode decoding before json.loads() (#542) by
   @jdufresne
-  Remove unnecessary force\_bytes() calls priot to base64url\_decode()
   (#543) by @jdufresne
-  Remove deprecated arguments from docs (#544) by @jdufresne
-  Update code blocks in docs (#545) by @jdufresne
-  Refactor jwt/jwks\_client.py without requests dependency (#546) by
   @jdufresne
-  Tighten bytes/str boundaries and remove unnecessary coercing (#547)
   by @jdufresne
-  Replace codecs.open() with builtin open() (#548) by @jdufresne
-  Replace int\_from\_bytes() with builtin int.from\_bytes() (#549) by
   @jdufresne
-  Enforce .encode() return type using mypy (#551) by @jdufresne
-  Prefer direct indexing over options.get() (#552) by @jdufresne
-  Cleanup "noqa" comments (#553) by @jdufresne
-  Replace merge\_dict() with builtin dict unpacking generalizations
   (#555) by @jdufresne
-  Do not mutate the input payload in PyJWT.encode() (#557) by
   @jdufresne
-  Use direct indexing in PyJWKClient.get\_signing\_key\_from\_jwt()
   (#558) by @jdufresne
-  Split PyJWT/PyJWS classes to tighten type interfaces (#559) by
   @jdufresne
-  Simplify mocked\_response test utility function (#560) by @jdufresne
-  Autoupdate pre-commit hooks and apply them (#561) by @jdufresne
-  Remove unused argument "payload" from PyJWS.\ *verify*\ signature()
   (#562) by @jdufresne
-  Add utility functions to assist test skipping (#563) by @jdufresne
-  Type hint jwt.utils module (#564) by @jdufresne
-  Prefer ModuleNotFoundError over ImportError (#565) by @jdufresne
-  Fix tox "manifest" environment to pass (#566) by @jdufresne
-  Fix tox "docs" environment to pass (#567) by @jdufresne
-  Simplify black configuration to be closer to upstream defaults (#568)
   by @jdufresne
-  Use generator expressions (#569) by @jdufresne
-  Simplify from\_base64url\_uint() (#570) by @jdufresne
-  Drop lint environment from GitHub actions in favor of pre-commit.ci
   (#571) by @jdufresne
-  [pre-commit.ci] pre-commit autoupdate (#572)
-  Simplify tox configuration (#573) by @jdufresne
-  Combine identical test functions using pytest.mark.parametrize()
   (#574) by @jdufresne
-  Complete type hinting of jwks\_client.py (#578) by @jdufresne

`v1.7.1 <https://github.com/jpadilla/pyjwt/compare/1.7.0...1.7.1>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Update test dependencies with pinned ranges
-  Fix pytest deprecation warnings

`v1.7.0 <https://github.com/jpadilla/pyjwt/compare/1.6.4...1.7.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Remove CRLF line endings
   `#353 <https://github.com/jpadilla/pyjwt/pull/353>`__

Fixed
~~~~~

-  Update usage.rst
   `#360 <https://github.com/jpadilla/pyjwt/pull/360>`__

Added
~~~~~

-  Support for Python 3.7
   `#375 <https://github.com/jpadilla/pyjwt/pull/375>`__
   `#379 <https://github.com/jpadilla/pyjwt/pull/379>`__
   `#384 <https://github.com/jpadilla/pyjwt/pull/384>`__

`v1.6.4 <https://github.com/jpadilla/pyjwt/compare/1.6.3...1.6.4>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Reverse an unintentional breaking API change to .decode()
   `#352 <https://github.com/jpadilla/pyjwt/pull/352>`__

`v1.6.3 <https://github.com/jpadilla/pyjwt/compare/1.6.1...1.6.3>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  All exceptions inherit from PyJWTError
   `#340 <https://github.com/jpadilla/pyjwt/pull/340>`__

Added
~~~~~

-  Add type hints `#344 <https://github.com/jpadilla/pyjwt/pull/344>`__
-  Add help module
   `7ca41e <https://github.com/jpadilla/pyjwt/commit/7ca41e53b3d7d9f5cd31bdd8a2b832d192006239>`__

Docs
~~~~

-  Added section to usage docs for jwt.get\_unverified\_header()
   `#350 <https://github.com/jpadilla/pyjwt/pull/350>`__
-  Update legacy instructions for using pycrypto
   `#337 <https://github.com/jpadilla/pyjwt/pull/337>`__

`v1.6.1 <https://github.com/jpadilla/pyjwt/compare/1.6.0...1.6.1>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Audience parameter throws ``InvalidAudienceError`` when application
   does not specify an audience, but the token does.
   `#336 <https://github.com/jpadilla/pyjwt/pull/336>`__

`v1.6.0 <https://github.com/jpadilla/pyjwt/compare/1.5.3...1.6.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Dropped support for python 2.6 and 3.3
   `#301 <https://github.com/jpadilla/pyjwt/pull/301>`__
-  An invalid signature now raises an ``InvalidSignatureError`` instead
   of ``DecodeError``
   `#316 <https://github.com/jpadilla/pyjwt/pull/316>`__

Fixed
~~~~~

-  Fix over-eager fallback to stdin
   `#304 <https://github.com/jpadilla/pyjwt/pull/304>`__

Added
~~~~~

-  Audience parameter now supports iterables
   `#306 <https://github.com/jpadilla/pyjwt/pull/306>`__

`v1.5.3 <https://github.com/jpadilla/pyjwt/compare/1.5.2...1.5.3>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Increase required version of the cryptography package to >=1.4.0.

Fixed
~~~~~

-  Remove uses of deprecated functions from the cryptography package.
-  Warn about missing ``algorithms`` param to ``decode()`` only when
   ``verify`` param is ``True``
   `#281 <https://github.com/jpadilla/pyjwt/pull/281>`__

`v1.5.2 <https://github.com/jpadilla/pyjwt/compare/1.5.1...1.5.2>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Ensure correct arguments order in decode super call
   `7c1e61d <https://github.com/jpadilla/pyjwt/commit/7c1e61dde27bafe16e7d1bb6e35199e778962742>`__

`v1.5.1 <https://github.com/jpadilla/pyjwt/compare/1.5.0...1.5.1>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Change optparse for argparse.
   `#238 <https://github.com/jpadilla/pyjwt/pull/238>`__

Fixed
~~~~~

-  Guard against PKCS1 PEM encoded public keys
   `#277 <https://github.com/jpadilla/pyjwt/pull/277>`__
-  Add deprecation warning when decoding without specifying
   ``algorithms`` `#277 <https://github.com/jpadilla/pyjwt/pull/277>`__
-  Improve deprecation messages
   `#270 <https://github.com/jpadilla/pyjwt/pull/270>`__
-  PyJWT.decode: move verify param into options
   `#271 <https://github.com/jpadilla/pyjwt/pull/271>`__

Added
~~~~~

-  Support for Python 3.6
   `#262 <https://github.com/jpadilla/pyjwt/pull/262>`__
-  Expose jwt.InvalidAlgorithmError
   `#264 <https://github.com/jpadilla/pyjwt/pull/264>`__

`v1.5.0 <https://github.com/jpadilla/pyjwt/compare/1.4.2...1.5.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Add support for ECDSA public keys in RFC 4253 (OpenSSH) format
   `#244 <https://github.com/jpadilla/pyjwt/pull/244>`__
-  Renamed commandline script ``jwt`` to ``jwt-cli`` to avoid issues
   with the script clobbering the ``jwt`` module in some circumstances.
   `#187 <https://github.com/jpadilla/pyjwt/pull/187>`__
-  Better error messages when using an algorithm that requires the
   cryptography package, but it isn't available
   `#230 <https://github.com/jpadilla/pyjwt/pull/230>`__
-  Tokens with future 'iat' values are no longer rejected
   `#190 <https://github.com/jpadilla/pyjwt/pull/190>`__
-  Non-numeric 'iat' values now raise InvalidIssuedAtError instead of
   DecodeError
-  Remove rejection of future 'iat' claims
   `#252 <https://github.com/jpadilla/pyjwt/pull/252>`__

Fixed
~~~~~

-  Add back 'ES512' for backward compatibility (for now)
   `#225 <https://github.com/jpadilla/pyjwt/pull/225>`__
-  Fix incorrectly named ECDSA algorithm
   `#219 <https://github.com/jpadilla/pyjwt/pull/219>`__
-  Fix rpm build `#196 <https://github.com/jpadilla/pyjwt/pull/196>`__

Added
~~~~~

-  Add JWK support for HMAC and RSA keys
   `#202 <https://github.com/jpadilla/pyjwt/pull/202>`__

`v1.4.2 <https://github.com/jpadilla/pyjwt/compare/1.4.1...1.4.2>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  A PEM-formatted key encoded as bytes could cause a ``TypeError`` to
   be raised `#213 <https://github.com/jpadilla/pyjwt/pull/214>`__

`v1.4.1 <https://github.com/jpadilla/pyjwt/compare/1.4.0...1.4.1>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Newer versions of Pytest could not detect warnings properly
   `#182 <https://github.com/jpadilla/pyjwt/pull/182>`__
-  Non-string 'kid' value now raises ``InvalidTokenError``
   `#174 <https://github.com/jpadilla/pyjwt/pull/174>`__
-  ``jwt.decode(None)`` now gracefully fails with ``InvalidTokenError``
   `#183 <https://github.com/jpadilla/pyjwt/pull/183>`__

`v1.4 <https://github.com/jpadilla/pyjwt/compare/1.3.0...1.4.0>`__
------------------------------------------------------------------

Fixed
~~~~~

-  Exclude Python cache files from PyPI releases.

Added
~~~~~

-  Added new options to require certain claims (require\_nbf,
   require\_iat, require\_exp) and raise ``MissingRequiredClaimError``
   if they are not present.
-  If ``audience=`` or ``issuer=`` is specified but the claim is not
   present, ``MissingRequiredClaimError`` is now raised instead of
   ``InvalidAudienceError`` and ``InvalidIssuerError``

`v1.3 <https://github.com/jpadilla/pyjwt/compare/1.2.0...1.3.0>`__
------------------------------------------------------------------

Fixed
~~~~~

-  ECDSA (ES256, ES384, ES512) signatures are now being properly
   serialized `#158 <https://github.com/jpadilla/pyjwt/pull/158>`__
-  RSA-PSS (PS256, PS384, PS512) signatures now use the proper salt
   length for PSS padding.
   `#163 <https://github.com/jpadilla/pyjwt/pull/163>`__

Added
~~~~~

-  Added a new ``jwt.get_unverified_header()`` to parse and return the
   header portion of a token prior to signature verification.

Removed
~~~~~~~

-  Python 3.2 is no longer a supported platform. This version of Python
   is rarely used. Users affected by this should upgrade to 3.3+.

`v1.2.0 <https://github.com/jpadilla/pyjwt/compare/1.1.0...1.2.0>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Added back ``verify_expiration=`` argument to ``jwt.decode()`` that
   was erroneously removed in
   `v1.1.0 <https://github.com/jpadilla/pyjwt/compare/1.0.1...1.1.0>`__.

Changed
~~~~~~~

-  Refactored JWS-specific logic out of PyJWT and into PyJWS superclass.
   `#141 <https://github.com/jpadilla/pyjwt/pull/141>`__

Deprecated
~~~~~~~~~~

-  ``verify_expiration=`` argument to ``jwt.decode()`` is now deprecated
   and will be removed in a future version. Use the ``option=`` argument
   instead.

`v1.1.0 <https://github.com/jpadilla/pyjwt/compare/1.0.1...1.1.0>`__
--------------------------------------------------------------------

Added
~~~~~

-  Added support for PS256, PS384, and PS512 algorithms.
   `#132 <https://github.com/jpadilla/pyjwt/pull/132>`__
-  Added flexible and complete verification options during decode.
   `#131 <https://github.com/jpadilla/pyjwt/pull/131>`__
-  Added this CHANGELOG.md file.

Deprecated
~~~~~~~~~~

-  Deprecated usage of the .decode(..., verify=False) parameter.

Fixed
~~~~~

-  Fixed command line encoding.
   `#128 <https://github.com/jpadilla/pyjwt/pull/128>`__

`v1.0.1 <https://github.com/jpadilla/pyjwt/compare/1.0.0...1.0.1>`__
--------------------------------------------------------------------

Fixed
~~~~~

-  Include jwt/contrib' and jwt/contrib/algorithms\` in setup.py so that
   they will actually be included when installing.
   `882524d <https://github.com/jpadilla/pyjwt/commit/882524d>`__
-  Fix bin/jwt after removing jwt.header().
   `bd57b02 <https://github.com/jpadilla/pyjwt/commit/bd57b02>`__

`v1.0.0 <https://github.com/jpadilla/pyjwt/compare/0.4.3...1.0.0>`__
--------------------------------------------------------------------

Changed
~~~~~~~

-  Moved ``jwt.api.header`` out of the public API.
   `#85 <https://github.com/jpadilla/pyjwt/pull/85>`__
-  Added README details how to extract public / private keys from an
   x509 certificate.
   `#100 <https://github.com/jpadilla/pyjwt/pull/100>`__
-  Refactor api.py functions into an object (``PyJWT``).
   `#101 <https://github.com/jpadilla/pyjwt/pull/101>`__
-  Added support for PyCrypto and ecdsa when cryptography isn't
   available. `#101 <https://github.com/jpadilla/pyjwt/pull/103>`__

Fixed
~~~~~

-  Fixed a security vulnerability where ``alg=None`` header could bypass
   signature verification.
   `#109 <https://github.com/jpadilla/pyjwt/pull/109>`__
-  Fixed a security vulnerability by adding support for a whitelist of
   allowed ``alg`` values ``jwt.decode(algorithms=[])``.
   `#110 <https://github.com/jpadilla/pyjwt/pull/110>`__
PK�(�\U��88doc/alt-python37-pyjwt/LICENSEnu�[���The MIT License (MIT)

Copyright (c) 2015 José Padilla

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
PK�(�\��^� 	 	!doc/alt-python37-pyjwt/README.rstnu�[���PyJWT
=====

.. image:: https://github.com/jpadilla/pyjwt/workflows/CI/badge.svg
   :target: https://github.com/jpadilla/pyjwt/actions?query=workflow%3ACI

.. image:: https://img.shields.io/pypi/v/pyjwt.svg
   :target: https://pypi.python.org/pypi/pyjwt

.. image:: https://codecov.io/gh/jpadilla/pyjwt/branch/master/graph/badge.svg
   :target: https://codecov.io/gh/jpadilla/pyjwt

.. image:: https://readthedocs.org/projects/pyjwt/badge/?version=stable
   :target: https://pyjwt.readthedocs.io/en/stable/

A Python implementation of `RFC 7519 <https://tools.ietf.org/html/rfc7519>`_. Original implementation was written by `@progrium <https://github.com/progrium>`_.

Sponsor
-------

+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| |auth0-logo| | If you want to quickly add secure token-based authentication to Python projects, feel free to check Auth0's Python SDK and free plan at `auth0.com/developers <https://auth0.com/developers?utm_source=GHsponsor&utm_medium=GHsponsor&utm_campaign=pyjwt&utm_content=auth>`_. |
+--------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

.. |auth0-logo| image:: https://user-images.githubusercontent.com/83319/31722733-de95bbde-b3ea-11e7-96bf-4f4e8f915588.png

Installing
----------

Install with **pip**:

.. code-block:: console

    $ pip install PyJWT


Usage
-----

.. code-block:: pycon

    >>> import jwt
    >>> encoded = jwt.encode({"some": "payload"}, "secret", algorithm="HS256")
    >>> print(encoded)
    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzb21lIjoicGF5bG9hZCJ9.Joh1R2dYzkRvDkqv3sygm5YyK8Gi4ShZqbhK2gxcs2U
    >>> jwt.decode(encoded, "secret", algorithms=["HS256"])
    {'some': 'payload'}

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

View the full docs online at https://pyjwt.readthedocs.io/en/stable/


Tests
-----

You can run tests from the project root after cloning with:

.. code-block:: console

    $ tox
PK�(�\�_�cyy doc/alt-python37-pysocks/LICENSEnu�[���Copyright 2006 Dan-Haim. All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.
3. Neither the name of Dan Haim nor the names of his contributors may be used
   to endorse or promote products derived from this software without specific
   prior written permission.
   
THIS SOFTWARE IS PROVIDED BY DAN HAIM "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
EVENT SHALL DAN HAIM OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMANGE.
PK�(�\�S�:0:0"doc/alt-python37-pysocks/README.mdnu�[���PySocks
=======

Updated and semi-actively maintained version of [SocksiPy](http://socksipy.sourceforge.net/), with bug fixes and extra features.

Acts as a drop-in replacement to the socket module.

----------------

Features
========

* SOCKS proxy client for Python 2.6 - 3.x
* TCP and UDP both supported
* HTTP proxy client included but not supported or recommended (you should use urllib2's or requests' own HTTP proxy interface)
* urllib2 handler included. `pip install` / `setup.py install` will automatically install the `sockshandler` module.

Installation
============

    pip install PySocks

Or download the tarball / `git clone` and...

    python setup.py install

These will install both the `socks` and `sockshandler` modules.

Alternatively, include just `socks.py` in your project.

--------------------------------------------

*Warning:* PySocks/SocksiPy only supports HTTP proxies that use CONNECT tunneling. Certain HTTP proxies may not work with this library. If you wish to use HTTP (not SOCKS) proxies, it is recommended that you rely on your HTTP client's native proxy support (`proxies` dict for `requests`, or `urllib2.ProxyHandler` for `urllib2`) instead.

--------------------------------------------

Usage
=====

## socks.socksocket ##

    import socks

    s = socks.socksocket() # Same API as socket.socket in the standard lib

    s.set_proxy(socks.SOCKS5, "localhost") # SOCKS4 and SOCKS5 use port 1080 by default
    # Or
    s.set_proxy(socks.SOCKS4, "localhost", 4444)
    # Or
    s.set_proxy(socks.HTTP, "5.5.5.5", 8888)

    # Can be treated identical to a regular socket object
    s.connect(("www.somesite.com", 80))
    s.sendall("GET / HTTP/1.1 ...")
    print s.recv(4096)

## Monkeypatching ##

To monkeypatch the entire standard library with a single default proxy:

    import urllib2
    import socket
    import socks

    socks.set_default_proxy(socks.SOCKS5, "localhost")
    socket.socket = socks.socksocket

    urllib2.urlopen("http://www.somesite.com/") # All requests will pass through the SOCKS proxy

Note that monkeypatching may not work for all standard modules or for all third party modules, and generally isn't recommended. Monkeypatching is usually an anti-pattern in Python.

## urllib2 Handler ##

Example use case with the `sockshandler` urllib2 handler. Note that you must import both `socks` and `sockshandler`, as the handler is its own module separate from PySocks. The module is included in the PyPI package.

    import urllib2
    import socks
    from sockshandler import SocksiPyHandler

    opener = urllib2.build_opener(SocksiPyHandler(socks.SOCKS5, "127.0.0.1", 9050))
    print opener.open("http://www.somesite.com/") # All requests made by the opener will pass through the SOCKS proxy

--------------------------------------------

Original SocksiPy README attached below, amended to reflect API changes.

--------------------------------------------

SocksiPy

A Python SOCKS module.

(C) 2006 Dan-Haim. All rights reserved.

See LICENSE file for details.


*WHAT IS A SOCKS PROXY?*

A SOCKS proxy is a proxy server at the TCP level. In other words, it acts as
a tunnel, relaying all traffic going through it without modifying it.
SOCKS proxies can be used to relay traffic using any network protocol that
uses TCP.

*WHAT IS SOCKSIPY?*

This Python module allows you to create TCP connections through a SOCKS
proxy without any special effort.
It also supports relaying UDP packets with a SOCKS5 proxy.

*PROXY COMPATIBILITY*

SocksiPy is compatible with three different types of proxies:

1. SOCKS Version 4 (SOCKS4), including the SOCKS4a extension.
2. SOCKS Version 5 (SOCKS5).
3. HTTP Proxies which support tunneling using the CONNECT method.

*SYSTEM REQUIREMENTS*

Being written in Python, SocksiPy can run on any platform that has a Python
interpreter and TCP/IP support.
This module has been tested with Python 2.3 and should work with greater versions
just as well.


INSTALLATION
-------------

Simply copy the file "socks.py" to your Python's `lib/site-packages` directory,
and you're ready to go. [Editor's note: it is better to use `python setup.py install` for PySocks]


USAGE
------

First load the socks module with the command:

    >>> import socks
    >>>

The socks module provides a class called `socksocket`, which is the base to all of the module's functionality.

The `socksocket` object has the same initialization parameters as the normal socket
object to ensure maximal compatibility, however it should be noted that `socksocket` will only function with family being `AF_INET` and
type being either `SOCK_STREAM` or `SOCK_DGRAM`.
Generally, it is best to initialize the `socksocket` object with no parameters

    >>> s = socks.socksocket()
    >>>

The `socksocket` object has an interface which is very similiar to socket's (in fact
the `socksocket` class is derived from socket) with a few extra methods.
To select the proxy server you would like to use, use the `set_proxy` method, whose
syntax is:

    set_proxy(proxy_type, addr[, port[, rdns[, username[, password]]]])

Explanation of the parameters:

`proxy_type` - The type of the proxy server. This can be one of three possible
choices: `PROXY_TYPE_SOCKS4`, `PROXY_TYPE_SOCKS5` and `PROXY_TYPE_HTTP` for SOCKS4,
SOCKS5 and HTTP servers respectively. `SOCKS4`, `SOCKS5`, and `HTTP` are all aliases, respectively.

`addr` - The IP address or DNS name of the proxy server.

`port` - The port of the proxy server. Defaults to 1080 for socks and 8080 for http.

`rdns` - This is a boolean flag than modifies the behavior regarding DNS resolving.
If it is set to True, DNS resolving will be preformed remotely, on the server.
If it is set to False, DNS resolving will be preformed locally. Please note that
setting this to True with SOCKS4 servers actually use an extension to the protocol,
called SOCKS4a, which may not be supported on all servers (SOCKS5 and http servers
always support DNS). The default is True.

`username` - For SOCKS5 servers, this allows simple username / password authentication
with the server. For SOCKS4 servers, this parameter will be sent as the userid.
This parameter is ignored if an HTTP server is being used. If it is not provided,
authentication will not be used (servers may accept unauthenticated requests).

`password` - This parameter is valid only for SOCKS5 servers and specifies the
respective password for the username provided.

Example of usage:

    >>> s.set_proxy(socks.SOCKS5, "socks.example.com") # uses default port 1080
    >>> s.set_proxy(socks.SOCKS4, "socks.test.com", 1081)

After the set_proxy method has been called, simply call the connect method with the
traditional parameters to establish a connection through the proxy:

    >>> s.connect(("www.sourceforge.net", 80))
    >>>

Connection will take a bit longer to allow negotiation with the proxy server.
Please note that calling connect without calling `set_proxy` earlier will connect
without a proxy (just like a regular socket).

Errors: Any errors in the connection process will trigger exceptions. The exception
may either be generated by the underlying socket layer or may be custom module
exceptions, whose details follow:

class `ProxyError` - This is a base exception class. It is not raised directly but
rather all other exception classes raised by this module are derived from it.
This allows an easy way to catch all proxy-related errors. It descends from `IOError`.

All `ProxyError` exceptions have an attribute `socket_err`, which will contain either a
caught `socket.error` exception, or `None` if there wasn't any.

class `GeneralProxyError` - When thrown, it indicates a problem which does not fall
into another category.

* `Sent invalid data` - This error means that unexpected data has been received from
the server. The most common reason is that the server specified as the proxy is
not really a SOCKS4/SOCKS5/HTTP proxy, or maybe the proxy type specified is wrong.

* `Connection closed unexpectedly` - The proxy server unexpectedly closed the connection.
This may indicate that the proxy server is experiencing network or software problems.

* `Bad proxy type` - This will be raised if the type of the proxy supplied to the
set_proxy function was not one of `SOCKS4`/`SOCKS5`/`HTTP`.

* `Bad input` - This will be raised if the `connect()` method is called with bad input
parameters.

class `SOCKS5AuthError` - This indicates that the connection through a SOCKS5 server
failed due to an authentication problem.

* `Authentication is required` - This will happen if you use a SOCKS5 server which
requires authentication without providing a username / password at all.

* `All offered authentication methods were rejected` - This will happen if the proxy
requires a special authentication method which is not supported by this module.

* `Unknown username or invalid password` - Self descriptive.

class `SOCKS5Error` - This will be raised for SOCKS5 errors which are not related to
authentication.
The parameter is a tuple containing a code, as given by the server,
and a description of the
error. The possible errors, according to the RFC, are:

* `0x01` - General SOCKS server failure - If for any reason the proxy server is unable to
fulfill your request (internal server error).
* `0x02` - connection not allowed by ruleset - If the address you're trying to connect to
is blacklisted on the server or requires authentication.
* `0x03` - Network unreachable - The target could not be contacted. A router on the network
had replied with a destination net unreachable error.
* `0x04` - Host unreachable - The target could not be contacted. A router on the network
had replied with a destination host unreachable error.
* `0x05` - Connection refused - The target server has actively refused the connection
(the requested port is closed).
* `0x06` - TTL expired - The TTL value of the SYN packet from the proxy to the target server
has expired. This usually means that there are network problems causing the packet
to be caught in a router-to-router "ping-pong".
* `0x07` - Command not supported - For instance if the server does not support UDP.
* `0x08` - Address type not supported - The client has provided an invalid address type.
When using this module, this error should not occur.

class `SOCKS4Error` - This will be raised for SOCKS4 errors. The parameter is a tuple
containing a code and a description of the error, as given by the server. The
possible error, according to the specification are:

* `0x5B` - Request rejected or failed - Will be raised in the event of an failure for any
reason other then the two mentioned next.
* `0x5C` - request rejected because SOCKS server cannot connect to identd on the client -
The Socks server had tried an ident lookup on your computer and has failed. In this
case you should run an identd server and/or configure your firewall to allow incoming
connections to local port 113 from the remote server.
* `0x5D` - request rejected because the client program and identd report different user-ids -
The Socks server had performed an ident lookup on your computer and has received a
different userid than the one you have provided. Change your userid (through the
username parameter of the set_proxy method) to match and try again.

class `HTTPError` - This will be raised for HTTP errors. The message will contain
the HTTP status code and provided error message.

After establishing the connection, the object behaves like a standard socket.

Methods like `makefile()` and `settimeout()` should behave just like regular sockets.
Call the `close()` method to close the connection.

In addition to the `socksocket` class, an additional function worth mentioning is the
`set_default_proxy` function. The parameters are the same as the `set_proxy` method.
This function will set default proxy settings for newly created `socksocket` objects,
in which the proxy settings haven't been changed via the `set_proxy` method.
This is quite useful if you wish to force 3rd party modules to use a SOCKS proxy,
by overriding the socket object.
For example:

    >>> socks.set_default_proxy(socks.SOCKS5, "socks.example.com")
    >>> socket.socket = socks.socksocket
    >>> urllib.urlopen("http://www.sourceforge.net/")


PROBLEMS
---------

Please open a GitHub issue at https://github.com/Anorov/PySocks
PK�(�\�>��1�1doc/alt-python37/LICENSEnu�[���A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations, which became
Zope Corporation.  In 2001, the Python Software Foundation (PSF, see
https://www.python.org/psf/) was formed, a non-profit organization
created specifically to own Python-related Intellectual Property.
Zope Corporation was a sponsoring member of the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation;
All Rights Reserved" are retained in Python alone or in any derivative version
prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
PK�(�\"z���&�&doc/alt-python37/README.rstnu�[���This is Python version 3.7.17
=============================

.. image:: https://travis-ci.org/python/cpython.svg?branch=3.7
   :alt: CPython build status on Travis CI
   :target: https://travis-ci.org/python/cpython/branches

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=3.7
   :alt: CPython build status on Azure Pipelines
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=3.7

.. image:: https://codecov.io/gh/python/cpython/branch/3.7/graph/badge.svg
   :alt: CPython code coverage on Codecov
   :target: https://codecov.io/gh/python/cpython/branch/3.7

Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

See the end of this file for further copyright and license information.

.. contents::

General Information
-------------------

- Website: https://www.python.org
- Source code: https://github.com/python/cpython
- Issue tracker: https://github.com/python/cpython/issues/
- Documentation: https://docs.python.org
- Developer's Guide: https://devguide.python.org/

Contributing to CPython
-----------------------

For more complete instructions on contributing to CPython development,
see the `Developer Guide`_.

.. _Developer Guide: https://devguide.python.org/

Using Python
------------

Installable Python kits, and information about using Python, are available at
`python.org`_.

.. _python.org: https://www.python.org/

Build Instructions
------------------

On Unix, Linux, BSD, macOS, and Cygwin::

    ./configure
    make
    make test
    sudo make install

This will install Python as ``python3``.

You can pass many options to the configure script; run ``./configure --help``
to find out more.  On macOS case-insensitive file systems and on Cygwin,
the executable is called ``python.exe``; elsewhere it's just ``python``.

Building a complete Python installation requires the use of various
additional third-party libraries, depending on your build platform and
configure options.  Not all standard library modules are buildable or
useable on all platforms.  Refer to the
`Install dependencies <https://devguide.python.org/setup/#install-dependencies>`_
section of the `Developer Guide`_ for current detailed information on
dependencies for various Linux distributions and macOS.

On macOS, there are additional configure and build options related
to macOS framework and universal builds.  Refer to `Mac/README.rst
<https://github.com/python/cpython/blob/3.7/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/3.7/PCbuild/readme.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the toplevel first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.


Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavour. Note that this is just an intermediary step.  The
binary resulting from this step is not good for real life workloads as it has
profiling instructions embedded inside.

After the instrumented interpreter is built, the Makefile will run a training
workload.  This is necessary in order to profile the interpreter execution.
Note also that any output, both stdout and stderr, that may appear at this step
is suppressed.

The final step is to build the actual interpreter, using the information
collected from the instrumented one.  The end result will be a Python binary
that is optimized; suitable for distribution or production installation.


Link Time Optimization
^^^^^^^^^^^^^^^^^^^^^^

Enabled via configure's ``--with-lto`` flag.  LTO takes advantage of the
ability of recent compiler toolchains to optimize across the otherwise
arbitrary ``.o`` file boundary when building final executables or shared
libraries for additional performance gains.


What's New
----------

We have a comprehensive overview of the changes in the `What's New in Python
3.7 <https://docs.python.org/3.7/whatsnew/3.7.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/blob/3.7/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/3.7>`_.

If you want to install multiple versions of Python see the section below
entitled "Installing multiple versions".


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

`Documentation for Python 3.7 <https://docs.python.org/3.7/>`_ is online,
updated daily.

It can also be downloaded in many formats for faster access.  The documentation
is downloadable in HTML, PDF, and reStructuredText formats; the latter version
is primarily for documentation authors, translators, and people with special
formatting requirements.

For information about building Python's documentation, refer to `Doc/README.rst
<https://github.com/python/cpython/blob/3.7/Doc/README.rst>`_.


Converting From Python 2.x to 3.x
---------------------------------

Significant backward incompatible changes were made for the release of Python
3.0, which may cause programs written for Python 2 to fail when run with Python
3.  For more information about porting your code from Python 2 to Python 3, see
the `Porting HOWTO <https://docs.python.org/3/howto/pyporting.html>`_.


Testing
-------

To test the interpreter, type ``make test`` in the top-level directory.  The
test set produces some output.  You can generally ignore the messages about
skipped tests due to optional features which can't be imported.  If a message
is printed about a failed test or a traceback or core dump is produced,
something is wrong.

By default, tests are prevented from overusing resources like disk space and
memory.  To enable these tests, run ``make testall``.

If any tests fail, you can re-run the failing test(s) in verbose mode.  For
example, if ``test_os`` and ``test_gdb`` failed, you can run::

    make test TESTOPTS="-v test_os test_gdb"

If the failure persists and appears to be a problem with Python rather than
your environment, you can `file a bug report <https://github.com/python/cpython/issues/>`_ and
include relevant output from that command to show the issue.

See `Running & Writing Tests <https://devguide.python.org/runtests/>`_
for more on running tests.

Installing multiple versions
----------------------------

On Unix and Mac systems if you intend to install multiple versions of Python
using the same installation prefix (``--prefix`` argument to the configure
script) you must take care that your primary python executable is not
overwritten by the installation of a different version.  All files and
directories installed using ``make altinstall`` contain the major and minor
version and can thus live side-by-side.  ``make install`` also creates
``${prefix}/bin/python3`` which refers to ``${prefix}/bin/pythonX.Y``.  If you
intend to install multiple versions using the same prefix you must decide which
version (if any) is your "primary" version.  Install that version using ``make
install``.  Install all other versions using ``make altinstall``.

For example, if you want to install Python 2.7, 3.6, and 3.7 with 3.7 being the
primary version, you would execute ``make install`` in your 3.7 build directory
and ``make altinstall`` in the others.


Issue Tracker and Mailing List
------------------------------

Bug reports are welcome!  You can use the `issue tracker
<https://github.com/python/cpython/issues/>`_ to report bugs, and/or submit pull requests `on
GitHub <https://github.com/python/cpython>`_.

You can also follow development discussion on the `python-dev mailing list
<https://mail.python.org/mailman/listinfo/python-dev/>`_.


Proposals for enhancement
-------------------------

If you have a proposal to change Python, you may want to send an email to the
comp.lang.python or `python-ideas`_ mailing lists for initial feedback.  A
Python Enhancement Proposal (PEP) may be submitted if your idea gains ground.
All current PEPs, as well as guidelines for submitting a new PEP, are listed at
`python.org/dev/peps/ <https://www.python.org/dev/peps/>`_.

.. _python-ideas: https://mail.python.org/mailman/listinfo/python-ideas/


Release Schedule
----------------

See :pep:`537` for Python 3.7 release details.


Copyright and License Information
---------------------------------

Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

Copyright © 2000 BeOpen.com.  All rights reserved.

Copyright © 1995-2001 Corporation for National Research Initiatives.  All
rights reserved.

Copyright © 1991-1995 Stichting Mathematisch Centrum.  All rights reserved.

See the file "LICENSE" for information on the history of this software, terms &
conditions for usage, and a DISCLAIMER OF ALL WARRANTIES.

This Python distribution contains *no* GNU General Public License (GPL) code,
so it may be used in proprietary projects.  There are interfaces to some GNU
code but these are entirely optional.

All trademarks referenced herein are property of their respective holders.
PK�(�\k�d�@g@g doc/alt-python37-chardet/LICENSEnu�[���		  GNU LESSER GENERAL PUBLIC LICENSE
		       Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
     51 Franklin St, 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.

[This is the first released version of the Lesser GPL.  It also counts
 as the successor of the GNU Library Public License, version 2, hence
 the version number 2.1.]

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.

  This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it.  You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.

  When we speak of free software, we are referring to freedom of use,
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 and use pieces of
it in new free programs; and that you are informed that you can do
these things.

  To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights.  These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.

  For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you.  You must make sure that they, too, receive or can get the source
code.  If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it.  And you must show them these terms so they know their rights.

  We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.

  To protect each distributor, we want to make it very clear that
there is no warranty for the free library.  Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.

  Finally, software patents pose a constant threat to the existence of
any free program.  We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder.  Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.

  Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License.  This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License.  We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.

  When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library.  The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom.  The Lesser General
Public License permits more lax criteria for linking other code with
the library.

  We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License.  It also provides other free software developers Less
of an advantage over competing non-free programs.  These disadvantages
are the reason we use the ordinary General Public License for many
libraries.  However, the Lesser license provides advantages in certain
special circumstances.

  For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard.  To achieve this, non-free programs must be
allowed to use the library.  A more frequent case is that a free
library does the same job as widely used non-free libraries.  In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.

  In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software.  For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.

  Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.

  The precise terms and conditions for copying, distribution and
modification follow.  Pay close attention to the difference between a
"work based on the library" and a "work that uses the library".  The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.

		  GNU LESSER GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".

  A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.

  The "Library", below, refers to any such software library or work
which has been distributed under these terms.  A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language.  (Hereinafter, translation is
included without limitation in the term "modification".)

  "Source code" for a work means the preferred form of the work for
making modifications to it.  For a library, 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 library.

  Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it).  Whether that is true depends on what the Library does
and what the program that uses the Library does.
  
  1. You may copy and distribute verbatim copies of the Library's
complete 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 distribute a copy of this License along with the
Library.

  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 Library or any portion
of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.

    b) You must cause the files modified to carry prominent notices
    stating that you changed the files and the date of any change.

    c) You must cause the whole of the work to be licensed at no
    charge to all third parties under the terms of this License.

    d) If a facility in the modified Library refers to a function or a
    table of data to be supplied by an application program that uses
    the facility, other than as an argument passed when the facility
    is invoked, then you must make a good faith effort to ensure that,
    in the event an application does not supply such function or
    table, the facility still operates, and performs whatever part of
    its purpose remains meaningful.

    (For example, a function in a library to compute square roots has
    a purpose that is entirely well-defined independent of the
    application.  Therefore, Subsection 2d requires that any
    application-supplied function or table used by this function must
    be optional: if the application does not supply it, the square
    root function must still compute square roots.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Library,
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 Library, 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 Library.

In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library.  To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License.  (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.)  Do not make any other change in
these notices.

  Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.

  This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.

  4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you 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.

  If distribution of 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 satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.

  5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library".  Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.

  However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library".  The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.

  When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library.  The
threshold for this to be true is not precisely defined by law.

  If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work.  (Executables containing this object code plus portions of the
Library will still fall under Section 6.)

  Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.

  6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.

  You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License.  You must supply a copy of this License.  If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License.  Also, you must do one
of these things:

    a) Accompany the work with the complete corresponding
    machine-readable source code for the Library including whatever
    changes were used in the work (which must be distributed under
    Sections 1 and 2 above); and, if the work is an executable linked
    with the Library, with the complete machine-readable "work that
    uses the Library", as object code and/or source code, so that the
    user can modify the Library and then relink to produce a modified
    executable containing the modified Library.  (It is understood
    that the user who changes the contents of definitions files in the
    Library will not necessarily be able to recompile the application
    to use the modified definitions.)

    b) Use a suitable shared library mechanism for linking with the
    Library.  A suitable mechanism is one that (1) uses at run time a
    copy of the library already present on the user's computer system,
    rather than copying library functions into the executable, and (2)
    will operate properly with a modified version of the library, if
    the user installs one, as long as the modified version is
    interface-compatible with the version that the work was made with.

    c) Accompany the work with a written offer, valid for at
    least three years, to give the same user the materials
    specified in Subsection 6a, above, for a charge no more
    than the cost of performing this distribution.

    d) If distribution of the work is made by offering access to copy
    from a designated place, offer equivalent access to copy the above
    specified materials from the same place.

    e) Verify that the user has already received a copy of these
    materials or that you have already sent this user a copy.

  For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it.  However, as a special exception,
the materials to be 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.

  It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system.  Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.

  7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:

    a) Accompany the combined library with a copy of the same work
    based on the Library, uncombined with any other library
    facilities.  This must be distributed under the terms of the
    Sections above.

    b) Give prominent notice with the combined library of the fact
    that part of it is a work based on the Library, and explaining
    where to find the accompanying uncombined form of the same work.

  8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License.  Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library 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.

  9. 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 Library or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.

  10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
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 with
this License.

  11. 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 Library at all.  For example, if a patent
license would not permit royalty-free redistribution of the Library 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 Library.

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.

  12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library 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.

  13. The Free Software Foundation may publish revised and/or new
versions of the Lesser 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 Library
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 Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.

  14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
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

  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "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
LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. 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 LIBRARY 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
LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries

  If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change.  You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).

  To apply these terms, attach the following notices to the library.  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.

    <one line to give the library's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library 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
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

Also add information on how to contact you by electronic and paper mail.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  library `Frob' (a library for tweaking knobs) written by James Random Hacker.

  <signature of Ty Coon>, 1 April 1990
  Ty Coon, President of Vice

That's all there is to it!


PK�(�\H�Z||#doc/alt-python37-chardet/README.rstnu�[���Chardet: The Universal Character Encoding Detector
--------------------------------------------------

.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg
   :alt: Build status
   :target: https://travis-ci.org/chardet/chardet

.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg
   :target: https://coveralls.io/r/chardet/chardet

.. image:: https://img.shields.io/pypi/v/chardet.svg
   :target: https://warehouse.python.org/project/chardet/
   :alt: Latest version on PyPI

.. image:: https://img.shields.io/pypi/l/chardet.svg
   :alt: License


Detects
 - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)
 - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)
 - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese)
 - EUC-KR, ISO-2022-KR (Korean)
 - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)
 - ISO-8859-5, windows-1251 (Bulgarian)
 - ISO-8859-1, windows-1252 (Western European languages)
 - ISO-8859-7, windows-1253 (Greek)
 - ISO-8859-8, windows-1255 (Visual and Logical Hebrew)
 - TIS-620 (Thai)

.. note::
   Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily
   disabled until we can retrain the models.

Requires Python 2.6, 2.7, or 3.3+.

Installation
------------

Install from `PyPI <https://pypi.python.org/pypi/chardet>`_::

    pip install chardet

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

For users, docs are now available at https://chardet.readthedocs.io/.

Command-line Tool
-----------------

chardet comes with a command-line script which reports on the encodings of one
or more files::

    % chardetect somefile someotherfile
    somefile: windows-1252 with confidence 0.5
    someotherfile: ascii with confidence 1.0

About
-----

This is a continuation of Mark Pilgrim's excellent chardet. Previously, two
versions needed to be maintained: one that supported python 2.x and one that
supported python 3.x.  We've recently merged with `Ian Cordasco <https://github.com/sigmavirus24>`_'s
`charade <https://github.com/sigmavirus24/charade>`_ fork, so now we have one
coherent version that works for Python 2.6+.

:maintainer: Dan Blanchard
PK�(�\�M�!!#doc/alt-python37-jsonschema/COPYINGnu�[���Copyright (c) 2013 Julian Berman

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�(�\�8AH&doc/alt-python37-jsonschema/README.rstnu�[���==========
jsonschema
==========

|PyPI| |Pythons| |Travis| |AppVeyor| |Codecov| |ReadTheDocs|

.. |PyPI| image:: https://img.shields.io/pypi/v/jsonschema.svg
   :alt: PyPI version
   :target: https://pypi.org/project/jsonschema/

.. |Pythons| image:: https://img.shields.io/pypi/pyversions/jsonschema.svg
   :alt: Supported Python versions
   :target: https://pypi.org/project/jsonschema/

.. |Travis| image:: https://travis-ci.com/Julian/jsonschema.svg?branch=master
   :alt: Travis build status
   :target: https://travis-ci.com/Julian/jsonschema

.. |AppVeyor| image:: https://ci.appveyor.com/api/projects/status/adtt0aiaihy6muyn/branch/master?svg=true
   :alt: AppVeyor build status
   :target: https://ci.appveyor.com/project/Julian/jsonschema

.. |Codecov| image:: https://codecov.io/gh/Julian/jsonschema/branch/master/graph/badge.svg
   :alt: Codecov Code coverage
   :target: https://codecov.io/gh/Julian/jsonschema

.. |ReadTheDocs| image:: https://readthedocs.org/projects/python-jsonschema/badge/?version=stable&style=flat
   :alt: ReadTheDocs status
   :target: https://python-jsonschema.readthedocs.io/en/stable/


``jsonschema`` is an implementation of `JSON Schema <https://json-schema.org>`_
for Python (supporting 2.7+ including Python 3).

.. code-block:: python

    >>> from jsonschema import validate

    >>> # A sample schema, like what we'd get from json.load()
    >>> schema = {
    ...     "type" : "object",
    ...     "properties" : {
    ...         "price" : {"type" : "number"},
    ...         "name" : {"type" : "string"},
    ...     },
    ... }

    >>> # If no exception is raised by validate(), the instance is valid.
    >>> validate(instance={"name" : "Eggs", "price" : 34.99}, schema=schema)

    >>> validate(
    ...     instance={"name" : "Eggs", "price" : "Invalid"}, schema=schema,
    ... )                                   # doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last):
        ...
    ValidationError: 'Invalid' is not of type 'number'

It can also be used from console:

.. code-block:: bash

    $ jsonschema -i sample.json sample.schema

Features
--------

* Full support for
  `Draft 7 <https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.Draft7Validator>`_,
  `Draft 6 <https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.Draft6Validator>`_,
  `Draft 4 <https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.Draft4Validator>`_
  and
  `Draft 3 <https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.Draft3Validator>`_

* `Lazy validation <https://python-jsonschema.readthedocs.io/en/latest/validate/#jsonschema.IValidator.iter_errors>`_
  that can iteratively report *all* validation errors.

* `Programmatic querying <https://python-jsonschema.readthedocs.io/en/latest/errors/>`_
  of which properties or items failed validation.


Installation
------------

``jsonschema`` is available on `PyPI <https://pypi.org/project/jsonschema/>`_. You can install using `pip <https://pip.pypa.io/en/stable/>`_:

.. code-block:: bash

    $ pip install jsonschema


Demo
----

Try ``jsonschema`` interactively in this online demo:

.. image:: https://user-images.githubusercontent.com/1155573/56745335-8b158a00-6750-11e9-8776-83fa675939c4.png
    :target: https://notebooks.ai/demo/gh/Julian/jsonschema
    :alt: Open Live Demo


Online demo Notebook will look similar to this:


.. image:: https://user-images.githubusercontent.com/1155573/56820861-5c1c1880-6823-11e9-802a-ce01c5ec574f.gif
    :alt: Open Live Demo
    :width: 480 px


Release Notes
-------------

v3.1 brings support for ECMA 262 dialect regular expressions
throughout schemas, as recommended by the specification. Big
thanks to @Zac-HD for authoring support in a new `js-regex
<https://pypi.org/project/js-regex/>`_ library.


Running the Test Suite
----------------------

If you have ``tox`` installed (perhaps via ``pip install tox`` or your
package manager), running ``tox`` in the directory of your source
checkout will run ``jsonschema``'s test suite on all of the versions
of Python ``jsonschema`` supports. If you don't have all of the
versions that ``jsonschema`` is tested under, you'll likely want to run
using ``tox``'s ``--skip-missing-interpreters`` option.

Of course you're also free to just run the tests on a single version with your
favorite test runner. The tests live in the ``jsonschema.tests`` package.


Benchmarks
----------

``jsonschema``'s benchmarks make use of `pyperf
<https://pyperf.readthedocs.io>`_.

Running them can be done via ``tox -e perf``, or by invoking the ``pyperf``
commands externally (after ensuring that both it and ``jsonschema`` itself are
installed)::

    $ python -m pyperf jsonschema/benchmarks/test_suite.py --hist --output results.json

To compare to a previous run, use::

    $ python -m pyperf compare_to --table reference.json results.json

See the ``pyperf`` documentation for more details.


Community
---------

There's a `mailing list <https://groups.google.com/forum/#!forum/jsonschema>`_
for this implementation on Google Groups.

Please join, and feel free to send questions there.


Contributing
------------

I'm Julian Berman.

``jsonschema`` is on `GitHub <https://github.com/Julian/jsonschema>`_.

Get in touch, via GitHub or otherwise, if you've got something to contribute,
it'd be most welcome!

You can also generally find me on Freenode (nick: ``tos9``) in various
channels, including ``#python``.

If you feel overwhelmingly grateful, you can also woo me with beer money
via Google Pay with the email in my GitHub profile.

And for companies who appreciate ``jsonschema`` and its continued support
and growth, ``jsonschema`` is also now supportable via `TideLift
<https://tidelift.com/subscription/pkg/pypi-jsonschema?utm_source=pypi-j
sonschema&utm_medium=referral&utm_campaign=readme>`_.
PK�(�\O�	�1�1*doc/alt-python37-typing-extensions/LICENSEnu�[���A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com).  In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property.  Zope Corporation is a sponsoring member of
the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2 and above   2.1.1       2001-now    PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
--------------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using this software ("Python") in source or binary form and
its associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF hereby
grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python alone or in any derivative version,
provided, however, that PSF's License Agreement and PSF's notice of copyright,
i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011, 2012, 2013, 2014 Python Software Foundation; All Rights Reserved" are
retained in Python alone or in any derivative version prepared by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python.

4. PSF is making Python available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.

        ACCEPT


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
PK�(�\
>A?#
#
-doc/alt-python37-typing-extensions/README.rstnu�[���=================
Typing Extensions
=================

.. image:: https://badges.gitter.im/python/typing.svg
 :alt: Chat at https://gitter.im/python/typing
 :target: https://gitter.im/python/typing?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge

Overview
========

The ``typing`` module was added to the standard library in Python 3.5 on
a provisional basis and will no longer be provisional in Python 3.7. However,
this means users of Python 3.5 - 3.6 who are unable to upgrade will not be
able to take advantage of new types added to the ``typing`` module, such as
``typing.Text`` or ``typing.Coroutine``.

The ``typing_extensions`` module contains both backports of these changes
as well as experimental types that will eventually be added to the ``typing``
module, such as ``Protocol`` (see PEP 544 for details about protocols and
static duck typing) or ``TypedDict`` (see PEP 589).

Users of other Python versions should continue to install and use
use the ``typing`` module from PyPi instead of using this one unless
specifically writing code that must be compatible with multiple Python
versions or requires experimental types.

Included items
==============

This module currently contains the following:

All Python versions:
--------------------

- ``ClassVar``
- ``ContextManager``
- ``Counter``
- ``DefaultDict``
- ``Deque``
- ``final``
- ``Final``
- ``Literal``
- ``NewType``
- ``NoReturn``
- ``overload`` (note that older versions of ``typing`` only let you use ``overload`` in stubs)
- ``Protocol`` (except on Python 3.5.0)
- ``runtime`` (except on Python 3.5.0)
- ``Text``
- ``Type``
- ``TypedDict``
- ``TYPE_CHECKING``

Python 3.4+ only:
-----------------

- ``ChainMap``

Python 3.5+ only:
-----------------

- ``AsyncIterable``
- ``AsyncIterator``
- ``AsyncContextManager``
- ``Awaitable``
- ``Coroutine``

Python 3.6+ only:
-----------------

- ``AsyncGenerator``

Other Notes and Limitations
===========================

There are a few types whose interface was modified between different
versions of typing. For example, ``typing.Sequence`` was modified to
subclass ``typing.Reversible`` as of Python 3.5.3.

These changes are _not_ backported to prevent subtle compatibility
issues when mixing the differing implementations of modified classes.

Running tests
=============

To run tests, navigate into the appropriate source directory and run
``test_typing_extensions.py``. You will also need to install the latest
version of ``typing`` if you are using a version of Python that does not
include ``typing`` as a part of the standard library.

PK�(�\J`\T*T*doc/alt-python37-psutil/CREDITSnu�[���Intro
-------------------------------------------------------------------------------

I would like to recognize some of the people who have been instrumental in the
development of psutil. I'm sure I'm forgetting somebody (feel free to email me)
but here is a short list. It's modeled after the Linux CREDITS file where the
fields are: name (N), e-mail (E), website (W), country (C), description (D),
(I) issues. Issue tracker is at:
https://github.com/giampaolo/psutil/issues.
A big thanks to all of you.

- Giampaolo

Author
-------------------------------------------------------------------------------

N: Giampaolo Rodola
C: Italy
E: g.rodola@gmail.com
W: https://gmpy.dev

Experts
-------------------------------------------------------------------------------

Github usernames of people to CC on github when in need of help.

- NetBSD:
    - 0-wiz-0, Thomas Klausner
    - ryoqun, Ryo Onodera
- OpenBSD:
    - landryb, Landry Breuil
- FreeBSD:
    - glebius, Gleb Smirnoff (#1013)
    - sunpoet, Po-Chuan Hsieh (pkg maintainer, #1105)
    - kostikbel, Konstantin Belousov (#1105)
- macOS:
    - whitlockjc, Jeremy Whitlock
- Windows:
    - mrjefftang, Jeff Tang
    - wj32, Wen Jia Liu
    - fbenkstein, Frank Benkstein
- SunOS:
    - wiggin15, Arnon Yaari
    - alxchk, Oleksii Shevchuk
- AIX:
    - wiggin15, Arnon Yaari (maintainer)

Top contributors
-------------------------------------------------------------------------------

N: Jay Loden
C: NJ, USA
E: jloden@gmail.com
D: original co-author, initial design/bootstrap and occasional bug fixes
W: http://www.jayloden.com

N: Arnon Yaari (wiggin15)
W: https://github.com/wiggin15
D: AIX implementation, expert on multiple fronts
I: 517, 607, 610, 1131, 1123, 1130, 1154, 1164, 1174, 1177, 1210, 1214, 1408,
   1329, 1276, 1494, 1528.

N: Alex Manuskin
W: https://github.com/amanusk
D: FreeBSD cpu_freq(), OSX temperatures, support for Linux temperatures.
I: 1284, 1345, 1350, 1352, 1472, 1481, 1487.

N: Jeff Tang
W: https://github.com/mrjefftang
I: 340, 529, 616, 653, 654, 648, 641

N: Jeremy Whitlock
D: great help with macOS C development.
I: 125, 150, 174, 206

N: Landry Breuil
W: https://github.com/landryb
D: OpenBSD implementation.
I: 615

N: Justin Venus
D: Solaris support
I: 18

N: Thomas Klausner
W: https://github.com/0-wiz-0
D: NetBSD implementation (co-author).
I: 557

N: Ryo Onodera
W: https://github.com/ryoon
D: NetBSD implementation (co-author).
I: 557

Donations
-------------------------------------------------------------------------------

N: Rodion Stratov
C: Canada

N: Remi Chateauneu
C: London, UK

N: Olivier Grisel
C: Paris, France

N: Praveen Bhamidipati
C: Bellevue, USA

N: Willem de Groot
C: Netherlands

N: Sigmund Vik

N: Kahntent
C: NYC, USA

N: Gyula Áfra
C: Budapest, Hungary

N: Mahmut Dumlupinar

N: Thomas Guettler
C: Germany

N: Karthik Kumar
C: India

N: Oche Ejembi
C: UK

N: Russell Robinson
C: New Zealand

N: Wompasoft
C: Texas, USA

N: Amit Kulkarni
C: Santa Clara, USA

N: Alexander Kaftan
C: Augsburg Germany

N: Andrew Bays
C: Maynard, USA

N: Carver Koella
C: Pittsburgh, USA

N: Kristjan Võrk
C: Tallin, Estonia

N: HTB Industries
C: Willow Springs, USA

N: Brett Harris
C: Melbourne, Australia

N: Peter Friedland
C: CT, USA

N: Matthew Callow
C: Australia

N: Marco Schrank
C: Germany

N: Mindview LLC
C: USA

N: Григорьев Андрей
C: Russia

N: Heijdemann Morgan
C: Singapore

N: Florian Bruhin
C: Winterthur, Switzerland

N: Heijdemann Morgan
C: Singapore

N: Morgan Heijdemann
C: Singapore

Contributors
-------------------------------------------------------------------------------

N: wj32
D: process username() and get_connections() on Windows
I: 114, 115

N: Yan Raber
C: Bologna, Italy
D: help on Windows development (initial version of Process.username())

N: Dave Daeschler
C: USA
W: http://daviddaeschler.com
D: some contributions to initial design/bootstrap plus occasional bug fixing
I: 522, 536

N: cjgohlke
D: Windows 64 bit support
I: 107

N: Frank Benkstein
D: process environ()
W: https://github.com/fbenkstein
I: 732, 733

N: Mozilla Foundation
D: sample code for process USS memory.

N: EccoTheFlintstone
W: https://github.com/EccoTheFlintstone
I: 1368, 1348

----

N: Jeffery Kline
I: 130

N: Grabriel Monnerat
I: 146

N: Philip Roberts
I: 168

N: jcscoobyrs
I: 125

N: Sandro Tosi
I: 200, 201

N: Andrew Colin
I: 248

N: Amoser
I: 266, 267, 340

N: Matthew Grant
I: 271

N: oweidner
I: 275

N: Tarek Ziade
I: 281

N: Luca Cipriani
C: Turin, Italy
I: 278

N: Maciej Lach,
I: 294

N: James Pye
I: 305, 306

N: Stanchev Emil
I: 314

N: Kim Gräsman
D: ...also kindly donated some money.
I: 316

N: Riccardo Murri
C: Italy
I: 318

N: Florent Xicluna
I: 319

N: Michal Spondr
I: 313

N: Jean Sebastien
I: 344

N: Rob Smith
W: http://www.kormoc.com/
I: 341

N: Youngsik Kim
W: https://plus.google.com/101320747613749824490/
I: 317

N: Gregory Szorc
W: https://plus.google.com/116873264322260110710/posts
I: 323

N: André Oriani
I: 361

N: clackwell
I: 356

N: m.malycha
I: 351

N: John Baldwin
I: 370

N: Jan Beich
I: 325

N: floppymaster
I: 380

N: Arfrever.FTA
I: 369, 404

N: danudey
I: 386

N: Adrien Fallou
I: 224

N: Gisle Vanem
I: 411

N: thepyr0
I: 414

N: John Pankov
I: 435

N: Matt Good
W: http://matt-good.net/
I: 438

N: Ulrich Klank
I: 448

N: Josiah Carlson
I: 451, 452

N: Raymond Hettinger
D: namedtuple and lru_cache backward compatible implementations.

N: Jason Kirtland
D: backward compatible implementation of collections.defaultdict.

M: Ken Seeho
D: @cached_property decorator

N: crusaderky
I: 470, 477

I: 471

N: Gautam Singh
I: 466

I: 476, 479

N: Francois Charron
I: 474

N: Naveed Roudsari
I: 421

N: Alexander Grothe
I: 497

N: Szigeti Gabor Niif
I: 446

N: msabramo
I: 492

N: Yaolong Huang
W: http://airekans.github.io/
I: 530

N: Anders Chrigström
W: https://github.com/anders-chrigstrom
I: 496

N: spacewander
W: https://github.com/spacewander
I: 561, 603

N: Sylvain Mouquet
I: 565

N: karthikrev
I: 568

N: Bruno Binet
I: 572

N: Gabi Davar
C: Israel
W: https://github.com/mindw
I: 578, 581, 587

N: spacewanderlzx
C: Guangzhou,China
I: 555

N: Fabian Groffen
I: 611, 618

N: desbma
W: https://github.com/desbma
C: France
I: 628

N: John Burnett
W: http://www.johnburnett.com/
C: Irvine, CA, US
I: 614

N: Árni Már Jónsson
I: 634

N: Bart van Kleef
W: https://github.com/bkleef
I: 664

N: Steven Winfield
W: https://github.com/stevenwinfield
I: 672

N: sk6249
W: https://github.com/sk6249
I: 670

N: maozguttman
W: https://github.com/maozguttman
I: 659

N: dasumin
W: https://github.com/dasumin
I: 541

N: Mike Sarahan
W: https://github.com/msarahan
I: 688

N: Syohei YOSHIDA
W: https://github.com/syohex
I: 730

N: Visa Hankala
I: 741

N: Sebastian-Gabriel Brestin
C: Romania
I: 704

N: Timmy Konick
W: https://github.com/tijko
I: 751

N: mpderbec
W: https://github.com/mpderbec
I: 660

N: wxwright
W: https://github.com/wxwright
I: 776

N: Farhan Khan
I: 823

N: Jake Omann
W: https://github.com/jomann09
I: 816, 775, 1874

N: Jeremy Humble
W: https://github.com/jhumble
I: 863

N: Ilya Georgievsky
W: https://github.com/xBeAsTx
I: 870

N: Yago Jesus
W: https://github.com/YJesus
I: 798

N: Andre Caron
C: Montreal, QC, Canada
W: https://github.com/AndreLouisCaron
I: 880

N: ewedlund
W: https://github.com/ewedlund
I: 874

N: Arcadiy Ivanov
W: https://github.com/arcivanov
I: 919

N: Max Bélanger
W: https://github.com/maxbelanger
I: 936, 1133

N: Pierre Fersing
C: France
I: 950

N: Thiago Borges Abdnur
W: https://github.com/bolaum
I: 959

N: Nicolas Hennion
W: https://github.com/nicolargo
I: 974

N: Baruch Siach
W: https://github.com/baruchsiach
I: 872

N: Danek Duvall
W: https://github.com/dhduvall
I: 1002

N: Alexander Hasselhuhn
C: Germany
W: https://github.com/alexanha

N: Himanshu Shekhar
W: https://github.com/himanshub16
I: 1036

N: Yannick Gingras
W: https://github.com/ygingras
I: 1057

N: Gleb Smirnoff
W: https://github.com/glebius
D: good help with FreeBSD
I: 1042, 1079, 1070

N: Oleksii Shevchuk
W: https://github.com/alxchk
I: 1077, 1093, 1091, 1220, 1346

N: Prodesire
W: https://github.com/Prodesire
I: 1138

N: Sebastian Saip
W: https://github.com/ssaip
I: 1141

N: Jakub Bacic
W: https://github.com/jakub-bacic
I: 1127

N: Akos Kiss
W: https://github.com/akosthekiss
I: 1150

N: Adrian Page
W: https://github.com/adpag
I: 1159, 1160, 1161

N: Matthew Long
W: https://github.com/matray
I: 1167

N: janderbrain
W: https://github.com/janderbrain
I: 1169

N: Dan Vinakovsky
W: https://github.com/hexaclock
I: 1216

N: stswandering
W: https://github.com/stswandering
I: 1243

N: Georg Sauthoff
W: https://github.com/gsauthof
I: 1193, 1194

N: Maxime Mouial
W: https://github.com/hush-hush
I: 1239

N: Denis Krienbühl
W: https://github.com/href
I: 1260

N: Jean-Luc Migot
W: https://github.com/jmigot-tehtris
I: 1258, 1289

N: Nikhil Marathe
W: https://github.com/nikhilm
I: 1278

N: Sylvain Duchesne
W: https://github.com/sylvainduchesne
I: 1294

N: Lawrence Ye
W: https://github.com/LEAFERx
I: 1321

N: Ilya Yanok
W: https://github.com/yanok
I: 1332

N: Jaime Fullaondo
W: https://github.com/truthbk
D: AIX support
I: 1320

N: Koen Kooi
W: https://github.com/koenkooi
I: 1360

N: Ghislain Le Meur
W: https://github.com/gigi206
D: idea for Process.parents()
I: 1379

N: Benjamin Drung
D: make tests invariant to LANG setting
W: https://github.com/bdrung
I: 1462

N: Xiaoling Bao
I: 1223

N: Cedric Lamoriniere
W: https://github.com/clamoriniere
I: 1470

N: Daniel Beer
W: https://github.com/dbeer1
I: 1471

N: Samer Masterson
W: https://github.com/samertm
I: 1480

N: Ammar Askar
W: http://ammaraskar.com/
I: 604, 1484, 1781

N: agnewee
W: https://github.com/Agnewee
C: China
I: 1491

N: Kamil Rytarowski
W: https://github.com/krytarowski
C: Poland
I: 1526, 1530

N: Athos Ribeiro
W: https://github.com/athos-ribeiro
I: 1585

N: Erwan Le Pape
W: https://github.com/erwan-le-pape
I: 1570

N: Étienne Servais
W: https://github.com/vser1
I: 1607, 1637

N: Bernát Gábor
W: https://github.com/gaborbernat
I: 1565

N: Nathan Houghton
W: https://github.com/n1000
I: 1619

N: Riccardo Schirone
W: https://github.com/ret2libc
C: Milano, Italy
I: 1616

N: Po-Chuan Hsieh
W: https://github.com/sunpoet
C: Taiwan
I: 1646

N: Javad Karabi
W: https://github.com/karabijavad
I: 1648

N: Mike Hommey
W: https://github.com/glandium
I: 1665

N: Anselm Kruis
W: https://github.com/akruis
I: 1695

N: Michał Górny
W: https://github.com/mgorny
I: 1726

N: Julien Lebot
W: https://github.com/julien-lebot
I: 1768

N: Armin Gruner
W: https://github.com/ArminGruner
I: 1800

N: Chris Burger
W: https://github.com/phobozad
I: 1830

N: aristocratos
W: https://github.com/aristocratos
I: 1837, 1838

N: Vincent A. Arcila
W: https://github.com/jandrovins
I: 1620, 1727

N: Tim Schlueter
W: https://github.com/modelrockettier
I: 1822
PK�(�\��<

doc/alt-python37-psutil/LICENSEnu�[���BSD 3-Clause License

Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola'
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

 * Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.

 * Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.

 * Neither the name of the psutil authors nor the names of its contributors
   may be used to endorse or promote products derived from this software without
   specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK�(�\1�zi]�]�#doc/alt-python37-psutil/HISTORY.rstnu�[���*Bug tracker at https://github.com/giampaolo/psutil/issues*

5.8.0
=====

2020-12-19

**Enhancements**

- 1863_: `disk_partitions()` exposes 2 extra fields: `maxfile` and `maxpath`,
  which are the maximum file name and path name length.
- 1872_: [Windows] added support for PyPy 2.7.
- 1879_: provide pre-compiled wheels for Linux and macOS (yey!).
- 1880_: get rid of Travis and Cirrus CI services (they are no longer free).
  CI testing is now done by GitHub Actions on Linux, macOS and FreeBSD (yes).
  AppVeyor is still being used for Windows CI.

**Bug fixes**

- 1708_: [Linux] get rid of sensors_temperatures() duplicates.  (patch by Tim
  Schlueter).
- 1839_: [Windows] always raise AccessDenied when failing to query 64 processes
  from 32 bit ones (NtWoW64 APIs).
- 1866_: [Windows] process exe(), cmdline(), environ() may raise "invalid
  access to memory location" on Python 3.9.
- 1874_: [Solaris] wrong swap output given when encrypted column is present.
- 1875_: [Windows] process username() may raise ERROR_NONE_MAPPED if the SID
  has no corresponding account name. In this case AccessDenied is now raised.
- 1877_: [Windows] OpenProcess may fail with ERROR_SUCCESS. Turn it into
  AccessDenied or NoSuchProcess depending on whether the PID is alive.
- 1886_: [macOS] EIO error may be raised on cmdline() and environment(). Now
  it gets translated into AccessDenied.
- 1891_: [macOS] get rid of deprecated getpagesize().

5.7.3
=====

2020-10-23

**Enhancements**

- 809_: [FreeBSD] add support for `Process.rlimit()`.
- 893_: [BSD] add support for `Process.environ()` (patch by Armin Gruner)
- 1830_: [UNIX] `net_if_stats()`'s `isup` also checks whether the NIC is
  running (meaning Wi-Fi or ethernet cable is connected).  (patch by Chris Burger)
- 1837_: [Linux] improved battery detection and charge "secsleft" calculation
  (patch by aristocratos)

**Bug fixes**

- 1620_: [Linux] physical cpu_count() result is incorrect on systems with more
  than one CPU socket.  (patch by Vincent A. Arcila)
- 1738_: [macOS] Process.exe() may raise FileNotFoundError if process is still
  alive but the exe file which launched it got deleted.
- 1791_: [macOS] fix missing include for getpagesize().
- 1823_: [Windows] Process.open_files() may cause a segfault due to a NULL
  pointer.
- 1838_: [Linux] sensors_battery(): if `percent` can be determined but not
  the remaining values, still return a result instead of None.
  (patch by aristocratos)

5.7.2
=====

2020-07-15

**Bug fixes**

- wheels for 2.7 were inadvertently deleted.

5.7.1
=====

2020-07-15

**Enhancements**

- 1729_: parallel tests on UNIX (make test-parallel). They're twice as fast!
- 1741_: "make build/install" is now run in parallel and it's about 15% faster
  on UNIX.
- 1747_: `Process.wait()` on POSIX returns an enum, showing the negative signal
  which was used to terminate the process::
    >>> import psutil
    >>> p = psutil.Process(9891)
    >>> p.terminate()
    >>> p.wait()
    <Negsignal.SIGTERM: -15>
- 1747_: `Process.wait()` return value is cached so that the exit code can be
  retrieved on then next call.
- 1747_: Process provides more info about the process on str() and repr()
  (status and exit code)::
    >>> proc
    psutil.Process(pid=12739, name='python3', status='terminated',
                   exitcode=<Negsigs.SIGTERM: -15>, started='15:08:20')
- 1757_: memory leak tests are now stable.
- 1768_: [Windows] added support for Windows Nano Server. (contributed by
  Julien Lebot)

**Bug fixes**

- 1726_: [Linux] cpu_freq() parsing should use spaces instead of tabs on ia64.
  (patch by Michał Górny)
- 1760_: [Linux] Process.rlimit() does not handle long long type properly.
- 1766_: [macOS] NoSuchProcess may be raised instead of ZombieProcess.
- 1781_: fix signature of callback function for getloadavg().  (patch by
  Ammar Askar)

5.7.0
=====

2020-02-18

**Enhancements**

- 1637_: [SunOS] add partial support for old SunOS 5.10 Update 0 to 3.
- 1648_: [Linux] sensors_temperatures() looks into an additional /sys/device/
  directory for additional data.  (patch by Javad Karabi)
- 1652_: [Windows] dropped support for Windows XP and Windows Server 2003.
  Minimum supported Windows version now is Windows Vista.
- 1671_: [FreeBSD] add CI testing/service for FreeBSD (Cirrus CI).
- 1677_: [Windows] process exe() will succeed for all process PIDs (instead of
  raising AccessDenied).
- 1679_: [Windows] net_connections() and Process.connections() are 10% faster.
- 1682_: [PyPy] added CI / test integration for PyPy via Travis.
- 1686_: [Windows] added support for PyPy on Windows.
- 1693_: [Windows] boot_time(), Process.create_time() and users()'s login time
  now have 1 micro second precision (before the precision was of 1 second).

**Bug fixes**

- 1538_: [NetBSD] process cwd() may return ENOENT instead of NoSuchProcess.
- 1627_: [Linux] Process.memory_maps() can raise KeyError.
- 1642_: [SunOS] querying basic info for PID 0 results in FileNotFoundError.
- 1646_: [FreeBSD] many Process methods may cause a segfault on FreeBSD 12.0
  due to a backward incompatible change in a C type introduced in 12.0.
- 1656_: [Windows] Process.memory_full_info() raises AccessDenied even for the
  current user and os.getpid().
- 1660_: [Windows] Process.open_files() complete rewrite + check of errors.
- 1662_: [Windows] process exe() may raise WinError 0.
- 1665_: [Linux] disk_io_counters() does not take into account extra fields
  added to recent kernels.  (patch by Mike Hommey)
- 1672_: use the right C type when dealing with PIDs (int or long). Thus far
  (long) was almost always assumed, which is wrong on most platforms.
- 1673_: [OpenBSD] Process connections(), num_fds() and threads() returned
  improper exception if process is gone.
- 1674_: [SunOS] disk_partitions() may raise OSError.
- 1684_: [Linux] disk_io_counters() may raise ValueError on systems not
  having /proc/diskstats.
- 1695_: [Linux] could not compile on kernels <= 2.6.13 due to
  PSUTIL_HAVE_IOPRIO not being defined.  (patch by Anselm Kruis)

5.6.7
=====

2019-11-26

**Bug fixes**

- 1630_: [Windows] can't compile source distribution due to C syntax error.

5.6.6
=====

2019-11-25

**Bug fixes**

- 1179_: [Linux] Process cmdline() now takes into account misbehaving processes
  renaming the command line and using inappropriate chars to separate args.
- 1616_: use of Py_DECREF instead of Py_CLEAR will result in double free and
  segfault
  (`CVE-2019-18874 <https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18874>`__).
  (patch by Riccardo Schirone)
- 1619_: [OpenBSD] compilation fails due to C syntax error.  (patch by Nathan
  Houghton)

5.6.5
=====

2019-11-06

**Bug fixes**

- 1615_: remove pyproject.toml as it was causing installation issues.

5.6.4
=====

2019-11-04

**Enhancements**

- 1527_: [Linux] added Process.cpu_times().iowait counter, which is the time
  spent waiting for blocking I/O to complete.
- 1565_: add PEP 517/8 build backend and requirements specification for better
  pip integration.  (patch by Bernát Gábor)

**Bug fixes**

- 875_: [Windows] Process' cmdline(), environ() or cwd() may occasionally fail
  with ERROR_PARTIAL_COPY which now gets translated to AccessDenied.
- 1126_: [Linux] cpu_affinity() segfaults on CentOS 5 / manylinux.
  cpu_affinity() support for CentOS 5 was removed.
- 1528_: [AIX] compilation error on AIX 7.2 due to 32 vs 64 bit differences.
  (patch by Arnon Yaari)
- 1535_: 'type' and 'family' fields returned by net_connections() are not
  always turned into enums.
- 1536_: [NetBSD] process cmdline() erroneously raise ZombieProcess error if
  cmdline has non encodable chars.
- 1546_: usage percent may be rounded to 0 on Python 2.
- 1552_: [Windows] getloadavg() math for calculating 5 and 15 mins values is
  incorrect.
- 1568_: [Linux] use CC compiler env var if defined.
- 1570_: [Windows] `NtWow64*` syscalls fail to raise the proper error code
- 1585_: [OSX] calling close() (in C) on possible negative integers.  (patch
  by Athos Ribeiro)
- 1606_: [SunOS] compilation fails on SunOS 5.10.  (patch by vser1)

5.6.3
=====

2019-06-11

**Enhancements**

- 1494_: [AIX] added support for Process.environ().  (patch by Arnon Yaari)

**Bug fixes**

- 1276_: [AIX] can't get whole cmdline().  (patch by Arnon Yaari)
- 1501_: [Windows] Process cmdline() and exe() raise unhandled "WinError 1168
  element not found" exceptions for "Registry" and "Memory Compression" psuedo
  processes on Windows 10.
- 1526_: [NetBSD] process cmdline() could raise MemoryError.  (patch by
  Kamil Rytarowski)

5.6.2
=====

2019-04-26

**Enhancements**

- 604_: [Windows, Windows] add new psutil.getloadavg(), returning system load
  average calculation, including on Windows (emulated).  (patch by Ammar Askar)
- 1404_: [Linux] cpu_count(logical=False) uses a second method (read from
  `/sys/devices/system/cpu/cpu[0-9]/topology/core_id`) in order to determine
  the number of physical CPUs in case /proc/cpuinfo does not provide this info.
- 1458_: provide coloured test output. Also show failures on KeyboardInterrupt.
- 1464_: various docfixes (always point to python3 doc, fix links, etc.).
- 1476_: [Windows] it is now possible to set process high I/O priority
  (ionice()).Also, I/O priority values are now exposed as 4 new constants:
  IOPRIO_VERYLOW, IOPRIO_LOW, IOPRIO_NORMAL, IOPRIO_HIGH.
- 1478_: add make command to re-run tests failed on last run.

**Bug fixes**

- 1223_: [Windows] boot_time() may return value on Windows XP.
- 1456_: [Linux] cpu_freq() returns None instead of 0.0 when min/max not
  available (patch by Alex Manuskin)
- 1462_: [Linux] (tests) make tests invariant to LANG setting (patch by
  Benjamin Drung)
- 1463_: cpu_distribution.py script was broken.
- 1470_: [Linux] disk_partitions(): fix corner case when /etc/mtab doesn't
  exist.  (patch by Cedric Lamoriniere)
- 1471_: [SunOS] Process name() and cmdline() can return SystemError.  (patch
  by Daniel Beer)
- 1472_: [Linux] cpu_freq() does not return all CPUs on Rasbperry-pi 3.
- 1474_: fix formatting of psutil.tests() which mimicks 'ps aux' output.
- 1475_: [Windows] OSError.winerror attribute wasn't properly checked resuling
  in WindowsError being raised instead of AccessDenied.
- 1477_: [Windows] wrong or absent error handling for private NTSTATUS Windows
  APIs. Different process methods were affected by this.
- 1480_: [Windows] psutil.cpu_count(logical=False) could cause a crash due to
  fixed read violation.  (patch by Samer Masterson)
- 1486_: [AIX, SunOS] AttributeError when interacting with Process methods
  involved into oneshot() context.
- 1491_: [SunOS] net_if_addrs(): free() ifap struct on error.  (patch by
  Agnewee)
- 1493_: [Linux] cpu_freq(): handle the case where
  /sys/devices/system/cpu/cpufreq/ exists but is empty.

5.6.1
=====

2019-03-11

**Bug fixes**

- 1329_: [AIX] psutil doesn't compile on AIX 6.1.  (patch by Arnon Yaari)
- 1448_: [Windows] crash on import due to rtlIpv6AddressToStringA not available
  on Wine.
- 1451_: [Windows] Process.memory_full_info() segfaults. NtQueryVirtualMemory
  is now used instead of QueryWorkingSet to calculate USS memory.

5.6.0
=====

2019-03-05

**Enhancements**

- 1379_: [Windows] Process suspend() and resume() now use NtSuspendProcess
  and NtResumeProcess instead of stopping/resuming all threads of a process.
  This is faster and more reliable (aka this is what ProcessHacker does).
- 1420_: [Windows] in case of exception disk_usage() now also shows the path
  name.
- 1422_: [Windows] Windows APIs requiring to be dynamically loaded from DLL
  libraries are now loaded only once on startup (instead of on per function
  call) significantly speeding up different functions and methods.
- 1426_: [Windows] PAGESIZE and number of processors is now calculated on
  startup.
- 1428_: in case of error, the traceback message now shows the underlying C
  function called which failed.
- 1433_: new Process.parents() method.  (idea by Ghislain Le Meur)
- 1437_: pids() are returned in sorted order.
- 1442_: python3 is now the default interpreter used by Makefile.

**Bug fixes**

- 1353_: process_iter() is now thread safe (it rarely raised TypeError).
- 1394_: [Windows] Process name() and exe() may erroneously return "Registry".
  QueryFullProcessImageNameW is now used instead of GetProcessImageFileNameW
  in order to prevent that.
- 1411_: [BSD] lack of Py_DECREF could cause segmentation fault on process
  instantiation.
- 1419_: [Windows] Process.environ() raises NotImplementedError when querying
  a 64-bit process in 32-bit-WoW mode. Now it raises AccessDenied.
- 1427_: [OSX] Process cmdline() and environ() may erroneously raise OSError
  on failed malloc().
- 1429_: [Windows] SE DEBUG was not properly set for current process. It is
  now, and it should result in less AccessDenied exceptions for low-pid
  processes.
- 1432_: [Windows] Process.memory_info_ex()'s USS memory is miscalculated
  because we're not using the actual system PAGESIZE.
- 1439_: [NetBSD] Process.connections() may return incomplete results if using
  oneshot().
- 1447_: original exception wasn't turned into NSP/AD exceptions when using
  Process.oneshot() ctx manager.

**Incompatible API changes**

- 1291_: [OSX] Process.memory_maps() was removed because inherently broken
  (segfault) for years.

5.5.1
=====

2019-02-15

**Enhancements**

- 1348_: [Windows] on Windows >= 8.1 if Process.cmdline() fails due to
  ERROR_ACCESS_DENIED attempt using NtQueryInformationProcess +
  ProcessCommandLineInformation. (patch by EccoTheFlintstone)

**Bug fixes**

- 1394_: [Windows] Process.exe() returns "[Error 0] The operation completed
  successfully" when Python process runs in "Virtual Secure Mode".
- 1402_: psutil exceptions' repr() show the internal private module path.
- 1408_: [AIX] psutil won't compile on AIX 7.1 due to missing header.  (patch
  by Arnon Yaari)

5.5.0
=====

2019-01-23

**Enhancements**

- 1350_: [FreeBSD] added support for sensors_temperatures().  (patch by Alex
  Manuskin)
- 1352_: [FreeBSD] added support for CPU frequency.  (patch by Alex Manuskin)

**Bug fixes**

- 1111_: Process.oneshot() is now thread safe.
- 1354_: [Linux] disk_io_counters() fails on Linux kernel 4.18+.
- 1357_: [Linux] Process' memory_maps() and io_counters() method are no longer
  exposed if not supported by the kernel.
- 1368_: [Windows] fix psutil.Process().ionice(...) mismatch.  (patch by
  EccoTheFlintstone)
- 1370_: [Windows] improper usage of CloseHandle() may lead to override the
  original error code when raising an exception.
- 1373_: incorrect handling of cache in Process.oneshot() context causes
  Process instances to return incorrect results.
- 1376_: [Windows] OpenProcess() now uses PROCESS_QUERY_LIMITED_INFORMATION
  access rights wherever possible, resulting in less AccessDenied exceptions
  being thrown for system processes.
- 1376_: [Windows] check if variable is NULL before free()ing it.  (patch by
  EccoTheFlintstone)

5.4.8
=====

2018-10-30

**Enhancements**

- 1197_: [Linux] cpu_freq() is now implemented by parsing /proc/cpuinfo in case
  /sys/devices/system/cpu/* filesystem is not available.
- 1310_: [Linux] psutil.sensors_temperatures() now parses /sys/class/thermal
  in case /sys/class/hwmon fs is not available (e.g. Raspberry Pi).  (patch
  by Alex Manuskin)
- 1320_: [Posix] better compilation support when using g++ instead of gcc.
  (patch by Jaime Fullaondo)

**Bug fixes**

- 715_: do not print exception on import time in case cpu_times() fails.
- 1004_: [Linux] Process.io_counters() may raise ValueError.
- 1277_: [OSX] available and used memory (psutil.virtual_memory()) metrics are
  not accurate.
- 1294_: [Windows] psutil.Process().connections() may sometimes fail with
  intermittent 0xC0000001.  (patch by Sylvain Duchesne)
- 1307_: [Linux] disk_partitions() does not honour PROCFS_PATH.
- 1320_: [AIX] system CPU times (psutil.cpu_times()) were being reported with
  ticks unit as opposed to seconds.  (patch by Jaime Fullaondo)
- 1332_: [OSX] psutil debug messages are erroneously printed all the time.
  (patch by Ilya Yanok)
- 1346_: [SunOS] net_connections() returns an empty list.  (patch by Oleksii
  Shevchuk)

5.4.7
=====

2018-08-14

**Enhancements**

- 1286_: [macOS] psutil.OSX constant is now deprecated in favor of new
  psutil.MACOS.
- 1309_: [Linux] added psutil.STATUS_PARKED constant for Process.status().
- 1321_: [Linux] add disk_io_counters() dual implementation relying on
  /sys/block filesystem in case /proc/diskstats is not available. (patch by
  Lawrence Ye)

**Bug fixes**

- 1209_: [macOS] Process.memory_maps() may fail with EINVAL due to poor
  task_for_pid() syscall. AccessDenied is now raised instead.
- 1278_: [macOS] Process.threads() incorrectly return microseconds instead of
  seconds. (patch by Nikhil Marathe)
- 1279_: [Linux, macOS, BSD] net_if_stats() may return ENODEV.
- 1294_: [Windows] psutil.Process().connections() may sometime fail with
  MemoryError.  (patch by sylvainduchesne)
- 1305_: [Linux] disk_io_stats() may report inflated r/w bytes values.
- 1309_: [Linux] Process.status() is unable to recognize "idle" and "parked"
  statuses (returns '?').
- 1313_: [Linux] disk_io_counters() can report inflated IO counters due to
  erroneously counting base disk device and its partition(s) twice.
- 1323_: [Linux] sensors_temperatures() may fail with ValueError.

5.4.6
=====

2018-06-07

**Bug fixes**

- 1258_: [Windows] Process.username() may cause a segfault (Python interpreter
  crash).  (patch by Jean-Luc Migot)
- 1273_: net_if_addr() namedtuple's name has been renamed from "snic" to
  "snicaddr".
- 1274_: [Linux] there was a small chance Process.children() may swallow
  AccessDenied exceptions.

5.4.5
=====

2018-04-14

**Bug fixes**

- 1268_: setup.py's extra_require parameter requires latest setuptools version,
  breaking quite a lot of installations.

5.4.4
=====

2018-04-13

**Enhancements**

- 1239_: [Linux] expose kernel "slab" memory for psutil.virtual_memory().
  (patch by Maxime Mouial)

**Bug fixes**

- 694_: [SunOS] cmdline() could be truncated at the 15th character when
  reading it from /proc. An extra effort is made by reading it from process
  address space first.  (patch by Georg Sauthoff)
- 771_: [Windows] cpu_count() (both logical and physical) return a wrong
  (smaller) number on systems using process groups (> 64 cores).
- 771_: [Windows] cpu_times(percpu=True) return fewer CPUs on systems using
  process groups (> 64 cores).
- 771_: [Windows] cpu_stats() and cpu_freq() may return incorrect results on
  systems using process groups (> 64 cores).
- 1193_: [SunOS] Return uid/gid from /proc/pid/psinfo if there aren't
  enough permissions for /proc/pid/cred.  (patch by Georg Sauthoff)
- 1194_: [SunOS] Return nice value from psinfo as getpriority() doesn't
  support real-time processes.  (patch by Georg Sauthoff)
- 1194_: [SunOS] Fix double free in psutil_proc_cpu_num().  (patch by Georg
  Sauthoff)
- 1194_: [SunOS] Fix undefined behavior related to strict-aliasing rules
  and warnings.  (patch by Georg Sauthoff)
- 1210_: [Linux] cpu_percent() steal time may remain stuck at 100% due to Linux
  erroneously reporting a decreased steal time between calls. (patch by Arnon
  Yaari)
- 1216_: fix compatibility with python 2.6 on Windows (patch by Dan Vinakovsky)
- 1222_: [Linux] Process.memory_full_info() was erroneously summing "Swap:" and
  "SwapPss:". Same for "Pss:" and "SwapPss". Not anymore.
- 1224_: [Windows] Process.wait() may erroneously raise TimeoutExpired.
- 1238_: [Linux] sensors_battery() may return None in case battery is not
  listed as "BAT0" under /sys/class/power_supply.
- 1240_: [Windows] cpu_times() float loses accuracy in a long running system.
  (patch by stswandering)
- 1245_: [Linux] sensors_temperatures() may fail with IOError "no such file".
- 1255_: [FreeBSD] swap_memory() stats were erroneously represented in KB.
  (patch by Denis Krienbühl)

**Backward compatibility**

- 771_: [Windows] cpu_count(logical=False) on Windows XP and Vista is no
  longer supported and returns None.

5.4.3
=====

*2018-01-01*

**Enhancements**

- 775_: disk_partitions() on Windows return mount points.

**Bug fixes**

- 1193_: pids() may return False on macOS.

5.4.2
=====

*2017-12-07*

**Enhancements**

- 1173_: introduced PSUTIL_DEBUG environment variable which can be set in order
  to print useful debug messages on stderr (useful in case of nasty errors).
- 1177_: added support for sensors_battery() on macOS.  (patch by Arnon Yaari)
- 1183_: Process.children() is 2x faster on UNIX and 2.4x faster on Linux.
- 1188_: deprecated method Process.memory_info_ex() now warns by using
  FutureWarning instead of DeprecationWarning.

**Bug fixes**

- 1152_: [Windows] disk_io_counters() may return an empty dict.
- 1169_: [Linux] users() "hostname" returns username instead.  (patch by
  janderbrain)
- 1172_: [Windows] `make test` does not work.
- 1179_: [Linux] Process.cmdline() is now able to splits cmdline args for
  misbehaving processes which overwrite /proc/pid/cmdline and use spaces
  instead of null bytes as args separator.
- 1181_: [macOS] Process.memory_maps() may raise ENOENT.
- 1187_: [macOS] pids() does not return PID 0 on recent macOS versions.

5.4.1
=====

*2017-11-08*

**Enhancements**

- 1164_: [AIX] add support for Process.num_ctx_switches().  (patch by Arnon
  Yaari)
- 1053_: abandon Python 3.3 support (psutil still works but it's no longer
  tested).

**Bug fixes**

- 1150_: [Windows] when a process is terminate()d now the exit code is set to
  SIGTERM instead of 0.  (patch by Akos Kiss)
- 1151_: python -m psutil.tests fail
- 1154_: [AIX] psutil won't compile on AIX 6.1.0.  (patch by Arnon Yaari)
- 1167_: [Windows] net_io_counter() packets count now include also non-unicast
  packets.  (patch by Matthew Long)

5.4.0
=====

*2017-10-12*

**Enhancements**

- 1123_: [AIX] added support for AIX platform.  (patch by Arnon Yaari)

**Bug fixes**

- 1009_: [Linux] sensors_temperatures() may crash with IOError.
- 1012_: [Windows] disk_io_counters()'s read_time and write_time were expressed
  in tens of micro seconds instead of milliseconds.
- 1127_: [macOS] invalid reference counting in Process.open_files() may lead to
  segfault.  (patch by Jakub Bacic)
- 1129_: [Linux] sensors_fans() may crash with IOError.  (patch by Sebastian
  Saip)
- 1131_: [SunOS] fix compilation warnings.  (patch by Arnon Yaari)
- 1133_: [Windows] can't compile on newer versions of Visual Studio 2017 15.4.
  (patch by Max Bélanger)
- 1138_: [Linux] can't compile on CentOS 5.0 and RedHat 5.0.
  (patch by Prodesire)

5.3.1
=====

*2017-09-10*

**Enhancements**

- 1124_: documentation moved to http://psutil.readthedocs.io

**Bug fixes**

- 1105_: [FreeBSD] psutil does not compile on FreeBSD 12.
- 1125_: [BSD] net_connections() raises TypeError.

**Compatibility notes**

- 1120_: .exe files for Windows are no longer uploaded on PyPI as per PEP-527;
  only wheels are provided.

5.3.0
=====

*2017-09-01*

**Enhancements**

- 802_: disk_io_counters() and net_io_counters() numbers no longer wrap
  (restart from 0). Introduced a new "nowrap" argument.
- 928_: psutil.net_connections() and psutil.Process.connections() "laddr" and
  "raddr" are now named tuples.
- 1015_: swap_memory() now relies on /proc/meminfo instead of sysinfo() syscall
  so that it can be used in conjunction with PROCFS_PATH in order to retrieve
  memory info about Linux containers such as Docker and Heroku.
- 1022_: psutil.users() provides a new "pid" field.
- 1025_: process_iter() accepts two new parameters in order to invoke
  Process.as_dict(): "attrs" and "ad_value". With this you can iterate over all
  processes in one shot without needing to catch NoSuchProcess and do list/dict
  comprehensions.
- 1040_: implemented full unicode support.
- 1051_: disk_usage() on Python 3 is now able to accept bytes.
- 1058_: test suite now enables all warnings by default.
- 1060_: source distribution is dynamically generated so that it only includes
  relevant files.
- 1079_: [FreeBSD] net_connections()'s fd number is now being set for real
  (instead of -1).  (patch by Gleb Smirnoff)
- 1091_: [SunOS] implemented Process.environ().  (patch by Oleksii Shevchuk)

**Bug fixes**

- 989_: [Windows] boot_time() may return a negative value.
- 1007_: [Windows] boot_time() can have a 1 sec fluctuation between calls; the
  value of the first call is now cached so that boot_time() always returns the
  same value if fluctuation is <= 1 second.
- 1013_: [FreeBSD] psutil.net_connections() may return incorrect PID.  (patch
  by Gleb Smirnoff)
- 1014_: [Linux] Process class can mask legitimate ENOENT exceptions as
  NoSuchProcess.
- 1016_: disk_io_counters() raises RuntimeError on a system with no disks.
- 1017_: net_io_counters() raises RuntimeError on a system with no network
  cards installed.
- 1021_: [Linux] open_files() may erroneously raise NoSuchProcess instead of
  skipping a file which gets deleted while open files are retrieved.
- 1029_: [macOS, FreeBSD] Process.connections('unix') on Python 3 doesn't
  properly handle unicode paths and may raise UnicodeDecodeError.
- 1033_: [macOS, FreeBSD] memory leak for net_connections() and
  Process.connections() when retrieving UNIX sockets (kind='unix').
- 1040_: fixed many unicode related issues such as UnicodeDecodeError on
  Python 3 + UNIX and invalid encoded data on Windows.
- 1042_: [FreeBSD] psutil won't compile on FreeBSD 12.
- 1044_: [macOS] different Process methods incorrectly raise AccessDenied for
  zombie processes.
- 1046_: [Windows] disk_partitions() on Windows overrides user's SetErrorMode.
- 1047_: [Windows] Process username(): memory leak in case exception is thrown.
- 1048_: [Windows] users()'s host field report an invalid IP address.
- 1050_: [Windows] Process.memory_maps memory() leaks memory.
- 1055_: cpu_count() is no longer cached; this is useful on systems such as
  Linux where CPUs can be disabled at runtime. This also reflects on
  Process.cpu_percent() which no longer uses the cache.
- 1058_: fixed Python warnings.
- 1062_: disk_io_counters() and net_io_counters() raise TypeError if no disks
  or NICs are installed on the system.
- 1063_: [NetBSD] net_connections() may list incorrect sockets.
- 1064_: [NetBSD] swap_memory() may segfault in case of error.
- 1065_: [OpenBSD] Process.cmdline() may raise SystemError.
- 1067_: [NetBSD] Process.cmdline() leaks memory if process has terminated.
- 1069_: [FreeBSD] Process.cpu_num() may return 255 for certain kernel
  processes.
- 1071_: [Linux] cpu_freq() may raise IOError on old RedHat distros.
- 1074_: [FreeBSD] sensors_battery() raises OSError in case of no battery.
- 1075_: [Windows] net_if_addrs(): inet_ntop() return value is not checked.
- 1077_: [SunOS] net_if_addrs() shows garbage addresses on SunOS 5.10.
  (patch by Oleksii Shevchuk)
- 1077_: [SunOS] net_connections() does not work on SunOS 5.10. (patch by
  Oleksii Shevchuk)
- 1079_: [FreeBSD] net_connections() didn't list locally connected sockets.
  (patch by Gleb Smirnoff)
- 1085_: cpu_count() return value is now checked and forced to None if <= 1.
- 1087_: Process.cpu_percent() guard against cpu_count() returning None and
  assumes 1 instead.
- 1093_: [SunOS] memory_maps() shows wrong 64 bit addresses.
- 1094_: [Windows] psutil.pid_exists() may lie. Also, all process APIs relying
  on OpenProcess Windows API now check whether the PID is actually running.
- 1098_: [Windows] Process.wait() may erroneously return sooner, when the PID
  is still alive.
- 1099_: [Windows] Process.terminate() may raise AccessDenied even if the
  process already died.
- 1101_: [Linux] sensors_temperatures() may raise ENODEV.

**Porting notes**

- 1039_: returned types consolidation:
  - Windows / Process.cpu_times(): fields #3 and #4 were int instead of float
  - Linux / FreeBSD: connections('unix'): raddr is now set to "" instead of
    None
  - OpenBSD: connections('unix'): laddr and raddr are now set to "" instead of
    None
- 1040_: all strings are encoded by using OS fs encoding.
- 1040_: the following Windows APIs on Python 2 now return a string instead of
  unicode:
  - Process.memory_maps().path
  - WindowsService.bin_path()
  - WindowsService.description()
  - WindowsService.display_name()
  - WindowsService.username()

5.2.2
=====

*2017-04-10*

**Bug fixes**

- 1000_: fixed some setup.py warnings.
- 1002_: [SunOS] remove C macro which will not be available on new Solaris
  versions. (patch by Danek Duvall)
- 1004_: [Linux] Process.io_counters() may raise ValueError.
- 1006_: [Linux] cpu_freq() may return None on some Linux versions does not
  support the function; now the function is not declared instead.
- 1009_: [Linux] sensors_temperatures() may raise OSError.
- 1010_: [Linux] virtual_memory() may raise ValueError on Ubuntu 14.04.

5.2.1
=====

*2017-03-24*

**Bug fixes**

- 981_: [Linux] cpu_freq() may return an empty list.
- 993_: [Windows] Process.memory_maps() on Python 3 may raise
  UnicodeDecodeError.
- 996_: [Linux] sensors_temperatures() may not show all temperatures.
- 997_: [FreeBSD] virtual_memory() may fail due to missing sysctl parameter on
  FreeBSD 12.

5.2.0
=====

*2017-03-05*

**Enhancements**

- 971_: [Linux] Add psutil.sensors_fans() function.  (patch by Nicolas Hennion)
- 976_: [Windows] Process.io_counters() has 2 new fields: *other_count* and
  *other_bytes*.
- 976_: [Linux] Process.io_counters() has 2 new fields: *read_chars* and
  *write_chars*.

**Bug fixes**

- 872_: [Linux] can now compile on Linux by using MUSL C library.
- 985_: [Windows] Fix a crash in `Process.open_files` when the worker thread
  for `NtQueryObject` times out.
- 986_: [Linux] Process.cwd() may raise NoSuchProcess instead of ZombieProcess.

5.1.3
=====

**Bug fixes**

- 971_: [Linux] sensors_temperatures() didn't work on CentOS 7.
- 973_: cpu_percent() may raise ZeroDivisionError.

5.1.2
=====

*2017-02-03*

**Bug fixes**

- 966_: [Linux] sensors_battery().power_plugged may erroneously return None on
  Python 3.
- 968_: [Linux] disk_io_counters() raises TypeError on python 3.
- 970_: [Linux] sensors_battery()'s name and label fields on Python 3 are bytes
  instead of str.

5.1.1
=====

*2017-02-03*

**Enhancements**

- 966_: [Linux] sensors_battery().percent is a float and is more precise.

**Bug fixes**

- 964_: [Windows] Process.username() and psutil.users() may return badly
  decoding character on Python 3.
- 965_: [Linux] disk_io_counters() may miscalculate sector size and report the
  wrong number of bytes read and written.
- 966_: [Linux] sensors_battery() may fail with "no such file error".
- 966_: [Linux] sensors_battery().power_plugged may lie.

5.1.0
=====

*2017-02-01*

**Enhancements**

- 357_: added psutil.Process.cpu_num() (what CPU a process is on).
- 371_: added psutil.sensors_temperatures() (Linux only).
- 941_: added psutil.cpu_freq() (CPU frequency).
- 955_: added psutil.sensors_battery() (Linux, Windows, only).
- 956_: cpu_affinity([]) can now be used as an alias to set affinity against
  all eligible CPUs.

**Bug fixes**

- 687_: [Linux] pid_exists() no longer returns True if passed a process thread
  ID.
- 948_: cannot install psutil with PYTHONOPTIMIZE=2.
- 950_: [Windows] Process.cpu_percent() was calculated incorrectly and showed
  higher number than real usage.
- 951_: [Windows] the uploaded wheels for Python 3.6 64 bit didn't work.
- 959_: psutil exception objects could not be pickled.
- 960_: Popen.wait() did not return the correct negative exit status if process
  is ``kill()``ed by a signal.
- 961_: [Windows] WindowsService.description() may fail with
  ERROR_MUI_FILE_NOT_FOUND.

5.0.1
=====

*2016-12-21*

**Enhancements**

- 939_: tar.gz distribution went from 1.8M to 258K.
- 811_: [Windows] provide a more meaningful error message if trying to use
  psutil on unsupported Windows XP.

**Bug fixes**

- 609_: [SunOS] psutil does not compile on Solaris 10.
- 936_: [Windows] fix compilation error on VS 2013 (patch by Max Bélanger).
- 940_: [Linux] cpu_percent() and cpu_times_percent() was calculated
  incorrectly as "iowait", "guest" and "guest_nice" times were not properly
  taken into account.
- 944_: [OpenBSD] psutil.pids() was omitting PID 0.

5.0.0
=====

*2016-11-06*

**Enhncements**

- 799_: new Process.oneshot() context manager making Process methods around
  +2x faster in general and from +2x to +6x faster on Windows.
- 943_: better error message in case of version conflict on import.

**Bug fixes**

- 932_: [NetBSD] net_connections() and Process.connections() may fail without
  raising an exception.
- 933_: [Windows] memory leak in cpu_stats() and WindowsService.description().

4.4.2
=====

*2016-10-26*

**Bug fixes**

- 931_: psutil no longer compiles on Solaris.

4.4.1
=====

*2016-10-25*

**Bug fixes**

- 927_: ``Popen.__del__`` may cause maximum recursion depth error.

4.4.0
=====

*2016-10-23*

**Enhancements**

- 874_: [Windows] net_if_addrs() returns also the netmask.
- 887_: [Linux] virtual_memory()'s 'available' and 'used' values are more
  precise and match "free" cmdline utility.  "available" also takes into
  account LCX containers preventing "available" to overflow "total".
- 891_: procinfo.py script has been updated and provides a lot more info.

**Bug fixes**

- 514_: [macOS] possibly fix Process.memory_maps() segfault (critical!).
- 783_: [macOS] Process.status() may erroneously return "running" for zombie
  processes.
- 798_: [Windows] Process.open_files() returns and empty list on Windows 10.
- 825_: [Linux] cpu_affinity; fix possible double close and use of unopened
  socket.
- 880_: [Windows] Handle race condition inside psutil_net_connections.
- 885_: ValueError is raised if a negative integer is passed to cpu_percent()
  functions.
- 892_: [Linux] Process.cpu_affinity([-1]) raise SystemError with no error
  set; now ValueError is raised.
- 906_: [BSD] disk_partitions(all=False) returned an empty list. Now the
  argument is ignored and all partitions are always returned.
- 907_: [FreeBSD] Process.exe() may fail with OSError(ENOENT).
- 908_: [macOS, BSD] different process methods could errounesuly mask the real
  error for high-privileged PIDs and raise NoSuchProcess and AccessDenied
  instead of OSError and RuntimeError.
- 909_: [macOS] Process open_files() and connections() methods may raise
  OSError with no exception set if process is gone.
- 916_: [macOS] fix many compilation warnings.

4.3.1
=====

*2016-09-01*

**Enhancements**

- 881_: "make install" now works also when using a virtual env.

**Bug fixes**

- 854_: Process.as_dict() raises ValueError if passed an erroneous attrs name.
- 857_: [SunOS] Process cpu_times(), cpu_percent(), threads() amd memory_maps()
  may raise RuntimeError if attempting to query a 64bit process with a 32bit
  python. "Null" values are returned as a fallback.
- 858_: Process.as_dict() should not return memory_info_ex() because it's
  deprecated.
- 863_: [Windows] memory_map truncates addresses above 32 bits
- 866_: [Windows] win_service_iter() and services in general are not able to
  handle unicode service names / descriptions.
- 869_: [Windows] Process.wait() may raise TimeoutExpired with wrong timeout
  unit (ms instead of sec).
- 870_: [Windows] Handle leak inside psutil_get_process_data.

4.3.0
=====

*2016-06-18*

**Enhancements**

- 819_: [Linux] different speedup improvements:
  Process.ppid() is 20% faster
  Process.status() is 28% faster
  Process.name() is 25% faster
  Process.num_threads is 20% faster on Python 3

**Bug fixes**

- 810_: [Windows] Windows wheels are incompatible with pip 7.1.2.
- 812_: [NetBSD] fix compilation on NetBSD-5.x.
- 823_: [NetBSD] virtual_memory() raises TypeError on Python 3.
- 829_: [UNIX] psutil.disk_usage() percent field takes root reserved space
  into account.
- 816_: [Windows] fixed net_io_counter() values wrapping after 4.3GB in
  Windows Vista (NT 6.0) and above using 64bit values from newer win APIs.

4.2.0
=====

*2016-05-14*

**Enhancements**

- 795_: [Windows] new APIs to deal with Windows services: win_service_iter()
  and win_service_get().
- 800_: [Linux] psutil.virtual_memory() returns a new "shared" memory field.
- 819_: [Linux] speedup /proc parsing:
  - Process.ppid() is 20% faster
  - Process.status() is 28% faster
  - Process.name() is 25% faster
  - Process.num_threads is 20% faster on Python 3

**Bug fixes**

- 797_: [Linux] net_if_stats() may raise OSError for certain NIC cards.
- 813_: Process.as_dict() should ignore extraneous attribute names which gets
  attached to the Process instance.

4.1.0
=====

*2016-03-12*

**Enhancements**

- 777_: [Linux] Process.open_files() on Linux return 3 new fields: position,
  mode and flags.
- 779_: Process.cpu_times() returns two new fields, 'children_user' and
  'children_system' (always set to 0 on macOS and Windows).
- 789_: [Windows] psutil.cpu_times() return two new fields: "interrupt" and
  "dpc". Same for psutil.cpu_times_percent().
- 792_: new psutil.cpu_stats() function returning number of CPU ctx switches
  interrupts, soft interrupts and syscalls.

**Bug fixes**

- 774_: [FreeBSD] net_io_counters() dropout is no longer set to 0 if the kernel
  provides it.
- 776_: [Linux] Process.cpu_affinity() may erroneously raise NoSuchProcess.
  (patch by wxwright)
- 780_: [macOS] psutil does not compile with some gcc versions.
- 786_: net_if_addrs() may report incomplete MAC addresses.
- 788_: [NetBSD] virtual_memory()'s buffers and shared values were set to 0.
- 790_: [macOS] psutil won't compile on macOS 10.4.

4.0.0
=====

*2016-02-17*

**Enhancements**

- 523_: [Linux, FreeBSD] disk_io_counters() return a new "busy_time" field.
- 660_: [Windows] make.bat is smarter in finding alternative VS install
  locations.  (patch by mpderbec)
- 732_: Process.environ().  (patch by Frank Benkstein)
- 753_: [Linux, macOS, Windows] Process USS and PSS (Linux) "real" memory stats.
  (patch by Eric Rahm)
- 755_: Process.memory_percent() "memtype" parameter.
- 758_: tests now live in psutil namespace.
- 760_: expose OS constants (psutil.LINUX, psutil.macOS, etc.)
- 756_: [Linux] disk_io_counters() return 2 new fields: read_merged_count and
  write_merged_count.
- 762_: new scripts/procsmem.py script.

**Bug fixes**

- 685_: [Linux] virtual_memory() provides wrong results on systems with a lot
  of physical memory.
- 704_: [Solaris] psutil does not compile on Solaris sparc.
- 734_: on Python 3 invalid UTF-8 data is not correctly handled for process
  name(), cwd(), exe(), cmdline() and open_files() methods resulting in
  UnicodeDecodeError exceptions. 'surrogateescape' error handler is now
  used as a workaround for replacing the corrupted data.
- 737_: [Windows] when the bitness of psutil and the target process was
  different cmdline() and cwd() could return a wrong result or incorrectly
  report an AccessDenied error.
- 741_: [OpenBSD] psutil does not compile on mips64.
- 751_: [Linux] fixed call to Py_DECREF on possible Null object.
- 754_: [Linux] cmdline() can be wrong in case of zombie process.
- 759_: [Linux] Process.memory_maps() may return paths ending with " (deleted)"
- 761_: [Windows] psutil.boot_time() wraps to 0 after 49 days.
- 764_: [NetBSD] fix compilation on NetBSD-6.x.
- 766_: [Linux] net_connections() can't handle malformed /proc/net/unix file.
- 767_: [Linux] disk_io_counters() may raise ValueError on 2.6 kernels and it's
  broken on 2.4 kernels.
- 770_: [NetBSD] disk_io_counters() metrics didn't update.

3.4.2
=====

*2016-01-20*

**Enhancements**

- 728_: [Solaris] exposed psutil.PROCFS_PATH constant to change the default
  location of /proc filesystem.

**Bug fixes**

- 724_: [FreeBSD] psutil.virtual_memory().total is incorrect.
- 730_: [FreeBSD] psutil.virtual_memory() crashes.

3.4.1
=====

*2016-01-15*

**Enhancements**

- 557_: [NetBSD] added NetBSD support.  (contributed by Ryo Onodera and
  Thomas Klausner)
- 708_: [Linux] psutil.net_connections() and Process.connections() on Python 2
  can be up to 3x faster in case of many connections.
  Also psutil.Process.memory_maps() is slightly faster.
- 718_: process_iter() is now thread safe.

**Bug fixes**

- 714_: [OpenBSD] virtual_memory().cached value was always set to 0.
- 715_: don't crash at import time if cpu_times() fail for some reason.
- 717_: [Linux] Process.open_files fails if deleted files still visible.
- 722_: [Linux] swap_memory() no longer crashes if sin/sout can't be determined
  due to missing /proc/vmstat.
- 724_: [FreeBSD] virtual_memory().total is slightly incorrect.

3.3.0
=====

*2015-11-25*

**Enhancements**

- 558_: [Linux] exposed psutil.PROCFS_PATH constant to change the default
  location of /proc filesystem.
- 615_: [OpenBSD] added OpenBSD support.  (contributed by Landry Breuil)

**Bug fixes**

- 692_: [UNIX] Process.name() is no longer cached as it may change.

3.2.2
=====

*2015-10-04*

**Bug fixes**

- 517_: [SunOS] net_io_counters failed to detect network interfaces
  correctly on Solaris 10
- 541_: [FreeBSD] disk_io_counters r/w times were expressed in seconds instead
  of milliseconds.  (patch by dasumin)
- 610_: [SunOS] fix build and tests on Solaris 10
- 623_: [Linux] process or system connections raises ValueError if IPv6 is not
  supported by the system.
- 678_: [Linux] can't install psutil due to bug in setup.py.
- 688_: [Windows] compilation fails with MSVC 2015, Python 3.5. (patch by
  Mike Sarahan)

3.2.1
=====

*2015-09-03*

**Bug fixes**

- 677_: [Linux] can't install psutil due to bug in setup.py.

3.2.0
=====

*2015-09-02*

**Enhancements**

- 644_: [Windows] added support for CTRL_C_EVENT and CTRL_BREAK_EVENT signals
  to use with Process.send_signal().
- 648_: CI test integration for macOS. (patch by Jeff Tang)
- 663_: [UNIX] net_if_addrs() now returns point-to-point (VPNs) addresses.
- 655_: [Windows] different issues regarding unicode handling were fixed. On
  Python 2 all APIs returning a string will now return an encoded version of it
  by using sys.getfilesystemencoding() codec. The APIs involved are:
  - psutil.net_if_addrs()
  - psutil.net_if_stats()
  - psutil.net_io_counters()
  - psutil.Process.cmdline()
  - psutil.Process.name()
  - psutil.Process.username()
  - psutil.users()

**Bug fixes**

- 513_: [Linux] fixed integer overflow for RLIM_INFINITY.
- 641_: [Windows] fixed many compilation warnings.  (patch by Jeff Tang)
- 652_: [Windows] net_if_addrs() UnicodeDecodeError in case of non-ASCII NIC
  names.
- 655_: [Windows] net_if_stats() UnicodeDecodeError in case of non-ASCII NIC
  names.
- 659_: [Linux] compilation error on Suse 10. (patch by maozguttman)
- 664_: [Linux] compilation error on Alpine Linux. (patch by Bart van Kleef)
- 670_: [Windows] segfgault of net_if_addrs() in case of non-ASCII NIC names.
  (patch by sk6249)
- 672_: [Windows] compilation fails if using Windows SDK v8.0. (patch by
  Steven Winfield)
- 675_: [Linux] net_connections(); UnicodeDecodeError may occur when listing
  UNIX sockets.

3.1.1
=====

*2015-07-15*

**Bug fixes**

- 603_: [Linux] ionice_set value range is incorrect.  (patch by spacewander)
- 645_: [Linux] psutil.cpu_times_percent() may produce negative results.
- 656_: 'from psutil import *' does not work.

3.1.0
=====

*2015-07-15*

**Enhancements**

- 534_: [Linux] disk_partitions() added support for ZFS filesystems.
- 646_: continuous tests integration for Windows with
  https://ci.appveyor.com/project/giampaolo/psutil.
- 647_: new dev guide:
  https://github.com/giampaolo/psutil/blob/master/docs/DEVGUIDE.rst
- 651_: continuous code quality test integration with scrutinizer-ci.com

**Bug fixes**

- 340_: [Windows] Process.open_files() no longer hangs. Instead it uses a
  thred which times out and skips the file handle in case it's taking too long
  to be retrieved.  (patch by Jeff Tang, PR #597)
- 627_: [Windows] Process.name() no longer raises AccessDenied for pids owned
  by another user.
- 636_: [Windows] Process.memory_info() raise AccessDenied.
- 637_: [UNIX] raise exception if trying to send signal to Process PID 0 as it
  will affect os.getpid()'s process group instead of PID 0.
- 639_: [Linux] Process.cmdline() can be truncated.
- 640_: [Linux] *connections functions may swallow errors and return an
  incomplete list of connnections.
- 642_: repr() of exceptions is incorrect.
- 653_: [Windows] Add inet_ntop function for Windows XP to support IPv6.
- 641_: [Windows] Replace deprecated string functions with safe equivalents.

3.0.1
=====

*2015-06-18*

**Bug fixes**

- 632_: [Linux] better error message if cannot parse process UNIX connections.
- 634_: [Linux] Proces.cmdline() does not include empty string arguments.
- 635_: [UNIX] crash on module import if 'enum' package is installed on python
  < 3.4.

3.0.0
=====

*2015-06-13*

**Enhancements**

- 250_: new psutil.net_if_stats() returning NIC statistics (isup, duplex,
  speed, MTU).
- 376_: new psutil.net_if_addrs() returning all NIC addresses a-la ifconfig.
- 469_: on Python >= 3.4 ``IOPRIO_CLASS_*`` and ``*_PRIORITY_CLASS`` constants
  returned by psutil.Process' ionice() and nice() methods are enums instead of
  plain integers.
- 581_: add .gitignore. (patch by Gabi Davar)
- 582_: connection constants returned by psutil.net_connections() and
  psutil.Process.connections() were turned from int to enums on Python > 3.4.
- 587_: Move native extension into the package.
- 589_: Process.cpu_affinity() accepts any kind of iterable (set, tuple, ...),
  not only lists.
- 594_: all deprecated APIs were removed.
- 599_: [Windows] process name() can now be determined for all processes even
  when running as a limited user.
- 602_: pre-commit GIT hook.
- 629_: enhanced support for py.test and nose test discovery and tests run.
- 616_: [Windows] Add inet_ntop function for Windows XP.

**Bug fixes**

- 428_: [all UNIXes except Linux] correct handling of zombie processes;
  introduced new ZombieProcess exception class.
- 512_: [BSD] fix segfault in net_connections().
- 555_: [Linux] psutil.users() correctly handles ":0" as an alias for
  "localhost"
- 579_: [Windows] Fixed open_files() for PID>64K.
- 579_: [Windows] fixed many compiler warnings.
- 585_: [FreeBSD] net_connections() may raise KeyError.
- 586_: [FreeBSD] cpu_affinity() segfaults on set in case an invalid CPU
  number is provided.
- 593_: [FreeBSD] Process().memory_maps() segfaults.
- 606_: Process.parent() may swallow NoSuchProcess exceptions.
- 611_: [SunOS] net_io_counters has send and received swapped
- 614_: [Linux]: cpu_count(logical=False) return the number of physical CPUs
  instead of physical cores.
- 618_: [SunOS] swap tests fail on Solaris when run as normal user
- 628_: [Linux] Process.name() truncates process name in case it contains
  spaces or parentheses.

2.2.1
=====

*2015-02-02*

**Bug fixes**

- 496_: [Linux] fix "ValueError: ambiguos inode with multiple PIDs references"
  (patch by Bruno Binet)

2.2.0
=====

*2015-01-06*

**Enhancements**

- 521_: drop support for Python 2.4 and 2.5.
- 553_: new examples/pstree.py script.
- 564_: C extension version mismatch in case the user messed up with psutil
  installation or with sys.path is now detected at import time.
- 568_: New examples/pidof.py script.
- 569_: [FreeBSD] add support for process CPU affinity.

**Bug fixes**

- 496_: [Solaris] can't import psutil.
- 547_: [UNIX] Process.username() may raise KeyError if UID can't be resolved.
- 551_: [Windows] get rid of the unicode hack for net_io_counters() NIC names.
- 556_: [Linux] lots of file handles were left open.
- 561_: [Linux] net_connections() might skip some legitimate UNIX sockets.
  (patch by spacewander)
- 565_: [Windows] use proper encoding for psutil.Process.username() and
  psutil.users(). (patch by Sylvain Mouquet)
- 567_: [Linux] in the alternative implementation of CPU affinity PyList_Append
  and Py_BuildValue return values are not checked.
- 569_: [FreeBSD] fix memory leak in psutil.cpu_count(logical=False).
- 571_: [Linux] Process.open_files() might swallow AccessDenied exceptions and
  return an incomplete list of open files.

2.1.3
=====

*2014-09-26*

- 536_: [Linux]: fix "undefined symbol: CPU_ALLOC" compilation error.

2.1.2
=====

*2014-09-21*

**Enhancements**

- 407_: project moved from Google Code to Github; code moved from Mercurial
  to Git.
- 492_: use tox to run tests on multiple python versions.  (patch by msabramo)
- 505_: [Windows] distribution as wheel packages.
- 511_: new examples/ps.py sample code.

**Bug fixes**

- 340_: [Windows] Process.get_open_files() no longer hangs.  (patch by
  Jeff Tang)
- 501_: [Windows] disk_io_counters() may return negative values.
- 503_: [Linux] in rare conditions Process exe(), open_files() and
  connections() methods can raise OSError(ESRCH) instead of NoSuchProcess.
- 504_: [Linux] can't build RPM packages via setup.py
- 506_: [Linux] python 2.4 support was broken.
- 522_: [Linux] Process.cpu_affinity() might return EINVAL.  (patch by David
  Daeschler)
- 529_: [Windows] Process.exe() may raise unhandled WindowsError exception
  for PIDs 0 and 4.  (patch by Jeff Tang)
- 530_: [Linux] psutil.disk_io_counters() may crash on old Linux distros
  (< 2.6.5)  (patch by Yaolong Huang)
- 533_: [Linux] Process.memory_maps() may raise TypeError on old Linux distros.

2.1.1
=====

*2014-04-30*

**Bug fixes**

- 446_: [Windows] fix encoding error when using net_io_counters() on Python 3.
  (patch by Szigeti Gabor Niif)
- 460_: [Windows] net_io_counters() wraps after 4G.
- 491_: [Linux] psutil.net_connections() exceptions. (patch by Alexander Grothe)

2.1.0
=====

*2014-04-08*

**Enhancements**

- 387_: system-wide open connections a-la netstat.

**Bug fixes**

- 421_: [Solaris] psutil does not compile on SunOS 5.10 (patch by Naveed
  Roudsari)
- 489_: [Linux] psutil.disk_partitions() return an empty list.

2.0.0
=====

*2014-03-10*

**Enhancements**

- 424_: [Windows] installer for Python 3.X 64 bit.
- 427_: number of logical and physical CPUs (psutil.cpu_count()).
- 447_: psutil.wait_procs() timeout parameter is now optional.
- 452_: make Process instances hashable and usable with set()s.
- 453_: tests on Python < 2.7 require unittest2 module.
- 459_: add a make file for running tests and other repetitive tasks (also
  on Windows).
- 463_: make timeout parameter of cpu_percent* functions default to 0.0 'cause
  it's a common trap to introduce slowdowns.
- 468_: move documentation to readthedocs.com.
- 477_: process cpu_percent() is about 30% faster.  (suggested by crusaderky)
- 478_: [Linux] almost all APIs are about 30% faster on Python 3.X.
- 479_: long deprecated psutil.error module is gone; exception classes now
  live in "psutil" namespace only.

**Bug fixes**

- 193_: psutil.Popen constructor can throw an exception if the spawned process
  terminates quickly.
- 340_: [Windows] process get_open_files() no longer hangs.  (patch by
  jtang@vahna.net)
- 443_: [Linux] fix a potential overflow issue for Process.set_cpu_affinity()
  on systems with more than 64 CPUs.
- 448_: [Windows] get_children() and ppid() memory leak (patch by Ulrich
  Klank).
- 457_: [POSIX] pid_exists() always returns True for PID 0.
- 461_: namedtuples are not pickle-able.
- 466_: [Linux] process exe improper null bytes handling.  (patch by
  Gautam Singh)
- 470_: wait_procs() might not wait.  (patch by crusaderky)
- 471_: [Windows] process exe improper unicode handling. (patch by
  alex@mroja.net)
- 473_: psutil.Popen.wait() does not set returncode attribute.
- 474_: [Windows] Process.cpu_percent() is no longer capped at 100%.
- 476_: [Linux] encoding error for process name and cmdline.

**API changes**

For the sake of consistency a lot of psutil APIs have been renamed.
In most cases accessing the old names will work but it will cause a
DeprecationWarning.

- psutil.* module level constants have being replaced by functions:

  +-----------------------+-------------------------------+
  | Old name              | Replacement                   |
  +=======================+===============================+
  | psutil.NUM_CPUS       | psutil.cpu_cpunt()            |
  +-----------------------+-------------------------------+
  | psutil.BOOT_TIME      | psutil.boot_time()            |
  +-----------------------+-------------------------------+
  | psutil.TOTAL_PHYMEM   | psutil.virtual_memory().total |
  +-----------------------+-------------------------------+

- Renamed psutil.* functions:

  +--------------------------+-------------------------------+
  | Old name                 | Replacement                   |
  +==========================+===============================+
  | - psutil.get_pid_list()  | psutil.pids()                 |
  +--------------------------+-------------------------------+
  | - psutil.get_users()     | psutil.users()                |
  +--------------------------+-------------------------------+
  | - psutil.get_boot_time() | psutil.boot_time()            |
  +--------------------------+-------------------------------+

- All psutil.Process ``get_*`` methods lost the ``get_`` prefix.
  get_ext_memory_info() renamed to memory_info_ex().
  Assuming "p = psutil.Process()":

  +--------------------------+----------------------+
  | Old name                 | Replacement          |
  +==========================+======================+
  | p.get_children()         | p.children()         |
  +--------------------------+----------------------+
  | p.get_connections()      | p.connections()      |
  +--------------------------+----------------------+
  | p.get_cpu_affinity()     | p.cpu_affinity()     |
  +--------------------------+----------------------+
  | p.get_cpu_percent()      | p.cpu_percent()      |
  +--------------------------+----------------------+
  | p.get_cpu_times()        | p.cpu_times()        |
  +--------------------------+----------------------+
  | p.get_ext_memory_info()  | p.memory_info_ex()   |
  +--------------------------+----------------------+
  | p.get_io_counters()      | p.io_counters()      |
  +--------------------------+----------------------+
  | p.get_ionice()           | p.ionice()           |
  +--------------------------+----------------------+
  | p.get_memory_info()      | p.memory_info()      |
  +--------------------------+----------------------+
  | p.get_memory_maps()      | p.memory_maps()      |
  +--------------------------+----------------------+
  | p.get_memory_percent()   | p.memory_percent()   |
  +--------------------------+----------------------+
  | p.get_nice()             | p.nice()             |
  +--------------------------+----------------------+
  | p.get_num_ctx_switches() | p.num_ctx_switches() |
  +--------------------------+----------------------+
  | p.get_num_fds()          | p.num_fds()          |
  +--------------------------+----------------------+
  | p.get_num_threads()      | p.num_threads()      |
  +--------------------------+----------------------+
  | p.get_open_files()       | p.open_files()       |
  +--------------------------+----------------------+
  | p.get_rlimit()           | p.rlimit()           |
  +--------------------------+----------------------+
  | p.get_threads()          | p.threads()          |
  +--------------------------+----------------------+
  | p.getcwd()               | p.cwd()              |
  +--------------------------+----------------------+

- All psutil.Process ``set_*`` methods lost the ``set_`` prefix.
  Assuming "p = psutil.Process()":

  +----------------------+---------------------------------+
  | Old name             | Replacement                     |
  +======================+=================================+
  | p.set_nice()         | p.nice(value)                   |
  +----------------------+---------------------------------+
  | p.set_ionice()       | p.ionice(ioclass, value=None)   |
  +----------------------+---------------------------------+
  | p.set_cpu_affinity() | p.cpu_affinity(cpus)            |
  +----------------------+---------------------------------+
  | p.set_rlimit()       | p.rlimit(resource, limits=None) |
  +----------------------+---------------------------------+

- Except for 'pid' all psutil.Process class properties have been turned into
  methods. This is the only case which there are no aliases.
  Assuming "p = psutil.Process()":

  +---------------+-----------------+
  | Old name      | Replacement     |
  +===============+=================+
  | p.name        | p.name()        |
  +---------------+-----------------+
  | p.parent      | p.parent()      |
  +---------------+-----------------+
  | p.ppid        | p.ppid()        |
  +---------------+-----------------+
  | p.exe         | p.exe()         |
  +---------------+-----------------+
  | p.cmdline     | p.cmdline()     |
  +---------------+-----------------+
  | p.status      | p.status()      |
  +---------------+-----------------+
  | p.uids        | p.uids()        |
  +---------------+-----------------+
  | p.gids        | p.gids()        |
  +---------------+-----------------+
  | p.username    | p.username()    |
  +---------------+-----------------+
  | p.create_time | p.create_time() |
  +---------------+-----------------+

- timeout parameter of cpu_percent* functions defaults to 0.0 instead of 0.1.
- long deprecated psutil.error module is gone; exception classes now live in
  "psutil" namespace only.
- Process instances' "retcode" attribute returned by psutil.wait_procs() has
  been renamed to "returncode" for consistency with subprocess.Popen.

1.2.1
=====

*2013-11-25*

**Bug fixes**

- 348_: [Windows XP] fixed "ImportError: DLL load failed" occurring on module
  import.
- 425_: [Solaris] crash on import due to failure at determining BOOT_TIME.
- 443_: [Linux] can't set CPU affinity on systems with more than 64 cores.

1.2.0
=====

*2013-11-20*

**Enhancements**

- 439_: assume os.getpid() if no argument is passed to psutil.Process
  constructor.
- 440_: new psutil.wait_procs() utility function which waits for multiple
  processes to terminate.

**Bug fixes**

- 348_: [Windows XP/Vista] fix "ImportError: DLL load failed" occurring on
  module import.

1.1.3
=====

*2013-11-07*

**Bug fixes**

- 442_: [Linux] psutil won't compile on certain version of Linux because of
  missing prlimit(2) syscall.

1.1.2
=====

*2013-10-22*

**Bug fixes**

- 442_: [Linux] psutil won't compile on Debian 6.0 because of missing
  prlimit(2) syscall.

1.1.1
=====

*2013-10-08*

**Bug fixes**

- 442_: [Linux] psutil won't compile on kernels < 2.6.36 due to missing
  prlimit(2) syscall.

1.1.0
=====

*2013-09-28*

**Enhancements**

- 410_: host tar.gz and windows binary files are on PyPI.
- 412_: [Linux] get/set process resource limits.
- 415_: [Windows] Process.get_children() is an order of magnitude faster.
- 426_: [Windows] Process.name is an order of magnitude faster.
- 431_: [UNIX] Process.name is slightly faster because it unnecessarily
  retrieved also process cmdline.

**Bug fixes**

- 391_: [Windows] psutil.cpu_times_percent() returns negative percentages.
- 408_: STATUS_* and CONN_* constants don't properly serialize on JSON.
- 411_: [Windows] examples/disk_usage.py may pop-up a GUI error.
- 413_: [Windows] Process.get_memory_info() leaks memory.
- 414_: [Windows] Process.exe on Windows XP may raise ERROR_INVALID_PARAMETER.
- 416_: psutil.disk_usage() doesn't work well with unicode path names.
- 430_: [Linux] process IO counters report wrong number of r/w syscalls.
- 435_: [Linux] psutil.net_io_counters() might report erreneous NIC names.
- 436_: [Linux] psutil.net_io_counters() reports a wrong 'dropin' value.

**API changes**

- 408_: turn STATUS_* and CONN_* constants into plain Python strings.

1.0.1
=====

*2013-07-12*

**Bug fixes**

- 405_: network_io_counters(pernic=True) no longer works as intended in 1.0.0.

1.0.0
=====

*2013-07-10*

**Enhancements**

- 18_:  Solaris support (yay!)  (thanks Justin Venus)
- 367_: Process.get_connections() 'status' strings are now constants.
- 380_: test suite exits with non-zero on failure.  (patch by floppymaster)
- 391_: introduce unittest2 facilities and provide workarounds if unittest2
  is not installed (python < 2.7).

**Bug fixes**

- 374_: [Windows] negative memory usage reported if process uses a lot of
  memory.
- 379_: [Linux] Process.get_memory_maps() may raise ValueError.
- 394_: [macOS] Mapped memory regions report incorrect file name.
- 404_: [Linux] sched_*affinity() are implicitly declared. (patch by Arfrever)

**API changes**

- Process.get_connections() 'status' field is no longer a string but a
  constant object (psutil.CONN_*).
- Process.get_connections() 'local_address' and 'remote_address' fields
  renamed to 'laddr' and 'raddr'.
- psutil.network_io_counters() renamed to psutil.net_io_counters().

0.7.1
=====

*2013-05-03*

**Bug fixes**

- 325_: [BSD] psutil.virtual_memory() can raise SystemError.
  (patch by Jan Beich)
- 370_: [BSD] Process.get_connections() requires root.  (patch by John Baldwin)
- 372_: [BSD] different process methods raise NoSuchProcess instead of
  AccessDenied.

0.7.0
=====

*2013-04-12*

**Enhancements**

- 233_: code migrated to Mercurial (yay!)
- 246_: psutil.error module is deprecated and scheduled for removal.
- 328_: [Windows] process IO nice/priority support.
- 359_: psutil.get_boot_time()
- 361_: [Linux] psutil.cpu_times() now includes new 'steal', 'guest' and
  'guest_nice' fields available on recent Linux kernels.
  Also, psutil.cpu_percent() is more accurate.
- 362_: cpu_times_percent() (per-CPU-time utilization as a percentage)

**Bug fixes**

- 234_: [Windows] disk_io_counters() fails to list certain disks.
- 264_: [Windows] use of psutil.disk_partitions() may cause a message box to
  appear.
- 313_: [Linux] psutil.virtual_memory() and psutil.swap_memory() can crash on
  certain exotic Linux flavors having an incomplete /proc interface.
  If that's the case we now set the unretrievable stats to 0 and raise a
  RuntimeWarning.
- 315_: [macOS] fix some compilation warnings.
- 317_: [Windows] cannot set process CPU affinity above 31 cores.
- 319_: [Linux] process get_memory_maps() raises KeyError 'Anonymous' on Debian
  squeeze.
- 321_: [UNIX] Process.ppid property is no longer cached as the kernel may set
  the ppid to 1 in case of a zombie process.
- 323_: [macOS] disk_io_counters()'s read_time and write_time parameters were
  reporting microseconds not milliseconds.  (patch by Gregory Szorc)
- 331_: Process cmdline is no longer cached after first acces as it may change.
- 333_: [macOS] Leak of Mach ports on macOS (patch by rsesek@google.com)
- 337_: [Linux] process methods not working because of a poor /proc
  implementation will raise NotImplementedError rather than RuntimeError
  and Process.as_dict() will not blow up.  (patch by Curtin1060)
- 338_: [Linux] disk_io_counters() fails to find some disks.
- 339_: [FreeBSD] get_pid_list() can allocate all the memory on system.
- 341_: [Linux] psutil might crash on import due to error in retrieving system
  terminals map.
- 344_: [FreeBSD] swap_memory() might return incorrect results due to
  kvm_open(3) not being called. (patch by Jean Sebastien)
- 338_: [Linux] disk_io_counters() fails to find some disks.
- 351_: [Windows] if psutil is compiled with mingw32 (provided installers for
  py2.4 and py2.5 are) disk_io_counters() will fail. (Patch by m.malycha)
- 353_: [macOS] get_users() returns an empty list on macOS 10.8.
- 356_: Process.parent now checks whether parent PID has been reused in which
  case returns None.
- 365_: Process.set_nice() should check PID has not been reused by another
  process.
- 366_: [FreeBSD] get_memory_maps(), get_num_fds(), get_open_files() and
  getcwd() Process methods raise RuntimeError instead of AccessDenied.

**API changes**

- Process.cmdline property is no longer cached after first access.
- Process.ppid property is no longer cached after first access.
- [Linux] Process methods not working because of a poor /proc implementation
  will raise NotImplementedError instead of RuntimeError.
- psutil.error module is deprecated and scheduled for removal.

0.6.1
=====

*2012-08-16*

**Enhancements**

- 316_: process cmdline property now makes a better job at guessing the process
  executable from the cmdline.

**Bug fixes**

- 316_: process exe was resolved in case it was a symlink.
- 318_: python 2.4 compatibility was broken.

**API changes**

- process exe can now return an empty string instead of raising AccessDenied.
- process exe is no longer resolved in case it's a symlink.

0.6.0
=====

*2012-08-13*

**Enhancements**

- 216_: [POSIX] get_connections() UNIX sockets support.
- 220_: [FreeBSD] get_connections() has been rewritten in C and no longer
  requires lsof.
- 222_: [macOS] add support for process cwd.
- 261_: process extended memory info.
- 295_: [macOS] process executable path is now determined by asking the OS
  instead of being guessed from process cmdline.
- 297_: [macOS] the Process methods below were always raising AccessDenied for
  any process except the current one. Now this is no longer true. Also
  they are 2.5x faster.
  - name
  - get_memory_info()
  - get_memory_percent()
  - get_cpu_times()
  - get_cpu_percent()
  - get_num_threads()
- 300_: examples/pmap.py script.
- 301_: process_iter() now yields processes sorted by their PIDs.
- 302_: process number of voluntary and involuntary context switches.
- 303_: [Windows] the Process methods below were always raising AccessDenied
  for any process not owned by current user. Now this is no longer true:
  - create_time
  - get_cpu_times()
  - get_cpu_percent()
  - get_memory_info()
  - get_memory_percent()
  - get_num_handles()
  - get_io_counters()
- 305_: add examples/netstat.py script.
- 311_: system memory functions has been refactorized and rewritten and now
  provide a more detailed and consistent representation of the system
  memory. New psutil.virtual_memory() function provides the following
  memory amounts:
  - total
  - available
  - percent
  - used
  - active [POSIX]
  - inactive [POSIX]
  - buffers (BSD, Linux)
  - cached (BSD, macOS)
  - wired (macOS, BSD)
  - shared [FreeBSD]
  New psutil.swap_memory() provides:
  - total
  - used
  - free
  - percent
  - sin (no. of bytes the system has swapped in from disk (cumulative))
  - sout (no. of bytes the system has swapped out from disk (cumulative))
  All old memory-related functions are deprecated.
  Also two new example scripts were added:  free.py and meminfo.py.
- 312_: psutil.network_io_counters() namedtuple includes 4 new fields:
  errin, errout dropin and dropout, reflecting the number of packets
  dropped and with errors.

**Bug fixes**

- 298_: [macOS and BSD] memory leak in get_num_fds().
- 299_: potential memory leak every time PyList_New(0) is used.
- 303_: [Windows] potential heap corruption in get_num_threads() and
  get_status() Process methods.
- 305_: [FreeBSD] psutil can't compile on FreeBSD 9 due to removal of utmp.h.
- 306_: at C level, errors are not checked when invoking Py* functions which
  create or manipulate Python objects leading to potential memory related
  errors and/or segmentation faults.
- 307_: [FreeBSD] values returned by psutil.network_io_counters() are wrong.
- 308_: [BSD / Windows] psutil.virtmem_usage() wasn't actually returning
  information about swap memory usage as it was supposed to do. It does
  now.
- 309_: get_open_files() might not return files which can not be accessed
  due to limited permissions. AccessDenied is now raised instead.

**API changes**

- psutil.phymem_usage() is deprecated       (use psutil.virtual_memory())
- psutil.virtmem_usage() is deprecated      (use psutil.swap_memory())
- psutil.phymem_buffers() on Linux is deprecated  (use psutil.virtual_memory())
- psutil.cached_phymem() on Linux is deprecated   (use psutil.virtual_memory())
- [Windows and BSD] psutil.virtmem_usage() now returns information about swap
  memory instead of virtual memory.

0.5.1
=====

*2012-06-29*

**Enhancements**

- 293_: [Windows] process executable path is now determined by asking the OS
  instead of being guessed from process cmdline.

**Bug fixes**

- 292_: [Linux] race condition in process files/threads/connections.
- 294_: [Windows] Process CPU affinity is only able to set CPU #0.

0.5.0
=====

*2012-06-27*

**Enhancements**

- 195_: [Windows] number of handles opened by process.
- 209_: psutil.disk_partitions() now provides also mount options.
- 229_: list users currently connected on the system (psutil.get_users()).
- 238_: [Linux, Windows] process CPU affinity (get and set).
- 242_: Process.get_children(recursive=True): return all process
  descendants.
- 245_: [POSIX] Process.wait() incrementally consumes less CPU cycles.
- 257_: [Windows] removed Windows 2000 support.
- 258_: [Linux] Process.get_memory_info() is now 0.5x faster.
- 260_: process's mapped memory regions. (Windows patch by wj32.64, macOS patch
  by Jeremy Whitlock)
- 262_: [Windows] psutil.disk_partitions() was slow due to inspecting the
  floppy disk drive also when "all" argument was False.
- 273_: psutil.get_process_list() is deprecated.
- 274_: psutil no longer requires 2to3 at installation time in order to work
  with Python 3.
- 278_: new Process.as_dict() method.
- 281_: ppid, name, exe, cmdline and create_time properties of Process class
  are now cached after being accessed.
- 282_: psutil.STATUS_* constants can now be compared by using their string
  representation.
- 283_: speedup Process.is_running() by caching its return value in case the
  process is terminated.
- 284_: [POSIX] per-process number of opened file descriptors.
- 287_: psutil.process_iter() now caches Process instances between calls.
- 290_: Process.nice property is deprecated in favor of new get_nice() and
  set_nice() methods.

**Bug fixes**

- 193_: psutil.Popen constructor can throw an exception if the spawned process
  terminates quickly.
- 240_: [macOS] incorrect use of free() for Process.get_connections().
- 244_: [POSIX] Process.wait() can hog CPU resources if called against a
  process which is not our children.
- 248_: [Linux] psutil.network_io_counters() might return erroneous NIC names.
- 252_: [Windows] process getcwd() erroneously raise NoSuchProcess for
  processes owned by another user.  It now raises AccessDenied instead.
- 266_: [Windows] psutil.get_pid_list() only shows 1024 processes.
  (patch by Amoser)
- 267_: [macOS] Process.get_connections() - an erroneous remote address was
  returned. (Patch by Amoser)
- 272_: [Linux] Porcess.get_open_files() - potential race condition can lead to
  unexpected NoSuchProcess exception.  Also, we can get incorrect reports
  of not absolutized path names.
- 275_: [Linux] Process.get_io_counters() erroneously raise NoSuchProcess on
  old Linux versions. Where not available it now raises
  NotImplementedError.
- 286_: Process.is_running() doesn't actually check whether PID has been
  reused.
- 314_: Process.get_children() can sometimes return non-children.

**API changes**

- Process.nice property is deprecated in favor of new get_nice() and set_nice()
  methods.
- psutil.get_process_list() is deprecated.
- ppid, name, exe, cmdline and create_time properties of Process class are now
  cached after being accessed, meaning NoSuchProcess will no longer be raised
  in case the process is gone in the meantime.
- psutil.STATUS_* constants can now be compared by using their string
  representation.

0.4.1
=====

*2011-12-14*

**Bug fixes**

- 228_: some example scripts were not working with python 3.
- 230_: [Windows / macOS] memory leak in Process.get_connections().
- 232_: [Linux] psutil.phymem_usage() can report erroneous values which are
  different than "free" command.
- 236_: [Windows] memory/handle leak in Process's get_memory_info(),
  suspend() and resume() methods.

0.4.0
=====

*2011-10-29*

**Enhancements**

- 150_: network I/O counters. (macOS and Windows patch by Jeremy Whitlock)
- 154_: [FreeBSD] add support for process getcwd()
- 157_: [Windows] provide installer for Python 3.2 64-bit.
- 198_: Process.wait(timeout=0) can now be used to make wait() return
  immediately.
- 206_: disk I/O counters. (macOS and Windows patch by Jeremy Whitlock)
- 213_: examples/iotop.py script.
- 217_: Process.get_connections() now has a "kind" argument to filter
  for connections with different criteria.
- 221_: [FreeBSD] Process.get_open_files has been rewritten in C and no longer
  relies on lsof.
- 223_: examples/top.py script.
- 227_: examples/nettop.py script.

**Bug fixes**

- 135_: [macOS] psutil cannot create Process object.
- 144_: [Linux] no longer support 0 special PID.
- 188_: [Linux] psutil import error on Linux ARM architectures.
- 194_: [POSIX] psutil.Process.get_cpu_percent() now reports a percentage over
  100 on multicore processors.
- 197_: [Linux] Process.get_connections() is broken on platforms not
  supporting IPv6.
- 200_: [Linux] psutil.NUM_CPUS not working on armel and sparc architectures
  and causing crash on module import.
- 201_: [Linux] Process.get_connections() is broken on big-endian
  architectures.
- 211_: Process instance can unexpectedly raise NoSuchProcess if tested for
  equality with another object.
- 218_: [Linux] crash at import time on Debian 64-bit because of a missing
  line in /proc/meminfo.
- 226_: [FreeBSD] crash at import time on FreeBSD 7 and minor.

0.3.0
=====

*2011-07-08*

**Enhancements**

- 125_: system per-cpu percentage utilization and times.
- 163_: per-process associated terminal (TTY).
- 171_: added get_phymem() and get_virtmem() functions returning system
  memory information (total, used, free) and memory percent usage.
  total_* avail_* and used_* memory functions are deprecated.
- 172_: disk usage statistics.
- 174_: mounted disk partitions.
- 179_: setuptools is now used in setup.py

**Bug fixes**

- 159_: SetSeDebug() does not close handles or unset impersonation on return.
- 164_: [Windows] wait function raises a TimeoutException when a process
  returns -1 .
- 165_: process.status raises an unhandled exception.
- 166_: get_memory_info() leaks handles hogging system resources.
- 168_: psutil.cpu_percent() returns erroneous results when used in
  non-blocking mode.  (patch by Philip Roberts)
- 178_: macOS - Process.get_threads() leaks memory
- 180_: [Windows] Process's get_num_threads() and get_threads() methods can
  raise NoSuchProcess exception while process still exists.

0.2.1
=====

*2011-03-20*

**Enhancements**

- 64_: per-process I/O counters.
- 116_: per-process wait() (wait for process to terminate and return its exit
  code).
- 134_: per-process get_threads() returning information (id, user and kernel
  times) about threads opened by process.
- 136_: process executable path on FreeBSD is now determined by asking the
  kernel instead of guessing it from cmdline[0].
- 137_: per-process real, effective and saved user and group ids.
- 140_: system boot time.
- 142_: per-process get and set niceness (priority).
- 143_: per-process status.
- 147_: per-process I/O nice (priority) - Linux only.
- 148_: psutil.Popen class which tidies up subprocess.Popen and psutil.Process
  in a unique interface.
- 152_: [macOS] get_process_open_files() implementation has been rewritten
  in C and no longer relies on lsof resulting in a 3x speedup.
- 153_: [macOS] get_process_connection() implementation has been rewritten
  in C and no longer relies on lsof resulting in a 3x speedup.

**Bug fixes**

- 83_:  process cmdline is empty on macOS 64-bit.
- 130_: a race condition can cause IOError exception be raised on
  Linux if process disappears between open() and subsequent read() calls.
- 145_: WindowsError was raised instead of psutil.AccessDenied when using
  process resume() or suspend() on Windows.
- 146_: 'exe' property on Linux can raise TypeError if path contains NULL
  bytes.
- 151_: exe and getcwd() for PID 0 on Linux return inconsistent data.

**API changes**

- Process "uid" and "gid" properties are deprecated in favor of "uids" and
  "gids" properties.

0.2.0
=====

*2010-11-13*

**Enhancements**

- 79_: per-process open files.
- 88_: total system physical cached memory.
- 88_: total system physical memory buffers used by the kernel.
- 91_: per-process send_signal() and terminate() methods.
- 95_: NoSuchProcess and AccessDenied exception classes now provide "pid",
  "name" and "msg" attributes.
- 97_: per-process children.
- 98_: Process.get_cpu_times() and Process.get_memory_info now return
  a namedtuple instead of a tuple.
- 103_: per-process opened TCP and UDP connections.
- 107_: add support for Windows 64 bit. (patch by cjgohlke)
- 111_: per-process executable name.
- 113_: exception messages now include process name and pid.
- 114_: process username Windows implementation has been rewritten in pure
  C and no longer uses WMI resulting in a big speedup. Also, pywin32 is no
  longer required as a third-party dependancy. (patch by wj32)
- 117_: added support for Windows 2000.
- 123_: psutil.cpu_percent() and psutil.Process.cpu_percent() accept a
  new 'interval' parameter.
- 129_: per-process number of threads.

**Bug fixes**

- 80_: fixed warnings when installing psutil with easy_install.
- 81_: psutil fails to compile with Visual Studio.
- 94_: suspend() raises OSError instead of AccessDenied.
- 86_: psutil didn't compile against FreeBSD 6.x.
- 102_: orphaned process handles obtained by using OpenProcess in C were
  left behind every time Process class was instantiated.
- 111_: path and name Process properties report truncated or erroneous
  values on UNIX.
- 120_: cpu_percent() always returning 100% on macOS.
- 112_: uid and gid properties don't change if process changes effective
  user/group id at some point.
- 126_: ppid, uid, gid, name, exe, cmdline and create_time properties are
  no longer cached and correctly raise NoSuchProcess exception if the process
  disappears.

**API changes**

- psutil.Process.path property is deprecated and works as an alias for "exe"
  property.
- psutil.Process.kill(): signal argument was removed - to send a signal to the
  process use send_signal(signal) method instead.
- psutil.Process.get_memory_info() returns a nametuple instead of a tuple.
- psutil.cpu_times() returns a nametuple instead of a tuple.
- New psutil.Process methods: get_open_files(), get_connections(),
  send_signal() and terminate().
- ppid, uid, gid, name, exe, cmdline and create_time properties are no longer
  cached and raise NoSuchProcess exception if process disappears.
- psutil.cpu_percent() no longer returns immediately (see issue 123).
- psutil.Process.get_cpu_percent() and psutil.cpu_percent() no longer returns
  immediately by default (see issue 123).

0.1.3
=====

*2010-03-02*

**Enhancements**

- 14_: per-process username
- 51_: per-process current working directory (Windows and Linux only)
- 59_: Process.is_running() is now 10 times faster
- 61_: added supoprt for FreeBSD 64 bit
- 71_: implemented suspend/resume process
- 75_: python 3 support

**Bug fixes**

- 36_: process cpu_times() and memory_info() functions succeeded also for dead
  processes while a NoSuchProcess exception is supposed to be raised.
- 48_: incorrect size for mib array defined in getcmdargs for BSD
- 49_: possible memory leak due to missing free() on error condition on
- 50_: fixed getcmdargs() memory fragmentation on BSD
- 55_: test_pid_4 was failing on Windows Vista
- 57_: some unit tests were failing on systems where no swap memory is
  available
- 58_: is_running() is now called before kill() to make sure we are going
  to kill the correct process.
- 73_: virtual memory size reported on macOS includes shared library size
- 77_: NoSuchProcess wasn't raised on Process.create_time if kill() was
  used first.

0.1.2
=====

*2009-05-06*

**Enhancements**

- 32_: Per-process CPU user/kernel times
- 33_: Process create time
- 34_: Per-process CPU utilization percentage
- 38_: Per-process memory usage (bytes)
- 41_: Per-process memory utilization (percent)
- 39_: System uptime
- 43_: Total system virtual memory
- 46_: Total system physical memory
- 44_: Total system used/free virtual and physical memory

**Bug fixes**

- 36_: [Windows] NoSuchProcess not raised when accessing timing methods.
- 40_: test_get_cpu_times() failing on FreeBSD and macOS.
- 42_: [Windows] get_memory_percent() raises AccessDenied.

0.1.1
=====

*2009-03-06*

**Enhancements**

- 4_: FreeBSD support for all functions of psutil
- 9_: Process.uid and Process.gid now retrieve process UID and GID.
- 11_: Support for parent/ppid - Process.parent property returns a
  Process object representing the parent process, and Process.ppid returns
  the parent PID.
- 12_ & 15:
  NoSuchProcess exception now raised when creating an object
  for a nonexistent process, or when retrieving information about a process
  that has gone away.
- 21_: AccessDenied exception created for raising access denied errors
  from OSError or WindowsError on individual platforms.
- 26_: psutil.process_iter() function to iterate over processes as
  Process objects with a generator.
- Process objects can now also be compared with == operator for equality
  (PID, name, command line are compared).

**Bug fixes**

- 16_: [Windows] Special case for "System Idle Process" (PID 0) which
  otherwise would return an "invalid parameter" exception.
- 17_: get_process_list() ignores NoSuchProcess and AccessDenied
  exceptions during building of the list.
- 22_: [Windows] Process(0).kill() was failing with an unset exception.
- 23_: Special case for pid_exists(0)
- 24_: [Windows] Process(0).kill() now raises AccessDenied exception instead
  of WindowsError.
- 30_: psutil.get_pid_list() was returning two ins

.. _1: https://github.com/giampaolo/psutil/issues/1
.. _2: https://github.com/giampaolo/psutil/issues/2
.. _3: https://github.com/giampaolo/psutil/issues/3
.. _4: https://github.com/giampaolo/psutil/issues/4
.. _5: https://github.com/giampaolo/psutil/issues/5
.. _6: https://github.com/giampaolo/psutil/issues/6
.. _7: https://github.com/giampaolo/psutil/issues/7
.. _8: https://github.com/giampaolo/psutil/issues/8
.. _9: https://github.com/giampaolo/psutil/issues/9
.. _10: https://github.com/giampaolo/psutil/issues/10
.. _11: https://github.com/giampaolo/psutil/issues/11
.. _12: https://github.com/giampaolo/psutil/issues/12
.. _13: https://github.com/giampaolo/psutil/issues/13
.. _14: https://github.com/giampaolo/psutil/issues/14
.. _15: https://github.com/giampaolo/psutil/issues/15
.. _16: https://github.com/giampaolo/psutil/issues/16
.. _17: https://github.com/giampaolo/psutil/issues/17
.. _18: https://github.com/giampaolo/psutil/issues/18
.. _19: https://github.com/giampaolo/psutil/issues/19
.. _20: https://github.com/giampaolo/psutil/issues/20
.. _21: https://github.com/giampaolo/psutil/issues/21
.. _22: https://github.com/giampaolo/psutil/issues/22
.. _23: https://github.com/giampaolo/psutil/issues/23
.. _24: https://github.com/giampaolo/psutil/issues/24
.. _25: https://github.com/giampaolo/psutil/issues/25
.. _26: https://github.com/giampaolo/psutil/issues/26
.. _27: https://github.com/giampaolo/psutil/issues/27
.. _28: https://github.com/giampaolo/psutil/issues/28
.. _29: https://github.com/giampaolo/psutil/issues/29
.. _30: https://github.com/giampaolo/psutil/issues/30
.. _31: https://github.com/giampaolo/psutil/issues/31
.. _32: https://github.com/giampaolo/psutil/issues/32
.. _33: https://github.com/giampaolo/psutil/issues/33
.. _34: https://github.com/giampaolo/psutil/issues/34
.. _35: https://github.com/giampaolo/psutil/issues/35
.. _36: https://github.com/giampaolo/psutil/issues/36
.. _37: https://github.com/giampaolo/psutil/issues/37
.. _38: https://github.com/giampaolo/psutil/issues/38
.. _39: https://github.com/giampaolo/psutil/issues/39
.. _40: https://github.com/giampaolo/psutil/issues/40
.. _41: https://github.com/giampaolo/psutil/issues/41
.. _42: https://github.com/giampaolo/psutil/issues/42
.. _43: https://github.com/giampaolo/psutil/issues/43
.. _44: https://github.com/giampaolo/psutil/issues/44
.. _45: https://github.com/giampaolo/psutil/issues/45
.. _46: https://github.com/giampaolo/psutil/issues/46
.. _47: https://github.com/giampaolo/psutil/issues/47
.. _48: https://github.com/giampaolo/psutil/issues/48
.. _49: https://github.com/giampaolo/psutil/issues/49
.. _50: https://github.com/giampaolo/psutil/issues/50
.. _51: https://github.com/giampaolo/psutil/issues/51
.. _52: https://github.com/giampaolo/psutil/issues/52
.. _53: https://github.com/giampaolo/psutil/issues/53
.. _54: https://github.com/giampaolo/psutil/issues/54
.. _55: https://github.com/giampaolo/psutil/issues/55
.. _56: https://github.com/giampaolo/psutil/issues/56
.. _57: https://github.com/giampaolo/psutil/issues/57
.. _58: https://github.com/giampaolo/psutil/issues/58
.. _59: https://github.com/giampaolo/psutil/issues/59
.. _60: https://github.com/giampaolo/psutil/issues/60
.. _61: https://github.com/giampaolo/psutil/issues/61
.. _62: https://github.com/giampaolo/psutil/issues/62
.. _63: https://github.com/giampaolo/psutil/issues/63
.. _64: https://github.com/giampaolo/psutil/issues/64
.. _65: https://github.com/giampaolo/psutil/issues/65
.. _66: https://github.com/giampaolo/psutil/issues/66
.. _67: https://github.com/giampaolo/psutil/issues/67
.. _68: https://github.com/giampaolo/psutil/issues/68
.. _69: https://github.com/giampaolo/psutil/issues/69
.. _70: https://github.com/giampaolo/psutil/issues/70
.. _71: https://github.com/giampaolo/psutil/issues/71
.. _72: https://github.com/giampaolo/psutil/issues/72
.. _73: https://github.com/giampaolo/psutil/issues/73
.. _74: https://github.com/giampaolo/psutil/issues/74
.. _75: https://github.com/giampaolo/psutil/issues/75
.. _76: https://github.com/giampaolo/psutil/issues/76
.. _77: https://github.com/giampaolo/psutil/issues/77
.. _78: https://github.com/giampaolo/psutil/issues/78
.. _79: https://github.com/giampaolo/psutil/issues/79
.. _80: https://github.com/giampaolo/psutil/issues/80
.. _81: https://github.com/giampaolo/psutil/issues/81
.. _82: https://github.com/giampaolo/psutil/issues/82
.. _83: https://github.com/giampaolo/psutil/issues/83
.. _84: https://github.com/giampaolo/psutil/issues/84
.. _85: https://github.com/giampaolo/psutil/issues/85
.. _86: https://github.com/giampaolo/psutil/issues/86
.. _87: https://github.com/giampaolo/psutil/issues/87
.. _88: https://github.com/giampaolo/psutil/issues/88
.. _89: https://github.com/giampaolo/psutil/issues/89
.. _90: https://github.com/giampaolo/psutil/issues/90
.. _91: https://github.com/giampaolo/psutil/issues/91
.. _92: https://github.com/giampaolo/psutil/issues/92
.. _93: https://github.com/giampaolo/psutil/issues/93
.. _94: https://github.com/giampaolo/psutil/issues/94
.. _95: https://github.com/giampaolo/psutil/issues/95
.. _96: https://github.com/giampaolo/psutil/issues/96
.. _97: https://github.com/giampaolo/psutil/issues/97
.. _98: https://github.com/giampaolo/psutil/issues/98
.. _99: https://github.com/giampaolo/psutil/issues/99
.. _100: https://github.com/giampaolo/psutil/issues/100
.. _101: https://github.com/giampaolo/psutil/issues/101
.. _102: https://github.com/giampaolo/psutil/issues/102
.. _103: https://github.com/giampaolo/psutil/issues/103
.. _104: https://github.com/giampaolo/psutil/issues/104
.. _105: https://github.com/giampaolo/psutil/issues/105
.. _106: https://github.com/giampaolo/psutil/issues/106
.. _107: https://github.com/giampaolo/psutil/issues/107
.. _108: https://github.com/giampaolo/psutil/issues/108
.. _109: https://github.com/giampaolo/psutil/issues/109
.. _110: https://github.com/giampaolo/psutil/issues/110
.. _111: https://github.com/giampaolo/psutil/issues/111
.. _112: https://github.com/giampaolo/psutil/issues/112
.. _113: https://github.com/giampaolo/psutil/issues/113
.. _114: https://github.com/giampaolo/psutil/issues/114
.. _115: https://github.com/giampaolo/psutil/issues/115
.. _116: https://github.com/giampaolo/psutil/issues/116
.. _117: https://github.com/giampaolo/psutil/issues/117
.. _118: https://github.com/giampaolo/psutil/issues/118
.. _119: https://github.com/giampaolo/psutil/issues/119
.. _120: https://github.com/giampaolo/psutil/issues/120
.. _121: https://github.com/giampaolo/psutil/issues/121
.. _122: https://github.com/giampaolo/psutil/issues/122
.. _123: https://github.com/giampaolo/psutil/issues/123
.. _124: https://github.com/giampaolo/psutil/issues/124
.. _125: https://github.com/giampaolo/psutil/issues/125
.. _126: https://github.com/giampaolo/psutil/issues/126
.. _127: https://github.com/giampaolo/psutil/issues/127
.. _128: https://github.com/giampaolo/psutil/issues/128
.. _129: https://github.com/giampaolo/psutil/issues/129
.. _130: https://github.com/giampaolo/psutil/issues/130
.. _131: https://github.com/giampaolo/psutil/issues/131
.. _132: https://github.com/giampaolo/psutil/issues/132
.. _133: https://github.com/giampaolo/psutil/issues/133
.. _134: https://github.com/giampaolo/psutil/issues/134
.. _135: https://github.com/giampaolo/psutil/issues/135
.. _136: https://github.com/giampaolo/psutil/issues/136
.. _137: https://github.com/giampaolo/psutil/issues/137
.. _138: https://github.com/giampaolo/psutil/issues/138
.. _139: https://github.com/giampaolo/psutil/issues/139
.. _140: https://github.com/giampaolo/psutil/issues/140
.. _141: https://github.com/giampaolo/psutil/issues/141
.. _142: https://github.com/giampaolo/psutil/issues/142
.. _143: https://github.com/giampaolo/psutil/issues/143
.. _144: https://github.com/giampaolo/psutil/issues/144
.. _145: https://github.com/giampaolo/psutil/issues/145
.. _146: https://github.com/giampaolo/psutil/issues/146
.. _147: https://github.com/giampaolo/psutil/issues/147
.. _148: https://github.com/giampaolo/psutil/issues/148
.. _149: https://github.com/giampaolo/psutil/issues/149
.. _150: https://github.com/giampaolo/psutil/issues/150
.. _151: https://github.com/giampaolo/psutil/issues/151
.. _152: https://github.com/giampaolo/psutil/issues/152
.. _153: https://github.com/giampaolo/psutil/issues/153
.. _154: https://github.com/giampaolo/psutil/issues/154
.. _155: https://github.com/giampaolo/psutil/issues/155
.. _156: https://github.com/giampaolo/psutil/issues/156
.. _157: https://github.com/giampaolo/psutil/issues/157
.. _158: https://github.com/giampaolo/psutil/issues/158
.. _159: https://github.com/giampaolo/psutil/issues/159
.. _160: https://github.com/giampaolo/psutil/issues/160
.. _161: https://github.com/giampaolo/psutil/issues/161
.. _162: https://github.com/giampaolo/psutil/issues/162
.. _163: https://github.com/giampaolo/psutil/issues/163
.. _164: https://github.com/giampaolo/psutil/issues/164
.. _165: https://github.com/giampaolo/psutil/issues/165
.. _166: https://github.com/giampaolo/psutil/issues/166
.. _167: https://github.com/giampaolo/psutil/issues/167
.. _168: https://github.com/giampaolo/psutil/issues/168
.. _169: https://github.com/giampaolo/psutil/issues/169
.. _170: https://github.com/giampaolo/psutil/issues/170
.. _171: https://github.com/giampaolo/psutil/issues/171
.. _172: https://github.com/giampaolo/psutil/issues/172
.. _173: https://github.com/giampaolo/psutil/issues/173
.. _174: https://github.com/giampaolo/psutil/issues/174
.. _175: https://github.com/giampaolo/psutil/issues/175
.. _176: https://github.com/giampaolo/psutil/issues/176
.. _177: https://github.com/giampaolo/psutil/issues/177
.. _178: https://github.com/giampaolo/psutil/issues/178
.. _179: https://github.com/giampaolo/psutil/issues/179
.. _180: https://github.com/giampaolo/psutil/issues/180
.. _181: https://github.com/giampaolo/psutil/issues/181
.. _182: https://github.com/giampaolo/psutil/issues/182
.. _183: https://github.com/giampaolo/psutil/issues/183
.. _184: https://github.com/giampaolo/psutil/issues/184
.. _185: https://github.com/giampaolo/psutil/issues/185
.. _186: https://github.com/giampaolo/psutil/issues/186
.. _187: https://github.com/giampaolo/psutil/issues/187
.. _188: https://github.com/giampaolo/psutil/issues/188
.. _189: https://github.com/giampaolo/psutil/issues/189
.. _190: https://github.com/giampaolo/psutil/issues/190
.. _191: https://github.com/giampaolo/psutil/issues/191
.. _192: https://github.com/giampaolo/psutil/issues/192
.. _193: https://github.com/giampaolo/psutil/issues/193
.. _194: https://github.com/giampaolo/psutil/issues/194
.. _195: https://github.com/giampaolo/psutil/issues/195
.. _196: https://github.com/giampaolo/psutil/issues/196
.. _197: https://github.com/giampaolo/psutil/issues/197
.. _198: https://github.com/giampaolo/psutil/issues/198
.. _199: https://github.com/giampaolo/psutil/issues/199
.. _200: https://github.com/giampaolo/psutil/issues/200
.. _201: https://github.com/giampaolo/psutil/issues/201
.. _202: https://github.com/giampaolo/psutil/issues/202
.. _203: https://github.com/giampaolo/psutil/issues/203
.. _204: https://github.com/giampaolo/psutil/issues/204
.. _205: https://github.com/giampaolo/psutil/issues/205
.. _206: https://github.com/giampaolo/psutil/issues/206
.. _207: https://github.com/giampaolo/psutil/issues/207
.. _208: https://github.com/giampaolo/psutil/issues/208
.. _209: https://github.com/giampaolo/psutil/issues/209
.. _210: https://github.com/giampaolo/psutil/issues/210
.. _211: https://github.com/giampaolo/psutil/issues/211
.. _212: https://github.com/giampaolo/psutil/issues/212
.. _213: https://github.com/giampaolo/psutil/issues/213
.. _214: https://github.com/giampaolo/psutil/issues/214
.. _215: https://github.com/giampaolo/psutil/issues/215
.. _216: https://github.com/giampaolo/psutil/issues/216
.. _217: https://github.com/giampaolo/psutil/issues/217
.. _218: https://github.com/giampaolo/psutil/issues/218
.. _219: https://github.com/giampaolo/psutil/issues/219
.. _220: https://github.com/giampaolo/psutil/issues/220
.. _221: https://github.com/giampaolo/psutil/issues/221
.. _222: https://github.com/giampaolo/psutil/issues/222
.. _223: https://github.com/giampaolo/psutil/issues/223
.. _224: https://github.com/giampaolo/psutil/issues/224
.. _225: https://github.com/giampaolo/psutil/issues/225
.. _226: https://github.com/giampaolo/psutil/issues/226
.. _227: https://github.com/giampaolo/psutil/issues/227
.. _228: https://github.com/giampaolo/psutil/issues/228
.. _229: https://github.com/giampaolo/psutil/issues/229
.. _230: https://github.com/giampaolo/psutil/issues/230
.. _231: https://github.com/giampaolo/psutil/issues/231
.. _232: https://github.com/giampaolo/psutil/issues/232
.. _233: https://github.com/giampaolo/psutil/issues/233
.. _234: https://github.com/giampaolo/psutil/issues/234
.. _235: https://github.com/giampaolo/psutil/issues/235
.. _236: https://github.com/giampaolo/psutil/issues/236
.. _237: https://github.com/giampaolo/psutil/issues/237
.. _238: https://github.com/giampaolo/psutil/issues/238
.. _239: https://github.com/giampaolo/psutil/issues/239
.. _240: https://github.com/giampaolo/psutil/issues/240
.. _241: https://github.com/giampaolo/psutil/issues/241
.. _242: https://github.com/giampaolo/psutil/issues/242
.. _243: https://github.com/giampaolo/psutil/issues/243
.. _244: https://github.com/giampaolo/psutil/issues/244
.. _245: https://github.com/giampaolo/psutil/issues/245
.. _246: https://github.com/giampaolo/psutil/issues/246
.. _247: https://github.com/giampaolo/psutil/issues/247
.. _248: https://github.com/giampaolo/psutil/issues/248
.. _249: https://github.com/giampaolo/psutil/issues/249
.. _250: https://github.com/giampaolo/psutil/issues/250
.. _251: https://github.com/giampaolo/psutil/issues/251
.. _252: https://github.com/giampaolo/psutil/issues/252
.. _253: https://github.com/giampaolo/psutil/issues/253
.. _254: https://github.com/giampaolo/psutil/issues/254
.. _255: https://github.com/giampaolo/psutil/issues/255
.. _256: https://github.com/giampaolo/psutil/issues/256
.. _257: https://github.com/giampaolo/psutil/issues/257
.. _258: https://github.com/giampaolo/psutil/issues/258
.. _259: https://github.com/giampaolo/psutil/issues/259
.. _260: https://github.com/giampaolo/psutil/issues/260
.. _261: https://github.com/giampaolo/psutil/issues/261
.. _262: https://github.com/giampaolo/psutil/issues/262
.. _263: https://github.com/giampaolo/psutil/issues/263
.. _264: https://github.com/giampaolo/psutil/issues/264
.. _265: https://github.com/giampaolo/psutil/issues/265
.. _266: https://github.com/giampaolo/psutil/issues/266
.. _267: https://github.com/giampaolo/psutil/issues/267
.. _268: https://github.com/giampaolo/psutil/issues/268
.. _269: https://github.com/giampaolo/psutil/issues/269
.. _270: https://github.com/giampaolo/psutil/issues/270
.. _271: https://github.com/giampaolo/psutil/issues/271
.. _272: https://github.com/giampaolo/psutil/issues/272
.. _273: https://github.com/giampaolo/psutil/issues/273
.. _274: https://github.com/giampaolo/psutil/issues/274
.. _275: https://github.com/giampaolo/psutil/issues/275
.. _276: https://github.com/giampaolo/psutil/issues/276
.. _277: https://github.com/giampaolo/psutil/issues/277
.. _278: https://github.com/giampaolo/psutil/issues/278
.. _279: https://github.com/giampaolo/psutil/issues/279
.. _280: https://github.com/giampaolo/psutil/issues/280
.. _281: https://github.com/giampaolo/psutil/issues/281
.. _282: https://github.com/giampaolo/psutil/issues/282
.. _283: https://github.com/giampaolo/psutil/issues/283
.. _284: https://github.com/giampaolo/psutil/issues/284
.. _285: https://github.com/giampaolo/psutil/issues/285
.. _286: https://github.com/giampaolo/psutil/issues/286
.. _287: https://github.com/giampaolo/psutil/issues/287
.. _288: https://github.com/giampaolo/psutil/issues/288
.. _289: https://github.com/giampaolo/psutil/issues/289
.. _290: https://github.com/giampaolo/psutil/issues/290
.. _291: https://github.com/giampaolo/psutil/issues/291
.. _292: https://github.com/giampaolo/psutil/issues/292
.. _293: https://github.com/giampaolo/psutil/issues/293
.. _294: https://github.com/giampaolo/psutil/issues/294
.. _295: https://github.com/giampaolo/psutil/issues/295
.. _296: https://github.com/giampaolo/psutil/issues/296
.. _297: https://github.com/giampaolo/psutil/issues/297
.. _298: https://github.com/giampaolo/psutil/issues/298
.. _299: https://github.com/giampaolo/psutil/issues/299
.. _300: https://github.com/giampaolo/psutil/issues/300
.. _301: https://github.com/giampaolo/psutil/issues/301
.. _302: https://github.com/giampaolo/psutil/issues/302
.. _303: https://github.com/giampaolo/psutil/issues/303
.. _304: https://github.com/giampaolo/psutil/issues/304
.. _305: https://github.com/giampaolo/psutil/issues/305
.. _306: https://github.com/giampaolo/psutil/issues/306
.. _307: https://github.com/giampaolo/psutil/issues/307
.. _308: https://github.com/giampaolo/psutil/issues/308
.. _309: https://github.com/giampaolo/psutil/issues/309
.. _310: https://github.com/giampaolo/psutil/issues/310
.. _311: https://github.com/giampaolo/psutil/issues/311
.. _312: https://github.com/giampaolo/psutil/issues/312
.. _313: https://github.com/giampaolo/psutil/issues/313
.. _314: https://github.com/giampaolo/psutil/issues/314
.. _315: https://github.com/giampaolo/psutil/issues/315
.. _316: https://github.com/giampaolo/psutil/issues/316
.. _317: https://github.com/giampaolo/psutil/issues/317
.. _318: https://github.com/giampaolo/psutil/issues/318
.. _319: https://github.com/giampaolo/psutil/issues/319
.. _320: https://github.com/giampaolo/psutil/issues/320
.. _321: https://github.com/giampaolo/psutil/issues/321
.. _322: https://github.com/giampaolo/psutil/issues/322
.. _323: https://github.com/giampaolo/psutil/issues/323
.. _324: https://github.com/giampaolo/psutil/issues/324
.. _325: https://github.com/giampaolo/psutil/issues/325
.. _326: https://github.com/giampaolo/psutil/issues/326
.. _327: https://github.com/giampaolo/psutil/issues/327
.. _328: https://github.com/giampaolo/psutil/issues/328
.. _329: https://github.com/giampaolo/psutil/issues/329
.. _330: https://github.com/giampaolo/psutil/issues/330
.. _331: https://github.com/giampaolo/psutil/issues/331
.. _332: https://github.com/giampaolo/psutil/issues/332
.. _333: https://github.com/giampaolo/psutil/issues/333
.. _334: https://github.com/giampaolo/psutil/issues/334
.. _335: https://github.com/giampaolo/psutil/issues/335
.. _336: https://github.com/giampaolo/psutil/issues/336
.. _337: https://github.com/giampaolo/psutil/issues/337
.. _338: https://github.com/giampaolo/psutil/issues/338
.. _339: https://github.com/giampaolo/psutil/issues/339
.. _340: https://github.com/giampaolo/psutil/issues/340
.. _341: https://github.com/giampaolo/psutil/issues/341
.. _342: https://github.com/giampaolo/psutil/issues/342
.. _343: https://github.com/giampaolo/psutil/issues/343
.. _344: https://github.com/giampaolo/psutil/issues/344
.. _345: https://github.com/giampaolo/psutil/issues/345
.. _346: https://github.com/giampaolo/psutil/issues/346
.. _347: https://github.com/giampaolo/psutil/issues/347
.. _348: https://github.com/giampaolo/psutil/issues/348
.. _349: https://github.com/giampaolo/psutil/issues/349
.. _350: https://github.com/giampaolo/psutil/issues/350
.. _351: https://github.com/giampaolo/psutil/issues/351
.. _352: https://github.com/giampaolo/psutil/issues/352
.. _353: https://github.com/giampaolo/psutil/issues/353
.. _354: https://github.com/giampaolo/psutil/issues/354
.. _355: https://github.com/giampaolo/psutil/issues/355
.. _356: https://github.com/giampaolo/psutil/issues/356
.. _357: https://github.com/giampaolo/psutil/issues/357
.. _358: https://github.com/giampaolo/psutil/issues/358
.. _359: https://github.com/giampaolo/psutil/issues/359
.. _360: https://github.com/giampaolo/psutil/issues/360
.. _361: https://github.com/giampaolo/psutil/issues/361
.. _362: https://github.com/giampaolo/psutil/issues/362
.. _363: https://github.com/giampaolo/psutil/issues/363
.. _364: https://github.com/giampaolo/psutil/issues/364
.. _365: https://github.com/giampaolo/psutil/issues/365
.. _366: https://github.com/giampaolo/psutil/issues/366
.. _367: https://github.com/giampaolo/psutil/issues/367
.. _368: https://github.com/giampaolo/psutil/issues/368
.. _369: https://github.com/giampaolo/psutil/issues/369
.. _370: https://github.com/giampaolo/psutil/issues/370
.. _371: https://github.com/giampaolo/psutil/issues/371
.. _372: https://github.com/giampaolo/psutil/issues/372
.. _373: https://github.com/giampaolo/psutil/issues/373
.. _374: https://github.com/giampaolo/psutil/issues/374
.. _375: https://github.com/giampaolo/psutil/issues/375
.. _376: https://github.com/giampaolo/psutil/issues/376
.. _377: https://github.com/giampaolo/psutil/issues/377
.. _378: https://github.com/giampaolo/psutil/issues/378
.. _379: https://github.com/giampaolo/psutil/issues/379
.. _380: https://github.com/giampaolo/psutil/issues/380
.. _381: https://github.com/giampaolo/psutil/issues/381
.. _382: https://github.com/giampaolo/psutil/issues/382
.. _383: https://github.com/giampaolo/psutil/issues/383
.. _384: https://github.com/giampaolo/psutil/issues/384
.. _385: https://github.com/giampaolo/psutil/issues/385
.. _386: https://github.com/giampaolo/psutil/issues/386
.. _387: https://github.com/giampaolo/psutil/issues/387
.. _388: https://github.com/giampaolo/psutil/issues/388
.. _389: https://github.com/giampaolo/psutil/issues/389
.. _390: https://github.com/giampaolo/psutil/issues/390
.. _391: https://github.com/giampaolo/psutil/issues/391
.. _392: https://github.com/giampaolo/psutil/issues/392
.. _393: https://github.com/giampaolo/psutil/issues/393
.. _394: https://github.com/giampaolo/psutil/issues/394
.. _395: https://github.com/giampaolo/psutil/issues/395
.. _396: https://github.com/giampaolo/psutil/issues/396
.. _397: https://github.com/giampaolo/psutil/issues/397
.. _398: https://github.com/giampaolo/psutil/issues/398
.. _399: https://github.com/giampaolo/psutil/issues/399
.. _400: https://github.com/giampaolo/psutil/issues/400
.. _401: https://github.com/giampaolo/psutil/issues/401
.. _402: https://github.com/giampaolo/psutil/issues/402
.. _403: https://github.com/giampaolo/psutil/issues/403
.. _404: https://github.com/giampaolo/psutil/issues/404
.. _405: https://github.com/giampaolo/psutil/issues/405
.. _406: https://github.com/giampaolo/psutil/issues/406
.. _407: https://github.com/giampaolo/psutil/issues/407
.. _408: https://github.com/giampaolo/psutil/issues/408
.. _409: https://github.com/giampaolo/psutil/issues/409
.. _410: https://github.com/giampaolo/psutil/issues/410
.. _411: https://github.com/giampaolo/psutil/issues/411
.. _412: https://github.com/giampaolo/psutil/issues/412
.. _413: https://github.com/giampaolo/psutil/issues/413
.. _414: https://github.com/giampaolo/psutil/issues/414
.. _415: https://github.com/giampaolo/psutil/issues/415
.. _416: https://github.com/giampaolo/psutil/issues/416
.. _417: https://github.com/giampaolo/psutil/issues/417
.. _418: https://github.com/giampaolo/psutil/issues/418
.. _419: https://github.com/giampaolo/psutil/issues/419
.. _420: https://github.com/giampaolo/psutil/issues/420
.. _421: https://github.com/giampaolo/psutil/issues/421
.. _422: https://github.com/giampaolo/psutil/issues/422
.. _423: https://github.com/giampaolo/psutil/issues/423
.. _424: https://github.com/giampaolo/psutil/issues/424
.. _425: https://github.com/giampaolo/psutil/issues/425
.. _426: https://github.com/giampaolo/psutil/issues/426
.. _427: https://github.com/giampaolo/psutil/issues/427
.. _428: https://github.com/giampaolo/psutil/issues/428
.. _429: https://github.com/giampaolo/psutil/issues/429
.. _430: https://github.com/giampaolo/psutil/issues/430
.. _431: https://github.com/giampaolo/psutil/issues/431
.. _432: https://github.com/giampaolo/psutil/issues/432
.. _433: https://github.com/giampaolo/psutil/issues/433
.. _434: https://github.com/giampaolo/psutil/issues/434
.. _435: https://github.com/giampaolo/psutil/issues/435
.. _436: https://github.com/giampaolo/psutil/issues/436
.. _437: https://github.com/giampaolo/psutil/issues/437
.. _438: https://github.com/giampaolo/psutil/issues/438
.. _439: https://github.com/giampaolo/psutil/issues/439
.. _440: https://github.com/giampaolo/psutil/issues/440
.. _441: https://github.com/giampaolo/psutil/issues/441
.. _442: https://github.com/giampaolo/psutil/issues/442
.. _443: https://github.com/giampaolo/psutil/issues/443
.. _444: https://github.com/giampaolo/psutil/issues/444
.. _445: https://github.com/giampaolo/psutil/issues/445
.. _446: https://github.com/giampaolo/psutil/issues/446
.. _447: https://github.com/giampaolo/psutil/issues/447
.. _448: https://github.com/giampaolo/psutil/issues/448
.. _449: https://github.com/giampaolo/psutil/issues/449
.. _450: https://github.com/giampaolo/psutil/issues/450
.. _451: https://github.com/giampaolo/psutil/issues/451
.. _452: https://github.com/giampaolo/psutil/issues/452
.. _453: https://github.com/giampaolo/psutil/issues/453
.. _454: https://github.com/giampaolo/psutil/issues/454
.. _455: https://github.com/giampaolo/psutil/issues/455
.. _456: https://github.com/giampaolo/psutil/issues/456
.. _457: https://github.com/giampaolo/psutil/issues/457
.. _458: https://github.com/giampaolo/psutil/issues/458
.. _459: https://github.com/giampaolo/psutil/issues/459
.. _460: https://github.com/giampaolo/psutil/issues/460
.. _461: https://github.com/giampaolo/psutil/issues/461
.. _462: https://github.com/giampaolo/psutil/issues/462
.. _463: https://github.com/giampaolo/psutil/issues/463
.. _464: https://github.com/giampaolo/psutil/issues/464
.. _465: https://github.com/giampaolo/psutil/issues/465
.. _466: https://github.com/giampaolo/psutil/issues/466
.. _467: https://github.com/giampaolo/psutil/issues/467
.. _468: https://github.com/giampaolo/psutil/issues/468
.. _469: https://github.com/giampaolo/psutil/issues/469
.. _470: https://github.com/giampaolo/psutil/issues/470
.. _471: https://github.com/giampaolo/psutil/issues/471
.. _472: https://github.com/giampaolo/psutil/issues/472
.. _473: https://github.com/giampaolo/psutil/issues/473
.. _474: https://github.com/giampaolo/psutil/issues/474
.. _475: https://github.com/giampaolo/psutil/issues/475
.. _476: https://github.com/giampaolo/psutil/issues/476
.. _477: https://github.com/giampaolo/psutil/issues/477
.. _478: https://github.com/giampaolo/psutil/issues/478
.. _479: https://github.com/giampaolo/psutil/issues/479
.. _480: https://github.com/giampaolo/psutil/issues/480
.. _481: https://github.com/giampaolo/psutil/issues/481
.. _482: https://github.com/giampaolo/psutil/issues/482
.. _483: https://github.com/giampaolo/psutil/issues/483
.. _484: https://github.com/giampaolo/psutil/issues/484
.. _485: https://github.com/giampaolo/psutil/issues/485
.. _486: https://github.com/giampaolo/psutil/issues/486
.. _487: https://github.com/giampaolo/psutil/issues/487
.. _488: https://github.com/giampaolo/psutil/issues/488
.. _489: https://github.com/giampaolo/psutil/issues/489
.. _490: https://github.com/giampaolo/psutil/issues/490
.. _491: https://github.com/giampaolo/psutil/issues/491
.. _492: https://github.com/giampaolo/psutil/issues/492
.. _493: https://github.com/giampaolo/psutil/issues/493
.. _494: https://github.com/giampaolo/psutil/issues/494
.. _495: https://github.com/giampaolo/psutil/issues/495
.. _496: https://github.com/giampaolo/psutil/issues/496
.. _497: https://github.com/giampaolo/psutil/issues/497
.. _498: https://github.com/giampaolo/psutil/issues/498
.. _499: https://github.com/giampaolo/psutil/issues/499
.. _500: https://github.com/giampaolo/psutil/issues/500
.. _501: https://github.com/giampaolo/psutil/issues/501
.. _502: https://github.com/giampaolo/psutil/issues/502
.. _503: https://github.com/giampaolo/psutil/issues/503
.. _504: https://github.com/giampaolo/psutil/issues/504
.. _505: https://github.com/giampaolo/psutil/issues/505
.. _506: https://github.com/giampaolo/psutil/issues/506
.. _507: https://github.com/giampaolo/psutil/issues/507
.. _508: https://github.com/giampaolo/psutil/issues/508
.. _509: https://github.com/giampaolo/psutil/issues/509
.. _510: https://github.com/giampaolo/psutil/issues/510
.. _511: https://github.com/giampaolo/psutil/issues/511
.. _512: https://github.com/giampaolo/psutil/issues/512
.. _513: https://github.com/giampaolo/psutil/issues/513
.. _514: https://github.com/giampaolo/psutil/issues/514
.. _515: https://github.com/giampaolo/psutil/issues/515
.. _516: https://github.com/giampaolo/psutil/issues/516
.. _517: https://github.com/giampaolo/psutil/issues/517
.. _518: https://github.com/giampaolo/psutil/issues/518
.. _519: https://github.com/giampaolo/psutil/issues/519
.. _520: https://github.com/giampaolo/psutil/issues/520
.. _521: https://github.com/giampaolo/psutil/issues/521
.. _522: https://github.com/giampaolo/psutil/issues/522
.. _523: https://github.com/giampaolo/psutil/issues/523
.. _524: https://github.com/giampaolo/psutil/issues/524
.. _525: https://github.com/giampaolo/psutil/issues/525
.. _526: https://github.com/giampaolo/psutil/issues/526
.. _527: https://github.com/giampaolo/psutil/issues/527
.. _528: https://github.com/giampaolo/psutil/issues/528
.. _529: https://github.com/giampaolo/psutil/issues/529
.. _530: https://github.com/giampaolo/psutil/issues/530
.. _531: https://github.com/giampaolo/psutil/issues/531
.. _532: https://github.com/giampaolo/psutil/issues/532
.. _533: https://github.com/giampaolo/psutil/issues/533
.. _534: https://github.com/giampaolo/psutil/issues/534
.. _535: https://github.com/giampaolo/psutil/issues/535
.. _536: https://github.com/giampaolo/psutil/issues/536
.. _537: https://github.com/giampaolo/psutil/issues/537
.. _538: https://github.com/giampaolo/psutil/issues/538
.. _539: https://github.com/giampaolo/psutil/issues/539
.. _540: https://github.com/giampaolo/psutil/issues/540
.. _541: https://github.com/giampaolo/psutil/issues/541
.. _542: https://github.com/giampaolo/psutil/issues/542
.. _543: https://github.com/giampaolo/psutil/issues/543
.. _544: https://github.com/giampaolo/psutil/issues/544
.. _545: https://github.com/giampaolo/psutil/issues/545
.. _546: https://github.com/giampaolo/psutil/issues/546
.. _547: https://github.com/giampaolo/psutil/issues/547
.. _548: https://github.com/giampaolo/psutil/issues/548
.. _549: https://github.com/giampaolo/psutil/issues/549
.. _550: https://github.com/giampaolo/psutil/issues/550
.. _551: https://github.com/giampaolo/psutil/issues/551
.. _552: https://github.com/giampaolo/psutil/issues/552
.. _553: https://github.com/giampaolo/psutil/issues/553
.. _554: https://github.com/giampaolo/psutil/issues/554
.. _555: https://github.com/giampaolo/psutil/issues/555
.. _556: https://github.com/giampaolo/psutil/issues/556
.. _557: https://github.com/giampaolo/psutil/issues/557
.. _558: https://github.com/giampaolo/psutil/issues/558
.. _559: https://github.com/giampaolo/psutil/issues/559
.. _560: https://github.com/giampaolo/psutil/issues/560
.. _561: https://github.com/giampaolo/psutil/issues/561
.. _562: https://github.com/giampaolo/psutil/issues/562
.. _563: https://github.com/giampaolo/psutil/issues/563
.. _564: https://github.com/giampaolo/psutil/issues/564
.. _565: https://github.com/giampaolo/psutil/issues/565
.. _566: https://github.com/giampaolo/psutil/issues/566
.. _567: https://github.com/giampaolo/psutil/issues/567
.. _568: https://github.com/giampaolo/psutil/issues/568
.. _569: https://github.com/giampaolo/psutil/issues/569
.. _570: https://github.com/giampaolo/psutil/issues/570
.. _571: https://github.com/giampaolo/psutil/issues/571
.. _572: https://github.com/giampaolo/psutil/issues/572
.. _573: https://github.com/giampaolo/psutil/issues/573
.. _574: https://github.com/giampaolo/psutil/issues/574
.. _575: https://github.com/giampaolo/psutil/issues/575
.. _576: https://github.com/giampaolo/psutil/issues/576
.. _577: https://github.com/giampaolo/psutil/issues/577
.. _578: https://github.com/giampaolo/psutil/issues/578
.. _579: https://github.com/giampaolo/psutil/issues/579
.. _580: https://github.com/giampaolo/psutil/issues/580
.. _581: https://github.com/giampaolo/psutil/issues/581
.. _582: https://github.com/giampaolo/psutil/issues/582
.. _583: https://github.com/giampaolo/psutil/issues/583
.. _584: https://github.com/giampaolo/psutil/issues/584
.. _585: https://github.com/giampaolo/psutil/issues/585
.. _586: https://github.com/giampaolo/psutil/issues/586
.. _587: https://github.com/giampaolo/psutil/issues/587
.. _588: https://github.com/giampaolo/psutil/issues/588
.. _589: https://github.com/giampaolo/psutil/issues/589
.. _590: https://github.com/giampaolo/psutil/issues/590
.. _591: https://github.com/giampaolo/psutil/issues/591
.. _592: https://github.com/giampaolo/psutil/issues/592
.. _593: https://github.com/giampaolo/psutil/issues/593
.. _594: https://github.com/giampaolo/psutil/issues/594
.. _595: https://github.com/giampaolo/psutil/issues/595
.. _596: https://github.com/giampaolo/psutil/issues/596
.. _597: https://github.com/giampaolo/psutil/issues/597
.. _598: https://github.com/giampaolo/psutil/issues/598
.. _599: https://github.com/giampaolo/psutil/issues/599
.. _600: https://github.com/giampaolo/psutil/issues/600
.. _601: https://github.com/giampaolo/psutil/issues/601
.. _602: https://github.com/giampaolo/psutil/issues/602
.. _603: https://github.com/giampaolo/psutil/issues/603
.. _604: https://github.com/giampaolo/psutil/issues/604
.. _605: https://github.com/giampaolo/psutil/issues/605
.. _606: https://github.com/giampaolo/psutil/issues/606
.. _607: https://github.com/giampaolo/psutil/issues/607
.. _608: https://github.com/giampaolo/psutil/issues/608
.. _609: https://github.com/giampaolo/psutil/issues/609
.. _610: https://github.com/giampaolo/psutil/issues/610
.. _611: https://github.com/giampaolo/psutil/issues/611
.. _612: https://github.com/giampaolo/psutil/issues/612
.. _613: https://github.com/giampaolo/psutil/issues/613
.. _614: https://github.com/giampaolo/psutil/issues/614
.. _615: https://github.com/giampaolo/psutil/issues/615
.. _616: https://github.com/giampaolo/psutil/issues/616
.. _617: https://github.com/giampaolo/psutil/issues/617
.. _618: https://github.com/giampaolo/psutil/issues/618
.. _619: https://github.com/giampaolo/psutil/issues/619
.. _620: https://github.com/giampaolo/psutil/issues/620
.. _621: https://github.com/giampaolo/psutil/issues/621
.. _622: https://github.com/giampaolo/psutil/issues/622
.. _623: https://github.com/giampaolo/psutil/issues/623
.. _624: https://github.com/giampaolo/psutil/issues/624
.. _625: https://github.com/giampaolo/psutil/issues/625
.. _626: https://github.com/giampaolo/psutil/issues/626
.. _627: https://github.com/giampaolo/psutil/issues/627
.. _628: https://github.com/giampaolo/psutil/issues/628
.. _629: https://github.com/giampaolo/psutil/issues/629
.. _630: https://github.com/giampaolo/psutil/issues/630
.. _631: https://github.com/giampaolo/psutil/issues/631
.. _632: https://github.com/giampaolo/psutil/issues/632
.. _633: https://github.com/giampaolo/psutil/issues/633
.. _634: https://github.com/giampaolo/psutil/issues/634
.. _635: https://github.com/giampaolo/psutil/issues/635
.. _636: https://github.com/giampaolo/psutil/issues/636
.. _637: https://github.com/giampaolo/psutil/issues/637
.. _638: https://github.com/giampaolo/psutil/issues/638
.. _639: https://github.com/giampaolo/psutil/issues/639
.. _640: https://github.com/giampaolo/psutil/issues/640
.. _641: https://github.com/giampaolo/psutil/issues/641
.. _642: https://github.com/giampaolo/psutil/issues/642
.. _643: https://github.com/giampaolo/psutil/issues/643
.. _644: https://github.com/giampaolo/psutil/issues/644
.. _645: https://github.com/giampaolo/psutil/issues/645
.. _646: https://github.com/giampaolo/psutil/issues/646
.. _647: https://github.com/giampaolo/psutil/issues/647
.. _648: https://github.com/giampaolo/psutil/issues/648
.. _649: https://github.com/giampaolo/psutil/issues/649
.. _650: https://github.com/giampaolo/psutil/issues/650
.. _651: https://github.com/giampaolo/psutil/issues/651
.. _652: https://github.com/giampaolo/psutil/issues/652
.. _653: https://github.com/giampaolo/psutil/issues/653
.. _654: https://github.com/giampaolo/psutil/issues/654
.. _655: https://github.com/giampaolo/psutil/issues/655
.. _656: https://github.com/giampaolo/psutil/issues/656
.. _657: https://github.com/giampaolo/psutil/issues/657
.. _658: https://github.com/giampaolo/psutil/issues/658
.. _659: https://github.com/giampaolo/psutil/issues/659
.. _660: https://github.com/giampaolo/psutil/issues/660
.. _661: https://github.com/giampaolo/psutil/issues/661
.. _662: https://github.com/giampaolo/psutil/issues/662
.. _663: https://github.com/giampaolo/psutil/issues/663
.. _664: https://github.com/giampaolo/psutil/issues/664
.. _665: https://github.com/giampaolo/psutil/issues/665
.. _666: https://github.com/giampaolo/psutil/issues/666
.. _667: https://github.com/giampaolo/psutil/issues/667
.. _668: https://github.com/giampaolo/psutil/issues/668
.. _669: https://github.com/giampaolo/psutil/issues/669
.. _670: https://github.com/giampaolo/psutil/issues/670
.. _671: https://github.com/giampaolo/psutil/issues/671
.. _672: https://github.com/giampaolo/psutil/issues/672
.. _673: https://github.com/giampaolo/psutil/issues/673
.. _674: https://github.com/giampaolo/psutil/issues/674
.. _675: https://github.com/giampaolo/psutil/issues/675
.. _676: https://github.com/giampaolo/psutil/issues/676
.. _677: https://github.com/giampaolo/psutil/issues/677
.. _678: https://github.com/giampaolo/psutil/issues/678
.. _679: https://github.com/giampaolo/psutil/issues/679
.. _680: https://github.com/giampaolo/psutil/issues/680
.. _681: https://github.com/giampaolo/psutil/issues/681
.. _682: https://github.com/giampaolo/psutil/issues/682
.. _683: https://github.com/giampaolo/psutil/issues/683
.. _684: https://github.com/giampaolo/psutil/issues/684
.. _685: https://github.com/giampaolo/psutil/issues/685
.. _686: https://github.com/giampaolo/psutil/issues/686
.. _687: https://github.com/giampaolo/psutil/issues/687
.. _688: https://github.com/giampaolo/psutil/issues/688
.. _689: https://github.com/giampaolo/psutil/issues/689
.. _690: https://github.com/giampaolo/psutil/issues/690
.. _691: https://github.com/giampaolo/psutil/issues/691
.. _692: https://github.com/giampaolo/psutil/issues/692
.. _693: https://github.com/giampaolo/psutil/issues/693
.. _694: https://github.com/giampaolo/psutil/issues/694
.. _695: https://github.com/giampaolo/psutil/issues/695
.. _696: https://github.com/giampaolo/psutil/issues/696
.. _697: https://github.com/giampaolo/psutil/issues/697
.. _698: https://github.com/giampaolo/psutil/issues/698
.. _699: https://github.com/giampaolo/psutil/issues/699
.. _700: https://github.com/giampaolo/psutil/issues/700
.. _701: https://github.com/giampaolo/psutil/issues/701
.. _702: https://github.com/giampaolo/psutil/issues/702
.. _703: https://github.com/giampaolo/psutil/issues/703
.. _704: https://github.com/giampaolo/psutil/issues/704
.. _705: https://github.com/giampaolo/psutil/issues/705
.. _706: https://github.com/giampaolo/psutil/issues/706
.. _707: https://github.com/giampaolo/psutil/issues/707
.. _708: https://github.com/giampaolo/psutil/issues/708
.. _709: https://github.com/giampaolo/psutil/issues/709
.. _710: https://github.com/giampaolo/psutil/issues/710
.. _711: https://github.com/giampaolo/psutil/issues/711
.. _712: https://github.com/giampaolo/psutil/issues/712
.. _713: https://github.com/giampaolo/psutil/issues/713
.. _714: https://github.com/giampaolo/psutil/issues/714
.. _715: https://github.com/giampaolo/psutil/issues/715
.. _716: https://github.com/giampaolo/psutil/issues/716
.. _717: https://github.com/giampaolo/psutil/issues/717
.. _718: https://github.com/giampaolo/psutil/issues/718
.. _719: https://github.com/giampaolo/psutil/issues/719
.. _720: https://github.com/giampaolo/psutil/issues/720
.. _721: https://github.com/giampaolo/psutil/issues/721
.. _722: https://github.com/giampaolo/psutil/issues/722
.. _723: https://github.com/giampaolo/psutil/issues/723
.. _724: https://github.com/giampaolo/psutil/issues/724
.. _725: https://github.com/giampaolo/psutil/issues/725
.. _726: https://github.com/giampaolo/psutil/issues/726
.. _727: https://github.com/giampaolo/psutil/issues/727
.. _728: https://github.com/giampaolo/psutil/issues/728
.. _729: https://github.com/giampaolo/psutil/issues/729
.. _730: https://github.com/giampaolo/psutil/issues/730
.. _731: https://github.com/giampaolo/psutil/issues/731
.. _732: https://github.com/giampaolo/psutil/issues/732
.. _733: https://github.com/giampaolo/psutil/issues/733
.. _734: https://github.com/giampaolo/psutil/issues/734
.. _735: https://github.com/giampaolo/psutil/issues/735
.. _736: https://github.com/giampaolo/psutil/issues/736
.. _737: https://github.com/giampaolo/psutil/issues/737
.. _738: https://github.com/giampaolo/psutil/issues/738
.. _739: https://github.com/giampaolo/psutil/issues/739
.. _740: https://github.com/giampaolo/psutil/issues/740
.. _741: https://github.com/giampaolo/psutil/issues/741
.. _742: https://github.com/giampaolo/psutil/issues/742
.. _743: https://github.com/giampaolo/psutil/issues/743
.. _744: https://github.com/giampaolo/psutil/issues/744
.. _745: https://github.com/giampaolo/psutil/issues/745
.. _746: https://github.com/giampaolo/psutil/issues/746
.. _747: https://github.com/giampaolo/psutil/issues/747
.. _748: https://github.com/giampaolo/psutil/issues/748
.. _749: https://github.com/giampaolo/psutil/issues/749
.. _750: https://github.com/giampaolo/psutil/issues/750
.. _751: https://github.com/giampaolo/psutil/issues/751
.. _752: https://github.com/giampaolo/psutil/issues/752
.. _753: https://github.com/giampaolo/psutil/issues/753
.. _754: https://github.com/giampaolo/psutil/issues/754
.. _755: https://github.com/giampaolo/psutil/issues/755
.. _756: https://github.com/giampaolo/psutil/issues/756
.. _757: https://github.com/giampaolo/psutil/issues/757
.. _758: https://github.com/giampaolo/psutil/issues/758
.. _759: https://github.com/giampaolo/psutil/issues/759
.. _760: https://github.com/giampaolo/psutil/issues/760
.. _761: https://github.com/giampaolo/psutil/issues/761
.. _762: https://github.com/giampaolo/psutil/issues/762
.. _763: https://github.com/giampaolo/psutil/issues/763
.. _764: https://github.com/giampaolo/psutil/issues/764
.. _765: https://github.com/giampaolo/psutil/issues/765
.. _766: https://github.com/giampaolo/psutil/issues/766
.. _767: https://github.com/giampaolo/psutil/issues/767
.. _768: https://github.com/giampaolo/psutil/issues/768
.. _769: https://github.com/giampaolo/psutil/issues/769
.. _770: https://github.com/giampaolo/psutil/issues/770
.. _771: https://github.com/giampaolo/psutil/issues/771
.. _772: https://github.com/giampaolo/psutil/issues/772
.. _773: https://github.com/giampaolo/psutil/issues/773
.. _774: https://github.com/giampaolo/psutil/issues/774
.. _775: https://github.com/giampaolo/psutil/issues/775
.. _776: https://github.com/giampaolo/psutil/issues/776
.. _777: https://github.com/giampaolo/psutil/issues/777
.. _778: https://github.com/giampaolo/psutil/issues/778
.. _779: https://github.com/giampaolo/psutil/issues/779
.. _780: https://github.com/giampaolo/psutil/issues/780
.. _781: https://github.com/giampaolo/psutil/issues/781
.. _782: https://github.com/giampaolo/psutil/issues/782
.. _783: https://github.com/giampaolo/psutil/issues/783
.. _784: https://github.com/giampaolo/psutil/issues/784
.. _785: https://github.com/giampaolo/psutil/issues/785
.. _786: https://github.com/giampaolo/psutil/issues/786
.. _787: https://github.com/giampaolo/psutil/issues/787
.. _788: https://github.com/giampaolo/psutil/issues/788
.. _789: https://github.com/giampaolo/psutil/issues/789
.. _790: https://github.com/giampaolo/psutil/issues/790
.. _791: https://github.com/giampaolo/psutil/issues/791
.. _792: https://github.com/giampaolo/psutil/issues/792
.. _793: https://github.com/giampaolo/psutil/issues/793
.. _794: https://github.com/giampaolo/psutil/issues/794
.. _795: https://github.com/giampaolo/psutil/issues/795
.. _796: https://github.com/giampaolo/psutil/issues/796
.. _797: https://github.com/giampaolo/psutil/issues/797
.. _798: https://github.com/giampaolo/psutil/issues/798
.. _799: https://github.com/giampaolo/psutil/issues/799
.. _800: https://github.com/giampaolo/psutil/issues/800
.. _801: https://github.com/giampaolo/psutil/issues/801
.. _802: https://github.com/giampaolo/psutil/issues/802
.. _803: https://github.com/giampaolo/psutil/issues/803
.. _804: https://github.com/giampaolo/psutil/issues/804
.. _805: https://github.com/giampaolo/psutil/issues/805
.. _806: https://github.com/giampaolo/psutil/issues/806
.. _807: https://github.com/giampaolo/psutil/issues/807
.. _808: https://github.com/giampaolo/psutil/issues/808
.. _809: https://github.com/giampaolo/psutil/issues/809
.. _810: https://github.com/giampaolo/psutil/issues/810
.. _811: https://github.com/giampaolo/psutil/issues/811
.. _812: https://github.com/giampaolo/psutil/issues/812
.. _813: https://github.com/giampaolo/psutil/issues/813
.. _814: https://github.com/giampaolo/psutil/issues/814
.. _815: https://github.com/giampaolo/psutil/issues/815
.. _816: https://github.com/giampaolo/psutil/issues/816
.. _817: https://github.com/giampaolo/psutil/issues/817
.. _818: https://github.com/giampaolo/psutil/issues/818
.. _819: https://github.com/giampaolo/psutil/issues/819
.. _820: https://github.com/giampaolo/psutil/issues/820
.. _821: https://github.com/giampaolo/psutil/issues/821
.. _822: https://github.com/giampaolo/psutil/issues/822
.. _823: https://github.com/giampaolo/psutil/issues/823
.. _824: https://github.com/giampaolo/psutil/issues/824
.. _825: https://github.com/giampaolo/psutil/issues/825
.. _826: https://github.com/giampaolo/psutil/issues/826
.. _827: https://github.com/giampaolo/psutil/issues/827
.. _828: https://github.com/giampaolo/psutil/issues/828
.. _829: https://github.com/giampaolo/psutil/issues/829
.. _830: https://github.com/giampaolo/psutil/issues/830
.. _831: https://github.com/giampaolo/psutil/issues/831
.. _832: https://github.com/giampaolo/psutil/issues/832
.. _833: https://github.com/giampaolo/psutil/issues/833
.. _834: https://github.com/giampaolo/psutil/issues/834
.. _835: https://github.com/giampaolo/psutil/issues/835
.. _836: https://github.com/giampaolo/psutil/issues/836
.. _837: https://github.com/giampaolo/psutil/issues/837
.. _838: https://github.com/giampaolo/psutil/issues/838
.. _839: https://github.com/giampaolo/psutil/issues/839
.. _840: https://github.com/giampaolo/psutil/issues/840
.. _841: https://github.com/giampaolo/psutil/issues/841
.. _842: https://github.com/giampaolo/psutil/issues/842
.. _843: https://github.com/giampaolo/psutil/issues/843
.. _844: https://github.com/giampaolo/psutil/issues/844
.. _845: https://github.com/giampaolo/psutil/issues/845
.. _846: https://github.com/giampaolo/psutil/issues/846
.. _847: https://github.com/giampaolo/psutil/issues/847
.. _848: https://github.com/giampaolo/psutil/issues/848
.. _849: https://github.com/giampaolo/psutil/issues/849
.. _850: https://github.com/giampaolo/psutil/issues/850
.. _851: https://github.com/giampaolo/psutil/issues/851
.. _852: https://github.com/giampaolo/psutil/issues/852
.. _853: https://github.com/giampaolo/psutil/issues/853
.. _854: https://github.com/giampaolo/psutil/issues/854
.. _855: https://github.com/giampaolo/psutil/issues/855
.. _856: https://github.com/giampaolo/psutil/issues/856
.. _857: https://github.com/giampaolo/psutil/issues/857
.. _858: https://github.com/giampaolo/psutil/issues/858
.. _859: https://github.com/giampaolo/psutil/issues/859
.. _860: https://github.com/giampaolo/psutil/issues/860
.. _861: https://github.com/giampaolo/psutil/issues/861
.. _862: https://github.com/giampaolo/psutil/issues/862
.. _863: https://github.com/giampaolo/psutil/issues/863
.. _864: https://github.com/giampaolo/psutil/issues/864
.. _865: https://github.com/giampaolo/psutil/issues/865
.. _866: https://github.com/giampaolo/psutil/issues/866
.. _867: https://github.com/giampaolo/psutil/issues/867
.. _868: https://github.com/giampaolo/psutil/issues/868
.. _869: https://github.com/giampaolo/psutil/issues/869
.. _870: https://github.com/giampaolo/psutil/issues/870
.. _871: https://github.com/giampaolo/psutil/issues/871
.. _872: https://github.com/giampaolo/psutil/issues/872
.. _873: https://github.com/giampaolo/psutil/issues/873
.. _874: https://github.com/giampaolo/psutil/issues/874
.. _875: https://github.com/giampaolo/psutil/issues/875
.. _876: https://github.com/giampaolo/psutil/issues/876
.. _877: https://github.com/giampaolo/psutil/issues/877
.. _878: https://github.com/giampaolo/psutil/issues/878
.. _879: https://github.com/giampaolo/psutil/issues/879
.. _880: https://github.com/giampaolo/psutil/issues/880
.. _881: https://github.com/giampaolo/psutil/issues/881
.. _882: https://github.com/giampaolo/psutil/issues/882
.. _883: https://github.com/giampaolo/psutil/issues/883
.. _884: https://github.com/giampaolo/psutil/issues/884
.. _885: https://github.com/giampaolo/psutil/issues/885
.. _886: https://github.com/giampaolo/psutil/issues/886
.. _887: https://github.com/giampaolo/psutil/issues/887
.. _888: https://github.com/giampaolo/psutil/issues/888
.. _889: https://github.com/giampaolo/psutil/issues/889
.. _890: https://github.com/giampaolo/psutil/issues/890
.. _891: https://github.com/giampaolo/psutil/issues/891
.. _892: https://github.com/giampaolo/psutil/issues/892
.. _893: https://github.com/giampaolo/psutil/issues/893
.. _894: https://github.com/giampaolo/psutil/issues/894
.. _895: https://github.com/giampaolo/psutil/issues/895
.. _896: https://github.com/giampaolo/psutil/issues/896
.. _897: https://github.com/giampaolo/psutil/issues/897
.. _898: https://github.com/giampaolo/psutil/issues/898
.. _899: https://github.com/giampaolo/psutil/issues/899
.. _900: https://github.com/giampaolo/psutil/issues/900
.. _901: https://github.com/giampaolo/psutil/issues/901
.. _902: https://github.com/giampaolo/psutil/issues/902
.. _903: https://github.com/giampaolo/psutil/issues/903
.. _904: https://github.com/giampaolo/psutil/issues/904
.. _905: https://github.com/giampaolo/psutil/issues/905
.. _906: https://github.com/giampaolo/psutil/issues/906
.. _907: https://github.com/giampaolo/psutil/issues/907
.. _908: https://github.com/giampaolo/psutil/issues/908
.. _909: https://github.com/giampaolo/psutil/issues/909
.. _910: https://github.com/giampaolo/psutil/issues/910
.. _911: https://github.com/giampaolo/psutil/issues/911
.. _912: https://github.com/giampaolo/psutil/issues/912
.. _913: https://github.com/giampaolo/psutil/issues/913
.. _914: https://github.com/giampaolo/psutil/issues/914
.. _915: https://github.com/giampaolo/psutil/issues/915
.. _916: https://github.com/giampaolo/psutil/issues/916
.. _917: https://github.com/giampaolo/psutil/issues/917
.. _918: https://github.com/giampaolo/psutil/issues/918
.. _919: https://github.com/giampaolo/psutil/issues/919
.. _920: https://github.com/giampaolo/psutil/issues/920
.. _921: https://github.com/giampaolo/psutil/issues/921
.. _922: https://github.com/giampaolo/psutil/issues/922
.. _923: https://github.com/giampaolo/psutil/issues/923
.. _924: https://github.com/giampaolo/psutil/issues/924
.. _925: https://github.com/giampaolo/psutil/issues/925
.. _926: https://github.com/giampaolo/psutil/issues/926
.. _927: https://github.com/giampaolo/psutil/issues/927
.. _928: https://github.com/giampaolo/psutil/issues/928
.. _929: https://github.com/giampaolo/psutil/issues/929
.. _930: https://github.com/giampaolo/psutil/issues/930
.. _931: https://github.com/giampaolo/psutil/issues/931
.. _932: https://github.com/giampaolo/psutil/issues/932
.. _933: https://github.com/giampaolo/psutil/issues/933
.. _934: https://github.com/giampaolo/psutil/issues/934
.. _935: https://github.com/giampaolo/psutil/issues/935
.. _936: https://github.com/giampaolo/psutil/issues/936
.. _937: https://github.com/giampaolo/psutil/issues/937
.. _938: https://github.com/giampaolo/psutil/issues/938
.. _939: https://github.com/giampaolo/psutil/issues/939
.. _940: https://github.com/giampaolo/psutil/issues/940
.. _941: https://github.com/giampaolo/psutil/issues/941
.. _942: https://github.com/giampaolo/psutil/issues/942
.. _943: https://github.com/giampaolo/psutil/issues/943
.. _944: https://github.com/giampaolo/psutil/issues/944
.. _945: https://github.com/giampaolo/psutil/issues/945
.. _946: https://github.com/giampaolo/psutil/issues/946
.. _947: https://github.com/giampaolo/psutil/issues/947
.. _948: https://github.com/giampaolo/psutil/issues/948
.. _949: https://github.com/giampaolo/psutil/issues/949
.. _950: https://github.com/giampaolo/psutil/issues/950
.. _951: https://github.com/giampaolo/psutil/issues/951
.. _952: https://github.com/giampaolo/psutil/issues/952
.. _953: https://github.com/giampaolo/psutil/issues/953
.. _954: https://github.com/giampaolo/psutil/issues/954
.. _955: https://github.com/giampaolo/psutil/issues/955
.. _956: https://github.com/giampaolo/psutil/issues/956
.. _957: https://github.com/giampaolo/psutil/issues/957
.. _958: https://github.com/giampaolo/psutil/issues/958
.. _959: https://github.com/giampaolo/psutil/issues/959
.. _960: https://github.com/giampaolo/psutil/issues/960
.. _961: https://github.com/giampaolo/psutil/issues/961
.. _962: https://github.com/giampaolo/psutil/issues/962
.. _963: https://github.com/giampaolo/psutil/issues/963
.. _964: https://github.com/giampaolo/psutil/issues/964
.. _965: https://github.com/giampaolo/psutil/issues/965
.. _966: https://github.com/giampaolo/psutil/issues/966
.. _967: https://github.com/giampaolo/psutil/issues/967
.. _968: https://github.com/giampaolo/psutil/issues/968
.. _969: https://github.com/giampaolo/psutil/issues/969
.. _970: https://github.com/giampaolo/psutil/issues/970
.. _971: https://github.com/giampaolo/psutil/issues/971
.. _972: https://github.com/giampaolo/psutil/issues/972
.. _973: https://github.com/giampaolo/psutil/issues/973
.. _974: https://github.com/giampaolo/psutil/issues/974
.. _975: https://github.com/giampaolo/psutil/issues/975
.. _976: https://github.com/giampaolo/psutil/issues/976
.. _977: https://github.com/giampaolo/psutil/issues/977
.. _978: https://github.com/giampaolo/psutil/issues/978
.. _979: https://github.com/giampaolo/psutil/issues/979
.. _980: https://github.com/giampaolo/psutil/issues/980
.. _981: https://github.com/giampaolo/psutil/issues/981
.. _982: https://github.com/giampaolo/psutil/issues/982
.. _983: https://github.com/giampaolo/psutil/issues/983
.. _984: https://github.com/giampaolo/psutil/issues/984
.. _985: https://github.com/giampaolo/psutil/issues/985
.. _986: https://github.com/giampaolo/psutil/issues/986
.. _987: https://github.com/giampaolo/psutil/issues/987
.. _988: https://github.com/giampaolo/psutil/issues/988
.. _989: https://github.com/giampaolo/psutil/issues/989
.. _990: https://github.com/giampaolo/psutil/issues/990
.. _991: https://github.com/giampaolo/psutil/issues/991
.. _992: https://github.com/giampaolo/psutil/issues/992
.. _993: https://github.com/giampaolo/psutil/issues/993
.. _994: https://github.com/giampaolo/psutil/issues/994
.. _995: https://github.com/giampaolo/psutil/issues/995
.. _996: https://github.com/giampaolo/psutil/issues/996
.. _997: https://github.com/giampaolo/psutil/issues/997
.. _998: https://github.com/giampaolo/psutil/issues/998
.. _999: https://github.com/giampaolo/psutil/issues/999
.. _1000: https://github.com/giampaolo/psutil/issues/1000
.. _1001: https://github.com/giampaolo/psutil/issues/1001
.. _1002: https://github.com/giampaolo/psutil/issues/1002
.. _1003: https://github.com/giampaolo/psutil/issues/1003
.. _1004: https://github.com/giampaolo/psutil/issues/1004
.. _1005: https://github.com/giampaolo/psutil/issues/1005
.. _1006: https://github.com/giampaolo/psutil/issues/1006
.. _1007: https://github.com/giampaolo/psutil/issues/1007
.. _1008: https://github.com/giampaolo/psutil/issues/1008
.. _1009: https://github.com/giampaolo/psutil/issues/1009
.. _1010: https://github.com/giampaolo/psutil/issues/1010
.. _1011: https://github.com/giampaolo/psutil/issues/1011
.. _1012: https://github.com/giampaolo/psutil/issues/1012
.. _1013: https://github.com/giampaolo/psutil/issues/1013
.. _1014: https://github.com/giampaolo/psutil/issues/1014
.. _1015: https://github.com/giampaolo/psutil/issues/1015
.. _1016: https://github.com/giampaolo/psutil/issues/1016
.. _1017: https://github.com/giampaolo/psutil/issues/1017
.. _1018: https://github.com/giampaolo/psutil/issues/1018
.. _1019: https://github.com/giampaolo/psutil/issues/1019
.. _1020: https://github.com/giampaolo/psutil/issues/1020
.. _1021: https://github.com/giampaolo/psutil/issues/1021
.. _1022: https://github.com/giampaolo/psutil/issues/1022
.. _1023: https://github.com/giampaolo/psutil/issues/1023
.. _1024: https://github.com/giampaolo/psutil/issues/1024
.. _1025: https://github.com/giampaolo/psutil/issues/1025
.. _1026: https://github.com/giampaolo/psutil/issues/1026
.. _1027: https://github.com/giampaolo/psutil/issues/1027
.. _1028: https://github.com/giampaolo/psutil/issues/1028
.. _1029: https://github.com/giampaolo/psutil/issues/1029
.. _1030: https://github.com/giampaolo/psutil/issues/1030
.. _1031: https://github.com/giampaolo/psutil/issues/1031
.. _1032: https://github.com/giampaolo/psutil/issues/1032
.. _1033: https://github.com/giampaolo/psutil/issues/1033
.. _1034: https://github.com/giampaolo/psutil/issues/1034
.. _1035: https://github.com/giampaolo/psutil/issues/1035
.. _1036: https://github.com/giampaolo/psutil/issues/1036
.. _1037: https://github.com/giampaolo/psutil/issues/1037
.. _1038: https://github.com/giampaolo/psutil/issues/1038
.. _1039: https://github.com/giampaolo/psutil/issues/1039
.. _1040: https://github.com/giampaolo/psutil/issues/1040
.. _1041: https://github.com/giampaolo/psutil/issues/1041
.. _1042: https://github.com/giampaolo/psutil/issues/1042
.. _1043: https://github.com/giampaolo/psutil/issues/1043
.. _1044: https://github.com/giampaolo/psutil/issues/1044
.. _1045: https://github.com/giampaolo/psutil/issues/1045
.. _1046: https://github.com/giampaolo/psutil/issues/1046
.. _1047: https://github.com/giampaolo/psutil/issues/1047
.. _1048: https://github.com/giampaolo/psutil/issues/1048
.. _1049: https://github.com/giampaolo/psutil/issues/1049
.. _1050: https://github.com/giampaolo/psutil/issues/1050
.. _1051: https://github.com/giampaolo/psutil/issues/1051
.. _1052: https://github.com/giampaolo/psutil/issues/1052
.. _1053: https://github.com/giampaolo/psutil/issues/1053
.. _1054: https://github.com/giampaolo/psutil/issues/1054
.. _1055: https://github.com/giampaolo/psutil/issues/1055
.. _1056: https://github.com/giampaolo/psutil/issues/1056
.. _1057: https://github.com/giampaolo/psutil/issues/1057
.. _1058: https://github.com/giampaolo/psutil/issues/1058
.. _1059: https://github.com/giampaolo/psutil/issues/1059
.. _1060: https://github.com/giampaolo/psutil/issues/1060
.. _1061: https://github.com/giampaolo/psutil/issues/1061
.. _1062: https://github.com/giampaolo/psutil/issues/1062
.. _1063: https://github.com/giampaolo/psutil/issues/1063
.. _1064: https://github.com/giampaolo/psutil/issues/1064
.. _1065: https://github.com/giampaolo/psutil/issues/1065
.. _1066: https://github.com/giampaolo/psutil/issues/1066
.. _1067: https://github.com/giampaolo/psutil/issues/1067
.. _1068: https://github.com/giampaolo/psutil/issues/1068
.. _1069: https://github.com/giampaolo/psutil/issues/1069
.. _1070: https://github.com/giampaolo/psutil/issues/1070
.. _1071: https://github.com/giampaolo/psutil/issues/1071
.. _1072: https://github.com/giampaolo/psutil/issues/1072
.. _1073: https://github.com/giampaolo/psutil/issues/1073
.. _1074: https://github.com/giampaolo/psutil/issues/1074
.. _1075: https://github.com/giampaolo/psutil/issues/1075
.. _1076: https://github.com/giampaolo/psutil/issues/1076
.. _1077: https://github.com/giampaolo/psutil/issues/1077
.. _1078: https://github.com/giampaolo/psutil/issues/1078
.. _1079: https://github.com/giampaolo/psutil/issues/1079
.. _1080: https://github.com/giampaolo/psutil/issues/1080
.. _1081: https://github.com/giampaolo/psutil/issues/1081
.. _1082: https://github.com/giampaolo/psutil/issues/1082
.. _1083: https://github.com/giampaolo/psutil/issues/1083
.. _1084: https://github.com/giampaolo/psutil/issues/1084
.. _1085: https://github.com/giampaolo/psutil/issues/1085
.. _1086: https://github.com/giampaolo/psutil/issues/1086
.. _1087: https://github.com/giampaolo/psutil/issues/1087
.. _1088: https://github.com/giampaolo/psutil/issues/1088
.. _1089: https://github.com/giampaolo/psutil/issues/1089
.. _1090: https://github.com/giampaolo/psutil/issues/1090
.. _1091: https://github.com/giampaolo/psutil/issues/1091
.. _1092: https://github.com/giampaolo/psutil/issues/1092
.. _1093: https://github.com/giampaolo/psutil/issues/1093
.. _1094: https://github.com/giampaolo/psutil/issues/1094
.. _1095: https://github.com/giampaolo/psutil/issues/1095
.. _1096: https://github.com/giampaolo/psutil/issues/1096
.. _1097: https://github.com/giampaolo/psutil/issues/1097
.. _1098: https://github.com/giampaolo/psutil/issues/1098
.. _1099: https://github.com/giampaolo/psutil/issues/1099
.. _1100: https://github.com/giampaolo/psutil/issues/1100
.. _1101: https://github.com/giampaolo/psutil/issues/1101
.. _1102: https://github.com/giampaolo/psutil/issues/1102
.. _1103: https://github.com/giampaolo/psutil/issues/1103
.. _1104: https://github.com/giampaolo/psutil/issues/1104
.. _1105: https://github.com/giampaolo/psutil/issues/1105
.. _1106: https://github.com/giampaolo/psutil/issues/1106
.. _1107: https://github.com/giampaolo/psutil/issues/1107
.. _1108: https://github.com/giampaolo/psutil/issues/1108
.. _1109: https://github.com/giampaolo/psutil/issues/1109
.. _1110: https://github.com/giampaolo/psutil/issues/1110
.. _1111: https://github.com/giampaolo/psutil/issues/1111
.. _1112: https://github.com/giampaolo/psutil/issues/1112
.. _1113: https://github.com/giampaolo/psutil/issues/1113
.. _1114: https://github.com/giampaolo/psutil/issues/1114
.. _1115: https://github.com/giampaolo/psutil/issues/1115
.. _1116: https://github.com/giampaolo/psutil/issues/1116
.. _1117: https://github.com/giampaolo/psutil/issues/1117
.. _1118: https://github.com/giampaolo/psutil/issues/1118
.. _1119: https://github.com/giampaolo/psutil/issues/1119
.. _1120: https://github.com/giampaolo/psutil/issues/1120
.. _1121: https://github.com/giampaolo/psutil/issues/1121
.. _1122: https://github.com/giampaolo/psutil/issues/1122
.. _1123: https://github.com/giampaolo/psutil/issues/1123
.. _1124: https://github.com/giampaolo/psutil/issues/1124
.. _1125: https://github.com/giampaolo/psutil/issues/1125
.. _1126: https://github.com/giampaolo/psutil/issues/1126
.. _1127: https://github.com/giampaolo/psutil/issues/1127
.. _1128: https://github.com/giampaolo/psutil/issues/1128
.. _1129: https://github.com/giampaolo/psutil/issues/1129
.. _1130: https://github.com/giampaolo/psutil/issues/1130
.. _1131: https://github.com/giampaolo/psutil/issues/1131
.. _1132: https://github.com/giampaolo/psutil/issues/1132
.. _1133: https://github.com/giampaolo/psutil/issues/1133
.. _1134: https://github.com/giampaolo/psutil/issues/1134
.. _1135: https://github.com/giampaolo/psutil/issues/1135
.. _1136: https://github.com/giampaolo/psutil/issues/1136
.. _1137: https://github.com/giampaolo/psutil/issues/1137
.. _1138: https://github.com/giampaolo/psutil/issues/1138
.. _1139: https://github.com/giampaolo/psutil/issues/1139
.. _1140: https://github.com/giampaolo/psutil/issues/1140
.. _1141: https://github.com/giampaolo/psutil/issues/1141
.. _1142: https://github.com/giampaolo/psutil/issues/1142
.. _1143: https://github.com/giampaolo/psutil/issues/1143
.. _1144: https://github.com/giampaolo/psutil/issues/1144
.. _1145: https://github.com/giampaolo/psutil/issues/1145
.. _1146: https://github.com/giampaolo/psutil/issues/1146
.. _1147: https://github.com/giampaolo/psutil/issues/1147
.. _1148: https://github.com/giampaolo/psutil/issues/1148
.. _1149: https://github.com/giampaolo/psutil/issues/1149
.. _1150: https://github.com/giampaolo/psutil/issues/1150
.. _1151: https://github.com/giampaolo/psutil/issues/1151
.. _1152: https://github.com/giampaolo/psutil/issues/1152
.. _1153: https://github.com/giampaolo/psutil/issues/1153
.. _1154: https://github.com/giampaolo/psutil/issues/1154
.. _1155: https://github.com/giampaolo/psutil/issues/1155
.. _1156: https://github.com/giampaolo/psutil/issues/1156
.. _1157: https://github.com/giampaolo/psutil/issues/1157
.. _1158: https://github.com/giampaolo/psutil/issues/1158
.. _1159: https://github.com/giampaolo/psutil/issues/1159
.. _1160: https://github.com/giampaolo/psutil/issues/1160
.. _1161: https://github.com/giampaolo/psutil/issues/1161
.. _1162: https://github.com/giampaolo/psutil/issues/1162
.. _1163: https://github.com/giampaolo/psutil/issues/1163
.. _1164: https://github.com/giampaolo/psutil/issues/1164
.. _1165: https://github.com/giampaolo/psutil/issues/1165
.. _1166: https://github.com/giampaolo/psutil/issues/1166
.. _1167: https://github.com/giampaolo/psutil/issues/1167
.. _1168: https://github.com/giampaolo/psutil/issues/1168
.. _1169: https://github.com/giampaolo/psutil/issues/1169
.. _1170: https://github.com/giampaolo/psutil/issues/1170
.. _1171: https://github.com/giampaolo/psutil/issues/1171
.. _1172: https://github.com/giampaolo/psutil/issues/1172
.. _1173: https://github.com/giampaolo/psutil/issues/1173
.. _1174: https://github.com/giampaolo/psutil/issues/1174
.. _1175: https://github.com/giampaolo/psutil/issues/1175
.. _1176: https://github.com/giampaolo/psutil/issues/1176
.. _1177: https://github.com/giampaolo/psutil/issues/1177
.. _1178: https://github.com/giampaolo/psutil/issues/1178
.. _1179: https://github.com/giampaolo/psutil/issues/1179
.. _1180: https://github.com/giampaolo/psutil/issues/1180
.. _1181: https://github.com/giampaolo/psutil/issues/1181
.. _1182: https://github.com/giampaolo/psutil/issues/1182
.. _1183: https://github.com/giampaolo/psutil/issues/1183
.. _1184: https://github.com/giampaolo/psutil/issues/1184
.. _1185: https://github.com/giampaolo/psutil/issues/1185
.. _1186: https://github.com/giampaolo/psutil/issues/1186
.. _1187: https://github.com/giampaolo/psutil/issues/1187
.. _1188: https://github.com/giampaolo/psutil/issues/1188
.. _1189: https://github.com/giampaolo/psutil/issues/1189
.. _1190: https://github.com/giampaolo/psutil/issues/1190
.. _1191: https://github.com/giampaolo/psutil/issues/1191
.. _1192: https://github.com/giampaolo/psutil/issues/1192
.. _1193: https://github.com/giampaolo/psutil/issues/1193
.. _1194: https://github.com/giampaolo/psutil/issues/1194
.. _1195: https://github.com/giampaolo/psutil/issues/1195
.. _1196: https://github.com/giampaolo/psutil/issues/1196
.. _1197: https://github.com/giampaolo/psutil/issues/1197
.. _1198: https://github.com/giampaolo/psutil/issues/1198
.. _1199: https://github.com/giampaolo/psutil/issues/1199
.. _1200: https://github.com/giampaolo/psutil/issues/1200
.. _1201: https://github.com/giampaolo/psutil/issues/1201
.. _1202: https://github.com/giampaolo/psutil/issues/1202
.. _1203: https://github.com/giampaolo/psutil/issues/1203
.. _1204: https://github.com/giampaolo/psutil/issues/1204
.. _1205: https://github.com/giampaolo/psutil/issues/1205
.. _1206: https://github.com/giampaolo/psutil/issues/1206
.. _1207: https://github.com/giampaolo/psutil/issues/1207
.. _1208: https://github.com/giampaolo/psutil/issues/1208
.. _1209: https://github.com/giampaolo/psutil/issues/1209
.. _1210: https://github.com/giampaolo/psutil/issues/1210
.. _1211: https://github.com/giampaolo/psutil/issues/1211
.. _1212: https://github.com/giampaolo/psutil/issues/1212
.. _1213: https://github.com/giampaolo/psutil/issues/1213
.. _1214: https://github.com/giampaolo/psutil/issues/1214
.. _1215: https://github.com/giampaolo/psutil/issues/1215
.. _1216: https://github.com/giampaolo/psutil/issues/1216
.. _1217: https://github.com/giampaolo/psutil/issues/1217
.. _1218: https://github.com/giampaolo/psutil/issues/1218
.. _1219: https://github.com/giampaolo/psutil/issues/1219
.. _1220: https://github.com/giampaolo/psutil/issues/1220
.. _1221: https://github.com/giampaolo/psutil/issues/1221
.. _1222: https://github.com/giampaolo/psutil/issues/1222
.. _1223: https://github.com/giampaolo/psutil/issues/1223
.. _1224: https://github.com/giampaolo/psutil/issues/1224
.. _1225: https://github.com/giampaolo/psutil/issues/1225
.. _1226: https://github.com/giampaolo/psutil/issues/1226
.. _1227: https://github.com/giampaolo/psutil/issues/1227
.. _1228: https://github.com/giampaolo/psutil/issues/1228
.. _1229: https://github.com/giampaolo/psutil/issues/1229
.. _1230: https://github.com/giampaolo/psutil/issues/1230
.. _1231: https://github.com/giampaolo/psutil/issues/1231
.. _1232: https://github.com/giampaolo/psutil/issues/1232
.. _1233: https://github.com/giampaolo/psutil/issues/1233
.. _1234: https://github.com/giampaolo/psutil/issues/1234
.. _1235: https://github.com/giampaolo/psutil/issues/1235
.. _1236: https://github.com/giampaolo/psutil/issues/1236
.. _1237: https://github.com/giampaolo/psutil/issues/1237
.. _1238: https://github.com/giampaolo/psutil/issues/1238
.. _1239: https://github.com/giampaolo/psutil/issues/1239
.. _1240: https://github.com/giampaolo/psutil/issues/1240
.. _1241: https://github.com/giampaolo/psutil/issues/1241
.. _1242: https://github.com/giampaolo/psutil/issues/1242
.. _1243: https://github.com/giampaolo/psutil/issues/1243
.. _1244: https://github.com/giampaolo/psutil/issues/1244
.. _1245: https://github.com/giampaolo/psutil/issues/1245
.. _1246: https://github.com/giampaolo/psutil/issues/1246
.. _1247: https://github.com/giampaolo/psutil/issues/1247
.. _1248: https://github.com/giampaolo/psutil/issues/1248
.. _1249: https://github.com/giampaolo/psutil/issues/1249
.. _1250: https://github.com/giampaolo/psutil/issues/1250
.. _1251: https://github.com/giampaolo/psutil/issues/1251
.. _1252: https://github.com/giampaolo/psutil/issues/1252
.. _1253: https://github.com/giampaolo/psutil/issues/1253
.. _1254: https://github.com/giampaolo/psutil/issues/1254
.. _1255: https://github.com/giampaolo/psutil/issues/1255
.. _1256: https://github.com/giampaolo/psutil/issues/1256
.. _1257: https://github.com/giampaolo/psutil/issues/1257
.. _1258: https://github.com/giampaolo/psutil/issues/1258
.. _1259: https://github.com/giampaolo/psutil/issues/1259
.. _1260: https://github.com/giampaolo/psutil/issues/1260
.. _1261: https://github.com/giampaolo/psutil/issues/1261
.. _1262: https://github.com/giampaolo/psutil/issues/1262
.. _1263: https://github.com/giampaolo/psutil/issues/1263
.. _1264: https://github.com/giampaolo/psutil/issues/1264
.. _1265: https://github.com/giampaolo/psutil/issues/1265
.. _1266: https://github.com/giampaolo/psutil/issues/1266
.. _1267: https://github.com/giampaolo/psutil/issues/1267
.. _1268: https://github.com/giampaolo/psutil/issues/1268
.. _1269: https://github.com/giampaolo/psutil/issues/1269
.. _1270: https://github.com/giampaolo/psutil/issues/1270
.. _1271: https://github.com/giampaolo/psutil/issues/1271
.. _1272: https://github.com/giampaolo/psutil/issues/1272
.. _1273: https://github.com/giampaolo/psutil/issues/1273
.. _1274: https://github.com/giampaolo/psutil/issues/1274
.. _1275: https://github.com/giampaolo/psutil/issues/1275
.. _1276: https://github.com/giampaolo/psutil/issues/1276
.. _1277: https://github.com/giampaolo/psutil/issues/1277
.. _1278: https://github.com/giampaolo/psutil/issues/1278
.. _1279: https://github.com/giampaolo/psutil/issues/1279
.. _1280: https://github.com/giampaolo/psutil/issues/1280
.. _1281: https://github.com/giampaolo/psutil/issues/1281
.. _1282: https://github.com/giampaolo/psutil/issues/1282
.. _1283: https://github.com/giampaolo/psutil/issues/1283
.. _1284: https://github.com/giampaolo/psutil/issues/1284
.. _1285: https://github.com/giampaolo/psutil/issues/1285
.. _1286: https://github.com/giampaolo/psutil/issues/1286
.. _1287: https://github.com/giampaolo/psutil/issues/1287
.. _1288: https://github.com/giampaolo/psutil/issues/1288
.. _1289: https://github.com/giampaolo/psutil/issues/1289
.. _1290: https://github.com/giampaolo/psutil/issues/1290
.. _1291: https://github.com/giampaolo/psutil/issues/1291
.. _1292: https://github.com/giampaolo/psutil/issues/1292
.. _1293: https://github.com/giampaolo/psutil/issues/1293
.. _1294: https://github.com/giampaolo/psutil/issues/1294
.. _1295: https://github.com/giampaolo/psutil/issues/1295
.. _1296: https://github.com/giampaolo/psutil/issues/1296
.. _1297: https://github.com/giampaolo/psutil/issues/1297
.. _1298: https://github.com/giampaolo/psutil/issues/1298
.. _1299: https://github.com/giampaolo/psutil/issues/1299
.. _1300: https://github.com/giampaolo/psutil/issues/1300
.. _1301: https://github.com/giampaolo/psutil/issues/1301
.. _1302: https://github.com/giampaolo/psutil/issues/1302
.. _1303: https://github.com/giampaolo/psutil/issues/1303
.. _1304: https://github.com/giampaolo/psutil/issues/1304
.. _1305: https://github.com/giampaolo/psutil/issues/1305
.. _1306: https://github.com/giampaolo/psutil/issues/1306
.. _1307: https://github.com/giampaolo/psutil/issues/1307
.. _1308: https://github.com/giampaolo/psutil/issues/1308
.. _1309: https://github.com/giampaolo/psutil/issues/1309
.. _1310: https://github.com/giampaolo/psutil/issues/1310
.. _1311: https://github.com/giampaolo/psutil/issues/1311
.. _1312: https://github.com/giampaolo/psutil/issues/1312
.. _1313: https://github.com/giampaolo/psutil/issues/1313
.. _1314: https://github.com/giampaolo/psutil/issues/1314
.. _1315: https://github.com/giampaolo/psutil/issues/1315
.. _1316: https://github.com/giampaolo/psutil/issues/1316
.. _1317: https://github.com/giampaolo/psutil/issues/1317
.. _1318: https://github.com/giampaolo/psutil/issues/1318
.. _1319: https://github.com/giampaolo/psutil/issues/1319
.. _1320: https://github.com/giampaolo/psutil/issues/1320
.. _1321: https://github.com/giampaolo/psutil/issues/1321
.. _1322: https://github.com/giampaolo/psutil/issues/1322
.. _1323: https://github.com/giampaolo/psutil/issues/1323
.. _1324: https://github.com/giampaolo/psutil/issues/1324
.. _1325: https://github.com/giampaolo/psutil/issues/1325
.. _1326: https://github.com/giampaolo/psutil/issues/1326
.. _1327: https://github.com/giampaolo/psutil/issues/1327
.. _1328: https://github.com/giampaolo/psutil/issues/1328
.. _1329: https://github.com/giampaolo/psutil/issues/1329
.. _1330: https://github.com/giampaolo/psutil/issues/1330
.. _1331: https://github.com/giampaolo/psutil/issues/1331
.. _1332: https://github.com/giampaolo/psutil/issues/1332
.. _1333: https://github.com/giampaolo/psutil/issues/1333
.. _1334: https://github.com/giampaolo/psutil/issues/1334
.. _1335: https://github.com/giampaolo/psutil/issues/1335
.. _1336: https://github.com/giampaolo/psutil/issues/1336
.. _1337: https://github.com/giampaolo/psutil/issues/1337
.. _1338: https://github.com/giampaolo/psutil/issues/1338
.. _1339: https://github.com/giampaolo/psutil/issues/1339
.. _1340: https://github.com/giampaolo/psutil/issues/1340
.. _1341: https://github.com/giampaolo/psutil/issues/1341
.. _1342: https://github.com/giampaolo/psutil/issues/1342
.. _1343: https://github.com/giampaolo/psutil/issues/1343
.. _1344: https://github.com/giampaolo/psutil/issues/1344
.. _1345: https://github.com/giampaolo/psutil/issues/1345
.. _1346: https://github.com/giampaolo/psutil/issues/1346
.. _1347: https://github.com/giampaolo/psutil/issues/1347
.. _1348: https://github.com/giampaolo/psutil/issues/1348
.. _1349: https://github.com/giampaolo/psutil/issues/1349
.. _1350: https://github.com/giampaolo/psutil/issues/1350
.. _1351: https://github.com/giampaolo/psutil/issues/1351
.. _1352: https://github.com/giampaolo/psutil/issues/1352
.. _1353: https://github.com/giampaolo/psutil/issues/1353
.. _1354: https://github.com/giampaolo/psutil/issues/1354
.. _1355: https://github.com/giampaolo/psutil/issues/1355
.. _1356: https://github.com/giampaolo/psutil/issues/1356
.. _1357: https://github.com/giampaolo/psutil/issues/1357
.. _1358: https://github.com/giampaolo/psutil/issues/1358
.. _1359: https://github.com/giampaolo/psutil/issues/1359
.. _1360: https://github.com/giampaolo/psutil/issues/1360
.. _1361: https://github.com/giampaolo/psutil/issues/1361
.. _1362: https://github.com/giampaolo/psutil/issues/1362
.. _1363: https://github.com/giampaolo/psutil/issues/1363
.. _1364: https://github.com/giampaolo/psutil/issues/1364
.. _1365: https://github.com/giampaolo/psutil/issues/1365
.. _1366: https://github.com/giampaolo/psutil/issues/1366
.. _1367: https://github.com/giampaolo/psutil/issues/1367
.. _1368: https://github.com/giampaolo/psutil/issues/1368
.. _1369: https://github.com/giampaolo/psutil/issues/1369
.. _1370: https://github.com/giampaolo/psutil/issues/1370
.. _1371: https://github.com/giampaolo/psutil/issues/1371
.. _1372: https://github.com/giampaolo/psutil/issues/1372
.. _1373: https://github.com/giampaolo/psutil/issues/1373
.. _1374: https://github.com/giampaolo/psutil/issues/1374
.. _1375: https://github.com/giampaolo/psutil/issues/1375
.. _1376: https://github.com/giampaolo/psutil/issues/1376
.. _1377: https://github.com/giampaolo/psutil/issues/1377
.. _1378: https://github.com/giampaolo/psutil/issues/1378
.. _1379: https://github.com/giampaolo/psutil/issues/1379
.. _1380: https://github.com/giampaolo/psutil/issues/1380
.. _1381: https://github.com/giampaolo/psutil/issues/1381
.. _1382: https://github.com/giampaolo/psutil/issues/1382
.. _1383: https://github.com/giampaolo/psutil/issues/1383
.. _1384: https://github.com/giampaolo/psutil/issues/1384
.. _1385: https://github.com/giampaolo/psutil/issues/1385
.. _1386: https://github.com/giampaolo/psutil/issues/1386
.. _1387: https://github.com/giampaolo/psutil/issues/1387
.. _1388: https://github.com/giampaolo/psutil/issues/1388
.. _1389: https://github.com/giampaolo/psutil/issues/1389
.. _1390: https://github.com/giampaolo/psutil/issues/1390
.. _1391: https://github.com/giampaolo/psutil/issues/1391
.. _1392: https://github.com/giampaolo/psutil/issues/1392
.. _1393: https://github.com/giampaolo/psutil/issues/1393
.. _1394: https://github.com/giampaolo/psutil/issues/1394
.. _1395: https://github.com/giampaolo/psutil/issues/1395
.. _1396: https://github.com/giampaolo/psutil/issues/1396
.. _1397: https://github.com/giampaolo/psutil/issues/1397
.. _1398: https://github.com/giampaolo/psutil/issues/1398
.. _1399: https://github.com/giampaolo/psutil/issues/1399
.. _1400: https://github.com/giampaolo/psutil/issues/1400
.. _1401: https://github.com/giampaolo/psutil/issues/1401
.. _1402: https://github.com/giampaolo/psutil/issues/1402
.. _1403: https://github.com/giampaolo/psutil/issues/1403
.. _1404: https://github.com/giampaolo/psutil/issues/1404
.. _1405: https://github.com/giampaolo/psutil/issues/1405
.. _1406: https://github.com/giampaolo/psutil/issues/1406
.. _1407: https://github.com/giampaolo/psutil/issues/1407
.. _1408: https://github.com/giampaolo/psutil/issues/1408
.. _1409: https://github.com/giampaolo/psutil/issues/1409
.. _1410: https://github.com/giampaolo/psutil/issues/1410
.. _1411: https://github.com/giampaolo/psutil/issues/1411
.. _1412: https://github.com/giampaolo/psutil/issues/1412
.. _1413: https://github.com/giampaolo/psutil/issues/1413
.. _1414: https://github.com/giampaolo/psutil/issues/1414
.. _1415: https://github.com/giampaolo/psutil/issues/1415
.. _1416: https://github.com/giampaolo/psutil/issues/1416
.. _1417: https://github.com/giampaolo/psutil/issues/1417
.. _1418: https://github.com/giampaolo/psutil/issues/1418
.. _1419: https://github.com/giampaolo/psutil/issues/1419
.. _1420: https://github.com/giampaolo/psutil/issues/1420
.. _1421: https://github.com/giampaolo/psutil/issues/1421
.. _1422: https://github.com/giampaolo/psutil/issues/1422
.. _1423: https://github.com/giampaolo/psutil/issues/1423
.. _1424: https://github.com/giampaolo/psutil/issues/1424
.. _1425: https://github.com/giampaolo/psutil/issues/1425
.. _1426: https://github.com/giampaolo/psutil/issues/1426
.. _1427: https://github.com/giampaolo/psutil/issues/1427
.. _1428: https://github.com/giampaolo/psutil/issues/1428
.. _1429: https://github.com/giampaolo/psutil/issues/1429
.. _1430: https://github.com/giampaolo/psutil/issues/1430
.. _1431: https://github.com/giampaolo/psutil/issues/1431
.. _1432: https://github.com/giampaolo/psutil/issues/1432
.. _1433: https://github.com/giampaolo/psutil/issues/1433
.. _1434: https://github.com/giampaolo/psutil/issues/1434
.. _1435: https://github.com/giampaolo/psutil/issues/1435
.. _1436: https://github.com/giampaolo/psutil/issues/1436
.. _1437: https://github.com/giampaolo/psutil/issues/1437
.. _1438: https://github.com/giampaolo/psutil/issues/1438
.. _1439: https://github.com/giampaolo/psutil/issues/1439
.. _1440: https://github.com/giampaolo/psutil/issues/1440
.. _1441: https://github.com/giampaolo/psutil/issues/1441
.. _1442: https://github.com/giampaolo/psutil/issues/1442
.. _1443: https://github.com/giampaolo/psutil/issues/1443
.. _1444: https://github.com/giampaolo/psutil/issues/1444
.. _1445: https://github.com/giampaolo/psutil/issues/1445
.. _1446: https://github.com/giampaolo/psutil/issues/1446
.. _1447: https://github.com/giampaolo/psutil/issues/1447
.. _1448: https://github.com/giampaolo/psutil/issues/1448
.. _1449: https://github.com/giampaolo/psutil/issues/1449
.. _1450: https://github.com/giampaolo/psutil/issues/1450
.. _1451: https://github.com/giampaolo/psutil/issues/1451
.. _1452: https://github.com/giampaolo/psutil/issues/1452
.. _1453: https://github.com/giampaolo/psutil/issues/1453
.. _1454: https://github.com/giampaolo/psutil/issues/1454
.. _1455: https://github.com/giampaolo/psutil/issues/1455
.. _1456: https://github.com/giampaolo/psutil/issues/1456
.. _1457: https://github.com/giampaolo/psutil/issues/1457
.. _1458: https://github.com/giampaolo/psutil/issues/1458
.. _1459: https://github.com/giampaolo/psutil/issues/1459
.. _1460: https://github.com/giampaolo/psutil/issues/1460
.. _1461: https://github.com/giampaolo/psutil/issues/1461
.. _1462: https://github.com/giampaolo/psutil/issues/1462
.. _1463: https://github.com/giampaolo/psutil/issues/1463
.. _1464: https://github.com/giampaolo/psutil/issues/1464
.. _1465: https://github.com/giampaolo/psutil/issues/1465
.. _1466: https://github.com/giampaolo/psutil/issues/1466
.. _1467: https://github.com/giampaolo/psutil/issues/1467
.. _1468: https://github.com/giampaolo/psutil/issues/1468
.. _1469: https://github.com/giampaolo/psutil/issues/1469
.. _1470: https://github.com/giampaolo/psutil/issues/1470
.. _1471: https://github.com/giampaolo/psutil/issues/1471
.. _1472: https://github.com/giampaolo/psutil/issues/1472
.. _1473: https://github.com/giampaolo/psutil/issues/1473
.. _1474: https://github.com/giampaolo/psutil/issues/1474
.. _1475: https://github.com/giampaolo/psutil/issues/1475
.. _1476: https://github.com/giampaolo/psutil/issues/1476
.. _1477: https://github.com/giampaolo/psutil/issues/1477
.. _1478: https://github.com/giampaolo/psutil/issues/1478
.. _1479: https://github.com/giampaolo/psutil/issues/1479
.. _1480: https://github.com/giampaolo/psutil/issues/1480
.. _1481: https://github.com/giampaolo/psutil/issues/1481
.. _1482: https://github.com/giampaolo/psutil/issues/1482
.. _1483: https://github.com/giampaolo/psutil/issues/1483
.. _1484: https://github.com/giampaolo/psutil/issues/1484
.. _1485: https://github.com/giampaolo/psutil/issues/1485
.. _1486: https://github.com/giampaolo/psutil/issues/1486
.. _1487: https://github.com/giampaolo/psutil/issues/1487
.. _1488: https://github.com/giampaolo/psutil/issues/1488
.. _1489: https://github.com/giampaolo/psutil/issues/1489
.. _1490: https://github.com/giampaolo/psutil/issues/1490
.. _1491: https://github.com/giampaolo/psutil/issues/1491
.. _1492: https://github.com/giampaolo/psutil/issues/1492
.. _1493: https://github.com/giampaolo/psutil/issues/1493
.. _1494: https://github.com/giampaolo/psutil/issues/1494
.. _1495: https://github.com/giampaolo/psutil/issues/1495
.. _1496: https://github.com/giampaolo/psutil/issues/1496
.. _1497: https://github.com/giampaolo/psutil/issues/1497
.. _1498: https://github.com/giampaolo/psutil/issues/1498
.. _1499: https://github.com/giampaolo/psutil/issues/1499
.. _1500: https://github.com/giampaolo/psutil/issues/1500
.. _1501: https://github.com/giampaolo/psutil/issues/1501
.. _1502: https://github.com/giampaolo/psutil/issues/1502
.. _1503: https://github.com/giampaolo/psutil/issues/1503
.. _1504: https://github.com/giampaolo/psutil/issues/1504
.. _1505: https://github.com/giampaolo/psutil/issues/1505
.. _1506: https://github.com/giampaolo/psutil/issues/1506
.. _1507: https://github.com/giampaolo/psutil/issues/1507
.. _1508: https://github.com/giampaolo/psutil/issues/1508
.. _1509: https://github.com/giampaolo/psutil/issues/1509
.. _1510: https://github.com/giampaolo/psutil/issues/1510
.. _1511: https://github.com/giampaolo/psutil/issues/1511
.. _1512: https://github.com/giampaolo/psutil/issues/1512
.. _1513: https://github.com/giampaolo/psutil/issues/1513
.. _1514: https://github.com/giampaolo/psutil/issues/1514
.. _1515: https://github.com/giampaolo/psutil/issues/1515
.. _1516: https://github.com/giampaolo/psutil/issues/1516
.. _1517: https://github.com/giampaolo/psutil/issues/1517
.. _1518: https://github.com/giampaolo/psutil/issues/1518
.. _1519: https://github.com/giampaolo/psutil/issues/1519
.. _1520: https://github.com/giampaolo/psutil/issues/1520
.. _1521: https://github.com/giampaolo/psutil/issues/1521
.. _1522: https://github.com/giampaolo/psutil/issues/1522
.. _1523: https://github.com/giampaolo/psutil/issues/1523
.. _1524: https://github.com/giampaolo/psutil/issues/1524
.. _1525: https://github.com/giampaolo/psutil/issues/1525
.. _1526: https://github.com/giampaolo/psutil/issues/1526
.. _1527: https://github.com/giampaolo/psutil/issues/1527
.. _1528: https://github.com/giampaolo/psutil/issues/1528
.. _1529: https://github.com/giampaolo/psutil/issues/1529
.. _1530: https://github.com/giampaolo/psutil/issues/1530
.. _1531: https://github.com/giampaolo/psutil/issues/1531
.. _1532: https://github.com/giampaolo/psutil/issues/1532
.. _1533: https://github.com/giampaolo/psutil/issues/1533
.. _1534: https://github.com/giampaolo/psutil/issues/1534
.. _1535: https://github.com/giampaolo/psutil/issues/1535
.. _1536: https://github.com/giampaolo/psutil/issues/1536
.. _1537: https://github.com/giampaolo/psutil/issues/1537
.. _1538: https://github.com/giampaolo/psutil/issues/1538
.. _1539: https://github.com/giampaolo/psutil/issues/1539
.. _1540: https://github.com/giampaolo/psutil/issues/1540
.. _1541: https://github.com/giampaolo/psutil/issues/1541
.. _1542: https://github.com/giampaolo/psutil/issues/1542
.. _1543: https://github.com/giampaolo/psutil/issues/1543
.. _1544: https://github.com/giampaolo/psutil/issues/1544
.. _1545: https://github.com/giampaolo/psutil/issues/1545
.. _1546: https://github.com/giampaolo/psutil/issues/1546
.. _1547: https://github.com/giampaolo/psutil/issues/1547
.. _1548: https://github.com/giampaolo/psutil/issues/1548
.. _1549: https://github.com/giampaolo/psutil/issues/1549
.. _1550: https://github.com/giampaolo/psutil/issues/1550
.. _1551: https://github.com/giampaolo/psutil/issues/1551
.. _1552: https://github.com/giampaolo/psutil/issues/1552
.. _1553: https://github.com/giampaolo/psutil/issues/1553
.. _1554: https://github.com/giampaolo/psutil/issues/1554
.. _1555: https://github.com/giampaolo/psutil/issues/1555
.. _1556: https://github.com/giampaolo/psutil/issues/1556
.. _1557: https://github.com/giampaolo/psutil/issues/1557
.. _1558: https://github.com/giampaolo/psutil/issues/1558
.. _1559: https://github.com/giampaolo/psutil/issues/1559
.. _1560: https://github.com/giampaolo/psutil/issues/1560
.. _1561: https://github.com/giampaolo/psutil/issues/1561
.. _1562: https://github.com/giampaolo/psutil/issues/1562
.. _1563: https://github.com/giampaolo/psutil/issues/1563
.. _1564: https://github.com/giampaolo/psutil/issues/1564
.. _1565: https://github.com/giampaolo/psutil/issues/1565
.. _1566: https://github.com/giampaolo/psutil/issues/1566
.. _1567: https://github.com/giampaolo/psutil/issues/1567
.. _1568: https://github.com/giampaolo/psutil/issues/1568
.. _1569: https://github.com/giampaolo/psutil/issues/1569
.. _1570: https://github.com/giampaolo/psutil/issues/1570
.. _1571: https://github.com/giampaolo/psutil/issues/1571
.. _1572: https://github.com/giampaolo/psutil/issues/1572
.. _1573: https://github.com/giampaolo/psutil/issues/1573
.. _1574: https://github.com/giampaolo/psutil/issues/1574
.. _1575: https://github.com/giampaolo/psutil/issues/1575
.. _1576: https://github.com/giampaolo/psutil/issues/1576
.. _1577: https://github.com/giampaolo/psutil/issues/1577
.. _1578: https://github.com/giampaolo/psutil/issues/1578
.. _1579: https://github.com/giampaolo/psutil/issues/1579
.. _1580: https://github.com/giampaolo/psutil/issues/1580
.. _1581: https://github.com/giampaolo/psutil/issues/1581
.. _1582: https://github.com/giampaolo/psutil/issues/1582
.. _1583: https://github.com/giampaolo/psutil/issues/1583
.. _1584: https://github.com/giampaolo/psutil/issues/1584
.. _1585: https://github.com/giampaolo/psutil/issues/1585
.. _1586: https://github.com/giampaolo/psutil/issues/1586
.. _1587: https://github.com/giampaolo/psutil/issues/1587
.. _1588: https://github.com/giampaolo/psutil/issues/1588
.. _1589: https://github.com/giampaolo/psutil/issues/1589
.. _1590: https://github.com/giampaolo/psutil/issues/1590
.. _1591: https://github.com/giampaolo/psutil/issues/1591
.. _1592: https://github.com/giampaolo/psutil/issues/1592
.. _1593: https://github.com/giampaolo/psutil/issues/1593
.. _1594: https://github.com/giampaolo/psutil/issues/1594
.. _1595: https://github.com/giampaolo/psutil/issues/1595
.. _1596: https://github.com/giampaolo/psutil/issues/1596
.. _1597: https://github.com/giampaolo/psutil/issues/1597
.. _1598: https://github.com/giampaolo/psutil/issues/1598
.. _1599: https://github.com/giampaolo/psutil/issues/1599
.. _1600: https://github.com/giampaolo/psutil/issues/1600
.. _1601: https://github.com/giampaolo/psutil/issues/1601
.. _1602: https://github.com/giampaolo/psutil/issues/1602
.. _1603: https://github.com/giampaolo/psutil/issues/1603
.. _1604: https://github.com/giampaolo/psutil/issues/1604
.. _1605: https://github.com/giampaolo/psutil/issues/1605
.. _1606: https://github.com/giampaolo/psutil/issues/1606
.. _1607: https://github.com/giampaolo/psutil/issues/1607
.. _1608: https://github.com/giampaolo/psutil/issues/1608
.. _1609: https://github.com/giampaolo/psutil/issues/1609
.. _1610: https://github.com/giampaolo/psutil/issues/1610
.. _1611: https://github.com/giampaolo/psutil/issues/1611
.. _1612: https://github.com/giampaolo/psutil/issues/1612
.. _1613: https://github.com/giampaolo/psutil/issues/1613
.. _1614: https://github.com/giampaolo/psutil/issues/1614
.. _1615: https://github.com/giampaolo/psutil/issues/1615
.. _1616: https://github.com/giampaolo/psutil/issues/1616
.. _1617: https://github.com/giampaolo/psutil/issues/1617
.. _1618: https://github.com/giampaolo/psutil/issues/1618
.. _1619: https://github.com/giampaolo/psutil/issues/1619
.. _1620: https://github.com/giampaolo/psutil/issues/1620
.. _1621: https://github.com/giampaolo/psutil/issues/1621
.. _1622: https://github.com/giampaolo/psutil/issues/1622
.. _1623: https://github.com/giampaolo/psutil/issues/1623
.. _1624: https://github.com/giampaolo/psutil/issues/1624
.. _1625: https://github.com/giampaolo/psutil/issues/1625
.. _1626: https://github.com/giampaolo/psutil/issues/1626
.. _1627: https://github.com/giampaolo/psutil/issues/1627
.. _1628: https://github.com/giampaolo/psutil/issues/1628
.. _1629: https://github.com/giampaolo/psutil/issues/1629
.. _1630: https://github.com/giampaolo/psutil/issues/1630
.. _1631: https://github.com/giampaolo/psutil/issues/1631
.. _1632: https://github.com/giampaolo/psutil/issues/1632
.. _1633: https://github.com/giampaolo/psutil/issues/1633
.. _1634: https://github.com/giampaolo/psutil/issues/1634
.. _1635: https://github.com/giampaolo/psutil/issues/1635
.. _1636: https://github.com/giampaolo/psutil/issues/1636
.. _1637: https://github.com/giampaolo/psutil/issues/1637
.. _1638: https://github.com/giampaolo/psutil/issues/1638
.. _1639: https://github.com/giampaolo/psutil/issues/1639
.. _1640: https://github.com/giampaolo/psutil/issues/1640
.. _1641: https://github.com/giampaolo/psutil/issues/1641
.. _1642: https://github.com/giampaolo/psutil/issues/1642
.. _1643: https://github.com/giampaolo/psutil/issues/1643
.. _1644: https://github.com/giampaolo/psutil/issues/1644
.. _1645: https://github.com/giampaolo/psutil/issues/1645
.. _1646: https://github.com/giampaolo/psutil/issues/1646
.. _1647: https://github.com/giampaolo/psutil/issues/1647
.. _1648: https://github.com/giampaolo/psutil/issues/1648
.. _1649: https://github.com/giampaolo/psutil/issues/1649
.. _1650: https://github.com/giampaolo/psutil/issues/1650
.. _1651: https://github.com/giampaolo/psutil/issues/1651
.. _1652: https://github.com/giampaolo/psutil/issues/1652
.. _1653: https://github.com/giampaolo/psutil/issues/1653
.. _1654: https://github.com/giampaolo/psutil/issues/1654
.. _1655: https://github.com/giampaolo/psutil/issues/1655
.. _1656: https://github.com/giampaolo/psutil/issues/1656
.. _1657: https://github.com/giampaolo/psutil/issues/1657
.. _1658: https://github.com/giampaolo/psutil/issues/1658
.. _1659: https://github.com/giampaolo/psutil/issues/1659
.. _1660: https://github.com/giampaolo/psutil/issues/1660
.. _1661: https://github.com/giampaolo/psutil/issues/1661
.. _1662: https://github.com/giampaolo/psutil/issues/1662
.. _1663: https://github.com/giampaolo/psutil/issues/1663
.. _1664: https://github.com/giampaolo/psutil/issues/1664
.. _1665: https://github.com/giampaolo/psutil/issues/1665
.. _1666: https://github.com/giampaolo/psutil/issues/1666
.. _1667: https://github.com/giampaolo/psutil/issues/1667
.. _1668: https://github.com/giampaolo/psutil/issues/1668
.. _1669: https://github.com/giampaolo/psutil/issues/1669
.. _1670: https://github.com/giampaolo/psutil/issues/1670
.. _1671: https://github.com/giampaolo/psutil/issues/1671
.. _1672: https://github.com/giampaolo/psutil/issues/1672
.. _1673: https://github.com/giampaolo/psutil/issues/1673
.. _1674: https://github.com/giampaolo/psutil/issues/1674
.. _1675: https://github.com/giampaolo/psutil/issues/1675
.. _1676: https://github.com/giampaolo/psutil/issues/1676
.. _1677: https://github.com/giampaolo/psutil/issues/1677
.. _1678: https://github.com/giampaolo/psutil/issues/1678
.. _1679: https://github.com/giampaolo/psutil/issues/1679
.. _1680: https://github.com/giampaolo/psutil/issues/1680
.. _1681: https://github.com/giampaolo/psutil/issues/1681
.. _1682: https://github.com/giampaolo/psutil/issues/1682
.. _1683: https://github.com/giampaolo/psutil/issues/1683
.. _1684: https://github.com/giampaolo/psutil/issues/1684
.. _1685: https://github.com/giampaolo/psutil/issues/1685
.. _1686: https://github.com/giampaolo/psutil/issues/1686
.. _1687: https://github.com/giampaolo/psutil/issues/1687
.. _1688: https://github.com/giampaolo/psutil/issues/1688
.. _1689: https://github.com/giampaolo/psutil/issues/1689
.. _1690: https://github.com/giampaolo/psutil/issues/1690
.. _1691: https://github.com/giampaolo/psutil/issues/1691
.. _1692: https://github.com/giampaolo/psutil/issues/1692
.. _1693: https://github.com/giampaolo/psutil/issues/1693
.. _1694: https://github.com/giampaolo/psutil/issues/1694
.. _1695: https://github.com/giampaolo/psutil/issues/1695
.. _1696: https://github.com/giampaolo/psutil/issues/1696
.. _1697: https://github.com/giampaolo/psutil/issues/1697
.. _1698: https://github.com/giampaolo/psutil/issues/1698
.. _1699: https://github.com/giampaolo/psutil/issues/1699
.. _1700: https://github.com/giampaolo/psutil/issues/1700
.. _1701: https://github.com/giampaolo/psutil/issues/1701
.. _1702: https://github.com/giampaolo/psutil/issues/1702
.. _1703: https://github.com/giampaolo/psutil/issues/1703
.. _1704: https://github.com/giampaolo/psutil/issues/1704
.. _1705: https://github.com/giampaolo/psutil/issues/1705
.. _1706: https://github.com/giampaolo/psutil/issues/1706
.. _1707: https://github.com/giampaolo/psutil/issues/1707
.. _1708: https://github.com/giampaolo/psutil/issues/1708
.. _1709: https://github.com/giampaolo/psutil/issues/1709
.. _1710: https://github.com/giampaolo/psutil/issues/1710
.. _1711: https://github.com/giampaolo/psutil/issues/1711
.. _1712: https://github.com/giampaolo/psutil/issues/1712
.. _1713: https://github.com/giampaolo/psutil/issues/1713
.. _1714: https://github.com/giampaolo/psutil/issues/1714
.. _1715: https://github.com/giampaolo/psutil/issues/1715
.. _1716: https://github.com/giampaolo/psutil/issues/1716
.. _1717: https://github.com/giampaolo/psutil/issues/1717
.. _1718: https://github.com/giampaolo/psutil/issues/1718
.. _1719: https://github.com/giampaolo/psutil/issues/1719
.. _1720: https://github.com/giampaolo/psutil/issues/1720
.. _1721: https://github.com/giampaolo/psutil/issues/1721
.. _1722: https://github.com/giampaolo/psutil/issues/1722
.. _1723: https://github.com/giampaolo/psutil/issues/1723
.. _1724: https://github.com/giampaolo/psutil/issues/1724
.. _1725: https://github.com/giampaolo/psutil/issues/1725
.. _1726: https://github.com/giampaolo/psutil/issues/1726
.. _1727: https://github.com/giampaolo/psutil/issues/1727
.. _1728: https://github.com/giampaolo/psutil/issues/1728
.. _1729: https://github.com/giampaolo/psutil/issues/1729
.. _1730: https://github.com/giampaolo/psutil/issues/1730
.. _1731: https://github.com/giampaolo/psutil/issues/1731
.. _1732: https://github.com/giampaolo/psutil/issues/1732
.. _1733: https://github.com/giampaolo/psutil/issues/1733
.. _1734: https://github.com/giampaolo/psutil/issues/1734
.. _1735: https://github.com/giampaolo/psutil/issues/1735
.. _1736: https://github.com/giampaolo/psutil/issues/1736
.. _1737: https://github.com/giampaolo/psutil/issues/1737
.. _1738: https://github.com/giampaolo/psutil/issues/1738
.. _1739: https://github.com/giampaolo/psutil/issues/1739
.. _1740: https://github.com/giampaolo/psutil/issues/1740
.. _1741: https://github.com/giampaolo/psutil/issues/1741
.. _1742: https://github.com/giampaolo/psutil/issues/1742
.. _1743: https://github.com/giampaolo/psutil/issues/1743
.. _1744: https://github.com/giampaolo/psutil/issues/1744
.. _1745: https://github.com/giampaolo/psutil/issues/1745
.. _1746: https://github.com/giampaolo/psutil/issues/1746
.. _1747: https://github.com/giampaolo/psutil/issues/1747
.. _1748: https://github.com/giampaolo/psutil/issues/1748
.. _1749: https://github.com/giampaolo/psutil/issues/1749
.. _1750: https://github.com/giampaolo/psutil/issues/1750
.. _1751: https://github.com/giampaolo/psutil/issues/1751
.. _1752: https://github.com/giampaolo/psutil/issues/1752
.. _1753: https://github.com/giampaolo/psutil/issues/1753
.. _1754: https://github.com/giampaolo/psutil/issues/1754
.. _1755: https://github.com/giampaolo/psutil/issues/1755
.. _1756: https://github.com/giampaolo/psutil/issues/1756
.. _1757: https://github.com/giampaolo/psutil/issues/1757
.. _1758: https://github.com/giampaolo/psutil/issues/1758
.. _1759: https://github.com/giampaolo/psutil/issues/1759
.. _1760: https://github.com/giampaolo/psutil/issues/1760
.. _1761: https://github.com/giampaolo/psutil/issues/1761
.. _1762: https://github.com/giampaolo/psutil/issues/1762
.. _1763: https://github.com/giampaolo/psutil/issues/1763
.. _1764: https://github.com/giampaolo/psutil/issues/1764
.. _1765: https://github.com/giampaolo/psutil/issues/1765
.. _1766: https://github.com/giampaolo/psutil/issues/1766
.. _1767: https://github.com/giampaolo/psutil/issues/1767
.. _1768: https://github.com/giampaolo/psutil/issues/1768
.. _1769: https://github.com/giampaolo/psutil/issues/1769
.. _1770: https://github.com/giampaolo/psutil/issues/1770
.. _1771: https://github.com/giampaolo/psutil/issues/1771
.. _1772: https://github.com/giampaolo/psutil/issues/1772
.. _1773: https://github.com/giampaolo/psutil/issues/1773
.. _1774: https://github.com/giampaolo/psutil/issues/1774
.. _1775: https://github.com/giampaolo/psutil/issues/1775
.. _1776: https://github.com/giampaolo/psutil/issues/1776
.. _1777: https://github.com/giampaolo/psutil/issues/1777
.. _1778: https://github.com/giampaolo/psutil/issues/1778
.. _1779: https://github.com/giampaolo/psutil/issues/1779
.. _1780: https://github.com/giampaolo/psutil/issues/1780
.. _1781: https://github.com/giampaolo/psutil/issues/1781
.. _1782: https://github.com/giampaolo/psutil/issues/1782
.. _1783: https://github.com/giampaolo/psutil/issues/1783
.. _1784: https://github.com/giampaolo/psutil/issues/1784
.. _1785: https://github.com/giampaolo/psutil/issues/1785
.. _1786: https://github.com/giampaolo/psutil/issues/1786
.. _1787: https://github.com/giampaolo/psutil/issues/1787
.. _1788: https://github.com/giampaolo/psutil/issues/1788
.. _1789: https://github.com/giampaolo/psutil/issues/1789
.. _1790: https://github.com/giampaolo/psutil/issues/1790
.. _1791: https://github.com/giampaolo/psutil/issues/1791
.. _1792: https://github.com/giampaolo/psutil/issues/1792
.. _1793: https://github.com/giampaolo/psutil/issues/1793
.. _1794: https://github.com/giampaolo/psutil/issues/1794
.. _1795: https://github.com/giampaolo/psutil/issues/1795
.. _1796: https://github.com/giampaolo/psutil/issues/1796
.. _1797: https://github.com/giampaolo/psutil/issues/1797
.. _1798: https://github.com/giampaolo/psutil/issues/1798
.. _1799: https://github.com/giampaolo/psutil/issues/1799
.. _1800: https://github.com/giampaolo/psutil/issues/1800
.. _1801: https://github.com/giampaolo/psutil/issues/1801
.. _1802: https://github.com/giampaolo/psutil/issues/1802
.. _1803: https://github.com/giampaolo/psutil/issues/1803
.. _1804: https://github.com/giampaolo/psutil/issues/1804
.. _1805: https://github.com/giampaolo/psutil/issues/1805
.. _1806: https://github.com/giampaolo/psutil/issues/1806
.. _1807: https://github.com/giampaolo/psutil/issues/1807
.. _1808: https://github.com/giampaolo/psutil/issues/1808
.. _1809: https://github.com/giampaolo/psutil/issues/1809
.. _1810: https://github.com/giampaolo/psutil/issues/1810
.. _1811: https://github.com/giampaolo/psutil/issues/1811
.. _1812: https://github.com/giampaolo/psutil/issues/1812
.. _1813: https://github.com/giampaolo/psutil/issues/1813
.. _1814: https://github.com/giampaolo/psutil/issues/1814
.. _1815: https://github.com/giampaolo/psutil/issues/1815
.. _1816: https://github.com/giampaolo/psutil/issues/1816
.. _1817: https://github.com/giampaolo/psutil/issues/1817
.. _1818: https://github.com/giampaolo/psutil/issues/1818
.. _1819: https://github.com/giampaolo/psutil/issues/1819
.. _1820: https://github.com/giampaolo/psutil/issues/1820
.. _1821: https://github.com/giampaolo/psutil/issues/1821
.. _1822: https://github.com/giampaolo/psutil/issues/1822
.. _1823: https://github.com/giampaolo/psutil/issues/1823
.. _1824: https://github.com/giampaolo/psutil/issues/1824
.. _1825: https://github.com/giampaolo/psutil/issues/1825
.. _1826: https://github.com/giampaolo/psutil/issues/1826
.. _1827: https://github.com/giampaolo/psutil/issues/1827
.. _1828: https://github.com/giampaolo/psutil/issues/1828
.. _1829: https://github.com/giampaolo/psutil/issues/1829
.. _1830: https://github.com/giampaolo/psutil/issues/1830
.. _1831: https://github.com/giampaolo/psutil/issues/1831
.. _1832: https://github.com/giampaolo/psutil/issues/1832
.. _1833: https://github.com/giampaolo/psutil/issues/1833
.. _1834: https://github.com/giampaolo/psutil/issues/1834
.. _1835: https://github.com/giampaolo/psutil/issues/1835
.. _1836: https://github.com/giampaolo/psutil/issues/1836
.. _1837: https://github.com/giampaolo/psutil/issues/1837
.. _1838: https://github.com/giampaolo/psutil/issues/1838
.. _1839: https://github.com/giampaolo/psutil/issues/1839
.. _1840: https://github.com/giampaolo/psutil/issues/1840
.. _1841: https://github.com/giampaolo/psutil/issues/1841
.. _1842: https://github.com/giampaolo/psutil/issues/1842
.. _1843: https://github.com/giampaolo/psutil/issues/1843
.. _1844: https://github.com/giampaolo/psutil/issues/1844
.. _1845: https://github.com/giampaolo/psutil/issues/1845
.. _1846: https://github.com/giampaolo/psutil/issues/1846
.. _1847: https://github.com/giampaolo/psutil/issues/1847
.. _1848: https://github.com/giampaolo/psutil/issues/1848
.. _1849: https://github.com/giampaolo/psutil/issues/1849
.. _1850: https://github.com/giampaolo/psutil/issues/1850
.. _1851: https://github.com/giampaolo/psutil/issues/1851
.. _1852: https://github.com/giampaolo/psutil/issues/1852
.. _1853: https://github.com/giampaolo/psutil/issues/1853
.. _1854: https://github.com/giampaolo/psutil/issues/1854
.. _1855: https://github.com/giampaolo/psutil/issues/1855
.. _1856: https://github.com/giampaolo/psutil/issues/1856
.. _1857: https://github.com/giampaolo/psutil/issues/1857
.. _1858: https://github.com/giampaolo/psutil/issues/1858
.. _1859: https://github.com/giampaolo/psutil/issues/1859
.. _1860: https://github.com/giampaolo/psutil/issues/1860
.. _1861: https://github.com/giampaolo/psutil/issues/1861
.. _1862: https://github.com/giampaolo/psutil/issues/1862
.. _1863: https://github.com/giampaolo/psutil/issues/1863
.. _1864: https://github.com/giampaolo/psutil/issues/1864
.. _1865: https://github.com/giampaolo/psutil/issues/1865
.. _1866: https://github.com/giampaolo/psutil/issues/1866
.. _1867: https://github.com/giampaolo/psutil/issues/1867
.. _1868: https://github.com/giampaolo/psutil/issues/1868
.. _1869: https://github.com/giampaolo/psutil/issues/1869
.. _1870: https://github.com/giampaolo/psutil/issues/1870
.. _1871: https://github.com/giampaolo/psutil/issues/1871
.. _1872: https://github.com/giampaolo/psutil/issues/1872
.. _1873: https://github.com/giampaolo/psutil/issues/1873
.. _1874: https://github.com/giampaolo/psutil/issues/1874
.. _1875: https://github.com/giampaolo/psutil/issues/1875
.. _1876: https://github.com/giampaolo/psutil/issues/1876
.. _1877: https://github.com/giampaolo/psutil/issues/1877
.. _1878: https://github.com/giampaolo/psutil/issues/1878
.. _1879: https://github.com/giampaolo/psutil/issues/1879
.. _1880: https://github.com/giampaolo/psutil/issues/1880
.. _1881: https://github.com/giampaolo/psutil/issues/1881
.. _1882: https://github.com/giampaolo/psutil/issues/1882
.. _1883: https://github.com/giampaolo/psutil/issues/1883
.. _1884: https://github.com/giampaolo/psutil/issues/1884
.. _1885: https://github.com/giampaolo/psutil/issues/1885
.. _1886: https://github.com/giampaolo/psutil/issues/1886
.. _1887: https://github.com/giampaolo/psutil/issues/1887
.. _1888: https://github.com/giampaolo/psutil/issues/1888
.. _1889: https://github.com/giampaolo/psutil/issues/1889
.. _1890: https://github.com/giampaolo/psutil/issues/1890
.. _1891: https://github.com/giampaolo/psutil/issues/1891
.. _1892: https://github.com/giampaolo/psutil/issues/1892
.. _1893: https://github.com/giampaolo/psutil/issues/1893
.. _1894: https://github.com/giampaolo/psutil/issues/1894
.. _1895: https://github.com/giampaolo/psutil/issues/1895
.. _1896: https://github.com/giampaolo/psutil/issues/1896
.. _1897: https://github.com/giampaolo/psutil/issues/1897
.. _1898: https://github.com/giampaolo/psutil/issues/1898
.. _1899: https://github.com/giampaolo/psutil/issues/1899
.. _1900: https://github.com/giampaolo/psutil/issues/1900
.. _1901: https://github.com/giampaolo/psutil/issues/1901
.. _1902: https://github.com/giampaolo/psutil/issues/1902
.. _1903: https://github.com/giampaolo/psutil/issues/1903
.. _1904: https://github.com/giampaolo/psutil/issues/1904
.. _1905: https://github.com/giampaolo/psutil/issues/1905
.. _1906: https://github.com/giampaolo/psutil/issues/1906
.. _1907: https://github.com/giampaolo/psutil/issues/1907
.. _1908: https://github.com/giampaolo/psutil/issues/1908
.. _1909: https://github.com/giampaolo/psutil/issues/1909
.. _1910: https://github.com/giampaolo/psutil/issues/1910
.. _1911: https://github.com/giampaolo/psutil/issues/1911
.. _1912: https://github.com/giampaolo/psutil/issues/1912
.. _1913: https://github.com/giampaolo/psutil/issues/1913
.. _1914: https://github.com/giampaolo/psutil/issues/1914
.. _1915: https://github.com/giampaolo/psutil/issues/1915
.. _1916: https://github.com/giampaolo/psutil/issues/1916
.. _1917: https://github.com/giampaolo/psutil/issues/1917
.. _1918: https://github.com/giampaolo/psutil/issues/1918
.. _1919: https://github.com/giampaolo/psutil/issues/1919
.. _1920: https://github.com/giampaolo/psutil/issues/1920
.. _1921: https://github.com/giampaolo/psutil/issues/1921
.. _1922: https://github.com/giampaolo/psutil/issues/1922
.. _1923: https://github.com/giampaolo/psutil/issues/1923
.. _1924: https://github.com/giampaolo/psutil/issues/1924
.. _1925: https://github.com/giampaolo/psutil/issues/1925
.. _1926: https://github.com/giampaolo/psutil/issues/1926
.. _1927: https://github.com/giampaolo/psutil/issues/1927
.. _1928: https://github.com/giampaolo/psutil/issues/1928
.. _1929: https://github.com/giampaolo/psutil/issues/1929
.. _1930: https://github.com/giampaolo/psutil/issues/1930
.. _1931: https://github.com/giampaolo/psutil/issues/1931
.. _1932: https://github.com/giampaolo/psutil/issues/1932
.. _1933: https://github.com/giampaolo/psutil/issues/1933
.. _1934: https://github.com/giampaolo/psutil/issues/1934
.. _1935: https://github.com/giampaolo/psutil/issues/1935
.. _1936: https://github.com/giampaolo/psutil/issues/1936
.. _1937: https://github.com/giampaolo/psutil/issues/1937
.. _1938: https://github.com/giampaolo/psutil/issues/1938
.. _1939: https://github.com/giampaolo/psutil/issues/1939
.. _1940: https://github.com/giampaolo/psutil/issues/1940
.. _1941: https://github.com/giampaolo/psutil/issues/1941
.. _1942: https://github.com/giampaolo/psutil/issues/1942
.. _1943: https://github.com/giampaolo/psutil/issues/1943
.. _1944: https://github.com/giampaolo/psutil/issues/1944
.. _1945: https://github.com/giampaolo/psutil/issues/1945
.. _1946: https://github.com/giampaolo/psutil/issues/1946
.. _1947: https://github.com/giampaolo/psutil/issues/1947
.. _1948: https://github.com/giampaolo/psutil/issues/1948
.. _1949: https://github.com/giampaolo/psutil/issues/1949
.. _1950: https://github.com/giampaolo/psutil/issues/1950
.. _1951: https://github.com/giampaolo/psutil/issues/1951
.. _1952: https://github.com/giampaolo/psutil/issues/1952
.. _1953: https://github.com/giampaolo/psutil/issues/1953
.. _1954: https://github.com/giampaolo/psutil/issues/1954
.. _1955: https://github.com/giampaolo/psutil/issues/1955
.. _1956: https://github.com/giampaolo/psutil/issues/1956
.. _1957: https://github.com/giampaolo/psutil/issues/1957
.. _1958: https://github.com/giampaolo/psutil/issues/1958
.. _1959: https://github.com/giampaolo/psutil/issues/1959
.. _1960: https://github.com/giampaolo/psutil/issues/1960
.. _1961: https://github.com/giampaolo/psutil/issues/1961
.. _1962: https://github.com/giampaolo/psutil/issues/1962
.. _1963: https://github.com/giampaolo/psutil/issues/1963
.. _1964: https://github.com/giampaolo/psutil/issues/1964
.. _1965: https://github.com/giampaolo/psutil/issues/1965
.. _1966: https://github.com/giampaolo/psutil/issues/1966
.. _1967: https://github.com/giampaolo/psutil/issues/1967
.. _1968: https://github.com/giampaolo/psutil/issues/1968
.. _1969: https://github.com/giampaolo/psutil/issues/1969
.. _1970: https://github.com/giampaolo/psutil/issues/1970
.. _1971: https://github.com/giampaolo/psutil/issues/1971
.. _1972: https://github.com/giampaolo/psutil/issues/1972
.. _1973: https://github.com/giampaolo/psutil/issues/1973
.. _1974: https://github.com/giampaolo/psutil/issues/1974
.. _1975: https://github.com/giampaolo/psutil/issues/1975
.. _1976: https://github.com/giampaolo/psutil/issues/1976
.. _1977: https://github.com/giampaolo/psutil/issues/1977
.. _1978: https://github.com/giampaolo/psutil/issues/1978
.. _1979: https://github.com/giampaolo/psutil/issues/1979
.. _1980: https://github.com/giampaolo/psutil/issues/1980
.. _1981: https://github.com/giampaolo/psutil/issues/1981
.. _1982: https://github.com/giampaolo/psutil/issues/1982
.. _1983: https://github.com/giampaolo/psutil/issues/1983
.. _1984: https://github.com/giampaolo/psutil/issues/1984
.. _1985: https://github.com/giampaolo/psutil/issues/1985
.. _1986: https://github.com/giampaolo/psutil/issues/1986
.. _1987: https://github.com/giampaolo/psutil/issues/1987
.. _1988: https://github.com/giampaolo/psutil/issues/1988
.. _1989: https://github.com/giampaolo/psutil/issues/1989
.. _1990: https://github.com/giampaolo/psutil/issues/1990
.. _1991: https://github.com/giampaolo/psutil/issues/1991
.. _1992: https://github.com/giampaolo/psutil/issues/1992
.. _1993: https://github.com/giampaolo/psutil/issues/1993
.. _1994: https://github.com/giampaolo/psutil/issues/1994
.. _1995: https://github.com/giampaolo/psutil/issues/1995
.. _1996: https://github.com/giampaolo/psutil/issues/1996
.. _1997: https://github.com/giampaolo/psutil/issues/1997
.. _1998: https://github.com/giampaolo/psutil/issues/1998
.. _1999: https://github.com/giampaolo/psutil/issues/1999
.. _2000: https://github.com/giampaolo/psutil/issues/2000
PK�(�\�ty�N�N"doc/alt-python37-psutil/README.rstnu�[���|  |downloads| |stars| |forks| |contributors| |coverage| |quality|
|  |version| |py-versions| |packages| |license|
|  |github-actions| |appveyor| |doc| |twitter| |tidelift|

.. |downloads| image:: https://img.shields.io/pypi/dm/psutil.svg
    :target: https://pepy.tech/project/psutil
    :alt: Downloads

.. |stars| image:: https://img.shields.io/github/stars/giampaolo/psutil.svg
    :target: https://github.com/giampaolo/psutil/stargazers
    :alt: Github stars

.. |forks| image:: https://img.shields.io/github/forks/giampaolo/psutil.svg
    :target: https://github.com/giampaolo/psutil/network/members
    :alt: Github forks

.. |contributors| image:: https://img.shields.io/github/contributors/giampaolo/psutil.svg
    :target: https://github.com/giampaolo/psutil/graphs/contributors
    :alt: Contributors

.. |quality| image:: https://img.shields.io/codacy/grade/ce63e7f7f69d44b5b59682196e6fbfca.svg
    :target: https://www.codacy.com/app/g-rodola/psutil?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=giampaolo/psutil&amp;utm_campaign=Badge_Grade
    :alt: Code quality

.. |github-actions| image:: https://img.shields.io/github/workflow/status/giampaolo/psutil/CI?label=Linux%2C%20macOS%2C%20FreeBSD
    :target: https://github.com/giampaolo/psutil/actions?query=workflow%3ACI
    :alt: Linux, macOS, Windows tests

.. |appveyor| image:: https://img.shields.io/appveyor/ci/giampaolo/psutil/master.svg?maxAge=3600&label=Windows
    :target: https://ci.appveyor.com/project/giampaolo/psutil
    :alt: Windows tests (Appveyor)

.. |coverage| image:: https://coveralls.io/repos/github/giampaolo/psutil/badge.svg?branch=master
    :target: https://coveralls.io/github/giampaolo/psutil?branch=master
    :alt: Test coverage (coverall.io)

.. |doc| image:: https://readthedocs.org/projects/psutil/badge/?version=latest
    :target: http://psutil.readthedocs.io/en/latest/?badge=latest
    :alt: Documentation Status

.. |version| image:: https://img.shields.io/pypi/v/psutil.svg?label=pypi
    :target: https://pypi.org/project/psutil
    :alt: Latest version

.. |py-versions| image:: https://img.shields.io/pypi/pyversions/psutil.svg
    :target: https://pypi.org/project/psutil
    :alt: Supported Python versions

.. |packages| image:: https://repology.org/badge/tiny-repos/python:psutil.svg
    :target: https://repology.org/metapackage/python:psutil/versions
    :alt: Binary packages

.. |license| image:: https://img.shields.io/pypi/l/psutil.svg
    :target: https://github.com/giampaolo/psutil/blob/master/LICENSE
    :alt: License

.. |twitter| image:: https://img.shields.io/twitter/follow/grodola.svg?label=follow&style=flat&logo=twitter&logoColor=4FADFF
    :target: https://twitter.com/grodola
    :alt: Twitter Follow

.. |tidelift| image:: https://tidelift.com/badges/github/giampaolo/psutil?style=flat
    :target: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme
    :alt: Tidelift

-----

.. raw:: html

    <div align="center">
        <a href="https://github.com/giampaolo/psutil"><img src="https://github.com/giampaolo/psutil/raw/master/docs/_static/psutil-logo.png" /></a>
        <br />
        <br />
        <a href="https://github.com/giampaolo/psutil"><b>Home</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://github.com/giampaolo/psutil/blob/master/INSTALL.rst"><b>Install</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://psutil.readthedocs.io/"><b>Documentation</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://pypi.org/project/psutil/#files"><b>Download</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://groups.google.com/g/psutil"><b>Forum</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://gmpy.dev/tags/psutil"><b>Blog</b></a>&nbsp;&nbsp;&nbsp;
        <a href="#funding"><b>Funding</b></a>&nbsp;&nbsp;&nbsp;
        <a href="https://github.com/giampaolo/psutil/blob/master/HISTORY.rst"><b>What's new</b></a>&nbsp;&nbsp;&nbsp;
    </div>

Summary
=======

psutil (process and system utilities) is a cross-platform library for
retrieving information on **running processes** and **system utilization**
(CPU, memory, disks, network, sensors) in Python.
It is useful mainly for **system monitoring**, **profiling and limiting process
resources** and **management of running processes**.
It implements many functionalities offered by classic UNIX command line tools
such as *ps, top, iotop, lsof, netstat, ifconfig, free* and others.
psutil currently supports the following platforms:

- **Linux**
- **Windows**
- **macOS**
- **FreeBSD, OpenBSD**, **NetBSD**
- **Sun Solaris**
- **AIX**

Supported Python versions are **2.6**, **2.7**, **3.4+** and
`PyPy <http://pypy.org/>`__.

Funding
=======

While psutil is free software and will always be, the project would benefit
immensely from some funding.
Keeping up with bug reports and maintenance has become hardly sustainable for
me alone in terms of time.
If you're a company that's making significant use of psutil you can consider
becoming a sponsor via `GitHub <https://github.com/sponsors/giampaolo>`__,
`Open Collective <https://opencollective.com/psutil>`__ or
`PayPal <https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A9ZS7PKKRM3S8>`__
and have your logo displayed in here and psutil `doc <https://psutil.readthedocs.io>`__.

Sponsors
========

.. raw:: html

    <div>
        <a href="https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme">
            <img src="https://github.com/giampaolo/psutil/raw/master/docs/_static/tidelift-logo.png" />
        </a>
    </div>
    <sup><a href="https://github.com/sponsors/giampaolo">add your logo</a></sup>

Supporters
==========

None yet.

.. raw:: html

    <sup><a href="https://github.com/sponsors/giampaolo">add your avatar</a></sup>

Contributing
============

See `CONTRIBUTING.md <https://github.com/giampaolo/psutil/blob/master/CONTRIBUTING.md>`__ guidelines.

Example usages
==============

This represents pretty much the whole psutil API.

CPU
---

.. code-block:: python

    >>> import psutil
    >>>
    >>> psutil.cpu_times()
    scputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540, iowait=629.59, irq=0.0, softirq=19.42, steal=0.0, guest=0, nice=0.0)
    >>>
    >>> for x in range(3):
    ...     psutil.cpu_percent(interval=1)
    ...
    4.0
    5.9
    3.8
    >>>
    >>> for x in range(3):
    ...     psutil.cpu_percent(interval=1, percpu=True)
    ...
    [4.0, 6.9, 3.7, 9.2]
    [7.0, 8.5, 2.4, 2.1]
    [1.2, 9.0, 9.9, 7.2]
    >>>
    >>> for x in range(3):
    ...     psutil.cpu_times_percent(interval=1, percpu=False)
    ...
    scputimes(user=1.5, nice=0.0, system=0.5, idle=96.5, iowait=1.5, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
    scputimes(user=1.0, nice=0.0, system=0.0, idle=99.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
    scputimes(user=2.0, nice=0.0, system=0.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
    >>>
    >>> psutil.cpu_count()
    4
    >>> psutil.cpu_count(logical=False)
    2
    >>>
    >>> psutil.cpu_stats()
    scpustats(ctx_switches=20455687, interrupts=6598984, soft_interrupts=2134212, syscalls=0)
    >>>
    >>> psutil.cpu_freq()
    scpufreq(current=931.42925, min=800.0, max=3500.0)
    >>>
    >>> psutil.getloadavg()  # also on Windows (emulated)
    (3.14, 3.89, 4.67)

Memory
------

.. code-block:: python

    >>> psutil.virtual_memory()
    svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304)
    >>> psutil.swap_memory()
    sswap(total=2097147904, used=296128512, free=1801019392, percent=14.1, sin=304193536, sout=677842944)
    >>>

Disks
-----

.. code-block:: python

    >>> psutil.disk_partitions()
    [sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid', maxfile=255, maxpath=4096),
     sdiskpart(device='/dev/sda2', mountpoint='/home', fstype='ext, opts='rw', maxfile=255, maxpath=4096)]
    >>>
    >>> psutil.disk_usage('/')
    sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)
    >>>
    >>> psutil.disk_io_counters(perdisk=False)
    sdiskio(read_count=719566, write_count=1082197, read_bytes=18626220032, write_bytes=24081764352, read_time=5023392, write_time=63199568, read_merged_count=619166, write_merged_count=812396, busy_time=4523412)
    >>>

Network
-------

.. code-block:: python

    >>> psutil.net_io_counters(pernic=True)
    {'eth0': netio(bytes_sent=485291293, bytes_recv=6004858642, packets_sent=3251564, packets_recv=4787798, errin=0, errout=0, dropin=0, dropout=0),
     'lo': netio(bytes_sent=2838627, bytes_recv=2838627, packets_sent=30567, packets_recv=30567, errin=0, errout=0, dropin=0, dropout=0)}
    >>>
    >>> psutil.net_connections(kind='tcp')
    [sconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254),
     sconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987),
     ...]
    >>>
    >>> psutil.net_if_addrs()
    {'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None),
            snicaddr(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),
            snicaddr(family=<AddressFamily.AF_LINK: 17>, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)],
     'wlan0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None),
               snicaddr(family=<AddressFamily.AF_INET6: 10>, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),
               snicaddr(family=<AddressFamily.AF_LINK: 17>, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}
    >>>
    >>> psutil.net_if_stats()
    {'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536),
     'wlan0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=100, mtu=1500)}
    >>>

Sensors
-------

.. code-block:: python

    >>> import psutil
    >>> psutil.sensors_temperatures()
    {'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)],
     'asus': [shwtemp(label='', current=47.0, high=None, critical=None)],
     'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0),
                  shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0)]}
    >>>
    >>> psutil.sensors_fans()
    {'asus': [sfan(label='cpu_fan', current=3200)]}
    >>>
    >>> psutil.sensors_battery()
    sbattery(percent=93, secsleft=16628, power_plugged=False)
    >>>

Other system info
-----------------

.. code-block:: python

    >>> import psutil
    >>> psutil.users()
    [suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352),
     suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)]
    >>>
    >>> psutil.boot_time()
    1365519115.0
    >>>

Process management
------------------

.. code-block:: python

    >>> import psutil
    >>> psutil.pids()
    [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215,
     1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932,
     4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311,
     4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433,
     4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054,
     7055, 7071]
    >>>
    >>> p = psutil.Process(7055)
    >>> p
    psutil.Process(pid=7055, name='python3', status='running', started='09:04:44')
    >>> p.name()
    'python'
    >>> p.exe()
    '/usr/bin/python'
    >>> p.cwd()
    '/home/giampaolo'
    >>> p.cmdline()
    ['/usr/bin/python', 'main.py']
    >>>
    >>> p.pid
    7055
    >>> p.ppid()
    7054
    >>> p.children(recursive=True)
    [psutil.Process(pid=29835, name='python3', status='sleeping', started='11:45:38'),
     psutil.Process(pid=29836, name='python3', status='waking', started='11:43:39')]
    >>>
    >>> p.parent()
    psutil.Process(pid=4699, name='bash', status='sleeping', started='09:06:44')
    >>> p.parents()
    [psutil.Process(pid=4699, name='bash', started='09:06:44'),
     psutil.Process(pid=4689, name='gnome-terminal-server', status='sleeping', started='0:06:44'),
     psutil.Process(pid=1, name='systemd', status='sleeping', started='05:56:55')]
    >>>
    >>> p.status()
    'running'
    >>> p.username()
    'giampaolo'
    >>> p.create_time()
    1267551141.5019531
    >>> p.terminal()
    '/dev/pts/0'
    >>>
    >>> p.uids()
    puids(real=1000, effective=1000, saved=1000)
    >>> p.gids()
    pgids(real=1000, effective=1000, saved=1000)
    >>>
    >>> p.cpu_times()
    pcputimes(user=1.02, system=0.31, children_user=0.32, children_system=0.1, iowait=0.0)
    >>> p.cpu_percent(interval=1.0)
    12.1
    >>> p.cpu_affinity()
    [0, 1, 2, 3]
    >>> p.cpu_affinity([0, 1])  # set
    >>> p.cpu_num()
    1
    >>>
    >>> p.memory_info()
    pmem(rss=10915840, vms=67608576, shared=3313664, text=2310144, lib=0, data=7262208, dirty=0)
    >>> p.memory_full_info()  # "real" USS memory usage (Linux, macOS, Win only)
    pfullmem(rss=10199040, vms=52133888, shared=3887104, text=2867200, lib=0, data=5967872, dirty=0, uss=6545408, pss=6872064, swap=0)
    >>> p.memory_percent()
    0.7823
    >>> p.memory_maps()
    [pmmap_grouped(path='/lib/x8664-linux-gnu/libutil-2.15.so', rss=32768, size=2125824, pss=32768, shared_clean=0, shared_dirty=0, private_clean=20480, private_dirty=12288, referenced=32768, anonymous=12288, swap=0),
     pmmap_grouped(path='/lib/x8664-linux-gnu/libc-2.15.so', rss=3821568, size=3842048, pss=3821568, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=3821568, referenced=3575808, anonymous=3821568, swap=0),
     pmmap_grouped(path='[heap]',  rss=32768, size=139264, pss=32768, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=32768, referenced=32768, anonymous=32768, swap=0),
     pmmap_grouped(path='[stack]', rss=2465792, size=2494464, pss=2465792, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=2465792, referenced=2277376, anonymous=2465792, swap=0),
     ...]
    >>>
    >>> p.io_counters()
    pio(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632, read_chars=456232, write_chars=517543)
    >>>
    >>> p.open_files()
    [popenfile(path='/home/giampaolo/monit.py', fd=3, position=0, mode='r', flags=32768),
     popenfile(path='/var/log/monit.log', fd=4, position=235542, mode='a', flags=33793)]
    >>>
    >>> p.connections(kind='tcp')
    [pconn(fd=115, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'),
     pconn(fd=117, family=<AddressFamily.AF_INET: 2>, type=<SocketType.SOCK_STREAM: 1>, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING')]
    >>>
    >>> p.num_threads()
    4
    >>> p.num_fds()
    8
    >>> p.threads()
    [pthread(id=5234, user_time=22.5, system_time=9.2891),
     pthread(id=5237, user_time=0.0707, system_time=1.1)]
    >>>
    >>> p.num_ctx_switches()
    pctxsw(voluntary=78, involuntary=19)
    >>>
    >>> p.nice()
    0
    >>> p.nice(10)  # set
    >>>
    >>> p.ionice(psutil.IOPRIO_CLASS_IDLE)  # IO priority (Win and Linux only)
    >>> p.ionice()
    pionice(ioclass=<IOPriority.IOPRIO_CLASS_IDLE: 3>, value=0)
    >>>
    >>> p.rlimit(psutil.RLIMIT_NOFILE, (5, 5))  # set resource limits (Linux only)
    >>> p.rlimit(psutil.RLIMIT_NOFILE)
    (5, 5)
    >>>
    >>> p.environ()
    {'LC_PAPER': 'it_IT.UTF-8', 'SHELL': '/bin/bash', 'GREP_OPTIONS': '--color=auto',
    'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg',
     ...}
    >>>
    >>> p.as_dict()
    {'status': 'running', 'num_ctx_switches': pctxsw(voluntary=63, involuntary=1), 'pid': 5457, ...}
    >>> p.is_running()
    True
    >>> p.suspend()
    >>> p.resume()
    >>>
    >>> p.terminate()
    >>> p.kill()
    >>> p.wait(timeout=3)
    <Exitcode.EX_OK: 0>
    >>>
    >>> psutil.test()
    USER         PID %CPU %MEM     VSZ     RSS TTY        START    TIME  COMMAND
    root           1  0.0  0.0   24584    2240            Jun17   00:00  init
    root           2  0.0  0.0       0       0            Jun17   00:00  kthreadd
    ...
    giampaolo  31475  0.0  0.0   20760    3024 /dev/pts/0 Jun19   00:00  python2.4
    giampaolo  31721  0.0  2.2  773060  181896            00:04   10:30  chrome
    root       31763  0.0  0.0       0       0            00:05   00:00  kworker/0:1
    >>>

Further process APIs
--------------------

.. code-block:: python

    >>> import psutil
    >>> for proc in psutil.process_iter(['pid', 'name']):
    ...     print(proc.info)
    ...
    {'pid': 1, 'name': 'systemd'}
    {'pid': 2, 'name': 'kthreadd'}
    {'pid': 3, 'name': 'ksoftirqd/0'}
    ...
    >>>
    >>> psutil.pid_exists(3)
    True
    >>>
    >>> def on_terminate(proc):
    ...     print("process {} terminated".format(proc))
    ...
    >>> # waits for multiple processes to terminate
    >>> gone, alive = psutil.wait_procs(procs_list, timeout=3, callback=on_terminate)
    >>>

Popen wrapper:

.. code-block:: python

    >>> import psutil
    >>> from subprocess import PIPE
    >>> p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"], stdout=PIPE)
    >>> p.name()
    'python'
    >>> p.username()
    'giampaolo'
    >>> p.communicate()
    ('hello\n', None)
    >>> p.wait(timeout=2)
    0
    >>>

Windows services
----------------

.. code-block:: python

    >>> list(psutil.win_service_iter())
    [<WindowsService(name='AeLookupSvc', display_name='Application Experience') at 38850096>,
     <WindowsService(name='ALG', display_name='Application Layer Gateway Service') at 38850128>,
     <WindowsService(name='APNMCP', display_name='Ask Update Service') at 38850160>,
     <WindowsService(name='AppIDSvc', display_name='Application Identity') at 38850192>,
     ...]
    >>> s = psutil.win_service_get('alg')
    >>> s.as_dict()
    {'binpath': 'C:\\Windows\\System32\\alg.exe',
     'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing',
     'display_name': 'Application Layer Gateway Service',
     'name': 'alg',
     'pid': None,
     'start_type': 'manual',
     'status': 'stopped',
     'username': 'NT AUTHORITY\\LocalService'}

Projects using psutil
=====================

Here's some I find particularly interesting:

- https://github.com/google/grr
- https://github.com/facebook/osquery/
- https://github.com/nicolargo/glances
- https://github.com/Jahaja/psdash
- https://github.com/ajenti/ajenti
- https://github.com/home-assistant/home-assistant/

Portings
========

- Go: https://github.com/shirou/gopsutil
- C: https://github.com/hamon-in/cpslib
- Rust: https://github.com/rust-psutil/rust-psutil
- Nim: https://github.com/johnscillieri/psutil-nim

Security
========

To report a security vulnerability, please use the `Tidelift security
contact`_.  Tidelift will coordinate the fix and disclosure.

.. _`Giampaolo Rodola`: https://gmpy.dev/about
.. _`donation`: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A9ZS7PKKRM3S8
.. _Tidelift security contact: https://tidelift.com/security
.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme
PK�(�\�Yďdoc/alt-python37-zipp/LICENSEnu�[���Copyright Jason R. Coombs

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
PK�(�\OF�X!doc/alt-python37-zipp/CHANGES.rstnu�[���v3.7.0
======

Require Python 3.7 or later.

v3.6.0
======

#78: Only ``Path`` is exposed in the public API.

v3.5.1
======

#77: Remove news file intended only for CPython.

v3.5.0
======

#74 and bpo-44095: Added ``.suffix``, ``.suffixes``,
and ``.stem`` properties.

v3.4.2
======

Refresh package metadata.

v3.4.1
======

Refresh packaging.

v3.4.0
======

#68 and bpo-42090: ``Path.joinpath`` now takes arbitrary
positional arguments and no longer accepts ``add`` as a
keyword argument.

v3.3.2
======

Updated project metadata including badges.

v3.3.1
======

bpo-42043: Add tests capturing subclassing requirements.

v3.3.0
======

#9: ``Path`` objects now expose a ``.filename`` attribute
and rely on that to resolve ``.name`` and ``.parent`` when
the ``Path`` object is at the root of the zipfile.

v3.2.0
======

#57 and bpo-40564: Mutate the passed ZipFile object
type instead of making a copy. Prevents issues when
both the local copy and the caller's copy attempt to
close the same file handle.

#56 and bpo-41035: ``Path._next`` now honors
subclasses.

#55: ``Path.is_file()`` now returns False for non-existent names.

v3.1.0
======

#47: ``.open`` now raises ``FileNotFoundError`` and
``IsADirectoryError`` when appropriate.

v3.0.0
======

#44: Merge with v1.2.0.

v1.2.0
======

#44: ``zipp.Path.open()`` now supports a compatible signature
as ``pathlib.Path.open()``, accepting text (default) or binary
modes and soliciting keyword parameters passed through to
``io.TextIOWrapper`` (encoding, newline, etc). The stream is
opened in text-mode by default now. ``open`` no
longer accepts ``pwd`` as a positional argument and does not
accept the ``force_zip64`` parameter at all. This change is
a backward-incompatible change for that single function.

v2.2.1
======

#43: Merge with v1.1.1.

v1.1.1
======

#43: Restored performance of implicit dir computation.

v2.2.0
======

#36: Rebuild package with minimum Python version declared both
in package metadata and in the python tag.

v2.1.0
======

#32: Merge with v1.1.0.

v1.1.0
======

#32: For read-only zip files, complexity of ``.exists`` and
``joinpath`` is now constant time instead of ``O(n)``, preventing
quadratic time in common use-cases and rendering large
zip files unusable for Path. Big thanks to Benjy Weinberger
for the bug report and contributed fix (#33).

v2.0.1
======

#30: Corrected version inference (from jaraco/skeleton#12).

v2.0.0
======

Require Python 3.6 or later.

v1.0.0
======

Re-release of 0.6 to correspond with release as found in
Python 3.8.

v0.6.0
======

#12: When adding implicit dirs, ensure that ancestral directories
are added and that duplicates are excluded.

The library now relies on
`more_itertools <https://pypi.org/project/more_itertools>`_.

v0.5.2
======

#7: Parent of a directory now actually returns the parent.

v0.5.1
======

Declared package as backport.

v0.5.0
======

Add ``.joinpath()`` method and ``.parent`` property.

Now a backport release of the ``zipfile.Path`` class.

v0.4.0
======

#4: Add support for zip files with implied directories.

v0.3.3
======

#3: Fix issue where ``.name`` on a directory was empty.

v0.3.2
======

#2: Fix TypeError on Python 2.7 when classic division is used.

v0.3.1
======

#1: Fix TypeError on Python 3.5 when joining to a path-like object.

v0.3.0
======

Add support for constructing a ``zipp.Path`` from any path-like
object.

``zipp.Path`` is now a new-style class on Python 2.7.

v0.2.1
======

Fix issue with ``__str__``.

v0.2.0
======

Drop reliance on future-fstrings.

v0.1.0
======

Initial release with basic functionality.
PK�(�\��k��� doc/alt-python37-zipp/README.rstnu�[���.. image:: https://img.shields.io/pypi/v/zipp.svg
   :target: `PyPI link`_

.. image:: https://img.shields.io/pypi/pyversions/zipp.svg
   :target: `PyPI link`_

.. _PyPI link: https://pypi.org/project/zipp

.. image:: https://github.com/jaraco/zipp/workflows/tests/badge.svg
   :target: https://github.com/jaraco/zipp/actions?query=workflow%3A%22tests%22
   :alt: tests

.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
   :target: https://github.com/psf/black
   :alt: Code style: Black

.. .. image:: https://readthedocs.org/projects/skeleton/badge/?version=latest
..    :target: https://skeleton.readthedocs.io/en/latest/?badge=latest

.. image:: https://img.shields.io/badge/skeleton-2021-informational
   :target: https://blog.jaraco.com/skeleton


A pathlib-compatible Zipfile object wrapper. Official backport of the standard library
`Path object <https://docs.python.org/3.8/library/zipfile.html#path-objects>`_.
PK�(�\kr�e
e
"doc/alt-python-virtualenv/PKG-INFOnu�[���Metadata-Version: 2.1
Name: virtualenv
Version: 20.13.0
Summary: Virtual Python Environment builder
Home-page: https://virtualenv.pypa.io/
Author: Bernat Gabor
Author-email: gaborjbernat@gmail.com
Maintainer: Bernat Gabor
Maintainer-email: gaborjbernat@gmail.com
License: MIT
Project-URL: Source, https://github.com/pypa/virtualenv
Project-URL: Tracker, https://github.com/pypa/virtualenv/issues
Keywords: virtual,environments,isolated
Platform: any
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: POSIX
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Software Development :: Testing
Classifier: Topic :: Utilities
Requires-Python: !=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7
Description-Content-Type: text/markdown
Provides-Extra: docs
Provides-Extra: testing
License-File: LICENSE

# virtualenv

[![PyPI](https://img.shields.io/pypi/v/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![PyPI - Implementation](https://img.shields.io/pypi/implementation/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![Documentation](https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square)](http://virtualenv.pypa.io)
[![Discord](https://img.shields.io/discord/803025117553754132)](https://discord.gg/pypa)
[![PyPI - Downloads](https://img.shields.io/pypi/dm/virtualenv?style=flat-square)](https://pypistats.org/packages/virtualenv)
[![PyPI - License](https://img.shields.io/pypi/l/virtualenv?style=flat-square)](https://opensource.org/licenses/MIT)
[![Build Status](https://github.com/pypa/virtualenv/workflows/check/badge.svg?branch=main&event=push)](https://github.com/pypa/virtualenv/actions?query=workflow%3Acheck)
[![Code style:
black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square)](https://github.com/psf/black)

A tool for creating isolated `virtual` python environments.

- [Installation](https://virtualenv.pypa.io/en/latest/installation.html)
- [Documentation](https://virtualenv.pypa.io)
- [Changelog](https://virtualenv.pypa.io/en/latest/changelog.html)
- [Issues](https://github.com/pypa/virtualenv/issues)
- [PyPI](https://pypi.org/project/virtualenv)
- [Github](https://github.com/pypa/virtualenv)

## Code of Conduct

Everyone interacting in the virtualenv project's codebases, issue trackers, chat rooms, and mailing lists is expected to
follow the [PSF Code of Conduct](https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md).


PK�(�\�=,22!doc/alt-python-virtualenv/LICENSEnu�[���Copyright (c) 2020-202x The virtualenv developers

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PK�(�\�ˈ���#doc/alt-python-virtualenv/README.mdnu�[���# virtualenv

[![PyPI](https://img.shields.io/pypi/v/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![PyPI - Implementation](https://img.shields.io/pypi/implementation/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/virtualenv?style=flat-square)](https://pypi.org/project/virtualenv)
[![Documentation](https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square)](http://virtualenv.pypa.io)
[![Discord](https://img.shields.io/discord/803025117553754132)](https://discord.gg/pypa)
[![PyPI - Downloads](https://img.shields.io/pypi/dm/virtualenv?style=flat-square)](https://pypistats.org/packages/virtualenv)
[![PyPI - License](https://img.shields.io/pypi/l/virtualenv?style=flat-square)](https://opensource.org/licenses/MIT)
[![Build Status](https://github.com/pypa/virtualenv/workflows/check/badge.svg?branch=main&event=push)](https://github.com/pypa/virtualenv/actions?query=workflow%3Acheck)
[![Code style:
black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square)](https://github.com/psf/black)

A tool for creating isolated `virtual` python environments.

- [Installation](https://virtualenv.pypa.io/en/latest/installation.html)
- [Documentation](https://virtualenv.pypa.io)
- [Changelog](https://virtualenv.pypa.io/en/latest/changelog.html)
- [Issues](https://github.com/pypa/virtualenv/issues)
- [PyPI](https://pypi.org/project/virtualenv)
- [Github](https://github.com/pypa/virtualenv)

## Code of Conduct

Everyone interacting in the virtualenv project's codebases, issue trackers, chat rooms, and mailing lists is expected to
follow the [PSF Code of Conduct](https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md).
PK�(�\���(doc/alt-python-virtualenv/docs/index.rstnu�[���Virtualenv
==========

.. image:: https://img.shields.io/pypi/v/virtualenv?style=flat-square
  :target: https://pypi.org/project/virtualenv/#history
  :alt: Latest version on PyPI
.. image:: https://img.shields.io/pypi/implementation/virtualenv?style=flat-square
  :alt: PyPI - Implementation
.. image:: https://img.shields.io/pypi/pyversions/virtualenv?style=flat-square
  :alt: PyPI - Python Version
.. image:: https://readthedocs.org/projects/virtualenv/badge/?version=latest&style=flat-square
  :target: https://virtualenv.pypa.io
  :alt: Documentation status
.. image:: https://img.shields.io/discord/803025117553754132
  :target: https://discord.gg/pypa
  :alt: Discord
.. image:: https://img.shields.io/pypi/dm/virtualenv?style=flat-square
  :target: https://pypistats.org/packages/virtualenv
  :alt: PyPI - Downloads
.. image:: https://img.shields.io/pypi/l/virtualenv?style=flat-square
  :target: https://opensource.org/licenses/MIT
  :alt: PyPI - License
.. image:: https://img.shields.io/github/issues/pypa/virtualenv?style=flat-square
  :target: https://github.com/pypa/virtualenv/issues
  :alt: Open issues
.. image:: https://img.shields.io/github/issues-pr/pypa/virtualenv?style=flat-square
  :target: https://github.com/pypa/virtualenv/pulls
  :alt: Open pull requests
.. image:: https://img.shields.io/github/stars/pypa/virtualenv?style=flat-square
  :target: https://pypistats.org/packages/virtualenv
  :alt: Package popularity

``virtualenv`` is a tool to create isolated Python environments. Since Python ``3.3``, a subset of it has been
integrated into the standard library under the `venv module <https://docs.python.org/3/library/venv.html>`_. The
``venv`` module does not offer all features of this library, to name just a few more prominent:

- is slower (by not having the ``app-data`` seed method),
- is not as extendable,
- cannot create virtual environments for arbitrarily installed python versions (and automatically discover these),
- is not upgrade-able via `pip <https://pip.pypa.io/en/stable/installing/>`_,
- does not have as rich programmatic API (describe virtual environments without creating them).

The basic problem being addressed is one of dependencies and versions, and indirectly permissions.
Imagine you have an application that needs version ``1`` of ``LibFoo``, but another application requires version
``2``. How can you use both these libraries? If you install everything into your host python (e.g. ``python3.8``)
it's easy to end up in a situation where two packages have conflicting requirements.

Or more generally, what if you want to install an application *and leave it be*? If an application works, any change
in its libraries or the versions of those libraries can break the application. Also, what if you can't install packages
into the global ``site-packages`` directory, due to not having permissions to change the host python environment?

In all these cases, ``virtualenv`` can help you. It creates an environment that has its own installation directories,
that doesn't share libraries with other virtualenv environments (and optionally doesn't access the globally installed
libraries either).

Useful links
------------

**Related projects, that build abstractions on top of virtualenv**

* :pypi:`virtualenvwrapper` - a useful set of scripts for creating and deleting virtual environments
* :pypi:`pew` - provides a set of commands to manage multiple virtual environments
* :pypi:`tox` - a generic virtualenv management and test automation command line tool, driven by a ``tox.ini``
  configuration file
* :pypi:`nox` - a tool that automates testing in multiple Python environments, similar to tox,
  driven by a ``noxfile.py`` configuration file

**Tutorials**

* `Corey Schafer tutorial <https://www.youtube.com/watch?v=N5vscPTWKOk>`_ on how to use it
* `Using virtualenv with mod_wsgi <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_

**Presenting how the package works from within**

* `Bernat Gabor: status quo of virtual environments <https://www.youtube.com/watch?v=o1Vue9CWRxU>`_
* `Carl Meyer: Reverse-engineering Ian Bicking's brain: inside pip and virtualenv
  <http://pyvideo.org/video/568/reverse-engineering-ian-bicking--39-s-brain--insi>`_

.. comment: split here

.. toctree::
   :hidden:

   installation
   user_guide
   cli_interface
   extend
   development
   changelog
PK�(�\���cc)doc/alt-python-virtualenv/docs/extend.rstnu�[���Extend functionality
====================

``virtualenv`` allows one to extend the builtin functionality via a plugin system. To add a plugin you need to:

- write a python file containing the plugin code which follows our expected interface,
- package it as a python library,
- install it alongside the virtual environment.

.. warning::

   The public API of some of these components is still to be finalized, consider the current interface a beta one
   until we get some feedback on how well we planned ahead. We expect to do this by end of Q3 2020. Consider the class
   interface explained below as initial draft proposal. We reserve the right to change the API until then, however such
   changes will be communicated in a timely fashion, and you'll have time to migrate. Thank you for your understanding.

Python discovery
----------------

The python discovery mechanism is a component that needs to answer the following answer: based on some type of user
input give me a Python interpreter on the machine that matches that. The builtin interpreter tries to discover
an installed Python interpreter (based on PEP-515 and ``PATH`` discovery) on the users machine where the user input is a
python specification. An alternative such discovery mechanism for example would be to use the popular
`pyenv <https://github.com/pyenv/pyenv>`_ project to discover, and if not present install the requested Python
interpreter. Python discovery mechanisms must be registered under key ``virtualenv.discovery``, and the plugin must
implement :class:`virtualenv.discovery.discover.Discover`:

.. code-block:: ini

   virtualenv.discovery =
        pyenv = virtualenv_pyenv.discovery:PyEnvDiscovery


.. currentmodule:: virtualenv.discovery.discover

.. autoclass:: Discover
    :undoc-members:
    :members:


Creators
--------
Creators are what actually perform the creation of a virtual environment. The builtin virtual environment creators
all achieve this by referencing a global install; but would be just as valid for a creator to install a brand new
entire python under the target path; or one could add additional creators that can create virtual environments for other
python implementations, such as IronPython. They must be registered under and entry point with key
``virtualenv.discovery`` , and the class must implement :class:`virtualenv.create.creator.Creator`:

.. code-block:: ini

   virtualenv.create =
        cpython3-posix = virtualenv.create.via_global_ref.builtin.cpython.cpython3:CPython3Posix

.. currentmodule:: virtualenv.create.creator

.. autoclass:: Creator
    :undoc-members:
    :members:
    :exclude-members: run, set_pyenv_cfg, debug_script, debug_script, validate_dest, debug


Seed mechanism
--------------

Seeders are what given a virtual environment will install somehow some seed packages into it. They must be registered
under and entry point with key ``virtualenv.seed`` , and the class must implement
:class:`virtualenv.seed.seeder.Seeder`:

.. code-block:: ini

   virtualenv.seed =
        db = virtualenv.seed.fromDb:InstallFromDb

.. currentmodule:: virtualenv.seed.seeder

.. autoclass:: Seeder
    :undoc-members:
    :members:

Activation scripts
------------------
If you want add an activator for a new shell you can do this by implementing a new activator. They must be registered
under and entry point with key ``virtualenv.activate`` , and the class must implement
:class:`virtualenv.activation.activator.Activator`:

.. code-block:: ini

   virtualenv.activate =
        bash = virtualenv.activation.bash:BashActivator

.. currentmodule:: virtualenv.activation.activator

.. autoclass:: Activator
    :undoc-members:
    :members:
PK�(�\�΀�[[1doc/alt-python-virtualenv/docs/_static/custom.cssnu�[���.wy-nav-content {
    padding: 1em;
}

#virtualenv img {
    margin-bottom: 6px;
}

/* Allow table content to wrap around */
.wy-table-responsive table th, .wy-table-responsive table td {
    /* !important because RTD has conflicting stylesheets */
    white-space: normal !important;
    padding: 8px 6px !important;
}

.wy-table-responsive table {
    width: 100%;
    margin-left: 0 !important;
}

.rst-content table.docutils td ol {
    margin-bottom: 0;
}

.rst-content table.docutils td ul {
    margin-bottom: 0;
}

.rst-content table.docutils td p {
    margin-bottom: 0;
}

div[class*="highlight-"] {
    margin-bottom: 12px;
}

/* Tweak whitespace on the release history page */
#release-history p {
    margin-bottom: 0;
    margin-top: 0;
}

#release-history h3 {
    margin-bottom: 6px;
}

#release-history ul {
    margin-bottom: 12px;
}

#release-history ul ul {
    margin-bottom: 0;
    margin-top: 0;
}

#release-history h2 {
    margin-bottom: 12px;
}

/* Reduce whitespace on the inline-code snippets and add softer corners */
.rst-content code {
    padding: 2px 3px;
    border-radius: 3px;
}
PK�(�\e�K�{${$,doc/alt-python-virtualenv/docs/render_cli.pynu�[���from argparse import SUPPRESS
from collections import namedtuple
from contextlib import contextmanager

from docutils import nodes as n
from docutils.parsers.rst.directives import unchanged_required
from sphinx.util.docutils import SphinxDirective
from sphinxarg.parser import parse_parser

from virtualenv.run.plugin.base import ComponentBuilder

TableRow = namedtuple("TableRow", ["names", "default", "choices", "help"])

TextAsDefault = namedtuple("TextAsDefault", ["text"])

CUSTOM = {
    "discovery": ComponentBuilder.entry_points_for("virtualenv.discovery"),
    "creator": ComponentBuilder.entry_points_for("virtualenv.create"),
    "seeder": ComponentBuilder.entry_points_for("virtualenv.seed"),
    "activators": ComponentBuilder.entry_points_for("virtualenv.activate"),
}


class CliTable(SphinxDirective):
    name = "table_cli"
    option_spec = dict(module=unchanged_required, func=unchanged_required)

    def run(self):
        module_name, attr_name = self.options["module"], self.options["func"]
        parser_creator = getattr(__import__(module_name, fromlist=[attr_name]), attr_name)
        core_result = parse_parser(parser_creator())
        core_result["action_groups"] = [i for i in core_result["action_groups"] if i["title"] not in CUSTOM]

        content = []
        for i in core_result["action_groups"]:
            content.append(self._build_table(i["options"], i["title"], i["description"]))
        for key, name_to_class in CUSTOM.items():
            section = n.section("", ids=["section-{}".format(key)])
            title = n.title("", key)
            section += title
            self.state.document.note_implicit_target(title)
            content.append(section)
            results = {}

            for name, class_n in name_to_class.items():
                with self._run_parser(class_n, key, name):
                    cmd = ["--{}".format(key), name]
                    parser_result = parse_parser(parser_creator(cmd))
                    opt_group = next(i["options"] for i in parser_result["action_groups"] if i["title"] == key)
                    results[name] = opt_group
            core_names = set.intersection(*list({tuple(i["name"]) for i in v} for v in results.values()))
            if core_names:
                rows = [i for i in next(iter(results.values())) if tuple(i["name"]) in core_names]
                content.append(
                    self._build_table(rows, title="core", description="options shared across all {}".format(key)),
                )
            for name, group in results.items():
                rows = [i for i in group if tuple(i["name"]) not in core_names]
                if rows:
                    content.append(
                        self._build_table(rows, title=name, description="options specific to {} {}".format(key, name)),
                    )
        return content

    @contextmanager
    def _run_parser(self, class_n, key, name):
        test_name = {"creator": "can_create", "activators": "supports"}
        func_name = test_name.get(key)
        try:
            if func_name is not None:
                prev = getattr(class_n, func_name)

                def a(*args, **kwargs):
                    prev(*args, **kwargs)
                    if key == "activators":
                        return True
                    elif key == "creator":
                        if name == "venv":
                            from virtualenv.create.via_global_ref.venv import ViaGlobalRefMeta

                            meta = ViaGlobalRefMeta()
                            meta.symlink_error = None
                            return meta
                        from virtualenv.create.via_global_ref.builtin.via_global_self_do import BuiltinViaGlobalRefMeta

                        meta = BuiltinViaGlobalRefMeta()
                        meta.symlink_error = None
                        return meta
                    raise RuntimeError

                setattr(class_n, func_name, a)
            yield
        finally:
            if func_name is not None:
                # noinspection PyUnboundLocalVariable
                setattr(class_n, func_name, prev)

    def _build_table(self, options, title, description):
        table = n.table()
        table["classes"] += ["colwidths-auto"]

        options_group = n.tgroup(cols=3)
        table += options_group
        for _ in range(3):
            options_group += n.colspec()
        body = self._make_table_body(self.build_rows(options), title, description)
        options_group += body
        return table

    plugins = {
        "creator": "virtualenv.create",
        "seed": "virtualenv.seed",
        "activators": "virtualenv.activate",
        "discovery": "virtualenv.discovery",
    }

    @staticmethod
    def build_rows(options):
        result = []
        for option in options:
            names = option["name"]
            default = option["default"]
            if default is not None:
                if isinstance(default, str) and default and default[0] == default[-1] and default[0] == '"':
                    default = default[1:-1]
                    if default == SUPPRESS:
                        default = None
            choices = option.get("choices")
            key = names[0].strip("-")
            if key in CliTable.plugins:
                choices = list(ComponentBuilder.entry_points_for(CliTable.plugins[key]).keys())
            help_text = option["help"]
            row = TableRow(names, default, choices, help_text)
            result.append(row)
        return result

    def _make_table_body(self, rows, title, description):
        t_body = n.tbody()
        header_row = n.paragraph()
        header_row += n.strong(text=title)
        if description:
            header_row += n.Text(" ⇒ ")
            header_row += n.Text(description)
        t_body += n.row("", n.entry("", header_row, morecols=2))
        for row in rows:
            name_list = self._get_targeted_names(row)
            default = CliTable._get_default(row)
            help_text = CliTable._get_help_text(row)
            row_node = n.row("", n.entry("", name_list), n.entry("", default), n.entry("", help_text))
            t_body += row_node
        return t_body

    def _get_targeted_names(self, row):
        names = [name.lstrip("-") for name in row.names]
        target = n.target("", "", ids=names, names=names)
        self.register_target_option(target)
        first = True
        for name, orig in zip(names, row.names):
            if first:
                first = False
            else:
                target += n.Text(", ")
            self_ref = n.reference(refid=name)
            self_ref += n.literal(text=orig)
            target += self_ref
        para = n.paragraph(text="")
        para += target
        return para

    @staticmethod
    def _get_help_text(row):
        name = row.names[0]
        if name in ("--creator",):
            content = row.help[: row.help.index("(") - 1]
        else:
            content = row.help
        if name in ("--setuptools", "--pip", "--wheel"):
            text = row.help
            at = text.index(" bundle ")
            help_body = n.paragraph("")
            help_body += n.Text(text[: at + 1])
            help_body += n.literal(text="bundle")
            help_body += n.Text(text[at + 7 :])
        else:
            help_body = n.paragraph("", "", n.Text(content))
        if row.choices is not None:
            help_body += n.Text("; choice of: ")
            first = True
            for choice in row.choices:
                if first:
                    first = False
                else:
                    help_body += n.Text(", ")
                help_body += n.literal(text=choice)
        return help_body

    @staticmethod
    def _get_default(row):
        default = row.default
        name = row.names[0]
        if name == "-p":
            default_body = n.Text("the python executable virtualenv is installed into")
        elif name == "--app-data":
            default_body = n.Text("platform specific application data folder")
        elif name == "--activators":
            default_body = n.Text("comma separated list of activators supported")
        elif name == "--creator":
            default_body = n.paragraph("")
            default_body += n.literal(text="builtin")
            default_body += n.Text(" if exist, else ")
            default_body += n.literal(text="venv")
        else:
            if default is None:
                default_body = n.paragraph("", text="")
            else:
                default_body = n.literal(text=default if isinstance(default, str) else str(default))
        return default_body

    def register_target_option(self, target) -> None:
        domain = self.env.get_domain("std")
        self.state.document.note_explicit_target(target)
        for key in target["ids"]:
            domain.add_program_option(None, key, self.env.docname, key)


def literal_data(rawtext, app, type, slug, options):
    """Create a link to a BitBucket resource."""
    of_class = type.split(".")
    data = getattr(__import__(".".join(of_class[:-1]), fromlist=[of_class[-1]]), of_class[-1])
    return [n.literal("", text=",".join(data))], []


__all__ = (
    "CliTable",
    "literal_data",
)
PK�(�\���u.�.�,doc/alt-python-virtualenv/docs/changelog.rstnu�[���Release History
===============

.. include:: _draft.rst

.. towncrier release notes start

v20.13.0 (2022-01-02)
---------------------

Features - 20.13.0
~~~~~~~~~~~~~~~~~~
- Add downloaded wheel information in the relevant JSON embed file to
  prevent additional downloads of the same wheel. - by :user:`mayeut`. (`#2268 <https://github.com/pypa/virtualenv/issues/2268>`_)


v20.12.1 (2022-01-01)
---------------------

Bugfixes - 20.12.1
~~~~~~~~~~~~~~~~~~
- Try using previous updates of ``pip``, ``setuptools`` & ``wheel``
  when inside an update grace period rather than always falling back
  to embedded wheels - by :user:`mayeut`. (`#2265 <https://github.com/pypa/virtualenv/issues/2265>`_)
- New patch versions of ``pip``, ``setuptools`` & ``wheel`` are now
  returned in the expected timeframe. - by :user:`mayeut`. (`#2266 <https://github.com/pypa/virtualenv/issues/2266>`_)
- Manual upgrades of ``pip``, ``setuptools`` & ``wheel`` are
  not discarded by a periodic update - by :user:`mayeut`. (`#2267 <https://github.com/pypa/virtualenv/issues/2267>`_)


v20.12.0 (2021-12-31)
---------------------

Features - 20.12.0
~~~~~~~~~~~~~~~~~~
- Sign the python2 exe on Darwin arm64 - by :user:`tmspicer`. (`#2233 <https://github.com/pypa/virtualenv/issues/2233>`_)

Bugfixes - 20.12.0
~~~~~~~~~~~~~~~~~~
- Fix ``--download`` option - by :user:`mayeut`. (`#2120 <https://github.com/pypa/virtualenv/issues/2120>`_)
- Ugrade embedded setuptools to ``60.2.0`` from ``60.1.1`` - by :user:`gaborbernat`. (`#2263 <https://github.com/pypa/virtualenv/issues/2263>`_)


v20.11.2 (2021-12-29)
---------------------

Bugfixes - 20.11.2
~~~~~~~~~~~~~~~~~~
- Fix installation of pinned versions of ``pip``, ``setuptools`` & ``wheel`` - by :user:`mayeut`. (`#2203 <https://github.com/pypa/virtualenv/issues/2203>`_)


v20.11.1 (2021-12-29)
---------------------

Bugfixes - 20.11.1
~~~~~~~~~~~~~~~~~~
- Bump embed setuptools to ``60.1.1`` from ``60.1.0`` - by :user:`gaborbernat`. (`#2258 <https://github.com/pypa/virtualenv/issues/2258>`_)


v20.11.0 (2021-12-28)
---------------------

Features - 20.11.0
~~~~~~~~~~~~~~~~~~
- Avoid deprecation warning from py-filelock argument - by :user:`ofek`. (`#2237 <https://github.com/pypa/virtualenv/issues/2237>`_)
- Upgrade embedded setuptools to ``61.1.0`` from ``58.3.0`` - by :user:`gaborbernat`. (`#2240 <https://github.com/pypa/virtualenv/issues/2240>`_)
- Drop the runtime dependency of ``backports.entry-points-selectable`` - by :user:`hroncok`. (`#2246 <https://github.com/pypa/virtualenv/issues/2246>`_)
- Fish: PATH variables should not be quoted when being set - by :user:`hroncok`. (`#2248 <https://github.com/pypa/virtualenv/issues/2248>`_)


v20.10.0 (2021-11-01)
---------------------

Features - 20.10.0
~~~~~~~~~~~~~~~~~~
- If a ``"venv"`` install scheme exists in ``sysconfig``, virtualenv now uses it to create new virtual environments.
  This allows Python distributors, such as Fedora, to patch/replace the default install scheme without affecting
  the paths in new virtual environments.
  A similar technique `was proposed to Python, for the venv module <https://bugs.python.org/issue45413>`_ - by ``hroncok`` (`#2208 <https://github.com/pypa/virtualenv/issues/2208>`_)
- The activated virtualenv prompt is now always wrapped in parentheses. This
  affects venvs created with the ``--prompt`` attribute, and matches virtualenv's
  behaviour on par with venv. (`#2224 <https://github.com/pypa/virtualenv/issues/2224>`_)

Bugfixes - 20.10.0
~~~~~~~~~~~~~~~~~~
- Fix broken prompt set up by activate.bat - by :user:`SiggyBar`. (`#2225 <https://github.com/pypa/virtualenv/issues/2225>`_)


v20.9.0 (2021-10-23)
--------------------

Features - 20.9.0
~~~~~~~~~~~~~~~~~
- Special-case ``--prompt .`` to the name of the current directory - by :user:`rkm`. (`#2220 <https://github.com/pypa/virtualenv/issues/2220>`_)
- Add libffi-8.dll to pypy windows `#2218 <https://github.com/pypa/virtualenv/issues/2218>`_ - by :user:`mattip`

Bugfixes - 20.9.0
~~~~~~~~~~~~~~~~~
- Fixed path collision that could lead to a PermissionError or writing to system
  directories when using PyPy3.8 - by :user:`mgorny`. (`#2182 <https://github.com/pypa/virtualenv/issues/2182>`_)
- Upgrade embedded setuptools to ``58.3.0`` from ``58.1.0`` and pip to ``21.3.1`` from ``21.2.4`` - by
  :user:`gaborbernat`. (`#2205 <https://github.com/pypa/virtualenv/issues/2205>`_)
- Remove stray closing parenthesis in activate.bat - by :user:`SiggyBar`. (`#2221 <https://github.com/pypa/virtualenv/issues/2221>`_)


v20.8.1 (2021-09-24)
--------------------

Bugfixes - 20.8.1
~~~~~~~~~~~~~~~~~
- Fixed a bug where while creating a venv on top of an existing one, without cleaning, when seeded
  wheel version mismatch occurred, multiple ``.dist-info`` directories may be present, confounding entrypoint
  discovery - by :user:`arcivanov` (`#2185 <https://github.com/pypa/virtualenv/issues/2185>`_)
- Bump embed setuptools from ``58.0.4`` to ``58.1.0`` - by :user:`gaborbernat`. (`#2195 <https://github.com/pypa/virtualenv/issues/2195>`_)

Misc - 20.8.1
~~~~~~~~~~~~~
- `#2189 <https://github.com/pypa/virtualenv/issues/2189>`_


v20.8.0 (2021-09-16)
--------------------

* upgrade embedded setuptools to ``58.0.4`` from ``57.4.0`` and pip to ``21.2.4`` from ``21.2.3``
* Add nushell activation script

v20.7.2 (2021-08-10)
--------------------

Bugfixes - 20.7.2
~~~~~~~~~~~~~~~~~
- Upgrade embedded pip to ``21.2.3`` from ``21.2.2`` and wheel to ``0.37.0`` from ``0.36.2`` - by :user:`gaborbernat`. (`#2168 <https://github.com/pypa/virtualenv/issues/2168>`_)


v20.7.1 (2021-08-09)
--------------------

Bugfixes - 20.7.1
~~~~~~~~~~~~~~~~~
- Fix unpacking dictionary items in PythonInfo.install_path (`#2165 <https://github.com/pypa/virtualenv/issues/2165>`_)


v20.7.0 (2021-07-31)
--------------------

Bugfixes - 20.7.0
~~~~~~~~~~~~~~~~~
- upgrade embedded pip to ``21.2.2`` from ``21.1.3`` and setuptools to ``57.4.0`` from ``57.1.0`` - by :user:`gaborbernat` (`#2159 <https://github.com/pypa/virtualenv/issues/2159>`_)

Deprecations and Removals - 20.7.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Removed ``xonsh`` activator due to this breaking fairly often the CI and lack of support from those packages
  maintainers, upstream is encouraged to continue supporting the project as a
  `plugin <https://github.com/xonsh/xonsh/issues/3689>`_  - by :user:`gaborbernat`. (`#2160 <https://github.com/pypa/virtualenv/issues/2160>`_)


v20.6.0 (2021-07-14)
--------------------

Features - 20.6.0
~~~~~~~~~~~~~~~~~
- Support Python interpreters without ``distutils`` (fallback to ``syconfig`` in these cases) - by :user:`gaborbernat`. (`#1910 <https://github.com/pypa/virtualenv/issues/1910>`_)


v20.5.0 (2021-07-13)
--------------------

Features - 20.5.0
~~~~~~~~~~~~~~~~~
- Plugins now use 'selectable' entry points - by :user:`jaraco`. (`#2093 <https://github.com/pypa/virtualenv/issues/2093>`_)
- add libffi-7.dll to the hard-coded list of dlls for PyPy (`#2141 <https://github.com/pypa/virtualenv/issues/2141>`_)
- Use the better maintained ``platformdirs`` instead of ``appdirs`` - by :user:`gaborbernat`. (`#2142 <https://github.com/pypa/virtualenv/issues/2142>`_)

Bugfixes - 20.5.0
~~~~~~~~~~~~~~~~~
- Bump pip the embedded pip ``21.1.3`` and setuptools to ``57.1.0`` - by :user:`gaborbernat`. (`#2135 <https://github.com/pypa/virtualenv/issues/2135>`_)

Deprecations and Removals - 20.5.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Drop python ``3.4`` support as it has been over 2 years since EOL - by :user:`gaborbernat`. (`#2141 <https://github.com/pypa/virtualenv/issues/2141>`_)


v20.4.7 (2021-05-24)
--------------------

Bugfixes - 20.4.7
~~~~~~~~~~~~~~~~~
- Upgrade embedded pip to ``21.1.2`` and setuptools to ``57.0.0`` - by :user:`gaborbernat`. (`#2123 <https://github.com/pypa/virtualenv/issues/2123>`_)


v20.4.6 (2021-05-05)
--------------------

Bugfixes - 20.4.6
~~~~~~~~~~~~~~~~~
- Fix ``site.getsitepackages()`` broken on python2 on debian - by :user:`freundTech`. (`#2105 <https://github.com/pypa/virtualenv/issues/2105>`_)


v20.4.5 (2021-05-05)
--------------------

Bugfixes - 20.4.5
~~~~~~~~~~~~~~~~~
- Bump pip to ``21.1.1`` from ``21.0.1`` - by :user:`gaborbernat`. (`#2104 <https://github.com/pypa/virtualenv/issues/2104>`_)
- Fix ``site.getsitepackages()`` ignoring ``--system-site-packages`` on python2 - by :user:`freundTech`. (`#2106 <https://github.com/pypa/virtualenv/issues/2106>`_)


v20.4.4 (2021-04-20)
--------------------

Bugfixes - 20.4.4
~~~~~~~~~~~~~~~~~
- Built in discovery class is always preferred over plugin supplied classes. (`#2087 <https://github.com/pypa/virtualenv/issues/2087>`_)
- Upgrade embeded setuptools to ``56.0.0`` by :user:`gaborbernat`. (`#2094 <https://github.com/pypa/virtualenv/issues/2094>`_)


v20.4.3 (2021-03-16)
--------------------

Bugfixes - 20.4.3
~~~~~~~~~~~~~~~~~
- Bump embeded setuptools from ``52.0.0`` to ``54.1.2`` - by :user:`gaborbernat` (`#2069 <https://github.com/pypa/virtualenv/issues/2069>`_)
- Fix PyPy3 stdlib on Windows is incorrect - by :user:`gaborbernat`. (`#2071 <https://github.com/pypa/virtualenv/issues/2071>`_)


v20.4.2 (2021-02-01)
--------------------

Bugfixes - 20.4.2
~~~~~~~~~~~~~~~~~
- Running virtualenv ``--upgrade-embed-wheels`` crashes - by :user:`gaborbernat`. (`#2058 <https://github.com/pypa/virtualenv/issues/2058>`_)


v20.4.1 (2021-01-31)
--------------------

Bugfixes - 20.4.1
~~~~~~~~~~~~~~~~~
- Bump embedded pip and setuptools packages to latest upstream supported (``21.0.1`` and ``52.0.0``) - by :user:`gaborbernat`. (`#2060 <https://github.com/pypa/virtualenv/issues/2060>`_)


v20.4.0 (2021-01-19)
--------------------

Features - 20.4.0
~~~~~~~~~~~~~~~~~
- On the programmatic API allow passing in the environment variable dictionary to use, defaults to ``os.environ`` if not
  specified - by :user:`gaborbernat`. (`#2054 <https://github.com/pypa/virtualenv/issues/2054>`_)

Bugfixes - 20.4.0
~~~~~~~~~~~~~~~~~
- Upgrade embedded setuptools to ``51.3.3`` from ``51.1.2`` - by :user:`gaborbernat`. (`#2055 <https://github.com/pypa/virtualenv/issues/2055>`_)


v20.3.1 (2021-01-13)
--------------------

Bugfixes - 20.3.1
~~~~~~~~~~~~~~~~~
- Bump embed pip to ``20.3.3``, setuptools to ``51.1.1`` and wheel to ``0.36.2`` - by :user:`gaborbernat`. (`#2036 <https://github.com/pypa/virtualenv/issues/2036>`_)
- Allow unfunctioning of pydoc to fail freely so that virtualenvs can be
  activated under Zsh with set -e (since otherwise ``unset -f`` and
  ``unfunction`` exit with 1 if the function does not exist in Zsh) - by
  :user:`d125q`. (`#2049 <https://github.com/pypa/virtualenv/issues/2049>`_)
- Drop cached python information if the system executable is no longer present (for example when the executable is a
  shim and the mapped executable is replaced - such is the case with pyenv) - by :user:`gaborbernat`. (`#2050 <https://github.com/pypa/virtualenv/issues/2050>`_)


v20.3.0 (2021-01-10)
--------------------

Features - 20.3.0
~~~~~~~~~~~~~~~~~
- The builtin discovery takes now a ``--try-first-with`` argument and is first attempted as valid interpreters. One can
  use this to force discovery of a given python executable when the discovery order/mechanism raises errors -
  by :user:`gaborbernat`. (`#2046 <https://github.com/pypa/virtualenv/issues/2046>`_)

Bugfixes - 20.3.0
~~~~~~~~~~~~~~~~~
- On Windows python ``3.7+`` distributions where the exe shim is missing fallback to the old ways - by :user:`gaborbernat`. (`#1986 <https://github.com/pypa/virtualenv/issues/1986>`_)
- When discovering interpreters on Windows, via the PEP-514, prefer ``PythonCore`` releases over other ones. virtualenv
  is used via pip mostly by this distribution, so prefer it over other such as conda - by :user:`gaborbernat`. (`#2046 <https://github.com/pypa/virtualenv/issues/2046>`_)


v20.2.2 (2020-12-07)
--------------------

Bugfixes - 20.2.2
~~~~~~~~~~~~~~~~~
- Bump pip to ``20.3.1``, setuptools to ``51.0.0`` and wheel to ``0.36.1`` - by :user:`gaborbernat`. (`#2029 <https://github.com/pypa/virtualenv/issues/2029>`_)


v20.2.1 (2020-11-23)
--------------------

No significant changes.


v20.2.0 (2020-11-21)
--------------------

Features - 20.2.0
~~~~~~~~~~~~~~~~~
- Optionally skip VCS ignore directive for entire virtualenv directory, using option :option:`no-vcs-ignore`, by default ``False``. (`#2003 <https://github.com/pypa/virtualenv/issues/2003>`_)
- Add ``--read-only-app-data`` option to allow for creation based on an existing
  app data cache which is non-writable. This may be useful (for example) to
  produce a docker image where the app-data is pre-populated.

  .. code-block:: dockerfile

      ENV \
          VIRTUALENV_OVERRIDE_APP_DATA=/opt/virtualenv/cache \
          VIRTUALENV_SYMLINK_APP_DATA=1
      RUN virtualenv venv && rm -rf venv
      ENV VIRTUALENV_READ_ONLY_APP_DATA=1
      USER nobody
      # this virtualenv has symlinks into the read-only app-data cache
      RUN virtualenv /tmp/venv

  Patch by :user:`asottile`. (`#2009 <https://github.com/pypa/virtualenv/issues/2009>`_)

Bugfixes - 20.2.0
~~~~~~~~~~~~~~~~~
- Fix processing of the ``VIRTUALENV_PYTHON`` environment variable and make it
  multi-value as well (separated by comma) - by :user:`pneff`. (`#1998 <https://github.com/pypa/virtualenv/issues/1998>`_)


v20.1.0 (2020-10-25)
--------------------

Features - 20.1.0
~~~~~~~~~~~~~~~~~
- The python specification can now take one or more values, first found is used to create the virtual environment - by
  :user:`gaborbernat`. (`#1995 <https://github.com/pypa/virtualenv/issues/1995>`_)


v20.0.35 (2020-10-15)
---------------------

Bugfixes - 20.0.35
~~~~~~~~~~~~~~~~~~
- Bump embedded setuptools from ``50.3.0`` to ``50.3.1`` - by :user:`gaborbernat`. (`#1982 <https://github.com/pypa/virtualenv/issues/1982>`_)
- After importing virtualenv passing cwd to a subprocess calls breaks with ``invalid directory`` - by :user:`gaborbernat`. (`#1983 <https://github.com/pypa/virtualenv/issues/1983>`_)


v20.0.34 (2020-10-12)
---------------------

Bugfixes - 20.0.34
~~~~~~~~~~~~~~~~~~
- Align with venv module when creating virtual environments with builtin creator on Windows 3.7 and later
  - by :user:`gaborbernat`. (`#1782 <https://github.com/pypa/virtualenv/issues/1782>`_)
- Handle Cygwin path conversion in the activation script - by :user:`davidcoghlan`. (`#1969 <https://github.com/pypa/virtualenv/issues/1969>`_)


v20.0.33 (2020-10-04)
---------------------

Bugfixes - 20.0.33
~~~~~~~~~~~~~~~~~~
- Fix ``None`` type error in cygwin if POSIX path in dest - by :user:`danyeaw`. (`#1962 <https://github.com/pypa/virtualenv/issues/1962>`_)
- Fix Python 3.4 incompatibilities (added back to the CI) - by :user:`gaborbernat`. (`#1963 <https://github.com/pypa/virtualenv/issues/1963>`_)


v20.0.32 (2020-10-01)
---------------------

Bugfixes - 20.0.32
~~~~~~~~~~~~~~~~~~
- For activation scripts always use UNIX line endings (unless it's BATCH shell related) - by :user:`saytosid`. (`#1818 <https://github.com/pypa/virtualenv/issues/1818>`_)
- Upgrade embedded pip to ``20.2.1`` and setuptools to ``49.4.0`` - by :user:`gaborbernat`. (`#1918 <https://github.com/pypa/virtualenv/issues/1918>`_)
- Avoid spawning new windows when doing seed package upgrades in the background on Windows - by :user:`gaborbernat`. (`#1928 <https://github.com/pypa/virtualenv/issues/1928>`_)
- Fix a bug that reading and writing on the same file may cause race on multiple processes. (`#1938 <https://github.com/pypa/virtualenv/issues/1938>`_)
- Upgrade embedded setuptools to ``50.2.0`` and pip to ``20.2.3`` - by :user:`gaborbernat`. (`#1939 <https://github.com/pypa/virtualenv/issues/1939>`_)
- Provide correct path for bash activator in cygwin or msys2 - by :user:`danyeaw`. (`#1940 <https://github.com/pypa/virtualenv/issues/1940>`_)
- Relax importlib requirement to allow version<3 - by :user:`usamasadiq` (`#1953 <https://github.com/pypa/virtualenv/issues/1953>`_)
- pth files were not processed on CPython2 if $PYTHONPATH was pointing to site-packages/ - by :user:`navytux`. (`#1959 <https://github.com/pypa/virtualenv/issues/1959>`_) (`#1960 <https://github.com/pypa/virtualenv/issues/1960>`_)


v20.0.31 (2020-08-17)
---------------------

Bugfixes - 20.0.31
~~~~~~~~~~~~~~~~~~
- Upgrade embedded pip to ``20.2.1``, setuptools to ``49.6.0`` and wheel to ``0.35.1``  - by :user:`gaborbernat`. (`#1918 <https://github.com/pypa/virtualenv/issues/1918>`_)


v20.0.30 (2020-08-04)
---------------------

Bugfixes - 20.0.30
~~~~~~~~~~~~~~~~~~
- Upgrade pip to ``20.2.1`` and setuptools to ``49.2.1`` - by :user:`gaborbernat`. (`#1915 <https://github.com/pypa/virtualenv/issues/1915>`_)


v20.0.29 (2020-07-31)
---------------------

Bugfixes - 20.0.29
~~~~~~~~~~~~~~~~~~
- Upgrade embedded pip from version ``20.1.2`` to ``20.2`` - by :user:`gaborbernat`. (`#1909 <https://github.com/pypa/virtualenv/issues/1909>`_)


v20.0.28 (2020-07-24)
---------------------

Bugfixes - 20.0.28
~~~~~~~~~~~~~~~~~~
- Fix test suite failing if run from system Python - by :user:`gaborbernat`. (`#1882 <https://github.com/pypa/virtualenv/issues/1882>`_)
- Provide ``setup_logging`` flag to python API so that users can bypass logging handling if their application already
  performs this - by :user:`gaborbernat`. (`#1896 <https://github.com/pypa/virtualenv/issues/1896>`_)
- Use ``\n`` instead if ``\r\n`` as line separator for report (because Python already performs this transformation
  automatically upon write to the logging pipe) - by :user:`gaborbernat`. (`#1905 <https://github.com/pypa/virtualenv/issues/1905>`_)


v20.0.27 (2020-07-15)
---------------------

Bugfixes - 20.0.27
~~~~~~~~~~~~~~~~~~
- No longer preimport threading to fix support for `gpython <https://pypi.org/project/pygolang/#gpython>`_ and `gevent <https://www.gevent.org/>`_ - by :user:`navytux`. (`#1897 <https://github.com/pypa/virtualenv/issues/1897>`_)
- Upgrade setuptools from ``49.2.0`` on ``Python 3.5+`` - by :user:`gaborbernat`. (`#1898 <https://github.com/pypa/virtualenv/issues/1898>`_)


v20.0.26 (2020-07-07)
---------------------

Bugfixes - 20.0.26
~~~~~~~~~~~~~~~~~~
- Bump dependency ``distutils >= 0.3.1`` - by :user:`gaborbernat`. (`#1880 <https://github.com/pypa/virtualenv/issues/1880>`_)
- Improve periodic update handling:

  - better logging output while running and enable logging on background process call (
    ``_VIRTUALENV_PERIODIC_UPDATE_INLINE`` may be used to debug behaviour inline)
  - fallback to unverified context when querying the PyPi for release date,
  - stop downloading wheels once we reach the embedded version,

  by :user:`gaborbernat`. (`#1883 <https://github.com/pypa/virtualenv/issues/1883>`_)
- Do not print error message if the application exists with ``SystemExit(0)`` - by :user:`gaborbernat`. (`#1885 <https://github.com/pypa/virtualenv/issues/1885>`_)
- Upgrade embedded setuptools from ``47.3.1`` to ``49.1.0`` for Python ``3.5+`` - by :user:`gaborbernat`. (`#1887 <https://github.com/pypa/virtualenv/issues/1887>`_)


v20.0.25 (2020-06-23)
---------------------

Bugfixes - 20.0.25
~~~~~~~~~~~~~~~~~~
- Fix that when the ``app-data`` seeders image creation fails the exception is silently ignored. Avoid two virtual environment creations to step on each others toes by using a lock while creating the base images. By :user:`gaborbernat`. (`#1869 <https://github.com/pypa/virtualenv/issues/1869>`_)


v20.0.24 (2020-06-22)
---------------------

Features - 20.0.24
~~~~~~~~~~~~~~~~~~
- Ensure that the seeded packages do not get too much out of date:

  - add a CLI flag that triggers upgrade of embedded wheels under :option:`upgrade-embed-wheels`
  - periodically (once every 14 days) upgrade the embedded wheels in a background process, and use them if they have been
    released for more than 28 days (can be disabled via :option:`no-periodic-update`)

  More details under :ref:`wheels` - by :user:`gaborbernat`. (`#1821 <https://github.com/pypa/virtualenv/issues/1821>`_)
- Upgrade embed wheel content:

  - ship wheels for Python ``3.9`` and ``3.10``
  - upgrade setuptools for Python ``3.5+`` from ``47.1.1`` to ``47.3.1``

  by :user:`gaborbernat`. (`#1841 <https://github.com/pypa/virtualenv/issues/1841>`_)
- Display the installed seed package versions in the final summary output, for example:

  .. code-block:: console

      created virtual environment CPython3.8.3.final.0-64 in 350ms
        creator CPython3Posix(dest=/x, clear=True, global=False)
        seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/y/virtualenv)
          added seed packages: pip==20.1.1, setuptools==47.3.1, wheel==0.34.2

  by :user:`gaborbernat`. (`#1864 <https://github.com/pypa/virtualenv/issues/1864>`_)

Bugfixes - 20.0.24
~~~~~~~~~~~~~~~~~~
- Do not generate/overwrite ``.gitignore`` if it already exists at destination path - by :user:`gaborbernat`. (`#1862 <https://github.com/pypa/virtualenv/issues/1862>`_)
- Improve error message for no ``.dist-info`` inside the ``app-data`` copy seeder - by :user:`gaborbernat`. (`#1867 <https://github.com/pypa/virtualenv/issues/1867>`_)

Improved Documentation - 20.0.24
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- How seeding mechanisms discover (and automatically keep it up to date) wheels at :ref:`wheels` - by :user:`gaborbernat`. (`#1821 <https://github.com/pypa/virtualenv/issues/1821>`_)
- How distributions should handle shipping their own embedded wheels at  :ref:`distribution_wheels` - by :user:`gaborbernat`. (`#1840 <https://github.com/pypa/virtualenv/issues/1840>`_)


v20.0.23 (2020-06-12)
---------------------

Bugfixes - 20.0.23
~~~~~~~~~~~~~~~~~~
- Fix typo in ``setup.cfg`` - by :user:`RowdyHowell`. (`#1857 <https://github.com/pypa/virtualenv/issues/1857>`_)


v20.0.22 (2020-06-12)
---------------------

Bugfixes - 20.0.22
~~~~~~~~~~~~~~~~~~
- Relax ``importlib.resources`` requirement to also allow version 2 - by :user:`asottile`. (`#1846 <https://github.com/pypa/virtualenv/issues/1846>`_)
- Upgrade embedded setuptools to ``44.1.1`` for python 2 and ``47.1.1`` for python3.5+ - by :user:`gaborbernat`. (`#1855 <https://github.com/pypa/virtualenv/issues/1855>`_)


v20.0.21 (2020-05-20)
---------------------

Features - 20.0.21
~~~~~~~~~~~~~~~~~~
- Generate ignore file for version control systems to avoid tracking virtual environments by default. Users should
  remove these files if still want to track. For now we support only **git** by :user:`gaborbernat`. (`#1806 <https://github.com/pypa/virtualenv/issues/1806>`_)

Bugfixes - 20.0.21
~~~~~~~~~~~~~~~~~~
- Fix virtualenv fails sometimes when run concurrently, ``--clear-app-data`` conflicts with :option:`clear` flag when
  abbreviation is turned on. To bypass this while allowing abbreviated flags on the command line we had to move it to
  :option:`reset-app-data` - by :user:`gaborbernat`. (`#1824 <https://github.com/pypa/virtualenv/issues/1824>`_)
- Upgrade embedded ``setuptools`` to ``46.4.0`` from ``46.1.3`` on Python ``3.5+``, and ``pip`` from ``20.1`` to ``20.1.1`` - by :user:`gaborbernat`. (`#1827 <https://github.com/pypa/virtualenv/issues/1827>`_)
- Seeder pip now correctly handles ``--extra-search-dir`` - by :user:`frenzymadness`. (`#1834 <https://github.com/pypa/virtualenv/issues/1834>`_)


v20.0.20 (2020-05-04)
---------------------

Bugfixes - 20.0.20
~~~~~~~~~~~~~~~~~~
- Fix download fails with python 3.4 - by :user:`gaborbernat`. (`#1809 <https://github.com/pypa/virtualenv/issues/1809>`_)
- Fixes older CPython2 versions use ``_get_makefile_filename`` instead of ``get_makefile_filename`` on ``sysconfig`` - by :user:`ianw`. (`#1810 <https://github.com/pypa/virtualenv/issues/1810>`_)
- Fix download is ``True`` by default - by :user:`gaborbernat`. (`#1813 <https://github.com/pypa/virtualenv/issues/1813>`_)
- Fail ``app-data`` seed operation when wheel download fails and better error message - by :user:`gaborbernat`. (`#1814 <https://github.com/pypa/virtualenv/issues/1814>`_)


v20.0.19 (2020-05-03)
---------------------

Bugfixes - 20.0.19
~~~~~~~~~~~~~~~~~~
- Fix generating a Python 2 environment from Python 3 creates invalid python activator - by :user:`gaborbernat`. (`#1776 <https://github.com/pypa/virtualenv/issues/1776>`_)
- Fix pinning seed packages via ``app-data`` seeder raised ``Invalid Requirement`` - by :user:`gaborbernat`. (`#1779 <https://github.com/pypa/virtualenv/issues/1779>`_)
- Do not stop interpreter discovery if we fail to find the system interpreter for a executable during discovery
  - by :user:`gaborbernat`. (`#1781 <https://github.com/pypa/virtualenv/issues/1781>`_)
- On CPython2 POSIX platforms ensure ``syconfig.get_makefile_filename`` exists within the virtual environment (this is used by some c-extension based libraries - e.g. numpy - for building) - by :user:`gaborbernat`. (`#1783 <https://github.com/pypa/virtualenv/issues/1783>`_)
- Better handling of options :option:`copies` and :option:`symlinks`. Introduce priority of where the option is set
  to follow the order: CLI, env var, file, hardcoded. If both set at same level prefers copy over symlink. - by
  :user:`gaborbernat`. (`#1784 <https://github.com/pypa/virtualenv/issues/1784>`_)
- Upgrade pip for Python ``2.7`` and ``3.5+`` from ``20.0.2`` to ``20.1`` - by :user:`gaborbernat`. (`#1793 <https://github.com/pypa/virtualenv/issues/1793>`_)
- Fix CPython is not discovered from Windows registry, and discover pythons from Windows registry in decreasing order
  by version - by :user:`gaborbernat`. (`#1796 <https://github.com/pypa/virtualenv/issues/1796>`_)
- Fix symlink detection for creators - by :user:`asottile` (`#1803 <https://github.com/pypa/virtualenv/issues/1803>`_)


v20.0.18 (2020-04-16)
---------------------

Bugfixes - 20.0.18
~~~~~~~~~~~~~~~~~~
- Importing setuptools before cli_run could cause our python information query to fail due to setuptools patching
  ``distutils.dist.Distribution`` - by :user:`gaborbernat`. (`#1771 <https://github.com/pypa/virtualenv/issues/1771>`_)


v20.0.17 (2020-04-09)
---------------------

Features - 20.0.17
~~~~~~~~~~~~~~~~~~
- Extend environment variables checked for configuration to also check aliases (e.g. setting either
  ``VIRTUALENV_COPIES`` or ``VIRTUALENV_ALWAYS_COPY`` will work) - by :user:`gaborbernat`. (`#1763 <https://github.com/pypa/virtualenv/issues/1763>`_)


v20.0.16 (2020-04-04)
---------------------

Bugfixes - 20.0.16
~~~~~~~~~~~~~~~~~~
- Allow seed wheel files inside the :option:`extra-search-dir` folders that do not have ``Requires-Python``
  metadata specified, these are considered compatible with all python versions - by :user:`gaborbernat`. (`#1757 <https://github.com/pypa/virtualenv/issues/1757>`_)


v20.0.15 (2020-03-27)
---------------------

Features - 20.0.15
~~~~~~~~~~~~~~~~~~
- Upgrade embedded setuptools to ``46.1.3`` from ``46.1.1`` - by :user:`gaborbernat`. (`#1752 <https://github.com/pypa/virtualenv/issues/1752>`_)


v20.0.14 (2020-03-25)
---------------------

Features - 20.0.14
~~~~~~~~~~~~~~~~~~
- Remove ``__PYVENV_LAUNCHER__`` on macOs for Python ``3.7.(<8)`` and ``3.8.(<3)`` on interpreter startup via ``pth``
  file, this pulls in the `upstream patch <https://github.com/python/cpython/pull/9516>`_ - by :user:`gaborbernat`. (`#1704 <https://github.com/pypa/virtualenv/issues/1704>`_)
- Upgrade embedded setuptools for Python ``3.5+`` to ``46.1.1``, for Python ``2.7`` to ``44.1.0`` - by :user:`gaborbernat`. (`#1745 <https://github.com/pypa/virtualenv/issues/1745>`_)

Bugfixes - 20.0.14
~~~~~~~~~~~~~~~~~~
- Fix discovery of interpreter by name from ``PATH`` that does not match a spec format - by :user:`gaborbernat`. (`#1746 <https://github.com/pypa/virtualenv/issues/1746>`_)


v20.0.13 (2020-03-19)
---------------------

Bugfixes - 20.0.13
~~~~~~~~~~~~~~~~~~
- Do not fail when the pyc files is missing for the host Python 2 - by :user:`gaborbernat`. (`#1738 <https://github.com/pypa/virtualenv/issues/1738>`_)
- Support broken Packaging pythons that put the include headers under distutils pattern rather than sysconfig one
  - by :user:`gaborbernat`. (`#1739 <https://github.com/pypa/virtualenv/issues/1739>`_)


v20.0.12 (2020-03-19)
---------------------

Bugfixes - 20.0.12
~~~~~~~~~~~~~~~~~~
- Fix relative path discovery of interpreters - by :user:`gaborbernat`. (`#1734 <https://github.com/pypa/virtualenv/issues/1734>`_)


v20.0.11 (2020-03-18)
---------------------

Features - 20.0.11
~~~~~~~~~~~~~~~~~~
- Improve error message when the host python does not satisfy invariants needed to create virtual environments (now we
  print which host files are incompatible/missing and for which creators when no supported creator can be matched, however
  we found creators that can describe the given Python interpreter - will still print no supported creator for Jython,
  however print exactly what host files do not allow creation of virtual environments in case of CPython/PyPy)
  - by :user:`gaborbernat`. (`#1716 <https://github.com/pypa/virtualenv/issues/1716>`_)

Bugfixes - 20.0.11
~~~~~~~~~~~~~~~~~~
- Support Python 3 Framework distributed via XCode in macOs Catalina and before - by :user:`gaborbernat`. (`#1663 <https://github.com/pypa/virtualenv/issues/1663>`_)
- Fix Windows Store Python support, do not allow creation via symlink as that's not going to work by design
  - by :user:`gaborbernat`. (`#1709 <https://github.com/pypa/virtualenv/issues/1709>`_)
- Fix ``activate_this.py`` throws ``AttributeError`` on Windows when virtual environment was created via cross python
  mechanism - by :user:`gaborbernat`. (`#1710 <https://github.com/pypa/virtualenv/issues/1710>`_)
- Fix ``--no-pip``, ``--no-setuptools``, ``--no-wheel`` not being respected - by :user:`gaborbernat`. (`#1712 <https://github.com/pypa/virtualenv/issues/1712>`_)
- Allow missing ``.py`` files if a compiled ``.pyc`` version is available - by :user:`tucked`. (`#1714 <https://github.com/pypa/virtualenv/issues/1714>`_)
- Do not fail if the distutils/setuptools patch happens on a C-extension loader (such as ``zipimporter`` on Python 3.7 or
  earlier) - by :user:`gaborbernat`. (`#1715 <https://github.com/pypa/virtualenv/issues/1715>`_)
- Support Python 2 implementations that require the landmark files and ``site.py`` to be in platform standard library
  instead of the standard library path of the virtual environment (notably some RHEL ones, such as the Docker
  image ``amazonlinux:1``) - by :user:`gaborbernat`. (`#1719 <https://github.com/pypa/virtualenv/issues/1719>`_)
- Allow the test suite to pass even when called with the system Python - to help repackaging of the tool for Linux
  distributions -  by :user:`gaborbernat`. (`#1721 <https://github.com/pypa/virtualenv/issues/1721>`_)
- Also generate ``pipx.y`` console script beside ``pip-x.y`` to be compatible with how pip installs itself -
  by :user:`gaborbernat`. (`#1723 <https://github.com/pypa/virtualenv/issues/1723>`_)
- Automatically create the application data folder if it does not exists - by :user:`gaborbernat`. (`#1728 <https://github.com/pypa/virtualenv/issues/1728>`_)

Improved Documentation - 20.0.11
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :ref:`supports <compatibility-requirements>` details now explicitly what Python installations we support
  - by :user:`gaborbernat`. (`#1714 <https://github.com/pypa/virtualenv/issues/1714>`_)


v20.0.10 (2020-03-10)
---------------------

Bugfixes - 20.0.10
~~~~~~~~~~~~~~~~~~
- Fix acquiring python information might be altered by distutils configuration files generating incorrect layout virtual
  environments - by :user:`gaborbernat`. (`#1663 <https://github.com/pypa/virtualenv/issues/1663>`_)
- Upgrade embedded setuptools to ``46.0.0`` from ``45.3.0`` on Python ``3.5+`` - by :user:`gaborbernat`. (`#1702 <https://github.com/pypa/virtualenv/issues/1702>`_)

Improved Documentation - 20.0.10
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Document requirements (pip + index server) when installing via pip under the installation section - by
  :user:`gaborbernat`. (`#1618 <https://github.com/pypa/virtualenv/issues/1618>`_)
- Document installing from non PEP-518 systems - :user:`gaborbernat`. (`#1619 <https://github.com/pypa/virtualenv/issues/1619>`_)
- Document installing latest unreleased version from Github - :user:`gaborbernat`. (`#1620 <https://github.com/pypa/virtualenv/issues/1620>`_)


v20.0.9 (2020-03-08)
--------------------

Bugfixes - 20.0.9
~~~~~~~~~~~~~~~~~
- ``pythonw.exe`` works as ``python.exe`` on Windows - by :user:`gaborbernat`. (`#1686 <https://github.com/pypa/virtualenv/issues/1686>`_)
- Handle legacy loaders for virtualenv import hooks used to patch distutils configuration load - by :user:`gaborbernat`. (`#1690 <https://github.com/pypa/virtualenv/issues/1690>`_)
- Support for python 2 platforms that store landmark files in ``platstdlib`` over ``stdlib`` (e.g. RHEL) - by
  :user:`gaborbernat`. (`#1694 <https://github.com/pypa/virtualenv/issues/1694>`_)
- Upgrade embedded setuptools to ``45.3.0`` from ``45.2.0`` for Python ``3.5+``  - by :user:`gaborbernat`. (`#1699 <https://github.com/pypa/virtualenv/issues/1699>`_)


v20.0.8 (2020-03-04)
--------------------

Bugfixes - 20.0.8
~~~~~~~~~~~~~~~~~
- Having `distutils configuration <https://docs.python.org/3/install/index.html#distutils-configuration-files>`_
  files that set ``prefix`` and ``install_scripts`` cause installation of packages in the wrong location -
  by :user:`gaborbernat`. (`#1663 <https://github.com/pypa/virtualenv/issues/1663>`_)
- Fix ``PYTHONPATH`` being overridden on Python 2 — by :user:`jd`. (`#1673 <https://github.com/pypa/virtualenv/issues/1673>`_)
- Fix list configuration value parsing from config file or environment variable - by :user:`gaborbernat`. (`#1674 <https://github.com/pypa/virtualenv/issues/1674>`_)
- Fix Batch activation script shell prompt to display environment name by default - by :user:`spetafree`. (`#1679 <https://github.com/pypa/virtualenv/issues/1679>`_)
- Fix startup on Python 2 is slower for virtualenv - this was due to setuptools calculating it's working set distribution
  - by :user:`gaborbernat`. (`#1682 <https://github.com/pypa/virtualenv/issues/1682>`_)
- Fix entry points are not populated for editable installs on Python 2 due to setuptools working set being calculated
  before ``easy_install.pth`` runs - by :user:`gaborbernat`. (`#1684 <https://github.com/pypa/virtualenv/issues/1684>`_)
- Fix ``attr:`` import fails for setuptools - by :user:`gaborbernat`. (`#1685 <https://github.com/pypa/virtualenv/issues/1685>`_)


v20.0.7 (2020-02-26)
--------------------

Bugfixes - 20.0.7
~~~~~~~~~~~~~~~~~
- Disable distutils fixup for python 3 until `pypa/pip #7778 <https://github.com/pypa/pip/issues/7778>`_ is fixed and
  released - by :user:`gaborbernat`. (`#1669 <https://github.com/pypa/virtualenv/issues/1669>`_)


v20.0.6 (2020-02-26)
--------------------

Bugfixes - 20.0.6
~~~~~~~~~~~~~~~~~
- Fix global site package always being added with bundled macOs python framework builds - by :user:`gaborbernat`. (`#1561 <https://github.com/pypa/virtualenv/issues/1561>`_)
- Fix generated scripts use host version info rather than target - by :user:`gaborbernat`. (`#1600 <https://github.com/pypa/virtualenv/issues/1600>`_)
- Fix circular prefix reference with single elements (accept these as if they were system executables, print a info about
  them referencing themselves) - by :user:`gaborbernat`. (`#1632 <https://github.com/pypa/virtualenv/issues/1632>`_)
- Handle the case when the application data folder is read-only:

  - the application data folder is now controllable via :option:`app-data`,
  - ``clear-app-data`` now cleans the entire application data folder, not just the ``app-data`` seeder path,
  - check if the application data path passed in does not exist or is read-only, and fallback to a temporary directory,
  - temporary directory application data is automatically cleaned up at the end of execution,
  - :option:`symlink-app-data` is always ``False`` when the application data is temporary

  by :user:`gaborbernat`. (`#1640 <https://github.com/pypa/virtualenv/issues/1640>`_)
- Fix PyPy 2 builtin modules are imported from standard library, rather than from builtin  - by :user:`gaborbernat`. (`#1652 <https://github.com/pypa/virtualenv/issues/1652>`_)
- Fix creation of entry points when path contains spaces - by :user:`nsoranzo`. (`#1660 <https://github.com/pypa/virtualenv/issues/1660>`_)
- Fix relative paths for the zipapp (for python ``3.7+``) - by :user:`gaborbernat`. (`#1666 <https://github.com/pypa/virtualenv/issues/1666>`_)

v20.0.5 (2020-02-21)
--------------------

Features - 20.0.5
~~~~~~~~~~~~~~~~~
- Also create ``pythonX.X`` executables when creating pypy virtualenvs - by :user:`asottile` (`#1612 <https://github.com/pypa/virtualenv/issues/1612>`_)
- Fail with better error message if trying to install source with unsupported ``setuptools``, allow ``setuptools-scm >= 2``
  and move to legacy ``setuptools-scm`` format to support better older platforms (``CentOS 7`` and such) - by :user:`gaborbernat`. (`#1621 <https://github.com/pypa/virtualenv/issues/1621>`_)
- Report of the created virtual environment is now split across four short lines rather than one long - by :user:`gaborbernat` (`#1641 <https://github.com/pypa/virtualenv/issues/1641>`_)

Bugfixes - 20.0.5
~~~~~~~~~~~~~~~~~
- Add macOs Python 2 Framework support (now we test it with the CI via brew) - by :user:`gaborbernat` (`#1561 <https://github.com/pypa/virtualenv/issues/1561>`_)
- Fix losing of libpypy-c.so when the pypy executable is a symlink - by :user:`asottile` (`#1614 <https://github.com/pypa/virtualenv/issues/1614>`_)
- Discover python interpreter in a case insensitive manner - by :user:`PrajwalM2212` (`#1624 <https://github.com/pypa/virtualenv/issues/1624>`_)
- Fix cross interpreter support when the host python sets ``sys.base_executable`` based on ``__PYVENV_LAUNCHER__`` -
  by :user:`cjolowicz` (`#1643 <https://github.com/pypa/virtualenv/issues/1643>`_)


v20.0.4 (2020-02-14)
--------------------

Features - 20.0.4
~~~~~~~~~~~~~~~~~
- When aliasing interpreters, use relative symlinks - by :user:`asottile`. (`#1596 <https://github.com/pypa/virtualenv/issues/1596>`_)

Bugfixes - 20.0.4
~~~~~~~~~~~~~~~~~
- Allow the use of ``/`` as pathname component separator on Windows - by ``vphilippon`` (`#1582 <https://github.com/pypa/virtualenv/issues/1582>`_)
- Lower minimal version of six required to 1.9 - by ``ssbarnea`` (`#1606 <https://github.com/pypa/virtualenv/issues/1606>`_)


v20.0.3 (2020-02-12)
--------------------

Bugfixes - 20.0.3
~~~~~~~~~~~~~~~~~
- On Python 2 with Apple Framework builds the global site package is no longer added when the
  :option:`system-site-packages` is not specified - by :user:`gaborbernat`. (`#1561 <https://github.com/pypa/virtualenv/issues/1561>`_)
- Fix system python discovery mechanism when prefixes contain relative parts (e.g. ``..``) by resolving paths within the
  python information query - by :user:`gaborbernat`. (`#1583 <https://github.com/pypa/virtualenv/issues/1583>`_)
- Expose a programmatic API as ``from virtualenv import cli_run`` - by :user:`gaborbernat`. (`#1585 <https://github.com/pypa/virtualenv/issues/1585>`_)
- Fix ``app-data`` :option:`seeder` injects a extra ``.dist-info.virtualenv`` path that breaks ``importlib.metadata``,
  now we inject an extra ``.virtualenv`` - by :user:`gaborbernat`. (`#1589 <https://github.com/pypa/virtualenv/issues/1589>`_)

Improved Documentation - 20.0.3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Document a programmatic API as ``from virtualenv import cli_run`` under :ref:`programmatic_api` -
  by :user:`gaborbernat`. (`#1585 <https://github.com/pypa/virtualenv/issues/1585>`_)


v20.0.2 (2020-02-11)
--------------------

Features - 20.0.2
~~~~~~~~~~~~~~~~~
- Print out a one line message about the created virtual environment when no :option:`verbose` is set, this can now be
  silenced to get back the original behaviour via the :option:`quiet` flag - by :user:`pradyunsg`. (`#1557 <https://github.com/pypa/virtualenv/issues/1557>`_)
- Allow virtualenv's app data cache to be overridden by ``VIRTUALENV_OVERRIDE_APP_DATA`` - by :user:`asottile`. (`#1559 <https://github.com/pypa/virtualenv/issues/1559>`_)
- Passing in the virtual environment name/path is now required (no longer defaults to ``venv``) - by :user:`gaborbernat`. (`#1568 <https://github.com/pypa/virtualenv/issues/1568>`_)
- Add a CLI flag :option:`with-traceback` that allows displaying the stacktrace of the virtualenv when a failure occurs
  - by :user:`gaborbernat`. (`#1572 <https://github.com/pypa/virtualenv/issues/1572>`_)

Bugfixes - 20.0.2
~~~~~~~~~~~~~~~~~
- Support long path names for generated virtual environment console entry points (such as ``pip``) when using the
  ``app-data`` :option:`seeder` - by :user:`gaborbernat`. (`#997 <https://github.com/pypa/virtualenv/issues/997>`_)
- Improve python discovery mechanism:

  - do not fail if there are executables that fail to query (e.g. for not having execute access to it) on the ``PATH``,
  - beside the prefix folder also try with the platform dependent binary folder within that,

  by :user:`gaborbernat`. (`#1545 <https://github.com/pypa/virtualenv/issues/1545>`_)
- When copying (either files or trees) do not copy the permission bits, last access time, last modification time, and
  flags as access to these might be forbidden (for example in case of the macOs Framework Python) and these are not needed
  for the user to use the virtual environment - by :user:`gaborbernat`. (`#1561 <https://github.com/pypa/virtualenv/issues/1561>`_)
- While discovering a python executables interpreters that cannot be queried are now displayed with info level rather
  than warning, so now they're no longer shown by default (these can be just executables to which we don't have access
  or that are broken, don't warn if it's not the target Python we want) - by :user:`gaborbernat`. (`#1574 <https://github.com/pypa/virtualenv/issues/1574>`_)
- The ``app-data`` :option:`seeder` no longer symlinks the packages on UNIX and copies on Windows. Instead by default
  always copies, however now has the :option:`symlink-app-data` flag allowing users to request this less robust but faster
  method - by :user:`gaborbernat`. (`#1575 <https://github.com/pypa/virtualenv/issues/1575>`_)

Improved Documentation - 20.0.2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Add link to the `legacy documentation <https://virtualenv.pypa.io/en/legacy>`_ for the changelog by :user:`jezdez`. (`#1547 <https://github.com/pypa/virtualenv/issues/1547>`_)
- Fine tune the documentation layout: default width of theme, allow tables to wrap around, soft corners for code snippets
  - by :user:`pradyunsg`. (`#1548 <https://github.com/pypa/virtualenv/issues/1548>`_)


v20.0.1 (2020-02-10)
--------------------

Features - 20.0.1
~~~~~~~~~~~~~~~~~
- upgrade embedded setuptools to ``45.2.0`` from ``45.1.0`` for Python ``3.4+`` - by :user:`gaborbernat`. (`#1554 <https://github.com/pypa/virtualenv/issues/1554>`_)

Bugfixes - 20.0.1
~~~~~~~~~~~~~~~~~
- Virtual environments created via relative path on Windows creates bad console executables - by :user:`gaborbernat`. (`#1552 <https://github.com/pypa/virtualenv/issues/1552>`_)
- Seems sometimes venvs created set their base executable to themselves; we accept these without question, so we handle
  virtual environments as system pythons causing issues - by :user:`gaborbernat`. (`#1553 <https://github.com/pypa/virtualenv/issues/1553>`_)


v20.0.0. (2020-02-10)
---------------------

Improved Documentation - 20.0.0.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Fixes typos, repeated words and inconsistent heading spacing. Rephrase parts of the development documentation and CLI
  documentation. Expands shorthands like ``env var`` and ``config`` to their full forms. Uses descriptions from respective
  documentation, for projects listed in ``related links`` - by :user:`pradyunsg`. (`#1540 <https://github.com/pypa/virtualenv/issues/1540>`_)

v20.0.0b2 (2020-02-04)
----------------------

Features - 20.0.0b2
~~~~~~~~~~~~~~~~~~~
- Improve base executable discovery mechanism:

  - print at debug level why we refuse some candidates,
  - when no candidates match exactly, instead of hard failing fallback to the closest match where the priority of
    matching attributes is: python implementation, major version, minor version, architecture, patch version,
    release level and serial (this is to facilitate things to still work when the OS upgrade replace/upgrades the system
    python with a never version, than what the virtualenv host python was created with),
  - always resolve system_executable information during the interpreter discovery, and the discovered environment is the
    system interpreter instead of the venv/virtualenv (this happened before lazily the first time we accessed, and caused
    reporting that the created virtual environment is of type of the virtualenv host python version, instead of the
    system pythons version - these two can differ if the OS upgraded the system python underneath and the virtualenv
    host was created via copy),

  by :user:`gaborbernat`. (`#1515 <https://github.com/pypa/virtualenv/issues/1515>`_)
- Generate ``bash`` and ``fish`` activators on Windows too (as these can be available with git bash, cygwin or mysys2)
  - by :user:`gaborbernat`. (`#1527 <https://github.com/pypa/virtualenv/issues/1527>`_)
- Upgrade the bundled ``wheel`` package from ``0.34.0`` to ``0.34.2`` - by :user:`gaborbernat`. (`#1531 <https://github.com/pypa/virtualenv/issues/1531>`_)

Bugfixes - 20.0.0b2
~~~~~~~~~~~~~~~~~~~
- Bash activation script should have no extensions instead of ``.sh`` (this fixes the :pypi:`virtualenvwrapper`
  integration) - by :user:`gaborbernat`. (`#1508 <https://github.com/pypa/virtualenv/issues/1508>`_)
- Show less information when we run with a single verbosity (``-v``):

  - no longer shows accepted interpreters information (as the last proposed one is always the accepted one),
  - do not display the ``str_spec`` attribute for ``PythonSpec`` as these can be deduced from the other attributes,
  - for the ``app-data`` seeder do not show the type of lock, only the path to the app data directory,

  By :user:`gaborbernat`. (`#1510 <https://github.com/pypa/virtualenv/issues/1510>`_)
- Fixed cannot discover a python interpreter that has already been discovered under a different path (such is the case
  when we have multiple symlinks to the same interpreter) - by :user:`gaborbernat`. (`#1512 <https://github.com/pypa/virtualenv/issues/1512>`_)
- Support relative paths for ``-p`` - by :user:`gaborbernat`. (`#1514 <https://github.com/pypa/virtualenv/issues/1514>`_)
- Creating virtual environments in parallel fail with cannot acquire lock within app data - by :user:`gaborbernat`. (`#1516 <https://github.com/pypa/virtualenv/issues/1516>`_)
- pth files were not processed under Debian CPython2 interpreters - by :user:`gaborbernat`. (`#1517 <https://github.com/pypa/virtualenv/issues/1517>`_)
- Fix prompt not displayed correctly with upcoming fish 3.10 due to us not preserving ``$pipestatus`` - by
  :user:`krobelus`. (`#1530 <https://github.com/pypa/virtualenv/issues/1530>`_)
- Stable order within ``pyenv.cfg`` and add ``include-system-site-packages`` only for creators that reference a global
  Python - by user:`gaborbernat`. (`#1535 <https://github.com/pypa/virtualenv/issues/1535>`_)

Improved Documentation - 20.0.0b2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Create the first iteration of the new documentation - by :user:`gaborbernat`. (`#1465 <https://github.com/pypa/virtualenv/issues/1465>`_)
- Project readme is now of type MarkDown instead of reStructuredText - by :user:`gaborbernat`. (`#1531 <https://github.com/pypa/virtualenv/issues/1531>`_)


v20.0.0b1 (2020-01-28)
----------------------

* First public release of the rewrite. Everything is brand new and just added.
* ``--download`` defaults to ``False``

.. warning::

   The current virtualenv is the second iteration of implementation. From version ``0.8`` all the way to ``16.7.9``
   we numbered the first iteration. Version ``20.0.0b1`` is a complete rewrite of the package, and as such this release
   history starts from there. The old changelog is still available in the
   `legacy branch documentation <https://virtualenv.pypa.io/en/legacy/changes.html>`_.
PK�(�\�t0��/doc/alt-python-virtualenv/docs/installation.rstnu�[���Installation
============

via pipx
--------

:pypi:`virtualenv` is a CLI tool that needs a Python interpreter to run. If you already have a ``Python 3.5+``
interpreter the best is to use :pypi:`pipx` to install virtualenv into an isolated environment. This has the added
benefit that later you'll be able to upgrade virtualenv without affecting other parts of the system.

.. code-block:: console

    pipx install virtualenv
    virtualenv --help

via pip
-------

Alternatively you can install it within the global Python interpreter itself (perhaps as a user package via the
``--user`` flag). Be cautious if you are using a python install that is managed by your operating system or
another package manager. ``pip`` might not coordinate with those tools, and may leave your system in an
inconsistent state. Note, if you go down this path you need to ensure pip is new enough per the subsections below:

.. code-block:: console

    python -m pip install --user virtualenv
    python -m virtualenv --help

wheel
~~~~~
Installing virtualenv via a wheel (default with pip) requires an installer that can understand the ``python-requires``
tag (see `PEP-503 <https://www.python.org/dev/peps/pep-0503/>`_), with pip this is version ``9.0.0`` (released 2016
November). Furthermore, in case you're not installing it via the PyPi you need to be using a mirror that correctly
forwards the ``python-requires`` tag (notably the OpenStack mirrors don't do this, or older
`devpi <https://github.com/devpi/devpi>`_ versions - added with version ``4.7.0``).

.. _sdist:

sdist
~~~~~
When installing via a source distribution you need an installer that handles the
`PEP-517 <https://www.python.org/dev/peps/pep-0517/>`_ specification. In case of ``pip`` this is version ``18.0.0`` or
later (released on 2018 July). If you cannot upgrade your pip to support this you need to ensure that the build
requirements from `pyproject.toml <https://github.com/pypa/virtualenv/blob/main/pyproject.toml#L2>`_ are satisfied
before triggering the install.

via zipapp
----------

You can use virtualenv without installing it too. We publish a Python
`zipapp <https://docs.python.org/3/library/zipapp.html>`_, you can just download this from
`https://bootstrap.pypa.io/virtualenv.pyz <https://bootstrap.pypa.io/virtualenv.pyz>`_ and invoke this package
with a python interpreter:

.. code-block:: console

    python virtualenv.pyz --help

The root level zipapp is always the current latest release. To get the last supported zipapp against a given python
minor release use the link ``https://bootstrap.pypa.io/virtualenv/x.y/virtualenv.pyz``, e.g. for the last virtualenv
supporting Python 2.7 use
`https://bootstrap.pypa.io/virtualenv/2.7/virtualenv.pyz <https://bootstrap.pypa.io/virtualenv/2.7/virtualenv.pyz>`_.

If you are looking for past version of virtualenv.pyz they are available here:
https://github.com/pypa/get-virtualenv/blob/<virtualenv version>/public/<python version>/virtualenv.pyz?raw=true

via ``setup.py``
----------------
We don't recommend and officially support this method. One should prefer using an installer that supports
`PEP-517 <https://www.python.org/dev/peps/pep-0517/>`_ interface, such as pip ``19.0.0`` or later. That being said you
might be able to still install a package via this method if you satisfy build dependencies before calling the install
command (as described under :ref:`sdist`).

latest unreleased
-----------------
Installing an unreleased version is discouraged and should be only done for testing purposes. If you do so you'll need
a pip version of at least ``18.0.0`` and use the following command:


.. code-block:: console

    pip install git+https://github.com/pypa/virtualenv.git@main

.. _compatibility-requirements:

Python and OS Compatibility
---------------------------

virtualenv works with the following Python interpreter implementations:

- `CPython <https://www.python.org/>`_ versions 2.7, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10
- `PyPy <https://pypy.org/>`_ 2.7 and 3.5+.

This means virtualenv works on the latest patch version of each of these minor versions. Previous patch versions are
supported on a best effort approach.

CPython is shipped in multiple forms, and each OS repackages it, often applying some customization along the way.
Therefore we cannot say universally that we support all platforms, but rather specify some we test against. In case
of ones not specified here the support is unknown, though likely will work. If you find some cases please open a feature
request on our issue tracker.

Linux
~~~~~
- installations from `python.org <https://www.python.org/downloads/>`_
- Ubuntu 16.04+ (both upstream and `deadsnakes <https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa>`_ builds)
- Fedora
- RHEL and CentOS
- OpenSuse
- Arch Linux

macOS
~~~~~
In case of macOS we support:

- installations from `python.org <https://www.python.org/downloads/>`_
- python versions installed via `brew <https://docs.brew.sh/Homebrew-and-Python>`_ (both older python2.7 and python3)
- Python 3 part of XCode (Python framework - ``/Library/Frameworks/Python3.framework/``)
- Python 2 part of the OS (``/System/Library/Frameworks/Python.framework/Versions/``)

Windows
~~~~~~~
- Installations from `python.org <https://www.python.org/downloads/>`_
- Windows Store Python - note only `version 3.7+ <https://www.microsoft.com/en-us/p/python-38/9mssztt1n39l>`_

Packaging variants
~~~~~~~~~~~~~~~~~~
- Normal variant (file structure as comes from `python.org <https://www.python.org/downloads/>`_).
- We support CPython 2 system installations that do not contain the python files for the standard library if the
  respective compiled files are present (e.g. only ``os.pyc``, not ``os.py``). This can be used by custom systems may
  want to maximize available storage or obfuscate source code by removing ``.py`` files.
PK�(�\s�$=
=
0doc/alt-python-virtualenv/docs/cli_interface.rstnu�[���CLI interface
=============

.. _cli_flags:

CLI flags
~~~~~~~~~

``virtualenv`` is primarily a command line application.

It modifies the environment variables in a shell to create an isolated Python environment, so you'll need to have a
shell to run it. You can type in ``virtualenv`` (name of the application) followed by flags that control its
behaviour. All options have sensible defaults, and there's one required argument: then name/path of the virtual
environment to create. The default values for the command line options can be overridden via the
:ref:`conf_file` or :ref:`env_vars`. Environment variables takes priority over the configuration file values
(``--help`` will show if a default comes from the environment variable as the help message will end in this case
with environment variables or the configuration file).

The options that can be passed to virtualenv, along with their default values and a short description are listed below.

:command:`virtualenv [OPTIONS]`

.. table_cli::
   :module: virtualenv.run
   :func: build_parser_only

Defaults
~~~~~~~~

.. _conf_file:

Configuration file
^^^^^^^^^^^^^^^^^^

virtualenv looks for a standard ini configuration file. The exact location depends on the operating system you're using,
as determined by :pypi:`platformdirs` application configuration definition. The configuration file location is printed as at
the end of the output when ``--help`` is passed.

The keys of the settings are derived from the command line option (left strip the ``-`` characters, and replace ``-``
with ``_``). Where multiple flags are available first found wins (where order is as it shows up under the ``--help``).

For example, :option:`--python <python>` would be specified as:

.. code-block:: ini

  [virtualenv]
  python = /opt/python-3.8/bin/python

Options that take multiple values, like :option:`extra-search-dir` can be specified as:

.. code-block:: ini

  [virtualenv]
  extra_search_dir =
      /path/to/dists
      /path/to/other/dists

.. _env_vars:

Environment Variables
^^^^^^^^^^^^^^^^^^^^^

Default values may be also specified via environment variables. The keys of the settings are derived from the
command line option (left strip the ``-`` characters, and replace ``-`` with ``_``, finally capitalize the name). Where
multiple flags are available first found wins (where order is as it shows up under the ``--help``).

For example, to use a custom Python binary, instead of the one virtualenv is run with, you can set the environment
variable ``VIRTUALENV_PYTHON`` like:

.. code-block:: console

   env VIRTUALENV_PYTHON=/opt/python-3.8/bin/python virtualenv

Where the option accepts multiple values, for example for :option:`python` or
:option:`extra-search-dir`, the values can be separated either by literal
newlines or commas. Newlines and commas can not be mixed and if both are
present only the newline is used for separating values. Examples for multiple
values:


.. code-block:: console

   env VIRTUALENV_PYTHON=/opt/python-3.8/bin/python,python3.8 virtualenv
   env VIRTUALENV_EXTRA_SEARCH_DIR=/path/to/dists\n/path/to/other/dists virtualenv

The equivalent CLI-flags based invocation for the above examples would be:

.. code-block:: console

   virtualenv --python=/opt/python-3.8/bin/python --python=python3.8
   virtualenv --extra-search-dir=/path/to/dists --extra-search-dir=/path/to/other/dists
PK�(�\6Cn�8doc/alt-python-virtualenv/docs/changelog/bugfix.2269.rstnu�[���Fix ``AttributeError: 'bool' object has no attribute 'error'`` when creating a
Python 2.x virtualenv on macOS - by ``moreati``
PK�(�\?�-�PP5doc/alt-python-virtualenv/docs/changelog/examples.rstnu�[���.. examples for changelog entries adding to your Pull Requests

file ``544.doc.rst``::

    explain everything much better - by ``passionate_technicalwriter``

file ``544.feature.rst``::

    ``tox --version`` now shows information about all registered plugins - by ``obestwalter``


file ``571.bugfix.rst``::

    ``skip_install`` overrides ``usedevelop`` (``usedevelop`` is an option to choose the
    installation type if the package is installed and ``skip_install`` determines if it should be
    installed at all) - by ``ferdonline``

.. see pyproject.toml for all available categories
PK�(�\�,�;;8doc/alt-python-virtualenv/docs/changelog/template.jinja2nu�[���{% set top_underline = underlines[0] %}
{% if versiondata.name %}
v{{ versiondata.version }} ({{ versiondata.date }})
{{ top_underline * ((versiondata.version + versiondata.date)|length + 4)}}
{% else %}
{{ versiondata.version }} ({{ versiondata.date }})
{{ top_underline * ((versiondata.version + versiondata.date)|length + 3)}}
{% endif %}

{% for section, _ in sections.items() %}
{% set underline = underlines[1] %}
{% if sections[section] %}
{% for category, val in definitions.items() if category in sections[section]%}
{{ definitions[category]['name'] }} - {{ versiondata.version }}
{{ underline * ((definitions[category]['name']  + versiondata.version)|length + 3)}}
{% if definitions[category]['showcontent'] %}
{% for text, values in sections[section][category].items() %}
- {{ text }} ({{ values|join(', ') }})
{% endfor %}

{% else %}
- {{ sections[section][category]['']|join(', ') }}

{% endif %}
{% if sections[section][category]|length == 0 %}
No significant changes.

{% else %}
{% endif %}
{% endfor %}
{% else %}
No significant changes.


{% endif %}
{% endfor %}
PK�(�\�E�8doc/alt-python-virtualenv/docs/changelog/bugfix.2271.rstnu�[���Fix ``PermissionError: [Errno 1] Operation not permitted`` when creating a
Python 2.x virtualenv on macOS/arm64 - by ``moreati``
PK�(�\ȓ�`==-doc/alt-python-virtualenv/docs/user_guide.rstnu�[���User Guide
==========

Introduction
------------

Virtualenv has one basic command:

.. code-block:: console

    virtualenv venv

This will create a python virtual environment of the same version as virtualenv, installed into the subdirectory
``venv``. The command line tool has quite a few of flags that modify the tool's behaviour, for a
full list make sure to check out :ref:`cli_flags`.

The tool works in two phases:

- **Phase 1** discovers a python interpreter to create a virtual environment from (by default this is the same python
  as the one ``virtualenv`` is running from, however we can change this via the :option:`p` option).
- **Phase 2** creates a virtual environment at the specified destination (:option:`dest`), this can be broken down into
  four further sub-steps:

  - create a python that matches the target python interpreter from phase 1,
  - install (bootstrap) seed packages (one or more of :pypi:`pip`, :pypi:`setuptools`, :pypi:`wheel`) in the created
    virtual environment,
  - install activation scripts into the binary directory of the virtual environment (these will allow end users to
    *activate* the virtual environment from various shells).
  - create files that mark the virtual environment as to be ignored by version control systems (currently we support
    Git only, as Mercurial, Bazaar or SVN do not support ignore files in subdirectories). This step can be skipped
    with the :option:`no-vcs-ignore` option.


The python in your new virtualenv is effectively isolated from the python that was used to create it.

Python discovery
----------------

The first thing we need to be able to create a virtual environment is a python interpreter. This will describe to the
tool what type of virtual environment you would like to create, think of it as: version, architecture, implementation.

``virtualenv`` being a python application has always at least one such available, the one ``virtualenv`` itself is
using, and as such this is the default discovered element. This means that if you install ``virtualenv`` under
python ``3.8``, virtualenv will by default create virtual environments that are also of version ``3.8``.

Created python virtual environments are usually not self-contained. A complete python packaging is usually made up of
thousands of files, so it's not efficient to install the entire python again into a new folder. Instead virtual
environments are mere shells, that contain little within themselves, and borrow most from the system python (this is what
you installed, when you installed python itself). This does mean that if you upgrade your system python your virtual
environments *might* break, so watch out. The upside of this, referring to the system python, is that creating virtual
environments can be fast.

Here we'll describe the built-in mechanism (note this can be extended though by plugins). The CLI flag :option:`p` or
:option:`python` allows you to specify a python specifier for what type of virtual environment you would like, the
format is either:

- a relative/absolute path to a Python interpreter,

- a specifier identifying the Python implementation, version, architecture in the following format:

    .. code-block::

       {python implementation name}{version}{architecture}

    We have the following restrictions:

    - the python implementation is all alphabetic characters (``python`` means any implementation, and if is missing it
      defaults to ``python``),
    - the version is a dot separated version number,
    - the architecture is either ``-64`` or ``-32`` (missing means ``any``).

    For example:

    - ``python3.8.1`` means any python implementation having the version ``3.8.1``,
    - ``3`` means any python implementation having the major version ``3``,
    - ``cpython3`` means a ``CPython`` implementation having the version ``3``,
    - ``pypy2`` means a python interpreter with the ``PyPy`` implementation and major version ``2``.

  Given the specifier ``virtualenv`` will apply the following strategy to discover/find the system executable:

   - If we're on Windows look into the Windows registry, and check if we see any registered Python implementations that
     match the specification. This is in line with expectation laid out inside
     `PEP-514 <https://www.python.org/dev/peps/pep-0514/>`_
   - Try to discover a matching python executable within the folders enumerated on the ``PATH`` environment variable.
     In this case we'll try to find an executable that has a name roughly similar to the specification (for exact logic,
     please see the implementation code).

.. warning::

   As detailed above, virtual environments usually just borrow things from the system Python, they don't actually contain
   all the data from the system Python. The version of the python executable is hardcoded within the python exe itself.
   Therefore, if you upgrade your system Python, your virtual environment will still report the version before the
   upgrade, even though now other than the executable all additional content (standard library, binary libs, etc) are
   of the new version.

   Barring any major incompatibilities (rarely the case) the virtual environment will continue working, but other than
   the content embedded within the python executable it will behave like the upgraded version. If such a virtual
   environment python is specified as the target python interpreter, we will create virtual environments that match the
   new system Python version, not the version reported by the virtual environment.

Creators
--------

These are what actually setup the virtual environment, usually as a reference against the system python. virtualenv
at the moment has two types of virtual environments:

- ``venv`` - this delegates the creation process towards the ``venv`` module, as described in
  `PEP 405 <https://www.python.org/dev/peps/pep-0405>`_. This is only available on Python interpreters having version
  ``3.5`` or later, and also has the downside that virtualenv **must** create a process to invoke that module (unless
  virtualenv is installed in the system python), which can be an expensive operation (especially true on Windows).

- ``builtin`` - this means ``virtualenv`` is able to do the creation operation itself (by knowing exactly what files to
  create and what system files need to be referenced). The creator with name ``builtin`` is an alias on the first
  creator that's of this type (we provide creators for various target environments, that all differ in actual create
  operations, such as CPython 2 on Windows, PyPy2 on Windows, CPython3 on Posix, PyPy3 on Posix, and so on; for a full
  list see :option:`creator`).

Seeders
-------
These will install for you some seed packages (one or more of: :pypi:`pip`, :pypi:`setuptools`, :pypi:`wheel`) that
enables you to install additional python packages into the created virtual environment (by invoking pip). There are two
main seed mechanism available:

- ``pip`` - this method uses the bundled pip with virtualenv to install the seed packages (note, a new child process
  needs to be created to do this, which can be expensive especially on Windows).
- ``app-data`` - this method uses the user application data directory to create install images. These images are needed
  to be created only once, and subsequent virtual environments can just link/copy those images into their pure python
  library path (the ``site-packages`` folder). This allows all but the first virtual environment creation to be blazing
  fast (a ``pip`` mechanism takes usually 98% of the virtualenv creation time, so by creating this install image that
  we can just link into the virtual environments install directory we can achieve speedups of shaving the initial
  1 minute and 10 seconds down to just 8 seconds in case of a copy, or ``0.8`` seconds in case symlinks are available -
  this is on Windows, Linux/macOS with symlinks this can be as low as ``100ms`` from 3+ seconds).
  To override the filesystem location of the seed cache, one can use the
  ``VIRTUALENV_OVERRIDE_APP_DATA`` environment variable.

.. _wheels:

Wheels
~~~~~~

To install a seed package via either ``pip`` or ``app-data`` method virtualenv needs to acquire a wheel of the target
package. These wheels may be acquired from multiple locations as follows:

- ``virtualenv`` ships out of box with a set of embed ``wheels`` for all three seed packages (:pypi:`pip`,
  :pypi:`setuptools`, :pypi:`wheel`). These are packaged together with the virtualenv source files, and only change upon
  upgrading virtualenv. Different Python versions require different versions of these, and because virtualenv supports a
  wide range of Python versions, the number of embedded wheels out of box is greater than 3. Whenever newer versions of
  these embedded packages are released upstream ``virtualenv`` project upgrades them, and does a new release. Therefore,
  upgrading virtualenv periodically will also upgrade the version of the seed packages.
- However, end users might not be able to upgrade virtualenv at the same speed as we do new releases. Therefore, a user
  might request to upgrade the list of embedded wheels by invoking virtualenv with the :option:`upgrade-embed-wheels`
  flag. If the operation is triggered in such a manual way subsequent runs of virtualenv will always use the upgraded
  embed wheels.

  The operation can trigger automatically too, as a background process upon invocation of virtualenv, if no such upgrade
  has been performed in the last 14 days. It will only start using automatically upgraded wheel if they have been
  released for more than 28 days, and the automatic upgrade finished at least an hour ago:

  - the 28 days period should guarantee end users are not pulling in automatically releases that have known bugs within,
  - the one hour period after the automatic upgrade finished is implemented so that continuous integration services do
    not start using a new embedded versions half way through.


  The automatic behaviour might be disabled via the :option:`no-periodic-update` configuration flag/option. To acquire
  the release date of a package virtualenv will perform the following:

  - lookup ``https://pypi.org/pypi/<distribution>/json`` (primary truth source),
  - save the date the version was first discovered, and wait until 28 days passed.
- Users can specify a set of local paths containing additional wheels by using the :option:`extra-search-dir` command
  line argument flag.

When searching for a wheel to use virtualenv performs lookup in the following order:

- embedded wheels,
- upgraded embedded wheels,
- extra search dir.

Bundled wheels are all three above together. If neither of the locations contain the requested wheel version or
:option:`download` option is set will use ``pip`` download to load the latest version available from the index server.

.. _distribution_wheels:

Embed wheels for distributions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Custom distributions often want to use their own set of wheel versions to distribute instead of the one virtualenv
releases on PyPi. The reason for this is trying to keep the system versions of those packages in sync with what
virtualenv uses. In such cases they should patch the module `virtualenv.seed.wheels.embed
<https://github.com/pypa/virtualenv/tree/main/src/virtualenv/seed/wheels/embed>`_, making sure to provide the function
``get_embed_wheel`` (which returns the wheel to use given a distribution/python version). The ``BUNDLE_FOLDER``,
``BUNDLE_SUPPORT`` and ``MAX`` variables are needed if they want to use virtualenv's test suite to validate.

Furthermore, they might want to disable the periodic update by patching the
`virtualenv.seed.embed.base_embed.PERIODIC_UPDATE_ON_BY_DEFAULT
<https://github.com/pypa/virtualenv/tree/main/src/virtualenv/seed/embed/base_embed.py>`_
to ``False``, and letting the system update mechanism to handle this. Note in this case the user might still request an
upgrade of the embedded wheels by invoking virtualenv via :option:`upgrade-embed-wheels`, but no longer happens
automatically, and will not alter the OS provided wheels.

Activators
----------
These are activation scripts that will mangle with your shell's settings to ensure that commands from within the python
virtual environment take priority over your system paths. For example, if invoking ``pip`` from your shell returned the
system python's pip before activation, once you do the activation this should refer to the virtual environments ``pip``.
Note, though that all we do is change priority; so, if your virtual environments ``bin``/``Scripts`` folder does not
contain some executable, this will still resolve to the same executable it would have resolved before the activation.

For a list of shells we provide activators see :option:`activators`. The location of these is right alongside the python
executables ( usually ``Scripts`` folder on Windows, ``bin`` on POSIX), and are named as ``activate`` (and some
extension that's specific per activator; no extension is bash). You can invoke them, usually by source-ing (the source
command might vary by shell - e.g. bash is ``.``):

.. code-block:: console

   source bin/activate

This is all it does; it's purely a convenience of prepending the virtual environment's binary folder onto the ``PATH``
environment variable. Note you don't have to activate a virtual environment to use it. In this case though you would
need to type out the path to the executables, rather than relying on your shell to resolve them to your virtual
environment.

The ``activate`` script will also modify your shell prompt to indicate which environment is currently active. The script
also provisions a ``deactivate`` command that will allow you to undo the operation:

.. code-block:: console

   deactivate


.. note::

    If using Powershell, the ``activate`` script is subject to the
    `execution policies <http://technet.microsoft.com/en-us/library/dd347641.aspx>`_ on the system. By default, Windows
    7 and later, the system's execution policy is set to ``Restricted``, meaning no scripts like the ``activate`` script
    are allowed to be executed.

    However, that can't stop us from changing that slightly to allow it to be executed. You may relax the system
    execution policy to allow running of local scripts without verifying the code signature using the following:

    .. code-block:: powershell

       Set-ExecutionPolicy RemoteSigned

    Since the ``activate.ps1`` script is generated locally for each virtualenv, it is not considered a remote script and
    can then be executed.

A longer explanation of this can be found within Allison Kaptur's 2013 blog post: `There's no magic: virtualenv
edition <https://www.recurse.com/blog/14-there-is-no-magic-virtualenv-edition>`_ explains how virtualenv uses bash and
Python and ``PATH`` and ``PYTHONHOME`` to isolate virtual environments' paths.

.. _programmatic_api:

Programmatic API
----------------

At the moment ``virtualenv`` offers only CLI level interface. If you want to trigger invocation of Python environments
from within Python you should be using the ``virtualenv.cli_run`` method; this takes an ``args`` argument where you can
pass the options the same way you would from the command line. The run will return a session object containing data
about the created virtual environment.

.. code-block:: python

   from virtualenv import cli_run

   cli_run(["venv"])

.. automodule:: virtualenv
   :members:

.. currentmodule:: virtualenv.run.session

.. autoclass:: Session
    :members:
PK�(�\-����	�	&doc/alt-python-virtualenv/docs/conf.pynu�[���import subprocess
import sys
from datetime import date, datetime
from pathlib import Path

import sphinx_rtd_theme

from virtualenv.version import __version__

company = "PyPA"
name = "virtualenv"
version = ".".join(__version__.split(".")[:2])
release = __version__
copyright = f"2007-{date.today().year}, {company}, PyPA"

extensions = [
    "sphinx.ext.autodoc",
    "sphinx.ext.autosectionlabel",
    "sphinx.ext.extlinks",
]

templates_path = []
unused_docs = []
source_suffix = ".rst"
exclude_patterns = ["_build", "changelog/*", "_draft.rst"]

main_doc = "index"
pygments_style = "default"
always_document_param_types = True
project = name
today_fmt = "%B %d, %Y"

html_theme = "sphinx_rtd_theme"
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
html_theme_options = {
    "canonical_url": "https://virtualenv.pypa.io/",
    "logo_only": False,
    "display_version": True,
    "prev_next_buttons_location": "bottom",
    "collapse_navigation": False,
    "sticky_navigation": True,
    "navigation_depth": 6,
    "includehidden": True,
}
html_static_path = ["_static"]
html_last_updated_fmt = datetime.now().isoformat()
htmlhelp_basename = "Pastedoc"
autoclass_content = "both"  # Include __init__ in class documentation
autodoc_member_order = "bysource"
autosectionlabel_prefix_document = True

extlinks = {
    "issue": ("https://github.com/pypa/virtualenv/issues/%s", "#"),
    "pull": ("https://github.com/pypa/virtualenv/pull/%s", "PR #"),
    "user": ("https://github.com/%s", "@"),
    "pypi": ("https://pypi.org/project/%s", ""),
}


def generate_draft_news():
    root = Path(__file__).parents[1]
    new = subprocess.check_output(
        [sys.executable, "-m", "towncrier", "--draft", "--version", "NEXT"],
        cwd=root,
        universal_newlines=True,
    )
    dest = root / "docs" / "_draft.rst"
    dest.write_text("" if "No significant changes" in new else new)


generate_draft_news()


def setup(app):
    # the CLI arguments are dynamically generated
    doc_tree = Path(app.doctreedir)
    cli_interface_doctree = doc_tree / "cli_interface.doctree"
    if cli_interface_doctree.exists():
        cli_interface_doctree.unlink()

    HERE = Path(__file__).parent
    if str(HERE) not in sys.path:
        sys.path.append(str(HERE))

    # noinspection PyUnresolvedReferences
    from render_cli import CliTable, literal_data

    app.add_css_file("custom.css")
    app.add_directive(CliTable.name, CliTable)
    app.add_role("literal_data", literal_data)
PK�(�\�
�`&`&.doc/alt-python-virtualenv/docs/development.rstnu�[���Development
===========

Getting started
---------------


``virtualenv`` is a volunteer maintained open source project and we welcome contributions of all forms. The sections
below will help you get started with development, testing, and documentation. We’re pleased that you are interested in
working on virtualenv. This document is meant to get you setup to work on virtualenv and to act as a guide and reference
to the development setup. If you face any issues during this process, please
`open an issue <https://github.com/pypa/virtualenv/issues/new?title=Trouble+with+development+environment>`_ about it on
the issue tracker.

Setup
~~~~~

virtualenv is a command line application written in Python. To work on it, you'll need:

- **Source code**: available on `GitHub <https://github.com/pypa/virtualenv>`_. You can use ``git`` to clone the
    repository:

  .. code-block:: console

      git clone https://github.com/pypa/virtualenv
      cd virtualenv

- **Python interpreter**: We recommend using ``CPython``. You can use
  `this guide <https://realpython.com/installing-python/>`_ to set it up.

- :pypi:`tox`: to automatically get the projects development dependencies and run the test suite. We recommend
  installing it using `pipx <https://pipxproject.github.io/pipx/>`_.

Running from source tree
~~~~~~~~~~~~~~~~~~~~~~~~

The easiest way to do this is to generate the development tox environment, and then invoke virtualenv from under the
``.tox/dev`` folder

.. code-block:: console

    tox -e dev
    .tox/dev/bin/virtualenv  # on Linux
    .tox/dev/Scripts/virtualenv  # on Windows

Running tests
~~~~~~~~~~~~~

virtualenv's tests are written using the :pypi:`pytest` test framework. :pypi:`tox` is used to automate the setup
and execution of virtualenv's tests.

To run tests locally execute:

.. code-block:: console

    tox -e py

This will run the test suite for the same Python version as under which ``tox`` is installed. Alternatively you can
specify a specific version of python by using the ``pyNN`` format, such as: ``py38``, ``pypy3``, etc.

``tox`` has been configured to forward any additional arguments it is given to ``pytest``.
This enables the use of pytest's
`rich CLI <https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests>`_. As an example, you can
select tests using the various ways that pytest provides:

.. code-block:: console

    # Using markers
    tox -e py -- -m "not slow"
    # Using keywords
    tox -e py -- -k "test_extra"

Some tests require additional dependencies to be run, such is the various shell activators (``bash``, ``fish``,
``powershell``, etc). These tests will automatically be skipped if these are not present, note however that in CI
all tests are run; so even if all tests succeed locally for you, they may still fail in the CI.

Running linters
~~~~~~~~~~~~~~~

virtualenv uses :pypi:`pre-commit` for managing linting of the codebase. ``pre-commit`` performs various checks on all
files in virtualenv and uses tools that help follow a consistent code style within the codebase. To use linters locally,
run:

.. code-block:: console

    tox -e fix_lint

.. note::

    Avoid using ``# noqa`` comments to suppress linter warnings - wherever possible, warnings should be fixed instead.
    ``# noqa`` comments are reserved for rare cases where the recommended style causes severe readability problems.

Building documentation
~~~~~~~~~~~~~~~~~~~~~~

virtualenv's documentation is built using :pypi:`Sphinx`. The documentation is written in reStructuredText. To build it
locally, run:

.. code-block:: console

    tox -e docs

The built documentation can be found in the ``.tox/docs_out`` folder and may be viewed by opening ``index.html`` within
that folder.

Release
~~~~~~~

virtualenv's release schedule is tied to ``pip``, ``setuptools`` and ``wheel``. We bundle the latest version of these
libraries so each time there's a new version of any of these, there will be a new virtualenv release shortly afterwards
(we usually wait just a few days to avoid pulling in any broken releases).

Contributing
-------------

Submitting pull requests
~~~~~~~~~~~~~~~~~~~~~~~~

Submit pull requests against the ``main`` branch, providing a good description of what you're doing and why. You must
have legal permission to distribute any code you contribute to virtualenv and it must be available under the MIT
License. Provide tests that cover your changes and run the tests locally first. virtualenv
:ref:`supports <compatibility-requirements>` multiple Python versions and operating systems. Any pull request must
consider and work on all these platforms.

Pull Requests should be small to facilitate review. Keep them self-contained, and limited in scope. `Studies have shown
<https://www.kessler.de/prd/smartbear/BestPracticesForPeerCodeReview.pdf>`_ that review quality falls off as patch size
grows. Sometimes this will result in many small PRs to land a single large feature. In particular, pull requests must
not be treated as "feature branches", with ongoing development work happening within the PR. Instead, the feature should
be broken up into smaller, independent parts which can be reviewed and merged individually.

Additionally, avoid including "cosmetic" changes to code that is unrelated to your change, as these make reviewing the
PR more difficult. Examples include re-flowing text in comments or documentation, or addition or removal of blank lines
or whitespace within lines. Such changes can be made separately, as a "formatting cleanup" PR, if needed.

Automated testing
~~~~~~~~~~~~~~~~~

All pull requests and merges to 'main' branch are tested using
`Azure Pipelines <https://azure.microsoft.com/en-gb/services/devops/pipelines/>`_ (configured by
``azure-pipelines.yml`` file at the root of the repository). You can find the status and results to the CI runs for your
PR on GitHub's Web UI for the pull request. You can also find links to the CI services' pages for the specific builds in
the form of "Details" links, in case the CI run fails and you wish to view the output.

To trigger CI to run again for a pull request, you can close and open the pull request or submit another change to the
pull request. If needed, project maintainers can manually trigger a restart of a job/build.

NEWS entries
~~~~~~~~~~~~

The ``changelog.rst`` file is managed using :pypi:`towncrier` and all non trivial changes must be accompanied by a news
entry. To add an entry to the news file, first you need to have created an issue describing the change you want to
make. A Pull Request itself *may* function as such, but it is preferred to have a dedicated issue (for example, in case
the PR ends up rejected due to code quality reasons).

Once you have an issue or pull request, you take the number and you create a file inside of the ``docs/changelog``
directory named after that issue number with an extension of:

- ``feature.rst``,
- ``bugfix.rst``,
- ``doc.rst``,
- ``removal.rst``,
- ``misc.rst``.

Thus if your issue or PR number is ``1234`` and this change is fixing a bug, then you would create a file
``docs/changelog/1234.bugfix.rst``. PRs can span multiple categories by creating multiple files (for instance, if you
added a feature and deprecated/removed the old feature at the same time, you would create
``docs/changelog/1234.bugfix.rst`` and ``docs/changelog/1234.remove.rst``). Likewise if a PR touches multiple issues/PRs
you may create a file for each of them with the same contents and :pypi:`towncrier` will deduplicate them.

Contents of a NEWS entry
^^^^^^^^^^^^^^^^^^^^^^^^

The contents of this file are reStructuredText formatted text that will be used as the content of the news file entry.
You do not need to reference the issue or PR numbers here as towncrier will automatically add a reference to all of
the affected issues when rendering the news file.

In order to maintain a consistent style in the ``changelog.rst`` file, it is preferred to keep the news entry to the
point, in sentence case, shorter than 120 characters and in an imperative tone -- an entry should complete the sentence
``This change will …``. In rare cases, where one line is not enough, use a summary line in an imperative tone followed
by a blank line separating it from a description of the feature/change in one or more paragraphs, each wrapped
at 120 characters. Remember that a news entry is meant for end users and should only contain details relevant to an end
user.

Choosing the type of NEWS entry
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

A trivial change is anything that does not warrant an entry in the news file. Some examples are: code refactors that
don't change anything as far as the public is concerned, typo fixes, white space modification, etc. To mark a PR
as trivial a contributor simply needs to add a randomly named, empty file to the ``news/`` directory with the extension
of ``.trivial``.

Becoming a maintainer
~~~~~~~~~~~~~~~~~~~~~

If you want to become an official maintainer, start by helping out. As a first step, we welcome you to triage issues on
virtualenv's issue tracker. virtualenv maintainers provide triage abilities to contributors once they have been around
for some time and contributed positively to the project. This is optional and highly recommended for becoming a
virtualenv maintainer. Later, when you think you're ready, get in touch with one of the maintainers and they will
initiate a vote among the existing maintainers.

.. note::

    Upon becoming a maintainer, a person should be given access to various virtualenv-related tooling across
    multiple platforms. These are noted here for future reference by the maintainers:

    - GitHub Push Access
    - PyPI Publishing Access
    - CI Administration capabilities
    - ReadTheDocs Administration capabilities
PK�(�\�+""&doc/alt-python37-platformdirs/PKG-INFOnu�[���Metadata-Version: 2.1
Name: platformdirs
Version: 2.4.1
Summary: A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".
Home-page: https://github.com/platformdirs/platformdirs
Maintainer: Bernát Gábor, Julian Berman, Ofek Lev, Ronny Pfannschmidt
Maintainer-email: gaborjbernat@gmail.com, Julian@GrayVines.com, oss@ofek.dev, opensource@ronnypfannschmidt.de
License: MIT
Project-URL: Source, https://github.com/platformdirs/platformdirs
Project-URL: Tracker, https://github.com/platformdirs/platformdirs/issues
Project-URL: Documentation, https://platformdirs.readthedocs.io/
Keywords: application directory log cache user
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.7
Description-Content-Type: text/x-rst
Provides-Extra: docs
Provides-Extra: test
License-File: LICENSE.txt

The problem
===========

.. image:: https://github.com/platformdirs/platformdirs/workflows/Test/badge.svg
   :target: https://github.com/platformdirs/platformdirs/actions?query=workflow%3ATest

When writing desktop application, finding the right location to store user data
and configuration varies per platform. Even for single-platform apps, there
may by plenty of nuances in figuring out the right location.

For example, if running on macOS, you should use::

    ~/Library/Application Support/<AppName>

If on Windows (at least English Win XP) that should be::

    C:\Documents and Settings\<User>\Application Data\Local Settings\<AppAuthor>\<AppName>

or possibly::

    C:\Documents and Settings\<User>\Application Data\<AppAuthor>\<AppName>

for `roaming profiles <https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-vista/cc766489(v=ws.10)>`_ but that is another story.

On Linux (and other Unices), according to the `XDG Basedir Spec`_, it should be::

    ~/.local/share/<AppName>

.. _XDG Basedir Spec: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html

``platformdirs`` to the rescue
==============================

This kind of thing is what the ``platformdirs`` module is for.
``platformdirs`` will help you choose an appropriate:

- user data dir (``user_data_dir``)
- user config dir (``user_config_dir``)
- user cache dir (``user_cache_dir``)
- site data dir (``site_data_dir``)
- site config dir (``site_config_dir``)
- user log dir (``user_log_dir``)
- user documents dir (``user_documents_dir``)
- user runtime dir (``user_runtime_dir``)

And also:

- Is a single module so other Python packages can vendor their own private copy.
- Is slightly opinionated on the directory names used. Look for "OPINION" in
  documentation and code for when an opinion is being applied.

Example output
==============

On macOS:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> site_data_dir(appname, appauthor)
    '/Library/Application Support/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/Users/trentm/Library/Caches/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/Users/trentm/Library/Logs/SuperApp'
    >>> user_documents_dir()
    '/Users/trentm/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'

On Windows 7:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp'
    >>> user_data_dir(appname, appauthor, roaming=True)
    'C:\\Users\\trentm\\AppData\\Roaming\\Acme\\SuperApp'
    >>> user_cache_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Cache'
    >>> user_log_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Logs'
    >>> user_documents_dir()
    'C:\\Users\\trentm\\Documents'
    >>> user_runtime_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Temp\\Acme\\SuperApp'

On Linux:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/home/trentm/.local/share/SuperApp
    >>> site_data_dir(appname, appauthor)
    '/usr/local/share/SuperApp'
    >>> site_data_dir(appname, appauthor, multipath=True)
    '/usr/local/share/SuperApp:/usr/share/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/home/trentm/.cache/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/home/trentm/.cache/SuperApp/log'
    >>> user_config_dir(appname)
    '/home/trentm/.config/SuperApp'
    >>> user_documents_dir()
    '/home/trentm/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/run/user/{os.getuid()}/SuperApp'
    >>> site_config_dir(appname)
    '/etc/xdg/SuperApp'
    >>> os.environ["XDG_CONFIG_DIRS"] = "/etc:/usr/local/etc"
    >>> site_config_dir(appname, multipath=True)
    '/etc/SuperApp:/usr/local/etc/SuperApp'

On Android::

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/data/data/com.termux/files/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp/log'
    >>> user_config_dir(appname)
    '/data/data/com.termux/shared_prefs/SuperApp'
    >>> user_documents_dir()
    '/storage/emulated/0/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp/tmp'

``PlatformDirs`` for convenience
================================

.. code-block:: pycon

    >>> from platformdirs import PlatformDirs
    >>> dirs = PlatformDirs("SuperApp", "Acme")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> dirs.site_data_dir
    '/Library/Application Support/SuperApp'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp'
    >>> dirs.user_log_dir
    '/Users/trentm/Library/Logs/SuperApp'
    >>> dirs.user_documents_dir
    '/Users/trentm/Documents'
    >>> dirs.user_runtime_dir
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'

Per-version isolation
=====================

If you have multiple versions of your app in use that you want to be
able to run side-by-side, then you may want version-isolation for these
dirs::

    >>> from platformdirs import PlatformDirs
    >>> dirs = PlatformDirs("SuperApp", "Acme", version="1.0")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp/1.0'
    >>> dirs.site_data_dir
    '/Library/Application Support/SuperApp/1.0'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp/1.0'
    >>> dirs.user_log_dir
    '/Users/trentm/Library/Logs/SuperApp/1.0'
    >>> dirs.user_documents_dir
    '/Users/trentm/Documents'
    >>> dirs.user_runtime_dir
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp/1.0'

Be wary of using this for configuration files though; you'll need to handle
migrating configuration files manually.

Why this Fork?
==============

This repository is a friendly fork of the wonderful work started by
`ActiveState <https://github.com/ActiveState/appdirs>`_ who created
``appdirs``, this package's ancestor.

Maintaining an open source project is no easy task, particularly
from within an organization, and the Python community is indebted
to ``appdirs`` (and to Trent Mick and Jeff Rouse in particular) for
creating an incredibly useful simple module, as evidenced by the wide
number of users it has attracted over the years.

Nonetheless, given the number of long-standing open issues
and pull requests, and no clear path towards `ensuring
that maintenance of the package would continue or grow
<https://github.com/ActiveState/appdirs/issues/79>`_, this fork was
created.

Contributions are most welcome.


PK�(�\�U�HH)doc/alt-python37-platformdirs/LICENSE.txtnu�[���# This is the MIT license

Copyright (c) 2010 ActiveState Software Inc.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PK�(�\�����)doc/alt-python37-platformdirs/CHANGES.rstnu�[���platformdirs Changelog
======================

platformdirs 2.4.1
------------------
- Drop python 3.6 support

platformdirs 2.4.0
------------------
- Add ``user_documents_dir``

platformdirs 2.3.0
------------------
- Add ``user_runtime_dir`` and its path-returning equivalent (#37)

platformdirs 2.2.0
------------------
- Unix: Fallback to default if XDG environment variable is empty

platformdirs 2.1.0
------------------
- Add ``readthedocs.org`` documentation via Sphinx
- Modernize project layout
- Drop Python 2.7 and 3.5 support
- Android support
- Add type annotations
- Reorganize project layout to platform specific classes, see
  :class:`PlatformDirsABC <platformdirs.api.PlatformDirsABC>` and it's implementations:
  :class:`Android <platformdirs.android.Android>`, :class:`MacOS <platformdirs.macos.MacOS>`,
  :class:`Unix <platformdirs.unix.Unix>` and :class:`Windows <platformdirs.windows.Windows>`
- Add ``*_path`` API, returning :class:`pathlib.Path <pathlib.Path>` objects instead of :class:`str`
  (``user_data_path``, ``user_config_path``, ``user_cache_path``, ``user_state_path``, ``user_log_path``,
  ``site_data_path``, ``site_config_path``) - by `@papr <https://github.com/papr/>`_

platformdirs 2.0.2
------------------
- Fix ``__version__`` and ``__version_info__``

platformdirs 2.0.1
------------------
- Documentation fixes

platformdirs 2.0.0
------------------

- **BREAKING** Name change as part of the friendly fork
- **BREAKING** Remove support for end-of-life Pythons 2.6, 3.2, and 3.3
- **BREAKING** Correct the config directory on OSX/macOS
- Add Python 3.7, 3.8, and 3.9 support

appdirs 1.4.4
-------------
- [PR #92] Don't import appdirs from setup.py which resolves issue #91

Project officially classified as Stable which is important
for inclusion in other distros such as ActivePython.

appdirs 1.4.3
-------------
- [PR #76] Python 3.6 invalid escape sequence deprecation fixes
- Fix for Python 3.6 support

appdirs 1.4.2
-------------
- [PR #84] Allow installing without setuptools
- [PR #86] Fix string delimiters in setup.py description
- Add Python 3.6 support

appdirs 1.4.1
-------------
- [issue #38] Fix _winreg import on Windows Py3
- [issue #55] Make appname optional

appdirs 1.4.0
-------------
- [PR #42] AppAuthor is now optional on Windows
- [issue 41] Support Jython on Windows, Mac, and Unix-like platforms. Windows
  support requires `JNA <https://github.com/twall/jna>`_.
- [PR #44] Fix incorrect behaviour of the site_config_dir method

appdirs 1.3.0
-------------
- [Unix, issue 16] Conform to XDG standard, instead of breaking it for
  everybody
- [Unix] Removes gratuitous case mangling of the case, since \*nix-es are
  usually case sensitive, so mangling is not wise
- [Unix] Fixes the utterly wrong behaviour in ``site_data_dir``, return result
  based on XDG_DATA_DIRS and make room for respecting the standard which
  specifies XDG_DATA_DIRS is a multiple-value variable
- [Issue 6] Add ``*_config_dir`` which are distinct on nix-es, according to
  XDG specs; on Windows and Mac return the corresponding ``*_data_dir``

appdirs 1.2.0
-------------

- [Unix] Put ``user_log_dir`` under the *cache* dir on Unix. Seems to be more
  typical.
- [issue 9] Make ``unicode`` work on py3k.

appdirs 1.1.0
-------------

- [issue 4] Add ``AppDirs.user_log_dir``.
- [Unix, issue 2, issue 7] appdirs now conforms to `XDG base directory spec
  <https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_.
- [Mac, issue 5] Fix ``site_data_dir()`` on Mac.
- [Mac] Drop use of 'Carbon' module in favour of hardcoded paths; supports
  Python3 now.
- [Windows] Append "Cache" to ``user_cache_dir`` on Windows by default. Use
  ``opinion=False`` option to disable this.
- Add ``appdirs.AppDirs`` convenience class. Usage:

        >>> dirs = AppDirs("SuperApp", "Acme", version="1.0")
        >>> dirs.user_data_dir
        '/Users/trentm/Library/Application Support/SuperApp/1.0'

- [Windows] Cherry-pick Komodo's change to downgrade paths to the Windows short
  paths if there are high bit chars.
- [Linux] Change default ``user_cache_dir()`` on Linux to be singular, e.g.
  "~/.superapp/cache".
- [Windows] Add ``roaming`` option to ``user_data_dir()`` (for use on Windows only)
  and change the default ``user_data_dir`` behaviour to use a *non*-roaming
  profile dir (``CSIDL_LOCAL_APPDATA`` instead of ``CSIDL_APPDATA``). Why? Because
  a large roaming profile can cause login speed issues. The "only syncs on
  logout" behaviour can cause surprises in appdata info.


appdirs 1.0.1 (never released)
------------------------------

Started this changelog 27 July 2010. Before that this module originated in the
`Komodo <https://www.activestate.com/komodo-ide>`_ product as ``applib.py`` and then
as `applib/location.py
<https://github.com/ActiveState/applib/blob/master/applib/location.py>`_ (used by
`PyPM <https://code.activestate.com/pypm/>`_ in `ActivePython
<https://www.activestate.com/activepython>`_). This is basically a fork of
applib.py 1.0.1 and applib/location.py 1.0.1.
PK�(�\<:���(doc/alt-python37-platformdirs/README.rstnu�[���The problem
===========

.. image:: https://github.com/platformdirs/platformdirs/workflows/Test/badge.svg
   :target: https://github.com/platformdirs/platformdirs/actions?query=workflow%3ATest

When writing desktop application, finding the right location to store user data
and configuration varies per platform. Even for single-platform apps, there
may by plenty of nuances in figuring out the right location.

For example, if running on macOS, you should use::

    ~/Library/Application Support/<AppName>

If on Windows (at least English Win XP) that should be::

    C:\Documents and Settings\<User>\Application Data\Local Settings\<AppAuthor>\<AppName>

or possibly::

    C:\Documents and Settings\<User>\Application Data\<AppAuthor>\<AppName>

for `roaming profiles <https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-vista/cc766489(v=ws.10)>`_ but that is another story.

On Linux (and other Unices), according to the `XDG Basedir Spec`_, it should be::

    ~/.local/share/<AppName>

.. _XDG Basedir Spec: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html

``platformdirs`` to the rescue
==============================

This kind of thing is what the ``platformdirs`` module is for.
``platformdirs`` will help you choose an appropriate:

- user data dir (``user_data_dir``)
- user config dir (``user_config_dir``)
- user cache dir (``user_cache_dir``)
- site data dir (``site_data_dir``)
- site config dir (``site_config_dir``)
- user log dir (``user_log_dir``)
- user documents dir (``user_documents_dir``)
- user runtime dir (``user_runtime_dir``)

And also:

- Is a single module so other Python packages can vendor their own private copy.
- Is slightly opinionated on the directory names used. Look for "OPINION" in
  documentation and code for when an opinion is being applied.

Example output
==============

On macOS:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> site_data_dir(appname, appauthor)
    '/Library/Application Support/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/Users/trentm/Library/Caches/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/Users/trentm/Library/Logs/SuperApp'
    >>> user_documents_dir()
    '/Users/trentm/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'

On Windows 7:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp'
    >>> user_data_dir(appname, appauthor, roaming=True)
    'C:\\Users\\trentm\\AppData\\Roaming\\Acme\\SuperApp'
    >>> user_cache_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Cache'
    >>> user_log_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Logs'
    >>> user_documents_dir()
    'C:\\Users\\trentm\\Documents'
    >>> user_runtime_dir(appname, appauthor)
    'C:\\Users\\trentm\\AppData\\Local\\Temp\\Acme\\SuperApp'

On Linux:

.. code-block:: pycon

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/home/trentm/.local/share/SuperApp
    >>> site_data_dir(appname, appauthor)
    '/usr/local/share/SuperApp'
    >>> site_data_dir(appname, appauthor, multipath=True)
    '/usr/local/share/SuperApp:/usr/share/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/home/trentm/.cache/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/home/trentm/.cache/SuperApp/log'
    >>> user_config_dir(appname)
    '/home/trentm/.config/SuperApp'
    >>> user_documents_dir()
    '/home/trentm/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/run/user/{os.getuid()}/SuperApp'
    >>> site_config_dir(appname)
    '/etc/xdg/SuperApp'
    >>> os.environ["XDG_CONFIG_DIRS"] = "/etc:/usr/local/etc"
    >>> site_config_dir(appname, multipath=True)
    '/etc/SuperApp:/usr/local/etc/SuperApp'

On Android::

    >>> from platformdirs import *
    >>> appname = "SuperApp"
    >>> appauthor = "Acme"
    >>> user_data_dir(appname, appauthor)
    '/data/data/com.termux/files/SuperApp'
    >>> user_cache_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp'
    >>> user_log_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp/log'
    >>> user_config_dir(appname)
    '/data/data/com.termux/shared_prefs/SuperApp'
    >>> user_documents_dir()
    '/storage/emulated/0/Documents'
    >>> user_runtime_dir(appname, appauthor)
    '/data/data/com.termux/cache/SuperApp/tmp'

``PlatformDirs`` for convenience
================================

.. code-block:: pycon

    >>> from platformdirs import PlatformDirs
    >>> dirs = PlatformDirs("SuperApp", "Acme")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp'
    >>> dirs.site_data_dir
    '/Library/Application Support/SuperApp'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp'
    >>> dirs.user_log_dir
    '/Users/trentm/Library/Logs/SuperApp'
    >>> dirs.user_documents_dir
    '/Users/trentm/Documents'
    >>> dirs.user_runtime_dir
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp'

Per-version isolation
=====================

If you have multiple versions of your app in use that you want to be
able to run side-by-side, then you may want version-isolation for these
dirs::

    >>> from platformdirs import PlatformDirs
    >>> dirs = PlatformDirs("SuperApp", "Acme", version="1.0")
    >>> dirs.user_data_dir
    '/Users/trentm/Library/Application Support/SuperApp/1.0'
    >>> dirs.site_data_dir
    '/Library/Application Support/SuperApp/1.0'
    >>> dirs.user_cache_dir
    '/Users/trentm/Library/Caches/SuperApp/1.0'
    >>> dirs.user_log_dir
    '/Users/trentm/Library/Logs/SuperApp/1.0'
    >>> dirs.user_documents_dir
    '/Users/trentm/Documents'
    >>> dirs.user_runtime_dir
    '/Users/trentm/Library/Caches/TemporaryItems/SuperApp/1.0'

Be wary of using this for configuration files though; you'll need to handle
migrating configuration files manually.

Why this Fork?
==============

This repository is a friendly fork of the wonderful work started by
`ActiveState <https://github.com/ActiveState/appdirs>`_ who created
``appdirs``, this package's ancestor.

Maintaining an open source project is no easy task, particularly
from within an organization, and the Python community is indebted
to ``appdirs`` (and to Trent Mick and Jeff Rouse in particular) for
creating an incredibly useful simple module, as evidenced by the wide
number of users it has attracted over the years.

Nonetheless, given the number of long-standing open issues
and pull requests, and no clear path towards `ensuring
that maintenance of the package would continue or grow
<https://github.com/ActiveState/appdirs/issues/79>`_, this fork was
created.

Contributions are most welcome.
PK�(�\X{WH doc/alt-python37-certifi/LICENSEnu�[���This packge contains a modified version of ca-bundle.crt:

ca-bundle.crt -- Bundle of CA Root Certificates

Certificate data from Mozilla as of: Thu Nov  3 19:04:19 2011#
This is a bundle of X.509 certificates of public Certificate Authorities
(CA). These were automatically extracted from Mozilla's root certificates
file (certdata.txt).  This file can be found in the mozilla source tree:
http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1#
It contains the certificates in PEM format and therefore
can be directly used with curl / libcurl / php_curl, or with
an Apache+mod_ssl webserver for SSL client authentication.
Just configure this file as the SSLCACertificateFile.#

***** BEGIN LICENSE BLOCK *****
This Source Code Form is subject to the terms of the Mozilla Public License,
v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
one at http://mozilla.org/MPL/2.0/.

***** END LICENSE BLOCK *****
@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
PK�(�\�8_��#doc/alt-python37-certifi/README.rstnu�[���Certifi: Python SSL Certificates
================================

`Certifi`_ is a carefully curated collection of Root Certificates for
validating the trustworthiness of SSL certificates while verifying the identity
of TLS hosts. It has been extracted from the `Requests`_ project.

Installation
------------

``certifi`` is available on PyPI. Simply install it with ``pip``::

    $ pip install certifi

Usage
-----

To reference the installed certificate authority (CA) bundle, you can use the
built-in function::

    >>> import certifi

    >>> certifi.where()
    '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem'

Enjoy!

1024-bit Root Certificates
~~~~~~~~~~~~~~~~~~~~~~~~~~

Browsers and certificate authorities have concluded that 1024-bit keys are
unacceptably weak for certificates, particularly root certificates. For this
reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its
bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key)
certificate from the same CA. Because Mozilla removed these certificates from
its bundle, ``certifi`` removed them as well.

In previous versions, ``certifi`` provided the ``certifi.old_where()`` function
to intentionally re-add the 1024-bit roots back into your bundle. This was not
recommended in production and therefore was removed. To assist in migrating old
code, the function ``certifi.old_where()`` continues to exist as an alias of
``certifi.where()``. Please update your code to use ``certifi.where()``
instead. ``certifi.old_where()`` will be removed in 2018.

.. _`Certifi`: http://certifi.io/en/latest/
.. _`Requests`: http://docs.python-requests.org/en/latest/
PK�(�\f��m;;#doc/alt-python37-future/LICENSE.txtnu�[���Copyright (c) 2013-2018 Python Charmers Pty Ltd, Australia

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�(�\x��
�&�&"doc/alt-python37-future/README.rstnu�[���.. _overview:

Overview: Easy, clean, reliable Python 2/3 compatibility
========================================================

``python-future`` is the missing compatibility layer between Python 2 and
Python 3. It allows you to use a single, clean Python 3.x-compatible
codebase to support both Python 2 and Python 3 with minimal overhead.

It provides ``future`` and ``past`` packages with backports and forward
ports of features from Python 3 and 2. It also comes with ``futurize`` and
``pasteurize``, customized 2to3-based scripts that helps you to convert
either Py2 or Py3 code easily to support both Python 2 and 3 in a single
clean Py3-style codebase, module by module.

Notable projects that use ``python-future`` for Python 2/3 compatibility
are `Mezzanine <http://mezzanine.jupo.org/>`_ and `ObsPy
<http://obspy.org>`_.

.. _features:

Features
--------

.. image:: https://travis-ci.org/PythonCharmers/python-future.svg?branch=master
       :target: https://travis-ci.org/PythonCharmers/python-future

-   ``future.builtins`` package (also available as ``builtins`` on Py2) provides
    backports and remappings for 20 builtins with different semantics on Py3
    versus Py2

-   support for directly importing 30 standard library modules under
    their Python 3 names on Py2

-   support for importing the other 14 refactored standard library modules
    under their Py3 names relatively cleanly via
    ``future.standard_library`` and ``future.moves``

-   ``past.builtins`` package provides forward-ports of 19 Python 2 types and
    builtin functions. These can aid with per-module code migrations.

-   ``past.translation`` package supports transparent translation of Python 2
    modules to Python 3 upon import. [This feature is currently in alpha.]

-   1000+ unit tests, including many from the Py3.3 source tree.

-   ``futurize`` and ``pasteurize`` scripts based on ``2to3`` and parts of
    ``3to2`` and ``python-modernize``, for automatic conversion from either Py2
    or Py3 to a clean single-source codebase compatible with Python 2.6+ and
    Python 3.3+.

-   a curated set of utility functions and decorators in ``future.utils`` and
    ``past.utils`` selected from Py2/3 compatibility interfaces from projects
    like ``six``, ``IPython``, ``Jinja2``, ``Django``, and ``Pandas``.

-   support for the ``surrogateescape`` error handler when encoding and
    decoding the backported ``str`` and ``bytes`` objects. [This feature is
    currently in alpha.]

.. _code-examples:

Code examples
-------------

Replacements for Py2's built-in functions and types are designed to be imported
at the top of each Python module together with Python's built-in ``__future__``
statements. For example, this code behaves identically on Python 2.6/2.7 after
these imports as it does on Python 3.3+:

.. code-block:: python

    from __future__ import absolute_import, division, print_function
    from builtins import (bytes, str, open, super, range,
                          zip, round, input, int, pow, object)

    # Backported Py3 bytes object
    b = bytes(b'ABCD')
    assert list(b) == [65, 66, 67, 68]
    assert repr(b) == "b'ABCD'"
    # These raise TypeErrors:
    # b + u'EFGH'
    # bytes(b',').join([u'Fred', u'Bill'])

    # Backported Py3 str object
    s = str(u'ABCD')
    assert s != bytes(b'ABCD')
    assert isinstance(s.encode('utf-8'), bytes)
    assert isinstance(b.decode('utf-8'), str)
    assert repr(s) == "'ABCD'"      # consistent repr with Py3 (no u prefix)
    # These raise TypeErrors:
    # bytes(b'B') in s
    # s.find(bytes(b'A'))

    # Extra arguments for the open() function
    f = open('japanese.txt', encoding='utf-8', errors='replace')

    # New zero-argument super() function:
    class VerboseList(list):
        def append(self, item):
            print('Adding an item')
            super().append(item)

    # New iterable range object with slicing support
    for i in range(10**15)[:10]:
        pass

    # Other iterators: map, zip, filter
    my_iter = zip(range(3), ['a', 'b', 'c'])
    assert my_iter != list(my_iter)

    # The round() function behaves as it does in Python 3, using
    # "Banker's Rounding" to the nearest even last digit:
    assert round(0.1250, 2) == 0.12

    # input() replaces Py2's raw_input() (with no eval()):
    name = input('What is your name? ')
    print('Hello ' + name)

    # pow() supports fractional exponents of negative numbers like in Py3:
    z = pow(-1, 0.5)

    # Compatible output from isinstance() across Py2/3:
    assert isinstance(2**64, int)        # long integers
    assert isinstance(u'blah', str)
    assert isinstance('blah', str)       # only if unicode_literals is in effect

    # Py3-style iterators written as new-style classes (subclasses of
    # future.types.newobject) are automatically backward compatible with Py2:
    class Upper(object):
        def __init__(self, iterable):
            self._iter = iter(iterable)
        def __next__(self):                 # note the Py3 interface
            return next(self._iter).upper()
        def __iter__(self):
            return self
    assert list(Upper('hello')) == list('HELLO')


There is also support for renamed standard library modules. The recommended
interface works like this:

.. code-block:: python

    # Many Py3 module names are supported directly on both Py2.x and 3.x:
    from http.client import HttpConnection
    import html.parser
    import queue
    import xmlrpc.client

    # Refactored modules with clashing names on Py2 and Py3 are supported
    # as follows:
    from future import standard_library
    standard_library.install_aliases()

    # Then, for example:
    from itertools import filterfalse, zip_longest
    from urllib.request import urlopen
    from collections import ChainMap
    from collections import UserDict, UserList, UserString
    from subprocess import getoutput, getstatusoutput
    from collections import Counter, OrderedDict   # backported to Py2.6


Automatic conversion to Py2/3-compatible code
---------------------------------------------

``python-future`` comes with two scripts called ``futurize`` and
``pasteurize`` to aid in making Python 2 code or Python 3 code compatible with
both platforms (Py2/3). It is based on 2to3 and uses fixers from ``lib2to3``,
``lib3to2``, and ``python-modernize``, as well as custom fixers.

``futurize`` passes Python 2 code through all the appropriate fixers to turn it
into valid Python 3 code, and then adds ``__future__`` and ``future`` package
imports so that it also runs under Python 2.

For conversions from Python 3 code to Py2/3, use the ``pasteurize`` script
instead. This converts Py3-only constructs (e.g. new metaclass syntax) to
Py2/3 compatible constructs and adds ``__future__`` and ``future`` imports to
the top of each module.

In both cases, the result should be relatively clean Py3-style code that runs
mostly unchanged on both Python 2 and Python 3.

Futurize: 2 to both
~~~~~~~~~~~~~~~~~~~

For example, running ``futurize -w mymodule.py`` turns this Python 2 code:

.. code-block:: python

    import Queue
    from urllib2 import urlopen

    def greet(name):
        print 'Hello',
        print name

    print "What's your name?",
    name = raw_input()
    greet(name)

into this code which runs on both Py2 and Py3:

.. code-block:: python

    from __future__ import print_function
    from future import standard_library
    standard_library.install_aliases()
    from builtins import input
    import queue
    from urllib.request import urlopen

    def greet(name):
        print('Hello', end=' ')
        print(name)

    print("What's your name?", end=' ')
    name = input()
    greet(name)

See :ref:`forwards-conversion` and :ref:`backwards-conversion` for more details.


Automatic translation
---------------------

The ``past`` package can automatically translate some simple Python 2
modules to Python 3 upon import. The goal is to support the "long tail" of
real-world Python 2 modules (e.g. on PyPI) that have not been ported yet. For
example, here is how to use a Python 2-only package called ``plotrique`` on
Python 3. First install it:

.. code-block:: bash

    $ pip3 install plotrique==0.2.5-7 --no-compile   # to ignore SyntaxErrors

(or use ``pip`` if this points to your Py3 environment.)

Then pass a whitelist of module name prefixes to the ``autotranslate()`` function.
Example:

.. code-block:: bash

    $ python3

    >>> from past import autotranslate
    >>> autotranslate(['plotrique'])
    >>> import plotrique

This transparently translates and runs the ``plotrique`` module and any
submodules in the ``plotrique`` package that ``plotrique`` imports.

This is intended to help you migrate to Python 3 without the need for all
your code's dependencies to support Python 3 yet. It should be used as a
last resort; ideally Python 2-only dependencies should be ported
properly to a Python 2/3 compatible codebase using a tool like
``futurize`` and the changes should be pushed to the upstream project.

Note: the auto-translation feature is still in alpha; it needs more testing and
development, and will likely never be perfect.

For more info, see :ref:`translation`.

Licensing
---------

:Author:  Ed Schofield, Jordan M. Adler, et al

:Copyright: 2013-2018 Python Charmers Pty Ltd, Australia.

:Sponsors: Python Charmers Pty Ltd, Australia, and Python Charmers Pte
           Ltd, Singapore. http://pythoncharmers.com
           
           Pinterest https://opensource.pinterest.com/

:Licence: MIT. See ``LICENSE.txt`` or `here <http://python-future.org/credits.html>`_.

:Other credits:  See `here <http://python-future.org/credits.html>`_.


Next steps
----------

If you are new to Python-Future, check out the `Quickstart Guide
<http://python-future.org/quickstart.html>`_.

For an update on changes in the latest version, see the `What's New
<http://python-future.org/whatsnew.html>`_ page.
PK�(�\�;2,2,doc/alt-python37-PyYAML/CHANGESnu�[���
For a complete changelog, see:

* https://github.com/yaml/pyyaml/commits/
* https://bitbucket.org/xi/pyyaml/commits/

5.4.1 (2021-01-20)

* https://github.com/yaml/pyyaml/pull/480 -- Fix stub compat with older pyyaml versions that may unwittingly load it

5.4 (2021-01-19)

* https://github.com/yaml/pyyaml/pull/407 -- Build modernization, remove distutils, fix metadata, build wheels, CI to GHA
* https://github.com/yaml/pyyaml/pull/472 -- Fix for CVE-2020-14343, moves arbitrary python tags to UnsafeLoader
* https://github.com/yaml/pyyaml/pull/441 -- Fix memory leak in implicit resolver setup
* https://github.com/yaml/pyyaml/pull/392 -- Fix py2 copy support for timezone objects
* https://github.com/yaml/pyyaml/pull/378 -- Fix compatibility with Jython

5.3.1 (2020-03-18)

* https://github.com/yaml/pyyaml/pull/386 -- Prevents arbitrary code execution during python/object/new constructor

5.3 (2020-01-06)

* https://github.com/yaml/pyyaml/pull/290 -- Use `is` instead of equality for comparing with `None`
* https://github.com/yaml/pyyaml/pull/270 -- Fix typos and stylistic nit
* https://github.com/yaml/pyyaml/pull/309 -- Fix up small typo
* https://github.com/yaml/pyyaml/pull/161 -- Fix handling of __slots__
* https://github.com/yaml/pyyaml/pull/358 -- Allow calling add_multi_constructor with None
* https://github.com/yaml/pyyaml/pull/285 -- Add use of safe_load() function in README
* https://github.com/yaml/pyyaml/pull/351 -- Fix reader for Unicode code points over 0xFFFF
* https://github.com/yaml/pyyaml/pull/360 -- Enable certain unicode tests when maxunicode not > 0xffff
* https://github.com/yaml/pyyaml/pull/359 -- Use full_load in yaml-highlight example
* https://github.com/yaml/pyyaml/pull/244 -- Document that PyYAML is implemented with Cython
* https://github.com/yaml/pyyaml/pull/329 -- Fix for Python 3.10
* https://github.com/yaml/pyyaml/pull/310 -- Increase size of index, line, and column fields
* https://github.com/yaml/pyyaml/pull/260 -- Remove some unused imports
* https://github.com/yaml/pyyaml/pull/163 -- Create timezone-aware datetimes when parsed as such
* https://github.com/yaml/pyyaml/pull/363 -- Add tests for timezone

5.2 (2019-12-02)
------------------

* Repair incompatibilities introduced with 5.1. The default Loader was changed,
  but several methods like add_constructor still used the old default
  https://github.com/yaml/pyyaml/pull/279 -- A more flexible fix for custom tag constructors
  https://github.com/yaml/pyyaml/pull/287 -- Change default loader for yaml.add_constructor
  https://github.com/yaml/pyyaml/pull/305 -- Change default loader for add_implicit_resolver, add_path_resolver
* Make FullLoader safer by removing python/object/apply from the default FullLoader
  https://github.com/yaml/pyyaml/pull/347 -- Move constructor for object/apply to UnsafeConstructor
* Fix bug introduced in 5.1 where quoting went wrong on systems with sys.maxunicode <= 0xffff
  https://github.com/yaml/pyyaml/pull/276 -- Fix logic for quoting special characters
* Other PRs:
  https://github.com/yaml/pyyaml/pull/280 -- Update CHANGES for 5.1

5.1.2 (2019-07-30)
------------------

* Re-release of 5.1 with regenerated Cython sources to build properly for Python 3.8b2+

5.1.1 (2019-06-05)
------------------

* Re-release of 5.1 with regenerated Cython sources to build properly for Python 3.8b1

5.1 (2019-03-13)
----------------

* https://github.com/yaml/pyyaml/pull/35 -- Some modernization of the test running
* https://github.com/yaml/pyyaml/pull/42 -- Install tox in a virtualenv
* https://github.com/yaml/pyyaml/pull/45 -- Allow colon in a plain scalar in a flow context
* https://github.com/yaml/pyyaml/pull/48 -- Fix typos
* https://github.com/yaml/pyyaml/pull/55 -- Improve RepresenterError creation
* https://github.com/yaml/pyyaml/pull/59 -- Resolves #57, update readme issues link
* https://github.com/yaml/pyyaml/pull/60 -- Document and test Python 3.6 support
* https://github.com/yaml/pyyaml/pull/61 -- Use Travis CI built in pip cache support
* https://github.com/yaml/pyyaml/pull/62 -- Remove tox workaround for Travis CI
* https://github.com/yaml/pyyaml/pull/63 -- Adding support to Unicode characters over codepoint 0xffff
* https://github.com/yaml/pyyaml/pull/75 -- add 3.12 changelog
* https://github.com/yaml/pyyaml/pull/76 -- Fallback to Pure Python if Compilation fails
* https://github.com/yaml/pyyaml/pull/84 -- Drop unsupported Python 3.3
* https://github.com/yaml/pyyaml/pull/102 -- Include license file in the generated wheel package
* https://github.com/yaml/pyyaml/pull/105 -- Removed Python 2.6 & 3.3 support
* https://github.com/yaml/pyyaml/pull/111 -- Remove commented out Psyco code
* https://github.com/yaml/pyyaml/pull/129 -- Remove call to `ord` in lib3 emitter code
* https://github.com/yaml/pyyaml/pull/149 -- Test on Python 3.7-dev
* https://github.com/yaml/pyyaml/pull/158 -- Support escaped slash in double quotes "\/"
* https://github.com/yaml/pyyaml/pull/175 -- Updated link to pypi in release announcement
* https://github.com/yaml/pyyaml/pull/181 -- Import Hashable from collections.abc
* https://github.com/yaml/pyyaml/pull/194 -- Reverting https://github.com/yaml/pyyaml/pull/74
* https://github.com/yaml/pyyaml/pull/195 -- Build libyaml on travis
* https://github.com/yaml/pyyaml/pull/196 -- Force cython when building sdist
* https://github.com/yaml/pyyaml/pull/254 -- Allow to turn off sorting keys in Dumper (2)
* https://github.com/yaml/pyyaml/pull/256 -- Make default_flow_style=False
* https://github.com/yaml/pyyaml/pull/257 -- Deprecate yaml.load and add FullLoader and UnsafeLoader classes
* https://github.com/yaml/pyyaml/pull/261 -- Skip certain unicode tests when maxunicode not > 0xffff
* https://github.com/yaml/pyyaml/pull/263 -- Windows Appveyor build

3.13 (2018-07-05)
-----------------

* Resolved issues around PyYAML working in Python 3.7.

3.12 (2016-08-28)
-----------------

* Wheel packages for Windows binaries.
* Adding an implicit resolver to a derived loader should not affect the base loader.
* Uniform representation for OrderedDict? across different versions of Python.
* Fixed comparison to None warning.

3.11 (2014-03-26)
-----------------

* Source and binary distributions are rebuilt against the latest
  versions of Cython and LibYAML.

3.10 (2011-05-30)
-----------------

* Do not try to build LibYAML bindings on platforms other than CPython
  (Thank to olt(at)bogosoft(dot)com).
* Clear cyclic references in the parser and the emitter
  (Thank to kristjan(at)ccpgames(dot)com).
* Dropped support for Python 2.3 and 2.4.

3.09 (2009-08-31)
-----------------

* Fixed an obscure scanner error not reported when there is
  no line break at the end of the stream (Thank to Ingy).
* Fixed use of uninitialized memory when emitting anchors with
  LibYAML bindings (Thank to cegner(at)yahoo-inc(dot)com).
* Fixed emitting incorrect BOM characters for UTF-16 (Thank to
  Valentin Nechayev)
* Fixed the emitter for folded scalars not respecting the preferred
  line width (Thank to Ingy).
* Fixed a subtle ordering issue with emitting '%TAG' directives
  (Thank to Andrey Somov).
* Fixed performance regression with LibYAML bindings.


3.08 (2008-12-31)
-----------------

* Python 3 support (Thank to Erick Tryzelaar).
* Use Cython instead of Pyrex to build LibYAML bindings.
* Refactored support for unicode and byte input/output streams.


3.07 (2008-12-29)
-----------------

* The emitter learned to use an optional indentation indicator
  for block scalar; thus scalars with leading whitespaces
  could now be represented in a literal or folded style.
* The test suite is now included in the source distribution.
  To run the tests, type 'python setup.py test'.
* Refactored the test suite: dropped unittest in favor of
  a custom test appliance.
* Fixed the path resolver in CDumper.
* Forced an explicit document end indicator when there is
  a possibility of parsing ambiguity.
* More setup.py improvements: the package should be usable
  when any combination of setuptools, Pyrex and LibYAML
  is installed.
* Windows binary packages are built against LibYAML-0.1.2.
* Minor typos and corrections (Thank to Ingy dot Net
  and Andrey Somov).


3.06 (2008-10-03)
-----------------

* setup.py checks whether LibYAML is installed and if so, builds
  and installs LibYAML bindings.  To force or disable installation
  of LibYAML bindings, use '--with-libyaml' or '--without-libyaml'
  respectively.
* The source distribution includes compiled Pyrex sources so
  building LibYAML bindings no longer requires Pyrex installed.
* 'yaml.load()' raises an exception if the input stream contains
  more than one YAML document.
* Fixed exceptions produced by LibYAML bindings.
* Fixed a dot '.' character being recognized as !!float.
* Fixed Python 2.3 compatibility issue in constructing !!timestamp values.
* Windows binary packages are built against the LibYAML stable branch.
* Added attributes 'yaml.__version__' and  'yaml.__with_libyaml__'.


3.05 (2007-05-13)
-----------------

* Windows binary packages were built with LibYAML trunk.
* Fixed a bug that prevent processing a live stream of YAML documents in
  timely manner (Thanks edward(at)sweetbytes(dot)net).
* Fixed a bug when the path in add_path_resolver contains boolean values
  (Thanks jstroud(at)mbi(dot)ucla(dot)edu).
* Fixed loss of microsecond precision in timestamps
  (Thanks edemaine(at)mit(dot)edu).
* Fixed loading an empty YAML stream.
* Allowed immutable subclasses of YAMLObject.
* Made the encoding of the unicode->str conversion explicit so that
  the conversion does not depend on the default Python encoding.
* Forced emitting float values in a YAML compatible form.


3.04 (2006-08-20)
-----------------

* Include experimental LibYAML bindings.
* Fully support recursive structures.
* Sort dictionary keys.  Mapping node values are now represented
  as lists of pairs instead of dictionaries.  No longer check
  for duplicate mapping keys as it didn't work correctly anyway.
* Fix invalid output of single-quoted scalars in cases when a single
  quote is not escaped when preceded by whitespaces or line breaks.
* To make porting easier, rewrite Parser not using generators.
* Fix handling of unexpected block mapping values.
* Fix a bug in Representer.represent_object: copy_reg.dispatch_table
  was not correctly handled.
* Fix a bug when a block scalar is incorrectly emitted in the simple
  key context.
* Hold references to the objects being represented.
* Make Representer not try to guess !!pairs when a list is represented.
* Fix timestamp constructing and representing.
* Fix the 'N' plain scalar being incorrectly recognized as !!bool.


3.03 (2006-06-19)
-----------------

* Fix Python 2.5 compatibility issues.
* Fix numerous bugs in the float handling.
* Fix scanning some ill-formed documents.
* Other minor fixes.


3.02 (2006-05-15)
-----------------

* Fix win32 installer.  Apparently bdist_wininst does not work well
  under Linux.
* Fix a bug in add_path_resolver.
* Add the yaml-highlight example.  Try to run on a color terminal:
  `python yaml_hl.py <any_document.yaml`.


3.01 (2006-05-07)
-----------------

* Initial release.  The version number reflects the codename
  of the project (PyYAML 3000) and differentiates it from
  the abandoned PyYaml module.

PK�(�\�2��doc/alt-python37-PyYAML/READMEnu�[���PyYAML - The next generation YAML parser and emitter for Python.

To install, type 'python setup.py install'.

By default, the setup.py script checks whether LibYAML is installed
and if so, builds and installs LibYAML bindings.  To skip the check
and force installation of LibYAML bindings, use the option '--with-libyaml':
'python setup.py --with-libyaml install'.  To disable the check and
skip building and installing LibYAML bindings, use '--without-libyaml':
'python setup.py --without-libyaml install'.

When LibYAML bindings are installed, you may use fast LibYAML-based
parser and emitter as follows:

    >>> yaml.load(stream, Loader=yaml.CLoader)
    >>> yaml.dump(data, Dumper=yaml.CDumper)

If you don't trust the input stream, you should use:

    >>> yaml.safe_load(stream)

PyYAML includes a comprehensive test suite.  To run the tests,
type 'python setup.py test'.

For more information, check the PyYAML homepage:
'https://github.com/yaml/pyyaml'.

For PyYAML tutorial and reference, see:
'http://pyyaml.org/wiki/PyYAMLDocumentation'.

Discuss PyYAML with the maintainers in IRC #pyyaml irc.freenode.net.

You may also use the YAML-Core mailing list:
'http://lists.sourceforge.net/lists/listinfo/yaml-core'.

Submit bug reports and feature requests to the PyYAML bug tracker:
'https://github.com/yaml/pyyaml/issues'.

The PyYAML module was written by Kirill Simonov <xi@resolvent.net>.
It is currently maintained by the YAML and Python communities.

PyYAML is released under the MIT license.
See the file LICENSE for more details.
PK�(�\��<doc/alt-python37-PyYAML/examples/pygments-lexer/example.yamlnu�[���
#
# Examples from the Preview section of the YAML specification
# (http://yaml.org/spec/1.2/#Preview)
#

# Sequence of scalars
---
- Mark McGwire
- Sammy Sosa
- Ken Griffey

# Mapping scalars to scalars
---
hr:  65    # Home runs
avg: 0.278 # Batting average
rbi: 147   # Runs Batted In

# Mapping scalars to sequences
---
american:
  - Boston Red Sox
  - Detroit Tigers
  - New York Yankees
national:
  - New York Mets
  - Chicago Cubs
  - Atlanta Braves

# Sequence of mappings
---
-
  name: Mark McGwire
  hr:   65
  avg:  0.278
-
  name: Sammy Sosa
  hr:   63
  avg:  0.288

# Sequence of sequences
---
- [name        , hr, avg  ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa  , 63, 0.288]

# Mapping of mappings
---
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
    hr: 63,
    avg: 0.288
  }

# Two documents in a stream
--- # Ranking of 1998 home runs
- Mark McGwire
- Sammy Sosa
- Ken Griffey
--- # Team ranking
- Chicago Cubs
- St Louis Cardinals

# Documents with the end indicator
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...

# Comments
---
hr: # 1998 hr ranking
  - Mark McGwire
  - Sammy Sosa
rbi:
  # 1998 rbi ranking
  - Sammy Sosa
  - Ken Griffey

# Anchors and aliases
---
hr:
  - Mark McGwire
  # Following node labeled SS
  - &SS Sammy Sosa
rbi:
  - *SS # Subsequent occurrence
  - Ken Griffey

# Mapping between sequences
---
? - Detroit Tigers
  - Chicago cubs
:
  - 2001-07-23
? [ New York Yankees,
    Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
    2001-08-14 ]

# Inline nested mapping
---
# products purchased
- item    : Super Hoop
  quantity: 1
- item    : Basketball
  quantity: 4
- item    : Big Shoes
  quantity: 1

# Literal scalars
--- | # ASCII art
  \//||\/||
  // ||  ||__

# Folded scalars
--- >
  Mark McGwire's
  year was crippled
  by a knee injury.

# Preserved indented block in a folded scalar
---
>
 Sammy Sosa completed another
 fine season with great stats.

   63 Home Runs
   0.288 Batting Average

 What a year!

# Indentation determines scope
---
name: Mark McGwire
accomplishment: >
  Mark set a major league
  home run record in 1998.
stats: |
  65 Home Runs
  0.278 Batting Average

# Quoted scalars
---
unicode: "Sosa did fine.\u263A"
control: "\b1998\t1999\t2000\n"
hex esc: "\x0d\x0a is \r\n"
single: '"Howdy!" he cried.'
quoted: ' # not a ''comment''.'
tie-fighter: '|\-*-/|'

# Multi-line flow scalars
---
plain:
  This unquoted scalar
  spans many lines.
quoted: "So does this
  quoted scalar.\n"

# Integers
---
canonical: 12345
decimal: +12_345
sexagesimal: 3:25:45
octal: 014
hexadecimal: 0xC

# Floating point
---
canonical: 1.23015e+3
exponential: 12.3015e+02
sexagesimal: 20:30.15
fixed: 1_230.15
negative infinity: -.inf
not a number: .NaN

# Miscellaneous
---
null: ~
true: boolean
false: boolean
string: '12345'

# Timestamps
---
canonical: 2001-12-15T02:59:43.1Z
iso8601: 2001-12-14t21:59:43.10-05:00
spaced: 2001-12-14 21:59:43.10 -5
date: 2002-12-14

# Various explicit tags
---
not-date: !!str 2002-04-28
picture: !!binary |
 R0lGODlhDAAMAIQAAP//9/X
 17unp5WZmZgAAAOfn515eXv
 Pz7Y6OjuDg4J+fn5OTk6enp
 56enmleECcgggoBADs=
application specific tag: !something |
 The semantics of the tag
 above may be different for
 different documents.

# Global tags
%TAG ! tag:clarkevans.com,2002:
--- !shape
  # Use the ! handle for presenting
  # tag:clarkevans.com,2002:circle
- !circle
  center: &ORIGIN {x: 73, y: 129}
  radius: 7
- !line
  start: *ORIGIN
  finish: { x: 89, y: 102 }
- !label
  start: *ORIGIN
  color: 0xFFEEBB
  text: Pretty vector drawing.

# Unordered sets
--- !!set
# sets are represented as a
# mapping where each key is
# associated with the empty string
? Mark McGwire
? Sammy Sosa
? Ken Griff

# Ordered mappings
--- !!omap
# ordered maps are represented as
# a sequence of mappings, with
# each mapping having one key
- Mark McGwire: 65
- Sammy Sosa: 63
- Ken Griffy: 58

# Full length example
--- !<tag:clarkevans.com,2002:invoice>
invoice: 34843
date   : 2001-01-23
bill-to: &id001
    given  : Chris
    family : Dumars
    address:
        lines: |
            458 Walkman Dr.
            Suite #292
        city    : Royal Oak
        state   : MI
        postal  : 48046
ship-to: *id001
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
    - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
comments:
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.

# Another full-length example
---
Time: 2001-11-23 15:01:42 -5
User: ed
Warning:
  This is an error message
  for the log file
---
Time: 2001-11-23 15:02:31 -5
User: ed
Warning:
  A slightly different error
  message.
---
Date: 2001-11-23 15:03:17 -5
User: ed
Fatal:
  Unknown variable "bar"
Stack:
  - file: TopClass.py
    line: 23
    code: |
      x = MoreObject("345\n")
  - file: MoreClass.py
    line: 58
    code: |-
      foo = bar

PK�(�\x��^==7doc/alt-python37-PyYAML/examples/pygments-lexer/yaml.pynu�[���
"""
yaml.py

Lexer for YAML, a human-friendly data serialization language
(http://yaml.org/).

Written by Kirill Simonov <xi@resolvent.net>.

License: Whatever suitable for inclusion into the Pygments package.
"""

from pygments.lexer import  \
        ExtendedRegexLexer, LexerContext, include, bygroups
from pygments.token import  \
        Text, Comment, Punctuation, Name, Literal

__all__ = ['YAMLLexer']


class YAMLLexerContext(LexerContext):
    """Indentation context for the YAML lexer."""

    def __init__(self, *args, **kwds):
        super(YAMLLexerContext, self).__init__(*args, **kwds)
        self.indent_stack = []
        self.indent = -1
        self.next_indent = 0
        self.block_scalar_indent = None


def something(TokenClass):
    """Do not produce empty tokens."""
    def callback(lexer, match, context):
        text = match.group()
        if not text:
            return
        yield match.start(), TokenClass, text
        context.pos = match.end()
    return callback

def reset_indent(TokenClass):
    """Reset the indentation levels."""
    def callback(lexer, match, context):
        text = match.group()
        context.indent_stack = []
        context.indent = -1
        context.next_indent = 0
        context.block_scalar_indent = None
        yield match.start(), TokenClass, text
        context.pos = match.end()
    return callback

def save_indent(TokenClass, start=False):
    """Save a possible indentation level."""
    def callback(lexer, match, context):
        text = match.group()
        extra = ''
        if start:
            context.next_indent = len(text)
            if context.next_indent < context.indent:
                while context.next_indent < context.indent:
                    context.indent = context.indent_stack.pop()
                if context.next_indent > context.indent:
                    extra = text[context.indent:]
                    text = text[:context.indent]
        else:
            context.next_indent += len(text)
        if text:
            yield match.start(), TokenClass, text
        if extra:
            yield match.start()+len(text), TokenClass.Error, extra
        context.pos = match.end()
    return callback

def set_indent(TokenClass, implicit=False):
    """Set the previously saved indentation level."""
    def callback(lexer, match, context):
        text = match.group()
        if context.indent < context.next_indent:
            context.indent_stack.append(context.indent)
            context.indent = context.next_indent
        if not implicit:
            context.next_indent += len(text)
        yield match.start(), TokenClass, text
        context.pos = match.end()
    return callback

def set_block_scalar_indent(TokenClass):
    """Set an explicit indentation level for a block scalar."""
    def callback(lexer, match, context):
        text = match.group()
        context.block_scalar_indent = None
        if not text:
            return
        increment = match.group(1)
        if increment:
            current_indent = max(context.indent, 0)
            increment = int(increment)
            context.block_scalar_indent = current_indent + increment
        if text:
            yield match.start(), TokenClass, text
            context.pos = match.end()
    return callback

def parse_block_scalar_empty_line(IndentTokenClass, ContentTokenClass):
    """Process an empty line in a block scalar."""
    def callback(lexer, match, context):
        text = match.group()
        if (context.block_scalar_indent is None or
                len(text) <= context.block_scalar_indent):
            if text:
                yield match.start(), IndentTokenClass, text
        else:
            indentation = text[:context.block_scalar_indent]
            content = text[context.block_scalar_indent:]
            yield match.start(), IndentTokenClass, indentation
            yield (match.start()+context.block_scalar_indent,
                    ContentTokenClass, content)
        context.pos = match.end()
    return callback

def parse_block_scalar_indent(TokenClass):
    """Process indentation spaces in a block scalar."""
    def callback(lexer, match, context):
        text = match.group()
        if context.block_scalar_indent is None:
            if len(text) <= max(context.indent, 0):
                context.stack.pop()
                context.stack.pop()
                return
            context.block_scalar_indent = len(text)
        else:
            if len(text) < context.block_scalar_indent:
                context.stack.pop()
                context.stack.pop()
                return
        if text:
            yield match.start(), TokenClass, text
            context.pos = match.end()
    return callback

def parse_plain_scalar_indent(TokenClass):
    """Process indentation spaces in a plain scalar."""
    def callback(lexer, match, context):
        text = match.group()
        if len(text) <= context.indent:
            context.stack.pop()
            context.stack.pop()
            return
        if text:
            yield match.start(), TokenClass, text
            context.pos = match.end()
    return callback


class YAMLLexer(ExtendedRegexLexer):
    """Lexer for the YAML language."""

    name = 'YAML'
    aliases = ['yaml']
    filenames = ['*.yaml', '*.yml']
    mimetypes = ['text/x-yaml']

    tokens = {

        # the root rules
        'root': [
            # ignored whitespaces
            (r'[ ]+(?=#|$)', Text.Blank),
            # line breaks
            (r'\n+', Text.Break),
            # a comment
            (r'#[^\n]*', Comment.Single),
            # the '%YAML' directive
            (r'^%YAML(?=[ ]|$)', reset_indent(Name.Directive),
                'yaml-directive'),
            # the %TAG directive
            (r'^%TAG(?=[ ]|$)', reset_indent(Name.Directive),
                'tag-directive'),
            # document start and document end indicators
            (r'^(?:---|\.\.\.)(?=[ ]|$)',
                reset_indent(Punctuation.Document), 'block-line'),
            # indentation spaces
            (r'[ ]*(?![ \t\n\r\f\v]|$)',
                save_indent(Text.Indent, start=True),
                ('block-line', 'indentation')),
        ],

        # trailing whitespaces after directives or a block scalar indicator
        'ignored-line': [
            # ignored whitespaces
            (r'[ ]+(?=#|$)', Text.Blank),
            # a comment
            (r'#[^\n]*', Comment.Single),
            # line break
            (r'\n', Text.Break, '#pop:2'),
        ],

        # the %YAML directive
        'yaml-directive': [
            # the version number
            (r'([ ]+)([0-9]+\.[0-9]+)',
                bygroups(Text.Blank, Literal.Version), 'ignored-line'),
        ],

        # the %YAG directive
        'tag-directive': [
            # a tag handle and the corresponding prefix
            (r'([ ]+)(!|![0-9A-Za-z_-]*!)'
                r'([ ]+)(!|!?[0-9A-Za-z;/?:@&=+$,_.!~*\'()\[\]%-]+)',
                bygroups(Text.Blank, Name.Type, Text.Blank, Name.Type),
                'ignored-line'),
        ],

        # block scalar indicators and indentation spaces
        'indentation': [
            # trailing whitespaces are ignored
            (r'[ ]*$', something(Text.Blank), '#pop:2'),
            # whitespaces preceding block collection indicators
            (r'[ ]+(?=[?:-](?:[ ]|$))', save_indent(Text.Indent)),
            # block collection indicators
            (r'[?:-](?=[ ]|$)', set_indent(Punctuation.Indicator)),
            # the beginning a block line
            (r'[ ]*', save_indent(Text.Indent), '#pop'),
        ],

        # an indented line in the block context
        'block-line': [
            # the line end
            (r'[ ]*(?=#|$)', something(Text.Blank), '#pop'),
            # whitespaces separating tokens
            (r'[ ]+', Text.Blank),
            # tags, anchors and aliases,
            include('descriptors'),
            # block collections and scalars
            include('block-nodes'),
            # flow collections and quoted scalars
            include('flow-nodes'),
            # a plain scalar
            (r'(?=[^ \t\n\r\f\v?:,\[\]{}#&*!|>\'"%@`-]|[?:-][^ \t\n\r\f\v])',
                something(Literal.Scalar.Plain),
                'plain-scalar-in-block-context'),
        ],

        # tags, anchors, aliases
        'descriptors' : [
            # a full-form tag
            (r'!<[0-9A-Za-z;/?:@&=+$,_.!~*\'()\[\]%-]+>', Name.Type),
            # a tag in the form '!', '!suffix' or '!handle!suffix'
            (r'!(?:[0-9A-Za-z_-]+)?'
                r'(?:![0-9A-Za-z;/?:@&=+$,_.!~*\'()\[\]%-]+)?', Name.Type),
            # an anchor
            (r'&[0-9A-Za-z_-]+', Name.Anchor),
            # an alias
            (r'\*[0-9A-Za-z_-]+', Name.Alias),
        ],

        # block collections and scalars
        'block-nodes': [
            # implicit key
            (r':(?=[ ]|$)', set_indent(Punctuation.Indicator, implicit=True)),
            # literal and folded scalars
            (r'[|>]', Punctuation.Indicator,
                ('block-scalar-content', 'block-scalar-header')),
        ],

        # flow collections and quoted scalars
        'flow-nodes': [
            # a flow sequence
            (r'\[', Punctuation.Indicator, 'flow-sequence'),
            # a flow mapping
            (r'\{', Punctuation.Indicator, 'flow-mapping'),
            # a single-quoted scalar
            (r'\'', Literal.Scalar.Flow.Quote, 'single-quoted-scalar'),
            # a double-quoted scalar
            (r'\"', Literal.Scalar.Flow.Quote, 'double-quoted-scalar'),
        ],

        # the content of a flow collection
        'flow-collection': [
            # whitespaces
            (r'[ ]+', Text.Blank),
            # line breaks
            (r'\n+', Text.Break),
            # a comment
            (r'#[^\n]*', Comment.Single),
            # simple indicators
            (r'[?:,]', Punctuation.Indicator),
            # tags, anchors and aliases
            include('descriptors'),
            # nested collections and quoted scalars
            include('flow-nodes'),
            # a plain scalar
            (r'(?=[^ \t\n\r\f\v?:,\[\]{}#&*!|>\'"%@`])',
                something(Literal.Scalar.Plain),
                'plain-scalar-in-flow-context'),
        ],

        # a flow sequence indicated by '[' and ']'
        'flow-sequence': [
            # include flow collection rules
            include('flow-collection'),
            # the closing indicator
            (r'\]', Punctuation.Indicator, '#pop'),
        ],

        # a flow mapping indicated by '{' and '}'
        'flow-mapping': [
            # include flow collection rules
            include('flow-collection'),
            # the closing indicator
            (r'\}', Punctuation.Indicator, '#pop'),
        ],

        # block scalar lines
        'block-scalar-content': [
            # line break
            (r'\n', Text.Break),
            # empty line
            (r'^[ ]+$',
                parse_block_scalar_empty_line(Text.Indent,
                    Literal.Scalar.Block)),
            # indentation spaces (we may leave the state here)
            (r'^[ ]*', parse_block_scalar_indent(Text.Indent)),
            # line content
            (r'[^\n\r\f\v]+', Literal.Scalar.Block),
        ],

        # the content of a literal or folded scalar
        'block-scalar-header': [
            # indentation indicator followed by chomping flag
            (r'([1-9])?[+-]?(?=[ ]|$)',
                set_block_scalar_indent(Punctuation.Indicator),
                'ignored-line'),
            # chomping flag followed by indentation indicator
            (r'[+-]?([1-9])?(?=[ ]|$)',
                set_block_scalar_indent(Punctuation.Indicator),
                'ignored-line'),
        ],

        # ignored and regular whitespaces in quoted scalars
        'quoted-scalar-whitespaces': [
            # leading and trailing whitespaces are ignored
            (r'^[ ]+|[ ]+$', Text.Blank),
            # line breaks are ignored
            (r'\n+', Text.Break),
            # other whitespaces are a part of the value
            (r'[ ]+', Literal.Scalar.Flow),
        ],

        # single-quoted scalars
        'single-quoted-scalar': [
            # include whitespace and line break rules
            include('quoted-scalar-whitespaces'),
            # escaping of the quote character
            (r'\'\'', Literal.Scalar.Flow.Escape),
            # regular non-whitespace characters
            (r'[^ \t\n\r\f\v\']+', Literal.Scalar.Flow),
            # the closing quote
            (r'\'', Literal.Scalar.Flow.Quote, '#pop'),
        ],

        # double-quoted scalars
        'double-quoted-scalar': [
            # include whitespace and line break rules
            include('quoted-scalar-whitespaces'),
            # escaping of special characters
            (r'\\[0abt\tn\nvfre "\\N_LP]', Literal.Scalar.Flow.Escape),
            # escape codes
            (r'\\(?:x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})',
                Literal.Scalar.Flow.Escape),
            # regular non-whitespace characters
            (r'[^ \t\n\r\f\v\"\\]+', Literal.Scalar.Flow),
            # the closing quote
            (r'"', Literal.Scalar.Flow.Quote, '#pop'),
        ],

        # the beginning of a new line while scanning a plain scalar
        'plain-scalar-in-block-context-new-line': [
            # empty lines
            (r'^[ ]+$', Text.Blank),
            # line breaks
            (r'\n+', Text.Break),
            # document start and document end indicators
            (r'^(?=---|\.\.\.)', something(Punctuation.Document), '#pop:3'),
            # indentation spaces (we may leave the block line state here)
            (r'^[ ]*', parse_plain_scalar_indent(Text.Indent), '#pop'),
        ],

        # a plain scalar in the block context
        'plain-scalar-in-block-context': [
            # the scalar ends with the ':' indicator
            (r'[ ]*(?=:[ ]|:$)', something(Text.Blank), '#pop'),
            # the scalar ends with whitespaces followed by a comment
            (r'[ ]+(?=#)', Text.Blank, '#pop'),
            # trailing whitespaces are ignored
            (r'[ ]+$', Text.Blank),
            # line breaks are ignored
            (r'\n+', Text.Break, 'plain-scalar-in-block-context-new-line'),
            # other whitespaces are a part of the value
            (r'[ ]+', Literal.Scalar.Plain),
            # regular non-whitespace characters
            (r'(?::(?![ \t\n\r\f\v])|[^ \t\n\r\f\v:])+',
                Literal.Scalar.Plain),
        ],

        # a plain scalar is the flow context
        'plain-scalar-in-flow-context': [
            # the scalar ends with an indicator character
            (r'[ ]*(?=[,:?\[\]{}])', something(Text.Blank), '#pop'),
            # the scalar ends with a comment
            (r'[ ]+(?=#)', Text.Blank, '#pop'),
            # leading and trailing whitespaces are ignored
            (r'^[ ]+|[ ]+$', Text.Blank),
            # line breaks are ignored
            (r'\n+', Text.Break),
            # other whitespaces are a part of the value
            (r'[ ]+', Literal.Scalar.Plain),
            # regular non-whitespace characters
            (r'[^ \t\n\r\f\v,:?\[\]{}]+', Literal.Scalar.Plain),
        ],

    }

    def get_tokens_unprocessed(self, text=None, context=None):
        if context is None:
            context = YAMLLexerContext(text, 0)
        return super(YAMLLexer, self).get_tokens_unprocessed(text, context)


PK�(�\H�5�RR:doc/alt-python37-PyYAML/examples/yaml-highlight/yaml_hl.pynu�[���#!/usr/bin/python

import yaml, codecs, sys, os.path, optparse

class Style:

    def __init__(self, header=None, footer=None,
            tokens=None, events=None, replaces=None):
        self.header = header
        self.footer = footer
        self.replaces = replaces
        self.substitutions = {}
        for domain, Class in [(tokens, 'Token'), (events, 'Event')]:
            if not domain:
                continue
            for key in domain:
                name = ''.join([part.capitalize() for part in key.split('-')])
                cls = getattr(yaml, '%s%s' % (name, Class))
                value = domain[key]
                if not value:
                    continue
                start = value.get('start')
                end = value.get('end')
                if start:
                    self.substitutions[cls, -1] = start
                if end:
                    self.substitutions[cls, +1] = end

    def __setstate__(self, state):
        self.__init__(**state)

yaml.add_path_resolver(u'tag:yaml.org,2002:python/object:__main__.Style',
        [None], dict)
yaml.add_path_resolver(u'tag:yaml.org,2002:pairs',
        [None, u'replaces'], list)

class YAMLHighlight:

    def __init__(self, options):
        config = yaml.full_load(file(options.config, 'rb').read())
        self.style = config[options.style]
        if options.input:
            self.input = file(options.input, 'rb')
        else:
            self.input = sys.stdin
        if options.output:
            self.output = file(options.output, 'wb')
        else:
            self.output = sys.stdout

    def highlight(self):
        input = self.input.read()
        if input.startswith(codecs.BOM_UTF16_LE):
            input = unicode(input, 'utf-16-le')
        elif input.startswith(codecs.BOM_UTF16_BE):
            input = unicode(input, 'utf-16-be')
        else:
            input = unicode(input, 'utf-8')
        substitutions = self.style.substitutions
        tokens = yaml.scan(input)
        events = yaml.parse(input)
        markers = []
        number = 0
        for token in tokens:
            number += 1
            if token.start_mark.index != token.end_mark.index:
                cls = token.__class__
                if (cls, -1) in substitutions:
                    markers.append([token.start_mark.index, +2, number, substitutions[cls, -1]])
                if (cls, +1) in substitutions:
                    markers.append([token.end_mark.index, -2, number, substitutions[cls, +1]])
        number = 0
        for event in events:
            number += 1
            cls = event.__class__
            if (cls, -1) in substitutions:
                markers.append([event.start_mark.index, +1, number, substitutions[cls, -1]])
            if (cls, +1) in substitutions:
                markers.append([event.end_mark.index, -1, number, substitutions[cls, +1]])
        markers.sort()
        markers.reverse()
        chunks = []
        position = len(input)
        for index, weight1, weight2, substitution in markers:
            if index < position:
                chunk = input[index:position]
                for substring, replacement in self.style.replaces:
                    chunk = chunk.replace(substring, replacement)
                chunks.append(chunk)
                position = index
            chunks.append(substitution)
        chunks.reverse()
        result = u''.join(chunks)
        if self.style.header:
            self.output.write(self.style.header)
        self.output.write(result.encode('utf-8'))
        if self.style.footer:
            self.output.write(self.style.footer)

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-s', '--style', dest='style', default='ascii',
            help="specify the highlighting style", metavar='STYLE')
    parser.add_option('-c', '--config', dest='config',
            default=os.path.join(os.path.dirname(sys.argv[0]), 'yaml_hl.cfg'),
            help="set an alternative configuration file", metavar='CONFIG')
    parser.add_option('-i', '--input', dest='input', default=None,
            help="set the input file (default: stdin)", metavar='FILE')
    parser.add_option('-o', '--output', dest='output', default=None,
            help="set the output file (default: stdout)", metavar='FILE')
    (options, args) = parser.parse_args()
    hl = YAMLHighlight(options)
    hl.highlight()

PK�(�\�f�-��;doc/alt-python37-PyYAML/examples/yaml-highlight/yaml_hl.cfgnu�[���%YAML 1.1
---

ascii:

    header: "\e[0;1;30;40m"

    footer: "\e[0m"

    tokens:
        stream-start:
        stream-end:
        directive:              { start: "\e[35m", end: "\e[0;1;30;40m" }
        document-start:         { start: "\e[35m", end: "\e[0;1;30;40m" }
        document-end:           { start: "\e[35m", end: "\e[0;1;30;40m" }
        block-sequence-start:
        block-mapping-start:
        block-end:
        flow-sequence-start:    { start: "\e[33m", end: "\e[0;1;30;40m" }
        flow-mapping-start:     { start: "\e[33m", end: "\e[0;1;30;40m" }
        flow-sequence-end:      { start: "\e[33m", end: "\e[0;1;30;40m" }
        flow-mapping-end:       { start: "\e[33m", end: "\e[0;1;30;40m" }
        key:                    { start: "\e[33m", end: "\e[0;1;30;40m" }
        value:                  { start: "\e[33m", end: "\e[0;1;30;40m" }
        block-entry:            { start: "\e[33m", end: "\e[0;1;30;40m" }
        flow-entry:             { start: "\e[33m", end: "\e[0;1;30;40m" }
        alias:                  { start: "\e[32m", end: "\e[0;1;30;40m" }
        anchor:                 { start: "\e[32m", end: "\e[0;1;30;40m" }
        tag:                    { start: "\e[32m", end: "\e[0;1;30;40m" }
        scalar:                 { start: "\e[36m", end: "\e[0;1;30;40m" }

    replaces:
        - "\r\n":   "\n"
        - "\r":     "\n"
        - "\n":     "\n"
        - "\x85":   "\n"
        - "\u2028": "\n"
        - "\u2029": "\n"

html: &html

    tokens:
        stream-start:
        stream-end:
        directive:              { start: <code class="directive_token">, end: </code> }
        document-start:         { start: <code class="document_start_token">, end: </code> }
        document-end:           { start: <code class="document_end_token">, end: </code> }
        block-sequence-start:
        block-mapping-start:
        block-end:
        flow-sequence-start:    { start: <code class="delimiter_token">, end: </code> }
        flow-mapping-start:     { start: <code class="delimiter_token">, end: </code> }
        flow-sequence-end:      { start: <code class="delimiter_token">, end: </code> }
        flow-mapping-end:       { start: <code class="delimiter_token">, end: </code> }
        key:                    { start: <code class="delimiter_token">, end: </code> }
        value:                  { start: <code class="delimiter_token">, end: </code> }
        block-entry:            { start: <code class="delimiter_token">, end: </code> }
        flow-entry:             { start: <code class="delimiter_token">, end: </code> }
        alias:                  { start: <code class="anchor_token">, end: </code> }
        anchor:                 { start: <code class="anchor_token">, end: </code> }
        tag:                    { start: <code class="tag_token">, end: </code> }
        scalar:                 { start: <code class="scalar_token">, end: </code> }

    events:
        stream-start:   { start: <pre class="yaml_stream"> }
        stream-end:     { end: </pre> }
        document-start: { start: <span class="document"> }
        document-end:   { end: </span> }
        sequence-start: { start: <span class="sequence"> }
        sequence-end:   { end: </span> }
        mapping-start:  { start: <span class="mapping"> }
        mapping-end:    { end: </span> }
        scalar:         { start: <span class="scalar">, end: </span> }

    replaces:
        - "\r\n":   "\n"
        - "\r":     "\n"
        - "\n":     "\n"
        - "\x85":   "\n"
        - "\u2028": "\n"
        - "\u2029": "\n"
        - "&":      "&amp;"
        - "<":      "&lt;"
        - ">":      "&gt;"

html-page:

    header: |
        <html>
        <head>
        <title>A YAML stream</title>
        <style type="text/css">
            .document { background: #FFF }
            .sequence { background: #EEF }
            .mapping { background: #EFE }
            .scalar { background: #FEE }
            .directive_token { color: #C0C }
            .document_start_token { color: #C0C; font-weight: bold }
            .document_end_token { color: #C0C; font-weight: bold }
            .delimiter_token { color: #600; font-weight: bold }
            .anchor_token { color: #090 }
            .tag_token { color: #090 }
            .scalar_token { color: #000 }
            .yaml_stream { color: #999 }
        </style>
        <body>

    footer: |
        </body>
        </html>

    <<: *html


# vim: ft=yaml
PK�(�\��4[[$doc/alt-python37-urllib3/LICENSE.txtnu�[���MIT License

Copyright (c) 2008-2020 Andrey Petrov and contributors (see CONTRIBUTORS.txt)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
PK�(�\�J.���$doc/alt-python37-urllib3/CHANGES.rstnu�[���Changes
=======

1.26.6 (2021-06-25)
-------------------

* Deprecated the ``urllib3.contrib.ntlmpool`` module. urllib3 is not able to support
  it properly due to `reasons listed in this issue <https://github.com/urllib3/urllib3/issues/2282>`_.
  If you are a user of this module please leave a comment.
* Changed ``HTTPConnection.request_chunked()`` to not erroneously emit multiple
  ``Transfer-Encoding`` headers in the case that one is already specified.
* Fixed typo in deprecation message to recommend ``Retry.DEFAULT_ALLOWED_METHODS``.


1.26.5 (2021-05-26)
-------------------

* Fixed deprecation warnings emitted in Python 3.10.
* Updated vendored ``six`` library to 1.16.0.
* Improved performance of URL parser when splitting
  the authority component.


1.26.4 (2021-03-15)
-------------------

* Changed behavior of the default ``SSLContext`` when connecting to HTTPS proxy
  during HTTPS requests. The default ``SSLContext`` now sets ``check_hostname=True``.


1.26.3 (2021-01-26)
-------------------

* Fixed bytes and string comparison issue with headers (Pull #2141)

* Changed ``ProxySchemeUnknown`` error message to be
  more actionable if the user supplies a proxy URL without
  a scheme. (Pull #2107)


1.26.2 (2020-11-12)
-------------------

* Fixed an issue where ``wrap_socket`` and ``CERT_REQUIRED`` wouldn't
  be imported properly on Python 2.7.8 and earlier (Pull #2052)


1.26.1 (2020-11-11)
-------------------

* Fixed an issue where two ``User-Agent`` headers would be sent if a
  ``User-Agent`` header key is passed as ``bytes`` (Pull #2047)


1.26.0 (2020-11-10)
-------------------

* **NOTE: urllib3 v2.0 will drop support for Python 2**.
  `Read more in the v2.0 Roadmap <https://urllib3.readthedocs.io/en/latest/v2-roadmap.html>`_.

* Added support for HTTPS proxies contacting HTTPS servers (Pull #1923, Pull #1806)

* Deprecated negotiating TLSv1 and TLSv1.1 by default. Users that
  still wish to use TLS earlier than 1.2 without a deprecation warning
  should opt-in explicitly by setting ``ssl_version=ssl.PROTOCOL_TLSv1_1`` (Pull #2002)
  **Starting in urllib3 v2.0: Connections that receive a ``DeprecationWarning`` will fail**

* Deprecated ``Retry`` options ``Retry.DEFAULT_METHOD_WHITELIST``, ``Retry.DEFAULT_REDIRECT_HEADERS_BLACKLIST``
  and ``Retry(method_whitelist=...)`` in favor of ``Retry.DEFAULT_ALLOWED_METHODS``,
  ``Retry.DEFAULT_REMOVE_HEADERS_ON_REDIRECT``, and ``Retry(allowed_methods=...)``
  (Pull #2000) **Starting in urllib3 v2.0: Deprecated options will be removed**

* Added default ``User-Agent`` header to every request (Pull #1750)

* Added ``urllib3.util.SKIP_HEADER`` for skipping ``User-Agent``, ``Accept-Encoding``, 
  and ``Host`` headers from being automatically emitted with requests (Pull #2018)

* Collapse ``transfer-encoding: chunked`` request data and framing into
  the same ``socket.send()`` call (Pull #1906)

* Send ``http/1.1`` ALPN identifier with every TLS handshake by default (Pull #1894)

* Properly terminate SecureTransport connections when CA verification fails (Pull #1977)

* Don't emit an ``SNIMissingWarning`` when passing ``server_hostname=None``
  to SecureTransport (Pull #1903)

* Disabled requesting TLSv1.2 session tickets as they weren't being used by urllib3 (Pull #1970)

* Suppress ``BrokenPipeError`` when writing request body after the server
  has closed the socket (Pull #1524)

* Wrap ``ssl.SSLError`` that can be raised from reading a socket (e.g. "bad MAC")
  into an ``urllib3.exceptions.SSLError`` (Pull #1939)


1.25.11 (2020-10-19)
--------------------

* Fix retry backoff time parsed from ``Retry-After`` header when given
  in the HTTP date format. The HTTP date was parsed as the local timezone
  rather than accounting for the timezone in the HTTP date (typically
  UTC) (Pull #1932, Pull #1935, Pull #1938, Pull #1949)

* Fix issue where an error would be raised when the ``SSLKEYLOGFILE``
  environment variable was set to the empty string. Now ``SSLContext.keylog_file``
  is not set in this situation (Pull #2016)


1.25.10 (2020-07-22)
--------------------

* Added support for ``SSLKEYLOGFILE`` environment variable for
  logging TLS session keys with use with programs like
  Wireshark for decrypting captured web traffic (Pull #1867)

* Fixed loading of SecureTransport libraries on macOS Big Sur
  due to the new dynamic linker cache (Pull #1905)

* Collapse chunked request bodies data and framing into one
  call to ``send()`` to reduce the number of TCP packets by 2-4x (Pull #1906)

* Don't insert ``None`` into ``ConnectionPool`` if the pool
  was empty when requesting a connection (Pull #1866)

* Avoid ``hasattr`` call in ``BrotliDecoder.decompress()`` (Pull #1858)


1.25.9 (2020-04-16)
-------------------

* Added ``InvalidProxyConfigurationWarning`` which is raised when
  erroneously specifying an HTTPS proxy URL. urllib3 doesn't currently
  support connecting to HTTPS proxies but will soon be able to
  and we would like users to migrate properly without much breakage.

  See `this GitHub issue <https://github.com/urllib3/urllib3/issues/1850>`_
  for more information on how to fix your proxy config. (Pull #1851)

* Drain connection after ``PoolManager`` redirect (Pull #1817)

* Ensure ``load_verify_locations`` raises ``SSLError`` for all backends (Pull #1812)

* Rename ``VerifiedHTTPSConnection`` to ``HTTPSConnection`` (Pull #1805)

* Allow the CA certificate data to be passed as a string (Pull #1804)

* Raise ``ValueError`` if method contains control characters (Pull #1800)

* Add ``__repr__`` to ``Timeout`` (Pull #1795)


1.25.8 (2020-01-20)
-------------------

* Drop support for EOL Python 3.4 (Pull #1774)

* Optimize _encode_invalid_chars (Pull #1787)


1.25.7 (2019-11-11)
-------------------

* Preserve ``chunked`` parameter on retries (Pull #1715, Pull #1734)

* Allow unset ``SERVER_SOFTWARE`` in App Engine (Pull #1704, Issue #1470)

* Fix issue where URL fragment was sent within the request target. (Pull #1732)

* Fix issue where an empty query section in a URL would fail to parse. (Pull #1732)

* Remove TLS 1.3 support in SecureTransport due to Apple removing support (Pull #1703)


1.25.6 (2019-09-24)
-------------------

* Fix issue where tilde (``~``) characters were incorrectly
  percent-encoded in the path. (Pull #1692)


1.25.5 (2019-09-19)
-------------------

* Add mitigation for BPO-37428 affecting Python <3.7.4 and OpenSSL 1.1.1+ which
  caused certificate verification to be enabled when using ``cert_reqs=CERT_NONE``.
  (Issue #1682)


1.25.4 (2019-09-19)
-------------------

* Propagate Retry-After header settings to subsequent retries. (Pull #1607)

* Fix edge case where Retry-After header was still respected even when
  explicitly opted out of. (Pull #1607)

* Remove dependency on ``rfc3986`` for URL parsing.

* Fix issue where URLs containing invalid characters within ``Url.auth`` would
  raise an exception instead of percent-encoding those characters.

* Add support for ``HTTPResponse.auto_close = False`` which makes HTTP responses
  work well with BufferedReaders and other ``io`` module features. (Pull #1652)

* Percent-encode invalid characters in URL for ``HTTPConnectionPool.request()`` (Pull #1673)


1.25.3 (2019-05-23)
-------------------

* Change ``HTTPSConnection`` to load system CA certificates
  when ``ca_certs``, ``ca_cert_dir``, and ``ssl_context`` are
  unspecified. (Pull #1608, Issue #1603)

* Upgrade bundled rfc3986 to v1.3.2. (Pull #1609, Issue #1605)


1.25.2 (2019-04-28)
-------------------

* Change ``is_ipaddress`` to not detect IPvFuture addresses. (Pull #1583)

* Change ``parse_url`` to percent-encode invalid characters within the
  path, query, and target components. (Pull #1586)


1.25.1 (2019-04-24)
-------------------

* Add support for Google's ``Brotli`` package. (Pull #1572, Pull #1579)

* Upgrade bundled rfc3986 to v1.3.1 (Pull #1578)


1.25 (2019-04-22)
-----------------

* Require and validate certificates by default when using HTTPS (Pull #1507)

* Upgraded ``urllib3.utils.parse_url()`` to be RFC 3986 compliant. (Pull #1487)

* Added support for ``key_password`` for ``HTTPSConnectionPool`` to use
  encrypted ``key_file`` without creating your own ``SSLContext`` object. (Pull #1489)

* Add TLSv1.3 support to CPython, pyOpenSSL, and SecureTransport ``SSLContext``
  implementations. (Pull #1496)

* Switched the default multipart header encoder from RFC 2231 to HTML 5 working draft. (Issue #303, Pull #1492)

* Fixed issue where OpenSSL would block if an encrypted client private key was
  given and no password was given. Instead an ``SSLError`` is raised. (Pull #1489)

* Added support for Brotli content encoding. It is enabled automatically if
  ``brotlipy`` package is installed which can be requested with
  ``urllib3[brotli]`` extra. (Pull #1532)

* Drop ciphers using DSS key exchange from default TLS cipher suites.
  Improve default ciphers when using SecureTransport. (Pull #1496)

* Implemented a more efficient ``HTTPResponse.__iter__()`` method. (Issue #1483)

1.24.3 (2019-05-01)
-------------------

* Apply fix for CVE-2019-9740. (Pull #1591)

1.24.2 (2019-04-17)
-------------------

* Don't load system certificates by default when any other ``ca_certs``, ``ca_certs_dir`` or
  ``ssl_context`` parameters are specified.

* Remove Authorization header regardless of case when redirecting to cross-site. (Issue #1510)

* Add support for IPv6 addresses in subjectAltName section of certificates. (Issue #1269)


1.24.1 (2018-11-02)
-------------------

* Remove quadratic behavior within ``GzipDecoder.decompress()`` (Issue #1467)

* Restored functionality of ``ciphers`` parameter for ``create_urllib3_context()``. (Issue #1462)


1.24 (2018-10-16)
-----------------

* Allow key_server_hostname to be specified when initializing a PoolManager to allow custom SNI to be overridden. (Pull #1449)

* Test against Python 3.7 on AppVeyor. (Pull #1453)

* Early-out ipv6 checks when running on App Engine. (Pull #1450)

* Change ambiguous description of backoff_factor (Pull #1436)

* Add ability to handle multiple Content-Encodings (Issue #1441 and Pull #1442)

* Skip DNS names that can't be idna-decoded when using pyOpenSSL (Issue #1405).

* Add a server_hostname parameter to HTTPSConnection which allows for
  overriding the SNI hostname sent in the handshake. (Pull #1397)

* Drop support for EOL Python 2.6 (Pull #1429 and Pull #1430)

* Fixed bug where responses with header Content-Type: message/* erroneously
  raised HeaderParsingError, resulting in a warning being logged. (Pull #1439)

* Move urllib3 to src/urllib3 (Pull #1409)


1.23 (2018-06-04)
-----------------

* Allow providing a list of headers to strip from requests when redirecting
  to a different host. Defaults to the ``Authorization`` header. Different
  headers can be set via ``Retry.remove_headers_on_redirect``. (Issue #1316)

* Fix ``util.selectors._fileobj_to_fd`` to accept ``long`` (Issue #1247).

* Dropped Python 3.3 support. (Pull #1242)

* Put the connection back in the pool when calling stream() or read_chunked() on
  a chunked HEAD response. (Issue #1234)

* Fixed pyOpenSSL-specific ssl client authentication issue when clients
  attempted to auth via certificate + chain (Issue #1060)

* Add the port to the connectionpool connect print (Pull #1251)

* Don't use the ``uuid`` module to create multipart data boundaries. (Pull #1380)

* ``read_chunked()`` on a closed response returns no chunks. (Issue #1088)

* Add Python 2.6 support to ``contrib.securetransport`` (Pull #1359)

* Added support for auth info in url for SOCKS proxy (Pull #1363)


1.22 (2017-07-20)
-----------------

* Fixed missing brackets in ``HTTP CONNECT`` when connecting to IPv6 address via
  IPv6 proxy. (Issue #1222)

* Made the connection pool retry on ``SSLError``.  The original ``SSLError``
  is available on ``MaxRetryError.reason``. (Issue #1112)

* Drain and release connection before recursing on retry/redirect.  Fixes
  deadlocks with a blocking connectionpool. (Issue #1167)

* Fixed compatibility for cookiejar. (Issue #1229)

* pyopenssl: Use vendored version of ``six``. (Issue #1231)


1.21.1 (2017-05-02)
-------------------

* Fixed SecureTransport issue that would cause long delays in response body
  delivery. (Pull #1154)

* Fixed regression in 1.21 that threw exceptions when users passed the
  ``socket_options`` flag to the ``PoolManager``.  (Issue #1165)

* Fixed regression in 1.21 that threw exceptions when users passed the
  ``assert_hostname`` or ``assert_fingerprint`` flag to the ``PoolManager``.
  (Pull #1157)


1.21 (2017-04-25)
-----------------

* Improved performance of certain selector system calls on Python 3.5 and
  later. (Pull #1095)

* Resolved issue where the PyOpenSSL backend would not wrap SysCallError
  exceptions appropriately when sending data. (Pull #1125)

* Selectors now detects a monkey-patched select module after import for modules
  that patch the select module like eventlet, greenlet. (Pull #1128)

* Reduced memory consumption when streaming zlib-compressed responses
  (as opposed to raw deflate streams). (Pull #1129)

* Connection pools now use the entire request context when constructing the
  pool key. (Pull #1016)

* ``PoolManager.connection_from_*`` methods now accept a new keyword argument,
  ``pool_kwargs``, which are merged with the existing ``connection_pool_kw``.
  (Pull #1016)

* Add retry counter for ``status_forcelist``. (Issue #1147)

* Added ``contrib`` module for using SecureTransport on macOS:
  ``urllib3.contrib.securetransport``.  (Pull #1122)

* urllib3 now only normalizes the case of ``http://`` and ``https://`` schemes:
  for schemes it does not recognise, it assumes they are case-sensitive and
  leaves them unchanged.
  (Issue #1080)


1.20 (2017-01-19)
-----------------

* Added support for waiting for I/O using selectors other than select,
  improving urllib3's behaviour with large numbers of concurrent connections.
  (Pull #1001)

* Updated the date for the system clock check. (Issue #1005)

* ConnectionPools now correctly consider hostnames to be case-insensitive.
  (Issue #1032)

* Outdated versions of PyOpenSSL now cause the PyOpenSSL contrib module
  to fail when it is injected, rather than at first use. (Pull #1063)

* Outdated versions of cryptography now cause the PyOpenSSL contrib module
  to fail when it is injected, rather than at first use. (Issue #1044)

* Automatically attempt to rewind a file-like body object when a request is
  retried or redirected. (Pull #1039)

* Fix some bugs that occur when modules incautiously patch the queue module.
  (Pull #1061)

* Prevent retries from occurring on read timeouts for which the request method
  was not in the method whitelist. (Issue #1059)

* Changed the PyOpenSSL contrib module to lazily load idna to avoid
  unnecessarily bloating the memory of programs that don't need it. (Pull
  #1076)

* Add support for IPv6 literals with zone identifiers. (Pull #1013)

* Added support for socks5h:// and socks4a:// schemes when working with SOCKS
  proxies, and controlled remote DNS appropriately. (Issue #1035)


1.19.1 (2016-11-16)
-------------------

* Fixed AppEngine import that didn't function on Python 3.5. (Pull #1025)


1.19 (2016-11-03)
-----------------

* urllib3 now respects Retry-After headers on 413, 429, and 503 responses when
  using the default retry logic. (Pull #955)

* Remove markers from setup.py to assist ancient setuptools versions. (Issue
  #986)

* Disallow superscripts and other integerish things in URL ports. (Issue #989)

* Allow urllib3's HTTPResponse.stream() method to continue to work with
  non-httplib underlying FPs. (Pull #990)

* Empty filenames in multipart headers are now emitted as such, rather than
  being suppressed. (Issue #1015)

* Prefer user-supplied Host headers on chunked uploads. (Issue #1009)


1.18.1 (2016-10-27)
-------------------

* CVE-2016-9015. Users who are using urllib3 version 1.17 or 1.18 along with
  PyOpenSSL injection and OpenSSL 1.1.0 *must* upgrade to this version. This
  release fixes a vulnerability whereby urllib3 in the above configuration
  would silently fail to validate TLS certificates due to erroneously setting
  invalid flags in OpenSSL's ``SSL_CTX_set_verify`` function. These erroneous
  flags do not cause a problem in OpenSSL versions before 1.1.0, which
  interprets the presence of any flag as requesting certificate validation.

  There is no PR for this patch, as it was prepared for simultaneous disclosure
  and release. The master branch received the same fix in Pull #1010.


1.18 (2016-09-26)
-----------------

* Fixed incorrect message for IncompleteRead exception. (Pull #973)

* Accept ``iPAddress`` subject alternative name fields in TLS certificates.
  (Issue #258)

* Fixed consistency of ``HTTPResponse.closed`` between Python 2 and 3.
  (Issue #977)

* Fixed handling of wildcard certificates when using PyOpenSSL. (Issue #979)


1.17 (2016-09-06)
-----------------

* Accept ``SSLContext`` objects for use in SSL/TLS negotiation. (Issue #835)

* ConnectionPool debug log now includes scheme, host, and port. (Issue #897)

* Substantially refactored documentation. (Issue #887)

* Used URLFetch default timeout on AppEngine, rather than hardcoding our own.
  (Issue #858)

* Normalize the scheme and host in the URL parser (Issue #833)

* ``HTTPResponse`` contains the last ``Retry`` object, which now also
  contains retries history. (Issue #848)

* Timeout can no longer be set as boolean, and must be greater than zero.
  (Pull #924)

* Removed pyasn1 and ndg-httpsclient from dependencies used for PyOpenSSL. We
  now use cryptography and idna, both of which are already dependencies of
  PyOpenSSL. (Pull #930)

* Fixed infinite loop in ``stream`` when amt=None. (Issue #928)

* Try to use the operating system's certificates when we are using an
  ``SSLContext``. (Pull #941)

* Updated cipher suite list to allow ChaCha20+Poly1305. AES-GCM is preferred to
  ChaCha20, but ChaCha20 is then preferred to everything else. (Pull #947)

* Updated cipher suite list to remove 3DES-based cipher suites. (Pull #958)

* Removed the cipher suite fallback to allow HIGH ciphers. (Pull #958)

* Implemented ``length_remaining`` to determine remaining content
  to be read. (Pull #949)

* Implemented ``enforce_content_length`` to enable exceptions when
  incomplete data chunks are received. (Pull #949)

* Dropped connection start, dropped connection reset, redirect, forced retry,
  and new HTTPS connection log levels to DEBUG, from INFO. (Pull #967)


1.16 (2016-06-11)
-----------------

* Disable IPv6 DNS when IPv6 connections are not possible. (Issue #840)

* Provide ``key_fn_by_scheme`` pool keying mechanism that can be
  overridden. (Issue #830)

* Normalize scheme and host to lowercase for pool keys, and include
  ``source_address``. (Issue #830)

* Cleaner exception chain in Python 3 for ``_make_request``.
  (Issue #861)

* Fixed installing ``urllib3[socks]`` extra. (Issue #864)

* Fixed signature of ``ConnectionPool.close`` so it can actually safely be
  called by subclasses. (Issue #873)

* Retain ``release_conn`` state across retries. (Issues #651, #866)

* Add customizable ``HTTPConnectionPool.ResponseCls``, which defaults to
  ``HTTPResponse`` but can be replaced with a subclass. (Issue #879)


1.15.1 (2016-04-11)
-------------------

* Fix packaging to include backports module. (Issue #841)


1.15 (2016-04-06)
-----------------

* Added Retry(raise_on_status=False). (Issue #720)

* Always use setuptools, no more distutils fallback. (Issue #785)

* Dropped support for Python 3.2. (Issue #786)

* Chunked transfer encoding when requesting with ``chunked=True``.
  (Issue #790)

* Fixed regression with IPv6 port parsing. (Issue #801)

* Append SNIMissingWarning messages to allow users to specify it in
  the PYTHONWARNINGS environment variable. (Issue #816)

* Handle unicode headers in Py2. (Issue #818)

* Log certificate when there is a hostname mismatch. (Issue #820)

* Preserve order of request/response headers. (Issue #821)


1.14 (2015-12-29)
-----------------

* contrib: SOCKS proxy support! (Issue #762)

* Fixed AppEngine handling of transfer-encoding header and bug
  in Timeout defaults checking. (Issue #763)


1.13.1 (2015-12-18)
-------------------

* Fixed regression in IPv6 + SSL for match_hostname. (Issue #761)


1.13 (2015-12-14)
-----------------

* Fixed ``pip install urllib3[secure]`` on modern pip. (Issue #706)

* pyopenssl: Fixed SSL3_WRITE_PENDING error. (Issue #717)

* pyopenssl: Support for TLSv1.1 and TLSv1.2. (Issue #696)

* Close connections more defensively on exception. (Issue #734)

* Adjusted ``read_chunked`` to handle gzipped, chunk-encoded bodies without
  repeatedly flushing the decoder, to function better on Jython. (Issue #743)

* Accept ``ca_cert_dir`` for SSL-related PoolManager configuration. (Issue #758)


1.12 (2015-09-03)
-----------------

* Rely on ``six`` for importing ``httplib`` to work around
  conflicts with other Python 3 shims. (Issue #688)

* Add support for directories of certificate authorities, as supported by
  OpenSSL. (Issue #701)

* New exception: ``NewConnectionError``, raised when we fail to establish
  a new connection, usually ``ECONNREFUSED`` socket error.


1.11 (2015-07-21)
-----------------

* When ``ca_certs`` is given, ``cert_reqs`` defaults to
  ``'CERT_REQUIRED'``. (Issue #650)

* ``pip install urllib3[secure]`` will install Certifi and
  PyOpenSSL as dependencies. (Issue #678)

* Made ``HTTPHeaderDict`` usable as a ``headers`` input value
  (Issues #632, #679)

* Added `urllib3.contrib.appengine <https://urllib3.readthedocs.io/en/latest/contrib.html#google-app-engine>`_
  which has an ``AppEngineManager`` for using ``URLFetch`` in a
  Google AppEngine environment. (Issue #664)

* Dev: Added test suite for AppEngine. (Issue #631)

* Fix performance regression when using PyOpenSSL. (Issue #626)

* Passing incorrect scheme (e.g. ``foo://``) will raise
  ``ValueError`` instead of ``AssertionError`` (backwards
  compatible for now, but please migrate). (Issue #640)

* Fix pools not getting replenished when an error occurs during a
  request using ``release_conn=False``. (Issue #644)

* Fix pool-default headers not applying for url-encoded requests
  like GET. (Issue #657)

* log.warning in Python 3 when headers are skipped due to parsing
  errors. (Issue #642)

* Close and discard connections if an error occurs during read.
  (Issue #660)

* Fix host parsing for IPv6 proxies. (Issue #668)

* Separate warning type SubjectAltNameWarning, now issued once
  per host. (Issue #671)

* Fix ``httplib.IncompleteRead`` not getting converted to
  ``ProtocolError`` when using ``HTTPResponse.stream()``
  (Issue #674)

1.10.4 (2015-05-03)
-------------------

* Migrate tests to Tornado 4. (Issue #594)

* Append default warning configuration rather than overwrite.
  (Issue #603)

* Fix streaming decoding regression. (Issue #595)

* Fix chunked requests losing state across keep-alive connections.
  (Issue #599)

* Fix hanging when chunked HEAD response has no body. (Issue #605)


1.10.3 (2015-04-21)
-------------------

* Emit ``InsecurePlatformWarning`` when SSLContext object is missing.
  (Issue #558)

* Fix regression of duplicate header keys being discarded.
  (Issue #563)

* ``Response.stream()`` returns a generator for chunked responses.
  (Issue #560)

* Set upper-bound timeout when waiting for a socket in PyOpenSSL.
  (Issue #585)

* Work on platforms without `ssl` module for plain HTTP requests.
  (Issue #587)

* Stop relying on the stdlib's default cipher list. (Issue #588)


1.10.2 (2015-02-25)
-------------------

* Fix file descriptor leakage on retries. (Issue #548)

* Removed RC4 from default cipher list. (Issue #551)

* Header performance improvements. (Issue #544)

* Fix PoolManager not obeying redirect retry settings. (Issue #553)


1.10.1 (2015-02-10)
-------------------

* Pools can be used as context managers. (Issue #545)

* Don't re-use connections which experienced an SSLError. (Issue #529)

* Don't fail when gzip decoding an empty stream. (Issue #535)

* Add sha256 support for fingerprint verification. (Issue #540)

* Fixed handling of header values containing commas. (Issue #533)


1.10 (2014-12-14)
-----------------

* Disabled SSLv3. (Issue #473)

* Add ``Url.url`` property to return the composed url string. (Issue #394)

* Fixed PyOpenSSL + gevent ``WantWriteError``. (Issue #412)

* ``MaxRetryError.reason`` will always be an exception, not string.
  (Issue #481)

* Fixed SSL-related timeouts not being detected as timeouts. (Issue #492)

* Py3: Use ``ssl.create_default_context()`` when available. (Issue #473)

* Emit ``InsecureRequestWarning`` for *every* insecure HTTPS request.
  (Issue #496)

* Emit ``SecurityWarning`` when certificate has no ``subjectAltName``.
  (Issue #499)

* Close and discard sockets which experienced SSL-related errors.
  (Issue #501)

* Handle ``body`` param in ``.request(...)``. (Issue #513)

* Respect timeout with HTTPS proxy. (Issue #505)

* PyOpenSSL: Handle ZeroReturnError exception. (Issue #520)


1.9.1 (2014-09-13)
------------------

* Apply socket arguments before binding. (Issue #427)

* More careful checks if fp-like object is closed. (Issue #435)

* Fixed packaging issues of some development-related files not
  getting included. (Issue #440)

* Allow performing *only* fingerprint verification. (Issue #444)

* Emit ``SecurityWarning`` if system clock is waaay off. (Issue #445)

* Fixed PyOpenSSL compatibility with PyPy. (Issue #450)

* Fixed ``BrokenPipeError`` and ``ConnectionError`` handling in Py3.
  (Issue #443)



1.9 (2014-07-04)
----------------

* Shuffled around development-related files. If you're maintaining a distro
  package of urllib3, you may need to tweak things. (Issue #415)

* Unverified HTTPS requests will trigger a warning on the first request. See
  our new `security documentation
  <https://urllib3.readthedocs.io/en/latest/security.html>`_ for details.
  (Issue #426)

* New retry logic and ``urllib3.util.retry.Retry`` configuration object.
  (Issue #326)

* All raised exceptions should now wrapped in a
  ``urllib3.exceptions.HTTPException``-extending exception. (Issue #326)

* All errors during a retry-enabled request should be wrapped in
  ``urllib3.exceptions.MaxRetryError``, including timeout-related exceptions
  which were previously exempt. Underlying error is accessible from the
  ``.reason`` property. (Issue #326)

* ``urllib3.exceptions.ConnectionError`` renamed to
  ``urllib3.exceptions.ProtocolError``. (Issue #326)

* Errors during response read (such as IncompleteRead) are now wrapped in
  ``urllib3.exceptions.ProtocolError``. (Issue #418)

* Requesting an empty host will raise ``urllib3.exceptions.LocationValueError``.
  (Issue #417)

* Catch read timeouts over SSL connections as
  ``urllib3.exceptions.ReadTimeoutError``. (Issue #419)

* Apply socket arguments before connecting. (Issue #427)


1.8.3 (2014-06-23)
------------------

* Fix TLS verification when using a proxy in Python 3.4.1. (Issue #385)

* Add ``disable_cache`` option to ``urllib3.util.make_headers``. (Issue #393)

* Wrap ``socket.timeout`` exception with
  ``urllib3.exceptions.ReadTimeoutError``. (Issue #399)

* Fixed proxy-related bug where connections were being reused incorrectly.
  (Issues #366, #369)

* Added ``socket_options`` keyword parameter which allows to define
  ``setsockopt`` configuration of new sockets. (Issue #397)

* Removed ``HTTPConnection.tcp_nodelay`` in favor of
  ``HTTPConnection.default_socket_options``. (Issue #397)

* Fixed ``TypeError`` bug in Python 2.6.4. (Issue #411)


1.8.2 (2014-04-17)
------------------

* Fix ``urllib3.util`` not being included in the package.


1.8.1 (2014-04-17)
------------------

* Fix AppEngine bug of HTTPS requests going out as HTTP. (Issue #356)

* Don't install ``dummyserver`` into ``site-packages`` as it's only needed
  for the test suite. (Issue #362)

* Added support for specifying ``source_address``. (Issue #352)


1.8 (2014-03-04)
----------------

* Improved url parsing in ``urllib3.util.parse_url`` (properly parse '@' in
  username, and blank ports like 'hostname:').

* New ``urllib3.connection`` module which contains all the HTTPConnection
  objects.

* Several ``urllib3.util.Timeout``-related fixes. Also changed constructor
  signature to a more sensible order. [Backwards incompatible]
  (Issues #252, #262, #263)

* Use ``backports.ssl_match_hostname`` if it's installed. (Issue #274)

* Added ``.tell()`` method to ``urllib3.response.HTTPResponse`` which
  returns the number of bytes read so far. (Issue #277)

* Support for platforms without threading. (Issue #289)

* Expand default-port comparison in ``HTTPConnectionPool.is_same_host``
  to allow a pool with no specified port to be considered equal to to an
  HTTP/HTTPS url with port 80/443 explicitly provided. (Issue #305)

* Improved default SSL/TLS settings to avoid vulnerabilities.
  (Issue #309)

* Fixed ``urllib3.poolmanager.ProxyManager`` not retrying on connect errors.
  (Issue #310)

* Disable Nagle's Algorithm on the socket for non-proxies. A subset of requests
  will send the entire HTTP request ~200 milliseconds faster; however, some of
  the resulting TCP packets will be smaller. (Issue #254)

* Increased maximum number of SubjectAltNames in ``urllib3.contrib.pyopenssl``
  from the default 64 to 1024 in a single certificate. (Issue #318)

* Headers are now passed and stored as a custom
  ``urllib3.collections_.HTTPHeaderDict`` object rather than a plain ``dict``.
  (Issue #329, #333)

* Headers no longer lose their case on Python 3. (Issue #236)

* ``urllib3.contrib.pyopenssl`` now uses the operating system's default CA
  certificates on inject. (Issue #332)

* Requests with ``retries=False`` will immediately raise any exceptions without
  wrapping them in ``MaxRetryError``. (Issue #348)

* Fixed open socket leak with SSL-related failures. (Issue #344, #348)


1.7.1 (2013-09-25)
------------------

* Added granular timeout support with new ``urllib3.util.Timeout`` class.
  (Issue #231)

* Fixed Python 3.4 support. (Issue #238)


1.7 (2013-08-14)
----------------

* More exceptions are now pickle-able, with tests. (Issue #174)

* Fixed redirecting with relative URLs in Location header. (Issue #178)

* Support for relative urls in ``Location: ...`` header. (Issue #179)

* ``urllib3.response.HTTPResponse`` now inherits from ``io.IOBase`` for bonus
  file-like functionality. (Issue #187)

* Passing ``assert_hostname=False`` when creating a HTTPSConnectionPool will
  skip hostname verification for SSL connections. (Issue #194)

* New method ``urllib3.response.HTTPResponse.stream(...)`` which acts as a
  generator wrapped around ``.read(...)``. (Issue #198)

* IPv6 url parsing enforces brackets around the hostname. (Issue #199)

* Fixed thread race condition in
  ``urllib3.poolmanager.PoolManager.connection_from_host(...)`` (Issue #204)

* ``ProxyManager`` requests now include non-default port in ``Host: ...``
  header. (Issue #217)

* Added HTTPS proxy support in ``ProxyManager``. (Issue #170 #139)

* New ``RequestField`` object can be passed to the ``fields=...`` param which
  can specify headers. (Issue #220)

* Raise ``urllib3.exceptions.ProxyError`` when connecting to proxy fails.
  (Issue #221)

* Use international headers when posting file names. (Issue #119)

* Improved IPv6 support. (Issue #203)


1.6 (2013-04-25)
----------------

* Contrib: Optional SNI support for Py2 using PyOpenSSL. (Issue #156)

* ``ProxyManager`` automatically adds ``Host: ...`` header if not given.

* Improved SSL-related code. ``cert_req`` now optionally takes a string like
  "REQUIRED" or "NONE". Same with ``ssl_version`` takes strings like "SSLv23"
  The string values reflect the suffix of the respective constant variable.
  (Issue #130)

* Vendored ``socksipy`` now based on Anorov's fork which handles unexpectedly
  closed proxy connections and larger read buffers. (Issue #135)

* Ensure the connection is closed if no data is received, fixes connection leak
  on some platforms. (Issue #133)

* Added SNI support for SSL/TLS connections on Py32+. (Issue #89)

* Tests fixed to be compatible with Py26 again. (Issue #125)

* Added ability to choose SSL version by passing an ``ssl.PROTOCOL_*`` constant
  to the ``ssl_version`` parameter of ``HTTPSConnectionPool``. (Issue #109)

* Allow an explicit content type to be specified when encoding file fields.
  (Issue #126)

* Exceptions are now pickleable, with tests. (Issue #101)

* Fixed default headers not getting passed in some cases. (Issue #99)

* Treat "content-encoding" header value as case-insensitive, per RFC 2616
  Section 3.5. (Issue #110)

* "Connection Refused" SocketErrors will get retried rather than raised.
  (Issue #92)

* Updated vendored ``six``, no longer overrides the global ``six`` module
  namespace. (Issue #113)

* ``urllib3.exceptions.MaxRetryError`` contains a ``reason`` property holding
  the exception that prompted the final retry. If ``reason is None`` then it
  was due to a redirect. (Issue #92, #114)

* Fixed ``PoolManager.urlopen()`` from not redirecting more than once.
  (Issue #149)

* Don't assume ``Content-Type: text/plain`` for multi-part encoding parameters
  that are not files. (Issue #111)

* Pass `strict` param down to ``httplib.HTTPConnection``. (Issue #122)

* Added mechanism to verify SSL certificates by fingerprint (md5, sha1) or
  against an arbitrary hostname (when connecting by IP or for misconfigured
  servers). (Issue #140)

* Streaming decompression support. (Issue #159)


1.5 (2012-08-02)
----------------

* Added ``urllib3.add_stderr_logger()`` for quickly enabling STDERR debug
  logging in urllib3.

* Native full URL parsing (including auth, path, query, fragment) available in
  ``urllib3.util.parse_url(url)``.

* Built-in redirect will switch method to 'GET' if status code is 303.
  (Issue #11)

* ``urllib3.PoolManager`` strips the scheme and host before sending the request
  uri. (Issue #8)

* New ``urllib3.exceptions.DecodeError`` exception for when automatic decoding,
  based on the Content-Type header, fails.

* Fixed bug with pool depletion and leaking connections (Issue #76). Added
  explicit connection closing on pool eviction. Added
  ``urllib3.PoolManager.clear()``.

* 99% -> 100% unit test coverage.


1.4 (2012-06-16)
----------------

* Minor AppEngine-related fixes.

* Switched from ``mimetools.choose_boundary`` to ``uuid.uuid4()``.

* Improved url parsing. (Issue #73)

* IPv6 url support. (Issue #72)


1.3 (2012-03-25)
----------------

* Removed pre-1.0 deprecated API.

* Refactored helpers into a ``urllib3.util`` submodule.

* Fixed multipart encoding to support list-of-tuples for keys with multiple
  values. (Issue #48)

* Fixed multiple Set-Cookie headers in response not getting merged properly in
  Python 3. (Issue #53)

* AppEngine support with Py27. (Issue #61)

* Minor ``encode_multipart_formdata`` fixes related to Python 3 strings vs
  bytes.


1.2.2 (2012-02-06)
------------------

* Fixed packaging bug of not shipping ``test-requirements.txt``. (Issue #47)


1.2.1 (2012-02-05)
------------------

* Fixed another bug related to when ``ssl`` module is not available. (Issue #41)

* Location parsing errors now raise ``urllib3.exceptions.LocationParseError``
  which inherits from ``ValueError``.


1.2 (2012-01-29)
----------------

* Added Python 3 support (tested on 3.2.2)

* Dropped Python 2.5 support (tested on 2.6.7, 2.7.2)

* Use ``select.poll`` instead of ``select.select`` for platforms that support
  it.

* Use ``Queue.LifoQueue`` instead of ``Queue.Queue`` for more aggressive
  connection reusing. Configurable by overriding ``ConnectionPool.QueueCls``.

* Fixed ``ImportError`` during install when ``ssl`` module is not available.
  (Issue #41)

* Fixed ``PoolManager`` redirects between schemes (such as HTTP -> HTTPS) not
  completing properly. (Issue #28, uncovered by Issue #10 in v1.1)

* Ported ``dummyserver`` to use ``tornado`` instead of ``webob`` +
  ``eventlet``. Removed extraneous unsupported dummyserver testing backends.
  Added socket-level tests.

* More tests. Achievement Unlocked: 99% Coverage.


1.1 (2012-01-07)
----------------

* Refactored ``dummyserver`` to its own root namespace module (used for
  testing).

* Added hostname verification for ``VerifiedHTTPSConnection`` by vendoring in
  Py32's ``ssl_match_hostname``. (Issue #25)

* Fixed cross-host HTTP redirects when using ``PoolManager``. (Issue #10)

* Fixed ``decode_content`` being ignored when set through ``urlopen``. (Issue
  #27)

* Fixed timeout-related bugs. (Issues #17, #23)


1.0.2 (2011-11-04)
------------------

* Fixed typo in ``VerifiedHTTPSConnection`` which would only present as a bug if
  you're using the object manually. (Thanks pyos)

* Made RecentlyUsedContainer (and consequently PoolManager) more thread-safe by
  wrapping the access log in a mutex. (Thanks @christer)

* Made RecentlyUsedContainer more dict-like (corrected ``__delitem__`` and
  ``__getitem__`` behaviour), with tests. Shouldn't affect core urllib3 code.


1.0.1 (2011-10-10)
------------------

* Fixed a bug where the same connection would get returned into the pool twice,
  causing extraneous "HttpConnectionPool is full" log warnings.


1.0 (2011-10-08)
----------------

* Added ``PoolManager`` with LRU expiration of connections (tested and
  documented).
* Added ``ProxyManager`` (needs tests, docs, and confirmation that it works
  with HTTPS proxies).
* Added optional partial-read support for responses when
  ``preload_content=False``. You can now make requests and just read the headers
  without loading the content.
* Made response decoding optional (default on, same as before).
* Added optional explicit boundary string for ``encode_multipart_formdata``.
* Convenience request methods are now inherited from ``RequestMethods``. Old
  helpers like ``get_url`` and ``post_url`` should be abandoned in favour of
  the new ``request(method, url, ...)``.
* Refactored code to be even more decoupled, reusable, and extendable.
* License header added to ``.py`` files.
* Embiggened the documentation: Lots of Sphinx-friendly docstrings in the code
  and docs in ``docs/`` and on https://urllib3.readthedocs.io/.
* Embettered all the things!
* Started writing this file.


0.4.1 (2011-07-17)
------------------

* Minor bug fixes, code cleanup.


0.4 (2011-03-01)
----------------

* Better unicode support.
* Added ``VerifiedHTTPSConnection``.
* Added ``NTLMConnectionPool`` in contrib.
* Minor improvements.


0.3.1 (2010-07-13)
------------------

* Added ``assert_host_name`` optional parameter. Now compatible with proxies.


0.3 (2009-12-10)
----------------

* Added HTTPS support.
* Minor bug fixes.
* Refactored, broken backwards compatibility with 0.2.
* API to be treated as stable from this version forward.


0.2 (2008-11-17)
----------------

* Added unit tests.
* Bug fixes.


0.1 (2008-11-16)
----------------

* First release.
PK�(�\�L�#doc/alt-python37-urllib3/README.rstnu�[���.. raw:: html

   <p align="center">
      <a href="https://github.com/urllib3/urllib3">
         <img src="./docs/images/banner.svg" width="60%" alt="urllib3" />
      </a>
   </p>
   <p align="center">
      <a href="https://pypi.org/project/urllib3"><img alt="PyPI Version" src="https://img.shields.io/pypi/v/urllib3.svg?maxAge=86400" /></a>
      <a href="https://pypi.org/project/urllib3"><img alt="Python Versions" src="https://img.shields.io/pypi/pyversions/urllib3.svg?maxAge=86400" /></a>
      <a href="https://discord.gg/CHEgCZN"><img alt="Join our Discord" src="https://img.shields.io/discord/756342717725933608?color=%237289da&label=discord" /></a>
      <a href="https://codecov.io/gh/urllib3/urllib3"><img alt="Coverage Status" src="https://img.shields.io/codecov/c/github/urllib3/urllib3.svg" /></a>
      <a href="https://github.com/urllib3/urllib3/actions?query=workflow%3ACI"><img alt="Build Status on GitHub" src="https://github.com/urllib3/urllib3/workflows/CI/badge.svg" /></a>
      <a href="https://travis-ci.org/urllib3/urllib3"><img alt="Build Status on Travis" src="https://travis-ci.org/urllib3/urllib3.svg?branch=master" /></a>
      <a href="https://urllib3.readthedocs.io"><img alt="Documentation Status" src="https://readthedocs.org/projects/urllib3/badge/?version=latest" /></a>
   </p>

urllib3 is a powerful, *user-friendly* HTTP client for Python. Much of the
Python ecosystem already uses urllib3 and you should too.
urllib3 brings many critical features that are missing from the Python
standard libraries:

- Thread safety.
- Connection pooling.
- Client-side SSL/TLS verification.
- File uploads with multipart encoding.
- Helpers for retrying requests and dealing with HTTP redirects.
- Support for gzip, deflate, and brotli encoding.
- Proxy support for HTTP and SOCKS.
- 100% test coverage.

urllib3 is powerful and easy to use:

.. code-block:: python

    >>> import urllib3
    >>> http = urllib3.PoolManager()
    >>> r = http.request('GET', 'http://httpbin.org/robots.txt')
    >>> r.status
    200
    >>> r.data
    'User-agent: *\nDisallow: /deny\n'


Installing
----------

urllib3 can be installed with `pip <https://pip.pypa.io>`_::

    $ python -m pip install urllib3

Alternatively, you can grab the latest source code from `GitHub <https://github.com/urllib3/urllib3>`_::

    $ git clone git://github.com/urllib3/urllib3.git
    $ python setup.py install


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

urllib3 has usage and reference documentation at `urllib3.readthedocs.io <https://urllib3.readthedocs.io>`_.


Contributing
------------

urllib3 happily accepts contributions. Please see our
`contributing documentation <https://urllib3.readthedocs.io/en/latest/contributing.html>`_
for some tips on getting started.


Security Disclosures
--------------------

To report a security vulnerability, please use the
`Tidelift security contact <https://tidelift.com/security>`_.
Tidelift will coordinate the fix and disclosure with maintainers.


Maintainers
-----------

- `@sethmlarson <https://github.com/sethmlarson>`__ (Seth M. Larson)
- `@pquentin <https://github.com/pquentin>`__ (Quentin Pradet)
- `@theacodes <https://github.com/theacodes>`__ (Thea Flowers)
- `@haikuginger <https://github.com/haikuginger>`__ (Jess Shapiro)
- `@lukasa <https://github.com/lukasa>`__ (Cory Benfield)
- `@sigmavirus24 <https://github.com/sigmavirus24>`__ (Ian Stapleton Cordasco)
- `@shazow <https://github.com/shazow>`__ (Andrey Petrov)

👋


Sponsorship
-----------

If your company benefits from this library, please consider `sponsoring its
development <https://urllib3.readthedocs.io/en/latest/sponsors.html>`_.


For Enterprise
--------------

.. |tideliftlogo| image:: https://nedbatchelder.com/pix/Tidelift_Logos_RGB_Tidelift_Shorthand_On-White_small.png
   :width: 75
   :alt: Tidelift

.. list-table::
   :widths: 10 100

   * - |tideliftlogo|
     - Professional support for urllib3 is available as part of the `Tidelift
       Subscription`_.  Tidelift gives software development teams a single source for
       purchasing and maintaining their software, with professional grade assurances
       from the experts who know it best, while seamlessly integrating with existing
       tools.

.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-urllib3?utm_source=pypi-urllib3&utm_medium=referral&utm_campaign=readme
PK�(�\�)y@@!doc/alt-python37-pytz/LICENSE.txtnu�[���Copyright (c) 2003-2017 Stuart Bishop <stuart@stuartbishop.net>

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
PK�(�\?).u�K�K doc/alt-python37-pytz/README.txtnu�[���pytz - World Timezone Definitions for Python
============================================

:Author: Stuart Bishop <stuart@stuartbishop.net>

Introduction
~~~~~~~~~~~~

pytz brings the Olson tz database into Python. This library allows
accurate and cross platform timezone calculations using Python 2.4
or higher. It also solves the issue of ambiguous times at the end
of daylight saving time, which you can read more about in the Python
Library Reference (``datetime.tzinfo``).

Almost all of the Olson timezones are supported.

.. note::

    This library differs from the documented Python API for
    tzinfo implementations; if you want to create local wallclock
    times you need to use the ``localize()`` method documented in this
    document. In addition, if you perform date arithmetic on local
    times that cross DST boundaries, the result may be in an incorrect
    timezone (ie. subtract 1 minute from 2002-10-27 1:00 EST and you get
    2002-10-27 0:59 EST instead of the correct 2002-10-27 1:59 EDT). A
    ``normalize()`` method is provided to correct this. Unfortunately these
    issues cannot be resolved without modifying the Python datetime
    implementation (see PEP-431).


Installation
~~~~~~~~~~~~

This package can either be installed from a .egg file using setuptools,
or from the tarball using the standard Python distutils.

If you are installing from a tarball, run the following command as an
administrative user::

    python setup.py install

If you are installing using setuptools, you don't even need to download
anything as the latest version will be downloaded for you
from the Python package index::

    easy_install --upgrade pytz

If you already have the .egg file, you can use that too::

    easy_install pytz-2008g-py2.6.egg


Example & Usage
~~~~~~~~~~~~~~~

Localized times and date arithmetic
-----------------------------------

>>> from datetime import datetime, timedelta
>>> from pytz import timezone
>>> import pytz
>>> utc = pytz.utc
>>> utc.zone
'UTC'
>>> eastern = timezone('US/Eastern')
>>> eastern.zone
'US/Eastern'
>>> amsterdam = timezone('Europe/Amsterdam')
>>> fmt = '%Y-%m-%d %H:%M:%S %Z%z'

This library only supports two ways of building a localized time. The
first is to use the ``localize()`` method provided by the pytz library.
This is used to localize a naive datetime (datetime with no timezone
information):

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 6, 0, 0))
>>> print(loc_dt.strftime(fmt))
2002-10-27 06:00:00 EST-0500

The second way of building a localized time is by converting an existing
localized time using the standard ``astimezone()`` method:

>>> ams_dt = loc_dt.astimezone(amsterdam)
>>> ams_dt.strftime(fmt)
'2002-10-27 12:00:00 CET+0100'

Unfortunately using the tzinfo argument of the standard datetime
constructors ''does not work'' with pytz for many timezones.

>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt)
'2002-10-27 12:00:00 LMT+0020'

It is safe for timezones without daylight saving transitions though, such
as UTC:

>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=pytz.utc).strftime(fmt)
'2002-10-27 12:00:00 UTC+0000'

The preferred way of dealing with times is to always work in UTC,
converting to localtime only when generating output to be read
by humans.

>>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc)
>>> loc_dt = utc_dt.astimezone(eastern)
>>> loc_dt.strftime(fmt)
'2002-10-27 01:00:00 EST-0500'

This library also allows you to do date arithmetic using local
times, although it is more complicated than working in UTC as you
need to use the ``normalize()`` method to handle daylight saving time
and other timezone transitions. In this example, ``loc_dt`` is set
to the instant when daylight saving time ends in the US/Eastern
timezone.

>>> before = loc_dt - timedelta(minutes=10)
>>> before.strftime(fmt)
'2002-10-27 00:50:00 EST-0500'
>>> eastern.normalize(before).strftime(fmt)
'2002-10-27 01:50:00 EDT-0400'
>>> after = eastern.normalize(before + timedelta(minutes=20))
>>> after.strftime(fmt)
'2002-10-27 01:10:00 EST-0500'

Creating local times is also tricky, and the reason why working with
local times is not recommended. Unfortunately, you cannot just pass
a ``tzinfo`` argument when constructing a datetime (see the next
section for more details)

>>> dt = datetime(2002, 10, 27, 1, 30, 0)
>>> dt1 = eastern.localize(dt, is_dst=True)
>>> dt1.strftime(fmt)
'2002-10-27 01:30:00 EDT-0400'
>>> dt2 = eastern.localize(dt, is_dst=False)
>>> dt2.strftime(fmt)
'2002-10-27 01:30:00 EST-0500'

Converting between timezones is more easily done, using the
standard astimezone method.

>>> utc_dt = utc.localize(datetime.utcfromtimestamp(1143408899))
>>> utc_dt.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
>>> au_tz = timezone('Australia/Sydney')
>>> au_dt = utc_dt.astimezone(au_tz)
>>> au_dt.strftime(fmt)
'2006-03-27 08:34:59 AEDT+1100'
>>> utc_dt2 = au_dt.astimezone(utc)
>>> utc_dt2.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
>>> utc_dt == utc_dt2
True

You can take shortcuts when dealing with the UTC side of timezone
conversions. ``normalize()`` and ``localize()`` are not really
necessary when there are no daylight saving time transitions to
deal with.

>>> utc_dt = datetime.utcfromtimestamp(1143408899).replace(tzinfo=utc)
>>> utc_dt.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'
>>> au_tz = timezone('Australia/Sydney')
>>> au_dt = au_tz.normalize(utc_dt.astimezone(au_tz))
>>> au_dt.strftime(fmt)
'2006-03-27 08:34:59 AEDT+1100'
>>> utc_dt2 = au_dt.astimezone(utc)
>>> utc_dt2.strftime(fmt)
'2006-03-26 21:34:59 UTC+0000'


``tzinfo`` API
--------------

The ``tzinfo`` instances returned by the ``timezone()`` function have
been extended to cope with ambiguous times by adding an ``is_dst``
parameter to the ``utcoffset()``, ``dst()`` && ``tzname()`` methods.

>>> tz = timezone('America/St_Johns')

>>> normal = datetime(2009, 9, 1)
>>> ambiguous = datetime(2009, 10, 31, 23, 30)

The ``is_dst`` parameter is ignored for most timestamps. It is only used
during DST transition ambiguous periods to resolve that ambiguity.

>>> tz.utcoffset(normal, is_dst=True)
datetime.timedelta(-1, 77400)
>>> tz.dst(normal, is_dst=True)
datetime.timedelta(0, 3600)
>>> tz.tzname(normal, is_dst=True)
'NDT'

>>> tz.utcoffset(ambiguous, is_dst=True)
datetime.timedelta(-1, 77400)
>>> tz.dst(ambiguous, is_dst=True)
datetime.timedelta(0, 3600)
>>> tz.tzname(ambiguous, is_dst=True)
'NDT'

>>> tz.utcoffset(normal, is_dst=False)
datetime.timedelta(-1, 77400)
>>> tz.dst(normal, is_dst=False)
datetime.timedelta(0, 3600)
>>> tz.tzname(normal, is_dst=False)
'NDT'

>>> tz.utcoffset(ambiguous, is_dst=False)
datetime.timedelta(-1, 73800)
>>> tz.dst(ambiguous, is_dst=False)
datetime.timedelta(0)
>>> tz.tzname(ambiguous, is_dst=False)
'NST'

If ``is_dst`` is not specified, ambiguous timestamps will raise
an ``pytz.exceptions.AmbiguousTimeError`` exception.

>>> tz.utcoffset(normal)
datetime.timedelta(-1, 77400)
>>> tz.dst(normal)
datetime.timedelta(0, 3600)
>>> tz.tzname(normal)
'NDT'

>>> import pytz.exceptions
>>> try:
...     tz.utcoffset(ambiguous)
... except pytz.exceptions.AmbiguousTimeError:
...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00
>>> try:
...     tz.dst(ambiguous)
... except pytz.exceptions.AmbiguousTimeError:
...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00
>>> try:
...     tz.tzname(ambiguous)
... except pytz.exceptions.AmbiguousTimeError:
...     print('pytz.exceptions.AmbiguousTimeError: %s' % ambiguous)
pytz.exceptions.AmbiguousTimeError: 2009-10-31 23:30:00


Problems with Localtime
~~~~~~~~~~~~~~~~~~~~~~~

The major problem we have to deal with is that certain datetimes
may occur twice in a year. For example, in the US/Eastern timezone
on the last Sunday morning in October, the following sequence
happens:

    - 01:00 EDT occurs
    - 1 hour later, instead of 2:00am the clock is turned back 1 hour
      and 01:00 happens again (this time 01:00 EST)

In fact, every instant between 01:00 and 02:00 occurs twice. This means
that if you try and create a time in the 'US/Eastern' timezone
the standard datetime syntax, there is no way to specify if you meant
before of after the end-of-daylight-saving-time transition. Using the
pytz custom syntax, the best you can do is make an educated guess:

>>> loc_dt = eastern.localize(datetime(2002, 10, 27, 1, 30, 00))
>>> loc_dt.strftime(fmt)
'2002-10-27 01:30:00 EST-0500'

As you can see, the system has chosen one for you and there is a 50%
chance of it being out by one hour. For some applications, this does
not matter. However, if you are trying to schedule meetings with people
in different timezones or analyze log files it is not acceptable. 

The best and simplest solution is to stick with using UTC.  The pytz
package encourages using UTC for internal timezone representation by
including a special UTC implementation based on the standard Python
reference implementation in the Python documentation.

The UTC timezone unpickles to be the same instance, and pickles to a
smaller size than other pytz tzinfo instances.  The UTC implementation
can be obtained as pytz.utc, pytz.UTC, or pytz.timezone('UTC').

>>> import pickle, pytz
>>> dt = datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc)
>>> naive = dt.replace(tzinfo=None)
>>> p = pickle.dumps(dt, 1)
>>> naive_p = pickle.dumps(naive, 1)
>>> len(p) - len(naive_p)
17
>>> new = pickle.loads(p)
>>> new == dt
True
>>> new is dt
False
>>> new.tzinfo is dt.tzinfo
True
>>> pytz.utc is pytz.UTC is pytz.timezone('UTC')
True

Note that some other timezones are commonly thought of as the same (GMT,
Greenwich, Universal, etc.). The definition of UTC is distinct from these
other timezones, and they are not equivalent. For this reason, they will
not compare the same in Python.

>>> utc == pytz.timezone('GMT')
False

See the section `What is UTC`_, below.

If you insist on working with local times, this library provides a
facility for constructing them unambiguously:

>>> loc_dt = datetime(2002, 10, 27, 1, 30, 00)
>>> est_dt = eastern.localize(loc_dt, is_dst=True)
>>> edt_dt = eastern.localize(loc_dt, is_dst=False)
>>> print(est_dt.strftime(fmt) + ' / ' + edt_dt.strftime(fmt))
2002-10-27 01:30:00 EDT-0400 / 2002-10-27 01:30:00 EST-0500

If you pass None as the is_dst flag to localize(), pytz will refuse to
guess and raise exceptions if you try to build ambiguous or non-existent
times.

For example, 1:30am on 27th Oct 2002 happened twice in the US/Eastern
timezone when the clocks where put back at the end of Daylight Saving
Time:

>>> dt = datetime(2002, 10, 27, 1, 30, 00)
>>> try:
...     eastern.localize(dt, is_dst=None)
... except pytz.exceptions.AmbiguousTimeError:
...     print('pytz.exceptions.AmbiguousTimeError: %s' % dt)
pytz.exceptions.AmbiguousTimeError: 2002-10-27 01:30:00

Similarly, 2:30am on 7th April 2002 never happened at all in the
US/Eastern timezone, as the clocks where put forward at 2:00am skipping
the entire hour:

>>> dt = datetime(2002, 4, 7, 2, 30, 00)
>>> try:
...     eastern.localize(dt, is_dst=None)
... except pytz.exceptions.NonExistentTimeError:
...     print('pytz.exceptions.NonExistentTimeError: %s' % dt)
pytz.exceptions.NonExistentTimeError: 2002-04-07 02:30:00

Both of these exceptions share a common base class to make error handling
easier:

>>> isinstance(pytz.AmbiguousTimeError(), pytz.InvalidTimeError)
True
>>> isinstance(pytz.NonExistentTimeError(), pytz.InvalidTimeError)
True


A special case is where countries change their timezone definitions
with no daylight savings time switch. For example, in 1915 Warsaw
switched from Warsaw time to Central European time with no daylight savings
transition. So at the stroke of midnight on August 5th 1915 the clocks
were wound back 24 minutes creating an ambiguous time period that cannot
be specified without referring to the timezone abbreviation or the
actual UTC offset. In this case midnight happened twice, neither time
during a daylight saving time period. pytz handles this transition by
treating the ambiguous period before the switch as daylight savings
time, and the ambiguous period after as standard time.


>>> warsaw = pytz.timezone('Europe/Warsaw')
>>> amb_dt1 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=True)
>>> amb_dt1.strftime(fmt)
'1915-08-04 23:59:59 WMT+0124'
>>> amb_dt2 = warsaw.localize(datetime(1915, 8, 4, 23, 59, 59), is_dst=False)
>>> amb_dt2.strftime(fmt)
'1915-08-04 23:59:59 CET+0100'
>>> switch_dt = warsaw.localize(datetime(1915, 8, 5, 00, 00, 00), is_dst=False)
>>> switch_dt.strftime(fmt)
'1915-08-05 00:00:00 CET+0100'
>>> str(switch_dt - amb_dt1)
'0:24:01'
>>> str(switch_dt - amb_dt2)
'0:00:01'

The best way of creating a time during an ambiguous time period is
by converting from another timezone such as UTC:

>>> utc_dt = datetime(1915, 8, 4, 22, 36, tzinfo=pytz.utc)
>>> utc_dt.astimezone(warsaw).strftime(fmt)
'1915-08-04 23:36:00 CET+0100'

The standard Python way of handling all these ambiguities is not to
handle them, such as demonstrated in this example using the US/Eastern
timezone definition from the Python documentation (Note that this
implementation only works for dates between 1987 and 2006 - it is
included for tests only!):

>>> from pytz.reference import Eastern # pytz.reference only for tests
>>> dt = datetime(2002, 10, 27, 0, 30, tzinfo=Eastern)
>>> str(dt)
'2002-10-27 00:30:00-04:00'
>>> str(dt + timedelta(hours=1))
'2002-10-27 01:30:00-05:00'
>>> str(dt + timedelta(hours=2))
'2002-10-27 02:30:00-05:00'
>>> str(dt + timedelta(hours=3))
'2002-10-27 03:30:00-05:00'

Notice the first two results? At first glance you might think they are
correct, but taking the UTC offset into account you find that they are
actually two hours appart instead of the 1 hour we asked for.

>>> from pytz.reference import UTC # pytz.reference only for tests
>>> str(dt.astimezone(UTC))
'2002-10-27 04:30:00+00:00'
>>> str((dt + timedelta(hours=1)).astimezone(UTC))
'2002-10-27 06:30:00+00:00'


Country Information
~~~~~~~~~~~~~~~~~~~

A mechanism is provided to access the timezones commonly in use
for a particular country, looked up using the ISO 3166 country code.
It returns a list of strings that can be used to retrieve the relevant
tzinfo instance using ``pytz.timezone()``:

>>> print(' '.join(pytz.country_timezones['nz']))
Pacific/Auckland Pacific/Chatham

The Olson database comes with a ISO 3166 country code to English country
name mapping that pytz exposes as a dictionary:

>>> print(pytz.country_names['nz'])
New Zealand


What is UTC
~~~~~~~~~~~

'UTC' is `Coordinated Universal Time`_. It is a successor to, but distinct
from, Greenwich Mean Time (GMT) and the various definitions of Universal
Time. UTC is now the worldwide standard for regulating clocks and time
measurement.

All other timezones are defined relative to UTC, and include offsets like
UTC+0800 - hours to add or subtract from UTC to derive the local time. No
daylight saving time occurs in UTC, making it a useful timezone to perform
date arithmetic without worrying about the confusion and ambiguities caused
by daylight saving time transitions, your country changing its timezone, or
mobile computers that roam through multiple timezones.

..  _Coordinated Universal Time: https://en.wikipedia.org/wiki/Coordinated_Universal_Time


Helpers
~~~~~~~

There are two lists of timezones provided.

``all_timezones`` is the exhaustive list of the timezone names that can
be used.

>>> from pytz import all_timezones
>>> len(all_timezones) >= 500
True
>>> 'Etc/Greenwich' in all_timezones
True

``common_timezones`` is a list of useful, current timezones. It doesn't
contain deprecated zones or historical zones, except for a few I've
deemed in common usage, such as US/Eastern (open a bug report if you
think other timezones are deserving of being included here). It is also
a sequence of strings.

>>> from pytz import common_timezones
>>> len(common_timezones) < len(all_timezones)
True
>>> 'Etc/Greenwich' in common_timezones
False
>>> 'Australia/Melbourne' in common_timezones
True
>>> 'US/Eastern' in common_timezones
True
>>> 'Canada/Eastern' in common_timezones
True
>>> 'US/Pacific-New' in all_timezones
True
>>> 'US/Pacific-New' in common_timezones
False

Both ``common_timezones`` and ``all_timezones`` are alphabetically
sorted:

>>> common_timezones_dupe = common_timezones[:]
>>> common_timezones_dupe.sort()
>>> common_timezones == common_timezones_dupe
True
>>> all_timezones_dupe = all_timezones[:]
>>> all_timezones_dupe.sort()
>>> all_timezones == all_timezones_dupe
True

``all_timezones`` and ``common_timezones`` are also available as sets.

>>> from pytz import all_timezones_set, common_timezones_set
>>> 'US/Eastern' in all_timezones_set
True
>>> 'US/Eastern' in common_timezones_set
True
>>> 'Australia/Victoria' in common_timezones_set
False

You can also retrieve lists of timezones used by particular countries
using the ``country_timezones()`` function. It requires an ISO-3166
two letter country code.

>>> from pytz import country_timezones
>>> print(' '.join(country_timezones('ch')))
Europe/Zurich
>>> print(' '.join(country_timezones('CH')))
Europe/Zurich


Internationalization - i18n/l10n
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Pytz is an interface to the IANA database, which uses ASCII names. The `Unicode  Consortium's Unicode Locales (CLDR) <http://cldr.unicode.org>`_
project provides translations. Thomas Khyn's 
`l18n <https://pypi.python.org/pypi/l18n>`_ package can be used to access
these translations from Python.


License
~~~~~~~

MIT license.

This code is also available as part of Zope 3 under the Zope Public
License,  Version 2.1 (ZPL).

I'm happy to relicense this code if necessary for inclusion in other
open source projects.


Latest Versions
~~~~~~~~~~~~~~~

This package will be updated after releases of the Olson timezone
database.  The latest version can be downloaded from the `Python Package
Index <http://pypi.python.org/pypi/pytz/>`_.  The code that is used
to generate this distribution is hosted on launchpad.net and available
using git::

    git clone https://git.launchpad.net/pytz

A mirror on github is also available at https://github.com/stub42/pytz

Announcements of new releases are made on
`Launchpad <https://launchpad.net/pytz>`_, and the
`Atom feed <http://feeds.launchpad.net/pytz/announcements.atom>`_
hosted there.


Bugs, Feature Requests & Patches
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Bugs can be reported using `Launchpad <https://bugs.launchpad.net/pytz>`_.


Issues & Limitations
~~~~~~~~~~~~~~~~~~~~

- Offsets from UTC are rounded to the nearest whole minute, so timezones
  such as Europe/Amsterdam pre 1937 will be up to 30 seconds out. This
  is a limitation of the Python datetime library.

- If you think a timezone definition is incorrect, I probably can't fix
  it. pytz is a direct translation of the Olson timezone database, and
  changes to the timezone definitions need to be made to this source.
  If you find errors they should be reported to the time zone mailing
  list, linked from http://www.iana.org/time-zones.


Further Reading
~~~~~~~~~~~~~~~

More info than you want to know about timezones:
http://www.twinsun.com/tz/tz-link.htm


Contact
~~~~~~~

Stuart Bishop <stuart@stuartbishop.net>


PK�(�\i��b��!doc/alt-python37-pytz/CHANGES.txtnu�[���2004-07-25
    
    - Improved localtime handling, and added a localize() method enabling
      correct creation of local times.

2005-02-16

    - Made available under the Zope Public Licence 2.1 (ZPL) and checked
      into the Zope3 project. pytz may now be used and redistributed
      under either the original MIT license or the ZPL 2.1.

2005-05-13

    - Move UTC into the top level pytz module and provide special
      case pickle support for this singleton.

2005-08-14

    - Ensure all tzinfo instances are efficiently picklable.

2005-12-31

    - Add fixed offset timezone classes required by Zope 3
    - Generate and distribute a PO template file listing all timezone
      names. Translations are not yet available.

2007-03-03

    - Import work by James Henstridge, making pytz load timezone
      information from zic compiled binaries at runtime rather than
      processing them into Python classes.

2007-03-26

    - Update database to version 2007d
    - Fix windows incompatibilities, working around limitations on that
      platform.
    - Fix 2.3 incompatibilities. Installation now requires distutils.
    - Passing an invalid timezone name to timezone() now raises an
      UnknownTimezoneError, which is a KeyError subclass for backwards
      compatibility.

2007-03-27

    - Ensure API can accept Unicode strings (Bug #96957)

2009-09-29

    - Fix test_zdump tests and bugs the fixed tests picked up, including
      the fix for Bug #427444.

2011-02-08

    - Python 3.1 support.
PK�(�\�L��BB%licenses/alt-python37-pip/LICENSE.txtnu�[���Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file)

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PK�(�\�L��BB+licenses/alt-python37-pip-wheel/LICENSE.txtnu�[���Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file)

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PK�(�\��R�MM$licenses/alt-python37-PyYAML/LICENSEnu�[���Copyright (c) 2017-2021 Ingy döt Net
Copyright (c) 2006-2016 Kirill Simonov

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
PK�(�\ď�(($systemtap/tapset/libpython3.7-64.stpnu�[���/* Systemtap tapset to make it easier to trace Python */

/*
   Define python.function.entry/return:
*/
probe python.function.entry = process("python3").library("/opt/alt/python37/lib64/libpython3.7m.so.1.0").mark("function__entry")
{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;
}
probe python.function.return = process("python3").library("/opt/alt/python37/lib64/libpython3.7m.so.1.0").mark("function__return")
{
    filename = user_string($arg1);
    funcname = user_string($arg2);
    lineno = $arg3;
}
PK�(�\y��L{�{�-python-wheels/pip-20.2.4-py2.py3-none-any.whlnuȯ��PKEePQX��#�pip/__init__.pym�ok�0���S݋)�t��Mp0dd[�����Umr�I��R�C��㹻��o�T�2�KY�)Ir�݁�����RM_����+�fٳ�8��S���7C<��g�b!�R�(���	$�k9��$~�X@���鰣I�,�Oԋ�c�u�U]���W�W8&I�7�j�b𰘁�ej�P�5!l�V�%�;X�:K�D�m0�I�#�)��<7���#��h�{fO�4����uU����L
Q��ތ�ne7ٟ�s��rh��)u��!h�1�F	�u���QR_�PKEePQh<��pip/__main__.py]R���0����T,;�Ug�{]�VUQ�I����kg��[Nı�{~/}�3(�/i���9��@�$?-	�\{���G�	�p�7���:0K���>��]��M�q�^xҀ��H	�)n<�{j�NC��� y�7o;XHp�x<j��yfj3�&B���(�ij`��'�h�kÃ뀎�o~�4A���<����Z؇����W�e��WLf�~)����
>T�Zl��Ê�#B\���ZȑE��n�l{`���t�R�YH_�P��>��0=��}�GUD+�y��\8��ʓ�l�2}�yVj��)Նm���~;=#!�m ��|?��/
�����LIL�
�]�����&©߇�d�tzo�[�v�;e�ܟo/�Mb�]�>����Sun2'��b�VY�����L������';!�-q��F�����=
aޣ8l+�T�2���/PK�mWv�OV5�pip/_internal/__init__.pym�OK�@��)���BM.�Z���?�*��RJ�&�f$�]g&�|{�	U�.{X�yo��v��B��d���:i�jI�}b��`�0*[']+��/kJ���:m�-P�|]f�c���X<,�Dyj ����KP��~O$j�)���%7�����;���A�S%��b%��ή!&���{E�FA��J���r����3��j�ׂ�j� 0������#ML����(����D& �P���閴j6I�wih�M#”D����29��q
2:�6�X�#�l�6�>J����o�c5���e7{���PKEePQb;sXr	�pip/_internal/build_env.py�Y�s۸�_�:$�$�飦���q.���'v���h8	�8SP�u����	���뽵z��.�㷋�����ݞU%��L�zG��%-Ɇ�$���{��-�%�-Y#<�...f3�k�hIŷ[\3�\�_��l�s{y3��#�*Z�xI��(���{V���۷��)�)x�a[K��m֜�G^g[k�i��}�3Mа&��.�H��m&��{Q�N����{&(�!&�P!A�KY�J1�O`�=m{y�3�6��YFr��Y��;gcV�T�y�Ke��6����uf�x���FpP��+����-�5YɄe|��`k�rq�	���X�&�� ��~���]~���G�����������|Fࣤ����"/�:/�`գqvy�7�	�=&נM����ݛW1�(��/��l��i��[
����wz��Z����ra��>��0��|!�f�YQ���N�
{����%�X��,%�61A�E�x��Q��I([����״{�,)r��忐��7��C^�Ϛ�*���aG���n��2E�b��(�"A�%{�eJ{��\�ŷ`�K̕R1�CUpV^:�h�B����ʱ���`3��v)8��rԜ���a���8�=$��ܝ�NP��r�mu"r�`i�v|�^Pാ�*D�ZC�тmX�P^��6z��ԋ�� ��$��;=V���
�b�$l�4��08?��-V2UYw�z�׿���r_
����y]�]^C�oS���Ή�a�l����Ho�t�S�C�+J���Ś��
T��������/1�V|
��2mF��cr��9E�9�M��b��6�C�p�+guhuNu: eE;��*�XM �b�Wd?PQ姠��F��dV�]���"������px�uҶ�V��*pЇ��g�C^���	�u
�ygVj6[��	�c

��a��!�{�����Z
�sq�,%`��
TI<p��	�!�e�&x�B��a�7;-ל���z��K��7��d�/D�H�TI�0{��~����DŽ����~3��|���U�c�π�"���,�:�#�ha��'�OnT)l����A�=զ�7�4�Q}h�ʴ�%��K� �umj��6uD��|xBoQ
��$!PwU�T�S:��A�Cgv��9��2~9_��j~��ɍ��
��J`h���O�e>���M��o�������=����j5��(;���
�?*��aф��2�����Y�t��N��i�<�%ڊ�I#	c�ј�#&xO�E*cQĆ�'}B2:��7�<b��HU�����C���g���Aۇa�a��8��(��	璃����?b�y�����Ր���(0F�sD�i��v`z�Zp���G��>|�����r�����_SnA�;RSA��׭#�*3��Z����hC�ؔ{u@[
��V��U[��mW�1e��/櫞�q־)�h��K��s�o�O�x@:�ݜo�I�sR;��/>h�U�A����E��{ٛ����wP"���W+����1���o���ǽ5k�)t�i:8�nu�g��D���B$w�� 1�1<R�W
'�
o�n�q���8>���^ڍ�`��x�D?����
Kr�%v|�Zc�5\X��v�����JMa��|�{���_�<���	)̬K����	ߐ�\�(��c婌������@܎IyV���u�-װ�p��cZ�o���~�J�؁}�
�O+N�g
l}�)eBg�i��dE�y�
LƣF���J��H�3Rg)�8�	�,[���*ͥ;�*�[�ɏ#��ʽ6

+g��Z��݀�G��B��\N��]���(��K��䫋[�òR�c����k�N�?\��Eu1��/�
���^���@b7E�f���e�N�~/ߨ��>�>����I�6B�`ݡ0�kL,��W��-^f��P`��$5O�`�~��:k�j�r���3�#����l����g���\m68�?�Op���o�[? }���Ͼ��Av<$���2�����
^�	�5�8�1I]����ҼR����I�<��ƃM��z������y@�

WA�<���A���E�VG0�[0��p/Q�Nj ��E���57�ꄋ�
� a�fO
j5.�@-�LQ����ո
vH{���
��v�3݇S�`Q��	�����^7<A�D����r��r�l����=��p�;�
i�� �VޑiDB��c���QЊB?7%�w�S���`�{�2�Y2;C6|c�sK�Ĝ��J�&0f��j�S��Ėta��?Ln�m3M�!�OP�ި�K�:��j(��rZ�?4�n@�?v�I���Q����z����iqD�$�Ʈw��r�����PKEePQJ4	�>�/pip/_internal/cache.py���۶�w���!��C�a�\ M/M�$-�+��ph���ȢJJ��E����(��,�/]��[�ÝM�=��/)��'<�
��W|#v�jfQ�frW+ݰ-7�R������ld��*3���ڱZ�i�AT��i��O�
���U#t���*�I��Ah#�[���,l9�T%s^���� �/S�1ux����)�n�(��R��N�4i)��=��~��Dٟ%�S�����:+��_��/�y��>a�
��{Y�,����x��7�eO�]<�W���W�����8d��$k�l�Fe������1���ʯI��L��$  W���2of�u\���X�k�w��rU5Z
�~J�O��l��)4[���nD����$��٬k�����&.��{ȠX��2�N������:��Z4���5�*3[~~���5,!>�ާ�Ra��hw��@
�g���,/u�`D�5�e%Q¢E4O��L�E�M.%��>m��4���&U��#:���V|,�F�&F�����c�z��q
t>nV�!����Vk�A€�a�(:����`o��:	�…�2��`h�v	�Z�E�w�J���`I�҉`��;w�d3 ��J��ȕ@SՂ�������Ef	0v��������k�a���,@�J{���'���
vߨV�~hA�*��}BQ+̼W�� �&�l�,6�\'N��HFɘ�N��-��#�,����f�|���\�Ӂ��p
�/��*�8��2)ƓT0�x�r��1u �<����~9@xx$8=Zq6�Q�N�YU��Y
F?�ٝ�$m+p�8�7g���
O��2�6�^���d���|�)=jJ���HejI�����Fsm-�����ZӀ3�y�d�w#������"��s�Q,�h���?����jh�J���[,�, ��I}�fo��U�N���p'�E�\j
��[�nN�
�U�ozH�;�J�������d����f�����!�BR�lS����z>���ݕ�T�"T�sq �*L�
Մ�4C)�����	�NQ���ä!�AS�K�mgĔ�Ҕ�5d�8ZF��*D�8l��y@4�yɢ{�r���2i5�0�`�bP�˒Y�K���dbqɵ�ψ��h&�K �4�Aو�o���~�UC��݆�@@S�^��`�q�X�b��g���z-4$A�Īq�߃����!r'ɢ�]d#��l�S7J|e9N��D��;ε�V_�fG�ˤF�I�&��P��b��VQ�T����Ce���Z��m��CHӮ���/�=}�l�r|�8�N:��ݏ��G�ǣ��㶫KՉp��Ź����c�Gv4H��+�QL��b�_9���7�@�1đ:O������p2.w��p'+�ֵ���AѾy*H��6%��J��,�P���U+�4�C�i��~���ϕ�x��T����w��z��PˢwW��.�Q�H4
��G����J=ۦ����l������A�?��@yz���<:���h�ГBƋ�h��t�����nv:�����L����sP��I��Oءұ�Dc��W{��SҦ<�#���Q��ij�N"�����aD��s�I�5BmQ�Q��5M�4a�Ɲy?x�O�Æ��N�h4מ��v� �T|�ES��S�:W�I�_GWS��߅�U�x�4G�����{<,%D�W��c�_�5p�SP�v�2Q*����J�ʟ/�:��S٭����	�=T���q������:P�GY�c1�O��.!��R��]]�\Z+����M��p(S(���Ȗ�+Q�T��꧒�(vC������É���%�ikł'cu��H!8^�=:%�4M�0�]?H�`n�	<H���B�.>bՕ��%�;8X�1F?W�����=��	*���]�鎪=;#]�@������
��5��`��8oL��dȍ�<����/����e�[Gfa`�Gu�]_]�1�&,�
�����/ϊ(��_t5mC���/�ü�3�ڨ#����
Ȱ�!�l�UUB����2m�֎��Ì��a�JB�f+!�;Z�vopAm:a��k�,]�3��m�����P�"����
��ብ��`��7LO-��ݍ�y�����߷"e�&e�Y���P?����㕶(�;��������3�o�	,�x��Ý��U�-���<	���%������E,�;�1;���f%`Y���9��}C��{C�A�؇�/�@Oۋ�Lj:`���Or�{�
Y~gŨ�nBό~
/�]��q�;.�}�&��0�i6�����7�{��N �;=ޮ:����0�eBF�?,7��,���Q4N�w&_��`!�Ȫ��m�F���R���iy�������v��'z���o�X�g�g���?�B�4p���A'/ �b9 ���E��y`K�d��_���	`�w%g�7�Iz�Dgq�}A��2�7i���3���h�qئ�M�& J�B|�v�B�OJ�}�e'�;?��;��q�%�D]�fz4J���HdG��>w%�E
5�WQ��T���ٌ�kAQP6�!I�T���P���Y؟,�OWۧ
m�sË=���~�e�Oz�ͳ����g/�'��<���)�
ʏ}��7�
��ȸ':����z?$�T8���"���÷I�ޞf��+P�o�N�TG��"�J�e8�
��ݏ����[��뤲�
���+5�Xi�j����\6Xo4�ź=�������+���Ex2a�F574�PCqi���V-֗�\2D���R��7�;������8C˵ᥟ�t��y�!�x��i�댥ld=���X��P�N��V��,�j�D�^G�Z����O�`#2F�F�o��`���r���;����e��57�t���������wJ�
.�"���m�b[r�q�MԽ���TB!4/ǯ4�M�@�34�#O>�–��`�W��x��c9��D��;�DFS�)����x"�ފ=��(l�Op���f�2Q��7PKEePQ��
\#7pip/_internal/configuration.py�[{o�8�ߟ�����U����pk w�G�
��A��.|�V��YH9�/�}���)�N���Q��D��̓l/�b).72�EY�uZ��|͋�)^o���\sVs�E������随{�؍u�&
� Bl)r�bt���	�e�R�B�5�؍�W,�D�� S����#D=V�Ă�
͗gM��iQ#L��2�즔˸ZHd.�͊K`}�
kv���1ǪTH�����\�� �ĺ*e��r��uy	$��R�oj�F#��*Q��5/�R�J����+f�i�T*.���i�����fJ[c��Α�����_��_��<;-��L3�E���:�Z��iUeB���bPH��v���ӗ�>�G��Vi�mp/;���Z؉�P�X����Y��B͙yo9�%y��ы7����ǧ�A=ˁ�S�	Q�)h!��Y���K��#vK�9�؉P��|�V��i �#�aS��NF���F���t�=�����;_+��#�&���S��к��1����'�,L4�$�Q�G��݇�){�n/8�m���-K��~S�Ӓ�\���7GcG
�_��yAtC�&-�G(:>O��ߑ7z^�6���cq�
Ć!�e*3pw��%S�F.8yq-dY����`b	ѿD����v9�%��t��q2��`�g��i��SY+D�p|/��ZZ��s�FY�[VI���%�HH�	�&
<#-�L(@&�sH@T{��2�s�[ ���\qt���L���Io��e%�Ny�)P�J�\�'�H�{`?�˜>�3.Wi�ضܰ�A�jG�_��8��E��?�ɓx�P�6�e*`jlBo'��cU�A{�M���7����
�9�<�!�Z:Ϗ�*@�|���M�_��Xи�'�?;9�6�X�-�t�>�L����@����f���7i>gG��z�N?`��4�H�rv|��xw��u����O>={OS ��f���'�V`cj�R2D�?;?:}���0F0��Y�e<Gu���ؘ,`C��5��v��Lo�X�֫�W��P�$��Yc���W�o�(B��ۭ��I1��`bJ�����A�1n=ט�A`}oU��1���ݱv����#�zd���Ɠ�yAl����vTg�ȄB ~�EX� �`�V
&�:+��kH�����C��:C��l���;}��u�i�ރQ.r@P;���70c���?���œ��6�3Y^�+@>F��b[�X
alGL$B��O�L�I�>��b�9t�!�@Xh�?;;D���X`3LL���[��3E몺���L緽�V@Z�Z"�"�	��
�����4�p�ȝR�{"�l��(a%��	��]�� ��5p��Y0��-JS+�Z3Ct@�D��fYZ�z�@�U�g���Q��	�U��D�$����F�9J(�x�f	��Ӳ�No`�,�6#���f��T�ɞ�A2�M�fm���']�,iVG�k->�*r|&�U�
������]���wwVo	�5�#jƶ���Za�� ��Ё���{�f9
��:�Bȱ ��;�<�O&�����J9�Aگ�W����n��^נ� ��4�����zH��N��Dp�~����YkV���|�Pސ��:ˊKȞy���g����ЏA�+�W����s�H1'��<�W����
�KSx|	Jo���PM]_�Rw�M�`='31�� �d�̽o]��P̓Bԭv��y�-S�����O�?P��XX�$m<sD4��t�R�Vh��TCx��@:,�U01��P�O�&r�t�D����p�BOA��}>�84��ݥ�Xh�G$��e�3�����1����D{+�=�V�r�U
aG�R�۶/dd2�{��d���#�}��?�\<�Jg��;Ռ�Ǹ5���k��f�Wi��X�%�`ȸ��d�]�iݢa��o	����4†�k��K�v#\c��ݑ�ߺR,P�g�'�^i��!��yRNN�����Ă���֮�[1c�<07�K[>æ�^sȔl���M7��ۯƖ���ST�C�����R��
���	��WG�/�H�m�DHǃ��L��Pr6,-�k[�׼��n.4�lm)��-b��r�s��&����8m�:K3�^�%:�<bF(C�&��flxALcn���,m[��1���i���Ɓ�Co?V�݌As9�e='���;c�ʫx��-��Xܦ��}�׵��H`������AO2��>���`���dM�̑O��Mq2`�&ۦ��&�[�4��7��K��W���u_�>�Ld�O�1;�"�AP��H����2z�z����n��B����"]ֺ�v74�	l(~�h�j�+\?��'��s}]:z3��n��o�ar�:$�(^`�{O����>ՈE�,��:#)�c��R��;J?"f �� vd��B�|���I��w:��T;d)1-+^X7�mq���T�B����L�k�&���Jռl�ò�rU��@܇�=hi1%�&)^���7<^
Zs6J�8�%hI�9�)��������C���ä��?+	B����G����_����4v��_�٣������L���6��aCӍ�y!q�$�R9��
-w,��!/�؊5��MTŽ��G�8=1t掽�\XOr,�_Y����A�w�P�z/�g�S�z5��j��i��O!���  ���&���-��m;���hv4�Y�!�釫���Ǫ{2.�[�|���Ae�6�"Z�Vb�~���4n(8^�S8�Za1��#�0��Ƴ�
[��p��`�a�0���~Z1n6�������agd#+��T�h���c5faӧz�&6EΕ��g8%ó[Ql�����h�V���U�@�r}�91�t�G�o֛�
\��
�^v�I�/]Ct��ݚ�EE���#��r@A`�@�|�}�8����� �r���{�&:���������\��	�f��_}pnnXd���6;'��>X�[A�Rz�Ӻ٩����oߕ��آ�vQ]a�c��,�5�?Eɵ�<��l�kޜCiRMݾ�I���������ԁd��M���M]�\zm�YEm+�Xs��G؈�"�w7��R��aW�鵜Z��(��c��1
���X����֓f��s���JM�<���ks�W��T�*}R��Pj�Փ~��_��\�6����*��\BQ���=[�R ��j�!~�m9���/�Hȇ
�2�)|��O���85j
T�b�,�Č	>���ۏ�_޴�!�=y�击�N���Ǻn�83��VޡX�qh��`
+Nm��-Á9�h��F�>l"�u�sW/ug�����.�L�S|P)�2I7������^��S}Tx���=��`'�__��&2p��`0=+w�;\�8,S%b�c�lZ�#I��`S����}�o��z��5�Vg��A���g,_}r�^p2��'')/`|
���!q�B��;}��zW�(3��G�A�0�Sr}^�\�d+x��
������:a��hg����ޚ�����=5��]�8I/�k��M_�����Sm����b�/��Q׼�ܘ�0�hG��+l��A>�&���9l�N��5�2�>_����®>�ۣ��){[^7W�u�(lj���R�MA����@�V���
p�V�jk}���$xS8c}�eW����m���41so�5C��C�+���λ���R]g^��b��Ksn�ɐ˅�2�[Я�;�xg�cS�m�M�Lŝ�}x1�{fO�I�OJ�pD'+u^���Q�|]趺���
T�iBA��.�[�o�A;����H_x�\�`wˮ�5\0Ԟ�J0q�k��u/aP�����b�:�R�(�P�bwW��@��ך03mI�b�Jl�z��tҠ���H�王[[�U����LY�7i�f������r�h������1����V԰�I�q@�=�R^a^+�L �����^���/=��P���/��K�����wD�a��h:;���]���d��	��q���p/�,4<��z��!�s�t�?����>��ム�����L$t;8Ib��l��-���PKEePQ4V<`p]1pip/_internal/exceptions.py�Z�s�6�_�S$�H��7�DZcOc��8�tҌ����"X���f��� �r��^N�Ƣ�.������C*�J�°ڈ�U+���J�+yz˗b0��-�Z��lQW����R��Qy]��}v�d%t�Tn��t�e1aK ]�7�E)�]�2�݉"S:1��A"�ڄ�d�<O�J�&�6�,�~�ώN��~�]���8�x��'=?��1�՘�a½&u�|�^ISM��¿��n�B��˙F�:͒_�\-�5�꟦�_�0�I�*����)a7��р�ف�.�q� ~�
��b!�%�F��bՂ\�?�`*��~�}D��kQ8u��A�҆⊛U.�~���i,T|f,>3nܤ��4�ưKYk��1ر����`¿#�u3�hѵ�����Z/E!4�[
LN]nfH���)f�&[&�D��[���.������.��K����(O��
�_�8�>0����חӳ����v4�~�Da�[$�?05�S��EF�n2x����<���3�o.u��u-�&-E��I�z6V�ȵ̹�7(�]x��q�h��dbp'Y�f##�ńe��٬�k1nM�B��g�p���l�o����}�F�&���)鎍D�g�+��S@o�n�\�ٍYC?���~�ގ�^aQ	��H�E$���C���V�H��!����ߴ�7薸H����+I9D/�g²�B���^KEi^g��k�alV��v�ry+���U���+K�Յ�)6�t9$��)���Wd�v�Øab���58i�=�����o��C��P�	J0ڂ���#W��d`���:�:*��0�
��-��Ds"sq�!�b͓�Xzd��UiZk�0V���
[شB$��!Z��x�k���c.�����(�뺜Vj
{К�����qK�?O?��gGj���;���碸C��phr�- �ǡ����Ί��p��F�9��&m����K�1����oq�ăH��p�hv����z^Z>!�K-��Z����,������s�ڐ�I��k@R�7Q\սҷ���{z}}�D�0���B
���S]�� JL�K���0͜l瀏ǐ3�-y.�;���e�������x�nB6�G���x�_���o���u��|o�@.9��8O �E��!��s����*=ҍ�n�p(�G�y����zԯb��㤱��M�A4�0�����4��;r�;0�췕9B3���@ٍG�9-�H�L4�ɺ�d#��$#J>-=+��D!��Ǩ!0Tm��IT�C{3?����
���]��"k�=a#�,�U�չP`o����"pIWD*`�d�j�t�'�:�r'�S��	�����r	on����������;���	�y6!���,g�z��t�%�6��-!ap	�� ^�Ư�?����n��ȯ����{�e���AH���?
zӫf5�@�I p�^�n��'�y��뼒%��f�M	
�h����&�Z�/@`�>v*h{���
��v0v-�7�|h���,Q}�����L1K�vS��^6�5������g@C$JgB�Y0�5͍[����,�~J�N6¨��lF�=�u�I��Ē�|�!�I
�\eXʂ`��΄Gcv�܇��O%��w�a8]��o���=W*���B�D�/��(���q��|����y
Y%8
�����g�|� ]��B�ӥRu�����w*�����ɂu74MH.0��� E��Ȁ֋`Q��6�սЮ�^q2=E���
�@�b��\�^TȲ!���M��R	�b�
C@�pM�- F�;W��;z�����(R��A7��R	Ӻ�� �-0>	'�!��J�5�dj��ZC��q9.>�][�|���Te!߄��� �V2�" ��J���Kdl���ȆU�B�K���N��$>|7�JN!��,�6�Ɲq2°I�R6���oJ��w`u|�5���K�Y�PHYh�	�O�~{1�P�0��H㻉H��x!�ɓ1+"�rT��4�2��h���t�r{�ֈ�00��؈�i6�1����Fb��a�I����-�V�v��n�r=��:X���
��md��6��Hy�Kr0Ͳ�q�ѯq����a�g����ƁTa����n���E3�����O]V�E>E��2��,e{�M�#�O3�w�XA?��VR7���sȲݔ��c����ذ.(0x�6��]j0�H��4���{�c�?�	���>��b�Y��l���9�jB�9��N�V �c��R�2A����B|�g���G*.�`GT@�F�M1�s
�A�-'�=`Z��q��Q�0�R�� l/���[���h�/�$e��}ׯQ��j�T�^`$v���r.��3**�h� ���ks�(�����
O풸n̂:mө{��5�q#��.��ڊ�jV���,a�����9�2[d"Ur��CU6�AY����G%p��$�Xvh��9n\O���7�
%�U��F��WzX���uI+�y�`?m�	jtL���U/H�	N6%&����l�a{�ŦIi;�0䤝d<�l0.UI���SO�26�M:�9�,/�)64�~�+#���Ml��a��6x����{�2�c*5��c�c䶅����Nw�|r���������i��6ĺbO\�=������4h��իmt3�&+ñ�K	���5#D�ϼ�O@4��lΎ����Q���X�)�����.��T��*zy%�V-M@N�*(�
5���ֆ�#�!�P�p��SE0���VP�Uu)��������rH`;5�u�k6�KQQ�/�v�����va��?~�@�:��i?�缮޷2��.)z?��~�Ԯ��q꭫M�U�~>1S�T.�j0�P �tE.��#R"�"�v�1cg;C^F��r��Ci��#,u�����֓/lw����ۧ
��Г�L�6�m�B\�l+_��;�콉l��x���.a'Ԝׂ��=^�b���kb�}à�֘��C��8�S��}�)ާ���7������×�o؋���5;?�>:e���'W����?oϮ�Ϗ/��tw����q�\��
�ˌ�P;~?'

;�K�M/���^�i�x�k,4B����%��-j��R�`��gj�1xsj��@
6��	�g�����{��S��}�`��_�ԇ'Es��8̧��|	�[��dn�	��Rʬ(w3vֽ͋@d���z��T�;�B��-񐛮᭄K�l��ԦĔ��]/���l�+��:c3�E��EzO?�i�lg�rf�Z�Z�QE\�w_~I��|oj����N��`4:ZbA�Nζ���]ױ�hV����"%��S�yTID���O??��^b/���.��O�w�6촘)=���
�h[|N7_ɫ;�N`��
ب�柉�X���_�0][�����
��5�E=v����ޭ��k2ޫ1q�㌛��o��_�
�^�U�=��7E���M���ͭ�Q��-Bq���g�Σ��9��?�}BZ�mG��D�w�b{����؝
����aso�����`V�	���`��휳{X�s:��¼pW��zJ_Ҥ�&\�B��ܥ�fj)�@Jd�Qlt�]���G�γU=��Tm_�m���d�m
w�i/a�io�E�t)�4�ˮ��!P� Ei���fk��-P�����y]�Bt��G/��։=��9S�;%�U��w�ُ]]��/�˅���h�4�l��.�|CC��|�Upu'vo�f�@3xW`�>��S2�b�"���8~�NW����K0��Q�:����lD��)�k�=����PKEePQ"�&�
Lpip/_internal/locations.py�X[o�8~�� ��][��`g/�����ӦEӢ[�@K��F�$e�[��}�Ë,9q���������w�$�k�s+Ue�n-�`;�J���Ri��j)Wf�de,/Kfl�\N��y�$�����Y�j'��o6��̬USl!���T�j%�.+f�`c-R����Ե��T��/����R�
�2�;˘��J[�F����¼2�QZs���u�-���o#�h�{�z��Ņ��V���3n�٩c))�WEu�\�����E����k�Θ��b��RZ� ���c#Lf�L�^-�KVh�5ݨB����&���������u]HmN�#f����ի���Oo���9a����>gP��?����.�~���{��Vj��RT�HC7U�YSBg�u8����?G���+�ℽ�f'�mp�	�Xa08��XiSģ/���2���h����.�;l�"�JKa�/�g/_�����{v��6��&��=J��dR�X���نQ:�HxO�ڀ�h�%��5��?)��,�/��*�����`�SK��7ZS\���5f!w�Z���U�I���=a8��󟒴w����>�_�)�!��g�4��.UW&���b)�/
�z��� ��A�!3�_��FĄ_��!�
��BD���_/���b��%�|W�<Y�I8��1¬ G�zO�<�[:V�D��>��1�s��碶���J�)��ˊ�F�l�S������gk�q!D�T|�$
I��E�C�G�K;��:��	�^5��~�{���q���H�+�e�Zaゎ�Riң7;#����/��;EE�Z�B�{H�Z�
|�1o
*8vM���N�ivfլv^<[�j��]��Ge���4c��X�����r�C�`K������b�R-x�
̴�_!���O��d��ݘ�(q�\$ヷ��s���5�I�]Α(H9[4+��w�w����(�f��ѵ���� �]4�����+(��ҘF��_���/���ԫ�Le�+M�3%f
��T,F�K!
NSʳ�֦^�T�KA�m�S ����,�����:z��zmy�P�h<hc�}�>�N��H��$%2�6XԀ�	�18��tn�����	���lm��������߼׸�L��-�>q1����"a.�W:���+ח.\�
��B����\�ښ�&�]p|���щ3x�,�X�̰!H�'Yj)���s)�"]dc�ȳ�ɹ?�3]1��3���Cv��.���F~U:����X�5F�J@���୪�)k��K)�F|f����H}������jef���I�vY�%�*E
��l�@�D�;�B�����(��ً��A����>��ԥ���v���r܉B�}%�ٌ*��9����F�=�R�Z)��pT���s���>B����R@[n�v����M\�}
��.p�݋����G�F�g|Ķ��	����!I>���pH��\�CB�.���F;F�,�^q���#��M2�VjJ����Ur��R��QK�{|/�Fd>yfKY��DKj���OT�c�z�9R�Z�s�a��x]�t�A7�_�
X��h����N F�~t������~3�:|���C�������U�
�c��/��F�@��	A%��puh���.[JhC�Wd�-���(6�'蘇��g���X^Bl_T�5��g&�*�4���8&,qA��!��ׇ$�fZ�!4~Dʉ�'�b�IR��'%Ӑ �~�D�ٮ�~+�Æ��̄�#��a�����ŭ�(�Q��qk4
kO�ģ�{D烏n�{F�v����7�B��(�#��p���yfj�˥.}8eS������3�g�p賖J�u�-#���`��w�a�\�ʡ�-��B=��LP���8e%�Y2�2�({��ߛg��K+��?V�?��GU@�;8��j
oe�E�{��ΜC�{ja�u�?���gw̯�� �yQ�SRt�a��!��g�Z��2��^iS�0#�-(缧�I�Pz������Zpl2��c���_�kOz��"/�B��	j�yL�i�Ov���C!n���QZ
�N��$PV���r+:2Xغ�ǝߣV��*	�Jn���6�x�w�I���l�ݛ���� yh�B��*<
`�_���]$�V;�D����]����m�t���I��)]?�<�	����"a��3����tiUV5�`��ä��^�*oڦ���-����nŽ��o�,���$��RP2�Wt-�ϳ��-�}������Mu�R{{����ݭ4��X�%#��Z"/{��u8��^����}�E�s#9�{z�#�}��LkIv�3�v�8Ck�L���V����lx�"����[�|����mz��bJ�.��2$y���JD�R�A+�K0�<Aݲ�m�v�IQ#G�2�Tؿ�-V���
�(3����ч�)}�Փ=�@����=-�x�):�+�y���Y���>iur��X�b
�I'��*�n	�H�-�����IG��5����[Pxy�Nqq<�PKEePQqM-�pip/_internal/main.pym�OK�@��)�zi�&A-�5��C)%l�I2��.3%��mJ���Ǿ7o~��$'��ζI��J�C Wu����}�/���*˞�c�:!/�S�S�'�%���B�Ƙ+�,���Zn2�pv0�흸��Ѳ�;6�����b���d2�lH �(�_XB�|[B�A
���X����^;�
]K�q���1–%�C�j#�9"4�AiZ�6�.)|��!�4"LI�GI//���c�?� �S���9��lC@>TaԞݯ8���PKEePQ�^�z�	�pip/_internal/pyproject.py�Ym�۸����U>Xl!=�h��������4]$9�b!�m3+��Hy����̐�H[�-��F�X�p8��<�n:�ge��m߉�dr���2�6��(��Օ�]��M������T�iDe�V&�Q|/j۷��r2�l�� T�� c�ӂY�o�$��W|+ն��{ى�PvP~������ՂE�RY�)��mb�2�7
��v��V6���l	����s��/o������7�	a�L�|}��CZS
?�����͂�����ņ�Ҕ
<�zS��z�e�ԼB��xΖ߳��
���P���#�D�T%p����9�$��<��V����;K������T-��so�?��=����/[nwy�0s�.��J�5����;�:���?���l�U�⋖겲�
�X@3�ɩ�=ڝV�ae����t��Li�ւ�JV�$)C�o?�����&�pX�d)��T�S(T�C'[aqK�j�
�wd>����"ߏ�l�$���J�-���fvG�f�#���j�Z�D��F	�]݇t5��Q�0l�bzi�_���Ř�P�wXe�.E��H6�Ѐ�-l1�
l.ѿ��iQEAE1l~gJ�e�fw����0���-�`Khd3&ot�-�/ܐ
��C{;���-C�[	e��;{���$���*R��F�,Om#+i�#3���F��K(	%X�NW�CLo�S��L�7�	��*@(Y:$d�>�8}�K#�e��-
��� @a)����@U�È��(BcB�h�Flyud�N�����G	�9s�$h��	� <��"���$�nY\V9�J-�8DD����7P`dt�,2}Kέ���P�iE#*p��Z�aN�Zg��,�OK��/��γ�@Q�Nk;��<4�;�B���`��i�·%TW��&}@��c)<J�Q��
��bK��U����M�r{��۶�{V�!
ķ|3D(楃c�k'�0�g�n��en�h�������c���~�~����{c��}Uy�_28G#�Y\��ZR?���p�o*�:�[�,!�D�2"�r��^/�#+�$�����y%�m�q(��~`=FU�{�	E��E�`�d
��D�"�a�$_7�N���-alCH��P��N�v^���8Y򹟌0y���<����;n��b��(�8���	�Q�7�B����:��s����~�b�n���R:�zͲ�Z�}8 ��N��%9�b��^�J�F/}�{��0±�_��X5(��)ݿ>O-ŪJFCV@g�=7?q|�N�w�b��$�&��1��F��;��L�{G�N�)�(��/�L|�qX���!�b#:SVŽ�fFc��JP~�K
5����$�Z�����
P{8��!J?�:���X���n�W{�4�����*i�W�v¯ޡئ��7��a5��B�o.վ�!��w�W�t)��x�J�x\E:�;s/E���
�c�f��"5Q� �/�A�ݸ����	����xh>ߖ��b�#��~��A��	`��n�i��Uc
��pD���؎�ҝ<wI�xU��&�D�L4�	�a8x��Cv��E柼��\q�
P�_����-�fw٨���_^o��قedQv�R���nK8���te]�٨�B�6Z��hjS9��-d�TK
��o���G�%�_�C�ͯ�ܭ'1�������=
�-P���1�ptB��D�~�KP��Nq�2}�
��o��F�l:���L�X��ӭ-V)T�8F���K<_FVg�0�+
z���ʨ�����k'���9�0Ψ��c���3K�[7��v�=�m@��pi�E��I��'LZ�U8�.��k5Ad�K�حى_�>�/��Y���=@�#�t�F*Ox�8Çh��4�!ZC0}�q�h#4�[4�>���P�����`���q����N�r�L\�%?���c�8�:�L�SҚ���]]O�����)�]�r6���1����o���~'n��G���8�,�'q�V�����\*��N.��0������y ����?�
����4O�=>v��6��K�:�(��yw�ֹ��
��D�G���*3A�n��S���6�x��Iˑ=r�J�Nc>2�g
�#ry:dϨ�=4�����/�$���4�ѡ�D�9v���SB��k��d�m�`u���lR4̵�����k2N��`�j`���@<��p#�#�$�R�z-n�h�<� LP���Պ�a(�'y�����`�,GA�����H6�n0���e89�g�v�ُd&x�7�}�l�=������X�pn��b୎�+NaOY����*���|��b��  �x��;��ȑ����vɔ�{���4_'q�ld4�@��:FB9��|�����S�EC�~�'69�;�0c'��E�(��PKEePQ���?	{$pip/_internal/self_outdated_check.py�Xm�۸��_�:X�\x�"8���\4M6��6� �i�^-QkfeR�����>C��(ys��E������F�Y���m�eL�k�XƷFW��^,���[a�^��7�Jn���U�_�;��£6i��.<��Y,Jڼ�u�=U��='��ǃh�Ԋq�wY�8g7�10
e�@[�xs�$���U*U!�\W�ȭn�T�/���|^����3������)�.DeR#H>ΐՍ(M`�	��*�raNIi���RVf�b��Ç_x.���Έh����3�A�J4~�u�b��F{i�x�κ���	�c�mI�aU*c9�Y�}s����"N���c=bz����W/�>||��ͻ"~�˗N����yc�[s;�R_�㚽��]�[��p �S�tsW�!Bd}�W����k�Ы�W�뷷lÖg�.�g����go/�n��-�m�*�i��Z�e�+��dY
6����^&����}F��,q����}^���1<:*�gۣ;F��$9����fǟ?�.�W�N<�N���X�(�M�C!_��ȼ!}����4ug�E�Ͳ)S�Y��wIt ����N+ѿ%�����u 'W��ó�O�;�Q��щ�x����/��	&�,��'D�
?�M��-Uѻ��lI�.���v�{W�O�d���l���&�*9�⊀�_�3�N!%+%=W��x�E
Xy��U�h��_�jE��Gqt�V󝞱�Ǻ���Ց���"��/�m��`�
��-;pe����tk�c�OgjF�2	xV��E:��>,�^70Zc�}��΄�"5J5�t�8O�"��E/���E
@�q��m�8�G=~"�}�Nßy�<coJo$�4���8s������q�a���"G:1����w���Tr�O;�`�4�����Bޕ��t�iMKB�cH�I�~K�w�T8�-<��&�e��@��Z��J,U���H�	�W��(j���*��/�F@�Q�
�p8L|ё�q�Wm!ܙ��h&�a�lV@��N�;*k��h�'bh�8+����d~��K@��<l]F�#4%�I�5q52�������:���(*�}m<P�3(i6�MK�
�#�&Y�����ؘg�Փ8Y�qV��F���Ք��1��g�&�X�L��,e��5zD�sž��N�h��)�����VC.m�����B\��J'�zĤL)�֧�|���q�==�?�
0Q��|��GR׾����c�L�i��V�ʽY.�L�(J��ı^e+�y{�R��-���bqأK���k8�d�҂���*��$����ȑ�#���������%�R���|-0��4���=u�L����<����]�xͫ�w���t�6���N�94���ș!}|j&]˺���
���C�����mW��a�…*��Y�^��{i���F����sd��qh�%����-�S�Er�A���B:WK夑�E"Sdc[^	��h��P8����C���&{��A $�����8ݭ��&o$ۡo�و�6�G�Ĺ$r�f�Wo#r� |6	���L��j�Q+aM�����97]0�C>���!c�t`L˕>$L<c�&��T�l�
㣗�9�Ϻ�q!�:��ۤ
�	EF���#�jW�fM�H��c}>�g��b��v�K"C^�t\�VùH�\� �������=�_����w��G�G��<�>�<�c!��ĠL�w�;,�IK�7-
��:��OHɧr�T��6��\�.��>nt6�eN��l����s�0xdJg�^�w'O����^�>dG��E�q�M=X?������\k� �����
������s��4�&�
�rX�#�Nf�Uա8=a��m������O�)6�f�<��i+(-���5M�'�_v�ƫ��<�����4��&���=�O"�f��H�j�"�G�p_h���0As�7&�a�F�1��5�6�td=�4��|0Ď�率�O�[�gO��̈́5~=�s�=��'�1xFe���)��M��&��A�߮�w�+�k;7���Ъ�.+���5~?���'j�uw���-5B�n�-f\�
���x���B����S�j.i�sb�.�E�оy1��=�xyk����ȭ���k�_��w�L)��Mb��(��4�҄���j�I�n�n��Ѹ�����IiTZ�ɤ�X�p�*�gv���5��HP�Arg����~Faa�(FN���{z/��h����eW�z�rj�Bl۩qn��i�B��/�\��4��`�F����T�Ii\-�PKEePQ�H}m
2%pip/_internal/wheel_builder.py�io���~�TF!
K���a@���4u;i�0bD�%ּ�!�h}�{sp��-�ȇ�Zλ�].��d/d��j���vY�f�=��%�k���/e��J|�F�le�X.��EV�UӲ���ȼV2�y�7��0��k�|� �uVGqV��)yU
�<+��~Om�jgU)#b7"^
-Ŵע~�����s���a
��2�
Eƕ
hV���V�A�L&f�(e׈8͚����wY.B�IM>S&�<:)ڮn�*�11nP�^���$��y��O��uS%BJ�%�q�<ڊ�F9�gxn���=���P;�ǯ�~���8�{|�������]�[.��ⶊam
�!�;�'��������}���ϛ��s�ߢ��z��C&ې}�ѳx��]
��^�x}�Ah���}�+s����0�� U�J���y�(�O�H����m,�77c�ېm�Yn�+!��0�����r�X`��p�`�v��@kA��qZ��n��Uq�l6"J���p�Up�O���_���i���Naa��?_~��8s}���cqR�-}Yԁ\+3���� 	����Hl����Y)0�{`��`':E^U���ٽ`�dq��~V�L���=D[�6RD�"�E�n���W��m L���\=@psH���I���z�����D���J!tJs�Z���xK.s�3ξi_ZuE�H�WJ2�HP٘A�db[A��(茫ZA�b�M�p��3�' ރ�Uw�z��-��Q�hD~`=���Z��x.�K�d�|��/㣜<"/�>೺��j�)��!K;�N��F��b���+�0(B�z�[��W',��� �0m��j�U��!��M�1��w���du�
�o�^�HR@8��CQ�2eU�4���iC̮���]�����5YuMB���y`�i���ag���QM����LH��a���L"�
*k���3����B7-���� X��},�ʕ�V��`<��E�
�m&���I�Na]Q��beU5P
@%�<��;�VD~5��r]yJ��̓1p������l�t'����9�N��~<�[�@I;#���%�M�)��Ld�%L-z�04�5�mh�����1�dX�tٙ�L	�-V�
���h$t;F�*ƈ�q)����^�_0��t�Q�+Ty?�,5�Gjj �WRJ�%2��yaF5�R1f����t�B�4����%t�.��_+G��6bo+��m��6ueN�F�*
�	Zϊ�S|a �W�"z�1���
�W�3�B���߰%5+��,D`�S��!~��$8˨+�t��H�Ɩp����.�7oGh�Kk[��(���Si�<kaM{]6�+#�zT��&�#��c�RǸ�b̞
o�2mA_��tnW!f7;3�\�^oЉ�����k�@J�����B�tN�c@�xT��H%��wP=����U�z�t`�!"7o�$�7<+�t���iHF�F�yF:��!�ĥ
o��;0����z��8_�Ȫ<�2�&���k���k�B#�B!��4��&U5vy��۞�Ax���)�`FG%����#V��g�xp�K��oЄ����m�M����׉6��D�-�x}�4�J��Џ�)��
�ğ�cC�j^����bl�Ǟj�P8�a�U��������5�t�~���1k�DPY��T�;6]Y*pW0�8�|h�2�o82
]vD��{I���^p���fI�_��w�A`�n'����B�?~�s�
��<��v�S_�I�iG��y��LڤYU�i�Ba��x�4�d\n|s�6�ZӍQ.�ϝ��I���
�y0����y+����]�#"�����|������uVG�z��T5�i��s!a'�KA�a�A�B��<���
n�Q��^�����9�)��j{�0�يnk��zp��=�c�au��+S�&����}V��m�~��7��#�������t�ӗ�^EF�!{-E{�-�v b�~F�k;Z��Z�r���9V��]�/���ؘ���yiM+q"�{q�$�J�_��9ɫ'^�=��� ��uy�F���R_Ra�ԙ�ʤ�3
�>�?��ލ�o�WG�+�/� ��oؼ㑹�xDf��s���D�3{&Gd�����\�=�!KU�sF���o�]Gݢ�F2X�#�S"˺�˚9nb���_v�C
��WqS7P�M���wT�?
�k��Q �8LN�݆��Q=�2�F�G�P��Ζt�Z�������]IdϿd4�a��$�H�<��
�sd��k��*��{^0)����d��ܰ�n���w�ו'�n����GM����e63��͝�g!��'����5!s�����qE��}������N�:Y�WyO��Q4Œ:,���8w�AOc��`9�6��Ȟa����,����4����k���H�/ϣ���6.��H����L���j�j@��[�յ�e5?�C�Qw�2�q3��3���g�z����1i>��9��6׍/�Y�=dz&��PKEePQ�w�4h�pip/_internal/cli/__init__.py%�1!{^�"E�|��b�����>HigF�s~�Ǡr��(nAbb'H�0d<�潓U�C,x6*��J�u��)���,4�g!n{�Eu^0H>�>��[y�PKEePQ%�����#pip/_internal/cli/autocompletion.py�Xmo�6��_��$�����W(�`�5A_0�!)2ms�E�����/)�Y:ml���=w�ܝ...>�-��ڕ����
I�N��ۚ*���ʺ�krw$EѲ��E��...f3�o�P���-���o�ɣ�m���P�גؕjW�ffAz���4e�U5���k��? h�h�L�}٬5�w�f�J��tJ@�X-�=����*��9R	v�!�ulY�u"������W>�_��|��7�n3�x>#��RC	�cJ�AEyWӔ|�[���[��l6[Ӎ�B'F��C�$N��;�7T?�]5J�-���
�{	���DDvw-t3�9	V�����;N	�ա�v���w��0*�.�tlXM�$8�^�����?�q����UD� 
!�2�<0�c~U�h�����۷�PH��͗_�F�L�5Sq�|=_
'�������U�w>�Ϊ�T�ri�\��F,=T�U�Y�Õ\L���~j#{1Ա�=������8e��zv,W3���HPޔ{
[1��p1���6�`0h�}c�`
��-y7֧5�`��}r_g���� &uP�� ��+kR��v�n#_*"���Q�X��#��&���Y��!R�
H��'��Ԉ��	�5v��K]��Q�@4[�$��e�R��D��hE���1�!����#S�8��s��������\����¸��j,.ql@4��	n�5�9o����h���d���[VW�Fڭ9*��Dp**0*+ۖ6��	������B�x�?��
�ƫ�r���k�䆜�x�����
d4ܜ���<�ݐ"�Qa�G����E!d��2c����|l)�g�`�E�4d_���~���5�����4�7���D�5o�9|��y!+�~2
�+]ֱ����M)�2�l|��	j-��G�>0�I�k��F{�2��|(Y�u��c�'����h%˟WڰC�CIRʣ�����D��_
z�=�@�ծ&L����su�5m�&�
��Hݽ�sVV�k��
�7d���X'�ޙB��AJ��,4q���[
�r�ѓ���l:A�'v`�"-�Z).Հ��2E5�To��H�;��Ѕh��yx$-�l܏N¦ρ@5$�9#K��w4�K����C�
[�3�L��|,2gҚ,��y�$�9J�c��:�yu+'���n����YaᾸ��8��B/�2�P3f�ŠCkvX�u7l�6wc,Lpm��VT�Rg~i`�aAFzQnm+x�� �{�:�����T�6P8�:=Se�I9���'��~���X>�2Y�����or_.���{�����G6P�ϳ5~~�iBr�4���d�Or�C;(<E	���c&�I��D��0L���P��a�����x�Eϳ�D^��x��Y�4)z�輄Az�g��F�� ���3�c��B/��@7�m��.C�8�Xh���MPDb��J�3�̇�L�cQ���������P��^�
��dq�����f����AyN7ə��-y�;�<��oV����fxu�QSHH>-�GDok:�8�J u&�g{5fHgUhD���%&����_�l����ԹG2{�?���^�7��:f�ɳfb������N^6=��%���?��}f�yx}��".�L�d�.5�7���ۮHu����5h�f
c
��K�/��T��$5�]���:w<��<6	�r������Of^l�l�Fk�1�f�{�� Uʛ�)C�\����T﷯o��P�
���e������,�$��{y��B�Ěq���†�b��Z"�8�u���K~��0W��p��W6�[sW�C� �ߍkg;O��V�i�0�y�&3|
�7�HT$���τ����6�'s���+u%��7@�s�1�K ��ğ�z��a�nľ��r3̟S��$
��&;*A����3�洓�^U3�'��L�"�!?��p^+�y�I�áo�$�q �PKEePQ��7�V$!pip/_internal/cli/base_command.py�Zmo#���_A�($��� �Q�8�$Qs'�|ip8,�]J��j�!w-�A�{�!����si����,�Ù�p��~��k���nǓ�1�z��1�~�<����~��Vr�|�g��Ϣ]*U�J�8τo��Y��$Yd�Lz��.��M�lZ_�@&��i�r�E�]�O)4ZK�s����Ċ��(�|� T�c/�#�j�!J�����‡V�x����D�v�}�<KNq0�+�p�c��6{�3�f~l�Ӑþ���y���E�~�=�,#��):�Y��d(tS��ݽe����0�{|�g�n��ٽ_�}��0��q^�0�_>�}w;�����w��J��@XC6�_�0ոظ�r��,�<K�|������\d{�>�P�Zs%�"��<�ÛHզ��B�@h]|L�c!�ۀs��E�D`��nܐO/[G��fbW��V���g[_��N�-��-�R�H���NY��Y��.tN��E:p�6"�S%7c��+�ѿ����jl!�è崛X�x��$�|�#�8�u�Jl"��Ë��im��Z��_{���8���ߝ^��,�H��j�'8ݍ�'�P~5�Yw��4��M-�A�1���1[�i,��mr�V8,rk>�8�W|�-�g�x/�[����x�k7�̢Q��pc@�}�4���?c�%���ߙ���'|t��t��Y��'ns����T�A3m�GG�s�':�)��ǺF��2��	�I"J���Z�k�!4�+�Wa�����(t��l�cf�#�#6��ѭ$�y��:�a$e�BG%��b��
�R����ypi�z�˸I@!���/��_~xk�C\Ñ�֨�j��K_D�a{%C
�f(�7�iQ�LL�6g�
��f[���[���r+�_{���	���Ws�8M����E�v���W_��2j�k�ʑS����
�O�������<Lˊ��2ɲm���l�
'-�b��Ŷ��D]z@i/�i�|�F�}�Рs���Pij��#�Ú��M���F�B�l+��&<v�()0��T����E�E�a<l8@���k��nRװ�u�G����j�nE���
-��&�;�R`[�c����4�b�q�@�.�Տ�S��>/�c�#�Nd�49G�w��:��,� 2���+*�żNAg�=!�ۋ&v1C���Y����7��1Z$Y%
VHK��k@�+�@����� �6��Am^0��$׏H���U� KR�#d���f;��4�8����ID!��4#�o��NBM�T#_sʸhfP\11�T��(��
��,�4ܺ��Q�Rqǣ�w)W7��i�(�Z���u�Q����o�����ud�[�]���9��}R�<����Q�]��%!�F	-���,����\��$F՞�j�l�+[��
p����U��*h�k�3Ă'�����5a�#ɘq�FUڿMU�3�1�M*�T�S'��M5��B]�-����*太g�3ua�~�–?�(��!��0F3l��ھ֖��wWz��b���㭆�"0h%5¦����[(X�8޶z�©�\�	6)GP_����'�I�[�B��	53Z�~ڔ��h�@�RM�<7�$˩2������4X~7uAG�%k����'6���1�fD�+-�2V�'=d[,t�\Q�S	n��Qa+��V�)i�y���1��<5=	���Hbo�o��<ɩ�{�
KX���{��PdpKx芠�q(ق	-b-ѣ1�H�m������r/��"9�ZTg�!�L);�+��b��.���Zh�fRH�s&�gސ2j|�!��#��p���8����R�y_���Q͜Jp$i[�	�Q�D���`�2��Y��ԗ�^yla�t�(
v�yyl�����ĉ�'�+���v����1W݃��1�c�xS���l�����>�[�����1������z�׿u^"�u8��l����v�9yT/Dq�Z`��v`�_����������-!)m2��2��]��(.bL
3���k��C.�w�#-7���"�m��Vơe�-7�:�f�z�������P��md-�z
W�yZ��y�t�J����l����|�|�F��xF�}n�4_�w�����{����-S6�%Q�uru
l���^)�LV��i*���3+ał0�:�"�#^��q�FZxꖮ���wY^�PB<���uY��EZAL�
O�dk��C���������
����
X�_�4��tiҸ~�%)�^��c�I�x"E-w��<����.�P�!�k���P <�]h�%���x�8re�Q%�1kt?�m(�I$���
P�ڸ�i}��EZ��rgc���LUZn�#��"�
���n+�X{`{�t���G��&߳u�7^�IvtF�d����2���v�f��78F�!o�C
�;�G�e2}�?&����Hp�'�T�\x�)���jp�J���8�O=לP0�=#[�_���ϗ����
��쉫��h|Jâ5;P
ZQ��1�$rb��/Ҷʃ�������b������\S��b�3J��rz������Ҫ����?�8����	b�B��$Dh}�
u�����Y�̩��T [�7ݿ�]�X3���}�t
*�E5o����V��_��]>�k�&��J1��}��~p4
�s��ah�*�F�.�P���pp��NU�t�L��`L�MQ<]��~\�ԛn{��g��gѣ�O�q��#���2�f�??�����?T�SϿ���@�4�Ƣx����+���:P�+Jx�ܡ3a��jl&<�Fh
耵נ6ρm��l��`K+��F�\�Pp[�GN�J��������w�eM�w����kx$⋭��8�$W!]�)���o��j{��15S��X�@[Y2�
�+�/�3��/�
�|gq/,��PKEePQvu�q�nppip/_internal/cli/cmdoptions.py�=ks�8��+pL]Qڕ�drss�O���&��$.�3S[^��� �c���aG���~ @R�x2W[���	4�F��
{�7(�a!"˫8KK��*�:/���y�Q�'R�e!E\�*��Si�di$�b^W�OiV�I�iY�i���Zn�$��I�
��VȰ�R1�q���ae=��Z�~9��<���Q����
�Z�\V�R�"�R����\}+��"L��1�紒E��iz�:��E�W�<,{�����J�4O9��̒${��Yƫ4x@�3����8�(�l��r�=�a�e��f� �$˺���6�N�"��	�&'	�R�"ۈٌ[�f"��YQ�p^fI]���ԟ*��z,�\��,��[WqR�SC�l�e	7Z�iT��R������)-�~y���������O�c�&��A�~1�o!@65SX�`��/��8ȋlUȲ��a0���ӫ��_/ϯ�zɏ�T+������EV�H�(t:�|}~5;;={{>{}q56�fe�����>�l!��ˬ؄�8�*2C׿��3~��w�.�G��r{y��m�U���Ϫ�
=��g}}y��a��f��7W޿��=�~�OO�Tms�r���_/�:������/޿\�<���w ���9�`���d�k`~�,a275H��o�ٸ�%>*��0�eٴ��"j��C��W6��`"Na\��Dv�j�L��\�xR�pFr*�.2��a3����>Ky"(5�rI�$Q����DM�yԀQ�xZ�JZ�Sc�$q����V�N�Д$���3p��D��>s�����W�>��b5�{<X���~�7��A�'q5���3O��	��:�r�ϱ��^�[ ���nܳ���,rVD�tMQ���QE
hp!&��ހL�Hs,`\�a~n�O��W���r[ZӤ�i�ˊ�lL�)-t#һ[���	��j����,�B��BQX��P�I�԰�U��2��%�l^��bƚ^�(Ǫ��z���^,ޭ�f��w���:.Q8�ǵ����"�Ť�� ߂�`�j0i�Q;e
�
7��4��M����:_�-`�s���v���#�:���uRa��Kw?�Kw4�p��:��O4�.y\�a:j:�j�c�{�4S�ª*��Pc[�����8���K�Zyc���O4W�Gwz�a�nB���,̵�4m��v���ͮ�<N�"��pd�h;'�C����P(_�uj؂�Rsע���(ՋɄ��L2Ự��{��n�Oԣ�G5F��|���7cb��(��f`�	�lH��X׳I�k7����AAqC	���7qJJ���
ueVHng'u��wS�b̧�׵�B˂6��E��dp���_�[�M�lu`d���fc�h� A��n�W3�	�q�!��D˞LD~r�~�mgY�l�����X|�@ͩ��Y���,$z:�,Y����3x˞��gH�6��ՠ�J3��Q��w.�M�ы��=�I.Je ��"x)6�.4�9��T�ʬ."I�B�R�I��(^Ƒ�d�^��ö�dLY�2`���9xo8VH��8�er�vR��4d�9�+!<�Ӵ�7bz{�dR�?�i�^Zi�y.�Ʉq�8ݰ|FfC҃�p9�
Hƴu&�4����R�I�)�
�b7ӦK��q�fe�Hk\��i��jx�<S���{�~��ٜ���E\L�!-�u��ɼ�Z���9�����<�����㸬q(|-�|���3�ҵ�W��2��c�B��m G���c�������0q�X1dX0p�`0�2����F!��X���z��L#v�ίܶ�ie�v�m}�p�Ww�۳����3�`-�|TX�WTQ�>��5hP >����)��z��G�#�x�_��G�jx0j���� �z�k�����}X���m='��9�y�jA WE-M�Y�[X7l�]�)��b�L4t���DO^c�YJ��0�pf,��[,�"r�ꂤ�ڻ�c(S��1�Uu������L ⤟`��F����h:��b̉��@-�D
2i��қ���b�U�B�BCm?�����Q>�ʽ��O⪭���L�euZ�0}as�Aº����*�����ҋE\�{�tb�tN,������b�����X	H˽�C�A͜��O]
�)�	�j��w�*��_̺`��X�v�n�="]~���dp,�{��cI-�'�rN#M��H�=����gv�(+`��,]PP?��^a�o,ί�>\1�������ӟ��[���
�|�r��";|�Gu�	4u�h�P/pL��:�#���<I�h�hs���h��7�Ӧ�5[=J=���`�l�̷��s��T��3.(p�N�S����h+�&�1!�~�F��Ӈ�2N��f9���^�}#�tЉ22��x�_�$C(�L��d&��(q�����kX04�{r���%��{[���\����&''�|Դ����a���m�y�
�dU�w���P�`
-�[4�xZ����;z��|���LX����j�R�3�M�t�ړy~�7�F��f�q�����0Z���J��󹰪$,�m�{zg�����cv��s#�܊���y�l#���C��e	n{�2/m����–Yt/yJ�fw�0�s��L�P}e�6���������?Ӫ�qM��x$�2\l~#'p��M��	�c��𶔿�K\�<�9��;>���z�:�n^�� �$�"8��i�=/�m����Ǹ��c1�G�O��8���Q��)�0�i��u�gɢÚ-���V�Y���e�O�g-��\������"���(�����45��k
zY1hz줮�Z h�(�����
�b�![q��b&/��ɽ��� � �<'8�w���xV�~��ء�h�_�m�7�xb{����E<<�J�ba�f?��١
d�&M�K��p%�xw$�(p�u��Jls�̳2��q�$Suwy~)�}�ʕ�$	I����ň�Cs��=�o�0&ā�tdn����U�a�*.I
${;r���M�:�e}�����-ɶUKJ�J>Y+��ٻ�U�)��'�k^b�q��\�����Ζ�#��Kͺ�_��?��d�K
1�hH�e�t�T�	��b���}�Ā#�/ѽbF ��IK�
6VjFy*��s9���b)B+@�کXW�����@�~��4�a�����Â����v�1Ęr��o��t��Ɉ��Aa�€�n�r��9��k>�c#)Ƣ�p�&�
fJzX20��"��/g�h�c&3�:9�sgP�ra�>�pi�Q�u����3A0^�)<{�����|�uy�{����s�	�.,�9�•��S��t�Ĩ��|�Hެ^�E\u(��`�p��Ab@�{A�oon.��d��w���"�^
������ٴ���3=�Y��*��U�D���F`�u��|�	���%�Ë6�Tl�ҿ�z�F`���1�SG�*�����+M��DY�t�I&��5ԋ�O*���{���+4bXOL��@.����R7�f�-08����1�TVp�tIH���=<[��r`�}7�7:GەP�>�Ӻ�J&3y�W�Y]8/�>��&�ʶQ�n*gCe����3B��=��@#^l>��?O@�����qL�g�������7v8jŤa��`��H��zb-�m0�6��$���m8F�6*�*ӛ���5��i/a@�O��C~xz�Q7s
�P�%w��@����sz�,��q�6��r�O�#�:M����7xH.Zi ����VJWw�7��|��n�`��9�%J�V�����
�M��;����)5bO!���ܬgh맽�j�$��吤�Cz�ŕ;�藓Y�cm�lo�LL8<ֶ�(�ّ1�,L������3�M�2e�WN�+u���*v>�ji5��=�R'��E�i���PY?��xغ
o��P۶��q�-�Ә���"�68�Be	؂#�*ʰާ�cg��rF(�X��%Č=��遶��4�v�b�*94�t� ��>k�C�n­Xb��S�c��en�%�Z�Z��w�����m%h}w��W�q�����-����6��xG�);��]�LQ��M亱���A� �D�����{.�>l,�v�v ��y����?T�t���t�^���b�C�M6���:��x��}xG�^S�P��jRbQ)1Ḓ\��d�:��I%����3,d�{|a];����Iz:/��n�g����םU�����F��x>�\�<ގ��^���<�U�U�]��#:T8�	]r����e*N�7n0T�gq���\�3�"�1.���ͣ�{�Ł]3�u���ժ��6t��:�(3�\v��ּ
�D�	�|k�!�C�P	@	�!q��B����x���~�_O#F��ڌ��մ��jg�1�j]HiV�A[�~��j�=9/[3Mţ��*��\4�����LM{��ES���a��_�Y�z��:*[������b�����K��C4����8�̔U�Ҙ��(�v	I�۔3Y˜��Vr%M?���P�����ڄ���-���	�E���n��͙�׎����^q�����Np+~T�\%N9Lُ�T|���S��
�4��|�h�f�O+ O�
���S��.�ܻ�P����Uk��]��騸��dž)ZU$;sjZ
�����6��7͡�]=�g�Nɖ�l�w��r�=���A�m9RF��eM��E���&h��-sc�G@��^*R���1��T���\d�D+܅��C�A�?�ͫ�E�bL�M?�4�\�S��e�d�Yao3B%LJJ��+i%�X���4�����=Ϊp+0���=4�{e�qG�'^����5����?�$@Z�y��߶�3��\#?�@\�G��0��
���[�BEY��?Ô`k��T�`��7�I�JAm�
�c�D,�ؿ���Y��{��c5�����}?�����ٿ��C�ߦ8­•E�7|;��t�f5�(���*U&�R$Ϯ_�"��^"�[�Y����&V(;����a��jԲ��ziW��vճ����{۸:}OK�r�Z�:�k��ݙ�.���3b_��� N��U�'|���V�M�5�0�Ʃ�t�a��S�&�3E$<h�űa��Q�c�0V��1�(=�ڝ[2X� F<x�Qd	��v�Nd@L؁��z����-��p�65ų'9�h��n8q��4���a$��{"<Q	���������q����p�kZ��Ea�r?'m���hZj�5P�\L'D�%�}���!86.�23��5�p�`�G;�-80:fe�X�)H�Fb�Dp�룂K��@i�y3��)ނ��8ִ5()sЎXѹ/��~��9f3*(}Uic�|\^\��hx�w�)��{}$�ws*��.�ư��Б|�	��x�a�83�3�����h��Þ�ԣ&l F���0VWU���pU�Bʶ�iRݠ<2�O>(��b�1�%
%�G��7��c#TL
��B����0R
�Ho`�B#��ʐ#�	��`�����#"
��KJ@�S^\��0n��ؒ礖57E��.�W�L��z�E�r��f1Њ�,�I�9P�.`��3��7~=�ے�F�ʴ�r���fr:���N��M��
�\��5���@����
�}�b��-�uŊY��Zգ̳�V���_L���<uo-xz
��ػ�۠� oW��oA��t�V@�+���L0��zQ�c�[b�����a� ��ظ��m'�_�_^���ޜ���+nvI�"#4G��!���>���P|3Fj���[U`��hUG��,��(+�@H�8�P�������+���UGv(~A�j�`��z��UD��Û�w�(��E��b21�xQc���WV�h[��4m�t�i��0%)hb�x�UG��]�����g�r�N:�T~g��h�=��W%m#9[�7�^�Vq3YB�����I��@[�t��J�w�|Hͷ$"iQk�Z�7h��N�8S�m�����5,QjE�Q����4���I	c���f;��_�oը6�8�e����)|@g��<݉pf�Ç�&[�=�.�l�����yX ;���th�J�Ow$�ɇ��G�#?�T��)s<��`J�w�K��.@�S�
?�$�Y�&�')�9��U�.��@Nmlz�`����q<�wup%�Zv
�bX��tki080��Ӏ鎭�S/J��{�8?H�G�=�0����͵���Ҙ���}r�ۑ�M�cm�V���ec�����Wgٲq���6aL�<��0���Z�1��BsH��8�����l5g��T�yM�u��!c����U��jM�I�7&���.}3BU��&SJe���*�bW*n��䮷1?���<*�"Ϋ��y]�)��
m��5d6���h_bIa��6(�Q{t"��h��k��嫼P�׏���iTH}�/����c�������d�Bn�m/8<@��r��O�'�7����&?��l�;]j�λ‘w[�<	c�OF�"�Lh</_0%���*U��
TUP��q�!����8�(,},�OԘ��Q���`3�eT��a�G��@?}��1L'���SoS���"���{����n�|y(�t����9�w$Ȓ�-�\C"�Һd�Ȇ7Ɍ��	1��,Vr�7����Co8	A����'��*�.��"Iu�����g�M�T��2��t}���Q�V��k�����x��g��na�k��M��xy0̹��?��ߧύ�'
����i��Љ��>�z���S������o�}ڮ��y������#�x�t�(�͹�~�F4	�]�nJ�`�%��O���O��"�V'��=��2�3Ԇ���ލ�!/#���2�����-�War�����ȸ5]6�*���
G�W|G��3�!��f���t��"�^\U���� |���ln;���>�"�޳��;�5��is����t0;	bZ7�~���i����qG�*}I�٘��B�Z������	Ԛ�-j*�(��*i�*Db��m�$��e�Q���ƍ��Z�ӽ6�9�f��BkU�"^Іi�=��H�R��"=\<�\Cy�̓N���,����l��g�`�u�2���e'�k���݅£��a|����{�����d}ЍD��'t�h��M��u������ԺD�,��#
�>e����w��n.�L]�~�u��&�_���~�O�q���[H0JU�__Qυ
9Ђ�,Ss��J+��:eu���Y��u�j�-Xe�r;�n�v�xs��� ��Y�����S�(���u��~�"xu=0����(�	��?SG�_�߼����L�eXV|LjS�?������-!�{�Y�aAH}8t�.L?�w�V�5��H�tr�օ���&�u�"W�D/�t�[�y.�r}�U��k�j�׃���d��|b�o�
_%h*�z��X�T4݀.˶���˦��ݫ��w�M灛�GW�6_��*��b:1�[{h�o�y�.l8��Y��d��x!������z��2(,�i�d���v�;��'�z�i���W��/����
>7��9#}��r�R;��̵`��8���V�6O���#��PKEePQ��zv�$pip/_internal/cli/command_context.py�S�j�0}�W�P����meT������������6�:i�7��9��)��D

{�����J�NN݂B(���!فH�
O#wnf�g�]����L	��J3^��.�غ���uI�ϳ�y���y���c�M5�]��a�Z�O����>��n'I�'��H<
��U�
=�U>B(�,
On\�����“�oH�P�B����4!^	<;�m�Xy0ƞ�o�q$�OeU���ܐ�-��16B�S�9Fn�<R^BՃ��0t
�Rg�|����Z� �M�����v�Z�V�I��_��<vA�j<m�3W�{\�m3{��P�G�B�KA
�Խ���Mp$�u%(�Rb�t�U�O�PKEePQҦ	x�8
pip/_internal/cli/main.py}VaO�6��_�Ud�ݠ��D��=T�!t��P�M&��׎lg���o�d�Е@�3�f���8y��9��n/�0hUˠ�d��V�Pfy�g��QU�FGU%�f�.��V����eӾ���t|�:e���y�>KЃ�
����Z�R���v3h�	�����F*S
�yr�[|�ฑ�y�/��C�H�����N��s��+�{�zJ%�ߵ-�~g�˟��U���.�����^���7��3�_D}�p�|X��1e�����.�����WT��Ty�eى��
cá��'�$�(�$�O⫏��aK(/dԖ�0�����=��G��?r�_zx������˭�N�0�l;�:��?��B<��{i:�{,��o䃃�"ך����âm�A��".kɇ�FM�8�R��e+eV��5�����8\d�x�I�{��k�$(��ZHΦa��gg,�a?�R�32g>�x�]Ս�����)^�n�]�A''�9�)�8���
EjЀ�[�2K��Or
l�{;�F�{-�5$]�����N:5���j�UR�~�B$���\��'cw	�&���b!)��IK���>3�#ǥ�n�b��1�gYs�8�yzyHeJm���"��
gǞk���YY�\M�G��=?ȭU
K�2
�Bz�I��Q�������g,�c��}���+��gj~�w$�3g�RKO��	V���,���߇�����闢��'�[���ͨ���y���"��82�|�om�T�x�X%zV��Y�Ŵ�;b	n�B�rA�n8C���VL(�7�Uj�~�����S����)�I��&.��~$&hp<fj�
�I�L�ŭ5�H�!��b�<|p����8!b��/���ɛq��@�Ç��l����U.F���c~��������c׋4�}�x�S*}k]M�U�+)��pރڎy֛�JS�WS֯�H�":�K�ps	�y�Ƨ�-�ʝS��_���?��K�����=�/QL�4�6bE3��D
��GQ�x��`0;�1���+~�X��ɓk�e
�q��N�S�jO�_��h�BZ���e���f)NO_Q5�=�uD:H��H�|��꩝�=kkz�SuDuq�H����E:\����ugl��n��p�8�z�R�S�Q���/�Q
l|]�j5?�L�,��TG��33f��*6ٿPKEePQ��!�[ pip/_internal/cli/main_parser.py�Vm��6��_18۩״�RXz��M���5�ˇ�5Fg�ԓ-#ɹ[.��;�-��mB
�I�W���h�0�
4ok��	V"��R�ڨ�4$�V���Z`n�[�Ҩ�0��7�T��+}�ApP���wY�[��e"+�Q�l*�N����
�~};�x��3���;��U�&�;X/�~��{#U�*���i�nz�h�/M
5�B��
/:�J.����JIu΢7\���6��Qi�4�nn���ct�ӇO����ݟ����.�� Tg���\����u�	L��&��`B\�>,2��E�0	S��&�ɦ�<׍�!��'�yuG�Dl�9ڱN����t��T�H��ݥ7�b�(��)�Gwb��׬�h�?�w����+؏4̣t�gUU���AH�o�и�8xv��싓�U��F-�
ˈ6+�x����Zt�煋_��.�,���kv#p ������Z���i6�������*����;�J��VI����Y��p,^Q+�w�B8���*w[����2����Ȃp��{�t�hsתǙ��n�B�i�o��/,�*ԥ�.����ֈ������w��/O�8���d�{ڨ�S�
�fB�Ĩ8I&k�ڧ���5�2n��Z�|�*;�z��+y/���
��g�к���-ON;�Ά=��ka70�vN���zn��_IC>GU*���
¦o��:�v\{�8�		��8M�rÉ��m�<�`�A*;Z��U��>�#�"B 
�lԢ�7�5T_$hK��loP����(���SJ���f��m�����ZJ���[��[;"O�2Las�*����t�@���w�v�{�6�q�=�('���N,��?Ӧ���{ET��S&yօ_5�:�E�]�R�nfѼ�/_�?7���"�����n�YܛЋ���.�_�A�@����
L����F9��%݂S�����aa7��2��'<�m�3`N��Q�qt��Z���1�5�v��o��B��N�i��';�
5G�e��F԰�
�Q�� k�ڣ�My(�	��/�8�
���&��C�m�����[��IY��:����m�:�6�3�e��4��PKEePQI��%pip/_internal/cli/parser.py�Z�o�6�pp��:���b\���G��b�Xt{8d��h�YH*�/�~3|H��<�3��-��y�oF].�����j.�R��$��].���	�m��FԵ8�fKJ�߳F�]]�kF$ۋ[V
�VpX�
�x�ӝd9����T\Q$u�5�ز�bu��֊-)��(왢 |�
�	�V��4+����=��v,�� ���VG�jv�����Aw��*ǿ����BԎ���yq˚J�\�`�Y �*�	23��:/k�+Mu��RTL��_?���ſ>�|��2{P4��$5�p�ކW��R
9G�
�j�&�Ж���6��ԍ�[�{E��W�,-����b�(k��,���_X�~rO5�J���M>��h9[/|��ސOs&_�h�2y-��v�\���o�s�|x|�7\E�X�Y���*�绛~s����l��F��Ni�QZ�m>z�z�S��Mp��N��&zZ��e��wR-<��
t����Fn��K	�f��M�x�wfmb�4�|}EN�_�CO�8F1����ub�Nه��X�l���Iw&0��7�����^�'�o�?%fA���%��h{���党�COa7�S��Dl|�r�Td�4��T��ɬ���m^�fx<�Df��
�|�V���5I��
�vzj�K�1='��_��츙���۝�s"�6�˫�}����/�Y
�rڶ����^�l���Bb��1��5�Ie�'r6C�7PRtz�͝�ɥ�
S�-�;���������|�O ~ue�R�� �X��Q�cY���$���
7���ٹ�������$�S�IJ�7��G�'�[�Ln��2w���H��oS���+"��iء���5��KĄ���\Bx9&B�zB� A��g/�+��$ߚ�H|M�@��H&׸�l���l�->M��+��+�l�.�i���=���IT4jFo��5��FKQ�42�O���c��ᩂ-͵��H�#{ʛd����5�QQo1�5�J�-����
|��N,�D�g�ʉ%���{��ItD �<�v��,�d/�s�5��Ѹ�ji��.������OV�
��u�'H>�r��8�{�^r�����Q�vs�?�>�FR���Y��9�?^��v�Գ�������2ұe5�r��v�?�
	Ф)��6p:Wm͵���q6X~k�6u�$���>7�wlC�Z�����Ⱦ8	h{�v�pf�M��M�;��R&���� ���1)H0��Z�L���_�z.C�����
RJVjH��2L!(B$��`���ǐ?HY6�k�	�El�`S^X�<i&��?�$�g��S����=�$�S0pF#�n��ZG�WwO��͏�,$/b������dˡU�<,���ohU�w�C�^��^��"L{3�2��GSPcۧo�ha��׎��nT����:����|�wFa8�u�W�xp��qjE� E@���!�1�8��9N9
�E#��!���{v�<�PM��4	�xLr��r��4�Pb�H�+o\82q��ᵫ����R4�3B�L��5����h�wP�]4n��$��JԦ���-��劘���ݬp&�D��T@t��ҳ3mi�4��N�hu61��
;�@u�-���5��m;��Cy�+Y���������=�-��.�@�4{DYv��+Ru�N��!&^z��� �#�6Թ�V�BVī"�Vp�j�'��L�R�+��٬k5�c��mj��2H^1{5V��״W�0i
�^��	�,r`�r��RV��n�o�:�r�.�G�kh�MN0���%��!���7i�F��r��?!|ۘB�o���P�(�Xae�����n�NV��'.�� �_T���u���X|
#�r5K.�q��M� ��M��Y&rL:�I:|����Y6ւ�85�T/�1/ݯ+ߓA���o�jȋ��-��p�_G�usF�)����SA��'2�9���+A\>���b��b�٤u:b�����۾Vy
]���;��P���4V��n�kt7���dLQ�8����c�)�L�
�Wk�7���&w���5���r�<�Z�/���3M�t�p��p���}:@7��ZGG��h��Q�N����r�$$��	 �"��Uu-����L1�9BD���ގ ���l1���;^F�1-`�ߣ@*px��Ϸ9lhNmN��XC.����C��N=�F��D H�_��^"�+�H"�''�6m�3�p���5MZIVh�1��_D��]���&���?Ν��4���j�P��i�^�Ao��~T�%��(n�4~"y�2��&~�'��Ҟ���z�Y:�,�LE�*��.�O/�;.mՌ0W��2x�hH8r��J�kZ���������Sa_3cak��ã"y�'�[�-�s�F��N����
+��-�R�N��<��pc�������7���xlDǶ��*�L���QI�Q��엁ɮ��-�]���z�lsoȆ9��+�A����`*7}��P��Q�Sk�	d�"xa!����f=��
u�np�����m���P�|��
�8d��:d�~:ġ1'!o���AP;c����3�e\�.�j�����r���mGo��d��ǣ���T�_��ҿ�;�ާ3�4���{
���,�5PO'�����¤�!dZ���
�f�o��t�??�򿀽��f*T_C���0�nx(u��Y����ʺZ�Rwf�O	3��g���y�k��;�Ϲ�ȓ�p��6���������o��#V�Bƛ�l��i|�^#e�1��|\��)�}�X���ٯusw��:�#�(��>�9)n�=���þM_ӧ��~TK��ܶ��g�|d91�=��6G���Ps�{G�^5b�8���p�A��I���d�׻�H�ٞ��t{&��!�����S��PKEePQd-�,0�#"pip/_internal/cli/progress_bars.py�Z�o�F�]�BA1Uh'A�Ԁ�Ik����A�3���6��,wiI-���7��C��G�W�Drgv�2�R-�d2�LU�Ʉ�e�J�Ry'�T�`�oH#J�T��
�уk9�y�.~��|;f���*3��ɂ�i&ʱ_:pt�,�ɝ�SUb-�;��T�RhOy���W2�d>?�e�	mo]�I)�"7<�^��y.j~W�-%��+#3'jYpֿ����_�/��|��� $R��{�R'�h��%7-�	̦h��ˇ�&�?�<�i�������0��ɀ�c�v9��1�^&f�~���ܴ�-Q�*����L��=��(�-e�J��c�R�R��̓�Ji뫍6b���2�
]X�N<�D���_@ω�e��R�b0���D�L$f=I2���(*E:f3�eS��F��=�_������أз}*�DYOɄܘ�a�d&�l��V�h�^��J�T���Պ�p��#���÷�Ǹ!rP<�2��҆A�j)��D+�Jhb��‚_����*-�	;�:��`�����j6vjӧ���$�}�2���6ْ8Jk9��ɂ�<�j�m�aa���+inm�dz��hў��Z�\	�ea6��
)i�c#�fB�E� �A��mA�9e�|�ǩXp-4x]�D�Qߖ�8uҷɃR
2/��>�����U0����KDs�$g�3V���m�p���SDy�{f3�')�v$w�vw�ddFV&魙2N�dmՑN�-�J�F�(���Q�(r��B���ʗv���^g�2-vV4�4L^�JxΞ�f~�ut#���]��
���\C/5��>#�C����
�	�D�Q��}��ϥ^�"�@Jn����݊�T�؇=b�8oɤX�V!��3�SM���YE�2,����D��t�,=��`�����*5lF��vN[��r)3^֖��������6�9ౠXF���M+�G�w0>r0{?;D��h��g��$f�/���q�.�KS�cSDzϞ�g)��s|�lG�|Ae�Ȅ�Ƒ>�����TVy�X���	�Q���f8ytg�:��2Y���b�Xp�LE�7�(o	��.~�@���9e�NU^��w�i*�F��6�#��7!O�|Ƣ̳R�tS#AE
�F�9]ǵ��(�i�f2���C^�Q>�]ѯ����R�F�ܸ^��vtm�����&�}�/BDI]��HNB�g�m�{laL�O����jJ]�Q�AL�G�M�9�H�B={���&SUp��nT�m�Fq�}��PU6*�ǁҽ��o�*`7�4�
.���pG����S�qXlZ<l��	"���w*�T���[����e�l`s�S-~�-Tc��]����)u���|�!� �d���E!�q��<�7cb���$�#F�B�j$H��`pM`#R����-T�7Qq�-m+$@t�#��a�u�..[�l�Tr�"�~��u��ݰ*�K:�O:6�gמq��/_�����y��<6.C�mx����љ����2<�j#����}��E��9�Y�`G����J��1���k����mD
؝h��XTK�A":ٻU[�sꈺ�|*fd	dy@hk�/�{�m�`.o�#�l��E��~K��h����-��d4�R�?W�!7h�h�N`�"Ef�/.��f�"��˥�(�s���j6�k��>��y�޿�C:���-`�͆��t}9n����?~���w��[��v/�
�������c���T�?Q�z�+
_�Ֆ؉��Fa٨C�u���=ix�e�M-�6>����̦6@h�Dz�A�Ex&�����$�z7}b�.ė�~���)���D���4ǻ������);���篖VC�R�1;���#=�\��8����7���S��c'�(OL��V�VsK�>,�9����\S.��[�7R Y�;��O�����DaMr�m6PgŖF��zs�ﳣY�o��G�j>��#��ݦS�!5�֑�?W�HcO�9�=�s�ߔ����`Z-��LR�h��pLE5�8Bi\����]^]0:!�-~vP��I�/fWʟb�qb7�`�W<�(�y���ۃJ7���l'�
u��ti5�k�G��^-f�y	���[(��MMu��g�U	?u�퐸yڣ�;Qr
G���W�Bi�8�u�H�۳"�:z�\U�mؑ�1X���\1�кP�=��I�[ɟo�A��0
��{{5��5M{��r�v��*�����Ip�ɭ���e��2tpf?C-�H[�7/UZe�=)��㺒LU�;ܵ�K���g��M�a�z� ��'�z��\��g����iF8}�4��g�j�3K�QZ=��F3a��Ls٧>���q�6����4����2���Ȇ�#��H�Gί�z�U���P��pP� e�z#�l7�ԅw��gB�H���m.Ci��Iyڤ�2�n������i�"͚K�e�[M�aӱ�A�O�=8|JM|�񲯆��&pl�M��4��!>_(�'���zvX�"�{���xh�׿��k�|^��/��V�J����_�\�C:m_S�Vn踔è�x�g�~s'X֕7D7��7ֶ	m�G�|�I�qᄑlNh����Mk�0�%�j�<��<x�^T]w�;w]�&W���WP�+�k�$�d^�^*���w�}nl��,�Д�_�������4��.��lPw��x7�w�C�[���q�/��)ۻ~���m�����	�⾳qOv��e�����w�D鵮W8%>K�>�o�;Yr
���tJ�4�B�
w������(�)�,A���}��7#��<��PKEePQ�ַ; pip/_internal/cli/req_command.py�[m��6��_A8l^�W�-n�5�u�E�t/ٶ�@�%�fWURڍ������('���,֢8Cr8����tz��&c�$͞�~8dUA6��$/3))��RК�^�kV��R2^%��;��*��$9�-)�Ŧ�HZg"k�}!�+�cIR�fRQZ�jG
~_�<+�r��َ~Ǫ�
�gu�a%k�Ч�5��*��<2��#a����NB�C��YEőາ�$�����-̲h�3*��6y2�N����W���e��l?�m[�
祴������fu�������$/��
^7 99�1A��F2��l���
T���Q]�֗��U�@?�TO�G���%���V>kYY\2��c�P�`2eIA6�r{����8NW�MK�z�q��1b�(Z�DR��HkA�n%ol3,bK�2�
���=��S>Ci��c[*����ٙG���Lŝ�Tke#��5��e�h�\�7�Q�
�\�F�(Q�����O�W��)XU�mJ���.�4F^�$-��Nk�#~�這,'��)�ެ�����{̣��My����{��:�N��;*P�m�I�0P���`N���[Э�؆�X#,��o�ߦ��?��z������H���
�ky���-��{��:.�fd�$?*���%�i�N:��9��)-/�e��1�&;ڤ���w�{��U���M���J?zZ�1���lݣ��o�H^�(���3��_ݍ��uA�~n�
����2�|s�a���L&�)`1+�2��6O�*;�4�n�Wi�Y5���\o:z$��T�Zr@����º`�F�
�uj�i�H>ݒ�š4��-��R�B�s2_����W���l�摹/�b�8���^$v d��X�~��{��o�Zt��f���<EڊR����q���k#SKp#�U��M{�����M+0J)�5�[�F!8�V�VRqV~�
�̘��FD;/X໎; �6��5���%�V\�e�$�e���
���ѐ̍t(�E@����S8�$�1ؙ���L{8(��<���pDo4``F�o����"�+܃�@�	;P�2�p#\�{{"�WZ�tU�gm�8�G��T��������=U�8� ���۞�C�3�7�L�l�6�]B˵K�����0vV+遪��Ct�T621[b�͚��q�چ�*�>=j�����*h���:5詆��Ⱦijy��Ɏ5�v����d����	���䛯��5�e�-�
2��Hє82�t촢'�@!�H+ �_!�%i؁B���ƕ������=���Y��b�r���.s�
&�����HjU�eHN���C��Y5L�l�"�62e�h��Y��`�k�#'���I��a:�� ʕ��9h��v
Z�#��Ҋ�s֞:����������?��6-6W�Y+���`������=¾�]#��y��8L ؃m�,K�JLJ�7��]�ȸF�el$��|�h���P��;`뾎)���Vl�x�e�3xp���_�6T0���p�Yƻ�����~I��q��a�����,�*�"*k<�B�_�J49F|�bT�Q��v;�48i"�+4��ok��8tR�Fb�x�"?,����Z�6��&�y�`�� TB��#aӫ�T���‚���̏�̯�p��+]I1S��E�n���'bþ��E��Z*��bI]p3x�}v��j���DЭ�?�G�evK!.tLȪ
W�XA�:&�)�3}3��<��ʬi(R��|���i����G�a��wOg-�.����
�����2V�D��U������F=�=�c"��W�>Lu.���4ތJ ^��K�Y}�a��~���:�Y����z�޼�^���Bqjɳ��^\��W?/#/����/�_���/ҋ��ױN��H����	�.#�K�Um=�r�1g"�)�����.!2�����!��ċ;Y�Y�PZ�/��;��0�5l�0Yup�ډ���험���C��7X�����˚M"U�Q����u�s/0���3�(�x��6�T�+�aJ��gߨ����
�=��U���أ�x�O1�W��@\g]��םC��4��#2�lK��*��V�{LH�o�u��5�dM��
��Gm����+D���"ǩ}R���y�{�P�s��Y��W�J�`��@:�|���f�Z�F�F�����|����1��{|{S^U����Ŕ�W4�G�I�=?)��L�B}AL��R�����[��p�+"�Y�%��T�E�TeP����W`��s�<�X:��7�@�q��z���q��EQ}��鈂��L'E�I%k�2F��t��
�Ϥ׽���ru��)]�$J�bG'��/]�ǐY�@�kT9ծ0c��=��򀁻��`�;#��unB��_2�db�
��G�@�R�ځkتr�>��}���A�㵊�c$)r�Ѯ�<���-��n}6-#3e��*]r���=g~+��s�݌�]�Q��m��@�d�iW��C���V���'!N�t;j�.f����5��H�QOơ2¢��Zt�+������3��qT[��m�,
plWq�?s�E�Սh��(�Hs��<J	��#�4>�(e[��-��펫i�� �cr{<�Uy�F��
���W�f\�CQ�؝���uX��+}�s�\tbT�$�������3��ן�yeY��7ಹ�����B&���!��!0�����	/䔼;PƣGU�/Z�yUƪ;n�KL���B�;������1ՙ���@�x�٥�ђ{�B
�_]f�:��kj�`jJE����W�R�d�%�/���3e3Lͬ����-�T��w��ď�
˒m�W��m�!B�� ��X�]9t9�C��c��}ر���~Ð����/��T���w�:��7���!3�m7{�����0$�\�yHPf�<�j'W�m&�3��<��!��#�^�]��j�1�э��GT��Z�J?P�?Y�?K��Ÿ��R���'��"<e��ku���]B��x�c���q"���a��s� �$Ƨb5�ᵦ��~��x��3�V��h��������C;�N������yjv��;x�/�wnzW7����$�KzC��G3�:�t�P9D;�U�.��ѕ���sQiO��I}�m�R�~�y<$j�
Dm
���}�qx������-ҫ�ƙC���]O�u(\=�Q�C��E��"��E��c��Y��Y؋��%�����P�RX�ȫo��$^�?|�@P����g�5$�ЏŽ?���|f��!�!ffH>���B����̣O����<��hu��!��X�	�P�ڃlϦ�I��mD�WZI���6:G��ϮJ����SwHf���s}Z����
�a�VF�
q��_�5j������F�.H֐�fx{�Tz⇨�w52��q�m�ų�)����,���}1K@��lD���q��/�+�Ռ��g����}F�� I����V�n����A9=�É�,��i��$�U�=���B����M<�Dq%�犵�l�w��%w}y�+�Ǣ�G�ɺ���ۥ�G���[}��P�&��f"ߧ2�5[�T��꺖��$�=��^�O���\�yp��5���o�'J���bp4���X�2R��KF�N��?��*��J��K�Fy<���E����x
-�Z� x-�T��op&�n@��2��:���+�B87]@���{
���$=�LiJ��ޠP ��K}�J]&SQw\�w�nm�d-����t��
~��m��YaP��U�Q��MB]�t�>l^F8b����+p@[��f�nX���߭k���4�����rh�Ƭ���d(�U�w�+���ɟ�PKEePQ��e���pip/_internal/cli/spinners.py�Xk����_A8����&i�`�Y��L�F6�b'�A�
Z�mv(R!�q�����R�%ˏd�A���"/�܇V�,MW���HS&��X��Uy�����'�уA�Ȍ��'��Y�^Xo�r͂2������;^b0X��R�I�$tnlRZ��¹F�W�/nӗo��߽���Ww�{TB
��J*/�K2S��7�/��ϓG���ȅ�ܓ�g�]�9��w��.}����雷��|�ܴ:�|=`�\9��{c'l~7�V²�ƃ	�z�Fi�y���Lq��|��sRp�312��̏kY�X1��j���R@\�јM_���b�e�tK~^�Jp��o�5v�
ϕ��m�	�p�:8�r�d8o�SL�-�3/�D4s�7�cg�[�>M�V"�����
ɞW�ن[w3��{���p�W��z���2�J�&�sV�9��͜@���蘖�8>[�M^��9&s7ϓ�?�������Б�V�p�4�,I�e��k�/W�Z&]8w}�`ع!&���=�q��K�(Y�A�������G�)fD_r�Ġ�__�.Z�IVF�͍��H�dkqb4dC��c�G=�}�$Iذ��V�~���POk�uP�g�#�a��|�9k9��� mm���+c�ر%�]�3J�0��M$��	#�(Ŷ܈V8"5O���!�rF	{�8B+��5_s��lh�*��%9��󾏇ȵ�3X�7�EfK�n��`�-׏�)N����Fw�����%*��P+U!�������	��{�K���{?D�(��K�FJO��F㋧��/7=�j����3��܁�X~���y��:��[[!�>`oށ$�W��o�&p��ʶ�0���R��40�w�	>K��A �R��8Дf��S?D%�����ێ}����G腫y��Ƚ/CF@�?
QN�"ɤ2��cJ>
(��jM_�R�ϱ����YM��ˊx3
�s)Jq5-�{��?��:���}J�����7V�3e�<^{m��FC��E#2�@���
���Ӑ�`"�ʌ��k��N��W�(U�>'|�*�4T�៞��f��}n%�K���wW��^
��~��2h �h<��LU���GM|�B��g.�</���#)uP�� ���:B.F���~K�S�	3cB�:�ȅ�{D1=֢�5�%G�7�lwWY�⯇�)WtU�ގ�I�Yp
�	4�СhS��莢�����"}'�ȓ�
�W.-���V;`(Cgh���=�Z,�l���7��lF�xMز�OT�b!�U"����|���$r��H�{�*��A.]��xT��
}/jY{��B.���,z���K::CZa8�j�w��G�@g5��#���\W6��Z0e����8D#a��<nW+�zM`�o�OִA�h}sj�m.���>�����ax�kO�72�̔f�u��[S{�|'f�(���L��}-vK�m$۪�G�%1�3��I�:��(}費
x�<A�N�8����
,z���>��~�FJ
�E>�Q3[�o@YN��gU��@ab�6He�<���q�� !�ٓ�XU��'�ހ���.u���W�pq���ؖ��E�TE�gź�AA^�F1�Mº=L#�8���-|<�bAD�*�?�X�k��鏕����ޗ�z6[c���(f��R�3�\%��ӿ|�y���}�i`�C��gP�:�0d:�H�3dj�9dT����ȳ�5s<�PKEePQ۬w�}�!pip/_internal/cli/status_codes.py=�A
�0E�s�A[�.j1Xg$���Ђ`�������7�4+����G���)u|ҫ�Q~�s���^m�8Gn�-0��n(�@�.p7���H�z9Z�:-���A��n�v�$�.�'�עi�PKEePQG5�"pip/_internal/commands/__init__.py�Wmo�6��_A�d�2l��Ȁ.]�`k��"Z�,"��T<���9�r�Z��h���s�X$w�x�[�
��Z�-�J�V��j�K�,p.y�~���RfG��*�c�6�*�F�N4�I��c�4��F�.5s�ػ��4�v�Ji9�:�۷�</Ee�n��"����}�A��3�6����{W}A\��:B!����Z;��ˋ��tu�����im/��W�~�5�ղ�Y�{+,��N*P�83�V���l+\^(cE�pW�t܄k��s�'��gi�{�G/t!����M�U�'^��y:�$Ug��Ry�dC��X�z'��?I�~�Y`,�Q�%��+��|%�f�7�t}�D�g9<$:�U�;�l�;�o#���w���?\�������۷?By5�}�0��ԩ��z�L�*,��6֌a6�\��I��խ���_�#J�fic�^���^�Bqks:�f�ǹn����5d��E<w���xl�S��RY�f�IP�~[�z�a���Y�C�y��B�.>�dL�k;Q�?)~�g�o�ׅ�Ks�2�!h#|LR�4���MXG�HRtli[Q�JȢ=E�&x���Ij���0�A�3��n���4;�6ȫ��#+�58���h�`M�ܔ�G8$q/��;J?o�U4܍��_M��#-��W�(�T-�����ƅ\�IvDl
m8o���vF��RY�{K�;�����,��q3J���e*5ܧbgIKO�_:���-�
�Ȟ��y#7��f��Z��v��2�<U��/}�3�g�Z`̘~�̀8�>���K�
��Ռ�w�k{�<�x��o��,Ѫ�5|��CS�ʧ�<)U�P�=�X7Z��Tݑ'}��n�N�E�@O1�:F�FW<�
g`J�i1�7$t�����2(�V���D3��茮�dx���-<����7\ӌ��-���Uf��DЌ'Qf��d_\�{���'��������ٜ�bSzM�c��8t�M��@Tj�&��زŧX<�T,S�;-fl�}/1P�c6�{�w�4?6K���~�<�k|gp`EG0:�8�=.���+�4�
��'�����f���:�0ha�(}���f����}r��L�+Z���L�~<*ϼE[�q.r��O��B�'��E&�zX1�¿.��
�(��J����c�2L�gg�;�m�*�ʃ��rv�9y�ο;�>���ﵗ�(*�xVPp�`4���V��Jz����1,M��{�>�Xq�����*��H��sDIy�v��z���Ńc�����7���U����x��V�
z�Y�HŻ�%Ah��3��v�9/^�����߁�;��9@x!ᵒ�y+�eD��E�b�L|�=��]��<��b.�<\~B��"��Q
o�PKEePQ��t#�,pip/_internal/commands/cache.py�Xmo�6��_Ax($u��K�"˺b�$�"dZ�m�2���]���_$�/m��C
$��{��wG�e�"Y6ot#Y���+�	���l4��ٙ[/�ł�������HZ��5�ӌͤ�e�h^�t�K��J���togs��ϑ�<�QŲ�Z��(�e�����T7
�
�<���͟7Cr�����'���Z�J�=5WRVrH�ym���Z��x�?�]��.���=�y;������̏,��|�Ԫ�5��yѲa���kx!�C�+H�&�Ir᳓.�~m��,tyM�,/�R��K漋�wb��P5�uئ�.G�l���$G	�!�mf.?jlWF��rLn�Ն�%�Ը+�M��Q�\Q?�jt��Kptl�5�A��椦�0O�`D�J���lLn�7��I�z����X7r��Ѳ$���
�t�SM5B�t
;�̀�,�jF��Z2��?�L[��F�F�<��2�i bٚ�5�l��n�]���ϓZV��
�uo	�H�ZC�m�H���m��7�`s"+V·�`<BCB�B9L���.D2������'d��-��T2���]�hT���1AE���>��a��>���=B��'�gO�)�#�q����&N�ڼX���}�� *�C��n�{2�	O֠x��+��PΠ�����!S\�`r�QtV�"$=nɠ'[=ςd��+�y��`�
���{�ӧ��?�08���D�'*!�"5�X3��eH�(�N�"�z��O�g���K��WX�����%�l�}�*ae��i+B�m?��β�ǽu�l|��l;Vۘ���OD��΃�x�V}�lOz��}ٙ�@q��}�%���6Go�
�ɛZEIg�s�z|p��cnү�Ѭ���ASg���ٜ�"3=XuЈ�FI�l+��:�ZV�d��'{�������Rۛ������&���(?�+��8�Y�y��d��<�nAl���ƤY�`ށ�o�"/���;jЙ8��a5^��W��Ћ0-}:��_���8*y���U�F��d$���ٗ��(���L�ib�h\��G!�8��.jx�VA�hR�%�j�"��ð���h�]���A��Qi����`���b�<�|�z�9\���8��/5���#Yw$�=$�Ǽ1ehT$�QF�n���dx���N�N��:�I�p6���Ǖϋ�.��� ��3C�a(��=�§�{̊	��sb_�z|���F�����\�6kqd/?y��!9d��W㾅@1�,�0cD��`&����~N��]&�j�N�؞k��2�@�ط��s��h�Va�bn/��h~"�`�1�^��gD��G��7PYl5lAi��U���Ϲ��__]���q��B���mt֘a�[È�O�h7kxY<$?�v�V/�.�q�_�T���t�,;y��E�Q ��8��-k����dmb�g���
�t��[�ŤX��^�8K�0Qa��z��sQck_򼑁���o��iz��|��,�ßN¨�ȫ����
�@��0b��L��(��P$o��U/�������y�٘B��Ά��7�m��>��O{´�_F�H��u�Xۋ�)i�á=m�R�r����O/���䑵��	�lv�\��@@u�ʲ�fPY��N8�Ϣ��,����|�٤�i%�[�׬V�o�P�����䟾%�>�28
�~m�5�X��ˇy���[�PKEePQ>|nU�pip/_internal/commands/check.py�U�k�0�����(ؠ�}.t0B�ƺl��PB0�sv�ڒ'�-��w��K�2�D����Ȫ��A��B�����
jY'�T�e��2�
�i��J��3�~^�X'\c	�C;@�Տ����|qww�k4�I�l��1{�Z�QZ��I�Zt�;6(�穧&V*�,q�Y|.Y�di�J�lH�b$��Ս��p���0�>��/���tu�\~]~f��nc��m{���i̘�π�[Im�i�[i�O�pе���8�<��A��Ja-̽]}���;�g���`4	z�,��3u��NlK�֨v�2�6!$k)K�$�@��j�XSU���1r�9�FE˜C�A������k�:��&����:c�o��R����^�(����I��K�9o���E�>>֑k��f�m+U9P����T�VD�C�&�c&8�`���O��d~���ܶ#pe�>7Ҡ�sx��l҂��8Ɍ�eK�DԻ��9E�b_Ј7������JI�_)��ֽ��P���m�ࠛ�j��Y"����fz��S�E8����
6�����x���i�ē�R���'T�|K]h
R|.���PKEePQQ���	$pip/_internal/commands/completion.py�Vmo�F�ί�"=��h��R�m��ٖ��%"�8ۮ��.�ٖ�{g0o���n�;3��<3;L��
�~�˜���R.!x)�%�o�(��VT��|��<�#V�\�&��$`nȨ���f$Q�;)>ϙ�\�QDDe���L���)�\R&�
a��&��x�>�-�M֕��ŝ?�}:��/og���oj|b{l.��F��Bֲ4�Y���,'�0~�\M����zzs5�����x�<��x&����4My�r/BN3y8�E�Hc��j��Zܬ���,<�c}��G<�Ʊ�d�?���p����g���?�/��/+op��ן�?<xxhYw�V�(}�~����¿���W�M�\�৏"��!�j���k'���A�$8�vc�����
)��z��yj��}�1���הGB�h�8	"p.�B���	��mO0����7�����m��8�sq��M�Y�C������7(���� 
�� �I��A
Xe�a4Q	����3)��:��&��
,�M8�.m��O����}���0j�I�������`���8
sQ���ߤ�(�8��u�A{�5���0��B��\&�l�V��Ǖ�%`�������D��v�{Ww'eN�I��N��)>_H�-�礐�
� �|�h',AX\���;�t�,��0Kr)M7�hS��V�^�qt#�ۓ9l�]v�)�r�/dGC�yE+mK�?�ݚ;ŕgN7���eP6M�Ʋ��2��[��}�voA�}C��
���Ʋ�v��]���2��<�~�#���y�we!�kѪ㪐��`�LJ{�����qV9���Y`O��3鹞�z{M�*���K���֟ܿ�V4~�Z��whq�2�}��*�(�
���~<B�Tڻ��V�2Q�3xF5:��H"���	�q��Z�`���b��#����WM���n��L1mu��
���+�"4��K������Zm&H��-Ȉp�r*I?s�\Ηc�Ks��BB�����P�gf�t�Lib��͐;N�PKEePQ��
?
�$'pip/_internal/commands/configuration.py�ko�8�OEa	���>�z��l6	�f�!�m�*K:RJj��;ÇDJ��b���!�P�CU����n��Q&K��x��X����F[VH�UQ�5eE�G�<��	��<�"%
�B>�B�uR7�R�5����.$�����b��,�m�kXRge���߅��W;Z�F��r��◬H�6pmC�nh���n�j�X�\�M��<R��@�uoO�2���xV�.$�,�i\6u�ԧq�ce������/~��/�?�F���z*xTm
W�C�8��F���hY�U�8��'yC�Z�Wh�W��h�R��̴�E���x��q�h��h�'��*U��k 9�<O\K�dG��&�	Z�./�pk%�'^4ke�|*�LH�O�H��$������_2%9�@K"���l��4Pdh��9�@6�@�
8��c�H �)�D%�����&Kj��Ǭ������P�~&P�jS��{���^J���`}xf.*q�f�i��"�/��(J�-�LNYW�D�L8�5I%���!I�C��F-�,�5N�qT!�l	n�JGH\+D�
���[��q
;�99�)�j�H��'UE %p�R\��r��Q�f�&�����M�+JFcF��dp}���AfJ	
GK��������d���¿~^	�{d9�H[!?��J�=,���d0�Nӧ��#�!���®l��8I�����>��V�1��`H�S�d�3�5�Km�G
����XkZ�!�Գ�s	��,fcKt�&�?Ó�+{�W3{o��\�
�	L	/TG�MD�9x��W��/?�ܑ��	˒5�a�>V�C��4��Qw�킓���\����<�����%��=�	�Ï����#���ȏ�����;\������C��d
~,S��1���yEQ��b
���M�m1]aM!BGHT ��v�Id����5[���J����S�!`?Y�z���<��2�B���5T	)��XF� c
��F�� ���{��D֐�EM�_�R=6�G��>R���ᕩ�K*���1t�u�n%�AI��8�� ���b�<���5�|Ő܉�oy�1��l[�C�C��x���%%M}�o����hݰB��jۙ��-��}�ٻ�"&B���±����!�Xa<�)�"��RM��k��fǾ0�!8�Pd��	�J�u��+u=�������P[�m)Tv�
NHQ6Dm�$�gtM#%����
�.�,�-�^@�t0��[/s,vgJ�~�Сl�:k�uz����<����C�d]	�%e����Q��D��k��DY�V�[��������o�o�{����sy]���ź�\b�j���A��/�H *������Z�EK�/�w�y�6��"��tu�W�Q����x�g
�c�8�RT�4ٲ��:�M��b�R�e�V�'�^M���AU����K�*�aߤ8:���ӈd7�FU�P;}(�щ!�,;���s����?-��(:�A�sZ��:2���S�c�`V�`	�����B��~/��=�����ԅ�1�F����5�vj�WT�F���ʣa���%F2>�	Uu�>{g�á��<�������ls��{o��-�]:�������b���d��%����|@�;se$#�} n��Ϩ7d�.�/��}f���,e4\��l~�&�6G�1���!�7��
ڿM�r��V��IyB�R_�߰��|z�'y�>�=�z����Ȍ�����R�ul��5�U�$%�����^�A[C;\1�Y`pqY˰W>��1^�!g�/Գ=�H���Q���*��HK+(�J�/&f&����T8��΋��V��2�5Ӕ��v_|G��0�d����b�aJv�5T��)���D������{�����2��J�u����i4��]��tz��vd��-�%i�-P�R]��̷I��x@B���Lس���b`�D��9���ؾ�x���p�,M��f�N4��ο��@��c�&COƟ:x���6~zGXd%5���~�ދҗ��"6��=��!_}��N��5�4�NV+���R�\�2.Ы��Jػ(�<M�M����`��nE<�P�6���m�t�%�$y�/�lM�e�	XO�[�t�=>W���S#�EK�g�
�	~�&O��Y��d#���	K�V�VZ�̹�A��	.i
#$�7�Ѧ0�����_h^Q�a�|� %F�qԮ��)X��C���Q��thn3M�(a��3Rز=�X��3�'ح)�׊nP���m�������J.S�==�r��>�ha���Z������Q���aKjJwԊ��o�P�4�m�C��p��M�~#"�QP?��+�z����!�>P�>8�=�D�U����4�sڛ�ۜ&�F��{���
(I#��Vg��]��S���6
�f[�@}:D��梇D*B�q1:b���Vx򣡇�j?���d���Z�����JLa���Wdj~#E�	PKEePQ±�tT	�pip/_internal/commands/debug.py�Y[oܸ~�_�NH&BҾ����.�����b�5Z�̰ֈ*I�� ����"��L�C"��~�x��(�'�nz�+N)�N*C؝�Mo8u_od�>�m��݆W�Ó~�K'��>�j�Am�BP��o��Z���zFUV\���q�_da�
��4.S���F�Dk�jYSV� ��ײC:}���c��J���ڽc��=���0��v�fwԮRfz
k>p_^��痗�Xz#]�Tz�ּ5��q���U��VA���GB��s����Ͽ�����/��\�Ҿ9�|� �g���ѯ_e�7�
��H�'�͊�f�ɚ9�i!�S�����
�'ѕ�Fl{e�b�d��X` �"���K�'��Sڲ=X�X,j�!z'�j�qcE�s�|}e=!�6j���n��=�����),E��y�Z���:[�X`�:{��{ȯ59�*��x�.S�d�����ъd)Y�X�d"5�:Z#��T���'HWK\������eK�(�.*�<28�S�\��B�+���j�ݳ�p��ol~1�� b�Xt
�X�S�_)�|�)��B��<�b5�eގ,Z�*2�XD�o�
�f�+�"-��;������-�eD���rE��NX�Ĭ�S|#����7�M���j�� \Bxu1J��! 7�(����]#L�Hʻ����@>�m@�@vɦ���V��6;=�p�n>GW����c$Y�-�,1e��R�LS�>��;˜E MJ�[�Ŭ�]� �:M�'<��F���
_���b-���:�*��1cX�:���*�k�V�{���#Z�5}�p����h�Dg�l�5a��Y�<��?�	]�H@/����R+�D�o^��J���	�뷬Ą2��r�m#�XE1.�Y%]��9}�&J>��B_�r�]D)���)N�K��Q� 2/��3��O�	 7l�P�xx��������3�F�~���j~׷u��`$�"1ێ[�l�9�r� �g�9� ;���U�������Arh1�1����`VU�o]��E�
�� s��YQ�N�M���@
([�GNj%�A�Zg����1O��?R��]r�'�u3�I��ۣ�d1*e�=�r�ԗ��<���_/�=�J;%3
�W���c��%�#��� ��a�
:>{�ڴ�S3�V��%[�@����dL\��	2��RĊ6x��i�x.�ݩ��&�.���.�v7:�L�Ɵ�|25�OKa�^ǣ�����.�Y6l
�R�Rpg"�ҩ���
g&���ew���@v�B�܋Y�^CYg̏��/��!7F>�H�%�3���׀k��������~Y_�$f�0k����"�=�����N��1cZ&3���km����R�V���c�db�w���F�)0���?�X������Q�O@C�a[��[��Cw�K�zڈ�@@~�v�ע6�<�[��!�@o
��9c�0P�	
ٳ�GK��영�0��G���|u�W.X(�w��Э����zD膩�(�1�^R�SN��^o�g-�pJ	��5�F�V&�r��j�Y���q��q)!�w՟�;�݃�~���n�5��SHz��٘m���{{�8���?���!�=0"�[�����
](����Xg����@%����6���|J�u���ۣ-�g�5y�&D�7��m*��$�O�Q�\�%�Q7�Q��>�L�2�rb{"�m��+��1��yE(�	������/�p+3��S��9������1�\D�PlU
�RЛ���>��Q��w�ۇB�HVg��u�c�Z�Ȟ��	/�.`�d�1V�m���3�3G�
!
��Y�����B�\���bሱ.����[��3�����)�%^�vP�Z�/;�}�1�y
��%?yy6�p�r�`ya��b�d���5o6E|�9xN���k.=)q�E��>v�N��?��t�d��oW������y��zWPa^P[}�+w6����"L��q䑩J(���nj��m�{���&�~%˔�L���P��X��m��I���!�������#�/������zcY�a+7NU0wU6T�XU�ƀ�PT���,D��g��4��������'�O��
Nߞc\8��@I��1��$��g�o|�T��{'<�)N%��K❹_�P~��u$�;���F��ogx�0�*�8$s��oI�?�u���q7��ÑX~9�����%]���8�t���%��$�lN�����黢R�cb�tV����d�����;5g�tp}��5e����?r�O\�PKEePQ�S�6"pip/_internal/commands/download.py�Xmo�6��_Ax(,��}U0 �b]4m�"TZ:Yl(Q%)�ޯߑ�$2���K��=�£)*��E�[	iJX��	�(�[
i�>��u.�[Vo�W�f��hhX��� k�㌳^QV��L��c<r�2}�TS��6{]������i&���y/���LB���(+��t�fh�6�T)Mu�P[�!���^��N���vw-i���0&�т�<��Ռ��b*녡V&9�+RYQ�����D$�h�V7�>�MC��^�{|��dZ�3b�������Sz����w���\���/&�/f?V+F��RA��#�-����)L)�K�\�'U�ཱུkQ�ִ�t\�f��S��+�XsAs��0��Μ�|n�{�`��j��Y���oސ��Х�_��7PK�*c�C��X�@��	��%�_W�J>���%w�3x� $ꯄ�D+3 Tf%�6ˇ!"�+AT��ɝ3�4���3=c���dYi�߱�*Z�jO�h�\����f܎IQ[7���a'��N��*���K��hK�\�ޓ���]�;���x=��q|D�Z�:�Q�r�)?R���� z��ewA3j��r(����G
x�2�|~2$Z��%�5$�i��U�#e��?l-X�*Z.O�q=Uv�2���r�`-�����r��|���M7��r�����L�FB�La%�3�;3Ғ�N�T���
='�b8\PK=QC��<��_?c�P�����,�b���8��	�lx�X���ɻX�O��;mje�
4�Q�<$�+��:�ZiF��\o�h~x�a��%�_���(���e@毠�
`y¶#�E<"<Mv��^ҭm��qv,O���r�n��J�7�e�Y�<El��?�Y�E�ȶ�Ь�sg�g�VM5�n2Z�����=0<�G$[�q�^O9��}/[�tB�4�psl���
���	�G�H���g3Q�yE6-�%��x�<}����pu8��L�ODH���
"��l�-2ypw?�]Y	�f�2�2"�2[n��<��T�����d��ǩ��!w��7��-u�	�2A�û�(��&e��뉮Rӎ��Ӑ���>�m����%I��S��x�ͬ�B��k�6��z0�տ9'�\8�r�_�tt���y����1�Ќ�<m�ƕ�+dx@��y����8�c�'��&�z���	�,�
���Ex��ӂ�9v�5�L>P=C����
$r�O"/d��|B�u^%ι0^�%SE��s�d��ʛ��7�c���;@�[�qK����YԚ}�[,�Ib����v��2(NR�eVA�Y��|��8���C�4��a]�u�G�����'����p�C����VGw�'s
��@
6���~�ϴ����xgO�h�=}�0zb�f&^њ�M��q\��?�D�[O���C��A��~�PKEePQi��"|
 pip/_internal/commands/freeze.py�W[o�6~ׯ <�;[�s��M��]Z4K�"Z:�9S�FRIӢ�}�������l���K�*Bi��F��W�Җ��Q��@�9��{�`��t25�Sʥ-�Hs���k 6�f�U�1�
U[��y�1�24WU�d�Im��1c�m
`:������jN�B>a�R�Y��V+��]��M���V5h�=HK
�� ��D���T3�q[���a7�D�5��N䏏�>��������˗Q��}����ȗU�+�Mm�Ɲ
n��[��;ݻ@�_1�匾����_�T3mz�>0р��W{�F�(�3�\x ژ%�2�^,��mc���;!� 5�l��'����i
	aJ#/�s1
D�Q�DFr̚5ji��w@��.@��i��1��ޅ��k�v���ێ Ԏ"x�*���>ٳ�ϱ 0�P�^����2)�$�(h�31 �����3�,�7r�$�$Ǚb�8Q�:���=�Z�x��#��Մ��f��#�;�Y��dq"]�F���vz_�ewLgq���A�����bo�ػ���rYT@|��a1Q䟅���V�H_y�u�gOJ��sC:��laVOc0*t��h��
L�q�^��x�e�\��x;2�#�����́��]�g�A�U�
A��s!.��`�F|
R�b?."�"T��,$s�
cN!���\��`����P�w\ۆ	�w�6�=3d'Ԗ	4��A(
E��m��z���#=�5����b���P����n�H;O&gv���ɛaJ���R�[�d��|��AO��Ep�E�9��%46����ǣq6k��k�N�ĥn���2�&��)~§\4���mO�bp�e��0}���A�t��c���~���MHm[/�N��N~]M�
0�H?�Vm��Rbzg��X�V~���y��3=�Ѿ�MW-�c��{;�4��аkf�53��ӓh����(�.K2�y�u
t\�|w��[��ͳ	�NM���0$��f���+�K��<�iM������4�F3�ԏ��4C���3WSVߓ���ѳ��)�kS&w3�q.��iJ�1+z�E|�;
w6��:	D�>������;&b�P�E������ٳI|�G�V>,��^ccM��/$�[�Z��]\���PKEePQ�_�#3pip/_internal/commands/hash.py}U�n�8}�WY���g�*Pަh�)��@�-ZIl)R�%i���!uq�&Ճ%�3�3�̌�{�X�7����#�d��ظN�i�㶓�4/�n[��yil�4qeB90�KZIAO��t�sUϷ���s.�q�-:�`g���x},�͇�ns�wBZ={�������]���B����u\���[�xͪΫo� �F 5ڻ�����À��z�������pxsx��6Olo�ODՃ��0c|�҃=��ox',
$C�Yڂ{�2��Q�<I�Jrk��4��M�|����"�q�£�D7�%u�%x���xb�N�M��-��⊜�x5��#�Mt
�
|��@�Y�	�iRk��;~���B�%��?�
��$��n�g�Hhe���%�����4��t�u�n���T�R�l�,�fJ><vaK��l^��V�KZ����3F�X�'���
��Ƃ�X`U�2}�괨���Z]��*�Z��a���7�KW�+eҁ��]	r�r[�9���/��6=w��,1E�U����|MW�cCQT0n⋵F�!��X3���1^E]
2�T`���)���(b|��|��aK.��mJ��]%�8����E��8�T�1���K5��d99�W���eo�B"�s��
�D�x�d�����)�����	��9�����t�B_d??�g�f��I�����B=��:�ܰ���V�K~�!��C&�=��nJ�)�	��l9�q�o�*���a�H��:��hrg^�f=�Q?��A
G���x��1�,O�PKEePQ�+*�pip/_internal/commands/help.pyuSۊ�0}�WY��>��]چ�tKB�ǎZ[Ru�l(���/��!Ջ-͜�3gF�Q
0Vz�
2���8�{�j��(*�<-tƄth$���ٞ[d�j.��]��A���[hd�\�6�k|�Q;����_��5�w���;i!����-V�O���z���E��r���V�:e�,�{�)�47C��=�(��[X�Af2|�=�l6����20�g)u��
����Q|2�C@TRQ�����/(_��x�
,�x�X�˴Uܚ�7�Ĵ릭��%�]�[��n��@����:�>$cr�B�"w)���%�
��57�Ц#�<�9-&�7������@��0�Sc�S/��
�X�5�lH�S�M�$oZ�[��]g��|8"H$�г��&<�_�q��4H�J��=�h��K�r��ԩ)KE]�$�[I�93�]������%�q��ٟ��8��ް�	��uWNU��i�㆟�'�A.ݔ���/4.轜?�$�[���JȄ��A���М|�ڷ�d��p��U��E+�PK�mW���zX7p!pip/_internal/commands/install.py�=k�㶑�W���U�8^��̅�[�'�-���Wj2�P"$�C�2Aά���ۯ�� ����IN��J$�ht7��f��;����������e�R�e��T�~�L=�MS�GYo6E��?�=o��n�o���m���U��|?�gkD�z�}�nճ}������ﯮ�\�}����۫g�;�����1n7i�E�5+.��}�����2î����UV��i��=@Q����2^e�����-��>	6-{��\��#
㾅��ny�f͆���n�j�o�NW�n�U����
�񪽐o��h���Y���@�6k;�rn�|��7s ���>ԓXqy5�e��͜��nYf؄����*s`�h�C�
�4�"��bh��5�Ќƅ�T�X�A��t/�~S����<ցH�6 H�H��ɮ_� Ь�<ky[�4�u��B�@(ޤ�6r\u6�	�����}7c]��_�w.��)�lY"�#��
��ݢg>��B�ל~#AEy�����u�+��Mwu^�))�w_����5b�Ӻk�];6G��G�4�����h�Ñn�=��黿^�5�����7�������yW4m����ӽ�'iU���^fe��=�t�e�����
��2�/�u�X�MK
4�:��9+�M����G�ޝ�k�	�`ξq��h��}y�G���]��k����DO/��1c��B-߯y��Ǻ�u�c&"Zq@��_U�^�e}���(�`���f���1���,J�~����|M�.5Ғ����ĚIf=GN�s9D��ŗc�`/'8�Dv��B#,k���D!Q;�){����������3T�]�q��XQ"Pg`V���L'�j*�!��K$m�5�ܑz`
��$���_��j��mUfBh�Q�,ZUE��dB���L�`BQ���xvu�z�"��u�E	�r����.<�x0��+�}�c�/oQC�z�uMi�f�4or��
�5�@��e�/bY�ڂ��fR�{ ����(�BCČ����&��cNŶXmq��"�R�U�g���45�ˠi]r��
�f	���ZҗN	A4q{�lصr�n��$��]+�/���>��H��&�@�xݭ�ͬ/Ov(.�|�����il�� ��T��/�!@����W/�DW������il�)���ֳ��xBW0�9�?�۾���Q}@����8]��9�!����y>u�L�K+�{��v�5�t�
8�ue� ��7[^��@��k�G�e̦N��W
���B@l���%�/3P�X}Z�����5�D��Fz��b��7M�s\�h�� 8�TX���Eܷ�Ybq��J���=D<~.��
��|D��/Sg��
a%S��80���&�m@)0`u�@�R4
��&�@w�ɐb s��-f�]R��QLU��Q��xuu���w�^��oj�/�G�e�,z˹�W^�:\��:8���7�W��^�a�u���[<�<~Q-�����\�N^�	�5u^�"E��-u#3��E:Z�q)G����<Z0��@�/F�������|�ϙ��<9���,�s�DϸUm�_�@�rD �&ˠ3)�|�H� C0�ģ
�hV����4*J��WA��������(Wڍ�{]��(d���cPu+�
zzl�)�@�k@s���V�UBRZ������b�؁'�r�1J�����N�<,����<��j������r j3�	1"\��
H���{���	+��L��L�F��w��<g/Է��'0!t&(8��(����d
p2h��\�=��k0`��g�
9������h�� �D2��ɸ��Y�3���9H����	���h����ˤL�/��Nj���y�r��3�g�Ya�O�A�eeó�0�<m��f<}�d_K�Vl*�ta�$8g�(k�I�&(ĺ^,��C	Ŕ"�0h���;��+�p�@�[�����
�)H�2p��k�kŬ��3aa8�۽�X��������2P��Jޅr���IY�Z���B�3NO�������9���ڽ�0&�Ū��!��|��$�T&���da�.�]]�^��W	"
�(Esh9nYP�21��27r�199���"_��fr�5�B��b�.������R	*u��j�I7+w'!���ZQ��w��ݟ��?y�fW�L<[b���L� �b�o��/�Hn{��ÏU�f<�+F7�>��R��6[��\Y��/�e��6�������;����n��ۻ��(V�@m\>^�-Ռ�I�G�̛�����1�B���v�ȕ���(�4gj:s������S�{f�A�P��P{ND˵�;���7}�����"�������;���\�A���_�>-iG�vv��4�&\��H5��!a
�5w�,�/�fm�D�!�ѱӨ3pt��
|�>�m���N��VS�YB��/[����X���=Qw*M�o�;��
#����X�p�g���J�{S]�G3�$�s�0�1O��9!�h��#��?M�v�p"�����ofN��I�$MwYQ�i�?L�d:�૎�3�1틺������
�O�tUEno�7�K�S}҂<�2�
�xCYK$U�6u�30WY��5���'fR��N�!<���^��:o,1�C|�d�hF�|�ޓ��\��y�ͫ#�k6�h�m
2��Q5�\�d����,�o����9_v�h�_�~�W�a����J@��S���`G�XY�Ķ��۸׎�Pa�M�bK��m(C�c�	7���A��6E&	i��"貉k���f�?a6-JH0��)��0��ko��lO���F��o4l4PJ��C��u�:1��u�B`�5�{6To[�=yG`H	�P]�e�j#���-�~K,�EFPX�PT( K>�V��x�noWGn�����j#g|K���n�J&��dv���3�1Q~�q���b����>�d���F�O	�91���ш���Oի���l�A�a�d�I�Y����q����'�|�\Z��+ᖨ�:Jb�8�<�L�$��^��7�-�KNZ9B�5�"�j��}K��(Y�X���"=k�xEL=��"�$$I#%�N��/_ڃ��L�$�,�M#��\:JAzQ��^��d~-��Q[(���
�,l�v�'0��b
)�s-W�i8���AJ�~`����P7
�1�`�C��_��z��
�٥�$�`X��Zu���
S�k�H��ÆG�#~$}E�k�;1���2���݀Z��B�v���h|OR�Zˉ��W�9~|���X��hק�<Cw/$��<0_�-O�aɜ�C����E��)D]�
��#���ז 1B�/c�[��t��[$v��;Pǰ(0�`<�U򉏡�Ң	�g�7�@~�:Uy�¸�&]�`��9{��~�p�p	��2;W�NO�r���ߠ��6>��"I��3�ty@/ҩ�#�=��}�Yg��u���zV@x�yD�xV�؈(�i��|`�롐���EM	�
b|Gٳh6���a����|�v�7�ӹr��YQv�a�� �
-~�J��i}3l�ԃ&��,m\]^1T]�[e���6�^8Qcs���w�H]�:���l�	�g}�+�~H�K��X���v��C5�X?LGw,��b�1/�>)*W�T�4���T�4 >Vj�P��8cI+���Z�a,֜M�ꢊ�';\k�>�ӟ`:U}O�S'�M�$ŭ�lu�@�k�2�
1��J"�M�m��k�����HWp�'�#r3d.�ُ�c���rF�{�����{ώ���eŭQJ�7���Fr���-3�8]�����L��@gB.�~cХV�u4���q��Ρ-=�E3�=���G�T�n�c�ێP�P��G\�	r]��w�z�u���r�[�F`���k��ޡa[X
K��i�3��-��>MN��#=4��Y����|��
QO��@�X��|/~���'��ذ��E�NM�Q-	=��"��A�=��Q��,�i/��A���p� ��Qy(n� �C��V��������nn�ۖq�s�<�Q�{��ȡ�ldM����}B>�=N�	�h�vx:���&W͒Q��mU?@��aIZ�ڒ�5\��P�[o)�<�<�q�6)��h=D*����o6]L�o��T�z���!�3!�dq�G��_ֶQ��Ǐ�4!��y=z�T��$�����B����\	�����
7�!˘P�U+��)�J�h10�n�����q�g:}ۭ`�	<EbG�/�t�a��i.��ɇG���1�S��/��B��[֠��˄��H޴:�����{�T�N������1u)��s	\�F��)ݔ��g�jT�ϙ�S�]�`m1�v`ep�<�U��,X*��ΐ �
]���_3sjB��
z�e+<dy��A�`���/���ĜRX�w$D����y��u�e{h
6��A<�߭3�d����g7 z��w�b����h��!C�\B�,�ο'y�Vx7�DSX�!ׂ�/���0U{���T=���U��o'�Z��ͼF�hz�.w��B�۹�i���������Ğ�ƴ�S��0M{ Th�ٽ\x$>TQ_!��K��
Sü��(l�s�����1g҂���Yu�^�Ӵ�꣜�O� �]�/^�P�];0tʤ<#"iU[A����9��ʂ+��ϩB0�3}�W;�&5/���[u?@ࠃ
�9VL;<�p1��xv��ǣ�h�0��3�1�XD/DYT�$:~~e��2O�93�h�T�g
]���w�����	HG�A��Lp�c�ˋCw�xo0���-�6���f�6��������jn$��0x��S� @G�(E�4H��=���PzL�S}�,�5Qj~x
�,�>�v�ZX���r2v�GC?�T뷁�WC�o���J{IN.6fWri�)ܛ,��x��=n�N�j�
�ٶm���lF�[br�l�gg����3�\h~mQ�<ўo�`S2N�Nթ��P���i���V��Y��`�x�c��7���^��gJ���!�xf
ߴ2�rl�H�bO�K`��3��5,�h�%���7�d���\�(:bp^' X"�/ž@X�SX�U1b��W�l�I�0��g��Rn�Ƅ������L����hpk^��;y7���sH��x�<�2�4у���BL�%_���7�`Xu�8LU�8�R�E�5�����&����yH~��3��?��<�e\c�R���{2ڌiAߑ�{i�4���ɇt�lREB�E,�w�[���U�f���l��;���VCdf�vC�<E���b��/�`W���6�� ��C�M�	�"~�*�!V��Տ�|W-~/���?l���cH�zMӽ�ݲ����b�[El�:D�y$1���r`\'��}����fF3oږ֕���D	�+@�Y��KUXB`卟�,�8#��픺rJ��Q�R��,�y`K_�]o�?f�-f���n�r �E�^��?��
�Oz�T��־�Xݶ܀W��^PU�G7��ĞKؑRX&�M����;�v�2P�1t%V���n�ɣ��錖$�oz��nVuF��1��a}b=i�a��Q��L-l��i���e���"$�=�HO'1,m��Y���M��+�J��h��M֠`Ǚ}%���F�f���y�9�SR��:uT�����Y�A;��^��qLް�m�p�*ى��˹����T��[���*6�dG��D�b�F�s��RfX�6S�<V|`�0q��
.$�r�r�Q��rr�ݨT�D�Em�j�=��n���3�|����;�8�ɶ�y��M�mAq�Y��԰d2��+�̡Ypp�Tй�O��>���w}}�T�J�A�*����,�d-/ �a��ho:��?�ɂ�zK}
nw{�>9i� 5U�g�/H\r� �z޵U�U��Njm4�}�9[����|�d��&�"��Jzp+ �`�Bݺ��fsK��FVu��^Q �Q|ΚL]ń���K}M�4́�tp�j	��j+�ã|��z[Ft��icA�S�p��a�(�֩}dM��Ҩ�x��Ŝ�z;yH~蛟:5���V1ݍT��!��y�*���k,������h��ў7螀�9)��Ny���/��E���= YY������?c�X��	U�B�z�t��llQ�Ó���2�)�M�y~��ո 	�گ.}=�#��(��3]��eԒD��C[�'F������@������J�Y��<�5x;]��8<u׳��t������2�;>߾����[e������Cx�����a�H�E?�{�	�Zsՙ�=.���2����gC��#���K�{��RA��#C`���
e�3%�f�@$�饭Թ�����#z��C��[���|�������|�&��`��}X�Q��D�,�%r���؂�U����?P��o�k�EW��&��	��4K�9,G�\Q{u�GB�33���Yg��_������a.Z�����'�"B���a�&)�/&3�� �](�`�*�����%��5���>zxׄ�n�\���[菔D^�6�0�;���x?k>Iwʢa0z�8���^�4��~"h��e��C��O&����W!σ)B�4��Ы?�pă�|;���뺫(F�&[-�eb�Q�ʜ�$�S��a
�2�ґ�� ���3y�<Gc��M5A�N�K��1���冦�u�#e�t�k����B�U�`Bs�DZ�ɿEB܁�<u���q5(�T1_K��z��Ձ��Q�5�M&oB��.U�6SI��a��;�"|'�O$,B�0~"�֦V�R)qC��^֩-�D�H�,0Me2��䐿gw�sf�|��[rR� �@���;��������74�r�
@�;���xϳHV3�z*\/^�`�4f��|An�+խ~�2h*-N,z���I����/f��T�k�d��脦 !�ߗ�:.�_���͞$�ʲ!��s@
��C���/�RsO�~ܾ?��8%}2�uShG�h�9�Î>�`��.����ϫ6�W�qc�V�U$����FDo��l3��L��m�7S�#�!��PKEePQcӟ�w0,pip/_internal/commands/list.py�Zm��6��_A8,^�����m���rIФ��B�%�f,K:R�]���̐�H�vv��}8#��$g8/ϼ��F������$OS&M-[��U]v-O���̌Rue���v+��l�A�h��WE--%�IQ�\VY祰K�CQ7��+uba,�Ӽ>���D�U�~�u�\�S����Ny��%������B$�!�Z���-e-C%��,y�������k�|�my���=�{=�
���N�bő?H�6�o���{�W9ڶk09�[�h��SզB��m�.��F�+�'(U��F�uG��`mWf�Y~/`��ڦkW���	EVw����N�Ғ�&=te+ڝ�Y��=6�n������տ^_�;���o��H��/I-�
x���<~��L��;�S��)��Ǯs�k�'C\$��o�k�+�q!�zdD��.n��TrUw2����#���Ѝ��oh,J�*;@X�f��̔"�
��I�-�A��9�ŵ��3�V+�ˮ@{X<�X+n`�X&9+��D�2�g�_/^)ъ;�(���x��m��V5�-����`�;���8Mw
v�+&c/Yoٍ�9�=��oXV��� �6FG��@��K-��+���x?�+cHcH��Gԯ���^����¤X����B6Y��iA��0|'?d��Ԏ�M� X��'�iA������#��A�����rg�O�XU���ZҲγ�k�-�7:p�l���hwY�v�b۲^g%�9±�YU�nl��2����b̠����mp�).'��6Y&��wUyd��8
��^@�����h����]��3@����_S�E��	
�P�
S��xY7^��KE�-��P0���j4 v&�)=�����`S�C֞�B'd� �5�:��P��?��j��P1����B��u���u�{)�&n���g١���̰c�`�b�mЮshq���|a
�T4$pHOp�zS�룆�	ViLo�݀�R�L�	����:s��r��$���Fxz�����^N��J��p/��
��(]���f��j���p�>*�'�^HI譜�x�ܨ�n�Y�wVj�f��F-�<	=c[([�oW�@˧�y�Z�`��DY���Z�3 1��&Q�VN�Nm���TCo���]�'�'�a�@��H��m
)����`��p
M��i�K�6���f���x���>=f՞��0�gzx���cj<��H��
����Ի^�Ƃ�F򶓕�k��o���K2�.��ȁ�]5S&���0!�I'�!7�K�7�X��m�/=�e&�{��o��;s2Z��p4��Z�5a��kQ�z���N��;��Ӿs��q����$��F�¾:ņ��
���~�_�#�����/��Bzӏ���O�p�
��p}Apk5;tJ[[W׍���.
�Y:c8b�@79l6�la����W�[c��y�����\�����b#
�Ѩ�\�<��y��eF�u�˩��9i��d�!1�V<��5��Ȓ=X(��

S�"������D��:!�v�Y�i���}}¨��H&�ٻ�>y*�4��K��ܻ�ە��5�Kr�7X�����Ԅ���J�/�f���ꜪƵ�)64�(�Wz���Ž����Yzw�ߛ%I�b/��'�����QK-��)�jV<?-W�Pr���b'nvFd%3����hٷn "�a���8+���{ѵ�"�g(�̨�s
V�=�
;
.P]H���{R�^�;/xG)��c�[�G�ߒ��ױb��X�Qkc�?���$�E�	�
("L�n:پ���d�|כ�:�G��ϟ�гa��Bc����@�y�c2 �]���jzQ��/�B�1.��1�I�I�ݹ�pW����y��V�'
f��.��u�"�
���[�7��{��$�X(�(p;���w��L�����sJ��N?���$:]:#�	���k�`�d�)�'�?��	zo���d"�D���b��Uˇ�0��K�Ib<+�3�w��aI�i��{g�J��}�S1�+�l�"����I��pdC��i0t��倖�9��O�H��t�:[N);A��&_ ���j��hFN��k �"���P9����ЇB`J;�Y~���=:s�`z��^��7
�,)�ú�H�K6	F8��C>�p:s�:[��n���!k�ہ;�|hb���u`g����ɉC�Xts�}yLauFd�k8��J�waȸ����K�$/�^��|5u�4'N>Dc�p��;�'d��XA��
i[z:��������\|���q��T��7B���!/�^0}�I����
.�=g���Mh3h��s̓Z �FSn씼"|.�,��46�E+ޭZ���ߦ��-6U���}kD3
��x�Q�W�;X-)�������y��U�52y��-.��`$[��=�Tj
���D�b|�����$�>6{�$7����c{|UWw��Bm���5�Ҵ;|3�SxGE$��g {;Ȯ�p�?�$�+��?�Oxw�̊?Ç�t�=�3�F/���f��`�>��͵.���
UM��,<��3�y��v�%�V�P�d�RV��+T�Ò�}0r��=�����oL��/�mt��ھ9e�a�)���`~��3|��mzdѿ�B~Y�У�����1�0\�Ù�
E�b2t�ޭ�iw�V]b�K�|�Z۞�/��xY-?#Ԥ�=��:l�����l�J 23��t��4�(ROKD0��v���O��ah��aa�+�x�[�Ц(i���ϧ�E�YX�-nY�7#�Žoh��-�x�=����1q
�z��qG"�%d�t��h����(S��PKEePQ�_ٽ�| pip/_internal/commands/search.py�Xmo�6����pHJ��ӻ"�� �ڠ~Clߵ�3F��e�����5��o�/)�n��XK��3�y�E�#y�nU+X��kj��"�U,7ﳙ]/�͆W�*��=*���mfkD,�d��u%�X1�Vyp���M�߱jUG�|��ɺ�#����W�
dwLH@���Pir�;{E�/�O�ȯg��/��q�Y�����|S�V�WD�&������w��w��Rr�����|�{r��T�`Dm��F6���c�%�v��,�+ES�ъ��0G׷�-3 ;P8`Q�v�Z9�c��`߆WL��,���s���JX���_�g��>��uqs�1%W7��'WWS �`MV����؁�Rf�Z��s���4E[1u_����fG͛_�µ��8��m1`��*ǹa*���\�?��6'�[�V�g�qY��V\*���h5�!��V5��B�xR�~��-O���9?�t�d�zb�h���Q�F�����e���NAǔ`��B;��C�ҟU�w�5D�Iw��~X�b�V?sE�v<�yE��(J��Ǩ�;�VJ"�B��}�n�]�*����'Ý�f�&&@��W�?�kq�#n�լ(���T[����N�Kbzpp`x(����2�r����(�����c�(C���eb�>���j%����`����,k�?����Z%�[�ֽ�M+ZfWlM�j�[�X�rm�Ə+9qB���y]�n)�b�Ye�c������?��T�f�K���vvL�;*����Ӛ��Z�!�b+oE�lY�,�B$�O�5X]m��^��O�n����I�����$Pg�[��Q�M|��&Hz���҆L�5kJ���)���J��Ԇ�|�H!Uu3���r8�_)��CBbZ����a��t��H28���+(�[Ԇ�r%aCӰǚ�;WbI��O�w(�]��y�Wj<AT�iaf����"�qI���Ix�¨"�����0(�
�c�>�d�&�>�!�g0U][,�_֐&>��.0R[�u��U��K]�p�����Lc�M��[W+�\�hL�v+�\�{�uJ`�ϸ�:�$'�
��	�˗�~�̝�Qt!�Į�[z%_�<�R-�0��A(���A��85�?�sݺjo�L}%�����`�,���-(L�1e�?��SH�nO��C�+�q�R��3j�+��`���h��q��T��y��Z�
�
��;�.�6���[6ƙ�v<�+�a閷�ťqd���]�מ������F^�c�DX8A�;L���尚��%r��c��j�/�zÆy�����}�
ɞ�7�l�K:.{�ی6
�b��e��c���s�P�m��t�	SȦ�댎7Y��������.Q���
L=u�νX�̳9��W�NBv�K`�$6��*���~��*[ܱÌ*>.N�� ���v	����\d{u�� �P;t
���,Ȏ>���%�b/}�]
�$X���+)YFs`H�o��ݞF���	�A

[�^}X6̠��m^����i���3���=@��Cm��9�:�n�R�q��`
�x&�{@�%�(���u:'
���������'o�I��/':9��3��5W����˱7��
��W��U�C������!��7$��;�$�~���0��W���G
i�w�8�z>Z��(�4�*�!,����S��yS�-�������F�}��"���Э:�!��93�/^�����}��[(�v���N��o����P�W�'�G��>�_]8==�xD^K�2ˇ?�V��%t{��'?�Ԭ$���~�>��>�
<$p�+�1��\�|"㜃�7����z�v�*>���D�	|���8��wR�o�P��F�a]u�t��v�Zx�[;�4ǘ������PKEePQo�GTpip/_internal/commands/show.py�Y[o�~�� �($������
��NZ�0��h��,���4[�wf(J�$;ݷc,b������!wW�GE���KEL���ߪ<�+��ɤO�^f{��
�#�iX�R�Ҙ�"y���*dF/"K�V�x�G�Py]�B
��`��q���d��V̳<�1O�7e�(�	dV�2�i�2�r%�8?y��K�xJEU��(%���z���
��ϗ�׏�c��_x�*6:�����uU��i�ꭀ�Η_~�.���)Z�|{��^L|�j^T�wc��֐��;ÝTU��do�^�P�*ni��EuGc~D	���d2�S�{<�M��{���N��Lf��<�J��	��L0(�1/���"a��B��}:�%�I��V7�s�`�J�Uq��'ஶ�SӏZ�1����E������
�O3�'�����,�QK��������l"v�'I�X�HwM���i�����H�W(�GRUag�o%���w^�;�
��K@b�����M-=U���;P��:��7<U�}ui��V$}W�)K,�Y�Y1�L�`�z���^�!(��jB��e^��M¬KiYg�ʀ5�
/�j,��!x��rC���Ԋ�J��,�H5��W^fnߣ�`�z`���Mp�H�o����JL�iJh_�Q��
�sw�f��+W���!2X�pq��4�_�SԨ� �lT����lr�S�^D�͕h�����8�ACt�	���d[#�6�_�H788�w�+>s_	`�82<QV���r[�@����i\C�
F 3yL�XB�w�����5�'3��l/2tD�V]�̰���p�8�1/����i|�����;�쯿5O�
4�l��k^>^#%��t��z��EX�&���f(4�Z4�hQ%r������lk
��1�!"�P�&i�`��M �=�!�s�jCѳ�"�t]������E4���,Y�2(��e�7Vf���0<����o~褍0��ܢ�i�H��������l�HH�S@��ѓ�p,@�z.ɬ� #�oV@v(0C#�O�h�Y��ͤE3�t{��6vD6$\8��
ah֋�g����ɜĹ�����4<�
�0R-��b&n['��1�a%i�Lm��	\����w�Y)�m{�G`ԄW�=��d��$g�����`�H��"���񁭮/���S��N��]���9�h�X��@�1J������i�^o"��2#�"%̔Q��M�:�)l-Dw(*� +����"c����z�B��i�+f{��Ў]��V	�|�E��mh�_$��������X�,2hk���~����*�Y��a�������n�7u�NG�6�?Y�Q;�SB����>��y~{�K�iN&��Y�[@
�������~h���4�9�{�=go��.��W}/�{�œ�̈́���
D��� ��l�Q�m)�s���*O����)�\�v��"�Tk������7��!O��1�����rYZ�-�c�H��}��N�؏h����pl��A��f�����^��R���˷��|�C~������p��ל��9���cd�t�"�u���^�����uU�T%��� 쑰oLO٫�����}}���xȝ�1\�'�&z����A�I�s��ek{��`j��Y⣍u*����*���Oе���ג�x��{�M��
ݤoR��UNslt��Y�9�꫉��J���婣d��y��ԣ�縥��xZ�/��3�y�=�5QD��ͶߕA��>���
�*���3Y%����þN��|ja�}y�"��AK���aqy��	�_�:hZ��^���)�hxa��0�i� �b�S��s�@�L���i�X0\v^�����PrV}�3���j�-���=K�|���1:�{6z��|�_���ntנO7�ضc�f8�������5��ZL]A\���m��p0�jH��<L���s�����Ƽ�~�u��ɾ�#R4��si�Q���ߐ����^�7���ݕ�3�S�75�N�`���nh�Y�Wѝ5�8�k��O�PKEePQ?.�v�#pip/_internal/commands/uninstall.py�Wmo�6��_q�0H*���*_�`+�Ų�@f��MT"5�����;R/�,�{1�("�幻�wt�UiZ4�ј� �Zi�Ũ�����U��jQ��2W��<��wB�XcEizŌK%E�K���W8VҢ��dY)�7�f����{�M�����?/5���d��Q|�5mc�m�q�{������/��kK��L�%w��Z+��F{��k
���Bi�+
,#/V7�Uz���>��鬤N9-��xy����U���W�U�dT�,f6%��V�rQP]�)�U��@k͞j"Co����t����C�������W+Q,,_�P�UU[Ao�^6h�S�
C�\e%7d���a�����>����R
[�
����P"X� W)c��c~V�R%���5^�Ʈ�0�	u{^z�����{�n��+	mS���l�1�"�{{%���2 Thy�-wXs��T���
Q��#���`�gZ����5�1����X�z�eC�?��` �
�#qjO�M�3��"���+2WލϋG�G9��<�tB�e�U�}~p4�k#���;%q�r�,���ag� �>��b�{5���6	�8/x��&�K��g�oJ�<=O�]�\'���Bg�e�g��_��3�J��LH��Ԥa��`b���9b���m*\�&JQ5�XE(E��/*b�R�szjsz��T�����)4�1�޸���OJ4��g(�j��ЕoZ��ёͱD���VS��hF��m?�i����x`t��n��^�e��t�wf��m�}�z�6��I�s��7):>��mڱ$����<�פV�� ��m�v�p��q�!��d�M�dy��3�831�BE���7+pZ�h�F��
9g�zf|���
���3���I���}�=�1��.��yN:����g�kv~����s��e���I����T��d_�x�[��T���wK���I֥�s��.	���<#��j��Ѱv
h�̤7
����W��o@��e�v�v���(`�)�9�7��0ME�ax��׬i,^�Dw��8kG�Y�V�;����w���>���i�Ub�<Ӽ!�]��urM�EL|��aOpo��c�P�6a�ˁ��K�9��PKEePQZ�|pip/_internal/commands/wheel.py�Xm��6����砰\���á�"
�KzE{�i�(����6�����7��_$і7�=�ș�<3�[}�b��E��a�]�������V;V���vʒ�]��e��(�Y(���U�j�A�S��f��2�kE�����.�W[����[�$�"V�Z�V�Ɯ!�5|,+���L?��Nh�Aco�̒=
�-+	���s���3(�e�������S,��[$���Z�)���k5�@G�
�R:��)	�^�"34�bV�d��;.şP��n��[ص�e�����+���	�C�Q�L���?����zs�C����}��)�G�ty�	Y��%�Eu����Z���h"����\1|�J���kӣ�\v`��T��A_vQ�"�8G��Ʋ�l��@�JrcN�>�)�^��l�K�x�u�{�����la��5����TL~�$x^���Gv�"�Hʎۥ�S�5h�,�����D��}�`ծ�lw+���\�;M��}`�A�K�����N�4X�q��x'�ńժ27lkmkn���"��HES�P��\Kn��ko��]�j�v�UJ����o�����?0g�o�}�A�I`��"�1�B����8A�eVy����؋���SEgS��Kg�������VvJ��j<fZ��Z�~��<?ñ�	�@Hx��n�ξ2'��Td���g��B�"��S<�,I�uO�;��5B�.}f@���yA7,[��k�N5p��i�՚xM>�z
���|��+����2!��k�����;��b>Ÿ杴�2y�i����d[d3�����+$}��!�0Q��,���		�J?PBձv�Ű�������Q�h�>d��U#�dm5`)���(�+�a+?9J_�Â��9=�+-漥:9����'�+��n:�d��L׶R@M�sW6�0�%�|���ə$�5�n�B�cq+[h���חr���g�����7��B-,��p)߸�]�ktu)��`���2e{���ÃNƍ�b}=(�\��j�ښ�;��sp#�=�O%��8��O��gRt��~'R��i��i]��&&�~�B��������3܃E���^��	�f�K��M%�pㅕ<V`�{�=Hպ>�,�B̾=D���
�z���%4�aƥ�  �U���喛-�`�|r���Xv���r�Uצ.g���hR/9�\o��k��Q��t��ˑv�K������B�����,#d�����~�,��q�U�k������B����u�,|nd�$q�q}l���`@J�&�$��x���-�d���N�
Ak������Q�s~bx&8)m��Nj�L_��� 7�O�qȟa�x�X��ȞHз}(2=�f'$�*�x��'�����N<PdgN�I���H�i��x��q Rl*�b欘�3H��a=�h��/X�&SM1cX%�1}�{��Vz)X�0����0�R$H�.z��m�)7Q�dr�b�~\g��E��Nz��`\2�����;)5^��K#0tGC�v��'󃩓���?����F�Y��S��^�w���G|+ڳ
C�>���1��"�V�70En/�Г�yxɎ���e��
�-Ծu0.?ΥGiC3�Kܥ"ݵ���M���{�1d�Է���le��aP�E����k�U��v� ��u�r�
���7��H�mEZ�b����0U�N���c�����~d�M�7��i.E��:���S�AStcR�u��%���V�Sw��77�[�Z"�"�V:}Hu��_��$+�Xry���7���&�gp������nD��N���tE����_F؁�_������t�dpJ�8I���Y>�bRHh��r��V���ixD�^z|�~j��3`��S
�x���'m��ķ�n�{��PKEePQ��g�'pip/_internal/distributions/__init__.py�S_O�0笠��d��`b梋q��1{"v��	�ރ����؄�k��s���R�)�|���ʋ�:CA�(�ֳu	��q�&��_"(���#���Kx>P�sUN:�ϻם�|\-����f��<A��B���i���D��������
��k},�x(�`��	!"�!�_��83�7����ٱ�+�p�!�nn��L&[t��$�O����F=溅�����BϨ���q�JYYl3p�/�ﱂ�Cf��Ma"�
T�P��W�!4(��4�8c`K:�&꼦^���%�a��T�L��Ȉ�$+Z/k�s�u>�|λj8�#�d�5�G�_�+S��9��R���PKEePQI~�Z�#pip/_internal/distributions/base.py���n�0��Dw1H�6��-��vQ� [t�U�TI��ۏ�l'n�΀/D񐟎)���Wu�5δ`�-�ja\���!A�b����J�i��.H���l�ގ�˛�v���;���٬7_�L6G«���+��A*��	�ݖ9�s5�Q�Y��d�E��D��~L_k�R�x�I�-��/���J��;�E�ĥ�\��>�e��̱�.�>�_R���U���p����֡H~����A�=BR4��k�z�6�wA6Tʗɧ�;�?ORr�v����}�̣_%9,���|���c^0 �lh��ż<h�b�ԉ�5����9:�zN�I��^vv븈i�r�1{=<ʰ�����,&6���/9����.�D;�C�aȆ"B�"��R!v�N/���@K����苷̫Ih9NH_��Q���+�@eh^��!�������ܣj�����]�F����p����N�;�.?6��ŋr�U�E��ߢ�u�:�S·:��3b��b`������}���O��츤+�1a�Z՟Ņs�����CK�`F�F�o�M_@�I%��F�v�w� �1��o�PKEePQm
mm�(pip/_internal/distributions/installed.pymQ�N�0��+F��J��*[�(U�
!kOR��mlѿ�I�����Y�2����D�5�*D��:*k�0��Y�6K���`��RC�N���}�mvb�t�|��z�~dL�鵨c�W��f-�7i=w�Rx
��9�~g�t�vV����0?`I�h����tՇ���5�+"jMr?�t�Y�f2�l�%udb4�z8�����^�606��4��iա�0@�x���O}e
뫮�OMԞP[���@n+WG����QI*��(Fw��tqrм�&Z�t�7�8>�~?�Þb�
4<i�!)�")�㟀��hEE%Fl���%2��VZ
��iG�Fq�
ku�um
��]���PKEePQ��C$�$pip/_internal/distributions/sdist.py�Wmo�6��_A8"��~(V�˺`m4݇�(XZ:�l$R#�$F���#)�d�x�* �E��{{x�m'�!��n��.%[��\P�5��MMA���j��-WR� ̜P͵Q|�.�.�LC��e�;�2�E'�4�}��B�4�.�+%՜�kt��u�dzV���7;�;�^Z�g[x^����mP���'���7�]^^\�],�ff�lA�qZS
�`
��X�8÷ j���fKh�+���H�b#^.j�/;VݠCtc_U��򫿻��ba������r�[�(�Js<V5�w��������r�:��BF�'$��һ�qvL�|m�#��١4�&-V3����H��h�Jf�.`rѱ^ې_�_�W/"2,X���ړ�Lߕݞ�v�A�ȯe���հA͆&	����f3�m��k8#YN^�<͙}ZU�*
�
��qw*��`��S4��,�OoA|gr-}ÓIr�R6ߥ�~'YM�=��7�Lid�6�5`}�\�ہn+r���z�4�֠B:*�Va��[�V }��� ���2;4��z��r�;��)4��F����Q 6�Ag�2Q?�ר�:����d™OB��h5�p�Z�މ�8����i�N�8:ZI�ixet�a�;�+H��u�z8ZÚ+lj>;���^�ߗ/Sˎ��j���R��V$Kv]C]�6d��YDű�mG?D	~$˩p�M���_�g�])�.��2U�'o`o�@��5�^��)��*$���z
l5�D$½:-�i�Mr1�o�ӇG�n\T��j�
y<
���-�1��|V����(� Q+�W�TA~$���7t�D=!���]�8���]��xax�V�]����uL	��Q�;��rF�/��?�À��8��GΗ��4v$��@�SPX3�T��iu-�,ؖ�6ޡEȢ���Z�n�\�9w�� �S'8c�7���҄ז���㫗����mR�i�%�l�#������;��͐�!V>�1[��}�z�]� �'���a���Gj	�bu���<�5�&X
���š�TLXэm={�����28<h�<�7ϸ��=�����.�w���!�y���
A58���9wy�3��?.�c8�	۶�CC���F�;�����$S���j�5(�`R���
�YyT0����V����}w��L�߂�՜V��\�pl��ص"S���谓�(2żs��(~�Q�Y�?�� .8� � i��@w#M}�O�4�]��ơ��Gq	&$[��w]�c����1ڟ���?PKEePQ��F1$pip/_internal/distributions/wheel.py�S�n1��W��%�ž�J �BQU���bMֳ�U�mloC���ͮH���̛q�m�j�	T㬏��_��NA�\)���
�R��Z�QY�5��n���Q�)�PƽSf�c��_ߋ�O.����������ݖH�@����m}EA������-
U�P�(��Q扌���0�2�����:e$�*V��!Q�������{,���ܥ����S.r����WF&@�6�;.�.�v�H���I@��:�C������S�Z� Y���SR
����@�~.5����/���?�{f�jQ�[��"J���M/����&Z�h��s/<��va�0#�!�/.;<�}Z�.8��~���e6�9��;�d��Oe듂�;���#O�8=�S�D�m�Z$q�0nG�wy&������
��+��!�Sq��9�%��v�i�_���--RG�����]�	0��rZ��߽��8�Z������t�-!�%�[��P�j���
N~#���V���!۱��oPKEePQC?K� pip/_internal/index/__init__.pySRR��KI�P��+I-JL.���SH�OI�RRR�PKEePQޥ`��@W pip/_internal/index/collector.py�<ks�Fr�+���S��.'UJx�,{�n���d;W����!	/�@�q~{�1=�@�!<ߊfzz��=
L&���V�4/ծ�w�ѪZ�f����m�|k*����ۼ�p^�Κ�N2��(ઉ������]U7*[��uՖ0�*�\�]�j��˵���[��w�ݯܷZ��j���yUeo������o�9�A�|�,t��j�i��WE~?H���4f04Y榁!���.mdf[j��;=/����]�����u]�3uu���
��)�V�$m]��2{��@��(���ߟ>����W|��%0�L����汪��eɤ��悬��$(2E噡F�u�Y���i�rE׮���̒�I�&/�u��XU��4iӚ��4��͢nY�mFW�	��`)�9�~8�構��]_��z�������d��D�[��0i�l8u|9�(�������[���wo�}wx&�5��XS�R3�����f?dnZnx\�^�,v��CP�]òj'�� g�p'1��yZ�}�g���$������}�����B쮿'�M����z�y��۝��f��)�k�{ڂ24���E���l��Q��1�����@��Bl�1��̻�wW|�g�����]]��1��4^�}�S0�愄�1
X �������a�5��Z7o�Z�X��V/S��+�ئ
�)��֋A(��cd�>S1�����:��:8�۪��@?�O�W�a�J�1Z�������ߴ5X���,��ބ������X�Ȩ�⑉��$��<	����;��M$E��&`7��<��&�S��KrS�R��"�賳������+yW[�!���z�.x����eOL��Ѹm!0��`\���#X/�%�M1-��EG��t��O
nnh������e�NG)r]�=�MԊ��H�Q�wU�"_�ӱP�^�-y�X�F�xzН�Y ���^,�{+�D$9'Jd�iw(�veЧ�[�e:0%�q���@��d�Ҵ�^`P�ؐ�Ƶ��t���n�ot��$�Q9�F��n���5}��� �R��DwV�d��	ƃe߁�w(u=��z	cc������Z�"�>�1%���'�P��U��
˃��M�����r �;�;�,�����|D�g�ep�
TI��ūo\���J>#3�ǘw}阇���,}Hsr�����hb	Пb��k�rE��(��)X����k��x���]�7d�D�
ǵ�6�m�f��5���N���1;X�2�ďYG��[�5Ĵf�v��G����!Eun�O
��,=_e�E��J��B�W�]\�hX�ꋆ�k�߀m&�Є:0�h�Ґ/�f��'�5�<˫���s��tҺ�k�U�B6n�r�Ju�P�K��ˢJ�
��Hk�z�D ���q �YZ�`�k�Wm�R/�d8oDjY_p��D�ʚ�a��-׷��l ,���#�l�V�K ��}�����m
%m~�jmѱ���F����c��Y�Ѡb ��r9�d��0Y�vG��A6��0�x�Bk�+�z�.�~Xo0�-�H�w��Ly&~9V?ϫ2j�cZ�����s	\dm����:���I�����}:����k�N!�Z��z�@�滰�f�6=�#H��L�X��/ރ��Q���U;0�P�-Hު?������ۨ<R������u��4��H@�[��@��b�Ś�B#t@�{�b��r�l�6�pl�yY�rU�����	��s��-MY����|�H�i9�ɸXT�˜�W�)�vA�{ �<�6�8�:]��-y�,EW��y�$x� ZD�I�5����r��X6)�=�*Y��\��YѝZ#�f���Ӧ*�}oz	* ձ;�
��o��4S)��0�����������ٓs��	��*P��<��O��s��
��l�)�`�^���)4�F�6h��|�<�a*��D��2굓�ԙ��B@	�M���a>�|����iu?�ۍ����\�dU���j�-�Hd�1q8[�f����a�-��UC�X���M򱘂�����A�.�
�'`kHc��P�`����oč�fQY�6�r��U��]��N�-��q��۹�0T�%�b�"[�	ŇB;�&y�eg���4���N��Md�G��Rw_,�A���-��Eћ�]Y�$�^��E��ڨ#�	�:�uW�X���������!��SM��@��n�C�B��F<m�b�c��	DWs�E�du�6h�ҵ��p��z@��
t$�&1V�)�ZV�5��H=��~�C��t��v�
ؽMW�7-�n�#g	rF�s8��We�{��;�k�F��k)���`��1��	�ۂ,�ݝ�(�ӻ��GB$�ְ�cP��-q݈�d�@�$9=ś~jKt��Ο��$�{b�$���;pJ�ȋ�g�RJ
*�d��B���SyM�q>p{��&$JD���<��&��=�X��'�k�,�D���x�-mARA��i�I�Ï�a�b��U�I.�Z&�������a*�K�!aP@u�aP,8o¹=�˪���%�q�UYZ8�0{�$�>9{ �ߨ{�^���?� W���]�)a��כF���e
N^�����6U[,�����}�5���t�l��ŸǠ�xZ`���=`?��C�R�8HUH�Y!H2�5o%Iq�X}is"��|)�;�:Ƹ/CGFNV/���sz�����rA�
~R]���@(�(��^��vJ�Y��w��8uu1W�K2�=�pѵ��V�?"��_��т�<`)��RA��S1�����+	S�P��֞=E褝� �M�e{b>�t>����	�<6�M��R��z �[0�_�lK��Eg<im!snn��h*�ެÞ">H��z��
��(��N{��t��X<��*�Ι���8�����ӓ�3o�b�=�z�r�"��"�(��a7j�(�����=�-������V�ݤsh�ZL�}K�ɔ~J��P8#�_�Ap�I�(��<��gW�П�o�/%s���Umcm≘N*�x��7�,��:[��������x�%p�m����G�NO��z�b���`pi��j��Rr��E�Ͱ��э��Km��#)�v��ɰ:2��R�n�W
,�Ɲ1I�U��7Wv�՚�6젛�m�������s��	_��F��q��9L�-�16����vUͺ!"��B�n�%<I�0S���@� �t�����u��"��5.���MU�B�B`�<��
"L{*�W����)�̦�}�
x@
�Q�Y���ۄ>D"‚ԉ�eNv{P�2N����]�"���!����6�l���,�"��`��H���9�p�-�	���z�b�_N��L}�pCJ�h��	�x-�mHT�N�<>1�L��#�l�y�K�B�j!B�،�Kx�t	+۴<���T��y.b9vr���p�'����F�5�=�$�'�6��0:t%A���#��[�������yjK0cF	�z��+�(!��������p����q9B+�XI�`Z�#�}�8-�ƄKѪl�����ng�����A35:�vd"�[�D�h��HΉ	:�
�{��g\�F��`"#�-������9���Q�P�t�I��<wHO�:"i�A�c��(}��u�����@�4G�:�>�)�A��8��X#�;��E��;��'y���kׂ� *��[����#��'�h9B�5"�;��B�M�|=��\X�Uo��[
e2�Kn����Lo��bIŷ�E�k!(���*�\��O�Le�Tgț:-
fc�FL!�_�H�C� /v1s���S��0�쟭��X���L�C�ԯvY���@L>6 ������~��w;(�I�0,�!���|s9�"<�'�f.[�ăd>�†�
,%(+W;�8����@
>"�{��I���+#k��$�%�&�-���y�1K#�%�DA�c˯��32��+8��1J���X:%}T�����
���"�cj�ӛ��c�Ⱦ��Y�>X����d��OW�bS�@hy�ti�����O�E�x�h:<g�'�Yq2Jo���yo;��'�l6�m3�?;BV_%@�>*����F�3�n�v�ų62$���Xܓ`jpg�,ww���;n]?k�"Rh0�n.�韑�?t9�k�@�֊�΃����I�u�w�����N���S��df��R�	��;��:g��б�WdB1O��9��g�=!���ӹˡ�D_�&�i�p��K�0"Uzp(R�Q�-�p�ѵ�݆�q�,���8p���C�����mnH��r� �~��J�=x��jQg(����T����8��/�7��J���u���pU�5��h����Qߓ�aSי��2ڭ.��.{���cZc8�ι�æ��j���O7����Ўf&�a�@��V��hD�>AA��mg��\���ʹ!�;�:�^_ZH;��xhm�*�Z
m+C�$7��GN;��X�t��X5/���FjL6:�R�-��۫���G,��68�e0(q�I=:�z
�(���vN#_�G�A+�{���Ѵ/;�]�Y"��„�L�mw��uYS���$��S�p�%��׃2l>���]�|�m��dƶɄ���f N�Sn��nP�����w�@A�ҟ��l/�k��K�W�[���Sے�e�I���"Fa2�V���J��2������G����a�?F�Sq%��5��bh��ID-�Df��1\#�)T��&_�$rgj҇J1R��gQe%ے�ݳ�����MVg���~�$�E��y�ou�6��v��-m�:�'�B9��'��"o-���D�bق��$7����,,����$���3�T�#c�7��׭�*��/���c����Ik�� �H�܌G<�"X�˃/����s}�1y�'tB�#{��n]W���5<v�P�v��|U��')��`z>�H�w�א����R�T���,�����&*�^M~�m��cb�g��3��N��/��@L��k�{G�NwfM�(��[ݵ��
}���r*�S����������CK�\�`=�-x�kX+�ʕ{�5���Y�<c��Ay
�j�m!���:�V)�� �p��.pj�#Y0��_�v�C�j��Tb/�t1�0VZ(8�񟛢��,��T�c��b��C>�~]cH�p�<�n�.F�=��u*7��-'��T��@��x��ݮ�h�i�AA>���RE��k7����8��sP�:0ct��sє��\"�"T1���eUcW??�v1m2���(�i��q��h��O�O���GP�{*uN���m�d@Im�����p��Qy>&�X�Lj� jBG߇��|�	��1j�Q"Qo��eU��iA�9$�D�DY)
���,��/�Q�'5�O���mz���W8\�E��;��t-[����?��1�)yO	���C�ˬh�T��f����'�����G�A*V6��<0H�/�K���ځ�����D
�t0��z��V7,��+r�I�A�A6���{S��S[n�uf���$�]��3^>?���ʞl�_N��U��D�4�{̀��Ayyq����Kۑ���3����i�{X!�TJj��SI'Ϗ��A�5��#��ya͕cK��3�Ӆ��,�<��o��	�'�+��!�FY��&�%2���[�7ݗ� �y?����U�\�w�7����=�����tr0�&�~��~��B49�BF�ߩ�ϙ���t^쐽���ցD�E���t#���x2�i�j�P��y�F W��3���hĻw{���8C�s��v6���L�azY-�dV�f�=4^��s�jQ�;,<�$�3��x��&��=S?�<*�zI�NN�ꄏ�x��R���qS�V<�YWF+Ztc)�����3!/�M�.�	~� cd+�>J�;��X4���A�A"p�L�t�
c�hf[�>{��O����R�ȓ���سU�R�}�W�:|+�=h�b�FN��]t�5{��q7��{I������Ҽ�:��@şL4��v�4X�Wv����2���0�-h
w�7{���^�?�u��2�䑼3�t�Ʌ4nC?� R��6��
�-��/l����}R��Z�c�ζz=��{�͖�{�a�sՓ0���6��>`P��b�Ơ�#��"�������-xܢ�R۔���ȳn�zг�]�,tY���>�����uzlj��?v�0�[��*<(��0��V�TPn�&O�x����{;T`I{��7���m(��?�s��==tm�gz�v���5�K΂�LE'�(@�G���t\J�I>Y�[�:w���{�Sp�D��(����'=��u�
,�X��G��G������������'�!��W
��MkC�
|*z9�b��(�4E��g^'�OjF���]��)�S�̽�A���?q��C��F=>I�0~�G��S���U�&�Y0�̢8<���ϲC�)���I�!���~w�*6S-�c�5o��Y��~?��jX4�eo��M�(2�'�|q@��E�+xG�h9��r�����A�zf�z�^�� A�9��ݬww>����y�E߼�PKEePQB�P�"B�%pip/_internal/index/package_finder.py�=ks�Ƒ�+&T\���8I��]x^�d��U�e�%'�bx�;K"���(��~��7إ��R�Jd��������4����ov]UK%Z�.;�]#^޾|>U���:>>>:�'^_K�j��榪�Ģ�ld�	u���Kq)���y�Kx�l��6��j�a�]�ke`6���S���Zt'Ͷ���\ϟ�k%��Vm�E���BT�m�v��T�z�ɂ�>:����� c�l
�m�͋w�^6m�-oKle���\T�J�j�q4Y+�eQ�M]-�u��,�r#�z��0)�w[�J�R�/�~�#
d�-!���bΎ�|)U�'�d��ry��V]�^��|U!=/w�E�=kv�~�~X/�|-�Y���<���V�-"���h�‰x _���E״���uU�U�^�f)�*�-�%0���.ѧ���U�nʮX4u�6k�=}�Gz#z��7�HS%q~�U�m����y���V�96߮l�dWlo�k����Kz6���I5&����la��]��E��N�;�`�ۭ����gg�g����ū�߽���Pw<�´��U�eQ�n�,�{�(Lf�h叻��Jt�?L���_^��x����?�����ql��^����g_9���:!�]S��\��Z%�8��G�B�y��ϳ��I֯d7�a��r-g��
��N�ʙ�ׯ�{�w��?���ȍ�P]y�s^�kɳ��R�?)��'5p>5���Y���B-��t����GC��g"a�=s�VC�x1�Ku�v�����K�b ��3�ω����B��9���vqA�l{�������-����Svf�t��5|X䣢��9�@"Nfb�G�E�{�v���U��p}��@��-[�7z��z�t���+Q�D�oM���	q�[����皃�ޫ�{� Ϯ��8��1XG�_6 ����̳,��8y�/�
j/���%��1�HKJ�U�.X2��J�x�`��%�l���'u����;Pm��)��&��x">?�p��Y�,QՂcFG�@T��`�cS��iO6UM�.�Ƣ�-C��&�)#<�F7��z3���LȮ�ԓ�#PиkoO-�J!�i�a�<j1�9x�v��o�?y
^�՟W�Î�>_���U���s$Ig�-"z��v
�pK�������i��1��(�uӅ�;
 �e��I>�v�)���L�i��N�I�t�6�g�{[@�A�Պ�NX)�ȅT�̒���w�B�?-�omH>��]�U	ZR��o�I�����y��$�{��`^G�u���3ܭ%�Ys�78QAFOm���݇�In�3%�����w�b�.[�m�4��XX�8�O V�NN����G�_�5������]�~������AqQՋ�n	FP-J��۲~��C���I�R��
L?!A��k�րTF����R\�U��	�]i��`Y���[sP\���`�)خ�Г��jQY��gSw	���u(]����e:�R�ʌ,�LC:5aCV]Q8�[c�VZ��ڙƐ�2�Զ�5@M�T#6���2�id��s�Pl��Z�y��Ŵ�W.�Ӟ��3pt�hjk��`_��81�;˱�}k������ܭ@�v]{�.+����!i��}6�U�T�F��~��:�@
"����肽Nz�䲪�v"��D5�v!��^SV]�`
~d�0鸠lt�a�a��#�`��j]u�z���/�<����쎮	��dK62Cȍ\�鿸a���?VZ�*��#Pn.�r	�°�&V���+��my�6���R�We����_��V��G��g/�o|*�K�'��O�Z�+;�����2NC,H�%�C˰LK�
U8P	��=�����vSu�SwI��z>��͞6�+� ���`��2D	��
��T��+��*���I�'�5�+il�
Q�:�@�y���͋����E������ �Qo#>�F�D�C��<��}yM�?�칤7=;�2:�h�R��
��l����R�D\\$�+�;`�H{b뭊'�c\�o�7������V�P�Ǧ�N^4n�x@�*���op��!l�����RT�W��z��5#!����V�~sm�� ��CCՓ65�*p���V��fh�����mzK8�?8
a�NZ��qTT��nF	
��-
�ϟ/�յ�8Tv�oAx��V�:�`O�����wh����j��m��4�5)բ�&�5-�%@a���\�c�)Z�?�_�<��ءl"�'�QyDҬ3����&!r#C;?�2�^�M�G=��R��%��A����o6|��6�ݫ�@�!�.
��Βv��y��'ذ��i��#�����s��.<�*-�
�8}����c�A(/�݉�ا��J�����������6Ik�'`-Q3y�6�im�E��?|@�M���cB���j;�O]I��M/�!�	�7��ssJd��Ѵ���>�T�)
=��q��f�I$�Z/.�Q��P��'��!4oܴ
1�Ĥ��Y��_�㬁?�Gb҆Ezm�)�i?O)豥�Y�F�:S��B��4E�"�ݎҕ@����ڗ�V��Qp��5;P)�u�t:��L8Kh�y��!O'͋�Ӱ�4`z��^�c:�U�0���������k�b�F
�o>�i����z�k���t.t�ۊ�[m}5o��l��X7�F��G���[&el��п�#���G�󞍶�Vzch�9Y�5��ؑ=��l����{����-������҅x�ʙ��#r�~��[d�����Sj���߂�r�v#Anw�b*||�yM�������A�m�|�.ZbzV��h���X�G:�mд�n�1�35x�M&��u���Ų�uL�����4����z[m� �ɾ��j�8�G�a?�l6�>S���d��0�1��S �2Ů־��#��lΛx91�L_aFf�j��(2�x��=�CA�}��MH4��w�\7Jj��q����1۷�H��������t@�!�|�i]�d�P��,�k�k���f�1�(���	���vB��n�W�[����D���{�TJ�R���	�h�I����Ĩ��ȝ@~
�G�0�G7e[k[�Obإ��^�J�R�P/�(=rn��:��
J(�Rjֶ5x��p�n�-F�1{�2YW�9�qC'cȩ9��K)k�A�$y_�!lH�u��4�Q�4;5hR�&6��"������RU�^�i@��y��`������R�8�/�e����(r7YVjQ��u�<�������e��r=&&�u#'�/β�K}Y.�zܬ
"Y���G��g��i��)�ՕT�8��E��t���`������-�
�{C�´���A�Q���3�e����[:��s������lJX@��q�-�s�ʵ��¶�!����4>����sś{^��U/�CE�LU�����D��s+��L�N�;�c�q�南f/��$K��Mѓm���J�4��GvWb*������ӿ�b�W�z+m�	v��YȚ�>[�����'fR2M���!~��Zn9�4�T=�LPځ�右(eRZ�H9�bΛ��?�R|�I�C��G��3�dS�J��d4�Ջr�vk:)�\�n[ו(̓�!
j��<�
$�)�é(���=����t��iʮx�كN&ca���ēC�>jA*�81Mҡ�2� m�,zv
hD�(�o���E��'B�����3��'�M�瘯�?�%1�
�hՐ!���Ԡ�`ļ^��*)C ��j��8����YxI!)���{������s�UB|�Y�$.pw�N��abc�#p>��=�B<���͎,�,\�+�5N0����ɧ��y�U`�DBJp�M�<��334m�	�i>�1�oe��O�V�Yd�%�3_��m�8�#��H� J
2�E��(��PZ�F(iF��7�ap��y��۞�	��ȫ��_b^���o�RS2��fwu�x���'�ų�ƸZ��P�o�q��,���ߘ<��ch��+���`b8����GŠ"���� �rK�E+Q�;��V#�}�R��{�/Ф�ū��w�
�RBh˘�i��H��e]�=�r���6�%�]f�ό>�����E��fZ��sL>a2�Ml��螯أ���r��3@0�mILIh��
��%g�v�nA��C�~�]Mfw�VvQ���T4d�ˑ�!���&@��?o�e o��
��ݛ)҃!x�!�����#U{{C=�w	t����R�Z�F�?�v�i@�\%��\ w0�KN(�u��y���8����2���-_��
��%�4��o|�,�CemD��%�ï˫��tpy@��sZ��H�Y��S�C�����}�[>D]���,3��n�*h�K�_�<K^d�Z��Z�MGL��#lT���.b�ގ��q���˰eR��mz ��?P�$U��l�C��1�9Đ�M�J>��dT*��"�t�V�
/�؃�瀡,=ӊ�#d�1��͹`Å�m��M~eo�f���r'LלO�~��=�g�M�r&pm���;UP$�R�ݗ(���p��яY/1��)�nہ�Q|�ofv,�$J����
�F+j�o��V�t�����rw��蒻��pS��U���U�v��$vV��e}��
{�Iy����f�L,@���
�F��w��2��
��榞!t`o�la��@;�Ǵ�ŎkC�C0���g��y�T�_���'跞�*
C����KE����7
�in�e�Fa�)T�S3"�,�we37�ľpg�Oa4�"c{�Ӿ��&�*��y���)?��uA��{�Ӛ���V����Q��w���hOJ��r7ܓB�ٮf5��Ѿ���0x��Վ�Ȑ��db$���n�%�Q�a8��3���7�nq��o�[Y'�tE�b��%˹�c*sU�����$�-:F�e+�`���� <!8e���S��*7$��%j>��#H�е�!@s�%wx��=��M
�f�(ƪ2��<�/�d�K��!w�3�+��̝&��$<�и)y�.����9b�� `�3�KlP��?i�U@e,��ժ�u*M�5�39�D'5f�P��䓵���9�����b*J���a�Վ������z"��:s�<��7T�@EП�:;��"֣\gh�ϻ��Do�.\P-�b��҄F�G�?�uަ��W�lB����:&6WH#�Ѧ��5���h��^u�pl�V _MY7WՂ"��7~ށ^�fV��JH�;�j�*(W;
Aؤ�ھ]ί!��w���$e%9�L�H�7-��Ի����V���tT���릴�kHkRxr��x�����A+g�ZӖ�y&���h0���� ��I8�U�ҩ��?�����8KV_I�{� B��N��}�K�ҹM!g܇�Q�&�0D��L-�àն���Iv3��=�P�>��4���1�1�ĭ��׬��w���i��f���,��'�}UP*�
3�S������b�.��������n�$���a���E��O� ���+���$)��P�&���mcx�\�O�XKy:�k�
3�3�w�5;T_-�fH����4�(
~��Ӹ!�E�π+�4����i9Q��kC��5Q?ω�j1�-����Y*y�[���`n��> 8��b8l�>�
&RA��{ʨ���o�������D�a�Z2��[��C��h�R�1�i�O�?Ą
�G����1� ݦ��Cv겶��o���>4d�n���%,����wR'�6^[�x�9C=ؔa����9�m@h�pq���a��a��q�;��Z	�Vm%�D����V�q�
̅/�@���J�s�Z�3�L,�!�t�<����.)O�Ft�~ʹ^���&O1����Cc
R@M�|�񈘁�K���J߮sAMm*���c����Ta�Ǘl�L����q��v��f
��fʐ$�?6O�J��GK�M�F�t��'��� ,F��O��?�w�?��G�i�$j�q�?B�����Q��C��V�DG9�
�"�.;�J�Շ��/�`�us����\!Xp6�g�b-*���_(���=�(y�CQ��Y�%Y���Lf'��4&����)6s'L��	�h:�r�V�����éU(�R��O�:3�Q��Ȳ�s$��
�I8��I@9 �&V�����?�ޜG[u���PQLL����b�;�D�a�1|}�����,�P��mwk�[0��t��01���84�_Rz|���to�pM�b�zt���:-咈̂G)�<����^����#]��#{�<d��$Lj����G,��1�w ���)t�_7���.��&%v.te��eP��������+�oC�z[I�����~c�h�M`=I����|����	�=h`<s�� ��ħ�@tWɟ��;`�q���)���.3��Y�,7�R��c���*�g�@�C[Q)]Kĕ+L�2�>g�2���aI�H;8(�5a�)�������#gr�|?�#+��pn*r(:Q͕0T2��/2��e��4�{Õ�k}�YiSФj��..�U��[1}a&���9�FX@r]m���ݰܑҿ�����R�/t}f�3\Y����B낓\c-��:x�
�D�|���%Eb�5����dn��a��R�M�tw�����H��ʱ8��5��~�F�R�G����$5#���U����%�.���ۘ�R�r��h�l,,S�+.�@�PzǭX7~���w�W���m�W�u��DWw
�W��s�>(��7ދ^8rg�x�3�����`���pY����"�^��?}	܋"U]�՚�Cpt�"���Y��a��p5�O?ػ���b�)��W1����*�A_?���$��S��h�Ç36���q�Jx�pIQ���RUaC��a! ��*�nƞc�:S��Q#�<f#:u��2�ݖ~2ZsHA�n�w�>+��1S#�w���%ERF���̇�J�;�U��xq��l%4��l�-X��&
O�e>�U?x�G�=�:+�T�P&��1y��u�k��c�1���ۀ
��T��9�G-2T ���_P��˻���O�e��f���D:�u�,b5��	0�h��%b��{5w�&?��M1@B����{٦|��j�s1;�o������v��@7yT
!-�R4^Ix���*�������8����Z�\AP|Mpe�4�AƯ�RtX�
���V:��� }J���r�p�f� .���7�V��p�\T�P�HZx���2�S3CG��oI�7�At"xR��cD����-���}9"��cӟF�{�¢�xZH����eX�A�[�
����<�
%�s��s��o��
��6��\	���;��>u��ʃ�#�G\V+�X���4ZZO@����n��3�m���J���&\�)o��'w�o"���ɾ����ԫ��)�*��UT�!�=Z�
&����xL��]{aXr�e{HX� /����8��~u�;��m��>� �3QR��◮&�Ѵ�r��~��7�?YK�a龓�!)���ה�$�b��J͘��JZ|�f0�ņ���{�e��-�U��=<����-�c�)��(uWO��Y5nқ�e>�����-�1��{�k�1�ё���]�L�񨻸��S�g�����\��o�'.��j+4�l�3
���8ˎ+ex����,�_α��Xd^�1gA��y�@��۞Jc�<���?��W�r�DBP���v�B~C@�Ma����v�Ò�-w�wòW��q�A#�hXl���(U��i��Gw&M��[T�!���}�9��H3��k)��c���ޭ?�E�����7�'�a��p�"h^,@��8�o��\O�y����/};��D��)�x���qP��gڳ�"��jCg�>�x��S��i����
БjxX�X����Է}3Zzk�A�i�nB9�{��i`k
N��~(��1��k�/w2,�.�]s��`N����U�7\4��+�+�)����[�Ŋ���"Y����Xhl�[�aHx&�t@t�"��Y��6^��#g�rMT��IלذU�a	�cr����ݛ�on�C՟`�I�������*�G�,��Yma�a�=�A5}8žv��ur��N����N��~�`�ʶ�B�L `i�@�;	CW̴/��H�,>-�p�(C8�Z�H.=5&��O0�8�X�B��V�5!%���K�EIR�g�	x�t�%c=�
&4��赾~DETE�7!�{u��Oh�	��Ne�d�V�Bwy|���c��?qlZ#jr3���ι>�"���A��(�R5NI��s���	�v�F�iPK�i�4��uLQ��VI��X�(w9:�7�Ou	�Ǐ���VMS�e{�00�-z�{����&w���f�5{����l�
�_Tހ��/��ɍ�	�i0�rabSZ�X�Zs�bEm��SbƤ�Ԩn״��κn�����J�W���X����C)��vJ���+�݆*[yj��c�'�Q(�|�o�˥4�O���FĪ�s�:r"�Ox��2�2,Qa���z(\]�	�=_�� y�<&K�%�A�:������g	�ly}d�!�8C�G��}2#���&gb9O�-L��i|W�nA*7����u=��U���`��-o�/@�k�3�18��QA�PKEePQ{�(�;? pip/_internal/models/__init__.pySRRrT(HL�NLOU(�H,QH��+I��+V��OI�)�����(qfIfj����PKEePQ�,�b��!pip/_internal/models/candidate.py�R�j�0��+��!6���P�Х�!�-�R�X���$$m���6�.	�:ȃg��7�yۃS��G4�����Nn���G�AY�w�Gp�����t��2����ҁ��E&�5>ˀ���ު'e����(L�ۇ����eu-�W믄�n��t�wk�ҏQ�Zep��n�ݤ���2�2!J�eL=VҴ���%������ǀ&��lL���f�S���5��d��� 4��#e@Gy9�|�cq�](��U@�1�c=�\=������=��ʚk�x	kk��f<�J4�g���n�;S�����(=ߛ� 9e�}��<`5/z(����f3���`�f��_jf�b�x��nԯ=�iУ�K��&{K�c�{���V=�/Nw}IyZ�^ƹ̷�e���?�=�\�,/L���1����PKEePQ�׿�-�"pip/_internal/models/direct_url.py�Y[o�6~���>H�"�{��j4^�ɂ�	й��Ht�F�4Rv���;�)R����)u�s��ᥞ瑳�����y^�ͫ���(=�כ�rN*VE�Y�I3'���\�h^.��<�ٵ^\%\P��ȱ��e����H�hQ�\D��bō�>y�>~���͟�������^�M7�{~R�+��������1�L�s������=$�UE��˄����
z���Y�y@��ߌ��w��p48����d+��q��1xa\����2����8�i�������?�}��N�{q��A<��Ã����5�q��q���6�Hj��v�Iβ�r^rk�����s��[R�t���s��y"�&�ޥTF2P��`5petJ�Z�YH�]�4�k�[
ـ�d��Ӳ�
珘?zH|��XԐ
H�Def<����% ��oe�罥5Y&��*Xd ��I��,)gӕ�Jj��� ����	+Hvh0�i��[���>��2��Xg����	�A+ҝ�KNX�ц��%�e�A'X!�H�/��D9�O����u2v�?�2Ú-���)4����C�E@�'�+�D�ɴc��2蹣&ĒقP��0?��X9y���Ή��{߃�����/�U*)&��(�z��u��A_\N}+���n76�bac&�a���@�Yp 3.Pj�T!!��NL��ޜ	��d�rJՕb	�f�-S!G^:`AN�&�y��f@��z��kt?ʛP�_L�Xٙ��:�S�C����ϟ�~J��Z2�2g.�u�;In��t�4_dLԪ@#L�k��=$K��[ps��F��s�Ӷ�f+h����!m�,�9����E��s@`u��4���X��Mp��F9N�m���@V&�K�e!{�����&�(�嗳Ɇ�8�Ռ���P�_���<.t�.�	�5�܎�Rl���ޢ6O�\����zVfm�q��~�C�3+�&d.�;�{��6�l��Z 7Ug�
��!��mFڀ`���Ymb���,�rn��`�u]�v%t������X�]�*���M��ֲ��8�o-7�d��"ږ?�|���+�;*�	i�^���koIOh�p��=�W!(��O�[��J�N��F�|KK�&z�}�ڞU}�xBFi�j<�Ora���,����P�OV׿v�6Xk�H�^൷,����`�s��.yU��|��Gsȕ|��+#�X
���n�-�FԂ�[�Z��k��{����V�%_=�ˀ^p��dy��K�
/�֧�,��,'�z��\�:/S�ސ��Mi3e����{��wŻ�j��(\b|�
�!���*g�*B�2�������&B�98��u�6s�jom�eO��-�}�3�7�����72���P�5���e���.�y"/倚�k�nA��O��I�Qŧ�g�Z�o����,��B4���%i4�i[o�d�,��&ΰ��u���l�`=��yi
�╬�+��ՕUVpۤ$M��m�&��"�b3�L���T,�]H-zT4�>pjk9�Ԩ���7�ZJ��R%A�3:��46��z��\�W�xʓ�]�Ȃ���R����L;{�t���n�z�߸��빛@�/4}��Iېݢ�;LuO�Nu4�T�
k��}*rV�o�F����D�Q@+��{�{
:�٭v�1ǟm"��C�yz�$b�P6�e�l��f��&��n.m�ڑ�m.�X*bܶx<INt�K�9ЬUp>V��ĮMr+��*?��e�	_n̥��;x#]���Jt*�-y�ҕ�NY�PKEePQm��?�&pip/_internal/models/format_control.py�UQo�6~ׯ���PYC_
x4k1,6C#�c.�T�4�ߑ�i�V�PT�D�}w������vbW�T�6��7��N���wBZ�N
WZ��K�
��f�&�
��(.k����	��߅�:���h3����qG>|��3����w������W�e���,�2�'���$���t\�
}fY�Hn-\j�qw��3Z��?l\9��y��
l�J>�����[�l��@zv�A(블���,|0f�v�1X�u�4���Ǽ�\+�x���[ܐ�P�1VX��
��J+�`�V����S�+(\S��֙��
��JX�"�16��9n���+ʩ�$�y��?�r�)~�NMR��ߔB�	�n�f����=�Z˔G�3U
��3ڈ�2�͠덢���n'�Cj�6����~�i=�v\�����g\�V+�;t�93�|_�z������÷�=��I^Ѧ���S������8� wf3���sO����鹂��2��YM�Iύ���1V�Ŗ�ٛv�	G�R�8�t趺�mI�$��w=���Q�-��˞��qs��E:�ҠaaX�_�S0k��8�n[,�����b��)I�ɗK���l�˥��𯃀�_za��;�
z��u� �L�FtLn'�+��MR*+j���w"ٟF�F"7Eڽ}�m�-F�t�E�#]��U���ho��Mb��%>u�H�U�=ž+NC+l�M����m�]�-,h4-�]�8:����P�Adf��Z;.�Y�M;k�������_��?
]�B��l���_��A�|��O�d،SBˌ�{l�xюBㆠ/�H�xɇ	���
���kuo̟��F��8��Si����ŀ9i3�/�F�ys�9ŜˏH��{s�x������7��/о.��^P�$ϱ��T�ϸ:�{��PKEePQR�
��pip/_internal/models/index.py�SMo�0��+F��Rr������V�U+ˁ��ul�3dÿ�1$4�&��`�߼�zn�?B0�R't���su�'���֚�c�!�H�`�V��e��D���~�������f k�Z����1��"a��v
��O�A�d0��kJ� o��ʔ��Rd=�R���\��א;d��d�dlQ]���d�����F��>JF��Gm\�{
�`+��3�TAh�u�|
w\.���<�BA� ���O�p�P0�
������A�T*��T�t2O$�)XÅ�����;�V��B�]qi`�O�F>pJ��rӉ���#y1�VfϘ�����=a��|�?�8bm-%�~ؿ�0��Y:Sw2� ��ό�i�Z ���0�'��;RA��
��z����ã�%�_V}g�Ҁ;�7�Y4f�N2�dT�|�È�G��T?�&W=\���p��;�@��&M���}��U�n�$��λ�c��yVf�H�}T�m��z~�/PKEePQ���U.pip/_internal/models/link.py�Y{o�6�?��R*�b�>\���Ũ���^�۪����%��z�����Z�)�Ebk�y�f83��M.�&BMR���>�T���&����y�3�M��L��̲�T�T*F�"v92�]��k&9��B��
�i��.g���������ק��~��ܤ*���	��d	�uD���-�F�Y��Lg"vޱL�=�D²����_T��؀�]���q^p/嫊��/��Doޞ��1��pqqv�qN�_5���Z�\|6Q����3㛑��S�S*r�N��"�X@>pXmx�֤<aa,���Z�J���w�t��جk��Mxߚo��$ΨR�<�w���u�����)Ƶ"ԦWB2`�)���A��ȩ"
4e�|�:�$L�C�LhEdNn̊ym34A\g��=�L򸫒},R�.�wz-��jG���������k�F5��|��v&l	��6�j6Ųe#�$A��c�fDiY�6��/gA��J��7��q],j)G+Q=)��0� h���0�>>�kY��n��y�$�P/C�~OP]:$A�<�t���K��<T��1���	�-�����-�Rtg$�JS����l�L���l�2.E��&���=ȁ�aWA�yo�@1��Q�oW%�ᥡ��%~�4M��d��,	��8��l&����7'!�^��l��2��v�E	
:��:�f����B3��!�eMW4������N^���J�Y$|6��8����6 ��UK�0! �R2�D|�]��%����f�R�`bY,�9e�g��,T�aDž��k@��r�K�[������ʥ�O�Q��j-�,���<����5򞵡2���2T���Lx�Pܧ��Ĉ(S#6����w�@��<��+��C7e����16)o[3�.0C�V����A��w�6Z�i
<��$$���3b:1��R<E֊q&i�� b����i����
اbS#l�/��aي)G�)�p�l�^�E[�ք�}@BU�ZmS�������)��Aisw���?i���i�@�wfJ�ʲ5V�ע,}�DM���=�"є�v���8�����u]�L�KJ8���v,�M���hx�|iu�,PvW��&q��Y���Z�㊜I'���a���nnz<��Gf\����q�����ޢ;\��%F�@5��!��!��Y$sP;%^�3�>}����"ސ�&c�!�Ӟ!N�m�3]HN��>����\��m���W'�t�`�^{��a�Z:�}7������0���[���	}�K�jE�s��Q[<&��t�Xh �F2>��Q�M�:m�E�X���hx���nFp�
y;/�;zͪ��e$��3F��������	;BRgL+Pw�mIc6�v�V�΀P+
i�$����Ӧ�}��r���H������w�P2i�E�Sӿ��8-$E���*�u:�|	6@��|��f�K
s8}v�9[Qӊ�jԸ�d^+��~Z9cZ��=I�{�0#v�r\�%_8�6f��}C��~B��M�_^���fn쉲u,����l���&£��eAm�s��S7#��D�a��f�����Ե�
�ǂ�̃���:����
n�.o�N*�"�Z�@�13v���'�7/�Z�ܻ����K:�#g?���q��V��Q��^�-��}��F�r�P�+)��;��P�m3^f��ĥ}�A��1�����N�9���q�;�8>�����u|�7�urt��&9�;z�|u���kߎt� ��?�Yi�~���q�8�?��LJ�?ه�g���m�%�X5��֔��i@���W�j���hJ�0�c��5��t�u��H2��J�N\��!U�X�þP~i�
���+U��������]3�ܣ����sݿ��+���3T
�타�J'�P��HB8�GvE�1̞�����F/,������b3����}]�;�<�ҩ�ؿ�)���#ɢ����!x7^a�}��ܴ�����s+M7�%��H�쭨�Ɲ�I��`�1�Z�'?���� %�f���7�Sm�мz�P�0PO˃���(��pL���C�i�@���Sz^��'�PKEePQK��q
pip/_internal/models/scheme.pyu�OK1��C{�B��<�T��Dd�&�M4n����wv��U�K^��?��F�:e����9ـB�A<��cD	���^�+3@XSK#�
�M�-�p�!�*�~7`�@<�6�B�2&2^��l����*��|V����{��5�1
�Vm��4T���7fyu��[Է��%\��S�j2�I���HO�(s/���� 
N��5;,�'i�LVN�t�#��O�1t(�a����/�>&��	\�z>����k0Kh��ߒ�z�}�5U�g� �c�k
�#�:jtCh����L��~�JS�����鮢#��v��"�о�P�u�*�4]Q���_�w����:�š�qoQY?�OPKEePQ@J����$pip/_internal/models/search_scope.py�Xmo�6��_��lc.�u(Ȱ��bY$-��TZ�-6����oX����w��0`B_,��x|�UV���zc���jA��N��4_Ʃ�B�t6�Z��B<��<1�"���K��cG�X�&W���O�"�cM���K�K���Ԫ��N2�X�����*����N�v\�|���W��d�w<6�Q˦�E�?)�)�¹�YuBbͬLD�#Q�4"�=m�
`T�������//_�]���|u��l���g3�'X�[�P��f3
��켎�I֖Q�=�V��p��Ha��&6�\�����,l0���/�X���K�|*a6^��ހNƔc�ɷjW�
s�,o�Q��.��ۻ�!�����|��!^���V�?3�S���DnYl%�X�wzb���Kkq��#G�P�9oo�v��b��F�Xr�W��]��+z^��
�
Z&�H�&k(t���|��#�c�t�9!g��L�L�]���3���+��Ok2�āmddž�Ӱ�%RU{I�,5�d��p��g7�y{�zڱ�"O�����%�ӔD��:�	慨N�*��Ui�>P�8i��;���j�z8O��C�<����D����S4�@�}B��
P�Q�"%���rek,#I$M�6;B>m��"@�.���=���صOKZ]��a�8N�ByY[�0NOm�(Փ������`���G.�|Ad�����a2-�5�8g�?��$�z�E,���D殟)H2�09i���4T����yӏx�
�/��;<�(�M$���6����a��S��8?g���-N�ȕ����Izc�I: T+?��D�8mh>���X�n�%�,T�s����(n w�z�؎���-�JSt��� z6`��6m��͉���o�s>׺_DM`�;1nD�J- BU>�ڍ����\�\��=Vi_�B�j_�ӡWG["�%,ԙ�$�)�3��ʊ�:����z�w��C��k_@�F)LiY�%-ގK����(��n���	j�����#v�B�7���,K�Z��x��`�Jh's4+����=x;4�#;R��Ib:t]�,�(j��)�U˔��^�%��̡S����'���6蔱-�~-%���ӯ�~�ͺ�����z��HF�0%�8��]�OYp�Д]jJ� V(''�ȇX�Q��Q����/Q�x�z�B�?���TVE�r���#-e��c�?Nj�pD
k�*�y�r�/��;�<UW���E\K/.���!)Hw��{�+��.��v9��j�٫.�S�MϏ�>�*�[���,��t:|��:����ep|է����)�4����˂`ю�����n�5%�y�Đ	[�_�2����E؜F%z�0��VYL��Z��{uLg�Jc���km`�ǁ��8���w�h^�쎔�&�0�a�D��L���?
�<��[��X��F�,{�#�S ������j�@�dQ����k̲�W�4�~�7�L'~@�{0�W
\DS��s
*-wi�">���
-�Ϩ]���uqa�D��)}�F�W {�<5�*�K���%�Z��M`T��;T�vB��=��
Lm$Fze,��1�t��
�d�
S�����A������h.|7�`�ng�PKEePQ
�0��'pip/_internal/models/selection_prefs.pyuUQo�0~ϯ8��D3i��Ĥ���4��m�TUUd�K�0�g;m��;�I�)��}w�ww��Q;�\���d"o6w{��#�V����]��r��V��].�.?g�O�2���Q�?����Sԝ��`kev����(�9߄�E<̲��Z��Kue�F��D;Q�txy�F��}-K�m#�Cn�P2Y�^�vA@�рJ=K�XEI� �\ZDŽ�y�\��{��(�P���~L���3��j<���>�2��,Z�&=��X�3��5�����`a�_�
�B��F��C$�����R4w8f֬��h���R-����P}�hYNU"j�Wh,<o�
h�
ԥ�\V9��p:VQ��n�Pn�A��z�	�����o۞X�D1%HN�6(tH��=IB���ǖP��
.�+�I_Ojv}��qE���^��J��͠g��
Ϲ�ݜ/���ӹt�p�h����4�FI�OK�#�
�F�vZ�O�<��ˏ�[���M�`'����Y�1�̰]R��i5F�`����45iU`QZLfAհ�^���.��4�w�|������Nk>d�vh���f�g�í��CB)�v��1%Qc�=��{x8	��E�-��p\V��

�־��H�PM"o��+A�^7a¹����[���ۃ�玸?~yZZ	v4�G�4s|-�ލ~�Η��<�����y�U�Jև�Ϗ�w�y}�����%�gl�"K�C�l�y��S����{�S��|���8i6�&���DO_d�PKEePQu��	�%pip/_internal/models/target_python.py�W�o�6~�_qK,*��ۋ�l+��A�=���m��I��hE���Q�$Jr"�-������R��Q�7��,Y*�F�UN�e�Tr'w���N?X��^��p��J�y���R+D����T�\�$Z^6r�6;�*mN����t�sY�եT���ߟ�>��y�g�������G���l���5D�KZ���ҡi^$p_���zi�ãP�6���?�2��(�
n-~7���������rՠ]]]�����Vw‚;
(�.�q�84���]��A+�=:�o����𵲎x�\?�B�<�2֙�_����4�5l���$�0-����^����O^��P�S؆oJ<:v
�:�݉���{�����\��RI��q'oE����o1j	�5]�XuW���l{�Ћ�J���c�#�:Ka�^�Y�:ճP����� �>\-�h�Jn����
~$�#YH���=4���&;"�H-�l�D��nt��s6����P1q���#n�'i�I���3~��q;�J�ݤA�3�Z���bp��yoF��&�3�Q��K:������Үw���N�&qف�T�ۛG���EVX0s�bL(�h20֦t���U�p�i���X��/O6��Y��~Y����"x�
��?&�6�K~OG���<J���H��9VxP�k��^M;+�EH���K�W*��6������]p��n3��q�M���o|ٞI>�O�w���
�/�XhG;Q_��xt
�*�r�&��(��]7	.��:���`_�T�1^a2��Y��.�>@�<���vH
�7B�H��z1��?\z�;JV��X4=m�7W�����"�}?C[t�3���
��A�k�Dì��暂�x�4��#�,O����wM�l;Mi=�-��Al��L~.0zTn�̞�v�
�|$�����eۯp��9�€��N���`
�/άZ$!��Hph	�G'��#�ϐ�u�:�Y2�(���rpsa[|�������`
�b<z��b�L�����"�5v˞���%jG�Y�}j�Ct�g���;������2�(�*͢�>������if�M�S���0M��`��&���{��L����k7
�X��O���Ğ-��pG?ZVX?���ғ���ͪiDV�?#�k�[�L����b2G�����|ymo�u�(К��Pa���3m�V[F�n|�ƺ�L&�� ϧr4��v��Rt=��ɨ��fz}D��E�PKEePQ%sٞ9�
pip/_internal/models/wheel.py�Vmo�6��_A�,o6�-0K��H�`kd[��IZ:�leQ �v��;�z�����=��8�o����N(�]b���Ee�F瀖,�7�/Al��f�D�,F�9-F�Z>(/�jb���BFqGzU녅(�[���d��27VV*�����‰���j�ե[�B�.��kS֞W�F:����D�/r�u��W��1�՛�7鋟._���q}}u�c�y��4����h�(�
��0����C�!��b���u^Ji)� ΐ��U��	��g�]rq�=��{~|>��\��F����J6�ֺ������d���j��h5��KU(�ou�;�]��k�rn�_!�Q�����~�풗����"EڵO��A1q��	��0��v(���ڔP[�����*�P�}}��%k�Ш��*��5ݛ:4�*�T�i�\)�-�}�)�o�7u1/�o��c8�>bJ�D@ݨ�Bd,�D҃#�~|�j��]����.֬�d@��PZ@!d��Hƃa�e[�@��1G��|ȝ�DZ��@�!`�TtD\����D��r��d��r=#�O�}�&xR'ӂ�<y���IM�Y�'�5��	�0�8^zS��4�O��9��f��U���@�����D�at��!Z��-^�cW�P���L�*��0������O��<r�ħ��p�&��؏��!����SZ:䴯��xZ���Qau��fR,��A���ă�o\𬠡��}�T߂_�0���\��{�ᬆ\H�Ƣ@�l�'���C��뱒bkܹuE�6,�]��?�=v�)��#�\
�P_��0[@��6\�8$�m]�P��uB�-5�49j���mx���*M�Īa�VU#w�ה�w'A��Ђ��dh�%a�\G�
7�Sy�qk�)~T�g�����x���*ه��J������(s��F��_9s�a3�����*�pi��SqE#��쀄�C����V{O�Fja'��h�[�$��͌)z���R�[$c���5C��;AT'���|�-�'��H���S�N�PKEePQ�J22!pip/_internal/network/__init__.pySRRr��+I��+V((-JͩT�K-)�/��rKRSJK2s2K2S�������PKEePQ��k��-pip/_internal/network/auth.py�Zmo�8��_�Sq��S�]�>�r�v��n�H[,A����"�*I�5�����;�b��;Mm����$��r�=���me]�f-��6�b��d�,�V����o����o}#���U��ĵ+R�)�`e]HZ�m�SR���
㋎�����-)9�p��A�v�Y@��$lCZ���z*��I�,��c\��m�@c��p�#]�e�m+�37�^���|�4%���ֱzdu/kdK/�R�?�̋�U������e�i�]�\P�ù��D���.�բ�k��Bܧ���z�v cQ�G8E�9n�Þ���Z�p������<3�С�;�����򗗗�����^_���L�P{*�1���R����hR��PțZ��E{X��1;���a�gM����
�����ڼ��c-õ���_�x�������],��(���2��7jl��m��y�Z,$?h)�
�遣 �ҲOł~.i'�k��%���v�9�b-��^�����`L�՜d����D~�_
�Zq_w8`�'�%����W��S-al�
e5��bQэ��@Y����5��+���8}A�Vb+��N�7V[�j2x�5�=׎/Q�D�,	R�m
JD��j5{gp��a뢱�Z�3�TK�~5O_8�p��>8M�~�M��>H�@,���(�BJ^�{I������?6Z���.�����@JC�J����`8ft��hHO��Aѡ�b����̒I�O���Nv�co	?��n~�.;|Bv����݉�58��a��=N���󎔰(`�L��M���j!�}a�G����A��=�Au[�ϘI�9�_��X�f��a��=���[���=2���}���]a��1�cԃs�|�a�q=�G��?����zFuh@��)�FD:�Nw�⡨�b�	nOɾn (m6�Ȉ������͊�,�P�w��C��	-�J\�pR��>h�
��y����Ƀ*�dGE�	M���J�
�}���D|�@�,�y85�,W�)z8S�m`q�N�����'lk�bT�v^e�k���m��
���C��s#$�4<�|��,�;�xS��k��kK�B��*vŁ(�Zl)K�Z�
wJ[���AC8Oc����0�Q3l���h��{W@̖��%e��`��!��Ӣ:8��đ���m�k0ɶlz�ɀwh���km*I{��m�+7�o��S�=k�3��Q�9��e��a���M�;L200�q��LT�cz<�ѥ���3X�_����Q��2�!Y���o�s`^&d�����5��|��3�Z�}�x�ն��`
��FG�ц�GO7�N-��Ȕ萏�w:�(�U�5"� ��8L�@�葡v��wXӌB!��c
���[��g�����d�����2��!��R�*�IwkZ�D<�#�l�X�BS!v��<��!�+�aY� �E[Z&�)���B�{��Js&���YC���'���ܓ��s�2m~���=�
G �S;�[��<�O#C�4F$������h�>$�~����J#�2YMJY��7�o�MnҾg�"�[����������ܡ�Q��S!��PHL�kϤ��C�Q:>��G�:�,��4�N?�$���t��Yl�p��ԅ�`�C 
�����z�M^�@kǸ�*�F]pA]Ō�M̓H��{nE�u�	|���1N/t�i�<i�0�Mj�'i��Z<Q;(��:=G�������9��Y���"��c���Rc�Q"�_+쩊B�ƮxTq��sZ�p�	<�,Gx���I#�	��2i���+	�Y=��K۩��b��ضoKզ��U���F����4Ԏ0U~<gƁ)P�쓷����ag�S(\Д�����m �aK�����do
�d~�'06�9�姾�a�ё��'��lmC�4�fA�H��R	��!s�Qcߝ��d�0������ιO�%k(��@#�2�{8)i�`��$�t��O�����͖��DO�K��ց�k�ɲ�W=Ǻ{p��
�H��ف��+�)6`Z�M�9���Y�j���[�z�F�lR?���W�j�����W=k�r����bS�f�~q��z��m"�`����@ǡaC�А2������(WN�sO�3��OV)I.U/�5l�Pn���5� �@�2�(�
���aCH��
U�T�3S*�]
#�'�y����&
S��d���J[/�l�2�MI|b#�T	a(�t�y�G�`"�Fo�H���a������("1\H	���{<9�Ȫ������b1>.��ZH(
p�2�����J��sX?�&X�� f�N0(]�@��4Oq�]eM$�yz��I&���D��|'��1ԥ�<{a�]Y/���Ff�|}A�+���2^u�&���nWj����(�������E��2(\���G
Z����.r8_xy�L��+'��F�dd�)���[��!���[�Fr�B�,C��|���"�#���ox��n��-о9�puRI�Mr��I�ܮ�9�_>�z�q!Ut)y��~_𭘎����O/ڃ��z,��$䶁8V`f]��#/O1�I%_��U=E������>#��n��z�'|�-Hǰ!,{���f�r�OJ�.b���hF^���{&@4��u��:���p]sS��z�Ŵ,�+/�՗�:�0��p��@�|�Vc�;̕��oS�O3��r7j�"������r���]�>�	�%����u�ł�Wz�I÷+��\dR��T$���8&�XA��p�4�0D�3o����)4�h\Ä���J�s�u���7T�B�mPI(C6�ƃ��g��7]�����&��J�]��a���
s�IP�o)���'���#!6}cYL��L��ܵJ:���å����p�vf��%�����5h��qu��tH����[�E9���������z]Չ�7RS�ڔ�yfPfV�;�$6Z��( \����tэ��e���J�Q S�6=G�B�.J�q3�8�v�)6��%���w�=��a�Vo^�Qو6by�Mϳ���EWy�Yy�
���"#�|/���ʃ�����̛-}PN���z�-�̪ѽ�0�L_i�ϻ�7�DMU��9���y��蝽�D��lys��Omg�~�
M"|i��*�<|�k������UQ7�m<T/p�PKEePQH�@�s	pip/_internal/network/cache.py�UMo�6��Wԃ�T�.�qc��$=�!P�ȢM�*I�f�}���v7�%�H+μ����(M��?������=*ǝЊ%i�&	��Ɓ�Ikt�V�:)*�'�M�D�La�X�C�h���2Z���O��[��/�'��Y�B��2�ψ�Y������ms��6�K6:!-k	���~N���I��C�08Hzw����Q��`�s:��猿�|�R^�w�g����ۛ�?H��?^_$@W@=F���,��p�iI�-[��2(���G>��Q��Y���Jk�
��(xD�3Kr�
�p�%eR��^8�׷�0P��f�/�ml���Py�V+|dś�HNUg4��&0pF�ғ���4Z�Y�̫�U��>'2�l�,�.a{n=8*^Il�\8ܝ9L��� P6�~�qp��}z�	��w�!_�NU���t�O��ſ��>{�oP�q	�;Qw4F��N�hp�Y{�^	�
��pX�z�!�)��(� n�
�p��J3<�a�dS��2�(�bܐZf�	3�ZN�)�m'Էo��m�m�~`�I���|�&;R��VΖ.�5�؊{��ؐ#����Q��E����	_o��E&p����VP=>vhh��mrFK3�x��禱��;Q	)�!���N��,M���a���7X=�NG��#]�K���i9f��Ƥ��� �uٔt��C?���a���@[�dOZ��X���|��T�R?�7�4������>l:t5
����\���g���U�q
83�Y�B{����G�7ن��R+`��x�K���?懰[�@�<,z��t�����Wo
=�I��l�|?�Y�|�"PܨF�g����ď���1��]���PKEePQ�
{Jj!pip/_internal/network/download.py�Xmo�6��_��(,m���T��$m�vNФ� ���ȢG�yY��;R�HYN�(�����;�L��}�Z�o�"�\��F��dJ�ּ�ZHU$��$�덐�TK�>�\�v�\�5ӏ�܂PI��bM6|S�w���,$�g˔V�ZԬ3�����x~Y�|�(/N�:ey��liST
/���
�^ޅr�m��;^39��=Tl��h���{!oE۲
w���������������j-*Z��;�U�GK����V�>=iB�����O��CR�X��T���V��@`��V��1Fw�檊
��5ե�2����.�V���[���i�f�I����/P�������}������j�5��vzӰ����&��>u�J
�����|��}�]� �����$�$L���b��G���eK׬,�$Ij� %l�+�7��"V"ſ2������.���z�q�]�sZ>Z[D���\���b�(t���Vi����K��^gFĶI��͖�F����}]�}������P6�m�de�e�љ�Q�r��<��i۽�VZ&ÜEa��Pru��"4mJ(��T[t2�%�q#*2��>/�*�ㄤK�nMy�'�+�bj%�[lJ�FO�g��+���.�Pk��.�ٱ6L�_�j_o)R2����_�e�¶y���a秡��71WJoI/.D:���g͹��T�<p$IH$�U���X	���b��}�>�;֤y�;�t��7b
�o�yG�y��^tߑm��S����r(ߒ���3y}pp��@C��qͶ�	���!�ݸ{�i�"�;=oU%I���*N�l��9YӇY�	s,K�fǍ��\8ˎ�J�C���}�°2n���/:MDå<q�r�tgI��Î�8�Lq�Wbi���u!Ul�^7T
���.T��u�5Y�	��m�9[N�x���gt9�mF�j:o��f�֡���a�~�3S��9N�>��ki,p�
�̬��6O�ny�9t���/ȟ��XG�W
p7���I�%P���p]�;�ih�n���40�"����9�s���̆���B�`���u�n�[e߬��Ku���LC�	t(mz���/�Z[rryy�n�4��7�������)�	���#ȓ�	���7�G�]'P@m#�-��ڏ`����
�0�%L�ʲ�.�:Jt󐅙���s=�F����3�=���n��r���/�����!]�H�U�f�IG	����gd�}�@�iN�]"?�/�ٌR��7�!���U���;Z��p1�v`�f��L;a_�Q���Ǜ���v�YM%���<C:}y|�]\�ykm����y�h5s�>l[F�3���G`7����Z5�w5���o��.6�x�p]�=$kypݻ���ä��i�96�g!��z��+�W�pz��=:�#7�2ճs���C��P<�$�yy(��ci�=�f��$��ⅸL8!�#7<�]������{���;[A����
�Fl
����z<�L�de
�wC%�y!ؘ�gbn:f�T�~�!�ϑ�Ja{x�f6�H]�;5��G��8L[����?�y��G�`�Y�PKEePQ��A�
�#pip/_internal/network/lazy_wheel.py�Y�o�8~�_Ad,����cn��\�n��&A��5��h��L�H�����f��Dɲ���!�%�O~�f8999�ȿ����;��}x|�;99��gY�����=Wkq/�S	S~R�*�\�"�l�JS�+�o��Y\�l���	[J#���-.w��L�ʰ���zS��I�J�RfrY�'[��Zh���b%3Q���[�>
���=����β��}2�@���BQ�U�4ב��h��"3��������c|��������}Q#_@�h�4�̷!!�x)Q>�)�J��F~>\]����搣x��ؔ���{*L�+x�l*�'C6HwT�
�ֵ�?���b���=��tss}��aI��Z�xZ�`6�t"L����劼����\
X8'���u��P����	@�,�2�!��Cv[�j���*p�~�;N�Z�y�
���{�վ��M3�P^����>�FIƍaG�Kp���nbS��b��Q��!�O!sv��O�Mq���֓	����	8����b������m�F����1��O�#��Ǎ4�g(LrV甕9�U�c+Q&�R�5_�7�ԃG�K��؊����!�R��	�W�
`�H��������*�TF��z�L��L�%kR���Is*����,7�������`�؈��}y~k��)%�I�4�c��H
F���/�=F���~�%Hp��e`#�y��-+t^�I�E�4�^L�7�-���\�\���
@^�-st�ċ��H����q8�+�dJ���YQ�ݭ7�"�{$�=�0	���Is���a����;��S��-/
�"|x�m��^Pg���Ռ�M�*��=o$�M/c�hW��ۍ�0hIK�M�(�2B�����`N+M$�d)as��v?���`�8�%q���2�,����l��M|��,�P�P ��U��
�`��D��(�$����7i�ӫ��l_"p0>��8Vg����Y�!Fq���"Əm��w.%��L�5��#%�"�||iA1�HKƋIOԝ��%��S	/E��k�n
۴E�XE��ע��z�W�B/w�0c���^�e0�H��M	��@�<���l��j8�4<:��cM6"y��' S��@`���:�k�I�j���m!l��=�<{�;`�eT����z9>���9p�G�x�+9�v��d�v�!Kʍ�\7���̷�Z�Z����R���ض�2[G��<�j�5|��d��ǝ�(�D��_;&�������e��.��4Fi���vQ4VrG�D�ӳ!jv�c��
`Ȫ@8т�%s5
��
<ݺ"�?\,JйI�4�f҄N�B$r%��@�2=k[��9[�]ݾ��d�@{/�)A\�{Һ��;,u�z4�:$�6pl�������*�yZ��q��=*(����!`K����CΞD^�B'Qg�v�� �V�����S��Yv^���v���U�2p>�����,~HUS�����]+��#��Н�VF�p6;=������!�.�Z��tO�B��gƗ&ϪR4�<�?�Ct� o@2�~�k���K(uS����7��=Ц�Ĺ�]�WY9܃*f6y���_g�����svYi
徵9%w"�X�K�����
�lmZ��Tpw������Jw?<���8����ܷ�O��\�{bO�g�o`#"��R_�����-��6m�hڋ�e9e�ȃ�0j�-�*��G�m�Ҩq	-""9�L�wL��}i�����L�9p����b p��n��.bCu��4�x�/�]�xI�쾹P;��@C]Id��T���7Tl������c�9Bx1�b�w�~�f^v�G_�6/,��e�'��ϖ<��}��p��o'RH�6oJ��v�;)��y�B�Yo	�!f����Z;#z���k5��ę(�E��TLЬ{񚲳6�flm��@@�[`��~b2�^��Ig
��}���2��6A?0:��31:4'���im�aP�rTzc��h~�'�2�|	~?��3���#�N4����Gz
;S��cQ[I��n-֞Y;�q�혨{)��ۢނOd:����Q�;�6�����^�g�=���q��ru?���w���7Q�h&
�))8	u�V/��:Ϭu�Oi�x�=�
^��qI��o�*��D�#�B��6������96�K�
����U�-GJ��=p�iFq�����צ���tG�C<�x�q
;HOn��뎭���[~
��XI
Xùd�*5��w'+4����4��wj�1��L�UQ�_�hW����E�O����e�;\���e�����y�0K�x�����[k|>=;�!�	��:V���=�{�]�>�P�c2d_�g]pች�J	(���7P2Q��5;ߝ(�ٔ�����L[yz��ՋU�Ҿ��7<���2�4g���R�ܠ�'n���\��t�_o�&m��6�<t�:����%���gMD�Js������ym�'
�_GDm�mN:��
����p��[�
��$&��PKEePQ���h; pip/_internal/network/session.py�;�o�8�����)x��u����}�dӴ�lZ�i������׉Ro���I��p۽{�^
�?f�����y�{Y,�R2��b����Jf屘�oVq�aOV��D"�kM2Q���⟵P�]�M]�ʂ{[�$�2�x�7����`�<I�F��"����u��T�?��qh�S��\B��X��.E`�}�?g�TA��Y�/D|�������Lq!L�\&A]�D٦�T���$�l����T �fl�<	��y��w�o�v�D��d]�)�(�D�%3#�Ԍ)�<cu�$��� ��V ��<�s/��R�]ļ�D9�h\�Pv��\	3k�zw��� R|����3���	�*�E�Z��X��L�J>��2���J[�vr�K%W�M!��&�9j\�1G@έ&�W-�V:v\�JT�0t��‰2�I`�;�u��S~��J��A�2ଌ.��KsI�v����(h��h�J�s(H�I��*�5�#X�BSȳd?U2sAO�x����J@e������g#;��S���R5��	���Z&q"
qR�H�hF]Q�|U���J@w�������F�X���?�˿^]�=��ps��y{x&���	�W�_ É\��9'�X�^%�-<�r��k��{G�ȓ���<臬Y�t����m.Hd�hQ\ó�$m~WJpUl��ރс7���0�L�X�V���(a��t����0�x*��Be�dy)�/c%�
��n+2V+l993W��m��`b�^��	�¾��$H�������
�.�.?�^��no7K �V|Ċ2��(6"6$tƐ-���?a���-��cz
{P�fˉ_��K!�ٶ�����Y���?���S��{ة�`���L��2���|�������X����ӗ��]�1a�݀%��#p�i�;�Wf!��}]W8w�sR�{WMV�ۢ'f��I�yF��/%H�[����\�I��bP��
�\.p��D����&�}5@fz�n���S^tbv�A2dKԊ@a(NDD��~\J���EB�,��pBG�V�E����a����������@\{���Ȫ�I�B/�Ћ�!
�@��yȁKH��OU�5D8�����W��%�#�3�i�ز�"w_�-n�O� sS4�=nJ��ګ@}7�����O�}�O���J���N����\.«����w7�\�܅/n?__�a�F�.~G〰O���@[����~����ƿ��,���^�G�G�w)�v�<�S[Y��[Y%��a�
�+w%��
Z5��E��Hd��6����b�,t�<�G&�Q�����6�N���j����d�� ��DPB���Y��"�@8b�
��q��8n��C�G����YU�/�M`�(���O�҃�8��Ģ�R�{S�ad&���B!YV��GH<�2c���6!i��,����7<��t)�P�
��6�5+XS�
�ъ�����5�8"|A^�TFS�l�y�A�?5��g��;g�<$
<�!zI[@��}����=��mp�;ڟ:�a[N�%q�5}�o��Au��
%��&�w�dz�אWl>�yOP��(�&��ü��#(��	7����&���b�pU����I$44�'�L�L2G�ݟ�jfB�$�E8�a^�������˜���<�	����1��/U�Vr�P	���P��^�0������@������J�M��U��7m	9tҎa�-a�+�F��W��W��Mx�s�|Ξ�_�f���e��8Ne�fE@��"jm뎱wO��l�o�\R�{F;�x�C���2��F$&|p'��zH躟��C�.Ԙ�;�yS
��)7+�?[�ݜ����0�ݲ��G�������Z��(Q���a7
�>O[��7~�@73�0C��-q}�^T�] ���I�smZ��=�y��JBר�=x���f��?^�.�n4Xf]T{);F���
�Xoڨ�p�	����_�p��n�<1����t)�P*c�;��ט ��`�T�$Ni2�N؅��c��	�qփ�������Bc�x�I8�02��,Jj<
@<�@9`�E���a�}�P�ē�Kv�0��N�|��@s$�ʉH}���P��:��_0i�Ib�]	�� Ʀ]�x�yI��	��X
��!����mx��Dz|}qwъ����6����m↬�'�D��{4����A�ф�g�	s���@�~�Zg�#��uZ(�zA�
N�5�����hr*��Q��y8m�?�(�J�k�(�Y�T���h��@�G�g6Ly��9�h�*������J���%�i�8l<<K��˱|L�Q\?w�b�A�I3�84�Umb؟vz��W�
�|�^��u�4;�[�U���/Ji��Gߒ�b��_�nyU�x�R��2B�g?��|]0��f��r-E��‚Q��ɀ.LQ:3��MZi5��,?J!�T\Sy6WQs�^ؽ�W0���)8u�5��
c�>�~�����.5	'w�6M������"�T[�,U���&\sU��b8�-�C?;�Փn7
���o:%��Rz�npՕ�v��Ecȸ:V��Q��tj&���*[����+�2�2�5Km�.Up	��*p��'�7�]�2Ə?�i������?��������M�)W��4�EA�(h�GMZ]fժ�Bb>%
^�r���;|r�n��w��D�L=�d�:g���D"�m-�����^�u؂�F��—��aA�����3��E��F��S݁�fӎovH�����մ���rDfBP�R!���h���՛F}A�S��
�U�Hr��G4��B٢�c�Պ
�WB��,+J��DP�;��4����H�Z� �����9p�� ���ѻ��]�EUQ:�.1|-��ȐX$��w���=B���$�`��&��L���8ѡ$bSZ]lT)��I�V���B
ⶵ�[P�=��-����I�����0��؛��	9������ښD0b#T]�sĖB��U���@`��N�x�c��D��.�z���I�6�:7�f�����LP\C�,-P��d�R�3�F�o`��֓�0]�ACj*-�|o	G#�ed��;�:X�4D�<��H�� +	J��6�o���v�䵁3*#��{�J-�*a��d�M�h(�H�ﰨ��ٯ�0h���O��`.���߀E���Gk7�{�i�<�!|��i5]��P)ޘ�i^gT�Ī����k
$p�nLl �����g:����ir��'��
��p�#8��ςW?:!��ށ�ٝٽB�j�VF�*eLN `��*�)9�̭!�N��F�Xא����0EX��ڱ�#�X7SA���N���b�5sScz_"k�p�Ny��*	l�z�������g}������Ui���Z
����0�ϡ1ck�N��ƥ=u��7B����h��t�M�<>���2���R�:]��qR��3�
�鸲�f����Jg��d
���Z�X����v�&F�E��,�6]�8Q�s�r}�K�Gd�D�e5x\�M>K_�h&��|��u�w`�o,�]мs]ǧ���3"��i� �'C7bѭ�O"������߼�}9�N#�i�g��{�-Ӄ��>��Q^e��x�#����K�Lp�E�Ef�(��~��3#'�	����19���1�� f2DM�0ɟ$:(M�*���wN��gT.��9e�씑�b>���qpnOp�
�ǘe�
{Äc�)�0��у�Wt�.2�M�)ψ�f��!K�8��N;f��-�#�&�x���Q��c���`�5#>���|l3��Ե�hk�G�.�����}�<m`��]��zW��:I�F��s��GV��E�.#�<2*�E����tԪ�A��uAM)���Ͼѧ8�NO�
9�/W݅�_(D�P#�x�=3P��z���
hY�7,�x衿aIzY�?���fX�Ohu�؛���bv0��U�{?�˷�Iܝ2��޷+����8��
��E`���P�Q-b��2øG��W�lπ+xò{CHw���TfB�ڒtY_�v!!�q�)S���#��r��fLu�:]�!��SMv�^|4
�
�WtW�4�@��O�$��soR7��G��g��uD	a/�5��O'|MA_DF�#�"W4mO��O�^�u�x�(��l
'|��md����H���"�0��-l֙@�7�Hs�$t�/j���y�nKP�"���(�����N�����֢Z�0M{����Z��ʬ��p7X��\^�!+v"�z,��WJ���a������p��
i�(��-��t̷LG��V]M��GL�V�q��ž<�4���_���`���n�XŐY-�g�Ai	��<��>|��<}:�u"��e�c������)\�t|g�t0k�b?���n��i�t�5�����Tg�ҹ�y.���>`2C"�됺ɐ���,�<�5j�d���̛+�*LI��ߕO?52&����q���i>�kTt��!��Q\�qx��Uh>�Y�������!0`���o�K�>�ۏXƘL�c�E3�+���\�Z��M���c0����1�Z4_���0�[��tBj�W���Sf�ڬ��f�:�Q��[zЀ�[�ɷ�/�L�O��Yn��0M�I��v
q���Ю
~���&a���#r����(�
t��ym)9E��`KO���83�7(&���0I�N�ǜ~���xw�H��_��������
���k��҈��%���6O\&�Zx�ܤPa=h��?�l�������!��=;	8��J&� =HD�eҭK#(�l��yT�:�~�<8��1č7��1T�͇�؂�Ik�8\_O7���E�#vA�+Q�mp��U��L����^��Tݛuf����y�D���*��{�*�8��hfm�ʏv�_\��PKEePQK���Lpip/_internal/network/utils.py�Wmo�6��_qhP8l�M�&1�]�5A1�hR]1�t�9ˢFRq�a�}w�^,�n�a��آ��s�O����|8}�,Vz����5å�15 ����~�<�L�W�'�w�����\e� ���̢�D:�/�V�yeb�v���JeF|r��һ�����u.�Y����Ot��ջ量����m�d��q�㬶-\������
�a���4U+~-R�%fր�b�}xxs1j+�J˙$v�Dc�L\+zý-�Ă�`&��D����W�/�/īaxv���xtr�/�G�g'Ix|r����d��_
��&�
n�H��j2&RҮ�
�1�Z�&�1EJ�"#¡Kor��Q]���ci �(��
xZ"W	��ڐ�s�6�2��X��A���,��BcL�a�jYS�d�B����`�:l"S$dֳt_EK��?!#�"�)�GlP"U��vN�9����:J�DŽ�R�f���d/�>g��"�n����j�AE��%���ܙ�h�U��V,�		��5TCĬ÷�
Tkb&d�w�
��>I��5��
�riXUUe�*�m������\�>��T.�9����DOܪ�"��+4
�/�pI�8���\Fs���E4��p�rI��M���Y�����,�p��F���>�u��7�IVB$g�7C�x4s�԰��#ܑO�bN�=2��.!�2We�S���dh������͇{���z��WE��7�O3�)��X���{4@ipJ|��
[�Cn�#?	+�a5��`�L������|�<��K3#&E���QidF��A�
�(��pmє�4���ܜ�&�2�qf��9�ZS�����Gs��Q�"�ʯ���%�J1�v��y�o����ا����+тmJ������Hq1n��6�����E�)�\�F0���Þ��wT�������k��[x�a��]���
~6�r�r4���/��K�k8�;��U*���z�a+tʟ{�;>���CU(�pGAI����%��ib�~��ĈV��� sk��.�mP�޴�����,N�y�-|o�>�SC�~�����o��u=\I�Ϯw�?{��m9;k�� s�i�����AY�
���s��H��+Ý��i~�����j���S���4N�[�k䫟�V��O���-~V�'n�T�%;7my�;�?�>�.��Z�I���V��N%d}#o�W��ߠ���)�`���+~!�|�^�._�`�zN��E���B�]�`)�H͘Z��}��;P/
�a���p�}�J�a[5~[1n���ό�/�-Nv��m�.��8�+7������OH�-�]i��,��-�Z���	O(���lW�r6bDV-9�[u/&1�m!K���m�1AY�J]ۂ�X�p;j��Z"��覠_�^(��$i��vE
`R`��^�RI�P���Ԭ��]�x{֖�ʜ��f
�428n�m�ܤ���?PKEePQ����Zpip/_internal/network/xmlrpc.py�U]o�0}ϯ�RU	�v/�����i-C�ZM�k��ؙm�4���IHBi��{��=�p	�p�g��3��sͥ)��D�E9H˭P2�0p�ej�rgd�e~="w���	�d�0D*K��'��!��`R|�(I�^\^
/���W�ME�b��k����XI���|�K�)b�$��V9)DA�d�45bGs��:��U��dE�<̨�}%��u�Z�0��r���A+_HZ��.�©u�0�U��DI	�;��Z�S����k+�C���[*�*�6�}�Ұ#u����Mn�'�������#�nyb{8�=jὈmsv��c��:e&���N�"�ɸ�
]���{c��X���2|��:�k\�/	�gZmD�}!O'�td_�܅6�<�Z�ľ�4�/	,	�r�e,2�-��v
0 U����$�o+r���[��"c��%̀,��d��L��C���#�;�����T�mSge�*h�$e&NQ'�k��r�8��֠�K��5[�L����2����B%�ـ^(�?�Ù�{���K��uG�z��p)�g#jrB��,u��M����[)����O��7�c!��Y��7����N��4�l	K�y�a����[�UQW�^=�x�׭�=����Ժa�e�7$]��d�Z��^8VC0������/H7m1��4N
�1����윗#��ZX�,z�Xx3���΍��ɀ�\�n���h)�U�r]ꄟ6�PKEePQ$pip/_internal/operations/__init__.pyPKEePQKw�kx!pip/_internal/operations/check.py�Xێ�6}�W����b��
�l�lZ p-Q6kYTI*[7ȿw����\
�"1�93�9s8�r�����������Ԭg]ͺ�3��{Z莩�r�\,��R�V�v��-)��m�*�W�=���z�[��{zޯʏ,��"��jмm*ډ�W�?�D�3��])����h���5pɎ��o�T왔B�ny���h���Ғo�$�lA�s�V���FH�T��-�]���9���U�qwL{{V'��2�>������ͯ�n^��~��}q��b��g�\����+���&ke�C��3�ks�3��x����_دQ~@��!~~�N�+�mYA��J�M�ǦmA�|}��(�+H���x�G�n`{���,���8."m ��r�O�����{��5W
#���v+Dc�ވ�ia�#l�Q�Y�cݸ��3��ۣ
�dϪ�;��V�QD�)f�ȝw��)bd8I� 0�M�W���G&��Y��,j֐J2�Y�d�T@kd@�v����ʝ�׮�@�&���ɓ������Y�BZJZȜQ��U;-�aXyS��)k(f�
�Hc�\d����=#�4;[�=��&�>�G&�U�i�
P�Rt�i�&�i���Ku�=|��ϖ:Q���]���0��6���|חTb�W�`!k&�Z��۟ �f%m�<�I��z�)+,��Ea�]yfdy�fW���sgD�8��9���4(D_R�Dz�F� ���֑#�7ML�� 5T:[p(i
I�2��A��oY��$J̤@��`�#�d������~�{"Kv��ں�NHv}+:6퍸�<n�nnPE�]�ܛ�|�\B�R*A�qr��d(�f�&���T)V�k��l U.h
��"te�oKA�h�&lZ���.4��RGEv�P%"��Mc�g�g�y��@�Gp!5 [1�KS��������X`,Sj�%}4�b��Y,�іOӌYJV�8�<��x@�q3t�$dc܏m��]�	����-&=:R��+�ә�g�W'�����
�:m����<�|EHl�9P�V�#m���������K��u�eV-<���K5I�1�]akx>%;��B�3)����e�q�[���
��cD�l��^BЕ��k�w>?����G����q�RP�$e(v�u0'Ć9��5�-����:�?��b
����ERĐ�����?W�~q*�f؛��N����+�shm��ц0A�Nd'i�'^�����N������;oH��7��4�9ݎ���D8�l:��D��ܗ;lw���&�r��~�,?-ºU��Y�&Jo�2�������Y���gM��t�C�=�f~��sۑ/�BD��Z6�\D�H��'�_�Mfc¥Al:3����u��c�#R�_��?��H�"�
��"�9%L��~�p#���E? 8�F�
MF�G�%c=L�`�@�������!���=�kQ��SU��U��n{-��h8��N�s���!�Kw�ȃDѭ€���!�o�I!��AD�o�e�H��E*�����%#ܤ�����|Y�d.��7S(���w��ʞ�_��'WI�4e���Y��+o.���!/Գ�������%s��fu;$���,�PKEePQ��
)`�("pip/_internal/operations/freeze.py�Zm�۸��_��E ������Pt��A�M�l�����neQ!�}I�����H��R�ncS�pf��+�|O�tۨF�4%ž�B���lK��̎g�,Y�
^�v�䷷Eu�~�r6�"Ѻ���U9-UY<�%5��(RHU����ъWEF��K+�g#+�nS�$oD�ܺ��sS�g�zG�d/���g��-���Z�Ү��/�~O�|A^URѲ�8��!!��$J4����g�?��8ey��d���eQ����Fz^Q�v�˷o޼��N߿[���䠊L��(�+k�g�{OeZ���_N�`[&X�Yv�B��[3���z_Ȭ�P(dO
HҪ��)�Ŧ��r��z�4�o~�{z����N���zu�O��vd�Bo�������}(炼��傼��W��)���?/2�{�� �Y�b�������n��v�$?�+/q�7��;~�{:[�`Y�xï�-'+�M+�f�($���pn5�����l�F��֟�)��cq��5Ma�Yζ 
c_��Vt�WW�N�9�p�����(�-�N�����5R^�O������D�i$G��T�N޳wI˧�=����'�v80T�C�MΜ�LS�wE�����T��ln`߾��$���o�fV�o8]�x񛵁�>� x0oƅ��S�ʜD�-��-J`�����}�G��]���14(����a���nst����YG��E0�j0�`�>�H�_cl��x���Aځ\����|��n��O��P���
��'p)�ƌ����T�h��Z�?�y���
�(��Y��^��D�hJ��ɛ�Ԯ�,��jr�FD�%T7NN�7@/w�:�ɞIIoa�Z�(����q������N�@E��s�'��
���
�R!ܙ��Z�g�<��b@)�1x�̃o�
�M�PB}3F5!I;pq��o07:�h�#}�k�����<�:��Z��&<�Er^E�E ��X���6��GCN���"l_(p|�� b!��D��
�?���Rt<j��`v#@�Hŀ*�s�X
�,��-�Q`|��0��n�sǍl@���S�Go�"k��$��Zu�fh���V0I�."~�&�n}ފlg� 4����
�#s[�#(ͲF�ӂ�
	Ѻf��&�*�r:�hsDd�������^���s����GK3E7�r����&�Uq�f�ު���
'̒��e����-����|ln��s�_*�D6��<:u�[3t.�'Z�h���F<�p��,�p����U�Y����-k�N�e��X�<M
 �!E�˜
r(��C�%{[�^i �-��b����q��1�2�*,"&'��|�[Q����&��&'4�1�aӻ�c�&�79�E�)��6Z2���6�DT6E��o�z�N��AR{:��KȾ�!)͇hM�DR��M�
���f�r��0=}���*9$�;�~�7Hd���h�	�[-�E��i�đ�S�������b�}�^�^0�<l��<�k�������3+!⚼҈��X�c�xvX]A \��{1�}� $�C�����n��+L������u�}ϋ��&`>�/6%�OO�$�aF��K��w�&�����-�����^霰B�W+�]��-l�gǎЂ�Klm������M�r��M���a)�9VC�=g�G�+3�	���2F��f��/TZ��#&�>������\a��>��pp<�3u�	�U�K� ���E�qD�[�z~<��'ge��"x��=QO^I�	L��
oTX��N�FKޫ�h�P�"�*ٰ���2[�fW#��+�HB����r�xL
����N�K���A�d^���/��Y`��䤠h��M�0�uJ�'/�XrIC����	�N�o������5D�-����{�(}逿��¥uQ��E�f�>�L��y��0��e�$8(��V%�orJ/ȣ�U2�E6<
�x��cx.��Y�i�c�SG��F�5|�;�����gg�Y_�}ݨ�O��!b'�q8���Z��Vَʡ6��u���^��!_|,#�i��N��ڂ��3B�e��T\�3*Y�Ѝ�5�]Тo��>s�-��E�\�+�^��ͥ .����x���mH;��b��,v�>��b
拋�f�J��=�i
7g����+N�s�N8�g㚏~V|�+��ض����u��g;��'L��야h���5����>1&	��$��m�n`���zp�r-zF�A��(�ӯ>)�@��Ao�0�:�s��s:IW_�
�%�ơ��
<�D�'�
�ȉ����2�;�>G��<�6oV��ʬ�v�4w��
!��xC��R;
�i���vt���H�iС1*p��
?�Q���*�̒�$�WeP�a����+�$v�F�)��X��(Rh*�G���‚9H��5A�j���׆��=eL��ݴt�-X�e��x�|4�<^���Yǥo*����H5���q���,+����
���8\S�JSHV���f2pD}vu_}�f��Xo7�[�:6#�n�آ8(0���"֫���;�`�h�$��֝N��(��Z�{�v<w��"~VJ�d�t4HMG㭹~��-�c,����ZFF!)�2&}r��߰�Z����k�(��>0p�����,�=2�q����}�3���Kd��zhN
�k��N�FL�BZ�8~�x��߽xG���ώ\[&a��
�
�8t(�ǩ`}���z?��f�����6p����;�a�֛��YOh��D$�Z�L�@�m,'��0�x�����e�~���/mS0�������<�c�^���QG��Y���V��Ë�8�s��nN/\�7�=�PKEePQ�Y6���M#pip/_internal/operations/prepare.py�<�oܸ���� &�L+��p\��ɦ	�d����"͈��D�(y2�� )R?v�'��D~$��KY,���Fj��,�m�o�6W��R��+ݦE�⃓�bqr�D\^KxW�W{�Se)�V�k���J��R��L��P�R�*��y%Z�ص]#cS���v�q��ؼH-ON�VM+
���"���K�k���~�k�tqrrըR�y'���T�0c.~����
����v��D�U�72��'���`%i�t9�����y���+��7n
���������V5�M�2��*��^f
��or]�����c^yD��iT�����g
F��gns��ty�o�W���N&q���U^H}ԭ,��v�>~�\�_d6?���pB
|��O2�dg�U�K��2׻�@ҺH�I����y&��)��'�J�8~ؔm#坈�0���]½#�ӎ�w�7?_��<{�ó�%�>�}���_�gvU��n�� A�Lͺ�9|�O�ѫ����4;�#�g�k�BF�5p}$~4��ˮ��4p}�BM��/���/��	��v�7����-<Lwm r3�C�Ĉ�t/1p��s�O_��9��$2^^��y����E.�ԡ*T���ss?��"��UM�WT�@����f^�9Sri����>�����o���k���ٳ
^�p�2
�~
�h|��T#���>~J3��O���c�X"�4��*U�#����j���_��^��er�U��ǧ�CF⭪��Q5�@���p�O���o��T�� �{پ�g�$��R&	�:��H�UR������;�}$��X�|Nf�@+ ބ��U�7v�5�ڢMr����C'k�"�l��Z���&[8��>�.���oj���~V����>�b�K�{Y։
q…��K��MW��j�o�
��c�*Av[�"�O��5�(�X�z���x�*t�2�}B�лk�A��7�,�Z��tr-*�N7�xe�	p'6֯`��c�L�+�xFz�����������I�Ҳ������
~�#�;�U���B(1���������붭�4����v�0s�{;�zv:Iܧ7����)#�3;�-ӧY�B���mB�l�S�Y0���jRqLʴ�6�Mgx�xu��h�:9yZ�Z���c���i��4;�(��]#�g��I�61r�C���ٹ	p.�?-�JL7�}d0�e���:�F�{�K�vc\�B�x�I����[�ç	�D�]��z�e���*.�#&��i� [���4���"Q�Y�Y1��ڒ�E�I��J7;X^�v��Ӣ
��t�
�<m5T���mA��`SP��I�^ڍ�s�B�䵐j
�0�l��k�s,�=�H>=���B�{�BZ�.l�V8]P7
U��X9��ڭ�9�{��G1�E�\A��ώ��0�h�i�A*��P!sOڭ٥j< �z^��E=��g␲��R�)���J��I�P�x�v`)�,�����b	d,�V�pK��oCE�+�tu%En-��eb{�;H���V0%��+î�1���S��N������/B_�x%��A���g1C�K�����W�$�p�@��	�#F�)M
 6OV�?x�j��7�>Z��i@�,�d4�9L�H5�ӳ����p�7� ����?��|8��l˜dy".�� &CAW���\"�U�V�s��[	<�u��@��.cI�Ӓ>���(R�v�X�Ҫz���� �J�_S����x0����]�1�iN�
���l��ۂcT���:=����s��������
H\ƭ����2��o��!�dkDh�#�6p�
�v'�BS�����2.o��P��n$�5�
����7�_�#������׋��;�i01�����<9�E�@"zLCi�2G��8:��y{�@2M��NXϤal�4zAn�x���w`�e`Eo�R
�ɼB�{@�M8�$�����c��q�"��b��Μq��"��1�����{����
��� f�%@4y� ���
}�_�l��M�ܦE��?�C�ٟE�'1

�|zjR�6��~q�g����{�p{��f>B�\�[�a��S"p��\���bʬ�DPE#��H&�%f@48F)�.LZ�|�B�Ja�s��^���pC�������'���=eqトCX-o�ؒ��{\�}�l��S̯�������X�q�ɚܫ�D�{�ʻ���OVY|��
��W`��#�ݑ{r�x/fl��i������&�-8!c�+} �&`oTv�^1/`1�J�x��4�t�md	��&`��3;v����•1�KhA^�N�U��H�g�q���:��7�!�\�M��6%�5	Z���)T����5$`.me�tK�1M��=���[@ʸ�J9F�)��a>�+��h����c�'=�Ğ��k|7H�MPeo5��8��ODfj
e��S�8l��yC��?k�:��"S�C�#�<�T��s�J�&�V���%H���-��xKya����@��U��<y6�q`p�2<:^�
Ď
�%��"�Ǜ�=I�=�d�7#^�"���C�G��x��=V�b��Qg�P�&�j�Tz���(\*��'��ҬsQ>I�k�f3>�9jL-)����9t�`��Tlˋ����j՟�N$!�ëY(�����a�\cJ��f o��w��.=ѡ���LJ±
�}�G8vc&1�v[i��U�e|-ST�X-�fN�br.���+����h�%�	��A<#7އOh�MoI�I
�v�A]N[q8#�߾��`(�T&� 	�bToA24tI�X(ā���B���Ȫ�U�3Ӗk���8�����F�7��j������q��^F���s��Q���	�x��3!Ļ�x-/�O��JX۔ݩX,����SO���q:�y�v�)�!�c�CBz���f�ՉMy�	Kx��oX���;:�_���rX�sw\.����!cA%���Pd�Gs��T���r�CL^,�G9��`��wK�&ѠۧMeZ���]
,1�&Qw;��c�
��2��׎`���{6>��a=�C2�R���?Q�<�85��uƼR4�`��	��#?��	6�ˁ�f��Bl�#/K�:�V�I� F��-�>���{���õ-�=~�8.������=r��`\0&(�ߔy���xGr�c�Lk^��
�"�?�������`.�~� խl���%˴j���pl��%�-fH�m^!!���FRPLuE��:F���ߠ%u����q@0��k��L���b��z�MH�w���)��Gm�Z͇����)YS<�Js���H=����=���*��
�E��qQ�
�����
�j���q�dVOP��dJ��n��q�F7��M�������jf�3L��`���C�[-��p[����1'�^hN��Q���9������	�b���rL�AF�g�8�W��~e�Іi�P��'l�r����-��՞�%�J/Ei�q.�n�!v�N'"�2.��'��Q�{�(���a���W�wyNf���z���-(�يĠ6�������c;{t�T��HH�'K�clG��\L��ڏ�DZ�İ��p9�
���fS"t,��P��4�����:�d�?������$'ILf�"T���S���A��Xj�#�C�{
������O�hl����o��;0B6<�5�	�:t�ˆ"�ZūR�q�|��fp?�s�q8�E#�J�‹8��U�B�v4�b�ЛX׶��a'@�39oE�	I&@yq?e�dU�慫���Q~�������]�o��t��0�Z	�W��6G=y�:R��:?���i�X�wu\���Rܓ����2�.Ńը�`����O����?�bF#O������֦1
���w�	 �K�4�.*$����m�V�&L2(ߚZ*R�o�2��$m<颐���5NB@-�����/R�!y˜���Uf�F
�ݛ_d�^��'�/l�ڼ�Cq/~lE�Oҥfk���v���Vg�<�F�r?�"���pC�~PWA����At1/�Wq%�]��B�a>�4a+�P�P�}�[�@�%-�#��8���h_��|x�ڃ����d��A��}�s�Z�wN�XHjC���t�؊��
��0�|؈�:|�[��I�<�:����4��	�ֲ�	��~6�����?����8���+L?Z	O�W&�U�`jO^�����1m����l"{־5/B�-W�9sū����O��f��j�T'm�:���S0�)�6���%��P��#�=Hyk�7�J9����'5T`��&'��S��<:����C~���2<ힴ8�?6��x.�r"�*�r�R`���O5�>g.��1{#N�� ϝ"����jh�o*p7O�J��1�de*\����i@_�%��,V
�a���3�̣TZF�T72̟?!�t��x��%�����B�oQ����)C���eG|���A1�z���̇�r�� �υza������g?��+���ۆ)*�m�R:�>�s�{[�^�d��s��S���ǰl�ͳ���=}W�cמ��k�Ѿ�+N� C'T|v�ϡO?H*�,~Gl7`:)E|��;T�������^mT+!ja�Ab*��^��`*�
�A�u��I@�x�����W�Ĕn�����/������p��*_X�~a�>x��////&*<�M6�G��~.���u��S�*\,�F�ʉ8���ʾe����Z�,��:Θ�!
�{���ܓ�ﻳ��K��|��-�r�����&3�!�
�8����^�����kci�>���m�
�]��-�{Џ��a3���Y��qixr�x�;w��gz����]
X'oz�y��G�	�k4���!���5���D�Io���Ƈ?_��_�����5���r����T&R�C�f�1*���Ul.�V�y�]�]��;-�dn�:��9�X@,�\;/(h��`-��_�r��&?���'n���w�X	��2X�o�Lam�92u��ׅ<����m@��dk�����Ϻ��15�r������g��S�~�x<��3ǵ+�������z��y��ۡ�&�_%~�*(�y�y��p�����v��0�?5`[:~#}b4�i/�P,�g?ق�_���rs���1��Y�,�������R�&��f5s��I��p_��&��7?L�f=��K�v�ϱj�T�MM�!M�;\5&j��#�jΐ�m7��E����aͲc��%8��f��-$��1��*�� q��;0E3P($�As�)+yY�捪8�����jvj�0?��x�N�8�B�7�0�	PKEePQ*pip/_internal/operations/build/__init__.pyPKEePQl�KT/�*pip/_internal/operations/build/metadata.py�T�n�0��+ʡ��(` 9�5���a�!'�Wk�$Hʮ��KɒIS]������$y� �6�щ����lT	�q�M�J�|p����Y�$����x�*gZ���\�N�&����}WXgJ���]�I��U�����hi_l��4[˥r#�}W�`��؁6#��u�����O��k���z��w���y���T#9��H�-.,�N9�[��
�C-��-�/���{'�E79����.DӠc�I���\�I'���i6�x�!�!��c��<��{�{�pT�Q:�j���V�� ї�9JP��5�&XO�s�C�q�W���M>��q����0�.sL�C��*-��H��vD%3�4��n��{q���]*�W��������I�V�L	�x�O̭�h���4├��C+�)<N�|�׈͌&
�4PF
P���3|I���Zk�W�jT8%�Zy��"£���&3����?�4Y�EƸ��&��l"n���7^�ɸ�ğ�ҕ9�?��gIzAr���1f�_?���濍��9fvQJ�PKEePQ��v��1pip/_internal/operations/build/metadata_legacy.py�U�O�0~�_a!R����J�a�1�QM�= ��_R�ĎlVM��9�������D>ߏ�>wM��
�qR�ÝԊԺ�)�!5T�X�;S�:#��w�4I�4Id�j�|H%U��M��膴��L*F����M����:^ס�1�
Â��\�:�k˖��E���F�PUZj�Me�I�-[��K�@�`~;�A�2!Mx����@�Y��n��>���-;�z~��]�\,.Hfy�<O�d
,0PO}�O�p���Ѫ��?���C+p߃-cL��$I"�$��JD�2�3��?"�$C	L���7\�
�`$�P���h�,�D*�O��ڴ%k�8,b��`
�+}���F�a�A�J
J�g�VY����>	�R�
5汀���k�e�!`\�QKC?��_��oJh��[L1� �|AL�)���H���VȱV�Ϡvr�_t߹y��0�@}�݊��R

N>�>���n`�v�l�G�N�R�w���5�Gν�6�݁Ki5Rbt��U���ۋ�5�t_�ێH��߀���ْ[����z�<�6�C��@��W�Ȏ�E>w�a3�T�����;��'��i~�j�'6�LˋG^9�'���m�H2z�3�V�w���<Oq	��MIU�%Jw�����oL��A>�~c�wwu��h��LJ�Ei�Y0�Ъ�U�1n��A��(������;��Y�#Y����L�-�v�V����>z�-���l�j�9����2I^PKEePQ����e�'pip/_internal/operations/build/wheel.py}T�o�0~�_qBI����x�61�jB��\S��6�C��w�#i��,/i�}��绊F+�VU%dED�T���Q
h�)ҡ�������]i��h-t馕
�	�eV���s^�i��gV=�ׇ��]�g_����f��9��Od3�
�.�N;�|�!+���T�j�o߼�;õFsп��k�g����@W�1�Bwc9c�7�XA)q�V�%�mk���X<d]�
2q
֙^�strR=�5�x�g�0�v���q��*�l�΃�}ҏ����3t�l�C9�����}����C(J"�H��{��zY
J�
w��|#It#BId�G�iAs�� ���m�i�����(�y6���g:��W�����֢��S�@X��EH���Q���~��T�P��q$&���t�$
Ec�ɳ��:N=m��׶����G����ƥ�|m�zo��8D���:sf?}���U[��G�NH�L�2O� m\_?�/�q>�őM�}���Ȩ�4��c�ïP�_��?���ULGEӊF/��m_~�o������\�Y�,)�?k����=1��O\�X�����R�oeiX�S	�w+<8P�PKEePQ�R�C
.pip/_internal/operations/build/wheel_legacy.py�V[o�6~ׯ�\�PG�^
�M�,���Z�HB�(�+E
$���wx�%�N��^$���}�6��1Qה�u�B�m��QTIѠ��)�\�s�������P/����3��L����B0�Wee:�<M���HI�ƛ5!�V�(���n�JQ�B��|u��j�0�E���b%d�k\���yyޚ�B�uo�O~—�-.���n�n��V'��Θ�jXB�3t�j*���M��(25!e}qҚ�]�1�yC0N�(*Iu�$�c�e 
�7�4�[��J˧@Ht���H�z�8��8M�]�Cp�nL&�k�@�Q�<�x�o�@2�WU@�'��{H�/ <��F`�k�j�^v��4uj�rH�9
��B���k~;R�Н�dj��"���"���dI�	��n�������)�..��\	�����<��t�t?%�T����O��Z� t֩�e��;�d��|b%�Ur��C����b�H�lډ�A��HԤiqI�H���9xb��g���C^d�2�3�6L��1Q��-r����3�
��0ߐ�$�\ʩj�!C�t���o2Ʊ]
ި��ӥ���/*��ܡB���:TQFT:�G��J;o���MX�0߃
ϠM.9p%�Þǒ�ܞ��p?0��'�FH��:�,��୪kXue����4�J��lN�j�F��)s����Ay<��:��S?"�dt����*;�q���=�/:Y�W�Z3���>��ҹtNʄT�O�}����x�_�װ`k;q9�x��A�2�(��|�\���
#Vu�9��݃:��
�*�9�wǾ�k
����g�yX��r��� �{� �Y���LMM�ݦ��K���3�<�R&�0Cl~MG|ۡ����dz�M��
.��Xi�r����%Yuu<�������3��E��S1;�
��$���h�ؔوG�>�̿C����kAZ��ᄮ��ie��:�)��$��ό݊��9��;��MN���s�w��� �.��>�aj,%��S?Л�;@��w�1�Ƈ�py�?��*���_��}8~ǣPKEePQ��{53,pip/_internal/operations/install/__init__.pySRRr�/R��O)�I-V(J�I,IMQ(�W��+.I����KW(HL�NLO-��RRR�PKEePQX��*:�3pip/_internal/operations/install/editable_legacy.py}T�j�0}�W�/l���!���mI�C(E��c��-����}%��m/cs��h.g�$�*�1ܲ]
�cY]3˥�J��YcN��W�UDq��z%(I�%�ŵ�*.*�J-��"�Z����׆��;pQ��ԡ�]‘V���]��"�6�
���gD��̕h�/)��]�t�/�ڣ�������}��F�m���/��|��{B�y�
7v��+�gV��O�ۂ���4B��!F��q�Z��5!�gq��	XJ�`
P�r��8g��s#*C^n���B������厝��2F��P�J�y��eW	��^M
�S���>|m�98��#U���ع�N�P�9�{b<iyHN(��AA�lu��r+�qq��B�RB�
�~�[) X�.=v������8�f#��O�X�t���G6���l�}e%������i�pQ���‹r�ٸ�47���U'J�[N[�V�S�i�x.�l�����a���@�F.Eɫl�@��*`/�,�n�f"����
���'wW��u0
�q�,n�tf��]���{�]V،�B�PKEePQI�MU��*pip/_internal/operations/install/legacy.py�Wێ�6}�W
K��@�t�M7E���@���̬D*$���;$u�.k�vm�3ù�3�v�WP��B�І�53\
�*����)P�I��ZڎB�h���7�T�Բ����G��_���RɆ\���ZS������
2%���\�[�qa@	VSxȡ���A�e��RRm���z�M.
&���U��A��d�r�K����ٱ�u1�6��`��Z�T��X�}�;�Tv��閻��Y��1д���;|��+ȍT�+j�6���|�=���ٛ���^���.7��E?����+����v�c����/��Ia��`��`�g�p+�r%E��{L�����'h`P~랢(�0E����ʭ�Y&XY��X^3̻�B�����v@a�-�$�M���_��'6��	����I㖕�-S	z�̰�F3����j��������ɸM�m�G'W��ȶĆ�O��h��P�I�$�*�*(��U�NC�*�܄ƎHo�˦�榯b�/�� 2*k/Y��)��}ƴ��Ŗ]_\�7�F�{���D��{(2-;����Y�aԞW��w	ZH��B)u�q�J+0���i��״�Ma��{\��'��]B�&C/�j�ez�Z��z��iRS�`�Yr���G�W��쓙��ס�k�0�)�+�ڞC=] %�`P�d�Ja��t񼡀�J�V[�)iO��T�t��!��L+W[3��s֭���%�ґ)k�r�MgBI4������W�u�woP�^���R�o�w�f⁶�‡��1a����0Q�ٺd�ϵK��7Et�'u.��[�Je�0�E�4#�����HK�~�{�p�x���+O~��b);Q�K'+KO�[^a�&Fs�c�XBsb��G�B��X+!�Ll�v�X�+�y�j
S�~r#��9���@1�a�ڞ|yB~2h�k�bG��8��@t��i���z �<�]�%���������/=T+�K>��0q��1��6F���Θ��r�R���+��B��I����44����N���:�x~B_�CA������Q��E� V��7F�y;�\���%�A�	�m͍[�{|���-�@[xoMFx���n�){RX����D�	�$���`>�3A��)�m�~r�����`ygAO�F�W$����V4	��)�C۔�{
Uuc�"
\ws`�ϲ8��u������;���wK+�Ul�<����M}�n�7:�D^D�غ��3��j�h�M
����O8#[;�CA'�$�5���~�2��5Ŧ1"���X�`�;a��xV�	�M�H��<�ࢡeF�(km��4�;�ab<�0���c2�j�p��Z�u-\;�n[΂��4
Bq�T�Ypj1��u�/�L�Z��G�A��	yJ�r_О��TѿPKEePQ=�s$Nz)pip/_internal/operations/install/wheel.py�=ks�F��+&��t(�v�ޔ.ʞc�Y�ƶΒ7�*.$�"@0�d����<���m]����LOOwOO�f8�LN۪*�F��Zd�j�<ϊ�+�h�|�_�K)&7�R��Ȋ�ފ*]^��m�&ޙL&;;�܈$Y�M[�$ن@�U�m#�����/�<��&+�m�,���{R4�m�g�D]�����.//.c�Tq�6��k-�'u�6�Cm-7i]�sY�J>��̣�s��e�x�,��Jr���uS��2햗iV��hSq�wY����&�Ȫg�U��ʪ8���
y�
������l�T�V�*S8�X-�j�ȧ�yz%��>8s��B6�|�Y4���KeoM�hG���O��A
٬�:����H��4o��ﵬ�LI��͒f[����񦼖vf@<��Ns�/��^�$�.�<�o��"y2ݎY�S|xT�e=�-/�i���I-�d��kY+x?�wb�+�m
����O�_=9K^��>y~t�����ɋ�Ϗ��)�}]�S�K���r��GϏ���t:��b/�Fn�[��.��I��|=T9<����2�2�p9��ѫ�m^ô��e�.y�Z�u�!IC�v��vѣ=���&��oɫ�/^��n�g[���:kTۺ���T]iT�M�\fE�,*�-�P$�M�.���4e���́�����[m�m҅�,�{�d�[�I�3��dB/4����R��E�$L@Ś����]�ZI���V50�2U�<ڂ�HA˵E���4%,�+�
n�(�Kz]c����,D�9������M�P\���ry�r-�r�a4�;���Y�^/�I3XR)�[�`�W�*��ſDž�-�=�eo��O�e���>�a[z��|,q�^ț3�]�K�;i�eS�瞜��Z�8��ăy�V>
�Z?�+����%���q�.w:l�:51��<I��R�o�s���^��:����_I+��~%�e�:�-[GS�t:w��A+x�zr��W�
t#2��>��s&�9�G�߼��y��@4"ïف����@1�T���B�҂8�е]VR5Í-⎥�iq!W��0&v<�k��k)��=����fb����`r;;;h����Q���,J��$�Xvp�Z�&�*��6�+������_�����vT�����L}�8��ڃm�J�R���(� �\䲸h.gd}�Z�K� ��2}��G��K�tiz�d��Ŗ�G�vSr8��-8�<.c�q�Y���`��C�`:�k\)U4=��4�"�6��BT��,†����O�L�Ez�3G��L���m�����*�uץ9!B�6c:����JnA�@i7�#*���
�o����f�LVОr���8nl@��5�}N����O���@L�XLcv�l'X�>����i!o�� 0�������6뽯�4u��ۄ-^�8�hY���#v?c6	�	��>��o�}~�u!yV��M��&Uf��t�?���K�嫧$��Yo�<���
D_H�V�ljR:�$Δ��xB��zZ/�3�&xގ��Fs�ơ~�2]�-šo�U��1:%��Q��Ԑc�Q+�O��ڶ/��A]��mU�L�X�$|
�ũ|��h6���Ei�d�wJV�$U�,��<�E��X϶G����75Xq��g6������BK#�dI]�
ڂ�à���lR�w�Nmń����>H�h�
 ����8����I�}=��b��yp�U%�`��c����S%���"��FÀ�HE�`�Gc�mG|Ô�LV����yU��x���(W�J/s5u|�h����~����-9�]�ز�C�A��Te��*�ax�q�� �J��i�����>��?^�ȯDUyhW����hFZ|�����m�Z��,`?���؊r-���"��BU����������� �ѽS�
aCS�1�v�&B�*��&���%jx����h�lE��$N��-�ů�)�5J=Q��6�6�����۲�ݯ�ܸ�=O7�9La4���nР�E�OÛc�@�7���|&����N��5�Ϻ�ո��7��d����S	&�U*�iZl��	��$���a���C���\���)�XXl-�4�yo�H�U��X9d���l���,�\�쿫˶�#-�$d‡�-(M��m�̾�N`W.�����b��z�'�����4xb�N�!�ђg���
������
u_dzv��D=j���|��po�t��<x3C�$h"�C7)�X!�K���|d�ӚKd?�P��ل҈�q\���+بpAe�YC^�Nͫ"3��}dq�լ��	�h
{S'���gZ�5z��6���V�2Ӻw�p8��d+1r��� �����m����)�5����v���
L�U�#KWB|gZKD�P���+����s�uO 1ƢTh�s�f�J0+����B�b3�[��3�i6^�f�.��P��R�g
�K�ٚ��<=;��1rg����[��96M�8cQ���5L&3��a��6r�Oob<��l��4O!@����?\@�v;�{���bB
~�:
�}m�b�F����3X8QOۢ�7�7[^�M ��-i�l��}46y�B%Yo�.��X��J�4.O��mi%�q[��\C�����B;U �7��hA���>�c:�,����H<
��SW>z�ah0��mz��A(wv����^s�W��#O�-`�d����@%M��p_���H19�O���$͎(d!)����k�ٓ! f�xyvt �(�MA~�� �d �-��D)����/s��ew�nIx�?�o+X9 �`k�� �����8�z�[��
�� �L�k$#/�W�Z�N~.�BwR�M�5z�g�`uÞU�7*�v�G�>�Hِ$mz��V�3��qpMM�m���z��ED�@]hIF�6�Is���W_��Ⱥ��*�k���k�9a��F�
bƒң��24^��kpJBG0�ˆ ��e	����XQ8,څqhƟ�CQ����şQo����?k��.�G�6G#m�\yB��K2g�	�g��Ebd6U����h����M�l��n���oi4���aRE��Q�zGU��s�Ti	�I�4 Ԁy�G�]d.9vȆֲ��?���-g��{�]���F�i��LX���R��7��e,���*���Es���Ȯo�ڹ��~���j��uF�m4�U���Ja�iP+�#ej�L;��"��LC�x�T�g*�1g!7�H��ߍ����0�.t��`Y@�R���~��X��+4�H��{{��e�T�`��Y����նJ�����H�z�?�d�U���̘�;�Q�/��մn����6MQ�qg`5���VW�CS&kE�|��%SHE��=7�� |�^����5fu�.�%wa�j���d'���}��A�A\�?d�
h�lIM.aM�J1�i(G�B�%K�*[�	#?�������RCF>��r�m?V�sϐ��M����:�e�C�aj�v�ֺ)LJ�Ȳ���4�����I��8�3�>��g���M/�i�$V��W��X�p�Ea1w�k�,k3�B,�}?�x%�5�N��9�8d~J�}�N:9�uAϭ��B�;�v�c�gv��{x��%n�Ό���tlK7nN�1V�p�8������1��4f��v|!�D�h�-����
"H�
�"�́����3�"\�Q���B�3 �#.
��W�!a����
���h	&��d��	��B�t:Y:�UYE���(a��wo��p�a�����=�9����Z��7�?�b:
`Q�>�}���Rb�.���5�(+k
���s$���
��f5�ɏQp=��A��2���E����GF7���4�x�|udrUɥ���~b��89��ǹ����A�
�UqݐM�Q�	����D�J��xm�B� �B�k]?%t�6�u)��Їrhs	˲�F�4�~�
#<���Oa��w����, \qE)L�ӣ�sqS#�t�nW�BߘLB�L(̫�b�꒳&N0[�5��B��E����7���-Q������1	s�{�a�g
�|���g4��o��6�X|ےy���EСp
�y4���ә�)��Q�����9O���n�)/���
-���u�]\�c/�I�}pnj��b��%X��,Q`/
��(P��߰Hsi9�h�I��u�Zp/�}�bA�J��eӸP��s�a|7��g�2�&̮W�L&������.3t3a�k�,�Rz�c��Յt�37yWn�J�	3$7�e<�a`qE�y���f�F`�[�L1��-+�Z(b-Z�,"a��,��n���甚��i�ո�ⴜ�?���.��j̐5�?�	�:[I�s���i����MO�J�J��NJT&l�K���F��4p3LU=�1j�D��0]
�j���z���n�|I�=hb���Y<����118/�+ZF`A���ы�ׯ�N�O��'g�/_����aȍ�>�uZg$U� 8��\?2�ۄ�1g�̦`��!Ӽ�mu
�%FY�㟈3@֭1�����r�\3��h��xң?�?y��T���4Q�$�t�\^�?���a%��\l�������ѳǯ�?�;�����B2�\�g����̈́��zc��y���m�hO�
X0
0�k�����'&s�b�N�7�����so</
��|Y�Oav�١�8RO�B/�8������p��z�Y�%�h��<��:�И#g-�����HXs��<�x
	�+Qg�L��8gs�U�p�'���q!��ϫ�����/������̥�lo��idn��_q_XG��o�ԁ�B�틋?�������K�++=�n��#��"`P��!YȂ!?*q>�h�����4 ���oE�B��l�M`vhw�����jb��An�CoѴû��t��7YK��_���U߂�!WT��U`ڃ�� L=k��
��ݢ��+ɟ��*�����k^pX�����hq��@�I��?`?�M�#41����:B�r@��=)�0�D�[]��w��	���!������Ru$
�����-�<
Z�����	��&�j�c���d�D:!7C�y���Z6`��h����������Ws���k1�Ր1R��W�	D���A���S�������{k3-O�m�I�`�s���G��Wp�
l�I���X���g�M�4�Ut,d����-t/�g���H;�X?`Jp��	�qʶ�چg�i��9if*�����ϊ���g`�.y�T ���w��c1/{K���J<���%2Y*1?Ⱦ$xS�-Y6")웗�<Su	3�a�%"��X���4��1D\��k���h�<�_�K�e-�
�o@�N��X`50�z�v�g����0P
�;�X�.�2�
4�.�H`��г\�DW�B���.�T�S�d�Y�J�I�s��W��WNF���+^��*�h(�ޓB�1�]�Դ��Z��p�a���d��K�
����A82X�7�	��ga'���4ā��9^ѹ���N-J����	�7_>R~��wlg�e�4;]��Ym����M��3�ߎ��}��ll��͟g
q��i��NQ�,�8'��
C؛�h8���u48��0��(��M���4�V&��Y�X��'�h|�K|Ta�����n�'k[���L`�	T��b��7�>���6�.h�=����ZJ�u��B3����S��Lqѹ^��w'
��M[�3�{�1t�XW��{����#hX�@؎�{P�����.���Ϟ�aɖ��}L�:���ʋ.	�#�Y��:��6�p*F��A�-��KE�'=�8��8>�`�0zeߙ;>�{�z��\���wG�����O�ym�2*��I6S�:���SA���"{=��ւ����g|�Ft�4��d2ъ�D�u�.
@�бp4%��@v���-��N�T���~�B��A�UwfJ�i/:����YW�o�d��և$I8cC4~q�W��Y泦z6Z�a�z�HZ5W�x�-����扶
]�P�a�����4 <��Ag��<!�H�T��]�ͣ�Cr�ӗ���n���A$�q	6U;�r��F���6�H�E�d'�{����t���u�X���*�؅�Y�\�bsr�������s6��}�9�O�UQ�bݖu~P�o
�<6ի�������^�>�I�2�ڪ´J�Q�:�&��@U����=5� |[���l�{�D��kb�3�}��9(0��\B€���[���O��n��yS{�=�r��(���;rk��P-mMv��&�������1'��x4��h�>?!��o���>O���)5R;�/c�'p`�nš�+_�=�} 40�W1s�s���2�1�͗ЏF�p[���#M�"�v-�$��5ϝ�u�^��\w�Ci�y@�n�Z1���T}���x!)U��Աl'�V�ζB��%�������T�j-�-�̥���
���$z�X�8q���
I���C����]b���M/
[�U����U�!)J%7�s�$vtXi���Z	o~�o�u���Ϝ��J�yfU���J92E�TՅ�&g���.e�
o�D0a�0Ǧ}�;죪�a��&���.�I?R~��n��
y
&b�c|�[�k�)9�W���y�-�:������gY`e`��Hn�OQ�j׃~~���<+*��n]^ޢ�n^`aR�	������.�2�r����_vc��\=of��:�JnQ�yw�l6Wa�����$�:����t� X#i��#�dž����[�@ZE�@w	�)���/1<GJi!S�B��
�r���p}/�߱0�s3���M����u����0���8 m�G���?����%X��l�����O���!����q:�L�>�ِJ�.���l=kO@F��	�u�H;>�"{�:�����a��q�5�O���*ʛB8�Zϙ�ADTqm�Йf��\�؉5��¿�<���T�x�E0z�av����௜@W�(��
�����1\�wܥ�����UWC�6����v�w��?�CQΘei�X���sU�9m��w{m��|�I��^L��;)�!
�Z�;�ݟ��������Š1g�p����(��l���K
	��3�ܼO��[1�� �͝F]�?�E��՞Ӎc5^�O�b�6W��g��>u�#+��s�HUI1�S`\P�mĬ'1ݥ��+��5�b�ϻ���Ņ�؎��|�̕95:̅�U�n˿O�v�kx�V��8�'�I�]�H�k��@X��k ӻ��d��M4�#::љ0<ґz:��������WE�-�\F��c�������=u�e��w/(�������}�L��Cs����t�`A��Sp�~x�n�(��إ��Q�Wm��O�9dpN��Ι���}u��.h�߸
>b�*aܢ@[ssc�f:��_��O���C�
��J��ux�S�v��*J�n��H(��1v�%^&�V-�m"�H��HL�Qmo��*yZq���- ?��
�I:Q��n�2��g>�S�?b�w*�Te���K
�U��*\�E뗻�u|��Tx�Rt�WY�ecʡ��4'��#w���Y�������mM��Yh.�`e�z�賾�f
��@�5l_��0��Pl�r�vk,����v��7"x})/�xx
+�i�6�؇�o1�"Wx��*�U��M�N�I�9�s1-���}e>�g��ۛ����Lb�	KA!%���j��(xW<�)aL��Թ���g�|�S����4;c]�Ώ=D|�.}�w3?��®b.@Rݛ#��i�;�m:�믧}/�^	���iB��O����L�?�_Lb������!0�WFW�r��U����R��%8�D�sZ_�#��65��Т�~��%Ub��܎�OEKS�$�
}�,p�1"����Z��ю��uը7�[����+m�a"͌1|�	������Y<ݰ����6Ȉ/�m^����ޠS��UA��\�h4���c��_9�6�V���w���W��;l�e^.�_��j����W��S���쳗����v�ۚ�]Q�U`���r�����Y��+�P�!��F����ş��	Xl��􃙁�075�Awe����+;{_+l��w��?��Cc��z��������?rLH����
�8x�ywP�~�����9cdݥ��9 �ˡk�*���;��N���#�v��;2�9���>��U�[��ơ�?~	�-31���C]_|��s+����H���ѣG�?���6�B��r?�돛��9��д���=��Ѫ�{���a�Q�?q^��{Z�!�h{�>�=ay	��1��h����ƞ�G�)b����ޅ�THF��Bd��o�	��U�M�_��=����WS�G:l	!�ܣu`���O0,� ��Ŵ������<q�xP�у�:O$^��^�]�x��YC��
��{�����,���:c��,$U)�^�i:�W��a����=�X����>:=;z�|��
��B�Gw&vڡ�	aᱚnč~�ht^a{��/�⻘{�-aj:�_�>8����h����H��car��p��r����h�[$�C���0"����8t��9���š-�y�U����fX.Z�a�&����{���D��Lg�4t�pY�5H���f[a��o��n�4g�?���I������<��	t�9�j�~K?�z�rF����D?��^���U�|I�,_J�~:���1�����A�u:�'�-fn����C�m�x����[K�M�˨S�>v��m��By
hK�o����F�7cۊ��3b�oX%���N5p�c����<��K�{~Kb}��`����B0�F>��K�'�	�M�����R��,�������ї�-i�w� �]%�
������~X�dߍ�D��)�1�5�{�/����9���c���o�8j?��f;�PKEePQ�=���=pip/_internal/req/__init__.py�Vm��8��_�K9�����^�.m�Ƕ��,A(�8Q�H�$gJ�{G�ֆr�aI"=3���3�m�:J��v(%��*m	�%:���$�y����r%�x$�~��>I��mA���%Eg�0ŀ}sY��O�7��6�x��O���W/����n���҆�-�(�v\�Øȥ�L�{����րq��R4B7	���/��b^�*����؜�o]��������|�ZIB)���{�,#or�Ys��=v���)�=?�t�x�l�ĵ4FzS��g)��Q
Y�$�`ƌ�b��=�N�T�>��>����R�MN����=/\Q���\�A�֙����$�Ճט?��N7P�r*T�ٹ.���d��Q��l:Ev��'&x�첒iһ�O�k�ú/�d�;q-�����������^QJ��84��s)�A�2�K���O�Xu���AP��7��x�M��Dx�oCi�R�oeq6�/�ae�%�q{�v,gg�j�l�l�������o!�LKj*�[��*���`���G�45�BО+ulqq=�|N4a9Q��6����	�@��o!I��o��+���T�4X��$vr&�z�B�ڝ˚t�e����l&[ĵjڭe��(��4��ʦόV�#�zr�ag����Up٨t:t�Ր�c?�G�#��ʗ9�*>+.�9N��&Ͳ9��&�?{����`7
K����á2�&42,
sP���`�Z�jr��E�(Z,C'G���([y��J�L��-���,d'Du��a*%���G�A����R���,�V���!닜��(�ɒ�b�v*���^��T���7S9,�($���躊w7\X�r}�)���W�
����*h-y�?�ɺ//���MR�+L*KLWU5J'{�3��q�3�V��OL!n�9��!Կ��bd���J3n�t|��D�s�6͖s1�
ֶ �4�Ӵ3����4�	PKEePQ3��@!pip/_internal/req/constructors.py��o��w�7z�Za���ꚥ�b�K�$�V�.{"Oc�Ty�5����}���؆	H,��޽{�� �ʳ��Z�b�+�VT-o��b��ag�lyY�?�BɮyS�{ɲF�}�֍��^o+r��F4�M�v�[�OH���"g�m���m���W��e��zζ�5� ��W9��ݮnZ�7,y������R�[	 \�:+����(w�j#`��3-Eۊ��\4�}��eQ�k�lA{%t88��m�Z�s)�^�����|S���b�b��jKV����W��y�Y��OV��5�<��|k�l�j�-O�kQ�u��o�'[�\�a���z�mA�a`W�U׼,r�9sn'w"+V���+�fd��:����;���MS7s��碑�K��FV�L��L�Ph���I�	�ز-0��I���,|qxq6g�A��-��dX/���2�C�f�?�al��k�7"k��-��}��x�[�i��ܣ�8��}[���5"Sj���W"�^�*J�v�|������_�O��:�������Bff]!
�|Y�4/��rJ)�ނ5l��	�/~H�<;}���wϟ�=����}SZ���i[��nl�u&,aҜ�+���Ȏ'3��#�~W�9���@��%�����{0�s�]/�4?��`U����l��@�4evN�M���h�4�#� �0�V*M��g��Z+0�c���h��wQ�V|+�4��;�p�0��$���+q�Q��b�$�M�)��-B(����T��|N�|ɖu]*܂�h�M�^7{�NJ���~B'��K�[h��s��7H�"4@�Ȝ���eR�7p������2��P�9�O9�	}��P�R�p�N��d��:i���K���ֿ�6Q�%�qtq~�������e��pN��#�v��y]	s�m�8)BU�v�6Y7�~=���g6�Hd�\j�3��&p�Z4����ӧ�G�(=��Uu���#E�y�_8j��gbS� 4;�0�$ĉ������:t;O=���!��	.�X�N����� �mݝ��;�2�V컗�8/�9�f�Z�Rz��k�q�p�����7m�;���e�7��F\��z񴮗�9_�_.�(�K��c���+a�T����sY�� �,	�؀�1r�;��=[����L�ʛ`$���#�� L�u���Pa;_MaV<3�U��K
	�<qG-�f�x[�VF��M]TQo�$s��P �8��r
(E�;��O��YЎ���܌�8�x��:-K�N8�U8����	{�>L0z�ś/%��:���O~��c��y�=��_��He�u<F/:�E=�f�$m�-%E7\*���r�v�R� !�X�oP��`����[rL���̓x�?j�H4�k��҇�#p/�]P�Ѣ[�����
:�Fs�Y�
�-�]����}�1P�F���&�f�JԳ(D򝄱�0?
�&$��'`& ��k�Wv��6�F��!K�}�Q_��n����@c���Q�Hz��>�m��
7=�F������1Q�V;��[C��¹����dlE���	�@��h�q=g�w�����w�Y��ޗ0-0�dV ���f�d&��r���W�������B"?��l��E�o���
~i���R������u����"�(���Ds�(>��nt�Ř9]��@ni���(F��g�/�UBjul�Å���S��$f�#�ȇt+�qD�Oaу�X�w�av1j����8�B:���2"�&!����a�	9abF�&���E6xBr�PrѢx��-bH6�ݥ��c����>4:����I]Ă��p�0.֤P|��|���`�}���n	MᯟQI�W�C���T^���f^�n�q���B�
;(N�ŵx�[�pN\,�@Ά�W�>��	t@�ș�RV4)鈏��ƂP��"�H\�*g0������R�#��UD�6a�y�%Gz�U�Ȗav�P��*LA���h�Kб�+�kn
x,��f�'QyCy
YqޓJ� z����	�BW;���jaTN�����B�9VQ)$4`�J��t�:��k��� ���o�Ry��*���G���ڑ�b�_�<Q���A�(ʀ')�mӢZ�[&�h��Ӛ��X
LO�`p8m`)X*��������*LRE�����(W~�Ӹ5bkFlJ�lt�����>
֡����|b�*t�KL`�/�������p��t%4oU|t���_؆�#��A!�^%�>'i���Fi
!]�-�ŭu�.&A��2,�L[=XP��Jf}��z`&o���8!ɷ�N��i�B��\3#tnl��:A��Ah�����լ�C��� 
(!ڣ9��9UvU��GD���g5=�n�P*�χ%*{�z��t'vz��I0XR�3Y�X�_P�ҙk���H4	kܪr��:h�xQ��p�&Ő�,���E�$�#-%g�ܡr�x!v��������Ǻ�ݰD者d�rt�kͅښ����Ҷ���i��}�-��gH�a����K����_���~�&���z�'��c���r3
G��@��R�~k���	�Ӳ��dZX��J�}�O0���f#(SŘ+��p�!���uE30J�ي��_o�"[w�BUdq�h�!�lL�s�,ٛ}��jHmT���:lI�
L����	����,b"�:�j�"�'})0����T@c�N�M�S0)�uIJ�7�N^���M�m@w��?Q;^%��֒�����w�X���3�|���(7��"Np+3A���CX�:�)�9�o�&$��<���U�(�s�9f8�/���L�W�i�v�&@�H�	¡J�-s��S5�g�:L�)I�	+e�m�ef�m��m@�$7�R���j_eԬ�g����;a����WD���,A��+���������n�F�(�a��z8n/<aRm�^�X���q��]��&ܫ��u�!��klE�!aϵw��~%�ª�_Lu�Fk�|B�9�:�.��;��s�3���~K`t�8��	�(�U���bg�(�h��}�`�/��ݹ�/|�TN�ek��%���i�V(����&�M[�9�t�6�%~
�'��Թ�
o���I�>�
�ܖ�1�s`��2�n�HU(�|�mM�JY}^�fJX7���5U7�F��I<�9)��m��Υh�,�B����sB�y?p
{�,��]�����n?��]B��(v�2b0��d������*��G�C�p�]f�3r�=�]�;�F���lI��I'=�	��3���e�M#�\�w�a>|�G�S'f��ko�r'���}��4��B(mc�r��~m��A�j�X=�D���!�=�.>�(������=���"�H>
UR�7��i�e5�$��rڀ��H���~��
�V�h��Kꪞk�]�3���2M|����$�,�85o�/�I�����.�Zx�ї�������z�L�#��TJPlГ���S� Q���bd�+D1G�ac'#2ym-���{Ut�r30�3Ge���� ���t�zk��.�O�=�h���\�h�EW{ﰩQ�I���L�UYK��c+o�.�
S&ް���<�M���	ʰ�nV/&�Qc�+��p�B+3؇�~ru���A�9���ˇ��x�x�~��,ī59�Q�:8ھ�=����f�z�J�`m8Z}Q{���9�O�Q��8^T�
ڡ���|���ir���c��|����'�Y��r�(yx��\= T�:�7u¸<0�e��VNgL��ULٷ�X���*�����ҍ
�k�kɯ!o.���(�|P�ZB���Cf�b�WS�&��a��i�%�IW�A.��6�>u���ػ��@nI�t[au?�0��Y���1u���]6G���H���>gk���/��@ ��T��Q�
&{�i�`OI��XM���a]��H�x�Iض��V�qW�/z�X�^U<�敪$n����"p�`tM[�2�9�sW�;�.(/���E/VBj�C��mF.d�K�jD�BM��?�;��}���ͮ����E����h_���D�c"S�G��V�Q&�ΨV�댶 ��[w�l&;C��!M�2��3���z�8�6b��i�>���V����j��qw<�+���n&���X"L!ş��7i����Fy)����Vt2b~�6=�X���\݇�L�=�+�л7�T�������4��-p3+0t�I3�x���[DP V�J�/��t!�$��e�����B�Z��Šm��	�~���f
�$`���-��P��8�,��)3=v���Ǫ;η��;�ogԕ?�[d��~�����k��&�X9�j���
�7@��6z����™>�{�W�n�8�Hw�ҽ�ő���?J�;�mg3�����
�����"��6Y�%տPKEePQ�$�~L�Kpip/_internal/req/req_file.py�<kW�F��W�	9����Ύ�=!{�0k֐�d��Ew5�XH����[U�J`�͗��1H��uߏ*����[��.o�/[�Vy�Y�5"//'_A�d�TW,MW]�5<MY~UWM˲Q]�S�>���U��pnޅ��1�ĺ���F�E�N�k^.�&��䪺�"隢�/�47���S��5>/[ޔY�,�\Z\-��*E�#���U��&��R�YQdش�4U3��6�^����濪����Y�X�bQ�\/tLߎ�Shd�ۛ�y�tm^�,<]UM
�]pK4 ��Z
ɺ�J�>W���Mm
y��ѯ���?�����o����H���)��n׀)`�U`�9���\���}���>?��{�T�(�����XY�`�r�o������C�sV��	�-']
�h�xү��./��CRg���% _
ɑ���>�M��(��������D3�ӫ���]���0����\v�~�{
t�(8=�.jg��$H\�I�B?��=v:%|����S�rz���݇>
O�U
0E��Ѻm�O����Z"�Og�� �<?|�z��I`T�Og��x+���)`x���Z`	�xy�7U�����m�n@�\�,/��돯M���?��Ow?O�MޮY��0���슳�/P��Z��,6��k�,2ં��M1c�2-W58��S�'�x �
�v��AVEQ��ttx|�w�V.�fɖ8�/����}v�.��GO��������̑͒��_�^���{������>�︅N��G����o��1��磣÷'�/�ã���7�H9�~��$��͆-�
M�����l��0xNxm6�+��I�
(6i���1�E^f��kA*���
_�f�U��3��}k�N�|��+���D��7�ghg�sƶP+�9)�S#�I�̌:K��A��bj.�V�m��F�b#ԧ80���N�)U�ėEu��7#b���%�d�Aq���<}�|��Cߨ��G� _
�P���PS-
�#���,nT]��m,M�"x&y��i�����̼Y؝��4�C.Rõ=:.��0]@n�HQ�[=�9zy�B�}�MU��h�t��K�k0i�i=D�������|t�(��vPd2�'��v��ݬ7�[�#�տ����i|��h�9������\���삖
���q���m�l�S	���#Kf�&������z��F����RX.��\Q�I݋劐�o�fH�uO���Y|�2+D��;.h��@@��Q�?����ٲ*��ׂ��UW�9�pl��7�8Q�-��>:��#��l@bj2Ai�}D)7�H�rr��ϕc��Uf�G-���nx��56My�j�{���h)��Dʸ螝��B�|$�U��� �I��y��#�^. ��1��+��9~;�;
�z���=RQ�Z1%�2�{�WF����FFC���=�`�����X49�`�3VO���V�4������S)���Y�@�5G?+CN��,�w�O2*���0���D=1�4��Y�&2�`M0�p��N�#5����3�}�������j(�
 �}.N�D��[̜-3���%���l�?hs{’n|b[�[�A`UV-"WI1�{j���@
D�n�ٳDvI��Y��.r�������[�E��P^�Fb]��d�n��_��L��y\j���@����$��>Q<��i�v�~sޖ��p'����~�e	qm
'������oש��
g�gE-�wN,$��L��������I'��H�5'IC���1̅��^��f��3���%�&0�U��5�^L�ϱ��ՠ���f*e?�E�^�#i��0 �OͮU��z˗�ݽ��3�c8A:�:5o�C�	R�!+�Ě܈3)��܉�Q���9�n
ݣ��љ�����p�nO�;�o����f��zJ�$�4��^䂐}��S�R)th �f��|��.���0�!���˚/ާ:��!��#C]�xb��l�eY]/�`"탱�����c���"z�q=����B�4%=�>���<�d}�F�8pc©�VT�?���Ε���u��P���Y�~���Q�rK�������Â���g]�ƞ���Z'{�a��*����ꛬYt�0M9p�G�x�Wob��D���O=�	c^.#O*W�V(��NJ�=9"��3(֖Z�V�0qB�X��R�E"��%:�mu�y�3Mg�r�<�&щuty1ؿm.� m/�Fkr�>O�
�˃���Ql�MՁ���(U
��=�5�X }��U�6w�f-a|���nKB�"+z�����Xh��5�r�t�����~M;ہ��e��Y%\3�7�K�~�.�4�U&�@�m�����7z8:�Ze&�r'@ԫ��C.��N�vPo1�������
+�fU���s42�ް\�3�^����s��
��_'���>��IZ�[V7T��^��	����u���^�it���+CF��"*(���/qI���HO;&ɖ��^2�2�Z`O���-��qys�oX^cx���n�̓�tP
Z��O�һ�Jh]������ݡ���`
Sn�����90;i��5	O�Љ�@�df��h��`��ϝض�
���d�>��i�/��&��* �Oa�ʋ�d~E������
st7����c�e0��eed�	�wd���N�ή1��j��0���F0��y!�lCISQ���p;�e��Z�+�geW�F�*B^t-�-�J�,�]V�B=`�2��=߲�D���Tz�i����=�+�q�dSİ]�(+�u�]�h-��N
�Nh;�Q������h~�	>Ib�=�r��3��w{���`I����ŊVڒ��$�b'���֏����dg����?��Xm�%ߨj�Hf�ޕ�;Czw&Mn�M�G�L�/��ޯ �j
�dž9m����A��ڨA�L����}7��zT���(�_��t	�cIk̘�h�9�=���R�ܓ�b~�������>.{F�g��1�
\�K���Gè�Z�(%�����(�d�u�����>�S��"�`a(���C'�f�Y/P���;>~-���-��gm*�XQU�P
��Tט�m�:�:s"R3}����ʲTnU����àwm�>ތ'k)��V�����x*N��#@�\�l���n��['�v�g�B��>�b��b���ܭ��|��AA�ԍ=N���ܢNI��nz4��ڧ,����4�"���jW���V�rEW�T&�ྦྷV�)�@�A����Ee;��RB�:��|���ɻ��8�g�.^Qp�A �*�ZK2�����28(��"w��}�|V3���)p�}��F�u����W�	�I�c��{�{-��Ϙ��,�ȱ�Afa$cA1p;�Q&*I�9����:�D%����#$��<[�%�-�@���(����=��喛 �Ǹ����v�sl#��9\�1AL���<��ާ�a��:R��@ɪ�,���r���AĽ�����ZU�@ ��Q�c}�b���ɓ��h�94kK6��teN��&w�'b#�PcA<���,z<cOg�I<L��]����%��]�ȝz�m�s��7;��ʝ�ݧ߅�2�+�M^��ѴkW�ZGAd�m�|��,ץ=ٕ�|�RNH��S":�������O�8�t2��zR�:Fױ�>�\�e�󰮶N%V$4��\�<��0<vIY��,t�7�p�H�Js>���3��N�H��l��}d�{`$��f��d�뵨���UnMb�d,�g[��T�'�Waʦ�DKF_2��r��\�fI��@��f�O	8(�t�Mr���z"���{)�
U�����'uUG���D�I���k�]�]|�S	
�F��J_(?!�$�}a�h$9 �2����Q�f�9�',S���V�?���>��%]��F���\��E�$JkU�^%�V����J�~���p:�0�3ɦ/���m�#�*� ��(��P�>��*��F+��� �j���s�k����e���jM̑"���d��g�Z�&ʼno��zس�$e��
���Զ؛Ó�9C�͖���3�h�o*.`Pu�A�/��|���������텕������Æ���+���+�$�yK��E���f���y��2
���}��X��ë�8�>�'�~�`�"K��c�ojԍP�W��T�&��X���_43������+Q�6��P:��Lj�Rer��&����K�i���ޥ�3wd���&�`��f��l�	��A/�r��܋��nц����Q�Ct�N��āQ`C�	��k:T�W�P����<��0�YoΈ*tgj�9Fc�i�����&���'��s���ù*�0Qg�d+`4�D)�[N+?D���cD����R�	g��n7v\���+��Qt�T����,�9gt|�c6���k?aoy]a�"xC[W`�ͽ�R-�k��y��U#I�N�3Ot��L& )ⓡnpv�ru��j���ߡ�����7X�Ͱ���~ �����8;_��E`����u��q��2�9�l��ES�#
�kq��v8\�XϠ�r�}�M:�&*C_`��:��_朗guW)x�v���~Ǿzu�S���n?�K�PZi��p� DAt;��x��{�f�a���I�販�:��� 8�v���ٳg�Ϟ>{���2n���Uު�@��-}sI_`�]�ν��pQU���絚��?B�>�'҇�9w�9=�sxǾPeRw_�#���4ak�F�ad���]3x�Y���ByXT�CEA�u_���U�[#�?�V��d��\�:�Y)b�m�~~�
���4�Y�%�ϗDxl�U���/�>W��BP	�DUx� �b��l3�7P�[ \l23+��5�-��|�5�y)�.��r���u� ��]�=���
R86'T'��t��KD?��܎cԩ�z}LT*x�r9��K���r�>�K4��DŽ8�~k�a$�To��I0u�c���ʠu��Ł����>~:{������x9���2���S�&'oMp�%�}�O�y�/��Ƨ���>T��Z�<�gg��L�;�,��:]6xj��**p���[��"M-F-	i�h7g�	�1@ݲe�Ϯj�����"�ΐ~j:h�+�ɵ�-��t�XZ��C�$�&�����U��]�/kY)�k��2R�Uzpؗv>,���l��t�����P��ߦ�'��(��/������o��l�_���'�{�PK�mWڭ(;�"�� pip/_internal/req/req_install.py�=k��Ƒ�W�r��������tb��N�tzėө �%����~�=��]%��J+r0�3����܋�mXt��u{U5�h�[֌Ѱiwu�XԳm{��(��vˢ���y�D#6܍���'���۟E��W�x�vc�6y�|��;99��m�e�v�Eնk�1�WC[�F���''��n�k����۰ٍU�~�Ճݮ*�_�e�]ե�%kʶ��v�gC��6$�P}���]^\�8��g���	��ABx��5��6E޴MU�u�+˚|���d��m��ޡE�����.'��ۇ�K���렎l���jۋ�y]��D&,?�aq�ծ�ˌ5����U�#>m.��m����s��BTϛa��r,|�mjV�En�Z�1�
�p��oے�CZWͅl�����0w�O*ݲ1/�1�=5X�e�d5[��^���>H\-�P4=�]�ї���U͂�J�����ew�����+�,�j��_H���Ӱ�6����
C�}׷c�)�*��v['�6�`Fa���0`�/�5r�{Y�Z�e�mA�"-Y�3N貱,b�f��``���6�6���[g��&�p6��a��O�k�����%l�J��l����c"�|� �f�s5�CB�+�l�.����e5tu����d�\a��P�N�,�
��݀qd�؋c�O�j�C��R�����G��d�Q��ge�w0B1=YL�@�m��b-��ȶ����~B���$���4��e8�f�3z������=�����޼���?O��>������^��������B�|a�J��qrR��
�	�I�@#�J����;��-Hh��v�\��~D�yR�n(���HȦO:�h���б�:���V� �8�z��Fӟ����	nJ�GK�G�@]/�,�H�ȲT+�y�Iʏ��)%A-�Z�Å`gQ�ZD����fohvM�ۺUjV%�'�x�%l���*᧺M%L�_�䗑?´G�]��:�/-�Y��~�BƝ|“hl�4:��LpP����	i0�we��1�O�D��Q�>l5�'�q[5��T�=N�B����l!	'���q�R�^�V�y;K�Y�:��[NU;4k�YO�*,><�H�@�b��|;G�ebx��s���X����,87ѭ�^3�P�D�~�T=�����9''E
�:�a;�|A�*I���~ s
�q�\p܀���h�)����=����6Wx�W�n�@��R�9�
QX�jv��)g8Q�Ʃ��s�yHU��5uH>"
yU����9p�j�2�ځ��m�:�LF2��>��`���$l�	1�@&I�5��r�Ԁ�j�Z�B-i��mX�+�#4@��'ksƬ��q�k�	E7��LF���č��ᠨD4(Y��*����.m�š/��`�*�b�6u��xaT�
�4�gî��~iwTB.MSr8����RУ�	a����ؠ6"Y�f�)�X�4<�?�JETI��+)�n�Hܮ��(�/�,@�,���U�p��,��m4�k-�%��'�A�����LyV&��]�*
+SضQ|W���7D
c%�,`�#��2 um���{�%�j���K�g]޳>�i�8Xk\�_;B� {���j�ޝ�2S�q�l��4�SοqD�C�B�
ŗU�f��ћz�Z<cr�+fm�
,���n�4قf9�²�2��F�H�ۀ�/��?�V����]�ݶ��,N̙p'��{(�p7��S���qދ^?}}���7/L"�j�%��bf�l^���}�40IQhaί���$�CV������zh��^�t=]=�5�{�?%��[��U���H4Ģ�^���t+Uj-g�P��)��9|
�`)5��(�V���eT;���;�+:�q��^�sc�a�^�=^��TV�M�6Y��0���5�7�N���6m]r�{��&�9[����	���˼�m��w8����2:IUf��~ـ�ʸ�W�]T�������_{��&�o�3]3�Â2[�g�rN�&;��/C:�ѐ' ��fPF��+8ȇ-���0�q����9��î@���jQv�RbSe���]ۊ#�(��H�ha��!�uK���"�!ч�6$[�@N�qJ�`Lu�X?���\���	~N���A��	�.���@�e<Y��P^T#(��
(��W��TPPc%u���g���&hg����	:�ۮk=���������E�u�HZo�b��0e��`1b�G6T_��A�5®�����
�p3wݫ'��8o�A�m�C7Z�AĖB�������WLA�!������ܓ"�\a4�g�U��}�M�bA	�H���(�y�۝��k�^y�\@P�dEU2N #��c�Q�A�$][J�)��0�-�H�^�]�z�����6���}�ɛ52YXt��,�Cf��Sq8��+��ծ�ݯ�`1^hN�yf�	=4���wIPo�brWJO$IK�yנa����i�#+���f������t����qfY(
�fؑi��y�j��[�D��q
g"�.R	u�zX8��;F�聖f�p�Ǫ���71��Z֎�#똘h9Lwn��!��Kx�ź�@\��"P��x��j��m�,A��1����z�놽�]
\P-�I.�ɑ���sw#��@~ഹp��q�-��h6"	瘢���ɷA�����Ŀ;d��!�I�:ڽi�#W�(�S��p���f�!�f��v�83�d�0וP�K
N�wg�lDOۣ����ݸP�
	9�u�6��^�VA��%Mݗv��E��a�,�P�,��!9���gO��c˧��k�aC;����<^q}3O�[7�cm���{!�j�n�v�0��|_�s3�9!�,HU.@�2Hc�f�7��������T{��\��;�*��ho4�|X�kc9�\7��;��cPSZGDS�4P2Z(��F����VE�N{A��w}#��3�W;ݯ����^��7����%Y��Xe���"�]Z=P/+�j���`g��
���#W�y�q޵`_(YBE��&�%��J�2�>�gC�X[���.�
�؈�]��fm�61:��_?rW~%ōwC��Ax�
�U��Q��L�E���^Q��%�,�[[51�^$�hN��� ���(�����@	
h������?��%��p�)�S�����I ̊�,��x(:�GJ��R�($)&��@e���*`H��`MuV
YW5
P�άH��_	G����p�?d>H�H$ͤ�Ÿ�7.�v�����S��\.������ߋg 7›�Ȥ�S��M\3�DU-��C+����Ո��/D����|��'�]�o&W��"��f%q�"��<�̋L���td�7A1��@���G�`ߠ4w{y���I��@&�3@3e��#�%���n��Ǧ)q�r���r�r�<�U�iVE��?�aBH����9�>?㣸�C�#��!EK��	
�?3�c�nF�^4`֟�۶�DJ �e�J��y�zs�A�Y��X]�z��
�}*@`J�$<V�c��y��C7e�w|p���\b�yhlޝ����Q &~�q�(
a	��D�����E�D.���D����a�9Ŕ�c�d����$21l=���ۮX�����q�`B�u �ACj lAL����8=%ۺ޶�uG�ۍ`DV,m�]_lq%|�q,��=t�U[�5���T�K� ���&�jL�m�-�Sm�G��!J�:Z�Bw�	
1J���4�]�띵 s�Wy_FD�y�nt�����zCz�Z�5���%X�
/�.Ƃ��y�ؙ����&�(�3[R��&�к�h
KN`��D��Q�1^�w
N6�Y��v03��aV�aOx=w&�}�~���*�H�$�g35cP�F�C�Um�^}��H�lBS�G�˷Jl�4Me9}��4>#6|S�eU��G�i�T�ȒYU��,�_�dN{����Ԥ=�~�%�F��̹�V��<P�<�P�O�04�p'�~U�FC�h(�	���ٖ"�B�
]�[@7�8����F�_"�㕏���-�����l�i�����P���ι.���۠��P�=����B�f��O�!�f���gyyS� 6�+S��D��
�JژK+�>}��?��?�$��z�t�H�����1X�Po�/�'D���H��|��?!)�a�J+����a�6�7�P�	�B�?�`
y��2�(�4��g�Кih����xx���Z�1䓄��x�n���y�_??=��S�uޑ��r�SrӘA<�1�7�-�~5�(*�c̀�&���ϡ�
��y~}�}M��2/MG_��g���g����@s�OPX�+GE�_��fcn�p�~�B��HJ�P��;J�)��j�à%1>;4=p�Ҧ`�]	h|���]a1�,�{�r(���3�,��24�֜�+v�]Z;�ѱt1e{�8����~|p��jJh�,c7����J�a�Ò�'`|��(�x�8�4�,�=��p0Xy�>�KfE;�RU5f�v�HF@�")�Un,�����XgVck�f�,���"��b���v�i�K�_9�u�3'X��t�$}��Lx2?Lx�0_�Μ}L�jm�M�Ю����*�k���&�V�t�d�]��j���a����b�m���lV?�~��{��:`T�j�-�9W0��9L��A�LH�h��:"Q�F/Z�"��Q��� 
N.*�+=����ȅ#\��壹ݢ�9,�S_dv�{�Y�9�îr��c��+4�5���q�KٛظL��D�V>Y[���yV��ӘBO�8)O�����=��LIc�Z��H@Ɉ��S:��b��0i*n(<���M���I��R���ۮ�����/0���[��t��)u6��?5�;�{�g��v���
�=���T���]�	fL�I�z�[���'���E?�M'�'sckN�tzu�����0OY���O�L�3ƉA�yJ�w�A8O?�_0�k�|FB�4A(�E���d�ʳi`�#_��F�
�'p(<�@�ox�}�y���8�8�TT>�.�e	�>J�Z}_�>qk��sO���d	x g,�4@���~Iffjh³:1�#[-�	5����au���8'���
&�sR����3
�6��A8��AO��s��e�����⁣�n�ƒI�|>*�cGY���3�r��^��Z��K�7���k�B�9VSHN��<*5�l�נ���#�%�d�yԲ�#aU6�%�����>",Z^N>.��ģ��������S�.bd� �)ך�]T������J�xj��{D��$�����J*a�F��ٵ/O��s��F�g4ֱP�+<U�����h�	� �Dڤ&�� �P&%�aR�$�!�=�dU��O��r#aPuMY�+��%O䖧�e�K%�*8��-�ۋ�``"�>��b!��#��:$%.���v�T<)@��Z�q�}z���S|��Uk?O�	����jcIk����L߄[:�<��gJӍ��j09Z~u��y�n�ph5�����9��������8P�)��ys�^`�_ڿ����)(ژHsN�K}�e�SJ�^���$^�>��;�|]X�SX��Bc�,��j���<����$��N[����r ����PK|�Bbk��N6Q�m�C8�g��C��h�<H�� �-�ٕ[O�X�{X�NQ�	�{�v�>�R����D��t����:��:P�lТL�S���M/�����Pi#�;��m<\��Z��Z���vU���$�y��$�s*mP���|�!��y?���-&]�G�p<ʝ(N�(��r~;���ٻ���*�6W���H�����Y���]��zϨ6���G@�,2v�a��~�N�|�}e�3{.̃���Gfҥp�j�A�2~�oT��W���FӋ ;�hbТ�K�;����>�B����r#��A��"=&�c�\��rs�$�Z��-'���#���U\M�G�HZB�Q(�C0�R�g�"d��h�:�)�1k�aq��mSJ��ܹ�
3#�t��G�s�!�<�N��5�V�Xt54�'*F{����1sF몒7��x���㶣<<悑�/T�f<��b��ף��qt6�B>~���u�	w �<z
�L�v�������v���<���ו(�e-!r�
5dzc�\���Üf�8o�1`�)92�?�%ѸT��{�k�Hga�)����:�S�xw+<�	���V���9�>�^�?���n0��ՠ-�-�8�?W�I��K��
E����Ҝ�ڪg�0��o辗!6��]�IK��u����A�I��l2&-�"�D���3Zx^{���
�}g���*̘_�i"�����-UъQ6��sϯ�>�-�L,�m��\&C��/�|�Qܪ�����O����@�	mƱξ���:���u��ɡH����l�]1�@�&�����T/a�i"1ѐDk�rln��a�`���;��ݷ�~c��T%�H�zy���1Y��JqꯅA�)��jB����O7X��P�g<;}{�>D�J$:��o�P�ֆ1zܷ5I�(�x���<�{x�$��,�q��;��%�ш�啼*HH*��[y��k�B��_��e� i]�m������nl
3�EQ_������}���A���W-`�۶�x{
D���~�d��'d\(�
�oO�%�4%�)�f��
�O�(Bܳ��3@;UP��n�X�YN�G`D�Thu9��Խ� �$�5�@��j�yŴ���N/2�t<��˳��� 'N�Y~����Xw��UG7V����^F�
S�/����	)6��'�?kwh����g<ᔂ�j���b��һ��'ᓩ��h��W��&���E�,?��}��.�t���D(�ĵ���\�Z��7Z/3vS�,o�_��w�S8�/\���
�B8������b�-B�sFf��m4<Ff���8��*�䐎���H��>��W1{�ó�S5S!(ccBI4�z�ZJ<3�^��XAacE��E��Bq:��t\Q�8&��G@.%NX��	"
g��t�qw-��\�3}����kȉ'�s0;~B�X��e>\n�˽�F��-��u\ߜ�2h�[�~#�Pgy^�D[\h�͓4F�v�ɰ7�9��A�㨝�C�z��4�i�*���,�M����բB�e�7�Wz�T�+�E���b����X�£�W�g���S�<ay����y�BŽ��� G^͟�d}%=�f�A�U����xdL���J6�����o�860��B�7�:�ǰ��.I���oQ_M P�9U�.ш8��<�ET݀����P����pf)�_P
��
�=Z�W�3��Ƴ=z�qU������g/~x��I�����~㞜P�H�鮽�C��xE�����ǒ[���z�z�.UO7�$�_�.�~]�E�2 ӭ#l��	����2��hG����m�LK5v!>�Aǣ?o����H7_��#��+v{�1�^��х4���O�D�}=�-��-�S�%�W}�7��1��P*\�rq��\�0�)���.��#1�F�TWV�D���X�ќ��,�U��Pڕ4�4;B�\k\����uo���2�����6V?�v�nW�kǷ�K���nT���&�``%�~�A�Ǜ%`������r6ޖH%��e"�/���	���.�E�?v�mrT�^6�O/��e�HH�n>�>�j<�3��U����}��	�b�G_��/6~t�ģ��MM
�;%E-|�]��e��$�p>�q�\��j0�{gc�u�F@Q6����w��j�˥���i`�[�i���'�V�"OρZ��?�1��Tm��ȭ�k5;Sqa�ͯ��PF�\ȥ����K�@��9�//�e�a�+�7�"v慕�?�����'nή���J�̓���\�h�NY$���P�<��Fio*qT_��ɼ����D�6��a���"�{􅏛ֺ�]�Ij��dq�
�L*:I��q��[���<J�W����)�˺1�\��r���.E��ﲊ��0	�)VP�r��c�w2!���ƛn)�w��cRsB���yD��I�ފ;aH�<�������r\�d�F���|�0:T�q a'�|����ь�Rn�y}?�/��eO>��.ܫ�
������𻼖����w<(:Xl��Ȕ���7�����r�s��x��D��/2l�<�8���;���(ކ��� $�oxuT��T�9�� V��{�y2��)Ѩ��W YDN�@`b.���ub��o�b�_�A!p|���U��m;�u/zL'P��]j��tB�]߂��+�D`A�e�SӋQ�}�������{��=��"�|���f��Wn���.)�c���<����6�x��71^�:�1&7���.֗��3�WdzQ�n�d��t�\�R�#��+:EF��v&4o�2���g���>o���7�4����ki�*J��6�BW���_��	��+*^�Ҵ!Pu۬�r�*I�8z'��ٵ�
��^W�ߏH:bn�[���dx�e��#��Ԃ��-��O�Sh��,��F�ۃ����\w�e
�<�?PKEePQ�n?���pip/_internal/req/req_set.py�Ym�۸������`骪���ևri���Hr8���6�����n��ΐz!%�I���M,�3��gf�}�N,�m�֐eL�*U7�ﴒm�}����Ku8��p�'�\I	y#T�{��u5?�i̦JTi�e���='��m��r^�R�\�CV����l�.�L�c�w�u�.%����Z�!��*@��� {�_�!��K�*�R4���H�6�
��)���~�^�����7?��\�
���\1��>2`®����������F.���$�ľH5|�?|a�31��ЊNP���ȡP�m����O�]�_dY��rɵf�[h"�{��7WF��H�M�E�>a��L��Ef�����b�:}^��a�N)���nT	��j�zYo�����jx��I�~�F휸���Hz��M��sG�J��oث?}�G�}X3<(�0�-ɲE6�n��~ʵ5
ޙ:dMcI�2�LN�F�hX�O�{�^մ��rn���42�x.UCSL�b�x��ἕ��+8�����K�C;#(�l���{%����؎])]c�@5T����-�>|E�N�!*l�/O&����3{�U[6Ϯ�7�	_����SSz\S���7�5�f�y�ei�����2��o"a����83
y�Eȝm:�������4�T))�n�M���Wֹȕ×��/�L�aCU+�#��,���2�޺�C�k�������&�ҁb5h�k|���-���$��@��k#h�jC �K����!��ij|`���X'��R��b�}Q�vA�2��kT���.ޠe�ij�
{wfܮ�����#�x(���B{���"�f�ƍ;�9~aX�Jvje#�
��	/�'8�M���$�&�D��G $�S�P?
䍙�ڊ=���D�e~��IQ�k�A���0�6Z`��q�\c���e֍����8�f��7���D
�PR@w�����_���F�
	{��%zl5v!�S�Mtc(�h$��
�hA��Í��I僨Ui�{�=��9��
�64����5b9EA�K�7{�i$�^�MN��kEl�u˜X�ĝ��Q��Q��,t��u����ym��S�ʈ�.?"�JU�u�s�ȫkg\4�Y�/���A��gN���/�F�k:�
��z3H��Z�Q�r�I��]����)H'�
g�,���4��M�~�
�MJ֛C#���SZbP�Z�C��hr״���|���B��6&&�qmB?�v?TG=2]A.�g"/�3��w}���v���[��7�$�Q����{׊+&��/S�m?��lk��hFDg���>4NR�͘4���C�S��ѥ���&���t�B��IĚh0>����6Q��<$�����Z!�+�U����m�<���|G�KLB�(��<�$Gγ��ѧ��u6`4�ӤXg�O�r�,�{�δ�{��#���2A����@ydH`��~��e1��G;ps���cu���e�aKm�%�3
�|�Yj�����V\��"LS����#�M(�)�[{2E�i�����&.07���5��&�/J�ˏ�(�U����<����BX�w��.���
8h�b��x�%Fi�*l�Ƽ{���,�
��|�b`^��`#�ҟ�<�T����`�x��f��sb����W�s��q��8\�ypM*����P�[���'�y���Y2�>N�����.��Ft��Գ\v�_��/�b�
ֈ��Nد������&]o8�gS�=�{�ۓ�[kXS=1�G�y&b��k�U�a����B�
G�A�s��$n��[��jw~��

t��2�a����9h
�6c����
҅���Y	f�fe�I���n�k:�4���--O6�\?=�7l��+���IC$ikI7�'@:�a���:��*
��￙6�v�MjGF��E����3����uW_8��z�Ễ�[�7.5|�D��eI򙨽��T�͏��5S˅t�tm����k�^%
_�6Q�&f�1K�����
ص�I���Ǝj��ݨ
>M�1�p$
�h�`o,�x�v����w�yQb�	/�_xg����\���EWt�n���#M�.�0ͥ�N�6���M�%�I�w� P~�^�I��e��<�/�K~�%0�>�w�}Bo����V7Zݨ�D{���{O�/vM~�T(��⸓��HY�Hu�wm�
R\��e���r��~�$�����PKEePQ{@��R pip/_internal/req/req_tracker.py�W]o�6}�����Ş
dX���.���0��h��L�$����w.�OKN�m�X$���~jm͎��z�V�)S��X��ҙ|�e�G�r}e���>W�jEZ�M��n����f��z5n4Z�}�*xz/uf,�)~�>��j��ޫ�q/wE��Z��o��+o��	�C��o_>~I/�]�K�?_]ͯ�¼�����B�t��V��R��n��9Ӻ�Z�)���)�Pxei�>Il��}�Xk4t�[�������J�<�^˯{X��ڟR�3�����w��{���/Ҳ��A|#������;�d4��8��?wBer�E&!Rߧ�nZn'ϟ��Bo��D���X⼝�?ռ,�����0�8�ʂ�R�����^�{� R���y�3/��"��T>*�@ٻ`�Y��HI&ሃ�,-�^���nP��@Z�g�K���K<M��Q	S���B����=�f�����tѢ�Z���+Yx�Nf��j�o�������t�A�<��*DS��:g��{��6�[y$4��@�W%Аֶ��=H�c17deW��0����ɾ�pN"Q�i�W2���`B�Q�Cq�8"�+��lj��N=�
�K�s��H�zp��֘nRQ�'��������8&Ń��v)�G�?y��m±�l�[�r8���Key-p/0V%"�թ�ɝ����(�.�Uτ�o;K�;��LGv_�I��Xy&��Mr6��+��?eƖ{�g,�J/<{�Φ��ɨ�H�#	Lj�Ҳ.a!ݪ-�*G$����0��F�V��������N֣�KΪwI�������.�*TH���4����V�dX��K+��  ��@��m�.�F
�l��s���}�:~%"�:�����Z����k�U�_P�_�"�������N���0$��^���=���C�q�O�*�B���CJ�W��Cji�zl�.M�����ۊ�/LH	��<��1{���ؐ+��+�.�d·�1S�U�n�%��?��I��iy_�Ȳ*7��!�@�svv�:�0oL`̛���rMm(��vd}�[�2�:�*����?����398���V{h.j������oՕ�Bu�I�]"�jVV�����)L��a]�`�R���씉hsK���N���l�tfp��1w�"L1t�
�d���H���B�1#��u�oۡ�kO�j]p��
�r����C�Q�:�fF��
��0
Z�-�`�Y�Mf$M%7T����m��/#��E�DⳫ���>� �@�
%;0����R[/%�#�W�_�<�J��V���,u^@�vOR�ىăDgf�C�LbY�����H���#N>����Ӿ3N֝�t�ɔ�ƃ���yE��2��;P8U�o0u����;J|D�3;��k�o��R����)d�,Iod.}��b����j�EzFwW��
P���T&���)�K��rA4?8���o��jrO�iڧ�
Q�ܣ�m�*�g;4=��P4�����
�S�Zm>��PKEePQ$@����\"pip/_internal/req/req_uninstall.py�<ks�6��+M�$N$:���=_�.�y�N�f��Iv.�qq(�S$CP�u��߯��A[NRu�`K �h4���]�cY����g+wm�,_���<����T�J���}�ꛦ��j6���蟍y ���US�����gn�6�ny]4�����d;[q�v+�wu^��n�۾lj��\����ʱ�E�5]l`լroܲ���8��{����}Y�t��ڼ��޽z���wo�l���<�Q��x����d�"�X���ZLJ�J��gg>/������~��F~)J�gjE���*2$B%��f�Ue}��Ҷ���P7�.���N�����c�w&H���͊���wů�
��?/;L�x?�vl�}�ˏ�d����߳7?�~����#��-A�!HB���x�<����媟�W0��M��9�r�~ B��~��o�>$v.��S�����VW.�����w�R�R��?�m�eH�,K���
�f�Xue�S�����4Ǎ���D.�	��_��;�a9K��-���uM�4d2�<�x�s�o9{U�o{`�u��s�f-�
���[i�GsP!|H|R�
�1�!���>|@�?|Hi�*D�WЎ�4�%4N�I�'���%����6q|%�X�Vb��8�Z�"ߧ�6e=S�=2˭�>"���]s��4�k���v�`P��-����������#�]^�k.zg(  ���"ą\m�<���� u���P���m�g�:�a-�Wi�Z�����&F�����خ���I����ռO�n#���ӛ��V	��&�0}���,�#A[��P&��w`غ�Wo"�����'M�a�d�X� 0��%�UT?S�p�*Y�YT���p�	�����$���8[��	��y��7����6�~t�j���rd��R'�zl�^T&��h�V��9z0	�W,���`'l�…�N���8?�찭D���`�A�Q��v��RȧUP�g��
-@�k�N�F��x�y���u?��O�D�X\����0�#��
�㠫/�-�
5]�A�A��lJ�s^�ֵ3�h����W�qO�ۺ��X|s=� t.
A�D���"���$��{+�2��
����Q�=�)��\":�lb�+�ڕu	����%�F�Yڹ��� ���B֖|��X��Z���ϑki�n������w�
0�d��9�x����C�[pL#�r�l孻���}�f�k:CdQ"j.������~��x�p@�WE&nJ�3������ x]/�����P;�<�$���;�
&����aeIr�.q5�7W`��2��MG�䢢v�⋌3�����]�'����I7���v�rbM�b�#g(m��x�栂�	�\���R~?mKAcw������Ր%(�ÖK>�������^q���؂�[�)�:Ս�$W ��.G�(�7��43b��gm2gm"Y
7H�F�t�(�T�O����
 q��;�,U90��мxz�W{P�Ib��ʪQ�'4���e�Þ�1Oz���P�ЀB�Jpəc?�[ahq�2
�I\I<�Lv�,9�O$'�ʶ9pe���\<�A����aȱe�>�n��I��"�}�~	���[:$��԰��0�,�������̓�[0�|fw��-�b�EhY�� ��\�Ӄ3��	�Y�7�������4{p�и -��#j�T�ΙHz�s�T��}�"t����@g4$�*�D$Q:Ι~�4��r��"�iO�r���LҌ��f8��7���hA�<E���4��C<��F	��S���>������)3q��zn�;bz�[�5"-��a[��l�kP�m��_B1���`@]c"\3r@#�F���
�8mL���&�H��7
H
�w7�o�E��r���`�6���T��z��+�<`,�
D�G�2r�O��kX-�-y�9t��C�Lq�]��(�Vh�[^h'+_bD+���^X��-Ae��)�Ѣ��"%u���9а�k�D)�ʝ��6W7\2O��}�I :F��2��>�`�$��MRDe�n&�R�P5�P���QL�JV�ֳ>�"R�5K��n00
k���8?�R�%�t��#Ĕ�����K!�Z���_�L۹³+(ɡ%T� q��Z��`;tT�Z�dъ���TA�P�*��r�$��\C��̸+7۞m����l��K:]���V֍�,#310mrP����NY�QÄp�z���4x��a<�0_�t\0�٭R ����g��1*�r��R��w��
��\�Ry���0��:���0*��[��r��>(���F:q��q�<���0���aZU9p��>[^�Y�Y��T��	(��\?@E�i1CDG1���v)��Ofc@+CP�G�)R1�.�a�
�~��Z�|d2��A8���妐�!��
E4�Օ>����&,�$a
>�F<D+��L��?Y���R��<��D�Fe'���["��̗QfKyQ���0rs	A1�	DÁ��յE���@�I��R�Rf�m Q.�;1N�M�l��;̯��Q�(I��&�F	P��0Sg�@�m*���c$V%8�8_5mI�Z�!�4���c�ď�1�Ն颇Z�Y��H�f��ұ��>䛲..'F*&��]
�dD����cW�V� ��0o�I�)�Mz��
�u){�ˑ3&��C6'�*�X�4
\�Ա�T̥�)�idzm!�"�oN�!��
��:j7H�L�٥������&#�anb	���Z���#�&	"���ڱ֎�,K���g-���ù�Ql�c�B{>�s�ʏ��� ��ވ@T����Tƴx������?��W�����!{�I�\CJN�?A<=�b�̩U�h���	m�V�֨��6LwX[�n���
�(��Ӎ�#��4�H]|<I����֥��J�"r�`�B
�F�&
����L�䐘��
=
�Q�N�bY��>2�;��:�.p�>%�P�@���#Ç�w���8*����`,�:H�*�}mJ��U�9M6w�Ը��d�"�&�Q�4���Z�����J�7��Y��K£b����G#G�dE@�P��+h���^�<ڡ�x�ly�xS�L�82�u�-�hF��)���RL+�Yw#�U��z��Bw�z����v�]SU�|u��'�,=�p���o�	g��~&Ŵ�l�
�x_K7�s1����#�To�ܞP��5�jڂ/����
o�|�S.��y0I4R
UÈ(i�V3��'���~�A?^ySz��*����� Ѵ���Ɓߍ��c���e� Mҁj@��F�#���䅮���]��� ��o���?ZA���4��j�Pq`��a���Џ�Mvi2���K)0��b���iw����sTO��v�>.���_�9�z/���[2��`�Ү߾�{��TErIk��œ[�e2'�i1��˓�S�*�\-&���n�Q�m5��=2Sy��#3�k��ƟKj�^�h���J�FTuu����0�tں����A�9R��ACW�Ҫ�˗"݀U��;�ש�9�C���
��0/������˜�5/
:�2W�<ͱ0�\p��U�9�H�H���C'ݏ��'N�#�8ɚ��"���5�:��ȅ	rIG�4I�q�Tzp`���k<��*R�b!]����"�*m�+��>�n��<��w�C���Z�)"֭��,1���.;gmoB �qP��&�#�M)�!��G�'ɽ{�;
J�`S�'�]��O>��C0V�h�F��DEI�G1�o�@�E���o2���v�����w�Fp�3FyԓN
r�1�����%�[���ySSJ�7��;9�\�`�-������j|ܱ���Y^O{G�L��Ka)搼���fJ'�VS�� �	�bn�_S#��ꢩT��,ʛ
�u0��M�k+gÉ]rLvS󟋋�|���sh��u�0T�Zg����40���^A�:S��V�kt9���c%SK����
+�IttX�f�4�0��Lcy�F*X��R�c/)�4����wS�G��d�w��o�+�W�w�Fc�@nUdW�22�>�sU� k���dd`�� HWyx���(�S�=�vb3gn��;2%�*O��Gi����O(�!����^�2<�U��Np�
�K-Bm�E�Q�0����6
(�M~U�I1���0ůO���~7���T�"ew��3=�5�1L3}GL��+�s|2�	�P�Ƀ}��]^�s3:�O0��4P@pJ�a&�򎀸��sh�[���p�DJ��5�N�rq3��(������M��wZO������f�ިQ�#�m^o�K�۲�\A���8�|^�u\���遨� �c��t(��F�4�"�3=�3���,( ��ud�GH��'�%5E��8e:'� 2=����t�r ��鰢3�h4/��u�Ij�~b�ϋ��컟6��Ύ�ۦ08S�����*�<K���<��w�cP����˅1d��.K��&(��aQZ���sM�h!o�1�Ĺc�~�"G�Ts7"˥y6����ck3��}d�fCT������$���@�r�5�O�`0��'mB�Gr���=x:yW0@?n<z?N�9��w#�v2S`Ag�f�2t��#?Н� �`���~R=�4]�T���m
��@vi���CM��4��%�ff�Nez�n��ۖ�ʼ����if�avKa�6Pw��fy�wr�L�H��9E<���K�]B���X�h��Q�un�����_5B�:[݅S���3�
?�F��f��a��CJ<���D���^=3�/��z.2v��g�Jc<
�`TM��)�x	�3�/9�x�)E@z�ͅ�$8�&�F�5ӗ"��zH�����8\�nH�Gg^b��K�����������|��B����K�^���c�%՛`P�20[,����%~'�jP�҃$�� �ڜ���(k^#M�8����6>>���@�ћ �e���F-z<3
ml�E���7��f��}�FyH���Q���1�8(�,�i��]���D"v[�[���z�K���:aTxI��ax#�	����/8A�K�V�W��-/�b?�>��yLy�K��M��佔=�ZI�9J{�se���7��^Ġ������tU����H/�t=�N�8����a!~�-�Q��]`~C}��\������☩���;C4X������<쒯�,,�Ө
�@��ܩ�ʔ��wٷ�:�ŗ�_V_}�h�_�A��V�;�i�wS��%"��@��W_]�o���?��NN�g��-4��d��FVNh!��d��S��p�!=ʩ3w�B�r3���⡍2���w,�l����B6�iy=p�@����#'y2�i�F���^��e�k�Bz��T.����.Y�l��/�w&���'FuXV���y�7��tf��OI<Ί�tQH��z�5T�G.O���l4�'�	
��b���q@�{�7�/(���T��R5����=O��K��	<N�Ks��yӉ�H�]��A>2n����7��7H����I��q76��)�c�^=�������-�~:�n�f�,�c��	��`�6P1ލ�m�f�^N��S?��o�0�59�X�|��,�
5��d�B.|�/�v��]��od1N�?m!T�T�R�g��ya����&��k��)^ic�1R*s���Um��?�r꓋�l���XR�v����+��<��]{%Gj�
A�c�@P��P�w���A��Pn�/��{��+�<���H�\���鰀@^#T�9�Ȓ�w�:�d=�s��
t�}Y��ӀT�(��࿾A��4y>tѕ�FJ^����Q�.z6b�_.�B
�z�W�p'NB�8eAwywS���
�b�4�y�@�WxP(�]�X
s8�k~�L�-Q
æ��E��ր�3�k6y�^�Kpދm��I��We��]�Ë��Cgz����E/|,o���;�:���_�c��w�~xg��9CY����]q�՗ABCs4���l��=�O����%iF�����FJe�Ԭ�
�͙�S�&���/��]�Z
b�_B�w�v{ʥ����<Q'N�OZ([�8��£6B�
��Lژ&ʘ��,�A��O*��4��}���J��)��}�uz�/\)X'�	�i1}L�]Z�K��
��J���_TCX���_*��q�ݮN�'�D�.�*���j~�.�w-D��j�յ�~�$аj
>��⯓�L��d��_��ў���O���[-J���X`�<lu�j�k2X�Oty=�Xp��8�F�8�Ё��,'��%%^ՙ)�uY����T�L���R]�B���$�KT���u�Ύ)��$˺�Ɣ��r�}E�g�}@��M;t[�PKEePQ$pip/_internal/resolution/__init__.pyPKEePQ�h�'� pip/_internal/resolution/base.py���N�0��y
K\:��&��i�	��!�4EY�n���lo���i�`�,�'��/r�T�j[
Ri�p/��P�+[n��'���l��w��?'�4�U��=푂���z�06Ι��,�׭�ل���K-���v;���X�i�(����	E5ʟ�3��!��u�\
�d��G��k6��R*u�n�ٻR��/�ʠM)��=�]y/����-����Uxf�m��S�"�#�B��^���n���td,#$^�E�S�&D���:nP��0b}�=�1u�m�}X�3��H��PKEePQ+pip/_internal/resolution/legacy/__init__.pyPK�mWFR�30�I+pip/_internal/resolution/legacy/resolver.py�\m��8���_�u��
���݇k�����mp��F&��E���%�ִ,iD�;� ����/")����t�Y$���T���hD��*;��B�e�u5�}8
��Z��k���5����I�K��˲~�W����n6��%���/ZqU|x��<��d#2�q$Pz�i��D֭a܁�y)�d��eu�/���/-��.!J𩻣h
)g��w�p��3�9�Z�d-��9��%��*�E�9,��m��NhO^�BH����he�|��J����%pXp���w��ywd�}5����3��V�+���32y��2g;��	�,��$XS�i�oEdN��|�d��65m���7���>�I���UwnD��K�gV����XY��U��l��'XXY¹Y��3���aFէ�D��ui{dG^�,�C��$���m����4�#�A�/D+�ްQ��6{���7!���A��E��=��d{��:�*�#;��{CGDO����u��m�U��+�78��o�ݱ��4��*�@�
4����A�=/�<��G�������~��Edt3�qP=�o�;i4xl�(e���eѝӎ,��K-�	h�1�
Ԏ.���!�BfV���y�Kdp'֠��	����x����Q���֎�#Gb��J����6t�J,�'�Q�P3�9;���?җ������^�7��>Ҭ�$Q�)�R*��@�6�f?h]_3�5��7��;Zgh4w�E�o3�aAW���̐��B�/�e�{�(���;���s�p���g}""��W�������\�8՝�~��^���ڤiE�[Q��dr�	��F�!4M ��c7m}_��Y��o�����֕�O�s%#���nog3T\��֘����-Ӵ�'����lV��J%H��W*��(�g(����dt��^;�Ht?o������l�gV����3[)�1m�$IVl�Wv
h�����_��i�L(
S�ެ��1��,
�ߜ�ҾP8`��+7������5��+#~�6~�^��l:�3�,��(�|P�qI���:����ͩ��g��v�]��V�N�����t���\��ii',�.U��a��6�-9�Mi)�#d�2\��I�����%�ي�w��-d��6n���{d��w�[O��85��1�I�*l�iA$
���)-Mx[�P��k�Ȟ��9�s�ǂ��b��|�
F~$m���q�p�j�2+u� Ǯ���m�"Y$�b]�x�$���g��D��!�>`��-E����_�uu�|c�u�>���
����ţ��{X�D��:Ljð��9�/j��I���`�!0��Y8�]$��n�O�����t!�6����E�1-���20T�i��� �0�������3B�_�fU��[Mf��;���mt4���:���@��:�L�t�|嗹���|���n��W,rl�ꍄ�����9CݢKӁ�R���qN��g���QP��<F;�y@�*s��i@h����	��q�
��@y�P��eM'��nT�HW{����xo�;k�S����\8;��i8��sl4ĸ� ����ZM��{i�hM�J�X
�t���Q�qL����}��2��+�8����'nӧ��B�Q�nt\�<J�1��%`
;�ZEt��:�?t
z8߂YF�ߎ$��I��o�GT�DZ��c�iXt�,�Lp�r��chv�{��|n㙐���l�8-K�s���C��j�Jݖd�Y[ׄ�Z)�g=rJ� c�<K��֐��Cbp� h�<��$s4v��L�F���:tq�T���>��%�rl)Z�rб%-N�P�5H.��+�yE��''��ω֗�0e�ڸɦ����~���qD��ɰ��㙛�Ua����3l������-!�؃΃k��$�L�̨⃳0bf��R�_'�1z�ۃ��f���g��Rs��}���m�9��Po��[9�Mn��{2$���"&R�K��;Lx��N��ċ��AH�FtT6�7hJ�N(��	���
�ѡ�dw3^!�e���x�I�ĭp��3:m�i)�~�+�(�U*S�q'��>`CE�N?+бH��``��Q	5��c��<@>��a�4���TP����e��)o���2���E�|1��܉}$�sZ�TvX��:��"��/4:����N�Dy4��S�7	oP)�0`�A��O^�T�㙣�y���y�d�+�Hʸ�j�����_�S�a;�*������˺�"E�D�|h{�L�4��&E�)�)V�,Py�29�*+�v�����=4��i0�`��ϸy�^՘���)Y3s�G��ur�=�A2�r2��N�$��,��a�F�
�HP7%H��tw��
��
����a=i
i��k^����+��g�"�����m��u��J�*��v.Qq!
����=�+3�uRωR��&KD��cɑ��k���JT�ԌgY݃0�jE)�94�t��7:�o�A;�.��kg�p�D?r�@�Y @�jK�ٝK�0nR�&���TYtY�^TCtCW�:L�	��Y��&3��-�`�����; �f&sF\ם�Q��3���F�M��ڋMJu�j^b� �5 <�ņ��85��/+��YM���Pg����y��t��F��"X(H�qŎ�>8���Do���iN稒�$�{�R6�	:p�БK�
�p<4���O:n�	#Ĩ߸��_d
+����.�c�rgEPpe�	�1�?R���	�͓&��9�&͗�ڧ8�1L��YpU�0��z�jMy��x����/m"�B&����_eO
鄱7�1��C�˹>e}<ui�p��4`���CosO�6X�H/$P�rT�~&:�#��|�u�A�_�8$׆[�yQ�{��d<5���K��so#�d�H�f����b�.��\���)Z�Q��M+%,
��#S���ITM�-�n�-�N@7��5a���OG<j4�0��݉���ר�揾I�GZO�%
M�tja
�8E�W/��a�(+)x���C7�.���ۑ�I=��>c�j���֑
�n^߰��?M��.s8eX+"XC`IP�
�&muW���ęWwcwDo�:��n����
�
���׉�<��eDԾ��Tx]��?���D4d��7���G�uE?Q?�@=eV�M��!�:`��/�E�����Jq��A�A�D�!�-9֟~������(Ё��d�ؐ�C�Ã�O�,��y�b_,ͯ�T���@��>}����W��\MZ�[_8֚[��ox�kp8��(�'�4���3��ו�[
HAx�rL)턲�ڻr�{6�GQX��9������7h��,��r�Yx��]���-E�8��|���bVi���^�$z])�^����_��)<H3Q���{�0{G͹ꃉ���d��(���Za���[O쫼蛒�N�[�ϑ���gЋ��+(v�@[?�=&[��䩐 ��0��7}�A�	���_-���b�B8bz**�E6�ԙ�R�T�u�S
*2��.NBNw+"��;�Ը���ӷ��W`�:
�r-8���3�I۳Y�3֗�N�>�2�f7~�)
���B%~`��X���JW��XY�]�N،��,>J*�v���5��K��ᛰ�,�-@:$�7wH4h�%
O,TF��U��jzI�@\��:���u�*����,�d(~@�?�;�k'n(�Ra��ƥ��
zus|�κ�m�y�ZYR	rsQ�D^tܫjR��X�j�I͐��%^~Ξ27�/]KA�I�Dgk��I�(�x
��öt^w���
> g��b,e<�Y���I�,U�]1�^���ٟ T�8�Di�SC`EPj2�i!�����Kq��y��]@�D>h����e��8q������� h�ttH�Lh!���p9���+�
7�>���{#��ʠ���V.�K
@�a
'���Φ�w �g,�dY)x%0	�@��P��؃<�3�N�����.��TwдϏ��9����
nߡ0'\���o!���gl��_�m=)�����[O��G'o��$�lџ"wEptY���d�ߨb$���D#N�V,���}N$_&�� �2����TF4z����:�4["�Y!ұ��8�!zʣ�!=G�ip�{����C!�f�
��$a��BM��T���5�H]�8�`/��OZc}%s����� x=��tH6]�<�L�*h��_s�+s7]��b.��^
��56Lf �%�x�=�n��,�2x�œzbģ��*xIs{��G݇�D����L�9�]�S�.̑9{��-�TiQ�֢�9<��W@R7��<<s��.�F��>p�L���^���+a�� v�����<(���1��c�U�zn�2Ĩ���P���8x)�!-�O��Ty\j@���/^��n]�'Y��h`�.x��J9T5UF���z#��x��hݚ6M��~��i����K���B�oÆK��ހ'���6���D�姀�)ʼn�Go���t�YY5�F��8BM�:�?�Đ�>L�b�t�)�]��Z7��;��
�Ne`�O�M�C"	���<�9�C�_&�h�b71���g�"�TC[� ��c��ƍʦ�GJ���l]��<GH5���q`�F���ڟ�����A�	�J�/A2稦���1��J�=�3�2���k;��'j��B`��x#�X��ˊXSŅ��T��
o��R�c���m�!�w������^����\�o�7�3�	_�RwZ���%�{����K���XLq�7�����\~"K�OE�e����El������*Y�
��mē�?����W�U��^�b9�>�k��`��q��/�Vm�X��*⅚]_K�x����������"�8��}yr�]�{t֖:7!R��:�!rD����GD�:�X`�njO��^B��g��O�xEs�����Am�6�S�W�G�h�=\p�R�ꐠ��7�Xv��R�c�
��
���ʠ�(iT�]պF���W���VQI7S���`�V��Z��Ҁ�rّW�qU�N3;dl����\mF��Ԣ8E���m �p�y��P��ܸ�mY(�³c!��f�>#CF̓Q��4ԭ��q^�9y<b�tPޗ�Ł�^�y�dw�*x����jCd�;
�q^I%S��ݹ)l.�n#�p������{�WjR�����&	�����)�R�}��PKEePQ/pip/_internal/resolution/resolvelib/__init__.pyPKEePQ�Yf�m
+pip/_internal/resolution/resolvelib/base.py�Vmo�0��_a	�R��4���M@�6@BUe��u5K��v�
��9;���i5X��%ν<�܋o�dM����R��a�5���*�
|�Ai��F*C.��%�d�[�5��JR�U��`5$=U.(��\����mXU��nZ��a����|����S��[��65H����=9}u�^|�L�&o��/���?gu��k%�@ 19CGl^AF��%���Ƕ�0�<L�7$�M��i�ܝm��pjY�Sqq���s'�D�Kf��mC�; S����(��f���Dx�Y�$%,�B����Q�+��0��qG���T������lL�='���x!�W>�X�V	⍻�X[��4e�Uu)�-F���+���5��k6ʻ@V1��Q�Ur�n:�1�bZ���(�9I�ܪ��-1S�
���j���U�
v��02�o�̗��h"Dqkpե6��.���;�*�C^�Y�2b��1�iQ
�rV�n��A~:�����meS,��>#�i�v������w�'�Q�6����f�����"&����I�\�j�=K׳5&X��s_
}���8s��p׬b��R�f�@D�oU�����h60�{�zh'Ҝ�8������W�z�?�p����_�A|_����v�Ʀ�Ŷ�/pv4��m��
����ϡ`\�3���*]��ι^ʶ*��C�F�$sM53\#��o}��0އ �ٿ��Q+W`h�H+w��p�&:T����ֿf9L�Σ��܃�����n�&����~qpX�~������Cɍ���{-[U`o�.��}ܱ��6{(9N7ZB��%�����f�wn�Tuck�L8La��Fp���  ��0�Qz?���C�z�q�PKEePQ��|�y%O1pip/_internal/resolution/resolvelib/candidates.py�ko�F�ŖF`
`yM���S�4�^�K� �;��P��ޚ"U�����73���C��8�Շ�������{�R�M�t��OOUuz���v���z-6j�f�*�&]�U'�v�Z�v�v�id�'o��y�0�v#�j�d��U����T�;����탵�T�,��@�,�*_�}+/��+��?�+ߥ��5U^���Rn:u���ٷMS���./�.T;Z�v��ƀT�������e�gR�X| �����g���T>�?me۽���0.��&;C�zu�m��`6���?�ٴ]�]v�g�F�` /�fip�P]�(e2>\�J�A�����7���`]j�.UU�3x:�d�ڥ�OLQ�߃��f�%��0,_��МDX�����#�m��ug ���݆-���g?d~�����WO�<z�/#O�"o��� �
"Į��N��Z�8�C! !���.�5�ϲI�#�Ks�)�j^&��v�^U$�е"�H�Z1�����f)����Q�m7���`���x�/���u]HU����o�0�8�D?c��v����W
7��I�5_�~��e#�bg$]nn��I��Dz�'���F3R����,�HP�l�
��\fc�z�?���zS����C!y,��4:Tә���1���y�J�RUwl�.�τj�}i�����c�4,�O8�O��8^9���J��i�0��ګ8X鹾�=dhWK%���<����L�S��j�����[�<��T[�Cl�p�h�s�t��>��j��Zv~�܀�Y8��N�z��,
��k�J6�ۙn�L���3K�F�`PR߹��`��7���Fvۦ����`��a�"����`	�$�K-	����[��}B��,���;��
ڦ��K!�"\B��Y�_dt�:����Z\��R��w.F	�c��|>	Io,oZY�H�ې?����3KۼS-�tE������e	�UdC}�"Uh��/�oQ�G11ۂ�@�W�͛!�7oR�<��������V�B�R4:��;ݙ]�@8F�}!1�uh2'�#����Hw!*)�Vt5,+�-π,|�l�	�`L��8���l7�g����A�k��^�R�
�1�ߔ>	�M�vS��琜כFQ�Vi�Ðh�̗�k�/Ǡ}��|�1QH�x����K&;�ОM]*�Am�h���ORN��<�}ŋAd��N���>o�%�P��l���y�p��3�OT�-�{K�Fu
���8S�E��ޖ��Ԡ��UlA_TivL�Z3�AҸ�Iug�A)S�A&���,����͜L��}����G��+�A�e���,W	����u_�m�E+<˓�9��#p&�Ug^Io�M��4��'5�`�Mw_������e���<�իf�A9ם�)yg��-�Q�aLBO���sn����b8b�*�#6��[��Q�`�3����V�y�,4� X8q���B��F�ŏ��<�v��WȢϚw3N�O�k�2�$KmZ:)�6�0���Ϙq����|��Ր���8$&a�1�@��Q$�Eo�0ݯv�lQץק(6�u��1��X,V����t�������<��Vp��[�Q�K�#sָ�����S�I��{̷e�[�ܯ!
�]�4M���� �9|L����u�Y'}���G����4�'S�D�Ilܶ�{�o���
yW[�nd�Y`=*rx����4<�4���0�e?E�`��8�o��AR0N�t�J+��I,���zi���_MY)�N	��id�D-]AH�mr5��9�u�$�=�e�Jg�)�f<zڿ��+1!��S�Y՗]���S�W�
�(E�]�I�8M�,ϳ��'��5�r�����<@8d�T"�@$�Y[��1��B����>źO]a����z&��h^@!Y�u�{#�V�x���D��.���Ė:�ð߆ԥZs��E㋙cv=����30hV�#�l�3N�	���
W�C�DD�2�)�(^����e!؎~梜#�,���*�@�n �n6^s��Q����@o�p��j�e}Q�o'E�_���=p[:���v��Ȃ�)�L���b�
��e���>7�z��1&��T��l�<`�������S�6���x�k2<�ȶ)C�!�q�7Qj���&������\���:���.��΅�o}���KwjnK3]�	4?��
v��J�.=�����N{�0q%��Of�C�h��2��((�EyWY��-����]�������g��o��`�E�
�s�t�吟�~���s�j4w�i�� <���N��O�MOf�A�nJ��G������_�V��	m՝,�eU�y���YƬ�H[C̷�� ѐ�g��
��9�џL6���h���k�3O�9�O�Mi[ȼ(]3)b��P��Fp��"�x��Ͷ�0��5�ycP܃>p�������R�\D�L�N��=���^o���uF|J�ٮ˼A�
Є�B�޻��x���k���6��bd�Y���lM����L�U��$y=*C��3��?@�&��7�6����,�=�@r��@�X�ifɨc�ޣ(��8�]3y�_K��ω�ڔ�"A�H���Ck������J��~G�ޠ���T��`o��K��vfl�t!�3��F�c�����i����&�ԗ `��naC�cvџ�)��[��f��`�8�ݜ�
��h�S�ke<�3ҋ���&]���	�:�-��m�,��蜘�+/5s~m2�pN�h����*J0Hj1,1Y}��<4�\Lh��!��t$���9^�A
Pf��*�v������A�݇��^���i�	��i$e��/V�	M�Y��B����
���Lv�)z�Ȥ�2W����!������F�2�$7��e�h/D���z�z�w��.ӈ ~ܶ���Zڬ�E��%]����^Hx��B�!�>ha����BBX�]-�Toَr�c��%/k��A�����蠺�l��Ay�va�5�N#�XD�nN���*A'O٦�s����lU����`�N�'4#�Hf�6�[��w�͡��I~�{mV]�����%���w�����'�
��7��6(�E<���/���]M dq�~�c�0��V�G�,v�֫����:����*W�+�|���'(��2�K)ނ?j��hڝ��$-<J��4�n/����HM�%��.��E��ܝ6�A�	E`r��I�k׽��ׄ�$hR�XUG�Q�V��Ā�������J�q���D���{1��X��%����E�	Ƴ��xQ����J-���o�MK�F:D�ϮYWV��ּ%G����}���,�KD��@�	��tDWyŶR?m��*iZrPW���][�孲V��{B�C4��b�_)-�j"�͙x�װ��R5e�'�:jC�h�2\�P�s't�W����`%w)�҅Z��)rN^]yF�#��B¨Β�^��Ě�N=�K�d4!oı�ӡ~&H��o�z���a���:1]ְo-�z���a�nJ�▉���7�Q81�=N<��~�������oТz�F2�$�=q�w�/�n7vO[%;~/�"��@�	� ��z�@�aف6l(����S�
.r	<�T+�����_�~ua{�u�<� Kɂ�(�$m�x�f_c����%ptp�@\􀱃s���q~��B��,�+����	��i8fp���Z:�O�a�MD���mxO�\�o�ߎ1����!����c��£\#.��C���|}��dO�'a �U �DD鏵�mR�H*��6�$^��y����pn%�
PY0��s�p��?mN�+~��l��w"䢒]��E��V���[�`R'+E�ĊPuڿ�ޟs9����J^/-�!�uJ��)޷Q��b�����MA�j�(
�v�bܨN�@�1�A���8��,"�F�̹{�Z)�jD���mS�C����%��j ���R�:|c���=��g��`?u~yd�_��i��a�W���O6���)��
���"�g�L ������p^0�Z�˺kң���I�jس�ՈM���C�{���ү�}�����E^bF˖��`���$�R'|���kxh���l:g5��j��ұҵo�t�Ey�k%m�7��G}�X�L�}�ߝ�7����j�N7`��?2���O��vצ����/��B����@q��xta9ӯF�BD�l`�$�*8���(ք�3����K21
��L�A�JtYr��\g��T*S�3|eYOO
4z]x���sXV/0�L��3CZQ���KV�H?Nx��V�˃�zd��{�Ƚ!�}D��a�R�^�W��·�����_�|mH�4-{��PKEePQ"���A.pip/_internal/resolution/resolvelib/factory.py�[ms�6��_�S�g�U��}�׺I�i/ɴis���d��H��>���]����v�;�4���b�/�.����N�������Ѻk�l'vyq͛U�廲�*�[�+QK&�l�FTe-~�ESny8T4�wMY�c�wJ���1x�Ru��O/[���Ղ��h�*��/O�������_�ޫM��;	$��o7�׋�yJ�m���o���C�)����	d�|����7*5�T�W�v��P�B��N�\N�i�Rn��~MSo��b5�@�@UH�x�
��"��KT��-�e�W�*���Щ�Z�w�!v���������o��|����o�G^�N�e͛k;�����+�w�`�E)��=�TW
k��r%V������x�ڿ�k;�tz�OWB�5������w���2� �k���5:x1���ۢ�Y�,���]-*��KI0��ÎWb-x}��u�Z'4�d�
����Y�ʛ��c�
~�+�Fo�
h�I�xE@Q�� ,o*�	��w!�7���4�ain
i4�V%N�NI0�}��5�ء�W��&�^]`���*o���pH}�kqa�|�oh�x!�%�b�*����Q�~�a�^L
~͊y�Ɵ���Z�}F/���!\�8�)�v��H��:�+;�W�|���29g����_w�@�=�X\����XFp�4�S��n��Ngs��l��x9C�,��9}1��R���a��,m�¿�wYAy�( �����=++�}�^��+5�q��kV�
�*
��k[��!"��cN�my�m���;`1;��xA�(r�=��
�dG	�b0�mk��B�1�M��˦�ϖ��L�Ŏz�z�/��u�|�6������/X���~�u�� �,���L���-.s��'�� ���4^�&�ϻ�}��N@��i�$	�y5hi>�4�C�@��Ï����y�{���SPC�}�`X�C<��ŀw?�� �z=:���y{S`�E���75у8�
�s/�M�F�0�PT{"��FT��v҂#�j�f~B��h(��>0�*u���E��{D�ӝ���?pwZ�1!ѩ��ށ�d�!��Vt\�]���#���ކ(���5F5
-�
��Ճg@�=I��.#�Ml���&��jI(U/���L/�O�֙oI�
=S�$6�Q��p҅0Z?ޣt�)��T���B��Q6>'�����5ǘ.�I��	�7��~����+�%��V�
��8̄B�)� **�u���[��%���6yhh����6
bJH���'#d9L���aG0��8yoH{�,���3�Y^�ݐ�˄̓�u6��Z�#�Kj0������u��R�Qk�B�PJ���� �C�v7}6� ��=p8p�/�G��*ӝ�ߡ\�z�LJ�6���(p�I%g�h1Ƌ�}[M�m'��@
S-�ׄ8e�hf�k���v�7���C=Qm���i-:x�p�T�9��G+Ɩ�l���C}���zO�^몆�f1�Um����m�$�À��{X>�쬼Xc���效����CJl�R9啩�+]�A�+(L�KLXv��(e�f���_��4�{њ��%�?3����.W�����Pp�`/��7\�2}.ri\�T���75�m5�!�a�_���Sm���f��j�yn�F�e�IX(�1Ab��G2d��\��	��f�*����A�:@�裃��3�x\{�U�c�x\�a����囮��q�H/<��u��,cIƹ�{��bI4K�Y���	�����`�q�o[�)L�0���q�~=�"��N��I��q��f\�,1"��4�!�<�,�!䖌�]�X`\Bj@]0�b�t���b�h,�*���Z!9���a�SJ6�'�j/x�:�Gq�>�e�P���t!|X[ܐ<*�a�18��W����@��="W����8�7�I��I7�;-
�GHӒ���7G8�il�H1���L�@}vn�:X�at��j-f���ɰ�@ݶW�.�#�)�!�f0���*�ܼ\�2�9b���C�H9�2oV����^�MY-W�Z�+P��`A�(�UhS*��P�����Xc�*5)�p�t�އ�(P�����<��y~��L
�2���1VE)$���?;m{�c*`�N����Lr������.��pf6f�+Ն����*�^p��4��K���C����wB/v��v���V��
?�6!�H���}Vͧ��K�&���J'��ɝ�=��C$�jf2�o�ƀ���=�k%�'إ�T2CZ�@��	��gZ9��~���x(��<a�#;�D�U����۾c��]۠X�q��YX�ס�Ř<Ue���O��
�8��ڏ���?�me�z-j>vU#
��m�,�
U�!��}����꣭���g�w�K���FoK�z��] %K-���6i��cx�'�<-�C�q!�4�`j��1&u���#��]�󾹳<�)6��b.�����F��4��_��{�Ók�p�Sp�j���-���	���p�l���*�T+(�\���ɇX������K]}�w��+�-�&������=�Y�pB������B�B���#�qјBl�n��T����t����P��x��(Ew����X+��Gt���_����f�A1��?1�?��$E���߿�G�jY����Qi�gY��ٛ.f�ˇ��J$���a�U�7�^��^�x�@��/ئ��l%�Pdbt��զ4K@	��4u[����v�^�w}ԭR��n�������!o�
�ғ=�;��m�e���T̴bIB�
ma:�h`C%*�
mV=���6,�E�kM%��f,3�����Or����(���f��0���K1Nr���D[�eZ*����l���#
]/Um�7�o�".���`�>?��#���8���RW!
�+���/��/���w���*��)��,���M`��zI�_�oд̩ :fX�f���w�M1<��ۋ�fx#%�Í��(Ȣ����`��$1�A�(�Mu,�F�f��$�:��H٘W�����S�ctU|�M�b�j��=s�M���ǽq���[����R�C��נ����T��Dc��ס6M�y3�ռ����B��g�7�C�yhf���7Z��8 �LnJ���<g_�x�7
C��va�1��í���X�;w�*R���lNB'�'��N�[ji|��Rc�[/�D$Ntj�ɽ̩Ux10�=O�Ό�!-�+L���̣Σ��B���b<��d�t|)s\���<�K�8T�N�c
7�[ŤM��X�3s2�n�����dzePUh�'{�n�n��^F�u����Dx?0�-ip#�����i�k��1ݗ�WT�����ߔ�3��A�����N��Ԝ�u�[���YJ�?�xN��1�
zh��L@�AR"�٠�4u!�7�Ҵl��~<B��S�7N����4}n"�
����pf]��K(�8�GW\�$�0dD�G6X�~JT�=,��g<�2�3SQ���Q7B�8��%L��6@w���#�BQ�'Ppʇ�0$]���t�^�sp��S��̖�2�\����F���^h���� �H�Mfm9g�%�|��a����}lC^�0�Mr�iaŸ�BRG�����`�1$��6?�w�c�;�|���g�U'��6ѱ��;�Z]V�rx\�>��������?��w����Z�@�+���Gt��.T�d3�[�����w��7:
<K{pʻ��%�	��=��)�{��(�o'8^6���_Z�d`;5�o���?�R�c�WsH�n�n�A�M�bț{a�N~�fT���o�=��o(�L�!���]É��;��B���A
��L���j<spKb�%��/�7�_��`�}����� F
�d���;�V�o�MZe�� �]L�E���`�E�Yy �
$pd�8��1�>��f��r�}�I�@X�um���U�9�� >�+�w����fk����l�,�|�(A�����
�V�[�ƃ�%�3$���A3��Ծ���
(sns�O=�	\3��ßv����ػ��&T��f]���o�q��I��z��3LQ�Q��]CM��O����d��=Ms�??C�${����X
_�J��[��a|"�������{c����IML�Q���]��a�o�
�Qw�m�����a�|��y�J���]�\R�9p;�r�&����*��3���u
�'v�Z�]�ջ�/���9�{4�]:�&�n��rf���	�2�
��^
���v����������E��7Op�)��]�bş�=�@\>b�q����PKEePQ�gr��
7pip/_internal/resolution/resolvelib/found_candidates.py�W�n�6��+��2����n�m���ٶY�L�#�E�$���;$ER�o��15|�y��Q�]��%܂�J	��aA���Uz�h��H��~ɔ��:�����˕45�4�|G쾇K·Ri�Bp�I*��ra�Fu=�G�nh���7 .�۸��?�W�~����󯛛�_ޞX�\�x�C�+*�(ɵ
��ޕBEIn�.��)=m���'��#`���;�M�V\·J���̂AKjl�op�՛}=bM4�PA$����'��%y�#9��7j����Ȋ��2Ca��ӤC|�4I�.�2q�:-gd:,G�O���r���*�Xq�Lq{��"i\Ԭ���D`E��$��eNZ�<��Y�...�#��z��$KQf��B�?����c�� �_v 	&�E%�D�kh1Gb�����

��ߦzHPTY9&ȊKτj�
��=�_GQ��F����-F��6ӼR�L<�����n�l`"�y
q�A�#�f��8���(=�:D�5�V��l�#@�Ӊ�N+\.�6+��
m+�S}���x�b��(�ѦH�w^���#��;
���-nPXU��
J����x��kQ��3�5��Qd\�mx$�c�v@>�������W#�E���U��\����4e�~��*Z|E��[�P\����Ď]\}�����S��S��l�*fR̮���%5�)V�����8�z��8;����8Ii�|�ў�m��qqZ��1M��ҷl�b��Z�i��9�\�S�i��;�r�ay/�)�d�]��M�z����z��6
�B�q�M���ت=��~5�H��PЭ�c<�x0�c�3ef:�Yè2��㡖���yr[�YDD�����r���Ƽ�8i�Y�ُ��x���s�>�o��һ<H��s�8��,*���y�b���أ�ń=<
%�!�����I���A]��%_�9�CunڙS����v����A�6�Q
ݎ"q��/ E��x�04I�n��%vđ������	�DnI
���f@9Zߍ���?h��:��o,aʏ��rʔ����S���z��Z_Ȭ����w�i�ȯ 핎�A<��Y28
LJNO5p��mf}��"9m^7��
��XJ��}6�V�/'|9�aɩFݾ�-��sz{�n�y��܇$B�u-�|���IiL�%vwww�4~�_PKEePQ��Q��/pip/_internal/resolution/resolvelib/provider.py�W]o�6}ׯ ܇ڀ#�y@6ٺò�K� �i���*�I��߹�I�i�҈����s����T�'j+mrCV7'j�6�>�����i����:#K�8\dY=��֑ie��jl�.�jw��_����z�G�����LJ��|+-�R��e| e���(��	��b�����k/���U���mC���)
������ڒ������[����,���	��ЁZ����T%E�5��e���f�;�Y�[�$5���{Չ-�3Q1Vi����%>L9�g&�#�FZK6��A�)��
)*ȕ�k���/t=�3�I�#�VݰI�;-*ܞ��w��t���0�IB�ee+��|g��l�Qsrh>��BX��S��W����6�Vi�k�U���9Qr[�TН5�R�DtOC?*�7?UU��?���}�Z�����=����b{t��'��d��)�?����U��I6ln,��⼷��Ʃ��Ht�f�� ]� 6����E�l��*��
;����q6;rEE(Ӡ�wDh�^<t���ֻ��g�1 ��	�%���kX�5��hlg�+����f������+9w�r�π�c��Fa�E�M��5�n�T�eɜTI������KY�܆`����!���*ϲ̗_<�n���SW=ɡ{DRU�(�Yj�@?Ӭ�ẇ��D�D91�����q���e�Q�VJ��n�n&�c�3���1�bOpĐ��{�,*	�[ُ�8��e��+q����$	y16�혆�}:d���ܕp!�t�7�J�F��O���h�B}Y�r�ɉ˵��|}˼��ť�MA�<P0�s�����|��0yD���s0�p<�I��]{MA���C�p^+�5�V���&��K�
�ధP�g����j���F��M{���v�~Z�!��*d:f���k�O�G��%�6WSY�Hb�9�T�'��X���U� 
l�Sk���#�d�Ujc���=Nx����[s��\}Ƙp���3��%jO|��_��3�@I��=
�q�Y�ۊ4�B�0Ma�<Q�2���ȁ�,�5j�,�:%�6�m���^��Fߔ�U���k�!l6˽.OR5\�<
s�o��=�U�}�	���a777�����CR)L��<M�?N��ˍn�����[���(e?(S���feM��[�y+$wdi�D-�d�i$h�o�q7���TQ�6�oY.�5�^]�����0��j����_�p�p�����n_��흍wwN��]��U����#﫦��vɕ���FS����j��m]���,0�0�禃�te�{z��.�^\��I��RN��w�[O�y0�i͓/f6�M7��+�xLb}5%���%�PKEePQ��V���3pip/_internal/resolution/resolvelib/requirements.py�Wmo�6��_qU�X�"�_�h�%�m�����N6g�TH:���(�%;A�9�f 1C�{��s�R�
j^��5�B�f��-�\�k˅^�J[șT��L��IV�dRzQ.-j�D+��MM�[�?���N>�?�-��������N4�3��[��j�5V(m����^�8�}ʇ�75�䨽_�;_�NF���W�6�eBleO�?#��'L�`�~��R�u=�Lr�������9��4Xǭo����f�Ԡ(�-`w�}^E�a��p�ΔD�I�^f=�$P��֝�}�
��ڟh�k-!�k�j�~z�_�8Jۗ�z!����˲���h�v�,��BΆ���֏��V5j��^9����%�
$bV	O�{v��!@_���8C�6���tYM_j��C=B��{]�����&�7��Gu'm�yu�d�Yn���l�yz�Εc�A��F�}-��~r1х�}v�nA�fJ�"\���B�W�
�'w��T�֞��aQf�
�}�N��jf�8�J�v��k��r)U�E��ִ7±^|x:�}G�l��O�5-��Ȅ���qh��6B&�7��eG'J^�4�UU�#�5�T:��Q�E��5�4M�Tb�1
`����
MC�^��z�-TJ#D�u�$9�
6%p��R�m���Y���A�drASB�L�n
�O�B�Z���$*�X,�R�d�@��������L�YW0&�H�B��O����4J���K҈!PN�رͫ�Qµ�݇Ŏ��2�ū��N�Y�+�A\�������h���3�z�Z}�>�w�9l�����k�贛���&x����Ѫ{\ׄC>���`���
���34"�M���5�+Ql(o�Ƹ�T7Pk�(�MLZ��2G8ofO��e��L��+��Ecc[G=
��yҼ��Z��Iw(��P��(����tMQ�Ba ��Z��J��B{0�a����t��JZF#q:bÕL�h̾�5qۛ�j�7D��Eѻ�;����V�2�HG-ц%��,��>��[	1�͗��6�� ��{���n�ڨ��v���}ի>\W��}O�[���X�=��u	��t�W�A�T�C-}���}������x2���?�t�8�gcv�\;��E��
�mO6���PKEePQm.��q'/pip/_internal/resolution/resolvelib/resolver.py�Zm��6��_�n�[� A?��^_��rA�EQ�-�Eۄeҡ���A���I���M�Hk���p^�y���Q�6�Z[��v!݃Fo�Rm���v�Ǣz�ֆ�
�|��G��s�+:+�6�]s��\�F�%*�bJiD��G�ȇ@�o�;�_���;\�Z��嶕�Wqy��[���+��Tp��M!���'�r�V��M����h3Gf�G�hs�X���#ܺ���D�=�s|Za�?v҈�P����DA-��+՝���d�ʊ�я������[�h�	��8�vj��J����婁FT��@��?�Y���ͯջ�߼y��go��R7��ↃϚsX��\,�f������[�m�~�s�_�?or���mw�K����6r���_���tk�S�l�q7>��ۚ�G���hn�ɥ�R���ǣ�6�s��{�=��@�!�o�/đ1�o��E&b��U��2�Y��2�u�@�˖Ê���ѳ�"�%l[7�m{|��Y:g��}u�ng�V��~��<s��+���JnVJ�Z���UZk7�.^}v��ņUp+i�*�'�iE��_^ˀu���xuQӤ,�^�yjU���S*r�ho���{�ߋ`�
��=��@ݵ���j���|���o�[���jq��j
���V/�����8���x�;�.��h��͞�m�qkx-���}�h0ݹ�����]��jVۄ'w��9+��~Py�:Wd��'޴�z�NI��Apf�[sr�e�;�rP�&b=�ӑʼn1�%k���@d�{"VٜY�O�Ѡ��9VX��-���0\mC����j�, 8�-�
3��b����Opc����v�G�\a�����mws����Ӕ����2�j&-2Qڂ��>�[@�`�I�-�O@04v�٢�A�E�}�*C�J-ࢻ�A�,�({�H���[N�9��CcE�)��2��T�4��q�%�Ǒ]NB}n�(��q��l�����(��Öej�$��<M�&�SN�)%�bM�\f����C��FFY��-*	p�U��!T[��m/�w�E����sB�%[}7.Q{C�K9���;Xˣ�n@Br,�%��fˁA��Iw�
3�bP��O1P��>���&��Z��`��_c�����o9�h:�L϶H���d�~*ݚK��&�I�f:��X֮wՁ�=�@��?��Rub���i���=
�26R�!"�]<7l�C�{����l�_ˢ�\��*���8�<O�%� j	���#�x^�ԓ^��3J�j͐���  �ܽr7�}�ĉVp��x=�e��'�g-gB�Dܹ�Q�����([�}e�����.Y�7N%��ZF�g�D��%�����8=ɋ�����\�0~����Y���+�h\�
�=�H�֜S�����?j�����g ���ۗ�I�Fy&H:֩w�vϡ�x��Su[~I�T��U�fv؃���	��q�@�b�p��]��Z�T�Re�'g"%�b�Q����gy!�&�⿖58�P(:uClq&Q@���2���\G_2F�,�$D/QB�o���v�wAr����+��b�rYGs��ZDx��|���٦�[���
j
:��5�tA
u1��Ov��Qװo�u�V+��	�5짚t�פN*�"�X��?��_�g��Hk�ـ`ʢ]}e��a�R��i��ê�+�_�\%N4\3�
C��@��6�}G��9v���C�gwt7S=H�xc5��M���#�E��S�^�
I�“Ƅ����޳��r�����E��]S�uW��GI�&2����g~k�ީ��h-|&�&�c���8��f����h��:x�V�G�F�}�_��P�|lpڋ��_P�3W{Q�U���K-hX��8[�k����ׯ���lJ���Px�zZϾ@��Z:���}[L��-\c���Q�����z�an���G9��̼��r�q��}Bd��|�ȂG}�_>_��-�����z��R=�_�ɩ��ɲp����d�`�i
/f9q���(p���_v�҆�]��7���M��G�����Rw4S/S'��T��I��LDՃ�
4CS>�N��R��n�\'�� �y_j�{⫫��!��	d�$m�M�:Cइ�m\���%ఏ5t�x���J;�<Wr��=cIȴ4�ۉ�C<�i7�(��ъ8¦=��X����%�a>��f}���p�.FXwƥ�ñ!i���5V�E�>j��Ϝ�0:4A=�hn���59;�$��e���:��y��(ކ�1�7�E
7��G�L��4��Jf�d)+P��YБn�c	�
G꽈b�W9{o,b�2��?�rvu���X�X��4����X�%-=췜���hB�!���+�B�uu���d�g6�IJ�v/�e��S����*π�Z���T���8��%JL��-E�U�uU�p�\�~�XD��=�+B�~����?���1!����C״U�ڡ\|�����zb���>�+lȮ��p���s)~ƌ�}�fpt���盎��'	���h�voH���:0W���H���;R������!�'���^Gx���}�?��:���3|'�GlOp8�d!
�K>X�b�������y8�37���r����{P
Q
���� >����𗿙t.ZC*o(J��qG�?*Z��-K{
�zRtp�^+W��9�F�V�{�1��'n��kKP���?�#�+n'�XOu���3��N�
7��x��>-�	mY� ���&���z���<y.��K��P�s�5!��B�r���B:�u��睴AW�じ׀����C�.F���D��Р�˓���5�o�d���)"]$�+�f��\
�T����q
�˔?���wG�K
��b���*|�l�֝��Λ�:"��ˁ�_����Sv�U����K������O��(?8�@@�arf�_U,�"���{��=�a������� f�^ƫ(W�����T���o�>�X\��y��0��T�y�W8�8cEA>�z�_�@�
�Oy��9�S0�۷)I�8�"=6�
���I{�L��u�#r�.��
�{��z��?a�oڡ��V��� ���b�c�
+�S���P�A��	���o��Bi|k����hػ����po!r�]�PKEePQpip/_internal/utils/__init__.pyPKEePQ�b��qEpip/_internal/utils/appdirs.py�TMo�0��W�!	���zP,��¶b�C�bӶVYD�Y.��l���?��G:M�䡕��6NX�"<����
���t���B����>8
�B$��tVx�fXm\*�s�=Xi�kA�%�Aj�G�h����p�?�
37NTA(�������=�'��h�]�b��r�2�YE��ܑ�L([���$�ړڙ��\
���A�ɨ�ޓd�nhኲb��>fl� (��cp��i��ॢ�o�Z�د�������>������)��o�g=e�"�e&�\,��e����-:�
�W1o`J����-�?
�I�.��c�"�ָ�{�g'I��es�wFt�s���%
sX�N����8Wr��L�!�x��t��=m�c���p�S�ӣM�6��3I1G|�I�a�尨k:��g��|2��9��q�科�O5�g�^�n��~�*Ie �K���@�5G�eJ��8��m뽥�<o�oÚ�v��Z��X撈�7�����7>q���9�����ü.(/c�è�ͻ�԰Lٽ���|�����+^�����<Et������
ݠR{���A|FVI?-"�3x�Id����Y�U�PKEePQ��(�%pip/_internal/utils/compat.py�Zms۸��_�*s#r��_r����\_�,O��M}"A�g�`вz����]|����L,�e���}���x|i�<gf�
ˊ<J��rEe���,e���f��X]r�K�e�6��7���x<=cWK�rY�r]T���
��lʌ�Sb%�E�`E-W�ղ�~X����4J� f��7Ǡ��(j��̦�^&r}r�K-F�\�K;'IX���2�ϵ,#�=!�j?���D�����R#e�6�2��-`��*�az	���v�E'��ʤ�u��պ�x1#L���ǂ�BU��Q���=����c����=y��|z���?�|<b�ԡ�7�A>/E�f5�/#v�����OW����8�
4�W�P��P�3�A�v�
�K��$��7���EY�4씝���t��iɵfg�y�S�lh��6�^&I�E�Gl�t�qr.+�i�A����rλ
�ޟ[3onNo#vz;��x�;�f�C1"E�N)�F#�6v
箢�Y���#�ڰ)��h;���:���;b:��E%���O��уq�Q4ŏ��:�Oz�Ӌ�_#�f-�ݖ�s׺-b4J�?C��q�ƍ:�75�=���H�L?Ƒ��&��Y&M��(m���'�݂�\O��ή/�����Y�=�b!��q��f�P��K��Q[�$H��	�r���z��ˤ{�{�h٨T�kVu����~m,Z��
�2)4��a�*��$��Vվ��cwpa���y�ش+ՈC�;`��wvD��N|Ʀ��G�ˈ�yz��J@�U�
��3:�uS��(/��Ӹun�@-l�2X��uż�%�6'�e�Ѕi8"E�Ɩ��+*�A���r�Kz���^2��R!��2hUB�ڶ/!��EU �ꡗ��d�1��b9�Y�榸%����BP�6+~T	�^�x���9K�\��`��C�@IÌdU��H���Re�<$�V��-�T׊5�q�3T�`������/���c�4�f��ڶP���X��U"0��V��	:T��i�1V�'F��O.�K���
$g�;��:1�B��2Q1���E�D��%N��1;����Y�`M��m������j���>iT	��|������������٨�֠��
0�h
l\�	2n8�*��~�n=@�ᆢ��ێz܀([���"?�F�{�9oW`��7�UK��|ls��fF1����@�ŋ�Y�>*�L��"�lLݘ�츆4Z�U��uŤӘ�K����UB"TT5�ye!jU�8,`+��|]9���"b��:����yS�	;��g�ةu`f)*h�it%��R	� V���f��@	m��A3�d^�Jx�ljp}y^�5稦�T�"���

pq��k	����V95�!�qh"�Wq��jV+�
K��A;��L���8L��ek��M�p�n#9�cek�܈촐�Ӥg�Jñ�b>N��M>�1�ת0P��U�U���u1������}܂��xQ�T��hy~�Xo�Ϭg��Z5�Z�m7�� z}5<-��ZCֵ��F�6t����w���`�=� cJ���6Gr�TY9������t�n�e�.�����W�{�,^�uN�
H�Ze|ozO��o\)��k�튑ıh�Ӣw~�-9nL��j��}.�ȸ�.��`���w9/�P4�8^y��Y}~�B��%$��ֈm[gB�?X�zKC�p�r�ءGW;�|�;I.�riM��9[�o�$�B,C�N���5ƫٵ�_c]�r����M��R�1�Z�@��@"7ݦ�m���x��&s�i���a�-E� ���.��^T=ډ��0h����"�Z)i��A���fC�
���� ��X^T�8H]}W��jD
�#%U%��� �
�>CG�
��&�Bl����4�l�%��� �h�P�ȋ�P�蕅�x�<Q-Yt���^�o(�R��q�X��#5�C@�`-q�K��}�pd�ٹ(-q?�8��l]�i�\VHKK�@�y
�-&�)��Z�08̤w���Q����(���r������Z�*�ݐ�@ε����Ck�8�����3�2���̭5;��w����6��C,��6���_���&(�Vs�"ٓ�8��ր��6��mr�ފ��b	���_�!��9p��سB7����<xr�-��H��F�����4��`Q�8N���َ�xo�Y!�VeQ��n���x)���T���M�!���,�����3�"m4�g��˃��V��kF0�1O�
���� ℻#N��T��m������KM`�dK	�����[�xLws��.m�c׀�d��C�:�A��y�C��@F9&!�&��|v:;;�]Oz,�<�:rY�VD�m��;;?��k���]@�mn����3A��pL��.�t���g�;0q��w�gz��������"A�o�J(n���W��^���d^�S\�h\\h�\?溅e	�����V7W��?yc?
&�AΠ%�����e�E��kJB8vaq��3p?�sy/����E��˯����.ʒ\�1@k\ԧ���ؕ�Y5�	�h���\<԰��?���w��h����7"�uF5�+-4lZ�eP��H��BRN��d�7�w��X��~tA~��W�������ɶ�>�����4nO0�m��^Ƞw��k�u�Ǜ��۾}���PX���ŐV)"�U��b���1?��Xb��<��
&n��&1��+HТH	�R�r*�2�������kb<�вA�9zy�	J9,�t�L���fb՞�~�Ц��w�Á�crϕ&g��߾����ڐ#}����ܭ
g)��+1dʤ=(��q/�b�L�g��wo��el#���z\4Ǐ\- ��J�_�kM��4��
,��-yU��_G�6���y���0���3���IZ���t�
��/���?��#ʺ�G�+b>���7�%H%/�5:�V�~�b�����}�hu�m�y��3����]i�]ݙ�a/#��"���|��Ի�ƣ�;�(ܹ�u�XA�6ߛj_p��;/Y�ɞ�:���j�+Jo�^��
�w3>�� �͂��mB<�) ���o�"�B�cKQ,�&�t&�o���yU]�Ǐ*�C87ď����v���5hW!SS&?\��ΰ��A�ݻ��2�S����Ouے�ӛ�[>�7Vz?�xE�,����Z�YL��I�W&����XK!���⻗�&ᎌa���yGOw�B�^�
���"փ����kO;�%���n�M��MG�8��2U��J��'��xW�GÁ<�'�H���YH���7�S��g����/o>�^�!��
Q�c�D���~��r��֨A��هϱ��.0
��9�
#���6�j}
����O�:�~�ѻ)Ɵ���Ύ-cp���7k:c�7���+�˔ě�?P�
�]���~�ao�T�?���4�t�y�7z	���5��li�D���34���)��PKEePQ'J��l?)pip/_internal/utils/compatibility_tags.py�Xmo�6��_qS>HF�N۴5�[1t��4��g��D�l$Q�8F���#)��r^��l�:�{���$�q�Ӕ�DR i[�_���
\�r	/N_�;�dD�%���'���q��`���`U�"�A,�x.�,�I�0(�sZN�X��4�x�g$�"k��}���o���F�",�4PV�`���6F�*6FX*i�����$t�����HHd1�+�'�a�ī'�$��b��]��-�?>_~��˻߂�]\�_�ǨW=�S�����;r2�`H<�OE#_��Ü]j:�6�7��M����,�^�z��a���8�b������C^�@� ��^sth�8RA�)x�)��!�!���C��$���b�� ��"Y�g_�bN�<��r�z	�<t3j!�OOC5h��S�v���G1<�?�2�2� --�|=j�����q�>ZE8��#���ꇄ� ������"ް����a���\y��p�Z����h9��LT�4����!׸c�-�	�a�^��ń+�-/�
�K�q������ghK֖�8[{W�72�8�ߎ=�~Z����,B˝ƀi�1@	�v�EǍ�	��#bvE-���'��ùD
w����<R:�i¯�hЅ"���	�]�Q�"Ǥ£E��������w��x#�3�Vɘ�4�\�*p��Ű5Oѧ��ۚl$�%�z�Q$��uvd�aTف�E�+K�z?��'u�hn#s�ʄ������7m�������7T�f��X)U��?,\�d��y.RhwXc>�f�VOǓn�����i4��"}�)nH����b'$MD×��R�	�.��W��K�#�a�*|} �|�Fm'I�p�
/�Hi7�@��
�u��9Ͱ7Rfbzr��n}s�<_�D�$��P_�cvrt`�`�[Ў�2�*6e�Pŷ.;{}��y}��p�-�)�$STy���]xV)��Ԟ���1y����p���J�H����jr�T�����x5y�$&]=|sfzkϚJ[���|o���!�¶e�N��h_G�/9�#�N�uE��[�J�s<��+��Ƹ<tl�v��v�X2�;;�¤FR��z��`>^�M���ӱD9����Ȥѣ{���T�Devv�SZ���_74�Fk�]����M1Ҷs��Ay�Aw���)�Jf����Q�}=�^k�8�w�w�m?ڋWA[�_��T�O#��ԤeTSҢ@Z�=l�@<lE�L����ꝎOz�>W~,e�} �f,�U��wT�E	�A�U�ѐ��gF�_�;�o���XHb'L�7BR%���p��n�y��Q-���U9�����.�eq�*7{Mݕ�h�9����`9���we��Y���$�pMbV�	6�Q��|&-��!�!v�����\���Q�wch�\�n�@��a��vat�[U��ZIXH�k
��Ѫ�h{@׭ʹ�)��J���=辭��jd�>�[RF_�r��^ԥ�9�Z������i��o�%F�; �@�(u��j�0s��_M�W���㓮jyZ}j�]S��~Rg�=s��L}�ߪb�5^C5
�?��� ���/�À;���x�@��º�AZj�<�+܃PKEePQ�0��'pip/_internal/utils/datetime.pye�A�0E�s����9��.�FSd��В2h������d�����5D�,{�n��x� 7˷�2Z#�Ĉ�&�Q���Y��Z�
c��L�������^Q�]ro͢ݤ��G-�ba+�����'B�d���y��i%�4!��v8S�u��Z����gz���GNO�����PKEePQ�]$�6�"pip/_internal/utils/deprecation.py�V]o�6}ׯ�Pfc��1�i�k�"��E �ms�E���E���%���@1#�-R����s?�4M�ig�FK�[�I�j-w��1ZU|���
oH�t�²#�2��R�V�+S�,Ia0yF�[Ik��9�����"��itI+IV��^����$�Fa_U����o��`fw��WT*'��ES�c-ˋR����N&�ښ�y<���Xl����<>'I���fH�cw��N��,�˪46�E�Y��^Z��u�ka{�8�-�y�@GEc-��-����VBg�W�e�s�Zy��������_��w��}}b�*!|�թ��긠w5�C�$I^ܾ���~�{w����U���wӒ���!lI��s�^�/��~����y�[�EȍU�H��=�d��$�3F&�Q¢��	���&����W	�JcK��tNl䂀En����JC�;�A��2qe��R���s�K�Qe|�7���O�͟���&���Qǧ��<<I
tʹfb2,���|�	�%5N� W�B!s�Įˠ}i�UŖJkڊ�=x�̚sodf��ݍr���6�]be�߄�Y:U��N���d�E�c��"��o��(�OU΃����Gt���Nг9A���v�6�G�X�|x�+5�%(<����>=���FAZ>��KmVB��#�tV�SY�����vw��&�Lq>���rf�<L�@鯵(B�Y�` �E�$u{���C=�������46�G���!Qt�
�/�yF�n�"V��E�"ҁ�G��7 <�s;Tl�{2Ͷ��=b	Ol"�\oi%e5�$k�����5�j:�]T�f^���#���qK��)w����[i��'nնrd{��U5���Jk�u,G��o���݀U��A-"T�/_ۛ�;���F�w�HU�[ḉ�������	A�^rG|�u�)�ͥ�7�l��P�������Q4.E��ښ�*qP�r7�Z��A]�'����<���c7M������[��8ߤ��oc檘7(��6�N��Mڪ���G�?�U��;�J@p��_�<_��\�C�x
�,,�W�����.6dU �K��s�'���WJ�~K�C
��ŀ;}�{T���
�����I�kL��"������\�҂�=%�h��7A#MX��2�A���������(�mV���X�K��2�r��`hB-������?�\^��@�Y��l/�<0��~���!6�-v��M07�dR6�I�O@$�_,�ahϺ�	|d2&
ȳ��9=_�;���b��Ӄg?L�(��q>\�i����g-�R/�'�PKEePQd0a6�)pip/_internal/utils/direct_url_helpers.py�Xmo�6��_A8�&��0�@C�$ݲ�i�&��`i���ȤFRv_��;J�(�IQl�J����NJM��%�Z��\%�R�
iD�S!-ג�FU�6y%4/-muMD��&~g��7��<�99;�9�W'/����.�b�/�Rug�̭�'�w��B�s��_ͻ�t/�!/[+�I���0��/߾~KO�<?��^�^]]\�qHs[��Ib��c����h��z��ꌗ���1�J�XrᾺ�N�~��{�h��@�m�r�/?&b%��I"�\�|G��A�X�Wy�u.�y*��R:o�WTs�Z]�ș0V�E�;%	V	� �r�W�^���R�6��,I��/�P-����ٳ_i����k.K�Rs���ǯ�%�����w����f�S%��dC���"�����K�:�-�8�a�|�UO3���-͉]@����ʩ�V�2yJf�9����~3���{��6��Ʋq���Z�E�>��iAf_�=����o�|���4HNbA�X��x�A;*�f#,U0��'^�ۨ��x�{��=?�̬�G�s�4P�S��w��A�����=�dA�ȥ֬U[WDr�%���.���F"�9ᕰlQs@̗|b`�9�¡rL��A�4Z}�U�ґ(�U�����48���~�H�8�]to���<�b�bU�����L<\�Ghg��,�X�A!�[ͶZ�:�Ԃ$F��R����y��R��	.Sa��n�yMK�//^0(�)�\:�U�A���B���N���4t�!��+�2�xC��+���Ý�y��M�	�\#�X^�n�ԕ�
��)!Rw�#P Ox�Z���՝�P��z�	t��;}���q�^a!/�	�&��H �<n��I7��X�6p1�=�����Q�2�;�j��Lω�dÙ4c0�c��r�+6����.�43'
l�0��:�P�q�'��ޭ�\@����w��*%���D��C2��7*��|$���~��B�2��(J��+��"l!� ���
�{7b`4��h��u��>
�Z�`ɤ��Q���}��Z�0z�v�ʹO<B頛E���(���堙�֏����\��X�{{���|O*�[��}��$�b���_G��QS��a>�7/x�`V�SqKG���{������@���Pxr���h�S/�
1�qC�a�+��-��?Rh?W4��}������R��DNqm�.�,
gl���_-,‰GzG#0�G��<6�w�k�q�Ü GT�f��|���}N�.��N;�ޗ��@w9Ƚ�~�3c1��[K��F�8�`�J�ݴ��8�g}��л��PL�߻�7��n���"���D
�]��Xa\Ƴ��0m�B�ĸ9��9�?�qu>�����gm�O�|�S�PKEePQ���>F%pip/_internal/utils/distutils_args.py�TQk�@~����p����
���ƶP��(!��-Ƿ9w�Nn����I����,�?}ҹ$��B{nX�>E"K��Yb������</���l�l���vә�>�i�f�0�Qu�#�uڬ̗�ۻ����������&�ty�|��.�a�+�s��YE�|[[�a
�0�q���#,�f'0���I��Wv�G�xVu}�T�t@�X��PH�dL��'��V�lLC�\��I;>��Jd-u4�о�>�B��WX@aћi��5�ƹg0r\Ȏ��ʚ�r���i�=�0n�I-��_=�2�PhX�S�q/����mҏ��
�8{׍UO3���8�oC2pd�u!�I�f��}�ܐ	s���O��R��r�.�Zq^��Ҩ�_�������	���@�{��:����
K�C�������KXY�s������f:�}1y��&Gw�p�}?P����ji=Z����S	<TZ8�	�NK|�&�(X
Ys�2���xmr���B�=�OR�R�g}���)�we�K�M'�ǝVi&R�e�������PKEePQp,�Hpip/_internal/utils/encoding.py��]o�0��+���6��*Rv�,ݦ�iԏ��"d�i�:6��������������m���\�yn�h��Ι�/ӽٽ%�0z�(�T(Ǎb2���6r�R�7hٻ��K:�9��N���_�������:�q���nOU)9>�G���#L!�����'�����+���Z��j�˫^"��w�0���'���ƣ^�#�xԟ��'�ɘ�{���*�������+I�/g�����a���z[
�����'���~	���.J�ҀBּV9��
T��c�9�Cΰ�Da��9�vvv6��ԫ`��'Zh�SX8��fϝ�Ú;|��U���qn���8�7��qW^pܻ>�!r�S�❃.�
)h���h5F1Mka�Lo]�kyl���WYnj�;�6!����ʨ�%檉$j:��I�,���B�����f���|5�w*���n��R�0^U@��(9R��br��t
YpSk�tؑ���Ѓ��a+���#�Y��K��$,(�`�?�:k�-�]�6��EgQ�l.D@�\=m�	��������i��:���(�PK�mWy����"pip/_internal/utils/entrypoints.pymT�j�@|�W,�CbP�<$�Bڦ�uMH(!
�,�����c�$W߽;�$n�Bڝ����r?��h���Uk2�(]՚�^��u�!��U������q}s�����a����\Ծ���k�.����EQ4��z��9�S�[��KX�Sl�>)�q���E0����Sy򁟟�p��|*��f7h+
{hh-���n ����j_��Vp,S-S�t�˯�#F�- ��`S����l�>a)&'����2zQ9��Ara5��_B���Ue�3e��b]jz�3FX����A�bS�0`~h[��N�Gy��2�ގ�=˾�q'8�
(Cȃ�4��H��@�u��>-1�y�R��b��<q
6��ͳu�НV5&��+a� �w��i�܁�M1c�O2�Yj@�RLO�Hc�!@99�&�� s�c
x��M�y}�����a�)�f�����E^�fr��������k�V��~Y`;���/�FC��5�4*I�G�.�/�-�n�T��nrj!}�����ENu3��V��	П�!0ѭ��(��?<Fa���c�v����P��}hEm���,�')�(���:���č�����y�c���t�`^�PKEePQ6z�y�	!pip/_internal/utils/filesystem.py�Yms۸��_�:D�dFv��53�$�sz���ۙ$��� �S@�um�{w�(9i��!A`��}v�YD.Km�(=��%WK��E��m����W�^Vov�r���w���r��,�ʉGW���Ȓ+>��rbY�՜K�ٝ�n6o��`�]^ݝ�bF8��jΤeJ;���NdL*�6��x�i�N&ǧG�ӣ��1[/d��E �֋
[Ös��`n!h5.s��U����,��A��M�(l��=�寂��2+�ןN�	b/b���S��Ws��%�d%��k�ҦՊ\pfb�b�еu��?]J�~=?{�ܼ�����ǘ�ܺ�@�;>�����:rި͘�,8��j�.`K��ߤuc�^I��8-��;�|#�pQ%c������R��G2�3DMdE��f��F4bG�U�L)A��`�R҅Hy�Z	�c�XK�ΐ���E�r�#�2���-��`����9�%�D���I�d:��ä��1NQA�Z��}]Y���%��;�R$+�di��i	8-.���l:ek�^�0m(8�r�L�a���Z�쮌bwf%�_`cф},-�Yo
��4�A�eSv���@���I�/�zF�	�Y�+�# ����x�l�Iim��3�=۰te�P��@���Ћ��&]�^�m)R����
-،��L��d�ޣ)�y��� :(��:p�ſ̮2���-�ʱ�_Y^�y�[
颯�G��s0n;��g��T��]ݞ��n���oyaEoB���
��L��/7,��1L��Cr��ѳ�����{x��@����:n[}�z�:檸�BY���$��"��Iǐ%���cV�s�ッ������$	�4_.aX��-m��:���̐�1Ld�,C��<�>�nd��Ɯ+���g�9��Q�6���(^��N&q�ՠ�����1-\D����o����^��몝�6�N�XO��(���[�|��S��m�N)̳>kp���`��z�C�@�4�.�!8R���.]?�(�w�݉s�+��	1.1�C��\���?����<P:�}��F��(d�z�����U�B!A�o���۫�wP�G��غd�3^oQ4ܑg_y
�7q˒�����~����C �J�>�_*��x]9�Q!�;B�R��ȃ��AS�Mq�R�7��O'!\YH�h�bC�q�,�g�r&��8��-��ޗ��a5Y�`Gu���UD{@ڇ�=�./�b�q��D@�	�]�9 �&�3Tr�)�"�N��B��A��e���8�:nF���L��HՐC�Y3(w���U�ӆ1�c�W���f���9��=�aF�}��Y+����F�"���<�(�f�91y"/Vvus�1��F���G�p�+�g�S��L��1#���x2�@�����gz�r2"
t�k�+i�=��0ګW���լ���ﮭҀ��R3-\�u��:hRg8��{ʈ��+���%�?
ɤ7��e�`��"�����tcB��h�+��fitn�X"E������l���A#	�̊��Zo��˨�5[�
-o�֐�#Ol�����ۋ�@��!A%&�?Hh׶��ltz�@�""N=F�g>]6��ɉ1S�s�[��!�[��_X<}���غ���\P38�=�o���J<���RI��
4�N�B�Ғ�g<k)�"�2���
��]����z�kj��vM�
���!�<5��-b�E�6�-7�"&����<�)Hj�͐Z���|C����DTI�9�:��|�X
H[v���o��Pn�d�KaQ.�L8Z9K�*�z_,�.�i�[=�7N�O^��叧?�ͯB�� �4�FǓ���J?��0�
>�WLq���Q��h[ڏ�Q+���Jb��Q�E$�2��J!�\%7�|�a���g7�o�g��Z�����Nj��UI7!���
�8�Z�%�DjEc�LM�vo��m�ۭ���b�����w}��C��ػі�����w�x�ysvv~���û��RP��H9���V���E��_���󉃥9_�[)d��f�H��25ȏ�������u�ܖ�U��
�"���Q��k�Y���+By���V�"�VG����9��2|p���{�{������Dy�#hbuO��ֻ[
6��R&��'|�L��i��b��E
߫��Fg���i��Щ�j?�dTes���Te����Wx}�^���S��V�Ϭ.V��EX�|�+���`b�@r�0x"��h.��.� ����u�;L�̼гJ��5����9AW��k̒q�LR�\��~����� ��ɶ1����G��(��a�i>j����
O�񕋠���5�.�?CK��CI4�"����9�6�Է�
�!�n���V�ZԥѬ��_����o[n�>�P��������/'�d
 �~�Q�F�
)���.����Az�0m����OF���I���.)��PKEePQ�y; pip/_internal/utils/filetypes.py}��N�@������
�zl⡒U��6k�1�&��,��n���P5 a.3����7C�23�*CQ�.S#�!r]������L��Tғ�H�\T�R����~�O<�ywI��y�oD>�^�h]��I���g�>a���M���
��&����_:Ԥ���3�"sh��ŷm���^�FϑR�
�xt������%�E��gM[��Զ8X�[�e��MxD�p�8c�8S$���-8�' ]������/��PKEePQ���r�pip/_internal/utils/glibc.py�Wmo�6��_qPXl�%+�fȀ5ͺ`�[$m��J�l"���T2}�o��E�ܨ],�:>�;>������R���䲪Xm@�e+
�(V�{V�EY1h$��c7��U�LN����Q<7s�.k*.~�B�ɤT��4��i
�j�2@3-EkX��'��.u��;v7�!)����p����s����ۏ��oW���7����k,G��'�?��Mp{��F�ߓ���<��{�4~Lm��.N<ȉE`�'0������G7C���dR�V���Zh�uƙ���Wn��i.��h�����8�F �(��[�+�:�2�,U�59B���sB\'�%�>��0��q%�x�H/Z�����l\��������z���j���m:*��ٍ�x5l�ٓZ�\�Ն�Ube
�
`������J�`}b��4�|��q�o3�Z4���z�����٢��U�\�f��r�\�/���,O��%[��g9]eg�ņg��(�t'��ٳ�f��ԝ��@�/�BOב�g�K!�fT��q��8��M_oߧ�뗗釫���7�(	��H�T�<Y�du68,��{���D7������Yc ���)
�J)�f��6<|�����Wp$9���S.h&�h�,��[Ȅ��l���75t���'2��7��G��Wʓ�f��}p�gEp8`_��b��@_IE9��Pٰ:޾�l��.�j'�!U�n��C;=�躄�VS��-�yf7yyyGPn��B8���t@C!6J������C�j��q8��wX
�����z/��	����=��+[eqs['��u��L{F�ϩ�]74g��'izz��Mw̤�{ĝO�Ș��ꎵ0d�mWeR`�L�S��\�4^1L ��Q��r�%���|�!.1���B�R��/�c{�b�f�1�y��J�e�z��+p���>��H���8V�p
�Yr�K[�s�g��A9>t�F
�˂��9�Q2�	���cG ��h�kUȩ>S�Sd,�$t�֬����!�&pE�/!k���A
�ׇ:o�u>9�������s��B����C!�O܋�d��;:�)bL�c�S���}aaq�e��jTk�x=�(DQ�|ޫ�.ڕ��8�-��n��j�����۲k�´5�����b*Fk[��L�=mQ9�P��/2�-���X��D��mgKxNVd��;�L�I�
�l�[���*n�Ԋ��`)�����*��lf��:dY�����"���8��k/n��;4�(z����*��%�h��|�9��X �׳��-=	�G�0��b��1]o텇��,!�]��f���+_�(���s��ck�C�J=�eqa���4��R�X8$4;BL&�PKEePQ<��p�Fpip/_internal/utils/hashes.py�Xmo�6��_A�,����0d�,�c�S�i�"dZ�m.���T���ݑ�)[FQ���}���޻ԪdY�ll�E�1Y�J[��F��������u!���ղN�GQ-�N�|j/K+4�)MB�b��y�^�W�H�S.j+UeZ.ш�s�JSr������j�&���(8޾�Z�d�h�,LZJ��"��,_7Ճ9~�nk�^y��ݧ��������t:��l��g�q�spv��Z�6aH�*+����MՍgT	���*M��#����h@x=���︖6C�BF|��7��h�ݮ����-Ă9�b��Z2?�
~�)�X�j%�H�Y�J<
M�2+���'99њ� T�FUc����<�p�` �'�e!�6�v��fr{�]���b��ج��?�I�)/�AeZ[P9�ui�PPz�%ѧ�����c�Z������h�c�m�ʠ��n�
dp�
��E�rU��S-��Wt�KG�oo��oH����]�rBʿ��{�����{�#/�1��Dj���m�|urrr�6��5�	J�Y,+��ʺ��SOU� ����^2���=TjS���Z�6C��w!�P!d%m�EF��35�]�<�Hg,��3V��Ʒ�������BG����暗��;g`����*ri� =1��b��5��<�q�g-��	ē5�ѐ4kc���ǣъ�Rr��Q���A�N=�s��^;�S)(�=��;1I<]�M���y��&K&$2h�ϱa.`��"�(�L��ݲH�"Ȳ���E.��d��n1q����r�1<�龁D8hB�O�g���&4�6�`�Q^?ʂ�e�bs��4�jVbC��U?�1��ȥ�e�G]��9IR�:�V����+�F�~e��=օG��Y��,�g�3��w\<\�\�؁�K��	��"��E�����C�K�ɶ��4eT�*������@�����.���ҒD��L�/���O�����S��&�C�iJF͕*š�-�'�l���̢֤��xLv�"�6
l�������Z�'_W�ǐ�Xp7�Za��2fT��F����º����{���]�e���ܻ�u�L�J%}�!J+�q�i(m������2���ل��:^�?�秐;���E7n��#���-�K��M�L��!>��T7��3�}��р�1��G=����sL_��=�iǀH�65�SD�mOT�+W�v�o�%xNS�{�P-���'xR��5c�I��;uI����A3j�7})� z���Kϥ,Z=�uH�v��Ɯ����w���rA�M�L��Dd�Q�a�^{��u�n�����\C��k0��8�y���I�p�Z�!�h��J������6��o��<�۫O�R��7iZ�w���s}KnP��S�`���10���6bsO�@�Q��!d��L�Ӥ�abi���߸�,�
w�_;Wwh��|�(Wr�S��<�>jC��Ł��v:�ʂq���zMk�Z.}۞͜�f3�;���g�b�͖��
�PPn۩ƥ���V��}��?1��}��
��J���r��1�M�ʋ
���n5
LfQ��	D�v��e�so�=�A��P&Q/*�w=�a�G�PKEePQ��z3�*-pip/_internal/utils/inject_securetransport.py���n�0��z
ν�@*8ۭ@�C:{��^
Ţg���QrҼ�h�ɺ�&�)J���J��3th$�-B�T�~bT،�[R.��
��O�b��@�h5��w**��)|fgq���z���_#�PN��|Ȼ�'80�2P|�!�T�j#C����-�>.�dP�מs<]bv�zՔՊM��Ek�˗�������0o�p<��}�_ˏR$I"ĩ�cBhl�:�D�D�fWx]@<xi�7P�|��rB$��W.���i'y9X[O=|��D+:���N��Frb�#�N���[����n��yz_��t�<`��<�2��3S����)�P?n������_o7ps
��:�s��`l�0�A�{tړ�Z��$�"�ݹ�������UG+(�9��~##�'3.�zqN3~�=��
PKEePQ`+sg%3pip/_internal/utils/logging.py�Z{o�6�?!#���r�ܣ]�Ź��.�؁�^�0���z�H�*J���|���K�Vk��b=��p�7Oj�\�Y�<w��!Q�l�\�6�Ȝ���e��CQ0R	�yI��6m͒�)��zJ2.)��o�f]�l?cKy��M&�Z$M��4%��D�:�"o����<_��a�M��	��R؛\��ǃ�dE�,g��υ��k�Y0C�oyް:&7�9�7�6�V�J�[Vf�N$���?�x�a���y�6<�	ȯI��ggo�?^n���f�pQ�9oN>\��>������/ߥp�v���$
.v.+%�6㰇�^O'~�]���Pb�~������uo`��:u�	��\Bv*vJ�M)jPj���A2X�ʀ�*�d��\Դ�5�@9m�O#�<S2t�$�tP����D�.o������2���~(A��W���Y�3Y�E�^]^�ܘ���}���:���;.�S��RsDr��
��;�"��b��.O�%�R��s���8�J	�Sf�{܃�W(h�K���%Cni�)Rp#4�qu��|
B�/i�9,JF�v�Q.�5�Y�+Kh�v1�$�.�l��oVh�G���@D&�{V3��i�y���In��������h�s4��jݬDy���^~�O5chr�y��{jo�ߜ
`��r	���E�XZ��R��1}��
��kٰB���<3H�i��?�e��Ñ���k�93N�PP�|��|Mj�0���X��a�9��N,��J���Ы۲�;�f̈́o
.J��45��'%�
��q�
V��B�
DN*Z7|��̒���pBKG��
�5����p	�VD>Ds�GL�oܫ��x1
���R�P&C�w�LR$)�dzԹ�|��h"�yUT=���\�	wq�n��w# 	NQJ�]->���D��U������:��/(�����WLc\,-�G��T4�0[�����٣X����L0��=�*���Lўb��2
����K&<;���u����~��|)�}s�L`&l:s�cB�\1��c��!S�#m�Vu2;���i�N>�>�XB!�F&��o44^~����O����^~���M�쐔�T��"��2_p�T�6�PuS��/
�3�ݠ
��<�X)��>$�z���ARU�n!tγ��ё�NTN�
	�U�es��t���cj���!��q~�o;��J�J2�m��Q�m)~�S�×���Ӱ;�&��K>�`���w�돊�1hy�9:�q��Pg��QQLt�4������]_h��VL���T�K�L�7����>�܊�>!�,��q.�rT��p2�WW%�|-���2G�a',���p.�mmE�$����<���|��hQA��Ta�Y4K�y���"Б����g����Uv0��P�/�5�FI����T�L�'a����Gv�F��k�rm�KȀ��{��Ҿ�4Q���AO7����w����z�wc��3��P�<Hl�uO�~X�7iJ�/c�G��g��^m�1٠��j�9[K�Z ��L!��<z�pPrC�j
��B�H�c�Z:��Ĝѵ��Y�{��*q8$���lX���m7��hh$�� �.��j8D��Ao�>V���Iy(�N�r�r��,
-�|r(H�R<�tF�1a�^C�7$b�9���9:Z��X�T
�(X.J>D����������]?�D��s�b[����� D����ۢ9Z�Z,�l%!�#F�r�!w[K�n�r!>��;�����)I�7��ٔ����Ÿ�J��E�wz�}�т2�������EB��:sRHbգ��Q�Yn��!��67_�
B��֪�}���84:�=j#f{fc�D�&��ꦱxf�)$�ZF��S}޽���h��MW�JUc���1��6oԤT/F��fV��B�,�Qr���`��NL�g?�?+��eWϾ�>{?}vD����6_�_�L
�r��U�b���Z���R�Q4�=D���m��C�A��ex=��s�ޛ��y�*_�@��F�.��[��~��f��M�R]=�w5��=umc����B^V��R�����L��apܵS.�uΒ��˓����pdH�.��Y��,�T��s�r�
�;��T�C�ò� Gh��)�g+z�s�d�)���t��@!�^�t�#�Ru/V�f w
meS8Rxx��k��xqO������x|�q�#�~<9==��O�4R-v;��5��M�#�Ő��ԭ��Q�$�����f�Z��������tTI��#G��N�:�C�{%��yuzC��!m��������9��@Q�s�DS��ߊ	��t7���?��FƖ����+$��2K
G��t�U3��5��1Z��7����T�ްp����3��K*�N���}��&��{J�ԡ!܊����A�¨,�qɈ�ݠh�i�4��S*i�5
�$��x�K2U�x{�(���:���W�~F�b 0`�i� ��.g"k�GB&���(1��������D1$<ui(SR��5���u7�xfW�P��_���9Z�>�2U!�zl�5��=j�!�ϰȷG���؎}�6\G��氩�
�mP�Z�>2чlDR�5�����H�k!�-Zوo���nt����|�˥���ᧁ�{�	��M�7dT9r{W󆅪˷�[��˲Wq����U�\����F1N,I��x���Q#��G��I�pD���c��
YN��FP+aba�gj�{e�=����Hx�%}(�ή���f��oC7�v��#ڌ����l�����=.a��_�F5#ނv����( �k����������*ڬ�.ia��J���I��?���[���=�?E�՟'����!e�ۊ7��y4Ms���n���c��V�>���9Z�#��|i�:������=K��͠���v���]�Ȯk��%�:��>��Gi��'*&�#q�f�C�Jy�@�ф���ɛu��x�_��"`]'��(���iM�H�]���Q3tf��5����@����!�34u�_6EpK�
Dy��e�Z���.P�3��q;�0����
0�7'��.0%Co������:�pd��yFg|3^��x}1���>>���j�
���=7rQ�Ҳ-�W%TF$�<�x�B4���IK ]X��(	��K���,�ז9�rO���8օ��*�nTSP�E�!\���,�H�z��,!�>n0���vo�w!t;��-��:N28���A��y0N��jKHJ�#H���!$1�!Z�.U��Zc����ssС?@c��֜���\���N�mĘ~��[ ~�٨�Y�r%j<���y=8*�M�!�ɽ%,�kW���LI���AWVqoD�Q�L����71J�v��.�4ƾB�an<����r��5����|^;k����dE�O��-@Ͻ��:���#����	��b��B9b�	��ɡ'5p4�ql��'�Lc5U�P`����a��苫�o:��	����ˠ�jT=&�~�ě4��̰���@\jjI�_�0���2����&��c��4V��H���x��k޶�G��{�la���9R��~��{$��iN��;r�?0�������0����u�[p�W���{�)�s^[o�i&��i.���ܭ���#�9��1��#c��Uj��aD��rt��!K��C���v�$��]p�HQ}&�:>��*4v�Y�]!��'��e2����_�O�֖��� ��c\gu�Ef*'ڲ5f"�H�<2!c9]�:�m{��'�SU�l�R+�.I���r�~�
��>�}X��y_�e���ζm�rn�?PK�mW"V%��"�npip/_internal/utils/misc.py�=k��6���W`�W'���3�<�����N]�v����hJ�$f(�&��(.���$%;�ݫK�<	4�F��h��k)�E��4_�y��ȼj]4�B̤�䦸����b#EY��>�E����dttOlv�n"T]��(�ȓl�,ɔ�o�Jp��&�w�\�,�R�6G˪؈8f�q,�MYT�Hf�ȚZ���H?�y-��,��'����|YɺL�2_׉Z;MS�.+V+���Z�e�һ2���Z7u��ouR��;��ρ�r�SW��|�H~�ֲ��"��ji�]�e��|QT�ey��+����K�k��&A�#�ʂ�'y���$K�q�l���_\>��2��W8U"/��9��԰����j���D���ӳoNN�99�f,��t��N��ۮwb+E�ʋJ`o�V�S�H�ǸE�Q��Bܣ�
��
V��x��X���e�i��j��L3��X�]"��a�eS��&)�ⷴ��"_IU5U�cW&��DJ�㘾�{�4�&��F?i9�4�b�����6��`�E�n.K��N��Ӫ*��Y1O��.,�Κ�)V���1=��o�_�*ޤ�B~���cfE��Q�d���Q848��������/޾f0�^�@`z�zA��Y)��"��,���ỿ����_�>��՛��/��4�m�1@��mZ�M���G�j���-`�m+F���E�ʊY�!�G�9yB�X0��Z����A�櫋G�v��m���r��`���n����x�9�e�C��hM�w��ҧ��g?���-���%�̱�lJl~	;��	�~�[n	[�<Q�J:��)��Y��Q��3�]��BLy�+X(���55�ė<xp|y�>�c�h���U���r4#�91�x�>6nJ`�j��	�%��C��O��6I
�AMp(���ۓx恽��D��*V��D���aCM�-e�Pc��B�7.�`�'M��q9bA�k�jCY��Z����,�I��1�6�XE6�ߌ8Bq�=nRz�
q�G^���
�D`��+�i���q��(` ��y2ǀ�i���J���oP��5(��Q��tE��~�O,a��fz�W��d
�x߻Tt�<��k"�^�?>>���&�xQcSQ,��z����Ca���<y=�����d�
�U�a�DL�	(������
ӒL��8 ��J9O�;��i�Y�p����te�Ӹ�x�=�#.@0���
���,6/����)�m��|�N�XX� �dD臑G��譪��x8�cuފ/�"x(N{��N��K2���C��'W����A��	R�;���V����ڄ��c�c6�&���U�m
\������x}��I��:��<����/^�}��R�])(��"��XP஦J�F��h	����/�*���k�{_y�u�@a�+!�4e�"b$���Љ'9hhWT�(?,#��csG��E�!W#J�����u�L�F1���UT�Pԟ�Ga3^�c�'�����C��NΛuW��@:0pTwM��5+mIk�V��xF�}v�!��zT�'^�w �w����P<�x��hJ�#u�\�@�E	��������)�/IZ�F����W��!���qv;bfvE{2��xn>[�C��}�T�a��M7	��de���`	��'0�)�*�G/r��좃:U����ER�G�,N�<�O���ܐ$.L�u]�UA;�l��º(CA�[��-��z�2Lz�$CMO
H�(�!c�N뢔�&��ϧy#�d�.ܨa�}��bM���֢=��9�o���N{�:�x����'I���G�L	]y��#�0��m��Ԥޕ��Te�2=��Ѕ:�*����
lKW��׀w�k<�:C�����R�֒L g�Z�����D�-i�:2�A���]Q�]�kP��L�+���k6_�kz��p��#�Y��Ҹ8)�&�&O縪��ں8I2h���6ch��P���\b���J��r6��_$g�sPö��(^��r)r�
�0x�K��]���'�m�$���Lz�M�@3�L+x�a�Ȱ��4�ذH��GA,^!��1CZ�_�h�غt��{��и �]⊐
uG2g�j��9<�%�\(�������G�O���'�<kR��L#����U4 $`�6e�Rt[a)1U4�����׎��L
V-��XTy�`}���O��"������
[��>l��@�Q����j�:]���-0҂z��������6�Zj�f�An�T�����X��/�7"K���[¼L������
k���Sȟa��� O0�}�S�Ѻj$|�)��k`D܏���o��k�iF<T����tt,���[��iw@�[�:�yVM��'��p����d"!�w;i��>�])�� [~J1"�Р4G��J�*ŭ�2���D��`qn�9�oV<J��O��ғ3
}\p%d���ە0($<w��ZL��ܵ�d�ʒ��� ��TM��>�_Kb4$�Z�A�3��@X�/섕,�֣hM���jN�pr���m�
IX����Qw�i��v��e~���/�JkM�
�p�^�`/@�b�8d?C^z�hs/������s����f�s�ݙ�@?
L�3=ۮSt�=�gİ�j����ׇ�`rA����i����r#�JV��J
R�6q�[����9NG�i�
V1��x�7�:~�����st�F`hbt0p�<�@aL�(n�N&ԟ��l<_�
F��ô�c�E�0��$�R�I�i�1<���ȱF��E|��K׫d7��q���d���]	̈�s��+W����D|�8��̔�@�e�t�a���
m
I�a.ҭD�	���}�H��S%�'�! o���L��α��O�0#4�� �p�@�h��ɳ�
�
fا�藢�Zjސ���H!�.���D���5
a�:��+�z~F�s��g�Ί��{�]o�.�F��ƕNJm�j�pJ�� ��#����s�����o�I�a��������Tܧ?=�c�a�-?���`��=��ѩ��7[���~7-@�^h8�r7��3�T�C�q�А�Nf
�Q2��m��V���ݵ��c6P|��k�.�ҚltU�Nd,hb�]���Ț
8����~�%�
�4������j�,�YR�=jW�w�tfR.�u�10��6�w��o~���_}������ŗ���ZBr*�(ll��3<ٓ�O(��O���.��:�m5ƙ��	;8'�����``2fd�NAQ30
p"�cq��G�e�6x�	=�<dF��Èi������h��f�c���B9zk��d�4ИM�;<G)weU����&��nT��6�R�AÙ'��x\u�'��ح�܂G=0��c\V
aq��=��;���Du�Xdh�ߨ��N�"����o~��x����W��~�FYIe�e*����"�>WL(�zBγ�4y�f��g�o ^-���G�V��x
W����p�o��F�zg����*�[��&Ka�S�f�\��oG?u�u&>�֪�A��
ybG_�m6�=�;�j�M�pb�l�x(�\/�@��u<�x��秺���l���d��,̍�f���ƍԀ���aP�X.E�'�0�S r
ѯ5�i������֘�`�/؋!H�tg`�����5{W�->7�''_z��"c��.E˜��A��uK%��������I�[[,�m
{��{����F�f�7���nts�f
;kDN]����m��8B�-�+F����j���[�HK��O!-��i����٢�.�{n����*-��>[U��W��u���t�,1��a�1����Bq�*��I����4Ӯ��d�ΪR��҅�`͏	�蘁<Iv'� >L���Q������&o&�����h/t�x�K>�����n)h�KL׋�j��j�9T��l�Һ݌���$4bƧ,�	��y�T���3�r>ζ�Nف�.mG�ʝel�y�>9�����(�"�9Ѝ#FC�`|`�m�doZ^����Xz�l�eJ�`1gL�Y:�„�i�&�q�Μ��	�V��5��n֫Ȓ�y!�&�ߙ� K:�]P�
�.2��qx5*�
����Zk�/�(�,��8�O�ȿ�G0���1�酎�day7�hx�X�U�Fܐ�O��4��X��B�"�x�G�e����ܗC���4�pf��u"i�>Y��Ė��un�r�f.��l�핵
i&|�iWQ�o[1*�8�}�-��O7#�:��<���ې�Q���("��&.�\�W�hw��Q�1��]K�w��G,��0)	�F���e;�+f�&�z��a]��.#��T�����Hu���>AAh~��HÙ@[:7v�™e�x�z����t�ﻘ&.�|�p(e	���e���<��;@�M�hj�+\��UU�ڇ�O&�m&����M�)�q�%��$
�5�k�00�Mn�y�߽��=�!W�P��i�tґ�T�3�D)�vd���5>4�������h��Phq�9sx~wp��!c�@=b�m�6�G����m�O��\qv#�.c�}�k�21э��W�Ew1�6���k�N�{qm�*�L���ӡA%ߓ*��YZ]3�C���v!��
�w��(mX>�3L�n�c2���A���ȡ��mm�t!��h���G	��:�M1{�D�'(Ъ���{��{୶w��3��\�=;�V��R�AݷU��) �2��Ā㼒Imh��n
a��s�p��Km��fY�2�ޕ�v�����=4���k=ߜroX챖�G{-�Ƚ��W?�(>��\�'�d�W�L����k(t����=����'2�1?�}Z�l�f�8�
4����M�ׄQπ��1�W�Hm�LF�bX��bʌu��ǘs�(�.�&_`�;�\�i›�+DS.�Zv�љ���)gz�i�*1if�xQ6�j��Ҳ��FΓ�*�n�b��R����6�c���Q�b{����2+J�8^�����ϋ�N!or����fT=�#k�Õ�Q��
E�"�zyZ�����o�ʢ��J3�F_������t8:�,��6	�v�j8�d��o`S4L	�f��8[ݢ$���P�D��ܨ .䁘�^�ҰOG��`�X���ݿϋ�2��a���v��u/�?�`��{�ẁL�zM��_�sO�`dق�B�v��6y��ni�$+9R�g=����B�g�P�����m�$�{�.��9-�NQ�����	_�<�>���N�?�A���t�G�^�0�R؞��;#ξ���Q]W|(:�Sx�_�%�1�}��s�YkG�UY���ئ �D��8��1�@r�7�pRt�m���թWDRpщ)�A"䇡k�Y���u�x����o����S�5�53(/�6H�;��Z�������KW��Xq��~P�S¢{����@q'ֆ409�͕Yt�ee�&L�9���Um���މ���jv��oA�$�]Ii�A�ڲ��&|q�O��DGصHj��3V{*%�/�:���tV�97
��w"��ܺ�U�Ī��֣�m<jEBW�b�Il�j�d��%H���y1_P����@ϳDa��F>C�e��=/x[%�v�R\b�����v���&_� O��%���j�����&��8P2[��+��i�$�6c�0�G��[�lCf<�P{f��(�\~��\䡭F�Pi��4~]�$h	s1U(B�E�����cP�E��y���JW��3$���7(��o]Ġq`�s�'ˎv��H�V!]�R��%D&�lGL{�qXxǸ���9�;���$p�8�v ֣�BQ�?n��IE�r�;��ޞ��
����N9��'��_Y�[�tGbQ
��8�7���!m����fHl�#�`?�l�����������'���x})����rD�H�X�$`c`�۱σ��^|}��"N�:<��R��x��i��Y��]�'���d�=��o�pS���N8�»��9�{��YV��bĚ������'�{�Nɐt��O>
�y�k+
��=�J���tNv�b~o��=���y�L(����E1�c������Qh�B`�m��T��̓�Z:�=��N4�v�V���
v�B�d�t��bXd�n��W-4.0�N�
��G�ۥ����Ph.�_s�$��X��)]
{���9��r�sp�`x|�j�g��X��_/�9^M�/����K�[ka?��yRRg��UF�7��:�	^�ƶ%�9��[�6��aW2���F�E��3R��� �5��o��G`�'x@�\ޡ�s�;���gzRm����&����F�h6�}�=�:���������Wt�1����2p�VXS���a�04
p�4�@2h"������ĔqR&���؎~5��
~X��5݄�g.�цFO��h,P�Qw#���"�e
�i�.0���`Ƣ�a`�����B�m��L0�=���R�]��v�F�����	�����O�h��m����2��e��R����׶7����Շ���>�,�ч��ʎC%��M�q)MM�҂�W��u]���0z���o^�l(ʠ�yw�x^4�'�P|?��}��LH/=��<����J��i�w�AL)��H�T�P�pz�.��q��8D�e��ikJ. �{�\c�o��|.=DiXh�>��洧B�t�G�
����Gn!���.��fY;�ʆ(a�$���J�EHv�5"���h��FA
S�� �װ�~ŧ��}g���p�=���Q�"�39O��G��d]l�[E	�o�j(t��.�Rl�.'z���P�����ybm$�p�9�1n[����g�XZ#�#���A�[�ה�t��#�gaG�aw�uH�����'�1��4q`���~��6\��a�R�;��&v��--��a��X�w|k�v�l-��Q)lP�uE�;��tgrVc[|�/�gx�mc�	�?Gue�+v:�Q	�T\���p<���D��}��x��.��ٟ�cDu��>�o1p�'��{�w!$t�S��1��&���X��2;����Y���Bh�9̓���]�~�q�a��
lf|™�CXm��?~0�>>��h��
Lے�����95~/�d�+ָ�U!n��P5�E���_.��Z��5�ͧ](|��-Δ����%LG���@p�sD>1�|�ņ��䡎A�fD.v�6s�V�mg�ʾ����˅T��L5h�D	��=5Ǧ6�C����[�v}*g�-ٶ�,,���0bf� ���T��yY2�ƈ�����S�����s��^�-_�����T;�yY%+\-F�_5<�&���(xv�"�s�6L��!�k:�.��m��6�}#L#i���
}�ݷq�.�o���F����W�Gki�+�D:��6�Rk֮�dօ�b�0�c�uM�N��e���pV�[���7�\�yQ�Q�N�o/[��T'f�`��!�i���*����;�{T3�ebuF�2KV&a�rE�J΋UN�T&?�ʼȧ���79�UZ�é�`+Y"�"�:1�A�
��������̱����
9��l���y�@�t�,!�o��^��N�=/3F<�#�iF�`
tχ�`W�|�7��7ii#�������t��Ca��?4�7�Z]�`��e�q�	V��W�3�|oO�(�dhds�ݕ[�M�.V��o]���I����ʝI���u��M7ܢ�
3:(��d>Q�؁DI�$�q��xԥV��Ĕ筿[��m�-����TT�<ş%��t��o�Z�6S�ŏ/&�7����P���B{B5�˂�в8�����O�5L$�#����s]���u�=�;f�fw��	y���
$�\HDYL�B����s�v��)�2�s���r�؀��t`�.�
� 6_2h}(�e��d�DW�e�r��b]o[�TX(c��o�:W��˸�1VG��J�*_���+��X#x<�}�H�:ȝ�ta�C��^�ɹ�yr��JA�Ƀ+�=
o��2y@�J5R=8;��;�G�X�j�(e�@�1���
ss�V�I�-����e�{v��4�2j�����Λ��s�Eo-h6^��8>�`�,Jm�aQ��٤�+�e��;�T�,40�2��>�Gu�7������Ufum�g2N�*��R��M���)�4\��S��ڸ�[��/�b����1
� ��(UI]�+����X
�230bn��ə��_��p�k�ı�)'��m{}�K������^��:9���5��^�l��O�)}%c
���
S�Ft"�lY
��Q������bg���z�/�T]�Z�wZ��n���q��x���d֞:w�5ՠ�%N[�6Kڽ��5/�A�T
�m��~yjj4R6���}�$ޭ$}�R�m`N�ְ��U�&�Gb�~��VC�G���tX�`�O!�@��2���s��>}	��
�=`�GuΕ��;[�ZTj�mjO`괭lXV�=n~7����k�\{8M-�.�_�e�9-�n7��o�aF|P�rJ���?T˝|i��+���4�+7�X������œ񞝆�' z*�ŗ�k��Z��L<_�o�w>Ǟ�E}�)���u��i[�"�c��<<�_PKEePQ�0-��pip/_internal/utils/models.py���N�0��y
�6�n��$$�@�P�5^H�d@�g[���*���K��(��d�I#l)�ƭ����H���(
qO
r�Z�ʥ��C� 6��6}�ŋ�Z2\7R��.�1�k��&��Z�|�Z�+�/o��(�q-��bP����*F���JE���Z��|���V�B_l���h�I��2�<T�U�~��aCa�Q�U��q���2ZJQJ����<�Prߢ�����{-^!^� ��ˈv[fp	��i�r�z�i��_}���pv�bs�=����\\��<��9�[��Q~�o*_�@#q6'�z�e=��g[�SK���̄�϶�˾s-�ajH�f��7c|L�W��� 7{�t�Z����ZL�#OO��irbPKEePQ���Q� pip/_internal/utils/packaging.py�V[O�8~�8�h�D*~��J�T10S
݇B�INZCbgm�?�ΥNZV+m��>��|��B�
���۽�$Q�J[��F�{�I�>����n��N
��%��6�;�+�ΟL�Z�,yC��^�~�&���͑�^���ɛ3Q�fo�)��iQK^2�'��ҭ�4�J�
Z�s�/�V���ފҰJ��S˅�K�����>װu���ݯ��������z��N�'���[Z���y9�;.� ��\�1|���� 5�0d��&���yo=�J��y�S�E{�Ϣ$���j�I,��f�d�� �I�awJF��>7�S��&�/.F\@��H����90ƞb8���*��t:���-�v���yW�'��%l8L�[4g���P5l�-�Py5��%|=����5YAi]fx��pO�_�>���V=�� B�e���B_���Oi�a�H�&�n����p+�a�HKzEY��n�08��0�W�4���8]X�7^���cf��QS�qbT^
��g6H
��0��=�/�!�M7ӷVo"'R�����-p�Ǥy�O�tR��cy@;�ȸ��5��y�1�L�h�f�E	U���:GuǓ�Ȗ���l{��*���`�����A���]�ڢ��<0㊘:�@J�<x�ӞmG3�0�|q��x漓�Áh��\n�ߖ��+�H!��2C�|8�uE�C�2�q��i���8>�XwAh�� �����P۟��~�Z_��N�����{�G3��;גfM4]���B�e���3���'��*���V��l6�Rҟ�����j7B߬��I��σMœC��,ջ����lPTj��]؝����
�����J͍��Gp~��s�{�=Je����^o�S-y\���A��7\?/� ��Hvt����&�Mj�а	47��\d��p<^NMO(�J�f#�������!�%iZ��8P4�G��><��f+"�U�
�M�2�9�H�~ ϩ���f��;��\~2��R;;���Se����dz�91>V����>�.˾����C�n�'��#'��:]�Ba�4~PKEePQ�{���L
pip/_internal/utils/parallel.py�WmO#7���b���qR�"Q�DC/�*����Iև�޳��ܯI6�;݇���H���gf�1�F/QK�ja�R��g��`�P�E��-��9�4I&�tP��Q�5KY��d�DUwu�$}	�&��J��e&�GF'�/)�	]�wp+�r�HA������07��t^Z��	V��BKW��$9�J�Y�(/)T��uE��(
��I:x2��|Dh�x�sl�&�)�|�59A�

�{
�="�[��6:'o�	�CTXĎ���h�La=B��X�ئ5�>f�1�A^�z������M5���я�3�*"dK�+P���-4�[�U�.�B5���!�x�W�hf���VHի���R�l�)�A��� �[��ӛ4988H�,��g����_��z{��=$�ܚ����^��*4B+��J!hu�q*�꘰�`O��i�T�j�j2	FѪ�u�ѰƦ?5�KE!jϽ�Z�6�xww9��77�����/M�|ބ�?y�<��7.	�nTy�Z���R�ԯ�Ε������ه�����I"篈O�x�뮇s*��FmǴ�����4x��j�Sح�/T��V@�,�OY��d4�-�A��4���m�(']ᄄ�!�h���ԻD<�����L���^V�X臐YS�k�aF�N�=i��*"��~�S�����'��s���Q�Zkltq���^e7��5'oLP9|��B�_j�)�B�ԪP/+�yKXC����t��L�kM���jxs�`��~�$�uohhL!W�o��Ō�������)�t[����?Z��eƈ�m#q�������9.e>`G��g%QE��=%��U�.��8�T�<|7�n��h$%C!5b�Edž9��!a,"	z�*���B`���,td��?�r�}9�(Y��I6c.[�>/��|[�={���z�������nM&��\1So�G�6nϗEA��n!��Y@q�x��w6�gF�1�i/�ڬl@�1�6ێ�O$�NyhC��Is���}����1{٦���R%S�Y�h�R�������L�{�� ߝ��s^�;�����5�Jz�b�z����_|mSӞ���]�-�:8Y7)���M�|�����'<�֬�Y���#^�|��<�����m�}�f/���*w�o��"o�v���O֜�/���7��It�?�ڃ$;��Y����]�]��-�PKEePQ�@��$pip/_internal/utils/pkg_resources.py��Qk�@��)D����н����2�C	��T���H�R3��w��NR�llI����\��AMu�^��E�k��7\��j�ZBk�%��U�B��:i��N��d�m��R��&��COO���7��q��/�dU>_g�Nu�pGe��<2������,�J�E:��6:��o~b�{��d2�-�_� Cx���lP����L�#�4�E��=
V�b���m5�t]�����*�i�6�����,��5ijH�f��޳���tz��x�!6���v]�;#1[��I��G��qV�1y����!_K�<:*��;L�{fϠp�}J&��qƦ)1�����`���ԋ���;�p���O7����!�W�I�r�K�ζ�3�&c}~L';�o��\:��1��Ob��c:>k{Z�I]ޯ�v�bU��Q���d��Au����!�.��̠�������/PKEePQK"+�5�'pip/_internal/utils/setuptools_build.py�XQo�6~ׯ�)�1K���-�&E�b(�@���M�&5�r�
��;��,�n�m��<D�����R��Pڂٙ ȵ�@��8�Ң�Lĥ���vWp���?���zs���㧋������G����k��;n�.���+Q�g�Xs�+�׬��,�b\nU��]���0�����"fz��~q�\�5B�]ߗ2C-vn#���U�c�~��vX���#��ၿ�	��D�4��5Jr�{�m9�XJ+�Zsl�xf�U\��Ju��&y��&����=Ӓf�w}��e2c:󩌢tRYrJ�q�,ί>}���|�Ho޾�9�����m�������C�Ǘ�z����?_B��@I2���Y>_�e��qc>��*P���.�qc7iLR��<�5�l<�K!X���͍��qf#wi�y�
ep�>�Lǩ��u�|Mۭ��[M&a0	� �\��}��kHB�_�j%)v�k���Q]uu��j�D�*Κ����A5�&�m��*)
�$U2��L�����P�J�,�5f�*mQZ '^Jͳq��~������4���l�g2�d�
Jkj	9�9��y�g�^jqP��L�M�B3b�^!�N�u�~3�)˸���RϪ_����J�TH�'[
4P�6���+u�����:w�����DC5J�W�����ǽ�;�B��`�J�v�B��0���X~O�aT����Q��s�7̎{�����>�_o��>��H��a�4_�;մ-+�T�t�4������Q�-K.����L.+f$׃��)�..��gp�%�L���q�ќ&^YH�
�EsB�Q���iu28���7J�v$��J�ɣs�-,i$����k:︤CD�h(���SF} `�G���n��a�I�D}R��	Ԝ�/5�; *�aK�N��K�'F�aG�ǃ�9�k;�N���d ��Ha���Ag�*��D֦�|~��Ʊo��U=�rG��ş��*���$B�Ӱ��v�.4��Ҽ��P��p������۸���79	�S�^d���2�K�x�:62,����/hN"���ȯ�[Ӟy�54N���7���E��rۆ�U���[�����&����}K��oH�5�Q�t{��_w�<Ί�h����z�����̸�u�'7�a�>�4�Jg��d�A��J�G~ʌ�o)j�S�w��ĉ���;� |��
̪ħ�5��D����"C���-}!�#|����>�
��]�����"ӥ���O�>��~���6��i�X�� }��hm�juxܨ�h�q�e�Z�rNv�_PKEePQZ��w�&!pip/_internal/utils/subprocess.py�Zmo���_�:8�n�-P0����]p{� ���!
��DǼȤN��5���)��P����p�����馩�J�)��RW5�k�����~v���Q�G�U��i�e�3a���y��LҽP��#?';�Ƴ7�B|Not-Br�jQ)^$Y!SJ�Dծ��~�B�
�Ă�R�ԑ�q�3Q�R��Ǖ25/
�/�J�.kjY�$ӻ��~aLt!�Z������siʂOsq�b+��f\l�r'M�}/�\�;�^0j�U[��2��_o~M�~�����W��nF/�|�k�aF/��F�-�q]��`[��{i@�y��욌ϋ��T�uAl�g������T���h�=ݓ�;�����_��������-O/��3���ذif7���Ös��9**�l6��"�a�.�> ���jS	^�#��7��ID�H������{�+dL*�a����ۭȞ�����ϙ�D��2=�&`�UqdOJ˛
ݍr\d��%-)�4�~3�eA��;�������#�%��sv]oEu�"�T5x���y!9�D[�QU�LED.�V;^����@�pIFBG��8�=Q�f'Tm�=��1p�k
�5���]@��g��Ix�>��	D����Ma�˵�����u N�帓@�`o
o�-8 �ՕD��x{d:��O���xs��Z��ch��~�g�
ٓ5v5C�>E�C"�Liu�M&%˶�B����p�e�"�kaPh�$*��R���A%0~U�Q��R��&��!1e��7-UeA"���0��c��+����Xw���^�?�}խ�3�AA�X��FQqP:;ݷ*�Ĉ��bk�{L����$���l�T`HY�d;k�
�=�C�1Ů���a}:�L����gYC��u�����Y�QI��;p�h.���:���l��G�'�1��8�a,!1:�z�⊵WbqnY±�Y������NE��-������|9�� �������V���j��D*~�BEjD��?�H̙шO,�t�5bǸk�V$D2Tc-
}H�"�k��g2D�%��L>�pc���F�7�I(��q.$f$,�j.�)��R���U�4�9ua���[%0ӹ��`}����[����/�r5��L��`{^4�M&���@���B�n�3��C�s�r�gz�"h��ԗjh�IhtA����g��@���.>.�L$�	�d�4���W��LH��dMeO�of�7����U���;wɾ���9'"��
�R��b�}g�Q��=�s��}��%�{���ٲ�'�4���W!\�=�W���! :�t��
�c�{m%^��c��*��}�;P��s�˚ 5��`�G����X"aV��+�v�Z������w�<�UjE��]M+��4X�@�����)�6'��N�R��C���Jewj/+�N���v2Ь��eD���VF��Yն�'��;s�i�c��y
n\�U�Oõ蕇�O�o�(p��jP�aA��÷�>�"Tva5��²´�U��}*��@t$����>~�߉
o
,�5���h3K؂IgM��؟c=�'X�����2Z�~�<�%�
��kI`�q�J��;�!O�?x�"_$q�	Y����\� ������$�,��;Zc&78��MH��䓍=���v[�C�N�$G��P:cy\�`2�-����2��*l�=��"���v�9�QCU��	ʬ�,)$H��_Е�=YoHsqa�8V����Pإ`\f[Y��>'�}֔Իu�i�8LJa��.a�8`���$��ƿl7�sm��БX�AFBh��܋����S�Q���0hr����P��-�#e+s%~o���c�@�J�V�����T�,� fM-��3���N��L��'�~�0C��sO�Ҹ:Xي��e}����.oo�o�������6�@��.u\���V
73l9�j*o�9@
ո(۞h[V��f�>���;0F�w����z/������}�D�w|*A�kWB��������B�K8Mv��6��x5��&Rmtwp3R뛕�g��mŒ�M����j��D��:�s3�{��1�d��c3��)�Ql�y�2��?�l.�����Z'�a+�y�)��C�h�,6I[=��$z��f@�E��ٿV�h^�kDu�pQw�1u��v��� �`���
+0���4`�@ �77D���7���y!z{�Ev
Z����Q
��M�7f��8�Z���&q�'�ty����sy���>iʜ�bQ�۹1fttt\DJ]ΐlAjۥuu�P�(
\��p�X �)����Q���M.�y��X����,0�Q~�{w��ocr��7W7���~}jhv�X��nU7��Ơn�0��N��M�R'YX�i�إ�����:���{uT���8f�P��.��Ďj�1X"���E�ԃ���㨌-�ف
4���Z;Tp����Kp�[ƉQ ����( �FX�㛷Y`��/R����|TXJջfX�S�9�H*����n��D�6���u��O[7�!�ۉ\,�� �8���]���"��~F!���ى#����ˍ�F�8F!�9�7��<����r��-��r�3�D�X
N�1��X�Q;���lg"��tU�_��Ҥ��^�*�&�Պ��B�����*��7�T�zZJ�XER�U,#�|1y��7�؁����O�W8��pX<���N��h�S�c�^�
�O��j�cb�̴?9����;>/���,�{]WK��M�Z�%@������7��bp�73�\xFc��+5}-=!D�f�@��t����,��o�t�ә
?�:}`��)���h	��RX����tz� ���f�eo���O��t0��D���w���wl�RB�����������c�w�I��*��r��4�x����ne�Z�d&���V�
�P�=$�	tF�K)���S�n��~B1�n�wrt1n7�Vܖ$�������������S��JA�и8D�P�Kg��1�X:��u1��,�g0��q�<,�zsSjp�[2k��R�˱��.F�������X��ې�O���a
���PKEePQ]�zy
� pip/_internal/utils/temp_dir.py�Yms۸��_����Ҕb��=Sݜk��%v�8��<��$���m5����.� )_�w��-��ﳻЪR[�$���U"I�ܖ�2�/��wF$��h�ދ�*��"���R��/r�^�b�*��l�W#��J�b�B��*�x0�\z��͖|-���V�2N�D��*n�<�gҼ5<�������F��p��rU��xgd���isb��X�5��O�}	�3�~|�cr�bq�}������s0�j�����N�}��dj"v��QU�.K#��վ?px���7#��\��_�'W�[�]�͏���g�)P�OG��GT��)^��M���[�?n;b��"�L��e��՞e��:f�E�g����JULB3��7����\-y��g֗Y<BB@"�%�s������g���x��y6��8�����W������L8�r#�����,��F��o�H��|\�͈,�:����_�����ų��u0��o;ᘉ�ӫKp2���&S6��v�52��
�8랧�{i6M4	��Ə�6>*ϺG�1Ю���tL�o�ⳗ"��7+Y���-l���9ך���F�����o�����+:�)�� ۳���;�*��;� �$�&I&Z�i#eh}4z��;�Do�D�D.��?~ja�]�|�<*�i�ia�	�1���|'���4�R��E&S�!����CKQ�m[K�0bŬ�`���5�2Ab��?��5��I�F���~#�P�6�炀{%׀�Y[8����;�B]�pT�a�.7�ډa�*%�Rqlb�ǃ��\����z��&���T|]�;�Ap�SU�R8N�V�06���i�h$Mj �,���j�uA,o�.(y^�.�,9�yh�a ��zXD8t�x���
�[cRrfC,���0^|�͛}�a8�A���`s��<��p&do�w%��_K��Mī���x۷���鄴��%�EY	-
p?�2��F=��ĘJ.��Ӎ!�Ec��J-A.D��_��V�bhd޻XD
���c�`*v�mZ��Ybj5zLT�R�L�+]|�猘ifH���x��˨����{[2��N}�q�X�9"��^Z�k]�Q�9�Z�Ɵ� �o:��@����M^#�G��)МFt��Q�q�$0�w����;�k��\W�Vy�;ȜI�^�8�kݝ��8�ټ&a�[�*��P��	7XK���=�aQ�b�1�\��4ށ	@�tW�\�i��>[
2E�,�Ő\��2�
��q�fW���ÚPE� �8�E��ɨCi���o8Z���k1��n�?v�mpŮ���Z�Vk�:XB���)q�Q��
j�ymǣ]n,p�K\ێӲ����PWf_�*��xO��'J�&b�@�1 6�dl��i*t
������-�Z�7��|
(�Nh���\S�V��
��_U����P=K��O�6�c+\��5�a���N���=�cA���.=bf9D�fm��߭�U�ᤎ���z�ȁL�#9@��/�4�Ͷ�xBjRX�P3�M$�j�X���혀�uJg���]�	�i�C��	�������q��
�R��4�j�Xi�"ݲo���EIﷹ,n].�?ۭ�>v��xE;p�A>t��&�V�4Z!HC˦
�r�o��*��f��*��@����<�K�I��z���ث‚�J���~�@#���q)���O�:�}C``� `���Ĺm��{ƾ�P�CPq)����/��o�VY�
���=1t��5x�a�`�tkeA+	�I(��m�㈽�Y0�b�EX�*��`���q�)�mqc���P�T�Ɛ;٫H	������s������}}{�'��}�u��֢�WN�<����|{l|�Fׇ���$����GC�8��\��B�8�]BZK�a��NV��^�� l��x���,����D�xn�����۬����nx�S��ym��k��Z���F���{�
�Z	�<?S�R�e�R���QC#��s�×��l5Wx����v�`缫�_a�~���jXW�����3Hƙ,V
�晻
=���(��xvL��J���V�qc�ݗ������鋓7o!�dz����=y��?��O��_�Fu�E~8Bp:x�W�UtEx��yM=��,'ǿ���B��3���ȉg���vK�o��Zx�$��ғ4�2�+�MU0/�ݞ%FS�.����G�4�<_��f�E�y�fn��V�B��$RS ��&0�q,v�ԷHDP��&��5
{���-���	��
�Go�&��h4�18uk����D"1��W�X�ɓ�+&d�N)����0��D��Y���ƒX'�w���p����q��1cO��I���ǟ��o��q�A�bRK3����Z>���jYS�jN��<�Wv~�dv¦)�1�±V�k�\	�Џ8��б3�g������]K��v�R�Xth���̥�*<�M�Ƶ�Gt:x�O��%�X�����;&�ǡߕ�$lF�yO��]�]Pe�*��WN���b'�]ioB�.�d�r�x��ot}�����v�/��9����g	�͏x}�G�;�<+聖�_ث��J;�����<3<n��ߎ����~���?PKEePQGʥ��ypip/_internal/utils/typing.py}TMk1��W�!-�k�@�Jh�PBH99���ݕ}���i�&i�1f�3z����f�+��n���u;�	�m!���Y����q�`�гt؍�FH�wp ȑ8�c�}�HO�{�;���֨!��՜�@�ͮM�3�M��i>�1*H�x�a0�sM�v�8�[��s�aCҐ�4`����^xj!���d8��h�&�6E@���?�>�=3u>����3JtQ�~O�r�Qq?v�ݗ�rp|N�8ڊ�'�}�M'Zqj�+Ҁ��sh����nL�Y�/���L�snŠz�6Ȋ��
0��M��)�@��lԃg}�/��Y�rz^�V�갎S/�M2� \ai1*?�QI�ṕRo|/�Ȁ^�'NY������uS��c�Y�R���>�زъ^��m�s�RSV�A�6���ib�����l[b�>�'+D_���el�
-�в�
�@�0Ė-ı
ɵoʢ�E�i=���:/VQy��h�BG\*�.CX)�)R�ޭ�:ֺ��v�y9��w���o_/�������^��v�FhUB'�HM�-��v&�!��˝M&o��r(�[�W�6�Lqyq���fJ�[>W��R�!��cR�'kƻ)|K��;l�{=�MNr�h��]��������LW��~����8���Ir�$�~���5Uq4m+!��z{�2}XM�i5%��$�@MSPKEePQ���͋
% pip/_internal/utils/unpacking.py�Zmo�8��_�Kеtu��]�@��E����ݦE��v��h�[YҊTRwo��̐�IIι�w@?������{{{�Z�RK�X-r�E�x=[�k������h4��K�y��Z�)����5�SU�����x^.�X��R�oj�R���}׼��\��ϲ�[�r%�$��u��D|��J˲PN��X� 9��uY���*A�z]��61����Az���������.��鍽}�zw�:��/��j���B]f�aAPP��x����g?y�C�������(|>0|Drא�)p��\L؏R�	{Ej�]�OpY����Q���i1/G��W���:Y�#�EiZ��H��/_�~����{O?@*���(z4��l�.<����}V��r�{��cđ�vJL�-W#}��i����|Uf
�S����\樦q�ɲ�^���˚�^�eY���û�����I��v���"�(s6k�Z:mV\}�b'8���bv�	�Q��n)#*v���%L�.s�����@�d
�K�((�e�N07 3"<�8O��cn���d���̪�ԓ�g��CTq���N��^�ڸ����}��"�?��*���?��@@&�S`熘��/�
���,2b���
1�T� h;˥}h����EIE�Ą��"�}qn%�y����q����W�(K�z&Q]��l�7YgZ��s�7��b�n��5��Et� u0���2&b�D$&�E
�G9M���Ț))f���8�W�b硳r�*����\~�8:�� �i%�H�Q��<%)
$[���B�����V��9(�}@6�-�`!qWt�%dc��8��o��`kw����M[�F�	i��]?��d `{>A��1Z�@'p�˜���UQ9F6��J�ڍ�&#Q �8~n���-��\���h��,�g3�֝x|�������L(t
���X��7�e
Ox��r�H��Q0G����{�l��i�%�(UwJa���h��Ѭ!(<%�E]6�MY癉��$bw?Ŧ�++�E�P��7�U*S&�r���A�D���/?~̾a��/�v�<<<�]y<�J�?�� �t�`�J�t�B0!�i�Vʵ�ٓ'���nH1��b��6��^�[��)�s��{��w%j�#�M����7'/h4�az��ݻ�zS��Q��aZ�B�䝰9`_-�c�*���>�
�Ȟ�va�o��#�Ѓ|(Z�}p2|H{�=#��,�M-Q.6�
�
���
ȬS+گ����bg�*�Zd�[,`�K��@+���ڤ	�R&�=�i��J�ь,��s���x9��98�
�i���V�����b�x�lɋ��QX���{���1�Bq3I`�M�9��Ԃ ���T���q=��E�v6̵�>�(y�.E<&X��{�q��ʕ��0���E��_�-5�cK,���f~X���O��`¼�ǽQ�W+QȮ��n��?��sw�R�_E�&�d�C�Qw�ECE5`ݗ{%���F�{��|mi����w!b�{0���t�l<̪l���ql!ܔOdӧ�{#5�J�{��n"����|s^lrW�SټHD�)T����>�"����(�//|�V
���7�Ͼ/���tI�g�G~]ʌ�w�'(:��4L,G�-��#bHa�z���
@]���m�9��'���	�߿(K����@�`�C����0	^��O�F���/�C�_�!P��U2�K%�>^r��?(�#)�=y)7�b�j���o���*/�����A�/^���W\x��ʋ�ʚ(��)�(��T��ls�-s4N�����7��v�� ���;�
�9}�M&��w��|kO�nx]���j7~��Lh�!���B�Dg��"��Q�I+Ԥs����F��cw�t���>|������ dD"�{@���ڈ������a�#��-�34�gK�+utp��5S�hL���b�������*H���6�O.��E�s;⬝���6�Ci�¾R5��V`e�0Km_WΝ�H��С����.z���z5�a+�����Rd�<z�p�	Ɔ��%2�-n�Eڄ�i'�B �&�y��,T�M�[�Q8����Tu�53,LRm��J��\�f@}Π4�rY|T� ��_�Ss0�z�E�6���^�\fG�.�����&�P��A�,��!���I࢑��	r���ZSF?�5τ=պ�S�t�߶�S���%�nwL��g�@B�����Z��_�fž�إ]��Ve{7��.��k�BKH���*���&��=3�
������FC�"|a��w�BX��s�-'�����Y�#�������ۋU|��4c�zy��<����c�n����ћ�^���ը��%I�yN�Ԃ��=x�K������#�/�C��M{�6���_;�x��;|�gn�
��j��V`�g�Y��M�xo9wTʧ{��^���2&��n�v�J�������^u�vz0�#��o_�A�Y.��?X�1���:�;�թ�̠qƲ4�`�jKK�t��<�4�?����=��wT���6��L�7�̀�NEz��w���	"�[�P<c����}���PKEePQƔ��pip/_internal/utils/urls.py�TmO�0��_q+�@�X��Ub�T�
mt��C�i�ēc�i������Ti�K�.wϽ=�(+mh�F�[E+�K�D��5��6̊'V�5ZV)�=��7�[h�y�_n�F�vZ�n	B94�KV;!-s�J������M>�r>��_�g����(�=�It��{�&����e0W�FQ��<�˩��.
,1!1mp<N 	޷֙&�.��=�m0��)�Ġ��|�
�?]m̴�hG'f+)\B��MoO��4IږWqW�N�/��8R��h4
ߩVk�9�N�����W��u�͟���J����[-kG�ZB��M鏵v�l܉
βA�`?#�1/1�M酤3h�C/i��(b�]�B��PI�����/q܏%}1�v|~�4��r�jiP�X?�fj���+��{�U:?���\m�iIO�э�a�h%�
m�)�e(��}_O�?����z���r�J���&)u��(td�B��7�{�����"�X�S5��M'��Arں����q��f�U|�i
�'��3�T���XVn�v�6�mY�CJ�Mo�$w���s#Ի� ��
6H�Ϧm�����`�7��V�K��NG���oq�rA��O.k<7F��+���8Ž�ڜ`��?3t+�W]G�n��m����Z�{��;�'msG�w�o��PKEePQ���%vz!pip/_internal/utils/virtualenv.py�Wmo�6��_qs?Xl�6��A�A�4���+XZ�l�4)��]c��iY��dm�h���=Ͻ��f�����`�2��;�j/X|O�ݺ4͓2��ԋ�ո�Ɋ��I�>o]��tY%��I��\e���e~[!Vs�뷗o�ً��Kvu{qq~��/{�O���z��J:?�7��/I2VX�6Vg�_���1�W�(a�g�n����7���f�.O�^�>�]������`E��U%�H��v u��BL�E/V�zR�#_���~�����_�\�⩷����ʉ� %IR����F�X�a�Z�u:��= ��	�#�<��1*,����?:����ٜ;�*+J�	�.���u�}�̒p�f),q�.g��ӣ���Q�kki}����ڻ��0�+P(���0��{���S���;��bQ+�^ǻ��w+�j|G���}��9������K���7�C��
ۯ!GO�QYr��a�1k�~D�W�|��A�����
H�d!�wl�3R�v#���Wy`에�Љ�jKGY^.��Z�~��|G���y��}�/�ݪ�߇3C̠�h1�N���w�L	����n��bLђ�Ԫm�@��!�s�`p��\>N���ޠY�/����ik$��Z�$�ao����KS/��l+���p��e�#�T~"5�LQ�\m8��lc�����ۛg�'�A�XT<y����~s�#Mf*��#�Ƙ�)������pD�,[�;))��t�9,~�.��F"g�r�H�Zl"tX|�E����Zc[�(1��G�Pf�����>ܡ�P��cE����\;�a�JCKdC
���Y
��c���2k�70�e`-��#o�#�3�]#W��A��Z4J�
�U£p�$����hP����ݧE!c�)�6=�f�m�%D��K�<L}� �Ɍ�w$y؇��V�����RE!C'9�bt����\�d	��w ������t
���PT�VH6%1�0q�vqH�>8ۗ�z7��UhB?�08���,Ͻ\�N�=Z�?����st��:�e��q^Q{� �%�==--a( b����ޔ�����He:Nk�*����t
� �ao�	VwޟE%���o���6��v�>���X���8���MiCVm;��JR1s�$�S`�
z!p�EƉs�"�뮠?/&M�ؕ���%!0����Ӛ�&ٴy�����
�>N���6��1����	�ދ��H�I���
f�qz��d����Jڰ*��ihǥ�fC��כCj�g��a+�����Ia�Ji���;�x:��l����:����Apt�מ��h��_bH	�Q�P#;v�R.�����C��6���T��V�,��PKEePQ�%	�pip/_internal/utils/wheel.py�Y�o�6�s0D�ɧ!C
t]�kҢ�]�D�ldI��^��}wLJDَ��h��=x��=��j�j4��e�eU*6����[Y��J�[-�(�LB%��x<͚j��t��i��x𩪊V��<�Fv���s�f�Ē�"�y�D��ӓy���Q�{���_ã�Y�:I�D�W
��n9�MZ-�2^V��x!�iɗb��<m���&��w��E9��o#�-c�T��^�'&J�&����Ԣ)y���Y-�'  ����u�g������\�ݤz]��,���_�W���3�������
xf�e�t�����R(�������A�&�c[����'��4��7��mW��OQ(��� i��_��W�.߿�x���svƢ�	{�[D+@��6���֢����-+�R�|���e ^�
���N�[/�fK^+�t�r�U9�]10�q�^��E�d��\� *e)u�FJ���?1QL�[��s@\Ni~
~���Zu3a����*���3��� )N�`'2�`C�v
�m���W�:b��.u�rw�n��N�4�S��΁D��;C�J��#Λr#�N����v���
<
o����U#M���b3	��R���{��F�� �������%כ�ۼIlc_<
�F#tP�iދ���a�g�7�0�8�~�>��HH��d:�x�F@m	���t6��``�N�Nɠjâ�x�6�QAI�p.P'�R��~���p�O�8ɵ�[M���%�	��x3�su�4o�B�D�g�oN���f M����?t�ƯI������������f�<�ڜՄ�6��-��MkM0 ��k�;�$=F_�*�A�/1{��;��%5q	������Z%rd�+�]��gCE&�����^VЫ@m}2�^)x�x��k����7
�O_���<k�"%��*y�+]�]u���%�.�����vlA���\��:�w�s���6#�D�� X�7���ؒ���{r S��Z���3�'�hGo䑾-��a���K�̦�m}Z���9s_:�u�
�7�i2�!��Is��#9��u?&m�t�2�w��LS�ACa�2]�ܶޞ�FꭠQB����Q�ɕ�t�0��@m�$�#�Pd��[5kp]n�!s�����Da;�إ$_��y�V7���������w��N4

���xŸ��l�l!��4���r*!-�#�uP3,��R�dѷͺ��=��'7�BFV�����
#V�~�T0�!XM��6�
���rՖ���8v�*ۻj�WB�����=�Q�w8�Q�d��V�A!j�*Azf����Xw�lEu�����t%��W�3���v��W�~�N��]L�>�uۢl����xkXz��cϷ��T�^�����P	�h�������F0�8�Vɾ&;���`QO�_�B�1�Ga*��wt�f�
z�o�Bf�s���j�$�d�F_�j��N�[v���2��ɠ�b�L[)�:�5uyjb�)��P?4%�h��N�f�s��O;[���{ڗ��Kݬ2nd3ኢ��Ao��p��R40gUӴ�����IV�a)���-0�1�J��-�\�nw
C��j�#�O�	��~��::Y��W�_JPV�EN@ƒl���Mhhx�*G7A[�d�c�w<����VK	�O���k\p����S7߾�fǟ�B��m7��	����c��X��@=�o m����%��Aw��
aW�᠏ �� ^���T�d5]��ոKSF����	,a�ώM�]���wXG��B����*̛��ș��v�]�Q����ܲ�i�8Ś�9$3%Y�h��v�3+�;�km��]�y`[��rY�L�$�o��ЭA�ӥ�#����F��U���z0߸BP�䋷p�c��]��[�t�u_J��Tm�3	�1Z�:"SZb�u&�q�3/Z������;�wv+/vH��p 1���+NLx��5�CXR�%5�P��sX�iLp�!� b2�&���ވ^U�
��I(`B	I�F����oX�6hĆ/�T�|P�]=��M$�9;I�c��ǿRiC�i�m�H.b�{T%�RB0�%#�''�a��8��`u#D�a�)�ij� �4�-�~1?,Q�şr�@!�-7�V��w���|�'tK��@�i��a�x�<TCC�?Ĩ&ߡ�4�k9�CV`"�`��@3
9"]4����Ew����f~�H4���H�x�‚�R���N���'!�n]'=]�PKEePQ_�QMipip/_internal/vcs/__init__.pyuQMO1�ﯘ����FO^	(1n����t���e:%�w\0&zj�>�NF�-%�'�@BZ��&%L`b��8�	�5�#'�,�5�ܢ�F�����Bh(^DT?!p�%h[d��ֵe� G�K��K�鿨�`R�c�B��ԟI�Ym{xz~����c=}��Iu���%���%SК?)S^\���ʟZ��5�ku�2�\Ҍ�Ʈ�m8��o6�r��h���8�X�0_��y|��<�mfg�y����FtA=��5w0���)�ʧ�#�R&��?�b�3Š�]��)�f�L<����pf���֌۬[�U`P\�PKEePQB�ĶF/pip/_internal/vcs/bazaar.py�Wmo�6��_A4($7����.��b]6��0Z:YD)R%)'��)ɒ_�~��X"����{_+�R�A�
�M]���U�U[�P�-Lࢩ�5F��̓b�[��ջfw�
���j��5P\P��?�r0���Ԍ��9�uc�gb�j=�>�u��l6R�j\g��MƷ�c3'3
�e�UJ�{����p,.��>���j���K�Z����%v������5]�n���^����B�»�����׷�wwo�<��)�}����p\;���]��ѹ���+�Wo�ꂡ$_��z���Oc���hA��Q���odQ�~�����_��z�K�`���`�3���o�l�]XK9ע�v��X���w�E�N!��<I�$�/6	���Z6,ZhD��y7\^A
���N�`k�.+���_����r/'�.U��	���C%��T�`τ�8�{�遞��B|m��D���٠|�6h] IH�9njV;�
$��X��|e4������=l��b2հu�g�0m<����s):��7T�m�.�`;b��6c��u�xiņ�
��3FY�o��M�3l<d�t� ��ŗɼ̧pE�|-p[N���0rd�L�erEƽվ&���]E�������3�,u�?sv�[�j�|����:�K�Io�x�6�aK�8/u�?r�.Ս�4h��d�(
�d��]�Lz�4��ܫݸt�e�N�6v�K{se��ߝ
��@���x��L�t���h��c߭Aʶ���t�p��isH
4�!����.FG��W\�CWi���w�|�h��'[�ń@��m��#f�r�~r[A��X��|�:��S7b��i������2���L�S^�	1���R<�W��3U�
�Nx:�~�zT3� �h?�`GqL3�!$�,(nbFC�mS?6�QY��5�R_/�w ~���p����<�6xç�r_�ʐI�:�!�~���bV#��R>f�p���}DI�Tq�L�
��N�~�wEQ �1F�b�@N���g'S�p�$�gx�XO-Qag���u֍%�	����K�DT�@��Ʊ#�'(:̚7�ͤ�˄�%Y�
�ɻW��@I
�@&2��i;g�X�	��͈�zS�d'Mr�.�-S���쀷��o~���v�w~�O�E�3�Iɠ����,�%��t������sJ�g\�j9�ƙ��0	6C8�ߪ�V�{������O�Y&(�����50D-O�by�b���L򎃪,8|nE״�i��C�+� v8g:��q��>(�:��4$�����}����vclw��PKEePQ,�r���6pip/_internal/vcs/git.py�[ms���_��͐�I�I;�;��z�;{�^n|Nڎ��@$$��H�S3���]$@R�Ӧ��E"��b_�}|�nW�-견wE�dY�^�J3���2gs��X�[�3�`����E�4Nlt#Ert������Hj�Tz��,u�J-d�fij�)+֛Zj��.-R���>/��Xr?k�l�^�����$݊*�%�8NJ�B����.�`\�/�};$���	nW%�,�b>�o��ӥ��J{� V!+^&�s&6�Sn��y�ë|�>6��΄R�R�r�@��R%�Be��eS�}���U��9<W5�Y�QX��f����XoҼ�n�-�~SH��Z���ߠ��I�LJ���._�%��������fn3崜Օ�u���G>7`�Z���ۺ�r�Ք^|g&�6�̳EQ�$�Tש�٤�$�iS����kN�&`��&�
%�4��7�L^N�m�)E7�)�]y.�[�Y�sX������5���#�:XB��E`ʉ{������s
	C��&K���gq�V|
�
r:�z��*��|w�w
@�)JG���ū�ۗ�������p@ X?��,��V\�b��#Z	z���uw��5י�$���Ѿ+t���@ր�hY����gI����ge]	�\e+�
�����^���ߕ����}��/@���	�{�>H�E�Epm���b������\|^dd!��v�^�u�[J����),�j�(���~�Oa�i�����ٗ/i4�U��.����]ߦo�o�S���on����\^F�QPoJ�r�٢��._����ퟔ���B��܍g`!�����b�b������
qa�h�5�du�c%��Mt
��(���s+-������n�!�!����CjhĈ���*v`��IK ���O$��ގL��M��`s��N�<�����2퓝�tO�<�FJ�	C��c�gd0qڛ�[ي��=��v�0����>�4�wT����I��%�K�4NK�Lt��	���4_�Z—��U���	��U��Ut���% %A����xc6�-�S$�Q6cR���r��t�R)LMk�B`$=�8Z��-7)�%޽�o�N�f�6�_�(�pd����{F������oާ�݂s	P�rO��˦r�<�����>�p�4�Z!���R=����ow����	ŏ8���(�B�@-!��T�
������Z�7Bz��;�g�U>'��߉}�����$l�� U�-�<�ۀb���;��YC��к���H=J��_`�q+U�<�ܝy?�� Uu�&a)̍�k@qV�)DԌ��<}��o�r>���S�����Ap��Z�?["�H�	p��;s=IF�;AU��~=��"�I`\|.�2�E����q�c�t��-u�q%!o�4�(�	c��,��V������C�/�����ǰ���Q�.�pBi�s4��_��p�� KD5�����A��:Rv��H�q�"��;�����9�e�`j�
\8p �9�mh��!5��P�ٔM�,���.�����E�j�������A�z��ou���h2a!Bo�Q����:��1��Ѿe��������g��D��y"%{&P��eS�%K�~E$/*Z�]ܷf�ݫ�@+���J����u �j�� ����x����B��M�p�F$�܃�\����~�"�j̀�l�ӿ�>g`ߋ����OT��~�O�YU	���8�a=����O1����V�6�2��&�8&�x���JK���,�v�hpI��W��p�rkz��x�Čr��!\����Z`�����pQ��P��E/�j�-� �T�ꝅ)��
�P�Eujb��
`���?�O ڲ�(A���N|�➛
��P��bNriH0�r�/1¬��u��M.H�5d�U�Y$1���wY,��D�`���kM���-
WbP�IVgU2)9U�W5�DZ�
����c���*���ăm'e(����x��Xsj�d0�ع:�e5��e��r�2���`p;�^�Ba�w��'�� ��7����z+q���m22f2�+��D�܊�|���K���n�&�9��hF��X3�;o*��k0�-��ի3���;�X%�@��=V��a��`dz~d;�����Yo�������f�����E��8S��37$`��E'!@7�9�̠�*ԑ��؏/,�.�¤�	���
�l��
*�&֡9��ۖ�
,<N��
�♻G��ݛ�4#D@�;.+D+�9���*������
J$*���q '�y5�d��7�q�cbYf'�o��Ha�6�,�o��f�ܶ�c�>9f)�VI�W��&�S�Qi_/����3�;�5d�;R�RY
�@{��$��%��~�>��N[E�*ѵ�M&�]+	N�k���"LHl���*q�q�k����y�E��UJ�_�<�k��>P�(��4�<�GW{<̈́d�֞�~�5#��6(���o?Cj���1!?�Z��n  0T��<	J禪&j���2^�ɘ��S���QO��qЕudF}T�|!5(���=����}��u�jQ���&8�B}���	UZ��ip�fv��TY������K-���~����$�ł��5��k�E�W�=�th$��$�;�Z��p؛76��	i�}2?�����o���U��D��s&�YE�C�ɷ���l�|��z���yj�=���O[��&2���p����ӁA:��j8�������o���W��&j�u`���6�G���j/���Hg�4-y�ХpѰ��
�S�ݨC���_��F�x�s2���ɳ��a�9�	0�=��_�2@���(>Cj69�"�^�1Dd�k� ��	Ǐw�z�XW�b�6uhb����,B�r���a����y��̀���O�[:91�eF��=D6mN:ϵ����q��?M�/z��Y��e?>�bK�8�O]v���N��N�2Zt1����'JO��ba⢠CC<��B�X���V0kH&%��]�=h�ĘŊ�g��V��:�;Xy���vF��?��ۛ�]�a�m#VTY��U�w2n�m���u��.džt�bb��x"`�~.6`�&X%��`k��Q%=v�TQe�-��NUG�;sI�="�%�M`���6���5����Dw��f���K(;ф,�~J�_}"��u����%�*�C�A/�k*�۸Ԩ��C�<Q	�M�+F���:b��,�C@+�["�B�8���ЋP����05��?�w�t�ư��ٽ'V2��=y�z���)K�6`����<����<Ѽ|�aЌ�Ip��	��Vy���j���c}GM~��l��l	sM���	�ۂI�;EwsQ���pR�*��
F�/1&�m˟$bt�B�`^߫}�OZ�zF�i��B1��*���ˍ�����i�F�EKoЧ�:�ag�6�$�L�ɋ��o��SV㮄�`S�h{���	4�_t��4w�u�����
�@��"t3ǐg{�^�ӪV��,�u�;�[�&ZDJ��OO�Βn���L�f����x	�l�tZ�Nj����+󃺼tҽ��Ԯ�f(�h{��xW�f>I؟!��l$�n kK	
���+�Ap��cۓ/����;Hj�V�]��$��!��1��Z|�ag;��f�
��[��$ʋ����� �/O�7���n���[����W���˗^ZE��¶5Xؔ��w�m%�B�%�ߤ+���y�"�] �ۡ=�**H�y�*���P\��|�+�IJ�x�`�������W�}1�[��k���H�hHu7%�D}�������_&�u���/]����'!!��tS6�m#B�ыh�^���eͰ��n�=��l�rw��8���8D���N ���
�Yȹ?l\��"�ұw%H�b�.���^�U&!c�)ƙI2���&#��5���j��b$'��{�͡D�!oWZ�B]/��7�΍����h޲��4울�nl�A��hmE[���~��T���%J��W�B;ٗ)<=U��˃'� #�^"D�'t
�z+E�aAu]�^��PE��s껵�f���OyF�;sA*>6��Ѹr��.L�����B��t�����s�B��\|E�|<�cO}cZHϹ�36�>snQ�rMi�L����*����g�*��6
����?PKEePQD�M�K*pip/_internal/vcs/mercurial.py�X�o�6~�_A8(,c���=�����ak�݀"
Z�-����c�;R�(���b�C"����w���"oN֪,�N�
�TUqi�)TS�dʼn���0T'�0/$�(��F�ttE�}��&�0U�i�5��9_�ů�4|4ZkUJ��DT�Җ��Qec9��Q;^��L
�ʴjQ�t�e�tj�c�晠,Sr-65ӆ�x=�̵de�3^[�d'�3˗�5����iV�ZeܘZ+}JAcEi�J�,(���i�lq^�4�ګr��i�>/gyU�\� ���gV�b���
�zw��._�X�A������.;�%j��S�̤[�
�	�[�� �����sK?7sck!s�n���f�y��V�e�z6��'����>'8/E�s��?�s2睸��מ+����5Y^�n�tc	��U�h0w��"���т��������I���woJØ�#�f��܏���~�b�?T4ÿ߭E�����:z4�1Ex�̊l��9]��{�g*n�{����t��Hm)���C�7�Z�{}uR��L/�3�.c���"�+���$��Y�)��Hn��n�x<~�4���r�`2s+�jb�{̹�B�-��AC�m'l1L���s1�V����7ׅJY��CV�Hk����F��O����0�b��>�H������5�YA%ߵh��Κ��)O�π}1�8��-y@�Hs
	�N$�n�ϛTȵ�<Y��F��<3�g�eb�����h��D\�t}���E!.�I�g��TM�3��>NZ ��'�
L�>Pw�K��t���E1���fŷ�5!�B��q�K�� �;:��媊�&=<�d|,�wl�t��=��a�y�Ts�'�-�S��,I&h��t�kJ��s����K~Usk��ĥ��XP��R��r���I����$y��u�!7�
���M��@`�O�8;�1K���d�Z4�lK��ԉ��˪k�Y���전tFC�v�*wԄ~��.�A���y�n��۲�Ȣ�Iݔe��Cl����c��5'�b�ˡiP��4����'!�tDgK�:���&��'
��p\��mR�Z�Q�B��[Qa(.*iO�dx��E��[s�L��m���V`�u��ܿ�ڱE荜;�IV0��PLHPIdS�8�
��I��#&�I͐�O�9���:xΗ��ſ��S��y�[�w�����*�R�z��k�%I�L�"?|?�e�e�iw:
��r��
�Fw�wH�*�H�r��˘|��3�	T��h��T��emR�…��џ��D�4��#��
Đ\�	�
���x�6�W�'�7ͼ�g�0���xd��YZﱒ�Д����=-=��ڊU �*�;�	�؀+w+�� 8r���rҀ�xh�nF�2I��A��w��u��~����(u��{R��t%̫8r'LSC�յ
3�t���ө����C��g0~��ӗB7�q���x�$�f�|�NQ���l�㻲���ɖ+�f������9T�Jxz�M��Ȝk���o�#ú�x�3���A5�-X�V%G�:��ai�?�Ju2m�|�JW��:�>9&�{9�����F�d:�PKEePQ����
o0pip/_internal/vcs/subversion.py�Z{�ܶ�?{C��+��y�s�vc4qR��48_e���UO����-�~��I�z��mR�@��ș��7O�]�[�I�o�l��<MEV1���$b7��"�7"b�T�"��}��
�U]
r��]�[�(�I���"�Eb)/��D��dY�)�&X�yY1~#�D��'=���dsi~��V~҈2�_Wq"}�������%i,C3ߝ0��m	���S�e�*�jV�F�weZ�B��uq�Z�/�D���t��g/뛢�C!�"�"���Y�(���w���K��ׯ����ݻ��4�rJ#J�l�*�Ĭ�I��R�S3'�@n��.M��L�R�н�q"\/�ܫ�]?�O�.�f0�tp3qU �=,�YK�l����}x�t{W��W:�a�����?�_�
��QՂΎ����El9��.�N���|���e������&����ڷf�)���L�{�Q��1N�(D	����D�-��A���u&d�P�h�n�R�R����4c~3X�"�p��m^Wꕄ�THx��)�z ��\WUa�����"�?�����y��K�E(�`Q�b߹a"�����ދ��Q�.�Zhʲ�U�H�ʂ.��É��cH�ʙ�r�\��P+�Kp<.����Q��>7�wqZ�̬�]2�l	�����l�)kȎ=f�@V����$�)�<Lj�Պ�کf|��f�@�L��cD.�-OnݑݑW]2ؼo��Xp}w�F��Z\ӫ�K4�8���U��>2)�Fk���$�L�֤O�W�ε$�:� �����w;���¡��m-��َ��1�Ҭw����R��?fo��������2�j�&����8:�
��C�����I_Xe
����
{���	-�F^�6ﺺL�&�:O�������Z���P��c�$y$B
v�(j3y,�:D,�����U��7{3�36�ҁ̊re�:G�~q��\ǒ<�2��$K�v�C�,S:!V嘶 �p������lVK��d�G���ˈ�*hEY	���b��o�Q��(���x���)�<ϐgN���(:�GEG	�&sv+D1���vD��K�ľ6ґ�z���Ng�?��O/;���6� ���s�Ү�J��^�T�
��M~�O��&�_[��y��h�_B.�r{t��Y���[���i�q�x@e��r@�����l���Q������P	�<��K�!�Hv(�S���q�)3��~O��c��]���s>���%'f�Z�c�Q-Z��,*.0�hʙ6K�m:f?��c�9�
�@o�}6�1Y���昽��%�+۵(U��y]�J-�^�����Mɋ�$�V��E���aX\S�Ɂa~���8��H�q��B�OFH5Cy��f��0�ڮ!���,�V�p��A��AV4�}o�|�M���]s�e2�h�,�`�є��A�M���������B^?B
UL����v3X���<w���^Qƃ
�#k���d.&P��G� �ƆY�w4��9��o0�
�]���Ռ�Z�i]�U	�u��i�Fw�0�\Ն�P��버��z'�}"���m���e���=Y-�����/��$�%[�${�� ��Lj�,E"����6����`'�S��Z7k��6"~'#�gb����Nt:w<�KJ��μg_8�d>�Z�覼���S��ę��W4p�u>f���G���.&#��D@�C�$�Ƃa'#�,y�ͨx�Znt��YUj(-:8��c/�3J�p�5jDw{V0o���_ݥI?�C
"{�'_
^�k:�Ѣ��
�S�*��xR���q��QB��T�J�͂���C�O�Wo����n_�J�$��*�pO<��E.c�V����o�,UZNQ�V_�'�
&��0T���U�s�����@��M�'�B;( 	�JAZ&еp� �z7"䐥�OX�`��	���]��W��ˤ�ֿ�#�~`�X-dBU9��k~��;
=5$V���y4&X#E�+��iQ��tL��������pT�� �=�HDU��ırC��O9� �^���
���l�����/�]
�c�Tco0�5��}
����t���b9�u��
o��6��)PF��S��^�-�����;`\j�|�
�����'�Q0�:W�Sj�v�/�-�I���NU<�+��㱋r-��{1|�:0
\)�%U
�}��h������q,���-�^�֛t��:�
�(�?\��X�R�$�
�2�r(xU�*@C0h���a]bbhQ����'0�^�֛�����	����`��)
��dgr';ѡ��kp1;Va-�u��s!M���]}POۈ��ܞQS���hi�|߿��>�ԑ��7��Z�����`Ơa�$�6r�Rp�b{��n�So����~Ck��`/�֨�!=7���4�
�'�K�>}r=8帻@1Aw�9u��|���őo	��\0H!tA�`o��b �]�7ю��;�⾌ewA����'�����������יʰJ�`{#n��cv:?y6e'g����3�Q��I��l�`9�x������ܟ��?9C���NO�s�������O�|q�lq���Z�3Hh��*���ԟ�>$���\��?�}���-����X��8,s�/�l:ʷ�������;�29���C�5�T�k����D��n+�r��q�\�kQj��_W����\�R���D3	k�v���C��uf.0e�oy�tRق��4�t!o`3�f�ۤ���C]~������V�=�otWo�cT+�@���`e��"29!�2�䍫 鰳���4��#�1b�^:�8�ُE��L�|���$����$����%'�R�N^K8}W��ۛ��D�jTB����J�7��}Yf�	�4q�{IS/I���8��v�wؠ��ح1�BQ]LQb���4f�U��۰R-a*�,�_���P�rX�RyQu>g2�zW�f���B�#���猙�z��>T��׽���:]�)�_0G-�lhU�WRAG�z{�7�/�Mb6��lf'�Jf4��.�@��Ss���Y�^�	�!P�c	O��~��nv,^'�(�1V��r�
Ş�}��|�0��"R������3^Ztdō�����} �F��:�b��m�[!ه�ށ��,d?�GA�7�i-+u�� 6Q�E�����d6%^������n)�!1U��u\�^�#������*�B��\P�ޯEF�+����_D����N�Dj4
�4�[����븐��(b�TiC��\�ㅵ"e�h��䥠%
c�+�R�c��Jܝى�@�

�.��n�|�y~'�Xh̸'Sv>��!lZt��f�݀�U�
]z����׽S�c�a�
n�5QT�r��]F�F����p��g*��'1]���g����5р�q���*�	�Q"�Ke[�{����\�)�++�h��t�_�n�|V�a֚?� R�~ ��_g�*�/*��������3�g�[Iqc�n��R8�)­�����2�Tt�m]�F��t�s��i{@c!����3�\]{����8�t��V�,A&�誥�G� ��q�~���ӥ�>;�/��`c��%���x�'[�v{X ��g�t_���y�Zy���'����y��eD�/9`�5�wO��ԣ$��Z��bp��I-*�_P���Q���	~�\���N�ћ�PKEePQ�&��)ne#pip/_internal/vcs/versioncontrol.py�=ks�6��+p����̦�3;㩻�:i���4Ӥ���zhJ�,l(R%H;�L��=�HPvҴ�i,�x��98@����ϫ��Z�e)~9-��hUWbUWmS�s��ݮn���㣣uSoE����kd�	��W"_��Z���#�\6MU�e}}��k�����t�*�_�r��+���63��.�ndUԍ�z��:k�����Z�Z�K����iה�Z���FK�k��3��Ϣ�V6U^���J�Z���}�#����y����E�[@b�M�7M������/�<��&A�tUowyk�Ve�֙n���V�U)���&3|#��[�W��r���n2�N�V�b���m��
eW(�+�=5�'U�p���N��f�6Rā:�g]7ۼ�V��,o�
L�����'����um&Qy#�r0�������z��������˗/^~7�P�/�Z���L�6r̦֑�Ny�8^8+�?�Ԫ]�0O�,������?�T�#�k^.��~��v�!~��w���
�,��'Y�o�=�����b��UQ�
�8�gLR#8�ޏ��7]�yQ�kq��^�5\�_�%��ˣ��,Yt&.f7+=�g�����A
�=K���ɲ94+�Z(��H��1��-OEB�� �å]����bY�%5C-���+�6�@�v#S�o�(�[P.������a�
���L#��˺��=���ۼM�=��+@Ŧmw������ ��R<��1ǝ�AI�M�k�xS|I#w5�3��B�#W-!s��4�B9D"+����|�P��'�����C{�A�^��X��ROhV���̷�݈�ڋJ�B�b׀}'�^��Z�����_��t�ԫ|'��}Kt�*��3�/80K)�p$�K��sC�_�����?<���������䘆h�3˯����������Ϗ|N�N�!V�#�ܲ�Ym���1�	j#��P_r�ۂ���0��]�䙬nTSW�͍�b�Uu�w��f��U]H=9�U���LP�:�,��
J�#
��ѐ��4%N���?c�K
e�5(#P����pxy#{��+�CXレ�E�>���O�x&�yW�2n7j�[���rqiY<\�)���B�Sal�ƹEU��&g>�܋&WZ��P��Y�(��#�a����3l������(���iOD�����I��yt�4hR�԰8]�}2W`�y W7i�+�V&A����	7C�o��K)n�VHm�*θv��Է����yl��V�"�%@I^@���8X���U����#���߷�^��!^Bh���M�G_�/
�G<)g��m<�Ay��
xh�۠F���g����0���f���UYki��~�xn�{�٩?�@ZBxG\�j@"As���1���F�6���
|#@�A�:^������jI��M=md�$���A��
P�T�<䑣\�@[��%_������3v��Q�c���C̘�a��x��F��J�I�(_U�g	����?i�P�7��F
"���?�W3#���� t���@m��P ���[v�Wh�	)Kos�0�
LF�?��|�X�<�/�M^p��M�	���=�g�H eL�zN����s:$FD5�t�Ă��A �̷Zlr��g-�DhÖ�h�� �y�^�����k@ǡo,~$i�3�`�oY��_ ���q��[`���ـS�����`�am�!(��.hf�,A}{��`h���
�n��-�}}���^w`��2��zͭ�8\]���i��H�R��K^�l���VU��kc3���S�9��.��2#W���6)��Y�6���6�:���-�E�����h�t��˽�2oVT�ݎ������[w�,(W�0����HL�Hz܃vE-���uE
��u@�U^���o���@���B��Cг�Qי��d��<#�<�Ob��gv��|���u;95p���PXd_��?�����1{	2��b��N��z(0�v�ak��s�����Mm"F���ʂ�`�Ĭ���	H�l��r=�ϻj�J��X��<�l�WG}�hR�I�S���Q�u5,퀟�oTA�W@2
|�A�˺���B�t��v���p��G�(4
��y��@�0o�Q���ɕZ���J��HqFv����}6:0"���y6�^�<nʋ����[��]"�I��@�p	�CGa�A���,�T"s̢e�vԺYe4��bv����s
��#���5~��͛j?
�羷8r���?~���	�����9,��%ό�Fh�qk�IJPSؑ�:R�`��;�;Kñ����-
޺a#��¿�c�xg��
�
p����L�c/�����/H�1��~儌\d����|���|�S��3�3N�Sp
v:�{���ax��Zɢ/J���*8푙����C:��OAA�A��t��<3h�G�f,'��/7olF�$Z�]��-�(47cd����¬�2��b,1��<�"�=45�@�gC^�D	=��&��嬝zx�a��c�>�]�[zG��l�Gt%�9e�1Yd�Ԫk�P+c0bi=�\��8c��0Ԕ�U���a+g��T�ʑ�F&�;v6a@ag�Y�׼��l/N�]����Ê}��I٘�2��I���!�UK����
��k޴�7��2b<�U`�Nو-�F=D��)y�q{�7��8i���Ď���8��[-x>�G�4N̈́so�O��L|��5��B�9��(j�1�xX�`�&�F����k޶M�O
x
��
�i`m����z⸀u�<�i1����>vs2�>����#N܀��Pߴ)1�C���7$��)/�1)51�	V�3}l�|�'�g�`�x9id�����	�g{���5Ȃ򈖫�G��Uz֣1�j��Ա�Ĝ�����5I
�‚x�
�c���9����>�C�>�!R�u����ƶDT�|yk���݅�z�Y�R'�����̬�3ۙ�^���U{{���!�4���C�)d9\�ǁ����wa	��'w�`�]�)��8g���
.)�8U+�����-M��S�OԒ�V7�rA|�������<yo���U���p�Ig~r��¤X�<F&�����OU�<�s�$��儩��L���hLo��w;�1�]�^��>J��+�C��~��M]ki�v���J6'�Z���k>�h����Y��Q���T��R����p�z[���R�����n9oh�
��K��`�Vْ,I�2����00�ZV��4X�[��cz����g�m�.�o���H���v@�*����@d��@��zE<b�Y��C�:V`�j�C�I`P�LY߂�{!a1���0��0ċMX��L:��^��	�G��A�4��`P�{����^t�|(�\ڎ��(J���L�«�0�S�A�ɛ�<f@�����&u���!�1� /r���S��VB�R�|�z(ˋ��ðd��ػ�+||����	6��j'���-/�
��a���h3m��(�B[E����d1��ŴK�\�B�ߴc�d���i�{轮�L���X���r~}"ew����"�t�î&��ۭ�~�7�&:E��t�$
�C�찼��LRs~i}�T4������ːh{@�v���2���X�̃(�'�P��eϊ��*�p[b� &�U�C���=x2��1e�}�78[A*O�0��"&�ڪ2o,�벤���#oV!�{.1�퇧�-�LY�؇	�s�%b��Vx���)k��Z�������30t��y՜V-�6s?{jD�_TD��c��4ظ=W�ޯ����O��T5����?�j���8
~@�$���:t����m��!���p�⼯�vƸ�eݾ؂���Hނu���Y��IYa�HݵƱ$z�ܩ���~�<�AQ�B��������Zx�4S��A�]�pX��{T�/�L�a��w��s���~$H�@/�\3�ab3�~X*���?��Cor��1��B,^Z�������wj��^�|+�Un��h��)>0m�F{��
�q��Sg2�����х�	i�8~�Xx=>y��`ԫC��
��L�=S��4J/a�\�Or��#��ݑׇEv��^����r(U����A�A�0�S+���l!=��ONm��U�U��]�ZzEJ~��C���c8�kM������(ӄ��&U�+b>\���][���-�q5P`U�5H�j&J�P9�إZ�
#��b;M"�?��M���<C�R}�}����Sy+���hC�����8���8����hsn��,49e�zs�����8��X~���'��c11��
Ky�T1�~^/FQ����YfCܡ�AK�+d(����[�;��I��QX��ksL�虙~�X$���X7
���Ӱ''�,Α JON0�p[7�U��h���ؔ%o��zc�h��-&6)t��=Ҝ}�N��;ݭ���L�Fl;M��{u����e�XvH�*�.`>?�۞l����!薓���)O�`O:~��I��i�X�b�k�F1�N�}.�����ӿ��N6���}f0�tS��H(.�Yk-f�f�vKQ�F��������u��b�h��%r��C71Vc���Hd<���׏�1i�U]~}���W���E�+e��M��XB��I��<�a��nG�&};��Y�l���Xi��1
��/li@�B<�_<qld��t�v\ifö��hw?R��=�!���GLx�����]ж߈��d��Σ�cr��C� �S��r�k��!L��~:�����q*
d����C^�CM�T7�*
>5���⚦>~�����U��䠰�f��D��C�pP Q8���c��P�]�>z>��+�z	�g�V���&��m��ǵ��
<HV���ƒ��tr)��Q�Y5Tι���?m��9��`�$�����\5��!W��¨�C��]=N���{
g����ˉ��]|u3|��ћ�]4���j��]Z����+F��Q�"�Q|豨�&#q��<$��R��G���J�����=�q�#�Ҡ��{�U�v5 �̱�z��	�5���L���9(�����%�o���yc�Z�^����OON�󨢽�y���;�Qժ����=���P�l$�8�j��I�d�gZ����{1�Z�X�W�b@�#ٿ;����[�ҷ�d���E�9צ&�5��o����g���@W��;7*��x�m=8P`�r�0EIuw����G��4��|_]�WW�_\�������������s �C��4�{y�'��'tH
�Pdr6�guu����'����8=��"��vy�j�qwp#p|���쪫bX�n�����6ؕ����kɛ�݀t��|�i�h�9	�ž�j+ә�B��R��m~-]IĖ`Q�CE�d�Q��0�pzL\B���\yá��B���&����s�lBW��?��9g�ǫl��;�$hR��BI�w�*������^ð���?�Ӻ���7(��F���T��Ps�b����CDO�D!�9c*�R�hJ���m��x��v�
o�g��|"ʏ���e�A&��x"\��@�t=�kS�T��(�n�1i��E��ƚ�G6�#K-����[E7'��\�r�	J夭OH��ƣ��w��p�*� ��()h�q�ޅ�P/É�~v���d��9�]��9:�
&�s�7�%�9](&�*�ѝk
���N~~fL�;1��?5n)����i2�υ�o]3w���5��[�|���N�����Һ���'��$���v
��$���B��C�-��E}�}�:��	�l���Ds��K5��?)v�EQ�M��'���?]�������9��,�
����69yr���� s�R�
���|�M���\�!���8f�uK���(w��ߡ����!������o}�kn�6Z�l��c�xV�b��K�=ZjP�~���It�8#�-�����2����oT�Q�c��F�j�)��ضB��w�=8/%(����q���FJ	���>I���+��YU���<��O�~�z��?>�D0�\��3W����{�Nߣ^QLE�yA�O�F�0qb�9[F�vrSB��Yx�j����ޝ8�Sk8�R�τ�A��%��%,�S~�e5]e�tj��~|�}���>w���7�K���I�s�~�>t��v����ܰ�������F�
赇v�
ާ׈��o�S*�
�(���t�67b��
~��Gm��� p�
�Q�Vo�-O���/��/�3:�j�'k�{���E>!7�>���b�5ڀ-Ÿ�
rx�可Ya��{������|���j��A��U�n/*S���d�"ґﵤ�
�T�^ē���p�0L���'�$��.޲<�޲
��z��c�<���0�>�������y��z���/���}�x��k�C����>�l��Z��O�+����\s4�E���8��{�K:yD%8�S�p�1c����B����𲴇z�l*��z��9�矂��[��n4Ν�����]�8�1^|�;�K���ͭ%��HS	�wUs#���\Yg�K5k[x�W�N�*��[�).]J[nXH���\�-����laL�.v+��]�-Ӱ�	�T<b�"�%]���d�9�t�k=�#8���ЖFF_ _��ofu:i��E.�d��5��k���?�PKEePQ�6R���pip/_vendor/__init__.py�WM��6��W�C�����rh�4@�C�"� hil�K�,I��
����e;�Ѣ>�Z��p�͛G9���*[�w���	��
�ғ�֢&���U��0+c���`DGT�YZΒ�0�����r��E��UQT�UMC��dߘ^�bI�2�Q-T�A.5	������vYok`�t��y7�r�����l�,Gyq�,W}��%bZゐKot�L�Y6���Y�_X�ݣ�,��fӥrT���}0΋M��F4�۲�j��L�Qʐ�D��T^�I������Fi�g�^��!��kP���(#�*�{v/��%�{u�!�T:��#��͛������Z�o�qyo�Hw%{Bs�~��j�B��H)P 2G�M��*�6!���4�!U>��^�Zu3.�2B�UCF!Pk��|עnkI8 'a���m������kZ*�E��%�L"E�}�|!�k`�H9�X�CC���t�R���^N.��������@q`Lv����u��x��r>�"�h�P���hrCڢ�+���i�nq&iN@��ԽN�0�(@c&(��K�)/"љ�98�0^�����A�R�Q��uy�V��Ee�K�v�gG*�{�蟞|����//L�j<v�2��2��n��5��~�����K^�V��;e��Y�
n���Ƶ,Yġgs�l���ү�Σ3�Wd�x�o�3n�"�B�*0A�00��*�
'�Bo�����~."i�C��AT'UGBo`�J)�У�[����~0l��<��BD{#}�(�}`W/�~^�X5�[����jU��C�J�8�����n;ޏ 1�6h���V[�W��O��ʟ�j��ӌg%�!'{�y��~<"�'��ps��O���/0���w�<������|(��F�(�R��CG��|����U2�FE	`�MG��2�h(����1�1M��A�Y�Y�y��;�f��NF���
�?�.�kX�X�:�<�)��%��d���ԻEB�\�[�*fO��`Hܱ��h���5�C��=��oAfg<��k�<ҾȠE��p!~��Xv/{	E����Na0�=�P;��z�$DG@����+f�C�FA�ۨn6���|b>���F��묓�u��(�$o�Kk!�>��^ɪ!��ѧ��Z��u�q������>�N�O����8����rZ}uΞ_&άa��贾q��~ ܑ@w�N̬�n%�����7,��
�ҙFX�W�^�.߮KG}��Tg�Yc�t�n�s���7�Q�a�*:�Љŀ��,J�KS��)�n�^���d͙��#��t���}�a���2輟�;���(��i���a��t���?��ZU�9�8�!���u�򏝲A�|Y�?Q�||i���_05����DB3�Z�a�M�v&yxNM�j
q�qC=��4�=��"
�T'f�T��Z�K�T7<�q�F����=����x�;%Wܬ���PKEePQ�_�b3epip/_vendor/appdirs.py�\�V�Ȓ����kv�m����DŽ���p&6&��	9Yn�
�ګ�Ϟ��o���U��R�,��0�,���VwUu}��Z���ڙLڽ0n�M��H�+�l}m�����������@L�I8��4�������
����~�YG�k?��8��9���ߟ�3�&��HVVj�ڻ4��4�
D�<��8�A�O&Q�i(�u9�A8�魬t8g�Gi:�i��a:�z^ �mK�6L�{��F��q�e�ry���������\={�9<a"f�#I���@����g�0RC��e6��$��a�	* A�|�gQ�rr�������y��ɿoonl={������G�[��[ۛ���n(I���v؇èϯx$&<�P1\�A6�qJJjÔ�·���>I3?j�8{	w�2��v���7J�1�p�C��~��k79'�����/�A�y���TL<��=_rP*�����e���t�W<� R��vYm�{�=�Y���@Х4��4�8mH>ą4I���1�Hy�!mԼZ�����Q�LN��(���ٯ�@~�lf7>��]�
��쬀Y���ǧ	]�yX
1�@
I*������_o�i��G�	ٍ�1�ʧ�����	Psf�C�=�F\K�VYMc�j���S��S�,��$�X֯�x{�Nx4�8�&o<k>=0>�4%�i��8�A�:Y|�/�;^t�tVY��)Fp:
%Q-¹[5_cv�s?j�^6��)3KӃp!�&~����.y�<�8q���11��c��"�
�c*-*k�Y��S&e��ҥ=}�Da���)�ÏqZW΁%�������Q�Ee��4�I8�5!��~�e�%F��O���'���;�\(�L�'兀'ݔ7�N�6PkO�(j?}����R�dH���6���Z�y��\ׅ�n@��5��0
��#��u��o��!sw_��I�JY�-O�$f����F��r�;�W`I�%DZ�?d|c����	ɐ
����;0%����h7��H�H*!)y�s8���X��$�cuжm�E���zv?D�����	(��+e��	|�wH��a&��:���S�
���fI��KT�֓�~8�Kn�K��P8D�{aj�^����LLP<?2FW���L��q�J1��� 8p�rG�!̦p�~C��*>�!%hdB(� =���1�b�������G����C�Zd�j4�tj��g��y����D�h�������3�4<-��X��	q?n1
	�֛,�[�Sv�d��7��������h{�<�?�#�ƖDW�+��<��%r�&4�П$�0�R�Q�yB��\��i�)""1�w�9D��8�%�Dx����O�� x��ɣ�5�w�͍&A�=�%~tV��B)3.u~СcImԄ���NN��W�߿گ�<�EP��y����	}33H�6,$���J����)W5��@������M��b�E�Ж#��9B9�7@n�����7G�|+�ܕ��z`
d�-�Dv;�2*,�+��x�:C޻�~J�@)�)��]���ey���W���SV��w�UE�$݊%ͥ�V��C�H�$�޴�5g�"qM��#qԒ�O���RK���yF�����p���+4C�P9��Z�W�X3w攳]����P\w�<K�t�_w���p5t_���Ӄ��BN�J�.+*����!O� o��DM�`�����~B��V����~�@O�0i:����D��F1�{g�J܂f��ũ�~�z���^`1	���F�q�z�J֒�֖�ݒ����4h��?����(�G�5�aʿ+�Q3�����#��Œ�&~�`��Z��zkP%]AG!l�a]�\]�`�ˢP�L�H&G��bͽ����g�
`��� c�g���Vқ!�B��S+���[�zT&K5	`�`1���.�Y+��|�qit��{	�)B��>�:���~��Z��K?���a��,C�$�|���>x:uy�zkV:FD�k:B?�T]j��0�ݯ��jX]'`�S��S���T,��I5�����؍4
b5���ۓ㓟vء ��3B�disE�hI���/�8%����߲`MC���7oNOr���-��?���V�l�c\ǴRR��H�<��!��B�YJ�Ο�^�Z�ǙT
p�^$��'�mp&��]��B�7^�8cҀk���NnpMC�aB!A��29�/͟��%��Khs�h�MaFWl�iŖ4��"��5lhr���j����s`������
�z+�܈VL ��> �C+����Vt�R�֌��W�{&�L�ܔ�ߝ������w��*�W���MK�[��%��m��5�m���d�O3%����N1Y�f-j~3L��[�mOO��O�!�"+j4CܖR�\�p拏�U��7�no�
�/��-��z�P����V���t�s��O��Mh��L��%���v��lj�s4P�U���Ͷ%���5C����+?ƕ��2�ʂ�XЯ�X[��e���~�����!�$L�<��QU����۪�R]��c(��p��$�6�ٷ��αբ�w��'O����lϢ�G�B����?�����<twܩ��μ$$~g8&&a��p7y���|�cp�c:��K�o�Q:�T�R��a[;���������L�إљm��z6�]
x�#����J�rȈ^g���U��ӹۏ��c$t%��;�4�������.2�$�`��3=h��T�КN=��R�P����o�7��pW�.O6Վ�x]�0���3
��kda�v^~s�#�)H��,X�B'Yj\�J1��陵�/Y#)��
��K�0��<��i�)<ϻx#~�ȿx	��ĥ��x�?U�'�c~��&<)��MoC����dG��,�*�d9���M���c��B,i8��?���t�fOfݛ�6t|��MAy��Vˆ
w�)n�b;�K�=���_m�Hw��#L>�>�
�G<��i(60���,���gk����d�ǖ��~��Y	~H	����.�O���#iKR�w!���kޛ�
�ލx���hA�n
R�o��8\�#��|J<���>���9(����yF�u����gqc9=��޷g�wv�Ϗ�:��	'��Bp��DHXm�n�/C�OW�j�����tt��D�JkP
��7)׏��?B-�e~�3"����s�be�>S�+���R�Rqy�
5`�P����QſZ;���i-�0�Q��4�mZc�P��e�n:>��uC���sk##U�3�����I������Wl�)j�-׎k�;ev�q�h��5�޺�g�^t��{f�攔>��0���I�l�Zo�d9~])'�Q�̖��Es*����Å��)�0�3[7s-l?�:��V�z̽���4̙94�|�t2:�5��-CF]�����M<�?:U�0�
�Q�Q8с��x�8�JЃ���Kh,��eY�+M�݆�� ���`����r�y�������r��\�[��;�����^6;�ql�rqj�[����?qÓt�k�u|�o-G�iv�������X>�k/�hc�kkΓ׽a�Z��1_U������\~�a��K��P�[���-h;O�����R]W��X��ۻ@8w�	g��D��|�`s�ZY]�?fޛ��Bd�
j�]:���}�݄q�8m2�G�r�����S��yj��ͱ�?!:�����m�Y±��7�邥[�a�'������@$��0�k]��Sm�Ƞ`r�/���=��إꪏ3�@4��W9�Qd�+�[+�m;���v�USz���������"����X�G�uɧ��V�:��O�g.�������o�Nλ�:Go��y/����И�� ���/�.�n&�Hxr�AM���)�저	xu��ܒ��3�LA<}t��[��vP
�+}qsw2%:�t�,]��#���%�lH���x�"~�:�~�Z��o��i
1�O����PR��s�kzqݥn+���	E�x�ㆥą�}�I�zt��S��Ԟ?�;�����F\�4	��7�L������5�[�hi��Cq����9��6�h��0`#���Q8�”#?)�;����{�Pz>�_�2/�ˁ�u�x�0�G����Ƴg{E�b��.R�"��� �E��3��"��kS����dzG�e����K�i�zg�K��i>%�6�[�$���to.{`�����pe
{��7��c�{�$"�e��k�;e���|�rA`��٘�+T���1�}F��֓���[S�֏s�_/�J8/kB�מ^7�Vwsc�ұ�m�x
��r�o����HӠ��t��Q3?b�h)�;e�GʭQRD��v[�[A�r�q	h��5��<�Ő��Z�H��Pn��Wl�ϧ.�ϱ?��$��k�,TT�׫��̙k�X�����ve�;7I��:{�ޛ�ݳ��Wl�mY�Mx�s(ʍzPo��\�Iu�C�t�O��!3�M��)pfzt�\*rj�=i�<�zvd�d��*��G��Rѡ*FfL�*i�f�ܢ^�ب��(���KD�n}�Sq����&�м���D�-���Q��3����VO���kІ�@F�9��ٕ����vS�v./�ݞv[U����I3u|�Mz���(&�h���~D<�±�:X2���E}��F��UKP���GO�I�nԿ�s��~5<q#Z��H��YsO�>=�D�dz,ы��8���J�m����{8�A5�<b����fH�k0I�+�y�v�ѓ�=����z����w���������O:EI�a��w�>�ݷ��l�,��Q'��B$Zo.pQ���
�0��e�k|�(��^q�M����.n4O:S_�
�cOZ���R����CPw�c��������La+[3���[��@'ה���"�B���Lk�nH���sݴ��/�
��˺I3s�i�V_�k�u�K�k�C:E�gA�l}��~�_�?tCŜ9��)�f-/��7s��c���m�Y脨rz�
Uom �?���l�6 �Mj6]�/�����e�+�ͅ�E���8K\Z@��F�|]��PKEePQ�|�Bpip/_vendor/contextlib2.py�;ks�8��+P�K>E��ٛW��qf\������U�\\��,�)�K��UW�߷�� ����R��I��/���4�e��B�_�gl�fw����2g�ܦe�w���d͖�n=�ɼ-�t:�L�w�t�ٟ���}Z���U�M-w�(x�Y*f�-�o7m�5R�ݾN+5�$IZI�ް��]Z����.�4+���g��Y0]NX�oz�VM�fͥ~���,2/��L�i#	�Ճh�6��hm�sQ)�jr�6���kڭڪ��Rӛ�d���G���*m�Z�98��	4H�3a��gY��xw9d���
X��r#����ao߰�ْ�Z��	�O`=0����c/�M:?�'K6��)�Œ��I��B6*IN��|�E�TV�J�L�?��˧I�7,1��]-�K\h�� �_2Q��玱5oں��j�V/��nd�����U��S��nwp�;w䤃l��'�R"SVI���]���V��P�?BzN�oCQS:D�|�*������W
�h�Z�ۆ_յ��-M[|���Xn���"��x�k+2����i.2����&�(K�_��l�w�>��V�k�޹��>ż�V���L��
_��i#�N%h�^�Pa��"���`Ɣ�3�GO�:I��E�,���1�;��;k+Y2ZV��dݖ��9sI�#:q�>�gT9��f�����u(i׿�Ӣ������pLP���y�ݰT��<g{�lA��,�� K��a��5��Jy�f�Z���K�@l����fvj�DNh�����-H3@	4+h߰jU��N�|����t�'=�G���0���;_��֊�wڀ��낫��������
�jGZY�
��m��F�R���g������́\�^	��a�dН�Ľ���)�i͛���j�;EO����_�"׷h,�/��$T�=*-h�3P���!�w�%���B
@b��mo���d�"�t	��@�30O��>����v����;4��Hai�k�"UA�v�m]���D
�Xq���k_��V�c>�����=��$#jׇ�%�JW8j�³���Q�Z�r�9�\��R��Z�i����;o�d�-i�����(�'eU-��,�̭Vtt"cX���6*�r6{��?_�H�r�D�V���md3
�+�{��g����Ի�@Л���-���ӻ��X���+x����b�:������e��篼�@�Ȫ�È�a�E�JDr�4��D�-/!�:F
-�`�^E?q������5	��Ogg��૶�d{+ۦ���J�����Q��(38�Bǹ><&߅��C�#���4 ��] !��!����(��uӖ��a�
�j��\rU�4pK�=�qM�� /���~�A�+�M�d��({���Gu1�ں��l}�@ϸ�|��8^R:e���,T4BF%����[��x�4�?�[���|W����t�_���+�˚w��IVsW��7O!��~��z�`�-Қ{V��ٖQh�8t���`[��=p:17�ȍX<!x�$��ۋ٩�I��6��nЄ��~
s���r���֚��5� x�OC���Z��G�i�V�f�^�h�#=���1��^��d(8�n���B�<՛��\G�噽g�Б��cIL��a��O��`�tԒ�~v
�Q#fL��q�[���m-������M�qA_L�.���|��_M�(�pږ�"�S&�5�(�$�alH�Є�����2p�=U���8�
�Т�S��e6�3�ح9�W[���t\�0G�*���$�x���KD͟i�!r�dQv�l$����)\����
(���������2#�"OU��]�UDfmo�������g��ǟ}!nɯ�}�\�����oן>&��^\������>dh�S�����	�Hd;$GY��vbI�OAENI���#���X��$B:#���u����z�b��E�6�m����3��m�y��)��zz�@n"n˴�h�JoIO�CC�mă�kv���ڥ
8�5o���2�� ���L�D��#̮��lH��茥',8��_�wzD_��*�����Kb ���v��)����.O��鏒;�8#>
!KK��Q~�Z�ZWow.K��Dp�|#J����
��]�A����*�G�N��QF�'��_�ۈ��������t#�CbJ{Tv'��"�u��f���TҖ���$���Ʋ�^�7�vi�.5��^�΀�
Y�H�^�j`�p'�`�R	�p�J
���ٝQ�K	��JSCr�G�֝��+Y�2/�w�0\�9*�
l���C�Jt�"^�J���@�M��n;7��2?���Sk��찶Ո/�M���DiשmN=D����%�'
�7�I�
�tx���\�@W�-�I�(z9�
:���$p��H;:6%v����	<�m��5[]�n:Ç�_Y��>RO�1&K�kp`����A�'���|щ>���#U�늨<��'
������_�E���&\��{u��U����@����.qh$b���u��"0�v1pξ
�J	�� �'�f�<4'Kv�?�?�Xm��t\%�g��45��Ai��o�X=i��]z��
�G��.,0Sچ�,�<�<�O�0I��	��J��<k��ad�J�7a��x��b����`����ͼ��|�?��l˜҇XxR�j���|�n���3v���>l��h�k���DMZws	�C]����zv�{Ҋ�{��aR�'L;ɍ劉;c�Ow'���3=�naIV�
%�:��w�F�f`�.,m�6u�=�9�2�NeM*f�.)�5Q#�� �}�����t�U���!lio!0��O�[��)�j`ea)�:5�ŎxB���R��Ce�to��%h+�ݕ1ub�hc�q�Z�@,�a�)��(CCWAzp�C�5d��t�U���ؘ�2w�#�+��ױ�y���|��^�7�F�l���E�Qs�����i���-RkNg�a��$�M^�9��M��λ;�1Ib��R���2@Ի:�^w��Ms��t��N�K��#�@\Z�%�ѰS�Ai���t����+{�}��A�����=MIo�.�M�l��p�� :;ъ%Ԓ�4���ً�ŃNg���h^���e�p�3і�B����-A%��J�H�k��_����3T$��#`�&����{�ᠾ��A$��(��^"���kT���ꪎ���)�"�΍lk���M[D%�*ó�bC���'Y�`�U�!D�SQ}��r&�g��lZt�'z�3�@�:,�Uz���i���y�b�q�%eँ�3f\���Y�n� F[R��<ԃ�5w����h��u(Xo��R�����bp��3�
Ӯ��a�z���T�G�n���D����(�5���g�W��]�P���5dZ���Є
bZF�����Cr���"�u/��=XC���#,�z����X7p"o,E!����a����Be�R:�(�g����L��?���,ɡLw"3��.PiJ!���/ux��e��7R��BUw:%�&*	�_{þӻ����͠�r(�ł��x�p�V7�a����a{�@�1�q
`%'Kp�~b7螗ԝi0i�%<͜E�����Lm)=�v�6��;�����w�����LS}����<�Ӓ�º���T6�t�����"��z�?�u0܂��(y*��r�x.�ji��`�<-���I�3�H/���-Ȋם��{���Ii�t,�֝�z~:l�=�-��Z��- �YARȣf��[H�<X����jL�C*&i�ڮl�#�u�	3��_�R���˶]�y�x�C���{
�Jq��icm�4B?Fcn%E�t"���t���idž����-|�TV���Ƃ��+h��J���yJH�!l[sp��;4jT��l�~$� [[��y/�xhI2ؼqV�uqP7�	�F���>r��@�gi�7Vs����ǶD�� �{�{������L3=jgu�!��FXt�m0�5i��^�E�c�ݝ�ܵGV����s�f�k�-I�-YP\�����CR䌲���F��%A�4o�[i��ײ�8�%F�,H;�4��r��p�u9���B�VK=��m�E�`�qt<n�"�;<E�axa�C(뫒M���?P�	�z��d)Y�ru�)"�ar�z&+
,-hMD�>VYd��+M ÚCrF��Z=�Y&Mo
5���ߏq<��[�U(M22�#c���2�iྣ[LB;}v�3����n�sA#�`�����=>̀���br�b�X���Y�~��@��=Ͻ��M�����I(pW‹�CH�x�E��
N��v�v�؃�����(9%�lLU�G�\�m
��,G�$�T��Y�O�ðh"�{y��z���u��N�;����3������uSU�Xz.��u�յ�!���H�������fi},�%�>zZy�2��w*��$��i-S������0�z~��^.�����&� /'{5�eT��#3m��!��1~�!������ҳ*�����\R���8�HM��.��	#�#�C��D���y���ir�ɒ<�ĭqV����#�V{��}�|�>!!0�w��5�<`ӎ �4�xd�����ɱ�ԅ~cۼ,�H��d�-t3�'���/$�4��9�%?p]�q�@��Y�LO��8�oT�Q��T�ϰ��#�����^��_��wTi݈�����������]R���a�ou"9YS�a;_VY�BNФ�F�R��+Z��L���~�5����Pm3u�=
pv6�X�[:
zCV7��0���R�[�&������PKEePQt��'l�pip/_vendor/distro.py�=�w�6�����9wOR*3�~��n׍�֯��g���K�2-�2c���mm����� (ɉ���;���$��`f0���Y1[���O?�j�����8LK�x)���t,s%1�Y��R��Y<��]�*-r�4z,�X`S�� ,�������+	 R%.�L
y;��J���Y��X�����f4�@�M�(ΫJ�P~On9W��eUͶ=����bB4*�ɣ��G�����o�T��<�J�R�c�����g��8>��F��'��oU��ޔi�擡P�Eu��$����|^5e0����Tq.6wO�ɦ�q���d0�zp���o�⯻�ǻ���'��X<;:�;8=8:�������į�{C!�LЌ����? �"	e��:����E�������O��D�Iq-��#f���
���d�4��޴:mllnnn�›�3�]qv&��W��S�S���4�ߊ=C�<���N�6��L�=��J7�U��H+Q��"�Ǘ"��� @���)0=��V)ㄘȘ���p���i�rP!���R�0N%�7��gY<��T�/�e�����$��lc{�ؾ����3(Y!�(C�G.�g��_Co���b�� E�L���"�@����ג�K�0���8�J��1p?.�G���e�H$��8F��1g������[rY}��N����]�*j(``�@DZ�g���!�*��}}M8P�q�
@_#���q�6N*(4D֔0��i�/�8��L��2E	#~8@�N<a�ټ4�a��r����K��˧O�w�=���DE3�N���`���F(
Ȳ��p�6e%
e����¾|���2���!+& W���Y\������1����?@=��wp,v��H��i	��=�ko(z�d5�
6FG'���'�#�<���/��r�P0^2	T�ml<��e���e��Q��co��/H��m��՚
�q����P۫!�@��������LLA�
�`�X�U.���q��r�c��	�"�qfM�7��PN�L��r��JyEI��1pT�mS���PwJ^�h��������Cb���m| b�ۆ���8�@s�@�߬�6��e����M*����9MUKg�|dh����S�i���ə�D��A��'?6hQ��2U��+V|طE��n J�0U,c���k�z��~ٚ7Ey�XOc��Rf\�������F��.�Q��~B_�5є1ɋD���iG��$�΢0��EYL�s9�G
�2]���1��Z�&�P�z�wꅏ!�{'��G
e���7#��%q��N�"G�vS�K�f�L@���R��x
Ͽ��B/wOO���RF(�O����ۯ�>x��=��~����s1����u}�z+�'�H�I�)�C�}1����"iX�@k3-����W[�7}
뿴-7�W���F�d�]�N@��W7��P%��Bv�~���j�P/��ಌ4�!�=i�R���S�Uhօ�L�Z�{`��+�%����66��,k�!5vN˹l4�T��cR�"lx��e�"�TdlWs@�`���ӄZ�z�H|5��X
]RX���`��
�����gg0T.��0��<�SQ������#��$Gh2ޤ�^Yj<��ѝ |N��3圪��+�ڂ�2�MQ�_���~�c�c�q(�P9[�:!D��:"j>C��B������)�q	J�1����/e�zy���v3I�G��ۯ��!N�r�c�2�����^Q; ������B�d26�2Bh����]��5ֈ�e���ʪt��LҊ YϬ_�)��à��6�DEM�]h]rp}����q%��^�+�Tp$H<�X*oFpV.�W��^����|>=�@�f�l�ťO0ഫ��b��[[�Ք&���ivFGq��q�
I�0I��1
4��:�w�hm�֍��5<�
-���(|B�J)B��9z��J'|I
��
�y�T�¦u�2u�C+U6t2�A�Z\H_"�-�=�.�i���%?��g��ύ�����<������O���=�'��������o�s�1p�P��3x<:�O2�~�����y�i�䷓}m�;�8�f1�}�+�#V��4�gQwe�]$�p�ۅ�F�b��@�B��1]���b�c�]��- ~��i�(��OG34����P����%>���.��I�`��2Ox�l�S�W.̨��g�<yNk���G�)O��7_�GO���Lf�?/ͣ��6x�2�yZ�j�Ա~�#��k�s}���@��8�b�@��Gsp#�W�fN�#�E���_�ȓ�s����Ǔ=����$ee?]�R:�~�G�m�&9�����|��M�f��e|-Q�8�DjU^p��j��=P�IBa(G��l�b��]�F��}EkS$�
UkIl�ȥѿ�f��a�C0�T��	�M\
�?��8�����~���|&.SY�^�̀��Çz�JKU�|�A�yM���Z��M�z:�L4��G��0�@�"��ӌ���E�%��jag9��kz#@��)�E��[?��]}���K���(�йS�*�Dïẗ�H�"��S����+tg�Rҟc=��P�������	�`[��KuG"u1s�s�Z]�,!��-h4;��M�������bk,����6���dH�y"�3=��l7�Q�G�l�f�rV��!i�M��ٰ4\���(���7�R���h�(�߆�'��i�o��b��F���q�Aێ=P<��O��#�z��-�\\������|�K"�R^��\��Tˤ�fG~(փ��0G;[��X�-U�b�'t��
pwu��l~��9t��켹�7:�ܦ�S�Aja|���Q��]a�b_F�Hl���S�� �LU�u+�<��M<��2^'h�M�$z���/E���i��ҭ�>u��^�[km�}4w��[͌᥵U{ć(w_��[��&�"Av+���(K���x���o�� �T�2�� ���Z��mp���dGJ�;��(M�������~�B#�`)
`�Y�]���d�Ƣ��0p��U��j����l�@@�Y]C���&z�9C������x_J�R����j�Ϻ�rT��g�`�͋8���I1�^�JG�l�8V�X^�.ק���6�V7�2���G��0���F�Yn�m��s��=��*�zD����@J,h �i��L+�D
48x ����d��=����|����p�i�	�cѤ�ŗ�����b��L
�����)D�����IA�EӔDK�=�Ւ���̥��$�/�@Yfhr��Ȓ)� '@���5��kM��"�L�	%
���^s�ij�������zN�c.�����IJ�pH�i��,���-5�e��-.�MK��**�̊�f**�%8i.����Y�1��	w��X�5�3Ys��	˛�F趪��Me�u�i��(��/�s>O�dĴ\gݍj�\��R��Z���:�
Uw�]	�Q��Oj1��P(�
^����z���c
�4Z��T�n6,<�A��|�Q��:y�ѫD�.'*77�R�W�oI�jKI$%�L����'�C�ږ��������h\��w��#Z�6�p��Z|�
�ݧdC�m��8ʄ��α���"u�r%;�_�z�x,��`L�I��g��ЖY�g���gN�\6w����eB!C^��4W��'�o���L�NCu�����Z�w�c���i4)V۱�
�����I�k=5f=��,�	�n�j�a�`o��׆��.88�����%���
�����bF�f7�#N JA�G5�貚f���ib��d��%���3��#�z�f���d�Ufxi�A��d�������J�1ik76�i�h�ܘ��D��$@Z�v��.;m�~����?mF,>vY�A;O0]a>��c�1����q&�}o�N���@w��1�і|�Z�6��Ơ�D_h
G�$�ؤ�d���3�և��x��:.�Fhp�p��lT`��1�4�%�@j���zC3��*��K�Q.hvS��Mnǵ���P��Q�g����
&�(t��Ҥ�?m~1���q�W�z�L,!���{��+Z	��M_���E��A���8��G��KP@�����fi��k>�r�J��eV4�H���E��@�hɎ�6ϱ�
�k�z]�@��fl}��3:�:.q��A(�6��m�,�{�kl��^|��؆�a�d�r�R��ja�̭Č
�G"h��h"�(��1Y�z�cM:��(���#*�eX:���1��A��X��b�3�����#w�00L7yyPx����j-��,�U�$���OH�@��=��4�ͫ�HǪq%��d�������#aҽ�]�<�tsT%��(���nW�:-̾53;�\�N�Hڎ�:j�������m1<;}6�۸�����5����i��6���?yXjY�I���e��B�>���P����n���]G��U��y ,	�ƻWam�)�<SY��<�?�߇��n�_9/�Y5�bp��x�J2���L�բ_����f׮���SL��@�U��8��C���,S��q�juC�d�A'�l4B�g4:Ì�9��W��t��[؊N.`��@��a������P\���D�
�����D�F~�����P
�w�����ʸt�ք-�\E��}��>U&�񸕱�E,&}��L�#��F�4��ro�~D6��,�?��G�nj�G��T��kw�Ʀ(��ǀ��ޒ�3�5Ɋ�8�ݶ�ʌ�=
�ct��oi�����Ey+qe-u��j��"KZ�`�q�AQ�
Q���#T����4A���P
������ꍻ�4�1�(@$2T֧�l�ӽ��Pg�����`���3�ӥ�T��_�ܶN9�*��h��w7IW���'��.m���Y�"�
��6�]�+g��
��TGd��F����B��&0ͯ�+��F��S�D:�HKec6{6O�����@NJF�vz��o?u4
����H�)}��[V���ĸ��f������Ϳ��]zl�v���n� g�;�����v_s*PЙ�m�l���k�lx�W����:�R�K�TX@���ķ��Q�f0�
�E��l���$_�Xb�]N+�5�5M%��fV�8�^���(��P�̀�C�.6�j���sm�DM�xb�0�P��5w�K���j4;�A�})iv�u�>/Ⓐ0޼��y�T,�`_�t�!���L[��,�УI�%>�e�(�;�$�C|4�Ė)|؇��	f�^NhN�̛���
�ca[x{c^]��뢘�QK��k:���kC�/�@T�S6��*�u+C�&���q��6,b]Th��^7G��������L��)t4s�6�=Bv5�X��b��%�����ٳ��\Ca�Kڅ4�q&�c��q:kf�eE��ܓU�lV�lc~5.�k�7�41k����1�6�z<JFގ����˲(϶yG��#�����Ja�T�PGQ���T��n�O^�i��Ä���UPF��/4ME�TK���ՠ��-Oq��`���G�1��*oa^��z|	���'t*���윢2��e
�&7��.�C�o���}�"�J�H�{b�0xՠ�`@U@����p����g�)c^`ل�:��<���u���O�D�OMG���)f��患"HX�hRm����׻����c(ZUCٻ.��A���;��˫�{��M�p���Эk��;*�˼�����z`��@|�R�%����2�4���K��wH�j����À+�]�eo�k~��L��w�Ա=�x�c���Yp�E�0��2\�D�V[a}��]���N�Cc LP!3%��H��a�II}s��{���S�8���Ԫe���S��BT�=���������4���\��4��� �GY�{O������vڲ��m�z�0�n"��kl�v�?hwY��eĞ�KQ��>�v6���{��=gt�j�'h^W��EC��c�X
_�;����A���B�jC#,ȔR:�ͪr]�����M���.7��MV.�W�\��:;��"�U��v�����!�Ϭ2�4'-�4#���v�P���j��+�#���l��C{0����10��j�36��P��޿jϨ-ɪ7/�B3p[�̩���AIY�ˆv��>R9l�>R�i��{k{�[�qwdX��bo|��=W��6���l�.����s|�G��
ΰ
kb+�A6@h�SP�е0�E��+^�`��ꔎ��� ���������P-�-����ؔ��9�|l,t�N`!�Y���
>^#����@�F���m��������<	+��k�����'�/wk���2�jO>�b������|����䏁MZ�I{ Z�F�jV��fe{��v�c_��SU�x���w�	�z�y�.s�
A��������x�z���u�����Û]�;�������r�2�5�"�}���kE����T�=mkAp������ث�#U:lL���w�����@�����	!�;�J�{b���o��66p�GO�ﵧ�N�������]�w������Ao�����7&u%��P_���&@!�w��U���(/���o8[�^��װ_�#�֬P�U��M�_x�o�5��7[����F�>^�\��%��	��<�F輰=
���z�dm�;�~�Z�:�Tm��4�W�t�O{@>�kZkϮwm�S�,8v���˦/�&;M=�w��ޢ,Ϫb���h"a���Tڙa��u�����v�j�c*�
T\�$h~5³��u)'����[�D>`�Tm�Qz�]62����:���Ղ3��{�>���������:���Դ��,�[sS��/��u(�V���Yh��"��aZ�l"ե���&Q��=1����͐��,D�=TE�l�)�b�R5ea��� �W��-d�}�u�"L�d����ZJ8'�q���JSƸ'w�W��:��oc���?�����eՑ�o)�K��sy��P�s�I
lj��K/l�U���~(!ȋ�R�*.�oP�/��'x�b�@}.�ӧ�.$�N��C�@�Z���X��$�
߷�z�U��<��,�Kp�.�H���8c1�C��1O|Ι|Ʒ�?�����-'��F�J�a���>�L�x�X+�ȼ��-F���Ϝ�魷�Iţ�Kh���Y���?,Vw�ߗ���3}۲�T����L0�Q���D�^ch��L
X�J�Z�H:�o2eF�,G����&����x��wc���N�g\�z�e��d�?�T[�~�տo=�;e�Ki}�4��`��SpcN�:tOڬP�����Z}層��ulny��
�0�I}��=��"��t�"���h�(�̽�*�6@���V;��(r�*�*�P6�H���op����|���d�5$�(O�y�@��7QB�黼p2G��J�2D�M�"L�;��N%���n�ѲY��ՐF���Y�E�L�6�ssϥ��@
�vHαt���G�}������r��T�K!�8�an4K�өNwMn���w��N�)H_��f�Z.oh{pP�f3,)�q4�;Ф������ʧO���\C��$��m�۝�nH��61��'-�ݨ��'%b:�w�{k���ӳ�j�XWCq
���i�>T�'�R��Lۛ֊d{���r@W����T6�ѥ�8|�pG�]���K^�}�;��u�2�e	�`2oI�Է��U������)��>�R��
�){В�>F�
ݑ�n΅�7��*s6k]�GǙ�jV9f�~�"�|ΐ�|7�d=��}�ȉkI/�kPU%q���!���_r3LG�&պ(���3;1圆R1ڢސg:��خ�Z2����Z-og����/^�5�V�Z��Eo�ѻ��50
���q���Ғk`�5T�U������ީx����'Г��Є�U��^��-b�]L�c*�ʋ�K�t
7�{���cPO�{
�C�]Z{2��9� �oz���M �%4b��W�=��@�DEU	���gph|5bj��Kɲ��(4��կ�^�B�z�	�D���]>��ycșs3�S ��߀g9��-���\12^��w��������c	�����>�U@7B�S������+uTS����5ټ�U����E�m��f#��z��[O��>L�̜���i���>�jZZԷ�7w��]��#
�K���h	�Zʴ{�u�DڥT�B�|:M�4|Ҭ�k���S��g������՛/`��_�N^G�7Й���i���F��	�C'S��ԩ`�����
%�0��,��x%�\fN�^u6 h�s�kש{uF`^'�zUӄ/���g�W��×-��#�	�m����{8��t3�BŬU�J������[6T��E����#"6��C!����>%���|s�v�����ַ=�R�^�j��=v{̇�c
e|�#����5�p,á2�Ӳ�z�5�g��y�xic<�9��l�R�����W��|��k{l��J��]��Pܐ?���{�f^:eC_Hlo;0�0��\9]Z�즞�/�!Uz���ѽ��l���Z��)@홨���я�;k�ɬD�W�� <�WҚ.뾐,��
��›݋���c���"�薉>mb-������A���?��WLx�3^�o7�ö�ty.(և7�bs��&��4f6���G/wOO��u���k;�e#.�[In(��qV��1�W0*�U-�h�ӂ�����.@�<�,P��fk-чA�ːN��b�7I���!G��x�^Y�x��)�*>O3�p��Db��Arw�P�^gY�%x`���F�gA���CqT�c<�m/$�����1���@�AM�=���}��ul��$v�7R>�x!��x^�xz$��9e�&<bČ5^}�(EGc�\ȇ�U5�A��\�t*Sr��dV�jX��-	�R4���G>������t>ճ[�Ζ���N�'�[6��v�_U�څ������u�xeq��d���^�]|Od�>t������
�[�
���R�m\�����ś#|eq�ݡh<��+��l�QG���aX�n�rK���χG��v���^&K�fǴD���LQ�,;Ʀ:��fx�ð���0��c{�����B�cs����N�NXK�1hwֽ�$�w�C�Uht-�o���|6�,N8#�d}Z�a���h���鈅��P�y��g�Z�XI�t�k�f!���?���
j� Ϟ�7Dc��	O�@�Q���@{��K9����qul���Eh� t7�����6��B�m6h��?u�
�hv���'S�^X�-�Kw�ݘ턤��ǻ��G��wb>���z�={Dg��GO�~�LؗF�:h��Y!��&��.c����m��ɥy��x��o�@G��Ӆ�뭯��s���)<�݊�{��@ĉ�^moo=q�i�����>�B6��3�Z�V��\���l������f���<Q琂vO�j�ɪ6�~]��|Iנ��?��N=z`A��Aq���`��d�dBY{�J�DV��]�\0p
F
>�k��M�����Q$N�oX�B'訩y�QQ�l�È������ѮN�Q_��c'v6MqA�4`�m8�����2���z�@��7o��K���>C��ʫ�T��u�x��a࣪�K�4��Q��ߙ��+#ħ濦EE�K�̧3�竦�y��iH�^��)��f3����bf��7��G�i3�7�9'-,;�����n)���@bE��
s�k�S�<�cY~)T?�ԏFz]����PKEePQ^-a�;8pip/_vendor/ipaddress.py�}{w����zH�ER2-3���Ǟ�9{��Iv���4ɦ�1��a7��f�gߪ��ͦO�0�zl(
�B�P�a��ʖ7��`�n��>���1;K'��=�~L&q��SVd�o�:��+A��X%�u����*�qZtvvvwwO�,ʋ6�#ѫ�H��tyt�"J��zI�B��*Zݰ$e?�Y
>\$��!gk�dGE|��>��HL�Y�NQ���U��q��_�qq��>眯���*[��h�.֫x4b�b��
�S2ɦ�h��*��;;;����2�J|�������.�U]*'���t;���H�U�XB��	P�a�u:���;�	�0J�bT�,��5���N���0���a�,=o��דxY���"~�Ze+^k�O8�ڢk%5��'}��l|S���7�O�����=1d��1H�Lr�?�g�2�et	�m��Z�y��b�ۉ�y<�5��|h:�tM>7Ǎo��h�q9����Qɠ槰�Q5t 
����̥O���Mn}R�-����t�D)h������	��'�
�{�MW���r):��51�`�'i^D�$n�/۾b��J��&���v�bO�	W��+L��bPrTQ��4Nϋ��>S�F	c�be�-��G���=��^�.9��<a}��1;�۲ZEI�)݉q@��P%>���͠Hz��g
��"*Ψݖ+AGj�ho����۽A}�{��0�����P��Xx�G�_߲����ɹ��{�g��V�xJ��B�:cQ�L�
�q�4���ae���7�f�?��Г�,m��8��g��"^�d(Y|��E�)Z��7 ���Yb��$P�8{��dt&�:-�-{�p�Q�4�АZ�VN7�&L�UAS�Q�˓�=��;�R���:T�]]$��'�eP[7|���)K�:�''Dڟ́,}Ȋh�nK���9�N�f6�G<�vx4��Y��b�c���x����ª����"f��bԫU��
�A1rr��ST��Pą|4����Yt�%S�����o�	�8�D�6�X�i�)@fk�248Y��/�v�yQ��x}�w��+�V�I���^�{�oi� ��y<��y�Z5f��Q?�K�ǿ�a�P���/cZ^
�$�!�`p���� �)G�L�p�ҿyy��d�e��!�{T��Id
��Bf�V5=/���f~��n� M"۲� #wK>�h��ף_�����a�=P��eRY�S��k4_sW���*:B;�����n(h��VJl%:�sd���"�?߅l�I�(�d9m5�5��g�$��
��`�`Q$�(��qK��>�ƌ�7���y�:7f�hc�NI�q���&И�<c��ִ��V���-��݀�e�z��'���d�X�?>쳫d>7茑�4O�vs)�Ŧn|��������e�+�)����@��?I.�.+���!*+v����c�Q/	�1@�H�߁����#���v���a��Y4=�m��f�A�U�6x��Ё�~����Eoq�5��V�@����8Z	�R�q��uX�&��7ٚ�C�+��&niUT��[Y�#X9f	�#v�Bc��`��ڎ�э�9���g*PK�в�i:)N>���ow-�������-�A���疆Ac{��a�V���n}�E��9,���M��mX+؆<l���-Q���%��-l	ε�,���
�oʵ8��c`|�Ŭo�d��$��?j��EqM�|�J��(_���E2Y�#-k1�a^�wz�X�l��$��v8�M�8Iy��`n>uF��#j#ࣦͫ];�4�a-�C�w�i�&i݉}y���cv�ԟ�?�K�"�	-k3Xy��!LX5�.5��>��ER6L�TNC��hL��1�K����#�,������g|
ʆ`W����%��"�L��X��m����j/<���6�b�*g�q���%��<�r5�ӯ]9��]�q�:�UJ3����_Rkw��>�������@
�(���eK�\4���?�2�1�a �J��p�J�xO�t�2;1Uc"�lY�c���^��f?n�]
�M���0`x�1��{��5(cl�;)�Y�NeE�ɕ����J���ǿ�c<G�˳6]C'&�I�Z��e05@l�����c +�/����+�-rL�(I�%�Q�%��{_�z��jL�`�Q\�:u0�L?p�'��	�u�L��*�,�y�}���ox5��ֳ�v���ȷ����l6Y�xad~�WW�k0P�����?�U�'.y3]/��B�?���\��w�÷V�Om@z����C4@ªt�oHk.�u�X/���
LK@&��T}ޤ��k��<���c#y���/��E�6�v����o��,�g�VK��|�XD�䟱3��!Ӄ�^�� �-?|<C�nRn�����u�^�|I��YƌOk�1��m�ڊD��a�� ��!i��Salo�M`u(����w?���dz��z��>�~���׊�Gs�y>�?�Y��^���g����a���h}
�7�h�DE�T��qǚ������K�V�i��CB��(��m�k�R�d�Sr�{Q#C	iR<A�E��A��V�����"f"H�0��]�9�@�қV|7��r%Z��L���hw1�mH�N}����ԣ?Ey,��=�7"F�y�oy΍�fÑ�b���ؒ}�X�C�Gp���5I�����G9��H��T3c�б�CH�Ǵu6?���t(w���S}�Ƙ�5Z;��:�-KX>��ϝ�y���5�k��&���s�]QXHPU<.i1���,�#��g�5�+��m�.$}��A:�=�I�^����,��E��KPTڒW�n������7�ϧEK��$�L3��$F�Ń�:PɶŜ�	�a�U��nS/=R��N�q����9�B}���|-s�P�9��!���eK������y��Q�B���z��m!td<�&��U�P�����:7h'��~Y��[�(��N٣Ҳ���*\)����>�q�}mxi@�~�Vb�PFk~���S�aT2��qߑ�?�e�חId4������ikrjnM$���9
i�eKt��uZ�C�)Lf�̊�V�"���J��ސ-]İ���lD�@�~�����c�>4����C�:3T~�Yf˦֎|
�K^���%(u�s"�����v*�,KYil�MQ�����7�[��$��m
{��$�aǓ5U��4���Y%�80�N����>E�d����L��grYn��s�\�W�8l��&7b���P[L5x�|�ݔ���&o�^
���^|i�"�/��U��l;�hm�	�k
���5��M��e	^:�UM'�.�/9!�?�w�I�ֳ�_	Զ\�=`�_�RV���TȆTmFJ�"��b��H�S�f�5{��4~؁H�
H	-'̬7 螋�=6��-���-Rfp
-��O��2�!���O2���y���h�YA#{��~�꒷������8z&�;.?�+��mɐ�n	�I+�,
�>�-�J���b뽷��A�tL��d�o6�ql�)�<��HJ,��+��ȑ#�S��ɇw��y��U�p�*�-U#��-�
���.�C��4EU`
J,�.��i��F��b�ȑsK-N'�.�3�9�'sԹH�V#���PF���%�K���
換'O<����xRD�9?�@����*��yW7�(�P�i��A�D]��A}s�N�f���4��b��r�.xl�J���X$z˝ȶ�����w
����.�E��CW�%��u�W��$�n4��@ϒ��4�Y�<����Ut���G=Xq�=L�у/��$J�}����	
���;_��舉ρ��a���5������j
�p�-W	��Ц�2V3 #�3ц��tF��R�H�;:Ar��蒓sGS'7�;g?	�H��b����9�B\���<{ݼ�(�xU�p��q���gS2P��	=�(*���t��HV�>3�d��!0��3�Ek#��x�&Y�x�r1$C�y����4O1��2�V8��-3�n�������{���Z4�l�,�wl��j�v����^��n����8Y�*��I���;�j5j6��v{��x8��P��wƝ)�F��C���)˰2�cP:XB�AZ丗o<���|�fJs�e<IfI<�,�&.M�v۸-Rz�
��%&��3eXH���g9�ƨ��{�s��hʚ�[K��8�6�I<R�߮E��)C'u"'IWH��
q�R
�
V���Ǐ�ϯ�WoS���_w�x�Hx��h@a}�ߡٖ�7�vB�=X��'�פ��b*Yk��@]A��D��Y�D&��ںո��j<M)���m���:4��ͳb�-m�J�	^�Vj�Xx�����^ ����
�)�j�=�c��{L#���h"^܂(I
U�:��.�;k�_�:�{\%/^�ˋˎˋ�=�Nۢ"��#�N��8u_T2{	44��Jt�%���� {'΃�`J�r]���s�Ix ��3���09�Pz$��T�pIl57���2�z���@9�ﲩ#�`�k����a(TY�I��M:�����i+-�`�dU��MV)���*>�`,7�4t���h��ɏ�!D"0�����2nj�o̠g�GޭT}�Z1#W1b�ߗ�<���?��������\7"Fueq�������zԾ�f�!�.���:lVZ��`w4�}-[�
)
K����I��ZA�1Y�ލ�'5�fG"h/�]͘ϳ+�و9ž�����|
���a��E�>M�6�����)�0
�ſajND䍶�=ꌾ{���ϧ?��;����^�_�W^4ˆ?45K�ծgXƛ���,e�D�,���4���\�Y���{���,����80�ԯ�{FVLL��X��aaVsʣ���.�i�4�)ZQ�+еy��K���R�K�����%��_�]��X��ћ����Yilt1�w��8Z����<f"=����1��#n3P<�(�V�u���v��>�����u��1L�RAYP�c,U���f���B�}_��rF�*�S܎�-���ޓ�4A�4�b��~b��_�O����:���z"����u �3�YӋ��[:�i�F�vDӈ^���8��[�T��M�1�%�&R�s+�1Iy�	��%�qu�\(�"���
�r���Y,�B��Y-�di���})���T���Z����5��=�g:*��J"Ѻ;(/b4��X�ͼ����f��'�^^i�A ��S@���roK�W�wbG�Rކ#~CiLPЪ�]���7�\<�v��Wat�]��R%��� ǰ��3���|Qq��}0@K�s�pTP80j��.{Jr��/o�wd�6��r�C�'?{"1gt�kcs?�&^�+5b���G�)�M��'h�=So��('���G�Zפ��d/����.�ؼ���v}��{�&Դf7�iY�̸��<뭷�wbU40Pֲ�h��T�>N��E�/�m�������"�nx�����!!8Y��Vm�S���r	�d�d-l@�@�*t+}�����AHO�S�%5����2|?�^C4U�������ZpMi$�l�	�5MǠ�G>�r>Ҡ7�mW����+�G���^���-�dJ�P�p���T��']�A��nY���k���@K�=�1͢-�᪼��n@�\�c��7#�=<�Ví��9��Z�0�96?_��\�;7�[1�P�L{I�a��)J`��_T�D5^�*���AKw�ջQW$'%B-�b�?�b�rp�K����n�/K�2��ϲe�oV:{,�_E79��衒 �x��Pp��ݠs�if*�n}Gs:H
p
Sޔ�a�ƶ37[4��!���mT�Swp[�T������&���$F��E��)�o���+87e�L�Q=@�܅������lLx��*�Z�1�\yu�iv�`biAw�^��e����4){�.W�U. �v���
n��1�:^�v��L`��Zr���M<���I���`�^�Чcw�č�$�pk2�]�V��-)�ʆ�Fp�����5���]-��V����)⊋���]�U�B�_�?��Q���9�?J�G�O��"1�	��y)^A��?�Ѐ{l���_^`O��Et�dkXh&�,�-�M%t�Ysa6.$�4�L���M؜T�P)t7�$�0KP#�-�ԗ�����ɑ?j����K���"��M�/�sAT+F׾�����n��xVP��p��Ȱx��x� M���jp��(����~ٕC�^���wQW�'X��AcJH�[��U�r3R�}Q�$gV�y����*�$.߇�϶(�[�?��᛫�N�&��n�;Z��@�����u�;���%�QE��`V[DI�΅[W�Fa�^%7�p�Wt��_�������,G�S���ᆸͪN��Ucu�-�y�؅C�"t�a�[����v|�^�;�b�x�/�d�h��{�l�.%�!�T������[D��(�pw4�q40����(�*n��N��T<չ��fYS4"�V��Wp7�U-��=PC�y�ޗ>�@60p$8<E�S�v~��W������h��pt�A��p����5�/o�W�H��ww��=��W1;U�k���r�>���t�ѷ���m�N�%G�'	S�z�	�1�܁;�O#�
q��}����ʁ��O�K#��)�<N��G��2�*�3��ѓ[�A�z'�z�T^,�	���Y�ƾ�%)=�C��<��R��L��1p�*�l��.nm`����I�*qNQ�O�x<h�G���tD�w;L^׽�R��!J�iE�.����8��h���v,�b�(~*rF��¿7�=��5~��̙��)��]�������;��~OE�^�f
L��a�e�x��ġf>~`���"��y��*]R��jYu��Kr�o�%d�z��=:	�O7V���Qz�]��0@��A���Y��Cγ�>K�S�Q�|@�Ǻ�!�i��k��4G��Gkmy�ӷ��m��8�gW�H
��<n�C�6�{���ۥ��^::�ۢCT�e�꺶���KY���"�y�ID����7	�I0#	�T��Qr�>G�� _(��r)�]``W�LHL�P�\4ɋ��(Do\a�2�j�942�z�З9p����Օ�Ý`���8v|���c��H�n�pI��U�a�DP?�IUi:aA��þzw����� ��[m�FFt�N���Ȧ�z�lʫnd���{��B�y�WQ���(�xm!I�Ap���1!ɨ�s1�=7s���!5���)\��r��y�n|�\Q�@w���D�T l7��;����U��wT�5G�v���2)�e�a�t
��0�|���k=d����\�$1J
.X�
v���O]n@�������D尸z�kq�]E���h�F��U2�3�*C%��e*o'�.���,�ʌ�z.U�a����H�N�5�q��zȝ��'fO�Ç a>=�
�E�*Ւ�xɺc�~I�U�'N�%#�E_nV�QO�!��{SL�
���t�#�yA��NE�t����èV�3��#pu�?���&r��9V�������MaԻ�2�ؔ$۶D�<>��c�wph��d����$������f�C����\���x�]a�j:��
����.����iE��Ƅȅ�Tp�)[�
��S���v�9X ��t�Y'��x²9�G����+s>�By晴�k%����J�Rik���e�K�k����������W����7}�ꕪ\�ש�˧�*ٺ�T`��%2 �
�!�^�f޵��iߤ�9,O{���Lޜ}���Ց�bl�J����B��TFZ�<^]�|W���F�!�ìm3|J8@;2z����>���o^���C��<#&�I�]�#ߎ)�`�p�_��I����xhO�H�vEm6�ʒ�c����%%�Yk���[����-���g���q=���=�GU�R�m�g�I)�Sd�R��P�g7ȟ�D�UB3�p�wI.	N���r?AĦ�7u(]�]h)�ٞ�ޕ#�#mɓy�_a��ͩo��0AI����F���(t1	:������H�Hʄ��|K��Hng�d�*�Γ��va���	���V�#�����n)3ݱ-��+V�m�J.�"���=�-��D}�j�=	�^�4�O��G��5�W�y�#��_ޯ����vR��D~>��ԴR���<�ܣ�q-��BW�eZb[�
\���6*�JD<���LTd`NdqY���i�Kݳ��J�����2˖�h�eޗ�3b����4ϧYW��������l�������Ƀ$~/΄l���,|9I�tE%��Q�� ���!"*!�z��@#��8�<�:HfG��{����\������ǹ}���X�!�.�H�����_�~|���?h�I�߯[e�D$�����GOώ�ˤ�=��@�T|���{
��@����?�y��su�&�PM�(h��~�>���G�G�8:�?��G��=��z}���I0�`�LPO
[�=����xgxL�xo�@���]�U����(�Y��A@}c��s������"�$Q���P��D˳8"��hun[�A�XS����z�5+[���v̕�Pc���G��
#���k�%(��1��^;(�D�x����ݷ�-㤲�1�%'P}�)���L/�f$6C��08�1U*Y��J���p�|�h�4�4�]��f�E����[�d�j��;߷:��
;"9�f���:"_j����Ƴ���5\���z"z��̞X��xp��Zӌ��T|��-���̹(ŏ���׭� �j�L=��~�3����Y��@�	;�T�j˜1��&��YX��PࡓW��%D�8�Dʤ%����,Doa��f�Tޏ���q��Ų�1���(�A/�5��+ނ�%[d;���k�#�v�&�
cDrfz�i�H�4W�܏�-�%�
K���{[4��@�=�G]��f��iB5��� ͚3>
�Lx��\AC��/`SO݉P��������)c�N�)�[�F��/���>�j����.������Z`�,D�
[o7�I�C�fz=���."�O��~���ћ-����?��U�g���")b9�sh�I����U���&��`�w'��Uw�c��f���٩X.��lk����>�4|n��DX��
R���0�tU8I��x�*�o|4)�{��r8-�$�ˡ1*�'9ˀw�,��qK���>��18&�qRk��0$i�tM��4|�>�C�i\����c��
���Ĥ��&�8nmx��4ÙCT��f�:��A�n�Z��a_V�?�Mƹ,��́ѽ{ɞ�����ȸ�m��Ja7���n���|��Yxˡs�����#@�`�Çj����_�,{{��Ɏ<����P�GƝ��j̀��I��p���]��1�+���j�����\[̘���u�O�4Ǎo���"Ь���~���X<!���pWM��EK563���*��a�%�
OQ���2íE1�}�ʠ�&�[x��q����M��Ւ��0P�+�4��S��0�8�<H��&G_�'i^�F���� ~�X��
rm�_�n��T����ާ`M�;A\p��/�O���G���wx���~~Oa�57e�s=Y%c�����U�{��v��Nsή�Bx!"C>� �Ra�œÆ���^�ڊ�U"uX%�ȕ�ggeT��܋�h����PD�ha]Di�\���H�o�F0.{q��w��FWq��45L�T�0Eߤ�k:ʦ��X��0��O��A�5>��67�<H'���@�S1��kO_������~����-7����G.(��"m�]�f+x3���ց����Xl ��[����,�$���`|�7Pjw&K;By�fS�P`Ry/,z�'�0��W�ʙ�$ۨG����(៯��<;o�zG6��K�tQ���(æ�V(�v�i+_��1\�gT�}DZ1	�bq�˾mP�;�L._����4�#�����R�	�:�8h���ǡv��ʇ%6�Z0�*��e��M4�%�Ǝ�4Z����P"���)�ȠO�_8�'����q�w���#;����p�3#C�K�Qݖw���J����)E��b�*HPr�;���!�`�3W�<�o��Dd�ށw �7�]�ȅsj{�z��iK^�RC�sI*O��6`�d��;C2Fs
��\6_]����;<<��R7$���U�&jZZ
��n+�FĴ��әD�4�q�c��jF���$�.��:���n��1��&�Fю�W!pi�ޖ�5�QC]�\��{�X�*"�.a�ݦ�;�{(I����D]ak�:O:��Jx��ѹĨ}W�UPΩ�e)�
	�4�?Fْ�UB��P��J6��0J$/���6��'7cJo��L��FU�r��i*1�d�/S{⌔Wќ��hU�V��)m��C�VU���V4EU�qYdO�&�a���&��q����b�L�3�u��"�CT4��d���"����XEt�(6�z����lC�s"R�sB�qFثg��U��X�<?R�t�����2@�*5�_�5��?�f��Y��g�q�e�0cp�]����d#���e���
x�*��w�&ڏOH;g߰'r��2����3�[���,a͌0n�0ԇ|��˒>4�����C�ߍ#j��r�2m�U�D��T��4�q��90��ٱu����(u5��!�(�r��|{�H̲;xW8n�s��;e��B|�^}	}�[�p�e��t$O��C�����{�I,�:�E�5>�l`/�l{>��#d��6,�3�=�s"s�J	]%"ܣj���ܰ��J�܃ְ�G3����<���2�:x�D�g6VV���"�G���;��c��_�[%Aт��a�nEp/�0�7m6�z��p��2]��n���|�@�I�b؍�[��&����q�	�O�:���[R�"���}
y��Byb��a2�C�;��E�~6���ᯄ쒇B�,�w�ٌ�Yx�;��z%�-�X)D�!f5�<�]�>
��楽P�<f宎|%7U�sa*�w��n��C��D!!�)�q��A
��v0�>w:1�Q=}�R��ԡP�T�g䑩��ޡi�����t�{r�h����\�Vw�iȼ�@ST�c�(�ۺJ�j�z����]3�f�
�*U����8l��y�3y�:��;�e�2��o�G��[E%q%+�d7�f�z���A����Z�4�㣎�?���2L��!f?����2��M����
o1r޵��u@̈́pE�o�~s"~�����|�Ұ�y\���s뇇��|e�*v�����V�~݌q,�x�M���+�P{�7:�,����j~�3���s춓��4���T��+L����@x��Rc+���({FTJ��������{�S�=~�����h��#���ɭ�vW������n���E�M�´�y�>�{%�+����%s�<�݇�` [��׫��7DǪ��J�V�D%���p����u�T��VB��w5��p�^�"f_��8b,+�v^�_^J���܆B�g]��7*
���~��RO+K=�up�*�w����bG]�4ee� 	������^^���f+�N ı�R��ʎu���x�ݘ��Ơ^cpx�����/B8'������W���<V�n@�8�ӫ�^���X�D<4�W!�(`�x�N.������`�
��]p ,h��4-�n�<5P [\/�AP��<_���T5+����a�� �[h�ŵaÊ���V����
/�>X�9�@�<��)�E��d#��S\>{a+�
͛z4��z
D�i(5�%&�2�홽_��Y����
�����<h�}?��2^�ב�%j]@it(��\Yw⒵(�e�ĥf�mWD
�۽ �C�8�����h���)l�����X������^��O�ʪ�Q�BA�ș��0q�t񹧋���d*�8*�xzz���ew8�U�|Vw�J��S(r�Ћ�Q�QS����Of��g�g�)�ҨZ�3B�؅��`0.��&�wI[�h5�������0g	������@��B��͵�����&:�'�����tF�R��4#�n�9�����4�� 4���.�f�n��c����|
GSu���𺃯B����(�`g�e�� �!��떌�[ؒcb4Ibt��Dz���K��Q��8lg��8�e�E����<�E�^8;�'���� _,�ek:�B�������A�$�m����r�,N��%��'����^��u�Z�?a�;��66k�Ц�т���o�6��B8�gt��P*�n�b���_�	���W�1oU��X��yV���8�>�C�y8���b�\�YS�����I�E�Mt_�PEz���K�YP��7C]���;���}������W$+�q�&�	�q��S�y
�_���*��nv�Ğ
��Z"�'�C�#DNj���u�b8X�︢���~���Ѽܛ}�B��&�=NlZ����	�J�Э��ۃ��́�x�8�:w�MLG��bGa��\$�ɞ����`�e��K�/�&�V�!N�=�%Q��f�u��"�+j���!�	n)\�^��'�L�\	�de�D�pPz��;b��{K�K��wt���pOY����Hx:Xm���N+��
�W��JdP3������rC{tW���(~4����=�P���>V�	��
v��&�娚���ia��y�����I�PA�DICk�����9��<�Ȟ�C�9�&I-��V��j�vwe�,$�pwWޘAj�M�f����BK��I��ęB���A����ɅxLx=��F�����rd$)$�-W^,�S�`*a�̇�0m
�F��,�5������	�2�0��4[��1�pF�K�=n�?#Ћ���UUi]���GԁL(��7}�O"U2�j�I�-�9�^Cy_w.�T�C���_.��?�}s�9�<.�p�c���M�����wv�8xU�0U��3�~�;^.�W����,�ѓ`��H�M��C����*���1{b,p��@i?`|l4>�l��pw���@Σ�a��앚����p���z�HZ��44�6�@u�9ܛ5N_�n��
�� �����ik��\bd���#��yZ��?t�]]��.�C1ƵK��K��ʴ�
Nk�:�o�Ӌ���"HM�o5u�t��L��E�#X���5���'��4�&�)v�찏�g�v�7�{&g��эa�J�o[<)�z�/G��]S�|\o��(�VZ/��z��!����oq���1+�힗5����n�� ���z���yQ�W힝�Pf���o��Vɿi^�qer5�%�N󈕗�]>	D�KO�{p
i���O���jW�j�Lf1�����wR1J��
_.�+��o�Ue�\»������Ma��<�M������w���t|<6�.��G��G�g��Q����㧃�����Gϟ�O������{�[�v�jB�m�Wz�1\�67K�5nZ�~���,F��:���[vp<د���������~eO`�����ܫ�Ȱ_��yǬ��۠H�
!O���EH��ی4D�IQT�%���D�)~�o|�A4��=׳�/����`�����h��\��/k�NT8�f��t
��>�p>��v�Tb�A�
�Eo������O�;�?���p���p�7�d����b��J-��+��<-0?�F��@`x��}?�y��a�R[���VEc��.Oy�R��x!�O�{�rA	He���0���P&������<X���8�b����6?W&�x�dD`�?�'�sp{D���"2�b���F+���$r���?BGТB����������b>���z�h�Z�`��f�
�`���u�Ͳ���&��Ȏ�֜'��nm��7{XCA���b�G��ԍ�U
\���#׿�̱�w[�2��$�2}iHt��-!���}C�o�a	"���|��5E���D�-k�n/�m�P2F���fL��&�1N�á�[¡#�;�3�á?8�:`�`��B;�d�ׂC/��XL(�A3��K��-���A�I���mp����ezE��[%���<����Aa�6����r)���0�6��П�����3�7��-{��;�L��.�۴s��%��9���r8�"1�`��Z�-��;������:������(����P"~@�b-v��Fe���eG��C?��[Y�Z�1�����&dnL���ܘ`q[`�T��	L��,N�J�]�:�Nո]��m����o9tnJ�:��!��$�B*�o��cR���a��~p��IMhȶ���*G�UkSe�A�̿Bd����^d���c�q%�߁�+��b� +�M�ƭ\���m ����6�WCǽ�8����:�f�
�/L2�u�mO4�Ǽ�n����d�]N���d�2&Sy�<�~O^����/5�Զ3�ށ��o6�j�i��v���J��!�d�O�G�|��
=7��om��U!��3о���Vu����ޮhC�����;�Y|���uw"�Qe��*ǵ��uU��q���7�L��<w�u��7p�ǝ���X]�e�ʙ1B�.,�S��U�k6!���УT
�^){��ɪ���1��#.��z���P{�C����^́����p��M5_��|���7ݒ~�9� �7���sw@��T�N�ݱ��\�zmv�?PKEePQ#���+pip/_vendor/pyparsing.py�}}����})A�b�b�*�r��,�,�iE%A�`����$��7/��I��s���m,؝ݝ������'����`����j/�W��?ᓍ'�4��8�-fQQ���l�����g�"����p�	v��v7w����y�����o�IS�wq1M�2ɳ )�븈��ઈ�*w�I�A>	F�Qqw�*�l�⢄
����Z8tq����5*�Iu1QY�$��8ͧqVE�8IҸ�����D�V��Q$���*�K��|^E\VE2B(](4J�c�,�&�D��%���0�k�L�oL��͇iR^w�8A��y�K|<�3���"/�2NS��@�iĺ�T� 3Dm%�Em�]�S{<��ɼȠ�xL��u��xT1�0��4��!B��8�q�{4���6�1
��=�+�1�gc�'Y�*�#���؃�ב1�{QV@		L�,/�Qw�=��w������Gg����;z}�:h���V7������(���������_�N^#������Yp�>8z����u78:yu��룓o��P���<8>z{t`�O�I��� o߿��<:>:�G7xst~�P�؃����W���}�����!t�5>9:y��9|{xr#���ip�7��}wp|L�|cxO}|u����<���!<|y�;xy|ȍ��W����n����T�༧���?|wH���������ͫӓ��qs~��\U�����?:Cļy

 b��)���'���=jv���Cݟׇ����S�����â���ǍV�����d@����8��4�8.yO���0��`5�*p���o�?�gcWC��	�h���X,�h6+�ht��1<����
�'�*���ʎv�۲G�_/@Xi��E4)�]\7�π��R)�y0��,\�%����f7X�sX�YVn�| ��"ۈ�]P.�_~P0FM�asӨ]�C���haCnE~��q��?�� �=�W]Gu���8U1G6-k,�3�d�0�Yoc㻘yY�M`I����A�;`���~ȋt�Y+�Ǹ�\��B��7�Z��(�3�~�
�G�1�)�_|�`g�
�3�%�ޣ��
�x�ݐ?���(0;�O�� ��w�r�������v�8�~��_��gT�m��؁����`�����
�[��7��qQ�캽4at��66�L
�,fɬ׿��q^�4]i;F������:O䚓�ȍ����Ō�C��	��n�u~�b��8�PəLz7����q�oZ�/��S#="�3���t�
D�l�۲����[M�/��6=jw�v��7��%�ez�E��TR� 0� ӟ�x(��a
[6�01H谹O6aB�(�I_��h�bwhb}�@~i��?ۚVz�%9�D[��r�V%Po�E\��4�s�aUdh q�����
�JV��
d�
���"X��L���
c�UB��ݬ��k
ge>�%a�]S�)����,�аظ�?b��8Vv��%M�&:�ObZ(�P��r�LB�EI w	$QZ�?D�
v�� �L,A�O�j��P�?�sďX�܍�0��3ʧ�66��+�Y�:���t?Kʄءb��IX\Ǟz逛�aT�6���e���3�!K$<��Xz��%��Y2�!��[$�]�w�b~�`�)3�6�=�8N�7�X��_A�~�ދ�ٍ�!A��X��U��6�b�mr`����Fp�'�d������^&�W\��ۼ�	�9�Y,ޘ�Ƶl���_�Ρ��~���&)��z��������~~‵yЖ:"{…9`�9��B�����P���
�R�����5���cœ.���q%��4�%-�-��..L `��I��56�L!�4f�L6�3�'<`��!�O���qL'�x|l�6o����@'��!l\��F�EXj%��,A'<�arC�D]أ����ޗ�?����d�ݭ�-l%;[;[���ޗ���篰$�0@.D�mq��Ϫ���/s䅽fn�r��{Y\���Ŗ�Ky�V�]��D������x�SU��
��x���
q�Vi�LOAIӘ6
�hF���<{�эz��aR/�Z`I�d�W�7���/��O����ņ~RTy�
p�y6����]��;�8n) ����d
[��ܨ�Ş��,��e)Ւ�=I�H0��%�Ϫ��E^�-��UqRLH�T�_]��!k�?��K[�
���u�Θ�^4ɪGȤ�b�\V�-��P�-d�H"�4�T�a��G/�z��u�������� ��D�ߍ}W@�k��`��?fa�'��ܡ�
�m��vp"YRc�YuJ��g|��h��w��V��52I��	���-�(R�1^��y#6�p^��k�C��*'�{�)�T7d�(@��J�}�Տ��@z��,��±0�v%�5�Zϋy����aU�&Yf�)�������de��i>�-� ��R6*Y�pB�c��>H�*����=I#:Lp����~T��8x�.#C�b��,��e@"�<��~:Q����Q����:Em��q@� �"���Zf���|�ĕ���
;iN�����no�No���OW�m,���M*�R�8��IC���W����O]#�S]5�(�t(�5<�@~NFq��Մs1lLjGGN#�)�J�я~����}�48���۬�5V�����G�1sPFO
�����T�@�#qp��Аm$�0��u��$X�Y�g�������׬�qƍ;5_�F�:�U3��'!_G���*���>Pz�x:��7yo�K����@�ݖmR#�UTBU����”]O�(7H�E�~T\���>.�ɪ������I�Q^���Ūd#(?��j·Z��ǰбK<׶�Pv��U�/T��^�?�%K��ө�v��
�׼X�믳}�T��Z���L��+g�Vm5�kUh�2g�.�)����-�3�;���i�D�D���Ds�N@u�w4�V�rc2苢ؘ$����ă���s�����P{�5TYc���;E&"��?����Y.�ơu}�i��c����q����Όo�2���$�#�_�G�@'yu��/�!�W�/�/��/��i�
�U����xů���<�O	�8}����14s������kVC�/�cِ����IN��ku�Q�����4�_���m��K@�!	�P��S��3`���������(5J���U㌮e�%#���T����������6����M
����X��&���ʛ����jB��3~?Ǖ����.@��P���_�*�Z�&)сD��|J��Ձ���aBP�l�*��<�?Ogq&~�ΪE�bM,=�]�B�Mt�L	�Cu�w�o��*��l��E����?���XM��38f]�L�=�uw:�o�]6b$d�c^�A�:��h��_W���!����bu�z�����Y�F71bpJ��7���5vP��S���m�\���e·
Y!���k�FrHZ م��P}�_Y$x�X��kB6�"k6�F��f�npq�����x���4�%���pj0i�jA��Y.^���	(�Rw�E�]�K�-���4IuF|Ach�%�|k��MC���+~�ޠO/�|tC8-����y����
\Iv��I�#��H6�"c�)��w��媘6m�o�O��N�����č����
�A頦p�bL����]��j�~�{rc�A杋��ˍw���B����e���n�$�������s.ޛF��_,j���#��
z�ù.������"�9��[h�����L�(�$��N��������[=�;��RAqՃ�ꥨ��I9�v�4κA�d�k7F-~W���x�ǻ�^��`�@1�7��	!������G��C#��������u��6���Ņk��[Y�G�����Qi(�8��^p��<-sq	^L�%JR�Q�#	�0�Q��h��j"�ɓ��R/S��[��-�Q��.���
�A
�%�z����!�=��]B��u�+[3PJS@��.l�����H�߁wS�1�Y�3+�'�}�y:�K�H#)Ɂ��$�aG7d�LH�v�q��Q	O�V(5�S���L�bh�dh�$vpWb$�CO��4���"��lw,��=�&�+,�x���7�%�k��0���qT{A�����Y��'���\��mn_v:��Ö6��Dca8%:�a&y��&z�?��\�+���E{��0U��=a�O��)!O,Iq$�7�#RG"�bx��V���It_��Z�z���q3�&
�ѳ.���q	Pm��CeN���*�XV9_̐���>4V2~"^nwШ��!Lb?.G��+T1X��0�C7x�
^t�Z���k��V3��zt�M�z���`�	3WT�	�r1��~�Ë��mօ�ƛ�����k�f�L3�WU�Vd+D��T���3�� ���ҿ�Yh��5�2�GM�D�C
��a,,����DQ���$��'.PH��/�lK/6P�DU����_}��?���!dpxL�����^���#��ֆ:�@	��3*���x
��>��NgCK��p�}ȓ,��"DtKC�>B{[㥶v�!��B��g8�EW�>^5�u�u���i��(����%5���ރn�@3x��)ղ�喼��WL�1��0@�\���Y�9�G�0���BW��(F=�B D*�TP���y
�Uw#��DoE)@�hL��(�o��P}�K�Lqb5Z��S�J^�p�ěnU��[9��#��mx\F�w�aOӼz*l�И�̃�8�ц-���9o�Sl��$*�Vf���T�: �&U���Z7�Au�H>��"��A�G�j +�$L�k���w�/Va��I��z7c��p�x��6°��vJ���D>��`R�_hR�<Y��x���p��l���MF���cD��
�X��I&mN������Bko���
�6��6O�%�r`}9��*��L��J�QU�Ɛ���|�̘<�k���#�^�/���Zx��}_l���"�Q-ܔ��y��6��p��@Qa�f���b����0.���^�h�a��`Dj�{��=�0n���px�
0[<��Wr�w�\u]M솄�*p�g�-�7��Z��\��csW�r3sc[�
�LLB*�^�aC�o�;��Ga2Խ���g�ϳ1s
�����D0om�B}�P���h��>^�>��=@�WrM�?*1��e83��vk�����0b#���1�aB�����蹔��N+��6����vU+��R&D�I��1�
���%��gIz��L���(��+E@]z|��o���y�f�h<��z��"FP��������i�F�0�����m9�G���ҩ� �-���Fb�~)�̾�8�!���i۞t��C��b�h��X�c��U�/ p��S'���М�q�<ォ�%�!@�P/d)�v,�K�[u	L�]�WK��u��elW�'S��]d�n�Z���kmA���|ʦ���F��̹�O��{*&�
<�t��{%���hu,'<��jb{�H�t8�i@��x���i/���V�D`,��#�*WC8��"C#�fv[��m3���M�v�7�\W�r{�v���؅��z������Ռ� �/Tɤh}]i'%*�X2�&תR�
�uB�S�\F�b
 �(�㞞{�*��J�S��U��_Q�+�9)d�!y��F��{������i�z$}��
�k��ɺS��1�Hs�BA����I���-�Q�P�B/�ġ�Hc��#���p�<\Ѧ���|�!�9Z��="�xLu��-K��h�ȥ-	)T�q]��(Q/�9ty
M��{�"6��$> ��B�JDf���;��(��,g�H)ͱ�s�W�k���;aq��/���HUj&W�GӺx�p#2�sr�Hܐ����K�Á`c�d1�B��メIB�F4F����)���v�Yp�s�0#,��������n�h����@�잩�f���2���]�.�ii�ݠ�v��&��X��=�+����Y���<^O�֎����q�@<�qW6�H�*T ������A;xP9�(�Q<h��m�I�n���+��z� !jwz}6�w��;f^[��
�
<�t"n�,��	r˒���+>����>���U�1Ky&F�	�\x1�.�ǡh�b�`���9]S�8�\l]n�_�Qz�Ŵ7�4���m|
R����s�P�6��tE���f�ʥ�2l��=�����I�*]���4Ru��"7@��`�^4��v���R�D�2��di_a�.{@�@�?�h�T��;(h�����?�S}Ptޗ�֚`?�?U���:z����#��5q7�E�D��d�b-j_Q
If��2���7�F�q&��x���
����c���&_$�G4[ſ�F7t:��7����:9+Q�ʄ߯�����p'���v�|VZ�d:����.�NɎ-F����3��xef9z�ؘ[C
�B�.�>��Π��"�뫟/@A����l���
H$�q�̂�7����y���W7�sJ�@����M2{�aZ8�[�a��gk�ơ
)f`	��I�M���n�Y�G�֡�� g �s�P���hz��RkC�y:W8j ��� {h�2�s���p&�#y1ncXʗ�6G����B��)�Rl���=���8 ��P�@��Ls��8�c�N9��UQ���K���`�8k2H��h�oRe�ZA1��t��a��h�껐�q���p����y���a���1���'��B��Z7��4èM?��3�9+�kuVj����;{��eK��&%r���2�3�N&(²͒h�7�m�o�Y5��=�4�d��u�zR�p�\��UƗ���u�[�!����3{jT�B֦!�b���������V��t�ǍB�hϚi�	X:�炵[~�Z-������;�AG���2h�K�R4�}�r0�!-tM��4*�����` )��Өu���}Cݨ^����Pt ��E-:~a_Ș�gAS�)ןP-Z�,�$��'�:�m��`{�p8����_�jpÀj(b�*8�(T�PP�����-e����/�w���6�U���h1�qiu|����%�a�…�����(�B
��i�/�9�kӛ6!���Ǩ�_�:dhE�<%@G3�%ed��,촺�f��ҁ9F7���������ݾt&	M��Wq���s��=��^\��6~,�|��Dm�X������&��b/��6�P�����.x =�)H
��Glv���(x�_�w�}��F.J�}Ml�9�.Z5�/�E	s��u��WW��W�)DŸ=�~gh.%��~#&?�Em�@�깘�������	�(�&���x��4��v>=�?��-BCD�=��+BG[#�k@q�q�׶�G������*S[Lt����o{6T������@�L��8���'5����n�-�Oh�i��2BDrƇ5+,A��M�Z�Z2잝xU��ل�T0��D���h!C�E.���^%B�7F�%�|
}˪o��v
�AIMVPi�����/.]��::T3r�Rkռؼ��ʾ�M	g�F
q����4c��M���-��Ye�IM�Q��M
u	i,�\��׺C���M��x!�a����Gx���N��b�<ڄ�t��!�U����H5��(���Wv�.ר���r0h�bs��şj�".nQD&qk�CC����l�t�۵�e�P��V;�
[���R�0�gt�t�<'��a���a��!Ժ5���U7K�ՙP�ĭ��%���4��[\��A6��.ef�ޔj(N[h�R	S�8}�u2]�tM�l#5��A{��d!��q�$�46�d�M�vXZ���Y�6x���Wę�V	6�Uv�.����;f�z\:|��	���s�&=Q6�v;��*���R�6:I>�g�9�
��a�*O<H�ȁ��7�uf��/C��>�Q��h�R��H'���yqt�[i�K��Q��S�j���_���>�^V�ek����vp�f�u�M�&��F�o�U�ߤ�n��
��[c���ٿ�"�H!�	=�a��e��s�p�G��,t/J���uT�ל��nВuL����-,5�v뻝廎�� 9�wZ�&t\p����^! vV�����oq�eI���j)C/3�D�16�hC{��G���xd�i�&dH���}�$���i�aϻ��c�(U�ɏdpթ��x\̭����ZF�-i�Y?�����
u���~���=�,h�mi��֋�A�꬜��dwE��{Y��ݬ�U<���{!G��.�+A-%O��}���]��g�L@�,o^Ѧ���
��
�5�y~þ�l�
r{Co�nj��(G~��[�,�	��)z����7w�����=�P��D�@��D�Х�4J�4*�����6�خ���U�X�Ss���;	?�x�irF���;�0H���8$�k�OD�7k�q��J�U٠����.@K����f$�kI~M3�
T��6�����L�P���[<�e�"
�.�z����F
SHp0�GY�
:a(���lJ��v���p�)p�՞���=����X}��H������
p�;S�!c+���
vw�[pZ}�4[|1�K�2;��*��xl:���X�]�I��4Ʃ�3��ȑx��ra����1݉z���w<U^�.����{n�4�~��ͦQ���G���v��gK�\Z]x�cD�u�܊�k�DZ����֐�0��Q]�'��E�-%�̀��@���u|k��\�Ɲ��F��z.�Ť}���7��l�]��F���v�6SzհŔy�#@��Xz=�p�E��ڟ�m����C7�TOP�RkF�g\�
qhu�ќ�;���+���R��!mT�ҡ���6]��y�'z��c�Ԓ��2�ve��a!7�- �P`q�J�%�q�@QB�K�B����G�B�C��L'?���%�HD��
L��Ve��M
+��u�L�*<N�n���v��v<�������,f=�[�)z#�-���_�:��HO��O
�z�,Yպ�vX�\l�Z�(��j�&��ل�!.�a�>�S�Y>�f���BI��"Zi;Y���_�l�A���Y�Y@r6l�����?m�g�����gF}�pj#�u����vy��-
L��//:;���jTAcK�I�6l5��MU��}4㟤]��u��,7��<l����
��`<���䢣p�cF���%'3�6�F��_h�f���Ly@�r1g�@6��#�b��%¡�4��ݘ��=T���t��X7���/�ZO��D&��⏕MBe��2*����Z�4��g8k�W;z�i������B�IV:�XO�������lרK�$"*oN�q!��)ŧ�K�[�t��R���3�CFNGZJ˛��7&AzS���7�b\ޤ�7�0�)Ӷ���X���w�L�	e4�5�]�8�+�**
a�Z��Q}�H[��6�[�ssmX�9��ci�*'vUͶ����E���g�񌷚��sیgn��{�wO:��l�m?��
�v�PFɲ�>�Ə���5��]�#�F{�:Z��e?G�`��vSյ�%q:%��z#D���kܲ�P��	�1̪�K��@�*�T<�u8S�`w�o��3r�c����0�ÂK
Ld���3�Yt�R�7��I��Z(!�k�T��F3�1�e=1�}����<��� �]QnZT[�g�D��#��6-jw�ՙ�q	-�2'���!'�zDb��L�xV��2��V�9l���r��NP�A��nEV�V�{���QZ�=�M_�NݞǢ?^��r���-�S��e��JT�~w,o��n}��6���cKM��^��@Mm�u�d�Gʟ+!�wܺ�~�r�a[�x�l��:�@�3�(�Ֆ3����
��>��]�M�B�Ve� C�ߥ��h��'K�fQ��+��t|�!HK����\s��e�u>��"$c����I>ݨ��;)L;?��贍¤�5g�#őݵp���vB({�΃:�A�J�'�S(�~R;C}O	B�r�DƘt�:mG��(�kl�z� ������e	�����^`�gY���FxW-�S?o��c6�u韵�ͫ@+"��U��I��7W̻�'įu�8�p���W�	R��m�u{d0�5�e�q��1�ߢ��FO	�N��W��sD��kv!YNڴ�Y��G�`�M�\y��.�˾bOu��Ɇ�R`3̇��K	�):4F��kh��V圵0�*6�q���L��u\�L�����=�1!\n����	��"���T���4�f~���v�Qy�?�����i��]�5s9z���E�6��׊++㔈^\G���C"��f�X�1�Г�4
��N��^�`���۷}���p@���ȫ�
��up�̆H0^��Fts��ɸǟ^�Y6�#2��t�h:b����_g�VRG$���)T?��ND.\��cx{-=�G���Ax��������씘��c��
NV�Z݀��>�š�_cX=J��Y.B7zf�h�B�J�M�P�F��İ�v[ޞdh�1�Ojb���J:���7u$���N���S�}l�%��cu��%����ӗgA�`��c��h�
�y%JQj]1"r�`*��0�f
j��7�Բc�W�[ �g։f���xD]�ѾtM.���NL��+6��\\�RuO�����f�U�I���(qx��R��`�z���*��Eː�E`?!��{%�5-�[��o�wL�H����,l#�5.�5�C���5�qM'Ĉ�dS���z��}�7��������}B���ρĊ���45��m��$��Rz8���Kp
�Eg>p���t��%.?K�<.��U��}�q��������������\Ý~f�.q�f�0�����/�v.Wq�/jlMcI�R�AuKo�f�siS]·�r�����ߒi�چ�},��o���7� ��U�D�sW�٤,0Ea�NA��bA�
5����+D#`�8�Lb+���#�c�z���d4G���e�Q2�@�k�8�m���B
N�e��۲�����QI��*�
#?�E���D�5�2�R�<V���K� 䈠&|]�������V��GLji)Uϛ�.������	���7wv6w�<���~����Z3�:=�A�4Ȓ`1�^���)�نU�ff�ɼ��������I���/�N�r���g�s���:V�U�{�
k�xx�(����Ŝ�2�5����P�pz�b��c]��F��(n
�ǁ��܈:��q�ll��ks�!�A#$�?��#���l[�1#�`�{���JX<�sV�����k!^x!������!2+:)��ӥA1�F��"��\�x�0��H{h#)g�Ev-Bҋ�1�x,�(�o9K#RN�}e��U�k��Z�b���**b��^������<Q�v��T��c���ɌLu��e�:��4D�:b�1`��v�"\$�#�%�4N��a���頣��l�:��#p�j��o>���뱝�7R����>/��u��d�(�?s�*f��jAH֌���>O/o��/�}$~��8������P����s��)&��p�A`�Å"��-L��[�,d+�� �Vl�^ZK����p�6gX֑���1CZ��||��_E���^Gj�G�k(��i�O���#b�4���e�I �G/�G׼���%|�"������ƷS�Y���t/�w�ZlRŘc�~!:�sWآ���d�f��_��Qٛ��//���"M�ET,���j���NA��[��<�� 9K�����v*�N�뛉+_t���^=�*cא��͆a/Ԩg�'�8&��P�y�5vN�03X���I�A;D�j�@�i{�>.�>�N��$�X]S���$ab3�RB�GP�a�EA�v�I6F�qwgk�����j�@��w�՗[k���@�YB�ڣ�=�=�hc�S0�0����?�E4�D�n���odQ�-�������!œ��U2�Ic��^�<54�Wq�)��� M�EM����l���KqQa�5p�5�)Ԯ��˘�`Tp@s��~����P�T�t�u#:A�Qf>�qb�2��������f#�;3j��^P�m���>
va�n�����r�1��~0)��G�hfY�T'A*��Ŋ��MNN��鲜bh�i�a�.Ng�W�kKG��L�8G ��Q\ܺ�6)"q*��E�c�FL�N��H
 yFw����L�84.�m�<�P�%4q��x����
�ڧ/v�ЖUM�z�k���}r`Q�R�:)�Ë�{C�Ҥ�҈�k�I�`01�ťn����A�����YXx�@C=M̷��o�T�
�������$`��=Q�kjT��*s�r�d��v^a#b��"��8G���Tir��X1BG�;j%c�$S�v07�<#%+p/̺HK��b��Ć8�賌�]$(-k��Y83~� :�:z_G�I^�tT��E���2���v	a
�	�뤬>2D���6ZA���,����6bHv��X/a�朲xg
��P7%��^bZ�bZ��� �w%;&T	kd%�M�;�cU�]=B@��+l�� �,E�RN^
͏�W�)R�0�j�������9_C�GLy��gq���lF��6��W�XO��V7`WrAu��z�3S^?����5�#�>?��O~k�ކ�v�����dz+	�S���ّ	>���Ia��G�k���5
-� ��ǀ�n�@?����b�W�Ś�<��;4]�(�J���^X�e:.D[��=.���5T�d��q�!e����+�A��G��u7�R�zK�-u�AE�6��r��D��������1f.y�X��;�HGb�uNV����.gc�u�/�p���|#�|A��!V4�i��(�k�8!�����|���H6���Ԅ���ɵ_� "��T�����^
{	~s%�>�5ٹ�U@C�~1 ��������FlGLz�g�䗙�G�/-cCҤEiZb
�8� C(�T�ǴÂ� �Ҍ��ZH�����L����T"D���#bbW��밌,x8b�Aq���*��)((�Q�Op�M��U
��-�!݉J�(Y����#:(�Z�#^+�Ȯ�c��N�V�%�s�1�� �6��߻���n׭�@u����i�k��'��}97�a�M�El����=�E����$b�x�P
$�4�n")���,71lV�g��Xe��(�%� �Em��R�=�f����R��Tqu�G��R��8��u���u�,��_q@�0� �Aa�P�E�n�{;��e����+c%��!Љ�<btR�-�(�����ȥP�Q<��� �xFSD�)hӊ��ܭ�I�z�>`,�n��J����L�1�P��dS��LL摿�gހpx�ۥ[�0����.N��U���,�����[[ذ�Ҍ�Z�j�0I��A�:.��Ъ�N�F�z���ւH�� ��̗�_�K;LW�2�����y�F;R80�Y�Ei��+E]��n��_�y��Z4s�&88�G���a�껃�oϺ���O�����9<����,8}�<>8�+�"/�8�R��'�?��굀��_���O^G'gG���޽;|�5:�zy�=��G��?�AA�'�v߻6w:�fQGO��4hQ�P���t�p�>������}���<�a�k����Φ8���`��I{;����k`~G'$5}�c��r��̻c>0�<`��dFdNvj,��"���d�^h����rc����#t�_2�e#���f��Z�5������>�R�s%�!��^�?��%�ț�D	��-�e�Q�Eq0`џ��"/OZ�M��B��".�l�|����n��O�)9�Z�'!��m�e��((�#�� 	�`�v����_Y�Xj	��%�8頃�)��*�Q��ׇo�?>����ax��3Do�c�c�c�e@��e�\�Y��4A�WY�ȹJ	�5�7�N�w̠ޫk�K8���N��"ǥ�źS ����IcU�Ȥ�݀tK�Ҙ�%�����s4aS?fW�I��&mQ�C�]��7��x��H=d��)On����.Q���*K&�(�lv_�,݀q��ʹ������̘K?%��.��{<x�vZ�ɳX�7bĬy)�nɾ��g8���TE{�\�+V[Xh�D����Dg�:���WG�U�4Iq3�J��%t�DY�7��nS�V{�}A
��]u-�j����E��aM����j�GU�#h��C�tO���I_\F�-�U�p��a�c,��n��$JRU��y����mz��d��дp�X�vR�b�n������X|!���1�y��1�VYmӻB'���ǡ��N��d���+S�R�����T���9D�d�V��i�ી��Lk�$8f���u<��*�4�T�E?dw6,̃}�>ni6���`78�8����%2o���iJ�o�0��T�T��Z0L�+��I1�ϸLI��R��,H��VA���W��?wMJ��C�7Ө��--p��hL�T�$��M�(i4���J�6�;L���>��T�B�K,h�?�L�x�R���q��+b�Dm@�m����iʀR3<�������&e�y��e�u���� �2j	�4�7��^ =@q��1�'L�jJ�:�Q��\�H�x�I�Ph=�-')���UB��P��sXBy�H+t�x��P,%��>����=Nǹn-xV�4���w=�W�k����Oi���[w_u�>����;��:��W������k����o[kxT}�����j��믾���|��/w���
���yr�H82m�`�7Z��Dm~������ зbF3\fع�^\�[gWv7j3L/��y�������ʻ#��v����+��EJå�*�r�dy�v%�.�]
Ym^�yN�#����

P��u$|c��y{^�R���Pf��a/�����z� �lG��`���k�m�'�s����0��ֺg��I��v-r�/_�����Z"�j�*��mft���m��4)�<#�Ƹo8�{K�
�Ú=��ʽ�r�A@��� M����	��Ȫ�i�q�[+���uB�p^�q��4�Է�Ai������=�^�0x����'�v)}}cli=us��'��2)iG�
JFr��rJ���i�+B�3*b
�	K���T<�0�����S�`�#�S�'����F
�E|�Pl,ԵF�FN0��i�θy��;���* ��E"�Ϫ�:��ATnj��̃i�"Q�Kkխ����1��$ �����Q}��Z��,e�m����i��?|Mg��n�.�R��K$۰��M�l0��=��n�=����c��e�ā�6l����^�)�F g��ߤѕ'b�[e��d���h�����x(�J4F������
�pbir�!� m���H�6��ai�{:pPb�]qL�r�8)�?�L�i�O�C��.f֩E�� �:�L�\��DqX"��bO��C��j�������"�8Y��AzI��$��.'ԓ�� �p
���^Є���A��a	��r�yg�ք_ߟ��t)��ޘvv�s��
Z���Yo���Jy�څ7�$[�(d�F�����t���El߇�-?X�Lq��E��w�U�$�d8��Td�p�6w�g��dGJX�� 2�5i,���3�'NC���a84cW���ݷ��J�j�c�J�9���c@@�J��򀙹j8��а@�j�O�g�w6���X�ht]1B��I�c:bP�`�,�'iz�ɂm�x�G�F�W�1�qi~
��sw"̉��41��ْ|o��e��FN�3�.�2�cv��юE�0S�ݳFH�tI)�!Gf�RivI&"(�����Q������,�1N�te�L�N��웆���&334m"�A���a�db۾��ʤf�IQe]�јìF)ꅰ��`�"�#:k��&��	���`6�HN�y4O
�|���Ctn+�YWZu��.�L����"R���L�(��S�e��j��4~*~�:s��,�z���`X�4�@�3����ew��F6+e���a�C��(l���+�������|���2����s��� ���w�a�6tGS�t���ܮp��e�"3�N�޵�\�B��(9�!/a�<SX���|Tlm�0�*ճ��M��K��8�%�x���5l?�����<D��O��W�#}M�#֣`��g����R���x�ax=��d��16@�>�
��@K�Z�	e�5G{�#�ȡ	�����HV���!�N����|cX��-��^�v�7�*hEd�%|�dю8a�
�.4�(��m=�Na�`���7�
�2_
���yk�j�~"⹛wJ�R=����$/���-����o����O��J*��`�
rjlo�w������u_���᭽f�v&�")�?(�I�s�ī����Y���[p�I[2���ᅦka�Q�)�m�n�Jq�ׂ�<Ë�I��dL#Z��3l	����N�n��Fp!�ux^wE�gpq7�nJ�f��m�c�:b���@wxP��x:�[
 [�K1�GF
�[��u�5\u]�wV֝s��nD�\�a��ZQ^@�h�m>:0�b�
##RF,c���p`Y6M����GK�#�V�Y/U0XC+g�|�v��ͼ�{{�[��0�g�:�䭋����^?���t��7�8[��$�c�u	���77oȊ]���f�Ȉ8&Ԟ+fC^{7"�א�ʰ��w
�m@f��S9r�M��e�4��@��rm��qUW�,��(&�'�)�#��D,�T�ä�R���BF��Y^V�3#��;9?��M����2+�I"�l�Z��䯢�uC��8��n���w��a�\�;���N��`W�$N�!��)�pj.\�����`�-�t������A=x���{���]<�<�r�}�mÂx��5:�i����X�j��K�.G
.�%kk)��ࢾ�x�1��~���>�բL{�R�C��&��	֫;�ܰ�b��W״���8�3F�-U��#�K�^i�,�5N���W4��56�cP�\�K[nbV���Z��ۼJ�����[?�4�וk���i�}�����|�u�G��Ǥ@9��0�J;lڹ�j^��bε�Pq�{�.�o�׌1,[���I:TR��u>�kS��=G���N|��B��q�+/�JDVJ��I�%�w
��TڊnKF^�RrI���F]�=(�.-���K5K�%���~�P��Wx-?P'S[��_7|��庳�����W.M�Y{OǏ��k�:�R��M�^X�����x[>~��~f}_>������'�G��+��#��x��?��m7췵#t<և��-�xu��էbR�u.�M+G��E�դ��Z��vMWmy[V�M��)a�������jX��R��#��э��*�`ޮ{���*�4+�@B��]�Q���*��da����>�4���
� m��:͏�Z`EWc�5����
]�h��(p{�R�1D�2P�k��-M�]��{`S�(�!n�Pٔ������5K��B����=N�챥)Zz���wx�N,�*�*4_%z�X����=�^Q�ZW�sZ��"����H͂\�$���R%�]���_�y~0��9F�d�۾r��1����&Q�>ۄ�+&t������O8��f�C��΍�������V�P�)�*U0V�T��X��y��U��jU���\U�ޫ��j~���ٛ��?I(M�(O�X����qxq)��ي��^��՚Uu�q�D.�[W�v ��GY�K�}ת�{?��9x��y]���k�"����1ȷd(�nݰIy�ϯ����4��dt�(�����tYBWQ@�'
�[k��+��oT1��n����b6�!���7�� dc���WГ]�<��b�l�@�خ�v��C
�Bz��~��BA(�`S����i�1��8�Bt]Y�q3t+�t*�/����(�Fd�݈b�h���������n���L�<���Y�9��0az/a��~}��'�%����o�d�t�d�ɓK�L��=���H�����Qv�}5N�҈�!�u�1O�/#�lI������5Ű��Ҽ��*f�~^*�w�ў
^>�_dB������xU[o-$�RlU��})LE���=����[]M�x�ɣ�-v�2�i�"U��7��2�7��hQز�w&�սZ2���M{�ą1`	��++�ЫC�;,�4�`x�����bQ��n��6�d�e�-���z%&�`<��b�󖉁�
?�4�JF���{��
1[=�2�2�2*�����k�,�|RŤ_����bO�Ua��C�ae���x���D,M(Rd�Ŏ���22|5�qTqX�1�F�U�GSGr��2s`�TM����
E���a�h ��%�f��<2=�`�Oo3����Zq�Y��&c�N4`�vG����M=��
����%-��q�쑄$��ͥ��Nd�5��

S�O&x`��Y��ca�(���8æ�֪�
�M�J��!a��e�g?6�]�8R�6�m�|#c����e�Z�ޑ�h\�s�2H:�/D5�|�SGn�7�@�$&��.ֶ���pح���)��E���Od���mI
�ƥ��+�����1VU��������h�U��D���,����p�B�OWn�’a��q_C��]�a��F���Ϩ6���+I=%[�{vp�v�������g��,G	ﯾ��^��Z���+B�]i�.�tH�9��ī��[�RC��\��؁=aFYL��;�����y&\�y�1BM^�X9���8�7SH	�[ʞ��A^n���t�9_I{���׹��0F�
�$���P_�����Ԗ�;r�;\HPx�e����I��Gu��}��!XA'��бx0�`�4	��:�dl��?4�i�0#���`g���M<m�&���ܒc�f�����y��}l0�*r�Fʞ؜!�toȍ�T"
��3q�-��]�]sG<�x��
��9,7�8#Pr��D1��|���~H����O� ��i5�+�b�=橙`�0(*#7<5<���T�3g�t�T3��p3�6,q)�E�PN�]k2#TWm5T��6RXiL��A <�E$Eq�궳�L��r1e���{�mǻkG��m#�8~ڗ��npvҳ,���[���r{�1�i��
I��N�uvRGيWl��k:��F�>ʰ������S�c&c��խx�Ekv[5e��!���=m�I���!��,�St�?�R}N�v	�[$RO��D`
Q
�D��1�6�E��������?��yZZeq��Pn,�OI"S_l�|�4N�4CD+n��k �gUU��D>�l�DL�Fˋʱ�)ai����GU������si`��h�T<�]��piI:n��F$M��%G��1�D'�H	�DYA�$����3�'�CfWp=H��S�E�5g�� C����e�)�e�Ag̉R����R�3l$$)�s6+H:�8J(�!�D�!��+wEV	�o��\���e��`;�U�h1BD��A���H�Wǰ)aӤ �2�l���Ç���_����?����͇r2��ز�rpe��$A�l�P�P��\=���χi��gA���!�ۤ�m�
������
��O������#�s!�(�=^Q�~ Շ��Lo�P��a���N��N�r�JOW���b��7�+�"�{'J���T�����v���՟[�=\@�C��:^֘����ꕥo�u��`#tl�]r*�ܸ4��\���n�p��$$V��g���t4@1\�Bc-�د�[@!��L�3�t�`�[[��4�؅�������r��������e#��ܨ�0��WQa��(2 �SD��R/��'K��̌D�i�O��Si:"K��������m�I*yLu
LJ�6@RZU��93��))D
��]f���E�ӋD�eyz �u�x� ���1U�P�**�O$@)QQb�q3J7����P�
���Y:d��XY����2�O��K�R��Q�*��8t���@
 ��(D!���&�vP�5NJTq��p���*�~`�`���+�rN!jyq�[#A�	�wTRd����Ip
�������q{/|7p�A�`{�Յ��
e�)�-y�	�fEB	��Uqv)@h��/�8��<C�:R�D�*.�6va2���g\���=J��1�au�7�<�����`e
��~�&$ѡ���M�k�p��jΤ����h�+=�w�Qb1���sV��3�z+�c԰w��;�P��>`+6PRջ#i�޸���`Q�hΦ�tEOP��&�n�z�$�(�xr��I��,��i6���J��z}-[S�Ќ�b��"DI�f�����I��	сtW���B��D��K�F�X�T[#�(�͒*J�WCo0�%�\�2
Ą9&q�_��<M�;�-����U0V|j�OAC}j�ڥ{m��oҰK=�Z�ŧ,8*(]��}Gc�9�8��!�
x3�KsBj��4��w��=�։S�l���E�W\wil�m�>���dgml�}�
.�����o���@��f�0�	�%(��� x�h�;��|Q��[�ܡs�;���3z�u\�Czaܢ��3T�DU^,��m��TLZ�a�F���ֽ�f�m�@�R����%��y85�rpm�Ȧ$c�R�ݒw��ڀM�_R����=7%c�\���FT8bƑ�4�jC��3��N(Mi��u��b��r������ķ�ҥ���R��L�?��k`�j��������A�/�OO<-Pi?��I��F(�Z���%�8�9+ -��.���I}M��uo�]�_�F��~?���	V
��8�Tg�g�т�T:)�d�AC�'F*
�_-&����%�L1$:�|P��"V�j"�*b��2u	��V��?��Ԯc���6�;�����3ϵ[^s	AmZ�%�z5m[�=B���?��|f&�z�0��c���\��y�5�}�T��g7��<�F�2=}�&A��X���_�xm��,����a(lQ��Y<~J�䚚q
�?�0Qr���񛖃�������e� T2�I%h|���Y#�NCD�6&6�S
�0��A��^����}��1(����Ŭ��W��ɍ����Ԭ��-X�i�.*�n��ᗰ�*��(�Q�*S^�-�b���3X�oE�E�9��?p�]��6N�w:>dZ��3`\��u5s��Q�%�k��.?��8"�?��ьXjD-�JÇ�SУR��D-�N9>�t6�t���:��YǼ�\~��O�[DL- �ק�g�n2��-V��x���u�Y[� ,<p���:B�\Iw�*w1ص��x@ D�X���dH��An"M�:�(�ٔ�N$�j>ä�%mS��~�&�;��(hJ�)P�Ws,hD�{U��!�q���[<�"�&6Ř���Pd�ha>�1��4��.S�P�_q����
�YDz��OX�?%�b��xt�Iå������I)ł��+��hly?�U� O��ƭ�l/�q
��G��A��d��e(%X��W�>YGS�3d-kbM���J7뷿�8�{��6�Χ��k) �h4/�)��	��Era�zW$�k�� ��=PT�<	Ǝ��^�	�J��C�zr��}���B	���ClB�X�{����\��\��+!8r�Em���Z$����h��waNH���$�c��W�#ڻ�5v)����m�Ӆ~�.��	T:W�����?bИ��%��=���Z0�X��`4��d.�f~`�wǦ��T��ly��a�v��G��YE���4�l��P��<�X�;�"h[�K�#��?'=&��7Le�kH4h+m��6�y|�l��z��,	����-�
�!
M[-���Wl�OJ��%M�s�F[e�ΘO��L�yU����G���=ݍ�v��@a�X�S[��v��V�e��h��m��2e!��"��$�X���Pf�AL���\��/4����A�����
���T?���M�^-5pja=(����1�vG�}�u�]v�b�ӑؓ
y�C�/ˮ��
.�Oԙ��]�)�<c��ߵf���k=s�ԯ�A5��T~3��h���R���y��2�pZ�>����<-�-�G���W�of�-���\������\t��}6�c���]z�������7���՛�N=���9����{�W��?���XĴf��٪��	��
U��Y$c�^��Fy�Rb$�J��0��
��SU>QI02�ʆ9��gi�bZ	�&�4nô�s��
��-)����xC��(c���K���ZZ�*���k�%W��+o.��%����b�
��
���n��E��<�s���tp��z�B ��x��0�^���V ֺ�Q�]�ibf�FJ4o���1	��
wE�>N�
@�
}K�:
��b�魾�Q�Z�
!���@T\�e���fo�`�X����+�_��2
�G�O�)��I60P`'���\��`g龖g�"���#��(��~�#�y�ן��z�(��/���|hֿ�OM/��˶lK�e���C>6���{�v�T�?a�����[i����"��\�ҵ�e��p�ا[���C�Gsv�PNQq�^guteB4Q<HSi�,l����q��g�"�PHDĻ��6]GE4��mdV�?�?
>G�EF9�N��ql;�&U�k�c��*�$����.U��q�6�))�)�Bc�¾�
������7[��e>*�Q�;Z�ʍ��jt���N?���%����|>����Lr<e�k|>��e�S��� �&s��!�bi�/�j�Q:G�5r�i�\n�ou+�#���1��p�p
ܶ����lh�9�r����g�a`Du	Q�m`�V�h�����GG��	�ғ���f�1h)qj�Y�[���زv=���9��������2j҃�,����d,s?j�I��g�w����t�W��R�>DUـ�S!�3�����{�|��Z^�T��Q0k�N-����f�5�l]Fez�r�J�����s0 ~��A*B�SО��ʉJg�C��S�%��h�(���0* ������Y��g�jr��b�#V���x�>���
}�H1q�
$A8Ë@�4�9j�<{\���|�tv�QE�o�N�-����c
�-(	(�¼��tjE� ��4�|�Tu��AZ�|�;*�*1�O$���Y�H�W���m~��z�2H�{�V��,]O���輿*b~�2N�����M�q��4���F�Y��
�r�QW��?թ�4E�H�3N���F��
�-����U�V�`�˥�F���z��R�\cp+��0-8�b}H�LX�'ـ��n-�&�NL�$��ܜP��)9���ؠ��"�c]��ɱ �P?(5��LУޑ�e}-�১�g
��_d�ځ�4���<<ݍ����@��bcv|�V4�;���ſ�?�y����-��K`����nw�;��x|Re�9��@��/m�ڃ�S�祖׺v�	W`���t�C@�m�N��}��_��?B�Zk$���F�������@eg0ۻk�f�+l��Oi��Z�_Tr�OJ�u~�q���"���#6�7�^f'2�f0�.�:�9��C2<��74�f1��
!m��H�C�<e0���VW���@P�Ӯϱ,�A_H�>�^��3/��1/:-C;�~߈��(�~��J�=�� R��q5��UY��S����Κ٘[��SC�����ZQ%�凎\ϧQ���ab�tN�h,�&ez��%�(����qT&���(��""F&噮I%��Ũ��W��~�#!#�5�P%����HIIH�a/<x��u����jtvŝ���Nw�e{��{o��%w�5�m�>���*SM��nR�Ys
���(!�H�N��	��=����&�krg�M�ݼ猡y&�ZPB�pl������?&O_��9Y��|��*���LD����`�g��N
ž`���HrJP'uIM�t�ya^vs�V���_�V���#��ZX�������+�zlQB#\$@pjg�?*��
��
�C-(��Q�����2b��T����Q,wQ��f��Ł�㹨�W�,��U�:����OV���M7$"r0�5����c��c���O�&*Ʉo^p	�+/-X���M�Q�`ғ�V?�{A.3,Q�C������ˁ-
�e�$�WYi㤱#��~`�C̮��d\��(�L��$[��~bw%�B3u��l[rZ�ܴ��4Op=Ĝ��x,���+�o��������\Ԥ�����,%�_2*r�@���|hms|�ucqy�b�_���0���̛�H6��⏜�&{Jw+�惽�U&�!'e'��a�N��8n�f|+[酋9�
������y����aQQ!��Z�[[
�_5>_c�,ci�u�s{��l�дxׯ�,?��NK�D��y����Q>a����L&M����0�:�K�K*P,/9z2�c>�@��D�UR
�J	[�����	i"���"]3���Ƃ���3��oZ�t
��Ep-L�-@�7��Z�2*OI�(����ô��s��@yu���V��K���e�mH-�����p�$'#N$��ȋim�M8��c���I�Z�z�w�f�$57�`�/U���aje��>f�?���i���*l�bI�M)�5�5=��j���x���/ުq>�@�K�%�Iܫl�e,H���	�X-	�W�q�6���`�x�G���-��R,��o�UVT:(L2�}+-j_���Tʶ�*>#_�E�)W�$�f!�Dc�`��4��g��Js*dV)4���C
�
N����E��Y4����{0�P��+�Ց14�{��Ƥ��2"Ӥ
5���:ē �:��``��XH�����ի�����xn��_�9s섾أ�ɡ��9�z�ڲ��f� zj�k�۞��<CM��Z��h��辶<���m��M�<�$�&ԅ��H��*|��ډwv=���ڠ�����S@�/�fK��ZH�V�'�����Z��}п�w�>���4)�0	GL_��URI�B�Woi�矎*G�q��V��m����>�9�;g~:��3+���<�t!,%��^l�`܃x}�{A����ߋ��|A���nS�(�Gmv��7G����ne׽Z��$�^�[�ݥ}���a�h����~	l�U�f�vQTy޴����[>ݔ���Ux>3�	5B��y��QV��}��C[	+�mw]q�!��$�	�w�1,Z����j?�h�6)�V��.7e��ЌK*!ѝJ��~G����WD4,��%嵋v�Ѫ����F]��$P�(���L6{�
;���c���	�}I�R��W�[G��-t]GHo�-p�L�/��=���^� %%s+ۍ:�XO�4�ܒ��.�?f�NT3ːH��z!�H����0��3''��ӷs�q>�'��z�NP85M�Ģ�Je=?W��J�[t�Ɗ%��'-�,�$���I6��>5B�]C�!�p�mD�YJz �K-9��oFD퉑�w�l��5�v©|^��L�������$H5g#h�͎k��^��{\
��US>U+�MK�f�$�`��A+|sp~p�i9�w�,��u��Ӫ��4�H�~M��⇮%gq��y7�]��A;xE�F-�6�9e�_�}b��3�U�j-�048*g�g �{�oHM���L��7��o�|]�<����w�G�'��P�{k��nƼ�dK[�Ŧ4+�s��g6�s��}
W��� ���Q�\T���ɽ�ǘQ	��ڧp���z�;
�DǢ�%�W�5`2b���K��
4G}�T
.齹>~�U(N�����v~U.h�>���tw�'>D��v����PM}�7
����ٵ��eq)�{/�F�;��&	�X5FYy['u\������ I���'���D��<��k���QaO��w1��z=�ᡔ���M8t�<�0�"�eMV�G̦�$�t,��8F:����I�n#�`�rM?�9&�2�ѥ��Kr�~�]sq
�{8�Uh�������-2ٷ���W]��t��
%���M��ɒ�#�sm��mّ��s��O�;�*�v�BiOBG)X�R��ݾ�q�֓��O՛�3���Uv/��v�ӭ�M���or\��#:���V���R����8
r I녭K�,��OsX;�	���
c'd��o'�֗��Y�BU"N�,e?��+s�f��}�-���}��|	��� �ꢨ'��3z�$���U
�h5@/�t�dC7���i��r,�^C������Ƹ��6FU�L/G�̊����
^pvEq��wѢ�ݷO��*f*8a�
;�~�h�W6��k#	E�П�Ҕ��IN�õ���Τ��af1�y�(E�S��ZE⢘�h�>���-��ռ��,��`�^����^eNe�!j.��ƙ�s�	t������7T�Vj�m��84L����!��5�~^�_u��A��v&ZG��JbjޠF(*�M@�rԕ|�KV꒽��b)�(�_��!��rQP%���pX�эԏ㙏��VF�q�#dA�l��b�����V,�.�r�!yKE��u��o��8�ڧ�f����ֈ���D`�
S�'%������E���"hP�-��K�1����.kk����x�/[j�>/[�H۱3";MFӰH����T8\�ó�,�$xt�#C5�1��{2Yzlh��f��'����c�-���bS�^�az]�U��l�=<ٚ3Q�CI&�g�����鬘�ʴ����R	S�6Q�lj�Q�1�Z򛮲"��D����8���#9������Q��7.,6l�rO�;��@�`��C9ʘ�#�vv��RW{�t�����i���-۔[�Z>� x�Oa�xiө�M)�k�k%繕LZZF{�I�`�N&m
�&O���i�.��]OC�����q�� ��Z;ln�����w�����p�,�--�F8�eP��iV����Kh�3�s���"�<9&��1ԣ0l9ֈF�`e�X��!8��Q�+���AWD��:ʠ�E2�X5��
	��?Z�[#��cD0�y�Db�Y�\f(�qj��M�W\�P	a����>��[���m�����.I��Eٹ)��ȶ��o��&��*�"Wc��%-+q��߹`�$%�M�S������R�Ů�z�Y��{��~������ǝG��|�������F��&�%:���}]�A!=�@��Ak+:��H�LF|u�l%�,�rEΗ)��1K��W�z̳�,�W��К�J�|�����+�g��{:^�M�P�ޯ�4�ጎL�-���#�m�L2l���i�.��,��u'N¦k���B�(�-�׶N����f�^�^Dٺ"��y,����<;�^_�l�\~�u3�p8�W�U�_8��	���]g��9c]�sF{�@ץ���	(�Ͷ\���P��_���!���N��;1;�c�E��Ń��Mq��Hg�j������yJ�erB��X�шd�Lҳ����6s����زk�1J�rb�X�i��->{~P(�!�8�v��B���<z��Rx����Ѱ�^�ؐU�������=�fS?̉z�^��OX�=X0�79W����@{����,0�j��y���-�X7���|cñ��Wd\nZ�_�@�7W�tD�a
�`���v'�5� ��jU�W�V@�ޞ��f���l���S�;�d�`Jv�P2C���m:�K��QA�aC��]gR�`��^���l�0K�c�`uTEv��#*Z��.'3�(3Q~�N6'@���y��:���{*�S|�fR;>6[mt�*$a5S1��X��Sw<�X�����DQ
Ң���	J*H�	
�_Z?*w���ŞEr��:O+�R�w�&ȏ媱*�aj�d�r
W��c�?�%�
Q�\y�Ú�mNs����Bq����n����$���"H�\5���-'�Rm���#����݃o��U� �ؐ��T�	I��=�5�_�n������#xZ5��GU����o��1l8v�@Mj�'����������m�l�3%�9(��*�Q�!Bd;�/��܁^}�)��#Z���<�0\�4������:��=oO;���5��z�l��U��������3��읞^�ț�
�iD�-\�.U��>��#�u�cg�LuVUh�g[�BB��^�b��Ip��ֶ�����z����"\���>��
ڃ)�Q��Hq���~�O|%����11>�v�v�3,�F�ش�|Bk:�p�5f�A�
	�ˠ��r�c2e����}yr��ZK�5�qG҆�C�TZk(j�#��:*��*�R�"5pU��b��?\�"����v�r�Z(���]���L����(yo	�G)�:�4u[����ޮE!���w�o�j�Y�N��J�Bs�kq�~�69���7�w"��JݣMx��">�����5:vR8��C�A��hga�J�-x(�t�W��SQ!
�G�wW9y��`h�q�^Fc˿�~Re�+.@%Q�V����ɽ�\>Za�2d��K�a������@a⍸�`=eC%^UlϹ�n�u�
�z��E��׆����3�G"�z��i�[
^���1���f�yC�R;�C�湘fg�A�%�
w��M8B���(h�ػ��؞E�]��y�(�ѕ6m��n����y+y�
3�h=�bn�}�Kn�Ռ�Ů��s��({ı�k�<vx���.�����)�륄i�5!���!�#��Z��]TU��)��Uy+W�j+9���,ۖqe�1l�|���.:�<9�h�l�}\264"U��(�>�]q᡽E.�9�ޕ�ȿ8�ώ��}��`���Kv_=�ߗu�������PiRνe�H��|8H��$�u�׳k��H�h-�J��5i�O�٨��×Ó��(ȱ��i�Խ~
_j������	�����K��ۆ ���[�Hds�Tm�����|���_|Y!`zʄ	^6�i=Ҷx���n:��P/���l:FH�h
O�)�܍��/d�ю6�M�k~����2��
E$����
�t�	���t�3���^�@.�e�v�K�����D
Z�2����;�0FEW$p�~e�?>y�i�G3,
g]S�H�>��
7�n��z3R3n�Q{�nW��,���=5����6	���
&b�%5�P+�k3�E�a�����s��\��Ga���o��r�`i�{����q�S��"�o_�s��7Ʒ��wρ�G#󻤘1M0�=��� �wҐ����4f/
�6RMi#jD]�+{uH����}�p�mp�B��?p�p�J��2#����C�@�M�s�T9IN� lJA"u�8�M���:��|	5���TI�-ó-�y��cg��-_!뱤Ǯ�;��
*��{ek�e
!Kvо�|�Ɗ.��5����b˒�p�X�k�2V��=�Y��[�ۑ�K��L3{Z9����2���p�f/���i���D��j#R�F�B��؋��қf-�H��s.���z#T4�@w��#��9F�=�V�]>�i��-��?��uѸR!e-�%M�z,J�$4���
@�MTǘ�����+�y1 �%\�(���׳�E�̤	�V���zg\W]{0�V��V��XH]�4l�9�.MZkSE{t0��qf�g��Χ��!��H�������� NU���� `�y0�WΪm��k���q��i�kv�M7�Hp^i�{| z�7��9��^�"�4CD�`�%#s9I
4qw��^�}���_!�w槳o,�b�7`�p
�P(XO�T/D��=���cO��@�����w�O9r�&�{�@\�`;@�/n; 7���eOZ07����2眿/<y���S���^L�%�^�2=�ۛ��t<���%�氣͑rL���\4�����
������ZQ�q{@4��iG�9�)�4�#�Zju(1h�d�k�&�UA7aʨ4���y�H�!ú��7���KN�y'GN�.��J|�b��,(�d�Zo��3Jk�͑{Ns$7�:7Z�V�rO��$*�\z�7_��1��lD���/��������J'�hqEY�����l�o޻�w�ք
��ӳ{��A�i:���?�
;�^����;��s���X�v`N��i0|�s|\���%��th��ucҗ����cN�R�u�`oY�-��	�#����R��~~n.|Ҥ�?=ͦ�E~�'�&�/?�f)_��X��9V)�	�XD�	��t�b�$�O*-�]�Ͳ�z�.���{(W]Xo�T{��qGsL�ɫpZ9\k}������ڋ,���\�*�2K�;�{�>�����C��sx�5?襗�S�ֹ
��n&f���m6=�/pC�y��a������������7MZ�M�m�^�I����&b��6eM7ݚ.h��x����x�[������5���[���?>y�������_��o_;=���#kD-��!{Bq@�9�y�{yn�-nOGֆ8o�i�P�ym'�IKƈ�ZR5��7�<��k�G���L�9뱿Ž��ƫ�Gd�K�v��E����@{1Np�b���;�4��ʢ���|ԕ�w�~�J^e�ڮ��uI��Di|8@� ��1����҈sHSIv<:<iR"�}O�V��$��NI
�ĕ�*�W�	u�ĭ�xښ,�ۅD��
����X�9��p��k�t>��������X#X7�`f�ȩ��G��t�Cp�w�~��t�"�*ߪuZ��Dz��(��h2�|�x�7QT/ZEi�%��ˉ��`�:Ĵ�Q�$sD�%4��48K��-\J�3r^����`���W���>0�!���쯰�S�|+�T��
qQ^����&̧E���9�? �����Ъ�7���ݙ�HFx�i$oQ���l����o�$�m�=�L����Y���K5q찑�6f�#�Z�̀��(�M]%��̬΅�n���<����p��Xs�L�E��m�i�S��b!���3m�쫄���I��S���
�v�#�bw��\�
��m�B"�m�$'fd�`%%��^_��7k��_�7+u�����zc����<'$��
	*���!9��gЁJ�l�mR�U���;���=���dY|
ܠ�R ������p��E{��c��Ӷ���$ՋKݜ���7�`�<�Ԃ����4�b<�IZ��{	٦��p��� ���������װ���ioٖ
�;I����U���.��,S(���`؟�����^��S*�ޝE���=)�Ej*;>�g�Hexj���>���^���]i�)�1�)��~N���$�XP9`O߭G�:�-�q�EMҭ<�y�Q�C��|J~O*�ZX
᫿?����R9>./u_����Hm&'�� KG:���yF�FF
)"1�o2@I��X:M��|D�\&�mF݇/�&P���R��	��~k�$�:�e����$�;��6�wڥ��)It~�F�{4��{%S�K�a�������E��o#�F�*O�f}e��Q�I���|�����,��Zu���;M*���Ⱂ��O�Uu���=��u"
��k����v���
�;�N����E����oŎ�?b��`d�oW+�s���R1[�R��0s��r�V�GGe�e�J��HwL��`���Ȋ��Ŗ�?�#�����
ɦ�ͻ��+�1�T�4.R����p�6㽒��8E.`��P3��0h�Sa_^�. �;ȶ�w�V+HW��B�Ɂ6�5�0��O�qsܐG2�2�WB�s�T�?�Q�喪P�6nWK�E\Wt�K��艑�����,�_(�%�r��t=�OC%��J�f?^3��mw�_ 8ﷃ}�.=��K��o�m�J,𤨈��~�����'��(�g����'Ob�C���V�䵯7�y'��U#f�n�j����U���W�]3��2,iT��?SU�%����+"�������x��Զ�ޮKvBKr�k�I����{�+�x��76nAk��L�e���!culC��y��
�=�J����덤٦�5�z58��-��0w'�WI�fPdj��%s�"�V&u=�_^�d��n�sf��ZR���A����wr��"��!z�w?�����+2Sj��kޞzc�1�ҟ��#��
ׂ��������&z����3�T}��/��ı&��S����javX�6�f�ҵ���lQ�g[�#����_S~Y쨝�2F+n-}��c�_K7��	�[��(��&e�]X�
�..4�BӒB�E��s���㋼KG�HFW~�i�43mz������bS�O�R�u&��R(~�4�r�l��S�K���Y�A�"�n9n�Jf�zH�Ҿ�+���/��}�
�%	
X�r'O8y����)��
8�o�Iz�l<�]+:�ҏ��}�-�]`��R#�Z	���5�\G�?ơ��A�n��}�g��7Y#x���`����2���y!�Q�1@Ђ�6lƬI��;��&��bO^��Y)N�P��P@A�6(�H�本;l� �m�� o�ޛ�Ny{#����>���h߯,ЊV�����+�7��Du�>H�(	�ux�!/M<��?q�l��3��[�����O�뫙-z���I�}�o��9���t�_EJ�`���k\|ͺ�<|�i��nS�l��E\x�gp��n�1T�M/�����v
�Q���Bi����А�������z�z�W�ĹO��n1&�����+1p�íW����Y�œ
�!Z&o@�d��
3\X��i
g�4oI7nK3��@��������z>��Q9���t�h�2�}k+��/�n�Q��p�_�Q��J�����ף
��Kv�X��(��q54��(�K���"��0į������3�F\I�	��ͭW/v��)���C�1ɸ[O�񟒼����Dݭo�������:�z��o_�?��_>���ݧ�W/v���o��_��Q��ϟ}�����?������j����݃�/���z�Y����>��o�e�7L}�W��}�����w/���/�^6�����J~F%_����r���_���
���٣��w�����K�~y�]*�����"���|�a��we7��U[6��ۧO�/����ۗ�/��Tl�2�"߆}<�]<���F�\){0��-y\%���k���T
aĨ(�l�u0��
/1��v��o3�LI�q�0�lYBrL�ߓhk4�^��2�8��I�G�`�f�Fx4;�U���G�Y��-A�p�j�ք�x!Y@����*���軍���y�s�M\"������(�d$X�{����
)ܥڨ�sٸ�R1�Y����#�4#��;M'���"ƃѸ�N��e���d�PԮ�f�^b����P�歌��ς�>|ybYp(�I�����S);��U:�X�⅖y��G����C�~.�
��_a��kAq��é��;aA��r;%]�$T`���r��Z���u�]�D`؁��FGp��)��B��c����d�WH{���J^\�yf�Q�N
t���G#1GNɌZ��v4n8^����P�Z}m����Ҹ	���.�o��ɜ�M�U�C[��)�x�$���-���C�o4�_A��S|W�MfqH��+�gt��r���-��z�79�J�[��ف,�j���I��@*7�DhC16�>>U�K�����JO�����{������4A�*���c�7�Po`su����g��l*��g�̼��杏�+h�
V��RW#I�ҠR+h�>����v�0�Ω�[���ͤge�a�d�`\k1��}�A���V� �w��hɀ|֟�|�䊲��~�c�I�$�-b��5,-��,K�z����Koq��+���Y+зrRt��a!)�P
�����JfPѼ2��)+s����Ю�kz�5ݬ�%0�Q���B"����Ǟw���q\��,��Yf����'P�$;O�1��i$:%�1�6l>	Jj��@IH��03�!h�P��L�MsLr�\�(cTѩ�TȵH�vh��dX�L[h	緿K��3������sn��I�1�n1��U��^h0~���~�
�_D�qjV$�K6�eY9L.o5�dO當������-��X�,�n����ϥŭ�[K6X&yt-Ws[k�oՍ��Nt��ٿ���L#ey,c�^�
��[6�]M��S��Ж�=+��J�E3V��{�|~�a����T�;��e��Q�ݳ�d:�T�n5K������J�fﰰp�A���ϸ3��V:g������,�*�+-��Gi�@WjOγ$�؀�#I֘�|��F��Ll��-ї��#@V�~�u����nr\cl
Dh�Nؘ�J��pļt�C#-1|*���>1��#�N��
��	��f��r��PRdi˃&.C�����zK����j�t0x1�X *��I6Z�s�KP�1�d����F<��2�qͅw���`��B;��,��������A������K����B�e1�!ch{�����+fvZ���w�%�޻y���܂K�(^Y�/�F���F�j>�A5[�Q��8��f!!�~�fe<8|���6�G���5;�R�V�Tt��e$Xz�˝-���X�VrI�Pƺ��z'��k�i�����gJР��o]e��+�F� ��e�F�;�UsçS,7xR3��p�`Z	��Gaa�Cx��`����,a��)����!i��?��c��{����7�2�8���*�C&���%����/0�
�6|�0�V��L�HY�wUƮ!��*�,|ii.�bV�
�{��<����n.����'�j��x���+X(�7m��K�*���{~kټA�ϝ85�M(̜?��W�PFc3��X!קtf���,�%2��i�+�#x�B3w|xTW��J<��4Z��g�7/��|J�(4�EUp�����1]�l���w�̳�K���C|m�;��� ������38%ѯ�3�?O֣#��a�D�=Y�xt�ė$_N�4�zC�8!�1~]�m�>�T)�i�ɯ�O�������o:���'�Tp�}�N��T�7����Mg����[<����|v)1&ꎝ�Xmy+a��%*\�AZȪ�'�o\�'�@N/E_bq�y����� �x�Lj��L�Tڛ��� �9ů?��ⲉZg�0B埦������յ*ʞV.�*$�.����l����"�bh�z�
��
6L��%�/R�l'�G���S�iT6r�D���
�Z�߫�N��_�-����#�Sd�,��_Lѕs�l�
ym��Sh����A_�r��W��F'�"����tz��o.�[�X��
h9��c�(L����o�e�U����{�z����5{@�'99.%�S�Y�ã�Y�o8�'��61�e�綽�Ƀ�\z�pҌ%�8{ӟ��@4�3&}�䰏�G�F8�Qs��㚃\�U����a�j����a%����a��֔8�]��,�b��b��-���C���8�X.��w#�@�2[�Eĸ���#��rs1O�T.%��z���Q?�O�&Bi���
׍��m,�▊�ᕌa��>��݊nx�Gg�$,E�����^^OF��5H���]4���h��B�Z[�FUB��kM㒩L9�
K.;���7�d#���F�-�鶼Fn`�FE��^��&�$+�ѝn�~�\[��'v��bᓛG�]��Pc�]jpӬi���:@����x>%�k
�U4s��t��y|��=
/a����Z�"	�c��
�˄�6mo�O�
�3#��1ՠ�c>����T,Œ^jY�a�Y �]�]���5؄>�
[��?)n����>�uPB�&��2�rה۽T]���n�:ظ�����)�.ڊF�6pXh@-GY��;����ʍ?�o�˒4Fv��m�:!�	�������W�+�����k����K��I����z�i�|��"t����x�'P�֒�aa���ž�
ŃGgEqVO�$�Yz祲�1D��_���/�~E�j%bV�fQu E���Z$��͇SXX]����Wxġb�Tg��Y]�J��mv1ַ�lF�`�)�ys�3�??��2I�&���;���T��ϪX�9UF���i�O�U]Q�.O�D���Y�
��%��4�Ga�+�9U��������g��_|�(��a�V�/<�r��VϿ����b��R�j��P¼�,q5���|a��ew�n�QΓT��.��DO�V�dR4�����M�D�z��Q�t�>!G�f;x,�E�,�]�O��(s}۠ކ�_X�x\�Qq5��y���[tĹ�-PoA1F����d�$���K�}+���lGO�t���M���gQ��=�4����,�g`R˰$�ɸC��֋R*t6�(�ȁh��@�(��+�)R������	�u�D�f�����a��|�f�0��v��"bv&xp)���oyp�Hs�D
x�m�-{�ah��z9Ʒ�a��р���[>6'�qr:�R��h�y�o����y $ofre��}���Ʀ��[���ٶY��㙽*��"����^���aD!��VX��{ ̂C��(��hP�͇aۅ%��Ob�dk�@�.Ƿ�m#����hR�߅l��H3�0��[d�/ب�W*����+���(��#�I�ˉ3�X�@�W&�Y�P���Ě�Z����Hv(������%���f������$�G�qW�@�%�?n�ބ$��d;���Q�w���8>������R0�����}��t���o�x@���^D�hl�O,7���r��ʤ�?���ϛ�T�(�}tnb>���[j��Qس���3�1���	[��]a�~�|���c�p|t[�
�:�M�,�U�g���u��p��z>�.��t�q.�|6]�ۙ�oR�!cG��>Q����_1�"bHSbⲊQ���d��lp�8����g�>�&�m	UZ�z����
rx0Z��1��mX���eN���2�B=���G�>&ߤ��'Is�W�I
#����Ho=��Sq`��1����T�GR��E�@=V��d�F����q��,{���e�Յ}�.LDb;΀9�(6���QY7DH��.�����A����Q����W��B-���@��w�U�1A
Q�sJ`�+�7���W��$�_I���"L�$���{��,vU���vJ�Q�eǂ+9P�e��_W�`cQ�c n�Ok��{���/w�}����ޓ'�H�}���,y����/_<كﻏ��P@�����?<Sf�y:�ن�t0_���ݗ{ɣ�������}_^�L��q���ϒ�𯂴�!��A�t�~mR�u�|��*��q>�U���PZ��w�.PmT��%H=5����,<�E�[�h��Q�T�6�O*˃1�p
&5�V3�	�,9�]b�f�_��� �Dqt�1��k��,��zi2|���h�x�;�Ua����R�pS׏-t�!�5�����k����4���#F��B�Ǥ���H��Z���ɧ�:,h���z��*��O7��]�Tuc��v�Ԝ��c:�r������oT�P�*����A�PU����T���H]5�f�:�=�����x�0�N�?ץ�rX�|���=��}Q���"�*������/"h�.��2�[1�L��K��K����k�P���{�٠8�P>~6�0��C�#
j��( �AA�SI�+��e3HL�(�������<�Gy������RI��������p���js6�^�;��=��@D�m/ZțS*��B��N&Wu��X���D:����U���P
[�cX��#�Jd�u�+
����Ac� ؆ո2��i���BԹ�����V�|a+����ɓ��H�3�\���"���S�ː��9]��5�}�&�&OMF���pN]��ڹ'�F��k�7k�E��O�)4ً;��D�6��Tb��~�+����N[�ɫ�Z�yi�hj�n�βѬ:��� �G���@�1��%4��b��*�0��p�If��M�h3y�H�U�9߰��!Atj�+פ��ÕT�O>�t��x�$$�H�'&���Ɠ��^�d��Ȥ�6�&w��d�HVjA�i��ƶ��"Wr�(G7�GZO���b6Ǯ}�o�5\�f(��xi[��Ú�&~��#��#�j jM�_�Ok�� �����V�U�zz7S��E�]1�7�k�]p�B�
Jc�6cۛ6.�����m��H(W��V�'�s�a�Tl��-��a�<nd��Ԋ���S�,�w�����B�J�$HUJ��ZZ���I�t����g����i����y��Ĺų���*F�K��W�c�T�$A\!0m|~K"�jo�0�jxr�=�F���X��!���{�ޮ��+�2:��EC��̶�J0
$�ӫr'�\]a�خ�o�o9���am�ѨC�z��U����U5�b2;��X�����^3���>.�>B�c�4[yY`d᥿��'/c�p���Mz��=�T���f��$0c||��c��1��wa�w]�[I�E���������0�K��ٴ�7���ǹs�9w\K���&�	�Ŵ��R�tp�^�B���Ю��&H0M��ó���ML��p`����c��]����7����2�]���$B_d�w�nւ��ғl`#D�gl�2�$�Mw	;0�`�s�.Q�l��
���\Y��?!ߞs�5�'Py��BZ��!g����6����.@p��TI ���m��Q����һT��)��tV��l��џ�{V�h&��!x|�X��pF;lG�V�J���m\:ln���h���R��A636&��bB9�:�J�U
�+�i��%��i�a���fv��n�Y���	��QO���ң%�~���s[�ƞd@��Jd]��⹲��i�IbC�{���	��e&��#�V̠0��g׷�P�eO`_��2�3KNh(L��e(z�46Ye�,F>�[7�贠K u�M��H�K���1�Ds�:����q���Td�pZ�eR����j���Ƈ���܋���-�d�+
Ξ��nRU<�y���Y�mdD̓a'~�r'�������BF��J������4M��de�-��q����gG�m��e;����:|5�؇i����|v9Ȁ+��1�0�$�p���ߩ��0�(��HTn�M��Rv-�a��{����_p��ei��Ԗ��Pv��6���0j�Z�'VX�S�EU'��W1�)���§u�m��F�6q^�b��I-�[a�Hנ�a�=�F�(�<t{�.�=��;��杧�?v��,�л�N4�c�����oSM�K�&@���(^���*j9����O
��I�!�@�6�l
1ˆ��}@�&�毯�$�^_IM
*h�8�F��D.�m@�M�:-�TC^�U�.�H�vۮw8¯���3��c�B�z@f*��#Nk*ct����uh��m�u��7"#�obG
�5�^ӧ�5�s��6Ű0�v#�G5W� h-i��ڑ��R{����Y��S��F��H��C�@�56�J��"����1Mh�.~V��ecr��(|��LN"�>K�38
�򲼱l;KE�л��U1���y�Ҏ���X*3pKWV�ܴĠZ���F���A>n�=' \Iv2~KbuJ�������t��-�u�KT���+���q#y����
�4�=��9X�������	���g)2K�@/8��B����stm��)��A��װ����{l�n<�C���x�u�h���×:Ow
�}�t��^f�j��I����xJ�5T�8�3�s37������a�P~�y��#�a�D��*����իٱ�t1��WaB%L3O9ViU���s�n���`��<6��z���\W��R	$hͯ����������t	;gh(�ј�'�:Y��t��h�M��IzFi�٩6��Z�sw<�7�9e>B�Ƭ�d�b����'�������,zx�8F�[��7�6���!|%3"I��T���To��Un"�Zި��C_E�,Z������1�W&b��4H�9(����+�
y,���e���[p�tL����0Q��d��ݛX��yǘ��r�_�Y�n�)��5>߷�m�;�xrW�ԘWu
q#:m>8kL���]�Axj��� :yFQ
$� ��u/0�~6�JV�j�B#��;\����h���4Yh۾3U�v�o��|&�M�#�
�J�W�N�a�3 ���j\�F�`a�Ƃ ����|���x%l;������:��ڶ���+b5��l��"P��\���,�.�+Z;�e3{V��$�K�r��6�M���D��>N"�~�J��%�MG<�d��D+�<%�KM�����R���ʝ�?����4�h�͛�>(�1�]i�٫�^�(��ɶm��b<�Y@L1
��%�w^
�k�^�D���b�d}1y��X06�Y�gt�h�R�
��,2��y�Y������>��a���W<T�AXlp��z$�A8��&�Ux;��f��bb(\ة���խb����~Ⱦ��K̘%f��!�K[��*ui:m��nRk7�i+J��\��܋+I�J�UFh��N�\q�@͏Ir=��	47�� %�
�#d���**��j�@Qa���_c���@��c��r�+����ò-}�–6ڲg�.�k㓟���c��.V�kh�=�#܃��T[�3�S�8��_x�dIL�0�c�Z����!��J�,kJ(��̜P�э��|��|��rw�Û�)n�O���Y��ҟ�|=�箕���y:�
t�p,�n�
��?���LA����5���9��݆��r.��!xE��|z+�%� 1e����z;����>V��|���}��AK-g��j~Q���V=n"�s�k]�<���D�O���'�}-�+�lD�%q�����Y�i���нe�M�6?�o�:�t��gO�{[Ӆ��fGl� h��c�N]�IW<EwBz)����m��?�(+*4o�?𪇚9e<�-g��F�FnK�CvԾ�{�#Gq3
�~m���Rù���v-қ[�A���B��ﰚ, ���6�'����m"0�$|b*M�j�K	AA0�S���,��e3��f���J)���=¢	��;@;_h�͇R��;�(6�&�(Q�s��HT�xԨ`-���D�h�є8���lG�f�D��sh1IO�ث0�n\N�]2�y>�s�i�o��܆:�.�g2cukrJ7�6�8��O�*¤��2| ��}��R��Y�����+�$Z/�*�|�8����%yuҘJ:�2>
D�1��<���뤌��s����6�v�7�l@!9���}�
S���Hz�<����&d�?��1�=���M��5�G}]��e���i(�������gԢ��r�ϲaҝ��y����Y0�/Pn��w����d�b��u����V��ޏ������_�ۧ}�.\�w.Gs��s�R��R�����ȉ'*W@|2��/���j��p���Um2��=Ynh�ԇ�e��.g$��'�D��*(��[ZR��n�d$�	9�~E	������`: �XF"‡��IMB�`�WIH�h������V��Xe��J"���|�Q6dh���WA�IU-T=R�O�I
�p����MfM.]]M�u`�qAc���k�<{{�
���5l�z���7�F��Fl�ސ�����qxӉ�Vm����w�*�q�Y*����r|�YU�޴��TۼIk`��Z��v60dk[�|oZң���ꮐ�^YJ?*$�AY�)1_
1>�/�/�T���K�?Q*Rq�J�(|��e�P��bU��|�e8��2ͤ吳��������ڒ�BAv�X�h%O?V��"˜zd$$+�9>�\ �.��/��"p�M-���K��X@���3�|f<���B��ql"��hrB��()�7�Ox/V��bt�%��ï<#M+s	
�Qn=v�Q�i����Z.|�[��F܁/�m���ֶ�eT/E��0����m�D1�A�� ֚�h�j>��C�K�`|
&h'|�G
5J
�h�\Z襙����U�cR�teѮFM��/z�
�^��R]]E��H-���� �0Lu���a��m'm���,�;E�Q��\�ڢn`)�q����BFK���Yx-�N�=׳�V��ɼ?�� :�i�*d�9:�}b�g��M��Ȱ$��B���Q/��Qю�s�)E��Q��U�+�B�L/R����uPI�D�yŻP"Œ�q
R2_ ���Ctj>Y�tI<����VA�]N�|QC����5Zn�*��h|a��p���ބ��H�%��uW�D[[O�g sm*�b63���
B-:@�TA^����J����d�>�A2�9��P�3�u):��ʴZP9�����u�''��ߒ�j�e`N2�
��&�d���Q�� ��\R=�	��	ni6��������d_"=�.
�U$�_��F�9�w�3��f74VV6�D�����f�.���xS1���s_�⶛hk�Ę""J:?��aHC3QY��Uv�����M��hG�%�+��KA��R�F�4�)�q�@��E�⽒ja���OgP9���u�!M4*�8�614.�x�b!C��p��b,fh��K��Ń�^�/��U��G�E`�,Y	�n6�.[�l^1>�$	0EJ��>�m(�
 �W��z��I(���0a=���#ʊQ�����x�K�p�py[/>7~n'�t< O�53�U�����膓�4�^&�7|u
����J���s�s4e�p�
�|��B'r�:SZ���N=_tV�O
4�xn����W�)�P*ؐ33�x���4��|h�k7Ic�Ƕb$�:��-.�P��gn	8���-;��?��C��H�	L�o��P	�:�Q'Ó�#\�b�euW�u�
ӾZ�L��Eyߗ��ݠ���z���H�}Vq4	��<LX,$C��Z�tH��߳3f��[V]�˂������~�H~KӉE�؂cQ�7�0b���¡8B�}�>�
1�A'�����Kc��pf"�,t
�ģh�il�qk����y��
���1���%'���aB.
5=>�����;	n17��؀�"o�4�1T[�y�J�I�X��4��o��?���� ���ƧE	�;�n� ����QX�L�9��>-�[M�5�`_�u��*��h	Y)A2:Y����8��ί<J�Mu��?l������X)�F#A�n`��%M�'H[_##N�I�d\���a����VN�&l>TUP�Z�:<�N_p)��p'Kb|���"��%�P�͡^�/�'���7������mE-`t���\0�ِ!~�F�r��8@)͙y2d'��k��Zh�Y��>`'�y
��sT�5�ḗ�YՀ__�$�+3NR�I7��O�R�h�Lj%�)�~m+�Q*u�gƒ�5�j�6�t>����kU�d��w�+�4֢G�ި�'�	�u���?�J\�=�s��|Ե���?�	����DS���dcU?���(I��40�n�N�Q�Sr�K�:8�����iaO>�+�a_��:z�0��i#�wGf�?��WY�uJ{�]%�U�Gr��c�R���e�S|�T��5�N�0�X�)��"�c��w��AL��z�^�,=��/���;M'WM�B8vIw<�G�����5F�$��7]�d�{BNJPq>�*'�� �T�}��Q�%��N���(��p@�`���1��lA05�w�P}��"�6�+��F���������M���jgʅh��x̉���"��x$��?�g��we�p��r��7S���WQ�Ɠ����4���X��ؒ�;p�6���[��K#�cZ�������j�^D��w�Իp?�W~�x�<�_�MP�W��f��f�?3�M;�	z~s7uC�a!*GiFbWw�tI�5�e5��	DVR?G\9�����O�+<\2�t(�n-V?�^S���B����f�����a��fV)3����^�LjՑ�!E�����������2��ԈA��������4�w����Ĵ�H�ފT���'��R(����d)��2u@�FZS÷�p^�҉.��U���`dTKڮ�`�Y$��E1Ł����R��u<���r���5Jφ�4�lD[Z��x�x>%]C���n���R������EϏ�Zm�b����w�s�y>>���st�W0{�Q
����	U�J�ɠ.��$pl��d��0��r�@�!�����`�مp��;��Aa��7�=�K�Pְ�}��o=�(�k^���}$���Γ�#ʻ�TX��+�q���jp���It���Ӕ}\���&oPt�Q>�Jn\��_�n����f��q���
��^��]�j�B�<�8�n_�$�@�����͝��U3��ZHۓ�Q��q&m�8fY��+��wγ�
G0�[X�z2-�I}�u�lg����N�gg���L��,k��Z�-6��+���H	�%�~|\��A) #����D&�lI$�o�>�i$[�Z�d�'���Py;��1Ί��;FJ;Cу]��;������^�-9�Ȕ�R��m|�B�4�hI�}���9SjR���m����>8�N�l�q�d��\ th�W��cI����=\�NH�(���N�m$���'�����?��)���i������eS2vZA s�BB��Hj�R��AO��_(+�8����ty[[ƺ2ރ2��Nz3ȕ���<�x�5;u�����I�;=�S�[�VE�ڛg���ar�xؼ��%E.R`&;�������Gq{�(3�]�9�l:ma���VQv�N���w���#��i@�����P��q�R�Ԣ�1xA�QT0����[7�w`3w�v'/v^);h�/@���I𢘊
K
8���Ia9
v�,]U
"��r���[�����$$��`�inӹ�+�M4x�]iT0Z] y7����#ʵ?u��rb|��7�*�i�Aʩ��a�
�Ht��I�hx�n����w�n}���4
6�� �IV7�T�ħ�^/#�1�[����lO�O�D��X,G[6I皁����O@?Ƃ��jڰ�6����;�Q��.7\I[A;f��[�Ě1���_?�����i���E�c�	I��f��������(��Yݬ��I��~k���n>z�����ޞk���ހ��J��#IT�j����A�3��ҽ'n�H��	6��c2�~1���[�ee$�����o��&v���R�l)4���/uc�^���9&;R-'���f��6c�E��3�����SA�D%$Ԩ�0�h���.]UC���kI�
��&�&�NfL�X#��>.��Rd�a�
�0	��i&?��`�&,��#:��{�."rdG�*�ҭ�Mr�N�n$�I��%�i�][��M{a�0�� K�Ft>ޚO��`h�ˆ�Sm�W�My-ְ�7�
Ը�У1)��tu�]-p����e�Xg�r�PGq)r�N�[��^_�5Mhh��ۢ��
j���,z#ϴFсEG��~|�;��q%w�yҍ�/�Ef�%�pR�L��
N�}��s�䛶1���0�`
�}����"��=&u��O�*�LW�6ͬրǮ'��'[o����R�Q��s��QR$�j~R���gТ�g\Kl}5oQ������Hv��S�|/���x�K6Κ�K��{���i?��;ͺ�Ef�
���B:
����D��@"�辗[�4���@:��εX���n2wN����GMS��:ңؠ��0����0��g���f��Ǖ�f��| r��z�G��H��Y7e��>s�&����Iu6�ΎR��Qmp[�_��N�P�c�%6��e9F�tbT�(*=��J�%�v��D��L9[qn�f{������*�o�KҸ�_Ҍf�u�Х񫲲K(l�,�d)�m��L����K ;h6^HO��(�#�5�g6�hD3֔#��� �+�������^��
�+�
�m���_��P�GQ��Kߚ�@�t������)�H�W���X�+��ҳMT�
֔�F>&Pf`�s&����&N����#��|���W$.��;s����2@^�3��*�ڔX�rp�f[�mݵ��]TY�Y�j.n�b�1�Ӎ?��t���N�� ;�{�9}��W�	.˜��r�f�Ϧ�(PǴ�V��	^봠���wI�$`l��D���%*�G��1�f�zƯgo,�'� 0��O1��;�t�&v�<�ns4���A-׷�<�w�Xj�J���n�����o�B�/�Ƙ�r0��&�+�W�-�$��h?:�����#vߏ/�%�t2��Id
_A��l�]�O���CnbtmHt@U�2̝0E�aj|1�av9��F3Zʞ�*Aa3�R�5��t��Y��G�����rs�����+ZJ�:�7�IY An�e#��a0 ���J���曂�b�\d�:إ'M@��[pF[��E�I`Z��ū(�C_�Pݠ��x𰚍`�Y"��r��cϬ��U�W���	F��h��*[�u#O�l��8*�6���s��'e�4Řk���^�鴟�m*^I��F�l
�B��+N{#Ivw�7�'��ww�N{c�u��a�!*���|��ww����
m�#x�J혊���Vͪ*�G8�r� ����LV��ٜ��Q��bh�����=�����a��8p��������V��Ď<ôl�L����L�YC�H�81?4���_�lQ�y�����?'E�@76?769C�}͔�Ӭ�
�������K�[�M�=>�.�'�
Y�/(>'�����B&9�:e��2
c@�C3s��-X����.U�F3�g�iҗfK��_]�f���pi
J�H�;[P�?s^a��)D�A�+ۼcm1��dIo$��7�4���4�K6�.��v�Y`�d�[����L��Ҁ��J)b]?�"!^���A �w�n���}Q����ͷ�����7KSM�n0!t��3I4��B�E�M�pt��)-H�T5h��w�ƤX�#3��0��[ܳ�&��A��Z�t�x*�����p9z��.���*� ����w�yza�/���/T�v��"@�?v�ls0N�#h�G�,��گU��Gx-o*�I�.�+�*��ՠ���� i����ph�w �lΊ��z�y�RTa"q��8޲��-$l"�
0�%�q@0lE��ZR�i�p┢i1���d��6�m�#�V��>�L��i��y�E���<���ltR�;4�G�|]�$(�1����1�Ɔ�F`�#�
�6�����c�]��38phD�[|��]�����n9��0QdƗNߠA��GȎe`��4���&TMs��(ĭ��:�#��.�k���͟b�u���H*]d��<��"��eg���G�6�҇��Qi�lH�W����o�U�Av�A��%@��q0��"q{����P���[��2�5zK�"}�T��7Xy�6O�8��.o��Ni�����gWp[�-P6�Qu�Dڴ&'�9;����:�ߌ�b-c����i��
���@J��d���d(aհ�
Cܑ	l*1�	�� ��<}¡�@J�\�izA�=�AZ��.I��,P%�r��F��@X�1!^�؜2�u�L�^�㍍���M*“�1DŽ&c$ ֐�Kl��,���c'��eJ��T�j��\)�ok��.}gE�ANO��k�j_��tބ���O��̯d��Z&�Ҙ����ΰ*^�M�Gu�fU)W,];�ܻ
"�N.�n9�*�l`�Xt��g�����21f/R�)�, ��8�<�b�oj���s���d�d'���l�wG[��;��=x:��a��Sq�ȑ����*'(���腘��D�8'�j�q;�gy
*�>�(�hhC���S�04<!���?���~0�:Z̔�+�"��TR/;�����X;�\;�X���i3��QO��
�.��q�;���U:��ecň\]�W��,M7ŀ��v����,?���67��E�Ex,(�e7���A+��V
���7/��j]Ne��p�T����=k�O�#}��:|��Gg.�@�8��zcg�X�mNZ�&75�#Og�2cFF��t��|j�9�ڨI�h�]0u/ǜlp?��f�m(&.�e�%�,�Q41�f�L���1٧$�F�3KV��s�����|��n��o
>�f��`P�$��{�3�^X^�ي��<���A(@��CV";��W�Dp�r|�u��p���Y���d ��;rm�+j��ғ��
~V��uD�-�w�,����i{��M��'��槟��A�D��.���Z��'��,���f�]����4�۸T���ٶ
�f���NK0c�����Z����rBӋ!��]@ĭ�Erԧ��]1�e�0�&���ʣ]/c������::����Ş�_��-"�`$�8�
��q�����W�.�
�*�T	��"P���{/������Q�n�/k���V�=��T�K�)�a��i�;ְB�_د׿>|����z�˴y���h���|��Ok�l�5����w�:���P"2�>�Ί�B��_���&��_xf����I8b����}B��g��{~T5�ml�I���tsJ/Si�NPo��4{�Mf���_��%1�����VF�P!*(�Ƭ੺��k�SVl�\r�bEk+3��3E�ib[cޝ��
�K��f�׉�χ��t|!�xY��\O���QՃ�t�t6�|<u���񨂉3�;Ie�r���_V�%��/�dz��g�������i>���xw�K��_:XwqͿt*�r搜�	;Fĸ��"�6��q�aPi�����RJ��R^�Ȅ�.�S#�3�= ��E��6�'��,ێ}3S)��iRk&��;A�L����M1���>:>�G��g��AW_��:H5��n����yd���R�T5�P����n�vUMFc�,�w3A��FP�g����?��utܝ������AW�,瀞Zs��4�Q��-�d�
���I���1}��4{��ͺ-�Kq �Q�-D�����K]�!�6��V�/�F�4�CǮJ+�L6����Sw�0����r!�ݺ���]�'��o�*�W8��BS�ޭ�p$�"N���=b;���Op����Bc�Xv�eS�cw�h<��
��.��	r�EL໇i��?U�K�J�kW�D�$�e陡Dٴz�����?F$�-�b��a9���ŃL(���-l��;=� y|���O� �3���af
��SJ�anEP'�v��l�pI�4	IC��\Ѫ'����(�^[�<��9N�i++ˆ�eN0C�ㄡm�=�(u�h���&�v�,�F&��yk����8�;վp|�%�}`�o<��A���_��Q�x��
F�͗/L~��M;�Y>2���	�C[h��P�pj�.�L�L��r1g��EM��'�.���HS�B9�ʞ�.I{ � :������9� �7e�O��]XRU���{.�s҄:\R
n��h��A<z��ǼB�Jt�	��lˊ���O)T���ELj{{�����<���3Ɂ��a� /}��-�Iᩛ�zFJ��b}:��6��);(��v��j�F�D]J��)�50t���0U� ���/�/�Y(3�-�$��f���R�#r��0!E�;��o�D�S��-8(q$��}W���K'c�#�xC]a�h��|t�峼V�V��p}=i����$M�o�I��d���S�L](��F�D�]��*����Yp��N/4��>���\�cA뵰s��l�E;	�co�˻;r;���=��aO�2�<2%��|>B1
�D����^��oJYT�-�HԹ�?o$x��?��~�A����3E|��������o�Ͼ}��)~��K2���{��՞v��(�8$j���l*�i�ܣ��S�����>�d��+U���/(Sv��x�#-�542����q�2x���*�V�Y6�taLЫ&�Muq2�B-	RTU�x�����:�ԋ�c����$�uk>AH��e���d���ugh�=�da�c�'1&���09��f�bl�rŧ���T��w.�[����n���;OIN?��&�z���*�G'0�v5W�pz4�w�A�j��Y���S�mU
��l�ou��J�q�&_˹e3���.����c�>=�}1��O��ŋ�K��D
���Y.���l�-�ԃ��(#Ƈ�r�`)�z���G�/�è_�47ݭ*4��{��!�F����5_)�+1��e�r4�S3�k2�Z�V��"dУⰢU�X�x�I��GS��x`�ڽWi�c��n���b�=�0W�UKR�66���"�A��	��r
{��iͷq��a�v�'q{�����%�pR�2�MШ� q�L�*����ٝtza�6w)�u'�AՎn�6�)|Ž@�Ŏo��57���F��޳
���$O^�Qq�Z��^��o���1'H6�t�
��p��R����p7є'� �=�������0����˾�{1Ě�ΨEy�u$�JU�^��v�w��

�(8}˥����������k%����ID�'Wfp��c�J�AyZE�2��A�D�WT#���ZLL��[��9�G��D,ŷ�џf�ە��l�o޻w��O`��YE}���Wv��{�N��`K�e[��	'��n
c���C�B���@�7��9ԖIa׋��7ٕ]Ew��cs�:�4�X�[�7D�z��c�A��0p|�	2��UϷ����{kw�VIm��%���.F	��ԭ���=������W��1��-;"����JO��R��MOs'�ª�i����!�fS����+nI��-s�Eik��L����1�����j8����6ri��J�.��A� ��MB��$��b��ɵ���9���N�B���+o��*9>�:���M�?�4>�H�/�r=�S~`ںX��v�Β�/��{٭��;�w��?v0(6U��>J/�����vCl�9BQ�W����B��>�л�ֵ!��嚸�:��h7�{ ^��Fە)��W�p��K%��\��8����{G=�(�w�/0ח���̬�]q������);��vH1��{��
�7��@�)��GxƝ��\
7U�Tl�ɶrD��k�Q�慄�,d�F���&ÇW�@�c��#h�E4�>�Sf�s���c
	��X1g.�R�4�]3�"�?e= �V�
&�F��e:&tP��Ëa)r�3k�`,��΋�
?{�����s�cZ0.������:��}�z�ZnI�����B5�V��v�{�
&�x�B9��]9��{��v� YO��ֽ�p:9�ҍ����n�K�P2oc�X9~d����e�y��
2�	{��@��ك/���T�2��#�-v�	�f�-J��Y�p�d1�m��1ط����n��<��gi�}�-<���ɏ�x��bg��4{R�&0m���2�5"�t��A�P��X�tH+ĖC�m�*Hŗ��(u�5F�|��@�G���7/�6�[����ŧ&���R�%�i���+�yyX{�H޲&�Q�:|wѩ��N��?�\����wS��s$�Ѫ��$��IR��)fע�k�����}����(����@GX�V�Z7]�0��9&*�T����/����Jj�a��,�b�$�U6�mq�)�����QC�(ܮVS�
�](�3�}��v�#ұo��8�PB#�DY8�O�/�z���~�/N$t�;��G���Rb����ԋ��C[�J�_����_�f_�Ñ��J.=�x9�����4[�������&��$�������e���YQ�ܡ�M ���L,U�
�0������d�h�F�d�M����~wP _�H��ب�WS{��<�<������Y����S�Y�Z_l�glɁ���1�N�#�H�|b�`q�=�ٕ�ûv�y������K�u���l��1:�������$za�q�OA[	�J�6Q�6�*���k^���w��8$��,s����7�{H���-`F,�eI����$s��!3-��ͬ
���X0�$f��z�S�d��j���BP*#sNy�2��X2��
iazWO���~8����z,�ì{�������h�@����p2E��K���-�I[�����1�C�4#O���xU��:�y�kS����*@��C����L���Ykf�u<2?|�a������TTW��AOh�پ͇�t�Ӫ}k�v�d�f�\gS�l�9†1���+���Jh�W�,슥声	i�a�If�x_��
�+�y�o�q��:�

p�c�>��^8�&�M���d#�������%�#�D�<���b�0�me?�A���`x�]����<4N��S#��1�5T�z;UM6ۺ�9��]G=�.�)�&k�]��&�jT�%m[M�X�,C�ª�� ��aFS"�z<�����+�Q& dL�.��ST��eް�Q�
RD�Lu4;@V���=ŭ�
��4ί�\c��u?��x�(zo���b��Vy�L��me�u�]�ߖx;��A�un:��)�
 �@S�KZrt)o�����;�ւ=��z���@b�R�%�y���*|vͰ�>sc�~o`��B�ޯZ����H��6̋jl�_���C�hÕ��WRx-i./|T�
���ӵ�w?�G��Ys��l��GU� ~:�@�Ég?P�F?m$�5�~��z�|vt�l"����\
W!���I�����G�S�m���f+����P4̽q&)0Ɓ'
�P>�Ò��O:�<�9�J�`�@ۇ�O��3��u| 󡜮4���%Q��W=HD(�֤��3~�|���T�%�OjD�֨��.-i둎?&�@��dnHuZ�Z��1�̈́����y�I�~���y��1,�g 6�O��sp�Г-8�Yd���9�b�oo��/�c8�'|��"ߩ�2E��(�b-�o�0�C,Ŷcm'9�>'0��ms#�s-�e�PN�1ò��ќ����1�aE�i��`��Zb�i<��+gf.�� ����Tx3����Cu�bDy�R_u���V<�璎��~I�>��/��Zm�	�pC�l�nu�-ob�H��&�XF�l1�ZNS��F���A/��_W���W�%脿Ҟ�����2��K�J�O��C���E���j�
K�˺�vf�����V.גJ���ehW�}����b�S[�����4{C�Ԓ{����S�D��*�?lsrb-iD�tD��ϴJ���Za{k����+ڒ�/�Kqݝ�� ����n��ռ*�QL]�n+����"4����p*�@�*8���F$���,��q�(�n����Ĥ�:��=���?|e�,�e���כ�������~}�~U*u��5�yw�v��]�O[�Tz����U�2E�,?[җJ�Z���T���A[���}���/?<��ё��
�k�d�x� CL�{Yaĝ'�Ꜻ�yP�I� �OE.=X�K��8\�v�V1��+uJ~N�u�,���y۱vW	�ma�c�����S%�A�H�]K�+��v��r	EٴM�(��W}�i�����W�:dQnb�̡3�vWm�~����#�
��D�' �6δR��)���wt%_4�5����V�ԋ�h��]�$�^��{�F�Ӑ��e�^f������ؽ*S�@$'��"�F��^�x!س�^���t4^纯ɤ�JRg	hq�j�p��!�*�d&���1)��H�Ec��z�ɦ�D-#��C���JR7�j�Ȼ {>%��H�.�64�3�X#�D���B�FV�3�9�>�/����ݝ���r���.����L�A�^8�?"59�I���[[Id�AG�1��=S�U��N$�{�n�wL\�v��9F�v��A�.�
�ts�[u@���}�H^¿d2�Nd��R�k�I<l�ǎ:]�����oU��y��}�}�)��j�"ݎոo'Agk�7�c�$f(�
�����ꩰ4�V��i�c��u�F)8�c�Q�F���q�0q��u�.� �)�wg��B?yWO~-�'��ݝ��W���n�^;�q�xZ��o*l���dr�j�׿ra�/W����{C.x�S�Â��P�7Vy.�^_��ơ݊��XEҀs�̈�%?�����M�N�\�఻C�����&�ɝE ���/�_�i�<���a~�&z�3�9K#F�8�&��Nx�mq�*_阸Yp���Dȡ�����.�]|@�ҹ,ٻ�7����)�b��X�2.Y���896���&�x\w�}q,�R��"C˝�wi�Z"�Yӑ:y W@�0����7��?9����^��w�/_���W�r��c�W���1�rݗ�N�͒��NƇ��
Sp}���kI�?�n�݄���A0b9V����џeWD��x��uE�m�(�>�VglWt�l�"1y���ۅ��v�ф�`�b�!����
�{������|�c���Z�@iPΥ��������nY#�lu�l��B�{8w��N��W3��qn�Z�K�”~�G<�QL�*�>7��$9��9A�\��ր
���L�YH�X�L�8,_���A�Q�aJ��>	�1N���)��]�ܐU"9��R�|rIi��<LG�Y框(Z=�U7�Na��}=s�D>�eg��#6�F����!5Ǫ�u���x�Q�@�u�s�x2w��1��a"�;�0�\ͧh�Ɩ�_QDl<qLg4>e[9��5���Gҫ�,ﲋ���)��&�.D��c1X?�]H ��٭��1�ڨ�2v���'�“�
]�q�x���a-m�4�^S궸�n-NN�v�`#|�}d�=�:[wX{׸/�(���Y`A>�x�M%����L��l��r_DV~�q������.%���0�Ě`�EQ�^��p��t�Q�ˌ͊ߌQ����ш�$۷S�}�}]s�Ը�&��H��o@yC\8��d�����mm%5��F�{	�U���r�LS�/��iԟl�����U��{�U�9���bd�w0�s���wu�X�5aeƢ􋰦��R�<��P���S�y%7�����6%c<�>���Ѝ�?��>���g�އ8B��:Q��Ç�n������a�=�cj��]f�T�JX)wI��F��H7S}�d$H�bcy��\�2�{$a���ƀ�L���0��|�Ʌ��ݎ��T��d�	ǥ4�������jwϳ�Y6�S>��?�����MF?p�>#����D�ITR��O��7�G���Y\?�<|��뜥s���0���0�@��K�w�Hz5?)��JHX24���N���ո�rhш�I|<ߏ�eʡٚ>�I�}����PF�LJ�Wb��Z��O���G�,N.�k���a�6D�V���Uz&����{���&٦�|*ɥ�/.�����Ӌ���I����mdF|o���Y���ϼ~�(�Л�HR
��ٓR}��`�����ᩊ��	�,��h;���H}�a����}���B%m$' �7�ަRp�b�̽����;�'<��5���M1�63�_��k��I����w�&��������S�zz����j�m,sr�5?�ҟc�[���Q�� ��������ʈ���Uf�Y����˧�$��_��ݟ��di8IF'9'SH��8���p��l�5���"$�/Φ2���������T�^꽤��o��.��©Կ�6O"XSNf8QT\���S�'��Ծ	Bv�H�e��h�{����=ksGr�+�`T����C=LQR��]VL�r2/��\�`I���ٹ�U��%�\�����8�s�%uW���*ݗ�MUN\�T�2�=��� ��9�"���~�t����t�Kpuw����h\�!g�6��)�C]瞌�\*��8�8'�>�6�Oʪ��.v8T�9�}�
p;l�8��ح,���R����"|ˊK+�?�.#�+Id�\@��+K��y����aaa�A!H/�R��⃽�ҕJ�ޡ��S�D��F<��������c���**\�n���@l��=�4�++�w�?��s�o@)(++34�
R[���&�8]$�5~�>� &�z�-/�� �T
�CbϚ �]&i	��,��y�ɨD`V0C�iL�/zF{�]���q1���%��!x�i͞H��ùX��NO��N�9g:�d�2v����	�&p��k����d�h�D�4���1w.$�Lȗ�7�
�\(�I��B:���Q(.^kĬoj m=)+��3iQ"���-,����@�=g�|��K�>�*z�?���\pŦ���-K��p5�W�`��#zp�Glvy@9�Y�Q�-y��e0�z1I�6��Rħ,�����V7@�3Ӛ��IoX��5����a-]�O�7��U�nn�;��E���aY�,p_���U"=�0nE�Ղen�_de>U���/�Y�n�c���Ű��eD�~8��&Z"Ԩ~cg�b/h��������_���׵:�����z(	�����՚4�1����{Yx�P�ʭ�G�Ш
�!Q�Ν��.N&Q;�e��Td��M�/ʣuSW����(�7�{-y�ਘ��Ü�xM��P3���Hϑ|�H�y��Ϙ}|#�g�\�-|����[-�P޼�e�1O0�ɂ�d��W[�mle��j��fB+5�0�Ll��s6,���W��_y|����rr��\
<"
��,�$�\V�V��܋��y�b�T�Bdԃ��`ل��̄[��Am��!�c?���$W�K�&�e��>�8�QB��:�C��`<���s^L�W�hU��Vǂ��5���~u��1/��x�$�������&x��a�z�4maO6Pi=Ե�^��ꆺ�+Uo����Z$�����b2��^K�a(�\�V]/gy�誣$��4a�]��� �otsH׃��u�v0�_�F�jO'ZE:F���qr��P*ݑHY-eJKZ���T:���i�(\@ -1FP,!�R�u�S^J��$�$�@m2���K�C 
�a+�ݩ�1�ԦC��\i\9h/wZ
�Ϥ%b
���2q: �$]�3��2ذp�[G+��:�{Z[�ɤ(	��U��f;��v���o�k��j��fT�6V�p���a�܁���t��km_F~)V��!8��m��n��f%�*�sco�(
+I��!��2�ɴ��Oz�dt�����t
?�ݢ�A*g�i�ai�j�$�6À�'�#RK��r��;Ѱ%^oE��&/�*W���M�[�)��n�&��6΢#7���F��y��b���xv�{����W��|��_���ۋ�a0�Ğ�«$�.ҎX�p�G!�3^����$#9�x��R��?��:s
����P3�`�4nJR�>��7�H���Zph��4�%���C�

�ʪ�'x���뺊`m�Jk���F�Z�h���_�
%�8�]�ߏj���n�^�}��Xg����`S/sJ�������,\O�wx�r�}�Hc�2֥@�;`��
��Q��_��7�0��씊�0�2�Yr6uqb ��K����p9eL�R������q��_�l1�f
^9��u�]vA�1�eJ5�M�0LrE���x6�ҘY�E��ȧ�Dc����6:�j2�1A󬅉,q�S��̩���L5�pf>��q^�\�.ӕ�2&�:ʡmRgh���R}۫4�D!�kf���ԣ7vv��iE�Ç��&�"CΕ�E����@��W��<j�e,A�+}����/�ݭ��Uε�C��j�c�R6��Z��s�D���~�_Բ�2�NE)��z����?���0�/f�
ɒt���e�����T��W��~g9�(}���|b`��%0ݏ�P���bk��Z�H����O�h��˖l�eg��6���bq�w�W<���Ň;Y�:�ˁ2�K$.RFsuk
f����Q���C�9-���ҏ����sol����u��RJ��������7��3)�x&�@�6���`�ؕd��"��k�[��ͭ/�Vי���Vv6��{P�V�z�(�޳�{�œ0]>h��w(b�7>femY�N�����5�8��rJ��d=a�J�Wi������l��$����&#*��Q29XB����+Z�Ľ���]~��D�p�
���$kc�TTgv��x���f&^\z�t�R�n3qcM�g�C��!�d���E�n$��\U�{�۩���e�c#���aq�(�l�":�u�7�a�\x\���Vf+���jX6�[,����C��X~���(�5O����Sn���Щ�r�=ș��LfL��]a�M���䓈�K;�A�y61S2��Mͩ��"A�@_�c{7�l�K���!�Rۚ8j�Z
=�|N�XK�DR;��z�ȤI�X��Ҙ0ss2�m�,�jQ�M��u���R�,Cv=����mA�h��-��np��YޢR��j3�r&�vJ�܁�'w���U�\f�r���P���bW��o�X�#4�tR�Q/����'��t�pg��Cu��6�	XLo0a��`���N�c���J��<���|h�}���w��N�+�WNJ����0%�~ԏƾ��t��L��:p��雅���|��?�5��PU��4�G�B�Ȃ8�y���,�\��\`(y
rBz��Vv��_7�]!6eB��1�D8��l
G�Z�K mN}�5������
|�^�n�)n$=��G*���ӣ�P
��,��L��LDu�RC��I�ƶw���H�l���%�����٪�-P&�n�?��Y�B)������i��`��3}�;��'�GR÷Ȏ���H�4�)�{�W]b��+E*���x�* �*���O��B�h�S�0[}X��V��ބ\�X�N�-7L±����rޕ�#��q8�0��Ľ��$ba�[�J��X��oÀ��b�o�OF���E�j\q�_E�	��Z2�Y��J��S���Z^�B+�9髫��K���b��8�g���l�<N�uu�1+
.��kP#\��_�Z�M��*���Q�2#��2��@=X-�-��e�)N�Rn������>E�%@o�P��ݦN�e�;��ě΋b�V�ֶv�+v�H'=���O��S�eI֨Eh_�Z:�M��[M���l7�f�	��d�H�*�^��ʶ笔4UK
�**�mD	�X��l�e�*��U6���^/x�_�C(^�e}�B��
�@֮���+�W�e6�K
�E;�Q�37E�*�mZ�_����_ ���I�0
�{����Y�c+vc�R�6��5�
(�u�qj�چ(�]�%mQ����:��z;��
J7x��MQc�,�6�׶�ڡW6%�Hs]�4�SIk݆�ş��D��(iʒ6�����*�t$��jX�n�=��Zk֞�疜u.�묻L
�
���>/����ou���U�d�IPB��=4+M�~Q�u67`<��ߍ��k�(8
�����qp��ŭQ+��	��2H���/Lo8K�]�w���x�4��<ԉw^��5&^DΖ�Ѽ�5�'���	��g�,�=��-�f >q�jR�kkDb�/	��cI���KڛMg��uE��t��j,o�rP�wzK�bE#k�8�R�%Pw�-��p`�n$�k*�h&�hg4gk�����#��+ط�JD7V7y�͔�Z�Nf%�j�M����H�ǵ�>�LF3w�zcn2�x+H�.��h�J��MO�*���!Wԝy9�%���L��s��i���/`�/���>O��
���3)|���}�_|����w���&yw:��x��W?��Ff�ϟ��;ϟ>�%����O���3�g?x�K��?=��g�=�ų�X�;��?���}����~���?��"���W~�Տ~�_?�k+!
Syj`f�������\p$���������i�Ih��?~�����_|���9Sj6C��~��?��~�3+D>�M���x�ዧY���4�'����x��O>y��__<��œ����;V�j�t-Hpi.�m�|���v��`�;�2�,�j�P�).�~�؇�K�7�.=�tG�		?8m(y�A2��sM���G��WaVC�ވ��Gz.��L�c�z�l5�'pn�U�k�e�/*��:��0l��﷣�����8}�nL��Ѿ�p��Y�&���2J3{��9��1����=8��X�!l���6"�G}8�Ǻ� M�vR/C>D��5•�^8��_2|X�.���yl�ݢ�")�S�c~^,�E}/
X�<n���I�q)�x�B����ޅ�o�Gq<.!��o(h��V"�$��Y�]]�_Ӳ���Q܁	8|H��25��:(燆ԣ���lSGA�7TO��:'��9���~(d�α�x����D�R��S�r4-]D`�����oQ��z��?z�k��M�z���O
�B���4C>���w�1 �!>f�a�ږf�y��Tcf�(�vx�ϩ`Ĉ���`ٖG��r��O4���g�φ<�4[�����吱�EL�5�v��10�I�ێzճ��!E�c����0�qZi�֦��8��U!aՔ�v��*�\�Y�w-�����q��$�yZ�+/Eb�䪱��kbP0�N���#�uXH4��Є2,x���m�ƴ��U�8`7����ъ��("�������6M3`�C@r^��#�Ħ����z���<���вA�w��)V���V3)�w�V��V�\Ӊ������m�?�׹��0�$�q�J0�����j&lҳ[3]8��x„��v˜����k<ɮ,�@����7	*�[0��;¶טD��u-����t��Lᠯ�5ԙ�.3Y@�HWѶ8��@޼\بm���&����%�vN��.�.�(��f�
_'���Yu�Yr���c�؄������		R�R���Ab��Y�fL�~�9��t���˓?�E������$A��D00�2���kR(�=��D�ǡ�b��h6��.���v�]�ޓ�r�'_bޭ�Io���\˜�]�-8���P�)#$���2B��-#���-�I�ҁY2�E��P�sϤ��U�?
�x�U�G�}>������ww�1 ��td0������e�Ǔa7�e&4��Ί�#���8��xߛK=Aڡ��d��#hE1�	?ì�5��Fԇ͠2��ݔ�}0|��jp�l�e_n�2S�ɤgnrl��w/ջ�D	�V��:��d��0F���6\�-^9��f�xI��F9�c
c��r�|�J�%�K)��*�Ah��GGhǧ7.�S
���5�&��ѣr�),R R{��,�L�M���v�>�%�@J|ٳ?.��<?Z,F�C�I�4���
��c���8���F20��H��D�	�Ef1�pbF�g��`�VNσ�iJ|/�ʇv���Y���lX���U6|�����Q_kA#�1+��.3�R��%Bv�l��De>�s�[�ɭo��Z����"z��9�k���t3G��*��oj�Y�P!5�7a3�[�'��R���K)`pC'�K2�M!gPk{�ƪ��߆��7���`�߫�L�̣14We�-I�B��_�8�rL��.�&����S�2�f�.$:S��-Lf�b�N}٢5�/��E�H�g�y�p
;����^�}���B�M-(I�^=.xmA_>��������hI�c0�<���y�jv	\di
#g�x�S	��Ӓ�����$��[�)@7�F7�LKLc�U�e��lKU���"���<r�|�V��6=`0jI��(���Fݴ��|���/��>:�X��^r`׏���VK5��L��eeku�!r�a 1ESVOL��{�֠;��(ɒ�����p���|�~��M@�)&�؄�*��#�4.��sKť"�n�p~�d�,�����~d%��?$Z<��A`�_jB�/��x�\1�5	�b�lR�D.c��ZI�t�������aN�y���C�f K��Y_=-:�lmL4J��
Gc<��kà�b�Y�����=��w�~��!��E��`{�_���_����Q�a�/�F��B/;;Wwu�!���	8E��ѓ�Q
>q��S�z����9��6�.����F uM
@ٹZv}���É��q٤ǩ������s��@a��)k�nH����/�]�w�BZa�$��O���Pۈ
n�O��N�6cy+R�
\>=��o���RdѣE#W ����^��)�
����PKEePQ!{�
�	�&pip/_vendor/retrying.py�Z�o����09�S�\��\4�K�`m2$io�� ��N�4��ct���/�Dٹ"�q�X���}|�|tD��N�"g��7�`�-ݑ�,abrt�ȏ<f�d	�r$j��EIc�S���/LH^��,\�	���t����n^(RI\��g��������Ŧ�8�cF�\�5�%D�_k�b�(�SXP�Sj�j��J��''��6�Zذ'�!�'?^�����|
�~�3&%����jGh	�tbftK
A�`0�
x+��Ü�"U[*�$\*�W�r�ՈZ�`1���������]�]����7?ߓ����W�w�於��~wuus
Oߓ��_�߯���	k�T
���hI�h��1成F$Y���<��>0�P<2��F�db�%zT��	�d|�Uzh�W8��B("���LRQlH��0zd0�%�iɟJ���W�7��.h�V4�<�L��(��'�+rB����;�ӽ	�HR0��I�5}�[�aN~��g���,���7�|u��7������.8N�x�sr|�|���'>��T�}��BP§U��2�P���SŤ6�-B�ي�'+����
�!�����@3Ն�J��Ji�iJvN>�ݶ�w���"`ƪ��]�W�i�ѯ��`F�$�4�	0W�I/�)�Xh
fd	6�kb�e�f���cm6��a�����dA
s�V
 D
	s�L��dI�Ǎ[Z����y�s0Q� ��:�s��e��Z3�ܭj��e�
��i���K�
igB9�N(q�(
$��@P"UQ.��6�-��|��E��U�mJ��f��A�et7F���?�d/��Gц疠�(}ڻ��`�m`��^(ęm�B��Y�Y��2űLԡO�mT��>�����8����߁}O!��|��p�[|�	�U��#�0	(�_c]����tŽ�q�Ѧw���Œ���\�L�ѬA���t�P�5<�&�!ҧ�p��8h�3�@�i��r��>tN�Gt�g�����[��r!r��=�64^�^�(||�lt�f
a��.u��ͻBh�Т�v�dY1��x!�E�Lt�5%F�4>���(���vX!�y�w�P����ԛ�^x�q��,Вw ,�a�����f�PRk	���]���>�x��4��|�V�J�^A����74��v��\thԺY}��N̸��o���^Ɍ��u��
7�x����/�[/c쯧���	�ri��
��T�/��^?&�3�Kز#�e��Ϯz�Xv�^{��S�pvլ���A'�̑N�m��+��Wx�i��y��f�f[��@О4����j�>��tgh�`�v��P��I�L��O���9�פ��9{����z���~�����@w,n_uX��A��do�0җ'P�T-�FZ'��tz��\c�k���q��rl������4ʾ>߫�V��)�A}m�Oz�Wi���>���ѡ�3/L5{9��x/�AAB�6T(A�M(��N$k�{A�y8����=	�p�+���A���H����$�7Η٠����	��xt1�z��I��o�?��:��{��i�~�͐w��2�5�I'�;A�P�|Ӯf��1h4{K�s�j�e�=zB}E�1��Y:&�X	{MNg3w{�|�J�n�ʳ8��Ѝ��慼���Z�1���i��c�o�aG,3��e
l�ߵm
�e�z���V:-��V�uQe���9t�Kqt0|-�k�pMe��
��g9�q5�h�H��}8��E�}�3
�X���r����F�4���k�
t^F��,	VC�%	p ����YYy7�<�j�_/�3\�@��{��/�E�Q�y�uN�	������9��N�&�
���R�Ր)�Ի��>��p�P빫�&0_�㴷�9�6(����
�w	�,s>c�j�`��Q���]��yO۸G����Y��B�m�yM����%K�dU)�|��y�M%�24d�O�Q2�Xw�~�s)D!Z�O�7��;t~�|^�^1�%7�xF��b�CNj�iU�_�c�b^c%�Z�zʼn�p��^�y�E�yy��i��4��E���Ǵ���S]1H(�t/��0�F*�j����Յ�:�4k�	�uDN^��6�O�u�U�q%�I%p!��+\�
���}	h����LvQG���f�;5(�^�8L��y�$nJ��Vk���5�Ek8fֿ/᭧���Ъ�ղy��]�=�xߠ��œ͋Z���Hm��dnNo+�^3�%�Ҥޞ��y��~1A�gU�
����?,>έh��y<;Вt'?DVx
V�:<-�>�5�v�<'�-~�����N��)f^�3�c~:
?<ڟ��ԑZ�j�g(��\�I�q�����.{I�';���)(j��bu>�GĪ<\3-v"Zr{N_�v�6�T7��4������a>�/PKEePQr�(� o�pip/_vendor/six.py�=�s�6�����)�1�O�%vڻ�ԝ:���>�Nv���yh��,���a[���@�O�rnΓ�H`w��],/�Q�\%��<�7{�߼~��z�x/�?�E���$���;/�%YiđR1�����m�F��Gb�H)���nr+G"���Ē�E<�� 
�[�
Jr�́Pϲ7��7Mc/p���c/_�(s3,q�2V6�bp�0C*Ɨn�]�ՙ�!��q��D�YxHe@^��ȇ��E��@tG
�p�B=�ۑX�~0�_I�[��0H�#�H|�g��b�'#Ă��k��T����{�q�!Aa9Kl�D�b��<^Tk O�<��XIX~��R��^�)�0��0~�
zq�X����
r�i|/�J��(΀c�u�,U��ҹ�b*��h��[�U�<��A�b'Th��63��X\���r89�Kq19�u��^�`$���>��19<��]��g�����>���o���Kq>b�Ӌ��1��ώN>��"����8������9����/�����������~���3���|"����j|��p".>O.�/���@�l|�q���]�P.���_�E\~:<9�€��g���G��Oƿ|���O>C�c����1U;:9��ć���_�	��`
�y_>c"�y�����gX���	���������x$'�K���)V8�D0ώ�
����ϗ�I����]"2WT��;;���s�`q`30����}	��BK��,�����Eb��nwvf	����,O��`�v���!4.��wvT�,��,��T'�*	1���ʼn~OWEV�Z�tg�q��H��1h�<��T%��$~�8��ih���xo�7�ۯ� �ϩ��!U`VPs7I�P��+f3p��L���;��	���$�h}}-�d�wg�c���w{��a���!�l&�ݎ�?tVѭC@�,Qz>�V&E�s��G.���3��Q2S��i��J�NWJ3N����bv�>��_rG��l�jꦒ�ڙ��;���G��d%�G�u���y�e�p���g��2t3����d)v������{!����
�U�}G*���t��T)	��e�?�(���+�9,��D��.x�\�4����.8p�_<�H�_���I��Ɇe�$�S79���4�P�5[�Y͌�DB�����ΒU�X�Y�a�(=���9X����$��*���+�P%q���rbZ?�݈��5Z��oЀI��;yX�aF�(���:��A	�8싰=�#CPL��B.~5qv@y(��]Ȓ���獔��b'ʩ�o�Pj���PGw�:juD!������s�� S/���Dl�2��0��?L�1
��?&ޭ,р.�ƥ�	Yf�А��qx/��A�K����BR����;ha��bYv�Yb��
�s�1��6�8"6�3�{~��5��B�
�F%�����Qf�:�֞B�:�{&ǨD�uf*~liK�6�F�d
<�x�?e{*��F���"�H>��QE�9t��A�Y��j%̾�H�(p$��'��L�L&��b�|�i� Tè�6��S��5>MeX�[�^!,|1()�˽w��!��͙(5�,eĨ�:הZm�J����p��\R�Ak�����?S�ʶu�Y�$��k���ׁ€X�(x����
�=FT��c.~�&긺��u�f
��|J��Ha��Г$��4�6� ��^WZ�X��������`9�8�xmo�E�[�G,��M:��K�j����"@���@��ja��ޠSլ�&�`7v2m�^_��K�u~׺��t:3
�Z��C����
�r<�؅��9��`@��b��-es5@�h$փ�4x���4����T�a3%ꊹ\@
%�R�1__��� �$����0��t�����
�P��a$^&��y)�k
Rz�q�E0�~Q��F�Pbuz"�T�.�"��n�c����6�Z��0p�Rj�nO���+`Zl�R�גտ��=��5.�D�!�*i�f����2P��e�Ț���Y�f�U��9F��t]e!dw�˺jX�]�Z��
R)��Q�5����<�Kgэ��� ��kB�����E�P1$�ZWc���JV�Vv�*d0�_���y��#zҢFaġ�q)���ۂ��7'@��\�0e�m��j&5�TZN�:K׻so{4�]'�M�F��`�ώ"��UMcE�.��_LJ5Cx�/Hb���o���`���[,��{ܷ�
�R��}��1�5T���i�vh�B7l��F��8��+�I�e�l�̃�S�(������lwh��0r�
V��R�ٵz	|Gji�'�
�6H.EW�E�ΎS��}��m���z��Ej��F7��Դ���&J1�Vl9�g�S���-���SB��Z�YB�ű�f����W^��/R��V�YBe	^O���4�th͔Q¨�^Z3�o�`��i�v��e��C��#���}p
8~��E-�t�,�e���t���|���N���~�i;~�4��L�b�\D�e{2�|�F�r�� ~�"%����$��0��p�-��A�	����{md�%�.�t�G��<�}������Y�f˫���ϩL>)�|��0�4#��*��@��Q��̟F.�6@����W��A)��&��,��x���j�V�3>̚��zq4n��VDN��/������N��諯6B�s�H��U��R_Y�r�H�����68�pn#�G��ccRxT�ipJj�w�|�X9�<�.y��{���?R�C�\ö7ϲ%t��] �p�<����̶��5R�/>֐�E>���+����z_A�U��H'�Ҽ>]��\o���5f>��q��ӆ)n:�b \�CJ�Oǧ��+)d�B�G��(��ID����Z��&��Y��i3�h��k�Fq�A��.��5�*f��U%�P!������K�ܳ	4SH�)���8�e\Eh$��pIQ}�-m�"��80��Ԇ�g.s��/zhI�2Q6���0i���,-y���nF
�dx����Q��`W���7��7(�T����q{UI�#�5�0}�R/����fz�޵�jr�^�d%wl'M�*p}���+���ڋ�����X�ڇ�;m�JY��WM�L��p�3
�Ph7�5 � �o���gwG�r�S��_f��6+5rD)ZG}E��ҿ��hv�,#�ő2Əœ"w�gu��^����S~W�ɀ�Vݺ���}w�n���I~��~ �'$h��&�����x����Y�^�B��n�}�z�z�L�i���O�U1f���z\���3B NP��A
?�us���L.�ʎN*��k�G��!���!�)�`x�XQ�mO�]a����|[s�oz��%���Q��.�;;��k����׻�.^�V;7����4//}���l��f�6�/J��F^H3�h��]=mg�W���t
�w��\��`h��"�A�c6�mfiAD��U0�j�T
�|�F�\��z�`N_�� ����3}n�
2��@*qo�D�#�-QM���(�-q��9%���eSc�W��Y�y�t�<ڲP���b�,vhl|7��#v+BF��t�H}0
JV[�fEcy*f^�y��J���PD
��Bu�O�x$�,�����]l�����ӱܐܯm���n������=\KP�ҽ��v/_;}�>xMX<l��*o���T-ߵ����,�`�P������q5���
�
T����_�R��r�k[[}A��n�k����VvK��v���S�VK��VE��n��Z��v�HpOi��,WѫڮJ��z/^ʨ�u�K�06	C	�^C�{����}T�����|���4�����2����e
�DeoS�sڇw�ty�5$�|�3�"�?>��n��5�>��\:��s���[�
�W�a��Y�pq��~_�l��5�n�؊��4��ˠ~�w�g��V�"u}J�~\r��6���ߎ���_>�N(?�y���\>����>W��7��*��&������m�!z���OP�y�gQ��sx�	�>�nh�=��H�Ɲ��~3�qtW�Y$�����no4���S��"�패k�^Sk�zT]�� �N�q�
g�5�zdͩ��� N���ŬU6	�^�r�жp��sp�#���-t�j���[�F^�:|z{���� ��^�"|�IhB��D�R�횅��Wme��c�HF���6Zt�0�6����vfW�[^�O6>S���\�]k�UMt�[g���ނ%�ͤp�F_z�K��g��T.��}~���(�6��@�y�Y J�.�m�R�6�qކxzF�T?�!f��1.7����@إ�6%PU-�JY}�u�0vGb�����L�sI�����m�5+V�˺�u��n���,��(�y�.�#��DN�A' p�R;�bB9\���,��)�>%�Rj�9ؚ�_��#��P�^�8_��Q^�0k��roNtG�d �T���a~h��7Y~�9��8#����	�8� 1$���@g���ᩚ���I���
s�S7T �!��U��V��Ǯ
��m5(^��PI訃��]va���Jܹ�g?ѧޏَR�h��?7�*�dMgd6���;�D�X&���>�֏=�k��Y��,T:NG;
�_*��>�㯩#:��@�"���3�N�zy4���w�5�Jh2�2X�um���9K��}a�a�.�1Թ:^�6K�,F�
���0խka+�np��_�:�U-a��L��3��Q��J�u-��Ý�p�ږS���,}����p�Ӓ���4`�X��H�r�H_��VZ1`��RWN(H�!����O,�54������Z"�.�pb�h�c�c�o�A�����4P
��ݨ
���Ӻ����S^�=��;���D�=c��X����(��n�j�����e����eʎm-��;0����ob���
�U��^)$�����T�ئF��F7��$u0���M��!����	J)@��qZ�0X��Y�ą|Ձ�ϧ̺���}�&fi
%U�u��S��Ѵ�=}���d=}����e֯{�hz�����6ol��o)z�������9�1`��)AJ�%�LJQ����GH�/����~0�q@�J
M4D�\�|P��V��#_>Ҟ=`�!Z��eӛ��!b[�Q�{��9��V�;x�U�A�����!F�4�[>����Z�x �;�wB�'L�|,	��A�KP�n��e�>���:��R=�cC�6b�	,
j��݆)�'wn�!������ɉ)�Z
!�|�m�CJ��N�2t=i%�����H�<i�(�82�ܥ�')�?����:(��-ĉ�___�>��uk��F"�@�g_��a��/�qw�m�Z㗛�b��Qi	F#)�N�6��A�F�x��ol�O���OG?c�DH7�����)?��䫉�Z��Q,/��6����j��1hChC��])ː�օ4֕��r6(Akf�B4��r�NP>J�1N��9,}th�/�4YeeKե�D6��՘�"�\�Γ����8F�D�"n?���tn>�*���L�i���xV6�7@��Y�=U���☞��S�Zs�$Y���@/8Juܢƞz�LtHy&��r<徜��͓�����.�Y�Έ����zS���p��L����gv�u��K:�^'�1e�3���YŨ1�*=ā��%L�V���I�;���W��
���j$�(O��б�x���]cX��sז*���;Ycä���Ŋ
�U�݀�Z�P�%�uY�!��
Q,
��s,����@��H>�J�U(����8��-�Ÿg_i8�%�ʄ�e���pEU�f~�g�����4�V���i�n��]���!��C�[�<G%0�
�1�ې{<,
F4h��I�ȍϨ2�Δep4GbC�Z�B����wc̖��I�������F��8���C3��{�kA{�w��D�?z�g�>R����"�pR2Pr�8�"3�uピF��oȥ)��5��RM��J�j�E>�f�D2��:����㜰Z�BNy��ɨ�*�����q��_���5G�
k�ߺ�DrÚ#��
�j�-��j��L�I���ɴx9�9kX%������NrK1D��0�O��T�M�ޙ�v3	�<"�&k�hPmh�_����c6K�H��PhilMs��JX-&ڄg#W�("i]����I<m�A�!��f�r�d�b8J6���Ǐ�-�����y� mOlv��{��Y���z��iO�e��cCBL
��Y���L��9��"�o�&��&-���3����Rxo�ԥt`�|t�,\Q�L�t>�|{��ɻ��j�]9�/}\�{H��R&7�\����i�zc���#�e�wnnE�w�M����nntY7j5S��MeE��(�A�q@xsZ<S԰c�z&`�o⺹�1gpo@���p�=������p�����v���p,�;
�kO����R�_&�����r��^�uٍ��nA�|����v,��+�˭Z`c���t�jw3��ws��&�F��vD}Z)4���H��m���i��f#���~�0m�lA&�>����_Umø��m5�����`o+�y��;�3���~��ҋ��{�0*XS�,u�t��*9�e4A�4M��I��	��'��4�)�d1]m���+
�bp��i‡0�rb�GY�nD��#?4ŏ�D�K�?�G�K�#��>�3�g���!]�6���խ�����S�6W�3�����,g�s�cj�$2c/�69����8���B<G��$���O�Y����)��[ޠMb<C�dz��?��54��B�ĝ%���o[� l�Ψ�Å����D�b��ݠ��D����&�̩�K[hZCW�<��G���]lj��1g�O��
\c��&�>}4mWAH��R�?�dx��fK�3�׵�C�>,�6q������W��H�f�1�9J�	kH~�ܽYi��d�f�t_z1/�bâ�E�F��]/v��MG��{���S�,��W�F�0��*�O�:e�«Ch��t��]#?]�Wz���Ӓ��~|i�(y��6�@�Z��!r�[����B�)�dh�+)��w�Vт��*�u��2�޳�VÐ5Rx�9��"*���w6B��S��JGŜ�n��^�����9��ɜ]�>c�g�|��|�7�*��>S�Z�č]ވW?��3���J�)��
!8�No�]ҤEk�5~'zF�n05�Dv-�6p��&{69��s5&(�AW��3�txM��w�.�I�M|�aU�8s��ӗ���V#P*
�_��2�9�a�"�K�*�~D�żU�Ϛ��Ol�2%>tV@�[�xU+�ھ��i/xm�5���G�>��M�h�|ca�6W�T�3�z�DRp��%/-�Ud�ߙ�������b=Ñ��Ξ�<tʻ���jpB��*)c�z�T�=���C&�g��R���_���l���	4�9p�o��4��K�z���p�#T����O�Ue°fŖK�]
*���֍��a�,J���*h��f}���81���s�.��E�K�3�l��T���w) xn�JsJ�E1k
m0�~Z����zz��"��7 Y"tSߥ�}��+~
*��r�ʛT<��{��b<a5���\<׳�DH]��m��c2�0�Yd��/Z�;��-�|����D��~F�y�S��=5�a8@�{�����o��	��@� ���?��'����i�k�s�j�&�A����ډf4����>'�n��i�Q0�x?c�D#�u���x!��_�*����n�$� �O�J��-����4�F@k�iDc DS�
/UV^�E"j���L���.��4_B6��UC�x!�MA��=2J�a��Ղ�^�ʒA�r�'��ݴ(!�Q%�>(��8�X,��l_��6�n�A����c;�>�2�R�Ap_�衽R�-��!ڪ7���ĠW�Ћ�C�"x�0��
b�)�?+Ԓ"W[\oozE�ij�����eЙ�m�g
Z��o+�Ʋy�FT���T�נ:v,��h�l�t����uc��r��y�%y���g`�T
�ɐ}��t��PKEePQf8��pip/_vendor/vendor.txt5PAr� ��
fz�l'�S�7�:L1PA���a��v����H�9L��^J�T�s'��T�o^�	F�s�GO�j:���nT�MPG8B*B=àn}K�5��Շ@�v���~��3b��K֬�}������ϣzP�k̫s��R�l�"�
VU*�?���zjG-�V�_wl�Il'f�|�?��1�p���<�΍ BŐ���N��E�����o�3B�	;=�3���^{)�G��}��1�T/�a>_��W�K	����PKEePQZ���.$pip/_vendor/cachecontrol/__init__.pym�A
�0E�9Őu�NP�A�P�8��m&LR��7�)����?Z�
mK�$܃K��O$
Z2J=�#p	��J#<����t'�Z��_�q��h��Z�5�K]�	�U��;Jd?#��LΎ����k�o���Eؙ���R�f�d]��L1�!m����o�9V_PKEePQJ�y� pip/_vendor/cachecontrol/_cmd.py�SAn�0���z�C��!M��E�	�Z�D%�!���\���$�.2wgg�3���q��f�����Ĭ��x��T8x��������3c+{i,c7�w�zש���:��h(����x!ܕ��t~��v�<�?bAUG�!�Vd#x��>����=<��s������[C���}\�ۇ�@Nw�Λ5��R�sM^?@�WF�����-9AⳘě
#[9�n�f�ཛྷ��������N��t&��1��e%��Y��dfx}
�n���M�6��9���Ul]A��$��X����S��/6Q���2�,;u��q�����XG#F��{��޳`Xp���L����LC��=˙��<V���Q�Y����)��w��,�G5���F{�b�E�۴���,,������^|�/���E���	�B���6�ݰt�/�μІ|����#�E� ώR�N���c�?�`��
�3!]�g[^Ǩp�ZN �:V��N��bS�PKEePQGi�#pip/_vendor/cachecontrol/adapter.py�XQo�6~�� �CH�=�C��݀m(0}h�l�E������H�%:�& �D�w�}w<Z��-���B��}[�V)�I�[,�Z�X#��x��R:��Wƚ�W���
���n?��cݲ�T��JJн�=/�p�{9�E>��:�nr/$�5o��)w�|��S_��b�(%7&ڡ3'��z�`����KQq+�Cq{T�a�����r͖~{�>,�Y8�
��(D-lQdn�r�_·����X��f���LA�̞,4��
�d��Ɗ2��I蝙̿�`F�o���۳�0f�𭝧�<D�+sJVQ4: 7�ي�=��5��b 
��xq�
������(:S�e�O�j����#���N`��S����$T�M^GT���P�A�j �����X���k�{hh��ex��0ޫ���":�f�^�&���U�+���`��n����N��U�F��-<�*R��<iV���i��zܪw�O��A�]��՗x P����<H�m��*��%4�v栵�߳a��)3H��h������V�A6��1L�U��W*�G����D�Ṟ̏�Aƫ
ӑW���V[�$��m�߉�m���YU]	"�E'"92�L&^�I.)���"-&!"]CMbW�!��1�ȥ�kY7��cv�L����@�]؉?��3�"��54�*|��|�����mP@J6.���{�U6�Bm���K�aU0���Z�Q�:˾31o�}  �/�)`0&ܲ�8-���99Q�\��.���$��'�]q�9�_^�~~�An�ύо�~L����r��q�aoo��sþ;�Ȓ#��&�a�C)w)U�T;�J\��#����F$��y!�;f���g�����B��W|HX�����g��a��?��Cp8?0n_a�A3����+��[L��&��$�gRl;ĦV��D�녚�QBlU޹j�0G�V�#�1�.�<ap�rD@1�X�(c��PdB��
������HB�wÕL�D�ZG<�if��,�VWp� �w��RC��O��#7xŘCҀ��*(U�0"��s_uW/�q��|�%@f�4y	y�3jf���
q�����ws$��đ=�x���`���-ݖ<{8�oM>���n%t�u>���E@N����t��'�^@������]K�a�:�;��4o��3-�� 'N����܎9��ЗǶ~�*����)��D�����mF�'��D��]EҮ�Z�Mxьl���G�N|o�޷�7q�
3��Bf'��]�и�&��]ǰ�렧���o4��؉F��X����q~n�qs7��ErqL�L�[*���1��ӽ�����z�s|��z��’��{Xy�I<�WF5|�j*���5�,G-�6
y����+ͻ�Ԅ�#�{ʅ��`��PKEePQ�b�M2%!pip/_vendor/cachecontrol/cache.py�Q�n�0��+V�@J��H9�u�TE=�\{I��K+�߻�4��J�vfvf�e�x; (����?Pܿn��L�ZlБq�KHh���,�� ��Q���5�Ѓ6��w2��xI|s�&5����ū�BY#<Ȉ�iK>�(�B�{�<��WpĞp9A�����9�b"�9y��v�W
�	��AYG���r�k�'nl�-b�@Ug��.��T�f��<M��{��P/�X��$ɣ+��O��Fꂛ4�������dr��0Xv-�0?��z�8�v�ɛ:�9��h	Xzh}��PKEePQ��d�"pip/_vendor/cachecontrol/compat.py���N1��<�%�[ؐ�ʂ���)��\h.N��o�{��C��%������]�*��&[.a��r��QH���}b&�Z�m�1ri0��epۈ`��t<LY���&���#8���{��qW�H��|Ք^�b�l��A�������Џb���
��찹jg�!7��'n.��*���X�	�/%S�:�X���)���s��h��W%�-�v�[������$5x�9g��A�p��P�:{�-x�V��j
���E/v���yf6PKEePQ��omE7&pip/_vendor/cachecontrol/controller.py�[ms�6��_��'c��h��z�q{���x.i:I�~���$�|;������@$%+mO3��,���.� >�9[+Uebq��lU�B�sɪ�V<e˲f���������R�� ��"�1,+W+Q��m��Ug�H���+��e]��ȢF�L2�k��X��@��D��DYG��R�M����3�bɯ�)���E��(��Ό�W�����q&~k|�ꃃ���Ҳ��zG����s>�O~�x
Cj%e^���u�K�rq������������	��BW���<;#����/�(�M-B�7�8`�y���%�.�H�S�]�W����󂉂��*��xd߱r�>��bg��<: *�%� �S7j���LaE��2�p
7�:^�P��ߊ�	�]�eSIۉ�X%k��\sPU�B������̻9�._v����׷(�$��d����Pu�e��r�+OT'�WȺ�2N8S%�������l���5��(U�2C(��\B��a++ɳ�Tϻ��,���s���纁'��f�T�j�<)S.��3��T�i^vVNp��b%É�g�y�hd���p�a��`�s�l�hʧ/2>wA�-�OON����l�������D�����}��t�:+�:�LNYg�F
��+�h�?~|�zLjL^�K����]ZS�3� ��);��u�%ˎ���c�+%�">ن�Yf�B��Uk�{��<��cX���3��H�ޥ��p���v0��nG�w�L�[�'058����|"g�*~d�)+�bd
#���5[p=w�căn�P*V�i��	�>�N�S��I��<j'��k��~X\�,�6�~-E�8����&�A;�	�i��=g���q;q=wW:p����Q�a�ڷ�t����7Qkݝj�P��$:~�:���������|(橨Q|��r���xHyZ��,aM��2*���Z��q�L�vz��Pj���z��<~��+\���a��L�c�ϳn��b�`�(fKH��Ċr����8J�I���0UDž3̟Z�+��R��>18o��������f���A��߃T]>n�_Y�@9;����dn�l�\!~	���Xb0�_R�]�/�`2�v�F鬄�Vk�H�z$U�i0�#�	U�Lv�
{�ؐ(~�j�������]��_L���/�ԛ�[��OX՛�Ԧ�R02)���M{y����?��M]������Q��*�WC0�6��<}uL\`�v��=�f����fy�L��a�nьC���kL�ۨ�P��E��!GF��E����h;O��I}�(��$�
�n��wO'zj�I��}�V��-�`}?���"�V�:WޞA��	�7s{0z�l�4>j2H��^���C���u�K͝(�돚Rl�?䭪�zME(���W�+����^?���uZ�@`�E��#�����]Yޑ�W(���Ѵ#��O��ʰKZ��B��fe��}���u��e؍�;�����K�:�v�3���`�X:�
Cl��s���7zW��mA�^�Pc�ܴ�!�\��/�̞Q�9�][;d�.�}���=��Z
�ae\I[�>��	�@��:������3&��#�`G=�T�;�Ֆ�
"�`X��1{���{Xstt�$.0B@eh����YY.�"�8��L���e�!���A.��n��Yk<���3,`���&��{ޅ(s�vp.��[���� ��8R���(eG��]���KqƢ0�8N��t�ԫ�/0�
�꜌��8�l�9��pn��Ë�v8�^:�á��L�B�o'0Vs+��uJYl�a�{ע"%;d��h���B���g6`L"�(P��nG���F|���
n��t*�Ռ2��ޗ�p�J1����D�PX��Rs{/�),M��&�7m��a�����,�C�#�ΐ���yGN�<v*[@U=��i^�y����u�3��I��i�D��R�{�t��tbCG
�h�tH P�4���M�r�i���{�
���	�z���:\�E�ۖ�+��G�+r��^�m���U������F����IS�`��̀���.6#�[�Gp��1���@7qZ���#���^�`�!�Q���ɩ!�+���|��jc/*�D���Yg/��e���2F���f�(ay@&!なz�sZ	 B�����.�@G&8
ȴ�h`Z��K1�K�\(��%��n6�R��:�(����y&���O��k@����C�̂y��Ve8��{tf��vx�[K����Ƭ��Lz�Wӂ�
	��{$`��㏕�Ӡ�<�X�_[C��}��]����㤝	&��9D\���a߫
��q��QE�v(��~�0�留׭�j�mɕ� �[ �X�3�# %�1G�� �ֵ����q[�Y����^����6y�2�)+��~���s:���k4e�ߎ��t���@���{C�`�ޗ7���/��v8�+Zž��ve��'r���
�^Ȫ��E٬֮|F��KzWe��1\#В�`}$i����,�E�=v]"��
/?�9
��҂�S`�
!�$�1U�<�y�
2�y�\t�_cp@-�UJ�D�%yN\��<B����2'"�5t�"�̶��vu��ò_幵����騻
pS��j���~���nn���S��=��c�����|J���X�Y^�b)����ޛY�O����!Y;�]�(ޡ���ͭy����f;e�2�l;_��{e�ei{��OXځ3	���v�.���r��b8�_�\��������c�� V̙�nU�,г3 r��P�q�jKh��>��;��VLI���&̌O�u���&�ٳ�0`��nYnG1�m�sy�8�i�1|N����
^�/kb������a��R��/Vxj����׽��u�be�F�ű�݇+Gq=����#��T�cɁ�B���TK�T����3Ё�s�CLމ
�8��'ʃ]�>iO�^�	~b�͈۶�pU2��pӧr	�BVQ�d0Y�6����\2�	���HﴱoLI�
_�e���o�1�?v��c��JW+�|�g���p�?O�@>�x4�om0�:Ə��V��0:�Ou��t7��8��ޱ���:3�t{g����iMv��J��뎞j�-����6����QuZ�X�P��[{�����v�/���e��m?�b?Űg#5Y:�����U���!�Hj�Kd�����V��&�dMI���rJ3�A�������݁�˻��AD�4�R��J<���ԍ�%Y=��>���+�fk$��o-�A��݇U#V���`_��=��h+�>m��8������KC
�-<����ʀ����3GZ���J��E��;����+�0����E�W�>�i#]\l�@A��ݫ����趡��q�k��Z
�M�>�;�WEGq�G`�|}�Ծ\H���hχ=3��i9����.�C��Iw���:X�A	J�<Y��#�D���n�'Ms����K��E�6M�a'������o�g��u�gy$�}s��}"1�������\�NW�W��r��~P
/zDLG���p�ew���f�����xZ)����.���A'�^�@n*�I�߽�.��R��-g'/Qet���@!��[�uh:��Ql��T��ی����6˩��Q���J�~]mL?�l�*�e�0CI�-[�*-�U��l�rK��|��O�D��F>�R}��@�v-�~�n[g��9�����ʪ��?��>ha=ڀa��i� ����j��f8j!�z9s�w��s�uT�ؒ$HU�S�TU)5�#H{I���w|,3���߳E�FEQDU�n]�����\�%)\?5��ne{�G+�b��3G<O��T?1�ť��������I�&t:út�ڊ2�Z��O�-�A���~O���o�P�R��2N�������ҕ��moRbvzrB�׆
#	v/�N�[�a��q��S��w#��ʓ�'���PKEePQ����	'pip/_vendor/cachecontrol/filewrapper.py�V�n�6��+�am ��=�!M�@��{�E�,�)R �8����lYv���!���7o��ߑ�d�އD?ǟ_���*FzR�VJ��A�=�����N��\.�O"�0��
~p5)jz����� *1�r8�ָV5�<�U
M��-;J�JԀ�H�ȈO#��#�>Q����`ڻ�.E�͈3����*�`*`D�f�3H:� ����gf0Vs:�G�	�PC����C(��P�D�૲\�E���n�E�3��I�*�M
�H�U�?@��b>�����4�\E��=T���8�I^�(K(@�s�W���h��_O�n'�y�'!8Qp��Y�;h��v�
�s7v*Tj�萵��x���c�.dL���D��1""�2 ��9Q��e��t��U%���۟� ����{A�?a��8�er�f0��B�a�*lY{��C�3M�쑘����k0q3����V9�(�����iY�y9�Z�3W&"�%h.��)��a����E�9��a����'��4o�
�}�E�:{�����4���'����&���;D�./����Υ�ļ�=W��8S���6�V
�ˇ�K�]D�zNj)��4�馉�8={�/Ҍ�C�;���u�b"i�VM���{Ẇ��Ǘz�kl�����Nl#�(��V�ge#���<oU4��_3�y��,��ˣ�Z�ojAu�8?�Y:�I�ãZag�Gi�`��b�l�|̀pA�*��z�����q�X<��-,�8����Jq�X���q�:��i��[�m^Ɋ&�_w����5¤!�,k�X5��>qJ}Uo��8�<j;�\Y-�%$�o6"v
0j�����A.�c�|�t[n��NV]���Y�k��ex����\��C��Zə�;����{��73�ɠ�8�gT
�׼�EyE��[���n�Z~	_���
�ZS�Pı������q����<�����7�G�n_��,.����
PKEePQ�%m^��&pip/_vendor/cachecontrol/heuristics.py�W[o�6~���T�=[�c�Ō�[ӥ@�n��b(
����
Ej$�-��wH���$N�Y�s��HZ�Bj�bFx�e��Ϛ��˥()0eQ�)S�}ͅ,�ΰ&#Tb�H�6�ߝ�y2���Ya�z˷�ɛ�%:AA�P?C���g�����	�u�z�^FrDnJ*I�sMdh
��Փ�������g�����q
I�\l�DW��B�"�u��-�5��q��i��C ��EF�Q{����p0�єa��X�3RI�4MC��FRc���n��_���|�T)��)�_��:��1����x}T�l>T�Tҕy��ꜮIcg�*�µ�z��%�y�*TJqM3�!-Œ��w��WM��Fy�u��ce*�D瑐��Z,�y��h6� o*��8:��h�&��
A���1��)4�)�l�޶"א���E%�eѽ�Z=�N'h���{>i�Z�|~Uڅ[c���ŠZ8����P�F�o!������l"8�p��5�[h,��*#H	���Bj���?E/9ͷ��06X�%��j[�Q(�q�;V@\#�[���M��q��%�>�W�k恅�4�Q�Fqͻ��V^%���aGi�Rr��}L�q!���Ų�I��-2�g������^��{88Ƚ�f�|��5�i��&�ߗ�J�W	T�.�Yd�����&������y�I��{r���2p>��w�j��zC0aW�K`^_�E󉝴Y����U'Ӂc?�á���x�uж�8��u,�a��e۠�Tp-�&��Z����gN���im������0��C��_E�V���1����qnx�$���'	�T'�+�px��+���!����J=}�<P�����	Ԕ`q�#�A{�`}���E�L�j"yUi�O����ܸ5�U��)��Z��tK5����M��a��EFsJ��E~k'�t3�/��I�َPa�N�����[�V*�k������6�GGёU�hҊ��Ő0V��#�����67�(��>�6��]�6,	˳	DA$�&L�ۨ�)c�D���S��Tş�*>[.��M�����?�������K� N+�R�$�Do���aNj�
���3��%>|��,��~{i]\p�3i�4�Tי*G��ZF���c�IV��"��N`��J�~�Ѭ���d��������̻�d:Bs�n>9��tb.�x<�Z�۟h�{g��53�oMo��.;�6
^�݌{�@C���݈�76�DO/����S�[��6}��3}U���J<j��[�$��
�D���w�}�X��i��ǒ�>�b�0&��9����\�F�\����M�ɱ�7�dd���N�Ӊ
h|�V\;����D��Ѽ>k6^
��#"��i82���d2h!p���O��~4�����]���¦��-t�8\����¾��68H\{}��PKEePQ�ȽZ	�%pip/_vendor/cachecontrol/serialize.py�Y[o�~�_��(,������10�^�}�&h�̓a�)��p-��H��$��9�H��v�h�Gɏ�~3oZ�i�Sž��p���铒�?�V�|��:ِ����D);�V����q��u�מ)�2����}ǔ?�n}/�k~`ox��Y!��j��_77?���V��Ћ��5��w�Բ�fS����o�v%+d�v�I3�����cp�p\f����	�QUp%�
��)��&�d3�u�����*E~f�5��u��?�B���{ʾi�0���8A��4��i�A
殷$��ݞђu�l���m�ۖl^`�A�?fe;��e�X-��L��;Z+��|����5�J&z��S��y�)��=p�@��a�Ϟ����yOJ)�5��#�491M�$m'l�4���*^к>�Y%�Wp���{��u��*^�cGۖu�k@����_�t�0ۀ�	�U-	RDj�� ,�!��p�_��~�B���V��V�*�'�O�(p�F��F�T�g�=b��7�Lqa(�k��(�G�{B�8f1.h}�'uAZ�rV��B��xw�Q�`��#��~t��>�lLsW�`�\f?���1F"��&y�,���\�#�0����>W���
�2>��t�{)�7�g��bĺ4`��	n�
�	��0��gK,8�P��q��y�y�5k�+pe	�1v���p ���.yU�9Q�0}d@AH��X���X��@Dʺ��Ҝ�
.iR��G����*%S辏Bg�e��
g� G�ʓx䠧|I���NC��*�p������>1�>�&]ϖ�2�,�W���"*�(1�.v�'�S���*>$	��@Sr@7���k֨8Y�&k���u��0���^P��R��ݫ����lIs�=AP2��o�N�Jxf�2=��f|
l�54�}G�;'щ1܂`-�C�� %��P'>�N3$l���|�pG�ښ�8J��:Q�v/�6Ż^������#�v�V��@�Me1���"5��1���mY.<q�T���g��[�U����8h�Ir��QQl���G��T�Bʇ�C�����%-�j�3�s�|Q,Gv~�@Q�clDŽߴ�d"��DhW(7|7��e%4�7L��� �z皈��M
)��:�kGH��2�:r����if��v��Y)J5%�F��k5��:x�u�[��Q��Q�ȿ�#�% �'2)�j�)L�����2�j��h�i
(I]A��(�F�,9@�^_ޑ�8��)�wd�oSu=��?])�	}��^�k�$8�a3Ł߃|�F��_��z�vL�+�|
��Ԋ̘+id���\���yZ��m���^Ƙ|�3�;��G�`CuHIO�a3����C�fgc�5��ȦE���T�(4.��)Q���g`�z��Q�X�aKIÕ-]S��t,t�c-gC�9�xS����GQ���:-	�����
5�#����%�X]���W�!�e�0P�u���������F�BaT`H��C��
oC~B�(c*KgC\
�!2J4䘪YI׹���\�T��ے
�[R���&��cH��
����
��J����~�H���y�]N��.L^����eSF
9<y)��c0B�?�*��4�U5X@�$5��x�T�$�����
����1��eޝ���ꮣG;��۱н�Z�ƶ�
|�����v���PK!��^���LX�,@Q���Dž����e��<P�,IC��6O�D7��(�E������P����@	��� 5c(?�"6ʒ�ί��P�
&�~x�cӆ�)�-�L�� 1����%�"��D
>��
RA{zh.،�*�kSU�d�Ҿ��"�p׹im;ܷf�g�=�j8`]E�'�3���-Y��a�5�����,�yg:�J���Ҕ�ѧȯ_,�e��S5{��Ʌ>SaY[���mC�paM�"N�$�m6h
2�`8��9�%H�+8s�2��h�ݫ�[8���[7��l%m����q�����l���z��7_��8�6�Y(��l��`09L̈́<c��bR�ŪьX�
�-L����fbM�ٗ�@�1�-��OoO�tL]�:��w�d���dzW.� ϓ��s����/A��3l:��c&�
9�,75Xr����ٛ������/��Hj�8(U�c	����:+�b��H�^o�:i;�å)9B�}�f1G�c��d���62����b��������8\�1����D���k�/PKEePQ�=����#pip/_vendor/cachecontrol/wrapper.pymQ=��0��+�N �v��p�͝��\0G�@�m����	���~q�ҡ�Y�jb@i��!˛�=�����O�D�ì�_��K�-t;[!�U����FH�X�S��yA	�(k�����
�ѩ=L�����(��]����,4p�ڕ+�"�[�4���K�㬷w�;��db�-!��5վ]�J�(H��e�c�[�\����;v!� .��?n�8���r9U���%�i��g�V�PKEePQ��07V+pip/_vendor/cachecontrol/caches/__init__.pyK+��U�K��I�ONL�HU��-�/*Qp�8������*�RS2�Q���P�PKEePQ��/�	9-pip/_vendor/cachecontrol/caches/file_cache.py�Wmo�6��_��&w��[�6M��
��Ң(Z:E�%R �8��wGRoV�b�b�G��s�O������(�f&��2�\��Yx�;�k�3�@ڙ�q��Z�;n�:��V���nq�ny6�z6c��%���R��.�VzO)Ԗ�xn��{�����g�9����q����b6�e���@�hHT
2�ia!��D�K�W*�Ek������*�vӃ-�atjɌb��	˄;�!����%0�2�:��]�n>ς�tq{���}�/��.n�N�%˹(���8S��x�g�$�5����
�9��K	���`L
���
��1@:�@D��:��kn�#��9�ꝋ�~??W�{Ť�,�ԫ3��rkȁZ�#�
C�@ITM���V��۝ο�
�j��0>���C�3���C�	έՑB��d��Z�ܬ��!��8���k����Π�_��mO	�[!�����z����q{^�Z{��..$��@�A�2(i�e ��\q�&��di�����F5T걯������R��k�Y5ƺ�:Z��,M�d�h�ي��e�8���v��h��p�iDW$ݏ�fHa��e��脒��BI�H�ک��)�`pTr�D�9˨�ˠ	\q�6�z��,�,u��XQ�Q+U�
i@e�PM�
��{An�|�m��j�B�x��C�e��nîE�i��4�l�%��32C"�6��l��aV���J��4d�zMNQF��S��>�j�
R;dSZ*�d���ߴ�NB��]QwS ��fנ!�M��;n�̗�[&4Tz�/Q�<�>�⥁�2"L�O���ӑ�v���:�0AYB�;_aFz-%���u;��8�ʁ6;F�
���'�/�E�.i+qk��@�U@�ݦt�uӎ��&��wJ��q�E���>���p��n��n��J<�C4�o>���V��3v����X�k�"�W�o?��;-��8i`�~��Ԏ�]܏��Z�g��R���4�r���d��|��ul��E�.
y�(��0�%�snʷ�©.���+9�\�<�J7��q(E��lj� Oc���������T��)����Nf���իߣ�8l],��2��F�AG�e�zs��Sz~�Q����>OU�\>���<�	{T�
�n�]<���Xamm�NN�-�
��	�Yc>q�L��O�1
��7�;5�� A�:�j���/���r�����}�_��7jn�����K��)`�}(`���*r����$��V����t�n��" �b���g^�4sD���h�}p�u�y*�>3�c��'�,�A>?�-��~��f��~<p�]�&j��2�3����0�Mk>�m�t0ԗ7CXO~E�xj^�ISt:���"m.��#M+�ӟ������g6D��a�[�d#d$���J��~����F��U	ş.,�i���-��������#l����"$���&��>�)��E7��{����?�x|����"�|�m��n��PKEePQ��A�gX.pip/_vendor/cachecontrol/caches/redis_cache.pyu��n� ��<��S"e<��^��N;L�1p:4
&m��3IJR���~~�)A�~�cB����2Xwr�b�/Vg��5����
R�0ؘ���M9E?�\�WM�VB�5|�u4���l_�>{���J5���U�a9%(K�Sj����6DBn2��,��dEi�vp�~��2�����7z���5��o�I�/Y��Z���Y�����s���	�ܴ�o��|��Yd�Y{E�E,5m[]Ԏ-zF��kU_�nge<�4�f�۽�0A�\�����yX�� �Ҙ��W��Eg����c��{b�+jv�UԚ������wLO�#����8�!F�;~g�r��f�B��:�n�PKEePQ7��@>pip/_vendor/certifi/__init__.pyK+��U�K�/JU��-�/*QH��+I�+)�Q(�H-J�⊏/K-*��ϋ�W�UP2202�30�32P�PKEePQ/ ���pip/_vendor/certifi/__main__.pyM��
�0E���)�P��n�
"�!)Rc[@�Kܤ*����Bb#-5�13��V�a|A�
�$8�ů3�,��{�~i���^�p�e[�soJ�K��4�C�ܐ\o�0�@�b,��X
�(���F����Na����N��X�J��]罁'ÿ�^߅PK�mW�h��	pip/_vendor/certifi/core.pyuVMo�6��W�!�b�9��b�=�ͥ
��ͫ��mdɐ�x��%%���d=����/h\�����m~���(˲hГ�t5L��So{�w�h<��m�#hH�H;�5��u�(A��y��BKh)T����P�/��/q�|�s�A��j��w�w=$�����F�(�5�A�!���U[~P���o���o��W��Y�X~}z�c^�-vpܣ��C�T�;���O0z�'3��zkp
ۑ�pT��5��UCL{���дe�go��>�[B��CN0hӣ%m ��$_32eC��Zg�i���&�v+.���D��'Q�b�Xa���b���N��:���U�k�4U�V�8��-�f��ݥf���v���~(�>�S�(��ח�M�ɍL�\����L�1��8+$�u�νu��E��7g�$�T�|`�+�Z��M������>`��o��W`G�_���P��m�QI�i	y���>�X��+����{�JSҴ��"�wp��B���H���1�V�~.0S��'ϐ8e���CS]�D2�n�P]�]A������D���δ\��&���kN��Qc�+�9��],lI�>�
{��[����
a+�_��	+�z"*�R���6�kĮ�h�e��>5�٪�P����U6�r
��sˇ�8����tŔK���r0v�xE�
tnҩ�r��>�?:�.��Yc&0���y����-qb����n�e?ba����&DW���;t�m��2��T4<ն'^F1Z�s�A{g{M`�;r�}�V��/�e@�pu-\�r}�)T˘X&ͪN{k�3m�_K�˳Qq��⭥/ώ�/R'�"uiqY*٨$�U��^�����A�:��\�һs�K#��M��9��BvP��ҹ�����f����՞{�L���4�p���<�Lx�r��j�m���t�5(�3F>����7t(�PKEePQ��S�pip/_vendor/chardet/__init__.py�SMs�0��+v�!0�!�^��IL�)56�pa��Z[r%9���ޕ1P�1�����۷�n��W�m�(���ȇ���+���v������S5��L!���yb
/��$L�”k���2��g��_Ȕg�ݪD�
���*4Ȭ�s�`�Z��-
T,�I��yB�OPh���{z�)��7�F��%�3å��tn�~D�iN���V���nj��@���'�5��m�n�����E#��%��&A*��9�*�Y�;�@X���,/�ý7�za<� �YK:�G�(��9	SU�	S�q��O���]� �[�� �(��x
L�i\�F�&��d�.@���؆�VȻ�3�,$%��a<כ���^M�����	�G�� �e�_=̥xh�%�>��ixR�f����%�}D�:�e@ &~�Ԃ��C���0�R9p%���oqON��O����,������_F���dJ�&�(mߋR*���Cg�a%�%�S��ʸ�Ͷ7�AK؎l[,ڍ��4
�!ݜb�ު6��y�w����Q�m�D�����f=p;k�v�Ń�i(�%S����ݣ����*Rj�Ϭ��
��%�`�ri7�ri'u���s�\�ܴ���0Rߕ��V���k�b�&/&��RR����b����6�־�^w�:� �9�\ǿO���t
fzVhߎ~��\㡯-
.��
t70��g�wq3��]����C�\j$�_PKEePQ9���9zpip/_vendor/chardet/big5freq.py��]�%E����W��Z--%�ѽ3��SZآШ�UI�����*��~�y,j{�a�].����x����k����w����?��/�ϟ|��_�}�������?y��n~�=��n���o�����>yxy�ݿ����_�z���ǟ_߿x���q{�����E�烛w}��}|�Ow�{������7ڌ�q��͋�?�_��?�~�|����D��W����ǻ�o�^n�j���Q�i�_�Q?����[9�#��ͷ�}������ٞ޽�{�����'��>��s�7��C��my��o�W����x��=|��}ؾ�������T���������wwۛ��������ۋ篷ǻ��o��������/?|x�����_y���/c8����o��៿�f���M�t������W?��E|��w���m��l?�ڛ�1S�ё���l�=D�������;����xe��wO�Z��b��{����j����u{������c�/���6�C�}�
�@	�ھ��~~s��ϯn��x�O��˗�<�>��ۿ~���G_<���1���X�l�ǟ�_n1���������O�%>���O>���'Ͼ��믷Ͼ|�}�}���gO>���n_}��/���m�����3��5�g���&|��|y�����79����z����w��/��â��E~���k
_=���㍏�cB�����~x{���x��V7Z��ކѿ��v%����%�:>�����g�o��޼��(>��R��K�˶}�u��}�ş����n���6������a�Ͽ{E_�@�=����N&6�����W�?>�؇?�~q�*��~x���?|��/����˟?x���������/�ض���m���:K�T�|��X��Q껗Vϗ�^���q����K�G�O^��>�Y4�{�4o���+�_��~������i�������`t��F�����i���#7ү?�?���=��]P����S�c��y�f���?l?�SӁ��y���77?���_�z��G���'_?{���o�=��o�~��!�X�O~x��a�Q����z!�*����?���'��S��ּ�����g_~���O�Ƿ_>�ӧO���݄�,�������mtyܖ��m���6�zƏ��ۼ�����}{�m���֣��n��2o�Qz|���VW���\�۰`�Z�g��X����9��v.�\�m���9Z���M�[�xz�m�[��Z����8�-X��c�����8n�ŝ����V��~�<�/��Oo%z4��vk����[<����_�ᛣ'#&��g�}�ɸڝ�&���kw��->��;o�r�mć���o�b{3s��6�Sy�5�~È����Y~�Y��t�5ZcFJe�wgz�"�����0A��h��7�����X��c'�}�#�:w졸F���h|���y�=�nbz��<x`l'F:[,�~V�9���o��<�k���-�c�3����-�n�u++^��0g��=&����,��'H�>zO8��m�?�͎�I{���o��r1�h<vR��?g4�;X��y��l�N�f��׶ܩ�17a7�;���Z�!,�����bF�95��I�3Z<.��3.�h��>Ϸ�ig�qnJ�t��G��P�?�Îӈa�;)Q�'l�F��S����Q����&lЩ�+���9�M��h�%f�O�=ºK=c���nig�7�j���=�mѷn��Œn�l1�X�Rb~ce�-�
��������>���ob�[cVW�1�x��c��4�MwT��k��a{�kt��j�(n�����K�.;5�ߘ�X�k��+�k1��U�0��l��q>��ųʁg��1o�Y4ڍn�ӝ�`�Z�X�>������AW[�9<��;�g�+�[gC.��ɚ��]��ij0��4&9�v��;4��ŋ��h7�j�8n�
D	��<�~��h(�C)|'�nll�9YP<����5��<�=�mFc,,��ř�]��y`��m����T�4��h��n�ßU�KL^%�4V+��1��ѱ�xL�ky�.�e	t\ˍs/��Z�7�-M���w�1�XX����Gk��x��LP��[<�<	�p�����m�L�]n�:-:}�ӈ;8�N�˷�o��/�0a<���c�̯+p���OS�N���z=�]̴_G�H8$�V�`����g]�c��qt�:��`�	�w���^	SfFN¸�*:��l��{�u�5=�1�1#⍉�㭄���bHa@�u��%ƃ�)�����\2�[1 �K^��#���.-��xQ�k���=pI4�<���S1�Œ-�lb�,h���#`�@b���0M�(�.i1�������;�c�t��緩w$��1������v��-�X�y�E�S7��{�EX~{�\Ne��8�x_�v�C�0P���V�n��x,v/]�P|�<x|boX�a��?�>�K"�b:IJu��p���f��_8g��Ǣ�2�щpH���.� ���*���6C�����	c�5�u,T�2�X���E'��[���х�Lj���@��tgG�c���⊩��7Zt���0:�ο����n/AJ��$cm,&+���P���}L���n��-�&T���;�uΧ[�(A�5���X2�s�0�=����S�A��̀��}4&�ǣc ���8L�ʆ
[�v�T[c@aD��}t5�0qC<>I,��b�Vc���k.\=�%1,�=��.����������0p�Cu�po�0H��W�o`���n��"����-��V�f#��w�
G�Lf�#�a.	[a��k�\�5s��U=���d1��N�/ijb�GF��X؈Cþ�V��.)t������fJN>� ��Q��0�ޮy\R�b��?t�ly&�`�T6�[A��ߍ\9�������1�V�@� ;��OO�m^�"�
$���Iw6P�V�<v�ķ�`~͚�r�N�-:�ݩz1\)�IάWZ�v����V�
S�xu�g56������i��4�/���apD��Q�j\���k��l�Q�?,�1$r�XP|��	�3�c�܍1�Z���L^&���C�2��FBq���*&�� |;�H����r����u�El����&��������t�xQI�uY�g�,��<.)�q�1z'6d�<�Ly�Z���qߤL����ć�ᷴ�\22a�����Wt%8:�ϝ'<���$c�ISWb���P"?+(�-q�Z��������<�}�b�Y8��ɼp��X7���1�Eʋ6�&I�efD�J*v2�5Dt�|8�2��#���$>��^����9f��vIN�ؽ��I�v
�K��
0�v��p�����5/g�-ǰX{�!��dZZ�(�ۭ����}|.iWOV+:��<]�-�Y݅�ݞ��:�C���' ��!pI�&x�T6:M6@��4c�j�w�O�c�ӧVf)���|7aHܥ)s$�NlU��C�.�mA	P�e5�p}���%`�&U����*�1���D�0��d��?�u����'|�LB���t�1�����������
���B�5%~8�%l#�V&/>$�6��0��ğ� 8:�0�i70,�Q=�,RX�mAw�v�RM�!|�LJ��2ü�+����2.li^y�	_�'omĨ�.�c�9`@� �ĦN6BgFd��(i	�,���x2��nE��
�s�Y��q�s�}l�hݛ~]�O�dF�=�
\�aϞ8��-d
ˇvmd�e'#���&-�y�m62�𧮹���v�ć���Y%%#�(�|L�(�+���hRw�X�M�����A���d��
�p�U��u�'�]��ǽ5ir�2
ɗ��U�Ez�t|��K�I�Y��7:�$�9�n���d���.	����/�1	��[�9��w��t�V�O����J���Mt��v�����$���4�9_�&Fa�ڠ��3p�=�-�M!<VX�؋4|-���n��^���X :iI��Vpj[r���M�6ra�!<%�H&y��s���@zR@o�o`X�侈�>�|'��reB�>6��{��$�8�X#p	�d����	+�.��y(�n�M�*��,(L���m�����莶R�5�<.��Jl�A�������H��A�3a�BA�y�,ӀڅwH"nb&�:f�@�r8A.�Qji���`i~c��`�d�״�.������$/۬KL3J��2œno� ���,2�}3q��F=��uN��C�AzDj1��R4��e��Fɬ&��ā�G�@{����X��j��*���_p�޹�\�u�w
‹��5��K�
�ܢ�e,$[��\񥳄�$�cF'�U�$^����'�ڮ�
\R�/����-�#o��^���p��X�[@�p�^�.��[��%7�0,�i��lp<����7�C1{��7W�[\R�Xm��j\T�.�4">nH
�ةl�W*J
qm?���7�&�X �z�c0���f��-�t%���]K<6d-��Z�.ͳn�Y�W�e'��T�JJi�jAqoC���F�6iR�!ἲ�I|��6Nc	]��2�Y��R��E#�q$#J���	܋O��C���*#��j���ÍR�h���Y�������K`bc@e`&țҒ�%u���t���SbM&��T��r\�;���'A@����`�$�`��\Uk���v�e�՟�Dg��%pDp�ѐ�"���N��03/�ogi�QE�Y��
\R��#2L�����l��#g�c�na��=�S��/'���:|Ia|�b����؊�%��%��{����끉7A�)��"|Ә��)nW�Y#d��p��L&i��"1�I\Yx�,'3�q�|�pY�Z�9��l8\
�S(l s�U�s��-H�v��A/2	�.T0@A�p�iѽ9��doJx�p��ўv6��W\���
E��VP�b
'�����P��TbHs���Fjx��O�v'��2E��CK��ԂPş-�M�Ϻ�L��w��ő��RcW3z��iL�OBT���ؗ�-�a}
��
\Ҭ��ݚ���s�j3ϥ�����1��G]� �K	BQ��~DKr��b����t�b����
�x`���)�ӡ�$۝;�v8y��3��	�*�/�g
M���9�%�u�������q�Vp�XA�bV�/3>��"k�OX*���F�0�]�.�H@�niSb���S�;S��E�������@��ƽ\�—ȌS�ad����p�c`�N\YϢo)g5�R������$u���'!c(C
h
n�j� �ެ�
7Oh�7C���U_�C���ܽ��W�7�W��j�G:`���Q���83?�%��f�k��,�D"�!�HZ@2	���R�;�M�[��IF�E�+^,�8��@���Q��
o^��Z��,��>�=[��N�[����P�+�$�$��X��>���Ҟ��D�].)v`�Rg��eG���3ȊǬ�{�3�~�|�����;4�%���u��~�Du��5��f��K�:�x
���� P�*R;�W�~���hƴ���쐓���CKw:
~��]X��4GD:�v��<ԭ��s9Y
h��3|�ʨ`{�4��6�&ƄKJ�Xl��3S�2�HªG����i�{�"�=+��N<�:�xW'^`�pp#G
yt�H�p}��Ωw�M��`WPl.�7u ᰨ�d��@Cr�ZE:�4��]{MN''+T�� ��Y~"��.A�P�?t˂���:X(
B�n�j�������
�5*:����/!����9���8�[Xޑ2�"�'=I��[`���0���_��
<Y�/7V�`���J�!}>#�7<�;4��A�:�� ���=��4�t0�봿�k�\��tzc���BA���8�T�Klc�	�@{]�� ����_3�&�:o5G��0��v—�g�]䑢���q/80ͣ�8�����Ka��l�cK�?��%����S�*�,�Հ�.�NX3��J��� ai�@�w�Ӊ=c"�X
K�r�`�fQ�02ڸ���u`��ݘ�{�/Y��ꂊH��l�Z��`��ﱑ 4���2��#%��m�.����
M?5�IO��ړ�D�5��NL�\Z�
��.L��K:�b@��*�9�X
�(
��А�ֽ��O��fj�vսVձ8�)��FP2��p��ah ��E�2�4]&�Yϼu���P��y�7�}
-�&i�����W�R�sC�wb�m7�%��!�=I��d�ѩ�!�!xc?VHE�+�[@KiI�+b��V�vߺe�]%n~Y�s�(��8���X�/���p��<�G�&Y%ćw
&�
���/��K�&p�t�Q]h�5��^kI����w�Ю�}O�?�"�E�P�۸Rx����6���=��b2D4g�U.��&A
�Q�`<����	�r$O[ѽ�C�An�J��;ϒ%�X)ZF��‷�
�ZT W��^�5�bh�ة5N���]A�H��%��!<�}!� t��xf��K�����OLJZ2��S�$u�>���l�B �aj��.����~��ZE~����`�~�F8�6��q�aΡ<�f��uC�ګZ�l�X�J��;�����b�s�b)�G�(����k����kE5d	z���^N�Ad,d+����@M2̴��G��MS�	צr`�{0)$w�>��B)�`�+������*������rWK
�mE���¡k�ġQ]�ݘ�v��U�b��Y�XLI�5
�̖aY(��t0���iU,\�_ҥ�O9\d��?�`A�*j�17`M'�V��I��3��n��5^� |u�e��"Oo�"ᢅ.�$������J|kz,Ƃ+����nnk�	��u�z���,�<-J��o��h�	HGt�QR� ��kG���1[
LQ�7�h�ѽRr��M2>^���Q�F�c�N��v�v�ެW��K�θQ�Õu�.��*n�.��5��r3Ō�1�k]Y�PU�J�T�z-�5�Y�HV����z��B������H�GM>�R3��u�`��e(�6��5]dv�CEK�<�P=�1p�:�ce��K
Ţ��Xk�0�r?TX�F�8a�Ʈ�3w�!Ӯ�"��5�JU0�-M��U��F��T�L�n�^GQk�l��
�[��!pI�>��E�[�
1�1�0�A�kTs:���-�z�N� ��.�h3�����/�yP:�1�I�Jѥ���Ԭx�S�
^��e�^�f��"1
�Gc�ޱ5-�E�1��Th�Z䄫��
(�pI��C�d�|��i��
���eP�Oe<l��b0]��c�/���<��!�ر(P�fr`v�h);�er���#�\�	�vѽzv~r�t�fŬ��l����q�!x���aY_`��ʗ0*���i25�GΛu�K�B�f�1�Ѭ\��ɟA1ag�2�3bI�6ݰ2�KM�ʠH^�qrl�hH�j��F��*��:����9��U74�]���G��{��\T�Ҥ�7�/{@�ZH�+�B
mbc�����.���3[M姍����n�e�rнs\Ĥ�F[v��K��P�6��W��|�%@oJ��X=���j�&�����eg���:�!�P/���+�EN�ں�.i�iq��
��au���P%���p��L5%_O��;�'YvUjS4S�7�y[j
r�To���
�M^�Z7t�#��^bbdR��[�,Ձb���R+�4��kt�F�Do�ѽ�Can�Y�J�L!wk��b�6��$�UX��nCD��U�~�t���P%PA߅m�H2P��I�_�q�g5�(Tn%(��ݱ&F�=�1.���~�zϧ���˔�c�ZTxP��\h�f��V)yϪ�6y���-%��$M\(/e�O�zÁ��0X\�8�z�n^���4��1A���-�ycV�#婞��v�>��>���d�"�q��@
��
I?n}�؋6Z��Y�6+']�xt�+����O���D��1,�`߬�6�)���y6�A�>t�u�>���Û��t�W�tm��fkԇȻe�a��P�y�C\HvKNi��'�[&�P��Se�H��),�}����_�8��ǸY�5����4�ʼnc�.(Y���,v��}�t��L�j�3�^����GJ2����MDŽ��e���YE�:Z�5� �P���ؕ���0��͢^�Đ���S��"yp薈��u��
֨��X��/�/�Rgh\G����Ӎ�gݿ�{mPE�s��u�{D�S��P�-���Gh�*�׭;U~�sT��#�?�⟚�G/��mR��ΐ�v��ٔ۫�(Dm_�Z�+*���Z T"��€�����Qx�v4�u�H�J�X����hnM�̩�����41�$��2Gr3��S�~��5v��E_�YT���"5X$���zn�#(�(0=N�R�,E=$����|KE�Z��,5ԍ��.TQ���FA��촖�M�[������u	
5�z5�"rV��H�����Vrd]����'�?[l(Z+��A
U���8ْC�nq�PPY;<�o�(�^�Խ*��f�++��
�\��u�>4�
�m�dA�g���R�l\f��C�3MI��~��~L{njN��J��p���.޳�{=�h�&����<I�_����SH�>�%<h���s5t��,��6I,)���޶��T�T&B~nh%�w3W<���#���/�m�)
@��EC\C�0��̌���-+�t?A%�$��vF�j�T@�<�j(L�=��!8v�@v��6�?�wӟ5t�1R̚M����?�)�j�I�4����e�[��~���D�B��a��b�1@OІI��S\��<D�>2�%71A��
�k�ʃX�1j2&y4 A���cm�'�Ġ��+�=��\7u���,qK��|�6-���Ԕc~�sciBdH<�Ny�BC�:ȏ7�p���� Х��E���8U����S#�#�h�^����������D ���곷O���%��D��S6%���*������4=��[�)�.�/�CC%yL��"�?<�aY�v9'��֓�0^��<웓L�Q�9�ǽ��,V��D�X���؆�@�
5a��$�̢knkf�ƃ��@��)Ȋg��1G�zlC�ZqnE魩��T!�1V>�SV��!&��h_j��v�<�{����8�
���?R#b޿A�u�te#4��� $!�A�{Օ�r���4��"�v�]��HI�����La	w��3��TpK�M��M-��X7wY��0e��7��ac(�e�>�2��w�.����(-aGSG���o6I0����$�]�u�Q����W7u�����;cM����1Q!�ӕ�{�M�%����z�W���9��,^s�#�	��)!�X7U^wi��S�Y�&�����O��QIA=��΀}�O�"Q��,��DY�!�ο\�$���済v�{��F���4nc�;���V�碼a�D)ϋ4t��$fX�0Z	��K�<��<��v�R��yt]:�����yZF���
��!�JjQt�H�7(!n^ys�**ܼ��t̓�WE���P�$W��O�=1β���P�GJ�,�V�9�S�>��V�5^�5uҞ�˓
)$U��j�=�O*_�ͳà���5��q�V�)���9Y�M�5���8��>��i����`�yQ��6�e������T�5u�U~�B'pG7�]e�M���8�SQ�35�u����)T�fHT��&�p{S�O�2�߯vї��S`H��a�n���(U" a�uz���B�0pQ���j��u�3�ۻ
�S���]��F��Gn9��Y�����4t����y���>��ݜ�3��v�aH�S�R��Q2"Һ�:���-�{,�XL�H&��b��}
=[݃߄%���.o�f5�#;�<֣����ܩ�}�S-
�B��׉L#�c�u�U���]�N�/�|֮udVRAXr�Y���I#��گy���ܺ{2r$F�)jЇwHo�Y��y`�!������K6O
�J�a�<zS�
��a]q �J�,��R	7:kHh�1d$����%���^��R���r��$ȤzN��9���L{qْ�>umi^�@�<����e�)p�*Me�mJ���cC��1}��Bua�d̴3t�Cz�#ƒ�F)�Z)KJ�pFYV!H�f{��'
 �����нn^;�-A��BL*a��iD�Πւ?ps\��@����j���`�fjq(
�� Ɉ5�Θ��6yq���*17⧟D�:�#�'�H	�JU(� ���-Sxm�;��`8as�u�_t���T�7?I�UYPݽ **|��;A�x���L��>�'Hݫ������%���^4f2۬㫅=x�
�_��e6t��@5�k�l���JV~4�QPݷ�t7�ʱ���kЗ(螲�8dY�C�-:���,��'�M���YI{@����:l�̺��J�/�7ɀW�d��W'˼lϹ)���5u�yۀ'����݃:�h�
Y��=�zh��c��If4���%V���I{�+^�b�.�j��n�c�V	���L,_��]p	T[�l�t�h㪇�@4��(�@Y�+��μ�����#���B��<K#���J�]�2B����rS�~3ŷ�ʳнn�B��DIw��.UP���&To�4>VЊjX9<l�PK\��Rn�|P^�^ׂ�R�!�ġ�]\V-R"F��� ����/��-�̐�6rY-�64̃���M�p\^Ԅ�����/н��/|��S����>�D�Hu��$"qsFo2̔3�r���{�̦Āl�7x��D�W~�9�
��-0�X����!�ը���]�'û6�K�N��� ��Ib��T]�`���Su�u���LDN*�����Q^�%��
������ƌ����]�f8@��0����Q
-g����y�y5�]�|�r j����3�{�ю|�Y��0�Q�d��Y�>����)�<}�C�!ka+�E_ƒǗ�:oE#oI���'o���9�b�ܲ58�<ӄ\�_:���u��m�+Á�@(��-����9R���&M>���*�~�/u��o�S}��@��.OՇs���5�<:kLv��p��[r_tu�zXom��
��RW�'v�1����t�F�k�@M0]:�%qS�W3�2��,���<�������v�sC��L�R�ѽ��2j#{4J�Ρߡ�CTl榠e�v���:6p�e��^��z�,���z:��>q�KW��TY�	欆�д��CL���YG�Z�s�������	�FWv
�e)�߬e�|XU����{\�0��j�P@e!��e�+HZ�K�p��`�$�+��^�g�H���<f�|V�2/��,�O��
/ZQ
A�g���/�(����{gq�u��G!��TTjϋ�B`R���9J֞�ynČ<�K�}�Z*���'^LJÇm��:��A��"�L� �j�rO�wp ���ni6�z�&����'�Q�Zv�O�΀�.�R�[)I7U��}�1껐:y7f�^u	��ּ��@�y7�'ïg��ϚVN�a�Qm�Ԣ�Ff�E�M`�4G����C�E�E_�vKy��e��H�N#^�K��K��9�bYѪ��н֞�"t�h�K�:�ak7Fz)I$�18�:8����wԽ�Y6���g�����$��tj�@0� ��I��}A^i�
İ3�YB��g�\hX�v-`���Ҫ�J��4��V%t�#�z�-Yo���^a�.�V9nU�E���.���ewx�J.��zJo����5�q<w��E��@�gS�Bx�:KKCv����|��ӥO�x��R����[�=I���ʋK�&�>{^���bz4a��3n�{�@ȅ*	f�&;x,�t����x��=F^��.8̣�\����^�4�Rti�iety�C�Wño٢VB��4�U�\r�t��i��
TF�/��J	б|���Bw��K��o��%"G��ѽ�d%�y�t��
� �t���bZ�х��1�vR��ѽVdH��[Y|qH��Uz��@�n乃괄��mZ��9���ѽ��]a
���+J�t|y/ 1���P�
 C3�k��"���*׺qN��d��uD^�Ͷ�K���G���Qmx�o�~��/:�׆��y��l0�C��zK���z�F\�B�[Vt䀡\Ǽ��k����'�7d�e�����ڕ���-��!��E70�c�}6\S~�/�
@�X�7��J�6Ms*�Z<צ)�	@%$�F��ۅwнz�u��:��ܰ��W	�6᝷��gM	N��|�x=�lx��<e�e�X�g@9�E:��_���;�R��x�}�Zu������]���]J2��UQJ��mh��0���7g^:~��r�!�q8`��Elu(,w�!PV����a.t�d��s{7��XY�~����A�w*Kv��,q�ޙK�Y��vd����_�!�G��{�F��b3>�9"(6]w�	�P���5�2譲]�K���Z)6j}�+�=UNR_%5uo��{zĿ^��G�{�ut��d= �����5�3��܆�k$H(U�)w�4o:��y2��7���w@�P�-CF廪��r�
�B��ߵ�3���Ӎ�8��Q���x�ޣ{���e�y��̸�l����y1�'�HO��.9pI���=����x�;<O
�������%�@�ĺ���y,p��vH"���싒�rՂg.��pRix惔�{e�i��k �1#�c������z���ë������Me8��)g��T�@Cyd�讨���@��<3�/����d��ƉS�SG���'�!��� �G�f�x;o��݃��tG$Eye=�E���m��,:�vz�7q�T|��~��{m��3�w�~�n����Baz��cMR�������p�l:���n=���K�OW@p�^Ka.�	>�y�+�Ur[A�����d��x}���6o�	�i�Xz�FAE��AӞ���p7�xqȗ.O���\Q��)w�Ӽ|4"e��r}��K`���82��{�9z��!gk�$�J(ƹd���KR�)ANF�%��nݸW
%˜���
"�����h�zP���s�I�g�׺���A�0f��W^����6x�
��q��cyPR�%Gs7^��kM��X�L�"};����Eo9�J���@�-�{>�+Vgއ�ѽ6i=w��S��Bm��|Aԫ]�J‘ܦ��x��.|�.z�Z���<dl��AS�~Q��2����\���ѽ6�m3dy��]�T��Qy�;$�ڣ[��7��A5s��?�{m��<�8�{���$�D�*�V᝗*0�c�,I����p�W�WM�O�0���z�J~gn~�����ت�%�i�EX�����a�{]i�'/cTH8 ׽_.o��9ш� ëao9��Z����]��%h�w=���I){3�4z���E��8䆁��ү�m7U�����ȯ�8��Gn��x���J�@.[��`����—,��?}����cOvM{��!��e,�̮�N���q��/u\Y��9�"���A����nkjIhW���dH>��7�Q(Og�w��Px��x�zqK��=��jp	�M!l^O�XW��b1��z�T��o��J@r��6�¼����Ϋ]�U���,ŵ���a��YF@EU�@�g
RiC���R�w�z��j��f����7݅��/?���;y���_�@���#y���^ݤ�!P
C����5�T��>�r�5#C�-Gqe]�W�D峼g�\l��^L����[�=�x:8O
y���I��D��`kձ�j�'�kb���d���b�ޞ%��J����s�~�
#��������	���˨���T< !�LƝ8�o�Δu�p�%&�].�{�s�%��>����+X��t}���sj�Cޕ�Eo��
3l�G�����r2h�<�����$���8�G~u$�Z���M����g�X���UBL��ذk+�]�f���Lޡ�0�#:R�mk��F�<l��N�޲������X�釯�`};��$x��V/�a8-Q����#�%rŕ<-��c;����h9y~)�V�)�j~_�dhq�*J�A}�J�C�7��w`yF^�{"u�^
��C�7�t�X�i�kN�7���o�0Dίw/��OO�����Mڸ�a���ǐ��[������+�k�JH��F�5�@@����lpj�z@��$i����M�^��r��R��#��s�\q˂�l���U��O�������oPKEePQ��gf<�!pip/_vendor/chardet/big5prober.py�T]o�8|��X�/�q��
TV�Ԩ�`�(�d���&J�I%P�
�\jwz��;����6����
�$�So4�Е�f�I�-��ʍ�BQl2&�hl~K�����2�XJ�d�)EN�q����G~aevl���/p"�ޥb�oh���vgl�b��������U��U��]����Z�-u�|��;)E��hΎ�g�Jb����e���߈���E3�6V�Г74����C��Jɵ�
�喙��+�=PeJJ�&˙t{z�I�죱�&�yB��PNP������dI#vPJO�٢�Y�V2x$S֎I8څ�۞�!�A
�kw�%���/l"��=�v`lz�>�G7wx�)t�����+�H�v��B����5S�8/Uȥ����rA��~F�y4Y<? N���3�b��UY�}� ���w ��p4\<���b�OL��,�/��r�i��ϦI�C�0-f^2�dq��Ɍ����KF{������%&�~�]��z����r6�dN�6�Z����]�����Ч�6�w�$�/�$�d�2ƶ�g���ػO��݇��.�2A��C���\*�F#���N�N��:�;k֨�?ѸT^�*�1N����v�z�<F��Vj>��$	'����܅�>zrs��&aU��ι�<|�_%��x��5�T	�j����e��X��V+���Z����+�{Zg�6�	�S��9V���Bͭ	}}��J�r��W�x��R���o����Tᡛ+-
~_�e_ZM7᪛kJ�M)6W�q���M�PKEePQ�Y(==	�$'pip/_vendor/chardet/chardistribution.py�Yms�H��_���-��8�q^�
�����R���JHL"$V3���~�	����\j��Tlfz���~�e������4[tۼ���u��m_}�-��G��j�r$}ۣ��$��Kϳ�}2��ұu��I�kr S>Z.m�RK��_�LEH��t&�[B+Ǟ��|���4��}F�N(l-\,bV�2�tUcM��"U/.^"W�L5ϣ�*�%¯Nr�:���YP�W!���/t/�Q('tBء&�B�?>?L��Ah���0�T0�sl�5-�9�O�p���aM��!�OW<4�]�w�E8QK޴�t+vJ7�!Ns?x��[�_	�MyL�זj�F��F��X�5	�y�U�
#tV�.�ň%����ÛS^XĦ��re9�듺$};���q�9hEA3%�3����f�]�ߣZ�>�:�Z�����4f�IN���K8Uh�z���޹z����m����o4{�z�K�v�jt_��W��Z���v�^&�
�413��+9	`IWh[z*:�ܫ�Aϥ��U�͎�`���b/z�?2�Œ�A_����C	�}�e��H�K�
!��],o�!�^�%��fѻ�VΪ��I�y�J��bdۇ��'&�㣣aL�,f��#(~c�q���G��X�����m�;�N��8�nu�����h�'�|�o^�n��f��i^�{�v�����%����M;f���%�>�=�����\�P��x�)X�>����Hm�y�"W��x��H�Qş�J�}�����ǵ�:���V�"c;�^�C
�g��*��������v��u]�լ޻N���}{Mo�Z9;7�~�n=Ի��/.�c���T��]�ռ��e���yWɲ$j�e��~� g�өD�k{�	��㷙����ˁ1��S���P0I����B��eme�Z:�Պ�R+�ņ�ق���"�g�.E�2�I(5I�8�J#�Wۛ	���3��*ھg���=2g\�^J@��B�؞3C}a�t(]BDy:!>�z���t>��'Q�R���4���T��;�k��1#���Bc�K�XO���,���r�8z1E��Yn�V�iT�m��h�OT��q���.�܊6����33�j����'@ ��p��H�9���гG�P^
G���wi6S�dh\�9�73���V	��@�����4lO�6J�P���m͆"��
�
7�@A�l2��̈́�|p�ވ$.�(�܅�(�g�l_Y�x(�kL\2*��-O�i����rQ!��sj��'�.�+z���^���1�x��@D��@��:;,4"j���Y���ϥJ�-��#�FZ'׼�]vRM�;�6JKg���ƹV�@��njr�&��Ҋbax�~ٚ�~5�ʮ�u�����l�u��
/=�D����)���
�_���t�a�p�+]�z�'���x�*�����K��X�/F0j�v>a��/�ph!�e��&�E~)K�/Vl��jx�[���f4n@�_�̦N�PȂ�d��Y���],n�nE�e�ϲ&>yx�p���52A��8`Ϲ""��S�T�Nj���)�6��@[�f���<ʶM�A�[X� ����V������D�.'P|����:�#��e�d�I�s�����yO��Hy*���6+gQ&��+�7�J��#�Ӝi�E�����Q�|j�b�r��Q2r��	S�1�Q�ېe{�qM):�=��Jx�Iۙ�s�\�d�i9�ޖp��n��5�T�epU�h&ו7
�Ļ�k�}'������V�Ղ����
]2^,�W˟�]n����87�}{4`�]��w��3��>��Y��Γ�Q:Մ
e�4�(W���7�NN�s(R�J�~]͑���FF5�Gw2#˸̣�C��%�,j�ue`6e-O�k�S2]'d���:�M��H����-�Ok��'3Z[�l;�K��F�|�I��h��S�	��z����>R*�{���<�ԗ���������؇�z�c�.^g��� ���V0;�|*�� ����R�4��$1��/d)_4��B��Ԫ�}�!�q@4\�ыې��-����`�t�(x����W����
�y.?*�%Cb3"j����fbc뵯���������<�
���+{_�}��c�o�a�����]���������D����Fy/���h{4Y�@,�
)�b�6��Ƶ)1�oS�.�iI��˗9��D(�i�W�h�里^A >��z(]G�&d�sg o�"vg�ч�X��Iާ����T>�_��M�wV�?�&���(��nO���wo���)�PKEePQ�Y$�r�)pip/_vendor/chardet/charsetgroupprober.py�Umk�F��_1�s8G����u;g���/���F�r�]��JP�����T�~)�ȳ3�>�̋���x�?
�0���yF��P�{ո��a���K&��Bn�Y�ͅ`�{��%�U�QZ��k�C�-��G|E�v�AE`+0���l��\IC?�N���T��hdCX%)�UL;�]BWm,4{�й��� *�=�
3�k`��+�Y&=%�櫘�l�������w�r��|7@-X��n���'�_i��Z���Ⱦ�;HT��1�&�'!,0��4�oUȣębR:��E�5��O�%��SxB�����+�
��A`v�f6�RGd���"�T�;@N���WԆ,�����-�Z7�u���;xM�T
]Dz�����e
�!��)�7j+X!��X��|��p�u�\@w�ߺ�Yw�x�#_R�N�~��C��4�6!��ܟ��RD�a8.^��p1���0�̠��l1�-G�L���d�戅�N�*��G�U�d��qa��_����6���r�(`4"��
%�i�R
z<�l�4�ޡ�;�.���mQ�^~����`N��@(�[�u��]�m�t�7�����,u�Ǐ�\*W�F��<�1�2U͍�T��빥&�σ
��NH�ܯG�9�ijl4�`��'��]v�<r�����E�&��EԢ��k?�Z�~�$��1��9�n����H���%�{>,5�OY�=���$
���I�
���1���Kq�ic���ee�|.`����k��qy�{�!3���=���ړ��~�{�c<s:��:�;�H���˻̗l��f�U|�c�&�@Ɉ�(<I�4�h����[
�w�L]®Cc���'[$RB��s�J,��9H�&v��Rʖ˓�<�ɻ���ƭ<j�<6�aϾRS�~^9��ъ����.�q��({�+]�^v䁢��x���b�L�w,���ep(���Zm緖�EE*�VF�p~��Փ�9��9�
�K�Sh{��{��5�C�K}�p��w�;���/�����N��k�	q��?�40��؂��z�᪤���㢬�Ae!}0�|��b�Ҹ��Q��K�p��aAݿ�.Y�ek��̞O�PKEePQ�aZ��$pip/_vendor/chardet/charsetprober.py�Wks�J��_�0l@�ukw�c�����p���W�f-Fڑd[������TBURf����O7���?�q�y<��x0�·�qr=��NȞ���b-�Z˕T^D�8$S����Q�ѭ��B���מNEF�Ȅ�Ś|�:g[
c%3	�O�QDq"4�!eGTC~*�����&W�2�_uk���&�����D@��h|i�Ӭ+)`j�QcФ7�N*��;ԏ"��lJ3�
�(� V����5�f'DW�~����P��aFYL7E����������]�� @ɥ�t��ZJ�0{��o��s�=EZ2���TF�
�k��ā>�U�x9�L�M����&"E(�Y(�a�&_F����Jy)%|��+(G�ȼt�F1��ߒ��gۜ~�����Vjl!Vjx��t'��	���.�}����4 ���5��?��>��h)(OE�G-h�,}/.�oԟ~�/�٬?]|}Y��H��$7I$�QiOe����lp�����x����|N����?[�����nng7���
����<��*71�D�x2Jm�_��F��G�4�]��
I�_�a���O*@ߒI�Y���D�<_dZ�����Ӣ߻��C���|$C�Eq�[�1N3���m�M��iw�t�n�89�����O���2��+4�j�ޞ��������/!5�P^ggg~� 
��\d|'t#^���=#n����bp�p��!�L>�{�8���^"$ו��m�"
[�\�rC�~�Oc%���8n�ơ�/��jOq_�v �P����Y�lb�����p�f�=eƷ���Qq>
�b<�lU�+��xY�SXҸ�t�W�,�ʆ�{
��,�t�OY1��P_�\?V���O��8�� ���F���S������"n�����4�2-�4_6��oߟ;���翍/�]�@���'�K����1/r�b��z�j��f�P*f�լH��tv?��xQ���"�P+f��IJ߼������v�{.��{>N����9�Ѩz�����L�1�PV$"�η�X+�'�7<��J��4Di�([rHq��d�̂�&m���
(+�2T�^��a�|��_<���l2�j1Ccg$�銄�f�r>��]��\�q�¿��\���ҏ*
��;�<�NP��"��G���5�u�8���g���H}-��i-�51�8=���2��!��7U��h4+����b%�I<'`3��;ę3BQQ�Ҍ)/k��i;�$��l��ʏr�{�����gȮhBUp�Ӥh� �Q�U��Zվ�_��?/Z;�G>��+1���RY뽽�[����|뵻w56�����V�[�7�B�������d��]�@ݶ���Xn��!:�Gj�xy�C�BqV
S����P�,�4��:�����!�{+T#VM��l�&0�/���j�t��8h��F�B�n�nO��(��#SCc��1_)x�T^�^�n������	�U��V�'(�S㖼�F"��ό������C��޶���צ�,��l��o�fz���F)眡�����Q��Gi�s`x0IN���
~�`\GE��"�=7��\�Np^9,�ǩoK���p�C�v�����x\�m�_	0l�ʀ��q����O�pյ[�/Q뮞��y+\�<��j/����}~a��	�m�D#ʔP�w�_s�%���"�
�e
X��-c���۞(޵H~c�=c�5u��
����|�����f&��I0���^.�&������=��Hמ@�?����H�B�����njZb[*m[*\=|��z�;�s2���m�*�z��9A'?���3��BWZ3��`�fkƆ�R�U��I}E�B�L��~���๑�P��;*~Ȭ\W착���	�y�k�W2t���hM�$�A$���ݿ�Tv۶��{�8<��z�ˁt�_��]�=	����PKEePQ\�7H�)pip/_vendor/chardet/codingstatemachine.py�W�o�6����|���Z�b�� ���i�%N`;(�"0h�ds�D���z�)ɿ�uF��ǻǻww�����]v?��tӻ�]������^�=j�h�tg�T�BѕN���L�#��6S�a��k/�N��/X�9�)��ﳳ��3LYV�2N��⫙k���)�a�8��2 �_%�ǚ/q��Q���?����u�����4`�f�IYɕΝ���iӴ'g��
���;B�������鼪�(91�,=K�a&�S����i��EN�iKx�H�ɯ� >ӉL��T�	��Y;6��9����Ȕ>s���%c�Șs�$,ͽ���L]�D�U"t��='�8�w/�XX�}Ԯo�[�
5��sx�����
SGF)XW������D��#�0��B��_��}�{Q��H_;�A�?z<�/��)�W"�l�$�Q��["q�vW_ѹ���F�>��ި��n@��F����΀��w�nD4d�)�d"yEq
�L�Ʉ��ʖ�?��	��fb�hs�E+2_��*�OC�YzN2�\�=����u(�0�qԢ��p�w�~-S@_+�M�.�u���������6����>���I9j4�)�.JO��F#5:����]�݊x&s:U�ш��^	�[u�ԓ�8v�I�$�y�&��!�}(+�<3K�L;����e��$%.�0k�$o&�1@�(�.z��U�ӶVs�2�&���~41�"vpX�i��EL��)|
Q��d�Q���x&�)�#g7�&��b,+�47������$���h�u@��z��Ʋ~+�.{�$�9v�m�:h��$��)9k��UB���?nU���<1�x����L��4eR-��Ixf ���$4��5�A�&M�	�N�ҫx����iUy�dؖ%�=������^)``}�1�z}Z���y�c+�9������C��;פ��i�Ę����gC�_�O�R���.\�qT�&�)I�D�ex�|ݸH�Y��>��Z���V;P�� �[
� �5Nq�Z�~��[k(^�纚C��c�g����5�z�,��U�ppڇ[�"h�`QX�#�4�.�w�{�”pJ��O��iY�-�Y%^e�*��x�Y��v�˜��j�N���й����p^��М�s��`��h��&ؚ�q.2�O�# �'�Uq����U�u���GA1�9�p�cEQ��u���g�i�/��oĆ#^�r�Ril)�-�/��!(��������ks�َo�8v^�����O�ܳ_�϶��Z�r[�Ӫ���<m��g�WD�	ɖ��M*}���V��{�r��T�u:~�_��y����kӲ���������ey{A핃aW�|���`�T���P�cԝ؁	2Q^0�D�U��L�o`.��17�(n�BV�!P��O!վ@�PKEePQ|��eInpip/_vendor/chardet/compat.py�SMo�@��+�ąH.�D���`�I�@�(���q�겋vפ���"%�ڽ���޾���v?>G���x͓��b���v;]L��Vf�7�箾��c%t^	[<1{&������J:(�Ya�oi��L�_��S#g��B�#?Az]|5��[SȲi]�.��WOv�`ʃq?_cF�q�4Y���3%s�dN��î���
d�7m�$'!��^=I��w��:��?<�vb`,z·�-̮^��J��3��a.���@[��U1!�"�BF���
��s���u�p��S�Z��t3�\_�Ҟ�Lr�S���*+�oX8<F��#�q<��M�~��(I0]�b��x���+,׫�"��@Btnq�̏����)��;Y�R�c��c��@%��c�I�Y�@nv��P��P/C.
A���x��ߎ7��,���u��m�IB�V<���SY2�Tc���m�c���p8�2��už����?.T���I���a�l��w�,ui����5^,,7׸Ejk:�7lN�rG;���]��ǟ��E榠�C����~d��@�����u�~��-u�xr�zO���_PKEePQ�B�1h?"pip/_vendor/chardet/cp949prober.py�TMo�8��W�8ڸ�6
��ةA�Q�d�e�H����~%�NZ��I���8�f8��Cç�&�h8K��0�G�t!����r�in�V(&)�'a��?��,�fK)lA�:V�	D>�W.���9�3��qgS��0E�Dʜ����쵩@Lm{j8s<�MU3�~3�k_᪝�^tM����Aq6<�PJ�}���[n^y�Ti�ؔN����є��rkDA7�9M���j�4Rl3�W)7��չ{Cb�T�R���L؆B8b*�C�����Re(�g�)�Açي&�"Sz�T�(7R�ODʕ��,���NJ�|"I��4�ku���ݯ�XX�S08��2�I�1��G7�x��+��9 ���*�H��v��B��1�
���}0 ������%����q8[��#JË�5L��KbTe�r�tG߀Ɠ���g?/g�$��<��a�G�I�b/��0 J8?H��<'�Q�����wLH۔���Z$(3ڱW�6�\`�����C�ն�����$rR����������>�>
��y� �~H� |$rP��֦O�::
���4�����X.����v:��鎙�@�aC�+����#Ğ�,vD�ûP[�0nKwB�2�=��LO)6�2����
�n㧥t�r<�7�nQ{Ok�#��u2]O��I��I%��17��y6�l�FN��Y�{�˼��cK���;�>��p}���U`�쾞���1�+v�~i��ϑ5WC?���9���}hM;����9@��97\��c��)��w�'�z�ÿj�����4ٺ�(h�Եb�UT�]i]��^]b�LmK���~ƻf��/PKEePQD��}pip/_vendor/chardet/enums.py��Mo�0�����*��VH+5@�.!A$��S0�����v���w�@(�����~�?�Ṹ�p\!@��l<Yn5��x�Pj�hU�r�Q��G�
/24���3_c�q��4Uta�%���\f\����z�s�J�ʹ�K'\k`rW��p��j�Ss�u���L�or
HXP�@��hˑ��]Yk�P�� �R���D�e���t>�7�3���J^�o��U��!�=�)���r]R��\,�Z������vbF����1��!���<����K"6��lȼA����n<s,fa�v�n?�S�گ�[��Ù����*A$�DZ��u�\�������p�>��ͬӣ��	��@Ѥ}Z�e.�_�);�v���~̂Q��p7��q29o�	O7��/"�`[��4��Y|���,�5�,��&��W�2E?F�o���S4���v��VJ�J����%W�%�8�Fn�~x
�<�����fY7�4���Ʊʽ
f�4s2+d��5�������VE��2���[�)�� ��Z��x�ɜrmC���:�W_�n����I����.��ۛ�U
M�-� �$��
Vk4S�ˋ� =U�
��V�2W�ͦ*�@mǻ�~ij��J��yF�T�!��Q�{Cz��`����xI���؊�䈞&�з�M����>��]]�㭕�v�PKEePQ�=5n pip/_vendor/chardet/escprober.py�Vmo�F�ί%R�B�Jͥ�J���o��NiUY�=�U�.�]�r���~�8��ܵ���<;��3�//��s�yS{Cw�p7�
?����%,�3�W\��2F�6�3OS�H���lN�t�7�<��	S�E2ӀA�S4:b[$�f�<b�K���J�� `�K��#��`�}�xzSk�������!�Fwi
����F��q^�P
��rg�j��[�L���<])��7@0�{������I�R1��,%
�L�3%v{���	Ps�������72��ޚv"�rl��F���>�5e
�P��j�e�#
��F`�֦�S#�HP$#I��7�����O�4Y��闷�]�
�����[ء���R7T�4RPU울�/H�>��`��Ә��.!�/|��gL������
��tJ�ˑ�f�r��fO�����)bp獽ţ�~�-�n�h����
���|�@�XRl�l"�@qB�IL�hOu^�#�WS�ik����9)
��v�M=L�Xe�RHE�
��4]xV��C�;�.�T���#�?�ɉ��RjA@�#��(�Ru�Njc]'��]���7��z}���,�p���\"��V���h͔F�UrI�S��
���g�ґA��!}mX����I`O&�I�bGsRx��X��
G<%�v���aTh��*�u�7et���a0	'�{wL�����pzj�0�l-hx
������j���i
��j��k�h�X�����3����MҺ��t��
^��T^&QR'F���y��4�H�����
U��̖)����T��Q��KYMgG{����(�]Z$D��"�~�%��ö�4����0�t;����w���/	�
�8�c���
��-���[����MRv|?��3|���p������s���\��!�Q��S�+��>�S!��������5���[�8���]<K/:�H�OH(aD�P����>a>��2��WZT��m��#E�`ڝJ��!S�k�^b��v�+5�*�sW�5���3���������C'26���:��2�3mHQ��v�߮d~���#:��y
����+4;%�\���u`�w%�%C�'vkF'(���S�]qYϹ�>�1�xƫ׫�O�b�.��zd������ʳ:�7ɯ��&A��R3R9��U� � /f�B�����ӔM=�"฾?�ϥr2#F�7:7��[�7z�=��-�9�q`��ƙ���=y��,�ē��”���쾐�h�0�����@�}><U^a�j�>�u��ʨ �:��=?�PKEePQ�
`�)pip/_vendor/chardet/escsm.py�mS�H���)��jp�׺Ȣ��T	֖���DRj���_7$�����]	Z�t�{fz�W���y�Յv���M8o�א�{�:��XBO��+hx#	��/�qD�S�`b[6��\;���|��7�
<&�we�b*�i2���)�s}�WM=��C�S�vSI�狈�]	E��s�j�I��ZC��Y�;���.}��h9�����O������#���ν�'�a��y0��p���*��%KI	�g?q`g0�f`
��2<&"���'�ȶ��4sG8u �ďrxٽ���q�p)]�p6��бM�mS���Ô��*S4#\x~��3�6ک��|l-��z#��Sp"?�攄�8�98�*Rf��f:�]�c�������f��fN#�/|k
�z7�wo�[]�����b�ъ뷌dO����qVJ���:M�q���y�����/Z�n�0ࢧC�u}�jܴ�:�o�~�hf)�S2�$�J��!'fr$a;�r그�>��X<H\fSڸ�@���wZC�s��E�*�g`[�zA~*���(��M�7�i(��I�?\����/�Si8���\;u��|>��ry�[�^��~��9J�,�M +��e\5::a�mWn�T��]�m��p�ʧs�7+�'.WI�8[�lk˓.��q��N#����N�u�x]�t^W$]��IW�u%ҕx]�t%^W&]�וIW�u�U"]Ki-���b���d���Z�m����j��F����N�N�!醼nH�!�3Ig�:�t&��n��F��:I:��$�$��Hg�:�t��:]�Fc�8��4k��Lǚ����Q��B�9�횖!�&�2x	l�����4�j��(��ыbl7��,.V��g�.�Jj�QJ\�r���H꣚��4�#��?���>�\F��}p	}�ܥ�*BF��
��~�nv�?�M:Cx;�~��չ��4����߿�БǟaY��Y�^��%L�Rt+oz�4��8ƀ	3�Αn��ب75���秫���V�k�6�����=97(K�<�'�j=-�i��
���
_8P�/�*�#[X�t��^�Y[X�9[T�Y[X�9[T�Y[X�9[T�Y[X�9[T�Y[X�9[T�Y[X�9[T�Y[X�9[T�Y۪¯er��.�h��)���"��c{Y�W��K����!�ޫ��'���l��8Q�\�p@�4�{�P��w��:��ݓ�#�
.J��Z�c���o��؏�.i��"�Ca���Fw�#����I/�P�Ez��
L�}I�r^�%�Z��Az�l�������?Lzo{��o|��ʜwF|�B�:k>Aw��V~Q&��^���_�C��{���u�\� v'�@�1 ��Y ]�ض@���F����3�n�y{"��ߎH���x����?|,��V�1_��c)f�x�����I�P��~|�x�b@t���ˆ�ڸ�������D\;Eϒ���mK��,>	�s�3lLs{�ַ�kOI���PKEePQ 7��*�"pip/_vendor/chardet/eucjpprober.py�Vo�H��O1jTt��N�&�����_�FUTE�bث�E�����[�l���jE
�}�f���/.N?t۽�
��kw�^�n���:���\���4�b)$���朄���&��5�^R��Fe�Ia���#��Ԃ�	�ܚ�m8���X��Y�����(�����J�����9Ͷ	�+��fW+K�v��o�	������&kh�
��|�f�V�j1���US��
р��4�R�5]"�d��v�d�?���L3�u*-4�d��~A`7�U1�L��saRza���J�~��b�uK��#��zmv������=�\#�q<�D��4����[3��Rw./���uo��;��\���Fs�-c���Te�ŏjn�a
Ao)B5�βqR�}�s2�]A{�!��6����E�,}���O��#}lM&���x,��.�2��& FV�I�E� t'�X�n{���袿�î���hB-�&~�=�&4�N�#�� �8�I��<%r.��k%��2�4�G�� �hN+��Q�t1���j)�L��^������t�Qu���oM6��G &?G(��;��]���ӭ2�A-�^�n6�.�o��DS+��;?8D.*��Vkjp��Q5wt�Z̈́\zM�,\	ɓ����+�
� �Vf7�#+n�����q;Nv3�"pDzNwf�d'��|�L@�w�;�Aw�~?�l�0���+��gJ���vS��% �0f]� �:�~�R	#fL���R=�!��ZnAA 0˂�jx����cbL��U�D#7�����
ݻU���l5�K����n����lK*��4��b�F��R�̿J���h@��m�2k�@�5/{���Z���|?~q�"br��Y�l�$�x�Ot��<��1�- �J��Xt�F\Vs��=�R�|��Yܠf��I��V*�$��}�с�a��Nr�B��!���^���V`�h+��+�Fw2M�y��r���,^V_�4��lj�p�p�!.�$ŗ�U���IS8(t=��N�v:�\�����`�=����sa�G�%E�@uF����F�a'�Ŀ��=v��
�w�_B�0֚K��5�xp+���c�}v��)ǧ���t�t���x�'逯��Y�tr�4��N����||6��Fͧi���EA�")�_J|�|�C�,	:��B�w�~�����S=-�RـK/W>�X�}���y��I3+�s.C�_i$��hⷧ~�?L�x�w�sw���h�2�'��JQ�n�]~�?��K���Y�O7�Y�,�5�Z=��^�U�PKEePQ�Aya�4 pip/_vendor/chardet/euckrfreq.py��k�G�����H�/Fj�ʨ�K��+Ok0�
h�8��i���{�_��<�Jf�]$��TeFF��K�[�W�?���Iy|������O������Nn��w��q����<8�ݕ�u�����ˋ���ç�����ñ����nʛs���Գ���>g���uwy��;�ûr�
�9��������"�?\]������I�<;��o�����������Z?�R�o�wn���$�9�n�wyY�{]�w׻㯻��N�n��ןr��]��|S�O��g��_���NIo�͡<�|�p�e�)������3R{w������o�����SysqU�����|
�\\�����?���}�է������?\��O^�ǻ�����s7�>��ܿ�ɏ�ovW׻rq]>���z#Ͽ0R����������M����j_(���w7��������r��8~�y��"�c�o�J��S��G̍��fU^�ʧ�ݻO��I!ǖ�����ӗ/ʽ'?���;?�������ؔt~M�m��>�	�-�������d<	���_sƽ�g��^����^<y��yy���+�8{����������-�n�U��[B�]���CJ����by�m��T�u2x�����u�j~�ۧE��t����_:�<\��~s����ߕ���i��O�I�v���=M�s��L5]\��2U�<�?ڿKҏ.��i���a�O�r��w�8�R^>�7��_y��#��:I��/PV�����\�F�1����_7����y�6���S��e�/�S
9�#���'��f�������g��XK�s���pw�;�����{���uf����[c���?^��.���.�_m�8G��_7J�X�R��w������n@�<��
�y�U����4�ɿoK/���w>L���ܓ��/��Ջ���=����g�_�������W��Ii�;�>���_=?����>W�����Is�ϧG���宜~��N�3��zt���_==���yN�:��C>b8�c�OK[�i]j�G�+c��e�i����e�7��莋�R���$),�����8��֚�b���9'���_IzV>L<fXaf���H6��ז�FF�SgȌɈ�ۚ�K8cd%	�ӓ�[.�{�1-G���Ø�%7M�+�M	��kY��QO���/k~N�0���G�PYsi�o�!��殰0+��IJ�E[��<��3+�Q	�<�R5I!�`����ƐiH.,��e
Vā>&�XdJ���qP��0��s�]s�Ienf��_P�òvD�˵�B[X&���**�������Y
���"{]��J�:�]���}-d����ΖWLW=���D4,�G��SZT�A����k��X��b�u#����
K`�i�I��HC�9zRh��<B��������H0��Z�y}`4��,p���?�EgF������u�t\od��d.G��^���`n͝�!%UW|yDR��#�0�#6��}�y,<V���C��h��r�"����_k�m
�伕w�{ԅH����i I�B�4఺<^���w����@�К�S ����ļ�hyx��J���YG2B��He�0;.��Uʊ�;ҝ6�(Ӵ �UuR��\wY�G�H-W�G�R�>̡�M���݈u����63+aw0
L�$A`,8Ċglne�TJil3�&X���p�����Z�(����[�QG�9�"��ڲ�1.�s�r�|'��X��=b6D�t86���ki��:�&��,V��&M	+[^�u�uO�	�b�:@b�fgDZ �y���!������c��V0s��A
��&L��<\�C�^W�oM�'�TO�8��F��
  6�����@ڢR��l���R~����h�C��@"%&Ue�����
b�P�leE�V�"���`�S����c��p(H�h��
"\DK8#����
~d���o*�0(������V�����Z,���*.�se���Pա;�BN���eёjm� 	�kn�Yn�N-WW�q�T��Y�JUݲ��reԗ�!���\n�W��q����3B2��A���"�@7֦	�)$�!~��t�3o꨾C���l�#ƣ�a0qa�C�i����28�p�N�W>c�`w��C�p�h��8�$5H����>n1o�𙊻{���g6و�]Q�6~TA��_n�j�mY7Fd-:Z��/��>����󝄳�+�|L5�r�ݯR`2ћX��joHe�=V}�& �����*:Pn~kj��f^��`Č?t ��v;��'
U����\d2sp�NJ:ag�-G�u��a0��3�,n�@�n�ص'l���̹�"!i"lǗ��O��I�"4g3wd�N:�g%���IU��Ӻj%>���/-�	�X_X�N�Ae@:��A!p�	��LkQ���F�M�����u�۪m
�3�0#+(U���S�
�Y�`�ٲH�e�N�"��a%�+��,�y��*��F�nO?eg�	x4�teh���;`Z7h�_Pؒ�\���������0��o��Utb�ևر��q�w2��ӦИ�[*���u+��}�PE"38��77���&
`0����"\Bs�`>�H�(˻U��V
1>#Gl@IXM��jt6F29
�:`@u5�(���H�Uu�	=
�.�I�Q/��?��$K&���9:?�Rl��p�B2��̧amT�i� ����Ϙ�+<TmZ��K�2���&�G�Q��m*�q	�Q
����fDLVel��U�,,��d�Aښ[v�D�}̓a[���dp��
p�f�C���H�#
02K�b^�M�����.h��(Ve�}n�Pml�/�U5���m#���:�b�p� ��؞�T� eQ]Xm�b�B+.Z�X[�'�,�=���a���^��j�@��jWm�����o���O�'�Pp\X��m��#+�D�Q�z@�8ע��e�l�>�a4�l�A
6#��a��ŋ�2|UW�}PoT��5�f�a#H cg`��l`"$�	"�,�
L�ˑkw�5��)�U>o���E�"�=b��-Ov�6�/�'	la�)��@V5����ԣ�<ɝ��,�t�B$(ʺ)e���dZ�� ��=f��2"Al�R4o�-���eL��!�n�' ��k��3+���a�+3��FLi�gT�e��"9����"��(j��"+XQ�8ͬ|
�}x
j�!�2S׃/�/?�@ݿ.i���'F՗q�|@�2:�+�9��*�"a����=�E,�4Ffd��I$�N	��b�u�&!��xh!�"��B<�*�0�
���= m�Y�'N��)�
�
�i��Q�c.�X�p�a�����b��r>�f�iӶe����=h��J> ���n\,��#A�����BB�f���4�lK �c���Ŧ��Ŋ)ج=Q�O.��F�4d9��A�\�L�3'#9�.<��F��Xy�p����q�:ϣ��H�/�
�
��noc�w����,,��� !��@Tц4v�ޱGYZ��@aQ�����nɾ�%!m��G
(
�������j�>�,R�Q�\�p�V��ڥ"���2U9��r�*q��M��nA���_Ƣ��Ο�`��[KS��`��H�Y�Q-�#d����>�@��eS�ŕ-�xU]#F�,s�� ##�;�'��fh�r�� b���6�;��VX�QDhrq��Mm�gdhM������FMP�׶}�4�DA�고�
��0C#ڇ���t�G2��\|2p�$82��Ha8�Td�g'�ۈ1�`��A=�B�>h���-��L��j���@�<B �hfe0�|
]�tGQ�i�I5=S�F�삼[�5L�5-��n�Fmd=NQ��d�ZdK�z�M���Q�c$*���D��B���C!%&���&L@,(	�eL�O֍6�xh?��b���B�,����AE	���+�}���e3�Y��7-6pݼf
莶l�A�j&P�E�Q��/[E�aT�?�h`��)����hRf���l�7-����$��*�� `QP���T��k�v#Ú����05}�4��C�ܬ~FQ���d=�|��1(B�����|)��2��i�m�hB�<�P�`9E�h�
`��€���ITH����M���� �(�U��W귚 �'O�la��j�}G;��D��O�e�S�Vxe�A_�iɀ��X%���ž�Ex�7�d�֒OD��3Z���<���(���GՏ�1ţ�	�r
������#TK��q��/p�7�.��x��dc��>�}�;��x�ρ]PŸ�N��\=9`���5�@�Șc(;��Q��9.���5h:�'>�e%�hdc�n�g+(X{���q;�&V"��x�;M�ȱ�
"����$�'��?m1����&	�v�g�^����k�#�>ʡ�Q�D�nJZ�χiǮ\���CO"i��G2'�1��L���T�5妄#�L��m�8Q뙽�fc����Qِ�yjf&Jg:͋�e��$���"���Vf�X_�D0�*�3F�fd��v �z���>����ڶ<_��D��W�pZ�/�[!�p����,���L�dg �{����TDs�9�%�Ku�'�GO�G��<Ei"O�7�!V)��v.�Ȱ+lgIV}����o�5a	1*����������6H�hY�>8Q��’��D�BDp��>9�KѨ����O2q-!8���r�NH3g�*�[�y`'f�U�ۘ���fZ�ET��B\��Q�cTm΃H�qp�܉,�<O\IL3�@�{W���Wa��Y� PwQO�h-<V���Vs�csP����|�ɻ����\�Wg@�C��((��#���Tga���E�?����v���A��=�b��Y��dq�=IoBh��/�1Ü$�O���[��ݬPw��;1�CiZdy���0J���{d4�ֶdۗ *���k�wBS""�-[o����잕'IK���L�(k�]h���`#�]��-�܆�4�-�͈/'��a�`���?";�8�(f!�X���FP��I9�$%6n�piN�h��<��E-{��Kcp�_\,���=�'0�ɻf��2�y�S��>�"A��ۘ/��4�B .]��^I�����T
n����%� �UZ�Վ�,6�l&YR4&h��"�`O
��,�f5'��v���P zy-ȋ&3(k
	���[H������$#��D.�LNƒ)��4�Kߚ��*��̖�d�v�”�B3��X��s��o���A^����t9��{e�S�0�Xx���d���ڋ�;km��c�|ٖ�`'J	P�_�X�89����6&�E�,ly�i�6�2�<N�br��Tq��Vѳ�Qcg�g\����sKk!=�k�����M���D�O�T��IY�����j��J�\����C1Y��,S�����K�f#��)�d)H>2ow��|�a�h�"�*=��m�
�V�e��`���L����x�M(�J�=����Q�D�U��q�
�JK;�2܄ʇ�9�$�J��G��3a��<��S��F9��IuᏴ��[u1m�k�A��Ix;��UU�t��Uƍ :z|�-.C-��$��H�a�Nb؝��z��?lk�?
"B425���@?jxr��[���O�މd��FϦ'��^��X,m`�I��Ф.�����ɤ~�8TM�XƩ�9S2�����g�K�@�G/��F��-=��L��8(�¤�[\����ɲ�+���Rv�1�4P��ʰ��=�޲!��`��d+��𠓻yAM�22c�˻��Z1���	�A^p�Z<�T��ô�{�U�t[���H^���$hѐ�A�]��@�,aT����%��;y\��J�2\�zs�b�M7d2Qu9m����#��E����2f	�R�Y'�a�橀�MQ�zg��r���$'��}yI�K��l؛m�fO;��3�sL�$͞�y����}�On���PKEePQ&��8�"pip/_vendor/chardet/euckrprober.py�T�n�8}�W�p�ql7(��b�F|�d�ȓ@K#�(E$�@�����6��'i.�g��ݾ|�?xMi<��d@��,z�+��V����k�����L�Qi~H�D`�2؂�1t����|�WVf˖LA���]&�SYVZf�K�~�����in�ޞY�sZ�;�߯���ָj��R���q1<�P)��XG1;����+���V�*ol���D��4�jmeIw����y�7F�4J���u�Ra�ə¿��զ�Lh��K������0���eQ7�J�(�a�ٖ���tIcv`JO�٢�y�R2C�Xf��p�mlnsVj�IDhh�S��X�����B����b�����
ts�$ނtM
ݰ����Js�z���� 
}�ъ�r\T��ҷ���l��p�B��8����Bixѿ=�,�JUY�}
����+2�h<Z�4쇣�t�$4���<��h9c�/�,D	�Q�F�K"�$.Y(��R�}�/h�A��F�2ڜ��D��������^��} Y�6�KoVbv0}�u(�v1�YХ�z��B�e�2�v�o�oB'!r�?�z�w�?�{D��k����DڭVaMIA��6�:�[kV��kѤR^�k��	���{�v�z�<F��Fj>�E;O�x&{�10��kf��0XF���;G�uT;��=��_��d�Nf��q��ʔpno�3�\&�u�m��((M%�N�v��`o���~:��N	��X8*�`��Bݝ_�~�}/E*��@�/��x��j�0��w ��S����Z���P˾��np��s|s
B	���j�3��7��PKEePQ��I�3:�{ pip/_vendor/chardet/euctwfreq.py��ݎ&ŵ���*RB���g�eD��-5�[�4�<'��.L�M��1b�~��D$���EW}����]����ۇ���gۧO?���/?�>���c�/�}���ww������ë�����}��������|s��Ż�����7ﶗq�7׭O�ܿ��;�p����?�=n�n�Řq�gw�޾|���5�Û������o_<<ο�|�{�����ώ�Ϗz��X?�������~���1Ŀ��������3�}�=�{{����W�M>zx����5��׿��l۟^<�m��_����b��w�?�����z�X���<�x��U����n{���bb��~~�q{���x���>���ͫ�<<��?����g���W�:����o�5��g_m�޽��n�{s�o�ŏ߼�7z����ۻ����������'L��5�퓇���vw����=���l��t=m�x��^���;���7�:&��:v�����x�W���.�>�Ƌ�b�}s������_��q�����oO>���'Ϟ=��_~��Jǧ�s���|��[=�x���x𧏟}��qǓ�~��_��'O���_n�|�l{�}����}��g�_=���/?�`۾������W���C~�+���݋��o�%��mL����m~yw�����=|��毾o����v��������}�NH�?�n��
�����R\����^�|�r�m��뇇���Ç���OO��=����ʞ��/�/���ǟ��Ѩ�w��G��F��wo^�X����Դ ���LJ�o�ڶ���$��=q�Ӌ7�=P(ɋǘ�q��w������|����}履~���Տ���#����7�ƳS������Ԝ����h���|������4�2*7�u�?�����?}u�b��%�L����7�J��z�}�@��,f�����c6��U�{z?�������M
���0�����^|�z�ߐ5��z{x���Z���/�۾k�e	;���nnܗ���勧=���?<��~����}��I�o�Cc?���#2�?j�����ɇ�~���O���̿��=�����?���g�ϯ?�������	��n�����6&�nS-�6����O�12�:n{I{|�{\���r��8v�6�=.N|���oJ/-~+���Ŗǯ=��z^�_)n=�a9�z���-����-u���Z�m�$&W�e%��O�����n%&��3�ӻM��`�5���mͧ�§���K���3?⮒�m:w�x��c���'ƌk\��ع�ޖ+Xv��se=�5���Dx��7��F�ծ�G��gǻ�j��2s�[G����x񷔝�3ks�7�&�6�-Fj;��o��xb�֓H1�XW��,�8��+2�#>=\���1�36%~t�=v�de��x�.�`��o�tV+Q�Jϒ�Q�M,q������;�����3��1�R�j�[e�x�Z.6>6�d�����z�}?c�l�u�{�gH���$Z��� ��P�z�7�Ë�2��lg����$B�b���B�xŌ��{�fų;�H�@�uϥ��2�)mI��M,/[�{��J,�v(�����3�k�v�^lHaW��ۘzb�s�����M
�GH�
��ƭ�����c$�<�������[�ˆ���-��i܄,�Q;��y>j��wfr0�)O�f>yb�X"�);���g���n�sj�z���{�R�Wl�w!̱�j�V����q`Sb�c�k��Ļ3pf�s�q�J�;*��e��[{����Nqq.-Vx�κ���<��x�0l���@7R��У�ﱃ�01Ye�D9QĐunc�b��8�x����l*k��!�}�*�)L��`5�a�J��8B�kٗǥqC������g�cb#4�l��^����vP����qm�)ڪ�F���;��#B�ĭ��@��]źH���5p��;b��1Ye�ƭ�lع��x�`)|6�;�g���#�O�k�z�u�j.���ƘD�S�z�*�9*��	y`�B�SI	9���s����711E�@�j�bl�@*^�k5����.�fsk,Z^)q�������LB�QEf�U^�Wd���x6��.��� �"�/�.aXYc��c	c���.�h�xsW�Ѽ�]�Ӝ�~��q��P�p�X(
	R��:K3Q��eݙξ���0�!�,�νb�bf},�����~��nŢ�
G��0�^��d�x�Xq�;�yo*lhs���F�k`�#�쌎��<b����n�'�<��E��x�)��!|V�n]G�c�8xLB�!B�	�R�yD(H�nǿ2���v��a��s`lUL[M8
�>��S�XuN1\94��x�ȹ����_R�"`	��P��D��d�c�2�CO�3+�n�O�U�-9��	!U-�`�5�*#F(�����L�٥�Y��pL?Hk�X� �[�o��e�ik
�~D����y= %\%��J�T:�D���RD;=6��E�T����P/*�I��R��'!NYG���=D-a0B#b=�1�Av�݊��7l؏�
�AŴ�n8�4/�)TZ������+
�_x����Dž1|�!3�ɖkTuW�c9�T�X�hh3���ȅ�i8N���x���G�~1� ����6��b�"`!��N�=!Iͤ$�,&?b���ă<;^%6�a��\�$Dr
KV�OfR�k4?��i<���-c��t���Xr��������|
��0�|~��QNf=�K��xw�>�xڔA���k�X*���q@>)t
D#����,�	�we���dq
׀��Z�X"�`S	)z�؆���n�DE*áX��2�b��0Q�;�k�A�М'��<�P0��p�)��Qn�+��g)�$Gp�3��2��d�N,,fl����$\?㉱GH
I%j��x�� ш:)A����k���Dg�d�c�	c+��+��1��P+�O*������xv^)o�Y|!�!o�xE��H݌Q��ز��G연±�h-&���j���P!v;�?:;˒�X8��8X��cMĵC����I�ؐ����τ^ Ě�J?�+z�[D�G&X;pR��T�8y���L��A�I8UtC�	��X(s�Ę�W��P���QG�I]�w�y��_���<�0�z�&cf�\����H��5��Z��ʛ��`�jR��੍͎lO7���"���!G��O�?�뮁	Xo����h�T�5I�������ژu�1H&I�f��z��L#�\:�x���GÔkv2%�Xe��
5)��<��c��։]�����<�qkl�!��e���c����백���a�1�}�F\3��%���b��:L��` ���?��[��L*Y��E�ȅ�k�XBfQKb��������aC����GdB��_EŒ�%�v,9>"`)���p���0|�{2�p��;���	��%�/3��-��
YDl-~��P�P���d�1IJbA.Bb�JX"�ǁX�%n�H݄��
����b6XG�{ܕ/���|��{1t�&a�����X��a��QR��h5��+!���6B�M��KA��]|�M�&�;V||���B�NNfTm��ō��#A޻�)"B��`�B]A�A��+�ʪ؊����/v��,�if�?�-Jωk��R��`���dN�4!���fBN��b`�BHL�'HG��l���z���)�((9��5��c��'A�I�/}�P'{I�w\F(�̈6�v�x��o$
HJ��6SY���b(���y��@�1����>�Ɗŏ�_Ѓhb���Z웩�/n�����,E,]_�{w*�Ȅ�����9n�a�)U#2e{	�܄I�<KHr��K��YY�Ӕ��-z0���HxL1^:L!�/RK'�	Sꏻ��b�3 &�>0�͞�`ua�S\%��G��1ք�<��lI��J�YM��0�䒑}�����A�Y�ڼK�ͺ�adY�tB�N?��!pjc}�n�F����4QJ��%�ߟ�&�$�@�c0X�k��˝p(����;�%3AH�
Fu��A���7w}n�� �'�ˏ�:\A�7���ODv����ȿ�$�h3R�p�3>'x-�&z$����!cL�"�J�S���LN��K5�?�
/pr�c���pr�iA(]&Z��*)��L����0d�
�s���rTЃ�1���F�/n�=��o���t�$��W�,HD��20����rF�PU�H:���&���%�'Kl�I�ᒋgf�Y�8���*�

����4`�F�fܨ*��T��}C����˂��R(}��_���a੬��UU�Vo20(B�T!�S���Y��S��n�b����=>#`�A
��W�I7!u�6L$��D���:n��5/[F��V8y
��J���2��`C��I��+:�b�u@¡JZO��몎�M�79�M�
ד�L�Rdh�R����l�x�HǸ��m�cͫ�n��];��-C&a8�s|{6A�� sԯj�w8YV��5p,a�x;c����%�J�复�̠t�E�T�H����JTN�,Eg�B˪�9��2W<>c����5���� �Y6#�n�$��5�ϫ>�0I<m�+K�{6���&��"A��h��P�iڊ�g$�UL:�!�Ho��84bF=�;�r�9�/�fX�cy�po���@�4A�Si���r��ͽ0�V���26�ϵ����l,� #��#��1o 8�K���2�q'�w>>q���$�-��U�$i7CU��qZ�_3��\�H3��~���%��\���� AM�u���P�2�,
���_:{?��$JB�yy���N���Eub�`��K����͘��J	�؀�۴Bu�-3��d��S��4t�(�����:�a���L�T�&�y"�.���+һiɪe��� �`�E��k�r,�Ng�
j����$�̳P�(��Y���������7�b�^�����ÿ�2P�	�$klEseR�7b�s�c�t�C��8���l�A)�k+���#˘�����w�lt��of�u����l�xZ�!���3ŐM
�R��t��f��l9��3
N&�K�3���F*U�^��b�-*R;�%�BO� �ځ��8"�T�!`�7��f��݌e�=�t)	դ���
K�}"娌�Hߐ2�m
K>��-�#�OHe�'*@�Z� k�o�M4�rTXc�%��Xc��IO<��
���vC�z���nVc(C&�D��\��ƅ��؄L��$�X6n�2�yN1Dߖ��!���&�/�yY�B��[�)Jj��vi:�A�{t2��]K� z�C|_B�MeLI�O9F��a��5=�V�g8��Y}�+eY��e>	�/�i��F����d�}r�
U�N��f�|��0H�jt�bڂ3e����5k6yE4��*C�,&
�4��yD�
X��i��º�O��ֵ���n
��u�KTy
^vÜtjb�bl&8�\�YL�	Ʈh�k�,�<�X�Qϫ�@�0/��;6�����K��e�B-CA$i��O���`+:�E�Xd�$��
�|�%Tspa�����l�����ItW��V���>�_��V��j�x�$�c,��E�U�gw+ȿ�ͭ�<���mơ��a+�X���8p,��FHeΔ�ܳ���*K	� E�
�Vo����7,���"|R�$�ǻXaĽ�q"ƌ�o` �6;;A��#&cQ�ҁ)	Y�j�y�y���ZV��nQn�2A��n���(�WlIH�F�v��ӐϟU:ʿ/������(.p_v����,��AH_
�d7�D�:ƿ��5�]��҄�q�CQGK�k`8,#�j��1|����uo|��Z��,G��Y�X���"��Lj���MA>I�Y�,�u+��MĊ��/2�p�5��[r|PR�����f;J�
�	80������X6M�W{z�R�ԛ�'Q��Vx,3E*ǩ[)%tB\��;�KP$�D]�t\k|�����h�xY��S��|w�T��-��pm*RQM.@C:����qf��] �ObvڎyO��NJ(X�pD���t|E)�cyي��v�z16��L��,4Z�@��Ğj�1��A6�I��q���M�y�d�n�n����0��c��P�`��2��b��8�Bԕ��)�>H9NgK����!#ꤻ<��&U��2|3ړ�՗��A����"X��~�B�?�E	4����$�f���!U�rv'�be)a�	��D�,{i�N�b](B�z��n�.�/,%�ب�Fd_@ԧ�"U�0�;�s�\�	�m�*wY-�x���+�V�)�D�dM圤J�Ɏ�6�m��Q��e��Yx'�=X�}Ŧ"Q��S1O��a�0��5p,i*�b��6���
p��m�j�d�����$���te��n3d�7���3��1	�RM*��vDH��Us���tV蕎A�MHz-y%�>�A$
���w(?���AGγ�����W�ӦK��"���TAf�����6	L��g2�d4�Dnhl����3�PMe�
I�C.h�B�Mk��f�xhI(Sd��0E�6YX�	⮁!�жB�����d�x?&R-���"�dK��
��7YW\�6�	U�!�%�MÆ�$U�&[��V��DƗq��jN�o~ܮ�AX�T:p7�x���"Qӊ�F\ȋ�3`b�tu@��)=���A���eE�DPX`�f��>9,F��X����{�I�_q(������-�K�.#�?aI�:�ɦ�pVk2��\�H�M�-[�vۤ�XS�+��YG�R�O�;-^vh�g��sb!�r
|R�=�^�MT͢�@ȣ�ʔ��l�p����M#���FE},
�-�� Y(9�L��Q��tg���ٌ�Gf�4�2t-�w���{����4��e��4D�v��'DI���t0�E@j�n��R��p\N�l�]|
�^)�%������f0���5��iذR���R3��肌�y�-��М�B#��(���G� �&�N�4��tƢ��%E�?�l����}��e��?k���.� �v!E;�ϊ\�j�2&��K�Tz���ZHv)�0V��$�&�x݋1� ml�I�ں'��E��vXA�X���g��2��S�Ȳs��L�)�'�]J�H8�����O��K�hX��'e]0�j��@�S��Y�m0j3p_3��0����x��)	2��K�������zI��y"kC��}3~�ڴiy���e��]�A�D�!+�ø�7�9�t�AM��YpI/���%Dy���Pnaf�Q�M����
MAȒQ�I8���/�f�tK)���n=*��I)vg�<4�D��f�W�*H�8v��lE�$�`Ds)�v�5B��$8마*��v�P�
�K�x7H�ٌ�'��z͜(#��+�+%Fߺ�^50RJޘ�1��%�nu�@]ȟ��“�����t��'QH\.������[�h�sְ�IX���cj�.���Ȯu�}�&[�ڵ��TiGT~޷C�]��ix	���)�Bc�Y+����`ɶ���6v�� �Kz~_6����5�H�H2�6��U�RiH�qӁ�fC�*����4:Sk�N�a�5Q�P&��C�M4�ep�L�U�W*W�
(��d�I�Ru0��	��<�X��6�b&��.�O�v#Y�5G%p��#�%��IL.��� �R�~Lr�5���:��
X��'��	�l9[E�I\
�6����)�'{
<k��H����ˌ
������2|/�A���광4�%�x��Nu��H��bo)�F�L%<,�
H�i��*��d.nkN6�S}Ym���d���,HT�q㮤,��t[�,A_����ɜ��Rp��b�ܤ2�Ks�"�+_k�6!du��و`J�H�n��臎�f�b�!��J'��_L�&�\m;,��X�Ě� dJ	�](���,�@��rz4�K8�C�M�NVA��J�k�ni{}�7��`���Y`e>�� ���B%�91R���j|
�4Q�)�ObY�ns�Į�Xy^�t[����,���Xf�
����V�����0�;YY��2v�Ukj�n�
��j:ܖդ���d�^T�SN��
!EI��O]�M!咊f�B��6Ŗ�v��, 'Xa9��2R�(��6d���
���m�n+](��Zk�M�|5MB}���6����V����؃(��Z
���il�EX�bO�/�!�!iI4"_9)��t��;W�_�t�m08�<y��p`��*�ź?X�<��#9ekgk<�J�����d�4��u%��e����2M5��C���)��:��Wu�A�-�û6��<���V��,�T˿8��Im���k�n
�m5n��s*�6�(s2=�%��!U�Oy��������«��$ݪQ��i�Sœ6���J��i�,1��Hx���+���l�n�a�����8#�^�'<�"�Jz��F��5�'���=�A��07�L��!�6�2�@�լ�k�1��պ]�m��H���:�	sW4�۾�5B6X�p!l����>b�x�n��P�t[��D=�!s�}�bFzk"��%���B�䡝2ݡ5�l)��["��LJ�x:�H(�?]m�G��"f�z�m�Y�Mҭ��e6-�-&kUYh�C��q+U	@cKS4"��6H����~_X�e���d�I�$f�E�l`������O��Ɛn)M�)ƙ<w���b[���9,R�/m��hR���x�~1�[�K���$q�Bvvym̒U>�-���U��Ny�pFY)�w��I�����
�y0���&�:�`����9qZ2�ѵ:��<H�U̠[u�_�8����T�MVYd�x��R�f83/YR�2=联)�
1�e����Z��@v��n���P��m�]*
�P�8�LY&�-��%ͻ�
J
Iun(�_�lH/5����<�@€�w�EЄ��0�O��y� �/�U
�l��R@�� e����7��G=�^�nh,��p���("įr^f�mןr}�B9pj(��D�JO	�5���vR0��7
��2�W�f�t[���_���i�P!��B�.
w�B�4�I".qf��s^x��Lt�顬�⺀�3�()3.U�0�n�"���l�"���Ӷf$��`+r�D���jJf)y����Hƨ�n}�{_��m" �9��v>	�n�$�Aö�%9n���v�F�~zH��.�bb�b_�
�Uw:ѻM�P�zWeV�D*
���^.���t[X��{����,l!.�i�[5G�wD{��K�IB�:ի��t[�E=j7�S�͌	���P:�P�mK$n��e	���2��nIH[C
��SNK`�y&�R#P���6s=XO���,ut/�k�X2q^n<��`��Z�n:�D'�.v�
�a8,��VYE�|.{|H�5w��B�I�c����,3�����0ʺ6�`�G5-ı�a�=�ցi�`e��C�w
�W+97	��]d�a%��ss@��P���Ȓ÷�^p�iQ�/.�S�<)���Ob&y�m�n�y�{�#�>����gR�-��/ǁ��D���P���mɒ�Q�<�sÍf�탮���5�	9�69D�w�V{��k`JB������9U%s&F*6����g6�v��T���A�X`k������c���u\�g�t9�*k��M.j3�j`= �*�f*y$�|;8�	H��$;��2K2���쥹2׌)	e�����4h��k� ���uk��iS,�-zMVk�X���6[5�A�ːO�<m���y�I�r��}�L�<O۵ �#���%��ͤA�E��I�(0�,���'w��bA�n�q

��
�7�j�0	4
!��i(g�"g�v]��ō= �49-s���J!JJ�ZD�_�R̎�M��ڮَ����n�dX��$KŦ��&.ݷmڧ�����X�*�ur*��J�q)���%�6�X��1r2�1���N�ݓ�`A�N>���r�;���m��Wu�Ȃ�#J�ʖ�l�h��-NӗX�����`��x��%�b�,W�W�ӣn�K]����f\N{� H�IpF:��J��@ѷ�.b��L���d ̮D��b�;��Y���m�>\l������-�O�x�[F	�p�e3��
��#�6�� F¿I{7��,K���L?��J9Y�$��㒄����D�4����9�&(�M��}�=��Tm�б'/kv��e+ �v	lo�i���J�ͨ�~��=sE(�3u�C����x�<H��'�Ht8�Īfbد�� u{:��'�V�(��%+�< �v0�*�-�Ƀ\c�KR|�$Ͻ��HMn�9�*�u,,�<~�4E>�����Ŗ;�s6pH�V{����b7H�I���C|�Y��2�@�'��{���4��v�;�c[�Yc�a.��O4�_Ӝ	���N[3a<�>�r� vM��GH��=�zdJ�,��]��Jī�nU0���j�^���<H���1�i>�4�P��,�<](J~�.5:ྴ/���t��y�!B��h��[�K%��z�ӷ���n8�jM\V�b��n7|^�X;��y���#�R���k��	it���Z��Zc�C��iD85�4��? o�T"?�fɽ�eg�hyiH����y�ᇤl����-/�1��ٞ;�i�;��hs�
I�:I:7r�bM��/w����X̭O��<�>��c�1��>�?��j��Y;}	}����w�&N&*6γ1��/��6ɑϷ,S&�T)K�.���n@
��vA���Ҝ�^�v�a���|$���_@F��
qV'���:��1�4<�
Z2�)S��>����&
�S*��v���켆)���*Eۗ}��[sE�n	j��b�E���!����J/��ļ��V�1����mK� ��3գ<d+h]i@##����(!���yb7|�g0�?}\��mE�j�gSy��괚�B�i|Zݗ�!
\'`��P
�cA7��Dr�`!�fo�B��D��ttƮ�v��y�1�L�\'��n�q	�D�MK��Lw��}Ȝ�t�X������W�.���=�*���t�팓O5�!o�*I>ς#�Ϯ��2�M��v`":$�~
��r-��K�O@��A�3Y���M����!��7B�z�ǐn7y�:Dn�ujM��:����ܱN2�fՊ8>K�b��ii��
-�
:�u� ��l�<��^�ݐ]�o{*`@.��K*�%!B�쑤�ѷ��� Ij>�z��[��R��\)/���$��2�6�x��dL
#eH�=SR���vQ��u_uH��VV�}"��w�Wk�Ԙ��j7��h�"���p�]E���c�l���~V�Cͪgٲ[����w�������-�G�^閳�����zmv?=�dw�1L�>X����<�#á�\d��u���I��w�uLeP�g�?i	%�U��<%�D1�l��k)N9,�&�1hiEL��x��
r�EA�n$�-s39$���I혋Ŝ����ޝ��H�MO�&�a2�$�:�z�������Z`�mg8�So�Ķf�`m��]�u!{�JZ��KȊ��VZ�������@x,7���I��:<�lBH�U�k6>{��%(��RX���/D�O��G/)`(��OW\�[$�·���t�ȼ<iٯ�C&�M=2�.%i<F�;V:�!�f�?�����?$��O��23��7QV���/g�%݊7])&Qyի�,��D�Fh~�b��L�~s��؃��(N�{�6c����잁�G�H*I0=��_U�Hk�#=�qb�������,�X����%�e��uH��Hԥ��	����Ww�����T�b�=HO^?�Z�-�/��C�͇g嘄A��TcO�<���1t-��8��̓�%�����q���C�햀m�z.���P�y�̹y�!�6CT�fs*s�Qv��]��0�S"�g�7�NBDR�C�=]��'���m
6���C��C`Q���TT"Ά���Q� M�h�;tj���s�&`��[D)H����vW\cTd��z:�u���Ԋ^�֜�0���3�{	}n���ʧ�Ȭ�8qQނδ�'�!�&ȁ5�S�	9�Ƀ�aa��T�QɄ�e�S�vOx��&�m��I����زӃ�qm��}x)��d:��&����¼N��n�Gx㼊���ӮH�*�~*�������seN�u
L�b3O3����»�ѳ93����>��"�D}����|.�T�t[=��#X�0A�6=�up�J�Q%D���c$Ez�Sms>�.ui�ۺ��豼f��+� )ۣ!=�I��< ���TG��@Ӟ���zD�����3�@%�KI@�*�P\�Q����f�}��.鶫G�O�<�.�����'�c��`Q�AW�4�m��_��|�����rx�ԟ���J�}k]�����e��gT��y�n�h��t�
˦s�<@��r��/��*��I:�ܣ�5D\����1c�^�k��2�L�b]?xwZ
���v��5���7��b=�3�76�]�L$��c��k�Eq�A�U��vI����/��R�M
��h�yImӦ�>�
ޯ{��n�Ē�bIH��i���$�[���z.���"1r�=D�y��BO.���8�-G�
$GY殘2�X�V���+�~$<�f���VG!�CE�`C�L�Y�f��x���=��W�9������9����%�W�Ȟ�sh�H�)&���U5�������ᘆsu
�9,$g	�u?
c��_�0Oe�{@�=���<3�*I���s�k`0�N�=y�	 c>���A]��kP���4���ԣ��e�9�"�)���5�~���&%k��0�4ž���7W�=�t�T�;��m&��s��[��Q�&�6™f'��
-�J���)u�"n����q���Z��,��*���Q6�{���4{r���=s*@���/~m�a+<�ÈQ�7T`�%Λ��d���������e1B��?�8B�%Zy��'
���i�GY$)�͕��k�W'
p7e�;\0bv�������Pt��j����Nc{�%7��Z
H����]��\U0���)�@D�š�u����a��X���Ǜ���4�S1��댱�:I#m��Ã+�c�ڙ]�[Ƭ+���3@D`��,��Ǟa��nd�~��t�o�-$��д����5c8,ݲ�<0��X�@��S��,�g�[u��n��-ߏk�X�n�aC6S흵|�Dl[%;�秇���R�״xi���,,[�6��y\��e��q٘&K��rHj�b�`��YY*Y���4�m���4�I�F����4u�ݣ@��UT�0��I'�|�(��)Kaލ������z茬a�B�a��=�s�
��"���c�A�$�����[O�/�.��S���C�49�|͸�y�)p�nj�1�9W��ã6Ӽ�p(�l�$�!�9OF��$�{� �Ys��G��<ݫJ���H��5<�
�\���ƌ=��Q<��ы?X����x��pF��[�ញ�HWf
�Jw���@G��l�>t���L)����P'H�Ų��2��n������@xD�D�q��7*�����XIIfB"۫�D݂�@��=�r����f(ȶ�v�w
���n�4��G�����7#�؆	O��`T�5���1�8��%H�<̞�k���U�Nt����8�,W��?��R����[A*��ATB/��9,Z��kC��[�]�*�];G����f���!�&����t�<<�Zr���o��Q%�f�<Y�W-i.�?l6���8�A�<̌�"l>��r=�0�h�g�Ip�ʚ_��-[�fy���mVl~�����aK&�x��v��ؙ�I�2�~�n�n������db~����Pw�W�y�	��B,g=��/M^��;3'F������:��Uȟj�?l+4�dݺbm�}
L�b()Zg�[eeY�\c�H��na&NGg�i�/��*��<ĉ|=]rz�;[>Q�5v�l��<xU�C�=�)�-�~p�1m��d��NI%�r�;<Iݣ��]����$/�~��Vr����Y^��}m�x��u�d�Ļ�DV:�ӽT����TB��At�Aٿ�&�F�����R��O�Vg�cR�����|��9�XC���5|�� �
�0<5��i<E�L��t3��%׌ik>��!1l����DR�$2��)�y��Ggk��^T����+�ԛmH�1��y��_��F1��19�E����~����z-$�-�@�i%��Ǻ�>�"��7� 7�aW8�p�u#�IJgo~}s�PKEePQ�A�8�"pip/_vendor/chardet/euctwprober.py�T]o�H|�W����/��ۋVZ�@_�FQ��`�a��kf����g6�-O��US]�t�}�C���hJ�Q4���gѿt���jS�e�Y��Z(�L�$�TJ�n(E,hKGZz��G~eeJ�dr�8P?e�RQ2BEQi�
/�v�iKcw?@Lsc��Բ�Ѻ�1����
WY㩭�NtK�ϟ����B�h��:Z�c��پ��ho���v��?�M��Ns�6VtGP����~k�X���
[7.喙���=Pm*J�&˙t{z�I��c�/L&�	U:C;�j϶pG��K��Rzb��̫��)�c��vL�Q����԰��Ѐ~���D�y���C�>��k�.K���f�o!�&�i�#2�h��ӌ���n�=����a�h�T9�+�j�y�|�-
�/�.�4yy@-�F��3ɢT���
�k�d����G�Q�Ҩ��� �i8[PH�p����8\�|����A@3-n̼d�������{!�۷���:Tm�+c�)Kl	�E��f�����l�ɜ��]z����e�`9Ϸ��O�.��C���F>�9���ۥ�q�)�������z���1"�>4�>��#�n�rk

�u�ֱ/�Y�̯�M*�e��!�������j�H�R��2q���3GhN{���0XF���D�sT;���<犟�W�d5�=ƭV��s��^`�n\�FN����Y�:�U~�7W�t�QuiW���Z$&� �˅�;?K��}��J4���_����q����E�bt��S�����(�c��}e5�୻���zS��Ux"��7��PKEePQE��c'�P!pip/_vendor/chardet/gb2312freq.py��moeUv���W,	]	$C��n+�
(:��@�
E�/�T�.+�Llӭʯ��yV"5�>��9k��9�s̹����ӧz�U���gO�z�|��ן�s�o��������_n�^ݖ��^_�����������?���ۛWW�w��������*���׏>{{�x�O~~���ۻ����ݏ��w����~|xu������C~�����_2p���~���������;G��G]�3����7����>*�<��o��<��-�y�Cy~�p}����s%�ݽ}����,�Ç��o�Rʟ��|ss�������%3|,�w�w�o�޾_�����w�ڏ�������ǿeb,��~)��ޖ���7s�l�c�z��w���Ow�o~|ǟ~y�:�a֏�?=��������CfZ�t���>���no^��_޼�~�p]������o;�y�~"勻��\��u�������O�O{?�e�Yx��s�?�2�w�6�q��'?��-�m����[�}���0�[̪�p]~y����ˌ���}���ey��w�_�<�䫗�1��N�՜��槟c��KVu���]&����g��O<��ٗ�^~��x��/^�/�~^��o�<��o�|�|���o�~��R^\_���l��m�n������ǫ�ۇ���r���������9�W�7��r����o����#�m��͏����e��Ml'�w��Q~;����O.�Z󦫷�v�#x��q�c�����|z���[��$�]Z��ǵ/��o_�/����W��A僋��O[�-��_��/���w��������+l���������׿�V.�黟ʛ���3�Q���cY>�O~�P�6޿p��/Ԟ�2�__8޿�ly!C��'�����<{}
t�j�x�s������}�Ç��?~���9��q�L��?�6�a�(�}](��#���>}��ρ��}��8B[�V5�v�6���?��˫7�MpM��=�����<��_~�ͳϞ|����^�|���o_>����?�|����|����_<�OYξ-��J��/�����O�����y���E�zY�q^�1�e�۸�g�?Dz�׾�k������-o���V�Yc�{��5kmY//2Bl���qYƞ������p�[���r9�m��g>��m�?c���d|~:3J?Fˀ9��rl��h�R9w޳���\�t�[�'��	����'�;�˚i_��e%c9//J��W��R�=�Z�кdeG�%ӹ�yce�KF�k�5��F��2��a߲���GVێ-�\3šy�޲W�2L�#{�1~=�Liσ���k^e�ٯl�h��2’�=����-�#����E��/g>�pF=��r(���nG���q�Yٺ槲2��Ζgfc�9��M��3̖}�-��ʡ�Y�7f��0 ,f�M�a唷�1�W֝�j,���WϏYN;3����M����|���&[�j���
,&�Y�<n,ً=���a�X��:����/�l��x&��l������a�##�^�Vw�J�!T�f�S:G���򑺳K������G]�$̹eb��v6)n���l��t3t]r2�)�x6/O�X�{�̛���0l�&����I1�JN���y|e�������u˶�3?���z^�Ge�pf�b�y\m8È���.a�'Kٜ\0��E��O�w~��a2֊?,1��9CL2��9�l�q��n��EbJxz�����A����
���&�)G���a�7P�>�O�Uue����|�>�i9�#/�O!Tz`d��u��پ873�mc
�9��.�?��a���<bK1*v�2�R�ȅ��bu�wƗ���&�����<�%�_�s 8�����WL��u��
]ȬX��dh��U����D�,>���Ẃ52a<���0F8<����1�ˉq�`)Kˀ�0�������T0r�8���wa_�iƭb����BW�q�i�3�K���mTQC�b��U٤�Z9�<�Y�a܃9�X�cݍ �yr׍+q�`��pՍNJE�xl��s����1���oY�r�x"OKv`�sF�x�O�X���8dN1����!ƾet�l�ٚ���ٚ���s�c�˶_��϶dGz3(Չ���[ya�`r\��]�k�=��ʮ�v�]�!|e)�.�T��3�/��g�@�Ι����+��6����6�GL�F���v���K�,攽ހ�Γ�G�d#��>"f����V�3#�ċ�� ;�b�&�HI���sB^�����(�c��9��@5�Io8��y�����5�3VZ�.����f��I�V�����]Y�	��+��9�v��@c2��U	��6���)0S��PB�Xʂ�IY��4ň���E��h H��zn�y��8���0?O���@�F0�H���x�I\��jL���Cd�< 3f��6�8�^��:/7pz@�B�0˓�B�i��XCղcؕ������Q���e&��*Þ�X1K����yp=��F(
6�ˀH��`ZM��RN�o&R��8���!�G����8����ڊ�Sd*2�����=�N�5�p��A��56c�-`�/��N���
d)�lX7����ı7��1b�a�\�}`�	ib�B'2P-cPA��77F�Vܶ��|'����5����I8X%�u��k]t�J�`�|,�F�S֔S�l8��V%"0C#�Y�.ee�'D{c�1�|��n�����:/�^v�]�l�Ä�V6$�BeQ��@�0R�:��'vh��l+8��y<��7���ra�f��d�P����G�.d�/*�&�c��!
�b��\7�+ 50��! a�`w�Ũ�rB	A��J��{�.�Sк7���؀&B�I��>0��e
G�1���1gB�H��v�G�J�ZW�
�5~/&C�hCv��X�v��W��r!r!{����b5����e�*t����6���eY��A-�`�92�|bl��B������W5֑o�"�M�N|�&N�_�B��`����>�����}#h|��R�s���p��.���p�&�4�&��L.���1�g;N��s�G8��`r�G�	��y�&�#.7��Iڪ0�O����ɡ��B2��vn���Aa�x���C�:�����`��}��Cd�
Y=y��O�;��]𐌻�������=0-��}�k��a��#]�+�N�φq0 �e9�-g� /"�B�B�d z'BC�*��� +u��+�����h7���5��@;�ʼn���#w����}���7d��tz�Uv4U��a�a���6�2��L���P���\r��qH��އ��P�PC�A�8�ʃI��i�wal.�E27���ؙR!Mr-%����������Ć+�n��o�7��/�{ؖդ9��Ɋ���#�Ģ
�V��bH<�~���Y�I'��*���	�v��g=�Nle#��}_[%֕��3%��8<`t�G�#`7>V�Eֹ�a;���H�
IA�	7�"�L�?dU����@H����D������rҚ{H4��f�V��.F$@t��6���JLD�*��&�0R!d�|�ugP�=�����Zb
]�	��ċ�4s&+&���(l��"yX^v�˝#׃��(?;n�,Ŧ%^>z��@#�qo2�E�G���I�XUp����M�J�04iF<e�
gZ�p�ڍX$�?�lz���th�h��ljL0 m����Ꞓ <@a�if53G�WG`kp��]V.x΅�k�jݴy��!��)/�Ҕ|'�;�ڦƋS�.�b)��(q�8���+b�6<�Xe���w��o��#�M��Iq��ݷ)̡�-�b�;�Z�b�����ph�ԅ��w9�R�H�=��F6���y�<b���!��Ud���
�D>G�~J�H���9tNl�Щ���u{�=�4H�XA��P�F��fb���ߞ�<�I�����M
_��T�_��	�ͭĢa� 5Ь+�9�~�;*WFh��XMWD���:�3�0�):Wȅi*��`�� F���*sP���f�I��R+�T�E�T�R�$/�7�Lowt���x#v�Y����v\
�R4O%�U�� �o��e#eQ�fC�W�L��k�]4�7F`9�U�Qc�bS���*�lh�(i��:e��J�E
�ONJ��a���;$9k�#.��߰�[E�`���P�*�!4�!j��B �E�H�����۔�`�"��ΑS�D��=o�p��S�OM#��@�����@�;%��pr޻z[���E� �����(��@�/�3d��6v<�=�:Mp�JC��n���B�T�)[j]���a[�QEw�x�4HO��x#��P@B�,�axF�CŃN6�xLG�_�5�h4uS�G����nԝ࿟��"�y���L©�E211� H!��C���U-I [Zd!�j=k�s*M�bY��排X0��	Ѥ+�f7
��Tso�F�
���&�R�0�J��@"h��:�1� N�1���-V"�[�[0���F)��@��#��w:���g1!�������FIh�f��@qPm�0�
��ũC�mN�,E��&M����2C̴�_�z��8= c�����%�
��Z��F�h�2���N<e��d�/��
�0g��r�@����4XI%�J\�X�)R�ZLiE;'�Z��A!�U�m�$�nJJ��XQ)@$t �q����"�7������Y�$�6e	!�8�B�e������ٵ�On��S텼��-���g�.`�CUdElT�j�7�s�Q���>`Q�I@�F͠@r 2A���L�f���2�Tt�84����8��ch�ɻK f�a�������g��z��No�zV�v��"�aA��U)�Թdg��/:��B�6�މ��o�qTY�bBf=V=%����3E�#�x��9��:�$|d����_V�n*��~�eYk2L��f�fy�g�i8*�MT�}-rB+�`�r�sJB�|u(���9#�J�0]kˆ<��(1����L��|�5SSqk�DB6Պ!�@G������j�����s	�y�3�m �E������4A.7
&�� @@z*�o�^4��z�,�:�E�5!T�8�;���V\��:u�BE�=��4+�����=�$Pρ�5`	l�Lb3r�9(a���U�� �o��{W��H�bl	�v�P<H�@��T}�H���[�A ��(dZ���4����M?M~��e}�/�?LQ�Н*��l��#��j,
�"���2C��K�l-��5F���޽[ɶGfX�}d���9́�!v�7S"���s���֎Cs�ȳ}�,�aH�B�T�kM���[N��v����1TO�5���@+�5�mUǶ���)p�d:�E+uЀT�d~Q�U��tm|�-�'�r(���`��2yW�D�����]G5�j!bW�+�b(���,����9�s�BT�g7��4g� ����m�|t*����j����eg=�*<mGЮ6�6���,���f[��>;cX�q(U�����U�e,����(\R&Y&����A��&���dR��!\7�S1����<�D�"��HW�N+�X�HUOi6S��I�(H6�T��Q:MҧAx�݂l!��p�j�2� {��U3��&�%�Ї���$ʈ��!z丛�<G�ų�Uc�x��6]���m[��#�n���^�|9���3�gdŪj�vl���e�
�5�j��v����QG��d��fndFO��v��mgbP"Q�M�.�J����!��Ҙ��D��D#@��n���A��b=ˠt�8�
_vK�ۉ���UJ$��f��Jam��	��@I&z��b6�{�h~��L��0
RdxXw��WJ�Ղ��؁J�!'��
��T0�N�����cQ���-c�w��fE�dN�&�����9����i��D���C�C��yVy-�sn
q���ό�L
�Uj�7Aޔ<~Ζ��lE�M�v3�e�������@J�6�\�� cS��l�0l��ZQ8�z�]����ā5��7�/��h�Q�j�dɪ`��T��-��MP-���'D�v�&D�؄f]Ϛ�P9mHV
2N�I�bXL$g|T1�IM`��(�( !M4�uLyL]�0�ҙV0O���ʁI:=Q6G��N�l�B��تwZ�%=�?(1T2���Cs0R�6��Ik}˚�r�ըe���܀dR�n�_ڌQ6��l����ʛ�ap��;�N�=Q�wX�����' � )��6��Q��چb�TV���H/[5�V�k�r��j
���jV��פ/$o�%��hq��
1��؋
t�RC�=9��H���S4.�!�>+>��n����FS����SϦ,C�h47��B�� *TeQ^b6q�Vojt��L:ۂ��A�c���b�̢ʭ�z�aO�iE�h3ˢS
2t�I'�@1{�v�4qa�HX�Y�`��
>ԉ\�b%?u���@�#�ǻJ�"b�b"R?��O{E(h���
�6јu�$��O�GF4Nk�{�fM33��/+4}����r�W�@Oᨭ-�6�4���xV�	�&��,��B!T��I0L��p
�r(���4��4��iC�	��V�:�����(�얨lq�J�v.��eivn�vk��o�3{صH�N�
�-J=����x���o�2ٕ���z4�PJ�z����1Xx�Ϩ�ۯ�
���{��[Ag�(vP�8X�m�R�i���V5d%���$�,� �}y�,FC��lU�L�i�6��	�8������I
A��؉J�J|&y�6�|#dƽ0$=������&S�-�63�**!����j��P�V!l�=w�:v�[�?�B����� �6����j�9/��:9ao�{��"u7���)���F���?/��
�LX��P�e��95K�
7;����9U�w�����K궢�A�/�dd���5�X]U
�N/6�Նml�!����>����Vj—�E�����1Z��`�O�C��,ձٶY�e�0�#���,Ԧ\���V73V�t�_5������6��C��>#�Ŝp73�j���X�%�D�PP@��͞�GH��Z����M�;�ޏ�R`����wZ�F��eKnh�rQΙ��k<�d�T���	�v�W;1��܃�͘2{^
s �:9��m��^m� ]��z"Ѿ*��0���j�f���J)�s�픬��6_���Wr*�!ld�
怉�6�����ֈ�R��0{���x`6Cec���x�L��_̶?�@d�m6���i!,����۔�P�޿P,�m��;�ζ[� ��C/
�9�Z��($��|:��]�n%�WBS��Z�X"��r�}r`��-�[W��"�"�tL��P�a�X��}b�0{�0պ˻	�f�jr�!��2X��"�eW�s��H^��bxf��[�DGxj�}ѤT�M�>��^i�0�ẑ6G�0��,'���Ŵ�����AW+&_�^Aa��vf+���+���^�����Jz;;
����D	8�0Q�Jh\�1��m��BCş��.Y"�@�叶�߫�C�$�>�C�
iI���+^��q̶E:o�H@���!%&
���(��C�N����<	J\�Q�Tg�^�S����,<dWHD���W)�H[��6���'�<��L�=��F��fݼ8h��*y�E�M̳�Pb�0dQ3�4��^��-�\����ے3�)0��rD]x��0�%^d��:pWP��\T����eȾ�C�Vk�8%�zڥ�R&��>^��s�t�S���:�le�+��L,eC�L!�v7�!����Q��H�M�vM
�cZ��d1�Y�E�&��vbdm�ա�K��63��GhB`�&0��6��j�Fvґb�*|��h�n��y��V��鴐J�a�VҳԧV�\�<K�&iH�>D6��yk`3׃�[�"��
�c�l����̹Z��-�X��2�6\[F�ؙ�z�����!��b_t�-6�j;���v�U���1�d+��B��*�o*���r�����e5Eo�-^DD����.=*>�RU]6�d�&XST��8���K��C����5Bz���(��f����_�%��;-e���(/�ɤp�mE1m,^Q�F!��#H�ky�4��.s=�i�	���w�]����&�k��RH����kU�J��-$̷��Tx�E#/�z��T���ބ��z
���`>e���^+$���I��g�B���=}��܅%��{qevnB3v۳�(p͂%�ξ,)��a�y��NM����5Hȟ��U��cCM�����ӫ^ǰ;@#@z�P�:��YC�xY��r��?��fU�y��d^��mK!$gRV��U��#۬�;ȣ8�!�	�PAx^��$6��J�s�j$ټ�eYF%V���p��a��4��‡��!�Ԩ��X�q�&g�2��q7ɡ$Yߋ0L�z���*ݼ3��
l�����2ݥ,
�^GS,�}Q�;&��g�F��V`�b������V�I�i7��b޾��˵a�^U�l�#�����R�!���,�ʝ�.�sۼ�b_��*�,�U��#j`��,���s.�,v�pA����$�� Hq[����]k�Z5Ŕ�fH	�vL���겆
4y����j���8ꂒߪ]
�ʨ7cx�WU�lLd�^7����S�ʁ���kCV�7���j;�҈J�� ��}��o��!
��M�����C�^�W`����'�X��4�T.�[)�vsI�gc��[����<�������~j_�ޮ�����'�R���m�n�/��U�E�E����w�/��Q��,��
S�!z����T�+@q�N��[G�B⡰�6�a��$ ���,�z�(<@Z;�y5x�����e!��xe{��ћ�^.Sw�Q�F��>qX��
�i.�~��l��ǖ-�|8��NM�\Um���5�t,IMf��Tݯ� �Y���fEt�f<�'��0U*i�ӡ)ŗ�W�<����:`�����%�l;�`4��X�|C��gn,�{{�2��UD��ujS�(/Ƙd.�1;��Pjڼ�z���΢�]��s삱
������oX���:mٶ�r�=�vNZ�����jI����g�JIh�@b�7��e/PnkæyH�}�^S6��զ/6��J�D �d`�ԩV��J`�5�W�ɘ1�V��X,�
�<
�SjC�ݼ�^�u^_�[;N�����Qj>�C��zQ
�$y��b�%�����T��Y��\�f�y0Aw�}��*�T�"��JJm�4��R�<�٦�з��nJ�(�� �ǴWRK�b�A��I�
�V,`��6Pkit��h�M�f��D�k��Ws�a�1
<�w�.X����/����0���h�ڥ�7N�K��`Fv���CʼV�w��O���7��0�����(�-�A.�T��Cy�P�.�a�<4���9{(g��2hwhd�虰&e׈����U�����pv<t������b~Ƀ56��U�V�xhm�ש��*���O8�"��EgK�i�q�d�C�F�~y
�1��ѻץ����z���V��W[��g���Ҙ3�����o�8�#�3U�Ľ�e9�jE7���Np���n�B�=ur�1�r�I	�/6t(��3�͋�j��#OU*�Y��� ���
k;��6���/������f���6B�CI~^��c/�Q�9{��X�Q����"G����
��G�PKEePQ~���6�#pip/_vendor/chardet/gb2312prober.py�T]o;}�W����ސ�Rۨ�]6���%T�	��Y�굑�M���=�3MIu/O03�̙a����c��8�Qw8I����F�����k�����L�Qi~J�Dd�2ĢƱt������'Vf˖LA����]&��PYVZf�K�~ڭ�� ����xfYx�iU��|J������S+��ΧOAq�<�X)��ZG3vl�8�w��\U�ؖ����H�4�jmeI�
=yC��o�>�k�\Ya��Ra�ə�?C�զ�Lh��K������1��䲨C��9�	�=��=|/h�J�5[t3�VJfe��1	G�s��S� $=�����;b�|x���C�n���c�����A?��
�k��Ia���.Zp�4'�w�x�/ D��X#Z1U��J���Z�>��,���{<����j�4��ߞI�[%A���о�p�z��+qw0����`>�)�'3�i��d1�g4]̦����G����L>Y\��4p2g/�r��1^�*��xb�9c��"��ȶ�_3TF�w�r6�dA�6=[����1]������gQ�>tP$�����e�2ƶ�k���؛�N��]�M�h�"�ևz�xD��FaMIQ��6�:�[kV���Q���֞dS��]���u�z�<V��Fj>’]&
��>s���wa�������L�{T;ܢ�>���˗�h9����F��s��^c�t�lGA˥��Y.[�Uq����p�Z/�ڴ+�N��s1#���B�Wj_�_ڱ����_,y���}��b����S���.�(�u��}e5]��z�B	���Mx�t|�PKEePQ
)Ӳ�6#pip/_vendor/chardet/hebrewprober.py�[�s۸���?X�J��k�k��Uq�Ds�챝f2y3��$��#H+�_�gw�h'w�y=ӞM����.��������x�.Ƨg��3�������ڃ�u�0�H�I�Su��F%V]�I�T�Y�h
�7�B֔*6��ʼP��<�q��	��5�&�W�P�L������]l�?��K<�΋2�3������j�a��ua@m��E�z�G����K��\>T�4U7�֪cM�hba�4��"�V�g�^1k��xP�I:/����Re��7�"Ϝ�PP�L]lHW��e�Y�c?�M^�Hg�0qb�<�.���?��/�8�m�Q����.M��^e�&ԅ��T�3�) �u5M��/��d�(mՊ��E��sb��1��s�פҟ�I��&c�z1<�9�}��tI��x+�x�7*�5
�sة�F�X%�]@��!�Τ�FU�̪�
X�>���_}�S��'�qts3��}�	k�i����R�\�	C�Bg��������{��_��>������:��Q#u=���~�ݨ�7�W�gCx�1^Ť�.%�*���2�&��:I���	�`0��B?�92��XiD�j�l��ٜ�ŖF�?�d����u��w�};��ƾ}8}4쫗'X���&���d��i�}�&�%-�a�񋓓���'J}�œ�~����w�����Y�/��e�U�O!=�G!t������n��*8�[@o�l~[����9qnlv���J�醔�ϳ�?�!�3�Wzn��OS����Z-LJY��"��:��V�ʹ0k�K��ev�tR�.���[�}Bt��!gT�
|G�n�U�+b��C�S���^
~����?�#�+��ν���$����x��\��$j�h��+��:,�oZ���[��Y~��W��~�3�����CYɛIr胊rd���=�Է�	e�r�#s�fؕ��x2���|:�9&�c�*��؜%����M�*<T|.BP�)d���x<8���sJ�6_�Ll�D��c��H��^�
R�_&�ؕ���p��љD���?����8D<�uYAPho�03�_�WC��2�d���h��(�S('�h�ʋ^�H��F(OD��THW�3|i�:Yʃ���,2Ef�>�T����x�~A�k\�I��å�e�K�3p#���3YGNX-�Ԕ�Y$k�j(�Q�����_�>�UP�%Y�V1�3c��^5�$Ηx7�
R�6Rd�Ǽt�O���-�O�
�i_bt�ZBJ+2J5�ʹ'/Pߩ4XJ�lzC%��"�$�4k��Vo�o�n���y�,�C���j���1�>r�B�-UZά���% �na��&�Q�f5o�('U0��%jS=�����Ha�a+A���FlD�y��@0���T#٭q�%�BU�Š�?��^䩑מ��5�Qxum��u�|��h���o��p8T���>��S�$��B�2�ܝesb�c��Q�伀�\�X�6W��΋hs���i�]�~��v�l�>���9�r��y��3��UH�K��N�	��oykI	®R�q��hf]@8��/�ŵ��(#1��~D���-ju��~wA��8��R'ŒN�9�Z�
�RFP��u�Z����=/��XS�B�k�#e6�9F"#�G;��6���zHk�[�5H�l�8�QԖ�Zq�r����;�+@�/2Q�إz�P�h%=je��)���8�F�����cNp4!s���ȥkV�I+I�W��}�gUP�q�	�&Pe��(��jR�t/� a��%�rp������ C�}�v!S�K�����x��b�h��C8-�A��`43��S�B$�ru�%�inc:��@��Gpőw�p��/\)��"��B� &/���aj���k�7ؚgԾ�	mΚ�U��7��
:�����V+( @���U�����`C���;�@�V����P �%#]ғ%d�ڗ��B��f�r�56g�#�D<��?�LiVԁG��&mR��4{����8l�S�Q���B-Z�,8�i��>���N#�d�V	�r>CH�w� �o�y���w��m�S
6R�x�C"�R���Q�IΑCi��>�(H�b�@-�x�$�f�݌"T=Cs��W#�� 7e�E�N\wl��>;%�S�qQ�"�T����|[�R�J_*-?M2A����W�,����A=G��%�	�����փ���x܊�p�]� z���%��u�8Cg�k�9(a�*
�cT�(�R#�NR�f����6�RIjN��zE��< �@d��l��{�����;����Q�d��.�oOY�m��P����D5��kmo�$�gDUO
��G5�-$�	�5w��*Ilv�p�<��<e�.�����I1�g΃A�`1����VB�9�bՊl����+~���*���xT�VH�%�2����ҩ�)��T�х�T���S��cR(-&�(L(c�[�&[��T+_>��r�3���r�}!H쿩y47�w����J˭��/�h�Hj�45�n��ӵ�P�Q��ɭ`��:PK�����h*�mFM�Ť�B�f����,�z[�+m2ޑ���O��'E�o����F߅��&��`5���G�|X�d�U]�h2m��\,���R���Qcy��Db*���%l�����rȔΠbح�0��Ն4�c���Q�$_z�^�!6�SWYh$A��UZ��ɰ>��,�� �E*yP3�&@�U����B�>2��+����^��ն�ѫ=B9�T�'�PiM���'b����'���_F��:�j4?�\�\�O���˳Ky�K�&X:�0���p�:;�^�ɳ•�ៃ�w�#�e�6x��=��K �%Z0�2=�
Zk\$�
DC�ݹ|09�ѧ��kGɑ��&�6O�?���%�H҅����O�E�������ۻ�䔄~�m�C��22͂�}��˫�g!�H�'��Ʒ ��77g�'�Kz�4���z7>�]֊��������e[�����̸���dX�8jS��g��S<޻�t/*|�&(O��z���Ua��L
R�yf�g�%��5��g� �M	�k�Ƀm�}K�߭�fey�6��#�I
H��:���/�I9���oX[�7
��bP�K&�]"(�z��R@M���,�A�L
@=w.MS��m�Cu���,�5M���:knhC�=l���s�9�Z�Uߣ%�Ң�V��uZ���C!冭Ċ�7Qp��<�>3ͺ~H�
�"�9��v�'Xt}����K��,ϞdM\Pugu�x���<�c
��y��c=�y@Fc��aj�E^��P��n�󑟽dVh�,�a�Y�/��`���?6K��
]���}����ܵ����7"�Lo�2�,���5�蘹k����Y����T�qԵ�E�x0���N8�7f��|�@M
Dhl���nz�w��갯�D���=���H5a,�E+E�E��s�H�pwf��|w�� �k�%RS��YR�la�ӷy��ʵA�l]jY��
�IO!t��(O�Z�]?)n�L�5�̅H����q��]�q53&v�4ݔ���
�V�h�����
.�\�Z��`���F�C�_P���S�b@��}׸咳<MevI^,
�&z0q(�ɑIHЗ��'c��%�_h���]{���T�b�m��R�������ڤZб02���������Ih�k�:^�&wo���r��ŁC"����4˾�TY���~������@��d�4Rt?�:��:iK���Q7V����h�st�BA�Xgڽ�ڄ�Z��w�0�8�IF[�>ˣ�a
�|���u�(��;PG
����#nE�_A���[,�xQT	�C�\T��&�)��w��'.ԕ��J���S.��L�g���r�\6�@��>'��p��q�]�x?]и�#�UX鞆˨ ���P�Έ}��T?B3U�/u��f�4Ծ�u0MZȻW�y�QK��i����nSx�H�9�/ˊ��֓x���>�I7C��rt�J��Lʊ�����׭��Pl�P�^���hk��i�vXc��B��C挻��
܊~\��8�a�4`]fTtvO��{~�g�W��f#)��o�۶ �޿�N������|��A�C�W����l��7���1rT�����h��3ݍw�'��Ĭv��<�:!~�ͤP��~�xE,0w_>N^���3T�J�=I�}�_��ν�	��
�wK�K�����3t��~�hRk�qB\�'r1�����z��V�]�?8z��ޓ��T�BE|��	�z� �}�1�wR��j�j�:��5�d/H���NW.wfs��l��+d�Yv'�I&�u�4�b�S�j��VW|{vwvz7���)	��Ԙ�
��iL�= :P�~���+w��S�~v��c�hU�R1�y&��ޗ$M탺�4l5�M�d��7wX�j��pT����2��cj�y��_���;awz�����%���|��̠�9.!��j4�oEý�A�p�h�Ă9j�3�+�l=
�T����q���M�������X�rS�
��˂q���Z�͔n���?hc�Xo��~Cs���b��ou�|~��C���a�|�F��G�
t�ҟ���}��&x"�����J+y��vƔ�����7�te����1��,`�u��=-oi���C�R�/�O�����i�.�ܒ&��PKEePQ�9a0�dpip/_vendor/chardet/jisfreq.py��_�Ǒ��S$ ,`�-MED�]c�d�C�,iI
��"[VcZݜ�O?�;Y\/`
���T�˛YU�'#N���O>��������/���y���o���?��'���?_�on�rswu[��{]n˟��*?�����7WO������Sy�����c�w7O7������w�P�*O�2f�����7W��ao����û�}ȁ�w���7�WO�oˏ4�?^�ꁱ�}�K��T~���֚9į������䷏����_���'����������y���7�����_�w7�y���|V����}�����w���T���p��Y���<���ߕ��˛���p���q��T����C�����O����|���Ǐs��o�/__?杖?\�]?��|���ۛ7��7�w���걼�ǟ�>S_q#��)_����ߕ�w���������j爗%�7WO���;:~�7����j<|��N�ߟ�m��Ӱ?���9`>��V�������9B���ˋ���˳o�\���˗Ͼy����os��_s��H7��K�-�TWwO��s�?=��?g�g_�����?s�_�x���W��W߾,��w�^�~��_?{Y����w߾z�y)���?N1��k������ɷ�OW7�������7x���|���\�7�7��r�[�݇��5������7��}BWn~*w�O��o7��D�?�n��Lп���4�]��m.�����O9�W������'~��g�p��3��J��U~�W��G���E���ʧ���r�#�ǟ�����ro>&F�ܾO�p�ϗ�}Nrn���_޽lO�o~���������]�]�$�����M������ջ������a_}���4�����ms�A&�1����C�Ϲ_�Y�g���r|>Ʊj~��j�aG~��?~��G����W#'��G��Z5L����5���`�d���8X������i~o�yÚ����I�Ǿw�#n);����;㷳�_~��m���.��]�2����yq�����?���g_���^�|���_|��/��r��`����ꁹN,�۷2^�C��#<����?�z�g�}�s����?|���ۗ��2��7���2
����bӳi43��W�t��vYb�e�]��^���e�G���2�e�����`�9�_�Ȟ��qi����e;�w3/3�����5/����O�f����������n+����\����ȫ�ui��#�>s�Ui&Ri�N�z�[�E~�K;�J�d���f�T�|�A�9i���ys����47m���ۡ9�;�ya�9n�~�T�F�4�2WL��ڎ\�X<��Ѹ�ȯ����!בS�3m�	5��k�-���8�;��S󑼯%�y��_���|�|�N3��|Қ�ȟ�z���ƭNP���5y��sM�kv�k�ܯ�H�bu���ʆ]�\�\�\�ȢǢG.h��1����7���t�A3i��4��31R5�݌nF7���=n�9�����tw�'�������	�Aa6�pz=�Apø=�͂�AϠg�3�����\�ңңң��d��s�F�F�\�\2�7�7�7�7�7�7�7.�����ƲN�^��+׍��
=;=;=;====���iBa�Qc�uv��9�y�8�c^����K�y3�rX
ĵ�
6��[�
�J�sc�1�"��׸^/���-�cX9�	ؕ7XV.�׃-�ٮ��9�l�������o<d��3.�&��W+�@^�
��
���_�����e��V��2f�o~��Y�#m���F��3خ\���h�-j��(�h�]�m���/�2 9�`��}y[�w��3M��@5�3[�d�9pLз]�9/���0���Fc�ܹ�K�`����u�˥4����=e\�qӗ\`��k
n�#��-�4n`���B\�v�8�r����#�8?.���MqG���}�[-r�2�j�l'ü��Ot�i'�n5�����
g�=#�[�7�սk�4����3b�����/
+��r���I����5�1��Y�[���i�q'��!{:6Ա��64���4����$���
����.1R�+hܙ��iY��r������]V
�L������	bp�y> w��g�`��j�czӺ1F�e�G�'l�ĺ53�3�+�I�\0���ǀ�,L"ןн16Bv�s_��_2���<h����7��<�.a���T������b��*r\�}����ѿb��9�K�J�Q�5��>��`m����}ڻa��l��i���CM^����xF�_8N���<�̅��;��Gt<��ݷ���3:�QD��0�l�	B�5ˆ�Y�l:P��&/�t�=b���;���=:�%�l�/�%�+�M<�P���1�"��0�~���FHn!k��e�LmL(���v
V�QY���z�8k�o��8`�a��h8`���Y�&f�~���:��y���k6���
�8`�c���'n�q������c�c�uk�hq�@fCO��Cװ�
z�
=5�8
(u#h���4���K�$09��	&�,��1���@��ט�ƜgC@��[���-�e���.q����1�c���<x��>d<����.\L-�d��(P�@1�b���0�8q֓��zVz����	0`$�H��#F�`Բ���׭'/i��l�	V�`$�H��#F���7�|��gC��׭7�
��]�WEr��f�4�R��u6��Ax�S����۞ux�b������Y�V��k�b��(PĨe�#��73
��$H���'�6i�(V�X�"\0�F�iͶ;#yI~�'��@ƚ
=�d�f���'P�<M�A*P�@�����%���@��
$+��@����5=f5z�
+P�@���b$/���HV I��
=	*P�@��
a���(V�X��#yI~�'��@��
$+����
+P�@��
+P�@��Փ�xI�HB���'��@�b�*P����٪p�
F*�`���:�u��X�`B�
=�H#�T0R�H#P��H#
�40�N�>����7�f�Lz�T��� �M�L~���Fi`���z&/��+
�4�V#��l�	Fi`���F�.������6���z��Vf���Fi`���F X���40�Hk{�f�@O��J�l50�H#
��dõ�H#�l�FZ��6�%
�4��J�l50�H#
�40�H#����40��b�KXi`� *z��F`����40�H#
��:���\7xI+�t�ұ'���5�pC�jH@M�jJS|Nx���eA]w���K��:�0v0�H#��eõ�H#�t0�H��n^�J+�t�I#�t0�H#X�l�F:�`���,�/�`���V:����F�����t0�H#|����SX�V:X�`�cO:�`���F:�`���F:�`���~�^�J+%
q.z�ip�[�м=7"�&R�H#��3Z�V:X�`2�q���4����IC02���qaF�n�m�����#�02��#�02��#�02���x�ゕVXؓF`d��FA=��H02��#��=.�d��VX����#�02��#�02��#�{\x�+��2�'��
�#z��F`d��F`d���M^��	VXؓF`d��손�`C
"� Bi��F�:�
^��
=���02��#�L02��#hD�4�N3h���d��	V&X�ؓ	F&�`d��	F&�`!.z��	F��%��!gCO�2�'�iQ�	F&�`d��	F&�`d��	F��%f�	V&X�`ebO&!�Ά�`d��	F&�`d��	F&�����K&XAB̆�ؓ	F&�`d��l��`d��	F&�����K&XA�h(�������'�`d��	F&�`d��	F�<�
^2��+�L��#�L02��#���H'u����^7��,����+{���#�,0���#�,0���#����9�d��VXY�T�l�	F�K4���o0��ob������y�9�d��VXYؓF��'Y`d��FY`d��F��%��VXY`eaOY`d��l�	FY`d��FY����KXY`e���=ARΆ�`d��FY`d��FY`d�s��%�,����ž,0���#�,0���#�)��������떼$?�8M�T�F�iͤ�gb��eC�����y�e8��=��FO�������tz:=�k9=�N��G�c��p<�
z=��AϠg�3�Y�Y�Y�V�G�G�G�G���%��x�[�����������������ٸV�G�G�G�G���%iΎ�ӳӳӳӳ�s�s�s�s�sp�A�A�A�A�A��K,��w�s�s�s�s�s�s�s�s�sq�E�E�E�E�E�u��b�==�
2dG��hZ9�#gu�h���E�d�:�tG��dѺ��$��N"��Hs�™�
O-;�DK�g���7�%:��N� =���-�䋊��E��V��=	_���a!60p�� Hv�d <9zT��w���/
n�1>N�Z�
���	�1��%�3/��q�Ϣ��2$���kF��q��x�L���ʌH.�+I�B�ә'"3c�
!l!�4��Q4n���8*j���kA`3�Q�*��èP��.s�@qse��y�7g�h��%�2\f��4,w@i�H���
2Up�p݂�X��#8R���nk�qp^F2�@������*���t$14N\�bN,�XQGXsCE�Ӹ�K��Ca6��Tv�_�V�胎Dlh��=
��Ki�B$W0�7T�r'7���N��}Ͱ���0\�*t�H&w'�|��y9�y�97�Eё���W#zv�`��
1�c]�]^�+�����ۼ�ΐ�n�q��:�4�y�G�A��@e��Š.��։��\���t�ߚ�q#[	�&9�Fn�*t
�=�,�=ȯ�z8đq;yBnWv��pF��4B�NF�э�P��KC�+�+	z�nN����p2Ď55��B�$�
u��F�fՕp;����U����N"���dyG�q�}�'��ZT�C٦�o���tj"�d��l���&EӕN�!�
���%��h�J	0nԐ7�)���A�Iw%R���}�qr��Jh4�2m+Ǽ�v��BP��.-�\a=�1:xa�h��%�[pj
-	arXF�2e��TDh3�;v�1��l��[�����V���̑�Y-Ju �8�W�࢐�q%�fF��q�'c�Y2�5��_7�-Vw����-���7�C
����½�-7Ʌ+��l?��opb�s���~�y� �E�-'͘�C���n�f�|��0a�79`�I��vj�7	�l�!�/R!��r�8�@!١q��8@4ج.�!��Yg'd
D,�5\̑�k�2>��=�9�K��"�|	I-c�
q����u␐Qc�VV�F�nx����q��X���l!U�s!)DhN�H�:BA�42�F�l��"�5�~���N�K U�����;pY��Z��NAv����Q�S7��!��8��c\�K���QM��X�1Q�/��X�~	��Q��1T���{�&�%Ms��͑�m�-�7����1R�N���+I�BJ��A> �]��ޝucVq-�\bQ=�›6V�� =$�2e�� 8;u(F֯ Ji\x	��!,uA�Ŋv��d~��MzW��Up!k�<C�j�pl�qr�u&���J�H㞹v"����µn(���jr$h����r=*u��"P4%'kH%��ʡ�˂P�\�yp�m�	�����i��%F��d��o��Y]�m��������?Cd#�5�9U$�S�ԗ��=�@RA�3�e!�`��X�"�ZM�aAz65c1���MFqa��\��ҹ#�bмY!#ub��f���L���	SD�ָ�K��FaX%��Cn���
�RQ�����xjW7J)h9�rb*��l;���P`
�N���p4zG��)ʃ@��P���?ULh~s%ӿ1GNR�D��v����
�gD�3R-���fE�SH~B@���!��*���&�/5������|*6��c{\�^I��"U��� �P���EVA2�'�)HF��]a��wS)}�ڳ�
�vRќ�X'Z��������)���i��*�{\�^�E���5���y:J�U��V�}�라^WE� �y�s~����{� �3B1sA�7d��
!��"*K9�#Q���q�o�
T�(�M�é�0�Q�TH�N���x�-2����`�q�{
$C�6�Ò�6�W��ы��+`	�(@�I�dm봄�w��~�87��+�D�(D�F�©\s�Mm�h\bUÔj��©{
voQD'�5�:C�Zj���&�]1e,	ʲ�෇���9n�N�z���<�4�5
���,,��;2�B�g%T�}ͷ�p�^Z�)LB/����
I¼�P`�Y7�£ �R��7�MTƸ�K<T^��*����]����,��@-�8�ݍ�B'\D�֕]u���g�T�x�h/�
�1��$ <�
�v]R@ق�XMT�q��Pl��PM��5��R�O'>P6�h	��bR�E�9���56�T��
Y�{�"�V��Ň�h�AJ�AS�|)�G7yIED2<�Q)� ��&8n�1�޷���>)�$�T����I�:�E�&/qY,RF���o�cP�0�2[:��HK�Zd*��0�Nz�}�I~ƒU��������@���07�2�8�I%����P��8QS�1� ��Yv[���]9��a����Z��ܦt+L�D�/	���c�+V��¤3�h
�UH��7�!���8��u�8���%I.���d��_(�ł�FP�P��+�(<��7w�+OO22Pp\�E:�l��\6)�z
Y �~?�!�R�j�ϋ�7���]���\fPS�X(]	Y�R��R�z3&ԡ:en���1u�ξp�ؕ�HLlWL�
�{nF*�PxOm'|'�rCt%���W�SD0�M!ψg
�22:FeJ�+�|ˍ<F�����Q��^8|�3�RE��l0�*�eH|o�Z;‹k[K�%]�SEV��7yI(�#��g�47H�<���D��
����%^����ĨE*��8�K���4����dY� ��qa��)���䱽ߨ{uʐ
?5���B��}�8kh�d=�t�jGr&�k��o�-2��EK�H.*�?�H�tLI���EA/��?�&$S�TH�k܅�j�ߛ�eɐ@/��҄��-"8�$�Q�?�
��m��x��U� ���D�Bx�-�J���n�S�u�2�g>v�Խ��~�	���M,Y'���i]��JGX2��*�d1�.#J��u�N�z�N�Tf@V�J��)�R�D�K�c�u��k�ص��hKT�-��`�I*s�i@�(Z3Uk�}�L����>�o��Q�S�65/#�R�l��T�>$ɚ�o݈-�"4*J�yS��զ��L��u�̱z�c�C'�8faK�Ղ� 2y�c�KJ���:u�%���D ���䧸���]���
��l1�g�e�N<P�jT�Uŧ�KȌ"��S��W�*�,��sj2�[G�^P�"#�$�V��!7q,����`���g�M/�vh���՘�;�C�%֗D�X���6���eڡ�Bdج��
�Ռ���P��s']tBąh�G����`	b�Ç�9��d͵%�3�^}	b!�B���SY�%�EE���PIvzi�lDg)!i'����=�<�蒉1rG؇��-D�M:-_(H�8�셸���Խ:"@ �����X���b�ЄA4�Ϣ�?�;��K�����ړWS�:u&��t(�Up�-:�%�e[_�����Ɔ8.��ΨѸ�K�)`R �ў��%j"���J�t�M�YA�!��p�S��!^�#B�� �P)Zp���/��^���V��~H2��'��uK^�9X��e� ��
A)bP�hJ/Q��>����#T`V�����:u�&��CiL�r2�r�DE&P�8�xG�H~ٔAj�<��AݫK�"�*�D$4��S�aԭ8�ڍ�y%�mPDo�����9a���T���g�`l<�T(n�8�
G	{�����\�S�Z�N.33���)=�����퇓a	�:���ez顃��Xd.5n�ێE�%����J�v���l���[�[B�R��n��3~��5�B�M��R�c�޾J�)a��B)���V)�3�7;N݈��P�?��\Q��"���:�Y�[@5톩���q,u�$#�SZ~�e'�k�8Q>a�P̡CbD:C)E9o�8D��>��Խ��H�er~�0�����f��A�eHYX��e*#�S�f����/u�&��0WN��-�$�Z�FxU㸔�HQ<q�v�*�u�Nݫ
�V�D0�Q9�H�6)�6d�n���u;�W6E���{ݨ{-���Di��Q�|��&Zv���E0&��D?<����r�^ue&�_N�Y����Y2�R4��w�;���#�<d�qlP��]��M��x?@
�J�P~���T�qb����0�L�ԟ��%{\��ʡ����0'Z��Dž@֎���@�ӳ����Ub\�bF����rL��!J� �
H�M�!��X�_�8ꕶsz �Ve,�RR"��?]	��|�Sq�gv�/!��6ȶ8JVF�}N�tU�h�u�1T���&�����ѡ6�q�K���̥��1���h��U��Fj"��Dz.%���1M�m?!�S�Sj����I8H���UOEA�{huzw��@���<e�)Ѹ�v1L6̖�C���P��z9j�Rn�����N8��!d�%���6�a
�F���Bkhr$����)1/�)��N�CՖd\��H��o�#�hy0�29rP;�ni���E��G$+sQ%t�)*���UU�}ХȄ(*�m�*]x��5��:����m!-����Y�Ç���=	���p��!QL��T�ž_�^M�7tGCp�"jά�NW`�M�q1~�A�nÕy����ti�hR CJ��v�=��>�g [���H_��<�kv\�)�ă�����epń���ܢd���������
Niz{~�{��m�� Q^5�C+C,�N]x���r}�}@6�. sH�y���q!J�������A3q��b�0�.h��]*Z���&/�����Z��ʸ�,����Isܨk[���%�T�9N���ͫy
q��	iJ�NZq�Z1Q��V6U�FAᮑ��f�w>; �ϸ{*�/R���]��R�$�7%U�{�gL�)S�
�R_��
��ѕ2��T����*�K]G
����~_�ꝴ�w=mP�d+]��x"!Y`�;㆐���-��@G4��$�R}	&�vԽ��g�Qt%��LW�Ȫ� $�“�*u�H!�ߋ�Ke�_)��}�h��0��:�-��vU{��C�V�dM����E�3¿R�ɔ~WO.�*g��d��Y�%&��P�Z�oF��Q3Tq^~l)^6�2@��W�(�*�WR��^�yTP�j�4X(�Q�^j�:8�s���l+��"=rmR�����R��4�	�����ȯ)�����S��&"eI���K�{��W�$PCzX#B'k
�\�!����*�i���ǹ��{-ʿq�֖H�"v�
�C� ���PufUG�_�N8�`���iש{u%)Lp�*K�黢*a��B0�rR ��:�b$4(�[w��{�*�H���k����D�T�Ķ�ўի@�
�B��w�u�5�X�Q/��Օ�I�e���,DG��<\��w�WǮ�<���c&nz�ЊC\��$	S���Nj5�J����'�:�[���ߨ{����%
rDP�oc�/���t��P�62GW��n�$(M�cDžAݫ�+(*U�n�����tL�%檜���j"���Y�����*��S�{5��2d�1`*Q`���n��V��L�����{դI�u��
v'T�*�[�^2�t��B�����'oz1O�|�H��I���U���~���8�S��7�v\l�.�W�%^�zONSrO%WlWJ��<��F�#�#(��g݀�Q`B�)�V,���Ћ�8h���Խ�R�̋��;.޺"���~�:H���V��q�o򒘛�j�سrm�/�w�D,�PE=j2`z�T���+��	o����%���F��*�t��&B�~R=t:����$6mu�*<�1u��iC�D�)�+���%x�4�WB����$LL�r���3�P�뒌��B=tQ�-
ʻK��$�C�49�
�Me�J讝սV����	�SQ��bN�)|H HV�Z���җs�7�^
%6��Q"Uvuxu eVn�վ�j�}��F� 
�!ۮ7
�^�Tq%
z�A���;���Ô��He��Mf�����Lqn�v=LP�j��c&�ȕ*T��WՁT�R͠D��*�~�M�<Ƀ�^P�Z��TR&�zc��؊)�����*������h�+�Ʈ7
սJQ�X����%8����Hq$���P���k�I���_��/Qx}H)��0xf抶�g	ݜ*������'s�;ϩ��yY1����Y���wT�e,���~?��P�\D^����oԽ�}�%AȦ��k�c�hB��[�В��C7���,䐾S�y�������nꠙ�i�7Me���
T`*Ѥ0FeZ�����RZ=nu)�-�{a`�.Վ�w�UЖ$P�uAݫ���ߔwکP�t�
b1>M�"�3b�@����Eo��x���ګ�M5�z����Z�.���F�%�
���������;qD�H\�?����A�Ӹr}Dm:�<z�UqJ� �P��5�0Cb㊗l��$ǯT6;���2���%�Xئ���JRN{F�+�,����`�Y�0WѶ�HH�T"iˠ�T����+�������|�)z����EG�B~Ȥߩ�U�DX�.A�J9G�T��j0��z��P%����� J��t�Mdy)�ʥJ��=.��1\O�F@b���MW��28�C`)��v�9L�x��u����u�<d�U�!��R{�<�@L�N��;U�)2c��Φ�����-�U�C��W�����]j$6����IUAǵT�<6ߩԽ��Ҡ���ȗ
/Hܻ��)���ZWfV�"������T#El��R�j��1UWu��׈�Ego\ڗ��Cȇ�LQ_����D��w�+KMpeeT��*ZY���/U��At������I���3OFi_�_&H:�������D�|���u�Q��C"�j�.��m��3��o�I)��x*���%w�6ymj&�W
gʣ��P�<OVMy������^_)p"V]���s��*ݞ�mSU��5���{e����޳���(FBT���|)6語"����z��~�Y5՗�lJ~�h0����l��T�^�VKF
��(W�ܘI�����
���`ȱJ"���6��6J�AT�(�,4Ԛ
e�b���*u�����1ya�%ur-�*A�vݪ�m���.E�~����%Z���K������&S6d���
���0�KQ��i�|��*u��`�hU}����K�T�|l�W����k��9�%���q�%��qBM�#�J��
�^x��:�Q���9#%#u�j��W��K_��U;KE�q���>>��,�D�W�_;ɶ����J�H�h��0FR���I<*=+��U�ī��`)(��ګ{\�^M���Qbrl�	�^�K��z��JSav�
F�8��H�b*��p�$���վ�'�BI�٩�ӵ�$X��qM�������8�^��2�RW,�k�
��*=�!��v�\�uA���M*�S@~��%��@����E7T�o�@7����ĭ8�*��*����}������^q�����PKEePQy%jN�Lpip/_vendor/chardet/jpcntx.py�\mS�H��ί�8��J/{󲳱��1�p8:D��ָ�XIm���[oOe����Lč�
�R�de>�dVJ�ٳ����g������ձ����ObK�g;����mu[��Z5�RT�x�o�^��ݦ��Eߴb��ʺs��`]O몯T����r�ܗ�h���S�?+�n^ܗlت�;���oZ�E
,.����eїq�hFOU�z��G5ժ�G{B~���j����p���m'.ˮl?��������f�����}���h?��j}�Vwb_(	{�7��_5�[�Rպ�i��Qkmٖ��e���N<61/jі����+E�mZ��YT�G}hS/�r��}��u�ዳ7�U�)Iŋ�.[����ͺ��ί�yYw�(:q��u+�ԉ��	"N5���w���y=�Dz���H��F����n�k��5�u�=%�X+k��y0�Z�BT�v�t�>��B��M)6]�ܬ#5�j+~>�~y��Z��?^^�]��N�U�Vg���H�ݽ��B�U�E�?*����/�^��?��:�~��?9�>;��'��P\^^��yux).�\^�_qU�P�V攒���jȻFirQ�E�����*�vJ��B����2��D�\��l�n�[�^Յ�����n�H<��ŽB�Ⱥj�o�@??�D.U����V&�R�O���d�4m$~h�^7}}��Ɖ��Lc)ě+ud�?q|��3I����������-�B$��Uъ��צ��j5��Z�M�����(�(i�b��R��-�[壵�ժ7�e�=*���ۦ}��>9R#j�-��bwg7��+����%c��r/��M�L}�����K�IͷT}����Ԝ�r�	�܌�����$�����HƎdNY��}Y�l�L�[��[�����
�e��ۮ#7��ɍƠ/h
�C����2�[�[;�N��51�I�v�ܼ�Q��k��
J����im�9�i�^9�t�t�����c1�Gr7Cq!�Y�J�����1FI���Pb���5I�a�^�t��런��"M�ٟ����v�/�Fa���c��-a�<Oz��7�4���q��!�+s,�^�߭��_쐘1B'��#z���7��i`Pr&��@��'";^�{�$~Q��1sHHc e5�9t�yX/�v�h���N�0����R'N:��3N�0j#�FShPs�7���
*��jGI���iA5���"��<hr�$"��C6I��&^'�>�8�K��`RL�O~27���U�,��)�����4J�$Ӓ�S�����T���?�G�2}�L�	?aB�U'���K�-�:I�i��s�s�y��4"��~����#S��Im��C04'u�L+��Dz�2�8+q���>�CK䄏t@ɸFIG��G`�L"��H<� .XC��$�(	�^�U�E0�QQ�g5�y�?�fm�0�(Y�'�4�]=s�ӅM�NqT}ۆ��;�=�4JY�$Bd�<A@�t�%Q#��-D��\��Q�I�<�����!�R�Lے��c+bmB��%��̉�Y�>Ǿ%Pme��s�S
�z��Ɉ�B(���#�s��y]�������)P�=�� >�ز!��_�&�^�E29�Q;�tG�6��iG���)�<�'�{��@��I����­]�����w�({B���)%%$���C,�Foȯ3�q��)l���ǿ�},6�'�A#];�2�Q���P(dLo1Me��`��Ror&�0�{��14�n�y/̂��3Ǔ��|z��x8��!��y%�	+�#$u�Ҙ��:g�PN�����"m�R�9��ydJ���\�anDT��Kz���fJ�Ga�
�
_|�E#�xiX��<�{%>M J? f��E���R����dU���5�xt�8�x'��q,�@$.}F��I�O�a�L����	t�C����C�MD~8��O���t��td����)�5�����(e��8���!�����cKF��I���s(�$2\�"R�tp��v�=t8Τ�7�N�ӯ�*@�"����k|�ǍK����#��T��XHy�3�-9$ʆ���C�VFc�����i
�\O)bSn
��Q)����A3��.�:�@���I����2��J��q��Ұ�3�`x~�K�+�ḋIPs��A�	�
$���~h/�y-s"��A�N��J[��1�`T8�	!��Q�
ó�ؑ~��xF&�T2̣,"��>��4��fQ8�<~����q�w´]`�Lԟ�&����c,.(���;"��`xy��J�����1
�B=��<��1">Sh��i�e�<�E�G�P���0!r)ڋ��8����$a�=�FXzdP:��8
�[/�3?�d���<�Q�g�`h��{^�ljX�mt�)� �Ԅ�y2��ќ�@��y�(�㓲�A�,ϗHi�|J�_z����/�)��G�s
^��%r��
9*��މ���J��%sbcW��
"t286L�X�T�1����z�2�™��@�L4EW�@��3&�$����&˹��a)�\
��{��˒��&P�j
�r����'���n�m�)3~�iH��)�S&����8��"chz*��@�p"|�`�Fa`���M��ș���G�⌄��I��e$=0xb7�o��`\P����}���w9:f�������NG���j��6	���*Sx��_��KR�(Y9�zQ�f���5�͔�g4�\���ti�2q�*(�'z��,�L��I�W��)
M�M9�Yo��O���׸z�<*�dL'�&�TdHdD�6!��Q�w�@dU��GM�H�3p&�*VEBR��q�28A"���(zC{6A&(�@~�ܱ�IZ���χ�b��{&��k�B�4�74���o(�~�㈜/��c'����4NT󈞐���=y�A�ɖ2�DS ��l
	P��ɗ�
%��lH��$BAH�	���3�i���^�-AU�-|�_b��{T5���S.�h[�GT��*����L*t�+�w�{&�lP��w=�i�8�˃�7pa!�K�6$S[����}O<��bVk@)0�*�h�I\�2M�P`^v'b왰�;�5{�,֞��@w��T��kI���$�aÈ,a�8k��3�i>
�s[t��W��AL#�5Jfrx12�7å���E�E�]i��z���F�|4�����M0��8B}��](Og�OF-X�����p(q����q�;��j�j�xt�,#ƌ=[d�rɩ�B
�q��q[&�����s�ta���+{����=��+% |�R^���z¯�$]p��Fh��q�uBR
����X�v`T�AG��F�e�J�9;����צ.���i�k�q�v��	qx���3)���ny��q��z��~���\�ŠsΓ��
s�W�k�d��C?�p�<Y��@|GOt¨�믉����]�̤���r��N	
�b��Q���6(q�� �;$�v*@�O�����K�%����OyL<��q��ӂNWM�Υ�D�х��@�ԐT�Q�+gO�%�>��%F�?�̐F�%dD�;��yx-4�Q�Pƣញ�Sx��Ġ���&p!ؘ�#,�
g\b�9��6����|]t����/�+�sn�u�~�n������{��������������[�9����z�����Ⱦ4����߼x9�<~5�~yy|���suVƱ9����ι��g���T���َ9�(�b6�ꪟ�v�r�t����o�b=k˵�t����:1늻�u9}�.˅c�}��g�y�Y���n����&M����l�P�&��g��=Z�=��5�B<�=�'C}�g�!F1o6ʬm�G+��V	kw4DU�� ���Oh�]�^��=1@��Z
�q�؛�盶�w�l�K�$f��;5�fR�f�mU
-�J∍�P
m��ꇺy+���O�~�>�����v�ϴl�I��K-�~�Qr޷�Ǫ�tF\&���>`�\�z�ʤZ��vSF��^�P��h� �FQ/�%�zc��^�,k���H��$�,��z"��Y׷�~�ufT� �,C��a��-�M[�0�ɔ
n�ɔ��X�~X�\Df�nJ�G�)J��0O5�+��;�37fw N4��$$��5�����FòW�}0��L�� �bm���^b6�^����GIe�*��@��K�|�4�yV��֯�40�~��h�P�]$�1~g4J��O�w�>S�E�N�v�:wŇR�m�K/*������Ѭ⾪o�(���\k�$�����F^u�m>��l�M�49/?
{Ox�o���]T���mƙ"#�l��-{�y�����J��H���ձ�}���R��Ƕyɓ�QB%���S44-�{�'V����=���w���-�c��*�dC�����(O�D�9��d���M[���"ɻ��w�:x��z?��m�0��o�ʺ�ܮf��/�A���65M�3lh�V���j�p82���_6��;j**��{�z+6��C�~�,u�?�=o�)'Ӧ)r�h���e�{�ù�`c`s��0ԑ��0>�M�/#ee��^�xz5�I��n�'�Íb�݉1##�ށ�H,c5����.�4���zyzr=S}e��OE�j���{<	6���e�n�?3i�L��RT���	r1=��p�(�_��˪u>�V�y8~�؍�Z����o�ߜ�?��zO�?9�ɐ�w�(�����O?k��<��&M�z�L0��"�a�1[������+J
�cٞrYNҩ4�^��-�BI���U��G���
��x�X�b�Δc�I��o�~��r���{��c��p�'ǟ��r��
}��g�gE�RS��i56�g���<��
ϝPKEePQ�h�� '2)pip/_vendor/chardet/langbulgarianmodel.py�Z]O�H}��(Mk�ݒ�q���л43hi@@k�O�$Xc��t�����)�-�а�>�I\U��s���͛�����Sqr|pxzy(>���C�}�W�Z���]�F�8�Zą���+N���4�Ge��y�s����q�1$����$[�\d���щ���,��R3�q�x̗Y^=@�8��z|���q�Xi욊rҵ|���R�;x/�l6����;b?I��-ą.t�M/jO�����|W��È���wq'wy� > ,E�����>K���$�ɣ��X�͵Ev[~���1[�y��\/�V"J������"�}��U��;���Ca8���8���_t�sxs��I�9�O�N-�B,i���L��5q�A}��G�c̓�o:/0"Ԏ4��}�X��Jh.I�=@?��ȍ�N/�Ӆ��J�=��(��ߑV�F�U�oW�
X+~;����˕�?�*~ۿ��?���k�4f�ZS��D
.�ʣ�|p(�|xq�+$�?�_}%�G�W�������B���/'��������Z���>��o��!�]FqRԮExL�>��湎�Q"B�,��$K�*!b	�(�[�f�/��1r�׉.���H���/����!���Q|�GI���%-���@I|�a ��r���qx��-����x�W�U���}�Gs$OQ'ªXEI�(�.�A��@�P�P������0��:�����\�i5����z�-W�\Eu�V��7�"�}��E%��D�J��	u�\�Xy�$z�jAIO��U�R��D�*�{�J5��V�]l)i���rT0T�hБ�p/]=��_'#RT��Aߢ$^x�	 ����o����Q�w!��j�oR#IM��&5��(�{XMX������g���I�wqK<�L%��'X;³�Ԍ��%LO1E"#_��`���S���A4�5�	,M �$X�����
�g��u�jB�5P-ve�fBh`���=#�b���}upV��!4�PCV��W�(p��H�
�X0���{�{V���)p�ހˁBI,'�RI,�X���:�u
��)�Su����W
"
"
"
"!h'�!�B��!�x�'և�JM5X*�T`��WL����w�>x�#� �J���R�%��HS#|a���
��	!�(H���&��9��JG�0%)�P��$߁Np��
����)�H-H
,	RJ;E7�+�Jp&�P�`�
������	
�
+N@�r�>A�����~L�#�l7uFjn��m�lv�?��w�v�i�ImdC�1]��b�L�2�U�K�[��Vj���+M�.�;����R�&N7j:QՕfu?Xw�]�7E�$!U��+��BTg]��Jl��˛��͍橹!�ys[�Ns�?��)knuW�	A&�|��8D��+��u��_0~�8D���s���,�);����N0�S��5f�(�;jVK���6��`'�7-�$J�j��-?|�RG����4�j�[V��@�i�vG��>\�^��e�Lw�.�^|��LxA�%���}�jM��%5�~��m.�h��G0̼Z�I Uѫ�@"P[��䁱\�.;��55ā|)�A�>�+j��y�Ǥ��ڔ>gF5�l[r��_1��H�u"����ײ��u����~2�&��[p�����lU}�n��\s/}�s��@:�~0�Q{jP�kj�t��kւ�4l,K6�T�v�Uc;��[����s����#A�T�Q�d�}y6�W�F�+C=�A�
 P��_2f��:�\��Nl:!Ȧݾ��+o�څv�W2����~�0;�]��f'�t����׊�6]�vۍ���g�A�6�Tc�G����#>~��un���0��4��d���_�L���a� 1;�_�v͞�|{�t�w�u�fױ���7;��D��f�S�9�[���
���L��ڳ^K��:��`�)�}�3_1{�(p\�lm���c?�t��<y!�,��ʷ�~�')fʳv9Y�"��]km~�,Z�l���O1k��
Έ��p`O��d�:����mlX���vKm��r�$5(��M�5�Oھ�'4y`{�9����	���A��Dw���I2���r�[��֩��H�"�f�2�����ڀ��v�� p�r��@��o�����Sn��P����<�]�n�<
AoG��Ȩ��v[�?=~�Rl��#xP[m���Xu���bc�rD��"C@�L�U��-W�k���Ƭ
ٸ�V��Y���f}���f��6��͵'\����(t�|�˨�8]<���-��'`)�C���u`l{o׭FYw$["�*��a��Ife���!��6���ٝ�/[6ۙ؊�� ���!O�du/��'�-���g��F�[��"p;P���}�M�5����v��ɰ5��o����3��8�ݟ�A����R��
y�˗o�U?+^��Awt�%�}A7�}�m���&�����V&��EH�V��'9��>xgj�L�U��A��i���?v��JC�<�<�[+�Q����3�m�/�I|N��O_��o�CU�
��e_&��`��Lw�{��ޛ7M��̻	���xK��^��uFox]?D˷{b�>�-�M���2���X��ji����Qr�̊�^������`g6��2�U�k������~���9�EI�}����u=hL�t|y�a:�>����\Ew4���Q����y��^i{�'�����`��T�PKEePQ��V�F(pip/_vendor/chardet/langcyrillicmodel.py�\mO�:��_a]�j+���yi�(zQyPU���L��C2�������$����0e�.� rI�������0�Ɔ��}����wv��vه��Ol�솷��obv�'�I��N6�YR���?�l��.M&Q��l2K�d�lzj�~��	F��g�<�Yv�J�N��e1�污6����<˫(f'Y^�O�8*�)���4���r�5��T7%{���xN�M�=��S�-�i\��xZ{���e�\���św�a�0ʿ��dv�'��-��%+3vr_�di�?B5K.�(���]�q̊��޳��M����4)j�Dɢt��,��l�\�S�]:�;du緅��ǣ�� .`)��qoN�.g���I�1�
6���FGj�9ka{�W�}���i��q^���M�fk4��~�d?�9��o`�=�!�����tʒ�R{���
����]�쮈��f>4@�}�?���9�>�ʾl��n�}YDw��ZSr;�^�QZ��p(8�=�#�?��%�Ϗv�����)�f'ۧ�;��O���ӓ��M���X����
r�+����i\Fɬ�]���0p6e7�i��	�"��~�β��Ct@߳䊥Y�y�}��B�ί�O6}
E�Rp��{�T�Ͳ,�ه�(I�pc����}>CϢ�{�#IeÃ�O�����Lz}]DŽ�xF�v�фpt��	�>�.g�;��^Lp���.�qq�ٿ�kO������<g��Ը��&��H�$5�\[�&��[�~o��h�!�m싐�	4�!dh�r������B1,İ�
0l��`� \hMX[Æ2�L��CfeC�FIMu>D5���?�����b�K�
1�%#�sX5�����f�ؚ!�Ò1��C|KƘy�c89��s4��Ps�
�Z>�Ԍ��r�qqqqqqq1@�������������1�H�K�K��$�H�t�!�@u��T����j�߂�đ|��K$_"�ɗH�D�%�/�|��+,��K�X�F\�H��[0������G�`5�Ì�9C� *5���L�(%�T�\�04Ċ!&1�� �oRU
��P�1�N0���1���a
��E�x��VCM@b4�f�8b��@6��5~�4�
�[�RsŽ7��#I��BH/����Td�ЪD��-������-�)��u]>T���wP��r�54;=:q�Y�h�⧱�>�,⩇hO�]��$%b#�#�#8�	V�7�Ȓ��$
_��_^���z�9��џ����F�������d^Hf�$�W�/@s?�G�Pq���R�d�?�—M�������*�Q��R�պ6H�ԵE,G�ELG%6���Q��Qɐ�TT�
Ux&W(��j���VE�]ꨊu�+
�qHU��h.qQ�W�<�/�=0�>�0k�����M��	�d��a�1
Q�5�6Q�6�E�p
�>q�́�H�#֪x����┰��������4���!~^��_~��˓��_`�,�6�!�]J�
j��Y�X��.N'q��@�U�%�!�{���`���/��2�f��t?�qۼU��M�x�4����{l��M�9Ɵ�E�Qz]�K��`���o�4�p�p���0upR)���沲��,��C�|ţ��e�bd��X�#�(t�2��u[ V���V�@<%��:#�7�������+f���9�4���+0��D��G��b�mz��q(��^tԙ���Uc7������W��~
HGO��
G��p .�M�EӣjA4֬h��(��Yt4�Z��JH\1�jTyWg��?����QG��\�\���g���ύ,��i�׸Xx3g�O�{��I�Bٵdk�lЯ��y�j�պItb`Vd��@Z�mt�UgtX�ǁ^��jN0��>�F���%T^Dc�ӂ��G�L��Uƃ��4�x0,x��Nl���]���
kȂlW�0XO#Q�ua��ک�P����F㺐hs���u�_Ń��}�?�2�T�P�����S1X�SՑ��@�o�b�S�O,O��z��Y+ջB5��z:'*�m
u�U<�`
�*$�5�}��@�g�]X�v3�ΐQ}A�R�Uu,PT�:5u��7�~ˉ[�s���:_��t�trߴ�zz׶(4jDꝩY�����#`�@u��di��[l(��piZ�
KL�dO�̄'���4"���Ɓ�M<x6a��5C��a�����V�Gb�i��›��Z\���D��q�ʂ��l�����*���[�G�����wS��_�M�uAn�y�O,&�Hc�:���780����E�7Hy�;�����0�`c�";
�L�)���PW?��R��.znԾ�ۉ>:<��]��+ĭ�zwAƌN��'ZV��j_2�d�f�^��,t�q�1�N���ޝ�s�)
$�13c��
�fe����t}v_����u��:�aU2��5p`3�;�.'���^ͧ���ȫ�qq-tWkn]���]�L�eO��"u�ӳt7�&'u#b�@��6ۨ'�q���LX7�}5B�@��J�
m���s#�?���~�r�逹{2��'�������@�]W��,�kc�˕�QϴxW�-O9�p�^6�e$+��}�&��}�=z�pdAXsv�[h����Wlzi-�FW�AV����-���`q.������%2����B��P�O$�Ƴ�=��۞�I�ઋ~@+~��޳�}��	����;|���qw�_)x�y��d��o$��c�U�Z�ޱo��W@^���)}�]e��	��*��~�L���<+���E��@�o���-�J�[�/��^����e�ًfE�+󊸼H��7~��R����^UF��ƄW��?�R�
��M��߅�>�a�4�Q�%��}P���h������?;~;�����[K~�
�������/oG��R�}�98[�?��Q~���\�����PKEePQ���)j	�1%pip/_vendor/chardet/langgreekmodel.py�Zmo�8��_1�b�P�"e�v���f�n�i$)�~
�I�*�O�������"�u-���H&9��<3҆^��w��O������ޝ��I=s_8/��^�Yޅq�A�f�!�GE>?<��p�IJ�(qNs��qj��8�CH�.��(Y���[�;01�T��<X

6L��e�L�IZ��S�bA7���*H%�r
U�9�:xMl6��s��G]ȹ]�L�_Ţ�� ��4�Y��W��=�}�/tFwi�@o�'t���TE�M�k��m*e�m����:Y�<�)�0+�ADNA��-I!��,�۵�Z��#��E����?�H'"���^�"�7竛(�C�$��8d��}ٽb�HrYBG	�vߒ1.ui��;��V!��X�
ri?�����a�"D#�%w:)P�.(��{p���G��Ze�v�@�\�t|����+�?�L��/.�O�>��\0�QįD
�H���4��5��Ë�? ����곴�������.h��/��>��_�Nj����K!j�%�]$7��!��a���Fx3-�>�*��Q`�,�O�a��w��Q�����$w�1
�;ȾVt����"��;.�&�!���Qx�(IR��%Y.�~؇����0�cD/��G���oYT^8���^�����Ȃ<Y��lDњ�Ȥ�$�!od��4�ŷ�@��;�ۅ�Wi\t�{��n��j���*(S��n oDA*8{L�E!���J�I�j��Η�3���H�9'@�'����<���H��%��^9��ݮ�:��@����&a�����4	�%w�k�0~i
M��<m��L�)����.�cx�Np�`�c>ƙ�+�yMf�b�bhWN�� ���=4��Y3���@���lP��vѤF��B
�}�f�6��.�+�w�5�@|ܕ
��)�Jgd�0�Γv�#a&�|:̬��ͼ�se22�
:�o4A?���W#�	�'�ظ�`������ Lg�jA�#).sG~�R�M#�I*F2Jh����#R>�ɜ�p�.�o,�&@�O��3h���3�g%7X�1�0́,sCN%�UNÝ˩hLBZZO���>*`�!iЙ�&��h\j���g��M$�T>i(���׎��=?�ς�_�P9�.H���i���7��E�y	_����L�}%��`��+�o���1��l�çc�Ʊ
G��3�b8�E執����Nj8w�30�F�_��8"9	��TY)=�y�0H<\�u���5�^�x��q�
�k�|+ݍJ����S�F��7J��h���
]x��z�]�����K�`���D�������l�%j=Pkb=5]Qx���D�3�r�3��+�X������A;S���X�+�(�:=���gDk<K�Ң�<W�nG�ί�H���Պ��J�٬Bu��5�,p��������7Ƹ�ë6DEz6�O���M5Q�g%���w�>+���c�^�y��:�5�+���s����Bw&*6��'ZP�^����$���Y^H
�͚�מ��ԫ��]�uu����<��"��pmlcE��^�z���3���e�{qm
k�sm�散��^��F�_���i5��8�5z�H?�7򆉺����bV\C�Ҙ��󼢢Pz��tՃz���N�p�5f����O�uc:��-P�����b��XS��LT�Q�j�=mNcA�]���+a�5�*j���i���ɩI�;Է8�z-Q�f�B=��_���Pހ�0����B�}���nDA��f�@�$k�z8���aX˂�L��0>�k(}׬��Cv�8:�z�R��0-��u-$�Q����Kk�DuJW��ÈjU٤�f+^��0������^^e��~��yn�=���BW=�g�#�����>�.'C��d��M���5t1W�
=�-��f�{����Z�[��.���A����{.���[�$�Lt+��fјkP���p���&��e����:j�	�2�k�;�`Sd�t;t�:vgV����	�ʃM޷��A�����qy�� v�h���a�pп�t�:�&�{�B{����VYtG��C}�Ɓ���kY`ov������@6gA�ww�y-���ɦ���/#��5O���+�[s�9ݎ:���W�ޒ��n<1�0*��l��]}�
�ʛ43�Iw�eA_*���_y��^;ի�Ż	�{	�t�^�^�z�G}���R`)�5^ȗЕ��7��<��2��2�B���u�=�z;��|���E�嵈��+�ב�s�b�Qe­��D~�_���Ndz7�_��:W��{Y��u��8��ֶ�%����0m�<fo�}��7PKEePQ�f��	Q,&pip/_vendor/chardet/langhebrewmodel.py�Z[O�H~��8��Zr3�rZ�U�C7Zn
 �O�I
����i:;���߱�|�
�a)UlW�:�;�*#�P�Gǃ�g�t~v2�����ɿ�����n�]���;�EnD�\�s��w�0���	#�D�j!�Az`d�|7vA�E�T^0U!�װ����}	|��c�i��� ���h*'Vz�'<�̝P��t��1�|$iYm��%?���ѐi#�H�?�$�~�0�F��ǣ݅��k�{
��DS��8��y��	�������&6Yѳ��3�჊�t������:�m�*EQ��B��4f4v|
�čR��cL�?�#��%���s��؆M��%�\���U���U׳�c�;V~�ȉh�c�sn�Sr�=��a�|&�b�esp`��Ȥ-8�З����#���#@�Ƀk�l�A�	rM'�	�g87`E_��h�Ǚg�h�����-�/��}8�_�~�Z�
�����2�\0�V���s�����V����n�3�ӳ���
�^
�O������yH�w�뫛���Tfb6f���&~˗�D
9����{#�&��Tp�X!�&� J��|��S�/���L�#�Al�k�"v��K�_4>0�-@�?<���O�G�>�� 4�8�b&��c�%��>	�Dw7i����
K��e�}��h�� g���@�E3���4	�_P��/�
�Y�~�	�8�ծ��x�ɰ}D��|��3Ϝ4D�K�*1*l���d�<"��c|��?	^�O@��R8#���%��2���s�<x�ȸ?��#D�pt{5�~G�k���
̘��V�=<bm���3�ll�-��Hf#��z3;EC��I=a�!�]�W;D�s�k
!�y�kzP��*ղ:��nӸvMaIt�趰ݲqm7�i/д!�,�Z,���3�A#,H�1-�;�����K�t��Ӂ$�3� k1;\��$+�ŵ
6�F4��!$bJH��CR��b��A?D�)!I�zz(lH�Fb�P��-V�6z�db�33��3X� �MI�Ĥ�x$�c��!�1��� 394
��'��5ǢĤma!���y�m�hl�
� X_�ع<	"lH�b3���:PB��B�t��yz�� �`&�V	�����y�G��L�N�P0�د`�[��X�
+�#b$@�'�3�j�aC,Ml �̠�+�H���B�"����u�h0>re�������[F���)��#0�~���d����z݃�e��y�F������
������:���<�'�Ulk
L[����mp<܏��_GW_�I��L�����t��#B���d�H����Ȥ�E�˫��cJ�^�&�H9gk���>R|��]D`'������l�B��YW�[�A�����[�B&Y��4�r�+���HY��0e��*��� ���
4Iz�Hd[X:�R�R�D�)��z��	�o���H��ff��
�Hh���^��h��a-k�H��K�kbb�@�lV��*�&�l�rM\�v��-r!�H۴�q �j�{#�vD}6����u� ��� S�!��2�"��	�ē�����׭���*�����*��f�S�'� � ('Q-Y�W���{a�N��r�U�t.��
r��β	���^Z=åo�XW�+���VV!l
E~�T��ɠ)���A9�}��0�^�����Y�/w��"F��>+W�Q��,�<{K��M!�Tk��/%�Y�"��2�7#�ҫ����|�E+4jl�����Zis��}�׿�}3y���B���I�����PQ����X%�ڊ/e�Vg�v��fti>
=vFP_�2��l����X�Vq�(�y4蘌��+���Q��T�6��I��t�V-b��Z���J�1tn;�@�M����30?��y{$Z�3H�b5�*�{!ȏ�UW�^���|Z_%��TP0�ۚQ��坺,�6����r�7]K{Z4�W/i�?=�)�6XO�*"*�4�Ĕׁ,���7.����g/��:l���
�Y&a�RAP�Öv�W=�v�[�F*�/[�=�Z��z��t
�����T�^ޙ�i�?y��$�����^�}Sk@P)����٠��5�l�@���zP@��6(f��ɮ��]��
�X�)�[Mn���AA����F+q�n^(�AQz�r�ui���Gڐ����;S�����J.�;����@,��`�,�Nqdq�|�
՚�]vl�U���6�U�"���ᚊ��T��lڛ7ڝߤ����'��sbzǟOܻ>��M=��5���O�� ��o�Fq0
‰
G/�t����A���E߄�}y������CBϧ���F� r���Qȟ���:�u�����Rӑ�[͑��X� 9u�H��H�#�yQ���U�D�"�N
�{��{���_PKEePQ�U��
01)pip/_vendor/chardet/langhungarianmodel.py�Z]o�:}ׯ��-�撔?S�C�����I��(�(6�W����Ի����(��8�^�.�5TK�px�̙��+�?�p���NO�ή�����_i���]?H:��8�:�f��>g��$���"��Q��4Mb��4��^����qc���L���)�����g�,��\Zn�,-p�ϳ|u�t���i.�R��v���]*ʕ��K=����-��d^�=:H�T�]�B��嬊�0K�<�] �7��}�!���E����#�# ,���bY>di?�J��<ʗ���\J*���	���2[�4J)����܃���t�[�c�c6����"�!����c�9�x��Ne��Q�2G4��$�b�i<�i!)*h����c�B�ܯ�}O2ƸZ����!��j��!�o�R�G6�j�[�^R�l�z林��t����dE����[$=x�-}=��t��ξ�׃�˃��o�a�1��U���9$8#D�Gi�p8�|ty�	3>���\S�O�ώ������������%]|��8�:�#��RS����P|�����2���
��[`2���D��2��(B�̗/�a����x1����;J��GOy�@}��‹�o���h�a�$H���wp}�dYޣYQ*������'�r�;�����[6�W��`�*�,��C�GS�����(Q�,i��BH�t��dV���C��8���]�r�����>��[�}3_��rU]�n\�����)�g��b�*y��jH��<��ut����Rq�i��GX:U���y��%����������x�7�C���M��C�ʍ�mw�wVhH�{�g�a�
��?�9�B|+�p�{߰a�����7��@#��c��C|���`�V�0p�1��P���sRc�F́s���P+Cų
	8&
q=T��$�G��2����������v��`7�ݨ#�`8���#�a8���c��p�1�ư�n�	��	'0��p�	'0� ,�|�ɤ'Á0�d�ϠR6#58�1�1Ɓk�!T� Q�0�a̡Ep!@��	E� �4� VL��2�W�(Ԙ"�!	9@4�J(��<��ЅPb�4T��-� <Q4Vi�d0*�
�j�����X]���R!l@<��@@�j�%�`���F9%�P��IB]�J��A��6��&��n"���ɟ�"���.�JQuU5;�&�-��j��&a�MT�ۺ�j�nү�ɠ�&
���Ihu�(�:�����,#_7鿸�`��S�ު�wNVb?Yȿ-d:��>D�~��8�~j��=6����،s&���`OE��s�Q{�����I_
���$lym����4��4J�+��˱^��ß|7�玨���y�Q��M�ֵq����`�?�8V��AZ�n�
��{�6w�kJY�֋ |&n�� �w77U�D�Au�E�^��Z|z��R�� \��:���Ef�X�,�~mϛ����VY�&�����`�۫<����V?w�Dg�E��	˚Zhw��׬��W�F%�5᫏g�q��&�jv7N�Zv����<�D��J�j?�,&�v���y��"]lҟ�'��D٭S�̪�sυ-�|�T���@w��[���JUuv����,���3��Ү�+o^e���mⶻ�V"�pi���Ju�Zߜk\�߬>��s��cVe֓I���Z�r�6/~2ukA4��F���D�°�]�сa����s���v�W�a��	{f��]蠺a���t�aM������D��h�\���d��dA?�ګ�o�
tN4#[!�3���m����n�/�MW^��h�1�69gV�^���qÚ�i4ڍ�P?\�g]�Q�6���.��ց�����"�^�,v��t~Ssa��YkD#0��]!0��:0����d�=���;�;}%e�}[�ʬIƍv�����ֈv��FzU�����b!�Ȭ�����֕���&Z��c�d��@�M�M�n~�:0��ˁ��.#6'�h�4:�W3�CX�Y�u�v#?5n=�o���
�5�6H�a;,WD�,��ޮF�'�Q�+�kuK���~zlTi8��N������Z�u-�ؼoʂ�\����PgAG���ٍ��,?ߕ�u������:ݞh��s`K+0~M�Ob�L5ImB��7U ��ܖ�� t8Ѐ����Ɇ��{|<ػ�v-��,����W�;�XSj���Κ]n�x:�7����J���nr�j�M�l�-�Y�8=�p�[��F���?�g#� W��]B]L]�ݲ�zЭ��j4);NaMt�v;����*ks��Jc[��:��jd�U��@�Ba]yt�Z��ۚ�٨��#�W�[BF؁�rw?�"pQ9Yp�n��wF���������݇�w��g����%���̈́�&��ۊ{��Rq��n��gB���GЄ�N��wcw��V_��9��z-{ߟE}��6|��z-�nT]-n����s�����9������_0|�y�6f���I[ޖ��A�fg�~�~7��k���M��d�ͬ��h�z�6�	�S���ߙzs�<��i� V��rO��f��zy�f��;��ޤ���XY�!�F���}�D���ar�/dO�,dy�F��9�:7&��/��K.�{5�����3���D{6�ͯ��W����x�p>G��PKEePQ"�?�
,$pip/_vendor/chardet/langthaimodel.py�Zmo�H�ίh��4��x�Ʊ��C&��F�7%��SD�N����N���)��j�'s���~�z���"ûw��ħ�ϧ������X|:�<���0���N�>iq�Ǐq%�(�i�<�W�$���eO�2��4�uZ�)�<3�4��3��t�-t.�Q���]�h���8K<�,� X\ey�>�uTꙸ_U�UE9�Z���;G�BN&��;| �D\��B\�B����(K�<�_�̝b�-B�G���*N�x.> ,E���U������*���(_k�֢����Q����F��,.j� �Q:�5�1���5-��!ԥ������q� �u�sXs��O�)&��S�ZD�XP[�d�:! 7
q�A|��G�c��o:/�"�@m�D_��;QI���M��H����R`-��8��>�{�@ ����Z,��L|H�X�����_n���W������׏���Ւ�!8�*��r�p~|}�;f~:=;��J�ONo/�on���8W�׷�G_���՗�˛�7Z���>�[� r��ə.�8)jӿ½&3�}�p�TLj(a�,V��a������b	�(��f�/��1bѷ�]H����Ӂ/�$E�	\p��'�D�$Y���SV�4�s%e�A����
Z6���m�T�y����e�%b����Sԁ�,�Q���,�(��
�Y����!$��q����2O���@��=��,��\Fu�V�[���"�}��Y5Q�+y�5��!K��{�Q�.�IY9RbD�z���!���j�cz,"ġ;�|w@���uH�����}�ݞތT@ݷ�e��~�w���s�{/<�BL�Ib$�	��9I�"1����,&���}��`�s�3�3�
q��Y�bB��ߧ�}�q�SVb��'�Ѽ��I�\�S%�J��H����p#���
}1V81\�=�KGѾ/}TR��(��]UbF�'&#�#4�1А1��„�a8�`37c���
vb���p#`�*D
�P(Im���+�W���<&����&*LT4C(	1)��cB(�  &V\Q��)�p� 'L@�v(b���ƾ'�h �(�����a�;�@�v"S�"�H ���҄FIH�1B�N��҉>Ih�n�#\G!��=�I�(҆s�6p B�F܀��!x�P�jH(�@��Z� B�ĉ ���p�I 9�Ɛ@�`DdQd&���c�U�B0B[��+�iV��Ki�uUbR
J����R�.u:��L����8Gjݓ��M�`�l?�x�������|*���Bݩ~D����G�`B�-R�Y�>�H)�!��9���#h�l��]���Y5�����Ts���
�S^B6Ska���vj��h�Ui�U{�l�$�ÌT���A�h얍��ս�b����ͯ����$��I�!U����?��~��ѩe+���F�rΙ�Lg��>�°u���Rc�,��Ea�o#��6qӚ`�u#Q1re#F5�M�g�W�Ԯ�e;u����u&ޥcq�-�<��ld�!�����g8�� 	7��Ɓ�m���?���H�N�2��_��3K�������	�ص9*l5����'��u=+�{ϕk���L�zF
l>�fEِ�ݬN��j�n��MY��D#��>���c������{�-��`�I�
%h�
J
.�,�V�pmhS�+���../d��|-�l̽c�#O��]�6e�n�:��g�d�p{m� ��
�n����D�M�<G�H:X�H(7+���:+�ި|�7[��cݶ�� }������kX�-��鰥��l��[�]4/�oHT�F�2p�F�����H�^�*l&2��(�)奇c��5}��̃ǫ��宍A���;��J�s�A�<�ke^1�}��#�q�^Iǰ`�ƍak��˦]�v��h�0x�[�7�ٵ`E��՚4q`��u��k}�>u�F�}�����ǥ����g��>+��By��u�h+R�B�%�M5���tk��k����])FY��yނ��+l5�J�DD����m�i����W!�;���Ǧl�ףl,zfi�f�/�c���Y{yF��Gv�X��}��f��ݯ��\��v^+s^��o��r-�v†8�u�I��5��.��։�ߊ^���f&��	�h�I���*ۉ[!0+���j�/�6��i�\��[N��r����pkO������Ş-z�"���v�X�֗���ڬV��6>Wl��J;�%շ,�x%�=�=��JfkU=�����:��ۻ���~���C���þ����q�����һ���{�bO�/�P�q$�ݍ��Xi�\k�ݪ�F�ˁi���+��ژ�dO��ޮ�-���J��;��ʳ�L�8d'�f���>���kk�e>`�/���S�X�]_���\�^P��~Ҟ��/l�u�L����M�o��cpSѧ��+�W���R�J�/Y/�B^+�%$�DŽ#���~e�+��C���6�8��e{�c�c?��Z���m^�}�d����u�.�
�<�#o��	��!���=	Ev�w�B��y��j�_Nԛ8x-�/xa�׾�����5eѧ	泄{B��O����.�������~˧���oF�;`d��?h0�ءU��4J�Y�7w�'�&�>��F����N����]��R�r%��
�B�wi4���>�/Ug���:������PKEePQ�2�d�
^+'pip/_vendor/chardet/langturkishmodel.py�Z�n�H��)
�C��a7-Yr��cg�ql�v0�ɠ��M�&�J�Y�k�{�}o��_Slv5řӆ�E6����������m�f�<NhY��L�b��=~wzNg�G��������7�^�ͣ��<~��(��l�(.�}�G�$�i<��,�Y��Ԧ�]�L=M�2��_�g�d�SvOe�Nȟ���E���YZ�6_dyu�t����Y��R��nUi�.�Z�b��Kzu��t:��^�]:L�Ҳ]�B��|��Q��y|������!z��2N�v�Tft�*�����_<�����Fŧ��;���2��t���AȹJj��k��Q����JQ�ݗ_��ZeK�E)�jk[�ZIQ:�9�1�	�_�e:����R�O���:Sܢw*U9\�\�%����JEQA=V<ZXO�!׵!t�A}�7�b<�kVy���¬Vk�	�x��~�~�'���+J�����z:�8��>"P��B8��;E�B�/ K���z���?��WW��7�@a�S{�)~Z��s�Wy��+�~Ō÷�g�7��'�7����trqE�tyxusz����.?\]^\�]+e �`���@|�O���2��b�G����ɜ��
a�����X}W�,}������)�J���1��v�-6�>2d���H@(J?%�5���P}�dY��۬(��C�
���A��p�����_��@/<(���:��f�Q�@�bM�e���dE�L�AR_�MM�R}-+
{ЀP�Ⱥ��T���j8<�b�t���tV.�5E+Ս�;U�
̾d���((@FO�}G�$����n��DxgЖ�n��b7�E����^y����E�Чpߧ=���8G�c���ǁOB�������ho������B��zJ�ۃ��x��	R��$0�p
\KX$�s(�X@`e½�=�{( 	SƸ!&��(al��j��1	|�?�9���s�s�sg�S�8!W�rcȍ!7�
��C��1�A0�5V�B�����T`�D0��&Y0� �����@?��-�0a����Q��GS�7h
ADA8CLu��&#2��@x�W;!�R�%�x�J47����r
E����j�\La�E��O�dB�GbUDD-::�p��M��*nF�+q�`�	���q�hW�"�"J�i��7�a	�-��5�q=��D��Cɾ&�����Ծ���X����:���Cԟ��3��o�����p��3`�v��#S)����Jl؂`m�z�h
;6Y`fxf�!�ڢ��ǂ���X%{�I�[��tQ�uLd�wm�Z���I�ٶ�|ŀa�,�������
}�ʂ����	omNE-$+�e�y����d�v����=�)k;^5��m7�}�v	'
6ұ`�Ҭ2:7<���uЂ.'m�mu�m�;��N6[`�<`�����=�n�ul�Q�����bЉ��yn�Yͤ�l��R�b���2�``�hꁩ��q[��y{����`j���MU�τM��<9h�����&&��b��a�9z�F^�9��[/��a�`+��1�$��@����Fk��ʢ�4Q���{"�=L�M��zeѸ�I�ra�N�g��]�:��g��o�$��ڙ�Z<�a�5'�����30�<���h��X)���`ˍ�
o�+ҷ�ުl+����7�`{$�y��ߦ�D��n=������f��I���-�&N�eo����>O�aj�L�;��FC�?,����Ovg���kd��������0�v�7��N=���=�tb�-p��~Ō9��s��\�^�2@���9���-ࢁ��B�7aom�]��-��(d��*�~,���v[廳�Ӷŷ5��H�0%D6�$�ț�&�.<�yű��F��/d0��􅜉��ƅ~Ͼ#
A���[���b{�zw��=�a�v��w��s#���I[��.m���b�Y������7�yλ��l�ik���¦�P,QeK��n%��v)�r���sE��b��nj�p��:kA��:d�h۹sZ�7C{خ���N��>6 ژ��6;A]������X�/������,3;�:dv&^V��-0�u6r�Ec\�X�F‰��B��R����g�T�V0��5��Fٱ�������}���o�z1�6��p�M�7L����!6�lm���(�
�����D^,�@٩a��p��䲑7�<G�mY [��n��?`�Ԇ���1
����o�1���E^�Q��j<q��F]�k�<�s��n>z&�$����,���3>�gx٭H�d"�1d��s�:�q`�[�6\hE���^�t^
�:���ˈ&Z�ݐ�h�3�v�}w}��h�?���tVTݷ!�3�#��Y�]u�G�ϼ��mO��v,p�W٬�1qۣm��n���s(��e�[-��g�u7Q��%��
��7m�<��]م���m�r�����i]�M�W�l6�$�c�3Q��~܅�DA?��G�[�ګ�T�:��2��K����2���/�n�������'_OZ蟸�U:S�Q��WLj��,W�x%��������~	
�`w��iPI}Rjq������D��ʵ�|�|cb���4zR���bg2Mw�?Uϓ��x������PKEePQ����#pip/_vendor/chardet/latin1prober.py�Xmo�H��_1*_HK(�$$͝t����VQTY�Y`���K"��ߌ�y
 �س��3okvR*�@��ۇ^�����{��7�-i%�X��x�`�	£����〿1�7we�L�b�<T�j��n�G���|�d��Ө�g*��%C�b�
��*.��R��
�@�X�I�*6��udq�ʕdk�F����q�ZMG{ի��}�nC2��&q$���/+��^|C	��+_a������P�0X��"
{�Ư�ZY�Q��aJ}�"]���N%c��zG��a-V�H6�ȁ�R���B"~!&|�&�*�`��br�I��C��
|g�H?X���Cp�{,�!,I��T�䈝8�@�Q��q\'n*?J�^�S��bc����,�����|,�L�ս)�#�"�s,ޠA��^�B6]�����;�a�G��?���p�ꏞ�QK��X��_,}��1*�j���������V��뎞�{�;�wlLk-����10�ݩbqKSL�ܗ�,�S4��I�$.��8�',o����o��1�Up�C��j�`ŋ�<����U�wɱw�=w��V�VpWx�
\���>��F�ɧh��h�P��c�����.�FM�(9�N��ėOIӦ7M5y�,�x��z���L
"a�Ȃ6}�@+<��
�M��a��h������+M?�xS(E�f�6Ѭ��$Q��lu���9��%W�|�)�۸���Å���O"�V=����o��n������7���|��	��Y��F}K½%%Ȱ��D����ԁ�PG� )*�5|af�rʅ��j�V�5����<��~>�N|��|u⫟�W'���|
�k��� �F�;��ᮈ�*�;����<wM|�{���wM|���]wC|7)߇�G|7�ٸ&�5����I|�B|�~���Z�q��w��/�b)�E��G|�1_N�q����_�bt��]D����"����E|�����>��M|�_���c�b^�3�'��K�#>#�2� ����!�����=���t_��B��u�'��K�#�N�gef@��L�3?䳶�4��4���3�
��f��O:>�iu����2��:�!�B#UH����7��~��Z�]A~�ˎ^�j�/�D~D.�*ǿ��L�q�["�5ѣ��z�-j�5녿%��Tv���Է��ϣ�E?-*�w .H|V,o�q�#�x���8:N9d�4��'\�TX.��@�R��2.T$U[/9X�E���p�����M��>
�çBۙ��`۽�i�>�~�g(�3��U��/�Qs�֙g��	��vP2��|������ݥ���
f+wv�ħ<S�&�Z�U���T�aF�O��A;49,�ј��g�34
j͝�Rn�>i�=F?{�7�)�b�Rx.��g�N�v}��dƱ/&�9�ێ��>���+�Kվ5r;;���Wm�F�����7|�)j��n���v�#H�o$��ϰ�<L���N�`�9����f"�Z���񤄭�Z�w#�(�ŪD��$���j-[d~Ȏ���P>7~���N[��֏�����
����'�^G�_L%A[��B��&�A�v�l��T��H�_B7�2XJ.$W몶ׇ��gt����\A�PKEePQ6uM�U
&pip/_vendor/chardet/mbcharsetprober.py�V�o�F��_1��:P9
���T%T���Sd{�3�h�Ε��ր
ؤ�V��ݙ7��WW���c
{��Ow�I�o�`{U�"w�4�b)�SO�L"�'�CıOs)^Y'�	V�N�PȆ�40m�C)���=�r�6�IEd*�a?f���q�^�R�J&x����T��y��7�b�!�C��bm��2T�5����ҼE�8&��&�p������F�E
~���'DO��FS/�X�'B�����֬��,f�-~�X�{�����Z�h��4M�T�αXh_o��f�DE�;���V���4�"�%��2�Mi��U(��=Je,W�z���i�	��K��i�.b�y$�	���ƞ%�B߁Md�O�
�YMn��ml�8��V�m�؄T���=���
$��5��j	
�!	���P1| �~GO҂)M8J�&`K_���d�Rw�L_�����7�E}p����z�����"q<���#<�w���}����?��`�P��]��森Cӹ3��-T�� ��J�\��k%19����g�7A�qH+��Q�1j!�h��]5��\f|�RzC""��rߵ@�gK�JQ�]o6��|�-F	fp�ЃX)ݤ;�k�ԅo���i����g8��P|���V�4&��_8�`�����p�f��
Y�h����r93�6d�+!9{��jA�'�mil����	X��
����>d�]r��C�y����z�q�D�˥��;V����IRl�z5n��{����}nh�o�ӃZz>V���%���	yɺ�փJƳ��k�I헂�ƾ4�w��9)�9Os)��y^��\�TiWB}��_hE�4�\�}�z�_�&��ͱ2C�^��R�k��}�6�����s�o���. a�)��1�zn�8�� ���?+����.�*^'(�)������3qN����j�DUB^���_��~�W�lI����,�����:5���j7I4���U8^)�����%���|;9���3@]Т:�`2�{C��?s�ފ�I�_B� �-�͇�x+l�v�`�������Y��T=�y��6s��8N����R�<��u>��:/?Ӄ�H���Ǻ|��J�//�I���~��>�f�
�Ke<�*]�<|��;[X�m������Y�?w9�'�ۛ������2�?�1ٷ[�X�lR-�(��,���y�x���ڿPKEePQ���r�&pip/_vendor/chardet/mbcsgroupprober.py�U]��8}�W\i^@��Vjw�H��2%��h�B&q�cG�3����1*u#!%��{|�9�����P0Oi2�x@��,�A�����h��43b-�蔓��	)-�x��"�l���Q�O�6�ڪ�J8�W�¥ι!���A
��;���#��J$�	�,>M����j��'�3�SZ�;�류�\y��6��A���v7�-�II��Z���慧�I�����m�oD��y�Pȵ[zG�Б��n��oJ���>����)��F�,�B�&�I��Ag)V���K����̽b�{*uA	Sdx*�)�爩�6���Td�*�~V����M4��ш+n�SX��HP<	W�����ݜ��F�C#4Ԡ�yrO\ ��{�:���M@u�|���/l��$<4����&MI������{�V�
˳B6�,=���f�9��O�؋��t�t,�A���6�Ę�0�J4��A|CE�?���O���x>�1
g�(�E�q���"
Q8�-8�Qb/�-��$�@��P'�	i��?�^�eJ��as�q�Rb�6y��<�Z�w��$�=���Ɩ{5{{��]������&}��Գ�1ʇ"�Pjm����y�C��n��~���-bD~��`��o��Z-38I�Å�6��s�W��� s7�p�9�.�T�.��O��)l�/��+���Z��:�*j��K�gs�#�����_�/F��Vb����#r��{�Zl�x�j�dw{?�ϴ�_ˉ��6lF˥���\�-�Y�X����8�_�Z��?���Z� o��k��h�	��'�[�!,}���9�Yo4+�����3�.S��(;�t�:3�2u���щ�i��s�9��PKEePQi����cpip/_vendor/chardet/mbcssm.py�\]s��}��Ќ��_�'>�>$�ӓ�ۙN�2�	������w���-;_>m��Z,!	���HT��;�99c����٨��Gߘb�j���7��ε�Y.;�9!���븮U��kfCZ���z�9�{~���x����<`�3��u�!�v�9�9������/�1���n܊��Mq��CY���n�������LȂܽ�\�
ž!��|*kr�{Q�L��?�)��Z�_��q��iJ��g�����CӸ�$���h�Y�9�Y�����ٖ�>uB�=4D�,o�/?��?uf�4��PQ��aچ_�.ـ�PR��{<��\�'�cy���9�Bv'�›UK������c��[�#����<!�5�Fz�$���ފD��l�	�(�p6��Y'�`U�)s�8�h{�2��>@7b��!�������'�?�/�����~0��|�}����'srn�\2�Z�-��ix�'0O'����'�hĎχ�]�'G���!��^���u�F��M,�j�e� �[Zr�#�qCY�pzC(�;e7�=��lsz���[lu]߻���U�~dΌy~Tc�}z_��B.��[�No�k�m�N����`�cgY���ءFb����
��5���]� E��g�K"�Je���ν9�e8k��9����:Q�|x�]�����#�����EnjZ��R��O�
�j�����=�����;����m
�L��!r7�׳��j~C�]5.�
5�)�M5�)�M�oԲ����U��R�ۂ�V�ۂ�V�;��Q�;��Q�ߥ���]��J~����|����T�{��S�{��K���G��[�ߤp��fJ|"�5"�5�|[ͷ�V�?U�?U��s5�>W�g�?��z�lV����r��CJ�?�k���F~*��cm�o�T�uM�*�t2]���7--��%�����IU!H��m^
�gW �8�0��/���[�^���`����]+�"k��w�Tcjq�3?ɞ3�����}BQ�ln�1�ٍ\���9S��Y�b�w��u���B�.z�^�obyT�#)y��#5N_�qj�ۂ U.%�FYjؕ�������&{�c��%,�K
8u�T���:�����$	�"H-J	�̇��4��J|$��&$	K�)zB�0���YʋB�)=�z�A
H)��#�y�$�P���S|r�e�MCn�rӒ���t�+7����A�~��ŗ?��Ő)�q�_/O-�iS�Ȣנ�E���GI�zũ�z��h>SZ��2y�SWN\w>)�ȹ韷/�$�g�=R�j�_��ҩ:��^e�D�P~m�4Bm�6�0g�h��^Y����a�&R�"��Q�	�)�/����
l�^d")��J")<�D8VB�q�$efp+��8VB�(VB�8VB�(V�6�j>��P8���8��P8���8��P8���8��P��J0f$��8VB�q���Q��MX=+�� ��P8���8��P8��������b%$�b%z-���JH�J(�J�h;+��
�ȟf�\6I��H�"!��C����H�n��\;=�5e4d��|�ѓ^B��Ԓ����zqXm�Z����f����f��յ�6Kq-c:%�Azu��TU�i
V��0���XR�!��OS(;G�±C q�(;G�±C q�(���đC�p�H9��C���<�C �aO��05;
�!���X�"�����x�yڇ'[<Oy��"��KLIJ5�ݜ��|���Q�8��u�E�RP��SyS(>��
�m�R��r��[P��b��tOB`(>������P|,0$��±���o����(��<��4��X`��x���P��đ���f��7y\_��M�ClZO�0���SUO�_n.@�;Et����n��7��C�g�{V�:�-�r��h�U��@+�_tS7ΫK{���f`���12�@R�������֢ie�6�F�R�۲�7��X��L3V*�����e�p�j~���?��QO�P󱗡p�eHy
�^�đ��p�eHy
�^�đ��p�eHy
�^&��L2"<���ݟ������<�m>���b���A&g��SY�53J.g&} �Sec_�?�l{��xE����F�؈�	���v`7�\�5Ģ��X�t8���8�X��<n�0K_"_,}���� [�F<Y�=�,t<[�Ր�yȧ�Y��3瞽`�g��0�s5�F�=�x�ӽ�:by�w
|��W`����%,A�聻n�����5�׋�<.o$*
��ח�F=�v��@�����`���c׷rY�Y)���?I��ot�̢��'�Je��R���֝��_�I��6�Y0����±�#qd���O�zp];�\��x,�7|��ß��P��х�-gw�5��硤ھYb�9���;����xX�K�x�����{�Օ��;��(>[�w�����r&��/���5�x��á��d��E���.�9��j9N��~�'+�D8�DFy�%J_d�»[���G��vدT�����RA~��z��z���^���W�6�8�^���W�e��R|��$���±��8�^
��K�H{)k/�#�p��$�W��8VAG*H�XI� �c$q���U��_icK�c�^��07��-���nTw�˹�[K�?E�J�[�s�ޔ
Bdc#�ܨL�B��˰�)GшL717W�<n:�X�'�
��Եfu�5�u��PԮ`%��n�ɉ�y��<Kޤ�5Z�~9>֌�aY�AboV��*�Y�7���
�~q�Cv��f�����0�s�G<�[�Yo@Ԯ!{R�̦�qU��t3lz�l
n�Qm����u���lt��(�%'1P8	�G����ER�L���,����˧���S�;-�Hř0?�Ԓ̧|���2?���#A��_�x�_�����'&z
�+��‘�0��2�߼�05����jF[\���
1x<.@�H���ʪao"~z	nd�0��m삚ۼ굒T�Q����L�=|�j��^u�v�^�M�)��^����5y�>��Z����j�Zk�~ӥ7%�ֵ���J���O?���Z]��ykuL��u�ћ����Zw�[�kj�q۵��k枷�ij�I���!{����V�Z��S���t���L�zt��]��yMLm�s�z���Um]���Y�65{u󫚫��_������oW7���M�(c�+c4��={�c����滿+�PKEePQu��&pip/_vendor/chardet/sbcharsetprober.py�X�o�J���b�����R�MOm/OG���G��^sg{�U��z��>���ƆKuwHI�����gf>;ۋ��ݘ��>���?6�7�N'd/*4Y1|�}ۣ�pqI��_��l����;��$�e!sB��z%��y�!v�^�'6, ����4�,���aXZ�#�;vȅ/�5؈@�a� ^wf�̥�N[,e��f��V!�:��j4�0Q*^����H�J1ɂW�Ƒt�|!������G;x�!��_�{��!����p%|-1^��c{B�}�� @��y`;��"`��X�[x��v""�)`.��@*$�w?��k���N-E��xUX!�2��?�����?��w����%#[�F����;��8q���k����Wg��c�Z�fzZb�@�T�C�?ҽQ��pzG����R���}mv���D�[��E�-"π�����`:�v���h�F���d�
�"��%��x�U`�����9�<@�}��u'O���o��t7Q���Ѥۙ��#NG�ج#���+0�@�C��ɵ�h�{2�	�p�sie�2��a�*�lT�f�S9���B��7��Eh�6��g!��rȯ��p�]5!d�/R0��_��'D`Ѝ��}lC��j6�M��+�>d�o�H>��"@��n�b��=�c,�Y8ԋ� �#}F�vPi��R;��0���+R�#b��z��y|%�[�Tϖ�Ɛ���.d�cj�o R��~�Lk��I��S�xc�����=k�02���-���'"�B�޺�_��li]TVw�;��Ig:��7�_��X߼o�k\U���dY4gY5ɼ���y*M� s��lO��o���|�>KT�k'`1H����O�<�a�n���w���MMU�[F>Cţ0�T��	66�����^�͑�4���9e���bGr�+�IJI5�
9\�ё� 0��v$��	-�ZL!w�/��Aw�e�D(B�Srg�U#����qz;�-"+�z�t�~2ǩ����8xP��B/��;�S���<Lύ��B�֗,���76g�Pq9<�l�����E��qˠ��&muk�^A��s�7b���J��nzBc����GJ>��/Jճf�
}F_��s5�Z����C����_����)U�k�T��)��#��9
����_>��6C�cޱ<"��Yށ�R�U܃(�};�k�j�����g��C��.�彩�<���&=<���Җ*+6�9�b�M�!d�@�炾���jF�
�хM��?���Eh�����"�-�%j����0�1��`�-�;�]����x�	�TŽ�d|p������
�>;������:~z��N{b
F��(�n��M��1EQ�����,s�04�c�
"�G �|�m��I�A2���!�����u�jvKf��3@���#I�0�Q~p�xeU�+�fo5����3���x��U��S���3@Qf/˅��+�d>��8%-'	=_Z�S �_1�����3s�)s�-XK,���?�W��'$��$�6ʍjq�r���/�.������!*��ZpU��E�b��:{�R�bU��+�C���yP��ѨUٹp����EV����Y1�%sH�[���;��}3���E���:�Ψߚ�3�����~Kp,<�}����S5V3cQ�،Vr�Ǚv��r���e�hY���yw�ICq�~���`o֪q���md��9$5A?��`ڿ����f�	Q�yT�WH̙'�x�,18��q������Sqk�V��;Y5��սWo�O��t>����h��8
퇺�R>>����,4a��G���Z��H)+�%o��5f��l��y�w�`�*W���_Vg���$���>��c	�70\�Q���/_��*�PKEePQ��O���
&pip/_vendor/chardet/sbcsgroupprober.py�Wmo�8��_@�9`E���~
-Z�D@U�Z!�8`���v�r���I(�;K���<���v���4�/���mC�7l��3�w�;�,)[0A8��O�i�����m�Ҩ�Dij���zF*���)����f�tC�\S2�C��j�G�E�U(�G�B�ZK 1��J䞢�P�Q�x�Q�k�VK�V	j�J)r�hpck�aL5U�'���0��C���K�Q�'�F�/[�=����Qd�R��2�?¥���x��	”r6WDE6�����=�H����L'�c��!�W�gAdE��1^��j�wI~L�G5�/TP�ۏ�9g�{̣BS �V���Tv�#n�t$����Po���G	Ԝ�n�����B��?�{m�%t:��R;����}�>0�.�8�	1�-��)��!/#��[w�:�N�1x���x�Lޟ�K�Z,p��Vkΐ�RD�G�~{�zED���u'��Nw2h�.t�ch��1�t[�^c��x4t���]�m2��)W3�CB�I��X^�r�dC��ũ�`����jȥX��"d��'`iʰU{��Ȳ�o��s�P��K�"����p)U�Rk�o �R�V+��o�*��Eɹ���]�('=[J�뵒sL��Z5.5/V3�5)D�SP��eb�i324Ef@�����Ǭ�LQ��ߘ����V��[e~J�����b�0��~D�'^V�%Mw�z|xH�^�?J!,�����|����m/:��C� �q�Qo�t�jV���g[��[�u�˰U���p�Y�f�uj�	��M�t��6c���_c͡}b����=L�>����$�$���lj��6[�AsO�o[W�0�1��f���<H�v�o��Ub+�T�ۣ�I���~e����vx�|t?Wrf�J��\	;���Ѻ!���v2�7�0;w7mY���y�<�n�?��X�#	T��5��������k�-�����V��.�%�����;�(��J<GΑ�Ő�Ό�/]��>�=:en���p���+9|f���#s�5�|�ٱ��x��/�s�C�}�e��{�a:���D��?�wƭ����,n�T���	-�F��:�oC�_�uĐO|9��]�
�}�/b�%�PKEePQ֑g2 �!pip/_vendor/chardet/sjisprober.py�Vo�H��O1jt*�R�tm�� 	=~	UQY�^`�f���Oomc0�T:�R��̛yofǾ��~�?�p�폝>�'ݿ��E��5���+.���2d�5m�E~K���j{ׁ�óǞY$�L�\�������[�f��K��Sm�J~��R��@1߰���4��,�v�TkC�n�����J�u��f�Wӌi��Y�2�Ja_�F��n|��h䫯4��J�
]*4d$Mwf-E��D|�|��*-c���|Ca7��1� �B�Sxa��oR!~#C��YS,BбU�6z��xNC�Q)�3��L�E�y��f�k�Z�^J��B�����OԽ!�qns?3�a��V{�-Cl�TT��������Q�n�}d�R��iH\$�kh�?��0F�`k���&�K���d�Rg�H�;�Yg�>�J��K��fq���١p����":���}���
�q�q�n2�M;3wН;3��gӉ�o9��%�bV��K��FBɐ�G:����j�����0��"Wd���FR��)�!�$!M��)���t(E���դ��p���-p~Ǘ����TM���X�Q�W���e��U�h�r����%rQ�-��Pk�־��l�\�?�g/�(����ũ��49�b�]�Xi�Q�����&'�=�'���sgg:p>
�^��6�il�4�m �����9��7e?�y�I�?�<��qg3�f_'DN+M~�j� �N0R�j-����0nK�<�=�yu͢ef������R��V��(\q�����
%���B��z����񬾧�Y�C��>�RX��\���J��/r��/L)��.ϘM�'�
;N����8�[<�b��s�o>�[_��7�K��Ľ�Eo��K�vKq�tq�1QϽJn����t�p@Z�rI�r�/��q���t��`�[��l2;L��!��D
�"^���	��
��+�)&x]��8{�<�9}R
%ٛY�L�&�Fu5�
��O\o�?�X��끕E�%�uuF���w����
�%���w�ފ�aHN����A��^v�N�CZns]�B��R�/�'$�����|��m�Ǿ�w�O�=�O��J����:*�^e1��X��
U�-��J�2Skx��d�zz���HP*��I]�oC����R����T�b�|�nR���`|��x}ի�_I�1!����7�_�_��1�46�'R,y�D��gZ��0��ݹ��>~{�����|���[š�Kᨊ��ɞ��(n�1�#"yt����8�U���˵4��PKEePQu�G=p
�0(pip/_vendor/chardet/universaldetector.py�Zms���_1������������$���v��0�e���J�.�o��3�����n�W'v�{fz��~���7?�}���i��o�����_���}6�sv���l���΄d��o�umv�{H�8s;�<dr'����K$t=
���{�K0�B�h�x({��j��<�ء�=�����f�~��;�C>a㕒�>����
S�CV==`�F�	Fr��.�!Z�n��=�蝜�^�q��U��0viw�Z��@,X�a�!}v�
羧(����]��t�JC���RW�;X�v��L���+�V~��c��燦Bf{�����DLW�*�&�/m+�B&J>�ݲ.�v�=`��h�
����̖lI��<Se�ҏ�:>�+��e\`����ֲ��l���ʪvH��q/���^1�$��Q�N'LxJ���? }���1g���ȭAhه�����>��77ǽ�Ƿ��Q`�%����]���p�lߜ���I��;�H��t�v��:W7�]�����7��߶p��'*&e����x
�����•z�q�t'ln�s���Uf�B��'���{3�_�d
}�Ĕy~Xc���<�NR��+��^5Ad{w.�����Bt����N|��1x�f�Qo6����f��ڽ�G��ދ/�.�I�r�ƒ�<����S�9K�&ז[�gN�D�K8'��Ơ�Hj���:%g�!ko�Ȏ`4�Qѽ�"���d�9_��\=Guo>qmOMΪ�W�;�S�6@[$K9�9�.X�[:����̘�A���r�&�%?q�{���b��~�\�
�iN1���9�\����{0$��z�(�p����Yd�xG���#.L�F^�giK'��0�@x�"�zW [�iX���i}��L�/���fKU�+���)��Oal4Z#��h1
{�+��R˲�a�lyy������@a!!xl�Y���)��AU�x��^ژc"��s�L���<�0<���%�D��� �d�R�t�L���3(�HcM9�T�����
;*;�/y�I�P����:W\v{������M������
��P����'��Y{�>���-�_,�˫�ʧ�_�4ꟿv:_*z�v�t#u�s���_��� ����=N�O��n�jHl��� ��"�_���O�f�U>o�?�z���U�T?C�������������zÏ%��]oJ�v1�Tbx���yX��M[΄O�pH�=V%w�5��l8U���a���E����5�
c�H�|���4D��I�i�'xc;��!±m�CI�k&&�ji��*0��U"C4�:�X���:z6|}xP�wn���4�6x$H�I����$�Ke�ᆸO �'a]rc۹��m*��Jo�b:��?"t�;%V3Ր�+��=w�<D�ˆG�Y��-	�18M�%��3D��N���r�F���{%�r9��*��]�j��rL��h`ە[,�4\>IM���B���O��-v9�T���nt��l�J�*!�$*�<��%���#����l0ԁ}G��;������ĕ��$I�K8G"2���~�]~�r$�/c��xJ~K�Ga~4"�d�Ipw本B�m7���`�Q*��r�"Q
�HFl�*��q�2�s!]��T�'�)Q�H��Q�����%ɂ���h�
B�u�6��5%'�#�O��`��'S�E�D=���S��E��lE��A^XzTb���Bz��	�� ���쿉oѶF����$�.�����!���o��Q�%������|-!���d���c�!ǹ�)W�(�0���\*1�G�
�ͱ���8�K-�Lqe��g�@�P�V�+�D���
�zp��N��MX��8��� `�7%]�Y�vr�N:���ߤS��n�����0�'���M�N��W*�
��ݰ���[Ë�Ι�g���}`�]��:m�h�?����*�.�so"lϨ����N�8�m\����(\A�Ѧ*���F���������_YC����:(dR��`�×�����:��z���뺒^'(-i�hMu�f-�Ƣlm��Z͗�߫%���Rޑ��y���ʯ���d[2��W�F������3$����r9F��)[�$��ւt*9N�ׄ�S��*�yĠ�,�HvB����=��=�eX*%��bj#n�x��D�w.�ꜛ������)O�'̅|C~d��zŒH����$S���?��n�_��g��(!�.N��ry�S���M�|]�l�^b��ͣ/%{Ч.�,`�Z�*�)�D�uNR$U9��u\W�0.g.<���ӵ�THrs��C����h��>a.����V�L6�Q7/ŕ19�l2�)��*x�0��qW!����SS�n��80����T`jM��|���\�Ά����s�m\K�/OC�gO9ß���S��ٓ&"�=�˞�CҪ��U�-\�2�l�.������1��}�B�Rx��Җ��.]I�r?	WP�v�䣀-p֢N����e5�t��u&9�˧���t%�#M���;��m����r��U(1��p�7/��sKNF���bL�t����yz��M��P�Q! �[pak'�)C[�t]��_�d%6EGO�MG�`_?��/yUp�vpk�
�ۯ.]�Y����ͮcܛe/��ߪ����x����nZ����t���9�HO1}.�)I�<u'v��ٖa�3����ڭԣs�rCWM�v9�ݖ.|?��[r
�DA��_k.8��fm6�;�TH�̵��tN-��[�N`-���_I��F���jl��(~�G�l���3߫�l��G.z��EI?p��������K��H,nW-wKcM�8�U+��{j�w$�}g|j�!J�T[�h����EO]�<
�7[�bKG�=_�<�x�X8�X�?�Q{$$W˭%'DV5�2ԡy��+�JD�H�C��U=���Dذ�LR���d{��nz�ہ�AӒ7 �我g�٬	�6)m����9B��yŸ��׬ǀ��Y3y�����4壘-El�wAE9���n���7��7'jtCt����M����ɤ�@���a`'��r�1�N�MV���|-�B��c�%���r��fś�؃�U]_�c[��|R��5b�[��4�r��%?9��u��M6��H��k��Y�:��=�r$����ܭ��2�L�}r{n�y���[z�k�5)(�����"Z�}.�sߝT���W}�6|2
�'$�K�b��09���=��>��8Ɏ���Y[��E�?H��,��r{V`x�[
��H����e�\�
z�+71z�'Z�N
}�vvjƐ#�PKEePQ���=E�
!pip/_vendor/chardet/utf8prober.py�V[o�F~�W��H��N�KS��IP�F��Q�,c�a��.�]'����pD=��������!���x��'L'C��mx���?����%kW���L��L��8�,�V��j�B'�F�#|G.7�@�`�pP��F��ɔe�`qd��^�F��a.Ue�FXnK��T�*�6[J�6�v�wwKg�-p^��C������F�en�j��=Yf�z�9�+�2�Rh�H�o�Z��~j
gK�mѥT!���� a��9đ�	�=5�@$���"|&�nS.*�PmPez��ggSԤ�Q��j����S����Ma��C�ƅ�cI�ew����4Y����Ռ]�
ڑ)��47�C���ij��ζ�PiL��k�=�A�T��,r�iλ�@��u����+|x�	^(�:M^�_�IJ
gDLU�H�-	'���
_1x�L'�k�~<	�a�z0���&��t�|��]߶|�]��f�k��)Qf�:����U�4^My��i�12�(���lh�\�UY/A
}���������L�X�����V��)(o�F�|�R�s)U��6E�l@��M�߻���,|�|��팾�\�Z��X�:R�F�%UO�+>�!}4��X��i������7�m�2��L`�����F�ta�*�5��d�X�l�Ʒ�?g�Ȟ��y�ui�d�"��9ױCZ4/�{�<B��*	����M�5������](�}|�J�����>����P~
��a�ˮܑT~#B��3�q��2|�������cM�*����l�J�U	E�� �&W.r�^�^|�#�ʣէ�C�)bR�u�`�d}(���8^;�U<����PEG]���|��ѧ܄>6v۲=���m�e��۰7g�	bI��o
+�K>	|����cw��I���ѧ�	v���H�+�”K�Q�;�#ܜ�4��G�Z�)��E���x�%�T#E�1B*���z�p���g��t��Z{����e>�p�����
�kuwwRt�1���M�5�������:�рע�V��}���~���E�q�PKEePQGǐ׹�pip/_vendor/chardet/version.pyM�=KAD��$w��F���(��.���;�����w9N0����֚/1�-0�G�V�VhF���V�"|�4C=�̥JNH-�\�'���j��#�E�$Tֶ�e���J��~��f�Θ#5���D	����~���0G���n֦�]�{�[w��<��?��lͿ����wnw0�PKEePQ��2#pip/_vendor/chardet/cli/__init__.py�PKEePQ�&����
%pip/_vendor/chardet/cli/chardetect.py�VMo�6��WL,$�6��E�m�l��6=,��BK�MD"��k��!%�N�`u�%r�8�f�g?��֜/�:j�έ��f�Y�Oid�`�����
���e#��nm��
��qdn-��J8Q:QEB���je��x�5"ˢ�y嚛`V��cҋFC_�n��`+U��vqy��
?�J�jY�.��|Ȁ�R�Ɨ�"�>֠������j�
!K�I��wP݂u
�<A�)��w�E�%�/�nz'��=GX����I���+�����N� 1�J�긱b��;;��Ɏ��6�6nWั\'mY�[s\r���)zG��	��|��'>QU��L[_*䂮�F*a�x+�����O�F�_��#���jX�+�����K���r@�h�7%�FZG���PO��[�dp�P����E��,�q�N�K>R>hg�^��P��o���F��Ҩ�9�
k�ˣ�{�_���~�FLB�����!hνc���L��t�j!�g�g`ט��W��2b�Ѻ#V,��\��{CMl�d�7�4;譨�d
�`�����ش��Bi�{J�mB��l�C�FؾqG��k4�`Q��8��?V	���a�x|u�s��s��J�*���o��(�ۃ�P���S��O/����)f�����\��7?����h�[|��'|D�
뎼J��k�T	J�&��Yx�k�8#a]ےN�"B��sA��T�55�*�^T�
E�|znZ<Gi%�m'JYKQ
�?��K�Pu��9��SN	��2���i��*�}�/�;4�p�GQ������
����Qb�����I&7�,��|�w|�׋c:
g�W�WU1�����O��Z4]�N~l��W{M���!�7�cZ��)��'�J�XaY8��7�|����
�$�Y�)�Y�<��
�a�������L�l�׵0wo��X�_���e8����y�.��f�Z�6�z��@M�����#��4���&զ	擘jdͤ����X'�� �}ս���^)�����X��6��1�F)�0��^	o��͗O��e��3�t8C�
W�?H�Q4y�mN��̀�to�-�Q��'l�r����'����fs�C��ea��
\<�OԸ�y�#�C&������_QāU��i�?PKEePQ�$г� pip/_vendor/colorama/__init__.pyM��j�@D{}�B
7�aKiSD��mLR�����n��ʶ�>� �0�y��r����hg��C�@�M�j^�|��� pK1Q���z��l�ā\vR�qdc<n���L$�/�K��� �z���.�ċ�&:�T�����R��D�mMn�bQ^F�!��2ﯤ�%zϰZ�'W��_PKEePQ>�_��	pip/_vendor/colorama/ansi.py�VQs�8~���Ls��m��������\��x{���'����[��p�i�@��v����Y~l�(�!�T%��{*T
�s�~���c��O�NIY\B�H2���l�5K�kٶm�&�6�w)�
pT�$��rB��
)$�b���q�#i&L�-�4�]k	pK����k��=��r��fbs�W�Z7�B-jJ�|L6 �W��b[��f[�`Z���iŰ6Մ*u}��W�[��%@�'Z�7"�(0�mo�*A���Q��g�����6~�1�5*B	���A�)�%����2?��o6J��^p�|݀V��D��j�0d��0lIH�e\_WD%@���(`�b�_H�H��y��OX�
��v�y�3N��bөb�ڃN�7R�#8Q�ș�N�4ы����+d�TbvN����Lu�Zg�p�"H���닭	ϔ���B��Z�e���F}�C���6�t]F�c�틽�bO�̑F�ݮ7p'd&.;���Eh�van\1����i�ꨢ��/����k�~�
�����+��d��r�����0�������L@�8 ��h�%�tl@�����J\�-�`Vz�L���/s<gR��w�l5<���<��1���~�
�MY�2XՁw�A��*|��A[S&�f����y&�3Tzr�>���<��T�ŌO'w�+sVa��T�U6�[欎�^ge��9�R�ʳ�o*@�U�x[欎�oj^��Ox�k�����^��&/xM^��5y���^p�&3�N�\������i2��49�u�,�:uO,�!���BK-O�[��l�xN�H��A8��?$�e�g������=x�C�-S�K�(�m�2X��ֿPKEePQ#�lsi�(#pip/_vendor/colorama/ansitowin32.py�Z�s۸��z�AT*ɯNN5�,�b'�}c;㦶�S��3E�0�z����x��C�.�g2�c���b���.�d���$yL��䜦2bkr�p4 ��g�?�h&�€ł��`�\^�'W�2#6�	�	O%I��ka/��ٙ�|I4!1OGp�#O
�Ni�n�:���Ǩ��X�ti5��n{x1�O�UE��Њ��4�z�K�ЗLȝ��9$W<�gF����\���;�
I3��� �B��)���&	K=��3dW�u:��/�D(Q�,X*�~�3���0��#Jd
!Jh�bI����Ɍ��F���R��s&��� *��y��OIg���y���a$pg�"6��M��g���K�1�B�8�It͞��0��{�E3TnN{$���U��%��s�Y<e�`f	��\�w0r��=���[0q��%\򙃓{	�c"�lC��<�Uк��[����
�!��…��9�8x�0縘2��11R^yX#��1̛�M�~޽��:�� ���Ĉ�,!��r��X��_���Z��B�D��/|�E|5�r�2?��;8����_�����bݟr&b�7��O_�85}�JX.2��^�W��dI�a`L�T���u�Y�,|�kw5���
�`U�T
諓���q��y�v4<z�`VSh�e�T
�v�\]��ÊE�{��O_�磛�������hs��oa��ʈD�����-�s�_Is����w,��w��N�Ҭ�,��˂��.�s�~��sI����&�$MyZ2��H#Q��Q�4�gb��: `3.�Dq���w&jN�h���ME��,rw�KTsŸX&[‚����%E�=�F����ul2��� ���PU�fz�`��](�P1m{*e � C�LJ��P���@�lGH�Xr[��β8@6!T'Q�h�?�7�uʐ~h�����������?>N���=��G�=uA���%H9P�d�#rk< x?���v�:��3�QN����_�!��.��ܡ*�k!��1_.!:.��V�!.���sM3`	&���.�]��y1O�ɵZ�zݪU��`�v�\T�vn=Y�,�TaD�fB�$pz��E�Y3���BCf�r`���%ˡ��ҽ���M�I+�_9_��)��Z��H<�W:�AX-I'�ǜ{�k!1��$X��.�3X"�,P-,� (���U�"�-�TH&TgF����1`*���p-KT�Y��xl0��z��;��@
�<�p@��Pv�J���s�./
��7�2Q�?:�E߈��p����~�ns�8R�b>Oܪ����Y��Y�6y�a�r��p�2���r}��Ej���#}ey��2�a3Eb%߬N�w�����p�k��Z���a�0#j3�r��~XV�s�X*�U��(�+�m-�F�w�SWʊ�[�I#��[H�P���/J�s�Jp�L�:�X:���E�
(\@u�[ƌM��#32C���2ѻ���گ
N,o:�A�U�;��z�J�Bd��x��FI�4a�E)�W��Mwh�B��*�}.ZU��b�
�$��|K��,�p���P�;�4
��—���E�!h�u��&1��b�`%s�
��9��"T,7{W)8���L*�kH	9��g��֖�������]^�`�5>ŝ~�ע{zs���Q���!�V����-W�7�G��Z�{1��dpz9rf�,����m�7�����M���dr�Y[�n�:������߷{�e��I���ч���h3�h���߶iߟ_ܵ8��>y�j�m���*)��?�H��b�7� IZ��H*aZ��Ėh:{Z�Ȗx�Mo��dK,�X�pFfKD̴V8�Ke�[��rk��Nw��&�_榊�fnR�Un�h�q�үqS�����%n�9����v��*�ܤ0*�Th�&�]�z7q���27i�6�M�Ԕ6o'_37ՓhK�njJ�-њ��1��īsSC�m���M�ɷ%b��RqK�njH�F�ߪ
.n���~m�ZnM[���]@���ڳbsFl����f�t��Qheb���Ƽ)o o���+�x�[o�&_��^g��o��u�w�ۼ-~3 ���u���yt�9������σP�|��˙3=�ߣ�Z� 8�ޖ�U�m�=��K�ړT��,�p�CԪ�A�
��j�8�F{��	�*i�_�T�7@��s�e3�pBR�'嘤)��b<GR���kLI�>�Z��G$OG@��H
j�j<����!�)����k�'��CG,־Փ��)r��]Y���_l�r��1�?m���JAц�L�x����Tz�U�um��]�M��O=�U�i��E^�p
�`k�G(�n$0=;���e�D̃5�%]��y��?��PdJT�'�����Tj�#�Q�#0���o`��Qy�]n���#�zm���fW�-{a�� �|���e�.T�	�&�x�����D�hUk�~�.�"�3�9��@�h�)���\�zJ����TmX�xPXO�@%W�o�3Ѕ�q��9��&?���e�g���ok��Zۊ��
� eyV�[���-cjC|j"
c�?�\�����p���}B��2�M�fI��V���]�赲���ETB{R2$�I��4�dJY�#��;嫸G�p�s
��n�a.i��~���3;`��~��Ω�S7c��}�A{�������+':�9�Á�bT����4vr�����ט�JU�c���n�xj`�r��mGSen7�IG�D�����[U�-?�����w�@���shLC�$B�a��	c���4�8����?���I�b�F��|V��?�P=�5��,8]��%8Y;�PKEePQoEr�{"pip/_vendor/colorama/initialise.py�TM��0��W��æ��	�R$���eWpT�ͤ58v5v(���Η��ҍT՞�ߛy��Ա&�?��$3&�##�����)����+�*� ���4"|�]����Pp�i�ˣ"��_n��NI�7�o;��u�JH��ܨ��h���A}s�(����&W����ބD�):;1�D�0�������>2��1ʱB�fÄ����Njp
R�f��3�պB��y����;�����N��CmA�W�/H�ip��KnbV�]�����A2��na�۵��=P��@�Avv`2��:��'�S�Y~���G��ve��5����'�ܱ�*��=qspYA�0�����{��L��A	�[FI �u�n����ٌ�M�[g�Vb�w��m�鞗��%<�9�LJ~�q]N�#de<�5�zACܙ��#�?������<:t��{అ������h���� ��'!ݼ:q�Ñ��aVCu��z�yA�4A[�'4��3z;�ti�,�d{$v��"V��s��vNt�׿On�Qpt�.�1T j�"���K[��Օ��&��r��Τy^�&�ޠ��]ڈ�t�M���&I�{;�e��~5�'N�>�J����7���m�7�BS�lC�PKEePQPpip/_vendor/colorama/win32.py�W[o�F~��%����5��t]y��x����p���f�8�_�3��\�I[iQd�3��m�Ɉnv,~��������|�H`G�O�.lr�ܒ��Q�eH��r� ��h<s�$���c2�&�8]y�h�,o�_�䊜��ɗ�b�����.�x��L_�6�sJ�D��O��yl7�^,gB#A���ڑ���8��N�.u(���A�k!X�����"��/1/�f4���є���"J
Ȓx�U��eō��&vp��	��.oW;�E�2_dc�~䡛���l9^r��|��E�{p��Sԡ�x�#�̙OǮ3Z��3�����x�Nfws��^������$N�Z��vd#��p����h�ϒ(�(�:�w8��_��8e�SvOy,b�v2n��r�)�=��r�>�[��|=����h���g�%^gk%����B��58$�*�0���dh|��?sH>�&+��Va��Z���sy^�&xpЩBp�>���nIS�!�
Aׇԅl2�@�B��<��1U����pD���ZU
X���RH.�m��)`{�I���e"�ʔSi�E�ae#�^���g��q�Z�.��7Y��!mw���5e��P.U�]t��3������f>���!��^5oD]�"5|]�\��z��Y��_��:p(�v'I!7��&#�;�/�]�`��~U���J"��{����}N�1Z}i������w��^7�·�n�������Y.:
]i�4���
gDy����b��ٰ̒�g�\���O��g�]А��J_�x�(M�B�Y����9\y�Ψ#3IH�p�k�j|���3ԆoZ�A�]�457z��F�ڍ��B]�e��u����3}I�w���w�xH��B[X�W��]e�ͩ�н�4��ʸ�Z�LO�M5��fa|�S*���$$"��9�f�А0/}B�JR*�8}�K�8,��+rJ0K�cNjۺ5�׹�y�}�;a_jr���d�9=�7X��6«-��9	�L��ԹM�e���Ƌ�3krxk���Y/f%��ۈ����Y:v|7�H)%�h��?ǰ�7�!'�g��}�(�����:(��\�k�
$�W�S�^�|,8�B�x�L���eFe�bl��29H��N��j�{!ЫF��H�D���1�>�z�O-8���o�Z�Qf�Y��eC�+�4[�[i��T/��-ED���t�C��4�ɔ���QK&�A�v[G�ٟ�[jK�}V��n�C��K2�d���
��>=$*�����h�m[<��T<����,�/���Ob��w��W_+��ΐ'?q��˱'��R��4i��r�3��m�@�]�`�PKEePQ�(���&pip/_vendor/colorama/winterm.py��nG�8R	ނ��Q%"٘8N��Q�'���l�̠��`*���3�]f�CW}(/�3s�qzl����L�{F}1�)��H�
NڝS��pz�K�,%��!�)iAJ\_���q�qB�ڔ�9x��X���V��A�#2��ja�)|�i�%�7X��{
�w~}��v�m�}PpG���~���n���T���h���?�]�7g������������Pt,V	qGή�����6�!�� Ƚh�����q��H�4��|wSA�)�G�'���������v�6�ژ��k[׈La2�i,&�FJ��1R�$�M����TT�K"z��,!�Bϳ��+:e
�0��~�iz�3!xd��.˔���wiÑЬ<�2NP�>��<ir�'�-x�i����W���̳�2ե�!��	[�-X�l	bF��*n��n���k��|941�L@�� @��g��3oY�P���L�����~�
+3�V4���%�� ��E�rn{�n+�I�2ՍH�<����Z�НS+�8�V��"x�WxҰ����Z��7-��'��W�.��aq��&K���x٬��s$���[�g����0-�9QJ'�Q�Qd��ŻF7t߯0$V�+����;˨"X�EF!��ti�B���׊�K�X�ˌ�t��sj�.�� 97u��m�Y��c�PQ��+޶��[Q�JТ�Ϻ�6ʍ��T|Y��f-?v�J�JG;������������q�[ܾ�UL��*h
�mb���T��"�h��J*�P���F�����Xm��2F�;����>)���n3/$��7�Q�a�=��bWhhZc`ӝ0��"f�@�Z��,+�؋������ih�29'��{?陏�W��d�X�8�S�Z�Բ}. �\�R�hjoC{�3�ȷ^��=7�5�.e�Z�X�8�3+s7���^Y2�	�J�&1�SQN��&w �Ge`��+��bW�c�}�Aֆ��Y�F�H�\E+S���K�
��v��il��SS�֗D��a瞴��Q�o�
��q�ډ�cqLRU�Ƈs�E��]^�C�˒i�s���٨c"�z	�R6U�Z���w�b���R��[����`������n�w���<u� >�EZ&a);h6��4=��$�$IR�D2ΒM�m-Y��s����`�̩�|[��]j@�F�K5�\�[���M�ܮ��ª�o>��I
]\�K�1f�D͏��-sg��`U����*[�
�Ҥ�C���pt��j7��b�'?[fa��-��ɇ�8Rj�u�_�d�"�$>���Z�[$0u2��"�<��vG���-�t��([�)�;�*��Tm<��%�Z5��czlnN�un?��Ggs&��TӜ���s
`��Ns��'1%O��%�����l��y��˟�U9��Ѧ���jK�~����m쇴Ѿ�������<�D,�dz����ƋT�j��?PKEePQz�S7]Epip/_vendor/distlib/__init__.py�Q�N�0��+,��j��c�IՆ��Ze��ڤr]����n��/����&7H]flB��C�H�`�����-}�Og�l�a�>A�?M-2)�3`|@x=�Y�]�?��]k3�F0	�@K?�d�-;�
B��r�#B�^�6�*�#��,�����}�}�;Px�T�#���W*I��i�$���4�fc��R7
<��K�_S�;�_�
d��R��tNsr�E�N��,_�M���/�u�"r�j�E�C�N�7���U�7�C>8�V�9z�k��o�0u�����5
+��RB���
�;�Ry����T�F~dq7(�����
��H�β�����PKEePQ���+6+��pip/_vendor/distlib/compat.py�}�z�6��=�Ԟb9%ڲ�s�veڑ厦�c�Ivu�"Y#Y��r�'߷����O���V���o���������9�p_<<q�d�͑h�����޾8.W�*��mDp<O>=�>�eE�����*�f�dqZ�i"�R4��x�nn�B����>�R�l�$j2�
>���`�����)��M��˴h�y��oN�O^���ͻFDE"��^^�>������s���-�r)��E۴U:��l�*+h~]�yۤs���'/k��Jէz]��5�hO������wq�j�)�rRUeu$ľXU��2:E	�M+���L�,��Z ��0�yV,���W���p��9Т�9=SH��<}�7�UZ�P�Q��OSzܤ�z��"F�`�$�����F�X�g�e�}>�n���
�'��_j��qY,��WQU#k�#|_�n�p~�w�A���m��k�V9uR��)~j����eVЇz�g�|L�-`yv�@�J�B�[�K[64�9}��P�OVQs[D˔I�S-�@�)N�A�(��[%SA� 1'{'I<nPO�4d���r6QÓ��ф�
|�ô�G����x�[��ڪ���{&s�O\�<єy��҂����U
�}�9��/.^��AZP���:�����װ4�T�|�}Y%��l�ou{�&Y�ƍ�q�+
c2G�ӊɁ���;�f�c�K�&�n�xvm��n�W����ڴ%�?t�����o�"�#�_�q�9�K֬A&x!U�=h�U����r֤US��^�,Ն��v�u�u��,(�\U��YJ\I��ap[֍!��Ѩ{6�/�V����O����W�88�R�
�S16ۄL����(�02�I�fV���4���9�*
�r�%���'�~7����Q�BS�-�_x�&2��Zy�-���vNœ��Dt����@�-�?+wQ����G�hrz�}�VZl��ާ�{�|Xy�:	-l��Z��Jް���T�=�o�\������:�.��p3��,s���o՗��T���K��5ۦh2̖Ҝt��g3]]��6(����LKg�o�W�;z�3���<$M���$47j�mZ���Ԋ��L��/���eʞ���_Hb�1@�GMʤ�y�(�A{�叆!@���7��9kͤ`��8-�w�{��8��zvh��o�(7�1��q������'��
���§��ç��F�8z�fi������Q�����y�=�!�I4�N/�L_��H
��He��3�ܽ��I�
ơ���Y��S�te�̸�S������
Uw�\m��-3�5�Ҧ����8�k�Y�?����G"z[f	p��`*��U�Vo!^�k@s��H�e���}��B�)��
�&�"�Ԅx&�z��&���:���4q���<��"Z�0��7(�9{�`[�{�����@�FuY�Tķ% �|�2�A=	�)��
��Xt�
w����H��'0����>X�pmW���0#C,&��PW��$��(��W�D�fz���̑�|m�A�,�ah��� \*����|�\�<�Q
WDhv~"�
i
��	j�E�����Y|kĨ^B|UQ��
}�
Q��u��ZV,<�e����&y����A�]1��6-�wt#-x(�YS��b�2C��X�8��H�&O���%��A��R��˿�W��.�
,CqX��Ys������<�?v'���OC��ob�����H�.��$8�`��S��`��2�*h9Gy�7����h1
�\�U(OL�שK�3���J�B�\z�S��7�����!����#ͫ�1tAy%l��(I����Qw*���>�)@�
K�tV�����G; ��L$�����ƨ��?����!M���=
O�������^�����61��o�1;So[���*[�q�7�!6|(�m�b.#A
0t�x`��z���q8/㻴	o��l���D3�P
�,.�'�~N9B���ɵ9J�cQ�Q�)����B&‚��cT����8��tTwM�2>	XI����*���3�A�E[�Zwh^���&�\�p����?F��t�:��D���Ȃ������a�BJR"�H�o�r|�b~������o����ޜ�>y>�DPz��SV�Z��tP�1hȟAg>˛��:0t��.]O�[$./��$؂
Xy����CK���n��{�f�3���U�\E�j_���,�5��x��'�
r�����9�D��� $�E9�9�
+7Ȣ4��?g��k?i��?���q��� �U�"Q"yT=,;p�ڃ��š�m6��F��GO��(����Rd�ZM��?�s;ҋ��o%��2���t�Ԋ[���7~ �.lC��c��z�ɤ�����?���0�k��0�
,!`OU��A@'7��<��
�4�z���i�d���ޭM�s
��o�g�!&H�H�����]�
J��6��3q��Xg��@k��ɲ͛��E]���ј2�^�����������G�M��i��p>O����*R�e�\�mT��H�C��͌���=ɧ21��� ^�c�eV���_���|�R�o�]�����"�p>�����H�zv�D����a9�&\�)����
�E`�T�V*��("�2L��F�����B�	�{i��B�"e�bﶆ�����fUY��!^�	a��QA�W�{
@P���4�<qDOS���1�9v #I
��#"�J)�)XL����Y�d�(��PBp?1�p���M�����6@�&���$��`dxh/
~4�G��`��xS@"��ﲺ�����H��l�SQ`��E(V�r
Ҟ�+%a�F擦e��"/�;�ە|$�"<+#a�@��u'�7��#�a�%��$��¶U���|�Ji3��-p�]�+ʅ���V�Df=ahˁ�2��>�z�{�d4�q���
�D?��=���	�6=w�ި3���9)	Q����"�"@@۠�A�<�ϊ�OF>o�Gw�Dw(��5����]"K� �}�L�aV��=�v=�#$���HSd_��r!��1L���G���h��X��z�T@f����;�]1f$���i�eu?����\D������oi�-��6k��p�Y*�������M98hpW���=�*Qk^�Fr���j��&��JB)Nk�Տr�ڒ���-d9Gv��z��������M2�$����Kɴ���yv�jIC��� h�K�E
K@�.�;�3��-漁�u)~�ЄlCI*l�A��&F�)ƺ5����f�gZ�/��h59��թ�`��)���Q��e�� J@X"EƋ��GG��w�Q< ���ߎ����I�kk�'5daF��������^ֵ�;Cy�-��\���3�!��{\^��l��eWTG�+���Je_�Q5M�C,5�cR���ǓawUA�Y@w��cw�q���C�k`72�����l���
�� %=���'�^��b*��a�%,W�[��\I�	�)0@(c2�	m)��ƀ0���8�3���?�*X!���l0�C6�"n�룃!�$[n�])�l��lv�@;�{�E2�S[*krs��VF�oǯ֯�cR�]E�W���ٲ������h�������ڐ:_��v��0���H���A�Xv]s�Ї�a�BT�ꆉ�c��ߙ��F��Jl).�� ���u!���eC����J�
F�&<��v���M6�|�� �S�y�p5t�=����_|q��F]�����b%����TvC�g��65'�@���ޒ`���=����(缐�T��] ��q�
�P��L,)-hV��k�q������۱:��"��6�b�?b��_����?1<��ls��@����yTܠ^
�Ϟ���\L�Ċ��kJ;<i�"�K��H����d
�\�V_X���6V8>F@Wq�(n������@����y�p�ɴ��s2�v=�j�~
�_M�Fv"�E*n��
�
�L��mO�b=��	�x��G�c�$�t�x0�B��ّ���OLB�B�H���KB��UB:)��.-��i�5Ir�0�`s�S�u����o�o.^|Ω�ve��J�t�$K�U�쥏�ˣ�Տ���������Ȑ�9,�9JQN��*�A�m?�t��o$t��S��_�qhg@�h�c��l�D�*�/�tFl	�M�(\>�ұ��h�1�q0�rN�q&F��F�h��t�	��
���B��#R��8hV����/�o�!)�M��΁
��h��sE����`��<sS��3���.�ߏƪ�G��猔�lM}[�y�o�{�܅|�H9�u�Vq�9~!NQ�i�
�'X/�[�Dq��q�*�3�G�Q��5Ɔ�]	 �L;CQSVFV�T�	�i���2z�-�%���X��&�� �D��Z���M�gu�Dk���R:xD�c�[*����Ӵ��\(��0k	�噶kx���
�^�c]�#��h,�*�*]<~��S���S���T�J��tT�tB��t�
h$�����",�Q���!c��0�NP�E[u��&�m�X/�	WfO��d�#�%uvC5vj�Ϥ3f�:�2�>��a���#��tu�)j���M��S��T2��)���6�^�y��@b̉���&��Kg�P�Y��|B���j^7�*p�Po��'W����˙����e/n4`\��v��Ȋd��8�k�}�\j�Z��Dg�$�e�)-MŎ>���Q�=���\�)=��ja�<;?>=%�+8eU���UNJ
�~�b9��)�w�� �>�����-k�8R��^f5M���/��$�]���=����n}�Oկ㐫�x4Ր�)T��.��Ί�Øu�O�:>0�� ˾��h-"q��z���%�œ\;d*�r���e�7�f��r'�:���f`O���,���f�@�7N��$���mL��]Q�w����{�G��#���#�ב3lt�DĿ]�([tJ�[JG,��?i�9T%���"܍11ǚ�����ӥ<�>��f��{��!�6��{(��>��Ʉ��_-l�!G3�h�><�0�pL�	`Ì^T�SZ(���/�ٛ�=��
���Mp�)��l�i	���r�D0�M=�}�������f[�va ϰ>����ɏ��p_�����x��r��?�?|)�9Z���H�8ty<�Bk�>�bw#P�ɜ�K���	�ө������@��D��n����m܍̰�
�FY�m���Dַ�A�Vz
Z�:b��qyA��-�-��ޝ�?q.p��ru�}P��C���0t��c[{�?D!1�K)����=1XRvQ��c��x�B����<�\
`�W��쬪y�����z����ih߶����a�%�fJY�	7������غU�i�W�(ڏ�!��{}�L�
֢ ���	�V�m�h �-�mFN�8TF��Ď#���X��L'�&�
��8��%�e�i��^�i�'���L�o��!�hGޢ�ɫF�>�������ap�s#n�JT�]�Ò[�Y-�Sp=�sF��Y��Co%���JE�~3V�o�L�tWB�Uci@-�\��d��
L�,3Ģ/��x�����*�΀v�f齑����/��^��K��gu8�b��,x���:�b���F�E��<p"��,�F�!�x ���+���՘6����e�LJ�<E�4_C���X��DN�|�R����ʚ�Vd�9A��yʶ����&t�1����x�fܢo$Cߦ�B��N�Z�ר�ɵ��k����QC��~�9�j��gF"�5�2�̏���*��M@�A�_����k�/��>Z�� 6iTS�"�G&4}PM��\�����'=�����B7A�+I…]r}%>h+�&�Ƹ����b��z,��l<��a�I"�A
{)j�~�ZN����%�ƭnW\9�^�j�3����2:��ŢPMԩ��[������>�F����2���u@9U�4�âq~�8��	Vi�����6�o�
�@.ar���7�V��
Gv��j�z�0�z�b(aٴ���z�O��'׻�8��W�y��1���|�
�����_':N�I+��wFʠ��'
��V&���� ���0fy����j|��֠�j_*=\y�H&��z�0n��B����í�\�}��L�;�<!{	��cg��@x�-j�.Vt#�M�$�:Y !a^z'��@Ew�&�	?�����m�Kg��e����2��?G�M9��VX�j�[',�IaL��� �����.�tWM�3ə��_�ɚb��|����",请�o���F�$i��;M`�S�h뾽��L}e�RX)ϸ���-�k�[_�yخ9�}�8�E����5=�����C!`�ƻ
_���mjn�F�� Ye�
�xm!�>�Z�t�P;7mbYkR��M��N��%���@�p�'�)6^E*��Z<�Hb�-�Ȅ��O���*��դ?�V���{������G��D�w���[��J�|�d��&eM�{E@��›���qߦsl0�Ux$��������?�4h?���5�]���B�+8nѹ�no��ld��1�q���Ww�f����F�
lx��i7#e�?�7C��C/���m���D���$�I�Od�ұg�i���3������0܉
A:�W�8<.���}�Vi���}��O���b��/�R�����آj)����S���ϧS�yEm�Z��x��+�J�1<Kg��6kX_gE\V+̷��"�h�=�V2�丹��&�NWR�Xۚ.&PI�\���f]#UoPI�wYz?��J��S�SƏ[�2n�c�A���7=�B~fR���*<|����@`�N(��3�Y�M1]���F92=�r��^���I�ڌק*��Z�'b����I�CNo�^�mv�*�98*��dxs
�ށ�fw]���*�i��#x>w�79��)ױw�2�)y򬸫9����uN5\xA	%��tʑ��5��H�A�<sQ�+��}m���y�6�~�o��.�4��\�A
�Y�M�(�)���ˉ	��7�EENoS͚�R��Б�*�sY��^�|7/O~������ϫps��;�lɔII�Ƥ�8�n��:G�:���i>���Gu�`w�(�r	?%�}*	���Ak-QQPu�5b�9�&o!W��	��!���ڨ�b;ħ�����x�ݡ�D�uU�v�j�j2�;���Wn3���$�PG@��B��#�].��T�hϯ��8��;Z�<}g��1֔�E5�Qr�h�l��O�l*�����KQ&���lm�UsʗCb
M8gQ˟h�q��
o�T�l��[��p���d�����{}k��ě�$��A�I�Z�<��)�ˣZI
���Ǘ�W]��ZŶ�9�Y>z��ɶ~�CH,9/�(��^�w`�1h֯�\�?���<�GnQ��ϩ�N���`�浔�̽ȑ�N+
�(�B�U;2�,�*�����Dm��]iI�l1�T0V�>��͔?�;��8�
�e��F�+��{��$�K�P·L&�K�Y~��C[�19��*�U���n$jw��/�rz|x�ΰBs^�ɦYm�L�/�i���޳}|�k�
Ӕ��8���^{(�=�lӹ?�����~��g�E	a�׭`��dCvyԟ���#͝���w�ֽ�%Rm���kSR�3,k�;k@h��B�w�m'�.�H��-0t��̼�_��b_�9}q�\���̰�����۝/�L�Z1'�dNJ:y�-ܖ(�G"���*]'���6���K��=��ą����.C�y�Ⱦ��݂��&���Fx��L�o`=gOf�Bn�C���;�4�����f��&%_X���!+����E�͘b��{Q��Ҁb�g��T�E�%,�2�&�ho޳r��F�5s ��:8�e��+o�T
�Qݤ������=��n�q�lG��Dq��P�-�����t��q����0�$����\�i{�ly�L�l�7D�b7�X�TH4z�7��
O���+xC/��=�H��2K/Cq��t+%�Թ�)]0e��ɝ�����i݃vKI��Y}��:h���gd�N�$=�R��469Xں��P����$<†������Q����B�c�d;���l��{�T��	Vy�{��p��H��	$\Q5�$I��:y:sNW!�ӏB�K������bfF��}_|�e��J�ݧ��@��r��|$zD�u�Q+������iұb6��B�$��n�ǧ�/_�L����ΰ̸�g{97.��cb�U��m�FUK���^�ֻ�y�)�+���P��5�
��U��f�R� Lo���B��@���Q�Z�2��H&�N�`�n��S��B���r�\��~;U1Bw������M�UY��ޗvu�,	�ۿ��y�E�V�y-���/O!o�h������[�&ʁ�?�Ɲ��y���!��F3Cޯ�b�N���Ł�V�S�]�K�	������njr�2�����v=bO����f��䭢�����Cs�}t�e�I3I�bA<�����xdd�Ș���] �|�yU�a��V�K�y�=��1�6�}Z�L�]����5��A��3/�LmH�G<pe̽/$I�99yo���R�4�*��r,�9G��L\^v���K;l1�-H֠�n���;�����X
�5g�zR�[
J�Ø��O�՝�*i�ߎu��($P#�[�jV�^�s���R��'�|�b<>{���_B[V�XS����.��#[��H�X1���w�E���M��ˆ':��#<�M��<�f��Q��w��/ZŒ5��
�Y��6���q�\EUVc��"��z��^B�5^@ܸ��d����wy%��NA�96��%۹�(r2��G&o���u�i�^�~U��.�t#��=�R��wʎQ�����{2�8�^F�,
�hF��R��JN���eWTV��V*��d�n.���*q��3�}8o��1ShX��n�ť��f0Y��1�j@��EI�$)�좴�����S��R_0�)�	��l�,�Rpv���ˋ��'�ݗ_F�_῏��_=��|���j.cP�M�K�A��2�L՝�CIƻ��/�	|񉺌A�_�H<��1�J��u�%����J �Ბ��ծ�2I��tr8}�e����{�kz�%�l.��ERXX�Gu2�)	�I��y�~x�\���Z[:�8��-&5�
���jY%�V�X�M\0��k�"�&�Znb���C���U�]4�G��9�ۗ��NIM]�C��G���,�ݑDq[�����e7��=��Y�1���:��y�+��F��[L[.O���O�R�~�����wp����C���&"���K3��p4�t�(ޑ�t�
T���;��^\T��lNhx�]	�.R���SϦ����7X�57�]���w��!� ���Ԑ�4�ק^�#�v��b������rg�w3=|�p��ª���'���CsWy#�Z�
ʛ6+M��~�֦Z���ث�앛%�f��xn����l�/΃(�gw���5J��~���9
w^<�]7\����i�sNA�<V��\ta.�~���u�˾jU9>{����ճ����/�K��
����:��ݗs^}29z��Z_�'�3O]~��� 0�8��O&���lx�C�ӗ�O~�ui�����ϧL>��CB:W����og��|����ڍmNjj�{��j&��O�2��;�
���p����d��/�C��,�LT0��ϋw��(,]���p�c�{��PK��ca���ߦ����{ͭu�/��%S��wt�@&d�Ff��X�U�����5��|7�8t*(�7�٣i{��Yu7"g4%��Ҧ���c��+)��{�e����l��`
+u���2�W�{;�Xl��v��G�nO�6��M�u��h���C�\)����^S,?5S`�t��_��^5o����}�*xj
wq�KSEq�/K��(���(���F.�u ����^�em�8�E�2.��|sH�P��C�},*b*u��KY�Ed����N=c9|0����)(]h�T#`�Ǖ��H���%�&�Jl�	Z�h �����W���L	n�1o��#�J�$3L� �L�
/l�@�
m��rY���2�[qێ�H�蹅��ݞ}hy�]6��Lh�y��tQ�����!�PTEov(Z<�,�~���G�k�S)6O�&�JW���Jmf�n댐�H�.G_l�����l�[!�<KI��$+��"|:Y��ʼn�㿃ֵ�K�M��^���{���M���2tԎw?�04��]��s�ў�Ó�e��][kc���Ag���]�r�#'W��--9b�����o5P٩Be�'�������t��&\1�����
�J��?�^#�?�WO�����'E~�$�8p�Ao�r���ʉ����hX�%��J��ۊqҖc�<����͒h�a,m�0_M�����W��Z�y-5���蓟%%�i��yK@<�)aR�uS.7Ž�CTn&5��=x��^4�c��"�����טq�H��q�־��_1{d-VLT�xl�@
^;�c[��1�*}o޽���3��~V��\b��P��q#JU��]rp7�HƁ�կxm%�b�`*��NׅS���p���`�S�WT|y��"�lb�4Y�5��
t��U8�v+Ȍ�$ī|���fH�Y��PKEePQ�@c��/s�pip/_vendor/distlib/database.py�}ksɑ�w����h����oi�3�X�N�xf���@��a��� 	���_>�h���ώ[�="�UYUYY��������Q6oe}u�m�������g�zۖW�}6z6ξ���/��?�>\���n��}���Vd�6�zQ�eSO��{!��/���~6���ٳ7�?�{���?�y��v�=z{�6���d�j]���{O�m��f��ߴb6�6M�g���	�YU��-���@>�,:��W���w�[݋��*/�/�Ewm}���+@�����+��E�~��_�5�%';Us|^v8��\�qA��]�i碓-��
�����F>�m���+�Ϻ�5�g�}_w�5�*�Vgm۴��J��C�z�^�&٫���O?�ξ}���髳I�ÿ����������w��3�0��o���#����V��)[��I6/`�ٺm֢�����J̀Ffr���[Q,f�aw�쮅�7_����;x.Z��|؎f����rN����-/7��$����zh!�C{�<�&�Ϯ�^��f����-PP�愄&Z����)��K�m4cT�`�g?�}���{�bh���x$W=�����y����hK���U5=x��j�����8}���]����ٳ7��������繿7����=;{�IC��~���y���}3;���qJS,�0��yUt]6{�2j.�~|Lc!+�O���SQ�*�k�^�����.�la�@�[�%�.��lԉj)������(�����H�\L��+��n���6kj�-�60���i8�;�B��_�ϸ���W����}�O���+Q�Cky�
��Z�p��X����ﲒ���2{�c�Sp�;�d`��bA�Ў%��Xd���8k�3�c�+ŊZ���p�Kj�ȯ�ϵYձC���s��#,���]�mXk���u���?��@ʢ^Џc}|
���wb
��+��άY�D�$�����F�v]ΉjA�������1��'���'s^m@�����������iL���#̓A"1V⪘o3BJ��EF�f�7
��)��2��#2���o:XC��s-Q�n���4{�����b^.K�H�C�9dqla��~h70n]vweU�$hn�u ka�m-�����q��s'���+T�hӥ���x��[��%R+�2��L-'-p݉�h`};�2�?Q�a{,�7��ˊ8Od6�[�3�h�ryTQt��@�s��m��EF��tQ(�춨6�I�ϟZ14��R�F�D'�aǞ��;HG,�}������@R0ԸD0���[xږ�Z�*��bs[�������$���<�~Y-��)`v�<#w"�0i���hu>+*TM��_�y|N���,��=��^��l$�WS~�\\�E���M�o`g[��wcD0(`Xِ����o�_��`�J'���ٲ���QߖmS��=��
?A�imr>�I!�,�)�z�S�i�g�~D�����L�(�1@�p�8ܑ�y�r����i��RQ�b�� ($dA�ک^�;)ruߢ`�>!x��|4�g�N
�E�L�Z��W4�T��5�q|0j�x�I�Uh����#����Oʾ���[��]��m��8�(i�����MY�N�a�mV6�<�pFI�EYL�����%0��h�X����h$�MPQ_�xFӢ���j4���_v#0�|#�h�'���'9�:y1l/O�rs5��є=������k�F�P#�/����$�H�̖��?@��OHP]D�bT^"�x���b��!g��|��o�6R�{�e��z[��5�����Wd�X7�M�v�6
��5V���G@`�q]楔X�,}F�Nc�D��A �'��G��I��T��ւ;�*E�����=��dQ�V�\l ���Js!��/�B8�M�zJ���D@��߈j�\7M�8+<�0�E�h^urC����	z�
�e�Ì�E�tG	L�d@�&G��MJ�#�͋5�bVZN��n����(�����5�V��bn��{h<�ƬF‰೅�, -xj|t�
'-[�%N��H��D0���M���������c�b�q���Y5:h�U/�v�n��V.��12�"��KhP��@c^�7+іs=�	�U�֥?����o�Bο#�}l}�KTxb(������T����߸1p��6�bk9t[A0�z����pG$)t��..�CȂ��5/D��5�顏I�)�lTw��K�%�[
���g�8�Z%�<#��Ido��4��+}��a�8�~��*��[he�m��m��rA��n�`!,���%d�\�Y+���(׆��-#����5z�[ ��}R%n���Ɏ9����o2)U 9��	E�T�m(����xb+�K)2'�m�k|_~�D�;1(I�����tO���헚�j�q�ƨli}@G�rS�e�j���Z/�V�90���g[7٪i+[�:�ˊ�5p	�P��k�����tI�8��x<t�?L�A�0
�Q�F�'WyBޒ(���;a���B݄܈mv“�S��{p�>���ig�+�{�hŧ���7%��3ס0`�EƤ�����y8��;�����3�%]Ƥ�-�_o�1)�la��	�Lt��	H]Ոi8N�����%���竌KAw!��_7��_w�Au��kh(��ϑ��p����@��Rθ����hj�nHJp�d9't[j�v$�"`� �
O4�f�W
�z{���˯�����9�H��̯ɳ�8:��1�o�v���g_�L�ϣ�I���t�<{��\[ɵ���L
l���/��Q^�@�<���mO�	���ӍL�_>7
5@���m�5����J�mq[�'���/���
���Ϣ]�����V04�N��4�N��l(�	�Hs?W��w�A���j��B����g�ra��G�� ����X�xW�%D׎�С�:�T(
M�IXmy�a��>�1��T�m0"
�>_#�IB���i:� z��ǖA�����'	!�\o]��&�<q��t�EO��u�K5%���)P9ݬ����	
�,�=��&Ʃ��3B\$�h�0-���c������/p�!.�G�=�12� ��`(Eۗ�MU�x ���P�pG:Q��k}�~g�5 KMH�l5��$d
%��R�ck{8#m'��o>��K���( #j�U��BI�)�4�H�8y�X�{���rK�w�mf��h�P*��B2n8&(�ȅd�����ˬ{Eg%��+����6]�b�.���	|%��;"b�'^�K?$����fα�j����K�/��/FH�z�ձc���
`C�-��q�����`�K��Z0�#�YG�;%0��<��X��<�f����h6���4� _��*��Q���1�`���2�@�Jv��j�ٻkڅ�K�W�7ŕ��-j�=O�IT�]-c�*�S��H�����%}^��0#�qP�[I]^�$�9P';�Ks�m��<�� ՟ni`��SǫH-��B����3��y:�U��+Qd�ݖ]c9�ҫ��|C��U͜m�fN���?=�}[t����K��˖��0��Э�_��۱$�r�7@thO��ɹ3��V5�b�i�.�4�&�qL+=�7��IN
W2�JEʑJ�.D�?���K�
��M(v���3y��Q�zLH�3�;t�sH?�kU’+4ցu�f��td����U��̝*��r�Q'�=���rR>o�.�d>q(v�Z��釗	J����ƕ��k`��e�����?R�}$��ĺו�[�
�։&X�P�7���T�0
�ERVD���]�_�c/��J�P�#�4C[�B�j�F?r���d��
�e��`$�_L�D�_{���Ʌy�-�ZX�	S
���$cNubq���T`��V�$m��Z
Ч��2����i�:��7=�?�8��9=(&�����M���:��Վ�e���[�#�
)�xJ�k	(-7(_U7&UC
�xƪ���Ld�)r�Qk`H!�2���Ä��%S���AW��(�Tv�n�O�1.Mgǐ�q�c=|
�;j�k�3O�b�Q��5<25��Q���<����b\����D��y����L>Z5�VbM���X$]��m�H�1�-�7���w����OZ@��S9HdcGj9�Ï�?�)��8�5�D{)<H�-�j+b��N�s'�*����x`)=Q�I�8��]ʫ�|�z���c~��u�z{ђ�,˿���IY���dʥ���ڀVު��A<�4�BQ�UF���6�ey�Lv����������2Nw�e���L�GO�?
iH	����栬J�lS[ͱ��dͷ#�I��j�5��fN��%�[m�����3���B�/}�	X���l�&��Z��Z�nq���Y��ʵE?y4ʛ�!��f��7͈Q�Hbͮ%�:Y��g�]���-PC��)����^�`K�����R�yb�T�0Ch��BHQKd~QF��"��K�*�"A�jt�*	�s��K�#�ZRi�2���}��\!�rMd���C�u#��;�H�df_�_ZJ;V'���u�/��KL�)�LST���9�j�D�8!�v�":�7�X�db�&ƕ�8�0��Z��g�H��<�$���"�쫐��L�d<ҥg���39�
�Ԟ�A�1�SM|�[�:��I��.���ݻ}:'�2���.�k�I�%�ƹ3+���
�*���y��K3;u�^�?*���ij?���^n{��!��Zk��Щʁ�\�K襑4�*��4����E�|Mo�k\\��u�y~q��M���+l$�}�G���g_���_�x�ap_�F�r��bg@��5:~�>_�^��!��0�ੌb�b�����UY��v)4�'٫�_�ǹ��HP\�ttL�x{IbS���+�p��=f��Ks_	2X.
0���D�(n�T�':�Or��vmnO'2�o��H#��
�o_y0�@���D+uU�P��`��M�3�d����;њ�7q}m����/J���͸��]��R�.��J�XNg�-���y=��A�򢛗e$��I��#��:���&��$Y���p��|��&$��������/#P�_���GFp�o��,��V.P�@��W7x|�AI�X�	2D8�q~����8�6�MEr� j�G��؏����g:���'&3/ύ+;D�3��4�M�Y��':E����;�9z�D��r�zS�EYa�+a��+�
K��u�~=e��L\�8��l]!z�Ω�G�t�`RS�)�0/;4RO�n�8� ��RD{D��Z�*�l�ŗJ"����0'�D��9�*�~�tQ��H��O�&K����;�Tm�w��'%�z*���c�*� 
�w�ֱPE|,@AJ��$�)�v8Ek���f�5\��ux�y߬g��֕����{@F7Z{>ڱf-�i/sڝe$|�7�Y,FF�Q�</q���	G�nb��w���-���y~�q������~8e�83��	<�a�t�v�
[w�s�Qr�(�H��1�.c�OC�ة��o�]����ʿ�)�P/s}Ճ��c�lE�-��fBf���3�8��sP{Cht����;������B=�.�3N9�(`��Z/U�r�����H�k3���֕�F�D�!�ě=k�yxf��*�x��T�p��R-�2���:����W��A�ݷ��Hq���q��掂	�W��UّI��ZU�+�oQ_�Q���'ٗ�x)�\*6�m��#A��~��G;>�1�jyey!��d����i�O�	��D"����pa��,�!�QY 2
b[�8���TF�[BRs���/��
T�w�	G`P�B�y�+
�f[P�/���z�a;CӉ�O�˦�B`r\ɯ81�Flyq�6�m�b�;��_�ё�m��@
zS�s��i���b������*���Y�d���]����]����^��tw���.*pʽJ�U~K�Հ��.�U޹(eh~p���.L��I�!���e%
��Ym���wQm��*������Q�Н�)%��|8;�K�ӷ/8���V��Z�u�-�����K��F1>�+�F�'dL7�Y�Y�6�&͂p(��L�kJ���%��s�h.��u�3���x�e�v�
��L�HJj_��I,O���Y��?���>��x����dF4�$g���qED�L�I{&]�+/��}��RYG�Rf�%��A������!��Q�=V
�[��e?..F������������j!��dy�I��n� [���˹1q9C��������M=Xޖ�L�c��K>s��a�\6z-��w���Ƅ$/v�ѝ��k�,\G/j��@]�`�kuS�^i��e��,RQ��V�u�H��u)�`/ӌ̄
��5x�m
�"����$tmn�s��*Vk�u,��(��-�����n�!���+p|U��q)��
�
���a�哦���d0���
�Lvtjǭ�s,s�6��o��EC��zӳɉ���vR}��o��)���n�(�5��@10��	15�0�9|)+��v��~�u�_��U$B��˵��EkwҤ,E�#��B��p�|�SE;]�Ā�T��Q	��6�����l��v�R�1/>5���8�!	OM��bf�}V��XOc+
V��sbcB7�
���!���)ؓ���;�h�R�k�Z<�.��Qd�۠�c�%�}�ﴰ�B��L��v�l��dP�4;C��+�ҕ�|���u���t���F��+��d�9�ח#���<+�PY���6ZԹd��FAԬ����b�e�"��De9S�
����>W�)r�~�K/������D��Xxx����Ѽs��^�!�éR������MJ]��ge���3T���Y��J8r�p��ia&%	X���2v-�l �cQ�t�&VE'd"�ق�Vg�#i��'9ͮ��qO���' ��� ���e��D$���Eq�D���XJ�x���!��N��~һH��=���`1�v8��k��#ߑ0�:����E�,r��[�����!sV�$�|��Z^"_��(�D�Қy�5Y��'zMs:9�gbJ+���F4-�T�&�+���%��[Z�	/;;���$'�e@�l�jx�.�tBBA�M
��3ʲ7��e�s���Cv�5HGh�ή6�\6�f/jf�(!h� ���Ф�(����߹�#
��4=� U�Tʾ,�\88�:X�j���q>hFN����E�;w���R,LeV~-�����q���fI�1q��:(�{�ނ���׺M��XM�����;Q7�	fDW�sAo��X�����ч�-���pߘ�U�,**�g�9�i�4�f�<8��D̳�{��i�����9+�=�4�
����v��;�E3��@f�c}��uaT�2��W��:*/�ɟ����~� �8�Ѿ=��ڵ���y��S�8�O<���D~�7D�6K�c���g��V�KeI%KV���x�u��M�Jk�0�v��g8Mu�0�VF�ё��p�v-�Gfd�I6��x�n*G�;�����tK6�G�O�,mLs5|Xֽ0��Z��,d��XDg�r��*�F!����'�rX��US�vG�F�½�U��}OQs���t�H0L�j��m�#�<_h�F7&���;���"�`���0l��l��U��ސQM�+0��i~qq$+���]�`�V2��ޟ��c�#
��/���]~1#�V��3LG�#!�N:�M<\��p2�8����N|x�,�G�Yf��+��?n�n@���u&J/���$��Ͼ�"\� ��i�Ja�D&�%�8?��8��~2��i��q�R�ѽ�]��WvH!��.E՘����X���l*_i	���"��)�R��"��gt)5%v��p��~�MM�����u,�����*CIC�ٝqv`ܭ����/^�6��K(wݚ�֦����]�E�s�����d�M+\�Ԭ���wӾ�0kA����&��:�^�CMRoЉ�Y9�*�ݢq~s�u߯��>��M�Y�6��SБE���c"P���<NUf;Q_o�c�p�Y�O���L+����e:*���>0�J�A|5Q	���
�!�^����^
3����`�F
qq�?�;·~�r��D�J/�ւ�j
���FVN�	��,%�
�a�'dMF�⛠V��d�V$_�<�pp�Js���d��a�T���k�V���<d���bWKл�<l�x?8�K�c��.�6���3���)s ��_�Ѫaxf����~��y��:=��b�5�q!~������_��	�e��5�Azb��aE�U�y'[Q+HU�2���]媛��)~4����*��"!� �E�%�8���Xq����Qƽy�����f.1hޤ<��/��?�f"٭�pt�c���sS>�b8?�՚'�^���ku�K@�3X}P�0��U��h(~�/��|������^S	�ysU��*�k��K��Лa[YJq��P[�$�KZĆwK���U"�O��){��}b�H��Aƥ��؞�Ȥ�'�u���ўE*M��hj���Q"�fW;�����r�%v��q_r����O�0{��h�����&&/k�e"vKc҉�-Y��ś}j�%����I��)�!TН|�j��؋L*��z�k��cEEDc��*�5���1��'�/�U;ۦ�HW�٠g*��U��s��C�a<ξ}��3���E��۩�D-��Y�.7���0����~��m"�Q�sC���C}�&�oB�u�;�)��Z;��y$�d(�\���^G�6~$��Dw���g+�#���k�I��V�|89���x9��b|"܁ߤ��,"y�$C�'�9�dR��L��O�=��L�:�	''M�<�����9�/�=u��Fy9=3�c�qc-��<6�7kzL��X�f}D(�Te��x��H��{�E/���rj��d�y�~�Y�0M�l�;̜����({��K		�4�ō �n�l��_������q�Ik8�wT�Q�� `D�m��R+v�K<�e������C)�`3~�,��=�zXDs"V��׋l��;y�X�;R�Cx�Z|C0��~�n�Rz�,�-k����R��E�w�n�H0�^�{](�]��/�F@��s_�������ӑ��y~�Q�X�vB�C"*m�aB���>ďmc�Y�PS"wY�bɣ��G��Z~���䋌.E�e|��C	H��b�����^	&3�F��cXIy��w��K�h����	�>I~�Aw�w�X/��nm���x�%��AZ9S�Q���N$�Q(O�8�9=2�†tI���D*�`��X\���F���~`����^�&�Ka�`�7����@�EhiƺЫ���mQw�K3�*���
�fo4�
���w'5#���]��B��2�k�""p�H��f�ݔky�/���M�O�&�e��%�?��Kr ��;r����(^?M;2�e��p��	��a"��?e(L-���8$�$�s�T�Yd}���M�ߵ�:��w*d�}�fv�]�V⼗A�c*�n:p�<�.לf�hi���96��X�Gf��X3�r_���Y!O�@ngU\�
�Yf���Ѐ�ˊ�e'�{C��bqEv.�Q�C��ҫW�1���-���
H,5������	��=�岜��"��@HE5�rT�[wv�(��zaG�9��kZz�
�~K���E� ���>����Ok^	v��jÓKz�kQK�	7��2Ղk��[��s�[M�|�3�����Bv�%���r>:IF��87����x)���و3��z��h�b,V�_gڥY/nj�Ǚ͈<6���)�:/��r���lOe��C�ɡ�Z��j+I���鱎��_�-��SdVT�$�V�A.
�>1•.�!�ܞ��H�o��?�w ���<?r�'�V���+5p/��y;��mq�z��4�C�0ؼ�Oٱ������'��g�!��	4Q���¸{�Gm���۷+��Jt���2_+�����K��m���
߫�6�^������B2$GI��0��`*kiTׁ=�:�T`Nu9ʿ9V�4�J�4�q�=��Ӹ��4z����u�Z��#l�n;Y;���[����9�-	�ޒ�o�H o��;��%��mI�}��y��It؈j6=�_�ȱ�f�4S7c�V���ps�,J��ckVꝖh�1ps�"M�`p$�@g���U�S�2���S�Z�WD}s�1#��B�B��yБ�?���\��<:/q��+������ח��I�`�A����+����Y0Ek��9AK�%Y2�Ȟ����^3����u+r�.mV���`0r�`000��FBO���iH����i%��H���s�k��k�}T����B��e8 �gqqT�7�m���� oA�K���M-�?*�Ѣdt:���~���/L�p���y��U�DV��~c�_?#�G�ܵĎ�~���#r�q����n�������џ2���5/���O��6(Dli��w�I{ �������d�ئ}���g���؊'�D���]�����s�ãt�˫yS5�m��f�6?-�l�lt!�4�"AfV�wb^��<�~�x�fUα��ɷ�EO.�4�^�R���pR����^����y"��s���6`|������gm�7�N�N������Ԝ�)g͋
���M�!�y��+�\����I�ͷ�jW�v���^7��]���͛�V�\s3�Ry��T�a��>���*%rne�FAl���ѯwǮD �h��
]�ݸyH=��Aб=a�ƨ��9��$y�m".I
���M�Ż�V���VRpb��?��+��C�;1*���c�Θiݣ�	���!]���t$b�]}Ez��c����v�|k����e���{Y(�E�
���b��ʹ�9w"�JA7�Х���G����[%�'6Ea���x���I}y��d|q����?Qq�lOa���b{�k[/��|�cgb.�	���+*�qckJd�7�Ͷni;�$TV�u
��p�DK�>�(6��yn��U���^����ћg�e��f1*O�k���|E&N�t�RY<V�#
���A���W�,2��rSV�����@�H�a9����bg�\���:ľV������!7I��d3z�.�!On�'�|f"��O�$�`����N��C��ªA�q�W!�.�Yaڬ�8ԡ��adQ���1.��!�j�}!nga�1�W����hcqX�F� ��M��֩ba�%�빾��G��˥R�(aۿ5������S�>�UQԓ6;�����u�ݝT,
?2��I�C��f]���
e��F����n'G�-/�!��R�!4�45�f���aD+�$3E�Ԭѿ� =�<�f���f��Nl�b��T�`V�ĩ�����l�rR���əI)5�K�F
wj':e�(���NIv�J��|�`Z]��B�RB�%<9��C�F�
��F�����Kܛ����2&��.�ި�]�h��	Y�_�"�����f��T}�H	u�*7LMgg�H.uA\u�|W��׿�ډ�)�ݥ��!��fѠZA���Qw�zT�LEwM<8ƙ�l�!4���F�/�uc��t�+�*�fN����|�j�Zm��D���Jυ�=4��Ƹ:i1�^�XO(����B3�r�x��s����vY['H
��?����Z����ot~P�Ak��C"x�щݬ�����Pq������O)<A�^n@>A�X#H�Aۆ ]yZ���
hVW��t�1x��%%�`U�f�1:�
�!�i���g̿+X!AcC�:��j��*'Hh���_]y�T���z�\-�$B=k�L����OV�K��f&�/L�I
o��6G+@��PKEePQ��.�3JRpip/_vendor/distlib/index.py�<k�ܶ��W��5�If�Gڠw۽��l��X���k�h$��I��v=���y������ED0��<<<�sH�8��T$E��͙�������C�(�Zm�F�/f�ٓ�_���<ދ7񏪌��K�ȼ��0�0[)^�Ͷ�śbm�b-ŷE���Q�n�1��V�)��FK���AXo�//_\�zs�F�y*^�����Oo��z��݉ڕ�6bW�L��Ϭ�l`
�gQ��j[�5��U��DV�{#w�Ze���ى�k���F��"l�kzp"?$�4�^h]h�SZ�v��T�j��ߨ�. PȾN�]�(�����J%�k��h�I=W�kY���ׯ㪺+t��F�	��U묌u%�bU�,]��L��7�/e5��#���I�le���R��\�S��TA�7R�J�Z�''H{��cB���%=�<���bvr��ŷ�߾�^\����o�8�SVg���RE���Mд��x��{lǏO��)^��M��� M�b��Ľ9���{�U���Z�ZV _^�=�®�ɬV�w�lAr__�=&Pv0A�E�(t�"��{�p�6���Z�?�J�4�:�J㫿/~0�T��^*�X����sd��"�vJ��𺄶*�T%A;`"���DF'M�3`s�C0g@)�^�Ś�EHD�r-��Z+���� T5*E5�y4����@
��tx�m���#�V�Z�igm���i.MV$s���0�j.@�5�Z���:t÷`��A\��P?�˃T.B��`n�1�H�����}]
��#R��R`�g�Q�Gb�=)��.���0�t�QUe�+��x�M��z��0��K�mT����T��u��T�+Q���;݇�-LGY�Q@�:3@�
�B��ͱ/ޠe��y
��P
l ���{W��M�,`���g^�i�_:�	�6=�&7�$β��%P����ڥEm�q�vr���Rk�;�"�Ȝ�'�����*��
�f�ֺ��x.�!�=�Fx��S'�n�Hiʄi��4d	�f����DlR��:N����-�Z�p���u~F-�q�^�
	�b�=R��<��G\�������}X��a4���t��p�V ����'(�]���%b1j���\���
4aUʑ��3Zt��+���b#+�\�m��h��9�r��p�%L&�-�WA��a���.��l{��z�Ң��5�H9Q��d�eC�F���kԘ$Z;Lس���pMH�g��%�ۺg��D4�!=@[EQI�^[7-�к�F���V/^o��a��ߋZ��
�ch\�|��^�b��J�Qц������(���X�sO�Qm�������2�(
B��c�疲E��N�:b3�J�ǣ!�X���ҽKob�J�y4��hĭ��.�@���8�]W�P�ӑv�����5 H�V$X�藨 �D�#��
�Ϳ��[���T��[Ula�_G�FB���*,wۿ��S��Ab�d�I�ϭ!�H=g���,ꊵIbht�R�r��7g�8�T�l��}�l�~D���x��tp�ܴ����
F���6���G?!h�>�H^hU�H�I�����!�U��v�"d8I��9�H��Bup��;���{S�*1��w��;8b
J1�>�"��Y�'E*�i�F��`2��ᆥ���i���Q b�OF�"�÷�#z�F���x:a�2�\���s+^���� �w0xP�R�g�ʊ��DO\j�h��<h��}�~��qsg���4"fë;�e€�@O���*'U�p.�€Bemx�ӟ�#��� hB�K��8�$Ԙx�ׅ��ʤ��uϾW(�%�$�&0��9�0!h�F�����ba0�4�����,ª��FhUo��Q�R�Њ��3�|�bވ'��Jm�Nn3Xɳ@�%ո��������P���y�L��#?I‘�C!v�1���ABl%߲�e�ӡ�Ҍ��"sGe���bF4�pXTU��1X%�P0���Uju&�&ų$���N�D����A��-�!���4���r������i Ε�D��7�-���w��Nb,8�&7�2�R�l6�����k��,�5>١{�j
T�ɘ�:]���<�Y^����c�xLؼ=�֖� t{N��`P����	8x���;5��<".Ⱥ!>=���$[�[+�v�Oo�r�hw�⽟8��}QE(�я��C���*�g��v&�AW���PK!�H��8/F0ֻB�-�qv�k0n������=0i�L�7���T�mqC�7`E�?`I��f����}JMT,0::h뜖tX��O�
���$��+:{�+n��CS	(�b9���|`WZ,�P�;j�y��W ��i�;���-#�h�1�Zg�;��υ�KrT�(��F����E��N�!2��de��&V}��|"(��r�����z��:�F 8�ח�/�f�P����e�U`��!h�!r�B �h,������_|������B���A�@bZ�� H[Ȍ@n�_�I��������7�L������UO[����;4��4�\��h��<_@�"�u�o�"���.�~�c�
�i����R��l�H�P�Gw����1m�	
��]�:�z���[�5�e�7���`n^���#���7�����5vtCN�����4�O
�UUdؼa����GV��(`�BԙX`aw�6$�M@�ϝ>>k��<�J���p��D�'��A�̴cxt"�k�:7U�D�mnyR����Dp��b[�k0�)�U����S߮���!鱉�����q��yPa�
����QQk���[B�OK,9����c�(gz&��:b'�����@�6�N$xP��L|%��Ĺ&�����p�-3DTi�`��+#~.d�Կ EX`Qa��
,��̏O�DI�8y����h��Xf�/.� �)"�-N:��+�yöy�]Qg�h B0%R3���Nq����-�"�����$�N��V`ˠ.���2U���6�����fӿ��k��l����꺶�3,��"$6�~D�)c��nP��[p}T�:e`\�8\f�B��m���a���wj�	�;��hb�D��K�׎��-R����4��a�km�n�si?���î����iT�$�4ۭ��� �]��`�)����U���~#g�᥻�ٷ���^��<Ш��O�}b`��r����ޅ�2���PIn�2q���$m]�����OK1ZM	H��[�]l�&T�ۍ:; �n�Yw(����R�2��.`?�<r}�&�QK�6`M���M��?r���e�p8��3�&�Z��-)���C�|:���AZ�uE,_��:q�rɤߚn%��3WM�p(�4�W�W��5:t�5Xy�6��R1�7��?"� ���Q��B'�^��/ڮܢ�G[����
%��#�08f����k)��uZ��&�;�x��0p>���3�^����Z����A,����BJ�m0���?�:�� �HZ�bx��خ�^Tm����d�\crx*xOUo�_�
t��_נ�^����P�϶�ZkA��?�
9Ƃ���E�Ԙ�t�j0~�C�5���p�>$0��B\%�u�`}a*z�g.꼭/��R<s\u���ݐ�r���'9d�����;��d.��>~}➕	{��5Miq���&j�� �,�Sz�*������!��*�t$�V�Jb��G
��a��n��b+��
��=���7i�GۥI'�MQo@mk�!n�m�\�f�i���{�W�"9x	��
r6�i�����f��Db��~�M)����l]����k%o%$\�7��[�������t�G!�0����,+�*�*[ף)k�Қvø�P�K`���`�<QS�Twaɔj��Cɛ_)8�8����
B�9fz �nmƭ�Q(��ŵ��~����F���3�R�}9>�I��lE
�$�eO��iB�h��"�]��ySh����Z�r���`���S(4*��ϻތZU��LHE�1&�=��\O�'�������
����
�^P��]k׸E�r>6��Jb=g��F�:�6e_�9�Nn9{N%�`j���п���<��f�zdw�����%���	9�.�xp��
�:)�
���cs�u��t[��p�2��{QlE��f�5��x���.��6��e���w�l����8��.�4��cğ��P�V��
�&>�>�:�w�g����V9��n9v]��f�8S�7�g������կ���a��M���������25�;}:RF�1z23�w�/Aغ�)�c�P�-�㇏-*7�m���%�x?��@��ܾ��$sxx�<Dg���T�o N�F9�V����n�,�_� '5>��v�Qc�K~H��[P:���o(Bv��ē�����5���l�{h4gV6�(w�"�v_���w%$����'-���G���kc�/9ڵL.<q$�x��ڣ�vWÀ��K�����9 0�AP��s{����������݆��D5��NU�Ex��	,�J爬��<�j��3���_��<��>ӥ����<f�ul>'D�kjc������)�Y��D��g�IH)S��'�e�a�
csx�J�	Q<j��]�	G�ĶW��l<V��j��njw0���+\�osPl��l�N���-0�
~��(R���0ȋ�AD�r��ޒ���/,���ut�&����}4���Xu�YNE_]��������
�;�J����"a������WY��{��3t��Ӹ4n)���ԙ�*��#�a�^K~����c$x�S�K�?��XC�\�����~�Փ����6=����D��~7
�w7���y˝�ե�O�jp��S
p�'�&��CEFz;�OSrU�o�)�������8���w��C�؝b���"w��Q��8�of�=��c���CS��=��.#���<KDa�d}��C������i���gGPj�J�糞L7��Oo�����VE��:���GnW5�W|5�`WgF�����s�օ4yPo㓣�ݱ��w��)���d
�]O��E֘_y�:�b&��;L:�>���u���Kd�=���_��Vl��W��2G-pּ�}�<d����)�}r��ڨ�įZ}=��sMW�u�";��tp�m^ȫ��F�
�0� =�BĿPKEePQUQ*-s3��pip/_vendor/distlib/locators.py�}�w�6���+X{��R��ݏ�u�2i:�;m�M�y��2%R2����u�}�@)9��랳<m,Q�pqq�pqq�?fE��q����_�����I�ޖ���'������1��Y�,�������:�b�g�4��$����J���ȃWż���4����I\g�>�eC{y]f�M]��E���4�֫4
�����WO��m�y<�������_�—P�� [����e�yY�����߶uZ=�Q�gU���X,`��kQ�O��ޮ�J�(Ӄ�܎x�U}U�1�� };K�u��?-ˢ�Q�.��*y�IK�r�Y��
"�+���m�Mx4���MV��)�(��g�
z�
��r��"�G|X�e�ҧM�|>���
��O��zD}l=�n�
��uS�X=O�Y��O�Z����uZ���&[&�b��i��ׯ_�L��Lg�w0�K��*�[\���QP�ok��e
ݪ�%����^~O�����x
�M���Fַ��Q����I���*�c��� �G�ӳ�&^f	�*��RO�,�]��d]^�z��9���4��% �˦L'�2������ˬ�̳e�S�Hk��O@ׄ��PK@	 W��B��h�"D�JK���,�B�\��~�
�RV�{P�Ȱ7?A��6M���Ll�^��F��Q�U��l�Lp!������]8��N��=~��ӗ�E˔�P��_�7����x��Ã'�=~���k��o���+DD
���0�?�?����w��~�l���ד���S�)�U�Z���033bfކW�������鷏������o���Wu������,*�}$�P/�Dv�i����E���0�כ2�R`V
�Rp��y0��2`�o#�4�ɏW���k`˰T�bN�,U�q�8Xh,��0�vc�կl��av��XS �<,��o�e�
?�c�����bS�}=RQ�|��>J��9Ydz�x(��sI˥Q�ˆ�ٲ����`�U��vB+r��8� �n��:�Kh Ŧ��2���z�D��[��2���p�tP5Uq2�]��6�H��T�hћ��4��&�1O�2�
���Y�}�d\�P�s$���� ��`-��d���i:�7�*렊�u��x0H}��i��ςe
8�7�g�sUl�I��f��yPIM$7M5"�.�ʪj�G'�|���M�4p�LRd&�O��U����u��#�R�����HY
�	��VeUA�峢�I]n���V�e������ʀV�bOa��|�(`��P~z���#�g%,���yzˤ��A�Ū���;,�e�=�M�
�Ȋ��ҳq���F��9T�h���nq��X���j��b�9sI?�+hW�!����b���=�QZB�_���"����-��*��2���t��g�߸��G�Fv���o&]Vi'B6�+���K�}Iگ��>jP]�����'��8U�GQ����3$~�%���\�
�a��,G>�:�$���bS�t�hu������h�.�8��T}�����wUf�ۀ�o
"�ܶोLߦ�j)@�_n���*�d>	V��X�0:����{�ͮ�w�`[l�����U\Ϯ"����b�:TG�z
� �/�,�jb��F�+�Y}�u��h+0 ��[
�/�-X"��p'�^�&M1yh<�g)B���n�S#]ooP;���Sή�2�	�є�A��O,РaP6��t�1NΓ�
�I��N<���l �5�"0|�Aй3 YҎx�
�%������H�D�,�k"�UQ�Q8C�E�5���Z�y�&1�R4�J�k���)����:�e�,���!������c�J���W<&Y|y9X��x�\^v˘jTE��S��m�Z����"/�q6�	=0����AI�!f���@��%�sOj�|,���XU#�mJ#:
Pke�4(cZ������M�c��"��R�̲iCWW�V��M�,�h��r8%C�9 
3�8��R����(UR��u`�U�YQ�X�R��H�&*��Ȇ�'`^@�*2t����+�I\��
������ehAv,?e���@2︊o`�fDЉ��ʴ�u
8o��,1/j��Q�Z��p�[��l
�u�``�`���VQ�R6 ���) >!�S�X�Et~e�&�~0��qu=I`J¡��$w�����˵�aoy.�)h�d�wL�Q🸆;D��s�U�nķ��&#�L�n��i��6�ID��z�����pu�6M�ʮ7b��jV�+����wʣNL_�����"�V���-zA�Evs ���/A�@&�
��zM����P�j9���tm5
�0м�;7l�M�O�$V\y�fJ��U8���b͋��7���m�\"l�j�Rh@���MN�rt�jj9)0�ۦ
�Vc��E��y��2ěQ*�[�s�4�Of�D���r�g�R+��SRe�����bc!��nj^dؑe�**�k?2A�15�;X�"u���Lv����mjtd��Ը�8�Z �ܤ�c�_50�armV�$ax^�R͊2%{��
e?���k4�c�'��BH��]��L�)J~t5�M�ʓ���tFXv<ڨ49g��N�^�u�ߛ҆�u�.
ɜUvg�i��
��д%��i�x��tt�B�#E�l���S˩��=T-�%7�XK�4NrX���<�b2Q�����	g�#���ɑƀ��x�m�:�=�.��Mf4n��4�Ц ,�fZK���%[B��j<�H$�0C߷��C,����	58EpSE�o�zh��LӬ�]��,�*P[<�@�
ތt��5��/.F?:�%�ʝ�Z T��l��� Jj�/��Җ�����P�q�_߉ùNWj��rXҩ��i���A�mv�ĭ%?~�nW�ͧ(I�� o��`�W���:����Ah�}�?�.�km�Riv�n`�p\�h�f����U}\ۊ�2<��8�E/�����m���34�"�5��.4�d��h�^�#3W,�4d�Q��뽈X:�yGLC��
y`}3�� s����Z+�y���`�/ҡ�f3X���aA}���t[�8��Qp(�=lxʡB�!M�!`���F������@55��O��rBSho�r�!���Ã6_��b�ܠ`ڭ�W�%�sP�:e7�)�-�[t�D�H��H�t�8�a�ۋ�^5��
�#�����1-�.GY`"w���
�`lR���e`4+��rQ��V`8�U�(���T��Ʃ��x/�l��F��X���5~8?>� ��`����1Tt��t!��^�ҧX_�1<:ylG�W�i���M��l�ģ��ū�$��nU�i���,�k�`-lBA�c��8�
������[�1:�_^�����P�k)~��i��_x	Ti����eIj��y���b��p��3k���
h�v=w6~>��(�Ȅ7�����
r0�
��\���w��R�p2���,�G��m\�>T8�8�����߲bc����kݕɣ"g���Hţ�5ݪ��i��kJ��[�vt���[<
wp7�/C��l;�(pT5�p��z?"�ٙD�H�dQ��a=g�
Y�+���#��٩P���1��䭶�wtP߳'��G��ݬ�J7�c/�IuֹӤZ�FƉϝ�'>G��°Pd���}�Z�r<��e�Dr7zVO���ѫFP�Z�8B.���f�����:a�oܣb���e;Nؕ�EŨB���{'�^�-�oX2�-m���r���(dh�l��n-����a9��д88=�X� 4��!i7"����	;W�M��;�'�
�˫��~���=?|�����DC���k��ȯ�}���ui����	cᐯ�*���_%��"�Њ����mt�-DU�D~��#�H�1H
�����&mmdv��P��V���k	l��	P!�5����h��*iJ׌�@�
7U?Қ1��C6�ǛQ���1k���U�L*�"�s�L�ً�	(��#�~=��4ݚ�%!J6��uȂ��eA�E���]9�{)
{�7!Υ��~V	�����=���ӑ���H���2ܷ1z��n���wK��kqt#���1��9��a��4H"	�BpY��N�͒�;��n���8^y?@��*�%�*lP���p�Ib�j?��)-�cU�+8n��!�xH}�7T�Gbtl^f�ȶb�,��
r�0;,J�KFu��`��0�G��7��-�6/� <���iy�;ø��*���5
�
N��G����톁�1z//яpy9���?�z[�����-9F?6.�;��m(�O�8V0�-��O|�7�Q��1���dT��U�]kfg*~A��R�$��9>�-nV�a�v��[l��[�U�+Qnz[�a'N�K��9�\�'	��ay۱
5)�6Yޫ���8Bٔ��m5�t$pք�(���l�V��2��_@0r!R���E�$P'ݶawD��xx�5��❰JWK綴��-�s�=5!�m�H�(�TK^U�U(b��F�� ��`�x����9�]v:_���3P�4 xcJ�����l
W4�G�BǢ��4����4C*���+���tu�q�����G):�.�����Zc-�{O\_���j�0n��+cKq��a)����j�"�OڨUK��S\t�k�L�|l��b�];������hUk�O*pn�G�G3|�B��6�[o�(}[��gUK�'����|��Q��7!N��KW���C��hX�^k�S�,$-������?��k^�%�dZM�[�'/N���0�dǦ�s)���u<E�:�S^qvwT?��1Tkb��C)�3
i��(��8G���h�U��2|
�9��a��Q��']<�H���������WC�Nx��|x�7:^��r�%Օ
�mf���T6��w�P1�����S���>f���P���Ms�^��>�Na��#�Y����D�׆%���/MO�<�͆f.�6�_��e�p�<���p,<8�D�o%}�L�w��R0�~>gŅ�`#<��v��/9��gN+�]x[�Ie�Q/�=�_tT�6�z��z��iK<�!*0-����y�+�:ؖ�M�L��ϕa�)��3bU���G���-�L����{ܡ�
���o��1���
r�a#��Տ��*
�ޠ
�*`�N�y2d ��E�El��a��&g�%�<�"Q��QFu�p��U�-�ib�=ĉ�U����ݡ���q�r��7��I����z�`��OP-o��2O��Z@||����_�=��0N8S�A�C�9�d<޶4a�L��k���p��ҁ�|����n���+N�����"$�Pᑴ���e�
��<��y�/�6����f�
Ӣ�涆����������@w��NV�G/��q�ҡ�Vj]��7����w`�+�G���&�3���=Vܷx�kx$�����nS��(��E�(�ڥ|_��K4�]��Jh>D-)�B�F���tc����/�ua���#���e�Ux/
�_ˡ�V�=�����G~��uW~��}P�A�uֶ0uX��K���:�)E��ʓ&��3�@���Y>>TH��T�*:���:hߓ�	���ХZ-1�!��Y�=V/e�H��AD3Q����Ao���=�|v�Q��z��W�K�<(
��t~���l�J�,�Shy�;�I�����
�<_�!���*�i��r�N���K��J�
ꛤ�a����{��XFb$����L������-��912��V"5�~]C��0������_���G�^��țSx3�7�w��x������>|<��[i��s66<<sc��6��!v���V�>s{��
z��s�;��̴>�4:v�:����nШ8[�����;|t���ڝ!��v�����3?�j�xz��c�k4���Ph��ғ'Di�f��k���p����.���w��mAN\�'��	���'�;��_�����/���у�g_�Gtto��ͻ��:� ����QO	��}�L�h�����º�����.�m��z�!_dP<-6���J�C��Ld
�*˛�E���!��80D�R)<�vaJ	B盒�D�V��A��lړs�:�q�FD���}�i"|D�􅶲�KA�;�R=�}�HR[W�p��q�GsL(�bвߤ���l1�,�"a���.���S��'��7>��S��g�����K�-��A��OŶ��К7)-�g��j0���"���x5Mb���޽{�oы6t�V���3�4+�t�q[�+��OI]�A�W�+cPMI�x�V͑�p^����V�Xe8�8��^`�jzf{��+ڷz%��[�X�
y��U5:Ten�i!�-[������j�.r��JR> �=��K�"n��Or֨mTȏ�EQ�F���z�� mo`�n{K���&��԰T�b=��+�e����+��I/����e�u���;~�srl�E�JV���$5!���l	��)�3��V�5<e������tL)����?ߢ�mDPt�$�u����^2F�؂1��T�M4>>�oVD�����{�F����Ȳ(jwG�-&���kʗ3J�<̴FQk�~�gLR�TQ'�&��HN�����J+:�Z2l���^L1��<�ך��\x@�@�R�յ��wަ�ۚ���?ĥn�T8<Sش� ���
7��+&����������M�drUpd�F�Б�8��hR��1�P���4\�ǩr�G/�ס)��l�~6Ƭt*�ޔ�Eƻ۷*��b�@
ȆH�Ǥ���%�KArKD�
0{`F(���Դƚ���q�	uZ���`�s�JL�G{@̮H���F���B�c��J.{�ŷ�މ*�P�L~�*O�������`iN�}z�k
%�ap�a��>���q�!V���5��ġ$S&k{K�)n,�lR��\��p�(�a\�����t�"u�c/���1��u���8_HT�A��!lk*/a
�>���+�V�j�>}��"m-C~�3�NZ"��*Ҭ6�����>���	�� Ce�s��-���M
�	�T`���aa��k��\]9��k������k��������-��rG��e�OcT����6GDN<f���k�����{���<q�ۚT�L����QT��Vt2T�֩ͳ��=�sO�s?���%�z��s#�
9��Y?��^;*���z<��1w&}�SΡ|Z���ֲu6a�3�e��+��9�yY�7`�e���$��$_|����O>��]\��w��떃[�'��&�*����U<+�����$�Lm�
�9�'���3��7��}�����
ұ>�줯�`̴��^(7�̀�rF�Ξ���*UN��ʩ6YM!:I�� Ǜ�L`䥥�|R�=��̴��8�j�����h�27D�L�Y�|X�J@�\Ѥ��骅�@߀G5��:�	�����jI���ڎY�R/ח��W�v�pɃNs?ҬDN>��n��4�51k|wD� $y�ɴ)�(n0tp���u�]����JyK'd��n�d,�iӱd���	ٓSm>6ɧ)�@�+�>�x�A6�,㖏�ȪJL:l^K��:8'����ĎZS�I��ˤ�2����nf�|����Q"�m��R}��/D%F��@̜N���C|�g���WJ� :�sU�R$:�#��=�Ӌ>���k��@gY���"���e�	��@h<�E��B�:x2t�C���)-�Bv�omݡ��~X�<I�ac��Cj�v
�XB��f&��6w��cթ�d�$
��n�ϝ.
��T�l�RQzIdJY�xl�x6�[�Rr�]�7bSX3�|L���߫�]h��t5�9�\�9iE�k�V.�kzu]O��m��)�Ii����Hb�3�/�)r��sTU@�`�N~�y����G��I1��f��4�Y��U�b��&
�S�R��C�N���	�e4��S3��-������Q�Y������2�vcHb^|���51�dW{��g����[���tZr�w��|%�L����!WXT��x��軖��}d��+�A
�ԬFOd4h7�Y>4֬`���w��J2��#��Ue���yf��*]`��9̟߰�9x��7?��1VjH"�w����x��B�a�7+�����Q9�>�h�������Ž�9�b���1�b2p�jhy��W����H�	���X<Rن׀ߨN�t��&��-���Io�`�z��i\m�a��#9StL7�����q�|ɧq�k@b��(7w�UIVRV`u[)o�}BH�{Z��h�U�xw�أ7�::N���M��QG7�/*&?c������3�P	���4��z�M��
]XuZ3��O~�2��'w��E+����k�x�\�8��V���u��v�{�7t�J{ߦ��t�Mp�=�@���=Ss����60����8����El?�w�q��ڪ~�I�(�Z��Ժ�T���{�7���/�̗]Ƨ}أ�����ѩ������~D��լ��sU�"@F�1�J�Q&�~��ư<�T:;�K�����&W�*�5]}�X�����Uz��j���#=��L�^$ц;.ӾC˃%nr�d�dbl;��Y(s�&��$���j�����g���1?:>}���<F���N��)~�V�;��!���w�]�2��ڢ��(�Ȱ:u�f�^��& ��C�����%��eAG)=��:�*0���G���|u���?�-H��I�W�v����^��\G~��r�	���j��:`{�8
d7���'�s1�FL'p��	�0�o�B�U�8��58L�r�r$wO��a�o�D�y��X��c��� &g�э$�>(wEg�p��N�r�77`��ཚ@Q��܏bf�
;���x�R�I��bpt��.��V�8*�������F78�31�&#�t�֊Ù`��6�7-���ԶG䘤�V�[<��[V�m�Q�M��Q����
7�
rE�&wqfI���U+1�\um�򞏑�sJ�%*�_�M콘��n����UpK0���鈽R�-P�� 3�GV��{=H�R�Y\�����C�]��%E�yNTG��ͪa'l$	��&��;��_�ـ�n��uhͶÀ�YNno��M�M�|D�vXG�� ~�՜z8�z�v\�	�A�m����3r�&����=�k�3�f)'�_��F��[(���ӽU��%�ڹ�[�����9���O�Y	���ޏ�
}��s��?��Y;z��1�/������hS�I^"���s�~����d�>�Qj�z��ˍ�%JX�K^Z}����������P3}�U�yK��P�n�
�Z�y_�~�"�I�Ƶ�Q-�M�f2��n��gL!#nh�����m�-�< :u	�(�t�eT�F�t�:D�B�@���͝�;��x������^	��T5R�ʳbܛ���c���Q��3�Б 	n���tՒ
E5��Y!�[��ͬ5�I��N������ɼϭ��x�b.{��M�OW�Hғ��)�6�#��;$�<\�in�ЗD0�3n����NF�
#��o����$?M���ٗT7��]emוw�$���K�c���0�[�+�y��� �� ��S��..�xAH{���%���2PQ��E9�	?���2]�����δg��yP\�ؕ\Q�$X�9S���a��İO�P���c���BL�1�[D	ϳ@E�x�� �潮�N2����s��I�c���{�M�0�^{
����o�����j�w�7Ypm2��o���$$���a��:L�ci)�3�J�۹t��Q��v�O�xdl�ӑ��9^G�	���j3�P�Z�”��b^���Gl�(�^It���&�_�P���Hu?�NgV�f��1.l�%���W���uO�lˁ
�k�v��tIA>�C�j����Um��	�;oӆ�
l8͊��!Frnl#f��?� *�ߩ(�]H�h�yd��=m��ߣ�IC֝m7
�n��]�3�2j����ޡ���f��l��3o)�>�KP�S~[fu�(a#��I��݈�n�'?uw�^�ӃB�x�{�I�>�����)
�t�F�����;��ޢ��h�u�J����Ē�“���zv��g��s�y�/�ɣ @U�96���Q��	u�_4��ԩ-z �kѷ)of�3mx3�_e�t�+V{�w"
���Sc�q��vww/�����\m�J&�^���;��{�N�*�g�m
�SNz0n������w�10r)U�i�!oy�HI�70}Pf�-v����NcS�1�)
��K1S�-]��:��Wh٣Vg������/�9Id/2��er-#Lr�Qnx��1W��˟�Csa�1b��L��}붪�>�b���zV���{\ڳ�0��; H�<сyEG?���P�S�Qn���Ix��D²���ڶ���f�#qU�j�l�T.��d�-e��1���)O��*�G0�`G'�r��������σ��Ӈс\��^�1�:�~�$U|Z#շ�,*�����\���!�z�g0z�].)��ܐz&Pz�?����O_�z����˧�Iv�����������7�����3N�a����&��/C�>��J�a�S���iQ��$]�א��YW��*]���2F�����o����]W�t�
��O��К%�F�Ez�Ac$q�خ�Əׁ��I�Du�$o4G;J()krMޝ�D��W����-�DB�f�v�&���8��.NN�63&�\*#>z������WM�[��O�Kܔ;�K`LGհU���W����3�[^u�#�*��µ7'���H�`Α�?�W��(��R�M�7�4|ݡ
� �2]�wGz{I�\��Nw]�59|8��X��;*�!���x������Ӝ�M�{�r+��L��Ѧ=��
-h�#yN���.e�-�_�(��G+�)%���[xbC�.ڔj
�i.tԼon�u��\Dž�0U;**AD?0��weKm4.bm�Ps+�J��g ��zM�?����y�N,����+<+�*��Q:*�
��dyao�|Y�dY�8l'����cC*Ȑ&BGe��Z�����D<�x3�r�|�!���ǰ/���*%��s��ُ��	sT&�c����B�E�{4dz���X�ٍy]�?f^��,�?�8��9�5�֭"j�����̣��{Μ�k7n���Fol��ܹT�_و�R���
2V�k�P��w�.z1�kk�q]��u��av�f:8?MN�"��(;��H�?�x�+��I:U/�:V�R��ب����\yٞ�2�����(����e��w�_^��\^B*�A��^[�1\���4r�&��j��yA�9��$;�
��Җ(�fZ>�S2�c�on��دA���s���m2*x蝼!���Ά
$�{�s� �
��+`� ��1
������6�od̉�/@��w"[�-����R�${n����o)#��˦/�P쎦^�ㆴ�K�d���J���Mμ-�(��lߋ�#*��f3P5&�׶���1��
�п�Վ$ϥf;��A���J6yl�i��0���:�:z����,b�5�ֶIF;szȀ��3�FkP�4Dd�<[~
����U�X��5��Z�#
v��ג>ܸ�}��c�"S@��De��`�Zz�9՟�N'>��r99�i��
�<
�1㖺���@
Q���@�1w�q��:����&[���+�NU�!-=4�I�\^�T"����R{�ڥ�ӽ�)��-��8��<��{Am�%Hu�"�����dcB��_	_[�������2�13]��b����Fe���n(�s�s��7��J.�~i�i���9	�5\^ya./
��k9tyI�lH3��#D9�bO� �^s�81KuQ���K�������;|*��μU�W�A�
��_^6y-W�@O�n`.du�M�=N���!�X���W��E��w�lo�a���y��r5y~'N�������o��wzb`���M&ck
���C�l��� qP�6�!
�I6��39�t��.
 0��2���c�ތ1r��jIsa��۰>�nk�yy�q2��R�����*б����Ak+�7#����=�c�E�s;Ш3��'�e߄��s=r�I� ���r�F��p����i�")�%���̬f���)�Bl9"�,��g��
ӻ����j�I��ݡ�����7�Hpk
/Z'�/�T�&��fn�4|X/=�t��ٕ�p��
=�%'!�\��$S���b�+�e��9m1i��M�.K/o�T�ZI#��ʼn(>*�VU�GM閳�"�B^E��T�鍛uU�3��Uc\O�N�ӯ��9{��vQ\��*�i�=O�Ff�B�;۲3�-�kz���UQ����T
Uf��[��%�]������I�Δf<ڏ���5��.�7��D�����1��|�D��zf�J	[T�cS��$����}1GOGv�
�	|»�tm{'Nzl��������#�r�=�@�x"�.�3�!ۜ~G�U5���2h��=�cvi�]����,(f�=[Ƨ��-)���y��=�ާ'���W�GD����{W	��G��a�b?��Yn���{�?�x�K�T��Q��c��S�(�>
�Tؚ�E|�p8����=l(��*ځ�J�}��ʮ���$�5U>��F025�E��x7���Q0-��e��Q�ūB�lP�PKEePQx�5gl�9pip/_vendor/distlib/manifest.py�is�6��~o��+1�3�����dg�i|��;��P$$��� -k�?~�{H��m��LL�û/@;l�;b���l6fe1��v;�@,�y2��=��޷/�F��Kv�.�"cbZ�œ�����HD�ê�ه��Ó�C��/X��������??^��_�K�7x���� 
�d9_�\�X1�,Md�ĔM��K�d,d1�ʓI�v�^&wa
kX!hFR��
\=d0���z)�-s1I�B��o�X�ƳEXDs�5��`�
i�rn��Z�\,���w�]�L�#�D��p$˰0��2�d�Y3���E�� �4
�Ϯ��0K�\��`���^k,�/>�;7�p����Cvͦ"MŊ�l�V��e'�a�����o�.�������'4�0p�u��ڽΜ!�>�p�����������ak�����}��y\g��O/d��
�zWr�7N�S���@�eZ�e�)��P�"3���g�1@Aa&S��tmA��5h*r��{��H�^�{�}�=���p6�E�:jf�|���;�����.�?=	~:<�8:E��&� 7	�l*��{ �������xTx��(�ۖjO�$-�hؑ�/S���,�����"X�r��q�]�'���&d�Z�A�VV0��A`@1���N� p%O�`.��'"�Y3�<��$�9���E�E��0^�y� 8cv	�(�|�x)
9o�s�wDƧ��`>ڄN$�u�L�zA�@d0��b��&(p,�P\�op����D0:%�}�\h���S$��Y9I���=;ү+#�*���(�J@� �~(n؈}�hp���X�B�eQ��|@㗵NM��s��H�rK���������\=|8�a��;���M5+���\//����z�R,q:��\�/�%�Y\�����j�槵;r�ƀb
�h��s�Ac�=�D@+��iJ��4�V��D��!-j�T��N$1�=�&��'�h�~+�d��ЄXA�av�֢|ҁDKik|r
6^g�b��_S�ڙ�L��]������YK�5�޼�;�ީQ%��9�ѫ�vD�[�U�ƱvR	��
��m&E`le��p�G!壌���Ƈ� "�pr�'���^��P�4"\P^�U���@-�qf[�*��t�� Y�q�4�ɯ�_[L�r���b�l�OZ�L��9�&HLT��RN�W��H��ĸюU�����a*7űs�4��:����7�V_sэ�FC��o	ϸi*y�c>)g��a ,��tPS?�,fO,ڵ��=CXz$�iR���$%�b�5JW3�:������ R������t<���ñP�[T��.�Ol1��r����j��T�u�DҰ��B�Ӗ{�8��O;Z��:\5,q��\����; �u�J	�B��zqM�wSko��0���=%$�FS�N���LC�@]m��@i<�����9S��31 Gs��1Q���y&�$����~9�.�q�V�Y]'T!�Q��M���r.�4FwD�$����T͖@��Ё�u%`r�����ť�d@
�5�|�̋b9~�<����g�+hϥ(��w^,���m,{9f��OU�q����d�r��M������\L@"��W�Τ
�A����~Z�S~�V��9a�լ�K�t�m0�H�I<$��\�Ÿ���L:��	�܂S�s����/f"Jx	��p0��R6�)|��%�
d�W)��o�:�(�Ck9���d��Ih�4XS�������
+�[�[`V����
*&a�<�#�Y z�gx�%�B�5P�$%T|6�d�NR�Tz�0e<�E>��<����5��}�$Y��1w�wl�vd��u�:R�Ӱ=��Q����/�rS6�C&T� �:���F=,���N%EK��ZTA��ԦF4�����5�����!���?]�4;M����h}�/c�,�0}Mmh�m�g{u�aKW A^�'T�_�\��|U�R��h��qE���-�|6��uSo�*4|-�T���"�
ք��X�uԳɣ��~��u+X��~��Ӣ��5
{��D�˨R����)e���L�2/��5(j�ţ(�z��O���v6�5�ا�2g�p$A�g喌��"�0yv�/K���"
�9B�N�X�qF�y\�6
���>Gr;TBj�H% �=�_�m�<�����ҝlv���'�AZ`�BnQ��i�"U��[��k1}8/7J�_(�dy�BO���AqS��4�C�~�rq�~��M�1�eX'��4�Χ�B}9�G��
���n�o��r;hZ�g��@ʱ�,u��b��Mc��Z��\��z��ڌW��]�T�g�Z۔u3gB=��jKG':2nw�*���u����h��`����x]=��cҎW��ӕ}lM�nu�+��/�77���ף�}�	���YR��������8&�=�ć�ɬ'�����o����F&5-j��z�0	�2�[��"�V����,�	�
�}��P��?&2���S\pl�2,���d.ދ)�$]S�KG-��:u�ס�P��P�#hF�~̒��,���L�(�r��x���zf�r/�B9a�ge��@*�<+ԕ
r��//D\��	8��Y�c��D6��DI��h�C;�,T��TYl�aۑ���c&�Pα=��}��r-�U
�IݚI�w��N�X��w4��!��0b�+���(@S�13׊F��j��V����sp)a�t�_���s_5��Tz������$��hTplt��@C6�i�Jn�mѡ���r	��5�"����	&&��<4�*XnR��V����2��T�G��l]P:��`�⼖`��X7iLf��{/I�.�Dt�� �T%�a
���P����z�L5�R�[����v�9��D�U�	,��sh�zE�~�9Y��Ȥ{�1H��s����j�w�~ ݗ�DZD+/�O�Yu��[G�2}�
Â���'��a���ÓE��tN(���mK&�o����@���o�ت�Bu�kS�˸�a�@�����OEHz���9��m;wk���c�8�<�F�U��Nԭi�%�h�ҵ�n�m���0|D�C�Y!�]���!���YV�R�޵@K_O���HW�(��p�o�~��饹Rڈ���d�(��%�F#ij��%��̦�.��]��ɸ?���	�N^����3k���Y�݆x���#�Fg���k-��E��#�3�-�~��ҫ�_��(��R�x�X�/͎�<MGirk�W&@m��;��2
�&��9�[Y�S�����ߎx��X�5��ꅀ-Vpy\��V��MA���K1��*8J�̎v�ƻQݎ�$�\$�u0��-u��q��G��
��Fr�1h��}�ܗC��iN�	�i��l�J\��'
Y0�I�0�
�p���%�X�~	�&EmAMz��ˌ���OuC��^�">z��:N�sz��Vcu3�SӪ�"(�K�n��8^���o��]nH����� *����^�o�_,��U�v��s�J�Iv���x��z�w��vo|����MҮ��݇C�|��(`cjBT#���$Q��j]��RRo�T���)�6�G����:����|��5!��ŏ��"�z'o/�@����r
v#�;�r�T��]�[(��d�k��_Bx�!���Y���iC�a�L:p�i��bUC����!�3R�G���WNy���^)�t�Vݸ�����y�V).n�+:Ky0;�+����w��u����;�]�P`�(\�u�鶉���U�.��C4�Dґ�d��tDw�oE}�]�i�c�E���z��P]�����k��(�
��:5h�Tٚ��b%��5��Q�k
�*xFU�֧�J//7�R��7ୱ�؅�yٌ�MT�ة(��
YSX�K-@�&�e�U�0`nT�x�8]���"��[��
�;l�����[5�j�,Km�v�nЩ��5a��h}}�t�U5�A|��c8F#/�~}&o��t4]�r���y���s���]�P�jh���ڞ�rW�PKEePQ���f#pip/_vendor/distlib/markers.py�Wmo�6��_�&(d����+Vu�-s�E4�0 TF�m62��TbcX��"S��N,������R�9�	i���-�$��19��V��ʐ�YF^��|u�~!rA��~�u��dB�91��#W[���\˅y���sو95��)B�<a�o����bl̈́A^׌�g���Yn6�P1'g/o>]�����k\\rtt�\Q���x�L<r%r"k���d�K%O**�
]22g.@P.��슼9}�[Np�4lB.���ߌ-�=�'��v�\נ�}��D;��6�h-�M�`���䞑�[�Fi	79�C>�G��A�(�*(k�(XEݔ+`'~�Z3L�S��劀QEj�V�1�dZs�%�w��������*O���2D���c]Q�\�wŒd���NQp���*�3��1iTe�[�_Ų0ۚiϡ1�
�\�਱3G�$EA��(Ȕܦ`
�j�Lz�$�1Rp]Ti5��$!��"$��\hCE�F�{vF ,"~�g�9��fI� oO�К���Q�$eE�&�GZ5芑���J��p�ߛ��!�!8�9"���M�~�B�-�}p~�
��V�t:M'���9%�1�N�O���c̷4ʆ��`�
`�uٽ�>�]1��N��`�2��>�.���fL���^1��>�"�ؘ�����c7�H�j1�x�����6!����,���H�0��v��5g�hD9��I��l^~i�!��^�)t�J��‹�J	%����_;�=1q"u�%��@�[����˻�A^��<�`c/ugO���
�f�$oڈ!�y��S(��\����s����}	�0e���s(���橬ӻ}��C%��;Z-�c]�2��^�e��u�g�n��=����Uo�w�r�%���ߴ<�C�t\��������p_Te���A��3˒W���b�~�"$^����0<DȞ�ne}7���H�=�Q�~^
�~䍂[؂�)
tC0�G\,dd7���un��&����s�\D�0��z�8O�-�*FAI�8�-�@
#���9�bjq��/�<8) #8�z6�DIh�+��C�P};#Ei��)v�0˻���1t�П}J�I\��yP��4��!i�$�(�z�t����A/J��o�
Q�����i�r3��R�F�~p<��ü|`��~i�3l���0zg�Bh�W��0�o���u���8���)����N^�E��a�(�px
�H����>;���/V��n 
{%	
U���$,��@���3W�ڹ}���vX������R��A�"���l ^d2e�j&�J Ӣ�^��i���=�	L��Sy+�u&8��Ppg̡'�c�_ܠ�7N�ϕ�Ms _���(m�vWN�zb=��Eސ�p�M�jCf��
���4�F?�w:F��]5�;�eY(�V$�m��c;8N�{h#��S��v���?�&�|�T<�L=�3�h/X[�n�
�mS�m3�GfqR�1u�Δ��PKEePQA`ߥ$2�pip/_vendor/distlib/metadata.py�=�w�Ƒ��@��tHZb��Vm�Nt�e?IN��
+	0(YM�����7vRJ��w|�E�����󵳻[���(��iV\���b�_�dckc+xV.���	�g�`��3	N�X�殹*�฼hn��/�e�&MVc�t�X������x:n>6AR���ׇ'G_�=y}t�������|��9+��A�_�&pIpQV��E2�N.Y�������Ţ��:H�<��	<�v���`g���L�ϟL�;��m�\�Ur[��`�hl\T�<��e��X���"��8�V%y��!^��Yͫ�y��Ɯ�5��"˙��,���b˟������n��|�q�H�! wê�Ʊ(;+狤�5��
@�5}�����A�>6�]Ԛ'�5�ղz��X#^/��Y%�&>�����0�dML�D��#Y�׳+�!��ӧ��wӣ�ׇ��tc{ͪ`Ov�_ҳ(��dt!fyR׊^eu
e�UUVQ�*�ݍ>0��@ğ�Y�R�Y�ym�6�geq�g�f%�a�E4%4��p�m�`�\��ƅ���0��I>�����ج�,���;N�UH�-��V�))_,���6sP�$y������K�d�xU��,��Н`����H�2]k�1L>�-{�i(�
�A��ۯ�����������9���M�K�ϰ�i�EP��aq�(�Z#��\�7��vH"+$T+v�*�A�q�M�`�<��y����*).Y
�aLA:e1cȰ��O����\�`�n���n��4�@���pJ��;��T��) �޿�%إ�O_��O���/�/�C�HQ|$��|�����I�b1n�'<^�A�a�笞U����K~S��h2�/A8W�ۈ����lƊ�A76��w���6҅�%����pf ��s��y����G/����Y�j�7Uy����8�ҬV�z��-���Q��G��^���/����U�
����
ƨ9u���U�H���Y^�(�ǩ��z�m���#(�"�ը����%h�7���5>������$b�t����)�#��M�0=H$�j:���~̚�b�p"-:@(�hn*f�Y���Sk�F��ҕ�
6�?�$�F[;�_��&S��!qɳ��8(g�%Z�eq	�GV��q���qpP��e�����[@&g�p6�T��[�Q���/P�Dh�1�K�ŗ�2��g@ ��G`�B���	�:�9��.8؜9�-`�/5r5k���l�\Xd5���X�x���������! =}wr�Ίm�Ua���~���D��鏛g�
6	�[��B�%e�t�&��U�x"���BY�{d=n��jT�[VE`P�^�ܩ�㩥��Uk⫥���挠����C����zI�(L���E��$��j�I�UR��Ս$�=3��<Q0kh�a9�T�� ߣ�Q�t艐o��	�UR�܃��%�Z��Mp~�H9�~ךs@]��:SRP�Z�6�^$y�6�)�E��lC�L��p�
я1�y8��2�����o_c|Xl`#m�&��8Y Ր�͢v�3IB��{ȹu�ُ�vږ\u�al�
H�|��`��"�6�hE���j�#|e�H4lR�%1@��"����/�pzc��y=�ؼ�aXey�c����e�˥�zn)�t�
["d���$���H��Hj) ���Z$'k"9YICg
$?��H~�&��?��z�-��n϶twqZ`�sgbL����\��\�$��(���a���O�H�%#��+��d�)9�MI!���I*�u_?-�
wu����Y9X
P	�8
�)w�}F
_`p=��֥�P�5T����\TҸ�(X�#�`���N���4�7
��$�	͸����~�J�W��qr��N�#�i��&npu� hX�`�Gu��.��5�xu��.X��l���zX���${�{q�
��R�&Ư�����op(�<�|�1E����@k*�_�߲�*�!�&�]�����C���(3�&���?��kV�e����뚖nh��)˼� � 7��tSf��f`>��&�"8l
�����|VuP$i�q�
�A��hc�A�n�(���̋%�ω�sb����c@$���<-���bIq�6�2���=���bRțn���S���n���Wfb����L(hn?٦8���TO5�Q��q�K;pĊ�;h������9�*�j�E�������xA�qY]>I�͓[��h�瓭,�8�''GR909&�pEj�����Hy2c��hslƛ�]zOF&}A���ˍO��#H��� i��*ᗡ�g��B@Z����y~�l�dj�ɜp����?��=�‘]�,�,�bq|b�2�lv��/��/��Z7��#V�e1C_`hU��9"j��}�rj��l�$ӗ�W�Óc�|���o��~n���H;���D ����bYy��G������V�#<�q�d�����g�����*-�1�aメ4{��ٴ荏��O����8��רA�&N�r͎˄��w�RX$�|5��&�h8W�zf�7�����%�H�Q,K��n�-\�\/FI��J��U ��V8
8���q9~��H��
p�L8
�A����7��Hh�S/�V-�����3f5LX�j��<�V��Fn*��+*�-%[ ����ȏ�����j�P��]&�;i@D���c�HNE��X�+_��%5���9��J� �\�*�#J�M9J)���8@[e�p-Fy�M�4�
!LiTt�̞��\b�IDTU��Q�����C��_ɴ0�s&K�w���2�����5��7������`�0O����	LFuY�gV�B�I�!�����cN^?��:�cϼZ�GR����eޠ*�Б�8+�&����C"�F����%��_n`���6B;u�`D���V�D&-��LV43ՂB]�]�Y�>��e
Ccx�ةq,�|��?�oD.IM����<bȊYF�S���=A���N"����	�4�re�dW�&�#Q�ER������xz��j����ﱦ��@��+�g(����Y�h+���\���*!�0�i�i��1U�@Ρ���0E�0A�֙�$oÖp���F��S�E�S0��	-ey6D�X(N7<@H��#[Y4՝��
O�F	E�,4}U�s�!(+�Iۚ�e�H��>��HX��X���Z�^�J�a�“��,j�0ұpVA?�R
}�rB�����6�v�]�,Oo�'��N``Ãlqvh�	X�G�R���>m� W��:����/_��3�q�W�ř`|��aOx�Ժ8��
5r�f���=y���o�-̜Y�%T���'olq-���p�]D���r����Ҙ g�R{Ʌm���f<~.�{����y]",O9r2+��L���qV[��5�а������.L�ԦXL&��ZCZ��&�s��Y�mO��Yz��h�{�Z)|����Q$���� ȓ���E$��LG�����=��٣�ڦ�B���ȭ��_,Ƴ���i��ꦍ�r���꼾��:����۞&�:
e��FO���+VPw�x���âz�C��"j��7�Mz�LL,$Vbwi�Y
�j������1�8Oz)���$(OA}���|U�]vr00C/��s`�V���)��D�{\/�؊�!8�DL�~΋�9���FX	�R�x�J��HD�(~�&!�n�zy_�U�����������?L����/e����wJ�(�;̳��e�!�g@Jn�,O�s�S��|��a&\dO��M#ȵ����A��/R�W�h�^!y��Q�Acm*�+c优��u� �`آ@]g�X,����Cr�A���-jo j�GE��F��׀f�g E�C��6�D
�t��cD[�����V�+�[������*����Z�	�`����9��w�1���=F����<��"f?��?ʬ��seo?rY�O-��{����z�+�-�E;i��{/|������@�H*�~]kh:!
��5f�d��y��Z���%L�J?��M��ږǦ<6�1
w��ǬY\��@�>���W�+vGVR�Y?`�U�>좫"���p���l��Lu�
�Q�1/K�Z����H\@�3��~C]g��7Z�+PSड|+�*����`���۷�Jj8-q%��ʎZ#אFNn�A;����0C�J�����c����H�k��]!H�C��8�"߉l6�-�)I��wSĜ�=Z��1R|t�#���-L(�;H��X$��N&���g}1
	UP���؄��
M�'����*�!0�*��(�jj��>�١(�G�T5�Z� gY��|)h&��a�>�L���eY�����C7i��ތ��"rUIL�s�-u��P��l��|�v����/��9����i��,}QV��������׭�|�l����ޗk3�U��d]hש�y���o�1�]koI(3T$]�2w�Y�8+��1	xVE7��N�}���r�,(��Qg9�l�����p(���_ܪ����$�`��h�Ps��8x�j�7W��rmrH�B$B�������pYs�:(�	f�W�|��G�u��C68�F�=�#��.-�$�m("��cJXv�$��?�>�H�])����,x�-+�GQ�	X�wK��U�=��c+گ�nm�Zxe&�ydj����%�,$۶W�\&�hQ쾃f�Ia_#���==���5[0�l��䮢񧭌�G�Gy��m��'ڒ�t��hv�����`�6����V5��
��y�s6�=�����x��ros���^�h����f3�u1���Y�d=#�]ؑ�S���lR4ctA9|NkPd\��B#tZ��=h'���X����A���ݻwA}����Ja:#+hS������T���8�-�O��@M{{������\����&�s�T #�+�BИ҅xY���٠��N(K8��О��O���(�b|+��:�Zt�Ƿݵ�-1�M��S,�i��C�:s�yۖ>�
��J��ᔈ�g��.��\e�[q�z�l����*�7���m�����p.Q��g:�C���D���ֲ�����V�U��=�UM��SϨ���ϒ���=.��%�����?�0�ZÒ���Opgn?�71�̊��?Y���C�R��҂(ܓ�!֒�pjD_�}���#��9	r���k1���ʊ�(�i��[sg���C�.���h��<�P�h���8���3+�7��G�B��`������\omHf��g]�P(M)�ԝ�4{:�o�EƀN�n�?��o�ś�g4(w�J'kY�0�-�c�L�n3���'�<���=4��9Sa�ِ�i,�4�v�ya>rS�y��������3�5��x��ڡ&����U�8'��=�e�:�$7h'1���Ϝ��Yd���^�q�r�i����"���~5�[	�b�h��gBYYyؠH�k� VhZ���wD3+ӝ�:�<UK9�
���;��um�\l��tSfb��Q���e.	b���cy�"osL�U:�J<^MO�������W�S(\�a����7��f:}{˩�nxɗӯ����/*����v�{b�N�f�$�CEA_մ$���ׇ\׫�t���1I��-!aT��*Y������g�lv�HsƷ,€���o�N:V��/�$�Bz����Q��ߧ�E��������n[$��B�������E�K<�=��}�Rq|  ��{��Ă�o_��?������;���?|���'7?�_O�G�'�L��C*��Q=@�6�<��c��o�?����	����{4��s�ǵ�(�C�7)��BK>����D[�,s~�W ��*������w1?-�Z��b˰�fj'e퇔���H=2?���҇�~�h�Zq?�Ԉ����B�:_fy��ZM�]LDjbl����m��w��k�1+n2��I��n�px��.�n���tk��va� ��.Ĝ2C�:8��bpUk���F��:/�1
X,Ka,�R�>Ph���YbˠogU,,�\m����2��hcYa�����D9�9�I�bD���F�3��UH�YuVF�����-Z��)��%/�F���E����\E�~��u�e���8�җ`4���)6}y��j�����x�N�d@�Zn�-J�B�ǩ�[|�GI��]���go�|������߆/Y���)+YO�U�§�|��:�B��9�0񎐇�$�})�d���6��dr����]M(�3�:���=�$�
��鄟-`����AZ2�P��M0))wM7D��$��p��)b�<��l�OlhC��s#�NQX���IW���lFb:Y���
4���ۤ�³!J�Ô\��s�\��O��e�@c��~��P1�""�X��a�7Q��y
_s}X�q⬴�����)Š���o�/1p�_�/Q'�a�~2MA2�'h�"��m R���튦��Tg�"�)�QƲ0;�p3�ps�h����DAO:���)2]�[$����A�km��։)mD�rY���Q��q�d~��Զ�}�)�>I�27z��l��M���ČL-+9��E��Bc�*�����_���&)��-��k4^���	��0m�o��>̯�M��$Z* k��H@��(�(��2��j�G���:[�������4w�<�5���J�k͆΅4��dU\�)� �߫�� �o��_��C���ơ9+������
\����c�ڤݹ|b�0L�%O/��)G@��#�AU�!#[5jʳ�vS���w�w�{��w�;t?��n�Q�<�e�1k���6��S'��5�"��ݭ(�D+Czp���U���uN(����Ҳ�=�S�8I@�����aǠ����ZmQ�N䫕��aU1�1~����W�E":R�̤�#��z�G�t��R!��?��V�u=Ѧ��m/�HU��+����D�@�Ch�������>��:(»-��r~���os*��6��Q��V��1�'������D�i��֔Ye�h�"׹}vl_�`i)�Fֵ��a��NCo
;"=uL�,��g+p�k"�2��s�:)�M��65Sܳ�u���=2�GWTU��4�w,~�� Ra���.K�g����=x+��3�R�X�ន�k�R��I����T�E�'��zk	~H����&�*\���[H���U�z��g)YH�zj�tDc�Z��곝V*goԇ�̭�{ʹ�I��F�th�}`������6%
�T�o�Hhj�!���+~��i[�f��W�uǷ1c�C��1Q|#5��y�OY��H�����`/�j��lPP�R.?��c�ϻ��J���`�B]���(�02��L�4�9p���l�W���n����3QP�� z�d�7�s���R������0Gq'�o4֛�D�u�cK8
����F��x*N��G�P�>�|��T���r~�����UW0fY��#q�
Fܐ�g߂�M�����pr�4S����;sh���L?�H�R!��ϸ�fM�VE��ݤb)�*�`���C��o��`p��1��!u�Q�B�@]M�z$߼�ko 38���U�	g.��'��	����b�ϼGD��G�.j5�+���Q���m%���/9�-+L�� χt�A��u@ �<+��c��fL �O�8gt���D-��pIO��Q�i8l��=2�Vq�r�`��"��J�6�p�SuwO��+���R�a����(�~H�t�;�Ǵo����{+�Lڧ&�m3���=M����`Qq�L�€JuR9��%g{g�m�����
_�V^n�l������͈	�p��*�?��vUEϼ�^3�:Vh k]g�����;㌭���o��΢�8E���@�x�c`mDi�:�h]�혴b�|W)�[cb�	����h��Wk»j���y~�*A�`��X'7������� �+((��$챣W�?�ܵ��^05@�/I]����Z�3C78(�9d�[+gL���͛&e��mVҌi���JZ�S�[LҾۚ+���K��^�v݊Jv%�����B���W|O�V~��Z�_��g\��Q�������ak�2շN�t�ۼ�����(RFq���t�T!OU֘;[)C[� >�k���бR�M�Ny}�ע��ϡ�!$�|r�`Y���=#y��u#�\]�c?�Lx��e��~ێ�?Aly����7-����W3g��[�HJ��鷩uId���8�-��D�Tw�B��{��#�f}�K1M�{�pP�v
˹��N�je]�cT�5!�r,���M١D�r�j�,�Th=���	��/kG�q�q��W�x���P�Y!�Xqc�+���L_�)���>w*��Ae�mK�H��%$%�I�F�C�Th#��B}?6$A�`�Q��f,=�_ܬ��K���;�Q\�����MVg�X
�5�'��0�Ja�uZ�O�q6�e5��,���%�jj�릊��z�^l�l�+�x�k�|�z��j��#~B�?!��>�F�UtJ�r�
�G1�=�/��d*c���#ә�/���K���[c��A���<���D�=t��W,q
2�(��AWM�
o�mg|k��g��b�ЈM���6�	0fR�s��a��O+1�, ��0�.�j��V���%��U&��鸅|������[h%���j�޹���~F�qrYz��ٻ�~g��LhQ�Ao����G03�;y�]�bɼ������n��U�!�qnW.w��㨭!ܪ�(q��\
��Q�s̽��5��΢�;��M��'���?tۍm��v�L��6�r��Rc�%X�ˊ�I=�2b�!�[\|ڛ�gp�Q>מ2�cM���[��֭�y6��ۇ���:�c���؁kA���3�r���$�M�C&;(Z�2�t,�zV]yu�(k-���P*������?��1^�3�O��90�t�ح=�m��D�/�[��+Lb��d-�����ۘ��mխP�a桜�8�/����X�}}U��
C�������>�k�Yi��GY+f@Q�-st�PKEePQ�݄�* pip/_vendor/distlib/resources.py�Z{�۸�ߟ��q�|���K_0�m�4)��!�h
C�-��,	����{g��zx�w5��3��<$5f�_�u��|;g���3>�Gc��(�����^O���_\�b��9?�k~#���˵�k�2U0��ǣ�9�.6�W��-yʕ�gp!*�a�\UruP�m+!�"W(�Z����7����A1�����?�{����O��F��س$�ԡI��,*�%LE$�T��Y=�+Y���w��WY�����mQ۫�v{P2���.�;::u,���&K}5�
�V��Zer��a-J4�y�2-ɚ�w"Mʪ(E��3�*��Ɋ�b�J�v�*̳TV3�/G#�����&��,J���@��hD�@����ߘ�+�8�~'r����2^�쓨�C�4FD�O�#�K�L/s��$�E��1��
���
=f���z�/�*�����Xȷ>���)p�Q3���9����1���/�@
r���B�M!�(�]4��Ѥ2s��w���	�`�(�3�ܦ��*�;Z�:�τ1������ٳg�]M�=A�l)�϶`��I�����K^�{3g��zNN��e+�6�Q��Q%͈W��АV$�y���[	Ȯ���@w6��OI��w�c� ��gҤ>�p��U� �W�س�Ec=��X��2�Y�)�R��1�����0��C����{
a�9u�}5�Jl��X�o$�Ÿ	Z�o�����(-�?���)�����CtAʠ�c]i�R��JM��&�q����3O"=PH
s��He��
�4�@��jGuJ�x�J[ۑ��t�]�@�_t�䓓E\·R��ue��}m��duTX�Z�G-��5%NGν�.Enf9c���d�x�6�Q�id�wL�w�O��4�WXA��
����Cx�Zn$��w`E}�4��:#G�
F�ͧ�L�VB��ՏC��/J���[�U�ޡ}8�b�A�\�̐E�&iByQ�y�MP�Z���5h����A�
|�'�vyK��
MU¨{��.u��8�	��!.s2�[�-���W0@Qi
�!��J�96E�cTBߓ'N� ���/n�1	��3E0.1	��<[�����
�u蠰\��M�@fJ�ʡ	;/F���Ѫ������ё	�`{�۬X�Lg�_>]��VO��B��I]�mgzLAJ��r�h�Z�o�L�
i�٠�K�VP8# U��w�1Z��u��e�Ɩ�1��F
�v%��_7y82�q�q,��@�j,�����_�neY�D�����M��@A���%�':��s�m���HY��� G_�/���2��
�&���D�K�P|��Bض��ȡ�D)׍�<�9ԪI�H6a`��
��n�� �C��ˤ�x��a�������u�
�h��pnW���dJ�U(�d�_Ldm�b�1�i?�k9��8d)�e��9k��
]��W��MN 7M�Ӕ��$⺄��Ӑ0�!-��Y�X����S�?�E{��0��r�Am-g����J��mޓ�F���P�T�'��YH����&�)E�N�+	���%���}��B�7�3PnG��4Kll,8Zh����Oy҂�ƑPP�դM���䎨�lF�`�I��`���T��30}0pK`��z��˲�^�ѦZ4b�a����m�R%�О��R@��iq�.4�Iu-6���*f�A���-� �q��2�+YD�S�ϐ&.t#��(�i�/}Ep_�'_5��D%h�4v�KU�[X�e��
� ��䴪 A\et9���&c�;�=%c��F��w,�<�'
"���U�B�_��
E
S����H��/m����t���]�����`�
��r�ΰ����	"��K|�:"H����eA��g i�\ty�M����pM{b�-׎F�mW��xs�s���kl�����ae���s�[W��l���xdi!�|���p����.�5���b�=X"�G�wp����=
��ɴ
�4����9�'���T��lj�Q3�eh"����S��H�%�=]'�-W͗�%�P�T0V��׋�H����x���	��r7�<
!p4U(�:+�O��ogPU�Ы�]ȥ���
t���!�*z��K�ImЪ߆\�)N�갍&�9��`�tξ���D�iD��>a�>��Eu�4�'0�9+�k~�b�w�)Hl�0
y�i#���<�����p��$n<C�"~�
���ò���<	�Zg8s(GY�@������0��C?%�uv_�ӻ��������|J)�XO�����n�)Wn}9X�����
{D��,��^ͼb�B�6��$3�|��\N�I���Hqo\C�J�'����
���C�
g?�y����H���-+&�A�laF������"}��)��!xpf�E���G#7�1hkw�^��A[��o"O��L���_�iI	�:ug�xf��9Lr�[��Z&�󷍵��l&�S�]z�o�S�^^��4\��ht�y�>c/���Eн���9`t�Q�C��z�ȂG�	�KY��v�~�0]��6��D�=��g3���u�z�麷��0i��>6�g���?*��z�ޞ���U��D ���m�sĉ�,��N���0�z�O,b����찷 hb"+ֈ�ے���a]i�ݙ��~����~���u�9�&��K�Ζ��\�=��4�	�� &�v���V�Q6���͏���%�+�|�'�A|:e߱�O]0��v֩�����q-)<yO��~L\���e��3Ν>cJYB�,^'�tҜ�<1���Cksd����{��a��{?,�5�m���ݽ�1o���<?����mM���v3��Os�k��#�ki���"�N�0�,QҜ�6��S�3��E�[_�^�(�}cv�'�7�E�r�C�V��F�PKEePQ��8�Cpip/_vendor/distlib/scripts.py�;�r�8�����.������Y�(�Nb�jױ]�3��$��DHbL�\����=��{��{�{��n�$@R�3;̔�"�F����<`��l��Q�<f�\�'���{�f�<Z�$s_{��C���5J�-��D��Σ9O�L�\qv���4a��Bn�����H�@F�nx�X/�y4+d
��9�k�H�u�9;��>��>��dA�ח7�&���\��Ƈ0����5�R��4���Vr1���q�\�~ʟ�(�r^�	�sY�ڊ�����uHV�\�r�B.�\Ny��5`�egQ�������\�SnV�-d�/\�u��<��ؒ�{|�e� u�8�<V�k_j
�2��|��dzǓ;��Ý��%	|zN���4	�|:�Q�7�g'��o�oO.&g��70�q��Ͽܯck`ָ�?�r�����O}�0%�ӄ��[.�����׳x�`~"�"O��|�ׁ��y�
�!��8k����A-�������
�$jDrk����=��)Z��I>_EȖ"l>��#��]���n�6��M��x����'�!S�[� ��h��SEs\2�(���R�l8D�@^��$��{|A�)A�=B���*��@�\X�O����9��1����Ir���ϊ�d���A,8n��<�vd.=��f�J����Q�P0���E�R�#��A�f�$�"�hW�p���
���]�}dQ�l��fz>�8��;��9� ��8x����/�
�����>��w�/p���w������۫��Pm�%&m;t�iX�ܫt��U7���+Ձ�A���uJ4u�I���˻��>�]�b��;s ���g��??�����tg`��* �>�(��'\�롖�z!_�^��H%7�حo=���(a���� ��r&@�ن3���`�3p�<�W�3�/���`���Q!��,JF0��Ga�+�,��7_�y}@���!B�[9?L�M�mV)���
l��D4ȥ@h�c��xǖy�gfP�g�M�.t��<k^Mgs2��$��3�~syB�\�9-����D�F��27•���S��s���4����D&�C��,��e3�#I7ހG���ƒw�y�\��/`Y!@=Y$��m�F>��z�,�&�z��������JTN���"H�s��+u��^�����Um]d|-������3�4�Y��z-_�����R�a���i�Dr:u����b�����>�i�uڊ�M^���i^$�34�0�1O�1�o�������{P�>�؃,�`���
�#A=��<Ng3
G�l"��B&`0ď�_�%���,B&���z�o��Ac��'�E#��"�w<��Kp8��]���L��md�<
 L@�s��
����1p����
�i��f��k̋�4�0��R"�f��l{�`^]��Bd3&�e>2$�$�%ϓ�v[J��x4�H����bD�:�"B�Tx����c�,����(=`d�4L@
E��iﲭx��E!:������B�S:q�	���k|I��U+ף;��.R�	��ڲ��o�&��@0,q�"p��V���@���1H4Юk�q��!׆Ϛ�bn��>xB���w9HY�ވ\���d
z�E�lr����}<q���2����<��irI7�PeB>d�	x&�9�X娈;�E��|��2\6c�T�2��k��J�[w��-�o�#F�*&�� �<Tq�y��(mང߂�`�^��^�18/��@�z^�@�\n]G�Gq��r��oT|��.N7��=�'a��=�����c��5�!+7I��
r�t#v1qV��S�`�qSmgE�S��;�8	V�/3�`��+��z�`�v�l��+Q N��[oj��ޞR�۬����	�� �0C�R�U��A|��ZmR���+p��Z�g�el>��D �ґ��oR���s�k?[�Єh��!��������!�{RT5Pae
�����X��f$��9���E��˜Ӿ��Q�үe+L���1[I��F��Ə�a������yʃG���B��&F1O�r�!�H���_�_#:�4_��p�e� ���(����S<�Kj'��
8lmP,���{2�v����)��K%7|C��(�ȶz���4���)=1E�h�<��
	���È���ik���7�Hs;�=����s�&}�9V��="Tt�<�@�3B9$���q��"� oF<zj:ꧦ]�_3�S���Kk�9������h]�ó>��S/<,%�2����'�����gQ�ر��褲����*��43�k�l�J�г���
���4����1Xeɱ�b0G'�U��bN�M�f�D�.�
W}�B�T+���������:k�եcg�/m8�v
�uN?����뿀p��+��\�����F�����
���wדˋ�H�
EϔN-�I�+ٲ�Ϳ�}�;�5ch#�?�b��Q<��G�3l�^_�}{zqs��]��1&u�=H�3����Wp����RR��M0���D-3�������s�&f5�������$���C0���G_���-�n�OD$!�� ����đrl�	;�K���z�!�����/�Vq]`�;?��\��'W���sv~zss��]�������zt��SOE��d����w���	�!pϞ�9�m�&�}�-lE�@�m
p}�㓻� �V�#5�7%d��S�-sF!I%�@�Ċ/#	�u�f6�x��[ؘj��jv%A�qF
���~��Xi���������{s�J�~8:fa���8z!���@R�T��	}����U ��r�@ب�+���ۮ�Z�uh�cbj�L�4Q18���.�����@.rd%�f�&��V�7�#U�r���hbqNޢu5����Sa¬��!V#�JQJ#g�x��;�t:_ɂY�ZJl�\���h>�	*H��b��==�[�)��=�'���R�I4c㍕i��s9�`@�	M"0:Ar�L�<����`����z�Z��n@���"�*
�i%�A]�y�D��
�����|�t3�q�f�c�$�{�{e�loG��3j��6W��x�I�D&r�BHP��̥|ۘ�f�7�V�WA����K��R��fDg����H�*��Y�86=�UN�D�`�����:��Z�\=�����C���U��F�^N���i�!����g�c��,���Ҽ�l
D��\�w���>H<��`��l���j�I��)G��0:a�	3C�Rs�G���N
V��|�h���^�"�����?Ö uZ�G��@A���ۧ^�c�j&�Y�3�+�c�o-@�`U�S��:�$�+=�	�D�1��7n�e���<���R�~m;�6M���]G6�U:�7i�	�‹��˵_S��[�\5v��_��.|�*�V� >l�%{��Q6
 δ�}wh��4�R���X5��ݱ
1	��5�.�D���ۧ�J3Z��=�pC h�E�-�F�}t�Rc%�H͎�������~�
:���w�5�q��8=�E	����>f㥝�)����>f�u(�33Ȫ0����1��>��k���
[W���ظ�M���\ǥ����1^��`@9c�RUl�~	)\f���s��+�V�H�:8P�_6�t�!�Rq��w�Y����Y�Y�;AQ:@g�&�TN��9�c�N
�HcR�s���;r�UH��*aF	_�a��=��Ǣ��z�4��B_���#�jϖ��ž������V�B��l�OSy�o�,C^H�A�RG�;�(^X���-������/ja?�U��Y�G���F�Ey�xj������9l���9�m�m;j�fv��}�G�
���[}(
@�S|����3�M�8�����S���Ml_�3fl�$̣=�*G�4�j�(�Y��dF�1;�ڣ2��+ �!�d��5SZ
R]���0tm@��S���7ۛ�3�����߰ʰ6&�W��<�=��s灁j���G�,Y"�!l��;,�F1�;Ѫ��J�Z)���خi�wk��u~)(�lt�"�vͶJ�	��A�dž̭<��L���G�1��2���Rn�4}6��HA��3
�s�l(�!�ܫR۬��٬���)��pR
�X��t�?9��0����z)�C��H�l�p�@��E����,P
l���j�vIRủ � S̓�FN>k�uף2Պ���m�������ꔊ�c���4�ᶼ�_~\���12Oj sXgr�bW�d�!�B4P���5'��\o�:����$�ց�c��M�OO�z�UO���–JjO�Zġ�>��y���l�I �e��{Dm���� �z�:��D+a7���TMMn� �����rD[`�L�#q�Ң��R��e�R�zc;��a";����N�;��m|R���ՖQ�.�u�����:{J:#�Y����[�����q�w�ɏ5�=��p��΄��oL>�ZQ
A�c7H�WW�՟2�"Z�z�u�;��
ѐ�/T
�	ۄ7`TYk~�ЀĢaUvW�#{�3����Y|U����1켮%����ErV�o��V�;����E�H���pG��c�8��s%aG�1}��σx.���_�6ޟ�	��-FӇ@��ot^w
p9��s{t�vׅ;��[�ʃ��9�*�C�H�	3�ƅ��m��L���4��u�;~��w��&b��4kjIyͦ����@?��V�1���h�?�u�<����f	���QP���^��c� �+
�Y�06��]���ZG�<�$��
_)����Y���Մ-Rj��3�����kgvov��a�I��Br�y����r{���E7h("���`�(��!2��6�R�<���Sݥ�g4���ݺZ���-N���$RYa't	��D�֙%5o��FB59�k��G�	�����ʕ�
�-�8�6�Z� ��^)r�[_Ż;8؋2����OXi�-u�'�RP�Z��*U�S~�R��b�.beq�v�.~���Q�S�Æ@�M}&l~+	j��U$a������*
�o����R=���x!��xY�'���4<���S�PKEePQ�����zpip/_vendor/distlib/t32.exe�|��8<�+�$��	����A�.(q	nL6D%��K���-�f+�������j[���R��}������.�٠��B5�T�:<JH2�9wf7	�>}������hv��{�s�=��{�9Sy�6��0��T�a�3�?'�끿�i�e1���{�~��w���Ⱥ��
�}����=�࣏~�����ѼG�+��*�;�]�zNffz�^���]��˙���?�m�x~P�63F�fF铝�;x�w�4�]
�s�i�U���?o��{yȇ�]�f��a,̖k/�H�u3FC�!�aN��Z��f���Dl`��0�@�O��@�w���l���|&�_a��Y��̋�o@j���A3�1���{7g=F��e�?�_�����z�����0yЪ9
���q���}��i4�뜣�1�o���L�p%\hNú�� L�
}f�g���sV��.~��ဖ��������������f�av�L/a�oI�A��eW�es��5�WU�
<‡��&Y�����oAz	C�ą�nr �~����8�r�.�L�#�&�?�i`tM��$j��6bML��C9�P�)Q�\�z�j�|�����0�FsB��W1JNs��Q�+��-�
�����Z,A<;������"5J�=���~��
�^��d���~�WɹI�I�ٛ�0�K.bRU�p�T}Vr��F���8ր}fR{y?�a��R�b�<G��J�)��\q��`��/A��ߕ�a��=dE&�H�^�:P�*Ԫ���^�h6��B'�Yr�=����ހnH�Y7��h��W�������_:"q�\y�T��g��$���3�"��M�{cȦx�:�
�wy���eU��3�B`��"�(��:�7�C~ƍM��V -k�8������-跗)Z�e�T%�^���%�;���Ⱥ/���B�M������uG�q�z�sT���IB��
H��hb���+.�H��5����\y��c2�z�@
n�?I�"E�󔮲CAW��
 ���E�G)d#��C�)I:څ���W�ť��Y)�k��=jN6��a�F���x�(��S�T���j��)���i�Sk������͙P��SK?o>{:9�K-�],"�����z����j�|��+X�os���c�۟V��j�����mk����r��n2nPU���"{)D�Ҝ���
9}�)���_V�Ĺ^7����Q��g����O=��U��"j�_F��٠�Z��|�%�4�'Zb������%n����
��9�hY�
\�՜2��s1�l����<4JͱA�#*k(���C�4�l>��ݻ�
da�"򱈖�n����F ���$j��,?�j'�����]��T�p���[{���2[�݇.a�!ڦ�0~Ka���sN�YT4�~��/���[�}L=�41>���g�d���+j���!S�e�vV�����7�$�8!�sU>��-Ж��ܾT�p.V0�.����P�{�6=�b�*F����|l�)�׋�3r??�ۗ�	mz4�X_�"|�'t�	<k�K)��%7�U�w��BM�T?���s�n������c�p
dN��
��Ll�c���Mk7�#4��*2���NM����'�N�s���
i�Vh��l��Dsi�
��u���F�>�]V�����X�:rQ��Us�0���ٟ�X��Ő�f���jN�a4p"���@fJ~p�Q�ս�}Cu��Ԙ�A\�<~��ٴ�b|�γҞ��dF��D��(?�/�#���𬗬w�kK)�3��]�P��d?E���	�X���F~�ѵ.�mLӥL��t)�O-qt4|��s���u�l��#m{��^`���༧��b�q^ͥ<���r��<�4���k0SMMp>닶�#IK��� JKS���0����"y��O�Wj��)�!�ԏ�sDB�\�[��r+͢�/��`���H��I��Dq�
���Y��>l}����	�c��s˫����f��|��T�΢p��u�FM�� />�c�e�t��o[\���&VPVu�^��7�!�fS

�W��"��3iIn()x_�h�m��Y1d�.:�{d��`��h�qH	�K�N$	J=_O�;dJ���\�rJ+��a
bN�1���zH6:IX�_�/�,DiX�T��6x}�8 eO�)
�QXE��f��P����$�Gb�]���g�R�S�6U��=\��	��=�|B�̏���=�<��JF �}�*Z����OD������y�=F9�a}�C�#-��CAW�ۇ�!�FM�˷
�����&��D](��$
�����G���A����*�8r-$���I�����v%��Ġ0b���b�UJ�4C?RI?B1 �b`y����
[�x�#��cqx{�l<����q�M��U
B���$�*Q�P�����n>�@�!�G2<dl�&�� Y=�p5b�t��<��+{~f����ɞ� �������݌�����!�w=���&G&a�)��.W2�נvZ�l�F��'���q���&�Ct���WY�\{�+{�l��/g�5R�\ᓖ��,G������ʙyׁ�U�VH%ׂF,���f�e�,H/C�d:K����!�Ϲ�(d�k�P�AI�Y(�i�D���
gm��z�\6�娶@��H�LJFHr? rK�eh�T�b���=�PE��Gܘ�%�p��1^Ґ)����;���l�Wt����EQ���e� $�^���#�|$hn��Mn��a ���
��6J��Z
� ?��9-���������:>U������r��k��
C�x�ǁ�����J�W��dOON�{�<$WZG����e]ѣN�Q'����i��]DZ]�|���PAX��'R�HU6[���PB���]�W,Fd�\�u!�ĩ���WUl�gEt=8ś�H���*\��U��o�+��2#��l�2p9�5��J�L�r�@�@ɮ"�Er�D���)��6���+a"G����r�]E����)%��ޘ*����''6j��S�f�4�HtT��?qY]�~�U,Z��h�j�y�!s��&�`�����
 ��p�"�M �ʗ�ϧ�?O��@A*�:�y3i�n��w4_\6�������J��x������ú�
�^G���i��<�Խa��^AG��Eۖ�eӼ���Q��<P�|��\N�g7�C67�ː�X�+4xqY��Z����pôbZan�Vu�������{Kiv-�y+Y,�bv�8=m䌯�È=�Z�^��|�~�mE���n������C����Db�o�b�/Dbn��eM���f�D��B>+��	9��/� ���t�;o�CC�M�s��}�O������7+��p�A+�J�����H��{���o7�ޱ"a����$���B�$�f���]A�;�u��U�q|b��B�٨k�0Ʌ��p�
����!�Ofdg6P��� ��`]/�ܽ�s7�W/QI�(W��=�`��ʯz�D
tǟ� w�F"U���@ne��iy!W��A���]7�VJ>�X��X-��;�K����ωqcí��4��
��v,��#�O�2G��*c�$�j$D�Ećb���]��3IkNb�*O�n-�fzյ٤�d.�rLE�^m�L�Q�č͹���sU$ܧFn�>:���u=ȝ	Vy��
9��JY0.��B6d�55I��gA�F���|��\Е�,J�f|�Fu���dUP>p?+(��6@�T;k�D�1��Ap���8;ɜ�p�'D�Y��o	�~���ȕ��jq@�U~�!+*5��l��wcv��
C*5�ȟ�\�+�z�Ԩ��l��[p+Z��`�ts���b���`���A��C�W�]!NV,f��6�

��O��_�8(7����mX!6�2��Wqa�w�q}��z尒*G0)8�d�u�ѵ�(G��
��q���@ΠݕP�@&���t]�T�=� +��{E~:�ꊷ�{w� s�zA�
\C������4ZU���%W-�����!��C�cO#�k�-��/�b-Z�M92�e8�8��$�L�`�o,��닄\�Z:�"���Z��M�ڱ8��z�r�j���2w�|D��GȰM�Sh���<=�ͯb�)fSqs-6�%��T��y#�@�2E�nԩ1T⌽E���Z*tF��R#�%������EV��]/)�KG�$1>"Xg��ħ�Ÿ����ᲥX^��[_I��:����2]f����SL���:�l�1�݉-�<�՞fx�d4=(���zI��T�z�K9�(�^���/&�t?����X�#����u Q�@�<{h���%��l����u�&�ZM(6]�[?�Wi���R�e�]G�%�Նh<���J7�*Y��Sd����0�C0����/�Ns�}![=���r��qh�Ch�D�!b�֋E�T9�/���
���݄�����̷1f�L�	������5X����\Y�d��*`O��:�d,�M��i$�p��+p����E+͍&i��o��V�	˗#�m���¢��Y[���	!9U����
�(��2A_N"IeSR?��,���fs��1G�:���t[�`(��q���/L�#�.(��ƯH-�hg���k�Z^���k��ս������xA�t(<`�����c����&Zk!��߈�"N�k�%�ɋ`ebMJZ�t���X'8�Y�Oqb�?�Og^�[P��OEI��
6�k_���0.��I^�K+�Z�<	��9��kr
֡<SzN��Yt��X��0�9dMVr`�,M{��ԟ�ԏ��\�k�7(�G��/9WijyU^�)?�5��3Rm����j���U����T3�!�;�� ��?e&�u�g�%�:�猒@$��Z�޾>-�:C�����vh�*L��5��V�Y��g;��Gd�j噍鲫�5Wuu+c�]E��f:����D��D,�
9ܙz�l��=$cݰ�k/`s�p��V�����A���
T'[�`���E�&y*U
�Ԛ�=K8fE�l������U��&'C���P.0G�N���?]�%?��4_�O�ꀾ!�-�mai��!�� 6Ͽ�4蹮%>̕�LR�b?R/e!��,�&6қA;RDmb�ȽBH����vX]�˭�D('-�/������*dy� �@R_mcj<�y@�֚����=0�]~�.��5��-�ʼn�U�!=�t�e)n���q\�K�:���F��s�D�!#9L��)��88|�8d�-�Q�v�p^������<d�s�y~x.7��-�[���/����y� ���� ��$s���<�����?�Āp��	�TBw[X�/!�F�+���'tD�O�S����1^<�"o�%dNl7�)P�q��``R�e�J/���Ҟ�m*!�@A(�j�.��.-MO�
�p�Qx�VX-`q0J��P�FA��z3T����V�KЈ�Z���!)_jK���(��@ZB'=i�.�IU7q0��
Wc-Q�EjL"z���Y/�#i���Fm�y�'Uٚ��D!��NA^�9��':q�
�j��ʛ����a��$�1�t�(oW!���8f�Ғ���2LFT)�+���|oƑ��|b�(�M���1����*c���x0�&�:X���Q���}J�=8L��4��n�эcJ�`�5{X��3�j'�I�D@ƈ��$h�,PG�q�2�=m=#��,�����7P���� ���Y��q�>�h��0��h�@�B���7�ڿ�������d�"��� ܼc��ūT�jͅᴸ��g��G�v�<�*ϐY�t>������L=�Fӈ��H��D�M��D�-�F��%;�[��
&��h>�C���E�<�G���1�o 7a7��A�^�Q;p���[��7��-�_2#����"ጐ�&�_H�e��:+�r�Tyڽ�����Ȯ�.6�a~�x.otH`�!�@݋�����sx���Y&�@�F�12{�7�����y�i#����9�B|d��cJ7������]�q�	x��i ���9x#>�;�B<NgwZ1>�=��QK����s0��o��	E-�sJ�+�� � ˎV<
A5��	ER�[��eԜ<E}��MxF^� ��c�ò�v���	�Z��\G	c?^�"�Ru�T��{(��x<���b���!�7�W�'-��r��J���p�d�O���%�4δA�&6ۏ�xA��ZNBt��-��U���e�����nmI�҇�d�V�"��oI:�H�\`�%�88J�8bL|���3�*�E�\�?i��nG]={�&��6�ſ��(�c̈B�cx� 6��O���<*����E�Ż*Ш��p�	�aB�lWƟ�E�a��Ճ�0Ԯ^̯�Dcg�U&b��y�4���u
��*�]��~D1ft%�.p���=�����ƥh!��<��0���
��:�؞2#X,�,�Q��!����z�iҡ (%~��E���L�a��Q��S}gi���Ib{&��bW����AS�H�H�}Mt{�t��<��'��!�s�<�	UK7^Z��*�r�U�h��KYi�d��F7]�6_!r�e&T��I���T�v��n��o�DנywQ.���P���5�](	�_�
c��67���K͵<�ȥ���!۾��P�.�w�9a-��=�s]�<#ǡ�C��d<269�n*�J���^d�H�R��	�r�oP��=y�2)	���Z���i%
������I+Yi��r�x�MM,?H�Q"�T��-�
ɕT���cu�Rc�#65�ZX�T>��,x�^B~�g ��V�
&.ecg

/k��r')�
�R�4�>ׅ��O��N�=pϯ�>���Y���A����R�>��
x���@�ed��`�Y
�w�և�S
L�sP
��PJ�%W� ���l�_�9�1� m�[c�@�6�J�z�QQ�rp����䅿h;����
���o$oQ����H�t�}^6=yV�2d�U���F�oh�Q{ȍ�HT�J������6~\�x�s���/�ِ��\f~���8r�2���U���f��[�g�Е���%L�"�DԠe�e9���.�X�}*^��7�)�i����mENf�:/7�e�6iM�-�U/���\�����j�50Q�%W<��Y��E�ʞUR&kV���j�&*��\��*�c��L����R�K���VU���lz�n�O��B�X�rV{�F�`���z�����T5(/���H�gŁ!~e�N�����Of˞��E�8���G��J
��F�E�+.w���^S���r��&H�Z<�	���iz��Ep�����Z��n�:������y>|�V#��\N����^5���,�0Đg
� �h���Ӑ��A~�E˕q�W��'�[��O�Y�\�B���x?L-��r-�@@/�RI�	H�x��|u��8?��^�ҥ�ݎ$
$�ϕ峫��:U��X��m� ���CC�ʘ+^�͎�����>��69Z,>af��>����z�y�_^�e���Qv�]y@f�5���S f?��v����;�zW-�rյVu�
���!��R��a����&��媏�"9:�!3S��V�_��q{�]U�-����99�S]�R
��tU��G=^?s�ϳ��,%��a��^-��g�]���dϐ^>�$5��\�T:W�h6���P���*�Kߝ�=��V@}�_XR�
.�sog^G1Aȫ"/��.�`y��(��R�2�<W*7+����fVZ(��Ju��%V�zb�\�w�LJT��>�
��'xH�ms�UE�>oc��,S�����O7BΉx?�,��z�n�:‚E�Rk#jJr��8�"4�v	�Oy�F��dէ�@7�n����o'��]�w?�=�d!�����E۱�z�@�.u<����*%�.v�S|`�e����q�?��˲��Z�Y�{�g�����;Tڍ�M���H{B��>��z1�l��s�f10J�b�;�r�^���~)���y�K�L�見A�����o���m�b!���}��2rc�.���[D��3"(���@�A�gco$����d�{��4�2n�9xM����A�^�x�0[������J�-����%��A�-Cݟ��ۡtnߑ`۩�=V��/aϘ�M���]p�^�Z0�B�B�콢H|�}�j����{Ÿ�/�k�\�D���l�S�b!+\�F��t^����,��Mt��I2��i�To�Ջ��s�\�ݬgoJf_�Y�v
�f
�%���p�IaVq-��#\��.�2�Pwh`#�2��q-�x	i0�d�4��-J� �rK��T���o!�k	�Л&�Q�f���6 ��c"\��b8/JI�([�S���������P�é�1Q:ȉcgᵟe!b,��U��4!U����	K��� �>
�7��J��ߌg�BƎ�P��H�'{�%p�{��iKi!=B�����k��^
��*m~�ϛ:c��!4_��R��_zh�kD�kfDk*���W�hޞ�L)�"��;Z(�b�n�>�G����ߢ�B�ݺ%���{S��'��Z/�4
B룴��Ō�/�Y�M�0��bװ��ͽ	Çy���&��9��	:�>G�~�n��A�L�A�k��Q��Z�Q3�����sO�P��?�?&��g!�~	i:��$������p��[�M&_�
W��!K"[o��Hɸ5�jA)%JYmy�9ABN��t�
hD���ڹ��,F���&�� ��B�F�T�^ZDÛS4��Li%�ͷ�{hL{-���G'��8���6r�.%]+3B��P�����6L^4(��uN+� m�J+�p)g)�r��raIWO����xxr��Ȅ�)���"��y�:lMM���u$D^��q�0F�\�6�b)h@;�c&=����/�u\�#���[����k����q-sŀ�yײ ��ˀx�"(�Z
��
$��آ!:d6d�X4��p��!�/���A���[4��2p����a�<>4)p|�U�@@^7��K<��i�w�L�#sI��vU�^�uL)S�׎�FфɈ
)W��5�gG��%(ڒ��
2��U�w�Å���>�K�Ţ�)� "�5k�r ��
���!�H�l�_	D�*�7�/��S��)�i\��)T�)�;���Z��V���3|�2N	/��xK�l��‰B۰���1ƛ�7(Y��,PRv�l^M�<J���˗�B_p�,�����]V!_���H�<mI����։a��7�-�{0�|�0��aAJ)�	�,�� +����Q��kdZ�2�_��-G�!�^Y�_���	ߖ)C���L��Q�8���S{�wK�v�8�����|uϋ��y�:2�2@����-��9b�V��Ԧ��#�c�_4�o�ǘ�@�ɮw��^���P�f�( �m_݃��v4�F�$�}@�T
��Q~�� �fvľ
-'ƞ����W0e�B�1��R��|q�78�<��~�t2�.t2��7�v'��6�_��q��	���M柡]��<މ�=�p�f ,S��e�uG�
��]嬍p�]	Z��@�`(�w�{�8��yi���b�/��=de�va�8=X�SE�jSi��R����a�⧋��_%�L�Z����~����K��3��e������d���K�u�ai����𧶌pp���_~��/�f��{3�eZm�{���S� C�X�["�K�>�-�v׼@:�paXoVs^�.�K}�\Ү��P�@�#����������ۿ���N�����0� �t���t޽��k�o[�A�[B�I��hi
��>7ԍ�n��#W�i�C�e�,�d/d�"�҉S����sb�E��o[]XM_�g5-N�bk�j�b�1}a#��Qy�nMA�)��?���ʽa��b~���u4,?����,L6u��&lHoZ�5�\��d��&l��k^piw�M1�3L����&ީ�������3ϣ��A�/Z��5�������oжHn'N��3��	��z�I8�G/����'zԜ]�r�CH%|���؉��$-����:��)Y8��a���*��-(F���Z�А05j� �j5g74�v�w����ea�H���rJ��6��<��Ƽ��+NyB{��ټQ[�Vz(KV�Բ�O�cl!K���Ѯ'�0�1{�h!�kykv�C��hO��y�J.��d��a=艺՜W(����u+D�,��qC>���;p��	���ZTM�'q�45~	E~�\_��-���Ҏ���r�)Gb�fF���<�|�H�$t���F)h+7�$��ۻT	P���4�2�(Ͱ�_��܈VM�Nuu����m�br�-���#�S�Rk����BA���7�K�bO������G(2��WY������>,~3��h�,���v�e�w
�R3��r�U�b����y�ƪ�@V��G�<g.p�_���;t"d���D���Vv�dk
N��4�]qy�Ɯ<�[�.�Qj�Z�8y0��mhˈ���r�|ϙ`J��_gP�L�
�R�\�x�$����,#����y�&���y��J.ƙ�~�W����@Ԃ����^���,5O)�s>}Zw.��=$��-��zyq��^��fA�S!4���1�mq���ּk0!�%�h�����uֵ���Jgm����lN6|�Ql���R?J�h#N�Bh�8\�"�L1�
y�Z�*����R�X�������� ."o�Mba��2��հ�#teЍ3<�<�^�'��f�M�ɍ/�G��2�%4�\鎺X�䛟����4٤��O��PjN�Glj%+@�IÂEB��u%l^T!�����Yu˩;��V~�#�~��n�|Жx��$6
"�r���'�koW��87��6�^�E&�@�N~�Q�a���#���#���o���i� �S~�0�݀S�M���$Y���_A�M�#թ��;��a~��j�#?�-��h�T�Sl��9/p۽�D�ơ��Hܢ!q��
�ȀF���V�c�E���f���Qi��Qc�&V�4b�G.t���|�ǩk�$��
25�n�^[�ћ��:�]I��lC�����K
6��|-Hn�a�L�v��
��*���p����Y�:-��5R�j��̨9x��Fsd`��Z�aFԜ��fu����o$LR�%���$@_��";�`�q�z��$��)fb��c�����a�.Ȥ�v�,�g}���/�QU��xC���h���l	�_���������O�Zi��w�.-�!���c[���OG��GZ�`Ӭ��|
��ف����~
y5�D�$��9���סЃx��4am���P��=���0f��Z��6��&��3F:�ͣA��*F�����ć�aN'�f�Y�R�4�D!��5�x���-(q�P:���)��"x1ѸꯐJ/m��q�)�G��M��#ŕ���~�����~��-�ޞ�ޜ�[��V��5ho��*�mE1FTa����f��xG�����8�j��>�RCչ7���3��?�|�QL-,��U:�����\?r�2�y��[����"9��E&5[ɏ���Ilh��F�^F�me��	�/�z��l�&|�t��/eڋ���!=)##��i��?^,.�&n�bq
�A\��Y��8�Zt���(u�ԦNȝ���Z�(=�i��@�[_��"�0�<�zR���Q��Xmjꍥu��2��\���U;��ԏ�Ν�Y]��矱Iz.M�QZ���<{�JZFW�T����Vj��Z7�g�Ѣ�k�]#�O�Y�z)���$�~���5X�f�xq�s�f���M�!�j1e��{�pChQ�ϖ�:J]�A�V��7��{�KɆ,�
y3ZH̯���T/�
u	i�7�/Aб_n��pB{������d�t ��H�/��%+�,���s�4�l=�,z�!mV!nF-���i9������n�r)���M9{�zLl7;k���9e�6z�>��O��r�5���`T
��.S7��1~�C�+�y���C��A��S#���89�1��C
���g���u�$��,�&���f9K���|�X��c�Yr1]g@	E��[�ag�\�_���h��J�x��n,�$�%�vN�>u^�8:��	�����%~e��c��nr�EU-J�^��b62
��T��<�JQT{Z����,,��Sru�R��N����&�As�Vx�#��Ȍ����Y�ս�to����)�Ə������Ei���:�H��@��y�:�+z�Ā,�z�����ՃX�>���-?C$�_q�{�+�Cb��%A_v5ڭZz׆��Cr%밾r�$�����A��or_�B�<���_yU�O�H�P�c�kY�S�Dn���W�%U��S��Y3D;bH����A��~jR�*�h�	Ŀ֛�qοׯ�q�F�ߋ��A���~硹%�����:�4�Q(��CJ�㭉�D���v��a�Ъ��(��.d�rG�{~ӱ���P@����+�w��y��ek�~�PxI݃]���ɸg|�<�[���5WuU�/�8�L�UsP)�q�/�T��j�.j�ja��w��E<�,�;7
�*�
���[k�[8�5�Ksy�)���k"�Wh��s�e�

��t��}�q2s��ah?��힟���×�-�2������mwd�'�zX��N����y�#��#����ރ��n'�\��ï�к[ĐE�P�N�I�*L�Ƥ�;��{kō�<j]r���X��dûU���ϸ�,z�8�\�	��b�j�DHt���&��q�����o��[H��ѥ���4G�#��&�M�&��iM�vFk��C�ndd�dz�8�p��VŦ_*)2
�q/��Lхt^J��p���n`e_�2e�r��~�ir4��?K1�Ռ�1��"�ۘ�r3�/,�&�Ir-�Y��芛��A������XEޅR��;�i��Iy����8%X�}˔�`���tb�['͸�G� {-�&�f���"-�FKq*ib�$�!�~�M�lh���`Q<fSK��ՇTt�՜�����uG"hFЧ-v^{��m��ԀLvm�e?��i@�g�v�f�C�4�N�#���/$I�97,	��\V䊲�v��NP
6jv�������VZⲣ�~,Pk�h�WK<��j�|y����X�� �=c�n��M+��nG1^�m�Od�&��]������P`B�0ᦤ��i��k�$q���~�Wp);��D��j���bL��V�XrGӧ&����F��k���r�+/,�{�l��C~�E
�V?�0�� _K�qN쾌�X�h�,�����b��C�Y>���!З�^�r��lR�,�S#�ixy�	�f{�-Y��p��滋�o{��}N�嬓�K�--5����a�T�Q�q;'yaz>_'3��F�d���wHՃ	\�־���XT�
c��.UG�T@�2�������F=I0��@�$x,]���A��l��$���T�`
0�Iv�&��P	<���i��������L	�/�Gx>��j��MNa+,N��>.��."�S@<_:'�U�$�A���N1N�l6�^�/Y��x
�?�l�P�l�)�J4��R0����?�v1��}k?�\�\e��>M��"��t�h
�	�d,x��dEb![�K��68�6�h*o���w����QQ�v@���ٛ��e�6q��
�����q*�{��`�)�B��o��~&&�5'p��ujҾ	]������FA%C�hʪ�2�y�?6j��A�T��t;F
5�F��bۥ�)ߦ�$�G|�	p�4^�-]U![��}�%�<Gd�7X��5��T娥j늅�?0T�'ۓ������m�:?��I�Y�
���A�90l������e�t��\��4_qSCU
���^�PeF�����I˜'W�=>�=�ьT{�B�T�9F;�όT/�2RLB�3����]R�w2���3�SMH��ǂ��f�|�S.kùї������|��C��3�'����]T걩��2��| ���v�.+Z��>�N��2e�@[7�8�r���D���V�O�2��:�.����KX�{H��
���m������lr�>�^/o%�%��f�ג�E����!���A�[q��r-Mt��+R��$� ~�����<�K�̾?a��T�yP+��r�U���.�燰�=M>�d������g��UUKɇ>��q�W]τZ�*�VV�Nj��5����ixR��JIT��6���O�d�.�.Yw�\�W��|�O#�i��=�؁&��`}���oo2��s����J�K��)Z��
ׂ��t��xXTn������{�(�9Zx��
�jx��\@N2]�tO�A<�֬ԑ��4����Tt��m�fj-�`7F�J۠oY�3��P"e)�T�춉![��߀�a.7Y��,�?�Lr����AL"�A:��|/I�@����B��X$�����)J�J���՘�Z�B׼�-A띜
rq��B3�B6�}�f�ӻ�̊��lٰD��u|�ݢ��\���Z�yme���Pg��5�U��5��
!K>�߉SB�ːTm�k���{Z�0��i5�}7I� ��":F�J�#�`�\�Ї���[T��S�J��XwH9
�:25�Xb��'����T�5��}Y�e��^_��B���k���t1�o��
k�J[S�Ӛ!s�R�nK�^�eI��2׶8k&�(���9�j�@g�3)�5:��f'@̤�]��g��d)t�-��sSԜ^]k�h��f8µ~��J��U�j��
�����&��O���\nA���M�t��ĚSSހ\ۃ'"R-,U��.N<�P#�6Â�\��˂L��j*-Ǟ�to��c]n�Ā�0��$����|Gu��=���[-�k�������M�೛�t��vS���V��.N�(3�=�+a�0N���櫇�+m�Rh:��~9^�ʑS��;��F��f��ˑWt�t2ڭ<��-���Ɣ�ؓT�qr{�(�7o�7d����p6��=�I�8n���A	_G�L�׷���9��G�`6u)N��+�	�4�����,��mJk's��e�,E�/�vMiA�2���y��^j鐣�$��ڞcYe�*�>\��QH��p�؊�b�Y�Łe
�l��r��,p'. S;7&jO�*�G�{.l
AA���J;�DF��ω���ї��q]����K�0d�����+��@����KŢt!��%����
Q�vٌ:�у�?���J�T2�^l���g.��LH)q�\��L9��,�t�z��T
8@Ig�^x�"X�O�
��'h"���|��/	(˨��ˌ�,-�CUi���:G;���Hrοu��[̏"K�;\�~�>��Vѓ\�@�lE�|`�;�!`׿���3#�^��SY�i�H:���L*�����>��ёS��e�f���k.�\�I!'���bft$o�"J:��W�aU�4��ȗ�d�}QZz:H��V]��Vn�ֲUIJj�}(���r4�ėDuIVvچ�lX��p�A�}}�@i!�BHnW*(��n�m&K�o�v�Iw_�Ca_�uY�K�}C��?~Y�*Q�/ߊ6a��#�P[Y>��7_B�!K,^�B`��Aw��E��?���xk���T1jc�O�w��0>l�x[��)3�)�_���5�/*X�_s����<=�2|�z�yc�<�ը�ȥn���e�n�QS;�M�+�k��qG�����h�*^��=��{���A�P���<�n�g����+9n?~��_���
�n͠B�S���Q?�}���0�'<d�>�PI�(�M���Hb�=�e�1�|��q���->����!�6N�R���~�m}�+�m9ε<��0��>i;Z��A@n��h[uG���:x�k�U�eU��
9�eU�f'#m��V�a��=�{(&�P�AL�bhWu��vU�]���@	���d��}2l����Ua�1��d�1&C��R®�Z*����1����O
�c�S#(���5#(�t;�2{�g��z�׌.�����b)bi�@rE���/Y,�N��钏/k����m����d��&UQs�Ɨ�hPE�+�[6�~[�d8/�,��Ln�6=a@k��Q�۔̻`�)���K��-��!Vq-�|�kY���r-��S�,�l�Z���2�e*�n�Az���m0�3���=�&�R��-�tW�O��8�H� P��T���v�u��}x]�`�F*h}��Z�,KX_��/��W@:���VTp��A�n:�
�^�n�kt�PC*�fH�sfƟfF&��I2U�˫�9�hþS��s-C	�*ʹ���;tS;��z�bG�Q�A<�vo)s-�;l��FI��o��/DK�R���>�)�&O=�[>�Ӣ�mѫ���
�4;�.=R˨�-�i�
+���j�Vw�
����ѷ����g����6'���i��=��r̺T15��iԍ�Lf�j�-�7��j�95���[C��xj
�F4�z@`�Y�y� ��@eэ�V�f���CQ��2���BK�h�V�f�	���VQ���\A��ݢ�:e�@�+�Z��o�)~aLӥ����(:N�"F�|6S�B
��eZ@j��0o(E�9aNE�ۃ�i�T��̩�.��T-�3U���J�Ѩb_� �c�)vu�)梦T��Q�TM��IK���,��xj�T؏�X�9ч\
��\O-�6Ӥe�HK�� �fOEiGG͞�f�o����Q�����	��X�s��Q�TX��jN��8�e<5���w�;��T��sj�5�h�HSQ�Ӎ�F҅nLE�Ԡp^[dTʠFZRa�5K���uK*�4��T�͒�u��Q%�D3K{�t�5�z����������P�Tn���}��|%�cqe�{�a��4�E'��F��&��C@8�Ц�p���icu�2�7��ŊGc��<m�/�jЂt	�Z�U�)Ǖ)#��y��R�'|S���'*E�|%<y;�����RhQ��Ьj�4C��e�V�����{ȼ+
��x%��/B���h���ej}�1���A���n$�[�3w�"��Q�l���4m�h�x�bjj�_)3D*��D-L�n�7
��k�U��l�Y��ީ�amE�X '��U ���U4�F�+|����-!~��J[��3�p�g�Q'o"�?��S_	N��uNf*�d6�_�} ��Α. ~\�mO
6���J�R�8z��Vs��i�'G%�]<�r�xD�&�=?�'��J�7j�����.T`o{m���������T`��R�=���:	F���(�Udj�?RO��F�����}����W�i}uR=]�Wjuz�9�)>S|t�T�e5�(�����y��r����#��P��5���o�0};��tq	�[:�Ev
J��M�+}V�ޖ��m�#���Bm;�y�v4Г��֠yn����_j���F m@9�	�Tos�O�m�C�%L����?������]%Q�B�dY����I�9��w��Z^�n+jL�h9XDsp[7j�U�k�!no�n%Ӳ�J�vB��
s�f+�h��Lj�T�������
~,v�������!���oU��5����/��t݋>)�P��Fx�xy��_��b�
s��X�:���@6�sbp��('ՏtbAM�Q׀�qB׍hR�'7$ʝ9��^�ܬ>,��}X�=‡����R�a��aqt��ԇ��k�1���>,b����Fx�x�ռ�o&ԋ[�s�� ,{��}G�[ASo�R�~+b�$<V�'<V'<V�Mx�(Hx����X1�z����2�S�7ᱢS7*&o�,��������&*u��P�����C�a�~�cA�|�.+�tYA�Z�(�}{�80�"p������+|Va�1w��f�Ԩٰ�M�dE�>+����53{��"jX����
�{jL�gE*�Y��C�Y���_�Yq@�Yq:��}�>+@%{�MR��J �IsZ�9�iE��4�i�+��4>��ӊw��pZ�3�uZ1<'�%�	�НVt|�ӊק�rZ�7�n��5��_֜V<��Z��N+@r�z�5�a�'�XE�`���m�ڕ+LI��(ej��#=V`��I*�4���\�c�4.W
�>��ͱ�=�#|������>	:�/j^*���Ԫ���ƯX4�U���KE|��
��VE^*J�^*�'�T�=T���P��VmOx��kB�Jz���y��P�
E���H�z��<T,��76a��Ky�����C����[~�Ыޣ�5�C֬iT���P��#<Tq�yQ�
$�)����O�N
?�^�R��ԫ��4@mBŢPz�;^+4���k"Dӵ�)���/y���ZQ��^+P�u��	���C�V�� ����iN����N+p�N8�� �pZ��Ұ��?|�i�I8�81p�ӊ\H�N+���N+>��םVP�MN+F0�+�V�'���y�ӊu����B�͸�^�&��C_CY����X<�܈�V w<�������)�Y҈�O
h�h;�Qg�(����;�}���Qܽ�SE�Өm�dV�NfE��y
�b�7�N��~�Eg�;rx�
h3����BF�HN�6)fo���!��t)����CT'!У����O�琧�an� ݪտ@�_�4��NT�ق��>��W|��C1�����lk7ލ_l;�_l����ur����[�<h^�3��v��ź��0��}	IkϰQT���!L�]ݕ���x_@�����Z�r��-���>��A�(l�Ip��ezڷ���G>O7{����W����b��+��Bdt)����4�u��x(�_�rWU��U�_�7���k���Q�
q�_UoA`z�A�sf�&�m̡N�a���'z���v����X/|
�RY��g�v��&�ʶ�A9>^�y��k�|y�1�U�͋�����:L�4�~��@o����R�y����F?�o��c��h"]��I�	g�w�j���L#���"�σ�:��8��Z��v�5�W�ET�M��Ba��J�I���v45�9G�Q{�q�~�"�EY<��i+�gOUA{p����c�;w�5�+��E�<^�\��6��C�2���{��2i}MH�!�1��Yf����2�$�II��Z=��ð[����%�`���gJ��R��Mj��
�L@�^rz���b�>��:p��(/��G�]#�QZ��Fi���#�]��6�G�Wl�X�ȇ��b�؆+��m����&7���~���O����,�eUm���େ)����GL3�i�O��^/n���|ٙ]�g��>��j|dO�Gj1�|� X��ө��Cf�w�3N�}�q���6���r-7�b�d�F9�-��R�_�뽎h�W�a
�3k�i���
������E���x(v�F4c;`TUr�Ғ@/�\�g��k��+�UE,C��X����y��&$�E�W�wes��{3�?Z�L��W�+�Q�?��,)&��������;^VR��0�ކ�S���� �g����Wo����z�FڼJI�.ŗ���뷵Ir쀊��L���"
"/_�1�f���)�9�/(�	�K�c�T�<(���*��!n�Єf2C�ѻ���y��`�Փ�_�Ĩ�t��t��r����e/�~{�
�
��k��g/&��ʕ�*{�#�����Q�Ԅ�f��p��X�4�u���~3�5���ܳ�r��@M�u�mKi5�!U[ۦr{#�r2�N�zs���[} _TZ�RT���P@u-����~�4��[�҄_@I�;T� t�k�1��/���҄�r��4�S_=��.��6�`?U���K���/bk�������rC��Y�Q2ѵ0t:}8�Ev이r�;�CG�s�A�����&ܽ �_8�sCn�A�Th��lK��i�SS�{�d��	�Tm-�yP�?Χ��f�Ų�2غ��K5�����[4I(��Ot�݆���S�h�`�b~D���H�Ҋ;��s�$�Ճx���*��K��#.�*�Zo_w�L����C��?7͜#�p��������y�:=�i���\NP�?"�O��C�I��>�鉥����X�`P}�]_�
���P����,~��)�x�ŝ�*�Gr�jbC;?�Mn}���Ax���A�Az
�X��Oj�җ<��4=��`�����J����F;d�A̳�E(��C��jqu�m���%�9_X�
+cf §�w��/�(�=�C5'�!څ���
a{�fώO}���̱"�����8��ԃ�@Ɋ-p^���c1L�ۖ�#Q��'�yX5�g��Y�&��sٚ<r�T{��vH��G]G5k�N>M�=��RmJz�u�ޒ�U���nҵH�"C���ُ�+�M���{����|0*:�Z�JTT
���� �@�(
�DB�a�+����[��Y7�u����1�����JK���4�D�}�9g8 �u�����k�>����k��}ӥ(?f�a���M_ϋ]Q~����oR�r��(�EDۂ�mR�:�Lv����u�1��� �V}%�<^��J�QG�d%{FV�n��tN����75��v'���	���|�������uW��	��D��ė,b��A#��[�0�M#O��LE!� j$�TM����6i�d�vE��L&�E/���"23�yQ����E�n�Mj���3*�y
���BߘYļ9�oWT
�vJw�nv��D-�ҡ��%{�(w��T��%���_�{8���_Z�=[�l����
�m6��|�?�K��{��rO�����J��@p�;J@�U͒�רn���w�.Y{�]*��GM��.L�����G��w�vۃ��t�>K,03�)Ž>❮��m�]SO�~�W|��_����t=9�~j���4��`�_����z�)寠w T��?.���K���K��R�x��D���E|�0u91�ݲ8�u��]�XP�,�j��j�xn/�XQl,�H�C�a���H���U�5]�w��z�ĿPH=��,�"���(��c�G�:�:���(<����k�D�|.�Xi�.N��:~+’˦�Q�����G}S��S�g7�����e�j�W��*ʏ���.S�-r��vI�d��{fě���gB��3��;���i�z�	.hMn�z�eJ�5����jG���,<e,}Z>[-:���Юe�"�D/q���X�P��z�����Q@SY}A����X:
K��E]��ƒ[q0�X:�Q��5�U���Tg���6�m����WC�/nL�ƒ�X��,�:�r<�_)5cI�8��a�"�0�bIhIᩳo���S@��ZFAp�8��a|0S���%�{9���܍%�S�`���{;�T
Y��G���@Iɨk�c�B�r~Bx�I�q�k�R��Q ��59˃��~ҍ�v�@��%r�}���b�Y��\����"G	j��⻝�(�g���/�� ��U�._q�T���,R��pG���E�
ͅ��~U~�'}��)j�aq�U��`�)z�%�PU"ʱ�ņ�=�bѓ,p7[�/��DWB��=���N誨Gq��	Λ͇z��?.ҫZ��ᮏ4T�ĩoGRL��_8:�kI��!a��	�{]�S�o���w�;Hm�P{��0S��'��� Bؾ
+�f�ױO��t-7�>t�i���vJ�k���Oh�C����EB �(aO=Q�X�)[PX�	�dݗ+��S����@��C{�ԓk��C�B�r�:���m���n�����ߑ�q[��
(ʥx:��L�Hϊ%��.��!+��E������B�L7z��n��I�m�{�|�\i���]]���h_�ek+����+��c�A�Ϭ���~�(�{-��!��w笧�d	�3��sjC>Hpߎ�HT�e�>�vQ4�s7�� ��}��Al��+��h Щ��i�ؑ/���|�7��qI��PG���&�ѡg��7����06CM��},w��b��BvK���>?WB�DWB�D�#����c�%3��~������-C]E�^.
��ep���p,
��m�&[`��eC\���q���Vf�fn��l�b�bI���
h+�*˄������z�`�sM�uM�
�`�{	�*'�]3���6���68#��|'OH�2u��i��t/���Y�d}L]�3��/0���
�MR��K��/�Wu}�a|�ڐ�yFC�ޭ���������a,�����$��
��z%IȮ��;>7t�X��\n,�a,��.��W>ܧ�j��'tjÄ>��tB:c�3"�͚�^�$�d��\�%tѬ/��]Ӆ,/��i�0���ШU=#���,���/���<nԅeW;�S�vT��.$%H�T*_d�v�3�,:�NuT���������:��Gu[�ɢO���Gu�aC�r�Wr���2�A�C�������L�z�օ�	��F�`��
4(�^*�����:G��#;�ϊ��ʞ�.�[�ڵŞ5<d���dm�n�Mr��Q�;JN�_$���:@�-�yT�/��%���,���v�m�Sl�]���Mw
��g��ځ
$�y�bCH9f�^�7��^Fؔ��[�@����Q(��`h>ۋ�2�� Aϥ8�P�M�e�b�u����-
�8l
O�'ROH�j����'s���a��ID����Q�[���X�.z9��Qu/��6���i��*�I�p"�r|�GIg��f,����mS��
�ʛ
��O�k������5.'>Jĭ�}0m����ҝ�Ah����C��6� �ܲ���s�#�!ɬqU^J#�ݮ�0=U�#�tr�gO�Pաc�~8t����K�]5�#�����w����Ln��j4Q؂V��G�I�C���@6�KG/qe�]�]_ ������k��X�1^܃ׇ1��6�ٴ�~ѱ���WD�����(�‡�����.���6T�t��JL�q�j��*�G��ݬ�f!XНH΋#d��H���Y9�0
S����T�;���b��Q�o� %͇��J[�]��/���
Ψ�b_�q��r���A܀�(+<��5�Fl�D�&v�dŃbV^J��m��8����E� #�MQ|*�*�5]Y<F��p o�����>a^g�b������]�����w'(�hn��,j4�P;ꕘ6#��OL����I�69�u�RQ�,��9��΅bIlj������ұ��~Leh���A�n���n��� ����b�	4cEpA7-t��pAG�~�\�
\@,�����#��|�>T[��޻���_W|GJ���*ӏN�b���]b��%�n��C�D�����7���R�ja�q�+yM�Q+
+PV�b�F���)IQQ:�+�z�R)0H7	�Wj-L?�C��_�\�����R�x
��f��F^$fi�0K��*�-�n�fa�J/	s���~`h�fi�p��V	3ZZ&�8�X�	�aN��9E��ti�0gIS��&%3C�f�df�*L�4X�� a.�^�z�t\_�~��#��".���sŠ]�;a�e阰�����>�ºַ��9X�)�a}NX�f��Z�Ja�`%9�}��@X�US�����~)Ex`�(MV�ťa=�]Š^F
VlKIA�
�J�.�g��*�6�k��?��~a���PewLX�:&V,�K+��Ho�*(C�����u��v��1a���%�8})k�va
�5KX�`M��N����PX��PXC�u$�A�j����F�z��F�꣢���9�H��Ga���:�#�:��:��9b:9���,�T���K�I���J|�&���K��B��Yq���2�䕡�d
����a�e���pi�����]c}M^�J�!rJ~&�hť���������]�M^	�˕y¥��k��R%����(.��.�&����K��+Oq�,���Y��^v1��(.�.�&�E�K��m�*V\�.q�a%
�S��Ի����GM��b�r��P��]g|IX}�ʈdr'�w���ک3n���p�Pܻ&���%+C� ;����F��Ʈ_�Q�����e���=6�����N&��������v~>)P��@/m"�H���} !�wD��ާ�)[�
�oD���39���i�#)ܱ]���cI�����:�(�U^�.f���=�VJ�{"�"�������]X� ���u'����Q�Q�LS~ɐ�I�u\�C�;M�
�Z��u�����0���/�;$'9�7:�3���L�{Uef��.AKNJ*�7����m��a���[�tT魾����y`i�Wi^X�Gޫ�|�^W�O��������|���-�[>փ�]6�ñ�ӱK$�ϝ8թ;��s��p��@���C���P��]:�.Ӧq��<Ep���};�!�B�\y���)2%2%2ϐy��2kȼ@�2kɬ%��̺2=vؙg�g�ZD���%�03eO�*`����+.�im�Pq�a�lC����)uX_m�����}j3���t�fA�Z'��:	F��{M�	��D�O�����}h�8OǏ��Ί�{M�4pS���ՏR��2M�U�p���~�t��ƥ�n�vSfd�, (&xd���nT����'ӟ̎dv$ӏL���%�&/+
d�ԓ�oX7r�L�[v٬�������.�{�zк5��F��n��rq�Q��չ��\A™t��&���S�d^@���B'��j�Θ5�lҾ4:]����-fe�`C�)�ի��Oo�g(~BMn����Ƶ
gIa	z��u��ԛ���vZ�ܷ��3�0�T��o�5�aCM�[�����%n}�G��6Ew�:�*�<���K���Fv{��
;�47;��c1���P\����|�t�ai�8ĖgpyWOpU:$����m�m�I�9�o!k���������=�?խ����+�<)�;�N��;
O�%��	�	�O��t�y�âN��럸2'&W��D���qEo��?���s�,r�����?�k\dJ��w�5Sq:㏻�F��S���/��?N�J��lo�Qǫ��v>-���,�#�|~Z"�|bjug*LW�G�)��fRt�T
��h�wE�8y��:ǥ��K�/U5`�	�
j}Cd��8���UEQ�-�����:�B՘��⨒�Z�qzG��jO�J����O5ɏ~C(>����4UZ�	8��_T��\�G�w	�*��6��{$�
}C�Z�9��QB��No�N}�|�@&� ���6d���"ܣQ_.�h���2��ї�!�_�OW-�b޸�ub��N9��X����Rzh�Z����[��L�v��6�r���K�UJ��IY�cT4�5�d/���
�'@�
G��]��%	[�{~�� �ډ{�gk�����^"�����=A}�0�l��##ANn���㊗��6U�ƅ�EX��T9��Zhw/�4�
�T;������	Y�~��]����[-��c,�U��.�(�v[����:�� ���(��gO>L�7?1�=�m1x����ђT�LY�n��d�I�)R�����#T+��K>Pz��t�f�&i��Q�}�!l�8��ID���u?��Sr�)�ԭ�^���*1��2e����&��bWF+I�\�"S�XH�_���ӝ�5XyT�ڎ;��I�<'#�NA�!S��u.�'�6_�t�r��=��y��'v��i)7�.�H����6�
��Q&���nJ�����=q�����}�=�ן�N@ζ�t�bw�V���I����{ka�����i��hϦ���:>�z��|1�\��z�b�9�n��a^�z�fN�N?++��v�`o��)ޥ5��*eQ��C�8����Y��]���������U��B+�����_�o�FhR�7�3�/)�u.l���T��W\=�%�2�t4}��|>)�y~�(�*��
����S]������z�b;K���'#��w0����u�W�q��Cں*U�'���E��E��z��ZbY7�<����{/�
��s���@JsY�h�-��a�*����#��tG�Kɋ�S�#��O�Wu��/F��lF\;�KG�v� IҊ��5 %k����b����X�����P��',�cYi4>Z����C}\�x��8׵J�gQh�9�o�@�X��;;��E""�([���g|��>2���
D*)7�Υ>ry��@��rk��*�v;➻B�����&_X��cV(�.�	�w߫H�H2��p�!�ཞ�~$C�v|^��(+�<
uR�$*V����.�K�%H�4a�7�^�WY����fB�
�����|&yM�2AmBpt��(���� @��Ƨ�"����Y�,�mED㊋�$�]Џ�&M���Otgԅ�
~UDDH�q�&��"}.R��1��:�~����q[H��5*�
(��x8��>grVN��Mz�75�t�($ci��z(x�n�j;%�)�����	<B��f�a"?���W	-tY�[�A�l�q���3�Zu��)dX3���^���0g��4��dN�'޺
N�r1X0BYi4����.��|�V�Kk��;Y[��e~�K��4A��U#G	�Ay�u(\���d'��ꦝ�&�U��]��DvU7���
���'�ϣ<ws�,��	�#��:x~�������
���NKw�����N�V$!��;�<w.y�k���JY��z�Ru�(��!��_%�.T��U!LC�e�,��/�ٷݤ\�Hk'�,9�C���\LJʘ�@�TS�,+C��B�S��"!IQ�)Z��WƒǕV$h'2v&��C�
���M_��G ���e�K��G��&\z\�V��CC��v����|�`b�a�1�0{��]�6 �kf�h���Ҍ�ο��'�G+�3B�CTZЙ�i�'p,�"6H��"~7��S k��M�"��QL�ﻝ)U'�R�2���_��ӕ*�<�|doQ�v%��`R���>]�־9
 9�
 �)O�7��®~ʒ�^h�������n�:H
hYߐ���om�$k��fi�4|�(M����M4!��(Y4��8
�F�z"Fﰜbb�YrڰK}�i��m-}�#�T�\~7���.U��`��,�f�^)��d��q���Z�k�����%_V�iSZM~U��Wk��x�%m�B{���r�d�ZM�*ZM,�n�Ɛ��<�P��l�Z��$U��r�K�Am�ѡ(�(�� �VY������uR��Z��j�t6�H�PkJ����ZS��)gq��g�FK��7E�S)tX�%�[S�5�2���^Oe�ޔ�hEo��7��`-�4�q�f-���"�����T"ݎ5����T��5��6TS��y5�/i�T>�QS��
���U5���(EM�(EM�0EM�EMeEMew�:Ehs</�p�	ES����/�dܴ���)��KcE����m���mBs��_QT�QUT	N�(�L��QTy�U�Q5�t�(�ܬ(��~�����4�*��z��*^��r���d�
)��gj�W5�TY���W5U:sz��*���d3�5U.��ۅ�ok����_�R��PcT��Z*��q-�_B�5׸ZWr]U��Z*��M(����?LM��G5j*�]m��9ݸ�J�N��1{���5W��J�\Kj*����r��F�S��[QQiSTTNSU���QQ�pͨ�&TT"@�**�kTT��UT6�;�y�J�F%��7��r�"�Sd�p+NAQ����9�J*�\���#�(Z*��Z*���Z*�\mAK�g��R	ɯ)-�]~V���Z*�OC-�7J�%-��8)�T
Ŕ��J(�Z*۴�h��+�T.k�i���|�Gi]��򩫍�TF)�T��R)����^_��JtDB�
,ҥ�1�n�k�4�
6���Ui?���B�
,>�ҲM�؍�V�Q4�<����if;	z�2���	~"?qߒ>xw��K{�v���jH��mm����9�����KYu�r0PYYuFպ����h�!a��q�O5��&�U�E�]�ϫc�A�	�3Z��2w�;��K�Z%H��b�|�y����d�m�ۍ�a$�������r0��t&]��Jw�P�:,��O�w�v(�^t����Z}H|�R6RL,\5�̑&qC�4�M�n�h4��������Ψ���'�;K��s/g*��p�x�5���:�W"�{�o�^'h@�@H��pZ'���'"m1��]�⚢��/�H^�>�np��SW�阔Le0U.��	�V5�J!�\#��َۇ)7�b�h��!1!Iz�wH̺PmH���31�"�48>�n�!�Ӫo��[ܤ�Y������|�x�i���DW�\�k��b�9�:����{m~16CL3X8|�yHyu'�47_���e���)��/mOS�?�4K
���"�U	�O�/Y�?��3����y�Kow�I`�g~p����6Te?<�X�L�}XVk鯫 �̨�{��."�{:g��c
*�Ʈ��S��"my;Bi6e����!�J?%�N�g]�
�d��ڋ����
q��3��cs��O�dz�Hw<�\�'f�X�o#�����WYs��̄�j�H�&�i?��/�U]ct<�d�^g��Xl`�P��q$r,�JB�u��(���T{�Xj���"�Ǚ������2�H��5Q&ı�\�pq�OP�3�çRD�n's��2�׼�0Oxy�8��RpḪ�T��ݬ����R�|E�N�m��~�vA��[v���a�;�^����Qn�H�_V|��,<%s���'��	�I�06�T�ڥ$u;��ٸ����T�ϖOH�=p�M�ȵ��MQ��c�S��$�X�#��O~�nj����O^�Bj��`�Ƕ;]�+$��X�IC��E�/:�1ں�������fpv.����k'<m��:�G��6��u��1G�_���Îo����RQ�8���n{�U�Q��y�Pj�p�M�S��J����t���t����)��ӟ���O*�%ŜR�,u��Yb�7��q���(�{c)����:�����M�M�mFJ�Mrb���b�Rz~������R>6ѨӢX}MW�H �^��!\��Q��{���������e$�X �`�����te�'$:g��OV�{S[ǰ��R�co0���U�)�������@�t�X���
��G&HٵF�R5M�kntw�#bP���b��mqa�4c�|���M���_�n�m]p�	NI�kG��7�>
�m���R�&��t�qmyY$�՟�ڦ��ŕZٛ�o�\��m�Еu+6�;�[��kg��T�z\:�t�߫kd�#�UR�:P�mqa>�V�
���엒�Y�i�B��r�^��ZI��`��:�N����X'����N��9�Bs����Q��^0�rp�t�l�)���$�����2}e�d�J����j�5�d�׶	!��a�=�ˆ���䕇{^[Kéz6����$'��k1�
��l!?����͘�,L�����Ӎ�2\^f����;�]��Ri)Q�!M$m;�&��ށ�������}�`��?F�oƗ�u��_���^D��W\��b,����o��Rd���e�7�$f:�Aх\�<�%
i�Q^��	҈Rw��K��%K+n0��=\MȞ2��t���g�/��t���	ɼ�t��7:�/p�n��P��W͔�����`*&�uQ����{����0o�y�k�6:�A�OV4�
.U�(�VLU0�(Y;a^�q��q�]����(9�pa}�^I�L����NcI*r�\W����~=�g���䓄Gz
��=?Z�7��*���h�?F�7�O�|]��O�X2Iם�0ܞuS���zG�)z�=C��M~��ߩeQ��~�柘�[yu�r��w�I]inጒ���3Xt���Dф�y(��!���m�8�\�\�㲝�O��:��
�ېH����$NPuJ2.!�B��o�0
���`3��$�����Bj8�|Q�"��U窱�p�L\d�|�R؆�E���Ss?��GU���qm���0*�J��$B��m���Uuv8>����5])�e�_b}�'�ջT�%�`&r�.���P���Ψ��۝�/@��mR�;yiҽ��e�ބko��5J
:��&	���I���:�?�U��^��&�u�%�֊`����@��d������%�C�K��;��$�2���/Lf����G��]���.o_�͒�u��W�k躴�C�j�8U_Tݶާ�gq)l����3��ч�3��Ls�Q\9:�ݥ��!|
h;�D�A|د��7a5�Q�ҷ�T7E{���N�j�N���)�K}On��n�������]鋛[�@)��q��6��i�K���}�o�����B��|���P�Q�����P�
�뼇f��ž��(��u�(����o�طS"�M���Գ�m�aHw�WwDZ�:d�"�f�I�N����6�b��qU
� �M���@�Lv�B��K�9NU��c�T{�=)K�����d��D�e�LH�>�!l&C�L!��t6ssH��- a3wqy̅�t>Т�2�X����o(�c�!����h�+�)+�++򋵟u�4�i�X�ak��yKY���Hc?��CO[+�;.�~i�̔�oa�3�`�\��7/�E��$m??�
g�'?��!�f�i��赎e[�,]F'��Y���D��펅�V;q:��45���u���{
N�%�߉=�1j%}��%��xA�!O�°lA�0���ؕ�}�/ܕޝ��a3�@xR2��w�Nf�.�#I��Vd�A~I�R�8U�m�&���JLUυ�^%���f�-}M������s�}[�Z�c�׺��۱S�إ��{ķ�=<���l�d�9ℽ
�`<�g�	[+l
q�ǥ/\� j�#[��AD�3��F�@��@�Z6_l��(�>�O�Uq�~mvC[���n�tr�K�tR��:-���l;�yxy�>k(��>�/<;H�����O�7�حwD���`#�{G	j��XG�@�����U�N$x�`#�m!('8BPC��O�n'���^�+�� �������ԙ�%0L$�I�M�A	����$8N�#AA�.:֗` �]��	
V������#�#���$J0�`"A��e�\��XLte��Ew]���̞I0�9�����,c���W��������}��]���k�D�e�j��G
gs�/��'�Il,�B5�!l8�cQ"����"�x)\��o�G#(~�����g����vY��1�>H�R\K�1����B�Y(���kn��\V��m<�����Hf�hC���%�'w<�d�V�=���y�Q�L���d�=BTJ�J!��K�x�.2�*�*^*>*j�j�r>�y���y�� �TJ�N~iJ����[��׸%S:i��z�IJ�O8�h�$
ܴ既9?55m5=55>���7oD�`�4z����BzX|����AE&	T����9�y�-�r��-p��ϱ�šhɳ����|$�l�F�=GTdx�5S�a�u��?�l�=�*�I�V��#]����Ҡx��#.��T�ݚ�*�k��Ivk��lI˱(/��->7G8$�3Ն�����0�gwS��H�E-.��G�A]:���k�X`&ZlI��va���gg��Qۼ��S���chպ�o�vF��7u����[�;w�ڭ��=z��اo���n�?`�C�:l���a#L#G�5�>&"2j��ػ����0ab��I�S��;m���)�Rg�I�����̺/{^Nn��|��`����iQ��"�k�Z�iK��α�����!ް�X��4j�����<r��*�:ڲ�
_�Q{J�?m�7�z�{ظ&|�&�O��M�O��m0�v�p@a�	��@ z��sXD�����j҄[�Hs��A��-U�r�~}�]����7UP] R�O���'��e��phU�E�����3�b�
l�<(7�H��osE��ˣ�lw9Ł�#��S�G���!�te�A�����{!L.Q ���e�RE�j9
��,ѧ��`A��ϡ7+�M�8`�'my�6YR9Gp���[.�1#N�I3���w}�P��QZs���!���Q�WN=�L�Z��d�y�m�ϐ_���ۢ)�Jg�R/V��\¹��Ж�|ј��n:T��rk���F�� �B�o5:[)ŖJe�Դ���;�o����v�T~�G~�Ҵߙ�0w~y���n��
	i4�rԶX�����߁�H���)%����Z��!,��Υ�,
�r{�U��nl:݆|l��eS��g�����+��Sz�L��"�4wp߯��{��aNi��S���t��!�4W�C��G3Ę $^Kn��=��ύ�2���w[�k���Ӆ��\M1�:����EȭGq��=S��S�p��w9NZ����9Ѭkf�'3�X��t�,Bd��5-?2�ý��n�;��N&4o��bf��L ��'~1��d摉�Kȼ�ͬ��dB��Tkƕ-�������!�c	� 2��h��R5�/چU��A[���^!��_�\C�*�l����_Z+�0P�16R�?r�Lj�2�ʱ��}�4���]J�4�!��"z���6B�$fL���DA9��l�z�_Ge�<�����>**�ϰ���&L�1�;NN�B
@�1ì�Y�0� o=
�|��@���|������]�M5��_I
C,��n�O�����Ը����s}�f�Os����F�����z�w�~�~�u�?���IV�n�~������E\�Ê�,u��>��2�r׊���Z��G��c��Y�ēO=��g֭v�s�텍/�������?7����-[_�ƛo��λ�_^��r�;w�����}�?:p��LJ?��Ϗ|q���/�����o�=u��索���dz5�~:�狗j/�r���5�o/L4��pC���o�_j�����6J�؝�z��Ǝ�T�a���ƾJc_���YcDcǥd�}���e����1�qu�,93'-w~�-Ֆ������Y�9����\�<�,ljKͷ�ϱeXr��y�M~��a�b�\˘��l2K+����x?X���1��\Z��ˋ$���R*�������T�/4!���,��k4 �xY1�b$�edd>�����5�ðsp�ptr�2��f
��5�l����c�se�ul�-5;�b��Z2s�S�9s2,�}�E�X9G��lKZ�-7 7ϒ`Y`�c�����"��X�N�����G��(<V���j�X-�i���yZDg�{b�"�����B&c&�csg^�j
��n�.�̙�.��?�b�i�Y�-��J��egΑC�>�/�nkړ��P�������Qf�6�&�戵�|&�|�3�~T���O��l��S_�s-6*�L[���4K@nz@���;P̱�=�A"M+��Eʃ��%��y��rjr�PZ�楒�j%D��o �c?��3,�S�1;3�Bu���d�32m����9���t���o�=�:hvf� KNA?5b#~���D3��9�,96wF
�X�e椊J��X���,TǍ�j
���{�X;��\�w�4����ϴe�
�m�V��e��3A����S�ۙ6�a�,�ʵ��|�5y���קۯw��T{pJ�����_�~D[vv�|$�؍ѹ>N����Y��Q��A��)2�,��lok9���R
Ӥb�%��@eXQ�,�r�Y/���r���&ܰ���(!�1��1ebbd����ۖ5 zI�I��foA�1�H��$�ԅ�i����?=?s^^�%E�G��e�ۦ�B���6[�Ǫ0�6Q'g^�48H��T��t5���n-�O�۲��~-�����в�A-��n�O�3�bHC�����r���5�>�����H#�N��n{���8��I�~�j���-��2��[�g����9�f�J���O�[��\Բ��Z�s�3͗k�:�{]��Yږ����1������p[�o�l�厖�+���;~��w#�/>���t"{vG��}:κԐlܩ��)r�>ǚ|�{��?s֨�N�U�����G#X2�O�@ NH�e$���M;!IV����,��d�E������V+
�j���ɩ�����Dȳ-Jܹ2�b���9��ٖ�5;�bc7��̹9J
�r�d3uc"���y��H��:z�k|n�=�2�$�{R�!�� �7I�\�x{�-s�B�eRnrf�%"#������X�N��ES�af���Ȣ0=alJLC���$���%�D������5�8�Ӳ�s1��D'
	�$�$�(]��J�1D���n��6���#���#$l����E~dQ9$�EX3m�Hv"Q��&󌳤X�sϔi�R�MZ��\l�/��H�!�`z�ʰ��rX?9'C��`�%!�6��<�Rk��3&?�2�>w�Ś`��Q����!tS�3h�xxNZb^fND���@4CZM����C�Ҽ��'ڲ'琠��Z�:�Y��5t�����B�ϒ�3�j�'��Z�N	�����؝(��Q�&:��4�����$�Y�]����ƛ���N��
���m�s�V�Qz�@�'e`.CS�(e�!<-�*j��W2��`0��4��c�
�P�l��$���P$���d��vۼ�O̶X��ϸ�xb
�?�<'&"3���`U����@^T��K�G�Q�ƛ�`�o��B�{�
xR��U��֟`�
6͙#�IY?�T&eιO���~��o��a��2oR&�/J�l�a���C2���Jmc�5պ�p�X��D�\�O��G��#^ּ!T2ɺ���$6ƞ�N�;c��4}���H�,�:ւ�j�]�1j�y�V��ܓ[S~I��LLc�Y��6>]��X��)`M�ܺ����(s��mr����?�c�ݦN���>,��u�;7�q����t�w�_�~����T^�TL������'��}�uw&����b�V��h�nV��4*�)n8r�p喝S�Õ��=A�3QqOT�d%��J�ي�<��.6Α�L�U��[	_��D1�*�ſDIg5N^�Uy_������6�����,�2��>~�>�@��������Lٿ�Ͷ�]����uP���Y!����9�g-]�����es�����n��ban���nh&�%�dӬ�[o0|�b�N�<{��.��ҳӚO�za�@Ȅ�3����YG�>��#_���ؐ�rL���Ϗ���"	�#	B	�&" �'�%`����Dp���q�#�$�G��`A9�;[6�#X��_E�����F�M0�`AA���?AA+}���O�~FP{��j$�#�	� x�`A1A6A�t�Iq�#	��'$�FБ����'J��8�����;�|�`#��%y�	&���ԝ3|[�/��'��?�]Ǯ�W+��F]8��6��� ���pƕ�eO�^ܚ�[����[ݛ������?�v�̣��<j|3I��	��'��z��6�������`�ӯC�����mG������Iu_������|v�S̷�h:Ҏ��J1�\���&����u�y�L�;H&�%21O�@Ũ21�k��N�(�n���j��
�hݗ5㾦��͸�ь��f܏4�.5Ꮁ���
�uL��;�Z�I�1�+������FC�{y��exտ�ȿO������W����^_�~���Z}����ݫ���`���k�8p 7nKNNf����n��U\L��l͚5�^`o��&+//g��9�v�S�n�L/��&��+�e�]����ٺbߺ��-B��|_���y�w�����>>ޥ����R�:��҅��E5�3��T��0�"~zz��^����إ������~��0Er��{�%~߾;e�K"�����N�s�:�MY����������/�[��n�E���k��P��lJ�޽���� �Q>�#�X��,G�:l���;���;@!V��u/>1$T �k�x���DX��	�k)�X �?�0i_m݁�r��W'�_['��ʷ�Z.�E�#	I�Fx�g��-����̰LydoVף��g�hb��$�3��itJ8m���@/f:O#A>�Sx��|�С,>>�%&&�x���Z�����g[�l<��g��ӧO��<�-��ݴ�5�?����gE�}?��\VDU��>�E�W�'�W���)���诧�q~%�p��ɓ'��7�%2S<�[S�bg���MNaE|�['#�7W"�"�u��&&��O�-�у�����S��a|0��22�rjy��O�>,88�
<��5�������Qv&L`IIIl�ԩlƌlq�X6w�\�����͛ǬV��?
�z�h������&��V���
gOZ���%#�?�c�Kf�mk��·�f7�ǂ��vΆ��l�Ά}��ȏ8�����O8��(g��,�`�7�M���9'8�}��%K�0���V�^��q�v�Z��SO�u�ֱ�^��M��֭[E_��;�Õ���s�m���>`{��a���g�b�|�	;z�(���/���G��8;y���*v����˜��԰K�.	^��1�ƇƼ�i�kM|ӆ{;j��&6�a��������l+�}���)�H�{Q��ŏ��S)�\����g�)�S��_N�?���4�R|3ſ���(�J��"��N�Q�#�+��-ů��g)�EM�A}K��OM�W�۴���/ҘVI�����?u?�?�f��U�/j�w���(�`�ŏ���VM&�_H�S��)�?)~�����'�#��r	�ZQ|�W�����p�wQ�����8������ڱv�ٞl�f;� ίa1�����!y�Ox��b|�k�����C_k�P��?��Ϧ�(�J����L�ߣ��(>�8�?M�k��S
wS
���C����J�$�PӞ���pvag����j�.��ٕC��+�@�GS���/���(�Z��7����o��(�q�_��oPJ���J�{R���?ſ��O���S��o�}�T��"?Z���1�c��>��=�O`�^}ǹ}�����DF�F��2 �_�>���VS��!o��!KddJ�m0n\��;����=&<�?��ӫ��o�
������k`���Rꑌ��U��]�oI8PN!�Wπ���ҏ���ҽCg�AJ��)t8"GĦt�С��/p�@HƸ�O�ԱC��G��"@�ď��o8�;v�~��Z��ȁ⧌��'66*6����-7���v�C��ߥA��#��cbc��{4@��n鏉������{k�NJ��4 ���G�,�RK�J���⩈�b�"��	���!f�Kit;�C���2�;�<(�2���o;V����a�2��O�<�� ��X�=F�����5xtJ|J|L��e��]1C�D��Zߣx��b"�+51)a��Zy�t�	C�;���?��a�CZyn�!ψ1��C�FD����	oj��5��)H=&�>��oj��c��hb�XV��!3�i�n|JD�h�c���'گ}X|8�c���G
or�3$���[�J?�1&j؈Fޚ�hb�G4�f�
��Fޜ���G� A����犚�&e�b6��<ײ���s'N��b�8���‚�ز�(����,�b��X���M2�sџs��,3, ��cO>�${������s�='d�͛7y���§�/�'I��D�Ž;�G}$d�S�|;��v��)V]]�Μ9�~:wV�?��3�z�*[}��W��M?;��I��Ush�[H��4����[����w���a��g���4~�h�Ӏ�@3�<lW����)����R�i�~�����F�P��q�r��[�.JХK�u�Y��v��3h� ���Х������k��V�ν�����gP{?�mm�K���Q�~=
f�z�4�{�A�)@��mo�ֳOР6��nU�nd0�Q��nj׶��-�jc0�n���{���E����m��0ȯG'�O�Ax���B�7�{t��6�[�jL�g����ȗ�t�w�?�[�~��
�MU������=�}��jϞ�N]����X��T���z�&��Dy}�h�AZ�go�Q�txk�K��=[�G(:����
�g�}[�jE=�P�L%%T�PO!�a�%�G=�J��7�����3�$Ӹ�ٳg����������_���…gi^z����ڵ˥��G�9H��_IGRP���P��o�۷oo2QV�n0���i�F���]?���i���}����sO�g�}�*���_s�s�
���/%I�"ZO~������(3fL��	Gpna��zm��� �鎰����������q�;Sy�68i�y�}��%�����o��	?��o�O�>Ϳ��;~��A~��!qHF��)��̫��Z�m۶B٢����ȕ+W&�\
�p<(��[n	q:���q�(;���� ��[�?�<'Yfu�޽�Q���xyy���8�����'Տ��'N�cǎ�wФ�<�$��p�ܹZ�+����/��~���~���~�5�u��G��
#V"�oş�)���hPu��W�P�*4�E��
T�nк~����+�{O����۷��G�up��I��&�
�����6P0Qoh;��w�^�?��?G=\�v�kz�B�u�6|�o���ŋ��!�����}����~���os�sN2�h�(�Ǟ={�ݻw��r��a
��oh'�#���[�r>�#·��|��G���O�����S[�[��V#~%���A�E��\A��Î��ꫯ��2Gy_�h�(��g8���s�ǜ�p~�>�Cv
;8��h�.���|�q����-�S_�ூZ*��v�v~I���qG8����4P��DC��_��<���soM���.]/�		�E�P�������cSt��Q�#�
��.��B�	����4�����D�0⛼#2���9|Gn7�?�\��4q@�:Q�劺_�7T:��g�{��D���x��{��X���4�:�y�~�����o�<�ߎ?�ū���3��a%������7�_(�c\@<�3�'��Q��%�1DCѰ�_�F�sO4���˗9�3
4����T�4EǕ+W��7���/��O�?�?�kH�瓿�|�	��A�J{&����=r{F��=�=xGn����k��C��E�y	��4�|�nL�Jx|�-���#��(���
xfTq>U�!�k����/4�4(�y �$�S�P�ԓh��ܷҳ�)�{�����1�_Wh�Ժ@{��J�~��?��_Z8��m�(�,��4р'����D��c�72
j{
j{F�4d�{%緁*��7����|���������ڜJ�Jh�x�o�[���W�d�'�'��d���r>��h�8O>-�g�I����3hP�3hP�3����E2��v���,7���TQi���(���h�q�P0��\������a�D��=�*�9���'���g�O�G4�~��~I�O�aÆ�"���_�	�
�yTZ�V����2�������D�?���D�;ks���U7��T��NB�����k�*��1�/�B�W�
܀�J�~�נ��X��
�{KC��D���#��E&�2�и=�����������e��17��Er��^���
Zc�"c4�?����	���x�N��x�u�>^+c����ew�w��7��-�D��g��B�Z��U�!k(�hH��Ӣ
x�'����>h���g`�ظq#饗8�"�u�R;�z�*?��T^ḓ���h����h��Ҟ�'���ş�����������E4<H4,%
�<�e������?��������_~Y�s#t�� �th3�^r'/'�&D{&�'��y�IOYG�����a%Ѱ�h(%>Zbz�>)\#cl�n���*��L����-[��MCc:Z����:~��	�����#������4�9��'�L|��p�̔i�#d����^��{�Og�9���'L�����!pE{DX�x��A�_�V'0Ѧϱ�z>��[�@{.S�s��E����Q��_�d���

�4�DGKu�}Җ�7О��&����(�U�VUP�����SRR���?�1.���s���W�X!��_~)��BM��16���,y�<h��f�u��|cC��=�2�Z�=����k����;F�u&��0`xzzzNZZZ5����}�Y>~�x�������c�=�}�Q��4`,�8�ҁ9h@
>�X�<v�"��/�����
�e�Y�@{F��Ăx����#G:��㗀��WӼ�֭[_�6�ɏ/X��S��x����~�u��Z���y�:��ڴh�T��b���o�3����	{t�ڵby+m��I޻wo~�m�q��.�mC�A�ƴ�Sj��[�?=��Sj��Y�10>�T��=2��:���χ��ox�a͚5�����ի�ҥK���{yvv�(w�W
^
h����ƴ`
�0�c4�
�#0��d$�hi�!�/�2���?�Lmw]^^���ӟ����dh�*
��~;�?����ڎJ���/�0��F��w��ڹ���7���m�����/Y������X�h�"Q���3�O�2E��@�
�A��b.�|<a��@��� S!<�%�e˖�1��=��7�%�7�
xa��n�����f38p���#Nc:��-�m�&���
�1�N]� ���v���{����{Q��=����
�}RSSy\\���{N�F�������)��6����EL�_�tJ����T���ر7b���F�G�Z�G-W��ꖓl�SŢ=P}s�7��P�ju=�(���k���_y�1���P�TN�m3h�\D�o'�����q��7B~�������J����.�o�Y�S!K̛7O���������!��%�|�:@����`G��#��s�_���A��kyU��Z�n�<����Cq��8�}��
��~}��D���y��1������W�*�Р��Mс�FDc��'��0�6��/�Gݨ2�u���%�9������-���h<�6�&�اO���q���rW�K�u�c��ɵO�����_{V�/1�u���:�GZ:P����:�'?�m�յy�MxϨ��g��������_;.je�l�R�֭['�.�m��������|�������\�}	���D��D����ߡn�zP��Pg苰��=(��)���ϴ��v�G�K�T'��!���r�̝;w�~e��
~�hď�������O��@�N�/��0v��1�D٣�]���磯E?Fs
��A4�Ѹ���-�ys���௮[��A#x�������.0�x����0 �{�CT��b\ޟ?����k���?����$�lz*�N1�d���ɷX1����˦N1=�G1���C1G+f�br��l��N���(��Z���G���b��"ޱ��x=��y���;��X��2��H��q�� swb>E�_�r^�
�џ�{lXƞ���O����~���h����u'���6]���dΟ����~��KGI>�d�,���
��^$o��{J�'�Z(��L�Z�'�9?p���;D�?��w��7P���t����~����S�{��ͷ�0�L�߈}.�`Mk��^��O7�����ҥKS}��$��	�����1���,9~��&��b���X�����k�c@s��/d��{�s�/�h��:�ܤ}�_v��~�ʶ�4�t��9ۈD�ڳ��<�L0~���Q��#I�c�T�g����}��o�}_�����?�}Ƒd~ڐ'{`L��k*ɹI�s������k�50�cM^�0�y��m���{m��?b�
{��'��WDݭ�q��9���Y�nU��	���b-�XG�揽W�'7�G��G��>�1��ߕ�5�?ڽ����&ebC��{��|ɹ�8����he�4D��F�t"�'��]�6I����ă�6��bk¯?���{�?�¹�puH�kC��~�6�.�)**������,�`}{M�P���τ�P�#�����P��͑ᱥ������x/��0���b�{EX��ڸʏX�
�&���a�X��8
?��װ�!�9��ԧ�z*	m�}����`~�!S�b�
�/)k��(�h��^a�%�]x�}4�n�������P����`^���}������O���M��s�6�}&��OV��G�#�;����_�����]{\UU��(�d�4j�d�$��k�}�{�s�E�1���(7A�����#�,��h��!��Ӑ�Yڔ�N֤%MV>���1���Z��Y}~��9�垳�>k��]�}�A��a��a��t��ѡ�/�5��̈́1�_�56h��H���ɫV���!��q^\��q /��;lX��4�{��!yl k?���cO�6m�c�=��|X�p��{��h��Q�(�H�a���'���>yt�
ÿ����}�)��.��+��\���0onp.^[���9<s����1�{y\�?�����y����8n�kӁ@ 8o�<7��1yX�a%���쉿�^=.�}F����ǒ)}�K'��9^��R*={��������5z���	!�q�ƹy���/�A��o俷��q�MƆ}�y�l���׭[�!��n���2X[?+����}�\�s��qom%t����?����%b�8>>�Ϳ�&N����x2��=y;q1##c,�r�H�`7�׊�"�W��E���{�ƃ9�!C�q.��v��^�|���[#�[u��G���S��G6��"�?����s�(��KǺ�G�:��^�cA^ n#f�8_y啅��V�p����0y���C����0v��`�.]�p������r���K����-1[��.}���3cƌ��?�ɣ�G��ˆ#�3���
y��x�_ƚ
��p+~�z�W��$�egg�؀kU��"���1�СC�~&m�>��q����7o�\���#6b�ɫ)�B�.}���_�%�_�G���8�1�q`�����['�Ki��OɁ"� ��<������^���O~i�gM��u-|�j�Q�T�\��-�zf�᳻���+�_���F^u�`#���c�KJJ�
uz�ڵK֭[w���>�6l���	]�fM|qqq�ƍ��l�3��{
��zڮ]�0�-�Q
�w�cc��M���n����Oܮ*���\�i��<��)IJ?����?}����c�`�����D
}��Su1p�W�e���cb���{���˥��Yu�aʥ�	�G�_1V�X�@���k����Q�����]�,�`�����8�^�a܇q�	q'�0�S���a��▥�>�/����`c6��� o
�g�q�-���C_}]�7�V�u���#Ɓ�7l�0�΍�|�޳:���v�I���oǸc��i�\�>
�_�/_��F�j8�(/W��w��~��z�ov+�삋[X���-Ŷ9_��>��c�Y��9o�Q��QNq.��q���K���s��������[�뫪�\_�[����>��iñ��h��?��Ϳ�&	�B;���a��}#.�����8n�y��"�'�٘O�k1�F۽gϞˮŖߤ,&_�K��G�&����__dd�����;��p��F>�gw����pWb��{����C'�i�W�Όt�Y��ҙ��.kM|VrNNZ��)��33���Qy��ENJzZfrN��@JvVN֘�n)Y�"9'��$��<>0&-'whZvN k�E��(ټid������}�'���]W椥�er�\���N��T�R��ic�r�l�u�e{0���Ii��ӎJΉ?)k\ZvTd^ &_#aG�I��I��V��\�=�W�n��l�V�����V��21&1&66~@���K\������gMI�����RCΓڙ��0�Φ�7Y3���Y�<�d)k��^�#��H�Pu���5O}Z-S���T�VkZg��v�6^���y�3�*�\��^�n���_������
b�5�6��3�7F�he�0{�S�U�&�ّg�����'��b��!���D�����z��k����v�=W2'��Lr�:U��g�9��:��G��m�#a�!)$�� �H	y�|K�ҖԠchvD{T����at46����wX}���~�]��}�n"�%V"�!�0R@֒
�
y�!���W#O�$��>MW�RږE�hօQf0��6��ϒ���dV�
�R�,+f�V���#Vþ`���9p��&�Z�V���]Ԙ�K�Ч����j}���f�Ƹ`������C�3`�3w���ߘ��%|��	\�7�5�?��Ӛn��y���Q.��Hk�PQ7��R�-����Ѽ3��)�x,O�O�|���b��í��}V��eM���Y��7��bG����v��JR9U~.Ü��\g������|��:�҄8��I4�NTb�^�^2��^�%����O�;���fc�e��_�����Ֆ g�jw0���ޣާ�Pj�:M���O�/�o�gUE�Z�в�Y�J�5[�?�����F+��et6z�a���D#�H62�l��t��1��X��x��m�7G��F��Q�j65[����{�p~+��y���Ϗ��^��F-z�>"Q<$��t�xB��c �����a&F�Y������lk������n�n}k��w��qv����L��2^f�\����9��{�iΓN�󞃛0���@ڐ�$@��3 ӛȧ�4�@j�8:�.���-�0=FC�-�VցY��MIT��*���ʍj���ԑ���b�Y��w�[�4��^��F�y��h'*�q�n�iw���_ڣal���4n���+If�j:��S�2J٩P�P����\�W�
o+�����У4��r�\'��C򔌀�à��GI;��%�k�j�.�c�q?Ϳ��������?�7.�Y^#+������NG����9�;gQ�ս3�&��1d	�,����nTZ*���Te��G���R]��P�X�N��'����U�1�g47��An4c�1Fs;_�om�)��"K� �R{��;ʾ2Q����9�P\���t�I&+�fRI���t%m�z0�u�Ǝ���^�|�R{�qj���.��wc
�y���3�ڿ�Ʋ��[r� �m�\*�����<#C��N�c �r����r��қ���v4�)�>N����
Zش���rz��X(c�X6�Ζ�"V�ֳ2�;�:+DQS���J��$(O)+�b�TY��V���,�	u��R-Q+ԏ���3����<m���6[{\[�k!zS=\_�?������dL2�h���-�;��
:��h&���t3ۜl>j�7�2���`���̛y'^&�������?�?���io�"�|B�v�|X�
!���Q�U�@v��W�WAڛ���R5�6hoh������H+�*d\��x����n-�s���i���M��"��k�8�`�@��Rt����<v�]�+���	8T�y�״�Z�V��ZPk���}�^�k�m�as4���_(���b����(�����폶��X��vy+��*yRnu|�u�}� Ȟ����v�X��M���Fq����D=L��4�N����Τ/ӝt���<,������E�4sZ9�NWGu,'�Ip;ÝT'e|Z\�[�,r|�!�$���#�dYv�	�h'@�t:$�
@�Zz��yNb�`ي�NV�|`�"]�X^xP��o�bV42��F���Nf'ޕ�r�[�'X�8�Vg0O��(�����s�d>��|/��|إb^���2^�_�/�N���9ȫy
`�I^���\�>*�D3.Z�6�g����$�
"T�dK��"N$rIb�%RE��D.X�i���qB|����ɟ28�<՟��W�5�	��퓡2L6�Ვl#��H�A�Ғ=e���	��e�.�e�� s�d9Mșr��2�ޮ���z�ޮ��e�?PKEePQy!s���pip/_vendor/distlib/t64.exe�y|U�0ܝN'M�Y�h�Q0���$6h�tK�t$*h� h0���P-0"$V�L�;=��3�����<:�����3��–��Dq��@H��{ι՝fq�y��>~������g��*�w��b2���O�M�z�Wh��T�:q�P�߇칤���sɼ%��pVV-��ǜ�<��r��CΪ���Gwz���|l�⇮��Lsu�|�'��o��؟��/�z�����t����u����&Fy�ɛ(�%#�ό���Gʗ`}���xM���O1=}�ٲXZ��RSzR��t���Z��;��ɸO2���c���I4i�P�_aM�P�r��9����2�fЍ���n0�Ƨ'�n�it ����g6�'}�۫�V�p����!{�y�&Ӣ��? ?k|�Ӕo�	;�_!���g3M|�F�u���|
WU�4F�)�3.�WxUՊ�r��9��1�W�b�Z�2ފ�k�ka���f}�L����_�-�}��i/e��8��Ò
&�Y�;�l��K�+R�l�f�g_�(���K�+W
{\N�'�J�p��@ZDZ$E�f��g�L�p]tdžoL��M�wG���f^B���͚E��a��Y4&��x�M)\�Ia�e�[R;��o��vJbG��Y�?2댰������l�U
5����(�^�m�	��}z�/2{
�h�]�k�X��lw.ll'K
�q9����]��;��Y��^���Vށ��|o���C��"�"�j�w�E�Y��1���<0Ƥ�N���Y*�W���7��1��d� ���5����D[�2oI6c���kV�Y0�l��:�/��.�D�I7�2_�
j/�}9g%���`*�t��v��x��( ��!(�3��F���c��ύ�{��U��Fw[:��ɺ�g��g�к�����_��\��@-���a0oMG^��{X��6�N�m�Y���NM	
e򆰕�C+�P�5U���!9`-f_hX[�9��N�;P���5���ĮO�Jo������
u�zx]!X��O q�1�R�Ғ��a��U�c�}�\[�OI>vP\(�/.��r�jnL����W!4-R
�J�L�}�A�&n½]���6�3E
/s9uǵ��a� L�V�
��x��y�%��J��pm�#�R?�:���5���.��]
���ý����x�bCz�f�F�u��HI�'Ҹi��+��k|_J�����_R&�Z`g#5ۂ�QGZ�l��ރS��.'l�6�˺����?p����qs��Y���TO�3�e��c�'��:u�5P��:�l�҄���H��K�7\�}�5���nz�*7�*	A����k�S4\Wo��i��K�9)�<�v������jָJ0[ �0��q�`��������r��U�;9���)de�jd���u���D}�~�y���ÔU.!�<�����wz���7��̺c�Ԋ���L�<�|��-e��g�L��LKy��S���[H܌�i�܂��9ā��3*�Tz�<�B	.߄��&������6躓��P��˫;DMFV@�"=�!���#8�]�M����Ql��:כjhi�kSǟ�u�A��*�i[��6CfO�C�"���T�	C{�}R�Ҭ�I��X�ӛ����e4���|��R_�"�x���6�\�b3 @�#�ͱU�T('/�'�l��i�{��+��̱鎞C�2��R耜�x�E�MԵ_@F�>�*nWˇ�0�o!=�Ӏt���ie�P7����Gd*��2���ރٕ�$#{f��}S%�q���2y�P���V��&)MI�bR�+�����
Ox�Dr�<�Ϥ�ր� .��Z�r󥁩��R�)�Jd�Ԍ�c5)-I�=��7�`��!5�P�M�T3X�߱�g����"�!����˻9+�H��yb�&�Y*`�_H���K-�f͈c�8y�-\�����aU� 폼����K��G�^�#Rr�}	H�RBEA�l���R��vIiH��%}^�'RaC �L[�P��,I�F�����è�C}ʎ$N� �A��V�"�����ۙy��!C]שp���ͧp#)�`Z#��WW��k�j���M%�$�5 ���D�ۋp�`�@t��Z1�� S���4Io�ܭU_k�P>����)��q@A��7��9�gM0�Mѳ���L�Z9�����kT�(��
�
T��5%�9%�2�8,�;��v��!+7T��I4���[�P�f�f{l�[`�Si���%T�q�Ĭ��)�H���A���ic�*RX��^���gk\�lo1��Jc>‹��#�`��E��n��[|��H!�&f3Ύ:#�K���;G�1�5!p���3r���}I8y��M�ԏbTF�ķ8�7H�MR�Y��`+�${t��D��
&�5��6����)I�8����R�>D��6z>ϒ��4�R�K�G_�̖
p�nN"����B��f������9�G2�Y'��z&֏L�?�_-H�{���h�����ؿ�
ab��ɝ��2`��I�����F]$o����= 5�6迁��#&ak^�ͥo���Bm³
�(���M�g�lk�$��h�	Q0��<����
��W�0��s���ϙ�TG�[!�U�K�I�jQ0x)��$oؐנMŋ�H\���q^�M��DT���!����B�
�D��c�;%�>�#�P����M���"�gM���WS�$��� �J��S��B��y_�nmH�{�<LRa�q|	�d�56�5߅x�fU��ÅY��伓�['�P
�t�W]�˷�YVZumf0&�);\�x܀+o������%b��v�&������IFN/l!��(���o���F�e��h6!7�Ƨ��F�/_B��;�@�s�f��86�����Y��_'��
 Av��.!nXNW�;X�°
��s�Uh� cg`�z��xEv�mh����Xm=�ͱIn�Y�@�Q����u+Б�M�q#�k��T�LE6y�Ċ쬖�e>�ن���T�
_�R
I��
�Ij.�2ѱ'֙��iK`�*A�]��!�܌��|O�l{1
;��QcՇ��<�^L����S��V��}�Ąe��
�Gn�r����7U(�Ū4��wer���D��SR?%58��ȅ��+�]r�v-0+���70�@�A��R?�YEv�(����Xj7 r��)�ѓ<)�rX�\�8'g�����F����$!��>�Ml�N?{��zK>��J��{�'��1~._�9	u#��Q��Q5:�j�PNQ�)J���)ے|z+��
��S�.�m��rZp�J`���Ac�K����r�{�.���$�{���̴RN��Y�N��>]w:�5�|�L��Eöx�cL�A農���L�¡�lN�"����VM�!#�R����
W�!�zG<7+jLH}��&��Y��6����`���Mo��ij=*�4��I�7I孛��[!�zƋ@m}���H�)�!���{|�	��x�Z?1�$qY�5)<�,)�rs�$}�
�:2k_"B�8N�7�����3�8
l N��ߪ|:�ǒ�IK�J�l�٧�ҁ+WN
��b��)-I��Oo��}z[�_Pm)�Sn��T=s��&�U�s�v��L"h��q���
�~�M0IN���� 9�����
)g��wHj<H`���9�fW�
�`��,�h:2��T�I��w?Zk���ȧG(�vu�%n��x�C.�Dm�;����SwZWN6?�rv&�/z^����p6�BueP6�)l�����M��'������?L��i�-����E
�Ʀ݅�&�Adj�_ _
?]�?��zh2�;��$��b�U��7J�1n�������L�#��\��@����yML	�n��� �Q�������;?0H��[7�UX��ʊqH��n&ye�JE�U�t�d��@7�'L����s�b��^�U�<]`jX�0J�������ҟTU:�]�9�����RD$w��4��G��~�=�K�;)�y�\`��-��w���?�z�~$NB�飏pYZ�9�������m����0�������50��CH`8�r�-�!	���.�)2����
Xէ�gC���h��0
V��
2XA+yȎ:��N�P�D
'�[PR_'�
կ��z�W��b���`cG�Б�|Hzg�p�/R4�.��)�Ie6��:c���q�-D��(��d�������\��c�\š���1q"p$+��V��h��P	&���Ղ
�L���[���ɩ�2��v?k��D%d���R!��	�W>�c��7?雝�A��&�x�\��"�nU%���!X
��\�f$J��6o�W.jQ��s�f��~w��C�w�}���󻠺�+m"k��^"娒9�UzP���H9���R1x�e�>�Z����a�=�.�m^vL�;����a'|}=��cZ޺y��Ǡz�����C�^�9��ظ���M�_��V�Q�O�F�j�ϓK�[��].�҄��� �Ќ�^�K	y�D?!
�����/G�*�n��(s��R�G0� ��}�����!k��@Y�\=�?���%	;Jx蔟}�����>�
\���ґ4?ۖש�
�X�0:A�ïv5n�OO��M�|�A�@�n���|OC��Q)�Z�$r�Hi%�_J�l1�3$�>�,�KŨU�&);u�P'F"?�]���79���=K��� �=�	'�q9�Y�Z�^��U(��o�m*���B��'K�D5NZA�}��lR>�(-�,�YF�9�
=n�.Ԯ�j�2���_�����Z�(�bPk��>KFC��_-�P��މ}ݫÆ�{��Q����nC�(��]�E��цHqQ�Sp#�\si#�Z�G�B���
L�zD��8{��r��ڄ�dI��p~�h�Ȯ�zX��.�j`ƬB����]�cL9ο7�@1�!����#�zf$	�?1��ϑ�]�c6�N�����[0F���q7#,�G�K��B]��,�E�F\��Ө�_�|�r*wc����3�d_8�'x��E��La�s�A���K���O�"���xxʆt��d��b��v{"�����:�Vu�;���� { -g��5G'�ّ@%G4��79K��,�$�Л8K׀���٪�@N�Ҫ��I�	x9���(��8�#��
v�:���e�^�:���B�M�a 5�H�w�󔽘.f�Z��������9,��x�R��c����F���v���nL"�]���:�B�h�:�W����Z��r�c#���C�2P�a�EY693���e{�<��B��Vh�ZN��ޜ���sT���|Qj(7p���F���J�#�?1<�`ø�>V��"+�7��3�����'�Pf�/�x�����n��Hb#�] Ո�O�ס��KT`�wX�i�7�ox(}.[%�m�x�Y$E���Ws��'��x��
j�E�dW���gŒ�ya/zO��E.�W.����]�@�v�f�/�F�ۡ�ē��j�8�_b���,�n�\l�L�,,誘.�^h�
�1I���<͊)>�T.��9_ R��;�cQb%<1B"�Ґa)p�A���0p����^����9�O����n1B�����<�U~��SS��Lt�~���@��RJ��B�8�OڑË"�>j'��2��x�Ө��"���Xb���u,�_X�)���b^�����S!�՘-[M��H�����k���|�=Q��4���������D�&iT�Y?I�*���[DT�&�H�(��u*}�����eߗ�
X�&*�x�eic��&�<~m�PQ�|0�*��ȅ��S��Z��y��B���n�����@�s4Cv��,7�Ⱥ����ڇƧ�l(��9M9m����Gj�(�W�����}���q���"m'���;g�]~9�BP!�;ȓ
�o�D9��~���K@F�[��k��ˇIؿ�^�e�csp�݂��y��o�#;������'�@J�2c�̀����
FR@²i��HϪ�+t���;��☲wS*����@����C�|*G���AҞ�Z)<9s��Ț�p�g?�fKEqk.�|R�[n�U�(���P���J����̸"e�Q0���;X��U"��)�r�äIi� �Л�t����tbV��4t޼N?ké�<��"ٰ߆����l�s!��VQ�3K6����
�V$}g ��L{�ʢ=���6�Z�8�Үt~�zcF([���-�-�b�"ߨ.��6�W;�[�[I�s��B5 �9S��i�C��˧���,�0�����6�H����~����/�~�)�Y&�G}�k��]��(�7���O�dF;d�Q_|/�Y�S��w@˗ʭm;��x�4��Yb���$�*e��(�(�}rH��p#<�U���h�/Uf:'�MI�U�v�ɴi<�뮌i�L��e�Dz���Y�0+Z���dz~<~ږ���W�|�m�/.�ϒv�=z퍰G�|����3�N=��u>j$����Y�q��.�J[1VlOR�M��&�z�$�
'\X�(�Ug~�s�40X���m4�Wָ
M$�)����/�D�$ܶC]��[qD�D1l7-�Ts�����$�sv���A{��雇�]4Uy���8�H�f�I��+��"h,L�fh�@�#b����Y̏{˃D��ͧ@]ڥ��a�
ی�J�
��X�Y��Z�Q��7� ��z=$I65�Xs�[�X33x�K�~�q_�;�oC��K�������wT��]��fxPf~o<q�<ߗ�㋬V47����Nx�j�cg��^�>�/�4�^�D۽D�Ha1[m+fә��c��s��٧~vHb�W+���s�OH����p�V���I�濬%����=�3�BVVt�_#�l�?�;�9� >���Cz�gi�;��
û�r�Ӧ��u���|�ԬN���[}�q~0��O��q$�9�"�P]��36���ew&�ˋiJ�`���=?"�=�YtO�]�Ɏ#�C�0[F6��μ#��紼��y����N�̵1��P���py2C�����"K�DpK��/��e-��<̛�>v߰b��7I��%�'��[���>k+�{CGd�ǝ#O���3��m&`q0w1��w�3[li��X׫�Q�P2KC���p]�h���)��%��3q�s�u��Q�
�7����~\����^��1n �{�:�{��9W鯒')�+��괔8�l%ֵ(	
�,��2E6 ��h��C�(�'a}"���B�	R����f]�r��u��GŜv!����˳�6�&%�%_�D��1�����'���eJ�=�
�Mj�����P!�)����K[�I�'���/�(�I��S�J�(� T"��Z��'�U�C����h�d�0��b��Z�xa�s��U��;T��lz�z��m�̀��&���Xa�~-LS�P2T�E�$�Ƀ3
{`5��Xo!�[]'���	�M)��+�L!����W�(�
�&N���@�4�ftc�vd�FYlF�O>�g�C�aZd����Y�IY�Pol(d���OA�□~T#��v*��U�@Y���>dѭ'F��td���=��@C;�b��)\��s%rB����||lnށ����td�tTr�g�Qd6	4����^���ʌ�\!�4�[���f�@

�#��*�����\��&��+�LcwD�A,?�p���������X��;��'�J�JmzKt5rS)nvV�Jֱ��`U�~��������w50Ab�OQk'մO���ؖ�:m�\P����ꎭېJgKԝ񧑍B6<���F����d���9�uNA���n5%�]gFǚMM�2�|� F�p�O�IT���k�$
O�I��̋�=��*M	r^�X�3l��q�U)E� e۹�!o�ᥑ�b#��y��P������D��:T��Ѭ�b��,�F��A�(�PR/��
��cO�����F���j��J#`֯;���D�tGu#��=�2��:0H���$�Dp�R�nu�Gx��k��e�C+H+P���m�p�y4Pk1"��_っ�#
!!I���xQ;E2lA�J�c�0���=�Q#J��bg9{p�.�#K����q����9.R;�u�P�&�:AY9�\�G2��Ѭ���D
m�49Go�Y:��iU�"���ʔ�L�>j=P��� 0���$=/2Oc����8���l�"i���p|�.�ݱ�#�q��z_B��x�zf�E8s��Sr�?Rb�sC��pR�P��jw�=U^C1Z�„���P�6w���Pă��<+�t���}-�N���lF�
��y�	�k��N�ynԑ3IR����<G�7NC���"����<e��$�ҭf6��Q���|�h2��)3Θ9t���\`N>��%E��d����Q��.�ic|,��5PYSdË���k�d%
3���5\�"U�n@h�����ʢ����Nu�-��t��rW�c�H8Y�gv�i�g�ts�NS�tX���8髤�j��|����s�X�ú�RF�	.	q�(8�3?�uu
���a�ף��Ju)$L�|w����U9]bޗ���<Փ�Ay��h�W��"�cX�B/;%�Nx��+������z��&Ty"������j��ɯP��B�i�p7�t�w��4a��֭|*h��ʷI�mR�Q�I�C�22��T2����D�ir�mBp�~�k<?e\+��X�ڟB��T��C/ݍm�O!� �'
�f�����D7^!�w��-_��;�`-�B��$��8������}�<e"Ż����fߡ���X�
	�5[��$	�?O_�%lE�<�4�"g۾~��6�[�q�K�a��ُd��%y�m�;��_{L�ێO�7� H���&���鏷�
�$Ä��I�';��:��^��%_"l*E�oPZNuCg-��,�*�����|��4굧`��R=	_��^(��|(6Aɀ�
t!+���9�6��0�4)�!S+NC/�jIT�n���s=�/����`7�A�;Ԣnj���7�+��)��C���w�{���+�m��8���B�Ž�t!|���5��D���|H��h�`&�X�k�#L�Z�Dž PӦ�F�o*��Bp
��M��~̷�?���MD|S������"z��&-Co>�.��%��r�$	�Pt��C�a��R��"iI��6�?_���9+���#�w���"���r����6#s����n����RcB��W��x#�:q)�����
�I����I7�śF[�zd�<�nyH1�w��!����1�B��Z,l��_�.JK).��d/��0c& ��6__����x�/k�S��P��|�'�ϊ�ܳ�2�=E^hGX���6i'̅���P�:+Ⰹx,����w��"�@�+X�di��ߥ�C:�Hk@��uЛ`��/��3(��l�m�!�!��w�6��D?����
�;
8�-�r�O�[_��{����kZ`���r4�
{���_�J:�b}�2�aC���!�
K&
[�J�P�AwLBVwr������
������o#|;$�35_�<� 6
*�������gU�zA>�a���N���L�
��-J���v��,!ྃ��ͲP��u<.�~�����Xbdէ�)�!0d��=PM�8�Uޜ>ON����g�Z�v�3ČY��Ɖ4@<���4wZ1���M��eڔK�*= "E-��ꥯ}@b�Eև��c�k��}$���Wݳ���r5԰v2i+��{1��]	�,gq���L=צ�E٫���6��@��G�V���"U���]u)�U����b|^Ѵ�D|�I�/�ƴ�o���4�
�2��I��N��%J��h�2BJrj�����KzT@��X`�w��H��EF��L��=bFr0�m6PR���_�UI�R�dJ��+��3^^���-��G����?*��<�(�#"ֈt��<)���5�N���&����'�r���S=�Gz�r���T��C4m0ܦH$P����D P[�؊�Y#uP����6��b�W�&T�,V�MN����0%���&�QM�z�^LWL|�Dw�|��?I�fS_�I�����F�R�B�6mV���׬�"�j3�!I��	ϯŎV�O�H^���m8L�2�8�Fu#�G^hz��{���X��a��(&�*J���}�ڕk%��$�D2�i،|29ёˤ�X�7R#�pXy��Rf���g)��㴸	]���7�o�����k|xx
�ك��������ܪW[ 	o��5�t �h��w�̂�N��M�ȕ�c�_��5M���a���G���"�xrrm�`���!�?\p�s�9��D� �^vyЌKe��"O��ȜX�&OxA�?� ���Rd歽h%yv}�D$U@���K�H6�� ��O.�5���^\���#�mY�K�WWq�F5Wn,���%�(�%��]��\J�xx�wU֚�h��Tub��uW3pN4�K�*l���66x��V�s�5��'����N��.��LZ�l��n� U.5�-��d��E�����3ө�=J��Bdcwe@Z��V�˸�?�����6<iT��"�C�ל[B$���cK��U�yN)g�?�B%yݖ��i{-fyH��zO�Am(<&��!Nq��v��'KKm��G!z���]�V�f��۲a^#�N��JT���2D|
��W��
'���q�����]\�R�/Y>�6�SS|����S}�|��c�W�`!)�
(��=��輡-ۄ���l:�}�;t���O�A�Y��z�t`
"����^��V��=����}X�T�Y�����o���q�����TK�q�\�|���hV�z�NuT�L~(1����]���Iw�Z��w&��j^������ ���r�L`$j��-V��&ko�mr���L�ȅ�5%�����:���[��1Շ�*X?zJ�-���$`��͋����?���|!xQ�n��0�;��֪h���E��=J�0�&��]w,��_����	��c����o��G�,jz�Mߟ�)X�r
���^�_�L��_j��󅍒�}r�#��!:T��쳼���8�I~V�m)r˄MPA���l�w������1E�<N�fʂ�&'�H3�>9M���%�>ن����)|K�'\a�,�mRd�0�&�͑%fA�:��$��ш�U��{��9qN�=?��N�7~��/$s#�+�>�*�g����1�W
�	E��c����d��-���f��b�nwǓ���/L��[��C_��[0o5��а��$�d��ɔ���ط����C{��-�?g?L7t�>'��o7���%a3���yd;�*t�o@`��],�r�Y�iZa�`&�5�o��N��]� /�Վ��
�: Q[��ú�E�B0S�ə�z�ᘷ+O'��A�>?�U��,�
X7�`�U�Y�E���#��L���ԣ	3�|�ݸ���8��У[z�O[B�\z�oi1��-�`Nd��xQr�2@;+���������x�?bM����>W9e}�!���<s�b8(���m�g�=|_s
A���e�g�Y�As�lʀ҅�F�]��(���� ����h�>��<�8�چCʴ�
i-.L8[?FC�>��a�s�~=p�C�ט�C]y�; ��8Ӫi�<��oп��ٵ O�̜�:���MxF��o��<�#&rș�ԣ�%Vc7�sa�繏Y�>�&>F�R�>�v��Z��%=���юr$Iʪ~�}%���'��� ݣW��mY�=G�l���1I�Y2<��{�:�9�������ѻ�w�%�w/3�=#��og�s-�����j�Л����R$�W��2�Q~LbJ��(��@���}�<J)0��+�qs1�A]�(Vò��1?!�dİRufB�t�Wb#���͂���PE�f�}�J� �]=���J���jԏ�})�X� AR<VلӀ�z�!�fP���#O�n�m���f���%&�e�Ū�1���96ז�f9�iq"���s-բsw�_s�_WJ��3�l���)_-���r�*�bx9���Z�F�u�Xl����n��?M�x�:s^��-dW��y�PV������?��Z�&�O[?�k d�@>W���0�x�GF$�#�����өO�����W�yٷxģ˙��8�+�#!���
<�2@���Y_k@V��>���ED�SK
�kP�-j���(=D�r��i�e
G�F⟠A>�����[
\�	�&�^+|�4~�/��o�%���'�$�[w�^<�y�q4���^1����d�܊�brf,Q�c�1��c?�����w�3�0M�c��-Uu5����W�ܟ�
c���cA�`Y$�:=%aYM5s�tЇ���ެ�mXx�ğ6�R��*ZŸ~ɟ*����*�����DJx�'��w�{[�����!}k&'���i�瞑=���^��2���4����(��c���0*[E9e�0zʸg���<j�ك-��C��M�!�#}pUM��.��Q��jc^q���5Z��/�<E�G����[���G�bz|���̜��{�j��F��$]�ޗ�k�O�R�]g�Չ�i�r�J�t�|P*ܭB�4���*��/�V�i
\.���hkJF�j\�4�&TB���P�M��훹����IZT��!���k�fb�=�\���6�J6g$H�N��Iqz�xFO�r���d���Q�Y�.Y0�#On��_CQ��2G�"Gx�x,������j����jZl���o	���>�W�~�m(��9G��ҨCS��_�	&�R�z�?�b\?�S�]�bm�wK0I�.@R�B'$aߚl����#Č��ȻR�e4��I��X��w�I��8�F�>`�Hf9ܫ���#�����;����d��E]K.��{��w��"ٿ�,3
m����L��0p\�uO�	x��&FJ�`]s����xv<L�:dž�˺�v���^k�A�9�$2�A�B[�(_L�N�tC�	�wg.P���Kĵs3Md�_�oo��%��0��ȏ��\�T��#t����T�x=��$�KLX�\wة|���T�m���P���E��Y�;��Hm��~�*��ώ㰧H��o��KX巴$��֑ٓ��'=�I���
���g�	��X�����}�;mW��`�%�c�`��-�
,��4#ZA��p�f��`h��6T(E�Ы݆��öE�鰷���v��&�CG��X�:��Q�?Q���N���K�]�Uu4�8$��4��8�<C��p	i�c?5�Cb�'՗P1��Q��u׷Y�g�"�5s
�XJz�Le��n��2��A2XO,޴/z��iA1�����"�Q4ц��H:1��5f�XJ��d=�;����^�
ڹj�j�݁�KvZ��3��az0��h䎳�?��٘��z�ā?�q?Y�E������!��r�%�����l��}����]{������Oф0%���s��f��N<0ݣ~	b*@�_m�=?QNL�I`�4n̯�v�n�d
�o.�Og���Z[EA�<L�F1��jN}SZ���
k���C.����F���*a@lGw$�����@E}W=W�!�p���_1�p����L�U��`D����Vf��1@��2�s�V���Fx
�g�$����,���c��4�Ngyh�>h�2h��Y�qe>�5�7�E�aya�6��@��VX�	\
���Pk�4����m�bV:*�	gބO�^�\C$��>��e�nJ�,pw�)�y�t|��*��4(�J�ȭ}��ҵ�e~�j6Ux
d׃B�Zb��r�*��ηL	6�$���EA���r�"?��|
S��L��9^�Pv��L8��n�⺁��B�"%���^]}N�s�:�zagۘc6֢���o���RX�
�
��]�Sf�ty	^��^��,ߋ[`��e�tG�/iy��oɎĮ�D�Mw(_LD�Pi�R�re��%�0���ދl���k���kA&ϛ����>e��}zM�˾�%6sk
���u�4�= �U�ݶ�h���Dž6 ����z��8�Mi<(]�C������M1΢D|��g�����n�?)��UjiJ�%`�{���n�aZlts��w��I٥�d��5���v��4�3
?��Q��"
��/m�B���K��q����d3w�AG0<��C���6��)����1��f����^PQ1�Dd�(�>,�Z�Z�;Q����c��c�b�<@*��/�]���:	�}�R$�8ߞȋ���}HCOC'Έ�3���Љ��C/�sQ>�a\ť��Q
�^��K�ث;�^���EI
;��Vt���?��+�D�| �P��G�����ngK/�=ޙ��%v��D�3'D���[�~†�/��P��zd�Y]�A�"-x�ζ�2��~H*?��}k̐���!�/�:g'���r���ҥ��f:d~�J�=�`y�s��=������l�`%��&�I�1���eh��<����b.�.ˌ���}b��zV�����NS��

v�4[���L&wK@`EY��Ղ�}6\���*s���^�w�h3�E�K��sy�AjCcy"���>L,�lEM'�ow���ԙ#Ȭ�{�n_׸�A�r�5��}����fV?L"?F��i֍D�v���1.%�5�*3�M�[����Y��C�oב�j|�2�i��D�90\�
a�-�$��wi㼡#�Q�%	Vq)
��3�f�:F~՞A��)Z��a�Hn��8k<|�J(�/��"�b�e��q;���MAZ"��}�3���e���L*o�8�Y�dT��
*U"�RX��?#�z�ބ�p�Ӯ5m�{P������oU\�����΢���$f��
`r��y��͌	���g�L���a4bm����(�"��l���+ns Ew�a~��8xqG`��b�:����U�'�S��I�#B
R��[�Y�̅*5G��ܖ������=�.OK୦��b���,�b2k�Vo��YN��cTA}�3����T`)Qﲋ
L3(��~��!T/��������2}Ჳ&-E��g�LקX�2(�)[���+��)�ƙ8���ٞ A����3�c�3>ܐ0W
?�`��ױ\V�t����u�I��d<����И��T����F4�</JA��@�jXu	�����Ctͪ-�L�_����{AT�x9/������/��N��M�l0������)�@�XT�%�Qţ�Q��W�aTd(U'<��������HbH�%�!+C���3Q7%F��N����p���VOiN5��q͌�����vZ�����b�^�'`�W�?�6Q9�/����l�<Bd�����.�e�T�ꟴ�W���N�?$�d�c�-��!l-Jw��������cm�\L{݈}Z�D��N�Fg�3��}�|��v�S�7Զ6�؃����D������4�=kE�`�9F<���ހa�y8�f9��Y�������8G������#]�c+�;�I/˟�Q,�z�!??�q��o�U!�|f�)���HIl�`j��Ϡ,��)��q��^0]�K1=�NXu�9YRyOo�3���F�e"� ^����X(g���������F�<&�����.��x�]�t@
[�s����;���5	8���y�j��7��Pư���_2�0 r�O�	�.�FPߝ�\F�R����+r��"[���1��������6'� z3�:F�����@�3@6�G$ϴ�<��MK����0N��G�u��w�.G�.��#�9��Wn�Y�/�&OY�u5�>+�v@Na#j�xd�e���y�֛5��~[՝��N�&���'����&H}�+���)��F)l�,�Ŭէt��k��
�C*<X�a6��h��ߢrZ�0#Z`o�0�Є�࿯�$~FgE.����v;�+�k�uCy������.�g�?��4����"pӅ?T�*���O���:�e��;�7����v�]q�.p�����^U� ���Bz�&�ou�Ŭ(FvQZ�p�A+U]S����xN�6�%���!���L�ٶ����GS��g)~�����=�W�C}ܠ]�\7�VF�]R�i��͆
t�X��@��2�c-��^�L�"�������Y�5�(�I`�f�Ы������Oc�)�sm�F2��H�g�n��`2;Ky���r^�P@Hv:�3�ɇt�T�(��o7����#n��j�<=���k�m�� `:����Ý�:R��<�m>����<X��Fݪ|9q��I�� b,�-]�n{�,�Aޚ�Hğ�>5C�m�u�.L��
=roJ��Bק���y�/��/֣a�7��qV����>�Ho�G�����W���?;�-2��ߧ��.Q��#؃�d����X'5��@���X���X��Pm��Q��� 
	�nna����ȳ�zrރ�����!⍭B�G&ҷ1d�X;4VFTv��_�.�7���S���
��e�

������6-^��o�"�X�@�Y⪄27b�l(3f�/p�b�c���A!4c:i�u��0�zԢ5_���5�]�L�K���H&
���
X>���t���k��&	�&�?��)Vߔ�j�\[�f�^�k;�+��c��}�f)�U)X�8^��g��(�1Vb�%���r&����݄�������Ѿ�׌��R0f�����(�VYld���ЌX�c��Z��ݱ�tWQ���0�����AI���K�䉞�I���{Kk=Ӈhn���@:�X�-iZ�h0;u����L�j};�벀;��
�P���~L�ɀm�MLl���W�6炆�a�9_V?��,��%����PI��k���C�/&�U�S��FC惘C}���2+������&�sac�,aKЌO��wB=�Uv��Ԫ7��A���$K�����pCS��ʩ�5��[bs�����)K�����.m�O���w�����~�g���9�S=lW1kFV0���d����9D|��b��"!�:���	���؂n��Fg�g[����kr���B�s3nN9�B,�or�C�I_�P�&�“ѽ]�Qh��!�Bv��X̤�{`�N��j6?�6�8lR #���߄$���A�s�ʙ���r>��it��B��zoW�-��bek��ި�����kEx�v,�Բ
i @���a��4�z
�N-��2biǞ����"�dn�K/
�|J�rІD0(v��m>��~�[X����5i��a
�X+���M1J���-�V��gQz,��>�����^y����j^ј�����ƅe{�7�}F�\���xG��kE$o��򓊎���mh-�R��-N1�D���/��{�g� m�	��W~և����A]��|^:�%����;mʧf��$����yh���P�SK�ō��6�#�;�h��i3��<���w��h�٥9�	�n�yT�x?�Q
w5��C�#[�1.�ţ�9�;)v)qa��\�\^H�0q|��� ��Cy��O�HL��w�J�����XC1D�6����L�j�~�6F���u�o�<�Cr�^�����$cl!���P�Z���K>v:�>(\������w�.'����;��]�G:w�:�Y럚���P�9�G��/t��N��^�a*zC��ѽ����/�Z��~��G�i�O{�֘����!�?zs*�W��[�Ul�u g�^1q���'��{!��E����$yd�rF�n��@�xiCi�%؆X�Ⱥ�e�:t�+�_���'`�1sv�%I	��������j�J�g[�ݾ�;�-���%��!��� �x�;c���d�v{�@����\P/��ܲOo��[�ݯ�����+���-�aw���=�l�Е^�,�2w�^��oO���3�/5��黍�z�*�ܓ�ehP�_,�x���[�hPIN��'��̆w6��)��ߜ�i6��@�ˆ7�k]�ݾL؊�o_��������p�y���Ų7�s(��5Pݻ�=۷����P�H��M�:k��ݵ�%�a��X����X�,\ū�~f�������^��~���(fM*:1s��1P_g[����}����4D󡏐�
��j@G�t�n�Q\OH��4����-��{xm��g%�O��t���	��t9�H������
J�*!��_�}*�[+<F_iL|�#���Ԝ08��	���VO�092�u,g��F��K����b�(
����ۛ=��\1r��Z��vmn�9���Bo�<&�T[��{D���)�;����4��Jr��c�C�y.���R>2V�����ZF�o�	z4w��SZ�4='�?�a�iT��_��Ӣ0�4�����
�?��������3F��4!8��?UU����,/�l��FO�n�.V�y8P�PB�+0��U��(2��l�y�gh�D~����a\��t��n�ͻM�;��x��ӟ"3�j~�
�����Հp���rԣ��Y��y��zȧ��QI��3��� ��1���-�}�{�;��;�*�KJ�
�ʄ���M�ղ�HE���Ի�,��!'��
��$��85�A��|��JO�b�4�+��}�1�읿8�
��;�})�\�bz�����,�M>�h�:����%��y��!}m�Ď{�4�6��Q��_o�oѨ�{��
���WAМBmc|\�*G��v;Ϭ�Ц����1���[�Q�c��S�':@_���
��G�;���h��Y����F*���D�P%̩�϶��a�IXh�I�]%BX�!�w4�a?�>8ND�5ۑ�H�]����D�
��P�>�2�"!`�y�:Y 
H#>gh����3�뤐X�z��f\p�ի���}���R�0#���&��@�����
x�_��(�r����U�-�
�L@I+B�(l�M�H�IU���ʼ��E�߭�c.�S`�<�/��m�3�m�/���;�8�_�u��3W���t�[z}6W��4y���[��ݥ�S�]��X5�oi���Gڇ/�=�}]��a*�9j��ѥѩ��S�wl��39��;M��B(��`���UEO�s�0}\w���g<))��ٰK��ѥ��C��p��gȨ^�1�_5�C���G��9O�Z�>�
�K�bWW�j�?�j|���F���df�J�Uc>��Q�d!��8�PN�MM�O���_��^l�����=WY��16ڐ�<�3C��R��z�iRK�݋��hm�V�g2�7V,��'~����,�T�m�$��Di�����*�*/~���K_�z�Y	�1�8@!��Q걿Dž�T�0�&, ai�z��;m��{�����M{שּׁB���|ώl�n��Z]C���V%]ג�ؗ���"��P��ʳȷ�o䕋ٵ�UH���v��c*;�gQ9ç��iE�$t��b7}���QeG�p(�+#7�L.�Wu<)�]�ChZP%pA�3g̨�?Ǜzp��"�T%�7��)ɐ���l��	쓌��o��_�����o���xS�^v��v"�G񄇛���4({��m�x"�_�4�)�_$����6�i�Q�d?�(Y0��C?�K3�bc4O���I����V���S�[
�؈=�o<�b\7W�q���.���cO
��S��bO펉-��
�esLl��و=�h2bO=eĞ�K�˯c�˥f��-syⱚ�	�)�XMW[㱚z�XMeq~$�^�� &��&Ĭ2�'���_x�=F�*�'�
�&�w�~Ȯ��%�7'�"VE"5L�U ���Yu'����U�Pm(���u<����?"eĮz�u��U����m4�J�C�BC#��,_��X��΋C���P�6�ǡJDz��Py����F����0T�If�9Q���1�*`0
UK<
U�ِ����P�ΐ� 	��(T��G�:��AS��$�R>r��q��2�m ���^���V��Ph��#�l�^�q��k	�2��pz�זF���r{ҿ��������U�B�Q
�Q���
�2��6���*��{� ��MD�!��= ��0F�Hu�@漨@fc���g0$�I�	}	�O!��!��!h������DO��ǣ�وG��������cm�E�z���H&�$F���Q]���Ѩ�}�������Q��je�:1�ţQ��x��q!b��SD�*��:uAT�2��OQ���T$�],*	X��?�d6��,A2�����HT*��>�|�;CR-:'$Ս.�jI�9�!����4�(;ѡ�P��(5?(�]�G�cΆ:W-��T���2:�V/�"����(Hm,,՝FX�a.p��k�fD��.�}͈i�5��PU�⡪R�+T��f#T�f����BUm4��PU�0��j���PUO��	U����PU�	���0�BU���CZ��CU��Du��E���r�0URta�"�ƹQ��h�)�J��2��(U$���3��4��+qA,��������n�Ru;E����T�(U�*/�jY��g*�JCd�l�y!��q�Bmr
pm���F�ږ����J���X����9V֬��1�J�Gq�Ć@j^CT5�������-��a�(��R+��/�S��>��p���`��R�i�.y�_���T�DQ���gy𳼍r3}ҭ!�Q��a{A��l�S8�)�U�7wҙ��/���|)��<r�H5F-B��a�^�OY&8�.BId	i��Mv�����y
2�X���?��c����
q|>�9�o��/vڅÎ����ذ�p�ۧD=d>�(��%�2Lg�[	�����s��xj� l�s+�6�4
({tH�b���h8z�鎿��By?dZ%�v���ڋ!��Y�6�g@R�`n�9�mx�!ұ�Hfy�j���j9�R��qWU	�7�	@~�b�{�IĻC�o��
2l�\�T�s��(�eӑ��&~q
I�t�UVd�����,�#�`�PP��x$x����ad�7:DT<5�0�0�x���
I��$&1���ͮ��#xT4&!f����1sF����
�q����|V��]]�]}U��Ч���j9�{ͱī���՛�M�qܞ82�+��>�0vJ�M#�Ҿ���3�_����>�%��CF�.z�yޘ�*��~���U���>6��r+���!��îkX����-��3�m�-��Z^�4}30�-��X�ɀ74�;���(�[����/Z2&�S���hV��"��d,e��H"<%[�3�X�Go’�
�����[_w]�/+]�so3ي�x;L�=O���-T4߸���v��{�ѿ).E#��_��o����:� ����]K�����	M��z�j�����xĮ��JC��@��lݴJSo��aT�O��i�v�麃���W�P�W��4[��)תS[u���T��~��n��V�_V)�̒�G�ۖ��4Ҟ%)C�&S�N#��U}���M�ꊿ��Ϥ�&��K�bHuy��{ҵ��VO�ט�a0��H�u|���;�� -��
�qP�����z~���?�)���D��:�Hq�)�*]�2A�)��L!qk޲s!5\���:�M��T�>�N�
J�K��Io�XuL�n��
�e{h��8QJ�����"�'^Pͱ�yZp�4����b���D�fT�"��#�Rb�K��#�f|K��J�}a����:=^##i�4���,%���gLv��KH��n:�U�t����Q�Fi�-����5�un(�����]tfL,u�ۊvs&��f���S&��f��8o)���G��r�,��*����Л�P7���Np�Jm	-��	%��`#�P�4�mej�:���ɻ�S��"��^�.��;/�qP�"�_�ɮnzfN��xj�{�;�v路T����?,��ĖKo��+�������.�T���ں�
�h�1K�=� "�>���ˬ�6m�C�C^�U>�Ty-8�U�F���0���_އ�wm����_D�r��YQ�nJ�t�,���şA�5Vi4\��x�-بo�c9��ʋ��{}�~g9�%�Q%��^����GP��G��I9u6�{t��qEMb_�����j��_Ǔ�Ƿr�B�8��j2�>'Hk������K�es���3�L��o���ޔ���%bfy|�qG��&��P�ɏ�/��#銛�R��g�r���YY�,���D�g79t�
�ɾb<d���j��6z7JQ.vێ�!i�0 /�ӟn�*�ю�@9�p;VK�p�
!
*x�B�2���O�_{���L�c�i5��?~��)K�V�`�a��m �%��Rz�b\
v;S�}�."e��S��_C�sWv�_�㾅Ki����B쥼%B�/\V���!����vV�u�}��T����6s^A�aAK�8_���ݨrSI��wz���)2�d�u�7�)���Rь%�/z��� 
���`G���BM�Q�0R8}�J���Y��c&�N�%���d(�l�rI'F
��`j@e�l�l�����t�z<��#�_V`�0�ۗ���qS��L��c�a7y���M�J~Ȧ��%\�~�H�]�xc����nT�}M$����G��Wӗ�Z�W�}#g^Jh�b~�M	}u1�U`��X	
r�w���Zܽ��%@G�3���u�(��%��Eo�z��nB����n����
�Vכ+�'�C�:�5��	�����mƀ��m�9a�8\cI3N�s�3O\V��Y�"�-�&iN�%���x�C��Z�ި�ܨbxB��0���J�!��Rh_�L^�.�J��0K�h��v�^���4��k��_�� �'b��o1��.(D)����%�:W%�a��V�BS��.nۦEBɦƄ���dS�q_���Tbm1mW�<��N���K�Wq�#����@721�N�L�E:�t���\n|̈H��X9&ዑ�]x|��_�g�j;2��C�U���8�
�е�������T�u�$�$�5��8�g��(%��J�Ʒ���$�����?}��8GQBl��~�!g�Q:�0J�;}��Y���Ty��E��GW���tcl�8q
�|��L!����)xwE1��çoԇs�
�A����&��u���{��O`aJk�ōb��^����T;(!�Rc��T
NP�8���`C���wA�ǵ���R�~��m��`�}�~��>��9�VH����A�4��w(zc-�*��]tN�g��RbR�ΛP�'�#���D�(}`b�وE��'��a��a�j����xz>��Q�q��B!�t!H	�pa[��IB���tܣ��0�;j0ߨ�}�V%�o��I��P�;$��Q-�\u_�e%M�y�F���~�TH�WBw���,��7DR�)y�nc�Q��1�T���ih�	�z�_N���S�搚��%��`r��i�F�n��f&&߸�*\ؖP�/FQ<�Hї��^�~��t�]����L�F*��'Abз��qIQ��/��?��Q���q:��Q��lG��6����ήy��q��_�S��
J�0��c�>����wJ	u�9������P釀�㧠�)�S*���A�C�̨%t��%���m	���ໍ�c�L�V/rj��a-Y_�Gz��
xrSyɦj}�h!UQN\19��B{���0�;bG$��5A�«�5#�/}1���N\d���-�P
�"��*�Zi)�޶CJ-N`b{�J�&�w �SI\��N���t���)b_�ԂM��x�8M�q�Xl�kY�/�zJ+P�>P\�����ߓ�4��Ra~h��+�A��B[���EtJ�f�RW���J���;n�B�i��e��r<-���fIC׎�e�6�v1 ���'M��v�
��^�	G�؛���(xy�'�^�rΩ�zR�����[�f��Ŗk�ܤ����UK�x��R!���L�1q1�j����Xt:�~������8Q�9�����sh��E�n:����ӑX\��j���1N	]7��2��SKZ_�t�.�@p-30-?=L�
�dG��X��d�Ւ�J�~RU���t���*k#H��2�t�rV��P��ní�u�<�����2遡B��K��G����*5Wl�
Ɓ��l.��+�x�`���T�24J\�9<뇻�8�2|�OH��)�KCC�f��񎰤=D;NI/�n��qEZ�4�T�*N�2�g9�(U��AJ�Tk�hNyO��$��3f��*mw�q�>$!�>
.#wψ�p��lu����ET����˭�@�{����V|lݨ�@�-B��c𡸾؞s���M:]a}����޽�ը�{����Qv��/������U}$�����.鋋�Z�qy.Ζ�,{�j��M�Îû��OP]x��|/]�=�ޠ�?���
�D�~uzZ�O���c·L�`}\p���4J�{���G9�Qj�E	�ғG9
M5,J|�In�i�90J2�Z��"�爿6%�Hz�49<�j*3�dO��/O����E?�q���6qI�a�T�4;<\��[�S��xP#H>��u�����
:j�s��rH������o�����*�qB�l<��Z2[u>��(��f�Q�Vz�y��OF	LJ|<0�?*��wR>`����Y��1�
�NL	"]�l7���!�Q���<�����8ۿ?"���U�cab`�^�
w�W^�sNv��j�9#��c
�L1�Cp�A�a*��w)8�ˤ�j5_Ǵ��
Wܵ:�
w���'LLq���_x�b�-t��o$1t/�_��8V/ד�� ��4I%tS��fs�1���\V�@��w���P�����N����~�it�<��>��B#$j�������K�k�PT���C��yMNq��G3����`,��/�0- 7b6$A���4�MJ|���Tű�|�bڽo!?������� m��L����>'2�g)�޶`�R�\�NF�?�5��揄𜏨�(���茸�y��J+�m6�A�f�A
J��\�u��B�s�i��DY��Z ܜ�&q�P�M���b�_Q��Pj�@�[��������_������vm0	[r�P�>���$�$��b'y�y��4%JI�.%H-%�a��|�Iz�,U��q11T>�݈��at�8�T�.]���!ՙ$�:�U����$�h�É�I��Q��]��ϘzV���Op��n��Z�lE@_\��N�D���'�=�g�ZF	�q���Ԩb+�z�	��Fy�P����N.���ʧ�ߡ���t-N�U�O>A��*�lc�����A[ˡW_{�Y#���27��?�C?�L�����'�-�ɧ��q��h�]lK���j���L�]�!.�t4b&��
{�
�m�&Z�E���̱�kǩ��\��e�|��Hp��k�U�j��T�Nb7����p;��ܸ����G̸�a&K	6<�JqNRm=�<p��i�����M;�H��n���M��j,��i:���8��n��
x�)Q'D����S��0LsJ���� ua�5w9m��4��a��4�,blE�)��/'l�)���PQ/8�e=a�8�9X���p0�᪤�Z%�݅� �w)�;�/U���Af)/�,}N��qocq��";�����6F$Gf�� 5$�󟋛��\$��y�
�-��ʁ�P��옎m����㐅�+\���[�v��pW���,��b�H������.�л�]���#te8ѳ\�:��$'�6#��+��c��.[��@��WRN)���xr�#L���#� 7@�G.�{�=�U�q�kyc:
O�i}B=�������*�d�aK���VZËx
'��p�XNY�N�Q[�o�!%�~��l�OgOm��ǣz!��Z?�~�ccM0:H`Q({�Wn�*�b ��R-�éh�r�a��B��@�J�FԖ��f5T�A@1���`?5n�r ]O�-R�Ja��XoA59�ɯm[��c�u朅�4����	?���k�>L�3��	��C6.
�c�OKϢ?�kA�;���Va`4�]��n8j�A�z��ўeL�F�F���@��-TM!f�i�9�J�ۡ��=�;V��S�V�P���VI���N�$����*��A�4��ӴU�� ��
֏ɯK�1c��9'm�p!,��R�x�VO�ҡ��~�ůe�u��^M�~*�����C�� }�NF;���v�hW�v��/ZCX}s�О�UVs��� Nq<���m:��:yR
SR%�aH�<�!yC��=)R�_�bq��e���$��0d��)CR�:�dʧ#W2�&�Őu��\/Y��3߱�w3{���ؿ�E�\]���ݏ���t~�p��d��$��F��p|[�d8�G�����p<'0�q������,�GT�_N۩e8>�#a8>�#�g8}��w������x]\��p��m�#��F���;������p�+-/bx>����9��e�G3|����x?�?�x�"�e8Ό䖥���_`8�Z��^��Y��A���x�U~��\����2��0��]oA|�q[A�g8>�.�B<��a�/a8}<,���71_��c����:t�p���ZtY��E�_]B��������:��C����3|�2������߃xßG���{_�pT#g/��C���
g��u_!60��?
1K6��&����f3��,��&�٤��RfӺXM��-�n}Kx�p/���b֥��g��0�6u��/�&lN2�'�M�a6��&l2����6{�M������Bfc�W�M�Y6/2��Ů,c�7-v�D`Y�,}��$�,d�?��Fw�����x@��ϴM#?��m]r�F�eG�X�c����$~�Vc�yl��Ϥ~�ݶ�wnT՛�*w�L`�i�t�ؾ�5Ӷ��N:�X�	D�Ph��i�㫲�����ߌ��}F��-���<S
9�x�|P�>[<���
�����UN��&|u��rT�`f<&Ƀ���/N�9�ܟ�Z�<K�k�w�*%�"��|^3I���$,�s|LJ~�\��3�.�] ��qx�'@y�X�X����0�;,T��A�)��!���x'p\W�G��}U�;�0��ht}R@�����@�g�w��3�`��V	X���� Pc�L�mPg3�:��CE�v���4o������c}A���pnT��چ����� r��Z��tL�*��D�:�pͨ��iz0b��ye�V]q�hEcI`+���R�|�Q�4M����.��\��>�B��)QM���o<���o<��_"����Oq^�7ZqT�7�bO�8N��uz�O��g)�	>2!~��>���z�s#�1�hΖ�P�1v����آ%�kB2!o�⫵A�&RQ�<�	F��1��yD������NԳmb�M�^xLQB���
�̨!�W)'}��3�&z�;V��bE�E��g���N.��/^ъ>	����m:Ӧ���E��OG��:�IU��H�^"JAljR���`:w�$�9�{VǞ�t��v�jž��0�ZG�CT�m�p��|O^}���K��x�r��g�<�{�(���G<eT�wzI��=/v�,�B���a
�r���=ϖ%M%4�
����g׉�H7uT�c7?�o?r�`z°tfա�ޢRBK&P��,�������0�7j�Έ��z~�d
����c^S&`EՃ�/5��@C�c��>Jy��q�R���~+�eƗ&�@�Fs�Ѽ���qhׂ~Z��Y+��ڃ�ϗ��r1�>tͨt����v�q�i�,T(�Bi�����xZ�]��DN*��g+�tJ�v�G��1ʷR��;<�~���N��/�\�T��7o���}\k9�ε�#%���Uryѽ��?@_�h��gs�� �)��v�T�G��9���uv���T��>¨��P���0���s̽>IuJ�u��o���{7�.���+�amց��.��=��μ+�媿[�QR�=|sE�S��^^�a��bg��[�˗� !4l�K�F%T;�1Nq�!$4A��-t��H����W1t��X:�'|W9���L�q���෡N��@#M����)���k����0�{衄�r:zE�=�u�wH�<�d��Lf<P^رy<|U#+�����:_���7z�Og��P��Eɧ��$Xޝ�&��k}�F%_�i	�%x�3J��'� ��i% �/\*j@OA�I����Eσ\��-T1_�*�	�3x�9�El��WFIo�L�3����,�ݥ��,�!s�e��/1�d�##�D��\x�fj4J 
�ᖈ��}�>�O|L�pB�B������y���8���(Y2��X��,�\��y�
�I^|l������˞���Wf1x���$�b��kw�r�w�

�_���9�>�7`{΃�p%��G������
l'd?�A�4 ����xYQj[u�N�|�G�����
�ԯym�y���j{ˠ����.����NC��s���}9[u�B��|��NA|�J��#�ǥ��B����<�<�-q����u�:�b(��=<+�a�:��=Q�`�q^(
���{]+;�]b蠳��KE��ja�Sl�W�z>���ņ>x�0�*��1�$�}�����dj��l�20F^ik{� ��4^፝���P��c���U/c���1<���JYd�.�cp�O��h��m��o���5_�TIu ?bl2�u10��.�Z�܃�?w�<V���8ޏ-�J�DfJ�z�ׯ�9�vڗ�&�/��-�{�}�̉Y
��wVBg�a{8�P�Ǣo\Q����J�p
,2K��u�bpI�pM��"��Q���;�Qy$pp7f%��X��W
��^�m��T�5u�)<�X�N���Y��1y��%��P}�͞ 1�h�}I�W�YP�Y�9?3�2�)����	��)��p��Ѝ��t�S\�ǭ��f��uOo�>^�f;L?��k�E�i؎z�T�c�h@5�^D�DL��(��G3"�t��'j����H��.l���Nb�+����H��]ĬlJ�7����xi�;�B�b
7)U�
�3�s<7�y&D}�Q�����G��V�:ʍܼO«�q���r��XQX��rM�RM���\^ IL�w7�c+�6|�l�%��uJ�3�6��l�����D7B��[.S�~^k��m����~��7w(�'�z�q�D�K�qx���`O��F�P�����t��a���p�rd���[O���+ۼ-��@;��.Ao�����Q���I�6�ô�+��&��i�`�B��_	�ɪjy�U,"!�QH�J�����ӎґ���4s����@�}q�Z(\���*�X���W:<������F�0ԯ��Uxd�xSc��V,��K|%,�J���u	o�\[�X,a����Fw|�~�-�L[�F�/Qp�F=��
~~ҵW��hlͶ�jl�6l��!����~8�P�T8R��5�#�
-X$���+��y��Jw���
�#}��E
Й"*�PG����+屭[�;Ab7܂��P�t��cl�~�'N���Ŋ���~vI�/�,�敮�ZSW�~߆��q�~�fz��֊}��f!��zJ����y�*�����A
�.��X���
:2ĉ��M���h,x����)�Ô�d�K�
S�>�wKqD9r_Ʒ;|[_�09�æ����t�Y�t������Y����5����u�lg�5���T7X���LI��n��<��n�����R��I�]����)-U���
N��i�/;��D�pgXj�N�z�U"~UCһ�b�"�*V�'/oV/ՖS/����T�7+\�R��� Z��i��|���G�D��e�n]� yl�	����
���{�c�C�����W6��+�6nwSW��n�(j+��ʂ��_n�����-�o@U�
�}~=�܀�����<Z����A���XXo�Z���T��IU���!�z�oE���"�}�l��9zȯ�}����>ﶺ�}s�ٴ!��}�jQ��2m�N�sdA��E;�Ϫ�H��Ƶz�_ߡ���]�3W�V.xVO׿^�[��
Y���d�N_4����N��0�+x���Es�����9,⊠�{A����?�z�����u��w�z5���:�Eש"�v��g�W�Wߩ"���A����NEз")�w��΁J��"h�>����"�L�7E�3���A/ۦ\G4��e�cHU�AH�IEЛ�(,�H��P�rw�kA�9��O�߭�7�:ݕ"�Z(�v���߭�.��C��DLU�d	�kE�v�r캊�~�sE�Mn���4F�ߥ	�����=o���!A>���bh�$&D_O1��z��b�2��$R�#�N��a-�u"�!�!�����r�
�'PL7�t��Ǻ��7�⪡�r��7q��=�j�n\5�7W
���:Q
�洢t������7�:�'W�4����=��z�܊L`j�w��Nw��s�TCӎSUL�+���~U5t�/\5�j�/T���TC�VUCW_O54+
�@�н��D�gs��w7�ߧ�j���1�s!G�\,�X��ԡ�H�$��}�&����Xz���:`ԃA��\ʡ�F:U��ʘ��:��o1���2�p?���������~����^����n���5�����9{����|sMY`�#BE���~�f/���u=r�Њ�FT)}D��/�x�]H`�0]U|8:8{�A+�����\�'|@3MǮظ�[vнsh�"6p�o�&ˀ~B����D�Qk�%Qs��O�����-���B4�!��Ğ�1�_9��}�G�)p�'^��Z��Ӑ%�|��a�������M�]�^G/5�*���W�|f��G�s���&T��� �_���n�"N-�2�fw�[v�v�ݨ3Jhe��_���
��E�u�cu͟ߣ��Y��+�3�>&6���y7i���@-ͺ��M�LA�so@��c��ֵe�k���s�](��:�s��~�؍�����w�ƨ�.��+�Ps������ya�	�3�VLQ��+E0VD�,)�+��;H	��K}����h\�?�z�%�^�Y�!�� A��^�w�ն�T'~��m靨�K*�7�}`b�*0�&�J�W�?Q�$�P�ӗJ<��<S��H�_\",�ș��Q�"���Y�/D�M�:���H����Y�u1�(��R���S(b*����)NO%��B�
5�+��dQ��|�NK��n�'�$
�G+$dVdt��Ҩ��S�(��	]T��5]!�j񬗪*�L���ֿ��,¸��/C�|Z�����S�pg��"zءZ�ܬP-~�T+���!��B�K���^�f0K�x��"�Oev ��q�~�)�,���T|��!@�\��V��-�4�t��B7�L�&�k�|�	��Vz��E<ze��*�|���mq���K1���j��]��-;���Q�
�	$�B_��]\*��o۸�I�����8��'��b����w�}1no�%��w�3b+��ĭ��x)�nq�~� ���$������oj!�bX�����|:$I��S$>^~���(]62��C�}���]>ȵ�͛�;���֊I�B�7׍�/��Z��4����&�-T[Jb�
'��Q���P��p�p(q�z�d���1%�8�ݠ/�K�)�ӿ��7�oBC6�c��=��>g;�U�1�������DO��ߤoLҧ�dv7o�U��b:���?呔�r���)Y�.�c���WI��J�}�T�/�y@i��"�v�R�U/TP}���*��m����;��ky�ͨo��-�%��6ݧs]rS�
?�i`"*O@UY���<�#��dzVo
Yb�F�����4n�*�$�Ũ�Y%Ď�L�\��4,�w��1:�\����R�R����Ӣ?+|�y�*�I��B�E�g�s�%>T癤�~�o���P�uBɸޫ��4�ˀ^�W�ьq��?������
�\�Gl���ˏ�����O�4�����#ݧ	��w�\*���i���dgJ��Ül\569tYC�0O��Ǚ�Uh��C�!Hމ��|�|Ԗ��-zMxI��:+k�b_��$�o2O���/z�?mb@&��Ǩ���0����T"Z��T�yw`2�����~+��fA��D��W���쟈�F�� *�REς����TRG����\	5w���Dܙ�[V���gg��v�!'wg�rB/�XJ�"�%��KpkW-�����Kgx�V�w���e��-Kl���)�o�)G��E�̴S���j _����f����D��m*T�xK�߬e\9���vpO��P�-��s-�8f�3�/�E�2l�'���>�gϗ��,?:[�N�YɈ�1�dI:���/�*蛯��`����c��E���΀��z'
��a� �#�V�p�gl,����1X)��=v�w<��?d�E��;���
�5H���Ӑ�c
�ҡ=iХp�(u���H����Y7�Z���_���~��'XM�㉨C9�t�^膯0��t!p\u�T���놔���1F�z�����POQ���ё� �B��{�&�9�� ���O��L�
�a���Ώ�ˉ`���O%��~��S
��sR~�f��@��=V�������/M������X!��f�x�Gz.S	�D1T���\�Q�9�|w"?�=55�����i��\�7S=�
(�Xp����
�WЭ
3�ژ)�;m�I3]���Σ�X�9�l&�۵��?��j|�E�V�^��g8B"j�C��o���A�|wZ~:�)3��8#;�o���00it[�A�{�kb��?v���Y���|�o�RN�f+T��8,��gZ\�҇��>{�����h�rйU����� �����`^����th����2˵�7+��P�Eӡ81P>G]�a��(��F�]r���P����e8
��f�%�¤�0p+��XX�Q�^�v���a�,,�Y\�&�a�09���n��(:�?�QQ���tt�;d)B��E�
J�y@"R|x�q늿���$��'>�u7@&��Ԫ��[[ś�T)���c
ZT�&���>0m�
j��^�鑨�U��@%�� ���~o�^29"���AA��&����m\���;�j�n{�T4i�Φ}��Uj�(�w�V%9�(M^�K���vL� 8q�R�CVf(
U'?���
D^�-O���w�n3G��&�z9
�h�|�}M��P�M
�Q="Nj�l����(����!L��g8�~��ԟ����>�m>��H*�-r��081�	�fde�k�%�.�P����ɔ���v����ݥ�U���e����c��雂�-��C
.q&v^�A?zr���T�T]ȁ�,f�]�˭�������ʐ�Ґ[�ь��_�|�у�'�4�C�/=�\"�K���.���$�!w��k;�`lp�H���4:��iI'�}��(�|Ast�D{�_�Μ���Y�N4T��S{����u��-�maV�$���i��zJ�-k�9C���j�-_L�QI���m��qŊ�x�ژ;֯&�XA�!��u���M�D��	��pS4A�P~|����\��p��C���uR���R�ܱ*����%��"'��uVKt�b`g11'�.+�N翲�����:�v��P�,��9�䰞��9��`?c8L�0�Í���8<�a�2�-E18�Ú	��E�8��m�p'����p(sx�ðh�s8��;9\�����g8�����1¡��[8ϡ���9��p3�;9����Vrx��/8��C�x^_�s�a�s9���ws�2�5����9�ч�[8��P��s8��a��/���TS�ڻw�+��)!��c��q;�ʛ��mp��6
�e	B	��3HC�t��e��Ɠ��`�A�I�d2��$1<�<��'��{>���I<�ML�V��Id5�M�x�\���b�<�?��f=�#�~4��mI������3+��
�,���.��H.YӉ�l�-��j;�
l:�4Y_��o&��<�9����"�ܜHR��F2�y:�]6j�O*��f�ʣ�_ͯ�O5_j~�|��ֻ򡦯�����B|pK�!�a���!��+����_:-y{�d��n���q�1���ݜJ���U�S�W�S�Q�_	�V����b�t��0$�π�z�1�'�NO�I�.F�2&k�u�r��!n�]��<;M�E�<�MT���<��LG6�o�#�V��f��:HL����ٺ��H��635�!]L�Ǹ1N����1.��c2/Ut��Si<��Y�d:�y.�˚�cu�Hv0Sbn����0U�x0<�A��i8������G����MܽGHh�^a����������:l�ͷD�9jt䘱Q���O��8)v򔩷��ś���3gYo��4g��.����K�޹,%uyZ�5cEf��U٫srmw��Dǚ���o�{��[H|�=a]��d�M�b�^J���X�(�l��v�"��j�7�k����ď���<�s���"?��������l�=#�ՙ���E�(�C�����b��'��hb�}�hK�N�2h����L(Q`���d��7�7:hɁvo��Si�����B�,�
���[�m],�,�
� d*�-K��9h��p.M�l��
�b.fZJ�j�ͣf�
�ey�ra��4%��O.��@�˦�Y�Ri�*�FҲ!-�O�>�@��X�&;��R9!͕'wz�vJ��G� 6�i^��B�h���̢��X�c]��!D�9�Z+��H�a�x��س�Ҫ5�\V�Qԝ����+�um�[���$�\�s)��m�;��#�"]�P�ү��wA�� ���8h
/�T�5��O�8�&�����������!צ���s�g�5���v*`��$�m�Ũ�����J�ќ���LXsj-^��1d�u�;R������ݱW\C��z
/��ߞ�0W6*����Qy��q�c|~%�ռ̢-�NcOw���LG���)�S��v(�[;EZ�R>N��L:6��lm�%]��H����ƣX���Y�4��n�w��d���s^'5�����g�:b���X60g�tt�Q;5��aaү���)Al��S�ٗ��Y
���A��؍�������ss7���@f�f7��f7�����W������3�M�<7P��cf��7��|3�S�ͪ<���q�Un�f��[|�9��};�KP��X@�8�׋'�g��n/QZÙZ�<�ϭ�F�?B&�yV.��\��
Ʒ�r�Z�*
�1�W+H�Oj�$����!����9Ǒ�
�7�� xzo� mBB���EB\�����GG&DF.L��(��R2S�����|���u��Ň���k�����u��O����_Q'�}��in��=�V�?��S������wm�f�ws����F�8@��q�m���Z��/��M�n7\d^��-o[�;���!]�����E��f[�viG�o�-��v>���v=�ȣ�{��=O>��3����_x�|�O���_y����?p�7�z���C�����>v�ݚ'O՞>���?���s��������Ͽ���o����b������?_��K��O/�t�sC4���N�߾@ֵ��
���[{�f���w�̮�,���{;��:���`�����f|���Z3M@��>��aU�f�箝'��Y�9h??�j��|�5M4�d��WS��<p����41k�5)�氹���$B̩+��rױ���<�����Q�R���������/����{��xy�DW\\����O�����a1I�A^�.)	����oˇPĺ��L��g�Ͷ�f�F�Ý�����p���l����*[���&�I]Q�s�<=UL�6X�\�!+ǐ���I˴�'��QOv������1אk����i1uy��s2?
��3��Rm�1��:tTvkj�!Þ�B�hĽ!#�L/HH,�f�rȟ�
w9���Y9+4c׸�YE�͙��P�t�-;+��P]��sb���t�T:t����g�"�c�4�&�G�ʲ:��
�a���];nm�_a��Y�!-7�j��0�Եv���km�Y�i�v��i*���\�%��Aa1���xW�Nj)d6
�{by���`���c���2���Y�5ϖ�f5�f�V�a�hG�}���֜5������05�e��Ym�U�m�X�rRi%C�A��w9rE�x�C4�ez�5mc]���<o�[}&�%��_�%f"�䉩v7�K֭iy��N觖��K����w������#�6?y�Ș��g��a�T^
�)\��0(cvv�Z�Cw��k�uM�.�Ͼ�gn]=MV����&�����[�ƙ)2
���bfJ���չ|Koo]�\��Љ���I�o_>������?h�-ߺ�IKp|�[�*i��p��[���ږm]���Kҳ��%��Q����~wp�@zD��s�����1l��~�_�/���?�I7sp-�3��-4%$�`|n"�s\��~4~�o�wd�ѓ�b7�+=� �(?�w���#��#w��E�k�_���_C��$�?�'!c������l>)�I���H�#���0ݗ�֑�sCkռ쿙T��G�o?/�oZX9�1!��u�2>��\�����O�����ɾ�?��l�^���z-�G��XF'��M.|����H�4,ٟ�AY���v/��x��t����
:���n�=��\�����(�M����N�������o�,ߣ�2q\[��Կ/����O����:���	&C1�C2�����_c���ڞ�!6M��/]O�%w#�����
k�Y�i��&z(�ʢ�ۖ|au�TB��y�=
�~h��׼M���9�ԃ|��j��s��ǃ�h�� o$�� (�؀r�����;ҟ�~���&��]i�Ѿ�&�5rS����W�M��$��� �`J'JW5��9���M5�t�6�I�m)`x�!�o��R��-�`䇱�6!�����V�*o�-&$�﹟�O���e��ڠ�1V�
��O�����Хma4ݵ�{t �~����IC�ʛ�Up??V���mu��B^J%d$���H�7}雜D�F�&}53	�h�<h���~b�R/��'��NB�{����Q�A���t�&�dž�����0�m����^�JB>[��{�~����/�M#����l�^�K��
�T:��H�_�	�<��
.ׄ�Xۇ|���Nä�k��xaE!��o�w_?�C��nЗ���O˖��P6��Hw��t��^���{������K�=��՗�R�#��׃1��¸�wl�FFs��f��	y�-?�|��}\��	�Cyà�a`u`���|�l��KQ�{I"���W7�W �+�����4�� 
_ZFV�PGP׽�]�<8؛C��m����a����i��aC l�\�Ի·�i?$s~���6��m��<�m<��s�|��Ԅ�����$��>�a�=kCʻۂS�����:5�?���C�:�=Y��n��`�k��:�cj_S���X۴{�4����=�>���v�_��޻V[���������AD��F�k�g� �Q���E���!\7�ٿ���y�nc�"UsGؑf�VB;�d8��^~�� +@�kn�F�cT��Մ�8FȬ��۬[:�q��	��y��,��7A;�߿޷֧�˦M�L�Ti�{�?}��M�ggc��/�w^>�!!W>l����:�6~dcS:�Mwt:6U{�J�_�˗�dr[�d�������^
��LH|��Ѵ�����w��6r�W��l������
}�S���l�)I�_3�C���j7�%u!o5����� ^�{��A;8���j��r��mUy��];���GS�x�uj��P��>�����飉Ԩ���o��e5�@��d@z�Q72�m|K�d����@2T�J��_!C�&C5?��P,�2�h��ږ�#��$�nL��
�vy�[bn���v�s����+��h܏q�jfX�x6���Lz!��γ��^R����l��*����l�<O��V�����@Q��n�I���kaj�8=�>/+gE���]
>s�v�����m���	k !=�1//kE�!9�-I���N3��n!ͯ0M,P|n��u6���&�;��ӳ�����F��y���NK��������ɹ�ҭ�v� /�˟��U�<1]���΃�8'�R+!�H1�b1vr������K�s�TӬ���%X�ƎJ��V"H���չkh�٬iI�f�h�f(�$��n9�62O�,4&�i�=k�m��
�{��F\6!ߓ��j��g����yP"\R'��k��5�6VV;�]�z�����I����F�ϴ�s2i��֥Ym�B��گ }�t��4癬�+VX�Ivk��P�\1{A�]t�f��Y���\�v���U�tG�.
����%>�&:��]�u�H�����8=�9P���
�l�I�g�ʉ�u@���p�-)7�F��3�n�)e۷�g�f��<jz��a\}"�^�'9��ad��!f'$"�_9K��<N��L���(S�V�M�T��h�՜�Tu��w��br&�ț�j��?cb��;,��t;����Z
�I��h��@!ʂd#��\��Ϙ
�!w���[R��lXą�P,�*^�X��y�V������'	)�Aj�=�BNibD��U�MVh��	mK�,t=��^��ڞڰ�Km�ɹ�vO^`�C��N�3'��~cI�J[��]umO�ͧ�_�'ZW'gA:y�2��{y?���Ӓ�
�g�=վ�x���\+��=����8�e73(�jё���Msdd��(��r��	4R[��ꢭ}��hA�=U�T�>;�Q~�G����,���^�b�s��t�˷�s^��v�ȯ�P��Z
�ܿǯ����?�����S��اΏ|8��K
g2�*��;�WPۛ'�x�Ϯ�[/x���>���}}���q77��<,B=�7���9��C���~7�9���x���~�y��󴳹�j�'��ˇgh�<���>�s�[�{!w/��:<�87?���O�9n����$w�����0Z�4������1wC��{�[~]�b�]������:����DR��<���x:蔭���Ϟg���3X�D==��9������6tA+�q�v�����O=��S}ȗO�O-�:��ORl(s��y�@��[yn�߫�����B�*���.�{&�8��a��Fr8�C�a�8l�f������:�rX�a
��ᰜ�79������ywq��â�o�P�0��q(p�a$�#84p��ŋ߃Ѷ�����a=�u�rX�a9�{9��a��8L�0��#9Ρ��0�8�qH8l�2�ȡ�a=�uVs���=�i�ǟ��6S88�����ë���a=��9����3�g~E3������-�v>%��w��>�yzI�����d�����Z%��k��K�k��������w����������xt�y���;��9T�rގ�7�)�?����p]ڿn�/x��1��c�Q��Zy�Ffyy�K*R�����3�Q"�
�Ƒ"�
�%7kH��z�~v�����Ճ��BA�{�S{��8��� ���&�6����7���!,�o��`�M~����	�$�o8n�J��\?�����������x�X;����A�\e���'��C���]�p��G�3|?���B�A����3��}���x?��n��d�W��*�޷��7��4�|9���U�y#XD��C?#�g��A�!{~IH&�7�6���|���SA�?q��ee�
�5
��$��UѬ������e�����$�U�A.������W�Cc o`�g �L�x�5��಩P�3�r+!�U�_���.���ZpM+K9��8�!.!�p���9`|u�������_��X���N������*��$�����m,�~_���d?@�lF[��s���?���o�?҂� �)�y�o��B�^�0��E��p;��?�Kp=|���6�/���h��X�g����
a�a�RB7<���W|�N�W��Gw2�����ˠ�/cx�B��/��2�V9����*�З����ܹ����!d7�/me�����
��L�7�m�j/��p�c���h8�V��Y�Z�h�`�*^^��f��Sдx�໫Y=~�x�
��A��\�rY[k�ga!~�w��3��XZxv�ӻX�h����<	_#���0nx�҃8��������} �g^��-�{na�|b��%�������P8^b~b��|	x��;x�|r������q����n�G�6~.z��Q'>
sC���݌>"�˻m��o;�~_҄:���,���qg��'�8�~�a�S�@x�i�7����J��`��Y��P�,K�d�#����s�'���#�����5N�|x@�^V�{*{y���_��מ_:���Ox�U���}��a�q�0�u�?��J����!�"�>��z���x�p�g�� ߀�H�q��fp�F�|��G��`Ч�p����x�+���*��U������}����8���q�s���|��#>$q��C��'��m�d�"��N�1�S�W�~��&u
� �����G��x���8�6|�x��7�`m�M�s�du�p�W��`P���W'~�m2���k?2�%2�'BM�
d���@S��\yp��2�A��]�
0����:/1ى|q��3~�<�C?r��Dț�@���A�/q|/@�fH�,hf�O�w��r��5sna�@�B���<��m�a&�r?����8�9��{�#��p<;?���p�z����Gx����8�#�`��W��,n�p���8�W8��$���w���cw�=��p`�n�����6����χ�S��=�O����p���FP<��}E𔏓�0��w����ޔ:��s�N��έj��ua���绰�߅}u�u]�˝��:l�랂~��������1�9�Y
y^�f.��?�6��W�}H���#0���}��m��4T��j.j�n�A�|q4��7Я��5�̘1�,\��dee��**?��]�v��{�8p�����?������d�O=��M�ޚ���Z��5�R.^���v�ƍ��Rs��R��U`ց�"��ڵh�O���P3��࿋���vc��V*�y�)]��ȸ��[�ͩ��SU�|��g��U4C�W��g���������S�̢���gfH_Q�S5�5��]=u�<��Н����5Wk�04��]bW�!~0{�y,���5��H]�K=.�������xl����؁��]}�11�5��8�̠?�P�����d���=k�ɧ�kZ���/��O)�/��i�J��?зaw�B�)�1
�9��t��9�iޘ3�m�?�L�(�R�+����>M>aM���swk���|���>���
P�σ8���GGG���D2o�<�aÆv<^VVF^|�E�ꫯR��ȗ_~��sYѶw���ݶ���3�![޹�Nƪ\��(�E��spª-���u@�<��bE����ؗ���'����Vͼk����L�\2���-���6�;�[���|�ܼ�P.�d�� �
���Χ��៞�	iG�t��
C�!$22�L�2��Fb6�)��̙C,X@n��v�t�R�9}:Y�bY�r%Y�z5���شiy�q+�Æ)�ͱ�pEٱ*���5�G�q䍂I�|3y�`9ٷ�F*�Ej�^E�����2�R!�Qȸ�
�|R!KN($��Bf�SȜ�
Ƀo�g
Y��B�����B


HII	���C=D~�a�{�n�g������޽{�k��F��7�|��wx/�zI!�5*��ѣ�رc�ĉ������ٳ�ܹs�O>!��#�}��O?���ECC���7���
ill$��͔W��1Ƈ$B��ite ��Cc�
ؠt'S�1d�2��W�"����k�_�Y�ڟ�?�GB�)��o��+ �:%�l��!�� |9�?�p?��A�; ���_�� �i_��?��
�"�or?z(!IF�� 7��v�o	9��i0Q��nQ>�C�+��G�ƿ��-|�ǵ�H?�'Bx\Ӏ����o��A�?C�
����$h�66�|!��@�~�Н(S!���?�_�]	|M��?�jhK<�O�4�)�����ͽA.1�5U�w��C�D�(
y��P�ܠ�{��L)�i��`����TJ���]o��9�:�M"<���߯�g;��s��k^k�u�	�od�:x���G��6��W��l�+{X�(
��P�����/p)m�Bk
�wR�����'ÿ��I���+~�og����L;�������ЃG��f�+y�|�4�p�6)W[�r�/)7G��K)��!��>r�?��-��~Ïg�Y���W1�z����{�8�_�W�8�$�?��>߄�[0|�g��?��W1��?��/٬j�e2�Ìf�gs�ƍ|}�ts^5�Y""�f��`0��-��6mܨ[��rs_���l��7�
ݺyk�-��p���7
aFk���v="2�h1��&�^�Z���X�"i����)���V����x7�x�b�0X�
�����|��vC+��6Y�OթSO�.pl���HF8Ƿ>��:uzt7��|�o2��Z�A
���1�[
��^K����yԭ����~Ò둢�%n��
�n
���X"�#�J�כ6�E�-��ȮO{>�݀��Z�T��Mb
�5k0n�'�o�9�Yn�D�$���u(P���]�֩S�op^�������Ow�*P��n�U�VP�p�9����KѠ���NF�3�kU	4X#����οlajf
xĭF/�xa6:�[;�W�ͭvw�(FZ�Hw�;�lS�r��D�ES�r۶&���Vk��w�U���&+F�0ߝ�j�-�;?Q�j(������u�,��5{[M��άk��_m��kw�42#t�1�Y\��;�1u�(yY��̊ޮ��e�̚c'�ˊ�d�t�L�7��V��'y'��RJ/5�KQ.�\�y����'��n��㽤eVl��h�IY?-\�]��t(��\�äD�Qs�$>.\�PY�t��l�2%##CY�b��֭['�?�P�
��S�r��˹B~~���_���왓ʙ3g��g�*/^T~��G��ϗEnp��
�Ν;J�/����}�t~6��]tl��q��ȁn�UJmZ����J_*PFS��FǕ5t��<�>��O�`;�÷g�P��0�@���3~ïe���n��3O�3O�����0{zz��XO���ӣq@@���������Os/��5�f=���׸q����k5{��=}6m��v�
��W�6�hP#�6�P�'�����/�~Ok_x{�5�V�q?�i���Oxz�m�X�j5�W��x�Z�<yԳy�Ǫ��^OVu���֠z��7�Ju�챆5�W�g��i�T�|�A�9��_��M��7e�y�����}�}���_q�L��g(�����q�݃��`���?��,n�.��V�ɟ <��U�Y�7ڃl�_<�����W6�^�:{�'F�n��=��ـ��j��q���+�#��{����s��z�������{�\�t�O^�~�2�K�?~|�g�}6����?888@��C?���5�_�4iҐ��U�
�z8�О~�����xM;v�����S:t�6���ɓ��o�u��8�~[TT��zz�����ܹsJXXXE�~2RWQ�\ �Z�g��T��kS\\��8����1���
��:th�/���ݻi˖-���͛��Ν������K�����s|�a��Y�f�M�&s�>}���			����>�W7��ſnݺmfϞ=�g��<�f�ƽ_��]�F�ˤ5lذ�0�…������={�o�x�|�|��):v�8M�s�#��s����bֻ[<f�o��FW�^�v��-�}��I��W��t��֎qH����rv�/;h�2��K:�g�]i��qvv����G�?���,G_։�a׮]��ѣG�N�>-΁#l�mXE�m@8Bn��|��Ȑ� ���O����o�q�m������͛�aH�PPP�1:�ꫯh�֭�2'Ι�
�����.:p/((�r���4�@�`'�p�Q�Q"��Dm?'
���'Q�<�~����ݸy��m��=1��}���F���>��%�!h��9�
z �ϐ��'D�g���������#��Q�~��{�:|IԦ�i�'j�44���C���D�o㩊��Ͼ�ف��R�?����/ϟ �v��t��X� z�i�?Lt�6ѐ}D�۝��
��/�@��i�Ɨuah`9���=����������k6�Poƿ�1���D!�k'���M���B�F۴�0+�?�������]e"�|�,�W�
Ilz��]�#����D�����*
]�u�J�!�m��."���?��ƍ�c9����[J��^�~�����8�}�:�6
�%�`™��KT��3�%e�믿Ǚ4�.�(M&��q��-ڷe��d�%�
�pT�@b��D�}G�Q$h�F�g֙`iϟ����d�j�-��6����N,�g9�m۶�/���z�J�z�J���=:��zzoB0e��B�&��^�����>'�z2Nݿ��3h��|����|��ͪo�6�4�}}}���1q��"HY�p.i��(��d�L�&t!Ӱ�i@�f��"�П��iϠA�3|R�Ϙ�5
��-l�b��Kß�����T�C�9I��4 ��[�~r�T#�֙����LC�X���D/_d���?��3|���]{
ҞA��g�$��b�_\�!�p���AvW:J�Iڦ)i�N��jgz?�i߅n\�@�Si�2
�3
:{�h�l,T}R�Wj|�>�)��pk�~I����v��r�2��/��
�y$-��V�e��x���Ô��1�#�a����Löţ��*�l~`:�X&AҞ����񇿐�ߩS�&���W�
܀������M�*�6��ӂhӰ!��N�L��՞��>)-�HsG�ѬXMj�)��4g�:qx��A�c��r���g/��I�G��a�[�>^�#��F�dzB�#�a3Ӱ~2��{
6���
�A��0�9�ib���4��N���'��?|b��իW��n'�E��eR��ܹs���M;�w�mS���uL��=�'e��ecBhQ��ćҼ�F��4��4Lc&3
h�9�?
K�?��uA�?���믓���T�I`����]3:PӰ�i��4�'I{Ng�����Jo1
�L�L�?Y��Ƙ��IF]���b��K��ܹs��f͚����h�s�6�޹�>�k�Ӄh�f�ku��B�a�FÿX�RGiv�J��18>��켈�_(l� s��i}���������G�@rr��A�_��	��)�5Vi�p~�3ǀ=��ٳK+7���}���!z���E�\f���4~�x'
��Q�L���'W����R�LY��4����;�iӦd�Zi�ʕ�����Hcǎ��s�
����o��A.T-���
��Q��`�{V��ۿ�z#s�Ӟe��X��l��۶m�8��Ŀe˖�?x���G�l6��ݛ�}�Yz��7i�…�`����4  NH:��
��C�B̑?�L���7i���ws��j�{�OZ�	��
�9�ú���v6lp�
_���$b� ����C��|���\!#�WR���u�:�����r���.������VDy:v�`���bsk�L)))E
6�f͚�����w� �+-��)96|�W�^�m������&���P:��F�y�F!˻��-�3f\KKK�iӦ�0`�9R�וB�@�t7��J� ����Ѱ�G`��#Av�����z<����'$$�|��~��?���iIC���i„	B�roG�|������G�l��j������}�����KS�N=;�X,4i�$!����¨���{�4��k1���{�#t��u9�g_�F��_�~�<�!�&:t	��xa�yܸq�~M&���R�V��p0�t��[�6�z��?����r[E��{n���}��3`�}����!ۇ�!::�z��)tkŊ�<�g�
;�����M�?ȵa��ƅf��qfxxx���m���E�Z�ZQ�1�>��|E�z��l�s<U,��M�oB��c	#��G�S���k�RNN���|���OE��^�9�q����TԺGE�7"C�����s����Ͳ��\"..N�V�u��k��Ra�K�z�'��!|Ƹ��x���
8�U*�����uX��
tA�`3g�$�Y"N�p�0�3�Eh���Ё;�Z�|9��+U�t��;�?�{h�~�4:�o� ��b��B�-eO_���u�=t	<�
-������>�5ƺ҂#��_|�Ez��~�.;�.A�q��e}���e�����cO*�1t�~��:�#=��ƍiɒ%B��
��n�7��	��Y?`��^�ʕ�ܝ���>���6��===]��.�ڀ/t��H�9?]������ۗ���3�<Z䞧��A6�r�59���Ԡ@p�9�ϔ��~�G��ʓ	�{�?8G]��㧟~*�.x{����㊇���_���~¹�;����A�;�c�9�{�A��B8�χ���5��k0�w�?t�<=/K�������G�s�PIJB\�|ȸ�����=<���R
�&�V���	N)��z�O�XY;�iG�!�\��͛���S�#�G7�XY;VՎ����v4h�)ڑԣ�%��<@��=U�^E)'W�~�Ϲ�tY/��������7�c�%&&�/�f��x��!�~R��)���h������QSx�c��&:tU�R��~�*U:��n4�t1��7���~�G�KG9?�qn;�s`���5w_�7.=��ɰ�:_gm/��5�=?��?�3��<g���.�5���Z�;�k�s�o~��Q3E�u.�W�'��؃׉�^�P��~zڴi�,�ȝ�~@|�_G,��F.�<��m`��z!j<�wbO��ɣ�v����5h<���=ֹ�y4x"�<ț�
����zje믔�uQ�]v�1����g�įK��{ӣ�>f����%"��n����+���#�C�3��`I��BL�k4�Q��0 ��g��8���`����qA�{��&��ZkC���j����-��#��z?~�����n����:'�$����}D�����~���>�j5�Pc�>���9?�}�Ե�\�r��D�xu?���4��8@�\�Ѡ�L�h��R���:)z���Qz<07�G4�۰�����7��pϚ�߈�0.]���6����WL�81~ʔ)��W�}�
��5ek�>ԙ�
}D�	���Z}i� �/�+p���n��u~�Z�k
��9� �]�aO{�R�/��
j�ƥ�?ypW1W7�>v������͞=;��wމ�-b���t�����n�z�U���r���@}�”��hz�ڭ^�a[���j<���>�u�v�	|xq���VQ'��t����Bg�3���dS4Є>�/r?�KI���3�!r~}�E_���U3*�����V7�qH�j�������̙���F�6�|x�u�|nx��G����mΫwm�4}��Z��9��I��gΜ>̛7O�=�]�>���]����OgХ3��&\�q��Y++o~��s`O<��mѹ��Z���,>I�CW�������c�����0}��ǯ$珊�:m0ľ+jӱ����o��p��@�J���Vt���A[�ųRm���'�ųlj��BBBڄ��N��ɣ^y��iĈb855U�]ȵx�#�/�m?\c2���n����l��9�{�D�G]�%γh����]e#�|����s������9���Z"��#""�+p=z��;����H�{�R8N�9r�P��DΑ��n��ﵦ�����
�)j<أ���@}�㲳^�K=�ψ�#Ǫߘ���X�y}~IQ�q��%��1r;�{��A쥣���� ���~>x�رc�R�����s�FgddD�57��J���ԫW/�����!�����%�]�6CQ�
i���L�>}8�Þ<b>|j/��1�.p/x �x�/�����ix�>�v�ﺇ�ߓ@<3f��
xVU�+B^�5�O.,,\u�s��1��K�C�k֬�e˖��b�F�9ɚ��-��<2�B�@��a{�.	�c�q`�iӦM�9���IE�@�g� ���\��%��lE�?yІߚ�?`�}�˿��n{�N����-��~����NQ��W��w��e���Ы�k����˗���l7�G��r���Z����q8�y�QYYY�{����̈�������B�2�A�lӇ���ܹ���x�S��a�XC_sx
��1�9(��Kψ�6Ix��F'�iS�e��5���ִ��D~� c.ؚ\�s��K�x��?���7�7�����}��m+(m����NX?b����*��VZ�x�֊59p��c��#D�s��`K��c`-���~X�a���N�0ȩ�7��0��{�C�.�R�t���5�9!�gP��.�-�{��k"��z���l1����^un�0��T~mL�"֓�ݑ�c݀���nb�gO�f�,]�T�xFu5��⚋�ݙ+�Ƀ�97���q\~59<? c)ښ��p�P�k�Ɗ��K�C��롧�e�~�O�!��l�vZ7�粤����A�o߾]�j�y�m�\���|F,��?���$a,�Ȉx�uƆ_��?E?
�1x�ZhB��~`��F����/��\�at�TֺRN��T�z-|�TU����۞��57�q���Uo�ƛ��
����G��@�;�MkU�;��{����oY��G'&�Ľ2r�wR���.����wJ4,&.:�e\�1�G
�rШ�Nщq�Ʒ�������(�
e�֭}C����<v̸D�*+8Z�!c�;v�v�ߌ�=�g��gL�ؑ1Cc���Ó��g����#���Ĉ��FČ�k�?6��wH���ߐ�2��NP��%p
p����!}�}�fsD�n��k�<x��a��w��픭ȦdV���?Sqw���#�E����2<2�2�2�g�����1+cQ���G2�2�3��<lx�m�{z��e�g����ڜ��U��7�H֩���+Y�Y������a�����A�P{w{{��a�{�=�>�>߾Ȟn_mϵo����{�G���v�Q����px;��� G��������e�0G�#ɑ���X�Hw�v�:6;����#�S�"�G�Cɮ���������={s����l�������9�r�sV�����0-}ܔ�|H�%�Rl�l�m�l�ն\�f[����ٮ؊��3=2�3�23�2�>��9,3!3)3%��,��g��k�PKEePQR�(g?��pip/_vendor/distlib/util.py�}}�6��l�9R�L;��[�M]w�kb������.KK�͚"��K_��?��x�$���ӯu$���`0������c�_ߴA�7^�z����d��c{S��iu�ާu|[-�i��UC��,�������C��4�;:<;9������)>�r�l^�m0��٤ٸ��|/�l���@��fYW�l����/Փ掫^ե��ӏ�	�v��Y<�䷟���ߋ�:/��Ϫ���ɤ���BaP�oM5��ڍ�~���#7�F�0��mp@O�뺪w�`3���,�
�
:r��T
���*;���y]M�F��<��mZ_i��ln�~h��t������Y:�^>;9���1Q ��<�@>�6x,bY��ڧaT�k�i��BQ��'i�Y3�.�a��,ڼuz���|��S*{p4$��$��d	��4բ��E]T�/?U9|�i�9`5fE=��W?�����۳���EV���&۫ʫ�zQ�mO��"V�fe�ʷi^b�	U��u��>���A��Ͽ��W
L	�=���E�r��`cY8���/��Y���EIR��,I��&L��Py���k�xbc8�sq�|��Pv��ó�o�Op��b.Du�C4>�?��.^Λ�`��Ӄ��de�/�J{G�ߜ�'G�n��G_���?�����~�㓋������w�'�ZXm�k���k�����U{޼�K��Ű��/���o��0��!����޾](:?��;�w��d����b�����o�����ݿ����?~���?����Ͽ8�_ ����4���ʒYZ�€�?	O���gϞѿ�X0H.p�u�.�^Ms��i�H�����*�ü�Cœ@������E!+��c<��φ���yF-=���UU�,)�ڬ��eZ�D/	^�F��:�A�à��6q�Fb.ʦP; �8 }��2c	+B
�Z(�0e�:-�!a�Jp�} Sw��yzYd ���X54�Ag1P%���tÁ�� ˡ�u@b!��3�*>&�fO<K�ɍW�ˡ�]C0%E�g�u]-�M4�\XE�D�}<��r
v��Y�H���T�{�>HjEᢄ��E�	Ђ�* Q4�Mf��h�a�
|$`x���Y��AyI2X���y�
�S!?��y�N���0��{�k�ӳm�������{-�xDq��fQ��T韏��b����S2���n;�����yC#nC�z@P?�t>G��>���#�m3���d�h�t�h�|3��$�\����51bz��/E������<�ga�*Q�nC�Y�Xh*z*{h0z�ў
B�,A�w��۝G��6�CK
H�"��F�+no�ٰ�/Nw��չZ�&��Q��C�b��c`�-��O���z�� ),7Y�7+xp5���`X�}]�V��I3��J9[=e�OW����K׹~����:%��/a5w-X:�	|%†5}����'�z:�{y�o,�ɡ�/HDP�_�й�������8���c!HnΦ��hm���>Z��_P��.�����Y���4��Sw+`����
��iX�'����`�
H��<DBh����iܠ���@�h���->��2�s>ƺ�k���(�
܃2����o�L� �<��LpyƳ�QHսg���MK�|2wn��:mw�,��wYݐ�o,�\z��+���z��U����c)>vְb�%��^��6ւ�_h��#J��벤���+*�ao����,��[$㷆~�}hzD���YG�A�FjO���I5����q�3�=]bL��!�=���U��)y�+��Aކ(�>��^�?���{W�%�4��B��ۯ��4��IA�E4}A��y�,@���8�?���N�aЀ|�Ο�im�"9/s0'��4�i�r^m��y��WC���g;����ʚ2����}���tdx�kB]���^��T�b�ij`d��ݐ��g�7(Q7�XM��m\fmQMk
�A��*��+�t��`���:k)�#����#��+��Q�o�
���<��s���y��+��#2�k��4G_�tHx�|��j�K�q���SG[����?�3�Ss���a9V/z| �Y���L�6~/1���z��#�F��,9�j���l��)D�Q�+Z����`	�?HUA�ΒO��M�P�]E���"VO�؃�
�A3����/�k�f�гe����-�����Iz���e�ў�]>�w`*���Wu�����u����b��ސ�2?-����#���!,�Eu���r1�Ɲ	-�/�	j����ذ��XV�㌖��D��2����p�u`�B�L�"�
T�OęY�g��O�7��/�˽�"�I�tz��ie=�m��Z�b��%=
�1
q��x�5���/�۹3�ϰd�a5���7E����5��Q�]��z�B�s�p�i볰u��+�k$��I���}z>o�H���q�~���;��w��B�bEP΢A�:�l�����F�HM`??2�G�`��4�}���n�#E@�qDK�L����C���
��М;�ط�:XE��FT���T��ӓ)�yڂI0񫱣]�)��3�MS@���j�l����d�Obio���Ȣ��q����PFh[�|��ę�vuit�a���\iؖ>Qh@�и�J~�M(���m��L��e�`\���*R9�"}G�y��k�(�%Ƴ�Au�!��I�)�����!Y��7�Y]�g
1��U5 a��M�o��"���=��H��u��Ԑ�E�f���]Ɓ e[?������C�;i�1���<2�𧬍�+v�:*��I֧���~�k��V�ll��$�h�%B��S]F� ���KPʻH�,P�&m��5���R�C�S�.��E
��.@�6�ػB��#}7I!�����Añ���5t����V��I���C6Y����ܤP�$9����O޽�p��v�$I`�)'�ks��G�s,����,��?!m��&��a��ٴ�ˠH��4fY��)�d�]��qT��(zmX]�N���S�\���"��4���2$���C��������UI��@{?��t��xd�f���98Fq9p٘�Gf}c�"orX@q�"��BA��[I���B����i5��C��'0�5��$�r�R�U
��h�0\�~�|7d�H�h�-ef]�ϼ���L9E���kY*�4�XàK��Cq2v���ש�V���5A����$�Pt���ҙ&mr���f��=$�D���b�!�3P���)X7��-�P(���.�O}� cx�BxJ_|���@h��*P;0�9Kg]W��:�qU���(��Ъ�=EL#�R���x�~&-�ѽ�j��u{����@6�� �`UmQ¥�ߧG���
8���tr�b�Ȯ��#RLB�|@-G�"X16!(����w*�??	_c�b��P�q��JR�Ëq8'�|,ȉO�WCY"�qH�C�c9$q�f�&�b0��N�*���WaE���5=��.#�!�	=�Y�B?�NC���ȍo����jrVD��]�_@	�n��a�3��|�V~M��`X��RU��!U@u$�h5���3ʮ�%�_�U�
~Ll݅��ZO�R�,���$��y�H�|��-�>�`���2M�
^��*bP0
�c���j,Cw��z5�0L�,�R2I�W$�Q��b�	`��Po�4�kU-����o���i�8Yq崅�1�o����wJ�-�W
cj�G���b�]b��#PQ3��T����N��N��v�@ѭii��)�����b56%��敕\��us�X�7�����C�UG��WEz�Qc$��7���>ZUk���Y�2��0�7r�b�Ndm|�B���YZ�`H'≬i^K��S�|J+��N�O�=�Y1���
x`����I���Y�N+�� S���~��8�*|�!/e)?F�8�[�,|Z.�Cbh��U9mF�>�„�R��P}ey��l����E/�{5)@��)*�s�k�Qu��+�9�.i��I�=�EmB������t�2���TDˏj!�&ɬ�.
�kZM�!����Y�:Tv5�$��!��I�"\������1���!l�m^lF]�P�00��$XC�Բ*K8��&��x
)I�n\ V�.�����%���?t�G9PE�B(߄�QD�p���P�UM�4Z�耹�س��D�P�ۭ�#�X�9h����x[���Q�k>\PT<��,jtY����R��N֪����ܭBMҊ�
]�ͤ�A5�A�e�,��`}(A�7�#�����t�
b��]E5I�����e
Gg�=�O�#�xx-�I|4
�	n��=ifH!<<�m��M��)2Dqx�=�A�[~L~$J�����\ݠ{�|/��E�V�P��V��e�׶�5�u2zF\�B��vP�l�b�f�`
S\��z����	-"
T4`/�l���Z�.�큢Q+�N*T�|�3fo�
lZ6!U�
�a��~A;��ge�D�J�<��zQ��MA'�e�x��>3_�u���)ɖV��%7�����.b��X�n�_PB�Z,p�$�y�i�o(�$PJZ
3��C�I��2X:�w�Xf��j�{�UCe�~'.O\�lQ�5S�,a�s�4�'�k�4r���v��_jk�b`�s	��`6����P�@ر'�\*�VC:S�J��сL�p���e���U1>���h?��c�@?��E����,�cXR<��l�2P�1��Ф��aՊ�H�FJ��#�	R�vY��e�� e9jN����=y]y���6&�*�3b�-���� zF;L����&H(G�|d� 9i-m;q����,xh��#�`�i%|���P_�P�L���(�j�(<%4Y���}+P6�Yu#l؜9��V�+>G��0-m�׏[(���`ѝ���ƍ�41���.)�Q�G	�d�O F#9
l�9�Ű�8�;�����\�b��Y��D=]��˛"/o�=Q/���9G�̰����S��Z�!� �ܓ74�O�U�:�^iMه��6��u�ʎ�_!.ȓPB1t��!����(H�BB�w���@_>T9���[K�4�Ԙ:+'&	�M�!2�J���珳���la�&_���5`��3�D�*�5<~O�A��l@�Fc��m�=��Sd�����1�4�������3L�R�zHnX[}Z���<m4��o�I��J�u�H���a�i��d�r�\	���G��R��R�3�S�6�\w�b��E���"��茐M]��Y����U
�c��|b�߼j�U�H�Sz���O��EvL'Պ�!j�Q���MGl!80Ƌ�lG�mgwv'�c��	.�]��YH~t��B	PD �������I�XsD�#��U|�+�a����†da�8
�?>�<}�:R��Xc�_$�"�]Na����قwv��>�l�T�A�6��F��ұ�<s

�X�
1�6{��z5��ыLy
6��b������5
Ur֯Ba�{Oo-g?�hv�My�y
Yݠ�Yz�� =d
#]�T����3��������q7i�~T�J�J�A>��d�ҊR�س�
�n1���*��:+�ְ1C�b�W����'�4O�Eo�{��b�'�Q�ZҘ
���f����kgQ��3��a��]�<X�'Z�� l)�6;u�$CB��v�c�x���w��$oߜ�5Z��I��o��3$�o�xa�3 (�B�@�U��f2T�b�l��jŴ�K�ZtV��,���h�].����"[Sy�q�)H�n6�f�X�V�{Z���J.QF�:���@�+�zU���8�Y�CTj
�A2C�0˩�����q�����L���<0�3q�Ș�G5wr.@�މ��+L+{�9C�ޭm
�Q���u
����}�͍��hTM�0l/Y�E�:�|J�$�܈���ă�yk;�u?���eЬD��0`�ؕt<�qmnE�e�*��i,���Cw�B�rί�]n��X9i���#O�z`q�U���f�e9l�\n�Qt�q.ae��[�m��P�yVߤs:�aUO��#�Y	&�EhV�:�h��Oާ�,�a�YZ��>0��Z�	�
�>�F�`
e�thJ^j��1����7��-�L�jQ�(��hE���H��>v�B�M��8#�ƃ�z9��ϫ4/���-ԥ�-�P��>��2����&���ؕ ��=�(
D��x5�j��.������&������q=g]"�j�i@fY�`�
�8�Pd$@��vxpdG�
!��Ł��b3�K��c�yWr����),nզ$��}���8H�rވ,<��]/�a#+��^�譑�m��v0$�e)�����	[.v �����q'u6�E��i�5���E��K���%�3�	�s�n�G�x��>���`䁻Hh��Tb�3����UO\�P�4^1
���L"��+jI���[�J��]W��7IМL�
�'0���N�'9q-�a�����/��_�[�ˋ�˾��͋��U&�P�ƈ�^���y|��^,���Em�������}
�|?��|�P�u/�~�����~�I�e/�l[�8� 	7��1n���v�/�@�����!-:ts���reF�����y��*���9)���q�	�T;!'�c�o�-�B������ࣞ��L�E	k�nh��d���T�����$�;�;����W}[~�T�����ɕV��\A���U�(i^�ֻ=��8�:��ZVwtU�+�P�_�}zA�a8�p���D,S�z�'��^ұ;��o�J�KD9������G�#=���>�&8��sa��S�C<Л�p�8�Јpf*�0�r4!>>�VD^���q��
c�H(���@����2�[^N�{0K�ػ��7�����
"�d�w>L�!����o�Ō#�,@��6�lr��I�yG�)��$IĎ�N�ε+��K�������:l��J�]K["TOv>�4���x�G��I��D�E�ZíD針6Bm�2�s	�E_�V)̂�V�q����C~��	��;���T����o;�-o:�:�C�Ьg���t$�]Z7Q�'�~+�NC�
��k�{���|�`Չ!_Պ�
�uO���
)t!K)�~��P)d�/��OK�0���$)���X"1
`���Y��hhV�yI���z	5����Q�/���~D�7�oD4��BE�I�.�6�Ӿ&ɝ@�Ko3t ���Ψ���&���G�|x(	�s:�䀡SF�j�S�{ȥ8�����Bf*!�(�P�
���x[�
eʼn���M�VbuQ
檲�����pfV��R�e�+���^���hr(-�+`���`O��p36=f��GPN~�Q��i����D"3��/���V(��yu�	G�Ohg��9B�y����ALX�\�3���u_ȐM�Ƅa����%��;Uy&��À��e鐹���P��r�)x	E_gy ���(\>�b���/���۞��
���[i��07�`��Hn�bN(옲�����W$����	�?G�}�k�U}�dr��ߖ����Gqu;Yv�#͵:%Y�m�
�U͉˜"�H�g�K5'k�G��JJiڡ�b,Y`�<��/G�b�z����GK�-�]qZ�����Ҩ��n#�3��$ӆ�#���Wj����F���?�~�p��iU���'G���w��y���9�&��L�D�ӭ�w��+�x����\��//[�����,�6�����ѡ�:ܚ?F�������=Rğ�< �/��]/��	���A+�3�P���i�Ru)��*P��'MX ��Z��|�S�]pY�md{�Đ����ӠR�+�$�t���r"j~ٲ�=D���p�_ǻ3�Έ���_t&m�0T���et��#Q53�q�ɞ㬙��̩Q���00��?%��R��Mם�9.9y�:ٿ�n0ut�w���YY��+�����@Gƚ���S�HXd'|2��@jͰ�lSR@��6����X���:{�Ax�|��KR9$���o�,�q��k�b��y3���?�}	�c��.2d4����)�1�e0%��.���'m�Y�T\����[|���1�8f���B;�E�]<u8�ТJ.�R
� ��� z��׻<���98�iJ�ljJ��ܤ�`�y�{��
�bK$���e����ysR������$}�ҥ#����/t_.f�*YC[���a���Z
��]��x��8ۋ
�(��
���"�(����Grc9|�n��:�ZRks�'>��[�;�(���s�`�΋-;$lQ�K�����P���V���jR����I����w��RYf��A$E]P^p�Oľ��o��@ī@�qiF'Ȍ�r��i��E	^J�^��Q�,,-��fc%hX���`FW	KWƐ,��$T��Ah&���E�H�O���>�����8�6�!!3�҂6����iA��&���5ֹ-'�&�K���L1�ݸ�spi�v��E0c�5�!/ۭ3�Bͽ�v�5>�c�l�oc�$����]
U�(�v3�u�R8H&�2��Q��DR؀i"��pI�*��d=�F��I�j���t٢�
#����fh�$�:��-�W��I��4>H�� ��0ȼ6����?O�8����fw{����0ݚ�TG`{�8Ϸ�ր)�[Y��Ѥ���ϛm�O��
dL궘�y}��"�(�2�zp��
���3���8B���f�J_���Ko=oVt���;{D��G�a�{Ì��t%.��@�@Ͽ�X�ʒ�ьy� �R��@$%`VEũ�!�JH�R�1�|p�Z����ڗ�FEYO���9Po"��&w���"t�b���M��y�J�>�ƜP�Yt���A��mXe �k�P�+u�
b��`��"��Rl'�'n�v������Əu�}�L��!)�ѝ�f
_�����uT�����wzw�R��g�T�#�u~�qA���ѓo���ų��
����;��In݆�[c��Ɏ}�]1U�K�PK�a���I���|ih*X��R�ڛ;��9[�� P��k',�@U�ck��{�ҍ�j�Gd2���G
��Ïq������oC��0�!��TE"FX+�E�a֘��ЯGLS���t0_\¸�l7�KLds)��{-�!��8�Dկ��UUe��mwE�«�9������=�g�.�+D�fWWZa�l�+h����)j���݂{��
�a���C	#h��4�{7��
''�yN��[a����)-�&yN'��
�+,i���R��)y�X'��ɘ�P^WԜ�q�b���|�HJ������7���Z焉�WdW�QW�=l�é'�~���Y���W
��,!<�4,��Q;%0�e1�R�zI�z�M�}/���3�-�tE��uidA�p��p��6�ҕ��T:�%�UpO40T�&���qxDN����1��}�
p�}R<g57���8.cJE��+�O.����T�Iǭ2�ی���?.NV3Ln�6{�ͺ��JO;�
���c�	'O^�<ks+~���J��*G=L�D����;+�@��TQ��x�O��9�g���宕N���!�8�z���>o���{�1A&W6c,-sSbc38e�Fl��]c�BA:�����9:��S�ஜ�E	fJ#}���z��9�"���P���<π�ld�!�.y@�v�A�L���9N6�4S,�p�ZkP���Hk��Bw�o��8��$��8�T�,�|\��&��;�2Q�I���5�6�*�g��q��Ʉ�#i�S"�p���;��0�
��Ʒ����mlӣ�#>��L��<:d>�[�,�R�FXf�S`�j݃�wH�%Z�j"=*ړQu����P`
s4�D׉�e��e��e�����U�y�"�ֲ�A��.nmo@��EjD��}Q��w^��J�A�˰g�P��d8�s.��W7*�ǝ���B1`<���;
�b$�l�JH��R2��T���e��Pޖ�})uc��T�h�ie>i2O�J,�&T>��,1�4qM>�g[Z�|�7��B�uM�Tx����I^Yܒ�z^��Tt#�O�î�zGO}���IV
�fVqS$+���=Չ*�-^A$rK�)���,��.W�X/W��$�d����ܲ$v^VNڰN��5C��WŏG���ɴ�<��P�Ko��3'�F�rN<6m]��	п��0X��&n�noC7���|�M�4���m��}��?�����p8U<J`xO5���
VA�"\�Y\N���N!�V�~=f�b�hc��=�-������Y�^���\)��!ꑥ�pƋ$sJ��-3���z����f���i��������gJط��~�W�~��,�����]?��r�>UK�9����TY<J��f��h0`Ʈ�խb����WWV8Q$)�rlU�&�
���U�ܻ���'BM�Q����3����̇C�S��'�Iپ��F��L��F.w3�l�.09�5�5Ճ�to��g��q�;���(G��u�l;�"ju�:+)�N�������y��#�,)#?���b$�#*~�yZ�KY���vk��vu�G�y�u�AV�j��_��I��k����H��d�BDoWNc�w��g��pZ9�a��$�漎�5�%��Q�����抷�"���R30Y���/��k��K�^��0�4�}��o��z��e����C�q�9%p2����9eT�?�?ßK�sS`l֛�����'�?�?�P�SL�P:������?����_�����R��%�m�Pԅ@4�ĿI?�7����P�&'2�I�/���ލ���|��w$1O�Ѯ7I?wc�s��?s�\ܒ�i�v>�P�%�|�f��E�b�\P#�[[��5�n �V<�+� ��0j�|!��:OÃ�g��d�iw�'<#���[a��Ku&z�
�Χ�o?\|k��F�zW�^�j:\.m�I�n�<�[���V���7�E/[��7�1[�Cw�8e$���A�\������D�>8v{O�w��f$�ґ]�!�몼�N���1���j�
:`I��n�����Vz�/�Q7V���"
�w���Mw���ʙ]��ϯ>��;��	-��+�����Z���ծt� ͋�!����{ff�w�8a��ŠTS������&�C��Ź���"K��>�T�a$m�ZP0_-)FX\aDأ �n:h������d�7��˗!�-c�f�T?{�7�� <��J@������N�Ɲ�}`)Na,���8xe�}QzP
�N�����>�i���E	1'��J�Z�7�%�<����W�Y˯N��t=����"��>-n�.���I�}�(
;��2�����c�ٮ�NN�o��.��,��#&�py�w�=EP��q\�5*��XG��;����5�g�q��������B,* i>~wx�ð7�tF|G;�,�����qw=���HP�O�	��tx&�0Ń�B)�����4��8f��eE:o�ݎ�b������� 7v�;�ͮg�D�?�2��N.�u�[!�eF��D�atޛ��"@[�hZ�¦�ڦI9�)�Z�2�]:�Sr�����/��v9�����Uak_�p��'�>8�\��F[���[g��N!׺�J�l1�ɰ�m��gaE,�ԱJO�o�J��D~�j�5�B\�0y���k��W7��K���NwP
�w�A7�[j���@QW����O������-�r UXwJ�xIơ0�ʟ&�"�g�'�M�n���}����]��#�&ѶkJ?��iV��ڥ��ѶK ���i�+������>?���\ӅU�����2��ٛ��J%���w�	�R�
�b�u�\4�O/���	�{tq�Ҡk��V�Dj��.�f����tىo�=_k�4~�����v�|����jڕ�Z(�j��;@��%NY	���OӚj��m�eε�>z��:��u�D���v��Ԕ9yZI�r�s2��Q����:�E�m�~:Ί� ǚ����R�E$���Eu��<9�{��������_���]���{2������'��H�U��}~>�����_�?�����3h�t�̮���_.^����/��T*��p'�^��:�B�J�Ǘ�WT&����$����!�y�>�-�R�y�(3=�m�/n�	B"x^�B��O�Уg/^<f�M�JF����6�߅�����p��
����������)�-|:z�=\b���Tp>�I�C�V��vc����g�Č�e�W���C�]U�C��ֲ�0%�i���/W�=a��~A�P����C8*��/���}�;A�)����.q�D��C��N{F�m4�g݆u���4����HI��ȳ$p�
���x���B���W�P	��='�.l]Q|�N<^��U\2�"<�眝"Oj�v����έ�a7�	�����}�af�*76p}mD��Q%9���Do�ΎO��z�|�6��-}�>�MՐ�sI�=�ǜ`���\�ܞ
�\�e5��l�IW�٦��ᴚ��W>�P��:E~[�5�L�d�q�yR�e\K�"�e
;������y�ݕȞZFJ�}�*�"�)y�eSz�)M�/a�W���
�Y�r�{�0U%�4E
�? �8A����c%3�� �w��E��m��ͤ0i��Y`m+T�3���/ �EVd�p�ʻ��E����w�n��%�|�u�༑:��g;�J��#�K7E��rJ��pp���S��/�ã�����u:Ox�"�G�m�W7���~�ϴeh�Է�e&�b{|rtv�w�.�a�{���C12�b�r��1W2vly�t�)�m����1��1��b\Q�V��s�-�f?��[cU��M*�wco��۩���L�����Gy����tB��I�h�"�ˆ^�T	��oN��Ã%b�$�8�P�](����));�NK�(����H_<._!~̅5R����5�I����Oo���k�TdFY@)�K�z�Ҡh��Χ�}�����`�o�v�G��h�0�Ƞqt��D����9�n^ȁ˹}�?6��<�e.�O�T+�B���4�siEO0%�\���g�G��CJ0I	��R�A�+t�@@U�1��1x��霣ÍF5�a��Urb��c�t�.uЉqOgL�D����8���S�4��_f7)�T��
��h��1�XxHv�JVr���+./.��`��t�P�g|ﳰ(%��C٤W���Ra���;(���KIҩPT�.���#�C�j��MUa���:�vUI��;���V���\���`9m*z˛�™)��?8i(�u_̙�H1��$�c��9�n20S{a����	L+��F�P�oX0?RE6�K1`��0�VS���`��-��L�,���A����>!�Ӣ�s�Ǿ�W3�d�&�
��)��F��
f�䚘$�D9��1���7��F�>-�ʭ��lK|�O����(B>�e%E��]��)%觤Gxva`(�b#25�۳��dt
�G@0���脉�ECD'�/J��ɤ*LM�E~:%Fh⢰�j��T�FlP�շ
�/o`�)���XK��[(�.y1%�P�4�&����Z�[�t�Am�=ZɅ��h�Z+.Rf�df���ȂG(��w�	R��)�dQ���[�v;^�����ur�'rH�9L>Tb)�*�QV��/ȑ���a��o���rmg��6�_Ehm���7dj����	fY
��F�v�m��|�{�^Y8פ�1��E�U@���(*?��G�����#�?�8��G��9�1|=̊z>A��g��

Vū(u_�Fz������M���[m蠵`\�tS7FZ�7� ��>�/���V,E&2��esI~-%�Q4�]Y�T��ܬ�\:�m��x�p!��K�졙�wvZ�
:���˞H�W�mR����:�_TR�ϗ��̶ÙLg���=��4T^��,�q�H𲶋EzD�;���밺1�Bd�X�o�ݑӫ^���+���݋�=ɭ���?kM+.���T�cT7���=�ڋ:�.\��߸$��S��T꺵�7��[<㳆�!&�L��΋�c�m��D����K����80�0�o�B�x���&����2)믠[�������,l'�!N֘�������-Mh����)�B��JXųk��HC�kXm�;�����Gݹ�2kSL>_07i�DY4M�vC�2�?�V��!o�̉;�҂UdQ��n�Դ'�{G'���g�R�C3��_�|��a{�Ug��_��f��2����
��:y���z:0�K�^YKt�t��
s���{
u�U��)z���4�J����|��i-Ȼ�z��e8>�}�Nr(�Yi)RM�Ӭ�g��-�%'3e_(I_����2�p�j��Ϩ�u*nHW��	�(�ԛ�X��ab�]������x�y�M�P<e~���3<��&���B�mʼ����B��<�3��"�	�G����.L���������NvIߤ�bd���1�QkԽ���`]ET6ߟ��x$��k��	W�;! ����uf�*u��;�#Ҡ!��'�޸�;_�MJ�"�
u@�����K��9h%.��a:��V�
�d�(��:B��9%���}熼7qcO�&n��́�Ք9r�@yէ�x�������19�c�1��սt)U�V��:�U�r��w��<TP��=�)N�`9���A:�Q�h+z %XA�4�W��Bd"��GŘkeh�L �rSZń�յ��ӵ9v��.8�V�y9������&��D��,#",��	��t:W��R�87H��4Ҙl"��t����e/�ND����QA�&S�	_�VƏ�t5��t�wK�^va[~NC8B~yF�w�dQ�.6�'���[c�e\�Kc|{���Lf������E�2+O>�p{�{6�����9M,ROd��@����=F�7��c��ɽҀ�s�]�4-�pG����4������ȩN�e�=q��шL�QbF�C5�.ƠK~���	��j�+7
���IB7��}������MI�eBJ��CLd�}��n��P -��Q�٣O�Ц��\�Ц�Ă�,_^-��*(��/��+���ni�Xt��v�?{�L^:��Jr
�w����m5��X�dv��H/�Ȇ�����+�/��B�%U�ޓ�9T6�H.��#{e)��DW����ť�Vuɵ�*/�Rd��2���v!��5&��L�Et��%/�9w��:+#�L���o�kupx���	M�>�J&�z3��x-����A��PtO�"H�,'CZ�*���A�_un*J�B:Ow��<<wD�G*��:Г(]�A
U�#�NɎ�z2\5�N"#�y]��{p���`�N�^�+�h��Q�����|;J�tX���8��Vq�iu��Es���6�����D]�����'���J�DA_��$7�04I�I�˃��h�ө�Y��W��� _�}�g�
SG�j2��N�.>�0!є�!�Iվ���v�^���;Ç/���y|��F��X>��'2Hh5Ţ���Zbď�q݁L/ۺ�J��K�&���M%ź�?��m 1�KO�PW���N�"
�����v>�f3Я��Z�2t��mϳy��v���j|�Eia64�,��n+�/^��"o���t�PKEePQ�h(,N_[pip/_vendor/distlib/version.py�<kw۶��+�9$c��d�i�q�ܬۛ=���ݻ+��R$$��H��d+u��wf�I�v�=�6��`0��ޓ� �#�*�/�����go�t������o6��=���]\qv�)����'����8�*YŁW�I�B�s��7�ޞ�����M��8`o�;�x��o�_|���]goo��n�F|��z�d�<6��M8�8[�,�R@��4ci��À
Vi�d�';;9�������H�(��2���ҋ���`��@'\�(Y,�P�f�әgɒ���y�A�i�Iy.��0Rթ��|��VaF��t�S/��Sv���i�-�(�ȃV�i��zL3��V�X���o����񹜧�\�w�>��,q:ɲ$Î^LݭI���LCRʅ�o�̞NcoɧS�����lT�/ZqztF�,��U�3���lUuS��"a���%P;���B�
��M�aө��h�e���,q�ba9���kj;�F��֫�TJkk�U[@�Ú�y��ܦ�]L�F��Ǣ��^�~�DY�m�ya��iR�{����{P�
ưo�Ռ�c9�)���aZ�9PR+h��s�<M�{t,��*�.�Z"�{q���Y�8�
�8��cf���5�?��TE�AqѬ"�,6�X���p1�:��s�nr8
FT��(�܊�b�hƶD�p�H��D̙�I���50�/���
MrU���� �s7%��&��i��<�鞂��I��}!
ԕ�_M�j�@pw+���E1&��4��s�qn[�a��)^��iN����]C���h+l����%h�$ɦ���42�8h��.?�Z䇒<w�J�K�a
Z)��LA<�&1WK�F	�✇�� �|��aXj(bH���3��S��W$��������[������t�ְk�J�Y�Zۼ2ڼ<nm�G� �jnB?���hu�f�l���VQ�e�s���:v+p�����QKX(�,�%q�aER�\^T�,����+.=��dd���N7��Ԟ`�����٪�A���1���\ڦ�*���y�p�
H(L)V�^�Df���h�$���
v2�0I��С�u�2z0�>��+�(��M��Bڇi����qҺ
u�jM�Ǐ¼@Cv�#��� �9���.f���\�Ч�l%�h�8$)�$���
�<�k1��>��f#�0I����]ڥ}��y;�/a�K��� ����D���H�.]�:����ZE���B�g�E%��]�b�!N�]_���8�`�KЊ���	��y��BTH�f
�A�����7�t�E��[���
2�@��ߴ��(!�UH�vo�Z{7�ģ����WD�-���'�ϸW�W����Ҩ���p"5'�;]��X7z�~r�4f�md�
���'!�¦��@\����P�q����-�
�Wʟ��-��r�%Ϻ����È��7,=`��C2JU"	Z�z�s!F��#"��_ҿ�WK_}.�\����֜��^W����"\�CH%a�t5z�ּ9�\
R�6�3���dms*�P��W�\�y ʬy��2G�e�X"�X��ۥ���xL�ˮ(���u��v�1
ش#^�g��-�v���d!��-64��b*�j��9�a���0Dg^w���HSY:�O�|����j�Z��>���K����GʁƷ���p����OV�B_j���~��簃��>�xO�svrvtԟ�p��w��'h�r��������k�28x���҅��Ƕ��٭���;��;m�̂�v��*�]�=��A8��^���^DG{s^���&:�<���`5l%����JTp��M��[��m�S��kV�H�6	r�%��Y��Qb����2�^;���(�DK6n�Faִ%�7��t��C��
�ƽ�7W�B_�B�#���Ӕ��'U{�&`'*1�:U�Ȗ]V �Q�£��BH"T��G/&�u�U�?Ey��`VW5��,�݈�KB_cw1�������߀h����\l��V��vТ�T��E�N�\P�����%d|�J5�gE�v����y��nX�G}5n�{�`C�����ų�Wz&G���"?Yd^
.P�y�$jp��v%��%��h�e�U#� �aCѮ��6o�ɰ'8����B��A�����%4m��@���̣v�F��w���B$V��Y��Flw�#$���/���U�n�a���=M�e0c&Kh�{�g���(��ԗ�	ٜ��S��Qo�T<��V��~%�R>Z]�VA |�q�1PQ�8�z%�W���wA�I}B�A=�hn[k*��7��9�]
��=i����*�y�[���4���@��#/��.�\2���Q�w#�ޚ���T��t-VzG���	n��Q�B�-�:I�jnw��?Ƽ@ka��d*������o��;��V���ݣ���n,kOnh�����<[����2���jɊ��:�i�U-զ���Gl���+o�"E�� �`L�-K�j��rj�G�땰�9:�`KD(�>�,�RC���}�j�p����yk�,�#59��P��_>hk���\-�+Ӈ{)���2ň��]�
�o�8Q���;e$"�dN"���VUX`��U�/�S��}@���p�a�J�M�~�1%V��ŝ�?y����������$�5�_>���7�hk�c 1�o�Bz�4)}l�tՂ�6��/r*VԾ鲍�b^Ef߈yn���97�,�:eQJ�0�qT
�n��Wn=�n�*���f�E
$oi�K��z�U�Й�X����k��UZ���j�]�faԼ���^�U��X��?Y��*U�e�K���J�E���y�^�#�)i#3>yG\GX�Pf�{��ʱ,߯���VJTzZ8�iC�����Z���q�ܭ5}7�(�a�+�<���2�:��
�"���	^twG�g��%�"�T�j��eW��+iw�j�1:쌸�
���7�� NjiU����N'��ҫc�e=�����}u���Ɯ������=F�
��Y��mҠ'2�)��Yh�A��_��/�Ҷ���5��I�&��0}�S�ӟ˯ҧn��~�K�ϣ���F����[mP��t��h�»�+��N�u��&�<hE=xEv��J���O��w�\��_���[Vi���~�p��tf-����`�"���V��S[��z�͛�'ߞ�^�?hSo[;;���Ao��K���~04�L��,��*���,��9v'�e� ��껗�:�}�b,�<�~[����Mv"Ua�	v#ui����L�Ն�����`ѫZ�Rj��̟Ё��8�H�=�e6_o�@p������_�hn;�0Z!Ƨ�U��{��m�˙�Es��K�<�rF0�^J����G���@0BJշ�DZ�����9B��^�rS�Ƴg���*[�|�e�mr��W_���=v�?ǣO�v��/gZ��=�_^Nv�z	m_{�R�_yY�O��)��f�4�|��(�t�@�=���-`(��d��59��ۓ���N�ޟ���O|�s��45_-ԕ��SeaTAg�{��Sj�9k�:H�%��*Uߪ̸r-RZ&ub�����b)��Fʊ+���P�i��^�DI���+.j�=[º���W3�we�qP#�Zz����,�:U���:-
�+"0c���
���d_�1���51�Z[iam�_;�.���"_�E�����q�*ZT��q_��6[�1,�+eQS)��d[C`�6��B���
sI�&S�gmJ�%f���hW���ݰ�G�	��lnPBvNZ�⎡4ۥDO<�*�R�P�>9� ��<�"�%�����"����X��1��W{�f�…���d=AP0^ܘ�!�)"��������I���q�6Ю̳�3a�ЦtӅ�y)8�vZj{�+�׼r�e|OP�ݜm���\�M�Q�����]�D��c�(�����c���;����u@k�1�$ژ��X�#�ک$I8q�7G]^T�UC��z�x�`N�%i�E� b�]6�^���,�ٺ��*Gϙ���y0	�P�9{粯	�ǂ�2�.��B�����l�^����.;~��c�X���~v�8|,��Z�Ҩ�P��/�gD:g歊z���L�֦���1����?*�_��r��@ƪ�:��_���4����Y�5H�u|����rIvXo���+��g�0F�rSY�v��UE8H yX����Bȁ��Ŷ�,=�%�酙�SƁԴ��A���)g,�D��cA��Y���m[�$�C@�����e:$�w��a��۪�犾)�����M���J:�����8t�uLjx� ZJ�(���~�k�t)����4���ʡ�K�Ñ��։�A���Z
�.�a3��~�`��ڃ��L|���?����A���H�V���ܛ��{�Ş�ƒ�b����0�Ҙ�?�o�DW��]�_v�8��0���
�	��w{��	�m�/{�R8p�l.�Cs6 Sz0�^v�|��xw��d��;
�����?�2��=����6���-�a<bC�s��0ta�n��L&�
�~��St.��rZ�`�}��ȴ�������j��x0�pJG���*���(�Hi-��\Xi��y���1I
Wo	u�(�C����ؓ�QQ�S>bϟ3���;����2�}9�1�׏.g����t���"N��Av������.$=��\v^~�$�\e��S��ۂ�������>߅-b*�H2����Um#!'[�Z���+�����[^�hྶ��-��t3d�����a>���)�	kDw�0S-�Q����	����1��@K���?�$�=����P��&���W���^�h��RmR�;�|�@�@b,��rwB�ZLM(�rH!���Q�ӭhOs�3��JVf�OL��#��|_���-,����#o�f��ܶ�ʲ��Z���ao�|8V
�L���z�L��ڸɐ�m��`E��*�hΘ�R��>侬���9hC����>Ʋ�F)šPo�.¢l����cvW3P�ʆA(3�r�}<냔;�)���Lo�{lpITm!fk�y�F���1��}�P�D1��?�[�*C��(�!�t����)�i8`v�|��
�[	��g$��Umc��Ӌ(�r���쩋�afn���}P�f#58�P4;�yeO��R��6���}:��)=0�|���c!�#�U���9ЯS���y�~�}��-L�� �AML����R)�Q�a�3�|�Qe��0�z�FR������[�V��/�;��%���N�h��,�/Q��ݚ�Z��N�+��Z�<Wꤠ��i��.JcVX�p0�0�!�|�^X�q���y���^L!�';`i�^����w:����<!���$i�* E#�q[��L
ޜ���qQ=���#;��TN1M�ڝ�����O�V��D�	�*�2@�Og��w'_��Zc;���[��f�����ðh�v!��v!��yS_w,m��F[��{���{���{�q�A���+"(j���_(��i��r�I�ܐ�4ZU��L3޸~�8�R+���2��
��9J�U溙k��sY���7��k/������.h-�c2"�G�����oZ�Y�9y�[��q�&l0��k�'��t(I��v��Yy�S�4ݝ_��W����wI���|
��*�&���g;�@�P�{/ʫ��ܛ ��J�P�w�������
��R�/�Q]7U'ꐵ��19�3���0�z��sʄ*ѩ�+�����;����g��7}�ê���'�1&��\����U��*X�B
�lC��y�|"OF)�?ǎy�\E�%��%�Ɨ>ʉ
*�+�Ah��8J+�M�n���7���*t��w\^z?�����?)��Ryet8��h�UB�C�.�
	�&P�ȏ��#��&oJFB5Rdt�
��xLr8�"H��R��X���[��t�QJuT��P����[���u�� ���O}��V��9}��ίb´��~~�C���vqX�r�4�eoZZz2�K�tj,�;:��&���
s-��>�[�v5��}�CB��D���l$v��_�J�O��B-��?��}.?����x@�ǁ~���Cykg}{4�g��rC�`��ܑ9(����o���\�g]v�@[�M��o�~���y��W�
p��}Zet�7ֶh�?;2�q�%����w�5m���N�$�h,a)�؄��n]��5���`'Uǖ�0"�U�F㉴w����G�GP�"W�;c
B]���[���:V_��/���`��aͤ�PKEePQ�7�`pip/_vendor/distlib/w32.exe�}xE�8�󑤓L�$�#
jt����$A	̐���qt]6t�;�i�Qw/��z�z�,����]��|�
�0�I5 �YA�nVk���@B�wNu�$����}��y�yyHwWթSU�N�:��TM���dLØ�OU� ��s0���>�˞�l��7�>hX���+}�n����4������?��e}~��@�������֭�!++�@���G��ş�3?�=�σ�
�>?���ߥ�7�{�~9����=�O�����0}����>�we�]N�YjHa6��]��n�h�4d0̫xV�+�V��ԩ��F�Ia4=�f�(�$;�) �&���g�g����y�
D}�����L�����}������7����~�Oz�����a��

������z�o����pP��
��6h8?�\膆�
߇o�Vh3��#߀�a��?@�&J��e��oo��ɿUr�Ƿ�3��.�t0r�.~�b&&���*H�U��[K�'�f2���Y��}�bV��3j���V����j#_G�e,�� ��M�7��ͽf�av��Ō�5�9,6��0/贺T���O��Cw����b]d����<�A�e�Z�ö7I-����!��p%E<���8�
��	�r5뵩��aw8%���q-'7�c�Z>�e����`��*��d��a�m9���Y���U��a���M$R���G�P����v�}!�XN���~�W��S�z|�<�a���$e�ִ@Z�+9�h�Ij�d�|��#�op���H	%[�=�_%�FLθ?��`���J�Ke�a�fy�c��/C90A�|���PJ�'�s1�E��j�}��}�{*�;͐�^��hgo��ߟ���ӣ�vq�\�c��3�VU������ɴ�#�/��9�N�SB��vy\$��˙�BP�� E��SV�:�4�B~ƅU�]CHq�\r����]�d
��P��z�2b����Ӫ쑍�+&�هH" �eg_�ں�_-�
��I��O��kj�'�y|�-�8��0X�+H�+�{}�
rB���E�'kT�^B�*�>",	:�#E����A��R�A@��s(K�ۄS��6P���aP֬�۴�z�>57r��0~���g<�ʥ殤�<0 X��r��
�
ȧ�/���6hC=	��O��CK�7��M��cRKA��b�9^�T^0U�]��t��.�xmq���j�<�2qk�u��H�5�h���j�c�(�4'��@N�j
���_^��y^��2JF�/�#;�?��vA�:�l5l��^�l��+-�G��w��=Zb��x?�����&�Z���>�D���yT�uAY��9溼^`7�W�Rjn�٣B�Fb��ؕ˃;�m�r�ׇ�;Q�t3��|A��y��/"�Z1F./(p���Ps‼�����=U��ե�"�
z���\�zC�U�uǡ��C7ɥ��*rO��";�,�R�S]4C���'�YY<N�t�����dȒkY����boB�!�V"N�r.9�m�EAW	u	>��H�L@���(�
n�K��y�1j����up��z�VF�'qR1�DT�X_�*|�'�$
`m�z)R��F�3�`��J�����͟�pi�"�^����3�k ��h�����k�0�jx�jmF1b�
�9�����7��Čz��3������b����6]�5���k�G1+��o&"3�
Z�TvZ�"�f���s`Q��9:V�5C7׋f�f���)��5�]d�9ч�����6S
���8,���!�&��,�9>��P��<+�;0JV4�o?D��(?�[G�nx�K��ڴ���a��
�A�tQ��q5A��
��oػ6���t1��4]������P��9�6��h��A�mo0���Ֆ������/v	��*�l!��y�3�s�Ժ�E�L55�}��/y_I^Z��`�KӅOi7��U�y���7��:+?�!�4�ijGB�\�ے�RE�h�}Y_���.����X'������>�־���12�@wn��K��T�!@�m��G0Ћ�R�E�Υ���Lp�r��B�ߺ&X���"Y`<!�(��:�Kȷ9�C��.E0�s�bZ
���0 G�.c�̊!c}�C���艸�'�Z� �JSNBJ�D\
t"KP�z��.Sn��h�
���Ĝ~c�����瀿G+���]��J�T݇u� ��q���p-r�k����o����Y8��H�k"hV_QP��fs�Rc�-b�!�=���Q��t	)�`���`�Ji�'��)�r��3�\��9A�c�P�K�B>!��#Ag�ˇ�!㯦����
����a���:Q�QI:�_g)��D@����&"�TX�����"r#|�mJ���Am�
*3O�F��
li�v��5ŀR@��^/��(l��u~<tw���/�� �u0��hHܯM�W!�Ҭ�8�t�X�v(�#���ϒs3����Ԛ�!�f#Cz�&x{���5�>��Y0��W7�jh�*g:x�zBl3�KCo�Ib�������7*�qP�`T
�q�&h�����Rt%h��VA�����ݐvx<j丽m#'���)F���sbi7�������/�S�$�53 �"	��>�[�4�*��
:�F\?��WI���)���l�>w8��d�-6Z.�,�d�)�#o@-��%�v��>���!".5��j�J�]�f��5�AV0LI�w,Ro�l�	QR�����(Jj�
)%�.>��vJ�.�U��T~u��
�{����q��2���cV>�:�wR���ݣ�@c�|h��he�k��ո��܍̢)�γ�)�F�m��k�
DE{���ZO��d�c�NĢF�g���1�'z��!�e(����5>���5�E��^�|��ɨ�񚒞�!ӧ �jʟ��Z���`��ا�`�!~�\�F�a@�+q��������Q%�*����ϵUX���k�U��U�K�r�OZf���Y-�~���!��
B�3�R�
�=eK:$N�!S2�%�ހx�;��`rĪ
F(Ġd�,`v�1���fF#@��5o��ʵ�@ϓ���I���$@���"@�%������/�W�FX\�!w�l����6����i�5F����T�K������Zo��#���������a �Ns��Sq��j�
���3s�s�[a��q������xφKk�t$�D>t-���[ڌ
�"�*�`R��g��*ߗ�- p>.<-ʾ�E�ТN��k-
�A�Nb�:����°2���h���5�In���7���K�!�D���2�d��Ey6H��f9�b��e�-�(��p��RW�R�|��Lʧ"Jx&��4�5�/T?�7��#��!����6r|�?�[,n�����vf�]������Oܑ!5�� �+|&s�x�<�+k�_VӇʔ����ى�!|�&���3loQGF��.��T���Qs�G����w˷�~R8f�O|������5��m#k�y�>��VP��"a���>T	�g<(5�a�|��
����<(7_��XO+������Ũ�ٝlC���x��9��]+��j�O�iT���py!�_/Qͩ$O��-�(�v�U��`����T��,�o"��u�Ϳ��v�Ụ��8�Jv�33V�ic[���vr��91nl�%X�Ζ�a�y�F���~j�9�Y�"O��Q�Q�!�Xr�,R:1���#�Y˱�^uC��<:-ǹ)!~�A�O����u5 �ιI��Fn���F[�{��������H]S�fqH���d��ZS��	)���WԱ�?��C�rF�㩴��ɢ?�&ǍV �T;�j�ؘ��9��\E��M��qy*D�0Y�Qb�U���gΦ��!����`��K5�p��l���1g��b�.���yV�ȓ��JZ�ُ������@|9m g)�%J�!{W�T��a��W «�G�\�x�6�a��1^�!�k��ƾX��
w���?�eT����lJ�ÃB�V��~D
�*�T�ٻ6��9�y
=�!;;�HО0r�*���v]�V
<���Pa��"t?:Gu�[
м;T�Ü�����r?'�*ʲF��c�hsvt!EN>���
��=�P�,�r�0��-ƪ�z��%�c@zJ+c���_W"�	�S�`�u9�ב?<!ّ�'`G���7瑰'j�e�e��.]2��r�h*�B�]�$��d6���G�0'!A��]}��@���Q���0+9a2>�:��bej~C�ɺp�z��X��������
�<�\vZqe��f|�]��]P�-t����&����G(`�q��q^�~n�,�l�����h����E�>�j�C�8��\/�0R�0��w`��3�;pfnأk�3�03fN)tM�ahH�pax�kJh�sxm]RX�0$a����%�~/������@C��(%�CA��K֚M�Z����!"���^��D�B&�-�4�f×�&���]��j����-��S䜧��
�'3Ÿ���ln�鄽s�U�k�n�`(��~��+ȃ�.L��f�-'�|A�'�{���-�Tc�^�{��LqY��MG�C)PRp�3X&X����Z�>H��g5�A)�˕ �YS��޴ C0�N�a7�����T&�z�>`Lr)��(��f�|�e ���`'�$W�т�T3�(aJ��-;�M��:ԉ`�=�#�q+�
`�z6�\oMvL'G;F���G�
���P�����v�K�Ɂ$�滽�3~�;k��=Rm��ߖ���E�׊��J�K+��}��
�r��Q�E:�ND���7)	D���꭛�v��[j�|+�O��ݚp��Xjm����{d�mjuϖ0^Z�Tg�2 ]nRrN�(�fbzMO$NM&���S@m.��ʷ�pτDb�U7a�j~�����ٴ�������_+����"����>�4�^V��d昌~��
�T�9��M�����2��O��01>",!�bQf
�d-|I��r�W��.�JK�� �$0�T�&6=�wȵ�+O��6��Q/e#����Ns�/�6f��"@��WZ�jG�x�²G<�g%څ�����A����6��E\oej<�
�
KMK�AV�e�?~�g���.�E+�p h{ȋ�tv�I	.\��n\�
��j��E�:�
�_�5��[�j�*c��∁OG��{ب{S�Q��[9C_n��Xx0K{RG�B�q\A��������f/��
%�}����{;���[��[������!ܡe�:-���DH����������rj��pK�0΋�D��*1�sb�YNT'Q灎I
�o1*�@�N$���t��	p��@`�Gp٫
��~�?^��K��l��Q*�
V
��7�X�.�����a�Dp��o�}��l�=
l�jfB%�D�h�Lq{\��hR2*\��D��1I�	:���7���xm�/��Vͼ��*�Tg&q.W�(!�ě�������N\�,Fm�7�)|���)Tó0�L��*��!��B?��3���S�̌*��_�!�ʱ�����q��lÅܳK�MKe�۪2^�����.�/_����[��(��a7�A-��G�J�.�R�GK�*C��,(�gQ@�O!:�!ϛ<L���qT��S2�_��p�T\�R�MS�u��LJ��4I�r�}�sP�EPF�s��ۊ{�%���B���7x���<X�=T�Rн�OA6��k!|7�t>{9�*T�y#�����􎭣d/ap�<,U��3tmE`�S����Vr�蛈�:L�p3L�
���T�ۄ~�po�2r98�Z�b�1�"�w����7��`�q�)��0{�;��|*hs�ɟQ����a[Ȇ��J���GHu�k�T�C�Av�ʬ�.U�u-'Sq����y����-?z��TDf�x��5P��x�i���{��|���s�T|��4����:�+k}M��W���f��u�^�x"e�d'�{.}�w����1�{:���.��]��{.��)��L73�hJ���G�m)�Yv���,|��?�.�@@�hQ
.���]����$�i�"�x� �qk�d���o+`��
�ǭ��:�4�)����4�m7���.��jv?w
����7{�bL#_V�MH�O^]F�ˈWIم�(��4q�I�bf�g��:���|4O�����3Ÿ���4�X`0��td���Bd��Z[�.B$hYS).��@ �[�K�XY�L6*�h��}
3�G6@ٛ'�o��/��a�r�
�y��i�(b[>�_Y�,���Ɖb��"kP�:-�U<�>��wiYFsЖ�:����|�Eݮ��ah(ET�A�ky����E�r'�yh%3��]�,fl'ݨ�v/��VťU}�	w��E�<�{�"1�����#)Iiwm
5}��Aɲ���
J�+���F��u,��ĵ�������m��e����wsO�+�lmI>�2����WT�e"��I�H�\`�U�88N5�8����5�w�T��8���h����F�}{�&���t�:����13
�5�E�8#�I���"Y�O$ټ�
���I*��t���)��, ؛��GPl�c~�&;;}�p"f��g\��
w��Vt�f[�b��Jډ\�,5���&��k�~)Y��&���SV��U.�>b[�(�`� $����!���>�Z�0J3���)����9��K�&[1��(3�i��|]2y�ؖ��f��T,l<�ǔd32�T_]ӳ����Cn�r���R����_L�,r�E�b�H[Xi�T��JW��V_Nun@i;CwA8ЍH�Fũ�N�
|���yoI�
Q�z�.,V\����0�.�ҥZ�eg"�:o��܂+�54,��8@���<�q]��7nz��R��`�V�?�#�2߳��
�j��9�A�	P��47u�2%	�A˺p/� �E�lb����\Z�J3��S�;��	�d"GG�6#��P��U~A����C_��Ƭ�ʵ�F
�|��LĖ���$��=��ui�u���t]ҴI:�H�nJ���|��Ϝ��N|:�N�=��`/}=�N_�c�|��~�*�~�D��κ�`�Y
�kA���3� ��dX
��pJ�%W[!�֥79�9��lAZm�6��&����WWb�U�����,�H[>���U0�y�F򚶧�l��I�b$���A۠5ժ�W�}�/[ȅ�HT[�J����n~'6~�b��
�U/�ۜ��Z
f~s�{.���kУoVX����N��ԃq��!�D԰���y��*]^.��aj�W�-�%7|Mv�N-F�1���*�_`
�_a����r�s��KZOT!�Sg>�:����|��o����5kqI�o����y'�.�Y[����mN��d�!+��|���lz�fY@~�!�{�E�`��3v�s�&��߃�����,F��^qh�_\C���`�#V�ه�M���]�EA��@h�c{���]hh��Ԩ2|��zy�ӫ�U�.�L�Я�.�����\�?��K��U�|��_��&�?s�*ЧV�L��1�b�NUJV[��>�(����ߴh�:�"�Z���Z�|@��*x�D�;��m�Z�T���}�,���$�Htc[Y`��Α��Z�Z��li����:i��E�j���&�,��o�ċ#�����6�U΄���π�(c��N�y�9P��{��EbF�yp��s�x��B�l��W�=�<u�E�`�=�E����fHƃ�YhX�Z��S��?�Cru��ff���?C�&�IۀMUO��V�g�992s�2Th ��U���x��
_�"�{�1tBX�^���+��|A٧�e�^�q�Wf3�nӂ����9A-�y�ɀ�T�#[߱�k�"bD�s�ꖧ� �a��ʋ*?A�f6�Y^�/y�J�du�<����Y
���t�L.����O�Fw��y�!pB#ׅ��!U����s�dno
yd��n�2�	˳�}�A;Σ.�Λ��C�p1]�	�d��M��� �m�.�.RZxt���>D�nN2�TۣdJ��4/y��\�W���kդƎ��A�e�"�d]d&R�t����::�<��)������c�n"]j�TҠS�2L��~)4}:��h$�A#��	���I�9�ރ��w��1���u�@��� ��7`1	,h{[C�}S5[goL�d��#m^A��'��5��P)h�י���s��XS�g��-��A�B�f�\�]	��0Vq>�U���wnk�7�r��\����o���
Ը���AոR�T^>�uڅe�al�.|(�����u���ui���
��㦪�[H�ȋ�A%�4��pA��C,�-�S�!�0E��n���Ty7���;�I՝��u������rV;��x9�8|�h���l�$��,T��%��cU�Y�}��Rj�+su3������eSn�B��g�9�:^��]^�q�3Q�T��)U����e������W/�F�jqh�́��]	O��ug�,������)��Մ���=�I�K�0�Vم�m�.��3	�v�Y���*�ӳ�ێ��E�6��8�ۋ���4)8��M����k�\�g�r�m�i▵=rpAY���D�,r���M>5�$:c7bG�q=t+��!��o�[�t?���v�	Չ@�P@_��� �Ȕ!M�#/z���B9N�a�NJ�e�#� �J�WM`���G�T�������ꉏP/��N��2�*�*������t���u�ێ����a���:�6]H�3�t��%����
�q�P���Z�}-4O���j��rh�?j�r-���B�G�U�݄�`�뭋zo��|�GM8�	b�Y��A�ּ7F�z�^z�G��m�C�Y^�:��K��TN�ڝ	o�x+#���7���W�%��RUdg�}�/�^�o�ѾU�XfC��t2��ﮍx�bt���}O{�����c�q�}U4Ю4@��X��\��b7�����Yb�q��+F�pdQ�p4DS0㫷���ܱ[B8 w�#�k	3���y\�i�%�"�n?
�.��r��T���ոM��64���2ȋ��ЕߗK�}����4�j��Ĩ.O�󯾛����]��S���_��xn ���s�n��%�hn�ބ��>���i��~�{�:r�+�b�� ��{U�D�{�ƪ����a�#��=�ѓEK��;�O�Y!v�����7�U�+8�>���V.��{��=껻ie�,xмH�`3���/K
��d�?o5�Y���:�y�/a@���|�hS���l���y�TB�#�������*�ꞃ�}�0>���ɺ�ʈ�sj���*ɱ)ң�
�:�ᓵu�e?}Y߀+)P��M��t5��I}=�*��yT>z��YR1�Zhj�,�q{�?N����Y�ə"7Z�*��BC:h���؇2nCs�%��j�hėd�l�]�ݻ�^vԀ����%�^ᗶjU��PZ	����Jh).���eߕa2c�S�6$���؜�QFW�m'�q�#D[>F����!�X�嵾�@\f8�Ć�)Iͯ���]>A�w�#��z=]���L�t��؇����h��,\B�z@	J�"
�h�� v@	x��yI��� �ܳ@��h�t���==���s��8�ጜŌ�]�{�����W��t`�o���q{ȆD>ޒX��B�i�޹@X���M�y�]��;QP���7�����q���J}�N8����X-��̪����}�d��q?�Y����<���Ss��s�؃��ѯ�:��b?σ��m�����RX<�X2��g�h�7w0���Ls����.��f=F{�vum.�l~q���J��|.^���>C'�0�7L}�F�+~M�=�]�pj_gq3
�a=ލ�N��@HT���l��}��Z<����|䎡����<~v��(T�f�F~��|��f�����|j�xʒ��PXjԀ`�\��?S$f�*�d�*�dE�����dž#Ǚ�S7X�}�ǃ�S�.��D��h���6�����Y�Y3�m����/���\*��u3��1�Zw
��G�!�14���e�`B5�NM�lhx�r��6���nh2����q�6����;uأ
�;�h[#�[B|Q�/ �����7��7O,;\��Y���_A�׎��(3�cKH8
ݵ	O.C&(�e#��z�[���!�o2������r`x,��:9 пS���cN,f l೛��N��x,�*��F>��1
�>��S�ZA?��G���@�_(�:����S��dc��3��|qh�挦��Ӭ��J�xq�f�˻[���
x�vC[b��->No��E�+M���z�~���~��J��Zj>quR-��ڋ6u�ト~��'	=�b��>��ɞ1�∦*z�
�I�>�BC6��>��~\z�����.�Z��3�z����a<�##��h
~����@��v�w�ު�Bq�0~,H�(gđaa<��9̣��1̛&;���.�mI_��˖�-T��u�$��CȖ#�O�8m�p�	f�lJdz$?Œ�=b��oi��Y%�P��٬�跏nrE��꥔�Z<�
�$�{tP`�-(�q�˦z\�A�ʓ���Cfi��d��1��9�|�J�/vd�tp-m8k쯀��{�����q�����Q$	�?<���R�����Zn�"nH�u�h�
�l�}`3T��>��_�"F脎S��b�04��(�-Z����M�T��J]PjD߫�o����0�s�.���S3��/5M3;��M�~��p<�,��2^��IJ�%���L�A�*�Y�$mdu�����PT)�.)�~�+q!�]MN
t ��Ɓ0=���*Y�%���x����}N~��N�^f�Z���0�F\��
��Z* �e�c�!!�^�E����1H�ٍ33v�,��6�>J���Rm��HꛨZ��ri;Ug*6��g�/�����GK+��=1�̻sp�)cw�ѷe���x�	tT1��h����Y�%���h�BhJ)2Ac֎�yS[[7�aBLK��+%Lk��>Q�MV{�ɊWNJO�8��nbDqhAe�����l�F���!-��\��ȪO�H�Y\�͠3�i����]�%��_"�x�)a�3�~:������'?�V0pplॱ��h ��u����P���IOE(�G�j5+�S��]�:=�k��@�r�j����Q�@q�2t���3�G�Э�'?�U����<�{�#��U��"�^�n܏�Hf��y�2�U��NP�S��t4����j�#!-c9dtȏ��8�]dȏ�v��a/���HFu꡾D����:���lh�$˔��c��6����1���AOoKq�F�qrT"*��T�v�/W�G��0Z�R�F=������];�2�#��9^i��PG��C>���EL
N�t�&���(F����tM�	�ί@'=�5!m����6����71z��,�z�6�܃���̉%�̊qmEl��CjTM��\6��s=Z+���؛���\ˣ�_�^��^2Ԏ+P����B.44Xu�^�0i��^;K��A���Y?�ܶN����}
?W~�8�t�%?�jx��\Ůp-'_�+ț��~Am���]7f���k��\s�
�u�H�&O��r��q��r=u���7���Qd�aYr$��`�\l�l����.s8��q�]��o�7��h}�k���ƿa.�7�9�������[�uc�?�7�$>����B
������S��`[�"��m���g6y��)S����2���>ºP_�%ц�#_�����m�xʚLf����p%3��}�>H�	l�4L)<��;@WK�᜶��<���-l?�L�)��؟\x�������E+��ԓ��^��04�T7��q�2ԍй{|y�;�X寠��1��:��6d�e��="eK���ۍ�
R��x�H�K.tB��>�B�N��>!OY���M���`��%/��D�~YyQ�� e���
�K�ef�жi^z@���.�j�=JEP���T~�xa��(�����Ŕpw��L�Z()۳3s>��7���I1�g�Q<�	�<J�QͶ��D�Z���1X\ܛ(��q�O�����h�]�8M���%�>L2����H�d�#r-_0H^.�)��|��z�ClGws�v��r5�Υ@��TuS�����uiԏ��Z���ׂn�t��aԕ*,�=�i�a�"0A�����!WC O�R�@2�t�Q�tJ�Y�i��\��‡�4t�ˇ9d�g�͸���
m�V������R���k~b�UYӡg����<�;U^Eǽd���V�CL!w̑��IvVl�ȍwlle��-Pنd�8.��$ 9�&	����44͋']���i�ORw,-2�5*������Ȭ���"޾y�T�o�kI$`�r�Kо�Z_�����ꌷ:G�á*����T���N��#�*+�GxY�O�XayB+Ix?�y�̗�� R��n0IN<�H�g�p
dI8����X'!w�OV'�f�t���B.N*Ϟ��ze�\�3�5��\%G���X��t!�o����W��M�#Lk����/I[yvJK�g#�����ʜCˁ�F
tv�0��^���)hN�L�5~&XM�C�\r�:/U���M�-&4�H��k�!|ګ�ܣ�0.�P�,O50M\n�B�F�W�|F�=CHib͊�)H����B��~{'�`������\��!�0������c?���U���y��<Ȅ�� �͔�@凪���&��S/�����P�u��j��Ԩf�/�����j���e���OH�	�B?��	�;�4��eP!<�p���+�imw`#�J�T^�:����\����p���-[R�b�P;�V�‰q�	PxC��LG��!.�����s�%:�,B�C~�ü�O����Kq��@�MФ�e�+oJ�ƭ�;&�\����eb�$$Bהv)����V�M_D���Lv��� (*����3c��#�!a^⢂ �n�ս�sO�#��9{A:q�����D�-_e�G���&������6��z�3u���g`�����ŏ��2�~�=�G9�_������0bI��%�̐�Ϡg��Z0��jԹĈ7�}���\�*�%s���x�?����	9%����c���V�zM�rrN���3���Nah�����&#M�1�g�R����Jz��h`�) �b?CE��ϟRgo��㮤���b~�S�?��Ï��L�������{U�!��^# ��Х���+��#����ڧQY=���~4Z�x�TN��	}^;)�q�ˋ�b��oӎ;�SB�M�t4s����7Q=��$w��뚗���B��r9�n��w)<���,���/]�sU˺I�w�k(=ò�ݤw������:z�,&}�Խ��n7�l(�4�,��۔**1'���0�C����ڲ4y<yCc(�+�1�#&�\��'�N:$�+,�8��k�(/`[B��拨<5d��[gS���P"�������xK��41jca@nw��0���z]��������g���Ӝ�Ǘz�Η�5~�?��Cʦ�Vc6,�����8��N�n?�q�J����Ce2�*|�`2�WC��Zu�\LOƆA�Ps�(=���[_R�	גM�7���~��1;l�FH�h�F��ʅ��y^XC�{����\L���`+͑�&�N��&���M��6F�<�3�r7�|U2����h8)F�Z[����˦�lk@�I��|�\^�zxG:.�W�Y��aͧ�TΗ�0��M�р��T�9��i�0SW�`�%�"͵�‚Z��θ�Ruۇ�>n;#�G�l���^	e�6-37)?n�07�n��X�d�覬�ʥ�1�EU�o�~�7Y7�l�E0�š��d`�O�ku��B}���5�j�8d����W��jnw�4����@R]���Vh�*�B��ƈ��q��(�9���$g���w.r�)�U ����'^4�����jV_EYѩ1��w4���;cE��+E��$�|�en�Y�m�j`d���}�w�UP��NBP�犤�pX|���e��tn>�9�ez��1D����'`�����}r>K|��C�R&~�^����w�Q�-.9B�
w���Q\���x�u�1�B�6\qA���Ӓl+�%����-�+\�s����c��_��}��L>/�g�>�賟>���^��D����1�$�a���$�dRP�愪6
A
�^�����;�9`���\%�#���y�>�N�nx��Os-���Mc��t�Y�+�9�Ƕ��ۺ����w�(��io����)S\��ҹ�-E��g��\'0�ަ���4��,��>߈#Dbs�M?�ޮ1�')�Nǭ��"��Db�����a>\`?���C����.����o�߆��w3��Y#�$�X>�ŋ�	�2��D�`E@I������J��i�}���r�S��� ���,&v}�����x�)^J���b�#�c��Z��K@��}�C������\�8�hJ��!˻�~a��
�j�Wl���ؿ'��c�S�ib|�0�^�n�'�)�g�~��q��z���<�⑲؝4u�RA?��ZJ�Ǐ��y�C�Z
���e&�X͵L�-��8V)�Ei/����-)֗�7{��MF�<;bDn�	<*����V`��i��\�#0fţ�Q�M�I�j��Xk�#xﻥ�C}�;p,��&=n�MX��U���X�t
t0��;ČM��x�-	�v�$���׺^^3,=��r-�(q��]�f�YL���Tه���=>ڳ#�&�4����?��EvޮO톊
�6��>�v�Κ��C�?P��)�7I�Z�^$ӟ�HXdH�@E�~�:�H��p�l
���,�%��#XEu��j�n��n�J���}8���z��iZ#5���>֣c���T��ڱidEv�0R���.<:��s&d�N:�>��K�4t�_�M��N�o�n����K���c�i���?�U����b���6�KH���$�C��Ex�Փ�,�"y�R�R��οFB�R/��� QX�S2E�P��4'�
 ��$�h�Z��m�䲸�����ƃ��ո��^�ao��j�Ano���S�n	���m!��/�)�G��u,�帒�!Ì�I��#��IL.�;G;]݇#�;|T�ןd�� ���R�)�'�S~�"��W��4�F���y��:lMM�x+�!����$Dӭ�����Uj���4���2��4�K�H6r-
So�j8-�E+�;L�w5��/-p-[у�l�q$C�!��=ņ�� ���(
0<:���ڇC���)V�܁�᧕��4 -oz�ʓ��O	��~�Vs �q�`�x�|o��z�OBO]���M�)�h��E*���hh��T�C"�Q!�j:��
�9��)h{*B��˔ O�py���.
I�<���⅒m�� �5{�r(@D�mz�P�4}��:t8�ۚ�n��_�r�&�ژ"e!|�%��>:���;���j
T�|!M��m�xt�4�h�8���`�������B%u�������K���Y�|'�B*0Q=����P�L�&%�6+�Iv|�e�ZÛ��}�G>�z���):�k��ȣ_%�����o�>��52-E��/�pˑ;��+�,��M�O~�NLg��#SƿL'$�st�A�e�-���h�n+P�=G)K�G�#�~U5B�����{�� -X���h�E*��D�h���ѨU��j��_�7�k$�_I2�J#���Rm����������)�Qڈm@
h�h�Qg��_�������_}���	ݤ�G���#��	�v۽����;�:����^��5���7����M�lg�.��G×��W^T���z]����2ykQ�j��'v_��q����ZȈ;Rj�YS{ٮI���ɺ�F٪M��R3+,x&���u��v=�쪙BU-�_7Zv�����~1�������3�'$O?/��d��^�@3�#kl'o�V
'�'�U�����X��ƹ����{�
Vۤ�FV�A�6�EnԓS��,�Jp�Bi����=zr�>ZH$a؍Gm��5�qǛd�Y��k��m ?��6�2�1�`r��E�-K5Ь�0�d���|�u�^��	�W��m�KB<�����T3��)�DGa��{B�F���_�NP:�N���Ul�i��+�mW�r;��Gیw��x�h;�w��;.<������`Eo�*�
ra*��na��3�U�bhSFoS���:U.�S&I�s�d�vF-o�˿x�ꇇ1�D�n�!m���F���Z`�W�Z�{�U����[͝�xU�bPt����lg��a9}X\r).���.�[}��"�b��E^�[�j�t|�*�]~U��00����X���%�^�d����tu��v���
 0jEV�x��׆��d���aд���J�Y�� _������\�%7�ӭ�i�#�@��z
�R�!ȇW1����~����wO$�Y��ț�w*,#8o�(��R�� u6~2�,&�r<�"U�fm]D�wS�)~�u������0�l���Ͽ�~�q�"�%�<�*����]�\m�`"� I���,�kƼѵk�"n��유��~2z	��(��{��]tij� �4!�L��kꀣ�O�I�V�����z�(:?��]��r�n8��
���ݪ�{^��U�V^df*o�ܰ�BfԮ��[}�y�
�Y{?��p
�]k�r!l��I0�(��-�U�z�B��M��(Q8�d��oX�
�_��z�=Zt_�����'��Xr�9Um���F��*U�R�y�0����$�u��I(�9��)�:��-�_٥3�V�8��ۥ�CLxB��O�]@	<�]�v��k���ew�l���+��!K�e�ϱG�hӯ�F�v�=U
]l�$�_a�/��n7�b=4 ����-��--�lB��p��_P#o�K\W‚~ji�����]f�m�Jg����X�������D�%)��4�U�J�5ƫ\�e��D]
�E�O$¸��P��Dx����3�� ��K_�p�qMݴ�Ϫ'k�m�@�.�@��k��L�~���z<�
�gR|L?�t��n��7�-!�`肅3�t[G@�v��`��Hw�v�=X��;�V���W��a•2������,')���q�X�ɱM0zA��h�Ϩ������E0�������<�	�P~�F�ep�[�/�Hxd�VH��3g>*Ũ�t݅�U����R�^�&���w!T�פצWW�/���n[�#��_ʫ,Q��+8�t�N�,M�٠i�L��t�q&�3T��3�4�����F�y,;�s�#�
��2���4\���ڲ#UuZZ
P�r���^K�B�P>��4�.�`2�ݦ28¡�\K�ah����Bj�r~��W�ЩO�PA�VA�j��)�k~*7-�������6fл~-�
Cӂ��Y�S��h4�p"s��%�p�]�A�:�s��A~�#U�ca:_8×r�C.�E^�Mkd֎Th��85m��J�t$@�*KẼv�I>��� �0�5�M�Ac�� ,G�0�zY���d��۳O鿖rx�d<��:m����$�Y^*f�`�Ƶ�y�I��Uø��v�I��8�T)^.��v�ľ�n�M��?5͜=�0�E�<���4� ��K	U�{��,&�Z����6�ꉙ��6`�@���ĦόE��X$�y�R+ޟ��F<'���㑜��V��/p���f�*I�ǃJ�*�*%�
���‰@v�3*pg���<Ũ_ͅ;
�8e4��ȲO����Z
�eV §v��ݔ�l������a�Ws�"�>�'��h�^���C��9�l}�A!��Y���-k(��nkf�D�f<-c)��Q�݄�����
���򳸾�j�wJR���7���O�<B�F�D��}h7��mS%�$��5z	c���"W��1�}�&������'����-��:�V5�h�g1Jn��AM���Q��˙�!'��Mk��n{)�m�+�AjB�L��;7N���;�3�Q5g��/�ڛ�/
/���1�JU*��<�z�A���1�<�Nk�G�j϶֎H���v
G'�.՞js�V%#�<����V
:ϺH�b����s�M�G9��A��q�1�C'gysS��$;�b��0�2d�ϲ6�eU��*>�,9�^db�J�H�t�G�$��O�W�@�@�#Z�jW�8���_v�x��-�w�M�?�H��%�����U�G��迥������]v2I��1Y���YG��y�!5{x���R�	���������Q��w�>�t�>h��2)8���@֣����-�}������1ujG���.U9�Qg����D9�D��Y�y-[���8����x���\ݏ���ս�p��7�7����ӵtV��c�Ӵ��lğ�xC�������*��t�w*��cJ�y��[�r����Z	$�<������݀mi<]��no
�����hy���~=�-�o��IxUݲO�dҚ���՛�"݉�|��Ł?t�%�[Iݺ�1 ��|	ۍG��g5G�j5�P��=���ݒ*w��3Fo5GoҚ���֥F���!9Xn,h�oj��Դ�RUk�*l7q-{�xs���o�݀�ć��	��-P�����.H��/U5�R��.]��0��N����Ʈ��9��
L�L�y�ܣԓr>i���B���
�ρ��}�^��h8�yvVTHI��*�t��pV���K���kK�����x 
����V����9GJ�
�.H�gT��d�˵�HO�B=RcxF󃣂aV�ǵvwB)�?������7L�{���cܔ-�͛
�x
X��=��#6��k��*.P�[�u��c��,���R�I�L3��ǽ4�g3u�h{�ky7LAg���S:ո�M�{���/���67�|��FX�����z�w�{�^��m����i��ىҹ\d�j`�"g��hK�Ҩ��3}JG�!L���P&I�]�HB<�V���x�F�i}?Y磠Q�/��<��(�d���Mk�Ha�,/���\����������}��x�l	ґ�|m(��\=���"�� �i��YC�5}�=��KL++\M��̅�ɌZ.s��$�F%ɖ�M��	E	��l�0�w�rQT�DI:c2P�o-$�|��x�|l� ϗ��
*A$s6���UU�\'�=$�_N���+�xt���u��noBʳ{�[
�~�JY�'�J��0�rfoѮ�p�K��cV �m䮸���c/��AnFA�%��^��4��sJ�5����#����K��^VH�V�砿 �]*���~����fV��(�x��Q�"����.��nO[�B��*ӟ�&KA9�Mܹp�}o7ӫ誆m�d��7�욳Bv� 98���_��
/�+/��r�G|O�W�]��+k���9xw�Z�����U�T;_0w��y�d�����n�A�]��[W�G�,a�8M�j�G���B�dn~Ќu��r���R��Rh�"��XaW2�˺�����}�U�]�kjk�53jg�_����"1�5��9��8�����ȼ�h��{~�����a�ɍ��O���#�X{�{f�@f���	��	^��)'~��G��
)�;0�`���TN8f?6�؆k�?�<�zW���b��`m�Ԯ��_�wC����<<���c�7��i;*���F@�Zi�Lb�"?�D\2
K���Q#B�*	��#�!:nBj�X��s����_�Y�όm(�G*���޽��w�����~x����0������7��h�LJ��Vn�Mq)RQ\@P.*$�����E!�{]J�����m��Ҵ���M5���l1۴����V��sι��~����x�̙�y�yf晙33���UunH=��F�.4<Nٿk04�U�5±G�z�R[���١�ZԔA�Kg���|�_�|/|F�^������W�LQ&UK�Lx����a�{t<�p���G����+�������~��\

!��Q��2���q(��c�v�k�x�`��e�|��˦����lEfK2[��O�?�~d���K�/��dz�.�G��빌ʞ��2C�� �
e����V��\�گW
�s-�txN�`��M���ݕ�K0���h����En�r��:���A�����M��퐣J�t��~���gd5��Ut��,��T���_��+�/���%�|Wi�e���V�ٴq_@͗��}��g�_Rr	�翬~'�B�ZR���)��~
�4o��G9���
��M؟��	��]%�O�����O�����*��}�ж|m����
��hr[�g��~�B��Цk�H��T�:/��bi���s[W^j]�ňL����n	��U9s��N�#RH͢2xp	�Ql���]���w�E�1�>���S�az���=�I�'���"����nb��6��gt%�ۧա u�8�Ů]u���\�d��N�9��t�at�%��q����1v�~������9u%`�/���?���:����N��ȴP^yZG&����R]~M/q�<d�ʽ�#�N��28Ɗ!�i�!Ӆ����)�g�V?o�>�Zs���{%V�p�
����S����3�/3!�$:��
��A�(k(�Ȕ�]|��̛���s��ao�wcL��FIS�EQ�rUK�S�>㤚*�[�eؑ��Is����k	{�~ޱ_:w�
�9��RӪd���	�&���<c�}Bxy$tB��D�iuXA�|G=����[E�9�{�$g��ڭ��[o|��sk�Һ��j;��	�B'��mL��3�6(p�qsǹ�U�z��5�Ox�T=��'7�I���c��F����t��x;cD��s1����a�3nP&�&̫�~�M���{}+�$(O-���C^ģ��~���2���:�l�LL��v3����ʮǔ+Q���)�9�R��[j=�񰤸����X�o�{����T!%-�U7A9���Zf�/�3�S	Aa)hg��v5R`��d)𯑂v�L)�
�'��������';�`5��7K=#2E�r�k~�(��c66�>�D��mi�ɋuf�\9��f�^f0�갩����Ǧ$� �IX�T� ��J{6����WLl�T|�l��d�U.˜nV��P6�*�ټ]9�f�r����>6�)el�(���lZ-r�Ey����5lUbs�R�f�R��(e�c;�㕩lޣX�LS&�9E�f��f�æM��L����n
[�a+��ˎJK����[q~�r�X����e+�b(
[W��%[W�![�º��`}�������8�z�u��*��e[��R)f+�nP�{@C+UJ{`ԭ��SJ[������Q,l��҇�
����{���|NGK�V1�l=���z��g+æ���ʗl�"��![�M���XC�Ǖ7�*��"[[º���`]�V|7�����|��:��]a�b+.�UR�k[{�z[C`��5�>l��z[�am�֡���Q�7o�H���"Xq$�R��1��b�xX���X��Z���:�ü���ec�����<����yY4���KP���e:�L��'��z�I\jgd*�D�~a^�Z��jJ�a^C5��U��a^�4�6�K�0���Wui�5Js9�`s������5^s�Pu		���\�T��0/����b	󚩹�V]�üfk.�T��a^���Lv�>,�O�F}�C��5�N�V��q���x��1NW��fz�3��'b)�N�"o���fZ�����ܱ��o|�/ia���q�\�W�z��B��oH��Z����Rė�Q�7��.�Əըx{��\��o�
����u��N��n��T�n�N�O�n*W��G��[�c�vU8vz6>i��Iٮem�w����gdZ-r'Z)��D E���N,|�6�;1�C�������t�ʅ���k�S2�t�T:X��;�[�f��xI�z�l�l��]��2?�vl��~�?R���wI�?�5P�D=�"l�r��<HM�:J{3�29�����x���m�*t����O�圃���t���SRR��V��>�U���n�_܅��5�~گ�m_��m_��]z���뗴�`q���+�	�a�ߝ��D���7q���b��
�}��U嗽�Ox{�m�Cܝ(��B���R�1�sEJ�P;�[
M�Ӡ����T4�l�Z�l�K_6�/���ߵ��3�[���BD���/�ش�D�X�me��n++E"�2_�28c[����
+7-0���>�n,C�k�
�g�q������l{��eC�j���2����`��x�ew�x�7���.����{��셿�f�ݱ�S-|gAu�6`B�����/�8w�>�}��}`۵}`��;�@�����\;]EK�%��,����:)��_�k]��[t�oY�V���0���� XX���(͑F�jV<��_��n��'�y����\x�[o{+�.w-n�+n�	���O"�,�N�i������SQ�vSQ7�3ME�`�1��{� �b���/��eg��r=�P/*�0��up��J��*�~'��D[������-UV�)m+o-�oJ�R�moJ#��j*~Ƌ��Mi�/����P����@����1Q�����޸�����Uڽ��q�5�?6w��na2��q�tm�8�{@��-J�5�*��[��QgAx`ͫX=#�����T���d�:�Z=���3%���'(�m;���^����bѐ���-NG5G5��[�,d��j��n�����ж�+w�h ���Ћ����kk�qFi���W�cpykX_�T�]�&��a��]�m&����[þ�a\�U^�m�-K+l��QO'��j���&�8�$��7�A�0��ZK�kT1���nNڢ�	[Ŝ�p�\�,�%6�]v��L��h�^'���Q��Uw;��k��W�/���-���慿M�OR����CَmD0�qb��l�s3��Q7���9���%�k/��8����y���Nm��^ߒ�Bx�.).BS�܌Z��Ww�mh1�ζ�Vl8;��Θjl'����
�O�7����fa�ߌԍ�)БX���a|J�qW��{�l�@P)��5���^���g,4j!�;�P�E�sĞb܌���c���	:UE��\м����\�Η�m�T��/�`���d6�zee�#�
f�@�m.��ӪS��e�=]8��e,t��2�T�ˀt�����Hn��;�@���,�_�Y�
�kgX��,�9����*UR�*\�'�����H��N���d����1G�{�~�ρ,��/Vv�om����'��B{Yx�*���c�!�uju�PQ`P#���U����[`�6�4W��j!�;�kr�ֱ�S�wr^���ػl2ߩ��`x��k�k���۠�9�p`΄�X����+�h�]�zR�ېOek5i�`��T�:W;�o۸�T�f/.�;͹Ye�2��޲��L�Ҙs��B�8��+Λ����7�]m���u1�8�f>g���ر��*;:�n@Y�F�@��8�ơc��fx�{iD�nՈ��kߜ��5�64D��e�{��m����EY(�%l\Y��/:T��g�[�`�1���W�V�n��uӴ�f'�Y�W�[��Z��"x�`7Acr�"��N.��׶�¡����;�*�g��5v��}�)J<vu��@Ee�6��V��\��ar�4�?(dž�7W~[�o'p�u~Z���G�|�f��[�7�%(�/�~��
�#B��&
���)���$�7c�(�p�/��lo�,_�n��^��.瑊u��L�0/m3E�n�+���*���Bi8/�U�f
���8�fۓ��fu6S��u�����/JF�l�|�ĕù%�m�r�m_8GW��">���k��O�����k\S���:��
���9�<���7v?��+Kp�b]���.Q��sz��W.'��S��x��/�Я%k(ͅ��[���ͫ�W7{g����D�&��$Ż&�gKIy���>�i��2��E���{H�$e��v��J�
�}<ME�q���GH�-Y��C�R�h�\M�'8=do�O��fx?���B��d�a�LE	8
�� |G��Y‘��J�oSb�Mt�B;n9�>�H�.�L��&������4���)|���1����%�^8���_��Cv.�����P#�+���R���G�p�%l��'�����SP�ҡ����$#R�6�-Q
�����ALRdz�Ɵ��VZ�0#�}YZlu!B�3g��
j����D9�N��o��#;K!-�%Ő��͈hZ|��6Џ�
�!M|�W�螘sMk%�2GDH7��M�y/F��S��W��n6�pw�-���������8��q/��JJ��p�d7ew+brz3�T�|8Qw
Oۭ�M�$����H������Ps���z	�Q��lQ5��Q���f%Ѧ��3$M��!�!�u�Z�
2Cھ�4�UI�'ٺI~/�| Bi�P�
���HETd�Z�o��MT<������-��]�-���Y�F	����e�.�c��pn�z���0��
�!��ea��Ʌ������H�x�I�pW1��"ۻ�|�ik��<>P�w�m�6�̦��KZ9��c��f$�����{왷
�ˠ�?KY�ە���աl(��C�u�v�$;kKx�3���FV��!��׹��{|Қ�D5H�3Ԡ��OJ�2�)�@���
YZ�d�y��,OH��`�y�Q�h��i'2�$��A�`��،�a_�W�v��h��x'����	4��1q�܌�w�+��U�:��f!渵�wp"�Y�m��-���P�������ub=�����z/D��S����tƱ0�
/4(� ~;�?�@=bk!�dD�R�So
�[1�/H��������q��zd�b-�4W0^񺖝��:2,���ȰkRn���#�X����k�Bq��G����%�8ս�#��wo$��[ٜ^<K#[�9a(��u�z�����yLʢtd�Q�A͹N�qy)ב��+�:%�݈zK}_$� ?L�&����0{‹��[��m�$e؋�
䲭C�b!��� z�9��ݹk�% � ��T�Ź$����0$t��	�~����LE�sB{^�I��jz�NB�]��y�g�m�z.���%(���'�|���	��WU�
��=g^�$�h�����fڹ�͈��%%(M7h��}C��T�>����̎���g6u6�N�7��{eS�COn���7�U�d+$_�e�ύ� �Qm#6[�����"��̶�C'��Cn��2�a�l�,�eؽ���T�:���f5��iK3
e�x��M[����yNsp�����NԼ�6:����ΑįI��d��z�lq��g3�a%�r�����/���(_̨��w��|����5"�����pNe8T���t�����?�7��
��?V��	�O	𙕲z
���u�W9K��l���	�W�}B��
�9ͱck�&w�@>nRf��ƷT�x�'�Q|Lf�sׅ4r�����p���'JaW���w��6�o?wᬳ�B������q8�Y���g
���
$���ZN6_��]8v��p��<��ܽ�_�.N��?V���#��Pnu@c���L�h��a��~�C6��[$f���M���#1�<���OI;��q�7(��ړ.�vܵA�Z2���f�k�8$:�1�����j���$mA��g7�g��6���ϛ��ze�<���.&�uZ��J)��v���E������\�dE!I��Wn8�K8�����k4�A�B��U3��CEk�ծ�<�n_{���ʙbuw�[_q��ݣd�I9�W�C��Ԅ���8muT�
�K�CF��1�������E�{���c���ۭ��+q	�I�6�Ef�Q��Oͫw�4Qz�'���9�Si4��ې,��)Sb?��d/>9���x��=���s}�=�0T�x��Q�	vk{%+�h�\遣V�#V���Xz�_�J7Ҵ�MT	q�T:�s�:��)���Z��#�ks4��*�嗽��ǽ<�J�'��c֐�۱g��w\W&�RK�8���y����v2M;�o�c�_����[�e�T�e�i��9'UI8�8Ѿ��^^{ 8�
��UO���o�W�
�M����tә���I�D
�;��+>�~�7��7�H����~�s~rKK0=�~��C[?��r��f��(����C��ߘl�;�?/����[Һ4�3�~�q��潰u�P�o���r��c��಑�#�o��g���q(%�;��
V6�ׇSm]����ˠ�UA��u�q-���շu�շ�7]���VkPm�f��D%K��Y=���3Q9��p��a�&��K����zR�ڭ�{�_:Y�D͹�)@J���vU1��Mq���c_9T�i�]7�Jy��pC�p�S��ґh¬�����^��c*���7�,+�n5_��Q*��|����
v�No��f� ���kk>P�<>q�	�B����"����*u/�y1��y�Xچ���9�=-�Pa��d��LP����c�)�/j��sU��p}���_�qq92��������k�F���N:���p�~��Т���'�f��U2�a_٬�HK����dž]����6"�,=t�;��yUӯ��җ�f=���\�#B�~��=�����!5�_���d�;[lÕ�2p(r��"�1��co�驼�[�WqҶc%A��~{�Z�^j��%AN>\��5ۤ�S�Y���D�]6-��6<�T�3FJ{�%�*�R�p|���H�+i��[�yP0#�}\"6�n��<v%(S�]<��<���%+�渮_=�rZ���s)x��x��Y�w�7"Y^?E��N*c��u�d�7�Q�/ښ!����c���s�@�p�!%��Po��y�(%�����sw��FQ�`*�F��	�9��.��״��R��q_�驥�FM_R�"��ե~��4/��	��T�׹�Q~��OC��8��e�����k>!�p7�}~�s�F�,�vi;8�Z�`��XkR��U	=Y)�ʣ�����M�K-
ud�.�ܯ���'��+��O��W�jm�H�/�;����,I��B�����O/I��w��5w�B�R��*��(<��w�7��Z��Uw���w5
�b��7��X�|�kH�2��R�R��'R�mM@�*�TőZ��a_��M�_'*��r��p�q.�Ub��rçȾ%|/���4�4Txwk���1Z�+�8��8K�㻸�Wi�Ķ�9��Um3-�}��agM|��[$'fR#:�wt�͵4b%�Q�5�u�K��J�)���n�1]�ٍ<���y:w�XpOW0_š0-@��J�>ӻ���A'��� ��z�T5n��P��������\g�eo�|?]���@R{X�-�i�)�{k.k�%�~��(��<���a�P���CW��Tu�Y2�>0�U)u%�<4�����U���)5�v��;�$ڧVV��\������xe�����6�T�E��%����4m/S�_��;��@&9����ٝa���0=�}@a�g��q鰞��~3��]���+��v�_��{�R��YPٴƧ��b��v>�a�.0��(�jZ����ڈYvWo�Ύ/�P����X��	���{X�2c���DA�w>6k�w�*U���&N�UN�W9wC��!�W24�r�I'�+'�4���q���%����r��̀V�[ʟ_��5�q���m�����������N�/-�q�0�h�T�nk꼡���鞥�����T���{���_swʄ]ob5?�P�#�;�7,���+��j?;��u�������7�}zSu����5��/��r�_0���֦$�#�?����ڐ��l��_��;cZ�����ʧ�
;k3Q�M����WsS����Ҧ�R��a��0+O��#S�K6�+֦������zO9�K����{\�F$&'e��Ʒ�X2��'�yw��e�?S1��
{϶�ĭ�
�.9.�g*�U���K�D��{�)?�bR*��L�s�?yB��~��c�&��.۽+����:ϴnq��zO����CYu�}�y$}�z��Ǐ��o�k�<�g�M�S���'���O��3n�q(n���:����0���8~f\�]�k�nW�ʬ�R���ZW�eU�C�$��5W�a�G�R�]�R.���R�S��wڼju�p�J�\
�N����8B9~��e�uC�|�KZUބe�jd��&T+�*�|q�\�*}��:�Rs�����TvdR2Ju�$N�n��I�{��[{�KJV�aՕtO�z��M��\���c��$���o���vw����W��b�wɝ�\�c�Ҹ��ѱ�ͱ׭��<���pw�W��d�E�=��ۛ�N�����5´��s��|4r^G�)T�)��ݒ8�`=�o�.�6?̙�h����[ۇ�7ه��F���‰��"��	m�+-���j;�qdy�N)��<��<C��-�>!�"�L�^���IyE�l"8@�
�y�B�@� �`"����~Ep�`���v��8��	_�A/�h�16�<E������~�
A/�A�	�d��&x��]�ONT�F����&L0� �7|�K�l"�Cp������6t%�K0�`$A��`�Q���A�i.��W�zl�E|9�"�%Z�o[D���_�Ѹ���H���ri<L,���~��k!�r�bff��r&Y��*��$�#���4�E�?�FgL�?
&F�Qb��&B����&b8��b��Q�N�.w��Hr�����M�avpV��<�f�Ֆ��eg��=2++g��	��6�A�Z�� ������j*�9�ҾS$ҟ1��H�
C��!��X�"�C��g$�DT�k7
G��N�d�	r��N����0���i���N�S��|���o>�2�x>�\�(�<����-�B���BMZ��`�T��!����{c℞>¥��$��jy�)7;�3�ù�/���\1���O,S��:�\�!�tU�A�����09D������*e���ΧnLx�Aa���Yt=�5�R���)�������z9��8Bz&q��1.y�bF3N�7����\/�^��Φ6��l��d��L9�R�IZ���g��R����3�Ѻ�������~GQ:��r�s���a��^�;�.A.:t�t��GAZ����m��۹D'j\���we}�%����^��՗_߿��4�/��Ǖ_.�ҝN��(��Ө���u�&E=���N�*f2�=4�R�Prz)^�Oz��Ρܬ�j}���
Ngi�?��rl��$�,� 3Wo�{�t�j�\׸<N5�����y��S�;UK]O����9,]���}j���[U���A��v�B�A��T~���/�P>מn*�N�z��W�o���N�2Pk�����{�4s��.y��c��I��]�Zv�·+���1���,b��̰���G-�4� ����i��>���d����lK��O,��Q�7Ý�d�����,�2�>����M�,27�y��	5r1����"3��F���A[��z�%��L���]
#�D�	n�b�k|��B�ߐ�d5U�{��H�^�����M�b\5�N;�Vj����ן����'�����7�f��,�O�{voYƊ�jFs-V�.�P<�	��u���t�%��\���"Yj�܎��6a�ˎvC�;�5�,���$0�L�YO��y��5.*�:�:^:>:z�z�j>�\y��y� �T�1�=Qq��ּC{@�|�[2הl� t�Q���@M�D���ʴ����i�����񱻮�ԩ��Y8���O��Y�ii=fq&	T���I֩�\��s���wN��h͵鎑��|�?�8�8{6ddn^�aj�$.?��<{j�&5����G�Hi!�A�f!
�G\���6{^Z*�18/�m�����5�dkZ�U{eWm�9��h��T�"�#�_��{xzy��6j�įi3���Z����[�nӶ�M7�7�ҡc@��]��z[��ݺ���+�w���BB���a�3x��ظ;���3a���Q���nj�k�	w�ܓ:qR�5}��{��f��N�˷٧Ϙ9�gϙ[ ��?�+�������o(�0W�+��v�y�?�k�3Ɵo�s��?=������+�t����]�SK�j�ܯ�F��D?�Zҟ���w�$kt�~�Vzk��·l��y�E�,XX�ȹ�t��e���z��+]�z�c��]��
O>��3�>���^|i�˯����-[_�ͷ�޶}GY��]��ٳw�w�;����G���ώ}�ŗ_}}��7ߞ<���J�w���㙪�~>{��.����՗.�rG�pCM��4�����;��W��K��&Z�x�=5��;.���K���2�}������;.��
v���HM�?�b��œ3��rf$�Rm�C���|kޝ3��l���9yS�#Y�3,5�9ɖ1ݚ��k�e7�]MF�S�����rf&�Ѥ�bf��xW�1�U}϶ge�V܀�5b��-��=cbb���	��
�C���~AA�	>�ݘ�D�{��C�3sg��K!���%×�|t>x>P8��2�x��-��(���b*���„…�k����B�O�$$� 6s�…�KP6S�L���;#7�V�XN�5|j'F�ꞖEJt
_FeL���m���%cl��rd�?����G�㚢����R��1yy9y�l�T{��)Vě��N�Ȳ��m9�\k��:�:�nK��t6,�K��3�f�Ss)P���O���&Ϛ�fN�˙J�9��xƛ�D�P�u�B�i|�˙H����<�n͛��=ٜ�]�o���"ߖF��s�2&�!t�#f��I~ּ�"��zf�&i�L6vS��xd�/ԕ}f���D1����]�y<�j#g�̓rҬ�ts���ԝ����qN3�̉�rm&	O��\�xjjj�PZS����J"�t�N����)։�䘕�m�o_o3�dج�������t�5�ܥ�=?��Č����]�u�FV����ɞjͶ�2���5ojFv*"��6͞c�����$U����ڲ��s�yb����(C�j�32lS ���<��eg(3�US�t��eL�V�4+���l�Z�G
�re�]:v1�j�CRj�\]n�B�ee��@��]�+�4̇z�,o���o�j�N-EF��:5�6�֫�3�DJ�T�c�R��L�j���7Kt�jKW�1�����`g�������щ�?�e�ܟ�c��u�V�-�b�<����IT���S��.|~���,kJ��~�O�ȷ��A�wn�Dc���@���~�U:̏4S�����YS{�U��ru��]��nW�������������"Z����N|%����������b����ݠ���0�R�+��n�cj���u��p~��/����Y�@��ī�<���tu�&_=��v��8���t����4v\=��]�����?���4�����7y���!o5L��m1�+���+��^�R�	��>�����Qk7�>�h\�vCèJ7y&Z��&�ڦ$�i�fݐ6��x�D7|�3,cbf��Q��ڬ�P��Nٞ�G]��ۯ�ɩ��9y��5gY��&S�lkŎ����ɲF��b�k�Q)������Z
�rjw�
f����5�yQ�b��fj�N��9i�,�`�e��NE�'=F@Ӯ����,[ƠY6먜�4kԔ�<�F�+�LҐv�-m(�����6��i��12--��	������R�WS����Ts���H������3rx�0}��(���BLg"I�H1n��<��%z�s*�\�"q��ȄX�ު�Cj��.V,�Ɯ�lR��A����\�DK��v�s��yT��f�"�ud*R��%I�IjLR���H����֔����S��������K%�$xװ�Gl~�u�}�dk^1���5Qy6bmV"�"��1̚:�z�����䔚�q_]����܌�;���k�V+ϑ���٤������,���#��@|{�s�������}ۇ7�Wq{��q����(ƽִ��Iy֩\k���c����`|KüJcl*l=v'�d”�H��%��=���N
KL�=2*A�~(�;c�aoL<',3ҸR��<�E�S᳄�]�I�s�"x���Q�E��,�t��Mg�H�V'�f���K
�1���x�W��wͽ�=*�U���j��`�cA͞�"FY���ʘt��i���1u��|�u*�*"���W<���\�TkE�,>RkI��j�Q[��F�;�O!���Ɠ��坓7؊C�.��n���S�� {z:i�X/�j���gu�F2R4p-)5/Ôd�!c6Ҫ
d�.��t����k����fUj4|�������0�H���;��^�9R覺ҡ=���u�ҹ���߅����	[�t���L�)��+\	��8��>B����F��X�kb�A�Ӥ�믹�{��4��-�{�=R{����8#5�D�L���坥�O�W�����p���j8�����C�/��YN���Ǵ�u>����ܷj�}������Qy��L��ҽ!�?�!���Gj�m�E\�{������oF��ixQZ�ox����.��($x�~��黁:�{�Ϛ���ת��I՜��q���-d�
_���zs�λ����|��#5s�?���'ڈSO(O�k8����6�:���>f)�2���2���_�U��s՘�oD��k�x�`�Z��+$XLPD0� � �`<A�0����p���A�t% 0�"�#�$��J
���	N%8D���u��6l XFPD�ȳ�O�M�6�,�4����!m��	������ 8D�����u�M��%XA��`!A!�L�\�{�Xzk��#�#���E(��N��`5���<�����8�o}wW�{��'��x��4��o)zk�K��oz��5�:�����^��(����ӵ=f��6���u� ��fX�?���M��6(k7-m��UP�"�}�����_��?��͖����p���J!�\��!���Zr�|�N&�"�
�|u��(D�"c� ����#C�qG����g�A@��p_р�3
��ހ��܏6��㎾�"��r
1��\U������{��n�ߚ���nb�W�{�Q�ߩ��,z��y����{ּ_��{T�K��]��p̡���X�_��t��]2D$''���a��Ղ*,��B�b�
���O�7�xC����O?�T\�|YhU���n������~´wƌ��zP��.�1c�l8#T�.��^z���3��g��r���&P�3�:��g̮�"�=����?=�Z}/@�����ޫU_^�wJ����P�5}�=��?p������5�W�))���7�W}�ׯ��<���ՋT8�4�~y�X
P�E�ӻ��[޺��A"!��=�¼g�1)�
��Tܫ��)�b�˷��G{�����7t�x�����py�����Q.V,,����4z��j�Fx�o�ꋒ���HBQ����8�zs����-|j��-�ۗ�(� ho�B�64
���/�( �������D�^B�5Y�#9�ݻ���������%�˖-�=��x��X�?��q��)���b�e������$�Ͻ_nI�!
v�ّ~o�(�"J�!e�����{~�%eY
;5N�����?5z����z?Ofʽq��rs��[�eǸ�)�@�߱y4�{c	�/��6	���۾��i/���*������	<�0�|f=�:u���"((H0@DFF���X�݈#DRR�;v��0a���6XL�<Ydff��S����<n?�̙#��#��
��
��1b�Q�H�*�"ޚ�_�P+�7Ql]�+�,�CZ��]��wJ�s������H1�})�>��cR��Z�|���H1���K1�{)�͛'JJJ�����#�<"V�\)V�^-֮]+�|�I.�M�6�͛7s[���o�#�6��?I��J�w�yG�߿_��������⣏>ǎ_~��8s�8�'N�`������|'��U���*q���<�=�H›��w��In�PeoF�,�dO1N���4�B.����#yXoOEK�߁�Q��K�'S����XD�WS�)~���4��L�-�.�o��K(��'�?L�R��(����⟡��
�{t��,��4\\fb�C>K}�.��6�hO!�!��iB~�\Ȫ��<o�ߒ�w��A ŏ���VUşE�Q�5�%�_N�?����I�H���K�ƲF����T�#��	9�⏧��Q�G(����!�h&čTgo�D U۾� I~����]B��r�BN[-��W�|y����6�7S��şH�gR�%���o��{)>����W���N)�A)dP
(�')�ݔ�	J���?����)�O���r)~}Y��KW���ŏ��#)�$�?��/��+)�S�5������_P�JC|_��S����ߙ��N�R�1�_L�;(�1C��O�����E��%1춮�:t�<��9(.66::.*""2:�[�.]:�QO!:���?�,��)��"��!f�?.>*&.�������r;t����?6�E�W���� �?�۶�1�{w5����;A|J?..6".��[�?��B�#"9*.�m��U�1�����u��r}�-��9�-fď��o$�[���
�a�!��?<..&.�
h���o���k79�?�J�M�)`��b�c���c���
@�]n���G���G����Z��ڵ�0���Y�\K	G��~ϰxbq|L\<�9�'�S�{Z�B��f��-ZP�J_�K��`8��<x0����e�2�4����'.n�D�4X������<L^A)�)�1��t�F���ӭ�p����v�,Ħ���o����|(a��"H�j�#��	
n��{],yF
"Y��;*��?%eP�a�|���5*��F��� w�5u���?*��5N��?$`�&͛ݙF�&�1}���<4>��k�F���M���bk{��C�G� ����_�ې>�&6�oW����-eY�ESa�qR$�}���W�+u��)�>7r�H�G�Z��t��g3bĊ�(����ѹ��>�)����Iߨ:�L2~�a�j�*�f��n�:�a��^}�U��|�M�>.{Z�"}c�
�w�|��'��Z|��7��ɓ���R|�����ΰn��/��K�.���x���nhg{`CJ?��^.�D�,��RG��h._=�v1B����\~!^�����2ħ1�F���.�����G��Q�i�_C�_���)~M?�=�?z��zJ�
hӦ
/���Y�6�:���'��1�iӪ�-���o��f����v�ԥS��[��{�[:v�Ba�����#P��p[�75�ќ4k���v�t�ڣI�7kfs��z���u�8�^׬i�V7�֣��o�F^^~��Lm<���vS��p���z7�=�������ʽ�5�ظQ�@�_�tj�ю|)�M�N��k٥c`���_��-00 0�@��=X��ue��$D8&�<4hha����D{u~����A�Wmg���?��6������W�E�/>���}��`*� ;7jԈZ>�8�GQK��a���-]�k��{�����d�w�:s�̿~�����|��?�"��s�Ν�q��/����{�:������{h4���')�ß���u�;w�H&x���7n\D_z���O?]J�h�c�y��iI����O0A%���kI�o	�AR?���(D�?�����A����	΍B�D��\k��I>��	a�N�|������kǿ5� ��H�_�~��������7ސ��|����S�N���_�СC����qHG��I���/�<g�֭sHe�q8w���F/Y�$��j�σo������z��޵����t�,�gϞ���,�رc���N�����|��A��g�1�T>�;�Ǐ���9��&H�a�d��O?�t���wJS�����?�|��?~��o������R}�C8,A�?�?�S���_Р�D�ӡ�u�K�����]`t��w�ڵ�ʱ�Dhعs'��8v����'�8�NPf�ȑ#�(�(7��y��!��r�|��4>�;�Wß�p�?�����%uC,�!!!�!����˷�zKR�Kҙ���(����3�}��q]9z�(�A���	��m�QJ�1)#>���~){���1��^&��w�|��?��J�?����ۗ�!~	��(�����+�AYw�Q�_}���9�
|!�x��(�'��2�)-JvP�~��G4��6���6);�)�/����^�g���_�,t�+����C�J�1�4P�}O�^DC��R���2���A�]Kׄ�� ˋ���;�,�*�+h.�#�X�;x�2��@���Ҙ�����s��AI9�p�O4�!��=��qDʀ��:q��S�!���O���-]�W��
��Ӂ:9�ܣ^�&���R'�H���0���4Q]�}��]w�y��-^ީS�>TKP�ж�Gd�!���~������TGA×R�
1Dæ�<?<�������~��t:�+�������7��'g��G�Eȇs,��]��r�R�8.e<h�L��$3�z}ޯ�g�I�������j���@C�S9/�ݻwjϋ�?�.�{�u]:tZ 됣��&��.�����2
x&TH9V�!�k)�NC?3�gР���h��M�Dm�-DC��ն��y��ߡC��S�~���@�E����u�?�{��4���p�Ԍ�	�a
р'����D��c�7*
z}
z}F��s/�}�����
���8��ß�{��kK����t贀�
��G;�y^�|�0���$ѰΦ�F�{*�E��Sj}F��yM}
z}
z}F��-N���Q�п���РC]:�#:-x���Wf��/�&��I4L ��N~��JC
�0�4�`��qZ}�<��I!���&u!:�Uo���~��O�>HG)�haBf@t�����2����΀���P�en�|�hx�hx�hx{e�<w���
�s*�I�^�5����G{�����;�,t@}�
�봠�G{�q
�M�U���l�"� 6��/7�������!j��O����$fDI��(Y�-����W�b�:FwM�hj�Y�	�%�x�N��x�e�6ި�����]�mD��D�ks���Ϡ�	���
�@C� �`
ѐ-��0
x�&�7�}ީ_��f��x�g���?/��`,��ՓK�.�C���rG?��<���«D�KZ}F���>P��(W�F��-riV�t

�9D��:��G�o�?��?�uhy��ƍ��k�C�q�ïʝE�d�����h@�����&�΋���Z�?��%D�"����h��/�6)Ҡc�ZY��u����…]4ԥ�j�\�T-O�?*�Y%w8B�[Z}~�P�7h4��h��ђ{#eI�J�1�F��4���+��(s���1".;;�]��:0w�\��(_T&0Q�ꎱ�{>��K�@}.��s���G�:� �}�Yֽ�˔����ӧ�h�W+<h�^�{
��h���i�i
>-[����N٥K���"�|�I�~9??_�l6�x�b��_~�%�;Ѕ�x�o@[]�(�xP�>e�տ�xc�tW}�u��Z}^Fu����M�����֭[����촴�JjG��x�	y�w���DYZZ*~�a��2>�_Ѐ���N�0��)�}!��팖>
���w7L��1��:�3ڤGg��?�������σ���/�q�͛7o�:,�OΜ9SR��x��;XGx�wX�;pE�r����a��e���:���X���S�l}z�k����W�\�� �[�˲���xʎ;�[o�U�n͸�
#����L�i�m}�D�v���gU�@����(�������m������5�?�X�B�]�|��?�/w�u����b�Ӹ�e	4�^�N�:�҂9�Ð{�Ѩ+���8nБPv������+���� 2�ݵ���_�����grr2�N�m��&g̘��>C������_����&���C��>�8���Y��7�-�?�Һy��}�z'gϞ�����A��1c�et
��c1�א{�	2ڌ��
�-�G@@@��^{m)��&���f�/�9��v��QQQ�b���ݻs9�q��Q�l�uC7!Gh Wh�Qv����k]�`����}���@<,B}޶m��`ސ�Ӑ��*�
Ʋ�a����aިh���]�uu�
&�/S:E�Z��P�?�{�nE�k>>׊?�5�?:_/*[I��*�@�-I�X�G��z}>�(x����W^�/��"��/�����O
�m���M��$�B]����ߠ�������o0��u��u��S�r�Ju��7�5�o]QP/Q&���d�>;�E�<П���v��qw�o�U�e��.��‚$�Y�O�⠝A[��1����s�k���,�.�u���]�v�>:�o�A�w�82����9}�e��Xׁ�C��sԡ������F�GQ���KḺ�?^>��#,�F��p�%�:��w}}���5�����%�K�A�C��G�������v˖-��Gey��0t�s�Л������|���㿂�c�h�a������v�Z���_��NТ�N��SQޯ��P�b����H]�}�S_�C�
堯ɡ��a-kP��S���*��},u�2�~��X�@�`�ٳ��]����QH7���3��Oj'\�?�}'����G�;�c�9�{��>��r�;�|��h�hL��D�ߍ;�ٽ��7$�ƶ����!�$G�IGP��Я���qǃ�Hn�7�w�Q=��:�3fTy9bƌ�BDT�&�f�C3�4S�M�[��
�jf�߁�fJ�t�L���L�f����,�L��n0k��1����
��UtE��'8_g��w��ԝl�A^�H�
�>?�j�� }?��||���Πs_/r����(��o����Ɔ�`�)��%����g��j8��v^^^�hl7���E�g�s�B�m�K�S�t���'H��${zt }����:�B�����~tVʃ?I����*��Dm�z��q=]��D�?�t��g��=B��Hk�Xo�:�W0'��؏�Iy��kZ�m�vz����>�`p����G����VC���?��Sj��ƃ�N�ic}s�Xc���1�1h6�2��=ƹ�z4x��y�7���uZ]��Z�kU�M]�z�ԑ���C�o��_?�:&�v$�<�mp�R�|���&~�������CXg'���2�}
�_SI�M2~���\���r*ρa>s�z����S�=����xT]k��kTX��:��8�>=��4�Ϟ3gN�q�[�gaB�~qn�%b>��������:�h��h�և5&�c�6�}��c\+���\�l��'�OW�cϝ�N��6�Ǥ:����k�Xg���qR�ʕ+��x o�9L<XoÜ*�0'���?\3��7)���յ6�	�w�^1k֬삂�L��+p��	x���XkzA[��:�C!�Xc�چC[_�=I���g0,��j־��_w-��0ʿ|A�wa�s������X_���qi��I�y
1����:YIII��ի�P1އ~��x���n��*̫>��m?��/�N`}k���h��h���u��˦�?S_��c;�mxqN�L���^'���&m~}��N`�ɩ��h8�ay�|�|q�v���g�����,Ƶ;��֌��|��X�VWD8���
���w:���=�Xֆ��}\�7<��G�Ã��﫩�ɣA��m��cϞ=;{��S���K�r��v}���YD��5���H���'T'��cV�k��j��O�<�t�c���.���뮅�e��xgy��:��<��'5�h���Us�"�z�J�]�?))�DDDϻbm:##C.Z���w�Io��ޜU����+�pD��<>1k�|�\Yy�)�l�Xf���s��L�8qoPP����{yxɒ%<w��}�s��m#�Q�Oƃ4)܇$[W��u�6��=���c]kK�g�q��1�
�5�-�׿�������7���7��a-�Ʊ��<�
�M��|G{����2��!��@�DuVV�d��|ґ��c�?S����˦L��k<��=z�DY`}��e�z��ˡ���nR_���~J�q�� �-���t;�s��Ḁc]�ø��2@��x��@��6x�رc���5
���/N]�n]�>�F9�ɓ'��@9|�p�M���ׇr���.�W^����_Cޜ?�D��p82�������„	x��a��/�e��@o'V���]�ם�2�I�?����ߪ��(/�t�M>r��S2o��P[��}x�:��/�,׬Y�s�h1礯)�ż9���%Ы��{��$p��a��O[�nտ��y�迖9P�3h�PΛ6m���@�(��_}���/���o
>��#����{��=�ƽ��xB����}���}C~$�Q�?��kO<��yj�~|��'���SO�jw6n�x���y��؝�x�_�>v�ڵ�_x�.O�C9S����i���g���8N�w�cc��4I�\�*���U�pR[������3z�B[�R�����~HjMオ�c�>y���c"�.���:����/[�6�W}ǡ�7��9�n8I;a���+�
��Xi%ᅵV�Ɂ;��>;7�u��4[uNMcq��0�ø��wB��N��n���M�4�O����0f�PN��oP�z ��-�{��kB��xc��Nc����o�ر�΍6|8�{��R8�Ǔ�ݡ�c܀����#�k)�!��Z���A|#�u5�%䥮.~�|�s&�tn���~��-����/���܁��G��Cgp���x {h�!�(ˑ#G2O�N�,���|e���s��;�o>�����۷og]M��6t.��S#.��/7�?�������O"�G' m���㣝�H��ZhB���$��8}��ݻk��3�gc�?���@\�0>���&|���ϧ=��57���o8o�]�\\����<N���Z�AAj넓ּ��f>g�[i�S�|Dxj~�u�ĬY�S���t��e�ϟ4�:55��ԌIy9�9�n�r��O͟�}z�橩���|[�5/?#'{@��݃:l��l����֕kL-X�G1��y�Y�;��Y��)kZB^��,�dk����×�"ìӭY�,�萚�==�^k^�=#r.��!=5+��a`x�"�dޣ���{��5���hz��s`BdBdtt��!c�h����}���x5	�.�}P� KPB��AiA��**
Z�l��A�]�sTO[�=_�F��=W�ثQ������6�L���;�wR�޳{���K�����էK��>c�L�S��}^��F�O���s��g�f}��o�����&�}��}+�&���_A�5����2<� da�Ґ
!;B��4�:0��%�:�ԿC�����X����¦���%���·�o�:|Ԁ�r�7�`�����=�pz��@��-�m`�@��7|~�;�0�
["���ܕ4&hV��F�J�ޫ8��~��]�g�-�?"���.�x���C�T�/Ã^�,H	�
�Ԩ�=��ֳOOqnqχ{����;ߧ��3�_�ZJl��PG�e0���ٟg��]44��&ƢE�� �J�j��FL�!�L��J�&`���X10��N¤h��D��!)�A	q�\����;s_�{��y��gϽ��V�L����B�~���W�n\�kq=n­���q/��o�2��"�dqȃ�G$��$�ɋ�|��!r�� �4:&)C����~��Nd��	pg�ƭq��W����+��ρ�6�{Q+���T�w˛,S�#2C>!��F�-���)�v�|�^��m=�G�6y��l6e�Ms�4�nsɌ�;m����M���F~|Z��*j���<��:�N��թw�qZ�o����%hZ��ѳ��CQ.�<v�J܈[�_�����xO&SH,�A�%I�#����d�N�I����^�Dѕ����x��L����;�����c�6��`��Ϳ������N�䆧��1�Ο��/��5^������x'�!~��\�&���a��=�ݛ�;M䈟�߈rqX�+�D�{���;�5zߗZ>*w���$P��d�Z�R�`�����^�_ү�]:����`�M�Km�ͳ��o�?�f���ho���3$��|��	$�Zԍn�ux3~����@���f�OYD���&i$��R��^���Ox!�����gb��+?�7a<{�)������l���R'ӡȠ��L�(d��x4�����.z�����|V�����术�����ݕ��jo��]��e�l���1!x{]#7 �#�6�H'��F��u:�e�v^�rD�X'�f�8#.��BzA�-�O�^�K��9�~U��w�=���cP��ϲ�v��bK�v;dGmd�׍�+s*�:��΅��v��ӯY(m@u�0jC#h����2�
���}�o�,��l�{�a�v���ky�����;�]��Ir.�հ,R��U����R}D��O��?��|������~�����?���f�I7f�9j��~s��a3j��C��Ԕ�2[]Wi��;`�v�G���V:�X�E(e��hڈ�ж1'�B��ˏ��P;:�zPƠ���!=d8�?�!��\�K^1j�Z������J�Q����O
�h=C?c�n���v���`��S����}�b�Uw�\-�e�̓��B�A^���nEԳj���_�H��1-&�wf|>ə�N�o�x���A��n��t}�6��t��<zt��L�&�8'D���=��5y]�9_z2���l��r�B�lkT���<���K��~?�_��'��f��k�[i���N[c�a0�_�ߛvʙ��C7ї06���d��+��́���y��}��+w����
�F�K�Ue`l�����OC��R�G�G��#JMQ�@:Q%)�48E0_��V�j�*R%�LU��XG�H[��c瓧:A�ԩuڡ��Q"�y��B-d���(�b�3p|�	�xG��$�d�bRMZI/ ё��p>~���eI�a�	�˓Y
Kei,�d�,�%�T��rY!+e����d�����A6�f�*��v�ܻ�Yy�O����PS�2��T4h�Tǁ�����'��TP��g�,`
�!$��E)�(�@�Z�S��Nիդ��:��vա:U�:��N�:�C�J��:]�t�n֭�1_m�M�I5i��ɇ�n�	�"SlJL������]���x��x��x�?ƿPKEePQ���g��pip/_vendor/distlib/w64.exe�{|��8>��M67f�,�K`�E�F�K�fȮ��F@@QA�hJ+�4�V��Il��m�jk[�������o-I@!!��!�
��Y4($.��9��݄�}��?>dg���<��Lуk� �3A�������_�Q�	���qլE�_�\R��J��Y��G?zBq>�4�#���N����>6!33���m���ˮn����mlz	�?��M���sM_ҳ��Ux���?M�S�k�Z)�*����s=�~�"�/���>Ax��d!xͅ��a����&{!�Wq�����{� X�G�}R$LZ؜o��B����^�#M�D|Ykޘ�2��7�O���(t��[A�X��r�М�����V(���A�C8v��y���`B������m�N!��/�W�'�lB�\�� ��ti��	KxF#�UȀ��|J���;�	̍po����=��	�X��sEcx�|��{&�����E������i/
f��:g�/���m� 3��Q&Avo�C�\�ܶg�.̒�W�7<�pr��rj�\E™���8�`�v���EPEe]�z��r�v\8�I��#󄬕����Â��	��_a��,W�TkL�����W�.%��.��V�n8n�����ױXh,�>c��/c	Π�\GcY|8>�=�K�24>���4���e�'������X��\�M).���z�ɬ�n�Z�Y��r
��@x�yqc���h�4C�J6�~@�vJ�_�������?���Lq�ɬAfs]����9�O;Y2vc�4K�-�'�/��nA�E���î;�$�:\��s=��-�=,��u��"d_��V��� O��Jr�Ѣ�pr��G�@q��x�U�(�����~m�([�2m����~����조@l��ڴ/��v�(��le&8�^l�s.��s���Ln4da�Z��.4
��\%���m��X�^��g�a޴w�0�N�����;+�B��K�ڋ�к�>�j�i�\C�c����(4���pי}'�(���H�f�5�i��'�&z�7��L�V$��'�x���蠵�}��`m�_��q셚�.�12$^c�E]?p�0�	��1�<����\"囕�������\Ďђ-���u��?{(�ϖ��S����KK���o�04�>�\�<�T��	M�_�!��D;B/��n�.�l���C���Չ0��p'�����"ܜs�c#qm0� �ڵ΁P�P�^
�.^}�]^�X�>8̍{����!�Z�{MN�Q�R�T��^&��uM�:,���l���;��ޱ&�e��ʬ�p|~��c�ӹH}7��XG��Uf���8�Q�v�����f+���d�	n�9|oN��
po�'�U���d`j���c8�@S5�Yu˸�G�5[��*��,?Q�J��a1lW��Py�{���p��u��j�
���L_�J�VB~�c�A�1��J�t�L!�'�Ćc�0{ϝ5��!�ou�jG��� +k��Cf�\�%�di�����0��%��uP��8iڋ�ӁNtQ��P��d6�<S3fz�g��L�!�i��g��
3��3}�3�wc(�����{�14���s0�2���U ���	��+��8��	�;9�����g8��4e��C��չ�xCǀ�Y�����ݎ--��-�Bhir�h������\s`C��2A�W�9t.0ݱ�9�6��x��tá�Ӭ��Í`u����������C#��P�G]&�#|��g�F[B�b�T[	�aN��=Z+�}��Ҹ�Bٛ�lx��pL?/܎D2�o����kC!�T�A��~��TWua]0
HGr��N˳��~�dl�fh��*6�2���L�]mL�e��V�7Mf��x�V����rŧ�jC$�	~K�K	�����H���4 ��p�qi�Z�z���%�g4ϔ�Ed��#L�פ6%a� ��F/�F�|:5�,Q�9Z�[��X�KT�X�z��9ϻ9+�E����,��������rh�1�R��Y#�D.N@�s���0�a	Ê�^�~3�����)�G;�xdm2B�I��!���)��=E��%�u�z7��л;��Aj <��[�-J�Jl/v�����~~uk't���}N�	��'b��b;�
!��)P�-y��ˍ�"��aZ�K�H�B7��hmg�kc`ր��w�%��g�T�\f=��<�K���g*bY~��&�����+���W"�;i1��BႪ�]��Im�n�]��Q�}�^������Q��A��$���.�3�$�C�Eܫ�g��HEX)ɿ-�l��t���(�N�w�=��M��)��P�**�U����}J�//�H�c"���؜}q&�G��o@-��U�v�|t��� a�r8��8
�E��޳�[	<|���01�qv4�W<�pܰ��������~�+�$�<hh�ԏ"TF8�4N�mrq�~	+���؊����CĨ�w�_m1��p���I%߼�g�ܵ;� ����!,-s}<����sm)'�V�^�31p��/5�x�[�@�y���@8s��I��>��
 ��f��=�\E�]{
���W�WR"�� �L�d.`���z{IW�a��m��[��o��*��,�����.-��'%�U��:X�!�o��#�z�X��H��(��<�G�x��y����q?gj�QY�l������D�0I1^ʩm��k�u�(Q|���e�"N.��L�M��� �Z�����*���������#�����ǦBYZ1���jʨQ�HN��jY���O�9&�C
���f�����>0�>�"���7��bmBc�̢����5W�����V�
ǽ�H2��X��e�j�C��m��Z$��	�`�����y~��:�fYK��V�W��W���'�g�5�M�#>�P�l[:������řb4�$�[�M�.=y��Gّ��P����2K�i����%#}Kn�SVV'�4��
�ϙ����8�ƈ�&L�b�bxh�ar��!|'�j��cZ�m�eR<�~W�:�u4��_�fx�.L��D���-lt��7��1]AƵ{��F!:<�v�˺iM��!���:G��Xa�����b�Uc��k�!�r/AZ�iș�f:pw��V�G��D�+wq@G�`�؋q�a8OV����-{zJ�h�q�5?%����e&��T�]�C)��ރ5���Hd�L�x�
ZMy/���a���37�f�/�o`IF�%�U�P���21�
�Z�L��,La�g����������d��p��]��@��%X�;z�3q��kO����ò�"szP<p��l`�L���ĠC��ǘ��� ;a�x�%k
�_P�6��C轍�X=�ϒ"@r�� �4D�����p<����;!���=<|���b�f�M0���!Bqh��|��kw�����
U+�۪Qʂ�{�Okp�
�2[[� ��VUCoS���&A�ʚ�õ�C�۴%Lf�Z��4�Ц�Y��UQ�̹�-U{�&�ۆI�TCRp�Jy��L��ٓ��6��c��[dI�Nim
�g~���R�P�
;
�w�Lb���5�����E�{��(��ޭ��A�a.����A�;�.�z�%�9�4
~\n)Q�Ȉ�Q��RT���ec�RP����Ӯ4�7c���S�;��"��v��v����Ұ�Km�G�nȩ��|�R��{��\��8Fr��YDP:&i�Ξ;�o}p<��r��'���vl�\��r��AF�QuӨ��(Q�R�Y�����F3����M�"Vo�[r�p�JA��H��~� �l����\uQ�"��n���M�RN��a��Ď����>�BΞe΅L(q¶�l�u���' A釄�r��L�-�$��A�� P����K�+Ǽ�j�������
�kn𴿫�+�@kg#.&UJx1�̓�`�ZU=B���T>��!l��"��ob��`mLj^N�x�<�L榉�85�&������O`� ��Y0����G��%\?Nm��S�	Vy��G#�m��0!̙	P3	PSPKg��>
�>�϶�=��Ė��*��"��j@&��N�j4�t�T�,v����o�Ò({ꗧ�5�e�H�6��se�0�rmS��@"j�iFG�$|�1n�&�nFN��ڵ��/L��g"60!�Yx�@��qZ�$��CX���*=C{lxbR���|l+h՞?\��E�D;�i(\1XA+�`�`�1;b�y}x�8�Qs�QE��jAL��<��%�l�+O�Ҧ�1����
�0��*���C�~�X8M!
Y^�W����K����f�P�HfۊXw2��ȡY�%�Ê\E���k�E����8�� 9:N����XPX�~��j���:�4/�VV{�`��=���'r3d�c����/��G~��]S�2H@Օd/��ғ%��
i�H�H���#R/��*;��b*�������3>�3�iz�� ���]�-���v�Mb�ث��M6�`�/���9�9�{*�>V�h��|0-N��t�m��o��Sz�̶z�W�7�=
_=�}�o�z��'pUw��\ǚ�}@w���U��QCy��A?"��]Z�D=���T���&��hI�f��"\J�s2r��%Lxfb‘fh��U��xdQ�e9圏a�Ah�:���q?k�CN��H ���%,?;Ex�l�E`Y���B�Np���5����ޣ=�m_������{n� ��Z��� ��~�vOlOC�N����A�����jz�=
��%���	{��͛eu��D4���@����<���x��(�j@h)p%�9�M��"V[d�jR�`�С�����-ȏ���b5$��bu�8C�t��>T��@X+"Nk����&a���"�[�̆��2���*Y>�ɼ�: B@�buR��:hv*/B����K˙�T.H��mhp��������������yr�HN����Đ�t�6���|3Oِ�����6`9%��Y�[�l���n�63�k�
��r��XcdJO�@�B�I`_�<n��lV&"���G���Q~f��o������xzZY^Z0��*u��\z
�p�5¦P�g�)�]G���:7�<�{Lq���9Oً؉"v���_�c���GMe����OΑ:�Vhme|I�x��18���]��9މ&�D}驮�,4��pm�Ӻ}�ë��~�A�	�r�;�lJ:f�Ǣ��=����M�Z��- �5�t���\��D�%����s�׸$���~�+<�_%��A�`�0-����X
��U���C�8�^~������E�#��$#\��҃����6mѭDV&�6�a ���@�d*����&�6�$���k�eܹ,��׎X]O)[\!_{��惽X�xB2>D�ߩ���E�+@��Ue�/�F�צ���o�h�*Lļ��,�KK���絗L�-�_m��q�t?{h��q~�T.����p�@���>�g?��t2�Q�8EC���
4�L���9�W�b'�
b�V�<m˦k�@�s�	��
E��u��(���T&�Q�����=�%�{PJ�-V>����ȱD�,k@��>�h;�����
�%���~��u�X������}�;��*랼2ހٲ�;�I����4 ������_*t��s!�>,ཡ�B�W=	$~�|�$,eI,J��*0{u��-"��@=�d�Q��#Q�{�:�z�4T�>��8�d��;�
=���:L� ��)�$q���Ҕ�Bn[,�,�D����6�K[�>#��/F����e����M�nN��c��/ڡ)��k/�y�ǃ���3)V�\R�cMN����ur_�mǷ�TT��M{i�}d%u�&G����#N�*�ܡ�[���	�JP�2�8l�M�f�����T�{Ikp?��Ʋб����B=f����Tfn-�aOӲ�S�N|rRP�ܴ�A�u2*��]��
{W$�I�E�w�Eq�nm
������C0��N>����^�H�w}����Y�b
�y�Vw��ID�P|���693p�-0�O⒌��W�GMF�p��PL����!�a����^,��r���@���;��r�A\Ȳ����֏��w�41���
2xNm?�R�d�~����;�����4��-���j]R	r+��-A%���e_����5��g�������K��!�I��S�R�۵�m�F��[��v�#M�0c�jt@�S�a�Ӵ�'q����ɽd��]P�����L�c9Q(�j�G���.��mBr���b�)ٿ!J�ׇ���AC��ICB��m�aCу�t��Q^~�O��>��([�m�������|2x�6=	����a�!��~�R�_�
x�z�O�����I[3M�	�ī!������{4�вdz�&��H��h��=���	��k������DŽ�:��筧m[����}Ԧ-��KJʍ�W+��B+�-�">W�6����K�WX�N�k�I��P�E�E�����|�;���Fb(�]��n�}����LA�����
���ʷ�J�q�8�wp��Ƚ��$����kc3Q��Z:���3�1��C�|7[�+?}���Hr�וG�H [�\A��LNb�ֶ^��^$LPl�
o��Y��:����y��Z��z-F1�3�Y�M�P�k-��n�n��T�P�dݒ��P�.�O����������f(Ǘd����'54���I�cP'�� ���&<Z��'����ZC3���	&{��l���Y��R'�^tPĞ���d�'�r����;.�ț%b�Ią�?�����E�B`�=��j9�3�ܦV
x:�g`�Vx��W�ٶb�/�
䒡��a�ه~s�ц|q�V+嫄�?<�?�n���0�›6b0?$_�'o��D���l���]�/����ʹ��hJ�a�8�y��ع�,�'�W��g���#�F!!60d�ELr�O#W���S��Yv��fc���4���,�Q����4K��Ns4�w&��M��| ̛�>�ܶt�l4��,��0+<
3T��gm鍾ʓ����Qn����q�GF`q0��2I�w�3[dn���x�K�SÅT2QC���Ṵ�}�_a�-gb�V���a'X)$��VO�h����#�Y�BM��@����9]��6��ɶabO�(��R3	�2��j:�i�L �����F��
�dֿ�]��y|a���=�xi�	��W�ی_�
"v�P��G�	KnB���������P�>�G�B٤�Q�T���9tu+����/�(2p���z����:nFO��P
W�����ur�n��\�,�mr}��p��]{@H\�x�k:<�H�C�1��]AH�qP��j ��vӥ%�N�hz��&�a<�l+p����4/�V\�c(���O��"�t(�Z����P]T��f��K�Dh;��Acl��Ae!���r�-�6��$_x5?K?Ҟ���}>�'�=a@�Q:�j3ߏjt���FK�1jt�2D�ܫ����S���f��L��H��mS*Uw&a}k��;bEĢHt�ku��=��'�H9�Ċ��T$]�b�(w��,�5��U�-��|(_���cm�.{�OX|��)�H�Mb%buWAd
�j�WBtRp��e���yuW����}	T|*��
�X��R���~�Dh�:l{�ڝ,VX�j��
����}�r|�Y\��O�P6���g�rf@NQ�_f,�Jl�n��>�Kb�����s#�*K�L�}-�̄?�^x�4�ϓ�Ԑ�7s��$V.�)�
oRV��n����h\�4����å,�X��D;d��@�5�%%������i��~��~QW��n���P��D)��hB��گ��q�,�՚HHd(���@(
m����qe#�\��܋q�E�O��Px�I{YE���~Ϥɹ&A���wr�D1�CPJdf��,�R���
������jԾ��f�ʬ\m�O���ԳA�W�|��Q��,�b��o���!I��mFS�Id���3��ZO[�U�2��7��ݼ�u����	��qj-�[�)������	�*(�Q,k8��'��yԝ�F�-���F�J:���d���#ba�4�Q��02���W��
�Mo���d��JL��_	1��#<1X�np�hF���pŽG�y[���I�9���";7DE��p����O6�x���O@�a��з�LTZs����\2�F��<�ю
���|
���Uڰ��J^s<�&�,�`�K`9�+3g��L��c��r�l8�A�c�4��9��V�b������-�����j�M��6i�|�����!��Ia٤��D����B�~�~�W�c%�'��e�I6�|�(��8�w�Z��ϴv�t]@67��~��i�����A�8�gH+�G�]ޫd�3�� �3��.�yҔ��onS��K�	K'�h���5�ȑ��{�`
)j��I�]u
����[�\h9)���T��<�`���czz����Qz�F����<ʼn< -�LF8sL=3_
���a�<�%)��0�.{���ho�+B�h����/_!��b����	���,���������X����y��.һ�M�3�:Np�����W����W�ōA4��2�'�R2�E�Q�6��W�6��s��-�n�W߂F��J�ۀ&��:�$[`�CWҷmr�,���`�2sd`X��O�L���|��ģkO}�p�8��.;�{���5�M%Ԗ�@0�p|��˳+x��J4�J럱��0[3l�ױ�%s4�ح��g���HD���!�{�5oZ\�~��/��Ͱ!�A�~u�`-�Q�vf�55a�"j?�?���$��\���д�7�A���#��'���3���=Y�Ik�.�k,��o��%�g�?689<�ī�C@���ڙ�̶��_��,�p�~�j��p:`�<D���k���[�g��B7�w�[�&��i#޾�b��b?2k1�\���=xp[�̿b�1v�_A]b��`-�]��d���I\�
/�#�S�?s��fe�zܢLP�'+��m�-���p"��,�W��Í�˼��H;�G]}%�����ޤ���
�"JI#��4Bl[���� �X��(ב8r��h�]\j�lI�M�D��]:�ϗ����� �(��o"���S0��tp2�&����y��핆btj��\���)��s�
����v����l#�$����?�9��y��Y��YЭ^T�cb>�<���n�y�9���=�W]'o���,
]}��&���� ����>��!�z�=[��&�=������%�V�
�a�v9�,Vf�YB���9,V�B��^F.���\T}Y��ipZ�D����^y�e.NBE����ێ�6m����9��D�퀜��?����,�'��J��ī�k!��"�9n7w�	i�z�wB9Γ��.4I#�i��1�\�Gacy>��+'���j��i���U��0b�WC���IAɡ
u?3��S
̇T�b�+���8~�0���p���\w
�kN 2������xJ<Rq�LvCm���b��h���8u�������>����9�ƺ��wPD�d��1�M�I׵&��{m��?1�U�R�2��Csxh-�a<���2xh���+�!:�v�Gpůu�&��!�C�ߔI���t�V�qsD���#�y�ڤdΝ���W��*s���;������UTrPE:	�<������Z�I���V�S�rl�'Vu���j����ױy�pP�ϺHI���hy�|u5-��L����/��7�̿���/� �`$�p[���y#��|�h��Qv�-'i��wgi7�������Q��cH*���5\��'#���2�&nW`��û9AD�b��#"�#�D�?�X��-�3��=�����N���T�5������Kg�h�7���6��&{�J�c�n`�܇<��8$��sʞ}�~L��ˑ�D��0��QR���F8�T;
���f��u5OB��`�ڨ��/>ܹ��鱎���}x]W������'�ͶбDŖ���{�+���-��&��hz�
G��(�0g����?����	JI�M1���/�'��fw]y>��d��g&3���m�(�&��ƥ�zI�.���$�Y>�MG�Ϟ�4&�̛�n�d�=��~�-��>}���z?n�'��h? SCetQN��{CT!RBAV��Fu��GL1RA�M l}�m.����ҏT�v5:����2���[g��Z�%z3�	�ka]wX����O��:�;�V+�2!7j�zf�5��X��Y�9f��~U@�\H(7�W+jH6_~���ӱ�;���8��4т��A&L�3��XI���%7��C+�/��렆G��,��͘�W���i�������D'.��I7S'�@R-i���{�2����{g�&�q��f`�P|��ص�(1����yPa��c��?��8;�g ��H�R��j���^�z�Hƨ�����5t$@���>�y_�.U�J��Jc3���Ϟ�)-������w]n��9Ӹ�Xnܕ����1��9T�r%W<�>�y1���Yͨv�^�e���V'���"ph��s��13�Z�@r�%�l��a���s���31y�0��S
���s�Z�J
�_~���u_>Ï�g�Ff�Z�z����Ď>��<Y|���PiȢ7�{�8�<�;��?�`M��{�rY}�:�k���H��$۴�����X��7$�e�ȗʫr��2�l4���EsH��?B`�Uv)<5PP�74/#�g)��-���A�k,���xh��r8��.|���W��M��	WZ��B†n�~sW��q���ŕcKH*;������W��W0N4��-��W��zOC�5^�}�^�'Dߧ_+������y=���r�$V�Ԃn�qj��MIkR*���2HU�K�OD�]/k�'��KPb^'\��l����ݗA4a��3����wZ8h7ͼB��%P��%$:u��p/��K<��;�U��{ �Q�4��ԲT�o�1��{Y�SZ��*���S��Q�Gc�5ج߉�yO6���p�S�]n�j“�z���~P�%u�q�?(m�YxILl�[����`��&x
��y
��v�4�ƽS6~��d
2����������:���:q�<��s�8�|x����|��iղ�c�G>�B?���:�B�� cP��G��l�N��k��� ޮeԋ�ѼP�:�w��˞��&�縨c8��A�f�3����>�܅�&kF"�jȩ�UϝBM����q�����!a��U_�JHF(x��2+f��-��c��ܷ���!Q��h�dn528�H߼��3Jf��m�����Ċ��Lܼ�o>!�u�j��4Rnh�����F��m5�7�~��W7;Q�C,r+E�3׈Y�'a�C�-��3�������Q��꼹����ysL�8q]��N6y��;rvA��eC���,~�^���XR^V�9|��Zāe6�߼���=���@�ˢW#��h�(֠��X��f>2j,6T��P�o�Ħ�C���j;`��d��\�0�L��npe
6�/��8��~?��?�����>�ia�uv?k���0)׋��$��m�P��7eKk̒y�d3al�y��m�	49���W�lE�9'�`�ʿơaO�1��e��u��L�
|h��6�m��r��tCg�S�+�;�>�V�"��L؊?go�A��,	2�y���i�
��Ӵ���B__�Km�X���0���h�f?���j�ظB^v�Sh�\�Y������6��{���/�>m�j(�c��>�@��E��3���Κ�1�R��cQ~�v��h��W(�;�%'7�6��i��)��d���d۝Z-Y�ZBV/�(�����%#d}_�/v�
�@
�zֺ�!o��S�%R�B^t/a��O�~L/?���j dY�:brU��~;e8��j���U���]k*�"��N�h�?�s�#�k)�#�!�݄C�9%����ㆡ�C��a�G��#����W��˸>P��a�F��fO�<�:ir�:�૥�7Y�7���ā�$�r��
Y$3a�r������}�ai�T�L;ɱ�#�O�P�efG�=ȑ$�+�����z���@X��-F��s}ɯ�.tY��R���a[����Y��s/
������e�z�Y�x�2�݋��m���k���@��'�|��F��ÙO!a��+?���B5OΕ�oQ����.�J��A�@�,��W��1��J��>����ll2$�aDy��v��0�66�٥m�q�M<����o�}	b��'\�4L��i�~��L")��
3�����O��}̞?�C 3�,"q,Vm6�S��"�����x(�ɉ��F�u��B62|�+6&�R��`�AzVn�C����C$��C��x��z;ޥ��zK��޻�t�
}t�1�ӵ'H��e�d�d%x�~Z*���A=�k���0�K��GQ7�U�<�/��#�7�Q�ekr։���N��Y���e��Th���AB��z6�s�J��#�ҲU0��ߊ:b܉X�Y_"V��sW�mK���}�J�E�X��0
���bӯgS��H�Fw�\��b#�X(�X��F��[�2}����~N+�	;�/>M,�����,�Dq4�Q�.�Q����ԣ��%!_{�y�]Y��*t��q牄SD���)�_����Us�6�>��O�{�GZ]\�q�pp�s��+Z�e�XQ'p��"��Qd��#�_��="���X��`��yD,���#���+
e髵��EX�������;Doe���;��zC���
�5�(�p8�k+�ט"pg����Ŝ!�M,�����\<���/��z}!b��8���"�ǢR�`	���@�؊��[����rqs`�nq��l��ܖd�l�j�̢���Y=�!�07����ߩZ����IЏm����>��K�k��~@g�)_e�j�
mH���T�ۼ����C�z��5�>��	�eV&�^V��m@�7�D
�0賶��o/=��s>���B�\h<b+r�Օ�i+'�X�����E��.��?:�¿zkH�f�
v�e86u�=�ϋ��8Cr����A�'�pj�\��Y�Lp�v�a\f��V�f9���&���@��FN�çn��ޤ
=e묷�!B��v�h�2��f��,HS�|�6'�
��J��7hn<	F����C L�;e%
1I���U��V-bE���ʹ�<[|�	a�.�9Th�<�z��m��i�xf�߯�8��;a�ыt��ӣ��!�k8�����h�)�36�)��\@:%�S���v��\
���_��
�+�ʤ~��r!+۪��l�sA��
9�uh��=Z��E_�s��f �Gm�3�u{����?���n�.()wP��(Ɂ�z9d���E�ٯ��_I��@
�J�����k�p��6�+=���iU�c^��
�3�y7^K�4�f�N�a�r�l��#P�u�_4خ������^^��
�Sß���:�2\Bd��������5�@.��52}*��7U����iߛIJ���IY�HS�M��A+E;�5 2��M�}��{w�Kf��Y�M�e�-~�-�oP☒�Lp>��Ɖ�D|N�`D �N�/��{�?�*�v���U�l��{�*z�М�y�'z
H�û���zf�3A��������	+8Z�)�U�r�$�p�[�~��4���Ts!Q�g+��ZgO���~��@��nDFvb9f�q�'�<G.��X{�����}�x}���C S�<mơ�f�lV�m٪z�<��xA��r2HX4�|�W��7�����纝����9k�7��4��!o�9$�ˆhC�fh��`|]#�q��D��;�q)��[�i��ۻf�yR
澤�R�Iܸ�[��F�2�8�5t��iR�T���7��X��ݺ�i����0>�t�l#�k�ƕ��s�J6v8
���5f�����/�
�}*��!��-��l�T�GJ��\��
<�[�M�n��g�T�p�E���_���n3$�A�>�/���[��M�U�T�g�
�eF�!��*-Q�|P66C�(ɗ�.������dC���ex�n(�en�/K \��d7ҽ�c�O��
��ų?��j����<m�Ol�Ӑ�l��S�=����Ċ[���B�X�r�{�L�쎴`JY �fѭe��������'E�+��Q�4r��J+��v�O�8L�@oQ�-J&)�����v€>M6�m��gB��d�SP_`Zw+�,�xsph1�	ckl����VH���Jz+�_����u�E��;(YV�jN�2�[5&^�ߜ*���$���Ak�9M���b��6C�6S0jU�VE�o]�P�)�&>��@շ�>_Iz*�
�ˎ�r�([��$V�N����
<���Ns�A�!�/!���E����!л����,�3O�{OX ��3q]�dqc�	C�E�l?B=���� �j�y6C�śes�>����@SU��٤��ט�s����ճ��e��cM9�@�����*ޣ��Z�g���R�'�5/k-b�����M�~��T�xa��pԩ�}g�Ncw�Ae��@��~�0�u�@|��g�,�2W���l����T2K���� @>��t[����B��٢�c�� �E������ `�L*ɷS!���@&Q��/��v��	5ŀ�
�~�c�3�L����\�gn�n�ť@�ѕ��nW
��5��x[�k|���e�f�ޮ���AkIh�~,�ܴi @��3`+����yà���?<�{�)���dn��W��>�|
9h�"y�(6?�gW��{�G������h)Gk|ݴ7N����m�#��~���>�BR��Շi��K4�ޢC�r�D�2��^��b���c5���{�����\ܭHދ��P�vK��z0�!m|�<������	��.�x!���W��x���Le�.ؐ�M=jR����(�F��%��ⴶJ����p� ����^�ͤ��u�B���]wh�}���/�^���t�Q:T��7�僄���Zw�1Z#�I��&'z����et3�F�=;���h�
�Y��&��x%�dܭ7���'":@�|P�I�j��ƍ����U����[eϹ��X�d��d_}�ou�s�^;��䶈g@�������A3ۡM�
L;Q��N>�D�G�t�*��#��C���>Yݜ*�ww%M�
!�*5��
BZ��14�[UZ(3�ﱀ�y����W���[Y&�@�S\��7&AgI$�x�(vn@�$^d)2��%�<�b��4�I3O�z���:�ps܀�����P��Ð#�:\�T���y�����N��p��ma��:��<��ғY6ڊI�����~u��P�GY(u��� >l�~~��2�>M>��k���BQ�$��V��ud��A����0$��P���Ws���|FPs����9���Ǿ.�I��D��~N��(ie��,R�x<�u�^������"ޢ֟AJ�m6WaO42�(�Y�� j��x�uur�z�MB$��ij���
@�c�YEw���܌Zw�'CϤ�r��*�-4G2����HZ}NF7�̲�X��ըƒW�O�vz<�v�{�I_����7i��y���A���]	�v�^��.i�!��F���䆤x1`ͷ������
(�F�F�(Ǽ���.���/�-�r�".Y�0��}ØY�P��<��^�����X��4��q�����M޲�@b�AbT� �,B�>@c{��NoV�Il/$��"��k;{��Nj�#�����c�`oƤ�}0`Œm��q=q��?kǫ�~b�V�����ޞ���A��n�IF����=�W���n@��X��*b��U{	5w�����_~�U�u�S�,�* g1�����ƾ	����WWPwM��BupC��	���N-�L�����s]pP�D�0]3������kF2���׮��L��/���y�B��ϲ�������k�
u��]�}����Sx��tt����u�育��Z�ۆ��lt��N�Ե_��e{�4�Li��y��D����;���i8:_�V�X=Nb{|쬏m�f��_�I��*���W��4�<�
?|�4��P0�����D�i��_�̶�%'�؎�GE�,�m ^��:?<����x	�X�a��#�.��n�X�5V�Z|���ϢT�����=�ƞ���zVN�u��Q�A�şHB��-��Ċ��-+fЋO�XO/SĊ��L����sĊ����Ae�](V�B��b�h��]�M�Q�?˵X��R�Թ�@����]X��MT;-��7s�n���K@nk��unxϴ�/�96�ɥ�p���&�~bﯽ�ޜͻ�^՟����|�Vɋ�$��[-[56���F棋S���Q��K?V���t���&�U+f���!XY�f?F�}[i�?�X<o�Xa���}��=�Z�SP�h��J,�+��}��=7
�@��H	XP��FoY����z s��j��@qYY5�E��x����k��t,�X���|mrx^��]���s]_U�3���nI�^n/�L����1���tg�K��J����\��B���M���S�F�#
r��'b� �X�,T�KŊ��d0���M�
�<���wt���guH6���c0=vņ� �F�C�i�iu#o�D[q�"��JtG"��84_��N_�gO�,Q�f��M��Rx�78��Kt�Ϡ���/@�aw$V\���،�e0%x��/�����=)�ׁ҄ }Zk�S�o�
��sQ�<��A�Ro�%��C���p�Qځ�o(��{BI)7��G����⒋����cwE{3fJz���j�	�A��4^����*�'S�'sRA�����z�f	��_݅���>�e�6�)���U���^����]��.<9W��6K�FT1����+�X�<D��_��'��To^�XaF|n��{�r"g�F���	�)Q�"��5�D�M���E�6�c����iv�x���YS�?��]t��vy���$@2��%�غI��rq'��3�:"]K���
X���k]�}�hKb�˿,C���l0T�	].Ҷ��֒S
���X�Q���f"�T��	�ha�\PN���	��BĊt\��4)bMNl�ύ��I�g<2�mIz*=@Ѹ�$~���tys��DFp�ΈW>6�gA����a��؝��\H���}�E�ؔ��k	:(Sm.�s*���O����위�����%��l?�k�8R-�*�V���:�F����π���/�~�|z=u[Ou��c���?;���E���+�����U�u�vvC'*]_��H�|�����d�ެ��#�}=�S �@�1/�%��l:��u4�ߪF��t5�H)�]L�K�"/u5�\���Pz$%�>�e�4�eaaBF��5�#�� �H�)��J$5���`x�H���X(>��Hj�;�xS"��5$� Ɇր\�����0�D"�ة�oX>�c�u���{M��b�#��c��f0���d�:C�ى��I��	������T��Y��t��؄�^)�Q�/FJ�,�&GZ��X�G�}�~�.�@3h�jǘ�L�^�pF��z1��k�J��5:F��6�/ؘ��e����/�P�M��U�w��I/��O�nO�����*��b���?����3v%�!:�E6�*F6����(�Ze��\[Jp�7o6q�E��l"�f����EK���pK�\4q(�Bw�KX;S��X���2���\&�1)U\�I�;�$:Une�9O�ac��h�f��"�fm0^��YaVEݓ�z�B�0KO��۝td�w$��ɡ��`z�+[�r<<���=�bEIӉ�|@'�w��-٬%���^��+�G�ɺ�Eܝn`�MZG�a�u��]N{��>	�$��(>b�ޭN<"(��f���d�*C�OԒ���LgG�7����[�+�4)c�FhޥG48�$)vm(O�D�A��̡�u��}
N"K��-b�6���������t�#���N�#i}�4�ʁ��
̈́�H9��v���6% c���c�"�Q?W.o��4�[[�;~
��	5L�sΉՖQ�޺�_����z�r���������F��.�^��e;A\o����?-i驯�nI� DB�bYA��Ao��ںJ��|�1��M^���7p�������l�;z��֍����16���'�#���e���N�|؉[�c��v�
�-�"^:ү��2�2�'xZ���Q�h��O�_MA^ �<�iy��}N�[�x��]�<�d���i��v�u��n�^@�,��ͿrH�{������<t�{��`x�Hrc�F�?�M�8���.�a����,�m�Ķ��7"ra,G���c�Q��Fz=�x5:	o��~�>�7�0�M�c�)&r����5�>��Cև��z���5�s��C�z&����	r�W4��|�+2�]��>D����d�65�rq�QH�x{*��}.~�[��;�}$=�4Y�"B���m�z���ǜ�
tAx���0^�������D�c8��r��W���Q����`W�嫜&x��5��T
x,����8�kc�'2���DP��"�^(���{�p�����Q�@D�	U
S0���m��i��`vg��2D˜��o�X�H���]�c����M�����EZw�W��졾ۊFr��·X(c�;Ln��	 �g��ܵ�$]�����1�&:edi�빚n�ְ�k
�d��������L�+co�(��Q���?��7�Hkx���t-�vz�l&%�KwB�%��	æ��õ`�E��ڄ��k������TFËM!3�]��׆Q^��u�L�Cf�4~�%�/��*�T�G�+�,����9	�OQ���G�I��2I(��)��
|`�ׯ3v�ſ�������}��7�[��:�5Z����� "?_���g�0���Q�"�4/�@��O��rf3�$}:�gB�-j
fB~�.8Ofa~����S��vޢ[�B�Ƈ���&Vv��\j]�N���P )*���fW~Y��3A�c�v��ؤ�/�%���F��������fT�O��_��gzIy~�O�3woy��ġ�~Gy�/���j�u�I��3Z}py��4;!z7�(����������DOÉb~��!������q%��oy��~�}�#�
	T����{�r�fɢ����\�Z�7~J��3:��V��:ץk#DD��_��6���sE��5\�^�&u��3�:��.��;�h�Db8.���81A"���5���/��&k�@���& {!�c��c�a��<�b��9k�<,�%��I���8y0�l�j�4������Df�un�M�	Ǿ�<p�y�P��)�O��]��bu�x���Խ���򳨤>�;�S�R����R�$<�r��u��v�`�hX:X ��,c���5��h׹1e�濛u� ���S,���z�J2���yR���� w'L�Xs�T�e�Ԡ��ţ\���6h��'�1/J��e��J'v�֊m���N��.4��ҍp�8u����#z��OnL�]�.��#x(�*;���Ne��T�&�6qc���Ov�0�:��\�
SO�;R �h�o���!�=2�@����_u� g���Q�������z)�']� $�e
Ի�:�����G޲wA0��wi{��
A�to�%�w܎�G�G�X1�Z�� c��9�t�\@#�nc�9<���]*��5I��w�–��z�>Z��44��FD���ﺹ��z��C�{��hYHl!oV��+��
s*����L��@�*O�i�g���q���T���>ND��xf!"
F27x�)�IT�b�Y+�'��)iۧ�K������;
�*A�N�P��&��/��ZǨ����w�7������d�	D�.���w_���E�_.�Y"������>d8�}��]�����]��.����3�]�qǚx�B�w@k���m�kqsr��ձ7��\�w���Mz��}?��n�O�k/����f�^mv=t�M*����:,zKL��)'$ω`s��z��t��QW����od����qu��Kt�|��@엍�5��|��x��סv�t��9��_:��}��"|�c�O\ ����;
�(��k�^̠^|�8-yN������<��g�2;����Z�f���w�M���ᾝٲ)ޙ3��LpC_�Ր~2{��Fx�Ic�ck���\Ò�� �zL.�o=�*�.��2:H�b�<�G++��FH�.�ܠ�7B�-���w�8��a(�yJ{�gtw��Z�t}+)�9W�d��u';D�<��[�/6V.?�J �!��Lb�dv�ɧ��i���B���V͑C�:|;[hUT���)��cQ�ݎ��)ܪ��<*��*;���F� Py��]1��.�?��.�*��n�$��Q�R���ah22�2�wK[A�B�����8RVY[mw�ݵ�Zm��bY�Y��ȴ^-�)�����9�F�j����|���;Ϲ>�9Ϲ��<��!t}�"��4��y��	o���W:RV�*c��z�i�_�i[�iwúf/߻���3{��=���ӻ�H�!�3&:4��
�x�=�s����w�Nk�r
���Ӄ~��ܕ��f�;�M���&�ao���7��9�
��ٷ���Y{ԙ�}O�I��Z������u�xF��}��yr���tv�5d<�D2n�u��M�t��s�������^���D��;)3ն���f�U냋���ن���[�kLk�zx!gi��/4�4^�"��� �wʕ�O#J;��e8L?.�s�+�^�P���9�xJ?����<IK/*ee?�ִ���X���^�ǖ�_H�[Җb�P�`SL���bDə�?85r!�*M�y�z�
�K�s��S�i�ͮ���!E&�m!eH�	�C�ΚG��o��5��F���G�f.�17�ӫ�tr�ҟ���������&9_�h?��Ź���&.�՘���=��'�L�����-��WܝL�Ҽ�t\)F��3����M#,��ɗ�<���,a-�%k^�B��sx�Ĥ�����4�h)f�T
Տѷ���\nO���
��Lg�-�ĥ� �&�B�l d��DB3�pkͬ�����G�!��ӽ�b�ў�(kެz�/M�^�v�.)���3"*'�?�������vGz,��v��
oF��FuOO�}��XR�-�7�4�~�1��b���u����;I���1a�uK�z���-�P�$}:�urem��zC�����״u㩆*#�8��&�ZNv�yn��hI=�4�Tq1h�0���{��e�\��3:��G<&�ԫ����L0�i���Y�A�9���\�=��>m��9���35�Gu$w��/_��ܑ暴K�m�?���R?�&%�(��Π�^�G_���(��q��i�WR�ߕ)�\�C�K��%�F�H��O��!�;��<ro��%N��Ԛx�)C�7‘�.���ݮo�ی����@�BF�^ĵ����$�U�I)�
4�
l���^}�D�G7��ϕ͠���+�Y�_k^W�gw�	���;b��SV�)Q��!zstJZ����w�=�o8Yz�Qv?��2�~E�De3(�3hjѤ7˯/�uC�����ԉSvM�wԘ�ْ�՘-3y/�x��2<{����8"`by~��
�x$*)�9{��켖�7��Aa��M���"��)�>t��������4�[A�2��:�X%�֡��ih��*~�޸ޭX_ư\=W���G�m���"��K�h����w~�ϲ����<�9	C)z���k�蚘�:!�Gr{��ݼ���(!��/��U���-�RL�:~/��.7<6�u�4��=(�#���8)�JnbG��w����#�����>��a	uR��J��v�o/�z6x�c�\ݤr���k����*�b����6w��9��5�a�b�M��=[�C����@	W�t�.�e(�B	�ZD���"�Sw	"q���`�4a�z�V��E�I����G
��H�'@Y��ģ��'Ohd�t"!����[�KL��1��=�frm�r���,�)<��6��M|�k.�T��9~r�f�5��Y���\d`��D!v�q�D��{B�H01˓EN��fD�[,��mI,�{#�+�.S�ɵ9�K-�)c�B)d�i�zD��d�y���&�x7fַ- �z@+#^@֊��B�� _!i��Z@Mz�)g����BD1�$~f���Z(ǘ�7Q�f��'\��n"�>�:�/�R�M~y�4��2Q>(�r�b�S�W>Y2=�o��r�B�Pȭ�܎�[��%D�7-��9e������|^�MX�4�P��}\��a�*�Ľ�O��8��>n׵�?�4M_sy��L^�z�]��Z��QV���k����z�?�2^dB�w��e#����W��d�:�1�M�Dv�M�<�l��<
�0'Js?��cX�Y�Nk�Y���K���{��~�/���eOڌY~����>^�45TV���c�ʦ'H��:�����N��J�Q������b�j�4������W��6�9�߮�.��Cl�!0�_�FH���.�s|��r�z�7������o���@�<^�&&E����<8�K-�T�S���t1��ۄ2��;Ņ��&�zf�~亙G���F.����Tڄת��q���m���ĕ���>��j�}G��ԣ�My���sc%t&ƋEp���vȕ���1���Aj����D��jL�����(�'r�߈	�d	�(��u�A�'7�<uP�{9��}k�y{~���߷���+]���<6��<�U�Wt�^'�|��Ϲ��샚��Q�޿�Κ�˅Id��U�q �(�Ε%�gpAu�B4��I�ロ$��#Cc�gwF�y��˖p�D7�Wu�MD%Ҙ����p8ݰ=�g��:������`�Nr	&��ѷ��b~h(���O�d�I�n$*hYjr�R�DՁ2c��U���Wy�Iߤ��'x#`u����|]P���ڐ=i���в�5�(��f�n��z%��k�S{}kQ���Q�����R=s�Uט=ofx�L�i))\�]��L�ǘ&�V�S���խ�3{�e�s���C��ٓt�걅df�L'*N腬�n5&6��(���Y�y�.���]��23��w��8�N��e��U�24����ӫ���5G�Lh$e�i�����9kN�7eSy�gt#=]�@a�	�G��X�sQ�;2�4N?��f���
~�&���,�~>w>�I+�f
I��M;�:KU��Z��A_8�0d�W������b���⛨��[�2Ir�Q��i�B���E_0&*#�~�h-�aV�xއ�$�N�a4G%���Z�Wj����Z��Dq��U﹊����Qc.d�K��y,����op�/�h�\h)A���`,�yv�J=z͔�5c)M��q;}���p;�ԘMo�����*�З�rzP9k�Q���W�/9h;�0����dR��J~m�ٳ%�����l3⥑VDx�gS~�!���mc�1yo-�ֱ碪���_�ġ�y�߼����)���|�uC���4jcIm�ؾ;�6�<�ţT���F�M�κ;��xA�nv��h!qGx
DC�6B�'��ey$�Z�+��Y����]��ň��H��*�D���z�~��z�������l���˒-�Vy�E��{]k3�7��Yc����,ڋD�$�}�Ԙ�t�y�eam�ؽ�1*�����s|�&��Qv��g�-�<Q��e��Q�'��)���x�_�,�x	ϕ%��w��wYV_�Q;>�uT�
z��eBY��0�*O
�Q��0Q~'I�=��T�4�\��2a�V��a�b�e�0,VfC��)�$eJ�2�e�0�m��Q�)�J7a&�(�e>%��ť�LlS�����zR��)DŽ�ڒrP��KJ�0�5)ʳ�Lgx���L=��E��L��Q���\)�-|�fځU�����*9�̕��fRq�X���)㖶*�KZڪ�.^�I��+�id�X�Sf���>%vʷ���R]E�22�/�ڵa&ie�0o$�a�L�'�y1��d�$��ȼN�i����Z2;������@������Ί+i��H�daV�<D����K�[�%̴��	���-.�g2��X27
3W�yT����^�IS��0��y�0�
o�Qa��y�0�*oe�0�%s�0��%̋ɼX�I��2_��Ȝ-��d6�:2��F2��d6
�Cd�&�[ɬ�md�X*ʂ�ͥ|J���,�����ZS#?��_��*�1E�7������q�2.�p�$\r��pY�K��-T����X�oQ�p�]�L.C��.��K\
������%Z���e�pQ����U��.��2[��'\p�.�K\&
��N_������'���X��uIp��e�V��s��~$��|fn^�S������f~��U�z��k���
�M�;��V޾W[���?��eM8��y��T���&��z�n�l�Z�s���h�tc�r;��[h����`ͅò�0�gz����v��xA[�gb�߬�m�Q�3����{
�8LX��{F��&�F��c>@.��hA.��Å1�sݲ #�C?��OY�V�q�0�P��7�r��ݗ$��?B�}e�ZB��\�"?�T��g��P��azw�zc�{<��d�u�
8Z�N�8�~�Z�8m���Q�V�kn��m5�[
0a�wX>D�[Rk!P^���BFPbsh�u�,S+����a��z��V��[li4��MW�7����_V�(�o=ڞ�@5S_i���[���u^����3��
wPh��(�Oʂ�����i�I���.~��O6����o~�$���$x��yj��?�3�ەO���5��!K�{LU4`��V.�Tc+���1��7{��Yʀ��;SY�5���]��CB�w���Iwi5��D�F?�BH��
�lzlZVM���f}��Á�i��R�0��\CH�ۀ��Z|6��՛�V�s���ڹ���������M�Cf�^Z�j�����a�kh�(pSW�31��5T9]�#{yM�d�<���C�@	t-�>v�y}��k�\J��W�P=k���$��\/��;L/2�/j7go�Yú;	����.�axy�D���X�^!�^k
��dx�2���:%�
!DŽ��P9���y�-�z���Dz���H�%�"ae'�93�H-���K�geq��VOѤ�i��K�Ҥ�{iu��K�����ݹ�z�&�NBfM	A$q�AGAi�G6d�E"{��K��v?���H̼�l����t:���� �Ő�U��-�
>�
��F�3�����K��;�|y��Qz�K�/� i�P����SkL�`�a�T��f�{1�6�%e�&|���sQ`�i���hR��Y��ڦ��2�-R��Y�:	�ך�d{u��m&��8x ��hՑ��B�������-%BA7���q��Z��bÖ2C� �1�h�V� 
�4[^�>�5��ɽ��3��֛S��fB}���kiЄ��!p�� �����A��㳓H�{�9~�w�&�}fy�%��M��L V*�t�I{���+F��P}��&�~]�y��v+����6Q}��y�n�rݓ[��QTQܭ�-o2�����"�g�5�cm#�n�8uΔ���0�{t��B�{W�2�}ە��D��򑢦j���6s�n�ҷTy
��u|�Z��$$�IW<�&5ѕ�(S��E�tMT�;V�F�֨$۽jP�D�/�b:!э�$in���R84=�'Ҷ�>K�y��/
A�j�u-�m�f�!!˝_���G�R0���7io
!v�0�R��Ϩڱ��E�;��-o���*�ݜpM�����8�Ͽ<u��>�IqO�R�=B�!}�
U7��(�TZ���r�PLg_ѹ�Ȓ�Sjፆk��1z��6s��$�fN�҄�D����G�2*�	Q�|���~��}Zx�ջb�ty�$��sB�3c�kQ��*���l���Z�Z�	ƶU(�WY+�(����N��ڊ�cO�c�wHjx<��CB@||�;��9k�#���G� T;X���Su���k�,r{����R��e���xd��#3�̤Z�[Q'��*:ԪFӉ�	��^���t��#�m�&���ꩡ�}�x$G�"�t^ºf/�@�O塾d���w�k8~�Ho��eC�V�_W���Iֈ�e����QM��`l�ð>�wU�Ƹ��߮Kvw�o�ܩ�F�q���H��w���䞏� ��>��^E�*M�ƕ*;�GgbhLʡzl2<�P�-�q�H �9�����ʤ�(�����q�O	��]l��q�J�i
�*�x��h=(5w1�p��s�*���	��~y���67������i�8��85�o�8��;�5����E����.~��_Lp���0WW�&��r����CP�Ia�5�G0=��p
h��Ap��~�K|��F�G@���7;[��i)��Mw��?�"Un;S�s3�s7�ʰJM>��{��)��qԷ�w�
#�0�B���1�%��$�z�o�>��U�EB�)W�䴧w+�O�ֳB�mC�O��^�%薦�DZ�ŗ������n�~���nu�z5�[$��]�KF�N�l��깺�=�^JIх����\+��_�{�oM�YK4�R�IqTN��MqOp|���0�������'y�Z�)�J��Wy)�KQ���y�Zq;P]��>��&��-t��`S�g}I��d�m��sM�]���8'-�lZå��K\�F��<�����٠7�"�1��5�?�j�z�R��4�*��+x��4jD�Ҥ��gm����kPo��u�SH�-tos7�$�a0lڣ�ܟ$��$���B�*�*i�M�)�807��-�,��W���YCU%z���j�χ6���
	����7�*Vt�f.�z�{ֺ��\��t���Ë��fЂwx8����u�dbUޢ3����Q1�+φɣxO�*�<��y��T��ܣB)R�Ӂ�$�"���*F��YtR�r�nR�Tk����tY�4%�-d���Tz=
Isy���^5�ႉ�	��)�@T��j�aC0�&0�3�h'[ދ��|�w�a�ω��2�"oj�H�{�x���&�a��۩����c�hu���%��ä���r=��uYt�5�_��HK�2�')�Cp����t����^�9X@QӔ�� H��Y�/��`�Z:��sT���}��-(ۏ̜0�3�P-O���C��Ǣ��YM�y�3�D��NHW����+�.�|�.�{��9�k���:�#q͌H3�k�3�R�&�^I�`���u�0w�����-~aݺNd\s^�ʘ�
k��4;�2r���	��Gf[k"�K����fq^ T<VL�(<��PQ,�aI|C �&4[�0
���3l����g����8�Zћ�?�UǴL�n9�Q�F�^��v
��2��hj&��Tw��5�/Q�t�C���!iJ��.u��ktW�0�r���r���cԑ�%^���6�v�^y�к��V����ߢ�5;��Ԏg!OW��ۄݣ��B�z�bѸ�-|5G�`�h�yoXk6ERh�g?4�7�A�~�O�ޜ�O�y��a��ʗ�K�wx�jL��T��c�\F?���am ]�N<�T���F?;��`�e�
� ���t�6�8OR�1����}���`��qԘ�׈�y梜Ŀ�}������_�-Jyѯ)Au|dHs���W���ʑ��x�܋Rn����M�ក�@{v54�����w]��Ұ�?��9s���X�hGw�_]��sۯ:��r��N1���"uw�����s����3D��X�*;[N���uw��[ʉ����w��r�Q�����ߟOޮ�Ykҍp��K���h��~�K�He���D�cxj�M`� +��51[7�����e�^_ј��[��A�ry���iQ�Q*DH�'��w,/�������_���8��2�qڳVY�o��IHJ��y[�� Z�RFQ8LJ���ӷw����^�{�<�֧�į v�(�DŽ�Gy�1?���]���c?�Rg�|�	�OH�#��;�2�,5��\�G!]�����8�_�}2o�Fg�}�0�	�ҹ+�ōU"�Y���E_��z:��N՗]e�HǾ��	1<��kw�C��
/�H��rz3)0�8���N��"�����iּ���u�z�e>x
�Gxc�y�I��%~{HV�!՘��P�p��j�ʩ.bV�DMS?]U�i�"~Z!M�y=����:��Ȩu�T��v�n���´A���Z�����QgsJ�@������y͡]���>����]t�i6����-c��K�
�##��{ߍn���|v��y���
�.�7L�0�=�tr�Tq^�*ɔ�ՊRs�T�g�U-i
{�������w���:�R����)�t.��;��1�ܾ��&ZC+O.�n2��R����b�(h0�����S#'�c
RcL��`(]��8���@S9���Uf����0G�#
1 �8��}W���+.~=x�]�;f�s����q�rQj����G��w#�iF��L�Q��w$���S+��K7m����p����7���;�;�r�"ג�
�Y��)t֣ݭ�[t־�g~�{'tޖ�CIi!i�s�݄�{.�����~`b����X�u}�DN�`?r��!�n���W*��VD���
��b:�pŚNk���(NJ��E��@���Ƚw��y�1T�į��C�Ys(�cV�C$&�JBM��zڼ��Yg�m�Gi!��u�]~�k�|�bŨ�N���<���Q�{���Ҵ����U�pA5���{��/QdU��0��)��Rc��?��(Ҩ���q��#��5��h����F���6�g\�ާ�Qgj~Aj�����_�gW��3nR�-8��o��W�i���Nӝ���j��$�b"�$,T�5u���'�l�^g��3q�0c��2�����Yk�h̹�(�k�!Ro��.���%4f�Sx5&�(P�Er��}Q!��#
4a��գ�j�����)	 t�<�_P����bZ�b�@I�)�=���́�\��Kz�.d��o��U�j��{$�M^tC�΂�ze#	��Ð��ĚG��&#VFuPCE�@���6��gL]i�}i4�IڗV��fQ;�c�]�Y0[����TR�*�T�3F�y?P9̗̞�(��pb�����m>�	���w�3�(��7�|��(
�H'O�B��J:��9'u;����{��I�*�J�ݘHK�N�U$�)�_`\�Ƭ�)�*�)�¸���/�p�h��>?��(�*7�<�OK����=�yt��s��c�&���Na�+Q�6��8�r�j����o�k�sQ��hH�G�y��"^h~�*Z��c\���z�`��B(h��h&���_��h���B��+��N�’��b�D��,O?	��J����9�G3i��p�:њ��(���]`��.+���&æ����N��%��T,���	�\=&\c;��Sk}j�j�8iF��s�k���W6���K4�Y���#�F8���	J��ʨ3��Dd��Z=�|1
�g����Ž^.�p��)OS�	�UJ�ST��/W�l�,��X�/n��I�k&��]&Q�j�z�Η8Ғb!{��9�h� �m�'�\�&�Ah
Y=_�����-��s)��t�Öw��Z^&��H/\�;��v���Y�ıɋ
��'��X,��^$7z�ѧ�����s���Jv��f�]��ky���;�<�E���*�[�s�F��P����O5
��>��V��hJKHCM���^��H��6���\��u��y��p����z�w�����J]p���
\�H���5���ZC}o����Vڇ�;�U_���o*"-��a��ļ�`��|qW�����u�p�w�����C֚n��y7KM��5K8N�l�k�� 8�`�z�����	�2�H��R��q�`f8a΂$y�4=�X-��J��U=H��`M��A���;;�F�B��i���c����"�Ch�h�\���U)��'�����>��̽�Y�����6����M��f<.�g�E�D4W�-������w���B�tT�7�3�CξI=�ޓ�yM��:�I�1w���wN��:��2�Z�}�ҿ��{pQvߢ]��S�滋Dy��Ū1��s9h�Ձ޷�
���#�{�R���4� W$���M�����H�-5(�Ľ�3;F�+���~�u�I��=��,���+��&|��Bޣ��@��ڹG��a�ӟ�RI_�d��+���i��
���T�q�f�poE��p��Hw��]�g��[h��fZs�ų_�y�뗤��=B���w�BҳѡJ,��Z� ���'|{2R1\�e1��9�S����n����,�˄�����5]֊C*���r'5�*w����>6��7s�Ao!P�I�I�kӾ�#����Z�T빏���[U��{}	)O,��`ii��S+�gp��>���&�~dс��o��~��ʐǿ2=�M\o֥L2<?_��5���F
�����k.p��s��"�XR<1�`s	1�uby�N_�y�k��Y��Y�Λ��}-w��¦ӯ�Fi��K)�T���'X�ӹ�q�Y-c�D�^�m��vW�.j��#�J��	~~���ߏ��@>}�;9\���b��-��)����v~�X�JռKc���c��
�,+�ꙕ��;f��y0х�*�Db�nI٩2~���L!���W$�:��}����Z��<#�Q�i{K�o��{���D�_���fAX@�|W�*�m��:W�u�{!�y߉$�1<�o��)�NDه0�gJ����u�����K���J��uьns7���b��xWS���a�W�1ov���
Uq���{��?o�磑��v�yC壗.�l��uN�7lӴ�+��%ܑ+��,x#�~F3�ᢢ6��w��.�1��}��k��ƻ��f��O�l��M�1��Io�e?��&�{���Ҝ���ر��gw�}�G�}�I7�R��I�2T�jF۳'�}�3:�O��y��}�o	��>�a����'�z���	��}��>�
%��w*\�윊W� �i�����j�B�7^q�t|��	��%�U@׮��{������=�rO�.�~��O��u�k��u�	e�,�&R�U�1K�l�o:4�Z3[Ǖj�+3gr&[=���W���P(���~s$f�����g��'�Ҽ��������4��z!o�VM7n��EE����/�:�1��ԁ31��g�ߜ(.�ϟ�Yr�$�)�y�̸yO�O�ߩS@W!���	�$b�(Y2v�l�$)#��8;�Ȣ���n$�G��nm� ���v���kfRc�@g0�����ң�o/�N>����u9����rG{Q�����j���Q֤3Vk�T�_��ǵKO���E�F���dE��H[�+���۫ʹ���
W�,l��*V&1�(A���Ɍ�Ȅ�͏����o�i��=�E&LQO�S�b�(�m�^�v�}���Cn�,HS6�n�`������û$|H¿JX/��*^��K�K�)�|	����Q	_��
	?��	��$"�u,�K�U�M��J�C½6HxB�o%�/`O	�H8S�������I�6H�H5P@��)Z%�-a�����p��I����%l��C	?��[	� Y^��p��i� a���K�I�?IX+�q	?��I������I��0K�_HX,�Z	?�P{�d�̖�l��=��#En���T�	�~��m�g������{܃�O��Kކ.:�pA���8-e��lgI�����%����dv�
g����UCIfO�A�<�!8��f�IlK�ii�l�b
��
,������]��͊��"E;3�u��5��,�Ù�2���͗�=�'w��bۘ��j/�tЙ�F�\�!�	T�r	s��׍��6�bLĥ|�V�q.�a#G�0�ⷔcY�-�K>p8�[��V����C+.�/�>��W�n��J�nh�)\>~�]�iDjn����H���J~��b���s)�.�k)�S�[�W�N�"�<%7\)L	rn�xx��\��Ƨa<o��B���f#��ZlWs�QM�������v9U�i���K��iq^��i�!n!�g���+�b�p�Q̹�y5"����؋En��>K�8�_�������r���=xf��q�|�K8����;�G[�%��Ѥ��w����/4<n^�%W���������<��x�k/�1�DzTk���F��s�#�KމXn�������V��������q�e�6*9������]���bѾK�?��Ky��_Q���_^��*˜�)��;�m�]����^���D'Ǟ��#n�0
�?S.O)��?�M.4���x]�����.�c�v�E-鸽&���ϧ�B�:Je���]�қ�W~?.~!���������Dk#��B���G7wqr�F����$L�(�czio�^�C��\ڵ�I�%혏q{��;��������מ�Xiϖ�a��SZ7�{��O�{i��>ҾN�j�v��������o��Lㇴ/�ғ��5������|#쪴�vo�N>/����l>�i�^:K��%}��2���I�DP�Wn��(k¾��\"�ổ׀e����k�����q�ٗa���/+������x���P>gF��r�Ǹ{"wO�.(>�g�Q�|�̼��Nꁴ�P����r���t��Ho�n>�ѓ���><���d��>�-�v/�<�e�LB؅|�Z>�jZ]E~4�5z5:5�4z4:Dz�}th�k�j��\>�:y�J�$N}�ͬ(Ti�psx�P�gX�>3������38���\�/�����_ç���^Y�[��R_���3�h�c$�r<�����Da�Fu1�*c��ٗ,��*�
%K/�O�s��u����<L�E�R��.�2�ż�Mg!��-י�+g�B�;��cXfn1�"]J��n�I��/'\���S6#��v��r<�����,v;K}6�˞_l�s��6[I1w��0�Ex(>šp�����
��
���l���ҵ[�U�c{��ջO_c���<��k���4b���c�M{]���OH3ML7[&M�fdNɲ�05{��3g͞3�ƛ�Ϳ�rr���-.��֢%�%�ۜ�.��ee�o�c��U����!��+����b�����v�.���O�3������Z\�4��<W�����k����e5@��3�Zk����O���o��Y����s�ۚ�.�r9�S�fmEe՝�\W�޳�殻7�s�}�~���l��������G���c�?�������߶=��3�>���;_x񥿿���n������_�����ơ��G�<����{��{���G�����O?S�>��>�ŗ�_}�ͷߝ=�r��������;��5 �O�:���ܱ��
���p���� ?�����P����6����7�����~o�}m�t�����6v��Nk�Z��u�]��0��8�d�W���0��*�;�.�Ş��(.(q.�s$�g喺Ly�¥�����sn�s�"�Ē2sf���hx8VY��g_u�.���^�.*����h�؉u
�
�X,��N��S���ٵIIs�C0\yv�9�s�`A�(ãG��z=m�Y�ƓN��w��)G�w�߹��[p0R���BA'%�g��C�!�S��#>��&��!����!�ŋ�!e�2��
������]&v7�:j��"�0k����%���ԁ�d�$��Tt��W�O΂�؃\,׎�r]�EF��Y�4�r��y��o���[Xd�7�J�%{��^f�s�ri+�Y�d!��1�ؘ�@�|ġU
zx�pN{n���Y�1��h�l��y. c�f�B��^���v����E�N���v��ϛ���|���0O��|�0���;���jg�4O����ؿ���R&�Ti;[��@�,��afm�����]Ƽ�|�����о�3��}���9~'�B�J����K�
V`%�K��„R#΁]������t�}a.�
����v�g��B��ԑ�g7���N��Dw�3qaaq��x�`-r���Z�(5,t�/�����؝K
�sy��c�m��݈�o��=�ǁ���|��ɮg�Y�3�/�Y�k1U�RW����%�W�<�2L;���'ڡ?�+��o�U�?��]J�͚9iXJ��3x�`c��բ6)\��`䱨�d!���ue��y�A�s.rS���ؗ��),0ڗ8\˯������ʔB�<��̙�ľ�Dnm�����qcl���U�&>�1vG�*�_i��~�|�J��F!-��1�����KE�E�ߜ�_XꚿlL�pG�B�3��UϺ�G�����tCCdm��d�ػ�؇1;��F��W��u�X��I:C3$wb����^a�W���J��z9c��j��Х6����ן���%�a��+��
=f��ɰ;cj{��w��Ź:���/�F�9;55`p���H�ÂX�ǡױp�\�-�uK6�n#��;7F4���!9���)��H����������RԀ~M�����CJH"cV���0�cA{,舝.�ұ �ݭ떯=!D��_F2���V<?F�E�(��&3�P�/��?��C'6���=���f�����B#�Ydrw���:a~�����C�2��cu,B�t�f̏fƙXw�l��^�=c������e>e�r�5��ܣ
�ȏ�1Lo���	�u�|�~IO�ᡬw�^�;y�{�u��p��rn�y	`!��y|��g1.��!,��]}����S'1�����&��<�~�$�0�{��`r$�>�kstck�0�X��Q���A+��L�x��a�`~o�2N� ���u��'SϱY�q���6�/o7~uedLc׆�Z���6�kn`l؉��*c�f��ǰp�?����fq�SY�.��e@J�{$��>��X��gY��gX�6%�����B|<����f�]�NIO��z�Ţ����D[ \�M�m�׊+Z�C����⭑��.A�ʯ˽�ٺ�0�)Q�+���{y.�t���.��(�P�}& ��}dW��_�z��^��4wm�n0�F:"r“�;���C?7�{�(
�/�
%(W`٪��+��rŢ�tG�����ua"pQ��[Y��r4<�]X'�[��H
g}�g}u[�彝(�� ���͗��t�/�
յ�עϫ@#q>�dؿ�h�m���H�c�۽�ߨ]�C���Z��8�Wf��ѝX4Ҍyy>B�K���O��@������t��;����p�
��p�=�Gc���Z�>�cn�>�sz^�-��n��!����Z�W��X����}�U�Ў6��Q��0�܃�ݳ9��n�]�9Qټ�O���4OmA߀7B�S�G��i���R��	�H�r��߰HK_Wԫh��(�5��a��N
A��H�/�A3	w�S����]Guv����g@����4x�9�u�� >&�ڡW�����k,�
:D�G���:X��u:u~e�_��&�8PW�>c܏㫩glW��~z�e�}@g���G����yF�q���D�:1��/��
��1\���9�P�0���շF��/1fh������3�bރ�0�i�o���K��៥�Gۨ��M}�0���kST�Q'0'i��� r�}Y�q�w�Κy;`��:��G�+��ΎȜ�l]����\��6�)RеiO�_]�շV��":��1]�n��Ą�f=��
$��n�:��^�s]֎��Ha=]ɺ�ɣt=uI:m��E����+��͏B]����M�{\��.�A�߳A�� ݷ��W��"���;��n;[�,o3c9�Z��m�׬��?���Ϲu���[��?^��lw��%pV�sXB�;m�e��a�`�߭�,Y(vp�b�$�ݞU��I_���t��im뗱}����R]KM<'��5��9��xQ�]bZ���v'b������]�"���5]�L�����%��%��|�$N���D��R����|��|���J��E�I�E�r�P�'���`�y+���\����3K�����:ٯd}���p�p�[�?ڛ��}l�A�����|'�����|�7`H%�e\`r���,���t�^TR�٦X��`��v~=��k�}I�R��{�f��p9�^�C���bf3�YsL�<z�V	���NtK
�]���=�Ae�؛�l�-�p�Dg.wP�
mꔉ�"��:]n1|{#H�7k-�A�����-eyv�	�B��g�Kzf���݋ٝ�`3U�AA�]E��dnѬ�e�����URr��1�]�G,�.��%��\���Z貗��@rQ-e�kf!>�;](��v��e�]j����Q�ܢ���z���g8
��Kܠ��������ɿހ�7�&����s��v6�l34ۍd�EUN|󫏯��ʙ�ig=|�K�Eq���9H�W"�/��{�lT����Rn{��-�
ǟM�Y1�M����S-62G��@ea>o�h�,10+݆dxB�N]����uR��] ��I���ȟl��"�/YZ7�^tI�ޡ���-��5��%����Q��v'gIq� I����,̻UR����.�may�˾�>ĘJy^`b�A3��v�[�3�1��/��c�hY��/����|��D���nFɺK����PD�t�:�>��)�gf�:i�t;�S�n�#W�˟Z JgZ@��>
��(Q{$Msؕ�v�v�#
�}��o6)8�j�DYZ��Gjk���@�ɇ��d����d��<�y����`Xk{
���0��v�&9l���
��:��K*a����J�%h�x�����"_r�'�GK�I�ӥ=[ƙ.�gH8G�Q�]$ݗ0:��e:cv���%�k$\+�+���C���Dƒ����Q���}���
��'��~<��{�r���_���������!Uf��쇅�ƿ
�{���o�����t|�P�w|������{h�����~@��"g����	��c��}#9K[U��V�����?;��撀i>�3Û$|�=r���#�#�:ƿ�an��	ϴ�8nd��r|���<�a�y�F�1/�?N��w~I�X�|	s$�/�\	�%�J�&a��F	�I��0HB&�E��-~+a���%T$<)a���KxL�	k%|V�'��T�-n�p���:$̑p��3%�J�$�Q�Р����=JB��L�?���P����!	�IX&a��s%̖�*a��)&I8DB���FI�gںYҩ����PÿU�7K�NB��9Z%L�0^�^�%l�$ӓ�k�?��}��m�?ŋƉ������d���5O��ӏ���)y��6O�||$�$?��^��J���G�+._��$��񯁫�sT�=8㟃:Ig�:R!�	/I~�)�����fe��=�[�����7�x�х�Xě�16������`��{�xS`�BnxC��@
s3����`Yo�]p'�����.�i]�>��a~���0w�˘��0gHs9�i�x�:�[G�.�ѱd�O���(��a�<�_�=
=�@��5@��</��dl/�3��e
�	.$xUx���S�oP7���(�O�%`̀���I0���
�9TГ>L������JĘ@x�$1��c)t���*����V��0���c���(܏�7Jп	��ɨ�p�8Z�=p�h��r�O��¬����q0W��ZA�f�)H�x��u�3�|�:�[��$�M��-�q��������)�L4�f�S+&���D�g�`L��?C'���oܖ.�l�f�W�EZI�3�6g`��/��a�x^vxkA��L����N��<9I�=��ɨ�p��,h��>q�(�;����������nB����)'��)"<��g���t�ل{<�"i^�yA�����N����ȩ�\��F?�����X�ߜ.��f�0�7Cĭ�9S�y6� .�Kx7�
�s0�❏0��z	�z�O1�?�5_�O�������%��d_X�W���07�5��sH>^��,�MۀzB�酢�<�=O�3+��DZ)��»i5���\x������\�����I�K�d����%���N��Np ]���b�/"|3��R�a�����S�������.�W��W�.\���'����O�p�Z�gີ".AW��0�[+A.��U�	�N�V��8뗂os?��(�F�-�DY\P�v�09���im|�Z�|�[i&��#��A�ItԈ�Lp�ݢ�K������{D�L�#�ȻXp/� ̋��|��x�>�+��ӽl0�l�[�6��?�z	s<��D=�������Ø�#A������E�4>�80|�Q������2���~p�V��+{�����?/�+/�M��"���0���71v\�M����M����)�pp��(w��G?`N\��g?#��Q��gߊSw�>�}��]��n��	������0<��"�-�S�Y�> �S2��:I�p���/`6V�.��
�oJ�Q�5o��S	8��n��=$p�h�pw�8^�Lpƛ��_������2C{�8ꘘ�X����#�(�P�}��z`�L}_�0�}�����n��Dp	�pw�a�0���E�S�ޭ0?�v��Ir$$�}#���L��֡�.��WJw��Kw��K3���L�ki&yB���0i&�.�t�)�k���Vi&X'�����J�_2���D'A�t'�f:�gi&�W���㏐i��1=-����r�F�N|N��Ğ
+�u�@��fUN�
 7A�A�W���0I���K>Z�q{HW��S�W���:p�܁���wt�^߁��ܕv�i���{1F�y'�0y�&�Wu���_���[�bn�y�[�
`�j��G��V{�:�J�[?ұ���C�3#��.��_��g���l���lΜ9������nQP��/g�7ofO<�۹s'���e���t�����y`X����>X���-;ĭ��//�G\\�l�

�z��!��9x�]˗���edW<x��2Y��/Ջ�يf�iDV�I��C��_PpQ�WS���

��¿����O¬������}����/�H_U=�ip#�.:�lgɟӿ���%d�4}~\,~؃_:���-!�������h!�U#��B�
�.��?�nD���-�z���yXz�~�4NmAt����[.*������v�\���m�Ңro�B�o
���?�Mx3�:�ov�o����	�}��@��r&:�^��oB�j�j9��
��׀��J�<J��������f��3f��o���:�q�F��?��=�쳼������ԩS�z���c9�m����q��|�.�zח�
n-a�QD�Tu�.�Ԅ[W�݂�aX��y��}���f͚�� +�πnͼm��>�@]U=x׼Y�j����E�v�E�W��s�1^���o_5*�����~��„�� �D<J�|�w�$<d			,))��?��L&����y7m�46{�lv�7��o���ʟ�-Z�n���d��t:y��r�J��{�����3�RY�"�pk:�Tbb�;�؋k�c)�`�[��m��`����p+�ʆ�Vو}*��We�_Uٸ7T6�u��Uٔ�*����J��:��y��,�QeO�l͚5�����s�=�7��
��o˶l��z�!��c���ݶm{��x_��K/�7�lck�R�s�*{�W؁�믿�>̎=ʎ?�>����c�ͯU����z���ľ��s��y�577�s���BO@"���I�T��L�M8{g4`�څ�WG�y�4�\��mV�aϩO���a�?e��?�'!�x��B�◩�l=�oA��"~-�A��~�!~�߄�.Ŀ���0�C���oB�/��_��AX_�Pױ6�Hkջ;�uJ�4�#�L=6��Lc��ۘ��=Lm~��g��wC�������#�
񁫹�#�z��u��O����#Mف���P�C|�?͘Ĩ�.L���#�����g�Y6�6ۏmd	h�c�!�f���蛘:��iw2��-L��i�>U�����7"���B���_��w!����⿌��i��>�B�f_���0
���0�����9Ze_�Pٷ�Tv�6���Ge�R��U_�8���:��!�R�_���E���Y�ߍ���}����K� ~�C�A�?�G����o@�������@<�N��MMfnκf����M���&ffd�͙�&���
<x`���4�x�?�yA��`�d��ϴ�[2'�%�4a�i�P
0p`�~�?Öf�4�����>4!��Df�2�gR\l�Ç�L������1!sA�=b�Cd�A��"�g.��ڵ���4�7���1ݺv�2�H��)~��|M�߭k�)���k(�_0�d�!3Ӓ��'!�۽�U��(���{^`����-���L�����|
�?�fδ�̶I}z�����aYL�O�Ih\[0�H�q�#Rm`�͒i��)h���#҈�L��9iR׮]��`L�i�$p��L��I���O7R:'Y2�6pyR_��ޓd��p��42��4a�m�-�"��il�HO�����Az�2�&�����Q��t�h+($m�P�Z�M׎N���������L4MM�<���=�ܚ��t
2552 $���'��f�V�*XZxt��mRQ���/kT�X�	|���&�f�
�kG��f\�-��Q3,��k����0]�ƛe^���x�j��C��FL$j�5�������ل6���h��ӧ��*�d��㉲�ٺB��LgϮ��m�[Ů�ǜ�����>!�e���������x�����G}���y�>|��\��'��ol�\a�޽�7��s��'>b'N�`'O�d^���>}�}�՗|n��w߱~���sNeO�~�{�~6�:���v�1�rtwc�{�E�ϲ��l�Z�nS�d��ﳧ�S����w�Mk��`�q(�A�4��D�y���@���ⷎs����g��u���i�ٳg?�=�"����Ȟƞ=c{���oT��}P�z�2p���Q��#a��o���71!1���͐��a���92�O�~�$��
�#��!�$�C��.�#{�v�&1\�
���`�ԩ�5��a��7&D�?��ޡ����؀���
M@��70.�|�7�H?�W���~�MBB|BB���^x�Le�~��VG�p���h�T������b�d�sx��?��D:���2����$&z��L߾}���ʿA����Y�U��Ο�@O��4����@�7�g�'���H����~Ɲ����O����0��8s��)������/�.=����?��~�N�K7n\��S��C"ć�T�40w4h�@�U�7v޼y��9�w޹�hu׮]�g�}�b<U�~�mڠR?��#�o�������4!�9r����'N�D9��Hw&D:�*�0��Ya!Q��vɒ%�ZZZ�V����=��Ch�Ʉ��k�D�.N������ܹS}�;8ݧN�R?��S���A=|�0Gq0G ����zj���Wb�f�����p8�w�uW6��D��$t��}Tuu�M#G�$�Ś��!�����o�Q1��g����û>��s������C���.���i'scc���{�q;�I{1��u�ۯ�����{�T.\��~���߼��[;?�䓏��y
�|އ�64�Eq�Q�1���|/ѯ���2�^�_ˇf�޶y�^��{Q��ߝ���={�l@9�G���<�޽��O����>��cn'�M�
s��o���A*7j;��^��S������5:�*��4�k֚%_f=�g����D�T@T�6ĆI		A!HH�(oIR@@���������FQ�/DZLj��� {���=ᦨ<��5_<k��z�{���޷*.\�w��>?����}���/��3gΈ�!#����7"�L�?p�lݺU��1��a�~�߿�Lh߷o�ѕ��*���
=�Gж�{��ODb��c�H��"��i�K�7E^�Z��3UW�� �.�w��1�u��5�/T{	?�e��W�h�1�?|���<f��o�E���?<.��H�C"��t}W�ηE:�S{DnQ7n	E��3����/�����L�����+��ypX�*��Ay��-��C�G"g΋�|O$bGMk�Q����rA��U�|�� G�
�Ξ�#����j�fz@�����D+�]CG�����EZos��l$��3���_��0�yb�}���aq���r�^�#z��������0t��| �!Bu�^i����W[<��n�|(Dϰ-�p �u������θG�W��`�\��b�K1T�ƌt.���_~�E��Ԛ`���œP8Ν;'シ\VM�#K���s�b
��W�Έ<xD�>0|���L���}�&ݸ#��m�tZ-n���k�W>�q��j��9	Ɓ�#�8,d9���
R:1J�Y���h����"���4��إ�`p�6Im�
j��[1����:���?<<�F�����/���?��@xn1@��=ٵp���%�'v�Ű\10�~V	Jǟ�0X}��gl�mo辿&r3t��^V��g.�N(����W]+$B�,����d����ʼn���bX��'��<!2�;�P-2��>c��|zQ��`�V��Im���L?z��8�f���`�t�bal��Y�O�"�Ǻ��Ő�MN�<&��0D1<�bp�sG��lR䁀�6�&�p�֐v�Я�}Aǎ�5Fɇ~�"Gd�<��km\�{�[b�+y�eSngyQ1�+�5�a��qr�ķ�26�*�T�I��g'ƸiGh��V��t�r#��}�nh�v�ۏ�'��n��m��#�eŰ1��TL�*e�!X��U�4?5N
�v�Y�=dƨ2uDO��5HTi0�c�vN�Q�j�+=��
]�	���<�ƻ�c�/���fE�vŰE1l��T�g0�8;�aLw�9Z1��)�#�2ؤ.��������G0׬Y#�֭�";�<�OO~��7�|>QvϸS�MS�/)���ؤ�hY�-��cdAZ��M��9��	�0]1LQ���/C��WY0�r��'�xB������X8������;e�bت�>+l���"�I�2bdaz�<�
Ó��*GӒzB�Iq���B���ߵk���f͚U�!G}X~��|�{��-�!;gD�VG�׻�y��a���i��±q2;9��ab��}u.��߷<��?�s���|�>iiioB+�����n�j�'ѩ�+�h��&�@��r�9h��@?��ի|��kך؋Xf��ْ��]��>��Mڐ�}V!�L]��Ӽy�v�픛n�I�"�V��rff�L�0A


�^��������l��(�}~wu���U�
ov�>�c����T�۶m�i��gK۶m;�92mĈߩ5|())�x@���/O=��<��s�`�C�=�_���8�a��=E񅬱gNOy���ț+�/�ف}�&-ɹ�̿���f�w�}Ӑ�����wܸqc���{���#���{���{��5���
��\Y~��#�!���:m�Y����A����āK#<�;w^�x�bSamG�%//O����믗�o�Y4�6�@��`�3���ƶX>L��5V�s �?���C6?3J>}k��9}�����E�I~~�O��ϗ�ӧ�4h�����}׼���pB8��P��#��ht�zy$�#�;��
�������8Yu�(==����t0�Lt�b��[d�ĉ��[۱8��m͗܀#��������v��Ϟˬ��[ȿ�R�i�>@O���#�'O6|�w��]���v����b���=trD���-b*>����֭[wڰa�\r�+��d"Kԛy
��9gee��ѣ����J�v�x�s�q��-���a�+�1���
��v[c��~�]ЩS�p��|�y����C�P��`HLL��}��Z�r����f�y����׉M�bm�@'�.6Xi����oٲe��dϞ=՞@ϧyc�g]w�c��I�=�[�؂���>(�E���>�=���z"v�=��_�^|>��~�ߜ�^�>U�m{T}�d��U}m�'�hl���o�?���B��o�~��*�&�HMM5�Uu�7l
�m�=@/�	r���x��\�����F���I{
�nYu˰[��
\��0s�LQ�e��{@������1�r"&��kŊ�����˥��~��~���P8�ol��n�' S��5}C?��1}�Yb�ѡE����^�~��c#�}l0���,.4���w;������?�q���vC�;�U�S�\�a��l�ȍ��ݴi�,Y��ȳ�a&�mm����Ȍ���,mڴ�?B{
�n��aܱM}<a�������,�v�OW_��_B?��~�W��o�ؚ���^��'ϰE��A��u�+�3����\�>������������;�*�+�"�~w�S�DM��N��r�?�w����=|��]��sl>�;�9��k(�M��٭O��w�-�}[�`�����]��Zy�_�ϫL;�����d
�{�*?�+y�\vN�x��\.�L�x��98꣫|l��8G�U:6	��k�<��j�?�9J���96u�͝�uα�s�q�S���M8��N��
��4wf3O=�"�>��u�	�yNG%�X�`���F�����=��s6��s���%�\��"�GEz
�ب�S��5������R
`�S�f����n���Y�Ɯ���~�v��j�>��Dc�1���t�k�qb�W�>�P�|]�Z�?����H�������_jý��Yw?��kb��N�A�Ojs��|��3��H���
5qj�����Q��V���ӧ'.X� �����u|��X�8��x�x��b���Nj��w���ckh}r�A�4_c�{�\�%�fOl�C����}��+�p2T��8$f}����<�'���_"�3�M�Щ;.2�X�o�h��k�p�#�!��Qz���L�§h���qn��>�O-����SM
�z05y�>�/�}O�mF��6z<�#=*z��	�eN�g�Ǐk��6eʔ1�~��g9[�r{�Z"�\����?$��N��^=&�����`�'�q�J����¨p���@=�ԉc2��4 ��A���L;8�ԧ3�k���x��x7���sd�o��J����
���*���t{/�kC'�w��'��4iR�ԩSǸ{��@݄�`P_��T���3QE�1�ۘ��&��'�<V^�}�����3cL��^5Mj�V���_�7az\�SF�mֺ�%��ޮ�b�ٳg'.[�,]$�'>7���&��!�*���
���N��W��ԳfnM��-���c�=�������۱'���T����3�L���t�S__��	�Ls�>�T���G]w���~���6?C���}w�}j�gt�U��Ы�Wr�^�k\b�XΜ9��?�|<�!�q�y��o:���1�������%k!�?1��ɓ�fΜ��>̝;��=�.���,��"k�{N��@�=�:$�)q5����ǧP砦��_�.��҃{a�7�b�~r����]��	�qi�@�������㿌��1uWz������O����-����7?U"����gę{�<�L�[�?�.�}��H�Ottt����I����7lذ7"""d�ر�\XXhj6�a�9����F�#�'3��~�}��z㿶m�>�zo�@|=}zKg�#�<bp�Uk���J�<�=������D�ƽ{�6�Wh?~��w��X�5d+�'Χ���RY���/v��7�S�b�t��=�uz<��~�a����/���w+��{T_�����z��������hek�\�؎����RK���~�����y��^`���йs�ι��(��$�ۜ>CèQ���[o�����f�~�?��k/�/q���Ş@�Иa��gƌc�5y|>6��£�>jz���e���K�LO��]1,���k��a�k����c�W���{
nl�W_��f}�Q[c�(:l��/����M��H���pm�>�X��,������KB2F�����͛�}�W�v
���@�3�>�\QQ��׽��	�O�t�]�W8ѯ��[��|���#Mj}����wv��ݭ9�����r��
��N����zO�NJ+6����Q���U��^�zu-�SVVvB�1�^0��g��z{�(//7��>>�Nr�O?m����Y��5����Bɍ�W�� �?
���ң�R��|�&����)lِo9�����F��؃f-t��D�X0�x ��%n���M�&�Z�;*�������p'w"$%W W��\i��E���ڑ�]����8?i��T����^�~�}䝑�w�SA7v�AC��ҳ��5��s��ur6�>��=�[����[�{�zĚĺ�e�f�k�s�R:���M��>�S,��|�؝�����iJ�=f��_���}Y�t���G���D^�c���&�2�&��F�O���[����RƋ��r��A���PM6럲�G����)�|衇̞b����WKd��{���s�7_)���;v�X�ޏ��&��S7-<Ɨ���[��{��~���G�	\�����|�4ts��^���ԓ8�<߽gϞZ�2r��ŵ��i�LO=�~��3��&�枰��מ�ŵ&����[�F��r�����)����ODD�:�Kk͜O���Y��a�W֚{�33�R��L
�IMI������%s����̶���3�e�9���q�]3S�e�����<2)���n᷵����
�����i��c#��!p����4<+#y�$繾��4>KWI�/#9;9%iTRf͛����S���}���R�R��-<1�wZ���I�aY�q�ׂ��G&�d&�GG���䋋��{����h�j_Z�G����/�_\Ϟ��'!�y����MQ�HIu�ɒ�%-�-����kʶ��+�*�.;[vmy��6����G���*_T��|K�������c�^#�(���tMiE��]��J+K�J��V���E�ٱz~?��P�F�^%O�3O�T�תЫ���U���5OrUߵ����0__�/������K�
�����r|y�E�"�_�o�o�o���W�;���y��[�[��m��H�����?�?�?ڟ����g�����k��-�]�}�J����گ@b���G�P�S��hKQUQ�������^������.�*�;��^�e�¼m���Xo/o?o�w�w�7]�q�������PKEePQ��h'��pip/_vendor/distlib/wheel.py�}�s�F���+�h]m
~�7��Z�>ٖ}�J��ݕ�0H%D$�@����׏y������E%I�������kzv���{���d��~�h�{�_vvwv��E�����&�^�gO��~��c�S����,�%+c(�&����)��Z'��ȃ�b�,�J��E>I�~��
Rh/o�l�h
�vU	1y��΄��<zwv7�� �'����O�_|8z�?B��iŨ$�.�E%�$��eQ5?���d�5�Jg�Ύ|1Jk��s�
ˌk�
pM6�{V7�&��1��M�y��T+sQ��H�M2�f��uZ_ϲ��
��_�"W�g��P[}-4"eQg�˴�V?Tr}M��o+]���F�K�_�X��$���a�d���G�Ǣ�a�e��L0J��j�-+_�a0��n@�!4��I�U�?f3 ���L��
�q^7�l&&�&��io.�˫��[��0x{t~���0y}�����ۣa��GGo����9����_��u��n����)r����$8����O�"�yK�pj��t|-�����$)�6�ap%��~L�2C�t����r=��d�BK���]Q��Y�EL~���C^/J|�;�����y��@M�~C�EI��sX'���
�+r���c@��k��1�u3�ٜ6M�La�*Wze���X��ҫy���
�I�ߞ$'�G���-�e�@Hq9K�)�*��Xf�u��ަ��e����,���V���û���N����'�bN��ܦUZdɋIф$^^4���"�>��a�zf�b�����_�0t���;�=�����9<}�#�wy�E0ĕ�/c�{!�xZ������x-=��C	&E����E�
$����"C��5T1
X�٭H�QI ������:C���O��OVɫ�~-�n����'Q8t������_��y��z��ma���|��(9;��Q8���|���a�AƿYQ��5]%�g��;;��&�GP��o���0w�=�s>����{��;{��6������p��O#��r�r����#�9��C	a��+�%������w;�8����w�O�^����a�xl����g���z�o��ُG/��itT�뇻�\��c�1�|����}����#�}{�o/}��
�GQ�p�;��_�|�����ox5���?;o�!����kQ;}�j��d�[�h��~PXK�_@�f9D�@���,���-����F��1n����5I�b6�
~�a_D��*h����t߃\#���Ʉ@
��q# ���
ܵ^���q	0M�n��D12��*1v��j�TB��A".�2��t-���0�
�܂�2�|����H,���닛K��4�'ɼ�,f
��b6c�!:(BX݀�T�5mV�^��QC=�:尕6���Y����?�b�J/��ą�y�e����J3���I�#	8u��f�(��Ukt��(�ĉ����Ƒ23Ⱥ/> q� Q�V�$|��`�U]�����A�3�6��ੇ��2ߠN��R��'�}��\�
�S��q����o���/��v��fK2VN���**3������?b
�>�zT� =�}F�/��Q�Y_���]h���HeH<ZA02�U~��U���銿YsW��c��R�'͹�X�d~Э�[x7�Fb/�
�02�i��.�I��@	��!:ޒ�[��\��$�^�/A� 	-����w��^�����$ZY�C�T4^N"GfR����;��N�*�7C>��z
$�ɩ�5la�L̕=�yڌ�#U��l�ݕ�Z��WU�M6�5:��n���s����
N͜F��fV��Y���uJ�����p���FrOPd��C͚5\y�{�ے�~z�#'�Yj<mpۊ�a�i���%�+�<c�����%
�sZ�!�=���yB��~�mav�~��k����j��7=�i�wt�_u����o�kq9б/c����˼Lζ���k��[���?e8��0&l[����ɽ253��7\�?fŢP���������M;w��|�N�5|пa(�X'5cah�tv��oV�k��h���E{�!�$Hk��&�g�=���������CsΞ��T\����C|���k��>D�!�fpW{&��ܧnO\�ւ7dӼ�a�����Y�EHA�ŠI�:�L˃��d���,������.�B8t)���v�L�:iSN�ݲ�j액�G��ܞ�d��S��G{jس͒s�s$���h��#k,�V u�e�6 ,��*�e����k�Ғ����(�ap�|��eQX����@c��&�2uY��
�e.B���9�f��	iI�͢t/����M�+�ۖn��D]��Rz�Γ�`J��E����[���~��~~9����7U�=�2N��S�B��.�M��/D5����_���T!.�n��М�2�a��Q"�����>U��T�5���6��+I��f,��ʦ�b?��`E�tJ��+�
�A��ҶUE��eY�t��⠤PZ���q��"�5Wo#���Ɂ<�\�f-��7�h��t�����?Xc�b����iy����&&M�^6ݙ���ru�ٓR��nYr�a��~��[���B�iK�HЩ1�6���(ͯ�,��V�P�3�y��Q[n�u�L<�]+�ȶ��$�6�R��
7�}�u�.��~{8�~��
;+�L�B*�">C�W	�U{�Be�'9��g�-d]^ $\ɢ�t
l�do�1�t|���6V�IMN�5�R���b�����o�pʹ]zD5��JܑUyF{�4��T����UKU�M�%�C���	�
��Pdz�
�Tʠ�g�����g��B����1-T�6��iU}�my�q�t���o���Xk��i��0f[��ж�7�?�b	����P���
�1�)��Æ�c�g��3 Yq 9HgWE�v��B��4oe,���uy�q�T��fu:���"�M*���°���Ap(:(
�z�e]�X�3���%��$ԯ�����ꃌ�A��!���������yz#(Ҭ\
q��/��iƭD�A�-#��UbFV�n��v�ʽ�_Ŝp���t��
�v<�Gӭ�%�n�Bw�p������iXK"�^>ڌHNA]���H���(quKp�D�Lw׊�L�`%v��%!�HxB�V#<\Nr�i��Rk?�Y��ށ�Q1	w�ǧξ�"��_���(sg����5��ɐ5<=z���N=g)�EP�Q�l^�)�MU#��L���D9��Y��/�����i�'�-ayȸ�o�'���~sx~��+�m;E��7`;��U�\���|�/�Pn�xi�UԾHbG��u����^��]�x�{��(���E��J1Φ�n��n5K~�%6k�z���Y��>��0���P�Ma��9zc�&����F�_��Ȋ�>Ḥ��rA�&Ï�����+XB<0�Z��:A@�`��l�b�–�h�"Ǽ]zI����ψQqk=���Zl¨��� �vz�p��O�)�6p��-a�!�w�h�n�ԁ�V
ǀn{'�
�]�X���]�&����=�t�-=�zU��y?��N��
^gq�f1���:Ccr��8�G���)�&4�BB��5��5~�� 5u;�Cr�����0>>���M��D�\c���A�o,����-����#A�e:�髧�Jc_�	�qP�=Y��;7=�k�m���$��9q�5���PC�<ȓ���o�}��"oS�NG�DS�|��gў�gk٧����z�2oi�J�b�z�ۣ�6\n�Z�eg��W�0(�k���9nwVu%T1��%Ì�#ٶ��Yh�*8��g�?lhsn�2��[��|ӰNo�Aۆ]QtC.vi&�7HD
�ˋ�wYg�8�N�/�x�A����o��^��;�r{6�f[������&���Ⱥ^z��-�i]yzG��W)�MQ�@��
�!-�)�M
w`��.z��2�&���&�YC�{3��
��XO��E�8��.�*�ͼ\�{(����(��v�Vk�_�m�������&�h=qpX�0%��HS��V�"FtQ��m��ȋ�յY�L���֟\��w��ֹ�m#�
��ߝ��yst�_�~<<=���%�K��-��8ﶶ��毹YQç㊽p ����$~0!I�
g*��i�:p=��"�SR�4��X���>`�V9�9�w\��/+H���t��׾}N׹������
��3�g'`|���u��ϻ�������rpW5^"q'-�ݠ�c��	<s	�i�R�i�ǰTy��IcR`�4�!ʚ`)3"�mQ���&�d�.�
�K�{�2��m{�C���e��h��i��}�1�Y���~4�(�v�o�TA�ϒE��01�}�h�Mk���Z,>�k�e<���4�o���[$�0�.3ɃG��'�Kd'�r�^�V]�I�L����+YA�g)*8<F������@IW�L�:�C�y�c��1�Uk����;v�:����A�!��-ʯ+��c��:ת�~�C�D��}�ϲe�Gi\T9c(B�,�����"�:u`a^I�
YjH�M����5�<���Ma��X&`g�o	�=�_ǣ���v�s Fw�xL��1�Cγ��~�:G�Ƌ��f+�}R w��@\��?�ԙ���j�f(������"C��x�Po�*p�4e����\��H��rU����>�@���g���U��ǭ����*��Ax�3���`�X.�_�uh�Y� ��F\e�L>�Y��� �_PFy��eZ��c�NN����
��'�~�jP凨`�	�c��'R�R)[f��ӑn���8(��$���P2rZ�@S%�z�J�SNӠ�9h�Dh�ɈIl*�M�0�J�i>^�b���z�m�a���K�4��!9M�e�φ�
�d��X4&��
GTΫ`��	i
},M�R��~Zf+y$~��.�F���x��Kzm�0-��P�E�ۈ��Ѫ!I�b�d�CYl�e]
O��F��A�4�c�܌��������@3��w�
Z�#D/e��g�
�kĄZK��ă�O|�?y
|�N��@o3�?}*�H�F�\8�ǩ�B�
���O�\k��j�T	h���i��k^�lT�-�A��*�~�ǁ�(�}�ڪ�n
��Ά�?�ҫ�6�m�������vT��XO{M�[���bw��4O9>m������m��ڭ)����#r�~s��xY�5�!�u�
�;�u7[�pHq6�]�88]�v�m�ԩ+�n�.n�o���ڳĚȽa�*聳�D5���hJx�t�C1|P%��m��ӡ��˺ݥI^N?w����O'�B�ֱ�p�����@�!,�X���J�
��[P���'��-j"d�-��1��i羉�v �v�]Q�L`���(7R�R��U��(�P(��%c���"J-x���&a�Q�U���й����V������7.�8��^\RE�J��pQaj�K0ՉzPⱊ哎[��gYT7��T��x~3��-'�A4A[�@;�Ϡ��t��TLL���E>�%T�fu�UOJKodyKN_�<V7�v�J,��Ţ�}ʾx�1ڲX'��Ǐ��B�)�\����z��R5�T��S=0�ZM�HV�O��>,Ӓ��-���E��ϴ�3��6�A�A�ר�r���48?$�����%;��*2�N(>	w>.ҏO_�!�Hͳ�Bwi
���*>!ˇ�*��t
�K���,�䆃��`?����t`icmt�&C�֍;nd����6��p=Z}�%�|݀�#MYߘie�����"���n�����
�R��>�6��}n�L��]aY��]� ��h�}�s��7��A��)�O��B�*�0����W�����.7Ӷ���#�tS�E���+6"�ٕ�8��u���ct�y����mm��X;�Cٯ2�������fؚi�eJR2C�&a�;M���\��6VТ�  䱗�8�
Ad��k���б�
�^��h#��c6Q��Y�z`E��\���́��f��ٖ�ߋ��'ђ�oo�Y��ˢ6�,W�¤zO���a�Ձ*F����=�����������=6��.�_��ٴ(��@�=�[�i6�7�d�\ð1��G��봬�<Blt�n$S��;�4�G�:b�y��8�5�5�lQ���h��_���A]�gQ�:X��f��+o
���	�쎳ܰq!{��I7����������Bv	��D��A��{:+O��G��&v�NK~�S�Oe�J��:�h�h��)�����@����np���>�+l,ƴӖq���l7�}`�+�f��>y��yG|"�D|�3�=�@,H���J�+��c@�y��'V2�9�_����a�S)R���q�ONs��I��G�F���9G��&�\c<$3AR¯M�)�{&>�=�s��ߘ��Q
Hv�j���~��iY�ۏ1̴.f-�W�l�n��
�a��m#{QL��v2���E�Ύ�jMʓ��;|kھ���I���,d���n�K��m\Vb���|׋)|�B���6��:t�Qx8�KN� c�$���\��*�jݿX�$۴��:�&�c�:�r�,ks��x(0PTZ3�#(}���ݖ���������c-|�g(�(���lRҮaf�#���(�G��:�f�X����_u������g��mz�'���$�U�C)�l�����
�z0�׃ �]��9Z�ד_�,�&����A�6����C�f��r�H�Ba���=��P�`m�G�6}ؼ��tѭ��A�o�'i)lH�ܒ��5�#�3��oV6M��'>2t�{�Q���y�im��=��Z��=T���=�߉�W6T�NW�{EeO[�%\�8�CM	�8�WV�!��i~%(��‚~�l}X��������"�Q!�SkNɀ��A�5(s�3YҠF2����W�Od�z:�
$o��:�7���G
��m�j�l^�����U��v�������b?R�+�d�|�_U����i{�q���#��mPq5o*!�=Ɋ)NhwX�y��|��y]͊Q:㛊�C��@������>e
�-���&P:s~�'3�W�}����'�FO�C���{GR4��:�>�ыp�yN`p`��9.��=Ht�SD9^�{9g�>.U�X��.�	g�7D���&)?�<�!���de��cx�Wݹ�=t������A�9ù�ۋ�_�9�I�=i��[=:�%��°�:1����
��I����Gq�
~��I�X:?�^I�Y왰��Eyc��u�6֟Ʒ{-�c#D/��JǍm���j�D�#❂�+̳����dN�
n[]�N�P�꼌t�
���BL���޲@~�>T��X�_�@�Pׂ�����u�S:'˩�
�Msy	�:C�S��˭�1'����'3eV'|�b6��M�n�eS}�'���\[��c��l��Z���x�w������|�1���J3��	�u葆���{���>����+�05����u�N����r���i'!(E��k�!e���k�'ɎLG���C4cI)�-[0tf���{�2c�)h~�V7<`t�����h�˫���1\_`���̋Z�e��[�x�=r�J
�Tb��mOrSU|���6T�s{W[P�C軮K��T�!��J`�7��BUQ}% ]�G?�x%�ļ��-r��~�դZ��b�X����'z@�ul��l�\&�s[w��&���V�����K,�������T����癯ܙ������41-���d���A������6�ydc���*�}�i�=�||���?�u1�'���28��L9p �p��x`YG�	��RdL���,O�8.W�7����٬��
�Q:��)�(iD�(���C�����.(OIL�Iz��}a�2�Q����wst�U�j+h߇�]���Fuo}|���F�f6��p\�Ge���U�������h�oz,�{$�dg����y1A�n�&�e�
�=>f0�)Rai�x����q�LW1%NP������C&=�Lx�Ic�dI+s��>��7b�&���j�x�K7ݥ
�9��s��b�h�+�U�K�bV���*Q�E>��RVnL�$yP�>�U�1:��!}ym
*f]pG�v��1�h+��I�S�jk0_�	��9�T�ńRg=D�d.`�\t������
i�4��c�?$��}�ݖ�du��f+��X"�nh����1'��0�O��l�V���%��H��G���ҽ=��+Uv�.-S}l*}���5�����,	�����?�0rdO��j�6QU����	)P��
�|i��]fdDV�����i���<�*�]�|���.O4
���{��^��<|�5ȵ�dT�nFb����,�p@�g��q���*`I��<�z��-�9���[*Y�A�"&?�-x���@!ʷ�x���׵�ȯE�GOqH|d��_V�r�BT�BDI�$��,x<ݷo�A�����^R��-VQ�����.�{s]'HZ��W�{��ֵ'r|z����%�1�Vr:h2�� "�/z���`���3�{�E���9��ׁ��uí����
4g����y���d(��n����zF�
*��"І	����V�ԝ<�w6�l��M��|ox�5��v͐
������q��=����`���ݕ��S���U�}�-���ة#�|���?�v���Zt0�dg�-�b.(=����
*R���ǔ�D�V+�I)���`��슶t�)��e��޵�U͗X��@QUV^&�U����:#�wȄ��#ݑ�(�5����hڄ�Y��d�!�rvo݆�a��l�����������^��2�Ωi\���� �<�z�:#.�l%�)A��9���{6��^�{L����B��ڥ
kz<+jM=��~�2R�[����N��S�1
�����[V���N�LۣZ+*��[����,2��M��)�ɯ�0������X�jc��W�H�C���
t��R�SLpgU:��U�r�(sة̋�I�2ή�p ��+�tt��}x���/���_
����ʿ���<�)�2�Z�OQ'�T����P�c�+��Ҫ��R鹠9ҕ�.UV�uis�H�h6M�l^�ŔwO��~�ȄxT��%���RU���z5�Ř]\Zs����h��+�X*ib&��AQ 7���Q.�)���\�#t����1�����Zf�ݤs���;e�0��|4H���_��w�1�!�n�eV
����r�hv��K�5�ĝB8����
 ���O��=j��w&V҄���½����?}�|�|K��_���Ă���$Zogw	���!	wd��y�9m����<A<����<�=��8I�=lT�pV���ꛌ�W��q]���8��"�l�f��N3������f!z��-�F����E��D�\EG���K��`	��B�#�����ht��$99=v�-50���C��"`^b����@�"����z��φvrrsՒj۹Wuk�]f��ot��2dyO�MI�v�&@
�RF��o��\��E��=}�$OԢQ����|����ś���3>��J%(���?���J���5TE���Y�a�TI79�߹Ѐ+�����	�s�f�VJ.ՠ��Oy�g��z�����dR��X��S�B��?����_�o@}q��/7���PKEePQ#�g��)pip/_vendor/distlib/_backport/__init__.py%��N1D�Q���= �(�x���S��=.�͌<���G�����+S�:���ö.8A-Kͣ��2�`�'�}��hHn�J�Ҏ�Y*�r����U}��X��.�yyzƂ����\~�}X�YKξ*�j��/VXGn�|(x�_�6�����A{J�a[6�����Ln���V��囊)n���;��J!��PKEePQ��/e��%pip/_vendor/distlib/_backport/misc.py}S�n�0��+���-1���9�AҡIO� �2�hS$C����'�Q��tM�==>�SX�[���2�;h�^|�6eSX٦s�p$�W3�����G�o�����p_lk*Aʚ"�v��u�Zow���T�z��7�O���]L�>6�L��XGj�@�J�VU+4H-�G�c����틀`L�"�O��<c��9�%|Ϥ�G䵳'�m�$fsI�E����h���`�����8�����YbC���k���o����8�=,9�w�g(.�,�z?j&3Fd6{nqH�3p!��3V��
<)L:��#��|�j���i�U��f2�-��^�(��'ad_�?�g�̼XdY_����3�SeKxeb���&�����ɩaeG�G}#����o�/O��EYxm�)�CHx�����g��9�؄���F�'xn�=��s0���O���zQ`yq��<��]��PKEePQ�9�Qkd'pip/_vendor/distlib/_backport/shutil.py�<koɑ�+:7���w^���F�$kÏ�^��Mj��3�����g?f���	p�>�$������]=���7�ͪZ������_NNON͋j���uk�3s���pm��C{]��}�io�ښWUW��6��&�����?����[��k���޽���o޽�a��d2���E�̦+W8�1��\�@�&f��:���6ya�m��v�V�����Mzr��O?bε��U9m	�i�im���W�1�P��fg������l����|����T�~j�c��'����t���Fd���M����I[����9��(,�f˕�}�E�,����ּ��_�uU�OL�ﶮˊ�KuL�����<X~9�����l��۷o�}x��97��8*�ѯ��	���۵.����vG!���CU@m�}j[��8P�ph�����D���dn�W�����3�~��&sZC��7�B|��>��N!����]�Y�
V��"(/?ە��n�垀9�u����v�7��{�prW}��E�r��n���Qoj�Do>�j�mY�vZ�fryr�*��1D��U��%�茷t#t`�������Ʈ��-�V�Qi+0&379X�jc����t�Ħ�T��&�+��`�(}�GAx083
�AvI�f���󽝑�t{�jX�vh�VUW�i��5�t�~���ֿ
r)՚UV
��D0q7�%%�C���'os��hq����Hn����o��h��?�T�
!���p7��p���ݘ@ǓMS��f�nڹ)l�m�ϟ~���'g��	"A.�l
N}\�7���a��X�ြ� <}�tc�m+��"�^}����n�,�'���7�\"����&0r�.�b�u0D�9E��m�\���2����R�Y*W'��f�0�3��c��ն��R�\:\׍�=z�>ءq����/�MF�̬��ꆂ\��RL�@QR0$�U�X��x_Dn63����Bjf�X�����~��F ��Cd�����\=j�H1�-�7D<�%��x3��gS��4���-lZC �Y�)�c���U0%��+PU�X�7M�ف�M�������ke�C�7�Y�nl�A�S���.Mg�,��_�~��7	�F�.�g��=�ނY�7��F>#kX��|�5+���z9���!U��Qd[��:
��Ȍ��@Ґ�c����2o�;���6౺�)�NG�����s��?���e�R7&T���9���vt��MeG�܀��Y��m�l�̎Q8N�C�����B�T��)�����/�qpV�1j|"Q����H�`Iyv�J�:4�WbT��G�E��JP����o�����"�߾j��ƚߜs���)�Tы̝V9�>���$(��S��mڼ�xc�0��|f(Qk�70(�-�Z%�F���E���%���XNB��9¡6{���%��.H��5�cs��b�����J2wp@?ĦHR�a&ȭ&Y�L@�é#�!���l���Ζ��C|�-���=M� �A렿�E��ݚ�n���`��>�OȒ&`#�Z/�wL5/}�'��k+��.��S����:�B
H�������뺄F�m��,���x�$�ꦁ99슼�i�)`�j�`�i�B-�$��X�e�uVn�v��Hg�r.(�z��#��:�]4`Y�!��C�_o�”�K�����=I�%�AO�A��@bR����YEp XQb�g!���,�lY����ٲ��҃��@�Q���enq�
o�\U%Ȋ������eq^���A�V�v�*e����%WʄH
��)�z�Z�c+p,ڞ�&�G�lvL�K����!N���3q ���P�����Hx�DŽ�����&�Pu�ee��7@7ڈ�8�I!�ls���g�Aƌ�l0嫘���@�4J��bF#��ư��u6Y+��ѶlA'JP;f<<ǧ*�H���7�sW�`)R���K�����e��5�s�A��*�!�Hx5��9Zd�(����X@��)P�خ�52��+�s<�}�ZyGr�m���U�;ѵ�.��]c3�$�%�Ey�%���,�l�k��%�����K3�8�tz5���<��U
������(BU%�uX_.��PE�VmPhW�a��hR�:�L�\"�Dbn���Y�6��qo|���f�Xk*�P��x��{��z�@�\��k�� ��w��=7�[Q:ڟ�S�>@K��E�2���s�(]8��@oܓh�~2X�Vt֧g����B0G�w���Hr���A���h�Yv$X�� v�
z�h�`4��br����2 a�s%dlX:пS5��G�����}A%H�@ά�8;�H��V�S��k�8-�d�C.4��&s�=+U;��
L���N�b���0��`�0P�^��_tl�N͏��b�SW��:#�ao�QDS�62�e,+��8G5XL1�T���J��
Vd��k�]���`ۡ�<|K��6O.9z�x?���l�Gpc�<̚I^���,X�X��(*�v�u��K�
n�G�{�Ƈ�z�k�w�+
e�x�+�הc>�yL̐\c��Z,?�����$��4)�wʊ�s��ŷDz�כ.2��\]���G��dN���Bgq� ��k؟���4X�u�&AU�č�QX`�O�����Au�y��9�t|�v�w�F�.�iE�6�����ҤIXpp�v��F�fs���1�,�Q�B�	�p�6Ja\8,�Dp�z�u;�|�ݓt'�l����kfEzr�<P6�a)U���P���.s�� �h�.��9}��9\^
C2y���(_�r
汓1�TG�����_���=�61���@�uU�h<�+�D!�Dp7G�ObgH<�G	q�q��;B�MWc!��0��I��6�x��		�<	%̝�|��]2r�"�QW�YHg?70�r��j_<1������Ψ��H�mN���_)4�ȁ�+��zj����|��k��o 
�F�:߳MmA#9�-2<݅m��fK��rή�@&+n�C�m0��g
j�n(���X��.��6":l��[Mx9En�^Ni�u��-��+�Te%GZE��~2 *o���wy�՚����>M�]".مI/y��:.��e��y�H�/A�����kWX�Aq��`�.�h�Q�J�
��nE؁��?笟 ,��"��!JHU�&�`5����N�म6�O5�	ź2�q�4�TXL���)\�E�(��+�8���fMU&��eI�{�Z��4�`�^ov���^nqCq�Ԩp��i:�p�.�A�!/�-���gȯ���>Y˱�=&��6�h͎Z'��*���ȂQy)`qo���X\���<DV@��h���a;��a_�HV#�<=fH֬`��k����Gʹ'�x��`�[〺x�c,�����b	ώ�߀ 	��xySBta�
hfc�
����6B�񁋒��`�eo#w:�.�2��
8ڕZ��V���@}>7aO
�I~¦�j��W)X����?���^�a۝��������nD@)�8n�uTB�5I%��9���K]u{
�� %p�����{�����-�@�^�c��?�CO��$3߸�����C.�.O�xy�t��R�.���z�-ܼ��c���d��-!�I�6.8����aLP���K���
8�e���'�F�aQw%|���[�8��L>�vk����TEH����%���v=��n��ʅ�?�ʵ�*�T�����*�)+घ
��ۦ���L���ل~DL�
S��S�a��c�	��DL/w8�^aȩ�ڐ��4|`����0�}]}��k-g@�x����'(�YL���sK�q��������8 �1|_t�5��=��u;�n��O�)���/̲I��r�Z7T�Z�b�[U�`�E��<��>n��Y��t�
ס�!x�Պ�k?�/�W��ҞO/|<����:Ѩ��IB}Hr�ÓL��D�t�e9:�l���I�?S�Ƞ��ௐ\��K|ɊN���-�N8zM�
Q�>v?Qc����3��_&)�K��mj�d�N�@�(q({!
)�Ad�=���6�|�X)\d�v~��#Ƕl��m'�����
���#�0�A�cg�8hdsgn�d%�2`6�'�3�q���U���6`��dQ���AY��-�<�`*�F|DG�(3R^�*��͛���i���$�����g����s�Y�R+l(}���?�|yGy��z�x�MP�!�|�5 #0V��Y=��B4��ce�΂�l���m�v�{y9PO67q�3W�w����X���3��TLt��ܓks�)'�k6Dq���wD���k�B
X�������26���R�Зa�F?'��<.}�)?/=��(�"�b�brN�;0YP�.o�������	U�jb��;�O�Aj�hB�	�����<[�@w�gzC�'kh���=�y����9յ�6X3Ā�_`���%��d�+U-��p��oMNf�Y!��U����q�=ѧ��X�9�1���;+(B�1�T#�(q"M�p-��>���`�2���__��Ye���thIe����j*��tm�.�I����B�n�9�Ip�+��=2�Rz�<a�C�E����7�_?����kaԳ/��!��=E�hB��&z)˄�hp�T6���KgB��<�z�wq�9����E8�)�N���X���ⳓ�-*��2&�k��ޏ$9��cu���뷋�_���s�g��ON5��C����|�znA�n���m�H0<�ss�{����5/�Q�,��*J���(a�/b�9��qY�2l~u�}����)���Z��X�����w/��//�޼����1o���&C�L�`��"	s5�qg�s.\L��Տ�G��R�x$Nd	�Ő�=��{^��g_�qe��sL���Tt\�hH�$�}^Ř�?��{5o�'j��LO�
��^�y�h�.��� �K�W/�Ci	qW=�~�D��l���oUS����Ox��a�8��9��?k�z���|
ʷ�/���M�;�D��Ư�R�3��9m�-�GD
�i��i�r؄��0S����D�F3ڞ̙���$
��*�r�G}p5��1�zX���5q+4���5 ߼$���i^�r�-E*\���K��ﺐ�����Gm�^Q����E���M׷zn8쥒5��Q���Ś+W0�{5��y��&!��I[gw�PRZ���h��S��z����F<����9����l�qM���O���E(xZ
�SD�tL{&�T��6�㕵-�,%M�@�N��������W��
M{��}�!D`U��۔B<L��Z��aZ7fk�0��]^vh�B�c����K������s4�p��<m�T"&\ğ�Kd�����b����[D"D.��׷�l�ߙܦX�i�|E%��5&gt:����vj�!�4<����LX�9�$Abέ��G"�S *��M���L޽Z��3h�+]f�:��,+�~%}���k�����q(\w4�k��
��,,�F�Z�a5w�ּ�@uW�k���ęQ�‘�)���v�m!A���-������k_�Y���~ϸ˹I8��Ҧ[:ta�	-l��<��V��SY�[��&S?�9��2p�a�=ZG~|f�#G������)a�{��9��k5��<D�≿��<0�4x�s��A��Oe�ߜK�ߟ"R~9���s��Kw0�@_0BJ�+�|��A�k�J���	_f+j�!W54��t��Q�H�����,Ľ��+��0�u.�"NG�9��oQ*�=��4��o����?��,�;�A)�'!
c�O�t�8�ѻ���H�^
oA��Sio�@����ܱѱԘ�q�����p���E#�Sۈ{��Y!\����n�׻����,�iȃ΀8��@�i7[<iĉ�4�84y�L��,6��+��#�w�!ŷ��珗���%5!]��j���3;���Ѝh��.<(���l��V_ݕo_y��D�{@�V-;�_���Ŕ���'O�?�XC�f�u�?ͽg!o�x��br��'Ե�RE���]8uJ���"\�ݺ���#�]�?������&�e��͎<� ��a�5�D��-�2�5M�V�K1��80@��)��#,����X��@/��Զ+�r��ɺ.������w�\M��yX�f(�\�
��+=���"��UL�+sYc1�ҡW(�W��H����.�����"_ƯÜ�$Ř���,l;=�ɛ����<r�_� ��w�ˋ�6�Af����O-�3�ߤw�"R@}3>�G��+@d�?�*����4t[���K�i*y��WS#`м<���L�t���Ʈp�=��	@�@�V�@H �E��R���!��CW�"�M˻fo�`�����ޙE{�/׌�fx�o�%�F^�76z)����.;}���Oճ���h��x>����B��h,`��j���[~9�:�����=_1�Ř�Y}�E��izp�F	�؁Zd� �
u���i��2DZ��xF�)/�{3��\��C��)9�;zR�N�q<W0�9s쌑&�q����	�����ެ���zAD�O|}r�s���5ړ�l��6vM�sj�	�w� ~	���J�i��E�}<�~��#Fol��c��]7
���bG�h����;����E�>�r7}"��WU�
�yS�q� Ά)�`o퀔+»2��3(f��l�B����d�f3%_�+�(|;��A�+�7��G���/ʆ�Zu��8Z�x�^���a�?R�%E�c?J96ʕ���'�L]׼�d�n��������Na�s��$�<����T��
�����iW"t盠����=�ywY���7hXJ�����c&�2C6�Ґ���O�;6�,�޾{��PKEePQo��9
+pip/_vendor/distlib/_backport/sysconfig.cfg�Uˎ�@��W��kb��s�)R�69Y����i4=l�,���<� k�c������*�X�%,�x9��+����du�bO�Z?�4��������r���}K����K/؟9��H%%��\p��f
D�|8�b����-y�IVE�+���IQk��耩r1���E�tP
�L�/:��x�+v�B�
�F59)��C_~a��r�W���j�
�گ�5A��Q���`�nJ�%�VƮ�a�5AY��쵬�p,�!��M����9m���)F�J?��%��6����*���/��&´0wbG��ǎ�G��+u�қKOo8?�y�^wt�ج�����ř����ɴ~.ﻄwIW[�
��z�FfW���u�6g����L��S�,��s��[A�)�뎽?rl�?z��v�q���6�as\v�nj�RBo��Xrrmz�����b9����ؽ*׍��wD���N���{�d�+�Ϧ���PKEePQ�y룩�h*pip/_vendor/distlib/_backport/sysconfig.py�=m{�6��+�R�J$:q\_έ�DZ���$�c�i�l�BI�Ř"���~�� A��v����m$�y��g�g#6K�Qr���b1z�O�k}��fwyt�,��7`/^n��%g�w�2M�8]7a��۴L�a�I�Ɯ�w�{�Aq[�0�����'�o~9=:�C���vg3.+R��H��.˜��(Y��J���kk�*K���3��շ��o�N�-�t�AK��ga>��!�c|�V�w�k>hD�	�����
vHMy��V�=�{L}Y(�kk�IǓ	�ag4ʻ��D��,'�(�I��ް�x���|�
�8qBµ5O��h>��a�[n=���\�\�9�-b��+n���W����s�`.�Dﻏ��ݬ�?9/�<av?jU�q46�A�	����-��E8���89>9�����ɛ����"����� �5�߀�fa¦��UV�1�>�/��^\�%PĔ�͖ar���	�w"�`�	��e����b����2Wt.��4�	Nev3�a�x�c���%E��e�i��0�
�l�z�"�������'�M��F�o�*FD��xo��?���(��g���kJ/_��85q�}���y/n�a���j���Dr�_��d�HhF$l�D��l�����10B-�ސ�_q:�ޠ��N�=(9�E��>��1p�0��$O��m����?}������>lAk�e���M�C�E��'��yժ�z�S`��ZO���E�A�s��9(-�Q2���M��>a8�
/9����$�EG��ސ�SW�&
t�_�&�A�PÍF��s����)'���B����
��!��7�7�;�D�+�:I�g6�t�`�^-2_Lʰ����&�=���"��d9��[��{��j��5��/���(������D>r�}�P=<j,�/|VLC�_�u�ڈf�Hxb���$�1u;���������t�y0KW�N���g?���$�f <&�`�/ak�ТnM�ꈗx��P���@�{�U8Q�W��*�e���1 o�-j�~���S����u�%Nt;��
�6���l��!��hJ�����"�jơ�ᠷ֌�\bф���kV�r�J���$֔�N�&LgF���*t����>,:�-������ԫ���y4+|��Ո�A�D�9ޘ��=[��/�}������2O��9h�?�+,�ۭ$���\�9�4f{a �$
�J[��y�����Ֆ���Mf�2a@*l���d|x�6�{*��Ǟ�
�,�	z)gۯ.���OG'��(��
ǐɇ���y�����S6��2^�`�u��`h�N�૽=�7��4�k�_�'ڔ�'ڤ/�� DŽ���z�	��C����O>c����Q��{���g�	PA��~�K�O�dzT���yf�s=��@���[�?����Ceq`�+c=�د=���%��jL��T���"@� yr�i�R77�t�����4��t\��mH��?�߁�p���d��#T�
�i��5���I��P:��g�p���l�MԬ���s�����56!i!?X���fm6
Y��n���w��#�Z��&e��
�ML¬�_.�D��P|j�zsZ��dw�?�?���2t3��V��?��:��G��v)�!z⋰�u0D��N���1��QC�]�$@��L����m|�x�9
���ֈ�X��oy�JH`��I�e=�zp���y"8t�f�'	��ɛ�e��rXe?�,Â�Ӵ,���
�"��#pu@���F���Y;V�{|��{��0����Lrыw��n4nG�j#�;8�2��S+S(J#��a~%��t��W�[$�sx{����ף��{�W[v�{q�-нH�Baa��i�w�X�ӧ���Ǟ��4?.;�޳6�.�mt�hꠇ����R_�K�4�!"��r�X�ޫ�#Q܁�N��Du�LpX�)�0JТ@��R�fa$u���	�F„H��2<���/��N�s'�+��b�
7,eOQ�7�d���m���	�#� ��0�
,��e>��D�����;X�*d���\mŖhS�@�5Ѷ�$�m��=�,�cw�������\<��g;�?x6P$N����ɹ�h�q��%@������u��`��(�9�տ����2\e�"H3���h��(��c,[��D	_.Âs13ޣ�͢F!gqXP�~���ȶ��D�'�ۧ���=���ye��T�C>�
�W�)�@}�c	�U��6C-���m�&�^kL��>��䉇��ρg>�T�W�+V��T��PP'fH!�{B1\�|�8�2!)��Es]Qf_;��2QX4�����1h,������'�@�{!
@ZK��ʭ���<Kc��Cߊ:��8��6Q����X�#	�ίǤ�%ZL�jQ�"�3b�� ��C�S��B�@kB�*�@k�KV�M��q�gl�,Tn���E�dPNB��K��+���w~�*"���2Y�m�V4Z��)PV6�'����w�?����W_����w�}7K� H�j�}�^&p���e����v*boEkV:X��q x��K��)k��&���^4���$�th���:b�lD�;wB��;�h/�"n?h8jC��5T�p�!C_�����rD�9D#/���vy���Q!�0r�6[�qL�I�4̈́�v��
\�݃O�N;6w�|�h�����:�Ar�j��9�#��X���	})R�?�8�c�O�.ai�T�W5������{ֈ�?��.
JG���1ov��_��^����9!�\��:t�A�O��Xҥ
��z޿ǝ��Ҷmd��8ͫ?m��������ٽ�
�� nsP���������O�{��
j�{E��q��#l3���R�
T1-��\�'��Γup��3������i�b'qC�<�a��S��t�/Ϙ��<Ja
"�NԡB4��9ã�@�0D��!kV����2���aU�"ʸ�4S�����֟�l��@+����
w�,���}"G�DT��JK����f��ԍ0���A��UY�e(��7�`v��h��V�U�f�Q>Q���G#���[i�!E;44WJ�j3�W/F�l��(��z�a,A/ѫ Q�@����LT�=�C����=���hȳ�a����'\RZP�4��P"�8cZO/'�'��\�n��ol�>�{�*�H�#��֮�%��(���+�"9/�F�����9�LF��>,���z
f�����B#eA�k
#�i�>todv�3�r2]SgG��n%9Z��ݛ���5{��_��z����>J��᧡J
�x��%�*E�C���c���Z��7���F#|*���r������Y�4dSpo�<�Y��p���\S0������HuL�[�Q�<��O�'��T;��M��I��1���\�i(��^[�x�����������k�3����Ww�?������6�GV=��;>�N^���=���o�٠D;5ve�m�O<3���:S����i;�{|(�<�&�f�����w_?6,K7��o�/E�������y���
`����S����W���p����mVEo};����vS�|U�Z,��k����Nߪ#r��	��i��Km��4��Ε�WWMP��p����y�Z��G����*�=���f��z�g$��{UC�:̺�-<m��3�H���6��&����e�є.R�� A���!�2`)Ҽ�sߨ���ps��2ã'�:ڞ��nooANq<:��n����
���61���P4J`��邍g��!����pE�c9+P��
cAaeA�MU���g���g��5�+(6��(��h��$�o�8���]�@��e�c�S'�mi�]�*��r׺�n4��P=��>�y��� �`W�)S�8k��ʚ�#q�h
T��%�h�̲�+�IZi`1ԓ���F��Y��-��`��kd�n�`[��D�h\òW<L�L`�*c��Vw�ھ�ܯQ2Oo]�x�����Äજ-�X�8,�-
�h׊��q�d����
YH��g�I�g5���׺�V���p����J��U�-æQ��)�>`U�s�j)i*���}2�9əX��;$�exͿ5@��!V�I7&̹*Ԅan�'{m�
:p�I�T��^:)�(�_��9󔴔�4U�vt4V!{��]��Kj
C���������5��=�l\t���Gl	r[��Q_���~Z&�
�
�!3�U�(�.��=�e������HMky�95�BZ���(y^	nVD&fRS�Ѭ�l:�&������t�[(Y<]�G%
T42�qz#E�^��CA5/�D^�DI��Jw�WF��1Vj����0��}����K���ɪ+��ߓ�x<�7��_
�&Ӷ%�
������sr�������p*�(Z�}���w&�.W2_‘�9���n+Dߌ�c?�7� �l^bu�y|\ �I���p�a��]����DZ����Ȍ�^5@�~C����Gь)���/�&1���G�*0���{9��KH_Vuy��[��h��`>��WZw��ޙ��e'p�mNJ{t#�"wҟ�e�; �I�	خ`i�p�������е�Q�m��:4\PY���'M�|׾\Bm��h��z�4�!|�x��X+X	���:�Q\���C�(�l�ldW�47``L�T�;�rg�T̆�{�"0S�i�	������搁?�B0#���SE��<M�e}���@Xb���h��"=�T��h�p����]7Q��h�]HPV#�ŀ�+��q��z&de�&�1+E�FPʴ�W��6�P6�B�� cXR��`��s�ôs#Ojׄ�n�)�8�+3d��md��(�{��Q��;�R�=�c�ޟ��7�^+�="�s���	���>��ȉ�������*&-�?]	��X[,hPV(#���w���;>+��NbK4�"��,[��E��N�%]���c���1��ޱ�,��D��OH��8E|ق�"P�ʻ��0�,�K��	e��)��D$�<�� >�h�1�{���$��Ty������o�m�������4ۙ@��q�I��!ݜ栧CAz�5�A�X�b]����0��kbm(*i!�����b<a�%᪊L𯅫f��X���U|�%�4t
�d~Rb�`�ل�E9(��T_\�]<C�LF��R�
�^�!� �]f�ܔ2�sfl�ֶڇ��w��Km^�d��N�M�-o�**��Dz�.-�P�'�#�=Q�M�t���$G��JѼ,��km��`���p�.~���]ʴ���+|zO���kr�4�}�����r�	_-��Q��3�N�?��d�H���Ę|�Q!|-_4qV�iV��}u���d�(�J���*����pu��%TW�O&�)%�"&�u�W�ʋ�s�!�'h�u�O��^F�)�[�[�خ�@Ww#ݡ�*WRLݾ�BoXD�H�W�����(�)���@*#��F�ޫXD�F�#"E$�0wߢ6��'	`ڻ,����SJ$�Ҫ^���P�dZ1Z����)�$��P�j��H��x?�r�<�pV�/��s�R8ҥ��h�-�Q�ቊ�����fa^D�2s\�{s(>�x�0/�6��-�|�o�HE������f�����<��d�r��H�71�1��y�e?	�l2����D
Eb�l�D�l��!ʣ��7�+���h+��Y��,c�qN��*$n�dD/�b����=�Jo�S�
�����ևI�c�r�~k�t�x1����	��&*Wf�WТr+�FL(�ЎW51*X�_ZB�Z��e�U{�yΚ
��`A/t��z�r3�ֵq�D;z�TbR_��Th��n�o\�V�|��Q�7�T��o��^:/A�K�ڿ���!�j��j���E��f��`�K�659����s"�Ud�9�F����S�u��yJ���h����+S�(&�c���ӧO�����}8ER#G��ȈC�N�
�~�v9>�#&FL�%�Q�a�9(���I^`.�F�B&ї�(���jQ4��3L��ҡuC���t�3�B[޺�oJ�A\5��@���U����x�h��~&�#U�|��1��-�0�X�j�B�����]/H}�����M�G�F� ������I�L��-�u4��_'0
���	�<��,v42D�^o5��Ek���x�D�M�a��b$�t}}�
]��^
h�T���L0
�=�mp\�����=�j�mXLYXO��^�g	<��$����0U��������t��(�Y����԰�>c8Y�-��Nlʝ@�g-�I���h�e��f�/�mw�����\����
X�vݒ@gw���*�PMƌ�$獛���<�xn���Ů����A�˪)���j����5��1��.s��9i.0��ɇ2�B1em(^�W�33�T�
ˠG�uiה�!�z��w4�4�?8~w��N'��'?��0i -k��(�;�lI4�⨸2��i��DH��Y�q;=\Ee�LU-�:�XƎΪ�\���rpε�-.U�m���6�]ӽC�Y�%�`{v.�.��h��7�|8�����$�A�	ҙO��aD}�{�A��h�꾖rQpj BE����A����<?r�섇�2�9��#z��<�Q9�7���S�"E+��T㥋�H��`�9��"�$��#�}�񆈷>����k^����<��@٨��j��*ϙ�Uw.\Ƀ_u�3Do��iz;�/4凮�_��`���L��+��Ќ�}w��?�LC���HDӘ�}�n���3�{��^��~��w��FaY*�4
~HG�)�ũ�ۨ��Y$�����<3=J��i����<���,�G�$Gm7YN
�1k�k̽<Z�.hL�m���}c��&�c����"��et�q+*�/W:k
0��̭���R2$@���I]�3��^.�+��`�#E
��Q������.k�L����y�Ã�xA;�Y�ԣ�>���w�q%�H�A�	5?:�=��VU:�`��|�e���,y��sj���|������P����]O�X�f]y����<*��%~<\D�k�ү�P�W�5�G�����T��b}���R"���}W��a=�z�
����9��c�$PZo�.'.���Sd�M<�?r��f���I#m5�(�!���
K�s����ΩߚS�95�@8`k��b>�s��[��A�o<{�j�cS�{�fQ�"
�{����*��"�>;�@��r���u���{��z0��y>l�|Y�Y�$� O{��$���pX�x�������NQ�M��Z��,�B�c6*�r���}�`<���Sxf<K9�W(���{L]���@�xa���{O�6�;���a����⩠(��Q7��>�O���~�(Z��̬C��*��0�����:V���j:;�3�:���j�C�a
�S	!����RCqޤ1��W�'��?7c\ryhD��0��\����5�`��^O&J���_�?PKEePQDBCbY�i(pip/_vendor/distlib/_backport/tarfile.pyݽ}{�6�8��?W>9�Yk9/M}���$N꧎��v6馹*%�272�CRq���w�⍔������nc�`0�f6�����Uqq�Γ��vc�<_��쪊��{����nte�jYVq2N��s��_3�{0M~�z�yD�ʨHʤ��L���MR\�e��Y�e]%E2��fE�UɴE�E�DQ~M��b���*��8��IQ����U�fi6��(��X<��^�_V7q�`�i�e>IcM���:ɪ�J	�4߭��l�\�uz�^4M�9`�!\(q��F7iu�/+�=��t��Xv2_N+U$���)�(`dH��e���ߏ��iz���b9���U?����xY��N��a�Q���#���(�y���{� ��˛��k���8+��"`ܨ��+s�8�#�T�������zMxd�{[��\_@�x�N��LFQ�W��g�1c��w�U��/U@��J_���1�\V�0Q���vq-�������ӗ���������ߎ^��:�<��wG?���������/������(�������7g�����Yt�����~tt�틣�WQ�Ꞝ^D�G��.��iD�
���s�0�ׇg��'ώ��.~�1}ytq�������������3z����!�8y0NNO�N^�A���O.��IO���o�;:���ێ�B��2�}~�旳�W?]��N�_��g����Cn�:�����u?zq���!�=h�
e�ƻ��)4<�8:=�.>?=�8��}���»��C����9�0^��BK8�P
��2(�{��~{�_q<	�������q�/ ���rY-�d4��k��hQ�YO3Z��N�,��Gʼ)�*A"�
$^\�U���sR����h��T��Q�?Β�)��x'o"��������Ԉ��
��O5�u���<B^�xi�M��a%��/�����p{gw{�q4�n�����0z�:�,�~�_&c*֋��L>�� ��鞱]DO�>~������=���oà�j�'��e1xE�����~�9�N��:�M�>~�;��Gg)r�it��˦�Ms�9�	*͇2g�m���4Z��IQd��Q��I]�XNt1dE�{�llT�����<�`�7Ӎ��$YT��aQ����c(����������4����K�i~S"��*z2؉�8-�q��@��Lp�#�Ru�-"��G݃J8?��*�j�7U��"��`�9N�m`��'�G��:�7���S��y�H���o��9�8ǀڛ"��2K�O��J��?�MT�=5�'�ub�6g:ZsB�j��Z�ω�>t.��%�.�_������Hj������b��B�;����D�F�e:�R\�qɏr�6�
�7�|���'�M��Tm��-�Ag*��
�u���^W~���Lj{�םN�ludK�ea�Ɠ*)6��>�����P��p7Pi�d��
w�E�O��A��ɧr������^���ƫ]$�����Nގ`�9zN�"_)��y8�,�D�lIc���I�w+��e>��"/�/fō�ÓW?�N^#�Ý�����zym ��I���|��l�� ]�<z�?^Y�iQ$�БK`��
�W��9�������r���q`�ЃS���g]z�N��K"�&j5�6�y�����d����t����0�r�LP�¾;I�Nk�I��^�->V��@�U^�n�<zy�?��Rq��-�4�k}���Jg�|Y�h�
���ӓWB���qǨ%���y6#*2�%�;?7U��VU�A�<�6�;b�J��$���Bw�Kp�h%�� ���K�<l>W `?y��XW���>��cK�|~z������}Ǭ|���u��x{~qp6)����s����O�.����~ēt�ak5VR������5�nv��؋×o�/�u�߾��6��l' �#��vrDu�_.$��m��}�t��#��s�k����M�K��HX($�R��Z���j��#�%�H8C�������Z����m�B�^�Rh��o2��l��چ�o���H�>k�R{�M�"k���"��F��Q��Y�N"Y�D� �J��9:<~A�tqu���*��L'i���;:�e:ŷ3��D�H�����pŗ���a�Ʒ�մ���L*�G�Fw�h�-�M�#�p�����'+G�U��k���ĂK)H�}���F�4*���h/���q�#ՙ�]��8����M�@6����h�h
#���u>M���s<_&4d����oi�|t��ŝ|��Ra͊m!K��;vIK*‚�\���� "`A`_\�]�/�0-.�`X�=H�\xhF)dc���ы(��vL�tI7·��%_�ɒ� �t��@�W~��]��
C��2�o�^h<"�TL-��`��x�����P!`�d��Q���sݴU�L�Z&h�1꼪�Y"2+��Jֈ��6 ��ֈ�<�@D���<
�2(i ��FD5��@��|��M�m���bR�zX����y%��n'��yN�s�~x�̬������CI7^��?K*2�ߖ�J&9Z份o��y���\�#e6�&�ic�\Ϻ��Y��G
�>����w:��y['��Ѧ���]��<�yǪ�2N����f��O�^3T�H�e�E�=F�c� �ƹ�(v�^���nj<H���:H�!�]�n�H/��4�vIGe<�V�_������{����IC��ۀ-nļ1v���
O'腍$r�؀;�M�օ2��Z-Q�r����*k[
4�Aq��TK4WA'WE�Xa���ڣ`'��|t�r��$,��T��g%�x�+�I�o��69�!{at���N"A�Ju;)?�E�^�
��{��.�l�t�����=�?��=u�=����C
�8�h�j����I�D���}n�m-*4�ִ�%Uϒ;Ѥ��}�R�俗�}�JvCc�z%�˂�/
I2�����)��F�O�b|Y*)h�����.���z�Á�R	"��0���H�f&@H�j�4���� :���&���4������� �S�/���y`���N�u4Ng۠���"Y�� �XN�G���O�^���EO���#)�YIZŽ��y'�g��GY����,��r:���59�����"ˢA����zm�+��A���\%&��b4��۱amF�߿�ށԜ^��*4�U^ş�|Y�Q4L���s�d8Phb'��w*(�����`�-�ɧn���<��
*��
k��⢈o��&�8n� �@���;;�O�Ї�}�sP��G���U��Z�I<��&W���u�//
No��� OM��	~~��H�P�+^^#��+,��^*��"ã���*������K$����̃sxEsZ�P'%��	��E(0���J�.Q���б{����$yѣ�~
F?�e���A0�ʴ1MAW.`���l��2+u�D_�3�C�W�[�t�$����-m�	.���=�Y�*'��b|���u(v���3�Q���|����)���Ud����������]Z�nenE���T�n]H8_ܢ�U�,&���+������ ��2�B�v����O���ѥ���t��g��N��� �b_�YIu��}�q��"�.��E�Lln�|��Pc�����>������.�T�}��b_I�"&�I���})GYC`��H���e�c�-��aq|�Χ]%�KU��`\�<�n�;�sV�z�O��uP�;�-�\��u`��vjxN�՜���5sz�X�����93X�F�*F�vyz��ɧ�`S�	#늉G�ٶ�<;�u��Gg���~�'�fb�9zy��,:=x%ر]D^E���Rߑޯ����P��wPʯ[�G
���趾Xx�j��U��W>���xՂ�i�-x�
�xxT&�HA�0ޜzxl�Z�������,�>�)
�U��Q8TT�]�|�k.��di_��ӲaH뽠(���G�+���_ؤ^/'b()�|�{i����$���/�?>_���b����z^	�s�±W���u:��i��20ޓy\����C�DR��X�v.�!B��}��B�!(P5�WI��p�*8V	W�@,��5�<�`-3�4C�)/���5*;蕲.�s��	����'h��`�(?^�^N�&s��X|(3�i��=O?%�T�����5{��I�����zQݚ`��M�H����!CvzG��������]�5������mM�F��2��%�jw�M~��v�Mu;�I��`����Ƞe�@��%h6�����8��̑>�lO�Q���s|�-vQ�<N��]uEm���Q����K���k�<�QL���@<A�J-	��_F#���F�2�_�&_'���iu��>�#�tt����[��=Q޾;÷ѿ��s�T/ԏ���'��z���
}4������n����ѳ����_:�&N�k�ar�Z�^
.�52g�n�CTŸ<yҫc2�˄F�h*���Q��M8<�����e����)�6�W\Q�O#f�}=��dE����~�XO����Iu�$�⟦�[VQ&��/��oU�,I�dg��?'D��[2�2�=�x��B��n�t��$� U�~O`w�m�}b��+� �!��Ɖl�1����qLY��M�$_��c�$���lFI5h���=b����Yim��h2���r�SO�W���]R��bя�v@T�c��6�%0����}�_�e��x�.~�j63X�m��{�XfUgQ�ۺ��3`@!Eg/�阄0M�dR�W�S�c�
���{S�_n����K����z�i�0�R���?�4�t��L1+.�_�Fs������LD>���{I�c3XZ�ݎ���)�qf�;�q��3����^-]����c�}����a5�m;�|��;�ka���q��ƇG���{��p����R�H
��������nՉ�r�֩���s����w���Gsʆ!�н2�k<����"QL����[����8y;�2M�s��@໲T�|s#�&sه��Ő�x��0�N�vp�*?�k@�k�8Q:�Fu��6x�ї��$��e�����v��r���}�ŋ×��/���������wώ.����`����o��w�S�9:ʕU��6O�~��/<����������z�u��w����3��:��������w�u,���� �8[��ؽ{L�������퇵����|>���nTƷ%�\/�
%���t�����o�)�K�@7NĽ>���!jZ��d1�ћ�U�ǁ�ޑ{���Ju�łF�*����6b�.�%e_�uf�������_��*vyd����W�	�Ls)��r��o��ϒ��M�RVoE��f@�nY���aJ��fhD�}/����ةA7t8fV��r��[�|\�N���ix������W�ƘLA>G�X
��%��7q1-W`�W��HfY���t��EP�(º�/˫no��3���i�w�_o⇯�g�@B�Ȕ�g}�pw-ըT��B�xYᬾaG����JN�t�V�N�R��VϠ�὘^���tǪ�q�����mԙ�'�Q�9��k&�
Z�Ȉ�&�|�H��!�}4�4
 �9OA�/>�=�_�^e_ݏ~��7�����VJc`�Ih�a~�%)��CD�m|zp�3�r)�^���0�
�K��?���[Pt�X"�9“RV�NڄhNX����4ML	*$�8;�!n[{J2��i�
�!�;u 
��J�=n1��ww{�{ja�YìX�g$�!x�F��I
��O������!��$u9�g�xZmz{-=b���葍՗9�
�i���Z��m�����n��遀)�э�6Z#$�0]a=�>˫�>��B���I�^�U2�V��k�h�oZ$����&uG��	o��+��g�|�n�<�Z���W$嚇���?9���I6Co���4�q�ul�N��-�͞F�K�sY�f�6�a�e�#���|�<���XEc�9H �v��5�O��9g	���O6l5TL9h旦�TH5��e��r�j�a�#��v^v��4@�����e��)
�v�v"P��ul�أ(M7:W8��pR��\��+��� |L-]�-�΅ �M��X���S�R�ey�<Gfot)�T��5�:��9�~�|}��U�y7G����h��Z��gZY/O,��p�N�
�jWq'�U���/'Ab0�����gPʪ�ҩ�
�WQ�Pr
}*.�x���R6�X��UQ�o�eZ�5�d�?��L��γ�4y�ݠq�6#��9��+������Im�3:J+���T�ޑZt��E�m����[}�����!�Oߚ��Ӫc��u��w���Vl��Ϸ�����P���6��6P�m6�����g��~��l\����0:5PEdQiB{��ݯ�2�!Nax�(,Dm"�{��un�;�W)7n�U�Z�)��G7y�).�%��KF<C�c$n��f�ʌ*��.3r����{�0��[6�k�bF��%�"(�P�{���\m�Y#�����W�tC	@r�]13�l�K���l�c������\}�f�.i8;kY}9-زuP�k��b��ܭ���e�R�ܯ��Z�@�{��zHà�N�Um����!�}�wgQ��hm>�p~� S-dm=�Q����z��f���@�5���1@2Sz��%Md;���Q�W�zo�k�Dm->���]�I�0���*y�Qt�<����y]v�CA�%����'�1ض>�S��ah�r�v��˥Pd);���^b_�����}�p�yo���V��gPh�/�K�p|OeB"�l҆�%��ׯA[Nj�Ę>�&]��:^�%�����e3t�g���+_|#cY�*wk��;�gƸ�(��N���s!���j��rx)A�\���B=�4���c�EG]C �!�r`��>pf��9ͪ�5�Xd[�t=�E�-��`=��� 1U�n�ְ}:��$;�)���G�<\L.m
��,��eA:�XG�`�M9x�9H�ޕI�9��j��-U��j�]�~���c�X�ys��&=�}4'�vCc\�:ͺLc�@<Ĕ�X�j?���6�"v/��.��^��ze|���G�
B����@0�b�\�\V�N��`9���l�U�i�<�І�u�.̚���g�Gy�'��ź�0n�NoMwK�fT_plF��/=�)t{?����Wƴ�x��Ɔ�*�?OI��|e��[给��%���"�4n_�f8Rݞ}��[�TV��H_pOmcL�M��V�@#	i@v��ջ�#
�S
(�ޢM�2��* z8h��s}�����;hS��ܬ7b|5������.i�,-�
��m~��vͭ(��뼬�GD;��9��Or9[��s��Y���J<���W8Ky!R��zj8j��e��٠e�2�~��
�ֽ�g��V�P̷͌Ђ�j�a�f��meOy��C�`%�9�u�q�t�Ɂ%��G��D�\�i��L��BS=�� ��E��4KL��(}�$V�o!{�ssH�;�V�_�9���$�L�.S�ѡm�-��5NX�E[�<���ɵb�vLU:�ZF��C�}*�l�7Knx0�,`;��y޼��NS�,��Y��+'Ot�
;D�i�Y��#�������i�L�i�H�����Zˑ���
�6F����_��-�5D<s(+YY�S�<Fp�Q�&=�\���&R��ٯ���G��a|��&�5��c)��\�OҊ��p]�Z�M�����<:?��v���@edq���5�d���:�ҥ������C����=�6؆�.�鬭HpXC��"m����X1R��n���׆�}���5���N;���|�7d�X�ހA H��"�8��*)��_��")�rѠ�9)t�[e�����/{��ai�]��t�8�"�g���'�h�u���C-�l�s�HS��8M�8���gn�c�0���h�3��QZT�>3���G�)���b��^ߨk�+�|��x!J���򲤃�h"��o��F�<��[]u��A����[���c�#T!�e��B�WP� �!���u����R�=��{� ��ab�����H��d�0r=��؈E�∲PU�0Rs������ʍ��|�<eJ�B��e"����c�ك8���0}6Z;v�'���,脉�] rR�l�>UD��.9����^Q��ء�/��i�.�ɹ-1�,n��ͪ��(�ud}� �v
���RY��_�W4Mޥ
>�+��|���/;��!���btsS���W���5�E/��]M��E
58�@Q��P呸7�ԕeG�fm�Z8Ug�Sm�C�����P3��S]#U�YQ�G�Q��)�Evt�L��RxR�~7�����.L?5�v���rz��BiT`~�m
.@/�8,(�V�]�f_3��Tx�!�����Y�:����`,0����z޷��0y���O�ý2�W�����):3!2і?�7�b4���l)0OIJ�׮Y	�Rֹg8rO4�T�	;���)����kϞ_'6m�F�÷��,�^���o���)1�JH~]·��/�ɹ�2"�E�v
��`�Eu�"z���ɚ�}w��e�T�g��@1X�lf�K��R)�$��#*D*q����	���
�����f94�@	O��2�� �F���b��I�U2��`�S.���ʤ�ċ��`e1�;l=%}�8�I`i�e�\���0tf*���,�(�l]H9a+�uCux���̲�W6Rgz[�H��9��MV�!S�
�NC����r�ER��A�ɣ�J��K$2rZ���A.��G�`��\5z�B�<���c�[�Z���E�5;��"U�h(q(�sP(�
>l9ɌX�n�����4h�'�ÛSq �I�
ΙS��uő۝��<n�ƙ5G�HP�4�_C�B�3赠S�ћ��Xj��&D*_���NR�sF�*���x`h>�Jp�����Ή��΄�ӗIqmJ�w�7���R�Z�؛��ft����.%Y �Y����^|�$�W�S���2@8̽m�O�E�Ϗ���=�V8���Q�3�gn~jۏ�4��׏��!��Lh,��od��6���.��9� |���T
/c�}#�0�:�B�����?���2�[ E��C��9�<�6��E"!D�����H�dU���o�KR��k��|��A�\��&ӢzȲ�4�ޤK�f��u�o�D���ʓ����C�„�J��\� yw�r��i�.6�!S�X2�+T_F�EjE���I�J�c�ya��'^,�2ဧeJ	{'IJ�yT�&(<���R���c:��f����Q���8��Udc��ah�t��+�z?���Iȁ8(kn��$V�}��!��!�%��r�jz2��Yk�ő�r]�%�I7��G��o�)��S�V�	�A#��bLX�k�!I,���t�>�%�ڜ-:��x%$�/�m�V�{�m�9;|y���|
&�6��=�z�];�
��ۃ�5����v�P�pth�/�Y
�K�VA��o��3��O�i�73'�ɞ�55���U�^�›y��F���T�ip��'����W)�tV�� ��~�<̡I�����Ţl@��.�bOjՖ���^m��tB�֚���c�z�gw,/!V�UCm��U��Jn)�p��4d,g�r���gÔBמ��$�M��������ݕ-ٵgw�m��q����G���l<�H�F���6S�GWM�"�ݛ�hl�W����J�\k�5}H�f�����}��v�tou��G�O�so�I����0By	���ߵ�h�u���iW��łB}A�Y��R�F�S��xt<��2�Ӧ���`�~dD\��b����(��Gu��J���E��"�4Y;H�a�篹��v�]�M�&�ԅ���ucnc������onj�m}��_��c�1p/�ڠ�93�#�Q<8iӿ�mSJO�~��t����.FF����Xr$/"��jZ	ȝ� �RM���wwv�֣�`��!z!=�0X��1�Sr{k�Ϛ+��"qUY�(	��C�,:�t���dD���3	(
��,s|k����et5-H~N�}N�B��A4/�	q��yx@���)�c�]����+�*���A�	U�|���?�\����[�߹H0�i�۝��fɑ���U��|���,3�����&��wv��T��
�W�T���7{�=7�P��b+�Ű�Y��Ϙ��9�����[�8�'I2�'%��.Ѿ�!u��<�n�'W�����ط��fO�y�MPA?� LK�U���g]d���*⏇��-�߃hk���5۲@�-`��v�k̥%��,�+)��>@��VD#k$R�^�=m� ��a�yEj�`�(>�����"SNmλ�'
�)-�tz0�-���C�1K��8�:"}}�g�=i�}���k7j��:x��md�-�7n�+�ڛ��L�~�W�П�6g��J�k����S�!s,�/i3/�o�� ^����ώ,���e���C@�	;nz?8F
��ˬ�b�ķ�	'
`�O�g2#�PeUJz���ӽ��'-���4e*��$
����M$��0P�����J��X����c�����_U�g�=�hbպ�y��)3����
w9e�)U�}�7|�Rި���'���*U��W��)�Oӱd�>���p�S�e�v�ܪ�Z:�v�<��~u��[���~���ၪ���=|��G��8����G�����VЀ�{���� t��;�6��Cآ�[6�K�ESL֑�c���)���+�(�����@�	�୨��C˘xq��p��^�#���JO��d�H�R�u����ȾǾ��D]~�{+���l�L��¼���c�?��J���<��ՠ$�� ����T�(
���ٹ����çOK9�G^\a':��Tc�+��
oR �h��ї�����X���T�8���:R[��"lI�u�\H��$��d�W��J�֒�s��S��(�;|��Ӈ{����Iu�D���7�k�֪<K��ϨL��4�*^Q*,�Z��I�BKi	o]%��B�z+PX�j�[��{����6���b}£iX�E4� !�7b!��q��޸Fk��
O�=fxHdR	A�h��Q�;–D2�:�=�h�F�yo(���=U���I`��k�m�.����Z$
��ܕR�%��-�}�axĘ/s��NN E��d��Q���l�
&u�g��	�
(��C ag�툢�㩗ե��F���i}�1�`�H�
X�K��<�� ��0��:�A9����k�
f�aϨ�쩼��w�ɓ� �ޥ�`�+�7h��t���6��/A2Z�0T�B��f��M*b�in�V��V�Ԩ�t>��%<����v�D��
�����FiN�\��u�ru���Ue�2!&�ؖG!#�PHgQڬշ���tm����╊]�eK�SE�Wٸ4վ�E�X��]6��������Hެ��7-y�^��2�W�5�b1�̫�-S��g6!),L��T���Fђ7B���_��MSt]Yξm�5G��U=�JKh��Bד$���7oN�._�6M1?��Ø|���0bʹ���7��ԉ6GС5
I�:[&����;���1�MQ���'�J�B�>�X�'���v�L��5��D��F�6��f+���e"���vɴE@Ϗ%��L�[V�Aȥ��69�'�S%�����B�a��1Ηc>�,K�{E�[Dh�(u������t���HhFe|�f#LaXyZ�a^o0_��!tl/wؚy��G���Y�]�u��s
eZ&c1_Rp�B�5ĽÄf��r,�8��*��OIÆ^ܪ(i�E[�ҕ��<\�@�9�@��=�uY-�-�ȅ��U���ŏ����OT��8�tkO0h����w���W�=
����m����l��Z��	Y�j�g-g� BM�rR�c�4a�����(�[}��pR�M��y�CG��qyzb�I�+IQQq��Z�"�fW�In�D��#�.��m޳����Ӑy!& ��+���h7��v�7�4�Sy�H�]F��2}ޜ+�x󼾃�vu\߼s�Of�-0���B���k
o/^n?�+%SL8��1Il��ʲHk���o#Y��\��_#Qc&qt����7h.�2rA�c��S���qP&�;.:�N�N	��ϯ���_��YK@��#�{�&��R���{��"t���5�S�qB��M�	���*�����0��ʓ#y�]*:��,��6�*�R���/
ު�ߊ�B\1)���Ώ΢�ΓGO"��h���o� ���X��oys�o�1R�h���u��!�t���_-KҨ�3`�����h��I��1#p)�w`4��a�7���J��x/�`�}dz�7З�X����M�Ru�KiV�|Iȓ���/'��3�,��8���Й���0u�"�ܸ@3��۰v#�Q`�ta��"X3��d���s��&G�zI��bi�.�%�i
�e=vF�^���K�O�*�[9ˠ�pP�٥8�{��»`��
�vd^s��W��R��}��W��Y�ų)Ίx�9�TQ��"`ӹ�F���c.6�o,�����(�#���؏��݇H�b�QlWne}����qR�ba�w���*�v`����@������)��*0~l�W��j�G�vV��R��āvI9Fc؂�ԍ���J{F�1��I�e"�dO���՜@;�ߠLݤ��'�^�Ȃ1�*ȣ�G��/�e���-zm�E{:m�UH��������oܘe�>*�7Oǫ��2�o��a�
�">�Tʈf��:�WD7	�VK���Pe����^#�^�;�.��}���jL��'�@ng�v|�DF�1�$k4��Eu�B��8�t��n��6\�k�`��!���S�U�j����xy�7����;ڤ=xAK��c;�	��yt�$�rKl>;��};KX�/�O����Ϩ�'�V�:ߗ��;�y���T�8��k�8M>�6�H@����W}��P�+�q��Ů�"����n?�6L[
#�x��
V 1�5K��J	5V=��'�Z+���7�m(��*�ai3��_��Њ�*�J4��t�N���1����yv�M���;l8}T��}�k%_���=?�vx����>�~�aoo�c_�0�_mC1l!�5��a��!�cWFʽ۸�͝���2��hߏ�nIQ����.p���U�~�������I�9��]�8b�:]���\F\�]>w2m�9[.��Ed��4���݉Y�}�?~Q$��|i]2�k����E�^����)��G��͸0ĆGj��(W��[�H�0[�߈h�MJg@G}����Yc�4���G��,��u#�q_�0�lȏZ�1�w�}����tK�S�X݄A֩B�i�^O�f����V4z�B����Ũ�Pv����K�-��u�ͯt<Jb7/��%�K��KH�]�����Z��.�8���.���y���������%�'��@����#��~��vw�O���
���/���Q��W�
GU= ��DQV���᫷��^`T'CHK}�6��-���:��Q���^��/������:�O~v*N��B��O.��Z->;v[�L��͡�/�^���S;�4TVv���˜���:tЕ��}�K��[�un�`R�6 �#8e�0�eg��%
��΢�Rb��x�cE��f�ӌ��*2������u9+{�a�E�0�V�����/|���&ʫLn�9����z<|�L;��۸
�*q��Q���΀IgY^$#�Q������E�@t`�������fDTԶ��,��Γ�	^���(�1���IwcD�gg
�1��0�bW��aN{w�Gl��
O��oe�����\*x��Sj�
b��;�S	��:���T�IQ�pՇ�*��١z�����1����)]=�J�xhW��)�:q*E�@�q�
���tA�c.c���kW}�%�C�ķoe��X/��2�p&M�@��h@Ң<����â�3֮<1�<ҁ�}hM�-�H�4�@�E�7z
�JwIy�)�gr��7��A��4��D[���#�e���@���m�[tɂ��H]v0���8��rC�&*�a���; %L�*�����5�	
Ќ斱V�o2��AJF��C�=\���l��v�|ׄ'�M�I��`2tW�Gϸ���n�$��вp�]��Wq67�9�s=o�ҍ�1��0��$SmU��O��
���sɳ�q\��1��_���?;ӿS��-���
~�w��K�a�d8<��hv!�y9@ui@�Qv�@��cd@:XR�#T�Vor���#]`l��D��U6���o�s6�<�R�U�82���ʙgil���?��Z�d�F\����|'����FC��褡�V���#���KJ�¡U�Ip�m�����-�̣ˣ#g��#�Y�l��^Y]��Ŭ�v�v��(�L����_&8K�k��H|�O��1ڡ���E���!��نi�0�!Ҷ�9�C�e�e9*��ND����a��@q�j�v���o��#eܡBw�9�EKbvɒGvu
R��R/��9du��0�I����3�+�6�
/Ώ�$����ܴ�����ԙZ�ĦJ����2�g�4�)��LuO��[���$�>&v��R_�u-��3���-�ZUip�R���$-嘣���hwo
m���r�h3U�����8�TA�ؙ�UD'y����n2��&e�	�H�ѷ�&C��k���\@�tE����5�~E���ta�o4N�h3,"�?K����ǏE>(jz���L�(�Ԭ!P�N��:�����@�.D1h��s��;�W��D�rm�p�rZ^y�O�BgD83n@H�Sݚ�i�K�ϒy~CF2m�aTb�X��)�*Y�%�n��ujS+8�/����/߫���s�վ����:�@Z,��t���%J%",����l��&&�eS%E����/k�;�k��S�tB7��>�[βT��5��:*�ʧoOF�/~�k�x�Z��IN�%�2�C�!R^�0�!h�^������cmt3hVO��"��D9"P�����s��q`ޘ6.�t�.v�WT!���SG�]ag�%�g��g��O�^p@�?��ŬY5,+�������S��x*t��VbR��|Q�8�6AZL
q��*GP?.��oQ7-����2
'��P���
��9P�g�k6�7���[M�������[m��P}����	b쇮��_[+uo3��F,(5�j4�q�r�0܄�����=����g2g�,1 �5IK��Tz��C�&�0xc�h���x4�s`8c;����5�e��Sݎ4CX�!3͉l��[�+�b"�KW�Y'{����';�e\��f�2EY/h��{_6O����}�7��Ep,�}W�l�Hsw_>����c&.�ݭ*�����R[��_���#���B+l��qӛ����W[D殖����z�ғ^�}��ҨZҾ�yX��y���:{��-_�qDH��	����|~��|��9���A|گi����%q�?Sud�+[���@���l8D��-���%�?���/*�Y�M^k/��?���Wx�\��||]�4	�{%p�6�&|��'.@����k'�_��/K�>�i���7�
[�b�����7�
Cc,Ej���Gǃ�r�M�(�KָD=6N�TGb�9TѬ���a��������$�rZc���1���A#'F�bѢDX���O�����p���5�����3��[�ӕ��<��9Pڃ�9�F�׎�݇=�|���o�^�?/M���&�����������@#/�Hk��nn���(�ܳ�����0�'��Z����a�sM���i�T*R��C������j����UO�ᅀ�<G����x����Ე��c���g�O��_�3�0
I��kư밁u�0F����ȿ�֧����/�N�����+\b�~��շ1��p�>�������i�TgQ��U��ڌ�s��(�9Z�
�,��d��Uք����!�A���L]|�;��?�4�C�>]׀��d�w�Fh�R����Ųo�1(;�r��3Ұ�l:��Yv��J�At�'I������6KK��p�9qc-,����ڿS�`͙��8�	I���fy;pFu�8�o査��E�i�S�Q�/1��r��zu6�mߘ�Q�(lMN^��xw����@co�t`���-���۟[��O
�J���Ly��s�gs�s�Z�N*+����W�_sCe���'��S��+9"�q�D�.��n����O~�ܔ �
:�O(JJmf�pPyV�L�1A6�	�x��>K 8,�yy���:�5��*ߞ�uR�#Q�V��~T����r��7f�l#������B��
V�n����0#��r��%8<�r�q�k��ĝ�]Il�q�T�*Z�jž��x�#JC��ɞ��&��I�LG�6�1���1��ՆmM>����(bO�r�s��fT"uc�n��y�s�
iǚ$�,��S/R΂	�sD�a����PeF�C�D�Ϗt�rkТ��m�	��c)黶Cnj_���l��;���+\��	��G�H��Ź�g�y9���	��X��
��A�K�D�fs�izyk�u�JÙS���"�V|0o���)9���q�M�g+*�$�L��rb��������V@�w��m�邗���V�J�U�q����!�_��e:סᨬ��lM=���E��aB��bHŻ��Y�y0.�⨒\U�1��\�K��2a��^r�Z�jZ|�1���ӕ�5��K˷��Pj�ɢY�q���p����ϒWCX��y�]�u��9����Qj�Ոכ41{'��Vl�_�o��1�+���F+o��VY�W1G��!�65�Uv�=���Ctz���u���� �O�G��O�pƪ�� 6k�S�4I�Ynz���s岺��o
�Yn�8��jp>::?;|���n؁��^�x�7aN��Ȉ�99^�2���v|�gF��W[�x�bq�(��o��@>!Qt@N~I
�"q�
T��V���+ �M�[�c̈���z�t�d�_vaC|���d(�+�k�I������o��2���J$����?�?~�jeP�If/��Bd��i��;�-����~m�����k�1�� �	>�����ںgޱ��>;nCмf�u�Q��/[�����
��Ao#ػ��ZNk�/�;Ni0x����fF!�����3^D���X�l��s*��<�&;�G�>�Sf��U��R_ͮ-n�N�X��J�v3Eq~q��5��K��5l�T:����̊��QI-��3+f>���Ǜ��~?^��۫0��6~�
�;ed�6@_�ݰ�?��d�����r����#I����e��f!7��6CoV<��/��~�}��M�e�fC7F��ܧ��UH9��%��4�����û�GȢ��e�=��F����-�Œ�.�|��4���8��z.�
PQ����U�k2�^���oE[�DT�s��뽒�f����Zs$X�(fnu\-xԆ���處9RG���.w��{��i�A�r?F��*�{��kC=,�ؘ����kL�t���.��?{���ݣ��y>��u-�������߬��=�P��熒h�}�N����R-p,�}^���e]J2��EN^�
�g+��0#��"A[1��>�S}jؗ�����S�~䜢���:%�nuvH����ي�IL��>��{XU�A��c�Y���n�ϋ:I+�� �_����[�@lH��s�R����IE��i4T��a�d�i�kH�!S^�ӧ	L�'�+6�œ+|]����x�����M־�0.fKʓYG�b���
sY��U��#�J'|�' �-��ЯS�}�5��$C?d�>�b�`�l�瀛�@gm��M=�ngY�˕8S���YY�������������Ϧh
d}<����hO�}*Ω�y?d;De*�N�;� T��oN�O���ɺ$��_W	�}B�-]r�S��	����ɶ���xgX�-�ln�1��^�˷���:[���.&��2�"n��v>���%Pw�K�oծ�h˔~%��{gӉ37�����8֮M���@h��8�W�v<��ZG�V
G�	P�9p�.P�
�ERƞr��6�6��j}�#OU�/A�}ӛV�W��-��kH���!0� }\Sm'hJ�q�oR՗w��D&r"�X�
��.C*S�[-�M�9YS����g��j0;7�i�K�)^SU�~P�k�Y�PV��	٫�(0[ŘcE���E�r�.II�%.��w��o��mO-~ti6�䘔҈.ҷ���N�U�ƛn���H2{o���pֹ��M�zL��l;,�j?>S���ұU�����S{&�N:.�P��h7��E�B8��O	P'U<��P���~g���
��C�d�?q�RP�����'�Zk7����c�ix:�u�\=\`(2r-���SS5�����%�����^ҙOU�n����Aظw��|��9_(�ؘ3�(?
�WxH��p��Ю0!��vcp:�))�٧Z7Q�����b�Ȗ���/���bF�qDZ�ZCae��ɿ۱#OoF/r9�FhT-Md��ǂ�?�hMsIq�,����_vB���� 5�}Nf
���t��J�90��`)L~�?����8���x`�sf�۹1��~]`)���z��eal�1���/p(�oxxL��W����
���Y��C�i0[Uxre����*�
Ow[,����~��
�t�{�V��A�aso�spa߼�����5WN/k2�wZ�+�W�󴜋�Nt�\��#��Thc|��.Jogƒ��x�hV\��j��-qt������]@��-c����x���c���$�H^�m`��1W�oz�냌5���1Ӥ%�;�l�t�Ė�������C��<9�\�N��,T����,w�SB'νU0`�U/GXq$�ZY���ݡ���HL#�^߫��'#���߼�����34P5�� ���>��4c
�
h4�C��Ix͖n���I��l���\;�]���;jwe��f,����l��)���1�߭`i�H��d�.�j�j};!(>����SL$�E��8!����j:Ȓi�ƺ���`cHZǛ�h��=��&jf�ё�~��m��j�
jo�;�5߭٣��^?���^��M�'�N��,{�-��&�4�r�o=��kkg��4o\ U�SDI���"
�N}��XdK�O�����&��Ԏ��?� �0M/�JqA�T�	�$.%���
�h�G]@�G;��&ۦe=�5����c���B!�|MM��RY�F�	�5*"Ss��M^�5�-�>J��A�w<
*p��`���L	C+�mk�2Qe9[���')Q�λ)l�<��\��L߁7�§|@�7��	NG��S�e�"�;r�c���Zi����*�hqu[��x��+��aj�m�T�������X�f�Y=F�|*��J3�Թ��8`2�M��;�층#y�Rm����(��KU�B	�ˊ�<&��	����B*7��7�!�O�s�n̺�TWi�x�'ӢC�	�~�� ݛC��>�Q�)�M��)Alv����-Ɂ�c�B1�x�D�g�	ն\��Ͳ��k�f�fo��+�;��LG͘�˻@[ϳ�F6�|'�w�r�y�m�E7 �ʪ6���>�&i��X�B������}5���Ú׍?;�nm��MG�x�@z�w�x���R��{�gDY�(r W(�$��n+X:B-�"鵤ߌr�+��x�V�F��P�e{~
���LPk�o1vx���
���t�rqsD�P0{6�|���矄#i��,�_i��� x��2d�����E��o
x��zň�E�)�e1�weܠ2��c�Uh�u���<̬��H*�8X�5	+@��i��
����NH7E\7OX��jT��6>�V7|,kb�Z�*`��v�7�s��
�ȿ�<D��]Mɔ:k_��O\�&���F&n���&x��]ܱL�zm�7s�Egi����8[oiy!>am��1%����k1¥�jG��-^=����i��q�>�I�rQ���t�6��m��,�vH*��1��H�zNz0}F�\5��U�5,�D@���}}u���[��+�������e�))��O�JŨ%��{���@y�9�*O���3-PĆR;%��]����k��Q$	��Q����0}gu꺋[��t"���2�D
���n��t��-�RE��/J����$�&C�y��2�o |
8t���G~~�f�v�y�iI�v�b�Z�dJ}�l��/������0sX?t��N��\�F�9�3߆��@ɭ��k��
���i��UCl|���]��,�t�m3�N�
�<�\�^��X��p�z��v���Կ���e:�ۍ@3�K��;.#z���9���9E�� gVO�̼�	�P��$��{��3���{��,��&˯C`i �\A�S2'�]+��?m|Л�����(.0���^�����K ����:-��X�'����q�GڷW��ٶ��!Q�rP���d��a���枆�ڑ�L!�OF3�5�"��0����7�+5o:�Pv�odaT�L��}=�e���56�u���Οd��ɣlz��Ű��/v��|C[���:��8�apU2#93��9��x�t\�u\�b��"f�:�`���6��VT ����]�~��Q'���Kޜ)��nV�M��b%�-k`0��
I3��*#�ܴ���{�cG�L�r��~�{|�p0ۈ�Z�Q4����F��+�UvROS��T���:��� ���g�t�m_�m���Gv��������˹.��yuWe�l:�l�_���ǟ��U��*��Ѹr�2<B�e��+��3�/�c�=�7.�%��߭�h�[�h��U�Nm���#k����2-K6�R��
�'�|��j�8��e!�@��<u}�v���H�ъd:��	v�o�`��Դ]��˷{����Mdn�{���K�w��+u,F��09ח����QS�:pC!���Ќ�^,
.�o���o>�x
6�HX(���JbXWia'�&�o�矴D�z���Rh��`��o��ALa�d;�o#�1`�Mps	��t�"ذ!N���A����4V�{� �y��k�-�r�gS:�`R�+"��������� n���0�F�
Ic4�SuL�'�79������hV�E���O[�3�6��e;X�\U.��f����':��\��WĘo�Sb���+��_�����l��,0��fF��\��CN��5vj�i��{�L�%�ks�sg�/�Q�0����dm���S�۲eΧM�`��2y"Z$�5��!�5�nHs�r��QGi\x`�o؇ˠ{��Z�*�xH�C@]S"k=���5�2�j�De�W�$"�.gv��-c(<^�f��c��֒�hI�7+~�WqQ��O�F90�~
��rk.4�v�4��uU��%�D?�Lt�1)Ms�N�q<�d��a�Á�9B� ��	���?�5����	5���%�qh���;��������m��%�^\����aڟ�D}3��nol�DuL�2�@"Gj)<��E;�BZw0�|�\���6:��,�̜f�.8��k"�$:_oY��f!q����UAsS8���J��@�("���Fh�Zn ֢X�
YdB��ên�"�MF�B�i�_hR�_F����Σ������h���5߉(�Pۨ~E�&�3�jR��E�e�wCE1C�s����{��md^���I�c�d~k�-z��\�ٱoբ�a���lXrN[ji�e�m�|q���‚�4�Q�J�	:x�t�oZO���Ċ>���k:g���-�k��ll-���/⁢\)ˆ����r��F�zQ�7�n�����Ke��FOE��#�+��x���#J?��j�X�DWWUL#3W�ˊ��t���;�c6������
�.�z@�_PKEePQ��o�D� pip/_vendor/html5lib/__init__.py}T;o�0�+̒��Y��@�6��d(
��N������=R�_�E"��{��9g/���`�I݁��v�p؀��{������WHH7b-[Y/�f�{�GW�VS/����v���æ�aMg#1Z�t����
T�F��$}�p'���Jk�n@��T
��F�j�`B��ledDk����"��䅑��C�����4hu4���HTT�L���}ى(����1���f�Q�y�EݐY1�C�HEK�DnFԷ|ؗ��C�Gπۊ߁p�	o��Ȓ�jݶw�=�Fm4�I�5f���@�,��.�T��(e�X;-td�m�u�����.���lE]'T��sװ؟��)F�u*V�C����y�n�����(b�B�ߤw��0N��R+ʲ
>X,˥�rF��Π�[�hF3Z���RI�V(w�8O����e��^KY'��.G/3�i�ps��wAw+K�}����/NT�v�X<ƍK3<;N=��AD�/�n�Q�iR�*|��xUnQed�7�}�q?�ȥ�즀�t���B�����
��PQ;)�a'E��gPKEePQʧ-�-XA!pip/_vendor/html5lib/_ihatexml.py�[ks䶱��_������%�O(ٛ�Y�*����$�$���hFR�����i���k��|���h4�
�Ip��������qw�����_/qC�S�]�[���yX-�u+n��Al��?9�l�.���b�F6uJ�y�^�_
�V_������I�{����ڙL&'�/]7���O�^;?:�Dĉ-'w�)"�)p*�!=�ȩ��碗�{���)
�F��D�����$�'�
'/��\éHs=�̽X��C虧��d89,�%?���~w�$5M���OJ4��/?���K=�_`,�C)Յ\ʱP�ZO9G���z�n��
\�� $��ʄ$�xF�=A�<&Nb9q��"(3��$��dhރ�iN�Þ0Ծ�!��Zab)�!��[X��kN4G��O��M�^QL��Lw���1�QGv�"=*��Ԩ�p��4�2�Q��Ũ���E&$XB�In98�-c���g)lf�����Z8����̊��0���f��2���H��r�+�\�'�`X:7���aX��SN�rH�o���O�clNC�*J�n�Ia��a�dZ8)�0��2���Z0S3ͬ�
�Y�3"�s�f�XP�z2B,�k0#�2�h���"�b�oP���"��q�虯�BLn���B��XF�dIj9X�����Ѡ�l�c��;[�r#<v7{KF;[��I�҄8vДzefOȲ�8f�s�0�'�A��b�{05��an�)�r Fz"Dxna�	��.��`�-,9���h�)Zr9�Fnb#/t��%
Z�
� $9XXr���`a�)ȝºS�P��ь���EIU��(t/3eBݓ���)���4�C��%�Z2���?�
�2�!R���i8�Ic#��Lf{�1~e�/Z�%�z2c��=�*r�
bˁ�U�Q��w�~r
��ĩ�Cʓ����jt��Q�Ő8�fF8�&=�X��͵���Y(GN��B��)4f��֣�QY��y�)�u!ԅX��QA�J�WL�ƾ���Lۓ&��i=)9�VFֻ�I��,��Y��ܠQfc�� Tگ�W2$^IW��B����TV^B�Uz՜d+�LPNH2���J�K���
#���vO�{h��k�Y��Ɂs�[ᜄM��U�U�[���$���Hse5Wԫ͘{�1��%��Of��
mN9���I�O������)q*��.|o��Is�N˭@=`�,Z�~�����9�P@�̪t�l_>k�Q�4ƜQ�f}W/Գ�zj�|�zt��÷��O��ow� �le��r����!r�=�Bz0�B��Y��r�Z����W�(�;Z���?�x���8z�T����lmQ'�JjK�2+�=��{%�q�|�@,���6�虁�f,�)�5g	���%z[gY��.hX��,7��f0=`�\��
}<0z�a�+u��Nꏃ���)zД��40�
i�f�4)�Y�2ä^�����x�*O�{Ssr�"
�ۤ��Js3DF���I�̤d4)Y`�@�9l�H6g�V�G�bh�,��.�z��,7hd9��
YNY����LAN6��V�EiS`�4"����soR�����ybB+'Ss{��djn�%'Ss�j^���<`.eT��l.,��\X��� xU)�uj�Ԋ�ߤ�%MS�|��YWF�v)i)3���<��ŸC�a��O��,ĺ�t���=�V���*��cr���+6�&J�RcUF
�Xgc�0�lI��C�-=�c��cW�<1ظ��{x�x���8��6�>F�mG���skd�*���#�_��8�IDS�I#�!���d$�Y=���I&�zrғ[��d
����Keh��^/���Pf"��M<b՚SM���s?/\]��������h,�>J�zcf|:K}�u�)�L/
���L/ɞ��3V
L�߮��~kx�l�׳���_��ap�[q��wb�'�S�5e�J�D�3En$9<�OO��?��Q
Q-6���8R��k�_rnĹ�~��������1=��N��f��(�_���W��8W�R�q�9�T��|��|�S��gp�ѣ�r��� ��{){?�9�z�(��XA�?�a
�f��y��Qy_��^�ê��ͭ�S�e/��6��7��^u�n�Y�av�3w��t��T
>�[t��wV�r�S�yw����TN/o��7�?�ҵ���٬���zv�F������w=s^�v�ñh<%����g�@n�o6�@���wÕ�+m�ݡyߋ���3e�Ɏ�
�MKb�mfgz�����Vbi�nl��f%�Ơ;�l��V੪�گ7�h���hR-֧�%p)���Tt�r!�.J�o����=s��[G�r���\lͺ�Rv����U��NJ�Z��^ϸ2��~tئ����ѷ��mK���`�&(�v��T]��������/���z���wB�N��_������x�!�&�������n�r;������uE�9G�tO����]o©��z�>;-j�ի�C�}���7ʶ��4Hk��8�����t}|q�u1|��
{�ܙ�C�e ��^-�����֊��F�Cn�c���F������/�������n'��虁Gx&������p���l˲p#�'
u\؆�(���8���E����.��Δr����"�)�R�?(�"?M�&�7�T"׊���T�%6��$��<���N�����_�^j���PC��d�V�^&>�2���Z�X�'��껻�2S�K�`�M->���i��髋�?^]]�]]}�?WW?�]=֑���Bw���W�]|��z��?>h�J�2E�N�&@C�(�y�t��ETQ�s�С~�g�*5W��0�--U:U�(�CT"��IZ������1�Z
�B-���h��U�A�r�r2�� Q��&D��@U8hK��5�}(���J�a���0��-4h�P�_!0
k�h~�¤��FE���͕p�%�UKR�"E�Ԙ��f�`As��
�F��#����O,_��3�*
~��d��J�j��X�e�P�),Wf���/����F�1r��g�Ô1�2�)c
Y֢�M���-�d���Q�]ԧJZSE����2�ϕ��G�~
+9�ᾲ��1�@U8(�����!� p<��qǓ0�8�5d)�8��@�*�r�STc�k�^�-��P5�^����d퇠�*j�:��]��5ܮ��:D�0�
���v��<u�рA���R��
�f	(t14s�uV�*1(i��a%W#���V7���˄_���)�j�
����5�tO���q�H
b�	BP4,M)�?,�iHC�4� 
�h�D�ph
����4p�!G,����{h��h
��hȷˣ�o-|k�[�Z�W-M}�Z8גsm�&TQc��\�ZrNG1W�v7��M�h��
����!�"PJ�bD���0�Dpt�(�q�%����1 6hQ�l�p�&�즢�q�����ͩ�0�4x]��]�l�pv	N��U���t�w5dk�0���m"TT�u�z��SI�����zjHZ���[�!@C��
!5�>hD�Ŕ��h4ŰQ
�����C%��1dc��0"�v��%eT����
�j�è�OR�ݐw]u�#/:؄3�k��`�UP�@K�4̺��*h	�%@K@-@�2]�APO�P!u�Iڂ���@р�D�@�
Pi��6TA� �=;�w�5GT�ݖ*�U+r��CИ*��Jڡ�̔��B�wU(I�&`��w}�X*,DEŰ�5U�������e%����+��V�6�
�N�]:s��j�~��6����~��K�u_�ӳa4�[��LnrP����6E��[���6�cKi+���9�N�I*��4]ry$_�!��ş�)B�>�}*؀�	�a��/I�>.!�I�>*�:̘>�mg<�I�l�:ѿ:Ɂ
5ـ���x(KA�����'�O��4�%�iR�B�	�"Ax�|���_��3��=Ȍ�/����Ց\ar��գ4��-俔��_z�7��]]�}:��<=u����g/��ۛO��Y�w���ֽ��r��~+�Θ�މ�pl����˫׃�i��d|s�^���,V���fڋew�f�Y��h��n8�׸�{N4�͗��r��NZ��(x�����!e�a�.W��#�zsW	�ڷ���]��|-'p)��a=L!
 1�/g%J燘H��Ot"t�{go�'Q�=�l;�b�-{-{&<	#�뉶�n�#km�o9nCΛ[��?��m�b�ޢ~E�������ku�;۹3yjս��w�|3����t�d.&{��8���tbl蝆��Ml-�,V�R�@��t�=�� �/�[�1�������qX]Mn���ի��ߟ���כ7��뾂)�~�3��B]%Hv�_��
�x}�����T
2۟�r�nk���>^��V�p$@�\c{��"xrv6Q)]���{��<�۬W��y�V�����V|0d�P;��1�D�u���{�-� (V��g�������S+?�Ɨ�Ø�d����1;������둺t�Qo�u�4�u�-O�|2�0߈�a��})�S�!��N�=UpX�Ο���Ȕbu�֘���ȰoGKU�L��d��G7�6�0e9���/��=}GDڠn,���}�s�T}xs0���T3�F���p̈́N�s����wU�5���}p.�C`K��a:�t2S����@��⤇~�j����缒f�>��2tv,bH���A�K��gSe�e�n�J�&�¶��#��/�Ư���)��y��\8���s:�֌i�}�#&[�:
����ؚ#Jo�v�k���7�Q�ߚ��u��퟊�Z�O���x�Ix����S�Q��Ɲ#�|�����'/8l���g��H�nEY�����v��o=�]��� �6�>5����8~G�YO�R9�I�-�����6o���]l&�~�ߩ�T�'�"��)`}�;NX���\��&�eZѧ�JBm��iv�PKEePQ�6=a~$pip/_vendor/html5lib/_inputstream.py�=ioǒ�+:�1�H�-X^X���B,��B��a��h83�C�{���VU��P�c��@�������.�|Ŧ�ES7%�NY�*�fѬ�Ӧ�S�}���MR%y6dM���OӤ�e�V[[�Q$�xzóy^���N��]=���5^�7�R}�꺘�i�3��)�4�mm�g8e\�o���j��}ͫ����s]&��'-���x�B~�YUGY�q9�4���b~|�Qk��,��$��k�ۗ��eU���W^De�O�b^�@B�Q?o����>��HR��зb��� ����,�X}�YQ��.�T��T�Y��l�jL���@|���-s���h�W�4�
PC��s�.[����5��̙f���!������&J��T��,�VMY�˨��w������^ѿG��)5�M�ߗ���LNNvG��S�2��ҿ��_
}W��}ݶ�۞궧��n{�۞���n{��^궗��n{��^�׺�n{�ێtۑn;�mǺ�D���S�v��&�m��vU�5��1�Ͳ���l!9g\52R5M�Vl1�������XU��*��I�cdHes�7��n��J��p<��5p�
`��� ��M:�����M�"KҔ/�TBP|-�& Ċ4��p�*XQ��*z��W#Ƕ8��%���k���^��.�!�\ �n]_YMV���������ľ�"Iy��8����)���}�ڜ������F�v�	.��O���f)?��#��`㊶xZ�?�$Y�Mg�b��a�"O2�8߽#�2����W-���xz���� <S-�U1�à^��/����jy�V�T��
�k��N����#�HA8V-Ǫ�d3�NT�S�T�LT�d3�����&��*kZ4Y\7r�wj�nx-t�	���K_�I+<}G_���Ϗ��#jzAM/ŗ��xX�8�b���bP`՗d\��~��/O���z[q
€5�/�l����7Kq�{��x���Vԩ�l���n8��n ��HJ��f[�J=g	Y6)_���� �XR���R�j��
��'�Z�"��&#@����(�GT�I��l�7�oX�I�}�g?��?P��9�~`ä�N�OC�&�b�`�X��=@��j�ť��ȫ�p�G�=8
�(�he,kV3^a�0#Ztj����������R���V��Ł5�����uTГC��O�[�{�^����U�a�Պ�kI5h7�Za��0�3y�Ȃ������jL���^w��Z��{#�۫� G��1V�׼׽i�ڟ�vհ�s����X7��m�$A��2Gw�)�[�
�Y��#��C�><5�;N�%bB
nY�>�)W��U�1FK�q+�5\�`
|�3����<�mtVg�G�d�>���I��!��mr��� \x%_E$�C��7�y��s9{��I�a�\h}<�.�?+�GF���[��[�����;y~
$$c�O�p���`B������� �y�+�
�h��ٓzC��OLȗ$��|DZ�7�恻��7��:�)o��P.,ҮY���#ֶ�;[���O�n�����=9g�\���zc�8��
��ȵ9����hj%{�����mT.�n����5�J���쾾���5K�����(��y�+�w�<˄?8�00�u���0�c��˟0�8�ْ�'`�`�'�##6���ٯ�*����z���]Z�`X��n4�'�@��¡�e��#CS���Y�w�f�h�,o�xQ�A��Z	ذ�>d�(�����K�K)��� �c�F�ɢkaXc���-=D�#�ߡ�ݍ�V@��{�`U裡8�=J*���S�=�~�8ʄ}RcTA���X�*���R�����s��\�ZN�πp�dQy��rP:ft��2�I�2�%mx�-T<��9�B=ϯy��
t�rT�m���5��#����-	�ރ9��)��"�b�"�q^b|�dڨ�70��a2]�Ѝ�Y�0R�d���8'�LAEMZ��������l�۱!�L��C�$�K�G����u�`��޲�y�xoN��"Ԣ��`�yv��J���h����:r'P:b0?Fb�Au�q�RS�8R<�.�=͜�F諷���[qܽU�&L��
?cqqd*z��>f�=x>��E��C1�`%�~b`ih�eT�S^Q�գO� �i�x�9���b`�c�.�(D��Ȱ��Q6�P�)��7�d��6��ӵ�CŸ\�(E1x/�l'�����ƶ9ʘ
��2c��湈p�s<�a��T��IV�<��–b�>4XzmW6Ic�����gk����owe�}��[8��rK�
'!��V�$x����2�5,[=ͩ:g����uS��~���W=�Z��k0fz�߂.�g��l!��Μ��y���/68��D��p&�R@�f���+_\��a�g�f)0�@8�(�M�7��9�<�ج�w�P���TZ�-�d93'8���6K��	Dz��W�aB���TE��!��*�3C[1*�A{�,*F�[dnj��?ɅJ�U&�)�7��r�8hm
	cA2řk��`�'p�F�l�d�S�u�C�B"��jR�BI������:��֏2uިY&Hv�f;C��!�a8�ig�<�O$@=O(����$��X�$(I�Q�l���		�ca���
\v����r ��韰=/:�7�0t ������J�*��@_��-A��ъ�ed�<�z���}L�/��,O��b��<�1#/Ӌ��I��|�c�q��(I1�5fb��O?MP�d�(`:x>�`F�;"�$����5?�F��y�<y������0#���d�~D��es��2��nQi=�0z9�z��
�ϓ���t�K>D�l��[m[�����R7��w�)�!-�yh��������C<�#g%�g,�˼��:��~�	lbХOD\���U��>�#�\#��\��`�r0��w��sSJ�9a
Kn�x2{��(S1��"jMQ~��d'ة���&�w�,�()=z��N�&��)���Hr�s��oy��7��eh�c�ws��7<}�`���M��T�_���_M�����f�y��&\�r^6����"��n)�~�5XeKާĉW�0F� JS1���1�m�I#]���Cn?������J+�"Q�ܖ9x02�-tc��
�@hK�뤰b|j٫��5���`���;��0��Y�d
߲%$oѬ�e�7E`3��ӊU�u�H�3���GZ�����a
GY�Q��V;��K�>�>+�x%b�0�%r�e@���(2������x
T��舂1�y~���ڃ�,Z��_�/>���z���!�2�E���ط�JR��n�p2��z�
��v/@�ǠNY�[���XV�(˥�O�2�!M�Y�¸֑3;��Z�M������![��i#�����d���Z
̿��(cwXD��T���
�;I�����|.jذr�L򹓺U�$��lH(�����&G�o��

%�ԡ	K�{���)���w���ΛU�s����T��ߓ�����Y��N��D$H�v�0�\m_��{��ܼݒ��*=v������;��a��|��'�Ȑ ���+�L��ҫ��'���o��ȃ�Lqͼ����I��b�%_$6�+��z��г�=Z���@�=��J�F���
�g�Q�� ����o9Z
,oڊ+��m��1���u��a��>3���<c�S1�%�Z�0,��K�U�\ZW�����!���"�h@�l�IEpB�F�6\��v��K�xМ�	8Z<��BT%
��y�vR0�"�3�.�,G����]�D@7_h��P���h@x�-�"	3��]�}o�WkCZ��,�wB2�y@��V�70ד-�F��GH3TP���f�u�K�hY�/��oєS����P��M�����wB����!�T�
h��@��{J�$���e�2��H�p�ȑ���2c1�
��PLy���>���EIY�:����2��2|�9��P��X��F�.�;An�B#�:,6��VOB�]�;yy^�L�1�n���Y,�����O�����Sg����;s�C�K�,(t7DPY�f��U��ӼL�I6%�ͅ�&�d���_��u~[�����(�12�!!�L�K諿A�E�L&lG�Ē-�*�Y'�M7���Sn* ��z	e��/���2�%��2��<o�2c��,�VO��>Ú��	}ԩZ��%�)�6*����AkE�����7	L"r�͊J��ښ
����?����s��`��l��iB3A}~EEb�{Xe������6{�/�`��hZ#��ht?��8���v��ݕ�cu��4��
A�SG!��ct9E+e[��V�-,��Y����EW5x����W�WW��c��<��,+�і���-�Q�"�;��X����W���d��>2�,�ш��U�!}�kN��V�JՎ��طnP���F-',;4�c>G�L�����0I?��F�c�5��Qc�6x�2;kbϸ�}���u�:�1x]��o�+��|o�q�)
�����vj��B�{��c~+����Z���r��o��W����H�:\\�^���O�jE}N�|���ﲂ3R��:�
��.ڀ�k�@V!~qu
U�����hD���u-�'�x�Qku,��A�ڠ�N'J���UT��9w�	y�?ޛI��1���(��}����D>�#B�����(?~
Ӱ�A�D�#*����h�}�aW�r�i<F�ۉ7jSd�/R��o8
�^U�^���=�� \]ƴP�¦��N�4)�w�Խ�O����Q�PP�`�^쨮;���Cl22v���V�v����X�`��{�9�L�@pM��/&`��"T���b�TzH)`j��po�����Vg��L�fK���j�W�n��%�$|�l��m�a���6�vѡ=�t
�<�2�q����U-k1T���IK탩n�.˄��1n�}hX�ھ��ZfNi ���-]Ik��Ψ~O� ��\h�)�!��k5��v#�y����k�*j�-�a�m���%�r��(���v㢚���2o+
�d?JP��H@�mQ`rt1o�8r��{�嫓$�(��-���]�a���ɫ�C'sg���ދ�S�O����p�v��О�О��A���@��aY?�H^�i��
r�u�8��s�\�T�z��&1�D�H��M�F��F�@�����$�
1Ԥܮ1������k�Œ^�y�����[5��?��L�"���*��^��:�\���;�L�=���1���!T�)�KK�y-�X�eWu��>�m��k����+浒Z��nnBx�!��u(!��=�(�l�	W�Y~e��xw��q��8S3a&�Nn0����X����Y��&P�9�ψ}�T�1��0���$��gAt���|p�6z,�j�x=���
�
qkh���
h���.�*�1ob�
.�&*鮘x]��?�T�d�7P*���%�:�J�2C�a���JԈJ��@�G�~�Ό�t�����(�By�ɠ�P/?��q�!ʾi
8�wf�ElM���QT.��/)Y���$�w�@�E����\x�#��'FJ��X+��z�G��\��{U^h��{�Ve8W�C�(
D�x.��`����SUuT���5�S�6�Ô�� ��7�72�d=�@���7�0�V�3��V�c�H��Y:�|,�p\z������W<���\d� I��چ&���E%
�5�+J\�,�K͌-�[`&�4�X=md8����]m�����1�L��:Z��F��b:�$��(�?R��54`+�W,9g �ӵ��|�QҪ��6P��W����X��;��`�F�[r^�$�w.����#�]�oC��GL'C"�ʠ��׋�yQeb�>�c��n�:5U��l�D���Ea��ֽ���>��4��Xo�X ��q���Z�;�a=�O��*oF|+#仲��Ly���fU���^W��[���#�L0B���qu]I�Kk	N� �K_�ƚT��ACK}���iid)U�t�w��9�u�Ǻ��X�ҧp������AJ��@� E����>��t���H���~P��T�f8����\=�6��h;�����S���\`O�o=�J�8�\����Cַ����QO�1�)?�WT�6�V_r/��?۽@�W	����<Z��`�'�/�uO��	N�*�A�k�<�bϼ[c���5��r�r	v�&���RP��5���K����>e�B�n0����E�	"&d����m$O���=��@��t��2dW�M!�Ż[D�.4a��d4zk��k9��7��ѫ$D��uc�	��˟��4v�ˋ3��"0x�j�~l�'΅S����{��ڵ]z�AŒb��J�Kd�� �g�i�\E�Y-W���{LN��w_ɢL�q/�T����i�w�Xpp�Ҩ �ߩ�/`��켛"~�	{	N��w�÷"��^�M/�;&�h��W#aq#|a/8T����h��07�W�9@:�Y�;pR�"��N��ER#؟�'~���Y` <�@4�O#����ȧg*�{,��Y���m�H�
��ٚaL]��H�m���6L�м��'~�m��g�V����p?��h8�Ƶ�քd�
;���]0���Bԑ�q��3Qj�Dj�!^�D����}��Q����CE�J�~5ir��A��X�j�YD%s��rz�CR9�x�P��ۮh)ҍ�#Lu���2̴P
-�㼤ݬs�a�
I��?1�|��(2ີ�;K����A�G�,7>��Mϥ���x��U-~oG^'D{k�{�mNz,J�y	D_y��2�wV���7�W9|vS��¢f߄�φւ0Z���-�6|���yk�ڶI-�Ԛ-��$([)�C/��%��e�emh�L�%m��
2:y|
8{�O������o�S^?�L�'�d�����v���F����ԥ�q0�=`�Xf���% �>bԪ��V����r�3��1�-�xR�n⣒o�H��p��+_ ����������
��}��Z�G�:@~`.̚IU��m:4���:b\H�{���"
?����zm�+������,�3��X����tc���{�!��ð�s/�lC��}��&��Ԣ��>�h@��#X�5�׬�O�6����=h�Hpt��k�F~�����г>��e��_͑��m/(m:�߰�M����C<�{�z���Ȯ9����o�k��#�&��ϗ�.�U�w��<�����F��	"�ŃF�9Ԏ�o��1]�J��Bƣ(�����8��jX�q�DTї@�PFn��O@Ǜ���|�ÐJ�w��n��q��u�tO��ë1����3^��
B�2$�_��ʥF���@�!�턬��4�eD��{`������^�F�4�w~4z��5�0f=���Cz���ۄ�6���sQ���љj�O��8��)߉b'g����I�QS�A��٭���y�O0u���첁���$�#�H�����a�W�*%)����y��O;���܇�_U,����)��;FQ�͟�v�'��P�P���?x���J�0�|,�!Tm-��a�P�!�_	���
PKEePQ5�mO�,"pip/_vendor/html5lib/_tokenizer.py�]{s�6��?��gj��T'��#[{lj�if�4�8w����$$��H� �m��=�$��D�br:�,�y���<wJ��G�x�Xә�D�a���Z��'�ug1�u�$p,�5�m���m���i̬��:��
��1"��'��¢�k��������ϞI=j�Z�/��y\�z؁k��!��$|���Bl���D�tzNJ�QǷ|���3ò^Qi��_�g3�=}��S���i�-�O��������E�}��:��b�>���,��љ
��B����-��g�G�iT᧋ׯ^����qQ߳hT�>?z��"G��^���G�(�}r|Dz���w�xt(ހ���gP�D�Q�Q寲�=2l�1�Q>~��ܛ�@;Bښ������K��-�ϺG�;,����1'1|ī|E�GC#�<�˿'�'�6�Ƅ���I�	�E�9��Hl�e��i� ��H� ��1�$�<���5�`�s
���|��!C��DP{�Z(h����F�$L:��˿��!�>�d�{�zGo\�髯n�uò�aCDn��i���k��	�PO|H��w�f��/K�#�@y�q!%�}F�m}��F2����s7�P���ʎH��S��wEm���^@7C��� o��}j��ȊĐ�I�P����>�u0�t�m(�P�SZ��O@��*�c� ��aä����t	0�,�mP�Paq��s���L-uL��{
��(��/YA��@|/1��mJFr?�HI
�6/�Џ~�"��CHg>�4�4ky�4@)qл�:������V��?8�UфnL�)kĽe��`�j��	��MD��D�`�mם�� ������0|�J-�$��~G�R�s=�.��`쟚 �=��R{��t����>�P��D��p��z���z��L1$hӑ/+):�`J��ꝡ�� c���Ǵ�r�w�!����#�������l6"�Ent�V�"'�1�aM6�48P=���G؟�-�K��6s�ˀu{���?4*,���8�}�8�*�W)�O�i��T9�l���>���nB(tD�&�1lL(���cB�&�"?�>�[����D�i�3���}Z -��P}��-5�(@@�e�ξO&��v�����7TQl�w�1�F�g ;Q0@+̓x<�l�������8��G}4ti�^s�c�de�b'�%����Ӵ�o�{q��B�1�'52�q��f@\4&�?i�����~)K^�ĮRuU�}r��z4M:���f�F�7p�͞ex9��ha�w��ݟZ<,�+���S��N�z�O�?<$?I\�?�k���L۽��1�zrx����~
����X���'n��cFA�y��Q��0wJ'�=��!x�{Gc�C;#�4&mˡ��(d_��H��v���D%��w��*?V9?=U)�険Jʤa��Dl��]�>�c�����s��	����xͧ���7�4��MT�o��E��)��G5��h}}�]SZ�E5��h}}�CSZ?D5O"Z'�7ϛ�z�|�z}sڔ�iT�,�u}sޔ�y�M�1�hWYH�ga�ݣ&�˷sq���ߛ�3Do�5�hЙ�jb����O��9��a�X��E����D��n��F�w���o�J� 7^��;�?���{}Gd�pe�����}�Ezw��ԃ�8��E�˗2R�ϩ����!G��g�x�-F�d"���>��O� L��0�Y>8,,r	�0r"_a��l.9����F���ڮ�e4K�U��}h������,rS�Ԥ+�1��:��;��jG|�+Y�y)0 �()�����8�Q"`c"!�":Ǡ|��8��	����_j��|8~%�+	�/��3fҳ8������v�YbI4�@����Q�|�K'c�f��@Y�Ӳa�/�]�3"�|��(�S?��G�pS4�l>,�H���XI�Ok������7��1-���ʶ3�H��D�x#BÑ�0Y��	�|���{<-> �*��CE(� �抡���T�N��r`"�c�!��l�w�~�œ���{-P'��A�Bl`"ͨH��`2^ ���q��o��~�Q�z3��?�P�1��:(��x��<]��D��sk��#��E2��_dH��Cr-��a���%CJc۽�m��߀�h�"��v�{JQ�FJ$pv�3lD���s���x��\����q,��_J�&���F	�g�~�N/cKq�FaL�Ⱥ�JÉήo�]�˼�0ad}TdX����m���O��!/xj�a™��
Nm%�d���S}.8�%��L1$Ql#+N6���I��y�<-���u�p�+Cd�%p��N��sk����iE{o@+�xR�	{T(��g�^yS_Qg�:uzI#��_t^��z�WX��A*!�|�&E���B��YO�=���d8��r< R�`*��I��̸W�W�U�J�^�iM����"�_�/�S��5��4E+2��D
W+���|S<{vU'X�>K~^R�{y0��(B|y�R��
-��	�.+	���C�)L�a1����ҥ�"L�/��@��GieQ瓴��@"�|����OB�ជp���S ��G�H��s|�^+YNυ�Y��9;�	�4*@V��$}ź�<wt���a+�iC`�c@:��(n�a�:$��R]��\0f=���xa���?QRi���p=�dP\ZF�����ᆄ��.<�1�h��+e_���",M����H�q�OmM��uX
�����0�̳�rS�t�GG)��{.�v�7O�O���+�_C!yR�)}-1�9��j����)�D3�ٖ�{G�v@7��8��{֔���a03�S��g��bj���rQR)#����IMA��`�Y�M$cF���1��1R�{���ŝ"[2ln`�.
F�>�ʱt��)U����#�)�#�����L�
Xv/�j܃���1�,L�T��o��B�e+�lR��G8����y��Ώ�t��?�ʈ�`
���q�Dq${˹�m�L7���"���y�]<�<��ۈ�V�.|�
D�f&-��_%Ѭ��p��ў��/v��#��a0?��0_:�Q�q���Ì\Lf���x��WNnN����dfPק�|��IJ�_� ���q���{L��2����AF�x^�b�@�aHzc%�5�'C��r�<�!'&6tƜ�H��Ҥ��CLi�J7^*2�tgN~�b0���`pc����$�ʆ�F�!��/=��h� ����n��IR	-��ٓ(5
�Y�UD�<Bi���6��Sh�D��_:�)[n�����`�rq�;k\�Z�αD���R;��	tN�s��@1H.�$�����O?�-���-ڪ	��V�m�N���픙1óf~a�ն�'�u�^���=MT}f� �V���ר�Y�\�f�~��UJ'���/*�u�{���6�頇U��������EyZ1�j^�����xU��ʈ%�g��d�VU9'�Ld�j'ƭ����S3"񩂑��T^&����>��|ǒ��q߰��E�A=�?�e�K��j|�Ӑ<�%���P1|;w���i�c8^"���e�M�Ʈ?�p���l����=	��x\��4Q���?�|��ˀ(Ę��|����7�8`/�)���e{~�"�
Y�n��Ϛ���/���h��F������W��ֺh���>T�F5�b�6���U��׋qK	F����'e����p��؈f��;�!����amc}Q�[�R�T�qWt��\�ƻ�B��������w��GJ�Y���z!as��v�'��2��X�|�䵨�b%�w�ϛ�
s��3\��w҅�%S���Q�Lل���}���·�p۸��?�E�:�c^1�-Xj\nr�T"����͟�?fIS�T$�EH�����Kh-|��,��*���T�Z.	��BE~�(tX0ϝy��U��b4�BT��^�J�ﭸG�h��e��y���0h����������O���9���"�6�o�y��k����-	ID�v2&�v@���G%r?w-,YL]`�N�L��dYu��z��@\��i;������I�&�%���9H���kn�Ge6��ՙ����]ݱ�j)�ta�N��.��ªe9ԅUk	���LD�\`5h?�,ߜ�lR˛n��q�>n�8�-�yq�̙4y{$$ٽDR�M_"���{ed�K�+�gc��in�i�dr	c[����Yvd��rGlsm��悁�x��(��L?ۏ��[1��O��~Vg�k��LiC�S$��e�O��Ʀ;��_B7��o���;��i��E�%�w"�%�$���kN�/��b)?�=��%�G�x�(�Bj;��n��n���4V�+�q��-$���u�ӚF�A%����,�)\M�_��.Y�-��uU!��S;or��TM�aG2�j�C���X�8aفK��i	���Ҏ`�g,�L��@��M��Z֏��ju�|�5)�gNNW۞K�#���]R���-��jaڃI
5U���mU�~��D��C2�%�	�Ӯ�x�����֏����B�k�}���߬�R,���()�)���|�Yz�H�2$
�c�6��V�ʳW�hJ�͗o�6��
�:�wa_x#�|������U"O�9$w���j���9��"ߟ�rcYgQ���������N~��q'��_Rd���|q��NL�Ȟ�����3&���m;�Oh&�;��㍢e(E��Ev*��'��ĶX�eY��Q��'���O
68���v�%-�ÈO]�x���{^�?�����kӷ5Ӟ0�Qc��y���&��l�,F������@�Z�
�
��!����&��,ƽ5��O�<Gi�׻�����3�)ã��K��;�2����	�������r�G�9��3��]~��5��C�˘|Dzj�UR����f���1}r�Q��0^H�7�h"_:�#ނں�F��ѝ��6i|n 2�U��s�#�~������(����)�:�S���I�.y�����e��U�3ˆ*ܘ�,]�
3s >�H�΍�4+/��F�_�J��Sc���_��W��4���fv���v�����3�M_��	c\�R;������O��Ƌ)^��7�߆�=��N�w��J,±ܤninm��)2�ջ��9[�V#�r��u<Bj�R�+]��s
ʘ���S�A�pj;'�Xfcr�p�Y��4H�P_�D\�?s������̧F��J�;�Yrh�X�j��ֳ����_f�Ј��h��TO�(8�7QNr�������������
(b�Ƣ"�ɍFޢ��آ%�r#��+����kL�,_۴Als�-t!�`-�n^n3x�(�¡Wj�z7s�-K+�>�:R��Uv�J\g�ז6�GKh?s��,���!)�*F�����*�y��R���C7(���uG����
D�m��+v'��_��?�,��䘸�-�I7��-b�/^�Oz�Sݷ�,]��Ǜ�{�,Xe���N��aQ�g�љ
>�y�~ %��&%��y�5Ŏyi4g���1-��w�����#�V,���eL�6~�.�ãcp��A�cPcW[R��T�n��)5l�o�N�)[�"�`�B���\�8�ŠL��b\"�D�b�u�j�1+������}R�K�ֈ-.{����w��C�3����L�L�T����8�޾�4~�?�=?��}�|��A��?ǂ��f����L���~����$��"n��1D�Q�sŒ��8��o��FQ�%���5��5�j|�V�x�͂�2^�P��P<xi�|:M��I�p=���*SG�M1��:����%?�ꑢ=�7�C�CI�p�KA���:�)ZkZ;5��v�Ĉ|q�/����&*��������JN��KM�����1m�`�(�=t�F�U9��d9��ل���
BM�d�
ئ	g��eKD7sg���\6.+��9���
Xձ"��,�Ȓmp[��8=�P���P�:go�Y�
�v&��"������U�/�&�=�컳�E�(<�{V�N�~��{��Bm�~�K`
���*SuY�:wֶ;+���#?�m���5�չ����i��8�
�cD����κӍ��%�pC$�S��)��S�v�2G
�3\>��í5�Fx�ƸI��˽]���E�&�B��f7�\i�%���&n~����g�qo»��h`��,�q��]�|��oƆL�wbUZ|Ѫ�r�i�z�9ƕ!�V�%� �T�6%/g�N�g:c
EކwU��\��궨�.{PqG��.��A�&�n,�޶PTew]����s�*���K�����v�T��o�o9*��^Ƥvph'�>�eB�o��Rժujuc]���T69�M�1�U���.�)�u�O~ׯ ��n��n��s���ϯ��]���4�
��BS�ŧZ�Uî��7̀�M���7.��n^ħܛ��p�E��8(zT{b�ɜ�����i�W�'���}�۴��)>����C�;�����S��I�(���\�$Ѓ�#_�ɽ8�3C�R�q2�_�4�b��>��ލ>���u����2x|h��i1C�Lj����=�U�/3_ze�3`<tt�x?|k'C�cf��٢P����9�t��=���L��g�2���L���J���|*o����jcYͷ��kdQ�0��J܊���v�ٲ-��Ke�R@�)Ve��L�'f�E�_�ss5��!�={Qy�
���g'Jx:���SnmNj�s�"P�ʖe~+�c=�6tǻ�ޔ�tk_x��ba��Vgc�:�����AI%���[+��J^oſ��Iu��1߅g>D�b-�j�^���7m��C�0�&�ͬ4���>ՙ�w��M+�V6���`_�ۆ��O7�4���%㍭��l�[mkĖ.���j[���W۔��v��!��-H�ęty�-�V���X�k]n��w1G.�i�#�p���LUk/�Uz�u.�uP�AI�V%�%�&�`R��
~>��R��w��J���Q��ˋ�rFkҧ(�|�d����s�\r"�G2�ưd���=6WZ�:��������»��!��߳�3�!���t'W$T~���3q3��U�=FE�x�g��W����=��G�.K����Դ�o�	�DU��m�ܞ��a�|�QP�p��=����d��)�mro���M&ԣ��]>�Dw�׸Ľq=,��
?��?⫋R��=&��⋂�؄����⒊��V�S?��^�֦P��I��4����ׁ[�PKEePQ�ӉI�Cpip/_vendor/html5lib/_utils.py�W{o�6�_�⠠��)ʣŰ�5��v�V�)��
TZ�c62)�T��w����,
�"�~�~h���tY�J�4�.���F���!��%c���T��BX�Ya�`IvSrӰ�UyU�K<
�7��#�TQ��"�I�"kXY
y�^��WZ+��w��u(E���\�J'F�7D��۔��ݿς@,��k��u�p�9O^|ͥ����|ɪ¦�2�ឯ�j'H� 
��3��u
�4eE����<܅1�o�]���0%�يk:�}�"�����V4���w�.0إ���v�2��~l����I%yڂ��
U=�w�K����Pc�ȡ#��S�򗓓#|�f�	����A2V]�,,6`W�
u�Q66�������+a�f&7Pֲ�2$������g���Ħc�l���xbb�,[!!��٠Ge������ހ!/�����NI�@\�A���5ˉBs�
�<[1)֔�e����X�v�f����{?�eE�4��=>�@�)0x�0lQ�)��2�O����4�ɌG�}�̤K���Ar��~vU�֣m+k����Eum�/�IJ_c*~v�����l�#��3��4nZ�+��^�Mؗ����X�� ��\V�0��(��=��K|�n:S�L`J�Z�����<pt�HRX���7|cп0�C!���㘛J������L�[ġ`(��ƚx���eܸ�ħ��Qb���>)��B��a���B�����Y���4�rM6�|���-/|�¥R�,L��s||
�Oj������܅G���i�V�-c�*�G�’w�4��bm.pH%��=��D#��iD�{��Ѥ��)E�D�U{�$[��ʠ��y��Q��r��G���*����K�ޅ�/�/��I!lS�5Mp��|�"b��Ll]"�/H��Q&#��'�Z,�td�*��&��	��Ƥ��[2����s��E�Rv4�w2B�2��T��Ô�oÿP�̷2��uV�
`7u��t��f%��V�İ��>�.�:��F�g��}�ݪ���=��k�y�s��I����n&�
��\e&)����X�%�7�{�3�p��E����7��U�&��'3�k�4�=�
1�H#�����>���9Zt��s��[/�F��$]ou[�
��X�=��r�x�����Z��L��h�à8�N�27��Ǐe螇ku�#��^�q#��!6m]��Ǥ��w\�\�É�����z>hS��E%�?BH��^Q��z�:Ed�;�^uF���J��z~r5�ߧprO��[�W�����~���b�p�"�fx��}+p1�)��������'���JO�='��i
T9���g@�F���A���H�د��ȧް[�k���n�l�R�A5V��n����8 E�h�/P�˸Ɏ�y���cקF������a^�G�}�rt��"�M��iZ�o��װv{���Ů@�2Mc����x��5*�OLZk��Ķz
�xJ��H�Ɓ�����--��tԃ��^�{~����9\����f��Z�����yn�.(��i�Z>"8ch�mi�T%�/�kH�QIf�?l�m�E[��<�2�=�#`�Cw�{[��{�GFm[�c��*ߓ+A0|�*�)]�V�+���7�kG��iZD�hI��V����Żs|үb⪝�m����KI�n���c`y�~�PKEePQ[2&@HF!pip/_vendor/html5lib/constants.py�}�w9���+8����c�x��X��Y�%�ꖏ�庺jk��I2K�L*���}�<�}�I�����ׯ,F�@ �E��{���(�2���7iV�y��e�V�~���(���y�L"?
���3/�=j��E%�G��޿��.MB����?��'e�+/�|U���¼S����D�SV��y/7��A�6*V����ի�����FɍG���i�FI�5��ȞA���j�?Ͳ�/����((s��S
�=��Y�J��T�����y�gIxGIx&ET�K���ˏ���W�ٽ�x���8\z�m��m~0�����*H���*�r��\ϕ��ry��"�����v|/Q���M��P�E���w5��[�����Iћ����b�Hi���S��������$?O�g��g��E�=�%%�,�Տ��%F��o���	�܁iZy�V�!N�Q%�0iF��쉩6��(PJg�?Wu/�� L;jnK��N��Eoš�ȼ�`_;���X�%j:�i����[��$M�u ���$;�94y�2F��0?�UOp�������ZEO�J�5�_n�{�����\Y��E�-RS�V�u�t�n��U���g�rU��Ĺ
�e;kkխ�"��������~]�y�����ˮR������7�o/zA�z8i
��Z6Y�y�[](+}�V���V��B���b����hy��v�t��e;8ڔw��;_&�^�zO��?;t�զ5{�-}���~X�V}U0�O��i�޳��5��zָF��j���BU�u3��Z��"��YgfV�t5�f\6�0�e�]����Ό���9(7q�{���N�t�Ql2�&�Ά��GJ�i��R�S/�Z��!@u��GgU���?��Y�'�u��X=�er]��V����'=�m����/��+[���5��z���
h�*�m.8{d7S��۱�ߞ��i9�ÃJ_;��zOy�l_+�h���<��H��
��׈�MW3�楱�4�z�0s����b�7;�2-^�Rn�r��/�7n����m����y�Ӈ�'/Ԏ��2��f��#ݎf�O��Pn��԰~p�yoi����W�#
Tw5B{�nE�A6H[�v7n���:��Ew�*�==x�W%�? �'j�kaUP��X�6�����lfy���C��d\���Q�5m�U,2mϭ�^�Q���|�
mnDM\�fjw��u=p�C����Mi��:�Z���D=�����}UE�N�#�l���Ϥm�VV�wj��������ԡ���:��w-�(I�lU�c����U�j���M�u��t�Z�#i����n� KS����S(ב�yX�Q�� ����N7�U��Jz�KII�WIz��,K�0-��*ds�`���Q+��|c[ۨ���0��=���z�<˟��v"Ke�F]Uc%��ھ�m��Y{c?��<m*x��5��8�����= �ײ9:۶Vܦ+�w��L��ʎ���e���?{GI���5���B/
+DVB���#��2�N:T�l����Wh�O9[^�g��I݁��͞�F��z�Q=s��m��5ZV�|G��U�)�Z�=�"zU�x�H�„MU��织p�p�-�6�#H՚%^�Vݻ����������d��|�	L�m��܋�i�#��K��[���~EݶV�J��d)s�Sss%��ܓF�<ީ]mi{|ڦ�4=�,���:�-C�L�^ELv��mq{�������lۃ�����//H7U��[��0x1�S�M��J	s��7x��Q��2�6�ޠ
ҩ��m�W7���R�b��������aa�aa��Y8|q�U,na���,t����T�k�Y����*�[�{�R�$ig"ϭO��^����z�
���1��to�Zv����w0O����Q]���H���mޤi��_��Ha�f��`x����x����N'�(B��ٔ�^iW����p{u�:�F-��Y��z_���A�u]����p���3��pN�z�w��q� �m*W�n���ڬ�wX���]��nW:Ԑ��e�ANyO�z�ǹs��������f#Ko�N��j�.�h������(+�W���k�䪐�PMS
�jGh8V��dך�ڦ�,�i];8�cK���T]�W���:����߂�m|�h�Vw4U+L�*����>�z�.���)�dl�V�K�:�:���h??բ\GWv�mKq�U�������V�{F��5m��,�?��6��T5�֠{W�m�V�_�C�1��*���p-)��o{[ε.KVzOM���ɵG_1�_!
�Z{��5���Z뾂{�=X-��_�������,�`��\o�M�&��3�mYd��LX�&�H$��G�����W4�f�m_���u�6tπ�z��UsK�P�n�FG�q�gѦ�__�oUd+�j2�� ����1�t]����n�(0����:4���lp����yq���eb�Vi\�u}�6H�jy�h�U�hM'���#�v���R�C��y_u��.���A�6�ngQ��ߪ��F3���Y?�uiҀ��=����L�p%zH�,�j��U���B���ҿ�wԼX�k�Li݅�����j�Q�k4����ͷ�|s{{��v�"͖����7w�=����o�*��?o/�2���]`���؆�NM��]�T��x?���Y1}�"I���
��c-��O7j�6ڨ����/a���ӿU�=�(�V�����=�lbe�=�A�{U4w7Q��N���]�a��(�����4����$؃_9�T�F{)ҽn�1E����{��DY����m����1��˹����IPDE=�>{�H�E���C:�{��{��r����m	׻�e�vS��Š�t��p��k���!)��jOGM��W�����gՀ�jU����G;�0��߇�%/�h�r�#����h�~��Ne?�~-�/s�Q��(N��:�z7���أsj�P�3����R�pOc~�G�2K��>����'�`>,���G�hO���f��{�%\��==YDa�f�"Z��uZ���1�6~��9=�d/˫��p~��?ރ��뜪���ڇ��tEbD�Y���h�-Þr��lg��+�V�]�{<�����%M%��$��I��ne鲅�_=W��^T�ۑ�9��w�9�ӝ��ի:_�C�Gj+r��(޳�W���*���+Y��(�=Ka��1VI�s�����G�l2�nOߚ�g�Щ){�&��d��
�}��!=�C�Z�D���q�{7@�#� �n���a�^[��~��{�ٍ� �cN�=�v�ϣ�[�5r���u�s��ˬ�}��1<ԩ��eXu�f�R��?�;��m��z��e^|����yA)sAQW�c6��Õg�o�R�j7�Lt���ҀW@T�,����C�
�y��3q4Z��V����h�Q�,���bL�A>W�����֭�~���wK�͓M�aLD�E�,b�(wA��
�ej(�`���s/��Y��jG����6-�"n�[��ٔV�RYX����h%�ȧ�)����7�,\ht��G�w�˼ R/2/�+�[/
Т6���ޕ�N+�̢;MT�~[�4��8L�ʮ:]�E
3����/yMt���l�����O�/�hm����
�n��0_�>��4�:��R���7�+��� <��
�~�#�V����	��o�߂�Ȱ�)$X�n��L��ꧡȯ����5̪-�D����/��ZB���W�׳c����Tsb3Ӏ]�4(�r
��q
ܮV�W�WT�V�8)~�������~a���_#�nB/ެ����T�J�F�jA��c6%*��	ѯ"z�&m�)���o`?�	��O��B�?_V?EPf���[[m��xX^���3@-����lS{��Z�2�26�-̶�-<�ۨ�%i�Z��U]�ߘI��N�~[�ni�Qu�XT'����OC�MT95Ipj~���W�Z��D���~�e��k�Z�*���T�ni��"\�ʄ�z��m�h!
]�W�T�U?���l��^�����c4D������7Qx;O�:��ߥw��+k����篔S���;��R���5�Skh���[h����m�j\�$��~�s��d��a��y\�Ez�ʬ:���NjǦ�ڽt9IՁط�_�������M��
�y�=����|�gil�o�(�,�T��<�d�ه���t
,�� (Y�آh
zH��	㢕���:��
xW��Ij�Ji���	�e��{�ԧ�T��.U�Ч�q����N�E�m�j��"F(��z.���~���{q�ѳo{׺
��Q����T��Et�P�&�,ϊ�����؋Hٲ��3}ȫ�����v��/�|�b��/e����p����T��\U�ڵޱYk�
����j��XуdEӌ��Qt�ކ������y��oqK�.�y��W�lI�"՝�|G5��GA��
'a�y�hޝn%RȖ��V��J�f�S_�G�gO�=��o��t�B��?��(�o�5á��7W�Uu�r�j����W�V����kd�:4��_�ǏT't��.�
A�۫�bڭ�M��]���#���Q����hn�ҡݶ�*iU�k��:�d�7YuԷ��~��@_����ݓʤ>y�{҆���َ"U�O����͏jG��[o�?�(|��	��gT�咽��y�VϹ�*kF�<��NV;8ړS"�V�O��7���BI=
V���ۀ�+��g�,�M��?~^�բH��&
¯+��(�"�~��Z���q{�'�U��Q��̢�"Z�qm���q�ڸ�(Z��e��d����*��?�����2�
5�jkLS���˹ں���Y�!>���&�=
�71R��Y�x}*�5m6�ۋ��-R��1�����4AQ�Km����/�4J���yE��c8k��:֩��2�ի�Q��P�K\=K�o��f����V�˙�TV�MX��O�^��U��I^�5�^����_<r5Ԯǣ���>����{����^�����O��UT��x4z�P
��|~wz����i]�ppl��u
Nz��w�/�z�8�����˓���zoO>��*w��bu��.�LU�E�������E������c�U���7�7���ir84M6M��z��?�����oʍ�r�IOU����.O.zg�>�jہ�&
������g[��!9jH��<���㪿×�ҷ�O�_��^6�}y���緯.�~일|y��i��O�vF������Ք�ј{Rv�o���ù�h�ڧZ�/O>��645
}�44�p���<����u車9$=���5�a����'��?��ޟu�t��������tK�~��'�x��
���w�����t��Z-�V`N5�b�Q"�x����rC��QS�e�\�p�bS��-�ms;ˡw�lQ�~�Y�[��T�L������OoZ3Y��(6�ނ�h��6s�T����������z4K�ON�*�y�Pg;
N��cH���i��4�`��#��s`�c���9p��\g��&=S�US�x���.}z~r��L�E寪
�Y��X.v\̴�����֛��M�W蔷Y�u�(�x�'gqT�d�r�OZϾ�:з4���x~��pUl ��x��}M
.����M��Q�7�8�B��
}]d5�ڜ�q�l�N��ZћZ�:�u���~4�k��7蓠�������45XI7���ؠ6���U�T)
m��	�;ۆ۱�:���8��@���T?��"��VH#	�u�e�{�`�����^1��|eZL��n���#߆F��>�y؍X���L��10Y��q�-r0�,h��j}g+j��ԠX������0Ȧ�&�6����7�á��~���M6�i�i���1�C�F��F��3E��6��A�6��$CHx�{k�DD��I�6s\Wrx�DI��5S�e�(`�/u�q3�wsTT%Ӟ�e��hz������fx�U\ơ�E14�J��()s`'�!f�X"��^`ѨN]���#�"-�&$�P�D���,�?�ޥ���l�� ��Y��Z8pS�;:"YfeHc��R�pAg���fƩ�B��Y�>*�P$��~�K�2Ks#y���P�U�l��١��kR�*Eʼ�1sS�ӿ�@�O?1��`���\�F��	�:�8_�16C{jM�2� !�A�؂�6�(��V�,���1?t`J*�;u�p¶q���!���%VB]�O$�N��'&�����Β2��V�1��􉃴8�_���J�}�\[H:w�5�69ɲ��t�_S\��¢�w)>����Kv�.e����t;Z���
-�.��l*�\�$����U���;=�4߇Y���O�@�]~:���t�E�\.D�����R8#��r�+dM��dӄ6�$�7�f<a�v<�"�)��B�u�Db�-���'
zۦUg��ٕ��X��޽6�C��g�o�Y��@���qS	�u�ra�1��I�%w��{w�-�ً��Zg������>z�*���
��o��O���'ed33���\��y�$�@&6���Y�i?���1�x��(,�w$�V)_dH�(��YT���h��+p���h���~��n4�;�9�f�~�>o�6�S�*$M�+V3�^��a���6_�?_�l@���:�����(�H�����X�WB��Z��F2�/5��9������d$�A�ox-c1c�_�NM!�C x�6@M�
�a��C#��X��^±6��#t�Y='�I�g2v�/B���`n��*�ت��"i�1�Z��#����K
k����3�P۴�2�zs�����Ͳ1���WW�@�3���0c��&��J�?�d�����g��I�"¶r���'U'��Y!ޔ��}�����c|h�s^�F��b��%����4���@Bg0���κPbά�<�`��i����K�^�j�#tJ����9�5x�_Gu8���	j�P�ʚ_�kQ}�[��^Vp؟�:"�ҟ��:#qn۟C�:�5�X�sV\8g�� CH��b}�n���f6�/b��'�1�Ŷ�F'�����tl��0c�M��"�e���s�z�*V=��6��Q���Ej4�z
r��f����щ�vzmZ���^Tk���L��!ZĐ/��<�n΁H̪x�\����3�pY/8ȃ�Յ���\X�D�,J@��[_%�����;$r���h35�.ߠn�Ji��a��V��E�n���D�T�3k��eKcoGn�;�2ͫ8E�<�-1��a����/z#cm>-��9�]fQu���>���q�%��+�\0QG=l>��1L}Ia�.�"�/vq���� �-�/��>��m�yi�����_�I��v�#�e����r��XN)zm�S�L�,�"�J	=\G™AU�X��ƻ�wGL�"�0A�=�(���@R,Q�`:�&��cv�̩ p�	�(|�N^sh�t���_�v���-�5�8xx�K��+o�BR��N��p��0V[l���Z���:W�g�b���̬�bo�%Y�;�������5�\I�x'WR��cq�	�.\z�*�Kl��T��ȿzQ��FG:v��E�7��Ϭ�lC��.����ܞxg��Q�w�w��+�,��4�Pj�'��<"�M&vp�p`�>Ag�CF�ӼI@�a�	�u"�SFJ[޷QvO�+RE4�>;$\g�]�d�hХp�D:llՑm�2J2�8%�j�'�-рNM��@���
��(�7��2ٲ�P9�Bc�_�Bw��c����&��NJkXw���*�ۨ(��C�!������+�����v{;��@t�5�Y}��Q��6֔��aM�Z��E�֟�y�����U���:�6�����ePRZU����m��{0�P�*�E[���}`���5ܮ
-�vՖ����9����Y`�,uh�暼���j��w.gh�AY��q�;�$09_F�ߟq����Nű�{��Tl��S8�����>���h8�~o�+`�����u�"~z���2#��:�3>�3�����k܎��0ٞ�w�,���a��!���Pq����:�Yc�:s�)\�!�	���:@e�I��8>�0��������Q����ԞU�#����>�R)�g�L��fT?�jfT��#�n} ��U�K�4Ļ��y�%�i	7���!
�����P��@k�=�l����x��=�m"��+��xBPV^`��M7i&��I@7أ}�=�� ��W*�c��,�=�F��C����t�0��{��8<{�l�B�:0��ń�(B�s�9����"FS?��2�n�fyL%�|
@oaʶyes����`}�8Ȧ�>}�5��J�f���g�|*idDg�E�8����F���XQu咃-��#��*";V>�B!���WV�|.�"�=�QV�{b�m���;��/�v'��tF�q��8�-;h:�B�R5���;�����%�0bP�Z�u(<��+T�!NS�ӯ���0��q�d�0]��F޵��`c�>�u�3�,�i��֕T'��%D��e	C �dwL57�ӟ�EŨ���Z�v�V�N�*�����sGq��S���$�RU)W�5���|�م��3�@`��5�g���v���l���M`U3�T��'4��@g
����T1m��YVOm��a�ʬ���F�;q�r���}~u��\�',�C��?�
��{weI��Bp���7�?�k6!��:P}��L��]
3��]�io��kF�m�^Z�� .����1B�l_I��}H8Ζ9�s�1^���qVa,��dκ�&#�tDLƂ�
���M�e�eqM�Δ]%�p���c ��κ`N�X08U�
#��s���3C'F��)�2�YJ�c$�Y�Y����ʈ�3�Y�:�E�GQ�cYƑ�MBe`�A��X��A�$"Ym$��D��ih8o��Q:��5����C�
p��ueJX�v	]�_},�NH�����Tn�<C��s
��Cs>���Z��q{�c��,�'�rij|��l�|�����e���9�d��} *�
8VmdK}O#��1߇��9|3܉2�l�93�?6�S�/�
��	-�e���wz�m� ���33���HC67RƦ��O�ò�[��a��1��ą����h�gt�G�?��4b,䏝F�X�ď4��O�ˌ��?���4��~���:`)�	�T���O�����/�~����Of��ƍR�̎��rۈs🥋�������Ӧ�fi������+��><��{y�	�������<7[/�2n�2x��?#huGp9d\�rz�0԰�����=$�{�yV���:P#Sz�ó��&'��;A��E~�@'��P���	�WO`�<��	�cO�H�k��ކ���4��PP��Q��>��8��0���Ev�c(�=DHYAMSl�dP��s� ����-������,bWX���[�P��ZZ�PBq�E�oO���O���7�~R#ڋ�>
��mhF8���:(ѱ�h�r�04cK<lD��G�%�oCnFjA#��^a��'�l���ɆF�0�o� ��ћ?�c��F�����S Ό`������ظ�������~�u��Cg.2�s�KSua�cw�Q���#�Wc7�<q�8��:�D�.�!gy���X"`�5�L:$�=5�(th�x��8��25]�r3�^UB���zni�[��N�癇��"�W4����qU`Z����6��F�bn/�f.ϣ�O6�T?r8E
"b7�i@Z����m��T�djC�yȯ�-W�4�»ҔhY4GOz�l:@�
�=�s?J��!�n�@��ݲm�_y�͞▙]�;Z|�a���+��������^
"t���~CCz�4ձ*:&���A
r����O�?|@�����7���
7o��ғK�_��
&��CKGH�w�M0@�]!졠E�v"n��t�w��#x8C�?~���	�3��ϻ7�l2p����g��gvޔ�3���[é[é[>é[����N���΄��=ؙ�x�_>g8��i�������L}�? ��N��4�z��>w���|E��ͮh�Y;��x(�ǰ�X��7�F<�F����$&�����$&����
��Ҿ!5b-�!5b��!v�g7���l;�&�a[�W�g7�u��Jdz��Y��1��p�vޚoq�rb��<m�������F�W9d��T�xF��=��B ��h0v7���6f!���o=*y�E���Ny�
1�ة9�2T��M�Fp	n�=.y"'�~)a���)�"�F�b�\��͐o=�G�{I��^B��Ԫ/�9^�2�0!=0��ya�����m�����\�0�l���x���M	���耙H����Nv4��ȏ��fjL���xPބ��s�~V�Q�D枃B����\���!ee6�Oƽ��hP�Zg�
y3�Z�d�
�]$b;�'���%������s��x)��
ʼH����q�Ĵ/�<���I06l�4x�M&V]���OyGO�`���1�ٸ��,�9������T��'�}�sS��\���� 8��GD�Y�!CZ=< �����$X��* eI���.H�C��2P=@�2���h/|�7tI?$x�	P���D"p��G�Ύ�����I�V��F�ɕ�H��m�z��%������R�$��
}}�$��d��f��K�-R��Y�
Hp�,L�>�Й|��.�eک�ۘ�0 �׉�B�o�>��v	U�f�ܒ
�P&6F��Zp�X�܎��T#�O�J�g0�H������z�Bo�Q��=�������*5Yr�)^w�&<�h�ͺ0~Ѫ�����"ʡUSd>�7�"+ƌި�pW>~y����@��=�#�	cs'��և�DK�X!
p�GXe�l#�;<�`Q{(aC���܄��O�;�wR-�*��O3���s��RctG�i7��f�ܘ��w�������MG�HAe���qZ�pbZ�Ev�Q���H��C���"�p��&�B*�ݤi"L�?rPH�K��Y���Q&nA1pf�
:�˔P�;
�� ��^HTx(�g&01ƃF��W�L�39A�b��znE}�hI�_�%��G�
O)�,��d�2����κ�_
@�]h�B<{�!��!�x8�B�g0�!�Y�N�j1z�;k�߆!�!�i��˅�r,��.1$�((o5���w�=�B��{���f�Z
�)cjtLP�(*�/0��Hy�ȫ�s���q"��`d�~qU�C D	��e~"b&L��/?C���P�$�\58�m��{(���8{���'�sc�0"ᵈ)��[��5GP񬢂���"s�d����R��_#�D��b!0W�q������K�h9��g�8%������\��}�ݢb�3�h.�/��u`HĘ3l�f�@>Qx�״�HD���p�	���KU�&m�'�]�p��g����&��`�k&�B�T7Ax����b&��@�	� �*ل���-|������
�6.��c�Iڮ�}�u���5�<��
ab�C<���ȝ�Ϲ���(��v�y�`X��܂Μ`c{�B�!�%t��Q�X &@L��9#��С@PF�ZNC	�9�Tˑ@C�o�T�c�'T��!�+ط>ͧ��%F�=���o�\\�/��;��-�1��D6��z�>-\H\Zo�{��,����ZO֛�G�$DM��#\{Z�	c��k����+QT�"&�!H�ˊ���jD
����`��&�}I��J�Ҷ�� ΍,����Rm��J⑎�؅c���(h���r{&�P0��f���U�c0�v
��H�Y���v6ˮ|�e����5}p�u�K>�p;M�ik��	���3�7k��)���,�v8 ��md�.�z�V>�=:Ʊ�vL�md�u�D�H6E���0[��&�
K%��x#�T"W"l4{�EoQ< �Eg�^y�(F|g�+/��!UÁ�C�+�nj�{�h�.�Q�w%�La4`*�B�,	�|07�Wa�ӎ�m�P�U���@�JJE��L�[C�ȾJӫ�S�X4��(W�Ae�m>t��`���]y���t�_݋\�^�oVH�トcE���:`ch���}B�u��-�8��H���̶I@�D���d4#��/���D	����;�D-��!�(Y �>
�>t���Fa���Q n���9��IQ�S�c�}4C���]ʜM���I��l���=xc��t\M�
��@�XԚ�IDCD�+8%�N�FI�^%1ʣ0'��/y��~��xU\nk���Vf��!8�P���x6J����)�m���)��Ѷ��u�Y�:�;f	Ñ��U��d�mv
�1c�l��
���bĈW��<CFmd}�O�`�!��`���.?	3��i�w���'=��{gȍ��p%?��w�_#�+��hu�(��W֧L������ㆣ�e�K%}:��IkF�Wb�b��#'�l9��D|�n^���SG�!f�c�X���=b�'��U������!���gڇ@���U&>~�C,^ <f0�00!AQ�6nc@�˴Y��8�B٭�3�$.�7l*�O�!�1�+M�F� O�^%hO1Ş"o4<8
܂�+j��z^�`z�;�;�x.���n��œxnf�O���F�+����
�����UcJ`��I�1�]�	�'�b�Ii�l��e���0.���b�/�䣃� �)�aʜQ��8?��S�:��u�<hq�/�^
ߜ��,��/Q c�>£�J8b��gz�&�*&����wh��2ZZ�,ћb�+ۄ���l'��q��v쐚��P���c�H5����� v�w���f����!���8͘�"3aLxM�B��H^����*E@Jl�dA7[��������▐����f�������0ڸ���1�&�~	�,҇?P�Xi�U�P�Ѡ|�Xt`�psv��˯A�`/^�%�|����U�Br�J/b�SK-$D�z�|�lV�r1��t|�s|����8?e5��/U1����G�����B��&ΒS��e�G-P�Ô�@Ǖ&q��!!����-_�P�o�;qq��(*2լ;��G8p��{�X�dEJ5�Q�=�`�3Z�y����p��ݧ�AF�r��[�{쒐����v9??o����!`8�L����	��i:pr�0Nև�K��7��Y�y%���3 �b��U�.����&6�SZ;��+�&T��/�+5���8d8��j�Y �K�P2�mw7�-WAnX�5'���q�
z�7l�@N�#
^�C<z!0�3���g!\`���Hi5%�\ca�q0c\![��-d�ǚw"��e�>�����z�L���`8VBJՇM�A�κPzmiD�Γ6
�s!�P����HBg]0�I#@Q����{Wzu�X"JB�}��4W��$j�l�_>\��WI�:�$b㪨c���h�1�z���0�u���
��u�'�9��i�D|��I%��HQ��AV\�N�|��s�R�j�@����d}Q-q����?���'!��`қ#�a�Kى���C �h�<֔��>��!�ݫ��₫��`����I(�8��b�I�ye2�7���3l��:`b_�����݈��۠D/�
:B�=py��o�a8ټC�y��`BiK!�%Mq�!ܯ�&�L���f��s�>gTBf�����C�p}I3��5c���f5D�bHN8-L��wU�I�P�;�����X�[4s�E	YI��A�iE�7��l)�E�Dt���a��ԁ����2���Ò��S]�2C����&�ҕ�ŵ�V��;�N��K��ܧa^ą�����'�B�p�P{�}�.�~b�E+	��ߩ���%�����o[��&B)5�&&Q���s+�Z	%�Z���-x���1%�J�?�E�xD,�l5,m�X��q�k�HOUP�$�`�0�+��7.j魎n�LX(���-�
��YG#�:��6���8���E�I"Jz_�xdh5�pr��-s�����L~ԡ�_;�آ�5?A���0�ą�Q� ��!���
����6x�l�,YxW��{�wr�w�3�%�H�S��Dp
����}�ˊ>���̍���,.�&��,��`��v<��k�Z��OA�\&0m�	XO�&@��X�����%�FnQ��q���^`������F܂�K�)�6��)Ěu�.ڴOE��]_���e���g��!d�N��#p����$�խ�&�A+�(�lIr������4TJ���IK9U�����[A�tT�Z����C�Pڀ�O��:�Z_^�߃���v�����K�8�@\*
���g��#��}���)�?�T]�xRN�e0�{pP�r���t�*:u?�ʧ�0r��(ы���ȻJ9�����Y��R�ik���51R���$zZ��xk'�����, �!�M7!=����T>ۉ w(�;��p���pRA����#UYbͮ�c��\װ��ͺ�h�Yѐ`FYc[�W�3��zη��#�]�ű�κ`\F�)������`>8C��Fxt����څ��:���#DքO:&��Äa3P��\-?L��G#8o��
��mj*��!��EMf������ǽn�K��!��#�}c�V0��7N�$_<��Y�g�*}�XV�(�g���G���rz�킝�K�2%]v�t
&d.U�"���W��OO�m�(:~
.J7���t.5f&���i�<����5t���'�)n�LGf��V�W8G��O��$hL�Hg(�~ybS4'R
�c!��$�ɸA}g��o%q�߼��nG�:ag1a����
��Q�Dz�1�D0(�l
8��ə�qN�b~��D�ZҴR+�����b�f42*/�P4�)��.R'b��ʌl<�a6�X�BO���ߔ��;A�����i��}�3��D��b���k��u�a��mIϝ�S�ʵ�+�.@���&
��!3	��9�,�܍�2y�0��Kƶ�D��:8 ��T����C�Y�&�(��2��EN�|��%�"s3�mF7#��!�1��GcFЕ		��ȱ����!#�*���J�3��R
��U�C��U
���JF\,	��
��n��w)Ј�K�p���&��`|��g��KJ�R�R@&‘Y�Y_�?"ߥ�M���,�(�R�� �W#P��ex�DpF#�"Ea@�C�ŵ�9c�VQ��M�>�A��y����y��`V�:�[��`�^M`�DF:���H���Y���S�U���>��)�.R�@	��"�D;�&p]B9�Pto����ye*HLȘh
�
j�ѭ�L�O�<�1�~t,��h%�b(���?���d"��������O�"7f@�OnyA#B��rj��+NJ�6�!�Í�lc��B�e�74�J�Ƹv�2�M��fO�J6�S�\+}Za)%��N�!x��;���t�)�R���)�(d�C�
���υ0L�)ֹO[�C@yGsL`^�}�'���� ��b]�7��T
o�&f6��r�5���Pb�C,�j��r�
F���R�s��9[�jcF��*
kK��<9bجl>$4D��. ��z�y0aT��!;~bn-Ԉ����t��f�'��W�,SB���
�jGh3_���4�%=�4�
�b(7N��TdXz�������pz�7d0}��OpzF+`0�\��4�9��r�:$�|�
r�r�=_��ڥ�k/_�R`���Gi���XG�v�N��=�RH�g0]6��
�<]��(�2|C�D�!�9ڏ��(���4�aT��P1�u|�_��p1���	���78t_��S�C��ȆY84�R+��Y�(�'��'��x����X
Q9|��뻢_���t���=�c�ծo��[�8�C�M~V��C��̫�R�� w(�&`l���;TBc���)��E�L��0���/�	0���tNmx�s�]��sJ��%��4�Q�n�(�J�W�ݝ���A_S
DS��$����jK�s8q����D�X��ƈ��'��pb"P[R���w��HM���Ђ_n��ϧ�9���C���Q1l�b��Iz3)d�y,N�;b��c��Y�i��?n�k�wSI�6rƲ�x�'��&1c}R,+7Q"x~٨k���y9��ݬ�yɃ w(4/���.�X�eFТ$
��
a�=�l�GM`_ު�3��%D?ºVx�x�n���lm��@��.�3¿3*�W��8�)˜�`G8O.�ݓ��*�B�E�!�Z*�"�o�?xw,�=����@�8�eߘ;X��F��w(�@\q�'յ��4k�`���������*��̑ΜP��%�.�(i=%He��\i�3�ttʋ[�
J�@aϭ����`�(�6��-Ҝx�hY��`+��*`[�� ��űo���+A��ؒM��!���o�D�4E��eN�iV�C�:t�(v��
%V����F0 x�S��"ۄ_"�#\;(:ۀ)��nA�D���B>Q�g����!U��tz��Zh��n���S����w)N�����w�I��U
U��ې!��i�_RRF�\g](�\��ɸ�Y�sD�h���Z]����4<��Y,>�i[�[�pK���h�/����g�и|�ɘ�R��'�f��y(0��,��ˎe5s��X���8�E�q޸>4G�m��'>!g�5|Lp��3�<�:B�Ii�˹D�7:&���/����(1�`�	��̆T�c�0����}�[×�Xh�`:�1�M)���>�f���;cTo��3��|G�r�4��ؑZ7r@����$�"��QH�.$�PI��=�z�s9w8G#>a����a��*>ćt�3�E�~�(G�C$�����Fm;��:T�w�/�d�B^���S�QP^���U�*(9�C$a)�^��!��oB���!XaA�����I�V�u�F�G���t<��,��V��'�ʎZj`;h�p���%Z~��\��rխ8�E��m����#�H���
S "���q�[{�����
9k�j"'�6�@t�Ș�;>�������y`�r'��j����?vq����,z(񎾬h��],*9\T�F�i$zg�N<�a��o�yP���XM	�;|��.\��DP����Y8�:C	a�)gw���1lN�5ut�ܻ��=oI	�9��A0�u/���Dm���|]~L�Yf럑�=|i����5�yߑ���{��!�q���/25���H6;��`d_~��\q�K8�`��"hF6_l���8C�֧�� Ǘ�<�~���5_
�#��mB`ݻ�z�H9sj��äx�L�����ϪL��_ѿz�괩F����>`��ޓ��
:���
��	`�F��hR�[�3��
�D�l����0j��nc���N��=i=~�}��M{�Ѝ��Ӷ�$��V����{e`�~���頕�1`F~�e:ja�����N���󴕟ɌR�V~�&����;�6�턠��� ����|j�G���F~Ѓ�v\�p�^���&��>>M�BA�����z+�~�(��a�)��|�郅Q:K�p��4n[I�z.)Ȥ�|P>}x�6��ϣ�_oy�,/2�:��
]�8��y��
��o��(в���=z���EtW����Uo�f��罛^��o�Z(�����g�e
���(6�~������ы4[~3�N��y�ܦ�?o/���}����X5��^��N�»H��T�����0k�~�m-�Ǐ?zQ��U�����Y��+�0�Ey�����_=e��0�p�.J6e�T�����jӴ���*�'<��Í����մ]��_PKEePQ�����D��#pip/_vendor/html5lib/html5parser.py�}k��6��w�
FS{�ٕ�Wv���۱��?ʞ}T�q�r$H��Ԓ��J*����I���=Q�<	4�F���htϋ|����պ ggQ�\�E��e��+r�~��Yr��I���u�L�9K��qZޛ�U���]�l��2�"�l���lI�x��e9����$���=^�ڮ��0&��Y���UY$^�����d�O�0+���|��3R�>M�G��$��۸��!���D�g2ͳ����o��"�)W񔼼��xJ�OG��$��jE��?�R�x12M��UJ���E$�%٢~0��U\�,���zEU�8���,^��}Q-�7YEE\љ��'YU7����ezB�T�2%��k]V��$��yU�9������m�R���
���~=��?���!Vx��}$��(ɫ/S��n�;�w�ތ�#|<��ӑ:����>y����I�&�����Ţ<<�F����Y�#
u
�qd%6:=Q^D�$%�4�$Q~�/2�"�����&�!�#
�E����R+�B3@�2(Ly����d��S�:�~�)���r�,ȆMxQ� t�g�"v}���՗x�J����ٳP���|�_�V!�������
�==�g�gOW�N.��CqO��=}�^=�r���S>�h}�狪Z=x��l&�'��X<x��w�=�����Gq=��͜�ӯ�{����{b��J:��51Y��~�~�w�+Z�4Cߟ�����`��V��%U����P�������r�5�����+�K8=H_����?��R5L��$�OZ>�c	r�W�$��OϟUr	��e�X<߿�׷�ޝ���������o�>��]\+�!���
��lF�9���:��u6�m�/|}�
��D�
>��,#���!��
�QBDɟ|�L+�|�nb�ɽ��'%ݺބ
O�rhT�O2���1%CY{�$��k>����n�8C�޳*�^�j}�L��Z%>YУI8��y�ا���C! �+j����%���T�8�)H�l�!��c�ϣ�*/��<�R	(��$�CllR���zޓ,��hJ���=~�gt4�Ӧ��k*�f�;��c�
*$V�ƻ�x��b�"/�4�L��F�#�.b���4:w�	�M"X��(�EM)�?�zJ�E�TE�^\h0$sj[�H}��1EE����q���sRt�P�E�i����*�@�9Kp8#��$��S��GK���2��"J�EID'@�3t��D5]k�x!�q�Vst-$��Z�UE(D|�Za�O�PAI�1��6�9N脱��4��Ww�=����IQV|��Yua�Mt�k����>��E�����L�zsJ�aþ$�c�KZ���=���8}�3�9����C6t�;��5H1ι��|T���Pl�(L����	dt#
��#t_�(K�,�EBg%[����H�zK⸆��E��5cNE�0��1B��Ej�~͝�_C1JF��l��,HI���b��[���a]�ѭ��:j�F���	c�ᵲ!Hڰ`�\2����Nb�Ι�"��}�SX�yFw�50|\�5�S���뤸,уh�&KJq�Hy���9��U\qQK�+�&(6�{ ���X6�u�ł���j@�%#��(��Q@233�'x�A ���b?���x�Z=>��R��r�o���ђ�`")N�J�m����SW�n��
���lBAV+�0�{:8'���?ӭw��S���
���r�]\�o�$]�@�*s��b�.�Q�jK���h�� _ӭ��)5��Wq���1�t���4�al�*�K�U�
�/�V>������U�0���A*`�{U�+���db�����`�4�@i@A�ya"�
�dY]㒱#*~��6c�=|�f����U��	�'
��p3B�/�іb��N�@Q:~�d��y_�}C���	��xf4tu�9}�y[|��(ô��^paU���?E@��qF���T(P�jf-��i��<|:`��g�p��ć0�&�Ŋ��Ѩ�p]��noqV�ty}�e>?��F��+4Raf�Vi2E�0K�;�M�U����HC �і��/3v����Y�ҍv�}�)y�>�@y
d^y�p:��*��~��gQ+s��Y��S���f���R�e��1;��^)��ϧ�d]��+�0*I�@�r��ߪL$z,�s��V�b��`��[��Tj��[�{Q�.�Y��Y
�:��g]W��Vˡ��g��NǏ>K1�z�����]͍��
��
��	���eC{������-�>6)�myc��,9T�Ig�yT�
Z�S���,��_�PU
qb�-��S�
��x{��-x�{K
�r�x�V��h��LSi�л�0`C15:�i���TO@2�ϸ����O$-�n��t���-f��"[��%�8��i�B\s�䥇��>�����['P���
�:����j1h1���Nr�ގ�-�;)�E[2��C�����=?P	�^��������U�� *փ���P�(7�AT�m=Z7�t�:�}��;5��(=�d�;5�J:}��U�Ԥ*/�h�WW�4M6~��H.�X/ӼD»ށs{j=�^f�&%��Y*|�mz�QVx�'�1��`+S�%�C�q���lM�覍??3�w�u�1�_U[���DߔJ�ќ��ճ��~�z�ZQ8~�v.^H��b�c¢�bH�XaB�&�͆5�ICmO1�J~�ڰ�$s_{�K����
���Ժ�ˢ�{��Z��O!i:fG}ʁ<|�Am��,*�s�n�gp�~N�I�N�'�H���8�
�$�z��,�e��o<�cd3Pa�n���I��3g�yBf#VO6��Ѡ22�q�&2��E��^��m��K�=����8n$pFǸ�9�)��œ8���r�H��!�y�����;���L����
�9JLvq_�Ϟ\�8��V;qė
?�a'��q�@v��|���F�E�x�8�,`Е��)�DNT���1T�X���|���)�x����xp�\��9�9�}�`yZ�=��d���__\����uY�����g2�^�w0����י8�TI��Q��AD�#�'3V�XƗ�If3���NT���>�o����QŽC��3t��WTBD�Cep�0�0~q�}��Cm�:��>G���ըu�F?#��6X�ڪ>����b5��Z�kCa5`���k��J���#A����q�i�:q[g���t��#�$��A����?Ô~�]oK�D��!�2/�tч��)�N'��
��ts�ٙW�2��3ov�1����C�ZA���5r�nPT�$�'�]�j�޾������]��}�7�+�{��@��i�&��<ϫ�2��O�O��,���"_�x�<]/��� ��4h�����J=j�[q��J�������'�О,Ps5tF�d>+����g�7e��<�q�a��/�tf�x�&~n����|8Qkj���
P��dz���2�Yy���"_�3��r��_n� ��V<>x�Xź)�5��1��0/��a�T1���#��E�j���
�8�dk�h���vu� TӤ�q*�|�l�=���!҆a`�
���o�oAB3����Ԩ����;}����iD�>?y���󿟼��	n� I��r��bY�kl�x�`xM�kph���y�O�\'Y
`0���~�Eo�N�Q��(�	�p>ؖr��i=���f��&K��i���o�D�	O���*.��/p	XC�泒;����͊�T�`�J�`�<�	��U���QtI��{��Q�ϐ�ȣb�YS�rS?�qZ��|�ŀ���v��&��J0J��<
��p�DϢ����Z(B9��>��9����)�>e�����Ͽ�U�V1�^R�H��!~�w|���k]���
��Xk�ֺZa�γ3tŧ��	m��W�:N���'/��	�`㮓���xqN�5������C%c����z���QZQ�sO�- p+T���>���2��~�y��y�X�v�H��`Lp�����>1�;�F,y�E8WP��UnvvV�yEɑ.9�B��a��w	�=?�yI��Gϭ؃C���d@v_�б�H��J7���3���蜮�+����2Z��#C��)G��]^�&3T�@��[eCu[T	�I
ރ��4߀H��5��nL�΂
Ž~�x�}�� ʯHQ$��&nr�B�=~�C���I�p�T����BZ���X��P�~[ZQ��"C͛�
�<]���r�SZb��SJ�|�gT݊p�)s�`�I�����-2��*�WSxCq�k��1����
�4)��4.�9-�Q
�ʱm�F#��ZA�H�W�.@��"C�b"aЇ/?li�����Q�d��a��KJ�����`�ۂ�UT̅W�V3'V�!�h�M}�>Q��d�DѡM/�V��J)CUUl�[![�@�,H~�Jq�5A����ӑPf
G�`�I��Xg�W�\|��-a���Q� �p︭0�K���t�SR8`:j��I(
�Į��N�!�7ӽ)���:��t�J;n��eF�@"���F��M�%�nX�/9�$W	J�*O�閮�l�/�nهm��7H�߼~=;��N��NNV�j����`&�q�'�R�47�r���g�ĔW+կ��<���QN6�ʸۡ�V�D�������򠬣$�9ۋ�{8(��Q�eR�-��4@��1�����Ķ7Ԯ�s_W�=M\�6�,���OCE�i�b)>�
Μ-5��4,A�w�t_�r�'�W跍��Ƣ��m[�R��bA�؋[�P��iۉֱ��L���u�	S߰[_L��F��s՚*,�]Ea�n�O�	V?��V_��uѯ��tN���B�y1p[��C-(���V��L']�n��}%�hp���Qnm���e�Բ@�����b��R����1��:��+h��\���e�%���%�)���JH02�P��$�*7ʬ�c��+9�Ⲏ��ԙrΈlS��z
q�<(�tI�����	wt��x�(z��w�<|��уM~�����*.�9��L�d���2���"�hH����^�$��+�S@)�"i0&o�ǽ��X�4��إ}����t��GCO&��9N���^�s
6_��՗T����}|Yv�c�E�U�;�����/	��L����
#1���L��2�������*��G�4�`�{�~/|�ؓ����F���Hi�r� ��r9Ya5�BX��|%����$�=*����n�`p���՗�� i�%.�޿�1E���J3��Wpb�d�?M����?=|ttT�)`�����Ҕ���y�P���-��P��@`&������ݤ�r�Elq��PjԜW����@r�ԉ�7O�������ݹ.�NfE<�9v�@�ƪأJٯ���"�Aا.jGI莦ׇ��"�����?=��Q�k@����D��<	&�\�&�n�yE�B���-�_��i]���Z�1W�b�A���#J�o��'���sbܓ�"�G�P�#���7�UJ��E���8c��E��JΗ���:@�\=z�>ě[��j�&�u�1F�fFU��O���{�p�=m|;�؁0v!���eT�4CF4<��Ku�N��33>�f���-F}���]�掹Hg��tv�p�M��/�j��ʁ#욆���űqZ��]1:wIz\ŋ��6�{�u�����I��;7H�sV����~�V�c�0/�R�qs <��Sb���H��bP����|"R"$��u�{8_��
��Q�p��u��.Z7`�ع�>�Ȃ�e Vv�w�1��߈�`����Z����1�o�
�����n�`�op8f�?f�B�!|�X���=�nlj|��c��,�h+�����t���.���Aҁ�^�k�犛OVx�F�2F8c4���0��i�}�{�,If�*�p��r[S�4��{����F&\��c�Nߘw����&��ʆ'�jg��L���֠�Nԥr82�0��ȭ����q5s(�Tw[s
�t�V32���W�i���L�>=���5=���l��Pl�
g����;�]k���c��rSQ��,T��`9��8Ϭ��=���c�]��g{g�*G5�`[�4-*��u��t�%����b~Ħ��Xh�~�늝!_�tM�
��A*��q��x� 2��q[��� �9q���h��6�1x_�WR����WyW����)�	N�q���[��v.��%��D��n�͔����0�O����gEeYLy�%��!I0g��C���tB������QDΝ�Yoc���?R���ƍ¨MdƏZ��z��͸\�Lm�ɋ�r��i������[���ъ�2:aMR}����5%�7�4���	7hd*���j�]��z8�IR����!��q�_m�]΢{|�����+,�A�)�X*�D^�DڔQ�����Q�u/��w�V���UG�j׳ۺ�VnЏ�6��j��O�Ԇ��ۚ����G�-���33�Z�pAq/UMbpa&H=�%�qa�Y�ʔ��k��!C�0{��_qS�g�y��D���	E"�a.����
� ���Nd��%m�ĦoU�����v�χ7�vV�O(�p�0K�%:vT	�R�й
X-������{��V�O�r�$�D]���ӝ�/J���B�_S�V>���8!)�Y��+�C5�9�Wh
=(�R��W�tz1��g�uY��8�P!K"��H��Q�	M�f�أ�ܥ���T$�=!��p&ئ�3&����Rn��2�PM���)����\'i���$�豭�!VƬ��OyK�k�KFޗ��>g`n���\�AQ� z��^͢�`�<�/&�$�Y`͚oJ
��(� 
����a�>P�8rr3��m�O�:է��P�K�����s�5]����a��T	�,Z�P=2�,��*���yXPg�Ep�[j��$��z��/{�!��q���T�_nnj�x���'|[�wt5C��Ђ�qN��/�1|xl[Þ�%�ˤ ����mĞ���͉���7���Q�K���Π�^���K�k�#T���t>�rg�U����c�r	BX��g���-W�|��5��KBػ�lW����[;��4Fq�Y`*#HbP��1�:�<]��,�xNc�NLu(�P���۱���hZ�?m�%��N!P�B6s����6`�#ס��J|8�P��D� ����8�`s�X��QH��|�.�>����U1$�kH���T��؟ǞT�XD�X���'��4��{�\Uu�uc3��?���l����8��
��Xr��4�Zv>��%:�����&��+�۸�4�M����
K�6�K�iq���M��#�\6!�e�:��GO�Ґ@�Y��Ǔ��b"��gBdAp;�⣴S_)�x3�_�]E��ԄS�$f�K�*�W�����G��ϸ2��/#���A�.�]�;��"�s�A�S�{BS�1�|��w���^?��W�J�(9���W�ȆJ8�>"�r*�$�m`�bm���� �F��4)��1'��pBӮ=���|zI���ḉ3Lp7��ӥ�'Uƺ��!q�!�Oܮ;�1��(��3��l྾��-$�V�����>2�:���Е����>:�<�y��dYY�i���b�Q澅����UocU}ц�;*��~H?U�徒n*��.N7�Ā�Q�NS���&�@0��o��ʼnmD�h��;E���x�\�J��2Φ6�z�1aQ�rx
nj2��3A%3��g鵘��[�A�L�Ӧ�����1b�g;�B
k��`j1�myC����ʐ�1�$��`fCq��j��3ç�f����͏�C77���y'3s:�F�~�rCt�
U.I����vS��B�ݧ�Я��r�Z\�y��3OM�>,�p���2��s�Sr���\ێ(������B���Ӕj���U\$T�<�uT��-33}���+��4 ;��o����oRCN�����qtg� �J�4�םk'�PM.�7zNg�)�8�zqg��$uv����}��9�^����L�m���oiBg��|nV��%�%b6k/?3���	Z��^�j9~ZA��v��˻�CԶ1D�L�1�ޤ'�(�?a]߅�юE��0N���id��"|@�ͬ�6��lV@&A��䊙�\ZGݭ��]�X�Zw�V��ꗐ�1wW	�w��6�{��wn��K����u]������b�O[�H؇T�7LE<'�_91�x�A<�P�@�
w<>A�-|~ �w\f��b
����>��z�6Q�.~��گ���;Qwk�w.�։��o�v�9�蚈Z��k4Tu�ֻ���g�g��f��p��E����>�-=}?w�����Jr�����^	����ܫ��e�����(�����s���e1–Wꋶ���9F�`qi���yE���m\�{M�{��{C��m��̡���‰�,WwKJ��]�4�^�?����ذ_�a��vҲ�o�(bE��,�˓�͈��z�z�?�q7`���}>0�
���Δ�f��)���)��$��.�?`�1/�1+�rRf���E'�<�mD�R�m��i�O������ޑ�Pn��֓;����%�L�h'Gr�P"���f"��91���7�����V��zk���h��7�>�=��AP�,�?�|���ߔo����xFVt��1�K�&�88<�q��@�3@����<�1q�̀m�5�SQ��eV��Ax\�?Ҩ����֛���>H�4>'�Q��F�c>���'�Z�k&�6�\U!��J���!��� �Y���Jt7<�#
J����{���%�n�bVR�bI�^��������zB�SS|�?�i���X!�P�T�^mm��J�M~'3�j��m�Px�iQ�h�5s��rA���ʪ�^��Ч��evͫ��8r-�6q�Vo/�X1�5���׹`}Z�xUY�4����i]-�`��6�\��w|0$�/�D����!p$#taxbH�0:�!�z
���Axn8�-._!��~�l-Z隬I��>Q]������0����4����˘�َP�t��~(�jGH8&v�w'8�ͮc"iJ�̀e�5�1|#�i*�v��>��������[�X��t�{�c�3�FXl��=�ݽ����u2��x�����?>�^�`�hC$Yd���
�E�b��EI���ӗu��Z�ʻ ,����Hz����A{��8�:�.0ds}�\�ȿ������L����M�u	�M��[�����յ��5���n��ʫ�otM�6)W)H�e*=F�u�����s�2p�/H� 1�����K^�W$�5p�d>'s���	���H`~�?~�Q��OS.1`�Ԕ�Y��?��4��b��#d�~�յ{��۷: vW�2�����G=Qg�G��#�b�~�s���„���g�G 
�ٕ���oq�/�G�3���Ϫ���j|�P��.����M}
�� ΖK���黱$5��aگ�>��6�4���|��q�
����5��n3Ը0�����
˂���@�%�B
��]�߁�sAJjk������\�ByCJ)����!�������-�/�n�-�y@�JW4>..i�)�Ǿ\��bDW4�:�R���!0Ȋ�LV�F�x��(^Xm*a��W����6��C�㚵��D�h�̌���K<��()(!Sn\q��#���pO|�����=���c�{
V��g�ֺeq;��8�֗pOR��<��H��7�����eH�-9H�徣U9I�H��
?�3oo�,b���Y�J���{x�v���o��6�cX�vk��vڌ}���*����mp���X�c�f0Ku7=6П֩Z]�w�̝3'7Q�2M�3r��9vg�
����z�1����� �C$�^�@�����-��b��ٓo��#������4��n�ڮ#��u��H	a�����xN'R4Θ�Ŕ���(Ny�TK�0'㥖W�/uC�Y���Udz܁��A-�URB+�|��o�����F5�DK*��.�^��p�t'����*��i�5�c��^�k.�<tV{�=d�iU~}{tϚ�ª��c�=_��������P���Ә�[�Yb&c�a_�3�"�nj�.��1Hv������((	"�ɞ���P�x�F�HPo�WA��(�ʢ(J8��F�I r��5z�
V"�,�kYPعF���b��lߦ��(�=V��]�k���Kh�������0��-��6ˣ���W��)9�$����|�b������g@�0[3��if@i�Ϳ�3藪�R�M�;��b/�܌\e���Aj�kZL4 b�H���:\Er��_�K<�S)W&ǥ�r����"&�����d^�Keṗ�5Y6���j�acP�n���*�l?�<��@��n��:H���F��2o�FIrJPp	����l��N$L���ܛ
6E��e|=��+eM���ص��t���p��%2�R�˄3�f�O�g���j��ȢMd����ˤ��ҲL�B����cC�U�t�(�mt?��Y�8��WMa�Z�q�'�J/�_l�������%�W���yY��#���W4�	t.1��F1�U��0Ir$,���@V)��7���|K�}�6k ::�<#�$�s�w}�z
:��T�L���L8X(/��(F�ဎ(,�^�Ouf_}�W|������$2C��iM�q��9�u@��tU!�8��,�}�<�*���>*�w	@�C�z�;n)"�H��#WO-���c�]M��5���%["s�̗nC�4�[��s㶛ND{[H����'��
�H?�����oγ�ٔ"6o�(��82Q(�u��'H�%(�L[��A�
8�Kf��d��kp����8�sXIP����':i�z$�'Д�o��+�ɪ��B:'t��^���'p�M�*f�r����vEdG����x9�/?���w�0	�cVUn\Ֆ��� Lo����
؇��ϸ��l�+���Ch�q�v
Vhpr�p�qVOcH��ӧX��.?��Դn��r\�;����6�f�c$4�S��;qHw�I�9{���j�5�����Q��KT���:_OS8pekk�?���}$��0����C�I���6��w%��"��Sbs;��#�l$���i#X�R�=��1P8|��Zlp��M
H/,(RHq9�G��
.�����T�b�~�E�!,xL_�աB%���?�†"f<c����;�ϱ1�
�f�w��|B�&l^\���G!W���}�k�;�Ŗui��_�JeWR��I��^��C^&�b{8�
SToʮ��p����l~*��m�R9��c덶+�Yfhx�����}`�T��k��^��Afy(��Q���?6��-:u��صۋ}��M�V}��-8^�	�~p��d�7�T}5m��gH���Ӕ"��Έ��ړ�$�!����D=:��9g�=ߕ��yۣUtp�i����Lޡ.W{�����Lvl�Np�Ӕ���Z�%|��<����p`њ��6�T�E��9O6f��\ٲ[�[���]������[kiӮ?���/�M���q����A��:��ה�)o��R���%��{b��.�	Ig���<Y(�2�5${4��d�ў�w/!�4�x�Fcc쎧}�hP��h�\�y+P}X��9`7Md^mz�q��F����p�̲HrdO���M�!�;U�Y8([pe*�L�a���R���#Y���h�`�6�X��,�2NS����1��y��|bյ:�z����Ö����#_�a��XF^(�"I�4�v�!�Zm~Y����\Y%�2��v�	R����q|�,��%�ҽ�mI��aX4
�Hqv0)S���F�u�Rk("��S�*u�Nԟ�i!&��v)M)��0�	c�G6Tq\K� 7���R6Zy�%v�qd�<|���H��ꂟ�
_^�T��>:J:�+u޻:�8�B�.��B���x�q]�{K��=�e��\�,��Eh4$�	���u�ڎzE�=��{g�����g/&��7wܪ�bӶvj���n���}���[��ܼ��@7����E߮Z{���|m��}f٘o��d�Ƅcnq��6U��C�\[*n����t��z-?�\Ԅ��}ej�JY���ʖ�4��N�E�!��h�gge�W���%�T|�d�6�����"���5�p!$P����-\�jQ����dV
����E�����˴#xj[EG)�H�G:����ߡ��Ǘ�??y���%�ȃ�w\�H���-&d�[Y��=d�
���� %�D��qG£�4��Y���W#��mt�&v���g�O�h"OHm���c:�&��c�݋�}w{)&�$u؟��|n�'/$m6�B�nJ��4f������A��Q	��?D
NU�Fh�~u'9v�e^�Y�����#������g���Z��,�2�<*d�4\�R+n}��d�3+>PXoG�+A�j9��.\"5�D�̟�X�EIu�ae�o�V��3L�����M,0�'��w��5vC.�9�3�|�>�T�5R#hDS�x�+�H'�fD��5_�jk���%�u=�u���"%�G ����Gz3o���|]�k9�z)�:N���0)SѼ�{&�1�e�H�_5J���|�xkKQR��E���!��� �<po����G���{4�fR���=����#`�CP�"{��6k���j��c�CI;W���cT	�K��J�'��q�4��a[h����8mKN 0혵��X)�8%a%{�L;�!�;�3,_y��)|�v��	N�Z�I�MB`,�y��a�+�-��]ȸ@I���|�����Y��c���'0�K�{����*a0�|�W{:��
��c7|����W���U���<�Q��4��6�Ҙ�!43�36�`�2�.'›��Ϛ�5�Z`��S�X��M3�ew�A�q$K��Bs���F��~k��p��Ӟa6��b�:V����&������+co\nۍ�݀��r�m�v�Z�1�$WY��}8���pe�Qy���k��J��aE��q��P�=}H\�Q��m���(���S�OU�'':���\1�*�r�ߩC�i�p���px˜�jWif;;K��:;�,�q�(��_n����T��=!C8�HP&�y��B+3�]��N
-~����@j�&��9������S�u'�-5���I;�p�my�Ո����V\�X$��.	7��/��e�恹�����v�A@Q�T�O��j�KT_Z�RsJ-?�g�#A���u��>��b�C�r:U����!W:r�fNl�"�i�TՖ���&#W��$�^ر�z�`��������1��%6.2�p�o�έ��Ģ�1�n{]s��z�7U��B>I�V�����v2�"sQg�ŕ��<�Ȍ�Z���4�*H$��ʹ�x:��Pa��P��u���e1�n��`�r�Z�aN-��Z
�o��ti��O��Ҕ;/�{
�Fe�LRp�U��Ly�&%1��J��E1>��I��;kc
@�Y��n�:k���eG�=�U�s��Ny�
w8�n	�I�V�͍����B�S�d�۵��C�v=�,��h�醼�y׏=�������4�����X�!v��{�;1ugB?�^�ʌ��K��8҄�beRv�.��N�ܓX���(D��;��ʷm����G�a�{<�&˩���$u<u
�j���!Ae�Kr�
����+��9z�	oW���ណ�B{<����ԡ��xG��pO��}�8��q@����mܝ�n���(�)4P�{x;�y�IZ��7�d�Q�4��-�.m���[�cW�
���7>�o�N�>۫�̦�\[���A�?ؾ�mۏ�1Y��y���N��Dϳ-�/��(Ϣ�|f⒒
ς����b���?���i׸�Q5@�3J$n0!�\*;����J�+pvӜ�.ږkZ}qwl�{9]1yh��v��CV�/�>$s}�G;Q�[k��C�t1��K��n�:��Q�Z�(�*��л���;�`K-�4�ƚ� ��?#1�t���[U�݋�x�c�0�ؙ�|䚎E��kL(�M?KB4	x�AڞZ�EO�?�֯Ŭ�hy(�L;
]=��=4L��@�|��C���~�!ܤ
!T
oZE7q=�v��S��:x����<�PE>��ۘ�Z}̽v�{��I7�V:�t���f)���i�Cl���`>TJ���NN�W�x�]�[�X��e��wBV��Z�L��&.��ٵt�f�.3`�D}��*qs�^���Oٻ!e�%�����)VC?�m7����gj���G�aϮob7e����K;�bpY�y��m93Y$��k2I�h�:�_��V���¼'ðk>�� �_�I�v�ׄ(�������h�^�рt�@c�nw
!&>=�0���������@Y�dX��5�Sw-�o�0��·˾/c��5�q�g�{�e�$U�������w�Wcn_k�U(c��I�7�lle#0��H]m�Q>aƝ	&�j%6�A���(ܬ7����-Q�'�D��J.�������ڠ�l��X~�g���{ii�t�Bv�L�ӷ�G��z�����07�*�,v�C�0�kOQ�yk��,�
rN+B�:��h(EJ3)��������;�8��KN�M���o�S9y��D��v��.X�0%��ERW=`�	{�\�IEw�K��4��Z�������fM�YL�TQ���V=���ы5���$F*�[d��&��=ho칏��WjH����O#�L��b��3��y�Mxe����*gQ<�UzTɦ+s��E$�������T��&d�ۓ�*�٧�ݘ�,4�c� ��͜�mu9ڍ)0��]��r-�Õ0�iJ���le�8��e��8pg�^��K��j��=Xq���g;�f�
�"6���o��ߑ��{���$���>T<�����!}�E���\5<��#ɮ9��c�ɴ�u�e��YM}=��y�f���������k��G��O���������2�D�U���<��T�w�%�Ǔs�"�X�#�R{�Qjgɼe�j%u����Y�ë�v=�����4-�o<�׺�>��J��y��L�2�i�H��P���{sGeڸZ�{Җ�Yք�jU�>�Z7K�qE�y�X��~����.sf�����(Ea���k'�Y�i��(OD<���(ͨ3'��T���������H��z����A@��*�(q���B��O��0H%�g���]�������c���k�
����={��x���e����۸mQ3(�s�/<���ן�y�i�5~m��Φ1�A�>�q^�xVcQ�!�FQ��^c�˒ʈ��W��?yOZ��������X�B�x�_�j��G����֚y����s��U�߭u���{����
r�)T�9�iN�i\�����U�v���*]r�$������8_S�9���mu�����{�{���6no���]1M2�"�%��@M���>�S�>{ZlEbo��7�rO�Th3�
�]�„���ŏ�ҧ�KOƋ���E���ׯ��#r��PU��HU�z�Ϲ�5��MYM𽙯��j�,�C�E?x�?���ځ��k2d[is�`]K-r8�Ua*�T�>�!srI����0�?T�eb"�������O�u�g.�j�J+I��9KO����fAv��v&�Rou�k���U�w���-���%��C�<�\���з�nЩTw�G�p�҆c&�!���D�񄱝��B�J��Gy:����2
qf��s*v'��83��^����Z46o+��&���{kW�֕����!�v��jx��z��<
m#�N۠܆f���M6#_(��f�0G��z�x�<�l̘��3~��&��9��;��")����z
�qt�[���ee�/.�N8�F�;�7�>���goUmI~�X��ߐI�����z<mq�����ΕO|�W��3>�+�޿Ldm;�Jwb�n؊���"����7'T\�3ؚ�ԏ-D�WM��甾�akw<�<�>U�*��Pީ�Z��{��;�N�*F?X2���4^S��t���G�=�ea�?1�Y��@"�r�b�7��Nc�6H�6�t	�N��v%z�����i�4�a�V�1L-��7�#lB�9*8X��kqPTp��(���7?������nW���N�d5���]���C�
H���G��_ˤ����@�"7r�,�PS��N�ܴ��K��`����ZoɈ���=�ЭHﭓ��	����Ң8��Q�ZwCu��0��o��
�����>�^�5��e]�#��2��z��fm�B�T��\�
B�y�eoZ:v��[�v4����X J웄�
��h�\�tp
��&<��>[,�]�,h��87S

w����Puֲ���*��Q�@"~r�����ͶM~�
�����آ:wןn�K^fn�Q�Y�f+L�bg�k���lM���5K��jhO��
�{ϱ��ڝ\ZT�i���f�Ŗd�w۞�尰�;��͚�d��"�o,�Ȼ����-b���_��&�$i�ޓ�y��i�UG$���u�.)��b�\��T��l�[R%qJ��}CNW�|pN�[��hb�^��b@���a�
��_���fQL<0���>�m����y���1K_���]�E�>���v��M��.��ߛ�b�����������oO�rhz�Y� @<R���MBZ�#5�������$sy��J{bW���a
ǵ=s��Hu�E�+��#�|Ȅ����z��s�uoj��O���1�$���N�~�w�^}M�,6|�F�c6g��Q��h�=���A[����l+�h�x��j^�1h+/	�C
�dA���(�<EW~�&�<�iͫ��71��h�5̱d^1?®��C�o��c�9r����1�ns�R��� j�(�Ѹ��!����<�'��#ۘXw�C�K���x����	���՗)aX7��d�;���H_a�O�?PKEePQ�s���="pip/_vendor/html5lib/serializer.py�;ks�6��+PzQ[Y�ݦ�ʖwr�ng�M�vn�{h��$���lug��=I��(ٻ3��P�ȃ��y�<OW$�eQ�,_ei^:i\,P�G$�k.x��H��0�X��4sD��l�Y��X��
O����d��@����HBA��.a��<�G�q�K��l��,�!S�<�D4)j�G�1[1�7"�4�M�E�g �`y8it�6<yт6��K���\K�3�@�{@;"AY�J+0d,�#^�n5����N��˴`5�W�CA���ƿ�<�[l��Ļ���;�5���Ze<f��Ń[��[o�F�-h�y�����<�z�	\�p}׷p���;��כ��&��6�+���5�y<�'������z_|'��	pq����p���.�r2��)�r
<}�髛��7��x��My��ի=�!�|?����o�k���|������w���Ω�s*�{����7 �85Kd��3g�h��\e(��o1K|�����xyC2����y���Y��_M�1Ě��É�搈{��U�(��F=U%�߯I�$�D�CrAN�$�-��$-���"�/�OJVQX��`�������D���$W�a,J�fZ��)ϯ�w��f{�!,�� �#H2�܃��G�������C�!� ���^��I����_��io��%]eg#�rQ�;+±��K��8�_�؜,�U��١�g��f	���"#q���T����/UV��s���'o����/��Ŵf[��M���X}e�#�2YR� ���q:�����L��?A��m�A̓Τq�s�U�*��#�wk�mbڝ��2�dY��� �|�<�4����-���=��C��M	�yKԮ���@�m��e�4�@.��3�,fh�ܦ�PȎ����l�ַ�Mp���]���p��eh��y��)��(�Uh�v��B�y�����r:���5`B�����N��l*z��RM�o�vi�{�x�ƈ��!�����$+�Œk�1��a����b��4a#�?��y�f��
�<�z H�dDb#Ez�"]��B>P��9g�Q�HD�/�؉��iî�84t�
aKaBU�(��[�%�����'(�BgT�����$�L�L�P߯c>7x����C����҂�<$�
i��좑�a&"T�����#$��F~��� �2��2�!A�:�߶�7�VЍ������T�����|�F����������X�8�O�I�q&�IW���it!�2����%�"���IT��K�ϟ?O��2-�<0�ռ��/@;��l:0Z]��_�W�(v0��f��s��b��d0�YͶa3�p>Jj�U9`��|Hh�#lЅ�s�粍&XӸ�Iۋe�����T)�m�
��1�
�xyfF0c���2�hn�LDl��>Zltmif'șP��U3�2Y`H��)�A��f����!9!MFec�֖����b�Ư���z<��:�q�&��"dqL�#&EgK:cA/��
r��Ń+�T�`���Y��]*�V	M��?���:|M!u<�����9���)�����ց�eb��kY��!�e?��6���h�]���h�`�@�x`���s̬��~�Q�@���@�
M�Q��ڄ��d�HrlU�����dzAP�A���UX�Y�����n�"����O�H�C��{Q��j;g��<o�YHT�"�<}��5cK�� �wW���;�K���E�d��OD�H�ĺC�T4~�!𢡊��W
e�:P��I0��k([��6k�N��xw"�pIxcD���X���I� g�X��.{ 
- ��XlV4�^,��4�Q�-twҹ|NA�,� ��aU��BƳ��Iny��\�_;`°�L���:_BCe�������P�������mQ����0�b���O�4�!I�
���H�,�؟@���DH�<Te�\Í�?}�u
�E<�5�h�+2�RA^�{�?�������T��A'�����Ҏ�-��5�/+���o �AdE��	c�_#S��
*��0���	�i����!ˊ�ww��>ú=�Q��y�`��Ĩ
)���o�Pq�dG2�0�LZ��\�eA4��Oޅ
:c�0`l���ٕ�'��$���C�8�HV�P��*t��tn�]���7����W�LN���bc��% �x��.z��(b�pL.Nj1F�e~|a	���{�	�;q��I�+��:Api5Ƣ�ңR09*�`�B��>kD�P2XX�<D
D~QYR�M�9���kܪ��ƹ,�Z�:g���>Ip�(��^��K6�iY�S��^A����<�X>�(���g��[�N�G����X��N�*�g�fKe9c�9t��)?c��� "��(f��L�c&cu��&���? ����'92�ae:ֽ��0��-d����^'���v���j���%�,�8�(� !�l���%NW2x!�� ��[��C��AS�
PuJ"�%)����.X�=���6��t	�G��\�T7 �q�\-ɵ���&İ��9lԲ�F����&�Ag�¿5�ƶ��Y��V��ؠ[�C�]x��l�P�e����H��q�e.%K���ZU5�;$��p1��uZ���;����EG�8
�E�y���i���@t/�ng*��(7���_��Sn�W�ٵ��U���[�j;��}�����ޚq��P�A��e)FTY 	Q�����?�JB�4h�B����,�
�X]4t�W��hu�:���JQ����F������o:��-e��b���7u�k]3+0"�Z*d*l+�?�yM-r�2���#_�+��srP=���!˵:��=z0
�]������!���G�Q��pP���LX�P��`+YC�,`�ŵs����7��Y̔x��PBt��"�W�Ͽz�����$/�5���m�-Q�DV�b�y��ݾ���S2 ?��?�#�4D,n(�
D��^�<r����˟��>�G��'�?�P�M��~����k0�����.�$.�#L�s�T/7��bY�՘H��'cQƱ�[����t��g�(�m���2��r7�<��nd�v���y��|�Y���{�B�s���6rsh
���sl�=ns�1�Ue�V���4�V�\T�\�x�9��S���t�޿�~��':J�-V����F���-��v��&�Z���C���ب�N��Gx��q���b��&���R��0Z��n+7�b�I-{���p��q]ɂJ����0;�?PmS U�?��mLH�7��ln���'�-�w�K���d�ĺ�9�TR�wB�+��~��; G��q�������`��l���}u�s�Wv����e38D۞2v���{�i���$��nr�OI�ۃ�hN�H~
�m�z�y�C]�A=���d0�1��K�jf�2����H�j=�'u���\��m|����CFu,���uph@TS7!{�m^�@9�`Dh���(�z<g�z�W;�x��E��W:��z�n�:���b�FW�VWH���ށ�8��~�z0t�2SAiV�������Uv�KN�SE���*RCF^�M�e클��7��[��k>u��6���ہ~[6��'�7�Z��	���^�ŕ�#�fY̹��-;��w_��Y�o�[�
��s���
:���1��ea)��JxkM��pu��T����⢩�{�.]I�e%�U���Ot�vt�ۡ95�hzzD�I�::z!��.�囪U��Ix���3�����xg��с�>k��V�*rr����viS�� F��p[��ݫ�_`�k�j���ý������ٺ4�;vsQr)�e}�%чb��"�4�Ǒ�h�8O��ck_��q���8;�:g^��O�+����r�u��8̍�0�$7�:dz��rO�9��}��Pw��9t��ny��q���P/'�Ǧ��-X���Q��]��զ �v�#�]����ޘspV��C��Ξ�-��;��!���G5�����7�>�L.���/�˫���{I�vy���g�C"���΁g��=Sd�G*�4�4'6����w1*^�3v�]�,����m�R���h~y"��zk�U��_l�?PKEePQ��]TZm&pip/_vendor/html5lib/_trie/__init__.py5�A
�0��}E�,��_x)S;(�ut���U�cIt;�(�ڜ�P�l^1�ŴU��{��"�zlI6ۙT*{��ǐ�?�\�(�>���5�7PKEePQ灦�#pip/_vendor/html5lib/_trie/_base.py�SKk�0��W��M���RX�C
�ҐCn!��j%3#'kJ�{%˛�>Bu���1k�;�R��'�̮�@��mP�{�y3l���w��-Jk��,D�a% ��o-6!by���Ku�q�����D�V7�4��w�u��*�9��U��L��c�M,��5RM�Z1BFjO"�c]��5�ƁF�+��ٯ�É)��k\X��Umq�h����m��H�Dk�C*��
q�5J�4z�Ð�j�Ƨp�7�s�8U���0��e�H�_rP�݄m��˿ǘ[�2Ae��\?�=K��#6�'�d�ԣ'wE�63�L=^$���G�ֻ
r�����ë��q�ʤRQ�����;��/pw�0_V��ԅ܈��T&��O�5?�}�W�i�Yh;E^�79�ԁ��T1u�E|�n���PKEePQKOn�� pip/_vendor/html5lib/_trie/py.py�U�n�0��+>Q� ��:�E{�ɷ  hi/J�I%��w��E�N�@Q�,��pf9�[gO eۇޡ�@�κ����񻀆�ɓ5�j۠��)�6Rtԕ�Mc]��<�<^;�Ʋy�Ì�_Rc&���q������_��,�j���Ŵ��e����m�� ��[����и�cٙւ���Q��Ec�u����[��W/�".�X4��s։ݽ�+��{���#��wyvi��JI��7��_�g�؈��Ma��#�\����:K&D.��f �')�jk��\�G%&rL܌�X��L<u_7�C����11o�E��'��W��>0����;�-�����:#�!b�9�v�8�ó��&�� ���/�;���X��&f�p����ݮ�:����kJT̞��rIj�wɖx�������DV%��rsrY(_��1�=���$��b]��F���U
��
>m�e�F��� �JFpe"���BF�rd^��v�������o�GIb/��<xu��L�PKEePQ(pip/_vendor/html5lib/filters/__init__.pyPKEePQ����6pip/_vendor/html5lib/filters/alphabeticalattributes.pyuR���0��+_�1������B!({���%#���_�9��6�A��轙�'�1`L?����"Sp�Y�5t�b�
����6td�e��RQ�Z�Y�GLt͵�9jYhi�;��}�-E�Q��y����SeY� ��e�cc����>Ĝ�=�ȜHR�S���V�3^<�Fl	����d�L�o���Z�p���ߔk	t#�0��-�sr�S��y#����3�<R�E<���"�B�.T>
#��f�ۘ�)ֳ�\ȶ�>�e���f[Ú��[�)�W��>*u�Y�/V>��Gb�G�o�7r4��v�Wb�n����ZFC��ȃ��S�A�gW�3�^�U��1�/<�5�_�	����P�	^��j{�Raz�5\�M�-�=PW][w�X�Q9�j[�x?�=ܞ��D�T�^�f	w�7B�9oP�%�-��/PKEePQ"��ĕ$pip/_vendor/html5lib/filters/base.pye�A
�0�~��	�>��k�!G*�U,��CL1to�Վ����B���[��_UR5�k^`�+K^�f�&6*>�s.$�
ON͙d}Q���i����'�P�%P�O���r��c7����V��q�3��<6w2oV~��?�ѷFJ_u_PKEePQ�?�3pip/_vendor/html5lib/filters/inject_meta_charset.py�V�r�0��:Ì��&��I'����2��bԀDВԓɿW+d6&N���ݷ��V��*X�5�DE�*d�^��F���)Kē�B�)���UQ.*�k�K	c�q��<ϋs�5���
�ݬهs�����1j�\�����4������7�~,���	��e��R���.@��8	�����(А�S�U]�0e 
O!W.��zQGЌ;n^�qΫ�s�3����L�q,v�7!�͓�`F��
��;��
[Sz;kA�[|����8��N�F���KSTJ�6>�:JU-�=���(�aP�t��[9��\R���3H��Kbd��|z�=�:C��
o���cl���1�ճ��Y��>���2�3����(q������
ʜ�~r}Ξf��X�|[�!׌�(C,#x��S+��D.�W� �) ���t hN��k��9	7�3S�B�0{���V�
m���El���Ҳ�'�n&'.I�q𞂻=���^����N�m5B�ֽo��b�x��x�
��@_nS�S���ǻ� o0]2Z�1\"P���w�p���U�]4���~Ͱȿ�������OUqϼ9��C�J���:�Bj�������X����ygؙtX:s�a:&�I伟�ף�ӭ�N�����k*��~y^�d!�!���ǝ�v֌��&�G.��J<��K@�bКW���y����}�ဦ&m�nV�2�R�#�u��ن��٦x�D�9}W�����8�7`r�l:?��6�xI���O��{CS��cͽ�PKEePQ��d�l;$pip/_vendor/html5lib/filters/lint.py�V�j�0��S�	�~�@.F�Ba��nJpU���jK�$��F�}G����(�Zn"K���t2�
�㬲��8Q�J[�F�Ÿ��C*��JΡ�"Q)ƹ��yn� s�(��e�td�kKd���v[b�ڃn�ي%��Қ�P�M�4sxV"]�X �ox��k��Z&}��~(!���,�$����i#t�E�z��~��/�ɲ��P��y�ҀZ+�����.��ٜ6?�9h.�>��2�%��>
ZI�?Ō�"��q̳9U���g%(T��F����G���6�6<���ER��+�.�~l�ޤz=�l�����
�}
��(֪B�z�֦*�۵rd9�:��J�L�Ѥ����H�8��$U����,��[�\\kw	���q���r���b�@d5�8Cvc�����́���n�z��~�R�w[#�>DN��Ͼ�0�UIt��*���`�;�we<�;�Wk�`#�S�O&mO��l��Vb��)�K�Ng������t�6���zF��ֺP��Mi?f=��X�b�����i����h�5>\9�2U�>Ӱ�
n9��+�=uo�W�c��DTE�	'ҽg����$�t6����H�Y��=��E��]�ԅ��8��دh"u�w�M
���L	uk�/�"�2��YY/�m�C���qm��<,�R���n�-���Xj^���O�+�.���?!�xJ]������kz3��R�O0�F=R�hn9Έ�3Q�M����g��yd�u�����S<��)��\$�)[���zP��;�f���	_�6j����Z�\�B�s�c�aAS�Ĩ;}�OR�4/�W˷"��"�+��m(`+0O�PKEePQu�*�\),pip/_vendor/html5lib/filters/optionaltags.py�YK��6��`��ր�"I�C�(���C�C�40h�^�D��w�ߙ�dQeK�w�CH�c8��7��x�Uɖ���\.Y^n�����*vV.�s�D~��\U)�Uy��\�����f�<��7���&+�1�c^�-�[�����l6�K��^���Y~g1�ɬ�.+f���j%䚙"���b]��c��}�v�9{w���J��J�ls�F�t&[6x�k�[nX�,��R��e!���v\�����:F)P��q2��q0�r��[.C3���A�)���Z̙ޝ����f�B�:�wl��rm?�Yߢ@v[3���7�t��9�$Sn�
���7<*^� ���2��'n��w�,|�?TbP��D��<$�T!� ���}s�L)�
�3G˶v#9�W�nw�'�фFq�ƖEҕ���b�����lb	�Y�l%�*sk� v��\��ɫ��W^��<�p��ly&Y��g�n��L�H��0��]��ű ��콣���P��adf��h��Zm�C��\��f���Z{<Qk^5O�`З/_ް� =+��ƷBԳ�e���hؒ�q���x�qm��z'ω�z�Þ���Ά�Rbq���#|�����Lnmd�c��η6���/�#�W�Lê\J�s+�=�}0K�>˟�����20r�m��:Z[o1�cQ5��c�9�����S(��q��=z�AxeO�t��=��㛵*
�0Z�n�-]����(�79*q���%�%��X#b�؋�LwZ�j>];�B�u�y��k������>�kW��
��7�9�tp�͈�A	f�~
8#i=�F��
ֺdY�Df�m�>Iɂ�f~1f��l<Z��W;���c�{�O�V)�܎��M�".R��v�`@��d�9�&��� �&�b
�@p-#�|5�i�cǑh�6>$U��5A��V�J����.�CF0�2�C$TҜnP�d�<\���!���s��y��q{�׫�o]Y��unZ�Y��u~�x�ħSz��>u�Ov(r���ɔ�ڷ+��FhI�	cP�:9{cA�P�X�a�ҸHT�&�ܚ�[�xB�l�L3`��<�R8eX3w�<S3/s�T�%������Ff��lT�z|B
wl�@Q	d���4�JU!b�"�hG���፥D!�06�/��@$�d�`%�`d;�d"l����P<Q�v/�3��2.���@�m���r,CO�
�}�g�,`g�N���Pw�����"��T���.�@�V�L��9�/�|	�op���uJ�v��	��B.�iL��F l7df��o�
����s7}L��szJ}��G���[�A���I��{�!�'M��t��ʧƧtO~��=NE�s����K��F�Wt}=���	��+bT�S�QAh�΄��H�(��SZ�8�\UkC�/S� �������<�-o�ߛ�����)�2�f��uW��~����5��Fw)z|աϪ:pȪ��W�9E�/l������b���"�Lk�wI3`8�L��v�?Ik����(��X�k��Ш�:��w���7�+����k4�]C��Gh��=�ѻP���+9�n���q�3=!�O}�8�//I%��*鶎PixxMפ���*�fZ�^�&�Z�QsY^��T���-�.N��=�O�{t�F�0�G`j��$��ui{���9�!��n�l�Xw~N5.-[/?�:��_PKEePQQ�aM	i)pip/_vendor/html5lib/filters/sanitizer.py�=�w������qIZ"�i�l��q�6���r��$�wA�~���O������%�\�Ryw0����h4��璇L�(X�,	6:���e����%��
�<x��:Wg��k�7�rf�i��<���d�P�����o����"Xe�H��7aZdi��Y��UU��Y�񻘳pC��d�E�ӥA�F��
�j�$<��x��<f!���U� �:(Tp�f�@����)	�����#�
����"U��zC�}V� �<R���htdX�X�
]H�X"�3�a`*���I��P��	�(�,�Xh.Y����:��O;&S��U�]���ZĪ��,��J�\���x�ɹw�$��N!c��E�$08�湪;��
\O�f�nIY�U�U'��J�q�b��8p\�~1nts`kf�ZC��(�ߨ��
K���D�G� >H�(8�+��Xy+Ms�,<h�GGӣ�zb�0��$���R�B%`K��т�F�p8�����IɋI�ҫ1e|s��xzr�x���Pf�>� E��Jy�$�Q#�c�AR"����,=�b�A���S�i)>�.���0N��-�0�%ƃ��=��7$�<>�؋��Y�����0R�4[K��X(���=㊸f`]=H+�4E�řG�"�Gp�X<�������z�e%x�!�a�$�nԃ�e^EXe��"�Acl8�|�l����)����[O��=��{�'<ʼnG�E����G�n�~�=rs��h̖>��9t�k���H%�c5!>(|^�O�\�ό��ccR~�}���	D�^�r��=�zx��}�%���
}:\쩭X�!S��?T�d�a�J ��d�O���#��IKq��ICD�1:����'l&���,�h�A�pV����j-)�=(_98;�g~���]+<��e����Y�yC��1�ú�A`��å�h�l��d���*6���*�"״������3*�(���C��i��mX�3�7v�>p�rH�H;/����>IwJ��Fk�:�p�lT͏3l�:X�IDk�G��8�H��z��YJOm�Q��T@c�J��Y<��=ğ�A�� Y�3�9�E�n�"5HB���(_ъ�"(�V�<R��^0�������a�Q�<L4��>?���-���-)g�E�d�6�A�����nP�f��qI(%��?>��)�#d�~�n��Y��qRE�5���CS�3�P6�â�vB��3h�=��C��(uoj-*3
Q�МZV~���Oo��l��`3Oz��5,y�i�,��VY���nA���X�	��l��0K�[��*[ea���;�,����t������rvl}�1�R�Iۭu�tcmQ��@1�k�0g�i��0�V:T�`��TQER�ӵ� 
��V.���nxx˝Y�jװ�)g�tQ��[;�;
؀�͡K+x%\��D7²�%�	L���x��f 8gk��g�S,�}d�,���+\��x�U����‘�J�^S<��)AOC��d�jk'��a��v�&�;�5J��ۋ�uI����傰3yN)��Q�BAA�)�@LrGs6ˡx��c*�]�+��E������`Y��S��]`��|��
5��&O
��u'.m�C�B��D#`�]�B��L�;Do���L�Lg���r��6�CX"�i3��T)!�iF�N��
s'9�vҝe�+R8�1����LLz�	�V"LW�)B��On��s8�9q��.���r]����c�+Ē��1�u�;[�����5��o�ݑ ���^���`E����劲K
�LL!�=�2���;S�]N��Ey�3m�����}�,҈;34��Cs�6�ltC���1e���/�!�'�l�Ԗ�Z8mn�T_�,.\��%��V&�2�D�Z����f���ң�'H2d%&i�xH�>����"�_������i1����DO9g0)�`<X\uC�Qvaʼn�T�.�`G�3dE�>�;��mJhdL�.�
�iXJ��X`$�u���(�f�gz�:&�4)<�NJZi͇l?e�I����1ߺ^�4GDz�x�$�.���\�Gdi��vl��:|`)4��,�(��x\���aÂG�f��Ba!a���k�%�Q���W����"�QyS!w�!�5����4�A�-\U^.3��-�ڍU�Ό�`f~"���H�E>�(���L�39�x�W������c��T�T��J���!�]8�X;z��Y����VMFp����X"��Qv�,(ux�l�!��)����;\_9ԯ�v �8\�QyϺZM�G*��wCB��@��I�yƢ��!�,�?К[Jd�����P8�~�[���!
.s�S@���p*�.wf�dV%�K~UBF�e��H�e�L�E�Pn�6�o�n�p�}%�jE�6(�,���|;�-�8+3H_�L��x|y��̑{�n"�
����R�)�[�J�����t'np|�O�/���kj��,��5�u�{q�?�p�
�h��D\�IA��&<�tv7q��TA��t�t�Y���̔�Xy�Io �]oe��5(@x"�Bg��]J�aY�vT(����Z��e�^T�	~��ga�?XJ�j���[�܍����N�Xn�iҎFhgO�.��zGo�_���D�18��GC���2�@�;���;�1�N/`�A�V��wn4�4-ELL�pJ�t�z7b�9���W��u1t��’���f�(Yy@+�g��震\p��� B'<��|ҙ�3){G�?gY�*�ޕI�ٻ��f�jQHA}U[�:6��H�қ�C�	�����V��E�tȿT�z�\U���9�P�w'h��N,�B*b׍�m��ν<8�<���r���U6�B6-�����0�X���9aS�{'Ⱥ��Tl@���G����������SLm�I��ر\,%I�R`�C��-�s-�R���1/c�Y$�X�d�j��ps�bV� �3<��T��$�v
Y�F��<�P�tJʩ��"!��P�=T�<�[f�����������d�	:�`C��߆U)�t�b��3�/k(�6]ĎV��Z��hg����
e�Zr�`���SY�KU )	��wH��m�eV}�Ձ�E�fw�y��h��7pӥnz����2�4�6$�a&;-0nT���#���D
ۢ2��궹�D�{�[m�To�
��Y��k���N����P!��h���>��T�}���Ҫ8j�-�5�ټ�l׌���U���b�›&#h�}[�F��µl�f-9oz�C�E�%��5
[q^��-Z��������B
&�yf�}�I+Uն{�
1�0ג�ɼ%���[��� ��O
�hJ���m����I�=L�dG�D�#9�˞ǥ��B�^�6��I��d}6̬r�J�n��6�ֆ�ɩ5Ii�j���)Ø��G�4���M?x
���軐a+ �ymI��AZg����4m��<Ny3;��y�K��V�+�J��
*��j�6�i�Xe�Z�ZÓZ5�l��mΨ�F�&��t�d����4oA	�-�=�Z��}ޅ,�Qw�\��c$����H�7D��N�x<6U�~�b���p���*0]=gy6�X����������6�/�fl���쿟�s~s|�}�>��t��JH�`.�<g�d��Ϫ���lt`!��|;�����J{xH���WJ��3w���6d�[�d�ċ���ć�����^^���
���e������3��h4���@Q�s�J�$�V�?��qyj��lpŒ\�S
�	ڬMO��ی �Y,��XL�W��ǝDA�Β�>�@���st�^7�?����u�rN��s|�~�G��!�mzNB������;5����|��^�|N+���k�a�4�U���1�v���,����H���f�7`ĠT�`aC��%�nD�zi����z��	Ԫ�lM
M����p�]�m�~}yX�5�_�e-�����]WK��T��J�����(W;�eI�tx}�?���xdk�ӌ��˦>~D��is�o����|m�6l˱��\���;lhY��
H_�f:���xEY
�8l� �`ڀ�w�Oh�RCC�2��%�'��2��[}�v��	l����QC���T�5)M�I�>n:o]��mӶ�ﺼ��
�7y�At��WZ.���,���d�����.�+�� ��D��^Ug���/����ub
|d^ �U�e�D�$e|�l�
�"�
�9U��0Љ�ۍ�Ū��m{���,,I}�a�	���6��ҏ������V�~����_.�_\������.O0�Z+��{��%����>|x��w��pq9.{1l�s=ad:1�:bxN��|�C���7-��[�{����?^\Z���u�_޾�ɇ^j�_m��m��f�u��7�/`�-�SiZӇ_�^�me�g
H���7��@�T��|��As/�'f2~^�|D�"e�/�.V��4x~Z��M��E��X?���u��.�����ؖ��`ً������k�|os/(�W_?}�����xΆ��ɵIXJQmh$8��r~���*�m���S�\��ʸ+��V�y�r5·�M�RkO��6]������4���\�񹧭�O׶�oV�5�Y��bP���'�����Q&�okc���-�>�+s3�����t�Z�u!{���
��M�7��Z�qw��σ�ks�u[�!����;�:�L#�d��HZS4��pd�u�.�δA�q0����뉩27�&S+�ߣ�	�P���K¾լ��Y��c���PxBLi��.�WM�7r�ǼD�4�C#�,�N�M��9��7!�аVT$�bH /��0�v�?��L�M0!`jЂA���]��m���v�} t��b�	�3ʼn��%:ZVU���v��|�@�o���-�zyt�c{��;2'���dx�}V`���ܣ!��'�8b�^��2��X��|��Nѭ���ӔIբ,0�0S�$�$�A~�L0��fuH�K,NR=ڨ\�U�r2��x}�����w�����Z���}��[���.�
��L�s�-p^İ�aX�G[UNqKn[�W�}^5?]�^E�KF.5Z�]�5�2o}q�~�t:q��wx�C�3��^]u�u�d1��XCl�!�w^�AtO%��Jq�����g�G����r/c��8��(̍JO�%<�0�H
��`��J8���K��#���&h<%��]�"��4��B����&���|9q�VO�'����G��W�No�_^O��A0��6N�	�\�g�T�u�W�+�9��$H���0b��Ku�W�� A7Tp������W���Q��ſqR�P�	�ڝ�N�R-�֚�������8��дJ���"r��z1
�m�[W��eps0�iR2T��q,�$UU:pl�H�&`.4O X��9���8x��G��J}0�R5��Y�3�A���\�*U7M���n��Ó=z�XU���.�s<!P���N'�y�聹�gf��0~���:��v�~��o�`�;�	������Q�J)dH��&���h�G-��*E��E�F'0���̢Mo��c������>�?㩱�h��>�~�
Hչ�y��M֞W�F�_'Wg'�=�_�f�7�׻��~|u��w7��Q�4���\]G':^O�O��&��Y̱�	�ݣ)�\Ͱax:�����͓�3x���4�k�����h�d��zR&<�b�J�p:�:F>�:L�Ӂ>+�MS�Rb� ҂��`�ut���m,�QS��<>W|\�^���u�*����g������+��Is�Vy�wݜ�߸����NC�>���+��V�@�c�:<:���En��
D��V�f?���T+:~���:z_���/ﯣ�yz��^�_VO�0����ݽH��>�s}���?�?���s(�m�3�4�4|�b)9�u�
r
�?���^��þY�T����PKEePQ`r���*pip/_vendor/html5lib/filters/whitespace.py��Mo�0�����6��u@C��Z,=�C��U�,�܏��Q��FN;`:�H>|I��顮�я�d?�A�Q��z������Z6��ZI�V(�X���Xp�B9
��l�v^h��mZ�E��G:-�
��흰�!�c�=\�彑:[Yr�v7_�ծ�^}�~��EJ�Ra����p��Sk�p�JEY[ο��hqηF)18t�xG�N��R�`��O^X݂k�$#ƺ�1�����.E�T���}��D����%���V�$= [����-�u�PuQvXC�D>�vƂ7�Q�'��Q���C�Lq{v��8�.���H���8�L|���h[��=a����|�Y+]I��k��3�S]�n'U!��܇�q�W��z�;}[s�X[�:~8�v��<�:���{3���[ӎ�覞�g����1|���I�*礒s�kxG��f�=O�>KT�14~��E��7m���4��v��cvW����/PKEePQ�9qZg�-pip/_vendor/html5lib/treeadapters/__init__.pymQ�j1��)��l<�"� Xh���RBvw�`̤IV��l�Z��fg8�+��U.�`0‰:h��GX{�Y��i!����O%����[���0&D��Tjv�	�Sܒe�9�<�mɃ�;J۸7�F�8���~��ܠ
[ݛ���̟OkjO�~����tܷ��}�N�}\�7�^
R
0�ìpʇ������V�6��^2�E��Ҁ=�S>��ݍ/�_z���g�R�H���Y���s�EJ��򭤼lLՁLQ�z�>�Ɏ��:_N�V�L`�C\�A�R��f��S�3�i���2�#X�Q�
��=��|9C��g��K��xq�C�PKEePQR�)T�+pip/_vendor/html5lib/treeadapters/genshi.py�T�k�0~�_qhl���$�!���Qm9�jKF�����}:�N�8-}��X�}����J��$ymjŒxYIe�>iYԆ%�9����R�P�ʌ%7L�B{^�6�L���R��ȷ5-Y��(�*h����
!Z/C�Fv��_����,��ǯ��y�ȤQ��♩`�]���G�A�Q�Y��5Pw�9܌�=4�30�D�5j���,ŋ���MkF1˔�3�`�7R��;w���..�7췁9�bw�%z{f��q=U�B�|G�DⳐ���dq����MB ����w���"�Ҫb"�[�5���
4oqC�gE�V���OɅ�� -��������&��oUfK�zTV���Q�	U�Ҙ ��\(��ȟ��;�&��¾�~�M暽jw�7Q�i�p���|��~/`��}��k��5��Ė�#-j�b�-�ķX�qPȩ}�����ܚ��kc�d�S�������%�B��jۖD"C�����_�+��4`�/�Q��B�%�\{T�!7(�{-/e���5���$���꧂�w��z��:�>i�\3�K~+�5��r���f��@
��L~n�F���PKEePQ�i��D�(pip/_vendor/html5lib/treeadapters/sax.py�UM��0��W:�������CC!-�`��8Q#KF��YJ�{G����A���a������HJmMEQw��X ��X���y,��*y�N�A�ei*,��h�r���ب܉cN�EQ�=A�{o�3a��KӪ1>�K��ڻHZ��4�V���.�Z��<�h[��p����X�(S
�
f��kE� �-�� T�.Ih�z�@+�qp�5'>7$"R1�*����z���G��N�J�I8�K���~Rr�@��)���
�o6�,�ݎ��N㼁�a؂!z��hHm�~3r.��(`a'��>�r���M�5$9I{�t�����	jb�/@���_���/e�˛=�?6!��i����/��N��N�޷԰� ��0Q���,�� ����C���:�t�i8��(�^�M6˹�n^�t�?k��0��:9Q�/Ll|��K�,�]}��ݏ�[\��JA]}|!g��W����ե��(쟢�÷�	+Jz�]8~�61��Ֆ1b~�n��4M(�V87Ipxv���#�8г��6/z���5c�LP�=);�<OPKEePQe�kLS-pip/_vendor/html5lib/treebuilders/__init__.py�V�n�F}�W��@o/�u��@������V�H�f���.%�E��3��x��%q�왙3g9�ͮ�p�`���vP��1`�<lmJm�P��=��-�E��]
?޿�9+]���,�wPxTAI��LOء,��5�+��.�� cA�#ze V�"������ȹ�Q!�L��k��z��
޴Ė���/����K�)0��
B݄=�X!h��T!�7��
��
��+q�a��2�r;���`�Y�J�}��[�žNўRl��)���, �q�����-��f��j�Fƭ�#(l��K�S�ut�R�Z��������T�
�6�#O�k�p�n�i�"���~�n6�}djG�"�����8����gR�4x������vlJP1z�m"�0낀:ް6�K��(��Մs�a�b�F����å	��^+�g�x:!�.�U�3�mT��y&��
R�O1����,�
���X���c�A��!)�9�;�A�t,Z�%2�,�&��v��'*&�+���!��ѲJ��l4iz��Ư���G��O��K��ש�E�(�{3T��"w�3d��K��eú��HgPTFkG�\2���mT����$N�0%Y��j���l6�e��u��5���5o��T�68CJ\��K��$�%#Dfmtd+-F����M�Jܩ��5�.�^�7� "W�?Y�Q��1��{����^ݑ�pq��>,V\P?�}*@��z�G�͟t��6��������
V��4ͪ�,#�q��,�+N@t�G\��>A&����2
��<&���JW�H���K�,`x������Ŷ����69��5���;O9ȇ��t���'�3>\�ÕݺO��菃[fJ�I&�/I�w4uTڨ�I��3�	��rE�j$�2�?�Ȝ���/�4L��Z��
8�9�U����N�OV0�i<߇�n��h�:v��z��e1��D����J�,]	�}�tO�pT��m�O{��kKl�Rs	t��C�3?�6����Ta?{1Cf�c�~���}��ׯ_�k��������e��	���]M]��j�u.�>t�K	��ܸ%,��!�R)L�iu�l|u�ƶ(�����z�������ߐ�+���m����.O��I����L�]赁}pL�L�5��P���N0��|w�n�A!~M�8�2�YF�X�Ҿ��ԚLt��;I��r[�o%f>f0p�|��C3�l��f!�Xs�(h:��:�ߩ}�d�v�Y_:�O�4�T�pX���q%ߠ��r�pdaR�W��>�5x��sZ�_����f��'�^�o5�<w<mF�p:G&;�#�PKEePQ>>h���8)pip/_vendor/html5lib/treebuilders/base.py�ko��� 8��7���P]q�KZM$F{��5�%�Z*Kn�5��3Cr��R���CQq�]r^�7��Fm���5m#no��lUc�Ӫj���ߧl!�K-U=em-K���4��>["�����E�PM��Lj�����.+�R����h�D�j+�ճJl<�2��*qYkј��Q��[^
}v��]��lÛ��ь7�I�'l�5�}��L�,JÄ��a׻V�����������=C��F�m#�UÖ��pc�#�F��o�����	�'�8{A�9{�j�T%��\��[x������1 �E�f��n2e��@�dJ�Gw�1����~�r��ͦ�L�͓�)T��3a�j䠜��Ci�U$阬�v���m��&E��PKsf�5�F���B8�W�q ������gggeŵ�X��U���R5����΃�lu*��i���p!�`����v�,��90��Fp#a:�^�x���32F��74�Rr�Biք��vz�yp�f��,h�v$��`�`�jI;˶����UC6�vKo�l7��$���8��q��U+�(�v[I�?�>z���K��V㱰h��c���/�[�y�%�;��O#�T�#g(�`
x��4f�Y�e�p�f�*�m�٦�ղ.�X�U��"��(�捬�L��
cx��@B��p��M�����y-T�W|2^s^�fw	,�;	$n���6�S�@�{q�1�GlT��d=�=����O�{h�tjOdr�S��
��Oؔ`�v�����rS<��6�z�F~��C�-���4������I�LB�6�t�=i3dOQ�#B���M
�"q�GVm3
�:)x4����	y��p����l�Z�ų�QMO��~�]pç���Z�Ѣ���Z���s�!�S�UZ��'xG�pM�҆7d�L���cS����,�"�bCDeC�B3�?�w{ղ�r�6_�����#��!��@$�KH�>8N>&Kw�USP���/P����q��˸Ղ�Fz5�Z?щ�w4y�g�U��9<veOVrt�Ȳ��2o�F��
�5���(o�6�e�1+��n��SG��_�^���D�O��u0��D!�]��V6�az�b�B�_A�dȒЪ�v1��j\�K��a���<��lzN����ȨC�ۏ?��Ι^�΀�n�Y+tZP��
R�5��6b$��'@vz���V'iT�CtgZV�F)CN��!&,�j���'(ȁ���KKu�}���>��\�Vת�K��)|����~��ymse���6jڐ�Lْ1eh;�{_�\	�]i�{񼫇}-8FO���|�/�w-�������a�C�f�l��*�K>�:]�f�7�2ɯ���T<os�m�G��;x^�O�����"KV���}��C����x�ygL=�@1�{�L;�����Ot�.({�jA�`Z�?ʦ�����
�C럝�=�̤��+p�߷��T��sm�;��QV��.��]����[�@���lu_I�)c��S��!��퀹3;
�oW/�μ�}�p<���=�Xh����3/����+	b!5v<�pJ�%xG�r���fj)���d��WY�����-��HB�����>P:�8�z�P�7|���t���tX�����5�2-�M�ę�����Tmc��(��Z��z>��]fGFH�8�me^v���\3�٣G�ݮ�}S�f���ɓ'�>P�H}y`�q;l�0i�di���5%�΂-��,Xz0�Mz����)�~��dj-���!v_b�ꕒ؟β������?������%Z�zK���IOC):����`K�)*ԙ+a�a�H(�|E��r�v؏��gG�w���rMIl�*կ������(���7��pZT(�1���0�ԍ��3��"��ݾX��Ԓ."J��.+2�ܮ���}Gc���5Ф�ߏ=���oΒk�kw
7�Fj)9��D�����O���Ą� @ܵ�
Yck�\T��;pqz�Y��N�����P4��i�w"����O�k���8)-�1[4���еUӖ�kH<�U����j��n+]�`�9�6b��.!������(�R����&��V�U �I�*��{i<��H����[�Z�}�X�b�5�����,��5�P�U�Vx���һ	_�j!g��;�=��w�]��b�u~���J���L���	:<i��s�r-oBv�_^`��|�Z�I���{���M8p]5D���PԟF��	|<4��'�CŸ6��>�oP+���VO�������38��x=#xSI��m;�
��A�z0�����rT�1�����?}�&jH�&�\��	"y�e]�Q�m86@��D_e�{��Q�~�18�ƿ�0ҍfl�M銯F�������~{�p��D#��^p�k݁��q�����駎
��nYh�]݅㰳�	k6A�
���hs�&[�O�8�
���@��>����Q��W�kQ��;�����B��0;aCRx�ai
S&������D�0I����,�o�tBBK�u�QQb�܏kB�U��Y.���K�h�S)ykoM��
�i�����5�Vn�&�u���G:bCNns�&�`�+S��YS�Z)�f�[Q�;3*�l��.>\���נmEQ��[��������%��k�#{�m�*Y^.��I�H�!�ل���Q�\w"(�f�������S�v�\?�=���ki������-�Y�Ԣ��zųxY��
asg�DA�fkG���.K�K�coo]���z��47l�=�:h`Њ��8�y�|�crH�þ�;��x�#Qj�Qt�Fz7\�۱��	�y@~^":�7�Ɨ6�_�uI���s���/�ō^�����}o����";ɇ����qp�|9Vx�YV@tDi��� ӷ��l�e��T���i0/�S+�!����1�q���Xy��s<ܰ�a���L��s��V�n�C����e=X>��r022ѡ^�ǿ���Ψ&#��
��Vl �W����^���Ќ–Ν�`����M0�&x����'O*D��*��e'�C��z�0�c�U<��ZK�_x����+7�3�{�2Y�G��q]��(�M�t7�����K��w06�O$��n��ErU��Ff�5�R�
)�8���:��}��!�M��I�(��k�ɳ��s���A�*�*��Ri��q��Y
�'%�ܶ	�|���`���6O�"{��,��NIg���S���!��$�O�<��@5��}8�:١��گ�\��)�V62a��n�IHt�e�}���N�;ه3�l33W1S륯E��+$6|���݆�V�dv��8ٔT��1.�F�/MKK�9��F�u��(���D��a�6y�������J֑
���ø�L���#^�x��pKl����H�8�$��Y���+�uh�=
G.�=��[�0Pz��m.5��C4��N��Q1��H2-��Vr�%H��$�;�h�O3�L���f�9�d����~a�Z7���s/�֋��J�.�ؒ@�K>m�
�THHi^����/��86�N���ʑ9t���@���a"�
��)��hH��]��r`�-z�'L��E�%�#��C1�b�������y#��������o�P��D�����\�Z��*�X��\_䦘�Ʒ������'�!-=S��PKEePQP����"(pip/_vendor/html5lib/treebuilders/dom.py�]o�6�ݿ�UD^��ˀ`)�&�VlI��6���Ht�U�<�J�a?~G��H����l��}��x_�Vh�X6���b��j]��[V
'��{�r�@��5%ͪ�,
�I�6�Lx�9� x��ZV�8��f��e��mA.�zM˻	y�Ț�r󢮫��=�q���?x	�I��U���@V���5AW �D->��&�I��j�[̈Z��2`�qə��4D�W��qF:�E�i���)�{��ި�VN����j���EN��z(Ȋ��sN[u�::A�݉��
�:��2�Q�#�-��XČ����$���-`��7q	��!�&�C%�I+� #�ob�7�a�t�e�ڪPh6A�h�Ä.��4DF��7�N
�)#`~ީ����,HR02�2��sT�%�ϫ��߲�`NN�٤,S/�T���H@W7���Ē�����F���
���1J¹B�l�]{�c����:ɝ�I�#�P��\{�9)�/�Q�O`�Du��2/�2r�OKػܥm���Ű���5��&.��6���c&h�]���˧��2(�z,��Ȩ�AK%q��1)�{P�6��9)������X��IP�i=;��d��y�m�9N��;��jr"ŵ%ူK���cAv:�_����,�&h,��2��3)�:�&A֫Ŷ�KW{y54PXd��_j��-�j���W�,=���vۢ �[����a\��MI�VY'��#�#�[��Y�P�L�>��5k��~JIh��;Y���A��Nf�fnkRUW�%®z3ev<�
h%�������5k+�m.���!���sn2p�͛9�Cq�Fax���.)�E&ǚ�kG�W~�~>��~�!b��"ı�ʴ���V��ybM�SI�i�^/��ƣr��v�{��P-�Nl�t�6+��2C���,*,�{��a�!��R��#�ǂ��
k̈́��eK��1(����w�7�=_�<�I<���h�$��G
;�Ԭ�f5��8ca*����:r�D7yҔ
#�����n�-W�� �ӛ7�=l*z��K��������E,���g[�Ƨp�M�ڗށ(߬u~��7R��W{��֍�#;��ۂf�H�8�l� r��z%2����ZQP¨Vy@P���f��-��%�<�ԥ
g�9�.*��A]''z��i)ZD�bԩ0l#����n�;��U�*�XQ��	Y⦐�媖�d�DS:�he�t�:JE%u{[���,��PZ�\=ɪ{���Ku��iKv�Dz�w��y;ym�Ԡ�ߩ����@��	�����d
������Щ��%��p;�q����A�;�صe��ˆ};�ýH���:�л2�2��졟O�~9F�(�Ƕ�,e�Y[�!T�Y�I�`$Ā]�-���,$���X�P��� �A.�$��p����_���.~�-���/d=K{OHl�׼8`�~F��au�b�CJ�+�\v��7.�2�w|�AU��J�}��~NT�$��-�O3�45ۻn����3o��F�d�=i
~}����j�����B�oh_�줺^�Нu�J�a�1*�(
{H_���`�ڇ�(�g���
�!4����Y$���M��C���2Cb)�[ʼ�)2Dv~B���afb�a2u��N��w5���ы�t��3��YϮ/w�#�xx(\��p�X@�7پ>G�.n�k$�����[@�X'�����gc�Hx*��a���p��&�QdI��[�ў�:���5bH����[���7���Z@c���?5*
��w$��<��F�c�Ec��ZLÉ^�L�a�K?�d�>2L�uT
/�9���W�y;�L�*Å߁�}��,�ZW��S1�kӏg�ʪ*�88�5�ޕ���ىȝ�7ǭ;���hj�w�rv���u!^;;���Z7�p
%	�ˤ�i��zchJ�9��2J��h�jW�f�ø��A��3�����V��x5i2q)��a}?����UL'�PKEePQM�ЇR
$2*pip/_vendor/html5lib/treebuilders/etree.py��n�6�}���aD���4�A�@��[�H`�h�3��FD�ij���$��4'ݗ��ֲt�7�˦ڠ$Ynٶ!I��M]5�GZ[F�{��|�Ӽ*#�-��HR�4���Tdo���ǂ,�b$e$;�iJ(�͖�K��q�#eV51͟4+F�X�5��ԓ�(�����߫DZ~��)Q��gI��@rS�/Ҫ�����
Q�
�5�5H�eyѾ�Tٶ W8eU�W?f3�WICV�F�n� a�Gx�ۗ���/a�r�g�YF�hE��]C��m^d�	/�!%㏮7��3a��(��������\<��va/���;�h�z�f�<uf9-0�2䦎o��J~qu�$/s�$!%�2&�:C.n�������o"�=pDJ�h�e�0��wx
�,:ϻZ��s�Z��^��"���?!��ۂ�L�}�f�"x�CX�"aEnj����7҈\\���5�*�=��IJ�+�Ҏ��q�c�	�	D�/��2Q�?N�S�S&ⷶ;U��p�(a7�c(��PW!K�!�ш\���n�q$Q�QоV�AѮI��&�
�|�c!���ϟ�J�oh�N�C�2YV�"�L��2�G��k�GXE�A	��X���퐊n8dI��w��^�8-n�^5���S������bh6%����4A�Ja� g�!�&�PT;�X�e�=J�$���7�`0-@�yx(Z��!��w�s��p˪A��}�v��B�(
ɥtἯ�R�	@���p~��1��ݿ�����0����C +O�s���v����Fl;�K���hk���햅~�:d�_j)���[\Ɩ�w������|&��
���bb��S%rTs̷��*��<e� � �I@x��(�G��aF���g�Ǫ*B�X4�*Hi��;�Ẇ�[@Um���<�X�)�X'�/^��Ƕœ�yK��Đ/՗7}A�2#O@��)s�ŻP�
�c�/��Q�}�
�@�;��렑
�I�~�c�;%]��,�zvޖU,�X?�$���G��3����6�!����v(
w�'�Z��D!�=�T��M�ɩ��$���~x�9�	J���`��V�����2�wZ�4_�$���m˒7��PI��T&���^*����b�7��9C��[�A��0��þRb$Az"�$����*iY�ˏo��6�|2#!�v�uN�:��OϞL�wy�T�>����Tb:�X�����Ϸ⹧��WqW��B��DV�}GLHV�	2���w(I��_(�x�sJ�ӥ�����]���h�g����2���Oc�f˧{�U >�{��� V���	�����c�*���=�yL'�M�g{�~K���{��l]��n�N�%���wU�ճ�i��5��>yz�A��S�^g�������߽{q����y0֝)�fl�9�S���\��T�}��*��~�0�L�'�t,�~WB�P��ba�oI�co��t�m�+S8�~�e�㬡�;d
��7���۵���Z��ΛSbb�C�����.��]��v��՟���O�7�3'�e��&�E�oҴ��r��T:�1�‹D�Y��+�v�����W�o�ӕv#̚
h�Z#kƹ�����g�u�'�WF����)��`:����t :u�)E����t:��+4������]�!�)ӹ�Y��b��z�Ε>G��I��'�k���9������z�^�P8���Gi��,���=���>�e��i�&tY�c���wrK�׷�d�Ӈ��c>rp�_-L7*
���:�a�ďߝ��?;;7�!�1��B��xcPmHuG���O^��O�8���Z�9Ni��[���f��o�}�`����=��#����s�;8��@� vDv�4��x�Tۚ���|ݐe.&���X>��]I����6�(��D~9�k��o��L��:�����;nN�l?<�����@/5����W_�	l	�I�����O�Ao��S-K���;JO����lZ5P��D�����)]���bc0:���5�������C�v�����N�(Pt�8��F�U:�UR�J���+��j�|*��_U^���l�+1]�g�w\�rKIv��~oIC��6�H��/_�s�βIJK�#��<��}z늼`��g��[�u��`�s%ބ�i-}��ﯙ��c!~dc�Wg?���~|�����+:w�r�Օ���GlZ�旿^;$�Q���S������ݭ���:|�K���(�U��%n�������7���sS��Ƭ�\��yo��Zs9�0V���H!��v66�8�q��6I�.�m'���v`���ͧ�� ѶX=�1�Z��
�ێȉ��I�8
2՜��ʅ �hG�&���y��0Jz
s�`*˃~��E�̨���BOK[��d{�sn��qƠrr���6Y~��Ȟ�-D��"�!Ƭ]��|O���X�ۢ��r�z7�9^BG=\~�'|�kH/��:�Ò�ϻ�vo���nV�=���3�>Y��l����Y�!ě�/B�/�PKEePQ����9/pip/_vendor/html5lib/treebuilders/etree_lxml.py�ks��~B�GT"3��Cg��f�l_����s�4�q]DBc�T	�>5��.$��칖3���b_�]�.� ޕi�3�*+›�ꬸ#�����&�X]1��-+Z�"r
ﳔQ�f��.I���l�d=)WbjA�졝��ے�l��9y��u��0
	�*z��5M�9L�g$ix]n�ن���tִ&ˊ�{�d�#c��r�%Wi�Xp`���LMz��(�&l+�'��#��?�eI���	!Ve����$Y� ��&�V%���&�k��&���� ��E�0�����Z��2�mA&�)J�N&��A&Z���bI�Ts��m��PrNk����V@L� �LV�,�WM�T,�I���$t�˼�Y,���4{�xVs�YR�,γ�U4�#���i�)H�!k��,=�I�8�L�GI��+��@���	�G0����]&��wM�D����`���ɥ������.���C���US\5��O����)]W���M������8�c�;��Gҳ�m���V�e���p��9Yf�N\��L@�&ϯ��\W
���.�����77[p�0�=����_���g�l2QV)���ɗa@y�"�4��rN�8���\�j�ɕH�
,+�:�C���\X�l0��2����ls��� `�p@\�5�� �ih���X�æ�L��P��}Y8L����=����I��
V���.��V#�.��ta ���txV��G�:��)|���$�4- &�
Y�u�	�VJWM� R�!�[ʁ�eU�m�@i�dj�돬�h���U����AjgŪ�~�� *�n�(�4GB��/�y	���)_+K�tC@��^H���H����Ԑ7[�֔Ӻ�:�#p�
�}8�T.,>G�
���d`��P=DҬ��(U�z`@W�'@��"լ*h~~}ާk�����Y
ۖw�~܉���=��'�Ә׸���_��|v����9�!D��VX��sv���D�c�����>IȖ�����J}�4C��y�y�瘣` ϔL��$��L�!/fs��Y
pP��~ט���}/+�@�[�aa��Cr���S�9�9]{�P�s��Ԟ�rp-H�D���.�`.�[� z#�� a�"9�Q��(M���7���ѴnNo�bA^�E0���aVR]�����I�r��Ã܉��pg�m��|1���"=*�̖lB��~���#����a�E�����n5��`�j��}I��r���]����b|�SsZ�7�N�:�lS�KK#���Acu���Ue�
�뛋X=���vV�f/�?���)��u�뭶1G��xܷ+߉���&{N��:��z�y8;��av���&�m�̖�LH�@-ʻ��|�ϋ���
3\>�S1��`�tFٳB�����aGD=���v�v����0{�<�h��:Ä̆�J���a��y���9bu��M84���w�
��p��Yv(̣s��ȣ�N��)������� m�*����D6�)�6D1E��MI�{b��mMåکR��G�A�[�a��V��4������;AMVH��\�Ul]B�%�`'M���C<>��|R1灇�I�~��h`Zoְ��r�3]�X C������a�v�u�f������Rt�R��	���f),��Rѩk��κ]�Wmc����|��D��D��܀#.o4C����������$�S�C�5'_,::�L9�X��C=bap��G'2ZqQvG���Z&�!��#�n��J�LLX�
U=���]����mUybョ��IJ�V����ׅ�ѯ���&��wo�f 3�]��
.b�\U��/8C���b��t��6*E��Ku/;�T=󞌪��{�١\�Wm:�%�F��mg���7�&}�Iɪ�����{���{(3'uv0���<:�����RY�s��v�$��z��ݭ�16��ysv^O�)�����jۯs�C��7�?��q���]}�^f?���i@��o�2<6ij�$�<���S�@�K{l�0
hF}�S��~�z��}���?�rT�@�(��wΊ���ɘ���j�Q���0s����T��.��f𜱍|�F��z�Q��h���a�T�.���:=�܊j�#7�ϖ�^,�,���wM�$��[i�/͝!͈��:v%�u�^p�58���{,�[>�Z9��e��z�u��f�Bz�T~�r��1>w�(����JJ H��k96[`b狝9`�gkZ�ϲC�����
_�C-x���'��6�;�(����� ��j}���^�%ê�͡է��V�*<m	��SPn,���n�Wr�GL9����?^����!F�d�r�sa�ZTC�SK]8���UJ��HB�U�^]m�q��з��
�ި�]���P�Tҗ�0]=e��n�v���q{��:Q �~�%h˰s'e��Qk=p��C�k��!9Z�8�H��7�H���ݟ�V�޹ƹ�ɤ^x�Im0��)�!z�oNo[z��ýM�߽�A�[��3�u;f^J�V� %�PqT؞��j�vw.
GYF]޳�ЗJD���
:����~cW��~�Z�$,ې�-��{�0�˅���m��N�p��{��m���e�e�M�K=�{3R������#�eq�#�ڱ�ӔZD����{�qLi���ؒì,fK+q�(u"/���x��{c��;q8.hdぴ��w�TO�w4+�9T\/6c؉�o�{B���w�����>B��`[�+zY�]Y���|́x�|h�u2�ٛXh*���(�?���L�8W7���ՃD/�cY�C:��`~�S\~�Qg���FE����^��s_��Ҙ�
A����V 󜥑����,/�L�4\��̣>�ԼJ\��伤l�{W?"��*�?��d�n��:��s��@��ws����i|��z���Q��Ja��9�¾�D�{���+C7/���NaL��-��\���噼9%�^"�	��U���! �{Eţ�[;��Nn�xg ~��2<��3�rANEW��S90|��	zq%u(����2-�̙����=�WSBZ�oW�
+؄�C�A�d�����?M�d����T_pj����L��4D5rvl��C�2p���`�%X)�3��ħ7���j��%�@�rc��*��ˏ�ǟ~���y���o�WWW�>���~�֐R��b`�K�a���刼۱`K��v�2r���Xh�������T�*��
3�����Y/����y]��e���L�V�f. b<�\�
�F���'��,����m�Q�
����\+�/��um�2Z����@�aоT�	��䢇�4��h����^Ay���?���}�5��Z
�0�'	�εL3�Jڅ�my�-֏�-��$�����N�i6DB���iL�![�>_ѩ���1!�����=���*�k=m��3��6A0�PKEePQ�vj��W,pip/_vendor/html5lib/treewalkers/__init__.py�Xߏ�6~�_��8��`�c�(��ak�5�:\�@g+�Y�,�Ҭ�>R�o;���wI$�#E~��a�b-%���
�R������9�B��s]����\Y8�Tl�v\ղ����������׆C�#x��;�
���o���<V�3ˁ!Ñ�ϝ;?�=e��vO��U��:i&yJ�uu��'<D�D�n��wЏX�{rT�	��l�b��`}|)�S$p܋x����0FK|�w���� ��1L�q�x�2V��C5�0�m�S�l������#�b�o��)��^�w
��N�F:Ҕ�y���3��Q��Ma�4�v·��v��A��`���n��M��)�Y�e�u��ׯY�Y\—�A t�"\a��PǔQ��������G���,���gN�k�'��x*޳\�¸�*�pvw��v&�"�cn��`l�G9�R��A8:�B��
��e0-Š{>�;4z���(u�dA��"���C��4\�
�?�r���P��՛_{Ah���KO
�Y����3m��X��i̤8��BblY�!:(}TT�G�|�n�8�{�B�[��d�t�c+�6���o2+R����u���㙽@?���!��Vʺ'�����l�~�N���j��9Хι��"�>&O��L
W���F�ט�J�0����8�F5���@��uM�A�V7��(<��ڄ�1S��N���6��\6��HyU��ݱ,��s��X��/����)��^�~�e�˒�-���R��vv{������h�R�q�7Zq��^�b�^�2���v�ݐ����|(�÷���#F���E}��D�r�޵�}
>|X��7�A�?�{9}��D#	q���o�;_�,Oi/2Nj�b񫓋�.���~�J�^�	��}&�݄wa���¿�=�Y��q����_��=�q��QjC���m�vL��|N�	�-���oC��;�D���
4]��2�ϭ�I7Cw�دp-*
%̲p=i���r�� C��	|�/�礳���*�M��cצ;H՛��?{�y����f�x�T�'p�훷�;��ʩ�Ճ���bSf-�*@6+,MԾ���7�Gn<���u,q��s	�)��;�}�Y���Q�o�̞�s��Oq@޹a�O��mb~�v�Y~�l��y�anýŞ�id��>%&h+>���KG�·C�@Xw�!�@֍���\�� R44��2?o����u�<��6��~�2/��B��<��hҵX��%��K7éS��P?%)��XR�	G[��"�^+>��uo:���MAj|�s�M� N�&#�6ǧ��D��(Cj��d�%C�3��9��y�Ԡ5�8�F����1\�P��@h@�+���o�3*��#�S0\ng�tO1�QM>u{I��⌨؛�jm�u/л�)�=�a�<��0�0��UO�z����J�>{�O>���N���dLj���y����Ϸ7�~H��/B��Y"6��I/P��1���eN�rR�jũ�H��u2Vc
�2��߰6G����0R�yG����y��%�����u�[3�7��lӻ��c��|��u?1<-�Y�90{]�X�g�v�<����M&%8�sJ����	,��ԧo�\�Q���~/�QҺ��b�#�S�_�GU�>H��PKEePQ!-�B4(pip/_vendor/html5lib/treewalkers/base.py��n�6�]_���W���",��m��NѸ� �i���Ȓ!QI�"��sx�H����ż�����*K�d>_���|N�v�f��e�ƅ`s5����Ɉ	ӈ�c.XF���VH��6G�	LDm��a��&"7�	ݲ|GC���mʣI̶�GD��nhFC���s� �1���.N?��Lg���x������_ri�vbvO/ޙ!���>�����ŧ�?�H�����O4�a�L���,��ڹ�<�$A��f>�^�M<-NcJi�q�V��fCO՞V���ƓZ�hr�v����LO����W3-��/)O�j;C��˜�9�,p�.��Pi;�q9'�!���O�D�7,�!�L�	�O�
��dCo�.�~��Btp=��^��0�{$]�X���Ǟ�/#����	�Q���Hʣ�Ԑ������:^	�l-���)�0ϦR���X�Khϖ̧%�d�(�8J�ow*�Y4ɲ4�PN��|�*�%�hR�DA*c�;.6R�5DkB �r�f5݀�RMa6�2����d�1��M*�6P(䛏N�⻨�Hv�����v'�gt�5-ˀ�"�"�����Qƒ�WPaX�=&�d]\�{�@Y���R8/^�@g� !�![�T��)O�`�
�|Y��.
���5dK��m�d��CR&`[S�X�j�BZ�̮k��Cʁa�MZ�Q2*�B͢-��i�^�Q�����@�&���4J�k��iɇr���8XJ"��*��?�L)�
x���
F8�2�/;#�\j�y�U�ߡO�k$���`84��PU�$�t]_��h��˪�k���
�Y�2�`_�6(�ˊ��6�&��v��ہ��PO�`]`"͂\F�N�K�`U�y�4���bQc
=�],�%�z\�~��W��n�9999!�9݈m�[̗�D���A>^R8�u�j�u��k8w	�\�2�ڇ/E.H��W�/G����V�uu=l��<G
x,�4]����i�}+�A@pZ�L�A�⃇�X�e�\�&J1y>�������'�Oo�g��/O'�r��
�
�o�0��z�)���W��-��8~\��Wd�"���-�����q�C��5{y��аWA̒#�����"5�|�-"��V�wyYm�>ԅWL:������9pdV��R�
��~Cr|�$�U\�t�G����S�zJUѧ)��^��SE�X*��3�ZG��e����C����m��[�3E��jk�K}ݰ�l�&�`�k����H	f�ed(3t��Že��Va���:�mF�$��A�Z�oiQ$7Iz�5҈��U�
ԿѰJ^���vk��������%�j�P�5��r��qn	��[<�yš��k�P���r�!�����yO��#5{2��7
0��
E�|)��́�./�Xܢ)�25_X$��}?������r����Z�+$`ȧ�/��/+��1�/zA#��릩�?k�C��-z���$�*s��s�I�����mpԏ�M�W]ue�l��h�6G�N뚔Y�^��^��e��C��ȋ(k���kٴM�~ԧA+���R���u��R�V��b�C���D��}q���{��t#U��QT�˽��u=�8ޤ�q��N�̀������	�UY��zd��r�.�CK_C��B���
�!Q��Ěl���f�&{��~@!��VW*5�����'MyPA3��8QK��[D��|Zn���ƍ�.�e��M�nR�#vHX]�ސ�m*{#�)����ko��Q����PKEePQe�o���'pip/_vendor/html5lib/treewalkers/dom.py�T�n�0��+x�BP�CV
�
8rӢ(Z%D�$e�(��%ij�b��A�̛�7Y��BYVv��e�Um#���NAv�Ǩ`G&YSc��,o
�8S (��W�����~;�!�������J�R�D�+��C��;�;!�F_��CzP�gP�t�2.}	�Ĩ��1����Gzj�VVI�I��}L�,��g$��c�Yt��Uh����}�݁�|[�_y�
�m�
L�X�|� ���vc|Vm��:{��t���K2�xd�Fy7����6�e�T)!�
��33���.#�3�|�k,��A��p�~p��'�|�{��C��8�E��m�Ʋ�9�w�%��@�3orʉ���k:�]��ps=��GU��\����
=�Q���_��!_��^/L�L����Qr���9r���a��34��v�[��O�ߟ.�gy]ve*zO����.oz1�1!�-�����倝QxS�L�c�z�H���^Ss��PKEePQ���C��)pip/_vendor/html5lib/treewalkers/etree.py�Xmo�6��_��_�N�v��z@�8E�%)2�`d#�m"�Hʍ1�ٖ�R`�6!�e���ޑ����Y�,kS+H&�T��[]��@�|�X&6B���X]��� �€�R{ޒ0�RJH
���Je� ;��ܐg^�*N6Pd����o]�Q�X%f[A�s�\������ˬ�p�SS����<�W���Wl����+!!�
~�y~
�7�z��������
�ZH��$�P:ϫ����c��ӛG�Q�}ۓ2����[�f���c��Y�Tr�����2#!�˲���VZl�a.<f�5��R�8��J��E�!;�p%����O�]0�VqeDZK�v2SP)�m2�
+{/è4%�Rd�ָ��k����/�����>㚙A4�"��Xb�_Я�K��`�c���l���p�A��a�]3/��Y����)H��b)���w|���#�O�ȓ)h���]?~O�K�W�7po�?��>Ck\�&@����ҐhS��Ɇ(v��(�bG���\�g�$�f���1O�t�A.#��o� C��3ǔ2���ij��K���~`)��4m�������Y��6���Ӣ`���{�ڧ)�������ƨ�F$�p���a8�
Sb��KQ�&Xsm�-����9���	��8m�dO�N~��]Γ뫫9e�
�]�D/C���o=��X �ѦS�x���?>�~��$���D�µiS��_շR��YE�Q��r}���8J�2=����?0�2�踁�{uN<��#��n���^�C;�&�:���[�ث�(��v�Ҿo�M�Ɗy8�b;�H8T̚��1�AW<����fm�*�J/�	Ah42]G���@d���c���4��
�5��L
m
B��x�ȑ��f0.#���q;�' �Q_��]�`XK{g\�^R7�
<��Ӝ��g��w�{�Cm��I(��!�"]��ҝgBis��[�7Uf�?bw���1���a՞�X#��y;�y��8�
�B;vV�GO��4FI#6-�si��tg���(����^��P�
L��'B���� cǤA���\��b<�ѯZ�Q�"kx5u��m�L�Å���UЙ/�&7!;b�G#�����ذ�ϔ�g�I��O��E�����}��#I>�{T�ퟪ�n/H�?��<ܥ��>��e]�C!�<y:n4�c�
mq�%�z�L���絿B\؟4�J7��F��[E�
PKEePQ0Dty�.pip/_vendor/html5lib/treewalkers/etree_lxml.py�X[o�6~�� \t�0Gh��-��
�i�yh��h���Ғ@R���w�)Qv��e�Y<���w��F{�$�JW�%	���е*D�Yb��I�\�"��*�i��Dp�$j�A���qr`yV�X�c���Q'�T��K!X�H5"�d�$��y�k!q܋f�iɘ}������v�M$۲cYc��ʚ�f�}���b2�dlCX��J˙�n&>|C�DE���7��x��K�	�br�i����wG�j��QCDgi�M�J9����N�ؘ
��PzV��kl�=Ix�u���9�싯b&؞���u�j�>%�a�y5i״<u05L�Y��|S�<��T�/�}�nL��bv_�H��r�r��x�1AIN�,�.pe�<Mx�}��Ii�O*)�(j�1e�&��3��k!e!}K��7�#Ƌ���[�n�/�(f���J�"��нp@�*�q�`��Jtn��6�cSdڬ�(͂�0���;M�|f�@���=�Ȫ�hA��f;��z���u��M�\Jp�@ǜ`��I�sRGq��J�F�� 
���V�g_��D�����g�t�j�|�t�e�M�3�h��'�-�
�G��*]͈l
i	�[�U���V�w�ƘK!����lN@�\|xҾh��m_C[�QE����Ĝ��þ��^���Z�,9��k�g�h��8l�%?h,]6a���	-�3
�XK9���Q�8�]�UM
c��#;�T��:cG�2�R��L�F2"W��?o�m��3*�H�Wg()�__q��^�M�uQ��
��-�>�%b��J��y��E�R3�⹞`��)�I����#�!�q����,���֭�����^��^�7Wt-�-��l�s�]�����n�t�.�͉�J�r�)!w]UL%���C�W�}��,�!�@=�`��/�.`�����x0+3?!B��
�snF���]W�t���װ�c� U���[��ap�UhI�)�M�S��ZLE I̥�@�u�E�g䥚��JpC�r񴜻��)o�m�3���JV�iͽ-l�߿�����q9��TPa�k�������<:#���a�{�:qD(��nӑ�𾝞1l@������=���[{5��=0�}���oo�%�E��4�o��FП�o��W�x�-�?O�$6D���K7�o�g�Y3�B3�9�'R_f=�=����� 6�f��6�+و/���)�"�a��,�R����(B`i>7d���G��Jz��i��@E�0�2[<j��1�_�;
�ٳ��$}9��	�WC�Q���ǝ��y��?��
�~�)�V���f�v������0�W��/l:9�4�izڋGX��+ÿ&���ӛ^@~%������ \*���
�.�XxF�_�w���2��:�\��V7_�qe+.�MAĆt����(��ڿz?��v&��S���y[s2�����|a$�9��RP����G���pW��)I`@V)4#��5K)b5�{��i�0`���@�/�N�<X��Ӵ�N��_��������� �Mg���G��4���z�ԯ��d`Z����׻�6T�5M?c�L�B�R)S@�v8m����{e���u/��
PKEePQ_m�	*pip/_vendor/html5lib/treewalkers/genshi.py�U�n�0��+��0g��: �,�a��v��u(
C��T�,�����m'�k{Mu�%��|䓔:�(JK[E �.,��ei1��qFhŠT"�	FRX,�4�IJ;T�Q�b]���8�{.~�����ͷh�جo��5���2�u�~�m��h{SaT�ze�Z��z�����`y�٬�a����
��2�+k��-������=��q�Ēa�������f�|�yn$���R��(0(�f��;�R�)`�@A�hxB���=�Um�ZJ�$��“����Х�9l��T5�S̙ui�qi��u��F��fu����	�5��x(�����^�O����zo)�mM_(.k����Y�Ȟ���?u�q&���S���gB%�p�D'v^�d�y-�n\�w���x��Hg��֝�L�K��*�6V�y������$jc��۫[��@ek��%rdܝP�g^�!��Y����4�w	z((̀>G�����z)}�Ns�X�]>�\^�w-����w�9��}�.���/��ٌ8i
\D��}���9]sn�M@�rvy�nBm]�wj(�y�m_Pz'�Q�<�{:g�2V~������R8*���x�JX�Ql^�.���B�e��Wo;�����y�G�Ltl��|M���=�{D��R�b�I�T��y�2��T@IN'�PKEePQG\�3:pip/_vendor/idna/__init__.pyK+��U�+HL�NLO�OI,IT��-�/*Q��/K-*��ϋ��J�J�/J��jqPKEePQ�H���pip/_vendor/idna/codec.py�WKo�@��W,�j�$�|(m�����T��'�6��>T
⿳�ď�EZQ�C��|3��x��|���@d�r���א��S|4G:��O/��"
V��/Q�Ҍ��U͕\�ХY6I�-����z�g�7��o�m��f����M�EQE����FM}����Q��UCH�hc�b�s��,��T�Cۋ4��^�h����H�jK�+&uk+��;�
f5%l����ٯe
[�R;�	W��(
(-���:xX
EY�,G���U�ɋ�ZO��:,�o��l�)L/\��nW�7{ԇ�l����֡V�5�a���ƥ�q=7�Ҍ�x�
�R�Bwhe�Z&d|t��3�Xü��7]�>��'�&Er���B�@C
���G�#@�Z��c%��{����1
vA͂"�
 ߍ��Px��Gj�m^��]���J��j�l�`�x K�d&��m�N�Ԧ�3��O�F?��r��$�Z����ȕ�n���AW�F�/�����fP�_����T�> y�;���>�?�v@L����f[�����6�]��WG�Jq�[X�]��G��6�*΋~R"	�
��+�y{�l����@G[�}�R�[@��g�E�3��&�����+d
c,+B�l���Zf�:�����O.q�Y$n�\?��%�T� �h�;���`\�Ma�Z�2��~�ӛ�V��`�k�y�}��b�м`
O�50��2!5�I�
�;�����7{qݛ�߂n�:����<<�M�}�<H|��w�we��c�pM*��,�
PKEePQ|��p��pip/_vendor/idna/compat.py]�;�0��b��P��
�E@�&
p��H�l���ܟD��g��y3
G:, 3�Ҿ7�0|`�0҃��Z���\�r�%�:�>�~&�E�%��>"����	Աژ"���DXLm�]KǦ9�cL�XiVV�d(+�PKEePQ�4,,�.pip/_vendor/idna/core.py�ko�8�� �
'N�נ^�M�m��tѦ����%��F�t�����o��DR��ݻ��8E�{�3CF,]�1��,e9�a�C��~^RN��|*�!1'0R�⏼I`4�NV�WPˁE�&9�I�����1��4��jĘs4G�z�%�#}������F^o�	X�i���+F�"�1�՗b29$_�)��RDф�����z44���4M4�ҫ�5�i��'=
��U#7��S�}u�⌱�
>���W ��>z�9A�! YxP�2��X��V�@w�s���˘��X)!d��g�zIC��U�
dg�����B�@c0�c@���$�9� �$=���v���ix
�e)(n�����=@v�D<����(G��)
y�	{~Cl,�K	
O����$"$rmqd�X�a��j�@���˙`c0y�&j����&��z��0N�>�P�5�Jn��>+�9a�1`_!g$/X��4;�/x�h��!R?5*=�ᗃ����a�j�R��}
<+�G�~�m�|,M��r�W.)@�t��ӯ����oxcp�53�>�
*�$Y�7�JYðC?�ٴ���ǜ��.YA,���B�&�!��XC���68<>��\D:<��{Qܐ�v!\�$@��9��u%
? +b���&-bp�$~DK�p��©E��<!�S�>\�צ�%$�L�L��MĪ
���FF�bM8rIف�Zj����0'��Es�y��>*�czK�/p4�T�*%�,_�o�FH����W��A�J_' ��,�TR���6GF2��.�����]y�!�^�����fΒ�T���8	�Pe
cR��X:���	v�*ju0b��r�n7�yk��a�m��k�xnFrS=�ށ�;*<�b�R[�R�[�:I��kRֽ$l�?f���逄\�uyh��6����L}ߧ��R|���/���w�]v*D��^!�ZA�ˀ���]��<�$ʕ+�����<uy��Wq�t�eW[~�}2WB�
���6⏶_i��b�^��s�Ƕ�
Ac��k.&�J��i��S�H�א�+߈��ɻ���|�@S��;��wc�A���x/{�m1��n��km�ܗ�	[��0��{�� �dfQ�ޞ��]	d�9űN�	kdVJ�y���zg��ؕL�k�-��d%�$I5�uM�N�����7�|�AE�Ho���$���H��V�n07�*[�ה�2K8zK��|��~��Q
�ʱ���v+��C @�Z@��-�H�`���"1�T
�O��uf
�*�F"d �
Kk
O�Գ�]�^�� ��� [܉b�_�?JV�گ��@i�p8�'�^��$����()-h��}_�h��.7��?��E�ld�7l��!RN��{�0�}����q>^�ܠ�^;�
���(az���dB(�&N�r!�(A�{�y�_�<�%J�!P|���[KQ¤�[��6+��d��YW��gr���Ց_z��.��.�V�HDŽfI� 2�;}v��wT�L�?Z]�	z.%��0��ACh-2*��M�3��3�]fM�?��z����X}��Vg4�W6����5���h;��bk�5(nX�&�F��7|�~_���hyb�� ��ކ���*<�ގ�-�\��;�@�
8�
'��Dܷ�u��
N�"�63y����,�����E�#	C�+��,z�I���hIZ�FZ�i�6�f�D��PIt���r�\s�Ugb�|�	�%�3��}�l?�㐨Vm�G��	d�v+�����3ф�坊{N�g�ٱ�#����kۻ1N�uz��~w9�hxW��S��~����+��1���I#�V$��/.�~����&g��=�Mɭ���`�a��K*�/�[�,=�ިP��úE��9P-��}_&R&�Eg�P��q���tw��F���?�T�>��oac?�x�0�6]��u�E��Ⱦ��Wn���.� ��4D�t�I�i�c��@�-���9;h��[��;~a�qk�
gYm[��y��8MV�B��S�I'��t�A�uTm+�/RPUV�el/��fo��\Q������j��m����.;�_�QH(Z@��s{m���Lg�m�q�I�؅㰁�&���������Jd��k��[r��~��X81�#-�$E�jC�tE��>����Ez�k�i�kk������vu5��@�A�\��tRN1�7`h�ݜ���q6�5�6C��p����s�E���D�SWU���?��U�$�3���>I�Aٔ��ˏG3qo% �c5.�R��?� �ŕ��9)-r("��U�ˈLO%z@���)�XHj��	���B�g�@YRre��U��Ϥ��Myj��-D�P��P��?��/KC
�Z^���ʙ�V����c�:�.��rH&�Su��"MߠD5G��}�Lknc�zկΝMk�wY;��֦'�L�(���]2�(�Υ��PdT�H��(LB���j+�;1��d	h#;�M�4�'�m�;�Ƀ
W�(��N�_�>�5��԰����Y��M��)�N�*?Qɚ���tM��_&fz��C��\���r��vz�5ڵ��|�f.<���/�x��=%
�\3s�0�$_�=���ܺċX]]����~���YL!}��S�<�ޤ^�+n�-�W�E��<�H{����?�j66�v����5Y���HQIK�m��q�,$�6�L�8�`�/�n�k��	�s�˼�c�Yzz>�7XǞl��$K�m7�x�Z'�����"����}I��~��?�E���B{��lv�*=��\������g:���g
϶ޢ�6�PKEePQ׬J4o#n�pip/_vendor/idna/idnadata.py�}K�%7��^��0^������6��Nj��|d�<�Ԑd{F�w3/��Α��
��c�F���|��������.����_>���?��a�d�������/?��������_�o����~����}��_~�+��믾�y��O���I��O�߷���ۿ��O_����\���F�re����|r��\#ȉ����
rg�y2y�y"[8�����x�&��_Pvٙ��g���g�}�}p�x��]f���/�{�>��#~�	�OU�
tz}}�����"����~�s��gd�|���[�y�K�F?��5ݻ3��$U��_��%�r/��e����`N4����O���]��ͯFò��o����-&���z�ߥ���n�7��z��"�Q�x^���7��w;��2��m��j��V�����r3lyRO=�^��&��P�UڄWo~,��a��X��۸�T���e�W�i�_��^ҾҠQ8��&/�i�QN��ww���=��1����f��]z���1z����?���	�P���j�Ѝ��F�w�߱�^Z��ᷭ��c�O{�����d�t�\r���y �P/t?Ag��!���f��.Ӌ;�T���r"��,r�`�/��?��?~�˟���L��?��,�TW=WW#WW+W;U�~��S���K5p5r5q5sυ[+�6n5n�\\�\]\���pq�q��
��
�����o(\e~C�*�����70��j|Ʒ|�:n�\e~#����F�7V�dd~#󛙅�,��cTX'��u�d��N�˜c.<F�Ǩ�f�0����cTy�*�Q�1�<F�Ǩ�U���`5�v��N�.��;�l<��Ƿ�6�9�Ƿ�6��6��6����x|�o��5_��5_��5_��5_��5�gc}6�ט_c~��5�ט��v�3�����og~;�ۙ��v�3�����og~;�ۙ��<�����<X���`}�σ�y�;�����w0������;�����d~'38'���vc�so��G�f�n�r=]ŏ��!+�ƨ��������Z�Z�ڸj�s������⮘_��w\e~=��_����Z���ƭƭ̯���_Wد+qr�Y8���X8���X8���X8���X8�r��!�pR�*+Cb�$�71�����of~3���f�73���ͬ��?3���!3��1�Ka~ف,��e���U�0���-���Ǘ��da��Y؁,�@��=�M}�3��2�g6��M}�,�ɚ3Ys&Kr�$'Kr��L֜�N�w2������d~���.�w1���]��b~�����5]�4�U^�U^�U^�U^�U^�՘�����?n�j�ڹ:�:���JcT�zW�ޕ�we�]�ݕ�wM�ob~�ݕ�jʹsR٨V6���je�Z��uW��j�,�L�H�G�G�G�G�G�G�G�G�G�G5ٹ:�J.b�ŭ���,힫�//=*�5*�5*�5j�Q�F�F�F�F�F�F� �5*�5�`38x@�;��E;��^Y���]'����;�{��G�'�g�>��&u�z��������� ��?�A������� ��?�A�������(�G�?
�Q��������(�G�?
�Q��������$�'�?	�I�O����$�'�?	�I�O����,�g�?�Y������,�g�?�Y������"���E�/����_��"�׋�suR�_�ԣ���-���.x���2Uƣ�xT�*�Qe<��G��h2Mƣ�x4�&�ф�&�7�	�M�o����߄�M�7�߄�M�7�߄�yw�_�Z�v}~�_���U;�л^�^�޾���O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&��d2?��O&�槒���|p/T�S�WBPBTm�?���-����h�SB�?J�_s���qa^JpJ�JPyL��=���"Hyg�!4%����B_��[K�c�<dɹ	�c+�(ҥH�T�"]2r�
�^����/��"*!)!kE	U	M�0�EW��?�����Py4�GSy�3SBW�3fK	7��|b���y�ə�WBPBTBRBVBQBUBS�)�+a(a*a)A^��.%�<��é<��é<��é<��é<��é<��é<��é<��ë<���)�N�-�6��� ���MHJ�J(J�JhJ0%t%%L%,%�L��*���*Ө���;i�I;M�i�{wEڝ<�k�];��4)!+��St�z�?1%��u�>�Ot于ܸ�:h��������CGN�{�<�A��A��j��}e�\@�6a0a��G���������L	]	C	S	K	���é<��é<��é<��é<��é<��é<��é<��é<��ë<��ë<��ë<��ë<��ë<��ë<��ë<��ë<��#�<��#�<��#�<��#�<��#�<��#�<��#�<��#�<��#�<��#�<�=�g�/ߌ�ӏ�����W��������7�x����y-���O��U(sb"��d��IV��@�L s؅�KR�
ȕ�
d�(�:ȜGvM�9��:�lCOd܎q;�v�����9�v���c��q�q;��@��8ϸ=p{���3nܞq{��7g�9ܞqC�+�C"�$�p�00@d��Иl sFf O&/�9�("�(r�Q� s��ɐ���d�
�F�*��"D%��J,�Q%U�'�	&�`�%Y4a�%W4���"��I�h�̸aM���f�Ό;�def�Ό;w��B�Ό;7�(�ܜ��
p�]������]a��9��!�ڱ�u[Xc4���]�\弱
��V�׮��"��UU�K�%i�q�
��x�i̎Aޜ�����1<��v��1���A!�wR�$!�@�;LAgS�|�Gv<r0;2,L�n�N�1���'N8!�ɢ�Ք�v('�:8n�0�����r1�c�x,ޝ��΂`���by/�{1ndܺ���L/��x�-��x䭙� K�y��zxJ�=%Oɳ���)y��<<%Ϟ�����S��<{J��gO��S��)yxJ�=%Oɳ���)y��<<%Ϟ�����S�x1={Jo���oxJ�=%Oɳ���)y��<<%Ϟ�����S��<{J��gO��S��)yxJ�=%Oɳ�䑇�ك��}<�>�`��i��}<�>>���\Fp��pr<;9N�g'���٢!2����9;���\.�r-�9c�:�B�o0��/D�$�v����B���U
ȕ�d^��h��hЂ�P�2�Dߓ��
d>�a�|�F�Hzgk`�[�k����9,�<�}`k`�[�k��X���>�����>�Q"�@>r#`I��d<���P��^o�����z#{�^od�7���Fx�����7���F�z#��Ȋ�ȑ9B�#+r�������p�
���q��!✡���
ܕq����T<��#+�^o�xd�G⌏��
�l,*�ȑ}�� ���:G>%&6�f�:6��%bn>}#�ю�hG8ڑ�G;��qK4�m�m�ۀ����;��
�yn��;���w�θ;pwƍy'v�݁���'>v�݁[����rbr�0��ܘl w&��Va���d"O�g�8!X>�)N�$��w"�;�N�y'bމ<�D�;�睈y'.9��yމ�w"�;�N�y'bމ<�D�;�睈y'�1�D�w"���N���O>���"OGk��k�x�͸�T��T���"/U"�*��*K��K���J�J�R%�R%a��x���TI�TIX�$^�$,U/U�*��*	K��K���J�J�R%�R%a��x���TI�TIX�$^�$,U/U�*��*	K��K���J�J�R%�R%a��x���TI�TIX�$^�$,U/U�*��*	K��K����Ļ���+�	;P�w�>N�b�`c��4��m&G�Y&2�G��E}�?�dG��8�,�*#����nb��"�B�@�����f��<'���H�y��!���!~���O$v
�o�']lT^��R�=)lO�QyUV
yU�^�ѐW�����o�o�Dzb�<7T�
�����-o�(����� ��;�
;��O�l�/����;�
;���[� & �-���i�Z4�}c��2-$&��z{ȳk[@�sZ���M�^ �#
��Lb�I��L>�5G�2�u�ĥ�#X���AL�#�����6٘<@�L>\�,�U�?�O�7J�}�?�X�#?k� 3���5֠�����/lk���5�X������Xc
kl�
k�
����a��w�
k���56���y�P�Ϊ١���L>쬚��Y5;T��jv�f�H�fg��A9˱C�:+[��uV������cǗ���C�:����y�q>��L�#��ߎ�};[͎P�W���޸��4ذ���p7� >)u㾡V��w���X�u6�˷Ί����Y�;,rg�ܡȝ3�5X5�uV��`��jV���6�g:X�FD'�l�6Rar��
^�up@� V��`eP��S�
V�el��`�6`�+Āe<�3X!b�B8~�?�	ܓ�Q��o@O��	V���[��5���d��P��
1��bB!&��t���g�Ly��}M��O�'f��
1����
���;��4y;h�}��T��k�N��O޲�\��ۉ���G~������!�<���N�YX���>g?/�Y��vU�ŋ�y��}��_|��ϿxX�BX�%��%�xKraKr�����~����ѵ��\x/ڂAY�^b��Z����^.��m�1��LZ��ᯛw0����^��덈�;T&7�����f��F���o|�#�B�#�ovXo�)�l�oX{9���_w&�qg�	��.��7/�oX���fn�'7��
ռ9��n��o8"w���!�r��q��2��q�n�
���,�v:?�|�"c��D`J��;S�����c���v�	�t^B��N�	Ed��
��Џ�y�x	d���H���F	��gݲK����9B�#.��g��!��#�8�Xtxb�u��B��$��8����Յ&�w줄��39�̯ڮ��~�_w�g��uy	���++vY�`<��;��+���
B��R�w���,Г"|���˿��R��<K:��(r�E9�.%�	�d�����0'̫�:�P���x����Uw�&'�D�I�/6v)��&���޹K��MB����5�p��K�c�Й�S�[��C�I̥���Ϊ��aM���%�/�|�r	����=�Xa�.v���竿뢟����9�=n�G�S�K��'C��8F�A'�
�/>"E�ǵ9>C]~�'k��:�C�H�y���l��(1}�|)sK�58˻����k��x&�]JP��K�j<�v)a����5��y��x���L�;�̆�_Rn�X2�,��ܰ�]Z��}\�%�a9���_2�~IqX�%�ay�$��_��~���_��y�>�������_R V~yW� ��-y�V� ��G��?
��Q�G�k�V�(�#�Y��.إ%��/�+��O���'���@��K��u[��u��?m��p���me�4���_�(V~I�X�%�be�T���$�be�}�?\�M�
�K:�*�/��*�/	���;���/�_~���%�-64v)�+�K�Ū�/������X���/�U�_��Հ�	��M�7�?g�=�]�s�+W=-�s%�c�+y��q��㰻�K��An&8
rr�&9ˀ���]�w��u�����.�;�K���/��?��5�������˺u
�����k������?��)�'��:kM��%�5�_�k�\K�p-�ښ���0�5f���,��d���
��_�a�k>�~M�Y�/�-.���-�o�ź�_֕��[��/~�z��\���$�f�>�[�j|������ﱞ�Swc}�k9�M�+o�g��K�<�>��a:lb:���u\wY��qM��`�s�]�t^�~�6����S��>����Əd(Y'~��S�}�{��� ����Oz�wg��K��|��%_"9�G3x���w�R3R�E��&t�}��9,��E�{��]
�����Q�O�~*�a����.���U�
tz]�LЗ��Cg�eׁ�	��M�7�o���
��>ց�XG�
���o�o�߀_� 5�7�o�o�߀���	~~��&�
�%!kt��������.�;�w�߁���C��׌��C���������?��!��O�?�_R���)�'�O�?�
�	�S�O����;&�/���	��K�؂=���q�����Ǎ~���q'S27���e���B��Y~։^"<ҧw��
:�/H�إ���]~��G�*�u�~��~)��߿s'%M�Z^�������9~u�̉S�%��W7�����M�<��_<W��Ň� �|Hn�w�	�Gޗ���EE2�[��d ��|I�'";3�O�w�@�BO�g�Ы��&��♠/�߇�u�����'���?	��I�'�O�?�	���O���,�3�g����s�������,�3��y���
���
���U����
���U�W�*���W_U���Kb�s�&��Kpsn���&��7�߀�	��M���K�Gv����b����z=
=�����
��nB��OЗЏ�K�8���)�%g�8%���3g�8������,��E�g��,b?�g�Y`?����Y�~"g������,��E�g�����]~������,��E�g��,b?�g�Y`?����Y�~��"���~������,��E�g��,b?�gɂ?���R���av�@�B�O����v��.��E�p�.b��p�����'��J[�Z`W����Z�~��"���~������,
��d\�f�Ӏ�����r3�o�o�߀��O<�w鿣�.�w�/	4�C>]��!�.��3π���/v)z2��C����R��C�2��H�K�7[��&��1�#v��A��U�S�F�.�Џܚ�k�$�&��K�8�g׏�%N�j����Y(L�4=�]r��k2+��q���Y��R�NM�����K��R�Tz����w�w��Wz]���t��4dH����ߟ��]��w�KIE;�5�nl-	�6���u���8�]&�߇��~���я�~���K������w/DC�z���[��1�h�<
^#�_C�K9��:{O���>
Q����A×χ	��S����Z�v��إ��+y5,ixv$�i��CԿxF����h�+��+nи��A>�n�{�/�W�xD�
��z��{�8
��#�\Np�m�$�*>�]%����%��&d4���}"q���U�д�NCпx�>�R�*Z�p�M8*Zn�*쮊�r�U�W�3�BD�<�}0rs��� �aW�Û�%l�:
Op!�[��BBCц#+s�!����N���I�~ʮ
G�.Į񽗁s����׽O�TK|<�n��vU|D��|�epu	ӹ������C�䝸1�D��.E��4�	�yJ��.��y��}�N�������	��:�ϸ9Sk�~ȧ_���Dmx���`qix���k �4��\�l
�RN�~ �$!�=)�QQwΘ~J9/!�N�v'��)�A$�87��Gww9�a�9�՝駔�@��zF�9�s�:�	
�4��E*�6�6��ML��x�d��򧔡}��mBB�Ԇ�p��q�
^PA��u�S���k+l�rv�&4���/D�p?v������!=J�p����*x�D�8D���D
!ƻ4m8
'�/:�ϾK�nۄ��a�N0��&�J�	Gw�dv�4� �c����nBD����.+��r��=a&O)񾫠8�nqge�����x=W}K^���}ޏ&>�&44�6���*�v��]jW��	
M�kТ>bo*��/��z僝�YN�yh���Mh�1���L���u6�?J��\�M�hM���L��6�j8|�۟�ӠJ��]
�Q��������	~٥�}ܝ1U��Y�Ҵ�T>f04tmhX�p�z�x 4u���	�߄���
@UEκK�

�tw���Ną{B7��.%�:b�A��w2��Q8<wO8^n�x_��Ň�02���g�l��ᗱإ��P�l��K~?��%��.�:��g����!c��Ȱ	�4�k���Ԅ�����c��8�KI6�4�v�Е��|��K	�nw)�d`h���H�%��ۧ�r�$�vxȻҐ�i�́���e������M�_YAvdr�R�"$�KL�C�h�������ioi�+?�)�4�v̟Rn����d�7��M}��wY���פ�5VO��fI��%�2iCF���	��JX�̵�(>�� ��p��ž<rY��_P�Ue�%�F����^
M��>�h��HظeGF��{�9
�.��pb�{�+p�K�O��}/}x���g)p����/�����Q�����.�o������7�N��	�
1���$����,р-�'��_���PKEePQ�c���pip/_vendor/idna/intranges.py}TM��0��W�X�JD�����j��V{C(2K���Nٕ��;cB�vs���=��f��l���P��VZ�R9<��9t�Fz�L��qh����N�-��ۣ��V��Aل�,G�7\��C�
ZTN8��]�pԦK��:a\����r�G?~̠(���׆�*{���{@�fga�
"}"�_�F���7�m<-;�_i�O�םeE2�,��8�K��F��ꄶ:�U̒�O�=%@�^.�>�H%��R�W[G���[��W�U���vv84dH��+�2�e�M\�N��E�c�b	�5M�<���j�C�'{���:�k�`�:�cA�JX���#�e.����n�[��%�@k)W�}|�����_���f�ǭ�����3kX�~��J.�ߜ����,�'B��d�~ϸ%n�Y��-��әy�]�S?��N����j��+�)�he^>1�L��)��
y�t¸Yn���E��9�Yve�D&C��`T(I��B_OO���-#���:g��^�
�ܡ<?3"��/���b�%�_-�SH��L��X���N*��x���	�̠A+�|FbQ�����dAE�L���!�^s��_���ţ���$l~�3R#m
{R�uXKᐮ�hP�,I��{�J�@�mT|-9�ؗ,��c��F��@w�{y�PWd���Q�N�i;ǒ�����m���=6Rգ����V��ݤ�����h_�k������PKEePQ�k� pip/_vendor/idna/package_data.py��/K-*��ϋ�W�UP7�34P��PKEePQ>3IV�dpip/_vendor/idna/uts46data.py|�W�ו�O�V�LSӮ2�׌�'�dfD?�}�}otDw_
D/Z��͝@Yx���`ˀ�A���B����G���X��_�1j�2�d����k��r�?�����^x��痕�]��;o������]�꫿Z���?���w�n�O~��7�x����ח��s��Y���\��_�Ჷ�g���_���^~������\���}���?f�G��,��,���?)䅷�xm��O�g��w���~��?���/����G˾U���ﺾ���aُ�~��w=�~oY�����ݷ^_�/<�ˮ�Y�W�����|�wd�����w�]3���
�w��2'����6g���]��u���"+��
!�R��"+��
"����("+��
#�҈�8"+���#v5��#��<b+���#��<b+���#��<���Y��+�J���ق�TlA��lA�4lA��l��G�ʣb�Q���b�G�ʣj�G��<��_�Ͳw�j9���⟰��X�,����ϱ��X�<���/���X�"����/���X�2���⟲8],~�����WY�-���|��u��oГv-��� 8�-y��� �wX�.����� �_�8��,�����b[wk���lݭٺ[�u�n�n��r��r]l�߾ZԨS�Z��^��^��^��^��^��^OlAjڶ�z���~��4��kX�5���5�<V
+���G�ʣa�Ѱ�h�԰5�akP�֠��A���gD� �[P�5[P�
[д-[�؂��mAfr[P����G�ʣe�Ѳ�hYy��<ZV-+���G�ʣe�Ѳ�hYy��<ZV-+�䉇y�͖��ZMb�&�V�X�I��$�jk5I3��oWX�I�f#�X��X��<��?������K��ַ�VJih�b�6MzU��J�Ъ}:�r+��
0�O��,bq#[�Ԋ1
aC�heo�($�‡���:�v�?��=���A��fy���GX����<��c,!��Yb���f6��̶C��I>1��S,�y�4�Cd������AA�cy���Y���/�<��.�b944�rhh����%�CC�Y
]a�5����r�:�!�Q�C�c,��i�?�r��>{�2�ͭ�ɭ�ɭwέwέwέwέsɭs���+�6�ɭ#ɭ?�m��[�[WQXyV��Ga�QXyV��Ga�QXyV��Ga�QXyV��Ga�u�`�+��+�=����`��	�����)~0 ��,�
��jVxQW���
�R���	~�^�g���\#�u�'�r�*��5�\�pr� ם�\#�u�'�r�+��5�\8�F��N�1�zH��k���C��8�Ɛ�	N�1�zJ��k�� re�P�,D1$N�$C�8�W��_��X��F� ��*��,�	�A_�]	�����*�!�`\���Q%���`�jT	qϫ���E���n����.��W�mp"�
?�`[���W	�MP�,�'�	��Cq�Ug��~(��*R��;��ʇ���Nk��!9���Ӛ3{d?wZs�i�ŝ�\mDN�Cq�5g�H~(���Z�\ŝ֜\k���Ӛ�krw겅QrwZwr�C��N]v0�C��N]�0�C��N]�0�C��N]�0�C��,]1�C��,]*1j@�C�\��'��*��e��*ɥ��8�	��Cq�.�5�[�P�jù�Fp��[m8��n����i�����-1�f��G�6�t�A�I��t�m���& xۏ��6��m���! T�[�j�A����U�c�� �[�Z���W�
��h�ׂ�Bvk1Ø��1fi����r�oA��ZA��N
5�#�h�9Z��o�j{kX���-�X�4	2�H��˙F	���%O��V��ˢFI�'+�ފ�WoD	bQ��
I�G�[�[�Pa?�I�0?b�(r)�(
5��5�0?���Տ.	p!�]�B�4�����W�5�hB�ғϩGE��U	Ñ|]A��o�j9r}o"Ȝb��X�9����Y3�$�>�9�dA��72{��7�z��1�vKH���!N�cq.u�^,N���<T���I�d^�'�d.��B,�إ��<T��%$sy�(u�cq.�含�k����P	����Fܵ��EE�G�a(�?%�* !1y��
HhL��P	�wp)�����ͬ�b�o�`k^�\��������`�#xs@��y1r�7W�r����V��k�\����+�Z�&v���›8�#[xs�'ydon�$�l�����-��S��<��7wp�G���^N�����l���\�-�h�'Wdo��l��c�\�-�yB��+��7O	prE���N���<'�����8�"xsH��+R�7G8�V�g=�"kws\�micd�>�# �ӏq߇�ݭn6`����h��PK>���'��c#��*��҇�ʂ��-q.w#wwk�WY���%�����4T���B} \���Q�%��;^$}kL�A�ҥKO���Jʝ�3N����f	�!)�I!mi��D4���6���A9�Jy���Rt�K)�H���J5��oW�"s]*�+���n�㷫�S0e�7Qy�rsP��L#���!n25R��fU#�����K�U����U�F��;�5���lVi����֡T�<���E�C��|��sXiv��Ti�@�N����`�2PSi���!���X?� �ζ�4�c��N��vWA��z��敖��H�}*U�*ܧ���|*
A^��K`5�@�W�*�Gz��k z�i-�~T@>4 ��*��}:! (���">e�����mq`I��m����0ZI�"n����+ (�v������"n���J@P����"n�q{��U��eK|r�yA�n��R�3��H=i��32Pj��d���D�
�̴B�yfL4��[�[��9f��
p���n
�]��؀����!��C�p���[D
��	p-2T�OprE��)N��P�>#�����X�U���J�U�@%�Vt��+��&�U��RC(:9r7���,�m}�[�U�:��,�e�*EpͿ�K�L'μ��wt�U���lD{g�� �;�9k�L�N1S�+x�;[�Aw�	:��]@��wv���S@��wv	��[@�ȝ=���W@��w�	�3( h��~Acw�v�H�}vQ@��gC��>��و����.	��첀��Ϯ��쪀��Ϯ	��캀���F}|6& ��qA��= ���
A�1��"�vg�X�J��n����^��>��~����U`��>��}��X'��^�c���,U�V���<w	��rsy�`ۍ*���9&�6�U��sB�m����s��,W1������b.ϝsl�\�\�;�f���q8�C_E���xס��CG\���Wѡ�#����b.�q*n
a���7q�jr7�prm@��?N�� ׻�8�N��j�Kk�wEW���Xӽ+��wŶ��]1;殄	-���cߕֿ��:�w��w�^��Uߕ������w��w�]��Gߕ����]i�["WFH͎��w��o9ɣS}W���3SŜ����ܜ�*z�wū�93Ut��WsK��?���� V�q�+^�-C�b�]�jnM�h�WK�\���+^ͭL�"W�Z��T�]�j��+r�wū���Ud��Ws�*V%����%V1��x57Ŧ�Ոwū���ն�`V���Am���b�=	��v�K��I�Ӷݶ*�ݓ��m�mU,(�'�N��~�b-�=	r�6�SŬ�{ݸYEU$r�\�D�8��UK�n�\�D��8Z���"gsO���T���'���l����G�r6U�l�u9�*r6�č��M9�{�F]Φ���=q�.gSE�枸Q���"gsOܨ��T���'n��l����7�r6U�l�u9�*r6�č���U$k�uɚ*�5�č�)IULI�'nԭ9�b.�=q�n.RY�{�F]����H�č��HU�m�us�jH��_)�ʵ�L���$�V�8��f+Ր���'�J����V�5$e�`%_C6�ZV�5�a�`%_C��FN�H���,�I��[8�"�r�'W�X��������\�U��W��+�)�8�"�r��'W$P�����#�\�2�L��+r%�OprE��)N�Ȏ�?#��i���8�"r��'׊
�j�p}.��\��q��"p�W����~}.rDz�ϏQ��"�J��'�`�s�&J}~Z@��>eT��??+ �f��N0]���BF�sQ
�o|~Q�1$�}��>.	�>.�>��>�
�>�	�>��>F@c��q�DŽ��胍j
k&�B@���m����w��}�����
�����XH��~v���[/Y��Ϗ�+�V57
��R@5��S�%tjm;��V8�r�[.T�v��z��-��2�#�"ɦl�9�7��<�RG2�*��t�0(�ă5���2;���&�5��R��m�V�Bm�y���Πh��s
��6c���K�7+v�f�]Ss���7k�9u����,qפn/5���*o��������ZX���G��wX��0�ga��as�3�t�h�-�Zn=h�M�j�r���­���f�.��='�y�V�s5���M�l��v�ӵm��j�wn�ȯ�v{�lJ+s��!���EQ�!�������2(��s��%��;��=�Z���m}�e���~d�eM=q��$�JO\+��"��V����v�M?<9���@�An�!�Ó��l3���~�������T��%n[��j� q3铪����TmuJܶI�:ф^��#zœ;-�W<�P�����&5'���]��3�\�v۸&
�H7n�8ߙ8ߙ��7�;��f�|g�|g�|g�|g�|g��wvc���I�n�8ߙ��s��L�N>.�L2�]Υ%Υ%Υ%���K
�]6dN��K��K��K�l�L��K��K��K��K��K��K��K�gK�gK�cJ�cJ���L��I��I��I��Iݮ4iͶ�)c�����=@3�=l��=�������[1�6���_H�_H]�-mZ���*u�R�nC�ԍ��nܴ���v�M��i�l�
=���n��4q�㶚M�JSwM�6��L]�������������x���R�R�[kw��j;�����v��Iݐ���Ϋν��{i;�Ю�f۹��[^�vn�]u���B۹��K��k���kN̮��v��v��n�*�v��ڮ{�v��v��v��vM|�5�m�|�]��v��v�w�u}��t��t��t��t�n̹�9}��I;�!Y�5�m�ķ�y��/7R�.��Ȝ	f�3g��3�,�:͜]d�.2g����f�+��9��ϙ�ϙ[����6s�W暯�m۞��;��U�f�d�M(enzJ��:��$X�v���jֶ>!k� ˜��v+��ϙ�g%˝�]]�\]��˪�.�٣����a�n{�C�V��.ϗ�j����-wB�t�)�H(w~剭���ɖ'6���k���8*��]���i�*g�*g�m�m�*p�/����.N�3�s�F�<�-0SxH��p�U�¹����
q;8c$��D��W����6�*܆��N���t[FcP���fs��S��A9'v��ݶ��L쵗;qԑS�X���e�n��m�
7g�hP�C'�:	che��K���1���
�
��͆#�~c�–@��vl��/w]�+���b�rbp���WU`i����#]E��݇7��]?�H(��rW�0���3�rW�R�{��h�ߛ�U4�+��7��Ȭ�������\73���G�N(��*�2\}N�u�Q��Э��&{�)��{�tb������؅yQ�?Q�`(�lcQ����Ś�E��b�U�bw(QY�咝Q��G�KSF��SFO611W�oL��c��E������k���EQ�٫��AYԹ�y��J�^���s�ݲ�U�JÚhT�{�V��JQ�
�FO���U��9��А�hXQ
4���Hwa/\��z�Sw}�����fQ݋�^8�i�_l��f�p�ͨ�02j�Yn*j�q��Q�u��V�pFY�߫��z�%W�_���e����@��K�E�"7�)e����5��rս�O�h.�u���Wm�� e�	��f�U��{E��j���6����g�"�^[��Z��-F-7��,�W��٪������N�-w�aY�����J�{yy��XV��C�8-׉�7
�,�W��"�&�x�����Q���0'��'ޥ%��}��&7��+�:I�>�I�7�^�i�\G����.�+n�'�i�J'gI��q�̨�U��j�$X�I	V���M,-_��m��`y�%XD~DIhɿݽV��Am���٤(ڬ(ڢ��UQh���vEu��@;!��٥�L�nE�gz�(B<ӳWQ�G��ɞAE9�~E����N������C���Ê�/�I	�uT�uL�u\�uB�uR�uJ�uZ�uF�uV�uN�u^�%{=�S��"�kH���'��FQ_�R��"��"��"��"��"�kT�k}�)�1���P?�R��t�.�>��A�
�F~�)ʰ�d��x\I���(pq@��m�S*��
�	���P�^T��K
B
zYA�??Uj�+
B�yUA�9�)��
\�a=�
�d�-�� ԥ�`A�;
�.�Ut���Jn�)XQrk��nE�U
�J�^aQ��+�ۻ[I�zTK�
|�D$��.��YTt�SXQ�U+J�|���EBÎ[����8=�N&/�P'|i��z��1�h���
s;'/��cf�� �aZ�����tL��V��)G�`�Ji�2l$;�[�
(�Y~
�ގ9ʰe�J�^� �d������BH6�+I��W&��8����Y%qg7d�\o�'\�U���+�)���h!5pĬ/(�6�z��[����>"\�3�2D�z,S�`��i%�}.�)
�D
��sJ�\�S��|�(HՀ0U������ ��Z%7B����$h�m���L�0:����V����(ApzI�"�S=o)Cl*{ߗ$(��
�~>���'�B#r��2���D}ܚ��g��bɱU�䵕���=ح`�Z�"j�#��֧�܃	&�
(�g�`S��k���{�/�䵵���	Z�k��C|�;�䵍���H�Y��wDyoU��Q��yyG��NE^��[��wDy�U��Qރ���#��"/��^l'$��jy��VQ%zn�?�9��=�ʟΜ�T��^�h�c�D��g4�1U�gX���"�D����0�1U�'Y�^j^�J�yyW(�E^���"/�
�}U��w���˻By�)��P����+��{�������.���^��uu��%f������zy��y]]�[fRA���Żyae�}]]�?�9G_s�x�s��&�����=�5�[]�?�9�Q����9�����c���.ޟ���(ou���Fy����?��$^W�g2�5�[]�?:�S�z蠟���)o��,�Ny����A�u�[��?:�S����y��V��y��V�폆�딷�o:tޠ������۟�7(o����Ay���'E�
�[����
�[���c�,����mf�"�[����1�89���O\�1�89��۟�c`qrt�Kx�q#�(�gK���U�\�N�dT]|ӫ�N���w[�F9�ҝU�R)���Qu�nEo�sLtT]�ۂ�,�J�Ż��eU�.�'�c<r�'7a|�E�@�,
x�m%��9�8����A�[U����9�8�.ן	�s,qT]�[P����u�ܖE�o�r�F�e뛺\btα�Qu�n��(�ᨺ\��mYDy��uKt��c���r�Ⳳ��V�붾-�(ou����c��r��e�.�3�s8pT]��7z����W���m{y�!�1u�����Ӑ���݆��ԟ��ѓE%�]����千�'�ԟ���e�=�����݆��ԟ�eYQ�Q��O�ֹe���TQ��O�bƲ��֐٭.�(o
��6�Q�Q�2��t#.�Ӑ�m���!��t男��%��)o��K�՝S�꿗8�;���/qbwNy��^����V��Ĺ�9�;�<9���]T��x�w^P%���ײ�*Q�6�-��u��J�Żmy�"�D]�?%<�t�1u�K$�9
|L]�_�����x�EoT0�<�B�G�W*��w+B�5ޣ�1ޫ3X��{�a˸�
��~\�Eӹ���7+��oQįߪ�_�M�^Ϥ��<���M.�?���qH��"~�E������Q��Q��
?��`�q��"~�"~�"~�"~�%E��ˊ��W�Sŧ~�xQ���	5WLB��PseRpB��P&'�\��Ps�L��	5W������MY�W���1���VCs˺���U�+�
̽�����s��&��$�=�&��4�=�&��D�=�&��T�=������'Wˉ�%qKa�&W��܈+r����r\s1�\P��qѭ���eN<]�ĥ
�F���[_���_!'�F\�[��"���\�{,D�3� #������5�g��h��B�	���4Q��&��i�H�&��Ңx��}g���,��̎���*?d!U~�B����T�Q��cR��-�>OX�|�w�����Ӿ3}�w�����Ӿ3�wO�Nf�&�wrM���Nf�&�wr]���Nf'�wrm���Nf'�wr�ք���Ӿ����L����Ӿ����̞���Ӿ�x�w��\S��hІ,�ɼg-s�
�ڳ��W�#���r�

z�H�0w�umɑO�_�X���t!�ho*:޴�_�3��ƥ����Ze!�t����eP�y˼��6e��m�w��^�2�ӏ���\&*B��h��KXHH������ݯ�(p���{��2��m1UA^��Z����'��A`f�S�QNی��\��)���9�5�E9��>fr�=�O���'��U�1�e��=�3��*#�<��Ƀp���XYDC7��R���C��q���v�E��>�ۺ;)�,��[�̄��5E��M�+���7����QM��Bj�"��:~�C͟�V`W��E�_([�V�m�'�ri��(DJ�VlRd{�eQ_1��v��غ����j�"�|(����2PeQ0\�SZ5�]`S�eQ�\.�)m�.�X�\=����%6c\���)�㸫4�������Bn�ϯc����Bt�E�T����\��ˢ���z���~��Z���?dY�HUA�k
B�+�j( 8���dQ~� x�G��(
��G
�_zFA�k?PB��4;�Y�HAhUb�r+
:i��I#�Niv�H��F��4�중fg�4;i��I#�Ni�V)��
�^Y[�%�>A�T��I��e�� (�A�*�xMA�C5D��MAo+�;
�Nq�ہ�,
���>��щ�܉ű��-�*�ۋ��/��gE@�o �W�-�˻���c��s� 
�E�ŗx���PTzWQл��-�k8"�s������_T�.]#I~pB���� ^��F�GT[�zFX��ɭb)�ZK��#�?S��-v�qa��ۯ)	^��[���s��/�����[EXLr{�/���;��0z��� ���)	�'
B�K-"^B�����������A"İ*m��Z������	�YI0�/�(	��b��P7�L*.R�0t���_*B�i���QRt�kG��otkGʢ ��4:�ú����/
,����m(����.��������Κº�i`�T�� ���-�ͺ�`�5S����-/d`&�50dF��������(h��+	*4K���� 5�C5Ws�H�Ac�4KA
��V����b�\M��(���訝Fg�4:j��I;���it�N�)�it�Nc	�H�q��ގ
ltV`�����F'���"��Y�c0�׺��s��E6�Gn[�8Fl�hՙ���Pw�b
�V�/�	�t�.p
ۓ-�+Z��U����%�+��6�b��h�";;2��v+ظ��R�Evc��
�)+\Q̷� XoMA�޺�`�
�t�
�ݶ�)�R$�oG#h>>T��|}�����`���~4|*8�H%���Y#�k�2Xp�N�D?P:����N�3�Bb�A!3�L͠�}�nP�<�0(
�iP�=�29��˰�ʣ3iv��4#0#��$�w��d�njP�T��Jz��X�P\d�҄�b#��,�� ��zu��A�A��)J ��
�t_0�}� �%� ڗ
�dj��A���"^3�A��7�E�i�3�������6�zGQ
}�k�s���_}�� ��WA_�6(40�,��]	B��,]v��74A��CѩW����%��yYAh}�[]Ŋ�W���U��yMAhy^W�!�Rm���MAe?ST��������� ��]K�xW���_(������_)���[5�0�P͢�5�w�b��s
�jbV�P�:Nkb��P�	�j�!�S�:����5+�&�+��X-�5'�kMĊ9��yԡ&b՜�DL�њ��sZ�,A�CM�j"&�hM����`�q�[C']�/�;l��B+N���?R�������	�ȣ3����нR�γ(��D���[��nc��G/*œ��C�b�aE��qqDfa\���tY�a\���.^U����t]Q4�û�A�!EpqBQtC����GC+A_C+A_C݊���E��P�"�k�O�5ԯ�P}
�R}
�V}
�Q}
�U}
�S}
�W}
mP}
mS_�Q_�Q_[Q_[Q_�Q_�k�$,�x�Dy7U�CL��TD��RD��VD��QD��UD��SD�*�J�+r�,�~�Y����T�!E.-�F���%X�pY=�W�qC��:tR�voש�ӊ\�]�B�*�K��"���[�� #uK��[j!n����������,��h����6��?U���
���T�-u�p�hX���h)�9.��թ���b���hX���E)�.��Չ�]�b���hX���E�,����v�(�E0�au�n���5c���I�]�b�,�hXk��E)�2���)�]�b�$�hx�"/��v�x�Ey�gu��<1�ѰzԖ�w��VO���nQ�yy'���M�kS�a
Q��P��yy'��	E^�	�}J��wBy��w�6�<����9E^�	�}A��wJy��u�6�<��Ѱ�O�kS̓\
k0�vm�y�ˣa
�ݮM1Ony4���۵)�-��5hw�6�E��6�nצ���<^t�Ru<�!n����6�\�F�Ż���"�dD]��ة,�JF�Ż���"�dD]���)n#��hD]��ة,�JF�Ż���"�dD]��ة,�JF�Ż���vFy��w;�E���x��SYDy��w;�E���x��SYDy��w;�E���x��SYDy�����vFy��w;���V�6v*�(ou�nc����F���Dst	F�+rC��o����gT��L��5g�K�d~�c���dn���)Lz��<9�C�Bp��($�s2w�jY䔜���Q?9��\�:#O�|Ы����A
�*�,wZs��%(����9�e���ם�Ӛ�"���?˭U���,W�~�L�ьs��XN?sA\j�5�c����\M/�M���
E�IE1�E����l	]�Ё�f�OQh���AEM�QE��<�k�0���c�R�3�����V��P���O�w!�8=pYQ���EUJx��p�����5{��A��k�+
*�^�]Q
h��:�5EA���W*j�S��?�*ݠ�A�qz��b$�7�R�n<�*ݻST�O��@�q��V$����#�8}t�"��*	��'A_�FA_�6)��Ϋ�@6q��j���A_+��.�B_C�A_CC����Z�1�o��zL�����ځ�7A_ׇA_��Wa��u�UXI0=vI�5f^�_���M�bn	7=�[�M��\1������u��(
��Y���-�fV��b��j�.�:��vAQ�2��3;U���q��̎��j@�Eq���N��X�0�S�!V;�콨(�kf�������V��͜5��5sN���͜3�}��
PeL������A_�`��bƸ����h}�g�U�+�-c���ӊ@ZE��bv՘���9�Z̮�z����5��:���FPA_�k�*
���Ы���A��٭�.c
���㊂�f��RTҶ)�۴�b*��65L�ݡ�
�-�;�(��v�*1�2�{B�G["���Q-cV��^s�u@U�Q��j��)�P��8��Qmn05x������=�m
&ϞR#²��3*y��̞Yz[���E�g���JG�G@��R,Θ�}3�k/foh����7�"`�in�F�g�[�]�4ͭ�������k�[�5���p1�47��,���
�����܀y�и����U��X�?�J+8Ƣ�V�'���j1��[����ϭֺ������A_��)���!�����!�d�U�R�c��cjg��;�Ƅm�Nh�����I}C�0��q����	�.�sCڽ�X�ܐ�;��P�/���Av���Nc[sW�b�¹Q�Ƹ��Ԗ�f����c]s7�5�c��
�c�k�[]
v+��S�����J;�h����������e����к�
�wi��1��=�E�;�
166�W�n�L8?h^>گ���ce��	��Ԉ0f6�"��4�;�?�~����O���l�@>D����k:	���k0�1����a���i���
�0S|��yC��W0[|����0�6V=6f�ϟ�6j��4ÄY��#�X������󦷍��Q�@�kT�z�͏i73��Ǵ������f�Ϗ�}a�m~LC�$�ߠ�2�~�&��� ����1�|~B,��'��ʘ�Vi``n��:"�,��a���T:��V;�U�W��%Cӎ'u���!�
w&�������t1#9�1�٫���}��B��jw�)����P���I�<ٺ�ς��ޭ�M�G�+�B���^5սF��t�ad��Ɏʓmy�Y��`n%����ț�]��-��T����a��nE����"�>�NvU��Q�={{a���>E�T���"�9�?�{_�+�~�#���p�%E�k��� =ۻG�կ��P}�j��Q���A_��A_�kQ_kQ_�Q_�A_�A_�A_��A_��A_�[A_}*(]�wX��wD��wT�%�sn�2�w\��wB��wR��wJ�էf��7d���MS&���y
G��9���;��껠��S[�}j�<��Om�N}�-��>�eΈ�S[�ۡ�
�I��ݦ�v�]�4���#EԼy�Ȁ��P��"[AO;AO�Ѯ�)����܁���]��TD?�6ܠ�Ԇy�n��\�~P�G��4��xx�n�O�~P��G��4��x�n�E�+�xhI�be8Y�x|Hy7MO�*�4P[�&�<ϤO�*�*�ۥ��Rk1�)��x����k��#J��:y@I��D<��_["Nү��G��k��$��~��;+~Ǚ��saT����ԕa.�5
"���޻W��\�Y�o�� +��5
=���ݦ�Y9��S�4�
��1�r�G�򑕛ާ�z:����@��f�pW��	>S��?Pv�X!�3�J�o`�p��:�j�k
l�3�E����p��)�&ۄ�
����"��h���"�нKa}�a�Q��?�}���*��?\�f ���B���k ��F|ب��?^<i ����>��Lj/�>�}��	��ۭl��?��>�����Oͅ��^˝��c��z}]���w;���ҫX�c��c�r�u���q�w�1�������B�3�L����ٕ�7�˙����kj^E��Ʈ��L�;��}��<f �9s�1_��}��a �9�i�������B�sÇ�>g��U���5F���#B�ӛ��U���s�
�>g���B�ߌ�:��
��1
N��\o̡�E!s��>�M5�B�sA�w<�����G��1Qn�FE����+��+��U"�"8oh'�Wb�:�|�yE�/R�
�c%�n���V��όkJ�El]I�ȸ�$ČqSI㖒1V�����bd�
a�B�X12�b�� ��s�Ѝ����l�܆&Yc�64���g�W�>�V8�q�V�1w�;�c�84A3ǡ	˜9M��qh�0f�C�1reT�(����!�QFt����xNQ�W�)
���L,Q�W�)
�*�8EA_e�(諌�}�����2~S�UFo�����MQ�q�ۑ�J��ʸ�ޠ�?Ȯ!���p�>p����M����#}a��1�e���^�q�=g�d�/teG��s�>��#q+q���B�/tRi�0����/t�n�0~;�6���c���*.��<�Sl�����(�1Eh�7�W�)���+�#Y]^"���T)�t�1�"d:Nh]G�cv�UE��.�"J��!��kd�L�z�+.�Q-c��Aml0����a�A�nE�}�"f��(�*-�1�	�K�(�?��z\�Qŋ�G���a���NE��9�[�bk>9�mY�ҎG��wcJو�阢T҂0Ei��>EA���0C���&(U4^����k��T�x
����arRU�5�M�j���IU��03���&&U���FA�U#�����A�PMe�9I�u㘔;9�
��׎a�kǰӵc���1�w���v��^;ȍ��{�E%AuϿeP���?Wt��;�	����Ê" �,1Ai�[�&(Mu�s���n����4խ�=v��V_��/��/(j
)�N���K���T�eE)��}�Y`�[[gl�9խ�;LuO(�\��a������%�T����q`�G;Z��L
��1�T�6p�s�G[1l�9գq,�ǜ��dN�h[dN�h�dN�ho
�&L�lW}�h����z4�������
 �K����[A}�UԗZeA}�UԗZeA}ixVP_j���[P_�K,�/��R[.�/
�Kͼ���a�l������.q�S=��zƍiT�"��LYǦ��5�^32ճ��JWE�7¬t�g-m��s�/�55�f�x�J]���S�5z��҉��t�eV�eM�������q������^��`��E���������rAO�9=NA�^s�|�{Uz���z��1�JĪr~Js"�(�Xw�/ 1s��l�g��/xl��*�;��p�T�9��-�؂\U3Q�^�s�q�j5ܕ��R�
��/��?���X�.<�@��B�1���e�^~�^��5�Pǵ�F�Y#�^��zA��z�������rM�%�,�����]]��=ĬBcK����.P5�lXV,!���ˀ��*1[���K��8��lg֘�@��ٰD��>=�D�^�fg��/-����>�
Ѧ�κ/e���/������\ݨt�*�
Ê��^F����ܧz�JE/;�DXa���!e
�>�~�&��q���z����-�VXO����Ri
}�k��-���f��$��pUR���*��V������~�V����[xOs��^+�j�����f�����\���'X7����V���+5��q
ܨ��3��W�6�x½-+Ɓ�ܾ��%טp������/b�8dc�j��%|]5�k�lX��G��Ѫ��@�Pc
9�$2�XCN?q��!�^sJ)kș�>�D#��^0��@�O����
_���Mu�oa%Y*��m׬1x��X��c�uI9�p��cA�uǂ��a8��XPt�1�p��!��I���
�u#'�FN8ڍ�t0�9��X:/�輀���
�����*c/����K((3v�`o�$��ޗ�\�(h�9C�*���$��'��R���b�Qz4b*oZ~�Y}lP�s�)i�Ċp&�kEA�/�o�����U��b�q�9�hpv�	3(T�p�̮
3�3oI1ru����o��a�
���1B��!A������
	
~��W~�$(�5C��^4�y-UQP�+�������
iC�����fH��+J00�ү�-�b��(��E���ޱ���R�a\�5C`f�M�bHP�j�~ݐ/g��2���!8r�x�?kQГ%1~� X��6~֢�&K�)���^{�j��
�
�[m��W,
�z�"��gQ��[˟S��O(,֏���z'�}_7�~� hΐ��7�$��uC�!��7C`^��:�/�%����!0/C�N������
���k=V�?kQP�O~�V���z�Պ���g�ze<���,Bx�m�w_�������$0��қJ�b^~]I��+�(��0���;B0���ރ1�W�
0���*1�K%A;&���k/k[����0(�Λ/)�{|�E�ro.~���~*�ait��޷
	�{[�㼿0���yY�:�
�;�s^�N>��Wa�UX�y�q^�e�Wa�UX�y�q^�e2��B�Wa�̫��g�;�c�����pq19�`8r�(p�$�q��I#���Ƃc'!��NB���0";	aL8�B.�K(�3�B�K�⽄05�K(��E�T��"�V��;tMI��*�6�UU�F6���)�������h�\UG���+��jʢW�(���EU\ݧ�nS�q��"��OY��ի�
tʢW�Ud��)�ڸz�"��NY��7*���z��ެ�˻FyoU��]���+��Q�;yy�(�݊��k��^E^�5�{P��w��>��˻NyR��]���(��S��yy�)�����)E^�u��"/�:�}N��7�J��Q��+� �=�!�1{e$�G=�;f�,�����c�$��x�Ty��G��;��,����q'�E�u"�$���z�:w_RoQ%�D�I|eU�Nĝ�WQ%�D�I|eU�Nĝ�WQ��Dܮge�Nĝ�Ry�Y�$��w�)�'%����o����#��H���c��H������H����S��H����3��H����s�\n`�·�.(rU�Q�Gy	V(�ˊ�+��UE^�J�"/�
%8��K�B	N(��P��)�d�6�R�s
Fn�=����
�)��f�68��˛���jE^ތ��*��f�6�^��7#���������%��f�6�U��7#��튼��
�T����mp�"/oFn�{yy3rT����m�"/oFn��yy3rT��#�#�A��>rk0rT��#�#�A��>rk0rT��#�#�A��>rkpa��G���yU��^%����y�`���QE���(����q�e�C_V���W�uk����E}t�`t�_���n�n����m���~�����ڿN�1oiuo����r�::]6]�WG�����|��`��_]��������b���u�ms�"T������I#��u����"JP]�;��,b�R]����"�[]�;��,���u���ˢ �[Ǖ��yk�� �[F0��g���:�ċ���WR���ya���	����V�zАԝ�\Q����"�A��;ѹ,b�אԝ�\��kH�Nt.�X�ՙ�㚓F���\�rP���d.�(�m�B���n%����E
��*Ev���
ց5�|��0\�����(�� �&��j�+�{4c� n��n�"{jҬ�����t��&Ͷ��,r�H3��qMZ5��`Y�*V�ᾱ�߫ն���E�,	}:�}�����2����$>U�T\f>�O��Փ�����+���>iۓq��k�$�{��m�_-q��@i��D�gE�Y���4^�*g�i��W���M���3��٫��ޜQ�w�=�EP�:�~�^����fR�B��"쨴�"쨴�"쨴�"쨴�"쨴�"x�
�aG�
*z�B��"쨴�"쨴�"쨴A5�]�7�U�.Ćs��e�����܅x�EE�א"�kX�5���������������R{���)���+��FQ_c���qE�ׄ"��"�K���ɍ+A_W*��6v+��6�(��6�*��6�)��6�+��6(���h�A_W+��6�Q}m\��ڸN�Q�zS�7(��6JN.M��M���͊�/��	��U��M��]��C��S��K��[��G��W��O�5���گ����q�R_�~�ԗ�_)���WJ}-�_�u<5���*�&.�J��K�Rm�R�T���*�&.�J��K�Rm�R�T���*�&.�J��K�Rm�R�T����rr��nC��E�m+gOr�,E����uɞ����TE4�
�R�M�^R�C!�@��P��@�{,G����|
+¹�RK�C�䔮a'�c�p�ـAX�"[����3߅���(�a�2e�D8,�F� l�0��=E8�q��"(��5E8�{�"(�d�"~i�"��۳[v��X"�ԹiBN���mJ}�R�3F��C_�/+���*��V�O�I���	�������M����{g��v�W��U�U}�]�;�R��UP���c���};a'�˪J�0�v\v6��	J���n�+�Ά�Wa���,��٪+�g�lU�èW�*��v�	EЗ��\"���K��s�ճa����p��>��X�?�����.��g�S��
������+a�ZE�~�*�zDf����P��(�h�Ʋ��q�[8<|H_���V�P���"��#jD��Q��e��{�bc����2��O��B̓Z��V~��EX�9��p0��v<E��M�%�t�90{M�k��ebj��ҵ[�ev�����Ohnj�ٓ�.��V�,�ۨ������	3�ίPT:�V��U�����3�
�J��v]\�uc�y0�B%���4h������i���G�!N���3�oh�����\��3fF� W9�]�)�P���v�u�Ӓ�(B�C�"a���>m%0can��L�o�;�--�3�թ#Q�犗!ɰ�H�ά��D��Z�Б(�٠������.�k�"�$}�e$J�TPH��V�"Q:;�u�ҹ���/5$J��`I� Q:�Ym�R��D�cgA_;�{�D��{�J$Jg�j�B�t~�ƿH�Ο2w!$U3G�t~L#>$J��h�D��^
����9mS�(��P�E�t��vs�(��׈����R���̷hs���Ǐ(B٧����-A_'4�@�t��~�s+�b#Q:7~\Q���V�J$J�W���������Һ���טB_[��D�l��/$J玨}!Qj�(73S�#Q:���2�3�B�t����ًj�H�Κ�,�ߌiw����Ն��������_ц�ҙ!Q:�A{H��nV��0���D��J5s$J�Wi�F�t~�b&F�Վg��w#K2�����s�I4�D�t��j��~�p�{4�@�tF��-NN5�J{��a���/j��D��� QjcR�p�P��]�jmՔV�ϯ4���&���Q-c��.�f�L�QO��3�j�=3s@��6�$�`�̨�V��n2�ܮJ����C�ij���MV�ϛpK�̓��[�2����Z���}z��!V�O_�����깱�}n� ���`�~�O�X�>sP+,r� �r�ߣV�e�ӫ�/b���&
!��}zH�f�q�٥=|,q�T��
���'!�1���d�~�����P��g'�E��#��X�>wD���ϛ�;���5��N=�όj�%�ӛ��Ԉ��}v�6X�>�SK��h�����CZ��}~T^X�>���xU͡`�X���Ϟ1w}͞�>&��k�	�g�j@�e����h}�/��c��R��,W�^%JI0T6�j@���qE���[!�١��|�"���W��"��1E��C�1e�^RV��*�}��OF�!����� ;ѰH0D6}h�";ͮ,�v�`";�,bRP%�q�u��"��Q�8���ՎG��w�h��ׁ�;�Fs|�"4J�Z�046;|C�܍	Evvj���ܢ��Casg�)�8�
s5"�}I�P�,Bq�"t[��+����T�7E�F��{T����#y�#U��8�>��"t[��l1R5�c�	F������"�oV���AE��u|+�H��n�!F����H��asG>����b�{�"�q��o1-$�T�����aE����Ab�jFC�#U3{T���9�mF�f.k�����qb�jfܼ<X��#U���(�{�dȑE�]��U����cZ{1R5��3C��,�0�1u����J�a��j_��=�u�P���bcj��JEhq.����h�/�0��5��f��߂�&��bjn�V6C�
�S�����X"�]l��4�X��Q�ƚ掫�0�4wV�cMsg�50�47��
ƚ�.i��X�܍+���1�ƚ��0�!�:�"4R5r�X���ˊ�R�tt�Z,��V�Rdg�	F�����-F�����l��}b$�Z�1�4ݧ�#I��.4Ak50�H��Z
�9�d.�$m߮M���n�l�x�#�t���EH�U�n�1m�8�tJ_�#Ig�"qh��sʻ�א�'玩T0�4=qJTzC�fz��b�i�O=,�fz�b1�d�l���wP�4�l�,t“s7��0�4�i�"D�U�lڮ^��M�g#'窇�`�̾��U���fΩ�`�nN0�d�	�f��k@_cڽ�`�
S0�4�B�l6��M��5�nq>�z86����l/�M���!�ئ�2�f�i����]��0�4��"D������6����M��恈*�sc�i���xr�i#(�˄Dl2���.�wa��Rl��`�M6$�H��z�e�$�m�j����A�/�$�S#�H��q�6I��F��Nk���$��HҜf��$��+�8)�H��m0�d�6�$͝�ʆ�$�q$i\�KF���s$�_�6�$ͯ�(�#I�5}��$b$�&f���b$�ƎI�?���H�
+1�4Vk/F�̌�#I:|H�����i����?٨���=��
�I߬��I߬К���?[�#�&��؈�;0��&���E��
�:�z�"E������ �^UR���MU sW���(�KL��
>��eU�c�jdg�-|~����;��R��–�>���+�ˢPտ��K�\�9��/�/���/+	�b����/�*	��b�� �/�*	b�b�� �/�y}qRI��_�V�VW�_+��S_�T��u+k��~�ޙ)5���UIA&.?Ef�d�ʠ�͖Ae[,�ҶZ�m���nT��2o�H�~��^�be7��cT��2�n�ev�����o/��)ҩ_4�#���!��ets�^�������ÞNXݜ��%�\tsڲ�U纲6��{�2�԰��0�&e������y0�$��
%᫿Z�$���k��>�F��J	����*	��$����W�J��|գ�ӯ�#�+n���z%��~�N	�`��P��Z��KI�C_mV��������ۈ���t��Rm�����*t��ֺ�����̠����Dt*��p�˹��{�s���;��H�~��
ί�N ��Z��!}���\��h���F_K!ń����
�Z	$����<0��y����`_oW��=�/���>� �ДlQ�bv<��������T��R����X�snw�C�<�,";����OY�㛴��u�(qʗ'���̻4��+k��l���L��{C��}�6�yό̼'*�i����'&��L����<c�SV�<c~����߫��߃�ΚoG��˳����s�=��s�>�]/!3����τ�F�332�̜Lu�nݗ#�Э��y&:v_^��AW�{�sW2��*��':x_^���]�τ�����k�A��7@��}�ߨ�����=Xi����d*3���4��~^�Ԏ��+���y�ͻ�����^��^��^�߃m ���Le�_��{&dFf)؃^em2�}�����|��k�]���7�X2�̩y�k�}���{�/X2}OL�y�g߳Nf޳Af�����"3������{���{fd�=��~����';���=1��yOv��a�M���U���Ak����T.�hS2�f�<Xc߳Ef�3!3�	�y�Ee�C�A�-{��'I�e�=ج�\����)�3v���y�œ���Fc�MV7��3P�rHY�lXCt�0L�)Y��&�*�.��*��@վgJf����1f�̼gNf޳ �l0P5>%�D.�Ƙ�S2}O�qA3&����2h6�� 3�	�ـ~Jf�3!3������E������	����qA&��9&נc^�kБ�r
:f����)�bn�k|�l(�ICi~���ԗ�4�Z_�l(�3�P��Ҕ��|�4��}���7f��
�~�m%�o�<�8a�O��Zl(�7��P�o��4
l���4�-�O����ߐ�
(����B�i߅�Ӿ��O}d#K���wI�?ͻ$��]��]��w����A6A��?.A��?.A���K$����?�H��o��v�<��uI��}�LL*�y&�g�t�Rv�������A6A��@.A��@.	���o���I��}{�g��t��}���oh��o�Җ������|��p����*ogi>��\���\߼�\�i�����Di�ؘA�ؘB�ؘC�yL"*�� �"r�hL#r�hL#r�hL#r!���0�`\�\3�\x��D%�o����b&���bاdd�K�g�d��d�?:`Ȩd��bms�s,�܇%�i�p�kZs�b����4����f0�&��k�	q���{�ޗ������˟����{J.'/:�]��:QD����p�,[/�M`���6C���_^5�*�⮚@��ˆ���$3�A������ܗ�f��8�a��X3�}9��VxN��8�xN��8�x�����`���}U2s�w��W'3�I�c�k���h��)3�(^RO�qD�zʌ#�Ʋ3�(^Ҏ[�%��a��e�8�xŲ��=dQ4��qD񺽯��2�(����!��!���!�Z�!�����qD��G�=pD��G�=pD��G�=舢�/�l2�h�v��(Z{���(�$0�x�Ty{���ĭ�&�AGk2t�&�AGk2q��OA���a��	m �a���ft������?�a����J��\*��r���"��)��]��;�`�27M;��3���&�m���j��1��&Y�s�^�6S��$�g�\W��İ�UY�4c�լ�1�Z�TFM�X8ih���4j�e�t����)�������ș�A��w6O�P��+5�귮!��d]�����ɐ��,q�披W
i�$�+�U��E{��,��/���J��<�{��R���k�'+S�o����FJ��9����˱��Ҏ�����"'�_$�!�~9��(Uj��Mjm��"}��4%�s޾��}��C���WQ�k��JZ2G�����N@��wJ���L������ˁ*g�T�����E:�a��ً�%����Ձ
�dڰqp��{�o�{9���˹�NG2���އg����<�AZ
v�S�R�4�c)�q|����+P���SM�X��WK�]�T����T:�mR��LS�N�'K�Ѧ���]�ʧ��ѼU��kh���fO}�\��y+���~ےVwT�N,ej�n���m3�ྷ-�!w��\��7l�[�q������#cn��S��Di�f�#C~��=vP��B����"�^;Ж1�9T�ƫ4K�i���fg3�;�*���o��������.�N˾��eK?6
7�}л��-�jގ�ݾ^��
����mb�/�<�Q��0g�omO�My���Q���C�E�_��_(�/�P��P�ک��^֝-]�Z��P<Z�MQ�UQď��}FA��(h,���������`^9ڮ(ڤ�
�YQ�FQ�VQ$��rLq�Z�Z��:E�a�zE�
��@�\�E�����Sֆ/�m���C�u��ZgK�yK�u2�Z��j��NW߭&���5�Z�C5�%�y-�P�0KU�Zֱ�����{�R��'a��V���P�VA��U�����h�@��ı��V��PU��_���Ac�QA��W�NV����ɛ+,�h����
7oTq�:��[��7�Z�f�>�U��m�3��y<v�,�m�]��y<�������r��
�8�}����)C~��CJе=��%Վ*AvL	�>*A����C��Ǘ��0�����p�K;���w�+��\P�J�CJ ���s�ވw)a��o [��m�`��w�)�:%�'�S���$�n%\����!9{�J�S�iIJ�;�p���;2�D���fC�E2�M-���mja�ۻ$_�S!}����EWh:�BAp��W�T��P��� 8��� 4��WJ�sFAh� ���� ��� ��Q���*���)������.�NE
B+>�� �U�v���y]A��
!�l*5�� ��
�>������� ��?RZ�� �CB�"��W�\A��O}<�d@�L���Ӈ�=� ��Ae/**{IAP��
B��
�KzEA菾� ��k
�	�� ��7`�›
��~� ��-Aeo+�xGA�ǻ
�>~� ��
�>~� ��W
�>~� �п(&����l�����qQ
6�?t��j'�.aCO@'�v2�j'�v2�j'�v2�j'�v2�j'�v2�j'�v2�Z'�u2�Z'�u2�Z'�u2�Z'�u2�Z'�u2�Z'��(�����
�}�
�>����Q�t���I4��3q�Ng�1q�RQ��TϘ�:а"$u�)BR���"$:��)B����"$:�O)B����M=淐m�1��Dg�t=
,1��W�T_�aE�W�QE�W�qE�W�IE�W�iE�W�E��9E��E�א"�kD�uY��}U��}]�խUّ�n92�@rd��=E�W����L��*��z�\��xJ��-���5�h_kA_=�f.qc�C�
�6��QO���T�EPi�FEPi�E4��h����*�	�6�E�&x@UzPU���E��ᶨR5�U��ۢJ�p[T�����6ݢ�Ԧ[��YEԗ�{��RsoQ_j�-��nE4A9�H|������b �J̶��Wa��do���Ra��d�
3l&{�	���^uHN�j3��5���@�`1�f�__�'�UO�L3�'3H9N��[���^UaJ}��K��EЗ�eR�ԗZ#����A_��ES�K�hJ}i��R_�"1f�W]$��L�������M����͊��^u���Q��|��>�&�L��'�L��>
����S'�9*�}?a��d��??;�����>���<wR�Y*�:w�O�%r͓}��6w�O�%��N��3ȼ��(i�%}^%��5���	d��:���V'�yIg������V��Q��2�G.�
�7Z͐����2����J>�I�U��寿�:�|�o�bb��#�S���j����iˁ��G�j�X�_��]��1c����Bu~�C#,u}�S][n�C���e'�<.�c���d֑�O�*o���5�O.�������;n$�v�_���H`�@8���v�����v�4��EQRi.J�HI����ڼ�[��*/Mf2��O0(�����ΩZ(nd22���po @��(N\�O:���X��q����T�WD�u�}I��/����e_TA��E�6dI��%g]_VE�}YJQ�&RϜ(K���zi�撚��6��m�^g��E�9Km�e)����6nY�Y���Yi�%+-��I�}���8�����g��!0A�.�)������1��	t> �#����G>&�D�	��O	�\'p��3��"�����!��|E`���|C`Ϸ�|G`��@`��	�x.�%㹸�@���~1���x.$�x�@���a1��GB0�x..��\<J �s�����b<O��\<I �s�������j�Ƒ�~\�˞���m�"��oK��~[�L ����ߖ����t�@췥�b�-}K ��2��K7�<X�I ��
��K��<X�M ���Us�“���<���Z�� �4�M���T6	BNS�$9Me� �4�M���T6	BNS�$9Me� �4�M���T6	BNS�$9Me� �4�M���T6	BNS�$�'MeMO�ʚ �4�5A<i*k�x�T�إԸ�M����,]ʛ�,����:o�z.g% ����ͻ���q���K��G�y�;���-F�����b�OO�U�^���֥�"����Y;e���H�.�wK�e*�H��ƭ�lI��n�/O0q�H��l�zebyZ&�����B�H���,�u)k˗���(���S�/�IF���G5�'*v�,𣏕��U��$�}楆;e���i�Y�W顊�s5�|�"[��E�E�2FG_6��3*�N��U��zud<�#����<�ɷ���s�u�W�,;e����*R/��`�"�e��&�.�DB��Ko�Y�K Nu�ĩn}?�8խ �.�	ĥ�!q�~�@\��!�.���e�(��tY?F .]֏�K����e�$��tY?E .]����6݃g�H`ϳ�\"0��9�x�'0���x~C`ϋ�D`���B`ϫ�F`���wYx�t.���A<o�s�� ���y�� ���\#0���x�%0��=�x~G`��|@`χ��P�@XL`�'�|J���&�YvY���o�k"��&�{h"��6�
�}T��EVomDP�}���Y���#�W�ٸ�L�]�v�߻{^��E��GK�"��ήf��W�D���-��gwi}�Y��
����µ�̼۲/�FJ��fi��Ѷ^g�/�LI��C�;e����%�]�&In�9��K��_�Ž�z�m_�ix�@�z����?ڗ��(�e�������Y��e6dia����R/-,�R���e�z6œԦP��fÒ�J�JE����l��2����ljd#�;��x}}��[��~�R��Y��̦xf=վ,�;��ܗ��4�̋�wʌ�ЗE~�8�}�/�/��^+t�e6�3g<�~t��CF�#��#�3�Y��M�Wcg���̶o��P:���؜��"C�u��s���ev<p��[D�K|�/>_o���ۥA_f��#��ז�.q�2�w����;�䉍[���vi��V�J"Be�+R=\�/��%0Ap�)��	�<@���:�<L`��,<J`��1k�8A��
�'	l<E`�����x�!0��"�A<��s�� ���y�� ��u,e�Rv>��"}y�K!�L`�+!�J`�k!�N`�oC02E4���.%J��eF����VZ�9)��ܗ�%B�D�nb���j�}���K��ev�P�#72���)��6|_f�̲�K���)��k�WE��*���h�IUYD4��l�E��db=�db=�db��db��d��T/�;&��zY:M̵�;ev);��mb5�d��Wa�&�/M$��&M$�v�A�"���xp=��h��4�Xg_fǃ&«&�&�Md��{M6׳��{%6׋�^{\3i�qͤ�^H�{�/׋��H�7��ckU����QD�Iv��z���:�;:;��YiڗF��؛�K�6��23��-C��f��"*R6N��G�7�v|������x�+��7X:ȗI��T��L�eF���|ewQ�jMJ�ʪ}�I!�}m�R_�����精�|mw�}�I!�kER���f�M����p���eo�"x�����"�!x�@��*�9�k�!�D�.�������	��	l|@`��C;���� �O�� ���|F`���|A`ϗ�|E`���|C`Ϸ�|G`��@`��C02��Yr����;�d�߽��v�����s�}���}g�о�����5�L]Eޙ��)���'
��R�h�����:I̔YG���,��ě�S}��ub��:�H�
Իo��z���}39ճK�zb]�zb�v��.u�]��}���P�Y�4��oFv�m"fQ�ا��2��h�k���M:�p�V�kI��B��C���*=�Ji��c���*=�J�X��T)�+0����c��S_fV)M�j̵ïmǡ"s��H��|��YTg��-�J]웨����M\�Mb��&b�5�]6�'�����q��]g���y�߱��V?%d���2��g���9!���a����?2L�� d�����a�gB��_��KB������J�@�_2��7!ON���!>�#d���	��B�����!>�F��?2���	����3!��(<E������Hq��"���P�Qx�8
�AG�(�(<E�������q�{"��CO�Q�א8
G�fC�(\mH��
��p�!qn7$����Q�ߐ8
G�C�(\qH�;��p�!qn9$��5��Q��8
G�C�(��8
�B �«���&�(��8
�q��((�Q����)GAP ���@)�8
:qD�((�Q����GA8 ��j@ɀ8
zqĂ��ţ�W��|8U4%�h2�ؙ
e_��A7 �h@ŀr�"0D`P	���A!�΄["0�C���� Î��"0\�H�[��pI"�H$��D`�!�$� �#;�zDb'܎H��i�����p5"qnF$��ň�Q��8
�"G�VD�(\�H�;��p%"qnD$�…��Q��8
�!G�6D�(\�H�`����q}!��s/�Qx�8
O�G�q�(<�B�]���qq!���-�Qx��8
O�G��(<�B�Z���4qe!��s,�Qx��8
O�G���(<�B�W����
qY!���*�QxX�8j�<k��
��N!vZ)�/K�����)v�3bWe��1�#���1b�#���1bO�98$F��b�8F���a�8F��Sa�8F���`�8F���`4����E�^^���R�6s��C�Wż�+!h�)��<��� )�����v"��U����p���r��.r ��-DZ�H�7i��"-��@��k��pg���
g#�F*��T8�p6R�l���H���
g#�F*��T8�p6R�l���H���
g+�V*��T8[�p�R�l���J���
g+�V*��T8[�p�R�l���J���
g'�N*��T8;�pvR����I���
g'�N*��T8;�pvR����)�Ӎ���FJ�t#�p��R8�H)�n�Ng/^�˔��FJ�t#�m���6�ȸ�}��.�Hi�n��K�(��%J�t��.]��K�(��%V�r�R-]�TK�(��%J�t�R-]�TK�(��%��9X ��w>�$M�(IӥJ�tiD���J�*�ҥJ�t`���Z�T��.U��K�j�R�Z�T��.U��K�j�R�Z�T��.S��˔j�2�Z�L��.S��˔j�2�Z�L��.S��˔j���}��+]��J�)��eJ�t�a�ƍ�R��J�tc�T��R*�X)��>Zؗ)���S�}�R�X)�n��F7VJ�+�э���R�}�/S�sJctNi��)��9�1:�4F�����S�sJctNi��)��9�1:�4F�����W��Jct^i��+��y�1:�4F�����W��Jct^i�<�WJ��Jit�G�C!��J�t�G�C!��J�t�R*x(�Q�P���R2]��L�+%��J�t�Gs�g�\陮Pz�+���
�g�"�g�E}�a%y�BI��P��+��銈�D�l�q�TM6ѸPڦ+���
�m�Ri��Tڦ+���J�m:�Y�ƥR8]�NW*�ӕJ�t�R8]�NW*�ӕJ�t�R8]�NW*��UJ�t�R8]�NW)��UJ�t�R8]�NW)��UJ�t�R8]�NW)��UJ�t�R8]�NW)���J�t�R8]�NW+���J�t�R8]�NW+���J�t�R8]�NW+���J�t�R8]�NW+��M���&J�t�p��R8�D)�n�N7Q
��(��M���&J�t�p��R8�D)�n�N7Q
��H���
g#�F*��T8�p6R�l�N�H���:g#u�F꜍:��u��5Rm��H��:h+u�V꠭�A[�����k��F��`)����?,�V
��L[)��R0m�1O�JM���h'5�Nj���D;��vR�&�IM���h'5�Nj���D;��vR�&�IM�S��)Mԏ�&�GJ�#�����D�Hi�~�4Q?R��)Mԏ�&�G�$�)eԏ�2�GJ�#����:�����D�>Q��O�>����D���RI}�Nr�D���:�����D�>Q��O������D�>U��O�IN�*�էJe��RY}�TV�*�էJe��RY}�TV�*�էJe��RY}�TV�*�էJe��RY}�TV�)��gJe��RY}�TV�)��gJe��RY}�TV�)��gJe��RY}�TV�)��gJe�c����RY�X��~�TV?V*�+�Տ����Je�c����RY�X��~QY���~C�a%��b�X	�~��X��b�SB�w�`�wJe�N���)��;��z�TV���RY�S*�wJe�N���)��;��z�TV���RY�W*��Je�^���+��{��z�TV���RY�W*��Je�^���+��{���\��>W*�ϕ��s���\��>W*�ϕ��s���\��>W*�ϕ��s���\��>W*�ϕ��s���B���P*�/������B���P*�/������B���P*�/������B���P*�/������R���T*�/���K���R���T*�/���K���R���T*�/���K���R���T*�/���K���J���R*�����+��zp��������ٓ�|���MC>>%h���u�� ||F����	���AC>���U�_����d�zR������o苇p}|K������=AC�>~ hH���4��{	B��>�J�aCH8@��4��C
!��0ACH8B��B,��4����eb������F3�&f8XM�p��0p�>�&��������'�/XNL_𜘾`:1}�ub����w�9
�s�%�(L�Qp���`11G�c������l&f�Lf0�������ꨴ:�Z�E�΢VgQ����Y��,ju�:�Z�E�΢VgQ����Y��,�t�:�E�,qo���	���t�u:�:�`�N�N'X�	��8�����.�l&�o>�7��蛃�D��G2`9xMD��&�on�7��蛃�D��p"���8}s����9xND�L'�h�q4s�8���D�^"���/Gs0���98L<	�Il����= ��sI0��	�D��^�$:p�L�<���'2��D'Z�-Չ��DKu��:�R�h�N�T'Z�-Չ��DKu�R�h�\y�`Oq�:3����L�`�s0�9�a�7zI_0����T1}��b��W�����n�7������+�/XVL_𬘾`Z1}��b��m��ߊ��s�)�(T�Qp����?1G��b�����N{�B1���0��?�(�_���t9�ENg��Y�t9�ENg��Y�t9�E^g��Y�uy�E^g����:��^V�9�	�u�y�`^'��	�u�y�`��\*�/�TL_𩘾`T1}��b��U�����뀁[�����~������U�~���D2\-f8�Z�p��=rp���``1���b���4�i&�\,�1�Xf�(��N��,fB!��,ӿ:*�N�R'Z��ԉV�D+u��:�J�h�N�R'Z���%�_ �E�΢RgQ��U�,���.N�J'X���	V��t�U:�*L0��J�]0�/�`D_t����}�#��F�u���"���E�E����-.�/X\L_����`q1}k�h��EE�8�>q��|�>1
|,�(�X�Q���$0���X��(����i<��~�F��r0+jD���I���2txF���cB��v���	�:'d�ꂐ��KB
�`MqT�j����V�A��,)�p�����>?�k���yrp������n���	�*�&p������n�d7ղ�&��E�:��RQ�IE}�XT��PQ�AE}���S��NQ�9�}P�>�eLd4�Z���Ȼܚ���kUڷOU����ʾ���M�6�ޱ��\,ԗ����ļk�/3�kG�y�]_f��ٗ��2�gn�k#�Ek��\W�&Y��}-q��׸�e�ª�̼{��}?^X/���m��~_j_���+��K[Ll���hl|K0E��ߺI`��
�)����M��U�kz��#x���{�~G`��}k8A�!�
��l|L`��L�x>%0��:�A<���9�A<_��%�A<_��5�A<���-�A<���=�A<?��{1�����/S���b<o мx�-�ffiK�VϾ̎P��#^�
s�~CN;��$�Nj;�5#[/�.���A��AC}�C�@�O�	��A��l�
��ߟ4���K�n�x����? h�	X��!�N�x���џ�	��)��F���zN����zB�0*}zF��O��x}G��!A��
��!^�^4���� ^܌!^�ɟ�7�#�=�+�6���J�k0��!B?!Ȏm��%5o��t��:QR�(�N�T'J�%Չ��D�t�d:Q�H�g:C2�!�ΐLgH�P�S��ۗ���֎5Ǒ�kv�#mkvE��X�*2'�cͧ���X�)�5i�&��D�/���4����Z|�=��E��i�D�)�{���t��c��,5�,}���,�槏�׃����t�zq�5�}l�V|�e7���ֽ�z<���^��k��z<�u�:
��2��Os=��:Q�H��:Qr���u��z��[���#7�n�m�W�N�B�M�W�ΞB/��x/t~:�
�_Ed(+�Q��)t�:y
�<�N�R'O���ԫ�R�P�s��9T�*���ԩT�T*u*�����,�4�+��*�7�4�+M�Jӻ��4���+M�Jӻ��4�+M�Zӻ��5�kM�Zӻ��5�kM�Zӻ��5�kMo�����v��"VD7J�u#+�w��0�U�z���Qmԥn41k��,R���k"�:�hw�|���/�8���_����+�24�
e��И!�r�_!�P�ʿB�2P�Ҧ�t���q�*2�R�|Q�v���O:x��16��16t�36��gl��=�����{�������������cC/�gƆn��/���K�&�+ƚ�W���5c݀����[� ~�c�{� ~`�G� ~����O�A���1��0�3c����7��'|�F�0e���a���	���L�q$�d��"�	�qOP��{�zD��#➠����'�G�=A="�	�qOP��{�zD��#➠.�G�~M��'�K��"�	�qOP��{�zD��#➠����'�G�=A="�	�xR�܄!@�bn�!2��{�!F��
��?���%�������������+��
����~N�.��%���%�9�ѥ�m�{���8��6�������0#�t)�H���E�>�����LO� l��Ɓ#�
d�|�>�u������r��]�
�{�h?��L����7(4�p���Cӣ'	�?���} ��0����8�Ҟ.\#l����
��:�-aC��O��g�.�o��?>�x��ͅ�yM��ٻs�
!�;O���IƆo��KX�Q†�w�0��U����A�OSڂ{5;A)�s�OX)̎.!^�G�⭻o���Y l���
�'�fW�?a�0���Y�_`�0=���!~�/���t��V��\߯gW��Z1�9�����H�oN�֘>�|�kl�mk���G�l
|Ǖol�<h��k�F����0��ڝ~�	���G�Y!#�vZO����{�QXo�F ��ݽ�Vh�voO	�呿���#�+"��wy�}���z�3�}Y�^�g�׮�,�
�vE$E��2R/��)�H����2��W~1e��}��/�+��ٸU��[y�;�<R/7b_f��e���_�œ5�H?W��*��U�>{��/�ƪ�Գga�:����W���K
g�G�#KB�0"��#qF�0�	F^G�0�zB��6'daB�9��`��7��S��O�P���jA��ii�{��߆e�XwZ����HM�ɮ�a��h��-��6���?����%��"l����}��Y��7	���e�6l~xH��-a�Yٻ����}o���K��J�a5`�	V�g�Gp�/rc`),�v��s!���[����K��8��ª��k�`-{�z����G�Y����	���0�a���y{�0��A?'�Q�=�-���<��. l��}g��$nÆsz�0a +�,�B�ɍs�	�?B��(a��$�MN��a79=q�0�	���D�M��vB�N.�;y�0H���!���IDa79=�=a�\��b(l��=&q�a��D4�n/?X!"q�;� ���8CQ]yʣ!(��34���<]\ "�x'�`�9=K3�6�K/�L:w�0Ȥ�K��Xx��v��	� ]�����P�����+O��Y�����A�.R�@Z�^�,myz�2	���g!�;�apG�B+8�9��a�o��A��iN�����iJ�˨��4��	��2�\G5�II
GE�o,�0	7RMW�BW��V��f���[c8`J�;���4��&��ھq��Μn߸r�@����_5�s�0��Z��
Vӵ��A����b��}�Nd�}��>��@,8n��!<�hQgM����AxQ��i��#Fr��}�R8p:}D�\V5}L3*�ND�1�Μn\��:�>��T5}B�ӧ���At���O�o����������� q΢N�sK!t�i�C��������
� r/���\���#� �^��N�N_Q����)o,�l��]�@%������a�m��j�w��oh-U�o(���
-���-����SgC<��[	���4����%K���n�ç+4�����c�
��۫Ghj����!������
-��N���{��)E�V��L�k����V��ï�h��_7n������^�ھy�A�P��$��Mpvv���pvv��Lp�~��<X���;'�����xcg�i����#������#��l��%/��-�zN��h��cgG��;F�dg�)�pBvv��x�>	��N��dg�i4�c���4l�{Yf�h���f�)�p���G��!�gh��K�f�i��Z�N�<�Zm�:b�����C���!ȋ4@��W��D��j�H��~�q���p���<ɉp���<.
X�KS��e�

��.����e.�K���Z�i�
�h�.�n����u1\����
�Қ�Y.Ӛ&
�Ӛ]��\�5�LC7\�5���!����õZ3�%��Z��4���Z���^�˵f�hԃ�f�H����WNS�[(�p���[�ឭ�uJR�ikv��wm�n��%XY�ކ۴f7i����f�$p��Z�[4�Z)u�V��m�N�^��*eܬ5[��,ܭ5�G�,ܮ��r��R�;�\���6gp���>�	��핛��o��z
���'	p�fh��o������!Q
|��C��;\�ޣ5 ��7������w�'!��'��o�)M�p��)����:7V;O8�g�R�w!͞} b��%a���1|~�0���W�A_"���g�	��γg�A�zD��뇄����:a��o�|{�0H�.|��0��{j(�~��zo?Z�p�@��	��g{�5��m��?��+�����̺�}���g��VF�á4��-��M�íCDD������n�J?�՗�K��p�08��083x�a0	޺�@ ���^� t���w�j�@�|#���a���|���{�
a�S�j��ț����9
/xyoh�nk�����E�.�u[�O�H�%:���%�=���xG�>�ֹ[���c�� ��i��0JO�Q:���@E��@HËDV0��o}�A�A
X}۷�$�4߿#l���^J��D^��4#��׃O	���}��c�k!%��H�G��R��߷u�X~�&���m�wU�߷��f�6���>�@��F ��
����ۺ�%~[+���4@;���UaλM��a�._&��p�VO���w��#i����]��ۺK��o�.���mJ�A��F`df�nsa?a�I�g�Y���hf�֣���!�j��<���nk��<p�6�-9�Ns7�v[�DAp�q[`8���=�J���
'h9���K����zEaGo�5���4P����ʫp�W�Rk�2�͓4N����z�A��{ZA����z�f<0��>К̽��K� �r�@W�h�so{�Eܽ�>��{۫�W;� ���N�D���i��`��Ӕ���� �gh{o~�b���=Z����zJ���M?�D ʝ�hI{c%8|�Z|��7��u����UD;��H�#���c�p~��<��1���Κ�1Z�=H�C	���|�|�vl`Ώ�����}���:��%=8���!WORƁs8?E[Dp�'�s�S���OU�9�/��n	��$��9��+�9����8����otWy�P�pKJ��W�i��p�B�D|�p�D|�p~�Vf�n������m��۫�h����y"����i������`n��������?�_�-���Kb�痈���/�J��2c�˴�p~���`ί�$���I�>�_�y��5�3H�봔�#+Vp
��RT�5�/�T���7�v��7hBKp~�����8p�	�WhOp�BF�7/�,	��|��:�	n�}K&�MR&��^�MC=����i%���Z#�)8�G]
��;��?�QL����^{J�Wp�����|�8���3Rv�������;��-���L���/iu��M���_��}�ef���$��/8G����w��1����3��Nɔ�~>@�2��Ң
���;W���~>HQg����!���S�3���E†~>Jqg��i���|��
��G���~�@�gps���������y�ر|)���a�]�1���WhW����f�<�|��b0��������{�y�����]Zz�w��[��;�{��1�7��O�8�=KK(0?/�q�� ��|�0���/�t\�I����A:��?�Z]#�qm?a��k�0=:E�w�?&�t�,a��O���0�׹10+�? l���ϩc� �w����W���s��!a^����
[�{�Q��"���-a�H���A߾&�T:[�E���
��ӄA�q[ ��7@�ݻH�7�f��$���h��O�u�6�?��c��������/�~���:��/��_��L���?����.������,���n�+��%Բ���P�j\B�K�y	�/����oԾ�ڗR�Rj_J�K�})�/��eԾ�ڗq`�}�/��eԾ�ڗQ�2jߘ�7����}cf�oL�S��Ծ1�oL�s�>G�s�>G�s��>G�s�>G�s�>O���>O���>O���>O���>O�˩}9�/���Ծ�ڗS�r\�}9�og��W?���PKEePQ�'WX�^pip/_vendor/msgpack/__init__.py��Qo�0��)N�KR�*�A��=L5Nr�:v�s����N)C�A�;��ߝ/ИV����{�u��7hI
��u�����}��S�MK�G�>X�Z�HN�c)dh��H�/w~��~��h�E�g��߯޼��Y�\-W��_�d;n�	f#ug������3�O��R�hv���hK��[u	7�@�PƝ���Sf����3n�M��!wi��O���X��NnJ gQ�%�f���[*�p�e�;ʀ��qP�
�n�`�C���*�XȾF�y�Ѽ�t��&^(�E:�"��'���<���T��⬄z���-������C���|L|���_:���M��>���Hw%$!A��ފw‰
w�Oi�?�NH����6�Jk�����~�j���4O��wV�/�����tc�A8YK%�q��c�𞌾셥;�.��r��h��Q8xtrk��}?x?G��S�PKEePQ_,+�pip/_vendor/msgpack/_version.py+K-*���S�U�0�Q0"M.PKEePQ;;�ӭ9!pip/_vendor/msgpack/exceptions.py�S�N�0��+V�J����^(�ke�5�p�ʏ��=k;S@"���Ύw7�b��>����l����[�T@�b��c�Mla,8�#�Hs`�t���I������*�?nw��p
=;g��wh�wL�o9�)���`#�l����
�̷0��5v�R�R;�����TU���!�>��L��Ě����y��=�M4U�2��~%S}dJr��{��H��g#���34��yV��{<X�
!�J�Pf��HU�+�ۂ5yi>�eE-fʜ�,F5�~c<$\*����e�0���.�ՙ�v��PkZ���z�Y&�<iE�ㆣ��^j�ڡ���|E����;>_�0��~'�(Bӻ�B~�$��E��E֪ߖtҢ<R�,�J�G�~����O06�s���� ��>!59b�#Z��i��}W_PKEePQn�k��pip/_vendor/msgpack/ext.py�X{o�6�ߟ��b��:��im�ņ>�[�b�֡(ڦmm��T��>��H�"-�q;!������#�f�8]����㧝y��p)I�T�Y* ^��\B�V|&�u�;�ʌI.�.6�|�y1��N����i'��@yQ�γw�{�a���s@�Q�S�͚���K�,]�j/*��/��wx"x�?�5�o��VYП{��"�wS���y<)$��Y�0���x"��>:<M���N^�]^4�[�u{�ňsʺ���u��>�|�s�S)�:	�:+�X���Rvˌ�!�R�1��i"z�G�Sb��p�I�E�
��)�4�ˢ�'g��@&� x��U!$L���H%�=�l$�%R#Wq4%�p>V���I���YR�����̜�"OAk�{e�1\��]4��������M�’��ev��%�Y(<%�7��S�ǒ�0)�D��X.�F.��WQA!��a�qy��3P�,�A���7F�M�������_*qJS)��y�NG72�T�o��r�J�,���R��Z�t�b��B�I�G�"S�̰��S$�4K����4+�UP��(I&Ea��4T8K��]qKL��ɼW)��ơKT�b����1���+zFk�����B�XMx�ܸ��r���o�����0���z?���>	1�qZH8[W����+��S�`2���Y���"������M�tC_\�<g��T�۲�.^+J�p8������"���e�E&��J�o��Y�"_AΔ"�	�	�cXg"VK����Mf^<Ԣ*uUG�|!/�<����6;3[[z�;�\��������F��ȵ*G5�	~i�TP�Cӆ�t���T�A%w\��ݶU;�ؕM�(+ۭ��pdc�3�a�Z���E9�]�b�)�춊O��~7@���t#f{�k8aH}���4�!��^<_r쨨������Q�R��њ��N��X�=eQ�NE[X�hB�M�X[؝������{��WOm�e_X�cQN?@Z^
�2���ߒa��2�JK�U/�X6!U�Ӧ��O�_��A��B������Z�O�GU�]����sM��a��t��a
4G�d�l�dl��1,t�Dm�-���:7�k~uPAve�%WGG��,��-���KI�D���	O1t����V����n�V�u���/��aB��G�SW��N[��iUR+(���.��ɫ��cV����?������Ŗ���T=L�:�
S�Y��C�4�LV�?����9����$�
D%LĮAQ�]�-;-�*����2.	x���
��bS|�VWKm�5�f
x�������N�F-�:����iC 

��I;��k���XR�A�D���n�����3V���x���6��G���{�g�\��/��#��Ƞ�ɠ!J]
̭��V�C�ښZ���a޴hhJ�%�!oHUŹ����F���gO��w��P��qC�s�Q�K��;�~����m%y�ؗX{��j6�X�jԷ�C|�Ґ���:&n%š�[$�#s,�?�F���m~��]aj���´S�8���yK������C��JPkp��vsxܬf����t�R�Հq��m��RA+j/�P�?04Rz4�oW٬r�gP�̫����-�qwW~�X>V�/I��uK��ה�{H�'���ڭr8��.�^����f��!2V�*Kt�*>����>|�6���a0��Ԗ��v�+�2�u��ɠ�1�PKEePQO�S
�
�pip/_vendor/msgpack/fallback.py�=ks�F��+&L�L*CR�-�Bo��V~�,]�� �J�H����W�߯{f0o��(��;T�"����W��h����0ݒ�"���C~��$�ͧtF�<�#�M&d�]���hllL�dF�aN�hF6Isuf$8����/��L����(����{��M�3M3�&��I�G�H#���� pEq�s�A�&ܴ�4��[��N�8�A���Ͳ�����|��d�Q����f�E�ٳE��1E��=�O���+�,j�l��Ϥ��&�E�����܀�;�{tNG��I
$�/b�4�U�Q�(�wM�RӔ�ҸI;az��P�=�e�I�Eq���
8h�6
���(���]��4��>�-fDR���B�G��鸡�fY���tA�po�,��	Bn��a��nH!��(�>}�l�� ��Ç���ffвB�$w�1�gI�b�"��i*�d9o:f)A�	
K���4��������b�(�r�YQ���Ձ��3(�yNN<ӑ��]\�O�|�8�?��gG��\�~4
�L������\k ֆ �(�fF�Н����@�	�Y�O�B��F�ՠ�����Z��:�|N�1�`��k�&\M��Z{��ˋf4��3:K҇��kyjE�ɓ!6kӦ��`a��%�8���]�s8]p�,���4��H���KF�1D���`g�R N�n�`Ά�dѿ���ӆ�:\���m,&��,��6y���O�
��>OC��$Ig!7
�tp�‰(���N�M���͡��߂�?�Du��w����A�	Ώ������߃7��ߗ/��P��76.~�p��}{|t�q̐�GC�n�C�n�e����;���7ǿ!�76��O�/�.���������S����E�n��uz�r��r��U|6��b��_(�#�j�-tt��`��p�ͅTa��a��Y{2(^�8Q�����ׂ���@�Z�a�Q���ś�Q�I==�5\7g�im�
��D�$HF��P^j���M67o�X/�k�(�YG��抗��pu?G�2ru%�����Иlr�M2J ?�@��w�Š5�48�G	�t9��i�+������*�L���<I���S�����BK�!�M4&��!a�%��R�Ǻ��+.V�^�	�C	G�1$� �-t����{�X��;NsKkGIg�J�vؠP��/��Eo,�Q�J
u��є���F���E����Ռ,Z:)
47h�(�J1v���@4�f�fE�o$���Q��aT�<.���6y��#B��9�&t��6I]�Ѐ�4E9s2�^Y�eJ��у�t4<��蝝�*c��%1�>�*>h�J4���6�P} 
gJ�Ap���z�C�LHao��L@I�it���	<��G���	?#«�7���N�	C��?��h��V��è��_h��r��Y�������e^�+Y8�ҎA(�∏��"����J2©����iB�������{���w#n]��*�I2Zm����B�Ђ�§Q��*F�XJ����;PpYNA�>P'Cc-ix���PkN~�n�cVloy�ˋ��]Bc� ��6N^D8��Cp�)�}##�����P��ކ�N�dK���7=x3�&aNH�#P�r1e���ö��Hi��$�QbJ39A���-�	A�=�s��KrڊGD�,���i6%I������@�(	G�A���([�ef}�p:E���$ɭ��W�O5���n��t��eQTiH�Yث���l��^��Ҫ�Uj�p5����=����?�$nU�>�4�B�=�p��R��X�>�(����{�4O�:lTii����q�y��p���(E����)����k*�`��&�HD2��b�q���ɵk�I*�΢Y�glD�b�5�Q�u>���P[ss����B���`��eΙ�G�p�6:h�BĘiW*�2�g�j ����⿃|��2��r�)c����JTo�?��ؓd�"y�&�H0�8PI��!v7��"�6��,7�J�k=�*��5(.��aw[�&��/C ^��5��xq38��V�}��:L�.�᧟��J }J�փs�1v�s}|��!��1�aWى��iݬoX#�'�qذ�����dD����DW����8���ʠ
��Lb#f@���s���;ٽ��m�u罆@����A!��$�4ct9�?7D�Bli��R�l�Tih��6*׆_"�t��"���h��݀�.�G2VՋ���D��,R���z��(��f(a��g��$��u���E��S��e
�zr�{8ϥ#w���<�R>o�&�����e�̀4xS46tLR�Hشs���:'����|�)��i�.=��|�,fa�)��!��#ֆgz]11PU���%�{b�5JL�����\s�<?זï.�y�E<��i
qD�lH�Dl�Y��a��q�'��!�h4E�A �@��=G'r�7[m
�dg����Xd� �Ǜ>��W�"��Y��V|ONyW�A�����h�]�E:��p�Nx*mA���E�(��h��ɕ6�b8�qK)�vSá9p̪z@�;���,R�$�0�j����5���cs�Ln�PI�Aв�h���	�19_����?:p�9�	�ۚ��>#ƙG�t(C3�i�+�^����$�8��1i>W��z.���j�>��|���e�4�e��W-�$_;��'ҷ�	W\�L�v��Z�m�
.dWL^���&���l�����,��5��kS�-8��M/Am�{!�QY�G8�ӄ��[3B(ͧv�s3��"�A8�Ӷ�f��<�f��f�;a��X�2�v:ێ,�V�#�\s-~[0Z�PڝN�N
Z=����?=�k:q�Ss���6iy�5�V�y�L{w��@+H&���~V���41.b��Fp#��z��4RN�{��Xo�ʪ5���k�����
�.)���$��'
m�ȴ*�}��4_��A0<�.��3m�Z�_��*�j��
@�l��������j��,���O{�K���_���6A���ZRa��m�Y��RA�㖔yb
)D�b��H<�~	�y�;:��h�5���Ԉ�����H���������^���A0K���g������q�6��g6N#Є6��VV�f�j�d-�aK���
���ွ��h�_h��4c�1.��qsa�D�&����8��V-���(4�uq�}�TQ�Ϯ2���*�@k�{�*6�=a�RML�%�>l�_�Lˮ�-�KzYa��l�.X�k5\uB<���^sd�٫���WJD��>��}★%�`��ق�a ��<�o�
�q#�X���ta�z`��ц�S�+�M�H�,u	���1�c�w��y�2m���%��6��4Oe�<"lZ㛶��e��嬁5��wK�s�C��s�ik�Neq���3�ULK�8P�YLh��%![f����`D?m_��]l�b�d��K�|p�@��h�Ӂ��S���L��S����w��=F�%���$:4|���?Y勠g`Ϋɿ�����X
�	jS��T��J�;_�-��i����I�����Cë^��(1���(��9K�f��c�2q� �ǐ��V�����呀��4���sT�߭��	���g���dY���z|.k�J>�����Y*�ͣ(��P�r�C���`X����]����Z��w��dwp���=~�h��F��o9�j��(�Z��@�F��������#��w�flAm�~�h�lk�ѭ�f��(�����Ri��'͝��4_�aЂIv��z��E}%=k{${0���jJzf���ZS[����Y�E�L�g%bݕb�x�\�k���u��W�+)������`O���`�}C��ɑZ"�<��4�:�"k�Y����uXEV��	�x�������˓EY��*ѓu�Y'�*�?��uWV"��%>jU~�:꭫Z7_B����V�%T�h{]��Q��MN�{���(�����3�=AW�[�UU~�~�eOZ�{��v�Q"�������	�����{�ogM��<��vV��z��YGx��{�����Dx�O ��U�����v��+��v
�W{�U��^<��{���z/k���H���/�W�s+�$�W���ڹ�)3��k����a�:�{ߠ()ʝ:�\2�Xgj��a�(��oK/��Z�ѣE���韛�r����g��R}�U���V�o@T�a*^�vs����]L�v�=���f
�MbPK[�NN����,�*�R�ث!��;H�Clq_F.�
�;���i��9�rf�ց0���*���&[�"h�e�|O.��/���Q4�Y�@Y���s���\N��(�%OyE�Q���lƞy�l���bR��P�#�h�ڽH���$��N;�(����i�P>�L�gQ���ٳ�A��UHːE0���VH3��`2)<�7bG�S|��x~U�R�"���|�UKr���!<+�I��@�R
�An�5�>�GŤ�V8E P�w���
�о��@�f�--��ɶ������pP���9�r꽅�Э_��,!!��b���@W���Oc�ƥ�xa�-��0��A�ؗuMI���JyDԘ]�d3��\�D�sq�8�f�K�?������.���㴭�Z�˜�e������D�'�*.�����)��o���a9�h���'�nC�~���1�W%�����#�*y�ۅ{�^�?e'��y���q��L��{x�<Yk�rh'�E��碄�.B�{Pz��(�8���n�[�%�i����WU� �S\�U�'z��[ouw3��c*�g��EBg����r����t}���)�#(O¹�H���O1h˜��j&��
��D�%�CK!%��6�ۂ��0l�%*m��$R���;M��w|�Cۑ_rlIQ��w��ՎQ��u����j��tZy��8�&Ӊ~�'e��,�)�8^�%>��8�$N��"X���\$Ubl��:PÖ�H��Y�)�xrԄ�ʒ���.I�2G���T�,�kɚ��3�0~�<;%���<�bq�7x�E�G-�'5�3�-2bdxrC�8'���)
X>KE
��of�اx�KF�x�VO��v�{҅���vV���8��������BY0=�ub�3r�<������[$��MXB%��J$�����#����oGS��aL��p�,J�ٰh���#���Q��G�~���geD=�y������J֞̌%�Y�X�}d�K"r��/��E0n�q|(9ă�0��#�F��!�L�Ϟ&��1E֐��fT��)%���G��4�y�E,��rn8��1�H0�$�?��@��8��W�����Y�J�h���7������z�Hq
Irjt��&s�4��hI�7�L����by�Y"H��C�
=yV>��]�w�s �,6�|�Վ����,��'1��šEƕJ:�}U�Ǔ�,JZ���T�Vf�ճ��\�����'��_�ˏ�������3�¯[��1�؇"��s<_�G�|����,�jgt����ۦ��n�6�����IۜHL�NFev̖	�D��MTr	��]���X�Z������bj��7�ܩe��'Kc�d
uvR��R"�Nqo�-ɣ�	d�8��"�l�������\6��%�(pW$~<
�AA�f
,*1�چ��ċN���;$�u�p��F����Ƈ�ς�eU����SeV�(+��NM�X.���{�a
X��F|�D	�,�(6�$��>�����PU|���|�J��yozB���> ��a�?�G]��
�G)y��Se�m7��%E��$�/���dy�P@ ��]��	K`��8h��>��V���W�VMê��Yрr^�-��,Ts��dܽfǽp{%�''P���l�>x�<Z�gW�tkm�y}pù�-���	x>�</���m�^���s�_�y�O$�p)�ԓB�L���)�'��v%��Cf��teBߕ 
����e����n��!v{^���C�x'��S�_C�Ǔ�'���nV��L��59�c�E/K|�J�ܳlNݷo%�٦�a
D��w�:A�3nm\�lF�bnγ�X�"�DD���Z�a�+�@�Uo��K�����(+���w_Bj�_6�'�L�ŷٞJo��c�e�4����5\ӻM���/�n��9�"�_�C�y���3,�����K���&O��1�*_5ر<�\V���/7��Y�j�&M��LXπd�eǕ��?K���G��z�Y��g���<������D�9$S��e%2ߙ�*l���*#��&b��mr�S����""�ݲZ�,�v\�ʏ���������oJs2j�`�F���FO�PwәB�U�}j�S[��ٗÖ�80&pђm�o>*�ж?X��t:���Dk��g�j���Ҁ�� "wFx��
�]�d��\'ί��'Q��<�Ҫ/��3l(Ֆ����N��q�r�M����}���cv�/IG�7X���<�ӆ�%LM�<��䧧�vϗMe|�R�e\L�3�o��o�"`Q��c��a�1����'�2o���ڞ���kؿE�q�2s�Yf��ԔCb��
�W�`4?T�%�Y��P\Q5�c-��E���\��$���[P��^R/���z�{+�*��"WP����E1�d�а0�a|��4l�����u��Ұ�N8^��	�����
�k/!�ku�]�w�ˎə��غ�+٩����Ha3�Ŵ��r!�V��$Ես��M��U�m�Z�CZmM��]�z
�|�std�w�|�}�˚h�ļ�oZ_Ȼ_R��_V�'˄|��*^.c=��E��^��^��=>���m�#?VAi`}[=�� ?��w�Tm����1���۪��f7���/��v��y��Wm��R=�����X�Y�恍�V���Йy��S�m�7g�{�_ad�,i�b�jg��[uu���m��R�՛� �K�R}A�>ɹ�rˎK��bw��&��fJw���7J|i#Y5�d�7�Y5w���7��M2�6o�ύ�mul�OG��
.̱��h������g��C�^(����w�/��������9��=��X��?�(�*�/sAk�PKEePQZ�k���"pip/_vendor/packaging/__about__.pyMR���0��+D��e2��^Z(���CaY
���I���c[^��Wv2�s�ы���;x)�@A�>j�:�{��G<"0�)�r�m֝\/kZ��9[��=4�m�Ӿ��n9-�3����z~�ڌy�x�-
<�.;�H��y��4d�Y�	m5x7�RC��Q)�iv�A_�3�Q�q=}P��ɲl�Ih��6F�_�W��J1��busB�&�����c���t���ID���n	un^<]G���o�#
kq������U�*�99��1a�n�\D����!Q��>2���~%�c��2�}Ѡ*�J��}��m�>9�Mg�����&���tβ�K��ݷ��ϼ�!�Zr��?;R����;�L�n�N�*�*lZ��B8wr|��P�=��[�PKEePQeD2!pip/_vendor/packaging/__init__.pyM�Mk�0����l��}�}�0(�t�2�q��V��B���$��xɯ>��=P��B�]��"v�B�: (����$^G�氟�j�A�ġ��s�T�
�T�v���4p@���}�u�-
�ĄYg�<��ȑ��zhُ�C��bS����&Ac��Ȣ`��]R4����3]�a
�?�V����1��I��C�e�t`1�^t��E�4hA��,E.'+ &�\
PRw�OBE��^�cU�.[��N��yS�j_��X��Y�m�B�-
X�(�n���PKEePQJzBh pip/_vendor/packaging/_compat.pyuSQk�0~ׯ8��xx��/#�A�����BJ�� T���ɒ+�����I��ftz�u>}��w���p�j�h�:�@���
:]�@�h����V��ݦ��:i4�¼��A�*�}�\�9lc�f��۬��:Ƭ1>a��q��^m,��iz�
���������w9ٴ�z�Ψ�#O�*y��X����]�@�
7\�XB+��[��#�������W�o�R~}YL	T��m��-Z��J�9\˒=t�
m}�����9,���R�f{������/Y�G��)0x�$]YD�S��:��9�*��S�����W��!�K%����>��,�LC���Y�gKm��oEQ�2��9�oM&���,
���	�H�I�S����4y��K'-�2�Jhf���"HY��PS{
	E�U�4��u*]f4��#����R;/���`��T����;TI�Q
*+J��?�ڹ���|r��ŘVОs����J�rТ!τ���d�a�zoa��4R 8p��g#�EzQ:R�������IՊ�㩱&���y�Lr�e9����?PKEePQ�]�מ�$pip/_vendor/packaging/_structures.py��j�0@�!����c��.)B.	�
��*��J�@��cg�qC�8�Bu�%��F?�a�+���'�ԠU��c�I���n��ࡐ1w�]X�輲&����&i�:�q�|�����M�&��d���眵�cs�Y�e^j�v]h$�I*�GA���HK*
j]XG W��P��$j���"(�2�LLU�Ak�=LM����r[��0�p�SށsqB<�t?_�>Ǐa��<������ށ��\��+gنU�U"��a�i���E�s��*��Z�ƿH���g�{g&�x�&�BU�*�H���B�܋�~ß�̺�b�ʓk˺��4�]��9f����������w�r�G�΁�����׮��k#���/�
�}b~[�K�5dk��ҝ�+>PKEePQ �qg  pip/_vendor/packaging/_typing.pyuU]��H|�_�h�[&	܃!G��¾�a�GmkXI�̇��T��^+�˲��tuuU�lUU���u�&���q�C�ÑB����(��@�6O��/�R�~��(�|w�I���
���̔���|vW�vԻ&u��skM�F�N���<�!
&Z('��ha�;��t^�ۙ���u�M��g����,c9�!�'L��FH52Xl��C8Z)I�H��r㟅��Ej�I�L�v�_���5�N
���v�hL~�R��hΉ��y��D+�r�����
�Wߧ؂���ۚ��Šz
�57z��kdsw'R����գ�>���w�7W/��ݹ�u�>�wA�skQ����&��b��<F��"��~���q��2�}J��ṇ����0S_�H�2	m�G��Wc=&Dx��եTEJ��/A�0�c�>6[������J4�2�v	h�"�Yˬ=k�Rˈl&�����n]�"�eIVI=wZY����5���dU��Vl�"�dAG;�ے��y�s����a���_�|�T��a�t���`�u�	~�aCm�cج�G۴�a�z̹[KT�6��a����UUUJm�u��w�_5�W-�2:����X��Ap��4|���>�	��?�wwy�>ad�X����L��)_
�<�l�}�����T��sY���9�wY&*�	s�&��L���Ny�u�^N����<���
����@]��P{.��3"��;`=��~��ه\�ⅿ^��������.����W��T@����J��w�<�%�7��p{���d��{ь�˵�&�o여�w=�X�d�ï��vI'�%�kSZ�Է��,uy�~PKEePQhD�~% pip/_vendor/packaging/markers.py�ks۸�~"09V8Nڛ��D�Qr���۵O[���%HbB<���:�o�.^(�IsW}�H`_X,���u&�2���EMs�gsVH� u�`�TkF*&6��z�t?�l@n��/z�er< �X(�7W?[��\1�OO�Nή&�a��畦
Vr�U\l�ޒ2�2g#V�,�Io)���鲮j�Ҕd�����[��b�~�Ev��`R�����W(h�`�	
�ܻ�OeN+`���r+{�o��IzNJI�-),�XY.�M>�YY)���:���
�X]U��/�b�
d��?�e�*x]�/\�S���׼b�+E�H�f����T�SBH��feI������նd�B��G�����&o;9�ՀȒͳe&a���Ȁ�w4�nvbR�P���
�p��wF�ȇ���v@��<��9���l�=�$|�����\�%N�/��#�s��d䐧SX�ڔـ�r��z�^��,�׈L^߈���OL�z�=�eV��[Ԟ�$/v�&�]&x�aEuF7�·�������)d�S)I�=��y�&Bp5~��~��+I6
���f/9��%n�\�:_�Q[����brA~8�)qt,ˎ�}c}�@�7�*�)�J	Pr�ః�-8��!�Z]�
ͪ'dh)�	AH�-ְ�[��_4���*�>����2[0��ov�:��ۏl^� $���Ȫ4�$˗�P3��4_6$�mL��*s���h݌4j�#�i�vT������������~��������3���'�#i�y���M��n@����L0+�7���L2PWu����w�m�
X'�w�ے�a�.�x��<�}Pe���a�����f|y2~s:��i�ϬRՑ�С�y?V�_†ô�Vk	1|�-�����_��X��#XΨd�sO�m 3_�91�A�46���8�;K�2�C��I���?���P'��N�O��5>
�g�����B���Z9���.+���lE�ۆ�\	ڐ�pҋ{�ӓ���
��A�P��!q�4�/PԐ�;``v45$�fц���a�X�[>f7������`&�c�6�U��ts���G�e�a��n���jzy~��io&�W'�g��w�9�F�A_�}z�^��g��?
���Ɨ�M.�s���S0W��b�S�����q<nƧ��a��n�?T䃱�a }]���-�7��j= 31V|.��,��`�E����:���0��G�i�vԠ^�>�ׄ�0�uB�^�/'gZ�'�J	&e�.��8���&�����j"rr���q�r����N|E�hfq@��+��;�
��(; ���^��ë��z=���9s�b�� v`��i�������SH�f3Bݫ„
��BV��3K5,�`lB�S�,Vm���!�y�\�®Q�	���#�3�:Z�jt-\��Z�Z�.kT!4Ŭb@�$��rǖJSU��$BQ�T�a^�(�2�rUgU���kE���+�aU��D���5�c��d=���'F�SeF���|��J��`M��!v�fB�|��*Ln��P~_(��%���!�@����:�SVZ-a�ɦ�`�Dr�	H��	xX��[�x-1��+�+�k-�����p��VI�
3�ш�&w((G��>��vM��`�i�:�:�!��29j�����V�A�6i,5`Cғ�O��G��b� ���G��p�[h8��1�^�VԎ���&i�����gTC`����d��d������3�Z�I��`&X�ճ�+��̒����`���Q0�~7�ς��B��Wn8��������خ��:,E'�%R��ZS�IL�@��A�@*�m��M%Ы�E}�s��N�#�Tn���P-����Z��9�h`O�spP K��*创%:����E(���qW�nW�%8Mo�<C1�.IU��m<���ĕ�|kU�13�1�Ei�h��v;���k'����	�f��y���jδ�1#��9�j�E���i
H#��x�M'٬�)�P�w3��pG�>����Zw�|���(}���jb�K��`�<�mͺdf@B%��m�������CW��K%F�A�ޢ���Iv�gOhj��>1KhY�b��Q�"?�|[����@Q�� !1�`�1C0���}T¶����C,��
�m�y'^�z�h��[����6�F�?��15�6U�ـ`]6kk߀A�ӻ���Yɦ���b�<�0�4���1�g��I��.$#K�ݶ2��|��
��H6�#��OY��?:G�((�OY��*��˭wS�π0�-�{z�<�F
�A]N)�&�Ł2w{z�WQ{�j����b���6#�p0��n���<Y����������`p��>!o2_��'DZ���m��V9e�94U��4����x�h�"�۾P��2�K�£&��g�Z��y�}�����*i|؝��,ew5���E�Мˎ�*�Ȼ��L��d�����;�xg�w�Ee��i�<��
Bީ���NoHڽ>H;�mOك7C��_��n�f-�.e���PŽt7�}]Ƨ��]Rxm��$�{$Iu�)�_�|BA�vH�&��zt�����ڥ�� ;�7lNܚe~�U�����1����1�;4|�P�ˇ�J��[�	��sxVN�{ס��D�A8pT�wT��N��)�)�Y��9�{D~
c^��|5�(6���6��4���-����Ŏ[D����"�
���+����ʄ�]��C�P�I��\jy�#���w���M�Z�W��1�+�#+�7R�����aI��%T��
^b�!^UC�Bx����:���QeYp�퀯�������y-N�PX
>gR&��ܳ��S8�	��跤���{h'u����ގ��T���ǽ�PKEePQ1�~2'%pip/_vendor/packaging/requirements.py�W[��4~��އڳ�g˔&eYܬ[2͍$[(���&J�ű�$���'�v�$@�Kl�s�st�>#�D�M�2��uIS�&+�	�&e�f��;F$�;A�~	����u�{�E�g��:����5���u��c�p��E�YT)���si�agE.��'�mrNV��H�dd�$MR8��HoJYr�$�9��ފ<-%��{����D�!O2	�l%��N%!$η�g��.�"��Y��yP<�˶�%3�Ti0/Q�'�$��=�79�	�X�b���ȿ2���0�p��9�X�ҴC�l�;���n��}� A�K*Ȁ�3���c1�<������i����
�)Y���3A,�
K��$�{?F�w��ۊeG��H��eN�E�8�e2퐡�U��`�d�X�����Y}�!�gL"���c��vG��+��z~ZW��A"�R*�g�4M�S�G�p�c���Ӵd�9���u]�fHY͎di����K��P�wy�*��*��L�	���۠s�p0�1�ɥ��g2)�b�$1�]*��*��5rK
�q��a�]4��s���(8��i��l�p��;��H~�����tڔY4�ƃq%��M
+#~h;��Qo~�ZN��}���Ѽ���ret
b�O�ۗ�g!�pP�e@�*�9���k��a�(F�<7�;��_�ӰEr��i'�&=�.~#�s�\n�e�*���Y<�ϔO\���sC���5�>o:�g����!�v�Np�G��#�^��h,m*(��:��\$i��c��O�v4�F�p�
� z�>4@e��p
�x��}`�o������VHu�H'�i1��1O��.�K�1F�#�`��oh���Ŝ>Ī#��q-<�D=hn��yU��q��>�qg��`�I=B=����nה�A��]"���t
�g�-c�k��MSu}��^�XB�խO(���e��C�E8T��u���O,p�Z	�3�h/4gS0�Q0���p>V�5
�"����?{_���j9ت4à�-�
���!��4��?�����}�|U�z�����
g-�8Vx��H�=YK�ȞI�W��5t�e�䚐%2�@��J�(��<���DF���O8dh�%#g/.^�Fz=0�幏����j��35���Vr?O'fð�h�hbM�&XRZs��
6Ke�P[�DJ�ru�vհ�֬
^6�i���D�Sc�����u��{玵�����~���32_���G3�;�6�;�ŖÝ;<�`'ɰ�f�}H�a��W���7*w���������\�׌^����B�U:VN��L����̀�X��Buxo6�+�3��@祁�v��S���1f�W���կW�/k����,�=��MǾnl|Y%�Q�-�u�Z�|�{2ʱ��Tɟ���,5��!Ohj�����s�v�Aeʩ��ť~�L�2�28���+��풿^|~�d�'��[ع`A����9�v��Nl�|��ּ*o:2�J�~l�X�����u���1�!U�A��U2m��ڋ_�J�%q���=��6r��=�O��<m�Fŭ�t���m�R����۬2�:͘��}5��� N#PJ;HǗ��!�.>�u*ձh�OG݄�bا<���?1��L��^��
3ʪ�I��t�:�*>�NK�
�4b5���7
��L�nP�Tʪ7�L�lu�N�dN5�M��P��ES(�=����K�.�/Ge#ᙢ���/2�i��	�f�VOO೓�=�}�XA��Ӽ6�)�S�m�C+�j	�����gn��'�8%�{ul��oř,y��kܩ|;8+�WԀ�������ޘ�Ӱ�oPKEePQ��)��|#pip/_vendor/packaging/specifiers.py�=�w�6��W0��QxNn��/r7Mݮ�咼&׼}�WKS��Z&�$eōӿ��@P��4�n��ZG$0�f��h7z3˪�<���N��<�g��+5���D�Q=SQ���**����E�Ÿ��l���*+���q�?��|B;~��iG����Ϗ��x}���YY5�J�(��.�k�w^�QZ\.�V�D�I6��󲸌���e�,�xe������*��Z���0�dW"6�e���!OkDt�H�?�]Q�+� ������1���fܪ��q}�P�0Ze�l|	���Lx	mL�7{u4~�ףg�s��;�dYm�A��E���<�I��4{���fZj���j����")+@8;w;��]�F2�L�����>�E�O/��<���M��o����1�-9�+�	Lh����!�7O�%����r!�~[?����v��+�r���F��I�'�;��b�>C�\�h0|�`j��ytr����H����	Bt�_�tN^/T��g��̗�,�rp@#�z=��&�G�i�X�,�a��`�������h�:z����e�:�T3�+�}X�ӯ��/<F�ُ*��(��>���5V�IZ�Y1��u���J��55�1P����!rž1���{�8�H@���T^'(%V1X@?](�lL�˂�L9S�+e4W#���Ah2gI5��NP5k�L"�]��[C޶��j�`6��2���fDE�\��J򆡨 V3��#@>�MbUx4X`< +U��	fk�r�/N6߈�EY���-q0|��JU���(��+����!�1��_̀zBTX�SvMbج$Cs� �s\���&$Dΐ�<D�A��(r��/O��K�Yn(��r()!�!��Л�����B+ˁ��U��VNC�_�1�P���O?�.p�`��*6�Qf��gHO��v�2�Mr�s�[�Pm#*�)k��QU�_�|~�۬fY:��Pn�#3��Q[��q��$�ƍ!u�*p�z��T�|���
]��
r(�j���
Q�zw2g9]&u:d�ڍK5U�a�&e:��`����o�O�d�j�/�c�I9���x��Q8<���h��;cа�,��~�0�7�ѷ^������4�"oҟ��kI�U�c��_���Z�rr<�� Q�3�&g_	����ȇ�{�džx=p��D��j�lGt��0�b���,��D�'0����?],�cZB�1�+O.���0�D�@�fK/Ҡ|x�п��Z,����ڭSH��[@a:��i�?����E�G��u1���MCuIs���?���t^�I��>u:�߁�7���}��f����eq�
�zO+�W>m��/�����ѩ�m��Z�p�HC
Ϸ�h4bZ�r6���1kg�����SU[Sm&`�ac������0���	ГX� ϣ�8vT�1�,OUZ��X�6�V�MzArZ�2u���-D���0��9�ɼ2��ES0ob�l0��4�>}&֡ӝ�ƀ8
����'�	���@g����n�B�����줬�C�}݂st�����B3�'��<A�޷��v���/I�E]`��+ء��j�/D�].3}wN"�:�S����pdo��WK�UѲ�ֳ�J	p	z�e�.k
L�����~�F��?=�5K37LƄ�1&���`�J��]�\`�2����LjP������=c�M�&3�Q���2��y1�Rކ�p6ގ���\��0!�*� h�C�wа}��+%y�4�a�	�IA1�Y��M$	�V�@��;�fc�KgȜ�|�Lfl���@�=�i������|�����HϘyN�yO��~+�
�D�ށ+�-�`6e�{S.�GG@@�_�G�@<�U�:��I`HW�͆UP a�$���s�0����z�DғXX6�	�xʋ�6nlzP�3,����]`�ho�b5h����1��eٵZ�P�J�`-XAҖ���4��T�4�S+
d�����"����X4u�UR@ḝ�Ks�.�z���-�������8Y,T>i;f
�G�%X��3�4j��z� q��W�|>9�^�,��u�y��0E͒�5���u1�Ŋc� W�,�	�4�����
��q���E��rh�!���A<c9���T���o-�%���@:� �3�L�]�k�VmCV�]^z������p*;%�C
�ڀ*E,1.SW�`q��WO�99�F7�F7OF7��C�o}W�9}46��'���jp���@X���q��o�Y�M�Õ�r?�z?N�86?.+�9(�8�FhVZ7I����8��a�HR�m��/��i1/rzy���dh�	/��yQ�J�<""]U�U��(D�		��%A/�2Ѱ��>�ЈM�` ��F���G<�8�*F�'?��f�=�"�D���7Ħ?}����G�
~9����=}}4��AG#0�=:��5��ݣǰBƭWO��\U���v�Cj0-ڇ�6ONo��~��N�y�Z���qv	�l��{y�Ŕ��7��B��4��k�5��|T"���ѹ��0\�S����J���ޖ�y��0|�%����<�T6~	~:����b�C��0�Yi_T�O=�M���ƢvgP
v4%@�NPvC@
��~�LU�\{�H>Y��6];r0j�)Ug��Ju�����g���4i�	����ϣ���#��;=��W���ܭN0+����M�5�p�3QU�,�SF�s��&5��&WS{\:)�X��b	 ��qz��c��e��ƙ���k�t�s��6�ۂ�^\|p��4�.U����d:�͒O�Y��67��-E�K��Kt�y�_S��˭6U����p��K̨`qrZ`*Z��m>'ుGM���ޯ���>m��ɰس\q��@/�/"�a�h��K��q��P�9,I�R]��0��.y5/�$$�ֱ���OL0���(�w�{H`|E�gH
ڣƉ��*�����I�U:p�yN�V6�_w6�����?����_�Aբ�:��M�ϻ��9أ�z���?�t�����p�.>mcK0�����Lo��b_T��@��*S�v��6�DJ�[� ���U�� �Ps�Y����
�}S�#ƥM ����J�Zl��'O���+��w�XSN�I��5bL�����B��BGeC"�4$B.������p�݃���OF�}2@p��?7����w{�-��Nޣ�o��O�Y|E!�$:c@��k���	5e�N�iV�q��<Vj�'�a��T�C��W�,�[u����8LPV��C�/��0o_�kV���)8w��Zr4��'Q�<���z����7L���)�A�ksj�u"�ض��
�SB�����g��hYRʻ�IUpa�c�^.or�h���T�z^���8^9@+p��0�ղ$sp�1�I��7&̝��pZ�P�Oy�ځ�)��XP3���5�;)ϲ�L�k7����PR;�0c��ͺ8�h���U�	�>��MQv��B��,��U��9�����V�U��y�8~��Pz��x8���鍿LԑpL�>���˹l��YU%|���Y��9p�JU1y���f��\����i��K�e�T�8��|��{��h���#ʙ+����Ec$�t+�
r[,�ʞ�kcR�c���WR+{<�uِ‚�Ž��"���yV��y{�8����f���o�\�M���u�>�꤬+��{Heo`���K��7�O���p����բ�����N��lz:���a��99I��/cG�|�=@��:v��"�>�~{5B�G�ޡ���A��5��g*��zuW�s�(1/��-���f{b�t���Z��^�x7:�E�)ŹL��������2��S/�g�,x8�F�㻽�����g���:�����2-�AB����cx��t�R*_�۟�\�AzhQ��H����)D�W��W/s�͑u�m�Sr�Ė7 ۃ�2���a�;�>/�R��`�"�(U�I:�TH�K1�O1�SY��-L�
% xY�J\�3I^(�l�<P���2�
L��x�h�����7�38���
M�,*�W�l�*�t������jg`59�j9�c~yk1�LYD`h�x�O�9]K�7�ô{.��՜�I�l�vV:W9`�\�5�f�\�0{��R�U�C����ʤP���C<���~-W���Qb/憄*�WEx�MV�>��Թ��\��Kxnm?)b�#R�+'i򩳴�]�[�~���
�����2`�ϣ�#�s�/�DTlu͗�C�d�2�$̉��xK�di-�_P<�$�5��D�KHo�~�Xa�G`�m����~��xW�ߚՂ�;m�=���I1iC{��Y��]��Jgs�UZ�Ү���� 3S�B��Z����@��_bOnc4,�[D��FBn�tˤ
h��$5����z�%Hn�X�����e�?7�C��&��H-Kn�vD�0�&�q��@��5eT���ݰ�̈́��u��O*��ِ��Jy�*��*��ѓ���<r�/��u��} �s�j�^
Z��T;�^.A��|Z�g�Ь�Z\)����;��	=6��Ӣ&�����[1�A��Lb��֖z�x��k�ݝrlr���f�\K�Q��]��z˙P͚ߊ�:�P]EUo���P�m���j�Qc��ڏq���z��֨/x�N5�=v��=��h���=�^gr]F���U:��\'C>etR���]C9�!n�(����F�K��9��|G���mvm��U�w��>M	��A�������6�����s�Kն��s�5��^>���+7��:>A�Q ��z^���GM$�9G�7wM{)R�U��$�����[���:AC"%��Ŵ}G��x�wLӗ����<:�3�!�k�sHG�C>�<�Tx
�C$lT�^j;�B���9Eh1���[B�(����$��a�%��.֏���_�n�'�J��lz�����k5�U��/��R��k��V�X�HQm��x(��U�bg�!����`�:0I��O={]�
��F�U���J������7m�&�Y̑��K�1���L}8.� �1T�p����0[����7#�i�׆W2�=W���tV�ܲ,6��B��[�'BC�/�᡽��}����?z)����Igġ#���=,
J���a��(��Tp�2s|#��6����G��dX|pډ%=�>��Q9�+����s�)ȨE��Fo�w�,�����Q����(|h�ް�g$�%Y��k 
pR�m`����y��V�I��$�`�:��9�p��!��ɋH%�i�Dr�SQ
�Y��=��H��5j�x����0J�X+����hs��X��)�WAP������9O��S
���t\s��de�d,��a�5�x��$e�$��O�k�"ׄQ@�V�}L	���A�7�"k.��-�O��&��w�%l���b0�މV']��sN���M����J_��7�$X���{"��30����m�Rܜ��~:�0�\�ë�#���VE����2����������PggUx�=��2h$e�w���T�����#�̗���c�mU���xt&��ZgEF�m�z���������\�7��c%d�Kf�hj�o�M�@�]�m .��.�5hl�B{�~�ڟa��+O塛_�h����2N�U�0�����8�,NazmpXx�Ĵ��}�VAM�U���^��L�B�&�2Tv�Y��ʔRZ�/Z��߁_���[�O0%�W�aIp�pH�+;'��rNB�mW��L]=w��W��e7ſ��c��e1�.w�����L&]Y,��ҏ��=��%�-�ո��Ȝl��G
.��C�07�ۈ (H{Ý!]����x��8��NԜ5s�!��~�%�
���}�g�\5P�F���N�d=��%�0`��*�F%S�:K�J��a��7W�v}��/Y���
�ʳ=�e����Ui��zK^�g�7�&���r�����K�
��� ��qJ���U#uK���
'����<)u������Z�Q���I�D�o.*]�i���b���/Ug�m ��2�4SJ�UDg�Ѽ(.�����4	���o#ᏹh��^(y!GV7�C��j|�����ɽ�AsfK-]5'%���5+X��_����#N-z�����O��+?����:i�Y͊� �2���ism���:��_9NEj<�i�$�,�-�"p����̂��|�?D���]�b��p��=���-;�|�'���
ULz����\�nLS��T�'�����5@���J`��MQ��,����T�.v�����3X�Աcgϡ�}lu�(Yܡ���7L��|�@��[����޽����lzw�—��\��+�k�ÿ��~0�MbP۲V��C—ђy���7QrY�S'3��6����4M��vH��G�^���(�}��!�f�zqk����
�v�y��Hɀ0%5�u�W�,ʬ�R��y"�7Mk�SAȾ#MUD��9�p
w������g1T�|sX-�0G����/kmi��"�Ud�ڢu7��|ZeΥ��7�.L��B���u�Xf��1
��p5WA�,>�W_W��|��e���h���6~�C��N�����y���5�q�ț|�\�bx��J��-i��Q�+)�?�uԷ�3���i*��]y�]iQa�UC�<N[w�l�N�}��ˎp)qs�u�aď)l�C�h3��?PKEePQ��'^pip/_vendor/packaging/tags.py�<is�:��+0t�	��h�����8���Ʊ3����$���I�Ow ��ݪ�Z�K�F��h�7�<��4�C��ҋY�a��+� �X1Yf���S��[z>�;�`]�k��Q�ll����2/	���k	㰳0���G�'g�Ä�eiZp�@A.�<*�l��i�t���"dAXxQ�;�,]0ם�E���ˢ�2�
�M�4.�����~�EY`S���(���
�Á�h�,`XQf+���s ����=�xxx��Fx�˂�A���s�6�2�f�9KR��k�z��m�u�����%
����,,ܼ�N��0�;��6cB$p��l%3y����2�
@���Y(�EV�Eu�ʵ�~�L�
۵�%�<�v�b��k9��?���o��yt��|/GVO��B8M�6=����/���a��;L�B��ѩ��қ�a�Ȏ�ss��N���;g�2L|
�y��Q~L����i|�*�i"�fP�����O�;�W�	>�
�
��- 8����r�Q&�����j�N�>��p���������;��oԍ�$R����┼	A�#���}�/��l�ؤ�ei� �����g@��;��
��<^��uQ�p@�h�::w5��L=Xu7y��!{������^��sof��ϡ_t���,����<L
gTj�›�"�����<v=����v���3/A �<�j.Z,�I���C̽|�wv��bT��=�
�-o�����8��F��y�9�'X�3f@4|�TX�7��\���X�Sh%Q�v�S
���$�V�\�?���d;}uX�%;I���C��N
��]9qz
R֩�C��k�K�H�� 	��,]�Y���uJ�l�è�x�%�A��(�A��rR9��\�hm��/�l� �YV��$M�
to4�#!�6�����ht���Z�,�0ب�im�,GM�SX��и�x	��Q���Mծ�s�����),��a3�n�OW�z�6M�[�ջzm�x���Y��Q����G(x�
�|g�`���/
j�\���q�>��
z/�C4�]Tb��긲� {���~��sRӰ����
H_ۡ3sا�j�K@O��d���3�����<$�P2)�P�ht�Kx�ȃ�RF�׃,B�{L�<�D�ċ�WT��8!B7,J.�\�A>���b���}��夕s��8�z���ś�Mҥ�=
�w,mbɎ�JX�F���]��hY�D��F[��θ>!Lմ�,�RB\tݫpu�f��~
*�i���t��@���t5��ۥ���,��|D�=�/��bN��b.3Bvqڽ�x!@�x<B�1/g��^��+s��"�D>���C��܌�1@�ab�ᰗl����aqe�4��kg�.m�%ì�<�I›Ž�o��a@G�e^���xG���AӀ�	^\x��B-F�����ٷ�dJiS�������_�I�h���W/�9�Z��&��k��dW_���XE'NKG9m3" ۂ(�s�	�I9��k�P�,"��/�#�T�|w�P�:"���Vl����fp&	igQ%�� �c�tф�D��:M*U����{`�a1��huԝ��#���;r�%�}�"���~�!G�O#�i_x�q%/ :Fn��|����	���==݆��C�S(,�\!����P�WX�pZi�c��|:f��ˆD���@&H���`�&�I^P4��
�zA�"НK��Y’�ʢ<M���.��W%&�� -4�χ��
�,���Z`?>�,�|�	.�Nt%T}�Z�W��W�X�'8G�_L��1�K�(�;_�m�C�^,�Q�d�EI�^�,H�<yT���a]�U�D�����#M��rl���� iP��2D�k�� A)E��2��5���0mA��m-��V��e�o�FOG����������γa5d����rX(�-��i4��`l�R�>��I�t4,��
*�I���<u��vcJ;:�������1�:��ʼ!`:	Z���ұ5���2��4}��}�~<9�?}}���A�bя�f̶��
O���B$�s�п��c�hq��z*-e�i�t��5M㤌� g>]J
ĩ0��|�)ӎ��P5�@P!&�>�h���eX5'��|���/��Q�]�K�ԩ��X9����}���Q}�!�&	��
��z0�V��5��n5����%��K�P�m�oa
�^�ӥJG���X�c���R�2�wa(�ˊ
k�ez����ҧ~H�Ǐ�㤠ɺ���8dgd�A��(c"t�E�k_XQ=�����\*�)�L|ar�e�0��_��D/@���a�8@���9�q��7��\'����{�6�>������{��c`$�ȰzU@
n^�J��|��G8�Gx���(���F���ת�������:��U�h�S
0^!{�2Ƶ�}���"l���(���t�Pw��]�Y����HL�{L�)W�*O�J%J�):%��'h�'>�����爦�/j�#u�����^U��[�mM�`+��)0�����s�S�M>D]q�G�y�
�ƅ��p�JW����ЅG,z�^�V鄁ۿH����Fߤ���Ge�t�2�>�CS7��*��umG%1�����h�@�ݓ̳��
R����)��l���U�o!��F-�޸����w����ACL�f�ڄ2/��#���%(�A�z�{g��Qs}7�F�H�\�u2��]s@�N]���jκJY�&rٮ�a�W��X����N�DXM�緙�5�I�)�F�ZgC��#X�0?����T�Ҥ,�4�^���**(C�P���%x������jk��nR�܍�[�f�T�X�wm�mԂ?s�Z��4J���n
��.�-�X�Xc-��Qi7�й�8�R5
��p���j��6�8X���lkj��J���@y�>��* ��Rٛ�b�
X*�������w��Ѫz'��aX_���U���Ψ�M72��S[�q[������i��hQH�r���+y���ʤꦴaF{mv��c�
���T;nr�#J�� ��`��@.JhH�Pӓ|�2
�����ʯD����m.���k�RӐȍH���	աi 4�Ю��|t���UO>�D�SV�8�S���i:Ò�p�'�X�T�g��JEB�/<�i�?���c���2ݾ�%7r�*
��������.���"G�����׃B����7�D����X� &Q�e+�k�\
�_�4�:��xM�{�ɥ$\�4�u�t��ٶ�^K�]��^�"�n�7�r��}a�l�8_S���hh]���i
:�'��T@��-4�L��d积O���+R棶�&iY�Ѱ�޿��[�F��r6g��3�{�P^�<�0m�<x|ҝ⼽m4�T�<���|��U&��ŖY����أ�W��6-%��~�ž�kJ��"��~����b)-��N�P��B�T�}�XFPQ
+��^�|wQ��:|ܕClU&3%|䋃�����}��k!����1Н�%���*k\aʱ8�+�B��e�2��5��IO�2˰ArCg�4}�Eݮ&w��g�+��	�f�;�R
U��(3�u˶�fD���.��M	%Z

w?;ba䭸�/]��DP|P��T��&#!9�&����G��Sn��f�jbIqͬ�x�:���D�ԚZ}i�(�o\���$�MoI=�0��
G�D�u�A���ظ2�ё��z��A<�n��X��GIy�*�V�̰2|]�HKB�7k56�>n�s�A��ܣV���G��IJ���@]�~�š؝=�P����Yڠ,�NxB�֎Mt� �&e�S�F-�!���F��e.8�TJk�^�MP��4�s�k���[��&w�t�~W&�Z��8iST �|�T=a�-��h�9*pu��h�#��ɤ�A�r�ֱ(<�SU��E����U;U�}[/bli��L���=A]��kf=�)�bJ[x	�r^;`k�{�0���0^�!����d�U�0R�9����L�	X�ي
�r�	G�f�%���k����ʾ��cMy	[bgik����?��h2ݞ����,�?��Q�����
&����h�Uٰ�j�x���w<x:j�G�]���9����w=���)VG��
b�A��8t��Z"�����F��v�)J��R�����p`��V�*��1�:�:	O�g�nӈ
xa�5��OͨC&��٣.�u����L�P{d�5̧��2R�%�Ջb*��ɛxww:���5g5TY(�KW�\ԟ僖�Xz�6#��t~���ZG-�=����	��C��,����Sp�퓏������D`v��ֳG�iGS:PH�,hܭv�!��^,BG�†��,��7k	
r��5�̉C��v�
�T�=��4�B-4�f�2C�&�]�#��h�%Z��G�N=x�4T��2��IZ��樯��,�I��XL�"-!�
�A@�1�J�B��|����v��l��,)�LKt��؝6@]"��/���b��U�`x�):�f<�¼`�0+.0�y �A3�k�l��6�bv֨Ρ�}[[\*���s/s��� ���Kf�����l�G�(in&���=Fx���F�!(У� ��7��r?�dToj!�#��,Ĩ+t1A�5[�)^���,	�a�{H�y�-:j�N3i��4\r�)�����I�6�W��{�t�DN$j�$z3�Fi0 c�B.�ߨ�$!g�͒N����AWV����P ��^BQn�>z2ݻ��W�\&Wb�$���V@_m�����z=��9���$���[��+E^�qqx�Ð�Q����T��3�+��{�`��?�=��FO�>�l�}Y7Pbg����/h�^^�{�.��o�n��-����υV�*N;��V� O-�N5�i��bO %R�k�8��s�Kn�_�����L�h��iQ�:u�4�ȁD�g��Ҷ� {0KfJ�r������6/��*����=�y�2j_A��X�2+�p�͔�:f�Ym@�I삢��*|F9�Y��8�
�>:B�G�gÞ�����pA;�����ԗ8I��Tb�)���`X�9.e߃���6P�dD�����'#?Y���@f�t�x��Ʀ4���=ZQ���1��ƫ����E��'�]�u��[�8����*�	�:���ayN�Ͷ�j��"�B�WtqH=l"ZwNx	���(7
�~[�j�R�g�UԐ��q��"i��ђ.�}���h�=���!���n?���ޑ��{gg�!<�v��{(o��;������;�'�޹��;p9��g�g}|\=������w��[;�AܽWG��I��S{����?i8<>�;w��}x��
`�rn��vF���b�s}�<�XJ�+{�(jY��!%�|-~�����q����&���=4@��r�\=�hK���~���(���L�
\a�$?�X����v�6�%LJ��et�7tIՀZ�EtD���z)���j��/c~�.����/dEګ[(㰢�$O��.3n�l�٤^�ݓR�*��T.��N�
�ڨ5@ӜW�	`@�'v���]#*����[��y�1��6%���UG����:j��B���pT�j�Z"$��ᓆ��Ib��ԑ���)��dcF%�
H :[5�
��<�N���n��w�7'���r��}a�rq��8�{���7m���g|a�\(�[�t�>�l�_(���)߳ˬlbu065��]wS3Mk�/���gu��{/U׬?�g45�?Q��./[̧��B�9DԽi�������}�Л�x8X���4�a��L�po����� �s衄~4����ޚmy�?:�`��dm}�e<�A�'BЩVMu�=SJIo���R;�ͥ���}��������)���5�_����#�z����<�z�A�|���F;Ow�����ֳ���P[�X8�V�&c��ò��`�~ݍ�������v|����g�%F=�,��l���q��݅t�z�TG�T6�
�Ι#�1s��xzϖ��-�4��.<b~x��jy�:U�vea�*�겁:vo����~Y��ӎ5���n%C]Y�'�T�C�c�‚�PdaZ3�*X̮F�n-v��u���e�[Lm�2��F�=��kl?�Ҿ�tx�;�CA����I�������'�����.mn$�q�tOUMqK�
2��!o?P�#?�Ή�&�/�1�0�@�Jh�3��xu!/U���/�s
4/�q���	Q�w�3�{Ҭ����)�y��w�N�ݡ��0�~]�"�2����ڜ�cO��D���
>x��M>���ˮ��i���UY	�
�[�Y�N��V�G�Y�kDk��ʔc�Q�0ڑ��ԍ~zC#g�02�zҶ�ݾ���E�|$�KÌ�W�N�V�CgL���bL��5/hEA��bb�0\n��c�k݉��m�k
�:��B`혣Jg4��N;��O�/�QE���VU��8U�^S����cVmj�t��8f�{��z����vޠ�ϫ�^mZ�<\�{���шg���?��%ʴm��Is�a�\��)5��e��S;�%^�[�ϴa�zs:�(e�BEoN˗i���)��(��9�W�G�(�_�9m�ǡ�_'��K��	�d�&�Zww�­0	8:�i`�
ƛj���~S4\��(6��N��t�?PKEePQJ�f`�pip/_vendor/packaging/utils.py�T�k�0����f�D��}	t��a+!��`t�(�9�fKF��cc��N��4m��ؖ��{���-��\t�j^@!R�3�e����.
��?|�xJ�I��7�F(��
�����.o�;�[D�8��Oo�-��kZ)��&+e�UzK�r�!UeU�E��rQ�Z��$ymk�I������F�Ťy�C&V�	�C��� S�m�ƠI����\t�����է�����>����jj�7r����D~�d�#|Q�HEUQ�����Oq}���ٯ�'s���%Q��l�K����o�>�� HR.���h\�42g(���~����A�9H���x�{N#� r�a�㇉���Bٔ6����-�r�v⏈c��G��{VV�5�(�a����H�>��"�nE�ͩZ���.���a�]Y�fF���/T�n�$�$}����v�D�z,
y&�5ʴ�h-��O��oA8��
4�F���H\�(-�i�7Vo���v/:
�=7)VO�sރ	.x���盤m8G��������h�T\[C����q�ҥ���o��"�]�pO�C�*�Y��=Y�hmt�]�/�ִ���Q��_Td���m��l�ڸ�	���Vp#�����h�B�c!���t�mbm�Q�)k����4�է�Wڟ���)
�)�CIY�)cO�ѻ��y ���v������r��	�W/"$�1>Z��M���h?n�#�ƒ^@y~��Gw��Xw��8�PKEePQPz��n< pip/_vendor/packaging/version.py�[ms�6��_��7��Y;�ݵ��i��z��O�K�F�ɨ)�(�J�~��$HJ��N��,p������boϥf3�
��%OY*�i1e�l*+�+�Zh�����'�ʐ��;��̳�{�ϦD���KG�S!���ы���C�0�6��	�(r-�\�o�+��"�`SQr��h0S����lY.��c&E�J�':O�������K���X�dVB�,)QЁ��i*�I�&	��y�V
J�(֥Z&�S;�G�Lf�\�ر��R^
���BfsG��?'������Gc��1����,�.�0������)��`�#����F`n
z�.P%����@Z}�A��e�����&�ޮ
��
[
�mآپ����z�(q���Ķvwj���#�/��z�����n�(Qi�gztɩ?}�����?����j�yjp<�ne�T�V���(���̘�Ţ�I��-�d5K��' ��Z�t��J��W�K�j�m���Ev��:���:�%��|
=ݤ����0�#�ә������r�
�d���E0b��4}
G�%O�����������۷�o�@�9�6�M�񅘖����g�L�Q�Tp#�T\�W�����S460
��T�I>�4X�ao��{lV��5��P���A`V(‘���L̘�y��=��92&$P)��^�r��~�x��|�+hMpy������"�"8����Rgd~vrx¾�f�zL<R�vm��S�V{���[)*��sq��}as�;]=5j����l����R*�+;8N�砘!�4��/���RC��2E��pWΝ�z�i�L��ֲ�/h癨'ƆEb�<ά8>�<��Z���6C5�hj��n�Q���MĴ�x#����m�B,�E��a��bHX#���d�����)�}���d���.~�������o�Zt���~�b��A�O`�/ZJ;��[І�^�Ѻ=��Q@�����J1=�7�D��j��gI%�g�Z���>�m#{���Rny[���fP0����#Ug�B�U=5"\V;,�.�&2~/6C�,
hz���H��: ��	I���O}+���GxD�-x9DP���
���*/ �YU��2�O�L{��h>����l�ó!�fDo�U�"kM�>5 �w���OH�秅�:K�i����?x�7b�Q?8����쒠�̕��@�{)a���A���속���3��}töC�	�
�^��]D�)Oȳ�^��&zļb�I0�~_Jq�m�/HFy��T�Q`�����،$���~�z�ץ&��1��v,a',m�O��T�2~��~�W��\�C$Q�����J0N
��(��$�J�-����{�g(w�����o�����]���MI�l�J&,�6|�p%��}��4~[�pf�^u�e�S������RaB�K���5%�*�DNNy)*l"@�h�M4j	ܸ�[�-)g3�p�, 7P�$���8z,n�2'DĞw�;��t/���c��J�X���߰�	i�Ndj�W`6&f3�/����$�L��]�K/M4�2Oc�)H
��8���d�$�TCtX��Y�}[)m�7��~�sm�ur�X�-�d�T�+.�0�u�T�Б��ܱ�c�h�d�H3>ͩ:�j�O.���TNW+#
-S���Ճ���5�o���;ͯ���uiWG��+Y�a��핡�"�Q�SY����c�u���繙��5V9,^�_�mX�������ۯ2IT�Ű�"<IK�e��� T��P	�
ٻT>w���<�͢��O�l�r�F^`1e�pk�Z��m�L�h1p�b/��<�A�p���:��BCF���C�4B�LR�hc$a5�4�ZuV��:�)kЪ����!���k����>;yJ��w��;{~>��j`j�`N���c�}d����l�b�+�Â�x��}�-�7���}t��k��qz0�7���F%7�o�c���E��2g��q�O����:mQ��t�n;�8�u�}Yo�]:��O���`��Sܨ�ݳ']��'\g �p�5�@�k�u����QE��E�1S�~�����j�5P-�-�]jЬ/���lLsqݎV��^S0�^�a�ã�xq+D�������o_<�8�P0h<~�5Vu�s�M�:\���ɜR��Z��|�vg�����\Aj�)8ذ����+\�VI�$8a��#��Ui���Z���vWxT�C,cdv^�
���.����'"y�}0����*_C{"��\��Aَe��fS��!H<w��0b�0�����@#%DzU�C"��#�iͺ���`v\�G����8;0(���I��8���!��o�
i
W���Ӝ#5{{��G�QT�LlL��D`�lR�+ȃ�g+o6O��dd��
v�l"�q��a�s0��d���X�Oq�u,��C/4�eM��,�}��{./�@�/*I�~��z�&r� �5��zm��5zB����DQN|~L����ߤ�&���	�f=S���ȕ��|����g�R@��h�N��bhqW�@��A���Us�ck‚;2~��Jݛ|�B��|��jp��OS�����!�.R�2���-�k�p�!8��X#�EiwOh�{ņd-TWNl��n�p����;��1��f=L��G���RኾU�;��+��j
~:���p�[�6�!�r��Snkt�cH!v���٧=����<��jxӷEaXܷO�3���3���黎Ղ���{�i6G�9N�T��\
6^�ص��Z�2{(��ܟ��=Q�ø?Y��{��/�3m���[��r1�����'�o�6�՞
�G�U߲7=i�"4���$-�kE��	��!�Ld�vp��f1�ޓ�5�����8C�Ƶ���+�L��W� �q�vC:�l�
j%k�N,�P��UG�R�T�*�,A	��U}
!�?�	�`�!t��*WS�B��Q]�+�T�[(��g��3�A�E�+��XZ��+8x�/y&�M0G�ϩ���Ҷ���ۥ��k�M���fc<~�/��s۳u@*ـ��%S��;]<��(n1a��̖�Mr���;V���֜���\�4�2G���'���dY�G��ܦ9�y��-5���Vk�Y�fz����
E4��n���v��=4��?�K.���x[���Q�}�-��lL��怵�6��p"t*o��|�n���9I�ݨ�)��[ ��J��0��a��пJ+m4ڟ
ZS4n9����U�<e����9Ds����5�W����5�aa+B
{��\�kT���X'=t��	V��Q9��X��+�)T���^"X�����qm]	{AK�n!]�;�
��`2�v�ߦ0�x����u��`�R�n�sJo�L!� 8l��+��Lk�eV��JK�(n"�� �3"Yo�'���ХŢ����'<�0+ɒ��/�L�K�g� ,Muj[�JO�k�S�[!�"�YI�b@k�X�C�zX����tV<��N�� �cgT��b{�6�\d���	���l|V.��sõ@�n��w���p�`8N��x��
J�s1ķ�K�c��Ws��h� Ɔ.A��m[���6A7@(������2�N*��2��9�P*����1M�H���X��$�jX[|�%���;���ߗ��"��łg9~�7��"p���'�ZB�F����fn/ܲ����&��WG���5C��U	�_��(y�ٹ�'��y�mr��{رWj��_�6j�}�a�Io�AKxl�
z/�MW��N��3�����s�����]��-a:����е�sKp�)?�k�\��OO��]�6{��vu�ƂkO��;�OŵL��ŹL��󸷏E�P���S�F�җ'a�g��+ƒ��k�ٝE�k��;�=��PBP��x@R�`C�a{��a㰖�aT3���R\�G1�@��nb�[�t��PKEePQ�[UTpip/_vendor/pep517/__init__.pySRR
/J,(H-*V(�WH*��IQ�,���S(HL�NLO-V(-��KWp
P054W����.�RRR�⊏/j��ϋ�W�UP7г�3R�PKEePQ�
� !pip/_vendor/pep517/_in_process.py�Ymo����_�Pp ���Ň��:�I��M�>�Vqy����&���Ҳ�wf߸�(��K�48�%qvfv�gf��~�j�$���~Os�K2"�i-��JI'��(�ZP2mX��i6��UN��ˤ�;W�>�t��q�e��ӂU�d�Vk���J:$3^)��4gd���*i��C&X6-((!�ߧ�?��S�������ɛw㋷#����R�ln������٨��B�X�:���-�Z.���p p�%��F%w�W�!�ҿ_���c�%I��_{�K*��l3\��ڕ��FT�CV�j\�����%�-�����B���W�C��#�'-y��g��g.�OzKF�����q̧$5~p�W(�b����:��f�� "sVPĉh�B��L�Z
	&�W�l�K��+�U\���PfsȻ�dIA�fE�S�L���A��}�1��z��^��3P�U�z	�����������!���R��;��9n.y�B2^�����7�����_���t�ȧwC�a������)���i�h
	�f=E���
0h�v�C�Iޔ�10���m`P�>��f
8���gy<s��t#G�"�g�|����n��[�͊���*{�X�T�g�V�k
��2cY�B�+���dH���9�ܘJS`�6�++p�$�����y����Xf�5{|*��[������7g��������d��ы҈����@5E�G:kt��s�4�9��롧ȳ��<���Lڅ��Ū5zE�2&U|��
ܲZ����j4��(g����!�J��L<���m�6�- ��^ɫZ�9{�'۽�Ѩ�j���Ɯڜ�mLND[wc�vw�ANr�J�:�
�z
��n

ǰ��X��+R�yt����-Uq�ѝ#�}HW���}�п���r���Ⱇ{�Z�&��M=�Jh���$�5�-
85��Bk�޹=����qtl��I����F;uF���!�Zd,�j�5�EJ��9�,S)h��%w`�e�*^cĵ���4Eإ�a���0$f���"�d�nñW�~'��
O(T�������n�žU�I1���h���d��h[�V�^��;[Z �
��jA�`і�rAiC���6�T!�ɶ��0�K�kn̊��4K��^j$��8*w���0Y�3�lm��A���jJ�9B�Ʀ���(5�bi���Z܊��.0Ğ�%�$�T�a��Kx�Ӈ�P)�(��L]�ʇ��SvM*�.��w�R2]�͌��g��|��ZQSx��psz�A����-�����[7�o��'����[2��OWᇃ�`)�O
�
����r�f��[�ۏ�g�
���x�^w�������%��5����㓷���h��uΤ҇͵2^.��J^s@��4�?Dq��"��"�����S���ep��d���N�CEJ�KX"h
e��E4���ϟo�ph�~n�xm��C�9g�$�kDd+�p��[��z-`�4�/x��缩r��z��P�6�aj+�>������~33�;U�}1��8ue���U�JΩ�u7��	JE�ۉ44�i@����לB,�s�(�N��B�}Ե.�r�*^)t�߮��=
�ɯ���o���L�cr�q��U;S�4�2��"v��y��:���t�(Q��8~Kl�!�֣.oJZN��#�nm��N��qc��h��9+uW����L�}��h�F��t�F�#�6�:�e	~��V�^��`��bw�CB�8X����@h̉3���|���t;��#$D�m�^�=:H`E4Xs����̝j227�6@�7k	jӨ��V��3p��8��y��V���Th�3�x��F�)]d�7"!�F��~aEa.sHvxf��G|�"�Sk3D�w��p�/j���mX�Ё�ao�3}���-��}��b�
�@�u��ǽ!,aҲ
���+�x�V�J��;��Iֵz��V^�\�[��a$�\����:�C�!��V�])8�\[n^nRۘ2�ߔ�gk]��{�ȧ���0����1�\�o��\��Wǥ��[�[@o`��3�a�Xa���3j���u%�'��)�����ZE&��ԌL.�ڐ$]ʾ�]k�^Y������VbH꿁����L�B�k?G]ф�~a{��ޕԝS���ߥ'�?Î�huѾ:�eDO����i_E�/s?}��/3��mk�K�L�>�_�#
%��>�׿�4�{�v�M.�C��:ye�6���8W���CEڸv9u]�W|i*��|'��VE뎝��Bƃ�~�k��oF��п~��S�0��}��H��r��KԴ��������oJ�G�_�+�����x��9��ur�wF���oQ�,@�,T�բ�p%�!塮�h�'V��N��־��g։Rdkڽ�	�(Н�����.|�L�T�WA�-3^�/���t-x���F)��GGH4[�7M�=I��X�i_Li��PKEePQ s2��
pip/_vendor/pep517/build.py�VKo�6��W.����A}ضɶ�v�C�K�4���H-I95���I=�&�9Dg��7/�V���6L���/P;6X����������j�ɮ��1a��0�{��{�H��f;�;�˾�GP�6,���ڤf��mt+P�;
#J)�Ku�F���jF�=�Ԯ���m&�5�8��Q�A��ٚu���}T�u����d���҃j.��&��fl��W�}Ÿ`
Ε��2˲v�(Z�ܞ,�*£���y��R��� ,s`��Jl'�m��%I
4�c_l�f9am�D}�4�O�,wLiNJ��-��RL1(�ׁ�b���SZJ�h¸`�]�<���6�p�hNA�Mv�����Y�����ߢ�(.b��V�f$Q��	;#�*k*)��+�V��O��+_x��Q��׶�B8T_�T3���"7y��tj�P2��n�vp��.�y�W�ʘT7u�xS��FZB��I�G���`̈́���[�a��pAZ,��I��g�K*v�}���0�C��n��W�ɗ�O��= /�w����A0Q$�Yc5�L9s���&ۗJ����ų�^�?�D���||�EU�͐{1���?븩�󉇊txN\p��^�'Σn���y[��|�?�vQ6!�o4'�
�5�i���[����xW�?Onh����!�x��)OM��}�k�ڢ,�A!
�b�����ר<J�ǧ �[I��E�!�hR�`�<���W+\/\*�� Z�d8˚� ��6n��Hvģ��K��Vv�T�_��$�R�z�F��ۮ�f] 2�h͞s:�M���"~H�k�,1Ju�ـ�Z�t�K����b?��f����;a	���4�C,�1:��Vʗ^bq�M�x��=�k��䈑{�ql��O��aq���G�����a��9�I�?�<o|�1�y��R�b�j���q|�N}s,`��C��-�G]����$EU*�4\DY� �����~���7nmN���R��Yn��:{
z���J�����/j'�����;3@�)���d�-�5�XnC\�^0�+����N��x8�ৈG��d,������-q�*�V�\��Ʈ�#t`:� ����qB�K�nL|�vE�"��l�Yj��=|�c��LG!!�	F�q�P�qԜG�3c�4�P��١p/�󰘁�G
#�a0dF�����.�1ܾ��)��O"M�oPKEePQv��Q�Ipip/_vendor/pep517/check.py�Xݏ�4߿�UɊmāҡ}(��8�J<��K���e�`;w����3�|�&˵\��%�=3��͗�$I�6��&��Z��%L����;¬���
�&V��FT%i/�/�7'ߒ�R�&�%I2�Zi��5ӆ�q��k�Cef+����kf7$L�_��JH����S֢��
h�tnն�,/�^���k��vb%�"�A��l+*/�4W`l���r�XU���O:Q-���O�4*�e (8���%NE�7­�<q^�Ji@!Rsɮ*Nq�ѫ����uc5�7�@�=���Jn��d���5׭�w��p���w\F��5�/��Rɶ��l6+����IM)�͜O$L���Fhn�3ϭ����z����c����9x�
i,h���0��s!W*K�y^x[Q�X,y
q�e!�I;^~W�ẕ��9Ng�S&P8y��^�ࣹm�$OY!?m:h�>]���t�����@�Q٠Od>%�L�p��?w/��Q�
Q,�1�`IQ��K����C���]� V�
o�k�#���P���3��
���w���|��	|��`�!Տ [.�~
��Q��GT�����Cj(�U��id�+"!�jP"K�5(Ks(��M:WȻ�`	��iD�!��F��l�
'A&�k�4`l2��q�]w[�F�\2.��/C�	C�ɯ�O89�5�\
h���m�A�/
p;��"��E�C����~	��t���#�)�¦-Y		�`/��!�[�9�0Ug{R0�G�����S3����G�S3�4S��o�>���L����m>R3��T�;鑦	��:�{�!�'b���1���:愰iK�cf~�NK����.^IĀ�H$m�ݍ@(+����=,{I�Y�QC�zU�gaܽ�(�8>�Z�ڼ�J��
{�j]�HKf���ed�n��ɹ4X솓-�@��8��A���.��-�+p6@4[\��֠ަ�z����2��=�x[�'�"��!-
���C���q1+�/�I~�55;�z�w�k>��䙼a�ؗ�L��C'����߿�5���
���71��k���f�3<�5��i	������A'ӵ��)������o
�]��Ĩ˄��]SHL�JʨR�[���f���<8��`j�V̟�u�g��p@`u�ʒ�����E;��U�L���c�JZ�0�C)��f��i�;�h0g�R/˝����z�z��b�X���f陇�f�|P��PVe:�X#|v�ӈ~̘yнlv�W��C1q�̷���)I��;���rL�TU��'�4ʏ�_w�^�v�+\x��4�xe��E$L�N�-I*m�n�Q[cK��%��^J�`�l�D������8���Z���~1*���R�m(��4�,.\糿PKEePQ
�VЊpip/_vendor/pep517/colorlog.py}Wao�6��_qp0D^\%M?l�^��<��EQ،D��$R#�:F���;��d;��y|�{|wGw�ݩH��\� S�`�
����kHT�*m�N�Z�_K�Sȴ*�^i�RՇaɒ5�A��i��v���V�V������K�e	T���	�M�-T2ŝ-.(a��pm��p_@D�0��[UA���$���p�2�s�O	/-��e.�L��6�1|��-�E��Y��u��-���&f��X��yٜO�ף�|��u�2�ƀ�UBc��[`%���G�0gP�Js���|�hA�����n�戒
c�x��Q�go��b��9��]�s8��y|�����>g���~<�����7����na8���7}�HnßJM����(�C�9'�ysx��)y"2�`\rU����ε$�\��At/E��2K�t�7TڒWP����t��:�OLP��t���Hk�����+�*�;�N�3X�[ꅩJ�6��za��[��w�j�~�&��Л���T����,��؏����n��"SQooz�ylŊ[YQ׹h�=�.������&?#����/+�1n@�Zzd+�q&ju�K�Q8�x7b�|�4�O�U: 0]�ϛ���ar����������Υz���n�}���y"�,P�����>8�/<����j4�������xzdp=�D�N��M�t܇S�BHa���<�{j���>���W����:DzL�k^�W`$)�M8��L�oO����b
LD�)�nc<�Hs��#���W�%��+
T K�J��ҩ��~�h��'�v��r�S�\���əF�L�h��iљ�
�s,D�Eο��I�,U-%Bv^za�y�1!��&�U��0��H�ݡ%أ^e3��n��1�ԍ���:�r1��y#/s�`k�S�D��L<-w�l����֕���t�
�/w��4�D�[H�ѻ^U��4�mEe`| �Z�ᳩ'4�s���������v}���P]�V�԰6b�Bf���ǭu2�Y嚸��˭]+�!�NiE^3FDŘ΅2��&�	u�`�۠�r�S��5q5�7j|��0M��>l��3iQ8(��%"�\
��6W�Zu>@�Y�d}��Q�߰�����@a'Ů/P�,�ͱaQ�Ü���OL��]Pe��K�K�����f!�5�����m�Z�="j�t:�bb��VF>���KP�G�+³���-�P���!���w��ZN��k���B�>�1���R�]	����L,,/̡��i'���-�*5
%U�?ڼ�r�xI���c2W���Q�&!F�"�z�^ل��F�(�+Z#z���OQ��o��?�po�lAq������@�7<cUN�}��W�B�o����V)��k�q
��;�^�H2��mގꗋ�G�z��
�V�:h�'�������V��]-\?���_��wϒ��4��Da�*�x���׋o�f�ZW�^�&;�ϼ�;�\.�qpL�ۄ����3DĽ��u�ޛG�Ä�N��=
�.�B�X�m���|ۇ����[�%���{;�N[�������Y[g
d�I�ݥn᯻Y�/|W�\@W�l$*=�9yTOέ���C+�q�������j������0�#���s��^�PKEePQ�]-pip/_vendor/pep517/compat.py�R�N�0��)���m��.Ҹ1�	8!4���f�q����=M�M�l�ߏ�Ap�،LΦ����V&2��	��ɢ$makH�r��X��Js�<�jm�������LJ�hAK��1��&cƤpD�W�F�ZI%��.�0�`�Fo���EG�+�O�6��j�p�Rs�1�sQK����~$��P��9����Y8n@|�\8�qZ�_��ކ�ػp���e5�J+��O������)&�q��������u������1&��J�WZ�f���c�����<��������؛�G�PKEePQ;ϸF�ipip/_vendor/pep517/dirtools.py�R�n�0��+�\�d�v`X����]R%�6�dP���GJv����S���{����	��a�]����v�a�[�qdl��K��Ȣ�:��!�w�@E
M⬑�ŗ��7����q)���v$B/���<V�R1�fui�C�q��9:����Z��A��*�mY�J��B�
!Ҧ/���ce���I�I�<�yJ���l�l����F��
��gޠ��C����V��g�a�hG��H^gS�w�073�k�@�E��8D��mZ�������ǟ*uS��t6ÆK
���|d:�X����A��lm�1���n{l Y������I�&���Gec�][���O�Uv�Si������ɵ�k�#�w�W�Vܚn�&%WZ��}	���@ϋ�A�/W�/�*�������f*/<��\�����w�Wȁ-���9���PKEePQ�
Eh�pip/_vendor/pep517/envbuild.py�X[o�~��xQ���޳�[ȃ�('�:�!+�� KT̍,�$��X��Eɒ��}(�l�3�\8����Ŏ�)�l��*�J+X�J�y΋GX���
��4ۖB�r�x�R[V�q���z��4U���#��2)�P�r=�"�ۼ�U���yE�v�R��)US&�<E	*���%ޫD�i���Xo�>i����ۧ��z��E�e�d#i��?���OS�Ƥ3��ɻ���C��6m�ª�A�EѰ��,�(q�{��7��;��(�rx��{�z�d�@�1)<�M�E�Ӱ��W�p���⧿f?Jc�^D6&Ƀlh����p�K���?�/�Z2��5��#�?v\2�|qO�VX�8y�>EB�8�`D�:Ê���1�	G�W�&u��0Ʀ����0.b�9����v��U�y⡟�מ���KA����/Rh�'�����'�
n�r���ǵ&��;��r/��F� �O�>�u�ӧ��
���ra�k���mx�Vc�FPPVg�E[2��Jq�	�n�dxe�F�.dD�w!���5����#�X�t�*��*�D�7�D�_bɐ%�R"�1�B*��$�$�TBM��Y����F`���Po�@;�����	!�H���OM��-���8�䖝B�Hg�"�}2ch�[�\m\�DiJ�N㖢-s4.Y��b
���c�ASC��,PI��ցF��
%��m�o�g�q�@W��,b�D��ʚ��RN6���SX�k�̌�U�B��ftR�!�ژ�Ϥ�,�Cq޲U�Vx
��(���>w��`��
�&��
���W�һ��d���.���! E0�������~���x[�j�����.]�����?��=_�0��&!t�0b-��!ߕ���5.N.��޻p�sB�B�	,'A�Oog����r��P�K�;_��U��o�Q\�W����lf��H�N���|�bv���g�f��b�Ub���l�߸p9��|���Cf5����J��4�s��.�a��.Z�
����\���u,P99
��^���{jHH�oW�A�Ko2C�A���U��`.
V-�za��Q�y*��&�,.v�y(wlx(8�9��&b�om�&LZ�cN+���A)Y�_ϝ��QUD0Q��aÇ�v̋L����U�oe�3��r܃�a�+W��,�±�ZΪ&-'�5�7��������x�1����V�Ha�e�����{��Z�_��P�5�|⼁����x����.<�R������[Ŝ��_��v��}�?�^L$/5)����}0�fG.?��<x��Ĭѿ�
)V�.NC��A�Ʃl��5��I��5�[L>3[]p�>�w�>����V���'--�9�&�?p�!�ɝ��_�䔘o=��2'eTq�9�iE�|���YU�܃
�o�D��eEB5�X�M�E
h�I��C�[�F6�H��Y_bm6R��T��]�p�k5Y�(��$�-�R��^Y���:ǫM��F_G#�X�Fv���ѕ�l�ieK�.���H�f�t0P�.��)�v�Ai���͘��y1|�Ĥ����E��v��k�X��$��Uߞ��.�[1P0��V���ԭk،��5%C�N�R��z��8I�A���Q���FQ5��Vc�?8U��$YR��z�j�KQ�S�5�v�����7*�~~�Z�Dq2�Ts��"��љ��J��z?���N�E���z$�+0���"��-�N�^zK�N6B<)�m�������ϰ!?B@-�ݱ���BusK"�vV]^��S�Ύ�=�EYM
�[���U�e��ʌ��$�ǰ�E�Djf��L{vV~���8�=[I��,�M�:8��1���|P�����z�pk�/u���A0�tǯA�:	n/�y�y�a�o0�6�q�|ժ��dԤ�(�j�(2jG��?�	�0%���{��;w�<v<cV���UT�
��Q���¾�&r�����ݪ��?w��my��{�PKEePQ������	pip/_vendor/pep517/meta.py}VM��8�W��`CC��E;}��ax�ٕ"�&Q�-���״��{���yi��%ݏ�sϕ��l�M���^v�Kv0�I6Z�Z�&��=><�?_�f'c�\Sl6�B
���I{�u��9�#O��_�4y���aҭ7�wE���M���Ы}3C��V�����٧`�`�����]�k��5��ƃ�!;?J�e��0����܀>��i/p����=������q��0"��տd߃�ٷI�n�cZpN�Ik�ɿS6���=#��lx�A�5�����V�βW�wq�_c�d7OZ3�ҧiQ`9�.�9��?�r!�@��(�L�"�<h�f���H��oCEa ����
N����U��6J/?������+�!�5�kF5
��G.y�Z���c��6E�`݁n�2�{V������w�$��u�7)�,;�#F�U�Մ��� ڤ�Y�/��]�2!�sf�-�tF6_��*�^؆�ks���纴�.�s�*�7 J1�+�2Vw���6�%LR��
Mx�,����R��S]mb.�Qv�2�$чcĕm�8Ľ@8���9~�m�=?���۽l�P!嗼A
�eZ��i��X������U^����*D�_��	?#ϭR~�V��k�e��tt��0�c��9�䉸+����K�W �d��m�g���­1�
�g���ߨ��/����9����G��E:��.�{T�U{����ӳw=��α��}�O���
�_���Rw�C�uc��څAb-�W�Y�d�Q/��#����z'$w���VՒ��B6d�d�S�Hx�	U~�8�0���I#;̕�bw�W�e��	�q�y�(^k��J�e:^�ߏƛ�����Bo�(�m�����ŧ�������]�N���k�$�hDkf���8Jq@d<���=���09�(��fy�����>��e�+��B�1ILX�PKEePQ�sÄ*pip/_vendor/pep517/wrappers.py��n�8��_�M,/TaZ�S ��K
v�
�t�#�6�Ԉ�]c��sHJ$%9M/X`�˼������Z6��M�h��z�j�Rh�YW��p���l��k��ܨTv�TYM��[\�F�-K	�U8��O�B��ۭ6�故��ۺ�S�Ǹa�]^ЪJݳlu�ꔼ�z���U���l[�x�:ۻ�fv6�l���l���ٌ��M�/�9k��m� ���Y\�ɹȑ�\
�u�<&?
�m#�N#�$�u��/�S2�`�Y}�/f�s�jM.�M#��?��gUi�8�$N@

*��)Jf�!Nć�8
]�e'�da�:�z�4+.@���U}�lu�X�KDZT��d�D�A����Xrn$åp�ONN>�"��4�+V�m��{IA���Nq�0+6Rޑ�Y��	R�:�ŪU
�Ђ!�@�8���}�<$�B�h��o'���۽��V��Ǻ_�Ѷ��lHv�(N/4��"4���5��D�H@
����r��
.04��5k�gj�[d�^�+��瞋 [�y(21���ps?Z^��*��#���TC\�
�-u��!"��m�sT��TlK���r�F
�p��L�x#��]��Xo$�jE0����}CkM�{N$�i���
Y\��Dx=c0��u	J�z}F�|�_����p��r���?0�d�������ر�S�
YXL��?�%k��M��p�l�9�6��r�)$�?[��� �r�G�����4���t��0k�(�V�#��Y�Wf �RXX�s혙O
,D�ɳڡ�HXT��x i�d�a� �~��;B���KV�j5#;�(�,W�,���N!��ɸ�P&�1�N�M���D���E��2Y�c��)���e��Ł�jO�߀�3;���=�P�)�)��lA�-���V
0��LV�!��rA�d�\]�oy�!#�%�3E�FPPe�ѝ�%&R��[<t��v�
��]�r
ƀa��j��g�3e�r$$E�������^ C冔&��t�fA���{�p�x�B����}�d����0����qK�~b��S�h#�!@��g�R6�P��H�=ǣ������8��`�7n
��S�`Ss��� ���?R�i������y�h�(�ޟ����HJ	��\'�u��ĕi���l2�Md�
ӥc��w&7O�6+.D<� �)L�@�w���g��F���*�Iy��@
�!�aq�H���Ƀ	��4O���Y�[��P�C2)�3+ ���E!��z(�e��|��g���%ɒ2�d/�;|L��l<��E�U��x��lh-E�:���؟�)Jx�:��'�Iq(��0bT�ś��CTa���M�	*�4!M�	!��"��@�Gz^���+S�]ۺ$���LY���2DZ\q6�"��jpW�A$X�Av��A�{�2�1�1���(��:��ϰV��LI�0���t7yR���wp�����Dž�-��@�&�; �A�����
�]����e�]E�td�g!xR�E���x�0:�������y�~�H�ﮬ�xǬG� �ܚ�~�X�D	B[�u��qJ�Ż���:�sQā�ʀD�Rb�zW��
�t�j�&�CW��ZT�&��L^�x�K�K���IJN�ʶ�RV����ڀז�VEՖ�#҆{_(�}O�2�\hWM(W�*4����B\�`Q)K�	��\p���nʆ\�bՈ�s������ȿ"�����
��/���6#��TF�LDGv1�̤_�/#É#nN1k�+��ذ�jځi]ZZ�B���)�+��O&���0�4��t7�3T�iB�É`{�Q�0���"�`ۅ�(D5H��VZ�Z�!�Xڦ���Y`�2�uu-��T����"w�㥇��	Q�LL/�A��CҊ
��@ΐ�z@��J�ŷ��dl�c�[���xr�~�������t��b�f��|��D�|���ޏ�1�Xh��<�~Z���1T��;�G��&�m��{2��6��= �p�*$�<�=�;b*�)+dh,��X��M]I�cu�.#��dͭ��6m��$b�.������}�U���w�3��Q��t҉�>�;G�i��n�j�ɯ�WՃQ�Ϫ�z7�_���!Qؽ??&��`T��\����}�xb	�z0�~*& lpÓ��=m�*�)y+��%�hʽ�~�����O{�G�b���ӗ	��7�mP�-��$IF>��`
d"M6���@�pukn��yqA��=%�M‚�U 7�@d(���7cF�S���3�VU6YuIƴ`���r"�6�qL�JB��,I�
�4�X�\'fE�t�����Q0���:�b>�F3�G�a�
��$��\>Ǣ���p7h�
�Df��dn���Ǡ��V`G:QK������g�����_<���7��ܣ�_f�öý]נV������E����@���wTi�"FI��H~���f�_��J�B�.crM ��E��`r�_����"�7\����"�S���"mnF2\1��c���'�Y��k�W	�8�:"��oi �v`��#m�d��kԗ�\b��B^D�T�7��ᰱ6�0�.�~���f���NO���US�wgju32q�f��[-?_��g�d&��=����^lBv.}��+߃�s���W�u�L�*|�c9o�
�Zѣ�3�ǽ����F�r=aG�`Lֽr\�+&�w����A��s�#��o�{���z͚���'�߀ˮ̓�n3��`��V�⏒���]V�����r�ֈ�@gX�@F�+3���V�mեRD㫢���["R�E�����`��4��K�i0�Xq���SW�ړ��-�Ve��i���i��`c2��°�R‘)	�,���6:	jJL]BZ�^ɋhpm|��ya��)J�X�;,٪�^�=z|c��j
)�T��wA_��g=�χ��Iw`>	�0�?7�'nQD#�[�ŵ_z�0�q�J�����PKEePQ=�s�s��%pip/_vendor/pkg_resources/__init__.pyԽ�zG� ��OQM�,Iv{�W^�G-���cK\I����E�@V��Q�(��G;�y��
'���YY e��7�_�EVeE�"#�G٬�W��l�Y������ഘ]�e�.�f�����ӗlj�����Q�fE�l.�Y��ղ����r��V�����+=Κ�o}�n/�պ�m��.�\��Y�Y�����d�4n�ú�)ۃM�]�K�P�����g
���-62�l:}8���u�y��^�������p�K��Y�0��Mͳm[fM�S�fUB����z�)�j�]07�VvQ��H�P����y��S�՜�mu��_�6�k|ݬod��]�)o�v|�����f��<�� �0���lV�f,[�K;��n*Z�bG�?U+��`Q�m�in�����>��*���k���ժYohr��e��̋M1M�7�檙�\�5@�L��v]N&YuC�m��n�	�}p �a��k�~��mSݔ����٭J���0J��XװC�}�)ܻŶ�l����r���nH��ڽX��߳f�TE$�M�v��.��򦨖�Q�t`���S,o�	l���u�r��)������DW�}�V�m��Gw����lֻ'��[|uP~���M���X��5�9�Nw��u�y����.�e��Y�OV���3L��X��j���V�I��-���T�|��xhe/��w9<�o�����j�^†���ƈ�4�#8%+�Q�h8�p
/vx����E�p�a7���V�������N粪���o^�{1y�����7�`^���r�B�ppװ�z���j�\������$�?á/�Q׸)M;�_�5S9ݷ����n������7�(}	t�h��{,3(f�V��l���z\]87x��J�<���!Ք,gW@fۛ67����Ww2�]��G�2��Z&��V��3"��W�Z�����6#�L�\M&ÁEF�"�K�B1ݣ-�jQ��j�.��{S֛�}pS�����]̖��@�O����j�
?g�F�@"�ßT���G��/�������x<h+���X|��ޛx�f2��z��z�����]5�bG.-�a��8�M
�?/�q�k큾=-�7U�T�A;��^5��ϕ��
��0q�67ev��S����Z.�nw=�6
|��k;f)�Ƈ��df
o^X�I[n�Q1�O
�,�W1�{�������v�.�}>[�E�]M���	�h�YF1�ke]�]5��A$ �y�w��l����yw,8�����v^�D�1̥e��ㄕ'D_�X\N�N̗�W�/�]> �F���=sC�V�S��[d�n��l�J�o
�m�%3JE&���Vb!��,w�f�fr?]箏����x����18�K'����:D$��}Em�v۽���j.������x �1�@Z���O����!�F�|���[����(߮����R_ͫ�&G:{]�Zh8��h�N�}�'C��QQ����hؠk���
�|�*��!�
&-�J�����34Y6j�F�Qѿ:��c���QP׭tm�#8·8��?7�%l�R�3����Y�nA�'j�B�Hv�E��g-Ç?e��Q�es��p��峾��K�=�p�a����,n.�E��X_�O�co��pS�|�l�П�7<\�c[��Z`?T7���ث'�>Ez�6�1�7�~<t����Z��uKW�MUL�s]d�3`x����.�x�草,��O�a�{��{��v//v�h��O�
I��-���0A�]�3��B)����["�r�3�����m�����
țK�xۢ��,��J���rVmh5��,������j��܀<ʂl0��v
L��~�������㬩�ՆZ��`Q�ɺ�昤��6-ArM����؈M�+�&ڔ9����U.˝'�
I`r8�=^��6�߷�%�j����r3�np��A'�47֓��p^�o�����Z1�P��?i���l8����rN��P��ٓ��G C��f�~>9pr�|W,�V�ӟ#�nl8��-��AK
�D��p�*�j�U(*_��-��X��X|1)Pd����`�n�I;[W�
�EGvݼ���п-���6��>ږ�l>@>Y?�M�"b�hp!<R&��p]Acf��G��Dz�/�պ�Ql(���[7K��w�c���i��~V��[��4�'��;L�B��(�v���@�+��O��1;�Ŗ$��82�JF���"v�=��-O�t�MQ�rl>6s�����1���UB^:����gM�2H�lG ����X�m�$�~�KE��5����ޢ�&�,�H�p���/ ��d̖"�X���Y,=���9w���+�=&Ȼ�brT��*@����J]�Mc�/fr',��l�k�G�F�M�TTX:E5����<U(v��|Q��zV�!6��(���/��/߾C`z��雿�?߾��ͳ��g}��__��=x��_�>�����S�T�	�8�p+�G@�����I�.��z�Bݳ��7 ��
��о�z$�C��icݏSX�&zy�y���,�2�P^m�K�
��?�󹷏��Z�F@x�@`YZd�'�:c��2<�T�+L*mW�i���%l������������X�#��2A��n��N��E�,�=	��s#�3t��3�O/Z�&�Eі����/�lG�,�z�fݒĊ_������r�uJ|
\�h������>ʑ9��Ftq
?�̟�a���“�\˥��L`���!O�d�l7����o����C>��y�Q�S@%X�~0">�2A��%�ßi�x!������g��h�̿��Y�kѴ�. �};�K|���s��׏�L{��[�3͑���dl�q���N��JN��n�����ۍ?/����1������fI�6�3�w[,#�˓���l��:�j���s\8�j����C`<�׮wL��)�o����|�� ��ڠE� =h�)���	�Qi�B�0���P�{X��x���O����4��2؃���N������Oz�:b9Z��Y[�ɹ�<��{�Bv��$C:�&��/���r��
���ciGZ8��Y �+T#Э:�ǂ7$ˮ!��?��Mp*��A��b��#[p�̛��v|(��$8[��.U�qY�/kr�`���&� 7[���=��䛧����%�����fl�(�
�??0�+��فa`���OX?e\�����i���z:�6��m��q]��Y�35�����#�}����罂�-�#�tz�̷���r2�2Lj�31�qj"��cu)��A��ϱр��a:����)ͅ���%��
?3�D�v<H��WC�z
,MG5
�K�:s.��2t�p��
��lOc�Auϒ�:����4}
���w#�j(�}�OHg��g�sQV�J�_�]��2�U��G��am ��/�a@�P���Iƙ����#0Ll�X@��Ӷ[]+RN��e���c?Ue�N��b�@����B�o��)�-�w���b=$�g�Fߒ\����b]�w�5��m�~_�(%�q��A:���_Cj4
;��WEK���:$�S��č���zCk����K�1�5t:8%e�F&1@=s4�o�想�\�����9ܖ �
U�!�
jxG!ZQcbl)ֳ���Q�f����m�>}6x�
V�޼�dۏNp핾��"
�p�!?�:�.������agw��z�ۿ�[��m�C�ߢE8��t��	QJ�ؒQ��e��+�z�f�����T�Rhr!��Bjui��S��3D����S�x��e$�
[CU�[��<z�*����4�s�EzT����, ���8;��_	���a�2?��=DCC�d��T���8x�t�H"j��#�����hTA���[h�y7�;c�����M�_ks�n��W����
;Rԅ�0m隄`�e�ڢjY׺��柎~���a�`[�#�57	������TA�f-9�)��P.������V�&g^:�B٫����`s2b�ൂ�x �f�6�m��[V�ݯƒ�w,�o�̍�l��X枊���*�Ȣ��0n���hAن�Ƣs�A��32�3���Ľ�x{��EC(�2f���P���~KTm=�ZH&��czt;�C�O� p�w��Y��Љ��_�����\(�㳪T\�2���Me�E	�p����f��gO�8G��K�,�x�#0�8N|py˫�A�����I�I�8��5���]�a�i9O�T̶�G]����;��ͅB�N�O�Y��,��0{�L�!��+����C��zY��P~�f��7
=�+�e��;�|�d+Rח��z(�
�<qS���2^�0Q�
�Z0�-k���,Z��ڄ~���QRo��p?��m���.�B�=@��(j��}E�c�ψ$�mLN��0$d�q�d�w�����?Dno�0�?!;����n�6j��)�׶�'�M
���SB_�"	��u����b"~a܆�"�l���|�_�-���*h��P>��|����FWo~57!�� n�.
���8�`Y�N8V�'J�|iU��0�"�Fkk�����G�1�u`�Z$���R�U�YyF���[�
m*��xj߳ 4>�͈Rd(t��Y�в3SFR�&�,�)}�&��)q#4v�_��##I�B���A#�6c�}B���WC��x�<nǻ-�pysChr��C!��Q�6���c��!�e���Ӏ���a�X�5e�eǢ��i������)dˌ]��)�F�d���J����	�?�a�n�u>7]�z*��N"	�C�}�I��,H��X�5�t���u���e1'���p���}Um�%/O�j��P_�EO0�킡	0	H<�Nq�����2�*��9�T y�n�俕���6�5��Ι�Y6\V���Z2�5�NG�ĥ,��ײ��#���𑞦G���R��������W�9��.�r��нp�X��4"g%�d;�ǘ���E�w�Z�B?��l;8���ް���}4�.��PI�
�B���_O=O5�S���(#˂8�1J�=?n��
E��1a����������h��ᯈE�^%#�?x�H��p�c�� ��uH�C_�}]D��_C4b?�}�*���?�z�!�ޜ�R�CrɆ���!#ߢ��x��č��M�,�tO�S�L�AH�c�.���|��0(�X�ȅ�n�z�7�<�>�D�1��'d=֦'��y��n�a2>�Ž��7�3��D+�iW�v
%6?���4�[��
ï�;`.���
��;u�7�x��e.���t��|pc��i��[��li�U�D����c�'�
�N&�6��?G�߀)�0.A�#c>���`=kRr�mk�vvQ��;���B�:���U_���KW5:�$EwX�\v	+p�����f��waB��xb�6��o�wN_aW��9�\]�:�N��QF��!��nT�ߪ��#櫋]F
�{��ղ���Ƴs��#>�`��*6��m��{�P~��2>�C��#7OD���ȶ�#pNEԵ����P��kaJJԞN?��6�HΎiĊ<I:���C6�"��ՎtȈu�Ξ��ZI_}�����D?�N|���4c����Ta�9
�,E캷��+��(�S�B.=$�ۖC��qd�TH�f
��j�c1<�kg7V���$��?��>�by[��¶c�6�\��F�RaK9+������*��Y���T�&5+B��Ԩ�Ĭ!2WxelS�J7�`4������yN��a'�&%�@t��@Y��&��kon�������O_���������dM[dz����D�#���D�E%'\a��ە��n�u��?��j�Y[�c#���ψ�E�9�A�-
Gs�a�)���h��!��ٰ	7�P�X�*�O/�uS������R��o�I�G�A�c\�QFF�^��8Nh��qvϩ��9���v�&o�'׬n>v�Tq�9�V��a1ET�1�lBˊ�Ɉ����Q�g��o)���Rc�^�|���s+P�*�v"��.!�>*в�,���[~O#�6H4�’�3��BZ��pInr�[bx�i2�w��i�v�[\ ʮ=�nT�E�:,�ylx�а;��Txe�U(i|��@hV!/n(e�f�/�A4'����>�]YP����1���A�ΰ�?����F/�)3��:eJU�I�,I�sk��(1���ď�,K�c}�����¤�4����;'!��ڠvt�e?oGS�
[���yz��5*pgۃ9�<~[�⌔�S�l˲�m�3�)�M���>A#�k��e��h(Ś���<�8%I�)rU�5V�����@Γ����a�p8�%8�����j�;c.jp܆Y��)�2�zs�<8�6;a��ÒC#��i��U&C �!�u|p��ݝ>��	~��,bD�+�ܭǏט���G`�6d!0�xV��{aQ�`�fІ<�ۂ<"|���qxD�P��q �r7�>I(���!	!aSV}[/Q;>�-�
�L�HC���UT!`c�Y�^ ��(Q���h���"��t16�xL���4;"k�l���;�(�v��3T�Q�5��(�>N�&��*�-��ŵ�<�[�g��yY#�uU���mߤ�Vs���N�e1b�/7��Ki�"P9	�.�ua|���'uyk5!��FKp�nq�'V��;�P�}���p����3��Ii�Ic��_xQ�2f��1�	0�K�H@��Z�E�ܛ.`��胐M�lj���1��ʂ�ӱ]w���M.2�-J!�.��I=#Gq_@Di�3.4��%��=��MXƘ �[f�vi:��!&U���V"Dv^+��5pV�8�R����h-���vp_�e�\�tj=@p��FUĒ���߆D6�+"�c�кG���zf?��#�4q��(~��@�hV^�@db@a^#�{�F�Z#�Tك�q�o�Ֆ[�d|~��/�&ͅ� i�Q^ �eH�$g����7&�C	�R�
]������ӻ�
��Q0	���8�/X�b�a���-_7;�it��Iv/�C�\fk9Y��s��y�Xm�����v�X�!��-���Q<[:tx&[�$y�i�Vs��f������بp��خ�k�ݟxB1��FgO�?>�@5�^�fy2j&�+�u���{�Ux7]���0�6��)#Cj�EN�	PP��D��t�
\?H��EHI}H��`�j�X��.�c�HS�K�9�4W�ly��Gb��Bx)�Č0l�w�Ȋ�(Q] ��\��K�$�����eլ��:2:6d�oXJ&z�<�l7����hb��=E$�/;��R'����t"H,
Rt_�Hi���.�%�(�B��#�6':)��M�ꀸ��gL���H'Yf:7OOݭ��ɷ�F��_�{���A�'�A�2��P=�8����0I�7핾N��j$��j~8�p�59:'����ō�\+'�~h�m���A�3A0d����M8���+:g��ᦻ��o�e|ϒ��j��\zOΐ�걲���I1�LDA_������L���)���({ݬZN�q�[s��M�(:(X�A]�"����p1p��;ܥ�σD1�QH^�ٶW.�&`��2�m'�A�j7�,
�����|yq��a�3P�� 9X��.�e���"ฟq�͵��>'C"NRT=��N������Y)����i�5߽a]D�Q�ZT	D)c�\��퉓�r{	t"�&,��	��1��Oz�t�~^�e������wf��
�䴨O�tYc,ɶ�I!Jx��"�7�[��W�n�(BE����MzN�ZR�p��q8�4�⻓�Dh���g$��TS�:�Q�˷�y?Ղ��b������r���u�f�ܫwC<��>E�>R�*�#���C%�i|���r��YK�z+�W_��%~yF����M.V⁕�4�S�E�X�Y�J@Xm�JD5Q��V�,8�	���w��0�k��VZT��}��i�,j�_�+Yr/���\�/v.qw��;�4�ݓO��bY��4'�S����!�wҫE6���:�5˹Oa,�c���OI��M���i��<�g&,��R�d�o�@O�d�i�fS4,�1���w˚���]�Fl�C=OL��$�^�t�Sǀww��=���:#Q����NVp#���ܻ�#�ZY�n[�2w��A4ij����yI�q�J�AC�Ҩ��K���
5T�)3���M�Hd�Tt!~g<	>�S��7γ�X����rC"2`k켕�U���G�	�3K�;@z%R}&��e��s���uD4���~���U1on�,G��2g��d�{�]{��pmi?���$��Y��;��S�[�k�U?�3�<��g�E8�m8:�6�8{8t0��O������S�.tq.��!�~��+�5��q�q`n�<��|�l�)��_�co_��6!Q�"�x�N���^u��oC-h��n���,W�e�O�GE�ub�{���V�ى�~�	o�d��ok�55F�3�	Hg�����uy�&�����>�K4�~5�NL��7X̣�Yà�#��A ��k�_l��zG��<G~�"���c��p&��WM�V�P��7r&>s�S)Ʊ�0�4�)���s�'N�O\z�Z�˜��'va�x���钳�v� ~3�x���\��:^�bm�D���e����yQ?�c%��N����F15L{�{d�.%�l��o+��r(�#	�'Fm5Pc`�E6�l:�\0"Nlu��d,���c29�ftg��(�ɱ�p`��^��ʫ�sIE��+=h�
1}��|�A����v�#`�����������Ig��B��:{r>�pM�q`�g]@n�ʽ
���\O.&6t�9�`��g6DM>:H�";�|�-\l��]�����A(���Ik�1�ͻ���)V	��&0$�EP�dQ���)ۚ����_�y�

B�?f�%�6<8�)�n^v@���NE�Z�vE�e�n�EQOT��@c�7�^�Ā�5��q���I�Q�r��y�<��O��_B�|�i�z朊~8a�n��q�>�p@q��2.)44#�����m���HBm�b�^5	�oC��Ԓ�,�!�	�'C�*D��IsN�J`��|EUO4Mp�]ou�}~9�==��A9g�����&y�H��Y�o��-rd2�'�e-ZZo�fm�UF�M%�ùP�qQ$�	��r�)0N$�?y�c�L�1԰�>Tw9�j*��gB�,���h>0��-y �H�o�2��|����t:�
{��b���5[�1E�PD7k>����e�#Kc�($I�f����tЫ��1#���︼*9�p��<�.m B&��a�Hx�Pt���m�'vЃp''r&×���C`�`x3	�;������sM���H�;s�����@-\Ibl�a,�!���C���f�5%�u6���^��?Z�&����Į�誂��B�nt�f''x�m�dž��L�ɠ��q�<��*���7�Z7ۙ�2�"���ͥ��'dL]@���ɐvw�h,C$���p�u�_�P���	M�u�k�qwp���� ƒ&Z�����H�>��L5���
��<�p�6ʛ�?��Ox��\'��7N����\.le9�4Ǩ�k7�y9�/�Zp�\�-:�bJA������3��Z������,XK�I�3)Ƹ�V߂@
�m�{� �%f��1I���x��GZ���,���l�!B�iwQ���
�w��8@�[�4�D���J��ê���H*B�~\&���Q�>~3�h-����pӌ�%�,�
AJd]���8�	i��,�Rl�u�y�a�1���p5�Y
(�*΅�f̺�yO�И�n��	���'��@M�a�B���0O-� V�V����<��"�-v�%Y�0Զ�_�ʜk��(���S�����ρ�V����|?���x6&�J>�k�H߰1]E%�xd�5��D��ѮxΉ����8�M��N�b���
�5˙z��ǜ��5-&=o�����B�'ŷ�'?��ޞ��$���ulZ��)'��'NAe�R�+�>3���L�'s��鱊�yZvF���.�)�bk�ysK���ɋ#�o�h�N�TL�B��:�RBX�T��U�Fl��!�F�*�@=��B!�颒���{�A�'��rt
�qs���0���R5�	R���RrhA�@�d�0��}0�R7��[*����<0�n!WC��̩N�U|{a-5Z�̧X_n��Fe�;�]G �|m�C�������P��+;�8�ڱdu��������w�0�r�����X�7�Z�|o�GH�va*dߛ���#�r��dƨ+#����uWĒ5j������]]�w'�.\`W?Y#����<�Q�[��u�nQ��:���(E�JJ��
'\U�fW���
��9M�{E�qjձ�O�;���.o)Sx���fO�
�{�><,b=|��7�MW[�³��*ӂ�D4q$o�
R4z��1����2�;U�k�s��h�\�Jy)AY�S'��@(5�$�E8tqx�H��h_�A4�겪��"��]�8T�~�Ȁ��e
��n��ԠX�'U17�*���X:�3g�#!B�ќ��Z�� �����>i֓���O�(�)��c"!M��=��(ߓ��7믞BO���[�}��_;�h�ѥk�f��݉��ƿz�w�:���sNgdN��]I��ۧ�?������
`�ߺ�����ő���jR�_=]J���N�v��[��㎸��t%8�T\���m`�1�E�=@��^���֧YƟf9z?4��uFg&��߫.�ItA�T?��z\��:�mnVK���n���K+څ�f��8��KE��� ���� OKR�lH$&�.��:�?�r��G���8P� rdj�_��i��*V-�Y�h+l��y��)��5Y�9�T
���/%{D4��F�E�{��ׯ&X����g}����b]i�ξ�5�b�N:	+s"��%Uw0Jr�P�g#�q)Q!:�,W�1�{�W6'XFl��Xz��ݓ�i�m�߃�V8�����p���.�M�;8}��5d:��L:�6�bv)��F%H�t����$�J��
���?�D@lz0�����2�z��:��(�eÉ��Y��zb	ʼn=7|�����q�a�Rʻ�0��ŃJ�Y����D���ieh+,�nk��<���AkYsݦ��!鋢�\v,3���W�v^��.)�U���tʊ`��,�-��b��:$��%�*�q���eY�5D�v����Q�\��v�aE��o����\
bS��.eZ�J�[��I�>��@���|Ob�����&��}������QC��⩅O��esϱ���z���bQN��&he�33�0������?�Y��}�`hi7Ɨ�=.�S
�A�y��d���q��cL�叾G�v���!l9M5���+v�B�m�U$���`9�����&P�Qa0c�DdQ*����'L�[�P��g�R)
�u/٣
*���[?nC�;�hoK�9�̎>��/h�@1/7���ح�N�f�k#ʛ�
&K�k�lp����y��;�T��û�5��5e�/|9�KJ�cec�����.oV6Ж#at�\Э~�ᅸ��y����Q�S��XR3�Jv�n��,zD]����ܮ���0u���������f���㿼9
馽�8Ѷ|B����(k�C��^l����~��0;�"���s��*)���3�,���ŋ�#����1L��ǧY��% �\�k�|�D����lk��/CX�1�n����Fx�kd#��Bc6H!$=����.�i�I�����U�A�T�
ؗ~Zz±�.��\�Ӂ?�j��m���i��{V͛�Y�s�K���x����&n%0�'MV=�yE��ZSkq�c�W��qHQk��ؗ4X�91�{e���u��|�}t�o�u�ލ^
��iZ�6�R�x;�Q��6F!�D!C���+���k{�u#
S}�d��Z�8�$�6l�#�i8T��H�(���Q��_��
=j�~���
=��g�}�{��Z#���J�yb���'$w��V�ߊ��`�Z2;���vw��{�T��$��6����;}�p4��q�FN}	6p���Q���st��Ә|M�I6fڈ6[�w�CK4(�
�Bg��ǚ��U�w�������{�v�Y4��KՅV��4�+�R�d�=cpj���8�:y�x�M�B��ʟ{=�^c~H�A �A0�
��n�����5/��Y������2ar5.�ź���]�:sA�r�۫Ĵ=t�j6����F����i�י�ܩ��=1G��r�s�pn�-ז�YG���T;�>v^HYQ����z��5��3�z4���e!��$][�8��3G�_���d���K��:�,�%o8wz4~�/ťu�1Q��ΉƔ�F�`s�
�ͣ���m�j�(c6 ]�3�
�7��e0ώGڀ[��J�W�?����Y����b�a:��D�R�?u�P��t���G�eD��
!�����-��1Sl0�:^�^�A�|�*�gb��wv�c�(3�Dd!�%���%�4ł�}�Ї��]���b�ם:�u�) ��9d�����0�Ӊ�by�!<�V+��q�wD<��(ӱ|��I@v����3���I�/�
���X�I�
2_�
Xo9�V���'5ܥ �>�}�]�&E��k�;��� �N�2��t88��O���8������?���5�O=����?UuI��@�t3��{Y�ķN7�ml5�p�aL�E��]T�����j._�1�%k<d�P���R�Uu<va�L��נ�ċ�k�3�놵N�����0��9g������a2��ߑs����4ހ�s���U�S��|�iHq����X1ѻ�{/��#�K�LN�t
�yB:���h��C��E��;|�������/N�/�!���K��&z"0�������y���0�`��l�������1�ge���o�c�𺉟��K�|�ƫ������Չ�8�}K�ۋ��.��HM��8	xV��g	��T�N��yru�����ҋ:�V�v��Ԁ�(�n��6Iz81�JB��o�m3KG���<%4�	x�zO|X�P�W����v�{Y��VI�+�Nw�#h���?�������򡼼�Ę��$}�{����˂�~[�[`
��n���<O��)U�H_r����Q�8<8l0�B�f��ѝ���x���z1#����6�o�U��i�)ۗ���������{�|�䑵��2������L_�ݯ�:у`US��Y�~ǘ�Y(�4<	��$҃&k��E&����T�m���õa�3DV�����b����C~��ϒ���^[Gm�|^Κ9�	�����Q�ۺ�ϩ��s?�b�KN��1\$Ί�x)�r	p��E�o��d/���Y��ŠI��"��O�f�*Cc�Χh��'���/�!`��x0PWVІkK+D�DI�� #��=f`��F�g.�z�S�?��s�&c��ӕ������yD�v��4�'�z�a���|O��3��ģo�L��NY˰�#j�VX������k�O�gI�R]jٓ���2E&T�o�����ֿP'.m�c�
lc��v
�	7�0)�(���䐓�{�dV^�a�C�<�����~��(��\F�t[x�s߳B����:�-�!֖��E�-��yT�u�f-�(�$���^������!0�i��_� 
A2(�3�,��t��'g�hΓV���1	���8���͐��3�,3�/��1�e��-�縔U��t�j6/U`)�*���IJ�xw5dmkS�QD
�9�Ѵ�	c(�+�(����0��Fآ9��c��^*^� �/~�j�K^F����A�����m����x���Y+;~В��z.ZA�/kfF��٬�'�0�զi�m�լJjW5�!�#�����Kouʯ67�#�L5;և��v�%������W(�(r�>��_�3|nί6%W�RK8�+��Q�kL4eU
}[6,���E��76TT
y�E���A��	�j�tצS��u�;pӅ���3NJ�,>����\�L[�
J�ZX����js�E���⺭�P����Cz�ޭ��S6��MC��3TC��mY�]�<�gK̿O�V���d
R�q�����e?T��E��'�E}�"�D�r���b�_5��X.L0�Ċ�ڶ_�FO5tV�ɾ\D��BJ�C�Y��OJD�����r5��ǿ$��Gܨ��-�5���L=4�d�_���2?"lJY>��D�8*��Σ;��6qgf�%7�2w8d������t��l��l}I����!}�M߇n��0����1�P%����ST=��(��-�p�燡���\�$��Qb�]���'��̂�6;�YE�?R4m6��d��m/���q�M#��q}��w�&7��hp~���y�!���&�$���ԇà�3I��Vd�f[,��f:m�� �G��#���	��FC����(�s�QB�2#�/�ڲ]{u�e]`��ӽ��3���z]n�?P��S��] W�_�:�a�x��f-�x�(���8hV�j�q��<6r� }�;�����h��
�X��D�֒դ�f>�Q�ٳvk��/9~��ϯ{>_7�F=��F\��>�U�4���ԏD.V�j?g����;�ݚ E��5���Sr���q(��$R��fC�2�~��� h��%ᷙ�X�s_�'��bp/�L]p?D�>3M��*�X�$t��G�����V����y'��-
�ϰ�_���3���{C�����ʛ�3Wc'�������V%�Ų&�h9�u� E�=�q6���i���+��:�JԜ�X�DЂn4՛�Cc��33�c}�+*��,n.�E����㋠�`��j��r�`���u�,�_��V�u��EHU��Z���ŶZj.�bI���C��=��?a��,Z[�T�b��
�^T�λ�}M�N,m��5s�Q�9�ڠ>L�%��`X�g*����	D֌"��_H��ǔY�Y
XU&
��
}V��N�%�Rbts,V���'|]���7��MW&}�i�	��S��-R"&�����Ӓ�Q�}5=]�ن��j9M$
X�Q�a�7�M�A���?�Z�^�סr���cK��˓*!�p`�!�u��A��G���~G�LE(��U�_X\�\�M�J<Љx�%�Uе��[^��a'�Eđݍ�وc��p_�3$��(�P�5܉6t98��f���ǘ����Ñ�����\�� t�a&d���r�e|'�p�P�$�tt���^r�����|�΃`����tN�ĸ -�S���o H�!��?cf��#��GWU=k�"`��4�+
���&a
@��ł	�k&�/��3_Y�x�-�+����Z�|o��킧�n��l��k�3°��may��b��%��.%�m�����o�J~�)��15���h�dC)'z�Mo(��Ъ-���xц۬U?u���r;�LQ�~��a���O�E�������x3���t�s[#���K*e�ݵ!�?��0v�J���-�U�c�<���s�� r��T�L��e3��\����[T�O⌃�����6
�s���{�oF�l\�]A�X�����dR@v��*��z�?QS`8oF���F'�J;���
w�mS|���IM�Z�-Ft�d���ʩ�������v^�����Mp�!����~�
����c�/����)]`d��Ls���
����:ȝes_�iZ��v�2:q��Z\q8�2�P~�S�Z���)�D�Y4�8��/����3�C�Q��'Gn��(�0�0E�c�j2�twk�(��c��z�P�]�@����}�����ߞ��~�.E�^�f�68lА��b����U}}��|x�6H�-�\�\�:���K��)�J�do�(MV�F(�V���Ɔ���y%N$Zf�Ƒd!�}t�C��v�I,(��(7ר�\%��m�r' �I�(��^�7��)�Ő���x*������Ֆ(�j�

��_#`��6��~�g�]��5#�ߊz�#�>ځc|檖��yP��տE���G_�3�l�"�o�JJg]��k,tѼ/��
��qô�V �.X��iX.+м\�r�E��.�����ϞI�Y�=C���_=I�M#߇H�I>+(X�x���z\����e�J1.8Lq�r��>Y]�_�S|��M�H_�#x�7~�5��䖉ΖZZ�	����1���털�vC�B���y�t3nj���kσ\�T"`�ݫ�;����[L�6;�IT����>�[�L �I�]�3��ؙ�OVsb��y8\ë
5	͓euђG���}��P�,w}�.��xrJ�8��JHE$������� �̡%&4Z��>Fpg�W1���xB����U(u��YNbwq8��U����u�V��BRr"j�,C{�!I�eR��w���_�򌛞kQ.��&i����hL=[��λ�v�¿���9����Y�H�:R���wj�3VԦŨ�ugD�Υ3�}�C�]l�� rʘ�j<�~��#�~:��0��U��c5�?��1Gi!�/��o(��7l��%����+��}v�:�N[�Yϋ%(:�W�a�
^�o1�Ӝ��I���C���M�P��L踳ͮK2K�9�Cl���N�3ĜWI&b�)�"c��&����G��d�5�ye�z�����鎘�_B�;�դm >\׊��F����#V�<����_˝�y���t�U�2䇆Y&�jr��g��g
F�H�阙��PL��)&�`i��Iyn�k(���W����ln�{Q�)ku�t��,�sD�'��z��;з���@����������7��A��M�]�`�q��g���X������}����5��ۓs=h�I
ڃ����Y���07G�"���t���6�X�<ʞ��k��ThL5/���!���
=��
���S݄�qb]�B��s0S2κ�`~���8GஇgD�����y>�ե�O��ֶ=q���r�O�Y�ok�+��G�)�7����A�_���fFy��\)����c�S9�7���1ȃM�Z�n�cv.�~B/�@֏}D}�i�fn9�;N�d>a߰�i	U���FO�.h��,2��)[#뿶��\.moI�����Q�lwu��0���qM��EwV�n}0b���LDp�[ܐAQ�	OA���_4���6������,���~�D�){GDE��SW땳;o�4�إ�?P�a���J��E6 <�kG�[89@J��16�2�،ɋ9It���f�Q�Bnc�q��=�T�W+�q��$�"������NØD*�.�31;"�,?hzv�8�{{,$���V������#����:����q�;jj�`֩1Ձ�U#?ډ��;�cC	
�
[%�i
}�~!3�4�ٙ�uD�D��/����6~N.Պ�ߗZc�$nۆ�w�����zή���j9��۫�F��&>E�t���C��)-9�u��R[���V/'!	K��x#֊�4��-½�|ƌP��35.���4�s]���.Ϛa�p)��H��^�Q7|q��`�CAH�@�-��L"(Cf���Q�y�YbLM����h����l�V��Ս���6�byt���")6&5���9�C\���O8	��9�3�>�S�?1ұ�t4Boz�3���G��Iy4�k�w��`����N����`��S����_(�5gGƫV�K���·w�����OT������#^]��EA����$�,H��G�g���虃�w.��� �p@��q�ui��7�_<���7?�$�d��m�c�p���S�}��ZO�5��X+���PS�e���f�:�$:rJ�����-K�s~�����i.�1��|{�Q��us�b�˒�#�ɬ7C
=I��*���i�.w'fe�x��	r���͝��Qh�c�;U*p�\Rb���[nMo]���"�#�3m>�Hs�d���e����}Lţۘs�C��p�	�m��]	ؖa�
�n<�IO��E;[SQ�ܾ�C(U+q����Փo�}�yɹflL���\N|���-ҝeaH�(���Y3�F�f^"7�?r�NS���Wr'~1{(�Nft�w�G/tǿ�� 0��:OVD�{�]�<�~��G���4ߧ��6v�}�R�ŸS
�pۭ���|�rO�~37�z7�)VCz똺ql�n&%�6<�(�<�h9����Ѵ��z[tEP�	y��y�6oi�����Q/�p�2c�bA|�<�8�E�f��Ꮉ4!�+��DGb���&ÁֈR�Y�� �n�c�%��s����\7�	=e�t�qz�F�����(H��,���t�N�Tُ8Jkc&V�A93p���Y'�d����wbb���vd���ƛ�ϕ0ѳ8t�|��m*/�Q��n�lM4%z��Y�.a�Z��W܃寫�;T�tQq�c�.j5Q�!���x����o��>}���[�׫�/^������d�2)��B�/JQ��Y�p[�'Q����������a�%u4?�o��U7ËN/a1��8J4{�E8�Y�C<Rn���{���f�(v��b���_f�u�
�U+�1/�����@1�g^7��zܛ$�NI�+�\H^A��]��<y��_�>�<����QDܩ})�-o	r��)Vi����䷉u�o���q�2�`�1����}||B��qih��*vk�˅�~<�SRSS����s7�X!$�7$|��	�%��ʣ��A�%��E%]S��iP)ƳH�#�#^�\Ϛ*>t� (��%&�*a�䰿v/�q4����Qb3P�(��X]_�e��f�2Գ����A�t
<N&x�^I�A��r�U��>���9{�^�n.N�����h�i�2�t��F�Ah���3f�ĠB#Ͳ��Uk��D�zEdf%ldd{UHI�0�\Oa�å��:Jvp���ey�K����pJ�.��v�V�!�j�A*.���_��j)$B
H�U�ijgˆۓ��6e<m�h~Ͻh���TW��z_,)D�!��&)�/�f·z׶�,'p��OCB�83]�V��j;��	����hM�Ix��Ÿ~:f:pY��B<&��^����#g�����}��ղ_>��l��Ү��L6�R������H�?3C���ic��)I�'C�+ws�r�E2��E�J �d�|�o��R@�m�U	T*�;@S@��Ē6��^�C��NR�A�Ύ��	{GȤ��0�zј"(ϚD�)����C}r8�:�_f��=�)�_zH!Ӎ���
l�a���!��_�Z]�;�(	���8��]R�l����*Z��#��YW�z#����^C�wP��r!�b�u(E�ETM""�͚5P�US����ګ`��D��W�r����ٺQ��H$�+q�fMIZ�}��.�䞀`�����'G_<�<�^�7�A:�m�����&�k
��b3T��&��|�d��j7�}I�M�FJ],Ք@��r$b5�m�3	����·G[z�g��0�|@Ihu��ɝ!k���.�t�4�K}]޺ 6L�c�ƉԒ��O�Nmy�U��at�Ƥ!�T޽?{B��@L��Z��*AnG=��N�sa�I����i:`~��;F������a��<�sCa1&�V��O�n��i��Y����I׈����Q�#�,�2�fت#JK���H�s*�L�"M&I�ɨ_3e�s�P�"�;��V��3��(�0a�uvk�D\st�-�*����_���s��1���_��v�і^-�XP8�)X+��^�c�bF>�*u���ܰg6w�ƝM�M���'a��.|)K7h�X��3ƾ���R�8���.���}����)Y��|����v�Xk���D5�$�Z�ﱄ�rw,�g���U���u��}�o�
+�
e��I�p���]�`	�G�+��ޥ�/�5��M	��s�nw�57+L�
g�n�u�t	؞���JHi$;n�w{5Yr+>@i}��1�I{�.�МCZx��.h0�y���݅{��&�k�({]S}X�A�ޠ�3luX��S�s�{�U=�`�G��:[E ~��O��O%�Ϫ��r�08P
�[u���zE⟣�P��\
j>1ʄA\��u��V�5���oFh.b�d�\Ɯ,{�)'���mEJԙ�ș{<!3ں��)���f�H�z��\v���o_�[�٣G@3{�� �QK3��g��G��jE��A���Cj���V�w��
T��[���J#�,g��⪸y�I#�H2�(�Tu�usQ���E�!��t�荋Ǟ\H4�+���:jK�M�vw��XmuYk	���с��$��L�$��A^�Q�%{�!7��?A����%#�6g�@�!f�4l��Qk �R�����~Ov]����5%Ը$��@䨊�.7gL�4-s�W�Ff��_;��	�J����Gi߽�bD���Бw�Ќ�=�3�b$G�%_��f�U��R���u]�VL�	�Aw��uBAL�fm�f#��C�
(����l!R���E���b1�A�n�����IY-y�xX1��rR��yD���
�зe�m�ɂ+i�ڴ���T�6��	����%8�K��p�����~��A�%�և?�~:�!������(�T-���WO�������� |u����?��r���j龡������ti�W������_��X�o�݋7z��E���˿�z��ų�o_�t�.t�m��������.�̌䢘c��
�`̊�]���}�{VM*:S<W��p$��W��ZI�	шwnh`�U�Pj����9F�r��mp��7��hJhB����W�O�5�?�6�~=��>\
���hNU7�qg�a�#7��c��'X���D߶�g����}Ҟ`L���OY�;Uĺ^�C���D��z�so��O:�8&������كb}	���[��WL�x�ۥ��c�0S;?�j�SD��XFA���_��G��K��XÆnJ��)�;�E�RH���Ƣ%�qQ��.�\$Y���.�΄?�ח�軽�Za����Y_nA�*@�'�Y��0ާ�pc���-��"
7�W��m��~���NE����+Gȟ�XgR4J��	(j�O�/>�z�㌗�Q��Ү�7��L�Rηpً/���n��3Y;]�v��x�i�fam�>Pe���u�ā,A\LPnK�C�T.5�o�뺹�_�'C)���\��"p�:�et�)7��@���ϯ�p2��a�(]�5ԯ��aLy�}�A�TO��)8�0�%�n��9�&�&��P���0T�t�*a�-��e�Q[r[a}�E�ꜫ��S*N�R(K{7pK�� �2;�kȷ�Xrv�Qt�0��G��G�'�MS-�!�E��gEhf0�1Ih���c\1����e�F�t�	��f0��}`�����Q��$іO�Wg?����
��l�GVی��Ó�ꇳ�����*)�?�1|!R��v=K�SX�B�
Lz�L�?9�c��Ӭ�՛�`�<d7.T<��
DŽ��B���8{��Z�eO?;���s4�Pf'�É
��jΎ��t����t��i���dglNu,f�$	1���!�F�-9�R%%&={��l[J{bʀ���20��Cd���0A�ڌ���$�ɜ���%��l�T&��ϺŔ�g�}`�Ք��������RZ߰���Ozc�8]����6�)���(���W0pBm�}�u��r�y��J���}�ɟ0����^"�%LJ��5ެ�*�G!Yw�`vc��үc���:�up���*����E�U��O=ׂWj�i�zW[��Y��i���&���\��Vq.�>k��s��*d����U���`����40θQݽ�x��+��Z����m��F�pg�hE���g�B'}���s7&�o���`t���I�{�l`�}$�I�������P�^����mn��Q^�
�T,�6����IԴ�w��.�=?��@H@��ws��vL��f��d�&L&���$���#_K��岺�A��R�0�=+u��d��c����xh�"u����8�nu��B�
�Xpk�6���\n*���[�,����}'i
H��4uV��Ջ"k�c5�8�uc��pS9O�ҙ�rʷOD�mAq�r̍:��O$��"&(&/���;��܀x�c\�t֩Lc��=I#]_��+n��_�C��e��B����8�>�"]���˄2��̒	]dG�0v%���?�ts�(!��.,���o�o����oƮ\E�k��f���5�k9����X�ì��Q#��:�Qkn��H;�g��G�����
t���HG3��A�-����0�;������ֿ�q�]�7�Q6�����꛵�X����<{����������%��cuXd*�i�C�itf�����<�LG� �Q�H�e���օ�������Ч�\��l'�閎I�%A+��6^���N�Ln����w��0�OGXL���Ѕ	��W���
�]���f��e��}�z'���xy]�§Iv$8��T�� e��(�D
�R�8�^+�j�\��ӥ�\�]ޓdY>��ҿH��A:�u�q��j���W{U��J���B-��҄�d҉�{��V�\b١S�؁�n�7f�aI�ԔN�L��suT��h�ջ+�%��#:TG�bH�ӎ���YJ�Y��p�r��X���m���ُ�9��N���,Vy��9B7N�;2rB�|�4ի�0P�\To
F8�W�>0��;}��Gp5�;Q��$�{�yH�Ll`���$��0v��Za�
���e�Q�x�$vF �$����F��w�)���>�.��@B`h�g\H��n6�~��Q������#ݔ����*��F߇�WC�UQ���?�,��%.�u�Ɗ����#3�#�n�
E5T-k�
��ns
���ql�H���c�*M��Di�D��F�!�ml[��}*	��m���,��%j$��Z
\FIͪj>�LB˰�NclҶR�
�{�P�#z2Z>��3�Z)��l��/��g��ˈ�^.J�(�&;^�5LBv7)i��ߚ-�3�
���HhE��s
H⨸���KΫVͶK�]�q�8�	DV���r��B.���aW�9�R��.״9��G-d�,Sco�!��TF�E�����l|M�&���tw�Bl򽄻�z�'ޱ�wn��R�y&7X�@PMk	5zǁ
�aL`AP��E�[)W�@��[h�"��7�Z�t��Y��������K�o�	<�zU�t����T-�B��<�=��Hp9t�w2/W�z����i���(��o��9��C��.�u&�y��y��	���GƁ2g(S�x~A�t��
15�3��e�����.�����xp+r�\�m��f`��T�}!E��~�j���zS��)=D=]_F��.�%%
ֺ1 �+�04�JdK}"�=`z߃a���	�)��o��ޏҟ������R�F7΢Z��^~�5���W�z�t!_�Y��K,V��y�x��$L�
Q�;�r�t�?��њ��`-M��Y?ۓ
v�a��7��@D'�7];���̡%��Ϯo���VxCS��K������N�mK�x�.C�b�P�3���7�G�%��6��
hM���|���c
GX�Ot~0��c8�y�2Sr΄'f26�|f��;����V���zm���OZJWS7Y��]	�Y��(�d�Wi+�'����*�N��)����D\�;�N܄�!�gWy��:��%���R7U�k�5�-'��~"X|Ac�]��f[7W�f{)�I�B�z�Qp2��S���(PBz�AF�{ �!�pc:�_&I����W�F�35fe~�#�bԗ�F�|̠���/�B%��3H�ŏ\P�����@g�Xռus>����D���g�~�[�ԺMt�O�J�}!�{.Yï&���=G�kv�TG��%��L9"�����#m1Q�F �\9d
�+_'j5E���+h�eE������I��L:\�w��B!E���h�;������4�
$b����*����Hdp����0���]IC�魋6�5׊\�}�'b1$�Ep���"����;�w]�s�wt� wޫ.�N�Zs]�0�E`���ZƎ��T4�O���5�n�^^��Oڑ�Z{P����P7��'�s�yr�y_y��0�̯1}�K��Ṝ`�c�c�g[fH��a�ָ86f&i��V�Iy"�G���KTjm8�ŶF��eM��Ų��'$���wʖE�
����H3�
�x�a��&�K[fa�	�E�Ռ���l�p����j�\�EuV��>�r
��
��#u��Ph)�F
��z��n>�U�k�@�
�(�|�͠���ٗ��w98RDN>z���7e���ş� �Ѹ��׼sv�\h�6WykE��[�ȦS#>M���&���~�����;>�l�	Ӈ(�bcͪ��]rr�O]�#���B�w���.�n��+�|�&��(�H\�B��m(G�4�2�vJ�N�rv��.�N�����O��k�ge��g7�Ⱥn�4H�*��R��r}�����{P��B	\�@veP���H����(�a+9�v�d���#?^���^9Q$ͲCS��A�/{���M;��=�1��Bv�'�v���l",$�٩O�iæS�tj��*zC<a�\���]�q��^r!o�{�/��,gc%I�y��8a&"a���BҼ:��y�w��bg"r&5��ċ�lM�l�T��(��-p��F�ReG���'>�"B�;��P0���]�z�Ys���`�=����$������ �Uu���պj��fNJ3�a��K��<�8��L��,%��}�6�5�w�nNP]��;9i�A{KV�}���fX]�����H���F�����"L*%��&��A�?�|�k����D+�R����	�")�B�p�h�t��Ѻ� �W����R�ݟkXB��\=P��F���m�J<<3o�2��>��W�>�ݹ��aRaLzXDB��O���B@߾���۷� ��+gQE�i�\���oj��fEF�D�����������&�Rr��HhIg�N�6k��2���ɥ�4b��[�ۦ���V!vq�^���	;�G�I���$��|�WZiQ�v;�7�m�E��BxK�5�2C�:�q5'�A�%ߧ�]�������`N^�`30�o�$ӧ'��.�H/
�����y�-q����u��F�/�e���Uy��d�V���[	��|_���a!�c���D�˥]Q��ن�iA�,٫^���gݜb=�6�D�D�Q5��YM(7DJ��dH����F����a�Iz�Jh���d g�W@�AP�m�f?�/�Rz�$�E�=4y���s��P��IG�(�[���{���*���V�m�p_�Pm�-��B"�W�>AW?���H�nr9���pwh�|��&K�v��	Ѳhc�M��s��#���z�Y�z,��pQ���7��s:&�@�P.>n)�3��4�С% ��m�B�R��v)��v{�n�͖�:���(ZQ_�f��m�s��W���A|�*��U�08��s6��R�.�@K0~�r׷�=��„:w~F��/b��@��`�]���HK��f<��z̳y��בB����x%\F.K����z�X=s�t���	���ʜcdN�0.�m��F50��I3�j�3���zz��`�9C7�Th�>�t�R�nذ�ts��>b�Y8Ю�6�k�=�?����O?����^��}6�'�z�K�BX�<b�:��I�uySM�ys������7X;��}���ݔ,�I��K���>�~�7J��>�Q�瞜M�K�{*^n���I�.u\���`���q����Ǝ3_|�z����m��7/�=}���S�</�׋�'H��0�c2��������{Ͼ K��{��D�,��=��,���g�R��F�xY��{DWś�Z�v��\0`��F˩�L^\��ְ�M��3�O�i:�&�7�y�S R�"i�t��=^uf�?��:;;���'�+�Q��-���v�E�e+[R���h,�!~�2�	�=Ɠ= ���y�_?���G�4$�-9�9g�u���b��I���6�_�_�:���@�'L�Ip���^G��$�"�����<�C�7������/���?e��=&W��ҷ)�[�:֤A{t��V�	���ƻ2ʎ��4��A'Q�Zr��'a��Ŵ���!m�kn?I^7�_$}F�}�\���$��ȸ��M\.�`�Su%�8&�o�u��$���f��C���,��E�)����iI4S;���EaP�c���p�lH�勉�;�Q�g��Nm���;�q8&å��iE}�ocϥ+�
��/˷�}k�71�R>L��I�����l9�%ܿdƮ�ZQ�l�`$����hbj���p���X����|����,B��(��a8�jE-�
V���7�-`�ñHՅmUF�c�ɳ�E\�Oe�e�({�m�)���c
F�<�\{C�8�[�}��� �n�
x�e����ʠ�Gd���Kh�k���+;�q6�aV'X��q6�M���O����%��g�ɬGI-%}����1Ye�G��M�zI{��=>��|���8�4�^�s�$8NAj�ńq7r�z��z�.{��믳w}�6�����Ͼ��ūw/�g�$����/�u]4F��˲�����{H�������K�6<*=OKNiRD�^͝G�e[�l3�_	�{SӸ�q☮'v�/�Fx�W�{��`��$�#�,�TN�>:�A�+��!�(A7qގI�6�!�x��R�5:�1x����S7��g9� ���O��r]�=��f"�f�i3��(AƳ(Aƞ���"�$��������ѯ���k���	h\w'!���І0�w'�H�h1CdCe0�=�eO1�*j
����o�EZQ4)S(��b>^�Yh$q��b�������dh�S��T�H�g�g�b��l+)œD��.����yz�?��A����tB�t�x�p��!O�J	���x�&̓
���$�O"�x�b.�C�f�P��4�1i~2�r`��H�H�*�nJ�1!�8�����#(8�%��\Vsa�ȳc(��]�(�煜���)�;����ޢ�&��� ��@XM��%�(�c���4���
Z?���
��Rբ/�6�2w��[N�CBT�ǖ��:��]19�����iA�Y.>�|���1' b]B�v(��n�\�q❺ءp3�c�o�_4��5jJ��}b�#�]�V߿y��������Wq}����us
PC�j�������ff�C�6�W��p/�qHx�kd�o�h�~6���Q��_|�a����߄��Mޟ8^�l	�	*Ų /���|<&q�n�U����J|ө�q��V��f����i>���<9�|���%����&p�Yn��՛�'�Xʎ�)H���JT��q()xQ.�9@�<>�ƣ���e�#�Yaio�O�8��DS��D��l�f�/�q�$����Y�W�#���M������p���b��4��$��N����w���9�O1mQ����s��������(�l5�v��G\��s{�@���5V�\%�ap�N@����o)%~ܬ�u������lDԪ���8P�<��`�b��0��uP�ؘ��'V�
z�]����R&S>��"Y��	2�pU@2�]�2T<�L����
{�Am
Chn`�g-Ѭ�rX���@�GE4���D{��z�,�~,u0�����,���YH��ʑ{*�cAJՍɒ�����o���X�\�@�O�����y��ߋu1krW�%{�.�'ak&E[��᢯��"]�Fc��1p��_]���^�8e��oa7�y��f��i��\V%��|��T��r>b��mO2-��
?��y6�H��9%ߠ�]�ŧ��7�{P�1i,���G�z�*�:Y�H'���ݱX0d*|j�#�t��Jɒ���*T��+M��4�)}����	@��!�B�AD�� �r� ūD�ˆ�n0�Y�G�%��+$U�J���5qI3LI�䈜�d�ǥ����jv�A�T�a��'���;���ZM��ho_��?�&�m���Iݨc��'�y�<2L/��\�0����+��be���Z@�!���'^�wck�i�c�z�u��P�{�m�ݓV�yc�-t?
��.�o��k#�\P'��ͤκbYq��s?Z�=�{y��k��L 	7^��qˆ���\ɉO�r���0ļ�Jk���qȾ�ͨF��Jՙ�V~�:��n�Q4XU�$�4i���)^�O"��em=Nf��@i���#�Â7������qj�M�R4��fŸœ�.�L��0"��ۃF��bK�c�b����0nQ���4j��7�a�n�l͂��x��`p��n���Y�NBr������a����Ԣ��*��R`���d�G��CcJ�Ԥd��{�漐\/�ZR�PKEePQa$�K2'pip/_vendor/pkg_resources/py31compat.pyUQMo�0��Wx�B%֮��#�v�$v�NU ,�$�SD���V|�d�9~T{"8V4d�u��[Vj\
�|Z����Y)epe��h(pY�c��ax&��;.?tŘ�H��I����$=��-�_�U"��{��h���t���~ixZۧ�������"hb�}G�j�YغZtiC�6x�'�y��TA�J�e2�K2���f�N���ب�B�
c��=ϳlO��lR��|�u���8�MUe�ˬs��R˘�"ϧ��P��ΰ�q�;� ��{�;�帘�[�e�\z��XIv�`1�����A��}TB���+�PKEePQBiKl� pip/_vendor/progress/__init__.py�W[o�H~�W5�)u�J}Y5�R��h�nUm%D`l�;3���g��1�i����3�~��p��1�X
��!���|�4g��������c��i��h:���G�L;�{�V�s�g rXsb@��X�	��(K �\0�����|.6#0�2�PO�fE�	l�XR�|-`N�Ē0��2A
�?҄$�/��@�?T7�d��1Q(�����(HĀf������TX��߽	�������ž������W`:׊ɜ׃k�OM��s:��L'�-U}��	x֭顄�B�n��Og׶s�����F���ޠ�;�O�`~��v�M���������O���_�-����7���L�����6�:�Y�@
�J�]Ƿ���6�k�μ�nxJ��)�����Uc�g�@�p�w0u}�6�|M��)�1�o����y�kӑ��u$?<Sz�X�S��rƖu�z�8�+L��Mw�Ir�R��X�N�x��D�`y��;S�9,�H��,_A��b�H]9ػ�T���9�	<�b��+�8OS��� ��Iy�D��"��|OH*��xa�WG1�iI�F	aLl������U���g4��6&�[�-�rvBD�G�%�ia��-�ĸ�`p9z?д	6|8�y>��߷����}:�����d�BZ�F����iF��1=���������
͒|�����3��]��9�`��Bƒ�U���?B!v(0̸$.�x�8BHEV�̱�ҥ0�9I�P�sTy5p~��h�+?�g�4Bkd��.�\DL���I�E}x�=.�C���B�E)~���S�m�yU�����)ɮJ�&�{�$� ȏQ*�x�5Zq�w�^DB�*Q��P������(�*�29��^��K���,sYƮ5o����Q3��:��%����Ucm����}�\C��5_��vw-p�1�M�a�Z!a8H(K����A'dF{2p�h��$��r�އx��]�I���D�T�d�΅7�}�3��8��8<��,�e&+�V��!�y�BB�M�a�2���-b�cs�_}?=uR��DO���+S��7��9�|���m��.(.
��%e���.sA����w�Yo|��)Ņ稳k��"�G�OCx�z���T��9���-Z����G���,q�[W�u�^��3u��18=���
����_4�e'5(�0��(�{�+<)Q�n��rK/@�e������g���ʺ����$����}��0�~w����#O���Zy��k�C����H��8��iH�C��KF��˫���ƱD�#ܠHw�h�p	�};HVm\
�^�Z?^C֧�]Ql����m�W�|�~�{��l�B�qQv��	l�AL%��j&��Ȫ���㕀5�ҁ�mkw�e;���o�U���򪋇�b|��C���
���YP��ֿ���Z�kU�255�]��z��U���)�̗��}u���$䧋��=�FV��-�Oi}�&!����WL��˧=vE�3��=��.R����K��o�Ԟt���)�5���i)7�b����-ꁓ��8�����m�P��$��1n>R{�M^U�.��j�#�T���� ���PKEePQ�̵��&pip/_vendor/progress/bar.py�U�o�D��xڪJR9�[.h+��I-9v���V�*r�q2�_����A ���9��/�͌$!@A"R�23��7o�{9��Q�O��#(��i�`��kF��:�.�?<�1M�2���	��+���e�Ѱ�H�ǭO	�h��$�<�"#
I�
D*@��>�4��,r�
ɲ$ȯ=F H:��'-X�d�i���6)rD�#�kX2/Ή�@ʒ+�����.�+�D��6q��DԴ�Z�)���0�HJ����{��c��'����Զ��6������C���3ˆ��U�8� �VMW��z��g`kc�F�� �k�́1��X�����1H�k����z���T鮩9N)��@;�L�3N���TCWO

F��L����6�UCAѶ6pd��!b`��������Ds���K~�3�u,�j�ݜ���;�lk��p�0s4��*c�P�� NCy6W��\��-��c`�V�
S�X3�Z�ߵlt�9%@��Ӛ�2I� ES��"�<�Dh�lL�D����ZK"�σ"/�ρFi�r(b�]C�!�	�¬�*�uV����%KF2�o-B/���c�j������>V���XfE�\�;4��M��yh����c��	�7�
�9�]��zP,f�+7��A�%�>	�H}/'���A)��$�<$�RH�q.\�R��EZݧ�ɰ5l���lՐ	�%����X�^x��C��h�nK@幑��-i�{�8�_�vB�4�����	�;�J���4��p����q(I��n�#�/�ʤ1,�0���ݺ�+�-ql�b¿�6'ۂ�y�?<�[4�jfo����]4w�n۵�n���gw��lH+e��y����-�{�u���O��D�/��
x������'�g����t��4no�@��2�!u��)P�䗥�m�"aF�!����[i���4_K�4/���Лq�Yv����i��&��ۆ2(Dy�7��=��.	�$�[�Se�I(�6�p�(]Qޠ˹�����rAը�j�j�H��J⤬�>g��g��\2�Z{-
ư�v<���%&s��E����|�A�9V�K���q��s`�A��׃jg����5�7D��vg�e��8wo>���si���Kaޖ�i~��v�Yy��>q��^����i�?PKEePQxแ�\pip/_vendor/progress/counter.py�T�n�8��)�!v�MOE��ȴM@�\RNQ,�bQ6[H*���@E���Iv(�q���:�9�m�N��R�Z=�ƕ'O�NA���Vk�e?:}c��J[8�X�/��gW��/�m�6��޾��<�f��U����2D��&�-Z��yU@��3�q�Ŭ.�un$��`�
�ԍ���p��pףn�R2��ȋX��r��6�J�@��ᇄ�B_IZ�NSi���
кև��R]�܀� �l<SI;h��&D:�^N�	���
���@�a�D��$�0d"�	�
 q��$�(��e�tL82R$��A:��%�Ǧ���Ɂ�%��G� g,f���|IJ�
1@	HR��4�@L�̝\gbF�b
���I^��ш�8�МFY�
�7dDi"��9�aɔ�}�RwK?Մd"EW���y��F<�B�
悢Ɉ'�a`"�b<�S���2�&��3N|���c6�ID=5m���c�\�!΄�L�YwHi+�*	�4ۃ�g�I���!LI�;��E��4z�Eٸ���Զ��AS)�5r�QN�|c����̪RUX
af��Hk� Xnrk�^5�c5�}K�i����.r'{Vn�ݮ�rpm��8�V�*��}�B_W���O��׸��;���������Jϡw�!����t�w���C;�t�?�X��ld�%�v��-
�[U���'p��u��]jx����ҿ���ϔ��w���>�s|�������PKEePQ/�ݺ
dpip/_vendor/progress/spinner.py��͎�6��z��
���fMQ�L�d�!�	�$04e�E��f2@�!h�E�E�Ȧ?@Ӵ�'�%e�L�i���{�{H�Gp��	�L��}h���[	�#Mue�z��w���.L��kSٍ�]÷���m����l���<Wv��Z�m�ؤ��[�i�A�����Q�lV���L���X,�BN����
.u�\uj�r�e��mZ6*@eͅ�T����AAzn.�Vק)M�W��]������R�]BZΩU=�ǒS
"�G�S`�<9c#:�;D��x��BN#&ˆ��E�.Nbɨ@�#&���pt$hB�
:�ň��c�yİɍ�1"f��S\ �,b�o>f2�Bq����an�:�1rQ'I$~bNCF���4�$��&��H�����[�Sw�)�"���&�tg�dQ"\lX�-�$Ό����}�q���.P(Y�zl,9q)b:�؄�!u���˄c�B�
 �	�3Y��EJL;��xw��g�/aF<w��1�ܚ-,�y۴V-�����
����Z�Q6-�nx�fe�K�
�`U�u
��e���a�?|�MZ��q�7��ӧn��
_���d��r��?� m�P����*Ku\�"�ݣ��-
u������5î]���/^Z�g��g���s�����Oz��|�{'�u�k��5ffL�����U'?u�'��g�y�w�x��_�|�d��u�������uםv������򏗷��λ��_PKEePQ�?��q pip/_vendor/requests/__init__.py�Wmo�F��_1U>�*�%�w�ȥN\�����\K�P\vwiWW�~�=�B��e�������̳�/���#*T)��Z{w�$�"�s�8��	���sʏ��ǔ�-=������j>�:��8IF�Qr%~o������|��r���$�9�K�����HD2z��ZQ����ƮT�ѝҴj�`]�cX�ndA?]�Pk�R̓�����\7J[�q���鬧����xemc�����0���I/���59 �8;9���`�������װ�*^/[4v�kV��X'w�[�$�1�3?\�lmn��R����,l�El�g�{^�b:����9�7t�Qf�{.�w�ح@G�-?���*-k�jf���L�����2��Ѽ���La�eÅY�0��lG��$�Y	Rv%t8��%0ԂL۸�%��~���ћ���TE���JU'}K/;�{-x�M�l�T�,I�j6Z.WvNi1�YN�N�
�S�5l�+!�Y2�d!j#���l����[������ksKa���.��;���Ȇ�.�ð����b�54%�����w�g�B4�S��w��h�G���6�$IR�;��D�BYI�I�
�Y�)n�&sJ{l�=
3
�c���1b�b/��}��~����"���tLȗzl�H���Q{?��2��V�	�&�eT]m����N���ol�U�Q%�}g'tvF�y��\��1���h�ka��;�8�nk���!�����1`N[�~�sz��t���KC�2�»[��gm�:?�)�M�4������xU����)u��dh��b��o�� d>�O?�? �̂#��̀^��� �\݅%�`�)��қƺ�ެ6��c/m`�`�ig��;�d�fy�T��J�x���� ��I!��ŕ����mu�tqpӗ�	qs��w�������SL���ϯ�����5�R�z�٘�V��a��w1̽��+{��Mܴ�1@���c��
��gj!�;�򼯇C�$� ��|�������iԥ�G�Y���J���A�=o�c����9ߌ:t����uϣ�
3�[E��Jt�f�Q���྾|��
1:-���%�覸���� ^����=k�	����;8�t�,���
��RKL|��hm� s��n�"fo%:�l�&�?��&�k�~m۠��B׼b�u�=�O�o�]���˯Z��Ar��x�|��#(�N����p���q
�@oX;mY��\�T�H��b������޾��q0���.1ي��+��<7�j��Li6
���~=��7QX��ʣx�l8��g���޵c�#n<vw���N��/W��)D4�$۔x�D��J�(�d��(R��=��z�v�G����T�NV��t,�hcC��D���0+m%\���R�BK� �����=�i�ʪ����w���(q�~^[?���qQ��]2��0��U�#�qO��'e�\L�EF1D�Qƥ(���ޥ1si��
�(����G�w�",ԩp~Q���3~gt^:�흲g�O��i2(��rF7�����_W�ݪ�g���(�3�7W��������k�O�mh^�
�gXq�u����q,�G���5Z�%�V�U�+�+�
W;�~�$�ڥ�w���Ѷ[vW�(��4ŵK\���$�k���Ȅ<���2a�,#_:�I'��=�-J?j��s�=�oq	��p}8sW�I�_PKEePQ���#pip/_vendor/requests/__version__.pye�OK1��)z��Mc,TA�R�R��
�1;mBw�5�J?�I�Z���̼�1�L���"���V8��$z��K}����5$���ji�E�ε��&��c�#��}�$�z���5e��e
,V�%l��E��4���Q!��a:=�EvVz�mf������e����&�f��K��)������
u�!�%B��|��e�Z��`�%���(�B�%U�q��V��|9��gp)Ů��d�����1v���3(�~PKEePQ��9�H'pip/_vendor/requests/_internal_utils.pyeR�n�0��+���dH|�i0�ðuC��;��M��lɣ�����GI��f:���H��wpx��5�>��=|��6��"�г/*c��
lz���9Jݓ{6
z�φ'h���8�;͠	���a��~�����ԙ��G�
8�„
��S��$��<l}���;��w�aՒ��!0��H>���=�����3�A~�R
������3�Qa�?{@�e��Ҿ6�jW*�#u�
ڂ��w��5��ISӣ��w1�8�Ƞ��H�Ѳ��"�%yfc劐�Y��f�����|9uH�h,�RV�T�Cg���Z{�������b׋�R�N�c�L�������m���$�����������9QE�ϡˬ"̓�e�݊|K�_^�u^�f�#r�4Xq��ۆ�ܳ��Qj0c�3~5���ɾ�Ef
�N��%��h9J`�)����D�$��|��`�0�i�ĝl�5<J�c���h~	G�7f���{5l� -vV�i:��/�/+�f	(���Ƒ�gn�6e�9*/S�h�L�PKEePQ�9.D�,T pip/_vendor/requests/adapters.py�<ks�8��+p�Is27�|�-�(U��q�c�lg�j�)!k���aE35�ۯ�� @���d�j�NU�%h4�ݍ&���w'l�'2����Z��	�GGG�B��eUF<�J��ڟ��n%K�Γ:'���JV��
��������y�n4TV�.�,K������!ebQ�<+#�e �+/�
�V�g�/D5,�|�6rŏ"K�"��4���M��k��{Q0=�-\z�.Mئ�?�b�Ô~8���d�0@~��{{���Ϫ+��^�b�"��;�y
�+��[^/>��Y;��O�bC$6�Ҽ	��(��IS�4�O���I���z
�7�m����̊ۓg�EjPo~>H�/���7�'_J����o��i�+����|���_xZ��jz�D����E��77<�Ԅ�9X����*X ���?������N�W�^_��oO�~�0�	LԢ����Hb4+�d��{Q�"SVRي�,������b%�"��8"I? ^W+kp&�
0����V�1&�4�ہ�Ջ�d�
v|��JY�G�Z.*K��A6�����pͫcF-E���z�
��JPx��i�a�����쑧2�E�q��F����P��A�<H8��dA.��l��8%`��N���]I��g�%l��(b��O�Pp�y�ѣ�xq���w[�6��
\��?:z#�d��0��!������W��ƃ����ח�.�6��y
J�޹���9�x��^�9���8���ϼ���ś��wwp�*7<,R^���ةrܣ|���	��w���>��>^%Wm��2�U�@��	`;�Y��~9��q�<!��]��g��	��8��	{�\�fwE-ZR����$�_b��-,W��
�-"ѱ
S�P����&sc`ALa_T�I5%�N?���к��#��3�l�T���QN:��1��J@�U`��R�צh,H�˃�S�eiK�-�	+E�W�xMx�a)ؽ|D����	g�4�(t.lZ����H�tfy�9�|b���[	��M*�=T��h�@��24��S%�F�%Q�(G�l� �ܮ�b�(�Rѭ��l5y�BC�Pn�3����K.%�6�w��R`�u
��B��6��g�l^g	������p)o[���' ُ��f#4ǠVIG&�Bx0Qt�u�Hr
�KDp�I�#n��E-kw�W`7Sp� ��v�F�t�M�8C�@��1�+7b��
�u���gS{�ߨ�k�V'�.ml��
﷊�(�"OOka�b����L“��,��r���x�*�?nq���)|W{@�Bw�l�P�(S{��4%xuY�X_�j1n�آ[��AMS0@��>Z� ߥ޵�М�IД���&�KC*'��)j�<^ԁ��J��P��\�k��Y"������t̎1"i�ӷ�਒v�Vy�&�W f�� V�f��(�85ϔ,�L����n�|�����I
4y�q�37a��V���h|����]��B[C܉D+�2@{�C]�uJ!���i�WLe�
�^�X�]^3�]�=H[���B�?*���T;!1���u�
�o\u��L�������Fސ$�baQ�@f`�xҕ�y
ԝ6�Oa�ʙa�$=�	�]	Q�tj�˗/
���ΝB#[
��J3��L�#r
�#���ݩ%d<uV�����L��!�ϱ�H�7�A�2�a��C�Ζ���m�l.j��j=�H5���M:?k��������Z!j0�r։�!�.\6���7yT�2z6��D�c;2Sq���;0�.�@4M�f��C��Lъ�BgG��Bg�#�})4C�Ό�?C#���&�P ̜Bܨ���[c�Tw���	9tY�K��E��T�)��E�0~�P�3&���ч�}��]��´~9�C�
+������	���c�PE��:�܍�5�j%�G9K�z�@@]gD�����ĕ7r�a�܍��d�W��CH��0C�-Go��m��җ�%���\Nҷ�@%(mYt�%���y˶Įc`0�'�\l�, !����eB���䆪T�+O��B�ADk�y�F�a<V�!�R����"�
J!�8�T�ɛꀱ��u����^W��c7���X��-B=��^�
"Zd�B�q�R��_U�B1w�αb��n��5F�tZ� F�2��BN3�jG0\��M�`�)�*��b��S���>�R`�C�ٵ:3WvG��^�B3;PK[�J�S�JU�iiX�����l&"��4��4S�j�t�s��q/Ab��@OiS���T>AT�t�v��r$u������Ta༒js�:S�c�*%�`X���|O�>8������,�r+��hH�a�
�d|�EE`!Qi֭�tA�����nm��mJ:�
f3�bw�Fyf�t�4&��mwf�p�;;��8_ѽ��s5I�����1���\�V�y��5��wڸh�8%=QT�*�:�u�����/tlU�v=�";卖e�ߊ��AJ��2�BR�͌*i��;�@(X
����3��O�n�u���p
�]��Ӡ�Z�qM����/�=so����m8�%i`�a�>؎���ZE�c�iG͜U5�Pp��w~�h��|�w�.��m7��$A�G���>߼�����*�R�ARjYaN��wY�$aŽ:P�ϑTǧ$SS�a�"P�5��Z�B���&(z���
��������a�fӲLd�o�
:�q�z�7���ScX&4�;�g;W�W���3�ϬT�|"�,�N˳� 긝�T�u�2z��}�������l-�Y���e���x���
t���S���J|������ۗ����f;'3ģ�$6myM��Wn���������q���ˏ�1SLa''�QuT��ф!^��7	GBM	OnH0y�:欄>��$�Pn�x�hwJ�:��0 ��-���p+������qE}FQǐF��R�.c�
��v��s�B��u�vo���Q�oO�P�ꊲ��� ��80
:�M�V`�&9	4u�Z���/���eoE�L�Z`sK�f�Q�qN��t�Un�������z��q�������e��X80B��(ȓѐ����ҿ0�l�	���2�6G���:�P#]C2}�5A�:�!U	��*�j����&º{�I#T��I����b"�y�b�ۡL�%0~
s��Il��M�d�f�*@_׳T�R~P�̩=m?)�8T�Q&_���x���4̴�_M&�b��P��f^�������8U�F��n`�+eK�qwn��ʶ��*):N��U^V���::zi+\��+|I�.0�dk�b� ���~����[K+S�����&�Ղ��5ʐ-鱎�65#���|�k�
��� ��[|��X}4��>|�8,K�{��tĽ}.Џ~����7w��%�z�J³��g���
Գ�(DV�;݀CK{�b
��Y�&-�[/m�Y�2� �hܠp;r�p-�K
��¡���W�#u��>AU�f��L�"q���(�G��9=2S��K�Q��\�#��y��.(NbkQbO*VӃ
w���_���v5m\��d3W�,8O4v���k+�Awk���<bG�y�3l��b�B�
Z�W�Ƌ8�ͽ�o�k��i˷(�Pb��|E*�)��Sk0ˮ�����݊�߽X�P�ɱ:�q�n;Ψ��$F�7q����
��f����9�ILl�U��v�~ww�U�[�i������B5���'�E�s��I�;�O&�{���@�@�m
O��lM����t��E�����;%�"z�,7v#ZH������[����S�T���vX�DCe�O�����/T�3���Cÿ@�k�~p���fHH�\�hv���i��?xs�r��Q�fѦ]�F�2h@�0�K�Y�b��C�ZLF��r�� �V�=��a�H����,*���3��[���Qy�gU
�@�cp��&����:?�k|-y�aYt�i^)c��P�2 dxP��*�����w�暙�)Ջ�R�xr
P�B�L':C<�m=]6�?X��`ߵ��o�4�?���5O�����4�6�Fy[���_s`�A���FV�n\X����U����W�^�����n51�����n�u>T�������
�i���v�])7bm�@����Fӌt�Kc�e�Ū����>��w�'t�O�@�ᙲ2'�"��VC�h3���{��?R�Vu��|#�p�|��!t���0�}y�1A3���s-.{�?�ʟ��NK�Ql����	6���\��Yߑ4��/�F�-=�F��c�#3�iL,fBYH����-�6���*p�g�H=�@Rhh6���޻j��$�[���
�d���bz?��ʴ`�t;2�u�Y��
?�S��H�Ig�6"xum�*^x�i�k�]x0Dy/��Ѡ!�c����)X�`c�Pupu�H�dT����薹�i���a�>��8(��[+@8V���He�C.Xm�Ě�vW$0��Agl�ocwll|�ђY��.���tW�6u�7=:D<C�^q
}����ͩ=u�p<�=~0�T��<�����8}�U�FО��4��c��)]�P=@����4J�x���u:ݜ�vMk�|���������m}�c���cH�œ��F��IsX���Y��x�v›��'TX��˥ Y8�͊e/$��v[�z������C�;�k����#�^�#�2��Nb���������Cu���t��2��
�Q�q��~�F�E�S��&"�t��;�w�'�?����R\
��π y[�J���<ð}�e��5�o,H�(�W�P��r�KX�yR!�EU��w��Y���İ�R�h�y/�2��G��)�-�P��zFq�������@���Y��~%���@����S�$�	�5�Y�l
D��z�<�[}����מ�8�,�9�
{/
�m-lh��+9�b�]����`����0�u�%��G/^P
7��H
G������z�_oU�K`;|���adI<q^8���}
s ���//Ri��IJ/�;��

�j�S;�uB�|�Z�J3e��Z[^Q�l�
PKEePQ��ip`pip/_vendor/requests/api.py�X�S�F~�_��<�f���>t4�n!e�����Dgim_�t��	��{w�N2�ʹ4?�B��n�o�簽�
�Je������o�N���ٳ��_+4�E);^�t:ӥ4����d^f�ca
�%›��Ϗ��N��r��bi#�%}�y������%-����e2��`��H��3�'�����J�;���23C�3�*�!#P��c�*L��Iq~/'7*@��lm]��^�~�����au�bQ�d�H�
�$�Dq8�{1��F��"o=
�(G���M1��/�P��4�tqv>=>;��?�����l�_��Ӄ#�$q|8>O�1����N�ś�Ǡhmt߆R�����2q�z=�LR�lEL0[[��ʅ�Y�,�W��@A%Q5Pn�h�O���>�]�2��L^b����V��t�,<�����}x=9;%cZ�L�3����.���%���b�&���s8��7+I9��D�K���s�ܳ�B�<��Ls��C��B�؍6�l{G&�i������q�Y^eV�+X���\�tؐǛ}d3̐Rv�ߢ�.�pN�	!�s�|}�tUX*e���.m�(K��o>j���X��\;�%j6P/�vK����O��)�1Yp���xC-�����w�+��ɬ���q<Ԅ�!��4���Z��o�=m�}�� *�l�J�q�N�W��dt($�с�ͫ[���QU�e�H� $ЩK����AE�y���0ב�3�sǠy
@p��$&;�|F�Q�#ۅ�a@�Cl�Z�ۇ�������#����y���,S�wS�9Z'}�T�����m�J��G�bzĈ�ˆ��ȵ��o#nP%kC8Ĺ�,rъ㩮���-3r�jZ�vW�Y�����2���&�;O�%[X��%��|�29���L��~�Et��ɒr��`ᥪUf8m��K
=��F
]ӓ	$����DXT�̺�EN��v�6K)�0��ԫ�2xo|�Y���uVɕ�;��"�x5��F�M^�d�1��D
!�֐�U���v}���4?	�S��0$�d˼��ްļ?��9LY��u�)ժ�%��}�.u��V����/뫽z�X^4sc��LF,0�:!�{{{��Vo���n���R=�u)����D���d1Tz1Z���&�_
^�i�ŋ�����Cy��Dl]f����!1�;^HTGLE_^hn�䂝d�`�|V$Q�ĕ�)��]�1*�D�*q#=h&^8�8U���dR�Qym�eJ�W��:7�B.hܤqx�N.y���0�7���Yx8��>W�p7jT�)���#���y�==��B�s��{�
�5ck��$L�D_Mj{��ߎ�o�ކ�Fp �^U�FD� �Ù�[q��'XK��РM}��uo�|J!.[>[���<
oK�V�s�~rӻ����������Bڽ����#�C��0����&��oD�����<(\ɔk��t@
�뭾_BOl�RU�\r�#D".UQ��,��*�t�S��7�!�霡��TJ+��>\eyP��x�o�|á��&�`���B���
j�;�S��}���"��J0�]z�%a��GɄ_<��s
K�RI1C��Ob��W���s���PKEePQ���+s�'pip/_vendor/requests/auth.py��o�6�w�<���Vk�"�1dMv-ڦE��z�m�6YTI*N6��>>$J���Cwސ��~��>����b~L*=>�7�^���I��bJ��Vz�g��.\���V9�BS^(�� 0+4�P�EA���L*2�\x��~�/K!5�?I�4_���9�K�(
�_��,��fR,ɘ*��1q�㧏Y
2��NIJ��/W2/�Tl@���H�C�+Δg7Z҉���L���6�f��yVi��8S�-�Y֢܂12dS����ދw�g����ߟe���x��z���ŻӳS2"-��y�f�Z��`����N�6�����|��?��D�e�k\����RM�^�7e3���$C?��q�P�%���J���&�=��ӕ�S�3"�@"V�Ը�H�8�kC�RV�|>y��\B��-J"f����v���*��@ȍق^sQI_��rL�@n�H���P��f��ل��d��h��A�� #2�:�;X�ɛ�*j߸�� i��(�:�ZB�c�C�L� �����c�s}��1�AxQ��+FI��dЊ�9-�5(�~H�?��g��
�K�b�g4��܁�
)>�k�sQ-�T�B�\s&QU��V���ߦee$�sR`�_3�����6��VT�53c)ſ�E����:���F�j�ɑ$$X0*ɬ�8c�M��vi�R�s�Ti?�p���S2hAB������Sqb��o�f
`R?y*�1a&$�-��	����zGߖ���?�#O����ro8$g�L�Es�Z�ncV��a���cj�k� Xq%��5qЦ�������X�me�ȣ�N҄P���qt�_/�M�;IRD-ck�L�*�yB��`�90g�uyS�6ae`La�����
��8
�3� -��Ww�b�	�dY�X>��D�r ~.�+O�MϤ2�LsY@��RX�	��\)�͉������^�F���*��V0�@$cp�A�:�\�Ex�u���V�I7DT`C����ך�[�s^��S+�:�Gd�A�+�€D~-��n�숵���<z��9	E/�.ѱ�"21 ���ԎL꓉!�oƋ�g�aw�i�b��-��#[1�^��[S��X|C`�{��}�5��Q�O�d�W"Y��L�{�5c%Tg�5��J&�v_�l+B�y�bfA22jv"�y�n���p2�z�AkR�9�ʠq��ߠ-�'���ըn����I�u� /�X�۬G�`�̥��.P��F&hL�.p	{��@��'c���X
pXkvJP-���&�j��I��S�ua�}��%����
�������X�s�
���͗8�lV�Sd��5���V |���V��tHԤ8�a��zq�X��EI!{waZ�
7��=kY߅p#�>���5�ޞ>i"���.�9�y��9���xJaϪT�ú�e(�˳�rHAj�fܗ����!?'�믇�>|���b�-�O�a�N�:�<y�$��
�{S���'�������RR`|���X��6F�5/g`�u�?�<٠�Z��"0?���^�]:��<ݬ',|WU��7(�ݩ�ã���w����^ڦ���C4[
���q�����O����U�����]��Ǐ�iA��!�L7(4(�mkefNq��'�1����17��R��+��I�p��� GO��ՂO`Q�S#
�زt�T�R�LS�jZ��^~򶭽Ay��nXې�9N��+��1t{H5�q�zrT�d߮�{ଗ�O�ד�$X;j������v׌A;��p���vP
r1���i�у�g7h����9���
�lMH�ZȻA�>���x1��J�b*��?ŭz�Z)�����$t��o70ڡ����tcC����{U�~}jIe�Q��K� ����8�Mf�pO�����2�0V
�s�!86�{���[+�N8^���f$k�$;t�;�={d·�����b�k�a���VW�p\�k
�D��N�:g�D`�?5�fx�5j�?F`ɾ+=�ٰr�PW�SD��5p�&���wT4gw�To�V�	�mI#)VՁ[��دg�$j��J�&$d;�V*ֺ5	�eH�k�>��x2z�|D6��j�L�D��e-R6�6�2ɦ\���')��!���U{_w�Ӥ�]4��I�$�dT�AI�rU3�]�;���5yau����%�b*8^�!H���-���h適\�A��-�6���pD6oj�ȫY��,��o`›
�l������֥:�ߟC�Uc��/�l�s��cj��<
-k(��#02�T*�$&�ɓ����!Bs�p�r��\���[����"��{�[<�r.ffy,���p�7�*����(^]:z�<�r���H/U�]m�� F�d�A 5'�v��7�]=�FQ��E6|L3�d�\�p;mBl�՟���޷9�Q�SxW�3so6���
��,�s5��W=wq����Y���;eZ�q��S��qa����a���^@����o����7s�&���	
(

x��9	�el�=n�rt�pB�u����l�&(%+��}�LDyہ���QS�rА0�t��'�?T2�Ӧ�1�Y����n���pc(�{���#�'���7R�4#_Pg;(��9�mJ������Ȱ�m�1��s��^��5jǵ��8<�6'�A�o����:i���pz
]���&u�K� ��*�m�t���V���ղ�g�݌n=:��~j�灶�f�JMN4��q���v�W��{����}I�&ޕ���6�k��u�'U��,����jz��R�ޔ���v�:d�}�u���Q��2p)�c�"�k�~��s�� ����)8r[�f�I��OUɷ�ϝ��v}�/PKEePQ����.�pip/_vendor/requests/certs.pyU��N�0D{�pw��\���@THT�����ˊd�6��|!_B�[�G�񼽼ؗ��#˞�
���(�����YN�(9�n&Ř�je�^����4'�o�yn8�����\TrC������J�q�)��.�E|K�R'����=GL{��͏Ŋ��/�D�1C,p��,���݂�S�E�
�G���)+K�(���ɘ��x�(I�Ρ�ԍ�͟�,|��O�7W�q!��NG�v0KC?/��!g���ʾ����w}�|�5��ב�8���s,֮o
��%o�
W�PKEePQ�f�t��pip/_vendor/requests/compat.py�TKk1��W�!v��b_�!�J�BZr(e�wgm%���d/��i�n��E��Ό��㓎a�j�.�ڬ �j�&Z;::b�:�B���b��V8��2H�-W�Dbg��и����� ��H�F����S�Z�ȇ��2Kg���a��U�mp�m���Vw�c���"���F6�j�#���6c��it�HrB�\�Jp��=�e��^r=��������q���	��8��=��O���KЁҦ�%�8
�I���<8�X��}��Y�l,�3��w-�E.#�����w��A��>>h<L�潵���.%e�9�������s�ń��R�Ǒ�8]a��p�e�	|Q�(�@�@�%�ߦ��&��ze��(ܞ��
�1�X<&�&X)���]�i� �VH����zc�Y�*�6�
zc��@7�EC��k���Z��^X�v4����>���p�����)���F�g�[I*��|�sՋ.T�ͷޛ\
�و�ַ	<8�%S���+��+o�t��~��f�
\ҵ�X�������tW��
Q-%��_�\�q)�ZR��:��ࣥ�G�0�����^��t��m��'�z��5��Y���Ơ�=vhE��ڤ(�)u̠���C$+n������\>!g��c�x�Gd>̕�}ٟ��������1�>o��/�VFl���s����rL�C�����f�K�=�����	I�fs�g��)�PKEePQ�':��Gpip/_vendor/requests/cookies.py�\m��Ƒ��_�7����N�/w
�;�I�{�ڋ�lc3�8d��;�t��緧^���4��"`=�����^��n���zy%�����R���������b���z�;�m�PI=���3�}��yW�Vu���]+n��ok��k)6<��n�����j#Uw/�3?[�U��nߪN�;��ĽTr!4Q.r%�Ǜ^�wƿ`����U;��l�\�fD4[WM'U���pJX����Zw
�bzĪps��W�>WZҷ�1�_�𧆿}��x��Hk֩�r&�cg�W2G����B�;�A�VE�~�;�]w��`�lVԹ�0k�����d�͙��{�����I����F�]U`+0l}�ak������*?�a>\U�D����oU)NR�JA��H$wy�o��طuU��-D��l!J	vU#��^v��8ӵ��-����F50�$�e�˫F��Y�yS�opԪj[���,4�h�ڦ>f�{]��4�}��
5��U@��an��yy�́k-+�Vvkx�6���DR�+��q�N���v����8�mOD��-��QrX�c^�
���U�`��MgV�M�Aݫn�NA-��a�����Z��m��>?�7wǽ���RC-��L���k����,$ѫ��Gܷ���#��mdW�EL�w|
,��Gdܜ�xp��}!�u�$X�HUd�Ż�߈��|��y�$�0=��
��(�{���;��]��	�L�U�`a�_�*���J���P���G�V6�RXw����Ƕ
��模x`ׇ.3��=��f!d�f�P�I��_yJ�����
%��`W	<L��q��HP<���������?T���'؇:.�Hݩ|�O��n��o���*
'��Z�����ژ���&��� |��v y�p�����5��|J����۶��rJy�h���Мb��2��A�1��9�����2���V�W�@gL�g�-�tQ�o��M��|d)��}��'�`��m����{���^p|s�\߷}]�)K�V!���Q����e~1�q�S(nท#���=�������S�`đ�;:r��Q�5T�)���t��O�!$v˧!�}���|}}���p�J�`W�殅_'eYv�ϻ�_��Y�&�_jA��Y/�t�R��F� M5�8��sH��!Dw�t�7��&�:U��Bf�� 2��gI��R\�	y���W�۶׈��Ѡ;0\�@�=��*��Y�rn�a�<h4,zS?�$"?v*/,��kyr��?��n�F����3�o�q`Rt`�����X�	�-R�,P���ڵ�4)��.h�h����cx�K�:�[�d�-�������S�����Fs��Mٸ�h�����7x{	޺�lE`�{��PWlpD��Ⅹ��f�=@�An��S84��ԾGH�[v@vi��n��p����u�ڈI
����HQ�z��7�-{�� �
��>���d�S!b�&�����#N����/q\4�:'Zd
e�t����U6J��z+%w-RC�FkN�'	���p�u�!؁E��w�瞷G3�(#Z����]�I����o�E-�w���ߥ�<�DD�PQ?���3N4i�H�o`t&�%��+Zf�n�L��� ^2.my�՛�@�P�O�C�G�衧�?���e���6e�FY��!�X��l_�dq����$j�f<�C�ǯ�殮
�Ԥo�KM��+�5�D��C��0��
Uu�r�!����uf�qQD��)Tui�͗�)꾔vǜ�s��Q���,��S��06
�D���<��b ���B>����/22�.ee����2
��؅��w@�ItS��ۈF�Һ�I"7"ʺIGAF�A� �vg�<�@�2ɤ�v�l�2��sc��Ku��@�
Ҁ��+]X�d��
(��aŌ˒���%Z|�51��!�29a�4���N��/��K�Jw&{9��Ha3���cL���Ǫ$}�]B���f�k~�e�eE�l���M�D����e����]SW�<��5�g��±B—}U<�E��9�
xX5X�^��@Ĺ:�fC�kZ�#V�K3�]#�n�O�O�	C��+�i��2j�䷧�֧�ՑsV��֏�����4��^�S��[P<r�v�Di�
N��D��g�҂t%�M"uWɶ��c��n�u��*�Pu\�/���1�|��[�[FY�B�|�p@y����zw�D�¹��™���B�
�p�m�U4ל�0�&B��ۇ�N�q�9��~�dn�#l��|>���pE 9�hR��|�2(n��vԀI/��T�!��Q1�i���B�ptZ�&��AeC��<�*/�޹NF��Fj�;_�c�.���sy��!��XK��V���%�����N�&O�V�,���	�)�
`��I�'y`(���MG��CVO�i�g�²ߍy����S;�>�����l�޿j+��g�~�o��#�?iCcv?q;��ʄ��O3ݓ�yŎ�����Ӯ�5�ʼn�}�&d�j���"�l�Ī+{+�����2����8j�yS�u.����	�j�8&|��J�g��y9O*��E�Kؾ6qzB��:��|���ܐk��6`�;T���2��+�O�
nA�ɸs0�ͬ���(g:�@ՍO
;%n�Y �f�'rc�.�cQ�8u�l[�vF���<s�k�!�E�(������чJ˰�n�j�m[Oj�/�E�"Π��~���ޱ�����e�~	�6��!��wa�����:���=���P3|?�	��u��:<o�
��=U�1�U�a1*���Bꉝwe���L8�����OGۘzE %p���VF>�>�����hzcc���|�W9��!�@� 7P?*<�*#*�;��h{ȍ�1�Ϲ�YD�K���Ik'*���'��5h4��S�bw�{n�}T)�
D�
��`�T�\�AW�0�%b��L�jX��\K#–�h���5��3u0ً�^=�9�y(]=!��!�@�n�/$b���x�z�gT��ڂ��V֎�������g3�0#�U�)5���dpL���r�#|����7�I�|6������{~�R1��E6��v��?�U��n��f�l"�]�:���痑3�|k�\Lu��盇'!���eJB�)d����	�"�'<UX�8��X�/�n��������X�b�����qA�e�5��h�ݡH]Ҋ�
��Q%��3���\��	�!�x�A�3U1;�F�	A��\����<@jL�ל�>�U�q�6I��A�m�)�6Pܷt
C���П�n�^�����K�����;��B�I�|�9j6A��#t�i8�M�Ԣ��	YN�3��$�L`�[N�O��'����\���m<�PxD��[U��.�ق~� �K�,��\�D\��Ӂ�A
���ח-^X�PZs@s�T�����<��O��{�…��!�qg{�FJ�ۧ���WK�޵}��)�{"�D��IQ�/iw��S
ұ����l���!����"����3���\k��`/)��?l�S�#���ӹTb!O08-
?�F`	;`f&��t=i���_Q�_���Lc�c��E�9&�4��ru�u���G�|������#e��IT0Y����Y�
�'%�~��?G3۷�4q$k�7P�� 	y]p�_��U�ki�p�k�u�h�RS8
_��oee$�����!%O�#g��m��'�W|��Ɨv�N�}�*��.Й��Q���v������$W�����n�P�Nf�L�\�[�dl�g�ݚ�`�0�db��mG����i����L�E�2�14���/vf$��|t���4M\�#;��n2�>W�`��F{�����+�h�?��LuU��s���
0s�ܬ��@4xG�]m#\�o�Y���0'�mp*��h�
�v~�ϼ��J�IB��^|h0��{�/��52��7�4�=XQ..(��E_�b*��f�J���a��,ů}���><"	}q�9���exLx�?5w(��O��O���‡Z�B�T'��}�� ^�"W%4`�1h(����#L��6n�9pȏ��]���L���>w���ū��7�6/�Z͊*UF���b�ϭٚ�^��B�Hbݜ�-ީkܻj�xhU�
�z).u2����=��L��%�	mT��X�^���k��	���&
ۓ�xo��QF����U^�˶���AQ*K��:�^T��~��jL���'v�K9��]ŷ�:z�[�۶��ar����Gr���g�<D�]��d��ʷ2�9S�`�]B��5�=њ��A����4��@���oyn%��T�c�d�:d	���4v_3�K.s�������������������Nfc�����v��8 YܓHFkX�s{�D�$6ϠD^ee�Z�s�vAdz"�����Ư���`o;Қ�b(�������Dt
��-A6��L|�Ht���A��
g&7��4�r�{�X��b�c�=7&b���v�i�	b֊y��1~�^�}�;�j�g<`~�¸��;&�(����?�����<3.�����"p��Й���yL�^�
j _��H_
���ڈ��.����D4%�)���aOw�9�Iy�}���i�wc\�Q��<B��i:�I���yP�_�3����+(�=��E��
�)jAJ�j��8
v�Fpv���K��`�a�N��t�S�VK(��_�e�+���D�<�J_����Gçu�<fð���$%���3�����Ì�p�,�#���i�C����.m�0��x�ͨ���:>�"MqD��
8�L8��S�8�Ux5h���;|yhu�wS��[�<2EgQ�m�m"~J��PKEePQ�_�17e"pip/_vendor/requests/exceptions.py�VMs�6��W�8K��\:��!q��g�6c��Q�����X���ۻ)��X���{��|��kȌTz}�ϯ�$���H,�۠�.��k��vɯ�_���2�)���J;��C&���vHi�ȭ��Vu�xA-�M[�j�q@	�����m>�qg�� |��$I�R8y����`0�I�~D8/�"lAh�J�Ӹ]X������%l
E)B˒
[�؀�U&��Ix���b�����a���Jص����
?u�t^�d�D��Ã�a�|ˎgI�J~s5�`V?1��0u�_�wh���ԓ˸|9�?��io�����o"8
��*�II3��!~~a�b��p�{ۣ̠'��w$�Q>q}�LS���y��iߵ�~�����n�>�`�4QhR��5ZS���,���k^�-���f�S0OO�ρh6:�1W�ƟH��_�;��Z٧��>+x�yV��f��2�+�`wC��f��8�]�]�~�N�<���} u�]=�Z�o�D����<;5�v�4,��Ï>8TƳf��]Q�r��D]�MFh�	�3'rd�~� ���P[J�*nRڭBoA
/@��(K�=q��4:�:g6���s����d���I�f���'P�gb��u4\�<PL�(ɘ��ԔF��m4!=(�OY��8"	����s#��L0]�Px_���ݔs�Z�ݽ龋�	�Oє{���Xڢ��c�;��yzQ��9:���0�w@;��騊�ER��w�e�v���[Q%B=8�x[4��no:�w�'�x:��ÀUv
c��5�|OF_��l|���U�b��!w�|��5�[1��$�-���>֪0�Z���*ܖJ��[�
��X_Hv���q��z,Q
�f�2�C~#	�7JK�*�ga{�侐.!�J�sS�nM�"�6�����[��>L��'7��VC��Ǩ*_)��Y�ك���I��s@�	r>+��F͓M���k6]�x���%Rڕ
V�RZ�-��׾�kT�A�$�T����N���M�wi��K�&��|>�kMJKV�k�Y���x�PKEePQ�=G�J�
pip/_vendor/requests/help.py�WKo�6��WL]�W�-�|�"]$��F��KQ�D�L$R%�$�"��×L��h+$�5���=$'��gQ��BpMg|�v�6Bj�Ӫ�r�f�d2I�RԐ��V���9��25�q�T^h&x�x�—�R���S�OU%�aM�?S^
�Y����VV�xv��YR�ѳ@ΑM*�= 
=���J�@M-���g^cf�%٦@'ʍ#��[K��RH��s���SK\!��ᷘTȮ�b'I���V�:���ŤX.I��n!ǥ���j�2�9��=�q P�B��{�{
�N���^��L�X��Ϭ��^���Z>��yAlσ:W[)�Pu [n�.�_1w��9��G/�!�9�	����0a�|��-5��kH=k:��[`�V0}��3�L�E�'L}�ʸ����50
��mE��ho�ؐM�Y�RP�SmaK�����;8t�
�=�"�s1U{�V%�F�x-�h��[!0:��'

�,���BlE��RY�l(�8���/k�QG��öG��C\]�Ç�9�Ư ���i&��AO�Tf�R��)�T�t}+3�YM���X�|�`1�bR�>n��IZQ���V���e�TQt.G(���?��>-2��?/g���W
���Q1M��euQ���a�^�W���O]��t�LC��x:
����E4�?QN%���e�`f���,̀~3Opܦ-�6�j�U�i���r��lX��/��ӓb�7<���M���G��
'8ޒ0h:{����9Qz�f��o�\qJ�/
e�'�c�#y���I�H��yw�����(����y���Q�O�z58����f���7���e�������qA�'��!�QL���X�&2�l��l<&��0^�_�swZ��3�x/�a���&п)�B��۹�6���r�}5�5 *�a�ϛ��d���
�jy_dF����$��WK�{���vc�Y�;b���p��-�V��G��h)�p�lߌoQ��udGx��h��1����^��y��x��m��a�째圚{TV�u��nO��g}�D;��"[<+3^bZfx�K�����>x�1�d�;�ҝ!Ψ�oPKEePQJs�y�pip/_vendor/requests/hooks.pym�Ao�@��+&z�rnH<4�ФIIZo�
l�]���c{�D�No�o�>���/!U��E�͗O���d2a?4��Rþ��M)U�T�V'��["���{Q	+Hȕv�{s6�c�'.*�'��K��V�`���6�?hP�D�-f�ku>��%�^?`[oh�v��s��7���֡5�FK��	�
a�s��	wel
�h���U��L7FSs��n���;U���|�������o�����@�Jr��I,9�Z`J3i����-�tկ�r������m�|H�jn����{q��co6~v�ݺ��m�
Ι��~�ۊo�2yh!Sw]�T�(�G�`j��=��xPKEePQ�u�s=&�pip/_vendor/requests/models.py�=�s۸�����ٓ�ʌ�nSo�6�G��n���ۙ�2-B6���ug�o�����ڙ�3��H$�<<��퉃����8�vy��������4��Z���\�j�������B	x�)%��ڬ��h/�X7�*k��>�I.Z|��b]��F|0@i��b���V�Y+�b%�w�U;;{ℿɊg(��f"�Zd�u�h[���S	@���y/n����`��r�q��l������6��MS7��RVB�Y�gM.����g&�r�~��fq)2z�zu.�\�����T�J).�v��?��7��^=^��c��DžR����׿~����թ�ȫlgg��+�.���ZVyݤ������B�0}�M#�
>��O)׵�����l�)�b�5�lY7+�~6b���]��������B�ۢ��L��$�L������޴���n�E]��׋�����Xc��
܏�ڬ��߭eC�Mz	k���2����n��f�h7���^fJ�TJV�h�k��X�z�4۴���wgg��b��\t���OY3�׳ Mąlg�bv	���F��ޚ��\CB �����P���R���8�����?~�~"^^n�+���D���K8��ji�|Z�����N�
��
�0�yf� 4UVΐ&���zVe��` OĦ*��
5�Ԣ(t�/�hX͐J�l%M�nF��D��[����h���j[����{��Jng��YY(�=S-�UW����V!�D��'UW�����[�j"͋+ӟP]�۱��:k�U���2;/a.?d�5���V�)5妢y�g��O|@'�ȉ8߶��U��ۧ8`Oڞo
8�Ռ�2����e!�§���_�A�ڍ������������D~�[s��E�
�Wd0���W@	X����p���y���;^�:��������ى�j�P�5�2��oO>q-�Mm��iT�$jb���F��%����M�ѯ�F@����6z�\���7/>~6���䇓3X�����wo�^�=������?�NO���?9��_휜�����ӝ��E�)e8�9�?_�*a�:>���k��
��:� �D�r�[��?��,���n���`J�ش��0�O��'k�nh��"�;��T�S�`�K�-���4=y��pR@�$��(1������8�ߍ�C﨧3H#ATb4J����~�_,VD|n�<�R�o�R	�Oմe�gx/��h%b]ȅij�=�n���D���rgG�i�'k �8� gŊ�%������)W�x��A�t-xp|f;��SZ�5�E�'�E�3�����ܙ���wܮH*T��5I���c��>�>b��\��Lem�h#��F�Ǿ���Y��%�I�}
����k��@��[_���4n�3/|=8+���̮���[��5��ZŻ�d�q�q̷u%�:�C2�����i4��0��"6�-=�jr+0q}�k�x�x+;^�D䵒��59v(B�a��ǙGUE%���ɞ��6'V�~��@m܇�`a<���Ï���Vֹ�xK�)y�	��x"���NȤ��];���~}��F�>��65�Y���O!9d	Y�_Y�a$�}C[���6��������g9=�����x��C#�`�LpO����LۃDz�b�
���/c�1��ߖ���]kx@�f%r�_Ppp��vއ�oe~8r���ef{Ye���y{�U]�@����t`~K&��:��o��R��ƃ�԰C�G�9K�a�{
���\��V�əj��e4�L�򴘥�a�`��
ʂ�1���=��xj*�hύ9���x���^ƞ�&�ט�����]өx߮%�KT��{���w�n0�Ā�ҩ�q��;�;.+h�[�8=Th�myY���wt7�'k�lC���u42���|)6I�}80g8��󍂠�6�>h����%<t�l	bpz�r�d�n0;�-Ҳf��t�e�ʮ�[��E�t��G�Y:�
U+�Ltг�t�&OTh~~�^���JQ#/�4�F���!�`����{�UA�1�@�a�4�3�J��I��;��qjj-����
`�,��H��#��3�c�D�#O�?' �nn��g�[����E^���H⏗�|Nә�^���Cv�t�f����(g���a��""%P����K��_��M�"��‍؆F|�D�P�V��q���?uH#����BZOz4�~����`�)�:�u�[��\G=�f����Ft�Q{�l��$����@������B�0-9�kt�c��[+���/ƻ�6#��x~d����t���(��4��]X�~6,���倎_��	P,� ��̇��3�0�Ӷ A/��M�d��3pc�90l��O	跤��-�y>G��}"�(�1�0�:��-�e��ш��cv�⩼s�"Aie�jc�!��,j�
��%�*�B��a|x������B��Uy	�5><*�V�<��I�K|�i�Kz������J�R2f���.	��Q�?�W��V'LNFv!����dž%=��x�M��y�@��ب��?�>c7@����Һ�x|![�� R��Z�~�	~~n�O��ArTE;�13�X��)*DKП�R�߈�g�c�c�E��mp��G�',bUƣ@��c�#oB���vG�.��G鄂��>}v���
ϱg,Wn�߼���67,l
-v0߽.�ᎏ�G���n�:�A8�
AH۾t�ɋR:ڮoA�}NMRP V�0�@�R��(���mꚙ�XK��p<^�%G0��O�"4��6����һ��&� n:%J�_�}�M/)4;%"�_�15T� 8j�>A�L�>R����� �Q����Z0|Jf� ��Ҥ�*��/���7Z�*��\��@p�fm9L�E8��>r
���E��[0g��K�ƒ���؇��(3rH�O��҂��0,�"�U�b�v���j�!�c��I�~�tIt���w�i):�a}�D�)��5��K���s�΢G��GYa���M�ToQ`��j����e=QJ���NS���Tҹ�`�T�	nE��r >==<�SF;�aO+�s�O��b����o0�"�i�m�a.��%���uн�>r�ϭ�6Gs���F͉�j�=�5Y�`S:�%��z;g6�F�&'�4�8|�0���߉fjx��N�h�C��S�Xs.��S�|C�5�!��Q�G�	d�eq�G0���lO�����WT
��T9�xW�t�M�|~Q\SH̘G�#���%^`b$x�
fMP��b���Ib�J�Vz���w�nW�y�c�1�3!'��=�f:l�c�4�a*����&G�w�RN�
��-�Kr|Gft���+��dZh�Q�Hy�>����:8�8rJƢ�n0�hS�"�s�@;�����\��ߡ�aF^�.=��h��y�a�΋���L6�)P���N0�m	�Y�]v�&�t�������4��8�;X�h"�'�>,����z/��w��i÷�2���``��5�4�n�k�$���0��zu�@dL�j�u���Fi�l`Ӫ�%E(0Ile�s��C������H`�#��'�޾��I����*�}��8\SM��)�Lﵭ��r��M�K$�̮���<��[bf��}�#�z���ˢ��-�{u��c�\�"A��ޙbw�,E�(79k4]|�$?��~>y��Ś��Q�ś�]9�k౏�>=z撯��'�Ƃ��Vw���^�Kwa\P�����f02ʛ�%�&�^0�u��%bv�\7���N<H�APT[vvi�dZR�@u���,��>�UV�m=�8��(H�B�+���D��PMӛ�lf�{k<��b*���Kq�g�F�������C�9	-��qJ�B%%!+&��U�s���ԉ��]l��+
c)�fL:�ߏ��X!�fuB='�G	*H�]��N�vi����~�k�s��iU�>���d_�Ys��H��iz~oIP�"���8~>���c���'��H�x/��l�Ķ���`�{8e?���q8����;k���c�OP���k���k��!��@���G
����Y�.�+�<����0�)n2m߃����+�ᐜj)�Ct�{��,��/ON(�<[�Z�*0�FQ���n�7���E�`~4M{.�i��I���N�q�x�D84���lTf���r.�[r��C*d#t��<Ȑm���I��.%l��5�l*-�-~�p��:�PtG��i��j�-Z�O�|�\�ۇ�#���%��U������\��(AÈ.{ڌ�{I���l�K��l���'���-1�Rs
�	^�3�Ew�h��^���]~5�ߏB@�4r�A��E�
[y��j��R�#�=��G%�Kq�r��|9ê1������>�IY���e��;��H�)�Q�8HS@�>�mCp�g>��hc�%}[V�
`�d��4t�Z�ls�~�A�tۧGY�
	��G�?)2�5�;Xa�U,q��z�e$N�Vҕ<%���d:b�P��|�Nw���9��q���0�w߇������
�A�a��v���;z��#�kb�VkES°^
����h���T����2�	���Y���O=�E�Ϙ8�P��A.ތ���.���7䦠�ow@��M=���XɈV�ɱ�0WX�D4��7��4�����g�-�nh����8���|��8PTP�uv�v�!�����T J2�-��W��#E��|�Z����ж,�^��P���D����a��=P��F�,���#��ƏSnȳK|����rN�PڴM(��j�U��^�e��w�U���`Z�z��f�\�Љź��aW�C��'u����O[�ʵF1�19�=�ջ/`]l����� ��S���>�Yh��HޱQ+�r�l||{�=��T��b6C�9�]�C��
;��N{��=Cz=�&h&44|t&8*������+�25l����[�&	I�ۚ�:y�w��)�V�&���b����"k�wEGW�)ë���1|H��p��9�m�7%pE,�"�8���u�w.��#��leoŋ$
y]h�����
cڿ��$���6-���F���=*sD}ve�H��|O�G(Ŝ�ꄁ�G�a��ف� ȣ��w\�kO�����I���*�'Z�~2�8T#��k�X��NJS�C��F;�Q#���=J>ݿ��.��@�ܗ����J�����ȧ� ���hwb�/��z@�"fZq��GÔ�P�Mך���M�K2r��D��J�ͼw8P��^'G �5��&b����Qw�2r�LX�hp�+��	
���d�	�:�EH��@(�^�P��x��37^�p#��r�@���8�I����Ź��F�4A�\��^�x56�H$H�$l������`�`��d��:z��*��d}1�GziNAM��2I��q�0g�8�q��݆���O�Ug�����ht?��W1���ΊtEN1X�_Ztr�a'������7��\L���:�1td�����nn{"�j���c'���6��a&$<V0^M�Ǚ�Yy��Í'�XtH�5��.�I�i�G%]0өXu8V�T�.d K�}�����"�b�hYJ��$�Q�,�ҟ�,����Oz���Z����{�˃���6
�	�$܋��qxS)�&\�Z�F��9��ȹN	��
7n��@&ea�8�o�Iū
l��p��-.�	�3|_��X��6��EiV�갵��Cp���Yš��Yg�u!m��R���]̃s7S�ڂ�9W�����r����.i��9����	��F��@��=�e�w���r�n�ѦF:k❳m�f�
�)��欟zm���x��.��q�8ii��=�S^&�Ϸ�>��	!�P�NZr�G����ݐ��tס�~/�AW I�e����錦��шt��G���3*C�"H��Q���6������pm�����5P	�A'�M��ƽ���yd���-h��B��S��)�~M�N�u�����ҧui�����8;t�GEw��f�^ᑕ���)j6�r���aӨ`9wlQn3�~�KO
L�ݎ:���pGl���
>i�Ə���@��&����Ӑ��	´�2������U����F{��D'��Db���`+��0ZPz����Bjyzx�:x������NjW^����¤f�.�V乛��7��E�g�yuғ���ɍ4�[�����R�1�Z.xs���:�O~���%t�L~�<��䱇����=�7�
�R��IG���QIYd�\�Wy%�.�3S�@(��Ayb�hB�E8�WL�tI���e�>�nb����LkT�M,����w�k�QΒ��et����-v��TDྰ���`>��s��V�L@k7�+��`�U�٬)�>��|��sI��2�2�"���L�{��X&Q=/�R8�s@*!̞�:�o��`B�.���w�
���D��Ն�4��6��\��`ޮYx�����̑�f�����#��H�!Pn2H4�\���fMS��5z3�sI�&!�\�m6�"s��)
��Z��h41,ȭ�i�4E�$�R���rʎժP�Tm�5�fiv)N��4v�^�M��扈�
�V�Z��a�9�5��a6�g���Ys�� |p�^L�}���dr���+�9Hz��A�YM������z������KW�+�)Y.�ً�V2��A�E1)#�FB_⊊W��+�/�ux�k�e&lD�_�H�)&�#ət�,�e��U��Ƨ��%�'tl�K�A�b�G�H��w�ٴj�/.v���	]`�F�)��	�7���7���>�.Wd8jf���+PQP����z�ο�.��L��Aխ�z�/�p�-�y]�}p����Ӧ�8t���LA��
5<ߗ�%/�.E�^4�㡅2l����Ѿ�����:6��gwQH���I��i�Y��Ĺ>���J*
N��p�N��N�������8	�W�&�˜�6�� �<�ǭs�{����SU]�M6��oֿ�fQр�p�-f2�
.��:�d�
E�5;I�<}f�Tz��K��~Z	������1‰ߊD�s��k�3Oz����[n=
��I�Q({�u�P�{���%úҍ,K
�c��0��?�):	]^~yj�1����D�.U����O�����LF�l���.����U��)��������4�[(�讨d��*���ZU�\��M��܁�}��������֓N�#�:�ؖB�^�`�6 ��C̎�PC���8:,�X�mA�M����C�4`�z�6Hl>�I
�
0:�S��s|t��q�T�79}2�^
��S:���OZz!W��m(|#ď��&֥�7�����
���GV�I�
������
�K��)0^�Y�)I��Kິ1)���\�I�wV`:\"gp����0�(�c_I�}��(y�t\J�2
��`�؅��� �{�Ub��`��R�۴o)2��3f�/�]�e#e6��˵�!h�`aǾt�L� �g���� �n�૒|!8iw_i-�A���ӭa:���^����B1
.�:h:Y�p�6����r�43�y�]g]`��.ټ��nijdB�ٶ'N9�,(�L�H�k5^;�F�$�=b)�{4��#0���R�t�e�F�g'm�O�k�ſ�3:��<��)x��I�`��>w�����-���|�wkB��4�=tI�<-gz?���s�pK���
�v�K��v�;������
��9���1��4��ca�N����Dm�-Er[a�V]F��"���G/u�10ճn��9�f��l�d7¤�N�����.�"���#�b%2pw���mn03֊<��Jq�=��f<VvN/���FS�7�B��p����vB�=
�JS��A����>��X�����F�zP7��rʢ�rQ:'���ƃO�b�p"�#wh@R�qx�\���������;��n�n׎zZQ���r����T4`�p�e�!�gT�0xҗD���lCD,��W<j�2�ߚ�o��i��#��)S@
�Xi!��D��}@Se$���R.~�t��3}�ex���TC�/�bH�?�+]��ލ�	�+�M!Qӽ�U,%��������t�!�ʵZz�r��w~ OgM�w緟�`�KB5���S��y�?%6��&Qq;:s�6]';��N:��z���f��C�!l�{��0W���~KQ�����U���lL	��%���.���]S���R�ƭ�L+lߒh��H|��Z)�D22�����6x�8��D���/��(�i���+n#X�|��fXcE��3_��C��`d>���:�R�	=���@C����a+Iե��\%�\�	�k
��f���<��d����M�U���ZĔ=�f�i!{�UU��]H�e����h�([g1X�(e���"q>G?�Y��N���68AK'D> ��(��A����VD��up��4/�q��݉z[1�ߓ��\"�o�8`O�lz���C�J	��sx�2�1�:������_�X�V���j:j$�T��N%ί�N:m�g���~��.���xԻc�����i}.�1��*ޮ���l��dU�r����}��כ���I��&nխ�Nk�lxe�����	w⽇�*�2Dd�X�k���n�<��q�"�����(eѱ��e�TD�p1}+���X��Z����6Ռ����
�?�ߑ�DŽZ��)�+ru�I7�	������!��f=�V�׵�'W<�+Ż����?��{K���o���#���<3C,����go�M��i�����)�]���u
0����0'���&�fݝX���ZÆ�6�s������ӭY{-#���q:Č����G�6 �m�һjs����rgcnK3�w�"�Ї���/�Pm�b��pY#��
�z�sɿP^���(!��ES�^���ۛ���#��]�
��K
��k�f��i^�ѝ3hT$ޞ��ݬ��,x:,�?��	�}fn�%N�[
)w��η���o%�E�#��1C�-6���!_�c�)U�w����bHA�b�>��W��<b����z���[6>�xΠ��H��a2z���O���ۓ.�%,��td#����<���)�����m������2����kɉ��+$����u���	�.��)>��˺�����:�R4&V_p����C��j|id[/j�r��gϾ���u�Wt�i�Pɩ���w��3��Ӧ�:8�0���n��-�ֻ)c0���� �����ߊ���RCڌ)�E�^�H��~���M�!����wu=8�o�7�Sf���9!�9��1L�������<?��c�d��DM���T�C��u��&���θ��o����PA0�
:_��ԅ����F��~�cq��������Q�U�uź龻���x�W�yy�Lۄ(�Wq�Zut[�$Og�A��m�/PKEePQ<ށk� pip/_vendor/requests/packages.pyeR=o�0�+�� �
�t����-(�bb"��#��G9n�\��x���4$� �T�/��I�K�H��>1�\w�8�%s\��0:IQ����h2:"P��#[xE�)A}H%7YX7UU��v�D���!��լ�����]��1�f]���O����m�i���ׄ}��oʹ>������T@�Ҽs���53h�!�;#����s� b�"�'���u1����k�2�V3.L� ��C�wD��.��.�����ǹQ�9%_�	z�Zd�ʢE1��E�ͣ2W���8�E��je��a+6FyO_Z63�m�X��ܬ?�`7�m�m���F��w)W�%(���P�N?]
+U8��~L�>���PKEePQ����L �r pip/_vendor/requests/sessions.py�=ks7��+���9jdǾ]/+t�,+���'�{��u�#�&�0��ܔ��_��0CI��c�.�TL�
����'�H����2+.'��W������W_}�W�mj�mLV{����ί2���ɵ�T�M��F��;���'��U]�uZ��Z��Rmte2S+�������4�
�����δ������|%4�l�)�Z��~2[����zoU�k�Lk�ߔ�f��:�׋2�af0Gc[������W٢��F	o_�.R�-f�hf�JZ,�&�m�w�]�Uff��ӱj���2+��&������� �Z-�គ?~�SZͰ�l	s+����E=����A��:����Gk]]j�p$#�t��^c���01�t^w������������ɏ'��
`:K�J����ñZf������~����4�5u֎s/�:�ш�q�k���@�<É��t
�2�L߽==?��Bo�2J���Ǵ؞�eV�I�����J�ӱ:�j�k�<.x7WU	�<*a�E�J{OG�?`�͢n��|G��'�х�pu�L�K�t�p-8?w���Vϳ�=Q�z�T�X]�z����*���	~X�b�+sU6�rv�ݤƸf��SC��mV@�r���֍�Y��/{{�Ԫ����-R#+�R]��A@�Ӧ4�[��tq}�VKś$����3�e������r�+`K�����!p�)�W��
>��F����ES�~Ƿ���(j�N��~L6yZ���t����&����N���t�<�'z�;��AMI�$ �V����2˩�X���51	A=N�<ӕ��Ң����G�w4#a��t��.u(��~�`q�>@���C����p d_iX���y<��2į�'�ZDWVl��5���^"E?��+
���"s2)8���x0`K� +�+�<Q'+�8��\�N���o�m���B3Bb	<��}���v�{��$D��l�Ui��n����=��?��?R/i�"�������N.u��l��������Fغ�B;�3g�x�թ�6�u=�x����j�H�dz�z $���N�hp�+x<���F+hl���lC�A%鑨c>G��*��Ko�l����=B,��(mR|�;��36U�isA`݌����@׵���7�C>�@��آ�e�4�����#|H:��丶�w���2���Ҩ��#�����&<7R�B/�-"�B/��h����9�p�e��No=��?Ӿn�B]T:��g�P
h8��m�6u��Eka|+�t�"!1l��<>|���ԧ��;C/8D0�.q;�>J®أaV��1��CVρ�{�c+R*i3��
�mt���l<H>���r�T��'�.>�`����|����-yx��j4�>�h��*��P���,8~�u`76�� ��%�| �E
�=��Z�:��]�tSͦ�#����Re�A��׷�B{�NA�0ͅ�)u�2a���(�:≥��A�Y#��9C��}`	&�#//�X5I�=T��I�̥�1@趀�hZ��h$�`��G7+��R���7 G=p�UW�I;�MƋ�?	N7ؔ�&�a`_>�������Sk�%��Wu���#c	�L%@#@�?���	��M��z�UPZi4:�¦��$�!�ύ�ppn#`U�₩q����xvtr�W)������	%���i�yv���a���K'��RyJ1��$q�EYY�AHSZ1<�v	Lב`Ǭ�Ke��yk�n���3����'<��kH����c�5�Dv�����AS��{��J�V(�I��7d��H*�!Y1����x�
���!�Wy�\Ej�ҞJ�0W_Z�xd�/֞�,�5�l���������E���wS�{<���y��l+�
�Ki�LR�v�����J։I�p	���2������W��b�N�;R���?�f�6�hY5��x^�8�4�9��ԸA��;V�G�.�{�����(D��C�Ac_��(��ޓ5
;c���p���ãP���gO樗�ߥ`��y��	q{I�h�F#)�R~I$�-O�h�
R�@e��L;+�uz�u�.�����T�I##
�A����H:�r��?�}4���@���V�]V�%+8k8��W�,HzP��V�AQn���x���g��j�M�)MjLN������qg���S�c�Е�nU���4 �n;;��_��j����|�x�4�`Ͱ�m�8�.���w�^aԋ��Zojפ«�q�D)4E%}:+i����&ej����5�p�`�%'(���u���`����56�0��"e��dQn���^��zO櫝?1b�2G� gK�{e�*��s 	)��&�0�u����<�
2���L>��@Y���炽���q؞�\\�dJTh���ኺ�=�5>��:V�M�\�^�s�����r���L���DL������z!|�N?���g�4;v+ǰ.���/�=�t?�lM��Gc��O�B'�2��𰚂t���
_l�2O��]�%�x�-N�A�*� N�(Q0Q�ox�?y��9؏���(F ���������AiX��*޷��9j��ㆃ� ����CG�� �92�(���b� ��쯴�Ip��W�ag��r��kL¡�9O��'�7�,�:^g!I��V�XG�H�]X�!
0�&Ozh�L;@�	�;��az�c�)�ô��(��.�}�.P�C���H�Z;Q� ���Ե�e�Jb��4ǫ��<�Ӳ�z��	�P��698X��4+�:_vۏ"�G����۬��O����d8m4t�����Su�E�kXa��뉗-ӏ��1OL<�w��{��yD%ܩ���=I<U���@`�0�&Π���/���F6fu`U����p����g1
	#^؉p�:3���Zc�(��Nh�9 ���uZ�ܛ���=}�����ѐ[U�UځN��uqY_
���Oη��ϫ�0+]��cmЕp��;��]D/Y�`Sn��y����!?XLkiۿv����kNSpz`'1�u���f��7��o�q%G���w]A�/��K���֫� g�
��	
����V����%,�����!p��h4�Bh�Y��?,��4��e5�.ou��TA�.�O]��NJ˃���($(
C����(X�q�vh�(�bnň<�#6�c�"w�СZ�z~k�Á�Q����#�e1G暳gt8�����B�7i�h��B�s�����@#[Ut��)j�g�0-b[�h!��I�R�`hZ�L���j�������b1 \)J�#�p�Y��G�y-BJv)T�('G/W�f�R��r��G�u�m�ݧ��4��t&��*[�R1�"���ӣ���x�5b�2h��(Cz_�����ob�o#��?�Mȗ���m�AJ�G;�������4�Et����!�}�9����=ʄ�l����qhL�:�N��5�_亰����y2��E�K�C5��;:�/4�;>:�5��nQF�":�I�c�U|���cc��g=.����w��#PTĬD�0%,ϳK��罥&�3����ѳ�~K�E �L�Ѝَ87�/���f#N��rP|DQ�q�Ý�%I�%�5�])�4���G%\4)?��&CE�L/��#H{�G�d�"z��>�>Є���:���I?�4,���rȣ�egَ�^Xj8�2���= ��C�n$%Up6�y.P���n'�ӂh,����n��ʮ
eu�`?���6�@5�!�	N�Uv�p���x�1TɁ�I���7i��g��f�y��kv�)�y�v������Y�xc�l�cd��|o9]f
6�M�a�b7Ι!Ɓ����N���Icm؞O�s�b�%-S��y��9:��p��	��$��=�j0�&��+Z��~B����KĊ�|�/�'����8�BQ�x����3&Wۂ�O��w�y��ؾ7}t�QV�=��PM�m)���;4�d�=�9r���G�i�6��n��`�	��6�=hf�D�����|��\���얿}==)��Ƀ�Za���-��`4�zk���ؒQ\��4y�;
����l4J����Q��;��k��y��
v�f�7(J�#Q%2l9�h��`�$fԚS���YuQ���@
Ԭ��5��#I��J[�W]���e�^%euypU��j�@'�#���g�3��NE�rөx݌ֳ��*��2��M����W���nʃ���_� �Ӛ%�7jYb���du��`��O��S6NJ���7�c �t2�v/aU6�;���]��޽=;dzB��|2�C9�9>��f��G�l�%��w�_��),�<�����[N�M�����/X)�x+���+�j���\�b8�K5l�H]��%w�X�l��e�LS�ƞ3d]������Sc�K��=&JL�}���[l���#u�I�u��|^�=��^dm(x᜻��(������_��o+��H�Zj��pr�,�9`OwL�>��l�<�l��f6Ð���@�2:��@Ə(��_����M�YZ�k��΂Ak�P�Q�~���ON]��Qy��YVd�lFr|�OM�!i��Y[��go�M46؃��1��3!~�̅Q���Ŝ��	���N63�[��b��UґZ�1�g�Ch���[�lr�/nk�$�Y�[D4���3�o1��B�p�rQ�8����m<�G�@�?҈|���s�&j�*��"�&O�|�x��wd2�Y�y���7�ϣh�@�F�TJ�}�[�4z��
:?]��$��$�l���-&_�x0�j�A7,ML�}�#%`jrQ�9��d���@~�	�,��a�uZ�m_���W����3ڿm��&�6"(��J�J��^�?�Ȱ����
@�|��"�pp4�%���|F8G��&T�K�&�&���}�;m��N���;���fH�{�Џ�lݬUѬ/td�ؘ7�䩊����ȗ<[gX'�#�<�+W�H�� �P� -C��q
{�p5^�_�9���p>OGH�6`cGi0!�������X�Ğ
Wꃉ|[�yl�iL��<�a�C�
h��A��
tR��^65i���t!L�`�r�k/�.�3�\���V�oyd����Ŝp}x����ɒ�>�����u��]nލ���q5�F��y��@/=���qc�`�~ŵ�`f��VÁ����G�[�6���U���`����|���T���:J�d,��U���x.��cQ�m�)sTAl�m�c�o������h���+I��j>+v����Ը���T7i��w�B�nPJ7K���o=o�J4��rt�X�tv�Ĕ��U�`�1��]M�q��vR��^#�e|k��' ���P�,K�U�ieG`�QK[a�"N=;2�߽���G�G��#�B<iQw���
"s�Ց<�Q��`N�L��D^�Xd�l�0Z�e�IQQ-9��\�.k�8U7Ds(�s�z���l�?����C�F�����4�
J�0�	�M��������
P�t��K��'S�5~	_�	2�-3L\��o��=�D�cmr��r��Qw�K�Y�;���:7NC��V�z���D6q��V��w�����/�����E{O�r�ђ���%�7�n�?a����:��Y�=�ྒE�_$@&�OQ���Z�q>X<�$\Z,��r�l-AEl�ڀ��j/���؟X�V���7�$ 0���_ә�FoIJy����R[���Il#�,<��r���g�Yj�c2�F����1�	��`��р����A���rJ0|p�`�{��`�.L�����CÊ:�ɦ���ku�g�n(��w�j>`q�8����f>O� Y�\r�)cm���36����j�OXb�JL>c���U���G\M4@(��Dl�Pު������}��,�e�v�@�K+LF��nxu�`�V�ʚ�dR�W��Pl՛�$��H}+����0�%�885�`5����
��8�Bx�����;��e�.ֹϝ�
R��ýס&�ض@d�5�=��\zY��|A�ot��k)��%m��\I���*�8�8�I��[�?��2�Y�̍��H�\Z�-�����r�2�l�A�[h��*�ᠣC0�F����)z֋3V{�ë��
&�P�WǦ:�)��p�Psp�4α�J�L�)�)��ʪPVK�Ѣwi�$?���ѝ�:�(q�&��G�i����*)��='�L6y0�4������j��W�j��n�{ƚU�#���5w�$�ʮaћ|`K���;���$v��9r �N�^a=���`�ɶ���-Cvž�e���.����C�4�KTm_ݩ��`˜��K�ᶬa��[�Tֿ|���D����k�� k��2����w�[zE��"��Ri:��yر��D�����1n[�t4_@����O޾9��
_D���@��d�l��h��@
��$e���4�(�\Θ��.���E�����g9���(;�g�'zzP/o5�X�>~z�;�#�}�����J��������yٗ:פ*?�u�������Iދ]��2YA����Tw�n��)zx���Χ63�f�r�^�WS����rX.�H��tk���ի|�]�]�	'`3.����ܼ�1{�!�5�e���`��$�;;���e��ٸM���[�Ým�"��g.�Jx?]Q���eّZOH�����t*�L1���B�U=#I�����������뮨b�O�F����ˆ(_vz��d�	�6��b�ޡ���P���(�ck��S0��*�E�Y(.�L:Q���P����Q?M�k��%ؒ�"��v��ث�G�(�b
o�!���(��5yGG�j�.�o��gi��y�?�+o|8�e�Wl��..�i�ӊg��>=U���vRI��P�CL�7Sy���i�m�\j���i�'	�x�J"�Վ�����S(0��^o?��|"6��i/��|�,s����<��,@�c6�Lx����A��\�|G]��XQo�]7��T,���Fmq�"�cY�2��:��q{�D|g^�w��Vw��B��m�����kP{vլV|�/��IE�%qC����>z�
<�Y���ɇ�����sr<��ț`���c@F|ߑi9^vl��e��VrC��]��G��]��%T��]�*�����]ܭ�XM?����x��ںdF��S*�>����9�±VtcН����^�w���NY���"<K��`nu�;����~��>T1��+����o�Rt��s�2�3˔k��
�K*o��z�%���CP0i!�xC����]��;���A�e��\C��zVJ�L��}7�u�R	@|B��.O��|҆%�Hh�M��	G���0�:W�H�>��e�=������&�)1)N��������p��W���(eՁ���`�~IL�F�mѽoi����)P�m7�}�����`�>v��1Rw��Y|+&��X�h℀3g&�����D�K�-&������U}��!b�/ V��y��gӗ�n����_�Mdf�o��PC�>��P��d�v�Ŭ��V���݂��ޫJ�����#ߔ�F�e�{�����d�?\5��Mٗv�W1p�+.��U������]��b����c&>�R�,ݜi@D/��_�qz��!�*��릛B��N; Mt��%V�VR\s�V%Z���UeUsm�R���#�ĺ��xE쥟��5X��𱵱Z�ޒnM?N�~'溃%{%�H}K���7�_��h
煿cufG���EP{��u�B�cd�F'���P	?ʥ��P��-��~�%��7��cn�����l��?M�$��H~��2[W�L��WX�%4����:^�L�_��:�`���Lԓ�q����к�:(�a��܂ϝi�e��0tǾ_���N�D�ѷT�mo��
�R�愤��U���x���i[�����"�s	x#�Z5��-�A!���X�ڷU�	PKEePQ=��z�\$pip/_vendor/requests/status_codes.py}W�r�6��+0�x(%�b˲�x&����N�ir�3DBb`ж��W��K��_��.H@rRlb�a��]����g'�2�қk���U��}��I�~+�r	Z�KfV�d�Y-�JK�kE�<���mk4Ӣ��X�����2��t�7�o��L����
C��LT�tN�ɤ�e�{oժ�`ˠ�V�WF�+�������v���.
�7o�0�v�zf��^:�F� ��J�@0ƭ���m�|~��+�f^��x�.ή�j�Ƽ��槧E�δ�vʶ�N��o��)P�{]���[�w��'8n�=|V�Iv'��mC��&�WX�D`��}���![3s�\��/?��.�^� �`��V��”�<s�z�ɬQ`�g�۾�=L"��1�}�-$�(8m�5���� Z�	lf(<;=�f��2�+���xz�gA��P\��ƛ�4.��X8z�i���VV��Q�'���VqooL��ʘ<�'�S�䡹
����IB_I�1��7�����,�*+����Ӝ��ۗ�.��\�~k��T�;��1���&8-� +<�Xf���^
dO��d$H�/1��z%�E	�2��9M@
u~(±z�P����`��x��ʃ3G�TˁVH��x�!�x�OG��:��(����9��5w��p�Z�a�
f�1�'�8�6��3+�-'%7���Z�c�Dx�Ϯ��'c*`+��v��2�G:��8�N�q�(y�1��@=�B=WCm�C���E��K�94 �y ��*�5���|v:��F�쭵�Rb����y<��2��^�*�=�"�~�k��=�^Se�,Y9�tٕ�k�3cFb.Yy�Ҽ���֮y@E�����#�r0GgY@/�{��a��<���t��?J���_�.�ZizJ~���"ǮU%X�a�7Fgn�a��7~�96�#�J�V+�~-T3�����g繗a~G$+�&_x��F&>�9��$o�f����q��v.��k��H̱����ܱC���-c��C�H��gD\E���.A�s�R\d�aҜ8J9:�2;2#�Z��
1x�M����,&�1�m��SA~�ZvRñ��L6�1'��jzD��ҺQ�����XQ˽ڏ���zTl�G��6�Z������g��s�:����]^t�|$f.��JW&'c?����<P0�����'�]\�Q�*�tm���
y������p�3��$�T��0tO���a�+��f^5�TV$�w��4'�"o�\I�9��e@���/��
݇�� z'I��H;+�b��6pa��L����Vγ�Sɥ�8�$��X�[�;��t�2	fsm���|'�:tg��7#�]1.����z�*��Ќ3n� �^���^�@��j�C%eM��qyb��|��`f�#&���{�-'����ΟE1\��M#�K��ѥ���\��L�ѡ��c�Ԅ7�f��Sn�
XD��2��ކ��xD�1����ԚAtH������v2)�_����Y���l2V�Ia����١��kV�}�Ȥ\.���\�#�qw:m�C��1�
4�[��g쨾fG.L�P��p\{Ә<�98GQ���'��s���=?�c��k��c��k�~BN���!��
�a��c��{`�c�PKEePQ���|�"pip/_vendor/requests/structures.py�V�n�F}�Wl��E�
�.`8) I��AC\�#i�%��]Z���;�˫l���{�v��,�ay��B���^B�6��M���E[��f֙�p�A���Eo�0��턃F����1�]Q8��pR�d�h��WS���,\�
]5�|MC9��ub��{���P�Z���k+�|Bv�̡���Gi\CA���%Y�R���F�e�7x_5
+���T�v����%��u��<h����G2��#�*ts�����ޮ1�I��g�y[I��%H����@Q
��PvX�ӰF��nw86�\��p7�;�)O~�̱����W���$D�u��<O��8|��SM�x8:@�^R	����u�$��3���~B�	��$�3�މ#%񁴡�I//S�PY�Ջ�XL1w�uQ`��{B��/%���Y]�s���y��-C_��íiq�QҺ����q��6�L��b"w(h�]�5�ޖX����IF�@���z��P�o� �3{כ�McC�D�Sz��Th�d��{/���ZT{�6r+k���T�i8�y
�$�ش�䳶)�C�W��
%��I�p���ԗ:ۯ�� 5x[���dӡ�5FR�@[���5'�
vH���j%k�V�Ģڤ@���O�&�/.��lm��ǘl�$%LV�D/r�p\�3��|r�5w(I�tw�$��ɐ'Q���N�;���@?��+��!��mC�[�䑂��P�JӢ�5�!>L�	w����H&iM��>�~�v��S~﾿��*Q��NO:�5��N��y&�g�'�H��q�2̒�%�����fe+�OƠ�d�`b7Y�Ƕ��|�L�f��^���t�Ƈ]�R?.n&��������^�L�3�r�E���q��C�4��L��ɑ��P��N�����n8*{4���nl,'p�W���P�c��
��k��x9�qt��́7I�g~��?!��J�WlN˜�r2�����>���1l�,�W���9t[��zm��u�7��>��ȕ?Z�ɘ@ꡋl�߫��r���_�bx����s��<ctn����n�;�
�V��gٗh��&.7zF�oڊ)]�2����f̆�OV}���]vF��PKEePQ��[%�upip/_vendor/requests/utils.py�}k{�ƕ�w��Y�)@��.v�.c:ul�Q�ة.ɶ���P���l����@����zژf�̜9s�s��v�Y'��X����|��5�
��J�U��$-���mm�^&�Z��*�jY��I�K�M��N�W٬J�T�eT���jU�X�$�e��c�U���2�&�U��y��m��,JarY�Z,X@��J˼�p�zV6߲
����<Ir�)�[�|*�ٕ��oU��5����^,�IZw���pU�����y�/`i�e��m�B�/�΍�0��E	��д�I#�f��Ҷ��0���Z�0U��ܯ2B�%0R�U%}�aqͮ`�q	s[,�����$��!��=��f��2*J^V�2L���T!?ï᥎`�=�-?��
��*R���t9��������mo�~��w˨,��*3ݣR�tG
�u����["Ȥ�w�B�]'E�-tV�C�Ͽ��K�:�ג_A�z��Ǩ�u�>sC&�UѴ}S<�J��	b�e�V���ҡF�Qv�I|v�zd>G��W@u��	��	r�βB�$YMS�m�E^�����_�><Q�{A��b捔�'h�����ק���go^�>x~�4'�n��|��o�O�/�7VO�~.�ˣG݂c:ǃ,ӨR\��Dy0��ޘ�m����mQr��'XP~S�ȁ�_�9Q)�|�,�H����诸�/��H���/��c�p�+9�	���y��R�mr<
�������Ƹ@

���W��ֆ)�q�Չ�*dB�<P�v����;_�~��ÿ�/Ύ�ߜ�g'�ǣΜ�$�W���Y���흠�݋UQ����H�Uf`�ֶ���0Cڃ#�Jc5���O����!����/G*R:�D<�r�,- \�Y�_W���1JW���o#�����5Wox���w-o��M�Q�ȑå7�|S�;S�����?:q3u3M�MboO�#/��?�+�S�#3���ZDWx�g�zv��q������R+s,��5|�0���=M�Y�>�� �7=���U���|����<��
�V�(˳�p��~��'�{P.A8���yoFnd]��
K�f���]swi��0�4|�&�Xj��Ѭ���̕x�?q�mc��i���{��	�� �T1x��>�W*�A帷��<���.��B��4����l�S�����\�qU耶�G8#��
��CF���2DDo��Q�����6��貼4\�a�8h��$�����*��qsH���Rϒy��U IY4ؓ��v�6�{��:��Ѱ������
`�����W��c�I�S`��2�hM?�DP�k���Jd�*/�2��A�H@U��L0Z�z���5�XfU���%�:�s�W�h��䢺��o����p�����D�uf��N���ОG&ǝu��/7t����'Z!Y�m�x�	�᏾��,>�<8sk�vhE��u��6o ����`^VQ��CP��2�d���V�E���ɤ��&�"�HP�!+�4��� ��I�`óB#��݀Z���]VK�ӄ�
,X���7�Ym`�.o1�`�|�����[�,�/����L�����A�5B4!Y"��"\�8ҍ�F#�G8�YM��b`�hDN��:�5o�XY.�.�;4���@� ���p����ȞU��H	��}�aV�'�+M��z�_������K-�����׾ZVU�Ͱ��W:M7����ث{}���{�&ܸE߄W�p`
K�6\X�/��uR�@
Պ�,��+�T���YM-h�߂�����(q��uĺ�ɲ�	�wejm	�iNg86�8ϼJ]��tçМ[散���.�4��T��Fv~v�ʮ�=���9�ρ%��E��=�=[aw��Z�^j}�
Ym��?�:!���-u���2��0r�d�#m��eL���P�<0��n��<��>���ao���Z�4.��ppA����Ю龌�*!,�S�w����G`�5t��u����<\k�߈��;��M��Et�w��t��(L���{&�Vե�*RPr��ԡ�y��_�J���aV�%� ����8c��h*���ƽA_F�
��:��
M�t�Q�99����j)
}T
�+4зK87p:
���/�z��P��.��}�c��vL��(I�[������dv�G1$T�oVIL}�@�h����NW�,�@�fA^\�&e��{�����2�.@䮦�5�]��]��{������5��V�a5�����=�l4�4�¹����S$pf�
*�S�L�����ch��r�ċ&a��H�C{`�K��ZLuQք
���d �?|P1
'e��mQ5�4�-����eB3�5��h�,A8 A����,�|`���س���F(�V-�[��� �8��E�,I,O���O �eo��GΠ�3�O��ͮ����Y��l�|���w��"F5h��.7y�=.� ����0s�j�˸�y��R����T�C�פ��mQHukⰊ���d�<?QFGI5j���(�W��Ze�^e���0MزYR��U^�ì�.;ʍ�{|��w�ry�]��t	��-�������$�u�6z��A,�I������#!0}jT���%�(��Y'kSӏ�O�CoDbhĭO-Q[��>��=���S$�C/��a��zg��?��u�0�).��c�1�
h��4��M���0;43�?2[R��ۡ�`-����D�Dj���!�"�&���]�T(�7s4�d>@;�|ygp]E�t������Q��m$��܀"��&
�ٟ���ʄF�*���@��@�)�N~c�'�	�a�B�W��6걏!`��R37@1�;�Yi�0�J��%#� P�5�ZgeJ�~64[�ز6 �<2MՄY1!�Z�I�L�y�Ʃ���Z��Hn;�u�z"ޮ|̓�?�f���g �� )C��3�ή@Sb0��d���m�	���t��7
����!CL�N����H�@�G�bI.f��p�s�bi�'��;Ä=�=R���zá���.���uF��!o|gD(��Ю���/����W�.�F#1JA�%S �p\>H�h��f�ZIE�.�N�X��!��C0�k��X`I\|��Ff�QF0�����MF����P�={ֳ�s߃���G����
���z,(,e�P��b�)�W�2�X�*���1(��g�Q�(A���iL�&���V�3�_h5c^ͯ��d�h�9c'ͤ��9�ѽe�;�UX��H���!��<O)�bhc�\��o@�璼�`�k!�*�G�GV놰9���&���۳]O��7��#���Qp����^{�6�B�X��	�����H}[�Bcv��2��wotq�I�.�_'�Y&�0���ɺj2�h�RQݺS�7�Sǯ^����O�	'���[e엛�҈d˜�E�Sj��b����Tcܰ����R�0�d�t�Ԯx�	��z�>��р(��G#S[P�w���۳�@/JQ��"�c��J��_ᖚ�Xe�"B˗��s��h�P��!
���*Y�c~�����X�&ڡ��)���Uj�J��rU��������LR�N&)U\�A�S�\�b��y(�?*b5��A-������R�W�W:��`��
���[�$�kO�
��������k"��Tt�6B�J�
��x�Xָ29���1RՂ��i6L���g <�2v���^��p"ϙK���		����#s����Ʉ?���7h%m܉Ie�!����ѡ��pn�tbj1�9��o2	
���$@́�	�-#0�>�q�67��k]P�1KV.{AI�Z�!��̼y�OD����_L��ij���l��8�F���=�AIql�NB�=��t.0�!����,e.и8Ѵe��G�ꂉF~@��=���PKT��A�Kϛ1	�_?��H�;!o>�4�s�>Z�_~��7�#�ر�LF��⽝�a�P�$��ľ$#���1�&@
�?�(&��󗵇�@�=�ܷ���������G��V*`��2�5ɱ2���9e�"����a��3�k�
a�35��Q�ߪ�x��oJt���	O�~@��N��KiY�t�����(�y�����nw�ÕuWũ��䖽�Ю�Mn����&�p9*������:�|�y˳���P=����PB@�L��%�:غ�C�b-Pq�"�=ܜ6A�^��w|\3�n��2$ӯ�2yۡ��Ӱq�LN�e
�L�C�L���ZP"u��x1l�qp�,L�
/,��d�X�Lj�l6�i~�i��(�"C��|��%Y�nnȶ�70��|���X�~8v�LV�Y��݆�n���:�:�����S�/n?��dC�؜b��:`��;��ڼ��'�tLn8���~:��F��]�?rm�7"���n|�$�.o���Gr,R/�ʜS=�8n^+��E�̝��oG�r�mI"������ը�ڟ���h�*h�c��Dq�HA#�m��e��з	[�&0Tu�`	�2p:4S+t�����gk�lT׏]|;(q��ָ���v��h���0_��"�n�h⨓�=��$~7f_+:E����Ⱥ�?�(k2�(Wm�J��k�z�D��E��f���`��!K�Eg���Ui��plr�����@�(l-Xf�&I9��� ́�C�J�{�2�6I��,�3��[ �/4���@�=�����;�?��!~|��&���&h�"�XD��1���5��`oi�<}�
��f;z��zf�f��@��O}�p�z)�5��uZ�X��5��?]�7�mI�u�N�� ������e�Z��!q����5�ź��Ø�Gw��������G���<�
ޥK��pd�ڽU�WZ̜�!�z�lN�"5�
�g$�t���b��Am9K/\1j��qԽ|�o�|{�)�L�|�v��`k8�dp�|��c�梣�a���=�
p����8�Y�H�{M�����6�k2ٔr���ߝ�����$�����c��{$@�Ra
������f|��X��G��ӱ�[�Ϛ!=�h^���X||^75[?��
(̤&8�����y��?��{��F�A�S�Sȗ�`�_�SzU��)�;�>���RdZ9wA��޲N�v3���i�K4HFl�Z��"�c���s��$���Ry�7s����-��M�f�Jq��V����*��&_\o�1�PT&Y�N�7��lP
�7
��i2ӥo�U�W�]m��VF�5 �{p&��]FoZ�%%���60�ch�8ϟB�f��+�I#)@��Q���~�^"?>�vcl�����ѻ����OB�̞�=��R�R���3�T>�����i��&q{&:��~`�5%u	D
5�M�1��a=Hm��A�����ý����W��F���ن͸�gj^5� ���˙�.��m2���I�<�
�I�n�Є&H��W����=�͓�~.)S;l��e��9D1<��L�L��n$=k����p��������/Ó�S�=��(� ��������?}w�翼�����z|rz��O��G�������U�����EY��on�>
����>���?��N�s`Tz�vmf篊��gَ.gi�w��ػyd�RόhYM1�`m��r%N�5�Jv$RÑ�C�/�TҲ��'/�����	8�;�.)A;1J��dKp�f��#����_��Y�����A�p�����]�MR�ARFi�Z�/��^����e��ˑ��/��\��쀦�?���f��/Jo��P���1���å��8y��7���{KOX�a'��[�m�ct7I(�
rFvN�\$.k��[9�@�u��`J��r�u�6�oE��@�92�ov7�hy.L�\Q���A��}F���[x���{h����m��-������/~��_�v�_O�����ct������m%�7�˱,Q�t8E���ǜ^���9Yܪ>��f��O�����_éF��IW�n΋�������t0+�D\���,�L,H|�4��6�b\��� b�M�1գb�w ],h�"�E�T��0����S|׆��k�V$mY�1l��f�'�Z@���,Gx5��as	�m,{s���J�)?���
S��A����G��C�e�%9$ȭ��?�����>K]9O�v�|ƀ�������cH�Ĕ,�&KD��rI�s�]���7�]A�C��2�ڰ.z�+�JB"	�[)��	��L�q^a���"1���CgP�gB�9R�{3��(�_����8�cgq�H�jz��%�� �s��V�֌�r{{X�oQ�ocG ăG
-��?���o3k�-ٻ�˟����ӧ���Q���oc�F^V�/f�>;�x�koi�iy�(��%�<k����ٺ��餙�UJ��:vݑz��#�Y��rk�?j��O�Y>�r_���L0;�"�Q���ླ6W�D�2>/Hu��
9Gx&Z0�3w�߽��N��/$d(��GiE���Kղ�mi��������v5�{��M��@>.�,������
,`h]�V����U�^LM�3�<<��1�N0E���$_�J�?�)2���tC&�|N���X%���30Y�s3�����kA�<�E(���ؾ�o��i� >O��8��2����L����y�r"���N��z�~>�����N{'����uԃ�+�:L��ķR
iq!���Hnt]㈫�	)v�jI^$+����Oɞ��rɍ�?��K�6�>�B�Rh�y*��qz�ȍ%`�7@�����F�i��q�d@@�%��Àf�y��A�ԘMTՌS���V��/�������Ѡ���X
���ok��ǫ0�¨@/��j�=	���7��g���D����*v"�q�w�)�3�6���B R9�2�M�B�kvwwq���e3�l-�ed��݄�Ri�v;�b�v���a
{�eS ,Ƀ�b�$ަ
�P�����!���nrlf�xC#�F ���H^6��Б�m��'-�	>�^��=��Js��b��)���8�ٌ�=Pڛ�~G��d7��`��D9��’nz��K�z�T����T�A }�~ѭ��C	�P��G�"���(7����ޖ2�w1���Dyc�~�շ����^�i��f\�\M@	�f��6�#'��q��F�Ml͉<	uݡ�([WjM��R0��F8Rp�Qb��ְϑØ�;�m�i�3N�T��^Wm�,I�� %W���-`�fm�֯=��z%��HB
�Ҷa��qG�m0���VX��կ�L���b���1����I:O>K���!k�Xҫ�7�}c�����`�1�����tSQjBΥ�#5F~���MǑAx?�hG��2�
m���2�X=w�uT	k����H����2)��y�غ����
��l�y�Ae��I⦢�U��i���^�7�c1�_�;
��0[ԗ��vw��ݙ�h]���xw�}��;���b�>�Y�w�N�M�x������V�d��)�y�J�� �`���Ow|ig�q�Φ�O�WkM}�����%ob_��_���BI��>��5i+]�à)���a�EO3��f��`Q;�qQ޸�V�{>C��s(aO���X|��S���$�*
4��=�>�/�,�W�M�Pٮ���� J
��4ɮ�կz�gQ���Ifj�Z*
�ޏ�S4�ƻA�΁1W�ǥ�x�5`1�Ѓ�)mp2H��]|;I'ꅑc�~���e��a�@+���W���H�z�
�����'��S�����B#�}�E�G�S���_G��|0I]мI�t. ��O�Ac�Q�h+�^?�r��ʲ���1�_�jm�I+c�3�ݜ��V�oɶ����P�a�ֽ߼�J��Ҿ�M����ެ0���_ۅm
-���a�N�t�ݛ7%�%�U5�
3��71n��<)KV�B������K�1��#H�?zh=z��l2c�qTEk�c�o�?��}cv��#W����i5�GR���-
�fO)`tTby+Ef#p��j�{�Iє6�(�Jt��V�_��@=O�Q�g}����J=�*�|�i�p���G�k=Pn<a~7'�A�����Ã��Hu~{�U=������yBcs�=v�9?��b.�'���Ʌ�8Rߟ�>��}�q�W��x���}Ϣ��,
�]�㵋½���
*�"��a6͜�=g�^o�G�1ÕM���4���k|<,b�����.ig������ �2��zz>rjA�V/��$�y Պ��V�Qߡ�v�������x�̶��%.]�]��߸��Z�Ã�U�|��YV�6d�:L�!�RJ4@;L�ț�W��R"���s(0tGs�jQ�u@XY����Ks��Nv4LC�5��0�.4Qiz0�W��5X3��8���,DG�g�=�p��b��#����8�Mso2KfW��� ��C��I�)���2��&g$�xR5�T�M]4ʧ�J1)��3�V�~d@
7 ��	&�ΛY�b��"�L*Xi+U��rJ[�"�����p695?��	�C�z�c�TK�Gvj����f�oS�^*��*t`�]��ߝ�K1h�c*b�����`�N����{w�-�*9Q&wǸ}̨���j�Lc��}��ɻv���M�l
�#U�{*����^KP�$��u�`��\�Rx}��������o����<<��t��;=t�qM��{wr�)޽��?����w0���'�ǝ;`Ե�:2=P�����Iu׹p��.�8�p9w˓Ҫ��T��Tl��`h���02s#�����W*�����wf���duO�s��hpdbG�1�ۡd�F�[��,�[�ta�Z(r�u{��:[���K�旊�J~��mT)ڙ�|�I�l�Qo6��"�j�}Qb:g�7ݐ��7�uu٬_�(�j�Wէ\o
a�_h���o Ŭ<3{#G\�R�8`�0>S;����<�3�P�X2��[�^���y���Jk4��-Q"bpb�R!����>����"��M�,�$_8��;Je�O��d���_�T�.��yT�1���]I�S,�Q�;����(�܊,�v�LH%�������A�(o����h��$�e�[�Ѹ�ARw�n�C�>�̯������M��3SzF5�c��m��ɿDz���G�g�7Fn~�"��u�?�F|]ϣ�PKEePQa)|�"pip/_vendor/resolvelib/__init__.pym�?�0�~��IB\�7��fLS�L���U>�U�حサ�)��UJn�U���Z 6�J�N��I��Lؚ
(�s`���4C
���+ѱa�ﵫL�=|�xA��!�C����֔���Ӈ�DHs�T7�l
s�xh�qb�5HV�:[%B�;a-�������22�ʘ@?I}�arJd�t#Cf�9�/���*_��6���bq�;=�T,�PKEePQ0��W7�#pip/_vendor/resolvelib/providers.py�X�n�8}�Wy�S���Et�n^�Ŷ�>�5���E-I��DQ�[�-
C��s=sf���C��&��ݳ�ɯ\�/�xw����j�#)#�ѩ.�*O���Ӊڨl��!�w^�#
�y&���CM{��m���*P�_�UG-^��`u8��>S�t�}
���xَJ,y1i��&�z�A���k�ۋ��'����R;mu>��,�]jP��VG�L��z:2ɕN{H���^_U5��k�:�.��}cMTg���9*�'ժ"����O�Z����j�ߓ�J �5�m�\�g�-�}v���5��w~*ρ��$�
E�r���Z�ֶ&��E�O̼zT�Z�z��\��u�Ui�&��bR��
'm�:��G$ŶO�f��TMY���!�nDs��4V����������Ѻ�z*$[;x�w���>AÆ��{�A���ݫ���"5@�m9��ʵBrv�]K��RÔ�{��"[�\�j����dQ���s�H��`�	�!�!�ZpW��B	��lh�>NZ^�]aj���U�>�8
��
ʙ7)UY���8J#v�_4d�x�q���Vc�3��fM�J���k@�am�ݹXJ��F@�2�5������Ч2M_s��M���
\@b�9��w�?����IhD���i,Pȏ}�*�tg�m�w>�n�ѽS_P�G����tߪ2g�R3K��S�GU���u�¨�u�\6w���Ӷ�Q@���	��y��C�]������Y5��<��'_��գ:��L�C��^��m��0����h�U��s�F�dd_��z	q��Ӄp��&O��Im`+ıOζi��L<�J���.!�"��s��&�L��o߷Fx<1c8�N7fR,pI�)%sfNj���Fėv�.H�U�Ā3x��ۏ�	���A�)Qo�_�H!��i����G+xq�W�L�a��ږ��P��/�^��R_�x�V�T�t%��y�e�A���Ko��?;����
$޸��ȑ�b&�$-�b�n��o�Ǫ����pwe��L!\s'Y�7�gI��&����(���bR�G���F���=Xzq��b���z�љFf�C?��f�n��Ү5-��?
Gc˘Ut�⥘��!�B�=ie�y�a�R�a](|1u�4�G��~�il�&�[����e��߼���m�z�!&����Փ���"�E����*��R��EJ�{�N�d]�܃��k�\!�r����e?v��dM�VJ�g갴��fx�Η���I�b)�e�AZ'V�Q?�6�i����1mq�xc���o����pm|q�*�.�ls�nb9M�.-���vq�d���wC�H�U��)�ۭmm�n��+�g�w�^�z�4@d3J@�8B`|��
7�+�i�^�~:�b��R_��(�1�g�\�,�W�|	/��%��}�`[�jY�}�X���"��&k+zTǴ�cٝt�}�ۥ��?�t+PO�J���x[L^q��ɎC.���gs�HًKS�;�Եey$>Quq�KA_	zy�hЙa@���j�0�!���.B����?PKEePQ9B���}#pip/_vendor/resolvelib/reporters.py�T���0��W�8��8�=o���L�	�5vj;P����lI�n� �gޛy�e9F��Q���!IX�����{ \���X�sR}n��2ZB��A0������A�ޞ$l�0����b�>w�6#Ϙ�M�Fn8]2����2�mY�'���;�{�
���ߨ�Ձ�
�MIz�J_�TG&ҫ���zz�q�n/���]-s�������4o��5�	ad��[�����jBC��wtf���Rc[��k�.	��9���c�\�tX�	�Ag�ٙ Gqi$,"j9�.�� nD!&'��B��֤���b����|,�v�R4��v	��mk
��1�\�2#��X�-8Jjq�u�l �R+I#UU�_U�pČNK�ũˆ�?y'�o��|�G�y�f(ErD_1fC:j�?�^�\?V��NkV?R���>�h�;�__�oJ�.�P	����p2M��`��'�`����眿PKEePQ�&�D��:#pip/_vendor/resolvelib/resolvers.py�[[o��~ׯ�u�2vw
�h6I��hw�5�ÐF�Ț5E�Ҏ����3wr(�i��C"�3g�ܾs��<�M׳��*Q��b��#ˋ����ɀ
�fL�5������T��,TS=�Ό�/��w�>�h��oo����_E���Mw�[���5?���Jd�Ez�Ŋ�\t��}��?�.��XQq�����/�hq^�>-�4���wlǕ`z��xU1a�)�q�D�v'��bǦ*�/h�G?$�q��:4CUɝ`^���uD���ODn7�v���X�s��`��"}'8��q�8̸�-#�N0�}S�+�z�&�02(Şm6���f�)Q�W��d��!���]���b8o�;2���#r�=��~^�#2���D?tud `����t�k����	XE�{#�m�uKRo��7������r�Hy{�TâJ���]�4�*��I�D�\e*����������ǯJO�}��{be#���)�V�?�j(�����vB��~���
fjHj��m����8�@_�ǡÃ�<���w�ћMU��vB0���
�PWz�%�J�_[&�{=�!�m붰��Tn8�ȋ}�Il�G�UB����z�@�*���Y�`P�Ž�����`!w���*�"�}�<֨��}���Z�,����R0
d��ı[�O����r�`�t
�s����ɬI!wCm6	��E�٘�m񩷠\Dh�fql����x5�����q��9f�i�ݲ�� A��+��ꑟ�^wil1�Q��ʻ뵏G�A�,贠���[
"<A�>=�aD���� ��K�����n[��Fš)E��0P�X����Cd��B����A2�-����F����w!B)$�f`Ve��=H��OK��0�t沌����R-'���k����R�2���M�EG��@W6
\�L��{���$&=�<��ua��Oq����خ��e]n��� Tv����=E��Yhh��6�
h�{�|!8 ◊�f���`ѐ@��4�g)ߎɌ�u}s�J����M�3�\ΘH-��%��IN�
��è��.S��Q�R�'j<�%􎢻��Q��J��n��Ǒ�S��С_>k�9gi��F�r޶���+�e�:�Ҙ�b��ǻWj��x6��_(�q���d4�ُc�k,hU]o�ab�ZQȽ�l��L��i[Ho�@��lj��?
�z	iҁ?���=�J�Ԝ}j��mt,��k�^i[�)��
�����}D���T���U���'&��-�>v]���X�'&}:�D6Q:WT*N�L�>%��"i����P��6
���֍.�F����6�<^7�!ڗ3�5U��g�4d',���o`��_��7���w�L�zT���7eu�wuA�1<�#�K�˄D&)M�UX~�1a�)��Q�� ����~o��NW�aVy��,�'j�ӤW�Q�t�h�Z��_�NyW� ��*vE7N�7m�F�:T��7zE*!�5�,���On+4d�.��)�!՛�?z�1��'(�������;[	i�� :A±iu�>o���
LH���5�Mw
�4�G=J�Z���P]3M!���#�ڤ���K�Z��o��2nC���X�N�Kf �~��kmA���WTJ�����.����yѴ�h	zk���#Zˤ�XG�:�,s�zܸ@a!�l�i�?�%&QJ����!9�9xT��)����-���&^�0n��D����
W��j�l/-�3J6��|��?O�9r�u(�N�^C���i;�C�DWk�
T��ؤ�La:����Hב�r����	�� �<��x�S
:3a/��L�M1t(�
�ܘN/�c�5�9��2��+�ˇWU������!���_V��������o���� ])� ��O��Bu�!�
�x����W��$Du�{։�=ܘV��əܘ�}��Jdmf��&�ʛ�H��)d�.�X�H�Z&3z�����t��i�H,I�ظ!�Q�r:����޼a�R8S�U���@x������uޠ�#R��Lg��	�j+p���+��.'MU*MGӀ�ymI�9$� �{4�N�x��,&*P�Ah"j�93J.��4=��_XԨXbZ�'l�v���m߁b'�O�xZ����2��[qjZV����Hj���欢'���宆�T��y$Y�܎�x���b�4�J��lS݀��k�4�6=F�<��]��1#�)��m�f0�=7�#��s4�%zֽ��#i0�U���;��Q�?�TP��:\|�(�ˀ��U(�@�hW���	��z�"4u�����j!�:�����?�C��f�R����}@�_7k=�*�'f
�$�2�d�Ԃ��>�<�sC�J�2G�<�—xĤ�hA�N�o�!�z��!��	P�JϨV�+�2���{u��d^���F>�YЍo�ޥ&�����V$Q���[p2"�8��{��_`ƙ%�Q:7��œ�K띡��.:�=t%*V�%1<�ä�G��4G�5ϧퟦ�cT?O���ݛ.i*F=���H"A?[��aow��_�;��ToL$&�馬�.A�Ȯ;�KT�l3#��K��˵�bvz�>���0!�RnO��ҴޅL�ȿl��v-A|!�&�lm��W`��ɮT^F1c4����^�+�>���oI�E�M,�d�6(ӹ���@�A��@�$5�J��x}����>S��, 2r�g����Uc
C퓹����a"ڨl9����D.�&�6�#.�+�Kj&D�oǀF9�-M�� ���4��.t����&�/,A�6-��Ke�g�35�!��0�24��X�DBeX�4��z��G�^t��P��A+�l–hHbڎ9�/a�s���d�8�'�?4�"�g�e5tb��WMo�W�c9��R)P�I�h���/��j�-�dr֪��)%||��|MTtŎ�	^5��;���^�K�L͐8�I{̕'m�Sh�M�`�x{���b����~��q�4��/VhW+�H7�����
v����¾��v���y�r����0t�����yx��\�����n�7����K;��$mx�U3E������9��!zV��3�ƥ�$h��z������=���P�yxY`��Ϝ1�ډkU���C����ݓ��W�n�ɞ�Y�VJ\nm��^���/���&"X��]���4�6)�7	��ǜ�q�H��Y+�+H��q�$G�$:D��Ϻ�9�
܎x�gxqD�3�>�<�z>����ۊ@��LŌ����3�h4(�m�>4۳���W`�gL��aœ���_�����i��W"�w-�<����	u�讴�0@�cq�h
�\}O��������7����i��?�'��^L�cc��4[�|�!��\�Cfa����Aػ��5y�a.�9�o��O�H���15��M�o˷��vǝ��y|.��X����c%�HȔ���L�b<��dm?娧L������j�#\��{Ŷ�u��-�ё��S���j'���DfJm#(��`N������h�@u�-���T
�~�I�����!PD���+v�x8]�<!6������9n�3�s��z�e��"f�%�R���3+�AVֽUC�VاM=����.\��]@L=$����R�E�G���:�Q��uƘ��ѩ��8ۺ�p�ߑ��e�GTu�#?������9X�'�>�ʁIv�yI �X^Es܁�[D��D����z�����D?���e�
+܆1�9a+��B�C�⪻<-���,��>E��4�h+��BQC���ˢ_���uʡ�g)�҇n$�����"2~m}�vjj[��k�
��e�)r�	�R"�����Ɓ���3������g�k�֐ii{*�
U�A*,��.(����PKEePQU�P�!pip/_vendor/resolvelib/structs.py�UMo�0��W����^l�m�a��K�E�ZɐԤ��>J��lg5r�E�||d��Y_���!�nX]f��}�w+�g�^��?��s�
�E�x�h���*�p��K%�~�Y�D���ݟ�8Y��Ot�<1m.�po��
�>�z������KB�Xq��8=�f��A�Q�7fq��8�B�K�[��V�Ie�
PfS:���B���z���	f`KVU��@p��M#�c��]�
1k!�퓶�U&��.�B�9:���Cy�ߖX?�,M����B��P-�q�q>�/|ΉH���8M4�-���ۀ2a�"�f�3~3F�l�^�/�:�N��C�d}���H���@���N=O��KT<+��&*�>
\lhXR�"�HuR^����M�y����$�}�ŌTj]gq�sŊ�"��S�-Ԟf��f2P����禃-f�%H`��s�o��
�D���1�v��zן4�T��Fe�n}7��f��Ye���Pբ�(��&�xm$�EL-�:�8��
bD}��As�R��@QʊT�K'N�WH��s�X�Є$�.��z��D��TS+��o���<_�PKEePQ)pip/_vendor/resolvelib/compat/__init__.pyPKEePQaT��S0pip/_vendor/resolvelib/compat/collections_abc.py��O�ɉ�W�U�V
N-,M�KNU���*)���R����\�������b�Ĥd��܂����Ԋ�ԂO��kQQ~v�PKEePQ!���pip/_vendor/toml/__init__.py}��n� ��<�������C�u���#<	02�S�~4i���������6 �<�������z�5'L���6'h>�J�/t��A��#�
8�aH���R�_&�F՞0b��;�>g��Q�>�ΐh���Rh[x�QO�HѦ��EyV�2ӑ6��չ��t#&є9�YYxuA옩NM�D�	��{�޺	azyu.'-݈�ڻp�}��D�2����L\���*��l���r��]n��Q��U{����М׹w��Nne�PKEePQ���C��pip/_vendor/toml/common.py]�A
�0�ὧx�E\�=F�S$Ƒ$�d�hO_ݴ���y|-L��^���j8�q�
OuU�T����X"%�jZ<�8A�!�3&F�mՆ��}j��:$U�*JU��Ru��t��K�HyJ�$��G	�=;#��m�H~&}�|PKEePQa#��� (�pip/_vendor/toml/decoder.py�=ks۶��+XvwHՒ�vz��Խ�m�����v�t�약ʢb����b'����xR���.f�Hpppp^88���h��y[l󓂿�ɺ��Q�D�ɦ(�&��
���<4'\yW즋C^��z�V�ʹ}'[����ޝ�k�?=�uST�(�U�M�>�f'�E�����2��ѧQY��͢_]���&�z����VX�ik�%�O��Y���E�Z��-okxONNV�:Z��6�i����K�?�	�c@/�|}s���U��S�����)ʦ�ʛ<ݍe���:�>�:X���e�����\b[46�f��͛�6���K��
d����G�/�Q�j��f��Ð{�Akc��ē���\�ŏ/��u�S����?V�j_���I~�����l����˟���ɫ����9rT>���;��q:?�|}�����1���/��_�1�5F"�l��!)�!GƥN��6{�(F��ìE(=�s���[D����	գ9Z�b�6�f=����q��n�ŪF#�mY�(�7ƾl��L��׌N�sU���P]�!�P�z]�+����C�P9y�G�b7|�mI�n��%�uUo�6%�1�d���1��=u��ٔ����c���j>�Ѱ�NJ8���Q���9�4�{����M�E�~��ߢr�]�8z{*%�6��m�e�pS�P̓��e�)ڇ��X�-�ۅ^�ౄ�g�.ć�gI�C�W�m^�D��Z����a�C�ARSP��đ�A�
�N
j&�W{���%Ɉ���TA�PGq�d��P�֧	�*a���A�m�U��<z@�<�_��֍ۚH��=#��<lЈ
�j�݉�qA?/���D��Y%��;�5���}��o	���$�J�2�D*i�����h-n���X!���@��Q�S��K��.�6*�yac%��π��$ɱ���a5�������邿���%���M���Ye�
�R8L�b�LA	&�Y��z��O�U}�h#$���g�:�t����>����;��b���N	�M��ҵP���LW}�cU��9��ψJ0��h
�����lؒ!���NV-�Xܾ�_7n�Y�~4��ۜ��j���(���!��><G�
��O ]��.��$�L�PVys��H�N��EiEv�5�u����C�r�?��#�AҘ�QHh�>���m.� ��F(�_��`�v �X�;� ��4�뗬jw^=��dF�I�ۼ�P�EH��~���nj�
4_�/�ʈ�j"�!�@_Ju��b^Ь��D�u��M�ާ�����ނ?s���g�n���58��>_I.;Q^�pך����j�L�*_u=ǡ�Q]&�v=�*!U�ؑWp�뛔~�"g�#!��y0����ktl]�[�'D��vf��Y]z�~���95F_�>4�k5%
7)>]��q��$��aE�=�v�<��"_�Te�!8.�/�Wn�q��Z+�1�>uP�ѻA��<e���3��$2;4K,�����#s�P���*T�+%x
5�I'��&u��l4���k�ow�â͖�u�p�64=�n����ύ���XF�:��w�OIo4)�Z|,�Fi��PG�;�IFi~Hh�y`�
�F,hS �fu�b��cV]!a��E�x��]�r��5�&_)�4��j݀6B.��\�?���C��L�z[����[-��Z&�=�n��l�\����_��fB��y�
�
a6}ֱ�E�r%�%�S-�$��c�t[5�d���A���?�\uFb��7EK��k���4AUpT
�xyԯn�u
��|C����P�"��hޙ���Is�`�j����iS��@@n�L�C�����fSH���D��w4N^)7Z7m*��hb����3�]��:�R<� ��~�dBh���&��Z!�n�y��b��5j��~2��wv�.��$���0�`OZ�3AP�����8sX�5*�FW��`
tѯj�ћͼ��
;�W���ϸ�L��x�Ʋ(��[��x���~m���b������������u��-/�����+1����B0@� A��X1�rd�۱���6���zX��j���5��n
&��ͯ��-E��%TR�8���,^y��Qlw���GGȳ&���a���SՔ`�8���c������S:-p�AEy\�!��v�PP"`��e�ՅR,��F�m0N2BB��H������G��B���	�^�z�
D�$�mpF� &S8��w\6k\<�5АK҄���[x����e0K��0�x�勹إc\�P'������Q?i�h/=�m˭�p��lr~=��ؤ�3�z�{��V�IQtA��nZ�3KꞬ7ct:ЎeNA^�0����?��%<���ym�F~�
4ߺpB���8�	vyX؆�z(�^�w�m���n	��;s�x��\�#\d،��rXQV�GN}C�k�9�hKV_=x��d��$޵k�u��83{�	�qQ�CϽ���î]��c:rA���eF��s4�)wFtTp6�7�-��Rt�U�Jj��<V�h䃤��e�ǒ>`ɏ%}���&jl��Z�}B.X�Xm[��:kA*�s�5@�`��
*�
T��@eo㮑;d�º��J��І'"+B>��B ��p�X9$��v��M�K�o�{��
�5���]�ShGm��1,rZ�i��=���:QI)�A�c����:���1f/=�e�@�
�?%	&!8gh,�B���V��<���e���㊼ּ����� ����I�8�EI�Q���ơ������!ATxf�
�a�������j&�s�72*��c�B�wͤ�����Uk1�ޡˮ�ot��ꦠ�\��Xz]����it��֪vH�z�3��NԔ�:������M��Vc-�?���6;�F��[��[4�7�_�	��c���E��MU��QϚi�����OI�27m�g���o0���ȡ
��9�
�[Q��=�3�-��`�X���Q�z�eȷ�|%��&�^�=�щޝ�y����O�22')����R��k�3R��C��n-%�ۤ���cB:��9���f=̠Ʊ�pK3���d��RP���b���~dr	��<�O(�!�h�{�����-��Z:[6��;�)�qt�|$m��9o2ջtն��a�q�}V�_�a�84���?�Eй��.GԮ��O�R#�r7FI�[���	��&�sw,r������;��e��{(b`���G�"l5�	�Gu�z@��{� ����'0�hP�Y�MZ�@��oX#/�$�t%.Z��{�Y��g-7h�����̝!2�<�ɵ��|��C<?�X8��5���^0pAOU��:��&W��f]�6Z\����I$�Z��h���@ٺk*�pH���R��0	;�jIX���ӿ�r�I:	���{�efZ�����̯xz��p�J���c_�pG%3���49�e�9ɴ�o�س��x�>;ΗE\U��3v��3��hw ILT��3�$1S�ѶK��L"�O	P�N�V͞P�^�Vo�<������t�q���9�(��F]�J�z��-�C��U���J��@[���rgo����5����k����3
��c��n4r)�[<Q��@xJ����(�n�����d92{�����AYhՊf�O���0�tQ�L�|�J~�%@��2iE���pBq)"2C�,1�e����p�	�`8����zd��ߴ<6 ��Vگ{̺�:�V���˲��H��.�)��Cx�'�
��}̤�%&l0��}��#�Y��!1w�xa���^���Y���@Y���۬�+��uO�#Q�������i��F��)3}d�Ţ�K?*�xW�␩Rr+�dz���x�g�O�>5C�݇13�� >c������'�Q��r�գ�>]?M?��}�0;��Wв�5$�f���A�.8�����ϟ�_�Vx��m�"�T�#�+m-
�}��g�R�=r�����x��c�{�����f0dp$�QL��2�^����&�m�AYl���J
,@a�ӹg����G�n� ���y6ᨋ�D::������mqSW
�\�T`�}���9al�翿v�,8�Zf�{cPX�3{P�uJA�䟁p�_2r���Yp
ؾ�j�?]Q
�=z��i���3�NӞ�w��`LwO����6l�-Z80泮�p.���ۼk7�n2�sF>��=�>�Y���ORp�f���W�Rj�R�sh��t$F�gtfz~}�Y�~�
m1�F�N��ز���-<G�v�M��&dK������.�k0�����0��nlJ�ҝ��9��4����ٗמe������H��6m����G�~~>;�����F�/g����Ic���3gO�:��%q
t�77�.o��8����Ma�:_��^5w��W���C�����Mǃ��1v(�"��qH�{�Q��{d2���H�̜D�(�y{�n�:���{>��g�0�DŽt�ߚϜ=�����k�A��02x�N���,O\5���D�� f��ף)�ⵙ%��rrv~���|��W_g��ľ�����?��,�\�����&�Q� �=�E�*S���-&��w{,O���h��ju� /^��e�~�2_-Hz�G�_�<5��5�Yu9��YH�.����=c"
���)�����Oᱠ�)ڸ�M��%Ek����%5�i�O�\�6Ep�m�߬0�W�M����	n�y��^�+K����1��_�池h��j�v��H������9��̳�82���E�{A�F�q+j��Wx�����Gw癒��
2��f>X ��?�r�6��s5�]�Ld��FZ��~�0�7E��_�:�ڽ@�t�T}�ͷ�����Ӆ�Ψw��LZY��8Z��h�Y1r4|5��1^RD��j~@�4n��5G$�
r��M�����N��P_��\�Xw0	��ھ���º��yv�
�.̣����VDC� x?`6lqc�<�	h�k �Uy�\ۤtIh4~Ik�� =�o`TW����U��t�
8Af o����4�Շ5${@'6�T�h�	>��E\.I���]�h7�'�j���B%G��J�t�x���}�
��۰��Wy��`��^��KjU��*}��ձ�C'3ת��R�a…�1҅!�F.�ޝ�f
Q��_���-��mGJ�8�ܷ�O'*�g�Q�g�ْ�.!I��t@��[z�d����F����w�ANLF���<�Y��u<�u�>q['$��.��°&�^j��C,��^�EO#��;t�C"��'��{���^�o�i�vO�Vt��
"S��"�E�q��=�Fq8��3���Nk����@3�P˝ÃI�n ��l�R����O<��̮�nQ�n��� =���O,�����7;���?��5�@��6�8=+o��)�z��x�XĄ�{�D�=�w�A9��ي�b�M�'�Ut�gj�Ɔ��𲘳����@k��-,`Ct�5D�qU�@ʫ��tR�n)��ޗ��/�td��5>��P��?vs��E9�v�9�M7P��i�wYQ[Z�%-�ؼh�3����'
]�.2	U�Ȗx=ɏS�H�:(���T�8-W~ES����_�}w3y�
�=,6��i��s��G�ӓ�ٟ�����'��l=< K��>��wm��i��_�#^�χ��n��.�},	�a�~hu�:H���.tw9�]��t����I��F��j�"������ސʏ�����?�e�l��
���@���_�G��rey�11Ɛ�6{�6;d�e�ߡ�#�飒z��R�����ɬ����;�8w$�,&*tD���V��|'OTur't
蕼�"�+���w}7��hd���k��Ǔ���k�i	�Qԉ^𵇢�q�%2�H���K5S�5��Q�� +S@���n�U�u��J��P�Bz1B�|>�9�p�vlS4��*Gt��ʹMϙ��ϾTh:\>�j-^dr���S�bN ���]ā��nƖ��&��8����sM�{̃E�h7�h��?��	��y��S���{��
�I/�"�9A����:���3]Z����֭lb@��l���u�y��.��LV��� M�)kwQ4�>N�)�b�a$Av&��8`L�[iov�o��o?�ޟ(���3<�͹}�t��\�h�E5+b"&�fE��m���M&O�N�f�����8b�F�H� nC�v���3�dp_���bZ3��I����O��Kin8�Z?S�����w�Ć
:�p���;��G�6�e��-/��yg*��4�΄��ȁ�����-�\������vN��#����N�
累`겓T�*��h����HK����Լ��s��~t*8�V�{}��LV��ɽ��<�ۿBP�y�=q��u�=D�1�I��1nn���XX��9~��q2�ޫ5�c;�DY�x�B�17�\�Wq�
^mu��(�)�|��ck�H�d�����1=A]JQ�l���ﴔ,��8��Qc�J
\�+���q{PWo]%#��qAT��;�A�S�'�;��~����[��U�9���[����$��>�1̞��X>,��@=��f�a RS����>s�j`��e�\�p�2CXcU��l��ן-���u����O9�B�`D��U4C:��w�Z�"z�- "2�!��4�V���w���I�<�r!ٺ[��J�0@|~<�}���+����5��]�f��alyQ7���w{s�`����1�hK�,Yէ�Ua�yj��:�@)���V����͈"
����?0��a�*�_0F�#J�����ՠU��?�8h
���_��#{��G^�+��/����+�]^W���co~��/h��P��6��U"�њ������}o��v^WA-�����4��k����P,t.���G�P�^ˁrȒ{u;�W�w?'��/K�D��c�]�J���n�
i�q[4���׸�����1��Ox��$��vR�)���C��U$�E�F�A珷T�H������0b�Q�
�T2�IQ�iu�=*���� D�k�Y�6��j5I_���h���0�_UDg��P`��Q�Y�����LL_G�W�)^�[��	�k�7d��3-U/�*ܬEꝓ�[�w�;�Y�n�66��M؊܁�,�=�Ȟ~�Ljv����Ia�̌Ne]t�>vc��1}A��'Y��%��_�}�pU#I-�QeF*7��%��-����"[ԅ���m�֦�y�ޘ��� �BS�ʗ7DD�{�G�}����gr�PU�[���)��Ƨ��T�
I$�zL��E�߆�ar��UG�HM^��:����s!���ĝs�����+m��~��^X�m��|�I��5B�jfʊ��ໞHFv�"SQ���w�;��$w[��ln�V۱G��4P9%,��лk�F�ځXQ�n��ϩ��ҋ�[�ީ$:��'���˞��{!��i��?��YY�
�y������i��Me�+��P��`=,��\��+�LJ��&�C�$��N3�������RA֣w��]���;�*�$6�bm���%��A\-���<Y���њ��^���j�����8��"5uA��v�N��QKn��M�zy{�f��0�􅥥s���$ZJ��\D�-ɣX�������
�ɱ<�l<S$
�ްڷ��QÑ�#��R�U��ű{��݄7��Ϻ��W�PU�� ��	�/�/CF[,7�'�ȕ��θ{��ocT��{!Loͥ�d�^r�ٙ_���߂.����V�����ԫpB�����#��)�;�0�����-"I!��of���;����@t^j���F�,t�6y�-G���/+�e����]Бfp(��jX��Џ�܊n�m�:/�j�Dv�\����E'a዁��$�K�v#�3|�K\�Mx�z^�UxZ��<+x�kr�����v��g��C�׎�?�}�4Ā���*�w��c1��Ψ��Ǥ�ǹhN�M��$|:��[�Dƒ�/l�y����Yc��:�kd �7�����N_O����5��PKEePQ�v*g�
�&pip/_vendor/toml/encoder.py�ko�8�O��$���mQ���n(�/����}�bщ62�R��\�~3CJ"i9Ns��!��y�pT�])UͲ��u��\?��W�P��J�X�7�.-�Y�N?��f���z�E&UR�]��̸j�?�"�"�*�w����-RN�\U��\l%{;gѫq<1�4"G
lΪZ�F��oY���H��v̸ ���#��T^��46,�JXʶy�G�N]W?r�~���8�!�����vƾt0B�QyYK��n�⬾�Eu#�"cW䕊g��t�.�������K��T�m��F
д�Թ�&��E	��"�h����F	K�_iq�4-&	��J�"�eI[��K�[�.J�^)	��v�K�C}��h* �
��m��beZUF]�&
��f��ҳPȲg��
�])�m{|輑���he]a4��`�5�ae�Q��Xf��놑�j��!�rQz�����
M�}�+;.//Kp���۷o�S쨃�F�9��-'I��4���C�j���p��,H�O�Wu��6�����Ag�O�&��$>,m9��
z�e>^-�6��R��I��`�C"�A�Ʒx0�f����w$��zS��Y���i�a�@�cVq:� tRpݮc�Al�r6�I�X��5�%��ȳH�+ڸ��3��E5+�<k1�JLai �;�U��c� =�����g1uI9J�L�����j�����~��C
4x�T�X,:���|��5ߕ�ú�JŎ~pEv�H'=y�r��0?V]8�#ߐ?�E�r�Td�[k	LJfR��������_ Ɨb)�C$7�*8t_���Yg�3���]�N����q:�Q���K��$]��������EĮ3F,]l��嵊��C��7��n�*�|�B�G�z#�r(
)D=�E˙{�foڮ(l���o��_�	�R���[���9�8gaz$ә�x]�c#kN�����������6T��;pa���t5��k�xY��h�\���C�|���\�� FY�5b�D��
.�
�-��s@�L�Gݼ��ܨq�C+dF��Y@b�ۋ��˜}`�a�n�����Iu[�{�W���}��C���0X��<.���u��l#�t�A]
Zz��vS
�̙c�9$A�,����Eŏ�5���Y�9C��V����#3��i��0����-dZwgˠ�>	��m���g��~؋�8	\�8u��z#�ۊ�^�Sԝ��0B퓼�F(��������|�v�*a����m T�+�2��M���)Y�֐���X�&oV��nB�*���iT�P^��P����%��Ϙ��?r����Sptl��6!H0
}�[-"�?]�Fl*����Z�.w��=G����Y�م�����"�]e)�ϺP�X)�(vᡝ����.��̎Gw�ˏ@�x�p��>���������a|��&Շ�#\�r�P>���Jh� ����s�	���hz�E�5��7X�n���e�ub�=��Q�X�ǁ�1W�/u[�ys������^(~iC^#0B@��QlW��T�1�a5�i���2��O�8@V͕����M]���믯��6W	���I��k��FI5�Y��z��� ��6�� �Y݆�aL���A*93��=�[p��1'0��h�	��s콏��m��%Yt�F�R�E|,P>��P�ҡa����
�v���yˏ�6T�S�����A�ۦd��5=��Pꇲw�N-±"�V�k";ƶ�[S��O(	8H�C�_G9-В+K��� �^�#��x�*&Kv��?��6l��ؿ�Ą��`�!㚺���������<�xp
�ڮ��O�_i%�+���Цi���	��T��ဩ7kJ��ٙ[�f�C�cg~��#�P�2��&R��&�����O�������t3(�ad�i��餳�����ƀڎ�q�Y:���#7%�v�À�ң�>&��jEw�Y�P3�44_;�G���1v{��>8���jLw����NW:���n�
G4�!̤
��㰾���Q��$~��Izz�''�]v,}�XC�i�TSp�t�+�	��oN�z��ѻ,����T�?����Q0�ϒY_
�C�
�i�D��'��L��OTCkъ����x3�M�t�(�L_ceOJ�.���^�v)̮�Ǖ3�]h�n�b�c�X/
�R��y���L��ݛ]j����ٚ�m<���oZ����s�~�Ӻ��i�"
2n)�νB;�h{�)ڛ���I�
��BSGɏ�Lqґ[�+,����P�_y�������!�ߐ�À9(� �c���F���k�2��"��g��5��f�\��lY/�R��>����(�,^ԤP�X�Bז���I��0�E��D8p�]����/���d�U=���J
���S!��x�Z��au9�a�݄41���
�X��j�t+b�����I�lf^7$�o�E9p�l�O?L��(ʄn�oV�0C'1^��R�7��#F&�.�:p
E�E(Z*�w_�4|W�_�# ^2��o�n�ų��#��A2�)�=Ra\)�X6;4�}�J���'�fi}S�W�lE襆���^��tz�ԛ(�oѫ1{�o�o-�w���F��}yi��_�Q١A��_��_{��{ͱS�-K!@�/PKEePQ�W�Օzpip/_vendor/toml/ordered.py���
!�w�"����:w��FԈ�>s�]q(tj�����p�!�i�S3��b��]�iʭL�Y㋒��p�w�ɰ��6P)�v�����J��%�>��8U
N�W}f1��F�KO�!���!��=�4$��oPKEePQ��jpip/_vendor/toml/tz.py���j�0��~
�Kӵ;r�+d��bB#o���� O?�
���NG���_��w����A���y�Un��aO-c�Է!@�Lߌ�E����P���j��ثF�tJ�I�J����;_�S%�Q��g�	Q	�g����E�Z�C����qL�6��y
�+��
>DZ[*nزz:nW��v �y�^"2�H�m
N!vyvi��[��aw�{1��Һ3%�a���|\����~}uLf���,�Ŗ�PKEePQ}o��2{
pip/_vendor/urllib3/__init__.py�V[o�6~ׯ8P�*۰����$@��=
�tds�H�����!)Zr�X���wn���y�|�\�z��5W����k˕�^)���l@�3$�YN��VTU��XU��^ilc�p�(g�zϴ�P�ŸrJ�3��z��`Y�etO��Sx��*�#!',�Zc�=�hh��^{p��j�ꜰ�g�V��]�,�}a�l�:���Q���V_���{i*&Bh4=��>����Y.��é��=c��u�6s7N.[�Վ���-�P��:��y�����,{Oh����$@���/|GԹU�^o Te��l��R˴�18�LH���	q㳬���;��77���F�+*H������ٱoj_J�ENq��HӋ��k�{�9y*��?���!�A�Ȁ~�Sv����t�4[�A5[�!m6�€�0n#��i*ci���s���0;�n�F`�ƞ�o99$�$yί�;�/i�,7XR��P䢪$�h�EI
��\�6�((,#.�I��/(n�������:&�s�ߡ��4|q�~��	��,ݧ�nb��!D�>l������Y� �"��&�$
��#<��Q!��rG����)7�!KB!SUq�mU���-4����CJkZ�F�K�-�sK�i����%XEzV?�b=�?b�l"8��&ϣy-��J��O��֯e�4�ł��_��EܛO����
�Ŭ�9�4GfJ���D�#S��"�m��H�sw(�_�����a��9��,�@&��%QR_ �"�0�ǁZ7�sƾ��f}O+����3�]j�LtU�Q[����3;�D#/-�_CX�\�.�����n���٨)�:�*�"�$�kꃛ.�
�Z�F��+��v�;N�L��``�@�-l�t���p�
�`���Eh��Y��]��߬��§u��Ϸ�>�ا��\�J�'��7ҏ�����{��T'����Mu4���ь7h�H����%{�gĞV����̧sz���/i�8�����?�}�9��/Ģf�J73(�T� ߿�1�`�Z���y���CG�b��_PKEePQĸ;;�(*#pip/_vendor/urllib3/_collections.py�Zko�6��_A8Xnma�Φ����E�
Z�6��)?���璔DJ���?$�E^�=�қ�ز�jS���۲�4�kUd�+���LWNj3�׆6$E��D�"W1_'ͮ�xY�v�~�5_g�}>�D���3���������	}W	��fۇ��~�0�����MQm�����\8���uf�'W�ҳ�+hJ�ZT�U�D��u�Ub�Y�Aj�z��JKa��xV㭮x"�<��v���~�RQ��[�h�&���k��8C��CDQ�U%N�B�J�u"݋���w�/���+��Z�,�c,���H ~v�U���5���&s6��ӧ���grM�~������<��+��1"Qhi���db�����L���P|#X����Џ��w2�c[|�/�K�C��f�J�)nn	KK3A�=9��#>	�	��rl.j�i7�ű��>�ؚ����2�ugʟ�An�-����f)3��-�+�ېR*UY(��̓��w;Q�M���d�-���T6]\x
��;on|�������&i��%ސ+:5�%Lx+�[��ļimw�)��dz�e�S����y ���"����x�V��{>�	`���G�s���������Xg��ܶ�� ���)<������@@�	h)D��R��df�Z�)9�yKVC����-���w+aR0_�Ŋˢ���`mo�\c/������/�J;g�k:����\�&�$	2r��\gGK�j� �&}Yz���N���#����"ë��I*1��z�۰=�4�j�"".�pNK��N�;�d�V�9�UX�U��*ƚm̮ŭ�s���)�
��QO�{�M�nz��Z�|�������-ϔ�u������p�*rJ^hk����D��-ىx;�\'d�qrR��8r
{!�)]̍�1Ȟ�X��R	�
�c��H
Љ�3&ﰛ�S�j��(՛�7uN���]���Ɠ���K���D�s����B`2UE�5���c)��o�ؐ*K���:`2P���-�_dq�D�A2wl��q� ��W|���
��s�PRܙ�0oLگh#%��Y����\V*G֢Xv,�m�i	���YηBu�U�b����lE̕�rg��W�>7i*�]y6��4���[3���2��`o�@5=XH&U��(���՜r�v�0�n�BJl'�!^�q&y�c[C���K���W�c�E`�@Xr�
Җ`K������'�V�T�
���Ĺ��j5$WG}0!���ʤ��n�a�sͳ��\�9�t�[�N��R��-��([Z>ut���3K�[4+��tB�ˤgD<�y���Z8���(J'-�q�{N���1I�!�
�g�c�Uu+CP:�q���Ĩ�OL�D,Ç�7�b+,,^[RY��c���M�!k��s�_B�FӏB/.��^��M7E�\�j��bXy�������p�����,,P_n�ݔ0���p���>5��ӆ�9k�w]:�?:�v���#��Q0pξ��&��%z�Pus�/gqK���t�u!�:���0�=d��3rX���-���8{����"$�����z`�8@��p���������As``�=�>#?�j�\wx��S��&�����z�Ҁ!�8�*�Ջ��/�x�d��
�)Ǎ��RT��OO|n)�*�G�%/�ά�7���I6��+�u�<�(��F����A(Kzd�sئ[`��*�:E���-3S����	ክ�nE�fl����O�04�@�j��u�%%X#Y�8��<�����J��N��A)!���'����,���+�h�]ӱN��f�j��/9��� ��
��"?���r���y��@(�s��+긼T��8���Q�G��[۠]���[�f�9���07���8N!�O�* ��mc�w��o2��@E#��ҠF|�nr�E{�~G�T���q��ϫ�\�È������R�Ɵ�
�PjZ�fTVrG�Ȫ#P����	R�5-�x�A5X�-������^��$��w4y�M@�"떵����w�fLҍ|�|�QϠ�:��\�Yن��hu,�9ݑ����5��7�!7D���*M��lj�����i�����4:4ˎ(暙����B(8���X�u��#�:���Ʀ���IJ�n�a��z�3���㫮%N;�L�8
�`e�<��g�M���Q�q����v�`�|�=���N�Jx<�5G�CC6�/�l��.w@?�/9g�Z6�-Gk�t���b,K�fd��!`�>���Q���S�-�ި��2Ϗ�8S�nMao?l�M�K�
�)3���+�mw�>�M�I�^?ߎ+�m;Wl��n���ݠ��^�=�b�X� ���ʐrZ�1��1�l�n�� �6���pΫ��J����}6�����(D�ݧ�"���KO�FJC�u�s0X�z�w��ŕ^��6�x�q��p�;�=����"�
{>����P�Q����_�vX�$��9�8��)�E������y>�rEՀ�Qhє���pG�V�v��vWީg[�%"��)'�H�~p�U��9ޙ�1�-�W�E�q�U{E��5�9�OȆ��f"��Z�K<e�i]frmV�\]�t�k���"h|�����'�y��j��>��+Q���][�LE��lž��k٠j��jn�a/���b��:�+l+o�q��-d��v4��#)�}[����N��;s�Z��ך���C�dH�'�8���D»�.��N�"aK<�=�e��;�K��vZ,�m
9��;s=L��ȓ�6-N
���,œ �=��=�b�@564[��C�z��dq!)m�	�0�Z}��_"o+�����iԄ�Nw����7w7[�Q�-1r��KKQ�(�o�l|,a�pX���
2o�5����ði-���7�FD�zJN��6y��8%���;֣%6�Hs��Ot����J,�/�*����]x;�<B�S{�|�Fi{a�븣ˤfc�V�M����2�E��ڔM�%��']lv	��:�"���-\�ы !�dI�Ҋ@r�0#��͝Fiw�M�������콇=�B�_~�H]O*TRɵ��ΐ"��rAwS��e�7g.��&��]�c���j�A�F��
r!��v��U�-���%�7��k�ORǣmK�jm�4��]����5��Ɛ��LQ�$�F	�ߎ����a�e�/^\�.���/z{�fpL�u�T�2�
٠W�R�/T6,D��&p�!����ͩ�F{���ʥ�k��PKEePQt�!�'}8!pip/_vendor/urllib3/connection.py�;�w㶑��@���T"3�u��zzW��&~q쭭d_o��)�XS�+�m���� �r6����[S 03��@k)v,��uUKE,ەBV,^)������>�qūl�|��f��U(��Drϫ���g��K)$����~�2*�_�o�)
1,��>�pe����&��p'>�Ӷ��(�3^4D|�\�;E��*b���_
m�𒀱'�?�3�����Q%3;�2�y�Y�e����=b�P����!V^[��C�u�	.h���iU�lB���.�����U�$[gɌ]	�
��D�5�$���0����dF��S�̑���C��]����A~�(�lϟI��4��j�)V	��Y��r��U,���<������X^\4����Xgi�Ⱦ�Թ���W@���k�RkT�yq[��
/N�
�|�uؼ:���pI3<�)�ʣ]\%�h+T����Sv�e�r��؝�U�#����Q�"�RSo|�R�.�`�\�\�2+*=�H�Z�y�z%����y�@�2.#m��=�*KPҚ�y`�\)�¾�q��y�T���	�}�
�.�� ��Q�p]�:D*�r`ܜ�}��;��7ϧ��|y���ϣ��~�RG�I��.��i���5GW����[�6uK��q�pd��+�l^""`g9�;�P���o���U``���$��D������lq���O�؇��!>/���z�^�?�stv}�<�����������ӛ��I&�r��/'�y�oO���_������'_�';=���c��6��z�;��fc5������
Ɓ/�Cj���V�!���Ƙ�F�{ݠㅧ����)+G!��wސ�R|�R%��I���J�I�PV`fVRu�|��l�,�\�0�=�9(IY���
�^N��!�8g���2E���|XҬ
��:�����V�B$�t�N�?܃�I^�|62.���v���f�k�IER�@qb����gw�D�U)D�a�;�s�Z&<'�Ai<��o�y�@o=��nȂCG	�Z-8��G�V]����0dk�1fO�8�h|x��q�W��o�2r)ww�>C33�R��,�Z^+�f*^��68��MΟ�|#$��˳w������O(�`�E����n`ŷ�S�*�pG
�E���<z�fQC�����*爆}�y�N��x��",A6��2aڀE0�l����f�!~>�3�K��[���������w��5C�w�Ż�ˋ虦��-�R� �+�j�so3lu �QОw%�i� ��pNA�>��M��M���(�̙>�p`�y2c�q_Ā݀
�d@h������:�4p���yu�;g�
XC1�,����Q2��hZ�0I��$m��7����K���q�x�5(
�"���;_O���(����ə2c�����˙'�}X�2k5�R�9i���'
��s2a31��K��B��ދ�yƖ䡨�,6� EY�w���8�f�
�]��,�w5Ү�ۑk���������N8�^�{ �II��i�#8G��
� �0�2[A�Jr�s�̀QRg,V*T�*�"%jTKg�f���qg���8�b��j xVQ<���%`.2������p�S�ZkS�y�0F�j[+�	R��R-͖��0��o���i�kB����Z����
H̚ɛ�a��"�i��_����4����[��k곙*G�O`�ࣀW9�9���I|����̅��K�GK��-�D������%���%�t���;�@�x,�]Q	�Ɍi�Ă��Q��0�H�0q�Q����"��l�8PB�&K�p`]0�@��4���� 9D���r��#��0'P��p�T���G'R(e�
]o$�Q�D�.�TT5	-T򪖅�QZ(*�B��<Kh}��iX�9���˗#N�V;����;f}����R��b�I-���L"�T�w6U~#9
@
Wj�ڐ�2R��C���!�;�#c�n
���3Ug�0�|��G&68��z�[����cO\���
�r��%�HNj�%8�A�0�T�D�{�[v#�@X�#�]��#?b;��z4�
Gǡ{!́Л��� `��	�NhG�����	��&��t1,Zb=(Nx5=$�������@�OYYot씥`�Ouk��|[`vj���j2�xj6��������v��W>��~S�����.�='c]�q{�iƝ�
�Kɡ��)Ni�c��r�qR�o������%[0{��&�&0xâ�Rs�W�!�Doep��i6{����-�ϯg�m���d��D��|��D/
�t`�Ϳ�}t����X��XoH�
�>��� G�z�2ـ�z:c����N|�"Ѵ�˺21̰Og�S
^��O����T
�嶈ՙ����	T�p�:�4�+ZZ;��?b,8����uF��2[�������dK����=�,XS�!*��U�а%[�M���2�L~�V�e���w+'�(J�uy���Hs�)�R�U�;��J�4�����Vt���@G�@-p�aΣ��	��|��x��T��>R����*��
�᷉�t�yԶ�{bJ^�����geS�-jȘ��:�Cc���Z�c��k΢hՊ��'�!Z�C����yjඛ��N�crA��0�D\g�Փo�g`c��Zs鰨�*�"x�xi�/�r�F�Gd`/u!Mr��A	�(����C�QW�m�G�З,X�6����3��!v��2�B����9��}�(���W��
�����������,�6@)A#r�oHB���oƓނ�0�o�C�4��������!D��:�	��#h����.hh�hܟ�IN�ץ�+�c(@���| w��/6�QD�!����g�:��6�������Ξ��`LGwCcQ��Ḋ�q����y'�^o�cJ��R��|������ �yg8ш{�8��x��y����A�L��i���N/�����.�����Kpœ\v�S��v�b��/���x�N��Ȓ��]�i.@̝���5�g9��E��Ohx��l��0,;
����-_�E��k�(��F\û���I<�2��m���w�"�:|nr*���m�Q�@#ck�'h���-|�](��ɫ��m?��HDN1���Us(��r������Ǝ?_���w����ʾCE?q�
�
�Ց�o�U�i����T7sV(�<��ܪ{�흃���p��	6�[�g�z����gyn�Pg��%�����fqn��s%�ڥ؈>3:���1kEî�����4�H��UKi֡��l4�ǂ�f&�r4M�ve��b }}T�G�9��s*.���w:�
s;#����������
��2��!(�+��d�	�����c�t�v��b�� �G+��/��]�{���\��/��h���(�%t�Ck��@��L���m��m�s��W�eZ�� 8����Z{L�Ū>=0��NTP[�z�OvW��4�e6��w��qb���K��D��ީ�T��N$���i|&쿘s��%�Y�Sa/���0�?��6����*�!Y�	^��$�Ϟ��@�����*TLG��ӵG}�U�WMB��W���I��<piЃ��{������%�rI��&y��m�V�di��l^6��^���82��}������s�ot��Rg>p�1h@��Ʒ�[?���xO�ɥ;{�NqC�`�tž��<��Įo��
F��g��6�'�>��y���7���H�^�@�]��o���_z���t!č��[���F�Ϙ���;k@uzs����c廬qk"��ht��	��&�Q&Pu�����9F_I ���K�)����da=8m-�K�:mq�Ikp�
]����COpӎ%�Uu�{g�S�{׋IX���~����~���ĉW�J�%�����%�����=o|$��4�'���e���/�S]su}��
�K�ZMwY&BBE�x�[=�b���{��y�-�����=<�����f��90�`����gyykN�S�O��q��n
�[�Em�f`O��K
�A��`���GC�%O�=sO�=�…	��>�w��Lz�����gx?c�?�M +A��W��|�wS��������1���G��q��o�. /֙��-�_�+�Z��+u���0w%!b��gP�G�����Akoޞ��o^�1���̾�j	J��;�_�k�f��Q_���?Âԧ`'Y����&XV���1~B?~�����t#@e��P�������e/2w���x��p��d���Q�wpS$�
�Z��;����ݟ�t.1�b��9�J�i������<�E�B�`�D
��~pv��}j�s�3�B�Cr}
���1����o�Wj�!���X?��
T�2Nw�M�6����7�Ӽ#"@��.��5{;����c�gno^�?��쌌�PKEePQ��@a&��%pip/_vendor/urllib3/connectionpool.py�=io�ȕ�+�2�ze��$3kDt�=3F��>2XL-�$���H�� ��uW����!B�-��WU�^��W]��������ϳj�k�>+�d[����#uYt]��u�^W�Z��{���]w���
��vy-���h����{�|�?�Y_mE;��`���#1��b�Wm#5��Q��u+E��mk�K�vm�.�K�]��}/�Rto�N�����o�f-J���vY��\ԃp��*>�}�����~��9W߿��_6R,a�މ�
B�?0���kq��m���g&
U�by]��̥��ۢ_n��QSl���s�ժ�	�L�'u3Y}�`V��m{c���Z-͐�E¯�\.7b+x/��vo�0����Ե���?��/��M�x��/�����[c�c��*D���-�i#w@uu�����s�:1�J���yٵ��(�G����竪�]++|�o돣�q�!���(���{Wo?u_o>����*�axHH�Q�Q̡����̛��u�wA�q�WT3�,�R���vI�k�)��j�7��ѧwe6��|���\W,*�/����9�|>9:���b�{h�^��e��3d�<Zր�̒����9
}4�ʸ�
\]g
��99����sj|��}2�Yє~��A�����9��<�^3\�v'��$+[���-�3�NtK����}|w)5��Mc�d6H��Vپ:���Ft�9��Î�ɇ[j`��`��03��x�6���*?�%\s�b2�j�~>KQ���q��|�xq��^�OWT�b1�^��<�;�$���&G�Y�0������<�ˌ��|�"a���no�<�v��M˝��;5qg������F$�b��S�x�MFكl��w��.���Lm��/XDq�7���	�9v��n�Z]�r�P�K���܏�A!�o���o��S^���ìzUUԙUѓvd�C0�si�`ڴ�SE��]I���dqU�`6���I0;ذ�D>l`����MF�l����:��A�4yۭϖ����WEqU|�䱸Z>:{Y]�����'�}r4���0�9)b�3�A��g�=�|=�ԯ�||��/�<��?a4̔b.3�N����˩,V"dl��`�1%3��A"�`ۡ*�|��'z��aZ�X��<�D�M��Ux�j�ր���ZWW]��@���x���3�@&����r�ސ�~dFc����F۷Z:�y^�`$��}_�|Y5D�W�yT�<�N�����-4!�k���`�UI�:{�?B>�8�>�sp��H���MS�۶��o��D�ٓ��M]/A�Vk�Իn��G��G,x6
��P!�*,Y؊ETSV7U9��U��(�Y����1���T�9P�$�Z��$"�B��65�PЃ��j�%ԕ�!^@�S�`�>�P��+ԘA�f[@����9]Ò7����Z3T��y�l��āAC �a��X6�t�	���c�D�����#�k6�Zl�O�]���
:�ɺLV7� ��o"_��,�^�4�F�=������-�aUO���@B&z���{�>+�D��S�hn+`�0�%���,%`k�7P!��8�ג���F�أ�{���XL���x>t�iiD<��Ba�q���;��7�~�@�i�	�!�\�U��hʋ������c
F
����D-
Z-�
���
t@�Z�#H��Xq9�Ewp����٦�4of��_)Ž7EPY���v��A�[�-Q��Y:ґ-|���e=�Lna�$��|hj°�u!����0�e��{�W��*��J�NaU���P�g|�GՃ,��;�GV#\�:���oFWAi~	Jڦ�R0�PYu��z?%>SBUNDL]ox�nꟜ���n1J�fa�tI�n�S���w��v�?c���Ç�z~}댰,�bQ`�/3
���1����PN���\[�p����e5�>Ǧ�?�?b��6���G��m�oMo���n��XI�1����L	���ŷ�>��0�p��������ܳ�q�����s�͂�L�ɋ�4Ct�Q�+��19q6��GOp����HD}�w�QZIMc�٩��L|cU�#3}?G�bNj�~v�W8D��H	l_us�L�c0|۩��߶@Է�q2
f�]�cE��K�mY�`����J'���7m�P���O�8�E%
N�)
�L����-�tj�'��zG�"�T��Q+�##g����e��|7�dRL�|��9;�x#�@d8�9��@�l7t;0Pe�O��sW|βGq#w��js�
�M\��gu�]4d
�.ֵ8A�r�v �4|ha�\��i�Ao1hI��XoA�����?�E�{�io��ܚ�ڬ(Q���TZ6������N��5����B�4Z 5�49�x�=�U�i��O�W�����<
ʅQ2&��R�&�?g�cӢn�9��؛�,Ȏ���6�������<S�t�h�K
s��T��9pZG��x�=��tD"�����R�eZZ �5c�����a���]�p���)76p�}�.LP+�H�+��q�٫?T��*≼Q�5�o���a~����~edg�f�dT-$��*�_��x���1��s�l��{e�?�-*T	W-+�H���qL����`�bYo_����_��A�
�F�>�ļ�n[؅�j�C�H���K���Q���c%�%�XT�g=�!X��>G~e����'h�T�7z��"���V��d<�Ҝ?0u�n}���V��N�����k�
���ی�A�mEGT\��fC�������7�u=��O0�:A��!i$yW._���-R	r
Q��4���^��^��)+�n��A��Ф�ѿ1^
���G�֋���j������O"����jH@��
�R};�@{<�f�%ī~�
X��>A�2��г�e���}��~��kж;Jv�Q6nB�0�%�`���Q��'���$j�n�G�ő#�]y��׃Usy�����U�t�>b9�&6�q�%g��ˡ�9�
�S�_ÕC������gf��ɚ�Zd-|!�rӢFo���%�st�3%Y��%]�{4�<������{�&7P��j<�I'�8Rn ���}Z'��T�-��q&&�
��U}�Z���S�"<ԤoD�f[�XB�)�"��C~ȇ@��DE1Ĵ��4F[]�p�
��}_4 �@�1/��39D���$�������9,��#B��Nl�)/#��<dı�6<��u�����R	h������aSނ):�
���PR���$�Q���mzTǰ�LJ���%�X���G6�t_y���}/�M�
&05�d�;����5ʑ��Ĉ|:�l��h{�;:��DQC`fc�F
��G�@U�l������b��i$D�|�s��v6�UUW�~�3�LW)��K��^Z5RƂu]7�0G�)z�K��*o�@�{��G�����	k�3�0>�xh^_�6̂��H�Me��ite�h�Ɲ��Z�I)ބ=p3y/8�_\��r�W��8��&�K�D1�)�8�1Ž8OdIH\b�*.(F�M��z�DB��9P�H#��(�?b������](}N�޵RVhe��$#����/�C��u������8k�u�.�F���lYC��E�r٠J�Z�����x���WO\�FU敘�;��8��;�`:�&���x�	�~SD��I�U��_�z���B��Aƺ˖��>#�i>����\�Ry��Z��&\,:�[GP���\����ϔ
��Ҵ����N�����=f���z�tmܙ����g�(��r(��R
/�ր麺Z\/@�G�P�Q,�\�(��,��t�d�4���%.�*�Mb�A��p������i�nE�@���i.FD&�%�F��}��P=�=�=�%X,JH��N%�p��eUv�i�!�8I����'O�^�9k����?a.#�UR^���M��&���#焫<P8����Y�p�\�Nb��"��j~4��i<����;
;04��w��l4dy�d�lsyC1�3|K�y[�X��M�{L2���-�9��3U�%��pn�`r���(�iBwo�==��f]��L9C�H	a���e���.p3d�T=�L�#�<֠�&F�a։)'��w`%8���Ei�AZ�]�����@{"-P�+�K����=� 9�x�Q9䖘
����Ǭh�h��`�-�`� �7��ST� )�<���ZC
��'k�C�/�'���ᆰ
~�X]��.�y.��O;��ρ�RYNUe.1խM�Oߘ���e󺡜�"������c6�RT7B-��� ���.����j�.��rҰZ���S�0rW2z�25#��7C�O�'U��������Vr>�U��UcAywa�^$&�ޑAN�7��a��rZ�+x���Ɯ����U����Zd�5���~��S�n+�deu�^�GX�5琡�Z�4,�ai��ņ�D���%z)-��u7��"�DOZ��`D�$��;��\ߚ��hηe�� �F����Á���	�$�̱�"�#�s���5mލ;B�e�
x�L]Uj��w����F�h�&��vf��l���uLm�K�߈�6;f�o�G�T;W����8Ga�mQլ�S&��#}�b�s�������!�6��E.U�j�G��'Q�)ěc�{��h��&�������i�O�P���:�}��I2r)���^(��r�y����4j�r΁�(�/�Q���A�p�Ҋ��.�`"̣�{"\h~?����
�E���\�f�C��׈=v�,������N�7�]��֤g;;n�������/<��Үy
(�V��o�1�W%{��0D�jU8�՞��I-�|q
���XB0�K�C��
�1Eޫ�O�9�(�I*7ylf2�*����?)�n��W�}P�D�a�m�5QjX�(j���ewAHv���c�S���cT��B�E����
%�'-��2L����Np�z�˕4.�9L=g�V����.��@�-����
�ã�g-L>�
�Ϭ�KL�hA{j��ƾ\�=���ō��4�[����K��`�cJ�����ߣH�HDè�
�A��d��K��8gh�m*��15u�9_]�y?�,�&�
����$A����W{[��g/L!�ΣPSK�ȹ@�*/�߁����[�l�҈`�{O����gt��F��/�]o����<�ּ����E+[�ً=�����o�_�O+z ����>�p�I��Xc��������G�O��|�E�(���I4�6�t��>.t"�����]��:�BX���=je�^�i���Ȉ�ihචI��[�RO��O���{�A�\�"'8}��(��و;�v+��4�k��j);]?�C`@�:��K���h�q<�l
?�U�k��)*�e�?�ڝ�RD��ޢ�����bY8^�#�Q�Z,M��P�9�����r��{��C��=x#�q,�d�T����&e�*?3I:���9pvƐ4:�d&�XN���"�8
D,�lZU&gz֡[�=�����Y�%�U�^��s��Q�������n�1!+��y�����x#�h���A_��2�ps˺�t2X*�1a���=�u�:�֧���<���bz��'lW�5���A2{����{���飧x�+���I�]`�����BW�!�2�����G����m<�PO�&�3��%��N��
���:�|���B�L]t�2@�^�G8�"[�8���q��D5=�۞%#q���
�j��8�/7ƺa}�Ȕ6zW�Bz�����@׶ػu�c����xo<W��$l�Y��>��d&i����q,�q�|�C	�8����س�뢁0�K�B�p�Um-�6JI@���Vm���U٢9+2i��Vq*��(�@�����LF�L�B�k/H���,�I\���E%�
^
</�5�R�'Ykh}zP"Ց����ީ@'���P�\�]�H=����ѦL�e�b��'@m�OYN9_�xGk�8턷&�]z���'�N���'��~J�
�W�R����E��@�N=��]��U�JHg/�#���R4Ҕ�ه�gsʾbܝ[̭�9�!�"��X��<ߪ��X��\�OQ�S�uа����p����0q�%Q�e%.��ܶ<���>��XM.:|/7���]�j�������b1�C
�l�����g[ʴ�y
J�t�9?T����oZ�O�Xm�,{a��]��J)�r�p���*�i�@�)�R����y3��8�f�����i1��M9
6�HmJ/����(�ݮCƸ�h����w�Ҩ����	����[_���%�095Q�升H���,8i�^^W4a��<A=btl��Gs�+�%	�H���b��Ƒ�3���"�c��iR��.Q��(3y@ʙ��:<+S�+y�n��"ُT-0�&�ԫ<Π0�O
j�=�W6];��)�)&Cc*��t=�hn���E��Nn�,I�Е;S�*JL�52KM��σ�r�Y/5�2�dǒ��ȘM)����~�8���O���[�l�{�>$]�
W��ݞ)�e�\yp��ܝ�.v��ٻ��J)�.�h�#�t6p�::e
�3
��v�r�5��CLl�x��a�6mS����*c���cʱ�� �j�C+a��{�$���^f���F8��q��9"� �A�����I3y5Ϻb�2\��G"����D�����FTs=fWPQa��R�?6	Rdܩ]��F���v;��������x��(��A�J����G�VqB2�X�hP
��{tH!�9"����`��}��9�{L�i�Ҕ�sY-r��Y�@M&��{g�i��J�����1ޜ�&w��Y%|�X��/ͫ%d:�϶�]�6\�mr=��	��>�5�L�^�51'dgD�N���1��^�(�,�;���=�B-N�
��:9\״2^�g����Ȉ��Y�ތ���l�D'�	��q��Fp#j�n�>(*��s��s'�`&�R�n�>�6�q.��k_d̳uƑ6�L�v>hǴ
��d(�gx�8���UVS��wOU����z����+�������a�W9``l�L
"�0e��Hz����G:A��~����h���fE�'�qj��q'Tin;�4��'����YA1�&�;dV��yv�g��:��
��A�՟�����[�k�U���E]Y��M|.��2g)/��	��<�A�-�e��CFR�M���n�?����}_��F�����wZ�jx�����x���!�Q����&?m��3Q�~���z�@.��Sk3��*s�����p��I,�p��'�a�o���!~+���,�{�/L�������΅��9H�/�G[�f��W�����L6:	-�	��4fG^���0avnyP&4(Ǩ!����\'�'?>��=Ew.kа�S�n[�k�GPN�dJ��X�wX���!��Z�L���qV��e�]����E��U��D�բ��~&��	��E�-X�%�O���yBsu0e��y��*��55Ex�:�N�=��lbV	x`���@z��5[�9$�VIU�˕�tZʡ�]�b��j���Ʉ�H��9h��I"��I�u�:6���¥S���e�|�k\t6�b��kƘT:�>�%P�5�F�@��>+�E��w�19@q@���L'@�x�Z�g|�;Q�_/�.�{���9��"�N���Ɠ��<�ѝЙ�Y##���SffjNJ���M�J��_��
�q������+�Z������s�Y���£�c/�5���D]RO=���2f�軋#��$�v�����#0��+��E^nGܳ=�T���<�`aǪ�Pb*�>�)ٲ�<5W܄~����{"{�xNRx���D�Ɯ
ƳB��@f��0�Ph
����_������g����|��&�ߚ��X�s�g���<�)$S������c���B�Y��ҋF����]�`�M%�݅����O���Z��P݆��:U�3	��_�ID$�,(x��8΃���o0'���M)�����	��Sa����f��~�T�۶<_HY/2�6�W_�"n�:���JQ*�y�pY4���
�����z��y��g�����3fEl`8�E�C�_��	�{���~��b��$K�˵]�9�z��n��$0xT��5��J�x�-#���ĩk���:��%�ى�I����i����ar|�T��ط0�)�5�������%�����J��(L���E��s.�4�a��T��!���3��SA��A~]�C�~!�S�VXߤ�,u�-F�P����{�
�;�vI�uvm�?��Ͻ|��IT���A��B��S��'�HJ͙&��:���4%����?um���?�+44���_��v�C��'� �&�=�FS��J�`)�BP�k��m���fAbD���	M�+����'����E��:��-�&�XX&
||eO��ۭ�G��|UW�%=	�2�D�\�P\C��s@��,�
>�����X�5L�#�X��PDE	��p9�p�$���o��fwqlGl*$Ӄ���)R<���+e�FJ���`Ä�M��Y�.M_Xd�sk��kI�9��LS6@�r|G�N�Ę�}�+�i"W'2�|{�\��[�8��:�D�0�)��:�4���Z���,~~��K�7C�:q
�/��������7O�/2q��}�O �_��<�l"�і����dd`B�&J䜨��q�Ӡ�h�!���o!6�	��~�!��༘��z��Z� ��M��Нx���y�6͜���/�F��1����/;�c�P?y-���F�0�q�A��p�>O�<~�}�vKc2����%�ka�W��:��?�jKh��c�W����>�$��ݮ�F�8��5����I�����FCS��Y�t�UB��=y O�l����-X�d�*��6F۬�����{!�ԉ��(aA�v)�=������X��X�|�o� �A�8ը�	�#�Oⴧ�Fb��P��?0�(K��P2TC��Z<��6p�}G���$oc=L��{�0�;�ݶ�i��jKU@�O�I�YX:��?�EC�T��x��M������
��l+�d�/)�	+�1[]���/�v�L���+��
��7.Qs��&�Λ��L��B�C���}��:�����E���n��1���R���ŧYpO��o�쏐�N�Q��]���ҋ���p��K�y�'�]|8�f'����{���.D�8tD�ߕNO���<H��AQ{���Y��.�zүBr`��л�p
6�kݒ���3����`A�5˱�]�J���Onh^�d����e�S~+����ŊTbp���wH��=����{	�*=��xJR��P��5.v;�eW���zLU���6ڠ�%`�lv4~��
Х~�s>�����7�u�<��J���ņS���!4X�LK��=�E���![�����?��'_���i�&��V��^�@7DS��?�w��Ϗ��Os&�>E�PKEePQ�b�,	!pip/_vendor/urllib3/exceptions.py�X[o�~�� �
E��B�,�U�ƀ���>��Jb=CNI�d�h{�9�\5���m�也�\6Fg,�6�+��"&�\���p"�6xm��o��X�2����9�Gq*�r��[�,O�K��-�K�\G퓫��n���"wR+{uu��Z����~n�6��p4�b�o@OD�-+�H���NZ��H�d@7s �"�n�T�a��"x�߽�ܽ֩����|m��s�bN��+�YD�8=K�� �tQ4�"݌�x�2a-�<P�x:�C���T�(������k;`�lئ:jr7")b^5~`_A�\��)�(/L�-���`D��EY(��l��J��U�[��:o�ʌ�Wݱ��؎��ձ������Z�0�M	g`I�Y}]���m����J�V\��΄ߒK
��Px���8��1؊m�L-��S,+k�D���r�_�o��v�A�9���o=��	���?s��M��0����~�'�v�6r+O#���ߕ�_D��5y�tƝ�Ax��\s<�gZ9����\TZ���,t4�Y�	�	�$%^r0-��x��$���'ҍ6��ԇ)d��<w���u�J3l
���B<��k�Jw�\�*�΃�Z��
�|Ӈ���R8§��������̊��"[����H1k	D"���i�
�(#���*N��ߙ�\ӧ�B:A1�eR?  Fo�
#<5Y�a�`~���b�^vR�ns��Y�D���B s��<�O��G�$��UurN�ʦ�A� yŮ-�xY�͈JF���ti?N�@���ںَ��H��F+��*�#�IJ���Ps�)�V��[9v��KÐ
S=�!%��Q�����F���^�t�����ۃ̄.��������5
�P�FJ���O ��@;O��Rnoc���g�*�huƆ|�q�Qg�/d�BWl���S����M������'P,	oB⶞��z���i�N���]��1{5R�v��C�"b�B��	wO�R�a�´�`l�6f�!*�.�l{w��;�P��]+�N�<�U��e�n��=�i�~
KDE/�~�<�8tj˰G�1;���|�EV��N��S%Ͷ�=ڂ���g?����j���6ϳ��"k߻3S@-&+l,�w������T������lK̃VC[�7�*(}�ȵp?&�}l�4��w�M�?��nt��[���A�����-�O���]bύ
�O%��
�CFX�ɔ���B�H���d~���a?����j����g���P�{IxT�j����}D+pt:Ě�R�ϩ������m�KCf����|1_�΢�r�c��:
��ձ"�����~>���{��XP
a����ո"%��,'��4^j���%(�ad��рE��'YOT���?!?�n�oɫû�_���[�S&CAe�ϋ���U$���"d�9��BfG8�3Z�>~�#t�b�;XYzDNY\�0]��k�s��n�)w��l���Q�6r[���4��t8J��*/n�{7�1�J˶�I�E�z5�>�_��P����M��J���
j��r�vK>�ʸ�4,�4@V�+�uA�r�[;��gM�Oܢl��������
@u�f�1P|�#�5'�O��իi`/�T�8Mj�ւ��Q��w�D'O&�*�r1H���/4���8D��Q�%��Le/{�uhFo7��h��kg����%~㭅�K;��ق��5���Mл�
�����˯��bw�q�a*ԳH��yz�z�_xS�w`�ؿF��&A��>(tܻ�C'G���cga�OE_�O����(i���"�f�J�T>6�m�b����u�	ma�#B~�e�� ߈��}���q�\��Ϭ�;���
���+C6��ڰ�{�;��ŀ��E�6���t�o��a�=z�^��O�D8��'���0�Š9Uha���T�,�up��$؍'���k=�q����-���@{�����fX]:�������#�H�pE�v
��3*%8=)_�G�.�}V��g�}ˎ����ܷ�;r=?��\�x��G���A
?[��@Y�ҕ}�
:���V�"�`՝Y"����ˏ���k�M����0Dh�k3���<�ir6$<���vQ�xt�C��?�a[9��ml{���"�מ�#��A��{,��1-,4^Bk��MK�vRb6-62���I_a���Ţ�>�p��u���0��@'�A0àK�c�S#�n�Ge�A��D�3�++pU�hP�Wh\3���z�`�5�kD��PKEePQ�7��	i!pip/_vendor/urllib3/fields.py�Yyo���_�b� ��ƶ�A�M��q$Y��mP#r$1�H.gh[M���� ���d��`@�p�o�}��e�#a��dU�0$ɮ�KI�J�i%y��Gf��X��J&��K�d���B�G�5�҂E�lÅ��h4���l*.D����_')�؎Ol`U*+�4��L��(�$�S!K�v^0�x���F4"��x/5��#@z$_F����y�J�#�(����@kW��5+�d2���|Y���F����dy+bYq}�k��m`���z������T+������=b���%m�u^���ż�4a��f��_[玥����$�*��X(�",��oU.9��r�����~i�����I��#cI�c�d��K�,3�c�L�*ee�j��R<��,�6�����V�6�d
!˳�ه��_kqĄ�ɭv�b

.�@M�^hN_� ���G�cۧ���|	���fi�z�%
�
A[���<K�-WR�����rQ�wI�L��r���K��N\Z�7pgJ�S��T[��$�cn�`��e�+l�J2V����ׅ��1G\߫�z��F1��S�>�
��i�y�]__���8p�^`�,H5~*�S��S�r�z�,�
aCLy��a"J���"^H��p����e:6k�x���&D��
�=Z�栖���o�9!OȻ�܂����r�����m���j����0"5�~j�,�To�!�J:�
B�U�Cs:ryw
m�j}��%�>[�q{��=��>c�r`����7����ޜ�<�<���V[+�:>�ͼ9�|
�����HY���#���k�:4�_*��,L����h􄜥��\e�[�H%6U`���1{?�\�g�m���OtHZ1�V_��V�͸-�(
�l��dz�~�N	�\�Va��K�m��<L4?��f��a`�Vy��_F��5a��� �"��I�y�r���=;(�„Қ����mЫ�� ��~�)����=�Z9��]u�o �x�S�d���"bPY��҇���:�������L3�SQ�|+X��;i�`���]���T�����V��.5/��[��U�ֺ�i��1������Ty��+�ew	�5��To�L
_�ppk����G��i�q+e!�GG���@n�V4ɏ�NG�G��
��Ot����B��?t�1Q�E �q����A�&���;��`H��@|��}*Y��s��XL1���J�D���x9���T@��
�A^$<��|�	Lۉ�3�Nc�	��(5Y��މ�o�^!�,�Ϧ�B<n-�}��6�i�#��i:Ҽ�`bi3�O�6��0n�Dr���V#��$Kd�R�����������"@b��i�	�*"u����x�გ��5��&��7�>_�gl�+f�\a��5���~RN�	Fk��!o���dx\mԲ8Ȧ�qb9��2�B1�yS;Ģf��C��Bq�~a����G����o�!�FV��]����a�m�&�&.�$�G)T:�cN6�|�25�|�\������?����ꔪSu�ɒ�!���^7�yO�ܣ�"w����U��:�
��
J ދ|�ipJ
�4��(�daG�����*Z\�CA��á��{��L.__�U!�(�[^ri�+���Jk(���h>��c����W�O:o�-G൏���|��	��.�b�W�C_r�������fC@�g�]�(v �� �V�f�F֒��O��8�~�i[24o��.����t�3vd7���^;X�;�6l`�# �9m��O�'�kG�(���c{f�?�Gn:��ށN���:z��{�`��n8 �#��Tg�F�^:�e;�Lw a��,�!p97Ï��Ե�g&J_�4ҟ��ן�xY&�����3ѡI������-rM7�z�����;�����-->�	����gP�[��ф�ZS��I�k��1�:
��G[[�n��l�s�g;�Dr���9��&7��]��DI����)v=#���mqz��4�g���+S�V�.�؅,�=V�f�'���#�������.������M�{�l*0-��fw�D�J�=G�V}'��MJ�-x�bi{9���	`?]�SL�Y�����_�sMJ3w>��5 �u�o}�v
��7�Do��Oa�3�i�N�B�L�uo��I��L��\�3ͻi)�b��k���ݦ�n8�Z�uB.ԯ�o%�5A�򜘻܆օ���7A�/�紊P�%-Ό[��w��Y�����dו�C����#�u튊�q�N-mvu�7Ρ'�V�YJ��,��s_��b��A������z�s7�z""��ǀ�M>������0��4����]����=}ܽ�hn5�B�|T+luv�=^���T^}�}�?,��ؒ�"��Mz��D�iB�LJ����&ΥL*�l��U�O=��0��9ޑ[���Bt���4�ա���PKEePQ/�]&}�	pip/_vendor/urllib3/filepost.py�U���6��+*�
�A (\�%h���Hz)�B��њ]�THjw}ɷgHQ�-{7�%r���{�aktE�n0X �^��Z��;�˕P��BLߵn��ӗ�I�z<�'�7{�v�1���׷��m��b��Ҵ[ŽV�lf�O�u@���$�7¡��
�Z�}��]����/I�[�wZ[,*=���}�o�'M��q0�]ō��
u#�kK%��^�;TZm�:��eHv8�Rjkl�R��L[6��e/_�y�-(a��ۘ�g
D�R�YP��� )�f�X�'����kg���E�[��A���K����[�’�-d�+��
D��A����,Y�M-��M�m0R��U�+X�0S"D� ���Ƙ�*D��"�嫣_7,PZ<��v�I��B�
đ�y��I�e�}�v�i���1�]�f���L�G�b�
�$X��K�:����x�'��>K�-)�v�B;��;4�:d�%��E�E�x�My�r�
�w�����o�?ً��[*�,"���o�=.vZ�'��~���G���Dύ+ȴk��sB�ɽ��.$����I?����˒��EZ!�!^�k�o߿��u�E*7d���䁆?O��ॢ��~�<���HSy�X�8�z�PQ���G�a��)�B�A����b����k��\���xCe���R�{).�����X��읒`�˪,]����E�pل�O���˼[�&3�
��ӈ�f�R�Oh��1-�?�G���[Q�n1�"�u&������﹡�u�s'*!��?
���W�}�� 
����G܍�YM�q��q�k��!�H@z�t�q8�W�#�@'3"ľAw��Y�:�O�PKEePQ�����E"pip/_vendor/urllib3/poolmanager.py�<ks�Ƶ�+v�Ɉt)8�r�\�0Uu���XN3���R�x��$�����'Jr����>Ξ=�s�0��މ4�tm��4j���Vdk]�]+S�>1�y]�2oU]i;�骼���
�������׻��૞L6xT�0�i�d.��<��eqYWm�*٘�y]U�|��߾�ӥ��	f4v>�JׇT�[��f����>Bn6��:�p�oY���MS7�ݿ�ms�~j������껊ǿ�n�R4
hn�u��_�D��� ����Z:����$0���[��5e��0�hi7�د��̦F�_'u�M_��v[ڬ�ZU"(G��@8��M=�2�L�4+K����0E���*���.Ĕ�|��"��G�
�;��$ײ�>�f��U���O&WW?�߿��/?����e~Lo$@R��2q��n���
d)���Z��l4p��$-T��i�}k���}��]�S��䙸(KA�0�"k�����6C���B��"ܪB��a��H�H�Z
�pL/D�Њ�*dS�@�K�N��Ѣ�
&u�t9�/CT�Iʔ�e�c��_�3��Ķ���0r��U��V�d��zS�}xϓ~5���:Z͒�����F%v3��o�&t�5�L��h��#�{i���Lr5>�"6�s�6����F��ѽN���ͪ\�z#`2m��y$-�3V_��{���^���s�2�3�(�-~*%m����<���!8x*۴f��+J�
.4+�,�p��:�[4
��-�b��7*�����]����Hm�y��EW�_��A��anLO`	p�W��8����U�%Qa����X����	�A��w��kk�zK�FUy��v�W|s��3�;U�]�K&h����e����ljV�]s��r#R�+�ʖ���ف��
l8I3^o!���;?grM���e#�VVK��@�gv�0�y�]րe��y������Kq��_�ql�ty��ȪB G�,93-OAqd�U�neB��1���Ӊ"$���f�kZ�yE�KN��Ⱥ����"�mġ�ĝ�[b�6I���r��*0d�"VV����<9��l
�;W+�C����P��1#�`�3��
��9q�����6عaZ#o�88xw�y��8�W+$5|!!�e�0l{)���zR�/r�i�n�������BH�9$7�LJ��!lxx���@�B��3��@����WQ���9���u(��g�J��b׵�eD�_n���$�{�)�h6]�Z�>�	.���E���$�%e}���A!@��G�j�=H��i�C\<IB%ٮ��&�4��>��([���!T`�l��t�A�=�>�r�6�%"a�S1^��V��+�w�UK��,�HT+wz6	 bF�k
y2K	}���F�b�j��gӞ�d���-���̏!�}�� ��d{6��]k��B���S�fx>duZ�C�2n�����`����X�!;D��$=I����,Iо3Fn��e*� 7�}�G���W�\lQ�X`��al�ֈe@�1q(҈��d�q��H�2d��q٣��/��8�	�'̞?�NtB�Dh�6�=Z$�P���0Ƌ�����L��nE�C�����5�Q�8d��{R�F�u�oE���֐�k')	0�$V{~ndY ��^�
]4�E�*�ȎFk�B
'��o�����m��s_����UY9;�,�ٞ/<��B��d�$dNJ#hq�m�cG�t�^=��,��{Ď���Y�V`��Ɠh�
Ti�܍*3�t�����������~"�8$��]J�^��v�5H��G E��[��yfB=-ef�!�	��Xp9H�6���-�)6V&��(������I�d�������R�
ΏO��?H[ͽ����]��"(m�����7��nݶs��V6���[I,+�� ��>ہ�=?�8�_}���A�(�r�x�|5���B��V�f'߼~�'(��/^\�5���޽8�=�w�*?�!���ᥬfv/]�O��8=��ц�����6MgZ�������VJ��e!���XK�`ʣ��� ;��`��Uj9^j�L^���k-S�o�2ۭ��b��%���<��(`�|-�7�z�W�ig
�M����Q���,!�}�d�OěG\A����F��3vg����i�>O1��O�Yi���#X0x3�1���R��n�i�)�+�-`�F�u1�`V�;�A����DxA��AfNb`j=�qi:�u6�ol�Z.0��!�`	
��τq�4����j���5�"lE���wL�����0&�ݑB���,o9�0��Qg� ��󱊱>�s�v�
TԖ�WE�T�
��=�х G�U�2)�+���f��~���d�sFQ�<�Q���a��#8b3L�����U�i,�%\���F�8'����8�{D˻E+.� h�F�&L��/Ye@cE/]��m�Z�'�`��ԋ���86�Q)M��Iql߀m����s(�x]5~j��S������gĔ���
s��Ao�ξã��x�����c�l*���ꟷPl{V6��׻}��@��b�"�2��t��>rGqJz��j�6�)��+�lp��N7��޶�{�B���s�~-��r�g�	�j)�+�����;����:|G6>0���0j�r����Fb��Q��2
Ij<b���<�Z��)�%[KtɆ �
�(��N�
:�Y�Y����*���ޢ�l�N6׀��Hژ�D��!Z��۬Q��x�^�M�
pv=O�.�?D�;�r�Ҩ#�����އ�˳�ۚ��z/s�Qz�ۨ�M�i@�Y�y~l{T!4v�K]�ȩ���콧S���9���_~�Zd?�Ǘ�j%~��/"�3{�>��vk���P��CG��cQϮòb�IpT�T�z@�U��m����?c�	�iѪ�[g��G��#TҲ%���2�Gd���6�9���‚�����‱���1�.��@z����.
Rtd$	;O�=b<���?�{Z_&*���p�@q���	�JDž�y�E��?�:��C9$�GE-�[�6�B�� ���>(�0�(�y���$Oz&�Dsg)=��*Y�b+4Mz8��W*���⩴�V��f��q}����Y�Fu��1�G	��OH@Z����%�GcF���*
q��N�����J�T�5"�c�q�7��
��8�a��W��,�D��(�;}o<�b�6����ʴτA�>��8��8a�����Nd�ۺ56Gm�+��"
������#�H�"�}�f��%�2�Q�v(E��m�͟�5(v�$�K� �K�|�
�[��A
�QØ��֖̎����
�X�r�:\�?����(����9-F��2ʹ�.���~Q�.h"�R�)��M�Ro��\�Q�P���$a��e�w��|�^�D�p$�F����:�b<4�̬���?ms�`�(��w��\7�K�V=�����GP��J��Q�tP:�F��f�3�9J����Q=2�� �i[s;bΆOl�9ݛ1A�`�7�֧�)-*س�rv�����>{�t�5*�Y���4x��4̼)�9� �uӔ
��˷lA3�V�`�����؟�Bd]ᆦ���O��xƈ*y;��D�7w���Nc/����.�L	�C�u�$�>|��0욏�f`P����!�64Zp!y���ܶ4o6V�f�����mC�{�}.).�D�VZ���tF��z3xj�����K�ؒ�[�a����SP��2�N<���)Y��� ��}
� �5c{�^��\�+S�c�E�E\�6W�Է�4r���>�q�����(�Ƨ%�w��n�Ŕ��̬Yp��kA�lBʤ���r��~�n|����z�57�,�U:�����F�P`�%a�����8^ے���;��Z�[b�*����
u��]Uai�$Xi��9� ���.*lS�$$)N����"?�oW���D��D�'�nGN�1�'P>D�9ei��%�}x��:�"�2�3�u����K񜭥��ǯ9�#|����e�A���ў�*��em��جGK�a!��/�ށi�$�M|b�M,�>|;��,�0�͕[���f�ػ���>�}��Ҧ�M�y�&>���+�{�q�,�÷
�#@u��?љ�󽆡�`s2�WE���F��?�p$�р�6��G��v�Q������h��Ƿo__��&��;��/Ľ5�
���a����As�ș�p�@�v:SC�~S�e>ભ{HFx�W�^��f�?,Q��Dp��BL��r.���+�l��
���E�5���K[ᣜ	H�9XY[�,[�N�#ȭ�6�bc�HTl�
�UI�g/_}9h�y��"��[�^=��Y�*�����k�y�q����C�/�����BE�׃u�U�%���*�����hԝ��>>7�D���(&B��H3c�o��O}�4��>SS�=q��RXA���~D��Q��
B9���[

���i��}�!M1i¿�L$�e���}.6]�������R��
N	��eϘ����?�w0@���6�����'^��w���-n��ѻ�kA���.�3ۏ����;7� �d�R�)��X�ceI֒A��;0�l3Ł`�����ꩆ6���Z�c%	�f~�Ǟ.	q�}��#�F_P'%��A���'��^�
����W��E���4ΧM�����@� ��<(�$<Y1Mg��om��lw��+vk�틬��A��.`�@��1�u`��]�g���uǏ�Ý-}9:�`�Y���L���Hl��w��W���e�-L�8��X�;��.��`�ſm�����<�[k����D�?����$����`�w�'����]v؋�I���\C|ۭ)�1A���@�/���ϧC/���*��"���~-�<�{��B�ٖ�����x�x�j���m�*?�>EF��(������M:�"�2�lְa��'�uij�4ش$N��6�d4��%�T�؃b����m�	�� $���d̾e6���p�U�%����Oqu�u�AqΧ�(��c�K��7sf�w�8t��
PKEePQKC*��pip/_vendor/urllib3/request.py�X[o�6~��8�>�N5���A&m4���b��蘍$����}�CQ�d+�`ѮDE~<��\���9-����F.���RKb]鬶r�<O&[��lU&K]�v�,6:�˼ά*��˭6y*���K�y��J*���w��2��S�c
�d2Y.E�A�s��(�eeo��鴊��&UE�3��Yn�|1!��(r�K]<�BXR�^TA��zY�~�y�L沀��ȁ�XA]�bE�����7;'*Z�ŋ�o��&]�X��:K��/��=�V$��-?Y�+rQ�:&᩷�*����F?����N<+H����I���y����xc2�M��U�9��ߩ�έ�%�쭒Y�������^�O%�n�9�͐7S�/=�ԊT�d�d�gj��m��t@�”����ӏ?Ќm�v���!�뫋1}�����j����k��������O�mꊁ�	��s�]�lc� ;�p�	
��..��?��*��&�'&ei���2���.Y���eiti����K&,{��H���Jb��#�ׁ�4�m�zJ{Qo
e��ԯ�tX%M��z��I��A��f��U���TBv�@��1�E&�����B�
���K�����!	a�nz�[�ʜ�ר�JS���׻�������׉��-����嬒�6n�8���;}�e�Jxd�Ǿ��|ʘ
����'��������
�e�F���{����u�
s�zv��w�ѿ�b]Y#66�7B�0��is�L��ѦS�9�ҧO�b}�
S1$i��O��p9|��}A��j�\�ts�u=o��ڬ�F�!�(:4��˧}ϡmi��-ȏ�?���*����g,��6��V�4�f-*$�$�ժ���G�v�~�	d�^�r��a̢)c3P&�9�k9�Q:j�u��"�mB7�6�@�p�qz˹\W�ւ��u �TY�*\Z8��?]�<��S���\���/!��w� �;48�TKd���9R-�7޹\���&a��zϞ�0�{*����y˰�,���'�`�,���`,��5�vն�I]^IC�ٍDK�'�`W��Cn7���:$�i�Q"�䟖����t�};����]O�x�$!ZU�:sU�����=i]b�v3�Np�-)@f����*O�u�D6vp�Ͽ��דy�?Zs9�Yp@��C0��9���}ӵ�fjoy�ZmA����m:I��h�0{!=b�?�B�͟��q�Y��y{�5d��9�����wG��4��y\yaS.!���ת�L�t�΢.Z�!�Ȓ���{t)��$��ݞ-jX1<�JW	߿�i��];�݆S@(���i+���lׇ�0Ȉ܇+;��#Q�B��C�n�����=>�J�[�s��:�kԻgi� Z�w��jo���Emw=�?��A�S���"�.��[<��g���%`Wt��C�ⷬ����%tA�igf�\-&�@L�7�WΜsj��Vfȃ0�!Z������nr���?�!��T��V�邦ka���[D&��)3���}�Ә���P�_M�#�D0�Oå�n��V���
+��`~u0kU?PNA� U.�K�8*w��1~ˁ�ݛƴG�{=��#�֝Z��c*��n��h���*�@0�����i]s��_9p�h����8���_D�6z_!���C�lhԴ�ʗp�ϘU�@�.����xb�+�;ow'4��{�,f�q#|Ȧ.}���1�3�z�S[>|��+L/+B˒?P�I��#�|y��o[��Ȍ�i��崬�c�mO����aׁ�mq^�����ͱ��7rX
J�%�Q[ry���F�E:p�O]���>��.،�s�/)It>�K}\O%���,]�;�3�BmZ�S����:=�)۸'��xf����F������sC	>���sZ�}q���7��W����m���'s���K��PKEePQ��~�=npip/_vendor/urllib3/response.py�=ks�ȑ�+pt�D�)�$���(Y[���ٖKҞ�r\$HI�@��C4��~��c�@�%���ڕD`��������eYl��d��M)&�(�l����YUdM-&��`���E^�/u��T3�d���J���ߠ��;-�_Y�Z���AU�^�
L�nD��UtK/�A��(ˢ4-/��A]��"��V��<ė����=��܊_G��"<L<�Y&�uZ䕂���݇�D���t.���lHP_��������@��b�M�t��1��c0���^�y�փJ��yZma0�/�M~/��*�����S��,]0�� �����V����CU��<�z��w�T����~�o��i��iO�Y*rZ�5SAvFə�6e/!��+�-/'�i�4�K9w�-�&K���
�M5���d
�>8F�����D���p2ɓ
����`�%U�_fI-x�a1�p1�,��E���d2�D����_��2-�z��ݕ��^/�:�7���{�s�$�B�
�*x8��ȀwRץ|!�
��
�G��PC�

$3��xY��e�5=5��Ł��#@��Fɚ�?Q�9�^��(b��o�J�NGdx-�$Y%:��E%�"�5�~/�-�02�kx�q��ٻ��||uuw�R�EH�<�I�0�i�dYN�*jo��o�Vn�[�Qavysus{7yw����
t=���w?]�ȇ����~|������w/��ih��ݻ��<�>zu���V8���0���
�}-��L�Ñ�m��;T��W(����!v�4$Ϟ�~�៸��@���i�Tzq��?��VyQ
�_�,kQF�ZD�Y��`�Υ�������p��=CF�e�;�i�fp�E����i%s�P�F��Q�)��y\�u��n��� �;�,\�7 �&��ss��#?Bj�N_#%�[��0��`Z�(Ƥ�b9�^%
��m�E�t& }t���(��!w?���du��|.���Q�N�#��ޏ�;`˺��I>_;}��6�7�P���:p����' }J2����e9���&���%�t������D���,��Q^fM�M�Oj�$r3�����0O
����7?��81�^-#�O��al��P��̈́ȣd�7(Iu%04��@Š60�u���}Im:�m��~����)%��$�@�/��.e
jM�P�-`�V�#ܜ;E
(�(|\�����1_�w�N�f`�bM���>J,D�:�L�
x����p�]��F�;6���+�ƃ�g3X�U�eW#}:����ɧ6��@�b1t�z<'%�{+8���˙=��0��a�j���9,J�T7����O�A�����Nm1KKÚ�mH�앰�;�|3vږ�h�E|u�楷���6��G��<�!^���%�:�k;7�4k�A�YSOksu:���t
�%xY�cA��X�6>Z�
>٭o��W
z��ڊ��#��pG�"��8��x��2���Bq��	��>��5X�p���lG8�= ~?��Ŕ ��&c�l��2G9J��.ЖG)�,H�`I����DŒ�<\�pr��^R���+p����#2�L�����L)���olSW�g#1'R�8��ϱ��x(/@��Y����a^�}8�
�&bg ^��q&�b�)�w��iL��2;2�P�;RB�P�Nw�LWhti���#sK��y���{�'%	�U�5Gi
��DN^��'Y#�Pb�%f�*�6嶨@pFW��Dt�c��;5ؽe**3�;Z/z��!��utF�~6�Ϧ�`
/�_��N
��g���fn�k#���C�0��^�I&�U�6h]�{}|����=z���'e7N� £Mho��:����M�����ҏ���� ���Ƭ��E❂���.��M^_^\�fk�cR�H0>wK^3���
d1���|}usyq7��{y���%���d�8>�/����ן'�s(��7� 烁y����9����:?6O�j?�T��g��k��'8�i[J��۽����
�-��{d<�ދM��H�����Cv_��	��u�h旰s�7IS�E�f�|3�iR�N��\���Y
�)p���L(�Do��s�0G�
J�/%s�[������>`d��/]�@��y�ò�\���:���:���l:�/-�*�D���_��|�܆�������`M����]|�=lx?�n��7�7i
��XL����Ў[��q+���|��n�W��{c�1έ�GFg����F���Ϣ�`���ܬ��5��QU�3:A@�ʫ%��R ~�");����%0ֲ��.'P�v�����p�F�*�1�Q�;R�
����ոy���-О�:��J�2�ūQ�Y��T|���dL��h_��F�"�(�lm��s 	A��XC0����A�uV�:�aan��P^p*�GF� ���zd�t�T��a-yRiM2���cDH���=���b�w�W�|Eӱ��V�dŜ��5<��\����Ī[$m�-�ߛi���T�!���tP�Ƞ$N�`��i��!�G� ��a�̎��� 	�;�.�y4�B��e�T�Z*Uw��ه
���:�1ou�h�"p��r���	ᑨ��~_ą�
�J���f(�:q�'����u� �6E1��F4K
��F�:��E�i����/Q��d~�鐲;8����V�^���S��fq��� �ߣ
E���Q+>b������M(�Np��c7��=[��x�?*�Y��O�g�4��Ro�DRf)D�0����hm����񣹇���v�!B�0��}�5G�f�=�lǮ�q�v����L*�-AZ�,�c����-y��]�!��,COƒT�@�DU-�2��%{�
K��
cA�dS49�g�ia��gx�M�6�AY����bP�f��`4�"E˄�Ga6w�먆��h��+��̎���k�d�f{u��GN�e�<$i��0�Z!o�`��&� ��_�ʶZ*�X�3r����\y�%���CVZ�n;кf�@'�S"}`/�6�A��=�*-��3�����,��%� �KA�]�Ԩ��7+V�.)QN[/i	n��!L��j���� �Ni�*FD���?�5�#w���T�H�En�\D?��8��E�">�9x�p����+��E$�Rf��8-�Ϻ`�el�pyי�V}�Q�g�t�\�)G�V��%��	�yN�
y0o&"��M0ع��AX�/
��k}}w:��Gr=3��E^5@JbM��p7GK�եb��u%-���ղ��aL�_��f>��1�s�J��V���w�P�Ő�83/�1$	Q���O��Z�� ��j�5���6�~��������N�`xC�g�-���,+���:79�A��%����F��W��۰?�i�,'o��0�#�8�e8GDCieo�=S�1���q��.HKi�@/z�M�״��@���~�N�b�
}c字��/�������}*��!/YHK��"�p�L
=�4	%�*�@�|��xAŽ
��������Fhy�G�U�<��)|�샟ƒ?]�|=p���?nYD��<�BA��WQ5[ڼڍ��t�Ԃ�'��;)�a��0C-Δ��N��0�P2�b�@ż���o����ja|��*��ާ�<�ъ��.H����TY�~�3QP�%�����ڙ�S�-�َ�O�M+�/)���K��,��Hjȝ�i���%�<9'�
�������fr��-�s�W��t49v<�GbGa����"Pc;��Q�R!ƞ/}�	j.���Վv��4
<ַBJ1g��qC��髡����/~��-����9It
��t)��u�ޠ�x{�)h�2X�
m��K{�G9�~'�K����:��$c�i���ϧ��	��#�~
d��LT���e3+O��6�9R�`C����V~�"�Ӏl�ti���AF�����q��h�8k�}�7©k����Iu�۪ ��^}�����u�~�]`��w`q?�,�rV���G�A[�G��)
��T�1:M89MC��yP�G���e����NWk�'٦����I�������7�  ��1A�m��w��'e�ST���\����Yt�$2w���A9��K�pK��@U`㽨��<�h��4�!P�ЅA�S�i�,�6�X���zL��%�N���(H�g�.a*9�kE���r�x���FH��L��}$�2�kF�$�84�⾔�C1:���Çv�!�F_cPN�LCAEy��ߤ���,Vm���c���<`/W�ϱ+̍R���e:�_��W?f��G���> ����u1�S�7DsX�벸9�g%Q���P���1��uY��6�Ĵ1Hxm= M�,�4ۻh:BéAV�B0�"%^��&2.���U.�&D��hJ�E��H-��^ˇ����@��2���U!�f
�DL��)!)1"EI��>�b��I�4�%zB�ƚiGnD���j��Q{ǀ�
�L�G/����Y.ӹ��ㄐ68L/��#�VS���$Z��,}"1=��:�.��t�]zX|$��X��IB,��[�\d����v�Mj(O>��W�l����ᢀ'CWV�vdo�����M͉[~z?t�^�4t95�M�%%NRF}B��a��wE�,)R)1�0&��S�ԦS��t� 7�Z
�̿�ɹ��	6��-F�%O#b1�rE/x�䄀��>�c�]왘',3�E!*x���!]�bC�\(p��)XM_6Y���ښG����
��|a��}xT��Y��h �A�^�Jtg㬛�����DIk��k��kK�=��2ՙ��aW���u���E�U^�t��χ�u�	�y:MQ�Q*����r�s }:�~�k��%�`������ƎF�-e��Q�i�Eا�J+$�ap~��c���t�޸ŧ�-�a�n0�^�\&�
];�]I$
c��"n)���Z�P2:���w�,�rq��a�|�� �ʄ�p$��X��A�`._� ��b���r�t�V�%~�f��%��(7GRX�ϢW�j�WI�G��ϪGː�2�g9M��b ��^���	��
y"}��cy�ĄO�I�$C"�}b:>P�;Ӕ��QȺ�kг)���_�����i4Ddξ�v֬��a�E���F�|�o���ิ�i�E�]	��>T�I�r'8�k�K�$�0@�B ���%��j���P%�:�N�ʉ��mw����S7}�t���c�M�l��E��8���EǬ?sQ2w�d����J�����G4_z��N��6�y�df�TO�`��<�,���L��.�mm���̅$���-JL]��'5�H�f�xd�G�m��Ibe���|�&Ѵ+�C���)��#�|�Y9z�V�#{�������8�q�Q���e�w��y�-��4������a*�T�cE�k�0(�"����)2���üHP�����J��,6S�LK(]~�<�a��;F�����!���$$Q1��
uā&����wǦ��:�\U&׈l�y�����9�g��S���mp�؜fT�
V�^%C#���@��l��yyp�Ĩ�=
���z��Ȍ���Z9��*\-n���;\�T�jk�|�	b�T�@��ϟ�`��.�F�H��I�h��6���P�Y5��Ǿ�F_�u��H�n�\d�<�H���/�ӱ����K��
�*��f�Um�07ZJ[��xX�@���Y�\ꋑ�S�\�f:m����Ô��X�Ժ"뫫�߇?�h��c�q1H�
l?i"d�<Se��O(vXGW���y�(�G�Td�M��QU��cR�<e��:
�!ء�OYl�*�T]Z���*0U���\gZ�D)��*9-U}��Z������Le���}`6���+���E؈W�Y���H�͵�����G�/?^�v��YW\��[&M��6�
\�N�֔\%[O%��}*~IL|9����?��#/�A�D_����SG�GAXmm;���?��7U��@Q�-�;�"��
OF�?��-b��L]/d�O�b��'us��!'�r���^�����r�m���9�A��[��8E���1HG���3@�MR��;�1�~l��Qߜ<[��N�`���'�i�d�������h@a��
[w^�[8��VP%x�O��f/���	�ܢ ��jJ��]��GV��ZH���.ڲK<���&-�>�x������[���e^.
�)�g����p4e4�gnA/>�v#�>�긇9g����0��Yvu�0�K\�\�J�sy���38�*�6�e�֑�������QQa��їfRZâ�YJ�xu���N�fC2�h^&;.��5Y��Ec���_��(ہ��l�jU����D��C��X
���A��E��섑�5�Vg��J�_g���"E�D��g$-�+Y���_:��%/e+�%s�g�߀8}:6i��zP�n��
t���)��TŇ��e����h\���Y�+F������kX�L.�qO��3!Y�/��%����*Y����[�e6ZC��g�<��+*_ܼ}ɐ��M�
Q��:�q���[���2��|�����?9�1��B#��<o�{�'Q�I���<�0���!}5#�3�mFi����	9(ON7�M3I��,�P�����S\��I:=�F�JL�-%�nvD�h��}���*��}q
j�Y�J��QlL�P���&��]�`Y��*(5QUAL�yE��o�T�C#�hc����4�6ϧ�ߏ̊��3�dAuU��4�T�{��-���hչѝ���5i���i!ꖠ_S-K�
�>��~��>��#�x�b�Ѿ+/�'I�o�'��tK��;��P��K<�w�ې�7e��)�3~-_A��.�¬�v3�>�4n�2-�L}f0����t�Öj�ug�s
�H`	�x���pFOp���P7iE{�D;~�a-Ʌ�#�|��۩��Sں�-H��8"��#Cx�l�պ�F��d�P�+T�!�<�~����"��T=��H[�cO�R��T�K 1���/�_�3}yP�ɖ�
�4ϚU����(�b�w�bd\�t�fGh"���y�7�GC�g���o;z�ȑ}+C�7V��O��_/T��B��{G΍<���o�r&�N�XU��u����a��WK�2X�l��u:�K�P3���3��Z�I��f�puQ�#6z��1 P��?�tt�9n]���s|��[卮������YCw�G���.:�-�b�23%p�j;
�s�7��c��v��%f���
�/E��Q�~:�R�VO���ħ�3�h���		�|F'CBݰ]����^��:�:�ŐtTW~����PKEePQ'pip/_vendor/urllib3/contrib/__init__.pyPKEePQ*����1pip/_vendor/urllib3/contrib/_appengine_environ.pyœAk�0���.�bC.�@qB�g�J1�4k��!��dvgz�o��yzo,�(v��0�-�4�������v�q�&�
�,D�f�(E�q&��{��W��' ���O�������i�^�?��Q:�B�N�4��<;���:Sk:atθ���{"C��dC����1��Q��˞�`3$?d@HF��$����-O�5���gZvtT=X�IFF��p
���L9����j���!�l��Q��}v$��qzf��JYu�uKEC�ǙJ��U�G]���\:�`i~:��+��~���z{������v��?���?pO��J���W����M{�u6��W3`�\7_�}~��}�4�X��e�f���p��8�%�����9ߦ� �~�i��C`;LC\��-��J2��,�;i#�PKEePQ�V�;f+(pip/_vendor/urllib3/contrib/appengine.py�Zms۸��_�*sc�F���7Ou_��<M.n��M��� �p&	A�V;�o�.���b�Z�$���b_�}��d-w\�Bdm�HU�=Ϙ$�TB䤠%ݲ�4;ڐV‹�Bl���u��%;������X�����<e䏻�����E��6��jR���VS�.2�ʋ���Dy��|�J�(�~�E�����"�M-
R�*N���DÜ��_^T�n�-�Q�{��(���c'��:i��9�2qT��e��Z�}9�]��y1`�-�F�$q����!k��e�fD��dұBk�ŀ�t�(X.���g	�"%R���9�ٞ�O[�c˨�5�۸f��L6ӳ��˳99���|s�;V3B��*�oh�E)����G/n�P�V4�_f��,7�JgRi�T�7�)E�GH�H�H�59��& @�S%gL:�]����[��md(�aXj_�䯢%)-�
�2ͩ����W�7;'w�i��WR!�s�ٰ��{k�Qy )�Ӷ�
-St�$�(��Wi�B(�0TF^���P>
��;A�m#��Š���t�������τ�R����^���5O�Ny.�r�Ĺ����������i 6���:������n)��s��-�^Y��o
]�3���,�Z����jes���r��i�TLv቟�W�ɗ����ӛ?_/����7?�Kr��-;���1�� �?�6��E������&ܘ`���l��r�(�uY�.G��!
v���m[+�e@
��kQ�l��;�&Pa"���d�6`�$�	����ۆ%�{d���O��n1���Z��Uj~q\��$���q!��!oj��:��*x�i�1e&�
�T��p]ע���?���G���5�����E#R�{CK^00�7rw��|�9L
�|�_?20t&;"Y��N���4m���kZ:#B@R���r�ż�c^13��"��슩���'��X��H�ܨa���`	���$JE8��[�|�G�6IR�PƊ��w���oa�2�\d
o���)y���'�����LAT��7�,�J9�U��0���~���ЀQ��_�G�X�kX)��a4#bc���-��2U�!
��IHd�_a.�2�6�͒@ϗBS�!P����9����a��Ҩ�~_��~�|�F� �y���r,F�^^\A�e�o����<�S�c�="�S�����N�0�ɯs�ͦ�ta�Ҹl+���ѵ(�a.�?T5.�j'@�W/I��t}h��f8�wz^s�C�Zm��4���P(��`$�������Ow�?��P��)�{1́�y:�H�r<>dli���I��N�|3�K�.���@7�鉳���<H')����a�%�Ȏ�*���^/�:����X�w$Y�J٣H#�ςQ�Ɠ����l1��!\f�6҄�[s��t��f�p�	$
ۨ�ڜѤ�e�ge��v�5́L�sq���@����R���m׮)�x2�K��g�0!�o
f^�}�����
���I��(���'(���o��]}���c �j#��W��֥bP?z�B�M�C���b������r�����f���@uo�'�ˠfvB������I&���Zd�^�?'�Lõ�L�0]��r���x��˲#��[�W���!�k�ߔhH�����܉��H����%�H��f���n��2x�@I��eB�X�?�O����\�l���N[�}����x�翆dT�
��([(���Y��ڣO:d��H�e��gnSap15g�٣��h��w	�t��/o�L�0�2��:�����`�CW��M�D�}�-��I#�i�e�I�-����@���=�t��6n��_���L���DZP�*LK�^k%+4<���l1��X4ؓMO�x(1,N�r	
����'�4�)�b\*E�`�On��>��O#���6G�k�8���N��}��i���ڰ�~Ӆ�i���M0�N�m�L0�ڍ�N���@�7�PvL{l�/����IS����Lvt�j��e�rؓ���0�����$z3�/r�H����)�. ��C/� ov,�W�k��������^tj"J'ճ#Y��^b�:<���m#aO�B�� �_������d�z9�4��sS��y��7&�	�[�%,-�"zN�R�r��l�:�{����d79U��<�a��;4��P�U	�R��0
�
��6�غ�N'�����F���118���a�ɑ��������#���XSؗa�b��ďi&�1s����a��n��q��\h?AN�y@���hs�U�-���gvTj|$t�=���g:H��(�
�=�B�ɬ�&M�S�cIe�_�װ�J��!��cvr؞�	���T�<	�Ǡ:�N��go�3$�*<�ͯ��8$g���H�RO�\��{���I���U-��`:�j�d�V�����b�g�<"�LE�i���( A��u<�ɺmT���=�R�U�����x��M�"T-6>�`�N������D�B6�L��(c���.���@K�a����~f��S\[O�I���#����/ �͍����ghtշ����%s�k�{���؇ň
`)C޳�%��3��*���N�I���1鎘h�_���ObU7w��o��]�7���C3s�1c�=��~�v-Z�2W�/I��#`�/p��y�+B�ބ@W鋋��?��4
�6l{G��.Ƭ�����f�Q[�����(�`���0	���o���<C��G��t��Y���������棁�dq����3��i�7q���kb���v�����P�	^�k�"�{��S��0���%��[�-}�S�(4
6��9����tܪsX��YY�;�J9���}F��X��9p��{R��2<�\�yuԪW;�#�;�%@¡A��5;�^�Bdt�� P�z{.��P�����W�1?�2.��hFϲR�-��ȩN�+O!���hM��=��b��S�\�
�nr��E��7ۂ����u�S�{?��L�¦$��~2�}�h�w�_��~.	��
͟�f�.��Gg�dÉI�/�g+��?PKEePQ��͡@'pip/_vendor/urllib3/contrib/ntlmpool.py�W�o�6~�_�� w�b��c02/
��E�N ���f-�IE��;��AYN�a�_,�ǻ���}�<�ݬ��Z�=��T�|G
�Ӏ�<W�mJ	�|% �!��T��ѕ�%��I@$���*f��1O �q�K!�yv^��"M��9��y���7�̧�����g$���*DaY��"t#y��#�>�v)��4��h�G@��\�Y3���Ea��]�>�]�<�X1�č6&�t2��K��'|�[��!5�8�F���; ~�4�}�q.N��DS܏�1���4#��*+R�0�$4'�,�<a*�?�j��e��کIc��<�x�>���&����?˙�"_B�
H)A��}�%;�/�~�Ẑ��6'a������&�c����Ti�Bp�`m��=��#�@��U���d�J�
ݤ_	�>��~qu��g5�d�EFU窨G���"�&f@�	OnD�&s�:]��v����y@���c�0ӟ�2�$��G�|;�"e���L�b ���;�֓ǰ,��l�h���o�l͑2�4r�"]V�6��� Ah�-��F��r���9�cS��2C�ҵ��(�[VJE6@P(��I�g)�p�F�B��;/��� ��s2m-�G�6��o�L��R���`7M�6P�Cr�Xi��mg�LzA�ũ�',�\��Ms�3�Q������ו�7#�;���"eO�}k͑��.��@�\���Rx��,���^9�^]oM�t���w;"Z�~rп w�'$�W��UR��op�!ԠL*�grf$<� �HG7�����j�_��-.���Ӻ�J�U��ڒj0�t��y�X��������#7<�u���r<4�X���NB�b�㛶���g0[/D*�J���֫�}F�$Ͽq��+�������kC%�t2�R��4M/`�߸=L�#��>��n5�qʥ9
o�M��o>c)�RQ<����qm��Gt�-�h��~}��H�y�&u��TL���4M!��ju��r��hZ�D[��N{=6�o���Wc��%��a�Y��ٖ��
vL�2^��pr�f�)>��a�A��	ʐ���Y+� �w�מ�X%�_i���}���o�㡢]���c�zѤ�V �#�;�+#*x��ZS.�.���7��hʀ��bl2�k�����_�]ެ�.�U����=h���=��cim �/�����oEp���:勭�a$?��/�ɠ�l�_'�a7�W��϶���H%8^e�k0JIs����e�Y)�v�
�uמb�iϾΞ఻ED�x&��"�������u�����}Ҿe�:�t��Ԇ'_���h#r��J�@��(K������3w�nڹcb���I-u�v�=�^�L�:׽c�~�2`���pe8j[4h���-;r�PKEePQ��S�*�@(pip/_vendor/urllib3/contrib/pyopenssl.py�;ks�ȑ�+���2�`��l�)a*Z��Y�%�(��q�@��@2DsS��~�=@����C�u�����{�{��~�7�^�MR���zU�Y����v[�D���R��ذr�Β�(e���
�,�VTl#�4��g�`�\&�-C��e�H����98�Eɇ���|Vi��d.C�`,z�2Q��/.�x�d��Ң�1.@a'HP�)��$�I�	0O<]���*)GAT,�G@��0z�DoQ�i���^�˷79ϐ)0��6���{��?@$�y)�2�W[歓,YWkv����k@!EQ���YX���5��f��֓A`��A��C�Y%���5��8�r��
4<˒��ɣ2ݲ�8�`"�r�
Q��a�<rX�M-�V����3("
3#+�Z	�)�H��a��d�ɓ�Ψ�jI%�n��I��0��Ӵw����t�?�L�����J��}��O���A��"�P3%o4	c���yo��9�؜/�h�!.�������gd?��(2t�٬HJUE)��/|6�E\�`��Qa��l��F�2YsV��y�"w`�j�U.<��gC�d����e)���?ɚ�w�,�WI��<�%�y�&��XJ!��(z�k�[mhi��������r\!נ��
C�I̒��� �F�͊gdF�ޘ�e�B�k�+<S6��B�h80t0�U�<�0fV$1�b\2�(�y�S��_�_M{`���E��pb�
p����TY�7̂�>�A0�J�< �E��$oE����3Q��L14r����V�:�_�}�����|r�n|\M����=�;��}Yr�Ve���_���$I��$�\�Ƨ�S.!����,�H�#�6�X}

�%E�L�m���H�A��9Z,���L�y!Ҫ�z��{h}��ۉ�f����
Y��?�1
�&��Y�=��	����qi�08��R�g�q�;�Cf�`���(�}����/u�i��#�LN�c����1-�m/V�(p]�1Z��2�����4Nt�	�0�?n��'7J�-�#��GE�#֩��ZZ���Xb���K2���%�
6��#�b�ov3R/".|��Ƃ_3`-4K�K󈑵���(�/j[����e��ăB8ƈ}�w����R�^ ��s��c%��M�-(�)�޻�i�oG�^Vaއ�b\��@uk3�x�7�$D���#Ƞ`��{�qe}#�w�$�����ߜ�\:O]���o����n.�4�ǝ�xҜB�����!I��l��?��À8�� 4����f>5H�)���6�!��'i�0_G��Ԧ���i��<��7���7ݔ���������0i!V	Ɩ��>���7������g6aon�'7�gW����]�n��&w㋽��m�����*�\ >�P�������fZz��=��z�G��{��C*�.��]�8'�E"�|	vVǟ(�����[��nr?~��9��t�1�|����L�ziPGrZ���s�3 �$˯_�!��}���W�K/2� ���L!�=�ߋ�o� �@�b�6цc>f
R�����u��rxA�@����I
f,^Èkqx���]́��4����v|���!�9�B��+�[Y~Ƞ�];�,v�e��y� w��e
�Du�ǎ
��Ȗ�.!�B�
D	��hQB��B7�D����0��Q
ո)������b0���~%Ŧ`3'e�a��-U/�(kh�:l���`�)fnj7��'�����1LRL�J�1&B�?}n�?��؄�P�D�c�P��/;;�hPn	�	&VLG�K�K�0�
��g���.u/MɶN�B�tɇ��Z;PU�0���^nY����?����v�7\�5�/�Nα�m��\��dm���
�<�p
��9��P�PX��j,9T��WX�n�Z9f�Qu���#z��oG58J!*�*��x���?��[��㬠���>���	���J���S�Mٴ�L�,��4���oM�
��Mr�Z�1
������Pƺ��UZ�l	(lu��+ٟ�F�KM�]ZB|���E�_��D�
�`��(�8��>��O&@TF>��m���!� &Ba�	T6�Ep7�&�j�`SDX��b׎�a�D�_
��I�>�_��<d\�]�����~P��%P:��ϲx��©�X֝E�*j|-�	E6����9wY���唕��P�6Z�]�Fz�?�G��Xa��I�c���	}�t�	�:�-��������+��"k'��Z�
��J��	h߮J�M���}Y��Vh.\`�;�l�D����)�{b���N-"H���I7}��Q$�ޅ�� ί�N�T_9�}� !�&����%���4�� �H�����!�T}���	����#�Kb�橹�]X���F��S�3�N?w�k�PPZd^?,�$���[�HR���1{?�n@$$�'�g���:�_�m������-c_��)��jr#>����	��>JIq�Z_�%��v�`��ݰ�PJ�Zl_1��@��!;v��(�W��rq�C_�ؠ��5�� LKJ�s�!��"��]���*ԝ�!Z�c��C��B�sx�]�@+'��ΈtX�:�.ﺂ/s^>vv;)�ʱl�b*_�조����h���~���!Ӭ'�P��<ZA`�V����Re uC)��otjFR$ ��qbg�v_�A-�%�(�\1�����mVz������
�/�nez�H�Hӳkf�A����	����}^R�,4�EX�~ �e!r�m�vO4T�AT�ɫ�'�����>5�ܓ��Y�(/E�gT���)X�]kh����y��ξ�v�O�݅꼋����I�k-@W�v؜��g\�)�w�͹��vt�s������������
�
�>��[Ei�[�փ*/�5w�e��B%d`�:	�E����	e*o%�5%�@a$�����!�=���"Tb��rR�T��q��ve�2H�<��.T'E��$��b@�đ�o� jLwT2谑]�c6�ij��3��(R��c����[�b��8�2I�lbi�PklP����잖/��mh��~��qJY5����Pm���3�^������UҨ��ٷ�Z��-$�R��T�DmC�A����|�!sqO���"���"�-=W� ��#ֺ�|�(�Nա�,������}��c���U���A���L0L�Ϙso�4b�`����Jpt�.��j�N΀���sM�
���7�e�€F�JB
21�(�;��N੒:��������S�3u*�ב9�H(�l^�7R���'>"���%�̞��Y�!1쐞j��+�|��.�ҥ]
�P�å�[$����6�v��[I��g�b��i�#�!��x.�<�X#��9�]K�'�g�@��l�ѷ;�BЎ�͉Mq����x�
��mk��s2A�v�T�`_ڼ�\�ط��4�M���U2��B�4��-P�Q���4���߳�f��t4b'����i����I=jx�%�۫W���S��.�v���	YM��iQm�s���p�7�1�t��q	6����d��e(U�����Q�i����[`jD9'�F7pu��.���Q���Q����Xl2��Q�H�n|>��4���>�_�|���`��a���a�M<Fg�]oB�M%�z�����#xoХ
����ӥ�0�;R�(±;��s�s����z�j����Myy}\���XXaP�%D��lWxzP�n��Ww��}�
sk�fL:~��U:�z�u�rX��_�k���|����x�k��r[�E-+��p>��2�NV�m���$
�z�F�������b&�da���$86�y����n��g������W�ٮ�
v`�~a�U�)�W�R]A��5Toiڭ�R�a�ٙ��*59��c�XnMƏ�����	쐋>9hO�5�ew+�-�,ݹ#�����V��]N��~���G��M,n.��K/�U�|�J�]��!��@e��˘�N������khD�Ϙ���a�9�]o�o�n��NlhK�'Y(��r�U8���Yl��e������X��8�3��b{5�CC�晱W뼱vk�rr5���v�M�!?p��ο7�]�-�?e���ھȰ��W�}s"0�?��NgiI3O;���z�?j��>��z��)J�����Vp�U�0vɷ
#Q�_�2�2�ט*��s��>y�֒m�i�^C
���E���GG'�AK�]H�*���N\>熮�p;�k�h�l
��J�k[;}%�;aᚅ������O}�2�i,�Sx|5r��1g�GSe����v�J.a�M�|�lV�iW |��MS��{;�間q��f�{<�ٹ�i?��!*��ns�6pZӄުv�F�S����h�AZ�[˙Fs��R�~�l��NDCF]�ïi����@��S8��.p�{��{S�S�uXL}D��e����5�(xo�%�O4��J�(�=�	{��b� mY�譹r�V���7���IA���"���!^���H�)��	5vT�7{�=��%WAx�gr�MEN��1�(��4�;> ��sNzh2������~��^.x���v��Z<��+�����v�^�����i��pnF|M}Zet�����R-�
��%u�D$�*L2�~x�$�%��k6B�m��LC��&t
+�A�P���_�:u|��QN�S�����?�_��K�t ��{i���!{�Z<]^���; 9ŷ!�)�E`���>���G�'�s7��J��X�
@��LJk��rv�0{��>���K��}V����:Cj��.[+���$a{��z��fG�͜�9{�ɔq� {�'�����Ao�h����*������\U?]�hj�5��H�_ߧ�
�Ń}m@b噝��[6�h8�WBZ>}v�́Ç�j�y����o�7S
�n3s)�L��1p�2wm�:-3����~�q�PKEePQ�$���#�~.pip/_vendor/urllib3/contrib/securetransport.py�=ks�6��+���y"s�3I6�wW#�3��X>ɓ�\*�Pd1�H�h��_?)Yvv�n�\��M�Fw�_h�GGG���L�fA�N�B��]��(�8�fo�C��خe�u:��(��^�b�[�$A=Hq{5�C�,��H+e.�\�	��S���eZ�X���B��j�2�����V�L�>2(O1�a�}�����D��}p';�d.�`�U�%w��NW�j�ޛ�4;YFwK�	@�Af=eN��r�q!�k�L�W�b5��:'|�=Ik�#`>Oq,���I��`�d2O�	�xR��i��00� .d���"��A[�l��0�J���Dz�l̑d��ϒ^0�L�$t���ʼ�Ye�?�(�3��e��=��Z� ��t#�<I���@3��Eu��B���hӏ�2r�irw4X9Ӈ�j�^i�Lג���ވo�~�c!dR���VɅ"y^J��(X��2
��5p
~��3Y ��>L�"�f C�2��xW"�ć|�q�a�D�D:z0��
�#�Cx
c\%���� 4V�������=M=�#��hA&���l���z"�aaμTHF��W¨��Y�#�G�S��Sy9�L�e��>��c�>P/�U��q��!X���
`��SL�9�*� /�l�@1Xt9r�Ҍ-Ғ������d��Ef�5�Ȃl�~"d�$���Ep��˳8�q1��X1��iƫ:�A�&=��9����(�0�<�ѵ����5KA	̶�@�&�(�	pI/4�/sE�A��f�l
�
�śקߜ����')�G���f�{�,��n@�@l�F�w��B�{b�I�;�2���e�l�ȊT�A� �LjZ�bd�q��iTXX�`����~s�E�MU�������2���Я+ymR"�4
㒖�~G��Gah���X���hG�W���,��eO��P��=>$0j0�?��ց�%�9(�X*�"�E2{�LWd�R5+ ٢���a�	idZ_J=/RT�8M��y����
+��ѼX@�J��v���^�KPb(zL@�+��hL-C4r4���&��N�Sx|���s2�����]/�Q
������[-&����R�]_����n&��T�'n���j4���է��{��^�o�����ߎiPn4�"�������7���|��^#���D��Mr;|��O�ͧ��x:4.��r#
?�o=����~�_]�p��	f2A\�`|��d�í�0����wC����j��W��Ǟ���R�1@�ybS�T|�0��8n�܎��8����v�`Ɠ۪���t���h
(�4'cI���^���4��?M�6N���"���9gn�����D_�+�0#�*}���Q�Q��/��	y�/�eI��HsoK�g�+W��,����E�m�J@?���>����y�qBh��w��,"�����Dh��������%V2;��r�cpb
�K��A%ʬ�ԇ��˧� ˂���5�b����L�/����D���`�q:����`(�l{&�q�}�|-�h�g�ExC0u����G͜����/�\bDo���#P�2f5q.��Dփy�^r�so� ��CG�h�_��t|��ڹ���;�r2��觟������5��N����?��Ṹ�J�����Q6��
��?��X�u�C߫����D�PǗ薀�%s�
>a�DQóAf	���/�ٶ\��2��[eQ�3�K
��4����"�$I7ࢽ�c6OA�A�"G�~�=L���.�.*�ΰ@�PYi"@"i���Q #��cO9!F鮔9�|/��ϕ��:�&��gc���ʐ�3%��r<�y��,�vF4(�B"���K���4�9�b
�K�]
-�\�Z0�����
]�S0��XÍ���[������:]�q@�V�OB�bȮ��æY���10�c3!V%x@.��-�$��"��\�
��P��&�~
M�S������MK�]���D�@�,���.��Kp3pأ�c) 8��IE�2C
 e�c�>����J�|��9�B�����A\ʋj�58|��6�<��ⅸB�Q(��O��W�5�C�@����/���������>0��hN�FjI׽
^iX���c7�[�3�����㿻�:��fp������OK��!F~b�	H�Z?]/���n��������_�E�%�
M�C4�W�њ2%R�3��\��V��AD�Aek���G��1����'��u9�¦y� �󇃋C������S��7��}��`⽧t=}��
P�w�<w��sG4���{�ڿ_�x���7OC��ݟ9߿�l���w��p��diP������Rt�wu|��:�]�$1����=s^ϙ����?c]=cMU���=��q�����Sb7W���ʛ�����,��d|;��Ёx�m08�	�k���.H�@{�ivN_	��%�R���te�	�
�U.9(t�ѫ`�/���@��w*N_{�}��9.�0�}kVQ��0���	S4��������7
©��/�w����hyPY�l�q,ׂ�O�����r|�d�=�Ѓ�����>
Ƿ���>�#��p��^-��Q��b���a����Ru8�ݢ��
…�\.D�Fc��2��c�����:( ��{�Q9��	�F�@�N���,H����Ag ��Nj�u�C�>l`{ޏ�����dx;�_Oo0S��+6��혦my���BVeQ϶�lQ&��/-l��1Z��x�Qr��N���N��i�J����!��L]�^_��]#8��=1�����nZ�J�K��2e�����V9��~Mo�N��6�8
�aBm�T�	�儗5��E�*qi�1�Y��F37u����&�q��v��S��F�Q2�@$F	m��U�Y�����j�0�0�G;~z�sݥ�V�l��z׭'H�g�v<*�FZ&�ڤ+�v��Z���
����GEL�aҏ�#6��~��"!�h�4#1�$�i@��@hzA�W"E���7��� J�w`2�R۞�M���h����HU�����ī�G�.��3����9�S|�o��ƓpY&�~�MټL��(�z��(�P�b�W��6VS�j���5�=�۽�q��{0rQƭf0�}-����5%�3��z�H������;�W�a�g���΅)[͉�/g��|��<����d8��Zr_ތn��$}����.ְ��
��p�L�j���k�`�w-�a"�T��u�`�Mo����]��Qt�*�e����(�K����%��6��tqeX�2Ȝ�Od��5����l[���Nl.h�t<V�$w~Pt-��@������v�妆�;���-6��5�noe�*�ՃGsbK�����4U��Q{.�j+���lS��O�=����"/yG0�/�x���ܼ�ݲT�*ʫ3,���Z͈�̟j��j���m숾n�3gK�M��ط���6k�^�5
:nn��C� ���I�[�q� i����A�����sVM�	��OeҰp!,V��| 0��z^U
@����Wr�be'V���x�<�\�f��?�`٣�/s.wH3x��u�Y�_�R�(��@�K@�k�>�8�~G��؈���1��h��̯)���Tu�����K��"�E1�VL�8N%:/�}l��C1J��]� ����!K��<K��cޭ�g���1e�����u�����T����&]7�ڏ�_�+�����e��)������j+3m����c�=
�����T��Q�_���.��֟G-ƚ�v
�t����<x�J���՗\�~�5�]I���,��	@�Ej������/����.���p�,2�mN��h)
`jDU��u�T����P�$��gZ�G�*!�ڠ#�V��G��Fzq��K�]��hn��-�߅�!��!����D����|�
�k���.yԂ�
XY-�db|px٩A����%M�ZWP
�'�g
f��ʰ�V3�K�Z��b�1%�*H��
1Z�e=ؾ��YF(��d�`�8��4SUak��!U�T��`QH�� ,j�D�Dܶ��
���d#7��^�>FxJ������27�W��J���^��:���s�UH�|�@mI�,��T�S�`�]�5��f�I_�	���
���6,��=��/2�H8��=������&A�'=[�UD$*wm�������a�\d�����$��:
�����VG���
rE��_�a��B'@mA<��|�?ڃ�gmuY/�2/���y*s���g&�;:��B���
�bku�)�п��i��ˮ(xTUu�93tt0���[Q�}��0�hzz<Ţ.�
f�t������+���
�Hf�q���'[��5EO��k��U��Jw�cC��>�M��Ry2�sE�!�FõC��٠�����[��Q�7\��<s��pQ�������k>�$��('���N.�<w�E�"�@�A����8�	��'~��y�=�ƞ�P0��bG�
�x(�N5կb!::�ڂ�J��(G߫���C��),����B�E3�3[�P.<�0�)uE��x1=MA��->�ȅ	��;y!ޣ�!�}��v�<�98(����`�§��ߦP�y|�S��(��H�Ul���S	c6���3��UT.;�IT9�օ��Yfb�Ϲ>�T<�DDXt�`��S�2q8��'
�{��H�/e�ќ���f�����$�B��e�E1ᱸ)3�D��C���m!`��6k��1��C����V9m2�щ��e��с9�*.vw�Z��J��H�Va/"pEd��bv�~ˠ�$��q�9C���xBon�e�g���ih4MW�=��(���+;��>(�
.'���q#�f���~�^�&�
ݭu�:���=R
u�(	��!��`��q��,>}Jԡ 9���&KCi���L�y�#�s�5���j.�
��Z��	��hO�QӜ��Ϗ��[P�N	�2������>�3E�d�B�-��Ҷ�z��N���x|i>42���r��_�
X/�@�w���"uN����PM���Y	j�G&Ч=fu8d'��P�$t�gUf�s����m?�Ry`�S�,�������vh�^�+fޒ
�.���LJ�5X"e�req
��:w��]�������lŕ�(㤴52k�[�N��Beٲ�vy�1�����IО���_<ٝg�P�T,IW�R���h �;���8$��S�w@��[R��ի���t-�*� ��m�G�P�x�FSv;J@X�,��:�,Z	ň�"��a:A��S��m;�d�/5�s�Ơ�ޜ~�ǯ�{����=g��S`��j�vT��귯��\�?q��UR��pՇ/�=M@F�*L�"�"�W�@#/L�nij�$��mr�+}�J[W�N�v�Ӑ�c=�@'�������|="z�)��\���)��l���<�_��]������G3�:nO�,Z��8�E���P����*����1rE˰�O��C�������򬶄A�u�o�B����g�13�G�Sw�.�L� [Gl�Q�TC�=�
p:�ԩ#�
(�u��H#n(=YՎ��ӌ�F��[�rG��̸~���USI�\�)��zi1�f�wH�q2%�a������b9{^D�6��T2�9��FSO�n<��"�DS�w�v\4���&�j8�{�ӈԾz��y�h?�/lG��-�)�ٰi1������R*�c�h��;j�R�%uT9�b_����^��Urގ�b���m�ʶ�GEI�,*ŜR��%l�ׂV&'��݁P��F�j�X��n^:�������B��|�T����>��]�j��ޯ��[e����\�6�WKo�SS!�e�*>+y�7��zY/S��6~�U��NTC�Q����j���Og5��]�P͢�<C�f@��p��Ø����5��p|�F���2_4H{e�zwN�ce���U��O�����s& �s_RA��k�ގƟ�Y�C�=fMm�;I7Y�5xsKWq�II��S��BRۛ:�.m��U�xË��yb��A����qW���΍��.y��\��)X��%@�S�>�>�h^Q����V19_iuT��C��t��J����"p�Z/�
�
Px倣�L���S7*Z�N�~�ʉm�qD�����y-�X�AQ���JSm�0����mVI��F��f�4�0�}��V99���#���_S�J��]�*WrvmȵW�;�Dc�ga�G�]�R��޻�p�=��:�Y�އ/�.���<�x滑'x�&+Ck�r:’;]%��T�9U���M_���u�
!^�̰�ɘh4����49.��P^QXa�;ճU�k�eT��j�C��I�Ɲ
c��7�Q4�Je�u��I�Bu��V8hA	�gZ�'�e-)"C	��m�8H��9�+�{;��wl�������7���š�A��e�H� ����pPTe���f��&uᝮ���yf��J�܈��z��Y�MsY�^6�.������fj	�p��zi9����V3#T�a,�Hk�H�Y\�𒲝E���„��i[�Pն6r��	ی�d�n��q-�Q�SQx,�7���ʶ1��h�cn5�U���w�MD���|�����u[czgל���Nj��%�}���FM���^�gn�ࡠ�9�\[��Sv�D���x���S/�68���Mm�t���ԣ2/��蒙e�u,�`�Օ�2ƀ%��p/��AԶ�{+g�/��x��{m�,L`oAo�o�=.��L�� ]�R�0M�v6���O�9_�Ԕ�RF��(�v�D�k�i��JR������
p�U��
(��З3����3��/7	�_R�������Ŕ�H������<���N���ZN
!�V�T�:��)S��{�4�=L#��"G֩Ք�����U:�-x�*1��ZRa��&�m�G_�@�қ�����.Vf�=]�,�MI�ʕ��6�P�;�7N$�g���;`�op$$qpg~kA���UOWo�M�I�#g�3j!)��
���t�+`艶U[��.�T���s ��@��0��G
u3�RT��ˬ����
�,��&/�쟡�텸��ځe�'��<g��x=�5,���.�-�8�N����
N�
u��tU�$jXm3��W@Y�]���J�����gXM�%�f�ަ�E��O�|��Q�?>[e>t5�k{��[��f�Z����I��T%�&6����]�
�F�8<	�^���^Q��q�QeKw�x��)�]0�E�������z�'�5�;T�,��i킩�i7�wh9�F�w��U'ͯ�]Z��M������=��A4ݿ�����:��!���7�kN��n��Ix�i�W8R��ȧ� ���{?�y�^;X���`w��6�ʹIħ���H�L�>ò�Zx�����:+�-J�ʊ��l�a;��o����=��G?P�����n�Υ�ד�'����a��F��TιܼӡY>�U�}�eGz�
�9^�
���yu��߬�suئ��z�_�B�/S�}��_F� ��#��t�R}f����7o)��p븶�53	�����K\�ڜ9��:{^��\��gP��ۯl?�>�
�0}F���.%��z���XU%("�"��
.��S2������_~�!��?����֐d�Y�J4$�(Ԯ���ú��+,���h){m9��J���;����?���^6�Q���q+�f��N�.ex_�$�?����SR�ͪ�@���sp|U/.��^U��������N�&~�	����\-'���fgO�΃�[���^�Yf�\��H%��2ܟe�†ޞP���|�SH���]T6
�z��-����YYZ��v���M#_%�r��:F\}�jz�'������<I��Ħ�F��z�F�O�lke��U7K���v�:B��Ip��R��/W�L�4�L��Ӛ�:��q�H�}���[�[�c;�)��|�%��!��'��d���F��E��(F'�f��������9cGG�ő+���nL��`Q�:g�`�x��E��nԷ'I72��e좔�J���7�p{,w�;�2P��3>�R_BR��=NC.�0 �q
�*�)U'�H`�7�dw�>_V-l�A�N�F���Ib��>ޯXHdW'H��|H�b0�ϩ^�P!6��U�����hS<�Q�xQ�Tس�����ZU]�:5y�+�*���e�,Qn��Zp(븷�p��ےh^�P�����?�ԫ����S�o�Z7
ص���ߝ�5�	Y}G����v����c�v���9h������-���Zi����J���>����Bj��ڴ �{*����A _���$�#kOBid���K�;5��b�_չzn�R�\�+��:�j<�u�\^W�+����|¡�^-�9m~����U�wñ�Q=|�>F�w�aM�*P���O��e�j��U���6!������ς�;9�e���&�y��mؙ���w@�d��@�A�:-KU{�dG27��p�AL*?ȗѪ�ۅ�?QJ@�%k_.��Ǭ��z���&��}صn�0��Q��}���n�6�6��^҇�R�cw)nUl̍0�m�Oީ�рG'@q�Fԗ������>��ބj�膏-=p]خf���r�E�z���3j{�~��~�z�x�v$�~�z8���:���q`̴5W�Y��7PKEePQ]�V#F|$pip/_vendor/urllib3/contrib/socks.py�Y�o�6����Pt��{8���)�ȁ�M��٢d����D-Iy2(���{<$��m�#��?���ˋK�����S�����q$��8�=��T�h9�ZӲV���T��)'�m!59Iv?���g��L��9��X�Q+9/�MH��*��z�~�#+Z�E�� ��&�B�"2/JV�=��qh�\�J}��2I�[M9'7��?+"�!�KE����SHww��K�D���*�����p��{\whQ��!�NZr`T�����ӄr%��"��8����<���^ww��s��ow�4��J���n���M�^XI%��f��ܲǥu\�`�e��ɚV�`1�P�NB�x��4j ��$	���4�<�+��rQ��V-H�:���B�F�B`D�G�{��!�Y�H�1
}F�����(�p�[cRض5���lZE0�9�Z9�%8å*p�#��|��
�P����8��S��n��v2�{��wg�h�����L�`Ïs<9.�N�Ƿ�V��uG����N%���-HM�
V�*���Zka��2���F���Ľ�^Z�o�af/�B�1�_,q�:�����Ds�9q<ؕ1۶0U�2��
�}Ԓ\�E_z�oӗo$$FX�lYvh��g���toܒe�;��<����F���F�wf썔B�NT֠=e��NIb��^��z�<hu~�h�T~q�/+3�O��Ol
�����~h�N�Q���Ի�hl�&���@I�jX^@�CLwA<!�-��JH���R�
X���Z7
l�󏄳�"WI)�X},��^an��>9�?3��ty�G\o�׉������T,��E(����mg���6D����o퀃H0DY��ooo^u����!������`��/�α�x�N�z3�p����E@��!O!�'`'O�P����W|��a�l�{�Q�Ν�=o���k��"�~GQ�RC�5Z!��M�pߊ<���$�ɼ���K�e+�aC.��W�s�ono�_�!Ɍ�e©{K,h�Y���x�/m&W#)7q�t��x��)C��O^'�����:��@j�0J��,�����'�_���`�W��s�Ѣ����A�+��T�'��Y͠����[F�B�p�G�<�?�\dU�"x��a��Ǩ<�t`
��;��?6��sö3�bWT(X*ğ�P=�v������c�q~y�O��~���]]��.��E������:��"�1����3�ZG�ߛX5�C�1)c.�N=���h�*�R�<W�y�S[����N��jO �O��я�q*�u�T����P�g��+�/��%4]@sdr�r_�1}W
��3ND��P��qȦ�!x�]6�"�dɀN>��҉�6oT"@�V��:g+fs���)2>�����7������dS�g=UW�1������o)��)��b�IA��7�x��l�6{��p�t�����|�;u-/�9lhn.��������H=��Ҡ�zF>2쟿рc����o2�Gh�%+�>������:5���j�����9��
�!�x�h���s�c����Y
x��h �(��Qb{7���	W�T����{���^]\�h��zg��V�JL����`O��t1��F.�`�ָ��~5r���W+�ѦS�������e�o2��VAo0��]��/|���F�ˠ��}H�2՗�e
�^.ޱi��Le�sfr�K[�.�tI��!�
)ws��δ
���G�.������'��U�p�n�ET�?��=��
�h/.z5�E��	2���
PO׶�:׃j���3�!
"f��/8^m��\A��~_K���U���\�sMή�vK�2���M������6�>�%��'��]Wp����Sv��͛���k�ҷ��lz�z���i�^��=��������:�t\$�|�#�-�y4�`�ՀI�i&+.z���=�͘s�o�;?����Q��ˀ�Q���na?�z��ro��4n~�Ⱥ�,�O��_iwrF��J����`c~_y|�6�6�H�&� �� ��o���s)ILY ��PKEePQ8pip/_vendor/urllib3/contrib/_securetransport/__init__.pyPKEePQ]��A8pip/_vendor/urllib3/contrib/_securetransport/bindings.py�[{o�8�ߟ��â6�v��i�=�"ˍ��mXN��ba�2�"�:=��OCRR�d��W�E���Kj�ۭ��	ё�b�8�!�����:�Y��@�o{��=�Ï�!^�,��GdyQ��9�Ll�^��$��h}��X.:�#��ytvE�璧�.~�.ҖS�T"�Y���{�c�����
�z��/o��p�����L�'<�'':�[�6�1-�� �9!ޡG�M
�"ў� ��Н��x�7!"���`��l+x�#�C�#���!��mD��`��s�m]�/ǻl�r\��}4!(oE(�VH��a
��;���Xpe�QY�#{ڒ耶/(\Ph�&�l�QO��Б�&��j!���%p���]t6^����F�_��翟�����_�o���2'�~t����0x׃���:�>X�=�Q--���V��md9u�ŰlЁ��B����S��0$�c&�;>B Xt���q!Z;tp�f����a�=*ڟv�a'1�l���n����ݮst���A,~ WzL��gO���D?޺Nx�!� ���4���
W
lzbp.�8`Cb��,|Y�PG��x�ȑ�2��*p�><ͣaG��L���
�'.�5bg簼I"�檵�bv�X�HjsU��h']���w ���ML�,-!}Ml������2����2��D����tl�Q[3��Cw���v��b�����b���7��t>�!���0M�X1���r65�}:�g�����b�fӛ���&4��&�1V�5<jW��t����d��S��b�4��V�~;�Vhy�Z.L��|:��@�qc��}�m�
ȼ�f3*��i�`Ɋ�����j��z�����Wh�]�.�g���ڍ��`\@�vRR�)��6h3���_}=]̩I�b�^�c,^�3���i���27s�1���`@�;78u�<J@B�oMC�ilh3�4)���o�a�S�l�q%�AΑF�`H\Ț
n��vߵ"��G���~A�L�0am��+��^d6���m�^��x��,}�u*�
���&J��/N�W��>}o	q{��J}<���r1���U�۹���4Z�VH�@'z�T�ϒ]����-gO�I�h�J��O�(#H�i��N@P�	Jg
�M&6�m�l�Y�S+��$���Q17�J��-��?g�?Z0�8�t����ø�	E������;0d�tB�D�v���2�%�_Qg8�ˮ�6d7S�5�?�+���~G�A��I?ိV�اf�I���K�%lg����(��I*�1��ˈ��l�>���H�ݣ3��G>��w[/&L�A)� `�E�x������g�@#L�ռ{Ã��G>g�}c+�Xϱ�Znӂ�z��n��ںX�3�34
����ܴ�+�L�\G�~Ҷ�{hL���ۺT3�m+"'ȐZӄ�,�>�%���[��m���b/o�N(v��n�E"��+y��K֓I�a^��쇰�˿��4_-7�J*�:��}�~N����x�p�Y.,t����H�F���j�=�ѝ@�RO9�J�L����}X�)Ѐ�K+���KV-���x�"��2 ��+I1g��ò،�{����+ -��~��a6*i���%�a�F
�ޅOYˮ�m1�N��u"�k�L�V�X�k����Ӵ���!���ϐ��Y��r�'4e��7��)V��&�/��*v�8�$�
T���A��g���ƅ�>-K����_p����%K.+��eYi:6T�o"�T�D�[0]�
w��`H#O$��<8k}Y��)��z�`SVҨQ�I
!�$1A!��${9m�c�u��4�zY�T�WÈ*d�\Z�{�JF2�K�'�I���R����4I̴p�	�F���[�"�c�d�VG"X+ԣJk��Ƽ1vq�<Yh�������o�9<{�"����K�+55g+l�&�g�8O�x�<m�Sx�H=a���n7�-p	53�>��ٮBJ��-�3{4]P��<��2�'�ܓT-�P<=Ԍ|�qP���Y�d�w����ت�S��G�R���D�E���.׺?�}i58���T�,�ND�{jEr�W���L�a���bAl��5l�Ã�P#�,*gj"�&��S�rY	�D>�۟��m����U�M�am8��[�)Ki��6�W��P�Z}�Ռ�Xyn�����Of�zrSk�0=
�M���Ye2Ŀ*Ԫ��H�>�~�_��N|O"vY��dUA]�G����'=����cS�:�UmT�`�D'&vJ���Y��y2\��5����<��z!,.�S�u�Z���=��*�j�*VA'+e<Zn\Z�*��(=�+�T��_�5�Nb/�R�B�
Aܣ�k�Fҵ����	#h�H
��Sw�]MҤj[(��/}�
UA8���}Y�����ʹS:;=���h��2l�e�\�n�S
��5v�;�����s��?8	�N�'�;��s�p� g�T���ʈ�E��Py��ȗ*O�2b�A]E2��L�)7��J�V�6�E�6��j�p�����?VX���mv����=Ԯ�h'�9"ٝB��'���,^�G���u�}}���-��A{r��g-K�d?����v�ΓK�WP�L�q�����GH8~V���\�|�x�/�n�u��dt�翖QPp]~�WҮV/3�)5��BUU\>��ɖ-˿�*��5=�V\+���i%VWya�d�gػ�5�۲�k�*����C����Utr�6��/�=��é�=������T�"��/m�)�W6jïd�4����I�{���H�/�T�T�5/����<P���߮�u���hH�}>mI�
���aJ��E�/,ՙ��>�v��(�ӧ��Ռ�V��6�x�q��i�J�����q.�TMVB5�\B`��ނE.;!ZJ�>����(�*�,�fO�g��NK<�B[c�j��hP���w� cI��R�$uK*��Q�Rf)�$_kWy'
w�P�>�u�(�T�폻���>ϡ8���Z5mم���7@�>|H����
q"�|A����(DV(}`d!�:�зl�>ɑMcPٗF�L��P\�ݮ'�������yp9��A�|��	&��Պϕ���?,<�8��`� �MΠyXjA�o]�̴u���V���L�/�
�)�vj'{��_U!`D��G�!�}Z�7��`�'*ˡ����9���?����N^�̭�!�V��j�+l�Á�qc��س1���S�b{�ݠ���>��3�{˧��0�^��~�$ğ��;O$���{���؇̡_�
=\�U
��GF��[l;{�)x�"Ya����Y��r\X �P�O`��߫t�ӗ�?p�� ����~�����7W0�=$�#��](��@�8�(�ɜD��ߗ�-
O�^T�wz���s�|�)��}��t|:�?vJĊVQX��w� ����7��HeE�n��<y+B�Q|Bq&P�I�S��5	#�.ōB��Nr.��˨�:����@s�@� ]\7�e$:�
�3�>BP��k��9�蒼��������@Ec3�-�r�@�%l�5՘��p9���$�X���ӹ������@B��l6�#!&��ǂ�,;^cG�P�z���0d<�|߁H����f�8�d�=;a�cX�+���CiB
�!���ӻw;�]-��ͭ����N���]��%���a�n��
�iC��p�@E���ڠ��چ~?��ssv�~�E�٘�����g}p��V'YF�z9ó˔	�S9Wur�,�j9�����b�m8\H����J�)�ˌ��3���j�U�`�%�J/���Q*�\6��p��B��y�����W��QqaVV�N�Y��Cc9��*�KM?��H�Q1������XM��U�����L|9��8	�P
���"��D�p�pt��, ](�d���PKEePQ�
]^�.9pip/_vendor/urllib3/contrib/_securetransport/low_level.py�Z{o�8�ߟ��bQ�p��P,��"�����M��W� %*�F����o�H�v_w��29���f��t:y�7G�zP�X��Q��6�[)q��ި[#�Ѧ˲���M'�ەj��F���n�kQ�u֕�na���Zw"/�ʺj+��d�r�i"�*�V�Գ���d��=*Sm+�ީ��F��T��[Q�Y��p�جt���^	]��I29�F��}�K�I��&0.�R�9uO�Y�Zީ��;�-2]gʀe
'��X뼯�Y��Z���� H��:�E��|��@�R򾥓�JT�D6�1%聾�[U�[�I88T�2V=��U:����5[A��g�S�mպOe�L�u5<0ʽ�ó����N���'��k�:�=y@�m�"�(|~y��&��#�hʨ���F�ύAu���)�H6�3r)�^��_
T�K�0_^����8����Y\_�S �fz�w�D�k9=��o�_��������=�X'�_gk�t���Ί�)���={�j2�sU�EV,����Xn;�&�g@
�:u�/T
L�s�E�}� ɖ���fINJ��[��6H�7�
\��ܒ�3YUʤ�Fu��G&H��91���h��˳�ҙ�y�
�W�<�Ru(1щ�SRXCD�����@I�瀂*�g��M
���F��YI��N��Nn�x�j�ВG�=��b�-�}�^m9dի���"[�V���&w����"�>�H+�i��Ҡ5O��9B;ֺ�@��>K6K�ঁ�?�h�6���.3l���Z1�|�4bp���P*�؟j{A����o�o<~�/�c��E�}]bNM���R�g�;^%x4F�
�XN�;ݡ$�O(c��6�
�S��0J�?����/)yT��I5ǕR̟��`�>��A�/d����h�]���l;n����|s{q��v��:���t�]X��Uw���v�{̈��&�qx�E
:���n_>�����	½ѵ:h.��P&����&O���l6l�j�-�{�������0^ +��$:�������F2�?`Ԇ��y�b�0�=�YL��]U�:���&������*x���Ѐ$�^�?'��{���"�`�)�6����k)Sa�VFo0!{:(,xU���NQ����T�>�'M\�%�Ax�bRxsj'�F�y��gX�H����ѫ�'��!�g�mq�]�d���0�z4�{*���8��O�nn:�������m��h7��N�77�.<���ʄY�9�C#-0h�:��s��}����Fys-��[��e�����v5J�x (0!$ʜ�.�J�u�1�*�
�����[�,��\�%�)xe%3�,���`%���֦�',ک��A�t��3� m�J����lF����F" ��և�%Ÿ�ͩ�r�1AV��L�ha4,ǥeQfT��Fe�A�No�}Y�…�u��e�� �8���[��1豕�Ou�}�
|���u�F��ccޔm�~r�CO�I�iP���<{T�F���ޮb 1�v�㎘�I0�i����ن��n��D�s���hs���h���jcٗU�B3>,z�r�����'�x/b�C^�iS\��酈���(�BgK~�|m\�K����Ɣt
�s#��嚳"ho��:��'B��
(nt��v�{�r���XRVP�j��B�-�I�k=�׊S����,�B��@���T�>C���s�CR�/������Xx�@�2G��m\@:��7Iri��Y�6؏A�F�1Iru��
;�k�	��n��CvS:����u�(CV���{a=Rhrԕ�	5�0`sN81<�S���L)�G��Ƅ�g4�H�:�Wv�Ǻ� -��v!��2'0F���8"��'��G^@l��F� y2���S��������G�8Ld�����8V��w5$����\���$N� 9t��4�Γ���4��ZI8���i�o�3܅��U�L�����K藔���F=s�i;Fe~��͎dj�أ�3H-9�N�bSV�9Ԅ:�Ή�3�|~��|PS��Z
D����y�QctG~�
���!1ht7ʒ��=!�g����i|bĩ�m����1�� �����jŠ��'�?�vqC}���O3��x���#�j�:�.�È8]��>�iߩeAER��/�w���R��z0�ӛ��YW��_v���4:{�4�����Ni���,��'�N�����x	���W����QpcT���f����Y��<�y���t�P;�s���pVl����ՀJ�|��el��I��@�'��p�ȴ>9mt%F\�}���`m��K%K�j��Ei�2��	���-�%�`�����[D=N�Q�
�m�j��q�&m���&tC��^25���_aױ!��v���Q����¯���d����'�O<�OѾ����[���.�b�=7���w�(���M�9G�}�Q��<��{��?BD��K�l)�r]?ƹ�Q�	l����]���vL{�=YQɻv?U�w�+#�x�0��^b<7+�z8��X��I0H�\P�hq���Ю3"sMO�=>���xs�C=g�H��	{�Ie����Y��tx���׃p���(]�@A}��e�B@գN��=�̵Z�J5b�����{��!i0�A���H���)�O��� $���I%8i��ңIB	��3j�JB�����,����]=�.�`t���^�񽮿b5��~.|������a*N%5�{V��<܀���>��]�5� G�zO���}�����j���r���.T�,��YU�2�rg���S��W�+����]*�	��]u�^Bq��A�GNJ!`eE�ta���X	�v,t]VS�Z����8�^k���N�%� ]�%�)���9�
Ġ����I��=CZH5���M����0�|xg�
j�&�0k�]�p���{}��=phI�5譥ԡr�P97`n��bv�C���:�
�i@8��'��J���ěB�e̵j9�/j�j�(�6���/�:����-8����/E�=��]���Ë��􄓰d���;iCY#��0�mtUf��-C��;y��I^H��#q�#�eAx��H\H�APm�Dt��D��xC���R9�����xoiQ�@���@��7��C���H4�|@�ak��+�	HL�9�χ�ex�FH��f���h��EА�����@�Й��%�
�a����������a�%�U	*G�ڶ�R��
B�b6t�)w#$CA��a������
~9b��h�=��&ѽ�7.��	��sŘ�(OisD�r0GѬ�R�"�h��eY1�Y�V�|�a���S\gNf�Z�T�f���s?��!�����A©��t��H���z���W746�]i�u`%�����A���d٭�;E��b	%�j��~÷�#�/���šo�,S�z��3�"��Zmaq�����km�@{��<���">d�nf@�zb"��X�\ZP�)I�L��^���"'x	0�?o��B@
r|4W�_�a"����#����V�&�q���C��_R�{W����ф&d0�"�tpjs��F���;C.�ȏ��)�w����lp��(�l�!��q�`�����n�n��Y�d�9�3�U�D����0�Q�8{z���
���x�_�?��q��G�c�S��1�~P�2�>��OF�_,�Rĝ	�J�"��L��=�|Dh�2ig�7K��='q�EXj��tk��+αs��o.�'
Z`�������j���Ndg��PKEePQ�9��Pl(pip/_vendor/urllib3/packages/__init__.pyK+��U��O+-)-J��W��-�/*QHL*��)-I����@��`���9�%����%y���\\��99@l4�0�t4�PKEePQ�U�#pip/_vendor/urllib3/packages/six.py�=ks7��+pt�Bzi�-9�;W�
-�1w�:J���&�!(N4�a�!������`0OR��N�2g��F���h<x!���&�o���y}q���W����2��]�������(�輀�x�'���O�R�r����r>�XJ-��t�[9i$�p#ք/�Y��
WxP*��t	��h�>���p�$�|(�y�e+�n�%.�@&��.��^)�n���K7z�.��L���(KE,�4�=�2 /��ȇ�����@tG�p�@=�ہXEs���*��f��,b�#�Y�Bb�����Q, k@���9���Q��U�)�hU���<-�8�b%a�#����RLA�E�VЋ¹��J�Q�]C�;��%U��=�R���X�M����b&��h��[�U�<$)��b�Th��Cf��X\]|��<����J\N/~���ODwt�݁�<��x��Z�tt~���� F翉�M�Ob���t|u%.�@lrvy:C������g�0�/����lr
d�/�HEl2�Brg���Gx���N����s���b*F�r4��:M������X8���S(g|6>�B��&ƿ����8:=�€���a�\���ߦ��?^���'cH|?�F�O�\T�t49������1a]�!2����1&b�#�w|=�8��_�_O�uu�^�ϓ��@���+ˇ��V8D0��L�^l��OWcCR��G�@�
���|��t��O��ƁN,@)bx&=�K�,1C�������! v:��qY���q��B=}M����NG�/��K�(Ht�~���*�i�dc���Z&����CiG�[qy⇙J�iM�����.��C>h8��9���4>%r�Ty��@��8�B���X,�i����;��	�l�I��"��F��>l�>�췵��nďG�w8o� ���w��[�$�=x�)�/~+�<T��W�3�A��1��#�)m�n�ѩ�M��ƌ�ѯW��+�W�c�Cvd��z�fn"9��ED�m3����c̺��*�Y裆��5���:pSh��|]�&؁���n��5��⯬�n��n�Cqx��dh�rY@z�7��᛾x%�0��X��$��s�yH�K9J0Z�H�?����I��I�y�$�k/������r�HP��Y�R6��L3�Վ�O�M��~�&Q>zr�����M�8��"���+�P!q���rbZ߿݉��%Zs�_��I�|�@�CO3�XD���h^N0�a��v�
A1a� r𫉳#r ���ݕ̩O�Iq�@��(v��*��(J�FM�rj
u4q��v��#�#
�̼~X-�S���xqQ?X/ pK�b��-�a�Ӡ��ӱ�ne�d��&�eY���!	^��^��ioJ
�r
�Of�Gw``��`Y�f����-��6�p7�:�{���'%i����W�J,Wѽ���5�3Ò=�u�vL�U��q�RF�X��-�QS�L��AX7?cu�۲��M��C�pt��6͠��Y4���P)��a�4���F�Uw��Jc�d��(�ɇ3����i=*�1%���i*���b�a�EI�(�d���m�D���y)F헹�Ԣ�����_���n��-R[ژ�j��zU��3l)��ڙ`%�s��U��#�7%�� >���
�p�ůPCW�NrS��a� V�f�.��F~�\z���la���M�̌�>��P	��S��=N7���h�����V�t��[%B�Q��i"@���@���a����SU��&�`wv1u��^!�$�2�[��>��LC*#�^he���=��(W���]���i:2�ߑX �I�R
�0��-��hC	�� �Źs���\. �(�/Ǘ�����@уȅGf��bg8y���1&j����;�D
�W����jlD�wh*�d�P%V�%�)Aa���!T��E��/�4.�f�饁x	��)%V��t:z>S���2��Et�]�_��K��H������O+)/۵��iS��y��[��]�c$\K�U�?6�>���U1���&��]?�����{]�Vv��A]�(X�6v[�V��(O�	͔z0�F�p�bH����pቕ,���BU�`	?����~�8�������L����ޜ��	ar����2��X
��'����ۖЮ��L#�3P{�gH|���(��0e0)�,-x�eDs� Mp�q���Zz��vBn� +�x8|+�K����w��fPUr�&&6mh5���r!r��AqB�UӲe�l���|[�(�Qȹ�lw���02�
6lu�mv�^�%Q{*��� �}���4�?���:��:[R�I*W�[-&�qc�FJA�nZ�oi�S�����SrC���YB.E�]�f�&�^��7)�A-�����gb�e�A:4e�0꩞V�'�p��+��/%H���5p��,�!��G$6۱��8~h���5�4��u���4�m��%�������z��iւe��g+���~�8�d�X��
o��? ~ئ3ܝ)wPC��5�g]5PzK}eP)�ߪ5�2���Y�h�p���g����a�N��t|�l�*Kڀ�)���Q���^�&+YE�S�5�~�������_O-��𷘗��m�0δKD�7*Aگ�R�8��z�zQ��o׸�D���/��a���j����:��l�܆�4��g�Iu��<[�6N���K���^�#�L�5�ѝ/�pcf_�@���y�
	K�I�*pp=.U��@��dL�Ѐ4������y#�us�0�%h�5�:L�r��Y�[�B�P��lr6~_HA�!m!��m�Ҥ�D�l�U
5O��Ϊ�D3���۠U@�
e@$�TL���Rp��H���BT	��������+߳BTS��~��q��PI�Fኢ�"N]�6:ޥ��q�j=�����Lf�?�P�u�4ka�Ȼ�i��N�W͌Z��E-^(���
���c�3�� "ozb�T�P嵡�V���x���`�H%^��\��z�J���Z	�^�ܱ�T�+��L}
l��G�cj+VzG��Gc�k�
)�,�jybk�s��L놭
Q�-�H����S��͇�Nr�\ySJ�M
��ҽ+�`z�,%\D�R��I�z/����t&�Hi����
�bA�W���������%��Q�i��&��%���}I���$5�&���$ۈ��pG�(�Úҫb�N����
�g8��>��9
?)u[���N/��Kʻ�܃7��?�G	M���f%���wTu����Tՙ\�,0�*�v�c��ӱW)+D�F'�,�O���ߐ��Cy��~B��C
����r��$�)���.��d�Q]S�y�rZ��K<GŹ���u��z�(W3��[뫴��+���6��d��%����4Z�P��e�Oi����^��C������<7�``\��{"��ឨ6�Sq���Y����p��$�q㻣9� K����{��+6�i2i�ж�RQඌ�6{td���O�'5&j�͞��1��bf���I��yh�FM�����T�d�G�L��� ��^����z:v�������S��[��b�����y�݊Yߋ���i評tZ��-��q�.j��h�l�
(,�jQم���v�
>MO����5��Pq"f_�cd��^G��R/n֚��R�����Ma	w/�%�V���k/�UӤ�E9wkԣNau�v��%8�$�j*���V%��eX�y���%O���d��n!�K���Upl���-�u�i�+�u=�
���ާ�$��4��-$��ȅCr�p��Hk*���s��*�%��Y7�~�<���fE.�!<D����K�^S���h�fI�^
��Q�.�[ɯB���P�;�q�kT��P�~=����8c�,����zK�L�B��\1��|���X›�߫(/�n��������>����<�����ѽ�i<C避gG�4���Ѩ��"��Bh��W�p[��&�
�M$�J�$^�uf]8���P'�(��SÚ`9����cj��ޕQ�Ϫ�e\/���h_�!�sp�C���d��0��f��[적�=
Ak`�%E^6�[o&sc�㾞=X|E��3v��)"a�o��a]�I�Z8�Q�r
��[�_�q�9�����-ެ�E�nc#�ja!�"�}��5�8�n*�[�4�"Y��>*D&r5�O��	�C��.x"��O�P��7u3���v�SsG����1MW�p��wF�ޅ��ڕ@�ֈH���c�/]3n6+����*Z�Mg=o��.~�RH �D���=�5�npC<.f����j�?+�]�G���*���t�Ôr�:ڦZP�,}^@��ۨ-�T>�B�ťa3z��|y�j��z���yK�;��]�Z�(��c?Prp7<���Г�t�<�*��'��L���'�%����Ag�S1oγ#	��"�m��@���ȿ+V�_�c]
 �*`����4U���P�;i��w�8�=C��ӎj�sh=����(=?�����N�n�f�s����G���
�_ W�v�M���.Fw�M�/f��␎�!:���#�K�)�c΢,�;���J�r�2ݣ�a\�aޑ:u�^��*��4�P��xAR-
�}��"�lJ_�W��R�
�5�6H��9,�����
��C���T��#,�4��#���>`au'�i�esXAԵ�;��e�G�D���7��`��n��j,��TyC�@�qF_�}ohW��R�����ˍբٮ���ޭ
J8��k��@%��6�*�Z�G�u'7I��y�P���|H@�/b�&��
���O��`�:|��ڎ�P6��/�Z��XiP����]�+��6q݌@�_rg�[����6al�I��"�n5ȓڃ���ص54ēZ�<�U��m�;da��
�\2���9��ƛ!���0K[(��m��s��J�\�#�`L���dIP��v�����i$ߩ�?�^M��y�Z��ې�Wo��YV���x�������fI��N
��+��B��~z��w�C<������r��֠䕧}�j��Gډg���j|���#fQ� �P�Q�{D�9�Ű����QOqz�i:�3s���iP���S4�܈��k�5�N� �����9A+qݭ`�`	��M��ީX<�bǂv*�[��������wn�뛺��
 �3P����T�i��a,ׁ��^��߻�?�Ч����s�Rk��Z~(k)&�Pj؛հ�sH���v�F#{�l1~Z���k<[G͗ݸ=
�9�/~�s���}-�r��:���-zK���>M%wRG�f�"�" o���3����
�j�Tu�K7�M�C�'��c��"�~��](˪�ޅY4����rK�'Q���A��џ����]B,i⦗�U7�|�Re����
�0ӧ�k�|�I��B��������tVs�,�,1�P���Y��j�~����j��;#���N��l{<y͂C��Q'�9A䩗�5c@�R��Y�!�l��>��_h��2]��0�rpZ��{o����|���r0�ͭ��s:�^&��&e��҆�bԚY�^ā��%L�6��˾B�;=[�;�rA�YW
��Z}�UB7���J��gh���wm�b���T��p�Y�+kf�e[��VO(�D�Z0���԰�����Pٯ�u�|w`�,�Ng
}l��P	�˓J}�
�b�0�^px�B(^%�&����`te-|K��+���xe��u��#�pA/I�Q��M�ze��(?d�Ǔ�eo�n���붾9D��ȏb�9Ax�$/Ą9C��T1=Ѹ�u�'��F>��O�e�z�B-`�H�_�#(�uQe�C/�C͜��*�J�h
,�ty╱�(T�
��z����kL�M
�?z�h�c�(Kr�xpC�����<B�d&����R�:���WQ2�Q4o��J�\�Y�1ȟ�t�H&�3����@V�Z��*KR<YY��L\uA�:N0��j.�`�J�%��N5Я]s"�c͑�j�p��(������8�[��d|�+^p�ޯ�/�E��J��$d'��@�RzU��&�]��f�t�lF�����u�D����[�4��`A�n�1�9I$UK	(�[U��\	�FE��䊁�����-d��)I<�v~�"��f�r�d��'s����@qʡ*��Hu�O���vk���dY�1
��E��PupgɈ�qw��,�C -��a�
��ɀ�{TZMU�O��:��۾�<��:�Y���r>0	0h�oC9?�'A>OG���3����|�w!]���z��wՀ�<]�hiU������S����Y4�
t�}�/���T��!�\"�E��œ?j�$U���
j�lZ���(�O���	
�Ւ%E>�0�&T�V�|6���"�1�:pC��EX3�tB�s�R��]�wX
���h�d��y�?��M-����ԅh��&�<�W�Ѳ/�X��#V-�)���H�	t������ �����t���u�,��m'��
�������P7���\��ƵJV�Z��C]%So��T� ^+D)�1z����
�
CO���(�ҋx�[����mz�S0q4���z��0h��r��!�h��D�,���_:e���A��!pSȢ�B7E���i*����Rs�������W��^]ˠ�U� J�����O&U`��T�\�*j�~)�ݘF��)W�d���#%�WSDQcs�FSb!m���z�Ҏ�Y�x�_]=�8��KC#��%�|��|�w�YWi�c�?Xc^-�W�w�.^����t���P��9�!'����Bڴhߢ��D���.��������E����Eb�`�Vbˎ
+�6x<F�!��ʾ�&�7���~�ب84߯E���-�Z�D o8�B�,�	��f,6Be�艢V�e~�	��A�����U����4Y(
4��>[7R�
��@c7��]I�KM�����<�,�%[c�m.���8_N����_�һ+F�;�B	�����5M�!�s�o�3GS	`�~
3kI�>�i�x����b	|�_p��VE�7�$w����'�*2a�1�W�—�:���L�B\+(���0'�Uu�q�7��M~����\����SK��
���$�}���^�&���%~��KK���RhvK��偉��Ȥ�
$�H�j6w龅w��CX�;U�w�
���Q�#<�/��&C<A���nDU�^b��o�ĉ	}[��&�/���:I}�DD("��aH�jT�Q�+�p9�x�>���
a2!�/�V�QC~���i*���F�X3���;�����1���:oh�Mr��ޒ�feʹ�M��f�J1�ō}ڒ�B�O��B�I��ۄ���'7r#X��q��d�Z�
��#Ő�{ D�Q�v��m��NQ7I�P]+#�CѻEX�X�t��F��G+	�n��׳�(�KDM@��6
�P��5�e,�ML	���B(�$��(d�t����۪IP�3+�!�"満:�6ɠ��`\��5�'�k��QW����&=S\�]�f��OS�t��E2e�����4-)r���a�*�Wt\Աh�q&t6f��&E�E�����o����@V�
�M��/����X�ڕ���ͫ�B�����ǔ$+��a�P�T{�3�%�;�PKEePQ2pip/_vendor/urllib3/packages/backports/__init__.pyPKEePQò�I�2pip/_vendor/urllib3/packages/backports/makefile.pyu�]k�0��+�xK���R_�,��XK?�M��ǫV[
�</��O��׸�h#��<��ձ_��v����9���}t;�RJ�l�����a�X��ߓ���$�p}0R�{�l��=��7h�K���V#t�<6�V��̐�	��S�Z�|
r�w&���ƕ.	��l�$n���Rb�0��΄�}4��YbA�¶�*T���8���TJ*���+��{���O���F��
'���ɼ!���L\g\��ۣ����B5�(ƭ��X���u7�\�b5/���L�D��j
�=�����3�i�yX��q�P�*���{e��>�]�1���hϜ�V1�n�`��(�g|�y���D��A��w�d�?.�h�[t��I���)��X+���KU����]���1T�l$�ގ���?���ܭ/����v�}~
(�!!�F��=>�,Akh��i������74�Ζg7`_����Ǹ�EnV׌��Ex{/S(��ؽ���#���ǁN�K̕ռ�t~?34��~��o�w���j��~o�Ar�R��D�}��<N����U\��PKEePQ{I�\>�;pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py���n�0D�Q8R��R��V��K�	��7`�x#{���q($$|�l���۶c/C�2��S��f��=Z-�N�8��-��]%�l��a<��r=�H`�8j'>I��a,��X��<@�a|�[fS&�x���+�j�3���D<.�m |&�w��/��4]�#
�{2��P��R]�E��y����P�(n�3����K�	�<����h��N��[M���Y�l���U�js*e�R7{rT�����@�ᚢTѪ����)����X���^`��G!�8���o�y>XCe�TLH)�`�ߊ��k���/PKEePQ�|��@Bpip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py�Xmo�8��_1PPDN�in�=�@Ц��I�i���Z�b�2%�t߯�gH��I��w��"�3��<�B%I�v!i)\��-j�X�tL�J�N՚JS/�r�x>��oB�Z���R��*}MWW��$IF�:����ۅ�T�J�_�Br�ty��*�Km%	�_�u����m���!̺�R��5Ӄ���m���\�ⲅ[V��Z6�qdd�d7�Q�F�vZ@�\�\�y�,���4{�����FA�YI�1v��U�Mp�1��ur9��7��B���]��J��������:v�������?�~S
�f� ��Ն��^�_������	���h�f�V���1��F���?�%e�] �f?f#g6���ި&��H]ԆZ���\6���ScjN>=FԵ�f�a,�3��]Ӳ'�!h1�+�}/�q�T�p��I�*<���۰��%�
m٠`_Z�	u6N���ZUE.La��Ӡ௭�H�ym
~�޼zA���0!+��eˎF�TK-Wו͔t�g��9�iO�S���c�?|.)I׎
��ne4���A�]����ۍv�v��d閰vB{F.��t��m*�R���[�#��,	K���]���İp8���>�Rw<��vi�׊��ö��C1ؽCgւ�;�?����)��ZTH��a�.	s�ܥ���PG�52w��X����K#���AH��+dچ�I$�Rv!�HDS�@lH,�P��ޕ��#j�.�5��k�ED���֐�
��6�*8[��_�������4̇C>͙�SJ�1�5D�R�cl#r�p��)�h_ԃ����!X�"
���q�OݻN����
���v'���Rp']�r��K:�xK�aS�=ꓗ5(�Ş.��
��3��/F]��H�aD�&7�F�J�e�e`�a��{���s���$��?�w���r�=����YY�&����j�>[ĥ�U\Q=�w\2�4��i������m��*B���Ƚ�r�4���	��br96�!:ʢ�S�"9h�F~)Np�\Υ�p�E�N�ۘ�r�u/Kޢ��h���R����
�3�a��I��F��;ǝ����t�u։wR݇C�A�d��Ӯ���՘!_+�K��?��	�X�J�y���
.��,�֨v�UBG�C����K����@�;P��ƙ������%٧Z锥�ë:6��|~�������xUl�B�9���g+�x�K���`��~jҹ?a�ag��S�MJ�5��ңI�kl�H(����'��J��Jk��[�-�8ҡ�Ǔv�PM�,#��-��[�ɳKj�J��v�F�]6WΏi��]�{Y*͑Ąv]P��S�?�v9z���)�Sr�r��*�������Ep�W-��sH�C����늕!g�'HƜy�vm���R�����ƪ�פXN��-lD;��7�J��Nx�F�1Sͬ}L���"8 M:�
�8�|ކ��}���0�
q�]Un��;��M{�"%
�Z�0�5"�«�Ɵ���tٵth��W����{�½,D����瞥]�������y��ń�^L��}3'&�-V(twX����(�Ґ.4�
A5��v��ȫ�����q����F��*à}gD	]
`t&�;A�d��0�>�,���,��⻇�u��T�S�9��������۳���|οxs�ۻ�7�/�́H�M�h�i�=��I�6�p�;g��F������}�ޓ�e�7������	L'>�%���xk�����WU��"_jQ�1_��\[ŷ�DI����S�<o�w{���W�U|���J͍0`oF�^������[|�Ƕ5=�O����F�=��}�p�I��r�N��B.��fB7���Nc�X�S*��6,v`[K|��s;����-C|��z�Y�M^�8rF�n?n|�n�x�G(��߃�o�aG�!x�p0,�U���߭��d=b*ί8`5Pk"!����kP,u����o�V����������z����.�s����l!D-W��~���G�
U�S�>�v�_��W"�|=���i�cL?��ݖ���w߹��?��.=m��4��&���+��a\^�&���G=��t����b�p�qoA����Aԉ������r
(���j�1ğ�#�.��Z�	h���=�	PKEePQ��?��$pip/_vendor/urllib3/util/__init__.pym��n�0��<���t%�7衊��JQ���4r`h���MҾ���q�f91�?��LGz��&B���	y����Rg��K�8��t��Z��H��W�+��Y�>�����V8-(�H��u�eύGl��#ߦ,� ����6t���:n�	ሲE���=ZLN�4���k�h�)����Z�?]~��VP�ޖ⭂��b���H��������e�pi-��N�H����3B3�ނ���owfp!i����}Y�ź�B����g��Ԁz��4�f��z���/�,�"��?�Q[�(�"x)��z[4�w��g����;t��=���B�a�Ⱦ��_��W��U�q¾���m\L�p�]r��қ��ǡ�����˙�qטq�\�X�;��aa��ʰ�)��=b|7�x��jްPKEePQS�:�+&pip/_vendor/urllib3/util/connection.py�WYo7~ׯ��e��N! n�Fۈ���(V�.%���-ɕ���3<����,��7�7õ�;��u�j��Į��[Y-k���{��.�p7Zӥ�K�o��Y�?��k��]���X��&7���jVh�X��9�*�6B񜫽0Z�F���A��*^8�U^���	-M�gp/�C��S[�B�E1����G�����9�5�-��!"S%ح�e	+<#��e6� ����~�/�Y;_n���Xe�,�o[�%��_�5"�j��~�*�kA�/����[=C�P����<�Ƃ��r��I˗KpڃI�	
����ex�R�
8ÔE��r�<��.����pǜ3޳3��x^�ԟC���_=�ygR�h��uu�U@�|��S�410�u�fa�@�4;��5g�.Hg����J��[��[n8�8:	�{�28W)'�e�xB`�Ď�ڽy�=n�_^}����F�3XP��k��n�+��
3�ʧ�}�x�E���a�Dt�a��-s-��,�i�+6���0i�:�ɵ�a�V��V���.�
�s[��G�Z`=	U�\�ps���͞�0�����(�~w��j�6����[��a��y���gR�&�Q`8����x�z�[;Y���������W�?,�����ϋY,��<���P���J�7��TM1����x���J���C���\�5/8	7a�⩫+,��r���ՈC�����|(p/��8�:Ov�q��F����}`�(����+�9�Aw:��aA�7kP�'����3/���F�&ƕ�ҵRQL�tA.����K$�x:^���tH�^�0�A6��`Wc! �3n�k~
>�XD�=��*Ji�$�%e[�}In��2�֕�'AO���ϰ"������@�h\G�K�"rw����2��q� �v2�c<�8��Q��H^��%v�r��t�3�깆I���7L�k���L�P_�_�y�RP3�֚����5�^Rj������ m��_y*�&�Mig���_豕v�,�-(��@�ĴyD]��%d@
v�3O7j��L�F�Y�K�Y��cwo����>����k*lG��NϠ`
���=�ڠ��B��><im��z����19!*��uJ,�؋�ʑ�#f��{.#Y���<�6�&Nj��'c�.I'֏����t�-�����<Kx�I����7p��'Ó�GN΢&�
7#�ҙ��8D�8M�|�A�?�X�0,�c��tZm?/M�'7e��$�$�a�����dܯ붞�78`X�l��o�CʃyR(%X�	�Ơ�� U`<?Te}����%=N�t۷�U%�!(�D��Q[hU�h��A2`�)��}����m�Z*�&�|����S<�g938��#��i11V�Z��D��^/�S�z�o���t�B�q�K�p(�p�l.���g��m'�VqnC�-REBeǯ��˒\�/���Xa.n�A��a��]�
Wc�Cw�]k���T�[a����T����DT���"J�I����k�9�Ĕ�s|�Y+�Ԝ8�O;���`s�W����H��_���ښۋ�^]��=~g��-��_'��B�O$;���Өuy�aYħÁ�cW	���z�e�փ�q>:�Nh��?�
I�6pE�0���T�๣h�'D��(���өoͿ������|��ĭU���v"�3m6!"�?������j��xy�o��Džg��^�/Z����� M
�p�D����!fI�E�Hev�>�ϟ#��PKEePQ�,{0��!pip/_vendor/urllib3/util/queue.pymP�J�0��)��	Z���WO+({O�4�e0ͤ�Fŧ7I����@��	���	:v��؋�#��uh����4K��~S:a��U4D���,��o�AA:;x��U�,�Id��T-����J��h8c�Kr��A���ek�裠iz6�a3������N)չVNd��U٨�{?�3h�!OS%��
4�OFt��q�M�`B��Z�o\"�c����8�LTk��ⵟ&���Л�6��ֿuo��PKEePQ�.�H�#pip/_vendor/urllib3/util/request.py�Wmo�H��_12BI�c8B�HE*��*U�r_N'wcO�����]����ul�M
��M�}�홗l�� �6�kfȪ�ƁX[]6��9ڰ�ZX|�Y�x�*�F�i��"��hS+�{��rx�&s�m'��9�Nje;���N�B�K|����1�D����������닷��	ķ_d��)��8rf���>�F�])AX��X,�JM����ҟ�
�<�K����Wق���K���Ԋ'dF�6qeoN/.�__�_^�mz�s7_DQDB%�0ۢ(�ع�C�3Q��x�V+L�K����T��	�o2��r�Kʃ�3Ѹm�6�~�=*��f�ȷ��E�W������ga�
�>4‘)`�S����4��ZQδh����͵i��&Qf�V��B�^�+Kev�CNB1�	kk�K*�RZ��k�!Ѵ��3BYf��a�f6�_�dY��>j����r]Ub{ﵴ�d3�IFq�,,�ny[M�-���z$���
�"�l�o	���{��j٘���_�>K_�#�C惘钮Xd	G�&%*\1�w������6�h3��R�Y��G�6%�5��,��!#����,�$j:�����3a���W���z��帮��fIX��+�*����>�=�נ$f+�E��l��
�o�0� lH��=_v�<��o�np@�~��=����Τ��:�r��pz�0|k����}��	�D�GB�\���@�ş�L�|/}ǟ�$��_tiu�:�z�!�c��k����=�z<�'����HXa-�+_e1<�|=P��@�6n�f�ѹS�p��
���jGiZϧ�CR6�>0D0��֒�Bh�6"��8�s�.�H­����|M�J�8��qtRD�~N$P����C�m�#9ڑ�IsE�줥6����V����!g�a��4�Ս9��,��h˪�v�S�C�iel|�A�$
B�kg�ò���8�/a݇U��O��<��v�_\�u+�����I�?��-�*�f�����~{����;.��O�\�|;A��nZn�������'�>D��bo�G�-oD:=P����{f��	��Y��h���Opk�;#+ad�o�Nz��,$т�6A@d��8Y�}��Dz�wxXU[ڦ����n|�����:��,��d2zL@ᅲ8���v��V/0̻��.��_�0���/�k.Ay�ʸYy�O ����P�Z���Ý���f�ŧ��}�0������P|tߐF�e0xlP<��h��&v�s ������c��V
�!�n��e��o�f�����ئ1<�2GҼ��PKEePQ���/
$pip/_vendor/urllib3/util/response.py�V�n�6��+.�E$��fӪ��m��6(�bv2-]Yl$RCRv�A���=���-��9����(�
�x�Ke�m�l���jk�e=+��u��{��=�ѡ1�/ʖ� g�[��FG|/�7\���	Y��)��n��TQUX�EmCI�U"��y���}l�|�ph�4�����Q@�[�k��`i(�Y��)��S�~^�t4J�#�ҺFg�_l������YP2��r4��PI��րFo���~}�g�����az����l��N�(��ŷ���\Zϴ�F�{΀��y�Y;��?�cv�_�P�}NJ)��%a*�����E�M�H�@
��a��4��]O��/��w�^��m�I���3�8a�ko��
�m�ҧB���v&��,��q�N�P��qJ(z/��?�3�?:����%4l��ER������=�
h�o���F���Q�rTMm��D-"
����Z�AB��z���G����S}�<�[�y�Q�:�*7�g�MX�E��N�e3Ft3�0��,�;$�\3F�s��A�H��uu&�Zˁ�,k�[�D8a�I���V�v6%)�U��,��HBLj�n����f�[����L��.Kn����щ\h�D�#�+�2�t��s��G�I���|V��_��'�3V�Lb�?Q,M� ��h��`%ň�s%q8�WN$~���JV]�Y�O~�q��E�#�Iw4��S~*�)����e7v�X�Fdž���O� �%H�_�ȯ����T7��a �W��5RL�l�4躚l�H~],f4֕�Y,�-(�V�l�i�ڨ�,�I�h��)���s]*)	��{u���)�/m�la�[i����G��@�Xe1�h�i��<��V^<OLT--�e�n'���kA��ӥD׋���=C^�$�d��������uIʴ*Iy��Zv��mZ���m_��^�=38

���>�p�7�6��������Wa��V��2c�|�I�.��v����nL�����l 7���8���PKEePQ6c�K�<!pip/_vendor/urllib3/util/retry.py�[{��6��>J��I���x�ڍju��X��Ή]3J宼^
� �g���1�u�>�v7� 9ޤr*�L@��Cw����K�m۴�HS��e�0��˼mD*���Mv�9/w��؝l�º�s�n���5��Ħi���]�FTMY�C�?��}���\��ĉ�$�~-����,
�tL�m3���S�O��Z4Ճ��}U6%p鼺|�{-�#�$�WW�-ϳ��/,�{M>�|���	�e�ݟ�����LK+ى�-<�*JS�P����	{���jר�-+����(ǚ�`��
�+������8
�n�e��+ON�e�7Yݔ�p`�!�7�{����fؗx�U��	\">�
o��*��*{��k�Z}<�5�s^׌������TN4�׀�b��ڊ�%'�:�����c��<g�J�F�z
q��K����Y{I�
�"Ƭ.��	��[	V���v[���
	e�!�e#�YTx
��RD�sv�N�r~*5r�����}7�&������df��fؾi�0�=P���(���3����a��q�����=ŗ����=?��uyx�4����QT�j�`_�X�[�_�5��]�����c-����$��E��|���W�HAP/��y^����*h�N��]ŏG`vɔ�:]��<�V玉I<�dm���>q!�+��1���^s`��--�5,T<�X�y�.`
ˆ�S#��dE{X�Jnv9qS2���]�`;k�a-6�XR5+a�
vY[4ub%z#p���e���J`p�ո+��p����+�2�ECHQfW�S�0��inG�5N���<��E����}���}
m�_5Bc[��#lP���I�&f�m���`���Pv"/�c�&rq[p#�<�b�Uu�mbw���P�i����X.I_iY�fk�]*{`����c^<���Ϝ����$E�e+�{��2�M�����č	�ׇ�A�W��Q�G��h�u�ك�+JUe艀4���Ա*׀yw��.mĭ���QtŅ6�GV`xr��J)��������'�;��H	0�?�#����F
�>�-h�w`��pꑀn")�M��6;dvuv�b����tA�p�f�xo�,�S>��Z7��O�������Ϭ�f�|�?F"�O[Q��_B�
��,�1–2���$$�� ��(<�x�����r)[SP�Z�l�� <�IZ2xKa�74�ԛ��*���9��vX�8lD�/�|�g�^>�b�˂�+%HI�V���n������/!>npOF�����,��6*ī��(`�5�hhQ'��X�`S"��<x�j��◷���ͻW�o��W7�p��W��!xPL�5<uv^-e�`k��]ą�'":�'���
p�g�I��g�J��(��ri�o�Q#�pA��?
]�M�g�<Ҕ�8|�m�V�F�ݦ[���+1��d)�6`%�;!
}L�c_@��z0t�C	�p=��#�-��!��|@�gF�pd��ـ�~p�HQ�ru.�U�����3��=c���?�p��=mU��Sv�cf�4q�Q�T�/(�$9C��(�۶XO�	�tx3�0��0I&`�&�����$�h�8��N�(F��e�s�?�j�ﰗ���������������n��X���u,������5���X����\q�����w1�5�Y&�ko+yl��a�8"7����@d���
���9�`o��e�;�C���r]s,�P�3-�ý
�@RjGc@?���2�h7��!�B�y�˥d�����!ݕ5KpD�`�����0mdt�����L�`��L�++�т�X&D9V�	����æ�D���`�D��@�8X��
}�� �>��t1�A�7%���)du� *1E�e��􂬔쎾�3�6ay��z������b~��,.�ܤ��^�o��}���<�)ko/9��MGǭ�vN�����h�7hg�&�<�{a�Ħ=�@4���H���؄1x��FrmCN�͐��)S4���a�f~�
�T?���_�W����޽_\�������G���f���D�߾�~̾���}F�篮�痋9�_ߤ/߂��atт����,�"�d��*;�c:1n�Rq�-;{1�cF,M1*H���$���:���}�SX�ǎ���J��k���er̆�ұV)��;�����`Q���]q�*[�Y��^���ב ���OY��fRW~�R4�'����3R�ߠ��LI�N�m��J��t�ȃ~c� 7�BM@�i�;�V�]�ø�
��
�#C���? �f��{�y70Ĩ x�wߛL�q��t��J�!Jbj���߰���>��;QE1ŕ{���t>����R����.AP��.��"�BwL+-�� c�U[1w��ԂE3�$lS{փ��GY�~{��ⱏ�c�z��	a�Ǐo�Y?�F��^�#�!uaJy�V~�!�A��1v���$�YJ���m���-��8z�L�VP����
�1f'�D�6	�,D�C���8��*�KP��6��<!,Xey�<��M��(�I0L�$2[)��C�KX�#̣�	�(&��"t�sY���#�D
V��l(C�ǭ�3��u��t��MW0�e��B5Ý��.وU��F�e'Y̓h2�ۙ�o*v���=r����A��fm�N4���I��*}
jjsN*D����K'��$B����n*�$.1�
�T.��:�&rH�I��Z�a�[�'�u�]튲�1x�,�3.���"��o�,������T���V����VS4�E���j��\���g�x�+DƽX�X!k��\߬7"0���yd�&��r%N�>��s�!����R��y�
�ޤ>�5����s�T�d��&e�{�o��j����ɓZ�Γɷ��H(SU����~�ar���?�ÿ��&Ǐ�M���̹��y�'h�nhcS�1�ɛ	'��g�
��Z8��R%ޝ�h�~���#�
��Ό�9���h��,��r�J4<����W6��$Ěj�-R��=0M?R�V�tw����6i��V2�:3��^�^��!3���;�p]����M��/�ތ (	�q��"�h�P�F����AZ&�A���AAg��щ��r9ʈ�nFg	�=�䱬;�����ަ�ԘP�_*B���n�����Km�U���ΠqU�}Z����-u^68�`!��t�E]6�	I\��3az�r��D?��՘e��C�ξœx#��Z�IPa��ȕ��쬖���%W���x�(�R4�!�ű� 	�G�z>�cd%X�#eS/iV����
>��F_���x��C�U��-]�{_aVU�Wa2���)�S�?kt.]]
3>_��ڝH�;�����Ԫ
p��
��%��:$�s�1X�5q�\(��s	o|P&f��.1��w�P�+��[!�fM���unZ��1�`���L�t�Z�|��r/֟j�g;�ᕶ��e�a�K'qņ���WŅu�n��*�덪��h�OB�~�/*�G1�5+����� ��q(7Š�t��X���0F�&Cݕ��yU���[6���E/�AYX��Z�ɛ����[^e8-����W
5��Ʀ�\�>	t�8g���aV[��`�W�:EPW���mP��l���䴲���9�@����J��!,!D�I����0���N�ܤ���U�^�9/�����y�i��]X��N{Է��:�{�t7�)q��/����qnc��>`P^�_9�J/?��z�2]��!�t��f9Ƥ��l;�q�"��7<�z��`�LWf��M�Ai���b���krx���+��@X�OM�a�%P޵���_$7K�ғ*U���������S�r�T�����'}���T�T���q&��T6C���?VX�����c�%0��zJ�n�0v���撑�"�komаc\�m�ܽb;��DQ��U������nԯA�.���x{�^9������S�@�i\⋟��R�Q��z�c9b��9��
]�}˶�v�S�����Og���u=�L8;��z�h�Q=3b7���x�z�;7o��->�]1
C����f�f�Yd af}o�/z��':����$��_���zu����f�ס�3_�4�g�N߿n�M�w���#2��D�y����1��T�XDE=�Q@���a?ƙ�E�y��{�)���褏������LX�
K����v��Zꕐ�[�Q�˳Ox���La@�7��d�ɻ5���sWTޟ�%?��__]����w�]��i>����֣*�"U�;�����f:��47�����_צ-�{��?���,�'7�f_��k��[�4��Xe�Ƣ{��)���)�?^=wT�_>�T���YU���1��w�3��ѕ(R�Ľ����QƏX̋0�}�M�4��:"�7LƝ��4�W��o<�4<s�F��"��j�K$u��"_�F}��X��lD��lb�/N9��L|��S��/������l�\f�(/���5�l����/oG��[���ҁ����Y�=Ļ�o���<>�'PKEePQb�e��8 pip/_vendor/urllib3/util/ssl_.py�[ms�Hr��_1GU��-ْכ0QR\�>�ʖt��-_*��P�	x(��������b�%�!,�M====��t8/������^�*�D�\e-�*�u�"}�1�UY慽��2O���^/�2�߫m��̉�,�e���P/Y:�b����n!�E��,�2�>�B��Ͽg؅�2�4�w��6����h�q<�D��.^]�̈P��jU�E^ّ���qYe ��J�X�]&�yQ.ҋ
���SZU�nnYn+?�G�xU�K���Q������U��p�	.�ˬR��It��n|R��d<�|?~��L�n�ܣΉ�$W��Jd*���)��ע.�}U@�Y�X{b��cZ�X�E��!3��A}x��f}�a��/�Z�o_��߽u��5%j.�j���r%a �U4�h�=�Y��t�]��IE�)��	�����]H��+s,$]���C�T;d��"g���ەU]�Ͷ��B&�W0Xl�C�V"����PYNj@�<Ѫ����RaK�RU��ރd=��$bo��3,Bd�(I�?��	 �RnA���+�k%xl�r)2�?�4S��n�K��=�[��jY�e�*��n�=�w:u�q"���Ln�$�x��Xۭ2�N2m\��R�����T�������㫃���1�Y��GG;��f
v6�����FB�v��J��<��n[/`�ểs���>܎n?F'�j���
l��Dp{vt��ڟ�WLN$���p\�w����.���C���^�n?��#,^��U�1���˛�	�\��xܙ�):��BU�"a�!�M�u#j�9.<Ks�x���8]�Q�A�NŢ�W���l�>��s�e2,�dz	qO�-��Ϫ�&i�XݭQ�M]ep��r���G���^q�*%b%:K�D���z���/��z
��L���@��e�(�n��Ӎ��V<u�yN��g,<E�G��1/EZ@�Ki]�`U��*�ZE�N��d�PGV��CNR2lB�,U������������;Sum8���X�F�|+�����F�8H��5�t���3~B�2����rff��L�r]Q�*,K��8V�S���@=H	�e�kfIZIJl7�?~r��c�Z���{�i8�q5��@�!��JMF��ċ��"�
�3�Inn���7��ΎP
�j���NY��|i�x;���\Ɗ'����cP϶bd�Xo����Y@�rZS�0�k�
O�L3";W�����݇�=Ł���H�;������λ��ч!��_�O��&>ɏ�I��	�;��ၱ��7�v�uG�݁-��a�;���N�!}*�����3��3�.o`��QD�#��;�PEi��QԫT6��E\d���#{X6-
�`��E|">W.�g��)�Һ%�}找?I�P�S�(�:�K�P�&f��P��А����SŪ$3�x��0���h���::�Im���F�Y!.�~���N��~xrٯ_��|;0��eV�VY!$�_��t����]$��|qP�FݚG�E�X��Q���E|�l�SJ eW"���!�RP]������������;�ثn���$��?'
����R+���{nU�W��s�S��z`�p��X��4f���
�䒝hgb[7�����t�����`�'3py���}^��QT_�(��a�>"�0��@�NVe��m9I-�V�<}��<���U�b�D�(_�5F�b�z,%�����`��3�
<(A_ٳ�5� E��A�,l3�$֤��0-�T~���w&�g�0��Bng�w��	!:�Q^~��cm�a�u�v�di?�OgBDwЊ��vm���.^ 5�����#\�R���zA�9tc�`��!����]�ii]�z��z���^����V�o��Դ�96E�����*���m\P�(b=�p(�R��n�P<�R�#bH��e�r��5dTGrøt���k�����f��,�
���>7S�}��b;��5j����1�p����f<�����L�撛$�&���Pԃ�s��>b�Z49M�̎�(;��V��6ibzI���_���-�Lr8?)D!�D�1�ׇ�U�,Xm/�Ul��N}��9����E���H��eӷ�'-o3){�k��%�	�C}�gH�6uz�`_��Q���镧@�&<!�t(�/���\���@<�Q��7P�+��=��	lC��$Z�,��ŝLrI���O�kJ�x��j/�X�Lc�H�f���
�g�ҭ�����k��-RO��#;7*��ufz�WMs�$L�=��&���CZ7M9gC�J��\4	#�B7-]��: @�gjd�U�����}ʩPOڛbk�<�b��b�F&�ɦGdN�W�*�ZL	�Lae���2K���(�n�J�&h��+i�A�F�C��h7d,C���X��v;ҎK��gGs,ZA�1�uW��@x��m�V�/�>]��+�k8�w�ޫ�v�;^�ף~��Ojߍ�~e�75���	��g3�Ud!�W.�y��c[ZY%�kS�ڧtp���0�\T�柵W��K%	R֞�/G��O�0��:A�>�qg8IAM(ԉ��̕rwy83�B
#���T�/�R�](�k��8W���=
j���1�@�CP��1����DZGX�r�dӐΪ�c�
E�MZ-��u����*)�����JW!6&O�2�P~]��w`��;p�����һ��?]���H����$l4�,�Ӎ�U�YU�5��^O�^S|:��t:e�ө��"�Y�#�Ίg�o�G�:o��1U!�&�
$l�P���p��,m�$@��6�8�ԹBާB��[��B.nnOϊz�x�Z�Ɠ�PG����2�ҟ�ەʩX4|�:wk��Bq�Z�`��Ze�KL�,6i��4=�����	4�OL��	m(h�u� ��L���ԞA�a�f�@�*���B8��
}2 s�nVYSN�x�1Qf.��m�
R��T՘�Vt�:�m��8�����`��a,86~�kl##v���#�L��B��؍�����`�?��m��o^Z#��L�����k���"{i�PO�D�X"V�J	��aE8}�T�o/d���3~�H�ź�c��K��ng��8`�|�/F�ZVv���+_x�M�hE?X��>�����@�TDSг��&|��ǧ�L*qr�_��g��.[F�QZK5�1��yUT��k� �}vĂ��K��q�����P�}B=�Y�b�Q�[�ɓ��C�1j��b�9{��F�	ۤ�u��Z���K�CId����aRZծ�ix����Y(��-r�IN~��	�K��Ef.��]��)�2$�c��M���?;Dd�}���
WZ&:�e���<�;�{tJ��B�ƈ�~��/E��C ��1�E��I��6>r��t��d��m��hx0�^Ҷ���Gz�*c+i#`�����K��7#|��P�-6ykS�O����s��ǑY��t��cfeCڛ�6�qvOe_92���$

�w@�A�ӧ�zj���[L�Lgӻu�3�k�o��SE(l���<��~�"�g6Ag��k���Q�W��|q@o$�����/��l���mJ��d��Ehᴜ��!�ug3ϭl3���r��U5���SN�t�0�#���S�9�#�P�' �3�'��h��2u`�^��b��l�_-`�(S��*uj <v�6;泴gk[��򾍆��*JK�t��#~H&��ǭ9*�mm~yU��ѐ���|�8˲�@���`a����1e��.���ݮL����[z�`�SN\nW����۶��l�וu7�$t���3�1\;n$T�����W������,��kĘ�{X��5�(�2�R�1��I�d�3�Y��.ձ8�cz�07+(�{�֦�o�Қ�I(KT�b�%iB��h-�LU�%�(�qG�d	��G�m/�zM���b�o���Кp��˖%�^��d:�M�����x78Ծ�q�mt2���;��
�v#�k[���BT�=|{��@��L���z�A$�~�1е���^�M�eF޻�a�8)�`L/k7�sw����Y�Ex�&2S[��r��*�3��p|s;�y��!���+N[��ҹ�F6�(mvp��~�g�w194�aծvdJ{��Q�4,��4O�M%z��U@���F��=W��Z-W����_���[�5��cQ̩/�ܝbt�4cm��)rN%y��j��;��@
k�E)���T�<�f˔�&W�8@��k�� �������R}�V=$�ȉ��Uf�u��?�)qa@+�Ÿ�h>�z1��f-�_	޻>�o�4���d�$r�p��nl`T�qJ.��L*�i�t��0��*�rۄp�}���2�1�E
q�~t��w��t�"|cx�����?��9���C
��{�D d0��A�&���$#��Fn+���=�-��u�֔H�a+!�7��ɥ+ö�3�o
;L��C����7ԉ�Wf�=��p�e�����s���Ow��w6|j�R�f�`���	c���x7$x����u��ʯ����:��Q���2Q?�eǐ�y!��o�y4�EfQ��yv�x��?��,�ߴe �8��KD;<�;E�����/}�š��5��퓬#g��[>�͕�Wk*��tC�Z�����;�o�y��Y�
MaZټU��Jw��@>z}U�Ԍu�f�vN::y�HC�ա�~�s4&_��y�J_»/���0�
z��	D�1<�;�̼�C�j8]_s�3�<��u:\PK����߸u��.Ί"�ߨ���E�W��#�Z�%��~<�F^���?�_�Q��+�hv�,�*�-,7����'l8�~$C���3+� �v�<��)��">}�c����ft���n�~ Y�=�;b{0jE6M8sC���PKEePQ��G��&#pip/_vendor/urllib3/util/timeout.py�ێ۸�}���A�j���ۺ;ŦI6
����Ѧ%�f#�*I��>��{��E�%'��Z?dl��~?�F�=[.7��X.��wJ[��F5�K�������ņ��eFU�eV��m�z#j�>���]#��*&�ZV�
fwܲV���
`3���F:0���� 7��d����??{�|���g���-�^������^8��+�Y�Z���_,p�Rk�Q�g̈��V4�7�������u?�X��ej�7Q��i�7�P�{�*�ZY1�a��ˆ�Q^T����V�V��g�.#�e���?��j�1A��#9_\0�\^^��R�Fn{�Q+�����x��dT�E�@P-�Q~uJ5���OP�m�Z }�myS0-x}�]y3��p���|+�dy�g�0���`��ǯ^�=.�c|������Uj�x�x{�Y'�7��;Y혺Z�Z�Y*�F��p_C�*�
���|~F�Ҡ�ɉ���[ƛ�1�5�+�Ag\�~V�X�R�Z�<�}<�Տ_�-�"
$��݂�-o���N��j�7r��|1���U@	qق|���\�.�;HP
��`�Qt����&e�kž�%{���I�Cd��^+��A�� w�0����@G�	 ��� ��1�xyx�Q��`S�3��h7�ja���JF�	��m�-��G3{x�R�����3�W=hAm�g��Dm�H��e�v�2ED�5�9�iT?|7}U	���K�ș;�C��9տ��9� 
�i��X9���6�+����Qv��{�ٻ-<�;H~Jo�+��z#q���'���O��仧��~#���U����?��eD�*wR�WB<Kȫ��"r�*g2�;=Ȩ�z_oѵ�!Z$	�z+�E� �$L�j�ƻ�O1����9����YT?��Un�-g�$�|ڌe	9ۊ4�C	<�
��Ү*�͆�a'B:�M���*R�Ғ�l�_���E�%��G�I�`�H%�
{��/xX5Ƶ�d
B�"�1ˢ�c>��T���������JC��ZLrȶj�z��Nnw���Y�~��\��R�mKE�'�B*-�J��h��=���;~gL�
�	��%�z1�'�p�h,M�w�n��������&f,$���!��Q����c�+2؟25Z֦!�]�,�Wp�Ù"�-Tj�%���	c�y����'�"5`\-��AĖ��R�Hƛ?�!O�"�����o�"Ƃ&��?��I5D��X�[>�XhO�Pз7�YR��[
F��@T��T�����	���f*�A��m�Q��m��T�vi �z����]���<`�W5�Y�*(1Co�z,:���]����/�y�Iz�@$V'�eh��W�t�q��G��6k��c�$D�'����f0:�`��T�\Όh6��gߔ�5H�M
?��ͦ\����d
�YhEC�Ñ�v9?AAZ;�o��B�8<I�����˵M�*��Z�k(ڇ��#��G���8U>��K���"�"��\.[(��e��:��T1~���8s2@�.����ukJQk^}8p]��AR\�R4���(�C�M��E�T=hhl���`(_�6�q��D��U>��0<�u���0˜D���Z��1��0H߁�7J�	�@5A�b�aZ�`M	�T�b*�10 ��%Y8�pdVW� ��WH_�M��Vb�#YR,��
��d�)MR-��B��k�&P�-�T�.XU�?�V�����ߞ���l�;G�C6Xd�|l������p@3>�����r_�S�B@���y\Ӻ �F�&z�Ó�{ޢ�p
$L�;�ז�{��ch<NZ��
�����c�"�9�SnM�fw`=b�H��z��Z�=��]c��s�L�8%�:3��iϋ��[v���0��37��8�r2%�L
`,a�#��eO���I����h�i%|�֍���p������(�, 8�.��S�����E�b��פ4�Œ!��:�E!)�q����
�v`�D8��Ŕ�ɳy�Wd�lf�и��QØ�$�b�^
���F��ц2ݧ#��W+�d�J�>�t@���Eڛ����1~�
�!p�iZo­��i���j�H�4�4��r�J��Hhq^Mi��>u�4�a#=��3�t�8��2��8�I{��?�F
I+Ѻ�G�q���l\NS`	^���
Q�#l��ߍ�/PL�4�,�D��$N���M�R]��v�Q˟�t~���`��b����#:�8�������p=!~E
��`� �|��q�����
�k�2��w�?��|&xI�f��=�}?t։;e3Ô[��2�,�o��^��1擰wL���?�FJ������(̺K>X��lkg)t�5
����>���%�Ab�Ou#>g�9N�	O7c��쐖޾�槖��l���7lS&|2muD�;4�𫑆����b�Q[M�K��o��&�%%��#��,���ǹO`�g��Bwx�+�[��a��6.g��yi���L[��Y�7���ُC��f�iG!���(��Î�a��0�a����v!�6�N�{��튥w �U�Y+�y�⵿[�)G�|���}r����9֌�Im5j�\ǭl�=&
��<��xR���$�F��^��QM�
&��;Ͱ3n`N�4�� ��)�A�K~�;�3lT��u߹���u�P-!>�c�D��>]���E-:�ָy����L�6���m��8�W,�ބ1���JZ+�n���
.�ِ�>$O�B�
Ʀ�Th����������e��5Y2�;
�ܱt�ϐ��r�=;���T�{C(����Ǧbq�-�?�=;�I���Y�uK7S.8�V�fe��K� �X�ز�����󏳛b�:N��fM�.�"A9O
�(��~��&ӥg��<�Oe{RʿPKEePQ�	�ԋ�6pip/_vendor/urllib3/util/url.py�;{_�H���S�e-
F&�.����$��50�p�l��6��у�<��_Uu��z���o˭zuuu=�:�$�3ם�Y�p�e�|'��i�w��Nxg��8�$�(U�7�~�/B�0���'|Q:�'���$N�›|�ny���N'OB�˲$e��H'3>�F�^���{�~#
}{b�Ϝ'K|�&��G�1�t��?9��p�>yQƲ�Eq2���3g�(e��lƼ����xg�[L�^��x�є�0��S�*	�̳8��s6˲��9{;|stz���=�z�fpS1
|M��E<
�0'�!��,��3�U���'�p��$��>#� u��d痧�]6��<��O�~����$��K�7ڜ-<�K�λ������@��#�"���W���h����/�/���#�o�`:��h�H~����g�k����I���#p�d�-�:4$����Շ������\}�
�kP�Κi��_�����ɋ�����8:=�u`N���;�@�����ڶ��|+�׃IP�Ac�7|�/O�w��[��e�￉�_����o�aO�3$��wJ
������pF��lÀ����yI�M{�f����l�d���,���]G��Ա��[7�Jݭ�h8@f����Th�5i^ը!��������a��n����t4�;+��DW1�ie����w1�������v+Ý�.
z|���P�h㴻�S�y��n�S���p��U�Z����o���ܾN�@<�<���Dž�8z��x���듿������w��_\������O|>����Σx�g�f�ݧ���'�;�{������z�?��}�kl�_
��q�W�l�	���CHbڞY��۳�{r��Y���n�7C�5�i���
)�����}1�k�/d�.�t�8l^���p��=;���;��Wףu}y���F��h�j��>�}��n�;xwp��}�q�R�]5a��i��o�
U<�P�J�=�����$p��ln����٪��i������Ó�?���\�\��3��z���C}B �5��C��[�Z_D���&�_��D+��R��ꭈ�Ve��x}4��)噐��p��������M����_��5��7z�}�9qr��m��+��
�1�u`��K�*!�y��`�q9�Q@��z�ٙ�� �!`t:��K!%MB�L�M~�"�,Gh���� o͒|�y?���/�6�,�nU����.SH7�2݄x��0'$��L�h��,0�w��͞ǐICn�Rc/�ٌ�Z`Vd�D��8L�ƈ7�R�D Jd��2o2�ł�z�����.�C���q�B&n�10��'����I���B�̾�A,.jC({mK����@�B�6�jmX�~�)�!�EqF?�4�,Ŋ�;Ѡ[��}��C�% H�r�"���	c(2@��\�4�����-��V�ZI�GZ��z�����J(�5{�Hb`�-�Dh�f�é6uX��`�c(?y��n�s�(8� [�b���҆ү��L8�����l��Y�'�0�4CZ$:�u�X� ���0\�4s�t0Pa
���gB�Y�bv*ˈ/��K�d6��J�N}��jr��x�2�3�}���,��65���Z�צ����Rc�K� S��W�4�𱵁�n��x~Gw�&��C�RA3P.z3�b
�}�CI
�Krp�I�G�&,�B��}��.f�&9x:x��ޒ�n���&Y�>�CI����h�C�+�4���8�X�)1��y�v��,Mn��
҂�8�`�Ћ>Һ�H��������-����ޛ/�`�q:������%Xo!��ų<z��ېB~�a�k5mT�>����Xu{���<A�, ���8�����V�B��m���fC@�&���R�Z)X��3��y�E��ZA���KJ��y��rCst��1Cs���i��j�t�-<&��L����`�[����#��0*����
�S�
�,�' �~V�%��.9
�L�1�ܠ�fo6�,�#�Q�,ْ��Y�.�qkH���M���u�-���;�. t��reB���`��2G�9>f���8쉽�'ؽ�\-b�4'
	�FO�q��8���	ȋ��E?E,!��*%��6
I!�H��BD1�^v�kB��))�H�Rg�$P�4�����,(���;t;����8�p�}F�q�?М��a
Bw��Q�2�NM�-���~
�MĽ$��O���<)�ڀ�R�z�-oBU�{Dn�߃�An���H���AD�g	9��A�~e��_�V��'1V 9��?J
X3��X �U����F�����PE<�i�X�G���>~�H����"���0F
�r��<��>w�bv໓�P�X A$�BL��#p��#Ϧ�O�r_���06A��.�'��Tt*�?\
Œ)���2~I�j����TYCG��P�p��J;l7e�>+g,My
(���R�G벍�����.���TR�Q8����)�W�CyWLW�Jc�PK��<��t׻�26l���S`�$0E��&R m	%W��3���b��8*K�Л�}Ox4G|ٷ�p.�-�GX�Y=M��#u)�K*��	�Li/`���$�Ǎɋ!�b��)A�mr�L �ɣ�뒆Dt�eFH/I�����C�!/���V2��,�ZZt�\�+m	"
��X��"�@�S�w��b��l� �pL��*��6�-9������5�g�K�-��#h�DQ
�3��pA�W�d�i�a���BMTvxY	W�YS�B��ns%�
���FyAx�m*!��mg��Ų?OA��vau�UqtM�rR�\,��D%�b��q榜R���9�5v�E���,���x6���?���U���㼹goۻdN���~�����"��	�W:1!7AyĬ�ͩ���`�S��3���j��'Q��!!:��cF0�FדQ�Hh��K��Ҋ�n�]����	lL��H��������Hr�t
3
�8OuU|�
�XNK�Gђ���$$YlH(�R�j�jPPN�0�Pc������cJPK���愧}��$@^��~K��	=-�_ax�$���[e2fkN��I�S6�;A�V��@XQ/ʼn�K
7$�Q�m�
�mxD��U����jk��)1�&�L����|���D�f7t�QJ���u��,��G���V���S�9�td
�n5ŕ�^Ȫ�{���%�
'Q��Xƙ���II[���C��L;�p�y�8��d�f��yQ*#+��}8jU�d����U����>���vl
ݒv~�P�t�C8@����)��V:��Ho�C��)#F5�I�/2�4	��3��L�W����
�%FŮ׷��e+z�p�]�*g�t��Z�y����d�R��4\B�]�vJ'�9���:I��Ŷȶz~���D�+����5)�b��Z�!�Ȯ3�yRUf�yh�q��t2ނS5�d�@����ƣ�r�G��y�Ҽ����b�Q>U4�Fw�Y��N��I-���ށ�1	7̐m3�;�Wt1��&u�[L����j^l3��He	t8����C��E	ԕ-��5�V�F�[�)�4mM��bz��'�E�s���	�Mi��+�Ȝ����"7�p)��iWoy��C&Œ�@��+���s��U9^:	ê�qd��z�b�m& 1���DKѵd�EhŠ���C[p,���%wQ̥r�JF+��X6|��Ў#��&��v�G�R��sTLJu�����
��ۄE�F>s�O��ؗIx����s�&�Nř��'�����S� �r#䙸�i��}1�E���R�W��(Ʃ�C���S�nH8���6���5A��#��!�=�Ό{wA�`D���1�
D�qs#˖���%#�xs܍8���6I*JV�J������f����JG�F5?o>���
v]d�\5_�7�-q�=�7.z�]I���k����t�������ӭ�փ�WLJc/y���EcB�lW���W��vR�։ˬ�+�"��2��h��\��m(I������r�G�}�	P�*�Bo<�I�-Ww�ĭ]�ÐQՁ�L�e�h���굂UyuK
�}�t�bJU�z�
���&�)�-�Xț�ěI��r�B��5�'!),fK�,gQ	���e�‚˿�=�3��A՚e��-�끀������S��$L��HlV����H��[��<r.Պ�Qz�@�Ǫ��"�Jj��S�bS��Q�ڝ3�a����/Z�;� ����Z�f�-�]::���Zc/�	K�}��a�X��lH�[3膚�"+N��Z*��F��!%�/cy�#��/�I����o6$��W������}\%��;�Y�%g�8o�{_�N@”��8��{��膊lB��H�
(���Ĵ�J�p���S?��5'�T�^P�9��� _��V4���
[�G	�r�	J�
�q-`������!p��]��Sm^�KH�?�!�F�<S�b�@#V�5CH
J8U.A~/�k3�?.��t�yۓ��sϯv	�;A��5
/l���P[���g�Wg�PKEePQsc�� pip/_vendor/urllib3/util/wait.py�X[o�~ׯ`�˩��
�Q)�E���A�E�@͜�Xq��$�c��^F#YΦo��X�|<��qT��YۘIeM-��)�1�	�Zi��z��:�T����M&��_O^����lm�M��	=�z�>���Zc�	���NV+��j%����,�������~2Ŏ"�t.�=~]UƮ,����*O�/�ɤ��9�,��]PT��**�b;�.�?M/��t�=	F�.��&�r�%���F�}KN�J���މ��D!�9�(�f3�x-�k�)���MIk^z�:A�ڑ��h�r�[Gͅl� g4���`�X1f/Yn�J���µ��*U(j������	m<��XQY����[Y�4k*$[�-u�Y�Zt-�,(�}�+�K�!�n!��y��i�^����
����k��B�_㗦��ԑ���9$��N\�N���j�c,�'�qـ��ٕ@0ٳ��EH�[����R�bkv��D�A���b?����,����F=�����-*�cW�&���)L�� ��Z�qp�Ӭ�����͆`����۪����5���?Kr�U�7��i���p[�R��J=�O���I[���Tѱ7`�gՔ���8�ɠ3(�5I�Ň���4�8��5����l[��c啿B�u>hq���O��3���e���~�{�YW�M�Z�Q�zcw�7M�d^��a���+�sw�{Ic5mJ��a�v�
�b�	
�G�B��e���I��f�4�j�����/p���+�TF�})f�����.Ŀb?�>��|��B�@����z�<�d�}��g��M�U��vV�,��t>A�{:�W�,��e���;tM�KR?j���)��?�GnMC��$K�0(*m��M��հ���a����L������v'���θc�w|
�&��+�f)�=7�7��⻜���ե���#�4Ug	�X��(=��B\�Bڍ����%R
����H�t��6~;hɁ?AD`D�e��w�o�?>=>8H*GOV��g�r
����q��
��卸9|~�G8���LNӳ��q@:B�pD���ی����G���@e�tΒOI�@]�%���� 3*Wv���5,iϴ�Ё]K�����X�|N�|<N�e�-�}��}	���*��N�қ2x�7���?��B|fQ��6�k����8r��p��z���Ԇ'�늂'�z�pji�T �Q�r�i1\��l�	ō`�	
�%7�L!���^�JL/a����RU�Ĕ�ƬCp@B�Lk�G�9&�,�8��:�7�Ǝg9^4I�
s�"��j���g����<Eg�|��S�9�{΁��ށ���cC\�^1� <���S�J��S�j�vCy��a�?��H?����g��޻_��u�}c��j�G�K�ķ�k�w5I���N`��c*�H��q�
��#�:7�Ҭ�ӹi�?3��x���94ה
��	p�$UN�*�}ȭ�0Mw&a^�@��/v=J�ƈ?��6��]�o�z���C�<���4�b2�⁉��.����1�a��sJw�Q�"
c��s8�7�xW��r�}C�8I1�eG�.fk�Jm:�8w�Ȳ0 w�o�/��Z�p�kX�_�Q2���_n,�(�����j���$XGѝ���1����oIT�)��E��AZ��K���_p?.I�}��q��+���ASM�%�sk��b��K�'z����2q�2��"<��O�{��F�� (�	Ը}��Z�f�N���$�k�s��Ά�y����գl�j>!��/���f�)x�܄�Oi~��9ӦS����D�gy�L��W!ϓ�C�ٰZz��ױG��55�pA{�\�w�?ʟ�4����3�N��8�yo�7�C7�46��C�h�Ǡ���끝��2K�~���'7ozl��A�&_3s4W�\�ƌnrGv�Y�����i�S���PKEePQx�q2S)$pip/_vendor/webencodings/__init__.py�Z�n�F�_O����J��\{.��1�8A䴸KjE�,��R�.-�y��^.Or3�A.?��P�H������cG�#Q'�* ���z������lƸ^�{�I.� ���8I���-�T&�5��`d�ӳ�˟�'c#�IyL�X	y��rܿo7�ŊE�zA����GS�L#���O���<�I�$MR�k5�([m��j!rj?����نL�%�2���k�4�, '�'C"@���b��,1ϳ%	�y!���!�0�%)xڲ0M$�i*z=��O#a����X*,���|��~����� �����x�l�L�%#�.0��X4���$74Mbkh�L>yŖt�V��������������%"|���`�x���j��ђF���q����P����L,,�r��Nx�����o�h�~�N�O��Q�܋ٜP%I�fk����ሃ@���9�ܰ$����9������I�� 2#��Dx<��,�b1.��?-&V4�K�7JN^k��G�����  ��[45�6A�L�R��($q�����=u�Q��h*�%����ce
#�h�H*J�TdJ�!��v�D�^� ���dB��f��(U�ٍ�~����X�G�����{��k�#N�s�C��u�`��"��_m���\5%�0��@u�ꬲ^$�B���H��XxN���"D& �r<;�$�J���]�@+����#{h�a�����/?��<� ���/~�ʳ��^��
� f
�>K@QŒF�w�7��æ��Y�[�Vr0Y���B5�
�Q1cdN�T����._b��T2����}>��*x����ylB:Ͳ�b�W05�l�9�%�=ظ�3d�D

k�*�"F���dzŤ˷c�E��J�,��|cWY���Ro9)V��!�M��D�&�`�z&QD�':�G�KH4A��7����S��~`	�!���"�lj�R�k���5GÝ/ 
�=W�0��� ��z���~?6����Y����WmA��Lo�v�{o�[�v�6'�@��0���%���b2���8<Qe%|����?$�(A�Z�))Z��&P� ��#�\�Y�UD*é�{"IhH�[�Äϳ�\��V�����n1-��Jk���oj�*yb�I��l!��XdEc<�b���T*�溍�M`9����Z�+I�2�\��2�*��A��>��a��]a~a�����ƺ�>B�ŷ	*K�7�K
t���̖�&�.$`�(�ԅU�����<��"ภ�J���2�����7h�C��׌��?'��9N�{m�Qo$�U����A���6l�Wm�c$�ʊ]�)
��|::�u\EF��H(�*UYb*fc{�'h�dVH*��~J�aH"��4a����lP���
4/@N�-�J�,��ɬ�{���v��(�^d�y���8gWXt�ih*A�D�a_�t�sO-�+�#�o2��Om��[���r���Fm�z����W��S�W�@YO9�r��ٮ�1��P�%v�X��ӧ:[�=��恵(�!,<��|�X{�m�`Y���Wg��MLÒ�UxN���2�
	�X� ���52�ŏ��q50iL	��`����]o�S��-�Y��&U��AwJ�)�3h���� a��	N^<�k�W���Y��Q߁��������z:�%s�0d:�C��f9�)����.m��h���Fi�Vk�.���,�ݔ�����+��eˑ��z�lQ�:˖䔃�5fª�Y\>�CK|W�v�ݯ�_{|�f�ݰU�[�8	^��wb0$k��`�
�4Yf7�J��|�x�B�\
d�ϼ��O���qGŴ�o�{�0xw��1
�*�dgAc����v	�le=2����,Ú�����ߡ�a�8��ܣ��c��2�_�Y��lQO�����ldn�4\T�� ��/�#�^izo4�X���˓neP�ř�v�9����N i͓\�]��b	��\�7Ƴ�j�5<_­�� YIZ3�wpu�35$Uy#��z`�W{}̖�p�y��%(5�Y	w�v}�pW-�l��	�*�`�16kP���T��6c�3vuNș^R*��r�D����۵��5�{�8�*3����}f�V���V�K��u�|�.|;m�,��QW�E��&ai�i<{� 1D�Ope*��P7��{Z��xX&����i(�(n'�p�<�Ɵ	��o�5a52�(�$�)��TZ-�)�LQ�|�K��E�A�7�-�rF���kӚ=���n�P;,�8�I���i�y��A:O8M/�™���s~�[,�yl����}�Mw2H��� �P~A���ÿ�J~��S'���:٬���q8���h��I���6=�랴~�9�tQ���D;���Z�m��������YQ�Gg��9D��/�;��?{�;�SC��[��
|��X���J��
q�>4Vg����k,U�X�T�a�u�����.o�'�d^2`Q,�1�0g�	��3�kr�%�Лˉn_��vMq�]F
����f��@CD�R��9�{�S���B��8Pd�(3ɵ��Au�c�7��f��s��$��h�3��r�bGo����?=��̶����G�S��8jOh֪G�xp#H[�B�-7�Z�;��ДC�w�>�v��l
�_�y�%�y�ft���!H7l�1y�Ƈx�'%�՘JZw
�UD�un���Vu"�n�F����-���W]��D�n�����L�̦盱�R�n���m/v�������S�|�� hLݴ�5uO��O>�c��Q�w�[4�g�4����!�l/\�PKEePQǭ�#"pip/_vendor/webencodings/labels.py��Ms�6��jz�%�X`>��~:������b+���8���1H�+�9$^V�%�������՟��Y��T�/��x+Ӳ���?�~���~����U�
��'�|�6I~�,�Pm����Y
�m?٫:�{��*�ѩJdV�
��퉕R��߾~��;{���U�ҲV���3������,��ܩ�Z��A��M��տ�K���J%q�~���dWr�,}:ެ~>><�����+���Ӛ��d�vMrQ�\�7.6����cz��AF�>F�BmO͕J������(��T�i����E-�a譹�k$6�������Ё�R`4��܈ut4��1�!��C�]2�.
�K;㢀��A�ptmwQg�؁M�C�L��F�L�C�Wd�W(�+ڙ�XN�X���|��8���ރ�j<�+#�&�!�I�H냾�i��.S=���ڃ�YY���x��@Лcc4���3Ӄqoapt�?����`�l4�F�Kr+����֭%@���z�X+�G���8 ׼�$�T�L/�M�s���^w ��"2�/�<"0��V��y��iP_pDmj2<J�%�La`I!�I���̰���`y�"y�@8	�߮!��C\�-�ܮ=�_��	QfB�k��kS��ЈW�����X��3��R�%Ng�qH!}�م#I�g����O�Ci��u��7�٤ҳl	��*�H$ɔzۢI����]�f[XZcD
[[.�+��[Y�:Oai�)l=� ��5�:�ׄ7Mbp���M�kr�t=Q!�G�ݡ=w��
��!/�P��� �)`���((��
]�Nq��*/za���A�C�(��k/�S�����K�-e�]�q��2��),$�H$�J��w�3��E�v&g�xP�@��R��rJ/���3@�vz4�J]��k��;:ڏa�2Qx�h�<��h(�B��iJ֟�6;��F��&k���h9�JGёl�!�,[;�h�)4EhGa����DŐ�!#K��
��"��.
u	\�}ڂx���D��YJ��k[
���*��b����<R�ek�6��&�u�yS�jN�N������8�!ۀ�x�m��#6
mAܨk�O����8����ڀgڂxd��!a@H�2�6��B�_�E�2շn89�L����o����:���A�[�oXx�����G�A��It���N\9��\E�Ku�w�}��w��C�tqn՞8�nb
�c���.I2N(2��Z�@��J�Z�%9wo��=>�]�,j!?ߡ�\ʄ���Ԗ��t�k��H5R��IY�[���p�¨��_���g�@\+�@���fp�p����Lj�rJ#����Kt��c1@uz�Rh-!��oT��o-�'�	�Bo�$TFI���u�Ơ�j}A
E��=9k�=̮��`
5k�.'�~����P`o�`)�m���Rʂ��[�4�i�'C�����PKEePQP1D$pip/_vendor/webencodings/mklabels.py�SM��0��WL����f�="q��rX��Pz@bQd��ul�6T��}���T{�#%����=�`0�2��k�����ڢ�)���;�5R�wܢd�9��K�������WJ�����)�~�|��y�$̙�2��PZ��af���o�)l����z�A(�7Z�V�̙�8Rl�j`o��kh�Oi�+����e�B
���h���,�q�Z4�ꀆZg|�y�H;��`2igE��c��lwZF/&1�O�Rif��	,	!O��+��*|e�h�q*��
H����b��R9���w~�ǎ[�p��l�T����^�:��d�OY6�r7�ͽ,�3��*��-�Kà��>ET�"�)ٓ|��!�;��$�BV��+��2'�2^<�0�-m�I���!VӼ�ѳ"%�V�����<���v�XC��O��'�lر(�~F��-�=�����/[�G���}J^C;Z�=IC�-���]pN������Jδ��r�&�ϊKA�o���4e��eø,KҶ��*G�~";�������c�-��ޜ�)��yPKEePQg8p���!pip/_vendor/webencodings/tests.py�WKo�F��W,�I�\$��`�`@q
�9Y��V�64)p��|�#�(��{s�K�K:�"�/�aG�Lr9�7����FA�����|�=n�z���B�'>��;��q&��|��)�1�������4�=%5
�CBon�}4��?8B��ӻ8Bs����i@"FFh<?� F���\�'�{I8�!ji�*���R�&���[�	GiD��`R�C�{����t�A���d6���� �=\�3��A��6Z��(H��8Ϥxұ�d(�ڗ��q��j-�
a�H½SF�K6YsG�J�@ݽ��
��ۯ��=�zy�0�0�nYVJ(V��縄@�T�I(�^�u�o��E1d�7����Ft*
�I�ĉ��%�r��
�9�M�ʸ)���Z\���軎�>�݋�A''H/ԉ~�C�r��(��.�h7Q�H��_���D��#"���~�G����ߊ(�vO�����8�l��k9�s%i�wO�e|Ϻ��wG�VRw���
���`!�4�2;�<�8@���D���߿.Ű�@t�(|@���P�"F9�F�C�Nz����K�J��Dj�ܸ��t�l[x��Ge�Zm���4�E���'dM0�4����Q���)_���<tb�?�
���[�`t�&|�qW�H������^��	�1	�V-�nɤB@�^XIj�Qj1�pxr���RV�,х��
�e;U٢&��!���tk$C8!��<��C<�������p
=�ݮd�N9�ɏ��ډN#�M%{�ț�6�<�q�m�w��t�������YG3:�mT�S;�����ٯ�����A�Ƅ���@a��
�\l�YZ/6�},SiU}��?���k?�P>�)�t�\���b��J ����f���>��]I}	kL�W�)��[4���ՠ`:�/����
�N�����`�;��JtL�2zv��t̶��~4�X�d�������40J˛��S)�Ɠmqn ʽTD����=����ȓ{v@��a�m#{��2�n���<�*�%��O��z���4���*/)��h��6��zO�oAt��ۚ�t��;k���xӅK#9�`��q��3c�56d�c6���F��S��z?�42s��f�q��[�8;��P{N�����%aW�jyGGLPϧ	CI�<�,��tG��6z`��t*�:}>��Q�s5v�H���ٞ*3,˛���g�T���s�8j�����]9J��3<*M5��n�iu/���r�n3Vs�7��P�iD��Bf}��-W����[�n]���$�XF��AHj���ܤ5��'�/�d��S-w_651��o��/�0I�ǰ7%�V#���dO�zZ��R�Dv������^l���P�੿�+D�9�>�+v�0b(*���fwC�_0��l�^��&��T�O5���������i��Skl�PKEePQ��֥�*pip/_vendor/webencodings/x_user_defined.py��m{�4���W�����!N�6�
c�u0`/A����١-/��(�Q�]?�"_�s,K:��ܫ�j��r$���6��f�!���뱢w=Yd'�L�������8�E:[d4���e:��܈rJ�zg��/&�.�z�H�76���#q�C1�G�܈�t����4���REyA#��+
"������ʼn0s+4�2�
�t�e�|&&�,��&�U}s[�e��h��%Y����*�6���\1.��g��dQ�W�M�*�j	�V{Q���tE�/�eW��s[�[EiSU����\M9��SSigr1�56fw���2ɨ�ts����ƭ-���%��,W�~��IU����;�[��wd6>u�����j��=�y���b��by�}WWߧ�͎n{��X�EiI�^�ՙlW����!�}�ܚ����gj=�9uu��/���2��iw���N����X�i?s�����Ѹ��b���P�������i���1T��PH=Î��;��+l�ʏ�����me?�V��U��16���p������殉�r�$�\����\A���ڃ���H,l����j�m��BMݹ�q�>�`(ȝ"�<��Ӄ~��il���ͭW�~kF!�p7�C���p���yLB�|h�5
�Y�Q�4
�F��(T�J�Pi*�B��0�qeC��
�a�7�
��&s��!s��Q�f�Y�m��a~�|��2w�=�'L�,�)�&�#� ����ߑ�S�#��s��C�c��y�<e~��y���
�	�[�S�w�s��g��s���/�?1f��|��+^3�0'�_���C�O�?>��sɜ2S�o�ߙs��oל�`���W���'�yͼa�����_��;p�~g��`��$�d��.&1��d�L��ĘHLL&�}b��'F�}b��'F�}b��'F�}b��'F�}$�H��#�G��D�>}$�H��#�G��D�>}�I�'A�}�I�'A�}�I�'A�}�I�'A�}�(�Q��G��B�>
}�(�Q��G��B�>
}4�h����G��F�>}4�h����G��F�>}}}}}}}}}}}}}}}}}��1�c�Ǡ�A�>}��1�c�Ǡ�A�>�t��O�DT��66���ׇ��J�i�۷�M�PK�mW�L�ԂB pip-20.2.4.dist-info/LICENSE.txt]SOo�0��S<qj��u=m���k!�S�1$�x
q��~����MBB�����
��=���{x|x������7Э��Иӹ���1�6z%U9�lg0��zo]�CkF���X��41FD��m5M�Aտ1"��Ce{��
j�B��E��R����w���W�O�U =r��Bk�YyC��'��T���=�ņ֝�Ƈ����Pݝ���ٓ�)|����c���5�@�f�5����m5���瀗�.k�
s|v#x�u�`�����4�*�@��[E��u��`E��أ�i��+��:�\׹FCɾ����"Zn�w/f�r]�Z�Z��[�=��B�{]C]���g$yp���8�s��+�\�-SD	���"�)�X��Y[�?���P,�;�K`�~�<�#��P�,A*�"<�A�I�IE���RC&�B#��@�7*����\%+<��Ȅ�Ű:'�%�2(��"�dLA�Q�,9ʧQ.s�/��5�UQ
�3�\�,��n��b���J�Jf)���2��Ja�$cbC���O(�,
h��n����1�$Z�<�N�k��S*��%��)QR!K%���D��H��+U
�lG�)������J�GPK�mW��{i<}%pip-20.2.4.dist-info/entry_points.txt�N��+��I�/N.�,()��*�,P�U�z�y%�Ey�9z�9�z���yV �˜%z�qPK�mW���"pip-20.2.4.dist-info/top_level.txt+�,�PK�mW��_npip-20.2.4.dist-info/WHEEL�HM��
K-*��ϳR0�3�rO�K-J,�/�RHJ�,.�/�Q�0�36�3��
��/�,�
(-J��L�R()*M�
IL�R(�4����K�M̫��#D�PK�mW���]�pip-20.2.4.dist-info/METADATA�W�o�6~�_q{
����6Ⱥ�iW�i��=%�t��H�JRv��#)N�~�Mݏ�;~�?��p"���Z%p�.D�	Բ���8z,��f����r{y
S]U�2�i]�J��:Q�R�d�
�����F�;]aX�
�j��1e��m-"���!�f���K]��U���e���q�����_��i��2Ee)������诘����yg:m����<�l�ЍI�7̥+�eD�lώc�Y!TNp��Ǩb"fYb�pc��=n7�dvP����@�<����Z����4�%�upY
G�W	|�x���E0+��r%�(<k��aAE7�^A:kRf!^x@#��rmCO�L�J���>m;����b�um�\O���哮e��rap��nd���<r$ԹU�suND74El������P��=���G����`�����8�c^�%�m3^��T����l�+��H�6l-��z3��dE��E�<���2z�S��,I"��7�7���&�̓�lU�6�ߎh��'?AE +�^�d�G��Xf�u��@�k/
v��8artM$V��n����c�+0ө:X�Y���u��'$h��	�:�YzN�J7�����͵������
�BAc[�vzgz���2�j��q��w
(T���>2H�H��EPj}��3dCE�`
�&�p�$��M�K�ps�+�-姯���M��@����N`C�O�I���H���Pi�
�[�L?H�2:XYͥڇ���2)MyZ �%�`�����������3
K��-o�-+���r��i��/+�6���z��b6<��6f�[���,k≀�t`d^8�}��-�t�e-��N�z�v6�q�$؜[��;�y=��#Ӷ	��f�%v��ӂ�h��l�kj��� ���3iSr�d����ф̯f���
�5����c4O�'~�t��Ά�Z�C�3:�G�58��C���^D����j�Ȩ�{Ų�j;4u;}\�r�F���2��xfZ�i��O��Պw�Cb�qH�V����g���^RSe�$�d.+�eM|���I;�{MA���vhY�m��0�\G^��f�T����K_�72C�=)���z�����}���C���@v����*������H���;c��X<!��`��N��ε�2����/�pR��=�M��t��hIwk[k�!�2�GS&&�t�w˛ބN��-ԍ]!m��4=uc�y���O�m���D�']�����@����Q6�"}^F�ߕP���x�gh��\��}�
.ykF,S�vY��ů;����)���'b���n����A��恉`e	�*L[s���PK�mWS�N�B��pip-20.2.4.dist-info/RECORD��ɒ�J�58/�z�/�fPz�!$0����o��P��<
)⻷����fk��w�v�:���M˴w�S/�.� �qa�ek>�Wi����5��NDy��5̔�P�jv���W�������0��0v�o�����D[i!�qz�
5��;�e������)Ҡd;_���M��6A�d�c"rR�ik�C���<t�r|�$]�;C����H=R��F��>�#k�c⏪�#�x�� �^��+��������Fy�B%�|\U�'�(?�G�@B>T�=����Ӫ|��
I��0�is%��[�m:h~L�7OXU��@8e" ��Gs�O���1k����%/��R��g��a��.)|cJ����-q[.��yx�X�b����DEy��9� }{ �H�޳YH�0��1���'�ti�����G�tu�R��TG�ŵ�F����y�|��^�zDA�iJǮ�N��
��G������zJ�T�MYW�����;f�w������4 �^��-����K�	�3�&DJ�sV�DDD��Ϗ���DQ��֨}��&�Ԭ�6F��rDpR=�QW$�x�Ʀd���nG��Ǿy��U�ف��y��nb-�?J5�+��2�Ū���y~����?O��
}TE�GoZe����x˛��+y���b;CHK�\�w�|�������_��@�Yy��;p�?\2PGǘ�.3��l?Q	A�H�v�AV6��t?4Ѣ�el[�\����	Cf֬�e�V�"p�{�ֻ�{��U��X1��=j5͏�=��X�_εG��Q�}�O��⺜�#�3~���a��Yn𜲝�X{W�����M��ҵ񊬌"�s��@�'H����ƍ�?*�fj�
8�x��ˣa�!��a��y�
����Ӎ�ia�L�`tI��&�-f6���b�bnx�#��~��U�F]����K�C���>YU{���6Q>����p�͜����>�����oԍKW�j�Q�
{��Ff�������KY�ɂ��D���N�2��b�Bv(,Ө�jQ.������0��;@��M�4fw�7A�l�C�-:�^�yl`Lx�z<K[�~>6"�ݾ����.rV�[�-�S-�ك�;��T2U���α}g��n��+�Ut�|�K�Z�;�!����?
��yP�r"��L,sk�N���}L_���n�P�y��N����

G�!�������~�o�<��jT����yn^�g���isi
�7���.fɓAo�������au�w0@|�ݿ�߇Q��4��p������õ.̍��R��9�S�Su��N��C���?�/�UO;e]V]oAYa/��1&b�"�p��vL�[����\Me^y_l���7����°�a�
bb��+ԔϪ[�&�Or���F��&�L�S�Ym�'���;�g���0���jPt������9��*m&�:N$K�+��P ����Gnm3��|,"{~���Fy���.��P�i���<����[ZΦ3F	U��m<��^�r3�<����c��in�>���k�������`	v��s�g��~��<�^T��=�8ǴI����\��)��8I��9�Q��@��.���u���F�ƾ/�c{HZdV���J�.+�V�Ȳ��;�r;���K��u/0r/1��c�\�%:<n5r�Ҥ�Mc�
L-,{c^$�3�P~n����w1����˂-��/��q4�$�䌅�y�t�lß	�_�_���.�C)"E��fBذ�V��v��)�}	������G�skS�Ed���C7T����ǴاXf(�9����"�u2��F��'{��nkŕ�+tPS�(��?��v7s��g@��~e�-."���
�{ףW/b7yF[�jj�B��"�c!p2O��8�C���T.��>L竀.���,b]���b-?bd�A�lg�ż�I�u4���8_�����dIt`�׻gW
|L�t�f�����7D�ju�^�#��Q��=��\�2���Nt�r)�:�=!�=�@���7������rrv$O��[��6����ꕛU\�Pp߂�õダs�j�$gft^�T{�VH?z#|��?еd^��篯�����>D�L;,x��4*,�nV���l~l%��e�Rv0� ����q�o�f7��n�\��Z
U�1�w ��h���s�F�fE��7n�h���^�cj���U�n��T$�T�<�﵋������iˏ@�C�C�i��;��
����)�p�&X�L54�Xp��HW������Q���U[x��d��^�,k6��f��z�
���7[�����H)&V5�*[p�~ږ_��x�8��/��Ⲻ�8�`8��Q���m'���&�$�-�>\�o�<-_)�����z��|���E	ނ�E�-8z`�s�mY�g����mԯx=@.Ѳ��	��t�/fU�]��#F�]�A�I9;�`!`1���\
���u�e�;��|DE��� F�k�#p�zc�8��Vt��7'��mte�u�>��8Ҵ�u�];���t7Hup[s7./@6� ���{m�n���b��=e� J�A<�|\6h ��A��p��@JJ���O����|����>r��%s�92i�*g`C�jQQ,�0������2ꧪ;3����hi���Q:���h�}=�*�M�<~By�X;�CI�{C��H�Vǫ. ]`�m�s�
H��xX�^ߟ���K����OF��=����-�m0���F�=�X'�'.V�no&�c.�B� ��p����U`O��U��k���O�B��at4R�T;�T�?й�.��Vp�+:��	��x�1�R��e���'�n�w�{dG����,�k*�t��.�|��u|��H&Ǎ�x]q�sz���t
�TR�--������)fj�0�b�EY5�)GM�!�f�,"�,�ؒҟun.�^st�I-�,'{f�/�qi��p��{�ESM�LS��� �y��o��ܹ~���ݫX���D�9ҳU�Z�9�\��}���{ƛ?T��4����`�N��R`b�srM���M�Sq�B���ȿ�Q�8ӁVW��Z7.VbH+L�WȻ��ʈ�@�?����j�}E�{�N�	��~a�)�!�4��M#<���	"�@����2��#��zo�@�5�D9�1�+zbr�q�^���� �A�+ğ������Y���Q�˫'�W���'��=��靳yܡ�&ur3E���o�-���ɇ�wo�c����>V����H�����f-*v�*r�"��}�>8�>?�
z��,���@?�I+h�G��F͐�����r����E��T⻣/,<YXHP�T��g�0к�5ⶫ�a?�"H��v�n�Q����G���ܹ���5�
�K,�ss٘Ru�O�c9����ɛ���7�>d�,L(Ƈ>�Z�9�%Hó%�
M�}���FA����72�Ͽ����d�pe����	u���8
����â臃l����Q��It{5�i��绍�6FV�*�n��~i�lu+��ƭ7�C�n�w��g&�
�r�ÀB�;(`#��@iBB%��"T�=�a��L|�E���Z�=Ϳt�����Q.�c/g{̯ؕal��h�_ғ�9'�8�?������bAv�V���-��O����^�����S������^s�p�~�컝]%�p�����tr;��EU�p�3��ڷ[Z�%�kn^=�#VaA-ד(Ed����������ۿ�'j�l��O�ߕ[�ZX���O�Z�=����ѯ9ĨNA�q)�����	�YvW��q���V�S��Ϲ�raMu�&�>��E���5��\-��>���?f�����~���\����Jp��t�!�Q7f����T�Ɲ5���x@y:?	��>�o�<��7?ˋ��遼4�'g�M�D�����ʗ�� k��\���Y*�]��[(xu9��`���uK�<��5D��c�Ќ48H���ϼ�{Yw���^=~6��~ i�ԭݠ N��	��?MG۹���J�A��6�3�� ��-��>���a�ﱸsb=���vR"��H�}h�=Gn�q/-����s�ӯ�{�k366Fx�!�# ��U;c#׮Et�q���ݖ�~���mNfHۨ���S��X�$:��H��6]��f�`�h8�G�h�!��s��7�$�à@[ۃ�ɮW况��-��J��*M
�-J<�6����W��?n@��zu�_b�����Ej�ŁG�ݽ�#��o�L��w �9���S�"��7��Lj$?xy�q
B�gКPmϳO�L�����M�4O���u�\OK�}��.W�!�G.�6{}�c,�`��B`�H�P�A�S���K�(o�H(�$���vVL�-;�*Ƒ��B頋�y��,�ƍ�d'x���t�VqE!�p�=WbK͢uݮ����Tb��DMY~��gc�Øc��/�����.��0�:i�zֶ�\s�����x����r��R>;�l�����z�]�P��su�HZH�~�qW��n���?�LBv��Nܖ�ßE��2�´|�NNV�Ѕ��Wd�t#���Zn�,S�}L�"r���-�����v������Đ�}��Fb)�B.j��j��C�Y؍��g���';얮��׎�݀�>b(Q��.ɏ�c�c�Lc���
��	�xmb���m������u���*�p�:�|�f4N��iJb��2§.a1�Q;�pX�Ǜ�z�oȧHbob��=�E�=Mq�>Y,����0� }�S��ܡ��ӳ��e�\��
�����/�����iT�*L�;D��%��a���`��9��Q�`h����]]��^Eq'�Mè:����8壺2u����ИR�;�33�GJ^��Wճ��\V�%�������,��4��;��0�}�E��X���V[�,�r\��`s5%lf�F��a�TR#��,�o�ꯪ��P��f�o�������m��HJ����������m��٧S@Q2.�)�2�p9�!>�G� 0����Z�����W{��J�qo�=�0ٓ��~mۧ1��%m�T5˪��ߑ��?�v���3�m�E�k��&ڸ�z[�."�RūV=���Λ�:��:�Ʒ՗зDj����\ޯ�ūv��n�鮖ˡ:&��©���M<lӘ3;�P�A����Hж�׵�d<fZ�qx�*�����)�e�>��=�м�;��~X��jw�
�a /�\ξm�	�~\EIlgg2��ə�d�܎����'}U�9��St����,�e=�L�9�-^ۼ�^�6v ��
�S�ތ���,i����8z%:��f�K^�{S�2��/+rO�'c�a�[L|��j'0S�4�]�	�E�t7E:7���&�h��rE
��>G�>&�Ӷ���8�]Z���B���jy:ܯ��O�n-���Pɽ�v��@�W_&~-�{���9�����Ê����դ��cY��?ˡc�-uSi��F��¼CAl�p-*�*�Z�$̚�7��*;�؆'��[^�����@�\eo>_�:z�C�wؓ�_���}=�I�(L|]��q��޳��!rj�6p�)��tk#_�ꜚ�6��ӹ�y�F�a��p@O�"j��z_ZT+#�j:#�����A4�PTK(���^q��P��q����nD�����aP�ۣ��P��/]���H޳G>��tH��նb&?���7�gK�V��Ug�hh����7H���ƻlM�����gj�$�G�ƨ��;=`���m�O]ȋ[V����2�9r�`�D`��pA})�-�kd�?�m]�C'..c1��i�������e��9���s������Q�W�:<�{n�Ӎ2�('����f���qV~5�"���46�)/�w��7�9���g͊�@|,Һ�n�a]�kx����Q�j_WR7I?)#Ơ�O��^�_�Ћ�aЊ)O����w�ד@�R8�b��ϐf�p��ߖX/�Qٯ�O}d�/�qZ����R��u#�XWQ���d��Ej������ߘOƴ|���=���RV JvB����
�h��f�?��x�x�ۂ���o�.}�0�]FFn(�.�L	<Y6tyP�B,�����$�d��7��
�Ϗ����u3RO(R2]�;N�胋�K�9��n
D�ˬ��y�^�wz^K=��S�r�E��%e�ͶDֆ���;�O4��<(^���pl)?G#�A�]7:W��z{Dz�
�c>�@�B����]쐄E���ҟ��Ra>$3�oY��xY/�������{��=@&I#v.A)Y7�5SG�1�<c1�e����Ӳ?R�젎��X�ZSӸd#-Y
�d+'�PfM&u�J�e@����˦07n��(�Ànؘ����+�f\�U�G������0�<Ӭ������w�9�9_׹-��T(�*��*,\Z�):oN�og�;I����O�WgA��A��s0�N��+�e@���Z���ok��nK����.��w�3��_dEy�
2���I91
��� ϲ��!����yd�j�$��?��-`��L=�}�&�
a o61	i`!���������ߒ�}|P���E,��2T����v�X<=���p��!���v�_�x���n�m;��,��1,���<fS}n���X)�:�Sv�v���O��[Lm��C�a�r�V�j�-tO%vR�$I�b6�F{�������#�O�}z����r.�^��[�\vD�8�F#X8�q"�7�ܺA@j��{���7��fZ�yt���
���vBV�;0��>���c�M�ߍ�7nP}��3�aGՉ�]����X3��ۈ�*p�&�O�a*�~��+d�a��v���9��
<�;�}�O.-C�N��.�*�����{��1zo��u4�]�������Q2YZӼ���������xr7*��B~���x����o�J�Z��m��#�Ҫǐ؍���PN�n����{��
�����k�~�n:�BU�fE��|�T{���zT�_� �Z����sK���π��@�b���B�c00�JA�`Yl�q����8�>�&��x)&�kK�<_w
��H��>Dz->k�ˎ����w'��WA�y?&*6�L�W�4��łe�R�;�{qJ�4`��Z�W�����cE��>�x]����\Hm�o��GJ���ٝGѧ��j�$B~���A`�l�Jw�1�.1u6��d
ǝe7W'�NV6�a����r(^c�S�^����x�8@��&��bN&I��v�M�V9���D]���Ҙ1hO0+�(E��0_α����@݈���Z��K��I�-ސ���>Xy��W���2�\e2���b2�Ȃ��a6ف��rDC�T�%��ċ�����w "f!:K��@U�!E��%2����d���7��Dž��[�"��\���N�u�L�Ɛ�Vӻܫg�y����V^������U�2?�T�!Kz��kq'bwK7��?b��۲�
�-�b5ūAᚼ0h%��/�O��QsS��b?��_������ܔ���p�0Z�C��\�ǖ��h�\�N$�����[������\��Td�q�Νg��jn�c:2H���<�A��1~�Xx,��-%o	����:�����<r�B��b\=�%���+O"��>w%�/��'�
6&�3K�$��q!3�fg�b�M�SS���|��۞�u!�=���k���W}����v�Ә`�)>=Ss�a�uP����f�j��+!+ppE�� h@�v�_oKB
%��P�ۂIygR�qs���!���Ж�jܯ�rhΛ;�����xN{I'�²c��� S�v��햸��`�O�Ҧy��"��=�-|�Y�|� Ɛ-c��!��#!��9x��?Y�SD�FQ��O��
�
ž.�W�(]|M�@�kV�q[�����8R���^jy�Gs�H��)8�à����u��s��I9!����ĩ1��+����l���9�W���;�M��n�M�M2�
.3����!P�w���/�أqX�&�\�OW�G��C���>g��,�}觰�~h��K�%� (�U�kDl�Q�ɺ�ۭd��nZ���p �l�~T�J�����$V'=�3��9��_�[������t.��r53�
$v���'bD�$�r��}�ώ����m���h������9��g��K���i]�]����4�-dQ��Ah�%
@�i���h�'�s���y����&S���<l����^�"�}�r�E��V�7σ?D���}��K��!��=��M,T�k7�f]��.��6��P�'J��/�X�C��܋rL�����c��]p�.��h��0�c��6��-��>w�Mj�H[�zt4D�r�8\���`�X�e�ۑ��d(�g��˷_��u5�fTH~q8�"�2믤k�x��7#2�G�?���_�;�%Fx��:�8�颥�Ž7SZ�l�jFGZ�"7� ��������0
E�Z��G��H���#3�ޖ�yay�v�-V!?��o^P~}�X����IB9�\�g���Ή	�MG�6�GS�v?�F�W�����E�ͅ�&��,�.pwƉu��1�Qˆ޳���>���4��j��n�l����,JS��x�
����R�4��B��Mbˡ���`����6H
�,7z���-��YB�jZ:�l�
)��	��i�OԾ��~����k�����f�F�$VLRnZz����ge@>jП[�q}��Ӟ�c�:+�v��Ȑ�<�d�l@��,�)�ލ��GG�/���}�s�1y����*�W���A9�Ѓ����W�1������Q���Ņ|��F�GT�ax!��`O�
�-T(�u�?�m�;�{&�?Q�cDeP��剆���O��Y)�(���j0U�v�g�����R,�bsJ�^�DEN'�ߵ�Vu���D_;_Қgq~X�����H�1�Q;��f�gh���*�|:iβ`žs07W�%p���/�q����l�J��(��D �$BȈ��w�� x�D`=i�u�< 9$`9/����J7�Yխ��n��k��칁�炡߻xC.�2�G_��g.���j#�vօ_'��f���^!\6����)���^���;N|aT̝�9=���rOV�ZԈ�:�^,��,{b���ՙ����ZV�-p�[����%՜��
���F|q��Q��0��n����ـxa�"G�!���$	��,�t� ��G˽d�Oo�J�@wA��_F�\�z��2�(�
�w�F	�
��Ph�w�]�?�%�!��ί�D4G�<ӌI�!�J&��<��_�!S��1#�D����;ñ�ǐWԊjQ��q3�ԛ��c���*���4�?�V�$�|�%x�L�������˞Z�-�h#
ϐ���s\e���D��n���c��8Fr����SpG9=�̥�\�铰�;~o5����m.��F�|un��r7�u��=�m7�#t���ĈV�#�E�������
�'R��N]�AG��;�y�$��O�9XC ?�|ƈ��tm�0��ɷ�kG�u�_�{����-��E�C��)A�s}/Ȟ�m�x��t�R2��{�=*lt���<[����d�������-
D5�y�4_Nxx�����i=�zϾN@�H��#��K޴O�\R�f�)�3�}D�70ׇ�~9C�'���(賣���|#a�y*���/c���ܐ��Fdk���YS���7��dn�FB�d��!/}���}�|&w��
��~�dɫ��vռ1��gc�)�x/�|
�톑��xk�����
r�D�IR�`����RJ�?;�MH�"G`
��G���4E��m�o��,�"K���/|��L��~BN�����i���j�嚈V��- �Q�hm�V7k��X���ϫN�z�~�����*uQ�,�p�>)��f(����SD=�!1��Ya���ޫ�����L�/)�1u�L�>��3?���IuO�M�:$�5]d��_���J2;�Ա�N�Wp��.�T��S,zW`��A`��;���p]q�/�~Ye�}����׬qp�|���)dq�2�d�0�!?`����#m^��=��\����F���Gkf`��;Fvm@�W!i����ӯ�V���x0q�ܒ�1s��#�D�34k��]�M
Q���f�F��y���	0DҜ)�W�����?B(��:C{�@{��-���o���^��"N?���kt1�����[[*��Q��ӆ�^�y�_��LVq�[G�#�rS�(�R,Y�	�B�dOTMy������-��-���׉�G}x��ӄ�B�r3uHR� �R��a,µ��ZyRK�@�L�d�:�?��Na݋�P�c;خ)�φ��Vi1�l���ۖ������?����"+�Y��VA	$
 �
1Jfc;���6+�
3Rs�� �:}˷��ճeX�%Z6P=R�>֡�?9����M@�z�0�&�Q����(���󠥗�]�!��G%��O�B��Es=\�Z�)5^	D=�G�pOZ�^z��yϔ��YX%�dU�Pib,�p8qa�ƕG�=�
�|�#H���1%�Q��<�g�A֜nX���}
Õ�O̅�Xtz�}ި�����_���V�Z
�6[b���)���}�=���N�����Z�Mhȯ��R�/R����s����c1 ��QF;�>God��eMY���������ה�>^��:_�c�D������hd��ݝ|����g���'3yJ����ti�{�1��]�ћ�,fӈ�Y4��/�����C�1�^��ؓ��C"+�bZ]OGau����=���)A��{�?��/�hJ|����;/E���f�7��8z�P�{=�#H�%!z����Q����Ss�N,��-�r&���
Ȱ���en��%�_M��։���_�7�ۋs�%��A=��G'XH�n�r���YY�H��H��<���O����@aY@��*�[ln��7����ފ{;z��˿Jy;�jHO�pYG8�kx�-�E�v���?MK�\C���P����ܹ���K�Z.�A�+�ؔ�%
a���zȂ�0�O�U����(�i�ٽ�#P�E&��#il�L;�)���Z����?���L�790���~�Y����f���ps�z�\��7A�����8�AK�Q�f�JN.6N�<S5}�����^�'WiX~[�&���%�a�8��!TRSqp�lj�8O"�LH�;�}���|��5��G�Ǘ���=J��[0��M��"�"c�`P�P�Km�-�$���d�Xі��[�R�7ㆧ�1.{��'H(�"�s��[�/Sq��d�)����-h�0�W�qT�A�4������z[��]\����a���qw�V|/k�%����s�e;���n��-����/��j�y=;�chX�6'�)4�+�vz�'�(
�H�+�s�i����Ӏo+�g�Q�%`.��؛A��]�U�O��[�ჽ��F���-eD�7�\	'h
�����iܝ7.���tq��qA<����RZ����~��P,MAw=�g@PR�5���e�E�ѳ�A���2��g9-�|-��O��T���G�H�3b��܍#q�1c�ܶ��a�}�?d��(%�:k����s�#�5'�H������b?���]���T�M��W��#�"�y����A�@��Q�f�Nը�0�}������g9��!L8�
Ck���n�C�m����oc\*I��[�������1nG����4U�<�D��9,������=D4��K�:q�W;�=�Bh�~�Z�~ЏN$�~	���^����I7b���}��� 8�
;��p�mﴇ�!p�ED6!��� ����#y�A�^[yA�祜��b�՚1q&�PÁ\�vzF��5��
�v4�d��в��N~^���@3����ď4Z��VCxZ��L��=ku|�Ვځ�{s�_�����aunN��/�BVЦl8�%�RFí>��)ޑ�{�_�^��I8�J<%ԣ�h{��b���ft�#��H�;ڲ#Avȿ/�}�wu������&s�9��"*,}J�|!&�4�N
I��|
��|C�'�O=*w*����w,��Ί2
K�1 �S�8H��;��}/c�$��	bz��C��нU^��N���q���s��I�/cJ�؟N$�6!�\�y�����b�N�D^��J�������L�(�g�-:P ����]�%�,T���׼�:־p�Q�W�;�����A}~%���\�=���.����x
���\\R�.����u�0�qh�ۀ߻����/�*R
��C��ӱ��A�U`/E�T��s.6E��mi����?��ڕ�rp]IB������=��%'p�A7��q���^oԜ|���g�իQ_3���
d��W��\���v)���4�wӸ������ۣb�5�>�+�9�����"k���/w�G�j���
��e��@]dTF�@��n��C?Qv�̴>��Dz�rl4>g�A��7*��֣��'�@/9߭iE�4!�s��TdS�4�
٘6�|���z�ki�(4g�+�Z皾����=�x�V��Z}v�d�Bn~�ޝ�?�������\�W���<]�}m��"80�ƭ��\�jA%���W%ށ_��gkV-��cw
����ù×f�W-�Hՙ�=�	�}��z���`�g���r�h��� ����K"2Q��y!)2�����-仵��|�*��!�:/��Zu���$;�i:<�^����C����/����y`S
+��^���784oI�LўY̶@O�;��?zDA�j(�^T�r��Q���\�šr����Nl���jG�je?/C�_���{H^�	�go$r�7k���瓰R5��������#zD����Q���U����������,#Q�tj�˽�.Ow��s;y�ۼ �_5o��Wr%�$!
i$�A����!���,�t�+8������g���3�`�w�>�@�tL�F4L.-@<���px_A��G�~�:�ZS�ő�j�l�p��A��{�¼��krKD�[��(��"�t���k�A���vF�e�W�P��R��7Jc�?�8MZ&�Ð���q�RI�y\ty!��������|���bp���H��.@��ۿ�ϫa�{PZ�ِl/�R�?=�i�1���Θ�[��O�l�~֌�g�η�ё�ʰ	�7窶���#�XȀ�Xzw�(����q�,�“����x����9���՛�-�Ԑj:o�^ҫ���A~����3�.Ia�4M��@6�8��i�\v�l�G�F
q��/�H�TVT���fIE#�<3�H�
��_�nK�P�'-K��x]�Y��e|=h�6����^��]�sYz��I@�C���y�q}�/��+6n��|a�fҽ�.4�4iq��%l��^��@�SK����C*��n#�e�n����3��=a�{�(<�:��B�_�߯Y���~:w��hp�
>L�]ڌ,���L�ivm�.� ����)���o~�q�����`XB�C>�@�b�(���m�M�WtTߒEJ�!�K����=��ڗ�q�
n���gn���b�;M��H2Mț`E7�9���R��W��Y7M����~0�k�ӂ0�)�SO }F{U�e.{�jw�cH���s��G�?O~)o9,S�{1�먤��M/�LC0�{��7Av3��2җ��_��"��H�F��[ă�6*��{�ɥ@��1�� l�x>����~i���B�{|�0��He��,�u���1�5����-AC��z��?��=�a�K��� -4!ȭڸI�y"�rf����d���~��f�/G�?ܖ����&O3u�/��5�[X��'a4@�%�al%=1���M��˔�*�����UP_߾*�J`=�0|��~�"5�Jчt���;��%አ�����/��}I�͔*4,rT��A����D�(ve;5�I�[����/�0z��/}mϬ��6I��r��i�����m�L1�`{��P=���N��>�(�q��p�
]�����~`����1(��ޑ�}�_�U�A~���֣\摀x3i;��F5����ã��+��
�^���~a��kn�R�O��B ��CD�����|��"{����y��[���j��|�;�	�� 0����43y)og�<I(I�&���
����/�B5���N�_mW����EHn#2>2O
"���2�<|���s��S��;�F�$��ڹW�����=;�hQf���}~(?F^1-uI��uI��+f���si�;�������~����j9�g���XV��R��_��śCь�\Ƶ���2C����/�O�d:��A�`��v	3�XR?�˒H�;`���U�QY	�ۧS��2;3�P3���l�N�>��{����IU0������6yV���;U;��U:�{���
���e�`�����`�VOcKrS�Y���I�{��a#xz`.~~�����²O�e�3'�)��Me�%E�2�P3m�\O�< ���E
xH�F�"�/�f�������� �B�X�iF�0r�u��Y�ʁ�Ȝ(��$q�����­���{-w�V�`�k�qW�=S��p��ȁ�GL�|����W�_f�"7��w�/��9J��`�}��֐˸���D�{��JR&NJ�I�z8�D;�qu�l�5^G����}��XG�X`\&7A������T,-���V�!�&�V�ԁA��y�ާ;���&u�\���;7i~-���T=E��,�Z�u��X�Q���I�4�{.C[��U��R����8K�/5�Z$��ڻh�{Ўb���Pd9��dӹ����,enr��Iy�{����@�]��{�v�9D��I�ٺ�Pvb�L��6�%1?�	t�O���/�j���i������ĨMS��9QL�'+uP�z*�N�qO����=��H���O�}´��4��D�&���cȭ[)P}�MD�}B�ƬH�l7Q}�`���.}�3��(�0����;԰u|�i�K�>먼�����v��G35��u�������g�?�l4��Ҝ8���v R1&���hfNr �I��S�O�6�(s�`%=������~Zznp��4��dҍv>kpv����{ �Ha��թ�9���-�N�[���G�	��`�K:�)O�~�JO�x
��?�-m�܉��bޗ��K�om�]u�u�R�7G�B!�TNq�]~	�&��h�Ԗv�kR�{I�{g�R��U�Y"PBx����R7vm8/���dK��KEo�%rJ=�IY#p^���)B0�7��A���lJ�Τ�y��d�
���D�F㲓!o�T�*ܹ��Ԃ�`!D7�v�|27�Z����^�
�V7ܑ��/fJіuӦ��g4z&x��7�"k��
�ǰ-��*|8i��^��o��K���h���ȶ���_��|C�>Л�����0ݟ��:=�>3X�u
W��hg�s��˽��!�XM���o��4}}�XT6н�d����C��@V�cuG������&4��r:�@�^��u�w�ӟ���p��Y��(��+<�RU��˅|_�GxN��I��{�J��do���q,Mc)a>	V.O�B�@�q��o
'��~��@�w��y��J����|J�j�خs%=�����&2�Eu(�h���Z�}�~����Z��$��ц��*���*���U����rʹ�x��K�ȡ��7��qߏ1aR���o�=��XB.H{
:Դ8���D�c78�G�,���_�`��Ϗ ��=|�Y���N�ӭ�ׂp�dË19��f9�{=�l������6�k�w{��L�V�4A����]2��Y ߠ�����&��G��t?{�
��ؾ��5b�����1�-�U0�,ƫ������Z�O�<,��iV��W�PöO��pMx:C�fm��7�=n�䔨���'f���|E>�ɐ�3���ҠM��a��1����D˼U��Dq�N��uġ��%�AĿžXZ=1��7[������&�q��k���%�4����.Bn�P\�i�kZ�=ȏ��G߃�q����S|/᜴ӋAw��*r%6)�G�Ä6��b��
zS<?8��Զm'y1J��?/���tu���<bS��}�i�f��PKEePQX��#���pip/__init__.pyPKEePQh<����Ppip/__main__.pyPK�mWv�OV5���Upip/_internal/__init__.pyPKEePQb;sXr	����pip/_internal/build_env.pyPKEePQJ4	�>�/��kpip/_internal/cache.pyPKEePQ��
\#7���pip/_internal/configuration.pyPKEePQ4V<`p]1��u+pip/_internal/exceptions.pyPKEePQ"�&�
L��;pip/_internal/locations.pyPKEePQqM-���kEpip/_internal/main.pyPKEePQ�^�z�	����Fpip/_internal/pyproject.pyPKEePQ���?	{$���Ppip/_internal/self_outdated_check.pyPKEePQ�H}m
2%��#Zpip/_internal/wheel_builder.pyPKEePQ�w�4h���vdpip/_internal/cli/__init__.pyPKEePQ%�����#��epip/_internal/cli/autocompletion.pyPKEePQ��7�V$!��Mmpip/_internal/cli/base_command.pyPKEePQvu�q�np��3ypip/_internal/cli/cmdoptions.pyPKEePQ��zv�$��C�pip/_internal/cli/command_context.pyPKEePQҦ	x�8
����pip/_internal/cli/main.pyPKEePQ��!�[ ���pip/_internal/cli/main_parser.pyPKEePQI��%����pip/_internal/cli/parser.pyPKEePQd-�,0�#"����pip/_internal/cli/progress_bars.pyPKEePQ�ַ; ���pip/_internal/cli/req_command.pyPKEePQ��e�������pip/_internal/cli/spinners.pyPKEePQ۬w�}�!�� �pip/_internal/cli/status_codes.pyPKEePQG5�"����pip/_internal/commands/__init__.pyPKEePQ��t#�,����pip/_internal/commands/cache.pyPKEePQ>|nU�����pip/_internal/commands/check.pyPKEePQQ���	$��i�pip/_internal/commands/completion.pyPKEePQ��
?
�$'����pip/_internal/commands/configuration.pyPKEePQ±�tT	����pip/_internal/commands/debug.pyPKEePQ�S�6"����pip/_internal/commands/download.pyPKEePQi��"|
 ���pip/_internal/commands/freeze.pyPKEePQ�_�#3��bpip/_internal/commands/hash.pyPKEePQ�+*����pip/_internal/commands/help.pyPK�mW���zX7p!��'pip/_internal/commands/install.pyPKEePQcӟ�w0,���'pip/_internal/commands/list.pyPKEePQ�_ٽ�| ��q3pip/_internal/commands/search.pyPKEePQo�GT��P;pip/_internal/commands/show.pyPKEePQ?.�v�#���Cpip/_internal/commands/uninstall.pyPKEePQZ�|���Hpip/_internal/commands/wheel.pyPKEePQ��g�'��CPpip/_internal/distributions/__init__.pyPKEePQI~�Z�#���Qpip/_internal/distributions/base.pyPKEePQm
mm�(���Tpip/_internal/distributions/installed.pyPKEePQ��C$�$��=Vpip/_internal/distributions/sdist.pyPKEePQ��F1$���[pip/_internal/distributions/wheel.pyPKEePQC?K� ���]pip/_internal/index/__init__.pyPKEePQޥ`��@W ��U^pip/_internal/index/collector.pyPKEePQB�P�"B�%��Cypip/_internal/index/package_finder.pyPKEePQ{�(�;? ��{�pip/_internal/models/__init__.pyPKEePQ�,�b��!���pip/_internal/models/candidate.pyPKEePQ�׿�-�"���pip/_internal/models/direct_url.pyPKEePQm��?�&��Z�pip/_internal/models/format_control.pyPKEePQR�
����P�pip/_internal/models/index.pyPKEePQ���U.��z�pip/_internal/models/link.pyPKEePQK��q
��	�pip/_internal/models/scheme.pyPKEePQ@J����$����pip/_internal/models/search_scope.pyPKEePQ
�0��'����pip/_internal/models/selection_prefs.pyPKEePQu��	�%���pip/_internal/models/target_python.pyPKEePQ%sٞ9�
��*�pip/_internal/models/wheel.pyPKEePQ�J22!����pip/_internal/network/__init__.pyPKEePQ��k��-���pip/_internal/network/auth.pyPKEePQH�@�s	���pip/_internal/network/cache.pyPKEePQ�
{Jj!����pip/_internal/network/download.pyPKEePQ��A�
�#��f�pip/_internal/network/lazy_wheel.pyPKEePQ���h; ����pip/_internal/network/session.pyPKEePQK���L��pip/_internal/network/utils.pyPKEePQ����Z��$pip/_internal/network/xmlrpc.pyPKEePQ$��X
pip/_internal/operations/__init__.pyPKEePQKw�kx!���
pip/_internal/operations/check.pyPKEePQ��
)`�("��Fpip/_internal/operations/freeze.pyPKEePQ�Y6���M#���pip/_internal/operations/prepare.pyPKEePQ*���2pip/_internal/operations/build/__init__.pyPKEePQl�KT/�*��83pip/_internal/operations/build/metadata.pyPKEePQ��v��1���5pip/_internal/operations/build/metadata_legacy.pyPKEePQ����e�'���8pip/_internal/operations/build/wheel.pyPKEePQ�R�C
.���;pip/_internal/operations/build/wheel_legacy.pyPKEePQ��{53,��5@pip/_internal/operations/install/__init__.pyPKEePQX��*:�3���@pip/_internal/operations/install/editable_legacy.pyPKEePQI�MU��*��?Cpip/_internal/operations/install/legacy.pyPKEePQ=�s$Nz)��Ipip/_internal/operations/install/wheel.pyPKEePQ�=���=���mpip/_internal/req/__init__.pyPKEePQ3��@!��rpip/_internal/req/constructors.pyPKEePQ�$�~L�K��1�pip/_internal/req/req_file.pyPK�mWڭ(;�"�� ����pip/_internal/req/req_install.pyPKEePQ�n?�����}�pip/_internal/req/req_set.pyPKEePQ{@��R ����pip/_internal/req/req_tracker.pyPKEePQ$@����\"����pip/_internal/req/req_uninstall.pyPKEePQ$����pip/_internal/resolution/__init__.pyPKEePQ�h�'� ��?�pip/_internal/resolution/base.pyPKEePQ+����pip/_internal/resolution/legacy/__init__.pyPK�mWFR�30�I+����pip/_internal/resolution/legacy/resolver.pyPKEePQ/��h�pip/_internal/resolution/resolvelib/__init__.pyPKEePQ�Yf�m
+����pip/_internal/resolution/resolvelib/base.pyPKEePQ��|�y%O1��mpip/_internal/resolution/resolvelib/candidates.pyPKEePQ"���A.��5pip/_internal/resolution/resolvelib/factory.pyPKEePQ�gr��
7��%pip/_internal/resolution/resolvelib/found_candidates.pyPKEePQ��Q��/��&*pip/_internal/resolution/resolvelib/provider.pyPKEePQ��V���3���/pip/_internal/resolution/resolvelib/requirements.pyPKEePQm.��q'/���4pip/_internal/resolution/resolvelib/resolver.pyPKEePQ���Apip/_internal/utils/__init__.pyPKEePQ�b��qE��Bpip/_internal/utils/appdirs.pyPKEePQ��(�%���Dpip/_internal/utils/compat.pyPKEePQ'J��l?)��Spip/_internal/utils/compatibility_tags.pyPKEePQ�0��'���Ypip/_internal/utils/datetime.pyPKEePQ�]$�6�"���Zpip/_internal/utils/deprecation.pyPKEePQd0a6�)��&`pip/_internal/utils/direct_url_helpers.pyPKEePQ���>F%��fpip/_internal/utils/distutils_args.pyPKEePQp,�H���hpip/_internal/utils/encoding.pyPK�mWy����"��kpip/_internal/utils/entrypoints.pyPKEePQ6z�y�	!���mpip/_internal/utils/filesystem.pyPKEePQ�y; ��
xpip/_internal/utils/filetypes.pyPKEePQ���r���Kypip/_internal/utils/glibc.pyPKEePQ<��p�F���~pip/_internal/utils/hashes.pyPKEePQ��z3�*-��ąpip/_internal/utils/inject_securetransport.pyPKEePQ`+sg%3����pip/_internal/utils/logging.pyPK�mW"V%��"�n��[�pip/_internal/utils/misc.pyPKEePQ�0-����u�pip/_internal/utils/models.pyPKEePQ���Q� ��:�pip/_internal/utils/packaging.pyPKEePQ�{���L
���pip/_internal/utils/parallel.pyPKEePQ�@��$����pip/_internal/utils/pkg_resources.pyPKEePQK"+�5�'����pip/_internal/utils/setuptools_build.pyPKEePQZ��w�&!��y�pip/_internal/utils/subprocess.pyPKEePQ]�zy
� ��/�pip/_internal/utils/temp_dir.pyPKEePQGʥ��y����pip/_internal/utils/typing.pyPKEePQ���͋
% ����pip/_internal/utils/unpacking.pyPKEePQƔ������pip/_internal/utils/urls.pyPKEePQ���%vz!����pip/_internal/utils/virtualenv.pyPKEePQ�%	���U�pip/_internal/utils/wheel.pyPKEePQ_�QMi���pip/_internal/vcs/__init__.pyPKEePQB�ĶF/��<pip/_internal/vcs/bazaar.pyPKEePQ,�r���6���pip/_internal/vcs/git.pyPKEePQD�M�K*���pip/_internal/vcs/mercurial.pyPKEePQ����
o0��t#pip/_internal/vcs/subversion.pyPKEePQ�&��)ne#���2pip/_internal/vcs/versioncontrol.pyPKEePQ�6R�����(Npip/_vendor/__init__.pyPKEePQ�_�b3e��OTpip/_vendor/appdirs.pyPKEePQ�|�B���hpip/_vendor/contextlib2.pyPKEePQt��'l����|pip/_vendor/distro.pyPKEePQ^-a�;8����pip/_vendor/ipaddress.pyPKEePQ#���+��@�pip/_vendor/pyparsing.pyPKEePQ!{�
�	�&��i�pip/_vendor/retrying.pyPKEePQr�(� o���m�pip/_vendor/six.pyPKEePQf8����Gpip/_vendor/vendor.txtPKEePQZ���.$���pip/_vendor/cachecontrol/__init__.pyPKEePQJ�y� ��}	pip/_vendor/cachecontrol/_cmd.pyPKEePQGi�#���pip/_vendor/cachecontrol/adapter.pyPKEePQ�b�M2%!���pip/_vendor/cachecontrol/cache.pyPKEePQ��d�"��pip/_vendor/cachecontrol/compat.pyPKEePQ��omE7&��Rpip/_vendor/cachecontrol/controller.pyPKEePQ����	'���$pip/_vendor/cachecontrol/filewrapper.pyPKEePQ�%m^��&���(pip/_vendor/cachecontrol/heuristics.pyPKEePQ�ȽZ	�%���.pip/_vendor/cachecontrol/serialize.pyPKEePQ�=����#��38pip/_vendor/cachecontrol/wrapper.pyPKEePQ��07V+��b9pip/_vendor/cachecontrol/caches/__init__.pyPKEePQ��/�	9-���9pip/_vendor/cachecontrol/caches/file_cache.pyPKEePQ��A�gX.��6@pip/_vendor/cachecontrol/caches/redis_cache.pyPKEePQ7��@>���Apip/_vendor/certifi/__init__.pyPKEePQ/ �����fBpip/_vendor/certifi/__main__.pyPK�mW�h��	��ACpip/_vendor/certifi/core.pyPKEePQ��S���gGpip/_vendor/chardet/__init__.pyPKEePQ9���9z���Jpip/_vendor/chardet/big5freq.pyPKEePQ��gf<�!����pip/_vendor/chardet/big5prober.pyPKEePQ�Y(==	�$'��/�pip/_vendor/chardet/chardistribution.pyPKEePQ�Y$�r�)����pip/_vendor/chardet/charsetgroupprober.pyPKEePQ�aZ��$��j�pip/_vendor/chardet/charsetprober.pyPKEePQ\�7H�)��k�pip/_vendor/chardet/codingstatemachine.pyPKEePQ|��eIn��V�pip/_vendor/chardet/compat.pyPKEePQ�B�1h?"��ڦpip/_vendor/chardet/cp949prober.pyPKEePQD��}����pip/_vendor/chardet/enums.pyPKEePQ�=5n ��|�pip/_vendor/chardet/escprober.pyPKEePQ�
`�)���pip/_vendor/chardet/escsm.pyPKEePQ 7��*�"��=�pip/_vendor/chardet/eucjpprober.pyPKEePQ�Aya�4 ����pip/_vendor/chardet/euckrfreq.pyPKEePQ&��8�"��F�pip/_vendor/chardet/euckrprober.pyPKEePQ��I�3:�{ ����pip/_vendor/chardet/euctwfreq.pyPKEePQ�A�8�"��/pip/_vendor/chardet/euctwprober.pyPKEePQE��c'�P!���pip/_vendor/chardet/gb2312freq.pyPKEePQ~���6�#��I@pip/_vendor/chardet/gb2312prober.pyPKEePQ
)Ӳ�6#���Cpip/_vendor/chardet/hebrewprober.pyPKEePQ�9a0�d���Vpip/_vendor/chardet/jisfreq.pyPKEePQy%jN�L���pip/_vendor/chardet/jpcntx.pyPKEePQ�h�� '2)��t�pip/_vendor/chardet/langbulgarianmodel.pyPKEePQ��V�F(��ۥpip/_vendor/chardet/langcyrillicmodel.pyPKEePQ���)j	�1%��#�pip/_vendor/chardet/langgreekmodel.pyPKEePQ�f��	Q,&��лpip/_vendor/chardet/langhebrewmodel.pyPKEePQ�U��
01)����pip/_vendor/chardet/langhungarianmodel.pyPKEePQ"�?�
,$����pip/_vendor/chardet/langthaimodel.pyPKEePQ�2�d�
^+'��!�pip/_vendor/chardet/langturkishmodel.pyPKEePQ����#��.�pip/_vendor/chardet/latin1prober.pyPKEePQ6uM�U
&���pip/_vendor/chardet/mbcharsetprober.pyPKEePQ���r�&��'�pip/_vendor/chardet/mbcsgroupprober.pyPKEePQi����c���pip/_vendor/chardet/mbcssm.pyPKEePQu��&���pip/_vendor/chardet/sbcharsetprober.pyPKEePQ��O���
&���pip/_vendor/chardet/sbcsgroupprober.pyPKEePQ֑g2 �!���pip/_vendor/chardet/sjisprober.pyPKEePQu�G=p
�0(��pip/_vendor/chardet/universaldetector.pyPKEePQ���=E�
!���#pip/_vendor/chardet/utf8prober.pyPKEePQGǐ׹���B(pip/_vendor/chardet/version.pyPKEePQ��2#��7)pip/_vendor/chardet/cli/__init__.pyPKEePQ�&����
%��{)pip/_vendor/chardet/cli/chardetect.pyPKEePQ�$г� ��^.pip/_vendor/colorama/__init__.pyPKEePQ>�_��	��O/pip/_vendor/colorama/ansi.pyPKEePQ#�lsi�(#��3pip/_vendor/colorama/ansitowin32.pyPKEePQoEr�{"���>pip/_vendor/colorama/initialise.pyPKEePQP���Apip/_vendor/colorama/win32.pyPKEePQ�(���&��Gpip/_vendor/colorama/winterm.pyPKEePQz�S7]E��7Mpip/_vendor/distlib/__init__.pyPKEePQ���+6+�����Npip/_vendor/distlib/compat.pyPKEePQ�@c��/s���Bzpip/_vendor/distlib/database.pyPKEePQ��.�3JR��w�pip/_vendor/distlib/index.pyPKEePQUQ*-s3�����pip/_vendor/distlib/locators.pyPKEePQx�5gl�9����pip/_vendor/distlib/manifest.pyPKEePQ���f#��=	pip/_vendor/distlib/markers.pyPKEePQA`ߥ$2���|
	pip/_vendor/distlib/metadata.pyPKEePQ�݄�* ��^/	pip/_vendor/distlib/resources.pyPKEePQ��8�C��D;	pip/_vendor/distlib/scripts.pyPKEePQ�����z��P	pip/_vendor/distlib/t32.exePKEePQy!s������	
pip/_vendor/distlib/t64.exePKEePQR�(g?������
pip/_vendor/distlib/util.pyPKEePQ�h(,N_[��Vpip/_vendor/distlib/version.pyPKEePQ�7�`���,pip/_vendor/distlib/w32.exePKEePQ���g����P�pip/_vendor/distlib/w64.exePKEePQ��h'�����pip/_vendor/distlib/wheel.pyPKEePQ#�g��)����pip/_vendor/distlib/_backport/__init__.pyPKEePQ��/e��%����pip/_vendor/distlib/_backport/misc.pyPKEePQ�9�Qkd'����pip/_vendor/distlib/_backport/shutil.pyPKEePQo��9
+��C�pip/_vendor/distlib/_backport/sysconfig.cfgPKEePQ�y룩�h*����pip/_vendor/distlib/_backport/sysconfig.pyPKEePQDBCbY�i(��s
pip/_vendor/distlib/_backport/tarfile.pyPKEePQ��o�D� ��`
pip/_vendor/html5lib/__init__.pyPKEePQʧ-�-XA!���b
pip/_vendor/html5lib/_ihatexml.pyPKEePQ�6=a~$��	w
pip/_vendor/html5lib/_inputstream.pyPKEePQ5�mO�,"��Y�
pip/_vendor/html5lib/_tokenizer.pyPKEePQ�ӉI�C���
pip/_vendor/html5lib/_utils.pyPKEePQ[2&@HF!���
pip/_vendor/html5lib/constants.pyPKEePQ�����D��#���pip/_vendor/html5lib/html5parser.pyPKEePQ�s���="���Hpip/_vendor/html5lib/serializer.pyPKEePQ��]TZm&���Ypip/_vendor/html5lib/_trie/__init__.pyPKEePQ灦�#��8Zpip/_vendor/html5lib/_trie/_base.pyPKEePQKOn�� ��\pip/_vendor/html5lib/_trie/py.pyPKEePQ(��z^pip/_vendor/html5lib/filters/__init__.pyPKEePQ����6���^pip/_vendor/html5lib/filters/alphabeticalattributes.pyPKEePQ"��ĕ$���`pip/_vendor/html5lib/filters/base.pyPKEePQ�?�3���apip/_vendor/html5lib/filters/inject_meta_charset.pyPKEePQ��d�l;$��epip/_vendor/html5lib/filters/lint.pyPKEePQu�*�\),���hpip/_vendor/html5lib/filters/optionaltags.pyPKEePQQ�aM	i)���opip/_vendor/html5lib/filters/sanitizer.pyPKEePQ`r���*��C�pip/_vendor/html5lib/filters/whitespace.pyPKEePQ�9qZg�-����pip/_vendor/html5lib/treeadapters/__init__.pyPKEePQR�)T�+��2�pip/_vendor/html5lib/treeadapters/genshi.pyPKEePQ�i��D�(��ώpip/_vendor/html5lib/treeadapters/sax.pyPKEePQe�kLS-��Y�pip/_vendor/html5lib/treebuilders/__init__.pyPKEePQ>>h���8)����pip/_vendor/html5lib/treebuilders/base.pyPKEePQP����"(��0�pip/_vendor/html5lib/treebuilders/dom.pyPKEePQM�ЇR
$2*��u�pip/_vendor/html5lib/treebuilders/etree.pyPKEePQ����9/���pip/_vendor/html5lib/treebuilders/etree_lxml.pyPKEePQ�vj��W,��u�pip/_vendor/html5lib/treewalkers/__init__.pyPKEePQ!-�B4(��]�pip/_vendor/html5lib/treewalkers/base.pyPKEePQe�o���'����pip/_vendor/html5lib/treewalkers/dom.pyPKEePQ���C��)����pip/_vendor/html5lib/treewalkers/etree.pyPKEePQ0Dty�.��(�pip/_vendor/html5lib/treewalkers/etree_lxml.pyPKEePQ_m�	*����pip/_vendor/html5lib/treewalkers/genshi.pyPKEePQG\�3:����pip/_vendor/idna/__init__.pyPKEePQ�H�����j�pip/_vendor/idna/codec.pyPKEePQ|��p������pip/_vendor/idna/compat.pyPKEePQ�4,,�.����pip/_vendor/idna/core.pyPKEePQ׬J4o#n����pip/_vendor/idna/idnadata.pyPKEePQ�c������pip/_vendor/idna/intranges.pyPKEePQ�k� ���pip/_vendor/idna/package_data.pyPKEePQ>3IV�d��pip/_vendor/idna/uts46data.pyPKEePQ�'WX�^��(�pip/_vendor/msgpack/__init__.pyPKEePQ_,+���E�pip/_vendor/msgpack/_version.pyPKEePQ;;�ӭ9!����pip/_vendor/msgpack/exceptions.pyPKEePQn�k������pip/_vendor/msgpack/ext.pyPKEePQO�S
�
�����pip/_vendor/msgpack/fallback.pyPKEePQZ�k���"����pip/_vendor/packaging/__about__.pyPKEePQeD2!����pip/_vendor/packaging/__init__.pyPKEePQJzBh ����pip/_vendor/packaging/_compat.pyPKEePQ�]�מ�$��r�pip/_vendor/packaging/_structures.pyPKEePQ �qg  ��R�pip/_vendor/packaging/_typing.pyPKEePQhD�~% ����pip/_vendor/packaging/markers.pyPKEePQ1�~2'%����pip/_vendor/packaging/requirements.pyPKEePQ��)��|#��(�pip/_vendor/packaging/specifiers.pyPKEePQ��'^���pip/_vendor/packaging/tags.pyPKEePQJ�f`����2pip/_vendor/packaging/utils.pyPKEePQPz��n< ���5pip/_vendor/packaging/version.pyPKEePQ�[UT��'Fpip/_vendor/pep517/__init__.pyPKEePQ�
� !���Fpip/_vendor/pep517/_in_process.pyPKEePQ s2��
���Ppip/_vendor/pep517/build.pyPKEePQv��Q�I��Vpip/_vendor/pep517/check.pyPKEePQ
�VЊ���[pip/_vendor/pep517/colorlog.pyPKEePQ�]-���bpip/_vendor/pep517/compat.pyPKEePQ;ϸF�i��dpip/_vendor/pep517/dirtools.pyPKEePQ�
Eh���fpip/_vendor/pep517/envbuild.pyPKEePQ������	��enpip/_vendor/pep517/meta.pyPKEePQ�sÄ*��nrpip/_vendor/pep517/wrappers.pyPKEePQ=�s�s��%���~pip/_vendor/pkg_resources/__init__.pyPKEePQa$�K2'����pip/_vendor/pkg_resources/py31compat.pyPKEePQBiKl� ��]�pip/_vendor/progress/__init__.pyPKEePQ�̵��&���pip/_vendor/progress/bar.pyPKEePQxแ�\���pip/_vendor/progress/counter.pyPKEePQ/�ݺ
d��pip/_vendor/progress/spinner.pyPKEePQ�?��q ��[pip/_vendor/requests/__init__.pyPKEePQ���#��{
pip/_vendor/requests/__version__.pyPKEePQ��9�H'���pip/_vendor/requests/_internal_utils.pyPKEePQ�9.D�,T ��pip/_vendor/requests/adapters.pyPKEePQ��ip`���%pip/_vendor/requests/api.pyPKEePQ���+s�'���,pip/_vendor/requests/auth.pyPKEePQ����.���;8pip/_vendor/requests/certs.pyPKEePQ�f�t�����9pip/_vendor/requests/compat.pyPKEePQ�':��G���<pip/_vendor/requests/cookies.pyPKEePQ�_�17e"���Ppip/_vendor/requests/exceptions.pyPKEePQ�=G�J�
��8Upip/_vendor/requests/help.pyPKEePQJs�y����Ypip/_vendor/requests/hooks.pyPKEePQ�u�s=&���p[pip/_vendor/requests/models.pyPKEePQ<ށk� ���pip/_vendor/requests/packages.pyPKEePQ����L �r ����pip/_vendor/requests/sessions.pyPKEePQ=��z�\$���pip/_vendor/requests/status_codes.pyPKEePQ���|�"���pip/_vendor/requests/structures.pyPKEePQ��[%�u����pip/_vendor/requests/utils.pyPKEePQa)|�"��=�pip/_vendor/resolvelib/__init__.pyPKEePQ0��W7�#��T�pip/_vendor/resolvelib/providers.pyPKEePQ9B���}#����pip/_vendor/resolvelib/reporters.pyPKEePQ�&�D��:#����pip/_vendor/resolvelib/resolvers.pyPKEePQU�P�!����pip/_vendor/resolvelib/structs.pyPKEePQ)����pip/_vendor/resolvelib/compat/__init__.pyPKEePQaT��S0����pip/_vendor/resolvelib/compat/collections_abc.pyPKEePQ!�����q�pip/_vendor/toml/__init__.pyPKEePQ���C������pip/_vendor/toml/common.pyPKEePQa#��� (�����pip/_vendor/toml/decoder.pyPKEePQ�v*g�
�&��Xpip/_vendor/toml/encoder.pyPKEePQ�W�Օz��4 pip/_vendor/toml/ordered.pyPKEePQ��j��!pip/_vendor/toml/tz.pyPKEePQ}o��2{
��."pip/_vendor/urllib3/__init__.pyPKEePQĸ;;�(*#���&pip/_vendor/urllib3/_collections.pyPKEePQt�!�'}8!���3pip/_vendor/urllib3/connection.pyPKEePQ��@a&��%��@Fpip/_vendor/urllib3/connectionpool.pyPKEePQ�b�,	!���lpip/_vendor/urllib3/exceptions.pyPKEePQ�7��	i!��Ovpip/_vendor/urllib3/fields.pyPKEePQ/�]&}�	����pip/_vendor/urllib3/filepost.pyPKEePQ�����E"��C�pip/_vendor/urllib3/poolmanager.pyPKEePQKC*�����pip/_vendor/urllib3/request.pyPKEePQ��~�=n���pip/_vendor/urllib3/response.pyPKEePQ'��žpip/_vendor/urllib3/contrib/__init__.pyPKEePQ*����1���pip/_vendor/urllib3/contrib/_appengine_environ.pyPKEePQ�V�;f+(���pip/_vendor/urllib3/contrib/appengine.pyPKEePQ��͡@'����pip/_vendor/urllib3/contrib/ntlmpool.pyPKEePQ��S�*�@(����pip/_vendor/urllib3/contrib/pyopenssl.pyPKEePQ�$���#�~.���pip/_vendor/urllib3/contrib/securetransport.pyPKEePQ]�V#F|$���pip/_vendor/urllib3/contrib/socks.pyPKEePQ8��tpip/_vendor/urllib3/contrib/_securetransport/__init__.pyPKEePQ]��A8���pip/_vendor/urllib3/contrib/_securetransport/bindings.pyPKEePQ�
]^�.9���$pip/_vendor/urllib3/contrib/_securetransport/low_level.pyPKEePQ�9��Pl(���4pip/_vendor/urllib3/packages/__init__.pyPKEePQ�U�#��.5pip/_vendor/urllib3/packages/six.pyPKEePQ2���Tpip/_vendor/urllib3/packages/backports/__init__.pyPKEePQò�I�2���Tpip/_vendor/urllib3/packages/backports/makefile.pyPKEePQ{I�\>�;��oWpip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyPKEePQ�|��@B��Ypip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyPKEePQ��?��$��!bpip/_vendor/urllib3/util/__init__.pyPKEePQS�:�+&��dpip/_vendor/urllib3/util/connection.pyPKEePQ�,{0��!���kpip/_vendor/urllib3/util/queue.pyPKEePQ�.�H�#���lpip/_vendor/urllib3/util/request.pyPKEePQ���/
$��Frpip/_vendor/urllib3/util/response.pyPKEePQ6c�K�<!���vpip/_vendor/urllib3/util/retry.pyPKEePQb�e��8 ��A�pip/_vendor/urllib3/util/ssl_.pyPKEePQ��G��&#��$�pip/_vendor/urllib3/util/timeout.pyPKEePQ�	�ԋ�6���pip/_vendor/urllib3/util/url.pyPKEePQsc�� ��ػpip/_vendor/urllib3/util/wait.pyPKEePQx�q2S)$����pip/_vendor/webencodings/__init__.pyPKEePQǭ�#"��K�pip/_vendor/webencodings/labels.pyPKEePQP1D$����pip/_vendor/webencodings/mklabels.pyPKEePQg8p���!���pip/_vendor/webencodings/tests.pyPKEePQ��֥�*���pip/_vendor/webencodings/x_user_defined.pyPK�mW�L�ԂB ����pip-20.2.4.dist-info/LICENSE.txtPK�mW��{i<}%����pip-20.2.4.dist-info/entry_points.txtPK�mW���"��:�pip-20.2.4.dist-info/top_level.txtPK�mW��_n����pip-20.2.4.dist-info/WHEELPK�mW���]����pip-20.2.4.dist-info/METADATAPK�mWS�N�B������pip-20.2.4.dist-info/RECORDPK||�v�/PK�(�\��MYS	S	0python-wheels/setuptools-58.3.0-py3-none-any.whlnuȯ��PKf�mWb�/q�distutils-precedence.pthM�=
� ����m*/ ٚ!HA�&J�Ѡ6�t��q�� W�+0ӣ�O�,�F�G|L�X3͚)ɭ1�N�*C���$_��ށ��#�L��31o.�9.y@���3�TۧQ����̈́t�c���B��PK��VS�@=�h_distutils_hack/__init__.py�Wmo�6��_A$$w.��͋�؀�@��-�t��
%�#"�(�TRa��i��I�a�В����YTJ[f3�~����v��e�~x��僙L&�DUS5�="����ɒ y\���2*TZ�������<�n�@>�JC0��W~:�?�T[[��?c�A�!�ܻ�
IU��Mю6Γ�C�P�@i��Òt�+�m]�.��N�[벽ղ"�ԉ?�6�<��F��Y����i��}n>7l�4[�SV��*SI�<o�����3��M%�a6�6����\��eϠ��R)/���.���y��x�bu�<������|�:��'��G���jp/��g����m��L����H�jo'G/���a'qp��f��,t�*���m�!���h"G"4T�H�Sqߑt�|�(d����sv�I�
ѰD:ij
�O�H-b�C&��҆ad@k\�e�ē�)�3�nL
h��6��
�ݙ�+�A�73���Y�	,��/�I��bȑ4��ڦE��]�B���(�3y�0�Q����B<s��X��E������m�$Ț���8O�#�|dG4�t1
6�o�T\��X!����&Y��A�fN~z簆�	�74�|��mi��O[�<���zFns6��� ��=I���{Z!<g2��7e�V�?�
�����Ϸ�>ݬ�����z}����f��ƦX�������`g�U"򠳛�!r���\����}?
�_m�{��{�`�GnDM�^�	
��ݡh��L|�3���aI�㶒긍{�������
������&���n찀/8DYB�	0�d6�niNU���k��n�\
ꟊ܅Ap`��+�A�	��0sO�����fu����ż���7����C�DJ����b�:wt��@A��'7*�Y)�2�-ߗ�g'�Z�!KIN���$v_���
�#�A��63����g�*a��Bci���J���1�G]�N��A���S-u�IiI
#$$���w�q��$|�ƹ�Lw��M�EX���Pg,E��g�t�n%����΄�2:��6�"N^?$����o�\@�#(�?��s��k��V[7�W�w:&y��n{:�;�1��7/�W�d��1�ӫU��A���3})0��vCҖ
��5�vP���L�%
=����xw���U0~=<?;=v�����_T�	O�p��<Jk�:"z��J�ge�/5}�9�d�\&���|yX��d��W6
���M�����c ���	�_�3������9\,ON^��W>��E��l�=�5�7����ֿmo�p$����6y�
LǗ1^�^��Q�i�WN�!O�c8����}��xy�Y~�;��;L��3Y�D��b5?�A�\���l{_C�Ceau�e���}0��	���~y
W�N�Q\9�PK��VS� ��.,_distutils_hack/override.py����-�/*���P�O�,.)-��)��HL�V��Kɏ�/K-*�LI���PK��VS�#�8ps��pkg_resources/__init__.pyԽ�vG�(��OQM���$�}�G�G-��uǖt%���(��`�D�=~�=�H�
���YY e��3��c��ȯ�����Ã��캸,�u�6��̞�~qp��<���6+�esY͊e���e6k�MQ��<��6WU
�Wz�5k���^̫u9�4�]��*�e�ȳ��U�/c��+h���l6MvU�/B��77W�5�kK����@����t:����Av{ޗk|�á7�g��X�74϶m�5mN-�U	
��n3����v	�ܰhX�EY՗0���T5�Ů`��A�a5�e[]�����_7�Y�v�n�}����%?gE=϶5>�L��&���V���,���V��QG�߫�C���ٶ�47������>��*���k���ժYohr��e��̋M1M�7�檙���\�
5��럍��j�MuS��k��f�*]c�|���b]�ʻ��p����Y������Z�!��6k�6v+��g�r	(���T�fY]�򦨖�)�t`���S,o�	l���u�r��)���E�ׯ���uߴ����Z�a�d��s�����6�ݓ�>��f�j����N��f�m���;��:�<��:�.�e��Y�OV���#��,TK���pPLQ��${����6�5�r8�p6.vx����;�nZʖ�ɍ!zzs
�gH��ugfY����7/ޝN�~����7�`���rϪ�p�ְiz��j�\��s����i��(��k\�����i�.rKco�6�]t��3��%Pע�?O��2�b6+a%��f]]l7����H�e%i�rY쐖���+ ~�M�����d��;��._�%X��M��;Q
��pT�u�#(V+X���L*E&����p�z#wMs�Z8��Ǽ�'�ZT��ǽ�.��UxS֛�|�X_sw�ɫ|RՋ&��l��8�b�˽.*8<o�5
چ�;�_��7�}��h~8��7/g�N_�ܔ���{)�Z.ᮃ������Z��b�W,܀0��@��.�MӘ��F*��ID�=ݲ��% �>vk1i7벸��g˲��+�V�@��o!�Vx]��Й�ߠ×��׽��4|{��MV
̼;�U
�xf:J"��3̥�ӊㄕ�Y(RN�Η�G�?��+�n����|�W䫠^�����^�"�xA8tm�-�q(2AFD-w6���d��5#��!]箏�����҉��18�Gx]��Pg�Û�ޢ�B���^��e5���uyY�v���9
hA���2���~<������V�"j8ʷ�96�'��G�j�ɑ�]���3�8i�����Pz��<*��t���t
��+��&ߴ
�A:�>Gg�I�� �4{>����,�u�j���_��ޱP��(��V�6���]
@�
��6d�ԑ���Y�nA�'j�B��8�3h.r$>k>|���FA����ʾNÍ:���O,.!$�X��%f8�eY�\̋�A��l�������c�D�ߡ?�ox� ׵�;� }�n�7�/1PO����
Q�c���x�"�Ǵ.�떮���&��纀�f�����l�s�|�B��k2�'떤4`���<��ECɲ?l7$
f�@��z��lvU��V
�\$o��nnq|ˑ�p\e����F����$�%��mQ�kN~�W�:C7�6�|KY]�Ō�c7 ��<�i�]W����r�z+[�b��r���P���ҹ+�]� 5w�Sr8�զ%H�	�~ ~`���i{�D�1�=^�Yϡ�r���BJ�q�����9��0�������g3�b[n<�
n^1��$�"W��zr�΋�mUzz�&f8����'-�7�>Ɇ�|��
���ѽ4�=��|4�n��u�]
?�4�s�+�[+��爆J��bK p@x�'�F�	�L��?m5�Ze�aږGxH�HF�>�5�U�
��綞��u���7:���}܅~�@c�
��h[��X�? c��v8%}qV4��i~R���0ZAc楂�����eQO�պ��/���Z7K��׹��ac�k��C~-XHK��ğ;|�B��(�v���@z*��_�+�v(�,I��qd��V3E��{��[���웢��<�|l���z����1��$�?iLB^:����gM��G�lG/��Au��H��S\*�խ�@Ԯ�WM��f��k@R�D�����xM��%cN4��������ł��}q�ι���ݚ�g���J � :�� (���euP�bls�x1_;a))�-2
��.�Q-Fӆ�t�&�u��o����B����r^ֳ�p&�F��O�<��Ë�O��}}���7�N��g>}�ﯾ}�~x~���ׯ^�w��P�Ìd�M���# �uy�㤟.��z�B����7�@-�kC�^葰?��J�~����D//��7����(�Cf���ri[��9�{��T���&X���O1x�*�	��h}*ԕ���Z���]_���K�Z�΁�g��tq[����K��຺)*:uO�ղ�3�<$��N��h���&��>�h��dE[G4/WȺԳ]��>�t�uKB*��p�kd���bԑ!�W`�i$��S������K9��#7܈.��G�S��ý8�WxҖK`��i�	���9������7��cڀ��Tt��5;8�x����F��?&�_�Pz�M/ğ�w�]�ܟ���787�r-:h���op�������|��i�X�w�u�9�b3|��M�5�<\�	�@�	��Mur�3�u���ba1�[A�
+ `QPU��<�~��2B�<�-��ȳ��C�����[��~h�G���i� <%�
���y��/�ϫ
5A�҃��ژ���,P	s�y~ߋ���e�Q���?�4��O���σ=����D��<�L�^��穡#��i��������͠�{ d��1N"�14��>k��|8�5�}/��^�M1�����p䠅SJ��b[�B�ݪ�x,xC��B��I�������!�<}?�7μ)�z�a��&�٢,�Nx�j���}Y��k��5�٪Tm��N�y�?_�A�����~�i�f�с����ÿ���,�������cѿ�������v�;���w�i�fʞ
ץ{��=Sy��D/XC��|�+X��L�7�|�,���7'�)s�x:C!��"B�9V/�"{��d��
���>��\���X:���33ITdǃ4�P}4dЯ��t��0�ΰdP�2���"�+C��j�I�4�T�,�C�,~0H��i�}6B��������e��=3������Y�^�"m�1Zھ><o
k�"-��|yb���@�O2�Ĭ�ab��z$�����X�rrv.k-��3U���i@�Ԏ �ne�B5�(�6|S�^�v��w
�� VA�qFb��-����.��z��Y�.ߖ�HR�L����`�q�Y�5�F��3iyU�����B2a1M`��q2�ZohM��ܽ)=&߆N�IC��IP�M��y�,)�/�)mf�%�uC�}H����Q�UԘx�,�zv5��Ў���us[�_?<����]�e��^`�>�� 
e�)8C|bE�]V�Z!���bu��U���%{�ւ厡	�o�
��t��p��t(�Ul���r޲�� =_2_W��]���3�n=@����^J��q�Y"��8=���)�_|�u���r�P���;�Z��?h#{m�m����9�7�H�av8�'��[�*�j[��̏?iѼ�=��F��p4~x?t�H�h��#�����hIAN�
Zh�A0:��Xq(�r	A���\����U&�����4t!	LA�v ؁u����Z�õ.���r��x�?�N��M��# Gtv"�ԁEϤ-K�vJ�;�k�ޟ�™���P�j>�F8؜�8*x� ����F�y��z[��Uh�����G[:sc$�&@.��' /�Ї:2��ǟ͊ۺ���^�-ې�XtN8��y&�͵;9q�=�ee������%��5#�k�:���P�D��cltۣ��W�p|w��)�̸��{�o�~���4(�リ�[q2����X��.J����/�]��i�(�y��r�^� /�|Ȟ�>���������\x�]��LFN����,�}YІ���	sOőn��b�}<�r%�i���O�\�3o�{u�?|��Û��|=<~�~���C/�c����oӬ��p��C�"9�w	]ɵIv"uq��R�_�γ7��� å�e���ݪf�9ɢ�N/M����?%u%����H
,���xpq�*�2�@1+@��+�=Ɛ��(A���Ɣԛ
C2�n�M�^yݎX��L�C��&c��/d�����
�cB��Խ4e�ږ�B���0pJ��V�?ttZ�^67_L��۰�cݞ
�D28��7���Z���
e����� �}_��ۮ&&�ã�E����, k8��Ɗ��*I�/�@ ��6�4gIњ[�*���V.�@���[���欦�<���w�S
�)���8�g߳�0� ����P谍��e3�����YdSz�I��S�=h��g]7DF���3*;�9�;���]A��/�Xy܎S[l����~�
�B��D��=V��@,��H?�+���ä�DkʚɎ�SJ_��F���e�ϛ�/au@��ĴY���}`�Q���]�u㸅��?�I����W���tI͂䶋eQ_�_@��Xw}]s��Ц�`I^�WՆ-�x_�8W+���v���M�I���t�� $��0?��U�w�ѐ�hn�
��<X7r�J�E��XO��,.�k�QSm�M��t_�9���kYL�G�	~��Fӣ�t�{-��E��rF!:n���v�λ˪���3t\.�;���Y�����1V>w]��]��V�
A����w\��7�\6v/M�K��PX��G�+�,��S�FM��e/�Ȁ �mL��CeGÏ(j=�
�{L`���h1d�F+*C�o�'b��Q���1b�8�3˜"'H����Хs_�������t_�J=�0揣r��Ӧ1� U2աjȻ��&"�)��!1�muS-�5���&�{��l-�"=?��$F)��A��M^φ��;�q���	���Ivv�}��`�iq/�I�Ll1�Jpڕ(�B!͏C����#�l�4�f'��p�C���#�&r��_n��h�Ζm����5F��E���ʧwnq���bw�޴ey&�N��d�;1��9�H~���¸q�l�$>N`��u�I�Ʒ�����J��y���?��V]�v.]Ex����as�%\��8���:�};߅	���e�4:�߅s�9}�])R� rQ�r�:�.G!��x�f�Q�}�������.v[4��rJ˂��έ�׏�s��z� T�1mn�,���#��qm�ys"�U,E��s*���n�焪7UK��J�vN?��4�HΎiĊ<I:���C6�•�Վ�Ȉu�?�=9絒��pQ�w�~�W�i:F�a�ө�F���Y��uo�[W`�i7��:&\zH��-�wa�Ș��f�a�p�bfr��n�^�;"0I�3�z�}8@��˅m��m8���P�ž�rVлsu���j��Y�*��T�&5+B��4��Ĭ!2Wx�kS�J7�`4�������yN��'x'%�@t��@Y��&��kon�������O_���������dM[dz����D�#��D�E�&\a��ە�m�u�E_���u���ұ�����
��G��"�,�˖��qϰ��磯���|�l�`M�E�F�A����ݔ�e�J?�T0��EXҩ�Qr��W��c���W�F'΁S��`��sjG2|�np��ɛ��5���]3U\y����}XL�j�)�Ų�|2�F�Qnx)��:��Q
T��l�1c�h>Ck�(Xe;z��F��XhYI�[S�����l	$�Za��C!�]Z�$79�-1<��;Bf
�4fS�-.F��i�u�r`.�aI'���c�[���1���רBIレt��A�
yqC)oz}�
�9)MnN�I췂J|�l�Q��.'2w�����*�Ц,G2�HT!��7 �3��>$j�kDb(�!��3&�ǺL����ۨ��4��G�;'!��ڠvt�ewnGS�
[���yz�ɗ�3	�l
�P�-�'qF�?�)U�eY��6ߙ�
ަ�[b���е����G4�bM�EF�y�l��9�����U���p �I�H|���L���A�sr�N��158nìss”X�r�9A����0��aɅ���q�́���*��yސ�:>8���N��?�	`���O����+��>T"���lۆ,���J4l/,��ڐ�2�}[��BĀ�r#]8�|j36$	��B\n�'�8��8� $l���o�%jǧ�e��Ӏ	�iHc����Jl�0��$3%j3�?��fb�Q�Qo�cS��t}�I#!"�֎��Yȿ��mׯ>Cu��X�Z���l�����·]����W�%
|F;ΐ�5rXW��MJku`0�x��\#�rCj��&(��0��Y�g�@8Ƈ�qR��Vr����_�9}b���e��QN�T~Ȇ��<� ���] �b�{O�(Pn-�)-Əœ�ٿ<�Tٺ�F��x��3
Ji�I��cx٢�2��1
K�HȘ��Z�G�7�
���:�ĩ�l@*�0+�O�v��j76)SȘb4Y(Ɉ�f��� ��9��θ�8i����\'Va;c�f9��۳�8�C� U���Z	ي��H�YQ�4.H��
D���F5�}�3�Us!�ө�"��_uKo�6$�^����8h��r��~葆�$�gO]b�h	4�-k�21�0���=X�T�QpѪ�B{�8㷅�j�\�>?P�@���i���(}��2$����@��[�ϡD{���yz@	<K���ֆJ}������I�i���M��0�C�ֳ�j���No�d��>��e֘�Iy��0�``*�o"���v].�qih狥N�@ٱ�*ų�C�g�ŋ�w��m��!�l�[�
*�Ӎ��9�
�i�'�C����ɓ������2ѴO�ф��?�#b���
﷋���ݦ��8ed�C-���I6
J!�(��N��+	Q�)I��)^�]m�4���%q}��p)sfq�&�8!�הB�OlJ�\/e����1�-C�yYQ�n���|��cr�����𼬚��QG�džl��
K�U/����f0U����B̵ù�����Nj��	�s ��5�(K��"RZq&���˅�DINJ��P2�㈦͉N�tpS�: �����0R�IB����mw��r�)�����ke?�$0�Y!�G�G������w��Ǚ�C�d�}S����b�&��D���w���ce�ԇvгѽ�
ҟ	����ۄ�"z��sv�޺*��v��o�{�:�`.�'gHY�X�H����N欠�M���Us	Y�(MT���9�^5�����fm�-�
&�P���#t�1\���w�� �L~�W�}�핋�	��F+��~��$b0H�T
)�E���av�//N9�Av�$+���L�_�3�v���d��I�����)rv �>�"�su76��7��H;�\�:�(e̛KS��Mr�Zn/�N�ԄEv~4�3&��I�Ԯ��'���Y7A��/�1�L}gF�>�P�b�S�>y�e
����BG�(7Bz���n�^����[��.��6�}������p�1hx�w'���C
�HX!W���t��`��~��ł�ԝ&����p;h�C�ջ2Z�[E�bU�G�;`N�J�5�`�c��F����(�V�s�K��u��.\�[+!jmT��V1���z�����"j�$�٭�MYp&�+Y��a>�U���8A7�He�ZY<���/0W��8�3J�$�_�\�+�\�x^�'�N�Ų@�iNF�S)B0�W�l0�1u6k�s��Xr���%Bn7A6h��9P�ܞ����"�}v��=y�
���M�8�LjBL�#�-k�Zwu��<1US`�(z]�FL
7�eN�0��:��D햒� Y��t�~b<p�jeٻm�c��Q�Ϯ�/O<�%�'č�+]��
�RM�*8�-!�O@*�Pu��\��Kxy�n4�#�-p�Tх���$��N�39��b��*.�
�Ȁ�}��Vr[��r�$\TNB���H��U�/�a�OO�M�����S��'�Wż���ab�@�Aƒ���v�k�������?㛒��f9��1\�.&؂']ï�Q��Y ��+�a>��6����ۼ�t���dr?9�J��O����A9ʍ��}�W��Ԁ�^�)ȁu�I�D>�}�!"�P�~a�=��Z؄D]�����;�Or�{�	G��
���&�Q��\e��>�m׉E��[�f'��'���E=,����R�����& ��yB?e��ٛԮF^4��.�\{��p:1�3e1�N8gh$S�0���b
�;���9��g~#�D��pմmueMN�#g�39.��Nc�"�[=�{��ĥǫ��̩{b&��7`ˎ�.9Lo��7���/�0��e�����,��N4[n�GAݞɇ�����=Vr�������{Sô�G��"P����w�R8(��޹��Pyb�V5F1ddC˦3�#��V����›�X(��iFwf�ގҚ�ѕV~���p���28��T4��҃���:�:��0c�Ű�¶�C�r�!龍P�;��>l��t�Ү.D���'���	W���ȍ@��a
�px������Ć�8��q��̆��K�Yd'��O����3�[�@�`�=��2;i�`4&�y7G�7�*�0��d�ʛ�5�8�8Et[��C��+�5OR,AA���Ǭ�D�Æ�6��U����daQ��]�m����bQTƛUJ6����M��41�qM�m\�atR�\�!�?
���~�琁!c���9���F��[vm\�4P��\,�2��+
͈}V#�8�x[bz;�PۺX�WM���P�3�$?�tXkB���Pe�lj����Y�!_QM��(b�[p�_N<n�@O;�TΙdj=��M޻�-�G���n����|�Y��֛��Y�d�Q�dS�q.�vE\	x��,z
����t�;S�5,��]�����{ř�&�<��4�L�q�eKF ���2��a���c0����ž��e���fK�/����f͇@]��~ġm��$i�l8 3W�9z�=� f���
�`��T@�9�%�A���<�	o��Qt��M��zp��D�d�=Cs�O&�Sv'y@�? ~�\>��?4�$Ϝ�߇��0�W�����BXKe��1~�0,)�vM��E�M�w8�C��b�V�	op�.��,���p��D!ݷ�ɉ�����b%�k2h�:�'H��8o��Ǻ��`��y��o.�D<� c��.TO�����Gc"a�E�����f��t�OhZ���@_+����0<4�B1V?��6\�G�	Uf�iu�mЗ(‡ĸ�Q����~�+(%�:�q2D`�N�a+��9F�]�	��A��Ԃ3��o�Q3��.��ʰ5��uբM��-md�Z
Or�I1�m�r��(R�n���.17�I�PU	d��8Z��Vf�>'`�
N����8�mо�����ݢ�Qo$���Y��VE�Fc2��2	f�z�1��G+-G���]���fr�fi_��hR"W+���㛐�::�Z*ŦY瘳3�`
W��Հҳ�\8�Ƭ{���
������~�pynx�:Ԕ�(������
bEn��L����㬱.���.�$k��V]��ƀásM_�%�yʟ����9��
=�Ws��'�V:?��S�Gtm��6�"���#��Ɩ�r0��9qmGv��W���bsCLR\�f9�C����S{����4鍗VT�0�9��g��ۓ<��A����MK�;�G�@�$�	���YJ�`�g���d���7=VQ:O��h�U�0Z�aM6onɠ�P�#yq���-y�	���SH�^q\G_Z	k����*܈��<��ș@@e��P($"8]T]1�A"u�8e�R���?n��8@�(4�2<V�&�7Ar��Z�@N-(�<�!��F��V���za���Yqpa�%��r���^�D�d_ŧ��R#n�|���X�nd����u���8�m]��I��q�����KA6�Q����L�pp5<f�I��󥍈-7�:�2�xc(�BR��)���qL:�ē�e�9�����Қ'�]K֨�:;$V/^�wu�ߝ|��
�p�]�d��j�s��FIn�n��E���V���+)�_�*�pU1�]Q��6t:�T�UǩU�>%�����㉊!�d<]�6������Ͷ�T7e\�Qj�:��Lk���䓼��Z4H����Pr�?ˤ�PT���L|h$/h��r�.�eQ^�
���������#�#�}�tѬ�˪.�Z�L�wM�P��C":�_�5�%l���u��A�"OJi(nFߕ��t�g�4GB�8X�9%Ե�cABR��%
�}Ҭ'q�<�Q�T���DR� o|��Q�'lo&�_<��<��������tB�X�K��(1�u���\�Η��+�K������p��O�5����$οv�3��#f�#�U���ƿx���!NY�8�>��p��qC��6Jp����-_�Lc���{��7������OՌ�f9z?4�ŵFg&��߫.�JtA�T���z\�:�mnVKx��n���K+څ�3�\�K��%�"tny��w�i��%�g6$�X]oߟd�~�#~�p��s%92��/r�u��*V-�Y�h+l��y�Y�)��5���9�T
��E�/%{D4��F�E����ϯ^N�|��|����b]i����5�b�N:	�y"��%U�0Jr�P�g#�q)QL:x-W�1�{�G6'XFl��X���ݓ�i�i�W߃�V8��@��p���.�M�;8��5d:��LJ�6�bv���F%H�t���$�J����?�D@lz0�����2�z�ے��(�e�ɐ�Y��zb	ʼn=7|��W+��0�w�a 3��'�4c[#0�3\�7<��� VX�3;��@�y<���ֲ�M=�C�E��[f*��/��r�]R�����|!�[v��#uH^KbV�r���eY�5DK����Q�|��v�a�o���\
bS��.eZ2���[��I�>��@���|Or�����&�~������QC�z��Š'�ײ��XY�z=��m�('�r��_��ٙ^�"Ps�sI�Ο�,��o04�������ՠݼ��sZ3�E͸@�1���G�#m��Ch�6����U����u��ܶ�ғxsl0�E���_���0��R"�([X�u�wL�[�P��g�Rm
�u/٣
*���[?nC�;�hoK�9�̎>��/h�@1/7���ح)S�f�k
#ʛZ�
&\�k�lp����y��;�t��ó�5��5e�/|9�KJ�cec����/oV6Ж#at�\Э~�ᅸ�������Q�S��X�3�Jv?�`yZ:􈺌�9�Y�w�n����M�v��W�њ�?����p�n�ˎ�m�i��,)
�C�+���)0c��5��L���D�x��Jʿ��'�Fy��g��xM��/b� i���[�$���=>�Z�-!f����(�%�����B��Cؕ1:|��矍�w�Fr��Xɼ�.VH��9��]«���OS[ʫ�#w����<%j	����M]~��_�Pq��z��rΩŒ/g4o�? �f���y�W/����ҕh.�4������k���]p�Ў�_�z�= �]c�Ҹae���5D�I�-�fV��!>i��z7
<#�l�� =�c}:$����م�W��������	��2`L�a��o�k� �T�XS-0��G(�p�4MW�ѵQ��٣�/��z�3|���
=��k��{��.$���J�{�̙�'$w��V�_����fu2;��<}w�V�fW�H�I�Ãmĵ�{:j�hb?� ��<���&�ߣa���r$N�1)�N��l�t�6[���CK4�}�`c��͚���w,������{�D�Y�ۛ��c��4�+�R3ƞ1����a*�i�>Z<u�&����|�z!r�I%ٽq��a�t*b���Zr63�ڼ\�R}0��Z�/��2ar�.�ź9�#d�:s��6f_Y	�z4�<|�l�'<�B�J$�w9�3/����S/���b���[�F�|
�[.j9��=3�)���ܐ2�~�lj�'	��tn2�h�c�'��yD@$�t
T^J!?���~�"������3.�;눲�\���Ѡ'�����\D�[;'OS^͚��S̭+h6���.�5/`���T݀ t)�0�8��L���'�u�<�n��+!�����f��r�ي�g�-KM�u]���a.ɗ-�66�����x���61M��d�px�zq$�� ��m�� G�}�#��Iv�$�Yݖ���0��T)���B/rNx�F\�4�N^�����d��u�ǧ���a�h�eEr�Cxҁ]�V�k��(DY�v	����L���u&���*���}�&���6toHc�f
/��A00�`��X‚R��p���0��~�������ǃ�:�������?=����%?�t0����4?uc�#T��TՏ�@�f,��{Y��o�n��6jcB�Zc����%
�n�5pU�\��cpq3.�J�x8�p��A�g���x��ҙd��/A	2�'��g&V(k�4q�%oc�s�{#�1��d ��#�ϫ�i�ջ� 9W���A!�dӐ�[�?.�Y�b�w�W� ^o|
����E,8,8�	�*ƣ	G�Ѥ����9F@�36!�>}�}��w�d_j�6;��\_.��g����&#�g����.��V+s�����+��M������Ar�Z��jX�[��߷d�����i��,jj��(iE�nL��!�.I���?�w W�/N��,���m��g��a"��"�v�o���C�$^>�&�6��q�y�SPB�(�`���ć �siz��<��F�cm���GJ�
�����n��>��m04��(//'1��o������˺�>_�]��Qo���XO��	V�Hor��:,�8<?l0�B�h��ҝ�ǃX����1#����6��o�U��a�)����������{�|��û�2��׹��M_��/�:у`5T��Y�~ǟ�Y(�4<		�$�ك&㟱c&����T
n��õ!�3D֣������1�Z�[>/g���fq��A�F�m]�����ߦf�����.TE~
��P�4�Z�7�fR��
�n�3�Ҥ�p�M�Ew�[���	�OS���ӓl����g����~�-�U��r�
Q\Qr�'�"�{1��L�<@��%�Y�up�{t�dl�{�rwۀ�:���~}���}�O4�{D�IMzәx��)�ש�ևD��
˨���	�_��A��}-IkBBJ�#�23GQ�Ȅ��-����g��e�u�P�m�r@Ӯ�1aGs䌢�OH�8ɺGIf奘�?�Ȗ��{��o������з�2
����3�*�����4��'?lmIu�R�i��yQ%*�����"}�Ge_gl�Bc"�MR�q<�1���l0�Hn9"�����҉"F餔�2N�9�Fs���/���l1���=o���i�;�AC��By��ZXߢy.Kٳ�叏��f�B��r�8¢�_�
�D��Wֶ6E%E���՟];�0��Èb_�cZhD.Z�/:�)�E���b�"�Gߩ!��m���o�Ax8�^W�~��Yπ�x�yu�5��-�;��$�ff��W�ͪ}��a�[m�f��\���vU���b�y������js�<��T�c��ݔ�4��W_��
%����X���7�W�����%v�-��Ĩ�5&��ꅾ��_M��X��*j��<b� L���ÏD�D�kө������`�ʱb/���C�|�U��X�i�UAiFX"Q]^m���b�R�5�0փ~H/ڻ5�~�^:�i(�}��'��-� L��l��	��j�A�l�Y�쇃J���`�}���ò��Y���Tnҝ���˦>���F�X�P��詆��:�g�w�(�c^H�?`(Z �Z�O��/W#[@?�) �h<�F�&na�A7��d��1&3��؍����!†�����Kt�����<��n�wf�]xS+s�/�+(QII�m����֗��k���G=��y�qڝa]-�E��)�9�E�'\�Bz��x
�~~Jc���,�A���-F��e	�|�۱��,�>�ÚU��#��`�L�z���I���4��'�|��rc��w�ܡ*ۑ7rh�8`��6� ���hs�
�������8�KHN�5�c��ߜ�S���A�{��o�^���Pւj��K��0��������}��l���4M���1z�|U�q�f9toh14x�_!�,t��z]z�]`���Sۣ�6���w]n�
l�
�da�����^ef�.�Y�H��xzOo��N�&`T>��(�J1*w��oTl��^�G�����2Z"�9y��BD4%�+��d
g�R��xZ��?����?�$^[7�CTE������Рd[D)Q�Ƽ����_/Q�D悽�s�[���um��V�:S���\_�ux��`��
-f�"�G��b���!�W�6gK[5D(5��d��4�?��MOP)ȿ�;��݁и<D.�<�Q�u5���kY]Ln
̺U�.k���S�%Rw�>�f�=:
�_C����}ɶT��Dy�
QЃ��px������-���w_Q�eqs1/2�O,߽_��<VߗC�`����K�A������j�MQW\�T���W+<`� ��VK-�V,���rH��G��l�mk��jY�U�݋j�9R��I���w��g�!*��`t��)�@j��u��Bͩ��@D�(X���&�sL����5f��ڭ�=VY��D-%�8���aU���?G��0�pR�����K=� JO��;�DL;
�yL-9a���,�9��6�X�}"i�:�"[�)o���~�kmH{]^��m�?c�ȗ�R<t��j8�͐���q�ɪ�e���
zq#I�"F��,�S.5�o%��D<���1���՜^p�a'�A�đ��)�c��u��3$`��(�Q�5�6t-�����=�/c�[��G�Z2���rAnR����y^�=�Gr��V&�p�P�$�tt��^��2����� ����tN�ĸ9-�S��Cq �pD(�0V`61�y�����g��^ّ�v����$��t"D����ܶ��G���B�,�j���$93��;���g��i!��9[*����5,�x˛6_~�:�.%�m�������o�X~�)S��15���h�dC)g�MO(Ū�Ъ-���xц��۬U?u���r;�IQ�~��a%��O�Ec�?v/\��f�pc+�b�FaO�.�Tʒ�k%B��'c����O;E��ƈc�\�!:���]A�#�<z����fv�Ҍ�m�mɩ�1[�3���p��4��}FKG�O�dC��
��n��ϝ<$���U���s�0DM��<&ݾ�s�L*��s 7ܽ�TQ(��#'-\x4Mlk5,<r���`��fkw7���yr�?7qpԇ�*����l���%�[|y�/�{�t�A��3ͭo<��n�ԉ�7���A�,�{cL���9���/ߜ>����.�bƛ��e�!>�l�ײ�ё����œ�ٿ<zpi�]b<�q�a�jA�3�H�+:��IJn�L�P����#��A|n
��bgp�Xt7��w��zmQAa�@���j~��Ż���o_�~��]�j�xŔrpؠ��-�}[/����e5�4r�\[�\a`b�ґ�g��)�Jeo�(+X���]�&�i��Յ�H��Ѝ#ɑD���p���oPT��\��s�����9슱�'1��{����6��CHҰ�~�*��W�G["@<�q64H���>��$���I�vɪތ�w�+��$�n��	�Z�e�A�u�r�ϑ���(gH�4�3�T
�*g�X-�y_��
#�i1�|�]�?Ӱ\�y��4}>��wɷ(�z����L:�2�r���Is�>�@ZN�^Aa�NjuU�s`�d�Q�ޗ�,M �V�0I�����dU'o|	R�g�^6�2})����׌B�[&:[nhi�(t�B�ɨ{���b��

5:�/j{�w��qS�G�G|�X���r����AU�[�c��Ya������e�PN��P�X�$:�ϒD�ؚ�2����^m8�I�,�����S7���d��[�p�ǓS��y7DbD"邐���D�$�yd-1�����1�;�ފ�O�r$�<,���p�r��Ù7O�SR�QЏz1�S�����j�ړL�,�6�ޫ(���b��g��\k�1�^����p�Ɖ�|Oo����%��輋 n�)���a��#�7^w��>�nJ���Nmx�zߴ�c
�(V�tF�rh
�M��D�/S]RIk�O�&������8�,A�׾��X���yLU��ɩ�s�
�F��vR4�}�d30�z�>Ϯ�RǤo�6�y��zL���C�A���[�-|b�4�s�y��p�<T0�#��L�뒬�d���&�n��8B��1�=FU�$^��I�)1��x�9�P/�I*�Qjc��X���rБ�1y� �7�pw��I8A|���F�x1��G��Qy�)����;�O��;*�p�2U�
�L<R�����JY���;�0�13��ɡX�SL��������.PPS<Է�i�����S(v�\�	�A�������KN����''�r��s�e�5��K��J��?�.T^�_pO:��e'i��"x�����9
y�$�#2�z���i�z��Q�l�e�@;�yh�yc���贀�'l����&��m�(EK��*�q�}�@�΀��b�;н?:{t���m�+ꓺ�ewO\o�O�)1��m��~�<^�h5�P&W�=�ܫ����(%��+�5���qv�~����&f-X���0;]�W ��Λ>��wv3�\�'a�o��`�j�gtˢH4����M�İ��_�t���.Պ��$�`�*&V7��x�ܾp��^t��� �K?�:T�Q�YPo|�u]A�<��guew�!?r� q�%޶N#�?p�h6eLj�^29�j)u���-��$�EFPJ2��z_(Zd�"�t$������ÉI��͘���G�J�k2��17����O%�����K�,R��J���4�J�s0r��C��3W#4��g�B�(�h%��(H�=b�Л1٪�l��Th���|���:S�[5r���W��
Z3h`@V�6���!(�@�X����gdg��1)�z߈W���:���_�(���K-α�qf�mC�;Ko4n����1�o��V�u�iE�n$�c�N��Myo�;�Ӝ��s�S�%+���Z`auh��	�7b�諹(�m�E�w��6��q<˞��lH�u���*�\<k�-{�U���"Iu{AG����
a�A(�ؐ��@��Ċ�L"ZBf����h9v$�Ԥ�>�^Fc�/�f���k玶��Pmʣ�D�IK�5q���R�����#�D�k�矄`���-o
�Ԟ�Xa�!?=��x+b$���$D�g6ջF�Y�.r�b�YT�ahg���)y
E4�O�L�S2�ͫ��elF�B����Z)���g���\`ZD�cm]��EA���H��~��s���Y��g�w.��� �p@��q�u	��;�_<��'?�$�d��׍��c�p���S�}���
_kv-��{ǡ���^����I��lA�5�Q3E���+���6��1&�9�w�;��n_L�Y��a$�����'	]Q]��C9M���Ĭ/��<Al@#��Ľ��;�5
�t�s����,�˄��2s˼�%���V$u�9�m>�Hs��D��=f���I�(�'	o�����I��;�ptK���"d�'�0�
�3L�H���8��
)�ȃ��ر����T�@FIN��o
Ԯ�(XR^��;n��L9v�sL�~!gM��rE��Y\�ͬ	���x0�K^:e2���`��F?9��!=TL'3:茻ţ(:�����<Y���5w��e��v�P�=c�p����.�4�-��u3�E'\��Z"�U�d�3�+�=�����5�)�=Ju^��$�m�069��E+�Y�G;b̠l�pS�
ϝ�	�'��7x�=��ף+T�Wȇ%�x =�BX(,ߗ���z!%w�D_6�+�Ƒ󧩔���t9V�[��	��&d�uM����Jѳ'0A���0E�o�Z�JL����(0�타�p~O7�3Iu�˵�<V�bY�1	P���cO��pn|&��kW��Zۿy�\	����_�M%H?�^\�xIl��_턌�c	�0Uh���+�寫rn�D׶��h�!}�O_�z���2��קϞ��u�^�:}�.�o�#�(e�9}v%�@l�+�bF( �1V&ޥ�:Ů{R��ˬ��Vᜢ�=f�0((��L�=�a{�5�)�z\��ȭ�C�;���ʓ�ߝ~�����Ǝn�N��H��lqK�1fA�� 5d�M��f�
���+��E���'�OW���b�3�\����Cʛ��J��*p����c��ఐ�����[�Xt��.q�}H��:�E��ԥo�æ&��x�&k�'���c��z�-9կ���o�+P�Rn��tJ��%@[�/nV/B��E��J���0���G�7pz���#x/�ouz�3��t��C������$i����5�)SM�jd`��W�?c�I*4�,+��X�ָN�wQD8V�FƵ��l���m
�.
��y�-\��n�t�IAOl��jga�"�Fe��rM�}(�U�d��B"�<�[ű��v���=Y>TS���f��7�,�F���_
��?n��Œ�R�_`�2�"�� |�wmZ�r����4$t�3�5euڨZ��NȀ�,�F=�O�)�-���%�\�c��z%��U�9K�=-[���u����V���`N`�L���ǜ�]SZB1�Ndc�r�F]~�c��t�`#��[F�ϕ�ptE���{'�o�L��c��vt�;���O�k��N�zXO{^�=S�&��S���
�ﲞ'��/m��T*�;@S@�DgD�6���C��NR��m�#O���8�~e-ETԛ��ax֢Şv8�jG���q��@�=;V��y�m��,�C���'��`��8�d��h�����1�9F 習��6a]RVl��)����%D��YW�($��Y��`�"�����%8�
����Uh�	o֬�^��ڤt��^C�;�'<R�����X4����$q"�\!�7kA�v��u�&g
{��g��"}��t���	�4����B�L������pP������BU���ˮm�WR&�b��ZV�t+�)l��I�����pG���X>�u����a@{�
հpL�Y��.wQ����օ7�������|�zvj�swYT�:��5&e�(&���bUbJ��t�X "&8�w��..E��L�s��ޱ/Ȱ��=�
�J��8��Z	�%uD���b��$ �Tj��׈����Q6&|-�2�fت���!Q_�9Z&a�&�$�d<�����9�s��حH���4
���7�(��uvkPF��tZ*xLU�-��!����
<AP\�(��
c:��0��p�7R�W��G���֌|�Vꚽ��m�l��n���~��?�~d�����&Gc�w�A�pc�k�}�a��ݢ
�{�w��i��*�����m��v�Xk��D5-�,�Z��f�.w�r��	m�
I~�N~�)�Pq+���g3Y�;u�1XB��g�'�w��
�x�>~Sq����۝g��
��٪�c]6]�x�s�J��T;�w;`Y�+�@u}���=�Ig��ơ9W����:`h�P����g�W�Q�������R�G�g�j9�Dm�@�����zt��>����@�*Mf�Fl�R3����W`p��ط*���m�$�KG���_��|b|������
�
��k�9L���f��j�N=��X��H��?�]�V������	��e1Z��˛�	�pּ��gMͅiA
{��틿d�=z�;4�g��N��y6�|���Vd��@xߩ6Ͼm�йΥ�����(��
�6�ȑxY�T\>8Ϟ"�ē�m���ߒ�q�n.
�x�(7����ˊ���+�� @Gm��*L���'k��Zf�l���NC�����HE^��	�4&{ҡ;�����'��KF�m�\93�.�(EsED��~J��^܎{�t��k a�z^n�~[S�v� b��U���漆ɕ�0�F=���Hڷkd��z��*��#1y+�:},L>`�@3sϾ5����.��]��<�&���Q4�~5 �6��{��x��3�T�R8��
��]�V�'�͓ާ�	q���qN���/ u`��e�CI������6���Se[g
 -<�e���(
xIC��dTڈ�}(cl�vH�\���&��Ҙ���Mp@4f7�(��'X�v���o^=���S"V�M\�p����?z�O������N^>�&j�'C}����;���>>�td��1>�����v���6�-��_�F.��?���``c9��w�o����i����ş^�zs��������EH���5`�ơ�+��K��#��(�T�B��Md�dVg_����R{2�9���&s+�	2!��

��*��ZTb��w�QD��B*Gl�(�ͷ�M	
 �X����Bh��	��H�-�D����:�!(�c{�Yk�<Ɲ�����x㳏e��`=_G}�.�A
Fv�I{>�1
�N<e�T�T�z��=��s�'�ν��M��#dx�>g�5֝y�����b�;^Mಃ�1�Q�[L��)��H,��Zb�/��#�vi���6tS�=NI�Q�3��X�<VU>���Rv�: ��P.wq�-�����T��]��|
���-R��<4,O��>uІ�m��)B�psye()yE�p?Y��v	��r���uQ�M�Oޘ��z�K0�OX�y��=��{��P�̶�i���w��26��E�_��a���,�3����F�l�0��˻�'��ߟ�����%�	nɟ��ܥ�m}]7��)�2��h��ȕ?+G�C^� �Ÿʍ8�лĬ��lw�l�xj*J��C5����qby�}�A�T�	��)�8�0;�%+��
�B�&�&i�PT��0T�tˊl�-�"��^����ҹ���չ�g��Z��$
S>lsT��.����j��څ
9
K.҅!����r���H��k@���h��w�A�s\C�n�۞W��c�Gmp �
��`�C�``�:f/����I�-ǯ�~�́��<���]m3�}O���?�S�����$K���H�z�,�Xa=%�I+0���2AEܘ��?T��Y��7���f��s��x%)�	}ͅ2>��q���.˞~v�_}�3��W����՜�ڱ���	��48��)�Ӟ��S@�9Mݱn̒�W�曇���QA0���f�R�!�W�%F���F� �B�	��ݤ��"����oJuw�= \'NeB����[̎6�&P9Yz�_�F������Q�\������uG_x�Un-�QtoѴ`��79|u�0y��&�Ɠ?�,���D�K�?�V�x�z��d�u��}�'K�Y��@�Q�7ܨ�T����VY�_��^�AN��n�t��g�r�
�(V�f��bY��<�}�d;�� pU�ە9t�*#8�>�'��4iw�I��{�"���;H1�FUOg��h��G��6ъJ�%}����N�iM�nL.�5S���;lQ�;��P	I��L�+-'	F�)~�P����mn��Q^�
�-�6��틳�IԴ�w��.��~nρ��������8ՠQ���(ԃ#�X����,E�rc!M�@��MK��ճ�;ɋ��c>&+����5���fqպ1�h����u�4�V�(�>��eJ�F��r�+dC�p��ʡ{B�=<u	�1N=:�&���Ŭ���/k�w�O߯���mF���Ӡ�h�
�8F&�5�I����iB�qlʄ��#��]jO�\�:
���O��6v1�'��:���|�f�J[$�61Z����N�P�?�,\e���`�"F��[Sx$�k]':j�m#���,���D��1�-@�@��B���x�8�}	��.��ă�{.�0��./�6�4.�������f/�.�߬��teD�ك���'��66(� o+c}�p��n�љ�r~�i�0{�����P˄�G�a�>]���k�O�@0��-3�dӃV~�mܤ9��	�i�\��O��D�`�q�����5ݡ�M��+���h�*ګ�ͪ��.9��8N4p'1���%~u˜��i	ҰA��bH� �G���U��áV��^]z�
��=�����_��~ �����
�=�>nP_�T�c/(�i
�N-��҄H�d҉�{Ἳ��\X�S���j4f�a��ԔN�L��suT}�h�׻+�$���1T;�x�Os��6��3c�;��-0;ˇ�K����B˝ĭ�Y6��2s*�nd2+v4d�$�C9=h�Q�a��K���B�p�?���`T2wV�p/�%���>A��O�g�!5K�5��U������g@+��6�uіAG�㞒���S�/��b�����9W���kz黈Y��Q&�8�� w~�1G�W\Jr-�sSή�jF�\d2}Z\�RV�P��oy���֍�F5���ܑ��a�.��B*U��z��b�6�rUl�86A��֥HCe�O"�V��p���ِ�5��\��;��m���,��%�ΤX������§YU�ӒIX��i�Y֖CU�q�J�x�8oA��x�o�V���O�h��
�?�(b��A1f�Nw<��k���nR�ʳ�6[�g�����0�Њ"��L�ma������m��%�
>p��,�|�=��p	��l��>s��zS]�is��䖺�,l����`G*
�J�?�Ȼf66&4������z2���t/����w,��7��Ȑ���<m���\�V�i��Tʘ���$+�WS�
�n] 6P�%��o0M ��;U�dW%E�=�y��s���	��.�.C�b��N�8p�:�>fw����דy�"�O��N�J�N@g4k��!g�Q��3$�>�8$N��?2���D�������V��	���\]����n����!��M�zk��"gƅZ�(eFJ� U������O�~_����"o��5%������'��`ܻd�CqZ7F�w�U���,ʢEdeL/�0ܑ_8��=%�����P�(�:�yh
)�at�,�e;q��\���؈#���O�,򕙕���r�{�wh�NBAΫ�ó+G�6�2t?]�}
��ʙ�Ð;�q�vpz~c��Dtb~ӵv��i�.
Z�����v]Uel����Y�$]ʺt�0�vw��t[rū�w���ᯅ(���",�E��A\��0k*�>�狖��S8�a	���c8C*-3��L8&&#ZC�g����^�7�5p`J߳���1�n�v;�j�(J@���yt�~t����}-Wq-�|B��PO,����5oB�칫Suϻ�]��YJ��*6ʚ�ӔC,��1f�@�����u���r�sa	u@�C7�t�ܩ�pr(!m���=ǐ�
��+߅T�.��9/�OĘ��e����[����0�N��#�8�	�+RP!9?rA�S�;ɍ�|��y	���|��9�0�z���T-����u$�T��uK���9^0�A@��	���T{&����Y���"#B��HbW�(H���l1Q�:��\�d
�,_'j7E.�s�+{�e:����x�I��=:\�w��B!E���l����K_{3ذA"������Q<iO�DV�k[�
���ٕ:��޺`��Pse��ן"vC��]���O)��[�$ ������C���\utw�&Ԟ�څ-KE��2v�8F7��q|Z|���q_��v�ؒ�ex�?iG��A�����E�p�� �Ε��ť���ԋa0�#x��=�K��lv��l�|��x~�5.�
'I��F�5EoR�~	�y�ʮ
'��֨I��)�~��XV3z��Y��NᴈTa�dif�B!�br:l��i�,�4��赦�����_��"��+�����k�Cn���p��3
-E�Hq�X�9n�fXҀ�|��~oom�Kً�� �Ѹ��<s��\hT6wmk�~2]dө�u�S�L�15&�A��~_��99a��[le���D�ON�Oh��}���X���v]h�k�-<��]iB�yB0Ļ�+��ҩN�H�D���I['���B�`��0dbh��{V��*vCe��!Hmtި8-e��+��+JOi�U#!+�p5dW�~H/dy��|�(o�M�
f���㕐I�8��,;�+���6�񲇒Y�Ӵ���id�0Qq�Qj����&(@�暝��ќ6l:�O�v��V6�v)�I��(�㋿|s�$Y��N��MӐ�fY~Ȇ�?�9z��%�
��L�����x�=��G���EN	}ܠ�Ɗ��y��:�%"����B�D8�&:�w��g�p&����i�
`6�R.	��b�B�`���w# yᲿ��q������Ni(��L�+e=�D�yju0���K�DK�
I�{i*�HwU]��d���u�ٱ���z��w_�{�yρ�;.-r�f)�C��K�ѭ��/�ps�B����ɹ�[�D�M2>Ń�V�5��F\��g�A�Z�FW\�%�>j�D�$���>v���z{S�xXG�@e�\i�f���Ӓ�όe?]&F?Z"�j�c�R���s��o1��
��@Ub�mT��g�M�B���}�]Hѽ�;�#��K�/�I�Hh@P�%���T�ۗ_��}�"L.��%=D�v~�8̀���khV�sw�b�Qr�zr�ޛ�J	�Z!���ή��m�ԋe�I��4b��;�ۦ���V!vq�^���	;�G�I�'����W�K+��Ю`��Ƹ-���Zo��f_f�QGg�4'�A�%��]�4����`B]�`:0Uo�ӧ�O�r�g^.q��9s8�W� ]��.-�8��<�س�=:+r�;�ޯ*�#Y𕐪�|_���8b!�c�Ͳ'ý�]�+J62ېX#H�"{��&�n�(�W�V
/ �jIMu�iVʏ���"�%�Q�f!t�b����j焒8����pT�@ð�O�WCJ���Ԅ&���xN9�)�ᤣ7��-jv���AR[0+�,j�8��{/T�nK����k�5�O���p�7R������
��S�d��&�r#a\m��5�q�w��2u_�1�=�E�>b.��5:${N���j���-%�&����:��!.R�QN��.���n/�M�ْ['�P�E+�K����zNyl�j�T�7�R
�1�'�x�fP
Uzh�C�P��Dpj�P���6P�3G
�>�(q�Ғ���w��>�l^���u�P���]	����uy��^4V����Q2aeb���k�)m%��İ-0�h�F�#ifV�v�?�B�bV̴f�����
�߇U�[ʵ
����bN�S�+@L�3�A�a�b7�k�=�?����O?���)��:?��y<�%N!�!L.�x�\��$����&����u�ke������}q������nJĤ*ӥ$�	W��]���%�P'tO�"릿�5/7�v��o�:.A��}�X�{�Xj��`Ǚ��
K�[Fq�6<���wO�?}��)��:�_q������9�q�0�P
�������k$�NM�N�0�H�� ^���
<�q�)gM9Ǝ;�>��G�O�)�%+r�9�c��;�Hf�⊆߷�=�y���fg��|b�J�A7)gYΗ��2;Iäo�}9�q�3��������V>��/���Y��w��#�,*[�Z�\?�Gc������@LA�1��i�������82&&�Rl�{�y譋����[�&��$,�+�oȷ\�^�?qb��&�?'�\��{�C�0	��@��^�hҍF�!���`Q��|�ʿf��=&���ҷ)[v5�A{��V������ƻ2ʎ��4���A'�Q�ZrF�'a��մ���!m�n?I^7ミ%SF�}�|���$���ؚ�1����T!�#���w�n8"`A�	��P?�{K3GiѼJ�k+9fZ�̔k��nQ�X�&�+�:ҰG�b"�Ŏ/C�}�S�#��*�a ���(���AjM�z�8۩�DZ���c������,�բRG�M�$&�]�M�L��"��d��q]b��OyB��E�e3��6�\��%�����XJ���,8���a��GH�D:��� ��k�r�e��*�4�rv|��h]����`8�+�o�|ĺ
������>{ByL{���(��F\v�޲�gsf�aN���������~����!օ�:��<��'�@�7?�$.&��~��n����K��HO��ݠ&�q�yB�;x����d�2��)x&�s��Qh�*���a��.�}%4�7&|p"��W��W�gO��:{��o�o_>���oN_�;}���WϿ$*�u���*�eZy�(Qb,�m����K��|O���7;�k�n�z�p�u�`o�5�E��
���`r�j�z�W���4�胣7���r}��GG�.�m3���D���r[��Sl��įnh�3�
�AD難�D9��0a�D0L͂�Yd'Q�gQ�=��	>���	"��j�(�f�fD�8���ePS��&8�q��8m�C��ߜ8裃�]A�m��~�9ʞb.P��I	)T��;
{��d��4:�5�| s�0�Hb?�Øٍi�%��榮�Y����7NH������V�]'5{�s]|YW3)�����u�%��d��L��8viB�,��R���M�!����%'>�ѤeF$��f�P���4�1id2��_��H�;�*�NJ�����k�X�����MXw���%������.[�BNZ�Ŕ�S}�ygQ�c��Wp�i����&�ђ�Fȃ1���4���}Z?���
��R��6�2w*�[N��@T3����>4�]-9������_�L�'>����%<h��t�`&͵#ޡ�
�;F�N�E��[���y�'f:2X����N'o�}����z!����⨯�!Sg�ⲵDw�~��f��LX�*�J�>_L��]zI*�u�̹�]mگ�9�e��_t"�n�)�kB+F��O�j��jb��P^�A7��`:v�b�t*m@$����,��e�O�f��`xx&��KjO\֒AJo
R��h�`9Dfj�8@$����ѣ<����w��/^�5֋>��G�xԔ�}7�D�xt9Ai!��R�	�АX�2��������mC>�d3c�=<��t���4�aQ�:�>�Y���~�$>~r�8-&���=�ҟ�آ��!���N/];���Iu�v��G\��щ���śk,��Jh����\Q3�ſRJ)|�Y�
�!��(�U#	5q�hy�w�Pq��x��B�Gl��"����.@HMu)�)eo�,��)]��k�.�j@�f�]�Іv�=�?���!470���jhVl9�vG�j�r�zXm����&c�]�J_��@[�K`��,$	�j��]�}��e���Ee~�Tj��Cv��C��K��'�R�ex�<b��oź�5�+�=�?����5�����p�Wg����Ax�Ϳ8R�����J��'N9�7�[�
�x�=ӅF3oq�4{^.���yq�h�?*���}91}Ӷ'������y6�H��9e����Y�՛��7�{P�0i,.����z��*�:i�H�
�ݱX0d�jJT#����򔒪[�<��=p�Q�Sz���6�~{���5*�>{p\�ł��f/F���f��ή�T�#)� �7��%�0=�#rV����n�JU�2: ��
���`S��Ͷ���p�s��i�@��޷j����$�a~��u���@�'r��8�NP�Y�_r��(e��v$QIQ��a�ey��$Ӄ�plm5m܋���T�EA�|����=�R��o��!6N@�t���ή�rb!2<#��z�f�e�Qg'�}��{>n���ԓS>�@Rn|U��.ZK%9��5x_�Ӡ�@s�>sP��X�Eu�J5��NV~�:�Q�S��h���2i�eAޒ�)��ߡ��{v�/f�Hi��#�¢&�W�2���iX
��	�aV�[<���β=L3s�?hDV�Y��Y����0�C՗��\�7�r�pɮ�l-���zyA0��b��qky��`yO��/�I�C�ZL)5,+��Y�!ä����)�R���n�Q��ܝ���J���T��PK��VS!pkg_resources/_vendor/__init__.pyPK��VS��a�Q}` pkg_resources/_vendor/appdirs.py�\�v�8�������G��L��t:�83n_:>�����O��P$1�H-AZR�y�}�}��*$AQ;nww��PP(�C���ߚ���]/h��g�0*lks��a��,��[?���g�7Ƭ����ӭ��mv���
o�N�Y+��'��,p�1;{�כ�KG��OU*�e��=ߋ=.X?�X��<y0����\'��`K���=���HؕJ�s�b��fs��äk�ᨙc�	ñ�KM��|�������s�����1��z��u|�€M��L�!\-�sb��=_veL�.��8�b{�Q(@�H���ďmG�����;��[�������'Z��^��<���������w[r���>��z����G6
��iB7� &!5a�E�C�(\>��o�xy
�f"棦���#�&�p�C��|���t&����'�~�y���8�a4hv�A���ǖ"��^�tnx$�����N���N�=i��z��W�%����D5Xqp�^�T�
���З��T.�p�������=�g�e��bI�as�GԄ��7�dÚ�XL��j�/΍S��aj6ݏ8#$��!�w��q�0 �uW��{PD80�`���>\Z���3��cp#���6��*5p�`	��6���@�@R�����d���ࢅ�`
?���t6X��1�k<�z����]��� �����`�t�3��V��a�p\�[���{�{d���,��}�����O��b����W�&({�@�([��Z��W��<%��
85u0t��k�(���0�
�N�4R��Q�_Q�@`�:0�����['Q���ﳱQ��B�)�0���$u.<B@��K$~$C�
B3����Y�I�$ ^���l�h��"�lc&�\��H��q���p��\3��z*	�m�B�(])����L� ��z�pB����	f47B2}%X�q�Q�JN6�5L��1ɍ!)
�kN�ȋs�W�%9;�Ȟ�k�KUr�cxV�q��pN�S�A�r��	Ύ���Ϡ�� �x��<� Rψ�P�C!�p%��LG��Fţ�4�Af&>��%�t�#�K��_���iD���$�@��3Dž9s�S���
C�;A���)�^g.��<fWQ�3ypm^�� Ϊ=E�.����hp�f��%�T�Rj�'at��'c�鏣� �ё�9�}��b�,p��~8�v�4���;�9��B���͚�����e�l�	Y�4�Q�DcuA&��	�p��r��ZL� ���2�a����Z�s�9%kI�|7�A�_�oZ�!��~�4���b��/`��s|xu�yu�椁nF�AJɃ� q����:Nw��>V�Hb>��D�.
�e;��c�F�8���=�=W~��\�q�Y��~�J��-��*�H3�I�dI龕}P&ҧ(�i�M8X��r�q��n.hYƈ�e7���`-�����Q?`�%+3m��K<�Ø�����vBn�ӀK��Zgǯ;�����W�z}qt�5�D(7r�)�C<�E�3�q���z&i2��&�ȏ�pqIh'G�n%S�ƫzi�I��h~{zB��R4��_$�u Y��Zuy̩���<��
���V5��(�`���[��l8����#��J2�Qoh��Z	E��-!-J��h�7hS_��؉`T�+LI�z��%MF��;�u�yp�X�
`:�^�{r��G01���gj���46�P�m�?�p�Ҩv|���
r�dh�U*�&�j����d)'�6�(�[ ѯ��yǥQk�~�IB���!�:	�n	�~�:��ک��߾��X�6ņ^,�
���\8����]7�~������a��_��V3�@7d�2�gv�I_�]�����C�c!NB���o����g�!D� K�$"FK�B�`_��S�g���k
�]�ysq�b����m��^�m��zۀcf�#e����L�8*��� D��h�)��|��'�Y�~ʙ
����>�xjG�3�5h�	�uZ�7��U���Z�A��:9�/��΂�����`	���?���*yVS�,3�����12�j����g�dSV�������7x����?b�o�?���,*g!�veeAqU��k���f��, ]��������YB���;�7sL��p����	�TX��,�ɬOs)�����F2Y��[��j�\�_�v�D�X
{LÏiX
�KaYι�b�
kk��x�6��A��K_&�%ů�dL����}y�k�5�7�9�>z�r�%�"�q|�F^P��-�(ͣ��߂�z5�������嗱��
Ukf���\:*˫�1GtUr\��Rf__O�Q���2��c=���,�Y@��FJ����n_��)��#R�6���`�V(愎:��C��}cZ����>��egO�ko�g-ctno�尕-��k�[
R��5�+��\���/Dj�tch�>���G���t)T���V�bE�G��39)��H.�-X!ަwz�+�3ꥃ��65:��K5�l֪$$���I��P�0�R�~�f�L
{褯��*>����m���qk�A�"q�b�f�m���&�O�����U�
۶�o��<�wڧ��~8E�H���uU�Cx�x���y\����-�ryv~vq���c���m��\��&Ȭ+;@E���^��4��y�g0������k��Yf�S��ېR�p���0�����:YR���\��(	|���h�G8�G�
8�x~F�YQV��O̲'��X��9Y����d�c�[���N�y��M�C�%!��Ļ������ʏ�9֦�R����A
l�Oc�^
\|�K|�������o��V>��+�+�����/��>f��,�md�{+*�b��RC�nd�)�ƚ�[��d�����Ԟ��[W��8�̊T�P��^i���{Y
�s�U)"x�E)"E����R5���>;�b�9����Z���N7���rhNr�`�	=Xb+P�@�,pU=ǰ�R>��<�Y9i4��3�B�43�ߥ�p��dkF���G��(f����ֆ9sGa:�N�f��eH�K�S��Ճ����;B'�Ǥ�n�E�v���)Ft7<�x�Eh��F��9 ?��
Y�+�;���~?���`����4�E�K�Ncg����n�8��%ӝ�2���1}��l�N�2Vet�'nax�R	����s�Qz��c�&h.i�[9�<�/2+c��V_į�DA9��}��L����\|H~������Iz%�e���N��2a��*�2��3�U{�0gvz8��u	k�.wcl[��-���
�L�"�ߗ{��QO|�D|���Y�^ϧJe	D :�ϓ�<,�y�	�Y��EP��sK"�i.}K%,9A��$N�.��r��!$F1Q9
�c�mdL���#_�`}0#V�:�r�����!�}-���;�Z��y�g��V�ا� t=
G#�GG�'m��h^����1S�z�πI�
����|��?����_;G�޾=9��k����,��]�l+��>J@%A��4���t���-�;%I	�	L�����9��3�����'�0ܘ��j��Xj���;�A�yS�G8��
G6͡�L?\��t�Y����z���r.�<t���ȉc��thn��ے�
vv
{��s��
N��9B]�:�a)��).	����j��h����tn��m�Jq��R$0��h4��\�V�_�������I0�����ᐾu���C�
�Ά�`�b�����FZ/�&a;�F��T.�������;�����/�r����A�sH#�����Ιè�ߕ|�v�>�?�-���\�nĝ�<�7F�D
��C�h��댽�v){�l��[(bT>nå6��?��Έ�I���XA��:���-�N{��T.����)�B�,
G���Yw�_�����?,�~ݤ,H�l�		_Y:X]�[ݝ��'Rƪ���ɭ�v����&�2�E��6��W��u��^��cRo.��E{�J/�<d�w�t��kA�2�q
h��6��l�Ő�w�H�ːf�͕�ɧC����Yh�N��5eJ*X땭0r�͆��'#���kGx�qlȳǼo�9�й<�z�6�nΰ��7I�Vu��t|=�+)��2������I�e.�I{�	N�/�_
INv�w@Z����_/O4�Pn���x�B8wФ�8lQ#5ơLi�z]?�m�����G��A<j���O�Mj?k72l@�%��� "��o.�k��O>�ˈFn�{M��2@k:1��%1�&Ks�\V��L�)�I/�-�PYS�Z�ܗA�\���&7š�`�դ��c��m)�/B���9�CA?���tF��(�
~֛�y,}7��#y�hI�½��K[Fq�*l��BQhA��c�7����f���k4�h�9��z]�y�Y C:n÷ھlk�b��>��YܻF��iU
�֭4F��t�xI)��ڱ��(�(rzE�C�����>p�lְC�_p�
��M���!~&���̦L�`�ay���f0_ؗ����PK��VS��+\�x�"pkg_resources/_vendor/pyparsing.py�}m{�6��>O��ܮ��Rl��n�]�qZ�:/7v���x��m��H���xS�o��AIv�={K$0��`0/��i>�O�`v=��2����O?��v��u���WA8�kk��k�_��x>	���w�H��뤘�e��Y���yR$'�YgU2���"I��4���YU��u0K�*�'U�f�:������s�T��U\$P~�e���@�|4�&YW��i:I� �α;A�@*uz��8�'A��$P����:��UP$eU�#A��d>����t�J;��R"�y	C��F����&4��d������ɼ��%>%V�=̋�L&��h�u�4�Pf��J0F�_��S{H���y�A�ɘƝ���_�Q%���i>��W0Lh8�8�rS&���'�eB#c
��
zͽ�I�Փ-����qB�g$B�1�{RV@)��,/�]w�Տ�w��W��~���߼��޳�gAg�~w�৽��_�x@�7�/��zl��{����g��ݟ_��=8^�	�^����}{/w�|����)T}��0��{�wp_Q�mo�=G(/v��|O������=
���D���v�z����Ώ��o��?�y��`:� ��{��
4��b��!�
چ����wp�>5��#�
�r��뿿����W��v���]���]n���ii�oh�g�/��ۥ���*)}��]zMn�v�^�D��zy�~~_�9Ե�;؍��7{���o^A�]���@՗�1�}G z���ǃݺG�v����7'�'��O�CX��a����N���'�)��v&����	��qɫ�4͘(�w��W��ߙN��l}���G��)vh�J���x6+�xt�	<��uW�W�NgPW�f��R���%,�I���u<i�.$,��N���'q�g��pM��'�]u?��:���8Ϻ����$.���*(�����P0ZM$b{Ӹ��C��속
��"�L�8]�8O�� ^>�9���
;C�G����#w:׸�YÚ\#y}
3�
��'������O���F�����g� �N�sa[��p|�����2�̙�?����x�K�'�un`�8���*�Ϡ�X}�=@�D�e?�i�'7̝��og� �$��;��}�}��U���p
�On��g\A�΀NJ]��+0l�/�3'n{�*��.��Jx3��`V�mn"����3�D
t�Q;q<��ǥ*yO�"�y@S���e��P�r�^� �D��}�YG�>�	�j�����s~��?vN�h:�����N&���w`s'�Go��G]zԍ�n�����Y�X�f*�ń��b��B�ޯs@=����6h�E��l�}��I���$Edd�4)e3�.	��.=��)��^�'*z���IU��F^$l�@
4�RH����ǭo�G��N��F#�{���Hf �T�aX�$�"&�g�~"}@�+�o�78�9E�2�&
�0��é0$��z��@d�.�wX��<ɂ�"�%\%�*^�J+��ABi����$E�Q�s��4O�\��hSH3��AL>A�O�j4�Q{��sĎ�O���$��3ʧ��~�]RQ����m��O����O���)s>��ɼc��0*�w���\�yY9�+�YB�"i/�M��A�c�P`V<���]�[�f���讙���֦ $�9��	K�X����A<�"��Y�6�33�hiCf@Q½������M ��+)�Wŋ�HT7_e�z`v,3u��Oh�u���yZ��<�G������>ޅ�`�%�y��"�]���(|��wA�I'�ه�	/@�I^c<� y���k�L*���P��@��N;;�c]���a�菐�N�D�8��P2��P�{uj����.	�dPfO��K��h�ʜ�<�2"�}X�����`c��1�ӄ_��� �tL][�����*
�(�K�U���Y5��u�<eP6G	���d�%�j^vO^�~B�}��Er�vV�
��
��
xz�k_��;r2f�z]�H��b�$�d�#���h�?����xtQ?��!�P�@6�IuX���U��!6�s��T�7�9�Lލ�Y���ݢ��W1D
�e����GFEc`��d���!�8AarY� �A� ��S7�1���j��5���Ϋb��H.C���p5�+��l��
?fqX"/aQ��	wPV��6��A6X���=>
dA����y�6����|#w���p��iq}�Ix,
Fj�!���|$�=��|�W{�bΊ_q(�0��Ϊ�.���IdL�O���I���|2���p�/F��n�����?�C����˜~��j;�6�6�?&ׯ��񩏾���S�.M �Ɨ�TX�n����͂��G��*�%UK�G�rt0l�T�
>�?$�\���	f�2���f��7�Y��\��C�ʹ� �h��g�y�~�_$���#�"����?��'�X���UC��}�^���Z�L��듔�Qrg���a|&?_͒L~���I���=șpg�aG�FvM~����/�w3�N�����E����:>�؈�����f1s���^�ҷ�*%�h�	/��{��c��j:1�_�n_&��&�z���d9A��	�pEM��͟�:p	lW;�D?y]$�i>/�r����U,�O&ϒ���HQ��Y�S��l%)��R%�Dm����y6Rd0�=��Ư��N4Y%���(�f�c��p��i_0[�M�eUqv�/�pJ{��$@k�F�<KG�8�a�g6!�0���qd�I���rBV�������L���)&�f��;�p17مZ�11��x�����6RF�-bq:��>T%S�}�NQ�A<q{R�t!�m>��>|e�JGk����i�%d��y���+��2��l�x�b��۪ৈ�����c/U%q�
���x��Q��g�[JQ�C'69����
�X�{��ngO�&n��|�$�@�/��G�G�H��#x��Y>�F��$��2T�Q^�I���L|E����5�1��4�0?��g� �?+�Y?%�
9.:Z��<r�lBG"��L� �	ί ����Q.V�G�(tʠN�t"��X����_v�I��MY
HeA���E��z&)�40�	�."5J�����C��-�������a
S����I3&2	��l\�)2��ɵH,�����4�T�Y�~#C-��T�&(��T�' �_�^5y����x{� �])�9?���a
���F@��rI�gI%��!�Qu�M'�^�#��d�gC�p�R¢��{o��m/��j�ن�xz2��j3�};��h�.��V��66��ǽ�=�y�f@F����m(��ݎ��/`���~�~�9�wr����P�?��O�0���p)dR£4���B�D4�w����7u�l�V��������c�<B TJ�F�"�R�נE�����P{��O��r�d,;�1�#���4x�� N����O?!^	�;L�QE���Oإ�����q<���I�H���}��Ċь0%�S���1X�8�B�cf���tX^OO�	Nb�OOw�v�r�̍Wa�O���]��4��HpV��P�	�Y^�9��D+�3��f��ю9�8$h�F&]�zTA���B8tV�w��$dƬ��H���',�S+[��A\��tNJ�@!���φ���OPv�>n����G_|�՟���/3��o��ӝg����vG�R[r����I��;�1"�f��wgJ��;�_�4G��bT:���2�+x�e��Ոj�"C�� C�&'���u\��_�QuI�\�752A���n�smW��⍃����/whQ�E��h�R`t��7�)vI�4.I��W�ZKC���C����A(m���S�m�V#��:��$�UP��Z;4Tŋ�������1��K��o\8�o;�~c�š��){�j�†�I�J����2i��G�zg�#�x���{�sv-��tS�Z���G�#��}��X��+�"�ėy:.X��k~����N'p�-��x�>?�U��.C����d�؁/� �8���{��;�m�����=K%��ꋲ����x��PC?��3|1P|���$)�Y�P�f̅2�'��n�Z�t�E6�ZđvCA��:<�N�"���P/��X	�>��;0F���vzm��`�/��
k��S`��R���5�Y}��;��A�
Z������-�&��طv�	5����$�����)�._�+>y�[��4..��ټ�q�ä8PG�Γ�w܅����#���I�R�!�
��|����#�1*(�;���!�Y2B;5Xڎp�P�
e�[Aܖ��~�n�2�1�P"A��mMG��u?f;�}d@��I�1���;-"�H4��f�܈�A��!��TוVjI�)�"�w��ȯ26��y��P|kMm}+�y�2���̎��vs�ъ�zPT��	���n�gI��YF:(�v��*gcG���}$�����=����H�Ģ�|zN�Ok�����;X�Y�R�k�����:3�u�jvݡ0u�0(ԾCYL�x��'�$�=��k���c�xqf���C4����[`q����t:M�h!0�^�m�J'���/x�O�����(�8�����t|�=�m�k����'7p����O=3NQ},-z|�*�q�r�1f8��b4Ո�`��]8n�o�oL�MR��$�=�dU��%�7�lUFuh��!�d�>}[�B*��IMg��H���oX�m��ilrƢ�*}�}�AzJ��l��bI���i�� as��x2���]D)+��[��5�Ĭ[��X�Q14��*
����m�x��8�C-ܙ�I��J�ilj3yV��L%�@f�ж�Ȟ='��CI"�>A����,)�O��j��[�W�g���m�5�hr���i�8��1"q.PXf�j^��{�6n��*�y�6K�q�Z���[�|^���o��'�w�x1����?G�d
�F;[�f�V���snL�bJj���(G�G�n��m�k���(d,�&������sbth28����,b�H#1��$E��4���
P�
������b��SIg$Y(�{7=��6����wXRJ�hTo�֏oj�N��������Em4[.���'7�����-C²4�J���<�\'1�` >wv
}��y���Hq�A��uǔ��ɯ�����MM�gJ:�xP?��f��&͛�{�!�j�8�Un��u��Y���K�]��o�o<|�n����B ��l����N�'�l�t�^²�3F�:H�BǽN�-��m}�%lu[i�;�EwT�W$�����jc>��`��z-�x`��-��x��Y��_�w��‹{��u/��F�b���]X�0oz<X�B��!�n3�>�f�h�|D���dž�<���=D	�F|�r��U7^�k\�n��$_�xB߭]Ծ�P*H[t^R�چ`���u70��sK
��P(n�]of�q��t�p[,G^��.�i�UX�]s��(��J1����W�%`?�O_������eh�x�U�[$`�!���K���Hl�Z��*Q�8�}�����j�'ߎ6���B��{Wj�X����4�^G�؋^x9fs]�Z�U�%]҉in6p�Eh��;U���8�V��	�`�J(�uä��)ל���T�n�Y��>6���P�$]/Z��;��7Ŭ�DL��6���'��lPɨۍ��{�A�	��뫃c���c/x^y-`�͛�Q[�<������^����k!�[5e>���Mk�5�E䰤{M�hk��>� �u���5[�!�o{xT��+ψ�w�gJ٥��{�Ft��J�F�zKfs$}m�6�m\��[��c��Q���ɖy��(1"��4�R7�wk.�.��r�]��e�B�.z�]��!���‹�6���.�]`~�.-D���EdLr{'hr���6�]�Ҷ�/aA��نrx����{S�!-uiRZͯ�z�Eh�^���ڼ���p+hԷ��B$�����I���.�{Sc��yi�>��6����S�[&��{n/a�6|��ޱ��/E4b����@
��pϽܑZ�힦��3�")�ќ�p\�+ W �$�Th�_6����}8D��zւK,\$$�s��

�wA�ͧ(M&�щE��(��u٭��1�ߟ�X֏ͥlӣ0K{��Eci�J�&���RL���շ��k����D�?U��6���*Hy�Ϥ���L��wURx����GY��X�h�-X�"�.=ZmX��qIv�6*����u��܊���%�(F�m6��|�Ү�'H��jz������y���%�&z�શ�~�҃*lu?�N�R+2R(lj��¡D-D�C��:@���u�4�ŏ\Am��Sshi��C������$�k/iء+�^���C.~/</l��uk�bZ8�۶��Պ����Et�bt�~�.�0[ҦB%_2
<�Pu��{,벚�ߵ��;�C��F�Z��HPqɓ�;�I$����B9� ���_}�Rw#b1�C"�+f4��n���\�آc��lX��J��!�`t�DuD�a�Sƈ{ys��'G:�gJ`������~k5i~C�GS�G$��
�
�i��������nz���������<�:x��{��
�k�1�F�������
��!���pɂNS�C�ǣ/��=Ҁ�Pi���Mp����em@�HQ.b��ٙ�X Y��!��A��ɵ�]���אj$莑	Ƚ��fg���exM&&U�lTp��j��oZ �%`��SL���;��1���W���2}R�`a��,�U����ر�[�7�6�;=Ԧ�5�_?=���
��i�x<6��́�аݦ��$>I&N01�_ ��!�����t!��oH��P�~ZwS��z̓6FC��"1lF±Cx��TY�N�Dȴ�(*��c-F+-:V�%��V��m"�e�	܇!ܪV�K���l?�^lPҝ�%�]�[</"�w:!�2���_�a����i����
t��t=3��q�/��\�v;ĦsZov�R�ph�(s�WR����e�.z�[�T��Ү��3:�8��e�:�5�E{�*�bD�xD��51iY� /�w�,�R�n��A�EM	�LT!�#U�oX��H,QX�DG�$��2�,�|t�]K1����_o�4�!��e��& �v�ˠ�����Jб���t�b�Q`��1"hcTE�n��
���n��r�[Y�����_�&��k��r��tW"�Bu
�z�0U׾�w�P�Z��#(����^s�����F*�)�+�ma�Q��l{%�j����4��/����"Y���ޭ&�}lA�	�l�!qpk�H���ٽ߰��)B0�!��B�'
����5��n!�:"���r|Ak�dW�Zl���Ej���-n>�ࣨ��`��	��_�$�������=��j=iBu��-�jT���;�	{�E��6�;`�
{5�F"�{��)��*���Q;H��t�,;�gt��֤�h��b�{pF�_|��j��#�Xԕ���*�_�X��\i�t(�If|�t�'�O�E�2��sB�R�CR\%���1���j�c_�$,2�,�A���
����4s+�}zLٺ�]v(��ZOw�9}u�lR^�	�����`rQ
��7�b\^LN����_���B!�6T,��G��-E}����RӢ����K
1��WS2�M�TK]�I�i���=ܝeA	1	��M��GVF��tIY.�+�h��-�v�=f�X�퇨���	b�t�Z_���P55�¹ެ=�Ѱ�~Mu����k��.iN[g$'�B,Yl�t��T�W񦪏����AA��:
U���'%^yj��&���6�U:B͆�#��\�-����/i�HFO5i\z,t
}���[��L�i_�Yņ��=�۶vMg��F�zm�3<=���aA�%��mR-�T
Jm����dYLL��zk�a�tO� ǹ��L�o
,Y�c���S��Z9ccAz�=���Ea�*;t#'SO8;��Gcy ��h�p��#/S�����+Q�9��K(溱%Ζ�#Գ����s���1�E���)�m�6������V��4zV\�Lf[ݮ�;��e;Px�i4�܂�6�����Z��Fm�Z��޸ V�)e`q5���%1�'iܳ젤u,kD��2om����H��o��$i2��_u�%l�]+�7�d|�K0)�_�����	jI1��ٹ���/)�j}
��75t��i�F՜bĆ{�9�>q���N���t��]m� �+$7�ha��/�d��o�d�{F~�YEcl_�t(��gT0��j���/{��h������U��9�k�G6psm`�۬
�ⷯ�Z��
�;U��f�n�Kj��^Fjӑ_��{x�Oj�Jl�8
�wa�M�����=x�E\�c��F�㓞�����
����^���j� Sk��;>����h�Q��_u;~�����.��	6�,���#J�B�1�:��p�1f����a
�2�|���t�[:3mb���&�F��}��%��"�'�?��K���P�j�:���bi~ V�'���ѹiY�MCQz���:��c��s�iTp�mz#�|�����SN�����^��ī�PG�n���9����d0ou'o_�]��#��t�=�%hw��Hp_��s>D��6v�)���7||�t	�@�����w�
�Tg9�<���{o���~��
q��}%���Q�~�c���;l��2�f�VV#����n�4|�I�(�@o�D
]�Y��ɱ�3fu(��l�� �����
[����R�mf<j�8�+�\R:D��J���\7��c�&`Y�ڇ�b�G�@�}yt`�vx
L`�P�=��\�\E�Mr!�'eZ$�]����	��}P�ڰٿF��<��0�
�v�ӣ���r].������E��Ь����k@�%��)]�,p(�t�w_XX���`T-J�w"U~=��U5��#���[L��p�j��m^j�B����G��Ȉ�:G�*�0���<�x����Mŷ�������������[�~�n�/�1a��G��4���^��@�U�����L��E�^���x��RN�>���^wZ������i>���uf�V6���\\r`.�M���x�u�ڝ���l��5>��FUE�eօG��������DzU�,+��\F�^��~>��Ӱ.�����jgֵ�,Z5"�4%���mꀼ����-�ělX�Ʃ(==MH�5��Nӳs�� X�#ʂnā�z��̆�r���v����?���F��x�9�����؅�{ݞJ��MJJnO�3v(�1BJG6 ���O?����05*�_}�n
�T�ϒ��䩟�}����ޯ�c�@l���F�������?�Opocc���cS���<��*R�+jƬ@�]�P��%��
u{�ll4h��l�����]��._ڗ�Ɍ�>X���.�pϋ�#%#�v�^,6��պ�O����ZY�cט*��gR���}&�.�7_30��9z��������ęq�{���Dm	g�n
�g�9&(&��Z����,�K`t���~"i��y�B�VtR�)/�S�5r�ЗK�Q(�=��}�\�!��$D�5J%>7835��l���5)��?�o+,�
�/���vY�X��_H�@3� ���-��Ta���Qo��UH_52�<��;����@�-��E�Ie�Y��۹衳���u�^_]G/�&������_�P>�t>/?/����f@�"C�� �ާ#�h5Aq�
���	z�^^2qJ�[���,9M8
0q\�&f` �Bi��M$ήM7�KY,'kR�!�R6F?��׮��m3�����f���6C�9�||��_%��EA!�P/J#�s���er?x2>Z�<.��+��f�io���V�}��p8A�o��4�un�;﹵�u��I��T6Re|_��y])���{
J�2Ѝ�F?�ߟW�l���q>*��x�g=��'E\\?������
��ʶ+
W�ʢ�`��ϧ�#�KbuW��cen�7�N��h��u��X���Ǫ���r��V����D��Ma���,��$
O��`�����^����	���]�c�X[a�������|tO�ώ9 @���Q��WS�m�&ބ�����:�l3�����ś��H7��|���']L��^�|bj=��ħֈ���O�㚪���^~er�O�#��v�f�la1��n����G#���JX��n�'�0�g�m{;kt���Xoڕ�F�m5�4[�?<s.�xiZ����g+��{�"��"�v�sH�D���+A���fK�^�Nn+�Vu8����'/���l�hS$g��B�RA�Ǟ�dT��F�v�TJ)L�bd��\G���4@�?��H��s�����!:R�m��S�:�uu�{�Wɦ��Z�Ib�B2�$�f=7>)�㢙����$�K�<�6]XZ���/�9�>~�Փ��fPτW
*�M����D�L������'7�V������s�>)�bh�q�L�+ǩL�Gӱ3�+j�W�|��d�RMkϜf�t|:�_B��4�Cs�I��V��<@ϡ->����A9(@\!���	�	R�4�@�f���B�����F�un��M;�^f �\7I+�t�X8�ЖN��+*;H�@g��g��F��9`1T�ŌRu���ROl�-G�܃�M.*۴�z++�
���p�%'�3q�C�h�QK�:i6
�Av^��J��OitY@F"�o��i넟�#�1�lA�ףL{��@�@��s�Nl�3-D�x6� ������7��z��n��jtH�..C#�;jt�ΉF� �M�7���l>��-�7O�@��gy�!C�]�lPP|Qɽ���%~s&
adf�9�l��m3�]@�p@�f`9�Y�!�0�|���-��pO&%e�뎓Q����;�H�t��4�X���.۸H�k�`RAl�B=VR��`v�w���GF�=R.f���ӷ�����cj�����Ǯie4��M�*�((Dg�:�<����Q+���@�Haϔ�׈#�Q
�*uu��i�u!�WK�y�^��#��y�Q��s�4�S�ny:3�a����*�m��ƒU�z�f	��5��l��׶�C=
��l��@�h��Q!�Hߣ"/�>���&G&���S���"�.�]E���hM���QGx̋�`�LmT��̥J�&)�h���Kb �L�&�Än,8`�Ry]�� �hs�w��Q�B$H&s]�4��5WOzOga��'��PZ�L���@�dF�H���ЎvR�?j������H߹�=-�|�Q�q���H�����Я�z���KY�k�~dU'au-�"(��kVE��U�9�cXv�Uz�)jڑ֬P���æd��z��H�WxOy��Ur?���Z
b�2E��V0��[���云��J$�t��	�A̒,�T�GP�s�������g{ϟ�оR��=�_�=�y�l7�~��w�Q���ݗ�������x���� x�&x�����E�������
^�|H��3=|�����
���r'�{y����f����7�џ������+�����3�0�C���Kv�W��,""��,g
W4
0W�Z?~�;`i�Z7V�~��,�;%t��Y�,��6˶�r�mj��~��)^�tL�2؋$�i>/d{�d{n ]��)���6/�{�7�0�u�Z��N�kr	��86/'b�mbk�C?Kn[Ɔ8~�k�jى��Z��Z�i�K�e���h�Ԋ%��
H�<I��ze�Qb:�Y��-�(��c�s=yߞT���9��z����b�7�GT�
Yi�>j'0GJ&�d��,g˨�)��j�����v��$b�<_��S�e:����K�v�o��8����!��7���m��z[H!�$N�2a�XIFc98p����=����x <���O�),�T�9�����v�m._A�E:NJK�u��0�.�V&g��r�Tr�B���xk�7m���z�����/��(Ѩ�]l%����(�̿���M~�z��R���,KO�Q�9���Ƿe`�+�"�#����	n!�4CL�S�I�#8B'���.�y��i���W��3������X4��U���6�@k�X�857�]�?$���z��$~�T����o�U��!�a�<j�h�x(�°w�d�0_�	�J�Z��1K+1斬�S��zN��8���i�q�ϳ�,��m����l�Q�a�[9?!�GN^\?�=s>C��i��&!�r�qzi�+�@l��
n��tV���@Leh� �<^1*�2J:&�Up<�L�kV��Ng�*��icv�'���$�U�H�XV����\�&�C��i��e[³���u�;�,|�����L'd��/��>�x�P`��)���V[��H���/)3!�}��id�iy�Sr��b[h���c,�������	�S������$ɢ�׋B^@
�m0��^po9�LUw� u?��y]$��Ƙ��<Ek�1��b��b8%���3Ң׮@��w������I3�c_��
�SM\��1�zʎ��%�o'я�Ȕ
4�&��U�Ez���A��C�w��d��%ޯl�����z��~�w#��q�NZ����/pw�5�\AM���{�V^,6w��A�VwGud�/��ւ��X�!���ȿ\�X��Z|�嗏���_}�ţ/���+c7�u�^��&�sb�=�^	F(�;����L��͏�Hkьf�ްcs�Y����­�X���.ӷ�+;u�^� A�uC�C,�0�J)NJmA<m�)lg��e.���� ���=�z�A
(z;��X�v
��;Z�3¿�4?m�k���A/1}
 .X�E�md��:�o�yFmnC�vn���Vk�ٛV��muc��7��;)����FbG��^���=�q_oj�Ф+�q�=��y��R[��5��V8+
�3=�WdC��z+��A�/_�n2Y�Td�}\������JȖokh��wS����'Δ��z(��1�\��͘A��HB�2"
�
F���8vc�x4H1�si����|N=��8a��Uۣ�''Er�R|Ԕ��{Oa���A��qn��.ڷB��YӐ��Û��ۓ�R`էL��5ڵN��F}�l���w�@�XO6���*��ќ��H3�mw-��%F� ��%�Uع�`�:�l��5o���u�4i3/U�9B��߆�`MR��NO��t�|��>�Pl�S�����ghIȥ�l|"�Z�S`4�E���:���'I��fkR~��]���t��x�h����-`�ķm��`�4Pg��ԶKy���È���qL�ƹ��h&�@A�
���K�
p�|q�I��I$�i��a�{ew�2�1
������a6����'`�"�(>vVe�u|M7VT�I㗷��l˦�,�����X��YY���N�IAR>GW`�:tȼ��i�(�N����xm^��fTg�]�"�ֶ��]�e�q�ǣ�i�h��i�wc�V���F���f[��Fu�W�Ŝ�~����l@T�'���((�|�'�Uς�V�C��1�9p���4XU$��-3���Bţ���q�^��_�Qj�{GY���iF����
�6� �Р��c��Ґ�j�F�S���"�Ԉ�+�e�,L���
���R���1���P�$�Sx�����YW��`�t�Ĉoz��cڦ���Fy�MB�2��8�y�9$\<A]	�ַ��1
��s;�rˎ|E�q�|t�q�||r��jHN�;����o�x�/~L��o�"aJRDQ�Y�AgӦ�Ѣ��U5��X��RU`5�1_+g�
(�xL�w�3>ԮoȗG�mwIm�=��ɰ���qx��d�%9(e��uDb\�
�Q��R�TJ�,`i��G�N�['R�J
4�i����?�#VNxQD@xv�y��Z��ƃ��Ct�(���y~i�|3�LNKL��اad���ŷ���*sD[�e�L�1���3����1mjD�S
E7�n�F*"�C�0U�Hպ�$ �Jˢ�4rQ������E�������#|rb��l�'ϱH��Ai��[����sr�-ǺAi�e�������T���� �b��}
}���X���V�|I�s8B*�o���½416ݿ[�0�����/��]�ì�5�� C��ZjD#㾊�ׄ���Dbu��!fq5Z :��-���xB&G
W���5�
Z���N�+<����Tj�4NkA��
�܀{�6�Ž��6f��6�P2����r�E6u��	]��2Pᴌ0��5��;m�;��V�]Q�]Z��c7y�%Eѻi��>Do�N�n1>'�32�2F"�1Wxέ�d:#�?,&&{��F�O$aK�Bժﰪ�"���'h}m��r�CvE���f}(���͍��PX	�y�h74�r�4[J{C4���I���N�l(�,BD����,�aL���u�����
~�i�i��;S�ro� ���$��|:�5��f-tG�^}�"dZesǖ���������H���gG�(�c��+ݹo�	ض�r`_��M�+n@���BI�5��y�����Uy�&@Q�|Qհ"��/E,bu�"/f]��/I;�����j�.ɿˉ���Km���௳"?MU�Z���N<:okf��>�����
�ÆQ����V�T.Y��˃�����t'�;i����6rW?�>lX��D٪ow
6�\�iźs��L�0o���X���^ȃZ�i4,"m�
�X�A^s9������Vѡ'��l1P�yn*�iƅ%<��U\(�٬�”�F"�^�?g&o~@Q�
����V�O1L��6�|�|E�Qs�rGeA����j�Ԑ;�Қ��
��F>m�Z�J�@�8;�ʏ�Z
́Pמּ=թ;ꡪn^���b�5@�$��c��A�V����h����zhj��Ή�t&zK�1Շn���-�N�9@��bq����c����3��z��1�w��E�X��[+�ZD�jZb��Y����[~���Ր�P}di�e�����[~yK}>ަ���nk��B�(���wYea��,��Xp�t��X>�O:��u�i�����v�և���'M]�<p–��z��yX+}�� )V�V�P��؊-��er�B�%m�<ԃ��x�)<�]<\���eWl�)�;�UK^G�՞���F��=Q�?f'�TJ�|��]��赯!��u��N\U=h�8Pw��8?���a�*�y�ICZ1�D�H�"�/�҄���� A��A�|�ȱ��
c�e<��+u��Qc�	�g%�#���at�[�m�)�u�Euhh�Z���H��5
tm��p��'E2�t�-ۙP���4o#h�k�����^:�2�$���F�%W"z�nC�
��į{�,_9Q�j��.I�����5��{��~�q��\/:�����>_����%�f�2��ҥ���,g]�KZ׻ò�uﰴ�
�?v
�;~`}OSJ��e1i'�Γ��X���zWc_a���+�tiǠ���[ַ..戧��z6����k�^�{���%,��Ɍ�Z��:Y��H��6&.��y .�;u��Ck�"���z
��>q�'�|9�w��k�������_����b�#p�J��kO{C�1�}����.�1l�\}�k�5f�m�7���k�k ��F�5A;�kK����^%d?��p�f)҈c��ЙL.��,�AF~�������YO����ħ��w3���a��;�H@�^��\}xa�m�k4j�2��cn�d�!gA5�{$l\���<�sI�.j�uSY�o��#DZ[Զv�K��8�����\�n�!��m��fT	� &��Siu�E���؏�ف��އ_dֺ�r���c��`H����m�X�[[�=ó�4��&`5������jK��Fo-R���>r����EqK�~�\���,4w��(�<&N}ܧ�{isL�r����eH���H��D5�p��_;Vy�:�XGj�#Y����1�)Ӝ�W�lx�L�td[�Q�h��ʭT�di�Q�є�\�m��lf���UB��)�Ha0�I�.8+b�[�hc2lʴ?��1S���E"M�lM�;*#�C�����Œ��?Z�����$�����iҲ�F�f:��+�P����	�/�՛<�|�*Xo�"�LǮ�`���&�*ig%"n�[LQ�Re�N�K��c�,����J3H��(R��0���)��.qf�{xl����!�a�%�vv�]$�W��d�\ �Ht(ב�[�Q�)}}�
:�=WDv��B��q,ugI� ^�s�Т�����>̩+��jgL�iB	ֶ�dD��@9R3k�����N����$zWi���c�!�1���Yy=��׻���n���h��u��l���r�Â�hG��x�zC��9i��9a�^���N46*��\��$)uP�+�)�O�0,��)�</D.zjڗm�gB4�Q��p�,�]�Ks���i8�ZX�k��6��w��߂ͭ!�7��eܪ�Z�㎡�/,L�[��6�g�Ɓ�/g'�ecviJ���|v�0kz{ʑ��S��S�Iέ�-��EA���2o�f���sX�'	�1��$��
��Q�x3f��_�i��Qc�ٴ��|l
�r�g�z�\蜽�^!�2qG(���ZZf�qh��ӳ��a������E�+w���J��%G��}����M�e�?�䨥g�0(rS-��8'���l���ɹdj+ǻ9lb��}��;��
���Ü|f� UQ|��<�z�գ��&���M�m��4�&P��7�l�'�<�DIȦ
I���sg-�4}�5����'7v�q��=�t3��!�B�VĆ�o0��&��G�9���mu���z��)*�T.��_�����z3����~ܙ��=�Y7��1ź1~N�]#�3~��K�����,T,@e8ka�6#7�}��u�u�R�
|��ݵTx[+������'��4c�SEkmxE��o��l���1�--�i��1%W����p;KXF5T���!D�y���rO��vf�FMCF�l���}��+�q�z
]�8.Z_{�I�(	*�#��(1�A-1�ϑ\(����;�@C�UG�0�)�ͷ�6��
�5|���p��!���I<[&���`��2O9t�va�*�9����� ��z�
ω���B=�c=�'i!?���z�5C��r V�G0�ݬ�zN(�s��y/x�h���	�ˈ�#�0ݭ����,M��aj���펖;����A,b3K���=Ԋa��%�_r�x�pP�Ub数�Q��N9�r���hR������_“�_N���7��_���7_��cW�D��M�D)͈r�QB�Zf���X�k���t��}��A��!������Y���^�M����
��k�? ~��?��)�>Ҩ��cY)�R��?�����w����s�L�в�/�a��z�$7�sy��۸Q�.��[ES��j�)��[����؜n僠=m���Z��h�M�Ou�,b]X�Nلz/\�i��s7��I2��/�Y`{��۞�	?����&c�6ګA?d�[bv���8IΘ'+�Y}�ť���d�cr@+tk	�6��\Z�e`(��(��E:�
�q��B����
ɏ��]1G7�E:�����6S8��cK��w	���y��ֱ��J�RX�U��
��D�t�{g�PT]��L��ϲ��E$��bI�$�	$V2�1lLu�EN(�@��@z3n-�20c� ڼU�1x�x�@`U�;����E"_��2�C�*�&I���'�@wd
/�ú�5��T �����ɛ��$8��E���2�N�����9��΋�����7
�Kho���#?q{�N�W�޳����w��n��5���=��wl�e���ߢ��	&_ٵŊ{HY�E��R4���%��4�\3�U�H^
}���tH	���Q\3�K��g����
��d�!�fƁɔ�ꤦ0CG���j��<�{���:ei�@�m��-�ھ��t��LG�Enu8}�/Vڗ�m[s ��i�40�^�GQ����t�IV�hs6g�x�B�?�p�3�%O3���r4<� ��B�h����ʈ9.F��g-�#�Q ;Lںh�/�"��Z��c��Rۑ��!2��A�o������"�,�]�bK�Gv7���L��/�TH*
���>�L�#�+�u�L&����gR�::'>5�:�x��!�`m�j���7AYi�T�t0?
>Y�WP��{?�����r8��q��]��/�Ɵ>��n�i���4�;5�� �H�I�H\���m�Ʈ���A-Ϻt��v��Qp��v�������?F�c��	�(`P��_���D�m�$�\���j���dA/8���z�/�¦�+�^��Cu���>��B<w[��wI�PAe�1�&����9�q�@�KՖ���X�Ԇ�Wk{:��'!˕Fzuek�k�ٸ�oFs�$3��%/���:��4�þ2����<\��
?3LĽ��_�R.ð3���|��/��2?�BXm���A��s�%�E��L�?Nbt]�
�mJ?[��t*r��_�
��xZ�ҭ�i"��s����+o(Zr�WV�Y�#��
~Ѡϲ���nt�XþF�q�a<kW9��Z�&�!>��L�������j������Ct�FD~�,�X���%�t����%��M�„���H0gEB~P��܉0A���3�~�<A料�/����B�ᜋP�nղ������VClnA���#�����Z��>G�F�����S�0�k&uX�ፆ�AZ�ͫ��K�r�_��N�!�Q>=AE�JςV ���㜃!�(�.5��〒����E��M��d���4���pO�G��D����������
] ��1!,�T�p�P��L<�ͨ��r~bO�-f��g>j�O�V�(ow�����6�&L6L�`H��d�D�;��A�Y��?�<9��?�O���v��7�~�Z���xt�J(���gi*�����������3y�Pj�i�rs��������/�@V��+��3a���i�@�HC`K�"9�c1��o�����]�@"zo�Z��}�0���G�3��\[���Mݥ��c��%E�ɨoB|�kDit��P��E�,PT\ֳpceq��I	�3�_FG�5|�����}��O�KF]�Y_D��a�Pj�t64V�M���� 
���{�]�,bI<�VR)��|��v����b<����8�c�F>���.b���G#ÙD�+��"5=+�.����m%������a�	g�St>��<�S�X�^�pZ�m�=Tw��k�67�gP*�^���A��xG��-����#'������/[p._O����%N��-2����ٷ�[p�d��u��t�;��/׏}���e��S�P���2��=� �	S�Ц.;�uе��.G��~^����껄#t����dd�\�2��̟��l�ۼ���1�<n$7�7t�miݖ�`/Β36�%ߎ-Z�3�Jke��ux+�ar�<A��✠��x�ܞ=W��N��`a�XD�\�w�vX�Z��":4Z�y���ʣEW�ި(�>Y��J(2r�g�|�[����@�����C,5}�7�x�AXT~!��Fwz�k��cP+���s_E5znѩ�a7��9��6�
q*g.dCɋ��'k�ɒ��9��?Ύ�Ƴc���Zď4���Ci���G���C��mK�U�����U�|����c������5�t���S�G��?&��8���.?�d���Cɀ�'�:Oɒf_��>�j[�/�j;�n�_�O,���;��O� �x�l��ի�</�ќm��6����:� V"���d��_ت�k���
nl�4�l�Ŗ�h{�J���
%!�GdQJX���E]C���1"��o��<��ȧiU�����F(�}N�~��/�=K5i���<6㸊����ڰ�}��
�~��w���|T&�,w�L���
؄d�	ڹ	BZ�<�<�:�ƚKTxFe����d�_�WN�ׁ�Ϧ|^�B.�~'��ͷ���9����CY�);��h2G�e�D��S�@�����9�I_&u>�e�{�A�xt�
�b���4,�6"�@Qje�r�R�t��-��[��u��]g0�S�Y�%=ۓ��û�����4���d�	�O�FfS�2���/� �ԣ*Hd��Ԭ���Ծ�I��Z�)Vy ��9x|�H�2	b�fN��N;�B�m� *S'���6D�H�q�?�eW�?i��#V�շf��#�'ϫ���wc��RTT��1MuEc-��R�	�ERQ
D�>�Z�R
�A �C��Xɪ�_�� V�$���<'_2�dp6�<�SѼ��8��,�›o��,��ɲY|FE3�(討w.�R��Y�b�����4s?r����@�d�<���w�a0)/~w{:q�Qy�ʔ���I���>^�Q��站e6��6�[o���	Q	تBC�V7�,�����-���T_T9��V���l�A/hj�=L����L�.rH�g�
@�~j�I����MA3�Ov6�)�x�Iz
�3��\wz�-df�5�P_w�P8)%a3��,3�5X��(Q0��b���*sT�&�t�5#��n�s@�(��:
%E��&"�2�C�x�����F��%tz�[���;oբ�Q
~�*���P�-h�o�q$�sjf�OsWc��=)
߶�uc�v��N|2
�7�|�͚�_�\�5v��K
?�]��h��)�';]XX��e�-@�/����:a]=Ĩ� "_� Ĉ>���}�K_�
��z��
W�:���T�j<P����F��%6��5�e��,�;��k�y~�qP��⮎�#�a4n�?*<j?��O���ip.�M��H�a�07��`�V�[�Y�o����!�E�A�MA9�<Ʋx~�P�8{>F�<�V��:�����N�<�ؗ�6�d\F��9Eot��r��=FeJ#ٖͮ[ml�
g�KLc1R%��.�0Tb�T�|g}�r$�M��6�S�����4�E!�t5�O�2�P�l�@��q5%E&i��P?Fg3 �.�5���<"�H�����6��;��LP۾�[�7��+Ǵ�6�s��t����Έ�!�^����A;Z�d��G9+͜P$#�!ԚU�n�C3x���V�~�EX1��7�E
s��lB�K�!��쇙2AH�	}�S�ѭv��]��Ƶ��0�&B�L0���S_��O1�]b�"(���)��>rn08�TZN��h��3JP�Q�K�mV#l�Q�
;�v��[�6���Nh����_N%P�gT��#��d4��Z� ��64z�� �$�
��vP6���(�N�]�<u(�e�_�$�3�):=TY�z�o��4Z_����,X����t��_[B�j-ɜ�	"����BQ2�D�7��<��R�`ξDY尯��1R�5�j����LeI+�**�$sK,��-8i�{�OKu|�c~���.�"�[�Tڪ��}W�e�Z�t�)&(LzC�̊��:O�@ΈC�`��w��P�&ƷJ�|�KM
g��4��N09V!��r~bmH|�� 'c��`�7	�_�]����C�c�9wU��.j��{3�, 
iv"%��LJ(�!lܯ����Ker1���4�cu����̣��/&��J��Y_���K��Kfɩ�_� 6���Z��;⢍!��6��q�]ke�V�^7����ә�#u�\�#L�	��]>d����A�����u�!�ᨃ��&ya���Vgcˌ�l	�����I:���up_[��C:��D�W�馵G��zx����aǔH���›Z�b���^pޡ�Q^4�VK@6Ԑ��l��8՛E��M�w�ɥ_��aJ�V+u@�[_��x[P1�W:�\�Sa��R�P��Nf�A�M����*l�"�v%�Ra��d�$o�X3�8�^�U�|nC2�
Ib�(��N����!�6}NTG�n�
�l-��َvz�9�W��6�$��K�6E!bf��TA�;�����iÍt45/r�h�"�b�(�StK��Oڲw���P�-����l��;��^b���@s�n�듌�jj亾�B�lM���U��b����$�%n9��Upp��D��_
�6��G>PJq�:������|��5ꈶ����F�=|��s"��:g&0��u}	흈��U��%g���gi���݁����ej�<�l��j��_ֿ�Ƌ>gc��!�j5.�nc|G��؝�eTܤࣾ�mh�K�G���#��Q���Y��D�xˍ/$K/I:I�o��S:շ��K�/<aoG�_ܱ�Eg|qoCu�[`�-����Z�^�)�u����;��{c�B��[�!�i�Q��9\%B�y�MU������BLL�Fh�D�����"�.���J�Ұ�Tb�߾5B7�f��7濗�T;
f_�@�l�ldCUQ,P@P$�-��I=͠�|j׿��E���b��Ngr��+�q�=��1�nQD�Em*�v+�`k��+%Eڡ��pm?V�/Y�y��45��/�Y)ke��>:WrM�ã����j�֪Т��(饙'ej;P_���}�u9��6܂I<�"��~�iM4&\��0a��D��g8Z ih���B��a#�ϖ:��ܢ��W��̘҂��h�g>�i\O�
:�����^�!�Y"���X��\/RG�	�#*�>[<�
����,p�=�
�
ha�*U��z��I��4�۹g;��R�F��#UI�d��l�I�hқ��z��%w�n�w��}}���e�a���{l(���!i���Z+̕o�J�0�3(�ۑ�
+X����=��5�r��!��?���b��{�w��GU�T�&"6Ϸ�x�_�S���cD�+Ǚ��6×�C�T�����:���c⌓T�9�,@��k��CI<���K��H-�}t
���vof��5+C�v��a�_�0�o�끿���m�߅�w�\&�[�[u�R�#�*�ŴD�Ώ��4y4�N�������s��h(�埝�+t�}�m*��?E�<AhS�m"��P��ޖ�<���1�f�'���M���tv_�y|���y�� ���w�R��s�@B���o��.�&�߁�x*~�p�\�M�fK!G��'p0�P�L�;8�Be�&YZ���&ŭ����._TC?h�c�
��,[aL&[&0_�}�3�(��6��R� Z��cb7c�����^��}=3�-�.����<d���Ƀ�أ�ĦyuO	�B�r8Ti�������t��
�%Ƨ;
5��Y�NJ��3'��q�V��%�����Qf�9{���x�s�T���������ꦧ�X�Z$�G�G��9z�SJg���jE���h��K��N�2}^�)\���ӱ���#��H�
�:+r�A�(��K������Q���=�������!���F9�)��5�1D2�4}��X�����s���,u�6�MJ�ׇnR��A�n��:b:Q11���4��e^��p���mk��o�t�wL�\��Q(Ǹ�jꤧ����ƻJ��󾛞v)�*}��Ư��<�NL`p��GC?�jn9����z�&�@��;����K���tTWy�[b�gl����R��
��8U���M�*F���tu�C�F����5\CY2T�&��j�FI�
˽`�Y�b��g�q�,�Q�a��Z��1�4���F�]��+�o��u��[� =g�J;��<�B�6���÷NC�Q�VbK���l�������v��ӫ7φ;�o�9�E�p\>��W�6Vj�0��&�-��f�c��"�tl��J
�%��Q`K!v����wm�b�ow�w�+VEs��,_-jR}3��y�B�
[@y��fa�_4K�I����wE��4u�!�Pv����k9�BL�)��'���N��
�o�
��Z>�5�5��C]�� }A>o'L��H�Q"���Y*��y��|,���q�?��䲁&1������J���r��lC2D�#�k�w�#�TV��\|HJ�S�M�C�C�m ���u�%�;Z�Ph�ۄ����F��(�S:�Ă����D�S�:V�b�!I�va0�3
^�:l��x�t=�_��ꢠ���Y��Hs��8���t���ў�����?�L��<�
�$��[�+��Hw�V	9�ih�=��v/x�	�Ez�����apJ��_:�H
SJ^���QB�Y�ֲ���lo��ҫ��#�;��W�:�����U�`+�D����[&��s�er������\�͂�r�ig���>E�>�ݿA����h�Հ�z�o�.�"��z��KP�sz���u��VM1eX�a�`��Rj�ԷF�`�}ݷ��"��Y�D�OIG�Ȱ��F}m;E�d㴊�{!mb��>����{����y2��Y��'�Q>�*���"[�a�L>r��<��h�@[�2�6�x2@�Znp�ZeL*=|�|]�V�1�f��f����J�a6/hqc�W�J}m���Y�!1�96���a���#�0�nI��LRhAs�aS��8	g�;\�\��k+���J��l����>��m˔֍iT���2����sL��[���}sO�
W��k��=�Y���n˾[?l���p2֍��lzy���J�9l��avVB��#b<J�V˂�a���ihuMK��t�P^H_D���߾��{����u��G����	ߧ)T+}II�[T��\������I�(���D���׼�ukmJ��"��^����h��D�_��Q��A��A�?�r
4��p��[�G�p����4��1���f�ќ,�r\�ͨNQ�J�n�F�3�YJ�M�q�Mϧ~)�Q��C�i�5��Q��z��Z=lea����1=eu�����hji?dna�n�z�r'�A���E){e�1��-<�&�Ca��M[fT?�9��r��*,���y]GI����$�74�i���O��tIB��@�r�2�I�I�v��(�!I~����/1��C��
�_��k�2��Y����].A
b����ls
At��ډi*��e��~V�XFVZ:N����{� � +���l���޷�
�
V��&�H�Ժ\	��eb�\�N7���Ļh訆*:�J�r
��'$�$n�*x����'��ȹT-��	�ʣ��,Gc��b�b�W�b���j
��x���Mz�"=Y����3�$�Z��̢}��J*$����HB�QC���y�	Q��EOٽ�)�YN���ݦv�4sZ'JiT���\7c:��A�&�&t���y�bb�ә��$�}��K�
v�6κ�N���^c?@"�loo����x�H�!E!��`&b�7NPB���A}�mT'Q��I��~�ew�x�B�:F�h��u� uSC#fF��Q��d��g��|��4���9�����o����䝷\��IZ�s�8I*�};r����ޞ�����/��3��3
g_AG��|:���$�F�U	���
Z�ܲ%ɠz
��$�`��Q����i������Ѹ^�8H��9���[�������]���y��	��'B+�-�����G_|�՟���C�E�
���S����$3P?�x�V�A��Ϥ�&����@5�q#Ņ�Ȋ'�tqQ ��v�s��yYq�V�7��Au�^�*�N�
��zdؗ@�Ą�$�N���7 ,G
m��\�퉦�;���L�#��������ߏ�1�ڊ������_��1�Qy9�]ZZ���*�r�uV�K�/Q�]Q�l@*�Z����Z���J)�%��f[��?-��1���ު�h ���7#\��k4�Pz`^3���Gz���կWh��Ѫ��@HG�����2�P�mL��ٚ�Ҙ����4����m�3��v́5���tpB[k�E)�U췥ue�m3��+�'�`�&����T��� �KAbu)z�,�w<=O36�/M��‡Fx%��wˑ�K_l�<�{y�4�RŲ�������몬H�V�ۛf-�if�փ�3�.�g]���큇X)�3r��u��nkM"�"��Z�D��Q���Ŷ�E�o�;G���P�6LJ�N����{��7`4�:,�B�i��]�-�l���؏�؏��j�ɀ��kzY�v�Y4nǽ�1r��ŋ�;o�	�7�UQ���^tޞtXO�3���m[�!�d����Z7�·�*�*G��(j]������'�qЙ�VD5���:�ۢy��L}X)(ꨲ��3�k��"��BW�}����&�k�z��zt�kn����u�����E�@�n�`�R��C��=0��h���W�(A�eK)���#�㬟W�E~U��760��P�/cxln�n@
��N�h����< =�[
i�6�x��������C4�4ۦC*{<^������[}��|�E`.R��~�H��ጛg%�ь_�6D�9����}�\p�]���%t�|�rQ�Fr��H8����bA�U�� ��>sY=��:�8�����2�\�6��{���{{�nl���ԁ��{(�e^���aߡ�.Q�ʐu����ME�9c��1ͣd�؄�1��,�g�#�P]Y���s��H�=ipϰ�E�ɻ:���NYR�G���wއy��rW`��^$%%g0�RJ��m1<� �K�E��q+�c��|�9z�?���񃷃��"C���ص�$.��������S�9<x;�?�����g݃fO7��m>|Hn5�eR�N�+���:�0� 6=��Ϗ����y~���|ާ9��_��[}R`�E!V�qR�q_&�_O`S�F��Z��M��ⷝg�=���|t�������������������zJ���]J���q
A�s���c���$j'k*�s4t�!p�ƍR�Qyu�E�nH-Y{@q�
�����nr`�~Z���M�������0G�F
�lg:�.�f=����c�`7v*��=�����B
�q�D�������u��>b���<
�.k��OP�!�a��B�ű�l02@�"�8g0����T��g	�K��{��6nda��=�N{6�&-�vER�,ۉ���[��P
O�lI���MZV$�ok�R@�I�K�y�3��n�P(�B���o^��Z���{�?��h��t_=�~T"����a�|�]�\�t�>;ć�ʖ�
���$x�@�_�g+k�g���ܥ1U�vn��M���c�jM��S��#�.�=�iQk>�y�v��EG����{�
	
�~w&߃|�㸧q�����9�:!]
�n���M�	*��G9C��"D?+���/ݾ΍x�ٕ�z����1L~e
���-��=�]����_�gϐ"�k^�����f���.��C�*U�UM55vs	</�
�5�`�Xd�p9�;l�Q�� ޙ���C&
�	,QF�=(d�DH
�b!�p�^�^b�3���u�V��UQ)�/F��oD��� �F2P��YNV�Y����630�;/G|�m�GT݆�_�P�c�8�Q&�^9R�C�Q��=)t�\~�@%>1��LĐsծ�l[pJğ�(�������]�g�����HP��<?pJ�)Ryv��ggu�by��`����I��)�
��{'Q�ӻ�Q1�|R���A��h�ꪖ:c�]��)7o!Ѹ��xČ��M��A��P�p��W$s�8���#��:����v��vtTY@uvQ���H!d�-�O039�LPY'�)c�=�U���U~g�U,��EQJl����1<��T΋��˳�5����x��yX./2���(�;�YNʢ�)�8ȇ�.Ǐ��ʎ?�Z��=$,8#����Y\�O�N�ׅr�WI�,�H�I\~�rZ�([�j$G����$�|�A2;1cX���킒	��t�Q�̶^��,�l�%��6�mo�{�+7��ʥ�[oh�ƣ��p������_<�@��'/v���p���E��f��������N"���q��Y{@���o^Y�+�Z��JNWM��U�s8:��{�H�q8�&�)Yq8�Yێ�2n�k��ծ������P��:<Z9��W�x�gez�
��C��x�f��0��t=m�����
�*~���S""]ktt�����%����h����a�w�9��+�0�T ��Y�#�8���-��Tu���d�,]MQ����=���I���������-�<e��T���<׿�*�U}mmG�����%�DmJ�9jf�.	m���UJ���RZ}������|�4�8�|���*�����	���OQ�mF�ςm��P�ђb'\�dI�)�V�	?�M��g�Eѥ�~�����$D|Ӭv��AE�t����Y�Pp�$��6�`^]̏��m%E�ӭ�N��g���w�Ж[M#��^��q"�8�>��<x��}�J�h|�U�V֧�-�\&~Z}�3Y�~U�w��^�g�G�+4�ϯ��߰%s�kc��P�
E(�����4���u9��t����fr� ��߀����T_���E�'��i��;�܅>m�U}D��N��k0�0�rv�׉�T�j�&1�LIj��y�T�~��E:(z�?��Ek#z�0�������g
���&��o\�A}�@�V�ZB/�SUЉ*��t|YȐ�?�{r�<����o�C#ư�IC�(�Z������h`����|�s�c��{��{��C����]!���빗0�51�kھ��\:��V^_忤1��ʐ��-��vςF���%upz2��-d��i��/��Ղ�6�.��?����]*��@*�?Tmo�M�
HU\)��/M�;�UA�e��Ց��/E\��i�^���Va�ϣ(������6U�>P�Ă9l1�D6�5����\	�
e��G5+T���߸	���pvx8=<�7������&�
�i���RGȲY.t�u���|�dE�ϑ-n�$~�B���=E���(�z�joG�SƇ���>����3������gn雀t�;�E�
Ě�Fq��pǮ���J.������f ]�?��%Y�^�^+n����A���mCU!��4m��k7wq��ߥi�V
:l���
N.�,���vOӥդ�qy[Y��{�H�'?���y�b�r�Pg\)A�`�����$f�o���y��^)�s���ƃ�p�Y?�͔%����% ����鿑Ѩf�19�L�����N�I��p\x�أq���eDt=p��?�i׾��1�1��,��F]�俥>�
(�g��q0z�Z�4#�KS���Gح,�j��d�_�mIeN�,���"Dc���>��}fK:㤋�T
N�{���h�ib��}�gy���.N����e4�jht�ȫ/
}��m����F��#�]-[�?�`�8�)l��Ē���8?�Fʚ4#�Wh��פqP�'�+/���ZM�Swww9��/���1G�.���s*���=6��ԕ�煋*��G¡M,%����j,_�໺k'�=�sV%��
��@��F5�S�'��v�Q;b�K�d0o���2��y�&�ce\4�l4]Dn�2��G�<�>΢Qի,�ۏ`�To8���.uz��}���)'�1�bx�K�^��&���G�
���e%J�@�N��H�`��#ZIM�8��$R�z�''t����qfT�js��[`�!�	Ȅ;Q���w貏�g��qR��s(�3frz"��H�!^�mQ�j�]�����sUw�|l���f�
���i}�Y��x�������"�OΓPGy[�D�pWY)Ɖ��.�amu�J�<1�}��1f/1�ꔪR�����&��͇p���J{x|�eo�c�?S�V���6�1��DŠ��ōNW���~3H�8W�F�E��J�~�[�e5=п� �s%n.b�F�z9����b�r�bQ<����T!�����eF��s����v�}��3�ox�9��`��Xs�r�qoW^kα�#��v•��Jf��hz�1��R��>�k!LF�Z�v�g�Y`㵫W����t����ߎ�I�*)��\Fʩ™��ᱲLJ��5&�1�;��$\��KŐ���A���DAͦ�H�uǟ��7��XY7�9�G�>f<=��>��P)�Lh�E?D��0�t	�����v���=$���#_0��kcО�z!�a%�r����A
��"�i6�n���R�� Xa;N��0�T�B�+@�:�&�R��QY��l� �J�Oa2��9�hz��{8b��WӜ<�����x�H�S�5��&�}�
F�%Ru9����LE��H�1q�&�]���|T����ZD����1Y�X������OF���Go�h�:v�d6�"��M�l���f�Te��n8~i����躿�Ĭ)�Z�iP�4z3�JL�'���;&f�V���4~���:Y,ydg%Vm�n�xz�?��a�:v#�ަjU����'p�0�b���Tؙ2A���d�P�(φ(!W�~�$�β�YU��J�	p�QN����^��J,
1�����c��	��(n�~�vӞ�ho�(��0?�3()�X�1�Tp���d�W		5���9��/�5��GG�g�?W�r<$�)�k{;�(�^<�rZ?*��$ď�y��3�mf�
��󉠲4���SxxU����n�ܟs_7��5�D�a�U��H�B��Ƶn�}^]Yo8��s߯*0������P�u9��7����f��^а�T�ז�ơ��$�J�]>����B��'�.���֑&U���p�ͷ�G�F:D�P�����RR3�̒��Y�=�w�S:tGmg�����H���X�tjXqt�4Z�Q���>�C^�%�k�5���J�w�U�Q�6額�<��`3,[������M9m��O�}k%c)�%�Vf�^m�r����
�k�z��tO��B���U#�lu��/y����ٷ$��Yx;z9�_N@yQ$
s���8,m8�����@I�_�y����#G���nyV�A�����F
�,5�,��
<s����*�G�Lof�IB�MN��^6=�Sݽ{����=��ThZ����Q�����ͼ��n��*�y�8��zu��`�z%���*��\&�җjwݚ��ź����P�n0+"�jJ��M��C�P8*}%�s��f��w��
��y=Ē.��).?S�	�)r��i�q*���iE�S�bU��^�@&@��y����4r�PP'�t
���(���Mt�ذ��;��b��_J��Am��*�ق@�Q�Rz�	�<͋�����D�;H�UR�i9�j��1�:�����}�2�ۑ���d�5�]�c����5�5V��7���b	�m�J%a�[���z=�#��F[���'���%���x���iڎ���K!Vz�'��Px�ú�_C�=��ϼ�/.����j��Z����m{��?�~��
��$�f��*��B���W�]��+��{���t��U|�&���xY:!T��x�*ඉ��܎]"�]d:�Km9_n�|�k���|-*E�`<:E3n�8t��9l�+��?��|��}ǂz(P�T�vA.?�S��ѵ���ZTk�I�}T���\C︵� z�l=l}QV�Ean�l�(��5��ߡ�j!iW�<}9]]5s�BP]�VP�v�t�Æ�E��?7����[��m��m9��=��m��d�pő�#��6�V�EXhk���!L�0�*.*�VЃ�Y(�(xk�k���)\q'עN@�	uh�?V�`t�V��	�U45�R<���^�	���]E��T5-�3��Wm@��T��G�.|�� ����f�x��E��8�;��y���������
s���<��V��L���-�o�4��4b�l�Z]!�{�I���BN���Q<�+�l�qٲY�mN�=��0�u��w��B�	j�,��(��"�����`b{��{
Ƭ�BH:"��Z#q�*�(_��0li�����B��v)B���]ԫ~�}�I�h��೨��
�OY�v~�k�a��]�e�C���j����t�����`�z�i�v����~G��=�m�	I�O>����c�$�!k�S��ػ5Y�ŨhO������Һ��f����������eJ�J��J�,�-+��>���@����B"��
��4˂�Ӭ{�	l%R��CG���5��|E��;P��./O����'��׻/�{���˿E߽~��E�x�ǧѫ_��
�w��7�����/��B��.βI�Q)��7�q���h��=�~�9��/ov_G�?���w/_D/��_	j��7���2�ڤHe���J��q12u�U����ˇwdQKk��ķ��HxD=�~D����:�_��J�F�I�m8��fc���A�`�UV<�hjf����	D;����tʓ����@�z�c�莡�pS��� ��6<��P]>6�p#����|t̼H(6���h�#5���jN҈F���4jm��~����D��Ѻ��?ZO���r!^	Tsc]�3���n����%�+o
ޣ_�W��0\�qU�F����i}��`9��N��9#�-��@E#�p�]n�87܎Z�҇�$W���X�<Z����S�,�l���$ʏOC4�(�L��B�`����.�:b6Ff:F�|��	�4���6�#���K�
�݇�"�!RyuK��(��a�T�2�4�[��+컐�n^��V ~���m`��=%��sN!�6��b���I��>��+�4�.�m�OK����0�
�o��6X��0�^H~R��´���;�دQ�!
��o����1����i���$Ԧ�a�.�*�%�%�py�Ԓ�ֶT(-	ϲn6���X|�S�{Ѷ۪�e��.c��)D'ڗ$xm+Wm��<�'?��r�p����]N�*p��Fi-8�֖�$�F{ޭ7��C�[��Š!q�\�^�R���]�ǃVta�~�(i��5O�11�_�"��@8�U�&��
b��
�0��!B�*�J����8Az C�u��t���p7�}g��Z���zh.V�������(��"Ҿ���zt��t^͆
�
�.�Ù�2:�{|/ōR\�:c�rK�
E1b3�G�RE��Q,�h ͦ&K��8;45��?�Y� $׍����p��0�SL�:i;�7�����P�}�YYA�J4�ttF3�=��(}��t���X�=��&���.�_���h*�I�J,'�3b�ճ\�M��J
��A�h!�����?���§R��/��Ї+'^9��%C����U�Y�`C5�~5��n�JU.5�̬�B�j�b��{^8TA>I�6`�Ќ�&�&��?��qɘ�QM>ܣfE3�8��P�B�����6	wU,�>T��\�`��>���f�py,��T���
,r{�o���ѭ��^5�Fh�saܲ�a0��,�¹���m�������_�q�|o��ք[Iӄ�������H�+�	Kk�(0�MV�
i>4d�*s�4�L�||�KI��ϳ�<��l*�
�b�Xa�Z��
��k��$�&�Lr��
*��s����9�
�{�O�'}m�I���?d}!㱡J�p�H��ce���P����h>�9�,9[^�E��f�W0�gv�L����IE�Ө�)na�d��o�Ul[�n��kr��(��bt�o����ټ���!	`��<��mS
���mIjQ���Rķ�,<���w�&`[� ?��P�m)�R@q�I���w�3��l��T�KK��}��K��x/c��
�EՁC_�g���r��:M��ވ�#��n��7d�N�*��S���-ͯ����L�^��2�%6=��V2�y�9��.�߫�-��(��8z���iN�Qm]d#r��LǓ�";������vy
�QК��k5R�k���	��pDъ{p�P�c'
(�|;�hz�]������BUŤ�/�`1�U�"ƶ@E�{!����4`�/���;)��r�U�p*����
�
J@,�#l��A���P2�b�[:+��G��H^�h
����";��Mr�(���V�c���W�3��Rٶ�#i�4;qHH�
1��u�)ACPv$R)d.���ऀ�%|#���	���v�Љcf�{x#�:��1x�s�Ҁ�
��Wwx��$�Ӂ-��� @��V@��&a����o�,��6�K����o�!cHK�M��׆g1?Fg!�r��m[�t�Nܽ,�:�R�<�4.�2���a�".��lO0�6ʂ�I\-;'`!�r=�}�S|k�,M5��2pճ�)[����O5�BoȼȖn�.D��"hw�G�		5o��K�j��U�]2��=�
S�74�SK	�bP�Ȟ���³�`O����듪8u��"���0��[���܈�ʔEj�r�ڴ^�9���ŽeOA�����I��9e�9�F�,�ߎ�=Bg�R������4
���׹2�+�B:�#�c,����t�Ilі��F������,��Y@��ϛ���"���[ƥ�ŌdL0%��v���c�Q��1���+��nV�,9&	��	�T�VT��+�C�E/�W��#�m����M���Ο�ޮ�G�����Z����yw�̏����@���G�X)��X&`$�m1�b<�A�nK�F���K�(M
߰8���*m˘/.xH���%��`�.'�3Y�88F��w'��
Yje����épD���Q��?�Ϣ_�8��m�z��<��V��@�PddAYw����= ���AzX��@\�Uv��C
�>E�p˴6<|�>�@ŵ��¯�Zo5���[��Gt��p�W_����3�D�]ɲ�x}�P�<y2ԝPW��~��v)ԝ�'�����M�-�kE��F��)����"���/��"�����Z���z�s���*,i��D����*��V�Fu����e��G2غ�n��-�F�G�2�*�����U۞us?���l�HSSB�����DɭSƂ(�p�.N�du���yr0^i{'р�|�MhNj@�;��wA�j���W��n��ֺ@
�e��|�ZAL���H�M���	;�Ѐ���awv0�,��G^�A�ʭa�W<�*�k� C�n�{��2e�p���oA7ʓ�.A�M�)i^�'�9�+��
�
��r�G�s	Ř�s�C�F���{�����L���N�K�h��09����8*m%���<͢Lو�XI�8������(N�q���՝Ap�T�		��D�|3�Q�*�;8m���{�Ħ��^U�"�yQ���k.܈Z�pc}}��B�\p������DO�;�sh�ş�(z��/'����������K?���+�5�Ź_���\���YT\�|u�Yq�U��)�C��V�b�w��|0@2R�}L�?>��Oj���V@m=�~�5���?�|BX�
�W�����,��ɱb6F��ѥ�B@}�eI��yaP�7O_��
���\VO���aP�0ϴR���J����a�*Al���“���~�"N���E��d6�燌��B�9���cshή�	�ͼ�\�'��Xf�`:ī���MU��7~,ZQ�סR�?d��0����<�i��
w��(y�ž��%�=Jm�I\�oo[ɱB�[V:�u�([�����]t�
���tɄ'&���͇�6g5X�VB1�^���5'&��¦�
��ռD5#��5Z�
��aM�Ί���x)�1���J�%���/�Yы��;�P����k�q3R���(�ė�=����dU�=���R�����B�|F2L�T��#p:U�#U¸8��s��v���vjX]���
���>�a��^�L�=�%�`�)S��*1\t�X�&�з�e/�E0�fț>�UPe:�ձ�}_$�ͪ�8L���gӕ��c�f�t���ENv�v�y�n��2�76\���KZ;#A��lm��mm҆5A�,v����MH�g��
�+���'�B��PTZ�Ыp�B���sڴw�&OJ`'�r�j��TǛ��z��-�&�2=Ԃ��t�q�:>rr�
��H���uiQ�2
?w0���m�G)�.}�R@_Ĵ^ێ<eve�-�)V��o@��d��z'�fx|�+>��8Y���3{㴎���I��ŭ<7��`����H�<G����!b�Au{m��7�#�(�}����m0'�!�T�@+�M�0zD�t2
<a��*�.[Pz3M/�io%E�*�)ԝf�R s�)�W�Vn����']�	%�V��F����A�^��1�\'�w��%���
�^�$����(U�@�/�J����
��$�>ZJc������8nF��o׀���ʀYT�P�7��J��s4���7�)�:~�v� �YJ��3Rϡ~j*��zD�Ӷ<-�\�h��ڂ���1���9��8='��F�k�›f΁+�0�.J�~|I����cR�u#\�l�'?��4܌��4�	R��($�����¸
��C;�]��
+ �R��Qi�*�����U�7�0�� �9�Rqێ���bJ����ОL�Х��o�<ڿ�k_�ݰ�	�|���:��3��e������*�4�TQuQ�J7e:�x�L�3(�'~K�U�g*Yʂ�y��bYOGV��W>w9Ղ�*�E�`�/��$����Ğ���ߎ��~�LJ3[�d	�yЩV�C�#Eyx?|#O�%Uп��_��
�����������̵k�

�]VsI�N��5�}�㵇ޔ����r3���\���^�|���J�vꋓ� ����V/�@C��-י��}FL��h4���9�D)�b�4�AK�[���0�QҖȒUY��ll�cW�[�0�-�{6X8q-0΋o~v��8�m��{CyG�$]
�6���1W�(�1�z��kl\���墭��f�t���p4�[{j$oB̈\�Z�]|Āan��AQ��4��2��]�i�7��Q��,��]`#�5YY�$��DŽ��]Q��63J���
�1)�j�w�~:ϋ(���an++@�?p4�ξD�{W���3�"r�F4NЋ����
���@�&[��c���/Q�&��=�+�&E9��L��|���[�QTpL�9�9�n7Z�p���}k�N7˝��!>k����n���$��իY+��m&뭍�(V7�C�nc;�Q���SEDoE�����:��oН*�`�P6	D(8��4o�R��(�+�#�O\�{�F=�W-��u1޸��L�
\�XZ�{�����s���
q�����4L
�w=u!�GY�W��vьYE���7���j
Ьߗ6�^>�地Ѻ�Z��0V�G-�NV�ྑx�a��h8�e�m>R��ׁ`�z�5"	�
�J�OE����h�X����n��)HҐNmk����h�r%a��a�����e=<nn��к��ȕ�h��xŅ=�
W��?�z��5��|�5;L��Vo�!�Y<�u��,=N[��|P�r����1�4���F�!�C��å�#��z٥�,}�̧ߗ�Ⱟ�����c�g����gi�=�7$��3�À�5����HIZ�L�%�i~[:H�2��%��4��fZ��+栀�h��,;��g�2,��l�qq���Awǃ�p��CR��}��`�������x@ƨ���S�r<��IF�7��uGYM�TS�u��,��Kr��l�UѦ�����f.�.[������	_+�}>7��$�S�s�WWkA`�!�޲���
swc@,z�6�A�H��7��:�c
y����&|ǁ��-i��z�%����i�B6o����9N�J���Z��&.qu������٢zh'���V�/�(�y9��oI�W~�+���O��OHݓM���	)")]��9�G
��^	���OW�LWS�RkAhʭ�
	l�8�~�]w�~
�pw�A~��܊��!ʁ1>�|�"i4F%�:�E,Ϸ���hq���ԲªMU�ĕxno��`L���:r�֟��<9����%�#���k�h�K���q	jr���UnoPS��;ΙȇEa�3�Kc%hk
�?ێZ�Z�}�֥Qʼ�'���pV"�m0ԫen_�k�B�,<V�yv~����ː�F<YY����w-�j�E7�J�p����x>%�G����Fݴ'ĩ�ji���`��$ENz�+m���#$0�dxz2C�}��
!u��ͧZ�MZ��Ϩ�e���Lf�Q��"���Z��	L�u�t��l�Y�(u{#�m+f�$fV`����'vd&=��5�zR5)ό]�m��#�o�����MP��a='`�VV_�hM�
[5�|��Ǎ�`��4#)��H)R��9*�S�����b4T��x����w��0���{{P�t獀H{	�2�d諕��
tA-.ǹI|��,�A:��g%�b2I��ЖD�7�F����!�?l ��{�'P-������
x_���Ii����1� ���驹����T����4�8)�m"���K��S���<Z��T�_�p6P�ag��W*n�l�ޤP��� �7z�4qְ�����"�c��3<հwTŭ��Ɖ�ͼ_�����ӥ2{5�1JM��.]`���C(��8#0	[�7G2B;]��arT�Nk|�~�ve	N)�Hի���E'�=�^�a<|��t�{?Q1������|W3�3�*�O	�/�Ёc��Q�VE�3��_(����pڻ����-mF!�������Bj|���e<�8݉X��&�&����S\f�XWzb,_@�D�"�b��@j��<���<��b,hU}�(l~�7��h���SF/�N����X��]3Fw��w�iܝ�G��@K�8h�uⴋ�z���������ƀg��M_;�wa<s{cx�(�
o�~PKZ�)�@3&@xJ�@Feb�jG�</-v���E剱=Q������?:���At�@"(�!�LWo›���8�S�K-��̤���	o��B�;����P�[ɫ�n�L��*
���H�)+���/ҭ��|�RO�<��~���h�<�z��~�dd�}*���[��R�lPM=�}�T�f�l+�=ֲ���/������ɋ~�/o���+/�T�
-�.��I$�B/�C����i�x�
N�r8�])������2L����C�5����������'�O��F��%N��u�V���v-�����'��*�˜)���*K���^�و��X�F��$���"��Y�
4�-��8��x���w���R�X[h$��m/b
H�	�Es����Vб�L���G9��*�����s�21!����
�|0��(��}��fL,/�J��:��ΐ2�S�kd�B_�y+
�D�9��BA. �s��h�K}���M��޼�d�~��i��uF�z��6��8���f/`3^��r�.�}@�ipD���K��c���T���k𪇲�q��ڻ�m��ؚjoL�9s�^[o�J�� ��6o�qg��6��XI!�,��<ʵ֗��YL��_�Y`��5��s1���]���N&#�F�fjw�K�8����u<��/t$�Ց�P���Y�o�C%�5��aga�o�i�~��YL=�ǰn����,HIv�|BZ���%o+�L�t�M-7�% �ף��(��IՀM����Ս�}=l,k�g�~�K?
�W�%a���Q+^u���[eˋG|5�����I�|?��U��u=ͻ�8���N�ce�BQ���jV�Gc��B@L5D��VXfQ
��YM�}�������,28�9�x�҅j��THMb����h��p���v���hm��VQ�EO6�@�q����_�XS�>q�*/�T؜Z;S͍u3H\���X��PV潼�@�)i����nӾ��=�GX��J�ϧ�C靋,{�����M.I�0~M��O�,�V����]�N[v8+�Tz#�%�J��g�EP|ԫo��T8�ȃ�ܙ�88Ќ��f��%�ܥɖ9^����D05�V%���I�W�����w�Ǘv~�c��$6[�#��ԗr4�d�9���r8?T�7#R��>‹I���c�sˉ>2K�7"��Z������-Q�@�\��iq�"'z8g9W,CU��Vb(��:�mK�B��"������@�`/B�$�C0�N^t�I���^g�S��j4�w�R& �+6��B�����
/������i�d�ٚv�v�LJ�8��ߊ�3z=�ݾ(�6#?����$A
Q���u��y�=ul��y�{n�*�r:��HmK��av��1�����2���Ŭ��?�4ܜ�9����@�Na="�n�
`�0&{A脇hfM��6q�����9+��Ì�,�n(*�
��t�h�3��Rw�6��x0Ȼ:*�������ᰨ�=e)Z����]ˀ�c�!"B��X�A���_3>��>�Gd��R}��b���u�$UU�(�FS�*�Ŕ��ž�Y���o����+�R_�~N0���Ӕ�����L��&���̜'C�Ǖ�%��<ֿV%]�i���M,_���#�h��0��80~�ZQ����� z�����wZ�����cTl�1��)��G�ڢG�V���}���N)29F�G3�HƳ�x3ʚd_���|l~8�JA�*n=S�Ih
ܩ�0>�ڛxOa�8NXP�2��
���(T���2ܵ{$'v�2g�b�f1n`�AL���&e@<3sO��	��	)��%���8���tNv���i���Ө�Z�S����r4�����E8b��m>�ި��M�Z�T�s�M��Нu���0^�h�n
D�!�n�9���W�8���sʎZ�q�)���<
x&zZ%*&�Q/E��
Zh?��ւ��^4�	O��k��nC�or������m.��$���}��Y��@��-Q�)���7v�4���3Z�v�1%�]��_(|��(r�І"�y�����כ~�����A���^��U�bKy�R��浿�j��HSk�7�oܿJ���8��q7�<�''��XE,�7V���,fz��^]�؇�-)�*���w�b�8)1�Jz-���1�k4�VW��<+0�œ�S�TJ�֝��_W&��|9�;���@�o�8Qt@�7��p#J�hYs��<S�H�}���Jݡ`�l���M���\���8���iL#�w�hd8a�.N2H�x4�����KK1�(Z=F$�hb�@�}tnP輵.BX�'�2ϳ��8DcX�&����aѭٟ�)�c�WQ=�0G�z�9�G���&�#�:4Rhx�U�g.:
�d㤥V��C*p���WUEmzM����eo*�.��9�nj+ ,��������S�O�-<���j"�;6�a#�:`���#�GVu3�bd�h��x�Rj�|�xU�5“]J1�����:�
k�K�⌿�l�{�N�L(c~���q0�?�a��EG��Ԇ1�f��x�4�p�#*0�*���T�aC��$�R��3�
�D�!H#1�&RG]C�(���Q�|�/Ͻ<v{WzHn챉�
�s��<)k����5n�"��\�n$�"��)?�Ԝi�u��6q3א��XeǍ5͍�xX���x3Fy:���}&���+o۾�]
���1��1��������h�(a����g`8����
Y��3E��X�m��2�:މ@�E[�$���N�u��p0�dl0rX�X.I|�q��
�a�;��B�)����H��w.@��jw`((p������A��a��(�t-,*��Z%	\��d�2w q��n#+l>
�	<یl0�|ԓ��w�F���y�f�'qG�C,-6�pk`Y��V���� ���Dh���+ڳ���|�����&�ۡ�&���x�Լ�j���h�V����?H��_T�Էh⑳7�Jz盏N�c�fT���G��5t�&)UW��QϽń-gdG
d?�`�3f�d�T�!$\��r,
W�+�x%q�ȥ%�v�M.+9�P��̸ycF#�{e��+�4�0��z�&�r^{'�G<Yx�pl6�$�;�an�ׅr����=�U\g/Оfߏ9Z5�,}yQD���:{W[��wnl�&��d�f�@n�m�&T5�~��1�ͷ�ѯpK���ș�r#/?���ƃ�y��g�v��ϭ����6��/��QbG� �>��y�����e�{����:��xP�9���W�����kK�a@��|3�7�i2�oUNq�r�2�x����`��>�*̂�Dž�a�� >��t���52}�`yC�#���K�5Et���"S~����‹��Zzo�/Y^�u�]�k���>J��{��@4o#u?��Uv��q������M�b��x#Z<���-d����Y�m�@��~����z��q��xv�/;��g�D[�6�`Z;\W���/ȵM7��;+7	�}y�vڭͣ�+��Ҵ��P�:�j�hT�#��Ϟ���h�#w"m�	$�ڞ�A�A����10��\�j{��;	�㟸���g~��S�GT��J�H`v-[�n$�D���<��֜bZ�$U�QuR�z�ZQ�����C���t:�(�j��3ő�D��Q́�4��i��?��<�1�Mc'��)}�_~�u(�5~�E��.�>=�|>�Ɠ_��l�����U��ʋ�����iH�t��F$�i�06UV�P5��>�e�����d�x�B=�NI��jt���2��i[=έa���쫑���	,H�Ɍ����%E�N��wuظA�|9�������A�]���n���h��⬏;3ے�>�	a�.3�`��ww�ܘ����&o[�9dјLY���Avi`88����~��
��˰��IN*�KmA���R�JV���s���+��k
�gݦ$��T2�O(������]) ���?a�t��2˽�'�=M6���9w�/L
%�Ү̊Cw����n`��S���ZK+?�A:�\�)��HY��7��V7�D����U^���X�Ѱ;��Qչ������q��Y4����½�R�*?!庫B�9�Rvy-SP�|�?�D�`�S��FE*<�j��;,UG�B��0����O*�l������ȕ
f���6�sLȉ�7V &�{��DJ�;�HTvY��)QUn[�R!s6�7�LT���<*�g˖{�����$��E�)?�g�FIy+a(X�6C02kI��n�b�,Iz��5G�s?�̥F�`�~����t/l<����ۇ��%<�#�����ɝ�#E[�����WLq���	�a]�*�L��</0'����h�� �5jh&���\�WC��z]J�^�/�7қS���4z�/�Ӭf�bq�Y�.IQʮ���B-�D0����~�P:��j��h��e!c�4����
�\^��v��z���QHܙJ%�z)��N�r$���s�׳^O_�QĄ&��S{�~��6C����z�Bӷ|���:+��$����[�`Wf���i�'5#�p�k֬٠SjQk$�uY倜hDp��)�K��Q�Y��
���`'�����
�,�kN磃��I)�z�jEQ�EϞE�Y�ދZ�[j���2�va&o�$��=5��0^F�@��|�S<;�[,�td1��g�<�a V�1X��Ȳ���;����1*Ɣ||��p�(Xyi�(|9��W
MY�tlQG�2�pl}	?6=�o���������ޮ�������/�{������k��?߿|���i��&V���3�b�/O���~@��i�o��K�Z��P����2��?�+2r8�N#ͨ�b�l�
�EV�yz��(s����Dt�����:���ڲ�� )0=�2'�.�;�0��|�&��Q�,/�ۮ�֍-���8y�cvF<-փ"��a�m�����،,��I�vL�j����tXoJobuL_�VƜ�I~朐򶘻Xޘ��<��ZW_��&�F�!/<��NΌ�`�[tE�/{P�B�٩{��{yF/([�0��W����9@Sӌ�	a�~Ë��/q30�0�xd�>o*}�M9I�+R�TĎ��?�ŮŝƦ�aM���SF��_�Ԩn
|�4G�[��J���[��d���߇��O�>��G�Qe'�w[õ�c0� h������M�Ge
���X���ޮ�'{;��NF����؇r�w�Q�VJ{ҵ�[��:Q��_n=fp�D�QK�,�%��4H�˄��:�@�����߉��gI���㛾��ز�����qG�8��8%�)�..���;�#Ru���e��z��`ۺ�3j^�s�
�S�����V]�Z-Pr�v�����{I�m�uxLg��ON4��Ce�q�2��Ȥ�y�LiP�Vg��/��RFյ�Yo�#��Gʀ{$�i~���f����.ݼ��}�,�xǼٺ��D�$��|�>��;ō	a(�Ra��+���?m4fs�m#K3e�n�+Y�?:׆ߙ��u�3>� ih!����1Ģd{�!�Vd��)o���Tz���ɠ�G1�=�T��;�q�|1�#��f�����0 ^M���HO��ʓ���N�d��Z+�EZ�9���[}_u�Qf5\��}!��KHZ��_əVa�����gb�6Q&:X����L�sa(�,tQ���2��N�C�˜:�8�4v1.7�B���M��ṃ�
��'���̪f٩h!��*=ay�B�V����L�481�,��’a�ғ��֓�c���¢�1[�
ll��f􆝇LLL��D'}�חKٯ(���s��Ъ�@>��)���u�}�s��ͨ��w��$�O��E9�1�Y��rv&�!�9�z{;�h|�ݻ��`
����|�΄�&<c<on,�&� 6�`C3b˦�I�ģ���p�\O���&�O5�����F��h�|�'��9K���2��(�Z
���C��Q�y���e�&���t����Ǜ(!,�|���u�i�&'9���y{0Vr֙ʒ �VU5h���d#�z+����������r[��l6D����o����>z�JrE�d4������ߋwZ��h=jE�[��@�������
�����*�����1U<�#���P8���"<����m%l�H=�]���2�H�#M^+L��>"����s��W�J�.>�2�hD��:R=�k#W�!gy�c�n�qpj��'E}y��R����3�����r
CAM���&%@�P���Y�`��BH;K^�ȭH�o-�5�U	lkK���9���d�#��<q��A"0qP}��MjTO�a�()����W�߶���-+��E�7Gemt)H�����f支A�=�ua�A��*J����D�f���#DY�>ێ*���>m
�˛ʷBӢ��+2�����
�y{���$��%�S��
��U]�V���#�O9m�#j��۵ZI"~�&�7�B�V�-��7,*�1īZb4��A2j�ON�]t�8Vq���N�b��Ӊe��`#%,V�IM��m��f���Og��m� �6��(�t7�R��t��w�?۔�hv"B5��B7����'�@�Îì���+y32�Fd��Ov�b�6����:�����ف����Ͽ�� ��#8ԼP�@	�g<%���d���m���+��z�^E�1�����M�����$A7��	<6ZY:|��<�(�ݼG�!g}(S䲉�u]�M��9��g]����xl�s �}w������B��&�#�R�
rN|�1ב�z*V����Oѥ�DId�漏0#�SHך*}En۱�.���M�O�N�u'�<j���lE�|b�q�h�Q�E�=���Vb)#I1e��xԷ�᨝�8�'��Sü{���Ő�~�hE@��S�N�D�E�UC�Y_�g�4'���L�M�(�dE�k�^k�N�z`
O~t���4����N����Q�/
��IM�oA�m^�EЕ���h><ȧCh�f�>�]Z�*�1��z�z��a'tw��/ ��ԓo$k�)a���Yb���s}�j�v]q� 3T]@\��L��1v��n��AY���}@��� �l��c	bc�[@��LPd�-B[)l�,�lw,t*�*d�r�j�ԅR�j�BX�UL��R�v�[���u�ۻr���$����@_L3A�\����ʦ]��3�8��,��m���0��Q|{<�����*k8��n�sijV���,R���pF�Py-���'	�;�o��gqn)�ʂ�ˈ�)9���#��
�l��t1H�Ŗ¬3��c�a�l*HA��
kn:�Y��������>���R�[+Ӓ�
���{��VP��T�B`�p��
aVh;-��r���Z�����ݟI���ȩĢ�{�6ǯ݋�P�a��r�*�5V(}�mXI>Z{p��mxV�66�V�}����1P�p�Q�+%i��v�Q�֠~X|�|���ȱT,�Ѷ��J���%T�����ZG%gN���G�b�gi��k�%:!WM����MU���Ԟ��,�O�� �#jϦT���]OЃ#р֢3���z{�p�ƝI�U��~��Bo�'4.�-��`q�(�O��ގ�l���nĔ����<�'h�RD�JT�ļ�Ӟ�m�w��	�eo��=ehiHd��vٹ�L�Xxh�Bx;����j<M�P�	���I��21�k-�T4~��p�U�*�)�Ȣ��88㇪F/S������٪���NpG*�/�jmUTl��D��mӒ�\3�%W��K~�]Xv�[�H���iD1��8��`�p�l�9����u����+���[.�;h�mo�_��(�a����w��T���U]( ,~�Lݶ�wjq�<�|S���G�K�c�����Kֳ���]ϷA�����M;r�I,?`M/�����r��%ͨsm^yf��}nuYe� �ijN�(�$�9W��7�V�_%�����\�d�WR��eeP�8
`��M����"y痲k=�jC'%u���ZGӛ�'�>�d��/��A��&�a�5���*K-N��l�����G��+����!�ywt�N�����j��Z\+E�qbO��s<7�1)	���T�5X��j�P��kq-^���uaQ��S�互�|�>:��JI��[|�cl�q//u�����d^�����^>���4���gq���8���4|�SZjr+�t�id��m�Z�E�n����$`��D��Ф�b�=T�~��P-�B<6L36`��	������^=���%��alUWm�~떔�_IEf$�)+W��M\�۲�����<`�+��B�3�j���ZBW"^9�{*�JN��&�i�v@a�lB�@m�[�|H�<�gy>x3@'k�	����l
��,�n���G�eɰ�*���Q#Z⍜?[t 
�K��1c^DT�U����#�UL���9t&J�����*k�!h�Ց�K�Ų�x/��tX�юt�I�}wn�q#*J��X�͔�)��FUs����>�ð0�:DW�*�0��{:�H��d0�A`�)��AG�,�>��852�8�T����Z
�b����qGt���6�ϷT0��<L׸]v�����5�!ÌI���i'u��7���c���Ԯ������3Ѯ���� ��Vw�v�Z{;�Nb��+]�U����6�$]�)Ű��$I�}T��Ƨy�Q�jh#�z�K*tk�?�R.��i7���0�Sl�θ�Cz�]��)���݀��}S.^n�ߙ�;g ��
8ÿ�З�^c��z-��s.���j_�µ$��hp�pX">ք9kX��k���wb`%i�#c��D	E���َ[� &���s�w�޴^�پ2���K=�(��*%?�}���k��5���)���_)��D�fJR�VnS�:����%�k�e�X��w�@V�W�D���5�%J0�>�
 ���)&�P���i�+-��>ӻ�U��K�Z[���蒑_ct����'O������v���}�&�1+١�,������'A
������ҧ�HE'>��/�y�?�ҡG��]��L|�[ϣ?��	�ߑ(��K��Ƙ�G�zY�֤t�Z��(2ߖ�eW��Z����Ʋ����"�]S�k���+�ǰ*�m��Y����Y��r-�j�?��H�v�ݕ��8Q �{���yr����؆cŷ$\�
&h�?�	)R��-��Xr�f�����̓�B��J���L�K3V�J%)w��_�����b�Q�)ϯ*Mg\o�FG�In,�L�M&*7gU���DP9�bL%4$b��a6�Ns�H��m;1]�!Fp|.���t�J��l
]��_��S�vm�׽� Q��AN�H���T�d��C����K~9��n�J�O� �-"���@vϦ��r|�Qd�i��G"?q����,�S��/�*n��w�N���:)v�w�%����y���%^_����G�N��������I��]��Ǐ�&��n�K���Y��d��D��g�>q�%?Lޥ����erzZ�TQ��"�<~�5��e.�b6�6O�&`n�!���np�y'{����;X��$jx�!=rO�F�v�ӿ��זVS����������(N,�k�C��N���9�kxNo�n��d�u�z����(1�%�Eh[Q���!�U!l�լ7�ؘ�͵���e8��FSd�7�$S҃i�4��H���*�	��+������a�>��]K�8�+��׎ܲ�^�vm�E������p���ߙ�����п�A��!\?"�Q~@��]m�U
oj!^�P-,���QF>e��~���jO�vX�K����j�1�@�g{�k�+��G~"$�ݳ�{�*ϧ���# ��U[�����D=��O�Ƹ�)�w*��8��gےߴ���~B�YR?��,������4h���]����FL/��א����R+QbY���f6Y��誫��{Ȕ����IN�J�6���y�͖�R.�%�Es�%�D�ӕB��w��PǦ������y���&!��O��@��D���"��;�ĕu����WO�����A%8v�
8�E��?�p1���Lq2T&:͋��_��w�%
��g�RE͵H�=�ZF
q� فI>Kߦ��B�\Xߌ�dIxE���{�fd��gA�̲�W�}qTv�i�>\�]o�����+�z�_O���.̪������	V��y�<$]�TQ���
��x6WE���!5�{1�Nk�	�j��H5��!�D�A9��?I�S8C��N��q�q�l2.bV/��l}Ň5�ćLĄ��N�ϓo_m��p�4�]�� n����x�׿��,�JYk�D䐰�&2��� ;�M�VT��ב�۟F*a���.��r;p��t��u�c֟�
L�D6��9��)r}�K�|�
O�
�A��kpl�O/�����X>Иc�a���t����}˩����z���5~��>Y
�xܻ/��ˁ�ik��U���E�f3�w���Ȑ�y���g�F��8|st��FcG,Q~y3����&8~y�kW4Ԅޔ���ְi�M���e���'[���u�����ɂ���'�c[�j���w'�����\������S1 ��WΤ�^7���0�<̽�@co�*��=t��3!m�Hw�Nӡ���8#�, ;�.dE>Ac%At/K��M�i�(�	#pʪ��뷺�G��q�k�1�q�k�Uq�qT���;�x�2{=�O����Q�ռ��7�;;�'ɖj���8Vi�D�NK4J���i�Y�����o��A
�)�I����-^2,Ǝ�~؋@�=�VN�:v5�7�D�p`4����9Hje�6�"�50��
�B6��
���Y����ɷ�Œ��0jT�G����2@�L�e�~��Ѓ�`��򮎢���IÄPT�d+�'C!~�+u>�S��a�ΰʣ��R_vnR )���¿���YYC�I��:\ª��0&�1��)΀Q�@+��	8�gS�`GsB�ݽ�a�����Won�'o������-N�߼���l�1�F+�|���լ?̝��@����ϟl���[�Ne�n[�9�k9�)���e?���s9�y�M˪^>�0tQ�;���m�N睓�}��_�����l��
�fE�
T%�IUHB8�O�n��Md\8�2p/=Y+=y�l=l=��}�Es}#�x��-O'�'\)���#u�,��y��M���Œ>={v[�Oy�-l_�[��u����[�?쿳N���������rd�CL�!_[�|]�'�^"w�a���@�̯
��p��w��Q�%����(�\l�/���}��߯-�^Z�m��)UZ�mz���)�-�6���˽�)�����eDh��drˍGn(ɂ��#b`;����t����Xo~�ìd
2�B����q�v����fo�^��2��*�juin�_}aI&(�;i#fK�K2�Ff��8'�K�W�ڹ!�0�a�YZ+�Ѱ�|�]��D�^�?�돏n�m9ՈO)��8c�ق�)�*�C��65S(T2@�ՒD����J��}6m��Ѭ�w��l��n������G����F�����e��N�&�4��{�����I�r™��j����[��ЭǶ��Q6���>�da��Q`�x��UbD48�m )��z�ő��:�R�����֨�;)4�P�C�'��`���S��i��Æi��V̇�\Z��G�b>4�M�<����{5G�j6�����*�&!K�m�…�=“vh��U��I;z�\�Σ������$e��'�;������Nd��F�$P���P{�n��]�����x�G��P�:R��+��;��H��D�e;ٽr
�'�MV�c����Y���<�rOn;WcEr@�N+��B�tb�5�ĺ���xńXn��4AC	����E�nT��MUٺ��P	�&���GG����#t*?�n}K�^�ҍ�zr�\^�~��F�5nZ1gz+F����?`l 7�7u3:���`:1#��;4��iY���4�HE�sy-Jj����g�{_ʙ"T�}��f	��)�5���_����c��ZE)|��8"���e�m��$-�l����?�[<�*}N2��?ڊ��M���#t�>�S9E7xu��/o���^�Q����v2a'3z��ɛ��ﺳ
�j�b>o�$��f��=�v��>�_�3��ݽ��Y��ݦ����g�����hք��]�����.{�#2h�
��d8ێ�qwظۋ��aF�	$��,?�j]G����po�y�$��"j5PC4t���3��‡�{��L�*�t��тT�D��cQ�Y��u�VQ���|g%��;����4q�[_�5�Z�qY����C��pjO�-}�.
3͏���ɨl�7y��(Ê�`$(Ƨ8�u�w��t�ց	7ﷷHh
RJ���Z���~�f1�΂8�����6�i�=�������_~�E�tu�3[i�P�%3{�CcT�hf��ƃ�G_������ڕk(�6�ѣ��?x����ۯ��oA�!��鷯�.�l�s؃��{`�8����a�<�e��uΙ@_�"d�w��(�^§16z=!y�Ӯ/)��At����)?٤��|��^�N$GO:�b_���ٯ;���C���*Uv�
v��������p�	a���z����	年Vh0��т�����E���:V���P���̉ξwU;�)âZT�1Fp���MҐ���p�p�6�u¦�{�N}�?�#h�֡K�	��ͥT�\G�S�X�98W�ju��M9�Q��"��fsE�Ry2����2��s��\���a��&kU�F�����+�i"_j���z��=O|72�(g"�C(�����$5���f��Oh˰8����4@��NT+φ�2�U�	��t&s�nV�-\#�9�֭
t�1���5?�{�R��QT}���nj�����J�v�Z�E����|:37�)�6hE.؎��g��7c���r��@t=F��$şL�RNP*0p�xn�����$U����?�:���t0�J�����Ӊ7��8��a�?a�g��(���z�	���Xº�pH-�rKEO�/�Zw<�Gꝫ�N�(nRXDZ���19	�>he暑r�l��3��i;�0"�B�Q�ق�Mgӥ��'��T�'SHv�������_�5�b���=�ϳġ�=K�\�d�Z5߃};�,*�z#ä8���ףX�C�`+V�!mma���&P@���(���3��c2t�:���o�o����p��j�̩�<�7O����,�{@�]�`���d!pa�5�F����VtD�=Y�2|֥�I��2]�&�������ޞ��e��ͳ�g
��-�8�a���4�@����pA�G~��
dg}�$h[���pa"�3��ET�d��X	B.����O�λ :0�l��eƘ΄ta\�ה�d�S2��q$N�6FZnU�;�b5��jĤY��[2�@�%�y.��2�a��?PK��VSZ�k���,pkg_resources/_vendor/packaging/__about__.pyMR���0��+D��e2��^Z(���CaY
���I���c[^��Wv2�s�ы���;x)�@A�>j�:�{��G<"0�)�r�m֝\/kZ��9[��=4�m�Ӿ��n9-�3����z~�ڌy�x�-
<�.;�H��y��4d�Y�	m5x7�RC��Q)�iv�A_�3�Q�q=}P��ɲl�Ih��6F�_�W��J1��busB�&�����c���t���ID���n	un^<]G���o�#
kq������U�*�99��1a�n�\D����!Q��>2���~%�c��2�}Ѡ*�J��}��m�>9�Mg�����&���tβ�K��ݷ��ϼ�!�Zr��?;R����;�L�n�N�*�*lZ��B8wr|��P�=��[�PK��VSeD2+pkg_resources/_vendor/packaging/__init__.pyM�Mk�0����l��}�}�0(�t�2�q��V��B���$��xɯ>��=P��B�]��"v�B�: (����$^G�氟�j�A�ġ��s�T�
�T�v���4p@���}�u�-
�ĄYg�<��ȑ��zhُ�C��bS����&Ac��Ȣ`��]R4����3]�a
�?�V����1��I��C�e�t`1�^t��E�4hA��,E.'+ &�\
PRw�OBE��^�cU�.[��N��yS�j_��X��Y�m�B�-
X�(�n���PK��VSJzBh*pkg_resources/_vendor/packaging/_compat.pyuSQk�0~ׯ8��xx��/#�A�����BJ�� T���ɒ+�����I��ftz�u>}��w���p�j�h�:�@���
:]�@�h����V��ݦ��:i4�¼��A�*�}�\�9lc�f��۬��:Ƭ1>a��q��^m,��iz�
���������w9ٴ�z�Ψ�#O�*y��X����]�@�
7\�XB+��[��#�������W�o�R~}YL	T��m��-Z��J�9\˒=t�
m}�����9,���R�f{������/Y�G��)0x�$]YD�S��:��9�*��S�����W��!�K%����>��,�LC���Y�gKm��oEQ�2��9�oM&���,
���	�H�I�S����4y��K'-�2�Jhf���"HY��PS{
	E�U�4��u*]f4��#����R;/���`��T����;TI�Q
*+J��?�ڹ���|r��ŘVОs����J�rТ!τ���d�a�zoa��4R 8p��g#�EzQ:R�������IՊ�㩱&���y�Lr�e9����?PK��VS�]�מ�.pkg_resources/_vendor/packaging/_structures.py��j�0@�!����c��.)B.	�
��*��J�@��cg�qC�8�Bu�%��F?�a�+���'�ԠU��c�I���n��ࡐ1w�]X�輲&����&i�:�q�|�����M�&��d���眵�cs�Y�e^j�v]h$�I*�GA���HK*
j]XG W��P��$j���"(�2�LLU�Ak�=LM����r[��0�p�SށsqB<�t?_�>Ǐa��<������ށ��\��+gنU�U"��a�i���E�s��*��Z�ƿH���g�{g&�x�&�BU�*�H���B�܋�~ß�̺�b�ʓk˺��4�]��9f����������w�r�G�΁�����׮��k#���/�
�}b~[�K�5dk��ҝ�+>PK��VS���n_*pkg_resources/_vendor/packaging/_typing.pyuT]��H|�_�h����#�@a_��ǣ�5��Q�Î�}�gl���,�4]]]U=UU}t�zֱ�vC���'
QGk(����=
�<�~���w�0�iE���I&��v6Pt��S
�c���}��S����.�5��;�g��L�ԛh�l�W���n�J�y�g
�Oܳ�m;.�;\\jk:���|�t$�0]'<k!U�`����
�h�l$mb ��n�?k�����<��*�vg�
k�汧�	И|ȥ8�hΙ��y}hE+�r�����
�W��؀����5=6),1��j>h(nt����&��N�<(�V���'��A�\���Tt�b�����E����
���U��%�;z׉,bП�IRV�ubj�\9(���"�=� L}##�$����^���᭓�V�>P�Q)1�{��ʜNI��l
�G��{�+����%�i�Zd-���MC
#���.B���ɺ,E�뒬��zn�$�H��[X3)ɪ����*E�˂>��nn���?�����o�J�=Οn��;Լ~��|�R������&ְi3�m$B�y��ߪ�*�v;����;������Tb��RH)�� �=DAZj>BRY�i�����$C@;$���іl�i�<����-��קNo���T/(0W��<��~W�e�R���HaD2~�؟	���m+���:�ya�'��X�~v!�ۮj�k���-��X��en�!�U�x�o����'�����6���~�O�.�n+���g�5̫rh�y*�op���.�M�d��{ь��U�&�o闬��^�E���W�m���n��--�Bx�˹�V�PK��VSb��.%*pkg_resources/_vendor/packaging/markers.py�ks�6�~"09V8N�:�h��8��z��>��ܝF�$1� ���o�]�P��hO$��}A{�z�I��rF�w^Ӝ�ٌ��I]̙ Պ����$|�^�J:��S
6 7LȌ�=�29Z�؛��-LB�S��'�㳫�aX�1�y�i���\f������Y�ȜU4�e�[�&i���Z�4%ٺ�"�V�X��d��e(؀�"+*@(f
�3�d�+�.�S��
����Ȟ�[~\��I^��	��)�rSR�A���\�+���R��K&뼒"+�gyUQ�R������7�\�����u9 �pqO�|@�Q�ͯ�o�y��8l?�䔐=R�?�Yt��.�ʂj��jS2i!��#v���qz������_
�,�,[d`-�ʎ�IqG�l�F`�!�!
U
�\�!�q`>�|����1�sz���~�f���L�����u]��BR:7AFy2�ժm��-���)̂��D��o���D���Yd���D&y�55.�2��5+�3�fv>$�L'e
0L� ��JI��
�k6��x��}�{T��S�d�@�=l���9�Z�����9���|N.��ßGDz�X�W1�g�xӪb�̕�%wH�Xڜ3Y샩ե�ЬzB����0�b
˼e��y��"�H.�93�OQ�a[�3>g���f�aB��ʊ�J�H�|1�5��C�eC����k�R07�8���H��<�`��nAE
@܌`�6���O\�P�z8|�^<���~��V�G�*ݤ)<���	{��3����o`N3�@]�	�	�0�y�!7`�x�#�oK��Y����J���A��}_�
�����˓�7�c��H��F��*U��NG�~��?#���i��Vb��-Zh!�����>�G��Q�:��[C���s�;8�i:lj�q.���e��p'��>���%
�N;�89�sk|l�Vu#톅��g�>r`�U]V%�ْ�6
	H8m�C8�Ž�ӓ���ۃv�VYC�Ti�_��!	w��lijH�͢
k���ڱ6l�|�nK���L@�*�<Ril���H(!�����3�M�����!�-����_^�����o/�s>�`�>�G���=�rO���8�<�]�>�Lϑ��O�`\�
��O
���O/��9:}���y���"������D�nٽ9??U������s�e��[/�������-���=�0H����2��$t�	�����r|����q���2�{��TNY~�^�zLY99���q�r>���N|E�hfq@��+��;�*��(; ���^��ū��z=���8��'�Z�ait��	�.H�:`�jX2L )�NUu�
*(0Y�b�,հ��	��N��X��Ć��rɶh�F�&�:����Jl!�ѵp�fk�j-��Q����I�dj�[*MT��E
R�yy��8�U�U��ʯm��G���U��{FV�A���kz�g�LP�)�_e�6'(a��5A&���	�^�#�0���}I�}�p��t�?�4���ꌏYi��=	&���m�5& �9V'�a�
o��<��L�#���vH��Dn#;Ԇ���(9+�lLF#�"�ܢ����XS�6�N�A���0�@��TV��M��/,W[���,�!�Ѐ
IO�>�'xVD�M��!���o��H�7Ǩ{UZQ[r�&�ɮ�V3�w�Q
���f�M��a�7�;_��+9�'u�a@��`�T�z��2K�ʎ��af�G�0��?��:^��`8>6n{.�wb�*S����H���jMm'e0�Q�}��Ħ�66�@��o������:�cj�S����SC��{k�g2㐣�=�"�AM�,͆�,�#n��k�s0�L�.��]��]���D4�%�p�8�$U�+����W���U5�̬�,�����K��P����#4�&��vV�R�9Ӷ�ƌtL��`�Y��2�v�5 ���u�S4�d�.ߧh{@���hw�����W"xj�
��w���cWL�9P@�/,��-��5뒙	��%�v�&��]a�/��)�{��K�Fk&i�ޞ��z��4�eɊy�KG���P�u?�EY�����Z���v�Qۺk#YX�j;����xm�ݢ�F���Rs،�k�T�7�Ԙ�D�f�uٴ�}yNo�^Kg%�L��F�MD�<��Ҥ�*�,��k&�X��,�Vt����
 �iz4�#Y�|6>e�{�	�����P?fz\HL�,gw,��M�?��h���<)Hu9�h��\��w\QD�E�5��Ɗ���V،��跻M~G�d	:��L�ߣC��1S����l�fi���#�ޔ唡��T!�G�(Nv[�ţ��pn�B�j���G,=
���r�U+-��������"�ˤ�aw*K貔���~��2T@s.;ڪX#oSR3]T“e������<<sxp��a��N�����xp�7y�nzs[M�!i�� 쀷=e�uÛ~��G�������!|G�C	;�ݜvu��bvI�Q�P�$�M�x2|9�	]�!���e����K�f���ް9apk�	��WQ&�c��j��vR��L���B�.�K~�7o(&���Y9	�]�:3��Q��Qi�s�[!ʦ �`gI�gdH���)�yab����������V ��_s�hDVz�;nm�g�ƋH#4�.���S+Vv��
}B�N$M�s��E��h���	6�7qk	^ͦDŽ.���\�H��W�/��%���P�T70x����xU
�
�Kl�������G�e�-���?G��@f�8mBa)��I��jr��O
�Ht&~�ߒctX��w�O�{[�U
6;�"��PK��VS&y�I3A/pkg_resources/_vendor/packaging/requirements.py�Wms�6��_��B��s���續̤���$9mN�r`��R$�v|m��=H
��k�/"���.��d��
�M3F�T4#Y�a�`	��q"���)��%,�#��#i�;��U��<�lo�
O@����pMQ�0�g�(������He����-8��2c���I�f"p��ؓ8�V��,�I�/.	�EVI��I��T�#%Os	�|#��N-!$�w�g��.�Ŝ���&��σ򹤸f�#ᅤJ�y��G
��ҜfK�-x�� Ǣ�Vj�_��?�S>.8��S�>�4�9۱�=2(��iξu��a���� y�5�ϲ��SbLq�X?��	b�\Zxˏ�(�
�'�j�=�"+�q8����ټGƚV3��m�mj�؎n��y��{\0�(n����6%��=��VȜG�!�i]]�G���ɨd�?�,M��*�l�r�}�Y�"��5��?̑����'8j[T**��#�*S<[UC�E3�ϫo��q����pr7&�:��ɢ��M���y�p.��
�������h	���\?UY"���y���G�pM�;��H~�4��ǡ��E4��i-�]��F��=vfw���.\�����2\��F����P�����C�P
����A
�
�6��Ҫ(��ˇ]�pA�@�ܜ��~^���q��C��2���/]�sQ,�����K��c�h�P>1pk��/
�V�����-~�BS�oB�yNp>D��#�^��j-m+(@��A���!I𿙢1��^��&�y4����w��ctT��śN�����tյ��p��
�."�3-�G>i�Хt�<ƜJ>QL'y��fhn�^��S�:7‹Y4����WW�_�8�sw�	�V ��#!�����>�D�����f`��SX>�m91^�h���;_�z�j
mV�>�̢z>��VM�X�ױ63<�%��S��О�<�Y��E?�˩2�m@5G'\���9�2��ƭP�V�]�]U�g�t���ѿ��h�n^�WN�WU�w�{Ȝ�!@�p���S���m+�_�"!�yqF"�kV�5!Oe�)�_*�
%
�bARI�1�=�1�H���xu�ڶ4�;�)8��Z�D��=h��Ol#Cvf�{��&6�]�����5��R�'��"�g��<�Fuq��{�F��ͮjzf@�4��.@�Z�i�=��F�g�ɯ��}����,���>�\�N2�5�a��p�&XTr��9p�Ruؽ�M
f~í
�C�ba""��!��5g@��2���zɎ�b��4��k3�'��P>�����p��Ee`�����s�Fe������K¶X�U�ű'X���׍�/�0j���>Q��O^~O&6ކ*��U����ԟd�M�4�K��®<Ž4�L9�4v����Y��HG��_}ÿ�}�//�L�T}�#;W,Ȋ
z���$߮{xދ�	��t��W��@G�ZiЏ-��:�ӽ�v_�R��@�<x�LW'�b�����yM\���O,��\����o�ϛ��Qq�3ݴu�p�Ʋ�s|�z�6��Ns&�|_M�Ӹ)��G��
��օ�JW_�&��Xt泥n�W3R�O�Ϙ;u��M�TC�eu�B}Oy~�C5�B'���i����l�GB���7�_je��V�M��J�n2���&`i)zp@ɪ-���]]q�c��嗓���LYb�g´n�4P��'�-���}�?Uк��i^��ҹ���O��R�VPN3�I�3f��}wj��oř�x��kܩ|;8+�*����������Ӱ�PK��VS��)��|-pkg_resources/_vendor/packaging/specifiers.py�=�w�6��W0��QxNn��/r7Mݮ�咼&׼}�WKS��Z&�$eōӿ��@P��4�n��ZG$0�f��h7z3˪�<���N��<�g��+5���D�Q=SQ���**����E�Ÿ��l���*+���q�?��|B;~��iG����Ϗ��x}���YY5�J�(��.�k�w^�QZ\.�V�D�I6��󲸌���e�,�xe������*��Z���0�dW"6�e���!OkDt�H�?�]Q�+� ������1���fܪ��q}�P�0Ze�l|	���Lx	mL�7{u4~�ףg�s��;�dYm�A��E���<�I��4{���fZj���j����")+@8;w;��]�F2�L�����>�E�O/��<���M��o����1�-9�+�	Lh����!�7O�%����r!�~[?����v��+�r���F��I�'�;��b�>C�\�h0|�`j��ytr����H����	Bt�_�tN^/T��g��̗�,�rp@#�z=��&�G�i�X�,�a��`�������h�:z����e�:�T3�+�}X�ӯ��/<F�ُ*��(��>���5V�IZ�Y1��u���J��55�1P����!rž1���{�8�H@���T^'(%V1X@?](�lL�˂�L9S�+e4W#���Ah2gI5��NP5k�L"�]��[C޶��j�`6��2���fDE�\��J򆡨 V3��#@>�MbUx4X`< +U��	fk�r�/N6߈�EY���-q0|��JU���(��+����!�1��_̀zBTX�SvMbج$Cs� �s\���&$Dΐ�<D�A��(r��/O��K�Yn(��r()!�!��Л�����B+ˁ��U��VNC�_�1�P���O?�.p�`��*6�Qf��gHO��v�2�Mr�s�[�Pm#*�)k��QU�_�|~�۬fY:��Pn�#3��Q[��q��$�ƍ!u�*p�z��T�|���
]��
r(�j���
Q�zw2g9]&u:d�ڍK5U�a�&e:��`����o�O�d�j�/�c�I9���x��Q8<���h��;cа�,��~�0�7�ѷ^������4�"oҟ��kI�U�c��_���Z�rr<�� Q�3�&g_	����ȇ�{�džx=p��D��j�lGt��0�b���,��D�'0����?],�cZB�1�+O.���0�D�@�fK/Ҡ|x�п��Z,����ڭSH��[@a:��i�?����E�G��u1���MCuIs���?���t^�I��>u:�߁�7���}��f����eq�
�zO+�W>m��/�����ѩ�m��Z�p�HC
Ϸ�h4bZ�r6���1kg�����SU[Sm&`�ac������0���	ГX� ϣ�8vT�1�,OUZ��X�6�V�MzArZ�2u���-D���0��9�ɼ2��ES0ob�l0��4�>}&֡ӝ�ƀ8
����'�	���@g����n�B�����줬�C�}݂st�����B3�'��<A�޷��v���/I�E]`��+ء��j�/D�].3}wN"�:�S����pdo��WK�UѲ�ֳ�J	p	z�e�.k
L�����~�F��?=�5K37LƄ�1&���`�J��]�\`�2����LjP������=c�M�&3�Q���2��y1�Rކ�p6ގ���\��0!�*� h�C�wа}��+%y�4�a�	�IA1�Y��M$	�V�@��;�fc�KgȜ�|�Lfl���@�=�i������|�����HϘyN�yO��~+�
�D�ށ+�-�`6e�{S.�GG@@�_�G�@<�U�:��I`HW�͆UP a�$���s�0����z�DғXX6�	�xʋ�6nlzP�3,����]`�ho�b5h����1��eٵZ�P�J�`-XAҖ���4��T�4�S+
d�����"����X4u�UR@ḝ�Ks�.�z���-�������8Y,T>i;f
�G�%X��3�4j��z� q��W�|>9�^�,��u�y��0E͒�5���u1�Ŋc� W�,�	�4�����
��q���E��rh�!���A<c9���T���o-�%���@:� �3�L�]�k�VmCV�]^z������p*;%�C
�ڀ*E,1.SW�`q��WO�99�F7�F7OF7��C�o}W�9}46��'���jp���@X���q��o�Y�M�Õ�r?�z?N�86?.+�9(�8�FhVZ7I����8��a�HR�m��/��i1/rzy���dh�	/��yQ�J�<""]U�U��(D�		��%A/�2Ѱ��>�ЈM�` ��F���G<�8�*F�'?��f�=�"�D���7Ħ?}����G�
~9����=}}4��AG#0�=:��5��ݣǰBƭWO��\U���v�Cj0-ڇ�6ONo��~��N�y�Z���qv	�l��{y�Ŕ��7��B��4��k�5��|T"���ѹ��0\�S����J���ޖ�y��0|�%����<�T6~	~:����b�C��0�Yi_T�O=�M���ƢvgP
v4%@�NPvC@
��~�LU�\{�H>Y��6];r0j�)Ug��Ju�����g���4i�	����ϣ���#��;=��W���ܭN0+����M�5�p�3QU�,�SF�s��&5��&WS{\:)�X��b	 ��qz��c��e��ƙ���k�t�s��6�ۂ�^\|p��4�.U����d:�͒O�Y��67��-E�K��Kt�y�_S��˭6U����p��K̨`qrZ`*Z��m>'ుGM���ޯ���>m��ɰس\q��@/�/"�a�h��K��q��P�9,I�R]��0��.y5/�$$�ֱ���OL0���(�w�{H`|E�gH
ڣƉ��*�����I�U:p�yN�V6�_w6�����?����_�Aբ�:��M�ϻ��9أ�z���?�t�����p�.>mcK0�����Lo��b_T��@��*S�v��6�DJ�[� ���U�� �Ps�Y����
�}S�#ƥM ����J�Zl��'O���+��w�XSN�I��5bL�����B��BGeC"�4$B.������p�݃���OF�}2@p��?7����w{�-��Nޣ�o��O�Y|E!�$:c@��k���	5e�N�iV�q��<Vj�'�a��T�C��W�,�[u����8LPV��C�/��0o_�kV���)8w��Zr4��'Q�<���z����7L���)�A�ksj�u"�ض��
�SB�����g��hYRʻ�IUpa�c�^.or�h���T�z^���8^9@+p��0�ղ$sp�1�I��7&̝��pZ�P�Oy�ځ�)��XP3���5�;)ϲ�L�k7����PR;�0c��ͺ8�h���U�	�>��MQv��B��,��U��9�����V�U��y�8~��Pz��x8���鍿LԑpL�>���˹l��YU%|���Y��9p�JU1y���f��\����i��K�e�T�8��|��{��h���#ʙ+����Ec$�t+�
r[,�ʞ�kcR�c���WR+{<�uِ‚�Ž��"���yV��y{�8����f���o�\�M���u�>�꤬+��{Heo`���K��7�O���p����բ�����N��lz:���a��99I��/cG�|�=@��:v��"�>�~{5B�G�ޡ���A��5��g*��zuW�s�(1/��-���f{b�t���Z��^�x7:�E�)ŹL��������2��S/�g�,x8�F�㻽�����g���:�����2-�AB����cx��t�R*_�۟�\�AzhQ��H����)D�W��W/s�͑u�m�Sr�Ė7 ۃ�2���a�;�>/�R��`�"�(U�I:�TH�K1�O1�SY��-L�
% xY�J\�3I^(�l�<P���2�
L��x�h�����7�38���
M�,*�W�l�*�t������jg`59�j9�c~yk1�LYD`h�x�O�9]K�7�ô{.��՜�I�l�vV:W9`�\�5�f�\�0{��R�U�C����ʤP���C<���~-W���Qb/憄*�WEx�MV�>��Թ��\��Kxnm?)b�#R�+'i򩳴�]�[�~���
�����2`�ϣ�#�s�/�DTlu͗�C�d�2�$̉��xK�di-�_P<�$�5��D�KHo�~�Xa�G`�m����~��xW�ߚՂ�;m�=���I1iC{��Y��]��Jgs�UZ�Ү���� 3S�B��Z����@��_bOnc4,�[D��FBn�tˤ
h��$5����z�%Hn�X�����e�?7�C��&��H-Kn�vD�0�&�q��@��5eT���ݰ�̈́��u��O*��ِ��Jy�*��*��ѓ���<r�/��u��} �s�j�^
Z��T;�^.A��|Z�g�Ь�Z\)����;��	=6��Ӣ&�����[1�A��Lb��֖z�x��k�ݝrlr���f�\K�Q��]��z˙P͚ߊ�:�P]EUo���P�m���j�Qc��ڏq���z��֨/x�N5�=v��=��h���=�^gr]F���U:��\'C>etR���]C9�!n�(����F�K��9��|G���mvm��U�w��>M	��A�������6�����s�Kն��s�5��^>���+7��:>A�Q ��z^���GM$�9G�7wM{)R�U��$�����[���:AC"%��Ŵ}G��x�wLӗ����<:�3�!�k�sHG�C>�<�Tx
�C$lT�^j;�B���9Eh1���[B�(����$��a�%��.֏���_�n�'�J��lz�����k5�U��/��R��k��V�X�HQm��x(��U�bg�!����`�:0I��O={]�
��F�U���J������7m�&�Y̑��K�1���L}8.� �1T�p����0[����7#�i�׆W2�=W���tV�ܲ,6��B��[�'BC�/�᡽��}����?z)����Igġ#���=,
J���a��(��Tp�2s|#��6����G��dX|pډ%=�>��Q9�+����s�)ȨE��Fo�w�,�����Q����(|h�ް�g$�%Y��k 
pR�m`����y��V�I��$�`�:��9�p��!��ɋH%�i�Dr�SQ
�Y��=��H��5j�x����0J�X+����hs��X��)�WAP������9O��S
���t\s��de�d,��a�5�x��$e�$��O�k�"ׄQ@�V�}L	���A�7�"k.��-�O��&��w�%l���b0�މV']��sN���M����J_��7�$X���{"��30����m�Rܜ��~:�0�\�ë�#���VE����2����������PggUx�=��2h$e�w���T�����#�̗���c�mU���xt&��ZgEF�m�z���������\�7��c%d�Kf�hj�o�M�@�]�m .��.�5hl�B{�~�ڟa��+O塛_�h����2N�U�0�����8�,NazmpXx�Ĵ��}�VAM�U���^��L�B�&�2Tv�Y��ʔRZ�/Z��߁_���[�O0%�W�aIp�pH�+;'��rNB�mW��L]=w��W��e7ſ��c��e1�.w�����L&]Y,��ҏ��=��%�-�ո��Ȝl��G
.��C�07�ۈ (H{Ý!]����x��8��NԜ5s�!��~�%�
���}�g�\5P�F���N�d=��%�0`��*�F%S�:K�J��a��7W�v}��/Y���
�ʳ=�e����Ui��zK^�g�7�&���r�����K�
��� ��qJ���U#uK���
'����<)u������Z�Q���I�D�o.*]�i���b���/Ug�m ��2�4SJ�UDg�Ѽ(.�����4	���o#ᏹh��^(y!GV7�C��j|�����ɽ�AsfK-]5'%���5+X��_����#N-z�����O��+?����:i�Y͊� �2���ism���:��_9NEj<�i�$�,�-�"p����̂��|�?D���]�b��p��=���-;�|�'���
ULz����\�nLS��T�'�����5@���J`��MQ��,����T�.v�����3X�Աcgϡ�}lu�(Yܡ���7L��|�@��[����޽����lzw�—��\��+�k�ÿ��~0�MbP۲V��C—ђy���7QrY�S'3��6����4M��vH��G�^���(�}��!�f�zqk����
�v�y��Hɀ0%5�u�W�,ʬ�R��y"�7Mk�SAȾ#MUD��9�p
w������g1T�|sX-�0G����/kmi��"�Ud�ڢu7��|ZeΥ��7�.L��B���u�Xf��1
��p5WA�,>�W_W��|��e���h���6~�C��N�����y���5�q�ț|�\�bx��J��-i��Q�+)�?�uԷ�3���i*��]y�]iQa�UC�<N[w�l�N�}��ˎp)qs�u�aď)l�C�h3��?PK��VS��'^'pkg_resources/_vendor/packaging/tags.py�<is�:��+0t�	��h�����8���Ʊ3����$���I�Ow ��ݪ�Z�K�F��h�7�<��4�C��ҋY�a��+� �X1Yf���S��[z>�;�`]�k��Q�ll����2/	���k	㰳0���G�'g�Ä�eiZp�@A.�<*�l��i�t���"dAXxQ�;�,]0ם�E���ˢ�2�
�M�4.�����~�EY`S���(���
�Á�h�,`XQf+���s ����=�xxx��Fx�˂�A���s�6�2�f�9KR��k�z��m�u�����%
����,,ܼ�N��0�;��6cB$p��l%3y����2�
@���Y(�EV�Eu�ʵ�~�L�
۵�%�<�v�b��k9��?���o��yt��|/GVO��B8M�6=����/���a��;L�B��ѩ��қ�a�Ȏ�ss��N���;g�2L|
�y��Q~L����i|�*�i"�fP�����O�;�W�	>�
�
��- 8����r�Q&�����j�N�>��p���������;��oԍ�$R����┼	A�#���}�/��l�ؤ�ei� �����g@��;��
��<^��uQ�p@�h�::w5��L=Xu7y��!{������^��sof��ϡ_t���,����<L
gTj�›�"�����<v=����v���3/A �<�j.Z,�I���C̽|�wv��bT��=�
�-o�����8��F��y�9�'X�3f@4|�TX�7��\���X�Sh%Q�v�S
���$�V�\�?���d;}uX�%;I���C��N
��]9qz
R֩�C��k�K�H�� 	��,]�Y���uJ�l�è�x�%�A��(�A��rR9��\�hm��/�l� �YV��$M�
to4�#!�6�����ht���Z�,�0ب�im�,GM�SX��и�x	��Q���Mծ�s�����),��a3�n�OW�z�6M�[�ջzm�x���Y��Q����G(x�
�|g�`���/
j�\���q�>��
z/�C4�]Tb��긲� {���~��sRӰ����
H_ۡ3sا�j�K@O��d���3�����<$�P2)�P�ht�Kx�ȃ�RF�׃,B�{L�<�D�ċ�WT��8!B7,J.�\�A>���b���}��夕s��8�z���ś�Mҥ�=
�w,mbɎ�JX�F���]��hY�D��F[��θ>!Lմ�,�RB\tݫpu�f��~
*�i���t��@���t5��ۥ���,��|D�=�/��bN��b.3Bvqڽ�x!@�x<B�1/g��^��+s��"�D>���C��܌�1@�ab�ᰗl����aqe�4��kg�.m�%ì�<�I›Ž�o��a@G�e^���xG���AӀ�	^\x��B-F�����ٷ�dJiS�������_�I�h���W/�9�Z��&��k��dW_���XE'NKG9m3" ۂ(�s�	�I9��k�P�,"��/�#�T�|w�P�:"���Vl����fp&	igQ%�� �c�tф�D��:M*U����{`�a1��huԝ��#���;r�%�}�"���~�!G�O#�i_x�q%/ :Fn��|����	���==݆��C�S(,�\!����P�WX�pZi�c��|:f��ˆD���@&H���`�&�I^P4��
�zA�"НK��Y’�ʢ<M���.��W%&�� -4�χ��
�,���Z`?>�,�|�	.�Nt%T}�Z�W��W�X�'8G�_L��1�K�(�;_�m�C�^,�Q�d�EI�^�,H�<yT���a]�U�D�����#M��rl���� iP��2D�k�� A)E��2��5���0mA��m-��V��e�o�FOG����������γa5d����rX(�-��i4��`l�R�>��I�t4,��
*�I���<u��vcJ;:�������1�:��ʼ!`:	Z���ұ5���2��4}��}�~<9�?}}���A�bя�f̶��
O���B$�s�п��c�hq��z*-e�i�t��5M㤌� g>]J
ĩ0��|�)ӎ��P5�@P!&�>�h���eX5'��|���/��Q�]�K�ԩ��X9����}���Q}�!�&	��
��z0�V��5��n5����%��K�P�m�oa
�^�ӥJG���X�c���R�2�wa(�ˊ
k�ez����ҧ~H�Ǐ�㤠ɺ���8dgd�A��(c"t�E�k_XQ=�����\*�)�L|ar�e�0��_��D/@���a�8@���9�q��7��\'����{�6�>������{��c`$�ȰzU@
n^�J��|��G8�Gx���(���F���ת�������:��U�h�S
0^!{�2Ƶ�}���"l���(���t�Pw��]�Y����HL�{L�)W�*O�J%J�):%��'h�'>�����爦�/j�#u�����^U��[�mM�`+��)0�����s�S�M>D]q�G�y�
�ƅ��p�JW����ЅG,z�^�V鄁ۿH����Fߤ���Ge�t�2�>�CS7��*��umG%1�����h�@�ݓ̳��
R����)��l���U�o!��F-�޸����w����ACL�f�ڄ2/��#���%(�A�z�{g��Qs}7�F�H�\�u2��]s@�N]���jκJY�&rٮ�a�W��X����N�DXM�緙�5�I�)�F�ZgC��#X�0?����T�Ҥ,�4�^���**(C�P���%x������jk��nR�܍�[�f�T�X�wm�mԂ?s�Z��4J���n
��.�-�X�Xc-��Qi7�й�8�R5
��p���j��6�8X���lkj��J���@y�>��* ��Rٛ�b�
X*�������w��Ѫz'��aX_���U���Ψ�M72��S[�q[������i��hQH�r���+y���ʤꦴaF{mv��c�
���T;nr�#J�� ��`��@.JhH�Pӓ|�2
�����ʯD����m.���k�RӐȍH���	աi 4�Ю��|t���UO>�D�SV�8�S���i:Ò�p�'�X�T�g��JEB�/<�i�?���c���2ݾ�%7r�*
��������.���"G�����׃B����7�D����X� &Q�e+�k�\
�_�4�:��xM�{�ɥ$\�4�u�t��ٶ�^K�]��^�"�n�7�r��}a�l�8_S���hh]���i
:�'��T@��-4�L��d积O���+R棶�&iY�Ѱ�޿��[�F��r6g��3�{�P^�<�0m�<x|ҝ⼽m4�T�<���|��U&��ŖY����أ�W��6-%��~�ž�kJ��"��~����b)-��N�P��B�T�}�XFPQ
+��^�|wQ��:|ܕClU&3%|䋃�����}��k!����1Н�%���*k\aʱ8�+�B��e�2��5��IO�2˰ArCg�4}�Eݮ&w��g�+��	�f�;�R
U��(3�u˶�fD���.��M	%Z

w?;ba䭸�/]��DP|P��T��&#!9�&����G��Sn��f�jbIqͬ�x�:���D�ԚZ}i�(�o\���$�MoI=�0��
G�D�u�A���ظ2�ё��z��A<�n��X��GIy�*�V�̰2|]�HKB�7k56�>n�s�A��ܣV���G��IJ���@]�~�š؝=�P����Yڠ,�NxB�֎Mt� �&e�S�F-�!���F��e.8�TJk�^�MP��4�s�k���[��&w�t�~W&�Z��8iST �|�T=a�-��h�9*pu��h�#��ɤ�A�r�ֱ(<�SU��E����U;U�}[/bli��L���=A]��kf=�)�bJ[x	�r^;`k�{�0���0^�!����d�U�0R�9����L�	X�ي
�r�	G�f�%���k����ʾ��cMy	[bgik����?��h2ݞ����,�?��Q�����
&����h�Uٰ�j�x���w<x:j�G�]���9����w=���)VG��
b�A��8t��Z"�����F��v�)J��R�����p`��V�*��1�:�:	O�g�nӈ
xa�5��OͨC&��٣.�u����L�P{d�5̧��2R�%�Ջb*��ɛxww:���5g5TY(�KW�\ԟ僖�Xz�6#��t~���ZG-�=����	��C��,����Sp�퓏������D`v��ֳG�iGS:PH�,hܭv�!��^,BG�†��,��7k	
r��5�̉C��v�
�T�=��4�B-4�f�2C�&�]�#��h�%Z��G�N=x�4T��2��IZ��樯��,�I��XL�"-!�
�A@�1�J�B��|����v��l��,)�LKt��؝6@]"��/���b��U�`x�):�f<�¼`�0+.0�y �A3�k�l��6�bv֨Ρ�}[[\*���s/s��� ���Kf�����l�G�(in&���=Fx���F�!(У� ��7��r?�dToj!�#��,Ĩ+t1A�5[�)^���,	�a�{H�y�-:j�N3i��4\r�)�����I�6�W��{�t�DN$j�$z3�Fi0 c�B.�ߨ�$!g�͒N����AWV����P ��^BQn�>z2ݻ��W�\&Wb�$���V@_m�����z=��9���$���[��+E^�qqx�Ð�Q����T��3�+��{�`��?�=��FO�>�l�}Y7Pbg����/h�^^�{�.��o�n��-����υV�*N;��V� O-�N5�i��bO %R�k�8��s�Kn�_�����L�h��iQ�:u�4�ȁD�g��Ҷ� {0KfJ�r������6/��*����=�y�2j_A��X�2+�p�͔�:f�Ym@�I삢��*|F9�Y��8�
�>:B�G�gÞ�����pA;�����ԗ8I��Tb�)���`X�9.e߃���6P�dD�����'#?Y���@f�t�x��Ʀ4���=ZQ���1��ƫ����E��'�]�u��[�8����*�	�:���ayN�Ͷ�j��"�B�WtqH=l"ZwNx	���(7
�~[�j�R�g�UԐ��q��"i��ђ.�}���h�=���!���n?���ޑ��{gg�!<�v��{(o��;������;�'�޹��;p9��g�g}|\=������w��[;�AܽWG��I��S{����?i8<>�;w��}x��
`�rn��vF���b�s}�<�XJ�+{�(jY��!%�|-~�����q����&���=4@��r�\=�hK���~���(���L�
\a�$?�X����v�6�%LJ��et�7tIՀZ�EtD���z)���j��/c~�.����/dEګ[(㰢�$O��.3n�l�٤^�ݓR�*��T.��N�
�ڨ5@ӜW�	`@�'v���]#*����[��y�1��6%���UG����:j��B���pT�j�Z"$��ᓆ��Ib��ԑ���)��dcF%�
H :[5�
��<�N���n��w�7'���r��}a�rq��8�{���7m���g|a�\(�[�t�>�l�_(���)߳ˬlbu065��]wS3Mk�/���gu��{/U׬?�g45�?Q��./[̧��B�9DԽi�������}�Л�x8X���4�a��L�po����� �s衄~4����ޚmy�?:�`��dm}�e<�A�'BЩVMu�=SJIo���R;�ͥ���}��������)���5�_����#�z����<�z�A�|���F;Ow�����ֳ���P[�X8�V�&c��ò��`�~ݍ�������v|����g�%F=�,��l���q��݅t�z�TG�T6�
�Ι#�1s��xzϖ��-�4��.<b~x��jy�:U�vea�*�겁:vo����~Y��ӎ5���n%C]Y�'�T�C�c�‚�PdaZ3�*X̮F�n-v��u���e�[Lm�2��F�=��kl?�Ҿ�tx�;�CA����I�������'�����.mn$�q�tOUMqK�
2��!o?P�#?�Ή�&�/�1�0�@�Jh�3��xu!/U���/�s
4/�q���	Q�w�3�{Ҭ����)�y��w�N�ݡ��0�~]�"�2����ڜ�cO��D���
>x��M>���ˮ��i���UY	�
�[�Y�N��V�G�Y�kDk��ʔc�Q�0ڑ��ԍ~zC#g�02�zҶ�ݾ���E�|$�KÌ�W�N�V�CgL���bL��5/hEA��bb�0\n��c�k݉��m�k
�:��B`혣Jg4��N;��O�/�QE���VU��8U�^S����cVmj�t��8f�{��z����vޠ�ϫ�^mZ�<\�{���шg���?��%ʴm��Is�a�\��)5��e��S;�%^�[�ϴa�zs:�(e�BEoN˗i���)��(��9�W�G�(�_�9m�ǡ�_'��K��	�d�&�Zww�­0	8:�i`�
ƛj���~S4\��(6��N��t�?PK��VSJ�f`�(pkg_resources/_vendor/packaging/utils.py�T�k�0����f�D��}	t��a+!��`t�(�9�fKF��cc��N��4m��ؖ��{���-��\t�j^@!R�3�e����.
��?|�xJ�I��7�F(��
�����.o�;�[D�8��Oo�-��kZ)��&+e�UzK�r�!UeU�E��rQ�Z��$ymk�I������F�Ťy�C&V�	�C��� S�m�ƠI����\t�����է�����>����jj�7r����D~�d�#|Q�HEUQ�����Oq}���ٯ�'s���%Q��l�K����o�>�� HR.���h\�42g(���~����A�9H���x�{N#� r�a�㇉���Bٔ6����-�r�v⏈c��G��{VV�5�(�a����H�>��"�nE�ͩZ���.���a�]Y�fF���/T�n�$�$}����v�D�z,
y&�5ʴ�h-��O��oA8��
4�F���H\�(-�i�7Vo���v/:
�=7)VO�sރ	.x���盤m8G��������h�T\[C����q�ҥ���o��"�]�pO�C�*�Y��=Y�hmt�]�/�ִ���Q��_Td���m��l�ڸ�	���Vp#�����h�B�c!���t�mbm�Q�)k����4�է�Wڟ���)
�)�CIY�)cO�ѻ��y ���v������r��	�W/"$�1>Z��M���h?n�#�ƒ^@y~��Gw��Xw��8�PK��VSPz��n<*pkg_resources/_vendor/packaging/version.py�[ms�6��_��7��Y;�ݵ��i��z��O�K�F�ɨ)�(�J�~��$HJ��N��,p������boϥf3�
��%OY*�i1e�l*+�+�Zh�����'�ʐ��;��̳�{�ϦD���KG�S!���ы���C�0�6��	�(r-�\�o�+��"�`SQr��h0S����lY.��c&E�J�':O�������K���X�dVB�,)QЁ��i*�I�&	��y�V
J�(֥Z&�S;�G�Lf�\�ر��R^
���BfsG��?'������Gc��1����,�.�0������)��`�#����F`n
z�.P%����@Z}�A��e�����&�ޮ
��
[
�mآپ����z�(q���Ķvwj���#�/��z�����n�(Qi�gztɩ?}�����?����j�yjp<�ne�T�V���(���̘�Ţ�I��-�d5K��' ��Z�t��J��W�K�j�m���Ev��:���:�%��|
=ݤ����0�#�ә������r�
�d���E0b��4}
G�%O�����������۷�o�@�9�6�M�񅘖����g�L�Q�Tp#�T\�W�����S460
��T�I>�4X�ao��{lV��5��P���A`V(‘���L̘�y��=��92&$P)��^�r��~�x��|�+hMpy������"�"8����Rgd~vrx¾�f�zL<R�vm��S�V{���[)*��sq��}as�;]=5j����l����R*�+;8N�砘!�4��/���RC��2E��pWΝ�z�i�L��ֲ�/h癨'ƆEb�<ά8>�<��Z���6C5�hj��n�Q���MĴ�x#����m�B,�E��a��bHX#���d�����)�}���d���.~�������o�Zt���~�b��A�O`�/ZJ;��[І�^�Ѻ=��Q@�����J1=�7�D��j��gI%�g�Z���>�m#{���Rny[���fP0����#Ug�B�U=5"\V;,�.�&2~/6C�,
hz���H��: ��	I���O}+���GxD�-x9DP���
���*/ �YU��2�O�L{��h>����l�ó!�fDo�U�"kM�>5 �w���OH�秅�:K�i����?x�7b�Q?8����쒠�̕��@�{)a���A���속���3��}töC�	�
�^��]D�)Oȳ�^��&zļb�I0�~_Jq�m�/HFy��T�Q`�����،$���~�z�ץ&��1��v,a',m�O��T�2~��~�W��\�C$Q�����J0N
��(��$�J�-����{�g(w�����o�����]���MI�l�J&,�6|�p%��}��4~[�pf�^u�e�S������RaB�K���5%�*�DNNy)*l"@�h�M4j	ܸ�[�-)g3�p�, 7P�$���8z,n�2'DĞw�;��t/���c��J�X���߰�	i�Ndj�W`6&f3�/����$�L��]�K/M4�2Oc�)H
��8���d�$�TCtX��Y�}[)m�7��~�sm�ur�X�-�d�T�+.�0�u�T�Б��ܱ�c�h�d�H3>ͩ:�j�O.���TNW+#
-S���Ճ���5�o���;ͯ���uiWG��+Y�a��핡�"�Q�SY����c�u���繙��5V9,^�_�mX�������ۯ2IT�Ű�"<IK�e��� T��P	�
ٻT>w���<�͢��O�l�r�F^`1e�pk�Z��m�L�h1p�b/��<�A�p���:��BCF���C�4B�LR�hc$a5�4�ZuV��:�)kЪ����!���k����>;yJ��w��;{~>��j`j�`N���c�}d����l�b�+�Â�x��}�-�7���}t��k��qz0�7���F%7�o�c���E��2g��q�O����:mQ��t�n;�8�u�}Yo�]:��O���`��Sܨ�ݳ']��'\g �p�5�@�k�u����QE��E�1S�~�����j�5P-�-�]jЬ/���lLsqݎV��^S0�^�a�ã�xq+D�������o_<�8�P0h<~�5Vu�s�M�:\���ɜR��Z��|�vg�����\Aj�)8ذ����+\�VI�$8a��#��Ui���Z���vWxT�C,cdv^�
���.����'"y�}0����*_C{"��\��Aَe��fS��!H<w��0b�0�����@#%DzU�C"��#�iͺ���`v\�G����8;0(���I��8���!��o�
i
W���Ӝ#5{{��G�QT�LlL��D`�lR�+ȃ�g+o6O��dd��
v�l"�q��a�s0��d���X�Oq�u,��C/4�eM��,�}��{./�@�/*I�~��z�&r� �5��zm��5zB����DQN|~L����ߤ�&���	�f=S���ȕ��|����g�R@��h�N��bhqW�@��A���Us�ck‚;2~��Jݛ|�B��|��jp��OS�����!�.R�2���-�k�p�!8��X#�EiwOh�{ņd-TWNl��n�p����;��1��f=L��G���RኾU�;��+��j
~:���p�[�6�!�r��Snkt�cH!v���٧=����<��jxӷEaXܷO�3���3���黎Ղ���{�i6G�9N�T��\
6^�ص��Z�2{(��ܟ��=Q�ø?Y��{��/�3m���[��r1�����'�o�6�՞
�G�U߲7=i�"4���$-�kE��	��!�Ld�vp��f1�ޓ�5�����8C�Ƶ���+�L��W� �q�vC:�l�
j%k�N,�P��UG�R�T�*�,A	��U}
!�?�	�`�!t��*WS�B��Q]�+�T�[(��g��3�A�E�+��XZ��+8x�/y&�M0G�ϩ���Ҷ���ۥ��k�M���fc<~�/��s۳u@*ـ��%S��;]<��(n1a��̖�Mr���;V���֜���\�4�2G���'���dY�G��ܦ9�y��-5���Vk�Y�fz����
E4��n���v��=4��?�K.���x[���Q�}�-��lL��怵�6��p"t*o��|�n���9I�ݨ�)��[ ��J��0��a��пJ+m4ڟ
ZS4n9����U�<e����9Ds����5�W����5�aa+B
{��\�kT���X'=t��	V��Q9��X��+�)T���^"X�����qm]	{AK�n!]�;�
��`2�v�ߦ0�x����u��`�R�n�sJo�L!� 8l��+��Lk�eV��JK�(n"�� �3"Yo�'���ХŢ����'<�0+ɒ��/�L�K�g� ,Muj[�JO�k�S�[!�"�YI�b@k�X�C�zX����tV<��N�� �cgT��b{�6�\d���	���l|V.��sõ@�n��w���p�`8N��x��
J�s1ķ�K�c��Ws��h� Ɔ.A��m[���6A7@(������2�N*��2��9�P*����1M�H���X��$�jX[|�%���;���ߗ��"��łg9~�7��"p���'�ZB�F����fn/ܲ����&��WG���5C��U	�_��(y�ٹ�'��y�mr��{رWj��_�6j�}�a�Io�AKxl�
z/�MW��N��3�����s�����]��-a:����е�sKp�)?�k�\��OO��]�6{��vu�ƂkO��;�OŵL��ŹL��󸷏E�P���S�F�җ'a�g��+ƒ��k�ٝE�k��;�=��PBP��x@R�`C�a{��a㰖�aT3���R\�G1�@��nb�[�t��PK��VS̛��g:	 pkg_resources/extern/__init__.py�VM��0��W�zI–�
�@�B���U�&��"���!�;3v�ܖ=�J�̼xfޛ�<m=�p����6���6�M�	���Fۻ���
б�n�|z�	^�x	'����-���R5R@/�]7<��	d���tJ�����l��!蠵�Vk_)q�r�F�h����J���v�n1���p�n�bZ�̏��G���a�����Pj����C����5~'Y�n(K\M'j�3|��lYm�"��Xm�a�ܡ������W�L���K0��X灒>�aJ1/)�T��Iyn��5��@Vfg6Y���I7}��I���.&�pılm�u����Az��{"l��=�����E.�{��`/�`�_Qa�d^�gEA,ճH�P��� TC�!?	�GԒ�j�{����F��X2�iьYx2��� <E��Dű�zG�yM�5?�]1��U���ֶ���G�*F�b���Do���#�͸�C�uh($��S\�P2Y�+cZ�hya���b�'_Z���~�k4b?|o������"vS+�ۭ���W�s�;��O6k��n�g/�Yo`{馴=q%��)���j��25���4ki�=0�`�a5��Z����c����5�F:o�g2�۲���3fk��"-�J�E�s�g�^�c,M�]"'2+��8|�:�7+�P�فGV�Hg����q1)�|v��>ǭ��31PP�� 4��KE���`.��Xq�h�e[�姾m�Ϳ���r=��V���SS�.����f�TԘ��軠��m蠢��6�ޡ�כ�@p�J��<*�1��]���Fs	K<�yj�rn�!��b�I?s�*$��v�^E9���PK��VS��",Th8pkg_resources/tests/data/my-test-package-source/setup.py��-�/*Q(N-)-(���)�B0��L
. �K�M�Uʭ�-I-.�-HL�NLOU�˕�g���*�@��2��RmC�JSu�4�PKe�mW_��f
�setuptools/__init__.py�Y�۸��"��u���-�`\y\��� �C?���h��,*�����o���w/��]�������/>5��ڔV4F4;%�\ۦmta#�1�(d�U_2s�
�I�y���|>��6�9�My�M��P��	�LZ5[m�5�6l��[�e]�rkga#�Iw2�'�NյΕW�4�x����x�dT��~������a�	��1�w��L�˛����K����j�I"�z��մK�������P�d
Gy������jPb|(^0�PU��;U�V[�݃)��4���TE���x;�DL)Z������ò�8l���!U��.s�>�˭���R�ʼn�#��J������l�6�� �Jui���7���BZ+^�^�^U�2�U�Z6JHQ��F��xujv�]`
QՖ�8�f�K��P�>u��˟���n����6�
�ǝ��*J��P�����*^,�.���:Z.�?O�5��ܯr��%"�,�u��ЖSF
�
��;�<pԸ`��uYg;�s2	7%B����ٝi���۪*4����6�>�
��0�NT"~~��Ƕ9j!(����:z �C�|Z�UU���d��d�`\aOe#?%Ѽ6Y8	�?�����3/�ۈ��V@�"�%]�Z�w�X
��g��a�їJjv����k��$��iם���G"F�!6~����b(���/�ă�Y6 ��Jez�,�)�S'A�{M��'��T��K����=D��t�6R��Q�`?�U�6�F1�����W�A�a,�j�]TPL��&}fI:�9��1�B̑�XN��ں��Y�H}N}��iu�$%M���L�k��3�Ŭ�vF�$a�`���e�qJ�[�k���|���eP�2:�:!���Q#�f�.Tr�nJ,������9`��669�b{Q6�(̱��ޮ~�ۡ(��Lub����o`�$�J�U�`�2U�\����w�c�G���ltB���
4n'6ߴ8�|�"��[��2��^Lpj5A��hG�[y�Ī#d��LŁ�U�6��	��x��ՠ"4��<C k�潓���BBo��pe��O�a�/��۔B;xm/�b�:�P��e�.r�j*�����.q�c�ht�A��evNZ��x��R����M"�Uj��Cz<��z@�{�&�Dn���@8��!���Z��q�x�L���Q<�,��g.��?jtv�K.���,���F�a�#��j�n�>C�Ӗ<Łs�(E禛4M�S�x��q
u��&��]]_�$JTQ�5j{y�f
Ҍ��z�Q#��B�����Z�$�.�>;�;.�P��a�K.ȷ��S<�b�]�~��j(�:q���ū��z2�m���k�7�3Ly�����誄Ng�4�<�ա�f�L�޹���4l��`�+��
T��[4m�`<4ァ'�<�mښ��<��X�ŭ����蘔����pՃ,������]qpt�dx���lxj�1�Q:�s��S�gj���	��@�tK�`e1u�P�@��R���"7f��<�\x���%�CHt�+���v��eؓ�9f��;^��sVn��cr�}�p1����Y���,C�	9�}p
g�s\�&�A�cE{������U3N��q��WO��c2�n��~.9�S��{�MI�'u'�f�~�s�tt�Ck�RTȍަ�9�z��}�L\��h��96c���Зq�<��`�O��C���iI�u;�	%�J�X�0�}@�&�9�q�#����zȾ#bQ��$����O?�__��͏rO�-
�Q���S����=�cVR*w�*!��l�T���pbc�e���t.����e�|8����H�"�lU��%g<���-��:^+��ᠿ��3�I�i[ԁT����j%^����BN"�0E]���g��✹9���qBm�\R���'.	���@S�Q�`�{��@�	��7$|����@BU�����J����ZyI���ȶhV�f5��6����{���$�q��0����C�Aw����j�~\b��uK��Yb��FA��:;���#���kj Yoq�G��b.�x�\9f�_y��k}��	F�48�����:¿������dґ�ښ�r�A遗�2lU����N���Y�b�oh6�����4��m�AcR���|��%�K�$W�-@ ~�Y+DB��% B���y�����t?v�_w��^I�������N��\`�8�p!���ieEꊇ�=� wԧL�lzcG��3f(T�~��}���]�<�DZ2�>�dT+Jdڵ9>{z+���ä�^��]=�����o�{�CAs�B;͹��q�x���[Ù%87�_�Z�6DD���َ*So�ш��H�ަz��[�=/Wn��<\��0��j �q���2����4�XY���/Q�"�(�>�����a��y�s����ֽyY������]�%0tB��׉���b5�b�Ɲj-V��D�==�����
���g/f�8Y���YŁ�7��\4�v般��>�A��j%�
���c,�]�T���F��Q�u�r-Soohu�Fg�fW�{n�]��Q����xI:���PKe�mW�J��"setuptools/_deprecation_warning.pye�1�0н��2��8#� ��Mj)8U�q{�P�/߃ߗ]DU�R�sI)��L'�c��n�i�6Ƙ�gT�uH^�#�?�����m���mb]i[$��2/�!��l�	k������޴��	�w�Xc9nO~PKe�mW��	�	X	setuptools/_imp.py�Vkk�0��_q�(��5t�]S�ڍaGi�:��d�l����G��16H"���s�����)9�� k�T�(g����l����*dl�D�K�����+GkP+R
�g�,q�.��B{��\ֿ�WA�q�h��v��+ʈ�x6A\nN��|]fu�K�٬SY��󼫻t6����
'���9�_{�4��N.g��%�Oq|v3����[=�N>&z��ĩ�؁M�_ɰ�>z��P?�W�ddB�0n�%K��2�2����GPP�B �$��c;@��DU�9^;�����v��3�ᖽ��B|Lw��~�J�W�V�6��	Ȫ���fkM�y�?�	7aT���o���Jc�7���7̘����o�W,^e2-xn�W,�Ȕ�������Ս$��WM��Ö���c�~k˭�v�OSʨJS�N4��Sh��yЄp|�����&�cf���@mJ��U�����)�H˥�E&e[����P���5��^8
��h&�V:9�̙7tN�i���K��qh�V�[��b8u�8�s^!�1�{J�4 }Fj����n�w3v��O�e�ð.�<*�<�O'��К��Mم��![l�Lg7��6���+��mU/��omL[H6���^<|vw�'翆��K��[�y���e��F�����6�k�$��Wd6)tE!�^	4��p�y۝��6��G�e}	�]�O_�����M�)��X�̑|Pǵ��`x�ْ�'޻FL#��PKe�mW��MjO�setuptools/archive_util.py�Yݯ۶�_�9,��.��>��eK�C�6-Q6kI�H*����w�!)�����
�@pm�|�x�;T���[+ki�0�R��'�yae{b�j�2����(p���l���F6�Җ=ˮ��?-�ӟʄo�܃��SF>uܞÃB���򸩴jX)�E���6��-<��7N����Z��B��5��RjQX����~��z�g��g۷/.{��m6<�<��'��x_�=��Bo3g�m~ԩ�Ϣ��„�!��ݗ|h3�9@6�MQsc��Po:�w�ۿ��.۝e��g1���v��j�Y;1��Xi�h�
�z!�iu���;'�
��0�\�^����=�
��+Д�@��s愄�Z-oD����C<�}@~P�w񖜱C0~`V���!c�Zsi;��>6d�0�q`�0Ϊ����_0C죂���F��܃��!#r�	��-���t�����܊2�oK����+2��B&-�z���e�[8��Ɔ�t�HV�U�x�ř5���P�@�7�"
�ƀ�lS
��)^���\dG��[��b���
��z��z4&�pE����s�*2�O���1*扉B�eƘ�Ń��;��3�NȊ���j)�̅�r֪��h:{eF��-�,@$D�(��yj9�&�f�L�ȶw<�0S$���*;)X��R:K��ލU;�<�Ƥ&���B�-��}�-���A�@OH�J���<���2MLqzXЮx:s�&�N��c]�e���-S����]U?�m}�4�c3�m�Qe_���
���[;$22s��Z#xk�yqSu�����8�Pf�!^J�B�F�_��JzlLM��5���c�vr[)MU�T���:ve����
�"��l���+�,R����VFL�g/͖�:Š�ƭe�:7b�S����� 
63`G�*�p��/(é:���q��3�;�M�e��[��eer�Z�4 6l1�!�ۗf��4��MU&�/��=t�]���4>B>ghҏ�2@?�7���GFϘ�r���_�l�<��0�t�f�\3Ɂ?��T��n �O�--T��a��Re^"����b�yA͕z�[,�?�7Y�\�7��7ە��BuW�|b1(�v*�����79�h�>7��$�8Yy]
�
����l�u��aK��M�'!Ǝ]Xs���SWs��P�]?p��r���+��`�W#]i��'��z@sMp��쾏|a�{��RI���lz��[
7�$�����>\·�I��.�י0��Quo��N��?s�k��Yd�́����9;E�]��Pǭägii�~Cv�P""53}c�p)�ub������Vc�3��TI���3K�/����[!zε�eqe)LDP�h�����;bg����*�p]H�Ml�o�Ӟ[�ݎ�8�
�K�7Zb�}Ǿ�v���1�8�H:��i�jI�0�GJ��+�!C��:�B�7�9
�=V��"T�+�e{14��4�'�Cc�b5�<�0�B��b��>���	=��T���Rm�b�M�NX���z�0�ŕh���Ϊ�8���0�‹��v���I,���7���0��%Y��"���p,na�劾��T�OY��� 6߼4�i��2͗�44�¤�W�
��u�*u�;z_���z8V��-��w�!!A��?���7����i���
�P������� G�aH�
\,1m�3��1�O�_�
=��׼9��}Id�)Γ69��̋Z�]!l"�{��I}˭�6H'�GI0��;-j���P�[:d\Q��[���=�P��O���X��=e�g��^�ۃ�[=�ޠ36p���QL��߿��Cl�*E]��d�d<�����!�����L����fv��3�_�iL�����P�G �L�)$�pM<�^��_�Lg�B5���pГ�XW��
�����c����Ŭx��_-��U„ۋ�{���=�Wl�`�w���+���Nq� �p��f���R�J��V���Q����`��+ 7��o��?$�b��y@��{�lvU�fY��/PKe�mW�N7�`((setuptools/build_meta.py�koܸ�~o�A�V��pa�I.������p2W�vy�D��lo���ΐ�DJ��˵@A��p�/�Z�^�o?�߿�#�u�dA3FZAk���TA�A�.:U��q�jBI��$B�U&���9)y�EI����"-K�[YR�:_�A�X�r�P�{/%�g�TKD����y�1�R4���zM
!�D��dk�c5��� Kn��Z�@�"�F�%�Xݪ5i���̐Gѕy��7̮4Is l�Ky]��8>��@"����+����Y���`蓊�{�����G����^�{Zk�h�a�$�Z��'�ڣ �A@�˄\��p�IM�,�5/��>%��/ �6!�FH���DޕLF��SY���a�Kx�$�s���@�n[b�ٕbKK�@%��
�$U{��2�@�ۄ�A� nН����;(���ZՃ~�Ӗ0��@������=0�&�v�@�U-W���Ōv�5�@�Z�d��J��9���T���Շw�t�K�bm�r��x���$���ȱ&/�4�.:�y���մb͎��u|���ǻ��q�m3@ޡohH�l�P�Rp[�Ӗ��dcn��ʣ0lFy@O�� P���@��$���e��&�h�
�o��7�/��)���e�����`�Z7a�E%T��e+�YͿ��վky��e�Omɷ<�zÂ1�'(-"��a_��~�*������Kݴi��I��
O�2\��5�c���s�2?�f��4-َf�4���FE}t~+���&���J�e��5��ۧ�5hyAD�@��!M#��bMT�2^p&��1Y�,��
hv��~BH���dx.q_:��f{�9�B�$��T��+]��6�^/xB䠉�`@$)W옚|*v՟������G'��"�A!�Ek(�e�+T��5%t���s�����Y32��3孓tL�fxJ)�w���`&$�.05� ���å��Y������r;�	�uBը�Z�}6��ad���0LPs�
M��}ۄ݆��X�S�Y��̵���=�i۔5��s�CVg����������t��9A#�Zuy�C(�XnLx�$���@�ݖ��-ǭ�|,DZ%�2��(=����90�FZmsJh�JuI�C��b�?�"�%t��tͫ�圶,Uݶ��M��:�-��X_����c��q���s� ��	W��,xm�5�8��<aEK1XS�R�)f¡�\�������"�)��b��ed,��B�ш[�s�#sk �S�/�����N�#�I���SO�^�sxc!�:O�[�f�a_z�w�w$�ؾb�=� x�B�.@مQ|���kG�5}�=�%*��i#��j��No>�\�%@�=#�]�@����iW��VaT�a���Š}�cԭt��Ĩ���XYV��X��.Q�<�I��k�b�ǡΦ�1�k_�Џ�gp�Vۢ^��e�w���T��(M�`^�<�׿��'paU�f�s!t���n��&�1�M30d�E���F��,�uq�1U��@;�P�{�U����<�>��"�x��s�	���D	���"��[��6�>������hԪ
��~k󑹪#ϯK�fnb+���
5�a�5�Q��>`B/���V؄�#�{c�:�/���tأoY�Ș(�!�f
;�
JB��juy�l	ڮ���P�45�9�K�e�y��\��ƻ���ݣ.���M�6F-�����1�G1���^$���3\ԡ�}�e�U(#\�؆��o�xMJJ��&�qj߲>WX��˨���Y���B����l�6��;���pg�q9�e���Ƕa�	���h�D~�+����l�wq���{?Jζ�3�t��94��v-3�#�=D	���o/4"4��jF,>�p��
�V�Bk
��	d4CT�z��bruE^`�x��]b\#|�!뛂E�x
���E,�[�����\����u�|֠�a�1-��i�>p�B?�6
���k��W]�NŹ�9��N�����ѧ������d�lw~R����,���%g����%�x`sSx�Z�ɨ>T�<����K�e�JƖI�]
[��a���0��Y���ty6��6	ǀ���#�fS]帗:�
-����4�_S|:N�Э¿�$v�U���|T�Aq2q ׺�1>f���T͜aP��$X�f�p��z��*�"3C�cפ�����j�7v6���ҏ'~:V�hRR<S��G-wFG) ���ڜXv��]�늓��h�r|��ۃ7�3��|s��h�CM�������2��� �3�F�G^����$����z�-v-�O5J�2�@��\2��c�E�2���o�W�nj3o��L�[��t3O��>�����m���h����h�����Tx�aV��O	�u����)S��f�2���
X�쾄s.u�49��>[��'���8:~�v���rc'�~2��7���e���T�(���'85�P=ͤ��>�G*�T��M�q���%.������2���7�3��=�u3&*�~��<߱a��EF@Mj�2�a|W,�Ӛ�j_��Q/]���:Y��t��[�c&���"��J�̻�ZА�����2su�:xP�����5y��������^�|}O��6S�����<F����ߌ�����v�~اt}��/�~F��3f�|��r<O�;�*�3��S��K�}7�����g� �μЛQx�Mz�b�,���kQ�T�HĒ]����
�J�U
48z�����?�vlb���1���@��gp�@p~֐�0N���(�@����ظ��!����&�#Yg)�a ĉNH���~���3���I�?zR�!і
���G�B��/���'�`��H��؍f��(ӛB;U琬HdE��ާ!Sl��EdDI��	Ȃ}ِ����mWY�L��B<c��Ѐ�H�c����j'�0y�5�Jh����9�r�������*[�
��3t`H�B]���_�����ak9��Cȝ��5fyr
����y$.87�r��
�����xtY�j��u:|T�i����?PKe�mW�l<
ESZsetuptools/config.py�<ks�F��+f�r�1�j?\��xk�p%���
����(���~�C��&w[u,�L===�����n'Q����`�
�|Suf��Uc���f���0t��׵Wg�q؊z�:YO��+}K4rS�i�a,��Ʃ��#w��j���u7\��-�0T�C?�DC6���S۩B��0Zd���vH�k��tW�l;I����~G��]�}���w�5p��������K\��#Q;Y��V:0W~����Y�UJ��jj�o�f��ՙ�ϓ'O��$��IL�膪Ӎ[�W��W[i���(˶o��̕�6KZ0f� Yb�d[ s�M�7%��	�BߵӍv���f1�-�mZ&�4nV�<"b�^��jr�ES�F�,�}9���p��]�]SM2�T�p0�����_�N�]/���;����d6����
� �]���R�V]����~*����l�QX �L$�����lD��j{���M���_*�^��i�j����*�����x�oQ�����h�^�,��������?����Z�J�Ǝ��~b;�s��b��GqX���1�~�����n�)�|�D� ӓ`A_8�P�۪���x���������79�YD��4q��Ax��cA��`b�~�h�p�i�U�cEܗ���i�"���VWu]j�(�íd�a�����ߴך�|.
A���wG���&��D�a��@"+�U�=Lj���noe/�1����(�h��8#*�~�`[\�YW[����)u+�V�y>�3�A�n�ӄ�����\��n$~áJVc�B�������ݴ[��WR������^�]W�R%�N�3�&��!�tzIKAD�"��ÄT�R
ݭlD.���N"NiL�Q�6�q���= Y�
W��?9�Ţ�C��$w��F)v㰫���4d����w��q:��d({�0�!���e�<��:�`Ъ^])2Qsk���5�Ux�9�a�3�y���J?S��"��=�)2�LDS�qQ���a<0�����	k����ѯ9
5��7���r
g��H� (�e�咔8_ c<3{~��c㘌�l{�6��rQ� �7����CwH��t�����I������x��(�G���-x���h����,�g��f��#t�ZNC�֐��ό)�&@G�r��y)��Cs�"W[�HP0+�Y�C�����xC�8�%@�P0�����8������(���<:��z/��C�`<�?%��Ytٱ�|u(ε�����:A[��7�|0P��Y-|)1Tn��м�ǡ-��~+�*�EH�9<Z>�:��sv8o�ŽY�7f4�-�����e�2���X�"^G��vc9�1�QQ���R���MV5w�l�ԑߠ8�jo���[a��|�&�Me��}q��.`�)a�4^K;Ŷ&C���(3z+G�wvӴWu4��0��:3x1�Y	��(F�*RD�W���J�U��
p�|(���[��2;��b��+W�6�Oѝ��W�o����L�t/f� -�ڲ�P�M�D8V&�Y��r]Bb�c���/�X�XZ�6Ŋ��Y[��J�A��]ׂT�ԾB�\�>0�ۡ���|
��p����:H��Ϣ���i$h�m�0�#[ka���k+E)ׇ���wF���B��^�];�:bw�aU��`�u^Pl�]iʾ&����.�1�с��h�eyI��I2cLq��3����9Oz��e']{����Xm~ck��,�In!yc��}$��EM
����Fc�D���M������f{�z)�lQ�����)t��Gt�!���F�Rb�
�}�+
tBp�#��g��6����;%�H�Q�k��8Zg��@�Q=];�s�����]�=��%gB{3P�?ow�d��
e�-ۢ�j��&F*q�F�)K2岄oHIY��>[�������ɥ<��}���z����*��"�81??�U�:�D�2@߁C�����-��N!��1�5��~x�)�c1YX*m���y(��B,�4T���y`��	���(���V� ��o����]˺�(�z�PZsa���=�|��Z[b.|&$nVƏa,�u�7��s$!�?�{9�.�#�"	��M�*t��螝V�n�B;�r�G�ToE'�bTC���Ô`z��L�b��_�{୯s�I�T0�;��b�����l��>�{	A�R+����G�_��(Hw&���m�\o��?!�[��a����F��\=�!SW5W�k��a���o�$��3�Y�W��;"�,A��
햶wl%�=�R��R2�d�NM���ϸ�:�	���xG���ӌĠܮ�SM�y}.MG�'�xŒD~ˇ�8M�J<�<U�^��o
O�@��.$�e�4�?�($�x���v�4��S�7��#z��}'9gd(�M�Ta�T�tn��
<JM�ݢ���S�CRK;�<{����#�9�?������G���\C&�
��3!xJa���,��b�
��Z#�j��b��~$3sK�����m�c�&�-=��>E��Z������$l$�N�xnD�|�.Z5�P��T�Ax~8���?u��l�׾����Tp�e��}�١/q ����C��0���6���"臭��h��O�^]?G�+��i�^�3&��:��V�6����<i��2�HϨ�Т��J-U�ƃ��;��f�b�.���e��WW��K�R��"�V��01��J��9,�t��L'x�ê��G��U�. |R°ׁ��0�G_Ԁ<{��s�|�?H�ݛA"���g9:��:�م]�)_�?���U�G<��}v{�)ku��r����-bB��o�,�����j���T
,�΢�B������9�ǜ�+Q���n;��!�5[�D;�f[��V\%c66ؐ(���|���c���q?"ۼ���,Ѕ4����A`�z�)����.���ć��v�jy�K�o�Q���=r�4"�s�x��KX��
�s�K�إ+F{���J�{W�{,2CX��l­=֭��tC'��m�ɝS�F�������}�%�đ�J|���o^#������o�z��w_[����#L1��f�9�^���l���'�t�<�+����2h3[��~6�FW�!�N�+/�Ӈڔk�i	��a�1��ƻ��g.�7��C_S�NR����氤�^#'4`-r�J:meL�s�Z�oE��\��+j/��.@���3w|���`�Z���������(��|ԁp�z���dp�PPӢk��}=�sXg�i�ٿe�øI��ƴ/>趨��o�S�5UNNpd�9�m?�$��LU���ۺ��~�A������m=x���U�n!Fh��!6�h�0F��	\�\�b79!��v>ھ݀��Հ���B3s6�P`8H]�S�L��i��t�Qq��:����y*^�z�&j+�)�aWw��@k����B�m\3t��P��|�u1�ڴ;�X@����<����S����E�:c(�&�y�]2@[z�ʑa_̗�ަ�xˌ��X�'6\��H�D��06&b�|:��@���3	r�A���p����6�ag��n[_湯m�!��w���Kgԡh��?��
�]�b�i��\w����i���f�|OlI�]9�<���*�=Kl��SJ��Vl��T���'=����wiUO����V@�'o���.�ӄ}A泡
"5���1"f�"��Qm���4����96]h$���4�h�'-=N�Cu�.��Ai��}QwYE�([�V��f3RCQD�<l$R��2�)mxլ�����)]��jHKW���>*����g1�5�{x'c/��`�y����D��9�6)�D���Xy�<E.�|֦��eדY��⸦s��0=�q�1q�� ���)w��L����T��i*l�i[�nM"�|¼3�8/���6���?�%�bDesp�e��y��[�6�׀
��ݠ&n��f�":�3m&�i��N#H��Aj�\��(ӝ1:�h�鎆�J��]}*^
���Kp�:�&�Ѱ�j ��Q�~U�0�Y`HL���M�!7_b��-�$���F~�cu���6~>���pt�t�]���3U<S���3�'����TSչ�����i0[�Ql��_7�i߆��Rl��<@�9�aRW�MB�ZHU�YOP:F&�&���Q_��3����}r\
���V���U��k��=�(�&Ƃd��
@���i���z�5Ǒ�s��[�2�y5^c:���~�|�y,��/y��ɚ�9�;KZB:��θ;5�4�l�����l�Mig�n��
���Jd��˜�fj��B�w�j���>I��"���| p��|7����]�D ß$�"�.��W��n�):��~��;�Ў��	���j����%5}^�^P�(
S
��ĥa�e��͝v}���9�G>��s������@���L����#�%���DwVj:ɼ�����*x�ѝGPA��:p��3������0f���
cs/�n��f���ۑ`���"��J %!�H=+����n��N�oACO�8�t��J���q�c*�h$�}�b����W.����6�!"NWj��{��*ñ���i��COٵ����䩭�dA���&�0�t\�	Y�����b�IVͯ!��}�����s1�B��V���-��+!`:2ћ8��^�P�d-q���L��2�8�_A��	��^�:c�)g}9x<���N�	Z\����𡞊��:���j�OZQ������+�ԭvʔgr�H!���`?Q��G��O�E>w�.�=(�S~z'@�/�+uM��Z,�7�$:���s�l/�`y����G���t�X�����|���������xL4]X�s�=�:��M~a�u�낔��ڔ���3n�)7�T�	3Px胏��YB�nj{��H��XClT�N�8xxtWT�Ø�A�=�vb��ӻ�51��\%�m=t�����S�߽�A���te����z�0�CHs�����]����^	����z��{�{�=�9L��ؽaQ�VJ|�s?�EP�v�n��^X��vI�B��^��!^6�<r$y�2cN�-�����C��0�#������
X��R��Sq����"4�K4̑L��XC�s�"�e_utx����K���A��,F|���<qd�9���o	������V0�"�ᚳ@p�|X�M:������.��*b�-w$���2�ߚ�,7繄��=��OL�v��{J�����<�k+,��Mk���r���4j�G>�^�!�}�I0k��$�
�����1�=��QO�Q�ƶj��o��_���'E�,��ϵ����R*K��`Y�>g��D���;Ls��u"�o�1/�	�fI�'�ᖹ�
�D�>�vxl�]�-=fy��{�u���e���ӎ�~�B!�ҁ�z��U�!׎mr�� J��#>p��5ǚ��x\����R��(h�:����]��[�4��y�,�enƁ�&�dz�ݺ�H�-'��Lu�WŰ-��G<
�h<�o�lV]W��R:J#�5{�ՔQ�J?�?F'�q'���E����ۜ��ͅy��9�H)�̯E�� vR�X���j���왂�x;��o�4�}�It��^�qc�J>d�m���<."QD�;n�l�|O�(I��my������4Vv��8.�#S_a���r���s��D��(e.JB����u���0=���O|NEe�t<�8�;PKe�mW+JΟ�setuptools/dep_util.py�R�n�0���� ey��z��=TU4��klkl7����&	d+!a�~�lg�1(�۞�1�@��rCg���6�����B�aR�=�Գ��Ť/�Yw����an�ԅġ��o�;ş(`46LĂ5�d��6D�eM[�4���8�{�#_��1䑂o~U �n�{C�N�rgq)�2jMZ�2#��	
#d��/�f�0�%��2�w��	X$[�M!��< y;��P=<z,\�O8K۴���^�*E�N���)�%��g.Q�WS�t�k��+�i26�񜷷���Q�Wԑ^�-�o'����2�ꅥ�9��D�&Δ4�0�*�<�)*���m�a��؞�c�Zp���2�4rF3��$V��a}�
���͗�W����#�n��k���d�B݉wL�PKe�mW��f;zbsetuptools/depends.py�Xmo�6��_���$��~ږ����$H��[W�D�\$R#)'ޯ�I���t�|h-��~�ܝx�Ie���w?[��6�c)�a���pRq���l��
ot�eJs)��qc/�/�p�.g9�.�\Ty+��a+r�k����������������ק��@���E�Ӧ�s�&���k�g�KV$����-3�)s����1��hi���3�-�5��N,룣���SL��#I����HE82h|��-��)�raYT�&y�7y�ړ�O��^A[p
`ڰ*�]��Kٲ�޲u��&��8il}!\��j��˓�x��
��KBEu(�
i썓�O�ޏy��֞&=x��P����)�+�o���<	Z���<���<������,i��e�Y��]�B�RC��2hq�f�W�^!-� V��T�!����Ԉ̳�C8��<��OuB��R��3�y�"X8�Lޥ.1ډ�g�$�EBt_׼�L�fG����c�ꏱ����@b�7{	
ǿOKŨtЇ|�&G���^�\\������Л�Q�Ѿ�����O���(K�m����+6An�3`F�YF�xè*7$��,O�rV۠ײ�j��e�޺7��5F<�����SM0�n��Bp�&�c%�9�,-��Ҧg��,��0�r���ބ��p�����q�K�nsT���TQ]�$2�bq���'K�� v��E���M �-�u����0'�!�#�8(��v�(�ٴ"�-�!W�Cjؠ/(B�Y�Y�H��C{o��5{(Ygș�éRR2��hZ�~���̩
S��U3�r�+��ē��=�"�Ew�m$Ϳކb�:�ޭ�7 ��Y7
2��X�D�D�Ce<��k�1|���"6f�W�+�?�����>��$h�H��[�l�Q#��b�v�tW@R�|z�Oa��ϖ
h�jtk;�K#��8k�=����ϓ}�<�~@)��\
��kلfq�b&���$�()v�~�9����n�8ƾS\�؏���*�\R�2�x[�/����nF��]	������d0zu�gx|.�L�s�B��u��	N�L_�Ă�Ã�q��<���䢖{�9��_�'�7| �lՈ�k6-}6�fd��7����
Z��.Q���p��%��`1N��`+X緬��@W��c�T�[�N�X�dK֣�TZ�+͜����j�q)ێ�׽U�!^�0�2�Y�=TxN�eVc3�ގ
@�4����7tk�'��qL���J�^A����˄�͕�0	��t`
֖��������W�(��ۀN}mc�
d~���q�9��&��W��Q���-���?�!�g��W;ń��e�R�󎪙z:��"�?�d�:�-�,
�qucNG�N5DW����
�n~+p�C�P�Z���a;)�mdAv`E�(���G5�>"v���^��.���N�v�p�H[Kr���4�x��4�h�ޝ_�zycd��ڰ����Y����ВA��8t4�4j?m�LKna��x��c8Ãġ9:�e��I�Z�KD��DZY�z��jӉ�e�R��������yt�܃�����˗o!/n>�ً���Y��0��C�w����
��aU�^�>[�"����3������kx��H��t��<�����?��S�b����<f�g�C����J�����O�Y�.�uP�E
l���V�NAN�T�[�Z4vZD�&]C
�����Ǐ��
�`��)��1W�L�w
�
c�	K7�B��C���l��r)������M�tk@t��lx�?�9�{5�X�|�{��ߘ�Z!�bFA~��	�3��_b�8��oPKe�mW2�
˹,O�setuptools/dist.py�}ks�F��w�
��Ȅ��<��jK��#qmb��H����JX����.��~�5O(�ɞ�{�*���������w��g�dQ/��8�u�ٟ��Q��u�''�i��l���ﺲ�ҳ��r���.)k�[�o���ҿ���u�T�]�6s՘?�`��l]��.j�y�Y��o1�MQ-�VM�q㿉�@�t����a�����u�G����۰Ū���\u���
����uѩ|]W��;���nR�������!I��v�M��~�~��=������-�F��&����q������ٷG�cQ��j�-Z�m�V�n�-˅`�6�%�F�mq�r|��ʵ:
穚�n�G�9��_N��W��m��!�7�ş��"W�ت��p@�m_.��� ��(D���x[,.�s��
��f��̡�@�lܗ���wU��N�
�TJ�d
�GjۨE�4��w��>v���g�s=�uY-��6ow[������.�^���wն����V�%�(�g����m/��F���Y����Y�(��Z���y����8�ܬ]�nբ\�@�tr�N�6���X>ɽɏ�vˆj���/�ѣ:��.Y��K���MV��6Јٺ���.�P�Qd||�Q]�,�"�ƭZ����XhTt]CϧI�O�ɳ�R< �����a8�&�_d�Ӊi���4t�\���qٜ����X�SUw��r�̾������%��哇3�P�Y�=��W��Zx�$���ZX2�&"�t�ຄA3��ݮˎ�

֪ӣIrr�ܷ��yл�{g�Ϯ��[��*�Y��x�k75����������~4�50-�j�d�i����q2��זtZx�ƒ3���R���P
w4��*�;�K֞�қ3Mys��o����󟞥=� ��D�.�I���M'����z2Yo�C�&��{�›�� �mj�/�����f��m� ���
�s�m����hy�3'�xL����vv��o�)o���.�}h��$��x��;��(�g�'"*�׉G���J���4!1SP�T#C^@���1�>::$9}q��҈��g�*6��:���Îu��=�L�%06о��o�=��K�;ɵJ�F!��(��]wQ7I]����.O�6.N�T����Yh`��-�Ψe����kn�|Qo�l<�]�U���%$����
�|
jZ��a�IY!�Y��Œ&��8z�M�n�axDgJp#ɇ�cpnN��l�8D��$��{相�Ld՘��}�o���k��k�_�k�LXw��ԕ%[���fc����[��Xm�J���N�����_%3���S��͝���|?��-n_��~d��ۮl�a$u�PI�6�0.o����y[�UwCo�jx9S0�$�b���B��XB�sCi9Ö�6ӂP^��PTZ��w�tqI�mY6���rI��8(q7�v�-��ԝ�_���~�t�	��%Ɲ��Gϓb7��{_ܟ��ٗ����
8t��2�]$�6E	<�#��t��*u͚<^�@i���r4��n`��4�k8��9�q��}��4
b¿�j�)�@�$�h�����h8P��Γ*�2�:':_7pE�+H����8N���}���n+��Z�M�����'O��VM~B�����;{���s\�M�%��t��vbb��mR6�ś6��Д�gs���>m��O�_�Q�i�x.����h���ݍ�ɤ���2S�6�6�XC�nkfi�Jd��������I��w�w��r��]����|<IƆ|���5��3��Ĵ�E]q[�`lg՗�Vf����>�w��M�L0#�
� �� �W�v!�/y�������I�*�g��+(
����(XS
��D\����Ax�U�7/���v�"��ǭHZQ�}����Oz�Me���v
�-����8J(
lj0��/5=`�������ԴtxCkfNtg�
��t�225\�&��x���	f�Ъ �Ns��jr�K�-8����3��V������s�*8���L�Z}1].��4���֫wQ���oK'Pnu���ӟ񑥑	�{��O:���b`˻�V
��|����^Cs=�A������ۮ)�E"�3w�śƶ��=Ɩ����5E�̞�n5�if����5Ι�K�'&��Vb4 �8jaIT�@I|��"
��-.��RL��T�%yuXv������yf��q-^���22ݏӷ'i���mz�@h�m�Te��Bm�d�k*^��M�{���G{|&h�r�m�F�@coG�6�f���v 	�d����:F"��D�Qu����O�	i).}ȉ8��<՜���,�>��43PŌ�Ѓco��y+q5�XG��CK�zx�[�dW��Ɂ�X���n�eBB�᪕Ш�
�%�TN��fD�L&X���Nfֶ74���zc�r�0y�ON���G4UW�g
�oU��-/��J>
q&�L@���JsD���K�8��f�
@
���Β(n\����El�C�1t�����I��}�b��]�{���#�9�<��k�K�y��򀬂���Naq�(ͳ�t%I�4K=�ЕP~E�
���f�I�Ӄ���}	8�^*PQ�z�v��13�&@,�^�h�Ǡ )�_9�=v'���h��3�?t���mY�[kU!�[+h}���1�qg ��Һ��2�V�E}��X��SJ��qx�i��E�*�	�M��H�n�n�
�H'"�����yK0A��X�u6�K.!�BN�����v�I��{I�sj�9����c�mOM(+B?�c���6=安��ʦ�hj�x�s�}rd���
��c���?�1�����
�O�u��7�����A0��N��l��;z��}Ҽw�;�B�O|ؼ�ߡ�dt�!�
<t<�8s:1V��^�]�D:Nf�r3�
i+��{$PyZ�Zf71�d�Bvtx^lF<�2�[�[.(�7뵹Ű*�l����n�x���3�[��M�M���h����a����y�(dч��83v>-U�+��t��˭�&������x�'P'��D�A
s���J;OMO�@�2L,�({����w��D>������(���y�'�K�3���z���\<ڬx��/�+o�I����v����N������\����)k�~ `E%�����Q�ꕯ��u�bTI
r��ҭ&p���>Z#�!eԲ����h�Z�a8`;r�yl��\���e5�ޅ˙�e��0cB�R�i4{��!�w�}G���4��x�B�N䞙��뎗z4��G�jx���bX4�zkT���q��r������|�6c�9���3:\��p�_���(�Ў�ϲ(�EStj���˙�޿����$�#�3�-v&Cx�>{��F�F!g���Қ��h�R�sB�����t�ķ t/���Qcp�9��`y�Za,���K��Zը���Ե�0i�hB�;V�`�r��x�3ZI*|i2�y��1�::
t{�����I�,���K4�W^_�Jk�j95�d�����}���@�ydHZ�ϴ����u5�,1�x���@z�H}�>��*��;�^ �`�@OQ23�`^嚌�%��_<���u��pX+� ����F	[ �N�d]�`J8,�W`�a1�UYahBu	����aZz
�n��T�RX6�j4��S�
d��y��Y�Yܜ0w"l�� �P���\�y�5�(B����-u5W��4ۅ�b���R&a�z�]G!�T�4qF��l��]�
l��1yBN�c�dASѱ�%��mNa�C�z��9�e��-��ɽ�K����F��?������!Hj=Y`X���
�E�-���*�B��,Vv�\�>��A��K�,�I<lDYW?o��d�U
���O���Ԃ� }�R���S�Lv�v[WKL|%���N�% ���*o�S8��0zA:a����qH��~i"��Ať�o���R3�z"����*�i����G��AX�頔��|��(���ޭ�fe!����$�e�B��`M�1���;�ӆL�D� �$aq>�4U)<�=z��*��V+Q �S��j­�c��C��a�\Ȑ!*��Z`�����ӎ%rnWa�x:��;�Ͷ�[)I�!�)�Taz!�ՠ�A,haZ�^�Dǝfs+rj �^�h�4�k�
k���|U�F�)�"(wy6��S���5�s�)��f
:r*���i�<�)�
8��A����p���jPup��ҩ$��U]�4/����D+}ݔ
��ɂD-}z7u��PcU�n���܇Qa:B̞�>1s��]@��aWnT&���].9wp�A��aS�-�*Y�ۚ8��U1�-7
�d�
vg���v�)���N0+��bqG�2A:�b%�&<�c�0�%�w�d��co�т�\``�n"Yt8�Zˁ&08%Y��T���ǯ*R�X���c�#\ݏ��ʴ&�d�=}����߿��<{��ŋ�/_?~���G^?�S���p�7��ɺ�̗�1�BY����BЊL��[7�8���s���N7<axX/�!���@n)9��S�+!��7e�[�� �jU;�a�s���<).�H��֐�K2#jY����||Tx����o�A��H�'�/��E�)��P��+�1�w��c����]j�]g���J�@>��L��u^��&�X�9�`�e��+��0I0Nyij�$C�Ռ�^��{��c�Lj0;��MϔM}��<���X���SM�4r#Ϝ��\L���Mv�M�%iVˁ�J��t��-bŕ��^ŏ��oG�p�{��h�߽��8��r���)|["�O�ܝQ�}k���nR{�����
�mySם3����H?����~t��f
�U[*���%�&
߂�yz@���N�����H/
tܓF���d�6�mN��xWE�rB-6�,���f�;�I�YX2�{=n�m=_���8��=t
�L1,�Zb��*�GI��9��`Z7>\h�j&���fYb��|.�ewzdOK���R�{0Cӫ��4�a#8��F���fj���a�o�(��Hr�����2���N%n�)�$;��Qt��>5jM�v���γd;o&�k���ذ�!�d�tx`�+����u��2qPt��h,9����m9�o�Ɵ��f�c1Jx��S�A�?��˪�]�>Oi�LȮ���O�Jm����5�!�|_�љ�R�~nP�H#<�z5�ܼsD�ɉ�ZG<��Ȃ�;�>%S�;�}��}7���3��mtM0Y�(x�a`qz{��k#�\�g���Vڪ#!�N�L����4=ƈRh����?OGF9Y'G��LM�<���f&lq�#Xw/�4��?��/t�5���zx���f"}	�H�b�2�w{4dH�$��@�M/�pQT�����l�݋�d[n����,y���V)
=��{|߬{�V�d
�^��|6꟝�ؾX�V����'�S���r$-��_ͩ��J�_�o#�Q�^�����=�-��ƅ}�
˃���Dt�!�Y<>:0h`:��ُ�{a�l��%����0p���8\J
�.�<wH	��3XyE�\�rl�35v���ᚼkĎ$I�h����;�P��z�U�z�Bs�
��z �$:pO����齳^[ <5��(���!�n����s98&*����K-%v���A>��r7�Ҏ;%�(����t���1���t4/�y��v��M�1��Gg���4?6��~�:��P����_�'�!b�����ű��(�߿$�#Mn*q�N"���ی5�6닆R��������-]���n�R�-�O�[o���&Ē��Y��R�!��N�6ti�!���� �g�3�L�\x��']{��sP����⾷R6z���>�yW�m?������q1�i�9�(톳˱�,Kr$")�Q�Z��k<�[��E[3��Z�\�0p`�����g)�:� H�|�R3�(E�9����q��\�Z�����Gd8R؅p��V`�`g��Vd�{����l7!��g��G(��vso�dR��b�����9���q��h81i��0��\��;׽q0�딠M,Z�?��)�D���Mz�S[�������U&�bߖ���{��1�D�S��T9(��@
�\�2Z귘b�9!"r�!,�S6�}�:-�ͨl�o/��Y<O��x�NJp�sǨL^H�
'�+��%�$�Oώ�������*������t=^�O5��=��r01�X�7ZԺj���x	���'���Z��
:����E�m��w�Q��O�߲^�RS�U�ݖ2A�b�C~���#��6���$}J�)�.�+Y�,�EɅQ��O>~v����c�UL>�Ͼ�ߟ=
/��o^�����ASjX݅D�7lP8Td\ǁ���i���€�3 .,�����7��PN�0�{����Q`�����g��}0ND���z�=��U��;�6$��6<�򼚌��M�J�#��֢
e��w:�=T�
oʖJ���U��0�I���-�*>�Xu��N����K��D�`YlqDŽ���Ь?��&����dB�tMՂȐڻy���@����v]�l�R0�&<-��g���R��֘�h�����r�uC�᬴����a��qz�EXoE7��k^���oH�ӣw�J����Pd��Hnj�.�7���ɮQ74ኖ�&;q�	nE�3�bo�[��
��j~��x�Ğ�c5x~�Z����P�wc����`��j_��@��޶��Q%�:\TU�C��;�����N�]��>㹽��1d���u=��fFA�47�5��O�Ac�?I�}J)S
qVߤ���z�;=�эng�R�$9��W�q�N��.1S����(�]�� =rJqj�q'zl;�z��Ж�j�4+)Й*�����ib����?UV;�G�̔L}���������I��$_�E��9�膜&��@l�K=���n ?o�}
��&��j��$?�wO<w+�R��9�H�k��x�4���L7�9ި�@��@&z��ZlB|���ZS�S/�@���,N�J&Y8R��BˆA��} �XV�c�����#����b�a<��+4n��{2�����Y�B
JGal��Li��ڣ���G�ߙ���ʟ��b��/�
�c�Լ��e���ͮJY'۝_|20@�k�e�~	7�.�b�T��$��9n���lIlI��۔�v��Zv8�װR���=ފ�EXmvbd�F<�&�yN��B��������g�`Փ�GF2�ݔ�mD��)s��5���W19��F'��b�/"�e�}rb?���}�Q��J>a|I2K�\	N�þ����^��'!/��x2�(b(���Au�
~ƒ����x�)Z�'�d@��	�xΧ"g�%^ ��_�-z`���h�'U�tS�o_�`�{ Y�ԗC��X��XX"��]��`�hZ�(e�T�9�b��-kբ��j�p�V4�]�����6�?��K��͒����0D��[��e@,��090���8<���<���(Y��bqy��v�����7�+"=di��?������|���7�~��C�M��J�����d�ЄQ����tS����Z4��M\�s��@��ߤç����N]�����?��*ݝ3�q%�ɀ�1��w���.1E^9�9p�~��50`�L����a>~��og9�1�$����|2��
Wu^�ǩC��]�m0p�r�轛�0ʮ�7��=�x'
K뻴c�,�MUf{�#,�J��帇'	Ta�^�O[.����,���?QWE:R|�h��g���zJ�%��QM�%���
C�݌*��"�]L�K��`a��{}]���~2P9$f��
�e�d8�֐U��������lڿ���u'b�=,,�?�p�Zg~D`D�-7�ԍ�C�����
�FFT9ɅE�u�,I�ث�6�[\h���x�$�|j%�+E
��7.�tFL}�R�<�*n���l'm�}�N����WESֻ6Y�+X.{�'��Oy=�����k�[h1���I#�*{�ӆ�'Z��x'�`�0e�閹:?om������%�
�W��0�;�P��%�{��٤i�»E�@F�7�<��M��r���[�*T��P1����un��v����\VGƥ�z���Y'����<��}����v�;�:���M�Y+�y	'2y�sk���2f��ȣ����$�4`Tb�����jM
����-l��<�#Z�B�����O����_ߴ��U`�Z��^�x��;���~Ґʝ�QZ�p��>'�8��PGpa����4�7� Q
���m���VLE=�V��9�g9�Y(�;^�9�dx�2���ԌK�77à��hz�P�t8�@���_��p̗ �Q��	�4S�\�S��Vff������^�4�WN:��`n<7�3_�џ��R����4ߘY�WK��J�|�_��&2茅�ep/}�7����}��/���/�e��RN���}(!$��%Oծ��}?_2���L���8���?���:�y���a��޶�B\�5��Hv~�/@ܡ�hBry/�"$�T,�X�x�!�#�/X�S���Վ=p���Q���U�ÿ�E��P'�\nT޽�,e�S{3�z��6?x�����!ꩪG�B�kvޮ�˹�o(D�ӔJ���S����4[�
-�q@�[H
7:�ɔ��p���r�3��CR��>{�d��>�jԜ�0soP
�?��=�������K��*a#�A��;'��1.'*�C�O���s��D�:b-�0��9��&�!=��=T�q�7�ֿ�N�op.��TV�9e�&A~�˜�D��,�aT��Z�JW'�Tm�:�A�l�vRa`�s���k}4��3Lt��76��N�wӖ�~��M��C Ѡ���?�2����yԣ�?w`{�/D�K>�92��kjD��W�������5�Rc�Kpu�+�S>�c���-�;�R<��Ĵ��ŗ��?�,R�r��U���낳�#�F�W��J ���L���s)�tr:z;:��R�K6�oS��.���u���'�u�������Q^���]Ù�S/ܔ��^�2�H�#:�M
{��*p�ɞ֖��㋮�˥WqURA�
���v';���� WZ���f����5�YWϲ�?g��?���.������l��@�%{u5o9X��b�`��S�+���r����J������O�:Bc�
�P�>�j�}�Aߩ�uH]O�ĹZ� 8y9�?3hq]���.H�E��=y-�Hư��ep��ˁ������hWa P̗̐{=ަl�ft��w)���	��Wh�*��Z�-�FN�H����]��=.��9�h�b�O�E?��BLo�[����wӍ�>����U[7�0�izv���H�n����0�0{wA�mþ��a����%L����<��m&�<���A�����+S(���O�e��5�1�%�Ko�[2�b��lq�n1�U�D!	"���n���ma&�ki�H��9�f�J��q���%�	,VA��	����ٿ�X=:��;�����X~�3��`�_=�gM��ů�
��\#n��T�Y<Ϛ�
���e8��d9�Ec��r�hU��Ħ��y2:f�A�}��z"�����>c�
���.�2�4!���)��\-)+����E����K��[r��5>��
l�ˣ��?�
�1��2q�M�*\X�$��b���fvv#����#ܾ�v�&���L��vK���$/j^��[_���μ5J���+E3���T�x"����4H�r��Q���ϭ����Co�ԏo��d�#����`����h�ﮨ�]QO鏸+ڥ�#������]Q�D\[o?���)��]1�[�+��r����\o�?��G[0��:�T�I���9&�ƒ�(Q�"�"�g3�	����/���~6����mS/�Նf@qH)�"9y���l������
C����`��F�F՞3�ɬ�=!|��c�r(6���+6�Z��i(���󮤅uy�-�j�k���2m
�QЂ�IB�$Y^�)T�=j/���I�>�O�8�c#���ʉS̼��	�*
ߎ��u�د�����b���
���Ym� ���������rj���S�.C���@�����i��M)mr�~d4e
�++]�Y#�#��'6K�@�*�$}���w�����)}�P
��3���E�C#���|���$��엵��|��G�$/9�a��w/�eH����p�9G��R��4,�jwve�E��x��Jե�����S�v�hP�CZ�IE*���w��
��01��9�v¦� i<�����ex�#�㉕Nr�I�+?�Cx
��M�g�x��pns$c0nj�Y����=�g����bx��4�k#�٭��qW9ݲ��q@!ҩ���}$&��
x}[�Ndz\�
�]NN����O lũ�^���ϼQ�e��p�7��*􀾻hB�G��N��)|��X�Q=�Q�
�F-�p?>�3���[��v
��NO��=�脉
�H�r�X����M1�E�����}��I�����ߝǎ�ap`3�ǀ�U���u�C�Y@�\V5W{��n/�XИ��p��C�k�w��N�g:���;�|T;�@h�l<9��pPXQ����Ї��j��l2h3T�FI�܎g���Ό�#�1���]w�$u��AE�����B��FF�U��C��_��N�����,��/�L<�S0��[�=�]��U�D[(�^�LyE)5O����:܊ŇZ2ł+��Þ>�	t{� ڏ(���IxpČj�P�rv�ӊ�/Y�B�D9`�Ny��g�p���˯2o%��2H�t��ב�#~�s�a��	��'x�J޼~��j���)�p��/k�����Tl3J	��!��&����(�����"��t�RQ:�w0�^<߭V���s�ݙ&��U�c�a���c����4��i���t��{�Qá��u�&:8Y����-��8�#[G�'N<۰��K���bE��m��8��8�9̑�H'��S�/������J�CSm�PKe�mW��Q�
setuptools/errors.py]�Mn�0��9�Ū�F�]��W�$��X��Q��r�� ����y�{�iF)7I�s�9���|�4р���M(E��8@7�>!
�#��icƜ�R��Z@ᖲ��V�X�Ƙ�;f8cHo)��{:���\�P�z{~1�����
5�_��.nB�#��(>����|Q����1t��@�ںDZ��Y��JR���V����y�]Q� �"���;�_A���U��^�߂�-)i�
���^R�+�������U�aG�vۨ�PKe�mW������setuptools/extension.py�TM��0��+Fi%`��*��nUO�ު�r�����&���
���\�<�~�͈�h�b!�>��k-���,�^H�v:��[�V�w���Q9�UQ�V�ЎZ]q���e��<Eq��ߐu������w8�}�
^m@=|IN�q'\r�݅̉%��Cگk�� �Q�er�v�K�����M����z36��4)��z�_e.��n��`����;4^�A ��w�؄|��!Hk�	SqR��Hx���آ[���vdT{��ձ�*���^U9M�+g��:(ۮ�^H�
������L��iK)��P"��P�
(>bNۡk��K<���z��뀳
��x��w�)�|�݁�ND����4aD�]fbR��Ƹ)�D�ЃVr�7���}�v`�b��_�G��Z�Mu���b��b�?�:�ސ�H�ŗy�$W��g��cZ�!��YB�&��"X�ف�{�'�=��YͱN��a-qC���
\	7�o.{�@��s�`����-~Z�Ct>J����d�ѦR���}�y��9�i�l�@"�F{�D*�Dz�5�zw����A�'I�&Y���2WB\UmgLۍ�-�F[�p$K��\�V�De��ŭ��5�z�eE�K�f���e��S���qaU#7U���~���v����yJr%N	�K����$�"�>�!'ǔ�����ϑ�?PKe�mW޷Y��	setuptools/glob.py�XMs�6��Wl�%�amgz����8��z��$k$�\��)P�H̯�⋠$����顺�$v�ow��;^�`+���^,�x����Mk����z	s#3���W����6�5K����'T�E^m
�I��
Ǫ��s`������W��0?���U�
����E���&D��?�Z����պ�j�$���X1��I2�����`���spP�l��i�$.m��5ӥ�������7�c���O?�3��@ŕ6vG�`�<h���0����nA����
A�XUo�n�y˫"g�Pff�}L����
�lDş1,\X�̶
�fR_�\�����֘sVA�I��_kX4���6?�mj���ʇ�a�Nf� ӝ�s�@aT�*kB6Eam|GYC-aE9���=]K�@m�OY���.�!?���i4�	>-{"�8���ؖ���իB��'�_L:��ij�)9����⌫�C��m~��
�Q���g�\�uCpJ��dJ!1�ALu��k_]/����‚�`+eL��L��]��Vޘ�q1#=�4o�?0R=[��$c</������ �` ~���
w�u�O=���v�x�/|��ET�TI�QoȐ+�Z�����)��"��G��ι\�A�mDqru33<���Ъ�u�����/;6a�i�BA#N+��Tm��7m<�꧆c�V!M�����tg��$�0�%�\s�R��L&ر�7�)ɰ��%�,��(�3�������M:�B���Ƒ�L9�;�}Q��[�Zx�N���KO����>*7ϥ#T
��UX�Q�,���s�_Y�4B�����*�$���Lj�k �_���F�r�(�E���lM.(^�=e�T���d�V(D�{*s��+:c�9��r��r4M2�5v�rN�4{F�٧e���M���#�A�T�?[��N�r��.��*���h�j,Sފ�ՌL
�a�hT@��Y�$��=#���o_�>|HG/N��]ײ��n�Zk�N\}���{)kys��0�v�C�4)���a�vy��<j���	�!�&���Y���c��/P�f��C��~=���L�Y7��a�U�n��=C���Z�^�IL�kIbՃ~�n+��ĊiC����Q&g����>��@qxBq�Y���\N[�����<�U;��N7{�9���:&�?�Դ�}]��5v�ux7�vNv�źu��=�EM�C��Zc���fw�a;
g����{�׫5��0N�o'�!ّ��l�K.:����U1�ܪ�:���^�B&�,�t|�ց�o^'ȕ��O�����J}.��1~�0*�cX�+M��ǒV�9�pxH��̽]F��F֞���;g`�
US�Einh[����Y��P��@�E�;�׍��-��3jo�>�f�C]Q[ඵ|6�f���dH���=̲�Hi��pƬ�E<��`��5����
:6{�f�.d:y���q��*�7c
���t�/PKe�mW_��
setuptools/installer.py�W]o�6}�� �I��6+��5Na`M�,]�BK��YU����s)���:?�yyx��UJ[�j5�ͳ2퓩W�V�0�ʡ{�bW�e!&k�v,���V���B�G;��Z�N�]��򤅭�y��Q�ƽ
����R��o�(Z���2�L2�f�Z>���,)d�5a�]L>ggg���Z0ښ�-�*+U�ꊭ�,s�YnL���&�Q!�LY��Tn�����>�u�z��T��a�$�1�)����:Qs��+�6�$�ZY"�<$SO!�=�`�+�w~�>���ޤa�!K���,<���ۧyk�kd��sV
�����f�
X"�8�/F�JV�oX�y�`=������A���3 f��+�	Y}�7
�86!Ŵ\��0p8Ac��(j⫁���ת.���b^�X�郯���,n>^����+�ny.N����:�#�Wn��
!%�'�U��e;��B�����+x^dS&���Zj��ޱ�٥��*iN��=}Ϸ�搸@)
�H�F�i
�p(�2娪'$�����K���'�%idXXH�r��M7W�oɗ�?<N~Y���n�!(
e�U�E��E@�@gZrXC~KmU�n�e��}�Qƚ9�A
q�(�0�����6�����(
۠Cz�CAT��P��q`����Ed'{�X
�]w�Fak,������w��k��L����X��2^<'�.p��*�dt[/ox�v����1�n�+V�N���6���hy��t��\;,b��
�.6\e�BYF���=�A]�B�|��s�@�d
W�nb-xAa�JR�nI�������=_թNa��cyGyX�L��
�>���@15 ��Lx�����tSQ\�hw��^�M׮�{Aݓ���<�J�-��]2=Z�ˠ�r�������T<�,��P$P0	��'�6g�J:�`�t{,ڔs��j'��=�~����j.?ǖ��W!���Of��x_<(�O1|��;1�$�����B�"�|7H�.~�$�a�;E�Yk���v~�~~��BNd�!S�\п����Ie5Θ��)�~e����!��Jo���10�(A��#�*&+BM��k`=�Qcw!�͔���]Q�����>����6o��G�z�c#E�
��ZM��lFȐ�ߘ�¶B��d��c�O�;ѹ�囇�%�WR�����w����(K��4͎�:	7�ס]��g��bt�{?��pd��t��h/��8[�\��'�
ǫ��Paq����H��._�\�j�ۓ�����]s�cRݏ2�
��PD�:�Q�'%3B���PjZr��㊯D�Ai5,�����<+�MS`UM�o����L����x����X����C5�tѕeU�l8��]�$���G��tqoXlN�PKe�mW2S��,setuptools/launch.pyUR�n� ����`Gr-�k$��SU��D�`���:�_��8����3;�9⯚��F���A��rQ�iR��΀�D�́��	0��{JU��;*�)�H�8��x�O����w3��Ff�ƢF�\�<�i��^+B�����؜�� ���N���e�(�@��8�4�sZ��7���Ǔ��ͼ�����t��U�v�s�v@�Q�k������8EsT�.�/I)�3ZB��\E[:5�+��)(��5�k�
h���N�١��h%��IY��k�^��(�b�1�t�e�t+�q��S�(֏,�2T5kG��4B�3x̡
؟��l�v��F���𝏓�ˆ�`9��:��Vy)�?���;�f2s��7R�֙�D}��?�!t��X��oE|PKe�mWE��4asetuptools/monkey.py�Xmo�6��_��($/��4ɺˇ"K��d݊aZ�m.����S���%�q���
���{y�܋zpp0�Q�=ߒ��j-�QKRc{+�)g 1M��%fk��Ib)$��+�t�٥�M�m�Ֆ}[Y���-�j�*�b�6|�Fս�AI��㕝`p�w�ʌR&%�����z��zk] N�
��$����4k՟�s(�d�z���[�y�?�+Tˤ��!��/	]q��U^I3?�����y�tk��3ܐJ2����n����b�dn�ޗ3��Q�{C�V}[�z�s�Z��k�y�E	yR�VY��_�p���BlziE'�gf�"0�ᤅJr��I]�𝝐�(8!���9-�
9�DX�岀j��xk�9����ԥ�Ғ��9Y[ۙ󣣕��~QV�9�;���%���L�
�•�K�HހO���9�� >�����^a1'�)�Y$�f�]�@dAߺ��u.,o2H��8���Y:�j	��-k+��W-s¥�O��7�)�
"ے�YԌ��9�I��d��p��Կ��bE�CD`꫱� 	�n��5��ռ��+�"�5��X5���%i�O�!�Q7�Y
PR۞�B�R�5����V�A�i�)ڴ�G�����;0�y���D�l%��4�O6O��g�a|��1�l>Q�1+0{0�i͠�H
%�%�[���> /��5��-��l��Z�l&l@P�1l����y��fmf�Y4���8��Ҽ�TM���"���'B]���W�~{��[SBgGP�.��� g9��Bw�T�b|��m
�ɢ_�5O�˱A�3��R�o;��D�Ǔ�v����C��U��0��qh$U��9>��*=~ŸO� �O�
�͓�g��lz��L�O9���B���
9�ˠ�+Vm��=�ɰ��v{{}w9\��ջ������]ݾ��������Ƀ���hI�E��
��f���n��|�AÀ��[v_��/aG�ߊ)٣�t��k��K�w�e(ܫ����x�:�e�����3t�b����5����I0�	LJ��?k��T$�ȿ���IwJ��(q���8�T�A��<��5�9��4�F�ݯ(6��`˝� ��b�#,!8�k�k�
1k5�,�R�YA��$>p3i0G�⍧A��aI��p���`���	5o^�>��D��$�ְʭ]��0��*xJq��Y�}.�SLäFp�Ȧ��k���֒������A
�-,�Fɍv΢U�m��'6�:��qD�"+U�6����+�/���n6�J�K��-�x��N	��I�͆i'w^��=��>�<�ވg�rF���M��j�ao�E�|�^|��h�|X%B��"N���/ۧ���M:�!�8�|�I�xɍ��2jiɯ����Cg'�7)^��SxϘXE*��^2=���[���9)Ϝ.�J^k�=�D�l��4LX�����a�P&������-`bB��tD�"4w�z��)�Ӭ19��z�h�t����S��`O�z���BT�>*�]�H1�i�����yC37u�w7_J�b��Oi�q���)�Rb���f�D/�u�[L�&9lO�70=zY���[��
G�n���o�QsIo�*Hj.���W�kL�Iy:R�
 �륄�PSy|�E<؝J��l�c�}8Z>>�o�]UzS�v�e"�3�E��K'�g�r�M�=�l>N�����ci��❍o�<�b�g!N�,��$�2�n�t|
l��G4+�R)Tu�[b��7�Yl;Z���PKe�mWSB�(��setuptools/msvc.py�}�S�X���ZSYى�@BH�Z�mƐ*�f�S.�>-��d5w�����[:�I��U�S@>�}����>j�Z['�E����˖�E���4I��8M�d�{�Q�g^��o��ь�Y���.N�c�:����V~����ly�q~�X�o��$��������'�{�B�_�x�\g^�蝷슦7�{]/
뛿
v���`��ᶇr�\1�^����f�,If��|g��9l�΋����|9��b�W���O�&�c�T5���e�y���gY�J�]F�p�u�_��0�F3V�nM�$6knEs��YoM�d�A�,Y0�,��Y��(�z0�e�������D1�I6��'u��p���m&'q�n�Y4�O�0��˿���9H�^�`_�Y��L�eͲ��i�f�����`���*���@B��]���s����<I�PA#�.��?K6d8"����8�b���ˇ��4�d��Ta-r6ow��C�\�s����8e� ,^E)�f�]���Jt��x"�x�5�%���d	l1co��8�6� GS`m�p�Y�eb4>~~yw�_�/��Ӿw�}Lbf�rzz��Z8���{�~��M���!޿����O��dj!�9�5�m��y��4��K9@�� }/7
0d��^�
�Y���(3g
�z�]�q��s�4�2�yG��>���Nj����z��<�>c����뀾.�n��������ݳ�"g�S�v3f��sӈ����ښ�)�p8�ƫ0��٬-vJ��F��??sV�Z@�(-/O�eƈ��2��EWp�HjeD߶�{o�Th�g�YG0�[���G �4G�2\E����<�]�8�i�3b�SR��s�K0�z-�r0
�h�9LA�����e�m�SP���Β0W�g	L�8�N
�|�����k��j4.�Z��x8
a}����T�a��25�����X����`w�Swu�j�G^��D���-�O�p��g NA�+�$��?���Z>��,Ǩ�`F��e�*�-Y��z-1"4h��&x�ni'i0,�8\of�\�K����t��Y�A�s����z���Ʉ
E�l�S-^�!��Dͣ�9(s4F�֍�E���`\ϷU��
EJ|���@���Rl��OGIKB��Mom������	��8L/2���k*�
�H�H���4��(��&��6�e�c�>�Me@�Z��I2n.<6��v`ɉ3 @�_��3��b�2հ�H��E�m�,�E�{Q �1[4�{hsDc�:�u��.�),��T�q�UsK�OLq��^��K�S��B���/�$C�k�x���AM�bB+��(��
x�MO{6�'S>b)��օk��m����Ǻ�I<Mڜ�@�N�[a��&��{������q�w��M���Xf4ʄ� �gwOJ���Z+�E��Ϩ����
��%'[��Ҟ[�'p�@�-�'�+[�][L������Y�
�7}н�Zv���k6���͑�?�_?���7|�~W�����/�XjT]C��X�I�O�ގ~h(�n���h�Ʊ�q���vAm�3~V]T���V���q���kUٚ�
7��,����&[��I�,�������K��t�#:a'��"��Dv{���
��Zt�����1!~Ћ��%+}�؈y�~���q��k-�#�-��2�g��bw��ܗ��/MՔy�ݗ<8�
2��2�+[�rT�Q�J�HHf�h��oω"1N�Շ�z
�9�
�`h�
Z|�3X�2��q��h�-�a�"L�٭7�c=@�e<FI&����INt�/��rMx��|A�d�C6P�
���Gq��R��y���j�lX;M�cB'�=�n}N�0E��"d��:�Q��K1�T8❲��<���	@Տ��`1-�y��ůd��`�V�Z�Չ@7�?ڵ:�(m=���*>:e3�U�*�vW�&����e��">@/��^@�����m2گIz"f�zt|C^��db������3n Gcth��Ʒ�:�����i�~���1��j���%��N��,l��m�n���3�K>!��ޗ8�Y�h��(��&�@ܡ����"�fy͢0%�)�y��wl^�@�ˍ1g����ٰ���7<�4<�����F�~���]�dH�vz?������)o���-W�o�q�a�`��>CK�;师%��ӣ9+y�4\�2R1�;�@��_Հ�8O�0�s�/��s�#$�̗F�+���dH2�U��Q�Կ���>�Ǐ;�ؐ�{����8蝞�to���{;�VmT����%#빹h�e���%���K�u+vx�.Y����o�@Dی��>I����R�(�/�į4E�����6sL
+�s�1fc�O�B�հo�/�s��ѭj�P����@��&PS1��)��I<�8����� �AЂ좰ט\��(����I�����>�J�G�Z����R"�o��_̒k����QT��r=�+c���yfp���Z�S�۫"�7`G�w]/�vS[_b:�g�#-�]tDc�y��f������{6�Z����~���_1���C�2m{�e�;4&�}�r�[)��_�ӧ��3�+[�4<f�e��� �x�}��Gԡ ����@�[:<:��ї�$�`KŒC͕��,b�9ym���P|��kd�Y���_K�b̃|H5��J\(n�������I*��7��K1@t�{z��;��tDtm�`�(����U���`,�����mFKaə��ely������?X�w�OAg�h�P����f��p�q��
��)�G����|�V��/n5b��J��6��y�v����y��Wi\<a��~��i�	���#eㅹ{�<�v���,;0���ϡ�݇:�[�UI��"�{��/�b�<�0����B�'B~a��L&ބ�!@���+jo��R��l��.�фZ� ���%�!�p`��1v2[����@ʶw,c���L�$�%ENa&#�bF�i	�!� ��|S"�e�RE
~�p�֊�����y�Ї�AC~� ��p��'�E��/�����7is�I���E�œ��� �$��`WVj�Ǐg�8�Y�h�M��8���u0Wf7��3��3��A�-n�O49|4��
����:Y�YHҊR�>f�����t�1����� ��C����S�o�ME���,{ `�B�\�h�1����)r�Ҿ2�[H�k��4�$� ��O��V<pߪL�k��(����-�v>�o
���Q(�M�ƕ"�(.�ai1�:���p��%��^e���P�'�u����h��G("�e�/�=��`�=[���_i*���i:��A-:8>-�����ud�K��:�1����{���On<�8�4�Jx�jE
fD�J�
��2?��+��Rq���@��u�E�����)�*=��g�p��x��3|]�-�D'm<.�5Ro��(��T����@�rI��}��5O�M���x�,��}�%���>�V)9T���x�0�36���Y�#�0�g0�%[�_��1P��CF��,9���<�!�p#Y"���eI��O��tn�g=�sVa�(T��߄����q�m��O�
o^﯃R�$՜k�@$B_��so�Y�6v#`b��`w�����Xuq���9���������K����[�1�r���X��/3P=t��i4Ƹ�4�M����v�F�B[�pP�_ �$nЦ����v��D�zШn@�u=�����o6�{�$ ���@\�����Lb�-$�:u�[P���E'���{lZ*T�!���@C��2�n��
�dF#�KM9���N#�߉��1�琥M��0DC�ӽ]\��Rf0p�Xs]����w�49��7�ȃ<�ե�؁�Xlj��X�!_C~��
�]�O,v�[1�P>q8M�'y�J���JS���l��by�	
�>ʆ�vb���o�j>�T��l5WUT�}��H�No[ϒK����5�ͧ-������B�mfR�L���,��iV�Lhg�T[��Es}V�*�����ʥä#�nx���;5�þ�3�W��d��ӿ�?,6tLkf��4��ڗZ�!�.�y���� � ��j���h��u8�����<��x��8ۃ���岡�]�1�lr���zXya͝U�r��m�c"�sϤ^yx�4;Z��E����|z�>����3�-���$��3a
����S��\ث(φ��֔52���y���w�	�@��N8,F8C�D��F���*x�
�3Qՠpml�c�@-�<ɓ�x�Y�\�#:Ůo���Ol�y
�d����F�"

�1:�SֹY8�;9X�i�-�g��ɧ�3L��ᙫ���9{�5(�#Ц=�gYaD�ܗ�&�;�ϴ���Y5&��a���Pu���
�
!�`<K2f�����OlQ����[����a�nj��V�=~�E*����}IL2ϰ���v�
ig�M[%|�|�*U�kU�]�RYPs�]
$�A��SYp�>
���DN�r���y1�M{�w.�l���<��)����`�U�ea$���>{����<v��0$��E�uS�]J!ớ���ͧE���U�YV�a�<�S���t�'���[	2���zX=����p��Y�<��f�f$����-�PJ�LBD?�ti�t�?�y��FO���]ET`5��n��Ϫ��rv���4+)RRX���)�!Z�[��Wx��p�
�bْq�I����Zw�e9��i��}��ޱY΢�X^�sޗ_����Ou����ǘ���x�0?P��$��h�ֶ��_�b20f?�c{�ٺ��G�E�X�r,�E��e�u�6�I��KZ�`�<�?�ǤV�.߀�D*7�������.$�f`Fw���PT���D��ֹ*0"�2��spm�
/����2G�tC�A���`㖍��T�\�6�q�ӿQ�I�L��W�N�iՕ.��Wupj:2���uʘGΪ�U0+7���f	#�bϖ�<���s��%S��;���U�w����0��]e��@�Od�>ט`\D�:�R-�H�����ó�Db���	iR�(�p�K�N�>$
�� ��Pʄ|��K�SZ�LB�p6U0?�R��[��D�ԡ�;K�f��\�3]Dz��D�Ykm�f���VC��0��69��m����au���s*Q�6����1��F�$�.��M���<�w��-X
��D����gv�f|`M�[���r2M-
n=�M֐�۔c�Y
͗�X�Os�]�-��˒͢c�X�m�Y�7'Q�ٶk1��*�����A��� �֥� t0���{����\l��/��߶�;��ŧSntp�Ԝ$�_Q�/�5:���F�'���9�tt��q����Q[�.y�YI�:<9ofCڶ�y��S��I"l�[�
�8�6hU;��n�rx��*ZP������tg޼`T�G����.��$���d���Y�����G�;6��g�|1���B��l��')�vqb
������RкOC��”+^?�έbN*��ǝ�Ͽu*�"պaU���$�8�imsJ��l�)V��xxh������r��@��#(ӏ8oZ.�qy�����"�)x&H���6�9�d7"�������r	{.�U	��O
q�nK��s5�G���J�n��"�̳�ʊGq��S����:%�E,	)�]
��'cԂ�#��>ْߟ��G�u��*�P	�56�6ؿi�sʙ�Iԫ��4���8�{�Hn{ǔF*�&����j 0���Q��!+a��)���Ch=���y�v���k���b*�2�s4\ʀ!*|�r<�I��(�'�r�D��طa���U�����+�4rx�,��0)N�	�qv�v���7�rW)ޤ�s������^����S=�s;����Ȍ*���*"Tn=��:5㻧���0��,��/T��S�Q>8xC����-�W"ȏ���5t1�W���Rr%k�eg`*�,����x�Ë`W
��|��ѭ��庠gY��S�~~��I�~��섅�C�|�U{�G�!^�=�n��90���y��|�ݺ!�ŇrDQ�Q����}��3�:7�
V�s4��M5�QcR\��e�F�./�E#��y�1b����� ��b�W���	+�؍��}�!��_��������f��T�DIBmC��
_��3K�Eand��
�xMEI�+(2�›��n�$@#�u��L��ө˛�t���Bs��N�mURd�氀�u�"թ8��9��xCR_�D[��ȳ�6��	W�]K���jș�69�(�߯�O����|+���VV& gR>pi�I������@qRqj��?��D���]�|�z_��UK3��-�4�f$���j�����]����1]t�G�:n�^��cc]t��7����oo���Y�IJ�L��_��(-���/�oD�oZ8Eae��۱������R�
XW܀��]���<dA,�u%��9����;�b�)Q�фH�D[���_O���6O	�S�E�eeJ)���
x,Ss�c�u�¢ �붿��	�e�2��.�t�Ð���z���F����2�n��p���i��'��S���`~�t���a��g��p��"�Ls�
����e�.6���~�(�m�X�W)�x}|����v�k����X��9�"֗8BC-��N�,{�r�~t��v�6]�懨�X��V�E�N�<��vy��!	���H�˷5�����弈*���u���Ɗ���}��Pc�[���4��
f�N��.o��
�\bE��bظ�I2��=DW�G[�v����U����+~�\
�e�}�r���K��l�ґ�P�[�\����cu���C���(�&G�8
��KX��W��z�|�%z�_�����$dzmџ��wMO�(p��<��E�ʙ'HanH��Y����Ve�Ӫ�{��u��!������1�t,�K���$�L�if��+�w�{q�cz=�ı�
/g�����/��@v��(���{�*,/�#�(���/�#�6�&iSۅ�
�9�h���.��\��w�Ah�h��3�[�"ׄ�L�a��K�|SH�:��% *��l����n�kw��L��t{FS�!�
��Tw�U�b���΋ݟ|�&.ojČ6�/��������zճ���U�aW�	^�*]�Z�u�@;Ł�,r�7����ۋ�M�}ut�E؅��I��V$r���`���
�x�Rऴ��PU�	-}šw�J��-�
I��[1u�T�[�Q�~/��y�4k��M�z��A~��6i˼
���}2�6̗Q���`*�sހȐa&P����J�&/<g7y�‡�.E�qQ�Zx7�]{��r�n�V��EAPSbFcQ�����h�	@��rºx��%���!x��S����{��E� �)!��`C᝾�%�4Z�ޘ��+��8��RV��DsNHt�LE���Kg�_{q��� ��k�^%�2��'��9t�.���-�`�����ާ���B�.n�z�2O&,��G�`*]/3Σ�5�(����ښc-g�W[��]��;�������;_u��Y��}�2l��ӥ�3���'��\(K���|����-#~V�Fm�����·5W_�U�[��c������)�d��q�}:�$����i1���v���,�{�|�į'G�>���o���Y�|
7�0��cEy�ȏ�!c�7�Y�
���79��T6j��X��36�[�Xg,�s�>���db]�M��ȼ��A0�,�y���-���7��[]�i�f\����(u���K;�G���v������5�R���o{ս�~`����7հ?���
�r�
hܻZ�q�d�;17q�,T|�Fic����1�'7Ȱ֯�f��o3R��)�6g&���2��c��0�ߪ�f���5g,�@�T�
�kF�ڏV���&��C�1<��QZ�=YK�2@�w$��s*���j[�l%&�
����j������To�ê�v��.��i#�L$g��$/�N�vꏢx�<���}��������i�Q��bR����Q���
���
�)�kxZ>λ�u!u�u�*�u���GB�P�*y��P��i���uE[i�*��)���.�[�j��P#���a;��r��J�\��c]��l9��|���`�:��ofU��#z�H��3�E�H�����u�����Lx�1��Yck
?��k,���D����@�(�.��
��p(�S규7�7��F�6{σ���Q��n��.N;5L<c��0�V���5���C�׺�kc ���h��x��#[�ih��:�l�Q����o-R�K�|`y�7 Uz�N6$��5΁�Gu�ۛE��:L�1�����Y*Կ6n
�?�Y�0r�ot\E�m��uhL�h�髖AE��w���Y��T{��_��/�li_r�V	@��eʙ�`)�3qg����;*���p�3 y�����q_׺䎀� ��q+�F�C�bz#�5�m�f�Z�"&)��Q��4��VGl-���!�2���Q�ш��:nSD���wIۘ�������W�^1�a��;�|?ڭ�&�������)�hMed�W�-* �
#>Z��/3�1M��1�]}��a�n|Ӏ���c&ߘ�.�iބ�2=�= ��T`!�'�,.���إ9=��F�+3���E.n��&�����v.��H�f�cfX��w)���E�%�UTYl�W9:W�Kj���5�A+�،w(��W4�q��c�RQ�xWt�N�w$��Y^`tT�.����/�����[���G���Э(�y�ag+�|]J
�f�NQ�A��)��9��a �d��_�24�9V�Θ��"�CQ����u'^���h�LL>�9J��wS<�)}�>�;��~��,��A�C�gL�[mj��Q�C��%�ʛ6vɐv�w�2�\A�µd
-h��YY߹f��۫��LF�W]�u�b����V��jJ�Tg�
��	�:�ɶ�f��$�f�����*���a��^2_]m�8O* ��
�:a��U���ه�����W�f�e��=��<���~��U7s�)኷�y~��}��wz�PkW���"�aե�Un��.�ܧa�P�\1ƺb����}�=���F�Wq��\}��$�u~4GAŕ�����~��#"՗�u�0����]?��(X��B�Θ(q��a�J���)�ܧl"#�MҧR�,)uO���Mi6��U��������&;LW��m� �KȪ�=���@E<,��a<���_���;�5'��dK��'�l
�Qɘ;J}�K���/�߱��x��1b�3�Mm�yȯ�1~���
K2��
3�W�lhB+�ԣ���؄�1.Į%�(���_�Ob6NRf�Z��G�k!��W��{��ظ䛓��Q��9
RYXf��=��ðay�cow����'sF��S5�ظͼ�6���;,�SN�Y��0Y�7R��&"gW"�~7���jV|���rD+qW��jP�vX��s��v�p��(�o�ۻ��Ҭ#��4.��3x# ��I��*�TWRAk�d[4ʽ(�
�ۉ|O���&/70�QAn
�ǽ�L������U����3��f=���o�v�+\��`����:�J�)�d-`�I-�w��w�������kQ���H�
*�o�Y�B
�&�S�����;C�vݏA�h�>�$� �{����f��2)�Y:KkХѲS�jУj���1I�C,����FgeB
&����Ze��_��J
��zc�ݿ�F��ɮ\��כa�:=���I%_��	�$���Y�oX@,uQ<M�-���l����^!�_B���gڻ�����g7y�]e�E��9�L2&�#�P{`�����+�:�8)��!e�lŚ_�~�q	�+g��A��ق�A�''ւV;�����8��ast��<��pU��)�.a����|��x���/��X.�+̫g�]"7��\���:��0H��G��:~�*�H��*6�D:�9��}N�G�{F�|��o[�Н��o�����u�]�&Th�?��,n�p��q���k�@���PKe�mWpm!Nsetuptools/namespaces.py�VK��&��W W�q���nn5�.�V]T������x2��=�m�̣��f���΃�g}D6�zoԩǨt@�\h{�M?U�>Z��n�뵈Qt[O��$�aI
O��QK@��fBZK�y�C�1�=�|����1O��v�G�Hp#�8�@��=����N��e�8`���tA��@�N/���r�+-���l`N�NC@/�T[Qx�"��F7�OK�$�1�1&���#�XU�3ezK��4e�h���UF�tnq��b9ݵ)f�[�a��p?�-� �����E��I��3d[�$7���d}�����	Y�T��9b�D@�֙��=���κ��ͿW��̩�f��H5�ZM�r��$���BYhX;}1X|/�"6�F�NȂo��u���r.U�I>��Þ����@w��ТOt
w+��ʐ=��F
z��hu�7�b_�G��M	�!��
�/�F�o���� '�#��M����|��N���,�I���J}{
�:<I�<!���.|���L'=��Ƚg�~f�S>�
q�RZQ��d��F�k���_�|��fH�A����9�:@��0�)�q�u��˝�hp�7�S7#K5e@�`-ͲeZ̯��ͫ���W��C6���Ɋ�{Wxi"�-�H��/�GDש#t��$Pt>�H�ȣ��B
�^t��횫^O�N��D%P�S⿧�����8�����[}�"kmQJ]U
]
4��i��ZF'��&eri�
g�}ft~�
�R]-eZ�e�Lz����lw=}��vή�ݼ6W2{���	U�)ڣB�������q�����^&0t����l/�^2]�.�W*��Ui��qL��X-M�j�g�d��H]

YI�s��P��	Z!�� ��v5�N�U�v�W��k�6��[�.JBS�,�5�
��xq���fuG���+ڀ�ei\�N�`��*�$�I�5E����=�O_ �P���Q�Q��0_����@m��V^	���2b�
�#欃���a���-����D�i}/̤4�R���'��E!�B�?�PKe�mWT^�-Λsetuptools/package_index.py�}kw�F��w�
u=l�';��v[N|&����5D4I�@�@ɴ��۷��������9�)������^]]�7�_i�Y^�i���e:AV]�E�fy9{�rU�m�l����j���n�X�y������U]����k�6�"�� ZQ�UUh��i]��iU��*�Qk�0��U2-rQ��u#$ԧ�[-~Y���R�uU���j����	>u�j���D�^1��|u9�Ԣ��T�.�^��ߞ<�ǫ�M��x�n<˛��/�LU9�~��ɛ�GeU/�"�(&��]���~x�����*��r	s���&��M:�2]
��J�
�C��j2����`�Գ�O�{�Z�q��7r̘'����ռ�I�<S��X-�i;]�&m��M�����&�!
��'���D|v)�eU����e]永�������=���O^���ɴZ��Q�K����t�d������O�{9��W�}���y�=l�E-fc��4�=�N�����x�?_��|��s�;�C>L2@�>v|�—�����E��ۼ-�x��p��aJ@��_���|�N�
�͢��,���.W_f��&3KG��O���c
 �{?��n�����r/a��}:��r~	������N^�}���[�9HڴN�����}	���
��?�fU�m��M&iQL&��f�f����#$���ɬ�'�9�'�Ɠ|2��A64mȌ�%�-�<<��޾z���w�w/�?�M#~���U�(�:�d��D����]T�e���f�L�]տ
�� �&�v�,���p��Ъ�8��[��P=��4Q�嬊�s��W��^&fO�6[v���Y�i|�[���b�_��g����0�6�1-ւ�h�6��@�y#:�8�O�3xY�A�4Y�x�B5�Q��;� �
�XC���™���.��%l�7<�u�p��D�q��eU�!���߫�i�B -D�`P����5,����D`q�0��	Z\�#�1�D�Ys���(ā��P�����Q��Z�tz<:��<����=ԏD��h`���(�������H<=5�����B�ߋ�;�Q�̾xp�)?�:��մ�����?7���`�$7\�y$[���m��Y�I�V�=��M���
��Y3]R�f�d@#�Dh~�x���:�/Y�=kR��/�B�r9<����Y���G�0c�l��HJцd:2\x����8����9��zz��!���?2�a�3]�`�<�aV�0�/�j.��]���(�fi��I�h���\.!�&C`[]Au�o0���]s,�,]h
J��D��E���E����-�i��2�P�nq���Ǝ��jTӆ�q`�G��#�8��=r7���W�Z?Ll���j��c3`jpGD&ʩ;�����;�/�&��”cS��.<Bʂ�� �j��O�����&���j&�Y��g��p�p� K��aL;3靃��@��g�	H����E>_W�ƬQ�kJ��NK�*�v��v�{�(nB�]�1{�z�0e	v5K�f��+`Z?갈���ι�ܪ�6�st�A]!���'���Td;�/3k����Ϋ:oa�Pú6Igh�I���
�ݔ��bPg���Bc��H�&�.���
-
�&��RN�2�YbBb�8�
mWV�1q��gWz�%�CD���䦀=�N�K�bh�,j����{����ڞݞR;w���NI~��DY��#"Uh 21���Q�׿GB����d�D�+�5I����F�$dA(J���{�<��om��>fw�ڇ�`
�Sɐ�|ϐ�Q�:mE�Ȁ!�DG7A5z�����8F�;W(���c�يe`VrS��fQ�aݦ�y��s'h�t�����h�@&�����/m�(g�T8�~�/jjr���2���4,��O����mm�Ӂ\�& [P��<	iV6���&��` �o�?��F�5����i1��/;��@��`��"R0�4߻�	"32�5��fcV�D�_?�*�1��4��w�R��EЬ֠)z��Q�
�h>��0�$'H1�*��֠j5��������j�LNa	BZ��~@Z���l��a㗛�\���_�G�
#A��.��R�]%-�4�a[��y�ti����
�D��2�j�%Z"��z��1$49��V��e���tJ�+k����Yc��,�lt%��z�@��QC&2�L�-N��Ok�ŌB��"5R�@)�ZH;�W����}�_�d��!�G�g�m���%)��<���D��h��E��c)�i]H�봜��p���b4Az.���-aa�ɿ�\B<=^�ŽW0��%f��Hg��S	����&_a����X��q���:]���\#�Jʴ�c��E�&���hY�rE�9ƭ�v�-��cX_с#D? ���J��ݴ���{���Ž�`'FN`z��=[EK�@�7'�����=:����Eя��݋�q�Ȋ��	
Pȕ��q����X��&��:�6�E]]
��M٦�����@?��+g�h��h���b�/v�W ���=�f�J1,@���0�I�4�G�?�&�C^\<��� �3�	G���7�F�O�Α��Xnp��"(�F�t�J��n*`���0�c��lȩ"X��	Ҩ_���F>���V����}J��ùLL�LD����
G�8^4x�.}���5.�g��D�B(
���3�B��)��2F�.�*�A�k
iZ�!v����hǟ��޴+*xZ����.��RԮ8yz�ٔ�Snâx�
�J��t*���YR�se�	!���,���9��y�P?`��P,��'�*�5Y�
nǜ�2��
dh�9!�Oض��xĸcdp���_<���?��)�b^lC,c�:@/.��ِ��H��5��u����#`Da��pj��ē��-�����c�-J6��"A�ǯ"f��<j��𿣣��g��>�������e�y<;�Ňxn"{t��fx���cC��$/�v2�t�C����m�p��M�S�`���t��m�F�0��*U#��E��ǨFX��8���:��]O1\IC1�lV>�⠮�ot��1��
\�c�O�[�A�1�I"�A�3o�G�H�����a���]K�e����V�E�i�`D��fI!7���eG1�98�Gv���	Ճ�N�C��(X�3��>����cc<q�[�0o�)x��YátK�5��֛�YB�'E�C�mW��j�ʓ��49LP�F]TMی��n8���tr�.�BȨ��l3i�b�r,Bc�0d�&�t�ի�s5°�`p0N��]��V�� ��dIX�ۡA��7��LP�k�c��N�����릓�tE�.�),����e^���&�(&;t�VZ0RC��(7�ўt3������c7IC�S�4�A�sU��]E��O`5�Cv
�u���?&�s���8x������:A˚B9ȖrIMDq,���ts!4h�[l=��9/=���q�UW��ھ���3 #Y�p�$�D��7| 	�#��n�`;w�=��R����t1�Y�ԣo]J�	/�7�.=XoA˙T&.��h�!у9�4V|{6�u�=6��o{����B3&'��L�@c�Dz�۠D3M�tڮ1`|��]��T�!���N]4���A��mn'��)�,ѓ�mP���r%O��R��3C�r[����i0��։q�6"�s�X�F06��^� w��/J�m1vü��������N�L�}��5%�Y�,A�U��a�>Y��m��2q  9KH�n'4-�o?��\�+����u��Q��3j7+��ba�<厣�L�
l��%g�R�$
��A��d"��@�"�E��qB�YdmjX�Q�0�(Ͼ(��x0(�Ђ�h���X��:�4��N�B�V�ڗ-��	gs.R�a�^Y�ۂ�o�50*輼<�w��0E���C�M_p����Pz�+?)��W����(8>0��`~����n���c�Y�ǔ�b6$G��^F���d�8��o�9��W8�!C�R�1��c���	�3FgO3��0+� �0�������G�!��{���t�_��Qa�J���d�RIJ]mwnQAA�@�kK�'ХN�~������@|� ��.�u �Ƕ���72� 2���\2�Գt��-�����.��g
l!�E��A�bˊ��mZ����]K�2!�E�7�הR�mB{j�5�<��o��^���*�vr[ߗ|���Fz��F����/ܞ���u��I�98Z�/��?ٵ�m�M��/��Fv���"�
ߗ�f�@s����C�y�g�e��û�θ�@q��.r�\�9%w�n�7�}D{�������vYW�Q�N.��	�dc��x]� �9�!��L+�FHIG{�vj
�M5�~��1zTuz��D��� ����:-i:;���+Ǝ|��@
�C�zx��Pi�p����I^���ȾV�r���D��RV�DJX���Ua�Z��tn��D,Z���z�g��f�������` �˳����H��:�ԉ�@�I�ixz��O��+r�Tϗ�&�?y����ۓ��^��c7+�ZA\v����̢��i����d^��)rSw�3+��lȸ˄����=N�c�ó�;�}&�K\�U�-�/'P@β�W���E*y�|������Ha��j�S;8%w1�A���~�O�p=�G�к��������ئ�uǎ�)�D�}'��C)t�"�LMeڥ*�I֤>吳�_��4���,Ay����7w�.��Dտg��P���	���l�xx���<�F%�x���:.�^�d�^`1¶�(Ĉ�]h��*���-R�*�8��,� ���� �m�� 6�p�;�5���s��ˁ{J�2�-�ڄ�^G`�xٕ�,~��9�����4�;M�א�jƽ�~?�����W���BcE8s��juA0i����ty����80�4���s���ѝo��4�����g��(�kl��>�Z4tks�s;&1��u�;�̇�MDn^"��GU��3���G�=�,��u�cf�<����l�+�ႌ��ģ���ZS�����u�Uە�r�(L�/"Q�q�6�����d�=+����r��p�1�!����]�>���	��V��xW�y���l(�bӓ#ϑ$)fT�O5��P�8q�m;�?��O�0�E��B$9��}���J�I2[C�K�9�sl&$JawJ�m/�k*K�M���0��k*��֒I���s��x���܏L4�Q�v��˒���e���lբ��^���1N�'v8�!�M!�L`��-�z�_���Ł���5��1�Dc�9��L����f�Y{��ސlj���r�)'e��ג�2Iehe���Ֆ���B��nB����<n�B��y�L�p
P�`4�%-�<P�ݍ����]�q��u��&���M��3a�v��`'0�_vT������`���Q�/�{
�,�tB�Îs�I�����(Gx�c7�}��J9K�c��9��C^�ڧ�s.���G���5���l���U�r�O1yV�	0�ݶZy|(��T�y�ԉ�S��8웅�t�ٮ:��R��pW�wւe�g������
&z�'�+n��~0���
s`Q��^��ϣ��w�Z�	�e֑�JR�S��"���Z��^(	���h��;�@['g��`�ٳ����w�I�P�G	]@�S��\�,�ˤ�k�]��H_!
�"��Dl4��†D�ۜ9cV�PF���9�6i���cr���
U�E��)9�G��\�L��'e,�Y	P9�Vd�lx4��}	�Ա�z�g��q�V��e�|��곜ч��V�f��x�{����0�H��;C�{�=�^�C;�_J ��x�}��@����*ҁ���ܐ�	F@eBo�K�XnCCC�MU�0�N��)�	�nF��rhHQ���o��t��bA~�J�L�&�~v��)ߐ#�(������#�#���\p�d��M�L(0V{��e�_&�eQ�p<��M@�
����S�p8�[q�b��l^��	�-Z�)�j�L��+e�Ճ	�$3�O��kg"I7�ʐw ��J�j�%׮ffJlh�N���bMgx�`��7���ɶS����}���r���R
��é��r���BY����po��\��Դy,�2M��rٞ#
<*��c��di*�u=4�2�˩�΂j:]C�lM�g�̟�����{��$����{:j��Xp��O��`��F�N&��ׇCt*n���M�Xu1؃ts���d�|�=��Aw.�	��~6�oGR�TԾcY	2����d+����V_�n�!�HX�g�a3}��[��,���r��"g
�A�ĆJ��{��4P����:)��u�]Fb��d*���\����+�r�d`��jR]��������
`;�"��oK�5뼥�whP��,c��yn�wnif��`�,5�{I��j�;�h4��(�p$��P�<�x�	M�v(�`�+�w��,�"��b�d��b&9^�5���d���Mò�C4�J\r�
�&�N����6�5���~����G�Я�Z-z{ؼj[�=�G��ٹ���2�T�dO�c�����Zq�r�	��}ٟ�9��Ak� $�3:�J9=d�=p�);�r�x@��&]�CY��s�A��`��;�x\ˈ(Hو`�ZS����s��j�%y�ܯ
��A[��8g��%Ɩ�f/Ff�9x����OѺ�U���G�1P��W]AA��D��)�����w��jtR�XZ_*s~�kR�
$Þ�M�`�ʈ�Oe���N�N}2f���PU�S�0Q�m�B���&��E@D��0\��M����}P}�\#˜�b<?�D#;/עO�V���a}�ϑ�Qw	:�!*��?�!�H�ibS�=Z�9�,�m5!�qb��m|ѱ�� ��i����Yl����E7���"���J�i��=�$�4�u,b{}�-`�y�/O:����@�[M�F���Z��$��a�$��t�D���n���K��*�]�(Qz�"�k�����,��A��o�v'���mɵd��5J�biD��m�i��u��[�]�N����ξ�b/�g�;��g'�ߜ<}���ٗ�a��GX�V�)Z2�+���/�G��my�����(�&�$]w�B"��f���؊(t�`.����X�r�f��ۜ��g�S��Y5��]��C�.�i���:,��`1H��.��;u��:@jW(z�oY�:U!�RHU����p/����X9gm�C�p�Î� ����U�m��kd��c������]`0ݍh�:H�]�Q�3w<L���k����pU�/Ч>�J�X�
�/i��H7QRob�3c��ϭ����fo�9�t�TPo�m\�oɪV�U�7���uH�t��'�x�� �ϠC�������NR'�|T�N=Ե�;���(��ީ��m0�l1[�C<~z��-7i~�V��?�j��+>XO;���&�V��Y	���-Oޟҕ<k#Ez�t��\���d�ei�:?�xd��a*��C&�d00J���&Q΍�eItkk�wDyګU�:kit�a�%�Ld��-����C;@��0�ʹ�W�*���_�Ij�w�	�vh0�z����GVr�6n�ʹ=��\'����g֑E�~�~�/�*�k�+ P��R�U��خ���"!�Suٻxۋ��7.W�����V��m!�%�F&�p�.&�T��/�U[�f�_��%�+&���ֵ\c1��F����62���K����0o܎_8��Gs=r�3�e���;��s�9�ti��)��.O���2�@9�p�{�"I85jQ��u�S�o
qA�f������٪OJ��~��՜h}��E�׹xN�M�;�*U�J��Z.��bR��j��-ƃ�?IU�ٞ�M�}.�je�mɭ�iD�iF4�%F�{�߲ZImZ�Z�R�mGI�x��S�Q�rK��Q���Ɛ/d���[��ɬ2����[h8B�'�e{B�N@{-"��V,���>"s�ch�8*yQR��o���vթG�.a K�������n��aW	扟���ޮ4sلjn����!�P��%߲r�%�_;y&.ɼm[��9�+�RMU�a"tkmp�B3[w��Q�Әl#��<_���6m��w��P���(
�E���v)��Y��t#3	�-��5�_� Cf5oE��$𳍞�MPbI����69�6������_yle#��_T�7r�0�f�\��B��V��
�IV���a�#L�����Q/Y�U�`c�f�06?��?M�]ޑ�5�LLTe2��r�N%�G�~)+�V��5�u's��8:�{^�Ns���dyt��uU�D0�a�N@i�C�oO@%�ky�ʐ��8��֯�����I���1e/�;�<o���n9���x������N�
LxA������`��M��b�N-+Y�W�D��RS�5Ygb��e�)=�8q.Ky/��gf�@ꍵۃ7�dgm�j�ژ�N��}E��p�����1z�_0˕�٢C��#P��{]�+`��%F�Q3���N?���.Wh���ʩ��эPC��!�c�@9
��� ~�F\��}v�HJ��5�K�ޱ���a��w_G}n���Y��4�!?OK���"�1���C���~���T��|;� ��)��Nc�VS�ȕ������z�/�m,�0`��`���O�Ϡ��R���/R;�Oj��
o�c5н�+̳j�K+��n�Щ݃�u�rWG�W@}ʻD��Y�7ՂW��|7~R-�������B����98P�Ȫ�ߟ�1l,\(u���%t�]S.�/����Ј�ysE��֜����ކ���9]Ð�P�x�GQ}�*��!�I*��uUgco��H��;
n���K.ߘ��m���tن�0�x;��pӺd~�$��TAjO[�Og�a�.ʫ�O"�Dᄩh�AwGj�bv�X] ��`We}��]>�ž\Mf�I-�&v��& ,f��~Q/�N��;���[�@�+;�Y�K,�m����BG��L���V\K�ƞ��/\u�p/}��|�"�Pv�p�W��,T�ME�>S�h�1oc0��.�=�k���u��ޭ:,�Dg��fᮈ����,ԩd��6�f@�0`�����/�\��S�K��il͵�0|�ި�{Y��vBlFOu�����\���U'���;���������]��,�+yM]a�k���hz�q�z�L0�hH�;�Υtq�~]����v�ߪ��;��&��޽*{{��;.��o����e[�)^XCI�n`�3QS�m�ˆ�|��Mb{��q����C�icZ�K�H��'{<�tx�F�_��<�_?��������ٽ�������}��Q�ަH��&��OIJ\/��vz�}f(uJ�$8�qas��)��Uk�)�Ҟ�v,h��$6��+ߠ������#��$	�S�^�$����O����d�1t�<n�L��_���K��b�����<�[�e���CIS����2C���/�'m� �#����؜�M:����mk��\$>�L�D��q�.��t��Y�k&�u[{k�)!�{ٗ��{J�	kJ}�ա��Z��3ZX+Z2:��u����`����f�Odl&�{�����>�|�D98�4�����t������~����j����g��G���;��́T��^��b%2
�>�[4%תk4�^@&T�sVȀ{w/5>w���Eޏ�6Gw2��������y�Bv�J��E�%�5t������\||,a%��dX�#�m0����d3�;�*�nP���†�*}+&8����봮s��X�t P�)D��E�Zd�:I���j���"��C+��Ri�v�*D�}�')p�@��hU\3���U��5g8P�r���|�|��}x���H����;���J_�qG����O�r�ϣ)�CY'o�k��5�md��[J}G�`(�� ����So;)Ǹ����K�i�S��1�>���x8<c�Q�v��}=�����Y����Jˌ�E�SZ���5x�>Oݽ�,sh�� ���V��6��j�=61����ˆ�.t����igH~-&��|Y�C��z�:y���)���T�U<\w;��zK�.3�L/�0���p�O��������[Q��\X�5�֛�����T�r�j�� �7u1Z�ߥ[?pj0��{GށE͋G�\Nc���R٥���|a��uk������i5�(M�Z��W3��i3$��<\��{U��*�\%�×�)ߒV뷪���8i�?Z�ƶy��@R1�ݐ_.����y��V-$v��c�[B����c�*K���U<]�>���[*g.�D��a/6���>E�ȩƙc
E�
Χ#���J���_9k�������'���{'���gsE]�� ���͹0��������p?ͲS����ݠ����u���SǶ&���f�&e�#��Xh�ÎP������a]ŏ��C�
>h�b�Ef�`�;�U��b �]�c��NN�5�:m����[��q7�/ɽ�KuWU��a|�6�����BŪ��c��_u��#o�a`��r��0�g���FO�$!���t��dQv:˘Hv޶���u�!�d|S5o�*	���#����X(�74+��5�����h8Av�+y$��H.����V�5[%�
�ы y��݂~�Ӎ�K�:r��6<\o�ƾ��l�b��0^w‹�NO#8�@U�vJ�ƾ��+Ht���d��Z�ξ�f�ȵ3i�F���4�]�4'�e�ȗ�x�Ij�VN�ïB'^E>]��n��|Y�!��a�h��t�_wU�h������Gw��������8y7y��W?��#�������f��؎m���.��Sٿ�|�����Zu݆����v�LQ�3�}G��J�qz�#�n:E��o+z�+Uɼ'�y�sa��bx��b�4*�1�s��l��@�9]�kǝ7�xz�ޝ74��d]o�3�"�J(��sy¹n����Ҡ'+?U���Sl�/q~u�O
mygԌ���=4���
�	'����K�����Wg�9q�D^���s��!��CT@�d��'����\'{x���>�>�М��Gn��J�P8�c}�ӌ10c�پnÙ��`���fG�����<��z��~p������b��y��1i]���OnV��P��\�Ac�D�xi*����z�*�'qG"yr���.�:�� ��PKe�mW�V�D��setuptools/py34compat.pye�M
!��9E���(t�E=�8c:J��޾U)�-x?ǜD�������_����^e�gw"IF;�Rഎ��@v�mɴ�m"���C�U�תt�{���v��7	i��kBr��?;v�mi�PKe�mWQ�짟8setuptools/sandbox.py���۶�w��Lr�h銢C�+$�-@�岬-�gղ���/���)��K�a3p~P���"��5�lY�f�����k+vͺ(��]7B�������K��h��[��U+>�e��#M�m{�� yc���l�J����m*��;�	5[�z��B�][�*R�R13����a=7Xn'j�-��T��Y#�IS�v]�]�Z.[u(�M��<Z|?c�̐�Isl7u���+,�U�!y��/h�q�R`�(�Ћ���}̢��J*�7�V��9�"֋�hZ��5ᔗu%f)ȥ��1��Ҕ�e��{�;�R��Y��W���0_��g� >y����,j�DQWv\v2�k`���Ś����ߐ�%�-�/Ւ�u���a�|>����7�
�;Q�����L��,$7���~�T�^o_��@�����R�,���Aoy�в\,Y����*3~a���#�w
�!/Y�D��G8~�qň'`ߏ�E$��W�VH��{�ry���hJ���$7J��ci��HIU�j�ɰ��#�s�:��5x[h��=�~�4�h��>.f��q���(�\��و�<#��狺ڊ�#��m�L�K^H�|��%��$8p� u�>*&��[kU�ùi��������3�V?!s�c2;��iN��'�Nm���hRZa0;X�����ٿC��A��J�{[��W��$7	>$v�2}R1a!� �Ph�e#$s+Y���:�Mi%L��{�D_~T踲�w��G��(W{l
8[�XT��
i;Y1N�����h���#��=GϘ��W�����؉�WT�|�J�&����J�I5E-�����H�vA>` ��A���P
>�R��y(�H���aB�iO����G�74JI�,z�r�ހ�Ɂ.���(�mZcEY�"��ze[��e�o�IT�q4�B4��k

*d��J�kO�8�P�f�9���+o-D	Tix0%�_H#I&����IjM~R�
k�������4JubOC4zʞh���Đ?s�`��G�
{��ϑH�k���<���y@̎7�x���Z�\��׸�McI11+�mc˗��&�n�*&Pq�������ƥ��6ф\K^)�Aճ�!T=pĬ�I ��k�o]���a�]��٬
�9?��sV7G1(����ץ��C�`vMTŞ�w�^��c�*�L�*-��mc)�yn
7�,�����M1��;��Tv�Q�
RFK�"��7B��۷n�5��p�Z�HL���,T:��H�dob�ja��p���}�Q�!JHk�����]ws�T�/�R�b�YS�4��C�9���cN��\Frs�^�y�_���1�JuV�6��.�~�8'��/‰g1��'�k��r{��hF���	nV�~[�O�p�t�9�٩���/a�r
��k��|Qb��L�j�2�zHј|��sm��_�z����7��ϟ]�\?�B�N�"�ð�L��S*���-J7:`��5�J�Ft�5�A����$R�=19��xڔ�mQ�5?A%|�E`qE���=��y~n���e�+k\�8wܔEGI�d_/�?��I`�%�*��b9��P�W:�I��=�)�ʞ]pӹs�nqx����Y�
�}��<��8�ݻZ��CNV7����E%�zS,�m��������H���"�'��mU����|�-$&"4Ю��<�4e��@�����WΡL��#�H�%����؊�C��a�1��A�q!uN\{ha��2���,#U�b��ڧPrCjz����}�&�p�8�m'
|��u媣��"�Y��\SGi�a���L�:]/2�`a�S�����}���a����}��"t��0�rR�6~���gb�H�+�yi�P�=�9e"�	f�_6���sN���O�����U�|�ʵ\�����R�)z/’�X8���+Ա���8�.q�^�*�����(Mw���c�_}c7\\�Q��� �_B��1ڣ,�+8�1�T
��;�@��]�_;պ���ζ�w�Ao̎6��_����e��B����||�P�OI8��u��*n#�A��+9޶R�&���_=���i3���z�֦`�� 5"k�ne�~
�n���,UXz���>����Jo�Ď�ޚ���h`�=F=��pQ��YPbN=�r:M1g!z
���b�6�P���)��|u��X֡�|5w2E1��o�t�A#d�s�(�pĺ*\�����~#�8�r=�D�/��6�x�xH��@\�N|ղ�ł
R���V�<_����P�-Y����ǀ����b�Z|�]����2o�Bcyj�)�-�%�6e�������s����ˢ��:����2k�=�B��9R�xO�3��ia�S �R��-��a�@��+�����(�@�E�t��|�NNL?-�����S܌�9�4�$s֚O-��?c�����y��crq����� ,��!���@���*��ޜ�`$��`M9�(�Ⱥ	RHAY"�.�u8R�D!�!�\�c<�Ō|�;eL�6G_�`_�M���
_�Y��Pwm����FK���������	{$�P�P���i����!�'�tV�IP�5),���r��$�/&�ݞ������K�=���_(�ljv!��
6����0p�掟7��R��!�ۓFA_��3��L�G
�G6JP�ĞZl!�D�#�IL��\��c�S�5�\�7�RP�o���5m]���d��b
�8Ъ��s��W,z���`�#��,(mM����ghQ.�UW���Yz��������z���Z%f�,�t�J�QaP;{M#����H�<��S��5��#�(��#�m�|��C��fD�l܊����$�Ɔ��s&,48JZht��蹻	��GI��j���i���d�@�
붱1������٬�����n����q��(}-a��1m3+�'z�%��N�/<���*F��j�˸�?���^�(��*@#ź�A��/>C4\�U�,�q!��ݫG�@�K�~��coM�}ݴ�;s�exӋ�t�`�<�6��ĩ/d�|#5]�>�ċ����d�t'�h�4=�-���-��5]*�gz2�xqB�������|���9��5?��/M�Z��Sk)%
�S�S������6X��Μ\���+��q7���&H[彼���)��'J�F��Ƹ�7�#q���&�
Yߙ�;�FW&�c�ً��o�{���)������^�#뜝��»�7r�^�b��8rrK)z��������n.�M욁@(��
ݿ$نc��y�b8�H���8]�oe��E��В�'K��qx�M[��~d�h�����c�@�����L��;��
/Z�&�{���w�}w?����Q)��DQ��������z~}���󓿿k5υ��|�s�Švn�l�#y�;�_�eB��OCI-S���Z��K��s��-�2���z���_ث��ٻ+�x���g�����k���z��)~^�x�����/ssCûY�{���)�o��z�2t(�1�n�#���%EG���G=\A�[��ߜ�v�E�ƾ���C�g�]��#2�O���=��O}"wM�}��"�
�I�	k>�Xw�i���UޕB��xa�X\ru|^��-K:��q_�cH�<�nS&>r�r؁�5W�_�򈗿[m ������GĢu]Cy1/�zj+�z�QKs�E10�
�	���1��@��Ai���)a�u) ����_�^"�#�a�nP#�'<<Ko�OH�.��F �a���Z�uW��*�Z�")�
o���Ƈ��}�OG�&���
����m��m�-f�PK��VS����setuptools/script (dev).tmpl=�
�0�" �6`�a��!�੔���[k۩�o�͜B�/�
ʢ�dաi����9kv�����ޒB��E9m��@�!='��ۿ�w=X���-*o&��3��|�u�47\�%�}ly�Ѓ�4�E H]�@����6&�����1����~�!&_PK��VS�3��j�setuptools/script.tmplSVpu���q���
v��RP�(.HM�,�2��2J��sS5����RK3�R���l��♹�E%�����@U��Eɩ��zE�y�S4��*���PKe�mWT+�~�setuptools/unicode_utils.py�R=o�0��+Na���*��Vj���\�j8G�����^��С�`K������XO:39�U�ې��(�&�{���;���;�a��[���>8���O��h�ɱ��M$�؆l},��4��$cϪ��8����4���`{�[�0��gYOϥ�s�XM��?Q�Q�+Êa�"n�5vH�9�	���4�?֐�f-V�Km��@�8��wK�[>)��?��E��˓�4}I�p9I��Ы0cq���c?�
�����@��(���9����
��XZ5=��\��2���
ZT�a5
�{wv�hu�K{o޽9�Ţ��!��1�!c�jQA��Ԥ:C��٫��
((<e�
�������-v�T7ޣ��_8��F?PKe�mWH�Lbe�setuptools/version.pym�K
�0D�9EwՍ\z����MIR?�����<�L�����(��e$0�Zp%�;�����Z�L�SP�0d+J�,'c^���;:GJ���;�9.����PKe�mW�
4�	` setuptools/wheel.py���۶�w���@R�#�4dq�[�A�k�	�eSd����%����W��{��$J��t������|�~/D��n�R�����l��˥6����?����I�"3�Jp��v3�(�,�i�2UUhP�Ou��]���?P�?��z+1kA�w��j�F��Z����I���UgJ��F(-���ux\܁x%���u��厛lע�N��Kl��*�&+�H�� F���p�ʜ��.���
�*��H%�4z6���q��9��|�bK�"�`�x��s����~R����=��ir��N��?��	a�1��nd����)�Go��@���tBĒ�v_��XXq�z��_~]%����~6C�}}��*��~�|�J_^�|�| �y�Z��4�F	�ŦȔ5�k�8��4M>���\lYS�b�6i.Ղ���C��GQ�L�jG�gB.��>2S���め_X.
a3{�P_�8�!r�B_a�.�$[0�Uzd���Y�J���n�p���J�7nIz�n�jˢ#G$զG�S%ˎ�6	@A��U{�$���\Q�m(Z	g(�B�j��ԅX�
-3"�&J����ο^��ܲ�2-���4b
�����mc*udy.DL�@�r��,3Y��@�ց"GqS���/��.���pϚ�U]m������2��Y���F�B�Ϋ�r�V5�g�Lk(�d�����O	���֌�����J�e�ҥĄ֢�v��Qm�v�-��Zg����3��bJͮ�R��T�Ԃ�ˊF���T���p�nQ@����*b;���Y�?�c��v�%)�NUM�ˍ�����a����9鬄��~�!A����P�d(Kk�`�'�q����P���c[���pT�5`="o@ځ��wlj뺐&�x�,�p �y/�$TOy�S�c�Wkhec+��T}��@���J��7��2�U���o
D�	��
�%ئ;	�	N66��2������^0:�0�1&RMa�1f�Y P�`ϳB��Ip��X��	z#Q�������'�A�g������c���k�rɢ�<F&H��`���y�Q¾e~�:u�H�\���~)5�<])�Д����G�������������A��a-�~ˑ
��A���	���ܝŖ�����E�kL��V�(��0�����Pµɔ��&Q��G�5�^(9^]�
�)��L
���D�Լ��%(Pi�S��k���i8a�[$�*�`7L�6栮Qp����KWB�� ���D:�o,Ea��}�B����"*z�/j�<cW-X?��Yzi!”��@��d��Gd��B�k�p���*Z�xq���/�3Jg�MU��&=@�C� ѴeZ�-�A�M0��)Tt%a(:I���[y�-	��ˀ��6�V��w�܀�*���W�Z2�9��-�jQ�]�q#qK�&5��g�
&/N-5L�Y��T�"����[4-]-�]�Ӓ��k���:LLt{��m���v�s=f0����:�!�a[o�p�0�p�C����.�Y��ס��ʠG4��#��O��O�p�rq�_0�b=�,?3�������Z0�R�D�zugT=�Y� `�^����k��'�A,
K��YHp���zd�z}�ʴ�aIC��{8.YiQm��t>SP/�2���}��ȣך�2�n�0�`����ayP��?���E2[�H��Vn��\��[CI�[%N9�X��.��j����y!��n�g�vfC��T���EJe�x�ÿAy�n%o�@8����
D��uMw��8�\�"<>du�XZKr#d/�Id������c�N���Fg8
¹]�N
�E_�V�-�c����x�����Z�Y�Z�?�U[���L���6]�u-0z�z{�����pq;��'���3S�����ӛ	��zI��ت;.��˗06���|R����L���p�����j@ZT���A�}U��Վ��R�H����(V�'�/�\uuL��߱�:��8�n��j�)����f���չ�3Cj�@��E1PbR�����k���|>�{^K2�½���/��[������S�#h{��
�w���,�@�`r�S	J�w�)~׈��I�\t�ia�p���ŏ���'<�~�7���GC��XaaM�����C�b�L?`y��R_d��w5����{X��W�`y������M4!�3GSB������\X��/LNҞ*��/`:��I��Gϣ�_
�\����݅��"�;Ӷz)����^9�m��{�x`��ǺQ��kz��{����͑�pf�=���c�/yfu�8�1��^�c�bF�1��*K{���uR�n����8Tc�1M�n'�7ۻ��0�·Cb�ֿ��R2�vO��rا����+��,'�v�� �mt�Q��kN�J<�j7��PKe�mW���
t�setuptools/windows_support.pyuRMo�0��Wx\hj��&
	i @CB0�RZwD�I����Җn X.������$�� �}��J/��)j�X���Q{R�g+�D`��ã_��Ϛ0�lx�C}S�%,?
)Sb?م>4|����h�yԃ�ȮpyS���rae�C�"��������jŽB�c
Q�O��.#i�Y �\a@R�V�&J&�'J{����Uˣ���P�B���N���%m��B�i�ቜ7�W���z9NǴSu��;1��O
}�C�q�P	����y��y
7Re0{߬����h�X���S�{z�6\,f�Ngco�^/�Ï��{��F�a�N��~��w��6��jÄ���J>�X�1�6VJ*�f?PKe�mW�B괯�!setuptools/_distutils/__init__.pyM�1�1E{��+
��+��.��
�Fa�,���Is{�-��{��s��R��L��0� ��^�/����T.i�w�jdl�P9�d�T)��ۤ}�q����YS��̥�ȭ�X�
0���6)C�1i��4�K��sDb�%Msc�@�`���;��/C����QLm�F�2=PKe�mW��1MQ&setuptools/_distutils/_msvccompiler.py�<ks�8��+pteI%2�̬�|���L���.�If��bQ$$qL�<�����_w ���ݹ�:V%�	����79�'���$~��(�WE��r4:̳*L2��_|:<T�',�X�*R���\%y��9����3Q�aT��3��P��</�$*s��+�)u��������z��4���<�S��=��n�j�>]P?�:fiX��g�k*���Em���"/+�/Oc��K
�d��������m��9�3��eRU<c�
;�e���4��e��ߟ�3��
��%��e�
{�S���Y����8*����dv�׊%^�,�z�$��|���1tF�`6�Ey!"���H.K�[��d�E0q���5gG�-.3,&�a���D=+�<�y�$�*Mf��mXf�uӣΐC��Wyt3�Ek��0%���,�r�7Ꙇ�d@�h4/�{
��H����L�wg ��+��7���Q�:�$��[vC_��4B��14b�����At��i���u�WA�hP|H@T�<oADy�U�Q��,@�	�.��x	b�א}�7l_��?-x��L�<�-���/ӿ'��'����w���[�\��’��5�M����.�.~�t��c�#�}5Nr>=8b�͌7�O?��>��|oƎ���xQ��Z��0��Y��eJ�=C���R^��7#J^�e�>���#j����B�^�/㤄�S�	����&A�B+���k�u���jWf�իOaZs&��dl
����J�Xo�9[�Y�I�YΧ?�����.�D.�Di܇<H��0,��iV�z<�U�{D�Ү�M�M��>h2���F�J����B��Z�a�f�����;�	��exLO�~����F
�a����/�)����
f�����kq�y���$�x�͢
��z"OR�cG�1�N��/;J���$�q�İL�
��a����y�Eh�݈�ώ+�
7@1KY��EIҤu
Q�Gi��!\�I�����%�%�����:JG )汯�)q�s��Z���2�|0��sV�2\�,���^��1C�O7e��4w�!a)��oxG?Z���*�ʻ��Nk��y�y8ׄ9[B ���%�ap������GTN�5�ג�d��T�XZ�D�7ͷ���������w���(/�+m�Z2
�P�:�uT��O���	�Y�cܳ�fv��~߁`'�*g��³|�g0����L��싲��1K<?���lYl�����7���!RpP�%i�D��:I�V�l��_�j�0m�����2�8��������燎���Š�lO~N�WA��_/��l(W�?�ת��6�j[�uX
`���H 
)Bvج�w���?����*_�]XG%�?559k���?�̬m/G�&�^-��k;�y�'|�Am�
M3bm4��>/4��J��uW��gae[�VD�`����x�'�I�Bp�b� �z9��F+��&�;���U����9:���xy|r|��G�8}��b�<1~�y8EC�q�9Ԅ�a�!�]	�%�k��2ЗS��M��o��%_�I�L�(���w`����n����=����þ|e��r}���Ɩۚ�
�rߘ������e�k����s�j���u��Ƭ�%�w-{z�9e��B?[:	��}I����E�
����if t��Xqģ1��X#^A+aM��&�aYQ��F�{ź�E�&�Ali��t���f¯����J�.
��G��F���`��Q�Eq�İ�q���.˄�F4)�툵�T��F�+��O) ڀ	U]�@�z��a-%j�2M����,��}B���q~��볃�wL�-���+e���
��FΝ�D��华^����3��u���jV	�d�m�d�;@�W�pC�J�����yD0����H��0���v<���n�vB�ue�\|厥@x�v^H�@�)�8���@2~z�x�m�V�3̳Nz��g��A�0�a�(��eV���I��7�̋��ײv����pbE��
RP �@0�2-F�Z,!�޽�EJ���\�8'�'Y��1����5g��ߝ%�"�/�}>~:8�h#Hb�{Ս}���4���\��q��FslQ��*yzͷ1kt�0�"�.�%N%ú,*�H�G栔Ȱ^��Gc���Rr$�幭�6EU�ǧ�$��娠��X�b���P�o�#�`(��[�.VWae�����̅ #,�q����,��t�@�9�נɈ�@��P��t٬.yXG%�`A��I,	i+d
Й`��b
�pub�!�Rؖ�!�)ߍ�Z��@}��4��}b�2q
�6,e��TH	�z������
XrM2�d���3�	�c64�`~՜>+�u؈AV!�2.�o,��:Kv(��N��eĉ`M�4�dw��,Y�+׏�k�T��<|����ӽ�>����7��QQ����z��ZS�r�������ba���4;T��2 �(��y6��z�>�R���C�X4�w�$>�q�)���i�7�I�FD]��Q=�a��q��`Ȩc�vT��}"�(�@�:��{��Pd`�$<����8���1�
�#xgx�v	4fChƫѭo	Kp)L����@$�T7R2w�2�p"c�QTmZ�(����a*xKsۨpn`�1��uU�U��#@@C�[�>�Nh���%F J<�PSX�` ��z�.���I�('�9Lp���i��[�Bdm�n2��I"�I6
o
:T/r�E	��>�	��\�j�l郙�i;�ƽ���.�%`+�2`�U�6�o}t�_�=��g�CɄ�ɏq;'c�"5F
k\���*k��7	0ڞ���u;�L�1�L�M��D;|;�fh�v���ۥf��w6��:��XQ
T����݌A[�t5�7�6N�R}R%8�ΐ@�6�5��;d��?��{�A����$7`륧m��-����'������d�ZIf-����WŖ4B��e��q��auʃ~)�����]��	@*!�{�2J�*zW��;�z�NXT�B�(ހf'������KU0h��6�d�;�㾋�S��W�*ᔣ�30��>E�߄t��	�k�w�H�g�d��ϳ<�9����+���}�|BG��o>�L������ѽ3TU|`�XA���H��9�Єi<O���8<���~�<8�pJ�N.�����%�㽷ON��IO��V0�S�71�������������h�����F��>��FH2F�rt"W����!r�^�!��C��9ý�!�]���3����������˃7'SY��j�����/�zh�b�6�ΧG�雿M/����X�4|�!JL)z�����o��V�� ��6��B���>;IA8:]��e�����~��f;���
t�-dγ=���M����m�B����,�S7�7��4�:cW��>�M��vJ=�z%K��j��_'���Y{N/�oW[���E���u�n����VN�j�v\��	!�{)<�W^a����a���,��@�O\H�tN����&�
���d=D!�
>�}Y	����H
�ؤ��Ef[��i����޵�g������_��%���t�<@�F�2N7,ͳ���}�C�%��ì�~��:~����&
0|%1��,�B�<�%
cC���<�uV�^UF����5x���
>��q��M]l9˵���á��2��@:��cYM�B��K��m�9,K!i�Q=SY
!9E����a(q2�s,+n�>sW�@��Q�7t��a�E��_�::���~���fx�Y8�Y:ژM[U�y}+g7�]�
�(��02%��|��.�r����W�B���������N�Q��}���&���"м0�S�i�x��?����.�-fz*��z!5.0'�/3<@ț��zb_�d1
��`W?,A�}�V����f�5�|G�mϝZh}K�XHZf�8R̰˞��	���+-9����a�W"�^���!3�'��m���a�᳃��P	)S��T�/�(���~����Iv~+�P�4��n��0V�@��f-7�Tc-$�Y	p�NKR
��p�z��fI�o f���I����l�e�`�RFgރi�z<���OG�(P���~rv��"O�����R�8�L�&b�# ���[��@�o3�J������j瘴�\�� �	��I���π���}�j�g��!�jֿW�?$�[�ЏV�V�S��.�"�R�<��	�D��p�(|�n�;��E��\��\j��8�rߌ��P�,�p�X�Ru]w��9eЏUvƼ>`��	F��%L]�^	Ӆ:�;
�'�5�d���$���Xm����J��n�E1c�f��l�Y
�����"`t�7Rz×:=RV�����b�sm�
J��U�w䙥�дҎ���E��AX��w'����?Ju��0�Ȝ.���#n���h�:���*Q��a$��� 00�D�u��l���X¡\vG�
�hq*5�h�˿�r�_�ܝ��	S(��Q�ϮԦ�+Vm�Q7�0=s�x���w�+f�Ʊm��<�W���Q�A�#B�V���o��mR��
Ul�|�
T<h�Y<T*k2��������{6��=]�&��#�d�����3�&��_2��'w��8�bz}
@�]sh�ٶ�]=��{<䬉���=��po���ƥS��s7J{���/�\T{�uW���@�Qq���!�E��yX����9�<{"�ki��A�D1�~z^��yj��!ʪ����oэ���R�D0�.v�|7�;�34��v@���@tש�o���í[YJ7���7F��nW;�C����
�f5���&d�5��H�=(�*�*�Z�?�%�f@�u;^˼׬��Z��ۥ�Ul��~p`آk�r��+�ҽ��#��ɑ?. �
�r���nOx�TVW�ntVͺ��m���
`���V��۩6�.lkA�o����Y��l_[��W�Acݝo|��P��r�O=;=�ܣ�fE~&�lc"+����QO��]�g�|ێ�>΅vB���L�AuBL��0J�`z
�����$Z���:��J���x�DA�]�h)`.!@�w�#�}Xz�7�>���OA��2�Y	�e
��ƀ	��HM��]P�����^
�a�3WTE��q�8�BL$�����B�q;�5����	:��Ջ��neG��j>^����j��ጇ�A��yv�g`�rU���{8�oX0lY�#XM�JsT�� S;~vr����n���:�@P��{q����Iy������;�]���_Y}�1{Z��!F�6���`K�p����b��a�q��Enm�H�PS���JT�:ބ.��'{[�(BPAR���0�	$x�W��c�Z�
^B��7/}{�>��f��/�LR�_�_R_Wa.��Zy��ƭ!]b�b������k�����)��������{�Ӷ��U=�H�Ē>��	!ͫ��®������o���W`Ee�
���^�U������
�#UVg"�spA���Mzf!��û]��&\�"x�	��ul�=u�$/E��>����ޝ^|��8uv��on�2�JQM�;�
��:��"�8B�q�&H�h�Q���k���[%R��<n
��gg�$Y]��?�d,��tD�q*��xn�2nW��H��K����ރ���$����π)@���'�k�^t����і��޼���,+6��D7ѵ�������s�eh>(��ߺр�{�w�#8Nܫ���E��jF��2NF:�>�V�O��Ǯ-4:�o�iɔ�^s:ĺ�tV�9^�T��h�5��e�3̓����2Ɠ�S�-nd�q_I2�BH��Cq�R`_B����3���X�G=��ھ�݀~f���Sւp��l(n��2��-�ݗV��Tkͬ��>�;�4/�K#����%���[<��K���!�HW�PKe�mW��5R
|!%setuptools/_distutils/archive_util.py�Y[���~ׯ��0H&4�:o6��.z��q�A�ȑ�.E�r��6�=ߙ;)jmA���9sns�
��(E?�e%Ҭ��_��b���ĶC��eS�m:�w<��z�40ۖ,�n�U�H�C٪�d�ﳞ���Y�e���4�Ţ<�rU,�]s`Ǭ��)�^�w#Nb��Ӌ�G/��X�=���o�����gK�Ϧ担"�$�jɽ1�o�y.�L�E�k._�E�I���m���	�٬��'��i�����=���t��7F��Zծ�*	`Q|��X]��"�� ��C3��|��^�fh�ʻ���u�K!13���w��>�D��ӻFm�����x��Z���'���	��"��M?ς�y�ZL�rj.��f���A�nN-��8�H|�G��[���m2���K��#�"aysh�D,�3H��6����Vt�u7�x�d�9ּ[�DY�|v�M��C�Q�Qn��%ŋ��'��W�;� �����>�t���ѳ
g�o9����',�`�9�	��ۜ�s�p�)c��b�|l
r����S�oj�}�<�LH�CU�B){�rXN®
�7�H	¢����)R�Y��j�q�N�{3�U�������k�ʂ�zI�|�:^�^�Ub3�Zap��v��
�B��}��K%�Kk�A(��3mW���!���{^˧(HwR���A�?��ɑ��Sk��W��9bL���E3��>�%�OH�������5�+�����Ӟ��3ƫ>Θ�7	f��iD.��KGS�8KgD$�2�	�V�N�mOB�w�e���,�3^��-�������n7О��-�y�
Z�9����$�؋*Y)8�9�.T4�)�d��mɹ/��G�ެ�`SL�96�h�2����Kf��3$��d���g�R!�v9�92�3��Um5"�_*�t䣊]dԿ��T[��i���FX�.Њ��T-��2�:��Ֆ
u��"��$-�m��-)��f��\�ٜ(c�J@;�CE����L�B��@L�<�$	�	I�+�H|���u�K����m��{и���d���~���AG�Թ4�6-�G�S9��)���it�1ϫ�!��=͊"r	dzdR_��<�,hG^!GG��2��_�үg޲��*�˰��0ED����EP�Eu��'*����hѕH�@�2��v@9�S�<0�?�ߑ�:e��~$5x��Dz��y8V_~ �q�?��	?�����6�s�eg��L��鄅�_�ȽO7U�5�\I7S����bMv^�y�==W^�3�AJ�ʮ���\1h!M1a����6��*��<���{y*`�j�%�/k�C0@9pۀcx�Hd��.��Q�ej�채��LG��Ki������z@�)�;kS�L��R�cY�?�HV�h���*�Q��J�����D*�"�tN�y�>SRֳ	{����*, 
��Y<�]S���qUy�M�zw4)�9�j�Z�藺m;��1O�Ǐ����7R9��ҡ{8E��?�r`�2;�{1Aa?Vy �8�N�;�E��Ω��(
�q�ԕ��ӭ��O�p�Vf�X�a�Xt�/=4�TSu?���C\�'�EVQAJ���1R�Ȁ��
��;�-��k�P�}�te�\���Tg��������ZH?��;
�c:�q��ُ������������7�����������!�?~���9�`��9WP�Q?�e�e�rI�sLBɈ#;�B࿚���(���,�����KT���t��Vp��?����x,��
j���1�n-��[;g�-�y�/V��L�����u�z-Mų�#�{D6؜9W
Y I>/S�z�|^)~��;�b��_�~~�~��?^}��j´{�>���^�n"W��;^%j��)��*N���&]bR�s���z��sH4�� ���+�������''��i�å&=��t��J*4��MU���kS�Sӑ�"ҿ�ChUMw�g
D��2���PMy�0p�ok��FG%�Ǝ>�3��h�ntljK�<M�|O�izW��&�8�m���#�f��Qg�h����؄E�꺔s_s��/<ף�X�w�L��>d�E��Iy^�ˣ�rJء��7�ez&Z���2W����t7��Z^��&�^�2]�j�H��y9�<��{�@u�|4�}J*���
yiA�#���+�a�KV�}j�\���2uYC|�҆C>t�xRho�w��(&9�AM�zR"4�
/U[
_
��匔o�{B:��O3]GR����ӑ����Q�4H:�1T��f4m�<���^���W�M]��_��/e9v�5�y>2�7�"C<ʏ�ʣ;��9�M�f�0?k�\V�ͰCɽ��1��@�4s�eD׳���m���v/���ł��B2��Q1\���ٴ;^Q����n'�_�C��Oz?*�w�)���$ިݕv�K�M'���ԉH�j9�|P����nec9�Ih�����W"��kD�
�tiV.3��6������+^���� �$��F}�B��d�Y�d��,�e�N����\fK��PKe�mW�F9��.:%setuptools/_distutils/bcppcompiler.py�]��6�}�E ��� }�"(�4-z�6A�"�A�h�]ITIi������E���5�Ė�Ù�|sv�XB�]+J���M�˪%W�d�f���;�ʬ.^�����LTM�+ ��5�[��9�6�UY޲��e���V*��ث�O��j}�X,...���!�͑�9���C�k-�m2�o�Tb'�d���{|��U��`n�iQ����W�K�#k�M)���n?JU��,EV�5���GVJy�Y)n9bR<�,co޾G������s"M�A$ZV\֜��ʂiѲBj�p2	ɮ%2��
h�ehX�A��{�~��j�� /�Z&A�JVl8M��T$O|������{��F�Ľ����7b��o�����H����[�G��Ύ�i�x�dεNeC�"�p�_��-O�qZ�fY�	s�J����#a߽z��Q��-�Q
	�+�rs�p,Y;�&�[�����X���z�|0�
��Q2�L���j�(��H�c��K��F��%�G�[�9�
؎�V��$۪�T��\�Q棶k�>_�R�Jy��@��}�I�YHSJҵ٦�:^Fl�)�u9�
6��(7��ZT�,h7�u	ڷ�xޙ:2�
�Z��-C�,�*y��E���e�Y-������x�p��T�O(j��v�%$Z���#�-��l�g��xi��?N��zu(�6cq�A@*���W�t�����a�ܒ��9�h��^��h�G7�U�L_�Q��?8x����-]�
@�s�h"uVq44���8�_�љ�E��p�'id�U@��!��Hn��®�Id�S��Rlxb!����DQ��sV��_�?���':rG`�'`B������E��,ּ����o��/�Ͻ,�1U]=��a���9H9��m�8��Y��b����)0&���h#X�0!����[s��
W��g����"��;�j�Wp��������`�<
�k�9}���V �� ��&Ͽz�G��-���B��0h��v�zY���F��u��3Z׳�/迿���sk��֦�t�Cb�(�e�өQ[��}c�X{k����+�����W�����-�#&X�D�
�:��
��£v�i���`��4�����f޽��ҿ��
	��\Im�:/���k����3h�#*�&S;l�I����^�o�f��$��:\�0�[�eӉ��	$��kR'��Ť��g�t�>����e�س4��\ ��5�]g
"fq�ʣ���_��-$^O9o�:^j�?��|-�T8&��8�;^M�F�$4�	�5,�A�7-�'?R=E�
x܎�^�*�?��&�^C�C�ΰ�f4��R��;�/Gp��<^��(�Ҟ2��-!>H`RL��#���(A��"�}+�ђ�#<)����3"�;5��:�`�W\GS�j�g	J[��
ԃ��w褈$ѮO�啐*�և�i��$`��c���	�I�)0s�����a/5�dPe�׋���H�b���@	���r�ˑ�N�EL�+���Ne����v����5y���B�R���}w�.�^aF�`��U�i�vQ�����b1��r�j��>�l�.D�%è-��aS�'^K�U��LP���:�f��~�m /=�D��E�P ���"0�gT�Y���c��Y�rW��B�;^��ܔ�S}�9v9&L9��T�����#YU��BFș>�mvT_�,�][��ͱ^.BW�$53�W�!��<@�Q(�2Pn��An<�/��3
|�	�
{:�O]�gO���^��'ěV��7lv=5���)C�D
�GM��Y�Y��j�̸��P֝.��˝��B<�O��s�'C�uV�&�_��}îK,aɹl�}jR:�Y��}֗�a��*&Qm��������#U��ٔ.�}9V�ȉ(H,
��Ƙ?i��p>�O�헙�ˏ��wP��dE�h�@3R�H�<��ک�8
�ܭ��x��G�ͩ'�]�j�KY.�B�
ljK������.���y�ꄭ��9���I�\�y{��@u�@T<}��c�7��j#�y�=S��C����
���U3����0�l��rb��h@}��=�V��<Px*!�����Z���4���%�紜wS�g�.�r�� �Fv�T/~�]o̾��n�4��hSt��8�u��Y�B���-���4N}�+{����yw`7{��R�Į��o�lo�g���Do�H�'��T�
���?�~���o�{�z��*�2Mi��_������@�[��3ߤ���������c���pT|6��6�ga� DT���B��~$j�u��BŢ[�r��˴&��1*�T������}�����7Qzv��j�xb��J&1M��r|#��2����kH��]?�Y�� �h��Q�3s!fu�鱩���Ӏ�`�'���n(���㻷���-������qp,Լ[���n�xq��L�h�)	b]N�"53�<ns;�����כ�h�:�Pg�a�}F�_��Wں�gr����^�����Xߺ
{dF��KD�_t��7r�
mh�+�C��r���.�0��FǯB�Ǔ�����7��*A
8�;_L� F�OƲ���������L���݈Z�o�C��~��1^~1a�D�O'���aZ<{c�o�=-n���N#!�,hr�����*�J	%͚G3��1��WҙN��E+�����U�ClJ}�����S��W��"�Ϭ2����8	�;l�}X-��BTH̪२@�
�t���p墳|�ei���_8�����(�����
�v	:c߿�홝�au���>�o��NOD�`��h\��p3D �g@̉88��-d����*�C!7wBv��v�!Pj�,g�N������rUmO��J�9�6<�P�z�,<J�\�ې�����U�طj���_�צ��,	#eQ���4MCL�z����Z��,��m#�����(�� �߄.��貍CQ���sv%I���PD��A��p�W�!
L(�[l͠�U��i���������S����C�P0ŽR���+%�e�1g���v2	���,Y�����h���<K���@c�����m;0zR��^�{L� 4ji
"���c��'�2�3�Kƌ"��OSGf���s��r�e�6ԲK���I�IƘM����LL!+�>|����� ����0z�8>�JN���7�=�	L��r:[�«�iW�����pZ����N!9�,,>k��\M���-4�'��B�a��ctz�t��j�8'7��&��r�\�&���9�aNZ�cBY�*���^����RtrނG�H\O��%9l\Q��kt|���/=DxC���Lwۭ��*3�X�ػ#��OL��7\6^�4A�?$�y��(Q�[g���2E�l�q�#�}�Z��CQ���cT�aJJ6AN�䈲|���q)�i��&��ge���/�K�&ו/+��r���ޣ�ԧ\��^�o�f4;�"-�N�P��H����(�M�o�p�/�#�f_ͦ��$��՝C9���7bj����3~�J�a�>���J0�ʳ@g�q���F���]*l}	��h�uP/f�ӌ�uDʩC`re�N3Q��	�H�P�T9�.���������>x�hܰ�,,ԓ9�݂D�'�I�20�٨��NӼ���D�Ӟ���x0�we9ʰ�n���K*H��6�Q�؜�ֿ���6��>�&n�}(aU0c|M�$�M0ח2Q3�ۄx�M�*"�SŤM�u���t���D$�4�
L	���A.��d�mVg��_���v�uu�dNj	`�%}�y�ƀ(|J�,�'�-���{0����ߤ�HeB�\����ۋ��RB�9�m���	�+�x��#
��眓��w^fwfr��u��ο΂=|%:��/FG�깋A71�c�7@�/w35/O��Q��r7�AD7��4�`ϸrWM���Y�}����>KG��gJ*��l9�@)�h9QF� �(��O>^`��:��Ǫ���f���tЛɢyȃK�1��[D0_��A%3�Q�h�$�33\�>��,s�Z)�4�>Q��P��>�Ҍ����*����<;�u�+���PKe�mW��| �1��"setuptools/_distutils/ccompiler.py�}�sDZ��+6P���@��!U��l�vt�-Wd��B-v�]dw!
����kfzv$�8��r�J,�������L&E�����E�7�]Y����eS�YYw�˗��<��$[u}��}��:��U�uI��Ia�em���uo�u���u��'����A*�:�6�������O�C7O�@�f��I��m�.���ï�]vW�o�a�5���_m�m�,��aˢlÆ�����2��Um�L�ܴ�~7l��u����7�)�h�}?��m[5��3ƶۏ˳~i_���	7��j�A���� X��;��,�-��˪k���K�fk�[����o��K��)�7���ƀ���?�t`�e����`7e]$Y�.x-������d�g5�&��u��HjYU�zس��o��7;-�eU��&�x��ke�]�j�~�S��e}ߖ+�
��-�p���5�n:؁ѦF�����j_���6mi�6��F��:������6�s=�C�/Z�=#���Ȳ����,�;D���o���T��bۃ�����Hp�Y�U�t���쀨F��l�J��L{�3�h�`�#Bn1l�P(o��dj'��;3ŝ�d��P��@u_�	?7Ќ�*_��� �s��.�{��m
�Ïn��`=[���
�*$����X�s7�� ��+W�Qs�+��'����+;�!S�+pS筁E9�M��J`̇�0�M��
b��0��
��P��98j�P�S��DY{H�����)�V��ji���iR��`1��	Ȍhq��Ұ�K��.9@V�5ݮ��ȡ�]�xN�w�!�Gr��K�����?#-ԛ.����.*���>�r)��fXa����
�`EQ���w�K����;Ib�P[[�L��~[�/b�9��j�����U�Az�Ѵ7َ�X�-^�x.�-�=����qqh4��]]~T���Q���cΔ���5
3�L	�8�nշB��iA&a�Z���FA��mYX�Â`��;�n��f��F}:OJ`u�L�<�x
�����b�������w��B�y=�Qt{h(��`0�n�C^2!���v��fq�4���&�ء�k`%�<�p��-iB*8�fz[��b�=hzd���+&��M��xA���� 
Ȼ�x}
��8zV�9C�-){����&H��ɪ$���wI�n��MO☩�MDAkڙ�l�� �D:���ۃ�O�m|�3�C
	�� ���ͭ�M#[�L����1�^�9(�#�.����"C��[TMNlJjD��9�:������%4��Va�(̣ޣ%��+!��6��#
�:�ϛ���4j�"k��u6���`G�cv0�j�.����3/��{5LN`�!c�<�6+���v�5��(�@� 5���cQڵ��|�M�g1��?Oh�q7@~!QPO��wDH=x�P�/��~��
�"�����aƳx��W���~�w���C[y8AK�t�~�2�l_
g�f�m�^L�jh�~��f;!�
��x�k�mn�w%��n}�n��R��䷨ø��H'�݈M[���I�og�3؀5�������¢�	�j�5`�p[~T�@���
L�|̐@o��H���w��$�&�|�[�/[�=e���&�ʖ7�VG�kx�ӧ���W��r�\�����0���[<}z�
L�6?>�f+�^;2�����m�J����y�NK�\�5��K�%����
d���`���e���W �>�]�a��BZ��[�5��/���+�����`o� ��%��%�kd�Ч�;�c	g���\�a�v-�2�#+։�‰��3U&�MʊA��ݿ�m���Z}2C�B�vas�~ԟ�Ȕ�Y�73⭖�=}����dJ�c2+(H�`u�����TaH8Y����Y<f1[��h�}��	m!v���2@�(n�5##{����rv0P�w[�`'���n8CH����eb�j!���X�c2'�<2��c���9�0x)f����\�&�=�D�u<7�L�?�\ҁ�Ue��th��0�4[,ܗ���.7�]f^����Ct����A�8BV5�!t�S%�(��K�0�v�Q�k���KְO'�����M�F�L&�|POuIRRg�w�ۙDFP�����.`B4JDb�e�'�e�Q&�Yp��.�	��vp�8��a�nJ~��"�J�ٙ�謱��{��2㠄;Ƈf�4q����.��	�:�J��g/�>�ʑ;�.�F�匙��b�v�H;��Ё��%��Z��,W~��f��3vt����)e��Lp�#��՛�������aU�F��V����5�w5gb3BC��U^�Y�ݣρ�V����؁`�5��vE�����o�
�f����L�V�%��г�P��r��HP�\pVY~��`L7���T����i�_�(=xE���F-�~hl�B�>��Lq����,w��Y8�Ha>��0�6eq���b�5��z��<�]["�m�
"��hͦuޓ[j�ٛ��;�1�%E�cNh=�!Sc�mO�ʇA+���r�!�xw�R�4eͮ�@�&帋h����@U3ǘ>r��A8[�>@�
�*XtAA"O�n� :|�c+���`Y*�N�[�":$l�?mV����¾�3�t��1�]�-�~"�BI�m�u�䳨#��ϒ���%��D�\�f�)/^�*K4�g#�/���)};G0R�=��p��s6Ug�����V,�6�f�=Y0>���n�تm2����}ruE�"k�}`Ž�ӫ�٠��$h����Q��k�!���1i�̀O@�B�<U��0U�߷���l�3j�/B�rq��+x����U��l��Os�����'����|�$nls��� ����Ϝ�8���I�ȧ�3�>�'_o�h�	u�~���<�Y��h���qH#0���1a�Е���V���F�	ȉ���4���B&�dX|;��s�쯢������E�WdcY�WMs�xH6yq��g֟#�ֿ��c�s�a)P�`5t�F�=AV�o�4�;��=�.�D��`=|?��LՉO�������#�><��QQ�N��Y����)�F��z�ʓ��;���h���xEd��t����@Y�$�򇷯A7ЃbV�V/�?̢�QK<��U>
8
y�A����-��S��I��e�<<��nu�Q�#P��
�Ÿ%��5�ߢI&�6�4���.���>_��xM���R>��1���N�}
�z�.8u$�z�M��V8���>
f:�!���=��pзóժ�3����΀�$o�8_�%�0���(:&+p����x槇n��0�Q����R�QJi܁4�e�xOB������DO��`�(�����*6Ȋb��v֒)ې
�,
t��)n�Fc�
�U
Zq"��tX�X��h���Q�L��{��%�G(U��;x��C�9�p�~�2�|�}�,,I����g������(�i�
�p��cs`�5�#��Aq�$��48�#oO|�bkL��ܧ��&�t�{��\�#��F��Zv�R�lGȘMi�)�`��3�s���k��H��>E=��v�6��s�7�C���!H�Gv��	��f�#*ƭ�V�.4Ugr�54t"��8�~ilݜ��mVʼn0ć�9'����Na(b���I'�="⒏���f�QS�6p��P�1�̓�#�5�L�?�eD�#�mdCm3�䠫Ihq�SԖ�!h)$I�%�,1�~��Q����H����K�!�=����i����ǭ'�F1E[0��z�~'�8S���t��Ca�W���.8�	!���Q�/vX�1�脎v�E���q¦;t��9V텖3V2�$h��1I�A���8�G�'�2�Ri�̚z�׼�����!���:8��h�ީ�{�m48�sj۶��!���HJ�b��>J	��J0r|�O&��	�:ټg-�c��k�iV[@ꑩ��"%�SHB��Z*�͑�&F:��i95>b'շK˂C�#B�ň@F'�Y�U�f��Ir��C���9v�lm
I>ؓ֨�+�qg�YDq����[�
l�Ǣ�VZ:�E��^��*<��Ȫ<����I����oY�eDA��,)�i�h�0���7"A��	M��}�Ø'%ߧZװ�%yDȟ.gtf���v�^�N�[����S�B.��-	�w6���F��U�d.�]&�nn����3b���B���cX�L��<eq�U�!I6��BoH����@z��ﮆ�Y�+9
P�v���ax}�s���a>�dv��+YP��)4	��i�Ypv���4IuL�}�f�J�Z�bv��F3�d+茠,Y(&�f����>�tG�)�kOnf�c#�g�8ݏFI��'a&ۃ�5;@1KU��0[�ہ(�d���c� Y΋1%�T���n���t��Q�xƸb~�E���M�ZՂ��������-��rc�~/%�)H%Օn�a.�߽���A�mVoL��=�9b���@g��կJ���M�/�ZB�)�pv�<l�<I�GS���G�N�i=��{��<�ګ�i�ň�o�d3���3 %�7���|�G�"�]S��=`N��`��-g����c��(�as�1N��`�vO�&�Ӌ|�^S?
n�t����t�	������-�x�6A&�G��46<-J�qz��PD�	=i4y��q��D����S2��	�f�;��(S 0:E�%v�)O�Q���G��3��0%
�)�e:P����IV�kP,�xb�~�	J��P�B�4�Ao�}�π�{�-?��?F9��l�R��ȋ�raDȁ6�ĆP����U���~�4�r���J�bl�1K�g�?Қq��-��Т��1�F��e۸F8zk�x����#R�!��3j��o�
Fܑh��1��N��rTQ�W����)�Q��D�j.�T�6�������b��������x�`���c�T�@ς$���ݛ�����'�r)��ݖ�ݱh�?���E��m�'Sub���@q���A$��r���0�&�����f}�7A#ҶX���!x�6�m�V�Y�X���:fm������VѢ�m��+�#���6��^Z8�%�E��*ӍIA~�}��ʡ����OTF�w(�Z�s�֘�I�ZZt���\�6�� �^7sW�D}�����\��OK��<�:Z���Qf��S�O�:\��B�Œ��^R��mV��7e�O�C��7g�ų�B�r�5WvF��(_����飿p�GM���1Wx�t�;z�7�m���O��g	�`��p���v8����w�pA����(\=�����!�����5~@�LJ�.Qp���B]���)ޢ�$�;�����;��cl��qr[��T���VU(�E�a�0�͝q�nk���c8q>�rZ�A��rsn�;n.�����~�	ݳG�\Q��S]7�%U�m�Aq��ޔ���R�i��(��ڨ�΋�BK{�?t���Ҹfemm���Ӵ��$��]���.��juP\�e��6�S�=�1D��F	���lt��^�c"n��`��t����1�pl,�4?���
��˜¡[���S���}{�����`Aߥ2�lԛ���3:�C(�	�h;
p����zu�m<�N�v�����4�;�|���l5RꐓtǪ�4��!�������C�kH
�c`����݇óS;%4�`!�fV>�\�P���JD�a��&�ܵe��iHY��3���]_`���j�T#ׅ؜;�R�����'�p�\4Qe��(`g|\��űK
�{	�h:�tj�{����p��K,��*p�g��]�7Ln����
|���#Vp�`�����`}���̐(���=^.N�`F�
�(�@Y��t�"�CY��X��]�K���'{XɱWW�h�$����� *�d3L^kF�CNlv�X2��n_C�"�E�aFǠ�R�S��do$ݘ�s�S�~d0?��� e�H�$d��"�T�G�a�����#*�:2(�aӲ�(�],�I��
�K�8��M[nJ�er'ߠ�N�DT3oNuY���v�{V��9�^e�t(�6�$墏t�;���EL�uM�u"���4���m�Xu�[>�cj�JU�Uc6�"���	K���?�Ŵ��])��E&�c�i]��G�p��6$QB}=+�0�ѫ�r7�ʱ���Z\dh�]��)�e��ٳ��ݔ�B@]���t�{ ^�<�L
r3Ae�.d�Pr�zt�T����AϓD���U�T&�y+ڽ	�9��}|S�d!��;lWMER�2��Xf�9��c�N߁��DTp�?�t*�Ӆ�dZo��&$ɩv%�$i�Q�*I�N��≿���
���N^����cg�h"�ğq^��a�>���.j$�7�:�s���*�|P
�h��
cr$����o]p�:d�.�v��\��а�Z��k��KƮ��[��0c�eg�S��r)�����EH�d(,�^�� -� �₰��]���9x��<��Q�׃@���rH�؍sP]���9*�	���Vl%���p$ǬU�t6mV�yAgDC�P����' ��Հ%�7��zP�F�%o�p�QU�&q'�*�5�J��x�S���?_9
K:�f�IQ8�����s�x6:�i��H/3�z�(
�u�m�&!��g�'s8����VA*�T��կs7�ܮ��nŎJρ��G6��\���Y���p=��3O]�$L&~�T�^�LY�6�0�N�r
?Mas��8�W@�
�\2p�(8��e^��H��ؑ�����‘By��;��;Tse��߯�h��
��$��
K��·��$�2!eU��tp�@�`�\�O`2k��膰��1�{�.,�v� �7(�7��V�R���g{���C�U?��Is�"���VUU�[�\��=�
_"T���N�4}�{U�k��-zܴv���J?��C�'�W6�2P�e=8�
�3��|�_�I4*��ԍ�=�C�pS�ǰH2�w5$Rn���\����Р�.�L�����}L���]�R�_�i�v�wc��r�����G%q�C^v��*_����Kʷ���_�Z���~��'Pt���K��6߽���_��?U#�{n���_�|�ӗ_}�5���&^��3�PL����rw�[�E�="����m���X;p���\�ka������X$/lA�ʲ7�]���J��]��韭�a({,���|
��2MchT����GVz�)��q���k$^^��VPSM�,��_k�Ȑ������b��;V�Sz4(��*��[�ýwW�A"�/����_���+� �/��5��P3ccL����Ç�����˅�#&m��{����-�nT��j�[VZ*��-ƒk3&v�E9�C.�*9��'F{vP'OR��������ΧTN�]�X�J
vY&?�A�LU�hv���*m���)4�v�^�D��'G*X���S�]����ه�\u&(4���!��Mk���ua��5'�J�?��r�!*�!�{K�Y\�za��6b�.C��v���F���s��n���V0e���8�7v��PO�3C�Z�33Xe�䷥x	`�qm��Xuc�0I�}�f�M(�����"
y�B���Gp�)���|R�3����~?k<�۷�q;ǯ�D,�(�̱C,�Xle"�K���i�,'U����>�t�훪�)���L����|�I���qc�tZ�Ko��S��Du�02�P��#�Z��vǍQ�s���~6e�Oܪ
�=|Z=h{���~�7{��=�dj��c�E���#� ��ZM�0`���x��jʤ7��`�k��Ge����j��цj�Ɓ>�� �e+��L��/6� �%��ǰ�`��d�K�x�'�^�H�KN��qL�<��G�b���ъ{�qH�j5,��-�U7�R��O=��}��a��}�a��~[ZO��5v�6�gI!S2��~_v���c�n���*��+�^z�.֝@�kN����oݣZO�U�oj���$�kT��x���3���Mg���U&t���ͷי��f�Ċ�Ef]�o���o����7��W'�G�d��>|�:���ʭ*(G�YГ-��?yM7Y���.+�?YZ�Y2A��q�6��c�E�;j���s~+��C�vN6��/��!�}Ko�ؠ��4�w����*����u&��?�mSo���� ����Ӹ����{<�ʛ:�y�^g	��yO���[L
�%�L0���S$���]ԑ\�3�l��<$U�]"��ڴ��
�\/M�����/� �����^?!��������`��+���c������>��n��D�7C��v�"�ɝ�Z<���b��"r��^`�¤@sOl�{�Y7���O�Ϩgx�C������O�7`��z�����0K�F}?��OHI���/�~�#�E��b"n5\�"��N�W�V<�`fׄ��)T�PAMJ��YU�k_�dUg�0�Uk����U���ĝM��j��1���Y�/��uj/�፽ZRG��{�û�1�o�y����~���G��B��8�`>tO��&z�@JU/�Ԋ��0�[I�{R��$v��iߒ㊩*
�r%Xk�RMt��j��P	��PBϜ=A�K<�O��{�X"�)ޒSc��ZN]9��]�BM�.��Mk_��Se0��QX�$[���ol���S�u駛�f�>��JW�	�sM|���S���]��bg<my�N�����*.>w�^i�)p�*�{�P%��Ǧ)�ȟ�c���H�3��2SC�UeS��d+:��UB<}�=z�V��,�,|�|��٪�x�Y�������U���%���uF�5Zy�a�`œ9M����U
N`W��=W�t�Y=�6��k�a��01p�9s�Y��R^*.�9=:,��^���/G?\����g��MH�<�}DF�Q�$��1�-,�<���3���������/������h�h#���_��"�I=G���y
\�~%�*],�)��)u��ꟷ�������mG�dYzw�r��o�L3��k1EUY��$`H	�Ȫ8aB���,�+�_�K��N��8����NY1��OY7^���
.ywH䣻l��\��`��P"���*UH�|;����Ȕ�8���+���MN��S��*�3��
��8�%�#�(���u���s�\��F]���xx��`R���J�ୣoc0�k��U�0.��>�5�^[���G')�,t��y��i(ю=d��_:��Z�*&��D%I�Gc�"jJ����t��;�͆�t�0����'N	C�7ݕY�>��C��V=�C�?u%�<�f#3�
�ʺ�3�e��+9��[���0�3Gpi�;�ː�횎`�C��4����|�ka!�~%TQBN�������՜�x��F�yB���8��s��#��&s�A����_>�ն�j����Q���
"�p�.�/2�/���A�W@�/j�_&��T�Z�B���R�����.��b(���Inj�Q��Y�xt�fv
;mw2���λOz)a��u
.mnIzہS�}^]=W�P5�9�)4P�A�-w`����G�Ŀϗd%6����}��F�(c���{���C��´�
�aSP���g�/5�K7�"���
��pa{
�σ�G���]vg'�o�yr~Ώ��S�V\ih����a��Z���+bEP�ǖ7�-�M|
�J��K�-�������{5��b�-��>{�|��0B�d�-π����)x��G�*�~�U�p�џ����|�>���9t�
o��kl��K����'[���~��b����w;z�� �4���ț���8[���
7��f��GN�
�~��R��o&�0s���HO66yN����oZ0�5y�����F�U��)\�#"��<f:IK����px��c��l�}��D�
�5�l6�-Lc1�ϧ�D�/
<�Z�Ch��r��_'5y$�ۭ*��͏�J�Wra@�Ja)|�:$B��'9��6R��v�=5=�ٻ`w��7�:wk�A9]t]��@ T�A-@��mO[Xl��X|��0��ʎj�A�=�7W���{\���<xDg�$��ؚqg�:�P��p�dЪa܏�����w�y��(|-]�5�������%%�G�)v�%x(
�ȅ��`4L���f���$��X'�$�z���ύ�,J&�[W	[�iS�x�0�S��3f���o��K��m
��73}�	�8D9u��ʟ�O�y�"fdK�CO@W:a��K�߬��/e����|��ظ,-qd+9��_�G��{$d�L���w�K{�Fy�M��/����ݿ}���{��qؠ.�<��>eg�w=��^���#��U�V(�0��>��;���w^j�^���V�/���Nu>�����T�G�G���x�-<Ŀ�����Q��R�I���?3WN0��M���a�J�O�F��劮�ڈ"L���ޱ�|�
��k%3Sz��i�=���r}�s!x��{���8����
~�-}D]�#�7���y(<�`r��tl$'�؏�&O��7e���\�?�_a���:X���������j���k���H&���u��#gm<m�����q��?�d\5�A�ޚ��+�Vu�@U�rڰ�纝t;	�z��i�A:K�
MgS�::@s���L��o��������\J�\��l�y�v*��%�0xɽ K�Hs�HLl�x&}��d#q�1�3'Ih-&��w^1$iX����t�����|�F�9��t`=؃ ��&'hR)�`x-�B��nX'�fo�6eR&��M�8��E�fS7�}�BY�� n�)+����5ʵ��h���*��*�r�Z��z�dYI�s��w�8�x!�h��Et�D=�(�d}5�ˠ�7
�c�[�<"��i2�ҚQw2��^���++�����6��Ca���d�FV_��%��2@�lQ�z���V-�A̭،2P��bv�w0ؔ�4�`_��@DË���%pH&�W5Ya�o�nXOi��Ds��N��,��Fu�'e=�}��AOݽ[�����ҩ�D���
~��^\D�6��Ĝԋ�R��̍�D�
����~�G*�Nm芔�U�?I8|#NkǗ���ܴΆK/^͓�w��3�X�/�o��9��k�ck�J��Mu����
^��Ћ=��5�M��k��/�c���\\?�I����-�Kx7���S�Ȭ,��Ԛ�.��+�:�N���d_���3YH5�fT���d��FS@�˗���ٸ^��p�Fu�R���K�8�G���=4�]qP�j]���bF&*H�о�}]��4�r�oMg`�]	�k�[������X)���"~��u���-*�g�貙a�L�	�T!�'a���&W�Q]N�Wxy�����\F
��⵬��M��U����776E����YU����N��{��e�H���&��/^�~]��x�<ݲ
���qu V���擎B��eM��oP��d�H�O��X��>�ed2c���lO^�#	�R�Hb�.�CDUa�[�;�P�uYOo���j$iÁg�粷��J;���қ�6���cU%��&�G\�'&�`�{����FI:|о�A3x��;��f��<�q�&+Ը�깤�.��lLL��� �N$�|U�@b� }�����빺J�_گ�x�*�te_�a�N.�q����<x*f4��'/����B�Y�H��͠Z�h��9�:6'�W���$��x9e�R[a���^�;�x��@����w��ly�/�Д� x�U��B�Xl����>��b�w'��JaC�ق��vP���k����E�)3E�`K\���{.�3b�H�	�R�\��}�Ӫ��ǎt��ލ�"�E��~��a�QsY2vDzJ�a�m���ς���)�9�C�4���ly^F:���H;[h`�9qU`�+]��l\���Vd�q�����l�\�C��_��aˮW�l�#
]K8��ݮ�>��~}�4�Z�XT���p�VBJ΁*��s��K:bt��F�*.�� ���Y4R��I:�-&պi��j��>�;����]S}�˦rߛ����m0z	%\x��ua!�@��[J�z�B��-�.%V(��r������("pL�Œ\([z*Wܒ5U��r�Sa�S)?�2>l��,���to-���F�?�k�^�7Tj�X��Ƕ<EC�IQ&Ǥn«!�wa����й�)�G�)�(�t=�#��>�=����PKe�mW����w�Fsetuptools/_distutils/cmd.py�<ێ�F���
%/-�O&,�N����8�l�$�RdKb�"y���
��n}����>��GT�����U�$I�ڌ�X7fS�����Q�A����X��*�˜�m����u=*�U���-=˂�(��$IrsS�n�9���f7t��==�`�,��>ߏu�~�_�ްK�C����Ս�_��<��S�{��
�����0��?���������n�v?�
s/9uý�Vk��nG_8�6J�Q�ѻ�QE[g�;�j8�^��{�A��QF�i;t��e�z<eѨ�b��m�S�+�t�H����H����4�6�*Qp�)�5�ES��sY�Z�
qJ�h\��o���sں���}�zP�dMp��j���
�9��@���fk%{��Y�=�c�)x�u["<xg<iF��t�{�.�1������:�È��"�S�P'�Tjewo����zO��f�ΈAE{��E��m��Qu-K@�זL��O#��؍zx���0nX�@�:�����_�T\��a�S��s"BH@��d�|
bP���`�� �$�P@l���i�2SX�S��r�㡫2>V��hL���5�|	Ζ`��k��~y�R@8�%&EU9��o�ёf(xűn�Z�B&P�~���5#����=�>���Ҿ�V�M�M,��J&ɔK᳀"<����m�$6��b�zb�
p:��
��g��ȼ-@roX)�Fȅ�����n�	��i��"���k6Np �JA��x����_B�=��P��*�#��&Yg�1��][��!�}���R�W�g������T�kW����%�P��Ch�K��i�[ů�ʒIP��R�vs��?������T�C�YV�-*�0�	6:;��3/�<�`Q�+J9�А�y��)G/��ll�L3ڈH�*�Pյ5�	��@U����B��X;�Qw��n�F��y;��r>�>Zaɣ?	�Sy��|et��Ȭ�����4Ys�>������[�`�^�cs���}���f\qt����Mľ7Bl鍵�,�y;��j��]�8�@�0��9��3� ��8���C&�֯�:�x66���Y�[b���o<n;��@2#Y���E��S����a��^S���(��"zUY��:�O|��}�#ã,���	xw���
��U���l�ާ-��;bL�`In�c�A�5(pZ�ܸ��}�m�lvM��j)Z�7���J`OwD�u�`
�����E�/�g�l"D)! ��;��[����|�ဃr�i!/Z@J���P@ts��k��sB���+��k��\+�8LZ��鰦mA��+p^��D	"�K={��X���]�Ic7�g���A��<U�9�X$T�S�LB��V
y��#:�<G��t�M���?�&�BH]�π�w��Ps��@����Ѐ�l;CFB�7P��n@6W#�N��m<�S1T�hۺ��z<��;������xۏ!>0�ur�'M�uؼ�'�1�HB�|f54����Z{��^` ��3���h'�	��|
%�����AX����y�;=;�p�҃n��	�0�
2���c�c(�2]�E�!����vɝJ0?g%s!%�7�U��٫db��GO�j�RT2l��c@��n��e����3ƙj�a��B�L�E��N�;2y�n
P�;�)��9��@	3W�?8E��m������8?O�����uD�ԟ�O��y�j��D4o�_B��	���x�Ł{�'��N�-����6
0@&��'�x����1,��8
m.���T
�*$���R��ol����p|�8mD+fJT|\�6�w��zԯ�Q���Bq��[�	-�m���<�\�Z15��a�ɑW�Q��L鸕���S�L9�=DD[��S��Vf���nϑA	@��|r�+���%b/n=��\�@j[۲O�*��9�G����<����:�~`�v��%��T��J��[Uu`:@��]��9�4��Q��˂ׁ���5�@�`髛L\��r� *3I�@���	��gA(#�{Q�z��,�]�+m�<�D�$Rh�W��d^�` u�ʜͣth��MT�d!A����)J�rّ�HrQ��M3���u�Li�kI�+�^�I�D���OڒJ���N�6�eD���xo���F�F�cVL
��-'YKل�d)���\���N.�m��|����Bח�oQ��>/u1�|�B������� S5ʇX	W���Û�(Z�.q��2�D�Q�C��Pom]R��4̻�m1�Tzoń`d��0���!-�����0�ƌ�$�0h���9�FX���YT���u�[M�>��L*jwT+�`��.Ii�U v���1�0�����c�	�2(�\�(�ww*�<s�$1}n������J�1GѶ݄�&�6��A������o�}��A͂�)�Fg�V�O� �̩�A{a-��0�H�N~�y�Y��tM��_^��
c��.��g�����"�y˫�
�0,y����y�('���q��׉�v�M��Q�>�z�-��a8�B�� �XI/�ܦ�v��(Š���'hy�3�y��N��܆r)v����!2˝�7�%����G�;�Q!���)I
��-�!m��f��I.K��쭒��E��l'��(Xw���sة=U���Q����au6���V��U
ۥ��
�f�3��gEo����N���y
b�X�
�DP�������?j5��G�ȷ�>|������:�>�CG��5�׮���eJ��g��U�rh��Al��Lb@��x#�5�9��a;����Ҏ`@+��1T��3��h�OX��y�Td��$�h�e���Y����L�Μ�p�3l�
,>�u95��b�z��Z�����ٹ�j+	�n)�xG�y���q8[�|��F��RK!WK�T,���C
Gr�Š.G�{�Bw�l�Q`�����Jw�Nf�z�q:ԣ6=�wkF�D]�t4|�O\��L,��`�&�,왛��B���F#�X$�g�d3��d�H���B����l�q��7=�6���Qt�\N#Ug�6r�Y6��jT�S���g�$g6���+��2�܇ù^->��7�f�JeI�jK�
$�.CR�FK�J0|:H`�W{�����G-�"�5@d�
�26/r1���0�9���My����7�8�+�����B��˦��٥pX�~���L�t$���Qb�R�=s����gbGލ$���������v�^e����s����UTiOPs S�?]�1���Q$|+�"�>��d��"|�?$�-����X>��:7�
�k-���t.��u܅
���n�{ ص
�3z��<����Pd&XŎ����~�,}]��(��"�d�����q�������{�vY����T�w���F�_�ҟ����/	 2����
T�#,�؟niW	QC�y�a�Va��ѹ�X��]��є�_1@�����Z˴�֡7G����2>U�\g6}16���S�K,��Ӗ7i����E3'�V��%��zx�?_D�z������ �h��o��A�5��m`4^?�{�]�t.�Q���5
W�s�`���{�؆��L~����#
>�Zq���ʼ<B@��}Q�^by6q �y*��sp�qW�E�@T��S�O6�'�H"�/��G�t����i�N�9�i�Ue,���Pר��|�ei5\B�\
�'��r7}���p�"*�sYC�F
�L6�Qwl��2D�c;J��y;��E< fm|nvz��U1;:�}Ie	�&T��jnz����a/����"�HW��ؖʌ�+��'F�p/�J-/�vR��x(�Lz̈��E��|"��[��A$צ��Zv낈�F)4z��簉u�a[>*3Ú��_/�\NO���k8�V���y�ǯћ��
̕W2�#�FK`�c{숱l��)����>}�m��&[gsk霭��r��Q/�+��9�R�_��Z��n����
,��I��q7'JV��AXH�uۙ�]�/�G�s ��� *+�i��"4���Aupw���� �\.���rC�ē��sF���ڗ�p����X�����0A
|nğE��S����%.qb��X���<�-:HY"`������h��-����fI��~i��%�Ih�����#U������Mg�::���/Û3��P����;0�T�֛�ߥ����o��7Z'
��na��)�Fv �su[6S�a�+����ؗ�
	[���΁z�rw���E'�ԏ�>)v�@!��_�i~���|3��l׺�s�w�^q2�
��1ؠ�G�m/픽8d�}.b��/f��u?5\�J��I���F
va�����V=7���6ɮu����I� :��njK�����Nz��'L�7���K�h�c]����{�dG9Ʈ�w_u_�u���/�����n��Y�cn�K��X7��K	�����M
Ó����U���9o����x3!���L"�h/}]r71v?un�kGό52ѭ� 2u�pQ�ó��P<����Qt��p�̛u�
eQwWW7�Ǐs�I�-f�i"�2b��=E0�A�g�/2�#�
!��2�*�B�K
�zLj��s�Y����au�����.�
��	�ht\�S�.A��>����\�
"�6����p�w���/N�TS��h�ޝ��BQZD����Bq.�ڳ�5a`���F������\.�i�����'0f��bi���,ݩuCY{Ȫ�y
ZN$� ���y��D�K���י ��RDϙy�L���/]�=n�����17M������y���\Z�D]EPU��h���D
��I���ʳ���<�C�n���
�rq[>���g@N��Q��
���z��ɰJ���(�>b���<|�G��c��z�Uɽ�V�\9���Jip	�y�(��a���[C�Š�&���e�3|�׶%�<�J*��BC�(j��%��vžc�*��Qn��S	1�v��	.f�qN��y�4��sD��B�}��NQ��}:'ؗ�D�
�r��~�eo�Z5t͓қ�g.x.(O�I�M:���eINI�|�.��Y�.��}|Γ���V�A
���]�Z:��e�w�h[�m5�R+�T���#@ @!]���`��v/�
�3B|�-����SxmK&��E��L�b�����t=�T�K�ON6��9���^��q�e!���P~��9ՆB8����5!��N0��q��դ�ͿPKe�mW$�Fq��setuptools/_distutils/config.py�XKo�6��W�I�㤗�Mw����&(�0�m��E���q����������b���8/~3�h4J��{�35)��I̤��S���22;�n�77b��yJ��*56/�R���d-�YJ|)�������؄�F��ө4y�6	F�Q�w������l�曂J�$����pc�gf9(%=�]�D��A���O�V�'t�\��9XTJˀ�){��oL*rx�� X��2gdNwlz���<��w�:(��Xd?��_Mج�&@/�8(����r�L�\��<cN�|:?�g�_n��O�K�պP���}�	�剐�ˌmhr�[��@-+_IVŵ�GX�,rfWi�sfC���"���Y�'
k��pLB���d��k�E��t��)9W�9'ϵx�����LA�.$S�`;���/��=��>ˈ�#��jbj��r/K��
�1�������`4Ym�^�d�����6�6Ks��0l�v�WF��'��_���^��r��G[a�� �lU�0����1q�ٴ�r��,Rb�ި��}	������q%p�z��SQ0c����W�W7P`��ǟ��wOcr%~��B�aL(�ƴ��� �fQ똞���3?�Wꇢ���΁z��|M��](�4nZo�i��}��(|T<�. ��홚;W!��
���38�
P�YꞆ�R�$��1�{�&��m�b��}+�VZ ��b�I�	6c��ɘ���$d��<`I�#o(xUQ���#oO(�W�q��X�_'JK^D��W�l�Q�f����g�V|Z;�T�#X�	v.��+c��łRL�m@54Ww�M�0�d���_��5�)6�rfl3$�zA
	L!�#�s��-�w'PhNخР�=(gi����D#�o�v'{)Y����mS�����p�,�Rj����D��f�t����9�Ž�*��R�w_���K���8�-02އ���8.-�g�-U�mW���P��%
$����˾g������/�J�03Q����ox�Gu^Gդ=�9���Yd�t�A!U����ÌDC@�ςgF�KL�wC�bÅ�e�g�x�
�v����T��C��Ϟf9l��ןt���R�=n��꫟p�e���eH�Af�x��,�"��.��D������}p�1���A>x�1���k55O�`�a>�٫�z}
�s~�tB�գNb#KO{X�G]�u홰W�6d��gw�F�D�nf6��4���'�zt�j���>�\�j�-���Ȋ\�N�x���;��3��	ȣ�?1�"�,��G��yYN��e4"R�p���TƘ1:��nFn+�n�s�9���],{n(���m��������{��kz�
�a����Um�_o��Ɋ�^�̜�4�<���n��Y#�_�@K���PKe�mWIS^��"setuptools/_distutils/core.py�Ymo���_A8XX��B���nz=��.v����AK��FUR��+��;/�$�J��&2M�3g�-��B��ku��X�X|>*a��)�R��([Q+U8��SBW���*�c�p��X��8�r�횕�wu�jS��t�Q� ,�e	���T$���[ݴi&�]��Bׅ�*oA� }���]G�e]�w���o^J�[Y�G��8��g�؋B�u
�Z��'�3�IUd��r�X�q��n� �'Ԯ;x�����e��.Ly�X\��F{�!���Ld
����L:�/[�*��OԙX�|3L�6��a��������w/LUϭ���Ͼx��Gp>��b�ؙ�yTe#*�<(qP��"�R��t:��\�� �v����8�(j~>t���j]p7��G4,�w%�2@�q+Z�$�6��
)d4�����$�[�M����� `e7~��e��>�}/n`��Ã]�7��_X��p������>����,�Bc#9^UZ+hѫ��nfb�g1�አ�����󶵬Tz�˃�o�Nd�l��N:��Gsi�7�Z�Qޠ�]�.�L�D��BT�s�֚���SG�N���}4I�Nj�`��?n]k��ܷʂfx�/�i��_�R���O�����C[�4����d��)�֠�x��GL�zP��d��g�<)��e̎O[UI]�/�o��+�?~
kĪ���9\H5/�+��(M}؞�����;ۂ�*:/�E�5�?�T�F[�dn�U�� �����p;gJժ�M�_��!!�]���U����U�u^v�$�y-��0�l+�[C˺���/-+��J�{���魮�6��(8��[��;�LZ�p�]��<Z���$ϝ���˜�u}�3%�T5�.XiY:�������[ٶ���I��I�x�#
q-
#\��=� z��Q�'6B�`ma֘ť8����T�z�c1��Ma����w`�}�_��@�HN�$4`Cֹ��Ȃ�;,%|܃�����*Is�B�P��p�0	�x�eV�E�A���ϐ�v=���l�4�f�5ƾD�K��d���kR��iԒ4�4���D��CD>[$hr2!X2�U{�r�a/4ϰ�z�i�u` ���Q\}��xr�I[��)fq֯՘�3�sW� �'A`�_$�9W�#�+H{�r��C���$
���K��_hl31�(q�}�'G�ДN�6C�kD�G~gÈ���XaX�9
��Bg_8�d�4�|�9�8/�����9X���Ԭ7���d��0srXXJƃQ�T���v܁�$h���jo�� ���(���	!��Y�����S�
�W��U_aL؆4<�w4�d���,��s
CȜ+���ۃ�Ѣwu�ؠ•�'�a�w�0b �=���38�""�p�`�[�C02j��Q�B0n!�7��+�i�P,ˈ`�a!�a�0���B�7
�!?��d�=��1����](/�׉3��$�^���12�C����h���������ޫ���tw*��wf���}:c{�2ႇ���%W�=P[�G�\F��F(M��je�B���1q
�siN)�H�n�X.�N9+St�P4�z`�*y���d�-�*�'��/Χ�1��O@!����t��l]ѻb�ӗ�>���ˆ_�M�
y�\?��c^�b�_õ�`�,�?
y�KI�ʦ$�g���)��^KH�Y΢����[���e�'L��%��@8>��{�6�,�;���j����n>��U��n�%u.p6s1��tK(�`�t��Ľq������;�!��]�j3 �h�娍/Eь�忏i�ЁI%�[�D�̀S-��6����;kn����|Ћ�]7�4���w��K��QCi<Ic!�'ˠG�GF	L&F.�^/G��>EW5>	n��L��7#�{ݐ�)1��h0[L�������a��T~�f.���z��RF�Q�P	�$�v�d'�G�]�3���`}�+#��_�;{��Z8:(	�0팈߈�ך�ݢ��ݣ��?�&y(�u��aM�k쪮�)Y�!�YP�<�[D���� 0���U�3�? �]�R��a�*���i�-�Ģ.�~0�������V����Z�o��X���B�.��󧈠ğ�&@K��,򱍋}Kߧ�~����K���I(�Pv��/Ğ���z�k1I��܃�ҷKX���qS�z�T�4� �݄���55�q�z_d	L&��"���1�:	�v@o:ji`Ģ����K6|Zn
�J�4X	B�b�1���o��VQ�`-|�F1���AY���f�+�y�I8�*L�N�I1PO}��U��x!#�[MVQ���mWtVrm0Q��1��j74X�&*�ϔ�7�d�X�"cW	��WXA�]~�a�X�b��݈���׷O���Đ��r|~uCU�ݭb�+�4����mJ��N!�W28��`s�O�7�*2W]�
��T��>��I���,�!"ސ��<SW��EmI�Wt"�_|o�aN9̃C��u	E�3�0��Q��;�_���
�${F�G�B3/C�b����)*�k���IJh3P��{�c��cՄ%��!Y!L��Oh�m�{�J�9�_�r0�u�����.A����&%uH�Y͍+�^�X�o!`�&5b�������\m��o���$6��`^P�I����Iw�]�nhrLm��#�~�뢩t�M��8u��nE�)��>�Ȟ�k1��<�?*�Mx�5oF�e�	��+񇪂�~4]	L�[L�\_��L�G:�[՛���j�&R�2'���!���(���c�3�?�{�q��ړVec�����y��sS/e������[N^!L�ʷ�t�F�^�z���8�x)�@����
�kA�%�Odg�]�^�j���rT]q?ʱ��<��]/_���G�6Ȯ�T/]�PKe�mW5��<�*B(setuptools/_distutils/cygwinccompiler.py�<ks�6��+Pz2�j����O�����f�ę$ms�ɨ	Y�P$���{��)�N�դ�D��y^�	��,Q���eE���*�y=��˛,��
gz�X�,�c!&,f�Y�wV��oE��"7�m�"��*k���ѳ���K씒��i�c�%�sQ��B�Y!F8�EV\�=�!�v�,ٰ�b[5Ю�l�`�����b����OQ��ǶL�8y�7���.W9ߊ��	���ek�/��϶�&1H����MY�^��
f����f16�h�&��7�lb�\���%<�8	�����
M~�N���c	���-m+�Vu\�ٺ�iz��4>!KjN�Y���0�a
ٟ~��@n�ь��)�2ga�
��:{�@�1_w���=�'�FV�aA\�N���ĕl����΄�k�ɪH��
.����G^�����Rrm�6���l$�p{K�߮�\ �[��4)K�—�gZ>Ռ0����Z�$FA�$�����#�B��,�A���*���w��
��3�J�ؚ��[u�s�Qp����,Dœl���L� ��l��݈�~pu#�Z��������Fߜ/wu\�i�0��6(� ^K@��e�jkN���Q���D�=0.y�����KqvaT]o����S�<�T$���5O'�4�q�u=}|�Zv��4�ajҿ�R����#��4�+5dk
�f��Eg�d�
0�>j�M�!g0����6?SX�=�N���۳����~��!�BZM����`�$�Ӄ��T+���I��j�@d���-A��,�F[-�����:��D,x�n�A���F��Y-d4֯��s�ʎlZ��>��/8��Ha�Q8W�q���*v� ��-��(xr��Z	
�A[D��믿fe3�q���!g����������=���J�^-��H�U���{���m��#��"��ҳ�3���&s)�7��_��ڏ�u��@6�4|yUV���W�_]LX���ǥ�fr�Gjn�4b��r�47K�jF��L�%>��u]������'�\�	�˨�#���c=��#h~�y2�ddB/�kY
��z�*�xg��,9��H�3���k.�������6�(�q���]��7�/X�2�l�<7�T����5Y.		�.�2��9��#���ɲ*�#�;"�3�_�Y����@XČ�j��ٹ�>��.�+=���s�m6�`�hh4m�٣��o!���b�<��l�]�D��~�w��V��cPgG�~s��߀Yx����"��q���{����8��[�Ϧ<��c�gSw�]pu��Q�=��<���	�3�
z ����TF�KX�F�z��WG̀��W�Wfܧ���?�����yQ�f)7�5콏�{��ރ�@X����~=�F;�}
���@��ж,�Y���2<_O��+0U�鄥�~	����O�������P,
a�N�}5�_�R����*�\n�q;@B���l\!H1�S��QN

�Ah�s>Ao��kx�KFA�d�˗??�����W�	�]\�`��jo�f�r�EA3a)$����yCh�y,��u�bN��E�P�x�YS��ٚk
�~'u)�!��(#�t�!�xq����-�b�O����X��ӡ�����S�hʫ�Z�s�;o _��`��%lf�x���b���i|�S��`��f�{ё?�LW��Q8e�9���
)�����@�'l��V�3�G�1�?'���B�(��?��G��
쑲�D ��Hc��B&! �����<��	������R4�|�@���qeFE�x���}�!=�%m�(��qoZ?��0T���;��<�dw�t>�
��	�an�9��zI�n�!����^]�h�у�x��{�ѡm+�TVR���w�m�v�j!�l���
E�H(d[S�0����NV܎�k���6R��s\Q��y^x��? ������SkUD������I��O����w@�
68�<�]��	z���l�;f����h�L-�
ni�^��%U�m)�o"H}k�ѳ��l޸Ak���(��xYN��H[�1�x�N�Xlz�4�fU�★!�x�AӉE9IŻx� 18��<�?��ly��;�_y
-��p�-��\f�ֻ���8ŕAcm�;���
���Il[p�R��ij�I�;Ѳ�%�B��W'��� q}-�WcJ+��B����B��M�R[a,�H@nQΰ�^��2���$%Z<a5�ܢ�v��b�ɡ� ���j�mx�`g<���˾��+�����*B>��4���g�iya��>���Jx%ٰ�>|+��k��[�	`�x��H�j�j#:\`��v�>g_n���԰�]�������1c�J��Vn�Pj��A�S.��f3H���Q�;>�A���j��zk,��GniU]_��܎��L�6f��N5G2��%���� ]J����i,y�Wź2ʅ&��`'$5�W15璲�B�n!$1������s8�c�[V��
�7�ث�Jt�P;�}��qv�gzhg/O�4C�\][���A
�L�c5m�
l����[g��N��TNWM�
�� ���;9�T�N�E���H�y,MҮ.�],~{���H�Ad��\��o76�4	}
���+��)�Qqh(���M�Q���(l!��HI�jPTAX;�`T���N�
c4tDE�ySۋ��\S$��k,�5:=N5g��$���nK��l��]�z���iEeou߄�1�������z@��\W�-�7<�ضI��ζtZ-V�\�����D�M������~�g��W9+u��
�b���*c�S\	DRv��zܸ����L›ateF l��k���أ��&��`GjH�S��?eV�f
s"�)(��s)Eȣ|��lP�
�f�������-��0�����O^�/�X5��t�dŻx����7��i�Eڵ=Col� |%+���&)ȃ�[5��Z5@`آ�s��͚���)d��)A��FH���f���}h�LnQt2([����p������1$��$�G��'J�����*Ti�]��7�J����~P!~��Q�'��{�h��P#����n6�����m����8-�s�Z��$/a���(z�X�e�C
u����Ì��ݶ�?�	8)�%YwY�RW#WY��|p���f���K��q>���؃I3
��/����!28f[�!Ƽ��Z��z񏮝��,�$�vO����3"xV�u�v�Ҙ�� `9�F���B�Y�\��K�R�X�����)�Qͫx��짟fS|��)�a�޴S���;֛����ߐt�L�,]�G�Z��]���W\Y��ᅢ�9�v�g�;�R�6�tN�8)�����T�r��3d<D�*.+6������H
+m�u�N���u��HxO9O��S�
xq�O��*Y��DUiO�Rv:urU�wS;�wD{���V�;����WSZ`hT��4v�ϙ�w�
� .ic��D<tj��J?�@߁�$�Wm��k�"
����z�G��c��*
�L�,Ǯ���%\�W	!�L�Be�
JƷ�'��f��}2$�D��	��]��:�	��v;�VF�Q�>��,�o)��W�(��扎�U�F���jj���m�X�D�#t�yg����S���
=�?�k���O�X$�M� ��*oT�C]S�
�#^}l��<�#���ȋ�i�stD� �����=���}�K4ok�t�5]�J}V��	{B��6�L�m�WG���q�z2�rҁ�-����<)�SE�LF��O�����%BiI(�l���q��<g���G՛�;G22�4wF{(Ù���Α�a��_�G^!
B_��$)U���V��F5�GO��Z�@��KuV�nC���Qqa����>����Y��#E�}�^��+��"ڃ�[��K�j~�=-t���Ćw8j��Zƅ�� ����lJ�R���ɉ�ص��m�ԃP�k��-�gT��|���PO�F|���;s�����p�X��������TS�K�~
�=_��%���Cg�(�[�������w	k,$��1m֪q[*��
q�&5S2���G�Q����>zy�V=E�������'�_�ۦHx���<u����z����#�IS����G��M%��I���Q�,
/T�V�!2���b)xM
��M3�'����C"b�u������
R� tN,���t���_��n�}SIJ��?�(zn�a^�a^���Y��Sz@9
䂍�jXGFv�ޣ�.�l�m\�8�fa�����#�@/�
]��u�q��c�tES��]��3����;����!�"�jU8�+_{�t,U���>�P��,-�%^�mϮ�enzm���i,��B$\���UGw%Q<E��b
_U�v���X�r� �i�총�UY�Q�)�^Q`�Π�IV�I�Q<�@�j	g3!C;�f�Xߚh4��_yךE.�˶!�N:�?a^APUU���o)����Z�EV�$��"��vٜ#��se��h&�em�M9��Z���Zqc�lIA]u3�A��
�E� �p�V<3;B=
�h@�L�y�ǔ~햤g�}�d�`4O$�z�����%.|�%��k���o�ix2�t0���H�9�EVQ>�m >�e�ԕ.$a�����o�_����9e�j?x����ீ�=Ɛ��Fs[�$
A�M[W�s��{�*.:�wl�C�Av�O���m�n�[hS�\��r�E}Յ�5��6�ϔ�[���Q��g��?'�����&���PQ��`|��e�ը��:V�4��!=�Spsu!
�4Q[����������8R?�*��x��V��A�]ɪ���&�䀜&��M�µר��;7u��+��P��Ϊ��6�	u��/u)J����u]6U0Gjb0������m��-D������f�>H���2�jb����S�Bdt�Z:����+(�Tu��y�l+�����
~1��04o?t�N�XpuX�hi����Z�C7M���)V� W�6����1�0�{t�
`��#{݋��UB��pϺ��w��N���#H���	V��x�PKe�mW_�H%u�setuptools/_distutils/debug.py]��
�0E�|��*H��E*pk;K���
y)�k�o�[��8�㜲"cNp_���޽�w��Op�(����24�RA�8놢��+~��Xjg����D��[=X��s�I��a�\�PKe�mWk"#��
!setuptools/_distutils/dep_util.py�WMo�8��W��(d���c��] ��@��� �%�"B�I���3��);��ؑ8��Ǜ�,�VX79!���3}+���pG�&�8���N�b%߀��
�͎Y��q�r�Aw�	�m�T{�����I�73(k��0\��;5}1��L1y��n˲,
tD����B��hc!>�3��?ѣ�(Zށ�n`m�d
��=w�mx!�W�&������
�*�"��MX��`x����nE'0�3偪[msw&��Vs�*���&��=�N�>�-���s�l����zR{�ܘ)��+y���s�(��6���9z��vd�߆8bc��2Wx�%��w����w���+Ѳ����[��ڢ�޵�����ŃRsI0߾?���:�?�=�ҡD��N=������ٱ"����]Q���\��#�@y��6�Ԟt���p�K��W�P02ä������S�8kzp$O䱼XZ6�nG�Z2	�'M2 �����Z����g<�#��k�)p� a>0��P�Py�u]]HCM�5�v�^��$�������Q|Y�_Äm��]�`{חu��
v���σ~5��9G�<>�[��t�&����
�Σ��Q�٣x�������4J3���`�H3ȅ|�3��dT�*�d����y� �E�W~rW�gp6���ntw�2�� p2�dy�HKL}7x*Nd1B[���8EEP��J����g
�r����?���ρ9�T\�p+l4化u���q ���Ǣ��M��6� �T6I��第�а���d�t�˷0��ʊg��Puu��I8�.�^�6+7䉥aB+�5z�	�.��6O֡b>Wp�<�Ä��v�FswV��Ye׮G��S�)�ek�7fR%-[~�암���n�.��c5�`�s=�pim�<�I��j��/�
�hѪq��cG�7�.ߥ�tΡv�WhC��5n™{����
}�������l��!3
jM5n�1M��R�ο-�R���p_f�b�{������ԑg=3-��(�c}�煍0����1����0f%��
-�a�`>̼��r�g��$B�D�i�D�|J��W����陗�����kA{��ͭ��zZ	*~��i�/T�hj��{���6<[�z���m�1)�F���M.��D���0�`�D]@�d
��ٵJ��:�_�iF�퉟,!�O���;�^8���3���.�^��7�X���Dž>�%�[/�i�EW�~Z�qa��PKe�mW�3��
b!setuptools/_distutils/dir_util.py�Ym�۸��_�:$�yu�E�
�m/A�%-.) X�Eۺ�(U��q���̐�(�ޠg �]i8��g���(��mY��(�5��X����$v��ڲ�F�N�R�m_I[꽀��ڦ+�R��'a;�L�\.��n�ΊƄ�T��f��Z���a��E~�ߕ�zK�V�ڪNˊ���U�_,^���۽9������f��F�ZȢ(�/a)�*M>u��u!���2+hQUY�ZZx9�]n;��îi~������2F�!�-��t�Z�M�k�}ͫT!��~#ߋ�щ�QQ^�G�(�Q[I�d&J��Ց���`�m����+�9TlHDl��hDߊr',�s!+�Y����(��Gr���mu��o�
v�j{��QY�(�.�M�Z�ؕ�W��ׯW�Iu�ƨ��y�����������;{*dl	jDjd�4�"'�V��)_�������iBV%�4,��kl�+q<��+���Nb�w\�z1��Ķ�;D�m��H)l�n�
sV��,!s^�dL��R\O�w��S8Mf創�j�;)�on(�~����ܒb�-D�W����8�Y���d�Xt=R�"ҍV7U�i�����*4E\�hz�T��4[Y�����苓w��C�]�U����Ժ{�B��,��mS�(�M��V���`'K"�9��X*_zȫ�.�t�DL@!��g�J�.�K�ñ
զ�����.[����e��ϟ?�F$5!e�,v�R䐏�q�Z��n�Q�y=�Jc�y��F�S�ZD	��]Q��0T�8��ظN9�ʩ�I���K�����D
s:%[����*�G�w
	���|Bp�=Rn����@�6�u��.d,��f�_B:Ú��[@�9��"I����U-���ʦA�ܘє�ye��:\�U�dZL��!zϞ�/���i�Ҁ��v7#��1�
��H�
�46$9�,;���9ZFu6}�Df��9`�|��P�	L����B���(R��O5�x�,�j��91�e�#�W�Y�J���ǫE�Oa��Ue-E������<����=�k�%�^��	����v�,�հ�K��ڔz��P`�`�9��A�b���Qf�_�R�j����^�N�i��]����Y�ĹTW~"OU��t7�F���1����DH}ݪ֊~t�؆'�z��)^���������?~⚿P�ٹ.�tWF����C�r��gp��$w�1�d������C6u5��\���<Ó�~	�}@iܲ�E�!垬���+z���n�������#ݝ�-4�*@���-HE�;&��3�h��W���A��8G��3��j�%�ە�k\nSqR�M���@'�ie��.it�l�-��D͌�'~?c�D��0T�ɱ&B���c��m�X.�`K;�1A2ڍR��"fEt���YIĮ�{��*��(	��d$F��x�:�hp�Z�C�VP��Wԕ���<c���	�9�5���Z��% %��t>�}��zZX�

b��4lu�w�����%����f�%����t[K�Ua�=�5��m�(<����ޜj��Gs��׷��߾�M��`^H��+��Pb$��f�8WK�7����a����s��Y=A0%YIt�{~-��H��XWTƥ�9j���Q�O�Z��
��2��0f-��K{h�`*�J�!l�jrޏP�šS
=����TA~�5�l9*��/�����D,g3�f�+���-�E�c�z>kश�t�ݜD�%�=�޾sA]�[l�������{�MD
烽�z�,��Q�$���E4�y�(�5��k�b� 2$yC�\� z�'�������¼����]��uTt����9�a��m��ai�Sj��/g\���
��#��qr�2w��N��X�x��9^��弳�!����c�m
Գk)��p�4�[�gU_4WH=J��*�Yn���v�h�T�Ac�5���И߹d�JU,�3��ҍ��E���멌�
�?�mɷ~�S���ub�ƓA�8��tW�hn�E��)�W:��CN����[�g�^��l��#6�(�F�7�'����"Mr�3Ɍ��D�X��û�hZVˁ����mg������٦�nM��| *4�H?{Nau�Y��������XB�V�g�a8�&�.���Q�T��v �PT�gWW�t�M����������$&�L�u��@o�S�M�=���qG�Nx��캲��/^���a��\o��*�ۺ�}�(�+�4#���ZhB�N�͓?�e�0 ��VD�J�&�N�Z��`�[a�E�e�W�=M��/'{�\��PdʝO^���J.K�L��y���E��y
�K������S����_�p/���@?R�Y��(�eNˇ�񒛿4�
�l�)�~�}�F�c/hd0	ej��#x
Xڌ�p����@ϕ�4
��@�Y
P�����f���f2_^=���a�~/B��`��v߳�y:1�I�o&+��مk�K�@_X�'�8�	��ίf�|��rx��N=52I7�nx��j_�J��S�p{
�|tt׃��?	��OQ�6�x���q���#�QXN���N��
l���r_�M�gV�EWR��W��ʑ�����.�h�v�����N���!Faz��PKe�mW�. A�3��setuptools/_distutils/dist.py�}mw����w�
�^�	����+?��q^���'Mv]-D%T$��d�'����̝����{v�ã��0s1/w�3�L�U��j�-𷳳��Z�.�oL�<j�+x���j[v�,���V7Yk���L�s�]�>lM�V�ϮLU_gW�j�Q�]_n�f��kb֋��drvV�M�gݱ��6�֜m�f��]Ym3y�3]W^�%�Yn��9;���Y?��lk�zwf>�̾Ͼ�ǯ۶i��m�]do� �g�bl�Yp�ů7e�:.�M�pi�5>��Ͳ�-�n[�f�m�kxC��ڞ���]���j�z����U�lgY�Y���/��[�{�����u|m���W����7ggO�͵���M�6��6Y�µ)����t��ve����y�e?�T�.�X���|�p�;h��]Vf?�@��/߼����l��y���7��֔kD�C�6m�jZk�M��	V�#�cޚ�δǬ�vնl��0��^J�+�>�/����;X>I�!�����6M��%ȉ3Zg�7-���.��%|�0n���6���?_��e!�<�����g��O���`�Zwha�a��r{0�lS���6�����l#�dy�?O`�x.`:���˪�_a`Yg�e��Ψ+�Fs[a�L��[�
�U�*b{X�2ÑeW��,/`��m�O�̄��b�p@�p������G�@��c'r���=,6������io�=R8w◌ҁ�{�k[��򇦋�.��ݮ��&�_���g���r��g�Msخqx��Ə����o�$�]��ʾ��m�*��"S�N��_࿿����;��4T��q�ߵ�?�l�	���`x��D���l�哜eo�?y~ߴ��ME����T��y_��h|N� ��zh+�q����o�v�y�́�p'�=.]��ͪ�E_gM$�mg�
Nf[�C �5��Lj�.��+@�pt�5�~{��C�ZO�y�<����4=��ym�q@p<�/�u�h�ms���Bb/��������C����<Y�
B�W�u),R����%����v�t���$0���SL
	 �9�2I$��$�n�6V{}���㾁��$FmV��d4 �0"������t�y��'�
|
�)��eFvsmhfnt��s�?��������g*�_o��rk�J
qI�D�D�#�d҆G�+����;�ۊ�-�ޛ}[����G�`���:�\��׋l�������y=A�<�/3�$�jz���(�PX_�LƓ��<�誧7�(f��*� g�v���N	X�
q��#P��D�fvjϓ������a�zc��������|x���*+��Vݔw2PZúo�Ѯ#1���0@@:�=���)��0!W@�a@,4%�v!�����,r�ؕ�&���@�䧓Y�|:S�h߰�?l/z�}��v��a��tt^��9t���*�FD6��j^��n�v��n�l��@R|eEҰS���i��5tC1ӿş������^r��xڎ���
�&�M{���;l��M�<�sB$�G���/�'j<�B��C��"
H���[��o��
r���og��÷��z��9.��>�	_v0�)�ٝ=T	ּ��o���\��gHV��n���~�k�M8�o�LQ���p�L�o�}y]����aS/ؑ��<��n8��N�6��;@�3�u�" �$����mW���;b�_���,�9l�'?�����@�c�<�lݎ��&]b�jNj��`�X���E�7$2���Q�RC�1�։��0��?n\�0���=��fۙ`���������ǿЉ�=
���
�q�C(���q8��Cq�@�8�a���g|����@��?6~$P�ՐI��
�k���(����ڇ�D}�8���7^���׻Lz�C�-��?��`6W]�5��݁�Y�^&X	��O&���g�SB�(D<�1��ߪ��<-`r��j{�1��[�J4�@a�q
�h+��f?r�+P'�� $���П �}9s~��!��d��K��P����.p��8�+f�V����>���gn4&�� d�.����J%�,�iyV��ҤQ�"�
�~O
�-b(,�fJ�>�뚕@"X�����F:A�|"�A�(^��[�\��Ē�v��PY\2�Y]��50u�{�=F���AF�u�P}s��߯S�2��п�"�έ����{�VG�(�����2peS�1��T\��\�$�mV��l;���D��хF�3e��J�b'Ã�rtJ�t�!V��Ȟ�/@_X��q�=_�ԯ���V��]��#;걇:���TO�]���<�I��W��e_f��YAo&���k$^3��d
���x��
_�Mߓ�аnh��p}��T5[�p@Y��7K.��*�y����`�!�������I���_E���1�X9N�+@2���G�9�7��Xk��ͦZUp�~7����B�����<.��&_�*�F����?}��W�?�|�m�����	-��9��N�����z�p��+���4��|�[�I	hZd���e������55p��OQ�^݂�����n`U�~��������n�G_C�b���G���)#_�;b���`т��рLt��" �-\!.���&3{�U<a�'2d��)��
L���M���M��'�Dg�
���)�]��k�ZwC�X���lU�#��H�1��q
tx��RYuH��	 @���^B;5r�)ъ/�����`#�/�S�@1]L�݋Z8���G�:9!�}R�װ��E���<�B�9��^ށԥ�I�}�r�!A��5r	ƭMMx�k�����ee��Yh+�ldeF��Aψ<���y���4S����";&�
��#������vYA��hrrT#��,�rZJ�gvC�h|���k*ê��g:1���Q�5{���z����b���9y�:�ʲh��L�g����@�h��](���~�~K#�R����
��E!�g��;6ef��������F�	-��[�р�oJ8����t�E�8p�&w���Tv�Nk\��z���\�V���a�X��ޓv)��)�+�Д¡�gi�vt�޺%�af99Si���f�RW�
{u�G���Souff5y.�b��pQ�����㉾B:"�7��h��Y@@w�zh5�xd/H	!ꎦd����[�(n�uD<��"y�1�'rYh�P\���+$���wp"����̀��'�rIzU��ad�/�ddy���D��#�.^�����q���6wf���M7&���K����kп�ݏK�Ƨ^o���IG��
l
lg����-;M��j��q��@�(=��]q�������xGD#�K��{�^5��1�+w�a�a�XeNg�9�!�,�$K�"�,������1�
�1�>�w�g�Q}\\���}oP��$���5�u���P�r���"�I��cJ��C�����խ�e<Յ��l$���p_��XD�>�[���h��U����&ʣ�����*U}�������Ȅ7�႖[ "�#�5P$4,ۑ([wh�"�:����1
�����C'!O��T����E����	�i:
q���JAa�h�7�f64-A���$�9�Ú[��X�D�u��Pt�bf1���®h�(a��@,�0���譡�'Q�5��ܫ�j�ґ({��rd��C3Eg:NF%�5�H�����[:M9,�eXd�һU�}��Y��H.t$�F��B�]�]W�l�*G^k���~����#	�j� ���aY�T4~G�/
��}�E ����6�m��UǠ��Av}([@)c�Ñ��:��P-��#� ;�5Y�" �MK���5���G)��Y��DJ�D��[�`4����%YE����6[���4�S�%[PǗ�DT�]��r��7��}�ӂ�Ƣ�)�5|l�O����	�����p������K@1�h<a�g��9G���H�?�r�5viw��<\L���$RΏ!qnH��P��,I�P&�0%8{%�Ƕ\�/E1g���x��yj�-���>�&�'�2���\Ĝ����Q��EX�`�,��0Y��UM�9�ZJ��(�Gj�`����w�Md
p#X8b�z���U����|��c��:�!��?��N!�y���dO)V�)Mh�p\��Q[�2
�$�����Rƪ�C�-�%:*�_[Q�?��h�ã�&��![Զ)�(����dB��.a���(瓠�u��a�Gu�J�F�&�<;Q��9�,
��X[�b.q1/��ڃ	����5JbH�k��	^uJ�::��5P�;Ŋ|�����������9�Ȯ1�N�k\���k��1��cd`�S�����WR�h�q�\d� �
��7�G�	�h�;Y�ԯT��)*��.�*�Cr_a�je>��֖�8B���]�
�=�����P���n�r'����/C�L;��[v{�s�l[.�qkM2�gU�M�_L&jc������سo.8R�h�`���Q�)
-���kР2T$�,���A���O3*�9`��w�DR~y��V���k�
����L(�Df��px~�7��\:;�
W��c�5��%%{/��q|B�2,��t�.s���.�S@��S�� N��||��\O��®Ұ�%���š_t�N���z�����xZ�y.��Ɯ�/����1�$`�%sp����
��ט�Qv��mlSa���|,��m�v ֙@�
�B������J<���:ߧ�����0���z:��0����df"�� d(E'c���\�H��XAT��O�*)(�5ƚB	�<�Sk��Oi���Re����/��^��~�E�t�5u�r�QɄ	[�LghH"��"�d�Tn~�=v�.�0p��u��6*z�Ya�����w_�)W/�yIa�~���ж���ႎ�T�P�0�ec�^�@$����ka�E ~�»����xC�=
�:Aɡ�G�c'���[��|�z�`�y�}�7�\,�.��8�2���h9���Tu!����@��=�AVD�X�/�{S�}�p�J2
�\L<�nNr�a�.�p'��	�$��c�JW��~{�<b�y�7r0[}j�C{���n�?̇=lV�3�S�uȐ�q��$�$�0�*l��%k'�®�#���s;��{?9�?��)R�1���O�O�	/+ܘ��+M��8(��{h�"8�$U!Թ�R0���^��8�Ʀ�x��L��w�@%�P
�ž5 ǿ���0lkɏ�U⤞d��es��e�F|��m�+����.�D=�<z$��S��_�{Q����������?���m`3�"�o�4��L��p��3{�6��h���U��J�I	���ӳ#��cOB�L����6Z
�^�:zY�~��1AJ�,1:<t��ϧ3M�xTlZ�[P������v�'I{��9il-�)!�?`�w��>cp΄��ϊ����s�>�d�:B�q���j77��dx3�66��!�8��e������O�7h�C��Q�c`�N9�DŽD���K��5Z�ԡ!������H�����G�%
?�0�	�'�"�&����70���JFr�L��
>�+�������t��{�r����H��:���%�&��I��H7��Q@96�N��"� H����ٹZ3&�^��ߧu|ܗ�l�#@Ӟ���W�S�җ��4d�m������M�D�Wa����D.�Pѧ�:p��]�d�Qº�uW�|^��\�q���a���J��8�xS�]Z��B���Jx�ì�8�̟g�j[Ρ��:�>���'��a�mGa��
�u	�����
?���@Ë��Aub�B8&�b�ɪ�6�%���\��J^��w�X��ېHˡ�\�a��X�<rP��`h�CǠ��R)d��5��c���J����U�踽�`�ԩ)�ɋA�l��?{,���n�#�ـ8�,Y2;�G��ZH����<4ddA��äj�5�Q4�6ܐ�C���_H��K*Aw��ܳB�J?b�H�J�`��H�!���n��b>�4m��~�_��� '�2���)WU�7P���U����輒O$X/h�<��D�b��ްI�G	EF:�.��"]�edd�g$��Xԣ�)R1�+y�x1YSP���z���>[�W}�[r�VF5>$�36��6q�h�}�H��ƐmO�������p����B��z�Q�5V+����Y�Ԇ[7�܂�t)0���G�-"�r:){�S�Tŵb������ie��N0��b �%���r!6�>x�7�E23����Ň��z&a��b��%Se
h��(U�])�B�9�O�|x�|0��v�j�3�X��Ƙ����C�$�6$��-[���z��
�&�<���l���Q>(���FX��c�ߓ�[���/w,�pՓ,�fxf�Т�OT�!�4!?ub�XL�}��E�i;\f	�Q�EV���3)5o$#GA�O��͉K���[ξ��/����l���X�]���!T�v8Z��&H�H��c��H���%~h�/-������(��{���m��i �k�L�5��=)i����BU��Ǯ�r�牛;�Pt�B��J4E��!���as��v{��00V'���ߡ�$�*8?��Ǥ�5�溦Bj�fF@���Q�D7dq
�g���)X�F"L<�8Q�71��٥�#Y6V��>�,��b�6��b�*%�t�)��&ڬ��.f�?�j[�5逊��ɂm�2E������)�m��06�
1*6�T�Y�J�mf3�<�۸�w����[(&[ף�jZ��m�
���]\^Q�HxS'�w��l��20���.)Z�� hോ5��p�����1��ek��BTT˟��sCu��RP����S#(U7ܜ@�G�m����)n`G���ڠ�ҳ$��%ُ&�=�ڭ�/��m�7)?�}.]vE�:4�B]��F�,[��du�"�R$�9s_��b"Q�AE�P@J.P_�Ns�Ԝ�����~(/󱆵ښ�TR��6L�>e��UT@?��˟�e�8`BY�=X1��f�;3�]Uz1���8oK�
qc*����'m�E���`Z���lZִ(��d|%���U�U+�\NX�`�I��1�E�bUgkyn�f��I<s3}�my�qbN�i���~�~��G�Èw!��E�,%���#�^#	��9�z4��Fy���v�i��������p���]�,�e��l�ɨ����d�i�7�g8���n��ЛR/���Ğ;o�kC���3;���Gu�
������q|\;pc������6_�k�2j�C�Z�eZ�([���&գu�;H��R�zC5L�LO]����`���T.C�R��>�u�4����6Շ�~4K�߁%�����1�>�d��Edg���:������uĝ�DlTk�H��'5+�I�GtL/�)�O��S��$�iҚ���i�a���x�u��>S!����\�V5����ڋg�{�F3._;��3������<�^�K�e��������<�?�XM��b���Sܟ!=�'˲�ŖL�*-�C�Q�=Op��W�섭(QX�b":
�)��e�.�&0\��%凃Nt�ҵuPij��
�o�-E��ѻH�A��T��Ca+i�P��o`	�
K�d>���/���"� ڎrҜI`�W44Ҽ3=7ӥ�l4�]_�UOzjQ%A��D��G"�I��Ȫ�����e�Fb�Uͽ�^�������a$��
L��g4��V������#�{��-p-���-��^���a��H�&W�8A!�_BCPȒ/����Գ�����w�K������<�;�jG�ҩ���"�PV'u���?��e�i�
W����(k�n���=�t��xߠc�>x+R�*�	��R��:���+��w��=
X"���t	A�/���AG��L^mȟ�oe#�Xj<�����b�%U!��,lkQu�Et�jG�����=�†*�!����p[��֜
�<���]��E(W�zL�HԪ1�%zCF2w�%�"o�}S�"��8ܓ�sR����<4$|�bb�EAڑ}:Ih$"1��Ҍ��G��u	�(q�GZ^w�ǽa�Cۮ�۴�
n�WNŸ4n�~��P픓��+&��O����	����~���v)�ڇ#�>�x>~p���{�$Y2<� �#G��<�T�#�.�3#��G9$�%^�fG^C���D�p�}��;��-�iaT�m�%E�%��&�c��oN���r
���8����!:�FmmOts�"ΘS�9�=�ɒ�]{=��0M�r�M@Ɏ�K���Z��x-7M�7M����Xj6���i�2M���a�mP�a���ID��e��G�Zr��2KTsj�=s�q��o���6�<}3��p�vw[|����U�+Hn�DקXb�Bbp��g��T#=�c]UI�c„	fA�\8|RT�;�%4���;.��9vMc|���e�2m�$�I�k\#ra�ӡ��PW\��<�ފӓ��o��C�A1u���I���b�N�����i�L:[c�5U�[S_�7Q�ѼeR���)�@ۺ�NR�VU�2�)Ј��K!�,@�
��� �x-�@,���m��4��)��x�*��L(Qw�(�ԳPFa��K�>S�莃�u<rWaM'����u�eO�u�$�~��Z�L��rF�w��
�
b��]m�t�G�.)�x����It�͂XWt[
['(����9�;�G���/N�X����GR��}MH�R\��*e� 8sä&���NL�:��F_}�>/"���m*������bh>}��M��7�h�}%�"��8c
98�\�f��80?��ta#;2�qpň������phЈ����|��b�S�Z
��?�w���p'E����<AWBZ86���áy���z�8"���c��2^^��&���O�ǐ'E�<}�8���m>�<
�R�8� O�!KO�W6E�#�l��@�ߔ��w3g���9�����SPt6T\��Z�n�?ugT����O�����@>������/ݭ���^$�,׊�n��G�qJbl�������<D��y(�����sK�oj�]{����KS9���Y��{�7p���T[^+��|��D�~��d@+&���Ii�5͋g�T�ӌC`nU�S�z��Y>'
U�̀����}�R=K�s�&'��a�T_o�߇�kOV�tZ�W���2I�.ӋAGߞ5LȎ*�۬*���{[��J��]vJyy�I,Jg���A�1��޻뤬���|�!�{���v���A��'q{�1�CB8�|�ߨK��?Fy�:FX���X�ʫ��wE��>�Z޸5fRc.�Bd��	N0��[����l,�	mp ����^E�4wS��n!J��h��l/+_<̋�KN��B}xh�5��G�t��&�Z����"'��!k����Ԝ���?�4��*����A��T���?a��m��HD�S%�I���ǁQvꢳ��������MN,H{Hu�{!I�I�ߋ���=�E'ǔ"�o�U���97RB/P�S��Q\�
N�(n���L�X�N}�K�Kz'|F���.���R�r{���hzV`�n�*�H��	
i�CW��2�3�D�]��z��'��

X
���@�[������(K<�"��)�����"̢v�7����JG.!�\HNI�!S��~p�,�l���.�a��N��|�+�uV����q�e�\}n9�`�s��a�]·/}�	�;S������÷�4k^�a,���J���42㏿jdW���J?s݁�AZ�����i�n������BM��H�$m�t#�mJ#�$;���m��K�W�KvpS}Vt뵿+�LB�t��-�kU:UhC��w����[�i�"],�;������:����`)��G��f��c��R�.ҩ����t���"yh����M:��*`����Ǖb��{(�G�#��荁���<�$���s\�����,!F�˨5'�����<��7GX"W�Y<Kʯ	���.�Gm�%�J�$�����P��]�� �\�x1�<�Q�s��gXc5�Y^����D����s�_�O�K;yܧ]�����$�:�Swş�Y7��W��iwj-��rqwpi�,��z�鍦Mn
��#��=�2���'-}��n��G1^<�U�S7J~�x�8�e�*��J9E�aJh�X�e�.�\;���x(V4[�rz���
ɇ�q$��n/� Hr���-wcJ���2D\F"�H��	|T�݉�6�ûX�l�*��c���0��V�j��N,��G���R�#����n���^��է�>($�W�&Ĝ - �8/�hLu�9�dj�W*r�lfm�Wj��1��B�(�`m@�iU�?h��_��[�����-�(�3��)�<����pK4���V�p�z�RS��C��Z?3�c�
��o��
T+Q�Hj3�T��J}L�H�}Gܻ���x50@�OZ�L5I)�x��2ې�����[:�4u�"i���n{)�9L�����Ҧ�E����Pm�zX�^*ٍVI�T�]E�_�R\"�;j*y�ވsKj s:O"
n������y��q=����ۯ�WS�G�Pc����uX[��X�`d쩴���l��A�1��"��&��VUN���o�O��������n�ʉ|r�0�땝�c|��'|Y_5Tސ�Z�W�;�E�v}
.aš�\��c��	�\��I�˘ Qu1��[����FB����y�9�c�;����1u�F]sAq{}�)��-i�9)�It���\�����8�[�!�A*��"���G3�kXA�-{��k��_�l+~�J$�݅F֮d!��cbA�v�R�?�剌�#�g�~1�Mh
O{.B�* y|
����PV/�Ҋ�x�bB&K��94�H���+>z�qn�B��C�x����q�T/�W�muՖmu�k�v��1��M���3����Z����I8`y���"r
�4	!��D��Oߋ���V!\�<]�,�6��Ǖb����5�L#��� ���4�#(h��"e![#R01��K�b"/=(�.1��of��D�܊LWʣZ
ܠ�#:#Єެ�]UT[��_�Ղj� /þ���I�Pk�q�U��B6��l�{P3XgJ��mF�|��6ʤ���n��h8<��<�J
��LP�lH������_�y�ӷ�����w�߾|��l@X@�'
eX���ٕ�T@��xi��n�/�5����P16U1_�'U���`l�vt�2��B�sEG?l�I@��O@%�� ��cU�L�I�����?��߲��k�m�w�Os�������VR�obo�n��n?E�c����
P�{MO�\�H;|i�Z��gl{�5o�h#�z�h�,���w�������b�6�H=�_�6�Ba�J��QYb��V8ۢ�h�붅2�jddԎ��#3j���ZmA�0Œ��l.�'Y8Kl���EC�Eܮ�Z�H1��~��*�െ?�����y���[g�,)"5*��Tǣ��Sۭ��!Ґc��|�H/|��T��݊�?��8�}n�u�(RMF�z�,�T6hj�F�ã����Q�xbK�lI�dꄑ����[H~�a�>�h\�ލ�M�4E��xC�|���-ho��f��s��Ŏ��	  �3)RM`H\��ČO��`�.=w|]ש���s�yW��e�������A�K!��\����$�,8���z���
�
��I�‘=�Y�L�r,%��MLNt�<D�Qy�!փ|�AN7���۪7��ȸœ�.�\WQ݉_�)q����-��Zdq�fkJtq�f$��FIt.���=˂ƫf�dv��A��w������?`ݓ.�3H,��"�P�r�Z���<�\G�X;�B�ѓK����\#on�5P���nF1qn���^�<�X��y���a6�~En5�_�5�d��:Ϟ���d���"}S��f��2����4�t�wL	��e;��dc�^L�e�t?�㽙s���s�Dwቺ���j<��H
�W�����_"�"i�07@�v��×_.�ro���"�76��|�m�Y}S10WZ�};��>���m�m�'f�K�D���f~7��C�ʳCB��b�b���U��P-iy̸~��7����c����HY��ޞϬ��z}�5�8)@i���}��5(/�ܲh�ԝ��ڲ~Q�&awK�N@p7s�g�_�ڙF`L�vsɞ���,Izج��URFg����21����)��1��@�kYã���uy�G�cV��	�w�����6r�WR��B?�Y�)���W2>ޘi�x��u��8���c�wqK�<��~'�M��Ū�pl�_��Wqtn��0CP#�t��@U���[<1�H��2�22�H�M
TW����Ŧ�X��C�	���	�Z��W �?���4�p��bLJC6<�}!"��Aq	J����FNa�Ү�E������l/�
�_�֌L3<h���)�������׉�Қ�`�B�?"�6{X�5ޣB�6Cʹ@_55|���ۜ/J	�r�Wi㻸<��ۚ���6v����xVS�*�흤�om��;J��`�KjQ���g�W��^nÐ
W��PKe�mW�n���
setuptools/_distutils/errors.py�WMs�6��W��r"���N�3m㩝��K	5	p�a���o$%DZ��dد������2!�h��%��ŭw����詤.g�J�*U�*H�:Z��U���U�/	�:�Néju��6�T��V�Wg�?*cU�}4ej�_��>Djo�LT&,RH�i�J�Ϋ�f�=)W<�B��#[m����֩���Е*]�"��1�`�O-�.������ �
�F-�k�䖵w��n�ʴ��Q�[�eB�Q9������"�m����`ju��Q2L�&�r�f���:�pI��r�\,�F�pBQ���f���B�W�Q�w9�
��B��g|���^��b��c�|��h��?m�P*#x�`��q\��X����҈��+�^F1	4�@ΛU�ϙ"�8�"ۯp�s!�ܱ��)c����P�;K�&�ZYBe�6���hz�©]BJp� upMe�^��r	�9�b�Р6�H���3Z�p5�2�46��uIo��E��xXDN�������J/jm�߽8Z]^p��ۧ�v�k����w�f̓��l�B�� ��_�XR��भ���p�����NA�g��df�m{F��aS�,�p�pR:ƅ���Xn��}ߙRFW��"��'�2���*�p����;�C�.5�(���K�,εBo�.�wW�~g)*A�b@�T�����6�<�Kg�Ɣ"��@�I@xy:S�߄���=�&Q�h��.���g����Dv�#^�"���Z����Pz��U�%c�;Qx�t� asЏ��]b������˻��y�����d^�=��p^u	w|�f�+��3T����O_��÷`1a�H`�h�}��7�'#��SS���yڋ�b��;��FGȷ�I�$��ET-f�CT�㡟��,�n�V�%ov�l�af�L&��{v���C���.k���)
wqH��<��������H�<Q�#��p?��e{b�[����k�=�Ġ송���d�?�~(ifa�ns���k�\i<y��D�ȟV��k-�.�� ���#�+XH��C_V�ʂ���O3)�S��
l�mO����dnp]��7�W���������������ly�Z>ih����t����kW`���|vVk|��+��!�4���G8&0M^6n7٠7��ny-�v��g��G8��܏��\�%��)~��'��#\���k�7��_�t�X����<�}�����W��6���[��Z��b�S��~�����~�G�:��c&2���)��~�}���PKe�mW]�4:%
)"setuptools/_distutils/extension.py�Zmo�F��_�G�0��Lӏj�C�m�9m�$��!�ȕ�g��rI�:܏�gfw�"Qv��N@"�ܝ�yff�(�rm�օM�c�J�M9��\��++�߅�"+��3�X���,�*�T����˗�ۿ5yS`�.�Uu��nW�$���Dow������^V�.�v2�6�:>?*%�� L�����"E�F�#���V��LX#t-�z��Ah+���V���������oLZZ�ߛ�zP�\$SaMHY@�� �z-Ti��f&�[���eM<�c��/��J���
�H�,�.������'�J���ʘ��Z
�N�hʬrBKUת��Lu�mTvӹ�X(dV7l3�E�4�\`ӛš���,#�w��b�di)8M�MS�b#Ȑ��F����Z�M9�e�+��ŁlX��&���A�T9Ԡ(2P���u2�8ӵ!7�|6�hl
�f�(@��Ѭ��k�_Ss�B���}�G"��#3���O�J�.��"���Ԫ!�DR��rY(���P)+Pÿ�1��}�jq0
\$�M���'npSzW�Z�����t������_��=�aOb��P�n�:� lV49)k��������Z%-���_@��.�#Tam���N��aX77������4U�sq�D�k�p0�䖴��*d�9tX`
V�<XS�4�=��
¯�n;%���R?����"��͵U;YI�9mɬH!��.t}@J�����f&�X3�wq������k�S�^�:��Nఇ�)��*�r@��u�����y��x$AL����r>U�ԓvw)g*M��Q��6L�!��a�	boɾɶ�v��J�j��YeX�x�3� ����Ϗ�T�S�~�D�+�$$��d>w7�s�/����㊹]��)]�0�8e1.�IC��t��nBDP��H�u����OU��х��y��OW6�A����P�\��0���U����E��z=���d���V����N��e%�ß�G�����^Ժ����$�1�L�c씘3y����TMI��u@��
���
�;�2��|U�j�\�na�B-��Q%f�/�񤨼�'^P�bQ�N�#��͸3bȕ��+485�4km�5gKuqُ
�K�]�,uI;��L�Y2Tɇ�u}T/�-N�'�����PS��T2�S[�O���p��WnMZ��o)~<7��yW��!�'\�
�u=`����wH��[~�5mGq_7[��uu���0�t�H2�:;�^/ӷ+9��`TbC&Vm�ʁ���Z�wl���h�H�+�s�B���R�J�Uo5����>v�̑ծNC몳��=l��x���K�WS~2xU�-D=�g�c���ف$B�Ժ��vkU��c�T:K�B�;�[*}��o40�&'�$���
��x."]j���t���v���Ǔ.D��$ࡆZe|s�Wd�.�б��-ѧ��\�T�?iwC�5è	{[�\7h:O{�nS�&։J�����|I_ZL:��M�K�q�0����{h���'G��ܚ���d���qZb%�n�O+�����k����D\��
@]��N����Cu���ҁޑ+x0��7Jd��V>`��i���u�P����,	KP�ˑ��7Ћ{u�c�b<��S�c�vB,��ElU��	�{���F�鷢)�Uc����U���~/��"��슱����AUfU͞Y�b��(xvY��8����&�	xvAH��^��ߟޥυ���!kcSޗf_���t��O^m��c�u�[E�Jj�[o�UI����-�j[!��'�s�{,B�3�MmE� g�;�D\�	�N?M�����lk�k!pOH˄g��?��aO��ǃ�1����n�|8�GC�Ȇ��G��僾>N-g�kխ�jt��ܐ��#ۇM|z�ԟ�0h�ӱ���֮LO���M��(=�F��!��=�sW�Ӯ��x"T�ōႶ��-nt!|!ޭzeG���RMu�j�~�b���S�b�c�J�m�vU�]n�ߔ����3�0M]%�2�P�	 ��v���G/zw��ť��e��
��	��A�g���$���=�@��W__���Ɨ@�&���\�K<��X,��t��/wĹX̞^�{#B�х���:wBB�	�N���`Pk�1���t������F���;�Y�{��^w\l��J�ás���%d�WDwF���������t<���k����QV2���o�?>ZL��u�x
C�^}O�(T���<��+���m-y>�~}����7?|�.��d����ϵm�M��?0z�`���fIG��q�*�C����dΒi&�$����7"Iq���2Ċ���V�� �҃��v�!���f�����#e��ר�������%%���(������p)]W�.�z�CJ�כ�I�U��x�')�P�u<�
�+>]�ܜ͏ŻʬN_��1�~h&[j�b>B�;:���d�!��̶�U`'L��l�dL��/�D���ׯ�w�"��a�ˢ�K�1.x��
BTM`�?�|Noױ4f�g�Cjn�IY��3�}!~�[�&��$[��A�e�^�P�J$롬�#M�n�3E~D�ϑz�$悊��׶�����q��#jN-BD��94 ���R��&B�so�J0V��~sbUl��#ۦ����ʐ(�`�h�΁�H��Aߥj�bX�+��9a4x
�xԂ}�VϐmCo������uw�͐�u~�8w�^��NC��@��i�����q�#q7b�}�O�<�v<��c��J?R�d:O8�A�q�}}w�e�i�r��b��ʿ��ߝr�Y<3�/�>tI2��۹��G��c���M��v!6��,���ǥ��Ūk�năM�M[S�z��[(�q�U*����&�H��E�!}��T�|���<�gU�ռ�����F 1P�X�,���~{�.�isL(�D��Q�G$h����~�֞���;�7T��0��=�3�BN���t\zzR�X'A�r���(k�S��;��Ǒp^"MFT8���'|�z?��7Q�C��-�f&�z冎pu���2�Ξ���
����j�óD(S~y����)�|��0���?��96���_U�����Y����ҏ��}�<�#��������5N���hP%W8k�W�_�"?�����2�m�J�z�j
��l��I]�/���*���v<:�"p��>Cb#snk�ݐZ��ʽ��kz�ßo�W�y�d��	BR8a�O�)�[|�g���}}���F����}�!h���>�3}g����O�%����|��X���?p�L�PKe�mW�1ƲxE%setuptools/_distutils/fancy_getopt.py�<�s�6���@�L$�����U;����1I��9�WC��Ě$T�������I�N��4Mc������L��4�uSg�^l�29�w�V�z2���Y��RM��z/���2��T�Q���%<�kq��}�JM�*��1+w�8M�:Se����릒z9��{U��\�;�`���^&�<��eE���}|/�^�@��z&�.�"QM����eYgq���I�K���K����(j�"�N�!Z^5��45У���k-�yV
��E&�d:�N&Yq@"�	� �f���k��m�
�1YV���0k�O&�&ً<���],Y�nS�*9�f�Q�$W�� (JU�_����d@'0R�x���߿���b>�C"�ӺCVe5RW(]�o��O����$�sDI��q��D��`,��{��ͻ��{�V�,@�<+�<�bK��|�] q�GV&�7e"��u��>�F�D����^��6�ri~�����y�K ���l�˰
�y���K����_�
&jWf���Ĵ����E�g��Z
�	�[�)pU֫g�����X����#��/u�z����N��g��{#H`0*�����9*�g�$�;�_���8�Wu��d�R��PN(qOg�=`e�:�~�SV���"��trB��d�$M_�E}C��$�u���a��D���a�	T�ۦL�5d����H�p����H�ĥ� ��,6�L
!�Df1��$_`7m��%�a7�y�TO�$�$(Y�m���I�P/��C������d)�fϴ�ظ��,%ҠE`v�U�8���uB?�r+����:�2���:^��W����9l�B�
�;L����O�)��X�
x\
^�8�kQ�'f�+��UM%���0a�
��58ciC	�Y��=��=�t902�]١|g��q�k
@�"p�9�HB�����vP�2����n���Q��;`L���8�e5�'��
�(.O�)Z�ޠz�8�J�2�	t��^}Pe�����c)�%g���	$N���Y��-��W-����NX�y��>�[�څ*J�S��F����'tP����ս�3��8bt  ����� ��z�֛&�SF1d�E�*EO�}Ći��W�U*X�`W��W�2w>��h%�u�}�|�}:�!�`����r'%�ir�V�
t��,���#9`��4d]�@_��:��8@���XtH�Y	tA�B!{2eI�
�亁T���}4��A�vh(F���I(k
��Ғh�l�H�8����u~st~34„�\�ƍ#����L�����@�R�s�#���v��!�nn��֘Ǟ�Ɨd���@�Y���<#��5��k�L�TV*�6�!ډ��v��spy�FמoVU�#z	��^a̱?�n:��f��T������m����0DŽEH��dܪbb�\{��N�x�E�P�]D@�3�	ly�p���/7W����0���v��D�3���Uoᘗ�3��2g���FL
�^��wp�n���S�X��l�©�߱�	�u��� �m�%��M�����&�7xt������]��&
�Y������1m�C�pN2�!{+�ׁ9U�D�}'�,U���*�,�n��zϱ�H�,0�k���=&����3=F���f%���iP�ZD�K���
����`�O����.�d�U�T�Z?B���z�cc�d/�;S������:B�u��!�”>+�VJdخ�ݾ3�g�%"Jy��u����w�f),c��}��m4�f%��,��,o)�#v˒u�Nƀ�O�����W��6�?���T<}D�;u#W�ҿ�
��,�,�ˆ�i"{��f$�i�/�)���m-����H���sط{IiWnĤ�X�W'��0��;.�~Y+�/��N����L��(�#�.h�$�O�O�lPx�8?Ȋ�/_����0�9�����U�-R�^�̗RzN��6�V�w6��*�dosr�2	����aO"UXt�\�"�z�g���#���S�AFϹd拾��a�"K��j%^
]	"`rN�`�_�bt�=���?>�Yp�a:���a���_�R+Q���Ί��t�L"
ʨ�D=��>�f�-��k�[�n�R\V��4)U��|��A�;���������eG᠋��uaS���D�/��'7y,R]��J�d����J��HA�L�d�HGr�̦�H?*t(6�B$S�h��HŮ�(�(�[�݊�i��V(��8��;&L��-u����օ�{�������V����8��r@�~������k�ُ)���%�?X��-��O��7m �6аŋoД��-F���94m/)�!8�A&�`F#�k�f�h�	�|�Yc�ގo���U���o���i��=�eb��s�3k9�w���+=�4�م���NR�PbP�gOյ���}�m��ޢ-y�G膂�SCd�e��l�r���Ձ���
���}
{H���TC�b���>R�>M�Zs�*+Uj������dT�B ք��W���H�̥�C�U��QHl�&�}�F��m�kv�3��$�_+��<�V~�NE?�Ft�;������~
�S��Xl'�����\�{�-ޞ��Y�&��Ƣ�{�o����d�Z�Q�lK7���?yC�s�nBR6ņ~0=
`_~��g~Ǹu�߲5H���K�m�6��Ք��Џ�=�_xM$,KL	]��G�^�[�X$Qk��/���b�^�w58�[p{C����2��M�0�A����g2��u:�>����zy��\W�2�@�	�p)��B�oMQt):���;SVU�������r�
!Q�-BD~��ݡ�W����Jqh �9zGQW*��=�Y�9n��<���^��[��DN�Z����R� ƖY��"^�	lk��Q
��x9�a`X	��KOV•����4��<[�2}eg٦�v����0����n�{m�a���q��D��Ee�Kv�ò�N�渞Y���F�N��^����i~�n�1&��B��
x]��g��hP��P�Q��s=�@/��7�)T�! _���+s�	�����BP׷~�?���"�����K��|XM�����ضy�˗�h�4D��;='g9#?I��\E]��TF*�%�����[0	�S	g�e����c@���){N���5�j��' �dژ���w:0#��lj]��s;�PX���i�o=oj����b�����G�X�y$i�7H��S�����ᄛ��qmh��2W�~��G��et�kӈ�Z�MZ��I��=h���5�1okL��j�R��p�M���CJ��X�m��Dv��P)��ۧ=T�ڻUS�$es!z�E���[r(��Ά9��mo#%�!�zO�>%�w�q���{|8}���C��Ճ�]������Aj���a�H��Y��݈Y;��)�f��P��8ձR5��'ng��\�:�m9����
A	n�fS�Ѧ�N�t����oN∶�E^:��%�����⤚�z|�aD�h�kB_gp��%���YP���)l#Sm��X-X�fo�yӏ�ƛ>��3�K0�8��dC'�6|kx�[�{���8;@�B�����:�C4w��������ppxH�ڼ�V��,���/ ɰ�J�Ƣ��i���5^�]�U�7�u:d�&l.�\%w�<u�y�Uܟ���4�$��+��*�
^P�#y�v@���m���s���qA!�/��9}��{��2�i�8%�h����7�>����+:��jf�]��=�di|��0���$�X�R��9'F�Ik���R�P�:`�6�#��t�P��� R8�FO�	¬����P.A-�hXp%*o
pYp��7�u��h����z,y�Om�vv�D�����l�y�e���^��K�k�{$=ހ�����vbYOu��f��l3f��,�d?p��
�N�a�Rm����(dӌz0��ݮhfe�/`ė��g?v�l�`�Л�q_��veD
:�C���jv{��R7�L����vW�o���|�Q�G�n�ϟu�' �~�,�w~�]��vk�Ψ���ޢlk�^�!�W�vad���K��X4���n?�U����(YY�[��!_wl��07����_Ő�]/q���%�
��!R�9϶`ѱ>���SE���f�4�^�r�\q���ظ��a!!V���s'���ę�Ktjf��e��r�W��ϛT�ci��d�:�~��	
Tq+1�0��Ѵ�ڟi�~:�Gwx��m-r���A�Z�=�P
A�;x�r���‰*v��||[e�2�ϔ3���lƯǵ��poQשr�9����u~2��FCh�c���!n}!��(���Lu��FSmjg���e�o(i
p3�rk�=rV,F��\����l�����n��������y�1�EbIn�c�"�P��8�r
{�3ŝ�����4�1��/]r��:���_�~`���h"�=�2#�WM^g�No�'8�B�[q)�81��`r�v�v�)AyԦ������[.�ꕁf��L��F�/+�m���L���ϓ�8'f����n�Պ��$����N�Ff�U��3�z�n��/���;5�[,c!���@��d94i
���3��5i�5�.��{4�7(���o���2�|8�ïF���*6��q2�BǏ(1�*?Coُ��tpV�<�X��ӿ6R��7;�b�5H�:�7p��+��9?)?��q@��a�e�
�m
�<Ȟ�<�p!�JDTYz����я�V�hf�̅l�_��C-����M%�N��U�3�]�y�WT!��0�=�e~aG�]ա;��AR~�^Sf��#V=0�!t ��B"��ͨ��|n����o�2�w���`�Ѵ�O�]��&���{V� �$p#�׮A�j׳��UЈy,�
�oZ��x�o��$�R�!��I�������gݚ�7�޼���h8���S0�A��E���E}���m�c�yu�����a״�03W�9���'���T�
���TA��,���#Z��\�ϣ(.��cm�'®9��+~�˼���=�$����bc�q��;z!>�
�ԏ�#�w<���yuݹ�m��?�ĝ^�'��]8�Wy:6c@0̽|�ь6�9���/Q��ͭ�������~_�g@���y�O�vڠ�d��^d��?,@��jS�W��ύouZ�g<�
�͐6��zM3��ug�z=]�y���*����d�F�*�eHB�@��8�*�����[���z�mn�H!UiJ/\b�u:�'��;UHl��N|���7������P�������˳7�����"jE�9";�뫙x	^��?^9Ң
"���}�b-s���!ogs�Q�_M�PKe�mW�È
�"setuptools/_distutils/file_util.py�Ymo���_��V��JR��MgI�Kr
p
j��x^-�H����3Cr_$9v���Z���=�p��i��o���b�+uI�����~'Vm]xmj'V�
�(+�������w�Mr��t:�L�1��&+k6����5։��e��=澢G{���\M&'����7�.�S´�i�е�
��.I�Y�M.��d�Ź��xcju&D	�|"�?�Z�2;ߢ��m�n�q��4�.dU�	�?�ɤT+q٩��ګڻ���\���Ų]���t�_���?~��?�g��7�~L�ul�	oD���S�4~-6��bF�r��	�3ˁ�j2�Ґdy�\X%K���f�s�n�fæE0Pj�:t�z)�ڱ��4$G붾v¬D6�bƂ�;����8���x��:��7FH��4��md�H���K�]�;�&�d#�6��ꪭ�M����'�70Jأ[��bc�� ��yH^^Ziw�/�0T�P�����<eUX��TeXl�!�(��oXm����Y9�����]fy7D}.��'�x>;�_f�´U)j�Y��8D�7DXI-����<�tB�
)�h�_/�g�u3�'/z�2�hk
}�0z|�.���ô��`����W�-rj�����	</�~'Q}�v���
��k*�m���
dvDѵ���
2�
�k�=#�>�B���l
"�'w�����z�h���yY��_v.�k���a
��1�(*`�,��%KJ7��G�u���7���3��50��M��<�|���T��	~itiw����큗<](��pI�^�*����\��:��ת�Vqm�X'�
C����\h��� ��.V�',
Ս'luU��5@��a��˕�<�:�W1(bF2#���n�����]C�U
0��v���R����k��dS ̕i�*U�ւ1����g�Ө`�"K���˾�[%�?�fzEF�^,��ʢ���Ǝ�G~lUUE����֘Gg�ݨa�e7Y'G�R);���6��>pt��JX�v����E`&�5f��δWy�DG�@.Ht��:���g,���v�k�P��,��3ᔧ��)����)fL��ںS�2a��LF$�d�̳Ш>����8ڡgYe�6Ly�?�Y6�(֪�&5xÃ
NR�K�p�����
)pF�C��]��
&tb)!��z�����j��kY�n�:�r<�`�71�hv�'���€@��!K��T&�q�QNvt]�AdDu~T��5�ܷ
��L:I�>�F�a��fW��^�����	��ܘ�5B�T���ⱕ)G �T�Y�Z�K�
�C��ژ��|��~��1	'u5��dE���V����J,5m`�K��7Ɍ���a��pcP��f�5�mS�|� y!�8�0�ݚ�
!�k`[���A/8e��m�X�D����ĶƮ؄��6�����b���g�x$�H��ά<o�b��������*�U�D����O���ע����7��<�����G��_�x�՜�^�Wo_���]�5"�I�Z���v}_�1-$�ʍ@1Re51ɶuG�Ah�N�^����H�����bt$���R:[�R�(�rj_d�_<����Qp{��g�w�%Q��?;���	.۫ٔiv�
�0�j��9��#c:6�<�J�ڣ�و_v�	ó��)?�Mn�w�c��;�'Y��G���t)n�;��7�٫v��"�1Luf:���G;_����q'�M�+3��R�;}F�u��f����Ƚ��1�x,�g��8<!�J�6���Q$T�e����(@��C�T>�3�y���g��I���	�ft���pK>�J!�*Y5
=@7;�AsL��D]G|<�g��uo���>�<��OA��< 	�#��K&����3�UרBc�E�3f6�u��`õh�o��8
�����$b���H�x�O辽�z�x�;n	㷩S!x�OA��Q�E>5�#���ufJ&��~t���5�[��X[�c��PV�[�~۩���z	J�(
c�xp�Rޠ��p�����Z/��z�<%�`�#�C��,Z*T@�{
u0n��z�
o�\?�~O�裰�`��	�?!����<?*�r 1(�#�G�t�)�cxh�2����
x%�(�O9aVhONO�y ��$d̵���q�1ЈC�o�s�������>_C�ԝG
��=���C�WC��wu詵�P�n�Bl֏��EKQu��S!r��||��NKu�����\�[z?1n���?P�\��%ϟ?�t�}�:$�ם ��50��D�e����iq�����{�."sI@z%�6�_�7#�$3F�y>y�G����E�8z��x����`~5n���=���g>�ۀ���f��Lv
9�5��{	Fv�Xa}�{P��x
:���\l���P�Q7��vC���x��嫟ƥ�W�N��@���|dƒC���t��?v*�*h��qတ��;F�Ý�_2�хƋ��n�pjG�����r�|^�����73L'U�~:2t�9�
�c������#�3�yǕ��
�L��p)�- �!�O ��>K"2�ԯ����-��c9
�l�]t��6���o|��J/�z=��i~����Dzu��;؏o3x����7���PKe�mW��%4_4!setuptools/_distutils/filelist.py�Zm�۶��_�憔���if:�XN��I=Mb�_&�9_5	I�A�����ww�)��N�T�9��b�x����a.MUWR��B*��m0x�˭̅a�J��hf��ƌYmD��f��VK��e]%20{S���9��R�H�L
+�`2���\oJ]��'-�ӢX�*[5�u�Ue��`��嚵�_樲��
]�6�Zu�֥6��o'��+�?���E%t��wxy&�\��A�j�������̘���|�ʂ���*5�C�2x����x��F�v˵,k�`v(h�d���y@O`��d@�^��E&k9�+a�h��=V�Mq����	��J��`������j^.	W��V�35H+�dm�J��ޑa�5ħ�k2��E��Θ0��\�y!75j+wL��
Ϭu�Jt���\hLZ�J�R)&0�j��ˋ}�ÎGfm'3�:���b�f3Y�j6K�P�1�q]L*1���z9�@��ZFW
�3&�E�A'zY�a���7�1̶b�BlP�k�9�n�un8C��\*Y�2���29��\ߴ�0���Nn&�5�˻������Դ4P&<���B��W���6ˀ��5~d	�'���rT�\�7-U9�=�߳�/�6|l�<���w/x;�t��J]�t3>Wb��/�?�5�U @k*q�!ٛ��J��ډ��N'h8c�(��D]��<��Q�CEB��kc�##�������=�ގ�R�S�Α=�.�AZfŝ�z$}Բ�7�s�Վ
"O�|���`��p3p�V����6Ѓ �YU��3YtF��������E���4jT�
�)[K�	�x!0������b]n�,B�)�[cj�r�V�!
ǣh^��y�)��4��]�'c�Ř]<�3��`���M�Q����X�U���~���Uny�g��6b�)fJ™>��Ja�=l��N[�rk�SKu�����/tS�)���5�:�cإ�,2U�"�Dܹ����/�!�"��Z|�>ԨxĞ�/��j.�8�e�G�&簊Bn�o�S7�'Ϛ�/���d2d�n��8��h]��P��Q�򓫛֑ ߋ�����FnE�H�@P��Y@x���X�A�@�|2�_ދ�R�E��mt]������XfHb���~����:��PF�"�+�.n�rWx�P�P���U
�ø�%�P�`i��2�<$����(Q�OW������@�����h�\U���sX �$�d�،{Li��:
%�R	�1�$��`�v|��)�$��Whc;�^V��3�箭�>�JL-����Jg��V��q���a�IM�7���?
5ЦD�s��e��4$y��1�;,m�r@~^�@ �\ɜd�ߊ(�;;�>�HM�S�q�T!��־N� (��*'/��Ȱ�X�`�mV��H���?��%6)i����n�k<U?��(T��hn�
�M7[�z��&�J�	7���L���+�%�U��t,�ȩ����;/��ȉ����b���!��t�b�6Zl�zW{�������!�G�`��kNA��q����!{�O#U�#8ʎUm�z�C-6&���#�=n�
�'q&mX
���
����Jz=ع����/KJ���}N�E,��4�S	k��E�Xnj��^3��h�!����MDm<�҄��������֣^yR���<����)
�b�d|D*
�Q�Ю����͆C��I�����Ԧ_������` ���е�O�!��>$��԰������1:z9Ά�
�H����A�T����w���%�wl��kZ���%�
�sifZ,�]���÷4m�K�R�d�5��}{�1�;�I��Pe��!h���	�����T{(�wR��r1�$c�E���N�v,��o��l�k@��PK	���'���S���˼VP.'����C�M�+���lD&�:�V\�BC%h����4��
+?��닆�-Uap��7+��p�_��TXYR����T��;���^�,��ܙ����!�y�^���~�r9�0�,���y�*0\x�u���v�@�.up�B:%���'����Yb��Kj�s�.�\c��h���,8�ǘ͡�w����<�RG�椧Ӻ�h�T\W�T�~m/+�=0��^GA'A���2������vB���q(u<G{�cO��Ft&潩QѸ�@��g��y��zyiׅ���X��p'0��,*.:�c4,nv�`[��濢#_\�jQi^��͈�B��AZh�����r����*7���a>�@��_y�[��3�������X��NĄ�}��d��v�9�:c����!sx��f{���;/�o�ߴg8�̮S;dw�	�<jG�S�p�9	:�m�]�g�Vڭ��V�Iǽ9���*998ds�I�$<�?}i���p��{aF�nJ�X!�޶q �\g��X�`�!QV�u:�':$;L�M���P�'��ڃ����7t���56X^mp�GW��o���|�\.�v�4�f#\�� R�o�V�RB��ӊ�˅���,��_q�?�9;�/9g3�{�I/��	��SҾE��%:����u��v)>ҡg�;��{Q�A�Jg�\�J��P:�\��;I�wxUH��1h��$�C.u!��6f����tG��W�4��T�S��5S�����Ue�}���}�1�AQb��v( ��	
�nE�h�;~n���=vN^V�{�F��`�`U�n+!���ߣ������b�oK��i���0;�������t��������	!����^^JHY�W_}�׿L"A��h���Y�BH��[��t��
/N�Nd��0�epq�]��^Z`P�\�]�!�=D����8�R[�R����E�)�B��BT��p��k�N2H�!�Oq�D������!��|�Y.���Ee`E��Nn%� �8:�k���W�S�<�ӆ٨��X
����lڨ�Ym�L��Nl�@��<���nU�.����fs��vԴ�Zս/��!S#H&ɸ/��E��-P���v�܋a���t@'��r;�<�����b��,
EW���w���6����b�g�/
'F�-�XtϪ:��E��_T��X	�.����Ԛ�r{*;j�5�ރ�:��#�Pr�Vi�
�W���B�H��I��CF&M�(�:�}�/���W�����F(wEoS��Bf�X�Q>�"N��h����lj�;���O�ʒMZ�7/���c����B����-�
����Z[L�9�mi�Ǝ�1��9���啵ʑ��ZÌ����(�J��T�<�J��7��ʴ�je�WR�Z�B�M��#���?{e�O��b�tO.X��w'�F��>[�gl'Pbmš�D�Wp}�؞��BU���	���M��Yx3e�08O�j}r��ss��s�e�3�z��$M�y��ÇQ�|F�G0
9N�O��m�s���r��7[t�����&L�A����}�$q�}��a7r�jx��jM��1&X�Ɉ,\~ǂ��]ct]½�N4@�N�ִ���
-�0r'�vj%;��^p`+9ҭ�3�$�Řﷵ��ށ�l6���0�'�ddW̴�u��狛�Ձ��͎� NX���ɔG�$��<�,��h�$i�$�E;�hoK�o}q��/��>&l�/kw���7brE��/x���M'h��D0�Mr���/N?��$�j?|{n���1�����鰖�L�=o�(E&��;s���bX� t�?��{�m��B?4��z��G�"�PKe�mWˆ�з�setuptools/_distutils/log.py�Umk�0��_q���Ä-�`�e��tJ[B�}%>�b�U$9Y���d�����	b��GϽ��E��*�5�6+(p��R���jLAf-<L`�i4��H�x��Z:9Z厢���<,M�SВ�$
��Z.��F�$�2�6����M�άT���Z���^�r(ķ�ק�0�w����=mF��dvG��b:���h�A�L'���(1�m��ӷfu-�J1��\�����:K�c�.7:3m|p�X=|��˾�En7<ר(�*iW�Ť�Z���01%�%�f�$�h�e�r?��pj����Kk([|���
.)�v�ı8��e܋�k�p�uWȋ��{�S5;G�j !�ޢ,���g�|��v0��~�T���v{��pc�G��D��]�����TK��_��!�`QqQ�B.�8*���k@>�K�F{p���{��j'9����2��o5��)v@�f��e�r� �W��ӫ�PY��`O��ڑ���4�1Uf�<����ql�-��k�G���H��8ƒI/�y,���,�6�YM5Cc�n�޷4C�����<�糧`����,u�wA&B,=M�	��:�����:N~|E�<�3<k�S7#[M�̚<:_ϟz �
�3�j�D���0�wޭ�.�S~;X7��|[��1�m_H;��f��Ku
���L����?PKe�mW>����!�v&setuptools/_distutils/msvc9compiler.py�=�S9����Й��8��@.�K��"@.��#���{d<�x�7����_w�c�ِ�Ի:W���G��j��Z��nlj(�e��p*�Gߏ��,Iy�j�Y%�`g���CU�cQƒ�,�S�e�g,�r�Y4e�Jf�Q	��58KFE.�qɮ1�R�/�q�������V��L�x�r��x�!�zH�	��c�?��]����'P���h�`b>��EI��iX��B���I��9�)��v��j���ER�<c����b��i
�ht�c,���[���r�O#���'^�,�YĆ��|�F�&�-;�j�A9)��hT�[��Xt�1NFXW�����Im��{�L�h�`a�˅�&��Y����J�k�[�q�O-r�l�B0��H�?��1V���iT����K���(�P�O�������:&fU42��l�&�A>C����C��ց�u�-/35C��$�h�>�ۋ�~��G���CS����|
?�ZU�뮢t��Z*�z�qUGTo��|��>��>��?�{q��O?�_R�%MN/Ng��OΏ��9=������V�����x��+�8&Ԅb���}ww:čX7�E��~d;/^��t[ɘ�0�h�5��76pGlwgs��,���dD���D�8˸d�4��`����=FyQp1��қ�
�(MzF~���<˰E���~Ec}X�X��d�_Q�U�3-�}NQ��|�^���9�c�ň�/rr�~Y�_����?���`*9��@%��u~|�l8!4~WDS��w�O�[>�?0�?��RtA��i4cw|!e��#�.�n9/2v��F ;�o�h�g%u���}T�(M�aTvB�#/A1Vl*)-P�����H����X��׃h�~��lI&�E�%���֬�
@�����ևӃ��������#n�߈z���(��)�TB���k��j��d ��*]2�J�)xk"�`���Ԣ/19�u0JEfU�bw��@9����H��9R<��@���D��%����^L"F ��PjA�khrcj�(P��A�3�@�)����[M���BNU��NH�Q����0�;�H:�
]�'0���BP
c�G�M�E�E�<ϸ)?��1��m~=L��.�9w5��ϝDOi�@�"�]���g��sJOC�<���ڊ��}��ZG9�Ӗ����x���x����|q2j.q���L��4e�.Pwd`	�Z�<�b����M���߂p�=I�+3^qYߐ'p(����D�_��PL�#`�(N���v?o�o)1��.Yc�3��x*�#�$*�"�kC	��v�V��e��%�K�{�j r�+h�m/�?e	����3�j���`�~�H���j�r�*;~���sɐf0H����qO;J��<T�.�RŽ �o�u
�m��.J�Ǩ� ЩRaA���B�_���aL*���VZ�P�ec�r�R�ÓH��GI�a�|,�/}X�ٗ�C�k���Ge-������l�ƪ��!�9P��տ������}�]��a�ec�!Xv�'�V�wb�;�v}S��,��`�ӭkr� �]�i	JA9
���IZ�xD#���K��P�tFƐ�="f\�$1.���ETr;�6jT$�Țc(��4�UN@,�V�i�N�l��AY�sv��[�)
��Z�h	*M�
Z���|����C3�V�7Gl
_vwڨ2�e8[���m�����뼳�o�d'wˎR��qE��>���{�A8sp�R�L� �?,6[�c3�6���ܗm��4~��?�m1�6Z?���j�>��;
Y؆b�m7��T�S��ŗu�b7�I���\�%�QX��m��7�2��`5?�d5�&��"��8U"�,�J�x��*�mi	7(

��6����
F'�Bq����B�C���0V�c'�%�t����0�Q:���u`TE�
%(ib�2{6�|�UPDG�d����7���
>N0��>���P���i���@6�􂍝`�g��^�~�
0�X�3�#`Wp��d�&�4)�6��R��F���������ܹ�M=��mR��n����K�!�pT�*&��$��W���X� �8���[��v���H',γN�"7�#�D:�x�G2 !a�%v�_�s򾮦RCd{��_7ĝ�H!��ckr
wY�����/�^ID����8}��?�h=(8�B> ���%�(2^��+
����2&}���=��>�C%�Y^`4`Ȏ��4J�����>�ձ9�ݭl�c[1�V��M�0��f���P�b9��_G�4�%��jI2T$ ��8���K`	�5��/�T����cA���N���` �����hF2�	Z�r\���V ��{�V�v�3��Zc��\l� Gf��_+�,{��I��:Jk���"����z�r>MHb�z)*WXf�A5�!�y+{6UM��%�*ԄH�W
�ja���<���!��C%�%�À)���*�v��!ls�?
�f�MAT2cݫr	ԁ�I��$X�����������W��/��//.N��T���<��9&��\݀ �8KD�|O��J�Zjߧ�m��6h�h5�,�h�HJY6����vz�t/�Do�D@aP�[I�穐6�}��Ḣv��/S{�@W;�hH:8a3�����JWՌ$g�����Г�E�+��5��+
)�*��]�g�г��Bc"5I̠�����lL��BpM_��Xn	V�	�9 �hhP�M��/^�<�m‘?�n�M#*��U���qJ�`SeL`Zuv��j��J��V���X4!خ�h��~��u����<Mj"ٙN=PR�KR�t���b��+�,b-ƒ4Y��REow���Vv8�]�d��A�Q$��]�T��R�4��1�K���h�s(k��!� ��0g���cXL�
oIG M�f��
?`Q�i�K'�#�;���R�	1-�8���6�O���/�z�nS�H�=�f@3	�X��3�8��3,��~����?�%��9F(C�:zk�[��]�K��㲦xڈ.�l���/Y�&ݨ�T�N��R����f
�7��WC�?!h�dVؓb��m�a�_�j����?��������:.�ض�?��ѣ�I|y�h&w&0b4�i�V熰ۀ�mӅ�F��(ͅ�T�yCW꽏���
Zs��%�hf+�T���0�]�o�(�J<1?���M�a�������Ź<è20C7��
鮖EW�������Tҵ%�P&h��S�1Q�����|;��i�O!�<��|�2��lS��MW�k&(��:�F$/�d�F�D�I�Jܹ��f2�h�М�k�w��:��i)��0���_�\�
`��2�9G\l.ȗ��q��g�J:���!b�i�G>���
�:l8�7����>��D�,(*"�/ò!܌�,����w�mA�7vS�9r�B���H%S9��à�Vџ�OY����`6��$%��ƞȠ	eMq)���R���}d� �ʈ:'���<v(M�(���p�zrr�F+,~c'unT�l֬���f3���n]4!ԴY9�J5�s��י�h�����cF��	g���@ѣW񀤢�#�s�hLtc�Z�Mq�6-m扪7I%���UA���g���綀�b<���ӴeVDJ��e�:�b]aV�%�U�C��=��Z�3�
�GPf��j4�B0�U����@�it����7�#��$pU'k��9��r���R�������(�o@L�[���qvjӪ���
IU�B��g�P�`�1R5Qa�}���V��TT7�ol���9�M�;,�~�E�NK�ф�ğG�i�LyVq6�|`�)��sH�ˁp����[�Z�6U��6�t8{�#d��(�jEq" �=EK��LE��B-0h��l���ֳs�(+�S��
�����]6	�>E6�D��s�@���{]7�>:�_~�<9�cB��s��5ar'�g�~|竡5%wdD��(+�;�/QI��!�`>c@�bAf�Er;)��#P�xP�k��4�pJ	���h��`�c�>z����FC�b��AA��%�S��֪���5vA��=���H�]�9�IG�}	���&�
��Ӊ�Z���L�%+[3lbppv��(�8�q��i���U�3>���['�6Ub^��U�LPcE��S�h8B�v��g����V۰��������$�k�#�3�rrsT��Ȯ�ϻXs�C]4$�,/����aR~
.1n���:�������vVp�~#�tm�¬�j�}�"%�����,9�ПJ�\wЪ���省U���a�Zu�B��Ƴ�����Y-��Y-��l	�(%-�P+P7ͅBu����,9s�:�n��\	�BZ7&����$I�D����F�z�}������2�n`PKw�\�j��z`LmSto��X3�4�A�p�"�i�Y-5{Z_��!�����]*��ǸXj:5�a̩��A���y�������
�2�ɴ���G��&�,�ިEߴe���S3���fSݎNƮ)
�1��ɸR�n�f��,O��M�����Ύ�ϻ�g��1h{t~t���_k��7ꀂ��
;C�j�+�V��_��Ѡ���4�.��Q��?�ovؿ�P
�?H0���x�F�b }i����)���99?�x|v|~yp�w~aͪ�J+�/�t�&ݘ̓�g�HΧ�f�(~�.u��߉��:����>��
�AGj6��S9���W0:�r����TU�UM1�?�t{E�|^��%5�t�0�%�B��;[�t�*_�1�Ȏ�Pg�r*`(�Q�%�ƜJ<�4Hg�.��ZZ-ɫN������\&T9�0��u�JZ�X�!�*P%?8��r׽~y�d��3�g�AC�>��uu
�}���
嗍12��^�JyD���& b��q�����ς+/"�ґY���D��&J<e�qJ�j}��{��!H2/�𠰮����#CJ��~(q2s2	`�[�7�����w�Y�>�2�&��p�1�y��UD!���熋���XJ.�����'HoW%,����a�����ʨ�ò��\�֑��' ��E��0sB��F^�A�e�3".���r'4��D/�<u�E�ʮ�j]Dj�'��"ׇ�FӍUY.J�0�H*�����3=�ۊ�V��FL��s��@��Z5Ow�_�H��z>��V�顤Zj4����5��ʾ3�Vc��9�@���즆7;[����@k����(ul��F\u�Ṑ,����J����sn�#�(*4$�5t�őVy[UO���>�Y#M��Ӕ\H��x
��&^8&kr�Ǟ��5y
�i� �P�[�Mf�>D��
:���"A��a.$�ap��'&��'�Ai��q��jM6.)��[��6��b��wO��:{�'���Ï�H���q�Of{����QE#8�A�Fåm��4���Z�c0��$�ҳQ�P�~�㛥Wu�蘒�<N�O��	�m�w}��_�#��L-�!���P��c/Xgs����`j2�\e�^:Sy{�3s�-�Za��c����e5�+>9��f�v?ݻ[����-��aJ�r�l]��yG9��d@7���#t?�� FF�-'q�I�[��K�6"��l��!%��+�qB��MEM�K��x�m�H���0C��}2p����s)�A��[öo�^���TN����8����SO

����k�~ȹ�܀�z$~��:�Mi���B��,�H�Ki,~�(�󥷗Xų�e�r"�B���#��o����1倪�!��@�z�'�ڑ�_�b��Y' c�[�VM[��jK��W_�iI� ~�Ҭ4d�9�sU�e�����_���m`۩���A�z�T����H*4z����Y\�t��X}����b��/W�B�k��q�8P1O\No�*�'�L�ܾ9e+@?���T|��6Ͱ6�s����ƥ��=�y��=P�u�.>]��!w���;-����˃���m�?��p�
�Q�6;L���J֕�k��.�S �l��7c�qx��Ndk[�jxv��p0�F����
�]��$C���ra�q�b�ar��v��b1橷��{bC�N��m!�K>��j�3d	4����b�_s}`ְ���o��,���Gו4�9}�=�|�@���-o��L����-O���9X�>�-q��������4��i�`.�؛{��ɩ�{��vv8�)����EŁW9+	��U���/LJ�.ޞ{/�,�Dy�i�����^�2���}b���[���J�*N�vgBǍ�)�VW2�h�'/ł��R�[ǿ|��x�G��Ŵf��F`�jwm8.���ew�^��(��Ҡt�D0Jr"?�'��a��&��n�fn�|�)y�!�*^�Md�K������&���O���EwYP��!�xǷ|1�C���;B�ב����R�Gʓf\mU��P1�QG��=	�^t��L^��U:]+��l��]o�x��[*���i:���%�ށ��ꁆ�.���3^��{͘���~��7���<��c���}8=yK�oa�K�FY2�TXi,���}h㬇�F�+��s�]���۾�*-�������iO�k�L��rq��Q��&�"��>�z!���g�����^�Z�6�k6��LѸ�n�O7�}�'�+�����$M���u���x���)���J�qo�[t5`ې�L[�i�f�
��$��'1vqy�G��5H�טrQ%���V��̸���*	5�b^қE�P���\�%� !B��h`;Y��F�JP+��t\m,h�簲[�%�'�9A��Wu�yo]����묹Y�WD�m��H��,��*mS��	x�������3�o�nc_�Q�9<KB�	f'c��{d �|k �[��Le��B�e�?-`}���9Xe2�We�c�E�=�V��1I����zB{J���A��}�.0ww�IY����"�v©����[<ۜ�-����������~��
#1{��p�;�$��n�����m�0r;DnAB��!o�%e��"�R6bq��B�!�Rի��Vh��$V2���AS����;�_�;�����kRI��W6���b��8�u=�;�;|���3z��Z
@؀8�/��|F	i��5���YqlV �|Q0/n�!�/���ʓ���傇(#'?�ϓ�lm3El_]������K	�<�(c�a	I��s
�!��|���Z������|c�^�����7����:c�es�3t��b�^�=���k��F��9�ף�!Z�{m�շj`?^R�m�<J5�˕8n�(^1���az����^�/�J�4�t�x0��㠶Em�:0�W]}k�ʜ�R�[W�}�藣��i?�U�kL�Xg�@����S:�ԓ��w�]
>��̟��Yj�2��3����<Z�?ͭ{冤�4��ޗ�t����u
W��!���I��3��J3�FG��!�O�Zv�#�bL˾�P被�а���Ar�Q�RKF�`�����
̌�����x�O��|n��x���ގi?�#��;�q��8��e�x4���R���\������h��?�]�)(���8.ዟ�{�g�k��hۼR���Ŀ�%QD�B���?ت���͛�P<��<8=�I-	��I_5�HN��h���Oy���x��V����@�z�G�24'VU$I��$��a����x�'�lY~�+��.cn��U��ha���io�b/[\z�4o�U$u����a���+�ߝ�0A�k��8|(��˗�B���b��]��2��Lt��O�(�\|��"���B�h.��:�S�.ϳ��;[�j�W|B�|����JźO3*��NO�~8�|Omhb�q���J��~���7�|�A����$�ʻ��Q1�����6'���͉�#���:���v�j��Ф�;���* *dj2Z�z
���{��D�}�����1�R)�T����`�9o{N_`_U��0.�� n֫�Y���ԃ��3K��7�O�3�b�����E���0�#0׌E�S�5t���	�|F�C
�QF9e���E^�yӡs֥&�ڏ�o~iq���nNG3���0k��W�%�7�_P����b&!V~>>u[DS�o(]���62�A0v�}�'3,{�a���UOkKz���06˞�G�XY�*$����4#'?S��9�{�w�c_��P���$�ޜ ��ᔉG$����T��uny��s��[Tf�2L�p���M�;����V�g��v�r��
����8���~�ٷ�]^~C&Q�ѹ�ウ�a���gM��G��PKe�mW:�kc�[%setuptools/_distutils/msvccompiler.py�\ms�8���_��/%j,�N2��s*�����;v천�=ۥ�D�bL�\������~�
�HPVv�w��݉L�F��t���(岌,�t�-�8�E�w��e����>��C�,^�	_p�\�Yʲ+眅Q�dUa6MB!z������D6+��X,Ä��egA��^o�})��)���9/�|ϒ>�����E6�S����p��y���l��X���M8*طl��fq��-;�U��"[�Ή��߂�ՠ׃�eE��JY�ق�"��B0U���9ԟ���K�w�IX�꽪�D�^�ē�WzG?�
W�h��[���x2�r�&�^��z�i��F�[����{ �}���>�)|�ѫf��b�����Ƌ,�wf�~{���w�:z�>�+]�(].�E]B�0��%�KЫ�ʫ�NC����)�KvL]�"�oU'펾|��4K���RhKBV�>��A-�{��%���)������ڢ����k����	�t��ޗ�Ha�0�EQM�~8�hFyU���R>�B�P�Rf3�]����gbYp���|U�܀��	j��Ζt��V��س2[ޠ������3{xe�?�~��H�ף�����hh�l�8�tqq��J�-xrv�d|�����ǣ�$OގFG�����%X���h�PH��P�!���8�^.��%0:h��q��],g͇9��5�TK���)Z��څl�c�J�;BW7Ң��=��0����SW�x��N���ݗl
Y\�Y'�L@,w՛� ̡/�WW����gp}b���:�F�-RrH�j '��$ai�eE���E	�&J�=�b

��?{4�.���#��]ʞ
Y��y=:da�� y���$�&])�������
[o��ucɱ�*	5���[`�,|p���"�
It�,�,�f%�_#.��a;^K$���;�Bv�`�!(vr:z�A̼�l���i\�Ǿ�����&��V��W�T]~�u�^E,������!�X��9�<�J���^��B�kO+$4�ʡ�획>\y��?�=�ܠ"DW��M��԰�3fW��u/���7��S������J�x�l/x>C6[��������(�jb����ןൗ�Ӧe�ݴFO�u�Jy�ձ������CV�y��WEd�@�R޴Ȳ�h�5!``��؟�/�^� �Z�n6(�;���s��!8�G�oO]4��� �W�l�j�c7�`��yR�e� �,�vd�^��|
H�"��`�%��	7k�5���2�0	�",9}� m6����5�� .вͲ%�0`������䋀��*[�;���`u���Q�~�F�
�a�E��¯//_1tC���)[����/<t�u7�WH5^λ�ԕU�Ǥ�K��6�H-
�g�v�yC��5|���5`7>w��MD3d{�
�d�=���?�v׮�0��d>+��I#�	��~9Q�P4����A<�A�?h�:<O�)��Z�]�İ1p�c�Z���o�*��l�i	�Q;�B�&��B����j6�^
[��Lr �	����d�XZm��@�
$)I��[@���'�u.�"앍���b�����
o�
a��ˢ��2o���~{UQ\��Z����Ҧ��"O�����"��J/�\Z��j��̀��ffv�?�zY����Kc!�b��	[̳%�	����?We-: ������K�a�=�$*�b�,�0�;��V�:����� �U
1�������Uݕ#{]���c!�<:!��U���p6象ܖ.���-�G��1q�b:�Y8��={��c���(���y=(�2)�<��䉇q�������^��
�R2��+�j�^s��^Jh#b*��1	���H1� ,�$�;�JB����Io|�oK^aWU#�h仢%L�)8QL,�{)9^��-���P�@�4dE�ES����a��WJl4(2R�[���}�vC�S��.E��d�
tW��^S���d�(mw�3��גOћ�
����?|óm��_��)|���}����^�8�vc���l�<��<��4�4��u6�6Q3V}�X�t�����[ezUHd$���׀U�|��S��eZ:�*q-(�
zX�q�_i%����d<�1T�;8��w���v�j���=Vs��R�� ��)����!�@�e\���ԗJ���"%�2�G���tY�0�c��g�XN�����8��sNJ�3��^��@��n���i|ⶠy�p.�;S+�(R_�O�h�L�1������S˟&�ŏ-���/o,���DЦ�K��`2�dK�vF�e���]߇�Da2?�L`r�,c1g���0��ز��úsR#�ӱ�a��i�F}���i��<��>>��E�RQ�Z�?.���G����*3�R(
���Yp\$�ц��!c�ǰ�)E�d̷�����v˧���F���;�$�%E�>e�o�O�F~��4����Q%�`<#G�(IZ40F	Bյ�w�g��4�A
��k<�N�L2���
YT���2ş@x
�]��&�l
U}U��"kD-�XM��,��*i�
ӄ[5�h�m[�-���f���`�/A�x���&I�v�_��[V�̷y�8K���C~/ܨ�*��`Ɏ�� d gs��f
�h���9`ouַ�0 ا
lt��|�n��TE��q�f����>���
��e�j��R39n��-���������K�����
O��WnA@5��\_�8"G�{�7Mp^z��,+!�%I
�x�3=^caRķ��?�ք7��EX��jK{��d�C�s���
���:Md�IG��)���y��֯ƨПh�(���?f^F�Bp��
�#��6%֑{&��z��p�
��]�������tcC S"
���X/��1�ª��CO�(I�F�2�:W�IW���R�C
G,aP�#�Ecᠱ0i,:ޮ#�hhz|~}���vA����ޒ�!W�)=�Uj��a��NWWQTmg��X���*��A���b��3�ܱ��$�cݡ�5��m�����oYܘ�
�a��!�]$P�ZA�gCX �^�A�w�,�n3Ļg/��C���K�緯}6�l���=�xx���o��'[G|��%4m�)������_����N�W�a��?�0�f+b͒�V�%$�\��P���G�G/ߞ�<��8Դ�:�;��̓���O��:���0�G�}���qe�@������� m�R���D�z0��|�SCJ�� 2�W��vk��Yu�uE�"��Q\@X�]*[����b}��o��,�1ǬA�;/�WC�$.QI,�k1�җ�� �1�9��Zc�GP�	L1������b�,��X8��2������j�	:202���
�����U<*�{N�W�oPl�,�%Q}u��4�X�� 6ؿ�Ձ�݆l�i%<�흻M��ܪ4��VV��÷�;�w���k�*�-D�[�(��PN/�A�j�V�r�IJB�rVJ�r�P�U���n*Q<�qB.��-�A�e$��R�{�����]Rj�Q�(���S�-��㟤Rrx\�ע?!�Jqvb�na�U)��x��m�|͜Ӡ�h2��W`ڕ������
Z˿�ڨ+-ԋ�r&��0L/�<�I�?����L�5���3MV�2Q/#�����7m0Z���s�q#R�BC+�C�C�1m|kYá�iw�I�T���ۚ3ݔtK��C���P-�����k��B!Kุhx"�h����i��=�X��*J�w#W#�j͏M)��O��RVl)KE��⻂�6�^JV�I��g�"I�.�L�t�>������,�m�ڒI�0I�I�J�J�X���+$&N�I`��>.�H��BR�@W.�ĥK^�oO�𶝀���zM�
����˩����>a��e�'��Q}~h\������[�f��v�QE38ːAпVA���#S>�����
e:~��f�]U�ZU�<h��AмMǧ�z|(ۦ�D���tK,8U�s@cc
T���O��3W��4��\M���Ы�W]�	��/�^�k�ɶ
W[gM���-�n�j��V�U��ә�:�K�,�a떣�B���F�ڸM0�A(;�[�&2pٱ^��K�vZ��D��s�C�\_��)%-�KZ���,,b�P�DLWI����U��m"���\��fa0.��0�ۥ;�=D�8���ڎ=
>�U���X��x�P���e_������
��b�#�Ա3DmG((37h���#1�db��.�ѻ)����[o�����e�r�b���#�?���`dK��H���D��Y���M��3��������[�1^s��%-@��Ӭ=�Y�s]�.d/�}�w��#�Clu�K>��U<���b�uE���Az�d,�)�&֏��\̏��*ԪYTA�,~��'��p���
@o����s���\�O��d��l���1�R��ּ4��p�
��o�6�E��}�����k۱SwD1�i�oo3@@�#���g�'�f���0}�۶�m�'o���G[�1���/�2ۉ`��f٦��iI�ᘉJ��M_�Ӳф�k��
	(�������ߋ%x�?U�?��X-&Y�,��ܐ���(�K�}T%_䮯��
�H�ź��z�á5b��8=��<�[�tw��!'�{ǭ=��
	�1�w���w�)���9�Fdž�Tw4څg]��ˬ��e�d@�V��^nj�xŧ�{L�l�3���h�tPӰ`�
��Fy������w'G��M�� q��ʑ:�d���O��A�[��t�0�?�_2+��4���	-7��[�m�,����3=�{��=�z~vq�Oɵբړ�`����zvm[vb�pG��-:B�T�WK'K��X'C��2?���OI�djo&\�x�C�}�a��Tء�\f��L�"\�ŴM+����̻3���'f
I�8^����`
JU�#`#��Y�m��z�\i�іYe�x�1��d��CI��fx ����
����u%|�(I����ձ��;ա�3�F���/�N�o�H͠�]��8�X��!�#5+�������w���Μz
�ڒU����n�K<�f�$��^�1l�_/�h)�%���)�ǹF?��_����0Ƨ�6����&ϖ�w�(B`c�̴�I"ܪ�N�&N��2���>H�em�	��%��Z�E��>��z����|(Rr���7>�Ϙ�2L�5\����h�#m*E��`{��;k�/�u�k,jDo���,T�T�j��ښt^�MS�w�P�09�!_��-��0���#&�������Y����9�	L�zz�m�#��^��Y���D�4emT��ަ�������&���w�YE�?��Q�Dv�#��/c�X	a�г,ǵ�8ByӚ+�������6}�Dz��ܰ$�'��	%�zA��Ku}���K44wtK��_F��S�4`��?'��)<<{v[���6}��D�Ȫ�\��t�0�J@��5�!jZs�Jn�V5�))�^<�>�׀�ˡ���P
��aj�4e�a'F{�R�T��jq���p"�dYr%:n*Ȣ��e�I.���P�-E�4�p����+�M��pX�$��4]�ngi+Zk���9�M�^o�#[4K����w�m5t�5�!��:Z�����o�ߨC?�?�P��K�܌�5�$}<�M���W}{�^�>���e��2_-S����N2�U�D;�߃�����!�>� I^`��,-�Z����ߚ?���"�a>��{�ךּ1ƭ�*��T�!�+co1͞7��d�-�On�w���������o|��/G������g����Ϯ����a-ngv�>���
&�2�&;����w��<��u�1g� -ŵ�'n
Or��,��oZ���K�}CWuŜ!}�]����n�G�����
G�f��-y�9��tf-�5o���Ɩ������֫lm���`�Εei��؝���ۧc4��5�i_8��0(2����Gq��#a|�d������]N�!�WƥN�9N�!ND!@P.�bi��[���V�e��S�+�C�ZU["@�Ԃ�
=�<�Zt��<�	R��I�/�p[�~��}#a�.����g��7R�`�F`�]P���l�K)�4�&R�7�0��1|C:X���.qey��LrVHh��K�e�Ȗ׹UZ�&ڲє���M���S�
%{�_We{�90�72˵��oxݗ~=��(v�&�V�W}��R�mg���>�ܸ^���Qu�,��[F��'YGE_"ܪ��q�����|sh�!&�pa�S�����ʍ�Y0O��PKe�mW��v��#setuptools/_distutils/py35compat.py���J1��y�&��<�
�W�g:c��NGЧ�73��5��&_�*E�d����ql��c�\.B�y^����$ȅQw6��a|4��Z���8����@0�}Z�%�h�T`T��͔V�O��1�E��~��r��"
U�t�9u�I�:z	O�ާ/�5���Rد)�3<�$&_
�e�g�`_,����1>>���r����x��k�����v'�Q�Ɍ�PKe�mW��{�#setuptools/_distutils/py38compat.pyu��
�@D���`���{�+J�����R�^��j�i�/�0-�L�#k>�������&B���#��f�RV��l�z왒�ZYxԮUZ�$��tUe������v��Gk ���
PKe�mW���s�
setuptools/_distutils/spawn.py�W�n�8}�W�:da���C�
v��m�t����%�f+�I���wfH]l����C�r�;��J�|�U��{�$w��T)�����Y
U����A@e��WR��
�U�s���W�6W�ke�*Ug����*��
�[h��Xр��.ҹErS;C�O*�˕|�E�ź���Ŗ-Z�|����I��ƠE#�l6Kմ�zp�5�7�!��$dcv���:������-m��-��k�8�\w����:��j�I����M��pW��u;i����J{X�N�W�w��F��:����;}�t�
e�%�9+L�,i��@���y(��{
���m)��n�FjNShur��t�>�z��\�H,�e'K6x}����M�DHS��n�����$(m`/��W�	���W����p�=,c�l�Q~���c�9`o;	s�
#��g9��l�I��1"=��{Uװ��9ɍC����=p����<f�1J�:�B>��8D+���H��ݜAȴ�0;�l��D]�ĸ�z��AUd���������w�*�gZ0�������*�"#���$?KSpY{.�rXw>0��>9�P%��s�,}��T_�YNNy�)2���+�L�=y���F(��[c�"](%���%,�b�,�{p�te�0,��
��JK6���3�n?�'dm&"��S�,�c��3�=P��x�[N�8�w���	�>F���&)�ܠ��B��F�n�K<,��3�T��x����^������շ��O_>����簑~Ո¸�ǶƿP�������m'�z<��2u�Ih{�h:�ieTf]��Y/�B����Yy&�2l��J��B��<�~$'�4>*���#�D3�}�����Y�
��;Y��p�fp	1��b�Iq�W���,�^�!��n��hPwr t���-��0DO[k�����L̯V��#�t:Z��F<�E�1lG����Nʣ"*�
8oI|h�>�g�l�tl}�[�N�b���-t?�����|�;}B��g�^�Q�Dok����M�Q�N��⻢$y�G����4I� m����&�xb�	�7\\��4���M��=�,�}P�"�zp��g���y��+!�.'�[`k�Cs�=���A��H���+��|��aE��XsBS�o<rG��O�o�����b
�Q5#x��b�-0<3^vi��-��[s�����]�G�SOo��%����Ť��q�LМ��!kҴ�ɞ�iL �4��.]����氧'*[ؾNqƚ�o����B��З�b>��T�p%�)�@��U�&�0m�.^���I|7J��N��e�V'Ż�0h�$�y|��%l�N�q�T9�7��kz<UM_O�OPKe�mW��>~T"setuptools/_distutils/sysconfig.py�<�s�6�����jd6I�w���\�i��Ğ8٦�z�0	I�)�%H;�L��{	~Hv�w37�Nc��70�N��6���Q��U.�7�*�<-�<[$˺�U�g"�y����VJ�BE�"�&݆��L�u����2I�U��X���Mҍ�V(RY!P!��Čp+���F\+Q��Lԭ�E��l9Y�*�^!��gr�fs�E��DW"_8�$.F����,�Q�#�Q'��L��*KT)����h��|Ҁ&�_ʤ�T&�7B��%��*/Jy���/e09YCc|G�?/b|�_2Zy����t:�L�u�����k��T�����dQ�k���K��x��$�熼'�z29��=�U
/�M�	CV�u�VI��NU���{�Z�\3�b���@��qu�Wz.t.~���Q�.�J!�װ�������0h��BV� ����Z$g��'���꣊B�ǣ��{�_K���0u�D8��(�U�@�I��*/7Hb�2���,�$Y��in�dZ��4�UH?���c�z��]�}�L���\����Ԫ��"*sQz	�SX�w?���I����]�Ӝ�09��&e�L����o�.�5M�m~9�j6Q�VF�RW��x�8@0d)�?n�lFpځ��KD2Ce��E�ATd���|r%VH�@���̖���X���;���Z�BkU*�u�Yʵ@lwL
Gt���:�Ҳ��<O��f�[U� �w�R	�R�����d�an�#h���z�:�O2]�4UvF$rw
���q�X�Re��W����?�Yæ��$VP):4��.#B?�1�����?�PU]L炿i�t:kW�f�2ы$m���<�z�&U��"�9]����L��L��/A���$�W��
��UU"��Ao�So.���3�V��ZVy<��7,"�l3E�:�"XZh��J#����L��
��H�t�e��p�{��ig�;�N������eQ�Hq��8�8p�m�Ew�b��v1"9:�iT��bq��2�f�ʥ&�Z�
Y$�Y���k�F��Q�I�5z7��ir�اU�
|� q�@����2Y^8z���cԂ	�	/�>oR����Э�
w��r��	��>F���0|r
v�7����dV6���G���T�@
��"Εμ
t�2`��AvPN�$Z�k������8� �Yܪ����T���K����d�ٕX�߉��X' 2V�8s���?�󅱣��V)h�V�B���0\f\Ap=�-@�{O�<��g�3/�����}�Ğ��(mї�<xv5L�G�4���ᓹ`_�N��v�84�lt~cddЖ��	��Bx��<Z	T��'�j!����-іL�!!0Y��[_z߂�7I��I��evɳ�LB4Mw�V���M�y*6̜�j�ΑH��uQ��v�%����ț�mh˜c&��iJ0�%p��ӱ� ��`���z,�Pt��N#p��xZȎ	��N>N;�ƺ�D��?�����qKѱ/�'�@�Ҽ�;ȸ�a�?Һ^�Ru�(\��Ѵ
s�Ճ�.+���++��F
�0.�>���(�C�v�ۼG�e��2�T�4�
��X��(�����S�ش�Ŷ���B��������u:t��f�1w<dZ�^@��<�~�t��[��	gx�KP���I�(,ƀ�ˢ�+>�����-Ʒ�񨉀ǎ���l=5l
�b;��zB�U]	���n�:GU��Ώ�	�Y���9E��d��0&���9!Al�G�B<,$~��Og�/#�X(UJ��[�]wwz
�:7Y~.M(�f
�G��q����M�u�������Y����{6��0VCH�o����=�)1"�-���$�wJ��ѳ�����r���I
';f��lc]5�a�M9zv�0A��\��k��&��A�rT�hg��K�{�E��6����nv],��F����q���
��|�NJG+��}��!���H/LĜ��^���z�Et���哫�����э\*
�>�j'����5�j��3��u�!�n�,�6a���5"�3w�-r�ud�%��Ne�s�WS��leaZu������(���Y>��v��y��2�"�j��A�1j��;b4}�o�B��e���V|�w
��_�I�+AX����w!�)}��u^�ds�v�f��"����(�n�y
VB]�#��gH7�Ȣ�X���Fζ��A�=)��>t��h+�s`y��و{mšAPk'�/a�)��꬯�h��R�_�%�t �&����~�g�c��/f��2��8ML����A��#�H���D�,3��w&Q��(4W���b�hV�����n30�6ۉ7"��	G`�Vy�"�#�*�%R�Rk
Uo�;5��52��&��f �jX��*]�;ɛ8���Σ�$�h�����o]8[z4Q�VU,��{!�h2�����L��ej6���L�kx�n������3'�r{r��k���ƃ��ҏ��_�;{}�����Ň��髓��l$�6�����ڸ/�u�;��ݷ�[Q�B���ޤ��G�\DAED�߈�s0j���W���)aY�@��oݕ�m\{��8j�>П���~��v[J�r���ۓ��Ջ���ϯN/޿?	���l�wl��~2uEl��"v��-��"@|Ё8:��ҹ�6Q��u�����Ȃ9�{�ı�8� ��4�֑�FY�(9a�{��t��b�g*<n]�*CL�t JQ�.�aQw��Oa�qՁђw cZӷ�|7ZE�Gz�0�>	� JM�ɴ����ɍ�M����j�>���7Q�՛�Dv3�|~܇�%�
:�xjLS�w�q�����
��@�욍,{,��	�AP�ag����q(Ve�Z2��h[��VQ7/ڸ?`��6E��.4��E�c�V^Švջ�q�㍿un޷�XK4���!Z�^��0��z�����h�Q��/={��
X���o���0|��f�LU���D��N������4M�¶>�c����1ͫ�v*|$+u��J�8h�vao�%p7�F3ݻBHz�E��n���q��-�ݛ ݞm���O��Ũ���J��L�;@_Gzh�>���y�ޕCy��x���Lݟ:��Y�:��P������^�1�?���{53;���6gt�)X��7)Av]qw�ǀ�>�f߽!h�o]hC��F�kּ�W5�/��X��αIS5��u��%����8��N��8@��
`��cF��N����慩u�`�*�65��aj�c,Y��sJc�!��e�Җ�
:���r�x]º�L?�8&,�7,����=~!�ˣ��]�?r�O��^=�	?�v�[f��Π��w��^�=z9��٣�V�����šXA	3�_~'%�>�*�kh|�<Y�f���G|����$sq������:Ϻ�V�P�$����;S��Wd	.��b���2� �v��D�-yG�G��7��p�'�-���Z���6?��
J	2t��|��H�I*1�=�T�z�*���P���͂Ihk�lQN�K�b�k��7��!���,��*y:�G����OO�}����������U�<��l���T���(Ȑ�6CT཰�6	�w��%���,�'D"�(0C�X�C�}�S���OT�!2/��B�é���RVJ�Hh���rR
�����W+zo�HR�{T���SZ��DN��fO���#�ᔀk�J�?"������X ���=�
f�M����{���l_S�g�^�)m��(J�4P��(O��ʝ�hC���ŌO��ɶH�C"\t-��_C����:�E�9A��*7 ���4GLT^W�c2��0�r�^��GL����	��&��n���r&���J</o4�ޭ�(.�u���`�B�EK�cB�e��e�ߤ�L���<�,����A�E��wz�5�׮Z'�*��ĎoZ��8֭�-�B�n�a�EЍy��L�z��k@�o`w3W��̶�����=�TVv����p���7�9��΀��gc49����Z�Q�рQ�b�����nK��C$�(,Xʚ�k�0#Sg4%�������d>��B�q��&&�Q^_]~p�\m��(��C?`���]�-P��4�����G��~��Nq0҂�� ��H��]U�9�mk���y�|pm�ܶ�5V��l�LGk�Ѿ�����
�G��,��qu��8Э�c���v^�*S������?'�;���n鳟{�5No0���֭
���"���E�e^�f�Xm�<x��p�h�*���F��]�
���Lr\�q��F�=R3�EI��CP��e
�-9�=�K�\u�V;�l���:��Jr�a��"�~�E�i��ɡ�I␧��;����6b���Z����_��u�i�矧h|�>�R��F�T��s^�\x8�!���eQ�fI�H����0
�nG:�A[�0PћӘ��J�'{u���12bͩg3�9��B3e�8��>Ţ.��Ҡ��sJ�sos�|�����^/(��=�M^�E:$�M1<����������C�˼
���H�r��$��$tR[_z�hޕ��6�`a�e�yJ��]N� x���ܢ9����
��}�VDp�1��D�i��0�����kL���3T%#�KRkxԮ�Pr��t37`:��<=��k��Y�D�&v,���^����j	�D�������[�|r
�N#�h'�����]_��][hm�m�}Щ9���b�ꑐ�4���iSR�!N������V|�����)��M&�60xH�Q9a�2�C+�L�l�M�V��J�:S���q��-S���=M}����ٛ��?�8zw�9z}��gx]$�O�:�~��Z�I�����74>t��p-�C��}�=t*Dwf�)�Le'1m1���]
C:67�A�f%�o�o< qi����xb��s:%0=�i�n�|���\�b#�=�>x���(�}��78�	�RI�cv��r�Z�كj�?X(��
�x��J�������N"�/����ޫ�_�\��r��٫?��y0��C(�>��z�F�.�����
VN7�}��J��N��z�����#g@�x����;[�ݐ��fK�l+`��'Wm�j;Ž�}�ד��go��7�rM�k`5��%܋S�4������mr̾���q�~��Y�7�j���8T��N��2�3橺sG܉��%�j`U��H9�X
J��W��W@; "%��+�f�L���:�e�M����0�-�1�J�=�Z�m��e�g���33���uK���,�5��kO��k{�
9��d_��i�� �'#��u��/�ٺ���i��^�g7��W� 7Y�Jvqʊkʅ7\�m;`v�t}|��*I�R�`�!ŀu��c�H>��E�pO����Tn�G�;���Q��`��!����h��>�:�ľ��A��)�o�a�E������8P���<5vμt�k0n0�0�E�/A�0Ow�s��5`��$M�
�=�ֵz��~�����u�k���q�� �
]������S�8�]�MzQ1 _΄�!�QY\0	r���!B%�u]Ks�v��9l;Ë6��F��Fj�wImgp�����U��At�ޯ6E�����8��]E���c٘��L�@6�bt��
�9�ݓ�ϖ[~���#߬H����c�ݗd/��"����y,���^�HF{��{5PP����K��c<��$�
t��TA<�Q��~�نo�At "O��rM���`@�/Z���p=熨�mY�6��\w�p(��~��!U��3�U��ߪm����₟�;��sץ=�ۂ�����������:Y�����h��|�[�7rHϜ�k/_�q��{���{h�C�1ҵ�fw̜˘������ft���l5REϳn�Y�Н�%.o���[��r��G
�uۯ��W����|���
����rν���A�R��E�Q'��a7�;��+���%(F�wO��ͳ\��,]{ �
���<>�3l���z��
��k����D;x��]�y#w���ֶP�d�?���W9cv���ͭ��;�0б�xc�*r����M�}��vr�HH\��\G�J;NȨ_L�yxke3׎�n�?pI��r�����ꡲky�>�ﱣ+�����������f�wn
_l���
PKe�mWQ8��Z�0"setuptools/_distutils/text_file.py�Zߏ۸~߿�q���nrE_�^q���k��
�D��ʢ*J�3���͐�HI�n���Z&��{�j6�5��~��榪�c�)#����x,�B��C��>��y٨z'S%-�� �9�F�u�五Eq^�F>`K*k%�N��Ϋ*/�"�ǣ*�����Ѷ���M��
Oe���:/�~$Nys[�>�tPf=��nn�c��F�3Q�777�p��F���IfuU��h�U��`�cF�<�9�#κeB��,��$ˆ��4��J���bX�:������!�V���e#�X�t�s�)4Q3b�r&rf���:�d-S�c��X�©�T(d���Z�����P&�l
�T'fg��u�g�l�Яt��	�d���t-�Z�}��4�T8v-ğ�L��!F	V�sO������p��rS]6�.
�-�Ư���d]��8��3h����b�JU�F	ZB�a�gϖ��U+v��p6y*�N��q��P�0h�,��~���Vb����Ƕh�
����u���e
�я�Nw�'�L�]~%��\5��x��}�.��KX�M�='�-
��W6�
�tq<'g,�Q���K�d�t��Z{�E��C#�����Җ��u���d�������k¦%��<�`�9����T��V,. �V(j8m �z�Ȅ�B�{�Y�Y����1�AOL�ƴU�7��i���S��+�=΀i�fp��|b�it���딺�'�*[�m�BDh�O�h9�$�^kDD��G�auS��j
�K�O��ٔ�ģ,Z���.!r���6��p`�w��s�v^�AT��K�U6S�j}�̄$����ْ�I�1I��䂐��m�5���J�%*�a����y�H��z:�e�������ן��cEP���{��^e�4oz2��Q43��V�c|p�B�Ǽ���#$�L�(��s�2�{����ٟ�qԱj��V���D]&g
iD	}���^��{���6�2��P���v�%'z�#�����]6�d����"�n)��`�>_'�F8�H�E����=��ÀT�nL�*%�R�+_*��+4�,KRa�^�m ���t�%O���D����p�q��0���Y�*m5�d5�#��@������o���NJ&�(c�L�E�ĺ_�R��g���xm�q��!��V�"��w��Q6п!�����)w����2�FB��&�X�U�teV�����t�)kF��0�v��?�ơA�wȗt�pEq��@�O���F]ATG�<52Q<�p�,G���P�r�Kl��d�<-[n�A5���J@��qV[H��h�MH��$�}!�S6�)�<c+�8�C#��z��|�BY[��'x�4ސ���C�>��8���^����z�F��rV�N�Гk�;�K�xseq=\|�r��n�5�Q(�k�mx��K{~�T+��Ѯ5��s���E�O�}�H��g��{|dݔ��Gi�mz�����G��a�Ǎ�†���!`��xP瓮���}�V��D�:���jd��
ʞ�b&cQ8����ps/�8�Q��l"s _ �C�>��e��UH�T�j[�#�z��M�x�d�x�)�	mz���I�5)��i���C@[��*:6SFq�-�#�5��z�n
[��"�r[ܪ��Q!*A��˖~�g��emP�O�"1š�*P"$�r
�_�Q �3���uAIcޭs����1�ͳ �,?�+���+���q���Q�+��+�Ww���s��En��Ǵ�k�����t-�i�]��Ɵ�}��Eh���n��J�n��?T�r�W�O* ��ҐKP ��k�?��U�!��P?�Ĕ!�,��e8Y��:f!��/}�e�lj6Φ���%RV�Ȃ�_S����[u�-5�i��R�o���[�#�T���Cs�~7�D����K�'��"�1�^Sv.@�冞[��^�'δ��#󡫨�v�pR��'��@y���=��R0LZD
q�v"N*��
�?D��Ƶ���*٫��<�h�K�t�&�߬�g�΍¦2��a�׀�ZV4�M-^��R��I9�2�xyn�0�3ȾM[j1Ȏ1�
�W��U���x�Y\�Sd�'��/	���m[��lk�^s�<�ól`�ߩ
��ۈ��Vѽ9;"����>qO�sx�m�䀞�s-���Ǽ�u�F�7*��MlwDm&��+�F���Q�g9��[kY��Cj��;�����
��A�O���r��M�9�|�hpgS�L��.��{��it�2��Q�
E`�^��	a�Wj���C�lj�l�֌�S�>j>s*z�m(��Y�=]�g�_�����y�bdծ0Fi6��д�_,�؊�G}l��A_���uk
�2����Ydipĕu�]�:y��H�<�4YhI����0�Tɼ%zH�cC;�ؾ��x�{��x�L#}��ʱ������#WG��1kKp�c�fa�q"�~�=��8����_����~8¡��SHs�Q���N�>�[��_��h��
�GS2�[$��-��EW�CC��a�e���9�^�U$�6��o�U�D�["���o�iNWX��a�E���\��.WT����m4�B��8�p%�~��P�V7$I���@1�+�3��b]�r9>��a�����"�\z����0!��cڃ�JJ�'�s"����T���~�����aEI(p�
:�̮;�"u}:C��v7$��>A�]!��*�]��n��P-�Ó�o|W�	*���-s��D�51y�N��T�r@�O�ڟ�<�V�4�s2�%�	"mi��s�� �5O
�͉k��Hp�&m�࢜v+;�ў1=��fB�c�W�&}lV2��/F��G��X����R��(���jrV����5P��ѵFh??9q���L�$�k
B�'R�ë;�]�G�Xoh;)�3 =���fw�q��sd��ŵ2�vz��*��Q��J����[�a�Q��wbA��H#�|ҿ-%�]p���[&�`BM:
�{����J�߭����dWt���ᑗ3���8�X?'{{��<�c.�
��,��?���+[W�kng(�s�+7��_d�$����)�}��G|���#[�>�7b��B�r6�²w{����[�з�~����|Id����*%�}�Ni�"��W�p�d!�(������e����{a�_PR�|�7rr��+\��R��2��g�X��+����d�م�]0�e;>�[Z�,d�8g?�
��U�Α(�s�@�,�:$n��BË�o�KH�#Ͽ&��^.4�Xp 9]��i4t8=��>����)��nn'� �%'mW���V\��Xy����a�P�q�y�D�6�B�V+��\N�{-���vm�AQ�Wb�Ԃ�z�����{[)��xv3�-�C^\1O��3���ǯ��i�em��{��W	��/����I�h!%R��Cid=Ԏִq{vA��w��һk�6�̖'�PY:�*�,�l�'��y;�e`\T����Yz�X��6B�}� ����O��ۿ�8 ��6��~����p��6.z��u��bs���+��^'2�Mz*�d��T�	/��J
��	�iG7�o-��w��2�V��t���U�Oԗy�Pz�c$�8�7�cq�
�D��=0���j�3h�y�fؾ_�':?r>��7��7b��������u��K{�n������`�o��%c4�G���G���dU�$ݻ�}�|<c�����n��>.�E��Ą�"0	T`Fč�d�����������\�5?�^��<�O\���HMt�m����x�H�Jz�G���ӕ�}搐���=!F�?�����ͶbE�PKe�mW1���8&setuptools/_distutils/unixccompiler.py�[�o�6�=�&�����p9�]���ڡi�Y��m��D�H����I���df`�-�>�����e2�ĉҕNRVyr�"�I*ʓ�+�k���`�`��ʎ�(�J�g�Z�w&7��;�َ�q*�	���c�D<��B�c*��E��]1���	c�XƣR*�
��l��[��y&n.�yZ�[Z��'~‰4!ɣ��S��ю�I)"-�D(�
%��^�iM��K>8%Ma̛s|
�[�kOh9���Q��,�J�$�匉��*��0�,��,t"s�s��Ӓ��R��1��N��2^��lZH��uz4�A�sX�<�/a�P��N&���I���L�6�#���e����ɦ����ٙ0+��&�v��X+��&�bZؙT����q�ѽ9ۊ|U��(e$�Z�)���t�EY�Ru`_��W �W8c��N���d]�����S�vm�a�r��e�./Y�r�䁑�����RU�?NNN��ϟ��]�o˥fQU�"�i-������e�8q�u�]�y��B�I�V����R)�*
�T܋2"s��Q�d(�b�G~w
��&M�>&:d�
�D1�W��x�A�戟%۝�(;AQ�_��U���3�ɯ�}��w��M�˂\W�7�yx�4��>7��	Č�9�>�L�#�8��p@��r�b|�0�[�G��\%3`?2 ��VI,@q�nTO�K��K�W���$��5�b����Q�8���@�#�8o-�E�D{l�[�������V1ٜiE\v���t���KG�!��\3W y��2YW�����~h��*��謊�AS>��
��TN^T��>\'�r$
R8���#S���8�������
���@0:�wPj'�46j��춮6\�� �1x�'�Α��/�:�<<991N��$����ʼno��xC����
��)\o��V�Y�ơ���%��]� nN�N��,
�k����\��?X0+nq��Qh䀼 �Y�PW�7����T���G��F���5�H���W�Vl'Ja��P@��G�¢L��a�4���k�e�raj�W�R�.I�&�\T��H��Ƒ�:?�0��$i�,�1v�m���t�Hs`�o�u삽����9�?
S����D���+%�'ύ��FW
j�;g�Yg%Ý��?&/i��[b#�s���3W��#o.�r�~rb���^����mS�$�cr���;�̠h�Q7�Fb�h��h!+��$n�h͕Sc���4��!�;���^=���S�
=g/!&� ���8����D��FV��z���FpR
�dN1"�_�s����A�5���
�@�xnY�����d��h���d�3	��}-����&��R��4+a�$�IA�;�7��x�޸������L9D2+��C��:�Qb�{��Ϛ
�G����J
n7�pH�I��㶧������$�9���"lY���J�^�>_ҭ�	�娙���
r;m`�1d���L���YC�&9�py�@�ae-
L}r�mg5N��e92��m�E��;��Ӈ7��>վqgg�!o�3���N�����M��AK�3���A���s�]��V"Ӟ�;}!N3J4;��O��6�'���	��Z�E�|-l��D�5i��qv�:b	Ş:�4�D�I�fg�|Ã"_N��Q�N)3Ę��E1�����P�{H��u󖩤tf�y'=�5�vӁ+7kK�!u�m��\�L��z�#�����J]G�T����
��H"Q����Lm��%O ��s�)̛56��nk�����_����("*��c���*/�q��{Ԓ΃��0��87�`I�b�����~�)�T�]���<I���yX7�Fk@�_n��qc��6q?*���F�f#sȸU}`��!^ڙ��ֱPM��|n��*��^���ꖟ1����,�w�(޻t�_:��UϚv��bpgHVh;WL��rس�x�$��٘^�W��+�M�=�ԃn���?UCt�a2h�HK�]%�������;��U���}���ٛ��wd��Ȑ�/��)����RG��2L���ы4M��aGWC��.)e 1w0r�)�@BF;�����T��2)Щ�;,ݛN�)ۨ�;"�r�����y*8&��b�_�ɐڷԃ?]��g=�K~�[��~�%q%PcEj�Tu|`*�!]��eQ�RlZ-X�M��1Kt��%��#*j�R��μo��2�P�쌂'�$w�X���K���J��LU��
D����{n�+-��>�#ͧ	�1á�5�-v=ݷq��~~pY;]�1�����[Mz�IǩimE��~'�%�ӆ�s6U���@ʔf�ِ����nM�fu�2,eb!�a�����Ik{O����>}����-��o���w:��֯��wR�h�����3D�%�2K��l�v�>���!���6�`"�A=�����N��+F�M����WW�>����aW`J��N4ś�۾�鹆Q�i�Eh�*gg�̷���p����X7f"�OJ�g�*�n2הК޹�f�J��u�/a�\2*��,UANߜ�o�p�#�|������ןC�ą}�T�	e#|[2�c*%f\���9�-�cJ��ݣh�A��' ���MmG��Jiqs~;#i��a�8�磣���e�oF,nr;�f�򷒛r��J�xrƷ9e/�|��P�%�
����D%�p���8�}u���cz�%��]�$��8��lP�:~[�χY��tf&�rz�~���''����ͤ������^�lϚ�-���"J��Għ������Y��
��Լx�iZ�|D
�1ӌm�<��Xau�E�����zC�6���aD)tU�l�x;A`�LSrJ�jEvY-�N�`��AkF�-���H��@����<�K�nΌf�C���)|z-\�����~�ͷ=���Ӻ�X.MQ�+�\�%��4rI�9,v���� �/c�y�~͓���~�-eU���|w�5���9~�V�%UW�ޕn6�ޭ7��LK3�^sk�A�����ɽ�'g�0 �c��x>�R��&E�S���{���2fm�#ȩih�`��;��+<��w�lO\ 8lu��J!��~9ga��uγƲ@j���I^|�g�_%nќ�ؕ=���`$�Ɲn���E$�9��hS�	z�Ѓx߁��)r���bGzl���~y��T�y]^�%5��@iD�a�M�_���N��:�u�1ϐX�IL��*7e6`�AP>s���`vہR7ǭ=�e��R��4��~�A�����l:����fG���_����N�п����N�W|?���M�Dsd�KF�K)t��������!Cy~>g��;�-�9�/Jd��Uy"
���t�
�[��i��C<z�,1j|���]Dړ�wF"��kwD�'��	���]���:#�.$jZqFNqC��)�ep���fқ�)���o�
ȿ�ѲMF��fz+���~8C� ґ_�si�M7(9��Ӌ��;7d�B��|�rb��P^��qC�&��)'���m�}����B�Fc��>i=X�mX�b��5ߪ��C_��T�C/�p޽����P(��j��Wo�#��Mh`�Su��ó��&��h�u_a��6~��0O^Oӽ�^�“1�5�}����S!zR�ΐ�^j^T�����}+��rl��~�/��Y,ب�R2�{o�Iyq	��?�S�2�[����UI�Y�m~�"(4�cz�9ɾ��E���ƱG���i�E����VӀN�"��x�j�fE�p�웖�T����6�|i������R��h�4۞~k�<�<�6"��#Xđw�֗B��BOCےg�����rksf�Ay�j�������p�+<_IB��[�v��(u�†��B�_M��iy�V@��nlj)ÍL��{nB���v]r�k�f�d1i��e������L�(�$�8M-I1�	d��4��Kq/RY@��K	�=�����{Q��f��y��y��a,��Q�?'��3ᆱ4̔�U}e�L_�帣�~x��uо�`�@��Q�i�X�_Գ�/�g3�$�ݏ�\��@����6�e�������M���l,(eI	����G6��S����sBmډ{�����͟��[��^и��E�g�h�d
�=�b��q��rL��5݉e0��	�Q�`2��K���T�3�Y3��8��D)H�y~q;&�Qy��3.�
����(�{ȰKL	�w�b[	�̟�!��Q%+��Ϊhf��J;1��`�.(�W�hӜ��ݫ��JT*}d,��2��>K���\yYw,1��)T�dU���#Q�""��Q�fO��cS+���n߱���Ԕ$:����A�F�H͜G�Kǡ��0Ĕ`h�ϝ��B���G:�)N�A`���%@��XS���PKe�mW��	u�Osetuptools/_distutils/util.py�<ks�F��+f���$���8�))��$��#��M�'kQ 0$��b�_����[}�H`������#���Tu�ff��ާ&�Y庨��gi�U�:���ȍ�LT�o�e�/T��*���~��i�Ҽ*�\�b/��*�c�2]oժH�L���y�j]��*��Tj���d錑���*a������b���,J#����CU�\���9�^�����F�2�h���7¾ˊ����ү��:ʹ�P��y�#K�*]�Q�0!�	�Ⱥ\�~��,Z����D��BW�0U�����?@폺��\EBC>�4�y��Sm��,ၲӧJ]/S���D��4϶
N��R��e3cb�:����i���R�UQ�
Q��W5��tV����uG,��qV'���ʣ�&p�ui`4}�w&*�eZ��u�Ue�:K��V�p9NF�h���Z�bI��}##~"A�dm؊^�<1
�c4^*���ןҼ���;]�:k�JQ.�:*�4����йFy5=��o������s��>GY�
��d��$}��$���Hߍ�cS�"���L�&�ΟռƯi��6i��"��Yb��h��=S�ٳ��;y��
>��"u��,<{6V�3��ٳ��U<r@���pX�4h
e��t��;�܀f�=bt�/J�y�O>\^���a3��
��Wm*�l��B����j�$�i��;��+��9��i�>8�&G8�
�V����o(�w Q�������.��g�,+y咇�s��4hn�v\ư���8[�y�\�x�s����u��W��_~|�!b@U�N�"?�/ؾ���8�P޺0齧
<�J-#UUp�>���l�P���oj��,�uE��j������bİ�����>�Q����g/�pȇ����!�u�J��?�������K���=O���.�
��@g:2�U�w���H]�Vc��^9�:��'��	N�W�g������Q	z
�YM�Qn-���Šyd��@j�7K�噑%T�e�i���`8��0Z>���|���#�3pݛ��(�)>�e�W`w��U����Y���"��e�5�������8�[1ר��>2o|��
�=2�G�S���'Icu���х�:�H����V}#�{玔���9�s�}��^�tAs`���'<��L_8�]w���a̛���Qġ�܅�>�@^����]0H���8�AQ¬(*���e�ip7(�QS<

p�"�7�d
إ�
�	$l�h
6�L;#���p��99~����gϾ>�NO�7Vߜ���~}rtz����~��^���݁c�	�M�&�oP'��{���o������%{x^ �Q��L�����Z�}t�&J]�o��]�F5n`�O�w
�6�G���3F �.��88��&�����7����몠�o>%��'>�5}u��ݻ��V4gI�xt�Y�
�e��t�^����"�8��>DW��]�k�"����n�ݪ2��qKe|tp�����?�`[L0?�>�E�
S��ꫯ�96��_�_}���ux}I�e���>����uh�{�nٹ�m���� 'jw�:w]�vĿ���E)�~}��z��M������������LX���hh0D��s��d�����EG������C��1X9�t6Y�Y�鉖�߿z}y�[��ۏW�'���G����7o?�t���o"-|>�0f(CZ#q�w�L��+M~�l;Uo
����ZW|��(�ȗ��򞼪 &�o�1��':��1���`=3�-@����[s�֊	U���٤|�0ÅfS�����6�*J)Κ��D�� P=��)��Į�b�S&�.3/��X`t���1�
�lo��f+�=��2��j�~���/��5
m�’Q�U����*�D�`C�t����D)�����p��2M�c�]V+0�	����z7W�N)�5��`"
�)���Q1���Г��I`��==6p��-�\7��(K��6r�N7�[F�� �w�뷹�
e���	�)f�O���K�ɂ
��(�:>���r8i�yh��(���IZW��&Yˆ�*���
QbvK���(Q��θ��P?�����Ƿo��AO�����'u��b(ق9M�0+��z��ԫjS�w���74ue���������}9��7�Gc�%����4ᇑ�/;��V�pe�c�������D�j����q`��ؠ7�D]�!�I�Z��_�|�S�7<���!ڨ�Q
��o�� �O�����/��ޱ�������5�������]����^�0�FIdE���XC#��`���h+�)��St+żp�T�FwnG-�����3(Ɣ]Dִi�D�?��+���)(BZ_��c���5=�E�(k��&I���r޺�SK֘3�[%t*P��s�6���Ic������t]�Xs�8�D['_c1ed�f��'�ǀ�3mi�ĨdH8�W9�
0��R��G�@�`�����������T!�hH$L�"F�0�pCi�<�a
�N�f�[��W%��h�nb�G��S�O���hT��ٟ��1���$��d������u����Y]iL��?9���m�40�����%��c+4O%�BZ�!<IܮN_���#1����K�����q��_E��i"`w֑ؓ�a0��,�zC���!��t�s|��T��U����	�!�7z-\'ҿ�)�=���:�7�4�ẍ�ȳ�����
�*�C�w���قO���v�6�X�$f��4�ۢ輹�zj�8�3�Cr���������R|�ב��9����v�ÇC�9�̜����II�%�Lp���]�������O��.��x,��3�ý����z@{*9߁{�KJ���Q�Qze�(�8�!8����u$��[��?귞��9����7>=(W�E
�NZ첸x� �3&m?Fc�^�d�<�/Xm6���V�uS�b�*�%؏��ߪ	-���\hk�\�)�����l�zR
�}DzR{�����%"���N�n.H�\?��F���Nq�LB�G"�$�{
QU��2���M�˙7�*z���I0NZo�4�|�O�����}����`�ֱ���ҧ�^8T�u19>z��ٹ
T,�� ۊ|ٴU�{t��Q�[Gƀ��BTE3��%�nAI�*DK��>����R��J��f�p�[��������(cv��k+qtI�k�:˞·lB�V#Y$�j�W�V�� o��q�U�LØ�N0��V���/�)H����7K�c�	�qh�.à���3��|�F�I&*�c�=`XG����7���t6E���ӧ%���iT/P����5)ơ9���4����,m�D���@V��� D��CƸٺ8�.��/r��Z�޺L*L(�U@��";�"�Ri���?�X�f �B4��KA;��μ}�]��Lc��(]��Xς��UpM�x5����~8�|s�x䏅�Jֆ���$j�R_rn�3fhZF���O�ete�:�@��l��B��A`|�����=;W��ơ�^���"�L�1��[�|�T��H��)�4�&HKI`�]�6#��r`�B380&�<ŒPRc�zQ����D-�?��ꉝ��>l��-�
��+����)�
�BC��K�|��4q1��<[�{�MX��;��(֣�e�z���	|�O�#�n�p���,�R$�s=��ߝ�<����i:z�Ki���Κ���?r�L0�f-�(�o��_Gq�"���P=8<wZ��RC�!X�Q��G�j�{b��z�i��sp	���TT370�Q<���0?_HJM�p{&���*4눪F��egBb�r�2:��F��(�6�۰�_;����t��D��rʺyN�V_�m��16� �����M�[ >ۺ����f�,E�bnPĽ�.ۥF[i�O�Ѵ*_D��N�4G٢(A�Wt��F�ee�ļ��Œ�H��аE{2۶T��U�s�8���/bZU��w��6p�A�Ʒ�m5�w��B��t��0���t:m<֎�ڊLWH�K.S"��<��u��#���8��Na!����Á�a�c��
��7�Bzq\����uK$��9�?��Y����NN�GQ氯}΁�u.܆%�w��?GA�b��r�0x��n�bOWd��B�F�o��Kr�ӡ5�-k�d�[w¡�f�V� -���F搭�ܓU�9���L��a3h?���
l���1}���荻����٩�ډLV�k��#�;�[ubː�K�>u=��vER�Z1yЊ�]��H�+z�%Q0�YnR�,b%��G�?B��q���-�v�r�1+�0�u�*�q���_*���(�q���c���0�O�4���
5Q'Ƿ�>D_���s�h�6;���7���!�R^)�Y.�<Wfq�d�>���#�e�mX���@Ĉr�J�O4����|QWd���6m0��f��C�ͻ�`�U/��C��EYSG�)���fm|��>6}.l�J�	� ���u%��Qƅ�|V�lؖ,㶨_R�	>4�S)Ml�D������H���E�e�z�i
�-�Qz5+���5�2��=�ok��NFc��S0R�l{`
�]��Q��#(\/�QI=F��4��)��]^fq399g
2�*�)��'A�C�d��v���D@G��||��)6�M�N�r�N��<f���ʪ�E�p��
w"�ݖ>�e]-9�A���b��R��ȶ0�;�܉�-��n��?���Bm>"��)pxbç>��������}����Hٿ�$�#��?�n��C��#�l��)��!��M�F;��q��n���v`+�p������g>#��—���l֨ig\oCN�xts'����j��I��
�xa���u`�Րǎ���`Ӳ(�:�X�#�,ӱeNiu�����t��Y�Г��!<Ė�0ĬB�y6�-E�e(R�<ݼ�)(��(C��e2�yr�Ƀ�=��X����E)��%�����s�������Џ0N�y��^�x�'�oX`
U�5�er�Yu@y�ї��	X=���F�}Pa��q���$�q�	�����b�h�6N��sJ�� �H�l��`�K�	��@5��eq<"���K2@X�XI:'��EB�X�	�}�Z`��_^��w�L��6����B|�d�{�d%B �U�^�L�I���
�9ƅ.Bvi������Y��&�����	�[���(������H�M������9t�6�`ػ�)7E�1M٥�0tG����'(L#�;g�Gm;�tR�C��I-�;��n|��H��FqO?��.�{0����n��TؑA҅7��Nf��_��q4j0��|��)�zƫ+w�r;�P�M�B�]EifF���{g͕F��oN��\s�M�7�FJ���f?��!�v|��,(s�I�}����G
���	�c0K9w"Rcj�+P����-h��r/(�1�J�7ܞq:�%im�Ydlq�'��=��
�u�h��{���o�t����~s��{,����prz�нcT��_n��sX�����6|��a��e~�䳓��1@�"�����-^E˝�1����{��I��!rX�g��'��X��d8ⶋ��%}�L.�f��_�&dބ;q�k�PwuU�t�p1S������Iz�|4ͲO�J�� �vFI�I�R>e�P�?Idݤ����*G�|��m%ʒ�ҎΛ8`�(uw�LLbBQ�$��������N@#�/T�t0�u�����w�1o�r�P��U)v�8�RZ�M�1*�
� M����b8�yqM�D=�����F'�'c���6�N��5'/��+�*����?+���s��7�gm��
��w�ۍBCB��,j�)y83$Q��<)֘ai7�m����Z �|v�B7a���c�A��`�>��a���\�|��ꅺ����[�ΤU����,�-m|��9������>�d�����<�aٰ��W�WY��i���:��Ktӈ�!�j��B��tk85m� �}J�PN��q��'�l��9�c���&V@����,��fV��#��	�y�~b��!쀈�
/��!�Q)�vN@���VHDioҶ*
�����0�T�g3Y�e�5Sg؍+�xK�wB���LvZU���仸�60��[ώ�;��rw�z5k�FEC%%Dn�/��@$VQ�e�εa��ۻ&|0V��hw*�N�*��v���dmӝ
�ŀu%t�)���1Ô���H=Q�-��E�/�N�&�&C�)
�ԅ%�	�$'v٬�ڗ������]3��ei�oЮ��G������-G�-޺��ty#	��_�N�?N�I�!k@��%�Q��k�(��ĝ�c�Q��y�y�/[��wqg!�M���KH�z7�s�.֝ ���X>��H�Z�\��;	 �H
�e�̮^C���DZ�����l
ɇ�o(&6ځ�5���~�۱�К�$�Ȋ9�fw܎Ì+{���v|z39=���G��Őt�b�(�I4JY�ǖ4�KA�����H`�N��Hx�/t�3�Ҽ�]�X�r���<[q��N�߉�
�����f�>C`C��K$*�z��偃�G>F֒s�i��߂�Kւ���EW�λ��s�C8^�wԔ��|+�p����ǝ8��<�3{�8�0��;4��M��y��:1!ĥ�&��d��j�Q�zJ�Hؙ|Tz����9D@Ah�٭���^��g���V,�Nkyk+�pg�N8�`��W��*��4�0�)�@iA�r��0��@���xD�X0c�@!Lw�'��
F:;v,�@mH�;��o
j���!T1w��%�Pj`���R�������I(
N�RG�.���s5�3��Ӝ�eOld�W}���'^1�1**��)�HJ�T����ʼndʫ�c�~���O�wd���Ч\���r���஽P��/7m'�^3/���PKe�mW�87�l�0 setuptools/_distutils/version.py�Zm��Ƒ���bµ��E�$WRN+�W�E��U.qŎSW��5��hA��KW~�=�= w#�*%�������~y�{./.Ub]UW6u_ߙ��<����%^���LV9u�����CTV6���N�yv�1�ѩm^�jo0��c�ǰ�Γ�~�%J��i��ֲ�5.�U��I����h4����lb��S��V�*MQ��Ah�9pj�gF&��F�{�#F��Sv��R?�Mi��q]� �Uu�+Wc�_��6�7ɵ����O�����<w�]\��B�j�)�I��i�ߓ�,h�[������B�Ό�@z���-��	h]����#d2���ꤥIԯ��2]O��X�	w:�ɀ��o(�u��O:��۲����D�eW6�:����L�<R�-��&!�������suQ��$3� �'�1�/�^��z����pS�^��>3�Q�B�����6q����ʚH��	��jg2S���0���Z��L=�$yp�p��ybD���eb�ZB*>�u��l�ki;�V{e���,�
E��҇�p6�M�d�#*�rc�x���k����
(a�nJf|AƓ��|q!�{K�f�����R��=�^�a��E��E0�P�&��l�^O�N�8�/b�o�p�3l7ֵ�C��2
ǵ��1�V�
�<��kY#�+!R�<�̬#G�t�Q��~H�V5l��3�v���P��8�x��o�߄�t�M��iH�k!������L������ӑ�RE�5�i��S�ͯ�3��Уm��^{�Y���z#�Ѧ'�6�JL�Ǽ�	�jo[��x�1�Q�����\|3`�|&��}Q|;`Ⳉ�[a�&���c`8Q�zvY�� �c��8��͌	��<�φˆi2��}^�<N��z�4�=�5&4�!���Us��
��x0��k#�z��I���̊"�k��T�1�nQ|����hЇ��
=�x�9��	`p�Eiis���Q�1�q��HN�����6:���w�ڟ�
�1g6�O�0�"|*����i�-xB˰0�z~��j��#q�)A�.�
}�=��m3$`�z���<�Q_hð��|�o��^gL<u���Ȏy�l��&���?�74���AWt���c ��n�{�8N	��UN��MW_�.�V��}k�]������n�;�A����sZ��D�Ni$�'y5w�L�\f`+1�\8�	T��3/Mj|F0�� ��7a�D���A}6�>5�X����f�dđ�86�w�72甿fS~�L��)9 �N	����9F�:��G+-�F��`0`CGz�ݑ~�D#~�yaZ�\�E���J�
�ebJF�L侱�|Si���(ӌc�!�il��m[g�z
��"z�=E�A��z�`Ή�����ms~�_E/�o�h>G�U��f���̓&�S>��`��U��h��E�"�<�Z�!Wq�B�Eэ/�ɟ�hwt`w����"���P�-K��b���R{�p���H�mj&�'?'Ϧ��H�äy�����ӛ����Yt? ���?��O?�U�/��77���%a�&ʆp>@A]!9�H�c7��;��!�����AB>�?TE�~?A���?��LlF
ZdF��9|^��|��c���vH}��r�V3�|�^���`��g2���7����৘�a�Ի3���vb1�3�4=R��d10��\�վ�I����b�d ��j� e{!�a�u��p��V�9!����h}�m�r�������i�~,����Ǥ��l��
'@���:���J�{2��N�R/����-��p�;�s)E�7}�2�YL����yӳiL?�y�կ�7�}b�m���?fc�1C��3�n1�8?�7z��7Oqlk��9U�`�����;F�
��
���Ze�ܵ�B_;�5E��A*�y�k��`�בF��W�#�rH�ʓi�nj���G>N��`��Ƶ$�-�ߛïz2!�����T��-�z<��O���{���#7��OP:uD�+�����@�ϐ���}�U<>��亿�))�(���&�,����A�I��:€��}�����a����K��� Y̒2�C^�}w���P�Ш��:��+2��E�~�Yz���'LsF�>��V�*��v��.GB�
�q�^�cTYYM�.�4A�jr%�G�-+ʚ
 �`�|W�bO����u5���.�����(��b��
��/��;�B�.�1T>�w��?�����㐸T�.�P�C6�(�2;n
$��0�Ϡ�rw�y�D����b��h*hS��I/[���5 ;g�	�OoRo��;��N!-��MM%'<
�.с����aQ��$xД����^g�W'I W�iݦ�B���s�"u	�ŁA���97t���QQÀ��P�m�Z} ,���^�i[���re'⣖��=2�;�~i˙;S�+�EE��;�S�נCr�
�]9Er��^׬�s��乃
C�5�L�:-�z<S㍩��|�0������b����Z�R��~�t�PF���V�(�t6qN�봳�\��gDCi�`ıv����6�VP]Rz��y����-�����5�V�L'�K�9�I[� ׎I'�P��j�3
�s�+5mw��d)�����	$��խ1G|R#�Zj(�["wĜ3/��+ynN������vkbp�*P{:. 5�ٷ`�z���(8����Ej��^�!�C�.��e���^D�Œ�C��ɹ�b��)�!b�8(7�!3o#/ۑ�,z�#�+��-8>�/
���d��K�E��ܿ�Vz�=��cՙ��w�ڟC v�	Z
�g���@��{���Ɍ���wyZ˭���PLĸ����%��b�5^������p�
8�;ש�e�s栩�-eF���!��LSh��j%85�PV�������Ȥ9W��D�x��Ь��Wb\�<K�NAb]l�]Q�}^�mM��Ad�wq��x�}��_��l�*#��
{�I��m��&
*�o�nj_�h��,P�;0���=����Wʉ*s��g
]�؈��(Q�K�363'ͽ����t���'����,G[R1br�+��f�$t��32�G�$��w�ޔ{]��.p(��2��}���3��HʑJgGaĥ%P��0��wM��_�+{SC�+v�X�>b�>9���c1�O6*����Vª��[��)��M�62�K17|c�\%pMⱑMl�c�b���,�ꯚ�ߌ��=0o���(��2�������ʪ�6����{*�+�F-�#��ܢ8*�4�r�1�[x����H��2Z^={6�����Q�Tn�����K(��z���ݸ!||䌕�}g����'4�j[^o����$��k���;eS9���dX~�m*��n/�DZ9�LHN~g���Ǝ�cw�P���<f��])�D��eNFkiZ8Ep�
�1wYX"�9��M		�E����	%������%ғ;�E�@T��.��>eJ�K�y�?����3
��g>�i�#5�{LҰ��1��͡<�w����o`T��Pni�1v�(�=�;!�*��k:~=N?���8�^���ܭ>�����ou��9�/J�Ė2������+廝b��g�%�M��͑i�Gf�Bf���?�E�ѠCĄH������M<���}�=#BP�o�M�7zٽ����~��h�
^=���y��e��u�߯�"]���_�/���/waW���ժk���RҳzpL޲�����/6KZY�0������'�i2eTB�~�r�I&#�p���g�Չ��OìA���)��
J�U�4�Nq�{�Մ�s�M�h2[5�^(�F����Z�@g�j�6SW����s4E��uɦ�ڻn�v���ERɨT��g�7X���K����ږ��G47%9���!S��BA����/���l�Kq>�z.z�<i�t��:[~��=��<�e��"�V�v� �֭j8���v-a).~�u{x�I�ʠ�Z����f7��}ީg�}��Nq��<�C�z/�j�~�"OtӚ���
�7�\��G��e{Y�_Ӑ
W��~T8�׎z�d;�x�Im��b�p��1}yѯ��{��?PKe�mW2��
)setuptools/_distutils/versionpredicate.py�XKs�6��Wl�dD84Ʋ���R&�ig|h'Ӥ94v%��d6|��l+u�{w�OВ�C����o���~ˣm�a��P����T����s�¯j��F�<���Q*����y�7��"/-��y�bc�6N��g6/�B����h4*��F%q�^c��e��E�h������_������vz)�_�H��Hx��S�}|q!F�������;�
� ��>�������4^@��8Ґ����km�!M�Hb�u�26�^����~>�?���?���f���7�իz!��&��5Dh�(�k`�>a-��b���A�(��v������*ݵ�U���ߡ�ܬV+��3���9�*^W��`��,�H��2��b4�J�����K�[��M
�K֚]f��^���N+�Oh"�a�̷��Em^�T�0���_��'ɧ�@��z�޴�>����3�qh��oA�$�5�ܐ��#�!Ϝ�L��f$���Д�0�u��9S�x>��
�4T菋�.��j�?�ȓ���#��$�g�ɛ7o�du&Ƣ���Z�2S�^����j��]��
f�LyXo���Z	⠲��7:�N{Iz�?{v���0
|A��`94}٭�0���w���m���R�H�z����@}���S`�[����`�>.�Ӄ�(�u���j�%��^��*����A@l���L�L�ml��xƅ�4�f�t�K�,��d��8cۍ�N�M����jǃMì˲��b�X7��ɸ�S�Տ��~��I-��J�a��i5>.����T@�։��)ڈ�
C]�n��l��:�Z�*�${��0���	����3V��A�O��<}���{�$�A���!ʹ��y��pJ9�Y� ���K��-.���2n܊��RLdq*�3Y��糪$����{�%*��6%���P�q;�B�΀�͊f'�R�Sg��=~X�j��;\X���"LE���+
a��0�{�ذ
4&�E@5�DoTr@]0�l�naO�m���+U�d�q��jK/����)�y�'X(��T�N~J����ب%�@�e����.���:hb�L�r�z����}�9��$����;'֮iGr���	����ȞQI����Ч�K{D;��t8�N��Ǣ�N;������t���?4�%dJ��qIb۪(ܣKPȪ���˹܎CS���}��̞�մ��ҳp$�z��j���W1���_N�\B��%�4<_z��`�H�J%z�{�'�����z�Ku2
��#�@Ã�B�q��v���#з�E�:u�!���
l���^1�D{*��
7�Q�bV ڌdM>����8C��	�#n
u�9\�i�n�#
A�6Mwm�D��N�"�Sӆ�1�ֵVqT�'���U�n1�HO+��|�"nkk� v��6��
�é��|�f�ZUwF�D�;��hL�ep}:��^5݊�=9]���� ���h�gR�(�0g~�3�;Rw��*��l]��	&N:���Z����V���\@N2s	0�ϕ��mHʀ�U�k���Bl�9�Ke�V��<Z�N�C�����y@�+` ��I�r>��N�!?���	t<@��^l�|�P9h�ܨ`��5]|�A�ݥ����Eл�ܻ�f���p��s��qi�˖K!޾�A7�E�Ӂ6t�v��G����#�>v��cJ�r
�0�j���f�)���ͤ�H�SA��\���*�'܊8�)����PKe�mW;��*)setuptools/_distutils/command/__init__.pym��n� ��~��{ȥ�D�窇ު
�ac�`@쒟�/Il�!p�a{��X�,��V�yFo���G���֏`��h��<�=�s K9����-A���*V��
�7C��l^;�[w�⥉�,M����d�p�iG�+f}��sm���We"4��Um���A�J��*�h,�R��
�)���qR���t�S��H*��X���&b9�D��&�>$�gɅe��Ù��M>Wi����ꪏ U,��3M`|�^�l�-�X�
�.S8ZC��p`I�,v�{~�_PKe�mW��n1��&setuptools/_distutils/command/bdist.py�Xmo�6��_qPHZm��Gc��/��A;`�C�-Z�"�)�q���ݑ�^l)5��Cl���sϽRAd�Tu%
�l�~�d����lv�/��2P�8��rZ�y�6����u-�
��B2}\�HL�5�R2N� ��ľT�ef[���?\shVr�OE��J/���2���9�Ҳ`�V�l6��NR��*���B��BVP�P[`Ll]ph$!b:���[@��,��~�@�2�9��=����}�4]���?h��`�N��a�8��	+K.�(
���l��|�n9�;��\ݽYű�Yj^UǴ$��F�=;���1��~�;^�Q�����,�}�)�1\�z͞�q����@���\��݁�Y�S�9�x�by�f�_�s�p�����?T�z5�T
�����B���CM�k�B
΅d{wj9y�b Y�@�_�#�k�;��(8-&�D��.�%\�8��A~D�$JL�1�c��1phd�iax�Tʳx���ג�M��9	)�
��s5E�]K
mYM�2��\���+<� hnE)"���jG_)E��"�U�"y�ߞ�Bн��z��O$�";�Î�.TL��b:
6��X�l�<CE�U]ZT�$�$��N�Z��^+Up&���\#Eu�/�*�BZj��9wt@�k�R�������6ǿ��v�[�B�
_�!S U���S!kʿ�隊kʤC�Fc�є�T��pwG	%Ê�c&�
Q�pE��s0�h'b����ۏ��E�q��y�ׂ��s��
����{��_��!I�9�.d���#��/IS��3���TF<�K�'��@�PV$�$��o�;S!��fl5[�
��3L�e��X�9��'���%�Ńm�y�_��s�!D�
����Ə�a�pZ"x�t�C��ƀY���Fg���a{��X�6-[Y��&AN)|:N�XO�X��o/��8����B�3H��1�ii��i�`��mgC���٪�����7ueKmfE��sf����qs�5�z�����heԶ����L<��WT+��42����4J?�!��
C���p�Ǝ�v���n>_s�=�H�>���_�l��e��_i
���3f��{�Ә���5+�5��e&�ۭb{��h:}9p��Z�9���P7���hpl�oW�Ɛm�q'?��ѷ�/�G}G��kہi���US�{��k�m��<�vUj�Ƭ9Z�{앻�|G�EI�G����
�6I|�^�zŪ�}	W݆���4Q&)Y�K�TBFݮK
K��|��x�:6�
��KSk��7d��\�N��9)>#G��q"�z�Z���1�
&h��0L7o�?��;�럫�L�ޫ��&ڭt4AV���^��pFi���.S)8h���+C��Ɔ����R��vZ��+��+?������i��s؉�L�^�3́���N�}�!��z������U�W��go^����O��:�B>`�eyxeB����g޵*�Q
9ΐ4��k@���1�9��"�7����f��Z�y��F��(�+��ai�W3d���O��Ӂ$�ܙI;c�m ��/�<C��E]$�����41�ى��Dz}
��d��]��
��ާ�l�-`B�����va�9��L�96l"�X�D�=�%.�^��
�zx0�7�p�WM-
�<���ۭIZ�y]��|�\MCR:-~s^)�đ��PKe�mW�wq1+setuptools/_distutils/command/bdist_dumb.py�XK��6��W��l�Iv{ ��-����>;0��N�c[�$�L��/)[~�ik`&vHJ$���03ilceavGU���v�*͚���u�%Vր=#��!�"�,!>jA@Ȃ�,l��Z�PU�݂��n�cAT ��,?#X�����3��PûZc.�@����1m��]�A �Zi��V%�C���ֹ�
��*'�i]�+]�2�ӱ��R}��j�
`e��F2�涨���[~7��9�*���{VU���t�L�b�NAp,�10�w�&�Ateh�Z�.�{{l>:p>v����l�T9KC�Oq���r��6e���-��";(��x���(��6��ɱh�cr}�8b@��(�mY�n��eay �Ȋ�Y���3�e�,6��g������`�&���U/Y,�s1_u�S�Uf;0b+�N_�ǡ�xk?�m�_d������2��˪[���
6����XQ0��1Lp�MEu"�T�!|���*����]��W�(yuc	�JWL%r�S�E�[6���OU��~�H��T90�z���ۘ�l�p��3R9����;�ϖn/�AO���~�ja�8����W*��f5��N[Q�2x=c5�"�+�5o�w��hM�k*��^��j����կ��u�rۮ��ܶÃR�j��%6�Հ����nϴ��=�C�L�=R�\�kD�e-*���#�K+E!��w*6X���!?��\jڔ�7�rwK]2�I{o�"�=��I�a*��!�)mi~M�}��c�U����q��Frd>Ϗ4n��	�� ��nG��_<K���;�d7L�Y`�̎�y�I�*���<�O;4��i��q��)�-6>����ߎX[�/���\WiFs���	��5���"/�z�3�
 �{����0�E�J�?>��HFik�F`�I�X�
X�7���As���_�a���?�k>���1�S�T�Mu�ݕ��{\R�lGn�Q��<{4��No�)���<5͡���|��V��c_�I��űP~������=M�;Y�*;=7�(f�f�}2kC��Fy�~���/8~{��g�T�|?�\�v�N���]o̮%z�X_(mGj��u��?
�u��/�К��I��,�M���ggJBo{�H��ԎV����0)�ٴTYS��෾y䱧��ѵ�o�0���ò$�ZM�(�	��Yk|<�Ы�z�s�����3w���g��q�0k+�4�jn��Ր�dz�,@�k��W=�wy��}=�I���ؽȿ z2Ji�/���:��8��8w.Ԏ��,�i��0M��☂S_��(��qr�Ǧ��.�r �p�r��N�5R��ǿ#m���md���K��S���u�跜9� ӗ���6��C�PKe�mWo�Y��"��*setuptools/_distutils/command/bdist_msi.py�=iw�8���+0��X�5:l�I�{�����I���t�_��G��ıDjH��t�o��?�u �C������ĢH�P�U��[�$^<$�d���IS�:���=��$#qG����]�>��‘�R�,o���2
d"|eI8\fq"�'��sem�p=�b�i6��0J31��s?
�"�2�"CB+N�'��=9�/f*�4OC
�M����E�d"N�U�`.��M�'�$����Y�ʼn��	C+	�d�W�X"��dнbQhpG�p��Nd6X<d�8��$
�XE����~���2I�$�E_�o>Ň�6ބ����q2/��Ef�D�;�\��u�t4�s�%R����F�%2y�U�|&r���g�ϖ	�}��JK�A0���d4��T�}�'
�j>"�|�߂K݅��lރ���x�=)���~F�ŋ^DP2Y�d�"X��:-�)��(}�7�i���#:4k&�?�=@�a����N�fr��Q��G �b0q��F*g��O&)|}us�:�t��Gy�f�9��o	��]KL�0��Y����8LҬe�@��rf�m)��d)�+�pk�*䚦QH	|؞�]�?0φ�0���~�+*��~��<�
���
���	�%����[���s���B���?�HK�JxoIaއ��cIfa$�z����k��Q	 a��İ�觺M�67��|@2�b�w�\�ڞ՝2��3����p&?�F>|��?J~v��E�6� �-NF��=�#�E<���X��]#���.��.�߃?H��~����P�O����v�mE��D(�6��&`/���xM��,��]W���5
)��*:��Id�Z��q��Sk@
,x����"N���8$��E$n?1@.%����4���CyK#(�JV$�~&[S@����Rc��}`W������5��y�\�Ob�b�N��T����x��{*Zb�n>U�0�� [�U<<�k�Ȁ���_��~g���lğ��x�ֲ�"g̿����{�yȀN�+����//��G���|c|�<��"�iN"�ßD;J��W�>�X�w_!���6+��/2�]D4�?$W<JGIH���(�P��Q��8�p�\C�m��*�s�ɠ����L1C	��ءvw!X8�i��8�U�2�=��3\���!�c�j�Y
����.�
��Y��5��~��|����H&� p2g�«��P��s��6ї�#�F��)��kD�I,F}_�rĻ!s�'�a�%�$�HS��X䉯k����^��7�ٮ
��q2�X2�.�(�#���P�q�@���HT�W�*� �]����ZR��b����h/���5��vQ���?���
Ǣ�!�Z	{r����8-T�$";�\�,s�����ބ�]���
,6����IL@*�z�J�_(2��U��Q��l���#�����8��ձ�`��e�U��S0�1�Ii?Xa���8�ϖ�M�c	#�8�lv�/c��Cߏ�h��QF=hq=�aN��$4��:4h�
��'�q<�~d����T�*-�FE[U��;�]�{������>���G�\‿���!=������Z�[�sk����Z�[�sk}n��}�j���A�v~��=���.�r!�F3ς��L)�l�E�+��?
$H���4�PIp�B��:�x
:�9�^5�k!�?�i�T��W��Y �{�T��T�8H�;��Mʾ`�����S�*�(?E���B�"�,�m�W��].�
�.#�ԊiE�ceJ�+)���,E���
4��cB
}�d9��)ɾ#>�2=�ؿ���� ��R�N��
�1
:��$�x%ں�f;��)�O��~6m�=�F^	�ٱM�qb3��o4�^5�W�CS�
)ж�=�����y,��7��ˈ�$�A�LT�|@��V�����O��n؝�E�`�z��B���lI� Us�:˥�0��tq�4��`@ѕ�Asgw��j͠`a�eJC��!2�@�� �j�BQ�<�|>G��8h�zūl�����n��/�T�X��̏ͪW�~�\�dz�=��J~��
���PO��*�Z�z�
pU�??K��[
\�H��
~�,��"��IY�O<"`���t�H6��5�>xZ� �U=,��7�4
�{\x�MP�RA]kL�Q�b07���DZ~���
����A����Q�Y�R<�5L3Ɣ�9�{�'���©��S������o�;��8���#
G�	�-P���Q.�Um���#������1�ޖ8#���(�wh�[���v_�}'W�(����i��e�sZ0���;JS��b*L/E)X��x�0:�`����J4�I|�K(@ݴ]�wg���U;⟎�3��B�hܙ��0��,�iC0��*�)�郿�RrfTF��H痸M�i�j�E�쏔��*b�_�?MeRRsL���P���3����M��hVX��;�A{;�A#����q��y�uxhhӃ;����Nwy���BCM���u��2R�z�\Њ����M�_��A� �.t�2�8ݎdi���$�kl\����lX������SQ�C%�a��DުU3���6�8���u��F������1o�]��:�'�78Y��y5��O�l~��N��h���TlZ6�$�@�DT��X8��L
]EuM��n'��E�=�K>���xtSb��e��"��뇦��É�����N�໮�(ם� 0�_>�����oo�_��$����
{l}��Pf�=�A����&Z�%\Z5~��G3�ҟ�m"�3�!��rA���Ȟ�?�JΒ���E�)F$�YQ�^�\P�jܺo?�y0[��&Cp]���0���널���8v/i��.�;I�y*�o/�rl�.��Z�ժ�d�6�.��(kR�î�L`��[h�yyY�<K����D-�>�d��f[�DF��2[[���^����ʸ��&[Se������0�pTs�Q(AY�Z>��ᬬ��jV����f-�(�|��}�{`�lxǗoO�\\�\ðDś�p�f��Z@�._�_��9~��B���@�j�x�E�9�v��z���C��<V�2Py�F��19��*�z��w�a'�ì�F��|��FI�tV���)���s�;&��Ӫ���w�;�ՠ�9
����-����dq��|=ki����G�0��R�9�1g`b�`hn�|K�O�_4hb��[+��8��4�r���Sʛ�
�$hMM:i��__������1D#	����G�U%(�8y�թ�ѫIڃ��m�בծ���1��cYk��ਐ��Z%�	�O��ޑ�o�Xd([�f�s�\WS`)�ŠŠ��2���a���'�##g1O��c����h2{�u�M�XF�$r�:���OUg�v�nF� .Ϊ�	յ���-,�2̒ad��4�\ $R�<���|�iZ�Ya�R)�9��G�z�
��*\�(�Pԍ
輦���e�p��Y{/�R��C�`0�u�MC<[f�&��9��D1v�.7I��=�0�	ZMKD?Lb�w�~V��5�o䀞5��6�F	�j��?���b�i���	����J�tu�j���3_`����4���'��L"U �AL�|�#��z�q� �MǸ ӫ��,*��@5?�DQc[c5�T�X��hm��vMvw}]�<>Y]��^�l��/�� �F�T�O}�z���v�	SH��j��O�]+K�L��r1q�,�E�k��M-l�"�B���aIk�S��[W�E@x3�����-�V�n4�8��|I�]���-)7*��	#��u�����o����E��������?�\�������݅���V��i'Q�0J[��i�Z^ݸ�N*�(�����r��8�����p�A����Ǐ̂�����L";r���宕\5W��r��������ӏL!�u'��v�Q-I}��w�@��� =<
[u���7�-\u��ʲ:b�6���_(O�[W|s^�;�|��jۨ��TU�ʟ�W�V��ӽ(��%�nw�JaH�a�0:�+[�-�=,�s,_����5ܹ��~�gK�����aV�O���{��YiXu�5A�w)'�����aIbK�Z��k����Mx7�`��\[�`V+p=^,�$.�]�*�e��jܸ�FsLN�iϏI��"����ݯ{�½ ��J���_�S�2L��`s�]
3פ�V
��B�1�5��TCP��oW*Ӷ1i]��	ߌx���-���W��ڎ�;���8
•��(h/�w��Z
vQUn0z�8�	Tz����t\�Lg��+ֺ��]88�t�u>�F�j]��o.��.~6��x�޲1�\�ftl{Q-�U�ģ�A5:ޟY��ӣ�r���T�`�&��<��pJ/�)����e�;nJ�D�y0�q����Ы���^�R"�՟���
I<�\ݒ;���J#��^���3�7��	�b�[$z�@{�g�KY
4�-�Ը���S��$��C��v�%ˁھ��e�S�3m�[+dJ�3�B)��L&�8��FlwL3�x0�{<ǭ]Q(�sqd��mw���������@��^�Z�+'��wI��ƎF�cD�~������)�Ŧj�`��5��,h��Fs��6�U�3Z�D*���T�7R�,��W�lŖ{8-`���K�}�g�6J��޻�����/w�Z�M��b<̰��x�o��1n�[�I����?�+�-���%�R��<����"�WD���._U�7���.(g2彽V���݀�Io��!v���ʻs�����Y�Ԁ)e��Ajb��)[�Y�gXߝ��Q&L�ry�S��r6���j�X�@i�"���6�4gE?g�j�(Q�$�v�\�,5
��}Y0|�ij���YE0���C��T�u��Ρ���|�5Cυ�3t�DQ{ҥ��(9}.�_�j�wu�������p4�<.��W���,�B��-�ky�1ݯq�߫�S�JX����X֟�s��i߹SC$U��pk�ࡋ�al����;ǁ u��SE�U�/e�̭
h���k�v)	J�M�&h)�Q��&ޥ�nU�X�.���� R���Y|�
׿p*�@��T
�-��Mp�s
7
���9/�]h�c���	�h����`|�>��������:�SՂ��Y����;.�jVnA)�S0�c7g��)N�,�Dt���Rw)-��(��J�^5�Z�p�����tŸa�N�B���\:�����~l�V
�F���KѸ<�z��T���e\)a*�&!T��*a�0��
��i5@���kɀ���y�����aÈ�e���j�w�5uޝ��t�K)�2�F?	�)J`����?-�"}
�fK�_��:<2'���=��%��\{u�睅Q�N�i����j���*�0��2
$V'�$ݳ�:H�V���͉-�burO~>O鴥R>�e~�EW��T�u��\������V��:#����H��sm!~�E��/B���22.n���^�a�n����0NR��Lb�5qG�5���Ɵ���\*v�����!���[��Y8���E��ܷ2IO�mFG���cI�a��Q�Q�NE�,
,�ڲWQ�
((�֘�K�M��T��Oy�H��U�(%ȫ=J,�e(ttC�����>ʰ��BcrT~�@�u ߑpU#B��S�&'����j��ƣ�Į�(Mq�.
���^�����FR�*[V~kW��Ѯx2�4�<z�{�u@��M�%�/�/�ʪ�&����>kom��I�x��!�_��.uV���$-f�*.�Q�g�,uv�@�+�<�3��z�h�a�vt�Q
�
H��v\Q&���5��]�s�Ɖ��:>��h��n���Vkи�c��I����r��&���l�Qp��H�`�K�yWc7|ࡄ��8�ũ�q�/
xc��8�˃"�ZKYg �bU4*
f��ou�n�{������B��T����* 	�Z�	�mߋgé�!�|ʼn4�C��Ϊ��m�h�!���`��)��l}R=`�|w5pS��LJP����i���X`r�����)��y0O^>�#��X�7���u*-�ӭ-x�����&l�
���`�q��f�k��bd�FVI�1��vY�³����`�Y���:F������������~o�wx��(x��v8�W�d��]x�.(��^`�w��Z�`FPb̟�Voυ��L���٘Q�z�\���8��A�B��x���X{�!�R�@�{��U~5�f�A���?s`��YJ��y	0�:0�	Y
�l,~c�诳x�τ�K	��"��r;ƃ�kP�,������aև�֙���	��Yh��A�9z�����
��;���!^
܁M���׽�G�����X�
CANw����[�n��V�G� 7b�=2U=)�n�P��!bD�_��ȵ!�S���~ȉ�QL�0�E��d���}�5��aЩ{۪�j�2i�[�&�aw��g���B,�g�e2��t��f9p�T�r���pN��+ݝn�B�ӂ�n$z��<�
{�:��b=%�����\dJ�Y�M��.z�$P!A��zӖ�����xm4o_{���ɓ}�
�Z�e�Q̦I��LK�C���H���(��]
�s$�#�{�̆6���v����3(�mGN��.�v���F_���5	���hQ�M)Ŧ�!�aTކ-:go�:���\�m��B���ѳ��嚖ǿ���9A�P���NȦ�2[��N0+'��f����4�%���s�zQع=�[ө��0�KF����PmX���t� �Nq���3���>Kl{�9e���ZQ�CX#M�]%�$���e�`V�~ª�Fl�I�@���š�������[xk�2?��O���&��_��<\��:=�>}I������*.z"��V�%.Z����UQ�W�rZke�������k��4��<�&��U��B�
�1��ᆪ� ����"GI*�Vo�&9rg��x�$?���yV�J��E_����*J��z��\@��t%Iq��-:~$�x���)/GFz5?ʞZ�S�SM��i|���/��$P��v5���.���R^-�����< ]�!^-���Fd-7�.ek��%�3�8�Uɹ�bhE�حx�7��z���y��,	u�b�K+V�*۫�/�l0_"ԤE9.L~ٝD��^��0��Ek�����u�0�����T	�o��S�
��;�N��eD���y�a�[?��D����>��B:Y�t,I	��#�|�IB��PMc�������Zꬱ1�Fv&��F�$@�/tw<�؅2���<��^U��c�~ $�$�BQwx���i��Y�׫6����_~~��l!>�&��ʕ����~U��'��3�K�<;�' ��u�&�P�򵓔d�&]�����;�ga\J\$��$F�ˢ�Aܔb��N{��e���T����ηa�,����.�ВO�w�Nr���0�;�Y�9�1yD��8?���ӯR��FMj��hHX�k��XG�}Z��T^���P���W�p���^��d7�v��v0Z&�͍7Q���U
�
�4!����D�+*-`>��L����^�5̏�Ą���aE�%�:3��^��h���s�������nީ;�V^�[��댿l�w���ޑR]�"l#���)7]Dg�]�:pW�u�,7��"�0�$�\t��]���O�#���Yô��"A! �buB��	�"���T9�<x�A;hG뾲�hn��c��ʼ���*`�	�\�f���$��[��&��JK���Zb''�u���+�fP�_9ru���$[fg��^#��������\����חQN��vE^����8��^NJ4׭
��x?�mJ�\���7ͦ��:[5w�>7n���h׿��x�����	����]����e���������)E��<wg�
`���S���>��p�0�nM~V��R���-�{[���U�pu煟x���Oj�g�d���|�*2�+�+=��+��66���2P���*Uce�֫Y;��m�e�^6>	m���2RN�)L�K�r���0�����h�+�����x�"�y���j�${��L�v)
?]�d�G������K��W����:��q����.ΖrSN�~4Q/q��1�����ZxU_m
���C?Z���6�K��2%m=`:��6)f~�k�>�ޫ��=�7w������Oo,X�	�Sm[�?�����S��#]�u�*�ވJ���9�/��+i`d�hF����	;4�330L�cD1�0��L�D��q�<=������1��k;�ЂN�W9�.ѹ0�*�	ăU��lV�=����!���z��jȜSJhs�l�+9�57���7?�n�2��*�(�J�e���ۄgXz
��~%�E��=�e��\������vO�9������Au�V�Ƿ�ٺߩ�&�.�W�`��-��CT7v�𘍚����vR�^����|\�i�%
�>���$	)�3��!�ټ℞U�o�w#�W,l����|���y�B���G���e�@��2Rk�Լ�%?u(?tȴ��W�w�<�oPKe�mWd]�v!T*setuptools/_distutils/command/bdist_rpm.py�<ks�8��+�\�������eg6{��$�s�XIS$Çm%��~�
�@������L6��F���d2Y&U��IZ��|����|��²���)��X��쭂e^�19��qɣ����Y�7e�>^$YT��L0<Ϫ�|2�$�"/kV5���c^U3V��:X���鼕�I�7��
��f�`����7b��<į
�Lj�c��e^V
����l���ּ�]�ɳ�����|}p�QU�V�������gɫ�L
�{�&R�QF���8�M��0'�
|�����2��⯼;�3>k߲	>�%��ܱU^2"�dk�h��6�U��LC
�?1L�b����&E����p]LX�-y�&� �&�w�m��-8�
'��/	1
����}��[z:kW@�hj��L	*,Tf��ϑ�z�bA�y��,�B\")�z�$��Լ,J���MT.�8_r$�[��hr#�vB�.&��6�\tt����)��Iܔ%lw��\L&MZ�88�Ǭ�k���z�Q$
al`	M���
���〽,�%�x��Ȧ�y�d����JS�Zɛ�k�@��1�Mۖ�Q�������F �<Vz*��uS0a f��2Η��ֹC���a7@,���������Ik�&s�>�d�#���P_�h
V���M�$��M�#I�q@����zƢ4�Yo��E0gV�.V%�r
A�,OR�\�C9�4����J�Am���#9D�$Ys;5V'}�I�
��Ps����dy�������I�%~d��u�7��*�,y\���m��y�^��I�(�x��\Z֘�|���k�5�/����$J�F��΁�<[�����x����9�����_����W��Fv�F̐z7�m6��>j@�JF�U��0����޷�E7���������#���Y��y��p�NACPi���k-��_S�H�T���0--M�7Q�}Xͭ0�%��-)E�3q�5l~�t⨈I�Ը7$ �{;����m-�ڀ�ݏN�A�1X��~|bw+xv�ԛ��,��3f�����U��?ݏu��V��r��v����˜��­�oA��(�
��M�j�Pd��@��L�cRbl�.�f�31A�i,\q^5�q]�D"5X8,�XTR!�6��F�����p^��8ƫ��U�+�|[��$��ᇳOồ׿}�&.��@���#$�� �(�`o!�e/�~�����%���%�١O�m�=��z1�����%��M�_Uv`��@_�-;�T;ʊlte�X_�ص>
,�C	/�;;?>c�=جV��k?����ߟ��`N!���ӽ(��?�>9��L$����T����%d���*�ϧ���i��;�}���,ӛ��קw"q
��j����|���v�!Z�I`��-D�qR��ũ�!|�Ij��M�������;�h��e�ٙtY�$~���a���k<�#4�5hj�� ��s\C��b�5��-sǑ�1����$��5X�k�T��w�1�'���9rr���#}*?T%
"��(M�q%���jz�b�?eՐ
?�h��׀{�%
'�|)j�W��6y��(�4�Vd��~2E�/�����lJ����5���^���-H���K�ǡ�D\oۤ��r��χ�9����4�c dx����6CI��8 h=�0�=  ��"	����e���"h����q
�8��g�큛lFH&@��l�ː"�ޫ,��$�ֶG'�q�,�|;m�x�Y���
x��e)J�`��7�bhƵ���S����l�bGKBa
`J��O%�v��X:ƣ	��Lvy#��2gA�
��E|/���6�y5Ǻ�<�|���Ao����2�	���Us~�㦎)7�yZ9�e��]��������'����AWt�w*pn���l���iS��W�VKv l��^1�Z�[o��3H�al_2��� j��]�{�R��q��%�B�d�Մ*��j�;M���)�#i�QF�B�~9��^�'D��}]�����]N]`�)Ƙ�>�vC�s�$C~[���[�ӣ��q�:�f�5.*�+�]3,Rm���<�#�0t������8�l-+�@�]n�LG��c8��=��χ�/�^~_�x�
ު��ڟ�"2>��B���ԟ�R��Wq�7b��"L򌽑T�س��f45c8�R��`�.�d�}���ߏq�ŷy}[{Ӿy���2���/�Li[H���t����	O�̣+�
��dt�
�|�r�`՛2:��БQB�0�c�R/�����ƪ���3H=�Q���Y��X6Lwñ.=W42l_�&�?(T�W�އ�Xy@;X=n�l��{��xz/�[����Z�}'�mp}7�:��?���O�C`���yi�d5_�����"�8�O���U<��PI]EMY��a��}�D\�H'|
��	���`�T�[�PX��.@ٲu�:���m�J#�b�TRp�6ɸ��s�eD����]Z�i�l2���� �*���'����:z/{d��r�ʸ'3=w�v�VO��ZN���G���R\V��P�&�ν8�-�X�>��pӏ��W�|5�c��c�$p~���K�"?~�|��#�ȏg�o����k��.�����,/���J{fl9��g���E�H6/u�l[1�95Ah��z({O�,�ڜ���(g>2�1h��A����5��P[�=]��,��H0^sGYdL{��k��Z�h�-�C�狪,"z���e^��i�ߑ�v�v��|�F�W`�M�3[fF�n����C^!��-�*�N�ɢ�G$QJg���Eא!�Z��\_���/G��P|��K�Une�Dc�p����imx��HT����.G�s��#�k�a��f��d�9�*�$��t�p-��/�.-��֕��bV(�6ӆ;tW�W���a�l�
�$��pE�$� /!�� �� �cVA<�怸>�
�:5j���c78V�q@O(Q��vI��	L���ժ@�C��$[�s��=�XUR�=��
AZA��Lo�3�#�7IX��~C/j�Bu���>ԫX���:P.!0n��nA\)h������䧭��e�="	(����j��F��3m��Y|����-��f��	��Ov4v���zΛZ��b$H5t�,�y��\��ێ�
[,w$@	�4�f?���b �z�q�]�2��r��wd�Gp�]���W�����|Uc5
Fh��&sx�+�Af�QwЀ-叧����W��rۖX
f�WH����f�*]d��n
	~LG!h�tFfN��"B�V�'ʝ���ڻrS:�?�&UaGĤ����l��Oe㰤�{�l4��$��������_��fjnE��b�4�����e�C2�S��{ч��6G��e�1��J��"%D-[�hE�餫%h'$��qT�"Y��5;��X�ݲ�NuT7��w��-l$E0{}�1��X�.JRѩ'#�#Y�.yQJ���ꩶk�2C��7�/͒i��2.L�
�]{�O����Կ���%>�QxQ��l�Z��%	@,��ot!�f�3m�5ێ�v(/�e\GP33)�Q% g����8�����v_�25�>k������	�
�ɸ�2}߻����%r�[rdן�MȱDwY�vNwZ��Y��Q�0���խ[����s�E�J��gڨkFs4�LtTs{�#:
+��*c���7u#�|
��y���K"�����ˢ.�]�"|����KлM�:--�`5�TD��2KDZ���P��N���X�b��L���֤��/�(��z3/�P6��kp6�=��R�@-�`/V��}��5�OìhEm����\�ʼ��-����駗��>Z�86�PLL=x����!I��
���y|�ߌ��e��0��'���;Eq5ľc��ۋ��:�墩��bO~���{�:F���ӳ�V�#V@(�a��I��(,
��01�Ū��eX�H�o7��Gq�"�*�BL��ɭU��̛
�
>�0%�u./�^Z��l,���Vu<�7U
��eSTD��d|��<���==��oM�]
����^���b-�ĥL9�����:+�Jn�rWS<�����s���de& �,V���(}�j����uq���YW2���iRU
���9��J����V��o��F��ᥠ3 �j�h]�s�f����]Z�!�񎨺t�eB�@�
����FހVw�r�H�Z�+�uݲ5��;#�}��4W�a5=��	_�C�1��"0]�qWǂ�����|p"q۸�!�8�W	�
r.�6���ݛ]� wM|�H��@�Gא�`+����VdBeΉ�i_}:�Ɂ��|�Î��p�&d$tL�ix`D��L���rƲ�Z;���{j���_f�n���
����y��ŷ�E�����wM8Ib��J{�T��o�j�
���W����y������@����P@���jwV�Y�%T}�c��iw�j���\0#�PX#����9mI��#��������G���x�4�<y�c���;S�C���}�\�B�i��A>���C �����45��R�4�y���ҟ��-Z�v�6���ת�~�h�G�tj�)�r���w	�.T�A���۫M��S�|����}��3,��tl�BG���δ��[m��P�j�h���	�����x@خ���k��>�c5�^&�:9pw��(�0��{vko�C-K��
��<[����Y
ErF��h0���!���tk���B�Ӫ]VG�t��yz�$������AW�p�s:s�B��\۸����!a����_��9`MQc�h_O�C�5]K�u�Wh��m!�eHmXa,.uL��kqY���̻j��g���Ct���$n�2��3�2���M���xv-�_M�˸�<!������sP
l��߂�W�:v:HZ��c�mRAh���G�#E�v���;v�&/Pu��8�{���B��u�D]l���"]|�~SHÅ����T�R�!H*(�����3���v;׬�L��������
��^��)<����̥ �-������'��im;�D��Y'��~Q<=�Fg�7�d���
Jec�k�{Kg�B�F��Ic���t�ƉC`et�⥒-���gU4���&Tq�7�$�v��!sj�7;P��6��۵��`��fj�ҌG}��gc����)�bCQ��{�2Hx)~�b&#zz�T�+zO��ꫣ�l#~\&~����~�UFb=�V�O��Ѵ):�A��=:v�hg�9�]�Qq{�KU�>}�ɜ�PF0j�t�+��*N���G5M�b��r��iI��B�gj]��_�}W,���Af��@�v�!T��x��=[cz(;m�I;@;�q^*�u��Syy�~	��A�f׸Փ�w�}�c���I�۷�ˌ߄�5	��B/� VOm��l�,G���%�x�x��b0�Ay3y�H1u��^���O�,\����1�m�ҔY]FI��6+e��[�
����N��BDajv �� z�j�?PKe�mWd-�E�>.setuptools/_distutils/command/bdist_wininst.py�[[s�6�~��@��"5#q<�dw}�:�Lf��js�L�ɩ�)DBc���=ʯ��@��v�V�,�F�/_wCQ�nڦ�t����E�Ư���.kݜ���*�u�Y��;7�����W,W�7�q�
y�>�U%ԙ�,V%����(����A��I�>�c��+ ��g%��gT	fǼ6���_7d+��P�f#�~8�(U�Ub/oE�(!�C�RRi7���1��zSn�e��N�٭P���`�X���Y^q�Y ���mquv��U����%v�"'嚁P���J�f�[��;��AdH�Z�L	
4>$�W ��x�~��X��+jr��6�D�H��kpJ�HL���Ӥ�cU�5�C<��;4�cY#�دE{��B���)+��5�f�$���j�؅^D�"Їd1�������e���Z��\��tL�G�+����%bOg�
��V���
6��jv�I*����SD^nʜ=e��<����VA@�|�reY�p��BQ波,$�e��X��x���uQ�埴�|�’%�B��հ�1�\\���Y�rh��WlݖU�����e��Zk=����� ���?	^0����:�;����w�zY6�1�fvm�KÞ�*����<����V=���)+Wq�=�@p�4�O��.�cB���YC�[���_�r�2��>K\sM���
3��L��s3t����Zl0D�p�+�z�l�����
܇�q#|̽�g�}^��O�|�2�ˮԎ\-`!4�5�!�#��0��p��\h
��n���۷q�G�,�c�~��5�A��PYVO-�gV5�k9ˡ����F��hxH��8?��ɝ8�.gEXU�5�q���yuǏ�Y�3b�dp�Z�J�ڇa����Snv�?�|s�����A��_��՗W!�a6Di�_皉:�d���㷼��t,�!zY[��
�u�p�i!���_��MmX��zM�%ZT�%{�>yrs��q4�Ji7�֍rX5�In�"c�\�����.�\�c~��}9w�,�C�$wBT,1o�|+��9�hN���e�t�N��'	�Z	��p:@2�����B��$|����
L=E}�P���e����Q�̅�C������L2q���(5��:#��|l�7�NlRlJdF�ݸ�̺+7�?G	���!A40X�H�
�]�����*�/�T��Fv�t�<9�)�
s5R�s�v��p0� ��^��$kJ�E!�1�9�j�
`�䏈�Xܑ��yk	 j�x�����V�1��u�P.ԤV���3��Ét1M"��PS�˽q&�Q����M[�1焐�-��:�)��i?!�3r�,ov����~h�+
�Zc�bd�W�UFEӔ��+8��0�ˢ��,�� jx�s�d1�����C�	����+?�Q���C2,Npk�6t��E��j�ވ}�#nj#`�VƲɡ(0gN����+�r�4"��I�P)�r�g��hro�K�<h���wx��۬_�:�M�L�ub�8��M�%�y���Z	~<���A��:&���t�n\�!���z���a��A;��`���%dnzN�U�ZqU��@��dY#�MZ\�(�9!0�LԚ08���~ͺu�w F�b-x*s���̉*�qĽ��p�p^l00�#cN΅%<$�Ͳ�����L�k�P_?_��J�.�v�f4*@^�}�#,���r��D �E-x�fq����$��t�kʎ�Wm!��r��Sk�S����zL0$�u'(�"�Ԗ��\�×mԀ ��,t$��W�@��2����1��X�DN�-�*���
0��I��C~�o�����d#T�"O���F��F6�㷢â@}@��"$b�%�I\�@j
G�u(�ltW�5s$d��R��C��av|�P����א_����v�i"PRY��
ɠ�p�#�"�(b�X!���W/>����@k��������,b��1�!]��F��^ц��{L(�!pýb�	��`��7=g�j,��mr�s'�}A�O�q�  Ձ\k��t.X>j��(�&�)�{�	�2�9���۫�s#�� �"�ُ;8~�6��&���
�^�W-:# ��*���0�+�#bޟ���[�3����l����Q����t>��E�z�S�m�:�8�C6,lG�A��4��z%L�S緲,\
	�AE_˶;M��,k�{=9�u�]G��=�_ �CO.��b��C��ן���a��t[�(D��p����7��������UҨ-�5�{r�����<}�v*V��(\7u��tc�YWj��#<uܴU�G�QN�xs��?��ٵ���D�tgks���'p=�Q�,�:���sa�e�@�'�SnWNy���i�_���s�q�O�y}��
\�P*�\��dpa��{��f}���N����b���3��-I�9�{�D4�Ϊ��̜�����Ƀ��I�h�w��Ab��gYx���Q4���z��ۇ)�9�Y4��>���N}��mܖ��B�ઉ��ٹ��/y�����{�	��+9����Q�qc��qWD��Gs� h?�r8A������A������97������6�t@����u�F���؋+�7�ܞ��0A�=�L�A��s�Dkг�#�y��oj�5���V�0�){^V���0�_��jλyCz*�����u�>��[��ڈ�$�d֧F#@��'�(F�����BV�UĺW�� ޲��,�Nܸ�b1.�Jx��-�5�&{g�*7`���i�W�,0[� ��i���o�,>���*��៪e�T‘v�����igY��7���a���T&;8�"�Gȥ�'(�!���N%T�˹�9�����D���B��&{��Z\^��D�-�͏�h�+_�������uL�e-9��.�\h�Pw�W'�9!{��H�`�%��E�����n����b�.�Z����\=<fz���^���_���$��͠���A�=
p��䛭o�?��*>�����m�Ѧ��f����o��t�$�����:Z0��f����G���b�u��<�:��O`S�W\��L�9&AP�n|��!�I:��d�cC��aL��ʀ���A	鵬o��㎞R��.sYP��u^�K(���v��i�,Q�&z
�~�O�!�DH?1�
���<�_A�-����!�����ѐٙ��T�}_o���Sdw KS�N��$����6l1b��3�U#����ap�z1
vK�W ������庚�n'�J�q�W�������4�e��7R�99��<˜��qu'��_+��|�t���,�;T�2��x���-;Vϊ찑�"$��|[�n�k�����/^���}��]��ET�*��*Oԇ��=�3���U�f�d��$fs��{3e@G|>`�;eX���"d�u�����}{��^�������B�%�j3>3Z�*G�C��'`�>�[S�C͡��⭥$��,��DzQ/{����y��݉.�<�n�U��^��w+��!�Y6�3�^j�9}3b	����S�Σ��(��l�7���g���XC�bK
*�)��T,,�k���ߦz">�Q�P��հ�4s}9$�@F�
އ�zh؉p�����Ҍ+�]Y��"��9q8�;��ǔ��A���kL����uvk�.F�7�'��댊Jo��p�[����y�5�v�A���ފ�+�;Q�}����LBBOPm���jɶRze�	`�h`t��َhay��.��e5��`�h6l.�a���X.�N�M-�*Ql�J���x��Ï���b?Y �
FQ��z�{�V�P�<I�طt��]TnP��v�Ya�
�%�	�P��i�L�5�3QBg��Vm��hq���Q���v]1ӑ드V�w�+T���~��v��l��}�\_��0w��P3c-�h��ư�bx�x�Y�gwJb�{�z����d����$u����s��/��;��ы�U4�W�bQ���2쵉j���iJK�?�җ����`��J/�����HJ�{~9&5f��W����s�+���[�ƙ�l�����ಀ:N��|{}�C��~E��/�7�޽�����ۛ�߽��p�sqh�[Nך��y���ܝʡzsahQ��ƒ�1/<r��
l�����kq6�\C�;qx-j�r�)��X	���3^R+�_�†��R���=�C"ȝ%cՔX=K�4^`�tr���S�|7eQ��sz$$�c����,Mݡot�{d��������hm�4B����3�D��!]�����{�u���%�S[KU�[O�?�`���,���u?�����ݸ[��N�e+��;��M;�Z��t���_��eA��L�Cr�#�4W������@��ͦ�<r�=�_\�u�/����^~��0bpB�ѭ�/�>�pvN�u��h
�a�K
�@�vI�<��A"��8�6I�+�C�ca�"G�!���M�WRci�?PKe�mW������&setuptools/_distutils/command/build.py�X�o�6�_qSH^-u�c��=�a[1�CQ�D;L%R �$�_�;~Ȣ,��PI��G���β��V���U�1�T�A��j�k׷����w>D9ȝ@Q>˲�Jt����l@��^��КCy���"\k�Mw���B�_hq�A�����m�2�W�[�V
߃�S�[<c/Z�M�~�|��(�r*s į[f8?��w�
7����2'��룽���7`i,k���
��rz?�������.ߠ��͸��k4H��*}t�?�b��>f��T?h�˄���<�s�)^tl)�`5k����
����{Q_�����
L6���
���֐��9LtD�F����n�뙂���]��l�8�kE�^�AG,%�|��	Dt3�:������S	`rf�謷pk��&�V���c����do٣�������3̯���>A�C�C��(��v3G6|7� �}�?Y.�+4,�P(�x�\�|�R�ld�3)>��9��|z-vm�Ф�q�D�{�ފ�c�w=�3��O�,۵>x|с{!�?�t�r�k���5hA��c�����N��39�����aA�F��2�q!�[,7`L�d�p�mflz~>�n!����ax�N�����ؕF�J5\a�]G��$���Q�I9�;���������l9ҽ�xj�4\��'2q6�C�
���Ey�|�(�I���W��YL�(1��"�k�biե���!\�!}}J���bM��1\L��"���8��ȢI)����53�9�'Љ'���lԣ�B�>!
%�� T�k%��0/��`	3K�j]���D�0X�
��l�]�,#�2�;�wX��M�h&_��3�铕�E� }���ت��C�O=Q��-9!�p2�l5��8�Y�eoVݚ�n�PE�
|�ci��K��%V���͗	�
�ƾb���#r6�zr�a�keI��+�Q2� sG�C�`�?i��S�EF�Fd42����=�9�j"J��Щf@�&=r�Vn��1���iR�}���:
��c�0)�	��y�Z��@��T��{�
h�ȣ��U?��O9��fOVW��L�O!����)�w~���x@��r\VÁ�r�)_f�9Qc�P��1PŬ�l���K�.�����n�l��?>�f�^/��	
�y������|j9�;�r>�1f��L[Q-�!7�	�,�1�=6��
q�v���N�|��2O�y�U�~��Qlz�
�f��6�T�>gƳ�{�D�g\E�V.D��yN�;����4<�1�	��h�&�Pz�����Z����%h�M;O��3ƹ��1O��7-��J�M�J����9��CI���`L2EK���ч"UO��}� k^$���Vϲ{�D��_x�H��i�?ռ��7M�n\x�h���E`�>�#�;́���i�Ӄ��z7�� �}ˇ?0I��+�Q�[�/�)O\�kv`0�"�La��P�G��*�����v�PS-;�y�Z���rI�&l�O�%��%^~�.�tM�w�!M�h�6�cNmN���@�h�3 �|Լ5����S��ٕ��S��hɩ#�΂��A��(�S�z;z�E�S��!�2i$)dً�N�4�t/bG<��=s_���.*R�zՙC�衝aǙ�W�A�;1oY���_PKe�mWv3;��V+setuptools/_distutils/command/build_clib.py�Ym����_��"�t�:A>n��m
P\��E�8J��J�JR븿�3�(Q���M��pk���y}fH%IR	c;+j�)U�pYm�N�ն�E�Z�k���0{��0��㬔�+��*�3��z��K�Ú����e�0!˺���/�QUW#!�(ZI�HLЬℿ�jAZ��$IV��
���� ls���5o�ڡT0-��[�۱�v���K�r�:�'�ӪA ��iO�Ie��t��r��4�>��v8*���Q��Ak��XnEw��R�5�N=�����N�`�.��߃��V��HRs�g�Y�K�8=Q�/���
�=��������_f�ޡ�@����@�"��I
;^Z��*�=/KՑxJ;�(��yK�u�/�dc���n�p!Q�J�@1e��ID���,�P+\A���,����*��6��hZ�-Sf�ǵ֏>�H�O��6a���9�Rɝ؇eg�j�`��ߢ!�lI�X��jU�tP�a�����\�0!,��rK�@�e͍acBf����[R�)1\ܳ��L�������'{PQΙă��*b�{H��S�-�|����0Ȑ_4PĜ�p�omU��x�����x-F�S.�<zq�m5FYi������~�ے�=07gO�-$u�I�)>.�`vz,�:HAI��$�L�%���J+@�hZ�Oa�K���ڴP���e�!��B��ɻ�P�.cO��{��������m�	�G*��1b���E=�d��,<��Q.)��5�O�f��9�Fu�#�
����0~�F"��A֓�d_b<8-�'��NDtH�#��/o[RsVhT_ ���$��"����P�z�x���`z�Y�߰�z��j���^G5�#�cLuW��L%t��6B
��X9��e(�=%�{@&w{㿾(DX���G_"�b���$�9D/`Gj���I�V	�B�I��������#���W���;r\�?��9
�Z���wحs6cp�g�8�/��.�㎽X�;ܯk"z�_�x`$���e#��/y����>s��r��Y�������s���o��|�tM$D����3%��[,%�L@�)ފzS,%��l�Dlu~��ika3e6-�mS"5܆7@�LT8�͔Ԟ2^(��"�K�)"�td��}q��䜎PK׊?�$
��2�?PH۳I�.V>��~�Ͱ�sݘ���]$�xR6�ɬ��m��6�k�W.u�q?��|X��\��lWD3y�BD�q�e��}��xq��Q�4i*gu_�3���~�u9��[�d9��d�'�}���j�gm^j�a��Y���E5H�2�|n�P1z	�s��a=$ʒ��\��j뱲FY���$���_�����B}��ڌ2���L���5�:d,�O���ܸ�+������u�7%�u��/������;~�dN^��5YP�ћ�~����
?ra�k���l��H�&t�Y�(�6�vÙ	��v�q���*dr\����M<'�������3^חd�ΐE�7��!�
���m�D�EQK]��">+��C�[�Aҳ���g�,�Ez8]�#Ӄ��"�cݜR<DD�
}�G�v�]�+�W-+�o�~�,hc�:N\2s�Lr	ct�
t����/�H�|�:��~��4LmU{���q���^�nR�j"K�0��EP	~r��Æ��x�G���$������:3/�^]3�ϯ�,(]�j�"�0��D^^w��|5p�khLTgk��T`��]
2�6(=�9��D8%�Bo�.Έ9��F��龣+x3g�Ϸh��5�Z��ç	�da,�б^_�e��]Հ2V�^�a���bt�.F��H\q�@�WU�Gp�
J���H���",�O ��T�g�I&cY�F°d�}�	�בB�~����D-%Txvy�X͢o璞K��6ga���`�E
�:�~�羽�?#���F���?��ߐ��d�$"e'�K�u�JE�L}�s/L�����,�F�b
ur�X�Z䞟��.\��_��7����3�a/��M���ɝ?�Ţ�����a�&����W�q��2��u���Y�mw?�J~���y��X���͋`��xK�����H���1�/���
���
I��f�.73���K�_���u�a����,�Da�}�tꙡ8Sz��uyO���x���%��9w���2�f}h��A@�����PKe�mW����#�{*setuptools/_distutils/command/build_ext.py�=ks��v�+6T]�1	?����SEVn4Ul��ܤu\^�XR�@�@Ѽ����Ǿ����;�j21	��={�{�p4�E��l�e��dU�.vE����ѣ�Ͷ�Yu��n�x�ۊ�i4��T��F��Zx%����G�:ߕ��r�4�<�����EW�۲����ޕ�Ȗ�γN��'O�&���$�F��m�t0~�A��X�'u�?5Rj�USo���F
���6�MS7�n�u����b�[,wmWo���9,`[��������Cw[W�{�J>���|`�l#�^�����Tɽl���m{���m/��-]�4�2�`_7A;ݤ��&�O��o�מ�ЛvZ������w��.=:��z�E+~�L�u7k�6k2$���J����/��
���;g-�[���0��]V�z2��Ij�h��g@!��*��#I3����/��������ɯi����O=z��R��l>�rrJPC��-4f�n�����2k[ax/QTcP�\�˦�v��31�v��)p��d���iYTwȂ�./����01���/�~����	a�\f���-�>�OZ��5M��]��
lR+��He��l�;�pXx-VY�<́ڠ�Xf�hw�;쳁M_�F
#h����u}G�Vv�m�=�$W�*'�ȶۦ�6����"IAk�M�i�u���^��.U턘	�-o�Е�9�2+�E�$��})d,�a�|^TE7�'
qI Bio3 Κ��Ki`�fWv�V��J�6���X�p6)0UK�	��H2�8St¨��ž��f`�±Z��w'�����^M�������
@/��;@h�4<w(�iӗ����ig#���+2�;,x��v�tV�S;��@���̐B3#k^̘4&�}Q�����]��i�S/~6�=�mq�n/Q�"^�8AF��PBH�=V�3��sĎ�d�X�ݭOm�5�)$<��\�n/a�HyE88v��i’$�"E$V*Ó��v<�Ǡq���[xIv-h"��g�=$�ʆLxq6��1��wbdD�JL厖P��h2�A��fK �@b����[A&	���a<��ۉ�����z��jd�{�l궝im�@�B�mQ��:FN��Sl{*��AW���I�XJ�A�͠XWh���.nw]u �*�"i�z�,%��(�����m�Kr�p0�R�Q�ղ��rZ�ҕ7G�Oz�B��ke�����,EH;�R��œ���_ *��6�����tW�S��q@�C H�A�J�.��4CH�jQ�@,���Yl��5Ș��I���@p6�
�Y���n�"��&DG��d�e�D5�XP�I�1�h��G��/vk���z)j�F�����2=>,x�<��`��b��E��!%���0I��]�نBh������e�:h���^w�8DyZ��$�y��f}�}t#5���E���Xϖ[Q�u]I
YI�~��#H(�\*-�B�b�B�66��ٚ����}X10H�B�%%?���eȻ�Q"��<'e�Ii�h�@��H41�?�:[�`Pe���\k��P��[��t+�퀚�WZ�&N��ĵ�hG��w��Q[���oe�R������g4�5;�8boQ���@_T���
���Y�lm`��h�(�`YG_�����bl��axL������\˳�t���o���o����DJ|1~��G\;0��9�^!�{�b@{�X��r�.�\k�܀d�Ε���1R2���䋺#1���X����v6�?��*4�pl7��d���Gw�2�z�/�u�؍G�ؕ�~��N=0��`�r]Yos�>�)O��;*c�v<?��l��;n���ZK	I�"�����>;�d�L��j�u�!)C�Jj�os���2J��ub5���NԔM�by�|��O�oD ��H��>|t�*��ڬZʤn����1�gi�e�X�s�n��Ip��e����#,��~m������_z�:` U.��-��O�+Bz��Z9w�fi���*�sN��*	@���]�oE7;
�hl�@L��ՠ��M$F�ۚ���:��^����i)��^�R��(}4<b�<���o��	��Bz��o�Ø�'b���DC�>G­�s���n<9���co{���2��ڤ+��c�Uݡc���X����(D�*�]r`��-K�5�6�
62��"�zW���1��u�9ٵ�|&�D��b�&�,#��6�f��C�������9��	S���j(��òH;�J)��Ӏ�Z�E�p��fuTM����H�+2-�TiS��K`z���7d�;/^PL����\������&�U7��G/�:�؁��s@0����3�}f X1T�$�g� ���{��_K���aQx� :�@r�p�f�E*��J�}v �PK�a�{]�S䑢�0�?M�]�u��C���g��r�s��S1"��cȲ�Њ�GW�
�Ȧk�5��	��æ=�A���Ѽ
첯�;mթ!�F��h�`���V=�M&�F�aS�5���#������CosM��
�ђ����O�@����)�� J��E'��KHiNP�
 �����v+����:��e�����)|���׶�{
���\�w��&�?����T��'T/O�|�/�5 ez�:p���d���N_~��\�h�nBc�~�w�<�_lM	pb�c�����B&��A��Qk�o���X{?�#9���e�&��NI<�@�%Ϛ�w!j��{��O�i9О���(���0>N�;)Y�����g����T�|��K�)K|�WI��I�7������/��~8{�
������w��ކz����c�D��a��P��|�Ȗ�*/(��؀���&�:�``�f�>q�{��`����6��t	C�2��LP_'$��
������"�-]A�@S�	5��:�e��e��/x47��
��W����\7��	�c���=@�*��mQ+]EO+Y0`���x�N�a(
��Vڬ�8h�PC���Ϥ=��4#����/.{`lL{��s�ޞ�rS���@OD����`L		�=��7q���/k��>n�?3ʤ�Q>O��l:�i�I`{S���Dmسct뢅�'�$&�d���15_`��>�.��>������5���9�$E��9�i)���SV��%���!6Y�:��o�O�m22�4Y�T�p:��������]��L?�J��%�qOWX}�R�`�r7%��%���f�*l��G�\��KR1�i�}RT�H>+�<"|lۆ�L��ۃ^��< �bQCXZ٬�g��Ĺ2k`y�T�=Ә�*:��x��C�ƺ��	�>��1U����0q��Qp:��y�D�<��笨�>��
A�7�u��&A�?�A�u+��8-+r�*4���{?S�ީ@�V��]l��I�`�#��x�L1��|�h�Κ*��%��`h��IΏ�07'��`申E�x�2}�h�TF?�r�}��7)*,ѝC�@F�}ù��cк���L3	�����8�F�Q���:�S�a.��󁘯����P�W�_���#�Q���i�w("�Z�DIڊ��͆aPL�"���T�ɝK��+����:�S
_ԭ��ˑ]s@bٕNt�l��݈���[֤�xE��?��%U Ԓ��nt��'%�|{�k:�!��Fsq��_A^x2���#�������
�&vP:�wi�zgIAT�"�-}u�SF�==jjsi�G��:��
2n*�VLF�>�I8�yS�o;����Ƀ��ƾ �*8��O�ѣ�4"M��R3��L!n�e��|/�^�}���.�br��|xp��0`�dc��ۯ�?��nM|����""!=w�6�Did�;Z�F�F�c;`��%q�99b���3��Ι	D|�����S3������)��|C�_Ln��Aas�w�*m52����I���~I�'K^��͖��P	b��1�cxs�G�c�ӱ��Ϫ���1E98�.+�2���[�M�	�ۦ�/0h�7��B���\�x��V(ru����.�5U��$s[���M�2��ݡ���իl����GQp�Mn}��4$�dCF�e�W���[�]#C��5�ǜ�&dE:����C����mE
�=N��
�e�yu�P"j}�M��S#���(#QM�֠>��p�YA���LV��a�(��Z����"@��v2|~"��W"�G͇������Mq���	��v�Ν��`,�S&?2�KY�	�%/>��?�;�Et%M��\܋���ro�����3Vl�Ƹ�m�*�+�u
�v��,��Y���J�d`�#g}~*]A��ЖS&��ZGw45K��m�o�ZƈPlG��5M�[ޚ��a��JX�:�\R �`�U@�d��_�rF����'|��S�W�m��Jؽ�o�H/����5���Y�CԋpP���i��<5�V��)@y��}�KC�2���~s�A;�؛�eւ���V�S�䬫gh�o��7'4ki.��#0�����x'1��^�"�j�i&�β�1�n��=!�S7��i4Ϛ���ܢ���x�8ĠG��ǎ�����Z��A� ���ۏe^�63�l�VoU�}z�J0��/k�N�`zd��,����W?3]$�/�]Pө�8+��>�Y�aJd8��T�N����g2��(��p��1k�����ű���ڠ|�O7�1����R�{��}��Vx3���f�t�<�ohD5�PQscg����ěϧ�EL��/��od�����79��,��L<^V�y��o�}��@9��[��#o��٤L��G�^B�
�T,Ή����;'Znץ���9���*�������q�ﮒ{s*@�{��%�4��l0��ٛ��3"Ni/;_�{lc;����bNĻ��CB�����kROr�{G�$uJ�g�\Qd���T�J�����\���N�+��뢅�|��$�]��#��\ϝQ�6
���lg\��ͧ�[�\�\��2[OI��Z��i]K}"��z##ʅ��S�狿c�Gu6i3���",����H�-ꐠTwKN�����hO�iO�5{���*�ן�@7[��s����5��L�~�V6�]݀���`��������b���7�`b
��v��3Ʉ��鴀�̻��;r'�,lU�$]�0�bn��m@f��uyI׈��9u�yE
#G�vz��T���p���vۆ�t�ڟ3�Os5�w��H�N��t���-6E�Ģ����U�x�1}�E�����/�6����Y���3�@Fu���r[,��^�r��ô���@)v~��bȦ�<��e�R�L�Lc���`&����C!�<����O�������	,���CJY9��Y��q?�T��#P�X�k����Z4rV?���(�������7<��(�F4e�S��(�f�_X�*T���D���4j;���o"{���RϢ]m�V�W0���1
�уm�2:�D�\�{�b�.<�`���5�ѐ�
h��K���P)^޵������K4*��,qz�{�Nl��%����b*��$��0]�IF�]�Q�9�MKv[��`��	��y���7��in��dd���1Y��WR8NJ55�Q)8���~����1�-�gõ��RH��.l
��z&z�:�
ν<�1b0i��e3+)�kR/�p̹j��sJQ��4���U�()����я 1��>2w�Y{�~~s�j�!Zn�jMû%*Ѣf]9 �Yթ|1l:c��������b[�-�ٲ	:;H)�Ef��“������|'du_4uE��}��� 1ŽX�ʬ)^_�`��zi�dꑟ��7E�C
��w\-oL7��]���.G�r���S/��[\�[U�S��Žۓ����[~�A@"8N?P�=A[���mr7[�w;)���u+�t1��^8�é�,�́���e��H��Խm�����a���n�?��0y^�;�����~n�Q�U8	�3{���.�v��g�
�hx�Fg�.��
�Sr�f:��G��EE��^
Vd�HL: X�]x [�sjبOH�0����@���&�}Ky�(�H]�F#���5Xh�ϭ��T�Gx��Cr,먲��\%�:P(���mA�M��KN�̧VT����ZO>���!���Jv��oe�Z�ğj�D�P����o��-� ��u��=巧9�^�u%1$8�o��w�6��@��c�����9�8:���j�|�末+g�q�>���a)`�Â���v�Lo����.�
��w�F?g��s�x���`J�puu	4�,_��٬�$Z�l��2��Z(�:����
�dlb��uIhj�74o��!`P�R�ֲ�|k�B$0ߋ'O����Ϙ�kmI'���4�w����b��ySo[w:Om���l&F7U�Dm�(�m�{Y�[�okk�o�/�s�h0F�z�H���.�[Sn:��|��PI�N1�=r�M�
�|�7��w�.PH`3^f���^Se���ɓ���,���cl56Qs���c~u'�45��?�1���S���{���J
�8G�#�w����c�R��$<SҸw�H���QZ�N�W�ݲ<��ֳz7���埈�|�d�1|�ˊ܂r�„�#35m�|�FU"���a�܏�/�F&���sw~��.�GK���ѕ����8aW��M�R?O�h�np�5�A@�G򏁢V=
y����]�˦�������v=,y��g���P3�'�<0�3ʲ9��@<�Rm���C?�"��c��E.���l_%f����Y=�47f�hT�BEAH��[��>u��)��7����
����MZ&�T��Hmu�xs����]�Fҽ!�3��tn>��*>��l�3qdaе�~'�蛀̙�����l_ذ���35R�m-�g˯&�t����J�7��k3�s�	�)�\'��Er�El�)����y�
P
��y>���WUxCv�<��W��c
�"�)#K�D���(ΓU,m�٦����8u��F~@���u�e8 }�
*������A�f��%�i�,�0UD#�x�\�A�p�*�)O�%^#�)�Pe�e
�(���Ʊ��
xF=1Lߋ(����H>���z"���H�����j�6V�C�	(�Ϧ�QS1��M��|����¹l�M�W�*�b�T?Ȧ��.`��h�n�o���~�H�.L���1Q�|��J�
HkאGO���
hЈ�UE�]�_���
gOq"Oͯ��ex\����)����c,T?X��
�讞~�2���]���k��ZΦG�O�Z�˫/o&*�Ŗ�K��6*l"�S/��)�ni`s�t{p(B���w��-Z�(݁��ڦ��엯4����n�݌�ӡ�!�������{�N"���<�^V�I�,��P��Ur��n�"�����w�O¸{�{��/�}nce.�N�`~�.�f4���7iGnr�_�����0KYgx�Ȁ{
���;'a_��/��|4$������1'�1Y��L尰N��/���~����_��#O���&j�d�I^h*v���&�ʲp�F�f�[�%]�%�8h��+��ӷt����s2�\���^�aL��nW�CFX����h,�tX�c�����)��2����1L��z�g�<��x�V����D,��a�����ˢ8AC����
3в����˛ٷ����m�m�ӧO���*&���i.�n��͞A��'���-�ݳ���Y�
����vYYRv���%��$4�z?�Q:x0��ꀟƓT��x6���x�r90t?�L�2"�����wJ����?��f�r4�d�J����^����������{=������3��+[��^���]�M
]�M�g��̱
��
�9y&MI"�J�\&��Ҽ,+�n��TVj�t�gL�9�Y��ݟ.���R�;�$�����Ji�{�{����2/�z��!M[d�e�c}צlz�a��@��aP��]3���J�#��)��<��)�=nɹ��n�]Uzt<��GL���#�5�����R$��J^z����W�Q���Hd���U��zF|V%S�3]��q�8ﻃ��&�2�{�y$�{���C�bT0���T)F�/�"^|;�=~�r"�^<��ZM�n��r�9(<v��d�xƼK'DzHn.���"^���:�l�5�~&��s䕕/O��������89��.�YK>u�d$Xu\��*ׯ�7o/�ߜ�j�mh����q�������|w~=5��|p
K+��@d���G�	����k.塎[�v�:�
E��|�*�#��Y�0��W�-)��dp��g/���7/'i�\\U$8gU�
�9��Xݼyw�ˌ�WF����q3j�cQ���"�q��q�l�LS�_�!7<к�ǻ��W��5}H�kL�6[쟉ﳲ���|}�X��s��U�!SZ�ê��ZoHL*��TL���?C�w�?�V�uaZ{�%�WC)���;��7����7��?�y�~~s}���7o�#2�3T�T|�*��/�����t+�j\d�_�z������j~}����1]r6|q긕�Շ�x~�ë˛���8-$L�U�Bd��G��~��˷�޼�uɐ��@h��{�a7��ʩ�����PKe�mW.�8o@)setuptools/_distutils/command/build_py.py�[m��������Aҝ�����"�Ksh�+�k`�0h����%E��������h�^��awm���>3��$�Vr�����=x�]mƪޮ���՛CW��hɆ�`_��,5cRff%IruU��X+��O]mV8�|+Ov��n7WWe���I/�T���}��z>���a�6�E?�;>�qfH���K���X�W�o���l�,����a�,�1��?&�����=<8�۱�eE$�V��{Qm�El��_�DL�;�2%�%��6]�t�;)N�"9|���h��j����?�������]Ns�k�K�M�����n�n+J>�ýO�r��+����%���%t��=Ӄ9�-߾fe�þ:%����!�|�I8�ƀv��k���o`�ҽ���D��jS������˪]��;f���?t2w��+=nڶ�qU��_�xOC���8�⊝�0;�Wcn%��j�x
r5dR�%X�a?j����>�iwZ��>��߉K��[>���>�ܨ��]���̟��1+��j���zl`xՈ���5��?z0��7}ȟ8}21�'ϯ���ob�8�᧯6#�c9Þ���>�e���P<1�KV֖LkA�?�/��WQ��)�g���D&��m��j4�U��}Z���T���$`��0�3]���q�Y~3�t��R���̒���nm�⦖�Lt�6���M��]%�X��n?0�WU���1g%o��ha(i�؂�Bé�ca?��Z������K3���Y�ʹi!yKZ�)D�9�9
���W�i>�|6R0H�]�?���O���C!`�ٿy=�/,�g44K�#��Jɼ���,�KF�`��z���>I�)�c����~@ݝH�lsb:����{�NL%��o�؛o�~�_��� F�}��0��@M�{�xQ�v���A�:*`P��R�A�Xs
g,����
�
v�e������)�Z�P/� �F�hK3��8���Xjp�C��ʪPc��F��cq�r/ �J���8�u0��*��w��$�E�RǾEqNB�AS�*уz��˶LP�]�;$,���ܠs���:�(o?ڑ\#>�B��!B���~�(P��Êj��APբq�-@����ޡU)��5Շ��D�j���Q�r���G��`K��#3%K�|1�D9�EC���Cnt�pHA�(Dl
Z�]�J������~Ԃ:'�cU׀���rp8�l%; >����3�w���R��C��ڂL���\�H3)2u(�G�SLW(V���Q��FI����q��&��ZWn�#r�l���v��	1B]�]l`���B���Xjɇ%_R๚%ԉ{?b:�R?��d���S̀,d�F7)�!�A�5��l���Af`f��kU��o�s'V�6�P��M4b���)�43����E��`�y
~��Ī�P�H��>̣���7!n1�܀����웶@��pَ������V�q��j̶�%�AOk�썶��EZ�BH������ev�*�액��]]
Y��<[���d,��x�1�S��l�t�M�4^e���%0Gz����됕��S#���9�LÇ��[��w����7��t���ơ�ٺ�k��lb��op�
�a��f�����DӵK�ۆ޴`3�<��^��Xw*��(�O5��u+�0�/��h�Y
���\`_�	�_�5M3(��^�)���#>B���C�0���]������`J�ԋ
m�B�--��_��B��5�ŬAF�<�J!:L�>P�#션�vX~���-��B�1)WbШ��FY-I��n�P��D\0a��U�de��ϬOͶ�I�x�9��<��7�\�B��^8V���Lu�u�yjF���yx��Ȫss'df6L���"���d��onv�vͅ���V�o��AJv�E��C�L,�"�i�Bl�3�?�?Cc� �)�4�:���@>�E	��h���~Sg���(�S�r��r�m$�yP,�
�\U�4)k�����w$�G�*�NN'P;7��#�`&(c)� a8 ��<���l����.NT�lj#�+@��k��[�����X��墲�����
�~�V���m�%̯�Q~��};�h}�>��&g�M!�b>����؛����)����N��pF
���00@ē�-�K�x�@�Z�����J
*�U�
��(`�{ލ��MB�/�.�,Z(�'lߌR���z�*Jjsb)�%e�*�x`kr��ھ�a/��ǮSl_��ղP�u-��V��g�@���E��� ���|��#��$�h��s�O��b��Ń	�!�t��־<t�	I�\vk���E3x
��J��7��:�R��6@N�&�g�lv��k'�$�#���=2�s�Y'��
��!O�Bf��	�E�Ȭ��ZQ��x�ah\��F*�5��B:�����,.B�����P�>�d��d�ɉ�2�e��j�^x���&I��%��t�_%�L1���U�WN����Q���Ʊ�O��k:"�؈��a�H(Hj
ID��J��	��l�Y/��:@՚`L��5��'d��ݭ��o��NV5+	e�
򄽺��eHн�ao�������u�uE���U�g��e�PdA�ȱs��qǡ�s�a`�\���	r�;y�~�M����c:���/�kG3� ]��z�OH�/$���t���^+��[�|��Do�`������Gt�=����*5���a'8��O+�]2�(/�CB�A�/a��Z]�p��o$UR�C5t��0�\��k_�@r]F�(gN�F>����{��D��
(έ�6\�����#�Y���o�?�*!�͸[w=�%������1��Ȭ�7�Ǿ�����_�c����i�@��@@+�e�
�߅�S`���i�	�>�*@���j�2+��^Q�N�|����|S������N�H�aS��5���)K�e�"�`�&kڐ�-@\ D8�U�fRã%c��L�N��|����f�\u�*��X ���J':�;�U_WQ�i�/��T�
�i��,��	�bdg����A��:G�BjAC4-u�����"��:�&��>mПyb�g�ţԡΨ�,3��8`{7�-�j�b�g�W�'��h+����X#t�r�xu��,��ZT�U����ԇV~���=�rO
�t#�dP�U�$�BޙP��>}�PѠ&����-��ACr�X���Q�%(�)ܐ��_jL@J#>\!�9�k���j{�s�Mw���8M"����K�ofm'VP�I7:��N�K����%��?~Ny�A�_�|
�5���:�
C?�/:��� �Ӷ�8“��h����W�g������g�bx+�\��ꮥ5W�&��i�?g��BlO���|Z�X3��,��6ʛ;����Z_Yy e^ѸV�J%�h	�hO���0���W�A��J���.eG�^�:�^�i*��h�e�#&s�;�u�1�Y2��Dg5�~Eb:�g���nI�9W�s�!�h��,�y*q��P6H�5R��)�K&��9��Nz�?v��([�\M�v���jx��<���xw03��yZ�
�}x{#{*
�oL�ywj"��X���A~�/�Mp\Y٪�9�
l�a@OY�\yg'�4Q+Q���4a�>܆��tI�U沉btv���`pWv.
w+Ht~�|٥�2s2��3yFlN#��hd��1W�GOo���!%�C_n�\]z���3X��dUp�k���
�l���aὑp����RÙ�#�v��aϿ@�d%cO�»&w�����g��'�ި�Y^�	O�k�����[�Ӷ���$���f����*��cPW-�w��|';��17�L5�R���M5ll���$WK�~�w�u�@��ϩaՅ��H�		�-�=d����J9��h�{��A�*ߵ��WP2{�ӡ�J�I��r�t�#’�\��d�[��ք�A�%$<c���u��<n��TK�$�;�2�f��X)�N�&��Nm@�z��TE%���W�@��X���m&�Ģ}E)ft��K�W
S�8s�h���������g�-��t���k��I�Y���/��f�%}�]5 ͭ�\���GR?��=�V�
�A�%/ħ��4,7�Ku[F�#�j��B	a�C�{R�knfu�3u��"��x96?�EQ�����ҵp����14'^�]��:�ku�r�&utvJ#\�%緔f�ա� �Ju�n�nQ�N����E����R�x����B�:�Z�[I �{�g�a"	h���7{=�6��GFB��/�<o�:~���GxS]�%�y��m�kz��&��/��MQz+@��]A���:�6���u;Ů�G�LO�^��c)V'�6�*�Q��`*CD��J�
��h�"��.��^����M�	�m�d��9WI�����'�
���pu���-M$U\��AX��p�h��U<F�,��p�%�7z;�	��»Ul۟����a޽8_�\������PKe�mW8�4,K.setuptools/_distutils/command/build_scripts.py�X[��4~��Iv�hyX�� ��h/h���rgj&�#�aZ.���8�6���&>���x��HcK+3�j��y�K�%+kYX3�]m�LlEn
��^6�����<o6��Bi˔Y0-f�V[f,��~������//��V�f��M��T��CD-���IQ��_C�����8�7���v3!O�������]�fsoD|�d�~�ۍʙ4,�Y&��U*���{�v�w �Bc��gnE�+�uK�
��`�2?��������Ip�n�m�$��?����Nj��/f3���j�޻����jzĪ�3p@�]Y���7�*���R���ڽ�T�_&R_��'�A(i[�����rg�x煋@�t,�7%^z��l_��\�e~�y���S��Y���ma�`b'���u&�8��B�2݃1����3�̭��~���u[i�V*<�+_K�ڶ)���<C<4��Y
�7p�Xg��W*���c{��ѝN��mUZ2X�ڊ��1����29b!i)+����N��:,�r+��#!�q�֙��B��S�w���Z�K�6j�_c�;�Ĩ���e
�p*u>�u�ңn���_��S*���"q�q(*��Ǜ:���ƢRɜ�}��H0i}ö\߃��[�����*s�s�c|ς^��r���.1(r��"���aW�����J*��I�U��I��'���oKk��ND��"EJ��ĥ�h[mu�%=tz�fQ�Amk`��=Ն`��]�2�}[	�]W#[��^ky�~�����bд��m8����2QE�*�(�h7�܈�oE�5
f"^"O��9�
��]�-r&�r=��^4hዣlF�E�^�w�Gl����Se��jI�
�ӘE��K1lξ���)H_GO&h5�D�\��J�e�L��K�+۪D����n0�m����1b
��T�dͫ����I�Й0����c���B�ݚ��ko����Q���JC��VP��� �	
Ɲ��<y��l�2�⿙��W��`�PiD�q���h@�>x6��`w�1e�t�0��3��y�!�0��eb[�}5o�^�
=v>v��C����$n�F�mн���V�w�<��B��z sPѝVe|2Ԣ��%p�:��2OU�5II�]Q�)���mn�h�S�Y�zTrF���n��ET5���d���`�:��F��3cnP�O�6��4�TW�qx�]�zy��;=Ս��C��`���7o�^����Ż�p��x��"5�:���g4�戺��hhxڇz:�� �ɽQ�y3\��L#n�@��M�-
���w?,�`%�<�@���J�WE��n�CaP�4�C�i�pw�Zu��7K)$fݳ�{�S���^O�=hi-��Z�3C��Ոt,O"��HW�	4g�hts��5�>.r���GN/���55̖D��qL�f���~�YYQ�N)���3�WH����a<pZ���i��ȃԈ!?gWie�z4U�Ĝ
�s̬��钘{���:��jP��n���
`���n��3P��_�iރ�X��1�nCn䫛f��|tk�7�f�݈R]�a�Z7���1\,G�����f��`�]��g�@wK���;G7�@����gȝ?��.ln
ĥ�������7?m�
w�@ewCӸ2ӣ����&}X
�u�]��}ʞ�ϱF�q����O�?�<<�H3T�{v�1�'�v���+�P��{ļQ�B}ꢑ�D��(ހ$�����Ç(����a����}s�}��Xs�7PKe�mW�m�&setuptools/_distutils/command/check.py��n�6��_A�(���`{
�E�a��H��F:��H�FRN�a��ÛDI��U(b�<���r�,�ҝ�ʊ���(�b��b�n+�AhE���G��$�/���b#��Ĵ$^�����MA@�F�ԓ�ݵ���b��rA�yAʦp�9�J�����9��:�@��5���Z&H�I��'{4�
�x(4�\�hJP{_TL)r�+4`#	/�2O	��\p�牂j�"��d+"-x^��ٲ�WZ�׿7V=��S�}��~�" ����aM�*8�xb��o�%�5E.+���#JF����(�&_�F�A��e?"�X�A�����~j�4Թ��K���yYlyUJ�����uJ匵-:;I�t2�H:""1~�p��M�iX�kG�;��oame����{>�Cp����M������n�׷��|+�����x�t�%�•"�P�N��Hq�yos�f4ies�'�E��ӣ�&6�J��i��cvH�_Y�`�p�f�R⫍w-���-�����V�f�%ӌ4{в���ą/UHnUB~ɲ�id�q^C��W���ZC捷�OB
C�S���� �f?B�þL0G1k�#J
ߴ����z���R5�d�P���;z$r(��-�gy�,�фmř�4=*��TX��1��nC�k��5�p�m�e΢d�0hz��i*`"6�Ȗ����L�0U����
���Q	@�c�Q�u�&;Vu��n�1�汙8�½CI��b|�d�c䘙��U�����ⷘ���a��Z^5]�ꢫ�A���\l����d{�㋞Ͻl�|�Jv�կ;�	E�	)g vL�Ch���a0tF�>P�m`� Ig�SO�i T\z.g�1�RJ�
������d\���(��h��N��c�%@	eF������S�Lx5�����	�A�F#
S:"�F����<SV'��y=��F�K�z)��q~�+1�Bg�y�
-��״'	u}��s,��PM�S]�5

7��:`m8T��!X�&����"��?Ĉ&|qd8���No��^�5�]J�0�7��\���"�~A3�����jQs���Yl��=�?�Kf���35�O����5�L	dZ��I�1����浓�t~D�LO�L�$�ZYJ����ܥ�*��̂-��2��eЫ�>.əZrF�"ٟ
�NGU"�9��v�|w�X���AZ���>@WdI^��4�xۦ�J��z
8G5�A![�zq�p;��4,D���Qo�Y**�n<D��#�~������)��2�Y��y
?�,���U$�'��a�5ۣ�357��h���)���cہ�Z��Vl�g��Z�y̯�w�QB�9M��h��י��y������<�h�L���8S)�z��V�yz$�<\䰩�n�X�L>vnR���1!�7�ĺ�l@	�̀��
&��碨�l�j�k���Q����w�&�D����.���tg��ssv0��sS�M��ʴ���n���n�E�j?φJ�ц�5j�S�E�w�JSs~��,~�f���O��b�<�n����~�v�a�g&7�	0�x>��Df;�>��"�A�6'���>������D=�[�����I=�[��S������E��f�C'��J8H�U侮�ZG�Ig�2�m�;��'���/!���m7��Q�qۓ7ڥ��SdR��ij��̎�(W�O���߃\m��A��+Wf*Ψ�����F��6c��PKe�mW,���V�
&setuptools/_distutils/command/clean.py�VM��0��W��Bi��,pA�]!>	Ѫr�Ikp��vXʯg�|9i��>%��73��iʅu��n
]UL�M!��$�\�+T΂�#|�q�@=>M�$��W�����g�	��D�PpV�ۂ��B�+�Qbm�
��0�����������I"�Z�&���.�n�Ck~��l�S3X�߸uq�R��Z�-:��$ZmaD�Vpi�@S�C���B����卐|'
�E�Ձ�ŏ�ѯE_���M����j؄��� �
N��ǒ5ҽ�lmF�l�.WG�R��V8!����*��;�vڌ�#��&1�*]�?p�B�{i0���n�Ȕ��!!s;c4S[�҅�
-�=�%e�6l�M[�A�6ݸ�q+P��ƺ���ú6���s�k�3��Wd\_��]_�%%����=jaQ�T�+���e��&D~j������>%'^��ֽH�!�R�ǣ�趍"8]C|@v}e���Ф���I�w�󡑞t��؁b(�'ф8�v[^��O�Ś
���726d�4j�����S'����y[K�n�QtO�5�2K=d��CIJ�R�%��M��~�ȕ�V���<�+s�
�9l��ѽ��PZ��ф�Q�7�E�=�pM�����
��P�@u�x�s�}N�6���^���/�QZ�`1�ǒ>k���q���b��l��گ8k��|��8o��gF�o��5F�D��{�_�{,~��������8=��q�#Tb�w�gt�
�	���3�*}������ 8�!f0�(�k6U��F�E	39��M�c���B�zюA�v��MW�a4=�
�|���m���?.�PKe�mW���7\=3'setuptools/_distutils/command/config.py�[m����_�(8���N�u�nl���4�z�va�m�VQZ��wfH�E���i���-��yyf83d�(�r�vm^�M*˒W���q�x_օ(E�*֞�v�b="ffF�8[�R�E�b���~x�҂+�hO�e�(V�*z�J�Lu�5
�L�"�y�J�u�`�[��aUY)����<��`���+�g9���O9����Y�ٌ,30(�рL�F�����F0^��%���*���S��Ջ3�SB8�y�C��䁩��&D�)�L`�
�8;J����@�]K�e��4�F���^ru��X�6�+T�dD�~f"J�lX�'1١� ڂ���D�8��6�(����eܪ���š�%�!�̐k-�x�h	�0�,(�{�w�j<^�J�6LI;��2�����S�����͏�}��۲_�4�lR�<J߾�?�_�-
竫ł�'*m�1T��5oH��./�H�B+�d���e7�?�x�s'�GY�ľc��lO�Ʊ��E�J|�'�d��}1"�Wi�eb��Bb�ا5�^���M.��o�;T<L��t&y%���k��jd*�
%OId���JW�S"���Є	�"�7�'RE@J<���x.`�!�"���9oOs�z��j�U5���hW2W��MO�lO	sKcڄ��몄m6�8���F���z�dפb�8�eGQ�����8mQ��^޶����
Q��.�,�SmO
��q�b�hO2�(�{DcS
�L����B ��h1�	<_�/l�<@��ۜ��-�(���sc�bK��LgO١�g8�\~�����y	Ѐ����R�sH��s���v�h�ң:�/O��ƪ�ؼ��q
]�Fdv;�N�^xd�䰫U@G)X-�
��%v�:Ĺ[g��G
�f��
jȍ�d�oG�����(`�p��L�rB0�6�g��?�(� ڥT���'%��b"���e�|=Ÿ{��Z���S�y\���wDs��z_�Ɛ�1=4A�g�s�M�!ςځ��Î�*��H��C��V�ٞcZ	����H`�z0U�˼�
�{H�'��*C�'���D���_��$�;�Œ�\�h?��PC��f����!��'؎�ֆ��'��*�����+K�,t�*1ϖ�::Iߋ�k�L2Z�>W�J�A�ٗ[i�"ڈ<䉃	���%u���v�%0�7/��ԗ6'��dX��o~$��Tl�^t�k(B8z.J^M�
l�hw��i��_���,`���c��g��/
�`K���wB܉h Tf}b�TA��&p �+&�;Z�ڈ�eC�p�S\�Ì�I��r���9Z1����Xr��T^/���Ⰱ�͹�[��>7&dx����*bo���to�x/QG��Û�׷�3�
̞��F�]SY�zvrY��y��xd,դ�0k�9S��X̆F��.܍��
&�U���%�z�
�Z������y�3*��|0�k

^�e����v-�:�|bz�Q�"^8�K�}���U�ޓv:iy����h�AoD�V�򭀅ճL�� ����RnIk����
�R�Fa�Ɍt��R�
�+�c\m�����P֝k,oP�	���Jl��M�j�>��K��7G�.@7[��	��� ����ΩĜIv�f����H\�-�k�-R�#N+9�~���N�Lȳ}u5	��x��ci�	��6ky�L� �Q#Jy.~�ި(a1�7���[:�qC�j^]�m��^�����nH�!u��5��u�o��?�;?V��6�ck��ء� �shl:���'�*�P/;v�U9�0��{	�Q���BR�DV�=���J-eC	�	5�_{�g(�[?XwHƻ!���2�s�JC
����
�d��N�A0��F	[�y�]�UȐ��m:a�!�}��0�i�@|a�v�A�8���ȀZ�d�TY,���*R}l��\1���bs{=C�Oyz¥R�`m�[��S�k=���t�0�*����]�yu0�K���[j�
1�
���"L�F��B��}�E��~̖�_T+��`�
8��s��۷ԉ_� �����犊0|:����!�O�,�c
f��6YB
:Xg�{����L�E�`���ë��+�FhD�'X�V1�^v`'(A�t��[c��n��u��RQ���Ap��^.x��n�Lb���ew/ؕM��9��ߣ2c�)�Oy�Ы����lS��s����,�s�xp�U�JF�s!P�&!�	����'1�CKނ-���F�x�}g�$�"��C��=�s����;�O����@�=VAS�C��t�K'�Н:�$m��&���X8t�>��K��@՗{Y��ֈ�P#{��F��0�6}����XHN;~�������=Wfcq4_\,�'�o�-z�4S |mu�
�l������#�,���=L���h��hW]"��<�A� M�x^� b�m�r)��]�CxjF̊�`���A��u ��E�ak���\]hJ�7�����~�;˫6��KTdd��Y���y^t�>��y��Dť�H�����p/�HG'���y@�
`V��\�%H�ye.
��Ж�@��xd��Pw�&�ԇx	J�dZ���y~3ľ����Q���&ݜ
�����S�����j��ë�;o�g��VV5?W���?{2s�qS�B�xZ�^�(s���!�tW'(���)��>-z���m:�����#��!W��,�"5,>�ZU��J���WV)�_�q&�b�U�vCo�֦ې�!���[L��`'�J�=uZ��!Q�ݼć�׈^��iB���+��)����BqAWz�Se�:���h��9�}NAa�p��.zF�<x��i��(�Z;�w����=��WA|VcT*i�Jt�h�ǀ�6Ӫ\B��UK:^���;j�َ�.ְ+����v�����YZ׈��HI��H�i���˄|R;Z�"צ�L��Ե�L����u��O�9�U'�5�B�a�ԛ�Q������ȧ՜�s|L���fo�A�+�����x�a^U�a�;��(j%s8l�c�1�(�\�Ã1�D-�P�K�/�̏,�`�Y� �ļ���5�������M��-=���u�|H�_��]��&a^�(i��� v�,<�Q,qG�ۛ�Gb�QTԻj��G�%�[�v6v/!�t�m��6n�<�����@|C`��3��0^�o؆���{�
� :ST��t��E�L���܉Á�A{=�c��(ݴ�t���	��q�����]�h����N*c�lq�^'��!�[k8n ��.(7t�i
�ƫ"�,�=׾�y��~�^�7F�[�N�p������"���|��Ճ-����ؿ�{��9��9�R�;Ȯ�	�޻q#TI��Z#c{a;���ї_��y_|鬵��_n7�#������� aҸQ)����4��Z!ěvҦ�&�y��7����.�׷�Q�>�Ͱ����t���xi!a�qc��ءHI��� �&(��L�f\��a�W�6i!v!�
PKe�mW�i�TE�k(setuptools/_distutils/command/install.py�=k��6���W��D&�l�>��䦮ۻqmb�b����)�"�c����ڜ�ۯ�� ��&qꮮN�JF"�ht7�
&���]ߕ�X��v��Ţ�E�U��ً��[^w�uΞ�l��̘�E��Y��5m��^�?qv�n�-3�0��jn�'�~���?��F�y����ꏀ��^�f�
����x޶Mk�2[��ʺu�n��cκ�����n۲�K��j�,��[�n�2ѯDG(�,�d�
_�M��[�)�N�ǫ]W6�܅�"U=��Ͽ_~���G�_�y~����K�]�7m���~|��٫_/_?������/g>�]��\�.��*��7��!��]v��,U#a'�����F���/����e�m�*��u������Ⱥl���G��<������n����ܵ|]~����6���ݾ�4���~	|@���-����&H�կE���T�"���٪\Wٍ�2L�UY�����>�
7
�=��S$� ������`�{(���w�#[?I@����c�ג���|k�
8q{��Y/x+���7`	�����/h��?�@�8wvmTɈ:�AO�$�ܦ>��}7:�uS4ݴ�Q�(�#��m*��	C��%���~��	��y�Єir�ހ#���jXV3�Heh���}�@Ȳz�j~˺��֬:�e�!��Hj*/R��|������w�܇�a٪y�S~��<Z���_�
o����ņG�t�|:)U�H����*B#+�.���Qp9Ѻd�%��6e}��1Y�eU����k�}$'#��
M0������
ov+xǐ9d������@���ѿ���lj>0� )��aQ�ZS��ϧ��?�`M]�5��CǴc7;���2�,wA�=��B�j��50
Z�zզ��^tD���E���&4�!рJ�����<��l}>G�w�z!��u�4e��&���ŽI��Q? ��‰���ل_�Wo�l
B��z��aW�y�U{Ý�D�h&�Q��*D��m���_�媧36͟��U75ay����"��?�-A�=���~��Mf
(*UxG4�>|���L�
�])�;V�T�ÐQO�,N��%�_�˛�T�r��A���.�����Ż�Ԕe���]����RHKСeb10���
�
���	�G��68q�,,H<9ڪ���1��
���U��Y_u�.��f>�&±��8C�H@}#=��H��^�lzg�h�t�X
&J^����D�Dҁ�������/�!4�D��#��l�!�G��-E΁�5oz�Y��m*�Kk7�VN�[;;��]EE'��$���pɸ#�<�*ޕ�9��T�CP��X�6ƭw�?�<�
��x{���Dz�E����R������`�����%��O;��l�P�
�ybk��|8u�Yp��E��B6ݶ���o�qQ��R��f�__��p@ਃ�y�!Ł��y���vS�$��*�;�˸��Cr-WY5Mų�v��kDϒ53����n��"�g�����;3���X�쁘E�8K�v��k'�ߐ���04��F�o�"��t,�2�@�hб��:�E�3H�CL���P|]�l���9�J�G��G~��Η�n�Z�Y(_�H�>B_ky�9���D�K��>�ol��8�&D«n&X��������U�}��Ѫ�)�
��
�v�jJǵd����R�]��4�hR?j�'��#o7D
=@��A�m�#��cF�%���î5��Mg�7_‰^�
U�:|O@��q�����'�
I��xRBZ��C�
\�(�R4k��Y0���v�$�����i&��w7F��>#8�w�r�9�bx���",�
�%:QL�W�I�g�у�G�:�����Hʸ]Z%w���Bj+ ��8���#��n)���|b�vWxDYK�Q�����Q8�g,�T(Z;<:%����c"`	�9��X�����c�ߋ���0�48I�'���h��ۚcX�v����Y.���w��#i��5��f3����ݶ
nv�*k���R�<�9�"�m�W"��{	cO���I�:�շ����׈�$��۵����r"r��n�%́��V���r��F��J�a��]��q�z.��y����A^�Rz9����Z�ш�D�k�
8S�q�}ӳwus��������z	�;c��ـ�����l/-�4�D�#�	iMW�=�L##P*ImQ@'p�`���mY	@$H+�B��`r�7ڛ6
'�1�3���d��L����<t�L������sA�΀yh~��d�L�J�@9!�l6��U!�z���о��(���GI�8��J.�:3]�"b)�O<�v�:R�\�u��8^���
J���f���<��-�[�
ۄ[@�oe���&oa�k��Qs�^����HN�.����|<�@��/1�.*�=���@�dO���Hm�s=`)oG=`������
��H_N�S�ٙ�m>g��j�F�7��s���9��o0Q	�@��rK����z����Rn��M�\M�N��`�Te.CK�\oʶ�ﲶۻ)Hp�j�>kK�E�|�`7%*�Tx�ϴ����KѲ��	���p��΅R[����@?���%C@�w(���2L�$�Y�'��ië�N��|��,��8�9�m���O�8�dd��N,����U���y�yD�t�C�����R�,�J��<sS(��2�m��<�*��@����+�$C'�����؁�:jGR�aU��������qҺ�	��c���FV؃��JSH�(9gUG::ÏYzZxP�)c!i0a�n��4z�ƈL$`u�fl��*Y��~x��;���*(���:/�;���/���K%)�Xj�};��x�0Z���c;臅G�����*���'��z��&�[�m�R�`�SJ�D[*{Q�n���HPpj� ��/Z�NF��	�(q5$8�t����jh�z[�Ù��)8;��/#��ꓷ��)�+8���/qr2�?�����
�k#j	�f��Ч��&�jG�B;�H�Q�A�4�ma��ʤ޻dѮ��%�戅�E����ƑSڔ�ByS�q/R��(	
d���V�.PN2���eN��]��sg�"����H�C�/d88�i@=7k��ԾMI��DJ���>�ze�,����Ͽ����#_��r�Rҩ�(��g���"2Z�,ڤL
�-���
�NIP�&��ZS���A]�u:1��T��,n?��7K�7v������{��Y��FD"�`{s���KJ|��i
-���lF��5����u��t4
W��,�3
�'�q}�aG�j�[im���2�)Iwx�/(��5���cA���g�T:PT@`��γ��6Pc��L�r*ς.K��r�!՜�	!�A��s�5�-Ȥ��MS�X�|莂S����� �]�\=��A�O`��x�[j�jc��
l�ڽ�uݒ�p�_9���]Ǟtҿ�d\��Lp6e�`�M��8�
�0��iH�7��mcJ m�����p�I�Q䞄����� ^z�Qp�X���ɳd���=(�{`�W_\���%���-�J�� p�����P��[�i��I��c{2]�0�"�C���a��a9��X��b,~�ct53]��� ��ZC��g5H�\َcVe4�s����E�F�A;Ns�op��A��-PVo�Ť����I�k<I[��D���#ݶq�G��nׂ[����o�(����w)'�>�!C��[[͉ҢE�Qҟ�z��)|\+�tW�MSO�����Tk����+!��R�~ϡ�
����С�1S�f�U(eܯ��+Xp�Qtʩ�I�~x���5pC�-rɶ�R��W�fM*�r&y�*U"3ah�FĴ��(��1��Ut�TĊ����H{aj���X�uU��yc�$H�Og���[en�&�=���Zj����>趇��37q_c�CU}"͵5��tx���Q��۝�'��lP������۞���)����W���v:P����c�P���&�
��e0�`�iSfjft�3�r�՚[��+*�S�
`ޤ�e��m	LRI�{�ۥr#�]L��T�+��'����2��s
%�_�e*œ`D��q?7e��S�Ҋz�a�5��x��m���I�6���Ƥ��{�t`��^�	h�RE�B��~�<Z�a`�����;���Jqrm�_J�����o%U@ ̿�� Qcxr# 2�&����m�}��e��oG"
����%q�a_c��Fu��A�-�
*as�Q��ũ�
*��P!x�D17n}���@w;�T�X$��B�U˝���8���?�
���
|]~�f���;�1��>g��z!yB=8"��.:X�s�O;�W���揯1�]Fc��B��]��)h3�7� ���+��t��j��z����3,�"�L�D�!�3�� p��D�=G恈��)B
U@)'wB�S6Ma��ʡxR>N�[�v2�?���:S��������էf$G��{O/ql�n�;u<��ilƲu�Z�
YV$0Բۋ�%Su��n��8H�S/�S�ȗ$�U��dp��&D�jk'N�kA4����P��Tc�I
���k���%w���=��`��N�GF��CU1��S��5��	� ��`*�;UAԪ��o�����y>�������\kjC�)��T���o��]�vd�xӄ bm��4�Q�'�Re�w�p�<p�s�t�q���5P!���0@W�a���u�p���b?*vf��O����>P�����$��I�UC|(���kN/s:]��GJC�#����I�xV��ڳLݡqƨ�ox�v��G�?�.Y_vm���V��Z�gp�
��}��M&�2��*,a�h6�N"&y%&�,����{x4�Z�g�@�dz��s6���I�F&�~��XÕ��y�	vžb�2��v9zW�5�"}��­���^�ԋ�0%��j3V�s=19tVCR��,qm��R��q����Ҕ���pK��]4`៉�x�W	�C��}��Z9�}�����G��Q��M�}���_�[ߧ�o�ގQ}���i�5�8gsZ�Y'�]�^�l�x�|��B�]�w�{v@Y��ѳr�^0y$�f�{�Oʚí<�;�R�,n�_
�g(�bL ��
����[��!�^*�C����z��2M��<S;�K{�8p@kc���`��[s��-���鷪���m0�a]
�1�e�5<�.����d5���#zfW�T���0u�E �:��'z�ş������葊,1�Υ_`�[%�@�b�V�/�i��<���x���}<^Ǿ�5�|����$7xj�/��\�+�2;ΥB�y��W�w)M����U��u2�C��v=�I�^�1�P���#�s}hѧ��#��5C�ڟj� �2iDW��L���A}E�R�xR�7�A�h����4Mh[,�:#೙]��駟4��&��M��
 �ߊ$�"
]���Qs9r��[�ވY�]S�~�jz����g��(�U�6��M�􄡼�M�@*ӑ��ÌŰ�ؔ�Ґ_g��Q�E�W�z��د��D����8�_�$Q.�¢k&���(;�Ů_QJE�em'Cs%�p�+�6�v�P�T^X�F���Yr�0ZL٣�O�%5�{�4
r�u�M�7��u҂��b��l��f~��*���g����W��ط��>U'������Ʃ.�2����i�'��ja]_M<�b���N.�^�뜖�,��k�n'�,����!�u	�e������QEW��e�9��t��+Uë���^|b�DHXt/����Hv�;��j�S�X��I9�w!�жYc�n��a����}��f��E�{��+������p�-v�k�'_?��(o!ԋ``n�ĖZ  ޛ�{�1`^�.f7B��7�#���ȷ�[n�MH-#�1Z
!p[���73�mq�xe�����=讎��7d�*v���x]�K�S<�X����rNn�NހS��	���ӗ�#‚�S���
����x
�	-���(�����+59���4�cHm�������"l��9��!X��!ʣJ'N���b�g[��l���Ԩ��)9�$�aJ��I��:�H[FӍ#]��u^�n�+%��8�h#;�a0�CC@�Ё5�)VS��6��"ٟ6��M𬅩D��p�4�}��@�i��N�
mO
��:���F^ݠo��:��>7�Oկ7;������x���E�h����H�����f���]y��Cm�i�@�G����%� �
���J��\��968�]c��V�c�?�o����])[ZK��F���r����lXa�m�Lcj�����ٓb�&,�ڸ��Z���"A�ߢ)o��t5ռ���)]Z/��۴�7Z4�73�jQ�9��<KF,�'+ΠK�a��?S'�B[WN�iHL��I��vHF�37��7/TM�N�u��2kٗ�!w����	�\A��4fa�#@>���ߵI��o�$�9Y_��!&�˦�e�N@��!@O�{
�p)��j6����q��(aAa��0�(v��C�nS�>�Vu�ի~`�aT5:�*�)���v]���hj|<4���)p��߅ B �cp<g3���@�[o�����3#� ��2��4g�
|�
�/_��`�xh��ի��j�ڨbb�ȅu�&��x\�%�謡fq��,ա���oG���E��*ۮ��xt�������PKe�mW����-setuptools/_distutils/command/install_data.py�V�n�0��)F��$R@����^���B�L����N����CB�Z"@���73vDž��u��˽�k���T։��‰(z��
kT΂;"|pH��z�Jm�ߒ�5�p�^HU`��PXJY�]�qE$�����a�|�I��G�R�,DE�n�q�mT]��q���vn\C� ��P��]�v�Ѹm#�1���������lE@�@�7�qR+x����;\k�l��Y��K^i�ۢ��%�!)����NX$�
�6��l�@<J,E[�U�
�`Е�Y>p�#g�?�¡�RFN����w��~iAT���\[ ��ȱ���g�&F��C,�-���M�˝�
5LgoaH)I�����_��bUoA���4��30�׭��KF6�-�L�<�_3W۠�{C��"'��c�aT���%�R�σ��-u��8#C�
��J�}��\�$�����
]����XvI�i�lV�����5���=�tM�jd_�zy�Ǵ́��V@������髚��&Ms���@ID�PZf�����9Z��1UB�@7��IPT����@�m<_�O�'�6��b8��<�bx�D���5�8Sj��YhΙ�bV~">��h��a�c$V��F�#�>�;��/F�IGa*jd�%��7��yǜ��6��2/�.��V�lʑ����
�_Z�IQ�0��BqC��>8ӳ�
������^x�Λ}���ot��(�o�b��_:�0������gN\���� Oty��q�K��.E�*oh��?��L4QӺ��r���k�s��9��C«��U��w���_�E��y��<�\����nw)��(��y�=z�:Ƥ�'����f&s(�f,�e讂�D�PKe�mW9R)S+
1setuptools/_distutils/command/install_egg_info.py�VQ��6~�W��N@��Sz�>DW�:UJ�&U����î��F��e��;6�6�TE+��of>�g�qÍ,��U�1ٔ\˄��p��lU�w���5`�?O&�lu(9�JCsy��>�&~�����ߠC�fY�qE�V,��]����u�1I�:��UW�k>*��9�McՂ�h���F@q?j�P�Vᴠ�}:.����5hj�{˕����,0s�{�����3���?�+��.(�]�C�ЍOcm�>�USv�g��|�BlI�-g��	?5(ڐ����L��*����o�� I�Klf͹N�'���$��-�f�=3(Y���SЯ?�4%�&�b��t�w�U�cә���X�O.2W5��Qy�0�(�W�"|Bm���Iz���^���n|�5�5k�i�D�){f��GŃ�9�L��\
�����b�� ��5�\X�B�ΑpC��Q�Q�6 �]His�&�튁iC�;�	+��&�V}�(����r�
�"�L�������bJ�t���"�<��?\ԅ ~`֮�)�����o�NHZ�m�WmS�+����ٕ�ٌ�[�U���^���9lS	�,)]G���T�r^����Z5��K�|��x�d�C��WQ_?Q\X����<i�]j��P���h-W5LS��?�~+�zr�jQ7����r>�?���UJ��g�F
�&�N5�l70^@M�v������066u�nD[#(Y#p�
�Z
:(.�0��>VF�K��e�Ɯ'ɝ������L�Ռ����yU���c��%��@F�^˳۷�[VY0��:Լ�����4�-5�˜�_cB'?DAR$�Q��\ci�}�<������/??��/�\)�6��E~S���'�`�c��hJ�{�CB�,��a�SĴ�J|��h6�3G$c��DZ7����t2��$
q4F62�k��Hw�S�M�iU&�gr",��.ϔ�Z}��tޘ"�S�Mx��}A��S2t0�.C^��QZ��M�7E�T_�
�~I�� �,�PKe�mW*Rj&�0setuptools/_distutils/command/install_headers.py�SM��0��W������rJ/�T=F�V����Zc#۴M}�'@��S�߼�1�s!��T�jM�7ZTR;�(U��hc�Aa��;�g�oi�
4���o`>����D�BN�ϋ?M�V�AH��7�Rq���ai�"�~0��1�0�>��t��ؖh��F����q6�y�xf��Z+/���#�0Y�O̶6���<U���2������x�r�����l��]�����L�rC}���#�_�R귨U�(�Ĝ��(l�2���%ב��Q�&\�Pu�mb������q}m��}l�����K:�	.5�+2�j��m���]�.<e�vVuGs���(�-��6��F��(���u��I&��@�F�W~,��j�.�η{)�(��ԏ�s�L	u��f��aUy��wk/V��V�0������F��z��zc��j��/�K`"��PKe�mW����	� ,setuptools/_distutils/command/install_lib.py�Ymoܸ����'� 	Y-��(��]>\$N�"1�DyuъI�����H���\_��J��3�yy��$I�J5�������7m/�k����б=�$j�ȟ�j��RbeW�}J��ۃ���y=vL�$IV�v?p���/��l�=��Z5��I��`v9��n8[„�B�E^��A���/W��y�U�^�#�p��|#M�nVo�~�����w?�*_���՛��oߐ�l�RuT�N�2�S~�Z����D�wF�Ӟ!s�Hd�P�&O���o�������@�Ek8��e�?l���c�GgQ.e����h���oy�����*�nV=��2�?���,��W9q+�A�}w@�E�?�w:vj���L����ebDX��v��Ĝ���;���S�{��	�3���!���k�j�B�A�=rw�k�Z�T��:�tc� )�h+
l9���ZH�T���0%�;!�q�z&���0)A���F;�X�H���5y�&��U��-���r��XB�:=� �:��u�7�ni�dG�6&%�/Q��!�C��\m*�Vܤ�~A��R\�e��I�$�c��V.ݢ�~B&����0��1�\�p�!�'��X��/L<����B���5�����3G� FQ�6��c�)�@�
�����
�l�S֮�M�W$���^���c
���/u�~JS��O	�@�W�%z
@q{�VA=�X��a�{9�N~n�B��d>�mʜ�Tl�L�7�c� ����[�k��=��_J��?C��I�_�4p�ji�t�e�uM~핺��WZk����#*�y�)�Q}�נz%~��9�ք�
����^q����W�����[���)?2�{�1m������a��ҵ�H3D�[���~.
2�!���u�6�L��l��%�(�63�0U�=���Y��5r��V��A���M�3�C
��ݷ@L�N�q�XX�����ѹ�SH�����W~Q����#�:B��ϝ��Ϡ�A��
0���9Ph����X	�!bU#*q�>2u�
��H��ȑ�Z��q���x�����IB�(y��}�T�쯴�~��-_@6�Kt?K���Q*�ed"+I>U$1��E�g��2�(;;��tE���7ش]=jZ!�B�͂�� �m����i�ظ7��-(+H䕞�x3��*�3�J.5(V��R3�m��+�f��̈�wә�Q�v��ش�x�"*�hJ���_WP
��h�#�mvT�X�K[ٳ|!Cp.*힙������!��\|�݌}e�qƏ�*��[J���A���M�YC�mp��M�{�A��62��C���L��f-wql;����ݦ�XYLBf�ͣ��áT0c���G\g��Ay\��G*�,I��)�931�i7�̼�y|�	��D_���L��_��}A��a��k;D.��ޮJ=.�(T�ipI��
)f�t
���r ]��?�]��ow�*���&E!8WIP��8]kH�^�k�*$YX`�#-�?� �$}EQ��������.��� �G�ؐ���{g'�
c'�%$����(걔B���u4���޽����P>���@ KG��)��7��$�O?
$m�)��	j�Y������7��O���PBy0�C~��o�$�ߠx�e�wF@/�ri�	ӂ�����n�����I�S|(�#Ny%�aT�V�δ?�M[)�=�/���š�ճ:j����^�q��~
*�tP�e�L��k�@8;���	+�R"[4+`�KHm���Tl��z�dCDSp_���JD����>j=(����^״~�m�M~6���}(<�y�
����*w��������X1�(D�M� �[�#}�p�>�Fj�h���x��G�ƻ���&���n�o���/Ȭ&]��h}�(��$�2�{��a�l�ܡHh%
�S��WT��:#�?��� +�r�V�����m?�9��||r.��o86�v�:Oin���d�YG7l7i�/3��5���X<.�E�AXG��%�N&Z�o*�3n�=`�ʶfB5�K3��$�;�#Ơ�x�{8;�Ȁ`�',����w�{9�G��K�F�p���
2m�BF=̀���:!MGp�wG�qQ=uz�-c��ALmB�‰C�T?�ĥ����q��4|��(}���iB�,��15Yk�[���W��0Î�������u�kq��};O�(`^{�Ehu�Rm"��4��N����3�EkҲMԄ)�-�?��3�W3�����)9��4{�Л
�V�Ɂ�/�X�x��vD1�F��8�>3��Fl']NG�Y���߷�'�SWZ�����Q�����o�1�Az����9��Im��տPKe�mW�:���0setuptools/_distutils/command/install_scripts.py�UMo�0��W.:ۀ�R(����a@w+ñ�D�-��4�~�(YJbg�2K$�)&��Zh3��EE]W�z!�6e��R�7:��w}�J��lB$3�<F
)�V!7ї�ْ﷈�8���[%փ��{xSj#J	ZE]vQ$����Q���S�
�[ߎ��\����ha6&>~->~~xEQՖZ�,��Cf�Q�j
��XB�C>���8ib��Nh��1tШ
r��c�ܡ]i��j����QXR{0��Y~��D[��dm��	A��S,�E6��jUh4��{�rN�g��A�g�k
�hQπ�w��8
�$2�=s�3R�{�V�Fk�Ky*ӑ�	�*T�az���?1D�ۆ���YF����1�%�N��u
���1o>�j��7)��$�s���$����58�I��",�wr,�+={��m�K/�9����4�g���]��W��.�d�u���:#�~|�0���z������(�t�;�Yf��H/d�q�-!�I��d��
Ѹ���X
�\����7����EC�3���΀��>x��۠Mx�X/&vl���>��p{q���31�?����j�/X�s�x�
�q�-��Ύ�jj�Zǹ�0;��V��\�Ҕ�3=uO~��2��tww��+�x��iفyM�\���bՖ���!�|B:�f}��ʋl��� ��E�W�i5E
�x�Лc�oPKe�mWCh�o�+setuptools/_distutils/command/py37compat.pyuR[k�0}��`m�tS�.2�����|�D�hX��$��ikqs�Kn�;9�|�q"��+˲"L Lr���E�q���-(F��*�7�=��#�(�DT�TS�`+R�K�F��5%C�-��}�cI��˦����">���ڥ�J%��ѡ��:���IǞ���5M'�p��O�vm��u*�U�s��v��n����!�"���x�_�l���E
�!t����9��ܸpW!�1�?j����4x��n�v�Ƙn���tk�z`(^D�H����֬�@:�:��]��tPY;�"m��������\H9�Nσ�
`��A$i�
����Rn�	��>K�Y��La0*,�PKe�mW����t
�-)setuptools/_distutils/command/register.py�Zms�6��_���!�Ȍ�8�w<�6��I���u�J����"U���������iz����b��X�>��x<NDQV�H�0�W�(KB�0��ht�Z�|ų�`咳���y��c�*��!���%_�(s�
��x<��X,yT�?9:|r|4a7"^F2a?�/F#�Z�d^���Џ"�U2M�,\G���$��/��\�+��d&�E���<RS���k����͋J�6!�2���W�i=���(NAb�-�;l��ш�/�E,źy�Θ?6vC�![)f�C^o�%<���C����ĭ*���ĭvΎ�3����
��^
��b.�,�	�	�?1$�Hh��Q*�V�9���!��5f�y'Ҕe���B���Ĝ�V�����XG��%�Wi�E�Z�"�J/0���Y��<�o�ۺ{a�$�3���^VQͦ���.w�/y��h5K"V�t~
��xp��w'$JV��k|$�R���r|
Qܩ%.t�R(�i��2�_�����>e�g�M;ϕ�J��-V�,����|
~c"��V�r���Q���I�?u��f�o�sZ���D�A0G�Ƃ���F#�[��k
����bS�
o��cga�И�*�f�
��b�pj��o�a�5��9X{�MS���)��0P�b�w���O�����f�!.8������:3�2>���|-yL���������`��Hk�˜����&�}�� ���*��D��d<aנ�-��;�}������ ��q���.��!�
���o�{o]�I���Q���:�}['�y��.P4�$�!ޤ���`9�J�,/B{q�1-ՂO$�v-dl��W�=���g�#a��;sVS�yzȻ�#���8r=�G��kA3ؿ$JW5<�.�bj��idǝ��В�%�	�C�����۟_��ޜ__�^�����1�'#���(��9��/T��+rp����~{��!��Θ���oע2?`���cE+��8�/c�����F�'�g ��*M-l#�c��(F�?k�f%\�5��N���y���MI ��~�NL5_�X���{�p��.�}eN�����s�:���$�j�(�fW3����e
��*m���	�w5h˂]�i�Oe�Y%R�ΐf�=&�n����~��}�vΆ���$�w���}��t�E?��4�@jpo�Q�(|r�Y*B�]��&dB���1�B���wQ!bU�҃���mK�!��7���ց�Wf7��OLX���WWoΟ�A��c�%Tl�8#����5�b���
">�OI����tAw&?�c�,#�)ӈB�q���̟���
=�c��BFBv�8u"��Wg���@@�^Љ���]�Z�S0"O:�Z�S��)J����,kဆ��0��낑F˥���/s�m
p5�3�X�
�Fd-�
�eJR�oh�	˥K�4�$��B}X x�%K����.x�|��Hl�f;�p�'�b�]B�8���X,���,F*Ot�o�BN{�Q�;�	Y8H�!��/v��f�O�Zl�H�r�%�B�"E�˾ ��1{�N���b��`��kAj a���t���A�}8���w��s:�Y�!'���Br��[Y��M�c���Rv�p��F�i��#��˂g '�	g�
E��%

���ᓐ�^����T��@��$vt�~9��r���U�v"[W�EkOC[*�.�t4��>�0���Z��w��.��N4�W]�>��2P@���:W̉���*AM����R��&:z�;!c'��{�a�?���U[]���J5�0=B6�Ps�p��^�}{�y�Y��Y/�4k�!�����ۘ��辳a%�lj�~S9L���Xpb�:�})ß
��+��J�^O��
v��A�u�
w􀬛�2Y�Y�e��_�w7�Kp|x�����e�eD)�I�pu;�\lD���:ǯ�P��2`�#�({v;
�%齷��f#��9*߻Ti��V9ml�D�W�N`ގs2?�2p6��`K��yD�P�/��s5�HH�=��R��3�v�]O��J����m���>ܡ@Gto�����u��E&�+U�퓟�o�~��@��W#�Wä
������'������/��h���o�m�[\W�wB<v��<��r�شs�Az��t����@z�w뚢%��e��ď��2uwjK�,�?���N�m�C�~�v�S��\�n��Ev���w��8z�S�k�mDɵ^�}�J�x�h<l/r��Ik߁��70�1�g�nd����
$�/���K��ג�\|DxY#t���m��	f��]P��;��M�����2�G�y�_A�vuh�����gD$�f؝�eol�<�9�~Q 	�7�;�6T�'L��j����b���=p{m�*k`-�$�D���Ħb,H	�m�ޜ��,@��ob�~�R��c���.D�4�)��������^��2�)IC���o�]O���iQ`�[��̠C�sBٱpd�¥C�`>�65��r�r�\�K�&:�R�i�V���ְ�q��l�S�|�׳���:�J�'�X�u��f����
��E��⣵�Ӳ�ۋ���5{ztҒU�h��Z�u��zVH�X�u��Y�c�t�͠M�D�&_k��Y.�1��5�lr�
�wݛD��(<�_�@��}~z��	�L�2=����_c1(�Uc���'u	M�D����a�;0��ޘ�p㝽��k��w�aI��×q�C{�;�����9D�-��c�9���	�3|��{?�}��Nj^������g'O/~��ū����yr�<?yz�줱s��S����c��MR���Y���,�$yxKG}ye5|P7���tCQ�U瓌=�ρܾ��(u�w�B��:�d� j��>ma�F����6��cA�+]%���?�n�k�?�׃��tH�B�F�Ҿmȝ�p4��K���KQ�?…>E�V����d���~1����;���g��N���JC������=��r��u��<Zz$�	@$6�S�4J+��M��g�퇽cG��i�/��!�F�]��*��;_�"纩?��sK%�{����n�`V�k$�'��h����~�	8������ܤ�oʳE���R��:�n���n��֣�J��U&Z-���þ-S��i�(��^�~��^E��B|8�#�B�j�wt�id�Jq�Mm�Z�3�1�UM+��r�z���J��������S����X�b�D�O;�m��$Pwm�w�ul���I��m�⡪x�*;����L�۳��	y�K���a>O�]�Rt�X#�1J�]���v��䅿�"���W�3
D�s��O\�Z�5�{��PKe�mW�t��v=J&setuptools/_distutils/command/sdist.py�<]��6���+��r��It�y����5�s���.ۗ<�>DB3�#ȑ����n|Ay���L$h4��
/����З����x�u�I|tu���V�(�^�� �s3�%4 az<K�N�^0�d3t�`��+�0����b���*�m����<˫]�پj�L?����wuY�y����+�N�w
�`�y[��̼ޕ���w��|��z�� 3�=<x	�Á8��_f��/�t|ͪه�y�7���M�C8Nt]�Y@�q�p�_���[d=���*Ď�Cs����{�.o�|��o��bTk)�-�W��ƒ�$zR���A��m�G,�냨ڵ�0R���Z�Y�̬H����ً[Z�_�Ql��?3��ۻ�|������o}������b���'�@?deN���ْǙ��u����v��M�\�ߚZ���,�A���K�L�R���|�_/�y�AR�v��kv�?��ȿ�ƚ%nK���R2�T��@B�]��|���K{�mArV�Kْ�����l�0�v,?���~s=/x�S)��C_�;�A��\���L۵�aWvқ��0� :�-��6J�$�y�Jqbeo�
?�臮f�zfp��
�d�NL�^��m�bI�8�^�(���_��3��>	�P�7��g��z�����?-�+��JЏ���
 �V�z�L&¹(�
AD��`)H#�]q�L4��b@;�����uc�Pq�D0)�:�%����P�ي�ܕ9�љ��
��O�I��o�R���38T���m��=+� Y�v(aT�	��w������h��S���DQ�}�l�����uSWg���?`b'�����\t���쌷�j�4[�Q����Y���/q���<��r��Bλ���p	j8�*�py.Z�!�,n�m'~)�w��Y:+�I��z�F'j����h9Af���ѮQ�q����k(J��{�^t��,���Sq�kG���`Y��$�Qx��?��a��
���6*~L�ohBh���\�����E-�N(��Т�;N&�D�P��[��IZ��"c@����>;��������'j5^�sF���	%�R�3�b�a͇�4�)��o-���V���k�Ho�O�'m���v�Rh܍M�>��!T�ٙ�\,�b(2�4݀0"!4�!K,VY���uJ�Z쁺b�x���67, Ut��-�1�d�P�!���ȃ��&F�'1�R#�ų翾x��D}GҩoY��w~u@��&�uٗ�*�C�0N�f6I�jZ����T'�
"=��4�5́��N� 8/������[��N�/]���#��}7�'t�`.�~N���k?�o���8�����&%�8[��j2�d�(w���ڳA�M���o�FO(FoM^C�K��^�:�3��L�4޲(|���(z�6���t�R�0,Lt����4���;/b	r44��hT��7ꅟ-/�xn�	7��:=vY�t��8w��"�}����{�d��5�h�D&��Y�ك!���y�9FQ����:D,�)c`���yY��P�SK%���Im���E6��z�
ɭ-��K�H�j���f �̛��bC>�ԩ�^��2���]6i������3H��I	��#1V豍C�5�����Gq���CtWC��00cV��2cD�0ƴy>��BN�z�2	�3҄�]Մ��v�0JN�Fx�h& _�\�3������Sv��v'Њ�7�9
�+
s�))8�@���*/�wC��(�T���Jc����y����R�s�̇��+,��(?�©m�Z+�[�x獨��
��U3����V��~I4�M����+�Tc2��/�p��v�tMI���c��3�c|�v�����	�+e�z�����r��M�0B}C5�G8)B>ueY�L�z\�dGͻI�d�F�Az��	,J�mq�b"uATf.y�ʼnmŁ?�$�F�5�ݎk���5(9U�m*
d�%X�-<���+ǿ�6a+C��g+�N�x�E�(����Ȣ�esԥ�p�v�wx[�� ģ�q��'��K푭���ҋ!�Cc�hC�FfXh�J��k7��>� ���$nJ���[���&.;�Q=;���[��ı��� WF{#�ѡM��$�#Y�t1�"�OX�/�+�g�*�4EWPؓ�i3��w��UK#��D��j_ӿN�[���Dzw���x�+ށ���Y;�m{jƟ�jB�F6�C���Z�h7�<�`̉�0����7t��͹?��<6ŀX`�����&S'��
�))�ٞY��{����V��M{^�L�͗zJ��i���\jl"#�ϓ$�jp�;��s���'@�;��8�=2���5KQ�Xb�`*FX������D�LcLZNl�.����՚-,QIJה��U�y)��J�f`*yWL$�f�^ՒL\32��8 ��9(�+@4Ӎ���/sMa5o�K:��V%�I�嫟�~ǥXK
,�0�,��s8����V�xY��F��͈��n�01�Vt�r�WN���=�q�s�ď>��a]���oeS
=靄���ٚ��É:�'�O��N���Hm)�gI��}�玓4�vG2Cp��X�9���}��#�)]7\E�z%`���&:���X>��!�Ĵ��Ф;��A�+��f�z�f�LIi�ǫ)|�f4�΄
PG0���	l��ݢ>������qPD�U�Ƒc��!��dp�Oqn̩"�jSӡ�H}���	~*E.}���N�f�>�N�.��AK,\!�u�>��*�^X��Q�)��_�a��H�yS=���ԏ�WԔ�j �KA69h���ݛvK���	5�qҡ�*1�C Fh�@�7	I�Xf,o�un݂���m%,1��D�)+�hЊѢ��I[��F9��4��
D�K��q�6�k:�m]��GϏQ�}����$���v9�KWz}5�_ά�[�y��Ξ�TT%���9��(�Y�s����Rz�'|��n(5�.$G[��Y#j�ׄ0���͘�k��&g�� �^��;X<�i�3��*ހ^C��rґ��r��)�ѰI\7:���+Rgdž����)�vh������^��g�&ˆ-�3Gi'x��q�#L�<o���9�c�D�U��S��)��]��oٖIs�/���_>j[z��wf���8�Z�[sXi����U��F��^�t)���T���%{�����:IŸx~���vLs�*���%$�C[`������òuu���U���wM�0��x}o����9G���/��!/[�!6��O���=��h;�m�c�&V
։~tΏ�0�x+����D}Y���dLM�-��S���S[	:@��i���	�O����LV2A�||�ׂcE����)��h���87��dձ5�i'G��s�NS30��F8���4lԦ���$�u%D��z!����ԭ~����:��u�XX;�W��'�3��	dnO$&.�e�q���l�c���.bȿ	���%d�3�q����-���橅{Cm1�n����Y�-�����K@_u|;���K��x�a46���S�[Q5�ج���;Zal�F�[���Nj�dx'*��>Y�/�S �R�A�V�` �^H��R���C�f�N]��FҌ�xۦ�}��c�ۻw+v�;���C
�?d�����/ �5w�dN�q��=?�:�o��d��:�ǿ���Px�Ot3�F�)��!Av��[Z/S�ך;��D#���!��@�noYr*�����c�aA�<����ī=G&O�q��\Ⲫ%������K>"���^��o����@�M���˴}W���D.S�_�]������ҵ��rEh?��f�H��5>[w�*��L5��O�Ա�E��ȱG�^T�U{
��P�L����±�R�$�h�ֹ}�:�7X��G�
����#$���h,�&y�n۱<�/��b����NN+!�p�)(K�� 0�j�_^����/�#�l��
)��{&��M_T�g��{�M�ZW��2K/g�����Q��yNM
���z�����U������G��x$ѹ��5�g��'�G�6���t���l:�:��XLu�0�8�%��n����$Hf.Jf&z��9�\ٱS	;�gs԰;�G��]?ߜ��⸚SM���R��LZ*��gF(�-�5^P5)ъ��e�������󮗈{�\'t>�����1-jrYGNI�e�X���9Jm0�"Z�l��jO2��7v�9�LL���݊����v��1�&�����#�M�L!v̊	9j}71)�Bt,1HV�'xn4�G���v��[��������k�������BJ�N@�Gu�$�6h�
H�@��Kw=��e(��C"CU���~Px�he�t[�|
�F	T�U��~3�S��p"�(�&��n9 �g�p�b������=�!d�P��:�UIAQ�G��~�Z�����8�?�-�
�p:D��ݴ5%݁\�A��H�nU(�~xGϰg�W 0���[1Q�fQ�T�(b R :7��갎%����ޘ^^��;��*�n\��txˣ�&Q0��E4"�Z�q-�Eb״&�!����,2{#���U�j�4�h�v76BX�Cr[��X����'~v��0'Ѥ*|iZN��ik!3?�8p	�2��A�4N�7�x�:,ct+&H#$$a9�x�G'��Ʊ�^#�@�=�Y���}�=?oa�k0�-�N�A&<�� ���p�1,�Nw�J7Ee�Ӫ�H݌�F��m��}V5���ɧ����X��}>fN)�
���DF��	4�~��2w�e,<�x[V�c�uq�;����w��@Fl,�+D%��[�&�^�cZ�u����7D� ���kq�F{w��S�nt��I��:p�_��1'�Ha����] �=OŽ�*Yj��(b�{��[6t�;����k�$^��(x���/ژIy(�ʽ������1᝴%u���G�D�H���~g���lqe�4�z��6�X��t��<�sr�(�Xzӑ�\����[5�luk{�]+S�B~���r�R@��-S�ڽj4ƍ��O�gԩH��e�^����W�k��Q��r��+����`�z�Hd;��S���,�ۓ2R��:n];��m?{�m�a��>5�1��mZ�A	>�sJ��nC��cy9�y��ͽn˻yd�t��M������ԝe������c�=��H���7+�2��D�P�BA�~O\�o|B�Q�Y�z!b47e|U�e��_55t�l�?�d�� ��u)�����6�DhE`;�>nj�ŧ�?PKe�mWj��P�	�'setuptools/_distutils/command/upload.py�ks�:����N؋i�&�]��>�6��M&���v<d[[�I}w��	��[ϴ1��G�<o�qY75�e���-����f��Ů�َ�$���w���'�IZ$�3R���0R����/2�=�g��]U����|���r��d��$T��'�}%k�BE�J^��"-3���F,�&k
�eŊ�\��|���:�ZE�d�z��]�IՙAQ���˪�ea�-+:.W����o�ن���E�2> ̻���f�'��l[6��l*|-ɧw�����eD�?or��� Q�p���+�x�,i62����,�Rl�q)vr����V��Vo/?ߞ}�]��xvs{C��3o���2�{�a5�k�~��k/"�˂��F�[
��h���{�P5T��+�9���󇋙��1�
���ym('��boG4"{�-V�B��㐍����;�����|S��u�D��5ϙD6-�F�bC6��#�� %y�_"����zO�)
�!�����UK��e�h�������1ؚ�ל�/f���5��0si>߁�2]AwD�}�Un|(E6�Jnˇ�`���z4x��X�s�Cv;o:�-U��ڭ��?��4t��n��EY����#(�l���ʌO
�=L��\���c������O�C�1-�5߀�H`K���}�E8z�p���z�>
y�#����Rn����J��R�-��p��;�M��	��3
�\'�*�x��W�AXH`�J�{e7���${/�0� mg��׹�c���Nl6��	[{�c��ȵ�p��a�*��w'1.h)�fJ�L���c�&�(N1Tob4VSA�!9�dB/��yzX���iD��=#%�
D��U�1�R��C����6
҈�d9�	�KB�	A�O�^$\"�*紨�ʕnَF�`u^�.��
���yG쁗�=�-�GG3���r�\S#`\E�t�j�k	Y޻Ȼ(PlZ�$gȑ<�y:��p�H��
NpZ��p��M
)~�3l�������<h^�kh'�
�J`��,�qY�V��b�&����o>�`
I�����vҰ
,FIb8�/��*6�9���s��@��;C!�H�L�WP�:�c�s��h{U�hM�B6S8Ƴ�:W/(���<0�B5pXd��d����xנN灱R���ï�@�Ac@S�<�:�j��~�y	n醒O�L|�u�J=3�:��i����_UY�k�kz�e]�e�j��?���~d.ED5ЅR#�~��� p�tp�����Ʋ.���%l��Ƹ�)�]	�Z��P�+֔��9���}mJG���mi��K�8�1k|4��l@
,�X�Ȅ�r�V��6ԯ m`Y6�� �O��#���fYA�c�[�8�e�9��7��aA�H�l\崆^�����Z�\|�5���X��PM��x�:"��{vE^<?e�=���ڜ��b��6g#�2���.tw8�1s�ʝ����U�0Vɴ���W:3�>Sy��W3�ē+z�k��qK#� Y��g܈P^4n�N3K:��b�:o�w}������&��y�T�x�n�Z�j@���4��M-�4����T%��~D	'dw�n��޺M
�/�2�//$T��#��#QZ�\��}��������i�N��-��T�Ƣ��$�N�Rh��]�@�����-#��][�|�[M�	�6�;T0�`p�*��	v[x	�����,���.�t���V)�b8H���OJ�E''�z:�on�P�S=���N�0Θ��%Л��1㧋Og�n�`��W�7��iHI� 3�J���y������}|�����ɋ���x�����˓c���ɋ���2�ZY����R��>(d��j6�C
�A0$�[Bg������e�nU�
"r�Y�5��.)0���ɿ��>��M
��R۩�A.=X|��à�o�i@l��5����#cz��4�EM-
��vh�J��0���J�t���S4r�V_��G�%���6������n-�,�(�}��4bj��c ��G�TH�V�.l�z=��Gh��N\��9�tR>��x%��;���M���<�����Н�_�ax7M��空j�ki���7TCA��E�!��^�������K�~$�~`���=t�P�a�-�I�vn�u�SQ?�2��|*1r�c4M
���[ �Z&�3��h����e�������(5�<�T�X"�C]�5���k��h����]�2�������e�n��CB���	�,u��B�S�j����g#l��d똰X�5I�MQ��y��e�<X�T��]__^Oܑ��L+Ғ���0���̃�2\[�&�Z��<��}�
V����T��{=�r��q����C7��]�"|h�'�N#E2"�y����O��ڲ������CF;`���c>�Ȩo<�PKe�mWsetuptools/_vendor/__init__.pyPKe�mWD�*�;!setuptools/_vendor/ordered_set.py�[�o������DJ7B'�^P�H�ՠw�C��A�v)��}薻��\���K�C���8!��%9����x<��ٿ�D�"���qת*2�S]�e*�q��+E&��(��b.��*��n$�ܱ5*9�y"��h_���Eq#Vof��߹�?��+E,7(�k��4ݱM�*�
�&�䭸�x%�;���r���]V�	���*y
��8|+E*�l
[���`?�}�R�\��h�٦(᠕(��H�S<�hU‰�"MlX��L�K�o���X�F>'�]����k{ٌ/c���_�.�L����Ŧboi�weY�-��g_�R�Kut���o�[���Gv��w�s���h��(X�X��lv:�F�X��(�5)��N5(!���l+@g2�	�he��@{��T��+1LP��|ę�g��c#r�,^����
����X\1^U�\֠_�%X�2qq�jܡ�q�h%E����
d	Pu��AA�"�S���5��:�e�xY��!�ؐ�^[�-L^u� �D-�p1;�1��i�,8	D,/47V�j��ù��.`2���H��Q��L+�!h�q)`� z��Lڑ�_��>t.�BYZఫ:�q��+Yljy�`?�1����۫��|7�P��.s6�/�������-���M�s��d��sUU�DR�Ӧ�8�Jy>j�gm�~�F�ȱ�{86\������Y_�~���4b��y���缑IkN0�x4�0^y.��b�D�����]qt��㿜��3���>��r���P5H�!g�����L��T�%����# )Bm^���ajA�|wbE�4�Т������.�=�7�N�9��8%M������h$<�%q-*|�(3 ��h�"C�^C�3(�5G�bW��J��|�vEͶ2M�ɖ��FQ��\D�̑���Cڞ=��/ɧg2��;m��l��A�%]\��P�F*���|��DŽ]�%3�]?V��V�vZ@d��,P��ʢ��n�
&�;�^���܋�1�0|D�
{�t`ԺF��
���v�[GV8l��ɗ��#���xU^�!1��jv~�\��fN莋�n�0#R&ml{�/�s��D�%󐤍)�Y�*��D��q�.Ι�q�YW<zQDn�k�b��hv��:�����ܒK@�{�ܔN��R���4���w�Q9f���i���3F�^C�
���A$\�
��1��GC������
	����ӑ����9y�o锄�r�
+�nTY�?E^��r9�� U-�"<F��z٦��f�����쮴��ʺZ�t�� h�-��b��/�E��&���(\
�1�V
Ș!'�.y,V5_�(�B�ئ��
=�=L��$.1]�d�6�;�Du`(��2QO���oq�mx%1���j�"�)ŭ,j�Lݢ�~����Ӕh�϶L��w��B-G�����*A�f�nR4s9��|+�\���
 �丹�~/ ��U�=H�<Iu���׵,���҆}����Ή�ln�Ȅ'�AQ�Iv�W̤�(J8�_;D(���()��fYD󟴄�vgR���@�'�5���UI��R���?㛍ȓ�١�v�m5�%�L_G�on%�*�]� �^��9p�΃;s�eu��-E-2=���(ԛ�ŚiX����o��}H}
}1ٵ�t,�N��\��BEes=�z��T�Lof{yF��K���5�Ń��Jϗ!�	X��<��&ﵽ0�����O���̓��q4l|�K�sIP_���:E��1~S^פ��4�x�-��G
&l�L�Z�6�7`��=�+�������BD��&[���:���+�f��F�<�iOez�)��-$]
�B	0��l���+�����Q^���k_�Z�����᪦)<B�{�2e�VO��y�Q�7���LkU�:a��ŭL�5�	���TBGe���:7��"-b8���7J{[���zV��&��D]b��<��CKQ�b��d� h���/�M<Q8t6�Jd�,ݲ?_x���
�(���{��ljH�‘J���T"U��Akw*��1�mAg�g�rr�ۢ��e�X8xM�L�^kE�,ɣITiu:+i�ɔe�ZI�
��{���'���-�:��/
�g�T܁�St�}�Xi>���O�{R#��b�����-ʁ�޵�n"v�c�Τ�W<޲��g�C�i����=G��R��c�Q����q>A�=�]ڒ��n+z��J!}�����v0Vz����%�ڼn`_}B���%�(�|
���q���^��A�7=�\sot?�a�4	�'�W�3���N��K��y�y����U���9t�%�
w����}]h/�tAB���՞�u�TJ��v�ad+����yQ~J�S/7�ϙ�r������OX�w��wAPQ@[��@��\]�5{��6��8(�+*��~�D�
]�ꀵ�f��
S3{O?���5�#6i�"&�-�z¾����f�k��fM-{
��A��1��\/�-Q�o��w�V(s��-a�"��W�6��^���:�m�50ᴷT��� k�H7ru
��!
�sȦ;���C�d�l�
��o�l	��(Z�Fm���r(t s[H��Y�9��%��؊�%b�A>�<�lky]�ϧ�6�yD����ұD_�%���mb��/�z~<���,p�}8}���N�
dYq�l.�D�p���S�o4Ěp� ɘ�� bg��O�P�c'	���co��&:M��P�:�~ҍ�P�
ư�^R�m3{N偽���U+�=�(d
�kSx��-�R�:
߬�&C��[�)�0�2�
��ӦJ��cEa�z�	��Q�̽CaMh��GKl�K�1�V�`�7�v;s>����s_�d�T*��I���*
-"ZƎ�$Z]�te�7���6��p�1V���
����#��)���Z�J���\�\�>�+֫˙�b,�.}�AԾس��A5�����B�#��S7�s �\��S�O�T�^���P�Do�nׂN�s}R&����c�>���&�!�h[�zˠ#���7 {�k��+���4F��+ۼ�Y,�-6��U�AoJl���tb���҆RK���P��gN��v#\��@4=Z�M}�V�P�Q�Q�T�_����k��o'uj�e�*e����]]�Z
^���s[x"���9�0����{}����~
� j8��;W^��%}��'T�
��)Έ6Ԡt	V�b��|�5#�PW8)�Ρ�c�i��}��M/���W{�q��|
S)]���P�Jm���uQ�uH��e���)�� D�0�G���zh��j�|"�&��r������v�=g�9�&�{��&>���B��!$i���=�5>�iǀG��
��Nw��5��9gp���Y��Ч����u�f%L��ؗ�.�w!�e��E���ͽ���'c,�+a. ����5@�{�,A�HA`��C��{�h
�O�4��~��Bf��e�EU,��tw��K�4Gq��ض������"������@���6�t#B�[��bC]�b�<M*�x�s�����E�>I����Dȡ/`��\X�Y�@��9P�ud��Q�I�_z�N'*[�LP6o��Q�O�����i�3q�9�"���1P���+;���O�K�O�9���PKe�mW��+\�x�setuptools/_vendor/pyparsing.py�}m{�6��>O��ܮ��Rl��n�]�qZ�:/7v���x��m��H���xS�o��AIv�={K$0��`0/��i>�O�`v=��2����O?��v��u���WA8�kk��k�_��x>	���w�H��뤘�e��Y���yR$'�YgU2���"I��4���YU��u0K�*�'U�f�:������s�T��U\$P~�e���@�|4�&YW��i:I� �α;A�@*uz��8�'A��$P����:��UP$eU�#A��d>����t�J;��R"�y	C��F����&4��d������ɼ��%>%V�=̋�L&��h�u�4�Pf��J0F�_��S{H���y�A�ɘƝ���_�Q%���i>��W0Lh8�8�rS&���'�eB#c
��
zͽ�I�Փ-����qB�g$B�1�{RV@)��,/�]w�Տ�w��W��~���߼��޳�gAg�~w�৽��_�x@�7�/��zl��{����g��ݟ_��=8^�	�^����}{/w�|����)T}��0��{�wp_Q�mo�=G(/v��|O������=
���D���v�z����Ώ��o��?�y��`:� ��{��
4��b��!�
چ����wp�>5��#�
�r��뿿����W��v���]���]n���ii�oh�g�/��ۥ���*)}��]zMn�v�^�D��zy�~~_�9Ե�;؍��7{���o^A�]���@՗�1�}G z���ǃݺG�v����7'�'��O�CX��a����N���'�)��v&����	��qɫ�4͘(�w��W��ߙN��l}���G��)vh�J���x6+�xt�	<��uW�W�NgPW�f��R���%,�I���u<i�.$,��N���'q�g��pM��'�]u?��:���8Ϻ����$.���*(�����P0ZM$b{Ӹ��C��속
��"�L�8]�8O�� ^>�9���
;C�G����#w:׸�YÚ\#y}
3�
��'������O���F�����g� �N�sa[��p|�����2�̙�?����x�K�'�un`�8���*�Ϡ�X}�=@�D�e?�i�'7̝��og� �$��;��}�}��U���p
�On��g\A�΀NJ]��+0l�/�3'n{�*��.��Jx3��`V�mn"����3�D
t�Q;q<��ǥ*yO�"�y@S���e��P�r�^� �D��}�YG�>�	�j�����s~��?vN�h:�����N&���w`s'�Go��G]zԍ�n�����Y�X�f*�ń��b��B�ޯs@=����6h�E��l�}��I���$Edd�4)e3�.	��.=��)��^�'*z���IU��F^$l�@
4�RH����ǭo�G��N��F#�{���Hf �T�aX�$�"&�g�~"}@�+�o�78�9E�2�&
�0��é0$��z��@d�.�wX��<ɂ�"�%\%�*^�J+��ABi����$E�Q�s��4O�\��hSH3��AL>A�O�j4�Q{��sĎ�O���$��3ʧ��~�]RQ����m��O����O���)s>��ɼc��0*�w���\�yY9�+�YB�"i/�M��A�c�P`V<���]�[�f���讙���֦ $�9��	K�X����A<�"��Y�6�33�hiCf@Q½������M ��+)�Wŋ�HT7_e�z`v,3u��Oh�u���yZ��<�G������>ޅ�`�%�y��"�]���(|��wA�I'�ه�	/@�I^c<� y���k�L*���P��@��N;;�c]���a�菐�N�D�8��P2��P�{uj����.	�dPfO��K��h�ʜ�<�2"�}X�����`c��1�ӄ_��� �tL][�����*
�(�K�U���Y5��u�<eP6G	���d�%�j^vO^�~B�}��Er�vV�
��
��
xz�k_��;r2f�z]�H��b�$�d�#���h�?����xtQ?��!�P�@6�IuX���U��!6�s��T�7�9�Lލ�Y���ݢ��W1D
�e����GFEc`��d���!�8AarY� �A� ��S7�1���j��5���Ϋb��H.C���p5�+��l��
?fqX"/aQ��	wPV��6��A6X���=>
dA����y�6����|#w���p��iq}�Ix,
Fj�!���|$�=��|�W{�bΊ_q(�0��Ϊ�.���IdL�O���I���|2���p�/F��n�����?�C����˜~��j;�6�6�?&ׯ��񩏾���S�.M �Ɨ�TX�n����͂��G��*�%UK�G�rt0l�T�
>�?$�\���	f�2���f��7�Y��\��C�ʹ� �h��g�y�~�_$���#�"����?��'�X���UC��}�^���Z�L��듔�Qrg���a|&?_͒L~���I���=șpg�aG�FvM~����/�w3�N�����E����:>�؈�����f1s���^�ҷ�*%�h�	/��{��c��j:1�_�n_&��&�z���d9A��	�pEM��͟�:p	lW;�D?y]$�i>/�r����U,�O&ϒ���HQ��Y�S��l%)��R%�Dm����y6Rd0�=��Ư��N4Y%���(�f�c��p��i_0[�M�eUqv�/�pJ{��$@k�F�<KG�8�a�g6!�0���qd�I���rBV�������L���)&�f��;�p17مZ�11��x�����6RF�-bq:��>T%S�}�NQ�A<q{R�t!�m>��>|e�JGk����i�%d��y���+��2��l�x�b��۪ৈ�����c/U%q�
���x��Q��g�[JQ�C'69����
�X�{��ngO�&n��|�$�@�/��G�G�H��#x��Y>�F��$��2T�Q^�I���L|E����5�1��4�0?��g� �?+�Y?%�
9.:Z��<r�lBG"��L� �	ί ����Q.V�G�(tʠN�t"��X����_v�I��MY
HeA���E��z&)�40�	�."5J�����C��-�������a
S����I3&2	��l\�)2��ɵH,�����4�T�Y�~#C-��T�&(��T�' �_�^5y����x{� �])�9?���a
���F@��rI�gI%��!�Qu�M'�^�#��d�gC�p�R¢��{o��m/��j�ن�xz2��j3�};��h�.��V��66��ǽ�=�y�f@F����m(��ݎ��/`���~�~�9�wr����P�?��O�0���p)dR£4���B�D4�w����7u�l�V��������c�<B TJ�F�"�R�נE�����P{��O��r�d,;�1�#���4x�� N����O?!^	�;L�QE���Oإ�����q<���I�H���}��Ċь0%�S���1X�8�B�cf���tX^OO�	Nb�OOw�v�r�̍Wa�O���]��4��HpV��P�	�Y^�9��D+�3��f��ю9�8$h�F&]�zTA���B8tV�w��$dƬ��H���',�S+[��A\��tNJ�@!���φ���OPv�>n����G_|�՟���/3��o��ӝg����vG�R[r����I��;�1"�f��wgJ��;�_�4G��bT:���2�+x�e��Ոj�"C�� C�&'���u\��_�QuI�\�752A���n�smW��⍃����/whQ�E��h�R`t��7�)vI�4.I��W�ZKC���C����A(m���S�m�V#��:��$�UP��Z;4Tŋ�������1��K��o\8�o;�~c�š��){�j�†�I�J����2i��G�zg�#�x���{�sv-��tS�Z���G�#��}��X��+�"�ėy:.X��k~����N'p�-��x�>?�U��.C����d�؁/� �8���{��;�m�����=K%��ꋲ����x��PC?��3|1P|���$)�Y�P�f̅2�'��n�Z�t�E6�ZđvCA��:<�N�"���P/��X	�>��;0F���vzm��`�/��
k��S`��R���5�Y}��;��A�
Z������-�&��طv�	5����$�����)�._�+>y�[��4..��ټ�q�ä8PG�Γ�w܅����#���I�R�!�
��|����#�1*(�;���!�Y2B;5Xڎp�P�
e�[Aܖ��~�n�2�1�P"A��mMG��u?f;�}d@��I�1���;-"�H4��f�܈�A��!��TוVjI�)�"�w��ȯ26��y��P|kMm}+�y�2���̎��vs�ъ�zPT��	���n�gI��YF:(�v��*gcG���}$�����=����H�Ģ�|zN�Ok�����;X�Y�R�k�����:3�u�jvݡ0u�0(ԾCYL�x��'�$�=��k���c�xqf���C4����[`q����t:M�h!0�^�m�J'���/x�O�����(�8�����t|�=�m�k����'7p����O=3NQ},-z|�*�q�r�1f8��b4Ո�`��]8n�o�oL�MR��$�=�dU��%�7�lUFuh��!�d�>}[�B*��IMg��H���oX�m��ilrƢ�*}�}�AzJ��l��bI���i�� as��x2���]D)+��[��5�Ĭ[��X�Q14��*
����m�x��8�C-ܙ�I��J�ilj3yV��L%�@f�ж�Ȟ='��CI"�>A����,)�O��j��[�W�g���m�5�hr���i�8��1"q.PXf�j^��{�6n��*�y�6K�q�Z���[�|^���o��'�w�x1����?G�d
�F;[�f�V���snL�bJj���(G�G�n��m�k���(d,�&������sbth28����,b�H#1��$E��4���
P�
������b��SIg$Y(�{7=��6����wXRJ�hTo�֏oj�N��������Em4[.���'7�����-C²4�J���<�\'1�` >wv
}��y���Hq�A��uǔ��ɯ�����MM�gJ:�xP?��f��&͛�{�!�j�8�Un��u��Y���K�]��o�o<|�n����B ��l����N�'�l�t�^²�3F�:H�BǽN�-��m}�%lu[i�;�EwT�W$�����jc>��`��z-�x`��-��x��Y��_�w��‹{��u/��F�b���]X�0oz<X�B��!�n3�>�f�h�|D���dž�<���=D	�F|�r��U7^�k\�n��$_�xB߭]Ծ�P*H[t^R�چ`���u70��sK
��P(n�]of�q��t�p[,G^��.�i�UX�]s��(��J1����W�%`?�O_������eh�x�U�[$`�!���K���Hl�Z��*Q�8�}�����j�'ߎ6���B��{Wj�X����4�^G�؋^x9fs]�Z�U�%]҉in6p�Eh��;U���8�V��	�`�J(�uä��)ל���T�n�Y��>6���P�$]/Z��;��7Ŭ�DL��6���'��lPɨۍ��{�A�	��뫃c���c/x^y-`�͛�Q[�<������^����k!�[5e>���Mk�5�E䰤{M�hk��>� �u���5[�!�o{xT��+ψ�w�gJ٥��{�Ft��J�F�zKfs$}m�6�m\��[��c��Q���ɖy��(1"��4�R7�wk.�.��r�]��e�B�.z�]��!���‹�6���.�]`~�.-D���EdLr{'hr���6�]�Ҷ�/aA��نrx����{S�!-uiRZͯ�z�Eh�^���ڼ���p+hԷ��B$�����I���.�{Sc��yi�>��6����S�[&��{n/a�6|��ޱ��/E4b����@
��pϽܑZ�힦��3�")�ќ�p\�+ W �$�Th�_6����}8D��zւK,\$$�s��

�wA�ͧ(M&�щE��(��u٭��1�ߟ�X֏ͥlӣ0K{��Eci�J�&���RL���շ��k����D�?U��6���*Hy�Ϥ���L��wURx����GY��X�h�-X�"�.=ZmX��qIv�6*����u��܊���%�(F�m6��|�Ү�'H��jz������y���%�&z�શ�~�҃*lu?�N�R+2R(lj��¡D-D�C��:@���u�4�ŏ\Am��Sshi��C������$�k/iء+�^���C.~/</l��uk�bZ8�۶��Պ����Et�bt�~�.�0[ҦB%_2
<�Pu��{,벚�ߵ��;�C��F�Z��HPqɓ�;�I$����B9� ���_}�Rw#b1�C"�+f4��n���\�آc��lX��J��!�`t�DuD�a�Sƈ{ys��'G:�gJ`������~k5i~C�GS�G$��
�
�i��������nz���������<�:x��{��
�k�1�F�������
��!���pɂNS�C�ǣ/��=Ҁ�Pi���Mp����em@�HQ.b��ٙ�X Y��!��A��ɵ�]���אj$莑	Ƚ��fg���exM&&U�lTp��j��oZ �%`��SL���;��1���W���2}R�`a��,�U����ر�[�7�6�;=Ԧ�5�_?=���
��i�x<6��́�аݦ��$>I&N01�_ ��!�����t!��oH��P�~ZwS��z̓6FC��"1lF±Cx��TY�N�Dȴ�(*��c-F+-:V�%��V��m"�e�	܇!ܪV�K���l?�^lPҝ�%�]�[</"�w:!�2���_�a����i����
t��t=3��q�/��\�v;ĦsZov�R�ph�(s�WR����e�.z�[�T��Ү��3:�8��e�:�5�E{�*�bD�xD��51iY� /�w�,�R�n��A�EM	�LT!�#U�oX��H,QX�DG�$��2�,�|t�]K1����_o�4�!��e��& �v�ˠ�����Jб���t�b�Q`��1"hcTE�n��
���n��r�[Y�����_�&��k��r��tW"�Bu
�z�0U׾�w�P�Z��#(����^s�����F*�)�+�ma�Q��l{%�j����4��/����"Y���ޭ&�}lA�	�l�!qpk�H���ٽ߰��)B0�!��B�'
����5��n!�:"���r|Ak�dW�Zl���Ej���-n>�ࣨ��`��	��_�$�������=��j=iBu��-�jT���;�	{�E��6�;`�
{5�F"�{��)��*���Q;H��t�,;�gt��֤�h��b�{pF�_|��j��#�Xԕ���*�_�X��\i�t(�If|�t�'�O�E�2��sB�R�CR\%���1���j�c_�$,2�,�A���
����4s+�}zLٺ�]v(��ZOw�9}u�lR^�	�����`rQ
��7�b\^LN����_���B!�6T,��G��-E}����RӢ����K
1��WS2�M�TK]�I�i���=ܝeA	1	��M��GVF��tIY.�+�h��-�v�=f�X�퇨���	b�t�Z_���P55�¹ެ=�Ѱ�~Mu����k��.iN[g$'�B,Yl�t��T�W񦪏����AA��:
U���'%^yj��&���6�U:B͆�#��\�-����/i�HFO5i\z,t
}���[��L�i_�Yņ��=�۶vMg��F�zm�3<=���aA�%��mR-�T
Jm����dYLL��zk�a�tO� ǹ��L�o
,Y�c���S��Z9ccAz�=���Ea�*;t#'SO8;��Gcy ��h�p��#/S�����+Q�9��K(溱%Ζ�#Գ����s���1�E���)�m�6������V��4zV\�Lf[ݮ�;��e;Px�i4�܂�6�����Z��Fm�Z��޸ V�)e`q5���%1�'iܳ젤u,kD��2om����H��o��$i2��_u�%l�]+�7�d|�K0)�_�����	jI1��ٹ���/)�j}
��75t��i�F՜bĆ{�9�>q���N���t��]m� �+$7�ha��/�d��o�d�{F~�YEcl_�t(��gT0��j���/{��h������U��9�k�G6psm`�۬
�ⷯ�Z��
�;U��f�n�Kj��^Fjӑ_��{x�Oj�Jl�8
�wa�M�����=x�E\�c��F�㓞�����
����^���j� Sk��;>����h�Q��_u;~�����.��	6�,���#J�B�1�:��p�1f����a
�2�|���t�[:3mb���&�F��}��%��"�'�?��K���P�j�:���bi~ V�'���ѹiY�MCQz���:��c��s�iTp�mz#�|�����SN�����^��ī�PG�n���9����d0ou'o_�]��#��t�=�%hw��Hp_��s>D��6v�)���7||�t	�@�����w�
�Tg9�<���{o���~��
q��}%���Q�~�c���;l��2�f�VV#����n�4|�I�(�@o�D
]�Y��ɱ�3fu(��l�� �����
[����R�mf<j�8�+�\R:D��J���\7��c�&`Y�ڇ�b�G�@�}yt`�vx
L`�P�=��\�\E�Mr!�'eZ$�]����	��}P�ڰٿF��<��0�
�v�ӣ���r].������E��Ь����k@�%��)]�,p(�t�w_XX���`T-J�w"U~=��U5��#���[L��p�j��m^j�B����G��Ȉ�:G�*�0���<�x����Mŷ�������������[�~�n�/�1a��G��4���^��@�U�����L��E�^���x��RN�>���^wZ������i>���uf�V6���\\r`.�M���x�u�ڝ���l��5>��FUE�eօG��������DzU�,+��\F�^��~>��Ӱ.�����jgֵ�,Z5"�4%���mꀼ����-�ělX�Ʃ(==MH�5��Nӳs�� X�#ʂnā�z��̆�r���v����?���F��x�9�����؅�{ݞJ��MJJnO�3v(�1BJG6 ���O?����05*�_}�n
�T�ϒ��䩟�}����ޯ�c�@l���F�������?�Opocc���cS���<��*R�+jƬ@�]�P��%��
u{�ll4h��l�����]��._ڗ�Ɍ�>X���.�pϋ�#%#�v�^,6��պ�O����ZY�cט*��gR���}&�.�7_30��9z��������ęq�{���Dm	g�n
�g�9&(&��Z����,�K`t���~"i��y�B�VtR�)/�S�5r�ЗK�Q(�=��}�\�!��$D�5J%>7835��l���5)��?�o+,�
�/���vY�X��_H�@3� ���-��Ta���Qo��UH_52�<��;����@�-��E�Ie�Y��۹衳���u�^_]G/�&������_�P>�t>/?/����f@�"C�� �ާ#�h5Aq�
���	z�^^2qJ�[���,9M8
0q\�&f` �Bi��M$ήM7�KY,'kR�!�R6F?��׮��m3�����f���6C�9�||��_%��EA!�P/J#�s���er?x2>Z�<.��+��f�io���V�}��p8A�o��4�un�;﹵�u��I��T6Re|_��y])���{
J�2Ѝ�F?�ߟW�l���q>*��x�g=��'E\\?������
��ʶ+
W�ʢ�`��ϧ�#�KbuW��cen�7�N��h��u��X���Ǫ���r��V����D��Ma���,��$
O��`�����^����	���]�c�X[a�������|tO�ώ9 @���Q��WS�m�&ބ�����:�l3�����ś��H7��|���']L��^�|bj=��ħֈ���O�㚪���^~er�O�#��v�f�la1��n����G#���JX��n�'�0�g�m{;kt���Xoڕ�F�m5�4[�?<s.�xiZ����g+��{�"��"�v�sH�D���+A���fK�^�Nn+�Vu8����'/���l�hS$g��B�RA�Ǟ�dT��F�v�TJ)L�bd��\G���4@�?��H��s�����!:R�m��S�:�uu�{�Wɦ��Z�Ib�B2�$�f=7>)�㢙����$�K�<�6]XZ���/�9�>~�Փ��fPτW
*�M����D�L������'7�V������s�>)�bh�q�L�+ǩL�Gӱ3�+j�W�|��d�RMkϜf�t|:�_B��4�Cs�I��V��<@ϡ->����A9(@\!���	�	R�4�@�f���B�����F�un��M;�^f �\7I+�t�X8�ЖN��+*;H�@g��g��F��9`1T�ŌRu���ROl�-G�܃�M.*۴�z++�
���p�%'�3q�C�h�QK�:i6
�Av^��J��OitY@F"�o��i넟�#�1�lA�ףL{��@�@��s�Nl�3-D�x6� ������7��z��n��jtH�..C#�;jt�ΉF� �M�7���l>��-�7O�@��gy�!C�]�lPP|Qɽ���%~s&
adf�9�l��m3�]@�p@�f`9�Y�!�0�|���-��pO&%e�뎓Q����;�H�t��4�X���.۸H�k�`RAl�B=VR��`v�w���GF�=R.f���ӷ�����cj�����Ǯie4��M�*�((Dg�:�<����Q+���@�Haϔ�׈#�Q
�*uu��i�u!�WK�y�^��#��y�Q��s�4�S�ny:3�a����*�m��ƒU�z�f	��5��l��׶�C=
��l��@�h��Q!�Hߣ"/�>���&G&���S���"�.�]E���hM���QGx̋�`�LmT��̥J�&)�h���Kb �L�&�Än,8`�Ry]�� �hs�w��Q�B$H&s]�4��5WOzOga��'��PZ�L���@�dF�H���ЎvR�?j������H߹�=-�|�Q�q���H�����Я�z���KY�k�~dU'au-�"(��kVE��U�9�cXv�Uz�)jڑ֬P���æd��z��H�WxOy��Ur?���Z
b�2E��V0��[���云��J$�t��	�A̒,�T�GP�s�������g{ϟ�оR��=�_�=�y�l7�~��w�Q���ݗ�������x���� x�&x�����E�������
^�|H��3=|�����
���r'�{y����f����7�џ������+�����3�0�C���Kv�W��,""��,g
W4
0W�Z?~�;`i�Z7V�~��,�;%t��Y�,��6˶�r�mj��~��)^�tL�2؋$�i>/d{�d{n ]��)���6/�{�7�0�u�Z��N�kr	��86/'b�mbk�C?Kn[Ɔ8~�k�jى��Z��Z�i�K�e���h�Ԋ%��
H�<I��ze�Qb:�Y��-�(��c�s=yߞT���9��z����b�7�GT�
Yi�>j'0GJ&�d��,g˨�)��j�����v��$b�<_��S�e:����K�v�o��8����!��7���m��z[H!�$N�2a�XIFc98p����=����x <���O�),�T�9�����v�m._A�E:NJK�u��0�.�V&g��r�Tr�B���xk�7m���z�����/��(Ѩ�]l%����(�̿���M~�z��R���,KO�Q�9���Ƿe`�+�"�#����	n!�4CL�S�I�#8B'���.�y��i���W��3������X4��U���6�@k�X�857�]�?$���z��$~�T����o�U��!�a�<j�h�x(�°w�d�0_�	�J�Z��1K+1斬�S��zN��8���i�q�ϳ�,��m����l�Q�a�[9?!�GN^\?�=s>C��i��&!�r�qzi�+�@l��
n��tV���@Leh� �<^1*�2J:&�Up<�L�kV��Ng�*��icv�'���$�U�H�XV����\�&�C��i��e[³���u�;�,|�����L'd��/��>�x�P`��)���V[��H���/)3!�}��id�iy�Sr��b[h���c,�������	�S������$ɢ�׋B^@
�m0��^po9�LUw� u?��y]$��Ƙ��<Ek�1��b��b8%���3Ң׮@��w������I3�c_��
�SM\��1�zʎ��%�o'я�Ȕ
4�&��U�Ez���A��C�w��d��%ޯl�����z��~�w#��q�NZ����/pw�5�\AM���{�V^,6w��A�VwGud�/��ւ��X�!���ȿ\�X��Z|�嗏���_}�ţ/���+c7�u�^��&�sb�=�^	F(�;����L��͏�Hkьf�ްcs�Y����­�X���.ӷ�+;u�^� A�uC�C,�0�J)NJmA<m�)lg��e.���� ���=�z�A
(z;��X�v
��;Z�3¿�4?m�k���A/1}
 .X�E�md��:�o�yFmnC�vn���Vk�ٛV��muc��7��;)����FbG��^���=�q_oj�Ф+�q�=��y��R[��5��V8+
�3=�WdC��z+��A�/_�n2Y�Td�}\������JȖokh��wS����'Δ��z(��1�\��͘A��HB�2"
�
F���8vc�x4H1�si����|N=��8a��Uۣ�''Er�R|Ԕ��{Oa���A��qn��.ڷB��YӐ��Û��ۓ�R`էL��5ڵN��F}�l���w�@�XO6���*��ќ��H3�mw-��%F� ��%�Uع�`�:�l��5o���u�4i3/U�9B��߆�`MR��NO��t�|��>�Pl�S�����ghIȥ�l|"�Z�S`4�E���:���'I��fkR~��]���t��x�h����-`�ķm��`�4Pg��ԶKy���È���qL�ƹ��h&�@A�
���K�
p�|q�I��I$�i��a�{ew�2�1
������a6����'`�"�(>vVe�u|M7VT�I㗷��l˦�,�����X��YY���N�IAR>GW`�:tȼ��i�(�N����xm^��fTg�]�"�ֶ��]�e�q�ǣ�i�h��i�wc�V���F���f[��Fu�W�Ŝ�~����l@T�'���((�|�'�Uς�V�C��1�9p���4XU$��-3���Bţ���q�^��_�Qj�{GY���iF����
�6� �Р��c��Ґ�j�F�S���"�Ԉ�+�e�,L���
���R���1���P�$�Sx�����YW��`�t�Ĉoz��cڦ���Fy�MB�2��8�y�9$\<A]	�ַ��1
��s;�rˎ|E�q�|t�q�||r��jHN�;����o�x�/~L��o�"aJRDQ�Y�AgӦ�Ѣ��U5��X��RU`5�1_+g�
(�xL�w�3>ԮoȗG�mwIm�=��ɰ���qx��d�%9(e��uDb\�
�Q��R�TJ�,`i��G�N�['R�J
4�i����?�#VNxQD@xv�y��Z��ƃ��Ct�(���y~i�|3�LNKL��اad���ŷ���*sD[�e�L�1���3����1mjD�S
E7�n�F*"�C�0U�Hպ�$ �Jˢ�4rQ������E�������#|rb��l�'ϱH��Ai��[����sr�-ǺAi�e�������T���� �b��}
}���X���V�|I�s8B*�o���½416ݿ[�0�����/��]�ì�5�� C��ZjD#㾊�ׄ���Dbu��!fq5Z :��-���xB&G
W���5�
Z���N�+<����Tj�4NkA��
�܀{�6�Ž��6f��6�P2����r�E6u��	]��2Pᴌ0��5��;m�;��V�]Q�]Z��c7y�%Eѻi��>Do�N�n1>'�32�2F"�1Wxέ�d:#�?,&&{��F�O$aK�Bժﰪ�"���'h}m��r�CvE���f}(���͍��PX	�y�h74�r�4[J{C4���I���N�l(�,BD����,�aL���u�����
~�i�i��;S�ro� ���$��|:�5��f-tG�^}�"dZesǖ���������H���gG�(�c��+ݹo�	ض�r`_��M�+n@���BI�5��y�����Uy�&@Q�|Qհ"��/E,bu�"/f]��/I;�����j�.ɿˉ���Km���௳"?MU�Z���N<:okf��>�����
�ÆQ����V�T.Y��˃�����t'�;i����6rW?�>lX��D٪ow
6�\�iźs��L�0o���X���^ȃZ�i4,"m�
�X�A^s9������Vѡ'��l1P�yn*�iƅ%<��U\(�٬�”�F"�^�?g&o~@Q�
����V�O1L��6�|�|E�Qs�rGeA����j�Ԑ;�Қ��
��F>m�Z�J�@�8;�ʏ�Z
́Pמּ=թ;ꡪn^���b�5@�$��c��A�V����h����zhj��Ή�t&zK�1Շn���-�N�9@��bq����c����3��z��1�w��E�X��[+�ZD�jZb��Y����[~���Ր�P}di�e�����[~yK}>ަ���nk��B�(���wYea��,��Xp�t��X>�O:��u�i�����v�և���'M]�<p–��z��yX+}�� )V�V�P��؊-��er�B�%m�<ԃ��x�)<�]<\���eWl�)�;�UK^G�՞���F��=Q�?f'�TJ�|��]��赯!��u��N\U=h�8Pw��8?���a�*�y�ICZ1�D�H�"�/�҄���� A��A�|�ȱ��
c�e<��+u��Qc�	�g%�#���at�[�m�)�u�Euhh�Z���H��5
tm��p��'E2�t�-ۙP���4o#h�k�����^:�2�$���F�%W"z�nC�
��į{�,_9Q�j��.I�����5��{��~�q��\/:�����>_����%�f�2��ҥ���,g]�KZ׻ò�uﰴ�
�?v
�;~`}OSJ��e1i'�Γ��X���zWc_a���+�tiǠ���[ַ..戧��z6����k�^�{���%,��Ɍ�Z��:Y��H��6&.��y .�;u��Ck�"���z
��>q�'�|9�w��k�������_����b�#p�J��kO{C�1�}����.�1l�\}�k�5f�m�7���k�k ��F�5A;�kK����^%d?��p�f)҈c��ЙL.��,�AF~�������YO����ħ��w3���a��;�H@�^��\}xa�m�k4j�2��cn�d�!gA5�{$l\���<�sI�.j�uSY�o��#DZ[Զv�K��8�����\�n�!��m��fT	� &��Siu�E���؏�ف��އ_dֺ�r���c��`H����m�X�[[�=ó�4��&`5������jK��Fo-R���>r����EqK�~�\���,4w��(�<&N}ܧ�{isL�r����eH���H��D5�p��_;Vy�:�XGj�#Y����1�)Ӝ�W�lx�L�td[�Q�h��ʭT�di�Q�є�\�m��lf���UB��)�Ha0�I�.8+b�[�hc2lʴ?��1S���E"M�lM�;*#�C�����Œ��?Z�����$�����iҲ�F�f:��+�P����	�/�՛<�|�*Xo�"�LǮ�`���&�*ig%"n�[LQ�Re�N�K��c�,����J3H��(R��0���)��.qf�{xl����!�a�%�vv�]$�W��d�\ �Ht(ב�[�Q�)}}�
:�=WDv��B��q,ugI� ^�s�Т�����>̩+��jgL�iB	ֶ�dD��@9R3k�����N����$zWi���c�!�1���Yy=��׻���n���h��u��l���r�Â�hG��x�zC��9i��9a�^���N46*��\��$)uP�+�)�O�0,��)�</D.zjڗm�gB4�Q��p�,�]�Ks���i8�ZX�k��6��w��߂ͭ!�7��eܪ�Z�㎡�/,L�[��6�g�Ɓ�/g'�ecviJ���|v�0kz{ʑ��S��S�Iέ�-��EA���2o�f���sX�'	�1��$��
��Q�x3f��_�i��Qc�ٴ��|l
�r�g�z�\蜽�^!�2qG(���ZZf�qh��ӳ��a������E�+w���J��%G��}����M�e�?�䨥g�0(rS-��8'���l���ɹdj+ǻ9lb��}��;��
���Ü|f� UQ|��<�z�գ��&���M�m��4�&P��7�l�'�<�DIȦ
I���sg-�4}�5����'7v�q��=�t3��!�B�VĆ�o0��&��G�9���mu���z��)*�T.��_�����z3����~ܙ��=�Y7��1ź1~N�]#�3~��K�����,T,@e8ka�6#7�}��u�u�R�
|��ݵTx[+������'��4c�SEkmxE��o��l���1�--�i��1%W����p;KXF5T���!D�y���rO��vf�FMCF�l���}��+�q�z
]�8.Z_{�I�(	*�#��(1�A-1�ϑ\(����;�@C�UG�0�)�ͷ�6��
�5|���p��!���I<[&���`��2O9t�va�*�9����� ��z�
ω���B=�c=�'i!?���z�5C��r V�G0�ݬ�zN(�s��y/x�h���	�ˈ�#�0ݭ����,M��aj���펖;����A,b3K���=Ԋa��%�_r�x�pP�Ub数�Q��N9�r���hR������_“�_N���7��_���7_��cW�D��M�D)͈r�QB�Zf���X�k���t��}��A��!������Y���^�M����
��k�? ~��?��)�>Ҩ��cY)�R��?�����w����s�L�в�/�a��z�$7�sy��۸Q�.��[ES��j�)��[����؜n僠=m���Z��h�M�Ou�,b]X�Nلz/\�i��s7��I2��/�Y`{��۞�	?����&c�6ګA?d�[bv���8IΘ'+�Y}�ť���d�cr@+tk	�6��\Z�e`(��(��E:�
�q��B����
ɏ��]1G7�E:�����6S8��cK��w	���y��ֱ��J�RX�U��
��D�t�{g�PT]��L��ϲ��E$��bI�$�	$V2�1lLu�EN(�@��@z3n-�20c� ڼU�1x�x�@`U�;����E"_��2�C�*�&I���'�@wd
/�ú�5��T �����ɛ��$8��E���2�N�����9��΋�����7
�Kho���#?q{�N�W�޳����w��n��5���=��wl�e���ߢ��	&_ٵŊ{HY�E��R4���%��4�\3�U�H^
}���tH	���Q\3�K��g����
��d�!�fƁɔ�ꤦ0CG���j��<�{���:ei�@�m��-�ھ��t��LG�Enu8}�/Vڗ�m[s ��i�40�^�GQ����t�IV�hs6g�x�B�?�p�3�%O3���r4<� ��B�h����ʈ9.F��g-�#�Q ;Lںh�/�"��Z��c��Rۑ��!2��A�o������"�,�]�bK�Gv7���L��/�TH*
���>�L�#�+�u�L&����gR�::'>5�:�x��!�`m�j���7AYi�T�t0?
>Y�WP��{?�����r8��q��]��/�Ɵ>��n�i���4�;5�� �H�I�H\���m�Ʈ���A-Ϻt��v��Qp��v�������?F�c��	�(`P��_���D�m�$�\���j���dA/8���z�/�¦�+�^��Cu���>��B<w[��wI�PAe�1�&����9�q�@�KՖ���X�Ԇ�Wk{:��'!˕Fzuek�k�ٸ�oFs�$3��%/���:��4�þ2����<\��
?3LĽ��_�R.ð3���|��/��2?�BXm���A��s�%�E��L�?Nbt]�
�mJ?[��t*r��_�
��xZ�ҭ�i"��s����+o(Zr�WV�Y�#��
~Ѡϲ���nt�XþF�q�a<kW9��Z�&�!>��L�������j������Ct�FD~�,�X���%�t����%��M�„���H0gEB~P��܉0A���3�~�<A料�/����B�ᜋP�nղ������VClnA���#�����Z��>G�F�����S�0�k&uX�ፆ�AZ�ͫ��K�r�_��N�!�Q>=AE�JςV ���㜃!�(�.5��〒����E��M��d���4���pO�G��D����������
] ��1!,�T�p�P��L<�ͨ��r~bO�-f��g>j�O�V�(ow�����6�&L6L�`H��d�D�;��A�Y��?�<9��?�O���v��7�~�Z���xt�J(���gi*�����������3y�Pj�i�rs��������/�@V��+��3a���i�@�HC`K�"9�c1��o�����]�@"zo�Z��}�0���G�3��\[���Mݥ��c��%E�ɨoB|�kDit��P��E�,PT\ֳpceq��I	�3�_FG�5|�����}��O�KF]�Y_D��a�Pj�t64V�M���� 
���{�]�,bI<�VR)��|��v����b<����8�c�F>���.b���G#ÙD�+��"5=+�.����m%������a�	g�St>��<�S�X�^�pZ�m�=Tw��k�67�gP*�^���A��xG��-����#'������/[p._O����%N��-2����ٷ�[p�d��u��t�;��/׏}���e��S�P���2��=� �	S�Ц.;�uе��.G��~^����껄#t����dd�\�2��̟��l�ۼ���1�<n$7�7t�miݖ�`/Β36�%ߎ-Z�3�Jke��ux+�ar�<A��✠��x�ܞ=W��N��`a�XD�\�w�vX�Z��":4Z�y���ʣEW�ި(�>Y��J(2r�g�|�[����@�����C,5}�7�x�AXT~!��Fwz�k��cP+���s_E5znѩ�a7��9��6�
q*g.dCɋ��'k�ɒ��9��?Ύ�Ƴc���Zď4���Ci���G���C��mK�U�����U�|����c������5�t���S�G��?&��8���.?�d���Cɀ�'�:Oɒf_��>�j[�/�j;�n�_�O,���;��O� �x�l��ի�</�ќm��6����:� V"���d��_ت�k���
nl�4�l�Ŗ�h{�J���
%!�GdQJX���E]C���1"��o��<��ȧiU�����F(�}N�~��/�=K5i���<6㸊����ڰ�}��
�~��w���|T&�,w�L���
؄d�	ڹ	BZ�<�<�:�ƚKTxFe����d�_�WN�ׁ�Ϧ|^�B.�~'��ͷ���9����CY�);��h2G�e�D��S�@�����9�I_&u>�e�{�A�xt�
�b���4,�6"�@Qje�r�R�t��-��[��u��]g0�S�Y�%=ۓ��û�����4���d�	�O�FfS�2���/� �ԣ*Hd��Ԭ���Ծ�I��Z�)Vy ��9x|�H�2	b�fN��N;�B�m� *S'���6D�H�q�?�eW�?i��#V�շf��#�'ϫ���wc��RTT��1MuEc-��R�	�ERQ
D�>�Z�R
�A �C��Xɪ�_�� V�$���<'_2�dp6�<�SѼ��8��,�›o��,��ɲY|FE3�(討w.�R��Y�b�����4s?r����@�d�<���w�a0)/~w{:q�Qy�ʔ���I���>^�Q��站e6��6�[o���	Q	تBC�V7�,�����-���T_T9��V���l�A/hj�=L����L�.rH�g�
@�~j�I����MA3�Ov6�)�x�Iz
�3��\wz�-df�5�P_w�P8)%a3��,3�5X��(Q0��b���*sT�&�t�5#��n�s@�(��:
%E��&"�2�C�x�����F��%tz�[���;oբ�Q
~�*���P�-h�o�q$�sjf�OsWc��=)
߶�uc�v��N|2
�7�|�͚�_�\�5v��K
?�]��h��)�';]XX��e�-@�/����:a]=Ĩ� "_� Ĉ>���}�K_�
��z��
W�:���T�j<P����F��%6��5�e��,�;��k�y~�qP��⮎�#�a4n�?*<j?��O���ip.�M��H�a�07��`�V�[�Y�o����!�E�A�MA9�<Ʋx~�P�8{>F�<�V��:�����N�<�ؗ�6�d\F��9Eot��r��=FeJ#ٖͮ[ml�
g�KLc1R%��.�0Tb�T�|g}�r$�M��6�S�����4�E!�t5�O�2�P�l�@��q5%E&i��P?Fg3 �.�5���<"�H�����6��;��LP۾�[�7��+Ǵ�6�s��t����Έ�!�^����A;Z�d��G9+͜P$#�!ԚU�n�C3x���V�~�EX1��7�E
s��lB�K�!��쇙2AH�	}�S�ѭv��]��Ƶ��0�&B�L0���S_��O1�]b�"(���)��>rn08�TZN��h��3JP�Q�K�mV#l�Q�
;�v��[�6���Nh����_N%P�gT��#��d4��Z� ��64z�� �$�
��vP6���(�N�]�<u(�e�_�$�3�):=TY�z�o��4Z_����,X����t��_[B�j-ɜ�	"����BQ2�D�7��<��R�`ξDY尯��1R�5�j����LeI+�**�$sK,��-8i�{�OKu|�c~���.�"�[�Tڪ��}W�e�Z�t�)&(LzC�̊��:O�@ΈC�`��w��P�&ƷJ�|�KM
g��4��N09V!��r~bmH|�� 'c��`�7	�_�]����C�c�9wU��.j��{3�, 
iv"%��LJ(�!lܯ����Ker1���4�cu����̣��/&��J��Y_���K��Kfɩ�_� 6���Z��;⢍!��6��q�]ke�V�^7����ә�#u�\�#L�	��]>d����A�����u�!�ᨃ��&ya���Vgcˌ�l	�����I:���up_[��C:��D�W�馵G��zx����aǔH���›Z�b���^pޡ�Q^4�VK@6Ԑ��l��8՛E��M�w�ɥ_��aJ�V+u@�[_��x[P1�W:�\�Sa��R�P��Nf�A�M����*l�"�v%�Ra��d�$o�X3�8�^�U�|nC2�
Ib�(��N����!�6}NTG�n�
�l-��َvz�9�W��6�$��K�6E!bf��TA�;�����iÍt45/r�h�"�b�(�StK��Oڲw���P�-����l��;��^b���@s�n�듌�jj亾�B�lM���U��b����$�%n9��Upp��D��_
�6��G>PJq�:������|��5ꈶ����F�=|��s"��:g&0��u}	흈��U��%g���gi���݁����ej�<�l��j��_ֿ�Ƌ>gc��!�j5.�nc|G��؝�eTܤࣾ�mh�K�G���#��Q���Y��D�xˍ/$K/I:I�o��S:շ��K�/<aoG�_ܱ�Eg|qoCu�[`�-����Z�^�)�u����;��{c�B��[�!�i�Q��9\%B�y�MU������BLL�Fh�D�����"�.���J�Ұ�Tb�߾5B7�f��7濗�T;
f_�@�l�ldCUQ,P@P$�-��I=͠�|j׿��E���b��Ngr��+�q�=��1�nQD�Em*�v+�`k��+%Eڡ��pm?V�/Y�y��45��/�Y)ke��>:WrM�ã����j�֪Т��(饙'ej;P_���}�u9��6܂I<�"��~�iM4&\��0a��D��g8Z ih���B��a#�ϖ:��ܢ��W��̘҂��h�g>�i\O�
:�����^�!�Y"���X��\/RG�	�#*�>[<�
����,p�=�
�
ha�*U��z��I��4�۹g;��R�F��#UI�d��l�I�hқ��z��%w�n�w��}}���e�a���{l(���!i���Z+̕o�J�0�3(�ۑ�
+X����=��5�r��!��?���b��{�w��GU�T�&"6Ϸ�x�_�S���cD�+Ǚ��6×�C�T�����:���c⌓T�9�,@��k��CI<���K��H-�}t
���vof��5+C�v��a�_�0�o�끿���m�߅�w�\&�[�[u�R�#�*�ŴD�Ώ��4y4�N�������s��h(�埝�+t�}�m*��?E�<AhS�m"��P��ޖ�<���1�f�'���M���tv_�y|���y�� ���w�R��s�@B���o��.�&�߁�x*~�p�\�M�fK!G��'p0�P�L�;8�Be�&YZ���&ŭ����._TC?h�c�
��,[aL&[&0_�}�3�(��6��R� Z��cb7c�����^��}=3�-�.����<d���Ƀ�أ�ĦyuO	�B�r8Ti�������t��
�%Ƨ;
5��Y�NJ��3'��q�V��%�����Qf�9{���x�s�T���������ꦧ�X�Z$�G�G��9z�SJg���jE���h��K��N�2}^�)\���ӱ���#��H�
�:+r�A�(��K������Q���=�������!���F9�)��5�1D2�4}��X�����s���,u�6�MJ�ׇnR��A�n��:b:Q11���4��e^��p���mk��o�t�wL�\��Q(Ǹ�jꤧ����ƻJ��󾛞v)�*}��Ư��<�NL`p��GC?�jn9����z�&�@��;����K���tTWy�[b�gl����R��
��8U���M�*F���tu�C�F����5\CY2T�&��j�FI�
˽`�Y�b��g�q�,�Q�a��Z��1�4���F�]��+�o��u��[� =g�J;��<�B�6���÷NC�Q�VbK���l�������v��ӫ7φ;�o�9�E�p\>��W�6Vj�0��&�-��f�c��"�tl��J
�%��Q`K!v����wm�b�ow�w�+VEs��,_-jR}3��y�B�
[@y��fa�_4K�I����wE��4u�!�Pv����k9�BL�)��'���N��
�o�
��Z>�5�5��C]�� }A>o'L��H�Q"���Y*��y��|,���q�?��䲁&1������J���r��lC2D�#�k�w�#�TV��\|HJ�S�M�C�C�m ���u�%�;Z�Ph�ۄ����F��(�S:�Ă����D�S�:V�b�!I�va0�3
^�:l��x�t=�_��ꢠ���Y��Hs��8���t���ў�����?�L��<�
�$��[�+��Hw�V	9�ih�=��v/x�	�Ez�����apJ��_:�H
SJ^���QB�Y�ֲ���lo��ҫ��#�;��W�:�����U�`+�D����[&��s�er������\�͂�r�ig���>E�>�ݿA����h�Հ�z�o�.�"��z��KP�sz���u��VM1eX�a�`��Rj�ԷF�`�}ݷ��"��Y�D�OIG�Ȱ��F}m;E�d㴊�{!mb��>����{����y2��Y��'�Q>�*���"[�a�L>r��<��h�@[�2�6�x2@�Znp�ZeL*=|�|]�V�1�f��f����J�a6/hqc�W�J}m���Y�!1�96���a���#�0�nI��LRhAs�aS��8	g�;\�\��k+���J��l����>��m˔֍iT���2����sL��[���}sO�
W��k��=�Y���n˾[?l���p2֍��lzy���J�9l��avVB��#b<J�V˂�a���ihuMK��t�P^H_D���߾��{����u��G����	ߧ)T+}II�[T��\������I�(���D���׼�ukmJ��"��^����h��D�_��Q��A��A�?�r
4��p��[�G�p����4��1���f�ќ,�r\�ͨNQ�J�n�F�3�YJ�M�q�Mϧ~)�Q��C�i�5��Q��z��Z=lea����1=eu�����hji?dna�n�z�r'�A���E){e�1��-<�&�Ca��M[fT?�9��r��*,���y]GI����$�74�i���O��tIB��@�r�2�I�I�v��(�!I~����/1��C��
�_��k�2��Y����].A
b����ls
At��ډi*��e��~V�XFVZ:N����{� � +���l���޷�
�
V��&�H�Ժ\	��eb�\�N7���Ļh訆*:�J�r
��'$�$n�*x����'��ȹT-��	�ʣ��,Gc��b�b�W�b���j
��x���Mz�"=Y����3�$�Z��̢}��J*$����HB�QC���y�	Q��EOٽ�)�YN���ݦv�4sZ'JiT���\7c:��A�&�&t���y�bb�ә��$�}��K�
v�6κ�N���^c?@"�loo����x�H�!E!��`&b�7NPB���A}�mT'Q��I��~�ew�x�B�:F�h��u� uSC#fF��Q��d��g��|��4���9�����o����䝷\��IZ�s�8I*�};r����ޞ�����/��3��3
g_AG��|:���$�F�U	���
Z�ܲ%ɠz
��$�`��Q����i������Ѹ^�8H��9���[�������]���y��	��'B+�-�����G_|�՟���C�E�
���S����$3P?�x�V�A��Ϥ�&����@5�q#Ņ�Ȋ'�tqQ ��v�s��yYq�V�7��Au�^�*�N�
��zdؗ@�Ą�$�N���7 ,G
m��\�퉦�;���L�#��������ߏ�1�ڊ������_��1�Qy9�]ZZ���*�r�uV�K�/Q�]Q�l@*�Z����Z���J)�%��f[��?-��1���ު�h ���7#\��k4�Pz`^3���Gz���կWh��Ѫ��@HG�����2�P�mL��ٚ�Ҙ����4����m�3��v́5���tpB[k�E)�U췥ue�m3��+�'�`�&����T��� �KAbu)z�,�w<=O36�/M��‡Fx%��wˑ�K_l�<�{y�4�RŲ�������몬H�V�ۛf-�if�փ�3�.�g]���큇X)�3r��u��nkM"�"��Z�D��Q���Ŷ�E�o�;G���P�6LJ�N����{��7`4�:,�B�i��]�-�l���؏�؏��j�ɀ��kzY�v�Y4nǽ�1r��ŋ�;o�	�7�UQ���^tޞtXO�3���m[�!�d����Z7�·�*�*G��(j]������'�qЙ�VD5���:�ۢy��L}X)(ꨲ��3�k��"��BW�}����&�k�z��zt�kn����u�����E�@�n�`�R��C��=0��h���W�(A�eK)���#�㬟W�E~U��760��P�/cxln�n@
��N�h����< =�[
i�6�x��������C4�4ۦC*{<^������[}��|�E`.R��~�H��ጛg%�ь_�6D�9����}�\p�]���%t�|�rQ�Fr��H8����bA�U�� ��>sY=��:�8�����2�\�6��{���{{�nl���ԁ��{(�e^���aߡ�.Q�ʐu����ME�9c��1ͣd�؄�1��,�g�#�P]Y���s��H�=ipϰ�E�ɻ:���NYR�G���wއy��rW`��^$%%g0�RJ��m1<� �K�E��q+�c��|�9z�?���񃷃��"C���ص�$.��������S�9<x;�?�����g݃fO7��m>|Hn5�eR�N�+���:�0� 6=��Ϗ����y~���|ާ9��_��[}R`�E!V�qR�q_&�_O`S�F��Z��M��ⷝg�=���|t�������������������zJ���]J���q
A�s���c���$j'k*�s4t�!p�ƍR�Qyu�E�nH-Y{@q�
�����nr`�~Z���M�������0G�F
�lg:�.�f=����c�`7v*��=�����B
�q�D�������u��>b���<
�.k��OP�!�a��B�ű�l02@�"�8g0����T��g	�K��{��6nda��=�N{6�&-�vER�,ۉ���[��P
O�lI���MZV$�ok�R@�I�K�y�3��n�P(�B���o^��Z���{�?��h��t_=�~T"����a�|�]�\�t�>;ć�ʖ�
���$x�@�_�g+k�g���ܥ1U�vn��M���c�jM��S��#�.�=�iQk>�y�v��EG����{�
	
�~w&߃|�㸧q�����9�:!]
�n���M�	*��G9C��"D?+���/ݾ΍x�ٕ�z����1L~e
���-��=�]����_�gϐ"�k^�����f���.��C�*U�UM55vs	</�
�5�`�Xd�p9�;l�Q�� ޙ���C&
�	,QF�=(d�DH
�b!�p�^�^b�3���u�V��UQ)�/F��oD��� �F2P��YNV�Y����630�;/G|�m�GT݆�_�P�c�8�Q&�^9R�C�Q��=)t�\~�@%>1��LĐsծ�l[pJğ�(�������]�g�����HP��<?pJ�)Ryv��ggu�by��`����I��)�
��{'Q�ӻ�Q1�|R���A��h�ꪖ:c�]��)7o!Ѹ��xČ��M��A��P�p��W$s�8���#��:����v��vtTY@uvQ���H!d�-�O039�LPY'�)c�=�U���U~g�U,��EQJl����1<��T΋��˳�5����x��yX./2���(�;�YNʢ�)�8ȇ�.Ǐ��ʎ?�Z��=$,8#����Y\�O�N�ׅr�WI�,�H�I\~�rZ�([�j$G����$�|�A2;1cX���킒	��t�Q�̶^��,�l�%��6�mo�{�+7��ʥ�[oh�ƣ��p������_<�@��'/v���p���E��f��������N"���q��Y{@���o^Y�+�Z��JNWM��U�s8:��{�H�q8�&�)Yq8�Yێ�2n�k��ծ������P��:<Z9��W�x�gez�
��C��x�f��0��t=m�����
�*~���S""]ktt�����%����h����a�w�9��+�0�T ��Y�#�8���-��Tu���d�,]MQ����=���I���������-�<e��T���<׿�*�U}mmG�����%�DmJ�9jf�.	m���UJ���RZ}������|�4�8�|���*�����	���OQ�mF�ςm��P�ђb'\�dI�)�V�	?�M��g�Eѥ�~�����$D|Ӭv��AE�t����Y�Pp�$��6�`^]̏��m%E�ӭ�N��g���w�Ж[M#��^��q"�8�>��<x��}�J�h|�U�V֧�-�\&~Z}�3Y�~U�w��^�g�G�+4�ϯ��߰%s�kc��P�
E(�����4���u9��t����fr� ��߀����T_���E�'��i��;�܅>m�U}D��N��k0�0�rv�׉�T�j�&1�LIj��y�T�~��E:(z�?��Ek#z�0�������g
���&��o\�A}�@�V�ZB/�SUЉ*��t|YȐ�?�{r�<����o�C#ư�IC�(�Z������h`����|�s�c��{��{��C����]!���빗0�51�kھ��\:��V^_忤1��ʐ��-��vςF���%upz2��-d��i��/��Ղ�6�.��?����]*��@*�?Tmo�M�
HU\)��/M�;�UA�e��Ց��/E\��i�^���Va�ϣ(������6U�>P�Ă9l1�D6�5����\	�
e��G5+T���߸	���pvx8=<�7������&�
�i���RGȲY.t�u���|�dE�ϑ-n�$~�B���=E���(�z�joG�SƇ���>����3������gn雀t�;�E�
Ě�Fq��pǮ���J.������f ]�?��%Y�^�^+n����A���mCU!��4m��k7wq��ߥi�V
:l���
N.�,���vOӥդ�qy[Y��{�H�'?���y�b�r�Pg\)A�`�����$f�o���y��^)�s���ƃ�p�Y?�͔%����% ����鿑Ѩf�19�L�����N�I��p\x�أq���eDt=p��?�i׾��1�1��,��F]�俥>�
(�g��q0z�Z�4#�KS���Gح,�j��d�_�mIeN�,���"Dc���>��}fK:㤋�T
N�{���h�ib��}�gy���.N����e4�jht�ȫ/
}��m����F��#�]-[�?�`�8�)l��Ē���8?�Fʚ4#�Wh��פqP�'�+/���ZM�Swww9��/���1G�.���s*���=6��ԕ�煋*��G¡M,%����j,_�໺k'�=�sV%��
��@��F5�S�'��v�Q;b�K�d0o���2��y�&�ce\4�l4]Dn�2��G�<�>΢Qի,�ۏ`�To8���.uz��}���)'�1�bx�K�^��&���G�
���e%J�@�N��H�`��#ZIM�8��$R�z�''t����qfT�js��[`�!�	Ȅ;Q���w貏�g��qR��s(�3frz"��H�!^�mQ�j�]�����sUw�|l���f�
���i}�Y��x�������"�OΓPGy[�D�pWY)Ɖ��.�amu�J�<1�}��1f/1�ꔪR�����&��͇p���J{x|�eo�c�?S�V���6�1��DŠ��ōNW���~3H�8W�F�E��J�~�[�e5=п� �s%n.b�F�z9����b�r�bQ<����T!�����eF��s����v�}��3�ox�9��`��Xs�r�qoW^kα�#��v•��Jf��hz�1��R��>�k!LF�Z�v�g�Y`㵫W����t����ߎ�I�*)��\Fʩ™��ᱲLJ��5&�1�;��$\��KŐ���A���DAͦ�H�uǟ��7��XY7�9�G�>f<=��>��P)�Lh�E?D��0�t	�����v���=$���#_0��kcО�z!�a%�r����A
��"�i6�n���R�� Xa;N��0�T�B�+@�:�&�R��QY��l� �J�Oa2��9�hz��{8b��WӜ<�����x�H�S�5��&�}�
F�%Ru9����LE��H�1q�&�]���|T����ZD����1Y�X������OF���Go�h�:v�d6�"��M�l���f�Te��n8~i����躿�Ĭ)�Z�iP�4z3�JL�'���;&f�V���4~���:Y,ydg%Vm�n�xz�?��a�:v#�ަjU����'p�0�b���Tؙ2A���d�P�(φ(!W�~�$�β�YU��J�	p�QN����^��J,
1�����c��	��(n�~�vӞ�ho�(��0?�3()�X�1�Tp���d�W		5���9��/�5��GG�g�?W�r<$�)�k{;�(�^<�rZ?*��$ď�y��3�mf�
��󉠲4���SxxU����n�ܟs_7��5�D�a�U��H�B��Ƶn�}^]Yo8��s߯*0������P�u9��7����f��^а�T�ז�ơ��$�J�]>����B��'�.���֑&U���p�ͷ�G�F:D�P�����RR3�̒��Y�=�w�S:tGmg�����H���X�tjXqt�4Z�Q���>�C^�%�k�5���J�w�U�Q�6額�<��`3,[������M9m��O�}k%c)�%�Vf�^m�r����
�k�z��tO��B���U#�lu��/y����ٷ$��Yx;z9�_N@yQ$
s���8,m8�����@I�_�y����#G���nyV�A�����F
�,5�,��
<s����*�G�Lof�IB�MN��^6=�Sݽ{����=��ThZ����Q�����ͼ��n��*�y�8��zu��`�z%���*��\&�җjwݚ��ź����P�n0+"�jJ��M��C�P8*}%�s��f��w��
��y=Ē.��).?S�	�)r��i�q*���iE�S�bU��^�@&@��y����4r�PP'�t
���(���Mt�ذ��;��b��_J��Am��*�ق@�Q�Rz�	�<͋�����D�;H�UR�i9�j��1�:�����}�2�ۑ���d�5�]�c����5�5V��7���b	�m�J%a�[���z=�#��F[���'���%���x���iڎ���K!Vz�'��Px�ú�_C�=��ϼ�/.����j��Z����m{��?�~��
��$�f��*��B���W�]��+��{���t��U|�&���xY:!T��x�*ඉ��܎]"�]d:�Km9_n�|�k���|-*E�`<:E3n�8t��9l�+��?��|��}ǂz(P�T�vA.?�S��ѵ���ZTk�I�}T���\C︵� z�l=l}QV�Ean�l�(��5��ߡ�j!iW�<}9]]5s�BP]�VP�v�t�Æ�E��?7����[��m��m9��=��m��d�pő�#��6�V�EXhk���!L�0�*.*�VЃ�Y(�(xk�k���)\q'עN@�	uh�?V�`t�V��	�U45�R<���^�	���]E��T5-�3��Wm@��T��G�.|�� ����f�x��E��8�;��y���������
s���<��V��L���-�o�4��4b�l�Z]!�{�I���BN���Q<�+�l�qٲY�mN�=��0�u��w��B�	j�,��(��"�����`b{��{
Ƭ�BH:"��Z#q�*�(_��0li�����B��v)B���]ԫ~�}�I�h��೨��
�OY�v~�k�a��]�e�C���j����t�����`�z�i�v����~G��=�m�	I�O>����c�$�!k�S��ػ5Y�ŨhO������Һ��f����������eJ�J��J�,�-+��>���@����B"��
��4˂�Ӭ{�	l%R��CG���5��|E��;P��./O����'��׻/�{���˿E߽~��E�x�ǧѫ_��
�w��7�����/��B��.βI�Q)��7�q���h��=�~�9��/ov_G�?���w/_D/��_	j��7���2�ڤHe���J��q12u�U����ˇwdQKk��ķ��HxD=�~D����:�_��J�F�I�m8��fc���A�`�UV<�hjf����	D;����tʓ����@�z�c�莡�pS��� ��6<��P]>6�p#����|t̼H(6���h�#5���jN҈F���4jm��~����D��Ѻ��?ZO���r!^	Tsc]�3���n����%�+o
ޣ_�W��0\�qU�F����i}��`9��N��9#�-��@E#�p�]n�87܎Z�҇�$W���X�<Z����S�,�l���$ʏOC4�(�L��B�`����.�:b6Ff:F�|��	�4���6�#���K�
�݇�"�!RyuK��(��a�T�2�4�[��+컐�n^��V ~���m`��=%��sN!�6��b���I��>��+�4�.�m�OK����0�
�o��6X��0�^H~R��´���;�دQ�!
��o����1����i���$Ԧ�a�.�*�%�%�py�Ԓ�ֶT(-	ϲn6���X|�S�{Ѷ۪�e��.c��)D'ڗ$xm+Wm��<�'?��r�p����]N�*p��Fi-8�֖�$�F{ޭ7��C�[��Š!q�\�^�R���]�ǃVta�~�(i��5O�11�_�"��@8�U�&��
b��
�0��!B�*�J����8Az C�u��t���p7�}g��Z���zh.V�������(��"Ҿ���zt��t^͆
�
�.�Ù�2:�{|/ōR\�:c�rK�
E1b3�G�RE��Q,�h ͦ&K��8;45��?�Y� $׍����p��0�SL�:i;�7�����P�}�YYA�J4�ttF3�=��(}��t���X�=��&���.�_���h*�I�J,'�3b�ճ\�M��J
��A�h!�����?���§R��/��Ї+'^9��%C����U�Y�`C5�~5��n�JU.5�̬�B�j�b��{^8TA>I�6`�Ќ�&�&��?��qɘ�QM>ܣfE3�8��P�B�����6	wU,�>T��\�`��>���f�py,��T���
,r{�o���ѭ��^5�Fh�saܲ�a0��,�¹���m�������_�q�|o��ք[Iӄ�������H�+�	Kk�(0�MV�
i>4d�*s�4�L�||�KI��ϳ�<��l*�
�b�Xa�Z��
��k��$�&�Lr��
*��s����9�
�{�O�'}m�I���?d}!㱡J�p�H��ce���P����h>�9�,9[^�E��f�W0�gv�L����IE�Ө�)na�d��o�Ul[�n��kr��(��bt�o����ټ���!	`��<��mS
���mIjQ���Rķ�,<���w�&`[� ?��P�m)�R@q�I���w�3��l��T�KK��}��K��x/c��
�EՁC_�g���r��:M��ވ�#��n��7d�N�*��S���-ͯ����L�^��2�%6=��V2�y�9��.�߫�-��(��8z���iN�Qm]d#r��LǓ�";������vy
�QК��k5R�k���	��pDъ{p�P�c'
(�|;�hz�]������BUŤ�/�`1�U�"ƶ@E�{!����4`�/���;)��r�U�p*����
�
J@,�#l��A���P2�b�[:+��G��H^�h
����";��Mr�(���V�c���W�3��Rٶ�#i�4;qHH�
1��u�)ACPv$R)d.���ऀ�%|#���	���v�Љcf�{x#�:��1x�s�Ҁ�
��Wwx��$�Ӂ-��� @��V@��&a����o�,��6�K����o�!cHK�M��׆g1?Fg!�r��m[�t�Nܽ,�:�R�<�4.�2���a�".��lO0�6ʂ�I\-;'`!�r=�}�S|k�,M5��2pճ�)[����O5�BoȼȖn�.D��"hw�G�		5o��K�j��U�]2��=�
S�74�SK	�bP�Ȟ���³�`O����듪8u��"���0��[���܈�ʔEj�r�ڴ^�9���ŽeOA�����I��9e�9�F�,�ߎ�=Bg�R������4
���׹2�+�B:�#�c,����t�Ilі��F������,��Y@��ϛ���"���[ƥ�ŌdL0%��v���c�Q��1���+��nV�,9&	��	�T�VT��+�C�E/�W��#�m����M���Ο�ޮ�G�����Z����yw�̏����@���G�X)��X&`$�m1�b<�A�nK�F���K�(M
߰8���*m˘/.xH���%��`�.'�3Y�88F��w'��
Yje����épD���Q��?�Ϣ_�8��m�z��<��V��@�PddAYw����= ���AzX��@\�Uv��C
�>E�p˴6<|�>�@ŵ��¯�Zo5���[��Gt��p�W_����3�D�]ɲ�x}�P�<y2ԝPW��~��v)ԝ�'�����M�-�kE��F��)����"���/��"�����Z���z�s���*,i��D����*��V�Fu����e��G2غ�n��-�F�G�2�*�����U۞us?���l�HSSB�����DɭSƂ(�p�.N�du���yr0^i{'р�|�MhNj@�;��wA�j���W��n��ֺ@
�e��|�ZAL���H�M���	;�Ѐ���awv0�,��G^�A�ʭa�W<�*�k� C�n�{��2e�p���oA7ʓ�.A�M�)i^�'�9�+��
�
��r�G�s	Ř�s�C�F���{�����L���N�K�h��09����8*m%���<͢Lو�XI�8������(N�q���՝Ap�T�		��D�|3�Q�*�;8m���{�Ħ��^U�"�yQ���k.܈Z�pc}}��B�\p������DO�;�sh�ş�(z��/'����������K?���+�5�Ź_���\���YT\�|u�Yq�U��)�C��V�b�w��|0@2R�}L�?>��Oj���V@m=�~�5���?�|BX�
�W�����,��ɱb6F��ѥ�B@}�eI��yaP�7O_��
���\VO���aP�0ϴR���J����a�*Al���“���~�"N���E��d6�燌��B�9���cshή�	�ͼ�\�'��Xf�`:ī���MU��7~,ZQ�סR�?d��0����<�i��
w��(y�ž��%�=Jm�I\�oo[ɱB�[V:�u�([�����]t�
���tɄ'&���͇�6g5X�VB1�^���5'&��¦�
��ռD5#��5Z�
��aM�Ί���x)�1���J�%���/�Yы��;�P����k�q3R���(�ė�=����dU�=���R�����B�|F2L�T��#p:U�#U¸8��s��v���vjX]���
���>�a��^�L�=�%�`�)S��*1\t�X�&�з�e/�E0�fț>�UPe:�ձ�}_$�ͪ�8L���gӕ��c�f�t���ENv�v�y�n��2�76\���KZ;#A��lm��mm҆5A�,v����MH�g��
�+���'�B��PTZ�Ыp�B���sڴw�&OJ`'�r�j��TǛ��z��-�&�2=Ԃ��t�q�:>rr�
��H���uiQ�2
?w0���m�G)�.}�R@_Ĵ^ێ<eve�-�)V��o@��d��z'�fx|�+>��8Y���3{㴎���I��ŭ<7��`����H�<G����!b�Au{m��7�#�(�}����m0'�!�T�@+�M�0zD�t2
<a��*�.[Pz3M/�io%E�*�)ԝf�R s�)�W�Vn����']�	%�V��F����A�^��1�\'�w��%���
�^�$����(U�@�/�J����
��$�>ZJc������8nF��o׀���ʀYT�P�7��J��s4���7�)�:~�v� �YJ��3Rϡ~j*��zD�Ӷ<-�\�h��ڂ���1���9��8='��F�k�›f΁+�0�.J�~|I����cR�u#\�l�'?��4܌��4�	R��($�����¸
��C;�]��
+ �R��Qi�*�����U�7�0�� �9�Rqێ���bJ����ОL�Х��o�<ڿ�k_�ݰ�	�|���:��3��e������*�4�TQuQ�J7e:�x�L�3(�'~K�U�g*Yʂ�y��bYOGV��W>w9Ղ�*�E�`�/��$����Ğ���ߎ��~�LJ3[�d	�yЩV�C�#Eyx?|#O�%Uп��_��
�����������̵k�

�]VsI�N��5�}�㵇ޔ����r3���\���^�|���J�vꋓ� ����V/�@C��-י��}FL��h4���9�D)�b�4�AK�[���0�QҖȒUY��ll�cW�[�0�-�{6X8q-0΋o~v��8�m��{CyG�$]
�6���1W�(�1�z��kl\���墭��f�t���p4�[{j$oB̈\�Z�]|Āan��AQ��4��2��]�i�7��Q��,��]`#�5YY�$��DŽ��]Q��63J���
�1)�j�w�~:ϋ(���an++@�?p4�ξD�{W���3�"r�F4NЋ����
���@�&[��c���/Q�&��=�+�&E9��L��|���[�QTpL�9�9�n7Z�p���}k�N7˝��!>k����n���$��իY+��m&뭍�(V7�C�nc;�Q���SEDoE�����:��oН*�`�P6	D(8��4o�R��(�+�#�O\�{�F=�W-��u1޸��L�
\�XZ�{�����s���
q�����4L
�w=u!�GY�W��vьYE���7���j
Ьߗ6�^>�地Ѻ�Z��0V�G-�NV�ྑx�a��h8�e�m>R��ׁ`�z�5"	�
�J�OE����h�X����n��)HҐNmk����h�r%a��a�����e=<nn��к��ȕ�h��xŅ=�
W��?�z��5��|�5;L��Vo�!�Y<�u��,=N[��|P�r����1�4���F�!�C��å�#��z٥�,}�̧ߗ�Ⱟ�����c�g����gi�=�7$��3�À�5����HIZ�L�%�i~[:H�2��%��4��fZ��+栀�h��,;��g�2,��l�qq���Awǃ�p��CR��}��`�������x@ƨ���S�r<��IF�7��uGYM�TS�u��,��Kr��l�UѦ�����f.�.[������	_+�}>7��$�S�s�WWkA`�!�޲���
swc@,z�6�A�H��7��:�c
y����&|ǁ��-i��z�%����i�B6o����9N�J���Z��&.qu������٢zh'���V�/�(�y9��oI�W~�+���O��OHݓM���	)")]��9�G
��^	���OW�LWS�RkAhʭ�
	l�8�~�]w�~
�pw�A~��܊��!ʁ1>�|�"i4F%�:�E,Ϸ���hq���ԲªMU�ĕxno��`L���:r�֟��<9����%�#���k�h�K���q	jr���UnoPS��;ΙȇEa�3�Kc%hk
�?ێZ�Z�}�֥Qʼ�'���pV"�m0ԫen_�k�B�,<V�yv~����ː�F<YY����w-�j�E7�J�p����x>%�G����Fݴ'ĩ�ji���`��$ENz�+m���#$0�dxz2C�}��
!u��ͧZ�MZ��Ϩ�e���Lf�Q��"���Z��	L�u�t��l�Y�(u{#�m+f�$fV`����'vd&=��5�zR5)ό]�m��#�o�����MP��a='`�VV_�hM�
[5�|��Ǎ�`��4#)��H)R��9*�S�����b4T��x����w��0���{{P�t獀H{	�2�d諕��
tA-.ǹI|��,�A:��g%�b2I��ЖD�7�F����!�?l ��{�'P-������
x_���Ii����1� ���驹����T����4�8)�m"���K��S���<Z��T�_�p6P�ag��W*n�l�ޤP��� �7z�4qְ�����"�c��3<հwTŭ��Ɖ�ͼ_�����ӥ2{5�1JM��.]`���C(��8#0	[�7G2B;]��arT�Nk|�~�ve	N)�Hի���E'�=�^�a<|��t�{?Q1������|W3�3�*�O	�/�Ёc��Q�VE�3��_(����pڻ����-mF!�������Bj|���e<�8݉X��&�&����S\f�XWzb,_@�D�"�b��@j��<���<��b,hU}�(l~�7��h���SF/�N����X��]3Fw��w�iܝ�G��@K�8h�uⴋ�z���������ƀg��M_;�wa<s{cx�(�
o�~PKZ�)�@3&@xJ�@Feb�jG�</-v���E剱=Q������?:���At�@"(�!�LWo›���8�S�K-��̤���	o��B�;����P�[ɫ�n�L��*
���H�)+���/ҭ��|�RO�<��~���h�<�z��~�dd�}*���[��R�lPM=�}�T�f�l+�=ֲ���/������ɋ~�/o���+/�T�
-�.��I$�B/�C����i�x�
N�r8�])������2L����C�5����������'�O��F��%N��u�V���v-�����'��*�˜)���*K���^�و��X�F��$���"��Y�
4�-��8��x���w���R�X[h$��m/b
H�	�Es����Vб�L���G9��*�����s�21!����
�|0��(��}��fL,/�J��:��ΐ2�S�kd�B_�y+
�D�9��BA. �s��h�K}���M��޼�d�~��i��uF�z��6��8���f/`3^��r�.�}@�ipD���K��c���T���k𪇲�q��ڻ�m��ؚjoL�9s�^[o�J�� ��6o�qg��6��XI!�,��<ʵ֗��YL��_�Y`��5��s1���]���N&#�F�fjw�K�8����u<��/t$�Ց�P���Y�o�C%�5��aga�o�i�~��YL=�ǰn����,HIv�|BZ���%o+�L�t�M-7�% �ף��(��IՀM����Ս�}=l,k�g�~�K?
�W�%a���Q+^u���[eˋG|5�����I�|?��U��u=ͻ�8���N�ce�BQ���jV�Gc��B@L5D��VXfQ
��YM�}�������,28�9�x�҅j��THMb����h��p���v���hm��VQ�EO6�@�q����_�XS�>q�*/�T؜Z;S͍u3H\���X��PV潼�@�)i����nӾ��=�GX��J�ϧ�C靋,{�����M.I�0~M��O�,�V����]�N[v8+�Tz#�%�J��g�EP|ԫo��T8�ȃ�ܙ�88Ќ��f��%�ܥɖ9^����D05�V%���I�W�����w�Ǘv~�c��$6[�#��ԗr4�d�9���r8?T�7#R��>‹I���c�sˉ>2K�7"��Z������-Q�@�\��iq�"'z8g9W,CU��Vb(��:�mK�B��"������@�`/B�$�C0�N^t�I���^g�S��j4�w�R& �+6��B�����
/������i�d�ٚv�v�LJ�8��ߊ�3z=�ݾ(�6#?����$A
Q���u��y�=ul��y�{n�*�r:��HmK��av��1�����2���Ŭ��?�4ܜ�9����@�Na="�n�
`�0&{A脇hfM��6q�����9+��Ì�,�n(*�
��t�h�3��Rw�6��x0Ȼ:*�������ᰨ�=e)Z����]ˀ�c�!"B��X�A���_3>��>�Gd��R}��b���u�$UU�(�FS�*�Ŕ��ž�Y���o����+�R_�~N0���Ӕ�����L��&���̜'C�Ǖ�%��<ֿV%]�i���M,_���#�h��0��80~�ZQ����� z�����wZ�����cTl�1��)��G�ڢG�V���}���N)29F�G3�HƳ�x3ʚd_���|l~8�JA�*n=S�Ih
ܩ�0>�ڛxOa�8NXP�2��
���(T���2ܵ{$'v�2g�b�f1n`�AL���&e@<3sO��	��	)��%���8���tNv���i���Ө�Z�S����r4�����E8b��m>�ި��M�Z�T�s�M��Нu���0^�h�n
D�!�n�9���W�8���sʎZ�q�)���<
x&zZ%*&�Q/E��
Zh?��ւ��^4�	O��k��nC�or������m.��$���}��Y��@��-Q�)���7v�4���3Z�v�1%�]��_(|��(r�І"�y�����כ~�����A���^��U�bKy�R��浿�j��HSk�7�oܿJ���8��q7�<�''��XE,�7V���,fz��^]�؇�-)�*���w�b�8)1�Jz-���1�k4�VW��<+0�œ�S�TJ�֝��_W&��|9�;���@�o�8Qt@�7��p#J�hYs��<S�H�}���Jݡ`�l���M���\���8���iL#�w�hd8a�.N2H�x4�����KK1�(Z=F$�hb�@�}tnP輵.BX�'�2ϳ��8DcX�&����aѭٟ�)�c�WQ=�0G�z�9�G���&�#�:4Rhx�U�g.:
�d㤥V��C*p���WUEmzM����eo*�.��9�nj+ ,��������S�O�-<���j"�;6�a#�:`���#�GVu3�bd�h��x�Rj�|�xU�5“]J1�����:�
k�K�⌿�l�{�N�L(c~���q0�?�a��EG��Ԇ1�f��x�4�p�#*0�*���T�aC��$�R��3�
�D�!H#1�&RG]C�(���Q�|�/Ͻ<v{WzHn챉�
�s��<)k����5n�"��\�n$�"��)?�Ԝi�u��6q3א��XeǍ5͍�xX���x3Fy:���}&���+o۾�]
���1��1��������h�(a����g`8����
Y��3E��X�m��2�:މ@�E[�$���N�u��p0�dl0rX�X.I|�q��
�a�;��B�)����H��w.@��jw`((p������A��a��(�t-,*��Z%	\��d�2w q��n#+l>
�	<یl0�|ԓ��w�F���y�f�'qG�C,-6�pk`Y��V���� ���Dh���+ڳ���|�����&�ۡ�&���x�Լ�j���h�V����?H��_T�Էh⑳7�Jz盏N�c�fT���G��5t�&)UW��QϽń-gdG
d?�`�3f�d�T�!$\��r,
W�+�x%q�ȥ%�v�M.+9�P��̸ycF#�{e��+�4�0��z�&�r^{'�G<Yx�pl6�$�;�an�ׅr����=�U\g/Оfߏ9Z5�,}yQD���:{W[��wnl�&��d�f�@n�m�&T5�~��1�ͷ�ѯpK���ș�r#/?���ƃ�y��g�v��ϭ����6��/��QbG� �>��y�����e�{����:��xP�9���W�����kK�a@��|3�7�i2�oUNq�r�2�x����`��>�*̂�Dž�a�� >��t���52}�`yC�#���K�5Et���"S~����‹��Zzo�/Y^�u�]�k���>J��{��@4o#u?��Uv��q������M�b��x#Z<���-d����Y�m�@��~����z��q��xv�/;��g�D[�6�`Z;\W���/ȵM7��;+7	�}y�vڭͣ�+��Ҵ��P�:�j�hT�#��Ϟ���h�#w"m�	$�ڞ�A�A����10��\�j{��;	�㟸���g~��S�GT��J�H`v-[�n$�D���<��֜bZ�$U�QuR�z�ZQ�����C���t:�(�j��3ő�D��Q́�4��i��?��<�1�Mc'��)}�_~�u(�5~�E��.�>=�|>�Ɠ_��l�����U��ʋ�����iH�t��F$�i�06UV�P5��>�e�����d�x�B=�NI��jt���2��i[=έa���쫑���	,H�Ɍ����%E�N��wuظA�|9�������A�]���n���h��⬏;3ے�>�	a�.3�`��ww�ܘ����&o[�9dјLY���Avi`88����~��
��˰��IN*�KmA���R�JV���s���+��k
�gݦ$��T2�O(������]) ���?a�t��2˽�'�=M6���9w�/L
%�Ү̊Cw����n`��S���ZK+?�A:�\�)��HY��7��V7�D����U^���X�Ѱ;��Qչ������q��Y4����½�R�*?!庫B�9�Rvy-SP�|�?�D�`�S��FE*<�j��;,UG�B��0����O*�l������ȕ
f���6�sLȉ�7V &�{��DJ�;�HTvY��)QUn[�R!s6�7�LT���<*�g˖{�����$��E�)?�g�FIy+a(X�6C02kI��n�b�,Iz��5G�s?�̥F�`�~����t/l<����ۇ��%<�#�����ɝ�#E[�����WLq���	�a]�*�L��</0'����h�� �5jh&���\�WC��z]J�^�/�7қS���4z�/�Ӭf�bq�Y�.IQʮ���B-�D0����~�P:��j��h��e!c�4����
�\^��v��z���QHܙJ%�z)��N�r$���s�׳^O_�QĄ&��S{�~��6C����z�Bӷ|���:+��$����[�`Wf���i�'5#�p�k֬٠SjQk$�uY倜hDp��)�K��Q�Y��
���`'�����
�,�kN磃��I)�z�jEQ�EϞE�Y�ދZ�[j���2�va&o�$��=5��0^F�@��|�S<;�[,�td1��g�<�a V�1X��Ȳ���;����1*Ɣ||��p�(Xyi�(|9��W
MY�tlQG�2�pl}	?6=�o���������ޮ�������/�{������k��?߿|���i��&V���3�b�/O���~@��i�o��K�Z��P����2��?�+2r8�N#ͨ�b�l�
�EV�yz��(s����Dt�����:���ڲ�� )0=�2'�.�;�0��|�&��Q�,/�ۮ�֍-���8y�cvF<-փ"��a�m�����،,��I�vL�j����tXoJobuL_�VƜ�I~朐򶘻Xޘ��<��ZW_��&�F�!/<��NΌ�`�[tE�/{P�B�٩{��{yF/([�0��W����9@Sӌ�	a�~Ë��/q30�0�xd�>o*}�M9I�+R�TĎ��?�ŮŝƦ�aM���SF��_�Ԩn
|�4G�[��J���[��d���߇��O�>��G�Qe'�w[õ�c0� h������M�Ge
���X���ޮ�'{;��NF����؇r�w�Q�VJ{ҵ�[��:Q��_n=fp�D�QK�,�%��4H�˄��:�@�����߉��gI���㛾��ز�����qG�8��8%�)�..���;�#Ru���e��z��`ۺ�3j^�s�
�S�����V]�Z-Pr�v�����{I�m�uxLg��ON4��Ce�q�2��Ȥ�y�LiP�Vg��/��RFյ�Yo�#��Gʀ{$�i~���f����.ݼ��}�,�xǼٺ��D�$��|�>��;ō	a(�Ra��+���?m4fs�m#K3e�n�+Y�?:׆ߙ��u�3>� ih!����1Ģd{�!�Vd��)o���Tz���ɠ�G1�=�T��;�q�|1�#��f�����0 ^M���HO��ʓ���N�d��Z+�EZ�9���[}_u�Qf5\��}!��KHZ��_əVa�����gb�6Q&:X����L�sa(�,tQ���2��N�C�˜:�8�4v1.7�B���M��ṃ�
��'���̪f٩h!��*=ay�B�V����L�481�,��’a�ғ��֓�c���¢�1[�
ll��f􆝇LLL��D'}�חKٯ(���s��Ъ�@>��)���u�}�s��ͨ��w��$�O��E9�1�Y��rv&�!�9�z{;�h|�ݻ��`
����|�΄�&<c<on,�&� 6�`C3b˦�I�ģ���p�\O���&�O5�����F��h�|�'��9K���2��(�Z
���C��Q�y���e�&���t����Ǜ(!,�|���u�i�&'9���y{0Vr֙ʒ �VU5h���d#�z+����������r[��l6D����o����>z�JrE�d4������ߋwZ��h=jE�[��@�������
�����*�����1U<�#���P8���"<����m%l�H=�]���2�H�#M^+L��>"����s��W�J�.>�2�hD��:R=�k#W�!gy�c�n�qpj��'E}y��R����3�����r
CAM���&%@�P���Y�`��BH;K^�ȭH�o-�5�U	lkK���9���d�#��<q��A"0qP}��MjTO�a�()����W�߶���-+��E�7Gemt)H�����f支A�=�ua�A��*J����D�f���#DY�>ێ*���>m
�˛ʷBӢ��+2�����
�y{���$��%�S��
��U]�V���#�O9m�#j��۵ZI"~�&�7�B�V�-��7,*�1īZb4��A2j�ON�]t�8Vq���N�b��Ӊe��`#%,V�IM��m��f���Og��m� �6��(�t7�R��t��w�?۔�hv"B5��B7����'�@�Îì���+y32�Fd��Ov�b�6����:�����ف����Ͽ�� ��#8ԼP�@	�g<%���d���m���+��z�^E�1�����M�����$A7��	<6ZY:|��<�(�ݼG�!g}(S䲉�u]�M��9��g]����xl�s �}w������B��&�#�R�
rN|�1ב�z*V����Oѥ�DId�漏0#�SHך*}En۱�.���M�O�N�u'�<j���lE�|b�q�h�Q�E�=���Vb)#I1e��xԷ�᨝�8�'��Sü{���Ő�~�hE@��S�N�D�E�UC�Y_�g�4'���L�M�(�dE�k�^k�N�z`
O~t���4����N����Q�/
��IM�oA�m^�EЕ���h><ȧCh�f�>�]Z�*�1��z�z��a'tw��/ ��ԓo$k�)a���Yb���s}�j�v]q� 3T]@\��L��1v��n��AY���}@��� �l��c	bc�[@��LPd�-B[)l�,�lw,t*�*d�r�j�ԅR�j�BX�UL��R�v�[���u�ۻr���$����@_L3A�\����ʦ]��3�8��,��m���0��Q|{<�����*k8��n�sijV���,R���pF�Py-���'	�;�o��gqn)�ʂ�ˈ�)9���#��
�l��t1H�Ŗ¬3��c�a�l*HA��
kn:�Y��������>���R�[+Ӓ�
���{��VP��T�B`�p��
aVh;-��r���Z�����ݟI���ȩĢ�{�6ǯ݋�P�a��r�*�5V(}�mXI>Z{p��mxV�66�V�}����1P�p�Q�+%i��v�Q�֠~X|�|���ȱT,�Ѷ��J���%T�����ZG%gN���G�b�gi��k�%:!WM����MU���Ԟ��,�O�� �#jϦT���]OЃ#р֢3���z{�p�ƝI�U��~��Bo�'4.�-��`q�(�O��ގ�l���nĔ����<�'h�RD�JT�ļ�Ӟ�m�w��	�eo��=ehiHd��vٹ�L�Xxh�Bx;����j<M�P�	���I��21�k-�T4~��p�U�*�)�Ȣ��88㇪F/S������٪���NpG*�/�jmUTl��D��mӒ�\3�%W��K~�]Xv�[�H���iD1��8��`�p�l�9����u����+���[.�;h�mo�_��(�a����w��T���U]( ,~�Lݶ�wjq�<�|S���G�K�c�����Kֳ���]ϷA�����M;r�I,?`M/�����r��%ͨsm^yf��}nuYe� �ijN�(�$�9W��7�V�_%�����\�d�WR��eeP�8
`��M����"y痲k=�jC'%u���ZGӛ�'�>�d��/��A��&�a�5���*K-N��l�����G��+����!�ywt�N�����j��Z\+E�qbO��s<7�1)	���T�5X��j�P��kq-^���uaQ��S�互�|�>:��JI��[|�cl�q//u�����d^�����^>���4���gq���8���4|�SZjr+�t�id��m�Z�E�n����$`��D��Ф�b�=T�~��P-�B<6L36`��	������^=���%��alUWm�~떔�_IEf$�)+W��M\�۲�����<`�+��B�3�j���ZBW"^9�{*�JN��&�i�v@a�lB�@m�[�|H�<�gy>x3@'k�	����l
��,�n���G�eɰ�*���Q#Z⍜?[t 
�K��1c^DT�U����#�UL���9t&J�����*k�!h�Ց�K�Ų�x/��tX�юt�I�}wn�q#*J��X�͔�)��FUs����>�ð0�:DW�*�0��{:�H��d0�A`�)��AG�,�>��852�8�T����Z
�b����qGt���6�ϷT0��<L׸]v�����5�!ÌI���i'u��7���c���Ԯ������3Ѯ���� ��Vw�v�Z{;�Nb��+]�U����6�$]�)Ű��$I�}T��Ƨy�Q�jh#�z�K*tk�?�R.��i7���0�Sl�θ�Cz�]��)���݀��}S.^n�ߙ�;g ��
8ÿ�З�^c��z-��s.���j_�µ$��hp�pX">ք9kX��k���wb`%i�#c��D	E���َ[� &���s�w�޴^�پ2���K=�(��*%?�}���k��5���)���_)��D�fJR�VnS�:����%�k�e�X��w�@V�W�D���5�%J0�>�
 ���)&�P���i�+-��>ӻ�U��K�Z[���蒑_ct����'O������v���}�&�1+١�,������'A
������ҧ�HE'>��/�y�?�ҡG��]��L|�[ϣ?��	�ߑ(��K��Ƙ�G�zY�֤t�Z��(2ߖ�eW��Z����Ʋ����"�]S�k���+�ǰ*�m��Y����Y��r-�j�?��H�v�ݕ��8Q �{���yr����؆cŷ$\�
&h�?�	)R��-��Xr�f�����̓�B��J���L�K3V�J%)w��_�����b�Q�)ϯ*Mg\o�FG�In,�L�M&*7gU���DP9�bL%4$b��a6�Ns�H��m;1]�!Fp|.���t�J��l
]��_��S�vm�׽� Q��AN�H���T�d��C����K~9��n�J�O� �-"���@vϦ��r|�Qd�i��G"?q����,�S��/�*n��w�N���:)v�w�%����y���%^_����G�N��������I��]��Ǐ�&��n�K���Y��d��D��g�>q�%?Lޥ����erzZ�TQ��"�<~�5��e.�b6�6O�&`n�!���np�y'{����;X��$jx�!=rO�F�v�ӿ��זVS����������(N,�k�C��N���9�kxNo�n��d�u�z����(1�%�Eh[Q���!�U!l�լ7�ؘ�͵���e8��FSd�7�$S҃i�4��H���*�	��+������a�>��]K�8�+��׎ܲ�^�vm�E������p���ߙ�����п�A��!\?"�Q~@��]m�U
oj!^�P-,���QF>e��~���jO�vX�K����j�1�@�g{�k�+��G~"$�ݳ�{�*ϧ���# ��U[�����D=��O�Ƹ�)�w*��8��gےߴ���~B�YR?��,������4h���]����FL/��א����R+QbY���f6Y��誫��{Ȕ����IN�J�6���y�͖�R.�%�Es�%�D�ӕB��w��PǦ������y���&!��O��@��D���"��;�ĕu����WO�����A%8v�
8�E��?�p1���Lq2T&:͋��_��w�%
��g�RE͵H�=�ZF
q� فI>Kߦ��B�\Xߌ�dIxE���{�fd��gA�̲�W�}qTv�i�>\�]o�����+�z�_O���.̪������	V��y�<$]�TQ���
��x6WE���!5�{1�Nk�	�j��H5��!�D�A9��?I�S8C��N��q�q�l2.bV/��l}Ň5�ćLĄ��N�ϓo_m��p�4�]�� n����x�׿��,�JYk�D䐰�&2��� ;�M�VT��ב�۟F*a���.��r;p��t��u�c֟�
L�D6��9��)r}�K�|�
O�
�A��kpl�O/�����X>Иc�a���t����}˩����z���5~��>Y
�xܻ/��ˁ�ik��U���E�f3�w���Ȑ�y���g�F��8|st��FcG,Q~y3����&8~y�kW4Ԅޔ���ְi�M���e���'[���u�����ɂ���'�c[�j���w'�����\������S1 ��WΤ�^7���0�<̽�@co�*��=t��3!m�Hw�Nӡ���8#�, ;�.dE>Ac%At/K��M�i�(�	#pʪ��뷺�G��q�k�1�q�k�Uq�qT���;�x�2{=�O����Q�ռ��7�;;�'ɖj���8Vi�D�NK4J���i�Y�����o��A
�)�I����-^2,Ǝ�~؋@�=�VN�:v5�7�D�p`4����9Hje�6�"�50��
�B6��
���Y����ɷ�Œ��0jT�G����2@�L�e�~��Ѓ�`��򮎢���IÄPT�d+�'C!~�+u>�S��a�ΰʣ��R_vnR )���¿���YYC�I��:\ª��0&�1��)΀Q�@+��	8�gS�`GsB�ݽ�a�����Won�'o������-N�߼���l�1�F+�|���լ?̝��@����ϟl���[�Ne�n[�9�k9�)���e?���s9�y�M˪^>�0tQ�;���m�N睓�}��_�����l��
�fE�
T%�IUHB8�O�n��Md\8�2p/=Y+=y�l=l=��}�Es}#�x��-O'�'\)���#u�,��y��M���Œ>={v[�Oy�-l_�[��u����[�?쿳N���������rd�CL�!_[�|]�'�^"w�a���@�̯
��p��w��Q�%����(�\l�/���}��߯-�^Z�m��)UZ�mz���)�-�6���˽�)�����eDh��drˍGn(ɂ��#b`;����t����Xo~�ìd
2�B����q�v����fo�^��2��*�juin�_}aI&(�;i#fK�K2�Ff��8'�K�W�ڹ!�0�a�YZ+�Ѱ�|�]��D�^�?�돏n�m9ՈO)��8c�ق�)�*�C��65S(T2@�ՒD����J��}6m��Ѭ�w��l��n������G����F�����e��N�&�4��{�����I�r™��j����[��ЭǶ��Q6���>�da��Q`�x��UbD48�m )��z�ő��:�R�����֨�;)4�P�C�'��`���S��i��Æi��V̇�\Z��G�b>4�M�<����{5G�j6�����*�&!K�m�…�=“vh��U��I;z�\�Σ������$e��'�;������Nd��F�$P���P{�n��]�����x�G��P�:R��+��;��H��D�e;ٽr
�'�MV�c����Y���<�rOn;WcEr@�N+��B�tb�5�ĺ���xńXn��4AC	����E�nT��MUٺ��P	�&���GG����#t*?�n}K�^�ҍ�zr�\^�~��F�5nZ1gz+F����?`l 7�7u3:���`:1#��;4��iY���4�HE�sy-Jj����g�{_ʙ"T�}��f	��)�5���_����c��ZE)|��8"���e�m��$-�l����?�[<�*}N2��?ڊ��M���#t�>�S9E7xu��/o���^�Q����v2a'3z��ɛ��ﺳ
�j�b>o�$��f��=�v��>�_�3��ݽ��Y��ݦ����g�����hք��]�����.{�#2h�
��d8ێ�qwظۋ��aF�	$��,?�j]G����po�y�$��"j5PC4t���3��‡�{��L�*�t��тT�D��cQ�Y��u�VQ���|g%��;����4q�[_�5�Z�qY����C��pjO�-}�.
3͏���ɨl�7y��(Ê�`$(Ƨ8�u�w��t�ց	7ﷷHh
RJ���Z���~�f1�΂8�����6�i�=�������_~�E�tu�3[i�P�%3{�CcT�hf��ƃ�G_������ڕk(�6�ѣ��?x����ۯ��oA�!��鷯�.�l�s؃��{`�8����a�<�e��uΙ@_�"d�w��(�^§16z=!y�Ӯ/)��At����)?٤��|��^�N$GO:�b_���ٯ;���C���*Uv�
v��������p�	a���z����	年Vh0��т�����E���:V���P���̉ξwU;�)âZT�1Fp���MҐ���p�p�6�u¦�{�N}�?�#h�֡K�	��ͥT�\G�S�X�98W�ju��M9�Q��"��fsE�Ry2����2��s��\���a��&kU�F�����+�i"_j���z��=O|72�(g"�C(�����$5���f��Oh˰8����4@��NT+φ�2�U�	��t&s�nV�-\#�9�֭
t�1���5?�{�R��QT}���nj�����J�v�Z�E����|:37�)�6hE.؎��g��7c���r��@t=F��$şL�RNP*0p�xn�����$U����?�:���t0�J�����Ӊ7��8��a�?a�g��(���z�	���Xº�pH-�rKEO�/�Zw<�Gꝫ�N�(nRXDZ���19	�>he暑r�l��3��i;�0"�B�Q�ق�Mgӥ��'��T�'SHv�������_�5�b���=�ϳġ�=K�\�d�Z5߃};�,*�z#ä8���ףX�C�`+V�!mma���&P@���(���3��c2t�:���o�o����p��j�̩�<�7O����,�{@�]�`���d!pa�5�F����VtD�=Y�2|֥�I��2]�&�������ޞ��e��ͳ�g
��-�8�a���4�@����pA�G~��
dg}�$h[���pa"�3��ET�d��X	B.����O�λ :0�l��eƘ΄ta\�ה�d�S2��q$N�6FZnU�;�b5��jĤY��[2�@�%�y.��2�a��?PKe�mW!Q8�AR-setuptools/_vendor/more_itertools/__init__.pyK+��U���/JU��-�/*Q�RPPV��/L�J��&g�cJs�Ǘ�g����+�*�[�Y��sPKe�mW�a�h�y��)setuptools/_vendor/more_itertools/more.py�w�F�(���
�s���%;��w����l�M<��WG�IP�EZRr��zuwu�AQN2_~�t��Y]]]]�|�-�&�M�"/��'OVU�I�z�-��,�$���]�d�(Yf�t�n����?�Q����cxh*��ŊEf
�]UeE3^�]��N�\WY���,ׯ�Ů)+�����ڂ۴j�t=J�l�[�n�t[s��,�d
n��
^�|u�_�l�N�t[n�Z���?I�oq��ň���[��D��/�]V�:7?��r����^�yc�R�^7i�I���Io2�@�ɗ���t]WY
�<�M�\��fw�Q�JLf�.KX�uy�eav�)�z�m���u�K��_#��G�|UV.]n�*��Ly���*k?6;���G� Ⱥ�����uv�.�j�(����2�&��nʢl�"_F��l�o�pq�v��j��d��i^�浼ږ��c�8�7��e��x2�:x�d:M���49O.�L��:d��q�^�|T4���6����B�|��+j?W/��Mfk/��y��������l���Z��i5���US�ǰ��3�w�~5�]6%T������Y��L	�ͣMZ�L�biY�UV��vO�&��:��2ϋ�(A�%`�f״_V�|ר���K�+��^�O�`��\��n�m�����|�P�F�5/`w�fr�j�,�j���[D���4�0o開0�M%V3��5 �{�N]��r���,[�7�t�-J�~��6�>a�h������#|���{\�PٕDT�S��aY���{�}�. �P{
�p�~�Ͳ�~L��
ٶ?}8U��]1�E�j�m��f뚯�����yvk��M3�pZl;7\�iS�v�ޮ�f�6��U�g������!&?�+�d82��T�z�@{�7���'��2���$��u��.
Ql�i�.��ӟ]���ԥ�
8���?h��Jb�����QF���r��I4 �ekI]Oy��ɻt
��c�"c/O�4K��j��p ��*8�[��>�
O��Id/�
�%p�!|����g��ӧO?�C�&����3Y���r�0�&�bx����ߋ/�D��s1%'��t�<%�G�Ǘ�c0�.Lx~a�\r���'���g��S�}��a�RO�m�^'�@�U%�JU���
s5�/+�΃���y�	��	�l:����5J>%�29�JEe�o�dWgI����>ʋ�P`]7pf��d���ȳY5K��s#_=~v	pGɐWQ;�ٛj��f�~�7��6cH�3`��7Y&L�P�"У������뜾���O��HO����,U-
�s�j��G��b,��"�"��t���<)�e�&�88�{f|Q��ޠ�A��C�U<�>M��e��b�p���QP[Xvȹ�z�����DT�x]?F	�k(-,����ہ�pq<J��y�J�á���Y��nQZ��!
���%�.�[�o��yո�8U�'n}T��Ȟ�ΰ؉��:��,�/wLV��*+qtpWɊ�ң�<���r�9ڹ5
�6-�r���U�	p��+��LW@����FV���l��������͞j���DZ�">+��)�t�᱑�u�0@�‘
F�[��%ZϬlp��!��aO��[!�_�݄�Cl�,��/=H蒕�P�d� �z䖡���14���9��s�N������*T�0�u�
�]M.�������er�4�죏滫z��o��b\VW�u��N?}~��V��0�봆+t��Л��X�io@P�<�����O���<���v�i$�Mܵ&�����`6��7瓁��l�Wȶ�Gɛ�m&_�M:��7(������#{�kg�ߒ�V��l��j�>�Z{�jt��a��
��	����t���ڍ.��D�G�Nɇ�ĝL�愂�]@
 �rM���c�n�,�	���6Y��Mz
�.Me�Y��+���e�^A��lwֳ6?C�řUY��	
…����j�V�N����W����l���`ޖE��;�ff�Az���L��K{���"�Th�E�j=Ӟ�
H^��{��Лh��"L�2��(����;�&<2�L<�6zb�
��4��e|v��\c,��6L=`��u	[���I���Y�=�:_\'OaY��Oq����Z��y�Y5wݟ�F�B����E��_ԉ��鞨�_p����Y�����K��Kr��"s���pX����#n'�x�I�C�0E�����W���"Va�+`oi��H� ���ekC\_vn������v�7�U�"b�_M���m�$�%�]��Oo�J�L�gES��B�6i��$�h��Z��b0u��C��v9v�_�*���[p
��+s9�>t������6����FR,o`��o�.�Cx�۞!Ce;�Hm)����o_m�a�t����?�򥻺�d�S�y3���l�ٝ�|1�捑�"A	^�s�^(l�.��>Յ�e�n��^�i@
b��(wH��p ({q��(q~H@�x�6��m��ݓ��n��'��f�,19�u�j�ȃxE���nddY��RV���j��k-A���tK���g�f�c^!�C<�];�b�M���՘� �%���W}H���&
��W���Z��׵�	ۖf3��3b~2i�u�䅭&2$��[	����E����ؖ�{ �R!��?u0�b!����X�-k�ߍ�)T�'d�@~��eUe�橦޸��g��rW�t�ǡOl�o�t���5�o�78�s�"G� DU���o\�V���b�Q���5�`y7x�R�ـCm�{8wѡ�.o�-u4h�w}b�:��ʔ�Tr�!��F�A�MYm�u�3�p*�C��j��4�&C4���̘j$a@B�Ľ�&�_$��֤���^��,�&�	�8"1��)��U�q�<�F����M~��GfpGp�}���>-=-O8C<ـ���UeOa�x�f9��4���8���U�\�>��"����O5&w�&�(!3K�+��j��W�p�‰=֘��
p<}���AގS���-�mZ�	�r�X�(�.��"�y�Z`?˼h�{�@�ˋ>�1OcD������ԉ�B�;TEŐ��_���Ź���'��n�#hP|r����dz�KM��� As�s@B�,���ǥ�ܝ#Lܞ�A0�Ni�{�T���
t�s��Z3cĬ*gs���/0�E�n�$ӄmb�fOm?`�X=����t��k�ɺ?�jԚ�h�H�,��|���+�K����uO�{/�~�/�~�~|���?�P��}�s��%7Y�E��bk�B'7MX6٦����?�y��wxDZ���XF��Th�@+�n�M0C@ ���5;~I�Uި�� 4M�7��M,Q����f���CS@���B��PD#(kJ�w�1�rC���f��e>C;�~=@B����lb�P�-���J�B^�&����N��@��𿷬T�D*H�'��_�KAx�9�C�0�t
�YA��-�����Z>�A?'����4C}|�����9�ף~N�Tn�E���.۴&�(/Ԫ�D螱2CG���,�T�ܮ@��'�h����w�9JN��?D��Ȓ��]�iM�)xK&�c��P�j,���iU�
p�"��)^Ef�8l@�lj
tGd�x:��|�� ��G��
�(zE��D�.6���|���Xޱ� �5��Z�ZD������>;9��{��Oei���/|d�:�Q���ۖ��Ħ���WQ\ajg�;@@�n��	�pr
��6Fڔ#��zJ��$Yi��m������l�9,�_k\ȿ��^�W`GI�&8P���ȓ��H�Zp*ȭʠ���ϭ^�-���ɀ+��*��&�����G�0q�=��o��r�[)�6+!�5>_P5 ����·���,��,��π���������Z�B��
�t����'ҝ�	�����@�Ȑ�'P!�+ГZ�#�q�ɴ�?9�?�M��&瀒Jˏ�D(��H����n��o�	�&’TY@�>�0����ղ��0	�	A3ϊ�5��j�2�œ����:��d��Vp�VW����-�R��3:%Y����y�6�&~Ȳ�����y�-�e�'����K-����
b����|�4�Rr`���$0e���2a܈/Q�E���9Z��f�d\N=PO�1��'f���w�BtVj])J8����d8*M'�BLD0���v
�>~�+xp��<��\�P��1
��沬�%�6�H��]3B�^i]���N/@aU��\CB�
��b]ր�%*NC}◚��C��/XE����&��q�;{��Q�	wy�2�g�mJ|��u�,��c{�.���Od���^t;�h�?{<��̗xүD���>Z�Y�{}�&����b�-�E0|)UZ��7%��sO�o�6��CfԼ6c����{�ƛ���>�I�
���IƁV"$E'*jQ��8m�@4��x�PC���ѶwtQ����0*jdt5�N�"�[H��zU<�D[N�z�^��+�g:Oab@�*=g0����`(Uy�."���ώ��A>n?|a�	���4
ȄH��[��8�W'5م��c�˲\ �?K>��߿�����������|��7�/^�y��׎�8\Z�97�3�N�X��@��ط��|E��!��YF�{��*��z������5�v�Yہ��o�uZ����/���BU��C��C���ŐڇAo�e����ڠ�xSYPi�b��\�y�%�	�?�Aq
�)A}��>��{`0�ۡ�;�������7.z�Mوi�&��Ot���ƠI�^s�B`xG�6c]/�萺{'M��{�$��Fu5��C��ö���>\TkC4�n��l{�s�m�>�b����l�¨sc�|�m3��}kHGo`VZ|���n��(��Cn��+W�<|ܮ&�D��'��Ԉ��Lz�� ����u$���f��IzcإM_-�ț��Co��|�ޅM5-�O��R�CU������
m�L�n�\t��i�M�eh��H�y'kO-���(r�}y/_��@X��?�r�*nx�9��o��Y�ED�d������Z�2���k�Y�
.�M����у�g^lwh]�v�5��荰Cs&s��V�|��{;�ӥô"]�p�b%b���k��<316:o���@<���$%����/�0����?(}��_3dc��Y13&oM٤kײ�;k�$Ş�Ms[�����1��n%X�	og���*b��nn�D��H���e�����
Q���t��
.o�%��Ѥ��~����1�S�\_���3k�;��o�+ͭhh
����R�x�+.�ț���n�mF",�,ߪ@��~���<��z���5�//���o��.��;ُ��G��e�@�����E��.��"�%�Ǚݡ#�ܦ5$��(�ܺ�_[S�������
�g\��g\o۠z��)?Ro�B)���VY�Ҏ0�i�O�^��m7�YА��|���"�5*�X-v���5����'8��C|�!���9l:J6g�K�<\������F�{jS.I��鼔m@˸X���������Kv�u��J(ej�=����3n.kzE���I�?�r�iJ��W���Ml
4��b��
(k�Zw�{�i�B��3C��#g�`�pcWAf�pAc����md�`�Mz�ov��t�!d��&��O�j��+Y���=�)�sd���}�x�Q��R$=i�	M̈-(� 4C�<�b�2s$�w��8uja``u��/L�q��ˑ-n����5Y�"/�dMx��Z�H�C3�����8����k�(0�~��WS��|�W��������	������IW���^h�~(CaJ^92��J����Y��9��s��,^�8A�(��0z�=����a+�'�ʘ���2����L�c U�7~ڲ�g��[%ӱ
5_dc�t���ʿ�ѵ�?�P�5X压\��F�&���+E���\B�a6L�MI��]�,C�c
�����Ys��@��ј��h�/�Q⇉��ȿ���3����� �art��,���N���P]JK�H���bMf�/�㞉W`�N4{���9N��-J&G/��nو�N��-�@l}xH7h�˄��5�e����5�x�a<q<���r��9�Ƃ��	>8�<lF7 �°
����K�>��p��z�vl����t�j75����<ʂ%����z��Õ�+��OG%m(ɦ6(�G��`�
���Q��6]ܤWhbC��A�/��F3y�(�p�)9�/����t�;�od��y�l��~��y��{�E��_�X�Te��I�'�1�;�;i��ђ|7����vf3���[����1�KE��3�YqD���I�\�$�!`p�'�\"?NѝD)<f�W�>	E��o+V{*�Y&3�}-�>�Nihk ;���<P��^�?_�.=�P�Eg�T=����ߗ��������C�ϭq�!��*��ꝯ��L��&�k�o�͟��Y��7�-N~˳$��?*7_ZdX��u��$��F��봾&9��l�o�|^5��g�M���!y���٧0Xc��6a�n����5X���9�Im,ߡ+i;_ɷywIկ���r@���<�N�jn:�Cb��C������.@2H�����_�)�^x��A&�@F5��j%�?+�kD�>.`81����#i�������ja�Ty6�_�)#���i���ڈ���!C��h�	�)��UBH�`?�ikr�8�����1Rv&�4JڃF��X,*��C\�hȯ�J(3��ķ�z�Ć�!	_9j��H`���(�j㋆v]Ƽwˌ�{Ks�;9�4��ږ�Wv��}Y1��Ai02bN����e2L�9����/U=f��&�,��Y�:�s���m�o3��{���Z,�?���&M��GeT��#�h���MX-�b�n��L��H �WT����<�#}�7�ܿDcÞ�W8W�}Y4������t�4�/8Wn���z�{�@��r��豃CD�Si\pGV

����4�<���O��M8KWڏ$�݋^o����@��ꩇʴ�\�6x�|��GF���<�����
��/��;R,�f�` |6T-�G���mj/y��f��D+|�Z[��Ɔ <�(x0Be?9�$>J�^:\�`���� Xlz8��y�qgXaȔUz�Y駁����L�c8�©(NF�>�{�	���Q�$&�Yd�A�y����ⲅ�FD�l��r:|U�*���B7�\��p�e?
����y����Mh�I�1�	��z�-i�o�m�l�/I��S:{{i��x���ߒk�����I��F����H�	C	]ूb���WaNz��bb������	��7�É
�ԧ-zb٦>�V:tL���h�NT
�'^��뜺:W�e2.�L���I�:��{��Ӎ�jѭbKȐ�b��ߩ�U�LFvk�Z� ���u�c;#��F�/	��+�ɯiӄ���\)�6�[%+3&Dc�Y�0�qŚxvg�,�N��|�T8���-�(
���K�%kN��L�?kN��~X�!��CSr�rV�wǗdK�9�CW�	�p�V��|k4�2qP��XЪ���y�1�S5�K� �+�B:
�$�'^��/���c�\4�v���UNA3�X2�L=[��MD��E	�ͭݕ��t���F��#�O���{�X���z���*^r|IJPe��m�3��w�}�yC#��{�XK���ޢ�zY9,)��5l.�zh��p�›/�0�k��N�`�X7"���*V�'s�ut郫��^��%n��������^R�}��
�eB��9k��W�K�P��x�nU�9r=��o�%脎'������D��#�#�X�8��1����sI�fK��e%l@��}�h�����$+2-����] �l?,�^8%��(�X�s���R��Mm��&�N���� ̅�� ����x�l���(�s��%[p�PC'�&m�
Y(��ح�xor9�$��Nf��L𴔬�ai��,�Ӟ�z�����D��_:�p[T�Q��&��re�d�.'�>� ��*��m}���[��"����0l�h��Txz�*�:7�2 L��M$�&^j��w�����۲`
v����[�O�Yb]ZjK��ۡWa��97��v;��H�������H��>b�f���¥��GB4��w3�i���؉>eΫ��x �������cB��b�(�+&�rM��k�hT�r�Wi�R9�̾db�3S5�6D@B�c�Z�u����S��c0ݚ�AZ�Qu
����z�D�H�w85�$�)��ף.��rΟ����2��r�^:_@�+�
�f���=h��2�E�Ma�H@R#|[�Ǖ�_?*��
T�
�n�
�l�]ʃ̘�G�֜��L*��ʞ��bO�^�i�o��]nϽ����m���0�5�/e��i�̛�rr�@�z��Q�ܧ��Ǟv�%��K��h2�;��l}�]�5���qF���of�6���k��L�-,�~Zs�V0�b����I%���}���}(L]���,7���3�d�����YX����/LeV#[	]l0�Qf��:k}�$���y�B�kY��J�
(p�ô�G,J}��z(�~��r��E�{��!��2&��S���6M��F�Ny�r�3�"�I-�xNsʢ�:b�Ѩ���z��:7�z0�yÉ>y���RtA#K�5�&p�/�T<r��!��Mql[kG|�N������Xׁ;ڗl+�9��q���2Gn��!��&�Q?_�G������"m,QC�� g�c��+��悔��/�5����lM�mS���"�M]ݳBc*X
{�Q��|��ERɵ�.I�$D���l�7pOzW�K�Xq�D���ʾ�vUBE�/�E~��[03��a����5��ߢM����@k�E�t��Ѿ3�I�)¢�� �&����T��)C��%V�ũ�9���O�υe�_�0
�t.��b��h��	7��q$���i���8&�M�7��\��k����˶�������G�B���x#6Z"w�'E���"��}��ZMٲ�����Gn/{�[M�e�G��-��M+�l-��X#yyA�w�G�4����x��y+����޾\&K	��
���
�s�*�A�'��_�ʛ,bKCT���z�[�'}d���g�Y��9�L*<����P0
.4�� �;u��8��1~1[�q��˯#�s�m^��S�y�؏��aK���m����6�0y��{�d���%�˭g=y������ɘ^��H�='��Zę�����WW��m�
��f�
�Uæ�jʷ�Rsm�5Jx�qfR���vWec��7yC���hW'4k�
�$�����4��/:���"�}��`���_��<I?�ۊ��oc�X�Hs����D9�����Xs��G�y5���v�^�̙+o�9�]r&F��R���9�g�z�nՎ�gA���$r42��R(�#r&���j�M�NL�W�&���v� >P���s����Ҳ�LySz���_�������<Y�)�V���B����I�ki���^BQ�CS�3����ÝZ�+q�!*���~����+E��~K����l)�G�]G�dm;N�AF��7o�}�&��
�,҃��.��k���S?[�x�_���E��Nabu�d_�sx�s7���==kX��|���}�����L����|�+��8�?&1/����חP;�n��-x���y�K����6	E5V�Ͳ4RK�Y��7(*.������Y�>"A�T�q@�`.���O�"1��iז�nZ�	����dqW�h[�
��st��8��:ۦT5N��A����� �d~^f���d'c��FʢO;���4��
�GmV�|H潘�a�-;������F
^'���R{��wa"�l�YR$MN�s��__���E)�)�/L/��"{

�6,YrF�~-Hcc�#��%\�
�#�Zh��	Ӹ��+á�T�r�5cM�s4ܣ߂.�����b�[���*e�=��H�rc=��G��FC�[\�w��<�,�`��1�PF��|�r�z�"��x<.7�9��?��=�
>0������N�������ߛ����xNm
*�
�ݼ5�>s����o��[���xچ2�U�CԱ{S�z�ٛ��az}��㼖�>^�H\�J�P�
~�eW�=dR��$"��#�j����UY����4�)w��}�g�)��#ďBs����`� j�x��ӈ��8�Ѥ��D
���9�i�=���<i�q
	@�fa*�(*@)G�qL��(��Z�	��NJpЌ�3P�ٷب?%�n$�K"��p@��a��C���ߨ���>�y�8斮����͕M^_�Tqŀ�g��PEk��4$F�a��I^��6�_G��Kn�j�S�]:�]�R�bc�)@O.��?���A�����G�h9����2p�<R
O?J�xy�TU����{"Z�?7�yp����Hc�ڐ�$L�P�n~��E�<�bWMseh|X���3
9�S����1UF��w��X ����跛F|��ˆ��"�(ޮ[��rEd��+�)30!��$F��ɐZ��fŮ�Y����OF��g�磏�����>�V{��/��w��R��Q.ڨ$���3{^H��L�+뙻��Ǐ�\{j��Y����I��=�a%"���N.`B'Gહ�UH�)f���sftBvq���բ8�Y��kPUb]�� �y�(T�+�̒pں�)����	���`��1�94�TX�8v���2���>}:�lt,h0�x{q��lb>��
�o���y���D��Uy����'�gr���}�"G��8yYC2��3i��U�-�h�)p@Di��ܢ\�6ZEP�$Ls�$h���GEu�����ي�y7��<@cƑu�w��=�A�K��;?@���6Ŵ�9Cm�_s�<�a!�����PL0��j*)e��LD�]�ՙ<�L1IUZ��x]�u��u��ka�$�'�ӗ�Q�
�/�N�Տ�(��<�U�O�R�"��ռ�
F��'�F���\������m�J�+�p4y�͌����I�>�P�U7��R�#v� M*�a(��4�+.�OCЇRq�u�{�dNLo��	�7�s�AiA{�6�z�s��G�����3�CQ|\� �"�Rc~��8[�����gh����9��c/����	%��V�c��%��M]�x�˵��
�0��zY�b�&w/���%˙���Y�!a$���P�LY�8L
�A�����sE�F�&��e*Cƽ�n��A�\��I8�gx��oy�/.���Lh�`ى8�m����6%�������%��@�_�r8�%��}���B.��"=0|���X�b�_Np&n'a�[d�#FhҊO�N�eґ*�7ޏ;-7<F�
&B+��:�Z��Jg]�o��M�t���V�#U��4���A�Q�e�FKܚ
S%�"�h�i�����@�ȴ
��w��S~����5M�Ʀ���'�1;�hi|�,��d�^x��� �K���]��3�S;b�6^(��;5׊~�Y�p���a��o|�q��)�����ˣ@L�#($h&?c�cF��1+�i}`�a5�Օ�{)W�:k��K�$�>���c�7$�_`|_�$�Q45+g~T`�̬��e�峣���J��~�7�4I���K��P�g�a���A���A#d�4ʇ��Y�K��0�ω���)���u�Qt}X+A��x+�>_|D�/%[� ��25)KG�1��)/v��od��v��T>�X�b\"x�Y�D��
9������$f�:�:b+�0�ӥ8���fu��})��D4a��&��sDR�94�����ǞV�" /����d�'=���s��vVʿ����#�F\��0�t��!�L������0�B��T{=� ���<�|���Ȯ4�m���bD�ޙ$�8�|�r������_~���Ư�%)J��e:]��dlg�	���NqanS+X�jD�t���y�;�p�K?D�;<�
n'O�◖W�䏡�+��a�H�A�gg����=�Գ��])�Wn�x�P��,:�|�7!�QfdI��-?��Ć��5ûsF;�^��u�ÖFT'�罴'DM%���6��ey�X�yQ}�1���.�Yҵ�m[��[��uvg\�1���������`�i�w�z�_��:�,��X�b�,t�C!�u���k���<r�N�)��|��F�ިli7"xx�c��`�Ũ���Sv�"�|E�`��g_]u�2�m�ZF�k�	���KY�,�+<�\:adV��v|��s5�6A���E�A�&*��#|����^�#^.?v�;95�r�Vu��g��mJr���˄ʌ����c��&N�<E�k����[�����J*
�J&[pi��(D�F�8l�M
�p���:���R�_X}N�X���9$�*�T�Z������I�''�k���|^~�3��%�=�S��O؈�����@߀��&���y�f�cS%)zx"���"����p'N9�40��?�r+m(g
�v�2E���,��d@�N�`}ל��7�co�P":��1z�T�Wl_�
�6@�@<j
m�ު�'�:�k�۬Hh��a����7�!$�1C�C$爫gϗ�l!q�o$�m��3x�#�:���N#�j�ŃM*�Ja3*�VZ([�M\":#Y��zܼm!z�j]�T�n;pjh���Mv?ŭq�a�1�*�kG�s�*��q��%�fhzJdJji[�0�^"�P��q�r�8�6����⾡-h�A.��Q)i-
�EL]��3��β�d����P��F���f�Q&~��ਦXJ$�ʥ�"�����!mAA ��M$���x�c�\���H$ό�I<�1D"i�#ȢI�oS�K�5�ZJ���Su5����*趘.e�4�Ⅴ3�%n����j4�M�`\�u]�&M.��W�MV�ȩ�Kx�E����
4	�E�d�L���+�i�1��&��ȅ��+ �I�	�N�*l	�K{�B��
�D�Ëae�f�B�pI@h��\@�ֆ��p�{O���s�O�5R.y�7,+��o��h�h.�g�.h�#3>i��l-'SD��x�����Cefڛ0��h�2��BM�7���]�)�ud�c<�!w�0g9�ݷ���Ś�b)�� �5��ى�C�����’هt[�\����#��ǔC2��m�N1"�k���-g5,����f7y�&jv��?X'2Q�E����TG(U�g��v��O"5���9>f�k\�G8'�@nI�v4p�oR�$��ql�%���gX���\��/�qI`�?w�~H@P
��f�HE���fB3�d3��F��Q�ɷ7�������߃�����q�@Ba����9r!�\����p��70gi����H	��v���V������⩶�;�!V'�Y��~m��p��$ґ�^�tU&#"F�N�cd�/�Q^����D�O-�,�������J��+u�Fݍ�$���I��D�]g�%Ξ�1�(Gќn)���L���&۔��rj���Cl��MK�OMt�4׻C���C�3�mlQ\cy}���b�Ⱦra�B���owЗuJ�s$(�lVkNWB�R:�c�A�X۶�KToE�r�I�+y\��b�h�y��3����+ԗEb���i�5pF�$-e���ˉ��H=Z�V������r���)���[GS�x^a�x�᪥�V���/��+d��B�`X�"H%/����0"�C{,�8��k�ZI�(
$�i��V�6����S��H(���~����&ƕ��tv��<F�d���	0e�*8m�ml"���?Ԋ�"�Ӈ���|�^�d�A�Yա�N�E��k��D��0�n�]��3ϧO������0~�Y?t��fu~��?�Y��w6��Ej�4��R=���6������XX�o%!�x:�3�c�[�hEڬ�W���E���(ɠ^fE���v'*I��a�}��Xx��ř����/�����[���'z��%y�7��f�#{>C�|��S� i�d�Ju��s��B�'?aa2GN�v���O��*/��~Q{g�e`D�%M׷�}��w�#3{�{]X 7P�(�c^\�ܸ�Pn�N.HA��&ɰ�\āByL�A�F�+��	n����C��9r8H��h�s��p��R�"���?>�x�UYF2>����"������TE�ۢ��&\YJ+�[ʼ%>`��Ʊ����3���)��0<sY�Q�ݫ�"#G�[[�N� �G-׬A�*Eׅ�\*���RT�����$7K1�c�\�����d����k�+@����^�=?�,>��)e��{j�<�9�0��aA���hK
b'�.���)m�i��m��Z}��؎��9�Í�PR�1��Ywm��<�9[nq9M�:�����*�-��'rəaS34��!��,�!~��95y��Ex4�Srpx;��zsn��d_
c�[�B�)@��sc� tݩ���o�!v,�b��$B�"B �z�>S�}]�Y/ڑ�k��J�O��2�qt��l��on˄�'�F��/�����"<���_�i��&�ݻf���U�=8�j�B7	�l2����w��~���F�y�T�����m��7�j�
�����b�,YFI��]E�ZpHR�$�ໜ\�媁�RjK�d��cb���B�,2�A[�{w��A���(|9���V�F���Ȇ�s*u�e���ے����-�˙&{?f����s��6�fK�Fr�} ż$�1���\�m�J�LS��H�n`˵��抐���I g��m�A/�/��홹w��WR��ƈF�i3ny�m��6mʩj�	���b�.�}�v������&c���̱�B?;6�����:��0X�@��b��&+��lK�+}�x���ko�Vh�lTc����|���7�N2�ʇs/���;�L{v�a�,�6�]A��fEO���kb9���ꊆ����3�+��˗��?_�zճ�>N?us�܌%&�-eg�ʽ;Kލ�_�scv�Β^o��D�r%�0j?f)��dC|�^��;e�{�sRo��$��9N��!e�nX�\ej�;Mo����4����M)�aDƏ6N�6�P\��
<�(�k�1Ƣ�$7�eIw��m�`n�]c��=LW_G<�(i�Fsdžy�D4-�B��x�r+�u���,�-�XƘ�N������ĕ׹'P��
�$�}Q����C%N>x?u�i��oF
�Y2����HgJ6Ǯs����0+cN��-��V��Œ����ؖO:��7���r���3��Y�av��|����<���}p$����@vuFZ�XQ�3�Uh�{�[��n;(�A��)��E�P�6�I�%�����J[��n�Y�S�{?�?�E.p���i}�+ƒ�s8�͸�ܴ�G�Π�D�A6�+�2��&�Y"��(�:�6�'i�=ZHօ&�A�eZ���f�<�8���fT%�2���^c�r�c?J�	~����22���=7}�ȩ�G�}�H����)ϔ���3BXy�'����um��XQ�#��a�w3r�����o
O��H�8R�(ۨ�{���p���x�&�L�I \��B��_ʃ(�K6�����h�䣓Tm���k<��y�|����ʸ��=�_�����oz�u5ѿO��d��D��(@�Ϊr���ud�|�v7x��bJ̚�ly�va�L���>�;���ݖ�g(9����d��֥���_bm�orE��.�4b���@a��]��P�f�g3�dM���拍)W�����E�V���2[7�m540f�5���b��x��>Q����iX!�*���=&�%c�V=����~zFi��E���oj�Ĵa��2}��߽���?^�����C��Q�ksl�^�d��ı�s!N��ƾ��N�e��������z^��	��2�+x�Ҵ�A��H76諕$�3“����ڞ����O�}���k.�aY�zG�v=�j�2+��x�Ngy�<�!��\�q����et�Nܩc����ƃ!\���;�U�q�jƦ�)�=�1��&�,5�lE�0�40��,!S�P��i���2�e+��`^'��gכ�o
-��m��]S
̘�Z:��䃇����wNսav����S��v.���x!�xq�(t�#�=���0ȓ�	�j�f?Yh�g�N�k����#��Q҉��	O��"��I�Ch�FQ��v�I�@�C�F:Z�_A�hҌ��VL/@��y'�9�Q~G��|̱U��5Ѐ}~?�@)���@�_�Z�Ka;�E.���Mv߉!��a5�=�$6�Nak��.t���MA����U�lmc�U�'!�q)\=S��!
�`@)ۨam��u�”<��r�FNDb7 �_j����ׁt��ܶA��K��7��0��j��,�^���#@V�I���f�U|���j�3��29����\�#"���!F7�x:E׼�4���GN����n���i�A�4��ק�#���9�n���c{��=V��>.�� ¹��u\�N�I��u��c�m�x�,�m���R��nO߃���`ٽG�v����E�������"]Y5-�j"#�U�T��|��.:ڱ�>���1��~���\�Л'�-�2K1�\�|[U�^HR¡`����¨n���e<�6Jb�9�b�o#۱u�Dw�S��������ig�7�L�p0���G\/��#x�dBr�[v���������T��np���!��̤�yC��2`+��ɒv��ū?�6�}���kx�:�����w����}�׾���I�iB����p��
N�˯ք�Rf^��1A��{(��W�v�
��ܜ)L�{�R���?�Y-� ��P������r.�y�<�a<�{c��_��8��+|�4�U���^�U'g\A(��#:�j�[h���PF��I��n�p˚�UʂR���1%��qP�:����4�4{/?��<�ٓ��ϭJ�����UͿ��>o�Lp�1/�"q6�!
�b|&�o�H��>/�_���!���\�r����V,b�����SL�q��ͧGb�+�3�l���)ِ@�5E�7v��p
\��z�l�)Ơa�e~�r��+�Y1���f]�dlC���v-ŀ����DW)ȗ�&A�W�<���&P���G�.�
}��Q��/���e9�hʆB��'�q���t.��rB"��`đ�i��ɷ�V�4�H#��m�hb^Y�ڇ
�No[!1�w�§��>�ȉ�ٽ��?������@N�B/s�I�_�')$���b�䀱�5}S�x�r��Q9��9�׳='z�Qg#C<V]�����O]KMA򤄶�#3�Ե�3P�_��(�z�\�{����2��c�e�e���6q��x';Ȓ��Gl�o���OJ���3�4ob�����9���>��Sk5���S���7�v��x���� ��!��ٺ=+$���S�2����G&�_|M�\<t��od��p|2ғ�����DZ.�˜�U��i��_בr�L�,���f�aì�8��	V�gbC��u	Ľq��-�$�������ǖ�c��fT^���Ut{��U��>&>��?}�����ґ���s��=t�)D'��~3�sGcԊ]Z�Ǖ��q8�<��w'��\qպwzV!'X'�p8Sx��t���rQ����K���}UG���O�N�n=
뇵F�m�K��=���I�	����d7�]�
5�E�C�zq�k2Cn���d�KW	�z���H�S9*�S�~�{�a�����E�+��m�4�D]�)n\M��]-рmj�1�6��_(��U��K&�zP3���tXV�d�a��+�>�&���L����Ah$�k��H�B��u*)<�C$XO�9��9e|��Oq�W�ኛV�5��ky�VfR+�ܱ�^��~X)�����l��?���%��l/�f��.nn�~}|,G����s�q-�Xcz�<%�e�<�w�+�똘����	,k��0V���ٙ;wGp���u@�i�W�=z����Gz֣���qe"�@�Q愃��xf��	;V������5�7��|�d����eՂf8���e���ar$�n|�;�!#�,��Q;ޓ���2Y�	�a>�@�y�����1~<Ï���G�@>����%�'K���Y�1z sGqL���.4\L��N�H�P_�&c~B�'���c�������%b���.4v���J����	����Oer��zK͈!L���	=l+o֘+��.LiU;��xC�{�4Y�6����m��|�QpW-}����͍�`�碽��z6kTdmd�V}=v�e��[m6�|�F��[�
ET������j=�L�4*w�^N��j�m�f��t��̠�b͓�Kg���:rPo���tRBvI��A��6l����� ���n��Gb�����C.�|l��hryq|��Vi��O�1�\J�=�j鶬s$�^ɜ��]�v�a"��Ag��vo��D�R��no�H���^�����:�W�C��y�D`u�l|�&6Ҟ%����m>��b��p��f##�Be��%�e
>ꐤj�XC�[�d�&��
�02}�
;�X�r���8��1�4��`1��n���9ˠ�Q�f�$����Đ#i\��a0�����o����OjhGb��6T˴-~�!# ��8���mK`dVMp��\�h8ݦ�T��{V��6�_������9���^uk��T�[���������7��	�=�<��>{;ip��d.�Q�=h�I��߅"���
��e�I.(AcL0נ%I0��g�|��ѷx��˴M�M/AkV�M�Iy���#��
+��R��8[s�ҽ��Ƀ[�u��E~�����@j��8-Z�%��l�g�Ŀ�1��0�7�����"��+�u�_��Sm��yy"K}��|��Y9�ȣV�,}{�at@6d��@���H�K�䃁�B��ܙE�1P�A&$�
Ҍ��L�N?gڊ{׎_�V�@d���n��t��dT�����b(��s�A���X6�5?N'[�a4߈�G���X��/mYxSCo9�,F/`�[���IA�c@��
���	�{[�M�@�g[�a{wN�iR��+�I21��v`�t�A���\���
�x��NE���Ʊ.p��橑�����O0��a��{#$�p�
I΀a!��������<�H(B;9_t�`LB[O�N�'�hE�-v��YD'����ϕ�3
s%6-�MD�u:M���Cӓ��{ټ$i�m(��]�d(�W�0�șh��$���a(��	v�w�]���#��r��\�+�)��,�1PN��b�����ej�1��/�Ž8�T^�[�Hn&ު.�S��}�CRO�8.�A�όp��<��T���R;��n�q4K�G�[��RT[�.�c�L)$�̴^�bdyz+,�|�\]��MQn�XF/����4�Z���H���\8��{�{��X`��������\6�Y{�������ƌ5�ֆF%��KUJ�I���$�qɛp�)G��yOM%�f���]��i�v��N�h��b�a��Q�l�D�1vBs6�I���g ��Ʒ��t���aW��MU/?_ֶ�Ҿ��'68��4+�8/�#�����V���J��N� ���9���#��; '��(4�D�u��%��m�D���|�`d�"G�~`��R�5ѬH��I��f��9o��~6r�S��LEhs��2��ғ	�6�qGc�.nD](�J�=k�g��!6�&�;�����*d/ԓ״�$r予M�7QI�L��Y
�K��{k���%sN��*1�P��(�|��%_�h���g^��w(�E_
�x\��,`Wh.�S�{v��R�LOP�u�^�E�eߣ2�������G���6�tC�C܄���l��v0A�Ġu6���o�;ʘ�`0#k��"�si~|�hDZ�j��f�N�#�Y^��4�X�#2n�}�m�	0h�^ꈽ̬��<QLVftq����ҋJǁe���q\<��,���\��;�n��G;8��:��k�؈l�oqLB@`�����8��N\D&➵-LJ��6���c�Ί�~J1Mj�ʰ�(9O�,�t�/�R;��d���&K@�%(73�m1�PM��Db�3�9)��'���I��r�CS{�
�^Ѡ�Aػ9�{���k>N{�L9�]��R�kR�b�4���Hf����e)�d6��*Wk��[�h��H��&S���R
)��5}K��Gޟ�D|AгK;p=�N^�4cה��t
;�yf���3(j5ل|��ov��N�d��/�=o� �9:9]4%�^���W&�w����H���>}8�|��6W��2��z|�nS��\����/�l�neJ�e:�<GV��Q:cUmiۏU�����"�Cq��y���M�%�=���|�v�i���6.I����-Ş�F֨x�*;B^��f7�P�&7S�L�נ�
s��c�|�N�)���M�<�X{�S=��m����͎o��F2�"� nM>�|���[�ǃ̽���@1#6D8��+�,�<9!b&�0�M�� �\�$����6��^b���&*��c�x��͒.;��}�HE���75勓��y�qK��b�L�=��=�ॽ�IRʒ��
�;��AY����tا�k֛��>k�v����O�s�c>��Z��6�sޣ�O�cy`"mRn6=�k4,�(���ZI>9�y<2{.�l��&/i��"�J[D!��?�4���`�~�s��}���j���B�D!7�^d	�4T�{��\�;F�a�F&�6VޟƹYL"�Aaa�tה������E��(�o�eV^�6wc�/�,i�V�o�o��y
1�Bm��9����g���#���2�S��Q �|�lUX��%��=y$RL[��!�"����!Q��@T�Ɣ��*����V���t�w>i�-���� f���l�5b�-mV��ёi�
�<�?�=�~V�D��M�8�u��r��:�	\=��pַ{����|h�Y�se����ژ �G�=E4c�Xb��\���C:2Y����^W��<b���1e��#Wfšw��T����p�-�Q�ױ_����#2xHg�5͸oX��gTX��Q,`3:�k�}!Iw[L��Ʀ����^��]{����IRti,��y�|���V R�j������d�%Y��p�gE0L���ɂM�d���CW�bʲ{����}=����lf�c�Z�E1�M�{*N�ܱ��V��J�ϑ^�a����yXr���3t���>��\;��`�f|K������"�|kv}]��nG�RJhGJS�gG�SJg�[�0��Nڰ[f;�7
=]�c��q�&�	`\'�`F0Q���������(O���>;��X��w��kt�Y(�>mX^È���ӹ���[)��G�1�W�dn���~�|�Ke��#(l�E,zOv���Ҵ�!�F.O �i	�mj�ܶ�
|�1�2[��J��"#���y9�d?f��P/8���s�x�}K|��$�v���������7���o40��P���4�ᇆ��WF!�!�Q �l�J�ڤ�5�t����s�� QwJDJ���S����HvW�F�{a��"�L��|��">Y�nQ��H����*h�)l�/��t�->dd#�HP�Dr_Iၟ�wM
/߄L��@������c�C�z��_�dSܣ$D����$�C�>>zϏ#`�52�c;ɡ��Иߵ��Qs�̔�V�1�t]�u�/�c�4�����Hah���k��%�%Ӆu�wQt�tWΒ7�SV�So(Pz��c��Ӑ8�SZ5��Xlr���'�D�2��@��s�,��t1;�Z9T׻���0;�Ej��=����)����ߥz_4'��x3���:Z/lJy��n����jH��8�w��(�d�|j�rޔ�T�� cOQ�����:�v�6��8@
��]�@�۰§YZL1l�X2��IϺ�#)��:�����6�y 8��a�PCԊ]$!@j�
��[J괐,aNQ��8�nc1��é�j��0Eطj��Я�V�;qD�
B��38\�f�N&l�����M�<(E��]x�C�t*�u�l볏>B�]=�*�+���҃������?�0]�ʣ��J4���$#���d�����=��Ca9J��j(�E��@]���W��������4�j����y�jn��;5Ƕ��J���E8i���N�f��|�	SVAF�j�[����]-�\l%����eMv܆���hq�@ݬ��U�ɮJ4�pg50��{�v�.fe�N;�.�m��l�*�9���{�ͽTU	�MtA�=Y��E-���$B�B%��v0�^�Y�A�;�TŽ���}m�?F���lJZ�W�)��^���T�)��`���K0{1�l/m��sŽ�)�/����@&�
� �Y�����I
e'��B����DA��$}pFc|�IeɆ��&zY�����Ӂ����TJ�K���gI�)I~YMYڍbf���h�K���6s�KBq�:l~{���\-��c�Ï�c���F��"bhFJ�.+�;������%�&�!��
M��k"�$�#�sEw4�E3�O�
����5�}��>��2�	r6H!��A�;�ٱ����d���!O�J�b��K��an��:�s���+���͝�FO'e>���a��H�h/>�c	Oؙ/S#���3��lF!��T
��l����<�g�~�5�B���'�=�Ɏ&}��FN���o�[.���v&��K�X<��}n0$�[q�s�Y[�u5/�֋c�[+fE��̜�I(۔Ѐ�m�k���;$.]���t��u�:B/�7�S�s�c�X
�hb&V��5Gؔ��
����6W�7K�:l�.� ��Q�g���Ft��M��yp��D������q�K��������b@F1�'6�4�>׷d'.;��X��fM���|�ʡ{6���f�̍]�r	�A`��gn=�U�����S�9�	�Mj��9\nN��7{l6��(���9�c�?�gi�9��#䡐�-彊��b�"�.�Q�c<]_ֽ���6�~�M�O���x�<�rB�*�+_�0��;�� ��\�5~Nx�;R���E�Ք\�Q��V-{<�P
vOD�M�ݗ}{��>�KOu�<H�.�����𻢟��T�b�S�_4���Z��!���o���~��;iC��
����IC�(ES��`�S��ؽѦ�6�X3�|!q?�-m2,�!7N�5{P�)������&Q���#��D�ԟ"i��M�d�W���-���I�a����jxt�c�<|���}PL��1�a�&J����I�d,���ْ��z`B���xi�qN#��MO/�KX��R<:�
�##��؍u��ex��0y����/�D�2&}
8��3/��J��]�D�׈R׭��u��*�k��f&�r�I_�4����Q-a�Mz�ov�ʆ�4r�EP
ٰ_b��U�_&�-&BZ�[sؠar�b}��U�v���g21��$:��9q��F�?)�*Z�cA��h�[�6�U�����hn⩉L8���ejȱ��
���D��8��(��*�Rl�̟1����P��5V�r/=i�)ޝ6I16�CΒ�
�iq��H�d���0]P-��k8�2|o)B_��� XN�/���ڙREC۲&����#��ʪw�d�47Q�^�z��X9�؞��QO.z���H�d�ݚ���pA]\��$�W��*�o���B�$����d����v�a�t��y)���8�:)����Yӷ
�b�
�qa*c$�K��Q��>:��6���#�k{e4�%���莒�@>��d�{(7�Z]o�T�/��p3�&�(�X����"�HA?SB�����7#�F�gBY�N���7��=a������0J7q�!��[+mo�<����W)��
҅i � ��fc�^C:�+
�E���f�zML��a��L�N���X6�ח�@
,z-zQ�N'���|N0x��H���Z���?a&t�u��@����FZ�䎩�l;��s�o/��K�f8
�g{�_ʿ�����nQ���q���y�B�b?i����
ݧ��
��6*�c�!՛�0�z��_��
�5�!.o��6Ǩ[F�g�;Tw�GJ��Z��l�
,��P�i�n0���c�(^�k�D���k�L>�k�IBao��8�<;�Q����~���� ���j[#B�8&V�ͱ��	���i��2�m�u�@Y�i��)�q�aN�)��.u��%t�@߈�o�bP�{��`-j���M.���)��-N�1�"��c<�5}����,����\�8=<x��8����̔��w�x���s�wr�������JA9~�s�;���%#�^��<OiU��.�)�|��YD�B�c���l9ȵNj�n|~fs����"�[z2���[#��e•���h�@����,�0�j}��uZ�ݬ�70r�Xj
��qbV�K��t9�j��m�&GaH����G2�2���Ϛ��fe�ϭG���t)�6y����Ϡ�	�7	�#�#aݲ\�Q�Y��W��ͷ߿���?�^��o��~��˯���Wr��o��=�Ud �y��M�,y}��x�2�,6�Rv3��*Eg���N�k��Cp�[�c�i�Vw����E�	N�6KҦ��De��3���9,zV�;����S ��S>��{��ܲnFY3�>Od�3i��(.�`Q��;��.�Ej���	Scb �c١�*�U����rJ
&*�]�ì���#QꗿT�����F1�H�}�M�QLee�_��H�B0g��4E5-d.o�'���ܴ��b��U1�,�.����&ԥ�@,#���
�h[g$)�ⶬ��2��E�Ѥ�֙���	rMTь�-05$5��ݑd<��k�hEo�l�����K:�B�b��r��}	�`l�h�ì��~��1��)Ш��?N͆pՍ���'>�
�u��{*Э��9�ɿa���ʻ���@�˰e�{^�����/>%��8Ձ̠+�9��2![�%���xI�,�6�U�B���5B��CeF���
�,Oui����H]T�H3�X'^�����O��R������k����:e��ͤ�g��A\�.\ݺɁm�.��</�P�V�T�R�+Ѿ����nEx��es��ч�K�E2\$=�	D��.��r%E�it:��i�Q�ܱ=�P$���DIR��E�ަ�cR�PЙJLi�f�549�"�±�;[��E�j�{T�
�};�����V�H�	?����=�8Q[�WV��L��]��l��*C6!q�s�Y,YE�F�XZM{2L��k
-���7��y���;͗w�dk����i�����dRA")�Q�8��5 7����[ME�-K�U1!��ז�H�=5r���^�_�r�Բ��\���[���_k���|�ƀL�9�?l�>�C[�|�1
	�R}�}�2�!+>۰�Qf&^|#��9H�o��_{Ř��q����R��.w�%�[���1?�[��1�ɘ�F>�v ����2Y8
W\٠��Y�2wə�X��
p�z=����W�<�9;!=x����cw	V�&�?�����P0��� v�M����~�����yߘ���E��lَ,�Jl���Y����!�,Dy��M�CŊ�)oF&�*+8v0�����+,2̇�c����������>�}1�B�B\Q?'��c�d��ɜd�+n3�����F��A�Iž�/O_��?���$_?u�	��>{��a����;�����~OZ�2��~��т�6E�-�*��;�4��_�'�˫�7������3}�2g�Z�V��,Z�Gl�'X�
'K�g73��li�cS�(����ߍ��~YZ� ��=��Bf��"RiGq������������tmM("
�Ƌ3벜��&�f�<���G��o�����~�qgw�>�G���Hŝ����MoYЃQS�
(���Js�:n��dM�/�P��G���A{�S���qh��Jl�ILmbf�3�Z�@�����Ir��h�����&�A�iT#�w����U���O�~�#`%���>��+-��na!�P!�����Ǚ����dع���0XŒr�iɓ�c@b�
��i��*���oEN��?v�
��&_�����K~�.�֪
u�Cu������?M��5�^��k�T&�+�p]��w���N��X]��aȯUSd�(�ȑ4���Pp���**�Y��W��a��Ɲ���Լt�!�#-�m�J�v��և�੪�J">�����-(I�{�Z3�PS7�Q2%�2�S�X\VfڔS"m�I����A�gEq��TF
b�8�?��R6
�"C�4��V3h۰�V�ASd
��<���m��%s�����,�pؚ?(*'�L|k$pO��@����C9��yX��?�S��k�,%
=Ͷ�"Rsp;�Q���u~#��L�!l�Ƞ�ٗ������Yo~d�c��e�_j���B��{1a������q���Q��BW����HDM�2�y,0�h���^J�Ċ�ɜ":S��JS���D_���K�E��
E{�0z�0!�����5��:��;�J|
w����cv
7���a8͡�mH�є�`.���C�e58�r�}lYa�p&�ў�[Is�uM��`����O����7�TZJ�f\�gV�b��a0̙�n�k���i��o9�:��_We�d��rn�|��P;(;K�:AK^c��zSX�L�@�=f���H[[2�^�
�S�pߠy�-u8t9��3��8a���y���kϘj��pc"��<Ş^uیNz��M�ШG�-u4���4z�z*M���mH����LH�j/��N�9CK4�.��ӱ�X$���c���b���.�y$OI�&륰�Dt�E�?����Y��ȁ�}$AEкa�!���&�����Nm�99,�5��ћXH@
�b�fސ�Z �G��@iq3v������л%��Nwucl���&��C��.�\����Uc������s�����
AS����}�di�^G���h֠2����\�n��yZg��,F�Rd0\�ihrBVXo_����iI�w(�3Uؤ�et��9�ND�̶i23��l�@'�#,pG�X"!>�q0��o3�?a�x~�h�8a�С@��~=�G��KZsy��|�PY�gO��lFg�e��f3>�/�:b	.6��B���2[éT��:�M����%��MV��㜱�=u6�w��X��@�p#;8g@�	#Z̳�p���a0����+��ͽ��(Q�f^L�$�c;Jm�S�f�4=��,Й���4�ڭ״k��lBd��,����f,�V�����䙳�2���vł�vZ]���Η�A��(�FV�#nhW��v)b�L#!��R���W�k	��I�-�G�*6��搎ی�?,Z�Ć��ybpPz#���B���\���fߣ!�Ƙ4�������K�XR??\�Xl���w��rx�jS|��{�Z{�S�uZ���G̶4�B7��9��?i,:�_p�둜��g��J�"
9��m���L�����M�8H������7��/Qv����ky�ߤwS��֑h��2W�X�½)�f�c,�Q�`��`�)L��X�5�D�q-��ٟ渾�5K�����̺
��uC�&�G���3k�,o45Ǿd%�6�~g���##@���Y�����iJ������)���3w�,{�z*6F�^A�``�G��v���Ȕ��Ȭ��)�S<��|���
����A�i����@	�j����&o|�G>p"��iƙ�ﯶ��1fԇ���46��+
��MB|a�h8_c��v��z��G��4n�f*��J|o��~�[����F;�Ђg��<�A5-JO�1p�!�V�ؙ�3'�Ğ��-#�����M؇�٩q�g���f��<�ʋ��M�\bY��ha��x��\�k�yOe�R���Z�ulWR͉
\�C4 ��u�7�kU�KsGmŲ�O����Y�#q..V�~0��0��@�w�ۘ)�[�C��ǒ~�%��C�|�ym·�G�K���Pa�v�ۊ�r,�0�O�tm�m�����m㈡��
E���8R��Nhz�@z0K��xei-k�V���Gr8�쮬�5P"����9��Q�M���I�=��HqBd��y;�%�Gi.�t&��#	���qo�>W3o���aH���Z��qm�Ow��0{�*-F���IC��=��z�g�({?���2��j��`{��h���G��ɐ-��L�����$p�q�}�����=x	:x'&V^����>��q�!�H<��V�����_g\�T���Pe���:Z�����=�s�k�=[����í�)����9��!�Y��F�֓��ΕíL�+&vΠ4oT�>W���h�<�����J���B�8���J������V��j:�)J���7=J�-]��/�
��j��d�tM�#���<"��vQ?�c[Q��=cãI626��h���|�!	z����R7����5�����He��`���?�),�8�D*�s�{ag8����nn�X�CS��q%=��ڥ;c9��"H,t"�$�Iw�+��#֌��eRn�i�P>8�?S~C�b��O&��gd�D)vKI�s c�$	ي҆�RcM�,h��XÜ��қʝ��
]�13%.֟W�j����On)Ք�YZ�`���|5L#�9R��.rM��0\Ŕ�#��n‰�]lcʹ�&��� ��WT��Lv^�!I����)ziQ;�e�$�@��$��$��T�ٚ��p�؎�+YI G�������r”z:1�!Bez�-X�`�zz���M̟z��M������
Eg˾
�rg��`�jGc���J��赞A^��Hj�B�6��f{J"Ę��骨�I�����.�+�&�\��A��`�n�_7 B�qg��*d�pQ�޹���@f(V�ү�c�}��l�A�5����ݼ���H�㙇�7P���E�ki/���?��p��4�J�D�Ŵ�|�V�D4��O]���"�"��g*���(�Nud�!G2�5rS��!1�8J�dW那�@S�su@"b���L{�Ʀ*�8�w�PRi �.�(��ع"9#���i�fc]�vB�:�_�����
��B5o����s�R�o�D�&�h5�5��J��W�9����B8|W�{0p�h
$9\����Q�,�DO�{`������Ll)A�^~غ�
a"�[�v��o2C��-v�}�5�:�٣��+ �H�O�C�3��J$MmϷf����Eү`�ӒB�1���%�W�ld�0�3�la�%G<
�%��ס;��[꫇��
n�'�a7���sI[b�/ѭBڷ�~�ݸ����xXTt�W�1���g��EJ�&�t>��d箩݉%?4˿޼�B@7�"��AE ��Y2t����%
vЙD4�h:���>N/4���ɢ�P|Qz=H?3�\�	86���=�=D�N����ȷ�	[Set�L��dF7�:�5؏{&H�[e�l���
ĝW�#��渱�V�5�O�L��Ԯ7-��
��H��C���%*xk���JEg~��!��J
��#ԍ}}v�0������nP�o�6G�B"�lzi��?���[�t�c�s�~�˖wHX&5��d�r��%�\�n����n�Ǔl�p;͙Ջf��z�{��Ћ��}wc�-;o�5s���q'��scL��ooP4<���֮������Am�i�dY�U�{h�}�T&�x9¿AB�=�	��{qI+?b'���|���.���+�$��
���a`����a�q�XlH���yb֏��,���̍ku2�����a��(j�o&�ᄋ2��l��l���w�-t�.��j��
������(����z�W9X�x��~����a�]�,��/|���]�򈾍�:5_�o���@�b��#̕��dG?+ew��%�5D�_PKe�mW�ʀ�8�?,setuptools/_vendor/more_itertools/recipes.py�;ks�6��+pN]�Rh�$�d7�x�晚ڭ�V&�w{.����5Ej	ʖ��_?�"E{��|��DA��ot7Z��矶��iU!�M����NaT�����u����K#�:�oU�J|==;{S�b��h���Wտ�ԫF6G�j�n�����z��J��).�z���V�{#W���Q���aĝ|��
���BFөH�mwW/^ ������u�yaw|�q�޵���������&�@���Ɯ=y]�ʒi'�{�oI�]r&�_~'u���z���͸�}�گǼT�u�����ڔ:�/�S��7�l�r���3��ݲ���20m�Ȩw��m�0���
ė����Q�0r���<;[.eY.��Z��>���n�(]���?ub*�y�Fֺ1�m�~κ�m�*�H���="S�ꐫ�Q��lˈ�nx'���T��>��Q��iug}���<;CU�G�G���=3{cD��0�U��Ie���{����7]��f��P����i�j�V�Y���W�z��� ;���i�����Y��d�I��H����;�Y���J]L�	Nٚ�	�|!���L�+�ׯ_3��T�~&��x�_��R1O��W|"�
����
ϲ���Ug�T�2[D���⫊!<�3����x������-8	;W��q�E�8���]�׳1�X��k�w5��%�f�Hh�8�Xh�V��Ep�ө�x��&�����
rq�!C[!s�Eر^V��&��Ё0���p`�U�
�ߺ�p�ht�kIH���M�'�D�BxyC����صi8��z*�Y�'r2`� �kQ���p%b2��,�:�W���r|*���_	��T�$�φe�9+yz+� }]>k7�2/eߖ&���0'�`��ћ������h�_�f��|3�0�I����05�EB�]��[y(Uu�ٞ��t��/�*��7,�g�:9�U;3%�Hs����Z���
э*�����5�G�wT�u�~�}kI��\<�r�`��A�y�����]]�K�
`�z�"�%�4uUx�vA�	F'�=%/�ԞA�l���G�Trk��nj���J����Y��|*.�_�rx��~i��L$�� +s�8G'�
i�>j`��-t��<��C�~�±U��~���}"cb_�w��t�x�R��${u�n�u�c�+A�h,�}�1,�˞"N����4g�߈�0*��i�aF�y���e�.�kQ�͡��������"'\�fK�E5���M{gca�6�d<�W̘=�4�}�CGs��P���M>Qڀ�6��ʯe�GG,�<eS"�&��38uQ�A��5�,!�@�t��yD����6�Gq���e|q���9���h����H �=%�R�'�'�u4f�/�g���X_ڬ
OR��B��X�b�l&�5��ok�
�SW�ԏԡK��j�@�	O6)m3�\P��F	�㇋�#�A_\� [;9s�w�#�ku���X�
�C��V��K��
"c7g�n�ŠX�&�v8�]�2 �XI
�DAx�me�
�).��ن��A�Ϋ4l��i�˺ǟ6bdzޗ�>��*w��d�c�쫽.�plW觮2�A�]��鳂س4��8�Ϧ���;�.gC	Yr�f��R�4�8�����3�s�R��`L�@ޜK����[t.Вc�����p�E�M1o_:$K^��l=(G�W��;yP9�>Ô�Ta�:�����F�y����h�AO��YE9�=��1!�ns[H��?����ٰ��GUC	���RZW)C�ZƩ%�_�Sz���ԛ����*���byH���N���QY��y1�&B����=�eW�)�HY%��6'�F�{�.�&x����F!�c2��.��R�%{�'��>�K�	>^��2pm�r�ޒ��`w��.�+!*Z9�qe+p]�E����"�0)ЫS�G�h�u�k��
����޳�R�'��z��'Jq���.CāR��~��4V����%����[�ūo?���_�Jp�Hj�/{
bF�$lt6�J���iE��4��w
KW�{�@�d�x�B�Zpސ����@��P����Q�l�~�'���I���M��_t
����ز�J��j��r:�с,W�Z�&���Ԙ��և���ۼ�I�C1�W�Q�r1/��*ma���%�y�6G��p��m�U9������
>4M�00��ZD�)̧��������ͦ�%(/����1�5��܍��`����w\��l%�8k}P��p�}uo0X�u~���Q�^�ޒ��F^sFo���F�2�����_hW�^wjs��
L���j�Jwk1�/I�c ��Ppխ��`�L����*��彂�4�4�?��dT�9D|f}e/uC$/�[1���..� ��+w��v�I�I�w�%���T����_�Zq��R�#�a)x(:�vCɢhXjG�9��
�|�j�\p���/�r0eL���a��xP����q'�:A�z���i�3]���3] #��B#��������~�R�"Y���B�0���
?���1j���������6l��*���愀���@rb�a�/��w�b��[������1� ,A�u_/C�2Hκ�NU����u�m�E�&N�i0u��|�^,����\����x�	���}-I�O�Z=S֚�l
66�ڂݘf⁂؎�5��Y ����	���Y�Eѫ��X���1#7�-��	;WKw���α�7��{j��8�*�N0���;�� %��7������vbA�ąA�3]�.d8�7���@��+��8t�F�f�3�X���x���#>��QoQ�,�7�k|r*�(���4z-��B�3�p���!$��0e�.�-��.l���Đᐳ��5���ߜ�5B�q���N�&z��ѧ;o ����P��ٯ`��]���!߸3>V�49��(3�=�6�t1��"W>�[d��p6�%�~�QըWy)���p	���{��1�C�*9#�Þn�s-<��R�ڢڻ~�D�ƪ�C��Q�j��)�>����'Z��]�=�}���s��b�Y�/}�-z�mݐ�u���� ֛Ɉc�q��CG48������v��ް�6�jy3��eg%}\C�u���h�����e^E�@kT�@u��8);%��Fo��۷o߽{O�3yS�6��Z�c:�6�%�5��6�BÕ)�����N�;�+$�?�+ǂ�J���9��Ew{e
�j��짤���8c��AZ��l���l<ː�,k�J�����zO�&d{��f^6;��PC�']Lc��n�8lI�
���z��Yل%�Rԏ'7��xd��+r|-n���4�k�a� �.�_�]5&��Gi��ӐY�VC�}L���?ʊx�S����~FN7��d�
6�EU4e*>�ȳ��y� �&���/KSҌd<�5��E�A�h�-%�s�i�Jq�L:�3-�.��ؘ���K�����R�(�2��B��W&v�o�n��Y,��]�%�4o�(O��'�9��oe�_�;J��93��c��w�`ש����K|����(rS�
�_��Z��	۫z�{�
xKlM�ۯ�|���}���]9����s�&��:�ӽ�H��C.�J�eK~�Nʻ���ڵ(*�:�Bd��+"E#u��w�30C�V�Zr�ǚ�Z�mz\�/�p���GoC�8Sa�R%��a�X��!q���e���@��oEY׻��R�ŀ��9ZNw�.��B�n�w1�r�1j0,�}#o�5,[k�IQ���XC��lԞ#Q�����m��
��z ����M�&�pS՝iXS�cN�'v��@��xf���~��3x�ۓe(�=yG�g�u�eP\2x��|�+ 8�����j3�}�'>݅��X8�WpNZ0�]�Ʉ�3�ί�A����딲uB�b���N�����m$W��5���F����=sՓ�r[��iAC]��`E�����oi�˳���U95��"�׉(:TX�-�%/�G�p��8��B@��:�]���KN�p�lg?�i�<����q2��&l�Y�rfG	x:���G����E�z�}3-�v�
n�XH���������@ꤙ{�p�'}��]�ܔ�5��gƽ�t0��|��
}�������78����d��E�a�c��ۗ�B�%q,�P���q�ڜ���V�n=�G�y�_#v*M������'�xk'4�g$� ���w�I�4�[eR�2�E)H���Џ���Jl(l�w��o�-_`P��p���/B��2���#֏�Sh�������W�F�U��"�zİ�i�y��=M3V��Y�;�o��b�ߤ"��.Ÿ�ԲwZ��2.�$OZ����z��NО�/|���X�P�l��rCũ{�:�7��AlJv��n�����Tמ��\s�0��C7 }lKr��B���=�c�zj�gn�:=ܨ���ʲ�a4M)H����b�Y�6���#�Q:ә���K
�"d9�[h������#�_��oS�H񃘍i���7>���"P�ȅ��Ģ�V#S�}!�bzv�~O��!��$�
_�x�B�3�шxE�
}���Oc��5L9�!���%f�B�9_T�ɩ?���6�^�T�q�"J]xmؼWޡ��;F�1�q�E���2�s�Q����w��������	����bB�')�
з��XV�cN4��h6�b�x4�J�?.���O!�g����X������,c��~*��໬�nE+������x���~���d�u�(QGO�vNx����b}~�,��>�u{?@��K�4`�SGL�䮿��+��w����_�V]EI�K���@0��m�1��Hc;Ƌ��*��Nt���1�ᓂ�'�uޢ}suua�tnξa�3����;����|��zfi;��^ę5�q�bEp�}�^4��̈�v1p�PKe�mWZ�k���)setuptools/_vendor/packaging/__about__.pyMR���0��+D��e2��^Z(���CaY
���I���c[^��Wv2�s�ы���;x)�@A�>j�:�{��G<"0�)�r�m֝\/kZ��9[��=4�m�Ӿ��n9-�3����z~�ڌy�x�-
<�.;�H��y��4d�Y�	m5x7�RC��Q)�iv�A_�3�Q�q=}P��ɲl�Ih��6F�_�W��J1��busB�&�����c���t���ID���n	un^<]G���o�#
kq������U�*�99��1a�n�\D����!Q��>2���~%�c��2�}Ѡ*�J��}��m�>9�Mg�����&���tβ�K��ݷ��ϼ�!�Zr��?;R����;�L�n�N�*�*lZ��B8wr|��P�=��[�PKe�mWeD2(setuptools/_vendor/packaging/__init__.pyM�Mk�0����l��}�}�0(�t�2�q��V��B���$��xɯ>��=P��B�]��"v�B�: (����$^G�氟�j�A�ġ��s�T�
�T�v���4p@���}�u�-
�ĄYg�<��ȑ��zhُ�C��bS����&Ac��Ȣ`��]R4����3]�a
�?�V����1��I��C�e�t`1�^t��E�4hA��,E.'+ &�\
PRw�OBE��^�cU�.[��N��yS�j_��X��Y�m�B�-
X�(�n���PKe�mWJzBh'setuptools/_vendor/packaging/_compat.pyuSQk�0~ׯ8��xx��/#�A�����BJ�� T���ɒ+�����I��ftz�u>}��w���p�j�h�:�@���
:]�@�h����V��ݦ��:i4�¼��A�*�}�\�9lc�f��۬��:Ƭ1>a��q��^m,��iz�
���������w9ٴ�z�Ψ�#O�*y��X����]�@�
7\�XB+��[��#�������W�o�R~}YL	T��m��-Z��J�9\˒=t�
m}�����9,���R�f{������/Y�G��)0x�$]YD�S��:��9�*��S�����W��!�K%����>��,�LC���Y�gKm��oEQ�2��9�oM&���,
���	�H�I�S����4y��K'-�2�Jhf���"HY��PS{
	E�U�4��u*]f4��#����R;/���`��T����;TI�Q
*+J��?�ڹ���|r��ŘVОs����J�rТ!τ���d�a�zoa��4R 8p��g#�EzQ:R�������IՊ�㩱&���y�Lr�e9����?PKe�mW�]�מ�+setuptools/_vendor/packaging/_structures.py��j�0@�!����c��.)B.	�
��*��J�@��cg�qC�8�Bu�%��F?�a�+���'�ԠU��c�I���n��ࡐ1w�]X�輲&����&i�:�q�|�����M�&��d���眵�cs�Y�e^j�v]h$�I*�GA���HK*
j]XG W��P��$j���"(�2�LLU�Ak�=LM����r[��0�p�SށsqB<�t?_�>Ǐa��<������ށ��\��+gنU�U"��a�i���E�s��*��Z�ƿH���g�{g&�x�&�BU�*�H���B�܋�~ß�̺�b�ʓk˺��4�]��9f����������w�r�G�΁�����׮��k#���/�
�}b~[�K�5dk��ҝ�+>PKe�mW���n_'setuptools/_vendor/packaging/_typing.pyuT]��H|�_�h����#�@a_��ǣ�5��Q�Î�}�gl���,�4]]]U=UU}t�zֱ�vC���'
QGk(����=
�<�~���w�0�iE���I&��v6Pt��S
�c���}��S����.�5��;�g��L�ԛh�l�W���n�J�y�g
�Oܳ�m;.�;\\jk:���|�t$�0]'<k!U�`����
�h�l$mb ��n�?k�����<��*�vg�
k�汧�	И|ȥ8�hΙ��y}hE+�r�����
�W��؀����5=6),1��j>h(nt����&��N�<(�V���'��A�\���Tt�b�����E����
���U��%�;z׉,bП�IRV�ubj�\9(���"�=� L}##�$����^���᭓�V�>P�Q)1�{��ʜNI��l
�G��{�+����%�i�Zd-���MC
#���.B���ɺ,E�뒬��zn�$�H��[X3)ɪ����*E�˂>��nn���?�����o�J�=Οn��;Լ~��|�R������&ְi3�m$B�y��ߪ�*�v;����;������Tb��RH)�� �=DAZj>BRY�i�����$C@;$���іl�i�<����-��קNo���T/(0W��<��~W�e�R���HaD2~�؟	���m+���:�ya�'��X�~v!�ۮj�k���-��X��en�!�U�x�o����'�����6���~�O�.�n+���g�5̫rh�y*�op���.�M�d��{ь��U�&�o闬��^�E���W�m���n��--�Bx�˹�V�PKe�mW�d��{%%'setuptools/_vendor/packaging/markers.py�ks۸�~"09V8Nڛ��D�Qr���۵O[���%HbB<���:�o�.^(�IsW}�H`_X,���u&�2���EMs�gsVH� u�`�TkF*&6��z�t?�l@n��/z�er< �X(�7W?[��\1�OO�Nή&�a��畦
Vr�U\l�ޒ2�2g#V�,�Io)���鲮j�Ҕd�����[��b�~�Ev��`R�����W(h�`�	
�ܻ�OeN+`���r+{��dU]V�� �3��H�mIA��
r�l�y��JqW�L�y%DV �ꪢ(�~��o&�/&��x�(�W��r@~�➊ŀ���[\)��L�4�q�u*�)!��S��$E��ʂji�j[2i!��#v�ϋI��o������j@d���2#�PWvd@N�;�g7{��Q�R�ՆA8��;#�Q�C��b; oi����s6%�f���n�|@��'���ҹ12r��)�Vm�l@nA��^���07"S��7⿣���|�f�l��'2ɋ��Iq�	^lXQ��
��!!��`4)k�a
��TJp�nh^��\�C����q'MA��%���K�{@j�#׼�p��x�9��\��J˲cm��X5P��M��mJ�U��!8�`i�dq�V�jC��	ZJ|BR�|�5,��
k0����`0 ���<E�ۆ]���E��#�W�9	^*+�*M#���@/�L��͗
Iv�篁J��,�$Z7#����e�]5q3<�(p(j��>A��C����1zx�L<Ư�	zMZii�t�����'@���J���4��U�`t�-s��wr։9��{����=��?��aT�?�u��:/�?+�_��ߜN��"w�3�Tud�;����6@��ZH��C�h��4����rF%�{
o�
���9���:�� ��E�ǹ�Y��O��/�! �4�:A�t��x̭�i�=[Ս�����y	�يη
	H8m�C8�Ž���jr��]�U֐8U��(jH�00;��]�h�Zu��v�
ۭ���n�Gw0бJ!�*{�r��]P�$�2հqtF�ɊUQ5=���c�7�˫�������F#ؠ/��>�vO���3��΁���w���&��9r�)��Ya1�����87����7�*��a�0���L��ݛ��S���+>}_�K\���_���A�\O����#�4j;jP/c�kBW��:�O/Ɨ�3-tԏL��2�{��TNY~�\�zLM99���9_�rC'�"qD4�8 ����y�Ld��qrk�p����Q���f有9K��a;����4��IUL�"
K�)$e��
��UaB�ue!+Z̙��y^06!w�)R�7�R��<X.�
aרӄT��@e-d5�.�l-T�E�5��bV1 I��l�cK���{\��A*�0/o`G���*]]�����߰*�@�}�Ț�1���c)O��#�)�2#��l�ƞ@%l@�&���_3��
>`d&7�s(	�/NՒ���F �{Z@��)+����dӊ��"�����<,Q�`���g�•	�������md��P��`�$g����hD^�;���ukj�&�i0�4zf�אʊ�a���Y����j�ޠU��4��!�I�'��#ϊH�i����#D}8�-4���u�J+jGC��t�4��jf�3�!�W`�K�Iv2���{�k�b-����?h0,���Y�@ZfI^��Q0���(f���g�pa�_�+7�����`�E�NlWef������R����r ��R ��6�Ʀ������9^�[�x�̑`�'��sj����o-�L�r4�'\�98�	���p���r���wm�c�"�I��R�������D��G���r�6^�S��sT���昙���4Q��}	�Ju`���b���@3�Ί�^�@5g�vИ��I�l5k�"~SՎ���S�����l��m(޻�T�#zv�J�A��a��nw�>���5
1ㅥ�o�eݶf]23 ������}�t
�ء+l����?� uo�yI�h�$
�۳'45BO���%�,Y����(T�j�-b��c�(�}���B��Z��!�Z��>*a[wmd�!@��6Ӽ�M�[4ш�-{bAj�Q�~��
�Ƙs���l@�.���o� �����k�d�Yx�h��h�G�Y�T]嘅��~�$C~��%߉n[�X�T>MO���u$����Ƨ�pOs���Pꧬ@���i����ֻ��g@��==X�G#�.�m����>��+���h����X��T�
��[8�v���h��@xӃi��c�A_^08fj��7���"-�~�{�6�r��2��*�H��nk�o4W�m_�V
y����G�QuA�j��{��ܾ��Y�t�4>�Ne	]������W�
h�eG[k�]Jj��Jx��x��WX�g���;�2؋Ӵ�P�!��
Con��7$�^$����nx�/���H7t��v�2��h�{(aG��Ӿ.��]�.)�6jb�=����O�/g>��K;$~WC=�L��[~���T��6'n͂2?�*�D�^]��NJԘ��^(��Cx����ń��9<+'���Pg��� 8*�;*MwN}'D���,����="?�1/Lt�^��?~��j��s���Jo��b�-�M��xi���וbatje�ʮ����O�ى��s.�����B�;�f�&n������֑��)����E���$��*V�/����!Q!��a��R���,��v�������Zȼ�M(,�3)_M�����΄�O�[R`���=���\��i}o�`w���f]���PKe�mWiS�05,setuptools/_vendor/packaging/requirements.py�Wms�6��_��B��s���續̤���$9mN�r`��R$�v|m��=H���^�/"���.��d��
�M3F�T4#Y�a�`	��q"���)��%,�#��#i�;��U��<�lo�
O@����pMQ�0�g�(������He����-8��2c���I�f"p��ؓ8�V��,�I�/.	�EVI��I��T�#%Os	�|#��N-!$�w�g��LV�,
�b�q�<(�K�;�;bI.$Uz�K�'=R�t��4[B�m�{d9}ްRk�Z��0^L���p�O�TЬG�l�>�Ƞ�ߧ9�j�Q�sD�
2"���o�W<���O�1Ņc�\{%��s�[~�E���h�~8yW��)��а���hG?��=2ִ�Q�l�n�����yќ�ȹ������W�)9��i�B�<B�O벭��&�B�a�H�4��ߪ��=˥��f�8/������0G�jv$J�O��mQ��WB]G<U�x��t
2�f�W�-�ㄣُ��nL�ul=�?�4���R�\�i$�()|�������b#�]�~ ���L�w�qmG�pM�;��|�4��ǡ��l�"�Ѵ��Φ��?����n2Xޅˡ��7w_Ɓ�;��h���\�܂�z��J�� �pP���p]^r�)'���îI8� v xnN�vE?/�Er���'�=�~!�K�\��#e�*���E<.�O�e���!�
`��`_���u����C;j�S��|��H�ׯ�ZK�

b�b$WI������2|7�ΣA���h�[��2�j�o:Q�>2�b�k����c'����Hg��a�{�S��]J��c����P��oi���Ŝ>Ū#��q#��Ehn��yu�q��>�q�.�?�
Т�0��2��O(=��.�D��"��ն
���=ڦ���R�z���N�>��C�|(3��:�cE:\�����
7n� 0I��B{��f�
�.�ʸ��D�p]v�����6n�,w*�0�z�T����=�6�G��Σ1�xu_9)_U���!s���:+ N^�lN����Ķ�M��[�Vׄ<�)F���k�(��I%at�x��Cƀ�
Q1r���u��@/��<��j�����)[�by��3�st'k�hbC٥�,�&��-l��>���$��Am/���]"4�n�S�02��`�R��zO��%��=�ƾ���a������N�d@s�;�v��5�Ý{<�`Kɱ��}Jա}����[���I��DD>PyCn�k΀/hetT!�b+'�X�-4��k3�'��P>�=���p��Ee`����s�Fe������K¶X�U�ű'X��u�_�	a�`oc}��#����L
�
U����K��?��3�Zi�w�=]y�iP�rnc�����Y��HG��_}ÿ�}�//�L�T}�#;W,Ȋ
���$߮{xދ�	���o��v�#s�4�ǖ�eZ�a}���ݗ�8�T�%4^-c��A,�FT:���>������"W��>`�����ߨ����غy���,���ީ�*�;�9�p����i��y�#�A��tz���R��ۤR�~:�&|5�!��٪3}nz��@�(��'�c����:Y�}�m�jzw>�4`K<2���A�R+�ߴ2mr�ˠt�&s���n������BY��W�^;ݒ��l$<S�X^�0��8a��2�	|������*h��:`�g3�C:W�;���O����̵!�{ƌs���w����8v�c�wj����+�uNwm���1��a�PKe�mW��)��|*setuptools/_vendor/packaging/specifiers.py�=�w�6��W0��QxNn��/r7Mݮ�咼&׼}�WKS��Z&�$eōӿ��@P��4�n��ZG$0�f��h7z3˪�<���N��<�g��+5���D�Q=SQ���**����E�Ÿ��l���*+���q�?��|B;~��iG����Ϗ��x}���YY5�J�(��.�k�w^�QZ\.�V�D�I6��󲸌���e�,�xe������*��Z���0�dW"6�e���!OkDt�H�?�]Q�+� ������1���fܪ��q}�P�0Ze�l|	���Lx	mL�7{u4~�ףg�s��;�dYm�A��E���<�I��4{���fZj���j����")+@8;w;��]�F2�L�����>�E�O/��<���M��o����1�-9�+�	Lh����!�7O�%����r!�~[?����v��+�r���F��I�'�;��b�>C�\�h0|�`j��ytr����H����	Bt�_�tN^/T��g��̗�,�rp@#�z=��&�G�i�X�,�a��`�������h�:z����e�:�T3�+�}X�ӯ��/<F�ُ*��(��>���5V�IZ�Y1��u���J��55�1P����!rž1���{�8�H@���T^'(%V1X@?](�lL�˂�L9S�+e4W#���Ah2gI5��NP5k�L"�]��[C޶��j�`6��2���fDE�\��J򆡨 V3��#@>�MbUx4X`< +U��	fk�r�/N6߈�EY���-q0|��JU���(��+����!�1��_̀zBTX�SvMbج$Cs� �s\���&$Dΐ�<D�A��(r��/O��K�Yn(��r()!�!��Л�����B+ˁ��U��VNC�_�1�P���O?�.p�`��*6�Qf��gHO��v�2�Mr�s�[�Pm#*�)k��QU�_�|~�۬fY:��Pn�#3��Q[��q��$�ƍ!u�*p�z��T�|���
]��
r(�j���
Q�zw2g9]&u:d�ڍK5U�a�&e:��`����o�O�d�j�/�c�I9���x��Q8<���h��;cа�,��~�0�7�ѷ^������4�"oҟ��kI�U�c��_���Z�rr<�� Q�3�&g_	����ȇ�{�džx=p��D��j�lGt��0�b���,��D�'0����?],�cZB�1�+O.���0�D�@�fK/Ҡ|x�п��Z,����ڭSH��[@a:��i�?����E�G��u1���MCuIs���?���t^�I��>u:�߁�7���}��f����eq�
�zO+�W>m��/�����ѩ�m��Z�p�HC
Ϸ�h4bZ�r6���1kg�����SU[Sm&`�ac������0���	ГX� ϣ�8vT�1�,OUZ��X�6�V�MzArZ�2u���-D���0��9�ɼ2��ES0ob�l0��4�>}&֡ӝ�ƀ8
����'�	���@g����n�B�����줬�C�}݂st�����B3�'��<A�޷��v���/I�E]`��+ء��j�/D�].3}wN"�:�S����pdo��WK�UѲ�ֳ�J	p	z�e�.k
L�����~�F��?=�5K37LƄ�1&���`�J��]�\`�2����LjP������=c�M�&3�Q���2��y1�Rކ�p6ގ���\��0!�*� h�C�wа}��+%y�4�a�	�IA1�Y��M$	�V�@��;�fc�KgȜ�|�Lfl���@�=�i������|�����HϘyN�yO��~+�
�D�ށ+�-�`6e�{S.�GG@@�_�G�@<�U�:��I`HW�͆UP a�$���s�0����z�DғXX6�	�xʋ�6nlzP�3,����]`�ho�b5h����1��eٵZ�P�J�`-XAҖ���4��T�4�S+
d�����"����X4u�UR@ḝ�Ks�.�z���-�������8Y,T>i;f
�G�%X��3�4j��z� q��W�|>9�^�,��u�y��0E͒�5���u1�Ŋc� W�,�	�4�����
��q���E��rh�!���A<c9���T���o-�%���@:� �3�L�]�k�VmCV�]^z������p*;%�C
�ڀ*E,1.SW�`q��WO�99�F7�F7OF7��C�o}W�9}46��'���jp���@X���q��o�Y�M�Õ�r?�z?N�86?.+�9(�8�FhVZ7I����8��a�HR�m��/��i1/rzy���dh�	/��yQ�J�<""]U�U��(D�		��%A/�2Ѱ��>�ЈM�` ��F���G<�8�*F�'?��f�=�"�D���7Ħ?}����G�
~9����=}}4��AG#0�=:��5��ݣǰBƭWO��\U���v�Cj0-ڇ�6ONo��~��N�y�Z���qv	�l��{y�Ŕ��7��B��4��k�5��|T"���ѹ��0\�S����J���ޖ�y��0|�%����<�T6~	~:����b�C��0�Yi_T�O=�M���ƢvgP
v4%@�NPvC@
��~�LU�\{�H>Y��6];r0j�)Ug��Ju�����g���4i�	����ϣ���#��;=��W���ܭN0+����M�5�p�3QU�,�SF�s��&5��&WS{\:)�X��b	 ��qz��c��e��ƙ���k�t�s��6�ۂ�^\|p��4�.U����d:�͒O�Y��67��-E�K��Kt�y�_S��˭6U����p��K̨`qrZ`*Z��m>'ుGM���ޯ���>m��ɰس\q��@/�/"�a�h��K��q��P�9,I�R]��0��.y5/�$$�ֱ���OL0���(�w�{H`|E�gH
ڣƉ��*�����I�U:p�yN�V6�_w6�����?����_�Aբ�:��M�ϻ��9أ�z���?�t�����p�.>mcK0�����Lo��b_T��@��*S�v��6�DJ�[� ���U�� �Ps�Y����
�}S�#ƥM ����J�Zl��'O���+��w�XSN�I��5bL�����B��BGeC"�4$B.������p�݃���OF�}2@p��?7����w{�-��Nޣ�o��O�Y|E!�$:c@��k���	5e�N�iV�q��<Vj�'�a��T�C��W�,�[u����8LPV��C�/��0o_�kV���)8w��Zr4��'Q�<���z����7L���)�A�ksj�u"�ض��
�SB�����g��hYRʻ�IUpa�c�^.or�h���T�z^���8^9@+p��0�ղ$sp�1�I��7&̝��pZ�P�Oy�ځ�)��XP3���5�;)ϲ�L�k7����PR;�0c��ͺ8�h���U�	�>��MQv��B��,��U��9�����V�U��y�8~��Pz��x8���鍿LԑpL�>���˹l��YU%|���Y��9p�JU1y���f��\����i��K�e�T�8��|��{��h���#ʙ+����Ec$�t+�
r[,�ʞ�kcR�c���WR+{<�uِ‚�Ž��"���yV��y{�8����f���o�\�M���u�>�꤬+��{Heo`���K��7�O���p����բ�����N��lz:���a��99I��/cG�|�=@��:v��"�>�~{5B�G�ޡ���A��5��g*��zuW�s�(1/��-���f{b�t���Z��^�x7:�E�)ŹL��������2��S/�g�,x8�F�㻽�����g���:�����2-�AB����cx��t�R*_�۟�\�AzhQ��H����)D�W��W/s�͑u�m�Sr�Ė7 ۃ�2���a�;�>/�R��`�"�(U�I:�TH�K1�O1�SY��-L�
% xY�J\�3I^(�l�<P���2�
L��x�h�����7�38���
M�,*�W�l�*�t������jg`59�j9�c~yk1�LYD`h�x�O�9]K�7�ô{.��՜�I�l�vV:W9`�\�5�f�\�0{��R�U�C����ʤP���C<���~-W���Qb/憄*�WEx�MV�>��Թ��\��Kxnm?)b�#R�+'i򩳴�]�[�~���
�����2`�ϣ�#�s�/�DTlu͗�C�d�2�$̉��xK�di-�_P<�$�5��D�KHo�~�Xa�G`�m����~��xW�ߚՂ�;m�=���I1iC{��Y��]��Jgs�UZ�Ү���� 3S�B��Z����@��_bOnc4,�[D��FBn�tˤ
h��$5����z�%Hn�X�����e�?7�C��&��H-Kn�vD�0�&�q��@��5eT���ݰ�̈́��u��O*��ِ��Jy�*��*��ѓ���<r�/��u��} �s�j�^
Z��T;�^.A��|Z�g�Ь�Z\)����;��	=6��Ӣ&�����[1�A��Lb��֖z�x��k�ݝrlr���f�\K�Q��]��z˙P͚ߊ�:�P]EUo���P�m���j�Qc��ڏq���z��֨/x�N5�=v��=��h���=�^gr]F���U:��\'C>etR���]C9�!n�(����F�K��9��|G���mvm��U�w��>M	��A�������6�����s�Kն��s�5��^>���+7��:>A�Q ��z^���GM$�9G�7wM{)R�U��$�����[���:AC"%��Ŵ}G��x�wLӗ����<:�3�!�k�sHG�C>�<�Tx
�C$lT�^j;�B���9Eh1���[B�(����$��a�%��.֏���_�n�'�J��lz�����k5�U��/��R��k��V�X�HQm��x(��U�bg�!����`�:0I��O={]�
��F�U���J������7m�&�Y̑��K�1���L}8.� �1T�p����0[����7#�i�׆W2�=W���tV�ܲ,6��B��[�'BC�/�᡽��}����?z)����Igġ#���=,
J���a��(��Tp�2s|#��6����G��dX|pډ%=�>��Q9�+����s�)ȨE��Fo�w�,�����Q����(|h�ް�g$�%Y��k 
pR�m`����y��V�I��$�`�:��9�p��!��ɋH%�i�Dr�SQ
�Y��=��H��5j�x����0J�X+����hs��X��)�WAP������9O��S
���t\s��de�d,��a�5�x��$e�$��O�k�"ׄQ@�V�}L	���A�7�"k.��-�O��&��w�%l���b0�މV']��sN���M����J_��7�$X���{"��30����m�Rܜ��~:�0�\�ë�#���VE����2����������PggUx�=��2h$e�w���T�����#�̗���c�mU���xt&��ZgEF�m�z���������\�7��c%d�Kf�hj�o�M�@�]�m .��.�5hl�B{�~�ڟa��+O塛_�h����2N�U�0�����8�,NazmpXx�Ĵ��}�VAM�U���^��L�B�&�2Tv�Y��ʔRZ�/Z��߁_���[�O0%�W�aIp�pH�+;'��rNB�mW��L]=w��W��e7ſ��c��e1�.w�����L&]Y,��ҏ��=��%�-�ո��Ȝl��G
.��C�07�ۈ (H{Ý!]����x��8��NԜ5s�!��~�%�
���}�g�\5P�F���N�d=��%�0`��*�F%S�:K�J��a��7W�v}��/Y���
�ʳ=�e����Ui��zK^�g�7�&���r�����K�
��� ��qJ���U#uK���
'����<)u������Z�Q���I�D�o.*]�i���b���/Ug�m ��2�4SJ�UDg�Ѽ(.�����4	���o#ᏹh��^(y!GV7�C��j|�����ɽ�AsfK-]5'%���5+X��_����#N-z�����O��+?����:i�Y͊� �2���ism���:��_9NEj<�i�$�,�-�"p����̂��|�?D���]�b��p��=���-;�|�'���
ULz����\�nLS��T�'�����5@���J`��MQ��,����T�.v�����3X�Աcgϡ�}lu�(Yܡ���7L��|�@��[����޽����lzw�—��\��+�k�ÿ��~0�MbP۲V��C—ђy���7QrY�S'3��6����4M��vH��G�^���(�}��!�f�zqk����
�v�y��Hɀ0%5�u�W�,ʬ�R��y"�7Mk�SAȾ#MUD��9�p
w������g1T�|sX-�0G����/kmi��"�Ud�ڢu7��|ZeΥ��7�.L��B���u�Xf��1
��p5WA�,>�W_W��|��e���h���6~�C��N�����y���5�q�ț|�\�bx��J��-i��Q�+)�?�uԷ�3���i*��]y�]iQa�UC�<N[w�l�N�}��ˎp)qs�u�aď)l�C�h3��?PKe�mW��'^$setuptools/_vendor/packaging/tags.py�<is�:��+0t�	��h�����8���Ʊ3����$���I�Ow ��ݪ�Z�K�F��h�7�<��4�C��ҋY�a��+� �X1Yf���S��[z>�;�`]�k��Q�ll����2/	���k	㰳0���G�'g�Ä�eiZp�@A.�<*�l��i�t���"dAXxQ�;�,]0ם�E���ˢ�2�
�M�4.�����~�EY`S���(���
�Á�h�,`XQf+���s ����=�xxx��Fx�˂�A���s�6�2�f�9KR��k�z��m�u�����%
����,,ܼ�N��0�;��6cB$p��l%3y����2�
@���Y(�EV�Eu�ʵ�~�L�
۵�%�<�v�b��k9��?���o��yt��|/GVO��B8M�6=����/���a��;L�B��ѩ��қ�a�Ȏ�ss��N���;g�2L|
�y��Q~L����i|�*�i"�fP�����O�;�W�	>�
�
��- 8����r�Q&�����j�N�>��p���������;��oԍ�$R����┼	A�#���}�/��l�ؤ�ei� �����g@��;��
��<^��uQ�p@�h�::w5��L=Xu7y��!{������^��sof��ϡ_t���,����<L
gTj�›�"�����<v=����v���3/A �<�j.Z,�I���C̽|�wv��bT��=�
�-o�����8��F��y�9�'X�3f@4|�TX�7��\���X�Sh%Q�v�S
���$�V�\�?���d;}uX�%;I���C��N
��]9qz
R֩�C��k�K�H�� 	��,]�Y���uJ�l�è�x�%�A��(�A��rR9��\�hm��/�l� �YV��$M�
to4�#!�6�����ht���Z�,�0ب�im�,GM�SX��и�x	��Q���Mծ�s�����),��a3�n�OW�z�6M�[�ջzm�x���Y��Q����G(x�
�|g�`���/
j�\���q�>��
z/�C4�]Tb��긲� {���~��sRӰ����
H_ۡ3sا�j�K@O��d���3�����<$�P2)�P�ht�Kx�ȃ�RF�׃,B�{L�<�D�ċ�WT��8!B7,J.�\�A>���b���}��夕s��8�z���ś�Mҥ�=
�w,mbɎ�JX�F���]��hY�D��F[��θ>!Lմ�,�RB\tݫpu�f��~
*�i���t��@���t5��ۥ���,��|D�=�/��bN��b.3Bvqڽ�x!@�x<B�1/g��^��+s��"�D>���C��܌�1@�ab�ᰗl����aqe�4��kg�.m�%ì�<�I›Ž�o��a@G�e^���xG���AӀ�	^\x��B-F�����ٷ�dJiS�������_�I�h���W/�9�Z��&��k��dW_���XE'NKG9m3" ۂ(�s�	�I9��k�P�,"��/�#�T�|w�P�:"���Vl����fp&	igQ%�� �c�tф�D��:M*U����{`�a1��huԝ��#���;r�%�}�"���~�!G�O#�i_x�q%/ :Fn��|����	���==݆��C�S(,�\!����P�WX�pZi�c��|:f��ˆD���@&H���`�&�I^P4��
�zA�"НK��Y’�ʢ<M���.��W%&�� -4�χ��
�,���Z`?>�,�|�	.�Nt%T}�Z�W��W�X�'8G�_L��1�K�(�;_�m�C�^,�Q�d�EI�^�,H�<yT���a]�U�D�����#M��rl���� iP��2D�k�� A)E��2��5���0mA��m-��V��e�o�FOG����������γa5d����rX(�-��i4��`l�R�>��I�t4,��
*�I���<u��vcJ;:�������1�:��ʼ!`:	Z���ұ5���2��4}��}�~<9�?}}���A�bя�f̶��
O���B$�s�п��c�hq��z*-e�i�t��5M㤌� g>]J
ĩ0��|�)ӎ��P5�@P!&�>�h���eX5'��|���/��Q�]�K�ԩ��X9����}���Q}�!�&	��
��z0�V��5��n5����%��K�P�m�oa
�^�ӥJG���X�c���R�2�wa(�ˊ
k�ez����ҧ~H�Ǐ�㤠ɺ���8dgd�A��(c"t�E�k_XQ=�����\*�)�L|ar�e�0��_��D/@���a�8@���9�q��7��\'����{�6�>������{��c`$�ȰzU@
n^�J��|��G8�Gx���(���F���ת�������:��U�h�S
0^!{�2Ƶ�}���"l���(���t�Pw��]�Y����HL�{L�)W�*O�J%J�):%��'h�'>�����爦�/j�#u�����^U��[�mM�`+��)0�����s�S�M>D]q�G�y�
�ƅ��p�JW����ЅG,z�^�V鄁ۿH����Fߤ���Ge�t�2�>�CS7��*��umG%1�����h�@�ݓ̳��
R����)��l���U�o!��F-�޸����w����ACL�f�ڄ2/��#���%(�A�z�{g��Qs}7�F�H�\�u2��]s@�N]���jκJY�&rٮ�a�W��X����N�DXM�緙�5�I�)�F�ZgC��#X�0?����T�Ҥ,�4�^���**(C�P���%x������jk��nR�܍�[�f�T�X�wm�mԂ?s�Z��4J���n
��.�-�X�Xc-��Qi7�й�8�R5
��p���j��6�8X���lkj��J���@y�>��* ��Rٛ�b�
X*�������w��Ѫz'��aX_���U���Ψ�M72��S[�q[������i��hQH�r���+y���ʤꦴaF{mv��c�
���T;nr�#J�� ��`��@.JhH�Pӓ|�2
�����ʯD����m.���k�RӐȍH���	աi 4�Ю��|t���UO>�D�SV�8�S���i:Ò�p�'�X�T�g��JEB�/<�i�?���c���2ݾ�%7r�*
��������.���"G�����׃B����7�D����X� &Q�e+�k�\
�_�4�:��xM�{�ɥ$\�4�u�t��ٶ�^K�]��^�"�n�7�r��}a�l�8_S���hh]���i
:�'��T@��-4�L��d积O���+R棶�&iY�Ѱ�޿��[�F��r6g��3�{�P^�<�0m�<x|ҝ⼽m4�T�<���|��U&��ŖY����أ�W��6-%��~�ž�kJ��"��~����b)-��N�P��B�T�}�XFPQ
+��^�|wQ��:|ܕClU&3%|䋃�����}��k!����1Н�%���*k\aʱ8�+�B��e�2��5��IO�2˰ArCg�4}�Eݮ&w��g�+��	�f�;�R
U��(3�u˶�fD���.��M	%Z

w?;ba䭸�/]��DP|P��T��&#!9�&����G��Sn��f�jbIqͬ�x�:���D�ԚZ}i�(�o\���$�MoI=�0��
G�D�u�A���ظ2�ё��z��A<�n��X��GIy�*�V�̰2|]�HKB�7k56�>n�s�A��ܣV���G��IJ���@]�~�š؝=�P����Yڠ,�NxB�֎Mt� �&e�S�F-�!���F��e.8�TJk�^�MP��4�s�k���[��&w�t�~W&�Z��8iST �|�T=a�-��h�9*pu��h�#��ɤ�A�r�ֱ(<�SU��E����U;U�}[/bli��L���=A]��kf=�)�bJ[x	�r^;`k�{�0���0^�!����d�U�0R�9����L�	X�ي
�r�	G�f�%���k����ʾ��cMy	[bgik����?��h2ݞ����,�?��Q�����
&����h�Uٰ�j�x���w<x:j�G�]���9����w=���)VG��
b�A��8t��Z"�����F��v�)J��R�����p`��V�*��1�:�:	O�g�nӈ
xa�5��OͨC&��٣.�u����L�P{d�5̧��2R�%�Ջb*��ɛxww:���5g5TY(�KW�\ԟ僖�Xz�6#��t~���ZG-�=����	��C��,����Sp�퓏������D`v��ֳG�iGS:PH�,hܭv�!��^,BG�†��,��7k	
r��5�̉C��v�
�T�=��4�B-4�f�2C�&�]�#��h�%Z��G�N=x�4T��2��IZ��樯��,�I��XL�"-!�
�A@�1�J�B��|����v��l��,)�LKt��؝6@]"��/���b��U�`x�):�f<�¼`�0+.0�y �A3�k�l��6�bv֨Ρ�}[[\*���s/s��� ���Kf�����l�G�(in&���=Fx���F�!(У� ��7��r?�dToj!�#��,Ĩ+t1A�5[�)^���,	�a�{H�y�-:j�N3i��4\r�)�����I�6�W��{�t�DN$j�$z3�Fi0 c�B.�ߨ�$!g�͒N����AWV����P ��^BQn�>z2ݻ��W�\&Wb�$���V@_m�����z=��9���$���[��+E^�qqx�Ð�Q����T��3�+��{�`��?�=��FO�>�l�}Y7Pbg����/h�^^�{�.��o�n��-����υV�*N;��V� O-�N5�i��bO %R�k�8��s�Kn�_�����L�h��iQ�:u�4�ȁD�g��Ҷ� {0KfJ�r������6/��*����=�y�2j_A��X�2+�p�͔�:f�Ym@�I삢��*|F9�Y��8�
�>:B�G�gÞ�����pA;�����ԗ8I��Tb�)���`X�9.e߃���6P�dD�����'#?Y���@f�t�x��Ʀ4���=ZQ���1��ƫ����E��'�]�u��[�8����*�	�:���ayN�Ͷ�j��"�B�WtqH=l"ZwNx	���(7
�~[�j�R�g�UԐ��q��"i��ђ.�}���h�=���!���n?���ޑ��{gg�!<�v��{(o��;������;�'�޹��;p9��g�g}|\=������w��[;�AܽWG��I��S{����?i8<>�;w��}x��
`�rn��vF���b�s}�<�XJ�+{�(jY��!%�|-~�����q����&���=4@��r�\=�hK���~���(���L�
\a�$?�X����v�6�%LJ��et�7tIՀZ�EtD���z)���j��/c~�.����/dEګ[(㰢�$O��.3n�l�٤^�ݓR�*��T.��N�
�ڨ5@ӜW�	`@�'v���]#*����[��y�1��6%���UG����:j��B���pT�j�Z"$��ᓆ��Ib��ԑ���)��dcF%�
H :[5�
��<�N���n��w�7'���r��}a�rq��8�{���7m���g|a�\(�[�t�>�l�_(���)߳ˬlbu065��]wS3Mk�/���gu��{/U׬?�g45�?Q��./[̧��B�9DԽi�������}�Л�x8X���4�a��L�po����� �s衄~4����ޚmy�?:�`��dm}�e<�A�'BЩVMu�=SJIo���R;�ͥ���}��������)���5�_����#�z����<�z�A�|���F;Ow�����ֳ���P[�X8�V�&c��ò��`�~ݍ�������v|����g�%F=�,��l���q��݅t�z�TG�T6�
�Ι#�1s��xzϖ��-�4��.<b~x��jy�:U�vea�*�겁:vo����~Y��ӎ5���n%C]Y�'�T�C�c�‚�PdaZ3�*X̮F�n-v��u���e�[Lm�2��F�=��kl?�Ҿ�tx�;�CA����I�������'�����.mn$�q�tOUMqK�
2��!o?P�#?�Ή�&�/�1�0�@�Jh�3��xu!/U���/�s
4/�q���	Q�w�3�{Ҭ����)�y��w�N�ݡ��0�~]�"�2����ڜ�cO��D���
>x��M>���ˮ��i���UY	�
�[�Y�N��V�G�Y�kDk��ʔc�Q�0ڑ��ԍ~zC#g�02�zҶ�ݾ���E�|$�KÌ�W�N�V�CgL���bL��5/hEA��bb�0\n��c�k݉��m�k
�:��B`혣Jg4��N;��O�/�QE���VU��8U�^S����cVmj�t��8f�{��z����vޠ�ϫ�^mZ�<\�{���шg���?��%ʴm��Is�a�\��)5��e��S;�%^�[�ϴa�zs:�(e�BEoN˗i���)��(��9�W�G�(�_�9m�ǡ�_'��K��	�d�&�Zww�­0	8:�i`�
ƛj���~S4\��(6��N��t�?PKe�mWJ�f`�%setuptools/_vendor/packaging/utils.py�T�k�0����f�D��}	t��a+!��`t�(�9�fKF��cc��N��4m��ؖ��{���-��\t�j^@!R�3�e����.
��?|�xJ�I��7�F(��
�����.o�;�[D�8��Oo�-��kZ)��&+e�UzK�r�!UeU�E��rQ�Z��$ymk�I������F�Ťy�C&V�	�C��� S�m�ƠI����\t�����է�����>����jj�7r����D~�d�#|Q�HEUQ�����Oq}���ٯ�'s���%Q��l�K����o�>�� HR.���h\�42g(���~����A�9H���x�{N#� r�a�㇉���Bٔ6����-�r�v⏈c��G��{VV�5�(�a����H�>��"�nE�ͩZ���.���a�]Y�fF���/T�n�$�$}����v�D�z,
y&�5ʴ�h-��O��oA8��
4�F���H\�(-�i�7Vo���v/:
�=7)VO�sރ	.x���盤m8G��������h�T\[C����q�ҥ���o��"�]�pO�C�*�Y��=Y�hmt�]�/�ִ���Q��_Td���m��l�ڸ�	���Vp#�����h�B�c!���t�mbm�Q�)k����4�է�Wڟ���)
�)�CIY�)cO�ѻ��y ���v������r��	�W/"$�1>Z��M���h?n�#�ƒ^@y~��Gw��Xw��8�PKe�mWPz��n<'setuptools/_vendor/packaging/version.py�[ms�6��_��7��Y;�ݵ��i��z��O�K�F�ɨ)�(�J�~��$HJ��N��,p������boϥf3�
��%OY*�i1e�l*+�+�Zh�����'�ʐ��;��̳�{�ϦD���KG�S!���ы���C�0�6��	�(r-�\�o�+��"�`SQr��h0S����lY.��c&E�J�':O�������K���X�dVB�,)QЁ��i*�I�&	��y�V
J�(֥Z&�S;�G�Lf�\�ر��R^
���BfsG��?'������Gc��1����,�.�0������)��`�#����F`n
z�.P%����@Z}�A��e�����&�ޮ
��
[
�mآپ����z�(q���Ķvwj���#�/��z�����n�(Qi�gztɩ?}�����?����j�yjp<�ne�T�V���(���̘�Ţ�I��-�d5K��' ��Z�t��J��W�K�j�m���Ev��:���:�%��|
=ݤ����0�#�ә������r�
�d���E0b��4}
G�%O�����������۷�o�@�9�6�M�񅘖����g�L�Q�Tp#�T\�W�����S460
��T�I>�4X�ao��{lV��5��P���A`V(‘���L̘�y��=��92&$P)��^�r��~�x��|�+hMpy������"�"8����Rgd~vrx¾�f�zL<R�vm��S�V{���[)*��sq��}as�;]=5j����l����R*�+;8N�砘!�4��/���RC��2E��pWΝ�z�i�L��ֲ�/h癨'ƆEb�<ά8>�<��Z���6C5�hj��n�Q���MĴ�x#����m�B,�E��a��bHX#���d�����)�}���d���.~�������o�Zt���~�b��A�O`�/ZJ;��[І�^�Ѻ=��Q@�����J1=�7�D��j��gI%�g�Z���>�m#{���Rny[���fP0����#Ug�B�U=5"\V;,�.�&2~/6C�,
hz���H��: ��	I���O}+���GxD�-x9DP���
���*/ �YU��2�O�L{��h>����l�ó!�fDo�U�"kM�>5 �w���OH�秅�:K�i����?x�7b�Q?8����쒠�̕��@�{)a���A���속���3��}töC�	�
�^��]D�)Oȳ�^��&zļb�I0�~_Jq�m�/HFy��T�Q`�����،$���~�z�ץ&��1��v,a',m�O��T�2~��~�W��\�C$Q�����J0N
��(��$�J�-����{�g(w�����o�����]���MI�l�J&,�6|�p%��}��4~[�pf�^u�e�S������RaB�K���5%�*�DNNy)*l"@�h�M4j	ܸ�[�-)g3�p�, 7P�$���8z,n�2'DĞw�;��t/���c��J�X���߰�	i�Ndj�W`6&f3�/����$�L��]�K/M4�2Oc�)H
��8���d�$�TCtX��Y�}[)m�7��~�sm�ur�X�-�d�T�+.�0�u�T�Б��ܱ�c�h�d�H3>ͩ:�j�O.���TNW+#
-S���Ճ���5�o���;ͯ���uiWG��+Y�a��핡�"�Q�SY����c�u���繙��5V9,^�_�mX�������ۯ2IT�Ű�"<IK�e��� T��P	�
ٻT>w���<�͢��O�l�r�F^`1e�pk�Z��m�L�h1p�b/��<�A�p���:��BCF���C�4B�LR�hc$a5�4�ZuV��:�)kЪ����!���k����>;yJ��w��;{~>��j`j�`N���c�}d����l�b�+�Â�x��}�-�7���}t��k��qz0�7���F%7�o�c���E��2g��q�O����:mQ��t�n;�8�u�}Yo�]:��O���`��Sܨ�ݳ']��'\g �p�5�@�k�u����QE��E�1S�~�����j�5P-�-�]jЬ/���lLsqݎV��^S0�^�a�ã�xq+D�������o_<�8�P0h<~�5Vu�s�M�:\���ɜR��Z��|�vg�����\Aj�)8ذ����+\�VI�$8a��#��Ui���Z���vWxT�C,cdv^�
���.����'"y�}0����*_C{"��\��Aَe��fS��!H<w��0b�0�����@#%DzU�C"��#�iͺ���`v\�G����8;0(���I��8���!��o�
i
W���Ӝ#5{{��G�QT�LlL��D`�lR�+ȃ�g+o6O��dd��
v�l"�q��a�s0��d���X�Oq�u,��C/4�eM��,�}��{./�@�/*I�~��z�&r� �5��zm��5zB����DQN|~L����ߤ�&���	�f=S���ȕ��|����g�R@��h�N��bhqW�@��A���Us�ck‚;2~��Jݛ|�B��|��jp��OS�����!�.R�2���-�k�p�!8��X#�EiwOh�{ņd-TWNl��n�p����;��1��f=L��G���RኾU�;��+��j
~:���p�[�6�!�r��Snkt�cH!v���٧=����<��jxӷEaXܷO�3���3���黎Ղ���{�i6G�9N�T��\
6^�ص��Z�2{(��ܟ��=Q�ø?Y��{��/�3m���[��r1�����'�o�6�՞
�G�U߲7=i�"4���$-�kE��	��!�Ld�vp��f1�ޓ�5�����8C�Ƶ���+�L��W� �q�vC:�l�
j%k�N,�P��UG�R�T�*�,A	��U}
!�?�	�`�!t��*WS�B��Q]�+�T�[(��g��3�A�E�+��XZ��+8x�/y&�M0G�ϩ���Ҷ���ۥ��k�M���fc<~�/��s۳u@*ـ��%S��;]<��(n1a��̖�Mr���;V���֜���\�4�2G���'���dY�G��ܦ9�y��-5���Vk�Y�fz����
E4��n���v��=4��?�K.���x[���Q�}�-��lL��怵�6��p"t*o��|�n���9I�ݨ�)��[ ��J��0��a��пJ+m4ڟ
ZS4n9����U�<e����9Ds����5�W����5�aa+B
{��\�kT���X'=t��	V��Q9��X��+�)T���^"X�����qm]	{AK�n!]�;�
��`2�v�ߦ0�x����u��`�R�n�sJo�L!� 8l��+��Lk�eV��JK�(n"�� �3"Yo�'���ХŢ����'<�0+ɒ��/�L�K�g� ,Muj[�JO�k�S�[!�"�YI�b@k�X�C�zX����tV<��N�� �cgT��b{�6�\d���	���l|V.��sõ@�n��w���p�`8N��x��
J�s1ķ�K�c��Ws��h� Ɔ.A��m[���6A7@(������2�N*��2��9�P*����1M�H���X��$�jX[|�%���;���ߗ��"��łg9~�7��"p���'�ZB�F����fn/ܲ����&��WG���5C��U	�_��(y�ٹ�'��y�mr��{رWj��_�6j�}�a�Io�AKxl�
z/�MW��N��3�����s�����]��-a:����е�sKp�)?�k�\��OO��]�6{��vu�ƂkO��;�OŵL��ŹL��󸷏E�P���S�F�җ'a�g��+ƒ��k�ٝE�k��;�=��PBP��x@R�`C�a{��a㰖�aT3���R\�G1�@��nb�[�t��PKe�mWR/��setuptools/command/__init__.pyu�1� Ew���B"E�R�н�"Z E�0r�'c��?�WJh�O���R2���
Նpo<*��
3�V>�SM�-��/�}~Ew9~�G%����mkoʨ;��
�_kS��v�`]<����PKe�mW=��/M	setuptools/command/alias.py�UKo�0��Wp
�hb��9��0`�40[N�ْ'�]���}�ö���|P"��H~��Z�*�t�Y�r*��
X�	��~8��i&�g#��ژ(��N�6�h[«�D�[Z1]���l�a�QtYC�(�h
����D�U��q��ဧ}K��ZHh��:"�{�Ѷ�Ϲ���ͬ��,�qH�dq��h��s`>V;%t0�Obr��O'mL����'x��
�E+�{̵l�R@FTP2�|Ok�1i�
9,{
�@�R�$~Re�Y+$Ϻ2)[�R2�
k��s(�.�X�3�SH�*�b~�=u�zEe�20���A�Hڊ'��'�.viϱ=2L����la��pvG";_;l2Jx�.�?���fa;�Rc�L3����M�M�1�i��f�#3&�$s.�){����\�
7����t�v��IO������l'~��ђ�G�Ϥ���v�xӱ��IK3�}��s��^����:W�&vd�O	���pl3CJ�]o��T{n���:M�r�!=K\�Xs>:ɸN�O��ᣳ��KJ�w�d��c����:#�Cٹ�wG��	�[�7�@���T��
fxR��Y�=�z�a&���y�~ �6��$$?��.��=����N�Z�)׍���)��չ0����)L�%��?�iK��?s���n�͂�
MWU�H�������W�b��?�����/R���e �%�D/K�"�z��ho�gϩ��
��4�7bG�$���"$˥�.�$��1W��࿆edoGjDy-��8�h�h�{}#l'
�q�|k��`}q��EPKe�mW�ut��@setuptools/command/bdist_egg.py�;ks�8r��W�rH�)�}Im*��s9��j�벵Yod��!1#�8$��H��� @��������h� �ж�H�v�ϛ2ݔ�2�ۭV�y�꒥p��a_mC�6"��j۷{z�����X���~`=߷w<z������f�G��N��7O_�%��+u/�B_��7��0�y��y/n�Z�������;>d\a���m�}�^[�Loġ�,�C�%2�g0)����զ���E�U���m��Φ�ȫ�p�6��q��jU�-��
PUW�(>[1��0O��(P�Xᚺlߖ��G۪�M��
�ڲ0
Y�0�B>ǟ~���q���+���ٵF����)�}��r�0�"՗Wg��_�K�/4��^f�y}�f(d ��[$��r�z���65g��1��5%�$ހ�l�v�j`���&�����&`m_�^OB�A<�& ��^$'U�[t��Hv;�=<VTl�Y-��fg�/�H�oº#Q���hGF�jEHK����*�lӶHD�eYd���]�n����m��y��g�6�h�Z�^�0����FD;@��ʴDY��p�'}<A�i4�چ�V��
`���\S|���J�����Dh�]J@�縤�Kl�7�?�T���Vz
�Ɓ�]3�aw�&�VOQ�X�I9IXx�,lk�`J�M��	ӬG�QԹ̸�H/%2%̊��e�`��9����c��@���-h	FЕ�'
i�SЀuo�d�Q��hV��Ĥ�4g���p�����B�k;ŭ#��	��gd������;��VR$X����D�V�����Ĺc�b�"�Pԇ��J^���Y(����ey]��;*�#=%,x���������ux����P��U#��$���fy����[��,`O-�E�PqS�q�gKK��q#���a��5`x�k�k���X�m՝{=,× ��	��=���e�"3p����!�\���QP���WJ]�:t���F��<�P�u��k����2�x�"0�CҤ�oQ�2�@�o�DRhx��}�(V\��9 �W��&�Zzfm����>�p^e��(�;�'
_f*N���dU�m�xN.>p��<Y���LX]	����5z��i��+������m����m�D#
�n�sB�]�:��
ZM����sX,E�ZJ���%��ױ�8K@uy'��k>F��Q`�n8�f���!y4��d�_k��y���d�`iG�|�Q MIz��B-�E.�����f�A�(�#��&#k�B�nIjY�fʠge>�S%;a����;;��w���M�&��EV��`��C�BL��ς*h�8դ�V��,b�k��ހ���H?�SS~��@�m]&���U����]]��!�*�
0ʯKW�@�+Al
ᰄA�q9�9=��z�t6�'�˪D�42�x>z�{74��(7��Y��4����Nw��)0�dη-��O��;��>Y�%kÒ+d��9��Ϯy��z�	�����g��+0�/^��k悰�y�I���Qj����^���O(}�`D�j�����sJ
Ԧ������q-��Y�z��h��Դ>z|Ʋ��ȏ�5NZ���V)��ĊYa�C6K�ei�����{�3�]{��-�LA���o2Ϲ��{��!��	;�E�Jٰ�w/_��C�����˟>��������e��=zD�G
zyS���?��4�Z*�c�
�n��Vd�����k��t\<�3x>���E�hڿ�g��<{�w�Շ��]������7�~<���[���=r�mՋa�0_w�~�H��džÖrf�<xB^�R2��&݀Z	Sw�a�\�l�ɠ�	t��{ն��=]�-�}5�ݥ��2�a�&H)�N�j���l����2�J�A��{�BP�)�
��>����}��Y?�qH�D/|4���Ds��<�G���p�Z$��>G�ur���9�I�#k��k�-��
��&�3�Po3�z�­��/�´;�B<ѾK���I���1��޿.
Ǟ�]�U����Q��.S�t��{l
�v]uט*�`G!:/(�����&��8�K7���8p�6Ə���U}�w�[Ĝ�sp�h��߾=�x�槱6����h�1��
CƜ�8���	'�$�7������t��З�j�XS���DZ�X
����́��-�
ا�<
tM��n�|�Wmw̴̆�ö�
��Q,s#�F���8l�L�R��j��"�X���v¢EtD<ʹ}�R�5��C��*M���P�����Uԭ��$���p���%�Rq���]��ЀTߺl5㔽̷|8f�:߹9ַi�
T��CAL\����i������F��V�ӟ�//?��x���E!=Dkȭ
�VA�6G���,����y1>�Yp'��� ��;��=�>�^������2u�[��ǐɻL�"�`��ΘW{x��v��M�����x�
�횆���lm�\��)��Mv�їG�cQ�����L��?T|�:\xY�h��׎gDxY*� ^���S���h#0i$yV\Q_>}4�<�N�*Wױ����"'v�B_�=��2nHlU�쭞$ã}���ôu3ofY�}�͌=f��M��I0�E��z�2�,@ӌ2��&=}�,�\?�V��5���~��L��c| ���ȋ�eK� ���n=Y4���}�x�\�_ӧ����*�z���5>�C/Y�J��P�D
�f�"e
��n�b�!w���l�t׷`�B�$�����3"�8�*`­"�Mbz�D\�����iF'fa'��Ya���G�,ޱ`�y7��>��}�/��r!�������pKŵ������,Z 
���n��� S;o⨪r
y�@�e(c=�R��>~��S�f3�fi�Z�E!�ùǔ$V~ە?�.����>�J}��W��p�|j��W0x,a��(LF�C70B�x2�e�Y��G��U��:7�����
�+�2���k=�֒=�,�$O��R"'"ẞo����;�@TB���Z�d���FְC�ǜ�@�R�X{��zl��唠��R���qxZ
�4@"�!�n�6=ة*�囉�A��"�a���c��R�W��#7i�I-[:��Z��[�qKKvHδf��*���߿��k_uܦ5�켭��s�u
‹q�x����ϳ�O���>^����ZZ<1\�.�|���(��p�!�<��A��w�o�my�����7�o'�Y�j�V��ӌك�@�A5����O���>K�ࠕ������Z��ǩ���8C�Q��x}"O#�ëLbV�3[n۫��O�B�o�E-�e�?�;��\�(�3W�P|^�V3�f�UVb�[~$�xlSZ��ZJ�żK���Q=:�d�/x�5oء�V�<�
��Y�V]��b':���3p,�٦H�F#�k�4,T�S¦�0�w:��iq�+��r�nEt
��*Vف��?a2X�@'u���Z�����̊/�����XX)�ss�14���F�S)��a�PԒ"o2�y\�&��)"t^�Jۿ�$��aq.ISP��{��z����%̭�	h�}~���Ǔ�x`��n���Þ˸���O1q膊ٺ1��"%�h<v`�̶*r�L�C#���8\�:�	A�7)����b�m|�ci	��酷���y	�$H-���h!�k"걢�=�4�!nZ8�>�[],�6��v���55����Fm4��S���S�/xD�Z����9�6A1�����g�u�զ>b9S�-�9Na�OU��l�&F�|o1�Ϩ�>�x~M҂�̌.���|�")�q���< ��_
y|f�)K�����>���n0~F�REb�N�G��r�L��¢Mؿ��6�]����
�dؿ`3��?�B��VR��?��/_,!%��v�^���(F^F�Q>��k���䏶z��m��qq�o��=
�_}�^F�=��&�S�W���ff��\_;^K�U���q�w�>��?����|�R_��V2z( x� ��sڴ;�B�,eeW�u�
�`ԝ|e=��`���B�^:H1^ǰI#�aSQ��d��j��=�>�	D��-^=��H�̪>������_e��������n��g����_)ؒ_;��D���0�����U)2�y�CY ���w�P��I�8ߧEK�w1���X��r����g+=��t:b��$jz�z�9����
��a�N��H6OC:�Y{��b;��]�����7,�*���zO}���?�?B(4�%��\���{���A4S�b�ܵ!O�
G�k�g�sq+;Y�����9�r��9)X��`<�9GrJO�벍:	I�� ��O��A��\	h!��:C����$��� ���M����t��IgUbĚ���a<Y�Z8.h���l
��έ<�i��ц�k%&N�y7:(�
�{6v��w��X##=]@�&J��D}�E��X����8�@���a
��)�&M�ڍܐ��`�9؟1�Q;NM=�X)R��ы�@�]^�(�� �X�xO����*��q�b)/	�Ζ>Zj�(�� HX��'��4Q�(F�fR�F:,��D����i��_�&�|��y�j�K�_F���(O���:i��@<�s(�s6+|"B�~���Q3p~��*�w`��K�O��(S,$�C��I;��ŝ��A>i�O_�vyj���G��Y�V��P�'.H�UF!�ӝ����̴��X�IE��@�MNAd���o~xyy�	ѣ(@uF}�r��3��؈����Z��'6)k��m0�}x�Lm8�2m.(=��ĺn,�O�[~��^y>�-��PKe�mW��ȹ��setuptools/command/bdist_rpm.py��M��0��CJH��=.�P赴l)=�b{�KBqò��#�qj��E�4�gd�[�4ʇyQ����ǴU9ۃ�`��
5��i�;_�3=x�c���c���a-�2�טUEM�{��I��vx(��f���3:��pBh����-�x�ge��A�!2[=YჀǨ��R�5)��n�ԲG�r�}<_$Xg,:�@-��$6"k}�y��Xr���hѳ�e��I�Ŀ��K�He�
�g!\�<��19
�߿�.8u�	�3������#��4��i���sꍓ�?��/�����9��@BC�Y�L���qb?�	��de���$ (�y�Px�A�"ż|wmQb�.q
і��
1�&��Tӻ�ﮝ�'�|cb�xC[��	+o��ZE�Ɯ��Z�n�:�)�¡%Y�]�u������`��~�[^޲��W�����(5l�SO^��s���M5����_-��	Azo��|�g^9�p��?PKe�mW!�1? setuptools/command/build_clib.py�XM��6��WL�
���h���@MM��ba���f�"�ڍ�}gHI֗�M���emsf����p�����PJ�/��SUB������J@80V�VGk��%Zk�#���'�����&��2m(ǖ��Ub�g��F�3�}-�}��'k�z�ZJ8Wh)�@Ͷ+�g�^��o��,��ģh�x���I�Ƃ7P�`v4J�g�O�U��}�W��
��)%��>9/��� ��C��D]\�]��*��H��Z*L��vB�O�4 A���`�C?�%T�"<��12��D�R
���F�m�|��qO܁������DG'���8�!ZDe��=�,��iTID�ѯ�B%�(�	�������J[iQ!H�"Q�9.�Q�����DTU{��[ޗ�rR� �"(*�J�}�R�cQ�2PA4#�5�͛[aG��{�"�c+4ҙ�p��q���;>NJ{&h�Tg ��c;�yu���'�iҮ$��^{J�������Ujұ.0m-6�
P�*̲�+�.��>]�jM�H��$`jf:ڲ���w�e�DP5�+Rcmх��e��
�k�'Jtkx
��
nٷc%[�����Lz�	`]�1�|]֛A��+�C<Ra4T���ș�e-���ԘO���Q�t��4�c��'��H�w!��|�ւ�$Dһ��O�`.�n)�Hi6��Dl�C���E���5�'g
Z�n��mi�Z����
}�A�oc�>I�{I�t�x?$���^ޝ�L�+'C��:Z�p"��
�,>!t���N6�6���A��[[��2>��O\*!O�Qh����-�:c�pm��+d��6��ѝEA(�竖/�֝k[Ü}g�.����M��<�6Lo63&+��/k�������,#~�RJ!��DN!�ߖT�F���+Gsۑ:h~c��"X�D��c���"'����v��&�S�
����R�]�o����a��R��snfG������
u��ڂ�^��Ҳ�Z"��ma�0۶�u�TIO��~�
dm�%H�
&��RY����h�<'���{
`>M�l�w�Ϝ�J�,]�q!Y(N]��DN��py����~qa�c,��Mj��nꎟ�jo��.�Y6�u7��l�6�����≗MK<4��3|��n�7��J��uP�H���g�q�"%�,:eN��Z~7��kY�2���P����z����>R��D	�:~y�8�'$��	�G��'�<�#F~���zZ�s���� �����Y�VPKe�mW�I�V�3setuptools/command/build_ext.py�ko���~�FƁTB3�Ou��{4\���1���S$å�V����̾���|���ռvfv^��m��5rQ�O�h?�����b�5{�V�r��y�+k��{���wWo޿ˮ~y��ͧWW
�(e��J�y���Hׇ�*2q�T��%ˊCf�$6e%2�hP�=f�:b�ZX�d-�2�6�
�M�)���A�;���(	ۊ>SP�g>"!���i�_���U�v�~��?���6-jY6��z[�;���;^,����}/�m���`/��6M�TY�[f�Ȅ��?��k�R �
+��>dg-DQ�=0�UuLB���~������Mq��+�
v���+٤�ذ�o���/)-g��eq��{���e��>��7G�UJq�ˁ-�؞�
&�`�	��_
����X���o_^��ë��Ճ�Em�x���g�|��
�[7��bQ�~��se`�L��\�fi���^i[�`���-�ݕ�R(mZ�����N�q(;�X#9�l*���է�N�V�G}��+�#�l-�v-Ȫ�Q�3�1�i�%�l�٭z"�X4�m�N+�ޞ�l��-��(XE�_
�Zr��E�z�M1�+a���ӧO�'Q�_0��M�l�?�k�]���n'�m���0o֕�]��i@�g{߈n@�8Ŀ�6���Ur~�΋c�e��9?��8�W��in�ru�ً��Opy�꽂W>B���<���x�/fy�y%�̋�ڂ�"�) QI�蝔b�@3e�n
��kb������]����V��H�M�X<xh|2��X�
p��Z�h�}�@�҇���O�w�%�..��E>�}��{�k�u0��8��D�Ɋ*�:t�"��I����E������<l6�}�Q����������4x��u_���dn~�W��r*�3'����
�R$!�¹���K]��b6E �2�f���XDD�ײ.�;y��b�W�B��b��:PSݡ���6+'5��G
A.s��*,L�� сk*;p���e
n��%�k��^NrI�7��k¾�8N���f���:���K�T(��e}�����N�U�<�@YJZЁ�zẸ�.��ȀE^L7��V��[(��PUt=���U����=���c��A���~X�T�Q��(�BȖ�|K�&��ߛ��5���7��� m�P�O���B:���Ѐ�b�a'��3�gH������W!k�峜I�j'z�p�E����%�T��g84x�ɛ��o���w
��eJ�%-�Tjr�����R�(�8]' v�L���6��-�E��m1��2��*	�,�u#�%iE���j��@��AO��Y-D!)�\��BRw�g�;}��@�H*�$��ѩ@r��}��F��@�D�9��^}����߿�� 
���3�]�����8r+����e)f	z�󡽅�n�7(��`c��l\�X��m(�"�~mo@�0U*�d �E�U��o�hI�'���rc��e>B�����f�c�r���P[P�Xʲ�=�s����Մ�u¬��Ð�`Vwag�d��=�T��LUGq�0�dH�JWۡ��HVe}KiQW�c�p�z(���'hDEu�
7�CѠ��;ή�͚è�k�|���F�9�ϻ� X�^߄?h��_��_'�)!�4舉I����C���o�ڦ�n5 N)�v�^8_��e��~DK�l�r��P$~zAE��A({bY�'*���xK���p�%���}�~�&H86b\ޒTz�����;*��;��U���oK��k(�&��¨Q{
�	�>�����jZ}*�H
�ÐS7���m;�Ȏ�\Y�⸲!�[�D=
�P5��k�WK��я�K��ID�aY���"�m+�3Qtfلf�Ŕ�J��܋�a�S�FK�+�&� Xz�y:\��5���-4��"5�c���>ZRNw��g.F����PP�J�X�.���Iy1f>J<"��P��y�g�h	$b*� (g�X�a1U��y�3�T�8�A(֝�2ARQ;�ݍ���wM@b���o�!R��	�k3�����1[;~}�i,|��Q>>��>J<"2f�Q7�8�S�3vT��o�f���T�h�J<"❍3��NG�n��Yf&�V��������(@(>j2��a^-�Y��=�W�-ҽ�<��M%uO�fjZ=�+�u��1$;�tG]݌Nԡ�������}���Rg��m쇶A���bt��'�9�O!�;}�,!��s<��Iف@��	C��[����)�zS�� h
�B�2��<4,�	k=<�g����wp��9T����1�n������%.
�Ėv�CބRQ� 79�8�4�q�D�y�(�g�e~��dA-�D1���b7ś�[q��5^�{&�	���&����s�E�_ ��z��(�u��>�H�+#�2j̺+�(q�9����ӡ"�InP�8��,��d���3��ޯ+e~��2�K��w�BK:v`]�j�@�%4b�������Y��kU�a��;��Q��ц����[��c8��K�j$m;���>�����P���x5�!jՉ7DL/���%�#s��Lz,n�c�&�r�h���!+I,��8�6��ҋ�*�i���V�K�=��f�黎�H��t���AA�(�=��dАO\8���Q��N��/�	�d_MOFH�A]�7i�-�$��`/#Ű��%8D�����,�:���LQ���\	t�BT��2����lle[�	��WC:�����jC�'�T��n�^�o�[],�/v��jּ
1�J�:}R^�e'���^�t�?��J��^���)�58XQ-W�h�ŀMj>�y�r�F��s��u�i�g��p�qB>�P�����S0]q+{��Fc����:e�"Y=ֹ�
z�
ݐ��)�#��b~W�<<�'��Q�o+�#c��y�!Fې�6�*5$N��[�S��5S\Ͱ�Qr`!��|��-�u-릧�Dw�c!�(R����i:�*_�X{P4�:��)�����K=�jgm�G�
���R=,�(=��A
n·�5�)⩜1��;=�����	U8���m��I�I�ߜ�fW32�b����{1$h�����
�����+�f��=b_�����E��j:���g>ْ��v5�n�^v�٬��V�i���Sy��ՏAWA�̭�15�����V�B��?�㣾��v�����N��p�1A���|뺎g-�9��a�Z��Uy�/;'�! �x��_��3��&Uo��o~��ÿ�U��W:Z�%���u�	U�(��1TEH�i$��u@�Ł�(꽝���;��Za.v��-��sO�9}{'�{��KI�s!�CDl��Cݾ���[o�S7��g$�xW�ט�R��Ag����w�<��}φj}�*=:SJ}��<:M��_�;��q��ק�m|��/��)��,)�`N<�Qm]�.ꛒ�	�5���Fqy�\���^�!�(�m��([F�1�妼�A�����Pl�����K0|v> �AK����c�L$��x����"��9ؒ�x<��H�g�%_�:tMǠ�PKe�mW�2-�y	T setuptools/command/build_py.py�Y�o�߿��� ��S�|����Z�A.@|����]�ZQ%��m���HQk;�l����pf�Kq&�A?OBj��ю+=k>���V�����D�i�Ɩ��8���Շ�]3]UDH~�+����6���~�t��\�ę�B\Ba@i�-��y2s5�er��B�&���#���)���nױ���#k�$��0�RSyd�z�#�#@��Ytnt�x�_
L3��M��������C�ہ*E�bJ�JP�#ss�a<ѱe)�\A�R�>Q{l��c�tTS���}�D&�>�#S;C��WPɈ�X�{�?sJ()܎���8����0,��6�>2憬R�$�_��0��IPɤc���,���\T2,%��o�%��E�ȃe�B�����ʝA��{����gf�O��$E�j�Z�Z��#�/��P�bC�l`�ۦ�^�W���ٱ.RP� �ʾ�6/��\j���� �I�Í��Q���4ou�,"ZU��}��!e�i�	fYg����E�r�J��UH���{c�V@x� 
&7*����B^�f�d��N���2��RJ��w1��t����w�e��{�h�_PV/�0v��xC�9�	Ch�g:��*jOf��#�$�1�l�1���Q&#zb�Ӭ�PP��=\4k�qi\�!�5v����ǟ7���XU�vP�eӸ���b��p'ݬ���w�����^f����2�Ҿ��z�n5���H��1V�
��S��83k;��q�nu�o�kВ���ʑk:Ml�J�K�)#�12�Jӹ����� �!4��q�W���#�VB����UU����
����0\�gJ��xPy�S�`az<F\�S���YV	��=N�ސ��sSD�۵l	`�V\Rs��~.�`����A<�Ul+�=�ƴ����cy[�G�f��V�i�,�"oO��ʹ�Bz���DaC�� ��gE���CN�Sb��ᶂ����A�oX`�t��g�g�US/&����Ȏ�-E���@�#Q�h�`V��i�(�?[�_�dڳ��qJ���Ц�a_&�AM�A���}ஊp�8h�����!�榣��1cFG7�}�{���B&�4�c�0k<�2�-�9D{��K�3�,’���o���2���T�G[:�o��=kP��,I��G�oWy���3�T���$8���M��ո8�L��-��1j��*�j��hˆ�
[p���66��ĔՁ�����/���阫����	�o߬_�=(#���P�]{+l����_ii夬�	]��:�u�R��n�k6%���3>�R]�>����g�]�O���}�R}A�Ҹ��,�����b(ƛ����/�g�Y5@9:�4j�&&��u���Z^ˈS+�O�}�}ߋ�����!�>|:!�:S,u�;��~!&�\N��㺓�lX�r޻��	;�>]���V
��*�w@�2]�ʈ�c����������t\�MC��'%��9��b܏΃.��s���Xf���3�	�?��k* �_H?���c�s�nk=��9K���w�aMp<(@1��ߠ�cPPJք����e+6����Xw��,
nA6i�wv������'*��#���5ѫe�l��aR`�ڭc�g��:��B������	���~�-D�`�]�l�R�F���7���S��+����*�b�c�4����t�{R�:"$�)�;6j��A!@�2�PE���#�u��e
aӉ4Te&��k�CTp=�ߓ��u2���H�������=�2��E�[:����W䇁a�&�V�Ĥ��Xb���0C�r�[?3�����H�Vn��&l�i�)�[r�4�f�jbp�48���nzW��|�dF��Z�-M��7�����x��a��h퉷�_�)�U:{�0ӱ��ύ�`���A�jj��S��l�4N\����*u�Q���US�5G)�	�)��Q�@��q,U>	�������]��Wմ��fc��&���j�G�&&����}u�����$P���8�"�<�=Mc��{W�N�-�o�͊�g�O�[u�2����K���3(G=�w�%���r�Y�f[6��C�'`�`��6��Y�;�y+�� =U��)��\E�
m�b��+_�)��OM�-�7�U�U(���B���9d�$���|�mP(9Q����-h
q}�����j�K�ny7/�X5���u�бr)��ށ�8��tx_�Z����$�#ޯ&S��?�#�ڒ⺗�c� ��c���=7�Vr�l�+�L`Y���O�w	��*.H�ckx���V����^�-���(6�;CM�4�(���IK|!�'�#��mʐ��rUx�MQ��vQ��y؆FKPf��PKe�mW&��ddsetuptools/command/develop.py�Y[��6~���(
$%�y�A���@oh�����h�YTIj<��9�H�${��<��s��M�Iq$5W�׼Q%~~��d+�'&u�Q}X�{�J#����I)�p��O|\�����\�������7b�s��?��}%���2e�*��N���x�m]2��o���`J�lJ����TG��{2�Y�Vۆ*Ej���e���}����PZ~�"�I��7�I� z�{FvBznG�j��27k����5I�!���$
��Q�,u��b��Tm�F��%��?Yҷ�RR��ǯ��'D�"��^�$/b���"@�@��hP�������hA65�Qu|\"I��G�����o3�^�bz�������P~Ua����,d�/�(F�+"ے׌l�b�;"�6S�ٹ���>)A�~�ٱo4����q�]�l~k�P��Y~�ƈ����{�T�# 4�NT�p�I����ދpm0��\s���p:�F�&��Q�O!��hL�P^��2)�����D�
"ݝ+��k��)�מ<!�d��O��m/k.G�w��j4��H�3]��15�`�N$y�ˍ����y<͎]��D��
ȔO^K���0*&o�C�C‡l�&Sx���#I9��s6��ڰ���I�wbPM�p��.�s����B��XuǓ�W���G,��pl�)%���9ߑV�m��
z��T[�f�jJ���7H��y`؉�Z��ѿ&>og���s�򶆎V"t�?�Ue�TP��O����(�T�Zq�A���X(
A.zm�F��,�ج!�P��q�-[!�6��6�2��]%��|�K���8Ѽܛ�3��܃�#V?��oj��+���B^Bf�'��L��f�;��DPg��g��c�n~E~��(	G)�7��pJ��� 7��8���\�1�[i)�g1�/`�LӚj����i��nR�ƛ\YyS�R���N�Ī�([�7b���(��3��*ͷG��:Ē6�l2Kk���8��f-�Xei��!�7h��ӁA����X�̀�T0�(u�0u�]�-��	�4��~(��+�x��7�TZX`ar*��A�ز�XW��]����e�;LԘɍ)J��	;��廔�!Yt3c
��z?Jr����:��"��B1�߼ }�=��j�mSؘ�dS��P�^��1�R匥��u+)fW�i��4�������e�7�J��ۥ��a,K}}J�B���7�2��(e���O8�`FXn����ސ���Wt	%LVWXk4��R��R7���E���~ŽmY�Ggn%3Ŭ
;��MaUت��, ���5�jľ�Xe�w�o�V$3qVyR�VA.�!��Vh�幂x��<q�ѱ6�0LNIN�"���a�\�,�ޒ�-v�I�fV�4tDp�
���z��w��L-;,3�>������|�s��!c�~;�v��*(2��SC1:���`�����WL��T��IM��+;��/�.~���mg���Ce��
�=�2ߟr3a�m��r��&�;�c��N~�}�����)j�9��s��g�謱��Vwc��	K=x�k�/�o��S���
~ �};``��/r�o
:�'�%���#�%Bk���xT�*.��ƃ�t��zE>}�D�A�P�i��Uhp��ƅ>�nf0��IhvG΢�K��h`�&ς@����|����r�م�8���U�Dx05�(����5k�g� ;��ώ����r�O\�x���v�*檦���crp�+�n̘�zd�rk��V�3$TY.w'hPk�Pb9Mm9
GnKe7vP�"�0���Z��s�n<������>���?qQڲ�����9�ni4p��;0��z�%�w�%�lT-Bf����{�E������h]�ױm��~B�^�/^Û��ִÁ���lfg~욳WȬ�v�5<LP���iЅS�G��yt�8$�I�GB�R([�����{i�J��>��,�-����p�y7Z��
<�	㪓�Nߗ_��Ɂʄ���
����x�F�����X]}nX���t�ո~W8�W�2����	)a7�Zˁ����o�V�rWG^�'�c�g�����PKe�mW����setuptools/command/dist_info.py}S�n�0��+V��	�#�P���*䘅X/������v
��0�����9{u����P�P�9ԁ�'{�Pcc,�`,����?�6��*��Gf��\�5��,7�R�C��~��W���L���1�)�;�G��j�ڙ!E�#=�/c�N@\)�GWQ���9�ô
�m�?+�G���g2h�Akle­�
z>�<X�X:5v���&����4Bp���]Vx�kb�M0�3_8�-<vM�}�M��M�\�d������=��.h7�{@R�y��Z�$ZW�ڊ\�rü5�2�En�>PK��y*�؇`4mN�}��sÄ|�'�t�Y,�[�'��!J}�?��
�^��|9�p)�٧w�
.�d��9_]���w�����i2��>�Mn�u���PKe�mWE��wg[�N"setuptools/command/easy_install.pyͽi{DZ(�]�b]dZ�lJ�E�c�cK:�'��3CrB��HѾ��������)'y΋����ꭺ�����h���n�W��/W�3�y��E�7�*;o�l�ԛ���ͺ����٬�r���з�|��Wˬ9ϖu��z���ʮZfoo��f�`[.�ʋ��g����z���b��6=@m6Ӭ������r�h��rs��b���C��jN3�r]wuO�We��f]e[h��?xP�e�o��wU��⠺y[�K�	�w�y\m�ʾ���j�V���E--_��Ճ#���m��.V�YV��M��w~j�?��/��r��ܢ�\W-�-�K���Y��eۅu��m����d�ܼ}�^�{�f���O��aɷ�K);	[�eY���\f�t����/���8~����G�ӌ��u�����j.��-��P3�VE�h�mok��-�˪�TE[�5�my�q%7ˢ�P-v}y�����3_��z��l�K��O�?[p�>�14k�CӖ[�l7�߶��
J�[X8�XyU����m�,��վ\Ȕ�QU��- Q�>ԅ��c�����m�Hh*�}cj�'��~��4X�%�j�z�ó�)��6��

Z����Q��]\��U�w�n���WQ!O�ٗ�_��W���4����Ǯn+$\�w���bkQ]@=��<o�*7�Ue;�-��"۫h�kv-����ۺ����p{�\�?TBKL��Z�t��*`V��io�.�c��l����~��6�u�lp��읛G[\����@�e_B͋��ۦ���*M�J����f�Y2��Tm_z��=���Wo���:~��-���̃�]�ɚM����g�=��l6���}��5?�Ѳ:/w�~4͐�_��z0��	,@�t9�N���\WH��l�������c���M�����b̃�B�*`o��*(���/�1���W���}>yNe[�)S���\-:X�|�v4���H5ӹ|���T�����X�d�y��4�M�ϫ��,�TF€S+��]�w@E�X~n��!��������2�X��maP]�k��s�����͸Ϫ0Ys��gMY�s�q�"��`Ll z�lBUw�gm��˲+��ͥ�T��qMQu蠆�3��>��b*�;��>U}�'�%��-�0t�g���L*Iol���`@�7��-09y����YV�xן�f<��Vv�������
�աB�I8)��]EϪ�j�g�lj,O�E4�_���2�l�`G2��x�]5g�|Y-�����6�S\�������2�bUv�ljC�r�M�u�"����%���s�5����'��k4�p�1lY[����p�\I�<i;`z;<:v��y���EC�;K[𓏙��^�$M���G�o�oG���16e�\M�0r�MDz��ae��k ��욉/V]�?�T�n;�C״��(�a�d��h��h�e������r"O����Lb��+�5�7���NF0����-SÂ~}��_����t=�`����v�j&e������T��Z�n��n�h��X��^kl*��El��>���c�kW��A�
���ۄSɈU��)>�=u��s��rY#ޔ+�����A�`�׃D�bf�w6r%`EҲa����]vUU[��p���Lj�k8���o�.������M
��&����<�~7��|��|��S fo��E��ٛ'8�꠨��;�p������7��nC��
��0ڛ�f���Vxr�j�*��c�`��2�
lJ���3F�PM�Yd�2������.UG�y��L'�րy�k�U6�ŒR���!U�*8-ĵ #kw�jQ���a�8N�ڇ�if a��:��{7�:��Us3�l�X��|���4�
�.�>��8�]��8ab�>�UҬ۔���;��l 4�֢�x�.#�*g@�W�.�\�W�6o�Ѷd,C.�]3�Ftf�m�n1�����r0c��eW��~[<��%:@�:� tf��a7e���w��G|ҟ
O֬�r�<��|��z�	s�Q�Gr"�WE7��($t�:���6���� �۪.`a@b�a�~�w�s;���o+8�DT<�����&����
�t���|��_r�θԚWɬ�mtSsMװ�7p0�Ų�z�0�U�e�.�N�ELM��4h�H�NدD�g3B%*��t��������0���q�)6���A����s�cŒ�	�a��
+R4W�~��v�
b�_If�^S�P?ԴJ�4 X����[�yw�^�N˞��2��+����VΖTQ�bII��7�yD۲0*�r��i
�n&Pʂ�r�z�4�)�ܩ�:��z��dq�k�U}&e��i��ٺY�Ϟ�b0�>�M�����Y�Hu_m�MC��`��.����/?�$�w�~�]��Ωjڴf|8(�e�~<�/�ro�&��6t!UDc:�^���WG�=$�{���Z@���O/���W��^l�V��pܯM���Z�'�6�ۊ���SpX/�m�뺴T[��{L��Y!��p+Ę�*�(���ŌjY�d�w�DX�ǟ�`^P#ޓx��P�n�U���H=l�nwF�v����Y ��	Çz%>M�<��_�	�jɎ�99 `֫���][�=���Srȉ�{�2�E��n2�Ց���IUi��cGj�GKx�j�#��Ff-i�tB��Z�UKd���X��E�K6 zgMgYS/�ί�@�ya4���|����F���s_u�H��q7�jUv���{�%g��br�t������}��L-<�^iX�@�g�Lp)̻��
�ީ�o(��r�˲�xX�y�ƭʠ�𪹘#���>Ǣȇ?D��&���O�X���J�}[UJXw��sI\қ`�~{m�n���j��>�`�rb��+�U=�O�ڪ�
D祛��tk؈\M�і������tD���e�1��!ai�ˣ���ǟ�s��G�mgx�^q3�d�qx����B�~�EO��~�j�OL~�2�==�E!�#�i2��H"����#b]�|2Q�Uְ$Ƿ]_��>���a �?)��9��ϳ��}��ȅ��d�J��|�ū�~}����u�����,ϻ�
;z��T�>�Oբ��_p�ht�,ڂc�&�IU����0c�Oí�Z����|2MT3��PM;	����jo��@T�M$�u?K ش�W����OO�+l�eV8�>ѿ���aE�<7�4��-�׫�\/~P��倫ڬn3��}:�	^�d�Y}�*/��al�@�}��.M��>Vk�"���d2��
k9>5'w�t���@F��5G��G�F߾x����??����:]�dO�)��s9�{x���� Zԧ��a���yR1ۙO���U���y��j�͉�+���!&�w�U�^�{���QB������5��Z��J�����Z}ú�L[f�������z	5"��d26�`���
��N5ۈ�ҳ�L��f%70lij88P�������@�Ś���"�1��}�6�4���A:��v�W�BBs܋v��md�wя�Y� U����b#a�����)͒�h�գ��a]/���iO����q�q�:ؓ?Э���)�>�ej>��f��B��̚�� ��s#�&z�YI��j��IO�-��Q����Us���U?f9&p�� 7M�)��������� �3�F�Vh	�	�;�%	W��~%�w����#Z䝹W��x�[4��7.l�x��?��/2(E�a�=��¸|�%��$.�w�=��f��kB&%�dF�Ŗ�
����@kT���%L���z��2O����Q�UY;ԣZ�� R�_��Ӽܢ&���)��8��U���ZK<@u�1���n�y�^<�j�U���}Y.��B�P<�����ں�,��0,�Y�a\��`8A��S�%�U��O�Z�ke��&6���9�ތ����(Fr�h|�*���,B-&ㇺ*�7��S�=�);�p��<�}^/�:�2�P��y�N�(�
��ҫAj��̃jS4�KP���(xb��=k�8��.��k�`'��Le��gL5gi��_��Z�\�������� Ã�~�)[�l����`�<�7�O�6�6f��4Z�Οd�?�Ãg�/)W;���
�m�{��!���cϨ�lf�F���zJ*�g�4a>�����A4���h��;k�➎�Ʈ�xv��;1,��MкmP;��ތ(��e����{�d@Һ��iw4s�n\��h����j;���f�ow�lq�u�/��Zc��R��f9�W��H�E�6�o���-?�[u�	�b�1k��%�uw����`�����P7r�r�oQ=����́K���'0]v�Z�9��mӱFt�AU(P�q�VlW�a��rS�X��ua枆�+�@�!A��.W,��>͂�	�<*�����e�rsc�n�q�r?r
���-�v.TXji��z]4�iF
�)
�\�^{	��e��]�>#K0�A�,�-ۢ��\o?�-�5=k�Zka@���Ƨ�(��d$L��%��q� Uu�-���=���b�U��˾T�N�M6�in��F8��b��ў[�)��H�=*7�f�<I|�x:ݻ�ò��a!�I�Ü��H
/��]�/�.'0�J�؃!���js���=�رֺ�{xY������B.�� �N��k;���?V�z,+�4EԌ^��(��e}F����Gwt$�������Ls~P��Z�s)&Zf>HyZ!o��E�c=��d��T�9��x>:1�y~�I;x"��Ν�B~�	\'���EI���s�(S��I���aE��Q�'��zn*fw㭋����?+���tu��������;ۮ�-�}R�v1&���]���3S�y#��+��e��G�8诃dd�X�U`u�m����v��*eQ7�#���njf�m]h���Y�+��f7�S��/``�6[6
���=#����h��%f����ODk�;���
oOX�.?t���x���e+zj���̐�̌���m��-�pCX,��:W)в���č?��_��%�<�t���f�rKR
�~�V!�w
��N?�SS@�\*C6o>��M�Ď�}͌�	�	�Խ�����^1�f����ͱ�ſzC_��84b��v$�=�Wx���(
/��o^�}��)�J�A=���j���p����Y eO�R�9�h4a��'�{������#���܆��'�,����
�I�u�7b|��\���ƈ
��^}�AF�gh�憚�(��ctVM�4��*>]fXv�f�.�65�'w��:P��_
�2[8��k�'7��|��S!O��޿�)4{Yj����⸰���v��|�O��<D��M%�/���76��`�;bn� v�� ���ז?j����1�P���N�"���xn�M��N}��[.����e��(��[�]�Zb5�AK-�Z��q�B�kyB'`�$,J���P�����<������?!�/R�6�Ů������RD�TX.S�aHڤ��?�ء���hQ>����1����c�cn��9�	��0�����2	�a�ChZA�Ծ%!^�
�����n�`ao�,{���=��Ã�C�NyQ�od����S��A�����Dk�M�Ȭ�d~��<�o����v���1oqS@^�|�1D�9�����{�[�wd5:kn�'�� �Y���Ǒ�o}���e�q���z�����P���ϩ/kٸ��J����.�5�������ޱ�Z�dF�����ޢk���Jz�Ӡ�vt?��5��w]��1w;CSiGM�����u}��0/�UV���ׅ��ƛ�$Z�-0U[ ���)hN?�}u/�'A$���9L�0CsL�#��|r��4q����GF|��a�A ��Ҝ�`�9)���nwb�m���-�rcQ�h���zA��5�f��V>��a�E�
�8�N���"�AS�y(��!it,�����m!��BW�W=Bx�O͕�a+#��\�u�!^[jG6�*J����K?=G��E�( �Č�_�E�|�濢7)����eXQ�W�2��ף����]��ȓtq-�J�)�Es�j��8�қ�{J�$*�mI��,����(t�r��Q��p�Ƞ�ąe�k��*;ۨc��M:\#in��CՈ:f��{:NW� Eb����ml.�	��h���?��`oB[鎤�J%�5��>�"�*���
0�����݆��`h�AX�C��z_�@��P]�������`9[࿨�é�d׍����k$R=8��������G�?����>2��	-w�H�b�vMD�Ի�j�a��'��џ��9�?v�� �i�m������@�������"I���Պ�_?\>�`|̣�\vʵ$��m|��Y�W6���c���v�
����	c& {I>qk	�W���\�SMwyl�i@����� ���c��\#�}@R�D��P�$�U}U���H\�>R��H<UQ��l˫z����7��J�ͧ�N�T�3��i�Ш����<E�,bPޢ�` �CR4�����ڗʿ5�6�@�f��.
�QY]��zڻ���1���Ec(��ܾu.�S��RzC�K�(͘l�E`90l�}��W��rǨ	:�=l��8�3<v��J�߼��KY�"�Y�e�0����x0*:�Q��pPċx�"��ι��L=r����b/0N�V�W�mx�~���ڛNtH��L��A�F�J�,�U�Z:7�&�(�S��.v�\��)�akg�F�],jA�EI�x��Z�\�
��c�hG�M��lT1�X�b�Wڜ�~�[:5~����A�m�z���b=���:�}�-;����7��v�t��M�X? �7!-}�Ŀ���й��̅��'���ʌ��M�=T���W��BI��1���L�֡�7�6-���e�xT���sX���T�ɟf,��b�*��{g�ˠAztDr��hM,�Dכr�OO�����7ZB��SK��z@b�H���Z�W��������d�cRM}��(�ۅ��F��ӿ��j{����\��jzdD��	��ڨa_Ӌ$��Q��f*����V�J�:�1��$>?������P���Rb��q_�9�:#�]��ŷxty LAĽ����[���.BZ�]e�}��Q����&�]j;�6ע���o�I,RqE}�7����2����;0I6�V�
�g*Q`Q6���!�Mkl��
‧�u
�m�z��T��S7�1�񒢈��1�p�����|����X��2��`)��H��+t~4��qzS�Ma˃.�H��=�?��?*{�&�
;�ʮ6�
Ct�s��9��W��xOr��W��ub��˜�K4rQ��4%4������L�!f��:tu�-��v\∉��K�bo���p���.|�a��(Aղ��{�j)�}A"��	�dpҗ����}����	��>(;��x_��vw��4"��:��c��!X~q�P�d;p�!�({F��1�H�b4�[T��n�̀)�0}AH,��wU?`���XKV�[R���xr��/���@�"�sNh�9�f�>��VǟtO�+�؀���E�'GP�c���0��@ƱD�M���/�5N٫�uL��o���T���mB�^���f5:[�D/�-����FN�A!��!%�3���rs�#J��K�m�T(о������{�7{ei��IT^��ɦ�}m��˲S�F�V���='��<����>��n���9C}4D�������$ �(��s5�!���A�U
�0�0�E�c���G���O����׿���
c=f���m��m�p�\d��B�0�^�mU$�8��
i�v[ְh� $����r

n�1|�h|ـ�]�C�z���p�>�Z��MI�u��HO��G=FM4x\��H��)&4���|��ƒ����e��T���/yR��I�&�<��o�/Pr�E:N��)��8�ž��#�v�D�<Y\�k�:�E__��^jsǸ{u萘
﹈�T�IDNa�h�wY-�E�}��qQ����D��}�ٳ)�z]><9��J�0�~W�W�E_��ِ���@I_���۳�����P�G�.��_�-�ߪ��]d�q��Q��\v���Xs��Gxȁ�i��`��E0�EG��j�$5��uj��IOrt�B�m�=2�j��7�6P�u��Yj�8�*����f �E^)t�1�n�Z{h����i*Q�����:㜁=�����0��7�����(��<���V��9��׬��yw�j���v��s)g�\���W�H�Zp���K�����Y��(�Qy��h�gUd��Q|�m��&�\�?¢	u��v��M��D�蚃-!�%�?W��e��UuQ.nM�K���Q�7�s�s`��C=��l�e��{�#x�Ÿ��fi�\�� U���͠'��̘����R�q��=4��}a�[.o
T>C�gǁ@�I�yyO��w�^n��ۮ��Զ�=�G�iN�gw
�OI�:2�gҶ���j[b�~�Ո�;���W�W��|��~���k�V*K��u�����O?#�����x�/�+��$s@���
2�%���y���o�#b�ƥc�Jf>}L�Z~|�+��*L��B̶��F/c?�h\tS!a����ʦe��f���=�b�D�!�Hv���������$i���&��6�47�H��L�b\L�|{����n��C�&�$f�\X�i����}й��,����T������ߘ��س4���%��Xq6O+g�^9�e�)��c���omX��5�Xh�%"�	�9�|{�Jo���f�ы��Nc�mY�vq	u,�'ͯ��lFL�g�Wf�E�\Q	�us 1�bF�#�ړ!]����@��d����rG������m��PE�>Ta���UX�R?��#���A����8«7u��d�Y�C��d���� i+~(D�-��2�'��yz�N�%��-3�rJ>J��3Irn^�4�6Scx=�Z�p�Fg�ό���ކ���G<="c�EA��|����:�Zy��Wѣ.���"�=��XBQ6d1p�o*{oUŬ���.��mϾ޳�����5f`�]>��=,M�F��,?9(�M��#Kh��QQ\�Us�����#�#+aǐR�%�&�b��`2b)�9�ؗk ���O��<�I���l���
�Q����p�ǁ)Lڽnn0�W�!:�x���6�
�����
�6}ӫ�ןIRmr�/��6|ᝊ�˜A���dd��ɋ��2�N���Q�a,x���̙�S���ɵ��g|��?�^����x�q����Ņ������[��1�Zq>G���>5H�֡����Tq�kҧ�T�ʱF���
� �n�_�X���sC��7���J��n�n]�6�`��c}��V����NG��qpӪ�j�PWE��t
��^����)a����99��0��{[�֞�lVNHoT��C���ᐐ�@1BW��h']F7�
-iQw��-
�*?,z_ҥʛ	6jؓ6#&fTI����!�������~�A�'a�\A�}NB�h>̞]
��T���Ǎ$h��1�>з��&W2r24���.γ}+s�;�Xi:4PxMI&v��@��'�}(�P{�r�$`�����\����K3�!��!.�c��W��	��#�]a+�4��V���4k�/����D�{�P���ڕcI�fo�O6��/�i���o&Ef/n�
6T��!�b����L�b̥�_*�ѷ�&�e��Ј?}��/�A�҄�Z���[��9Ë�l��(;��*��JlB�Cs��^{���-oan8���Q�����~��t�np2�|�W�/4̏�c��D4���@�##� ��8�������x#��T>�<�(��&�fս"(�ȩ����cJN��`km��RX��Zo�+�1�f�G-4�Q0;f�1���^R>�HV�>ێL�X˧�4x���@�������7�zlv�JČ-P��"�z_X3���=ϞΟ|�	����4�F���0:��iw�+4��j٥�L�
�?;���h?p:^�;��B:�'��W��3���C
�x��qȺ�����%�ng�`�6��r�ա5�/����K��=�lo���i[�T�ODI�NWG����ǞZB
P��!�V�Qk����E��|ҩ�55�/E�R�B�{"z����~�f�=���٤C;F�2jp�J9Z�=��bg�!���e�u�K��h�]�'V�xc'��M�F��V����Q�GC�;�Z�?Oц��a`� �Q�l���e��^��ex޵6��Ȇ�s�!x��8@Dr��$-�<��D���'����c�8J:���.Jv���|�cvK<"8{�s�t��S��\�7�1%Q�/1���C�8�=E�q��)~\�n�;�ݶH�#���m�ij����@��l�� �L&�Lr�Q��\�7=��O���^�}�x����m��eh�m>�nI?6�*@)= ���=�$�C/N�gN������JJ�v��f���qf��f�5`h����z�:o�]H:�)&+�a��HQE��v`	A�-0��w����pφ6V ��"
뾻��^���m*���#�C��9���뿘�@����4���-�N�?����V!j�<���S}�lŝB�/H9��\�PY����L�_��������CGtfl��o;�zô���������E,E^,�R�LJ�$��=�E<�-fxkહs�xL�ġچ��d!�}�:,<z��T�u-�����#\������+2@0('�O^{(0��+��:��"�kI�\A�u�pϫ�=�:��&H%�Qv�u�}zZ�ݥč�
��яR�N�&'}�_��w(>�b}] �Ӻ?t���E�a�$���+;�Nh�)f�=��_��Zn7r`I>�;��}�%&�ڐ�qm�S v����X���Ŝ�ݘ;s�K�]���:���C9��u�*[�&6�uH���J�])���� M�V�Bf����9�7s��aN!�/���ZM���H��s�f��TB������&��e��{����{"���1v
G1�S�<�*;8F�hQ��<_L�9�Fٚ��b���g��jWH6�ֱ�[�V����` >Sv��7�:��h�h�<�x3GO9[n�ŀ����"Vˑo��e�ڞ�V�̭AV�]%�z�UI��f�a6�N��D�n�0��& !W�ˤ�o(�t��p��~�~��F�nE1�Y
����0��r�1�����GQ�O�F�A�Y��Wj��q��"��f*�L�y&�L�6�|�F,`�U���G��c�[�
�rƘ�ID���&������	��\�y��t��0D�.s����<㵩9�#){@9�U��FdL�{碑$#D|sK��Z�ü9��L:g)�]A�����i?Wn,`�5��%��5Tb�;a@d�,��+���{�>������C��$�gA�.ϱ*]���r|�c^?ɸ���m�\ftneL�����d�Ƭ*�"���?��9;��7a��?d�|�q�{�z�=ʼ���,{��	HT�Fo<é��~��ö"��=MJBQM-X�#h���&B���]jyO�I+�G�P�>?Egf�Y�#%h$����c��v�&��u	~��~A�BG���0����Ou�y�k��)��}�@�A���F��l��0��Է�+����GcX:"�lLa��G'��p�
�j�I˸tb
�+sq)"��C_4Vu�l��R�]��'��Q�2�b.A�60�N�6�%�o/�<��C��!<��㟒?N����z���l���l	���ɞ�[2�Tl`��+!e�P�Hq��&&=���4C��U��Sʻ2؁��eA/]4�e�Q����6E���DO�\7��Dro�5�B������/��̯��(D�S�ӂ�Ps*ٌ���d#�����d\�.І|�R�Lȳ����+�d��3\�VCN��ƣ�ڴ-r�=e�8��M��+L��b�$��B3&�b��׸X6`�V#��:�
H���]��	��N ,1W��F��.����̀�~Y}(v-)���5
��Ąw�e�y��V��Ѕ�}�e�W��d�b��G�P(�X�-���u�DWA�'�:�e�Dw��!G沽u!^)�r�'g�^靤�!U��z]Pn���!<�#(8�*�@�U7r
ij���S�L�'�GF৉����N:��1acژ�*�Y��
���]K]u!>�Sg�G�UR${P%"��
l�����Y�i�bp��?H�͆h��.�W3!�e��]��[����l�Įi�4E�˷����1����J�<K�#ڰV^�7�l��t��ze�qI�Y��|��U��b��κ�
I�b�.�d�A�WQ�hju4��m�Ջ�xā���[�?��� /���#�{��T=�s���U@X��m�	��ɱ��#��H�A.�p��M
E���1�Y^���=6Xr���o(Fᠣ��d��V+��
���~:��{
Y+�p:��J����nPu�d�YVg��|�y���PM�FGicu+`g@�g���S=�p��F#Q� �_Z��o�F�c�~�G�;2C�G;�y���Q�]��q�`��9lN�7H�SdO�?Fp��M���x�J�2�����'ߌ'��I��f���ɓ+I�(+E���'t֨6%q���ON��}�ϏN'�͞4���/'��`��e�Pĉs�����7FS5?��m7_66�!�Ļ�;x$?��k�uӮB"m�@��]��5���.!��+?��~���x^���fFZ8|2�5[T�O��xhN2S=^]������u)�t�56�;n�?F�o�J�ab�;.(0Vt������s���fǂp���^���jo�В\A3Y�7*r*p7*k2ɽ�5�ƒ���FvP���}Na�ܾ�Oe��0�=9�m.h�����Bm��/M�-��7GԄ�#4xڒ�+����R ���
ѽ�O�z^ͧ:�꡿��v*�`�y�\>��㎔�*�v��z��&{����k�^3�H����$(G8�!Z�l�a���݄ꕭ�6j�&��e����b�i��Sɻ@h�l��W�\���4�^��$�>X�|6���0�����uNp��S��H�R\⻼�R�W�n�%�o>�G��FQ�0��q�ΠlC@�����ar�A+������X����~�pn _!~�O�q��j��:C�!j�qy�d�w4�����̛q
^� {��ZY([8�>��h|N�:�*����|���[�i(@�k�ǨN���ӪB�u.2���V'J�}���G_����ᨿ�~}�j?n�X<��FI��8"��#Le�/oF}-�h�'V�dT,�c���ub!�����;F�Y9��X�d��7�3Ы�wP#p�*
��q^Ƨ6�W�梠J�7���V�&<�`n�b���w��W��b�ᤆ�RP�ՠ�ɽ��nw��ҙ���Gp'^���)h5b}i�Ca�$ׅL��
E赉�i_��0�i�ɹ�,>�m�$����-%� �{���`�S�t���ܸ��Đ4x�4����_�Fͱ�k�dՀ'1]u��Sg�|N���� #z�J�N��0a=������	Y[�o�X���f(���7Wʭ��b�N�j<K��&�&Gg���*q�q�F����U��Tm�-�(����T&\ä��:��G�G^�%�\X~B�Щ*��8v�p|"Bbͬ���W��?�4���'���G8Q��#{����re�(=�+=�ԣQP�TOg�h��	��{t�.�`�B�Be�lo��:����@��X�
O��j ah#�`�T���^l�ʼ� ���<{i�7R`n�v�4o
P�y��d+:U���ǖ�����*k���q�Y,����u��v�0�!����G�Hu�����{cxa� �6`�dt�S�������Y�Ap@>b썋1Q��v�9���!`=��,�e���j�p����W�d~�ş�:*�9>zW�z�|��Tܖ0t����(V��E�w�pM`M�,�����:�Ȫ/il&u���<�C������`��u����8;�1�B�(�`Dt*٨Y-g]��F��/�̮��r�f���x�q7S��aFG��՛J��V��[X�D�^���	��&.�b��W�@D��l��x�m�[a"���.�f�v	>Ⱦ��
�"�Ir�0
�$�3�Y������q��.՗Wԣ��n*j�mV�}	Ĭw�����)ƙѣ�v�i9;.Lfv-�d
;�t�wIerPo��l��bk�M����8����M���)�f ���ʋ�0��Lϣx��|+����b�ﵻۤ������
��?zp�Ӱ�T�H�e��]���|bBt��kEˈqFi!����?PBMG��.��n��ʛ��-���;i�i���u~ܞ	W�]-Mh)I��`�G��j�9�:�(��c�&bRL4�7�9�>��i6H'�<���:�m���Ϟ>��(33Es���>�g� hTW�7�0�}ߗS�ׂY�p����x���5���k`��IO�q\�Y��ȟ|x����~��_��f����	�(
��)�=���x��tW�bS���6��s��q�#x��82�>���[i� d^�W)‹�v�38���jE~~bEe���'0��<#�ј)�*W����\��#a�vL���ɗ�2MƩ6��@����ȁ�L3P�=�6��{��W�TѦ��f~Li@^�������[�D��5��0ZW�����erqGE�g` ?�׆<—�7��Գ*/<��)�+�U�f@dbu�!�lj0E�##/�+je��H>~�ͻ��^��1렦��W/���-ЕO��z�>.���aT���}�����Td"�1�E��O���b�銉�I��;�2�#�$XI��k+��0!fq ���y��!�����P0�g��ӱ��}z�������mUdι�&�
����D/Ba�|��~q�=3;�\�>XU�m�����1��;L��O���F���)�~`*Md(W<A�e�{1����-�CA�t=F����w�š�VFi�_��;��`S��4�˳����3S6Eȓ	�I�P����$$�`�M�[�8ߴ��ԫ4�(E����m_�y�q�*�.{�_ꈠ]�{u|�"��^A��D���lT	���F��G��/�d/
��+s�	�i��GdF���Z?N���)v�
���Ju%�BI�R�I�C>9�%�W�����o�p���C5�)��J�E�0���z2�W�����5�[?v�M!ba�\�$xsJi��[�Sj�-$���t ��W��0��C��%�ޱͽ��NRM�H�YO0M�f�m�䝻�S�#q�`�%yzdC����Ӓ�O*4���Q�p�a%3�@�Kg͕��.7;�t��d���P	q��47-�,ؕɡ%���2�7����V!���6�N��L��H"�Q����U(��<pS��J�������lpqI�݊�	��5�2��v;$V�!pD(�{kS:��nq�]b��T�����n.ɬ;Ѵ���P3�H��/9�h�폖�`;�Fi�Րi
w��m+Ꮌ�HRN)s���/�[���X���G4��GdZS�Gκ�)����QӰ���uV���>b��갧���!$���1�*�
~Rq��uRM��H�(��z���9уC��O4�cU���s�^���c���H���4��X.����.D���=5�c^!�>��>r{6��{|��ִQ���\,�݆U)�Xb�ԛ�Vb��C���q��?>��*�B�ԁ�TTX��$K���T�r��+I��YL�ܵ9��8��DF
ָ����Ǥ��k%.0n��aE�dA�PM�EdX���|�@�m��	�Wo%W��w�"��#8�I0��Ά��?���K1�^��S5ꚲxY��ȧߕ�=����Jg��;�1�+�3
1�'@�B绊v${�
��j��0�!���Ŋ��0A�'j�rW1)XM�0#l����9�M�yP�[��Ҷ(�
3M�,��E���>��!=���'�=
�;Jl���-����Cca?H�>ߞr�`��"*k����R�#~�l�&��7o߿y��qq���	��嗯_��7Gd2VތI�2���Bd�������q��
����b���dN���0�x|�u�a&g���^�H��7�*�@��U��K�6f��ƾ��������O�O�1����Oɹ�/02ii��F�������{�3�t9fo�X2S�Z0v���{u�B����iq�AЕ��W*]�L0�
�x��;�|	'�r�3=W�Ӭ�q�d9$D��{O~�x
��F���hSͳo�_��Q.^Nˆ��9BR^]�
���I��$�j�|L�l�”�w��� �v~Q@�����Q)�����$Q-�V����������V���֊��9w�#'`�=�������uk"��Y�TFbeA]�P�$�@����᤻�l䀬����8�&\\J+�	_
�	
�Evݢ��I�=&o,��"ˡ3�tR�[�C��e&�⢙b��J��X���U"P�͊f�ͮ�G9(�ٗ,�рa�̠d���-�8q�X��
=��)/C�����8�I�X�'v%#@U+���Vj��y��p-���a���|����I���<��n��+��h%2;��	��RgV�9.%P�%�n�7뼬W8Uԛ��=s4ώp遨\��|��3١��6�m3�WX$�d\dXƹ�ļC-3A%�����3[�\���
��n5�14⊖��[b��5��8{!��Ҥ�9��3c{jQ���P�S�A���A	r�,�1��R�D��\V��c�E��b��i;7M�CQMq��>��$g��P���h�+�l�:��V��j?b�M�a��y=�T,Ԅz£��,%r=�^/��l�vW�rj6�k܊�5ٲ5�[�؜���<Ԩ��}#.<5P���
�̥P���w�ݶ�T���^�z��ؤt���m_�<
K�Hܳp�|���~�=Y4;B 6vkc�g�� �t��)ԗ>�4��
N5�=)�;S4�P=��}%�*ηD�0Ge�h�&S�2�E-�esC�QZ:��Bݐ߬��P,D��{S�X��d�QLu-)�` �S����,�qo�*Pu7N>�ɴ�l�dDSX_�H�;�Č}F.F{Q��l|
8ߙnT��ܑ�rĕp|?	�Σo�/��d�r]1��z�\�Ⲙ�[��4>Gd6&��F���~�|l9h��u	�]ahiAZ�?�9ʇ/�5ލ�
�-�kx�t�7���W �M�Q�p�6���N��$1Q@9R`�z���Z��-�&���
aeGG����]�\~<�Ll����]G�	�f���j��x]v���N`A	�.���q�80��c�L��͸@b����ێ˼�-���ÙC���ʮ�/+ר����A��c�x�A�Z�8�ј�_�����E�p��cXQp'����π��Բ]��\�"�"8��G�����S\�Y��>M(5�w��Ϟ-רI�s��m0�Q]c� 0
�ak[�氛�N�9��ǥїG��"\�xY�* ȃ��!!ibE����BΦ�RP�ΠI�=]�ő�2's���T���>�.����ݮi�e�I��:�P9��~���cJ��8��b8�%�榎�W%��<W�(8:�'	H��ɶ�e�gQ��<{Ipp�P\6��0,��L�M���3�絝�=�RI<"���Ζa��s�8�iǾB[,�]b��jv��	`'!I���h,�vǥj��ξU��sF��}�u�^�
�?����cܡ�v��၁ͤ<��
s%�J�SƔ%����P�l��Q���L����5]�9����_o��
"����
�Cj���|L��Y��u�r]_�v�!�ၫ),"&{�	����5U��H
��#ȃ(D�
3��ħ���2�\I�iLi�f���Oy��]�y��ڜ���T@�)�J'	F��c$uAl���\-[�ȝ�.[F��-ԁ��&�{V���'�	Po��_��ٌ^�a������\#U�[��f)��cת�YE�����.O+��j�:X3.��+ܥC�D 4�����wp���N��V�!�н�ࠞ�n=W=�${zJ��|��F���ϚNy6����(W#@ݩ0��!���
�J 2�B�F|w�PCrJ�q#�Z��'n��z&�c�?2���$9�7�UX��N����DemMxۡ�h��f��3V�ƵȨ�I�YSV�Q�)��ķI<`<щ��+j�y��YN�79Ox��U�N�ʳb���9Z�:i�bv�2���&V7��*�,;�u�T:$I�2F�q`��w�s�Y��G�����\f��.Y�&�C[���[�Z����L����f_w�Q��=��fM�`�.Ȳ`ʺR��V�q��s&�8;��Q��eǼ���D��bы��Ps(@���T�0�3��Z��6��g_�7�
�����5�*�1ç��>���_���3��{k[�8`���U��gO��W1�0��}��gϞ�`�3`�W���]���_m!`�e�<�'[��9z��7������M���)`�FF;\q0΍i�����=��2�)>����g��a�qF�@c�
�@0�����	�M[58@�@�H�Ǖ����ǁӈ����e�
h�{[o�m��]�Kt[4�A���\����\}=`R�}TW��5�{#�>�"[�Qth���ji�x��ݭ$KW�ƞBE(݈�r��Q!b/�)Q�J��-j4��P�f��}����N_
	�:{����#�����K־.8+|k�S,́�Yē�\;��ڀx�R�������m7ǐ.0<IaM��Rީ>��������n�WӨ��ƌ��3��)8�HEI�<)�2C��7Roz5���c��Eeﺌ^ۗ��
�G���٤�\�F��������7���n�jV�3}0�q�#KyTԯ�+�r��L�
�v���L�9L<�q��';���-p~^/j�I`���w$������x���)�ʡjuQ��'r<5�Un�1�U�o���I�>qPx=�D���A�-$g}�??���9x�o̱]wq-g�lc�}8�=#�����U�,'?����Ǒ\f)���k$]��&�M≝�� �i��v��iv�Y�fW^���`w��4�N�x��6�e"�g�q�]f��/��_���Ĉ$�x�У��i��4͌���6��b�iֺ��1T���I��S��X��՛��	r2���0�b,�����Ͳ� �1;9���,�6�ِB	�d��	�[;���Q�w%N9���3)�dz�z��yᢤh�%Ψ�8��!�=�G�z�X	�{�5 ȈJw	���Y�?��Ed�hZ��`ܴ仛q�
�KL��dWޢ5ș�`��{p߀�	V�[fa�
�'
|����ؓ�_�v�W�bKH�`9�2�۱���|�~�E
1I@mэ�
��f�f�9a|���Y��9EO�Y�W�z1k����~��6���X�ҳ}��B��
�p��o��
��Y��0�u�d��(H<��\0�0٦�\Jy���'�ht�-�A�{�T	5)"ؚ�1��Ƞ�0�9���ٻ�d6�N��(_�r>f3���i�h����9�TQL�}&8���쪶7׬��Y�M�	��|���I�D�K�RH�K
Z,H�4�G�-�R��qb��3�kݬb��+d�X�ե3ۙH�nO�0�E�hs�O��@9% G@�g?�nd����ۿ���_��^|��G�@4�����o��g@_�&�ܱ����>��',)�(���:C�M_�%�X�O3��l��u��+ȅ<�=��	�%h��(^�5�7�3�b�]
75O��Sw,�nݟ 5��"���N��B�~�����x+�G�}��6�(幂#e�xPlb��P���>�	2�/)Y̹�i����Q�h3����f�&d��T�ga`GƼ>�o�	mf�)0*�!3H�:�:����D�î�u�K����I��)%
�}0��4��H�E<��m/ǧNE���+��\�0ӭ�t^!a+��	�^.sz�~n��b��E��Sb��c�Y���<��/W�6�]��d�m��Z���"�,�N�z�L ����F��g��'���=%'��S��S�t�"�=���p�zl��$ܞ��1<y�|�2��7{�#���G��/�8��SdV�Ut�RoL,���b�7����b{�
�;���_�a0��|G:	
7�]��Ӏ$[.M$,ͬ��2O1��Y(��v�8S�h}f�h�(�icѪ�����Ԫ���a�� ��	�vgӡe�!��S�t��WR��ɘZ?U�ы��$)���w�q0`bs<M&��aN{����伫EP��T�p��ϲ���;��:x��q{�f_.����hOb1*J}��&N�閶�����F↊{5t��,lϼԀEm*+�
B��NP۟� ��4����~�dZ��B��p��cn���(9D�ٚi�����л½���ve2W��X��Ӿ�5/���k��Kg�m��'s���&���:��S�����p�A^
��0V�1D�C�j@m�'��<�
��Vs �y;�gL"�C���w(�L���o�+M"h�`�"\�;?s[?3{�#AR��w&gY ����G�����4$��s�vG�9ԕDO��<�5x���Ǫ���
y��|�
p�66
��P�WL�>��U���r�L��;b���㒚���藓9I�30x����f����رG�(�hn����1�}rG�"KZM��\-�jpW�Z�)[����ju���ԥ�����I��&�e��n��q״�x�д%�l#��Cis:NQ�N�J��mM��2p�sl3	F@��[1��<Aɤ4��̑���Rf�G�&]Nr� u��*�KבtA��'^��hF4����h�֜-�K&q;���p�&�9�Tѕ�|���Qzh�1dF,���o$�D
a ������2�T�k�Dm��!��qĉ��C��N��[�np��p�2�h���8<
iޤ��v��w�O�«x���Z"�K���V>z�[�:�DХ����L]y3SjV�u�t�_p��yp��G(T�ؑ���Wt�Bl��gx�w(w�+�t�]�У͌wEJC6Ha��:�P�b
���8
/�˱��P��
i���8�(����$�r�v��q̆��K��gw&����r�ƻ6�Ё�y�`?���>S�8�$ͥ����4$�UNN��O\�4�B�b�P�e��)<��G�=4��Z(�5f�_�|�����&�S��߾ݽh42AI(< 5Wt��);&
�#��r�9��V}��M	C-W����$�oo���
L��+i�"�Y�]��JE2�@c��`��]���>�wR��ny��w��@Tt��-31�<Š��{	�~�P.�O�q/�V�P|n�N�[������Db�]H�9ux�H��"ب��s[�����H-(v����ŦT�<��/<����-&�mM��4���F;]�P�/sG�
�Gu�򷑿7�:8>հL�;��y\xQ.ь��<�#��*g0����F�A�I�����­��U>w�	=���r@�
�}X�wP�0�9HW�T�k���:^�t��p'�}R�b$=e2a^�bQ�����X6 %��w��'i�E��Q�/��R�|�r/�wh�D�r/�tc�q	�35O�������Vݢ���+�� ���?�~����c�

�-�8x�L�C�"��x�h��T�3¬�%vo'�~*�{E�4���]n|�޺���?:�ۛ
��6�1g�@긺A���z�۰�{4×;(i5�k崂���l�<1�$�i����n��|�<{���G�A%�t�5u�L$\#�4t��^{�+��ǘ���N4{#�U�!;$��ە�n��2)p.xd*�~�WG����5�X���`K����\��ό�;4��O�01``�ː�D��Ņ��ܛ�0[�٘����>����mW�Q��ů>;��l3�8
���ya�v��[���f ����1P9;�A��F�ɗ�vб��$�H�M��\_���N�!5{"VG_A���r�Q����!��r;����g�rBKr1ʯ��R���t�GbA���E�݄]fS��R�J�ѣ���/Udz�i��"]��
�,�Y�<�$���~�2��<����^_��"�fƄ��}�
�(�UM~�D7Ȫ�h�59���4A:=�(�[;����<$	s�`�dפvg�/��S,�Lάl׿�l4@����&��1i3W����q�
�������#Nw�ƀK%O5$c����Cv���¶��!��Q���z5�zj�H���?��f<���.1)�t�]�mU�MlM�K2���� �}肳J�
r����|�a�\p��b�.�+�S�Zbg��'͓gr�c�Ao���22{�&��]��J�߾򔶥��5LEL�w�Ʒ�E�#[���PKe�mW��v�}�bsetuptools/command/egg_info.py�<�{�6����@��G*��d�ۻ��|{�<Z_ۤ_���s�2EB���m�����H�v��D��`f0/0�L��MWץJ�z�I�<��ռ����ѳV����յ�b�u)�]N�4�2��v'`��ꪓU�&���Ѳ�74F�eQ���b��m'^���{���|	ɶ�[e�<7���4m��/�9���Ѝl�y�v렟�R֫#�1�w��Y�iYn���g~��V�Ojg,j��6m��Zٖ���Y]�@U���d�d�~��
�-U�К�ܯ�mZ^�[y�um������y�́��b�o���� =ܱ�^�\�޶��+���i�VIh�i�A��	�.�J7r����
�4��j~�B���,*	_T]���.�n&
����
��]=G�"�eZ��mUdu.�,6 ���%��zaւ�,L�{_ӧI��t����o�/�e�-E������(�Kѵi�Jث(�<ƙ��B<U�Sz*��Ǔ���P��DlӔ򽈟��~y���_q��o
H�H�{�$��Z��qҽ�"QT��r�-�V���B&$g
S��r	���e�I�l�X�����"-�V�̳ۢ��QA=	N�i���Q%��G�jq]��tQo;���'��I�A��j'��f![Q/=x�T��pX�8QtD���R��,`�W"B�E���_dk@&���L���2�!�lP0%,������Zt$cB��Z%HY�S͔��OХ��TY�H�A��v��E>�9Nj��H�:���e
��x.䎄u1O?=�n���K�D&����M���G��#���@��E�(q/��x��~�E�.E��]��)��Z%T���|����G��h�M���X��irwkIcI��
6�`82�c�6yym�Tr�dQ���i0����X}|�����LX�?h&�j+q�����k��ܮk���:�RV��K���yY��EW��
�IE�`�
M��l{&ǟ�oD�90_8"�#
{	P*��}bi��֋�2d(7#����@�;�Gwg?|����s����|wOw`��щ��zbУ�*0LȖ��t›뢁nE�<��K�q���r���[/	ُF�
�џƐz�\��k�_�u��bꬬj�K��z�P8D�P�跣����m�~=��9\�|�%}DW����6.~O����c�kg�Z#e=��Vm�mf�xn0��b�����M]�5�^_�.hIE��̰^���µ��J���:AR�.�@�洭�=D����<��5/���Y�1�
�z����qx�iؐ��X���0�;0$�G�0���{X�{K�<��jtORп���V�^��7�x��4
0����F�Yӂ
n7�vC]fbY�+u�~��WoϿ:�B�����~��W_��'��b�U��ܥ��b�*�Xi�c�.���~�玲Cw�xJ�nೕK���� ��7�NV�㦩f.���j%s���vI�t��s�g"�{�N��	�˙��$,:�:h���Ǘ�����#Y�3�I�X�ìgz�=�,U��C�h�dZ���w�T���0�@��d#M��$�hq���D���B��`[X8;`l/�e*d�K
�y�de�to{��(�˽�1��I��!���x�9�'Ӑpz#D�3a�;f��
c��;gf�z�`��h:^�$��i���*PP5@LzKG8fBs�D$�IBjaA�†�p�)�3101ݖ�)��ƚmJc�����t�`d9A�#"9"�Y��.m�d��?=y��'�ӧS�͆3���ie�=����� H�>��Dw@�j��s�(����m.],/�/�xm�5�+i�r�_1�6�7�@��vz;��p�D���}���Ln�q�7d����F��5��k�7�}��ײ�;0^��t��t���$IH����0W�2�g.;�P��^�G)	&Lm��8S2bE�JU�%D}N
)�c��)C
7��ذ+�M̴�c��!ޛF�Jo�%c���mo�A�'["�"�
n]��b�vg�+I���M៮厢ꔘ�n@6UWd�n����M]��Eѵ)��VR���Bɟ���=��*')��FH2^d]�k�G`H��d�	��|[o�5P�	�d]Ï����ׯ����o^�x~�d�mm�1x�ָ(�/�/��$�cö�_X�{f>��DB��#؝`�ĭ�#I�/
f�Y�m�	άg{�`�WfA�K5��-V#�\�X�b��œ�WC/j#�z��teb:gX+af[J�:B�,����Qܝ�֪�Ͷ�C�CxN�е� G�0��q��#�S�Զ�@��ü�}2�
����XM(,��$_�ڰ��ƣ�!���BLP�!�l@��t�d�}&��}��E�R`�V�JΘ{�����F�P⼢ܓ�q�
&�.�ܚ���X� Վ`�\��>���^�;iMm��"�+GJq�6˃�C_�X�����x&�J`C�#�<�R��(�F�M��E+S���'�ӈ�%:�ɏ�z�N���2	���h7����Sw�脎V<�F���2��.H<u�l��z#�
F\���K<�;ȩW}`�잒c1�'x��;�W�e�c�|�T�F@�s�>_��߲iӠ��b�Og��kD:�|������g��6�jݡ���G:��^�Ra��jxa�5��l �X�I�Sl�70�:sbcF<)��Gw���Nd~C�K���D�g�'`�1
�IA&^��4�~�Ih	\ʆ]l��Y^��m[t`��y.Kp�h�i��vM)��		��xf��hߝ�!�+�u���2#�P[0x���4��ڑ LzѸ:���HA��s��I�NY��b�	���U2� QJywu�+���ygR$f?�����r	bث$�Å*+:�)O�Ƃ�V���ۡ�|���,H����@�ŽE'��f��ć�1���B-�5���yأk��wjr��m�P|L0{�.F��*����X*�Y�*Bu��,�U���`Z�1�Q�xX;CXO9�M��$��a2���AFi��1�	�����+�yW�x0��VS�.�N�
rF����
g#؂�a�TN�A����|vŞI'�D'{*hM���K2���"�c�8�'9I���rēm�<�t�`f3���a�>+�h�Y9�Kt��|�j��}��<ˑ�ô�n�h���{0���F�2�&cĺ�5�ǀV�D�=���\�ƍ�x?5�p����h�:�qXN+C���d�q*�Yƒƒx�:�b��b��*
T�l5�v�3���0��h�����м�^,E��"@w�z��砊�"�3sJ���BamEMXѥD����q9%ԗbXU��[�'���	�qUNG4�+��#���s��b?��
�s�b��E�y�ݷ�^��Ń[,��H�]�7
6�k�Tgś
���Бl�)n��bt6�퇻fFO�a[�h	4�%+_�G;�P�=�	6� �����D<��)����N8��#H���ժ��[�XE�(���0��t����m�^C��"�r��\B�4;�č,�f���ư��)%�e�3���T�]������
X�gx@� �<�
ٓ��?<c�Ѡn(b*4%P�V��=�1e��-�լ�x�
1ْ�)�>4�Iۢ�*�g��_�x��R�Z����W��m�rĺN�9��#���TW�X��|�	���#X����ނ�רO�����7i���ף�R����m�s�������viZŃ
!W����'w#�u+%��i��o�'��Q���_pLXK!��.��s,f�؝ǟM���z�����mĉ�ˀYĦ^�38P��wD�D�=E�N��?��N�k�	+��$ȿ����!x=d|ع[��o�3�-]����P�`;֢Ct�7��z,>�Y���Zp'-%�KС�eIE_�\��.~Ot`z
Z�춮��K��cM��ˆ�p!6x"ڦ�N��,C0�'>L�P��f���H��-�o�]�^(����F8�:~�c�$�+_�7/Ƕ�M��ci6���S�p��c��d���Á#c�Y�
����YʗrGg!c�(��FD�T�q0�P7`,���K�3�H}�&��8�`m����^8����D���;	�W�m3�zz %t�Y?]=��vT��1a�@ON�|��'�Du�!��xR�IKA�N'0PU~h�5��o�`]�P��<�ެ�?kќ��0(�#'kE•��M�h1ҖJ�b�6��4>�t"�M8������X1��\.��y�UpPA`D��@"$��)��\D��r:2�zU{<���^�FJ����'J���b�Hz�Y?o&��pk[��o8�W��x}{�0��!T��U8�0�,زd��l� 
y�o�-e����j%{�F���Ga]fju\�H�6�V�J�P�3'�0�l�t�\�#�HބQ%a���\�~��ŋC�F�p��e�V�}���Z0��ÝHw��1�^,��8]
��g��$
�&^N/�����<&p�2D,:3Mv-�VZˋ�Z���ܯ3�C�8�v�v����h�k�Iэ�n?����"��I4�Eq<��ܖ�YY��!|�V��ݬv����@�T��Q1�v�Oc#(�[H5�F����E��p���]�b^���5��(�VbXI�z���5!���R��Rl!���8�/��/��|��9����@/SqH��S7�ep}��˱e��^g�������
Qc5\���+���1��2`�H��
�3��C	�o׌)���p�{(?_t/�Y�3d��g~/C1U����Y?�Mw"z�F|'�e�^C���?��[5P5Xh�\��<�t%tM���+1!1�X��
���M�:�"��]�NlS�&�6�B�$f6#}�I�v�P�qv�2ͤ3tuU��^C�7��[��:��{�F�7�����{'�;�;�0�湺  �ÑZ]��jf#�u���Vu�Ş�v$	�k�1XgYg\���x�'�R�gl��������ʶ����x�.@oa�|]4
P`��omw�Q�V��:���v��j��]m^��@�s-�ޓ������X����F����x5����o�^-
�wM�X�30{h�;Wx�_#C��RPU�!TQ��-�[~:�6<P�e[͸����U�1_����>�d�!'1��u[t2"n��*��ek$��J^��I����h��U���bfo�3ٴT	�%O�Ǿc���1#����ÚZ-���Dt�P���y�g�upC9�v���5�w�p�?�[�Y�l#�7h����s����+.�jW��x{�9��	���|��pŖ�ӓ,E�ڕ``~�O�V\zƹ@���]�<�$����U��1��R�=��p���@M�`:�<j��>�<&�n�7j�#��6�b0KH5�
��q��p���3�eӬ_h��0�2<����w~�L�����*[,�)ȱ�'�-������e�_շ�=QB��kf��5�zƚ_�	��r��N�c{o�V�gLy��t>���-8t�e�KܗD΄���
O�a.�{�;Yf��4���=!����z4�'1�?��A�P��:�U�T�cs/�WuW�)�qBd2O�qD����ѭ�qP;�k=y����1�͂�8	��)�Pm�ʇ=��R��}�~��y~���Y<����'(���g�{.E�Sߓv
��%�eˋ&�Л��Gzw.���v,G"jτ��Gc�/`�D��a�n��W��͓��Lp��#�y��W!�Yc�����.�;vNd1,�`ԓ>�"�5����)~WPR�6B�U���z
/.��Pi龎Κ	W��O�>	4*xތaR�1�aџ~����:g���Qo�Pc[����9�Fp.�E�w�ֳ���?�6F'}��h���Dt���m4��}��g߿��]�n��n֍�����|�t�_�s��2p���(X��&kc��	]4Z�ݨ�΃���H��/�
gt_���P�y :���&=Pt��v"��wՄs@S����v�KiB3�>=v�׼s�Ndh���㠼�:r�¯���.&S�"�<��XA�����7�?Qݮ�]�~G�{g-k�}Iڊ�7f$�<]PY?v�`P
��>j�A!�Q�vlS,�Ή�&[��
?x�՛m	����2ו���u;3�a�V��HR�"N�y�v`��@�]T�C��!F.��*T���\+��0tuN�1Yv����U��h(����N4��u����x��=�Rj�\��.Ҝ�Uc���x��M�5ғ>�����OE�'�ot�%���عO�>I��wAy��;]?��6����*P滹�$�F;�W���L1��5>R���������Z�=�˭16SU�t�s�gm�j�4�S!no�&�c�pX�q�
s�'֍�2��?�B}20nc=Q����篵#_�$�9d
8r�}�_�"5u��/�H��2���9��-/~��.�����z��v9�e�_�?�}��
H��K��$�†�=���U$�b�Ù2P�ޤꮅQ�_���nJ�j@J�����U$��c ����t����Q
����_Z��CO��N���_4j��mH���D��O��Z	�+�g:��Х=�A�A�;���)�$?�}x]�7��� �`��ϑ2K�{��s.�;o�i�=��W+�M;[�@����/�w� ���q/��U9��`F
�S����z�J�Mq8wDw
B9%���:Z�A�ޠr��s�4�������'|I����kd �-��
��'�0R�>$R+:^�G#�UNJn+��'!�[��������,���𖿻�0�4�`�pTCѿx�1'�G� Zb4d�S�}����/�W��0�~�����V�4&_8X�Q��o~�]��3/V+|�n�V�ݹ�{�E��M)J{D��Ӄ���Z&�־���p�z�X���6~�<}���Dߥ0��/�j���D�E����Ğ,�%O|�^�[bCT�No���� %4|�F;L�Лh:-��F&�?PKe�mW�vQ1�*setuptools/command/install.py�XMo�6��W��v�]�iO1`�;@z(��ES����]6��T6�_�7�(��:	�-��7Ù7tet�Ji]�dm3a�6�ɦ�Ʊ����ZI��l+
^�އ�7J��
�m�]�M�']�n��`��5�i#I�i��Z�um�䊽6R�4S]Ӟ���Ŗ��5��̈Z
�*掂����2��eV���L:S��)c���ε���� ݱۓI7��7��im'���/n�����$I��[ˆ��|qs�0��V�?�`���ӌ�0���;~�ɧ�R�B�B8$�Yar�:��]X�Ek�ؽ��u��r?�:w��k��yZA��s�;��!�W��v&o�Z��c���0
:ϻ�`�[�d�3�g�DN���K����
I�8lP����}��S^.��ԑ?�(3�8�II�ܧ�9�F4+
�7����uu�0���lad��G���sU@e)�����P�
̑N�Z�'�ք��jC.f��C�ϐI����5�@Tʌ����]=3X+[�W���A^�ܔv��w�7�j!L��>>�<(����NB��Q�:w2i���aU>gJ<�7���J�%�Ajt|%�E�_����q��z+���v��4��3J�V�)��U����(�YHЏ��x�&֏6z��;�t�h�:�ݮ���Ԟ�B�D��C�X]�U�>^����p~���2\��!_�+&>��,�`�0
�VP'�����]��A��d��6�"0��0*����R䊽:(m��r@ orEe��;����ST���y<��
;�-�΅�0}���E��|"�zkKi����6����%8وѓ}7gT�;C�p����XV���Ga�X�0�"5��U����$ʼ�ܕ��������Uc�z�Y2�MG����M�k��9+���Y����aY�V\�F��]?�'�oN�U�1~�	=�?��h4ۄ�r���H)<B�
�,ܠ�Y֣2B�;
���8L�����
$��v������4M$M��*e�)
�4���9�˵t�z7B��tg^d"W硫��y�"�F��f�A�u#GwM6GvnQ@
�'�R�
��[5�ftGlP��􌦞B�tGN�>C@c�E��S����)��˚ri�x�k�����%��1�>�{ZU��y�=�4�~��\��[2�5��*,gq_��!�n�eX�*����R��
�v���h�گ����`�K_a-�)���n�4�voo_�A��+��<�?��m�&�)X��*i()�P������!f��B��ϧ�lc4/M�׽�f���u���Y���T �u��t)�s��M�8I<7,�%]���˪N//�{9ZR�ZԴ�]��2�F"Š�N��N�2�

�k���;GQ1{����2�w㜂w?8�ͦ���<S�	e;#�0���1�IxO+�,���f��Z���(LgnϾ�S��R�l�;�H�5b�CW��:8L�~�J�s�E������>_�o��ێB�1pe)>d��jML���:�&�t3�~爫�t<��p��}<�z�O$N�r$Z۹����.=��:��6�{o������a��?L��b��jj�¸���Ok�I�
��?�w?�)/�kڝ/����'t�ק䊽}�����}�=G�	K
�
��p�����6�3}V%aX��~~'�3�R�fA�+Y$�s����"r�3�`�<Z�4�w'��PKe�mW\Ҩ�+�&setuptools/command/install_egg_info.py�VMo�0��+,�PYrO�Sz饇Vꥪ��]���$����mv��V�~���yHeM+J��w�A���X'S��js^
�E�AP1���3f�?����|k[�����I[���fx�	{Χ�9}w�shz�<AP4)�F'�&��Ε�L���>�{`�Y`�z�0����"���r�P8c/�2V�"k��`�,�:��O�YF���f�@"�1,�GS5�x�R���|��ҟa��?gem*�d����#4�T5?���gFĔ��ѰRTJ��������JC� g�y��Q�D��!$��ݾ&�B*/ڒ��k�>�,�b�l�׸�D`?P���ުc��cO)�F:��i��9�x/`����d�ʼn� �����$h��0夥*	e0�;e����y�R`⇛�u�̵q���n�r�Ѭ'Z)U��PHi�Ą�_
m��(}�0��	�c%�����l�4x�%'QO���1C�����N�a~C�;�)��,/^Ƅn�WV�t-Bjߖo{\�V���h�-���o�z�������`�L���y�c(�JƬ�m�����8Ym��k2��.��՞�ָY�>�N��a�3��\*�i<��txVmd6[�#p��;�T�+H��?F;k�e+���2�t�NDD	�B6��;:)����I+���Rŵ�e�1���h����ьn$��̘vP�JS��@�u4�iR�~����C�x57�v$<��Y��ʝbMq�b6��D���MۆA尩���:��'��_���c_���K�ҝ�FBZ�u����iӹ�I�PKe�mW,��,#!setuptools/command/install_lib.py�W[o�6~�� �[EX�X 逵���b�-�\(R ����9ԍ��t��"�;W����1m7b�e{���n�p`��Ҳ�5��J�1�ix;qTº�	i�R7
WU.�HYH�g�2m�a�ٔ�[�ܥt��m>��V�c���l���Ւ,s���x(�fJ�믽;j��-�n��
jf:�Z��(�z���U��u�<3��G�
Q/D¢V�>k�\z��'�����e%��N���W=�o�h0¶�U�%;	w��
���Q^:��[\<�+�[);�hϽ%4����b��JG�Ut�V���m�;z�0���*
�6�
u�P<�!��fB����T#�|�~�2�~��'���
��!z'��xL�z�
����� j}DjKILj��ga[(ɦ1�Ӑ9���%��,�-"̀�����|#�d����� �+Bϟ�Wˢ����@�-gT=�����#�SqrG�&�lBI�9�[`u'���ж�8���!��.M�d�޲����s��ͽ��jx��0{�� ��N�
`�آ@v����1�},
��Y�$�������}�.26��?�Nj
OG,d6Y��^����j�{m�J�R
���.�j�$Q\#��O�|�X��\�)��c����=���T�_R�i]�4f�9	�����×w�rZ%X�MO�q�\�”^�x�D9"�]b}��ں@��e-�6�{�8�H|�֡�@�r:���5	��K��AC�g*
D#)t6_ˉ�=����y�,�j�H�N��2Y��>C�L�����٬{Տ� ��2@f�_(ŋ-����ñ�Ծ@��KJ����R1%/�� �{)�Ƒ=
�i3��{>� �1�ՙ�P�E����2y�R�c��Ι�0l �bIh@9_9��R�,"��k�ƽ3b@�h�RԟfSlɨ1�������޲䒃��~�N���Un��e����m_8�5�C�j�t�[R��,�g(0�p{�-N`&E'�o�PO���I����
��M�JH�m-�(�+���TX�>�[��H�������E��W��hȪ�X��o�jb��j%�V�����t��vȹ��~���!�)�L��Nm��y���ȥ>,�U=l��m�ZSf��9Ã��!��ѣ��'nT��m�-3�Y���-f�n��d�Y��c���&�%0B:�R��Ty}���8�ɵ��:�$%��	���-�X�0���E�y@��RBlW�)��a�`��Ԝ�st��K#�kU�P��QS�';�e(�%'�+�@��PKe�mW�}���!
%setuptools/command/install_scripts.py�VK��6��WL�SU�m�{��C�9�-�dv%R �u�_��AQ�N�As8�|�vct��nt�� �A�n���ʊJ��Pu!�u��J[98‚6�M��@c�Y��/�;���ń���^m2�Omi���T�y"�r�*�:Q'r@eG�e-
VN�k�$U',��t3��1��i��AiӋ&Ѣ��Ѝ䫺�m)U��b�0��_Z�N<L�
�I'E'��R��f�f6ğ�x��V-�U(]���Yt�M3���%���i��"
{-g�B�Il���q�.>���l�w�&)��G p�ӕ,�[f�4ց�L�aףkd�v�C�8F��QP~�����W��j�kz�|�� �rK>IFl
r�M�o(�F���,��&��`��l��E�im+;�M�̢<	�q�g/���t�o�)��ϟ�X�U!�<��;w8������2�Ī�=��p�db��N�:<��V)!q�N���G��P#Qf7���`���e�R��
��-q��B�٣o(?��W����m�S�.������=%������l�7�ǰQP�����|t�F���KU닽ehx�s���wΣ���
�a�j���WO�"TZ9A�A�DE�3s'��4},�^:��P�v�G������y�5�>3C�,�V=u���O���e!�S�Ͳ��J;�]�V��/��IH�F��Y�`q��Uƅ���B��F���7�8wV��u�a�GB~���k�pN�ms�u���Ksx/[ZrXo����EAn�@|K����X^x�����f�mT��
1�!f���&)��(xte��F��첏��;���aZ6��
r�i[p��Ј��#�ݲ]VK�˞&̄x��>��ɢ=����Js�����?���Q�.��Y�CzI����é\�%�{i�i�Y|��"�www��PK��VS]�)B7t(setuptools/command/launcher manifest.xml��OK1��1 �!]kAJ��҃B���1;��g�ɮ�ooR��R*&�\ޛ��K���������
g��[��AL8� ]%�wP����A.�����E����覤V`%	�z�u�۩$;�F�Y�t
^��׾ڢt菈����j�+ �8G��Th1R�M��9��Qpy��k:�
}U_ڍoy������=+`�i�V2DPF�ZL���F�QGC&�����p��g`�m4�xyD��V1P��Pw��<��Wu��e�#t`�Ig�%-\�?9k�\�4^KC�|_)��a�c��~�_����oPKe�mW���3|R setuptools/command/py36compat.py�X[��4}�0�VM�x@Z4#V����J�x@(r�5��vf��z�g'ν�%m����s��eʬr���X������4���01}��*���I��i�K��ˬ�ZY�Vi����eI&r^ּ_1\��}��w�d�V�2���J�p��A*�Ƀ,���S��ej�*�{�
֤�t��=L�엋=���x�V?*V*�D&-�'2�����yK�k**�*VW�b��I�N8Y��(� �=�ϥ��g{�����|�L}p��7X��KdD��<;
�C�1^NJc�,�!+	ӯ6t��c�~����'�]l_�`�����Za���x�l�j-Z^�*��
�y*�LfR-+;���t�.���?�LsjYdIu�-l��QC�4~����� �Q�N�&�<��9���/C>q�\KazRX8ܞ�,ʔ0���mz��Bh�U��\C��Y4wH;���`�,�AZ���
��>��A���ʇi܏�p��d�����W$��v�`������uLwh�q��: Mpoi ���Z����B�%�q�*&�
��_��F�

+�#$s�D����D��
�����&��$�\�]��J��:�u�~∎Yo|T��IR�D]��ˑ�
;�'�����F�4���g��/��8⨋Z�V鮎�x���'��{�.�K~�]�B9���ݦ�Ұ�������.�Ĩ���6����}��iy�)Ubz	Y�W��zW�Jd+k�2D"�i5Q^�
@!Fg�H���#/'+Ge��YMm��/��i��%���_�^s�j����
-x/�z&R�z��F9U� �h����mt�{fN�.2�h_T���Ec��ݳm�7:XDS)���Ō��Ӽ���oߙmGš�c$x!B�eC���a;�߹��F?|�B��k��������\���n:�!#⇌��
�HܢoM�y�a�B-�6�	0d��C0=T�h�6V�SN�=��z�@�1�_�%�4m[�v��i�Ҙܘ�4�+��&�8\��4&G�؛e�U��Rۿ���sC�6,�Y�n&� ��	h�[&�4�a$=Qwu����M�-�fA�(ި�ZE�=ͩٔlԕ�`N+e�z�9h~-����6�}�!kꮴ������%�e��D2@���kê�7tη2�~�6��7(V�]nF�g5/��n0��@'ً��oʳ[�h8Izg�.�ވ����/��)]���o7��K�(l�إ����
 p�J~/W��C��ĭ>9���)�MN�v��%n�/@��^��|jor����Y�~>��
�<�}�W��}b�Xݷ���������G�,3|?sY8L]��}�.�iERK�O��+W�PKe�mWv���setuptools/command/register.pym�AN�0E�9��U+F�+4H�fTq�к��&������	�;��;�<.�%�9��8�L��ӣgz�ކ�0NRC���MJ��0/1�Md&>`z����[~.=�T?۔�U�A�[Z�gb�<��$ �!�h�w;�Xp]�/Fn�M6���*�<�>M��q�&������,����9?��?]�ba�3���h�"��sLm��5:C<5���]R�#-6�
���c��]w�Z�Bǧ�f����ub�w�DR�/PKe�mW�!��Psetuptools/command/rotate.py�UMo�0��W
K��P �u�u�]� Pl��jK�$�K�(9�Z��_$�'����R9�{�8����X�ѿ�S'�%�V~�Kc�,�5vrx��2�k0&7�q㓻�d�r��3g�b�V�2I���΁5^zd��1Zi�>a��4%��Ȫs�:2&ѫDWX����݈^;�kx���<T�A�F�ޡ=���?�ŲV���r�Z���<�����hf�W�,�<�"0�ߕ���2����+�^�"��I���	�#�K�}{��L5�լ�T�1�C���|�zY�ql_J+�d��pt`��6��«��óѸ�
'�m�茆)e���j�S�>�òR9ܔ#[�E)}�iܮ�BUW (0ZC`E���a'-I�䷙NSN��Z@&�T��L`]g|���j���h)k��t�iOp�^���(���>��;?d�c�
�(�v�
L�R�DX�M9���PNi�.��#΁D�7���;܍ay��N�M�1N�?�Y/���Y�g|s\+�ΩS�I�Jc9)3;y��6t�y���3糬m�7�}?���R�I��,��T7�<��9�͡�A����
]��QSmZ��8|��SFכ�
b��>�gƉ�\�Ө��i��c0��)��^Qފ�P
�	'��z����g��"��Q��H,��҇2z2����94�Y��3�M��~����?��;󱌱��;Y�t��k�P�;W��۰�D*�ǻ9��T���*�������C�7�q�>%�u��K�PKe�mW��4F�setuptools/command/saveopts.pye�Mn�0���¥��r�9E�U�2!����0UU��u2�a4Y!���9:x��D�
��[+��s�/�.>DP�Qz�q����x����F���:5�f;T����w�B!�t�0��bU��"0��u��bPM�߲�^�|�T���n�i�kH]��2Rdx���;�eM�]��n&��U{Y�(i'@�[Xc�5ܕ����N[<��A���Q�x�ɻS�Y�_�V�n���#:�N
�U�v75�X��ذ��Ǩ,5��x6Ɉd�.�����Yy�%=�V�&�;N��࡟���=<���>-�	���Օ=���W�V�PKe�mW�HnYsetuptools/command/sdist.py�Xmo���_�:XHBa�A��)��z���"ɶ����h�gIH*��p��3C�P�|W�@`����g��kU�B�ZY&�Fi�JuXu?�gi����Ej�qÔ��2�/s~J��Umū-�n�ڣʴ9߼�
��R����
��miͪgoN�L�Z�8�	��9��d����j�/O�����數���Ê�g�^�u�xY��,�am]̀A�j2U��~�4
��ԈTZ�3��Q��&���mc��X��l/Q��5�Ҁ�By�IKŋ8����s��,��Kn�Q<Ԇr�23��P�>��!�h�a�>ۣ�̴
FWlw^��U��g�m�1����[sm؝��f4�="�]Ȩ��ܵ(��TM�F4\s4����'�$Ds
�7 ?:E�x|>B��q�Z���r-�E_��;�Q>*��jQ�5�݊��Z8�U�̬bMkɄ%�: 3��D|�r������K-��v���3�LG�^��}��rM��Qz�j
�I�� B
i9L�|��9�yr�S��>����q�ۏ���Ͷ�~��=|����*BsRm,}�W�]ѓǃ��b�������(u��$�[_-}�&q�"t[�F�{����γ��H���*J"!��*�
�>�=�K��(~���1tX���'�t)o�I%��3q��� =|�z����,	T�G�#�q�?~��}[C��Xg�� hȨ ���@�h��f��%x:���'����[E��0���Jn��4�>6�@U��)�O���#��\p�A�6��r�?�K&dr�(kEU5��J��ߧ9������ʥ԰
GO/f�U��'h��S8�b�.�Щ������j��P�ݤ�Ӂb�=}���P��@o6���� k�wA}h���ʼ��d[�4>����~<��_J�:������t/���iQ)&���>���e�!�ҿ�Q�WbV��q�I���� �˺}c��!үM�x`t���q�ȏI�@l4I�?nw�S��e+��6�d5��왗^�)�-"�C3�$���O�S���1�5��[��.pQ�@cw#֖	�?�-
�颧�1N��~��U�|��
���l����¥��#j΍V?�*�ZU����S`�s�ކ:x�_ �4��[~�����6=r��j�U�h�!l�]+�t��L�ɢ�W<�JGO{Z7uh�r�'��y�َ���i/3��!�f��B_n_��9rdet�bux�a�C�9�Rc��=⺀.�Չ�m����-[?�:/�Bd
�O�d�#�a��R�:i40�0�h�Ϲ���]ҷ�̫��dH���$�Ў���(ܴuQ�x@X���\��)����9��0���t8L2�tO���	
���![�=
��ž
��Eh����	�6V����Fl�Ц���p]�k��q�pY��X�68��y�ڳ~�[�6,a��>��.nv�d��� J#��\��a:�ׅ[	q2P5}`�Z�Z9�T��2����]A\�xnLk$	v-J-��U���
(,�p������Jpf�m����2�^uwv��!�MNL��E¸x��L�bT��k���M���`�&��iE�Af���hwq��u��3���@,���h�N�]\#!�B^�ҭ�ȲWP�����/�ݪ��S�L�����A=��a�z�3�yL
$)�7�ؓC(,rg�4ivp��w"�e�zνS�Ƅ�e���L�!�S���z�(vkg�0�`�.e΀ť�}��t�۴DK�*�J��Pz�5��LE�%��3��[x�"j��{������k��w����O��jxE	9R���#�����TԹ*D�O}T=�|aK���TA=�S#�Ӌ�h�tW�~�\��e�,1!�dA�lz
��*���n���;�#{q�!�Sq��?\N��GoL�ްi��0�RZ'�N�[{�����U���Pa_?_�9eB����7�q6��5W5������`��&��Z"�'�\y}���{��+H#�^��kfN�i �k��t'3)蒬[�.5^Ϻ�4T��ڡ���)n��ˇ���`�����rf㳹w�v-�)�~�	K�Rl�PKe�mW.
n���setuptools/command/setopt.py�XKo�8��WI��b��@�v�����!dZ�ln�)������DZJ��r$�|�̓�Q*�5��r^��7}'Rt�C��ᴪ9+Rwǫ��	�	'��x�~�ŕYs:�E��?�TH&Vڂd��]7�5
m��*�i]�9ّ�Xk��Y�!1+���w��)��J�
��&�_�V%����|�m��ꮠu�ެ\Q��2�A��6�t�zv�l�Rِc���gb;�#���h`O�Q�8��27$���P;��/��ݎ�J'��)�*��>+�c<S��s�Nf��쟎��[�ˮ�\��ɔ�\,�S��֙�+�@�<�e7@���
*
��1���8�1
q�[�؃B&~�&��ֲ��"�Fk��$(���E둩Ҝ|��bH�p�K�����QeI�C'W�m]W^&�r6X�o�P2���blw��Z���>���jFA�tU呡#�-�ddoa����3��K^��/�ęD���Py�=y��/��Jr�(�Bo�w�)-��3Bn��H�h+�T�j60�#X;p��Q�(��	��jȍt�@�oq��hA�X���J��)�[���9Ns6JO	f�&��0���%]�ZBNm�t�@ӐP�~��>��{���zN&�Lw�Ǫ
hմ9��<ސ�ID����Z��ʠ�H4��H�pe|`�L�i�sr�`@n�]����=�ɽ[�{�ag7�ܵM��XnD�;	2(��>�ka�+��3�P�*G��JQ��!iH����hӲ|������T8��us�7#���?��xM�Y�l-��<�qU$S5�aq�1�0�첞�R�g���Y��Q�ޗ=�����/y�l�5�a߅�2���'�H,T���d����B��Τ�LW�
�\�-��;ky&�樚"r��	PY�l�9N	�½���3�`I�GcQS)�7�%f����ۃ-�ԅe�pw��I���0x��莬�K��
��ܶE��Ĝ��i@���9�􁹆
�ÃM�홗�Їs����z����(���p,���`��|��U��<52I`$�c=��|�Z�{�L�p�.�l��MG�BEњ�k�
6���:>f��H`�g(���̺��͢cP�Y�VQ�ysfa=;͌�����h��3Hϕ���X�s�ù�[t~��p���k��8�W{]A��g�S����O�yK�~��[�����m}Q�Le���`�`%]��
�ä`���`L��5��ϸ�Mc�ּ
�7ջ׶���Bp�v"��/#o&<�5q�����|�@/v6CDu�B��$��~]E�W����lCQx�UG���x�3��.֪��>yQT��z$��X���U�'o�3"�}~�]��׫oɝ��>�c>%����R��l��K�\qiՄ�]�g�,;�+��g����/N����po��
���ٶsS<,T�F��i�
F��[��Sdaڹ��=ؽ� _g-��
�����kZ@'�������oڷ�ܲμ�|PKe�mW$����	�setuptools/command/test.py�]��6�ݿ�� ��8����|Hڴ�mls8�B�%�ˬ,������̐�(J����V&9���<6J�L��to�мU��m��V��V|m+��Wd+t�T5�jٶ´��VGVJ�v��L&�V�0w�m��#.����V��V=h�v�����(^
����C��Q�.������y�K���U���]��>�J�W�
o��ڣ��>�F�vA�x��V�G��C��2�E+Oy��D-�����Ǐu����]j��]C��)�A��.��"t����6��:	m��W�UQqc�o�k`�
,e��E�س<� �<O���n������pe�I��d�6IW�
���	X�U�]%���ǚ�����{U��(�n�q]3�Lș�3^U��P4)�5\,k��v�'Q;ԫ׻=m�e&
�lx�p=�p����AIJ�.��瀫f�?��%j�W9�����5�
8e'K4�"ҖG�)�ZEk�!�%1���E=�(9kr�e���I,�t��Æm�KoQ���dO)6��� )гNz�G�Ģt��^��0���99r����l/���_��5?�<4!��1d@�y��}g�9NIɄ�/��n�Q�R��S��,�bx"���˿��0�ʈe�@^��|�p�_}2X���."�L*��#˺��Ǹ,xbx��d�+0�J�	����W�B()����ҝNΩvptn��c�X���� �԰�-�4UWgx�������)�9_���(\�5�r+��~�[�Ѯ�]DV/�qP�A��>�W\�῕?0��B��܈0,�Xac(n\�ja��N:RJ1q��]��-`8�]M��E&��TN���x!خ�U���1b
-���oeI)-
�[�:,�:W��"�I#����61��#<�[��vrRxL����KP�=���Dd'A��	�*���)bMI���YSKDvȀ*�Ii4"�)�����R!�42����"j�ѓ7������UX9��G"@��dD�CH��_Q����Hu��{Y/��[rH#]H��ď怶���ؑ������P�+W�`b-T�-۩�>�:
����B8�ҫ4.z���X��.k�V����Z��	�r���'������)_0'��g䯝Gړ`��/wF^5^�8E'n�Uv�|���'.,�I�ɁA�:���A\f��b4�?��|<�z�|~0����Og�aG�m�����sÒ���?�B�,��,��g�ŝ
��A�|�v�`#9K����W,�rH�_D��@:�A�d�Y���6+���Y<r]BMs���l�T,����r��4.��@S�z��̽��Bã/3'��J��ř�.��`u���$��5���3�=�WlWkC��O�&�%�%�f�Z�i!�ͫ�

#�G��yq,�`��M��2꩏<@�H52^|���M���Оp�@��9�)}�j���>7$��I�AbO��Q��
�6�n=�6=��,ƶ}z��"��qWr���3s����j$�s��<71{�|�/X3o���g�Akl��I$[�ǻ�ք�xX%W��=��{�ΎJ���\��~ה(�
�I��+
�sY0X~��.ȅ�.ğ7eISY��*[��.�^�(�?�����?���3�IjUE��N\K���m����B
�]
h���`�A��Lj��a)�F�x�%
Wx�д�
��NE����B���s�F���R<�)-������x�"��4��� �?�"��k�/��EA�M�E�:	�vN�S�jU�g�q�42	&�5�Z��Z�j�,L�w���1�;��׍B�@�����b_�����Y��@
�j����+l�\r_�
�rU�l���c���؏�'���<uw���XE���iO��|���>�(�mp/���9�E��{���K���e �yrd߬���v��Ćh뙢�>Q�i6�{X�F����pM�8�df��[7��q�`��<l_�x4����I{V�sp�ߚ$�&��ʒ�Fz噘�����w�uCsvc'�mdt
:�8� �)������ͥ
����iSn�
5�a�R��H������ D&�#k�+Z������y�w��P���_�iA��U_�h:ɨ�!Cֽ���Zۃ*͚�+�n6����b��f;�ZN���g��Aa�y�M�b����%��X�MaMd|P��zL�pئ�
;�&�?�e�A���W��j-Nס�F2�Ta�@<�d\a���w����l��x��h���+�*����Ybc���:�"�h���O�зvv�Z}����'���z!��Ƙx���Gn~�
,��]��Ηb�����0[[{(�X+��ɽ~���p�t�Λ^7�$}aX��{]B�|��8��.�B(��.�s�B���U��˚�(�����6��.8�b�:/�]��دM�=���
��Q7��$���@,�](9�91$)��PKe�mW"]K��setuptools/command/upload.pym�Mn� ����bE��GꪚJ]�(�hp2�#~Z�d�v��2���gY�&����XO!�L*r k��{G�3)
*3��;b�>�v�����ꗍq�5��0��$Q1r���A9��W
ü@��!�>֫�SMk�\�d�e�H�!;q�zl���q_��7܁�v������9>�ɐ���?��	�q1a)�[J>vm�o$����*n~%
;�jR*�(�?����b�{�� �\s(�2��?�)��a?PKe�mWm�� 	2!setuptools/command/upload_docs.py�io�F��~�@�A����I.l����I�h�kˆIS�vfGY��� ��w�� ��w�o�,�[�L���Fo��7��|�ԅ��*���ޕu�JViE(yÕn4/����f����UNb{@�A4����3�5SD��D�hE>�?q��v�*���5ORd?�m�(ɚ*���R��8��j��U 6�Py+�,�vp�2)�lZ>�(�	�ܙP���-��+�7�`�Q����vH�?��RQ��6M��^촮Ӭ�`���E��iM�b���v%���X+=_�ܯj��+6uV����l6�ن���b��|$Ӎ��ž����T��R͘�h͢(dU��vv����sNe��
m

<jr��
�	WU��jj��d�'�S�v�Q��Gw�ȚAL ��ח�/Vg'�>����x�OrL"4�:z����<��z'�Tȭy~�f�Hn|�(���I�� �(W�T@�ʼ�Ouj�=e�h�\L�&4͕3�9P7sr����M�wK��`��WQ��Q�_tqW��A�~�P�`��gQ���̹<���d��d!<֍�^CT3Z�p�'6dG�J�;^}�+6.���7ߤ>X��X1�t0��IXMx5΅8���#�~X7���(�2�B6�J
�l�	���>�E�Fr�)�+�9-�W�*��s`7�ı1D�XS�e:<n���!bL��e�x���F-���{����(���y��+5�J��^�Et�#�
���!R>H<����]�D��ʷ��y�M�#4ɐd�g�$+Z�8��2b,������A�0�|W���@�M館�eP�}��X,k��:&+Ҕ\B	:�xԕf{�A�Ӫ�'A�K#	�cD[�`�8�t1�I,W�U�P^���
�V���`��q<������F��}¾�G�4�1��j�B/P/e�S	rG���qd�ː9>��_���:�4��4��+�xo��9J0�w�O���3���П�Ґ-���!��`����3N�����?��
\:6�MZ(
SA�I+VO���A�Dp,�%���NB��Q��!ց��Rb���
�X�l�aDΚ
��O?�ge��Vn+Y�ۆu��}S�E�Spb�\쪊�!r�w��.B�'K�n0JҒi�SM�(��%S��3��Yy�R�I�o��TO~�X��xؤ��̟�RKƼ��LW8Wf��N�V��È�c�r�����}�[�_�ϴh�)ʵ�Ot]�CT��%䡩�`�#�z�D��`,t�c��A�x��FO����b ���{�6
�,\a��X��|R�wQԊ~e��ҼÈ���Qb�cA4��M�Bk��?������^=�aY����C���7)���=g00��8��F�)�������'���TV.,�V��ӣl��ZFc5����&�&�HJ*vW�
������|����lv��h�1�!�
z��p���4#US�����	����v��\
��ޮ���秷翜���Oo�_�8|~��/�Oߞ��z���|�:|���a����1V�\F�C�S�qfUb�:��`1u1B��q�۽ܤ
`�=^�~�\N��藣@�����@��V��F�JZ�N���'}W���F��(�R\'QKI�P9�I�|�b�o0 jZ[uh��n+��M�k��qP�Z��l8�<�׭�ȍޭ,ɢǡk�a'�w���zGD
�E71Fr%xU��'�c���A��^��&�B�@��G9:��GGf�X��JH2� '$���&�տ5Y�����(�}z��+h��z�s�d9���
������(:�d4ok�;wB��=$Ʒ�q��9�Nd�������m֋]�Z{'�j�)w|��H��Y�\k�bF�LН R�u�.f�z���ǀ�#�����؟�Fup�;��o��2�^,>#�U3F3������0FЍq$��
t�����z}V*۱���t!��Z`��%$5�b��H������u�g
����P��a�ˢ�w�n��{�FR���0�(�
ײ�ۋ�O0aṲXl5W�1Q�0���$;?����nY��N��g'�nD][M�(e�Y��d|T7ڹ=�c��7��b��I2;�~LƑ\:���i�CD�G[�T(�1�w��I�m���SH��d"�b�O`@RX5e�˭sٗ����Wv���6�Qn����'gg��l�꼈��a��_���@�G�0�=y��m�Rtnn}���@%G�V%�@
���Ėt_YjMQDy������v��Q���"ȵ�7����x��
�!p����.8e&���j��)k{J~��D;Kyn��u���縡�h�[1��g����_�Z�J���ߑW/;�U`�q��PKe�mWe��g	setuptools/extern/__init__.py�VM��8������B��ۢ���\bW\V��$�n�6��L���[e���
'�nu۩z�zU9X���GɇfRҒ���V	��gНq�������߲��>��^�b����
~��>1c�4Z(5���hb�ܣ���6R���C��8�g�3s����z�����q.���T_o�5[������-n���>
U�Ey7�3�ۀr��<�2߬ny�3�z��l�X%Z(x��fO�E�����XpaZ�{�=s�~$�c�$������0���Ӗf�3�$b��܄�$���sV4ŅMQ�4�nT��3�(K�S�Q)��9����3#
��g ��Ƥ_����Hq�ك���n}Dc��tY^$=�ز�á�6!2�;�N� l�P���Q�s}KU�E@��Q�-�=
Ad�����|�j[�M�"��M�?�m렗OL��x�]�M�](o���3��0W�Xֱ�`a'����I�7�&���,�\Y�m�_���l�_ނ�l`��sθkr��	�Cn�u�By�p��\�H1�Y�5�Bw�m�����x����N�?��4���
��dFF������k��G����;�[ޝ�ɇ������g�H�ʗU��]}�P�y�x�:��D�e�fM��
����bӵ:���tQ�u,�8.�ʹ�Xg����ҙ(V��Xly�J>�
���ȉ0�r;Vl��o�b��f���(OF<V�]��9���r�Lf�-�_jlL��𽀧��>vP�0��Du�A��Mj&����Z�n5�Zs:.��,��H�E�<�v9?/��`b���M�S�%2�(_ԇ���1���)�聎����:��%n��PKf�mW�$�|L
,setuptools-58.3.0.dist-info/entry_points.txt�UM�� ��+�4����[ժ���=��'Y���z}�b�|\��y��Na�Ҹi��(M���J����л`��D��'kF���~��a��$��xKB0�kz�;�j�T4�3��=�̳�$n��p�
�	�u��򴲸ev�B�a�-�0H��U%��/��F��n��#���*nY���C�S���vb��J]���yd�u��ia(O`�qf����V�#��L�
/b|ZX�����N[ىζ�</lƶ�e���qt�t`ځ����^$"� 0xe�ĢT@�h{�£"� �Ufy�QѾA{%��{�����"�NYU�$R/�2��+�h�F�P������M�J�#�2�HQr��Πc��ۙ��ެ��?:h�N�gS�<��p�X��ut��h��7�	:�j���B��%q�~� >�e��̉��N�F��I��>�(wk���a�yBnΞR�Ԉ��~|�����;�<�;��l�M�݇ك=���H�Oѝ�7"хm�j�C]L����HQ8�������r~8�uy['�x�?,'E��;UB!�)C%�A��ƹ��Ħ����yh�׷B�������)���W����c�PKf�mW;���*))setuptools-58.3.0.dist-info/top_level.txt�A
 ����0�PP\�3�z�9�.1J;\��A{�#�PKf�mW�7�[\\!setuptools-58.3.0.dist-info/WHEEL�HM��
K-*��ϳR0�3�rO�K-J,�/�RHJ�,.�/�Q�0�36�3��
��/�,�
(-J��L�R()*M�
IL�R(�4����K�M̫��PKf�mW*����I$setuptools-58.3.0.dist-info/METADATA�Xmo�6��_�����8m�zu��I��i���ѡ��̚U����;J~�g���{y��;�cn��h#T�a��ػ�)t�[�V)i���w�I��E�r]v�97B�,V�L*�a!$���X.�+�D���bVd�:�-�Xe,�ф'`�?T
~��6�67�0L�� Ri��9W�ȭ;s)�N��Vm[�$>�\������F$��-P:�D�A���_�o���n�����]uؙ��2�-�@�Dh�C�"z_��)��ݞ^#��˥rIb�6��g�C�[��H�t	�'�1b$�<�)H�%�#�°F����ED�B�JX��,d1��X@���0�k�����N�\�)���˻��*�Ц)���gIAFuA�����;��,��T."�髑�q
k����Z�Y��#��T)=��h,���X�it��z2�4Fc0����n�{���?
������=	�R�ME���(��,K6�)Ŷ��[khk��_��}u�;���ݩj�-DM�Xd��2 ��D�b��;�<RA�8�/?v��W����4���Ժ,B�bd+�ׇ��2��1~Ua|	�x��n���7�T��E���ǃg�D*�Z}��2Œ��F�V�DM�`�G[����u�v�Ԛa��hǏ�MH=�7�|�w$��=E��>�2�}uⴂ�F�RM��U�v��jB>�\B6up�ZOq��~i�>�Fz�t=���Ax�С�qD��	�>��؄~��s;&NЇ{B�3�%V5������2���A�QD�KX4�.{�@���~�$-���)5UˮJ�I`�d��D8]�h�4�c�u��0T��%���͓DK�$�Z�0�:��>p��mc���d$�̄�"y������̧�;����y��D㯓ɥ��j7�
�9<a�bx�n[J�r�o�O#�f:����cNZ�}v[
���cF�1s �H�v���7�`UF��X:.��i�P�$��<y`��D#���0�]��c����O�Fuk��饧����XX�	��%=�xk�مn��8;�7�`�\<�x7ٝ��$�bh���ݜ�Ow��a�MF:����ϴ�B,��KM���.�Y��F�Y�x�w�˙+�g@\
?>pTt�6g9�ހ~a����0�L9W��t)g>f�ǵA���I�yTIѡ{\+��X2fC�iMc���Ǫ�̵�ѣy��Z���ىf�⪅xu���p���
��E�4�
;�p�"�XKW)P3�\�m�KD�a�Rai��F�5�!�²aۼt��.a��`x�+j�"�)��<��x�2@O�)������Z
eua�XQ��sĜ�96s�Ecn�V*5U�V�h��|��XOI��pۿ`H�^S���`QRT��wsv>���n���{wA��_`F��]�8�n�~:E��V2N#���������cx+Y��#R`�KӅ�V��=���@/��`4��=B.��
K5�z�P0
, ��s��ѿXnH��R��I?c��f�*Xa�>\������[3F�5�n-�i�E�u� �q�CT�?6\˷�cq���8�]M>-$:�i�.��F�xd_�6�-�J�>�k2�j�<��H)���>�ґxtƣIe
M��PKf�mW�"T��5"setuptools-58.3.0.dist-info/RECORD�zɒ�ز�����D�f��V	&}߃h��U'�I��4;5�4�r�7˗��A��=�t�a�4C������C�NZ����|pػs!9c���
�&|D�A���?���9NZ����,?0�n�4~ګ5W���d4�ây�7���i�$�;'ɯ��#�4�@������Ge�<�Ʀ�/��V��?P��;��j���¾;?�JQeqJR;Kj����%'�1�i�fd�OB�I���>�*���Q��&#����뱼�Ȅ��y��R#�lI.�؁�pݦ	Ү����ap�)�R;^�r��͝���j���]��UF�;%@�t�4nקU�^�ɐ�~�ĝL�`:���Ǿzdk��Xl�"@�����[�xC�\�z����Իv�>#,��y�c0���ݥq�8/�����/����k�{�G�>��U (dB�]RYI9�⍜'`�a���>���q��X܃�o.�s�N��p��M�@O!��@(�[�'��`�7l�C7�ø���N��̝��n9�K}�J5�Y3�W8�‡E��/Hj�$���K����DÈ�t򫾜m��a�����S�(� M;��~�F�vy���֥�\�N�9�uY���|�=z���2���$�Q����vL����ِN�P��Nʢ�G�O����z�Lk�Y��Z" k�R0�kC}�i���g����x������ː��CyLNy)-EW�|��Q�p�;�?[�O�!�کn�=�=��޽��>UB8���s)��V�(����'�>���*S`f�.,9v)G�$�k��4�[������|򷅍�����l0�W�B�N���0�?���p�X�\B�VR�Ū�����>	�!���Q�ٽR�u��_/&Θ	��[ҍ���`�|���u>���+p�_�|��u���'���al������9�򌱚�\fI��N&q�jv�Ye	�ܺ��?��.�mB	����΂�2�r�ZL����B����p��;�p�3^~4uw��LnW�ufP@0D�?��&*w��T�,�X�',?qC��T���,>��:-�O-�
:z�G=��@�:S����rTdO�SF9��Jo~��,���:���nD֫W�cË:a�y}�9^�H7R�:9�I�fgpG���i8e8��,F�����Ӽ�_��^��V�K�����p�_&q��#60��M�����}I�ޚ�)�P��7����� ��<��9	��d������-6�O�ggh���V
z�����
3���C҃ �v��[G��g��ҞK7";83���(O�	���So�@Y���Ic-p�U�k*~�',�Tu��R���<�Æ�!2�ړƒ4
�O���;��`lZ�~�)��?䋛�1g�VECE|��f/]�>��|n��z���_�Q��'�%	���aqK�If1O4v�q�D���B×>ۛH��W����',��3/�h�r��`S`:n���j�:��{������w(I�5���-��{.3/���e��.�G�ٷ'�(t�����	۹w����p��O�Ю�z�>t���z�
�Ǒ�����.i<=��[�*(��l�O`e]��������pF!L!���6�wU�@<yG���a9t��ie��|(�qE'����6g�f_���>���tdf"���6m��Un���(UjyS���g��Ŕ��N�G��4\.{6v������P���7J
�	�!����ݏB;��p�5w��q���@��.�)Ь�B�$��� ��w��_<}�7RK�%�X�\��9�[�9������և��~�^����N")P��mqu��bB���y� �Ztx���̲[�E�{�K���O>��C�wrc�VF3�0�n�w�J��.ؾk[��0hg�+��w�֤���ތ��^�C�4�$'ĥ��A�+�X�~�E���v�P�"?�}��b��p!����6���-e6��; ���k}�u��y�v��d"��$��^U+�����)��m~|�)	�gfUr�������a����N�%ȚP+t��\�㎄���N[
�S��c���s�`|��3/���c<`N��ͳW�QK������X�{$�N7�F7��crc�ȻpM�n��ZS�����En@�m���ϲ�#�G���8ME	�!Q�l|������~��W��Cō�pf���m� !䝁7���c�OV8_',�KX8��0�խd����m�$F���=�i��|Ed͆1�;.��(LhM#�������Hp���I���w��ᡢ4d�@Ӑ�t����΃�+ɐc5�̃�XH�v(���[�2x�
�?Ӽ1��yT�hL�瓮���E�D�
YFh��ߔ8HPoa?�`b��)1���4C�H��<9ѓ���4���t��m"��[w�K���QN 5��?�dzTHd���XQ![�E���ڎ$	�-�o���麱�;M��2�눜�YO�q�ȁ��s�|�}�=�Bo|���KݕnOxA]�nS�C �J�R�\D�	T�N�r{��o$?��qr����%,EL���ޙt~Ώ{_Bm���&�A)�-t�}�6�d�W��1�:�!zQ��]'���g���ah}�=������o����"����2N��U���iև{��!���Q��'Q�V�'��}-���i���A�)�K���rs'�bmˆx�w�)B��!���?Y,�CE��=�ҧ�~Zت� �x�V����P7�^QԹ��YH!�q�%��aKE
a�\7J0���9�-�D[N�$�mtdg�Y3MtP=1��(
i��=4��Kl�i<�m$?���h�T�%�����Jm�x(��v̂Gz�מ�=Z�'77��d�=9�s�$�}|�`B���s�
$�/f�W�*�ϗѸk��(�m�|��J��0���|�4��$�m��p��$��5��i�۔ ���7o�Yۍ�9��l�8x8k�
ƵM|�V��C��l��6�a�ۆ��C�>�z쏽]{���N��e�xp0�(�R��K��C����a�_��G"���f1�2�:(.XF6YWђ��,���J{�.`�m�ܴ��\?��Q9bڷ4��s��/H���UE�s�@޻�i�bョަ`��_�M�
�R�ݺw2�:,a��Un����-�W�2lΆp䭳���$����[p���tp?6{U�DO��}Q:��:![k�Q�m�l"u�.UF���Y/[m��ʾ�$?�C}��0�'��SW�7� �v��7�OE��g����89P�	�V�﬍c��w�R��,��t�T�6M�*aR�c�UUk�3$ۿR��	��I��d��NHб�������n�0H}wx��=7
\�I���Ǔp0���4ܻD�d6�q��{�����n�<^n#�w���@W�l��G�{p?d<K����g)ZnJrE����A�D��e�����
�@/��(������6�Q�/I���S7ʤx���&��N0�Ϸ���Q�l�E%��}dQ�V��c-�cQU%�7*����W#e�>���͒�;��a��q����~4��,+�F���o}��R|6�5哑8S&���-�-��W�p�v+A57p�\D�1�'���Ȧ�>�P�����=f��R�����[u�1�(��{u�.���<�=[�m��j�‡>�,;r�pK��mj��&�Y��b�r/���`�6��y���sܽؼ
	L�g���|�I����ɈV��Q�z��>9"�#�|��#�=7�;���]g
��ǹ��#Oe����S.%-�'Ċw����W#��b#�Np�F��y11H��K{���)�I�:U��[4P�-K�����*|RgU�a��m�Cn�A�xh��kJ�5nPg��;��y?	��y�n��H`�o�HO��Ǒ\���@��vu)WT�z��N_��ꅬ�%�Ml[�Ȍ+�<�I��?���LX�
�������.
��l�uʤ=	ةDŽ�J쁖�	�+���2�+��A�<���.�oP\kY3�A�#���0�Dg��L�7J�ZUc�&z��qy?&��p>T���W�)AbQmDXbw��FG���		�5W��b<6;䯋㇙0��.���:��EjJ����}=���t+��'<^&����8�;xc��5�l���w
O��;�QٝQ�j4
�a_�	��T|�`o�	�{���+�Pt逤P=l�0�9�a��"w��l
�c�A�D��M�o
�a�F�M�����9᮪Ta�``�.��Æ����a��鶩Y⋚mW=I�4igG���-���(�af�kXX�4�p���F�ۿ��78s[���n��Q7�	���01*9���j� �6A�{��F�IF�� f��.���0P��2��2��*��x�=�CS��-
ɐcS��s�ڟh"��LƜ�C�0�yɦt+e��&/�F�֎�>��I���"7:�=x.�0,2Wҍ?`��;��5@%6&�D�~��7m�=�?���
tYo�3����3,C�(�w	Q��=�j�F%[�JTh�x�%"���|G¿c�|�,c�%��&�i�*��B3ˁu�kGc�͊q��=qi�%���B?m^�T�\λ�^�t��-��CJ��+_�J�Y��0��7��a���/,���;?7�l��?���s#����O
|]��3�l{9�K/��i�sZ��‘�E�-�=�h��(�~a�Ͷ�),��d���Y�R�N�e����ά$9�,G��11}�v����O���{:?��ϗt~
��l�,N��C���J�!r�h�=��F�c��\l,h�E�F���v�ߟ��E�>{���l�r��ְe���׺ �ʂ�Z�{����5��it���xc����0���]�:���p�P������DFb�����aZ���Tٝ`u�[9�Vezq�.�1��&~��|j0?�;��p9�y�&�ӯ9�'��l���f����X�J�C�O��?6/�	Da!���Z��w1u������(�g45&�}�5,����O&Lc	2����tjvW��f�X�p8�jhG,�
�[��48��
�GX��J�s�	N g�d�dA�3Lg��#�y�J�<Y��b�����?C�i��<W�.���P�:�{\=P9p����s$0�:�(����~q��_�6+A�Y���<)d�.���{�����uq�����NA}��������r."PrG�}�	��N1�>-�~��T�a��"t���ty��<�`��f��+EAĚ^�z�j��dz�8<�zz_5��y��2��l�2!Snz�b�v6	R����烔����`�Y����
ν{�ֹ� �H1�$Un���O=���T���U�XVN�0�X��A�O�A:�7�uր����y����Z
���J�p;���8{٭ۃ�pb@ )�|�A�E�V�,�PQ���ʹ�I�<�d�5D,�ۺ�AqՌ4"iB>�2kx�L@��{qR��b��A�f�s���룭�h��o�t�2�.w�q�u�W�|���pW��ЗG��n��:S��TEy�&�
�d`��}D֤���Q���կ�[]Bc�����S����dV3cE���'�u��QbnTt�co`?_8Ob�c�˰
k��"#�ݷmw����,{����x~�D|OI���:����d	��b�e���JXD��`��07bR�c��>\���3-o��*S���]�q���)&.g}�#*�sG��I�H����_���fd�tIcm��`8�A��0��
Pד���y6�ބ��@������X�,a�:#OaZus�V�f����0y|�
�#>/;��&���ȍN�����G�Yy�p�Cn������^�
�� �|��Ak���+��W�z��}u�U�O���ɣ����#<c�Y��X/��
���1���v?��M���2u=Ч�LĀ��su�z,DJ��O�r
�����B-�}�d�ρ7�-NS�b~��6��JΝ7,9��P�0J��e�5u5�R�E��{��7�_�ïV��w��V�l"��3B=�і'��xE=̜�D�pH��/�x��D��PKf�mWb�/q���distutils-precedence.pthPK��VS�@=�h���_distutils_hack/__init__.pyPK��VS� ��.,���_distutils_hack/override.pyPK��VS�#�8ps�����pkg_resources/__init__.pyPK��VS!���zpkg_resources/_vendor/__init__.pyPK��VS��a�Q}` ���zpkg_resources/_vendor/appdirs.pyPK��VS��+\�x�"��t�pkg_resources/_vendor/pyparsing.pyPK��VSZ�k���,��bpkg_resources/_vendor/packaging/__about__.pyPK��VSeD2+���cpkg_resources/_vendor/packaging/__init__.pyPK��VSJzBh*��Eepkg_resources/_vendor/packaging/_compat.pyPK��VS�]�מ�.���gpkg_resources/_vendor/packaging/_structures.pyPK��VS���n_*���ipkg_resources/_vendor/packaging/_typing.pyPK��VSb��.%*��`mpkg_resources/_vendor/packaging/markers.pyPK��VS&y�I3A/��,ypkg_resources/_vendor/packaging/requirements.pyPK��VS��)��|-����pkg_resources/_vendor/packaging/specifiers.pyPK��VS��'^'���pkg_resources/_vendor/packaging/tags.pyPK��VSJ�f`�(��\�pkg_resources/_vendor/packaging/utils.pyPK��VSPz��n<*����pkg_resources/_vendor/packaging/version.pyPK��VS̛��g:	 ����pkg_resources/extern/__init__.pyPK��VS��",Th8��x�pkg_resources/tests/data/my-test-package-source/setup.pyPKe�mW_��f
���"�setuptools/__init__.pyPKe�mW�J��"����setuptools/_deprecation_warning.pyPKe�mW��	�	X	����setuptools/_imp.pyPKe�mW��MjO�����setuptools/archive_util.pyPKe�mW�N7�`((��G�setuptools/build_meta.pyPKe�mW�l<
ESZ����setuptools/config.pyPKe�mW+J���T
setuptools/dep_util.pyPKe�mW��f;zb��'setuptools/depends.pyPKe�mW2�
˹,O����setuptools/dist.pyPKe�mW��Q�
���@setuptools/errors.pyPKe�mW���������Asetuptools/extension.pyPKe�mW޷Y��	���Dsetuptools/glob.pyPKe�mW_��
��Ksetuptools/installer.pyPKe�mW2S��,���Psetuptools/launch.pyPKe�mWE��4a���Rsetuptools/monkey.pyPKe�mWSB�(���� Zsetuptools/msvc.pyPKe�mWpm!N����setuptools/namespaces.pyPKe�mWT^�-Λ��~�setuptools/package_index.pyPKe�mW�V�D����r�setuptools/py34compat.pyPKe�mWQ�짟8��(�setuptools/sandbox.pyPK��VS��������setuptools/script (dev).tmplPK��VS�3��j�����setuptools/script.tmplPKe�mWT+�~���u�setuptools/unicode_utils.pyPKe�mWH�Lbe���,�setuptools/version.pyPKe�mW�
4�	` ����setuptools/wheel.pyPKe�mW���
t�����setuptools/windows_support.pyPKe�mW�B괯�!��u�setuptools/_distutils/__init__.pyPKe�mW��1MQ&��c�setuptools/_distutils/_msvccompiler.pyPKe�mW��5R
|!%����setuptools/_distutils/archive_util.pyPKe�mW�F9��.:%��m�setuptools/_distutils/bcppcompiler.pyPKe�mW��| �1��"���
setuptools/_distutils/ccompiler.pyPKe�mW����w�F��_<setuptools/_distutils/cmd.pyPKe�mW$�Fq����Rsetuptools/_distutils/config.pyPKe�mWIS^��"���Wsetuptools/_distutils/core.pyPKe�mW5��<�*B(�� dsetuptools/_distutils/cygwinccompiler.pyPKe�mW_�H%u���\ysetuptools/_distutils/debug.pyPKe�mWk"#��
!��
zsetuptools/_distutils/dep_util.pyPKe�mW�3��
b!��Osetuptools/_distutils/dir_util.pyPKe�mW�. A�3����.�setuptools/_distutils/dist.pyPKe�mW�n���
���setuptools/_distutils/errors.pyPKe�mW]�4:%
)"��\�setuptools/_distutils/extension.pyPKe�mW�1ƲxE%����setuptools/_distutils/fancy_getopt.pyPKe�mW�È
�"����setuptools/_distutils/file_util.pyPKe�mW��%4_4!��~�setuptools/_distutils/filelist.pyPKe�mWˆ�з����setuptools/_distutils/log.pyPKe�mW>����!�v&���setuptools/_distutils/msvc9compiler.pyPKe�mW:�kc�[%���%setuptools/_distutils/msvccompiler.pyPKe�mW��v��#���?setuptools/_distutils/py35compat.pyPKe�mW��{�#���@setuptools/_distutils/py38compat.pyPKe�mW���s�
��qAsetuptools/_distutils/spawn.pyPKe�mW��>~T"�� Gsetuptools/_distutils/sysconfig.pyPKe�mWQ8��Z�0"���`setuptools/_distutils/text_file.pyPKe�mW1���8&��8psetuptools/_distutils/unixccompiler.pyPKe�mW��	u�O��t�setuptools/_distutils/util.pyPKe�mW�87�l�0 ��$�setuptools/_distutils/version.pyPKe�mW2��
)��ίsetuptools/_distutils/versionpredicate.pyPKe�mW;��*)���setuptools/_distutils/command/__init__.pyPKe�mW��n1��&��X�setuptools/_distutils/command/bdist.pyPKe�mW�wq1+��g�setuptools/_distutils/command/bdist_dumb.pyPKe�mWo�Y��"��*��!�setuptools/_distutils/command/bdist_msi.pyPKe�mWd]�v!T*��K�setuptools/_distutils/command/bdist_rpm.pyPKe�mWd-�E�>.��	�setuptools/_distutils/command/bdist_wininst.pyPKe�mW������&���setuptools/_distutils/command/build.pyPKe�mWv3;��V+���setuptools/_distutils/command/build_clib.pyPKe�mW����#�{*���!setuptools/_distutils/command/build_ext.pyPKe�mW.�8o@)��Esetuptools/_distutils/command/build_py.pyPKe�mW8�4,K.���Wsetuptools/_distutils/command/build_scripts.pyPKe�mW�m�&���^setuptools/_distutils/command/check.pyPKe�mW,���V�
&��)fsetuptools/_distutils/command/clean.pyPKe�mW���7\=3'���isetuptools/_distutils/command/config.pyPKe�mW�i�TE�k(��dxsetuptools/_distutils/command/install.pyPKe�mW����-���setuptools/_distutils/command/install_data.pyPKe�mW9R)S+
1����setuptools/_distutils/command/install_egg_info.pyPKe�mW*Rj&�0���setuptools/_distutils/command/install_headers.pyPKe�mW����	� ,��5�setuptools/_distutils/command/install_lib.pyPKe�mW�:���0���setuptools/_distutils/command/install_scripts.pyPKe�mWCh�o�+��?�setuptools/_distutils/command/py37compat.pyPKe�mW����t
�-)����setuptools/_distutils/command/register.pyPKe�mW�t��v=J&����setuptools/_distutils/command/sdist.pyPKe�mWj��P�	�'��l�setuptools/_distutils/command/upload.pyPKe�mW����setuptools/_vendor/__init__.pyPKe�mWD�*�;!����setuptools/_vendor/ordered_set.pyPKe�mW��+\�x�����setuptools/_vendor/pyparsing.pyPKe�mW!Q8�AR-��B�setuptools/_vendor/more_itertools/__init__.pyPKe�mW�a�h�y��)��ξsetuptools/_vendor/more_itertools/more.pyPKe�mW�ʀ�8�?,���8setuptools/_vendor/more_itertools/recipes.pyPKe�mWZ�k���)��rMsetuptools/_vendor/packaging/__about__.pyPKe�mWeD2(��GOsetuptools/_vendor/packaging/__init__.pyPKe�mWJzBh'���Psetuptools/_vendor/packaging/_compat.pyPKe�mW�]�מ�+��(Ssetuptools/_vendor/packaging/_structures.pyPKe�mW���n_'��Usetuptools/_vendor/packaging/_typing.pyPKe�mW�d��{%%'���Xsetuptools/_vendor/packaging/markers.pyPKe�mWiS�05,��sdsetuptools/_vendor/packaging/requirements.pyPKe�mW��)��|*���ksetuptools/_vendor/packaging/specifiers.pyPKe�mW��'^$��P�setuptools/_vendor/packaging/tags.pyPKe�mWJ�f`�%����setuptools/_vendor/packaging/utils.pyPKe�mWPz��n<'��ӥsetuptools/_vendor/packaging/version.pyPKe�mWR/�����setuptools/command/__init__.pyPKe�mW=��/M	��Ƕsetuptools/command/alias.pyPKe�mW�ut��@��/�setuptools/command/bdist_egg.pyPKe�mW��ȹ������setuptools/command/bdist_rpm.pyPKe�mW!�1? ��0�setuptools/command/build_clib.pyPKe�mW�I�V�3��n�setuptools/command/build_ext.pyPKe�mW�2-�y	T ���setuptools/command/build_py.pyPKe�mW&��dd����setuptools/command/develop.pyPKe�mW������U�setuptools/command/dist_info.pyPKe�mWE��wg[�N"�� �setuptools/command/easy_install.pyPKe�mW��v�}�b���Ssetuptools/command/egg_info.pyPKe�mW�vQ1�*���psetuptools/command/install.pyPKe�mW\Ҩ�+�&���wsetuptools/command/install_egg_info.pyPKe�mW,��,#!��{setuptools/command/install_lib.pyPKe�mW�}���!
%����setuptools/command/install_scripts.pyPK��VS]�)B7t(��z�setuptools/command/launcher manifest.xmlPKe�mW���3|R ����setuptools/command/py36compat.pyPKe�mWv�������setuptools/command/register.pyPKe�mW�!��P���setuptools/command/rotate.pyPKe�mW��4F���4�setuptools/command/saveopts.pyPKe�mW�HnY����setuptools/command/sdist.pyPKe�mW.
n�����H�setuptools/command/setopt.pyPKe�mW$����	���k�setuptools/command/test.pyPKe�mW"]K������setuptools/command/upload.pyPKe�mWm�� 	2!��Ыsetuptools/command/upload_docs.pyPKe�mWe��g	����setuptools/extern/__init__.pyPKf�mW�$�|L
,��i�setuptools-58.3.0.dist-info/entry_points.txtPKf�mW;���*))��/�setuptools-58.3.0.dist-info/top_level.txtPKf�mW�7�[\\!����setuptools-58.3.0.dist-info/WHEELPKf�mW*����I$��;�setuptools-58.3.0.dist-info/METADATAPKf�mW�"T��5"���setuptools-58.3.0.dist-info/RECORDPK��>.��PK�(�\�;��$$ bash-completion/completions/pip3nu�[���
# pip bash completion start
_pip3_completion()
{
    COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \
                   COMP_CWORD=$COMP_CWORD \
                   PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) )
}
complete -o default -F _pip3_completion pip pip{,-}{3,3.7}}
# pip bash completion end

PK0�\�	����licenses/alt-libraqm/COPYINGnu�[���The MIT License (MIT)

Copyright © 2015 Information Technology Authority (ITA) <foss@ita.gov.om>
Copyright © 2016 Khaled Hosny <khaledhosny@eglug.org>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
PK/^�\^����man/man8/php-fpm.8nu�[���.TH PHP-FPM 8 "2009" "The PHP Group" "Scripting Language"
.SH NAME
.TP 15
php-fpm \- PHP FastCGI Process Manager 'PHP-FPM'
.SH SYNOPSIS
.B php-fpm
[options]
.LP
.SH DESCRIPTION
\fBPHP\fP is a widely\-used general\-purpose scripting language that is especially suited for 
Web development and can be embedded into HTML. This is a variant of PHP that will run in the background as a daemon, listening for CGI requests. Output is logged to /var/log/php-fpm.log.
.LP
Most options are set in the configuration file. The configuration file is /opt/alt/php54/etc/php-fpm.conf. By default, php-fpm will respond to CGI requests listening on localhost http port 9000. Therefore php-fpm expects your webserver to forward all requests for '.php' files to port 9000 and you should edit your webserver configuration file appropriately.
.SH OPTIONS
.TP 15
.B \-C
Do not chdir to the script's directory
.TP
.PD 0
.B \-\-php\-ini \fIpath\fP|\fIfile\fP
.TP
.PD 1
.B \-c \fIpath\fP|\fIfile\fP
Look for 
.B php.ini 
file in the directory
.IR path
or use the specified
.IR file
.TP
.PD 0
.B \-\-no\-php\-ini
.TP
.PD 1
.B \-n
No 
.B php.ini 
file will be used
.TP
.PD 0
.B \-\-define \fIfoo\fP[=\fIbar\fP]
.TP
.PD 1
.B \-d \fIfoo\fP[=\fIbar\fP]
Define INI entry 
.IR foo 
with value
.IR bar
.TP
.B \-e
Generate extended information for debugger/profiler
.TP
.PD 0
.B \-\-help
.TP
.PD 1
.B \-h
This help
.TP
.PD 0
.B \-\-info
.TP
.PD 1
.B \-i
PHP information and configuration
.TP
.PD 0
.B \-\-modules
.TP
.PD 1
.B \-m
Show compiled in modules
.TP
.PD 0
.B \-\-version
.TP
.PD 1
.B \-v
Version number
.B \-\-prefix \fIpath\fP
.TP
.PD 1
.B \-p
Specify alternative prefix path (the default is /opt/alt/php54)
.TP
.PD 0
.B \-\-fpm\-config \fIfile\fP
.TP
.PD 1
.B \-y
Specify alternative path to FastCGI process manager configuration file (the default is /opt/alt/php54/etc/php-fpm.conf)
.TP
.PD 0
.B \-\-test
.TP
.PD 1
.B \-t
Test FPM configuration file and exit
If called twice (\-tt), the configuration is dumped before exiting.
.TP
.PD 0
.B \-\-daemonize
.TP
.PD 1
.B \-D
Force to run in background and ignore daemonize option from configuration file.
.TP
.PD 0
.B \-\-nodaemonize
.TP
.PD 1
.B \-F
Force to stay in foreground and ignore daemonize option from configuration file.
.TP
.PD 0
.B \-\-zend\-extension \fIfile\fP
.TP
.PD 1
.B \-z \fIfile\fP
Load Zend extension 
.IR file
.SH FILES
.TP 15
.B php-fpm.conf
The configuration file for the php-fpm daemon.
.TP
.B php.ini
The standard php configuration file.
.SH EXAMPLES
For any unix systems which use init.d for their main process manager, you should use the init script provided to start and stop the php-fpm daemon.
.P
.PD 1
.RS
sudo /etc/init.d/php-fpm start
.RE
.TP
For any unix systems which use systemd for their main process manager, you should use the unit file provided to start and stop the php-fpm daemon.
.P
.PD 1
.RS
sudo systemctl start php-fpm.service
.RE
.TP
If your installation has no appropriate init script, launch php-fpm with no arguments. It will launch as a daemon (background process) by default. The file /var/run/php-fpm.pid determines whether php-fpm is already up and running. Once started, php-fpm then responds to several POSIX signals:
.P
.PD 0
.RS
.B SIGINT,SIGTERM 	\fPimmediate termination
.TP
.B SIGQUIT 			\fPgraceful stop
.TP
.B SIGUSR1 			\fPre-open log file
.TP
.B SIGUSR2 			\fPgraceful reload of all workers + reload of fpm conf/binary
.RE
.PD 1
.P
.SH TIPS
The PHP-FPM CGI daemon will work well with most popular webservers, including Apache2, lighttpd and nginx.
.PD 1
.P
.SH SEE ALSO
The PHP-FPM website:
.PD 0
.P
.B http://php-fpm.org
.PD 1
.P
For a more or less complete description of PHP look here:
.PD 0
.P
.B http://www.php.net/manual/
.PD 1
.P
A nice introduction to PHP by Stig Bakken can be found here:
.PD 0
.P
.B http://www.zend.com/zend/art/intro.php
.PD 1
.SH BUGS
You can view the list of known bugs or report any new bug you
found at:
.PD 0
.P
.B http://bugs.php.net
.PD 1
.SH AUTHORS
PHP-FPM SAPI was written by Andrei Nigmatulin. The mailing-lists are highload-php-en (English) and highload-php-ru (Russian).
.P
The PHP Group: Thies C. Arntzen, Stig Bakken, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski.
.P
A List of active developers can be found here:
.PD 0
.P
.B http://www.php.net/credits.php
.PD 1
.P
And last but not least PHP was developed with the help of a huge amount of 
contributors all around the world.
.SH VERSION INFORMATION
This manpage describes \fBphp-fpm\fP, version 5.4.45.
.SH COPYRIGHT
Copyright \(co 1997\-2009 The PHP Group
.PD 0
.P
Copyright (c) 2007-2009, Andrei Nigmatulin
.PD 1
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
PK0^�\�`>5*5*man/man1/phar.1nu�[���.TH PHAR 1 "2013" "The PHP Group" "User Commands"
.SH NAME
phar, phar.phar \- PHAR (PHP archive) command line tool
.SH SYNOPSIS
.B phar
<command> [options] ...
.LP
.SH DESCRIPTION
The \fBPHAR\fP file format provides a way to put entire PHP applications into a single
file called a "phar" (PHP Archive) for easy distribution and installation.
.P
With the \fBphar\fP command you can create, update or extract PHP archives.
.P
Commands: 
add compress delete extract help help-list info list meta-del
meta-get meta-set pack sign stub-get stub-set tree version

.SH add command
Add entries to a PHAR package.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.TP
.PD
.B ...
Any number of input files and directories. If -i is in
use then ONLY files and matching the given regular
expression are being packed. If -x is given then files
matching that regular expression are NOT being packed.
.P
Optional arguments:
.TP 15
.PD
.B \-a \fIalias\fP
Provide an \fIalias\fP name for the phar file.
.TP
.PD
.B \-c \fIalgo\fP
Compression algorithm (see 
.SM
.B COMPRESSION
)
.TP
.PD
.B \-i \fIregex\fP
Specifies a regular expression for input files.
.TP
.PD
.B \-l \fIlevel\fP
Number of preceding subdirectories to strip from file entries
.TP
.PD
.B \-x \fIregex\fP
Regular expression for input files to exclude.

.SH compress command
Compress or uncompress all files or a selected entry.
.P
Required arguments:
.TP 15
.PD
.B \-c \fIalgo\fP
Compression algorithm (see 
.SM
.B COMPRESSION
)
.TP
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -e \fIentry\fP
Name of \fIentry\fP to work on (must include PHAR internal
directory name if any).

.SH delete command
Delete entry from a PHAR archive
.P
Required arguments:
.TP 15
.PD
.B \-e \fIentry\fP
Name of \fIentry\fP to work on (must include PHAR internal
directory name if any).
.TP
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.

.SH extract command
Extract a PHAR package to a directory.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -i \fIregex\fP
Specifies a regular expression for input files.
.TP
.PD
.B -x \fIregex\fP
Regular expression for input files to exclude.
.TP
.PD
.B ...
Directory to extract to (defaults to '.').


.SH help command
This help or help for a selected command.
.P
Optional arguments:
.TP 15
.PD
.B ...
Optional command to retrieve help for.

.SH help-list command
Lists available commands.

.SH info command
Get information about a PHAR package.
.P
By using -k it is possible to return a single value.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -k \fIindex\fP
Subscription \fIindex\fP to work on.

.SH list command
List contents of a PHAR archive.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -i \fIregex\fP
Specifies a regular expression for input files.
.TP
.PD
.B -x \fIregex\fP
Regular expression for input files to exclude.


.SH meta-del command
Delete meta information of a PHAR entry or a PHAR package.
.P
If -k is given then the metadata is expected to be an array and the
given index is being deleted.
.P
If something was deleted the return value is 0 otherwise it is 1.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -e \fIentry\fP
Name of \fIentry\fP to work on (must include PHAR internal
directory name if any).
.TP
.PD
.B -k \fIindex\fP
Subscription \fIindex\fP to work on.

.SH meta-get command
Get meta information of a PHAR entry or a PHAR package in serialized from. If
no output file is specified for meta data then stdout is being used.
You can also specify a particular index using -k. In that case the
metadata is expected to be an array and the value of the given index
is returned using echo rather than using serialize. If that index does
not exist or no meta data is present then the return value is 1.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B -e \fIentry\fP
Name of \fIentry\fP to work on (must include PHAR internal
directory name if any).
.TP
.PD
.B -k \fIindex\fP
Subscription \fIindex\fP to work on.

.SH meta-set command
Set meta data of a PHAR entry or a PHAR package using serialized input. If no
input file is specified for meta data then stdin is being used. You can
also specify a particular index using -k. In that case the metadata is
expected to be an array and the value of the given index is being set.
If the metadata is not present or empty a new array will be created.
If the metadata is present and a flat value then the return value is
1. Also using -k the input is been taken directly rather then being
serialized.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.TP
.PD
.B -m \fImeta\fP
Meta data to store with entry (serialized php data).
.P
Optional arguments:
.TP 15
.PD
.B -e \fIentry\fP
Name of \fIentry\fP to work on (must include PHAR internal
directory name if any).
.TP
.PD
.B -k \fIindex\fP
Subscription \fIindex\fP to work on.

.SH pack command
Pack files into a PHAR archive.
.P
When using -s <stub>, then the stub file is being excluded from the
list of input files/dirs.To create an archive that contains PEAR class
PHP_Archive then point -p argument to PHP/Archive.php.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.TP
.PD
.B ...
Any number of input files and directories. If -i is in
use then ONLY files and matching the given regular
expression are being packed. If -x is given then files
matching that regular expression are NOT being packed.
.P
Optional arguments:
.TP 15
.PD
.B \-a \fIalias\fP
Provide an \fIalias\fP name for the phar file.
.TP
.PD
.B \-b \fIbang\fP
Hash-bang line to start the archive (e.g. #!/usr/bin/php).
The hash mark itself '#!' and the newline character are optional.
.TP
.PD
.B \-c \fIalgo\fP
Compression algorithm (see 
.SM
.B COMPRESSION
)
.TP
.PD
.B \-h \fIhash\fP
Selects the \fIhash\fP algorithm (see 
.SM
.B HASH
)
.TP
.PD
.B \-i \fIregex\fP
Specifies a regular expression for input files.
.TP
.PD
.B \-l \fIlevel\fP
Number of preceding subdirectories to strip from file entries
.TP
.PD
.B \-p \fIloader\fP
Location of PHP_Archive class file (pear list-files
PHP_Archive).You can use '0' or '1' to locate it
automatically using the mentioned pear command. When
using '0' the command does not error out when the class
file cannot be located. This switch also adds some code
around the stub so that class PHP_Archive gets
registered as phar:// stream wrapper if necessary. And
finally this switch will add the file phar.inc from
this package and load it to ensure class Phar is
present.
.TP
.PD
.B \-s \fIstub\fP
Select the \fIstub\fP file.
.TP
.PD
.B \-x \fIregex\fP
Regular expression for input files to exclude.
.TP
.PD
.B \-y \fIkey\fP
Private \fIkey\fP for OpenSSL signing.

.SH sign command
Set signature hash algorithm.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.TP
.PD
.B \-h \fIhash\fP
Selects the \fIhash\fP algorithm (see 
.SM
.B HASH
)
.P
Optional arguments:
.TP 15
.PD
.B \-y \fIkey\fP
Private \fIkey\fP for OpenSSL signing.

.SH stub-get command
Get the stub of a PHAR file. If no output file is specified as stub then stdout
is being used.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B \-s \fIstub\fP
Select the \fIstub\fP file.

.SH stub-set command
Set the stub of a PHAR file. If no input file is specified as stub then stdin
is being used.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B \-b \fIbang\fP
Hash-bang line to start the archive (e.g. #!/usr/bin/php).
The hash mark itself '#!' and the newline character are optional.
.TP
.PD
.B \-p \fIloader\fP
Location of PHP_Archive class file (pear list-files
PHP_Archive).You can use '0' or '1' to locate it
automatically using the mentioned pear command. When
using '0' the command does not error out when the class
file cannot be located. This switch also adds some code
around the stub so that class PHP_Archive gets
registered as phar:// stream wrapper if necessary. And
finally this switch will add the file phar.inc from
this package and load it to ensure class Phar is
present.
.TP
.PD
.B \-s \fIstub\fP
Select the \fIstub\fP file.


.SH tree command
Get a directory tree for a PHAR archive.
.P
Required arguments:
.TP 15
.PD
.B -f \fIfile\fP
Specifies the phar \fIfile\fP to work on.
.P
Optional arguments:
.TP 15
.PD
.B \-i \fIregex\fP
Specifies a regular expression for input files.
.TP
.PD
.B \-x \fIregex\fP
Regular expression for input files to exclude.

.SH version command
Get information about the PHAR environment and the tool version.


.SH COMPRESSION
Algorithms:
.TP 15
.PD
.B 0
No compression
.TP
.PD
.B none
No compression
.TP
.PD
.B auto
Automatically select compression algorithm
.TP
.PD
.B gz
GZip compression
.TP
.PD
.B gzip
GZip compression
.TP
.PD
.B bz2
BZip2 compression
.TP
.PD
.B bzip2
BZip2 compression

.SH HASH
Algorithms:
.TP 15
.PD
.TP
.PD
.B md5
MD5
.TP
.PD
.B sha1
SHA1
.TP
.PD
.B sha256
SHA256
.TP
.PD
.B sha512
SHA512
.TP
.PD
.B openssl
OpenSSL

.SH SEE ALSO
For a more or less complete description of PHAR look here:
.PD 0
.P
.B http://php.net/phar
.PD 1
.P
.SH BUGS
You can view the list of known bugs or report any new bug you
found at:
.PD 0
.P
.B http://bugs.php.net
.PD 1
.SH AUTHORS
The PHP Group: Thies C. Arntzen, Stig Bakken, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski.
.P
Work for the PHP archive was done by Gregory Beaver, Marcus Boerger.
.P
A List of active developers can be found here:
.PD 0
.P
.B http://www.php.net/credits.php
.PD 1
.P
And last but not least PHP was developed with the help of a huge amount of 
contributors all around the world.
.SH VERSION INFORMATION
This manpage describes \fBphar\fP, version 5.4.45.
.SH COPYRIGHT
Copyright \(co 1997\-2014 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
PK0^�\��M��man/man1/php-config.1nu�[���.TH php\-config 1 "2010" "The PHP Group" "Scripting Language"
.SH NAME
php\-config \- get information about PHP configuration and compile options
.SH SYNOPSIS
.B php\-config
[options]
.LP
.SH DESCRIPTION
.B php\-config
is a simple shell script for obtaining information about installed PHP configuration.
.SH OPTIONS
.TP 15
.PD 0
.B \-\-prefix
Directory prefix where PHP is installed, e.g. /usr/local
.TP
.PD 0
.B \-\-includes
List of \-I options with all include files
.TP
.PD 0
.B \-\-ldflags
LD Flags which PHP was compiled with
.TP
.PD 0
.B \-\-libs
Extra libraries which PHP was compiled with
.TP
.PD 0
.B \-\-man-dir
The directory prefix where the manpages is installed
.TP
.PD 0
.B \-\-extension-dir
Directory where extensions are searched by default
.TP
.PD 0
.B \-\-include-dir
Directory prefix where header files are installed by default
.TP
.PD 0
.B \-\-php-binary
Full path to php CLI or CGI binary
.TP
.PD 0
.B \-\-php-sapis
Show all SAPI modules available
.TP
.PD 0
.B \-\-configure-options
Configure options to recreate configuration of current PHP installation
.TP
.PD 0
.B \-\-version
PHP version
.TP
.PD 0
.B \-\-vernum
PHP version as integer
.TP
.PD 1
.P
.SH SEE ALSO
.BR php (1)
.SH VERSION INFORMATION
This manpage describes \fBphp\fP, version 5.4.45.
.SH COPYRIGHT
Copyright \(co 1997\-2010 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
PK1^�\G���man/man1/php-cgi.1nu�[���.so man1/php.1
PK1^�\��*��$�$man/man1/php.1nu�[���.TH PHP 1 "2014" "The PHP Group" "Scripting Language"
.SH NAME
php \- PHP Command Line Interface 'CLI'
.P
php-cgi \- PHP Common Gateway Interface 'CGI' command
.SH SYNOPSIS
.B php
[options] [
.B \-f\fP ]
.IR file
[[\-\-] 
.IR args.\|.\|. ]
.LP
.B php
[options] 
.B \-r 
.IR code
[[\-\-]
.IR args.\|.\|. ]
.LP
.B php
[options] [\-B 
.IR begin_code ]
.B \-R 
.IR code
[\-E 
.IR end_code ]
[[\-\-]
.IR args.\|.\|. ]
.LP
.B php
[options] [\-B 
.IR begin_code ]
.B \-F 
.IR file
[\-E 
.IR end_code ]
[[\-\-]
.IR args.\|.\|. ]
.LP
.B php
[options] \-\- [
.IR args.\|.\|. ]
.LP
\fBphp \fP[options] \fB\-a\fP
.LP
.B php
[options] \-S
.IR addr:port
[\-t
.IR docroot ]
.LP
.SH DESCRIPTION
\fBPHP\fP is a widely\-used general\-purpose scripting language that is especially suited for 
Web development and can be embedded into HTML. This is the command line interface
that enables you to do the following:
.P
You can parse and execute files by using parameter \-f followed by the name of the 
.IR file 
to be executed.
.LP
Using parameter \-r you can directly execute PHP 
.IR code 
simply as you would do inside a
.B \.php
file when using the 
.B eval() 
function.
.LP
It is also possible to process the standard input line by line using either
the parameter \-R or \-F. In this mode each separate input line causes the
.IR code 
specified by \-R or the 
.IR file
specified by \-F to be executed.
You can access the input line by \fB$argn\fP. While processing the input lines
.B $argi 
contains the number of the actual line being processed. Further more
the parameters \-B and \-E can be used to execute 
.IR code
(see \-r) before and
after all input lines have been processed respectively. Notice that the
input is read from
.B STDIN
and therefore reading from 
.B STDIN 
explicitly changes the next input line or skips input lines.
.LP
PHP also contains an built-in web server for application development purpose. By using the \-S option where
.B addr:port
point to a local address and port PHP will listen to HTTP requests on that address and port and serve files from the current working directory or the
.B docroot
passed by the \-t option.
.LP
If none of \-r \-f \-B \-R \-F \-E or \-S is present but a single parameter is given 
then this parameter is taken as the filename to parse and execute (same as 
with \-f). If no parameter is present then the standard input is read and 
executed.
.SH OPTIONS
.TP 15
.PD 0
.B \-\-interactive
.TP
.PD 1
.B \-a
Run PHP interactively. This lets you enter snippets of PHP code that directly
get executed. When readline support is enabled you can edit the lines and also
have history support.
.TP
.PD 0
.B \-\-bindpath \fIaddress:port\fP|\fIport\fP
.TP
.PD 1
.B \-b \fIaddress:port\fP|\fIport\fP
Bind Path for external FASTCGI Server mode (CGI only).
.TP
.PD 0
.B \-\-no\-chdir
.TP
.PD 1
.B \-C
Do not chdir to the script's directory (CGI only).
.TP
.PD 0
.B \-\-no\-header
.TP
.PD 1
.B \-q
Quiet-mode. Suppress HTTP header output (CGI only).
.TP
.PD 0
.B \-\-timing \fIcount\fP
.TP
.PD 1
.B \-T \fIcount\fP
Measure execution time of script repeated count times (CGI only).
.TP
.PD 0
.B \-\-php\-ini \fIpath\fP|\fIfile\fP
.TP
.PD 1
.B \-c \fIpath\fP|\fIfile\fP
Look for 
.B php.ini 
file in the directory
.IR path
or use the specified
.IR file
.TP
.PD 0
.B \-\-no\-php\-ini
.TP
.PD 1
.B \-n
No 
.B php.ini 
file will be used
.TP
.PD 0
.B \-\-define \fIfoo\fP[=\fIbar\fP]
.TP
.PD 1
.B \-d \fIfoo\fP[=\fIbar\fP]
Define INI entry 
.IR foo 
with value
.IR bar
.TP
.B \-e
Generate extended information for debugger/profiler
.TP
.PD 0
.B \-\-file \fIfile\fP
.TP
.PD 1
.B \-f \fIfile\fP
Parse and execute 
.IR file
.TP
.PD 0
.B \-\-help
.TP
.PD 1
.B \-h
This help
.TP
.PD 0
.B \-\-hide\-args
.TP
.PD 1
.B \-H
Hide script name (\fIfile\fP) and parameters (\fIargs\.\.\.\fP) from external 
tools. For example you may want to use this when a php script is started as 
a daemon and the command line contains sensitive data such as passwords.
.TP
.PD 0
.B \-\-info
.TP
.PD 1
.B \-i
PHP information and configuration
.TP
.PD 0
.B \-\-syntax\-check
.TP
.PD 1
.B \-l
Syntax check only (lint)
.TP
.PD 0
.B \-\-modules
.TP
.PD 1
.B \-m
Show compiled in modules
.TP
.PD 0
.B \-\-run \fIcode\fP
.TP
.PD 1
.B \-r \fIcode\fP
Run PHP 
.IR code
without using script tags
.B '<?..?>'
.TP
.PD 0
.B \-\-process\-begin \fIcode\fP
.TP
.PD 1
.B \-B \fIbegin_code\fP
Run PHP 
.IR begin_code
before processing input lines
.TP
.PD 0
.B \-\-process\-code \fIcode\fP
.TP
.PD 1
.B \-R \fIcode\fP
Run PHP 
.IR code
for every input line
.TP
.PD 0
.B \-\-process\-file \fIfile\fP
.TP
.PD 1
.B \-F \fIfile\fP
Parse and execute 
.IR file
for every input line
.TP
.PD 0
.B \-\-process\-end \fIcode\fP
.TP
.PD 1
.B \-E \fIend_code\fP
Run PHP 
.IR end_code
after processing all input lines
.TP
.PD 0
.B \-\-syntax\-highlight
.TP
.PD 1
.B \-s
Output HTML syntax highlighted source
.TP
.PD 0
.B \-\-server \fIaddr:port\fP
.TP
.PD 1
.B \-S \fIaddr:port\fP
Start built-in web server on the given local address and port
.TP
.PD 0
.B \-\-docroot \fIdocroot\fP
.TP
.PD 1
.B \-t \fIdocroot\fP
Specify the document root to be used by the built-in web server
.TP
.PD 0
.B \-\-version
.TP
.PD 1
.B \-v
Version number
.TP
.PD 0
.B \-\-strip
.TP
.PD 1
.B \-w
Output source with stripped comments and whitespace
.TP
.PD 0
.B \-\-zend\-extension \fIfile\fP
.TP
.PD 1
.B \-z \fIfile\fP
Load Zend extension 
.IR file
.TP
.IR args.\|.\|.
Arguments passed to script. Use 
.B '\-\-'
.IR args
when first argument starts with 
.B '\-'
or script is read from stdin
.TP
.PD 0
.B \-\-rfunction
.IR name
.TP
.PD 1
.B \-\-rf
.IR name
Shows information about function
.B name
.TP
.PD 0
.B \-\-rclass
.IR name
.TP
.PD 1
.B \-\-rc
.IR name
Shows information about class
.B name
.TP
.PD 0
.B \-\-rextension
.IR name
.TP
.PD 1
.B \-\-re
.IR name
Shows information about extension
.B name
.TP
.PD 0
.B \-\-rzendextension
.IR name
.TP
.PD 1
.B \-\-rz
.IR name
Shows information about Zend extension
.B name
.TP
.PD 0
.B \-\-rextinfo
.IR name
.TP
.PD 1
.B \-\-ri
.IR name
Shows configuration for extension
.B name
.TP
.B \-\-ini
Show configuration file names
.SH FILES
.TP 15
.B php\-cli.ini
The configuration file for the CLI version of PHP.
.TP
.B php.ini
The standard configuration file will only be used when 
.B php\-cli.ini
cannot be found.
.SH EXAMPLES
.TP 5
\fIphp \-r 'echo "Hello World\\n";'\fP
This command simply writes the text "Hello World" to standard out.
.TP
\fIphp \-r 'print_r(gd_info());'\fP
This shows the configuration of your gd extension. You can use this
to easily check which image formats you can use. If you have any
dynamic modules you may want to use the same ini file that php uses
when executed from your webserver. There are more extensions which
have such a function. For dba use:
.RS
\fIphp \-r 'print_r(dba_handlers(1));'\fP
.RE
.TP
\fIphp \-R 'echo strip_tags($argn)."\\n";'\fP
This PHP command strips off the HTML tags line by line and outputs the 
result. To see how it works you can first look at the following PHP command
\'\fIphp \-d html_errors=1 \-i\fP\' which uses PHP to output HTML formatted
configuration information. If you then combine those two 
\'\fIphp \.\.\.|php \.\.\.\fP\' you'll see what happens.
.TP
\fIphp \-E 'echo "Lines: $argi\\n";'\fP
Using this PHP command you can count the lines being input.
.TP
\fIphp \-R '@$l+=count(file($argn));' \-E 'echo "Lines:$l\\n";'\fP
In this example PHP expects each input line being a file. It counts all lines 
of the files specified by each input line and shows the summarized result. 
You may combine this with tools like find and change the php scriptlet.
.TP
\fIphp \-R 'echo "$argn\\n"; fgets(STDIN);'\fP
Since you have access to STDIN from within \-B \-R \-F and \-E you can skip 
certain input lines with your code. But note that in such cases $argi only 
counts the lines being processed by php itself. Having read this you will 
guess what the above program does: skipping every second input line.
.SH TIPS
You can use a shebang line to automatically invoke php
from scripts. Only the CLI version of PHP will ignore
such a first line as shown below:
.P
.PD 0
.RS
#!/bin/php
.P
<?php
.P
 // your script
.P
?>
.RE
.PD 1
.P
.SH SEE ALSO
For a more or less complete description of PHP look here:
.PD 0
.P
.B http://www.php.net/manual/
.PD 1
.P
.SH BUGS
You can view the list of known bugs or report any new bug you
found at:
.PD 0
.P
.B http://bugs.php.net
.PD 1
.SH AUTHORS
The PHP Group: Thies C. Arntzen, Stig Bakken, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski.
.P
Additional work for the CLI sapi was done by Edin Kadribasic, Marcus Boerger and Johannes Schlueter.
.P
A List of active developers can be found here:
.PD 0
.P
.B http://www.php.net/credits.php
.PD 1
.P
And last but not least PHP was developed with the help of a huge amount of 
contributors all around the world.
.SH VERSION INFORMATION
This manpage describes \fBphp\fP, version 5.4.45.
.SH COPYRIGHT
Copyright \(co 1997\-2013 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
PK2^�\z\u-man/man1/phar.phar.1nu�[���.so man1/phar.1
PK2^�\��J��man/man1/phpize.1nu�[���.TH phpize 1 "2010" "The PHP Group" "Scripting Language"
.SH NAME
phpize \- prepare a PHP extension for compiling
.SH SYNOPSIS
.B phpize
[options]
.LP
.SH DESCRIPTION
.B phpize
is a shell script to prepare PHP extension for compiling.
.SH OPTIONS
.TP 15
.PD 0
.B \-\-clean
Remove all created files
.TP
.PD 0
.B \-\-help
Prints usage information
.TP
.PD 0
.B \-\-version
.TP
.PD 1
.B \-v
Prints API version information
.TP
.PD 1
.P
.SH SEE ALSO
.BR php (1)
.SH VERSION INFORMATION
This manpage describes \fBphp\fP, version 5.4.45.
.SH COPYRIGHT
Copyright \(co 1997\-2010 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net 
so we can mail you a copy immediately.
PK3^�\�-��,�,+doc/alt-php54-ioncube-loader/USER-GUIDE.txtnu�[���ionCube Loader 15.0 User Guide
=====================================

This document describes the available php.ini configuration options of the
ionCube Loader that relate to processing of PHP encoded files, and also the
ionCube24 service. It also describes which encoded files can be run by each
ionCube Loader.

PERFORMANCE OF ENCODED FILES
----------------------------

We recommend that the encoded paths feature (see below) is used 
with encoded files in order to maximise performance.

ENCODED FILES  
-------------

INI entry: ioncube.loader.encoded_paths

Purpose:   Specify the locations of encoded files

  The ionCube Loader will normally examine a PHP file before processing
  to test whether it is encoded, and will run the file itself if necessary.
  Although this checking is very efficient, restricting which files the
  Loader tests for being encoded may give extra performance. If set to 
  a series of paths or files, only files in those locations are tested.

  Entries should be separated by a : on Unix and ; on Windows. 
  A path may be prefixed with + or - to add or remove that path from
  the possible locations. + is assumed if no character is given.


Examples: (... means ioncube.loader.encoded_paths)

  * Site with a single encoded module in /var/www/html/modules/RSS

... = "/var/www/html/modules/RSS"


  * As above, with a site configuration file encoded too.

... = "/var/www/html/modules/RSS:/var/www/html/config/config.php"


  * Encoded files may be anywhere except for /var/www/html/framework

... = "/:-/var/www/html/framework"


  * Site with most modules encoded except for one

... = "/var/www/html/modules:-/var/www/html/modules/plain"


  * As above, with an encoded config file in the plain directory

... = "/site/modules:-/site/modules/plain:/site/modules/plain/config.php"


Locations:

  The ioncube.loader.encoded_paths property can be set in a php.ini
  file, in a .htaccess file (when using Apache), in a .user.ini file
  (when using CGI PHP 5.3+) or using ini_set within a PHP script. In ini
  files only the last value will be used for the encoded_paths property. If
  you wish to build up the value in several lines then, for PHP 5.1+, you
  can use the following syntax:

ioncube.loader.encoded_paths = "/path1"  
ioncube.loader.encoded_paths = ${ioncube.loader.encoded_paths}":/path2"  
; etc...

LIMITATIONS OF LOADERS AND ENCODED FILES
----------------------------------------

Encoded files can, in general, run on versions of PHP equal to
or greater than the source language of the Encoder used to
produce them. So a file produced by the Encoder for PHP 7.2
can be run by the Loaders for PHP 7.2, 7.3 and 7.4, but 7.1. This 
means that the Loaders offer good backwards compatibility, 
however there are the following limitations:

  * The Loader for PHP 8.4 can run files produced by the PHP 8.2, 8.3
    and 8.4 Encoders.

  * The Loader for PHP 8.3 can run files produced by the PHP 8.2 and
    8.3 Encoders.

  * The Loader for PHP 8.2 can only run files produced for
    PHP 8.2. Updates for files produced for PHP 8.1 should
    be obtained to use them with PHP 8.2.

  * The Loader for PHP 8.1 can only run files produced for
    PHP 8.1.

  * The Loaders for PHP 7.1 through 7.4 can only run files 
    produced by the Encoders for PHP 7. 

  * The Loader for PHP 7.0 can only run files produced by the
    Encoder for PHP 5.6.

  * The Loaders for PHP 5.5 and PHP 5.6 cannot run files 
    produced by the PHP 4 Encoder.


IONCUBE24 : real-time intrusion protection and PHP error reporting
---------
### (Available for Linux 32 and 64 bit x86 servers using PHP 7)

ionCube24 (https://ioncube24.com) is an ionCube service that uses the
ionCube Loader to provide both real-time protection against the exploit of
website vulnerabilities and alerting of website errors.

Vulnerabilities in PHP applications are common, particularly in sites using 
Wordpress and other plugin based systems. Exploits result in website
defacement or customer data being compromised, and ionCube24 provides a 
uniquely powerful defense. 

PHP errors can cause intermittent or even persistent blank pages or errors for
visitors until discovered, and without active monitoring this could go
undetected indefinitely. ionCube24 active monitoring ensures you are always
aware of problems in your website code.

ionCube24 is free to try, with the server side support built into the Linux
Loaders as standard. With the Loader installed, ionCube24 can be activated
at any time to give active intrusion protection and error reporting.

## php.ini settings

ionCube24 has a powerful real-time web interface to configure, monitor and
manage things, and there are also settings that can be used in a php.ini
file as summarised below.

The setup process at https://ioncube24.com automatically gives the settings
that you need to get started, but you may wish to make changes yourself
once setup. The default values are given with each example.

### Global settings

INI entry: ic24.enable ; default 0

Purpose: Enable or disable all ionCube24 features. 

This defaults to 0 (off), and in this case no ionCube24 behaviour is
activated.

Example:

  ic24.enable = 1

----------

INI entry: ic24.api_access_key ; provided during setup

Purpose: An authentication key for adminstration requests. 

  This value is provided when adding a server to ionCube24.

----------

INI entry: ic24.api_check_ip ; default 1

Purpose: Specify whether the IP for admin requests should be validated

  If set, ionCube24 refuses access to API functions unless the calling IP
  is a known ionCube IP address. This option should be left with the
  default setting unless web requests pass through a proxy and your site
  appears to be accessed from the IP of the proxy instead of ionCube. Note
  that access to API functions will still be authenticated by access key.

----------

INI entry: ic24.api_max_timeout ; default 7

Purpose: Maximum timeout period when sending notifications to ionCube24.

  The actual period is adaptive so that a brief increase in typical latency
  will favour a timeout followed by a retry rather than a longer than usual
  timeout.

----------

INI entry: ic24.home_dir ; no default

Purpose: The home directory for ionCube24 related system files. 

  A location outside of the web root is recommended.  It should be writable
  by the web server during startup.

Example:

ic24.home_dir = /var/www/ic24_home

----------

INI entry: ic24.update_domains_retry_interval ; default 30

Purpose: The number of seconds to wait before retrying a fetch of the set
of domains being managed.


### Security related settings

INI entry: ic24.sec.enable ; default "auto"

Purpose: Enable the intrusion protection feature of ionCube24.

Accepted values:

   * "auto" (default) - allow setting from the ionCube24 control panel.
   * 1 : always enabled.
   * 0 : disabled.

----------

INI entry: ic24.sec.initial_state ; default 1

Purpose: The default for whether security should be enabled or
disabled. The default is to enable protection. Any files on a protected
domain will become blocked if they are changed, so setting this to 0 will
avoid accidental blocking when using ionCube24 for the first time.
Protection may be enabled and disabled using the ionCube24 control panel and
also via the User API.

Accepted values:

   * 1 : protection will be active when ionCube24 initialises.
   * 0 : protection will be disabled.

----------

INI entry: ic24.sec.initial_action ; default "block"

Purpose: The initial setting for how new and modified files should be
treated when about to execute. The default is to block. The action is taken
only if protection is enabled, and the setting may be changed via the
ionCube24 control panel.

Accepted values:

   * "block" : prevent execution of new or modified files
   * "allow" : allow execution of new or modified files

Note that depending on the notification settings, a notification may still
be generated when a new or modified file is about to execute even if it is
not blocked.

----------

INI entry: ic24.sec.initial_notify ; default "always"

Purpose: The initial setting for whether a notification is generated the 
first time an unacknowledged new or modified file is attempted to be
executed. This setting can be changed via the ionCube24 control panel.

Accepted values:

   * "always" : always notify of a new modification 
   * "once"   : only the first detected modification is reported
   * "never"  : never notify of new and modified files

----------

INI entry: ic24.sec.exclusion_key ; provided during setup

Purpose: A key that if present at the start of a file, will identify the
file as trusted. This value is provided when adding a server to ionCube24.

----------

INI entry: ic24.sec.trusted_include_paths ; no default

Purpose: List paths from where files can be included and automatically
trusted.

Example:

ic24.sec.trusted_include_paths = "/var/cache:/var/cache2"

Directories can be excluded from the list by prefixing with a minus
character -. e.g.

"/var/cache:-/var/cache/subdir"

This is useful if your site creates and/or modifies files by itself from
time to time, e.g. in a cache directory. Requests that *directly* access
files on a trusted include path will be blocked but the file itself will
not be blocked, so requests that use the file as intended will still work.
See ioncube24.com for more details once signed up.  As an alternative, if
possible we recommend producing files that include the exclusion key.

----------

INI entry: ic24.sec.block_uploaded_files ; default 1

Purpose: If set, block any uploaded files in ionCube24 that are processed
using the standard PHP mechanism for uploaded files. This applies even if
the file is subsequently included and where included files being
automatically approved with the previous setting.

----------

INI entry: ic24.sec.block_stdin ; default 1

Purpose: Refuse code that PHP sees via stdin.  If disabled, code via
stdin will run without security checking as there is no filepath. This
setting should be left on as PHP would normally never receive a script via
stdin.

### PHP Error reporting settings

INI entry: ic24.phperr.enable ; default "auto"

Purpose: Enable reporting of PHP errors to ionCube24.  When enabled, any
non-ignored errors are reported to ionCube24 in realtime, triggering
alerting so errors can be investigated as necessary.

Accepted values:

   * "auto" (default) - allow setting from the ionCube24 control panel.
   * 1 : always enabled.
   * 0 : disabled.

----------

### Deprecated settings

Deprecated settings are subject to removal in a future
release.

INI entry: ic24.phperr.ignore ; default 0

Purpose: Specify default error levels to always ignore for all domains.

Note that default and per-domain errors to ignore can also be set via the
web interface, and are combined with this setting. Leaving this unset and
using the web interface is recommended for maximum flexibility.

Example: 

ic24.phperr.ignore = E_NOTICE | E_DEPRECATED

(c) ionCube Ltd. 2025
PK3^�\�z)�)�.doc/alt-php54-ioncube-loader/loader-wizard.phpnu�[���<?php // -*- c++ -*-

/** 
 * ionCube Loader install Wizard
 *
 * ionCube is a registered trademark of ionCube Ltd. 
 *
 * Copyright (c) ionCube Ltd. 2002-2022
 */


 

define ('ERROR_UNKNOWN_OS',1);
define ('ERROR_UNSUPPORTED_OS',2);
define ('ERROR_UNKNOWN_ARCH',3);
define ('ERROR_UNSUPPORTED_ARCH',4);
define ('ERROR_UNSUPPORTED_ARCH_OS',5);
define ('ERROR_WINDOWS_64_BIT',6);
define ('ERROR_PHP_UNSUPPORTED',7);
define ('ERROR_PHP_DEBUG_BUILD',8);
define ('ERROR_RUNTIME_EXT_DIR_NOT_FOUND',101);
define ('ERROR_RUNTIME_LOADER_FILE_NOT_FOUND',102);
define ('ERROR_INI_NOT_FIRST_ZE',201);
define ('ERROR_INI_WRONG_ZE_START',202);
define ('ERROR_INI_ZE_LINE_NOT_FOUND',203);
define ('ERROR_INI_LOADER_FILE_NOT_FOUND',204);
define ('ERROR_INI_NOT_FULL_PATH',205);
define ('ERROR_INI_NO_PATH',206);
define ('ERROR_INI_NOT_FOUND',207);
define ('ERROR_INI_NOT_READABLE',208);
define ('ERROR_INI_MULTIPLE_IC_LOADER_LINES',209);
define ('ERROR_INI_USER_INI_NOT_FOUND',210);
define ('ERROR_INI_USER_CANNOT_CREATE',211);
define ('ERROR_LOADER_UNEXPECTED_NAME',301);
define ('ERROR_LOADER_NOT_READABLE',302);
define ('ERROR_LOADER_PHP_MISMATCH',303);
define ('ERROR_LOADER_NONTS_PHP_TS',304);
define ('ERROR_LOADER_TS_PHP_NONTS',305);
define ('ERROR_LOADER_WRONG_OS',306);
define ('ERROR_LOADER_WRONG_ARCH',307);
define ('ERROR_LOADER_WRONG_GENERAL',308);
define ('ERROR_LOADER_WIN_SERVER_NONWIN',321);
define ('ERROR_LOADER_WIN_NONTS_PHP_TS',322);
define ('ERROR_LOADER_WIN_TS_PHP_NONTS',323);
define ('ERROR_LOADER_WIN_PHP_MISMATCH',324);
define ('ERROR_LOADER_WIN_COMPILER_MISMATCH',325);
define ('ERROR_LOADER_NOT_FOUND',380);
define ('ERROR_LOADER_PHP_VERSION_UNKNOWN',390);


define ('SERVER_UNKNOWN',0);
define ('HAS_PHP_INI',1);
define ('SERVER_SHARED',2); 
define ('SERVER_VPS',5); 
define ('SERVER_DEDICATED',7); 
define ('SERVER_LOCAL',9);

define ('IONCUBE_IP_ADDRESS',
			'94.101.154.134');
define  ('IONCUBE_ACCESS_ADDRESS',
			'lwaccess.ioncube.com');
define ('LOADERS_PAGE',
            'https://loaders.ioncube.com/'); 
define ('SUPPORT_SITE',
            'https://support.ioncube.com/');                                 
define ('WIZARD_SUPPORT_TICKET_DEPARTMENT',
			'3');
define ('LOADER_FORUM_URL',
            'https://forum.ioncube.com/viewforum.php?f=4');                  
define ('LOADERS_FAQ_URL',
            'https://www.ioncube.com/faqs/loaders.php');                     
define ('UNIX_ERRORS_URL',
            'https://www.ioncube.com/loaders/unix_startup_errors.php');      
define ('LOADER_WIZARD_URL',
            LOADERS_PAGE);                                                  
define ('ENCODER_URL',
            'https://www.ioncube.com/sa_encoder.php');                       
define ('LOADER_VERSION_URL',
            'https://www.ioncube.com/feeds/product_info/versions.php');    
define ('WIZARD_LATEST_VERSION_URL',
            LOADER_VERSION_URL . '?item=loader-wizard'); 
define ('PHP_COMPILERS_URL',
            LOADER_VERSION_URL . '?item=php-compilers');
define ('LOADER_PLATFORM_URL',
            LOADER_VERSION_URL . '?item=loader-platforms-all');   
define ('LOADER_LATEST_VERSIONS_URL',
            LOADER_VERSION_URL . '?item=loader-versions'); 
define ('LOADER_PHP_VERSION_URL',
            LOADER_VERSION_URL . '?item=loader-php-support'); 
define ('WIZARD_STATS_URL',
            'https://www.ioncube.com/feeds/stats/wizard.php');    
define ('IONCUBE_DOWNLOADS_SERVER',
            'https://downloads.ioncube.com/loader_downloads');          
define ('IONCUBE24_URL',
			'https://ioncube24.com');
define ('IONCUBE_CONNECT_TIMEOUT',4);

define ('DEFAULT_SELF','/ioncube/loader-wizard.php');
define ('LOADER_NAME_CHECK',true);
define ('LOADER_EXTENSION_NAME','ionCube Loader');
define ('LOADER_SUBDIR','ioncube');
define ('WINDOWS_IIS_LOADER_DIR', 'system32');
define ('ADDITIONAL_INI_FILE_NAME','00-ioncube.ini');
define ('UNIX_SYSTEM_LOADER_DIR','/usr/local/ioncube');
define ('RECENT_LOADER_VERSION','4.0.7');
define ('LATEST_LOADER_MAJOR_VERSION',12);
define ('LOADERS_PACKAGE_PREFIX','ioncube_loaders_');
define ('SESSION_LIFETIME_MINUTES',360);
define ('WIZARD_EXPIRY_MINUTES',2880);
define ('IONCUBE_WIZARD_EXPIRY_MINUTES',10080);
define ('MIN_INITIALISE_TIME',4);
define ('IC24_ENABLED_INI_PROPERTY',"ic24.enable");

    run();


function php4_http_build_query($formdata, $numeric_prefix = null, $key = null ) {
    $res = array();
    foreach ((array)$formdata as $k=>$v) {
        $tmp_key = urlencode(is_int($k) ? $numeric_prefix.$k : $k);
        if ($key) $tmp_key = $key.'['.$tmp_key.']';
        if ( is_array($v) || is_object($v) ) {
            $res[] = php4_http_build_query($v, null , $tmp_key);
        } else {
            $res[] = $tmp_key."=".urlencode($v);
        }
   }
   $separator = ini_get('arg_separator.output');
   return implode($separator, $res);
}


function script_version()
{
    return "2.74";
}

function retrieve_latest_wizard_version()
{
    $v = false;

    $s = trim(remote_file_contents(WIZARD_LATEST_VERSION_URL));
    if (preg_match('/^\d+([.]\d+)*$/', $s)) {
        $v = $s;
    }

    return $v;
}

function latest_wizard_version()
{
    if (!isset($_SESSION['latest_wizard_version'])) {
        $_SESSION['latest_wizard_version'] = retrieve_latest_wizard_version();
    } 
    return $_SESSION['latest_wizard_version'];
}

function update_is_available($lv)
{
    if (is_numeric($lv)) {
        $lv_parts = explode('.',$lv);
        $script_parts = explode('.',script_version());
        return ($lv_parts[0] > $script_parts[0] || ($lv_parts[0] == $script_parts[0] && $lv_parts[1] > $script_parts[1]));
    } else {
        return null;
    }
}

function check_for_wizard_update($echo_message = false)
{
    $latest_version = latest_wizard_version();
    $update_available = update_is_available($latest_version);

    if ($update_available) {
        if ($echo_message) {
            echo '<p class="alert">An updated version of this Wizard script is available <a href="' . LOADER_WIZARD_URL . '">here</a>.</p>';
        }
        return $latest_version;
    } else {
        return $update_available;
    }
}


function remote_file_contents($url)
{
    $remote_file_opening = ini_get('allow_url_fopen');
    $contents = false;
    if (isset($_SESSION['timing_out']) && $_SESSION['timing_out']) {
        return false;
    }
    @session_write_close();
    $timing_out = 0;
    if ($remote_file_opening) {
        $fh = @fopen($url,'rb');
        if ($fh) {
            stream_set_blocking($fh,0);
            stream_set_timeout($fh,IONCUBE_CONNECT_TIMEOUT);
            while (!feof($fh)) {
                $result = fread($fh, 8192);
                $info = stream_get_meta_data($fh);
                $timing_out = $info['timed_out']?1:0;
                if ($timing_out) {
                    break;
                }
                if ($result !== false) {
                    $contents .= $result;
                } else {
                    break;
                }
            }
            fclose($fh);
        } else {
            $timing_out = 1;
        }
    } elseif (extension_loaded('curl')) {
            $ch = curl_init();

            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,IONCUBE_CONNECT_TIMEOUT);
            $output = curl_exec($ch);
            $info = curl_getinfo($ch);
            $timing_out = ($info['http_code'] >= 400)?1:0;
            curl_close($ch);

            if (is_string($output)) {
                $contents = $output;
            }
    } else {
        $timing_out = 1;
    }
    @session_start();
    $_SESSION['timing_out'] = $timing_out;
    return $contents;
}

function php_version()
{
    $v = explode('.',PHP_VERSION);

    return array(
           'major'      =>  $v[0],
           'minor'      =>  $v[1],
           'release'    =>  $v[2]);
}

function php_version_maj_min()
{
    $vprts = php_version();
    return ($vprts['major'] . '.' . $vprts['minor']);
}

function is_supported_php_version()
{
    $v = php_version(); 

    return ((($v['major'] == 4) && ($v['minor'] >= 1)) ||
      (($v['major'] == 5) && (($v['minor'] >= 1) || ($v['release'] >= 3))) ||
	  $v['major'] == 7 || ($v['major'] == 8 && $v['minor'] >= 1));
}

function is_php_version_or_greater($major,$minor,$release = 0)
{
    $version = php_version();
    return ($version['major'] > $major || 
            ($version['major'] == $major && $version['minor'] > $minor) ||
            ($version['major'] == $major && $version['minor'] == $minor && $version['release'] >= $release));
}

function ini_file_name()
{
    $sysinfo = get_sysinfo();
    return (!empty($sysinfo['PHP_INI'])?$sysinfo['PHP_INI_BASENAME']:'php.ini');
}

function get_remote_session_value($session_var,$remote_url,$default_function)
{
    if (!isset($_SESSION[$session_var])) {
        $serialised_res = remote_file_contents($remote_url);
        $unserialised_res = @unserialize($serialised_res);
        if (empty($unserialised_res)) {
            $unserialised_res = call_user_func($default_function);
        } else {
			$_SESSION['remote_access_successful'] = 1;
		}
        if (false === $unserialised_res) {
            $unserialised_res = '';
        }
        $_SESSION[$session_var] = $unserialised_res;
    }
    return $_SESSION[$session_var];
}

function get_file_contents($file)
{
    if (empty($file)) {
        return "";
    }
    if (function_exists('file_get_contents')) {
        $strs = @file_get_contents($file);
    } else {
        $lines = @file($file);
        $strs = join(' ',$lines);
    }
    return $strs;
}

function default_platform_list()
{
    $platforms = array();


    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC6', 'is_legacy' => 1,       'os_mod' => '_vc6',     'arch'=>'x86',  'dirname'=>'win32', 'us1-dir'=>'windows_vc6/x86' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC6 (Non-TS)',   'is_legacy' => 1,  'os_mod' => '_nonts_vc6',   'arch'=>'x86',  'dirname'=>'win32-nonts', 'us1-dir'=>'windows_vc6/x86-nonts' );

    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC9',        'os_mod' => '_vc9',     'arch'=>'x86',  'dirname'=>'win32_vc9', 'us1-dir'=>'windows_vc9/x86' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC9 (Non-TS)',   'os_mod' => '_nonts_vc9',   'arch'=>'x86',  'dirname'=>'win32-nonts_vc9', 'us1-dir'=>'windows_vc9/x86-nonts' );
	
	 $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC11',        'os_mod' => '_vc11',     'arch'=>'x86',  'dirname'=>'win32_vc11', 'us1-dir'=>'windows_vc11/x86' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC11 (Non-TS)',   'os_mod' => '_nonts_vc11',   'arch'=>'x86',  'dirname'=>'win32-nonts_vc11', 'us1-dir'=>'windows_vc11/x86-nonts' );
	
	$platforms[] = array('os'=>'win', 'os_human'=>'Windows VC11',        'os_mod' => '_vc11',     'arch'=>'x86-64',  'dirname'=>'win64_vc11', 'us1-dir'=>'windows_vc11/amd64' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC11 (Non-TS)',   'os_mod' => '_nonts_vc11',   'arch'=>'x86-64',  'dirname'=>'win64-nonts_vc11', 'us1-dir'=>'windows_vc11/amd64-nonts' );
	
	 $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC14',        'os_mod' => '_vc14',     'arch'=>'x86',  'dirname'=>'win32_vc14', 'us1-dir'=>'windows_vc14/x86' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC14 (Non-TS)',   'os_mod' => '_nonts_vc14',   'arch'=>'x86',  'dirname'=>'win32-nonts_vc14', 'us1-dir'=>'windows_vc14/x86-nonts' );
	
		$platforms[] = array('os'=>'win', 'os_human'=>'Windows VC14',        'os_mod' => '_vc14',     'arch'=>'x86-64',  'dirname'=>'win64_vc14', 'us1-dir'=>'windows_vc14/amd64' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC14 (Non-TS)',   'os_mod' => '_nonts_vc14',   'arch'=>'x86-64',  'dirname'=>'win64-nonts_vc14', 'us1-dir'=>'windows_vc14/amd64-nonts' );
	
		 $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC15',        'os_mod' => '_vc15',     'arch'=>'x86',  'dirname'=>'win32_vc15', 'us1-dir'=>'windows_vc15/x86' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC15 (Non-TS)',   'os_mod' => '_nonts_vc15',   'arch'=>'x86',  'dirname'=>'win32-nonts_vc15', 'us1-dir'=>'windows_vc15/x86-nonts' );
	
		$platforms[] = array('os'=>'win', 'os_human'=>'Windows VC15',        'os_mod' => '_vc15',     'arch'=>'x86-64',  'dirname'=>'win64_vc15', 'us1-dir'=>'windows_vc15/amd64' );
    $platforms[] = array('os'=>'win', 'os_human'=>'Windows VC15 (Non-TS)',   'os_mod' => '_nonts_vc15',   'arch'=>'x86-64',  'dirname'=>'win64-nonts_vc15', 'us1-dir'=>'windows_vc15/amd64-nonts' );

    $platforms[] = array('os'=>'lin', 'os_human'=>'Linux',              'arch'=>'x86',      'dirname'=>'linux_i686-glibc2.3.4', 'us1-dir'=>'linux/x86');
    $platforms[] = array('os'=>'lin', 'os_human'=>'Linux',              'arch'=>'x86-64',   'dirname'=>'linux_x86_64-glibc2.3.4', 'us1-dir'=>'linux/x86_64');
$platforms[] = array('os'=>'lin','os_human'=>'Linux',               'arch'=>'ppc',      'dirname'=>'linux_ppc-glibc2.3.4','us1-dir'=>'linux/ppc');
            $platforms[] = array('os'=>'lin','os_human'=>'Linux',               'arch'=>'ppc64',    'dirname'=>'linux_ppc64-glibc2.5','us1-dir'=>'linux/ppc64');
    

$platforms[] = array('os'=>'dra', 'os_human'=>'DragonFly', 'arch'=>'x86',      'dirname'=>'dragonfly_i386-1.7', 'us1-dir'=>'Dragonfly/x86');

$platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 4', 'os_mod'=>'_4',  'arch'=>'x86',      'dirname'=>'freebsd_i386-4.8', 'us1-dir'=>'FreeBSD/v4');

    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 6', 'os_mod'=>'_6',  'arch'=>'x86',      'dirname'=>'freebsd_i386-6.2', 'us1-dir'=>'FreeBSD/v6/x86');

    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 6', 'os_mod'=>'_6',  'arch'=>'x86-64',   'dirname'=>'freebsd_amd64-6.2', 'us1-dir'=>'FreeBSD/v6/AMD64');


    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 7', 'os_mod'=>'_7',  'arch'=>'x86',      'dirname'=>'freebsd_i386-7.3', 'us1-dir'=>'FreeBSD/v7/x86');
    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 7', 'os_mod'=>'_7',  'arch'=>'x86-64',   'dirname'=>'freebsd_amd64-7.3', 'us1-dir'=>'FreeBSD/v7/AMD64');


    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 8', 'os_mod'=>'_8',  'arch'=>'x86',      'dirname'=>'freebsd_i386-8.0', 'us1-dir'=>'FreeBSD/v8/x86');
    $platforms[] = array('os'=>'fre', 'os_human'=>'FreeBSD 8', 'os_mod'=>'_8',  'arch'=>'x86-64',   'dirname'=>'freebsd_amd64-8.0', 'us1-dir'=>'FreeBSD/v8/AMD64');
    
    $platforms[] = array('os'=>'bsd', 'os_human'=>'BSDi',     'is_legacy' => 1,           'arch'=>'x86',      'dirname'=>'bsdi_i386-4.3.1');
    $platforms[] = array('os'=>'net', 'os_human'=>'NetBSD',             'arch'=>'x86',      'dirname'=>'netbsd_i386-2.1','us1-dir'=>'NetBSD/x86');
    $platforms[] = array('os'=>'net', 'os_human'=>'NetBSD',             'arch'=>'x86-64',   'dirname'=>'netbsd_amd64-2.0','us1-dir'=>'NetBSD/x86_64');
    $platforms[] = array('os'=>'ope', 'os_human'=>'OpenBSD 4.2', 'os_mod'=>'_4.2',  'arch'=>'x86',  'dirname'=>'openbsd_i386-4.2', 'us1-dir'=>'OpenBSD/x86');

    $platforms[] = array('os'=>'ope', 'os_human'=>'OpenBSD 4.5', 'os_mod'=>'_4.5',  'arch'=>'x86',  'dirname'=>'openbsd_i386-4.5', 'us1-dir'=>'OpenBSD/x86');
    $platforms[] = array('os'=>'ope', 'os_human'=>'OpenBSD 4.6', 'os_mod'=>'_4.6',  'arch'=>'x86',  'dirname'=>'openbsd_i386-4.6', 'us1-dir'=>'OpenBSD/x86');

    $platforms[] = array('os'=>'ope', 'os_human'=>'OpenBSD 4.7', 'os_mod'=>'_4.7',  'arch'=>'x86-64', 'dirname'=>'openbsd_amd64-4.7', 'us1-dir' => 'OpenBSD/x86_64');

    $platforms[] = array('os'=>'dar', 'os_human'=>'OS X',    'is_legacy' => 1, 'arch'=>'ppc',      'dirname'=>'osx_powerpc-8.5','us1-dir'=>'OSX/ppc');

    $platforms[] = array('os'=>'dar', 'os_human'=>'OS X',               'arch'=>'x86',      'dirname'=>'osx_i386-8.11','us1-dir'=>'OSX/x86');

    $platforms[] = array('os'=>'dar', 'os_human'=>'OS X',               'arch'=>'x86-64',       'dirname'=>'osx_x86-64-10.2','us1-dir'=>'OSX/x86_64');

    $platforms[] = array('os'=>'sun', 'os_human'=>'Solaris',  'is_legacy' => 1,          'arch'=>'sparc',    'dirname'=>'solaris_sparc-5.9', 'us1-dir'=>'Solaris/sparc');

    $platforms[] = array('os'=>'sun', 'os_human'=>'Solaris',            'arch'=>'x86',      'dirname'=>'solaris_i386-5.10','us1-dir'=>'Solaris/x86');

    return $platforms;
}

function get_loader_platforms()
{
    return get_remote_session_value('loader_platform_info',LOADER_PLATFORM_URL,'default_platform_list');
}

function get_platforminfo()
{
    static $platforminfo;

    if (empty($platforminfo)) {
        $platforminfo = get_loader_platforms();
    }
    return $platforminfo;
}

function default_php_versions()
{
	return array();
}

function get_php_versions()
{
	return get_remote_session_value('php_version_info',LOADER_PHP_VERSION_URL,'default_php_versions');
}


function get_max_php_version_supported()
{
	static $max_php_version;
	
	if (empty($max_php_version)) {
		$php_versions = get_php_versions();
		
		$dirname = calc_dirname();
		
		if (array_key_exists($dirname,$php_versions)) {
			$max_php_version = $php_versions[$dirname];
		} else {
			$max_php_version = NULL;
		}
	}
	
	return $max_php_version;
}

function is_after_max_php_version_supported()
{
	$is_too_recent_php = false;
	
	$supported_php_version = get_max_php_version_supported();
	
	if (!is_null($supported_php_version)) {
		$pversion = php_version();
		
		$supported_parts = explode('.',$supported_php_version);
		$is_too_recent_php = ($supported_parts[0] < $pversion['major'] || ($supported_parts[0] == $pversion['major'] && $supported_parts[1] < $pversion['minor']));
	}
	
	if ($is_too_recent_php) {
		return $supported_php_version;
	} else {
		return false;
	}
}

function supported_os_variants($os_code,$arch_code)
{
    if (empty($os_code)) {
        return ERROR_UNKNOWN_OS;
    }
    if (empty($arch_code)) {
        return ERROR_UNKNOWN_ARCH;
    }

    $os_found = false;
    $arch_found = false;
    $os_arch_matches = array();
    $pinfo = get_platforminfo();

    foreach ($pinfo as $p) {
        if ($p['os'] == $os_code && $p['arch'] == $arch_code) {
            $os_arch_matches[$p['os_human']] = (isset($p['os_mod']))?(0 + (int) str_replace('_','',$p['os_mod'])):'';
        } 
        if ($p['os'] == $os_code) {
            $os_found = true;
        } elseif ($p['arch'] == $arch_code) {
            $arch_found = true;
        }
    }
    if (!empty($os_arch_matches)) {
        asort($os_arch_matches);
        return $os_arch_matches;
    } elseif (!$os_found) {
        return ERROR_UNSUPPORTED_OS;
    } elseif (!$arch_found) {
        return ERROR_UNSUPPORTED_ARCH;
    } else {
        return ERROR_UNSUPPORTED_ARCH_OS;
    }
}

function default_win_compilers()
{
    return array('VC6','VC9','VC11','VC14','VC15', 'VC16');
}

function supported_win_compilers()
{
    static $win_compilers;

    if (empty($win_compilers)) {
        $win_compilers = find_win_compilers();
    }
    return $win_compilers;
}

function find_win_compilers()
{
    return get_remote_session_value('php_compilers_info',PHP_COMPILERS_URL,'default_win_compilers');
}

function server_software_info()
{
    $ss = array('full' => '','short' => '');
    $ss['full'] = $_SERVER['SERVER_SOFTWARE'];

    if (preg_match('/apache/i', $ss['full'])) {
        $ss['short'] = 'Apache';
    } else if (preg_match('/IIS/',$ss['full'])) {
        $ss['short'] = 'IIS';
    } else {
        $ss['short'] = '';
    }
    return $ss;
}

function match_arch_pattern($str)
{
    $arch = null;
    $arch_patterns = array(
             'i.?86'        => 'x86',
             'x86[-_]64'    => 'x86',
             'x86'          => 'x86',
             'amd64'        => 'x86',
             'SMP Tue Jan 01 00:00:00 CEST 2000 all GNU\/Linux' => 'x86',
             'ppc64'        => 'ppc',
             'ppc'          => 'ppc',
             'powerpc'      => 'ppc',
             'sparc'        => 'sparc',
             'sun'          => 'sparc',
			 'armv7l'       => 'armv7l',
             'aarch64'      => 'aarch64'
         );

    foreach ($arch_patterns as $token => $a) {
        if (preg_match("/$token/i", $str)) {
          $arch = $a;
          break;
        }
    }
    return $arch;
}

function required_loader_arch($mach_info,$os_code,$wordsize)
{
    if ($os_code == 'win') {
        $arch = ($wordsize == 32)?'x86':'x86-64';
    } elseif (!empty($os_code)) {
        $arch = match_arch_pattern($mach_info);
        if ($wordsize == 64) {
            if ($arch == 'x86') {
                $arch = 'x86-64';
            } elseif ($arch == 'ppc') {
                $arch = 'ppc64';
            }
        }
    } else {
        $arch = ERROR_UNKNOWN_ARCH;
    }
    return $arch;
}

function uname($part = 'a')
{
    $result = '';
    if (!function_is_disabled('php_uname')) {
        $result = @php_uname($part);
    } elseif (function_exists('posix_uname') && !function_is_disabled('posix_uname')) {
        $posix_equivs = array(
                     'm' => 'machine',
                     'n' => 'nodename',
                     'r' => 'release',
                     's' => 'sysname'
                 );
        $puname = @posix_uname();
        if ($part == 'a' || !array_key_exists($part,$posix_equivs)) {
           $result = join(' ',$puname);
        } else {
           $result = $puname[$posix_equivs[$part]];
        }
    } else {
        if (!function_is_disabled('phpinfo')) {
            ob_start();
            phpinfo(INFO_GENERAL);
            $pinfo = ob_get_contents();
            ob_end_clean();
            if (preg_match('~System.*?(</B></td><TD ALIGN="left">| => |v">)([^<]*)~i',$pinfo,$match)) {
                $uname = $match[2];
                if ($part == 'r') {
                    if (!empty($uname) && preg_match('/\S+\s+\S+\s+([0-9.]+)/',$uname,$matchver)) {
                        $result = $matchver[1];
                    } else {
                        $result = '';
                    }
                } else {
                    $result = $uname;
                }
            }
        } else {
            $result = '';
        }
    }
    return $result;
}

function calc_word_size($os_code)
{
    $wordsize = null;
    if ('win' === $os_code) {
        ob_start();
        phpinfo(INFO_GENERAL);
        $pinfo = ob_get_contents();
        ob_end_clean();
        if (preg_match('~Compiler.*?(</B></td><TD ALIGN="left">| => |v">)([^<]*)~i',$pinfo,$compmatch)) {
            if (preg_match("/(VC[0-9]+)/i",$compmatch[2],$vcmatch)) {
                $compiler = strtoupper($vcmatch[1]);
            } elseif (stripos(trim($compmatch[2]),"Visual C++ 2019") === 0) {
                $compiler = 'VC16';
            } else {
                $compiler = 'VC6';
            }
        } else {
            $compiler = 'VC6';
        }
        if ($compiler === 'VC9' || $compiler === 'VC11' || $compiler === 'VC14' 
                || $compiler === 'VC15' || $compiler === 'VC16') {
			if (preg_match('~Architecture.*?(</B></td><TD ALIGN="left">| => |v">)([^<]*)~i',$pinfo,$archmatch)) {
				if (preg_match("/x64/i",$archmatch[2])) {
					$wordsize = 64;
				} else {
					$wordsize = 32;
				}
            } elseif (isset($_ENV['PROCESSOR_ARCHITECTURE']) && preg_match('~(amd64|x86-64|x86_64)~i',$_ENV['PROCESSOR_ARCHITECTURE'])) {
                if (preg_match('~Configure Command.*?(</B></td><TD ALIGN="left">| => |v">)([^<]*)~i',$pinfo,$confmatch)) {
                    if (preg_match('~(x64|lib64|system64)~i',$confmatch[2])) {
                        $wordsize = 64;
                    }
                }
            } else {
				$wordsize = 32;
			}
        }
    }
    if (empty($wordsize)) {
        $wordsize = ((-1^0xffffffff)?64:32);
    }
    return $wordsize;
}

function required_loader($unamestr = '')
{
    $un = empty($unamestr)?uname():$unamestr;

    $php_major_version = substr(PHP_VERSION,0,3);

    $os_name = substr($un,0,strpos($un,' '));
    $os_code = empty($os_name)?'':strtolower(substr($os_name,0,3));

    $wordsize = calc_word_size($os_code);

	if ($os_code == 'win' && $wordsize == 64 && $php_major_version < '5.5') {
        $arch = ERROR_WINDOWS_64_BIT;
	} else {
		$arch = required_loader_arch($un,$os_code,$wordsize);
	}
    if (!is_string($arch)) {
        return $arch;
    }
    $os_variants = supported_os_variants($os_code,$arch);
    if (!is_array($os_variants)) {
        return $os_variants;
    }

    $os_ver = '';
    if (preg_match('/([0-9.]+)/',uname('r'),$match)) {
        $os_ver = $match[1];
    }
    $os_ver_parts = preg_split('@\.@',$os_ver);

    $os_code_h = ($os_code == 'dar' ? 'mac' : $os_code);

    $loader_sfix = (($os_code == 'win') ? 'dll' : 'so');
    $file = "ioncube_loader_{$os_code_h}_{$php_major_version}.{$loader_sfix}";

    if ($os_code == 'win') {
        $os_name = 'Windows';
        $file_ts = $file;
        $os_name_qual = 'Windows';
    } else {
        $os_names = array_keys($os_variants);
        if (count($os_variants) > 1) {
            $parts = explode(" ",$os_names[0]); 
            $os_name = $parts[0];
            $os_name_qual = $os_name . ' ' . $os_ver_parts[0] . '.' . $os_ver_parts[1];
        } else {
            $os_name = $os_names[0];
            $os_name_qual = $os_name;
        }
        $file_ts = "ioncube_loader_{$os_code_h}_{$php_major_version}_ts.{$loader_sfix}";
    }

    return array(
           'uname'      =>  $un,
           'arch'       =>  $arch,
           'oscode'     =>  $os_code,
           'oscode_h'   =>  $os_code_h,
           'osname'     =>  $os_name,
           'osnamequal' =>  $os_name_qual,
           'osvariants' =>  $os_variants,
           'osver'      =>  $os_ver,
           'osver2'     =>  $os_ver_parts,
           'file'       =>  $file,
           'file_ts'    =>  $file_ts,
           'wordsize'   =>  $wordsize
       );
}

function ic_system_info()
{
    $thread_safe = null;
    $debug_build = null;
    $cgi_cli = false;
	$is_fpm = false;
    $is_cgi = false;
    $is_cli = false;
    $php_ini_path = '';
    $php_ini_dir = '';
    $php_ini_add = '';
    $is_supported_compiler = true;
    $php_compiler = is_ms_windows()?'VC6':'';

    ob_start();
    phpinfo(INFO_GENERAL);
    $php_info = ob_get_contents();
    ob_end_clean();

    $breaker = (php_sapi_name() == 'cli')?"\n":'</tr>';
    $lines = explode($breaker,$php_info);
    foreach ($lines as $line) {
        if (preg_match('/command/i',$line)) {
          continue;
        }

        if (preg_match('/thread safety/i', $line)) {
          $thread_safe = (preg_match('/(enabled|yes)/i', $line) != 0);
        }

        if (preg_match('/debug build/i', $line)) {
          $debug_build = (preg_match('/(enabled|yes)/i', $line) != 0);
        }

        if (preg_match('~configuration file.*(</B></td><TD ALIGN="left">| => |v">)([^ <]*)~i',$line,$match)) {
          $php_ini_path = $match[2];

          if (!@file_exists($php_ini_path)) {
                $php_ini_path = '';
          }
        }
        if (preg_match('~dir for additional \.ini files.*(</B></td><TD ALIGN="left">| => |v">)([^ <]*)~i',$line,$match)) {
            $php_ini_dir = $match[2];
            if (!@file_exists($php_ini_dir)) {
                $php_ini_dir = '';
            }
        }
        if (preg_match('~additional \.ini files parsed.*(</B></td><TD ALIGN="left">| => |v">)([^ <]*)~i',$line,$match)) {
            $php_ini_add = $match[2];
        }
        if (preg_match('/compiler/i',$line)) {
            $supported_match = join('|',supported_win_compilers());
            $is_supported_compiler = preg_match("/($supported_match)/i",$line);
            if (preg_match("/(VC[0-9]+)/i",$line,$match)) {
                $php_compiler = strtoupper($match[1]);
            } elseif (preg_match("/Visual C\+\+ 2017/i",$line)) {
				$php_compiler = "VC15";
				$is_supported_compiler = true;
            } elseif (preg_match("/Visual C\+\+ 2019/i",$line)) {
				$php_compiler = "VC16";
				$is_supported_compiler = true;
			} else {
                $php_compiler = '';
            }
        }
    }
    $is_cgi = strpos(php_sapi_name(),'cgi') !== false;
    $is_cli = strpos(php_sapi_name(),'cli') !== false;
	$is_fpm = strpos(php_sapi_name(),'fpm-fcgi') !== false;
    $cgi_cli = $is_cgi || $is_cli;

    $ss = server_software_info();
	
	if ($is_fpm) {
		$ss['short'] = 'PHP-FPM';
		$ss['full'] = 'PHP-FPM ' . $ss['full'];
	}

    if (!$php_ini_path && function_exists('php_ini_loaded_file')) {
        $php_ini_path = php_ini_loaded_file();
        if ($php_ini_path === false) {
            $php_ini_path = '';
        }
    }
    if (!empty($php_ini_path)) {
        $real_path = @realpath($php_ini_path);
        if (false !== $real_path) {
            $php_ini_path = $real_path;
        }
    }

    $php_ini_basename = basename($php_ini_path);

    return array(
           'THREAD_SAFE'        => $thread_safe,
           'DEBUG_BUILD'        => $debug_build,
           'PHP_INI'            => $php_ini_path,
           'PHP_INI_BASENAME'   => $php_ini_basename,
           'PHP_INI_DIR'        => $php_ini_dir,
           'PHP_INI_ADDITIONAL' => $php_ini_add,
           'PHPRC'              => getenv('PHPRC'),
           'CGI_CLI'            => $cgi_cli,
           'IS_CGI'             => $is_cgi,
           'IS_CLI'             => $is_cli,
		   'IS_FPM'				=> $is_fpm,
           'PHP_COMPILER'       => $php_compiler,
           'SUPPORTED_COMPILER' => $is_supported_compiler,
           'FULL_SS'            => $ss['full'],
           'SS'                 => $ss['short']);
}

function is_possibly_dedicated_or_local()
{
    $sys = get_sysinfo();

    return (empty($sys['PHP_INI']) || !@file_exists($sys['PHP_INI']) || (is_readable($sys['PHP_INI']) && (0 !== strpos($sys['PHP_INI'],$_SERVER['DOCUMENT_ROOT']))));
}

function is_local()
{
    $ret = false;
    if ($_SERVER["SERVER_NAME"] == 'localhost') {
        $ret = true;
    } else {
        $ip_address = strtolower($_SERVER["REMOTE_ADDR"]);
        if (strpos(':',$ip_address) === false) {
            $ip_parts = explode('.',$ip_address);
            $ret = (($ip_parts[0] == 10) || 
                    ($ip_parts[0] == 172 && $ip_parts[1] >= 16 &&  $ip_parts[1] <= 31) ||
                    ($ip_parts[0] == 192 && $ip_parts[1] == 168));
        } else {
            $ret = ($ip_address == '::1') || (($ip_address[0] == 'f') && ($ip_address[1] >= 'c' && $ip_address[1] <= 'f'));
        }
    }
    return $ret;
}

function is_shared()
{
    return !is_local() && !is_possibly_dedicated_or_local();
}

function find_server_type($chosen_type = '',$type_must_be_chosen = false,$set_session = false)
{
    $server_type = SERVER_UNKNOWN;
    if (empty($chosen_type)) {
        if ($type_must_be_chosen) {
            $server_type = SERVER_UNKNOWN;
        } else {
            if (isset($_SESSION['server_type']) && $_SESSION['server_type'] != SERVER_UNKNOWN) {
                $server_type = $_SESSION['server_type'];
            } elseif (is_local()) {
                $server_type = SERVER_LOCAL;
            } elseif (!is_possibly_dedicated_or_local()) {
                $server_type = SERVER_SHARED;
            } else {
                $server_type = SERVER_UNKNOWN;
            } 
        }
    } else {
        switch ($chosen_type)  {
            case 's':
                $server_type = SERVER_SHARED;
                break;
            case 'd':
                $server_type = SERVER_DEDICATED;
                break;
            case 'l':
                $server_type = SERVER_LOCAL;
                break;
            default:
                $server_type = SERVER_UNKNOWN;
                break;
        }
    }
    if ($set_session) {
        $_SESSION['server_type'] = $server_type;
    }
    return $server_type;
}

function server_type_string()
{
    $server_code = find_server_type();
    switch ($server_code) {
        case SERVER_SHARED:
            $server_string = 'SHARED';
            break;
        case SERVER_LOCAL:
            $server_string = 'LOCAL';
            break;
        case SERVER_DEDICATED:
            $server_string = 'DEDICATED';
            break;
        default:
            $server_string = 'UNKNOWN';
            break;
    }
    return $server_string;
}

function server_type_code()
{
    $server_code = find_server_type();
    switch ($server_code) {
        case SERVER_SHARED:
            $server_char = 's';
            break;
        case SERVER_LOCAL:
            $server_char = 'l';
            break;
        case SERVER_DEDICATED:
            $server_char = 'd';
            break;
        default:
            $server_char = '';
            break;
    }
    return $server_char;
}

function get_sysinfo()
{
    static $sysinfo;

    if (empty($sysinfo)) {
        $sysinfo = ic_system_info();
    }
    return $sysinfo;
}

function get_loaderinfo()
{
    static $loader;

    if (empty($loader)) {
        $loader = required_loader();
    }
    return $loader;
}

function is_ms_windows()
{
    $loader_info = get_loaderinfo();
    return ($loader_info['oscode'] == 'win');
}

function function_is_disabled($fn_name)
{
    $disabled_functions=explode(',',ini_get('disable_functions'));
    return in_array($fn_name, $disabled_functions);
}

function selinux_is_enabled()
{
    $se_enabled = false;

    if (!is_ms_windows()) {
        $cmd = (string) @shell_exec('sestatus');
        $se_enabled = preg_match('/enabled/i',$cmd);
    }

    return $se_enabled;
}

function grsecurity_is_enabled()
{
    $gr_enabled = false;

    if (!is_ms_windows()) {
        $cmd = (string) @shell_exec('gradm -S');
        $gr_enabled = preg_match('/enabled/i',$cmd);
    }

    return $gr_enabled;
}

function threaded_and_not_cgi()
{
    $sys = get_sysinfo();
    return($sys['THREAD_SAFE'] && !$sys['IS_CGI']);
}

function is_restricted_server($only_safe_mode = false)
{
    $disable_functions = ini_get('disable_functions');
    $open_basedir = ini_get('open_basedir');
    $php_restrictions = !empty($disable_functions) || !empty($open_basedir);
    $system_restrictions = selinux_is_enabled() || grsecurity_is_enabled();
    $non_safe_mode_restrictions = $php_restrictions || $system_restrictions;
    return (ini_get('safe_mode') || (!$only_safe_mode && $non_safe_mode_restrictions));
}

function server_restriction_warnings()
{
    $warnings = array();

    if (find_server_type() == SERVER_SHARED) {
        if (is_restricted_server()) {
            $warnings[] = "Server restrictions are in place which might affect the operation of this Loader Wizard or prevent the installation of the Loader.";
        }
    } else {
        $warning_suffix = "This may affect the operation of this Loader Wizard.";
        if (ini_get('safe_mode')) {
            $warnings[] = "Safe mode is in effect on the server. " . $warning_suffix;
        } 
        $disabled_functions = ini_get('disable_functions');
        if (!empty($disabled_functions)) {
            $warnings[] = "Some functions are disabled through disable_functions. " . $warning_suffix;
        }
        $open_basedir = ini_get('open_basedir');
        if (!empty($open_basedir)) {
            $warnings[] = "Open basedir restrictions are in effect. " . $warning_suffix;
        }
    }
    return $warnings;
}

function own_php_ini_possible($only_safe_mode = false)
{
    $sysinfo = get_sysinfo();
    return ($sysinfo['CGI_CLI'] && !is_ms_windows() && !is_restricted_server($only_safe_mode));
}

function extension_dir()
{
    $extdir = ini_get('extension_dir');
    if ($extdir == './' || ($extdir == '.\\' && is_ms_windows())) {
        $extdir = '.';
    }
    return $extdir;
}

function possibly_selinux()
{
    $loaderinfo = get_loaderinfo();
    $se_env = (getenv("SELINUX_INIT"));
    return (strtolower($loaderinfo['osname']) == 'linux' && $se_env && ($se_env == 'Yes' || $se_env == '1'));
}

function ini_same_dir_as_wizard()
{
    $sys = get_sysinfo();
    return dirname($sys['PHP_INI']) == dirname(__FILE__); 
}

function extension_dir_path()
{
    $ext_dir = extension_dir();
    if ($ext_dir == '.' || (dirname($ext_dir) == '.')) {
        $ext_dir_path = @realpath($ext_dir);
    } else {
        $ext_dir_path = $ext_dir;
    }
    return $ext_dir_path;
}

function get_loader_name()
{
    $u = uname();
    $sys = get_sysinfo();
    $os = substr($u,0,strpos($u,' '));
    $os_code = strtolower(substr($u,0,3));

    $os_code_h = ($os_code == 'dar' ? 'mac' : $os_code);

    $php_version = phpversion();
    $php_family = substr($php_version,0,3);

    $loader_sfix = (($os_code == 'win') ? '.dll' : (($sys['THREAD_SAFE'])?'_ts.so':'.so'));
    $loader_name="ioncube_loader_{$os_code_h}_{$php_family}{$loader_sfix}";

    return $loader_name;
}

function get_reqd_version($variants)
{
    $exact_match = false;
    $nearest_version = 0;
    $loader_info = get_loaderinfo();
    $os_version = $loader_info['osver2'][0] . '.' . $loader_info['osver2'][1];
    $os_version_major = $loader_info['osver2'][0];
    foreach ($variants as $v) {
        if ($v == $os_version || (is_int($v) && $v == $os_version_major)) {
            $exact_match = true;
            $nearest_version = $v;
            break;
        } elseif ($v > $os_version) {
            break;
        } else {
            $nearest_version = $v;
        }
    }
    return (array($nearest_version,$exact_match));
}

function get_default_loader_dir_webspace()
{
    return ($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . LOADER_SUBDIR);
}

function get_loader_location($loader_dir = '')
{
    if (empty($loader_dir)) {
        $loader_dir = get_default_loader_dir_webspace();
    }
    $loader_name = get_loader_name(); 
    return ($loader_dir . DIRECTORY_SEPARATOR . $loader_name);
}

function get_loader_location_from_ini($php_ini = '')
{
    $errors = array();
    if (empty($php_ini)) {
        $sysinfo = get_sysinfo();
        $php_ini = $sysinfo['PHP_INI'];
    }
    if (!@file_exists($php_ini)) {
        if (empty($php_ini)) {
            $errors[ERROR_INI_NOT_FOUND] = "The configuration file could not be found.";
        } else {
            $errors[ERROR_INI_NOT_FOUND] = "The $php_ini file could not be found.";
        }
    } elseif (!is_readable($php_ini)) {
        $errors[ERROR_INI_NOT_READABLE] = "The $php_ini file could not be read.";
    }
    if (!empty($errors)) {
        return array('location' => '', 'errors' => $errors);
    } 
    $lines = file($php_ini);
    $ext_start = zend_extension_line_start();
    $wrong_ext_start = ($ext_start == 'zend_extension')?'zend_extension_ts':'zend_extension';
    $loader_path = '';
    $loader_name_match = "ioncube_loader";
    foreach ($lines as $l) {
        if (preg_match("/^\s*$ext_start\s*=\s*\"?([^\"]+)\"?/i",$l,$corr_matches)) {
            if (preg_match("/$loader_name_match/i",$corr_matches[1])) {
                if (!empty($loader_path)) {
                    $errors[ERROR_INI_MULTIPLE_IC_LOADER_LINES] = "It appears that multiple $ext_start lines for the ionCube Loader have been included in the configuration file, $php_ini.";
                }
                $loader_path = $corr_matches[1];
            } else {
                if (empty($loader_path)) {
                    $errors[ERROR_INI_NOT_FIRST_ZE] = "The ionCube Loader must be the first Zend extension listed in the configuration file, $php_ini.";
                }
            }
        }
        if (empty($loader_path)) {
            if (preg_match("/^\s*$wrong_ext_start\s*=\s*\"?([^\"]+)\"?/i",$l,$bad_start_matches)) {
                if (preg_match("/$loader_name_match/i",$bad_start_matches[1])) {
                    $bad_zend_ext_msg = "The line for the ionCube Loader in the configuration file, $php_ini, should start with $ext_start and <b>not</b> $wrong_ext_start.";
                    $errors[ERROR_INI_WRONG_ZE_START] = $bad_zend_ext_msg;
                    $loader_path = $bad_start_matches[1];
                }
            }
        }
    }
    $loader_path = trim($loader_path);
    if ($loader_path === '') {
        $errors[ERROR_INI_ZE_LINE_NOT_FOUND] = "The necessary zend_extension line could not be found in the configuration file, $php_ini.";
    } elseif (!@file_exists($loader_path)) {
        $errors[ERROR_INI_LOADER_FILE_NOT_FOUND] = "The loader file  $loader_path, listed in the configuration file, $php_ini, does not exist or is not accessible.";
    } elseif (basename($loader_path) == $loader_path) {
        $errors[ERROR_INI_NOT_FULL_PATH] = "A full path must be specified for the loader file in the configuration file, $php_ini.";
    }
    return array('location' => $loader_path, 'errors' => $errors);
}

function zend_extension_line_missing($ini_path)
{
    $loader_loc = get_loader_location_from_ini($ini_path);
    return (!empty($loader_loc['errors']) && array_key_exists(ERROR_INI_ZE_LINE_NOT_FOUND,$loader_loc['errors']));
}

function find_additional_ioncube_ini()
{
    $sys = get_sysinfo();
    $ioncube_ini = '';

    if (!empty($sys['PHP_INI_ADDITIONAL']) && !preg_match('/(none)/i',$sys['PHP_INI_ADDITIONAL'])) {
        $ini_files = explode(',',$sys['PHP_INI_ADDITIONAL']);
        foreach ($ini_files as $f) {
            $fn = trim($f);
            $bfn = basename($fn);
            if (preg_match('/ioncube/i',$bfn)) {
                $ioncube_ini = $fn;
                break;
            }
        }
    }
    return $ioncube_ini;
}

function get_additional_ini_files()
{
    $sys = get_sysinfo();
    $ini_files = array();
    if (!empty($sys['PHP_INI_ADDITIONAL']) && !preg_match('/(none)/i',$sys['PHP_INI_ADDITIONAL'])) {
        $ini_files = explode(',',$sys['PHP_INI_ADDITIONAL']);
    }
    return (array_map('trim',$ini_files));
}

function all_ini_contents()
{
    $sys = get_sysinfo();
    $output = '';

    $output .= ";;; *MAIN INI FILE AT {$sys['PHP_INI']}* ;;;" . PHP_EOL;
    $output .= get_file_contents($sys['PHP_INI']);
    $other_inis = get_additional_ini_files();
    foreach ($other_inis as $inif) {
        $output .= ";;; *Additional ini file at $inif* ;;;" . PHP_EOL;
        $output .= get_file_contents($inif);
    }
    $here = unix_path_dir();
    $unrec_ini_files = unrecognised_inis_webspace($here);
    foreach ($unrec_ini_files as $urinif) {
        $output .= ";;; *UNRECOGNISED INI FILE at $urinif* ;;;" . PHP_EOL;
        $output .= get_file_contents($urinif);
    }
    return $output;
}

function scan_inis_for_loader()
{
    $ldloc = array('location' => '', 'errors' => array());
    $sysinfo = get_sysinfo();
    if (empty($sysinfo['PHP_INI'])) {
        $ini_files_not_found = array("Main ini file");
        $ini_file_list = get_additional_ini_files();
    } else {
        $ini_files_not_found = array();
        $ini_file_list = array_merge(array($sysinfo['PHP_INI']),get_additional_ini_files());
    }
    $server_type = find_server_type();
    $shared_server = SERVER_SHARED == $server_type;
    foreach ($ini_file_list as $f) {
        $ldloc = get_loader_location_from_ini($f);
        if (array_key_exists(ERROR_INI_ZE_LINE_NOT_FOUND,$ldloc['errors'])) {
            unset($ldloc['errors'][ERROR_INI_ZE_LINE_NOT_FOUND]);
        } 
        if ($shared_server && array_key_exists(ERROR_INI_NOT_FOUND,$ldloc['errors'])) {
            if (false == user_ini_space_path($f)) {
                $ldloc['errors'][ERROR_INI_NOT_FOUND] = "A system ini file cannot be found or read by the Wizard - you cannot do anything about this on your shared server.";
            } else {
                $ldloc['errors'][ERROR_INI_USER_INI_NOT_FOUND] = $ldloc['errors'][ERROR_INI_NOT_FOUND];
            }
        } elseif (array_key_exists(ERROR_INI_NOT_FOUND,$ldloc['errors'])) {
            $ini_files_not_found[] = $f;
        }
        if (!empty($ldloc['location'])) {
            break;
        }
    }
    if (!empty($ini_files_not_found)) {
        $plural = (count($ini_files_not_found) > 1)?"s":"";
        $ldloc['errors'][ERROR_INI_NOT_FOUND] = "The following ini file$plural could not be found by the Wizard: " . join(',',$ini_files_not_found);
        if (is_restricted_server()) {
            $ldloc['errors'][ERROR_INI_NOT_FOUND] .= "<br> This may be due to server restrictions in place.";
        }
    }
    if (empty($ldloc['location'])) {
        $ldloc['errors'][ERROR_INI_ZE_LINE_NOT_FOUND] = "The necessary zend_extension line could not be found in the configuration.";
    }
    return $ldloc;
}

function find_loader_filesystem()
{
    $ld_inst_dir = loader_install_dir(find_server_type());
    $loader_name = get_loader_name();
    $suggested_loader_path = $ld_inst_dir . DIRECTORY_SEPARATOR . $loader_name;
    if (@file_exists($suggested_loader_path)) {
        $location = $suggested_loader_path;
    } elseif (@file_exists($loader_name)) {
        $location = @realpath($loader_name);
    } else {
        $ld_loc = get_loader_location();
        if (@file_exists($ld_loc)) {
            $location = $ld_loc;
        } else {
            $location = '';
        }
    }
    return $location;
}

function find_loader($search_directories_if_not_ini = false)
{
    $sysinfo = get_sysinfo();
    $php_ini = $sysinfo['PHP_INI'];
    $rtl_path = get_runtime_loading_path_if_applicable();
    $location = '';
    $errors = array();

    if (!empty($rtl_path)) {
        $location = $rtl_path;
    } else {
        $loader_ini = scan_inis_for_loader();
        $location = $loader_ini['location'];
        $errors = $loader_ini['errors'];
    }
    if (empty($location) && (empty($errors) || $search_directories_if_not_ini)) {
        $errors = array(); 
        $location = find_loader_filesystem();
        if (empty($location)) {
            $errors[ERROR_LOADER_NOT_FOUND] = 'The loader file could not be found in standard locations.';
        }
    }
    if (!empty($errors)) {
        return $errors;
    } else {
        return $location;
    }
}

function zend_extension_line_start()
{
    $sysinfo = get_sysinfo();
    $is_53_or_later = is_php_version_or_greater(5,3);
    return (is_bool($sysinfo['THREAD_SAFE']) && $sysinfo['THREAD_SAFE'] && !$is_53_or_later ? 'zend_extension_ts' : 'zend_extension');
}

function ioncube_loader_version_information()
{
    $old_version = true;
    $liv = "";
    $lv = "";
    $mv = 0;
    if (function_exists('ioncube_loader_iversion')) {
        $liv = ioncube_loader_iversion();
        $lv = sprintf("%d.%d.%d", $liv / 10000, ($liv / 100) % 100, $liv % 100);

        $latest_version =  get_latestversion();

        $lat_parts = explode('.',$latest_version);
        $cur_parts = explode('.',$lv);

        if (($cur_parts[0] > $lat_parts[0]) || 
            ($cur_parts[0] == $lat_parts[0] && $cur_parts[1] > $lat_parts[1]) ||
             ($cur_parts[0] == $lat_parts[0] && $cur_parts[1] == $lat_parts[1] && $cur_parts[2] >= $lat_parts[2])) {
            $old_version = false;
        } else {
            $old_version = $latest_version;
        }
        $mv = $cur_parts[0];
    }
    return array($lv,$mv,$old_version);
}

function default_loader_version_info()
{
    return array();
}

function get_loader_version_info()
{
    return get_remote_session_value('loader_version_info',LOADER_LATEST_VERSIONS_URL,'default_loader_version_info');
}

function calc_platform()
{
    $platform = array();
    $platform_info = get_platforminfo();
    $loader = get_loaderinfo();
    $multiple_os_versions = false;
    if (is_array($loader) && array_key_exists('osvariants',$loader) && is_array($loader['osvariants'])) {
        $versions = array_values($loader['osvariants']);
        $multiple_os_versions = !empty($versions[0]);
    }
    if ($multiple_os_versions) {
        list($osvar,$exact_match) = get_reqd_version($loader['osvariants']);
    } else {
        $osvar = null;
        if (is_ms_windows()) {
            $sys = get_sysinfo();
            $phpc = (empty($sys['PHP_COMPILER']))?'vc6':strtolower($sys['PHP_COMPILER']); 
            $osvar = ($sys['THREAD_SAFE']?'':'nonts_') . $phpc;
        }
    }
    foreach ($platform_info as $p) {
        if ($p['os'] == $loader['oscode'] && $p['arch'] == $loader['arch'] && (empty($osvar) || $p['os_mod'] == "_" . $osvar)) {
            $platform = $p;
            break;
        }
    }
    return $platform;
}

function get_platform()
{
    static $this_platform;

    if (!isset($this_platform)) {
        $this_platform = calc_platform();
    }

    return $this_platform;
}

function is_legacy_platform()
{
    $platform = get_platform();
    return array_key_exists('is_legacy',$platform);
}

function calc_dirname()
{
    $dirname = '';
    $platform = get_platform();
    if (!empty($platform)) {
        $dirname = $platform['dirname'];
    }
    return $dirname;
}

function calc_loader_latest_version()
{
    $lv_info = get_loader_version_info();
    $latest_version = RECENT_LOADER_VERSION;
    if (!empty($lv_info)) {
        $dirname = calc_dirname();
      
        if (!empty($dirname)) {
            $compiler_specific_version = false;
            if (is_ms_windows()) {
                $sys = get_sysinfo();
                $phpc = strtolower($sys['PHP_COMPILER']);
                if (!empty($phpc)) {
                    $dirname_comp = $dirname . "_" . $phpc;
                    if (array_key_exists($dirname_comp,$lv_info)) {
                        $latest_version = $lv_info[$dirname_comp];
                        $compiler_specific_version = true;
                    }
                }
            }
            if (!$compiler_specific_version && array_key_exists($dirname,$lv_info)) {
                $latest_version = $lv_info[$dirname];
            }
        } 
    }
    return $latest_version;
}

function get_latestversion()
{
    static $latest_version;

    if (empty($latest_version)) {
        $latest_version = calc_loader_latest_version();
    }
    return $latest_version;
}


function runtime_loader_location()
{
    $loader_path = false;
    $ext_path = extension_dir_path();
    if ($ext_path !== false) {
        $id = $ext_path;
        $here = dirname(__FILE__);
        if (isset($id[1]) && $id[1] == ':') {
            $id = str_replace('\\','/',substr($id,2));
            $here = str_replace('\\','/',substr($here,2));
        }
        $rd=str_repeat('/..',substr_count($id,'/')).$here.'/';
        $i=strlen($rd);

        $loader_loc = DIRECTORY_SEPARATOR . basename($here) . DIRECTORY_SEPARATOR . get_loader_name();
        while($i--) {
            if($rd[$i]=='/') {
                $loader_path = runtime_location_exists($ext_path,$rd,$i,$loader_loc);
                if ($loader_path !== false) {
                    break;
                }
            }
        }

        if (!$loader_path && !empty($loader_loc) && @file_exists($loader_loc)) {
            $loader_path = basename($loader_loc);
        }
    }
    return $loader_path;
}

function runtime_location_exists($ext_dir,$path_str,$sep_pos,$loc_name)
{
    $sub_path = substr($path_str,0,$sep_pos);
    $lp = $sub_path . $loc_name;
    $fqlp = $ext_dir.$lp;

    if(@file_exists($fqlp)) {
        return $lp;
    } else {
        return false;
    }
}

function runtime_loading_is_possible() {
    return !((is_php_version_or_greater(5,2,5)) || is_restricted_server() || !ini_get('enable_dl') || !function_exists('dl') || function_is_disabled('dl') || threaded_and_not_cgi());
}

function shared_and_runtime_loading()
{
    return (find_server_type() == SERVER_SHARED && empty($_SESSION['use_ini_method']) && runtime_loading_is_possible());
}

function get_valid_runtime_loading_path($ignore_loading_check = false)
{
    if ($ignore_loading_check || runtime_loading_is_possible()) {
        return runtime_loader_location();
    } else {
        return false;
    }
}

function runtime_loading($rtl_path = null)
{
    if (empty($rtl_path)) {
        $rtl_path = get_valid_runtime_loading_path();
    }
    if (!empty($rtl_path) && @dl($rtl_path)) {
        return $rtl_path;
    } else {
        return false;
    }
}

function get_runtime_loading_path_if_applicable()
{
    $rtl = null;
    if (shared_and_runtime_loading()) {
        $rtl = get_valid_runtime_loading_path();
    }
    return $rtl;
}

function try_runtime_loading_if_applicable()
{
    $rtl_path = get_runtime_loading_path_if_applicable();
    if (!empty($rtl_path)) {
        return runtime_loading($rtl_path);
    } else {
        return $rtl_path;
    }
}

function runtime_loading_instructions()
{
    $default = get_default_address();
    echo '<h4>Runtime Loading Instructions</h4>';
    echo '<div class=panel>';
    echo '<p>On your shared server the Loader can be installed using the runtime loading method.';
    echo " (<a href=\"{$default}&amp;manual=1\">Please click here if you are <strong>not</strong> on a shared server</a>.)</p>";

    if ('.' == extension_dir()) {
        $dirphrase = is_ms_windows()?'folder':'directory';
        echo "Please note that on your system the Loader <em>must</em> be present in the same " . $dirphrase . " as the first encoded file accessed.";
    }
    echo '<ol>';
    loader_download_instructions(); 
    $loader_dir = loader_install_instructions(SERVER_SHARED,dirname(__FILE__));
    shared_test_instructions();
    echo '</ol>';
    echo '</div>';
}

function runtime_loading_errors()
{
    $errors = array();
    $ext_path = extension_dir_path();
    if (false === $ext_path) {
        $errors[ERROR_RUNTIME_EXT_DIR_NOT_FOUND] = "Extensions directory cannot be found.";
    } else {
        $expected_file = dirname(__FILE__) . DIRECTORY_SEPARATOR . get_loader_name();
        if (!@file_exists($expected_file)) {
            $errors[ERROR_RUNTIME_LOADER_FILE_NOT_FOUND] = "The Loader file was expected to be at $expected_file but could not be found.";
        } else {
            $errors = loader_compatibility_test($expected_file);
        }
    }
    return $errors;
}


function windows_package_name()
{
    $sys = get_sysinfo();
	$loader = get_loaderinfo();
    return (LOADERS_PACKAGE_PREFIX . 'win' . '_' . ($sys['THREAD_SAFE']?'':'nonts_') . strtolower($sys['PHP_COMPILER']) .  '_' . $loader['arch']);
}

function unix_package_name()
{
    $sysinfo = get_sysinfo();
    $loader = get_loaderinfo();
    $multiple_os_versions = false;
    if (is_array($loader) && array_key_exists('osvariants',$loader) && is_array($loader['osvariants'])) {
        $versions = array_values($loader['osvariants']);
        $multiple_os_versions = !empty($versions[0]);
    }
    if ($multiple_os_versions) {
        list($reqd_version,$exact_match) = get_reqd_version($loader['osvariants']);
        if ($reqd_version) {
            $basename = LOADERS_PACKAGE_PREFIX . $loader['oscode'] . '_' . $reqd_version . '_' . $loader['arch'];
        } else {
            $basename = "";
        }
    } else {
        $basename = LOADERS_PACKAGE_PREFIX . $loader['oscode'] . '_' . $loader['arch'];
    }
    return array($basename,$multiple_os_versions);
}

function loader_download_instructions()
{
    $sysinfo = get_sysinfo();
    $loader = get_loaderinfo();
    $multiple_os_versions = false;

    if (is_ms_windows()) {
        if (is_bool($sysinfo['THREAD_SAFE'])) {
            $download_str = '<li>Download the following archive of Windows ' . $sysinfo['PHP_COMPILER'];
            if (!$sysinfo['THREAD_SAFE']) {
                $download_str .= ' non-TS';
            }
            $download_str .= ' ' . $loader['arch'] . ' Loaders:';
            echo $download_str;
            $basename = windows_package_name();
            echo make_archive_list($basename,array('zip'));
            echo 'A Loaders archive can also be downloaded from <a href="' . LOADERS_PAGE . '" target="loaders">' . LOADERS_PAGE . '</a>.';
        } else {
            echo '<li>Download a Windows Loaders archive from <a href="' . LOADERS_PAGE  . '" target=loaders>here</a>. If PHP is built with thread safety disabled, use the Windows non-TS Loaders.';
        }
    } else {
        list($basename,$multiple_os_versions) = unix_package_name(); 
        if ($basename == "") {
            echo '<li>Download a ' . $loader['osname'] . ' ' . $loader['arch'] . ' Loaders archive from <a href="' . LOADERS_PAGE . '" target="loaders">here</a>.';
            echo "<br>Your system appears to be {$loader['osnamequal']} for {$loader['wordsize']} bit. If Loaders are not available for that exact release of {$loader['osname']}, Loaders built for an earlier release should work. Note that you may need to install back compatibility libraries for the operating system.";
            echo '<br>If you cannot find a suitable loader then please raise a ticket at <a href="'. SUPPORT_SITE . '">our support helpdesk</a>.';
        } else {
            echo '<li>Download one of the following archives of Loaders for ' . $loader['osnamequal'] . ' ' . $loader['arch'] . ':'; 
            if (SERVER_SHARED == find_server_type()) {
                $archives = array('zip','tar.gz');
            } else {
                $archives = array('tar.gz','zip');
            }
            echo make_archive_list($basename,$archives);
            echo "</p>";
            if ($multiple_os_versions && !$exact_match) {
                echo "<p>Note that you may need to install back compatibility libraries for  {$loader['osname']}.</p>";
            }
        }
    }

    echo '</li>';
}

function ini_dir()
{
    $sysinfo = get_sysinfo();
    $parent_dir = '';
    if (!empty($sysinfo['PHP_INI'])) {
        $parent_dir = dirname($sysinfo['PHP_INI']);
    } else {
        $parent_dir = $_SERVER["PHPRC"];
        if (@is_file($parent_dir)) {
            $parent_dir = dirname($parent_dir);
        }
    }
    return $parent_dir;
}

function unix_install_dir()
{
    $ext_dir = extension_dir_path();
    $cur_dir = @realpath('.');
    if (empty($ext_dir) || $ext_dir == $cur_dir) {
        $loader_dir = UNIX_SYSTEM_LOADER_DIR;
    } else {
        $loader_dir = $ext_dir;
    }
    return $loader_dir;
}

function windows_install_dir()
{
    $sysinfo = get_sysinfo();
    if ($sysinfo['SS'] == 'IIS') {
        if (false === ($ext_dir = extension_dir_path())) {
            $parent_dir = ini_dir();
            $ext_dir = $parent_dir . '\\ext';
            if (!empty($parent_dir) && @file_exists($ext_dir)) {
                $loader_dir = $ext_dir;
            } else {
                $loader_dir = $_SERVER['windir'] . '\\' . WINDOWS_IIS_LOADER_DIR;
            }
        } else {
            $loader_dir = $ext_dir;
        }
    } else {
        if (false === ($ext_dir = extension_dir_path())) {
			$parent_dir = ini_dir();
			$loader_dir = $parent_dir . '\\' . 'ioncube';
		} else {
			$loader_dir = $ext_dir;
		}
    }
    return $loader_dir;
}

function loader_install_dir($server_type)
{
    if (SERVER_SHARED == $server_type && own_php_ini_possible()) {
        $loader_dir = get_default_loader_dir_webspace();
    } elseif (is_ms_windows()) {
        $loader_dir = windows_install_dir();
    } else {
        $loader_dir = unix_install_dir();
    }
    return $loader_dir;
}

function writeable_directories()
{
    $root_path = @realpath($_SERVER['DOCUMENT_ROOT']);
    $above_root_path = @realpath($_SERVER['DOCUMENT_ROOT'] . "/..");
    $root_path_cgi_bin = @realpath($_SERVER['DOCUMENT_ROOT'] . "/cgi-bin");
    $above_root_cgi_bin = @realpath($_SERVER['DOCUMENT_ROOT'] . "/../cgi-bin");

    $paths = array();
    foreach (array($root_path,$above_root_path,$root_path_cgi_bin,$above_root_cgi_bin) as $p) {
        if (@is_writeable($p)) {
            $paths[] = $p;
        }
    }
    return $paths;
}

function loader_install_instructions($server_type,$loader_dir = '')
{
    if (empty($loader_dir)) {
        $loader_dir = loader_install_dir($server_type);
    }
    if (SERVER_LOCAL == $server_type) {
        echo "<li>Put the Loader files in <code>$loader_dir</code></li>";
    } else {
        echo "<li>Transfer the Loaders to your web server and install in <code>$loader_dir</code></li>";
    }
    return $loader_dir;
}

function zend_extension_lines($loader_dir)
{
    $zend_extension_lines = array();
    $sysinfo = get_sysinfo();
    $qt = (is_ms_windows()?'"':'');
    $loader = get_loaderinfo();

    if (!is_bool($sysinfo['THREAD_SAFE']) || !$sysinfo['THREAD_SAFE']) {
        $path = $qt . $loader_dir . DIRECTORY_SEPARATOR . $loader['file'] . $qt;
        $zend_extension_lines[] = "zend_extension = " . $path;
    }
    if ((!is_bool($sysinfo['THREAD_SAFE']) && !is_php_version_or_greater(5,3)) || $sysinfo['THREAD_SAFE']) {
        $line_start = is_php_version_or_greater(5,3)?'zend_extension':'zend_extension_ts';
        $path = $qt . $loader_dir . DIRECTORY_SEPARATOR . $loader['file_ts'] . $qt;
        $zend_extension_lines[] = $line_start . " = " . $path;
    }
    return $zend_extension_lines;
}

function user_ini_base()
{
    $doc_root_path = realpath($_SERVER['DOCUMENT_ROOT']);
    $above_root_path = @realpath($_SERVER['DOCUMENT_ROOT'] . "/..");
    if (!empty($above_root_path) && @is_writeable($above_root_path)) {
        $start_path = $above_root_path;
    } else {
        $start_path = $doc_root_path;
    }
    return $start_path;
}

function user_ini_space_path($file)
{
    $user_base = user_ini_base();
    $fpath = @realpath($file);
    if (!empty($fpath) && (0 === strpos($fpath,$user_base))) {
        return $fpath;
    } else {
        return false;
    }
}

function default_ini_path()
{
    return (realpath($_SERVER['DOCUMENT_ROOT']));
}

function shared_ini_location()
{
    $phprc = getenv('PHPRC');
    if (!empty($phprc)) {
        $phprc_path = user_ini_space_path($phprc);
        if (false !== $phprc_path) {
            return $phprc_path;
        } else {
            return default_ini_path();
        }
    } else {
        return default_ini_path();
    }
}


function zend_extension_instructions($server_type,$loader_dir)
{
    $sysinfo = get_sysinfo();
    $base = get_base_address();
    $editing_ini = true;

    $php_ini_name = ini_file_name();

    if (isset($sysinfo['PHP_INI']) && @file_exists($sysinfo['PHP_INI'])) {
        $php_ini_path = $sysinfo['PHP_INI'];
    } else {
        $php_ini_path = '';
    }

    if (is_bool($sysinfo['THREAD_SAFE'])) {
        $kwd = zend_extension_line_start();
    } else {
        $kwd = 'zend_extension/zend_extension_ts';
    }

    $server_type_code = server_type_code();

    $zend_extension_lines = zend_extension_lines($loader_dir);

    if (SERVER_SHARED == $server_type && own_php_ini_possible()) {
        $ini_dir = shared_ini_location();
        $php_ini_path = $ini_dir . DIRECTORY_SEPARATOR . $php_ini_name;
        if (@file_exists($php_ini_path)) {
            $edit_line = "<li>Edit the <code>$php_ini_name</code> in the <code>$ini_dir</code> directory";
            if (zend_extension_line_missing($php_ini_path) && @is_writeable($php_ini_path) && @is_writeable($ini_dir)) {
                if (function_exists('file_get_contents')) {
                    $ini_strs = @file_get_contents($php_ini_path);
                } else {
                    $lines = @file($php_ini_path);
                    $ini_strs = join(' ',$lines);
                }
                $fh = @fopen($php_ini_path,"wb");
                if ($fh !== false) {
                    foreach ($zend_extension_lines as $zl) {
                        fwrite($fh,$zl . PHP_EOL);
                    }
                    fwrite($fh,$ini_strs);
                    fclose($fh);
                    $editing_ini = false;
                    echo "<li>Your php.ini file at $php_ini_path has been modified to include the necessary line for the ionCube Loader.";
                } else {
                    echo $edit_line;
                }
            } else {
               echo $edit_line;
            }
        } else {
            $download_ini_file = "<li><a href=\"$base&amp;page=phpconfig&amp;ininame=$php_ini_name&amp;stype=$server_type_code&amp;download=1&amp;prepend=1\">Save this  <code>$php_ini_name</code> file</a> and upload it to <code>$ini_dir</code> (full path on your server).";
            if (@is_writeable($ini_dir)) {
                $fh = @fopen($php_ini_path,"wb");
                if ($fh !== false) {
                    foreach ($zend_extension_lines as $zl) {
                       fwrite($fh,$zl . PHP_EOL);
                    }
                    if (!empty($sysinfo['PHP_INI']) && is_readable($sysinfo['PHP_INI'])) {
                        if (function_exists('file_get_contents')) {
                           $ini_strs = @file_get_contents($sysinfo['PHP_INI']);
                        } else {
                           $lines = @file($sysinfo['PHP_INI']);
                           $ini_strs = join(' ',$lines);
                        }
                        fwrite($fh,$ini_strs);
                    }
                    fclose($fh); 
                    echo "<li>A <code>$php_ini_name</code> file has been created for you in <code>$ini_dir</code>.";
                } else {
                    echo $download_ini_file;
                }
            } else {
                echo $download_ini_file;
            }
            $editing_ini = false;
        }
    } elseif (!empty($sysinfo['PHP_INI'])) {
        if (empty($sysinfo['PHP_INI_DIR'])) {
            echo "<li>Edit the file <code>{$sysinfo['PHP_INI']}</code>";
        } else {
            $php_ini_path = find_additional_ioncube_ini();
            if (empty($php_ini_path)) {
                $php_ini_name = ADDITIONAL_INI_FILE_NAME;
                echo "<li><a href=\"$base&amp;page=phpconfig&amp;download=1&amp;newlinesonly=1&amp;ininame=$php_ini_name&amp;stype=$server_type_code\">Save this $php_ini_name file</a> and put it in your ini files directory, <code>{$sysinfo['PHP_INI_DIR']}</code>";
                $editing_ini = false;
            } else {
                $php_ini_name = basename($php_ini_path);
                echo "<li>Edit the file <code>$php_ini_path</code>";
            }
        }
    } else {
        echo "<li>Edit the system <code>$php_ini_name</code> file";
    }
    if ($editing_ini) {
        echo " and <b>before</b> any other $kwd lines ensure that the following is included:<br>";
        foreach ($zend_extension_lines as $zl) {
            echo "<code>$zl</code><br>";
        }
        if (!empty($php_ini_path)) {
            if (zend_extension_line_missing($php_ini_path)) {
                echo "<a>Alternatively, replace your current <code>$php_ini_path</code> file with <a href=\"$base&amp;page=phpconfig&amp;ininame=$php_ini_name&amp;stype=$server_type_code&amp;download=1&amp;prepend=1\">this new $php_ini_name file</a>."; 
            }
        }
    }
    echo '</li>';
}

function server_restart_instructions()
{
    $sysinfo = get_sysinfo();
    $base = get_base_address();

    if ($sysinfo['SS']) {
		if ($sysinfo['SS'] == 'PHP-FPM') {
			echo "<li>Restart PHP-FPM.</li>";
		} else {
			echo "<li>Restart the {$sysinfo['SS']} server software.</li>";
		}
    } else {
        echo "<li>Restart the server software.</li>";
    }

    echo "<li>When the server software has restarted, <a href=\"$base&amp;page=loader_check\" onclick=\"showOverlay();\">click here to test the Loader</a>.</li>";

	if ($sysinfo['SS'] && $sysinfo['SS'] == 'PHP-FPM') {
		echo '<li>If the Loader installation failed, check the PHP-FPM error log file for errors.</li>';
    } elseif ($sysinfo['SS'] == 'Apache' && !is_ms_windows()) {
        echo '<li>If the Loader installation failed, check the Apache error log file for errors and see our guide to <a target="unix_errors" href="'. UNIX_ERRORS_URL . '">Unix related errors</a>.</li>';
    }
}

function shared_test_instructions()
{
    $base = get_base_address();
    echo "<li><a href=\"$base&amp;page=loader_check\" onclick=\"showOverlay();\">Click here to test the Loader</a>.</li>";
}

function link_to_php_ini_instructions()
{
    $default = get_default_address();
    echo "<p><a href=\"{$default}&amp;stype=s&amp;ini=1\">Please click here for instructions on using the php.ini method instead</a>.</p>";
}

function php_ini_instruction_list($server_type)
{
    echo '<h4>Installation Instructions</h4>';
    echo '<div class=panel>';
    echo '<ol>';

    loader_download_instructions(); 
    $loader_dir = loader_install_instructions($server_type);
    zend_extension_instructions($server_type,$loader_dir);
    if ($server_type != SERVER_SHARED || !own_php_ini_possible()) {
        server_restart_instructions();
    } else {
        shared_test_instructions();
    } 
    echo '</ol>';
    echo '</div>';
}

function php_ini_install_shared($give_preamble = true)
{
    $php_ini_name = ini_file_name();
    $default = get_default_address();
    if ($give_preamble) {
        echo "<p>On your <strong>shared</strong> server, the Loader should be installed using a <code>$php_ini_name</code> configuration file.";
        echo " (<a href=\"{$default}&amp;manual=1\">Please click here if you are <strong>not</strong> on a shared server</a>.)</p>";
    }

    if (own_php_ini_possible()) {
        echo '<p>With your hosting account, you may be able to use your own PHP configuration file.</p>';
    } else {
        echo "<p>It appears that you cannot install the ionCube Loader using the <code>$php_ini_name</code> file. Your server provider or system administrator should be able to perform the installation for you. Please refer them to the following instructions.</p>";
    }

    php_ini_instruction_list(SERVER_SHARED);
}

function php_ini_install($server_type_desc = null, $server_type = SERVER_DEDICATED, $required = true)
{
    $php_ini_name = ini_file_name();
    $default = get_default_address();

    echo '<p>';
    if ($server_type_desc) {
        echo "For a <strong>$server_type_desc</strong> server ";
    } else {
        echo "For this server ";
    }

    if ($required) {
        echo "you should install the ionCube Loader using the <code>$php_ini_name</code> configuration file.";
    } else {
        echo "installing the ionCube Loader using the <code>$php_ini_name</code> file is recommended.";
    }
    if ($server_type_desc) {
        echo " (<a href=\"{$default}&amp;manual=1\">Please click here if you are <strong>not</strong> on a $server_type_desc server</a>.)";
    }
    echo '</p>';
      
    php_ini_instruction_list($server_type);
}



function help_resources($error_list = array())
{
	$self = get_self();
    $base = get_base_address();
    $server_type_code = server_type_code();
    $server_type = find_server_type();
    $sysinfo = get_sysinfo();
    $resources = array(
            '<a target="_blank" href="' . LOADERS_FAQ_URL . '">ionCube Loaders FAQ</a>',
            '<a target="_blank" href="' . LOADER_FORUM_URL . '">ionCube Loader Forum</a>'
        );
    if (SERVER_SHARED != $server_type || own_php_ini_possible(true)) {
		$support_info = array ( 
			'department' 		=> WIZARD_SUPPORT_TICKET_DEPARTMENT,
			'subject' 			=> "ionCube Loader installation problem",
			'message' 			=> support_ticket_information()
		   );
		if (SERVER_LOCAL == $server_type && !info_should_be_disabled()) {
			$temp_files = system_info_temporary_files();
		} else {
			$temp_files = NULL;
		}
		if (!empty($temp_files)) {
			$support_info['ini'] = base64_encode(file_get_contents($temp_files['ini']));
			$support_info['phpinfo'] = base64_encode(file_get_contents($temp_files['phpinfo']));
			$support_info['additional'] = base64_encode(file_get_contents($temp_files['additional']));
			
			$loader_path = find_loader(true);
			if (is_string($loader_path)) {		
				$support_info['loader'] = base64_encode(file_get_contents($loader_path));
				$support_info['loader_name'] = basename($loader_path);
			} else {
				$support_info['loader'] = '';
				$support_info['loader_name'] = '';
			}
		} else {
			$support_info['ini'] = '';
			$support_info['phpinfo'] = '';
			$support_info['additional'] = '';
			$support_info['loader'] = '';
			$support_info['loader_name'] = '';
		}
		 
        $resources[2] = '<form action="' . SUPPORT_SITE . 'lw_index.php' .'" method="POST" id="support-ticket"><a href="" onclick="document.getElementById(\'support-ticket\').submit(); return false;">Raise a support ticket through our helpdesk</a>';
		$resources[2] .= '<input type="hidden" name="department" value="' . $support_info['department'] . '"/>';
		$resources[2] .= '<input type="hidden" name="subject" value="' . $support_info['subject'] . '"/>';
		$resources[2] .= '<input type="hidden" name="message" value="' . $support_info['message'] . '"/>';
		if (!empty($temp_files)) {
			$resources[2] .= '<input type="hidden" name="phpinfo" value="' . $support_info['phpinfo'] . '"/>';
			$resources[2] .= '<input type="hidden" name="ini" value="' . $support_info['ini'] . '"/>';
			$resources[2] .= '<input type="hidden" name="additional" value="' . $support_info['additional'] . '"/>';
			$resources[2] .= '<input type="hidden" name="loader" value="' . $support_info['loader'] . '"/>';
			$resources[2] .= '<input type="hidden" name="loader_name" value="' . $support_info['loader_name'] . '"/>';
		}
		$resources[2] .= '</form>';
    } 
	
    if (SERVER_SHARED == $server_type && own_php_ini_possible(true) && !user_ini_space_path($sysinfo['PHP_INI'])) {
        $resources[3] = '<strong>Please check with your host that you can create php.ini files that will override the system one.</strong>';
    }
    return $resources;
}

function system_info_temporary_files()
{
    $tmpfname_ini = get_tempnam("/tmp", "INI");
    $tmpfname_ini .= ".ini";
    $fh_ini = @fopen($tmpfname_ini,'wb');
    if ($fh_ini) {
        $config = all_ini_contents();
        fwrite($fh_ini,$config);
        fclose($fh_ini);
    } else {
        $tmpfname_ini = '';
    }

    $tmpfname_pinf = get_tempnam("/tmp", "PIN");
    $tmpfname_pinf .= ".html";
    $fh_pinfo = @fopen($tmpfname_pinf,'wb');
    if ($fh_pinfo) {
        ob_start();
        @phpinfo();
        $pinfo = ob_get_contents();
        ob_end_clean();
        fwrite($fh_pinfo,$pinfo);
        fclose($fh_pinfo);
    } else {
        $tmpfname_pinf = '';
    }

    $tmpfname_add = get_tempnam("/tmp", "ADD");
    $tmpfname_add .= ".html";
    $fh_add = @fopen($tmpfname_add,'wb');
    if ($fh_add) {
        ob_start();
        extra_page(false);
        $extra = ob_get_contents();
        ob_end_clean();
        fwrite($fh_add,$extra);
        fclose($fh_add);
    } else {
        $tmpfname_add = '';
    }

    if (empty($tmpfname_ini) || empty($tmpfname_pinf) || empty($tmpfname_add)) {
        return (array());
    } else {
        return (array('ini'           =>   $tmpfname_ini,
                      'phpinfo'       =>   $tmpfname_pinf,
                      'additional'    =>   $tmpfname_add));
    }
}

function get_tempnam($default_tmp_dir = '', $prefix = '')
{
	if (function_exists('sys_get_temp_dir')) {
		return tempnam(sys_get_temp_dir(),$prefix);
	} else {
		return @tempnam($default_tmp_dir, $prefix);
	}
}
function system_info_archive_page()
{
    info_disabled_check();
	$server_type = find_server_type();
	if (SERVER_LOCAL != $server_type) {
		exit;
	}
    $loader = find_loader(true);
    if (is_string($loader)) {
        $loader_file = $loader;
    } else {
        $loader_file = '';
    }
    $all_files = system_info_temporary_files();
    if (!empty($all_files)) {
        if (!empty($loader_file)) {
            $all_files['loader'] = $loader_file;
        }
        $archive_name =  get_tempnam('/tmp',"ARC");
        if (extension_loaded('zip')) {
            $archive_name .= '.zip';
            $zip = @new ZipArchive();
            $mode = @constant("ZIPARCHIVE::OVERWRITE");
            if (!$zip || $zip->open($archive_name, $mode)!==TRUE) {
                $archive_name = '';
            } else {
                foreach($all_files as $f) {
                    $zip->addFile($f,basename($f));
                }
                $zip->close();
            }
        } elseif (extension_loaded('zlib') && !is_ms_windows()) {
            $tar_name = $archive_name . ".tar";
            $all_files_str = join(' ',$all_files);
            $script = "tar -chf $tar_name $all_files_str";
            $result = @system($script,$retval);
            if ($result !== false) {
                $archive_name = $tar_name . '.gz';
                $zp = gzopen($archive_name,"w9");
                $tar_contents = get_file_contents($tar_name);
                gzwrite($zp,$tar_contents);
                gzclose($zp);
            } else {
                $archive_name = '';
            }
        } else {
            $archive_name = '';
        }
    } else {
        $archive_name = '';
    }
    if ($archive_name) {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='. $archive_name);
        @readfile($archive_name);
    } else {
        $self = get_self();
        $base = get_base_address();
        $server_type_code = server_type_code();
        heading();
        echo "<p>A downloadable archive of system information could not be created.<br> 
            <strong>Please save each of the following and then attach those files to the support ticket:</strong></p>"; 
        echo "<ul>";
        echo "<li><a href=\"$base&amp;page=phpinfo\" target=\"phpinfo\">phpinfo()</a></li>";
        echo "<li><a href=\"$base&amp;page=phpconfig\" target=\"phpconfig\">config</a></li>";
        echo "<li><a href=\"$base&amp;page=extra&amp;stype=$server_type_code\" target=\"extra\">additional information</a></li>";
        echo "<li><a href=\"$self?page=loaderbin\">loader file</a></li>";
        echo "</ul>";
        footer(true);
    }
}

function support_ticket_information($error_list = array())
{
    $sys = get_sysinfo();
    $ld = get_loaderinfo();

    $ticket_strs = array();
    $ticket_strs[] = "PLEASE DO NOT REMOVE THE FOLLOWING INFORMATION\r\n";
    $ticket_strs[] = "==============\r\n";
    if (!empty($error_list)) {
        $ticket_strs[] = "[hr]";
        $ticket_strs[] = "ERRORS";
        $ticket_strs[] = "[table]";
        $ticket_strs[] = '[tr][td]' . join('[/td][/tr][tr][td]',$error_list) . '[/td][/tr]';
        $ticket_strs[] = "[/table]";
    }
    $ticket_strs[] = "[hr]";
    $ticket_strs[] = "SYSTEM INFORMATION";
    $info_lines = array();
    $info_lines["Wizard version"] = script_version();
    $info_lines["PHP uname"] = $ld['uname'];
    $info_lines["Machine architecture"] = $ld['arch'];
    $info_lines["Word size"] = $ld['wordsize'];
    $info_lines["Operating system"] = $ld['osname'] . ' ' . $ld['osver'];
    if (selinux_is_enabled() || possibly_selinux()) {
        $info_lines["Security enhancements"] = "SELinux";
    } elseif (grsecurity_is_enabled()) {
        $info_lines["Security enhancements"] = "Grsecurity";
    } else {
        $info_lines["Security enhancements"] = "None";
    }
    $info_lines["PHP version"] = PHP_VERSION; 
    if ($sys['DEBUG_BUILD']) {
        $info_lines["DEBUG BUILD"] = "DEBUG BUILD OF PHP";
    }
    if (!$sys['SUPPORTED_COMPILER']) {
        $info_lines["SUPPORTED PHP COMPILER"] = "FALSE";
        $info_lines["PHP COMPILER"] = $sys['PHP_COMPILER'];
    }
    $info_lines["Is CLI?"] = ($sys['IS_CLI']?"Yes":"No");
    $info_lines["Is CGI?"] = ($sys['IS_CGI']?"Yes":"No");
    $info_lines["Is thread-safe?"] = ($sys['THREAD_SAFE']?"Yes":"No");
    $info_lines["Web server"] = $sys['FULL_SS'];
    $info_lines["Server type"] = server_type_string();
    $info_lines["PHP ini file"] = $sys['PHP_INI'];
    if (!@file_exists($sys['PHP_INI'])) {
        $info_lines["Ini file found"] = "INI FILE NOT FOUND";
    } else {
        if (is_readable($sys['PHP_INI'])) {
            $info_lines["Ini file found"] = "INI FILE READABLE";
        } else {
            $fh = @fopen($sys['PHP_INI'],"rb");
            if ($fh === false) {
                $info_lines["Ini file found"] = "INI FILE FOUND BUT POSSIBLY NOT READABLE";
            } else {
                $info_lines["Ini file found"] = "INI FILE READABLE";
            }
        }
    }
    $info_lines["PHPRC"] = $sys['PHPRC'];
    $loader_path = find_loader();
    if (is_string($loader_path)) {
        $info_lines["Loader path"] =  $loader_path;
        $info_lines["Loader file size"] = filesize($loader_path) . " bytes.";
        $info_lines["Loader MD5 sum"] =  md5_file($loader_path);
    } else {
        $info_lines["Loader path"] =  "LOADER PATH NOT FOUND";
    }
    $server_type_code = server_type_code();
    if (!empty($_SESSION['hostprovider'])) {
      $info_lines['Hosting provider'] = $_SESSION['hostprovider'];
      $info_lines['Provider URL'] = $_SESSION['hosturl'];
    }
    $info_lines["Wizard script path"] = '[url]http://' . $_SERVER["HTTP_HOST"] . get_self() . '?stype='. $server_type_code . '[/url]';
    $ticket_strs[] = "[table]";
    foreach ($info_lines as $h => $i) {
        $value = (empty($i))?'EMPTY':$i;
        $ticket_strs[] = '[tr][td]' . $h . '[/td]' . '[td]' . $value . '[/td][/tr]';
    }
    $ticket_strs[] = '[/table]';
    $ticket_strs[] = '[hr]';
    $ticket_strs[] = "\r\n==============\r\n";
    $ticket_strs[] = "PLEASE ENTER ANY ADDITIONAL INFORMATION BELOW\r\n";

    $support_ticket_str = join('',$ticket_strs);
    return urlencode($support_ticket_str);
}

function wizard_stats_data($page_id)
{
    $data = array();

    try_runtime_loading_if_applicable();
    $sysinfo = get_sysinfo();
    $ldinfo = get_loaderinfo();

    $data['sessionid'] = session_id();
    $data['wizard_version'] = script_version();
    $data['server_type'] = server_type_code();
    $data['hostprovider'] = (isset($_SESSION['hostprovider']))?$_SESSION['hostprovider']:'';
    $data['hosturl'] = (isset($_SESSION['hosturl']))?$_SESSION['hosturl']:'';
    $data['page_id'] = $page_id;
    $data['loader_state'] = (extension_loaded(LOADER_EXTENSION_NAME))?'installed':'failure';
    $data['ini_location'] = $sysinfo['PHP_INI'];
    $data['is_cgi'] = ($sysinfo['IS_CGI'])?"yes":"no";
    $data['is_ts'] = ($sysinfo['THREAD_SAFE'])?"yes":"no";
    $data['arch'] = $ldinfo['arch'];
    $data['php_version'] = PHP_VERSION;
    $data['os'] = $ldinfo['osname'];
    $data['word_size'] = $ldinfo['wordsize'];
    $data['referrer'] =  $_SERVER["HTTP_HOST"] . get_self();

    return $data;
}

function send_stats($page_id = 'default')
{
    $server_type = find_server_type();
    $res = false;

    if (SERVER_LOCAL != $server_type) {
        $stats_data = wizard_stats_data($page_id);

        if (!isset($_SESSION['stats_sent'][$page_id][$stats_data['loader_state']])) {
            $url = WIZARD_STATS_URL;

            if (!empty($stats_data)) {
                if(function_exists('http_build_query')) {
                    $qparams = http_build_query($stats_data);
                } else {
                    $qparams = php4_http_build_query($stats_data);
                }
                $url .= '?' . $qparams;
                $res = remote_file_contents($url);
            }
            $_SESSION['stats_sent'][$page_id][$stats_data['loader_state']] = 1;
        } else {
            $res = true;
        }
    } else {
        $res = 'LOCAL';
    }
    return $res;
}

function os_arch_string_check($loader_str)
{
    $errors = array();
    if (preg_match("/target os:\s*(([^_]+)_([^-]*)-([[:graph:]]*))/i",$loader_str,$os_matches)) {
        $loader_info = get_loaderinfo();
        $dirname = calc_dirname();
        $packed_osname = preg_replace('/\s/','',strtolower($loader_info['osname']));
        if (strtolower($dirname) != $os_matches[1] && $packed_osname != $os_matches[2]) {
            $errors[ERROR_LOADER_WRONG_OS] = "You have the wrong loader for your operating system, ". $loader_info['osname'] . ".";
        } else {
            $loader_wordsize = (strpos($os_matches[3],'64') === false)?32:64;
            if ($loader_info['arch'] != ($ap = required_loader_arch($os_matches[3],$loader_info['oscode'],$loader_wordsize))) {
                $err_str = "You have the wrong loader for your machine architecture.";
                $err_str .= " Your system is " . $loader_info['arch'];
                $err_str .= " but the loader you are using is for " . $ap . ".";
                $errors[ERROR_LOADER_WRONG_ARCH] = $err_str;
            }
        }
    }
    return $errors;
}

function get_loader_strings($loader_location)
{
    if (function_exists('file_get_contents')) {
        $loader_strs = @file_get_contents($loader_location);
    } else {
        $lines = @file($loader_location);
        $loader_strs = join(' ',$lines);
    }
    return $loader_strs;
}

function loader_system($loader_location)
{
    $loader_system = array();
    $loader_strs = get_loader_strings($loader_location);

    if (!empty($loader_strs)) {

        if (preg_match("/ioncube_loader_..?\.._(.)\.(.)\.(..?)(_nonts)?(_amd64)?\.dll/i",$loader_strs,$version_matches)) {
            $loader_system['oscode'] = 'win';
            $loader_system['thread_safe'] = (isset($version_matches[4]) && $version_matches[4] == '_nonts')?0:1;
			if (preg_match("/_localtime([0-9][0-9])/i",$loader_strs,$size_matches)) {
				$loader_system['wordsize'] = ($size_matches[1] == '64')?64:32;
			} else {
				$loader_system['wordsize'] = 32;
			}
            $loader_system['arch'] = ($loader_system['wordsize'] == 64)?'x86-64':'x86';
            $loader_system['php_version_major'] = $version_matches[1];
            $loader_system['php_version_minor'] = $version_matches[2];
			if ($loader_system['php_version_major'] == 8 && $loader_system['php_version_minor'] >= 1) {
				$loader_system['compiler'] = 'VC16';
			} elseif ($loader_system['php_version_major'] == 7 && $loader_system['php_version_minor'] >= 2) {
				$loader_system['compiler'] = 'VC15'; 
			} elseif ($loader_system['php_version_major'] == 7 && $loader_system['php_version_minor'] < 2) {
				$loader_system['compiler'] = 'VC14'; 
			} elseif ($loader_system['php_version_major'] == 5 && $loader_system['php_version_minor'] >= 5) {
				$loader_system['compiler'] = 'VC11'; 
			} elseif (preg_match("/assemblyIdentity.*version=\"([^.]+)\./",$loader_strs,$compiler_matches)) {
                $loader_system['compiler'] = "VC" . strtoupper($compiler_matches[1]);
            } else {
                $loader_system['compiler'] = 'VC6';
            }
        } elseif (preg_match("/php version:\s*(.)\.(.)\.(..?)(-ts)?/i",$loader_strs,$version_matches)) {
            $loader_system['thread_safe'] = (isset($version_matches[4]) && $version_matches[4] == '-ts')?1:0;
            $loader_system['php_version_major'] = $version_matches[1];
            $loader_system['php_version_minor'] = $version_matches[2];
            if (preg_match("/target os:\s*(([^_]+)_([^-]*)-([[:graph:]]*))/i",$loader_strs,$os_matches)) {
                $loader_system['oscode'] = strtolower(substr($os_matches[2],0,3));
                $loader_system['wordsize'] = (strpos($os_matches[3],'64') === false)?32:64;
                $loader_system['arch'] = required_loader_arch($os_matches[3],$loader_system['oscode'],$loader_system['wordsize']);
                $loader_system['compiler'] = $os_matches[4];
            }
        }
        if (preg_match("/ionCube Loader Version\s+(\S+)/",$loader_strs,$loader_version)) {
            $loader_system['loader_version'] = $loader_version[1];
		} elseif (preg_match("/ioncube_loader_(\d{1,2}\.\d\.\d{1,2})\./",$loader_strs,$loader_version)){
			$loader_system['loader_version'] = $loader_version[1];
        } else {
            $loader_system['loader_version'] = 'UNKNOWN';
        }
        if (isset($loader_system['php_version_major'])) {
            $loader_system['php_version'] = $loader_system['php_version_major'] . '.' . $loader_system['php_version_minor'];
        }
    }
    return $loader_system;
}

function loader_compatibility_test($loader_location)
{
    $errors = array();

    $sysinfo = get_sysinfo();
    if (LOADER_NAME_CHECK) {
        $installed_loader_name = basename($loader_location);
        $expected_loader_name = get_loader_name();
        if ($installed_loader_name != $expected_loader_name) {
            $errors[ERROR_LOADER_UNEXPECTED_NAME] = "The installed loader (<code>$installed_loader_name</code>) does not have the name expected (<code>$expected_loader_name</code>) for your system. Please check that you have the correct loader for your system.";
        }
    }
    if (empty($errors) && !is_readable($loader_location)) {
        $execute_error = "The loader at $loader_location does not appear to be readable.";
        $execute_error .= "<br>Please check that it exists and is readable.";
        $execute_error .= "<br>Please also check the permissions of the containing ";
        $execute_error .= (is_ms_windows()?'folder':'directory') . '.';
		if ($sysinfo['SS'] == 'PHP-FPM') {
			$execute_error .= "<br>Please also check that PHP-FPM has been restarted.";
        } elseif (($sysinfo['SS'] == 'IIS') || !($sysinfo['IS_CGI'] || $sysinfo['IS_CLI'])) {
            $execute_error .= "<br>Please also check that the web server has been restarted.";
        }
        $execute_error .= ".";
        $errors[ERROR_LOADER_NOT_READABLE] = $execute_error;
    }
    $loader_strs = get_loader_strings($loader_location);
    $phpv = php_version(); 
    if (preg_match("/php version:\s*(.)\.(.)\.(..?)(-ts)?/i",$loader_strs,$version_matches)) {
        if ($version_matches[1] != $phpv['major'] || $version_matches[2]  != $phpv['minor']) {
            $loader_php = $version_matches[1] . "." . $version_matches[2];
            $server_php =  $phpv['major'] . "." .  $phpv['minor'];
            $errors[ERROR_LOADER_PHP_MISMATCH] = "The installed loader is for PHP $loader_php but your server is running PHP $server_php.";
        }
        if (is_bool($sysinfo['THREAD_SAFE']) &&  $sysinfo['THREAD_SAFE'] && !is_ms_windows() && !(isset($version_matches[4]) && $version_matches[4] == '-ts')) {
            $errors[ERROR_LOADER_NONTS_PHP_TS] = "Your server is running a thread-safe version of PHP but the loader is not a thread-safe version.";
        } elseif (isset($version_matches[4]) && $version_matches[4] == '-ts' && !(is_bool($sysinfo['THREAD_SAFE']) &&  $sysinfo['THREAD_SAFE'])) {
            $errors[ERROR_LOADER_TS_PHP_NONTS] = "Your server is running a non-thread-safe version of PHP but the loader is a thread-safe version.";
        }
    } elseif (preg_match("/ioncube_loader_..?\.._(.)\.(.)\.(..?)(_nonts)?(_amd64)?\.dll/i",$loader_strs,$version_matches)) {
        if (!is_ms_windows()) {
            $errors[ERROR_LOADER_WIN_SERVER_NONWIN] = "You have a Windows loader but your server does not appear to be running Windows.";
        } else {
            if (isset($version_matches[4]) && $version_matches[4] == '_nonts' && is_bool($sysinfo['THREAD_SAFE']) &&  $sysinfo['THREAD_SAFE']) {
                $errors[ERROR_LOADER_WIN_NONTS_PHP_TS] = "You have the non-thread-safe version of the Windows loader but you need the thread-safe one.";
            } elseif (!(is_bool($sysinfo['THREAD_SAFE']) &&  $sysinfo['THREAD_SAFE']) && !(isset($version_matches[4]) && $version_matches[4] == '_nonts')) {
                $errors[ERROR_LOADER_WIN_TS_PHP_NONTS] = "You have the thread-safe version of the Windows loader but you need the non-thread-safe one."; 
            }
            if ($version_matches[1] != $phpv['major'] || $version_matches[2]  != $phpv['minor']) {
                $loader_php = $version_matches[1] . "." . $version_matches[2];
                $server_php =  $phpv['major'] . "." .  $phpv['minor'];
                $errors[ERROR_LOADER_WIN_PHP_MISMATCH] = "The installed loader is for PHP $loader_php but your server is running PHP $server_php.";
            }
                        
            if ($version_matches[1] == 8 && $version_matches[2] >= 1) {
                $loader_compiler = 'VC16';
            } elseif ($version_matches[1] == 7 && $version_matches[2] >= 2) {
                $loader_compiler = 'VC15'; 
            } elseif ($version_matches[1] == 7) {
                $loader_compiler = 'VC14'; 
            } elseif ($version_matches[1] == 5 && $version_matches[2] >= 5) {
                $loader_compiler = 'VC11'; 
            } elseif (preg_match("/assemblyIdentity.*version=\"([^.]+)\./",$loader_strs,$compiler_matches)) {
                $loader_compiler = "VC" . strtoupper($compiler_matches[1]);
            } else {
                $loader_compiler = 'VC6';
            }
            if ($loader_compiler != $sysinfo['PHP_COMPILER']) {
                $errors[ERROR_LOADER_WIN_COMPILER_MISMATCH] = "Your loader was built using $loader_compiler but you need the loader built using {$sysinfo['PHP_COMPILER']}.";
            }
        }
    } else {
            $errors[ERROR_LOADER_PHP_VERSION_UNKNOWN] = "The PHP version for the loader cannot be determined - please check that you have a valid ionCube Loader.";
    } 
    $errors += os_arch_string_check($loader_strs);

    return $errors;
}


function shared_server()
{
    if (!$rtl_path = runtime_loading()) {
        if (empty($_SESSION['use_ini_method']) && runtime_loading_is_possible()) {
            runtime_loading_instructions();
        } else {
            php_ini_install_shared();
        }
    } else {
        list($lv,$mv,$newer_version) = ioncube_loader_version_information();
        $phpv = php_version_maj_min();
        echo "<p>The ionCube Loader $lv for PHP $phpv has been successfully installed.</p>";
        $is_legacy_loader = loader_major_version_instructions($mv);
        if ($is_legacy_loader) {
            loader_upgrade_instructions($lv,$newer_version);
        }
        successful_install_end_instructions($rtl_path);
    }
}

function dedicated_server()
{
    php_ini_install('dedicated or VPS', SERVER_DEDICATED, true);
}

function local_install()
{
    php_ini_install('local',SERVER_LOCAL, true);
}


function unregister_globals()
{
    if (!ini_get('register_globals')) {
        return;
    }

    if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
        die('GLOBALS overwrite attempt detected');
    }

    $noUnset = array('GLOBALS',  '_GET',
                     '_POST',    '_COOKIE',
                     '_REQUEST', '_SERVER',
                     '_ENV',     '_FILES');

    $input = array_merge($_GET,    $_POST,
                         $_COOKIE, $_SERVER,
                         $_ENV,    $_FILES,
                         isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());

    foreach ($input as $k => $v) {
        if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {
            unset($GLOBALS[$k]);
        }
    }
}

function clear_session($persist = array())
{
    $persist['not_go_daddy'] = empty($_SESSION['not_go_daddy'])?0:1;
    $persist['use_ini_method'] = empty($_SESSION['use_ini_method'])?0:1;
    $persist['server_type'] = empty($_SESSION['server_type'])?SERVER_UNKNOWN:$_SESSION['server_type'];
    @session_destroy();
    $_SESSION = array();
    $_SESSION['CREATED'] = time();
    $_SESSION = $persist;
}

function can_archive()
{
	return (extension_loaded('zip') || (extension_loaded('zlib') && !is_ms_windows()));
}

function is_ioncube()
{
        return (($_SERVER["REMOTE_ADDR"] == IONCUBE_IP_ADDRESS) || ($_SERVER["REMOTE_ADDR"] == gethostbyname(IONCUBE_ACCESS_ADDRESS)));
}

function can_reach_ioncube()
{
	return (isset($_SESSION['remote_access_successful']));
}

function info_should_be_disabled($only_allow_ioncube = false)
{
    $elapsed = time() - max(filemtime(__FILE__),filectime(__FILE__));
	
	if (is_ioncube()) {
		$cutoff_time = IONCUBE_WIZARD_EXPIRY_MINUTES * 60;
	} else {
		if (!$only_allow_ioncube && !extension_loaded(LOADER_EXTENSION_NAME)) {
			$cutoff_time = WIZARD_EXPIRY_MINUTES * 60;
		} else {
			return true;
		}
	}
	
    return ($elapsed > $cutoff_time);
}

function info_disabled_text()
{
    return "The information you have tried to access has been disabled for security reasons. Please re-install this Loader Wizard script and try again.";
}

function info_disabled_check()
{
    if (info_should_be_disabled()) {
        heading();
        echo info_disabled_text();
        footer(true);
        exit;
    }
}

function run()
{

	$user_agent = $_SERVER['HTTP_USER_AGENT'];
	if (preg_match('/googlebot/i',$user_agent)) {
		exit;
	}
    unregister_globals();
    if (is_php_version_or_greater(4,3,0)) {
        ini_set('session.use_only_cookies',1);
    }
    $session_ok = @session_start();

    if (!defined('PHP_EOL')) {
        if (is_ms_windows()) {
            define('PHP_EOL',"\r\n");
        } else {
            define('PHP_EOL',"\n");
        }
    }

    if (!isset($_SESSION['CREATED'])) {
        $_SESSION['CREATED'] = time();
    } elseif (time() - $_SESSION['CREATED'] > SESSION_LIFETIME_MINUTES * 60 ) {
        clear_session(); 
    }
    if (!isset($_SERVER)) $_SERVER =& $HTTP_SERVER_VARS;

    (php_sapi_name() == 'cli') && die("This script should only be run by a web server.\n");

    $page = get_request_parameter('page');
    $host = get_request_parameter('host');
    $clear = get_request_parameter('clear');
    $ini = get_request_parameter('ini');
    $timeout = get_request_parameter('timeout');

    if ($timeout) {
        $_SESSION['timing_out'] = 1;
        $_SESSION['initial_run'] = 0;
    }

    if (!empty($host)) {
        if ($host == 'ngd') {
            $_SESSION['not_go_daddy'] = 1;
        }
    }
    if (!empty($ini)) {
        $_SESSION['use_ini_method'] = 1;
    }

    if (!empty($clear)) {
        clear_session();
        unset($_SESSION['not_go_daddy']);
        unset($_SESSION['use_ini_method']);
        unset($_SESSION['server_type']);
    } else {
        $stype = get_request_parameter('stype');
        $hostprovider = get_request_parameter('hostprovider');
        $hosturl = get_request_parameter('hosturl');
        if (!empty($hostprovider)) {
            $_SESSION['hostprovider'] = $hostprovider;
            $_SESSION['hosturl'] = $hosturl;
        }
        $server_type = find_server_type($stype,false,true);
    }
    if ($session_ok && !$timeout && !isset($_SESSION['initial_run']) && empty($page)) {
        $_SESSION['initial_run'] = 1;
        initial_page();
        @session_write_close();
        exit;
    } else {
        $_SESSION['initial_run'] = 0;
    }

    if (empty($_SESSION['server_type'])) {
        $_SESSION['server_type'] = SERVER_UNKNOWN;
    }

    if (empty($page) || !function_exists($page . "_page")) {
        $page = get_default_page();
    } 

    $fn = "{$page}_page";
    $fn();

    @session_write_close();
    exit(0);
}

function wizardversion_page()
{
    $start_time = time();
    $wizard_version_only = get_request_parameter('wizard_only');
    $clear_session_info = get_request_parameter('clear_info');
    if ($clear_session_info) {
        unset($_SESSION['timing_out']);
        unset($_SESSION['latest_wizard_version']);
    }
    $wizard_version = latest_wizard_version();
    $message = '';
    if (false === $wizard_version) {
        $message = "0";
    } elseif (update_is_available($wizard_version)) {
        $message = "$wizard_version";
    } else {
        $message = "1";
    }
    echo $message;
    @session_write_close();
    exit(0);
}

function platforminfo_page()
{
    $message = '';
    $platforms = get_loader_platforms();
    $message = empty($platforms)?0:1;
    echo $message;
    @session_write_close();
    exit(0);
}

function loaderversion_page()
{
    $message = '';
    $loader_versions = get_loader_version_info();
    $message = empty($loader_versions)?0:1;
    echo $message;
    @session_write_close();
    exit(0);
}

function compilerversion_page()
{
    $message = '';
    $compiler_versions = find_win_compilers();
    $message = empty($compiler_versions)?0:1;
    echo $message;
    @session_write_close();
    exit(0);
}

function initial_page()
{
    $self = get_self();
    $start_page = get_default_address(false);
    $stage_timeout = 7000;
    $step_lag = 500;

    echo <<<EOT
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <title>ionCube Loader Wizard</title>
        <link rel="stylesheet" type="text/css" href="$self?page=css">
        <style type="text/css">
        body {
            height: 100%;
            width: 100%;
        }
        </style>
        <script type="text/javascript">
        var timingOut = 0;
        var xmlHttpTimeout;
        var ajax;
        var statusPar;
        var stage_timeout = $stage_timeout;
        var step_lag = $step_lag;

        function checkNextStep(ajax,expected,continuation) {
            if (ajax.readyState==4 && ajax.status==200)
            {
                clearTimeout(xmlHttpTimeout);
                if (ajax.responseText == expected) {
                   setTimeout('',step_lag);
                   continuation();
                } else {
                   statusPar.innerHTML = 'Unable to check for update<br>script continuing';
                   setTimeout("window.location.href = '$start_page&timeout=1'",1000);
                }
            }
        }

        function getXmlHttp() {
            if (window.XMLHttpRequest) {
                xmlhttp=new XMLHttpRequest();
            } else {
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            return xmlhttp;
        }
        var startMainLoaderWizard = function() {
            window.location.href = '$start_page';
        }
        var loaderVersionCheck = function() {
            statusPar.innerHTML = 'Stage 4/4: Getting latest loader versions';
            var xmlHttp = getXmlHttp();
            xmlHttp.onreadystatechange=function() {
                checkNextStep(xmlHttp,"1",startMainLoaderWizard);
            }
            xmlHttp.open("GET","$self?page=loaderversion",true);
            xmlHttp.send("");
            ajax = xmlHttp;
            xmlHttpTimeout=setTimeout('ajaxTimeout()',stage_timeout);
        }
        var platformCheck = function() {
            statusPar.innerHTML = 'Stage 3/4: Getting platform information';
            var xmlHttp = getXmlHttp();
            xmlHttp.onreadystatechange=function() {
                checkNextStep(xmlHttp,"1",loaderVersionCheck);
            }
            xmlHttp.open("GET","$self?page=platforminfo",true);
            xmlHttp.send("");
            ajax = xmlHttp;
            xmlHttpTimeout=setTimeout('ajaxTimeout()',stage_timeout);
        }
        var compilerVersionCheck = function() {
            statusPar.innerHTML = 'Stage 2/4: Getting compiler versions';
            var xmlHttp = getXmlHttp();
            xmlHttp.onreadystatechange=function() {
                checkNextStep(xmlHttp,"1",platformCheck);
            }
            xmlHttp.open("GET","$self?page=compilerversion",true);
            xmlHttp.send("");
            ajax = xmlHttp;
            xmlHttpTimeout=setTimeout('ajaxTimeout()',stage_timeout);
        }
        var startChecks = function() {
            statusPar = document.getElementById('status');
            statusPar.innerHTML = 'Stage 1/4: Getting Loader Wizard version';
            var xmlHttp = getXmlHttp();
            xmlHttp.onreadystatechange=function() {
                checkNextStep(xmlHttp,"1",compilerVersionCheck);
            }
            xmlHttp.open("GET","$self?page=wizardversion",true);
            xmlHttp.send("");
            ajax = xmlHttp;
            xmlHttpTimeout=setTimeout('ajaxTimeout()',stage_timeout);
        }
        function ajaxTimeout(){
           ajax.abort();
           statusPar.innerHTML = 'Cannot reach server<br>script continuing';
           setTimeout("window.location.href = '$start_page&timeout=1'",1000);
        }
        </script>
    </head>
    <body>

    <div id="loading"><script type="text/javascript">document.write('<p>Initialising<br>ionCube Loader Wizard<br><span id="status"></span></p>');</script><p id="noscript">Your browser does not support JavaScript so the ionCube Loader Wizard initialisation cannot be made now. This script can get the latest loader version information from the ionCube server when you go to the next page.<br>Please choose one of the following. <br>If the script appears to hang please restart the script and choose the "NO" option.<br><br><br><a href="$start_page">YES - my server DOES have internet access</a><br><br><a href="$start_page&timeout=1">NO - my server does NOT have internet access</a></p></div>
    <script type="text/javascript">
        document.getElementById('noscript').style.display = 'none';
        window.onload = startChecks;
    </script>
    </body>
    </html>
EOT;
}

function default_page($loader_extension = LOADER_EXTENSION_NAME)
{
    $self = get_self();
    foreach (array('self') as $vn) {
        if (empty($$vn)) {
			$server_data = print_r($_SERVER,true);
            error("Unable to initialise ($vn)". ' $_SERVER is: ' . $server_data);
        }
    }

    heading();

    $wizard_update = check_for_wizard_update(true);

    $rtl = try_runtime_loading_if_applicable();

    $server_type = find_server_type();

    if (extension_loaded($loader_extension) && $server_type != SERVER_UNKNOWN) {
        loader_already_installed($rtl);
    } else {
        loader_not_installed();
    }
    send_stats('default');

    footer($wizard_update);
}

function uninstall_wizard_instructions()
{
    echo '<p><strong>For security reasons we advise that you remove this Wizard script from your server now that the ionCube Loader is installed.</strong></p>';
}

function contact_script_provider_instructions()
{
    echo '<p>Please contact the script provider if you do experience any problems running encoded files.</p>';
}

function may_need_to_copy_ini()
{
    $sys = get_sysinfo();
    if (ini_same_dir_as_wizard() && $sys['IS_CGI']) {
        $dirphrase = is_ms_windows()?'folder':'directory';
        $ini = ini_file_name();
        echo "<p>Please note that if encoded files in a different $dirphrase from the Wizard fail then you should attempt to copy the $ini file to each $dirphrase in which you have encoded files.</p>";
    }
}

function ioncube_24_is_available()
{
	$loaderinfo = get_loaderinfo();
	$php_ver = php_version();
   
	return ($loaderinfo['oscode'] == 'lin' && (($php_ver['major'] == 5 && $php_ver['minor'] >= 3) || $php_ver['major'] > 5) );
}

function ioncube_24_is_enabled()
{
	$ic24_enabled = ini_get(IC24_ENABLED_INI_PROPERTY);
	return $ic24_enabled;
}

function ioncube_24_information()
{
    if (ioncube_24_is_available() && !ioncube_24_is_enabled()) {
        $self = get_self();
        echo '<div class="ic24">';
        echo '<div class="ic24graphic">';
        echo '<a target="_blank" href="' . IONCUBE24_URL . '"><img id="ic24logo" src="' . $self . '?page=ic24logo" alt="ionCube24 logo"></a>';
        echo '</div>';
        echo '<div id="ic24info">';
        echo '<p><strong>Bonus Features!</strong> The ionCube Loader can also give ';
        echo '<strong>real-time intrusion protection</strong> to protect against malware and <strong>PHP error reporting</strong> ';
        echo 'to alert when things go wrong on your website.</p>';
        echo '<p>These features are disabled by default but easily activated. ';
        echo '<strong><a target="_blank" href="' . IONCUBE24_URL . '">visit ioncube24.com</a></strong> to find out more.</p>';
        echo '</div>';
        echo '</div>';
    }
}

function cli_install_instructions()
{

	if (is_php_version_or_greater(5,3)) {
		$cli_loader_installed = shell_exec('php -r "echo extension_loaded(\"' . LOADER_EXTENSION_NAME . '\");"');
		
		if (!$cli_loader_installed) {
			$cli_php_ini_output = shell_exec("php --ini");
			
			$ini_loader_loc = scan_inis_for_loader();
		
			if (!is_null($cli_php_ini_output)) {
				echo '<div class="panel">';
				echo '<h4>Loader Installation for Command-Line (CLI) PHP</h4>';
				echo "<p>At present it does not look like the ionCube Loader is installed for command-line (CLI) PHP.</p>";
				echo "<p>Please note that if you need to run the CLI PHP, such as for <strong>cron jobs</strong>, then please ensure the zend_extension line for the ionCube Loader is included in your CLI PHP configuration.</p>";
				
				if (!empty($ini_loader_loc['location'])) {
					echo "<p>The zend_extension line that needs to be copied is:</p>";
					echo "<p><kbd>zend_extension = " . $ini_loader_loc['location'] . "</kbd></p>";
				}
				
				echo "<p>Your CLI PHP Configuration is:</p>";
				echo '<div class="terminal">';
				echo "<pre>";
				echo $cli_php_ini_output;
				echo "</pre>";
				echo '</div>';
				echo '</div>';
			}
		}
	}
}

function successful_install_end_instructions($rtl_path = null)
{
    if (empty($rtl_path)) {
        may_need_to_copy_ini();
    } elseif (is_string($rtl_path)) {
        echo "<p>The runtime loading method of installation was used with path <code>$rtl_path</code></p>";
    }
    contact_script_provider_instructions();
    if (is_legacy_platform()) {
        legacy_platform_instructions();
    }
	
	if (!is_ms_windows() && is_php_version_or_greater(5,3)) {
		cli_install_instructions();
	}
	
    uninstall_wizard_instructions();
	
	ioncube_24_information();
}

function loader_major_version_instructions($mv)
{
    if ($mv < LATEST_LOADER_MAJOR_VERSION) {
        echo "<p><strong>The installed version of the Loader cannot run files produced by the most recent ionCube Encoder.</strong>";
        echo " You will need a version " . LATEST_LOADER_MAJOR_VERSION . " ionCube Loader to run such files.</p>";
    }
    return ($mv < LATEST_LOADER_MAJOR_VERSION);
}

function loader_already_installed($rtl = null)
{
    list($lv,$mv,$newer_version) = ioncube_loader_version_information();
    $phpv = php_version_maj_min();
    $php_str = ' for PHP ' . $phpv;
    echo '<div class="success">';
    echo '<h4>Loader Installed</h4>';
    if ($newer_version) {
        echo '<p>The ionCube Loader version ' . $lv . $php_str . ' is <strong>already installed</strong> but it is an old version.';
        echo ' It is recommended that the Loader be upgraded to the latest version if possible.</p>';
        $know_latest_version = is_string($newer_version);
        $is_legacy_loader = loader_major_version_instructions($mv);
        echo '</div>';
        loader_upgrade_instructions($lv,$newer_version);
    } else {
        echo '<p>The ionCube Loader version ' . $lv . $php_str . ' is already installed and encoded files should run without problems.</p>'; 
        echo '</div>';
        $is_legacy_loader = loader_major_version_instructions($mv,true);
        if ($is_legacy_loader) {
            loader_upgrade_instructions($lv,true);
        }
    }

    successful_install_end_instructions($rtl);
}

function loader_upgrade_instructions($installed_version,$newer_version)
{
    if ($newer_version) {
        echo '<div class="panel">';
        echo '<h4>Loader Upgrade Instructions</h4>';
        $restart_needed = true;
        $server_type = find_server_type();
        if ($server_type == SERVER_SHARED || $server_type == SERVER_UNKNOWN) {
            $loader_path = find_loader(true);
            if (!is_string($loader_path) || false === user_ini_space_path($loader_path)) {
                $verb_case = ($server_type == SERVER_UNKNOWN)?"may":"will";
                echo "<p>Please note that you $verb_case need your system administrator to do the following to upgrade. The web server will need to be restarted after the loader file is changed.</p>";
            }
            $restart_needed = false;
        }
        if (is_string($newer_version)) {
            $version_str = "version $newer_version";
        } else {
            $version_str = "a newer version";
        }
        $loader_name =  get_loader_name();
        echo "<p>To upgrade from version $installed_version to $version_str of the ionCube Loader, please replace your existing loader file, $loader_name, with
            the file of the same name from one of the following packages:</p>";
        if (is_ms_windows()) {
            $basename = windows_package_name();
        } else {
            list($basename,$multiple_os_versions) = unix_package_name();
        }
        echo make_archive_list($basename,array('zip','tar.gz'));
        if ($restart_needed) {
            echo "<p>Once you have replaced the loader file please restart your web server.</p>";
        }
        echo '</div>';
    }
}

function legacy_platform_warning()
{
    $leg_warn = '<p><strong>You are on a platform on which ionCube Loaders are no longer being developed. ';
    $leg_warn .= 'Loaders on your platform may not be able to run files produced by the latest ionCube Encoder. ';
    $leg_warn .= 'Please switch, if possible, to a platform on which loaders are currently supported. ';
    $leg_warn .= 'A list of currently supported platforms is shown on our <a href="' . LOADERS_PAGE . '" target="loaders">loaders page</a>.</strong></p>';

    return $leg_warn;
}

function legacy_platform_instructions()
{
    echo legacy_platform_warning();
}

function loader_not_installed()
{
    $loader = get_loaderinfo();
    $sysinfo = get_sysinfo();

    $stype = get_request_parameter('stype');
    $manual_select = get_request_parameter('manual');
    $host_type = find_server_type($stype,$manual_select,true);

    if ($host_type != SERVER_UNKNOWN && is_array($loader) && !$sysinfo['DEBUG_BUILD']) {
        $warnings = server_restriction_warnings();
        if (is_legacy_platform()) {
            $warnings[] = legacy_platform_warning();
        }
        if (empty($_SESSION['use_ini_method']) && $host_type == SERVER_SHARED && runtime_loading_is_possible()) {
            $errors = runtime_loading_errors();
        } else {
            $errors = ini_loader_errors();
            $warnings = array_merge($warnings,ini_loader_warnings());
        }
        if (!empty($errors)) {
            if (count($errors) > 1) {
                $problem_str = "Please note that the following problems currently exist";
            } else {
                $problem_str = "Please note that the following problem currently exists";
            }
            echo '<div class="alert">' .$problem_str . ' with the ionCube Loader installation:';
            echo make_list($errors,"ul"); 
            echo '</div>';
        }
        if (!empty($warnings)) {
            $addword = empty($errors)?'':'also';
            $plural = (count($warnings)>1)?'s':'';
            echo '<div class="warning">';
            echo "Please note $addword the following issue$plural:";
            echo make_list($warnings,"ul"); 
            echo '</div>';
        }
    }
    if (!isset($stype)) {
        echo '<p>To use files that have been protected by the <a href="' . ENCODER_URL . '" target=encoder>ionCube PHP Encoder</a>, a component called the ionCube Loader must be installed.</p>';
    }

    if (!is_supported_php_version()) {
        echo '<p>Your server is running PHP version ' . PHP_VERSION . ' and is
                unsupported by ionCube Loaders.  Recommended PHP 4 versions are PHP 4.2 or higher, 
                PHP 5.1 or higher for PHP 5, PHP 7.1 or higher for PHP 7 and PHP 8.1 or higher for PHP 8. Please note that there is not an ionCube Loader for PHP 8.0.</p>';
	} elseif ($latest_supported_php_version = is_after_max_php_version_supported()) {
		echo '<strong>Your server is running PHP version ' . PHP_VERSION . ' and is
                currently unsupported by any ionCube Loaders. <br/>This may change in the future if a Loader is produced for your PHP platform.<br/>In the meantime please downgrade PHP to version ' . $latest_supported_php_version . '.</strong>';
    } elseif ($sysinfo['DEBUG_BUILD']) {
         echo '<p>Your server is currently running a debug build of PHP. The Loader cannot be installed with a debug build of PHP. Please ensure that PHP is reconfigured with debug disabled. Note that debug builds of PHP cannot help in debugging PHP scripts.</p>'; 
    } elseif (!is_array($loader)) {
        if ($loader == ERROR_WINDOWS_64_BIT) {
            echo '<p>Loaders for 64-bit PHP on Windows are not currently available. However, if you <b>install and run 32-bit PHP</b> the corresponding 32-bit loader for Windows should work.</p>';
            if ($sysinfo['THREAD_SAFE']) {
                echo '<li>Download one of the following archives of 32-bit Windows x86 loaders:';
            } else {
                echo '<li>Download one of the following archives of 32-bit Windows non-TS x86 loaders:';
            }
            echo make_archive_list(windows_package_name());
        } else {
            echo '<p>There may not be an ionCube Loader available for your type of system at the moment. However, if you create a <a href="'  . SUPPORT_SITE . '">support ticket</a> more advice and information may be available to assist. Please include the URL for this Wizard in your ticket.</p>';
        }
    } elseif (!$sysinfo['SUPPORTED_COMPILER']) {
        $supported_compilers = supported_win_compilers();
        $supported_compiler_string = join('/',$supported_compilers);
        echo '<p>At the current time the ionCube Loader requires PHP to be built with ' . $supported_compiler_string . '. Your PHP software has been built using ' . $sysinfo['PHP_COMPILER'] . '. Supported builds of PHP are available from <a href="https://windows.php.net/download/">PHP.net</a>.';
    } else {
        switch ($host_type) {
            case SERVER_SHARED:
                shared_server();
                break;
            case SERVER_DEDICATED:
                dedicated_server();
                break;
            case SERVER_LOCAL:
                local_install();
                break;
            default:
                echo server_selection_form();
                break;
        }
    }
}

function server_selection_form()
{
    $self = get_self();
    $timeout = (isset($_SESSION['timing_out']) && $_SESSION['timing_out'])?1:0;
    $hostprovider = (!empty($_SESSION['hostprovider']))?$_SESSION['hostprovider']:'';
    $hostprovider = htmlspecialchars($hostprovider, ENT_QUOTES, 'UTF-8');
    $hosturl = (!empty($_SESSION['hosturl']))?$_SESSION['hosturl']:'';
    $hosturl =  htmlspecialchars($hosturl, ENT_QUOTES, 'UTF-8');
    $form = <<<EOT
    <p>This Wizard will give you information on how to install the ionCube Loader.</p>
    <p>Please select the type of web server that you have and then click Next.</p>
    <script type=text/javascript>
        function trim(s) {
            return s.replace(/^\s+|\s+$/g,"");
        }
        function input_ok() {
            var l = document.getElementById('local');
            if (l.checked) {
                return true;
            } 

            var s = document.getElementById('shared');
            var d = document.getElementById('dedi');

            if (!s.checked && !d.checked) {
                alert("Please select one of the server types.");
                return false;
            } else {
                var hn = document.getElementById('hostprovider');
                var hu = document.getElementById('hosturl');
                var hostprovider = trim(hn.value);
                var hosturl = trim(hu.value);

                if (!hostprovider || !hosturl) {
                    alert("Please enter both a hosting provider name and their URL.");
                    return false;
                }
                if (hostprovider.length < 1) {
                    alert("The hosting provider name should be at least 1 character in length.");
                    return false;
                }
                if (!hosturl.match(/[A-Za-z0-9-_]+\.[A-Za-z0-9-_%&\?\/.=]+/)) {
                    alert("The hosting provider URL is invalid.");
                    return false;
                }
                if (hosturl.length < 4) {
                    alert("The hosting provider URL should be at least 4 characters in length.");
                    return false;
                }
            }
            return true;
        }
    </script>
    <form method=GET action=$self>
        <input type="hidden" name="page" value="default">
        <input type="hidden" name="timeout" value="$timeout">
        <input type=radio id=shared name=stype value=s onclick="document.getElementById('hostinginfo').style.display = 'block';"><label for=shared>Shared <small>(for example, server with FTP access only and no access to php.ini)</small></label><br>
        <input type=radio id=dedi name=stype value=d onclick="document.getElementById('hostinginfo').style.display = 'block';"><label for=dedi>Dedicated or VPS <small>(server with full root ssh access)</small></label><br>
        <div id="hostinginfo" style="display: none">If you are on a shared or dedicated server, please give your hosting provider and their URL:
            <table>
                <tr><td><label for=hostprovider>Name of your hosting provider</label></td><td><input type=text id="hostprovider" name=hostprovider value="$hostprovider"></td></tr>
                <tr><td><label for=hosturl>URL of your hosting provider</label></td><td><input type=text id="hosturl" name=hosturl value="$hosturl"></td></tr>
            </table>
        </div>
        <input type=radio id=local name=stype value=l onclick="document.getElementById('hostinginfo').style.display = 'none';"><label for=local>Local install</label>
        <p><input type=submit value=Next onclick="return (input_ok(this) && showOverlay());"></p>
    </form>
EOT;
    return $form;
}

function phpinfo_page()
{
    info_disabled_check();
    if (function_is_disabled('phpinfo')) {
        echo "phpinfo is disabled on this server";
    } else {
        @phpinfo();
    }
}

function loader_check_page($ext_name = LOADER_EXTENSION_NAME)
{
    heading();

    $rtl_path = try_runtime_loading_if_applicable();
	
    if (extension_loaded($ext_name)) {
        list($lv,$mv,$newer_version) = ioncube_loader_version_information();
        $phpv = php_version_maj_min();
        $php_str = ' for PHP ' . $phpv;
        echo '<div class="success">';
        echo '<h4>Loader Installed Successfully</h4>';
        echo '<p>The ionCube Loader version ' . $lv . $php_str . ' <strong>is installed</strong> and encoded files should run successfully.';
        if ($newer_version) {
            echo ' Please note though that you have an old version of the ionCube Loader.</p>';
            $is_legacy_loader = loader_major_version_instructions($mv);
            echo '</div>';
            loader_upgrade_instructions($lv,$newer_version);
        } else {
            echo '</p>';
            $is_legacy_loader = loader_major_version_instructions($mv);
            echo '</div>';
            if ($is_legacy_loader) {
                loader_upgrade_instructions($lv,true);
            }
        }
        successful_install_end_instructions($rtl_path);
    } else {
        echo '<div class="failure">';
        echo '<h4>Loader Not Installed</h4>';
        echo '<p>The ionCube Loader is <b>not</b> currently installed successfully.</p>';
	
        if (!is_null($rtl_path)) {
            echo '<p>Runtime loading was attempted but has failed.</p>';
            echo '</div>';
            $rt_errors = runtime_loading_errors();
            if (!empty($rt_errors)) {
                list_loader_errors($rt_errors);
            } 
            link_to_php_ini_instructions();
        } else {
            echo '</div>';
            list_loader_errors();
        }
    }
	
    send_stats('check');
    footer(true);
}

function ini_loader_errors()
{
    $errors = array();
    if (SERVER_SHARED == find_server_type() && !own_php_ini_possible(true)) {
        $errors[ERROR_INI_USER_CANNOT_CREATE] = "It appears that you are not be able to create your own ini files on your shared server. <br><strong>You will need to ask your server administrator to install the ionCube Loader for you.</strong>";
    }
    $loader_loc = find_loader(false);
    if (is_string($loader_loc)) {
        if (!shared_and_runtime_loading()) {
            $sys = get_sysinfo();
            if (empty($sys['PHP_INI'])) {
                $errors[ERROR_INI_NO_PATH] = 'No file path found for the PHP configuration file (php.ini).';
            } elseif (!@file_exists($sys['PHP_INI'])) {
                $errors[ERROR_INI_NOT_FOUND] = 'The PHP configuration file (' . $sys['PHP_INI'] .') cannot be found.';
            }
        }
        $errors = $errors + loader_compatibility_test($loader_loc);
    } else {
        $errors = $errors + $loader_loc;
        $fs_location = find_loader_filesystem();
        if (!empty($fs_location)) {
            $fs_loader_errors = loader_compatibility_test($fs_location);
            if (!empty($fs_loader_errors)) {
                $errors[ERROR_LOADER_WRONG_GENERAL] = "The loader file found at $fs_location is not the correct one for your system.";
            }
            $errors = $errors + $fs_loader_errors;
        }
    } 
    return $errors;
}

function unix_path_dir($dir = '')
{
    if (empty($dir)) {
        $dir = dirname(__FILE__);
    }
    if (is_ms_windows()) {
        $dir = str_replace('\\','/',substr($dir,2));
    }
    return $dir;
}

function unrecognised_inis_webspace($startdir)
{
    $ini_list = array();

    $ini_name = ini_file_name();
    $sys = get_sysinfo();
    $depth = substr_count($startdir,'/');

    $rel_path = '';
    $rootpath = realpath($_SERVER['DOCUMENT_ROOT']);
    for ($seps = 0; $seps < $depth; $seps++) {
        $full_ini_loc = @realpath($startdir . '/' . $rel_path) . DIRECTORY_SEPARATOR . $ini_name;
        if (@file_exists($full_ini_loc) && $sys['PHP_INI'] != $full_ini_loc) {
            $ini_list[] = @realpath($full_ini_loc);
        }

        if (dirname($full_ini_loc) == $rootpath) {
            break;
        }
        $rel_path .= '../';
    }
    return $ini_list;
}

function correct_loader_wrong_location()
{
    $loader_location_pair = array();
    $loader_location = find_loader_filesystem();
    if (is_string($loader_location) && !empty($loader_location)) {
        $loader_errors = loader_compatibility_test($loader_location);
        if (empty($loader_errors)) {
            $ini_loader = scan_inis_for_loader();
            if (!empty($ini_loader['location'])) {
                $ini_loader_errors = loader_compatibility_test($ini_loader['location']);
                if (!empty($ini_loader_errors)) {
                    $loader_location_pair['loader'] = $loader_location;
                    $loader_location_pair['newloc'] = dirname($ini_loader['location']);
                }
            } else {
                $std_dir = loader_install_dir(find_server_type());
                $std_ld_path = $std_dir . DIRECTORY_SEPARATOR . get_loader_name();
                if (@file_exists($std_ld_path)) {
                    $stdloc_loader_errors = loader_compatibility_test($std_ld_path);
                } else {
                    $stdloc_loader_errors = array("Loader file does not exist.");
                }
                if (!empty($stdloc_loader_errors)) {
                    $loader_location_pair['loader'] = $loader_location;
                    $loader_location_pair['newloc'] = $std_dir;
                }
            }
        }
    }
    return $loader_location_pair;
}

function ini_loader_warnings()
{
    $warnings = array();
    if (find_server_type() == SERVER_SHARED)
    {
        if (own_php_ini_possible()) {
            $sys = get_sysinfo();
            $ini_name = ini_file_name();
            $rootpath = realpath($_SERVER['DOCUMENT_ROOT']);
            $root_ini_file = $rootpath . DIRECTORY_SEPARATOR . $ini_name;
            $cgibinpath = @realpath($_SERVER['DOCUMENT_ROOT'] . "/cgi-bin");
            $cgibin_ini_file = (empty($cgibinpath))?'':$cgibinpath . DIRECTORY_SEPARATOR . $ini_name;
            $here = unix_path_dir();
            $ini_files = unrecognised_inis_webspace($here);
            $shared_ini_loc = shared_ini_location();
            $shared_ini_file = $shared_ini_loc . DIRECTORY_SEPARATOR . $ini_name;
            $ini_dir = dirname($sys['PHP_INI']);
            $all_ini_locations_used = !empty($ini_files);
            foreach ($ini_files as $full_ini_loc) {
                $advice = "The file $full_ini_loc is not being recognised by PHP.";
                $advice .= " Please check that the name and location of the file are correct.";
                if (!ini_same_dir_as_wizard()) {
                    $ini_loc_dir = dirname($full_ini_loc);
                    if (!@file_exists($shared_ini_file) && !empty($shared_ini_loc) && $ini_loc_dir != $shared_ini_loc && $ini_dir != $shared_ini_loc) {
                        $all_ini_locations_used = false;
                        $advice .= " Please try copying the <code>$full_ini_loc</code> file to <code>" . $shared_ini_loc . "</code>.";
                    } else {
                        if (!@file_exists($root_ini_file) && $rootpath != $shared_ini_loc && $full_ini_loc != $rootpath) {
                            $all_ini_locations_used = false;
                            $advice .= " Please try copying the <code>$full_ini_loc</code> file to <code>" . $rootpath . "</code>.";
                        } 
                        if (!empty($cgibin_ini_file) && !@file_exists($cgibin_ini_file) && $cgibinpath != $shared_ini_loc && $full_ini_loc != $cgibinpath && $cgibinpath != $rootpath) {
                            $all_ini_locations_used = false;
                            $advice .= "  Please try copying the <code>$full_ini_loc</code> file to <code>" . $cgibinpath . "</code>.";
                        }
                        $herepath = realpath($here);
                        $here_ini_file = $herepath . DIRECTORY_SEPARATOR . $ini_name;
                        if (!@file_exists($here_ini_file) && $herepath != $rootpath && $herepath != $cgibinpath) {
                            $all_ini_locations_used = false;
                            $advice .= " It may be necessary to copy the <code>$full_ini_loc</code> file to <code>$herepath</code> and to all " . (is_ms_windows()?'folders':'directories') . ' in which you have encoded files';
                        }
                    }
                } else {
                    $all_ini_locations_used = false;
                }
                $warnings[] = $advice;
            }
            if ($all_ini_locations_used) {
                $warnings[] = "<strong>It looks as if ini files are not being recognised in any of the standard locations in your webspace. Please contact your hosting provider to check whether you can create your own PHP ini file and where it should go.</strong>";
            }
        } else {
            if (own_php_ini_possible(true)) {
                $warnings[] = "You may not be able to create your own ini files on your shared server. <br><strong>You might need to ask your server administrator to install the ionCube Loader for you.</strong>";
            }
        }
    } else {
        $loader_dir_pair = correct_loader_wrong_location();
        if (!empty($loader_dir_pair)) {
            $advice = "The correct loader for your system has been found at <code>{$loader_dir_pair['loader']}</code>."; 
            if ($loader_dir_pair['loader'] != $loader_dir_pair['newloc']) {
                $advice .= " Please copy the loader from <code>{$loader_dir_pair['loader']}</code> to <code>{$loader_dir_pair['newloc']}</code>.";
            }
            $warnings[] = $advice;
        }
    }
    return $warnings;
}

function list_loader_errors($errors = array(),$warnings = array(),$suggest_restart = true)
{
    $default = get_default_address();
    $retry_message = '';

    
    if (empty($errors)) {
        $errors = ini_loader_errors();
        if (empty($warnings)) {
            $warnings = ini_loader_warnings();
        }
    }
	
    if (!empty($errors)) {
        $try_again = '<a href="#" onClick="window.location.href=window.location.href">try again</a>';
	
        echo '<div class="alert">';
        if (count($errors) > 1) {
            echo 'The following problems have been found with the ionCube Loader installation:';
            $retry_message = "Please correct those errors and $try_again.";
        } else {
            echo 'The following problem has been found with the ionCube Loader installation:';
            $retry_message = "Please correct that error and $try_again.";
        }
        if (array_key_exists(ERROR_INI_USER_CANNOT_CREATE,$errors)) {
            $retry_message = '';
        }
        echo make_list($errors,"ul");
        echo '</div>';
        if (!empty($warnings)) {
            echo '<div class="warning">';
            echo 'Please also note the following:';
            echo make_list($warnings,"ul");
            echo '</div>';
        }
    } elseif (!empty($warnings)) {
        echo '<div class="warning">';
        echo 'There are the following potential problems:';
        echo make_list($warnings,"ul");
        echo '</div>';
    } elseif ($suggest_restart) {
        if (SERVER_SHARED == find_server_type()) {
            echo "<p>Please contact your server administrator about installing the ionCube Loader.</p>";
        } else {
            if (selinux_is_enabled()) {
                echo "<p>It appears that SELinux is enabled on your server. This might be solved by running the command <code>restorecon [full path to loader file]</code> as root.</p>";
            } elseif (grsecurity_is_enabled()) {
                echo "<p>It appears that grsecurity is enabled on your server. Please run the command, <code>execstack -c [full path to loader file]</code> and then restart your web server.</p>";
            } else {
                $sysinfo = get_sysinfo();
                $ss = $sysinfo['SS'];
				if ($ss == 'PHP-FPM') {
					echo "<p>Please check that PHP-FPM has been restarted.</p>";
                } elseif (!$sysinfo['CGI_CLI'] || is_ms_windows()) {
                    echo "<p>Please check that the $ss web server software has been restarted.</p>";
                } 
            }
        }
    }
    echo '<div>';
    echo $retry_message;
    echo " You may wish to view the following for further help:";
    echo make_list(help_resources($errors),"ul");
    echo '<a href="' . $default . '">Click here to go back to the start of the Loader Wizard</a>.</div>';
}

function phpconfig_page()
{
    info_disabled_check();
    $sys = get_sysinfo();
    $download = get_request_parameter('download');
    $ini_file_name = '';
    if (!empty($download)) {
        $ini_file_name = get_request_parameter('ininame');
        if (empty($ini_file_name)) {
            $ini_file_name = ini_file_name();
        } else {
			if (!preg_match('`^.*\.ini$`',$ini_file_name) || preg_match('`/`',$ini_file_name) || preg_match('`\\\`',$ini_file_name)) {
				die("Illegal file name $ini_file_name");
			}
		}
        header('Content-Type: text/plain');
        header('Content-Disposition: attachment; filename=' . $ini_file_name);
    } else {
        header('Content-Type: text/plain');
    }
    $exclude_original = get_request_parameter('newlinesonly');
    $prepend = get_request_parameter('prepend');
    $stype = get_request_parameter('stype');
    $server_type = find_server_type($stype);
    if (!empty($exclude_original) || !empty($prepend)) {
        $loader_dir = loader_install_dir($server_type);
        $zend_lines = zend_extension_lines($loader_dir);
        echo join(PHP_EOL,$zend_lines);
        echo PHP_EOL;
    }
    if (empty($ini_file_name) || empty($sys['PHP_INI_DIR']) || ($sys['PHP_INI_BASENAME'] == $ini_file_name)) {
        $original_ini_file = isset($sys['PHP_INI'])?$sys['PHP_INI']:'';
    } else {
        $original_ini_file = $sys['PHP_INI_DIR'] . DIRECTORY_SEPARATOR . $ini_file_name;
    }
    if (empty($exclude_original) && !empty($original_ini_file) && @file_exists($original_ini_file)) {
        if (!empty($download)) {
            @readfile($original_ini_file);
        } else {
            echo all_ini_contents();
        } 
    }
}

function extra_page($check_access_to_info = true)
{
    if ($check_access_to_info) {
		info_disabled_check();
	}
    heading();
    $sys = get_sysinfo();
    $ini_loader = scan_inis_for_loader();
    $ini_loader_path = $ini_loader['location'];
    $loader_path = find_loader(true);
    $ldinf = get_loaderinfo();
    $self = get_self();
    echo "<h4>Additional Information</h4>";
    echo "<table>";
    $lines = array();
    if (is_string($loader_path)) {
        $lines['Loader is at'] = $loader_path;
        $loader_system = loader_system($loader_path);
        if (!empty($loader_system)) {
            $lines['Loader OS code'] = $loader_system['oscode'];
            $lines['Loader architecture'] = $loader_system['arch'];
            $lines['Loader word size'] = $loader_system['wordsize'];
            $lines['Loader PHP version'] = $loader_system['php_version'];
            $lines['Loader thread safety'] = $loader_system['thread_safe']?'Yes':'No';
            $lines['Loader compiler'] = $loader_system['compiler'];
            $lines['Loader version'] = $loader_system['loader_version'];
            $lines['File size is'] = filesize($loader_path) . " bytes.";
            $lines['MD5 sum is'] = md5_file($loader_path);
        }
        $lines['Loader file'] = "<a href=\"$self?page=loaderbin\">Download loader file</a>";
    } else {
        $lines['Loader file'] = "Loader cannot be found.";
    }
    $lines['Loader found in ini file'] = empty($ini_loader_path)?"No":"Yes";
    if (!empty($ini_loader_path) && (!is_string($loader_path) || $ini_loader_path != $loader_path)) {
        $lines['Loader location found in ini file'] =  $ini_loader_path;
        $loader_system = loader_system($ini_loader_path);
        if (!empty($loader_system)) {
            $lines['Ini Loader OS code'] = $loader_system['oscode'];
            $lines['Ini Loader architecture'] = $loader_system['arch'];
            $lines['Ini Loader word size'] = $loader_system['wordsize'];
            $lines['Ini Loader PHP version'] = $loader_system['php_version'];
            $lines['Ini Loader thread safety'] = $loader_system['thread_safe']?'Yes':'No';
            $lines['Ini Loader compiler'] = $loader_system['compiler'];
            $lines['Ini Loader version'] = $loader_system['loader_version'];
        }
    }
    $lines["OS extra security"] = (selinux_is_enabled() || possibly_selinux())?"SELinux":(grsecurity_is_enabled()?"Grsecurity":"None");
    $lines['PHPRC is'] = $sys['PHPRC'];
    $lines['INI DIR is'] = $sys['PHP_INI_DIR'];
    $lines['Additional INI files'] = $sys['PHP_INI_ADDITIONAL'];
    $stype = get_request_parameter('stype');
    $server_type = find_server_type($stype);
    $lines['Server type is'] = server_type_string();
    $lines["PHP uname"] = $ldinf['uname'];
    $lines['Server word size is'] = $ldinf['wordsize'];
    $lines['Disabled functions'] = ini_get('disable_functions');
    $writeable_dirs = writeable_directories();
    $lines['Writeable loader locations'] = (empty($writeable_dirs))?"<em>None</em>":join(", ",$writeable_dirs);
    if (!empty($_SESSION['hostprovider'])) {
        $lines['Hosting provider'] = $_SESSION['hostprovider'];
        $lines['Provider URL'] = $_SESSION['hosturl'];
    }
    foreach ($lines as $h => $i) {
        $v = (empty($i))?'<em>EMPTY</em>':$i;
        echo '<tr><th>'. $h . ':</th>' . '<td>' . $v . '</td></tr>';
    }
    echo "</table>";
    footer(true);
}

function loaderbin_page()
{
    info_disabled_check();
    $loader_path = find_loader(true);
    if (is_string($loader_path)) {
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='. basename($loader_path));
        @readfile($loader_path);
    }
}



function GoDaddy_root($html_root = '')
{
    if (empty($_SESSION['not_go_daddy']) && empty($_SESSION['godaddy_root'])) {
        $godaddy_pattern = "[\\/]home[\\/]content[\\/][0-9a-z][\\/][0-9a-z][\\/][0-9a-z][\\/][0-9a-z]+[\\/]html";

        if (empty($html_root)) {
            $html_root =  $_SERVER['DOCUMENT_ROOT'];
        }
        if (preg_match("@$godaddy_pattern@i",$html_root,$matches)) {
            $_SESSION['godaddy_root'] = $matches[0];
        } else {
            $_SESSION['not_go_daddy'] = 1;
            $_SESSION['godaddy_root'] = '';
        } 
    } elseif (!empty($_SESSION['not_go_daddy'])) {
        $_SESSION['godaddy_root'] = '';
    }
    if (!empty($_SESSION['godaddy_root'])) {
        $_SESSION['hostprovider'] = 'GoDaddy';
        $_SESSION['hosturl'] = 'www.godaddy.com';
    }
    return $_SESSION['godaddy_root'];
}

function GoDaddy_windows_instructions()
{
    $instr = "It appears that you are hosted on a Windows server at GoDaddy.<br/>";
    $instr .= "Please change to a Linux hosting plan at GoDaddy.<br />";
    $instr .=  "If you <a href=\"https://help.godaddy.com/\">contact their support team</a> they should be able to switch you to a Linux server.";

    echo $instr;
}

function GoDaddy_linux_instructions($html_dir)
{
    $base = get_base_address();
    $loader_name = get_loader_name();
    $zend_extension_line="<code>zend_extension = $html_dir/ioncube/$loader_name</code>";
    $php_ini_name = is_php_version_or_greater(5,0)?'php5.ini':'php.ini';
    $ini_path = $html_dir . '/' . $php_ini_name;

    $instr = array();
    $instr[] = 'In your html directory, ' . $html_dir . ', create a sub-directory called <b>ioncube</b>.';
    if (@file_exists($ini_path)) {
       $instr[] = "Edit the $php_ini_name in your  $html_dir and add the following line to the <b>top</b> of the file:<br>" . $zend_extension_line ;
    } else {
        $instr[] = "<a href=\"$base&amp;page=phpconfig&amp;ininame=$php_ini_name&amp;stype=s&amp;download=1&amp;prepend=1\">Save this $php_ini_name file</a> and upload it to your html directory, $html_dir";
    }
    $instr[] = 'Download the <a target="_blank" href="' . IONCUBE_DOWNLOADS_SERVER . '"/ioncube_loaders_lin_x86.zip">Linux ionCube Loaders</a>.';
    $instr[] = 'Unzip the loaders and upload them into the ioncube directory you created previously.';
    $instr[] = 'The encoded files should now be working.';

    echo '<div class=panel>';
    echo (make_list($instr));
    echo '</div>';
}

function GoDaddy_page()
{
    $base = get_base_address();

    heading();

        $inst_str = '<h4>GoDaddy Installation Instructions</h4>';
        $inst_str .= '<p>It appears that you are hosted with GoDaddy (<a target="_blank" href="https://www.godaddy.com/">www.godaddy.com</a>). ';
        $inst_str .= "If that is <b>not</b> the case then please <a href=\"$base&amp;page=default&amp;host=ngd\">click here to go to the main page of this installation wizard</a>.</p>";
        $inst_str .= "<p>If you have already installed the loader then please <a href=\"$base&amp;page=loader_check\" onclick=\"showOverlay();\">click here to test the loader</a>.</p>";

        echo $inst_str;

        if (is_ms_windows()) {
            GoDaddy_windows_instructions();
        } else {
            GoDaddy_linux_instructions($_SESSION['godaddy_root']);
        }

    send_stats('gd_default');

    footer(true);
}



function get_request_parameter($param_name)
{
    static $request_array;

    if (!isset($request_array)) {
        if (isset($_GET)) {
            $request_array = $_GET;
        } elseif (isset($HTTP_GET_VARS)) {
            $request_array = $HTTP_GET_VARS;
        }
    }

    if (isset($request_array[$param_name])) {
        $return_value = strip_tags($request_array[$param_name]);
    } else {
        $return_value = null;
    }
    return $return_value;
}

function make_list($list_items,$list_type='ol')
{
    $html = '';
    if (!empty($list_items)) {
        $html .= "<$list_type>";
        $html .= '<li>';
        $html .= join('</li><li>',$list_items);
        $html .= '</li>';
        $html .= "</$list_type>";
    }
    return $html;
} 

function make_archive_list($basename,$archives_list = array(),$download_server = IONCUBE_DOWNLOADS_SERVER)
{
    if (empty($archives_list)) {
        $archives_list = array('tar.gz','zip');
    }

    foreach ($archives_list as $a) {
        $link_text = $a;
        $ext_sep = '.';
        $archive_list[] = "<a href=\"$download_server/$basename$ext_sep$a\">$link_text</a>";
    }

    return make_list($archive_list,"ul");
}

function error($m)
{
    die("<b>ERROR:</b> <span class=\"error\">$m</span><p>Please help us improve this script by <a href=\"". SUPPORT_SITE . "\">reporting this error</a> and including the URL to the script so that we can test it.");
}


function filter_server_input($server_var)
{
	$res = htmlspecialchars($_SERVER[$server_var], ENT_QUOTES, "UTF-8");
	return $res;
}

function failsafe_get_self()
{
    $result = '';
    $sfn = filter_server_input('SCRIPT_FILENAME');
    $dr = $_SERVER['DOCUMENT_ROOT'];
    if (!empty($sfn) && !empty($dr)) {
        if ($dr == '/' || $dr == '\\') {
            $result = $sfn;
        } else {
            $drpos = strpos($sfn,$dr);
            if ($drpos === 0) {
                $drlen = strlen($dr);
                $result = substr($sfn,$drlen);
            }
        }
        $result = str_replace('\\','/',$result);
    }
    if (empty($result)) {
        $result = DEFAULT_SELF;
    }
    return $result;
}

function get_self()
{ 
	$page = '';
    if (empty($_SERVER['PHP_SELF'])) {
        if (empty($_SERVER['SCRIPT_NAME'])) {
            if (empty($_SERVER['REQUEST_URI'])) {
                $page = failsafe_get_self();
            } else {
                $page = filter_server_input('REQUEST_URI');
            }
        } else {
            $page = filter_server_input('SCRIPT_NAME');
        }
    } else {
        $page = filter_server_input('PHP_SELF');
    }
	return $page;
}

function get_default_page()
{
    $godaddy_root = GoDaddy_root();
    if (empty($godaddy_root)) {
         $page = 'default';
    } else {
         $page = 'GoDaddy';
    }
    return $page;
}

function get_base_address()
{
    $self = get_self();
    $remote_timeout = (isset($_SESSION['timing_out']) && $_SESSION['timing_out'])?'timeout=1':'timeout=0';
    $using_ini = (isset($_SESSION['use_ini_method']) && $_SESSION['use_ini_method'])?'ini=1':'ini=0';
    return $self . '?' . $remote_timeout . '&' . $using_ini;
}

function get_default_address($include_timeout = true)
{
    if ($include_timeout) {
        $base =  get_base_address();
        $base .= "&amp;";
    } else {
        $base = get_self();
        $base .= "?";
    }
    $page = get_default_page();

    return $base . 'page=' . $page;
}

function heading()
{
    $self = get_self();

    echo <<<EOT
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <meta name="robots" content="noindex, nofollow">
    <head>
        <title>ionCube Loader Wizard</title>
        <link rel="stylesheet" type="text/css" href="$self?page=css">
        <script type="text/javascript">
            function showOverlay()
            {
                document.getElementById('overlay').style.display = 'block';
                return true;
            }

            function hideOverlay()
            {
                document.getElementById('overlay').style.display = 'none';
                return true;
            }
        </script>
    </head>
    <body onload="hideOverlay()">
    <div id="overlay">
        <div id="inner_overlay">Checking server configuration<br>Please wait</div>
    </div>
    <div id="header">
        <img src="?page=logo" alt="ionCube logo">
    </div>
	<div id="important">
	<h3 class="important">IMPORTANT: Ensure that This Script Is Removed When No Longer Required</h3>
	</div>
    <div id="main">
    <h2>ionCube Loader Wizard</h2>
EOT;
}

function footer($update_info = null)
{
    $self = get_self();
    $base = get_base_address();
    $default = get_default_address(false);
    $year = gmdate("Y");

    echo "</div>";
    echo "<div id=\"footer\">" .
    "Copyright ionCube Ltd. 2002-$year | " .
    "Loader Wizard version " . script_version() . " ";

    if ($update_info === true) {
        $update_info = check_for_wizard_update(false);  
    }
    $loader_wizard_loc = LOADER_WIZARD_URL;
    $wizard_version_string =<<<EOT
    <script type="text/javascript">
    var xmlhttp;
    function version_check()
    { 
        var body = document.getElementsByTagName('body')[0];
        var ldel = document.getElementById('loading');
        if (!ldel) {
            body.innerHTML += '<div id="loading"></div>';
            ldel = document.getElementById('loading');
        }
        ldel.innerHTML = '<p>Retrieving Wizard version information<br>Please wait</p>';
        ldel.style.display = 'block';
        ldel.style.height = '300px';
        ldel.style.left = '200px';
        ldel.style.border = '4px #660000 solid';
        if (window.XMLHttpRequest) {
            xmlhttp=new XMLHttpRequest();
        } else {
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function()
        {
            var loadedOkay = 0;
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                var wizardversion = xmlhttp.responseText;
                var msg;
                clearTimeout(xmlHttpTimeout);
                buttons = '';
                if (wizardversion == '1') {
                    msg = 'You have the current version of the<br>ionCube Loader Wizard'; 
                } else if (wizardversion != '0') {
                    msg = 'A new version, ' + wizardversion + ', of the loader wizard is available';
                    buttons = '<button onclick="document.getElementById(\'loading\').style.display=\'none\'; window.open(\'$loader_wizard_loc\'); return false">Get new version</button> &nbsp;'; 
                } else {
                    msg = 'Wizard version information cannot be obtained from the<br>ionCube server';
                }
                buttons += '<button onclick="document.getElementById(\'loading\').style.display=\'none\'; return false">Close this box</button>'; 
                ldel.innerHTML = '<p>' + msg +  '<br>' + buttons + '</p>';
            }
        }
        xmlhttp.open("GET",'$self?page=wizardversion&wizard_only=1&clear_info=1',true);
        xmlhttp.send();
        var xmlHttpTimeout=setTimeout(ajaxTimeout,7000);
    }
    function ajaxTimeout(){
       xmlhttp.abort();
       msg = 'Wizard version information cannot be obtained from the<br>ionCube server';
       button = '<button onclick="document.getElementById(\'loading\').style.display=\'none\'; return false">Close this box</button>';
       var ldel = document.getElementById('loading');
       ldel.innerHTML = '<p>' + msg +  '<br>' + button + '</p>';
    }
    </script>
EOT;

    $wizard_version_string .= '('; 
    if ($update_info === null) {
        $wizard_version_string .= '<a target="_blank" href="' . $loader_wizard_loc . '" onclick="version_check();return false;">check for new version</a>';
    } else if ($update_info !== false) {
        $wizard_version_string .= '<a href="' . LOADERS_PAGE .'" target="_blank">download version ' . $update_info . '</a>';
    } else {
        $wizard_version_string .=  "current";
    }
    $wizard_version_string .= ')'; 
    echo $wizard_version_string;

    $server_type_code = server_type_code();
	
	if (!info_should_be_disabled(true)) {
		echo " | <a href=\"$base&amp;page=phpinfo\" target=\"phpinfo\">phpinfo</a>";
		echo " | <a href=\"$base&amp;page=phpconfig\" target=\"phpconfig\">config</a>";
		echo " | <a href=\"$base&amp;page=extra&amp;stype=$server_type_code\" target=\"extra\">additional</a>";
	}

    echo " | <a href=\"$default\" onclick=\"showOverlay();\">wizard start</a>";
    echo " | <a href=\"$base&amp;page=loader_check\" onclick=\"showOverlay();\">loader test</a>";
    echo ' | <a href="' . LOADERS_PAGE . '" target="loaders">loaders</a>';

    echo "</div>\n";
    echo "\n</body></html>\n";
}

function css_page()
{
    header('Content-Type: text/css');
    echo <<<EOT
    body {
        font-family: verdana, helvetica, arial, sans-serif;
        font-size: 10pt;
        line-height: 150%;
        margin: 0px;
        min-height: 400px;
        position: relative;
    }

    code {
        color: #c00080;
    }

    li {
        margin-top: 10px;
    }
    #overlay {
        display: block;
        z-index: 100;
        position: absolute;
        top: 0;
        left: 0;
        padding: 0;
        margin: 0;
        width: 100%;
        height: 100%;
        background-color: white;
    }
    #inner_overlay {
        display: block;
        z-index: 100;
        position: absolute;
        font-size: 200%;
        color: #660000;
        top: 50%;
        left: 25%;
        width: 460px;
        height: 460px;
        line-height: 200%;
        text-align: center;
        vertical-align: middle;
    }

    #loading {
        display: block;
        position: absolute;
        top: 33%;
        left: 25%;
        margin: auto;
        height: 320px;
        width: 460px;
        padding: 4px;
        color: #660000;
        background-color: white;
        z-index: 100;
    }

    #loading p {
        position: absolute;
        margin-top: 10px;
        text-align: center;
        vertical-align: middle;
        padding-left: 40px;
        padding-right: 30px;
        font-size: 200%;
        line-height: 200%;
    }

    #loading p span#status{
        font-size: 60%;
        line-height: 120%;
    }
    #loading p#noscript {
        font-size: 120%;
        line-height: 120%;
        position: absolute;
        text-align: left;
        padding-top: 10px;
        bottom: 0;
    }
    #loading p#noscript a {
        text-align: center;
    }

    #loading button {
        margin-top: 20px;
        line-height: 100%;
        padding-top: 4px;
        padding-bottom: 4px;
    }


    h4 {
        margin-bottom: 0;
        padding-bottom: 4px;
    }

    p,#main div {
        max-width: 1000px;
        width: 75%;
    }

    #hostinginfo {
        margin-top: 10px;
        margin-left: 20px;
    }
    #hostinginfo table {
        font-size: 1.00em;
    }
    #hostinginfo table td {
        padding-right: 4px;
    }
    #hostinginfo input {
        margin-top: 6px;
    }

    #hostinginfo label {
        margin-left: 6px;
    }

    th {
        text-align: left;
    }
	
	#important {
		margin-top: 12px;
	} 
	h3.important {
		margin: 0;
		border: 0;
        border-top: 1px solid #660000;
		border-bottom: 1px solid #660000;
        padding: 1ex 0 1ex 0;
        background-color: #CB2430;
		text-align: center;
        color: #ffffff; 
        width: 100%;
	}

    .alert {
        margin: 2ex 0;
        border: 1px solid #660000;
        padding: 1ex 1em;
        background-color: #ffeeee;
        color: #660000; 
        width: 75%;
    }

    .warning {
        margin: 2ex 0;
        border: 1px solid #FFBF00;
        padding: 1ex 1em;
        background-color: #FDF5E6;
        color: #000000; 
        width: 75%;
    }

    .success {
        margin: 2ex 0;
        border: 1px solid #006600;
        padding: 1ex 1em;
        background-color: #EEFFEE;
        color: #000000; 
        width: 75%;
    }

    .error {
        color: #FF0000;
    }

    .panel {
        border: 1px solid #c0c0c0;
        background-color: #f0f0f0;
        width: 75%;
        padding: 1ex 1em;
    }
	
	.terminal {
		border: none;
		background-color: #000000;
		color: #ffffff;
		width: 50%;
		padding: 1ex 1em;
	}

    #header {
        background: #fff;
    }

    #footer {
        border-top: 1px solid #404040;
        margin-top: 20px;
        padding-top: 10px;
        padding-left: 20px;
        font-size: 75%;
        text-align: left;
    }

    #main {
        margin: 20px;
    }
	
	
	#main .ic24 {
		position: relative;
		width: 75%;
		height: auto;
		border-width: 1px 1px 1px 1px;
		border-style: solid;
		border-color: #4B8DF8;   
		background-color: #EFEFFF;
		padding: 12px;
		padding-top: 16px;
		padding-bottom: 8px;
		margin-top: 20px;
		overflow: hidden;
	}
	
	#main .ic24 p {
		width: 100%;
	}
	
	
	#main .ic24graphic {
		position: relative;
		width: auto;
		height: auto;
		border: none;
		padding: 0px;
		padding-right: 16px;
		margin: 0px;
		float: left;
		
	}
	
	#main #ic24info {
		position: relative;
		width: auto;
		height: auto;
		float: left;
	}
	
	#main #ic24info a {
		color: #0B4DB8;
		text-decoration: none;
	}
	
	#main #ic24logo {
		max-width: 132px;
		max-height: 132px;
	}
	
EOT;
}

function logo_page()
{
$img_encoded = 'iVBORw0KGgoAAAANSUhEUgAAAakAAACABAMAAABD1osiAAAAKlBMVEUAAAAAAADnHCwAAAAAAAAAAAAAAAAAAABMCQ4AAADnHCznHCznHCwAAAAjcBE1AAAADHRSTlMAeDRHwSqg4BJl/PLTJLuIAAAF1UlEQVR42u2by4vTQBzHp3TTzR6EBtfXYS/+BZW6Pg6FFavgoRDBBx4KFd+HQgWFvQQqiuJhoeL7sP+LR0EPlj6yPfz+F5NMZ77TmmJjM3ZT5nNpOzvNzGcev5lMusxgMBgMBoPBYDAYDAaDwWDQwel5YRnC/jkvbZYdjFV2MFbZwVhlB2OVIVZyb2HIED/n5AfLEj/nhWUJY5UdjFV2MFbZwVgdMqzNZydXz2qrf59Kq2a1NmTsRnfVrLZOfj3VrrkrZuVb/dpBvZEJqzOOc5TNQ75rjXKDtV+ZsNoi6rJ52OhZwxONwiGwsi46zqnt1Kx8r7N8q/wmRfhP3BSsrK7VW/u13krDysGwT8o5kvilxa2YZ/U2eulEC0KhCTlLCo0UrPYff7Tfe+2lWt0glTT6qjB02e0eW6ZVjiZYaF4hq+eXlmll1yik75TL5eMeDVOxsj89hNQyrN5QyDFRm9GCVmCZVrYXBr4OE9w8ZFbBCNr+x646ycAhs/o3moFUj62Y1UY4/txVs9oLrAZs1azCAVhaNSsLgXNpVt/+dlNXZAplx4mLiXecU5hHhcBqN6lV/p3znk1xEYUltfr+t0J/4dN1jwKGWIg+VKuBdL5JAQ9EYj34ILOAjWq12lG+eE2xsk9EF/7CFN7WKOCpq9kK2/CTyp93mFUbpyKRZmwNi2oX4Y0dfgULd8QL4vRdvVavJ+6XYLVPIQjmHq9xAqvbJBTa8paTBCOtVpZHY1DrSmCF7flABotBIiuLJM+RQdJJO1qoVnUKqfLh1pBWrX10YVu0ciuRVXjlfpUiXGSmp85xdFaaT7thZUV95I5DRldaDYJPT8oXmyQqnYP0nFZetL23tgjtsT/e8uc9mKa3XsFqL3Rpy3YsCSufhwmrJgbeGmo/jxUCjd2UzWWFg1EuEzv6rJoY4ftyQapghBRElda5cxKrEfaPvGPWw+Esyx1ps8pHhaP0LqxK8p7KZwFHklt1kEqNcbsNcFfT12a1zgtEv7WFVZehB93xUGVJrPg7MXgPxotDUWlCV5dVhYtgjhV5KuLd+jixktjqYHoHmVcLw9fSt2ry8lDBlrAqKomN5FZI5aX0+Rztqmk7uqywtGKhRQ+KmbeT3AoDDN89gsJQBQ1WWFrFpmgkIruq2kpuhWCASFNBYXxN1GGFKk1XqqLWiXjeOvpv3n2gpBDm4dtL1aqnyaqAcA2bGCu0d3Ir5GkSPasKsFlO3WpNGf68P3wdVhs84tRIRZ/VEUwWfIyxwo4puRUiDh0+q2jntnJWOf6aplVv+VZ5VGMBq3tlhQuarNYnw3V9Zgzkr8PFYiByAi0xcM7ILva+7kJWNeyktVoV5l2FeSI1kluh8UKrlnar6dv2qNhejBVG6yDeaifOajg5X9tR4sH/sLIIBeFTjJV4JMImmd5KNmGFvHxfyV9Guq2mDvnQc9NWyIuOBWrD2BSzZ4fsHi6rzUq26cRdY2e2VSU+ChJ6IDdh1Zi+wylAVa9VfWqu+2y2VYFiO6uGzHsTVj01WOxgsOq3KqB0nMbMsLK96fNxKVASgrDCSogcHjpbq5WNg1WcVsRY4Zi3i1Xblqm7OLFXrHbRWn2GxUG/FduX0yIHwRlWFomD3ojrT+Vxje+KE3tYiQ6ym3JJKKidnW9rscJkuSwOiUdsphXO5P2724y9PPOI+njMMSyxOzWiTViF7/0v4kS6gzEcZA0545X0WbFmVClnk1B4vJXsDYArcPzXitUxCnhW5f070SyXHGfTw1jUYVUgMGKzrTBKQQk/LonYzSlWxToyFuOapaXRim2hqd2/WbFbJEBlLTx8k1a1QNmaai0eUMBAp5XVFFIdNtMqVqs/nhmvpGQuSJRWUmHoMsl5klzRacWsE4Sn3TOswMtH9Mfvbj+L36JNWrFzUgqcE6ofdf8X9PXN6qWjbF5eOverV51ye/ICd+NCWv549er0ha3o69vMYDAYDAaDwWAwGAwGg8FgSJffF2mwYDNbStYAAAAASUVORK5CYII=';

    header('Content-Type: image/png');
    header('Cache-Control: public');
    echo base64_decode($img_encoded);
}

function ic24logo_page()
{
	$img_encoded = 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6b3NiPSJodHRwOi8vd3d3Lm9wZW5zd2F0Y2hib29rLm9yZy91cmkvMjAwOS9vc2IiCiAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgogICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB2ZXJzaW9uPSIxLjAiCiAgIHdpZHRoPSI2OTAiCiAgIGhlaWdodD0iNjkxLjI1IgogICB2aWV3Qm94PSIwIDAgNTUyIDU1MyIKICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIKICAgaWQ9InN2ZzMwMzUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDguNSByMTAwNDAiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImlvbkN1YmUyNF9jdWJlLnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczMwODMiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzQ5IgogICAgICAgb3NiOnBhaW50PSJzb2xpZCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxMjczYjg7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTM1MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNDMiCiAgICAgICBvc2I6cGFpbnQ9InNvbGlkIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MzQ1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NTMzNyIKICAgICAgIG9zYjpwYWludD0ic29saWQiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTI3M2I4O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDUzMzkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ1MzMxIgogICAgICAgb3NiOnBhaW50PSJzb2xpZCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNTMzMyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzMjUiCiAgICAgICBvc2I6cGFpbnQ9InNvbGlkIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzEyNzNiODtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A1MzI3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mzg4NSIKICAgICAgIG9zYjpwYWludD0ic29saWQiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMTI3M2I4O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDM4ODciIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQzODc5IgogICAgICAgb3NiOnBhaW50PSJzb2xpZCI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMxMjczYjg7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzg4MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM4NzMiCiAgICAgICBvc2I6cGFpbnQ9InNvbGlkIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzEyNzNiODtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AzODc1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NTMzNyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDUzNDEiCiAgICAgICB4MT0iNDQzNS40NDI0IgogICAgICAgeTE9IjI5NDkuMDQyIgogICAgICAgeDI9IjQ4MzQuMzkyMSIKICAgICAgIHkyPSIyOTQ5LjA0MiIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiAvPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNDIiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNDQiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNDYiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNDgiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNTAiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNTIiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNTQiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNTYiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNTgiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNjAiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNjIiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNjQiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNjYiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNjgiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNzAiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNzIiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogICAgPGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDMxNzQiPgogICAgICA8cGF0aAogICAgICAgICBkPSJtIDE2MDM0LDIyMzYgYyAtMywtOCAtMywtMzQwIC0xLC03MzggNSwtNzg5IDQsLTc4NiA2NiwtOTc3IDQyLC0xMzAgOTIsLTIxNCAxODUsLTMwNyAxMjgsLTEyOCAyNTcsLTE4MSA0NjcsLTE5MSAyNDYsLTEyIDQ2Miw2OSA2MjksMjM3IDM2LDM2IDgwLDg3IDk4LDExNCAxNywyNyAzMyw0OCAzMyw0NSAxLC0yIDcsLTgwIDEzLC0xNzQgbCAxMSwtMTcwIDE3OSwtMyAxNzgsLTIgLTYsNDIgYyAtNCwyNCAtOSw1MTQgLTEyLDEwOTEgbCAtNiwxMDQ3IC0xOTYsLTIgLTE5NywtMyAtNSwtNzMwIGMgLTQsLTUwOCAtOSwtNzQwIC0xNywtNzYyIC0xMDIsLTI4NCAtMzY2LC00NDUgLTY0NCwtMzkzIC0xNzgsMzQgLTI5OSwxNzIgLTM1MSw0MDAgLTIxLDkxIC0yMiwxMjMgLTI1LDc5MyBsIC00LDY5NyAtMTk1LDAgYyAtMTU4LDAgLTE5NiwtMyAtMjAwLC0xNCB6IgogICAgICAgICBpZD0icGF0aDMxNzYiCiAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8L2NsaXBQYXRoPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAxOCIKICAgICBpZD0ibmFtZWR2aWV3MzA4MSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMC45NjUzODc0IgogICAgIGlua3NjYXBlOmN4PSI3MjQuNTI3MjIiCiAgICAgaW5rc2NhcGU6Y3k9IjMzMy4xMTQ1MSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMzAzNSIKICAgICBmaXQtbWFyZ2luLXRvcD0iMCIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAiCiAgICAgZml0LW1hcmdpbi1yaWdodD0iMCIKICAgICBmaXQtbWFyZ2luLWJvdHRvbT0iMCIgLz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEzMDM3Ij4KQ3JlYXRlZCBieSBwb3RyYWNlIDEuMTEsIHdyaXR0ZW4gYnkgUGV0ZXIgU2VsaW5nZXIgMjAwMS0yMDEzCjxyZGY6UkRGPgogIDxjYzpXb3JrCiAgICAgcmRmOmFib3V0PSIiPgogICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICA8ZGM6dHlwZQogICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICA8L2NjOldvcms+CjwvcmRmOlJERj4KPC9tZXRhZGF0YT4KICA8ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuMSwwLDAsLTAuMSwtNCw1NTcpIgogICAgIGlkPSJnMzAzOSIKICAgICBzdHlsZT0iZmlsbDojMDAwMDAwO3N0cm9rZTpub25lIj4KICAgIDxwYXRoCiAgICAgICBkPSJtIDQwLDQ3MDAgMCwtODcwIDg3MCwwIDg3MCwwIC0yLDg2OCAtMyw4NjcgLTg2NywzIC04NjgsMiAwLC04NzAgeiIKICAgICAgIGlkPSJwYXRoMzA0MSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxOTMwLDQ3MDAgMCwtODcwIDg3MCwwIDg3MCwwIDAsODcwIDAsODcwIC04NzAsMCAtODcwLDAgMCwtODcwIHoiCiAgICAgICBpZD0icGF0aDMwNDMiCiAgICAgICBzdHlsZT0iZmlsbDojYzAxZDJlO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDM4MjcsNTU2MyBjIC00LC0zIC03LC0zOTUgLTcsLTg3MCBsIDAsLTg2MyA4NzAsMCA4NzAsMCAwLDg3MCAwLDg3MCAtODYzLDAgYyAtNDc1LDAgLTg2NywtMyAtODcwLC03IHoiCiAgICAgICBpZD0icGF0aDMwNDUiCiAgICAgICBzdHlsZT0iZmlsbDojYzAxZDJlO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDQwLDI4MDAgMCwtODcwIDg2OCwyIDg2NywzIDMsODY4IDIsODY3IC04NzAsMCAtODcwLDAgMCwtODcwIHoiCiAgICAgICBpZD0icGF0aDMwNDciCiAgICAgICBzdHlsZT0iZmlsbDojYzAxZDJlO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDE5MzAsMjgwMCAwLC04NzAgODcwLDAgODcwLDAgMCw4NzAgMCw4NzAgLTg3MCwwIC04NzAsMCAwLC04NzAgeiBtIDEwMzUsNjMwIGMgODAsLTMxIDE1NCwtMTAyIDE5MSwtMTgzIDI1LC01NCAyOCwtNzQgMjksLTE1NyAwLC0xOTAgLTc0LC0zMTggLTM0NCwtNTkyIGwgLTE3NCwtMTc4IDI3NiwwIDI3NywwIDAsLTgwIDAsLTgwIC00MDcsMiAtNDA4LDMgLTMsNTYgLTMsNTUgMTgxLDE3NCBjIDM1NSwzMzkgNDUyLDQ5MyA0MjMsNjY3IC0xOSwxMDYgLTcxLDE2MiAtMTcyLDE4NCAtOTIsMjAgLTIwMiwtNiAtMjkzLC02OSBsIC00NiwtMzEgLTI2LDU4IGMgLTE0LDMyIC0yNiw2MiAtMjYsNjYgMCwyMiAxNDcsOTkgMjI4LDEyMCA4MiwyMSAyMjEsMTQgMjk3LC0xNSB6IgogICAgICAgaWQ9InBhdGgzMDQ5IgogICAgICAgc3R5bGU9ImZpbGw6IzEyNzNiODtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAzODIyLDI4MDMgMywtODY4IDg2OCwtMyA4NjcsLTIgMCw4NzAgMCw4NzAgLTg3MCwwIC04NzAsMCAyLC04NjcgeiBtIDExNzgsMjQyIDAsLTM5NSA5MCwwIDkwLDAgMCwtNzAgMCwtNzAgLTkwLDAgLTkwLDAgMCwtMTcwIDAsLTE3MCAtODUsMCAtODUsMCAwLDE3MCAwLDE3MCAtMjkwLDAgLTI5MCwwIDAsNjMgMCw2NCAyODEsNDAxIDI4MSw0MDIgOTQsMCA5NCwwIDAsLTM5NSB6IgogICAgICAgaWQ9InBhdGgzMDUxIgogICAgICAgc3R5bGU9ImZpbGw6IzEyNzNiODtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybyIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA0NzkwLDMxNzMgYyAtMjQsLTQzIC0xMTEsLTE3MiAtMTk1LC0yODggLTgzLC0xMTUgLTE1NSwtMjE2IC0xNTksLTIyMiAtNiwtMTAgMzUsLTEzIDE5MywtMTMgbCAxOTksMCA0LDI5OCBjIDIsMTYzIDMsMjk4IDIsMzAwIC0xLDIgLTIxLC0zMiAtNDQsLTc1IHoiCiAgICAgICBpZD0icGF0aDMwNTMiCiAgICAgICBzdHlsZT0iZmlsbDp1cmwoI2xpbmVhckdyYWRpZW50NTM0MSk7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTg1MTYsMTc0MyBjIC0zLC04MzUgLTksLTE1NTMgLTEyLC0xNTk1IGwgLTYsLTc4IDE3MCwwIDE3MCwwIDcsODggYyAzLDQ4IDksMTI3IDEzLDE3NiBsIDcsODkgNDAsLTU5IGMgNTMsLTc3IDE2MCwtMTgxIDIyOSwtMjIzIDEyOCwtNzcgMjQ4LC0xMTEgNDIxLC0xMTggMjEwLC05IDM4NywzOCA1NTIsMTQ3IDI3NiwxODEgNDM4LDQ4MiA0NzQsODc5IDM5LDQzMyAtMTA1LDgzOSAtMzc1LDEwNTYgLTE1NSwxMjUgLTMzMCwxODUgLTU0MSwxODUgLTE5OSwwIC0zNTcsLTQwIC00OTMsLTEyNiAtNzEsLTQ1IC0xODMsLTE1MyAtMjI1LC0yMTkgbCAtMzIsLTUwIC0zLDY4MyAtMiw2ODIgLTE5NCwwIC0xOTQsMCAtNiwtMTUxNyB6IG0gMTE1NSwyMjMgYyAxNDksLTMyIDMwNSwtMTQ4IDM4OCwtMjg5IDc5LC0xMzUgMTIxLC0zMTMgMTIxLC01MTIgMCwtMTk2IC0zNSwtMzU2IC0xMDgsLTUwMCAtNDMsLTg0IC0xNzEsLTIxNyAtMjQ5LC0yNTggLTc3LC00MSAtMTkyLC02NyAtMjk0LC02NyAtMTE2LDAgLTE3NywxMyAtMjc4LDYyIC0xNDYsNjkgLTI1OCwyMDMgLTMxNywzNzggLTE3LDQ5IC0xOSw4OCAtMTksMzYwIDAsMzA1IDAsMzA1IDI3LDM4NSAzNywxMDkgOTEsMTk2IDE2OSwyNzUgNzQsNzQgMTkwLDE0MSAyODYsMTY0IDc2LDE5IDE5MSwxOSAyNzQsMiB6IgogICAgICAgaWQ9InBhdGgzMDU1IgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMzE3NCkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTQ2MTAsMzEzOSBjIC01MTgsLTY1IC05NDQsLTM1NyAtMTE2NCwtNzk3IC0xNDEsLTI4MCAtMjAxLC02MzYgLTE2NiwtOTgzIDcyLC03MTEgNDgwLC0xMTc3IDExNDcsLTEzMTAgMjExLC00MiA1NTcsLTM2IDgxMywxMiAxMTksMjMgMzIwLDg2IDMyNiwxMDMgNiwxNyAtNzIsMzExIC04MiwzMDkgLTUsLTEgLTQ5LC0xNiAtOTcsLTMzIC0xNDcsLTUyIC0yNjIsLTcxIC00NzAsLTc3IC0yMTAsLTYgLTMyMCw0IC00NTcsNDQgLTQzNywxMjYgLTcwNSw0NzIgLTc2MSw5NzkgLTE1LDE0MCAtNSwzODggMjAsNTE0IDYwLDI5OSAxOTgsNTM2IDQwMyw2OTAgMjIzLDE2OSA0NzIsMjM4IDgwOCwyMjcgMTg0LC02IDMwNywtMjggNDQyLC03OCA0NiwtMTYgODksLTMxIDk2LC0zMiA5LC0xIDMwLDQ5IDYyLDE1MyAyNyw4NSA0OCwxNTUgNDcsMTU2IC01Miw0MCAtMjc2LDEwMSAtNDU3LDEyMyAtOTcsMTMgLTQxNCwxMiAtNTEwLDAgeiIKICAgICAgIGlkPSJwYXRoMzA1NyIKICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMxNzApIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDczNzAsMjg1NSAwLC0xOTUgMjEwLDAgMjEwLDAgMCwxOTUgMCwxOTUgLTIxMCwwIC0yMTAsMCAwLC0xOTUgeiIKICAgICAgIGlkPSJwYXRoMzA1OSIKICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMxNjYpIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDIzODg2LDMwMjQgYyAtOTksLTE4IC0yNjQsLTczIC0zNDgsLTExNSAtNzEsLTM1IC0yMTgsLTEzMCAtMjM3LC0xNTMgLTEwLC0xMiAwLC00MCA1MCwtMTUwIDM0LC03NSA2MywtMTM2IDY1LC0xMzYgMSwwIDM2LDI0IDc3LDUzIDE2NiwxMTkgMzI0LDE3NiA1MTMsMTg0IDMwOCwxNCA1MDMsLTEwOCA1ODAsLTM2MiAxNCwtNDYgMTksLTkzIDE5LC0yMDAgLTEsLTE3MSAtMTksLTI0NyAtMTAwLC00MTAgLTEzMCwtMjYxIC0zODAsLTU0MyAtMTA0NCwtMTE4MCBsIC0yNTAsLTI0MCAtMSwtMTIyIDAsLTEyMyA5MzUsMCA5MzUsMCAwLDE2NSAwLDE2NSAtNjU3LDAgLTY1NywwIDEwOSwxMDEgYyA2MSw1NiAyMTgsMjEwIDM1MCwzNDMgMzQyLDM0NSA1MTgsNTYzIDYzNCw3ODYgMTc5LDM0NSAxOTgsNjc4IDU3LDk2NSAtODEsMTYzIC0xODgsMjcwIC0zNTEsMzUxIC0xNDEsNzAgLTIxOSw4NiAtNDI1LDkwIC0xMjUsMiAtMTk4LC0xIC0yNTQsLTEyIHoiCiAgICAgICBpZD0icGF0aDMwNjEiCiAgICAgICBzdHlsZT0iZmlsbDojMTI3M2I4O2ZpbGwtb3BhY2l0eToxIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMzE2MikiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjY2ODEsMjk3NyBjIC02LC04IC0yOTksLTQyNSAtNjUxLC05MjggbCAtNjQwLC05MTQgMCwtMTMyIDAsLTEzMyA2ODAsMCA2ODAsMCAwLC00MDAgMCwtNDAwIDE4NSwwIDE4NSwwIDAsNDAwIDAsNDAwIDIwNSwwIDIwNSwwIDAsMTU1IDAsMTU1IC0yMDUsMCAtMjA1LDAgMCw5MDUgMCw5MDUgLTIxNCwwIGMgLTE2NiwwIC0yMTYsLTMgLTIyNSwtMTMgeiBtIDcxLC0xMDg0IC0zLC03MTMgLTQ4MCwwIGMgLTM4MiwwIC00NzksMyAtNDczLDEzIDUsNiAxNjYsMjMwIDM1OCw0OTcgMzQ3LDQ4MSAzOTksNTYwIDUzMCw3OTggMzgsNjggNjksMTIyIDcwLDEyMCAwLC0yIDAsLTMyNCAtMiwtNzE1IHoiCiAgICAgICBpZD0icGF0aDMwNjMiCiAgICAgICBzdHlsZT0iZmlsbDojMTI3M2I4O2ZpbGwtb3BhY2l0eToxIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMzE1OCkiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTE5MjcsMjI4OCBjIC0xMDgsLTEwIC0yNDgsLTU1IC0zNDEsLTExMCAtODIsLTQ4IC0yMDMsLTE2MCAtMjQ3LC0yMjkgLTE3LC0yNyAtMzQsLTQ3IC0zOCwtNDQgLTMsNCAtMTAsODIgLTE2LDE3MyBsIC0xMCwxNjcgLTE3OSwzIC0xNzgsMiA2LC00NyBjIDQsLTI3IDksLTUxNyAxMiwtMTA5MCBsIDYsLTEwNDMgMTk5LDAgMTk4LDAgMyw3MjcgMyw3MjggMzEsNzIgYyAxMTMsMjYwIDM0MSwzOTggNTk4LDM2MiAxNjQsLTIyIDI3NiwtMTAzIDM0NiwtMjUxIDczLC0xNTQgNzIsLTE0OCA3NywtOTM1IGwgNSwtNzAzIDE5NCwwIDE5NCwwIDAsNzIzIGMgMCw3OTYgLTIsODI0IC02Miw5OTcgLTEyMSwzNDcgLTQyMCw1MzMgLTgwMSw0OTggeiIKICAgICAgIGlkPSJwYXRoMzA2NSIKICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMxNTQpIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDczOTAsMTE4MCAwLC0xMTEwIDE5MCwwIDE5MCwwIDAsMTExMCAwLDExMTAgLTE5MCwwIC0xOTAsMCAwLC0xMTEwIHoiCiAgICAgICBpZD0icGF0aDMwNjciCiAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzMTUwKSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSA5MTk5LDIyODAgYyAtMjIwLC0zNyAtNDE4LC0xMzggLTU3MCwtMjg5IC0xNTAsLTE1MSAtMjQyLC0zMjkgLTI5NSwtNTcxIC0yNiwtMTE5IC0yNywtNDI5IC0xLC01NDcgNTIsLTI0NCAxNDksLTQyNiAzMDUsLTU3NSAxODcsLTE3OCAzOTYsLTI2NCA2NjgsLTI3NSA1MDAsLTIxIDkxMiwyNTEgMTA2NSw3MDQgNTQsMTYxIDY0LDIzMCA2Myw0NDggMCwxNjcgLTMsMjE1IC0yMSwyOTEgLTEwMyw0NDEgLTM5MCw3MzAgLTgwMyw4MDggLTg3LDE3IC0zMjYsMjAgLTQxMSw2IHogbSAzMzQsLTMwNSBjIDI1NSwtNjYgNDM4LC0zMDggNDg3LC02NDQgMTcsLTExNiA4LC0zNDMgLTE4LC00NDIgLTY0LC0yNDMgLTE5NywtNDIzIC0zNzQsLTUwOCAtMTA1LC01MCAtMTg0LC02NiAtMjk2LC01OCAtMjIxLDE1IC0zOTMsMTM2IC01MDgsMzU5IC02NiwxMjkgLTk1LDI1MCAtMTAxLDQyNSAtMTEsMzA4IDY3LDU0NSAyMzYsNzE0IDgxLDgxIDE1OCwxMjYgMjYxLDE1MyA3MywxOSAyNDEsMjAgMzEzLDEgeiIKICAgICAgIGlkPSJwYXRoMzA2OSIKICAgICAgIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMxNDYpIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJtIDIxNzUwLDIyNzUgYyAtMzUyLC03MCAtNjExLC0zMDUgLTczOSwtNjY4IC01OCwtMTY1IC03NSwtMjcxIC03NSwtNDc3IC0xLC0yMDQgMTAsLTI3OSA2NiwtNDQ3IDExOSwtMzYwIDQyMCwtNTk4IDgyNiwtNjUzIDEyNywtMTggMzkyLC04IDU0MiwyMCAxMjIsMjIgMzYwLDk2IDM2MCwxMTEgMCwxOCAtNjMsMjY0IC02OSwyNzEgLTMsNCAtNTEsLTggLTEwNiwtMjcgLTE1NCwtNTEgLTI3MiwtNjggLTQ3NSwtNjggLTIwMywwIC0yNzgsMTUgLTQwOSw4MyAtMjE0LDExMSAtMzI4LDMwMiAtMzU2LDU5OCBsIC03LDcyIDc2NSwwIGMgNjg4LDAgNzY1LDIgNzcxLDE2IDEyLDMyIDYsMzAzIC05LDM5MCAtNDMsMjQ0IC0xMzQsNDMzIC0yNzcsNTcwIC0xMTUsMTEyIC0yMzUsMTc0IC00MDAsMjA4IC05NCwxOSAtMzE0LDIwIC00MDgsMSB6IG0gMzUzLC0yOTUgYyAyMDcsLTY0IDMzOCwtMjU3IDM2MywtNTM1IGwgNywtNzUgLTU3NywwIC01NzYsMCAwLDIzIGMgMCw1MiA0MiwxODcgODYsMjc1IDgyLDE2OCAyMjcsMjkyIDM3NCwzMjEgMzAsNiA2NCwxMyA3NSwxNSA0MSwxMCAxODUsLTUgMjQ4LC0yNCB6IgogICAgICAgaWQ9InBhdGgzMDcxIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMzE0MikiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gNDAsOTEwIDAsLTg3MCA4NjgsMiA4NjcsMyAzLDg2OCAyLDg2NyAtODcwLDAgLTg3MCwwIDAsLTg3MCB6IgogICAgICAgaWQ9InBhdGgzMDc1IgogICAgICAgc3R5bGU9ImZpbGw6I2MwMWQyZTtmaWxsLW9wYWNpdHk6MSIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CiAgICA8cGF0aAogICAgICAgZD0ibSAxOTMwLDkxMCAwLC04NzAgODcwLDAgODcwLDAgMCw4NzAgMCw4NzAgLTg3MCwwIC04NzAsMCAwLC04NzAgeiIKICAgICAgIGlkPSJwYXRoMzA3NyIKICAgICAgIHN0eWxlPSJmaWxsOiNjMDFkMmU7ZmlsbC1vcGFjaXR5OjEiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMzgyMCw5MTAgMCwtODcwIDg3MCwwIDg3MCwwIDAsODcwIDAsODcwIC04NzAsMCAtODcwLDAgMCwtODcwIHoiCiAgICAgICBpZD0icGF0aDMwNzkiCiAgICAgICBzdHlsZT0iZmlsbDojYzAxZDJlO2ZpbGwtb3BhY2l0eToxIgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICA8L2c+Cjwvc3ZnPgo=';
	header('Content-Type: image/svg+xml');
    header('Cache-Control: public');
    echo base64_decode($img_encoded);
}
PK4^�\��Ѣ=�=�+doc/alt-php54-ioncube-loader/USER-GUIDE.pdfnu�[���%PDF-1.4
1 0 obj
<<
/Title (��Markdown To PDF)
/Creator (��wkhtmltopdf 0.12.4)
/Producer (��Qt 4.8.7)
/CreationDate (D:20251014155653Z)
>>
endobj
3 0 obj
<<
/Type /ExtGState
/SA true
/SM 0.02
/ca 1.0
/CA 1.0
/AIS false
/SMask /None>>
endobj
4 0 obj
[/Pattern /DeviceRGB]
endobj
8 0 obj
[0 /XYZ 33  
813.500000  0]
endobj
9 0 obj
[0 /XYZ 33  
749.750000  0]
endobj
10 0 obj
[0 /XYZ 33  
700.250000  0]
endobj
11 0 obj
[0 /XYZ 33  
115.250000  0]
endobj
12 0 obj
[0 /XYZ 33  
296  0]
endobj
13 0 obj
[0 /XYZ 33  
80.7500000  0]
endobj
14 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [71.2500000  50.7500000  144.750000  59.7500000 ]
/Border [0 0 0]
/A <<
/Type /Action
/S /URI
/URI (https://ioncube24.com)
>>
>>
endobj
5 0 obj
<<
/Type /Page
/Parent 2 0 R
/Contents 15 0 R
/Resources 17 0 R
/Annots 18 0 R
/MediaBox [0 0 595 842]
>>
endobj
17 0 obj
<<
/ColorSpace <<
/PCSp 4 0 R
/CSp /DeviceRGB
/CSpg /DeviceGray
>>
/ExtGState <<
/GSa 3 0 R
>>
/Pattern <<
>>
/Font <<
/F6 6 0 R
/F7 7 0 R
>>
/XObject <<
>>
>>
endobj
18 0 obj
[ 14 0 R ]
endobj
15 0 obj
<<
/Length 16 0 R
/Filter /FlateDecode
>>
stream
x��][��6�~�_��"��(R�a��n/��,`�<��p�
I�d���W��t�XU_S����V�ؤ���s�����_���g�����7����P�F�Y��N�6w�3+���}���=�~�t�����aX�_��~?��w����_ͷ��d��Ϳ����������v0����B7����(���Em�ߋ�?�?���d�7�(r[R*�D��ɿ���[=y˼�*M�m�]�.D]�ߕ�5Z��}٬���e������+?N�:��~��q�ٮ1z�+12���)u���?�f�����>|9��X5�!��sֿ��Ǘ?�*��c�����/�8T��BꞼ�ٍ�וm���FJe�s�~��RL���~�y�FL��=<��~�̭���v]ϞS�����~���p�[�K��؍�y�?�]8>g:�G>v#&W�V�Q�9pB''t5zS!�7��vP�U���0�`�={r�K���_�޾�޼��翾������}��{�=|xl��?�H�']�{�<O}<<}9e��iˌm6ѱ.!�2rx�ҝ��	4�{�����{g��S8�����s���gpj XMνV��s��3��]�+E��w��G��~)�Z�>j�M�0D=0�q�̋rJg���j�¾lon|��a����3j��g�ہ�����x5k�j�|�%p���jN)<X�g~��Rxn�pK�x�Bc/��G1u�p#`�?��b���k���x�={��73������ݜR+q!���Q��znc��f�6��5��g���?x5|�7�@�� YS$�7z�L,���(��r2�K6�SX�9�]3�7#0��pcd
B��&�ZY��K�x����f14$�m�ȣ-�
=�����$�9�_��{�N��A<����w�R)a�,
��Z������g��o��[�Z��[|�a54|�0�ݵԎ^W�wp^c��f�$ǿQM��4r�H@BE �tk$�0���9+��zq9�Ü��N:g�ܵ�Y�9+m�&N7�0�z�����<Ι�~S��zA���a�Y
Úy���w?.���y���q�!h��U/ٛ��	���(II7!݄Wu�t���6��MQ�UY\�k�&t	��ѧ��=�,Z�Ms���|<�tFs�Z-��`�b|��bX��\���a����`;�^l�Qb8�+�ڰqV��wnE[��̈�A�{Ȑ�!�;6�Q�F���C7;�\_XX��CI';�}��0�,h��>�w���(r�M���g�82���nd�Ig�
R��-���!.��9��'�!�Ů%��Tq"�Nc��J+��.��n��B5Ǫ��3+�ͤ�3Q������b�T�U�y0z����|D���h8R�G,���yG��=�ƫ1��oʼ���<���F\V�҈X[gm�=>�J&�������}�\|z?9�O\�������&|!��1i1a,���,?/���KpUqt"3Y�w�{�Q@D&����p�g�hļO��;���0z`4ox�l�X�9�-�5�A��2�����ň�^����TX?�[X��`��o4���&��=���@$��XM�ޞ3�
��ǃ��L�T(A����e�n���+�vS֧��7����E��\KL�q,����j�AY!��D���ŬZY�
�඲�HK��aB�TcI�#���WK�LL�9�Iƞ���ă^�='&�9�p�rEb&ň�ݦ
7��8>��h���ŭoREK�z1�1�c��{�I2�����S�1�j;k<^5E�+��AK1R��1{N����j)����	�T�n��š��Ѥh1ʆ;��_�\�.p��5�0����ʁ��7����⻞c
k4�7�)�4�9		#p����i�bi���8�.–��2j��.
lO��	Q�VX�\�����n6D'O`܀�8-+}3-��t���4J�B{J1r<Ѫ��u��mC_���"�o��oo�
,�0q�L�-C��
4�K�DJ�-���]T#�_�MV��^L��Y�"���cV�c֫sy�1�
��Ռ"ֿ�Pu�ٰQ.��p5��/0oe2J��)G�^���9�TM�&��cE�HkY�?��v�p[ڸb�՗��G�Zq�z�=0#B��`�옘ΰu&~6V^��� ��,��C\�|pOڠ�g��,��w�ݙ"Su��j��ΨSL�T�:7�"27����:#Q��A��u�vhv��D)F��Jӥ�t��ui:%���Nx��n+��V��J���/�@[���3U�oe�k��u�J�֥*�����T�V�W��2��Z����g4���$����𗕠�jt�18W���/��T�'4�%pF��$�0{c���a;A)P���R�L��d���L�ef��!BA��(bP#�9�%{�8��g���E,���3P����w�F"���R��l��ޯ�hU��z�.�s|+�8��DK-ـ�`}��S���rI�U���j�󴿫�$խ��<�^�ylݭ�|�u��w3�d�Zk�<�4\(l�
���ݏ�V[��!�[1y��côK��_�}����LP9��E}�(�R݀�}�s~}��D_^�0H8G)O�	�k���u���PL��jxN�Q��WuiTdž÷�^�1R���h����TG]��Qw���Hu�~7�Iƭ��ꨟ2	�{w\��6s���E��v���1��q$���Fm�Hn9Se��� i�S™d�x��GN�qQXfg�,�`��M����f�j��ހ绳3�	)z=v��A
7Q�De^HeVӠ�F����R-hPUaZ���iP��j4IukuTU�
�������nF��[ke
�R0��C.G:h��=��OC��[\
�f<)zA��d��
oB��T��Jb߅;�MgUR&V��*�x��Wxwp� vV�QZ*1XUK�U�+�$b��]�&�n�^i�K�ͯ�Zz1�nF��[km��J�'s6W��ҫw�2�:2qs�%�O��?Aa�^���S��PD�IU���-�0��P�W爅.<�m�X�|mBqXU+���SM��΄�R��q�/�ߞ�hF��_х�6ˀ��{I��-�r5�f�Y���̫ˢ�7�n���*O��Jjy�u*�u�%�d[U��0u��B�a�'CVB��$�eپ���l!�G���
w���bܻ�oZ�nlPY�C�	��X�|�E�@�V}��t���Tw��xSK݋��
T>jK4͑󺛊5V,h`�	�0��ow׊�"�ds瑫��'3B��-��2����8��C��ô��b��Y6^"�=I�L}3串K��U���V_ޥ�e�%~�=9^�JT����`�4�Tu�ch�r�i�t�<�8�;�螣gƃ(�c�Q�2�ԟ_v�R�QG���yEk�����+3Z݄	����<���hJ1��{����	0�{�+'���s����	>&��\��%��99��E%i�Ӌ��2���1Ċ%b@'��t���СH:ܛgױJ1W�2RAe�X��6s�qw����mHM��zm�"�ٞ�+����ȞW�N��P�3/�>�>�{B�����"mN��,\N'b�;���L�xB���a�vN=Xٺg�:��E�h�Y$�cI=Z����R9�k��U�`r�ƱB��*,��#�Q
%\����z��y.��� &��H��8Mm2y��6��+����"��w�������S�c�@���ow
hE���FZ�Xy�~�(`�����#�)H|
�f���
o��1�XN �D� p���r�^;�l����g�}���c�&lM:72.����VҔm�e�}$�\��A�C������(���`�tn�I�㨰��|��6/�B��*�� ��7�>e>��<#3����W,a��z�
��c��e��j�S�ρp���:�҃�9�.0~�`0a����O����>�9��{�v�°f ʼ����{sg:�o>�������o���_~�����wٻw�Çǃ�Kg�L$Q�DA9<����ā��Z��6S�Q�a��ۧ`z�cLbW��
nx�}ʸ��vLp��,-W��l���8�z0��O�[�𤰁a�k0�aں2�Z68#hJ��|��� L��PasH���n3<8��U��ac�
����R��y
T�� (^{2���$÷����K�(�1I0�"rN�ΰ�|��������`\�~l7<�ɔ-=5�a/d�:�u�=��S�t�=w�1�1;���(��F�}S�!!�dd2E�7ũJ�`L5 �l#T���H���WX�lX�U}#1�hu�+4c��5#�3d�(ͪ����LJ�z��0�`��7
��ĸiUغ�>9�:A>�"�Y�f�϶6�	S�đɼ����
0n&F�<����.Z���>�0�G$(ԭ�,㛹����kS/4s�m�6`o?F�ܻ��h���ꚹצZh��ڭ�|���w���$��Z��{�\�`��l7&ߑ���ֆ�f#YSwR�\]��i�n���;صm6��M���V-%�]-�����Z��	M�Z�iŪ�s$��#j4O��uRZ��q6���zj,��#f4��,�5OJ�$Q-�j�iՒ��D���m&DfςC����,()9J�<� (��l�ω�Ԏ��<կ�%U,	J�p�SA��a��3�z�Jj�\��$(�'�����$Q�D�D��3n�fցc>��ɉ��bM� у]�O�)���D�x� lϓ��
�}�s� ���1�O��������� z�t��bS��SAU,�
*ѫ����TЎ��<կ�L�,�
���h35�#f4��n*���k�T�D�D�d*H����=Ģm5�hk�X��=K�vʢ�5����������;`�)�nG�h��[�E�ǃM,z�V��S̛�6B��9L`��I�C�g�#�&�n����yu!��\�PNp�\\�Н��~��nD��~�^pm�[\���zb"�v#f4��-�
a���Ebֱ�P���u綥$���*[�]��xf΋���R,	J���RN�vD��~='()�$(��b�~N�vČ�a����L��˘C���9��E�n"K��#����Ibdk]5��I<ݵx��O��mj+�nu�ߟ��oG��~�N��}3C�'��Y	E�Fv.tTf��5&/@��f3\?����q�A�WSO����pf�/Zm�ⴹ��%��0��q���h�]K=����զԝv��IwT�ގ2�^�k���
�܁:�|�l`P���E:�=�!:;S|
O
�j���V�9�����6��9A)�{��Q��)���uE�����Kl.������;�;��RaR��*�;�3%�a��33V�`ٟ��؅V�=,U�`�EF<�Undn6��7g���Ѥ3u.8à��Z��r�0��(0t.<ǹ7,lb��>��qg�y��<��;9'�\�75�Vۉ���3#�7�g���z�x�w�w-�]C|��@�$���kx>.�aa�M=x=�@�n0�%�=�Y
�
��x�j��r�}	0��::3�~<�Eu�"8��A�H#1��0�H��Q��$`*p�!�z�%O;�ZKf�"b�-Qi�S���:�;�]B��4�n�����ܪ��F5��.����u�������t�������iPM�W�̝)��]u�}{��q�|��MH���'),sqE�;�x4T���=S�tʉ��3e˜†���U���LP�+�{��U�-lX#C(���L�-S��j��)�u>c�K�_��o!�W;V�tr�X]	��A3h�HOO�F�?p�3��N��j�~�TQ"��`�����ĞR�Xa`�����x'b��2�V1��7y�n�ZTb�����UJb ����ђ@��sO���v�i��}��9�<ɸ��}:�?Eg(
endstream
endobj
16 0 obj
6152
endobj
20 0 obj
[1 /XYZ 33  
735.500000  0]
endobj
21 0 obj
[1 /XYZ 33  
647.750000  0]
endobj
22 0 obj
[1 /XYZ 33  
134  0]
endobj
23 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [102  671  175.500000  680 ]
/Border [0 0 0]
/A <<
/Type /Action
/S /URI
/URI (https://ioncube24.com)
>>
>>
endobj
19 0 obj
<<
/Type /Page
/Parent 2 0 R
/Contents 24 0 R
/Resources 26 0 R
/Annots 27 0 R
/MediaBox [0 0 595 842]
>>
endobj
26 0 obj
<<
/ColorSpace <<
/PCSp 4 0 R
/CSp /DeviceRGB
/CSpg /DeviceGray
>>
/ExtGState <<
/GSa 3 0 R
>>
/Pattern <<
>>
/Font <<
/F6 6 0 R
/F7 7 0 R
>>
/XObject <<
>>
>>
endobj
27 0 obj
[ 23 0 R ]
endobj
24 0 obj
<<
/Length 25 0 R
/Filter /FlateDecode
>>
stream
x��][o�F~ׯ������0$���] ��}X�C�[Mд)�?Iq(�����pHZ��X���p�̹|�v��������-y���?�Ժ�T�/����¸���8m�����[�m�a����۪�cs��_W7ͳV�o>�����$��~�%���o?���?��*t��o����_��*��y�KW�^�X��ϫ�-�Z�C��R�Xcu3���o�.�^�����K]�i�2W6YZ*]�g[4?un|�]��B'�Uo���y�S��ݣ�363e���շ�L�G��)[��>�(���6���{��hS�<֣u��z�=|�C�&�;M!���iu�'�$O?%��4ߞ�I���TLn�J�]��˪X�&kY3���H5SU��loD�݌�j��v�Xt�*��M7{#���t]���^��_��l��H�G
������׸͈�����?�k\{���	�5��~��ލ<nF*�u��������wh�#�εb�6�΍��vO]���Pt��>?��a
���T7�Ѫ��#̺�g}�@�bV�����2��5��if��s�<�9>W��x�Y��{H����*�bm ��}}�<�'6Oչ's����ϖ?�!�k1��7
<sTH��$�a|3���y�.�Mz!���B������p����4^�G��l缩iw��݈5�M�})�a�D��S��*F�A$	n��H�V=n��<����್�����)�|��	�)�;�9���l���D�f�)a����E2�,�n���tMxx���K
��LTal�h��(��9T���p��Lе��5~h7b��O0�Vz���y֚�w�V��V�MuGv(�\A["}7����hM�� QF��n��_��6F�b8�c�)7�cy
��x�#x�5�PO�9��?���X`x��	�����L�Y��a�O�)%S��f,~Q\Lx�1��xu��l�GT���v[��&��#��I�����c'#s�V���)/����p>a$o0K|"`1z�D|���H&���CU�W�Ɛ��U��O��/��R�?�s�+��&*K(T���2'���(��a����l����u_$�k��ˆ-�^٘�}�SO���#�gs>��û1�T̬��	�(�발�䉤P0�ȵX�O��@s^[eQ�`�[��E�:��d�R��2���J���`��`k�0/YD��9�k��iY$U4_���0�Cd�QQ]��~�X�ڱ8��iTmU�Y}&�	�F87��@�
�(���(�cra~@� 3xco�1/8k�I�)�a>*J��@�����.��GeRL�f2PD�*���Pq��.0�F�,W"���442��霣�#u�\����ȔX�3�<�V'Z&��і�9ڱP	Y�������s��"���ܩ9v�ߟ��>�sj�!�����h�>�z�vN5rh��k��eG·�#~�{;S?���9�8?��T2ݙ���se���������>�Ҏ�����V�|�����6�y����O�>}��{r{���%���W&A�OͲ�S�҇�HO�N!˔^L�C�?67Q�)pEi��#����W�!��o*�L:�0R!�hf9J�ך�
���!vTq�yT�n�֍��h�a�T	�@���pT�b������]���D�
����M�	0Sg�l�قN��%a�`�	�28@4]�
pdR�e9�G�u�d:?M�xo���L�T�M��0�U�`�p�,���[T�w6�
H��r1%I#��>)��J�C��T�u'���K�����q���p{\�� �kc��N��`9	w�Z�-죧�^P%n�A����B-��KG��M�wh��ݘ�L�U�6/T;"�
%"�F(�u���u�Y����fb�-b��1zd��|&�%V�2��3e�g�#1�$?LU��
��"�-P>Q4e���T�ה�O0�Kj��=�6F�](|!r��v&���X�\b5��0�v]�
�˶��d	7I�� HE+1R��A )ύh�ByFfT]�O���\m�Ŷk��n��_1��ǽ'7�6����;�	ܺPɣ��lO�a©�En�'��M�N�ޙ�M�6�?���f�s|�o�Y6tڿ�Z6n܍5@:�-�j����{��>��zD�68��a����)ˍ�9S.L�����?;�xb:��bЮF��rw~����R�.y����X�]���ꮿ^��'p�m����O�;�ZOF��H�ȶ�g��wsp_c��[8�-Yp��pl�
_��C.��#���9�}���ٝѴ�����F?ɸ��	�u.?+[�1Z�ѶX٢ L���L1
��X��Q���ms1dN���<1;YO.�Q���ZZ�iDia<bu;"Q�r�i�B��'��
���ƴ�X���ĉ0��#���?��UR+�nQl�m3e��[q�A&���VŜ0&]cLE�`L�� �1���%��B�@�1�,S�91�
�#�	0|���5<���7
�`��G�
��@6(����L;x
H_C�0؏���QĞ���7}�"���{]�#�Ӟ�\8��Ikc�e�=3P
�T"Z
�	y��"u1g��B�cՈ�o:a�a�����h�)�G?\�v�߱2~�p,O8)��>����ee�,f�½b��2��&�d�"�K�P.�Y���u<gY�N+��N��!T���0s��5XbM�k��kھ�� S�h�P�!P ���(�Ѫ��^;�����?��0�F𬉸��Vb4`���Z�nc����� [Mai�I�%2Q�LGf�cE�^MS��.A�'0CL��XN�ޘ7%�cћp��H�c��/���֙���gM9��̂@MF知ԏe
��Ds�N:���ǼitGoY‘�,�$)�q>Qal�:U��J��(�J�Y毾��ʯM�~A�aqS�*/��3E=��Ȥ�fi1
�1��U͙ڀ�=h�7�9��/*V�z�:��|`�a�(�Mj���e�G�S����h�p�)㫲=����b���(�0�@T$
&-�b%<0����E)d�x�X���NR��6�H��{�LZ�-~�W�7��;�*����4��uh�DoQ�%!V���벖��9�p�o���\vR,�1�'�U����%���$�h�|g`��p�N�Uh�"Y�jK �H3YRm����l]�yv=�6��j�>��C�("V�0��JQ����c�qr3�=�3p��h�8�ba��Y�P�,k�2���le�ӶNc�f��������f)9��r3)k�A�T�F�1-&잠@T����HY�&��L{�X�"5��PU����0W�����U��M�Q�>w���ZN0ኯ�f&
=P��$p�ҁ$�N-꘠�F��IWa�zeyqJ(�䵭5S@`r�D������7Q�
�ں��k�K��]˺��^&�s-�h|�r��!ny��b�3;B��`W����y«3g��ЬӶ�ܮ�}g2�)����c��'�N�}���d
�X���9RHͩ��9w�hN|$ٕo˭�F�����L&�NdS
4^Y��j>\���`�ab��E�F�t2&,��3�̰wy��a�!�T�
��9���a4�.ѲK��Ξ�&+��)p.�p�`T�.`j�At�&�&_n)���
��e:K#��G�bC�.1Ve��j�k���q?�цF�q���u��6F™��cF�s�Q"ޅ!(q`�m��^��Fv���&5[��(�8_��zO����yc6�����ax�x�+�i���xu��Y�LK@�fvJF��7]r�C�c���PF-\�+̮����!Z&����C���'�u?5�a`��_E�d��d��>���x��8�)�=KתlS�h%I1�̈́�I��#c��̺a��g&�sw�c����i��s�p?��Ok�>��ks��fmةo[]�Swf֬�k���x�[{O@OssG\P�^V� Ǯ���<���8q�늯d� 	���[47O�n]����Y��x<���<����f
�ǟPw��{?�d�!Q�|�����6�y����O�>}��{r{���%������K.Ļ������P�|��AH�N���O�b�u<���c�~�����~|7�c��0	����}���7Ş�����g�u�wH36bl�AB%GDU(ۜ�T6�6��
���W�"�T��9zb�%F	��m�nA#۴��](���C���%�MX��^�1$����[Y0Y�/�S����2�y�L��*�Y�ye+K���M��f�v���꿫?��'���_�����'�#E红��ϫw���
q�/k�Ez���]f0
��U-#���:h[�������fz,�p F+�ɭ6~�����yE�^k�0ʰ!
'R���d�1sG��V��wY#�������ls?/�>&�Ӈ�):���n��r�f�F�0PLiY�?Fs��8*�V7.��ƹjt�{��lFl�:�����n\zݸ��ƥ׍ˎn\�Ѝs�������
Q7)@ܓ"��+�ܑ�V�����0WfV
endstream
endobj
25 0 obj
4671
endobj
29 0 obj
[2 /XYZ 33  
106.250000  0]
endobj
28 0 obj
<<
/Type /Page
/Parent 2 0 R
/Contents 30 0 R
/Resources 32 0 R
/Annots 33 0 R
/MediaBox [0 0 595 842]
>>
endobj
32 0 obj
<<
/ColorSpace <<
/PCSp 4 0 R
/CSp /DeviceRGB
/CSpg /DeviceGray
>>
/ExtGState <<
/GSa 3 0 R
>>
/Pattern <<
>>
/Font <<
/F6 6 0 R
/F7 7 0 R
>>
/XObject <<
>>
>>
endobj
33 0 obj
[ ]
endobj
30 0 obj
<<
/Length 31 0 R
/Filter /FlateDecode
>>
stream
x��]ߏ�6~�_��qDR% �l�pY��{���-�kw�Ie[�?�툔l6@�]�(��pf��y��O�����~��{��}>|��[[�Y����/t�u߳Z�=����k�u�q����c��_~ۼ�ߵ������f:�k����?��~|���׍Uv�u���_�TyQm�F5u��|�c��?m��&��G���\k����2�����5�il7z�G��ֵ6�n
�}o?��
�~o��M�ը�g���t������d��a�c��p��U��&�6k�����e�W�V�zuUO^�q΃��Ƕ�=m^?V���ӏY?�W��S7�W�*����M;*�6{�yc����P��kihQ�G=��g�zע�M��Q�ݵT[S�I�q-U�,���ڽ��+=~�[��O�V�Z�meոŘal'������@=MK,y��P���hr�t�{�)��PO�1��dms��4���~*5"�\��+����EW����jԢ�popl�=���G�oaK[��džG�����`\Q�L��3Ӓ��<�liFQP�H>��g�e����EcF���p|���Z�(PC�{��q���F�p3U���g�z�5��]ћV�dl�T���շhu<���SL!�=�ߟf�Og���)���|�V��l5��Z��ɔg��J13��5���=g��a�Oysꉫ��lñy���Yѳ��Q|~�ۣ;?�<1�a�CQ�<L��<�x
�-
�m|�+J�9Oo�<;�w�8���;�����)>��,œj�qo�,���Jg��i?��}�.�3G�6��3t�x�;��Nά5#�����c�Xn��M�z�n�'xn�G�\<�̝�����#�1��3�c���?a��t���b�F��(-Ss�a֚��z�`�7p�k�ar�,�8��U��i���xl��`ɌM�m��#z�&�q
Y{,�`�;�VGXlC���z���]V޿n�5j������_��3^��@i!�e����˞`�:��Miɟ��Yx>���uz:V)�_ 1f�=XU\^���A�5Y�Gځ�6��,�DuNaH�[�6�C�3�x"B�K�p�On7�u���@���yÏA8m�.���h�S	O(����+����0{�]���N�X�ʹ���W��ܪ�(��T����~�\��_6�l�,�0��Ō�3}��u�t���)���ߍ�Զ��sv��ͻof��bG�U=l�zt�إ��t�R�`R�U�#0c����L��Rρ�*s��,F=g�5G����A�b��ω�Z�b������Ō�3}NZ{NZ��~N�`�bG�١���`m�'��I&1x��[��Ѽ�b�פ@��c�ֽ|X]�遀R��	�*���^f���BP�k��O�gx�	����6����})<V̘�R��~��@=Dh�G���F�ר�r�y�$x5�C�:3�B�Iw;~�ʁ�g���d������ܺ��U'�H�@QU
�Na���,`ɔ�w(�����P��Lh�k
���:�Kf��ۖҘ�Pqt�	�L@�5�*C2��}?0݄��jb	�����������tS�k��J�)������v-f���QbM�Πĺ���}�Qb�;z��͍k
떵P��N3xEW�=c��`�$�x��NSb(%S"�Ps��:�cl�؋�PYB�l�	�*�F�9B]�=g���*�sB��#��ω�Z��9;�7���eFτN�	�PB(�L�@I%	�xeV��~A�a�����c���gB8Y�lB�P�D<6�zE��G�1�*�*�x�¾�D��(1��JB��P=�kE�K=7Ʉ`��.I;�#� 6+�la�MJ)��\��B��;ߒ��K
�7y��|:���&�*6����(�����qh51j���S �w
p =A!
S<�ͳsqC�M�*P����3��������t�ӵp�\2���P�Q~;��n�t0�
SDG�K��D��z�B���BZ&��C�{.��A
Y@���k$P��E;Z.���O/!{��5=���yn��߾�v
q��'�8�g?%��@�T��a�S��̈́8U�BF�g
a��݅$�>G�e}�=g��v�e�3�0����B}�=g��f�.k�0dّ�.�(�NÒ��B�����T���#K�lXY���Ō~(��~;S���m�3�i῾Ō�3}�џ+�������/�w��������yX&s%�7���7�r��,��1X��;h��Dƴ��h���')�hW4����yNO�/��v�F��'�֩Q�z�}�=g���t=WO��m�ߴ�`�bG�١�٥k}���>��H&Q��x�(�}��%�?�b�=�����0:���=p��	`���}�e$ao�)Ȉ�!`�g��Eq�.�Y�P1.8&?WGa�k@D��g�h�{#��tN�)sNq�i�(}��,�w��J"����dӁ�/����KXt���`�Q�;C)EL2.��*	VM	�<uI��lƞc.&[��x�Sfx� ��㵂��mcp����lx>�2���A�N ��pd�`���M1Ĺ&3t�m��t�Vg�>����I���2~a��$ab�J���)�-����@†V�fH֬N$�Zu"�����c8ޯyQu�W8Y�Ř5(�
�5�
c2B)R��:�ч�9>��yj�lH=�fb�/c$	d ���I+��mQ,1�Y&����Mg�[��nsb`��{�$/!x�q�j@�ՀUf��kҀU�ڎOsҀ��|��~4`8j&ٰ����k�G�����ڣ�c+@Z�
��r#�)�n��jG+5b��d|�t<"m�:u��֓`����h�F)MN�H؉<�P W<Sc�M�O	� _֚*��In-	�Z[ީ�EQdjU�r��!G
3޿
=~#�����Ç�PLg_�&�jU�޾Re���sZ ���u��
a;�)���\��̬��j_!:|X�7����|�{D����@T����x���M�I�)�h�����<�58��R�i�It,��m�Ҟދ��L��mY����B�C͇	Q�E�{�v�Xkd-I҄��06t&Pg�%h�!��	�kfj��i؏ht��/%���V�5�6
��[����~�dJ���Q���:1����0���}P6��h�E#
o
��?�MK�3��OP!�8��yƆu�|��i���`���'�X�N��s*�97�?`�x�2I�{uҫH���$��Q����I�=�M()C�'���Y���l��V�8���2��'�9g�&
�R^�G�{E���ka+�)Y�;�0�{u�����oB��r�[�Z��[Sp��9ps[�y��xkY�1�@٘s"%�u
���Ⱥ��J�&�����Q�#�)Ԃl��D��`ގW4P�˒=P�Oܚ�&�$~�#��E=�…��/��~$)!h̄�eSg]�������ҡ��
W�«��S�\��#5j�#Z�	�ԓ���)
��s��:�5��be��$��b�R��?Ȕ� ��Z4��
� ́��P�B����
���z��Uz&Մ,8�	%
U��`�sY�W(H�l;��P<�����KϘ<�4�i�>0Ii�.0��� O�����U�u�HgL!�
������'R��@/�ܶ���Lw�ݜ�#��S�l��:�\2a�%G�g�p�
G�_A3��潢7<�����U�ۚl�_�F1�d���3��Mq� p�����1�6�3�v�6�ǁ��#_܃���d&%
	
a�;Aٰ����q��~�`Q�l0��s�xv�|)oR���E{_163���hmǜ1������ʌf3*PW�h,��4*�/>��d�Ft��:�/1n��k���L��(+T5�b��dd��̑�)���1�8&OQ��af*��fH� ��1�">�;%)��Snn�92~�[�UB�V�j`����S�l�Pٚ��]����$e�}��@v*wY(Ze���2`�P "��g@β�Pp5S��z�F�)��0�-�"ti�vo���"tY�����"t�G3;chBUu�m�qY�}�W���y<��,+$��}�'Y[�q"��+�-����\��^�|����	7)��\բ]o�_����n$R�����9Xn���U�Q�'�M�Fp�y�=\'�3��pԡ��F=%�ן~��[��M���/���/O?���������������I�����M�{�,�k�O�ku����0&��n�;\၀��
q�$O�q�\	���p5~��y�q�#�Fз�v���BLj������Jq8G��
"�s��Ô}��ϞF��xh�	�d���L�c�s�^`����]���3����qP��^�;�h��J�NL`��t��
>c>j��I���![Ʌ���J���ۅl��k���42t-[s>"��/'�b��pr�[�G;2���;�5UW)��߹�G���%�E`W�k]b�f"�sF
�"��Ա�}1v��F
)�<��0��YY�${�畑n��������}�n�)]����}�w*Gh
endstream
endobj
31 0 obj
4712
endobj
35 0 obj
[3 /XYZ 33  
756.500000  0]
endobj
36 0 obj
<<
/__WKANCHOR_2 8 0 R
/__WKANCHOR_4 9 0 R
/__WKANCHOR_6 10 0 R
/__WKANCHOR_a 11 0 R
/__WKANCHOR_8 12 0 R
/__WKANCHOR_c 13 0 R
/__WKANCHOR_e 20 0 R
/__WKANCHOR_g 21 0 R
/__WKANCHOR_i 22 0 R
/__WKANCHOR_k 29 0 R
/__WKANCHOR_m 35 0 R
>>
endobj
39 0 obj
<</Title (��PERFORMANCE OF ENCODED FILES)
  /Parent 38 0 R
  /Dest /__WKANCHOR_4
  /Count 0
  /Next 40 0 R
>>
endobj
40 0 obj
<</Title (��ENCODED FILES)
  /Parent 38 0 R
  /Dest /__WKANCHOR_6
  /Count 0
  /Next 41 0 R
  /Prev 39 0 R
>>
endobj
41 0 obj
<</Title (��LIMITATIONS OF LOADERS AND ENCODED FILES)
  /Parent 38 0 R
  /Dest /__WKANCHOR_8
  /Count 0
  /Next 42 0 R
  /Prev 40 0 R
>>
endobj
44 0 obj
<</Title (��\(Available for Linux 32 and 64 bit x86 servers using PHP 7\))
  /Parent 42 0 R
  /Dest /__WKANCHOR_c
  /Count 0
>>
endobj
42 0 obj
<</Title (��IONCUBE24 : real-time intrusion protection and PHP error reporting)
  /Parent 38 0 R
  /Dest /__WKANCHOR_a
  /Count 0
  /Next 43 0 R
  /Prev 41 0 R
  /First 44 0 R
  /Last 44 0 R
>>
endobj
45 0 obj
<</Title (��Global settings)
  /Parent 43 0 R
  /Dest /__WKANCHOR_g
  /Count 0
  /Next 46 0 R
>>
endobj
46 0 obj
<</Title (��Security related settings)
  /Parent 43 0 R
  /Dest /__WKANCHOR_i
  /Count 0
  /Next 47 0 R
  /Prev 45 0 R
>>
endobj
47 0 obj
<</Title (��PHP Error reporting settings)
  /Parent 43 0 R
  /Dest /__WKANCHOR_k
  /Count 0
  /Next 48 0 R
  /Prev 46 0 R
>>
endobj
48 0 obj
<</Title (��Deprecated settings)
  /Parent 43 0 R
  /Dest /__WKANCHOR_m
  /Count 0
  /Prev 47 0 R
>>
endobj
43 0 obj
<</Title (��php.ini settings)
  /Parent 38 0 R
  /Dest /__WKANCHOR_e
  /Count 0
  /Prev 42 0 R
  /First 45 0 R
  /Last 48 0 R
>>
endobj
38 0 obj
<</Title (��ionCube Loader 15.0 User Guide)
  /Parent 37 0 R
  /Dest /__WKANCHOR_2
  /Count 0
  /First 39 0 R
  /Last 43 0 R
>>
endobj
37 0 obj
<</Type /Outlines /First 38 0 R
/Last 38 0 R>>
endobj
49 0 obj
<<
/Type /Catalog
/Pages 2 0 R
/Outlines 37 0 R
/PageMode /UseOutlines
/Dests 36 0 R
>>
endobj
34 0 obj
<<
/Type /Page
/Parent 2 0 R
/Contents 50 0 R
/Resources 52 0 R
/Annots 53 0 R
/MediaBox [0 0 595 842]
>>
endobj
52 0 obj
<<
/ColorSpace <<
/PCSp 4 0 R
/CSp /DeviceRGB
/CSpg /DeviceGray
>>
/ExtGState <<
/GSa 3 0 R
>>
/Pattern <<
>>
/Font <<
/F6 6 0 R
/F7 7 0 R
>>
/XObject <<
>>
>>
endobj
53 0 obj
[ ]
endobj
50 0 obj
<<
/Length 51 0 R
/Filter /FlateDecode
>>
stream
x��\mo�6��_����$N2`�1��>i��h�f��Q�ɱd?�}V4�mD�OG玴���~dz��⎮��J���h��~�cM�"*C���z��uu��>V]�-������j?�����Z���>��ȗ��޼p_�i����G%��}R)����y�C����u�Rk��je�=ee-�K�[���1j�t�����
�>��IZ��Q�(LJF�(����7{�a��a��;7:[��3uV����&���ǵ׻*���F�'��L�^�^s'ۗE�KR{�y��S��_��P���`2�4����ϫ�+/��U�Q{��W6fm&���8�ҪS1�Xe�uT�-�KK�g���r�OqD�2��JQ�ZKr��£�'��� Aۚ���}#[�+<��O�C�Q�P5��h�{�ଓz���:	��aK\Rk�H[�����lSm�T�5�A�T�Z���,5Z�D�c�M/:�RC���`��(y�XjT�:P�3�6`�@�ź.x�(ֵl}'�aͯ����G���HO�(]w�"��
���<��xΡF�m�g0��jA��g|�O��؅����Mm���A�o(��g�(�[�)�[G�a�o(����^<�;թ�bw�6fwℚB؀��vQp���B@�R��;7�pY*�=�C����_bc�{��~
{�ƾ�������6�k��6�=l�'�ƾ��JN4U�aad-8�a�c�|�:������n���߱��9�&�ȾaevWZv.:<f�x;�X�-��q��h�@��Z�D1T�z@�CN,�Ko�~4�I�!;c,�Q����5�Z��� �2w\Ӂ�~ֲJ���@R
|�A���㳻��~�����89���b��결��A���e�}�3>-� ��趇���������pj�	5�X9��Yq�gؔ�QFbn5����B+؇Q)���
����:8�O�֑
��s�ǯY>�)�q
��GG�%,?�olm�ʷ
�_0v�%:2d����g}�P�g�|�S|�U�g…�;p9��Ũ����My�7��[N��؁sQX��2�*�����z$��[����=��Z��KDY�
v�X�����z�Xj)�!��<
J�y��q	� ��8HI�����+���-�J�N�KJ/(��J��:�@Ʃ��n�j-`�9I��A����x�{� ��c����A*� <"rRƑS�׹Ճg#��ǩǫ8I8������'E8k�,^�8e�U��Kj�i�����8��qϒp���OT㜣�B��Sg<�[@�~�����0n钅�8�a�n�jc��F�xs���r, V��ܨ�wV��+#jf#>�)i����'���m�1΍�&�7N�uC�0p����qW
�	�olS���a=��}���֖'��{����BՕ����'[�qn�Gz�2-y�z����aXYg��{<��-
��sh�Q�aU?&��r*FST����|���F�wǠ�8;��r�lA6�,�MS�M������)h�sx��Z!���IKp��j�N�5�oQ�����|ˮR���-��h�#!EC�hx"�@��k����#5��?�<�0<���BkPo�ml�B?v���m�˸�0F�&��&:��RȖ��^�Nu�-y��H�C��^?�St�kq]��W#�
endstream
endobj
51 0 obj
1714
endobj
54 0 obj
<< /Type /FontDescriptor
/FontName /QCCAAA+Roboto-Regular
/Flags 4 
/FontBBox [-736.816406 -270.996093 1148.43750 1056.15234 ]
/ItalicAngle 0 
/Ascent 927.734375 
/Descent -244.140625 
/CapHeight 927.734375 
/StemV 48.8281250 
/FontFile2 55 0 R
>>
endobj
55 0 obj
<<
/Length1 6976 
/Length 58 0 R
/Filter /FlateDecode
>>
stream
x�}X	\G����{�F�1d�y0^(0@��O���nP�D.oAE�l�
Ѡ�9�$C7�j.M�L�q7�dc�i����\y_wWUW}�W��&@�!�G��Y^�[N?�#�x�f�]�u��ؾO�CWVF���q<�c>Y80v�|���e�V:8=ٍ���y���_�!�5��O�,$�d�뱯*H��8�����B[	�?
��@��.萂���]%k(.`��w���X�ZΨ�~�…�d!�f	Y#o����w��pJ��!��Hm
�9"'����8B�j��S^�j|���b�M_��8�q-�0�r�(�;j6��,����*~pPA+i��4�|�~ES���;�^G�H]��qn����a�\���u�D��28O��;;99�}&:�~�2C�⢚�>	����{�7C�+!��+
FD.�"�r����o��n��r��EƝ��g�1ᄑ��'!n���8HHjjHH�ڎM�����c�Tm	���!�3�`̿�Wc>���Lz�䋲��G��Whn�rl����2,�LT�7.v5�~���j���]��<<b�̼�T>|������Qi�z���(5HU�TqGJG�#���;��@4���к�S_57M��d\B�)3;}��G����WUL����=>ns�����7l��ag��{�-AA��EQ
�b��ˀ
7%�ݓ�V�._5�����h�9�����%�z�w���j4���2�����9*ZԵ5!I̫��{�m�L�}���#��/L<�5"�*��S-#�ך`�~�,���	��.��D>�(�P��~J���l@�(ԎV�(e�4�֣�h���9�-����~ْ���@��â�h�d<��~��M�B��Y������)�\����=&����	�c�U�V� ��uh��ÇY�P���}�ҹO�a7�L�P@�Noр
8"�R1^���<Q�Q)eJGn��v�_�ed��ߜ��/L��MO���������hv���������S�S�}�S9c:$�<-�ݿ�n��{��o,��b��D�9b{Kd1�j��0&�;3��Z)PQ~�����x��
DG�u�şh���n?h�B�Hi����rSfV|ז�c�ڊ�����J��u��y�3��蝹}rh7c���
cpU��@8GdR�zW��Gl���
����]�b
�n���$�b1�U�:4�U��+���3r�(+[���W׮�����0�v]�'���|V,�[�~�����y�z�|��K�^��� �]�?@9��َ0��R&���.g'_�INN�|}���<T..*�Y�T*)�`��(V0��Β�8��%��Y<he,7<��Q��{_qF��Fδ p��y 8��>hG�Ş���'��P��1��rrr?߿_X�{��Y�v�����1�3�H�&=�E7n���ǎ�����Ǟ^�©���RcG7o���3�ֱx),^�}�l����"��l���G4⠱�5�FֿUI�U#v�(�����k�B��Թ��y�2|}��͍I�ӧ����I�0������s�%r��IӦ���n]�`eʾHL���C�ԚI�i3��$�IZ
0kf|\j��S3�1yעn��,�Y�=5����P5���A6��^�ߊ���~��12��
?onT��O^]�E��-ҋ���B�N�w����v���&��5��w�	|!��c�oEȱ��`Z�Dw~�0n�0�c�b�˳��ǂ���}�)&�\��
��q��G����
�ե�c-�GeCf-tNzD�m��ov���[j0���a]�M�mHX����訚ٳ�%'$zz��=�܇��b�;����kz5/��`ܛ�U"w�T���S�u3�f���"�'���Y����
H���ۧ*+0xT�ݳ�X+�����i��o��L���>�6�ߧI�<�dޭs�H��ep���Wh�:l��8q��oDP���}}�<q`�9m��zt���Fzd'HzS��{�,v\A����/�U��ʗ����,<�IqgA%�Ȥ�'��p疊g�|g�p���'Aa��K��N��׊���xB܉��Kͫ6�$|�*ػW����>��~��,�`6��9�]�����K�U:0=�}����ysGyx/C�ݽ�=��\�J�[o���C�(s���}�2O"ӭ��Qi��`ͣ)�:
�%��djY髗���U���
��R�O�EG{/�V�����mQX�-��*�\[��<��b�hL������G�A;`��R��m�$��H:wU[�V
ٽ�
�j�-v�Ҷ�����!�g�$�����{q)F�Ұ%&��Tg��>&Y�E��:��yro/��"=fNN�w�b��,~��#b���b	�1�u����^��a[���{���W��:�(N���Zh�<¨�y�P<4Θ\�m��M�W���u��cclLRQDxLl��ꪜ����KQz��r�"c�3'��j������1g��>�f�s��[�� .��nȗ�Oaҝ�[���-�Y��4���ut����̿�����wMb_���0i/��1�����y��
���ZG1�;�k�6���V�d�ŀR=�$Fg��{���4S�
��87}�E���»��)�gZ�R��������cn���ҹ�fwZ�B��!�@=�i�W�!��fN+�����(�sZ5� v]��~��
��IW��ݑ��Z�i��y�Taэ��k<�-��7����B�U�Y�v��$���ý\�ُ��s5�f,JS6|O�E�?�4	�G�*�%��qG-��9VQ�J.؆��n�>Y[	^W{��nkX���z�\f6�٦�5k8�^DZ�H��8t%�ڱ�����A�6766��;�c4ԉV�)�Cə�`Pأ=Y��cpn��;N��W�أ�W����z0�?`>b~ӂN�g�.�b��4R�Ss�;掆Kt�q��g��<�*��k��I����eRq�D���E��~�`2m�3���ቨi"�VjIIJ��K�)t̆�;��+{v/��c���z����
�������Cq	 �ljlN����cZ�EX�6�b��fx�Cd#8D:6Zq�%�IaK���o�(�?�bBB�ΘX��<{&k��gc�ݖ-5��W���5nQdm��<p����?c�ښ�H�k\0G��_p:'���H�T=' /g�T1�VߢƱ��"Fi�P+����NSA�'xb��g�#��ߕJ��n�h/��{�{8ds�uX��h��YH�8�����.p�2Nng�ʀ�n�9�++7��IN���enu����O��������?O��/�R�»!�QtC��8aķ�}�|'�]Gj��\W�mKI�0}FLl����<���y�ʉ��E�?���g��ܱ�(���;W��T,���;���p�h������7ރ|��&�&���۰_̥�dZ��;�B�q�#�]��(�P��(�v���X�1G����\h��R�)}*.����k�ZJ����ls#[��S?�'z���*���}�_}����:y��4P״%*rxmH�	6mx��99��l��Ε��{"#7lţhL��&����@`H�����K�Mw[�tC�?��liP0���l
�b$�������`ş
�1�Ǵ�nL��
ow�n~8�cߥp��3�Cyܾ�V��T����5�x�~�ƣ�i���5���w��2$��c=�[��Қ�)-��>R��z�6]�"S_I�	b��Y��X��X�6���7�W���mz0��q;�T�;�F�b1���pW�3�ҥC�������„l�F�*cі.ă}
��F����4b�-g��JkV1�O
�_Rw��?�(h��M�^۰	��+^ex
*�^�(o���U�xΈ���7� h�� hAp0�]��4�+9��e<��T���kVRb�<�
[Q��CB�B��#��%�������!��<�8	��Z� �R.���s����\9�Z���]8�����/����V�s�p�Y����0�eQ캪��N�Wߩ��ۮ�m۱#b(�q]f.�Kz!�`�������a�^ʀN�\���r$&�^A������bU�F�	���,?����@����ua����0�::2$t�����U�kbb�M^�rc��h��
^2h�;7��)	�ԅ��g�g3��1������w�k8;jRbR>}��vT���
VI�l�빀6��k�/��_^�O�Z�i=?�jp/�	Nc��
&�Ʋ�P)�Ãzv���HX�~6�83�k����[����:#�/��\��]��'�G�yN�����ـFϿ.�տ�J�rM=|�h��d��C9�ɾ���=�5�<�m�(�}+Q��/�k&��;���E��9�YГ
>�PM��������/#�|
I�/�҅W;�Hv�D�1IJ�:��䳰�AV�9�D[�Q#�C�&}���g�0�t
gH'�!�H#/=u'�d�νI�f�-9���M�\6�ϧ�[#��wH��	@_"[�e��D��?I?�����Hw��p�LEZ)8�W!^�� �z��E�q��8ѝ������"�d79K�C-����t<�E��u��ޠ"�ĵr]�~����F���0E�r��B�pE�Px({R������]�}.�;ȃ��^��6�6�6y6
67m��N�]nk��>j¨売G��j�����|�E�j���ȥG�H���l�amSD�/X���em�ؾcm���ed,̷�ǒi�߸
x��R��ڀ5u��Mq�3�6��/[�<��Y�q#w�mq��=�$@,��H
�ZRL�I&�"�D��� ��W�P|k��<���pR@��Ll�Ǒ<|�=ZU"�2𙁴��g�@c����̬R�����*�h���P���T���SűW%�������ո ��«/g\e,eO$�Iʐe'q�eyi���e0I��5�&�g�uw�m�oRFqI��@�5�Sg�g2~K��H���tQ��C��E*��L�Z�W:���f��<'G
$���H�8�#҈ǻ�$�---�5���bfZaZzV�Lcq欼�􌂒��YQ�1��^3q���,�
endstream
endobj
58 0 obj
5242
endobj
56 0 obj
<< /Type /Font
/Subtype /CIDFontType2
/BaseFont /Roboto-Regular
/CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >>
/FontDescriptor 54 0 R
/CIDToGIDMap /Identity
/W [0 [440 241 566 547 646 547 557 526 246 534 540 559 336 557 557 261 557 643 512 676 592 546 519 869 324 481 241 557 344 557 626 707 195 557 557 270 745 469 564 611 548 682 866 647 707 651 589 880 339 345 492 240 503 557 562 448 210 564 557 557 557 618 274 409 631 317 237 ]
]
>>
endobj
57 0 obj
<< /Length 826 >>
stream
/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<0000> <FFFF>
endcodespacerange
2 beginbfrange
<0000> <0000> <0000>
<0001> <0042> [<0069> <006F> <006E> <0043> <0075> <0062> <0065> <0020> <004C> <0061> <0064> <0072> <0031> <0035> <002E> <0030> <0055> <0073> <0047> <0054> <0068> <0063> <006D> <0074> <0076> <006C> <0070> <0066> <0067> <0050> <0048> <002C> <0032> <0034> <0049> <0077> <0079> <0045> <0052> <0046> <004F> <004D> <0041> <004E> <0044> <0053> <0057> <0028> <0029> <0078> <003A> <006B> <0033> <002B> <005F> <003B> <0071> <0037> <0038> <0036> <0042> <002D> <002F> <0056> <0022> <006A> ]
endbfrange
endcmap
CMapName currentdict /CMap defineresource pop
end
end

endstream
endobj
6 0 obj
<< /Type /Font
/Subtype /Type0
/BaseFont /Roboto-Regular
/Encoding /Identity-H
/DescendantFonts [56 0 R]
/ToUnicode 57 0 R>>
endobj
59 0 obj
<< /Type /FontDescriptor
/FontName /QHCAAA+Consolas
/Flags 4 
/FontBBox [-432.128906 -302.246093 677.246093 1011.23046 ]
/ItalicAngle 0 
/Ascent 742.675781 
/Descent -257.324218 
/CapHeight 742.675781 
/StemV 70.3125000 
/FontFile2 60 0 R
>>
endobj
60 0 obj
<<
/Length1 11900 
/Length 63 0 R
/Filter /FlateDecode
>>
stream
x��yytǙgW7�� �H$��M���/�%ID @�hZ�%��x��-;vd[����$���x2Il����;M6;���y��y����Yٱw=~�l�W�
�e�X�+tuu�W���jR����8�P�������`����%Vf�Ux�o������c�hde��e��X�<�L�=<�����}���u<�<�6�����ߚ(ʌ�/.��[�ڨ'(ʢ�g6^��ێ��\MQ�a�͢�(1E��(
�;�kj��

i����E-�J�7��՛@��c�R]TwS���'hZ:E�)�o���bލ2S"j��D��̀�
8EJ�7;��J��:\��`��_G0P���K���f�$��Pe�_���!frMD��*U��@p@���h����.�;�c{��~Ra�K
d�R���D)SH*�*d����5��n��g���x�mv����5FCqQ�`�r����`tnZZ�T�*�R��^�����A6{��*'CN�r��`�>��{�#�3j7��2�L&/S�f���T��j��L=���S�ĔL�R���Xƿ,3�-f�N���(�c��"�Q6����*�uא����w���4j~<��+���wN�[L�M���X���}�d:1>��b���TZgecS��PsyE�R�r9C�};�B�e��[
��8]�a��
<��90��r"�����L
���Zde���[�o��k���}��:u4�&��Rt��k�e�R��ܳR����rW�<32|y�'X+˖;]����
�r��P���ڽ���!T(��ܭk�x��n~¼���sb�
`}h�?�(��üпep���@�}�����������7���V�3�N������4*�щ��	��W:�Ln�hW��~�ď�M!�,e1���NY(��pI6,R��I�y󌤦ʍ�yvx�|��Zv����ݡ�J�ԾW���x��Z���~|�������LTӆo`i]���.~!U�9s�,�o�޽���s�`���XOW�W�}�c���^�pT�ܾ@������Se������� n�x�;�j�[�*�]�������g6�r�F���3hd
�V�x�
b�΂f>O��:���
~B���yv�I�(�IN�cD����oyk�g\Nvpr���[������D|d�)d1��⨫�i�Ֆ;�Z��5ώ�AbF")�>��:��g��Ӄ[����clr����]��ju.w�	�3����_�V��h*l5�kg�:MqQQ�Fge��U�+*F��H��ZQkQ�����q��Vi���7�xt��壍�G�P�:���1?'�F�<�`����(�
�+ǝ��q����o�t+����;���yi|dϤB����~���@����;=�Z�����P���j�vn�xh���.g0������PR�˟S(d�B�!�����1��])*�����`Vi
T�؅�I���9�n�(U>恟���p�Q=�*�#�b�Q��9�/�ռxF24:>3������!�3�u�r��;w���b��^g9�H���G~z�>PQ�ӵ��/�xr_k��*�0[�
d?)hؐ�2�+RG�-(v�y�����3#���*�pEy������\�Ku~������(6Z<�mkG�.�͊f��p
��,���x�}k�7�܀=�T0/�hw(y@�k���PwV�������.?+���X��5L|5���Ţ"nJ����y����~:���k�6X��6�W)��\i���z}�~�}d��~���֦{����%�4>�Z�8R�p?{��$�L��bdU6���|fh�7/{�G�=�.W��eI���$�'��OdZ��3��$7w��Cj)������5�Ȇ��6���F���]��Lks�ɿ����ll��W[W��=911��BPf xO_s�ۣ׫U���ᕖ��;�5�xkL�B.���{&;�+���˂��\�+)�R"��Qc�F�F��hL*��Q�u{�몽����Y��P&/Ui�&�V�Ҫ4P�X�+�5���������OT<�"�V�Y�.V(����ʚ,j�m�B���ػ�c���Xs��-���%��������Kp��r��q��Ľ��V:tZTTR�**)���A��6�����֎�S˨�.r����t���
:�����j�]Q��ZSӾg�Ζ�r�x�"j�j��hJ���W@i�q�/p��k/����p���i�$wg��w�4�ɡ3�v�Gw�T榛�~��ysm�E����]���ij@5S�O�����ןC���;�7�����o���\'�큹e�8�~�5�G��[�,��u��h����Ք�d���х�7��O�(�=��"���)��]�ʆM�_���Fy�-�^j*�L�K
eE��R�J�5؞��EQiY��t�����Qo4����G�Ӛ
v��u��>���N	
����Z;B���aW�H�4��lY;�\�Y��e�C�@
�T��e1�Kp�9�/�&8/9�z�ZL0�r�|N��rhR�ĥ���/tZ��dc]�/��{����2UyECco��t�D]����Xg��Y�Q��~֊�Ck��McuMg���`��g���}�aZ2l�v�Y͞*����5��1xȫV�E�N�$T�	�6�h�p�
�!����`&X�=�����:�\NU)Bf���������3[����2}�	(��.��|��OZ�u���v��jF3�1C��"\��^��(�x2\���jƶd�������:�ƈDi���hktVZ�0�hc��M�`����\e	�\��ru�3���'8���4�%#��
�k�`�g�҉��v��)J3A7:
΂$d���^'2}-r��p�?�^G�}k��wf��K��B�S�cHI���M��Խ�zh3P�]�U'�t�[Q���v��5(WF��)�Ѩ$<�ug�}LƤ,1[�C㝡&���@Ն
��;jk�d��uLM�l<Ԥ7�45`T��
��u���D�I,�`���
G�%֘��'w��)�����q7���H$���bv���X+U�-.wm��6Y�J�i���qgW��Vo,.R��Zi0"SZf����}�m5�F�Z��c�`S(�(S�4z��+�^�5�f����Z0n�W��6{I�Q����Huj�F��i���
6-V��R�����b���#��k	�x�G?"u

 ��\�e�|��ܴq�=���3�\�LJ����v�{���xg�������B�A�W/}㟿8�}#uS�\�M5C����`d6e9��ʅ�NU�q6 ��ñ�R5�8�SƆ`CMS������'�`��r������G�5vn�:����YWoc���ͪ�6�"��@@�PG{Q���t5���DZ({�H.s�F+[�in�ꮩ1�D}$Q�J.�JD�
���q55�h�h���6�S
_��-�'Z^5���&*,f�s�4v��1'�ߥ� =�^G��;��z@�@TK�ԣ�Co�?���5Y�k���Alt�
���P��߼��͢�����:��l�{X!7�+��G�z�>���W?�W�f����6�5��9R�rt�X�w獡S�sTB��ǵ��:0
�������
F�NKꚚ�C�Cm�͵6�w�M���zg��\T��B�7:+��>X�hߧV�ڵk��'�M>���BB^懰+�4��x�v���o�ݻ�
�\VTl4y�[G{��n�9x|bp~�U���!}�ڵ��
�
�j8��U�ʖ��ZBc]����m]�ݽ}#��J��Q�QF�.ɈAP����}y�a��ƻ\�kFo";�.�?̈́W��_Y�~?q�CQ1He�s�P�wɝ�9!A�u�pb�G��M�b��깕/��ї�#���:���XG��B��v�N[n�V5�6�\.�f�d�]����U�@_�	�ҏ<u���^=B��=#Ǐ]~��N�]�=ǎ���ag�X�[
ٹ�n��9p\�ZY3z:�q�Ve)��w���vl��Zf�%U�D
!�ڲp�Cͽ}û"F�ƀ1�頻he��_s���
��_�D:�-Vi�1�Ev[}� .�Μ��{n�aO9�/��0����>�>��Nr��&�6�:Ɲ@��O�Пq�v	���W�ז8�~���7��&+Z��!��y,�8�
�ܕW��o+�{�vÁ��3��T��x�j�@��ׇ�;۷�����P(��궎�'��R��%]W���-��.g��嬘�5l0��[#�z��ҨG��o�j�����\")+-��ڂ�*����Q�,���=�q���\^P {<mm��ݶ��@�wV���K��S�E�o�Kk���_Ҷ��tPlz�;���I��p��
%�"H�T���=��x
z�"S�$kܴش����K��k��%1�y{uwˑ��t�[�ET��<[������juW
���=�������J�\����Ѷ�J�J���\Ύ��=m�J��~��N��r�ښ�G��|���nO��vt�ȑ�dNo��U��S旦ý[�pb��O�!����ƩGT��!w�yU��GE�����k��&������b�-T��P���SO��N�S7���N�\�{�C�Tn>Ư+c�����~���'�tW�؞H|���;��ػ붆�ɂ��ߌ��>X׍��m�w���~���|����g��
w�W�Y��d������������������� �z ~�q��"**������‘/s�G#���S�!���qxW���u�́���Cm�j�^lz�,������
hU���}���~��2��"mX?�0�[��]�p�e��;���ze��o���sc�ûv�j�t�8�ؤ�������]{�����F4E�H*"\<`1�h�{���+��O��yY�߁#�'���~��)ķط�ׅ%m����v��ȳ�K��F��5���D�Ǐ�YB)�/c��^��s��
wܖD�����]�F	�;���`�3p�m�p�@�愶�%h)a-�B�П��S	��C��	h^��Vh[x~��К��o�
<bd�����D����>A���oL#s��>�D�!J�>��.�'��şK�%A�i���NH�)}��t�
�>Q�O�JY�짲��Z�G~^���mE�bX1���⇊�ElQ+�n�z��۟%��멜=�B���B���ӧB_D ��S
�.�%0>%�TzW�PzP�R��q�/��'�&��W���WPy��/Bۋ� �ƒK�	�F	W���R�i�Oì
}������Q��@�)=r}	�	})u�	��C��~!���B_&�M��rj\���WP�J�ѧ�cB��J��Q߃J�j�:*�T��Pi*Ee��RY�^|��a$�$ԉ,�M%�b��06G�ûy��=��oW��c�uvG<�NeR�Y�7�^L���x*�c�	vw|n>�aw�2���X��m0	�6�d&�C�0�~�����R"�۹o����:-�ͻl7N����PJ�@YxKg@6��Ja�+h��0�,Qk�X ��1�<~3�w6�y^��fG��a�)NL��`��g�0�M����p���e��<�̥SK�x8�ZX'㱌�N��c�@�Ѵ�X�PUDh7�������/E��7���T*{7]�A>�P,���g�x���,�s��������~�҄�y�
4��^J�u��ό���%s"D�,Y���`�B��=��]�(�������2�[�'4Ä���=�%c��>9/��b��8���𔀧Cdk,JV����V|�f5�7ssz��ě�9�7)b�X��X�0�:��bLk(#�a��(C�����=*�'ފmrX�����eBiC�Q��E�+dw�;<�_\+C�()�k(����ܕ�3A,�[=}��2M�� c1�>���#���uZ�ܻ{B�;���M_H��$��9�2y�_ ��z��
҄A�	���狷-�	<�1�՘�9�x,ː��9��ab�$p��!F}I�)mX{KB8���;-ț\K�x��%�J+ٛ��y�[5�!���Uy��*�*)�Fn~�{zR���B�`��s��s4#؟�WΧp��lI�ov=��=8A�&�s���2#D���躟�OY�_�̟!=LPae]�9��3dn>�-�q{�/Ģ�l*�.ebl<�.�Ss���B<9�ƒ���Tr!��\NF�d�4��#K�l8�e�e�A6YH%S��p��Kf1��b,��C�&I=2N�#YȒ�|�p���Lx!�.ǣ�j6?cS�(�]Y�-��xf5�>�y�ga��T*
dR�H��3R�p�07���'c��t:�YL%��C;
��@0�$؉x2�Z��<F��Dx�
'�ex�ē��%���<V�.���f"��M��Tzv���˂�$I�q<F7)!��ԛZJ�ci�	V9�,C�_H�� �B?�I����i!��X2
��NPVd"�X���Xr4�����%��I,A�n���4�Ľ��B,NdZ�|>�f��l�
D�?�������$dk0Of>��cB3 ?�5����[�,6��D*�����e����6�
g�1vf�=N�`�lО	�yG[��%�<��E(�j�Z&����[����B���E���8�n�/5��.���.//�r���P���q~�6�%��C��,A�4A���9�x�lx&?��R�^��|�]ɫS��8����G��Wr���@.�1(���P,���pQRje׫�e�W��;���o ���ǕE����r<-���ȸYn���OU��M2�]�?�U�6�~mP�Ȅ|���#�T��r�f��3
���%K�˕˜>/+_�$I~�QIy=�o�i�ߍ�k{�P
�H=|*Erp�[�����_W�g16T���'8��c�l{7���]�dq�X��G�����ш�:�BL/��0!� ����ީ$�^U���������w�L'`	�M�#<P����i��V�]��|I�aWH�D*��)��9ň�2^j)���"vg�3K,n�XmU-1.��%R���/BY��0`���lx)���3���;�	
endstream
endobj
63 0 obj
7274
endobj
61 0 obj
<< /Type /Font
/Subtype /CIDFontType2
/BaseFont /Consolas
/CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >>
/FontDescriptor 59 0 R
/CIDToGIDMap /Identity
/DW 545 >>
endobj
62 0 obj
<< /Length 742 >>
stream
/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<0000> <FFFF>
endcodespacerange
2 beginbfrange
<0000> <0000> <0000>
<0001> <0036> [<0069> <006F> <006E> <0063> <0075> <0062> <0065> <002E> <006C> <0061> <0064> <0072> <005F> <0070> <0074> <0068> <0073> <003A> <003B> <002B> <002D> <002F> <0076> <0077> <006D> <0052> <0053> <0020> <003D> <0022> <0066> <0067> <006B> <0031> <0024> <007B> <007D> <0032> <0034> <0030> <0079> <0078> <0037> <0033> <0045> <004E> <004F> <0054> <0049> <0043> <007C> <0044> <0050> <0041> ]
endbfrange
endcmap
CMapName currentdict /CMap defineresource pop
end
end

endstream
endobj
7 0 obj
<< /Type /Font
/Subtype /Type0
/BaseFont /Consolas
/Encoding /Identity-H
/DescendantFonts [61 0 R]
/ToUnicode 62 0 R>>
endobj
2 0 obj
<<
/Type /Pages
/Kids 
[
5 0 R
19 0 R
28 0 R
34 0 R
]
/Count 4
/ProcSet [/PDF /Text /ImageB /ImageC]
>>
endobj
xref
0 64
0000000000 65535 f 
0000000009 00000 n 
0000038262 00000 n 
0000000187 00000 n 
0000000282 00000 n 
0000000756 00000 n 
0000029344 00000 n 
0000038128 00000 n 
0000000319 00000 n 
0000000362 00000 n 
0000000405 00000 n 
0000000449 00000 n 
0000000493 00000 n 
0000000530 00000 n 
0000000574 00000 n 
0000001080 00000 n 
0000007308 00000 n 
0000000877 00000 n 
0000001053 00000 n 
0000007615 00000 n 
0000007329 00000 n 
0000007373 00000 n 
0000007417 00000 n 
0000007454 00000 n 
0000007940 00000 n 
0000012687 00000 n 
0000007737 00000 n 
0000007913 00000 n 
0000012752 00000 n 
0000012708 00000 n 
0000013070 00000 n 
0000017858 00000 n 
0000012874 00000 n 
0000013050 00000 n 
0000020237 00000 n 
0000017879 00000 n 
0000017923 00000 n 
0000020070 00000 n 
0000019896 00000 n 
0000018174 00000 n 
0000018328 00000 n 
0000018467 00000 n 
0000018863 00000 n 
0000019735 00000 n 
0000018660 00000 n 
0000019139 00000 n 
0000019267 00000 n 
0000019430 00000 n 
0000019599 00000 n 
0000020133 00000 n 
0000020555 00000 n 
0000022345 00000 n 
0000020359 00000 n 
0000020535 00000 n 
0000022366 00000 n 
0000022630 00000 n 
0000027984 00000 n 
0000028466 00000 n 
0000027963 00000 n 
0000029484 00000 n 
0000029742 00000 n 
0000037129 00000 n 
0000037334 00000 n 
0000037108 00000 n 
trailer
<<
/Size 64
/Info 1 0 R
/Root 49 0 R
>>
startxref
38381
%%EOF
PK4^�\&�**(doc/alt-php54-ioncube-loader/LICENSE.txtnu�[���LICENCE AGREEMENT FOR THE IONCUBE PHP LOADER, PROVIDED TO ENABLE THE USE
OF IONCUBE ENCODED FILES AND AS PART OF THE IONCUBE24 SERVICE (ioncube24.com)

YOU SHOULD CAREFULLY READ THE FOLLOWING TERMS AND CONDITIONS BEFORE USING THE
LOADER SOFTWARE. THE INSTALLATION AND/OR USE OR COPYING OF THE IONCUBE PHP
LOADER SOFTWARE INDICATES YOUR ACCEPTANCE OF THIS LICENCE AGREEMENT.  IF YOU
DO NOT ACCEPT THE TERMS OF THIS LICENCE AGREEMENT, DO NOT INSTALL, COPY
AND/OR USE THE LOADER SOFTWARE.

DEFINITIONS

The following definitions shall apply in this document:

LOADER shall mean the ionCube PHP Loader software package or collection 
of Loaders, including any modifications or upgrades to the software, used for
executing PHP scripts previously encoded with the ionCube PHP Encoder
software to render them non-humanly readable, and any associated
documentation or electronic or online materials relating to the software.

ENCODER shall mean any ionCube PHP Encoder software or service used for the
purpose of producing non-humanly readable encoded files from PHP scripts.

ENCODED FILE shall mean a non-humanly readable file produced by the 
Encoder and being derived from humanly readable PHP script source.

PROVIDER shall mean ionCube Ltd.

USER/YOU shall mean any entity who has downloaded or obtained through any
other means a version of the Loader software.


1 LICENSE ENTITLEMENT 

1.1 The Loader is provided without charge.  Title to the Loader does not pass
to the user in any circumstances.  The Loader is supplied as object code.

1.2 The provider grants a personal, non-transferable, non-exclusive licence to
use the Loader in accordance with the terms and conditions of this Licence
Agreement.

1.3 The installation or downloading and use of the Loader entitles the user
to install and use the Loader for its own internal lawful purposes.


2 DISTRIBUTION 

2.1 The Loader may be freely distributed to third parties alone or as 
part of a distribution containing other items provided that this license
is also included. 

2.2 The Loader may under no circumstances be branded as another product, 
whether distributed or not. 

2.3 Distribution as part of a commercial product is permitted provided such
distribution is in accordance with clauses 2.1 and 2.2 with respect to the 
Loader.


3 ANALYSIS / REVERSE ENGINEERING / MODIFICATION 

Except insofar as the user is permitted to do so in accordance with applicable
law:

3.1 Any analysis of the Loader and embedded data by any means and by
any entity whether human or otherwise and including but without limitation to
discover details of internal operation, to reverse engineer, to de-compile
object code, or to modify for the purposes of modifying behaviour is
forbidden.

3.2 Any analysis of encoded files by any means and by any entity whether human
or otherwise and including but without limitation to discover details of file
format or for the purposes of modifying behaviour or scope of their usage is
forbidden.


4 WARRANTY

THE LOADER SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 
WARRANTIES INCLUDING BUT WITHOUT LIMITATION THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE ARE
DISCLAIMED. THE PROVIDER DOES NOT WARRANT THAT THE LOADER IS UNINTERRUPTED
OR ERROR FREE, NOR THAT THE OPERATION OF THE LOADER WILL FUNCTION IN
CONJUNCTION WITH ANY OTHER PRODUCT.  


5 LIMITATION OF LIABILITY 

5.1 IN NO EVENT WILL THE PROVIDER OF THE LOADER BE LIABLE TO THE USER OR ANY
PARTY FOR ANY DIRECT, INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR OTHER
CONSEQUENTIAL DAMAGES ARISING DIRECTLY OR INDIRECTLY FROM THIS LICENCE
AGREEMENT OR ANY USE OF THE LOADER OR ENCODED FILES, EVEN IF THE PROVIDER IS
EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

5.2 THE LOADER IS PROVIDED ON AN "AS IS" BASIS.  THE PROVIDER EXCLUDES ALL
WARRANTIES, CONDITIONS, TERMS, UNDERTAKINGS AND REPRESENTATIONS (EXCLUDING
FRAUDULENT MISREPRESENTATION) OF ANY KIND, EXPRESS OR IMPLIED, STATUTORY OR
OTHERWISE IN CONNECTION WITH THE LOADER TO THE FULLEST EXTENT PERMITTED BY
LAW.

5.3 DOWNLOADING THE LOADER IS AT YOUR OWN RISK AND THE PROVIDER DOES NOT
ACCEPT LIABILITY FOR ANY DIRECT OR INDIRECT LOSS OR DAMAGE HOWSOEVER CAUSED AS
A RESULT OF ANY COMPUTER VIRUSES, BUGS, TROJAN HORSES, WORMS, SOFTWARE BOMBS
OR OTHER SIMILAR PROGRAMS ARISING FROM YOUR USE OF THE LOADER.  WHILST THE
PROVIDER WILL DO ITS BEST TO ENSURE THAT THE LOADER IS FREE FROM SUCH
DESTRUCTIVE PROGRAMS, IT IS YOUR RESPONSIBILITY TO TAKE REASONABLE PRECAUTIONS
TO SCAN FOR SUCH DESTRUCTIVE PROGRAMS DOWNLOADED FROM THE INTERNET.

5.4 THE PROVIDER'S MAXIMUM LIABILITY FOR ANY LOSS OR DAMAGE ARISING FROM THIS
LICENCE AGREEMENT SHALL IN ANY EVENT BE LIMITED IN THE SOLE DISCRETION OF THE
PROVIDER TO THE REPLACEMENT OF THE LOADER PRODUCT.

5.5 DUE TO THE NATURE OF THE INTERNET, THE PROVIDER CANNOT GUARANTEE THAT ANY
E-MAILS OR OTHER ELECTRONIC TRANSMISSIONS WILL BE SENT TO YOU OR RECEIVED BY
THE PROVIDER OR THAT THE CONTENT OF SUCH TRANSMISSIONS WILL BE SECURE DURING
TRANSMISSION.


6 BUG FIXING AND PRODUCT SUPPORT 

6.1 The provider will use reasonable endeavours to provide support to users.
The provider will at their discretion only provide support for the latest
release.

6.2 Support comprises of fault reporting via tickets and fault diagnosis,
recommendations on workarounds, and where reasonably possible a timely
resolution.

6.3 The user accepts that on occasion the ability of the provider to meet
anticipated or published support schedules may be impaired due to, but without
limitation, Internet service provider failures or software failures that
affect the ability to communicate for an indeterminate period.

6.4 The provider reserves the right to refuse to provide support at any time.

6.5 The provider wishes to maintain and offer a product of the highest
possible quality, and accordingly may from time to time and at its discretion
make product changes for the purpose of correcting behaviour in variance to
the published specification or the user's reasonable expectations. 

6.6 The provider reserves the right to charge for support where the user does
not have a valid support plan in place, or where the support offered exceeds
the scope of the active support plan.


7 PRODUCT UPGRADES

7.1 The provider may from time to time release product upgrades. These will
be provided free of charge and attempts made to provide a timely notification
to customers of the existence of any new release.


8 ERRORS AND OMISSIONS

Whilst reasonable endeavours are made to ensure the accuracy of documentation
concerning the details of the Loader, the user accepts the possibility of
inaccuracies in information presented in any format, including email
communications and online services. The provider shall under no circumstances
be liable for any events that arise as a result of unintentional inaccuracies
or omissions.


9 USER INDEMNITY

You agree to fully indemnify, defend and hold the provider harmless
immediately upon demand from and against all actions, liability, claims,
losses, damages, costs and expenses (including legal/attorney fees) incurred
by the provider arising directly or indirectly as a result of your breach of
this Licence Agreement.


10 INTELLECTUAL PROPERTY RIGHTS

10.1 The user acknowledges that the Loader and associated documentation and
materials contain proprietary information of the provider and are and shall
remain the exclusive property of the provider and/or its licensors and all
title, copyright, trade marks, trade names, patents and other intellectual
property rights therein of whatever nature shall remain the sole property of
the provider and/or its licensors.

10.2 No title to or rights of ownership, copyright or other intellectual
property in the Loader is transferred to the user (other than the licence
rights expressly granted in this Licence Agreement).


11 TERMINATION

11.1 The provider reserves the right to terminate this Licence Agreement
immediately by notice in writing against the user if the user is in breach of
any terms and conditions of this Licence Agreement.

11.2 Termination of this Licence Agreement for any reason shall be without
prejudice to any other rights or remedies of the provider which may have
arisen on or before the date of termination under this Licence Agreement or in
law.

11.3 The provisions of the following clauses shall survive any termination of
this agreement; clause 3, 5, 10 and 13.


12 GENERAL

12.1 The provider reserves the right to transfer or assign all or any of its
rights and duties and responsibilities set out in this Licence Agreement to
another party.

12.2 Headings have been included for convenience only and will not be used in
construing any provision of this Licence Agreement.

12.3 No delay or failure by the provider to exercise any powers, rights or
remedies under this Licence Agreement will operate as a waiver of them nor
will any single or partial exercise of any such powers, rights or remedies
include any other or further exercise of them.

12.4 If any part of this Licence Agreement is found by a court of competent
jurisdiction or other competent authority to be invalid, unlawful or
unenforceable then such part shall be severed from the remainder of this
Licence Agreement which will continue to be valid and enforceable to the
fullest extent permitted by applicable law.

12.5 This Licence Agreement including the documents or other sources referred
to herein supersede all prior representations, understandings and agreements
between the user and the provider relating to the Loader and sets forth the
entire agreement and understanding between the user and the provider relating
to the Loader.

12.6 Nothing in this Licence Agreement shall be deemed to constitute a
partnership between you and the provider nor constitute either party being an
agent of the other party.

12.7 This Agreement does not create any rights or benefits enforceable by any
person not a party to it (within the meaning of the U.K.Contracts (Rights of
Third Parties) Act 1999) except that a person who under clause 12.1 is a
permitted successor or assignee of the rights or benefits of the provider may
enforce such rights or benefits.


13 GOVERNING LAW AND JURISDICTION

This License Agreement and any issues relating thereto shall be construed and
interpreted in accordance with the laws of England and subject to the
exclusive jurisdiction of the English courts.

Copyright (c) 2002-2024 ionCube Ltd.          Last revised 23-April-2015
PK4^�\P�$���'doc/alt-php54-ioncube-loader/README.txtnu�[���                            The ionCube Loader 
                            ------------------

This package contains:

* ionCube Loaders

* a Loader Wizard script to assist with Loader installation (loader-wizard.php)

* the License document for use of the Loader and encoded files (LICENSE.txt)

* User Guide describing options that can be configured through a php.ini file.  
  There are options that may improve performance, particularly with files on
  a network drive. Options for the ionCube24 intrusion protection and PHP error
  reporting service (ioncube24.com) are also described.


INSTALLATION
============

Quick Guide for experienced system admins
-----------------------------------------

The Loader is a PHP engine extension, so should be referenced with 
a zend_extension line in a php.ini file. It must be the first engine
extension to be installed. 

The Loader must be for the correct operating system, match the 
PHP version, and for whether PHP is built as thread-safe (TS) or not. 
All information required for installing is available on a phpinfo page. 

For example, if your web server is 64 bit Linux, thread safety is disabled,
PHP is version 8.1.8, the main php.ini file is /etc/php.ini and you
have unpacked Loaders to /usr/local/ioncube, you would:

1) edit /etc/php.ini
2) at the top of the php.ini file add

zend_extension = /usr/local/ioncube/ioncube_loader_lin_8.1.so

3) restart the PHP environment (i.e. Apache, php-fpm, etc.)

4) Check a phpinfo page and the Loader should show up in the Zend Engine box.


Assisted Installation with the Loader Wizard
--------------------------------------------

1. Upload the contents of this package to a directory/folder called ioncube
   within the top level of your web scripts area. This is sometimes called the
   "web root" or "document root". Common names for this location are "www",
   "public_html", and "htdocs", but it may be different on your server.

2. Launch the Loader Wizard script in your browser. For example:
     https://yourdomain/ioncube/loader-wizard.php

   If the wizard is not found, check carefully the location on your server
   where you uploaded the Loaders and the wizard script. 

3. Follow the steps given by the Loader Wizard. If you have full access to the 
   server then installation should be easy. If your hosting plan is more limited, 
   you may need to ask your hosting provider for assistance. 

4. The Loader Wizard can automatically create a ticket in our support system
   if installation is unsuccessful, and we are happy to assist in that case.

   YouTube with a search for "ioncube loader wizard" also gives some helpful 
   examples of installation.


WHERE TO INSTALL THE LOADERS
============================

The Loader Wizard should be used to guide the installation process but the
following are the standard locations for the Loader files. Loader file
packages can be obtained from https://www.ioncube.com/loaders.php

Please check that you have the correct package of Loaders for your system.

Installing to a remote SHARED server
------------------------------------

* Upload the Loader files to a directory/folder called ioncube within your
  main web scripts area.  (This will probably be where you placed the
  loader-wizard.php script.)


Installing to a remote UNIX/LINUX DEDICATED or VPS server
---------------------------------------------------------

* Upload the Loader files to the PHP extensions directory or, if that is
  not set, /usr/local/ioncube


** Installing to a remote WINDOWS DEDICATED or VPS server

* Upload the Loader files to the PHP extensions directory or, if that is
  not set, C:\windows\system32


64-BIT LOADERS FOR WINDOWS
--------------------------

64-bit Loaders for Windows are available for PHP 5.5 upwards.
The Loader Wizard will not give directions for installing 64-bit Loaders for
any earlier version of PHP 5.

Copyright (c) 2002-2025 ionCube Ltd.           Last revised January 2025
PK5^�\E���))5doc/pear/MonologBridge/Symfony/Bridge/Monolog/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK5^�\�׾X��:doc/pear/MonologBridge/Symfony/Bridge/Monolog/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * added ConsoleHandler and ConsoleFormatter which can be used to show log messages
   in the console output depending on the verbosity settings

2.1.0
-----

 * added ChromePhpHandler
PK6^�\|���00;doc/pear/MonologBridge/Symfony/Bridge/Monolog/composer.jsonnu�[���{
    "name": "symfony/monolog-bridge",
    "type": "symfony-bridge",
    "description": "Symfony Monolog Bridge",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "monolog/monolog": "~1.3"
    },
    "require-dev": {
        "symfony/http-kernel": "~2.2",
        "symfony/console": "~2.3",
        "symfony/event-dispatcher": "~2.2"
    },
    "suggest": {
        "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.",
        "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings. You need version ~2.3 of the console for it.",
        "symfony/event-dispatcher": "Needed when using log messages in console commands"
     },
    "autoload": {
        "psr-0": { "Symfony\\Bridge\\Monolog\\": "" }
    },
    "target-dir": "Symfony/Bridge/Monolog",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK6^�\^�m�7doc/pear/MonologBridge/Symfony/Bridge/Monolog/README.mdnu�[���Monolog Bridge
==============

Provides integration for Monolog with various Symfony2 components.

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Bridge/Monolog/
    $ composer.phar install
    $ phpunit
PK6^�\E���))8doc/pear/HttpKernel/Symfony/Component/HttpKernel/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK7^�\�O9�
�
=doc/pear/HttpKernel/Symfony/Component/HttpKernel/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * added event listeners for the session
 * added the KernelEvents::FINISH_REQUEST event

2.3.0
-----

 * [BC BREAK] renamed `Symfony\Component\HttpKernel\EventListener\DeprecationLoggerListener` to `Symfony\Component\HttpKernel\EventListener\ErrorsLoggerListener` and changed its constructor
 * deprecated `Symfony\Component\HttpKernel\Debug\ErrorHandler`, `Symfony\Component\HttpKernel\Debug\ExceptionHandler`,
   `Symfony\Component\HttpKernel\Exception\FatalErrorException`, and `Symfony\Component\HttpKernel\Exception\FlattenException`
 * deprecated `Symfony\Component\HttpKernel\Kernel::init()``
 * added the possibility to specify an id an extra attributes to hinclude tags
 * added the collect of data if a controller is a Closure in the Request collector
 * pass exceptions from the ExceptionListener to the logger using the logging context to allow for more
   detailed messages

2.2.0
-----

 * [BC BREAK] the path info for sub-request is now always _fragment (or whatever you configured instead of the default)
 * added Symfony\Component\HttpKernel\EventListener\FragmentListener
 * added Symfony\Component\HttpKernel\UriSigner
 * added Symfony\Component\HttpKernel\FragmentRenderer and rendering strategies (in Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface)
 * added Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel
 * added ControllerReference to create reference of Controllers (used in the FragmentRenderer class)
 * [BC BREAK] renamed TimeDataCollector::getTotalTime() to
   TimeDataCollector::getDuration()
 * updated the MemoryDataCollector to include the memory used in the
   kernel.terminate event listeners
 * moved the Stopwatch classes to a new component
 * added TraceableControllerResolver
 * added TraceableEventDispatcher (removed ContainerAwareTraceableEventDispatcher)
 * added support for WinCache opcode cache in ConfigDataCollector

2.1.0
-----

 * [BC BREAK] the charset is now configured via the Kernel::getCharset() method
 * [BC BREAK] the current locale for the user is not stored anymore in the session
 * added the HTTP method to the profiler storage
 * updated all listeners to implement EventSubscriberInterface
 * added TimeDataCollector
 * added ContainerAwareTraceableEventDispatcher
 * moved TraceableEventDispatcherInterface to the EventDispatcher component
 * added RouterListener, LocaleListener, and StreamedResponseListener
 * added CacheClearerInterface (and ChainCacheClearer)
 * added a kernel.terminate event (via TerminableInterface and PostResponseEvent)
 * added a Stopwatch class
 * added WarmableInterface
 * improved extensibility between bundles
 * added profiler storages for Memcache(d), File-based, MongoDB, Redis
 * moved Filesystem class to its own component
PK7^�\7k����>doc/pear/HttpKernel/Symfony/Component/HttpKernel/composer.jsonnu�[���{
    "name": "symfony/http-kernel",
    "type": "library",
    "description": "Symfony HttpKernel Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/event-dispatcher": "~2.1",
        "symfony/http-foundation": "~2.4",
        "symfony/debug": "~2.3",
        "psr/log": "~1.0"
    },
    "require-dev": {
        "symfony/browser-kit": "~2.2",
        "symfony/class-loader": "~2.1",
        "symfony/config": "~2.0",
        "symfony/console": "~2.2",
        "symfony/dependency-injection": "~2.0",
        "symfony/finder": "~2.0",
        "symfony/process": "~2.0",
        "symfony/routing": "~2.2",
        "symfony/stopwatch": "~2.2",
        "symfony/templating": "~2.2"
    },
    "suggest": {
        "symfony/browser-kit": "",
        "symfony/class-loader": "",
        "symfony/config": "",
        "symfony/console": "",
        "symfony/dependency-injection": "",
        "symfony/finder": ""
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\HttpKernel\\": "" }
    },
    "target-dir": "Symfony/Component/HttpKernel",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK7^�\��Xͫ
�
:doc/pear/HttpKernel/Symfony/Component/HttpKernel/README.mdnu�[���HttpKernel Component
====================

HttpKernel provides the building blocks to create flexible and fast HTTP-based
frameworks.

``HttpKernelInterface`` is the core interface of the Symfony2 full-stack
framework:

    interface HttpKernelInterface
    {
        /**
         * Handles a Request to convert it to a Response.
         *
         * @param  Request $request A Request instance
         *
         * @return Response A Response instance
         */
        function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true);
    }

It takes a ``Request`` as an input and should return a ``Response`` as an
output. Using this interface makes your code compatible with all frameworks
using the Symfony2 components. And this will give you many cool features for
free.

Creating a framework based on the Symfony2 components is really easy. Here is
a very simple, but fully-featured framework based on the Symfony2 components:

    $routes = new RouteCollection();
    $routes->add('hello', new Route('/hello', array('_controller' =>
        function (Request $request) {
            return new Response(sprintf("Hello %s", $request->get('name')));
        }
    )));

    $request = Request::createFromGlobals();

    $context = new RequestContext();
    $context->fromRequest($request);

    $matcher = new UrlMatcher($routes, $context);

    $dispatcher = new EventDispatcher();
    $dispatcher->addSubscriber(new RouterListener($matcher));

    $resolver = new ControllerResolver();

    $kernel = new HttpKernel($dispatcher, $resolver);

    $kernel->handle($request)->send();

This is all you need to create a flexible framework with the Symfony2
components.

Want to add an HTTP reverse proxy and benefit from HTTP caching and Edge Side
Includes?

    $kernel = new HttpKernel($dispatcher, $resolver);

    $kernel = new HttpCache($kernel, new Store(__DIR__.'/cache'));

Want to functional test this small framework?

    $client = new Client($kernel);
    $crawler = $client->request('GET', '/hello/Fabien');

    $this->assertEquals('Fabien', $crawler->filter('p > span')->text());

Want nice error pages instead of ugly PHP exceptions?

    $dispatcher->addSubscriber(new ExceptionListener(function (Request $request) {
        $msg = 'Something went wrong! ('.$request->get('exception')->getMessage().')';

        return new Response($msg, 500);
    }));

And that's why the simple looking ``HttpKernelInterface`` is so powerful. It
gives you access to a lot of cool features, ready to be used out of the box,
with no efforts.

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/HttpKernel/
    $ composer.phar install
    $ phpunit
PK8^�\E���))Bdoc/pear/EventDispatcher/Symfony/Component/EventDispatcher/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK8^�\��7���Gdoc/pear/EventDispatcher/Symfony/Component/EventDispatcher/CHANGELOG.mdnu�[���CHANGELOG
=========

2.1.0
-----

 * added TraceableEventDispatcherInterface
 * added ContainerAwareEventDispatcher
 * added a reference to the EventDispatcher on the Event
 * added a reference to the Event name on the event
 * added fluid interface to the dispatch() method which now returns the Event
   object
 * added GenericEvent event class
 * added the possibility for subscribers to subscribe several times for the
   same event
 * added ImmutableEventDispatcher
PK9^�\��l���Hdoc/pear/EventDispatcher/Symfony/Component/EventDispatcher/composer.jsonnu�[���{
    "name": "symfony/event-dispatcher",
    "type": "library",
    "description": "Symfony EventDispatcher Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "require-dev": {
        "symfony/dependency-injection": "~2.0"
    },
    "suggest": {
        "symfony/dependency-injection": "",
        "symfony/http-kernel": ""
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\EventDispatcher\\": "" }
    },
    "target-dir": "Symfony/Component/EventDispatcher",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK9^�\|j
֌�Ddoc/pear/EventDispatcher/Symfony/Component/EventDispatcher/README.mdnu�[���EventDispatcher Component
=========================

The Symfony2 EventDispatcher component implements the Mediator pattern in a
simple and effective way to make your projects truly extensible.

    use Symfony\Component\EventDispatcher\EventDispatcher;
    use Symfony\Component\EventDispatcher\Event;

    $dispatcher = new EventDispatcher();

    $dispatcher->addListener('event_name', function (Event $event) {
        // ...
    });

    $dispatcher->dispatch('event_name');

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/EventDispatcher/
    $ composer.phar install
    $ phpunit
PK9^�\E���)):doc/pear/Translation/Symfony/Component/Translation/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK9^�\�^�;zz?doc/pear/Translation/Symfony/Component/Translation/CHANGELOG.mdnu�[���CHANGELOG
=========

2.3.0
-----

 * added classes to make operations on catalogues (like making a diff or a merge on 2 catalogues)
 * added Translator::getFallbackLocales()
 * deprecated Translator::setFallbackLocale() in favor of the new Translator::setFallbackLocales() method

2.2.0
-----

 * QtTranslationsLoader class renamed to QtFileLoader. QtTranslationsLoader is deprecated and will be removed in 2.3.
 * [BC BREAK] uniformized the exception thrown by the load() method when an error occurs. The load() method now
   throws Symfony\Component\Translation\Exception\NotFoundResourceException when a resource cannot be found
   and Symfony\Component\Translation\Exception\InvalidResourceException when a resource is invalid.
 * changed the exception class thrown by some load() methods from \RuntimeException to \InvalidArgumentException
   (IcuDatFileLoader, IcuResFileLoader and QtFileLoader)

2.1.0
-----

 * added support for more than one fallback locale
 * added support for extracting translation messages from templates (Twig and PHP)
 * added dumpers for translation catalogs
 * added support for QT, gettext, and ResourceBundles
PK:^�\>���@doc/pear/Translation/Symfony/Component/Translation/composer.jsonnu�[���{
    "name": "symfony/translation",
    "type": "library",
    "description": "Symfony Translation Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "require-dev": {
        "symfony/config": "~2.0",
        "symfony/yaml": "~2.2"
    },
    "suggest": {
        "symfony/config": "",
        "symfony/yaml": ""
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Translation\\": "" }
    },
    "target-dir": "Symfony/Component/Translation",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK:^�\t?�A��<doc/pear/Translation/Symfony/Component/Translation/README.mdnu�[���Translation Component
=====================

Translation provides tools for loading translation files and generating
translated strings from these including support for pluralization.

    use Symfony\Component\Translation\Translator;
    use Symfony\Component\Translation\MessageSelector;
    use Symfony\Component\Translation\Loader\ArrayLoader;

    $translator = new Translator('fr_FR', new MessageSelector());
    $translator->setFallbackLocales(array('fr'));
    $translator->addLoader('array', new ArrayLoader());
    $translator->addResource('array', array(
        'Hello World!' => 'Bonjour',
    ), 'fr');

    echo $translator->trans('Hello World!')."\n";

Resources
---------

Silex integration:

https://github.com/fabpot/Silex/blob/master/src/Silex/Provider/TranslationServiceProvider.php

Documentation:

http://symfony.com/doc/2.4/book/translation.html

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Translation/
    $ composer.phar install
    $ phpunit
PK:^�\����doc/pear/Mail/LICENSEnu�[���Copyright (c) 1997-2017, Chuck Hagenbuch
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its
   contributors may be used to endorse or promote products derived from
   this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK;^�\E���))0doc/pear/Locale/Symfony/Component/Locale/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK;^�\����EE5doc/pear/Locale/Symfony/Component/Locale/CHANGELOG.mdnu�[���CHANGELOG
=========

2.1.0
-----

 * added Locale::getIntlIcuVersion(), Locale::getIntlIcuDataVersion(), Locale::getIcuDataVersion() and Locale::getIcuDataDirectory()
 * renamed update-data.php to build-data.php, the script usage changed, now it is easier to update the ICU data
 * updated the ICU data to the release 49.1.2
PK;^�\��S���6doc/pear/Locale/Symfony/Component/Locale/composer.jsonnu�[���{
    "name": "symfony/locale",
    "type": "library",
    "description": "Symfony Locale Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/intl": ">=2.3"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Locale\\": "" }
    },
    "target-dir": "Symfony/Component/Locale",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK<^�\�{~2doc/pear/Locale/Symfony/Component/Locale/README.mdnu�[���Locale Component
================

Locale provides fallback code to handle cases when the ``intl`` extension is
missing.

The Locale component is deprecated since version 2.3 and will be removed in
Symfony 3.0. You should use the more capable Intl component instead.
PK=^�\X�&��doc/pear/Archive/docs/CREDITSnu�[���CREDITS
=======

eZ Components team
------------------

- Sergey Alexeev
- Sebastian Bergmann
- Jan Borsodi
- Raymond Bosman
- Frederik Holljen
- Kore Nordmann
- Derick Rethans
- Vadym Savchuk
- Tobias Schlitt
- Alexandru Stanoi
PK=^�\X��""doc/pear/Archive/docs/LICENSEnu�[���eZ Components Licence
=====================

New BSD Licence
---------------

Copyright (c) 2005-2008, eZ Systems A.S.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
  copyright notice, this list of conditions and the following
  disclaimer in the documentation and/or other materials provided
  with the distribution.
* Neither the name of eZ Systems A.S. nor the names of its
  contributors may be used to endorse or promote products derived
  from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK@^�\���+,doc/pear/Archive/docs/tutorial_read_only.phpnu�[���<?php
require_once 'tutorial_autoload.php';

$options = new ezcArchiveOptions( array( 'readOnly' => true ) );
$archive = ezcArchive::open(
    "compress.zlib:///tmp/my_archive.tar.gz", null, $options );

// The foreach method calls internally the iterator methods.
foreach( $archive as $entry )
{
    echo $entry, "\n";

    $archive->extractCurrent( "/tmp/target_location/" );
}
?>
PKA^�\ϱ*doc/pear/Archive/docs/tutorial_extract.phpnu�[���<?php

require_once 'tutorial_autoload.php';
date_default_timezone_set( "UTC" );

// Open the gzipped TAR archive.
$archive = ezcArchive::open( "compress.zlib:///tmp/my_archive.tar.gz" );

while( $archive->valid() )
{
    // Returns the current entry (ezcArchiveEntry).
    $entry = $archive->current();

    // ezcArchiveEntry has an __toString() method.
    echo $entry, "\n";

    // Extract the current archive entry to /tmp/target_location/
    $archive->extractCurrent( "/tmp/target_location/" );

    $archive->next();
}

?>
PKA^�\�����.doc/pear/Archive/docs/tutorial_directories.phpnu�[���<?php

require_once 'tutorial_autoload.php';
date_default_timezone_set( "UTC" );

$archive = ezcArchive::open( "/tmp/my_archive.zip" );
$archive->truncate();

$filesToAppend[] = "/tmp/directory/";
$filesToAppend[] = "/tmp/file.txt";

// The second parameter specifies prefix. The prefix is normally not included 
// in the archive.
$archive->appendToCurrent( $filesToAppend, "/tmp/" );

?>
PKB^�\��x=��+doc/pear/Archive/docs/tutorial_autoload.phpnu�[���<?php
$dir = dirname( __FILE__ );
$dirParts = explode( DIRECTORY_SEPARATOR, $dir );
switch ( $dirParts[count( $dirParts ) - 3] )
{
    case 'doc': require_once 'ezc/Base/base.php'; break; // pear
    case 'trunk': require_once "$dir/../../Base/src/base.php"; break; // svn
    default: require_once "$dir/../../Base/src/base.php"; break; // bundle
}

/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}
?>
PKB^�\J�P�**+doc/pear/Archive/docs/tutorial_iterator.phpnu�[���<?php
require_once 'tutorial_autoload.php';

$archive = ezcArchive::open( "compress.zlib:///tmp/my_archive.tar.gz" );

// The foreach method calls internally the iterator methods.
foreach( $archive as $entry )
{
    echo $entry, "\n";

    $archive->extractCurrent( "/tmp/target_location/" );
}
?>
PKC^�\�qV���"doc/pear/Archive/docs/tutorial.txtnu�[���eZ Components - Archive
~~~~~~~~~~~~~~~~~~~~~~~

.. contents:: Table of Contents

Introduction
============

The Archive component provides a generic API for creating and extracting
archives.  Currently, the Archive component supports the Tar and Zip formats.
Compression algorithms, such as GZip or BZip2, are indirectly supported.
The stream wrappers from PHP should be used to handle compressed archives.


Class overview
==============

The following list sums up the most important classes:

ezcArchive
  This class provides the main API for accessing or creating a
  Tar or Zip archive. ezcArchive provides methods for
  extracting entries (files, directories, symbolic links and so on), appending
  entries and removing entries. 

ezcArchiveEntry
  The ezcArchiveEntry class is returned when an entry (such as a file or
  directory) is requested from the opened archive. ezcArchiveEntry provides
  entry information about the path, its access rights and whether the entry is
  a directory, a symbolic link, a hard link, a block-file and so on. The owner name, the
  group name and the last access time are also available. 
 
More information about these classes can be found in the documentation of the
class itself. 


Usage
=====

The following examples demonstrate how to use the Archive component.

Extracting a Tar-archive
------------------------

The Tar format has more than one standard. The most common formats are:

- Gnu
- POSIX
- Unix V7
- Ustar (The default when creating a tar archive)

The Archive component can extract from any of these formats. Appending entries
to the archive is only available for the Unix V7 and Ustar formats. 

Extracting entries can occur in two ways: 

- ezcArchive->extract(), extracts all entries from the archive.
- ezcArchive->extractCurrent(), extracts only the current entry.

An ezcArchive object can be used like an iterator. After opening the file, it
points to the first entry. The iterator can be moved using ezcArchive->next()
and ezcArchive->rewind() to move to the next entry or go back to the first
entry.

The next example demonstrates how to extract an entire archive file-by-file:

.. include:: tutorial_extract.php
   :literal:

First, tutorial_autoload.php is included. The included file loads the
correct php files for the Archive package. Hereafter the time zone is set to
"UTC". The Archive component uses some date functions and might therefore
produce warnings if the time zone is not specified.

The gzipped Tar archive is opened using the zlib stream. The while() method
iterates over each entry, showing the name and extracting the entry itself. 

The Archive component extends from the PHP Iterator class, thus the above
example can be rewritten as follows:

.. include:: tutorial_iterator.php
   :literal:

Please be aware that by default archive files are opened in read/write mode. In
order to prevent that, you can set an option to open the archive in read-only
mode. This also prevents the modify and create timestamps of the file to be
preserved. The following example shows that:

.. include:: tutorial_read_only.php
   :literal:


Appending files to an archive
-----------------------------

Unfortunately, it is not yet possible to directly append files to a gzipped or
bzipped Tar archive. The ZLib and BZip2 libraries do not support opening a file
for reading and writing.

ezcArchive has two methods for appending files:

- ezcArchive->append(), appends entries to the end of the archive.
- ezcArchive->appendCurrent(), appends entries after the current entry and
  removes the rest of the files from the archive.

To replace the first file as well, use ezcArchive->truncate().  The 
next example replaces all entries from an existing Zip archive with the files
file1.txt and file2.txt:

.. include:: tutorial_replacing.php
   :literal:

Appending directories to an archive
-----------------------------------

You need to append a slash '/' to the end of the directory name that is added
to an archive.

The next example replaces all entries from an existing Zip archive with the
'directory' folder and the 'file.txt' file:

.. include:: tutorial_directories.php
   :literal:

Appending a directory tree to an archive
----------------------------------------

Using the function ezcBase::walkRecursive() a directory tree can be added to
an archive.

The next example shows how to browse a directory tree and add all the files
and directories inside to an archive:

.. include:: tutorial_recursive.php
   :literal:

The **ArchiveContext** class will hold the archive object which is passed to
the callback function *findRecursiveCallback*. The *appendRecursive* function
sets up the context object (of class **ArchiveContext**) and calls the
*findRecursiveCallback* function. In the *findRecursiveCallback* function the
current file or directory is appended to the archive object inside the
context.

More Information
================

For more information, see the ezcArchive API documentation.


..
   Local Variables:
   mode: rst
   fill-column: 79
   End: 
   vim: et syn=rst tw=79
PKC^�\��n��,doc/pear/Archive/docs/tutorial_replacing.phpnu�[���<?php

require_once 'tutorial_autoload.php';
date_default_timezone_set( "UTC" );

$archive = ezcArchive::open( "/tmp/my_archive.zip" );
$archive->truncate();

$filesToAppend[] = "/tmp/file1.txt";
$filesToAppend[] = "/tmp/file2.txt";

// The second parameter specifies prefix. The prefix is normally not included 
// in the archive.
$archive->appendToCurrent( $filesToAppend, "/tmp/" );

?>
PKD^�\L����!doc/pear/Archive/docs/example.phpnu�[���<?php
/**
 * @package Archive
 */

// Add "MyDirectory" to a new archive: myArchive.tar
// [ tar -cf myArchive.tar MyDirectory ]

$ar = new Tar( "myArchive.tar" );
$ar->append( "MyDirectory" );

// Show the files in the archive.
// [ tar -tf myArchive.tar ]
$fileListing = $ar->getList();
foreach( $fileListing as $file )
{
    print( "Archived file: $file\n" );
}

// Append the file /etc/passwd
// [ tar -rf myArchive.tar /etc/passwd ]
$ar->append( "/etc/passwd" );

// Delete the directory and it's contents
// [ tar -f myArchive.tar --delete MyDirectory ]
$ar->delete( "MyDirectory" );

// Append another directory .. 
$ar->append( "AnotherDirectory" );

// .. and show detailed file permissions plus the file or directory path.
$fileListing = $ar->getList();
foreach( $fileListing as $file )
{
    $entry = $ar->getArchivedEntry( $file );

    print( $entry->getPermissionsString() );

    if ( $entry->isDirectory() )
    {
        print( " [ ".$entry->getPath()." ]\n" );
    }
    else
    {
        print( "   ".$entry->getPath()."\n" );
    }
}


// Extract the whole archive to the tmp directory
$ar->extractTo( "/tmp/" );

// Extract the passwd file to the file: /tmp/passwd-backup
$ar->extractTo( "/tmp/passwd-backup", "passwd" );



// Extracting the gzipped archive: compressedTar.tgz to the tmp directory:
$ar = new Tar( "compress.zlib://compressedTar.tgz" );
$ar->extractTo( "/tmp/" );

// .. and append the password file.
$ar->append( "/etc/passwd" );
?>
PKE^�\:~ٵ�,doc/pear/Archive/docs/tutorial_recursive.phpnu�[���<?php

require_once 'tutorial_autoload.php';
date_default_timezone_set( "UTC" );

class ArchiveContext extends ezcBaseFileFindContext
{
    public $archive;
    public $prefix;
}

function findRecursiveCallback( ezcBaseFileFindContext $context, $sourceDir, $fileName, $fileInfo )
{
    $path = "{$sourceDir}/{$fileName}";
    if ( is_dir( $path ) )
    {
        $path .= '/';
    }
    $context->archive->append( array( $path ), $context->prefix );
}

function appendRecursive( $archive, $sourceDir, $prefix )
{
    $context = new ArchiveContext();
    $context->archive = $archive;
    $context->prefix = $prefix;
    ezcBaseFile::walkRecursive( $sourceDir, array(), array(), 'findRecursiveCallback', $context );
}

$archive = ezcArchive::open( "my_archive.zip", ezcArchive::ZIP );
$archive->truncate();

// the 2nd parameter is the directory, the 3rd parameter is the prefix
appendRecursive( $archive, '/tmp/directory/', '/tmp/directory/' );

?>
PKE^�\E���)):doc/pear/ClassLoader/Symfony/Component/ClassLoader/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKF^�\12"���?doc/pear/ClassLoader/Symfony/Component/ClassLoader/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * deprecated the DebugClassLoader as it has been moved to the Debug component instead

2.3.0
-----

 * added a WinCacheClassLoader for WinCache

2.1.0
-----

 * added a DebugClassLoader able to wrap any autoloader providing a findFile
   method
 * added a new ApcClassLoader and XcacheClassLoader using composition to wrap
   other loaders
 * added a new ClassLoader which does not distinguish between namespaced and
   pear-like classes (as the PEAR convention is a subset of PSR-0) and
   supports using Composer's namespace maps
 * added a class map generator
 * added support for loading globally-installed PEAR packages
PKF^�\ff--@doc/pear/ClassLoader/Symfony/Component/ClassLoader/composer.jsonnu�[���{
    "name": "symfony/class-loader",
    "type": "library",
    "description": "Symfony ClassLoader Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "minimum-stability": "dev",
    "require": {
        "php": ">=5.3.3"
    },
    "require-dev": {
        "symfony/finder": "~2.0"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\ClassLoader\\": "" }
    },
    "target-dir": "Symfony/Component/ClassLoader",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PKG^�\��Zg	g	<doc/pear/ClassLoader/Symfony/Component/ClassLoader/README.mdnu�[���ClassLoader Component
=====================

ClassLoader loads your project classes automatically if they follow some
standard PHP conventions.

The Universal ClassLoader is able to autoload classes that implement the PSR-0
standard or the PEAR naming convention.

First, register the autoloader:

    require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';

    use Symfony\Component\ClassLoader\UniversalClassLoader;

    $loader = new UniversalClassLoader();
    $loader->register();

Then, register some namespaces with the `registerNamespace()` method:

    $loader->registerNamespace('Symfony', __DIR__.'/src');
    $loader->registerNamespace('Monolog', __DIR__.'/vendor/monolog/src');

The `registerNamespace()` method takes a namespace prefix and a path where to
look for the classes as arguments.

You can also register a sub-namespaces:

    $loader->registerNamespace('Doctrine\\Common', __DIR__.'/vendor/doctrine-common/lib');

The order of registration is significant and the first registered namespace
takes precedence over later registered one.

You can also register more than one path for a given namespace:

    $loader->registerNamespace('Symfony', array(__DIR__.'/src', __DIR__.'/symfony/src'));

Alternatively, you can use the `registerNamespaces()` method to register more
than one namespace at once:

    $loader->registerNamespaces(array(
        'Symfony'          => array(__DIR__.'/src', __DIR__.'/symfony/src'),
        'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib',
        'Doctrine'         => __DIR__.'/vendor/doctrine/lib',
        'Monolog'          => __DIR__.'/vendor/monolog/src',
    ));

For better performance, you can use the APC based version of the universal
class loader:

    require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
    require_once __DIR__.'/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';

    use Symfony\Component\ClassLoader\ApcUniversalClassLoader;

    $loader = new ApcUniversalClassLoader('apc.prefix.');

Furthermore, the component provides tools to aggregate classes into a single
file, which is especially useful to improve performance on servers that do not
provide byte caches.

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/ClassLoader/
    $ composer.phar install
    $ phpunit
PKG^�\E���))Jdoc/pear/DependencyInjection/Symfony/Component/DependencyInjection/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKH^�\z.�#��Odoc/pear/DependencyInjection/Symfony/Component/DependencyInjection/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * added support for expressions in service definitions
 * added ContainerAwareTrait to add default container aware behavior to a class

2.2.0
-----

 * added Extension::isConfigEnabled() to ease working with enableable configurations
 * added an Extension base class with sensible defaults to be used in conjunction
   with the Config component.
 * added PrependExtensionInterface (to be able to allow extensions to prepend
   application configuration settings for any Bundle)

2.1.0
-----

 * added IntrospectableContainerInterface (to be able to check if a service
   has been initialized or not)
 * added ConfigurationExtensionInterface
 * added Definition::clearTag()
 * component exceptions that inherit base SPL classes are now used exclusively
   (this includes dumped containers)
 * [BC BREAK] fixed unescaping of class arguments, method
   ParameterBag::unescapeValue() was made public
PKH^�\2$Z�CCPdoc/pear/DependencyInjection/Symfony/Component/DependencyInjection/composer.jsonnu�[���{
    "name": "symfony/dependency-injection",
    "type": "library",
    "description": "Symfony DependencyInjection Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "require-dev": {
        "symfony/yaml": "~2.0",
        "symfony/config": "~2.2",
        "symfony/expression-language": "~2.4"
    },
    "suggest": {
        "symfony/yaml": "",
        "symfony/config": "",
        "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\DependencyInjection\\": "" }
    },
    "target-dir": "Symfony/Component/DependencyInjection",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PKH^�\y���Ldoc/pear/DependencyInjection/Symfony/Component/DependencyInjection/README.mdnu�[���DependencyInjection Component
=============================

DependencyInjection manages your services via a robust and flexible Dependency
Injection Container.

Here is a simple example that shows how to register services and parameters:

    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Reference;

    $sc = new ContainerBuilder();
    $sc
        ->register('foo', '%foo.class%')
        ->addArgument(new Reference('bar'))
    ;
    $sc->setParameter('foo.class', 'Foo');

    $sc->get('foo');

Method Calls (Setter Injection):

    $sc = new ContainerBuilder();

    $sc
        ->register('bar', '%bar.class%')
        ->addMethodCall('setFoo', array(new Reference('foo')))
    ;
    $sc->setParameter('bar.class', 'Bar');

    $sc->get('bar');

Factory Class:

If your service is retrieved by calling a static method:

    $sc = new ContainerBuilder();

    $sc
        ->register('bar', '%bar.class%')
        ->setFactoryClass('%bar.class%')
        ->setFactoryMethod('getInstance')
        ->addArgument('Aarrg!!!')
    ;
    $sc->setParameter('bar.class', 'Bar');

    $sc->get('bar');

File Include:

For some services, especially those that are difficult or impossible to
autoload, you may need the container to include a file before
instantiating your class.

    $sc = new ContainerBuilder();

    $sc
        ->register('bar', '%bar.class%')
        ->setFile('/path/to/file')
        ->addArgument('Aarrg!!!')
    ;
    $sc->setParameter('bar.class', 'Bar');

    $sc->get('bar');

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/DependencyInjection/
    $ composer.phar install
    $ phpunit
PKI^�\X�&��doc/pear/Base/docs/CREDITSnu�[���CREDITS
=======

eZ Components team
------------------

- Sergey Alexeev
- Sebastian Bergmann
- Jan Borsodi
- Raymond Bosman
- Frederik Holljen
- Kore Nordmann
- Derick Rethans
- Vadym Savchuk
- Tobias Schlitt
- Alexandru Stanoi
PKI^�\X��""doc/pear/Base/docs/LICENSEnu�[���eZ Components Licence
=====================

New BSD Licence
---------------

Copyright (c) 2005-2008, eZ Systems A.S.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
  copyright notice, this list of conditions and the following
  disclaimer in the documentation and/or other materials provided
  with the distribution.
* Neither the name of eZ Systems A.S. nor the names of its
  contributors may be used to endorse or promote products derived
  from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PKI^�\��DH��*doc/pear/Base/docs/tutorial_example_02.phpnu�[���<?php
require 'tutorial_autoload.php';

$data = ezcBaseFile::findRecursive(
	"/dat/dev/ezcomponents",
	array( '@src/.*_autoload.php$@' ),
	array( '@/autoload/@' )
);
var_dump( $data );

?>
PKI^�\��]kk*doc/pear/Base/docs/tutorial_example_03.phpnu�[���<?php
require 'tutorial_autoload.php';

ezcBaseFile::removeRecursive( '/dat/dev/ezcomponents/trash' );

?>
PKI^�\��x=��(doc/pear/Base/docs/tutorial_autoload.phpnu�[���<?php
$dir = dirname( __FILE__ );
$dirParts = explode( DIRECTORY_SEPARATOR, $dir );
switch ( $dirParts[count( $dirParts ) - 3] )
{
    case 'doc': require_once 'ezc/Base/base.php'; break; // pear
    case 'trunk': require_once "$dir/../../Base/src/base.php"; break; // svn
    default: require_once "$dir/../../Base/src/base.php"; break; // bundle
}

/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}
?>
PKJ^�\��*doc/pear/Base/docs/tutorial_example_04.phpnu�[���<?php
require 'tutorial_autoload.php';

class myProgressFinder
{
    static public function findRecursiveCallback( ezcBaseFileFindContext $context, $sourceDir, $fileName, $fileInfo )
    {
        // ignore if we have a directory, but do print a "." and sleep for
        // extra demo time
        if ( $fileInfo['mode'] & 0x4000 )
        {
            echo ".";
            usleep( 100000 );
            return;
        }

        // update the statistics
        $context->elements[] = $sourceDir . DIRECTORY_SEPARATOR . $fileName;
        $context->count++;
        $context->size += $fileInfo['size'];
    }

    static public function findRecursive( $sourceDir, array $includeFilters = array(), array $excludeFilters = array() )
    {
        // create the context, and then start walking over the array
        $context = new ezcBaseFileFindContext;
        ezcBaseFile::walkRecursive( $sourceDir, $includeFilters, $excludeFilters,
                array( 'myProgressFinder', 'findRecursiveCallback' ), $context );

        // collect the statistics (which we don't do anything with in this example)
        $statistics['size'] = $context->size;
        $statistics['count'] = $context->count;

        // return the found and pattern-matched files
        sort( $context->elements );
        return $context->elements;
    }
}

$files = myProgressFinder::findRecursive( dirname( __FILE__ ) );
var_dump( $files );
?>
PKJ^�\��Xdd(doc/pear/Base/docs/repos/Me/myclass1.phpnu�[���<?php
class erMyClass1
{
    function toString()
    {
      echo "Class 'erMyClass1'\n";
    }
}
?>PKJ^�\�}ɍdd(doc/pear/Base/docs/repos/Me/myclass2.phpnu�[���<?php
class erMyClass2
{
    function toString()
    {
      echo "Class 'erMyClass2'\n";
    }
}
?>PKJ^�\��?hh+doc/pear/Base/docs/repos/You/yourclass1.phpnu�[���<?php
class erYourClass1
{
    function toString()
    {
      echo "Class 'erYourClass1'\n";
    }
}
?>PKJ^�\��\�hh+doc/pear/Base/docs/repos/You/yourclass2.phpnu�[���<?php
class erYourClass2
{
    function toString()
    {
      echo "Class 'erYourClass2'\n";
    }
}
?>PKK^�\�����4doc/pear/Base/docs/repos/autoloads/your_autoload.phpnu�[���<?php
      return array (
           'erYourClass1' => 'You/yourclass1.php',
           'erYourClass2' => 'You/yourclass2.php',
       );
?>
PKK^�\R�ӹyy2doc/pear/Base/docs/repos/autoloads/my_autoload.phpnu�[���<?php
    return array (
        'erMyClass1' => 'Me/myclass1.php',
        'erMyClass2' => 'Me/myclass2.php',
    );
?>
PKL^�\~�h_"_"doc/pear/Base/docs/tutorial.txtnu�[���eZ Components - Base
~~~~~~~~~~~~~~~~~~~~

.. contents:: Table of Contents

Introduction
============

The Base component provides the basic functionality, such as autoloading, that
all eZ Components need to function properly. The Base component needs to be
loaded specifically. Base can also autoload external class repositories from
outside the eZ Components.

Aside from the autoload functionality, the Base component also contains a number of
generic Exception classes that all inherit from the ezcBaseException class.


Installation
============

The installation and configuration of the eZ Components environment is
described in a separate article. Please refer to the `Components Introduction`_
for instructions on installation and configuration of the eZ Components library
and the Base component.

.. _Components Introduction: /docs/install


Usage
=====

Debugging
---------

By default the ezcBase component's autoload mechanism will not throw an
exception when an autoload class can not be found. In some cases (during
development) it is useful to have an exception with detailed information
about which autoload files were searched for, and in which directories.
ezcBase supports an option that enables this behavior::

    <?php
    $options = new ezcBaseAutoloadOptions;
    $options->debug = true;
    ezcBase::setOptions( $options );
    ?>

**Warning**: Exceptions are ignored when they are thrown from an autoload()
handler in PHP. In order to see the exception message that is thrown when a
class can not be found, you need to catch the exception *in* the autoload()
handler. Your autoload() function could then look like::

    function __autoload( $className )
    {
        try
        {
            ezcBase::autoload( $className );
        }
        catch ( Exception $e )
        {
            echo $e->getMessage();
        }
    }

Preloading
----------

The default autoload policy of the eZ Components is to load every class
file on demand only. It is also possible to load all classes of one
component at the same time, when one of the component's classes is 
requested for the first time. You can change this behavior with the
"preload" option that is available through the ezcBaseAutoloadOptions option
class. You can turn preloading on with::

    <?php
    $options = new ezcBaseAutoloadOptions;
    $options->preload = true;
    ezcBase::setOptions( $options );
    ?>

Please note that preloading will *not* be done for Exception classes.

Adding class repositories located outside eZ Components to autoload system
--------------------------------------------------------------------------

It can be useful to add repositories of user-defined classes to the eZ
Components autoload system.  The ezcBase::addClassRepository() method can be
used to perform this task.  You need to arrange the desired external classes
in a class repository. That is, make sure that classes and corresponding
\*_autoload.php files are named and placed according to the explanations below.
After they are in the proper structure, you can call addClassRepository() with
the proper parameters before you use the external classes.
External classes will then be loaded by autoload system.

ezcBase::addClassRepository() takes two arguments:

- $basePath is the base path for the whole class repository.
- $autoloadDirPath is the path where autoload files for this repository are found. 

The paths in the autoload files are *not* relative to the package directory
as specified by the $basePath argument. In other words, class definition files will
only be searched for in the location $autoloadDirPath.

Consider the following example:

- There is a class repository stored in the directory "./repos".
- Autoload files for this repository are stored in "./repos/autoloads".
- There are two components in this repository: "Me" and "You".
- The "Me" component has the classes "erMyClass1" and "erMyClass2".
- The "You" component has the classes "erYourClass1" and "erYourClass2".

In this case, you need to create the following files in "./repos/autoloads".
Note that the prefix to _autoload.php ("my" and "your") in the filename is the
first part of the classname (excluding the lowercase classname prefix - "er").

Content of my_autoload.php:

.. include:: repos/autoloads/my_autoload.php
   :literal:

Content of your_autoload.php:

.. include:: repos/autoloads/your_autoload.php
   :literal:
 
The directory structure for the external repository is then: ::

    ./repos/autoloads/my_autoload.php
    ./repos/autoloads/your_autoload.php
    ./repos/Me/myclass1.php
    ./repos/Me/myclass2.php
    ./repos/You/yourclass1.php
    ./repos/You/yourclass2.php

To use this repository with the autoload mechanism, use the
following code:

.. include:: tutorial_example_01.php
    :literal:

The above code will output: ::

    Class 'erMyClass2'
    Class 'erYourClass1'

Lazy initialization
-------------------

Lazy initialization is a mechanism to load and configure a component, only 
when it is really used in your application. This mechanism saves time for 
parsing the classes and configuration, when the component is not used at all
during one request. The implementation in ezcBaseInit may be reused by other
applications and components, like the following example will show.

.. include:: tutorial_lazy_initialization.php
   :literal:

The example shows a random class implementing the singleton pattern, which may
be some database connection handler, or anything similar in your case. The
getInstance() method shows a typical PHP 5 implementation except the
additional line 14, which checks, if a configuration callback was provided 
earlier and configures the newly created instance. If no configuration
callback was provided, nothing will happen. The customKey is used to receive 
the right callback from ezcBaseInit and needs to be known by the user, who
wants to define a configuration callback for your class.

In line 32 the class used to configure your instance on creation is defined. 
The first parameter is the key used earlier in the getInstance method, to 
reference the right class, and the second parameter is the name of your 
configuration class.

The configuration class beginning in line 22 just needs to implement the
ezcBaseConfigurationInitializer interface, which defines one
method: configureObject(). This method will be called with the object to
configure as a single parameter. In the example, a new public property on the
customSingleton instance is created, which will be echo'd later to show the 
success of the configuration.

The configuration itself will not happen before the actual instance is created
in line 35 performing the static call on customSingleton::getInstance(). The
var_dump() in the following line shows, that the property value is set and
contains the earlier set value (int) 42.

File Operations
---------------

Finding files recursively
`````````````````````````

This example shows how to use the ezcBaseFile::findRecursive() method:

.. include:: tutorial_example_02.php
   :literal:

The code in this example searches for files in the ``/dat/dev/ezcomponents``
directory. It will only include files that match *all* patterns in the
$includeFilters array (the second parameter). Files that match *any* of the
patterns in the $excludeFilters array (the third parameter) will not be returned.

In other words, the code above searches for files in the ``dat/dev/ezcomponents``
directory, which are in the ``src/`` directory and end with ``_autoload.php``,
except for files that are in the ``/autoload/`` directory.

Removing directories recursively
````````````````````````````````

This example shows how to use the ezcBaseFile::removeRecursive() method:

.. include:: tutorial_example_03.php
   :literal:

This code simply removes the directory ``/dat/dev/ezcomponents/trash`` and all
of its files and sub-directories.

**Warning: Use this function with care, as it has the potential to erase
everything that the current user has access to.**

Overloading the callback
````````````````````````

The ezcBaseFile::findRecursive() method internally uses the
ezcBaseFile::walkRecursive() method to do the actual recursing. The callback
method ezcBaseFile::findRecursiveCallback() is then responsible for collecting
the data. In case you want to do additional things, such as printing progress,
you can either call walkRecursive() yourself with a callback function of your
choice, or overload the ezcBaseFile class and provide a new
findRecursiveCallback() method. The code below uses
ezcBaseFile::walkRecursive() directly in order to display dots for when ever it
finds a new directory:

.. include:: tutorial_example_04.php
   :literal:



..
   Local Variables:
   mode: rst
   fill-column: 79
   End: 
   vim: et syn=rst tw=79
PKL^�\
�Z˒�3doc/pear/Base/docs/tutorial_lazy_initialization.phpnu�[���<?php
require_once 'tutorial_autoload.php';

// Create a custom class implementing the singleton pattern
class customSingleton
{
    protected static $instance;

    public static function getInstance()
    {
        if ( self::$instance === null )
        {
            self::$instance = new customSingleton();
            ezcBaseInit::fetchConfig( 'customKey', self::$instance );
        }

        return self::$instance;
    }
}

// Implement your configuration class
class customSingletonConfiguration implements ezcBaseConfigurationInitializer
{
    public static function configureObject( $object )
    {
        echo "Configure customSingleton.\n";
        $object->value = 42;
    }
}

// Register for lazy initilization
ezcBaseInit::setCallback( 'customKey', 'customSingletonConfiguration' );

// Configure on first initilization
$object = customSingleton::getInstance();
var_dump( $object->value );

?>
PKL^�\�����*doc/pear/Base/docs/tutorial_example_01.phpnu�[���<?php
require_once 'tutorial_autoload.php';

ezcBase::addClassRepository( './repos', './repos/autoloads' );
$myVar1 = new erMyClass2();
$myVar1->toString();
$yourVar1 = new erYourClass1();
$yourVar1->toString();
?>
PKL^�\E���))8doc/pear/DomCrawler/Symfony/Component/DomCrawler/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKN^�\���݂�=doc/pear/DomCrawler/Symfony/Component/DomCrawler/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * `Crawler::addXmlContent()` removes the default document namespace again if it's an only namespace.
 * added support for automatic discovery and explicit registration of document
   namespaces for `Crawler::filterXPath()` and `Crawler::filter()`
 * improved content type guessing in `Crawler::addContent()`
 * [BC BREAK] `Crawler::addXmlContent()` no longer removes the default document
   namespace

2.3.0
-----

 * added Crawler::html()
 * [BC BREAK] Crawler::each() and Crawler::reduce() now return Crawler instances instead of DomElement instances
 * added schema relative URL support to links
 * added support for HTML5 'form' attribute

2.2.0
-----

 * added a way to set raw path to the file in FileFormField - necessary for
   simulating HTTP requests

2.1.0
-----

 * added support for the HTTP PATCH method
 * refactored the Form class internals to support multi-dimensional fields
   (the public API is backward compatible)
 * added a way to get parsing errors for Crawler::addHtmlContent() and
   Crawler::addXmlContent() via libxml functions
 * added support for submitting a form without a submit button
PKN^�\!�jj>doc/pear/DomCrawler/Symfony/Component/DomCrawler/composer.jsonnu�[���{
    "name": "symfony/dom-crawler",
    "type": "library",
    "description": "Symfony DomCrawler Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "require-dev": {
        "symfony/css-selector": "~2.0"
    },
    "suggest": {
        "symfony/css-selector": ""
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\DomCrawler\\": "" }
    },
    "target-dir": "Symfony/Component/DomCrawler",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PKO^�\;�|\ee:doc/pear/DomCrawler/Symfony/Component/DomCrawler/README.mdnu�[���DomCrawler Component
====================

DomCrawler eases DOM navigation for HTML and XML documents.

If you are familiar with jQuery, DomCrawler is a PHP equivalent:

    use Symfony\Component\DomCrawler\Crawler;

    $crawler = new Crawler();
    $crawler->addContent('<html><body><p>Hello World!</p></body></html>');

    print $crawler->filterXPath('descendant-or-self::body/p')->text();

If you are also using the CssSelector component, you can use CSS Selectors
instead of XPath expressions:

    use Symfony\Component\DomCrawler\Crawler;

    $crawler = new Crawler();
    $crawler->addContent('<html><body><p>Hello World!</p></body></html>');

    print $crawler->filter('body > p')->text();

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/DomCrawler/
    $ composer.phar install
    $ phpunit
PKO^�\X�&��doc/pear/File/docs/CREDITSnu�[���CREDITS
=======

eZ Components team
------------------

- Sergey Alexeev
- Sebastian Bergmann
- Jan Borsodi
- Raymond Bosman
- Frederik Holljen
- Kore Nordmann
- Derick Rethans
- Vadym Savchuk
- Tobias Schlitt
- Alexandru Stanoi
PKP^�\�R��doc/pear/File/docs/LICENSEnu�[���eZ Components Licence
=====================

Copyright (c) 2005, 2006, 2007, eZ Systems A.S.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
  copyright notice, this list of conditions and the following
  disclaimer in the documentation and/or other materials provided
  with the distribution.
* Neither the name of eZ Systems A.S. nor the names of its
  contributors may be used to endorse or promote products derived
  from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PKP^�\N4#p��(doc/pear/File/docs/tutorial_autoload.phpnu�[���<?php
$dir = dirname( __FILE__ );
$dirParts = explode( '/', $dir );
switch ( $dirParts[count( $dirParts ) - 3] )
{
    case 'doc': require_once 'ezc/Base/base.php'; break; // pear
    case 'trunk': require_once "$dir/../../Base/src/base.php"; break; // svn
    default: require_once "$dir/../../Base/src/base.php"; break; // bundle
}

/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}
?>
PKQ^�\vx��BBdoc/pear/File/docs/tutorial.txtnu�[���eZ Components - File
~~~~~~~~~~~~~~~~~~~~

.. contents:: Table of Contents

Introduction
============

The File component is now **deprecated**. Instead use the ezcBaseFile class
from the Base package. Please refer to the Base_ component introduction
for the tutorial. The classes in this component still exist because
of backwards compatibility reasons.

.. _Base: introduction_Base.html

More information
================

For more information, see the ezcBaseFile API documentation.


..
   Local Variables:
   mode: rst
   fill-column: 79
   End: 
   vim: et syn=rst tw=79
PKR^�\E���))2doc/pear/Routing/Symfony/Component/Routing/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKR^�\e����7doc/pear/Routing/Symfony/Component/Routing/CHANGELOG.mdnu�[���CHANGELOG
=========

2.3.0
-----

 * added RequestContext::getQueryString()

2.2.0
-----

 * [DEPRECATION] Several route settings have been renamed (the old ones will be removed in 3.0):

    * The `pattern` setting for a route has been deprecated in favor of `path`
    * The `_scheme` and `_method` requirements have been moved to the `schemes` and `methods` settings

   Before:

   ```
   article_edit:
       pattern: /article/{id}
       requirements: { '_method': 'POST|PUT', '_scheme': 'https', 'id': '\d+' }

   <route id="article_edit" pattern="/article/{id}">
       <requirement key="_method">POST|PUT</requirement>
       <requirement key="_scheme">https</requirement>
       <requirement key="id">\d+</requirement>
   </route>

   $route = new Route();
   $route->setPattern('/article/{id}');
   $route->setRequirement('_method', 'POST|PUT');
   $route->setRequirement('_scheme', 'https');
   ```

   After:

   ```
   article_edit:
       path: /article/{id}
       methods: [POST, PUT]
       schemes: https
       requirements: { 'id': '\d+' }

   <route id="article_edit" pattern="/article/{id}" methods="POST PUT" schemes="https">
       <requirement key="id">\d+</requirement>
   </route>

   $route = new Route();
   $route->setPath('/article/{id}');
   $route->setMethods(array('POST', 'PUT'));
   $route->setSchemes('https');
   ```

 * [BC BREAK] RouteCollection does not behave like a tree structure anymore but as
   a flat array of Routes. So when using PHP to build the RouteCollection, you must
   make sure to add routes to the sub-collection before adding it to the parent
   collection (this is not relevant when using YAML or XML for Route definitions).

   Before:

   ```
   $rootCollection = new RouteCollection();
   $subCollection = new RouteCollection();
   $rootCollection->addCollection($subCollection);
   $subCollection->add('foo', new Route('/foo'));
   ```

   After:

   ```
   $rootCollection = new RouteCollection();
   $subCollection = new RouteCollection();
   $subCollection->add('foo', new Route('/foo'));
   $rootCollection->addCollection($subCollection);
   ```

   Also one must call `addCollection` from the bottom to the top hierarchy.
   So the correct sequence is the following (and not the reverse):

   ```
   $childCollection->->addCollection($grandchildCollection);
   $rootCollection->addCollection($childCollection);
   ```

 * [DEPRECATION] The methods `RouteCollection::getParent()` and `RouteCollection::getRoot()`
   have been deprecated and will be removed in Symfony 2.3.
 * [BC BREAK] Misusing the `RouteCollection::addPrefix` method to add defaults, requirements
   or options without adding a prefix is not supported anymore. So if you called `addPrefix`
   with an empty prefix or `/` only (both have no relevance), like
   `addPrefix('', $defaultsArray, $requirementsArray, $optionsArray)`
   you need to use the new dedicated methods `addDefaults($defaultsArray)`,
   `addRequirements($requirementsArray)` or `addOptions($optionsArray)` instead.
 * [DEPRECATION] The `$options` parameter to `RouteCollection::addPrefix()` has been deprecated
   because adding options has nothing to do with adding a path prefix. If you want to add options
   to all child routes of a RouteCollection, you can use `addOptions()`.
 * [DEPRECATION] The method `RouteCollection::getPrefix()` has been deprecated
   because it suggested that all routes in the collection would have this prefix, which is
   not necessarily true. On top of that, since there is no tree structure anymore, this method
   is also useless. Don't worry about performance, prefix optimization for matching is still done
   in the dumper, which was also improved in 2.2.0 to find even more grouping possibilities.
 * [DEPRECATION] `RouteCollection::addCollection(RouteCollection $collection)` should now only be
   used with a single parameter. The other params `$prefix`, `$default`, `$requirements` and `$options`
   will still work, but have been deprecated. The `addPrefix` method should be used for this
   use-case instead.
   Before: `$parentCollection->addCollection($collection, '/prefix', array(...), array(...))`
   After:
   ```
   $collection->addPrefix('/prefix', array(...), array(...));
   $parentCollection->addCollection($collection);
   ```
 * added support for the method default argument values when defining a @Route
 * Adjacent placeholders without separator work now, e.g. `/{x}{y}{z}.{_format}`.
 * Characters that function as separator between placeholders are now whitelisted
   to fix routes with normal text around a variable, e.g. `/prefix{var}suffix`.
 * [BC BREAK] The default requirement of a variable has been changed slightly.
   Previously it disallowed the previous and the next char around a variable. Now
   it disallows the slash (`/`) and the next char. Using the previous char added
   no value and was problematic because the route `/index.{_format}` would be
   matched by `/index.ht/ml`.
 * The default requirement now uses possessive quantifiers when possible which
   improves matching performance by up to 20% because it prevents backtracking
   when it's not needed.
 * The ConfigurableRequirementsInterface can now also be used to disable the requirements
   check on URL generation completely by calling `setStrictRequirements(null)`. It
   improves performance in production environment as you should know that params always
   pass the requirements (otherwise it would break your link anyway).
 * There is no restriction on the route name anymore. So non-alphanumeric characters
   are now also allowed.
 * [BC BREAK] `RouteCompilerInterface::compile(Route $route)` was made static
   (only relevant if you implemented your own RouteCompiler).
 * Added possibility to generate relative paths and network paths in the UrlGenerator, e.g.
   "../parent-file" and "//example.com/dir/file". The third parameter in
   `UrlGeneratorInterface::generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)`
   now accepts more values and you should use the constants defined in `UrlGeneratorInterface` for
   claritiy. The old method calls with a Boolean parameter will continue to work because they
   equal the signature using the constants.

2.1.0
-----

 * added RequestMatcherInterface
 * added RequestContext::fromRequest()
 * the UrlMatcher does not throw a \LogicException anymore when the required
   scheme is not the current one
 * added TraceableUrlMatcher
 * added the possibility to define options, default values and requirements
   for placeholders in prefix, including imported routes
 * added RouterInterface::getRouteCollection
 * [BC BREAK] the UrlMatcher urldecodes the route parameters only once, they
   were decoded twice before. Note that the `urldecode()` calls have been
   changed for a single `rawurldecode()` in order to support `+` for input
   paths.
 * added RouteCollection::getRoot method to retrieve the root of a
   RouteCollection tree
 * [BC BREAK] made RouteCollection::setParent private which could not have
   been used anyway without creating inconsistencies
 * [BC BREAK] RouteCollection::remove also removes a route from parent
   collections (not only from its children)
 * added ConfigurableRequirementsInterface that allows to disable exceptions 
   (and generate empty URLs instead) when generating a route with an invalid
   parameter value
PKS^�\»V��8doc/pear/Routing/Symfony/Component/Routing/composer.jsonnu�[���{
    "name": "symfony/routing",
    "type": "library",
    "description": "Symfony Routing Component",
    "keywords": ["routing", "router", "URL", "URI"],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "require-dev": {
        "symfony/config": "~2.2",
        "symfony/yaml": "~2.0",
        "symfony/expression-language": "~2.4",
        "doctrine/annotations": "~1.0",
        "psr/log": "~1.0"
    },
    "suggest": {
        "symfony/config": "For using the all-in-one router or any loader",
        "symfony/yaml": "For using the YAML loader",
        "symfony/expression-language": "For using expression matching",
        "doctrine/annotations": "For using the annotation loader"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Routing\\": "" }
    },
    "target-dir": "Symfony/Component/Routing",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PKS^�\��{��4doc/pear/Routing/Symfony/Component/Routing/README.mdnu�[���Routing Component
=================

Routing associates a request with the code that will convert it to a response.

The example below demonstrates how you can set up a fully working routing
system:

    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Routing\Matcher\UrlMatcher;
    use Symfony\Component\Routing\RequestContext;
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;

    $routes = new RouteCollection();
    $routes->add('hello', new Route('/hello', array('controller' => 'foo')));

    $context = new RequestContext();

    // this is optional and can be done without a Request instance
    $context->fromRequest(Request::createFromGlobals());

    $matcher = new UrlMatcher($routes, $context);

    $parameters = $matcher->match('/hello');

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Routing/
    $ composer.phar install
    $ phpunit
PKT^�\E���))7doc/pear/DoctrineBridge/Symfony/Bridge/Doctrine/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKT^�\/����<doc/pear/DoctrineBridge/Symfony/Bridge/Doctrine/CHANGELOG.mdnu�[���CHANGELOG
=========

2.2.0
-----

 * added an optional PropertyAccessorInterface parameter to DoctrineType,
   EntityType and EntityChoiceList

2.1.0
-----

 * added a default implementation of the ManagerRegistry
 * added a session storage for Doctrine DBAL
 * DoctrineOrmTypeGuesser now guesses "collection" for array Doctrine type
 * DoctrineType now caches its choice lists in order to improve performance
 * DoctrineType now uses ManagerRegistry::getManagerForClass() if the option "em" is not set
 * UniqueEntity validation constraint now accepts a "repositoryMethod" option that will be used to check for uniqueness instead of the default "findBy"
 * [BC BREAK] the DbalLogger::log() visibility has been changed from public to
   protected
PKU^�\ʼ'�aa=doc/pear/DoctrineBridge/Symfony/Bridge/Doctrine/composer.jsonnu�[���{
    "name": "symfony/doctrine-bridge",
    "type": "symfony-bridge",
    "description": "Symfony Doctrine Bridge",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "doctrine/common": "~2.2"
    },
    "require-dev": {
        "symfony/stopwatch": "~2.2",
        "symfony/dependency-injection": "~2.0",
        "symfony/form": "~2.2",
        "symfony/http-kernel": "~2.2",
        "symfony/security": "~2.2",
        "symfony/expression-language": "~2.2",
        "symfony/validator": "~2.2",
        "doctrine/data-fixtures": "1.0.*",
        "doctrine/dbal": "~2.2",
        "doctrine/orm": "~2.2,>=2.2.3"
    },
    "suggest": {
        "symfony/form": "",
        "symfony/validator": "",
        "doctrine/data-fixtures": "",
        "doctrine/dbal": "",
        "doctrine/orm": ""
    },
    "autoload": {
        "psr-0": { "Symfony\\Bridge\\Doctrine\\": "" }
    },
    "target-dir": "Symfony/Bridge/Doctrine",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PKV^�\�f�++9doc/pear/DoctrineBridge/Symfony/Bridge/Doctrine/README.mdnu�[���Doctrine Bridge
===============

Provides integration for [Doctrine](http://www.doctrine-project.org/) with
various Symfony2 components.

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Bridge/Doctrine/
    $ composer.phar install
    $ phpunit
PKW^�\E���))8doc/pear/Templating/Symfony/Component/Templating/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKW^�\�ј�qq=doc/pear/Templating/Symfony/Component/Templating/CHANGELOG.mdnu�[���CHANGELOG
=========

2.1.0
-----

 * added StreamingEngineInterface
 * added ENT_SUBSTITUTE for the HTML escaper
PKW^�\s_+qq>doc/pear/Templating/Symfony/Component/Templating/composer.jsonnu�[���{
    "name": "symfony/templating",
    "type": "library",
    "description": "Symfony Templating Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "require-dev": {
        "psr/log": "~1.0"
    },
    "suggest": {
        "psr/log": "For using debug logging in loaders"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Templating\\": "" }
    },
    "target-dir": "Symfony/Component/Templating",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PKX^�\���:doc/pear/Templating/Symfony/Component/Templating/README.mdnu�[���Templating Component
====================

Templating provides all the tools needed to build any kind of template system.

It provides an infrastructure to load template files and optionally monitor
them for changes. It also provides a concrete template engine implementation
using PHP with additional tools for escaping and separating templates into
blocks and layouts.

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Templating/
    $ composer.phar install
    $ phpunit
PKX^�\E���)),doc/pear/Form/Symfony/Component/Form/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKZ^�\�c��/7/71doc/pear/Form/Symfony/Component/Form/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * moved CSRF implementation to the new Security CSRF sub-component
 * deprecated CsrfProviderInterface and its implementations
 * deprecated options "csrf_provider" and "intention" in favor of the new options "csrf_token_generator" and "csrf_token_id"

2.3.0
-----

 * deprecated FormPerformanceTestCase and FormIntegrationTestCase in the Symfony\Component\Form\Tests namespace and moved them to the Symfony\Component\Form\Test namespace
 * deprecated TypeTestCase in the Symfony\Component\Form\Tests\Extension\Core\Type namespace and moved it to the Symfony\Component\Form\Test namespace
 * changed FormRenderer::humanize() to humanize also camel cased field name
 * added RequestHandlerInterface and FormInterface::handleRequest()
 * deprecated passing a Request instance to FormInterface::bind()
 * added options "method" and "action" to FormType
 * deprecated option "virtual" in favor "inherit_data"
 * deprecated VirtualFormAwareIterator in favor of InheritDataAwareIterator
 * [BC BREAK] removed the "array" type hint from DataMapperInterface
 * improved forms inheriting their parent data to actually return that data from getData(), getNormData() and getViewData()
 * added component-level exceptions for various SPL exceptions
   changed all uses of the deprecated Exception class to use more specialized exceptions instead
   removed NotInitializedException, NotValidException, TypeDefinitionException, TypeLoaderException, CreationException
 * added events PRE_SUBMIT, SUBMIT and POST_SUBMIT
 * deprecated events PRE_BIND, BIND and POST_BIND
 * [BC BREAK] renamed bind() and isBound() in FormInterface to submit() and isSubmitted()
 * added methods submit() and isSubmitted() to Form
 * deprecated bind() and isBound() in Form
 * deprecated AlreadyBoundException in favor of AlreadySubmittedException
 * added support for PATCH requests
 * [BC BREAK] added initialize() to FormInterface
 * [BC BREAK] added getAutoInitialize() to FormConfigInterface
 * [BC BREAK] added setAutoInitialize() to FormConfigBuilderInterface
 * [BC BREAK] initialization for Form instances added to a form tree must be manually disabled
 * PRE_SET_DATA is now guaranteed to be called after children were added by the form builder,
   unless FormInterface::setData() is called manually
 * fixed CSRF error message to be translated
 * custom CSRF error messages can now be set through the "csrf_message" option
 * fixed: expanded single-choice fields now show a radio button for the empty value

2.2.0
-----

 * TrimListener now removes unicode whitespaces
 * deprecated getParent(), setParent() and hasParent() in FormBuilderInterface
 * FormInterface::add() now accepts a FormInterface instance OR a field's name, type and options
 * removed special characters between the choice or text fields of DateType unless
   the option "format" is set to a custom value
 * deprecated FormException and introduced ExceptionInterface instead
 * [BC BREAK] FormException is now an interface
 * protected FormBuilder methods from being called when it is turned into a FormConfigInterface with getFormConfig()
 * [BC BREAK] inserted argument `$message` in the constructor of `FormError`
 * the PropertyPath class and related classes were moved to a dedicated
   PropertyAccess component. During the move, InvalidPropertyException was
   renamed to NoSuchPropertyException. FormUtil was split: FormUtil::singularify()
   can now be found in Symfony\Component\PropertyAccess\StringUtil. The methods
   getValue() and setValue() from PropertyPath were extracted into a new class
   PropertyAccessor.
 * added an optional PropertyAccessorInterface parameter to FormType,
   ObjectChoiceList and PropertyPathMapper
 * [BC BREAK] PropertyPathMapper and FormType now have a constructor
 * [BC BREAK] setting the option "validation_groups" to ``false`` now disables validation
   instead of assuming group "Default"

2.1.0
-----

 * [BC BREAK] ``read_only`` field attribute now renders as ``readonly="readonly"``, use ``disabled`` instead
 * [BC BREAK] child forms now aren't validated anymore by default
 * made validation of form children configurable (new option: cascade_validation)
 * added support for validation groups as callbacks
 * made the translation catalogue configurable via the "translation_domain" option
 * added Form::getErrorsAsString() to help debugging forms
 * allowed setting different options for RepeatedType fields (like the label)
 * added support for empty form name at root level, this enables rendering forms
   without form name prefix in field names
 * [BC BREAK] form and field names must start with a letter, digit or underscore
   and only contain letters, digits, underscores, hyphens and colons
 * [BC BREAK] changed default name of the prototype in the "collection" type
   from "$$name$$" to "\__name\__". No dollars are appended/prepended to custom
   names anymore.
 * [BC BREAK] improved ChoiceListInterface
 * [BC BREAK] added SimpleChoiceList and LazyChoiceList as replacement of
   ArrayChoiceList
 * added ChoiceList and ObjectChoiceList to use objects as choices
 * [BC BREAK] removed EntitiesToArrayTransformer and EntityToIdTransformer.
   The former has been replaced by CollectionToArrayTransformer in combination
   with EntityChoiceList, the latter is not required in the core anymore.
 * [BC BREAK] renamed
   * ArrayToBooleanChoicesTransformer to ChoicesToBooleanArrayTransformer
   * ScalarToBooleanChoicesTransformer to ChoiceToBooleanArrayTransformer
   * ArrayToChoicesTransformer to ChoicesToValuesTransformer
   * ScalarToChoiceTransformer to ChoiceToValueTransformer
   to be consistent with the naming in ChoiceListInterface.
   They were merged into ChoiceList and have no public equivalent anymore.
 * choice fields now throw a FormException if neither the "choices" nor the
   "choice_list" option is set
 * the radio type is now a child of the checkbox type
 * the collection, choice (with multiple selection) and entity (with multiple
   selection) types now make use of addXxx() and removeXxx() methods in your
   model if you set "by_reference" to false. For a custom, non-recognized
   singular form, set the "property_path" option like this: "plural|singular"
 * forms now don't create an empty object anymore if they are completely
   empty and not required. The empty value for such forms is null.
 * added constant Guess::VERY_HIGH_CONFIDENCE
 * [BC BREAK] The methods `add`, `remove`, `setParent`, `bind` and `setData`
   in class Form now throw an exception if the form is already bound
 * fields of constrained classes without a NotBlank or NotNull constraint are
   set to not required now, as stated in the docs
 * fixed TimeType and DateTimeType to not display seconds when "widget" is
   "single_text" unless "with_seconds" is set to true
 * checkboxes of in an expanded multiple-choice field don't include the choice
   in their name anymore. Their names terminate with "[]" now.
 * deprecated FormValidatorInterface and substituted its implementations
   by event subscribers
 * simplified CSRF protection and removed the csrf type
 * deprecated FieldType and merged it into FormType
 * added new option "compound" that lets you switch between field and form behavior
 * [BC BREAK] renamed theme blocks
   * "field_*" to "form_*"
   * "field_widget" to "form_widget_simple"
   * "widget_choice_options" to "choice_widget_options"
   * "generic_label" to "form_label"
 * added theme blocks "form_widget_compound", "choice_widget_expanded" and
   "choice_widget_collapsed" to make theming more modular
 * ValidatorTypeGuesser now guesses "collection" for array type constraint
 * added method `guessPattern` to FormTypeGuesserInterface to guess which pattern to use in the HTML5 attribute "pattern"
 * deprecated method `guessMinLength` in favor of `guessPattern`
 * labels don't display field attributes anymore. Label attributes can be
   passed in the "label_attr" option/variable
 * added option "mapped" which should be used instead of setting "property_path" to false
 * [BC BREAK] "data_class" now *must* be set if a form maps to an object and should be left empty otherwise
 * improved error mapping on forms
   * dot (".") rules are now allowed to map errors assigned to a form to
     one of its children
 * errors are not mapped to unsynchronized forms anymore
 * [BC BREAK] changed Form constructor to accept a single `FormConfigInterface` object
 * [BC BREAK] changed argument order in the FormBuilder constructor
 * added Form method `getViewData`
 * deprecated Form methods
   * `getTypes`
   * `getErrorBubbling`
   * `getNormTransformers`
   * `getClientTransformers`
   * `getAttribute`
   * `hasAttribute`
   * `getClientData`
 * added FormBuilder methods
   * `getTypes`
   * `addViewTransformer`
   * `getViewTransformers`
   * `resetViewTransformers`
   * `addModelTransformer`
   * `getModelTransformers`
   * `resetModelTransformers`
 * deprecated FormBuilder methods
   * `prependClientTransformer`
   * `appendClientTransformer`
   * `getClientTransformers`
   * `resetClientTransformers`
   * `prependNormTransformer`
   * `appendNormTransformer`
   * `getNormTransformers`
   * `resetNormTransformers`
 * deprecated the option "validation_constraint" in favor of the new
   option "constraints"
 * removed superfluous methods from DataMapperInterface
   * `mapFormToData`
   * `mapDataToForm`
 * added `setDefaultOptions` to FormTypeInterface and FormTypeExtensionInterface
   which accepts an OptionsResolverInterface instance
 * deprecated the methods `getDefaultOptions` and `getAllowedOptionValues`
   in FormTypeInterface and FormTypeExtensionInterface
 * options passed during construction can now be accessed from FormConfigInterface
 * added FormBuilderInterface and FormConfigEditorInterface
 * [BC BREAK] the method `buildForm` in FormTypeInterface and FormTypeExtensionInterface
   now receives a FormBuilderInterface instead of a FormBuilder instance
 * [BC BREAK] the method `buildViewBottomUp` was renamed to `finishView` in
   FormTypeInterface and FormTypeExtensionInterface
 * [BC BREAK] the options array is now passed as last argument of the
   methods
   * `buildView`
   * `finishView`
   in FormTypeInterface and FormTypeExtensionInterface
 * [BC BREAK] no options are passed to `getParent` of FormTypeInterface anymore
 * deprecated DataEvent and FilterDataEvent in favor of the new FormEvent which is
   now passed to all events thrown by the component
 * FormEvents::BIND now replaces FormEvents::BIND_NORM_DATA
 * FormEvents::PRE_SET_DATA now replaces FormEvents::SET_DATA
 * FormEvents::PRE_BIND now replaces FormEvents::BIND_CLIENT_DATA
 * deprecated FormEvents::SET_DATA, FormEvents::BIND_CLIENT_DATA and
   FormEvents::BIND_NORM_DATA
 * [BC BREAK] reversed the order of the first two arguments to `createNamed`
   and `createNamedBuilder` in `FormFactoryInterface`
 * deprecated `getChildren` in Form and FormBuilder in favor of `all`
 * deprecated `hasChildren` in Form and FormBuilder in favor of `count`
 * FormBuilder now implements \IteratorAggregate
 * [BC BREAK] compound forms now always need a data mapper
 * FormBuilder now maintains the order when explicitly adding form builders as children
 * ChoiceType now doesn't add the empty value anymore if the choices already contain an empty element
 * DateType, TimeType and DateTimeType now show empty values again if not required
 * [BC BREAK] fixed rendering of errors for DateType, BirthdayType and similar ones
 * [BC BREAK] fixed: form constraints are only validated if they belong to the validated group
 * deprecated `bindRequest` in `Form` and replaced it by a listener to FormEvents::PRE_BIND
 * fixed: the "data" option supersedes default values from the model
 * changed DateType to refer to the "format" option for calculating the year and day choices instead
   of padding them automatically
 * [BC BREAK] DateType defaults to the format "yyyy-MM-dd" now if the widget is
   "single_text", in order to support the HTML 5 date field out of the box
 * added the option "format" to DateTimeType
 * [BC BREAK] DateTimeType now outputs RFC 3339 dates by default, as generated and
   consumed by HTML5 browsers, if the widget is "single_text"
 * deprecated the options "data_timezone" and "user_timezone" in DateType, DateTimeType and TimeType
   and renamed them to "model_timezone" and "view_timezone"
 * fixed: TransformationFailedExceptions thrown in the model transformer are now caught by the form
 * added FormRegistryInterface, ResolvedFormTypeInterface and ResolvedFormTypeFactoryInterface
 * deprecated FormFactory methods
   * `addType`
   * `hasType`
   * `getType`
 * [BC BREAK] FormFactory now expects a FormRegistryInterface and a ResolvedFormTypeFactoryInterface as constructor argument
 * [BC BREAK] The method `createBuilder` in FormTypeInterface is not supported anymore for performance reasons
 * [BC BREAK] Removed `setTypes` from FormBuilder
 * deprecated AbstractType methods
   * `getExtensions`
   * `setExtensions`
 * ChoiceType now caches its created choice lists to improve performance
 * [BC BREAK] Rows of a collection field cannot be themed individually anymore. All rows in the collection
   field now have the same block names, which contains "entry" where it previously contained the row index.
 * [BC BREAK] When registering a type through the DI extension, the tag alias has to match the actual type name.
 * added FormRendererInterface, FormRendererEngineInterface and implementations of these interfaces
 * [BC BREAK] removed the following methods from FormUtil:
   * `toArrayKey`
   * `toArrayKeys`
   * `isChoiceGroup`
   * `isChoiceSelected`
 * [BC BREAK] renamed method `renderBlock` in FormHelper to `block` and changed its signature
 * made FormView properties public and deprecated their accessor methods
 * made the normalized data of a form accessible in the template through the variable "form.vars.data"
 * made the original data of a choice accessible in the template through the property "choice.data"
 * added convenience class Forms and FormFactoryBuilderInterface
PKZ^�\��J!!2doc/pear/Form/Symfony/Component/Form/composer.jsonnu�[���{
    "name": "symfony/form",
    "type": "library",
    "description": "Symfony Form Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/event-dispatcher": "~2.1",
        "symfony/intl": "~2.3",
        "symfony/options-resolver": "~2.1",
        "symfony/property-access": "~2.3"
    },
    "require-dev": {
        "symfony/validator": "~2.2",
        "symfony/http-foundation": "~2.2",
        "symfony/security-csrf": "~2.4"
    },
    "suggest": {
        "symfony/validator": "For form validation.",
        "symfony/security-csrf": "For protecting forms against CSRF attacks.",
        "symfony/twig-bridge": "For templating with Twig.",
        "symfony/framework-bundle": "For templating with PHP."
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Form\\": "" }
    },
    "target-dir": "Symfony/Component/Form",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK[^�\�.doc/pear/Form/Symfony/Component/Form/README.mdnu�[���Form Component
==============

Form provides tools for defining forms, rendering and mapping request data to
related models. Furthermore it provides integration with the Validation
component.

Resources
---------

Silex integration:

https://github.com/fabpot/Silex/blob/master/src/Silex/Provider/FormServiceProvider.php

Documentation:

http://symfony.com/doc/2.4/book/forms.html

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Form/
    $ composer.phar install
    $ phpunit
PK\^�\E���))2doc/pear/Process/Symfony/Component/Process/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK\^�\g�/���7doc/pear/Process/Symfony/Component/Process/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * added the ability to define an idle timeout

2.3.0
-----

 * added ProcessUtils::escapeArgument() to fix the bug in escapeshellarg() function on Windows
 * added Process::signal()
 * added Process::getPid()
 * added support for a TTY mode

2.2.0
-----

 * added ProcessBuilder::setArguments() to reset the arguments on a builder
 * added a way to retrieve the standard and error output incrementally
 * added Process:restart()

2.1.0
-----

 * added support for non-blocking processes (start(), wait(), isRunning(), stop())
 * enhanced Windows compatibility
 * added Process::getExitCodeText() that returns a string representation for
   the exit code returned by the process
 * added ProcessBuilder
PK]^�\��dB��8doc/pear/Process/Symfony/Component/Process/composer.jsonnu�[���{
    "name": "symfony/process",
    "type": "library",
    "description": "Symfony Process Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Process\\": "" }
    },
    "target-dir": "Symfony/Component/Process",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK]^�\�oS�JJ4doc/pear/Process/Symfony/Component/Process/README.mdnu�[���Process Component
=================

Process executes commands in sub-processes.

In this example, we run a simple directory listing and get the result back:

    use Symfony\Component\Process\Process;

    $process = new Process('ls -lsa');
    $process->setTimeout(3600);
    $process->run();
    if (!$process->isSuccessful()) {
        throw new RuntimeException($process->getErrorOutput());
    }

    print $process->getOutput();

You can think that this is easy to achieve with plain PHP but it's not especially
if you want to take care of the subtle differences between the different platforms.

And if you want to be able to get some feedback in real-time, just pass an
anonymous function to the ``run()`` method and you will get the output buffer
as it becomes available:

    use Symfony\Component\Process\Process;

    $process = new Process('ls -lsa');
    $process->run(function ($type, $buffer) {
        if ('err' === $type) {
            echo 'ERR > '.$buffer;
        } else {
            echo 'OUT > '.$buffer;
        }
    });

That's great if you want to execute a long running command (like rsync-ing files to a
remote server) and give feedback to the user in real-time.

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/XXX/
    $ composer.phar install
    $ phpunit
PK]^�\W]H���doc/pear/Net_Socket/LICENSEnu�[���Copyright 1997-2017 The PHP Group

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK`^�\y˿���doc/pear/Net_Socket/README.mdnu�[���# Net_Socket - Network Socket Interface

[![Build Status](https://travis-ci.org/pear/Net_Socket.svg?branch=master)](https://travis-ci.org/pear/Net_Socket)
    

Net_Socket is a class interface to TCP sockets. It provides blocking
and non-blocking operation, with different reading and writing modes
(byte-wise, block-wise, line-wise and special formats like network
byte-order ip addresses).

[Homepage](http://pear.php.net/package/Net_Socket/)


## Installation
For a PEAR installation that downloads from the PEAR channel:

`$ pear install pear/net_socket`

For a PEAR installation from a previously downloaded tarball:

`$ pear install Net_Socket-*.tgz`

For a PEAR installation from a code clone:

`$ pear install package.xml`

For a local composer installation:

`$ composer install`

To add as a dependency to your composer-managed application:

`$composer require pear/net_socket`


## Tests
Run  the tests from a local composer installation:

`$ ./vendor/bin/phpunit`


## License
BSD-2 license
PK`^�\E���))8doc/pear/BrowserKit/Symfony/Component/BrowserKit/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKa^�\ʴˣ��=doc/pear/BrowserKit/Symfony/Component/BrowserKit/CHANGELOG.mdnu�[���CHANGELOG
=========

2.3.0
-----

 * [BC BREAK] `Client::followRedirect()` won't redirect responses with
   a non-3xx Status Code and `Location` header anymore, as per 
   http://tools.ietf.org/html/rfc2616#section-14.30

 * added `Client::getInternalRequest()` and `Client::getInternalResponse()` to
   have access to the BrowserKit internal request and response objects

2.1.0
-----

 * [BC BREAK] The CookieJar internals have changed to allow cookies with the
   same name on different sub-domains/sub-paths
PKa^�\��cW��>doc/pear/BrowserKit/Symfony/Component/BrowserKit/composer.jsonnu�[���{
    "name": "symfony/browser-kit",
    "type": "library",
    "description": "Symfony BrowserKit Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/dom-crawler": "~2.0"
    },
    "require-dev": {
        "symfony/process": "~2.0",
        "symfony/css-selector": "~2.0"
    },
    "suggest": {
        "symfony/process": ""
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\BrowserKit\\": "" }
    },
    "target-dir": "Symfony/Component/BrowserKit",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PKa^�\�_��:doc/pear/BrowserKit/Symfony/Component/BrowserKit/README.mdnu�[���BrowserKit Component
====================

BrowserKit simulates the behavior of a web browser.

The component only provide an abstract client and does not provide any
"default" backend for the HTTP layer.

Resources
---------

For a simple implementation of a browser based on an HTTP layer, have a look
at [Goutte](https://github.com/fabpot/Goutte).

For an implementation based on HttpKernelInterface, have a look at the
[Client](https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpKernel/Client.php)
provided by the HttpKernel component.

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/BrowserKit/
    $ composer.phar install
    $ phpunit
PKa^�\5k��#�#&doc/pear/XML_Util/examples/example.phpnu�[���<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Examples (file #1)
 *
 * several examples for the methods of XML_Util
 * 
 * PHP versions 4 and 5
 *
 * LICENSE:
 *
 * Copyright (c) 2003-2008 Stephan Schmidt <schst@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *    * The name of the author may not be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category   XML
 * @package    XML_Util
 * @subpackage Examples
 * @author     Stephan Schmidt <schst@php.net>
 * @copyright  2003-2008 Stephan Schmidt <schst@php.net>
 * @license    http://opensource.org/licenses/bsd-license New BSD License
 * @version    CVS: $Id$
 * @link       http://pear.php.net/package/XML_Util
 */

    /**
     * set error level
     */
    error_reporting(E_ALL);

    require_once 'XML/Util.php';
    
    /**
     * replacing XML entities
     */
    print 'replace XML entities:<br>';
    print XML_Util::replaceEntities('This string contains < & >.');
    print "\n<br><br>\n";

    /**
     * reversing XML entities
     */
    print 'replace XML entities:<br>';
    print XML_Util::reverseEntities('This string contains &lt; &amp; &gt;.');
    print "\n<br><br>\n";

    /**
     * building XML declaration
     */
    print 'building XML declaration:<br>';
    print htmlspecialchars(XML_Util::getXMLDeclaration());
    print "\n<br><br>\n";

    print 'building XML declaration with additional attributes:<br>';
    print htmlspecialchars(XML_Util::getXMLDeclaration('1.0', 'UTF-8', true));
    print "\n<br><br>\n";

    /**
     * building document type declaration
     */
    print 'building DocType declaration:<br>';
    print htmlspecialchars(XML_Util::getDocTypeDeclaration('package', 
        'http://pear.php.net/dtd/package-1.0'));
    print "\n<br><br>\n";

    print 'building DocType declaration with public ID (does not exist):<br>';
    print htmlspecialchars(XML_Util::getDocTypeDeclaration('package', 
        array('uri' => 'http://pear.php.net/dtd/package-1.0', 
            'id' => '-//PHP//PEAR/DTD PACKAGE 0.1')));
    print "\n<br><br>\n";

    print 'building DocType declaration with internal DTD:<br>';
    print '<pre>';
    print htmlspecialchars(XML_Util::getDocTypeDeclaration('package', 
        'http://pear.php.net/dtd/package-1.0', 
        '<!ELEMENT additionalInfo (#PCDATA)>'));
    print '</pre>';
    print "\n<br><br>\n";

    /**
     * creating an attribute string
     */
    $att = array(
        'foo'  => 'bar',
        'argh' => 'tomato'
    );

    print 'converting array to string:<br>';
    print XML_Util::attributesToString($att);
    print "\n<br><br>\n";


    /**
     * creating an attribute string with linebreaks
     */
    $att = array(
        'foo'  => 'bar',
        'argh' => 'tomato'
    );

    print 'converting array to string (including line breaks):<br>';
    print '<pre>';
    print XML_Util::attributesToString($att, true, true);
    print '</pre>';
    print "\n<br><br>\n";


    /**
     * splitting a qualified tag name
     */
    print 'splitting qualified tag name:<br>';
    print '<pre>';
    print_r(XML_Util::splitQualifiedName('xslt:stylesheet'));
    print '</pre>';
    print "\n<br>\n";


    /**
     * splitting a qualified tag name (no namespace)
     */
    print 'splitting qualified tag name (no namespace):<br>';
    print '<pre>';
    print_r(XML_Util::splitQualifiedName('foo'));
    print '</pre>';
    print "\n<br>\n";

    /**
     * splitting a qualified tag name (no namespace, but default namespace specified)
     */
    print 'splitting qualified tag name '
        . '(no namespace, but default namespace specified):<br>';
    print '<pre>';
    print_r(XML_Util::splitQualifiedName('foo', 'bar'));
    print '</pre>';
    print "\n<br>\n";

    /**
     * verifying XML names
     */
    print 'verifying \'My private tag\':<br>';
    print '<pre>';
    print_r(XML_Util::isValidname('My Private Tag'));
    print '</pre>';
    print "\n<br><br>\n";
    
    print 'verifying \'-MyTag\':<br>';
    print '<pre>';
    print_r(XML_Util::isValidname('-MyTag'));
    print '</pre>';
    print "\n<br><br>\n";

    /**
     * creating an XML tag
     */
    $tag = array(
        'namespace'  => 'foo',
        'localPart'  => 'bar',
        'attributes' => array('key' => 'value', 'argh' => 'fruit&vegetable'),
        'content'    => 'I\'m inside the tag'
    );

    print 'creating a tag with namespace and local part:<br>';
    print htmlentities(XML_Util::createTagFromArray($tag));
    print "\n<br><br>\n";

    /**
     * creating an XML tag
     */
    $tag = array(
        'qname'        => 'foo:bar',
        'namespaceUri' => 'http://foo.com',
        'attributes'   => array('key' => 'value', 'argh' => 'fruit&vegetable'),
        'content'      => 'I\'m inside the tag'
    );

    print 'creating a tag with qualified name and namespaceUri:<br>';
    print htmlentities(XML_Util::createTagFromArray($tag));
    print "\n<br><br>\n";

    /**
     * creating an XML tag
     */
    $tag = array(
        'qname'        => 'bar',
        'namespaceUri' => 'http://foo.com',
        'attributes'   => array('key' => 'value', 'argh' => 'fruit&vegetable')
    );

    print 'creating an empty tag without namespace but namespace Uri:<br>';
    print htmlentities(XML_Util::createTagFromArray($tag));
    print "\n<br><br>\n";

    /**
     * creating an XML tag with more namespaces
     */
    $tag = array(
        'namespace'   => 'foo',
        'localPart'   => 'bar',
        'attributes'  => array('key' => 'value', 'argh' => 'fruit&vegetable'),
        'content'     => 'I\'m inside the tag',
        'namespaces'  => array(
            'bar'  => 'http://bar.com',
            'pear' => 'http://pear.php.net',
        )
    );

    print 'creating an XML tag with more namespaces:<br />';
    print htmlentities(XML_Util::createTagFromArray($tag));
    print "\n<br><br>\n";

    /**
     * creating an XML tag with a CData Section
     */
    $tag = array(
        'qname'      => 'foo',
        'attributes' => array('key' => 'value', 'argh' => 'fruit&vegetable'),
        'content'    => 'I\'m inside the tag'
    );

    print 'creating a tag with CData section:<br>';
    print htmlentities(XML_Util::createTagFromArray($tag, XML_UTIL_CDATA_SECTION));
    print "\n<br><br>\n";

    /**
     * creating an XML tag with a CData Section
     */
    $tag = array(
        'qname'      => 'foo',
        'attributes' => array('key' => 'value', 'argh' => 't�t�'),
        'content'    => 
            'Also XHTML-tags can be created '
            . 'and HTML entities can be replaced � � � � <>.'
    );

    print 'creating a tag with HTML entities:<br>';
    print htmlentities(XML_Util::createTagFromArray($tag, XML_UTIL_ENTITIES_HTML));
    print "\n<br><br>\n";

    /**
    * creating an XML tag with createTag
    */
    print 'creating a tag with createTag:<br>';
    print htmlentities(XML_Util::createTag('myNs:myTag', 
        array('foo' => 'bar'), 
        'This is inside the tag', 
        'http://www.w3c.org/myNs#'));
    print "\n<br><br>\n";

    
    /**
     * trying to create an XML tag with an array as content
     */
    $tag = array(
        'qname'   => 'bar',
        'content' => array('foo' => 'bar')
    );
    print 'trying to create an XML tag with an array as content:<br>';
    print '<pre>';
    print_r(XML_Util::createTagFromArray($tag));
    print '</pre>';
    print "\n<br><br>\n";
    
    /**
     * trying to create an XML tag without a name
     */
    $tag = array(
        'attributes' => array('foo' => 'bar'),
    );
    print 'trying to create an XML tag without a name:<br>';
    print '<pre>';
    print_r(XML_Util::createTagFromArray($tag));
    print '</pre>';
    print "\n<br><br>\n";
?>
PKb^�\�f��'doc/pear/XML_Util/examples/example2.phpnu�[���<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Examples (file #2)
 *
 * several examples for the methods of XML_Util
 * 
 * PHP versions 4 and 5
 *
 * LICENSE:
 *
 * Copyright (c) 2003-2008 Stephan Schmidt <schst@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *    * The name of the author may not be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category   XML
 * @package    XML_Util
 * @subpackage Examples
 * @author     Stephan Schmidt <schst@php.net>
 * @copyright  2003-2008 Stephan Schmidt <schst@php.net>
 * @license    http://opensource.org/licenses/bsd-license New BSD License
 * @version    CVS: $Id$
 * @link       http://pear.php.net/package/XML_Util
 */

    /**
     * set error level
     */
    error_reporting(E_ALL);

    require_once 'XML/Util.php';

    /**
     * creating a start element
     */
    print 'creating a start element:<br>';
    print htmlentities(XML_Util::createStartElement('myNs:myTag', 
        array('foo' => 'bar'), 'http://www.w3c.org/myNs#'));
    print "\n<br><br>\n";


    /**
     * creating a start element
     */
    print 'creating a start element:<br>';
    print htmlentities(XML_Util::createStartElement('myTag', 
        array(), 'http://www.w3c.org/myNs#'));
    print "\n<br><br>\n";

    /**
     * creating a start element
     */
    print 'creating a start element:<br>';
    print '<pre>';
    print htmlentities(XML_Util::createStartElement('myTag', 
        array('foo' => 'bar', 'argh' => 'tomato'), 
        'http://www.w3c.org/myNs#', true));
    print '</pre>';
    print "\n<br><br>\n";


    /**
     * creating an end element
     */
    print 'creating an end element:<br>';
    print htmlentities(XML_Util::createEndElement('myNs:myTag'));
    print "\n<br><br>\n";

    /**
     * creating a CData section
     */
    print 'creating a CData section:<br>';
    print htmlentities(XML_Util::createCDataSection('I am content.'));
    print "\n<br><br>\n";

    /**
     * creating a comment
     */
    print 'creating a comment:<br>';
    print htmlentities(XML_Util::createComment('I am a comment.'));
    print "\n<br><br>\n";

    /**
     * creating an XML tag with multiline mode
     */
    $tag = array(
        'qname'        => 'foo:bar',
        'namespaceUri' => 'http://foo.com',
        'attributes'   => array('key' => 'value', 'argh' => 'fruit&vegetable'),
        'content'      => 'I\'m inside the tag & contain dangerous chars'
    );

    print 'creating a tag with qualified name and namespaceUri:<br>';
    print '<pre>';
    print htmlentities(XML_Util::createTagFromArray($tag, 
        XML_UTIL_REPLACE_ENTITIES, true));
    print '</pre>';
    print "\n<br><br>\n";

    /**
     * create an attribute string without replacing the entities
     */
    $atts = array('series' => 'Starsky &amp; Hutch', 'channel' => 'ABC');
    print 'creating a attribute string, '
        . 'entities in values already had been replaced:<br>';
    print htmlentities(XML_Util::attributesToString($atts, 
        true, false, false, false, XML_UTIL_ENTITIES_NONE));
    print "\n<br><br>\n";

    /**
     * using the array-syntax for attributesToString()
     */
    $atts = array('series' => 'Starsky &amp; Hutch', 'channel' => 'ABC');
    print 'using the array-syntax for attributesToString()<br>';
    print htmlentities(XML_Util::attributesToString($atts, 
        array('entities' => XML_UTIL_ENTITIES_NONE)));
    print "\n<br><br>\n";


?>
PKc^�\Ie��;;-doc/pear/ConsoleTools/docs/example_output.phpnu�[���<?php
/**
 * Example for the usage of ezcConsoleOutput class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

require_once 'Base/src/base.php';

/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}

// Create the output handler
$out = new ezcConsoleOutput();

// Set the verbosity to level 10
$out->options->verbosityLevel = 10;
// Enable auto wrapping of lines after 40 characters
$out->options->autobreak    = 40;

// Set the color of the default output format to green
$out->formats->default->color   = 'green';

// Set the color of the output format named 'success' to white
$out->formats->success->color   = 'white';
// Set the style of the output format named 'success' to bold
$out->formats->success->style   = array( 'bold' );

// Set the color of the output format named 'failure' to red
$out->formats->failure->color   = 'red';
// Set the style of the output format named 'failure' to bold
$out->formats->failure->style   = array( 'bold' );
// Set the background color of the output format named 'failure' to blue
$out->formats->failure->bgcolor = 'blue';

// Output text with default format
$out->outputText( 'This is default text ' );
// Output text with format 'success'
$out->outputText( 'including success message', 'success' );
// Some more output with default output.
$out->outputText( "and a manual linebreak.\n" );

// Manipulate the later output
$out->formats->success->color = 'green';
$out->formats->default->color = 'blue';

// This is visible, since we set verboseLevel to 10, and printed in default format (now blue)
$out->outputText( "Some verbose output.\n", null, 10 );
// This is not visible, since we set verboseLevel to 10
$out->outputText( "Some more verbose output.\n", null, 20 );
// This is visible, since we set verboseLevel to 10, and printed in format 'failure'
$out->outputText( "And some not so verbose, failure output.\n", 'failure', 5 );

?>
PKc^�\W�6�r
r
2doc/pear/ConsoleTools/docs/example_progressbar.phpnu�[���<?php
/**
 * Example for the usage of ezcConsoleProgressbar class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

require_once 'Base/src/base.php';

/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}

$out = new ezcConsoleOutput();

$out->formats->red->color = "red";

// Create progress bar itself
$progress = new ezcConsoleProgressbar( $out, 100, array( 'step' => 5 ) );

$progress->options->emptyChar = '-';
$progress->options->progressChar = $out->formatText('>', "red");
$progress->options->formatString = "Uploading file </tmp/foobar.tar.bz2>: %act%/%max% kb [%bar%]";

// Perform actions
$i = 0;
while( $i++ < 20 ) 
{
    // Do whatever you want to indicate progress for
    usleep( mt_rand( 20000, 2000000 ) );
    // Advance the progressbar by one step ( uploading 5k per run )
    $progress->advance();
}

// Finish progress bar and jump to next line.
$progress->finish();

$out->outputText( "Successfully uploaded </tmp/foobar.tar.bz2>.\n", 'success' );

/*
OUTPUT: (sequential, will be printed into 1 line and updated in reallife)

Uploading file </tmp/foobar.tar.bz2>:   5/100 kb [++#----------------------------------------------]
Uploading file </tmp/foobar.tar.bz2>:  10/100 kb [+++++#-------------------------------------------]
Uploading file </tmp/foobar.tar.bz2>:  15/100 kb [++++++++#----------------------------------------]
Uploading file </tmp/foobar.tar.bz2>:  20/100 kb [+++++++++++#-------------------------------------]
Uploading file </tmp/foobar.tar.bz2>:  25/100 kb [++++++++++++++#----------------------------------]
Uploading file </tmp/foobar.tar.bz2>:  30/100 kb [+++++++++++++++++#-------------------------------]
Uploading file </tmp/foobar.tar.bz2>:  35/100 kb [++++++++++++++++++++#----------------------------]
Uploading file </tmp/foobar.tar.bz2>:  40/100 kb [+++++++++++++++++++++++#-------------------------]
Uploading file </tmp/foobar.tar.bz2>:  45/100 kb [++++++++++++++++++++++++++#----------------------]
Uploading file </tmp/foobar.tar.bz2>:  50/100 kb [+++++++++++++++++++++++++++++#-------------------]
Uploading file </tmp/foobar.tar.bz2>:  55/100 kb [++++++++++++++++++++++++++++++++#----------------]
Uploading file </tmp/foobar.tar.bz2>:  60/100 kb [+++++++++++++++++++++++++++++++++++#-------------]
Uploading file </tmp/foobar.tar.bz2>:  65/100 kb [++++++++++++++++++++++++++++++++++++++#----------]
Uploading file </tmp/foobar.tar.bz2>:  70/100 kb [+++++++++++++++++++++++++++++++++++++++++#-------]
Uploading file </tmp/foobar.tar.bz2>:  75/100 kb [++++++++++++++++++++++++++++++++++++++++++++#----]
Uploading file </tmp/foobar.tar.bz2>:  80/100 kb [+++++++++++++++++++++++++++++++++++++++++++++++#-]
Uploading file </tmp/foobar.tar.bz2>:  85/100 kb [++++++++++++++++++++++++++++++++++++++++++++++++#]
Uploading file </tmp/foobar.tar.bz2>:  90/100 kb [++++++++++++++++++++++++++++++++++++++++++++++++#]
Uploading file </tmp/foobar.tar.bz2>:  95/100 kb [++++++++++++++++++++++++++++++++++++++++++++++++#]
Uploading file </tmp/foobar.tar.bz2>: 100/100 kb [++++++++++++++++++++++++++++++++++++++++++++++++#]
Uploading file </tmp/foobar.tar.bz2>: 100/100 kb [++++++++++++++++++++++++++++++++++++++++++++++++#]Successfully uploaded </tmp/foobar.tar.bz2>.

*/
?>
PKc^�\X�&��"doc/pear/ConsoleTools/docs/CREDITSnu�[���CREDITS
=======

eZ Components team
------------------

- Sergey Alexeev
- Sebastian Bergmann
- Jan Borsodi
- Raymond Bosman
- Frederik Holljen
- Kore Nordmann
- Derick Rethans
- Vadym Savchuk
- Tobias Schlitt
- Alexandru Stanoi
PKd^�\%�-=NNGdoc/pear/ConsoleTools/docs/tutorial_example_14_dialog_yesnoquestion.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$question = ezcConsoleQuestionDialog::YesNoQuestion(
    $output,
    "Do you want to proceed?",
    "y"
);

do
{
    echo "\nSome action performed...\n\n";
}
while ( ezcConsoleDialogViewer::displayDialog( $question ) !== "n" );

echo "Goodbye!\n";

?>
PKe^�\X��"""doc/pear/ConsoleTools/docs/LICENSEnu�[���eZ Components Licence
=====================

New BSD Licence
---------------

Copyright (c) 2005-2008, eZ Systems A.S.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright
  notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
  copyright notice, this list of conditions and the following
  disclaimer in the documentation and/or other materials provided
  with the distribution.
* Neither the name of eZ Systems A.S. nor the names of its
  contributors may be used to endorse or promote products derived
  from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PKe^�\�4��((Bdoc/pear/ConsoleTools/docs/tutorial_example_13_dialog_question.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$question = new ezcConsoleQuestionDialog( $output );
$question->options->text = "Do you want to proceed?";
$question->options->showResults = true;
$question->options->validator = new ezcConsoleQuestionDialogCollectionValidator(
    array( "y", "n" ),
    "y",
    ezcConsoleQuestionDialogCollectionValidator::CONVERT_LOWER
);

do
{
    echo "\nSome action performed...\n\n";
}
while ( ezcConsoleDialogViewer::displayDialog( $question ) !== "n" );

echo "Goodbye!\n";

?>
PKf^�\ó-Ɛ�<doc/pear/ConsoleTools/docs/tutorial_example_08_statusbar.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$output->formats->success->color = 'green';
$output->formats->failure->color = 'red';

$options = array( 
    'successChar' => $output->formatText( '+', 'success' ),
    'failureChar' => $output->formatText( '-', 'failure' ),
);

$status = new ezcConsoleStatusbar( $output, $options );

for ( $i = 0; $i < 120; $i++ )
{
    $nextStatus = ( bool )mt_rand( 0,1 );
    $status->add( $nextStatus );
    usleep(  mt_rand( 200, 2000 ) );
}

$output->outputLine();
$output->outputLine( 'Successes: ' . $status->getSuccessCount() . ', Failures: ' . $status->getFailureCount() );

?>
PKf^�\��GU��Adoc/pear/ConsoleTools/docs/tutorial_example_03_output_options.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$output->formats->info->color = 'blue';
$output->formats->info->style = array( 'bold' );

$output->setOptions( 
    array( 
        'autobreak'      => 78,
        'verbosityLevel' => 3
    )
);

$output->outputLine( 'This is a very very long info text. It has so much information in '.
                     'it, that it will definitly not fit into 1 line. Therefore, '.
                     'ezcConsoleOutput will automatically wrap the line for us.', 'info' );

$output->outputLine();

$output->outputLine( 'This verbose information will currently not be displayed.', 'info', 10 );

$output->outputLine( 'But this verbose information will be displayed.', 'info', 2 );

?>
PKf^�\�n6�^^,doc/pear/ConsoleTools/docs/example_table.phpnu�[���<?php
/**
 * Example for the usage of ezcConsoleTable class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

require_once 'Base/src/base.php';
/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}

// Initialize the console output handler
$out = new ezcConsoleOutput();
// Define a new format "headline"
$out->formats->headline->color = 'red';
$out->formats->headline->style = array( 'bold' );
// Define a new format "sum"
$out->formats->sum->color = 'blue';
$out->formats->sum->style = array( 'negative' );

// Create a new table
$table = new ezcConsoleTable( $out, 60 );

// Create first row and in it the first cell
$table[0][0]->content = 'Headline 1';

// Create 3 more cells in row 0
for ( $i = 2; $i < 5; $i++ )
{
     $table[0][]->content = "Headline $i";
}

$data = array( 1, 2, 3, 4 );

// Create some more data in the table...
foreach ( $data as $value )
{
     // Create a new row each time and set it's contents to the actual value
     $table[][0]->content = "$value";
}

// Set another border format for our headline row
$table[0]->borderFormat = 'headline';

// Set the content format for all cells of the 3rd row to "sum"
$table[2]->format = 'sum';

$table->outputTable();
echo "\n";
/*

RESULT (without color):

+------------+------------+------------+------------+       // 
| Headline 1 | Headline 2 | Headline 3 | Headline 4 |       // Red bordered line
+------------+------------+------------+------------+       // 
| 1          |            |            |            |
+------------+------------+------------+------------+
| 2          |            |            |            |       // Content printed in white on blue
+------------+------------+------------+------------+
| 3          |            |            |            |
+------------+------------+------------+------------+
| 4          |            |            |            |
+------------+------------+------------+------------+

*/
?>
PKg^�\��GmmAdoc/pear/ConsoleTools/docs/tutorial_example_05_input_advanced.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$input = new ezcConsoleInput();

$helpOption = $input->registerOption( new ezcConsoleOption( 'h', 'help' ) );

$inputOption = $input->registerOption( 
    new ezcConsoleOption( 
        'i',
        'input',
        ezcConsoleInput::TYPE_STRING
    )
);

$outputOption = $input->registerOption(
    new ezcConsoleOption( 
        'o',
        'output'
    )
);
$outputOption->type = ezcConsoleInput::TYPE_STRING;

$inputOption->addDependency( 
    new ezcConsoleOptionRule( $outputOption )
);
$outputOption->addDependency( 
    new ezcConsoleOptionRule( $inputOption )
);

try
{
    $input->process();
}
catch ( ezcConsoleOptionException $e )
{
    die( $e->getMessage() );
}

if ( $helpOption->value === true )
{
    echo $input->getSynopsis() . "\n";
    foreach ( $input->getOptions() as $option )
    {
        echo "-{$option->short}/{$option->long}: {$option->shorthelp}\n";
    }
}
elseif ( $outputOption->value !== false )
{
    echo "Input: {$inputOption->value}, Output: {$outputOption->value}\n";
    echo "Arguments: " . implode( ", ", $input->getArguments() ) . "\n";
}

?>
PKg^�\v%��vv@doc/pear/ConsoleTools/docs/example_question_dialog_type_full.phpnu�[���<?php

require_once "Base/src/base.php";

function __autoload( $className )
{
    ezcBase::autoload( $className );
}

$out = new ezcConsoleOutput();

$opts = new ezcConsoleQuestionDialogOptions();
$opts->text = "How old are you?";
$opts->showResults = true;
$opts->validator = new ezcConsoleQuestionDialogTypeValidator(
    ezcConsoleQuestionDialogTypeValidator::TYPE_INT
);

$dialog = new ezcConsoleQuestionDialog( $out, $opts );

if ( ( $res = ezcConsoleDialogViewer::displayDialog( $dialog ) ) < 8 )
{
    echo "Sorry, I can not believe that you are $res years old!\n";
}
else
{
    echo "Hey, you're still young! :)\n";
}

?>
PKg^�\���M��>doc/pear/ConsoleTools/docs/tutorial_example_15_dialog_menu.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$menu = new ezcConsoleMenuDialog( $output );
$menu->options = new ezcConsoleMenuDialogOptions();
$menu->options->text = "Please choose a possibility:\n";
$menu->options->validator = new ezcConsoleMenuDialogDefaultValidator(
    array(
        "1" => "Perform some more actions",
        "2" => "Perform another action",
        "0" => "Quit",
    ),
    "0"
);

while ( ( $choice = ezcConsoleDialogViewer::displayDialog( $menu ) ) != 0 )
{
    switch ( $choice )
    {
        case 1:
            echo "Performing some more actions...\n";
            break;
        case 2:
            echo "Performing some other actions!\n";
            break;
    }
}

?>
PKh^�\\�����Bdoc/pear/ConsoleTools/docs/tutorial_example_02_output_advanced.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$output->formats->info->color = 'blue';

$output->formats->error->color = 'red';
$output->formats->error->style = array( 'bold' );

$output->formats->fatal->color = 'red';
$output->formats->fatal->style = array( 'bold', 'underlined' );
$output->formats->fatal->bgcolor = 'black';

$output->outputText( 'This is some standard text ' );
$output->outputText( 'including some error', 'error' );
$output->outputText( ' wrapped in standard text.' );
$output->outputText( "\n" );

$output->outputLine( 'This is a fatal error message.', 'fatal' );

$output->outputText( 'Test' );

?>
PKh^�\�Z����?doc/pear/ConsoleTools/docs/tutorial_example_01_output_basic.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$output->formats->info->color = 'blue';

$output->outputText( 'Test text in color blue', 'info' );

?>
PKi^�\�r��pp7doc/pear/ConsoleTools/docs/example_menu_dialog_full.phpnu�[���<?php

require_once "Base/src/base.php";

function __autoload( $className )
{
    ezcBase::autoload( $className );
}

$out = new ezcConsoleOutput();

$opts = new ezcConsoleMenuDialogOptions();
$opts->text = "Please choose a possibility:\n";
$opts->validator = new ezcConsoleMenuDialogDefaultValidator(
    array(
        "A" => "Selection A",
        "B" => "Selection B",
        "C" => "Selection C",
        "D" => "Selection D",
        "Z" => "Selection Z",
    ),
    "Z"
);

$dialog = new ezcConsoleMenuDialog( $out, $opts );

$res = ezcConsoleDialogViewer::displayDialog( $dialog );
echo "User seletced $res\n";

?>
PKi^�\��x=��0doc/pear/ConsoleTools/docs/tutorial_autoload.phpnu�[���<?php
$dir = dirname( __FILE__ );
$dirParts = explode( DIRECTORY_SEPARATOR, $dir );
switch ( $dirParts[count( $dirParts ) - 3] )
{
    case 'doc': require_once 'ezc/Base/base.php'; break; // pear
    case 'trunk': require_once "$dir/../../Base/src/base.php"; break; // svn
    default: require_once "$dir/../../Base/src/base.php"; break; // bundle
}

/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}
?>
PKi^�\E�Q���0doc/pear/ConsoleTools/docs/example_statusbar.phpnu�[���<?php
/**
 * Example for the usage of ezcConsoleStatusbar class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

require_once 'Base/src/base.php';

/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}

$out = new ezcConsoleOutput();

// Create status bar itself
$status = new ezcConsoleStatusbar( $out );

// Perform actions
$i = 0;
while( $i++ < 20 ) 
{
    // Do whatever you want to indicate progress for
    usleep( mt_rand( 20000, 2000000 ) );
    // Indicate success or failure
    $status->add( (bool)mt_rand( 0, 1 ) );
}

$out->outputLine();
// Print statistics
$out->outputLine( $status->getSuccessCount() . ' operations succeeded, ' . $status->getFailureCount() . ' failed.' );

/*
OUTPUT:

+-++++-++++-++-+--+-
13 operations succeeded, 7 failed.

*/
?>
PKj^�\-;eeFdoc/pear/ConsoleTools/docs/example_question_dialog_collection_full.phpnu�[���<?php

require_once "Base/src/base.php";

function __autoload( $className )
{
    ezcBase::autoload( $className );
}

$out = new ezcConsoleOutput();

$opts = new ezcConsoleQuestionDialogOptions();
$opts->text = "Do you want to proceed?";
$opts->showResults = true;
$opts->validator = new ezcConsoleQuestionDialogCollectionValidator(
    array( "y", "n" ),
    "n",
    ezcConsoleQuestionDialogCollectionValidator::CONVERT_LOWER
);

$dialog = new ezcConsoleQuestionDialog( $out, $opts );

echo "The user decided to " . ( ezcConsoleDialogViewer::displayDialog( $dialog ) === "n" ? "not " : "" ) . "proceed.\n";

?>
PKj^�\�L�_�_'doc/pear/ConsoleTools/docs/tutorial.txtnu�[���eZ Components - ConsoleTools
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. contents:: Table of Contents

Introduction
============

The ConsoleTools component provides several useful tools to build
applications that run on a computer console (sometimes also called shell or
command line). For example, eZ Publish includes several shell
scripts that perform tasks like clearing caches.

.. note::
   From version 1.5.2 on, all necessary string operations in ConsoleTools are
   performed using `ext/iconv`__. This makes the component binary safe and
   allows you to use arbitrary unicode characters in your texts. Please make
   sure to convert your text to UTF-8 before submitting it to a method in
   ConsoleTools, if you use a different, non ASCII-compatible encoding.

.. __: http://php.net/iconv

Class overview
==============

The ConsoleTools component offers several (mostly independent) classes to 
perform different tasks. The main classes are:

ezcConsoleOutput
  ezcConsoleOutput is responsible for printing text to the console. It allows 
  you to print text in different colors with different background colors.
  It can also apply other styling information to the text, making
  it bold or underlined for example. It can automatically wrap text
  after a certain number of characters are printed (keeping words
  intact) and handle output of different verbosity levels. ATTENTION: Windows
  does not support the styling of text.

ezcConsoleInput
  Using this little tool, you can handle the options and arguments provided to
  your shell application. It is capable of handling and validating three types of
  option datatypes (string, int and none) and can handle optional and mandatory
  options as well as rules to define relations between them. Rules can include
  dependencies and exclusions between options.

ezcConsoleProgressbar
  Most often you will use a console application in favor of a web application
  when it comes to processing time-consuming tasks. To indicate the
  current progress of a task, a kind of "status 
  indicator" will be used, which is most commonly a progress bar. 
  ezcConsoleProgressbar gives you an easy-to-use interface to display this. 
  It will keep track of re-drawing the bar as needed, showing current 
  and maximum values, as well as percentage completion. It is 
  fully configurable regarding its visual appearance.

ezcConsoleStatusbar
  ezcConsoleStatusbar is the "little brother" of ezcConsoleProgressbar. It
  also allows you to display the progress of a time-consuming action, but does
  not use a fixed bar-like appearance. Instead, it indicates successful
  and failed operations by displaying specific characters and keeps a
  count of successes and failures. This allows you to indicate
  the progress of a process where you don't initially know the number of
  actions to be performed.

ezcConsoleProgressMonitor
  Sometimes you need to display the progress of several actions and don't want
  to use a progress bar to do so. In this case you need the status indicator.
  It allows you to display a status entry for each action and generates the
  percentage completion of the current step.

ezcConsoleTable
  This class lets you easily create tables to be displayed on the
  console. It has a very convenient interface to create a table and manage the
  data it contains. It is highly configurable regarding the table's appearance
  (for example, different color and style information for content
  and borders on a per-cell basis, character selection for borders, variable
  width of the table and so on). ezcConsoleTable will also take care of measuring the 
  best width for table columns (to make your content fit best), automatically
  wrapping content and aligning the content in the cells as indicated.

ezcConsoleDialog
  This interface provides a common API for user interaction elements. A console
  dialog can request information from a user and react on this information
  interactively. For you as a user of ezcConsoleDialog, a dialog is displayed
  to the user and returns a result value to you, which was provided by the user
  of your application in some way. Currently 2 implementations of
  ezcConsoleDialog exist: ezcConsoleQuestionDialog is a dialog for asking a
  simply question and retrieving the answer from the user of an application.
  Instances of the  ezcConsoleMenuDialog class display a menu to the user and
  retrieves his choice of a menu item.

Usage
=====

Printing text to the console
----------------------------

As mentioned, the class ezcConsoleOutput is used to print text to the console.
Let's look at a basic example:

.. include:: tutorial_example_01_output_basic.php
   :literal:

The ezcConsoleOutput object is simply instantiated. You can optionally submit
options and predefined formatting options to its constructor, but this can also 
be done later.

In line 7, you can see how format is defined. Formats are created on the fly,
as soon as you access them (for reading or writing) through the $output->formats
attribute. There, we create a format called "info" and assign the color value
"blue" to it. This will make all text printed with this format blue. In line 9,
you can see how the format is applied to some text at printing time.

The second example shows some more advanced code:

.. include:: tutorial_example_02_output_advanced.php
   :literal:

In this example, two more formats are defined: "error" and "fatal". These formats 
have an additional style attribute set, which makes them both appear bold. The
"fatal" format will also underline the text and give it a black background
color.

The difference between ezcConsoleOutput->outputText() and
ezcConsoleOutput->outputLine() is that the latter automatically adds a
newline value to your text. The newline sequence used here is adjusted based on
the operating system. The use of ezcConsoleOutput->outputLine() is recommended
over the direct output of, for example, "\n".

If you leave the second parameter of ezcConsoleOutput::outputText() and
ezcConsoleOutput::outputLine() out, the "default" format is used. The default
is set to your console's default setting, but you can also change this as
for any other format you define. A third variant to format text is
ezcConsoleOutput->formatText(), which returns the formatted string instead of
printing it.

This example shows some of the options ezcConsoleOutput supports:

.. include:: tutorial_example_03_output_options.php
   :literal:

autobreak
  Will wrap lines automatically after the set amount of characters, keeping
  word boundaries intact.

verbosityLevel
  Allows you to specify a third parameter to ezcConsoleOutput->outputLine() and
  ezcConsoleOutput->outputText() to indicate a verbosity level for when the text
  should be printed. By setting the "verbosityLevel" option for
  ezcConsoleOutput, you define which texts will and will not be printed.

In our example, the call on line 23 would not print out text with the
"verbosityLevel" option set to 3, but the call on line 25 would.

The last example shows how to change the target of a format, which allows you
to print text e.g. to STDERR.

.. include:: tutorial_example_output_targets.php
   :literal:

The error message 'Unable to connect to database' will be printed in bold, with
a red foreground color to STDOUT. The default target is
ezcConsoleOutput::TARGET_OUTPUT, which prints to STDOUT and has standar output
buffering in place. If you want to switch out the standard output bufferung,
use ezcConsoleOutput::TARGET_STDOUT.

Although this feature was originally not designed for that purpose, you can
also use any other arbitrary PHP stream definition as a target. For example
'file:///var/log/my.log' to get the messages redirected to a log file instead
of displaying them.

Mastering options and arguments
-------------------------------

Below is a simple example for ezcConsoleInput:

.. include:: tutorial_example_04_input_basic.php
   :literal:
   
After instantiating a new ezcConsoleInput object to handle the options, an
option is registered on lines 7-12. This option will be available as "-h" and
"--help". The ezcConsoleInput->process() call makes ezcConsoleInput respond to the
options submitted by the user. If any error occurs with the submitted user
data, the method will throw an exception of type ezcConsoleOptionException. By
default, all options are registered with the value type
ezcConsoleInput::TYPE_NONE, which indicates that they don't expect a value
from the user. If a value is submitted anyway, ezcConsoleInput->process() will
throw a ezcConsoleOptionTypeViolationException. 

On line 23, a check is performed to see whether an option was submitted. If an option was not 
submitted, its $value property will contain bool *false*. Depending on the $type
set, it can contain different value types if it was submitted. If you use the 
(not shown here) ezcConsoleOption->$multiple property, the value will be an array 
containing the specified value types.

The next example is more advanced:

.. include:: tutorial_example_05_input_advanced.php
   :literal:

Two options are registered here: "-i" / "--input" and "-o" / "--output". For the
first one, additional properties for the ezcConsoleOption object are submitted
through the constructor. For the second ezcConsoleOption object, you see how to
provide additional properties after construction. We change the type of both
options to expect a string value from the user (lines 13 and 20).

In lines 25 and 28 we make both parameters depend on each other. If one of them
is submitted without the other, ezcConsoleInput->process() will throw an
ezcConsoleOptionDependencyViolationException. Aside from dependency rules, you can
also define exclusion rules using ezcConsoleOption->addExclusion().

On line 43, the method ezcConsoleInput->getSynopsis() is used to retrieve a
synopsis string for the program. The synopsis for our example would look like
this: ::

  $ ./tutorial_example_05_input_advanced.php [-h] [-i <string> [-o <string>] ]  [[--] <args>] 

The synopsis will indicate the option value types, whether they are optional, the
inter-option dependencies and default values (if set). On line 46, the property 
ezcConsoleOption->$shorthelp is accessed, where you can store some short help
information. It has a reasonable default value set.

On line 49, the submission of the "-o" option is checked. Because this has a
dependency on the "-i" option, a check for that is not necessary. Line 52
shows how you can access the arguments submitted to the program.
ezcConsoleInput->getArguments() always returns an array (which is empty if no
arguments are submitted). A more advanced way of handling arguments is
explained further below.

Here is an example of how the defined program would be called: ::

  $ ./tutorial_example_05_input_advanced.php -i /var/www -o /tmp foo bar 

The program would respond by printing the following: ::

  Input: /var/www, Output: /tmp
  Arguments: foo, bar

As you can see, this example does not define, which arguments are expected and
therefore, the program simply accepts any number of arguments and provides them
through the ezcConsoleInput->getArguments() method. The following example
shows, how specific arguments can be defined:

.. include:: tutorial_example_12_input_arguments.php
   :literal:

As seen before, a help option is registered. In addition, 3 arguments are
registered: The first one with the name "source" is a standard argument. It is
mandatory for the user to submit a value here. The second argument,
"destination" is optional and a default value is assigned, which will be used,
if the user does not provide a value for it.

The third one ("iterations") is not of type string, but an integer. Because the
second argument is optional, this third one is automatically optional, too.
Since no default value is assigned, it will be null, if the user does not
submit it. If a value is provided, it must be an integer.

Argument definitions are processed as usual inside the
ezcConsoleInput->process() method, but will throw an
ezcConsoleArgumentException if something goes wrong. If desired, exceptions
about options and arguments can be caught together using ezcConsoleException or
be handled on their own.

The value of an argument can be fetched from its definition, using its value
property. As can be seen at the very end of the example, for reading purpose,
arguments can be accessed by their name. This does not work for writing
purpose, since a specific order must be given there.

If the --help option is set, mandatory arguments don't need to be submitted and
are silently ignored. The help text generated by ezcConsoleInput for this
example looks like this: ::
    
    Usage: $ tutorial_example_12_input_arguments.php [-h] [--] <string:source> [<string:destination>] [<int:iterations>]
    A simple text program

    -h / --help           No help available.
    Arguments:            
    <string:source>       The source directory.
    <string:destination>  No help available.
    <int:iterations>      Number of iterations.


For further information, please refer to the API documentation of
ezcConsoleInput.

Progress indication
-------------------

This example defines a simple progress bar:

.. include:: tutorial_example_06_progressbar_basic.php
   :literal:

The created progressbar will count to a maximum value of 15, submitted to 
ezcConsoleProgressbar->__construct() in line 7. ezcConsoleProgressbar utilizes
ezcConsoleOutput to print the generated progress bar. The call to
ezcConsoleProgressbar->advance() pushes the progress bar one step further on each
call and redraws it (line 11). Calling ezcConsoleProgressbar->finish() will set
the progress bar to 100% immediately.

The progress bar generated by the example will look like this:

.. image:: img/consoletools_tutorial_example_06.png

The next example performs more customization on the progress bar appearance:

.. include:: tutorial_example_07_progressbar_advanced.php
   :literal:

The defined options array demonstrates only a small subset of options. For
detailed information, see the API documentation on
ezcConsoleProgressbarOptions. The "emptyChar" value defines the character to
prefill the bar, the "barChar" option defines the character to fill the bar
with when calling ezcConsoleProgressbar->advance().
Using the "formatString" option, you define the appearance of the whole bar.
Here the substitution of several placeholders (like "%fraction%" and "%bar%")
is permitted. "formatString" must contain the "%bar%" placeholder, while all
other values are optional. Any other printable character is permitted.
Formatting options are allowed in the "formatString" option, but
not in any other option. "redrawFrequency" defines how often the
progressbar will be redrawn. In the example this will be every 50th call to
ezcConsoleProgressbar->advance().

The resulting progress bar looks like this:

.. image:: img/consoletools_tutorial_example_07.png

With ezcConsoleStatusbar, you can indicate the progress of a time-consuming
action in a simpler way. Here is an example:

.. include:: tutorial_example_08_statusbar.php
   :literal:

This variant of indicating progress only displays success or failure indicators
for an action and allows you to run any number of actions, without specifying
in advance how many you will perform. The "successChar" and "failureChar" options
indicate which string to print on a successful or failed action. Lines 11 and
12 format these strings.

Indicating a status is done using ezcConsoleStatusbar->add(), which expects
*true* for a succeeded action and *false* for a failed one (line 20). You can 
access the number of successes and failures through
ezcConsoleStatusbar->getSuccessCount() and
ezcConsoleStatusbar->getFailureCount(). To make ezcConsoleStatusbar
wrap a line after a certain amount of statuses, you can use 
ezcConsoleOutput->$autobreak.

Here the result of the example:

.. image:: img/consoletools_tutorial_example_08.png

Finally, ezcConsoleProgressMonitor can indicate progress, but does not use a
bar-like interface. It simply prints status information about each action you
perform and shows the current progress as a percentage value in relation to the
number of actions you plan to perform overall.

.. include:: tutorial_example_11_progressmonitor.php
   :literal:

Line 7 creates a new status indicator, which will iterate over 7 actions.
Inside the while loop, we simulate some actions. The
call to $status->addEntry() adds a status entry and causes the indicator to
print the entry. Every entry consists of a tag (first parameter) and a message.

The result of the example is as follows:

::

    14.3% ACTION Performed action #1.
    28.6% ACTION Performed action #2.
    42.9% ACTION Performed action #3.
    57.1% ACTION Performed action #4.
    71.4% ACTION Performed action #5.
    85.7% ACTION Performed action #6.
   100.0% ACTION Performed action #7.

More information on these classes can be found in the API documentation of 
ezcConsoleProgressbar, ezcConsoleStatusbar and ezcConsoleProgressMonitor.

Large data served in a table
----------------------------

This is the result of a table generated by ezcConsoleTable:

.. image:: img/consoletools_tutorial_example_09.png

Here is its corresponding source code:

.. include:: tutorial_example_09_table_basic.php
   :literal:

ezcConsoleTable (like ezcConsoleStatusbar and ezcConsoleProgressbar) uses the
ezcConsoleOutput class to print to the console. To create a table, you just
need to submit the maximum width of the table to its constructor:
ezcConsoleTable->__construct(). Options for table formatting are inherited
from the table itself to the table rows and from there to the table cells.
On each inheritance level, options can be overridden individually. The
"defaultBorderFormat" option sets the global format value for all borders (line
24). This is overridden in line 26 for the first row of the table.

Table rows are accessed like an array in PHP (this is achieved by
implementing the ArrayAccess_ interface from SPL_).
ezcConsoleTable implements the Iterator interface (SPL_, too) to allow
iteration over table rows using foreach. Each table row is represented by an
object of type ezcConsoleTableRow, which also implements the ArrayAccess_ and
Iterator interfaces to access cells contained in the rows in the same way. Each
of the named classes allows the access of its properties as usual, in addition
to access to its contained objects through the array interface.

ezcConsoleTableRow and ezcConsoleTableCell have a $format setting to define the
format of the contained text. All cells (as described above) will inherit the
setting of their parent ezcConsoleTableRow, as long as this has not been
explicitly overridden. The same applies to ezcConsoleTableRow->$align and
ezcConsoleTableCell->$align. Possible align values are:

- ezcConsoleTable::ALIGN_DEFAULT (inherit from parent)
- ezcConsoleTable::ALIGN_LEFT
- ezcConsoleTable::ALIGN_RIGHT
- ezcConsoleTable::ALIGN_CENTER

The content of a cell is stored in the ezcConsoleTableCell->$content property
(line 34). The usage of formatted text in a cell is possible, but not recommended. 
If you want to define the format of cell content, use the 
ezcConsoleTableCell->$format property.

.. _SPL:         http://php.net/spl
.. _ArrayAccess: http://www.php.net/~helly/php/ext/spl/interfaceArrayAccess.html

Below is a more advanced (but in a way useless) example to show the handling of
tables:

.. include:: tutorial_example_10_table_advanced.php
   :literal:

The "corner", "lineHorizontal" and "lineVertical" options define which
characters to use for the borders of the table. These options must be
exactly one character long and cannot contain formatting information. To style the
borders, use the ezcConsoleTable->$defaultBorderFormat and
ezcConsoleTableRow->$borderFormat properties. 

The random format and alignment options selected above create the following
table:

.. image:: img/consoletools_tutorial_example_10.png

More information on the handling of tables on the shell can be found in the API
documentation of ezcConsoleTable, ezcConsoleTableRow and ezcConsoleTableCell.

Interacting with the user
-------------------------

Implementations of the interface ezcConsoleDialog are generic building blocks,
which allow to interact with the user of a shell application using STDIN. A
dialog is initialized, displayed and will return a value provided by the user.
What exactly happens inside a specific dialog may vary. Commonly, the dialog
validates and possibly manipulates the provided value before returning it.

The most basic dialog is the ezcConsoleQuestionDialog, which prints out some
text and retrieves a single value back.

.. include:: tutorial_example_13_dialog_question.php
   :literal:

Every dialog expects an instance of ezcConsoleOutput which is used to display
it. The question dialog here will display the text "Do you want to proceed?"
and expects an answer from the user. The $showResults option indicates, that
the possible values the user may provide will be indicated, as well as the
default value, if one is set.

The mechanism for validating the answer is defined by an instance of
ezcConsoleQuestionDialogValidator. In the example, a collection validator is
used, which defines a collection of valid values. Beside that, it performs a
case conversion on the user provided result before validating it, if desired.

Displaying a dialog can either be done directly, by calling
ezcConsoleDialog->display(), or the more convenient way, shown in the example.
The ezcConsoleDialogViewer::displayDialog() method displays the dialog in a
loop, until the user provided a valid value, so that the program can rely on
this. In the example, the user is asked after every performed action, if he
still wants to proceed. If the answer is "n" or "N", the program stops.

An example run of this application could look like this: ::

    Some action performed...

    Do you want to proceed? (y/n) [y] y

    Some action performed...

    Do you want to proceed? (y/n) [y] 

    Some action performed...

    Do you want to proceed? (y/n) [y] n
    Goodbye!


A very similar yes/no question can be created through convenience method very
easily:

.. include:: tutorial_example_14_dialog_yesnoquestion.php
   :literal:

The created yes/no question dialog contains a custom question and defaults to
"y", if nothing is selected. In contrast to the last example, the dialog
created here also accepts "yes" and "no" as answers. Both phrases can be used
in any typing, e.g. like "yEs" or "NO". This is made possibly by the
ezcConsoleQuestionDialogMappingValidator, which extends
ezcConsoleQuestionDialogCollectionValidator. The mapping validator allows to
define an arbitrary mapping between the user typed answers and expected ones.
Therefore the dialog still only returns either "y" or "n".

The second dialog type, provided with ConsoleTools, is the
ezcConsoleMenuDialog. Similar to the ezcConsoleQuestionDialog, it displays a
list of menu items to the user and requires him to choose one of these. An
example for this class looks like this:

.. include:: tutorial_example_15_dialog_menu.php
   :literal:

Again the dialog is instantiated and some options are tweaked to get the
desired behaviour. The validator in this case receives an array of possible
menu items, while the key represents the identifier and the value contains the
text to be displayed for the item. The second argument is the default value,
chosen if the user simply presses <return>.

An example run of this program could look like this: ::

    Please choose a possibility:

      1) Perform some more actions
      2) Perform another action
      0) Quit

    Select: [0] 1
    Performing some more actions...
    Please choose a possibility:

      1) Perform some more actions
      2) Perform another action
      0) Quit

    Select: [0] 2
    Performing some other actions!
    Please choose a possibility:

      1) Perform some more actions
      2) Perform another action
      0) Quit

    Select: [0] 

The character used to divide the identifier and text, as well as the text
indicating that a selection must be done, can be tweaked, too.

Further information about dialogs can be found in the API documentation of
ezcConsoleDialog, ezcConsoleQuestionDialog and ezcConsoleMenuDialog.


..
   Local Variables:
   mode: rst
   fill-column: 79
   End: 
   vim: et syn=rst tw=79
PKk^�\g��QDdoc/pear/ConsoleTools/docs/tutorial_example_06_progressbar_basic.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$bar = new ezcConsoleProgressbar( $output, 15 );

for ( $i = 0; $i < 15; $i++ )
{
    $bar->advance();
    usleep(  mt_rand( 2000, 200000 ) );
}

$bar->finish();

$output->outputLine();

?>
PKk^�\ ��KK6doc/pear/ConsoleTools/docs/example_progressmonitor.phpnu�[���<?php
/**
 * Example for the usage of ezcConsoleProgressMonitor class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

require_once 'Base/src/base.php';

/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}

$out = new ezcConsoleOutput();

// Create a progress monitor
$status = new ezcConsoleProgressMonitor( $out, 7 );

// Perform actions
$i = 0;
while( $i++ < 7 ) 
{
    // Do whatever you want to indicate progress for
    usleep( mt_rand( 20000, 2000000 ) );
    // Advance the statusbar by one step
    $status->addEntry( 'ACTION', "Performed action #{$i}." );
}

$out->outputLine();

/*
OUTPUT:

    14.3% ACTION Performed action #1.
    28.6% ACTION Performed action #2.
    42.9% ACTION Performed action #3.
    57.1% ACTION Performed action #4.
    71.4% ACTION Performed action #5.
    85.7% ACTION Performed action #6.
   100.0% ACTION Performed action #7.

*/
?>
PKl^�\yބ�Adoc/pear/ConsoleTools/docs/tutorial_example_10_table_advanced.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$output->formats->blue->color  = 'blue';
$output->formats->blue->style = array(  'bold' );
$output->formats->red->color   = 'red';
$output->formats->red->style = array(  'bold' );
$output->formats->green->color = 'green';
$output->formats->green->style = array(  'bold' );

$colors = array( 'red', 'blue', 'green' );
$aligns = array( ezcConsoleTable::ALIGN_LEFT, ezcConsoleTable::ALIGN_CENTER, ezcConsoleTable::ALIGN_RIGHT );

$table = new ezcConsoleTable( $output, 78 );

$table->options->corner = ' ';
$table->options->lineHorizontal = ' ';
$table->options->lineVertical = ' ';
$table->options->widthType = ezcConsoleTable::WIDTH_FIXED;

for ( $i = 0; $i < 10; $i++ )
{
    for ( $j = 0; $j < 10; $j++ )
    {
        $table[$i][$j]->content = '*';
        $table[$i][$j]->format  = $colors[array_rand( $colors )];
        $table[$i][$j]->align   = $aligns[array_rand( $aligns )];
    }
}

$table->outputTable();
$output->outputLine();


?>
PKl^�\��ҡTTGdoc/pear/ConsoleTools/docs/tutorial_example_07_progressbar_advanced.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$output->formats->bar->color = 'blue';
$output->formats->bar->style = array( 'bold' );

$options = array( 
    'emptyChar'       => ' ',
    'barChar'         => '-',
    'formatString'    => '%fraction%% <' . $output->formatText( '%bar%', 'bar' ) . '> Uploaded %act% / %max% kb',
    'redrawFrequency' => 50,
);

$bar = new ezcConsoleProgressbar( $output, 1024, $options );

for ( $i = 0; $i < 1024; $i++ )
{
    $bar->advance();
    usleep(  mt_rand( 200, 2000 ) );
}

$bar->finish();

$output->outputLine();

?>
PKm^�\ױB4��>doc/pear/ConsoleTools/docs/tutorial_example_04_input_basic.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$input = new ezcConsoleInput();

$helpOption = $input->registerOption( 
    new ezcConsoleOption( 
        'h',
        'help'
    )
);

try
{
    $input->process();
}
catch ( ezcConsoleOptionException $e )
{
    die( $e->getMessage() );
}

if ( $helpOption->value !== false )
{
    echo "Help requested.";
}
else
{
    echo "No help requested.";
}

?>
PKm^�\��$��Ddoc/pear/ConsoleTools/docs/example_question_dialog_factory_yesno.phpnu�[���<?php

require_once "Base/src/base.php";

function __autoload( $className )
{
    ezcBase::autoload( $className );
}

$out = new ezcConsoleOutput();

$dialog = ezcConsoleQuestionDialog::YesNoQuestion( $out, "Is the answer to everything 42?", "y" );

if ( ( $res = ezcConsoleDialogViewer::displayDialog( $dialog ) ) === "y" )
{
    echo "You are so right! Don't forget your towel! :)\n";
}
else
{
    echo "You should better read some Douglas Adams!\n";
}



?>
PKn^�\�
��44>doc/pear/ConsoleTools/docs/tutorial_example_output_targets.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$output->formats->error->color = 'red';
$output->formats->error->style = array( 'bold' );
$output->formats->error->target = ezcConsoleOutput::TARGET_STDERR;

$output->outputLine( 'Unable to connect to database', 'error' );

?>
PKn^�\�xLN�
�
Cdoc/pear/ConsoleTools/docs/img/consoletools_tutorial_example_09.pngnu�[����PNG


IHDRU�i��bKGD�������	pHYs��tIME�	2,��N
�IDATx�흿n�8�7�W�0�.\�᮸'I��s�¥�p���=��!g��Q��-E͐?�PZ����ǿ'p��q���rS�����J"���?~�@l"Y,��?=��.:�߶7��4&�ZQ�ꉕ_���^��?M=�:j���W+v�z,���:�jl����F�[�J�K�Z�D�r�t�%����j���&���=�t.�,m���Rv�پ`�U��u�"���R{�w�h�V@j�����%��l��Z[D���_�I#�P(RQSJ�zR�KuJe�4��c�~�z�c56�����o�~M��NK���T"U"U@TU�eD���/����'c�F�
���Ly�>SN9�S�)���6�
�}�'��'��F��"��z�TUDQD`�`�ϭ�����t:���+��јŏ�~i��Kݱ�W�O��dk���z�����j�ɰ/����!~��Q휉��‰����`�3��:��p^���N����+��Ď��~���3VO�{�c���2��n��R6��6�Z��7�~��u�I�'��Cs<��%L'c�4�$��
$�c�M�����)��~��3<^���*j."*��`�x������C�L�E;���"]�N����Ds�eO�E���W���d�/	"�|~iyGس�0B�Dkpr�{j9/�{=�rw��,SZ��8!���fB�&���C�R
)�.��Hk����qd���Z�M��~���O���Qh�����/�*�#�PQ@T�'��}�a�G�����*�#׻�1��M9�SNy�<*�۰v�o����?����H�Z��P�*�
�� ����f��������G��O�/����ڥ�O�/�sy��z����ǽ��hh�Iʟ�>t���_I�����j���x��������kO�0w�#	A��cʰ/\��P:���>{���=�I��s�,o����b!�ef��okx�K�I�M��As�3O&���b���a?�L絶ǫ�!��
��߷�U�[5%z��E�;�~�H7F.��Y>��Ax�f
֢9�z4�{�HU�����z�)!��4��T���#D�8QlnLi�`K���������{FK��x�3�I��!j��iݿK�j-��S�U�hP[O.�*���c����>�|�a7طp�A�{	jU�*ݰ��L�uY�)�Xsk;�][�F$K��cP��k���a��._Y�n=^:�hY��zr��?G��*�
�� ����!�<_���'c�F�
��9U�E�SN9唧ˣ��
k�6��	~�I����H��"UDQ@TQ�CT�U|z~���ks�b��jm�-�֏�/[3r�
o�����Hv����>��7�m{b~.ѱ�qU��������\z�i���g|~6�h���sqIk%��tl��O����#&�#���H�
[|�k��[?�q���f&
�uN�/�ְ��i퓺ޞ���V�JQMo;HIZړ��4�����%��y���F��y�t��묩rM��ۂZk0K��dPr�=;��Z��M���1�z���s�y�~b]�vSռ��t�j��nM�TC#�\i1�j��f52J�����J�J�f�qM?�E�+��xѮ����[��<�=/XJ�X?�u~��[׳��d����n��[_���!g9oo_y�S3�{�<�˒G�f��{��Z��[�*��hGҦ��U��ړZ֮ٔ\o/�h&$��:wh�yG�G���G5Kd3�'֮K�^b���y��������D� F?'� �S�Q}Q�
�PQ@T�'�Gy����G�����*�#׻����RN9�S�yTT�a-�ʭ���G����?@���!R@TUDU�!ܼ��������ջ ÇlGn~���~�%�Ǧd�k���><o�����v3���TZm��;�`_Qtf�&�}�~���%�-�a6��e��z���@�;QPK}Rej>�٫��\���F�[�X��mؗ*�̶+�%���9��Pj�������6��2�skCH)�5d���`�o)ϭ	!2)���);{�+�k��ҵ͒_��n"�Z#YKl��0�a��
���S��k"��W�.��9"��ӈ�f�t�����3�+���E�=#w5�8��c�������9O�/����ר̪�&�7g��
�p��\lx��N͒@�xmy˵�=-h�����"Ϙ���ԋg����Y��y�>7S�y�L��4������
�*�7�UD�x�ʣ*k��~2�nD��\�[_*K9�SN���7�T��:�	~�I����H��"UDQ@TQ�͛��O_�������f�ϙ�_�,~�9�5�Iʟ���!�-�-��5U:��WS�Vm���7��[1u���<&1!�vp���d�i��\�4�$��)3����&�!��/��k�p�̰�ۙ+��OSOl���95�O�ǫ�3G%�5Z�?���>+]���Q��k�v�,ى3��~/�>ܡQ:o�=��D����r�&�b�e��#�`���!/Ykm�ϭ�^fM�`�H�n��Ҭo�"z_k�~�x�>b��B`���D��Ҟ:O��R_8�#Bk�����\m�]�T5!�嘽��k)��^����D�#�-�ߎ�7�.Y��T��H5�&k�I������鼹���omۈA��C�ڵv���3\���~"-3�N��h�W��|N`]ߧJ$�*��U�*�
p<Q��5��@?c7"UG�w��PN9�S�.���6���5���v#�h��@=D��*�
���
0��7��?<��>?���~8�y8�{\S��ޤ�%Z?Z�ka�'���O�_��/�ji�O��x;�-�[����mQ4�6�0�������uKw�\�mwݪ�K���r��"D*�z��h�n�?C�|n�K: ��%i�ײ�%Տ+m�'���Ģ��uIQ��`�-飚
{qnq�R8�*ϭ�h�
M�.-[���k���x�9rY@�}{m�[�s����#�{V!��,����<��Na�_�v�J�}�X�>km��ֈb���5��K�T��2�jI!�M���$/E����s�ہz�BwiT�:�ޓ�x�A]7�)���Kka�?K�n����\���*������K��Tj+�n��t���>��R��}�g��f�?�
��T�k��������� ��* ��*�D�G^�?�d�݈T�>��y)�SN9��QQ݆�|�~��?����H�Z��P�*�
��,��D�����IEND�B`�PKo^�\M0qٟ�Cdoc/pear/ConsoleTools/docs/img/consoletools_tutorial_example_07.pngnu�[����PNG


IHDR�j��[bKGD�������	pHYs��tIME��#R,IDATx�휱��0��!Xx8��{8�;�{��)(���N�b�ITR;u*�q��|�M�8O�v��c��\��ƛ��+[B�@t���9^�!�ʝS����/��|�X%�yŒ�<��r�5o���i'�Hi�c8Zg�%g���
N��q��7�`+Y��R�����C|�Fk���x�X�vo��\IG�:�ҝ#ha��qP���Ex^Qx�eU�����r�Ԧ��3�}��,�"�V�n��� �k���&o��������Βy�ӪA�}kE��B��莘M����r��Q��\��>�M�&�K�5'�D/�)	C�bN�]B�G��ٰ��It5�Fޔ-Uq�=�'LP��/՜�M����Yp[|�����ͨ��;SEp\@p=��Z̀~ls��ԗmO�5�/���#|�L��ͱ)�x���Meo�sZ�i6O�^���}i�W�>ޑm]Q��D������%��Z��a)�@p�<V�Ӛ'��Jڬ��H5b�X-o[����R��Y)�^�F�zb<�1�� �y��O� �?7`(����IEND�B`�PKo^�\���9LLCdoc/pear/ConsoleTools/docs/img/consoletools_tutorial_example_08.pngnu�[����PNG


IHDR�'1gPibKGD�������	pHYs��tIME�%
qJ��IDATx���=r�0``��I�����&E��)vgr�ʎ�ZȂ',���$(B��{����w��I:H�/�o��׷�
��/m���v?����q�e{��?������q�K�v��?�)@C�?W_���e�xc��T�d�������^b�Y:ި8G�����]?j��������m��Ok����������<�V�+��%�K�)-��ϨqEšv�{�^���ħ�8�r\�ҟ�/��ϻ��kh���C�
f� )�2H����2 )@�I��R��_�������(k�}K�̔`Ӛ} E�"D��
K=@���/�k��Ͼ�;P9)�h����*�=���G�?ʚoD��x�eX��Vg���2H���H� )~
_O��~�o6(Sq�=��v�m���R㍌����t�:)�_o)!���{���}��֚�x%a�k������v}fb�-�̘)�3sL-w�Z1���d�����^ßK�35�������K���d���J�pl�	d*
?�<�]�\�#����ϊ�Tܢ�	�ʙ�#�)��0w����d"���3�CF.�	#�V�%�[j���w&��r'���\��vz053mu�Pǡ$	ܪ��[�|���+/m'*���<����Ddzt�ز��D͹Ш��n�
S	cn;sg���E�y|�לe�V�	����f5�`���kI@R���O�,��IEND�B`�PKp^�\;�W@��Cdoc/pear/ConsoleTools/docs/img/consoletools_tutorial_example_10.pngnu�[����PNG


IHDR���VbKGD�������	pHYs��tIME�
-5q�I!IDATx���A��H`�O��&rH���A�j�:c��{�};X�^�_�G�6_��J�+V@��`�
V� X@��+V@��`�5�PW�C]|^�ݱ�vǺ�l�۪竢��ϵ_E����S��k��W�;�=�U�<���6ƿ�z�f3��^���r=���_�Zz��P-�3�m�����E��t7�H���:��c��5�X�N-�N��Ɵ�����^�?�~m�ֺ�OQ�_�X�G�t7�g���xc�2���	?�zQ��7�(���:��+�+ X@��`�
V� X�
�+ X@��`�
V� X�
�������stS��|9U�˩����d�;���X���ޟ�ꟽ�Y�?ž�ѵ�W���M��q��o���>+סg��>�3Z���3�߽/}F��һ,������X3��ܛz�]�M4[F��zf��R�`;%d��L=���^�l������(Ӎ5{F��zf��R�k�h��xc�j����n�{ߠo�Y�w�ӳm�
=�5kF��zf��R��X 3��
�+ X@��`+V� X�
�+ X@��`�
V� X'�;���X��v�����T|�x^�?��P���֟�D���}�g��)�G�6_�6��g�,>�C���x���
u�&���g��1Rf���=��{]�����wKMr��V���M��.K�.ݟ�7ť�3{�e_�Y�w�u*X�N	K��NKK����Uc��L7�h�M����o��{��b]���>ۦ��7���Op�k���=�~��xc�ҟQoQ�3{�e_�Y�w�u�7V���m@��`�
V� X�
�+V@��`�
V� X@��+l<X���������u�;���e�/���|9U�˩����D���3�|tm��f1�=��m�����>_Ɵ/\�n׻����3�|�e�(��?�[jS�6_Ɵ;TK�:�h�C�zF����u����)g�i��2�\�n/K�h��'�������W7������O9϶�'&5�|���z�7�7�(㉶?d�g�yy�7V�M7V@��`�
�� X@��+V@��`�
�� X@��+�/XϗSu������u�;�����j���[���_7�k?�\���m�^m����j�|/سm�(��P�h�_�o*\�o��$j�>��t�wY���N���n����
U�{?�\���u���D7v
qb��4��f���u3�����u�Ս�v��
��D�l��pN�=Mv��_S�X��_�o��j~s�'���o���n��`�
�+ X@��`+V��`�
�+ X@��`+V��c]�u�yn�˩:_N����j����+w�[/���x�Ǐ�m�����g�,�x�n׻D��C��|�����\�k<9���Qz�TS��	՟ߙ���o��^�ɻ'
ֱ��'��ӕ�Ϸ�%o���+Z�[/���x��Yn�϶�? �v��
����i�h�@�pc�:_��z��Ɠw=N�+l����`�
�� X@��+V��`�
�� X@��`+V�/9_N�r*>�m����.>���XW�c]|^���m�D����e�?g}>�����XC��}��?�=�U/��A�l����7�z�V���?ˎ��|�Y�һ�}��ZC��n���m~���h��^����Ϥ�:vX�5vz^�u�v��k����^��?{}�ϲ㟳>��Xo�{�n�ݣ��n�϶�u7֬�m�D����e�?g}&�����m@��`�
V� X�
�+V@��`�
V� X@��+�I�u�;����Y�C]�u�yn�˩:_N��袍?{f���;g�|tm���C϶I�ƿl�u�e�}�]��m��3{?d�߹��3rQK�4��/��wKm��wYB`��g���}~��P�:vz�t"5�e��N�����F2�P��?{f���;g����>ۦ��7>�_���=�>P#�Xo�{��f��F������w�	�+d��6 X@��`+V��`�
�+ X@��`+V� X�
�6��˩:_N�絉���c]�u�9:���k:�C]�u�y�0u}�>���z��C��}�'�h�}cx�M�z��7_ӆ�P�h�Ì�������[릲�����_���yB��n��0u}~�c��5�X�}��i;�	���������7��0u}�|c�]�}A�pc����m�oo|Ư���t7����1ō5k?L]���c�tc+V� X�
�+ X@��`+V� X�
�+ X@��`}��XW�c]|����T�/��stS�'�����������?��k��Z=#�G�6_��гm�^ġ���	����u�{�-�O����?�VϨ�yї޽�x�wY6�w�gm�Zz���?��k��Z=#W�`;=��D=v
�t⚺>ٍ���y#�?�D����sk���]!o�϶��7���.�c������=�~Ú�ƪr�D������zF��p��@f�n�+V@��`�
V� X@��+V@��`�,���(h7�$IEND�B`�PKp^�\����Cdoc/pear/ConsoleTools/docs/img/consoletools_tutorial_example_06.pngnu�[����PNG


IHDR�
u�m@bKGD�������	pHYs��tIME�

�2A�vIDATx���1r�0��p.|�äH�2E�!��h����|��;��}Z?�_�o��U�v�o~��g@�~}!�T�����+��Y��s��쵚_#�r�~�K����#l����
�Tl�1�w���1�������լ>���{v���s�8�Η6wk��f�"|T�ƞ�Kj�W���~�E�RRVM��.	�Y�]�t&���sU|��E!]�L��hH�>֘T⒝ʽv��@v���3w�ml�T�{�{�^�|[�\�ȭp�ٹ{t�ݎ�u7\:Q�@�������
�X�5��r{^.�Ao(2J�ґ�#H{�)����*��$��n��y�i����[����/IEND�B`�PKp^�\qf���.doc/pear/ConsoleTools/docs/example_table_2.phpnu�[���<?php
/**
 * Example for the usage of ezcConsoleTable class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

require_once 'Base/src/base.php';
/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}

// Initialize the console output handler
$out = new ezcConsoleOutput();

// Define format schemes for even and odd rows
$out->formats->evenRow->color = 'red';
$out->formats->evenRow->style = array( 'bold' );

$out->formats->oddRow->color = 'blue';
$out->formats->oddRow->style = array( 'bold' );

// Define format schemes for even and odd cells
$out->formats->evenCell->color = 'red';
$out->formats->evenCell->style = array( 'negative' );

$out->formats->oddCell->color = 'blue';
$out->formats->oddCell->style = array( 'negative' );

// Create a new table with a width of 60 chars
$table = new ezcConsoleTable( $out, 60 );
    
// Set global cell content align
$table->options->defaultAlign = ezcConsoleTable::ALIGN_CENTER;

for ( $i = 0; $i < 5; $i ++ )
{
    for ( $j = 0; $j < 5; $j++ )
    {
        // Fill each table cell with ##
        $table[$i][$j]->content = '##';
        if ( $i === $j )
        {
            // On diagonal line set explicit cell format for even/odd
            $table[$i][$j]->format = $j % 2 == 0 ? 'evenCell' : 'oddCell';
        }
    }
    // Set global format for even/odd rows
    $table[$i]->format = $i % 2 == 0 ? 'evenRow' : 'oddRow';
    // Set border format for even/odd rows
    $table[$i]->borderFormat = $i % 2 == 0 ? 'evenRow' : 'oddRow';
}

$table->outputTable();
echo "\n";
?>
PKq^�\�� @@>doc/pear/ConsoleTools/docs/tutorial_example_09_table_basic.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$data = array( 
    array( 'Name', 'Nationality', 'Birthday' ),
    array( 'Derick Rethans', 'Dutch', '1978-12-22' ),
    array( 'Frederik Holljen', 'Canadian / Norwegian', '1978-11-15' ),
    array( 'Jan Borsodi', 'Norwegian', '1977-10-13' ),
    array( 'Raymond Bosman', 'Dutch', '1979-07-24' ),
    array( 'Tobias Schlitt', 'German', '1980-05-19' ),
);

$output = new ezcConsoleOutput();

$output->formats->headBorder->color = 'blue';
$output->formats->normalBorder->color = 'gray';

$output->formats->headContent->color = 'blue';
$output->formats->headContent->style = array( 'bold' );

$table = new ezcConsoleTable( $output, 78 );

$table->options->defaultBorderFormat = 'normalBorder';

$table[0]->borderFormat = 'headBorder';
$table[0]->format = 'headContent';
$table[0]->align = ezcConsoleTable::ALIGN_CENTER;

foreach ( $data as $row => $cells )
{
    foreach ( $cells as $cell )
    {
        $table[$row][]->content = $cell;
    }
}

$output->outputLine( 'eZ components team:' );
$table->outputTable();
$output->outputLine();


?>
PKr^�\XT�{��Bdoc/pear/ConsoleTools/docs/tutorial_example_12_input_arguments.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$input = new ezcConsoleInput();

$helpOption = $input->registerOption( new ezcConsoleOption( 'h', 'help' ) );
$helpOption->isHelpOption = true;

$input->argumentDefinition = new ezcConsoleArguments();

$input->argumentDefinition[0] = new ezcConsoleArgument( "source" );
$input->argumentDefinition[0]->shorthelp = "The source directory.";

$input->argumentDefinition[1] = new ezcConsoleArgument( "destination" );
$input->argumentDefinition[1]->mandatory = false;
$input->argumentDefinition[1]->default   = './';

$input->argumentDefinition[2] = new ezcConsoleArgument( "iterations" );
$input->argumentDefinition[2]->type = ezcConsoleInput::TYPE_INT;
$input->argumentDefinition[2]->shorthelp = "Number of iterations.";
$input->argumentDefinition[2]->longhelp  = "The number of iterations to perform.";


try
{
    $input->process();
}
catch ( ezcConsoleException $e )
{
    die( $e->getMessage() );
}

if ( $helpOption->value === true )
{
    echo $input->getHelpText( "A simple text program" );
}
else
{
    echo "Source:      {$input->argumentDefinition["source"]->value}\n";
    echo "Destination: {$input->argumentDefinition["destination"]->value}\n";
    echo "Iterations:  " . ( $input->argumentDefinition["iterations"]->value === null
                             ? "not set"
                             : $input->argumentDefinition["iterations"]->value
                           );
}

?>
PKr^�\6㋄++Bdoc/pear/ConsoleTools/docs/tutorial_example_11_progressmonitor.phpnu�[���<?php

require_once 'tutorial_autoload.php';

$output = new ezcConsoleOutput();

$status = new ezcConsoleProgressMonitor( $output, 7 );

$i = 0;
while( $i++ < 7 ) 
{
    usleep( mt_rand( 20000, 2000000 ) );
    $status->addEntry( 'ACTION', "Performed action #{$i}." );
}

$output->outputLine();

?>
PKr^�\!�\�
�
,doc/pear/ConsoleTools/docs/example_input.phpnu�[���<?php
/**
 * Example for the usage of ezcConsoleParameter class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

require_once 'Base/src/base.php';
/**
 * Autoload ezc classes 
 * 
 * @param string $className 
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}

$optionHandler = new ezcConsoleInput();

// Register simple parameter -h/--help
$optionHandler->registerOption( new ezcConsoleOption( 'h', 'help' ) );

// Register complex parameter -f/--file
$file = new ezcConsoleOption(
 'f',
 'file',
 ezcConsoleInput::TYPE_STRING,
 null,
 false,
 'Process a file.',
 'Processes a single file.'
);
$optionHandler->registerOption( $file );

// Manipulate parameter -f/--file after registration
$file->multiple = true;

// Register another complex parameter that depends on -f and excludes -h
$dir = new ezcConsoleOption(
 'd',
 'dir',
 ezcConsoleInput::TYPE_STRING,
 null,
 true,
 'Process a directory.',
 'Processes a complete directory.',
 array( new ezcConsoleOptionRule( $optionHandler->getOption( 'f' ) ) ),
 array( new ezcConsoleOptionRule( $optionHandler->getOption( 'h' ) ) )
);
$optionHandler->registerOption( $dir );

// Register an alias for this parameter
$optionHandler->registerAlias( 'e', 'extended-dir', $dir );

// Process registered parameters and handle errors
try
{
     $optionHandler->process( array( 'example_input.php', '-h' ) );
}
catch ( ezcConsoleOptionException $e )
{
     echo $e->getMessage();
     exit( 1 );
}

// Process a single parameter
$file = $optionHandler->getOption( 'f' );
if ( $file->value === false )
{
     echo "Parameter -{$file->short}/--{$file->long} was not submitted.\n";
}
elseif ( $file->value === true )
{
     echo "Parameter -{$file->short}/--{$file->long} was submitted without value.\n";
}
else
{
     echo "Parameter -{$file->short}/--{$file->long} was submitted with value <".var_export($file->value, true).">.\n";
}

// Process all parameters at once:
foreach ( $optionHandler->getOptionValues() as $paramShort => $val )
{
     switch ( true )
     {
         case $val === false:
             echo "Parameter $paramShort was not submitted.\n";
             break;
         case $val === true:
             echo "Parameter $paramShort was submitted without a value.\n";
             break;
         case is_array( $val ):
             echo "Parameter $paramShort was submitted multiple times with value: <".implode(', ', $val).">.\n";
             break;
         default:
             echo "Parameter $paramShort was submitted with value: <$val>.\n";
             break;
     }
}
?>
PKs^�\���^,^,&doc/pear/Structures_LinkedList/LICENSEnu�[���
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
PKs^�\g�R��(doc/pear/Structures_LinkedList/CHANGELOGnu�[���0.2.1
* Apply patch from Bertrand Zuchuat to avoid inheritance strictness alerts

0.2.0
* Adhere to CS (thanks PHP_CodeSniffer!)
* Fix docblocks for Double vs. Single confusion
* One change to API in that the protected method _getTailNode() has been renamed to getTailNode() per CS

0.0.8
* Add destructors to avoid holding onto way too much memory

0.0.7
* Correct examples
* Convert to PEAR_Exception for error handling

0.0.6

0.0.5
* Create a singly linked list (Structures_LinkedList_Single)
* Refactor Structures_LinkedList_Double to extend _Single

0.0.4
* Move most globals into class constants

0.0.3
* Separate addNode method into insertNode, appendNode, prependNode
* Prevent current node from becoming invalid when adding a new node
* Type hinting and avoiding moving current pointer with addNode()

0.0.2
* Implement basic error-handling using PEAR_ErrorStack
* Adjust "link" terminology and API to "node"

0.0.1
* First attempt at a separate package for Structures_Linked_List
PKt^�\p��||?doc/pear/Structures_LinkedList/examples/double_link_example.phpnu�[���<?php

require 'Structures/LinkedList/Double.php';

/* To do anything useful with a linked list, you need to
 * extend the Node class to hold data associated with the
 * node. In this case, we're just going to hold a single
 * integer in the $_my_number property.
 */
class LinkNodeTester extends Structures_LinkedList_DoubleNode {
    protected $_my_number;
    protected $_my_letter;

    function __construct($number, $letter) {
        $this->_my_number = $number;
        $this->_my_letter = $letter;
    }

    function getNumber() {
        return $this->_my_number;
    }

    function getLetter() {
        return $this->_my_letter;
    }

    function setNumb($number) {
        $this->_my_number = $number;
    }

    function __toString() {
        return "{$this->getNumber()}";
    }
}

/* To enable key=>value iteration, we must override the default key()
 * method in Structures_LinkedList_Double to return a meaningful value */
class LinkListTester extends Structures_LinkedList_Double {
    function key() {
        return $this->current()->getLetter();
    }
}

/* Now we'll create some instances of the new class */
$node1 = new LinkNodeTester(1, 'a');
$node2 = new LinkNodeTester(2, 'b');
$node3 = new LinkNodeTester(3, 'c');
$node4 = new LinkNodeTester(4, 'd');
$node5 = new LinkNodeTester(5, 'e');

/* Start by instantiating a list object.
 * You can either pass the first node to the constructor,
 * or leave it null and add nodes later.
 */
$list = new LinkListTester($node1); // 1

/* appendNode() adds a node to the end of the list */
$list->appendNode($node2);                        // 1-2

/* prependNode() adds a node to the start of the list */
$list->prependNode($node3);                       // 3-1-2

/* insertNode($new_node, $reference_node, $before) adds a node
 * before the reference node if the third parameter is true,
 * or after the reference node if the third parameter is false
 */
$list->insertNode($node4, $node1);              // 3-1-4-2
$list->insertNode($node5, $node1, true);        // 3-5-1-4-2

/* current() returns the current pointer node in the list */
$link = $list->current();
print $link->getNumber(); // "1"

/* rewind() resets the pointer to the root node of the list */
$link = $list->rewind();
print $link->getNumber(); // "3"

// iterate through the list with do...while()
do {
    print $link->getNumber();
} while ($link = $list->next()); // "35142"

/* You can also iterate through a list with foreach() */
foreach ($list as $bull) {
  print $bull->getNumber();
} // 3-1-4-2

/* Override the key() method to enable $key=>$value iteration */
foreach ($list as $key=>$value) {
  print "$key => $value\n";
}

/* end() resets the pointer to the last node of the list */
$link = $list->end();
print $link->getNumber(); // "2"

/* You can iterate backwards through a list with previous() */
do {
    print $link->getNumber();
} while ($link = $list->previous()); // "24153"

?>
PKt^�\���
�
?doc/pear/Structures_LinkedList/examples/single_link_example.phpnu�[���<?php

require 'Structures/LinkedList/Single.php';

/* To do anything useful with a linked list, you need to
 * extend the Node class to hold data associated with the
 * node. In this case, we're just going to hold a single
 * integer in the $_my_number property.
 */
class LinkNodeTester extends Structures_LinkedList_SingleNode {
    protected $_my_number;
    protected $_my_letter;

    function __construct($num, $letter) {
        $this->_my_number = $num;
        $this->_my_letter = $letter;
    }

    function getNumber() {
        return $this->_my_number;
    }

    function getLetter() {
        return $this->_my_letter;
    }

    function setNumb($numb) {
        $this->_my_number = $numb;
    }

    function __toString() {
        return "{$this->getNumber()}";
    }
}

/* To enable key=>value iteration, we must override the default key()
 * method in Structures_LinkedList_Single to return a meaningful value */
class LinkListTester extends Structures_LinkedList_Single {
    function key() {
        return $this->current()->getLetter();
    }
}

/* Now we'll create some instances of the new class */
$node1 = new LinkNodeTester(1, 'a');
$node2 = new LinkNodeTester(2, 'b');
$node3 = new LinkNodeTester(3, 'c');
$node4 = new LinkNodeTester(4, 'd');
$node5 = new LinkNodeTester(5, 'e');

/* Start by instantiating a list object.
 * You can either pass the first node to the constructor,
 * or leave it null and add nodes later.
 */
$list = new LinkListTester($node1); // 1

/* appendNode() adds a node to the end of the list */
$list->appendNode($node2); // 1-2

/* prependNode() adds a node to the start of the list */
$list->prependNode($node3); // 3-1-2

/* insertNode($new_node, $reference_node, $before) adds a node
 * before the reference node if the third parameter is true,
 * or after the reference node if the third parameter is false
 */
$list->insertNode($node4, $node2, true); // 3-1-4-2

/* current() returns the current pointer node in the list */
$link = $list->current(); // 1

/* You can iterate through a list with the next() method */
do {
    print $link->getNumber();
} while ($link = $list->next()); // 1-4-2

/* rewind() resets the pointer to the root node of the list */
$link = $list->rewind(); // 3

/* You can also iterate through a list with foreach() */
foreach ($list as $bull) {
  print $bull->getNumber();
} // 3-1-4-2

/* Override the key() method to enable $key=>$value iteration */
foreach ($list as $key=>$value) {
  print "$key => $value\n";
}

/* end() resets the pointer to the last node of the list */
$link = $list->end(); // 2

/* You can iterate backwards through a list with previous() */
do {
    print $link->getNumber();
} while ($link = $list->previous()); // 2-4-1-3
?>
PKu^�\E���)),doc/pear/Yaml/Symfony/Component/Yaml/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKv^�\X�l��1doc/pear/Yaml/Symfony/Component/Yaml/CHANGELOG.mdnu�[���CHANGELOG
=========

2.1.0
-----

 * Yaml::parse() does not evaluate loaded files as PHP files by default
   anymore (call Yaml::enablePhpParsing() to get back the old behavior)
PKv^�\@�-��2doc/pear/Yaml/Symfony/Component/Yaml/composer.jsonnu�[���{
    "name": "symfony/yaml",
    "type": "library",
    "description": "Symfony Yaml Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Yaml\\": "" }
    },
    "target-dir": "Symfony/Component/Yaml",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PKv^�\[[.doc/pear/Yaml/Symfony/Component/Yaml/README.mdnu�[���Yaml Component
==============

YAML implements most of the YAML 1.2 specification.

    use Symfony\Component\Yaml\Yaml;

    $array = Yaml::parse($file);

    print Yaml::dump($array);

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Yaml/
    $ composer.phar install
    $ phpunit
PKw^�\E���))0doc/pear/Config/Symfony/Component/Config/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKw^�\�K�K��5doc/pear/Config/Symfony/Component/Config/CHANGELOG.mdnu�[���CHANGELOG
=========

2.2.0
-----

 * added ArrayNodeDefinition::canBeEnabled() and ArrayNodeDefinition::canBeDisabled()
   to ease configuration when some sections are respectively disabled / enabled
   by default.
 * added a `normalizeKeys()` method for array nodes (to avoid key normalization)
 * added numerical type handling for config definitions
 * added convenience methods for optional configuration sections to ArrayNodeDefinition
 * added a utils class for XML manipulations

2.1.0
-----

 * added a way to add documentation on configuration
 * implemented `Serializable` on resources
 * LoaderResolverInterface is now used instead of LoaderResolver for type
   hinting
PKx^�\˴��6doc/pear/Config/Symfony/Component/Config/composer.jsonnu�[���{
    "name": "symfony/config",
    "type": "library",
    "description": "Symfony Config Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/filesystem": "~2.3"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Config\\": "" }
    },
    "target-dir": "Symfony/Component/Config",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PKx^�\�!r��2doc/pear/Config/Symfony/Component/Config/README.mdnu�[���Config Component
================

Config provides the infrastructure for loading configurations from different
data sources and optionally monitoring these data sources for changes. There
are additional tools for validating, normalizing and handling of defaults that
can optionally be used to convert from different formats to arrays.

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Config/
    $ composer.phar install
    $ phpunit

PKx^�\E���))Bdoc/pear/OptionsResolver/Symfony/Component/OptionsResolver/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKy^�\�4�D$$Hdoc/pear/OptionsResolver/Symfony/Component/OptionsResolver/composer.jsonnu�[���{
    "name": "symfony/options-resolver",
    "type": "library",
    "description": "Symfony OptionsResolver Component",
    "keywords": ["options", "config", "configuration"],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\OptionsResolver\\": "" }
    },
    "target-dir": "Symfony/Component/OptionsResolver",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PKy^�\�$B``Ddoc/pear/OptionsResolver/Symfony/Component/OptionsResolver/README.mdnu�[���OptionsResolver Component
=========================

OptionsResolver helps at configuring objects with option arrays.

It supports default values on different levels of your class hierarchy,
option constraints (required vs. optional, allowed values) and lazy options
whose default value depends on the value of another option.

The following example demonstrates a Person class with two required options
"firstName" and "lastName" and two optional options "age" and "gender", where
the default value of "gender" is derived from the passed first name, if
possible, and may only be one of "male" and "female".

    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use Symfony\Component\OptionsResolver\Options;

    class Person
    {
        protected $options;

        public function __construct(array $options = array())
        {
            $resolver = new OptionsResolver();
            $this->setDefaultOptions($resolver);

            $this->options = $resolver->resolve($options);
        }

        protected function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setRequired(array(
                'firstName',
                'lastName',
            ));

            $resolver->setDefaults(array(
                'age' => null,
                'gender' => function (Options $options) {
                    if (self::isKnownMaleName($options['firstName'])) {
                        return 'male';
                    }

                    return 'female';
                },
            ));

            $resolver->setAllowedValues(array(
                'gender' => array('male', 'female'),
            ));
        }
    }

We can now easily instantiate a Person object:

    // 'gender' is implicitly set to 'female'
    $person = new Person(array(
        'firstName' => 'Jane',
        'lastName' => 'Doe',
    ));

We can also override the default values of the optional options:

    $person = new Person(array(
        'firstName' => 'Abdullah',
        'lastName' => 'Mogashi',
        'gender' => 'male',
        'age' => 30,
    ));

Options can be added or changed in subclasses by overriding the `setDefaultOptions`
method:

    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\OptionsResolver\Options;

    class Employee extends Person
    {
        protected function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            parent::setDefaultOptions($resolver);

            $resolver->setRequired(array(
                'birthDate',
            ));

            $resolver->setDefaults(array(
                // $previousValue contains the default value configured in the
                // parent class
                'age' => function (Options $options, $previousValue) {
                    return self::calculateAge($options['birthDate']);
                }
            ));
        }
    }



Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/OptionsResolver/
    $ composer.phar install
    $ phpunit
PKz^�\E���))4doc/pear/Security/Symfony/Component/Security/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PKz^�\���u9doc/pear/Security/Symfony/Component/Security/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * The switch user listener now preserves the query string when switching a user
 * The remember-me cookie hashes now use HMAC, which means that current cookies will be invalidated
 * added simpler customization options
 * structured component into three sub-components Acl, Core and Http
 * added Csrf sub-component
 * changed Http sub-component to depend on Csrf sub-component instead of the Form component

2.3.0
-----

 * [BC BREAK] the BCrypt encoder constructor signature has changed (the first argument was removed)
   To use the BCrypt encoder, you now need PHP 5.5 or "ircmaxell/password-compat" as a composer dependency
 * [BC BREAK] return 401 instead of 500 when using use_forward during for form authentication
 * added a `require_previous_session` option to `AbstractAuthenticationListener`

2.2.0
-----

 * `Symfony\Component\Security\Http\Firewall` and
   `Symfony\Component\Security\Http\RememberMe\ResponseListener` now
   implements EventSubscriberInterface
 * added secure random number generator
 * added PBKDF2 Password encoder
 * added BCrypt password encoder

2.1.0
-----

 * [BC BREAK] The signature of ExceptionListener has changed
 * changed the HttpUtils constructor signature to take a UrlGenerator and a UrlMatcher instead of a Router
 * EncoderFactoryInterface::getEncoder() can now also take a class name as an argument
 * allow switching to the user that is already impersonated
 * added support for the remember_me parameter in the query
 * added AccessMapInterface
 * [BC BREAK] moved user comparison logic out of UserInterface
 * made the logout path check configurable
 * after login, the user is now redirected to `default_target_path` if
   `use_referer` is true and the referrer is the `login_path`.
 * added a way to remove a token from a session
 * [BC BREAK] changed `MutableAclInterface::setParentAcl` to accept `null`,
   review your implementation to reflect this change.
 * `ObjectIdentity::fromDomainObject`, `UserSecurityIdentity::fromAccount` and
   `UserSecurityIdentity::fromToken` now return correct identities for proxies
   objects (e.g. Doctrine proxies)
 * [BC BREAK] moved the default authentication success and failure handling to
   separate classes. The order of arguments in the constructor of the
   `AbstractAuthenticationListener` has changed.
 * [BC BREAK] moved the default logout success handling to a separate class. The
   order of arguments in the constructor of `LogoutListener` has changed.
 * [BC BREAK] The constructor of `AuthenticationException` and all child
   classes now matches the constructor of `\Exception`. The extra information
   getters and setters are removed. There are now dedicated getters/setters for
   token (`AuthenticationException'), user (`AccountStatusException`) and
   username (`UsernameNotFoundException`).
PK{^�\E���))9doc/pear/Security/Symfony/Component/Security/Csrf/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK{^�\� ?���?doc/pear/Security/Symfony/Component/Security/Csrf/composer.jsonnu�[���{
    "name": "symfony/security-csrf",
    "type": "library",
    "description": "Symfony Security Component - CSRF Library",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/security-core": "~2.4"
    },
    "require-dev": {
        "symfony/http-foundation": "~2.1"
    },
    "suggest": {
        "symfony/http-foundation": "For using the class SessionTokenStorage."
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Security\\Csrf\\": "" }
    },
    "target-dir": "Symfony/Component/Security/Csrf",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK{^�\^H���;doc/pear/Security/Symfony/Component/Security/Csrf/README.mdnu�[���Security Component - CSRF
=========================

The Security CSRF (cross-site request forgery) component provides a class
`CsrfTokenManager` for generating and validating CSRF tokens.

Resources
---------

Documentation:

http://symfony.com/doc/2.4/book/security.html

Tests
-----

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Security/Csrf/
    $ composer.phar install --dev
    $ phpunit
PK|^�\E���))9doc/pear/Security/Symfony/Component/Security/Http/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK|^�\���?doc/pear/Security/Symfony/Component/Security/Http/composer.jsonnu�[���{
    "name": "symfony/security-http",
    "type": "library",
    "description": "Symfony Security Component - HTTP Integration",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/security-core": "~2.4",
        "symfony/event-dispatcher": "~2.1",
        "symfony/http-foundation": "~2.4",
        "symfony/http-kernel": "~2.4"
    },
    "require-dev": {
        "symfony/routing": "~2.2",
        "symfony/security-csrf": "~2.4",
        "psr/log": "~1.0"
    },
    "suggest": {
        "symfony/security-csrf": "For using tokens to protect authentication/logout attempts",
        "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Security\\Http\\": "" }
    },
    "target-dir": "Symfony/Component/Security/Http",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK}^�\ę�`LL;doc/pear/Security/Symfony/Component/Security/Http/README.mdnu�[���Security Component - HTTP Integration
=====================================

Security provides an infrastructure for sophisticated authorization systems,
which makes it possible to easily separate the actual authorization logic from
so called user providers that hold the users credentials. It is inspired by
the Java Spring framework.

Resources
---------

Documentation:

http://symfony.com/doc/2.4/book/security.html

Tests
-----

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Security/Http/
    $ composer.phar install --dev
    $ phpunit
PK}^�\E���))9doc/pear/Security/Symfony/Component/Security/Core/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK}^�\>�j-aa?doc/pear/Security/Symfony/Component/Security/Core/composer.jsonnu�[���{
    "name": "symfony/security-core",
    "type": "library",
    "description": "Symfony Security Component - Core Library",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "require-dev": {
        "symfony/event-dispatcher": "~2.1",
        "symfony/expression-language": "~2.4",
        "symfony/http-foundation": "~2.4",
        "symfony/validator": "~2.2",
        "psr/log": "~1.0",
        "ircmaxell/password-compat": "1.0.*"
    },
    "suggest": {
        "symfony/event-dispatcher": "",
        "symfony/http-foundation": "",
        "symfony/validator": "For using the user password constraint",
        "symfony/expression-language": "For using the expression voter",
        "ircmaxell/password-compat": "For using the BCrypt password encoder in PHP <5.5"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Security\\Core\\": "" }
    },
    "target-dir": "Symfony/Component/Security/Core",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\�J�44;doc/pear/Security/Symfony/Component/Security/Core/README.mdnu�[���Security Component - Core
=========================

Security provides an infrastructure for sophisticated authorization systems,
which makes it possible to easily separate the actual authorization logic from
so called user providers that hold the users credentials. It is inspired by
the Java Spring framework.

Resources
---------

Documentation:

http://symfony.com/doc/2.4/book/security.html

Tests
-----

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Security/Core/
    $ composer.phar install --dev
    $ phpunit
PK�^�\E���))8doc/pear/Security/Symfony/Component/Security/Acl/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�^�\/����>doc/pear/Security/Symfony/Component/Security/Acl/composer.jsonnu�[���{
    "name": "symfony/security-acl",
    "type": "library",
    "description": "Symfony Security Component - ACL (Access Control List)",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/security-core": "~2.4"
    },
    "require-dev": {
        "doctrine/common": "~2.2",
        "doctrine/dbal": "~2.2",
        "psr/log": "~1.0"
    },
    "suggest": {
        "symfony/class-loader": "For using the ACL generateSql script",
        "symfony/finder": "For using the ACL generateSql script",
        "doctrine/dbal": "For using the built-in ACL implementation"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Security\\Acl\\": "" }
    },
    "target-dir": "Symfony/Component/Security/Acl",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\�~щ]]:doc/pear/Security/Symfony/Component/Security/Acl/README.mdnu�[���Security Component - ACL (Access Control List)
==============================================

Security provides an infrastructure for sophisticated authorization systems,
which makes it possible to easily separate the actual authorization logic from
so called user providers that hold the users credentials. It is inspired by
the Java Spring framework.

Resources
---------

Documentation:

http://symfony.com/doc/2.4/book/security.html

Tests
-----

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Security/Acl/
    $ composer.phar install --dev
    $ phpunit
PK�^�\��"��:doc/pear/Security/Symfony/Component/Security/composer.jsonnu�[���{
    "name": "symfony/security",
    "type": "library",
    "description": "Symfony Security Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/event-dispatcher": "~2.1",
        "symfony/http-foundation": "~2.1",
        "symfony/http-kernel": "~2.4"
    },
    "replace": {
        "symfony/security-acl": "self.version",
        "symfony/security-core": "self.version",
        "symfony/security-csrf": "self.version",
        "symfony/security-http": "self.version"
    },
    "require-dev": {
        "symfony/routing": "~2.2",
        "symfony/validator": "~2.2",
        "doctrine/common": "~2.2",
        "doctrine/dbal": "~2.2",
        "psr/log": "~1.0",
        "ircmaxell/password-compat": "1.0.*",
        "symfony/expression-language": "~2.4"
    },
    "suggest": {
        "symfony/class-loader": "For using the ACL generateSql script",
        "symfony/finder": "For using the ACL generateSql script",
        "symfony/validator": "For using the user password constraint",
        "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs",
        "doctrine/dbal": "For using the built-in ACL implementation",
        "symfony/expression-language": "For using the expression voter",
        "ircmaxell/password-compat": "For using the BCrypt password encoder in PHP <5.5"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Security\\": "" }
    },
    "target-dir": "Symfony/Component/Security",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\��6doc/pear/Security/Symfony/Component/Security/README.mdnu�[���Security Component
==================

Security provides an infrastructure for sophisticated authorization systems,
which makes it possible to easily separate the actual authorization logic from
so called user providers that hold the users credentials. It is inspired by
the Java Spring framework.

Resources
---------

Documentation:

http://symfony.com/doc/2.4/book/security.html

Tests
-----

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Security/
    $ composer.phar install
    $ phpunit
PK�^�\����((doc/pear/Net_SMTP/LICENSEnu�[���Copyright 2002-2017 Jon Parise and Chuck Hagenbuch.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution..

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK�^�\TkU�$doc/pear/Net_SMTP/examples/basic.phpnu�[���<?php

require 'Net/SMTP.php';

$host = 'mail.example.com';
$from = 'user@example.com';
$rcpt = array('recipient1@example.com', 'recipient2@example.com');
$subj = "Subject: Test Message\n";
$body = "Body Line 1\nBody Line 2";

/* Create a new Net_SMTP object. */
if (! ($smtp = new Net_SMTP($host))) {
    die("Unable to instantiate Net_SMTP object\n");
}

/* Connect to the SMTP server. */
if (PEAR::isError($e = $smtp->connect())) {
    die($e->getMessage() . "\n");
}
$smtp->auth('username','password');
/* Send the 'MAIL FROM:' SMTP command. */
if (PEAR::isError($smtp->mailFrom($from))) {
    die("Unable to set sender to <$from>\n");
}

/* Address the message to each of the recipients. */
foreach ($rcpt as $to) {
    if (PEAR::isError($res = $smtp->rcptTo($to))) {
        die("Unable to add recipient <$to>: " . $res->getMessage() . "\n");
    }
}

/* Set the body of the message. */
if (PEAR::isError($smtp->data($subj . "\r\n" . $body))) {
    die("Unable to send data\n");
}

/* Disconnect from the SMTP server. */
$smtp->disconnect();
PK�^�\�SOܪ%�%doc/pear/Net_SMTP/README.rstnu�[���======================
 The Net_SMTP Package
======================

--------------------
 User Documentation
--------------------

:Author:    Jon Parise
:Contact:   jon@php.net

.. contents:: Table of Contents
.. section-numbering::

Dependencies
============

The ``PEAR_Error`` Class
------------------------

The Net_SMTP package uses the `PEAR_Error`_ class for all of its `error
handling`_.

The ``Net_Socket`` Package
--------------------------

The Net_Socket_ package is used as the basis for all network communications.
Connection options can be specified via the `$socket_options` construction
parameter::

    $socket_options = array('ssl' => array('verify_peer_name' => false));
    $smtp = new Net_SMTP($host, null, null, false, 0, $socket_options);

**Note:** PHP 5.6 introduced `OpenSSL changes`_. Peer certificate verification
is now enabled by default. Although not recommended, `$socket_options` can be
used to disable peer verification (as shown above).

.. _OpenSSL changes: https://php.net/manual/en/migration56.openssl.php

The ``Auth_SASL`` Package
-------------------------

The `Auth_SASL`_ package is an optional dependency.  If it is available, the
Net_SMTP package will be able to support the DIGEST-MD5_ and CRAM-MD5_ SMTP
authentication methods.  Otherwise, only the LOGIN_ and PLAIN_ methods will
be available.

Error Handling
==============

All of the Net_SMTP class's public methods return a PEAR_Error_ object if an
error occurs.  The standard way to check for a PEAR_Error object is by using
`PEAR::isError()`_::

    if (PEAR::isError($error = $smtp->connect())) {
        die($error->getMessage());
    }

.. _PEAR::isError(): https://pear.php.net/manual/en/core.pear.pear.iserror.php

SMTP Authentication
===================

The Net_SMTP package supports the SMTP authentication standard (as defined
by RFC-2554_).  The Net_SMTP package supports the following authentication
methods, in order of preference:

.. _RFC-2554: https://www.ietf.org/rfc/rfc2554.txt

GSSAPI
------

The GSSAPI authentication method uses Kerberos 5 protocol (RFC-4120_).
Does not use user/password.
Requires Service Principal ``gssapi_principal`` parameter and
has an optional Credentials Cache ``gssapi_cname`` parameter.
Requires DNS and Key Distribution Center (KDC) setup.
It is considered the most secure method of SMTP authentication.

**Note:** The GSSAPI authentication method is only supported
if the krb5_ php extension is available.

.. _RFC-4120: https://tools.ietf.org/html/rfc4120
.. _krb5: https://pecl.php.net/package/krb5

DIGEST-MD5
----------

The DIGEST-MD5 authentication method uses `RSA Data Security Inc.`_'s MD5
Message Digest algorithm.  It is considered a more secure method of SMTP
authentication than PLAIN or LOGIN, while still vulnerable to MitM attacks
without TLS/SSL.

**Note:** The DIGEST-MD5 authentication method is only supported if the
AUTH_SASL_ package is available.

.. _RSA Data Security Inc.: https://www.rsasecurity.com/

CRAM-MD5
--------

The CRAM-MD5 authentication method has been superseded by the DIGEST-MD5_
method in terms of security.  It is provided here for compatibility with
older SMTP servers that may not support the newer DIGEST-MD5 algorithm.

**Note:** The CRAM-MD5 authentication method is only supported if the
AUTH_SASL_ package is available.

LOGIN
-----

The LOGIN authentication method encrypts the user's password using the
Base64_ encoding scheme.  Because decrypting a Base64-encoded string is
trivial, LOGIN is not considered a secure authentication method and should
be avoided.

.. _Base64: https://www.php.net/manual/en/function.base64-encode.php

PLAIN
-----

The PLAIN authentication method sends the user's password in plain text.
This method of authentication is not secure and should be avoided.

XOAUTH2
-------

The XOAUTH2 authentication method sends a username and an OAuth2 access token
as per `Gmail's SASL XOAUTH2 documentation`__.

.. __: https://developers.google.com/gmail/imap/xoauth2-protocol#smtp_protocol_exchange

Secure Connections
==================

If `secure socket transports`_ have been enabled in PHP, it is possible to
establish a secure connection to the remote SMTP server::

    $smtp = new Net_SMTP('ssl://mail.example.com', 465);

This example connects to ``mail.example.com`` on port 465 (a common SMTPS
port) using the ``ssl://`` transport.

TLS/SSL is enabled for authenticated connections by default (via the ``auth()``
method's ``$tls`` parameter), but the |STARTTLS|_ command can also be sent
manually using the ``starttls()`` method.

.. _secure socket transports: https://www.php.net/transports
.. |STARTTLS| replace:: ``STARTTLS``
.. _STARTTLS: https://tools.ietf.org/html/rfc3207

Sending Data
============

Message data is sent using the ``data()`` method.  The data can be supplied
as a single string or as an open file resource.

If a string is provided, it is passed through the `data quoting`_ system and
sent to the socket connection as a single block.  These operations are all
memory-based, so sending large messages may result in high memory usage.

If an open file resource is provided, the ``data()`` method will read the
message data from the file line-by-line.  Each chunk will be quoted and sent
to the socket connection individually, reducing the overall memory overhead of
this data sending operation.

Header data can be specified separately from message body data by passing it
as the optional second parameter to ``data()``.  This is especially useful
when an open file resource is being used to supply message data because it
allows header fields (like *Subject:*) to be built dynamically at runtime.

::

    $smtp->data($fp, "Subject: My Subject");

Data Quoting
============

By default, all outbound string data is quoted in accordance with SMTP
standards.  This means that all native Unix (``\n``) and Mac (``\r``) line
endings are converted to Internet-standard CRLF (``\r\n``) line endings.
Also, because the SMTP protocol uses a single leading period (``.``) to signal
an end to the message data, single leading periods in the original data
string are "doubled" (e.g. "``..``").

These string transformation can be expensive when large blocks of data are
involved.  For example, the Net_SMTP package is not aware of MIME parts (it
just sees the MIME message as one big string of characters), so it is not
able to skip non-text attachments when searching for characters that may
need to be quoted.

Because of this, it is possible to extend the Net_SMTP class in order to
implement your own custom quoting routine.  Just create a new class based on
the Net_SMTP class and reimplement the ``quotedata()`` method::

    require 'Net_SMTP.php';

    class Net_SMTP_custom extends Net_SMTP
    {
        function quotedata($data)
        {
            /* Perform custom data quoting */
        }
    }

Note that the ``$data`` parameter will be passed to the ``quotedata()``
function `by reference`_.  This means that you can operate directly on
``$data``.  It also the overhead of copying a large ``$data`` string to and
from the ``quotedata()`` method.

.. _by reference: https://www.php.net/manual/en/language.references.pass.php

Server Responses
================

The Net_SMTP package retains the server's last response for further
inspection.  The ``getResponse()`` method returns a 2-tuple (two element
array) containing the server's response code as an integer and the response's
arguments as a string.

Upon a successful connection, the server's greeting string is available via
the ``getGreeting()`` method.

Debugging
=========

The Net_SMTP package contains built-in debugging output routines (disabled by
default).  Debugging output must be explicitly enabled via the ``setDebug()``
method::

    $smtp->setDebug(true);

The debugging messages will be sent to the standard output stream by default.
If you need more control over the output, you can optionally install your own
debug handler.

::

    function debugHandler($smtp, $message)
    {
        echo "[$smtp->host] $message\n";
    }

    $smtp->setDebug(true, "debugHandler");


Examples
========

Basic Use
---------

The following script demonstrates how a simple email message can be sent
using the Net_SMTP package::

    require 'Net/SMTP.php';

    $host = 'mail.example.com';
    $from = 'user@example.com';
    $rcpt = array('recipient1@example.com', 'recipient2@example.com');
    $subj = "Subject: Test Message\n";
    $body = "Body Line 1\nBody Line 2";

    /* Create a new Net_SMTP object. */
    if (! ($smtp = new Net_SMTP($host))) {
        die("Unable to instantiate Net_SMTP object\n");
    }

    /* Connect to the SMTP server. */
    if (PEAR::isError($e = $smtp->connect())) {
        die($e->getMessage() . "\n");
    }

    /* Send the 'MAIL FROM:' SMTP command. */
    if (PEAR::isError($smtp->mailFrom($from))) {
        die("Unable to set sender to <$from>\n");
    }

    /* Address the message to each of the recipients. */
    foreach ($rcpt as $to) {
        if (PEAR::isError($res = $smtp->rcptTo($to))) {
            die("Unable to add recipient <$to>: " . $res->getMessage() . "\n");
        }
    }

    /* Set the body of the message. */
    if (PEAR::isError($smtp->data($subj . "\r\n" . $body))) {
        die("Unable to send data\n");
    }

    /* Disconnect from the SMTP server. */
    $smtp->disconnect();

.. _PEAR_Error: https://pear.php.net/manual/en/core.pear.pear-error.php
.. _Net_Socket: https://pear.php.net/package/Net_Socket
.. _Auth_SASL: https://pear.php.net/package/Auth_SASL

.. vim: tabstop=4 shiftwidth=4 softtabstop=4 expandtab textwidth=78 ft=rst:
PK�^�\E���))2doc/pear/Console/Symfony/Component/Console/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�^�\)q���7doc/pear/Console/Symfony/Component/Console/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * added a way to force terminal dimensions
 * added a convenient method to detect verbosity level
 * [BC BREAK] made descriptors use output instead of returning a string

2.3.0
-----

 * added multiselect support to the select dialog helper
 * added Table Helper for tabular data rendering
 * added support for events in `Application`
 * added a way to normalize EOLs in `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()`
 * added a way to set the progress bar progress via the `setCurrent` method
 * added support for multiple InputOption shortcuts, written as `'-a|-b|-c'`
 * added two additional verbosity levels, VERBOSITY_VERY_VERBOSE and VERBOSITY_DEBUG

2.2.0
-----

 * added support for colorization on Windows via ConEmu
 * add a method to Dialog Helper to ask for a question and hide the response
 * added support for interactive selections in console (DialogHelper::select())
 * added support for autocompletion as you type in Dialog Helper

2.1.0
-----

 * added ConsoleOutputInterface
 * added the possibility to disable a command (Command::isEnabled())
 * added suggestions when a command does not exist
 * added a --raw option to the list command
 * added support for STDERR in the console output class (errors are now sent
   to STDERR)
 * made the defaults (helper set, commands, input definition) in Application
   more easily customizable
 * added support for the shell even if readline is not available
 * added support for process isolation in Symfony shell via
   `--process-isolation` switch
 * added support for `--`, which disables options parsing after that point
   (tokens will be parsed as arguments)
PK�^�\Q&xee8doc/pear/Console/Symfony/Component/Console/composer.jsonnu�[���{
    "name": "symfony/console",
    "type": "library",
    "description": "Symfony Console Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "require-dev": {
        "symfony/event-dispatcher": "~2.1"
    },
    "suggest": {
        "symfony/event-dispatcher": ""
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Console\\": "" }
    },
    "target-dir": "Symfony/Component/Console",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\���4doc/pear/Console/Symfony/Component/Console/README.mdnu�[���Console Component
=================

Console eases the creation of beautiful and testable command line interfaces.

The Application object manages the CLI application:

    use Symfony\Component\Console\Application;

    $console = new Application();
    $console->run();

The ``run()`` method parses the arguments and options passed on the command
line and executes the right command.

Registering a new command can easily be done via the ``register()`` method,
which returns a ``Command`` instance:

    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputOption;
    use Symfony\Component\Console\Output\OutputInterface;

    $console
        ->register('ls')
        ->setDefinition(array(
            new InputArgument('dir', InputArgument::REQUIRED, 'Directory name'),
        ))
        ->setDescription('Displays the files in the given directory')
        ->setCode(function (InputInterface $input, OutputInterface $output) {
            $dir = $input->getArgument('dir');

            $output->writeln(sprintf('Dir listing for <info>%s</info>', $dir));
        })
    ;

You can also register new commands via classes.

The component provides a lot of features like output coloring, input and
output abstractions (so that you can easily unit-test your commands),
validation, automatic help messages, ...

Tests
-----

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Console/
    $ composer.phar install
    $ phpunit

Third Party
-----------

`Resources/bin/hiddeninput.exe` is a third party binary provided within this
component. Find sources and license at https://github.com/Seldaek/hidden-input.

Resources
---------

[The Console Component](http://symfony.com/doc/current/components/console.html)

[How to create a Console Command](http://symfony.com/doc/current/cookbook/console/console_command.html)
PK�^�\E���))@doc/pear/HttpFoundation/Symfony/Component/HttpFoundation/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�^�\'�88��Edoc/pear/HttpFoundation/Symfony/Component/HttpFoundation/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * added RequestStack
 * added Request::getEncodings()
 * added accessors methods to session handlers

2.3.0
-----

 * added support for ranges of IPs in trusted proxies
 * `UploadedFile::isValid` now returns false if the file was not uploaded via HTTP (in a non-test mode)
 * Improved error-handling of `\Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler`
   to ensure the supplied PDO handler throws Exceptions on error (as the class expects). Added related test cases
   to verify that Exceptions are properly thrown when the PDO queries fail.

2.2.0
-----

 * fixed the Request::create() precedence (URI information always take precedence now)
 * added Request::getTrustedProxies()
 * deprecated Request::isProxyTrusted()
 * [BC BREAK] JsonResponse does not turn a top level empty array to an object anymore, use an ArrayObject to enforce objects
 * added a IpUtils class to check if an IP belongs to a CIDR
 * added Request::getRealMethod() to get the "real" HTTP method (getMethod() returns the "intended" HTTP method)
 * disabled _method request parameter support by default (call Request::enableHttpMethodParameterOverride() to
   enable it, and Request::getHttpMethodParameterOverride() to check if it is supported)
 * Request::splitHttpAcceptHeader() method is deprecated and will be removed in 2.3
 * Deprecated Flashbag::count() and \Countable interface, will be removed in 2.3

2.1.0
-----

 * added Request::getSchemeAndHttpHost() and Request::getUserInfo()
 * added a fluent interface to the Response class
 * added Request::isProxyTrusted()
 * added JsonResponse
 * added a getTargetUrl method to RedirectResponse
 * added support for streamed responses
 * made Response::prepare() method the place to enforce HTTP specification
 * [BC BREAK] moved management of the locale from the Session class to the Request class
 * added a generic access to the PHP built-in filter mechanism: ParameterBag::filter()
 * made FileBinaryMimeTypeGuesser command configurable
 * added Request::getUser() and Request::getPassword()
 * added support for the PATCH method in Request
 * removed the ContentTypeMimeTypeGuesser class as it is deprecated and never used on PHP 5.3
 * added ResponseHeaderBag::makeDisposition() (implements RFC 6266)
 * made mimetype to extension conversion configurable
 * [BC BREAK] Moved all session related classes and interfaces into own namespace, as
   `Symfony\Component\HttpFoundation\Session` and renamed classes accordingly.
   Session handlers are located in the subnamespace `Symfony\Component\HttpFoundation\Session\Handler`.
 * SessionHandlers must implement `\SessionHandlerInterface` or extend from the
   `Symfony\Component\HttpFoundation\Storage\Handler\NativeSessionHandler` base class.
 * Added internal storage driver proxy mechanism for forward compatibility with
   PHP 5.4 `\SessionHandler` class.
 * Added session handlers for custom Memcache, Memcached and Null session save handlers.
 * [BC BREAK] Removed `NativeSessionStorage` and replaced with `NativeFileSessionHandler`.
 * [BC BREAK] `SessionStorageInterface` methods removed: `write()`, `read()` and
   `remove()`.  Added `getBag()`, `registerBag()`.  The `NativeSessionStorage` class
   is a mediator for the session storage internals including the session handlers
   which do the real work of participating in the internal PHP session workflow.
 * [BC BREAK] Introduced mock implementations of `SessionStorage` to enable unit
   and functional testing without starting real PHP sessions.  Removed
   `ArraySessionStorage`, and replaced with `MockArraySessionStorage` for unit
   tests; removed `FilesystemSessionStorage`, and replaced with`MockFileSessionStorage`
   for functional tests.  These do not interact with global session ini
   configuration values, session functions or `$_SESSION` superglobal. This means
   they can be configured directly allowing multiple instances to work without
   conflicting in the same PHP process.
 * [BC BREAK] Removed the `close()` method from the `Session` class, as this is
   now redundant.
 * Deprecated the following methods from the Session class: `setFlash()`, `setFlashes()`
   `getFlash()`, `hasFlash()`, and `removeFlash()`. Use `getFlashBag()` instead
   which returns a `FlashBagInterface`.
 * `Session->clear()` now only clears session attributes as before it cleared
   flash messages and attributes. `Session->getFlashBag()->all()` clears flashes now.
 * Session data is now managed by `SessionBagInterface` to better encapsulate
   session data.
 * Refactored session attribute and flash messages system to their own
  `SessionBagInterface` implementations.
 * Added `FlashBag`. Flashes expire when retrieved by `get()` or `all()`. This
   implementation is ESI compatible.
 * Added `AutoExpireFlashBag` (default) to replicate Symfony 2.0.x auto expire
   behaviour of messages auto expiring after one page page load.  Messages must
   be retrieved by `get()` or `all()`.
 * Added `Symfony\Component\HttpFoundation\Attribute\AttributeBag` to replicate
   attributes storage behaviour from 2.0.x (default).
 * Added `Symfony\Component\HttpFoundation\Attribute\NamespacedAttributeBag` for
   namespace session attributes.
 * Flash API can stores messages in an array so there may be multiple messages
   per flash type.  The old `Session` class API remains without BC break as it
   will allow single messages as before.
 * Added basic session meta-data to the session to record session create time,
   last updated time, and the lifetime of the session cookie that was provided
   to the client.
 * Request::getClientIp() method doesn't take a parameter anymore but bases
   itself on the trustProxy parameter.
 * Added isMethod() to Request object.
 * [BC BREAK] The methods `getPathInfo()`, `getBaseUrl()` and `getBasePath()` of
   a `Request` now all return a raw value (vs a urldecoded value before). Any call
   to one of these methods must be checked and wrapped in a `rawurldecode()` if
   needed.
PK�^�\��'���Fdoc/pear/HttpFoundation/Symfony/Component/HttpFoundation/composer.jsonnu�[���{
    "name": "symfony/http-foundation",
    "type": "library",
    "description": "Symfony HttpFoundation Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "require-dev": {
        "symfony/expression-language": "~2.4"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\HttpFoundation\\": "" },
        "classmap": [ "Symfony/Component/HttpFoundation/Resources/stubs" ]
    },
    "target-dir": "Symfony/Component/HttpFoundation",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\��i���Bdoc/pear/HttpFoundation/Symfony/Component/HttpFoundation/README.mdnu�[���HttpFoundation Component
========================

HttpFoundation defines an object-oriented layer for the HTTP specification.

It provides an abstraction for requests, responses, uploaded files, cookies,
sessions, ...

In this example, we get a Request object from the current PHP global
variables:

    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;

    $request = Request::createFromGlobals();
    echo $request->getPathInfo();

You can also create a Request directly -- that's interesting for unit testing:

    $request = Request::create('/?foo=bar', 'GET');
    echo $request->getPathInfo();

And here is how to create and send a Response:

    $response = new Response('Not Found', 404, array('Content-Type' => 'text/plain'));
    $response->send();

The Request and the Response classes have many other methods that implement
the HTTP specification.

Loading
-------

If you are not using Composer but are using PHP 5.3.x, you must add the following to your autoloader:

    // SessionHandlerInterface
    if (!interface_exists('SessionHandlerInterface')) {
        $loader->registerPrefixFallback(__DIR__.'/../vendor/symfony/src/Symfony/Component/HttpFoundation/Resources/stubs');
    }

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/HttpFoundation/
    $ composer.phar install
    $ phpunit
PK�^�\E���)):doc/pear/CssSelector/Symfony/Component/CssSelector/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�^�\�d**?doc/pear/CssSelector/Symfony/Component/CssSelector/CHANGELOG.mdnu�[���CHANGELOG
=========

2.1.0
-----

 * none
PK�^�\��t;jj@doc/pear/CssSelector/Symfony/Component/CssSelector/composer.jsonnu�[���{
    "name": "symfony/css-selector",
    "type": "library",
    "description": "Symfony CssSelector Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Jean-François Simon",
            "email": "jeanfrancois.simon@sensiolabs.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\CssSelector\\": "" }
    },
    "target-dir": "Symfony/Component/CssSelector",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\f☘��<doc/pear/CssSelector/Symfony/Component/CssSelector/README.mdnu�[���CssSelector Component
=====================

CssSelector converts CSS selectors to XPath expressions.

The component only goal is to convert CSS selectors to their XPath
equivalents:

    use Symfony\Component\CssSelector\CssSelector;

    print CssSelector::toXPath('div.item > h4 > a');

HTML and XML are different
--------------------------

The `CssSelector` component comes with an `HTML` extension which is enabled by
default. If you need to use this component with `XML` documents, you have to
disable this `HTML` extension. That's because, `HTML` tag & attribute names
are always lower-cased, but case-sensitive in `XML`:

    // disable `HTML` extension:
    CssSelector::disableHtmlExtension();

    // re-enable `HTML` extension:
    CssSelector::enableHtmlExtension();

When the `HTML` extension is enabled, tag names are lower-cased, attribute
names are lower-cased, the following extra pseudo-classes are supported:
`checked`, `link`, `disabled`, `enabled`, `selected`, `invalid`, `hover`,
`visited`, and the `lang()` function is also added.

Resources
---------

This component is a port of the Python lxml library, which is copyright Infrae
and distributed under the BSD license.

Current code is a port of https://github.com/SimonSapin/cssselect@v0.7.1

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/CssSelector/
    $ composer.phar install
    $ phpunit
PK�^�\�u����doc/pear/PEAR/LICENSEnu�[���Copyright (c) 1997-2009,
 Stig Bakken <ssb@php.net>,
 Gregory Beaver <cellog@php.net>,
 Helgi Þormar Þorbjörnsson <helgi@php.net>,
 Tomas V.V.Cox <cox@idecnet.com>,
 Martin Jansen <mj@php.net>.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
PK�^�\�E���doc/pear/PEAR/README.rstnu�[���*************************
PEAR - The PEAR Installer
*************************
.. image:: https://travis-ci.org/pear/pear-core.svg?branch=stable
    :target: https://travis-ci.org/pear/pear-core

=========================================
What is the PEAR Installer? What is PEAR?
=========================================
PEAR is the PHP Extension and Application Repository, found at
http://pear.php.net.

The **PEAR Installer** is this software, which contains executable
files and PHP code that is used to **download and install** PEAR code
from pear.php.net.

PEAR contains useful **software libraries and applications** such as
MDB2 (database abstraction), HTML_QuickForm (HTML forms management),
PhpDocumentor (auto-documentation generator), DB_DataObject
(Data Access Abstraction), and many hundreds more.
Browse all available packages at http://pear.php.net, the list is
constantly growing and updating to reflect improvements in the PHP language.

.. warning::
  Do not run PEAR without installing it - if you downloaded this
  tarball manually, you MUST install it.  Read the instructions in INSTALL
  prior to use.


=============
Documentation
=============
Documentation for PEAR can be found at http://pear.php.net/manual/.
Installation documentation can be found in the INSTALL file included
in this tarball.


=====
Tests
=====
Run the tests without installation as follows::

  $ ./scripts/pear.sh run-tests -r tests

You should have the ``Text_Diff`` package installed to get nicer error output.

To run the tests with another PHP version, modify ``php_bin`` and set the
``PHP_PEAR_PHP_BIN`` environment variable::

  $ pear config-set php_bin /usr/local/bin/php7
  $ PHP_PEAR_PHP_BIN=/usr/local/bin/php7 ./scripts/pear.sh run-tests -r tests

Happy PHPing, we hope PEAR will be a great tool for your development work!


Test dependencies
=================
* ``zlib``


=========
Releasing
=========
Create a PEAR package, as well as phars for pear-less installation,
simply run ``build-release.sh``).

``go-pear.phar`` contains the PEAR installer installer that asks where to install it.
It is available from http://pear.php.net/go-pear.phar.

``install-pear-nozlib.phar`` installs PEAR automatically without asking anything.
It is shipped with PHP itself.
PK�^�\���xxdoc/pear/PEAR/INSTALLnu�[���PEAR - The PEAR Installer
=========================
Installing the PEAR Installer.

You should install PEAR on a local development machine first.  Installing
PEAR on a remote production machine should only be done after you are
familiar with PEAR and have tested code using PEAR on your development
machine.

There are two methods of installing PEAR
 - PEAR bundled in PHP
 - go-pear

We will first examine how to install PEAR that is bundled with PHP.

Microsoft Windows
=================
If you are running PHP 5.2.0 or newer, simply download and
run the windows installer (.msi) and PEAR can be automatically
installed.

Otherwise, for older PHP versions, download the .zip of windows,
there is a script included with your PHP distribution that is called
"go-pear".  You must open a command box in order to run it.  Click
"start" then click "Run..." and type "cmd.exe" to open a command box.
Use "cd" to change directory to the location of PHP where you unzipped it,
and run the go-pear command.

Unix
====
When compiling PHP from source, you simply need to include the
--with-pear directive on the "./configure" command.  This is "on"
by default in most PHP versions, but it doesn't hurt to list it
explicitly.  You should also consider enabling the zlib extension via
--enable-zlib, so that the PEAR installer will be able to handle gzipped
files (i.e. smaller package files for faster downloads).  Later, when you
run "make install" to install PHP itself, part of the process will be
prompts that ask you where you want PEAR to be installed.

go-pear
=======
For users who cannot perform the above steps, or who wish to obtain the
latest PEAR with a slightly higher risk of failure, use go-pear.  go-pear
is obtained by downloading http://pear.php.net/go-pear and saving it as go-pear.php.
After downloading, simply run "php go-pear.php" or open it in a web browser
(windows only) to download and install PEAR.

You can always ask general installation questions on pear-general@lists.php.net,
a public mailing list devoted to support for PEAR packages and installation-
related issues.

Happy PHPing, we hope PEAR will be a great tool for your development work!
PK�^�\DG�e��!doc/pear/Structures_Graph/LICENSEnu�[���		   GNU LESSER GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.


  This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.

  0. Additional Definitions.

  As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.

  "The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.

  An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.

  A "Combined Work" is a work produced by combining or linking an
Application with the Library.  The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".

  The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.

  The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.

  1. Exception to Section 3 of the GNU GPL.

  You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.

  2. Conveying Modified Versions.

  If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:

   a) under this License, provided that you make a good faith effort to
   ensure that, in the event an Application does not supply the
   function or data, the facility still operates, and performs
   whatever part of its purpose remains meaningful, or

   b) under the GNU GPL, with none of the additional permissions of
   this License applicable to that copy.

  3. Object Code Incorporating Material from Library Header Files.

  The object code form of an Application may incorporate material from
a header file that is part of the Library.  You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:

   a) Give prominent notice with each copy of the object code that the
   Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the object code with a copy of the GNU GPL and this license
   document.

  4. Combined Works.

  You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:

   a) Give prominent notice with each copy of the Combined Work that
   the Library is used in it and that the Library and its use are
   covered by this License.

   b) Accompany the Combined Work with a copy of the GNU GPL and this license
   document.

   c) For a Combined Work that displays copyright notices during
   execution, include the copyright notice for the Library among
   these notices, as well as a reference directing the user to the
   copies of the GNU GPL and this license document.

   d) Do one of the following:

       0) Convey the Minimal Corresponding Source under the terms of this
       License, and the Corresponding Application Code in a form
       suitable for, and under terms that permit, the user to
       recombine or relink the Application with a modified version of
       the Linked Version to produce a modified Combined Work, in the
       manner specified by section 6 of the GNU GPL for conveying
       Corresponding Source.

       1) Use a suitable shared library mechanism for linking with the
       Library.  A suitable mechanism is one that (a) uses at run time
       a copy of the Library already present on the user's computer
       system, and (b) will operate properly with a modified version
       of the Library that is interface-compatible with the Linked
       Version.

   e) Provide Installation Information, but only if you would otherwise
   be required to provide such information under section 6 of the
   GNU GPL, and only to the extent that such information is
   necessary to install and execute a modified version of the
   Combined Work produced by recombining or relinking the
   Application with a modified version of the Linked Version. (If
   you use option 4d0, the Installation Information must accompany
   the Minimal Corresponding Source and Corresponding Application
   Code. If you use option 4d1, you must provide the Installation
   Information in the manner specified by section 6 of the GNU GPL
   for conveying Corresponding Source.)

  5. Combined Libraries.

  You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:

   a) Accompany the combined library with a copy of the same work based
   on the Library, uncombined with any other library facilities,
   conveyed under the terms of this License.

   b) Give prominent notice with the combined library that part of it
   is a work based on the Library, and explaining where to find the
   accompanying uncombined form of the same work.

  6. Revised Versions of the GNU Lesser General Public License.

  The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser 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
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.

  If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
PK�^�\x� ���Ndoc/pear/Structures_Graph/docs/tutorials/Structures_Graph/Structures_Graph.pkgnu�[���<refentry id="{@id package.database.structures_graph.tutorial}">
 <refnamediv>
  <refname><classname>Structures_Graph</classname> Tutorial</refname>
  <refpurpose>A first tour of graph datastructure manipulation</refpurpose>
 </refnamediv>
 <refsect1 id="{@id package.database.structures_graph.tutorial.intro}">
  <title>Introduction</title>
  <para>
  Structures_Graph is a package for creating and manipulating graph datastructures. A graph is a set of objects, called nodes, connected by arcs. When used as a datastructure, usually nodes contain data, and arcs represent relationships between nodes. When arcs have a direction, and can be travelled only one way, graphs are said to be directed. When arcs have no direction, and can always be travelled both ways, graphs are said to be non directed.
  </para>
  <para>
  Structures_Graph provides an object oriented API to create and directly query a graph, as well as a set of Manipulator classes to extract information from the graph.
  </para>
 </refsect1>
 <refsect1 id="{@id package.database.structures_graph.tutorial.creation}">
  <title>Creating a Graph</title>
  <para>
   Creating a graph is done using the simple constructor:
   <programlisting>
    <![CDATA[
require_once 'Structures/Graph.php';

$directedGraph =& new Structures_Graph(true);
$nonDirectedGraph =& new Structures_Graph(false);
    ]]>
   </programlisting>
   and passing the constructor a flag telling it whether the graph should be directed. A directed graph will always be directed during its lifetime. It's a permanent characteristic.
  </para>
  <para>
  To fill out the graph, we'll need to create some nodes, and then call Graph::addNode.
   <programlisting>
    <![CDATA[
require_once 'Structures/Graph/Node.php';

$nodeOne =& new Structures_Graph_Node();
$nodeTwo =& new Structures_Graph_Node();
$nodeThree =& new Structures_Graph_Node();

$directedGraph->addNode(&$nodeOne);
$directedGraph->addNode(&$nodeTwo);
$directedGraph->addNode(&$nodeThree);
    ]]>
   </programlisting>
   and then setup the arcs:
   <programlisting>
    <![CDATA[
$nodeOne->connectTo($nodeTwo);
$nodeOne->connectTo($nodeThree);
    ]]>
   </programlisting>
   Note that arcs can only be created after the nodes have been inserted into the graph. 
  </para>
 </refsect1>
 <refsect1 id="{@id package.database.structures_graph.tutorial.nodesanddata}">
  <title>Associating Data</title>
  <para>
  Graphs are only useful as datastructures if they can hold data. Structure_Graph stores data in nodes. Each node contains a setter and a getter for its data.
   <programlisting>
    <![CDATA[
$nodeOne->setData("Node One's Data is a String");
$nodeTwo->setData(1976);
$nodeThree->setData('Some other string');

print("NodeTwo's Data is an integer: " . $nodeTwo->getData());
    ]]>
   </programlisting>
  </para>
  <para>
  Structure_Graph nodes can also store metadata, alongside with the main data. Metadata differs from regular data just because it is stored under a key, making it possible to store more than one data reference per node. The metadata getter and setter need the key to perform the operation:
   <programlisting>
    <![CDATA[
$nodeOne->setMetadata('example key', "Node One's Sample Metadata");
print("Metadata stored under key 'example key' in node one: " . $nodeOne->getMetadata('example key'));
$nodeOne->unsetMetadata('example key');
    ]]>
   </programlisting>
  </para>
 </refsect1>
 <refsect1 id="{@id package.database.structures_graph.tutorial.querying}">
  <title>Querying a Graph</title>
  <para>
  Structures_Graph provides for basic querying of the graph:
   <programlisting>
    <![CDATA[
// Nodes are able to calculate their indegree and outdegree
print("NodeOne's inDegree: " . $nodeOne->inDegree());
print("NodeOne's outDegree: " . $nodeOne->outDegree());

// and naturally, nodes can report on their arcs
$arcs = $nodeOne->getNeighbours();
for ($i=0;$i<sizeof($arcs);$i++) {
    print("NodeOne has an arc to " . $arcs[$i]->getData());
}
    ]]>
   </programlisting>
  </para>
 </refsect1>
</refentry>
PK�^�\E���))8doc/pear/Serializer/Symfony/Component/Serializer/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�^�\�U΂�=doc/pear/Serializer/Symfony/Component/Serializer/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * added `$context` support for XMLEncoder.

2.3.0
-----

 * added `GetSetMethodNormalizer::setCamelizedAttributes` to allow calling
   camel cased methods for underscored properties

2.2.0
-----

 * [BC BREAK] All Serializer, Normalizer and Encoder interfaces have been
   modified to include an optional `$context` array parameter.
 * The XML Root name can now be configured with the `xml_root_name`
   parameter in the context option to the `XmlEncoder`.
 * Options to `json_encode` and `json_decode` can be passed through
   the context options of `JsonEncode` and `JsonDecode` encoder/decoders.

2.1.0
-----

 * added DecoderInterface::supportsDecoding(),
   EncoderInterface::supportsEncoding()
 * removed NormalizableInterface::denormalize(),
   NormalizerInterface::denormalize(),
   NormalizerInterface::supportsDenormalization()
 * removed normalize() denormalize() encode() decode() supportsSerialization()
   supportsDeserialization() supportsEncoding() supportsDecoding()
   getEncoder() from SerializerInterface
 * Serializer now implements NormalizerInterface, DenormalizerInterface,
   EncoderInterface, DecoderInterface in addition to SerializerInterface
 * added DenormalizableInterface and DenormalizerInterface
 * [BC BREAK] changed `GetSetMethodNormalizer`'s key names from all lowercased
   to camelCased (e.g. `mypropertyvalue` to `myPropertyValue`)
 * [BC BREAK] convert the `item` XML tag to an array

    ``` xml
    <?xml version="1.0"?>
    <response>
        <item><title><![CDATA[title1]]></title></item><item><title><![CDATA[title2]]></title></item>
    </response>
    ```

    Before:

        Array()

    After:

        Array(
            [item] => Array(
                [0] => Array(
                    [title] => title1
                )
                [1] => Array(
                    [title] => title2
                )
            )
        )
PK�^�\�����>doc/pear/Serializer/Symfony/Component/Serializer/composer.jsonnu�[���{
    "name": "symfony/serializer",
    "type": "library",
    "description": "Symfony Serializer Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Serializer\\": "" }
    },
    "target-dir": "Symfony/Component/Serializer",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\�����:doc/pear/Serializer/Symfony/Component/Serializer/README.mdnu�[���Serializer Component
====================

With the Serializer component its possible to handle serializing data structures,
including object graphs, into array structures or other formats like XML and JSON.
It can also handle deserializing XML and JSON back to object graphs.

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Serializer/
    $ composer.phar install
    $ phpunit
PK�^�\E���))/doc/pear/TwigBridge/Symfony/Bridge/Twig/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�^�\[b�14doc/pear/TwigBridge/Symfony/Bridge/Twig/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * added stopwatch tag to time templates with the WebProfilerBundle

2.3.0
-----

 * added helpers form(), form_start() and form_end()
 * deprecated form_enctype() in favor of form_start()

2.2.0
-----

 * added a `controller` function to help generating controller references
 * added a `render_esi` and a `render_hinclude` function
 * [BC BREAK] restricted the `render` tag to only accept URIs or ControllerReference instances (the signature changed)
 * added a `render` function to render a request
 * The `app` global variable is now injected even when using the twig service directly.
 * Added an optional parameter to the `path` and `url` function which allows to generate
   relative paths (e.g. "../parent-file") and scheme-relative URLs (e.g. "//example.com/dir/file").

2.1.0
-----

 * added global variables access in a form theme
 * added TwigEngine
 * added TwigExtractor
 * added a csrf_token function
 * added a way to specify a default domain for a Twig template (via the
   'trans_default_domain' tag)
PK�^�\���V��5doc/pear/TwigBridge/Symfony/Bridge/Twig/composer.jsonnu�[���{
    "name": "symfony/twig-bridge",
    "type": "symfony-bridge",
    "description": "Symfony Twig Bridge",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/security-csrf": "~2.4",
        "twig/twig": "~1.12"
    },
    "require-dev": {
        "symfony/form": "~2.2",
        "symfony/http-kernel": "~2.2",
        "symfony/routing": "~2.2",
        "symfony/templating": "~2.1",
        "symfony/translation": "~2.2",
        "symfony/yaml": "~2.0",
        "symfony/security": "~2.4",
        "symfony/stopwatch": "~2.2",
        "symfony/expression-language": "~2.4"
    },
    "suggest": {
        "symfony/form": "For using the FormExtension",
        "symfony/http-kernel": "For using the HttpKernelExtension",
        "symfony/routing": "For using the RoutingExtension",
        "symfony/templating": "For using the TwigEngine",
        "symfony/translation": "For using the TranslationExtension",
        "symfony/yaml": "For using the YamlExtension",
        "symfony/security": "For using the SecurityExtension",
        "symfony/stopwatch": "For using the StopwatchExtension",
        "symfony/expression-language": "For using the ExpressionExtension"
    },
    "autoload": {
        "psr-0": { "Symfony\\Bridge\\Twig\\": "" }
    },
    "target-dir": "Symfony/Bridge/Twig",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\�b�331doc/pear/TwigBridge/Symfony/Bridge/Twig/README.mdnu�[���Twig Bridge
===========

Provides integration for [Twig](http://twig.sensiolabs.org/) with various
Symfony2 components.

Resources
---------

If you want to run the unit tests, install dev dependencies before
running PHPUnit:

    $ cd path/to/Symfony/Bridge/Twig/
    $ composer.phar install
    $ phpunit
PK�^�\E���))0doc/pear/Finder/Symfony/Component/Finder/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�^�\@"S��5doc/pear/Finder/Symfony/Component/Finder/CHANGELOG.mdnu�[���CHANGELOG
=========

2.3.0
-----

 * added a way to ignore unreadable directories (via Finder::ignoreUnreadableDirs())
 * unified the way subfolders that are not executable are handled by always throwing an AccessDeniedException exception

2.2.0
-----

 * added Finder::path() and Finder::notPath() methods
 * added finder adapters to improve performance on specific platforms
 * added support for wildcard characters (glob patterns) in the paths passed
   to Finder::in()

2.1.0
-----

 * added Finder::sortByAccessedTime(), Finder::sortByChangedTime(), and
   Finder::sortByModifiedTime()
 * added Countable to Finder
 * added support for an array of directories as an argument to
   Finder::exclude()
 * added searching based on the file content via Finder::contains() and
   Finder::notContains()
 * added support for the != operator in the Comparator
 * [BC BREAK] filter expressions (used for file name and content) are no more
   considered as regexps but glob patterns when they are enclosed in '*' or '?'
PK�^�\�V:���6doc/pear/Finder/Symfony/Component/Finder/composer.jsonnu�[���{
    "name": "symfony/finder",
    "type": "library",
    "description": "Symfony Finder Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Finder\\": "" }
    },
    "target-dir": "Symfony/Component/Finder",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\c�9@��2doc/pear/Finder/Symfony/Component/Finder/README.mdnu�[���Finder Component
================

Finder finds files and directories via an intuitive fluent interface.

    use Symfony\Component\Finder\Finder;

    $finder = new Finder();

    $iterator = $finder
      ->files()
      ->name('*.php')
      ->depth(0)
      ->size('>= 1K')
      ->in(__DIR__);

    foreach ($iterator as $file) {
        print $file->getRealpath()."\n";
    }

But you can also use it to find files stored remotely like in this example where
we are looking for files on Amazon S3:

    $s3 = new \Zend_Service_Amazon_S3($key, $secret);
    $s3->registerStreamWrapper("s3");

    $finder = new Finder();
    $finder->name('photos*')->size('< 100K')->date('since 1 hour ago');
    foreach ($finder->in('s3://bucket-name') as $file) {
        print $file->getFilename()."\n";
    }

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Finder/
    $ composer.phar install
    $ phpunit

PK�^�\�r¦J�J)doc/pear/Archive_Tar/docs/Archive_Tar.txtnu�[���Documentation for class Archive_Tar
===================================
Last update : 2001-08-15



Overview :
----------

  The Archive_Tar class helps in creating and managing GNU TAR format
  files compressed by GNU ZIP or not. 
  The class offers basic functions like creating an archive, adding
  files in the archive, extracting files from the archive and listing
  the archive content. 
  It also provide advanced functions that allow the adding and
  extraction of files with path manipulation. 


Sample :
--------

  // ----- Creating the object (uncompressed archive)
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->setErrorHandling(PEAR_ERROR_PRINT);

  // ----- Creating the archive
  $v_list[0]="file.txt";
  $v_list[1]="data/";
  $v_list[2]="file.log";
  $tar_object->create($v_list);

  // ----- Adding files
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/";
  $v_list[2]="log/file.log";
  $tar_object->add($v_list);

  // ----- Adding more files
  $tar_object->add("release/newfile.log release/readme.txt");

  // ----- Listing the content
  if (($v_list  =  $tar_object->listContent()) != 0)
    for ($i=0; $i<sizeof($v_list); $i++)
    {
      echo "Filename :'".$v_list[$i][filename]."'<br>";
      echo " .size :'".$v_list[$i][size]."'<br>";
      echo " .mtime :'".$v_list[$i][mtime]."' (".date("l dS of F Y h:i:s A", $v_list[$i][mtime]).")<br>";
      echo " .mode :'".$v_list[$i][mode]."'<br>";
      echo " .uid :'".$v_list[$i][uid]."'<br>";
      echo " .gid :'".$v_list[$i][gid]."'<br>";
      echo " .typeflag :'".$v_list[$i][typeflag]."'<br>";
    }

  // ----- Extracting the archive in directory "install"
  $tar_object->extract("install");


Public arguments :
------------------

None


Public Methods :
----------------

Method : Archive_Tar($p_tarname, $compress = null)
Description :
  Archive_Tar Class constructor. This flavour of the constructor only
  declare a new Archive_Tar object, identifying it by the name of the
  tar file.
  If the compress argument is set the tar will be read or created as a
  gzip or bz2 compressed TAR file. 
Arguments :
  $p_tarname : A valid filename for the tar archive file.
  $p_compress : can be null, 'gz' or 'bz2'. For
                compatibility reason it can also be true. This
                parameter indicates if gzip or bz2 compression
                is required. 
Return value :
  The Archive_Tar object.
Sample :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object_compressed = new Archive_Tar("tarname.tgz", true);
How it works :
  Initialize the object.

Method : create($p_filelist)
Description :
  This method creates the archive file and add the files / directories
  that are listed in $p_filelist. 
  If the file already exists and is writable, it is replaced by the
  new tar. It is a create and not an add. If the file exists and is
  read-only or is a directory it is not replaced. The method return
  false and a PEAR error text. 
  The $p_filelist parameter can be an array of string, each string
  representing a filename or a directory name with their path if
  needed. It can also be a single string with names separated by a
  single blank. 
  See also createModify() method for more details.
Arguments :
  $p_filelist : An array of filenames and directory names, or a single
  string with names separated by a single blank space. 
Return value :
  true on success, false on error.
Sample 1 :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->setErrorHandling(PEAR_ERROR_PRINT);  // Optional error handling
  $v_list[0]="file.txt";
  $v_list[1]="data/"; (Optional '/' at the end)
  $v_list[2]="file.log";
  $tar_object->create($v_list);
Sample 2 :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->setErrorHandling(PEAR_ERROR_PRINT);  // Optional error handling
  $tar_object->create("file.txt data/ file.log");
How it works :
  Just calling the createModify() method with the right parameters.

Method : createModify($p_filelist, $p_add_dir, $p_remove_dir = "")
Description :
  This method creates the archive file and add the files / directories
  that are listed in $p_filelist. 
  If the file already exists and is writable, it is replaced by the
  new tar. It is a create and not an add. If the file exists and is
  read-only or is a directory it is not replaced. The method return
  false and a PEAR error text. 
  The $p_filelist parameter can be an array of string, each string
  representing a filename or a directory name with their path if
  needed. It can also be a single string with names separated by a
  single blank. 
  The path indicated in $p_remove_dir will be removed from the
  memorized path of each file / directory listed when this path
  exists. By default nothing is removed (empty path "") 
  The path indicated in $p_add_dir will be added at the beginning of
  the memorized path of each file / directory listed. However it can
  be set to empty "". The adding of a path is done after the removing
  of path. 
  The path add/remove ability enables the user to prepare an archive
  for extraction in a different path than the origin files are. 
  See also addModify() method for file adding properties.
Arguments :
  $p_filelist : An array of filenames and directory names, or a single
                string with names separated by a single blank space.
  $p_add_dir : A string which contains a path to be added to the
               memorized path of each element in the list. 
  $p_remove_dir : A string which contains a path to be removed from
                  the memorized path of each element in the list, when
		  relevant.
Return value :
  true on success, false on error.
Sample 1 :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->setErrorHandling(PEAR_ERROR_PRINT);  // Optional error handling
  $v_list[0]="file.txt";
  $v_list[1]="data/"; (Optional '/' at the end)
  $v_list[2]="file.log";
  $tar_object->createModify($v_list, "install");
  // files are stored in the archive as :
  //   install/file.txt
  //   install/data
  //   install/data/file1.txt
  //   install/data/... all the files and sub-dirs of data/
  //   install/file.log
Sample 2 :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->setErrorHandling(PEAR_ERROR_PRINT);  // Optional error handling
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/"; (Optional '/' at the end)
  $v_list[2]="log/file.log";
  $tar_object->createModify($v_list, "install", "dev");
  // files are stored in the archive as :
  //   install/file.txt
  //   install/data
  //   install/data/file1.txt
  //   install/data/... all the files and sub-dirs of data/
  //   install/log/file.log
How it works :
  Open the file in write mode (erasing the existing one if one),
  call the _addList() method for adding the files in an empty archive,
  add the tar footer (512 bytes block), close the tar file.


Method : addModify($p_filelist, $p_add_dir, $p_remove_dir="")
Description :
  This method add the files / directories listed in $p_filelist at the
  end of the existing archive. If the archive does not yet exists it
  is created.
  The $p_filelist parameter can be an array of string, each string
  representing a filename or a directory name with their path if
  needed. It can also be a single string with names separated by a
  single blank. 
  The path indicated in $p_remove_dir will be removed from the
  memorized path of each file / directory listed when this path
  exists. By default nothing is removed (empty path "") 
  The path indicated in $p_add_dir will be added at the beginning of
  the memorized path of each file / directory listed. However it can
  be set to empty "". The adding of a path is done after the removing
  of path. 
  The path add/remove ability enables the user to prepare an archive
  for extraction in a different path than the origin files are. 
  If a file/dir is already in the archive it will only be added at the
  end of the archive. There is no update of the existing archived
  file/dir. However while extracting the archive, the last file will
  replace the first one. This results in a none optimization of the
  archive size. 
  If a file/dir does not exist the file/dir is ignored. However an
  error text is send to PEAR error. 
  If a file/dir is not readable the file/dir is ignored. However an
  error text is send to PEAR error. 
  If the resulting filename/dirname (after the add/remove option or
  not) string is greater than 99 char, the file/dir is
  ignored. However an error text is send to PEAR error. 
Arguments :
  $p_filelist : An array of filenames and directory names, or a single
                string with names separated by a single blank space. 
  $p_add_dir : A string which contains a path to be added to the
               memorized path of each element in the list. 
  $p_remove_dir : A string which contains a path to be removed from
                  the memorized path of each element in the list, when
		  relevant.
Return value :
  true on success, false on error.
Sample 1 :
  $tar_object = new Archive_Tar("tarname.tar");
  [...]
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/"; (Optional '/' at the end)
  $v_list[2]="log/file.log";
  $tar_object->addModify($v_list, "install");
  // files are stored in the archive as :
  //   install/file.txt
  //   install/data
  //   install/data/file1.txt
  //   install/data/... all the files and sub-dirs of data/
  //   install/file.log
Sample 2 :
  $tar_object = new Archive_Tar("tarname.tar");
  [...]
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/"; (Optional '/' at the end)
  $v_list[2]="log/file.log";
  $tar_object->addModify($v_list, "install", "dev");
  // files are stored in the archive as :
  //   install/file.txt
  //   install/data
  //   install/data/file1.txt
  //   install/data/... all the files and sub-dirs of data/
  //   install/log/file.log
How it works :
  If the archive does not exists it create it and add the files.
  If the archive does exists and is not compressed, it open it, jump
  before the last empty 512 bytes block (tar footer) and add the files
  at this point.
  If the archive does exists and is compressed, a temporary copy file
  is created. This temporary file is then 'gzip' read block by block
  until the last empty block. The new files are then added in the
  compressed file.
  The adding of files is done by going through the file/dir list,
  adding files per files, in a recursive way through the
  directory. Each time a path need to be added/removed it is done
  before writing the file header in the archive.

Method : add($p_filelist)
Description :
  This method add the files / directories listed in $p_filelist at the
  end of the existing archive. If the archive does not yet exists it
  is created. 
  The $p_filelist parameter can be an array of string, each string
  representing a filename or a directory name with their path if
  needed. It can also be a single string with names separated by a
  single blank. 
  See addModify() method for details and limitations.
Arguments :
  $p_filelist : An array of filenames and directory names, or a single
  string with names separated by a single blank space. 
Return value :
  true on success, false on error.
Sample 1 :
  $tar_object = new Archive_Tar("tarname.tar");
  [...]
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/"; (Optional '/' at the end)
  $v_list[2]="log/file.log";
  $tar_object->add($v_list);
Sample 2 :
  $tar_object = new Archive_Tar("tarname.tgz", true);
  [...]
  $v_list[0]="dev/file.txt";
  $v_list[1]="dev/data/"; (Optional '/' at the end)
  $v_list[2]="log/file.log";
  $tar_object->add($v_list);
How it works :
  Simply call the addModify() method with the right parameters.

Method : addString($p_filename, $p_string, $p_datetime, $p_params)
Description :
  This method add a single string as a file at the
  end of the existing archive. If the archive does not yet exists it
  is created.
Arguments :
  $p_filename : A string which contains the full filename path
                that will be associated with the string.
  $p_string :   The content of the file added in the archive.
  $p_datetime : (Optional) Timestamp of the file (default = now)
  $p_params :   (Optional) Various file metadata:
                    stamp - As above, timestamp of the file
                    mode - UNIX-style permissions (default 0600)
                    type - Is this a regular file or link (see TAR
                           format spec for how to create a hard/symlink)
                    uid - UNIX-style user ID (default 0 = root)
                    gid - UNIX-style group ID (default 0 = root)
Return value :
  true on success, false on error.
Sample 1 :
  $v_archive = & new Archive_Tar($p_filename);
  $v_archive->setErrorHandling(PEAR_ERROR_PRINT);
  $v_result = $v_archive->addString('data/test.txt', 'This is the text of the string');
  $v_result = $v_archive->addString(
                  'data/test.sh',
                  "#!/bin/sh\necho 'Hello'",
                  time(),
                  array( "mode" => 0755, "uid" => 34 )
              );


Method : extract($p_path = "")
Description :
  This method extract all the content of the archive in the directory
  indicated by $p_path.If $p_path is optional, if not set the archive
  is extracted in the current directory. 
  While extracting a file, if the directory path does not exists it is
  created. 
  See extractModify() for details and limitations.
Arguments :
  $p_path : Optional path where the files/dir need to by extracted.
Return value :
  true on success, false on error.
Sample :
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->extract();
How it works :
  Simply call the extractModify() method with appropriate parameters.

Method : extractModify($p_path, $p_remove_path)
Description :
  This method extract all the content of the archive in the directory
  indicated by $p_path. When relevant the memorized path of the
  files/dir can be modified by removing the $p_remove_path path at the
  beginning of the file/dir path. 
  While extracting a file, if the directory path does not exists it is
  created. 
  While extracting a file, if the file already exists it is replaced
  without looking for last modification date. 
  While extracting a file, if the file already exists and is write
  protected, the extraction is aborted. 
  While extracting a file, if a directory with the same name already
  exists, the extraction is aborted. 
  While extracting a directory, if a file with the same name already
  exists, the extraction is aborted. 
  While extracting a file/directory if the destination directory exist
  and is write protected, or does not exist but can not be created,
  the extraction is aborted. 
  If after extraction an extracted file does not show the correct
  stored file size, the extraction is aborted. 
  When the extraction is aborted, a PEAR error text is set and false
  is returned. However the result can be a partial extraction that may
  need to be manually cleaned. 
Arguments :
  $p_path : The path of the directory where the files/dir need to by
            extracted. 
  $p_remove_path : Part of the memorized path that can be removed if
                   present at the beginning of the file/dir path. 
Return value :
  true on success, false on error.
Sample :
  // Imagine tarname.tar with files :
  //   dev/data/file.txt
  //   dev/data/log.txt
  //   readme.txt
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->extractModify("install", "dev");
  // Files will be extracted there :
  //   install/data/file.txt
  //   install/data/log.txt
  //   install/readme.txt
How it works :
  Open the archive and call a more generic function that can extract
  only a part of the archive or all the archive. 
  See extractList() method for more details.

Method : extractInString($p_filename)
Description :
  This method extract from the archive one file identified by $p_filename.
  The return value is a string with the file content, or NULL on error. 
Arguments :
  $p_filename : The path of the file to extract in a string. 
Return value :
  a string with the file content or NULL.
Sample :
  // Imagine tarname.tar with files :
  //   dev/data/file.txt
  //   dev/data/log.txt
  //   dev/readme.txt
  $v_archive = & new Archive_Tar('tarname.tar');
  $v_archive->setErrorHandling(PEAR_ERROR_PRINT);
  $v_string = $v_archive->extractInString('dev/readme.txt');
  echo $v_string;

Method : listContent()
Description :
  This method returns an array of arrays that describe each
  file/directory present in the archive. 
  The array is not sorted, so it show the position of the file in the
  archive. 
  The file informations are :
    $file[filename] : Name and path of the file/dir.
    $file[mode] : File permissions (result of fileperms())
    $file[uid] : user id
    $file[gid] : group id
    $file[size] : filesize
    $file[mtime] : Last modification time (result of filemtime())
    $file[typeflag] : "" for file, "5" for directory
Arguments :
Return value :
  An array of arrays or 0 on error.
Sample :
  $tar_object = new Archive_Tar("tarname.tar");
  if (($v_list  =  $tar_object->listContent()) != 0)
    for ($i=0; $i<sizeof($v_list); $i++)
    {
      echo "Filename :'".$v_list[$i][filename]."'<br>";
      echo " .size :'".$v_list[$i][size]."'<br>";
      echo " .mtime :'".$v_list[$i][mtime]."' (".
           date("l dS of F Y h:i:s A", $v_list[$i][mtime]).")<br>";
      echo " .mode :'".$v_list[$i][mode]."'<br>";
      echo " .uid :'".$v_list[$i][uid]."'<br>";
      echo " .gid :'".$v_list[$i][gid]."'<br>";
      echo " .typeflag :'".$v_list[$i][typeflag]."'<br>";
    }
How it works :
  Call the same function as an extract however with a flag to only go
  through the archive without extracting the files. 

Method : extractList($p_filelist, $p_path = "", $p_remove_path = "")
Description :
  This method extract from the archive only the files indicated in the
  $p_filelist. These files are extracted in the current directory or
  in the directory indicated by the optional $p_path parameter. 
  If indicated the $p_remove_path can be used in the same way as it is
  used in extractModify() method. 
Arguments :
  $p_filelist : An array of filenames and directory names, or a single
                string with names separated by a single blank space. 
  $p_path : The path of the directory where the files/dir need to by
            extracted. 
  $p_remove_path : Part of the memorized path that can be removed if
                   present at the beginning of the file/dir path. 
Return value :
  true on success, false on error.
Sample :
  // Imagine tarname.tar with files :
  //   dev/data/file.txt
  //   dev/data/log.txt
  //   readme.txt
  $tar_object = new Archive_Tar("tarname.tar");
  $tar_object->extractList("dev/data/file.txt readme.txt", "install",
                           "dev");
  // Files will be extracted there :
  //   install/data/file.txt
  //   install/readme.txt
How it works :
  Go through the archive and extract only the files present in the
  list. 

PK�^�\E���))8doc/pear/Filesystem/Symfony/Component/Filesystem/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�^�\ʂ�ss=doc/pear/Filesystem/Symfony/Component/Filesystem/CHANGELOG.mdnu�[���CHANGELOG
=========

2.3.12
------

 * deprecated dumpFile() file mode argument.

2.3.0
-----

 * added the dumpFile() method to atomically write files
 
2.2.0
-----

 * added a delete option for the mirror() method

2.1.0
-----

 * 24eb396 : BC Break : mkdir() function now throws exception in case of failure instead of returning Boolean value
 * created the component
PK�^�\�9	���>doc/pear/Filesystem/Symfony/Component/Filesystem/composer.jsonnu�[���{
    "name": "symfony/filesystem",
    "type": "library",
    "description": "Symfony Filesystem Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Filesystem\\": "" }
    },
    "target-dir": "Symfony/Component/Filesystem",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\ȌJ�:doc/pear/Filesystem/Symfony/Component/Filesystem/README.mdnu�[���Filesystem Component
====================

Filesystem provides basic utility to manipulate the file system:

```php
<?php

use Symfony\Component\Filesystem\Filesystem;

$filesystem = new Filesystem();

$filesystem->copy($originFile, $targetFile, $override = false);

$filesystem->mkdir($dirs, $mode = 0777);

$filesystem->touch($files, $time = null, $atime = null);

$filesystem->remove($files);

$filesystem->chmod($files, $mode, $umask = 0000, $recursive = false);

$filesystem->chown($files, $user, $recursive = false);

$filesystem->chgrp($files, $group, $recursive = false);

$filesystem->rename($origin, $target);

$filesystem->symlink($originDir, $targetDir, $copyOnWindows = false);

$filesystem->makePathRelative($endPath, $startPath);

$filesystem->mirror($originDir, $targetDir, \Traversable $iterator = null, $options = array());

$filesystem->isAbsolutePath($file);
```

Resources
---------

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Filesystem/
    $ composer.phar install
    $ phpunit
PK�^�\E���))6doc/pear/Validator/Symfony/Component/Validator/LICENSEnu�[���Copyright (c) 2004-2014 Fabien Potencier

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
PK�^�\��ާ��;doc/pear/Validator/Symfony/Component/Validator/CHANGELOG.mdnu�[���CHANGELOG
=========

2.4.0
-----

 * added a constraint the uses the expression language
 * added `minRatio`, `maxRatio`, `allowSquare`, `allowLandscape`, and `allowPortrait` to Image validator

2.3.0
-----

 * added the ISBN, ISSN, and IBAN validators
 * copied the constraints `Optional` and `Required` to the
   `Symfony\Component\Validator\Constraints\` namespace and deprecated the original
   classes.
 * added comparison validators (EqualTo, NotEqualTo, LessThan, LessThanOrEqualTo, GreaterThan, GreaterThanOrEqualTo, IdenticalTo, NotIdenticalTo)

2.2.0
-----

 * added a CardScheme validator
 * added a Luhn validator
 * moved @api-tags from `Validator` to `ValidatorInterface`
 * moved @api-tags from `ConstraintViolation` to the new `ConstraintViolationInterface`
 * moved @api-tags from `ConstraintViolationList` to the new `ConstraintViolationListInterface`
 * moved @api-tags from `ExecutionContext` to the new `ExecutionContextInterface`
 * [BC BREAK] `ConstraintValidatorInterface::initialize` is now type hinted against `ExecutionContextInterface` instead of `ExecutionContext`
 * [BC BREAK] changed the visibility of the properties in `Validator` from protected to private
 * deprecated `ClassMetadataFactoryInterface` in favor of the new `MetadataFactoryInterface`
 * deprecated `ClassMetadataFactory::getClassMetadata` in favor of `getMetadataFor`
 * created `MetadataInterface`, `PropertyMetadataInterface`, `ClassBasedInterface` and `PropertyMetadataContainerInterface`
 * deprecated `GraphWalker` in favor of the new `ValidationVisitorInterface`
 * deprecated `ExecutionContext::addViolationAtPath`
 * deprecated `ExecutionContext::addViolationAtSubPath` in favor of `ExecutionContextInterface::addViolationAt`
 * deprecated `ExecutionContext::getCurrentClass` in favor of `ExecutionContextInterface::getClassName`
 * deprecated `ExecutionContext::getCurrentProperty` in favor of `ExecutionContextInterface::getPropertyName`
 * deprecated `ExecutionContext::getCurrentValue` in favor of `ExecutionContextInterface::getValue`
 * deprecated `ExecutionContext::getGraphWalker` in favor of `ExecutionContextInterface::validate` and `ExecutionContextInterface::validateValue`
 * improved `ValidatorInterface::validateValue` to accept arrays of constraints
 * changed `ValidatorInterface::getMetadataFactory` to return a `MetadataFactoryInterface` instead of a `ClassMetadataFactoryInterface`
 * removed `ClassMetadataFactoryInterface` type hint from `ValidatorBuilderInterface::setMetadataFactory`.
   As of Symfony 2.3, this method will be typed against `MetadataFactoryInterface` instead.
 * [BC BREAK] the switches `traverse` and `deep` in the `Valid` constraint and in `GraphWalker::walkReference`
   are ignored for arrays now. Arrays are always traversed recursively.
 * added dependency to Translation component
 * violation messages are now translated with a TranslatorInterface implementation
 * [BC BREAK] inserted argument `$message` in the constructor of `ConstraintViolation`
 * [BC BREAK] inserted arguments `$translator` and `$translationDomain` in the constructor of `ExecutionContext`
 * [BC BREAK] inserted arguments `$translator` and `$translationDomain` in the constructor of `GraphWalker`
 * [BC BREAK] inserted arguments `$translator` and `$translationDomain` in the constructor of `ValidationVisitor`
 * [BC BREAK] inserted arguments `$translator` and `$translationDomain` in the constructor of `Validator`
 * [BC BREAK] added `setTranslator()` and `setTranslationDomain()` to `ValidatorBuilderInterface`
 * improved the Validator to support pluralized messages by default
 * [BC BREAK] changed the source of all pluralized messages in the translation files to the pluralized version
 * added ExceptionInterface, BadMethodCallException and InvalidArgumentException

2.1.0
-----

 * added support for `ctype_*` assertions in `TypeValidator`
 * improved the ImageValidator with min width, max width, min height, and max height constraints
 * added support for MIME with wildcard in FileValidator
 * changed Collection validator to add "missing" and "extra" errors to
   individual fields
 * changed default value for `extraFieldsMessage` and `missingFieldsMessage`
   in Collection constraint
 * made ExecutionContext immutable
 * deprecated Constraint methods `setMessage`, `getMessageTemplate` and
   `getMessageParameters`
 * added support for dynamic group sequences with the GroupSequenceProvider pattern
 * [BC BREAK] ConstraintValidatorInterface method `isValid` has been renamed to
   `validate`, its return value was dropped. ConstraintValidator still contains
   `isValid` for BC
 * [BC BREAK] collections in fields annotated with `Valid` are not traversed
   recursively anymore by default. `Valid` contains a new property `deep`
   which enables the BC behavior.
 * added Count constraint
 * added Length constraint
 * added Range constraint
 * deprecated the Min and Max constraints
 * deprecated the MinLength and MaxLength constraints
 * added Validation and ValidatorBuilderInterface
 * deprecated ValidatorContext, ValidatorContextInterface and ValidatorFactory
PK�^�\�_��ss<doc/pear/Validator/Symfony/Component/Validator/composer.jsonnu�[���{
    "name": "symfony/validator",
    "type": "library",
    "description": "Symfony Validator Component",
    "keywords": [],
    "homepage": "http://symfony.com",
    "license": "MIT",
    "authors": [
        {
            "name": "Fabien Potencier",
            "email": "fabien@symfony.com"
        },
        {
            "name": "Symfony Community",
            "homepage": "http://symfony.com/contributors"
        }
    ],
    "require": {
        "php": ">=5.3.3",
        "symfony/translation": "~2.0",
        "symfony/property-access": "~2.2"
    },
    "require-dev": {
        "symfony/http-foundation": "~2.1",
        "symfony/intl": "~2.3",
        "symfony/yaml": "~2.0",
        "symfony/config": "~2.2",
        "doctrine/annotations": "~1.0",
        "doctrine/cache": "~1.0"
    },
    "suggest": {
        "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.",
        "doctrine/cache": "For using the default cached annotation reader",
        "symfony/http-foundation": "",
        "symfony/intl": "",
        "symfony/yaml": "",
        "symfony/config": ""
    },
    "autoload": {
        "psr-0": { "Symfony\\Component\\Validator\\": "" }
    },
    "target-dir": "Symfony/Component/Validator",
    "minimum-stability": "dev",
    "extra": {
        "branch-alias": {
            "dev-master": "2.4-dev"
        }
    }
}
PK�^�\�b��8doc/pear/Validator/Symfony/Component/Validator/README.mdnu�[���Validator Component
===================

This component is based on the JSR-303 Bean Validation specification and
enables specifying validation rules for classes using XML, YAML, PHP or
annotations, which can then be checked against instances of these classes.

Usage
-----

The component provides "validation constraints", which are simple objects
containing the rules for the validation. Let's validate a simple string
as an example:

    use Symfony\Component\Validator\Validation;
    use Symfony\Component\Validator\Constraints\Length;

    $validator = Validation::createValidator();

    $violations = $validator->validateValue('Bernhard', new Length(array('min' => 10)));

This validation will fail because the given string is shorter than ten
characters. The precise errors, here called "constraint violations",  are
returned by the validator. You can analyze these or return them to the user.
If the violation list is empty, validation succeeded.

Validation of arrays is possible using the `Collection` constraint:

    use Symfony\Component\Validator\Validation;
    use Symfony\Component\Validator\Constraints as Assert;

    $validator = Validation::createValidator();

    $constraint = new Assert\Collection(array(
        'name' => new Assert\Collection(array(
            'first_name' => new Assert\Length(array('min' => 101)),
            'last_name'  => new Assert\Length(array('min' => 1)),
        )),
        'email'    => new Assert\Email(),
        'simple'   => new Assert\Length(array('min' => 102)),
        'gender'   => new Assert\Choice(array(3, 4)),
        'file'     => new Assert\File(),
        'password' => new Assert\Length(array('min' => 60)),
    ));

    $violations = $validator->validateValue($input, $constraint);

Again, the validator returns the list of violations.

Validation of objects is possible using "constraint mapping". With such
a mapping you can put constraints onto properties and objects of classes.
Whenever an object of this class is validated, its properties and
method results are matched against the constraints.

    use Symfony\Component\Validator\Validation;
    use Symfony\Component\Validator\Constraints as Assert;

    class User
    {
        /**
         * @Assert\Length(min = 3)
         * @Assert\NotBlank
         */
        private $name;

        /**
         * @Assert\Email
         * @Assert\NotBlank
         */
        private $email;

        public function __construct($name, $email)
        {
            $this->name = $name;
            $this->email = $email;
        }

        /**
         * @Assert\True(message = "The user should have a Google Mail account")
         */
        public function isGmailUser()
        {
            return false !== strpos($this->email, '@gmail.com');
        }
    }

    $validator = Validation::createValidatorBuilder()
        ->enableAnnotationMapping()
        ->getValidator();

    $user = new User('John Doe', 'john@example.com');

    $violations = $validator->validate($user);

This example uses the annotation support of Doctrine Common to
map constraints to properties and methods. You can also map constraints
using XML, YAML or plain PHP, if you dislike annotations or don't want
to include Doctrine. Check the documentation for more information about
these drivers.

Resources
---------

Silex integration:

https://github.com/fabpot/Silex/blob/master/src/Silex/Provider/ValidatorServiceProvider.php

Documentation:

http://symfony.com/doc/2.4/book/validation.html

JSR-303 Specification:

http://jcp.org/en/jsr/detail?id=303

You can run the unit tests with the following command:

    $ cd path/to/Symfony/Component/Validator/
    $ composer.phar install
    $ phpunit
PK�^�\��~�7M7Mfpm/status.htmlnu�[���<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
	$Id$
	(c) 2011 Jerome Loyet
	The PHP License, version 3.01
	This is sample real-time status page for FPM. You can change it to better feet your needs.
-->
	<head> 
		<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
		<style type="text/css"> 
			body {background-color: #ffffff; color: #000000;}
			body, td, th, h1, h2 {font-family: sans-serif;}
			pre {margin: 0px; font-family: monospace;}
			a:link {color: #000099; text-decoration: none; background-color: #ffffff;}
			a:hover {text-decoration: underline;}
			table {border-collapse: collapse;}
			.center {text-align: center;}
			.center table { margin-left: auto; margin-right: auto; text-align: left;}
			.center th { text-align: center !important; }
			td, th { border: 1px solid #000000; font-size: 75%; vertical-align: baseline;}
			h1 {font-size: 150%;}
			h2 {font-size: 125%;}
			.p {text-align: left;}
			.e {background-color: #ccccff; font-weight: bold; color: #000000;}
			.h {background-color: #9999cc; font-weight: bold; color: #000000;}

			.v {background-color: #cccccc; color: #000000;}
			.w {background-color: #ccccff; color: #000000;}

			.h th {
				cursor: pointer;
			}
			img {float: right; border: 0px;}
			hr {width: 600px; background-color: #cccccc; border: 0px; height: 1px; color: #000000;}
		</style> 
	<title>PHP-FPM status page</title>
	<meta name="ROBOTS" content="NOINDEX,NOFOLLOW,NOARCHIVE" /></head> 
	<body>
		<div class="center">
			<table border="0" cellpadding="3" width="95%">
				<tr class="h">
					<td> 
						<a href="http://www.php.net/"><img border="0" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHkAAABACAYAAAA+j9gsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAD4BJREFUeNrsnXtwXFUdx8/dBGihmE21QCrQDY6oZZykon/gY5qizjgM2KQMfzFAOioOA5KEh+j4R9oZH7zT6MAMKrNphZFSQreKHRgZmspLHSCJ2Co6tBtJk7Zps7tJs5t95F5/33PvWU4293F29ybdlPzaM3df2XPv+Zzf4/zOuWc1tkjl+T0HQ3SQC6SBSlD6WKN4rusGm9F1ps/o5mPriOf8dd0YoNfi0nt4ntB1PT4zYwzQkf3kR9/sW4xtpS0CmE0SyPUFUJXFMIxZcM0jAZ4xrKMudQT7963HBF0n6EaUjkP0vI9K9OEHWqJLkNW1s8mC2WgVTwGAqWTafJzTWTKZmQuZ/k1MpAi2+eys6mpWfVaAPzcILu8EVKoCAaYFtPxrAXo8qyNwzZc7gSgzgN9Hx0Ecn3j8xr4lyHOhNrlpaJIgptM5DjCdzrJ0Jmce6bWFkOpqs0MErA4gXIBuAmY53gFmOPCcdaTXCbq+n16PPLXjewMfGcgEttECeouTpk5MplhyKsPBTiXNYyULtwIW7Cx1vlwuJyDLR9L0mQiVPb27fhA54yBbGttMpc1OWwF1cmKaH2FSF7vAjGezOZZJZ9j0dIZlMhnuRiToMO0c+N4X7oksasgEt9XS2KZCHzoem2Ixq5zpAuDTqTR14FMslZyepeEI4Ogj26n0vLj33uiigExgMWRpt+CGCsEePZqoePM738BPTaJzT7CpU0nu1yXpAXCC3VeRkCW4bfJYFZo6dmJyQTW2tvZc1nb719iyZWc5fmZ6Osu6H3uVzit52oBnMll2YizGxk8muFZLAshb/YKtzQdcaO3Y2CQ7eiy+YNGvLN+4+nJetm3bxhKJxJz316xZw1pbW9kLew+w1944XBEaPj6eYCeOx1gqNe07bK1MwIDbKcOFOR49GuePT5fcfOMX2drPXcQ0zf7y2tvbWVdXF/v1k2+yQ4dPVpQ5P0Um/NjoCX6UBMFZR6k+u7qMYVBYDIEqBW7eXAfPZX19zp2/oaGBHysNMGTFinPZik9fWggbI5Omb13zUDeB3lLsdwaK/YPeyAFU0i8Aw9/2Dwyx4SPjFQEYUlf3MTYw4Jx7CIVCbHR0oqIDNMD+FMG+ZE0dO/tsHlvAWnYS6H4qjfMC+Zld/wg92/tuv2WeeYT87j+H2aFDxysGLuSy+o/z49DQkONnmpqa2MjRyoYsZOXKGnb5Z+vZqlUrxUsAvI9At/oK+elnBpoNw+Dai9TekSMxDrgSh0KrSYshTprc2NhoRf1JtlikqirAVl98AddsSavDBDrsC+QdT7/TSoB344tzOZ39+70RbporVerqasyw1MEnC8iV6I9VTDi0uqbmfPFSq2W+gyUHXuEdb3WR5rab5jnD3i/BNMN8ChNaqsTiKa55KmBWX+Tuj0XQdQVF307nhTH0CPls+O0UPbaT5TQG/8qX68u6LpV67LQ6dNknaYgaYyPDx2TzvYGCsnhRkH8b/rsF2GDj1MCInkvxvRjOuCUlipWD/zrKx7ZOwBF0vfSSM2ShyaqAAOC1Nw+zt9/5YNbrN1zfwIdpfgnqebv/A6pnWAn4qlW1HPgHQ6OeoG3N9RO/+StMdDtmV2LxJPfBpQCGfwTgrVu38jFrKaW2tpZt2LCBdXR0sEgkwhv21u9cxQsyW3ZB1+DgoOM54btU6tu8eTPr6elhy5fr7IZNDey+e76e9/fCLcAllHpdKKinpaUlX8+111xB9VzNrYxqUAY/XVVVJYMOekLu2fFGM8VWYQRYiYkU9bD4vPlHFYnH4/zvkb1CgwACHgMoUpdyw3sFXcXUh4YHaNSHDqaxdL5jwVTXBpeXVY9oF3RcUQ+O09NT7Cayfld+4RJlP42gTIq8w66Qf/X4a6FTSSMMDcaE/NhYecMM+MdyG90OAhodWoAGkTUaSZByO5WdiA4GqwStrrM6k5vFKEXQserr63l7oR5V0NBojKctaSZtbneErOtGmFxwkGewjk0UzpCUlJSIRqMcjN8CkHLDqyRByq0PEGBBhDmdj7rQVujAaLfrrlk7xyW5gUaxpEtOmOQDr0e799NYmDVBi0+OT7FcbsaXxEQk8qprEBQMBm0vVKUBRcNjskFE8W71lSt79uzhda1d6w4ZGTUUp3NWAQ3TvW/fPvbVq+rZH/ceULOcF1/I06CY3QJohCCzNJnYdgEwwvpUKuNbUsLNpO3evZtfSGHp7+/nS2pw3LLFPVWLoA5yHQUtXvXFYjH+vU4F5yOibzsRUL38MTqC3XWh8GCWziMcDjt2BNEZUIfoUOpJkwvziT3S5ua8Jj/4yD5E0yERbPkhKv4RF4mhkN1wCMHN2rWfYZ2dnWz9+vXchNkJzBoaQ8Bxqg91wWo41YdO2dzczD+3bt06Rw0rBG4nOF8oi9M0Jsw9OgLqQ124BifLgeuHyVbN0NXUrODBmDWxgRR0pNrUYqMNgDOZGZbNzvgCuc4j0kX+GPJ2//CcMagQmKkbrm/knwVEp++SIXulM1+nhj9AY207QRDnpsnye24WA59DkuPlV/5j+z5eB2hE0W1tbTyQdNJmDpksRzFp2E9csFJAboRvDvz8gZdJgw2ek55KZphfAv+Inu8UdKnmkEUHQK93EjEZ4Rbkifq8JiactEpYAy9Nli2Gm6CjIZPn1qlKFWizleOG3BIwdKNZ+KRMxr9VHKvr1NKLXo2BhlAVFRPq1qlWW6MBr3NWyY2rTGXO5ySJlN9uDuiGsV7XTVPtl8CHYGizf/9+V5Om0hAwVV4ahuU8qia03HP26kyqFkMOTudDzjs/P/QKBUiBYa5ZNucfZJUkCG/0IhpCxYyqBF3lnLOII8q1GKqdStQ3rTh5MStwXX5O/nE1metGQzPHUH6JatA1OppQ8u1eUbpX44tO4GY5vM5Z9sduFgOfG1GwUOK6VFzaSAmrWCSfzGCuuT/O+bi6QwRdTtqXN2keJ4/ejgkJ5HedRARkbkGe6ARulgMWQ+Wc3cDAWohhoZdcue7ifJ7crfP6Me8dELd0Mv8U2begC2k9SHd3t+NnNm7cqKwRbiYUkykqvlZlmOYVLIq5bHRep46JzotOc9BhuFc0ZHGLph+CJIaXr1FZSIfxsdBiN1+LpALEK2By61Aqs0rwtV7DNBU3BMCYixYTLU6C8bM5hBwum0k1mesBpmPtlj+qXFenFsAgCVLon9DYeIxUnmh05HCdBIkCVRP6ussiepVZJZXIutCHwt2I0YGY2Kiz3AIyeG5aLNooVULQBbHy1/nAK2oEtEanheil+GO3aFg0FnwSilNC4q6OrXzywc0XCy1WMaFu/tgrCBLRuWpHuP+n1zqmRXFN0GAnwKgHeW1E1C/86UDJHFKptATZMPZTafbLXHtN3OPixKRC4ev4GwB2Gy6JxhQNEYul+KoKp79RMaGqKzy9ovzt27c7pidVZtYAGJMYOP7u6bdK1mLI1GQ+/ogSZBahwKuLO2jSZt0odw65xrUhAMNrZskLsGiIXz72F3bTjV+ixvtbWcMQr3NWCbog5VyXAIy63PLrqpJITIqHkcD9P7suSiYbG53wvTLKDbr8WBbjZqIF4F3PD3ItRn1eQd5CBF3lCM5RAIYfVp0/dgZ8SvbJ2/l8MmlvNw+8qJTjm+drWQwaAXO9KMuWncc1GBMXKkGeV/pU5ZxFIsTvzovOCu3HvDnOE7NTu3rLr+PE8fy6+IEX9947YM4n/+LbPT/88R8QqoYAuVSDrZLFKcYso2AcLBIeGDPu6h3M+yqvIE/4Y6w4LdUfi+jcr86L75KvC9+PcbVfd1hCi6U7Innwk1/+Q5rcoetsdyBg3s9aCmivBsNFifGfG9zCJUFiztmpEXAbqhMgr6SLWBPu9R1enRfm1ktrC6cVYWH+/Mqg43x6sYK1edaCex7vkRZHZkF+6P6NkXvvi/TpLNBUaqTtdcsoLtIrVTcem2EHDh7m2uq0ikMINBvafOmazzt+BkGMW9CF70DndPsOaJqb38Y1oXjdCYHOiqwbPofrKid6thMAlnxxPtMy6w4K0ubNhq73U5wd5PtVleCTd+50D2CEafLloqixyv0ufMcOGq64CVaMYN2119gfAdPpuscKOxWgCMDwxfm0pvzBhx9siRLoFt3ca7Ikf+x2yygaYzHdTSi7IT9y8fMJ2Lpdhg+ZCPA2+f05d1A88mBLHzQaoA1dL6ohVLJGi+1uQj8XQMyHIMgaGT6eDxuozMkD294LRaB7CPI27DLHQSskSFRvGa30O/zndF4fF0DMhwa//9//iZ2DcILqN7xBHn1oUweNn7eJ3WO9QHvdMlrMsphKEj8XQPgpuHVVMtGOgF0hC9CGTqbb2kHOzXx73aKiuiymEv2x22ICMYYeWSALBQ7RQ0fkoZIr4DnRtS3ohzf1dNzTG9d0PcwMLahZO8UyKTMm38wteratSVtkplq4oWj0PcfrEinPhYg14H+hvdIwCVs1bvb6O+UBMYFGl90d0LRGLRDgoHEUwYnXDniQStocTVUwfPLaKQGA/RoWOmkvtnsaG8unK+PWMKlH5e+Lznp03N27RdO0TkxmYNZKszYBlyfI3RpjsQkmMOo8ls4Wsx1EKcEVAEvayyNoeRzsO2RI+93PNRLesGYtNpBhL4l/prlgZz5ob0mbtZVFhWC301d0EuQgAHPgS7D9hssTHKyMbRfLptF213NBDRuoaqxNA2yh2VUBDnxJ1M1yRW6gOgt2x64gqXK7ht1yOWyW1+wl7bYXvhUygQXgit4KuVDuBGzSbA2bmmtayNzpRgJOGu7XosHFChZzvrGTiUKt5UMiVsmbmtsCb3+2lZmwm3hFNsA/CiYdKyfhYx3Aws8urp8nsJM72naGCG8zYwZMecjk/WHVVRbsMwU6tBVQsWJS2sNDlrgVTO0RE/vzKQtuN2+/85k5PxlUaL75D3BZwKss+JUqSFRAO/F7Eqlkmj+2gbrgYE8rZFluu+P3pOGsyWCG/Y9/GR8exC+vYfc5flxgzRdDGsDEz/8AJsxwQcBUKPCtmKOMFJO8OKMgF8r3b3sKkAm69TN+2OZCAm5ID/g9XPypwX29ufWgudq0urrKes/8nPkxgy1bdg6z/or/SFc2mzV/xs+6HwySTmdYJp2dpaWKEregYrVfn9/B0xkD2U6+e+sOaHqImTfLrycUOIZM1hJwC3oemPXbi/y5PnsrJ136bUa8pxu69BklmANWwDRkgR1wmwVaglyi3Nz6JLQ+ZG5NxQsgNdAhmIfJN7wxgoWg9fxzPQ+c/g9YAIXgeUKCyipJO4uR/wswAOIwB/5IgxvbAAAAAElFTkSuQmCC" alt="PHP Logo" /></a><h1 class="p">PHP-FPM real-time status page</h1>
					</td>
				</tr>
			</table>
			<br />
			<table border="0" cellpadding="3" width="95%">
				<tr><td class="e">Status URL</td><td class="v"><input type="text" id="url" size="45" /></td></tr> 
				<tr><td class="e">Ajax status</td><td class="v" id="status"></td></tr> 
				<tr><td class="e">Refresh Rate</td><td class="v"><input type="text" id="rate" value="1" /></td></tr> 
				<tr>
					<td class="e">Actions</td>
					<td class="v">
						<button onclick="javascript:refresh();">Manual Refresh</button>
						<button id="play" onclick="javascript:playpause();">Play</button>
					</td>
				</tr> 
			</table>
			<h1>Pool Status</h1> 
			<table border="0" cellpadding="3" width="95%" id="short">
				<tr style="display: none;"><td>&nbsp;</td></tr>
			</table>
			<h1>Active Processes status</h1> 
			<table border="0" cellpadding="3" width="95%" id="active">
				<tr class="h"><th>PID&darr;</th><th>Start Time</th><th>Start Since</th><th>Requests Served</th><th>Request Duration</th><th>Request method</th><th>Request URI</th><th>Content Length</th><th>User</th><th>Script</th></tr>
			</table>
			<h1>Idle Processes status</h1> 
			<table border="0" cellpadding="3" width="95%" id="idle">
				<tr class="h"><th>PID&darr;</th><th>Start Time</th><th>Start Since</th><th>Requests Served</th><th>Request Duration</th><th>Request method</th><th>Request URI</th><th>Content Length</th><th>User</th><th>Script</th><th>Last Request %CPU</th><th>Last Request Memory</th></tr>
			</table>
		</div>
		<p>
			<a href="http://validator.w3.org/check?uri=referer">
				<img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0 Transitional" height="31" width="88" />
			</a>
		 </p>
		<script type="text/javascript">
<!--
			var xhr_object = null;
			var doc_url = document.getElementById("url");
			var doc_rate = document.getElementById("rate");
			var doc_status = document.getElementById("status");
			var doc_play = document.getElementById("play");
			var doc_short = document.getElementById("short");
			var doc_active = document.getElementById("active");
			var doc_idle = document.getElementById("idle");
			var rate = 0;
			var play=0;
			var delay = 1000;
			var order_active_index = 0;
			var order_active_reverse = 0;
			var order_idle_index = 0;
			var order_idle_reverse = 0;
			var sort_index;
			var sort_order;

			doc_url.value = location.protocol + '//' + location.host + "/status?json&full";

			ths = document.getElementsByTagName("th");
			for (var i=0; i<ths.length; i++) {
				var th = ths[i];
				if (th.parentNode.className == "h") {
					th.onclick = function() { order(this); return false; };
				}
			}

			xhr_object = create_ajax();

			function create_ajax() {
				if (window.XMLHttpRequest) {
					return new XMLHttpRequest();
				}
				var names = [
					"Msxml2.XMLHTTP.6.0",
					"Msxml2.XMLHTTP.3.0",
					"Msxml2.XMLHTTP",
					"Microsoft.XMLHTTP"
				];
				for(var i in names)
				{
					try {
						return new ActiveXObject(names[i]);
					}	catch(e){}
				}
				alert("Browser not compatible ...");
			}

			function order(cell) {
				var table;

				if (cell.constructor != HTMLTableCellElement && cell.constructor != HTMLTableHeaderCellElement) {
					return;
				}

				table = cell.parentNode.parentNode.parentNode;

				if (table == doc_active) {
					if (order_active_index == cell.cellIndex) {
						if (order_active_reverse == 0) {
							cell.innerHTML = cell.innerHTML.replace(/.$/, "&uarr;");
							order_active_reverse = 1;
						} else {
							cell.innerHTML = cell.innerHTML.replace(/.$/, "&darr;");
							order_active_reverse = 0;
						}
					} else {
						var c = doc_active.rows[0].cells[order_active_index];
						c.innerHTML = c.innerHTML.replace(/.$/, "");
						cell.innerHTML = cell.innerHTML.replace(/$/, order_active_reverse == 0 ? "&darr;" : "&uarr;");
						order_active_index = cell.cellIndex;
					}
					reorder(table, order_active_index, order_active_reverse);
					return;
				}

				if (table == doc_idle) {
					if (order_idle_index == cell.cellIndex) {
						if (order_idle_reverse == 0) {
							cell.innerHTML = cell.innerHTML.replace(/.$/, "&uarr;");
							order_idle_reverse = 1;
						} else {
							cell.innerHTML = cell.innerHTML.replace(/.$/, "&darr;");
							order_idle_reverse = 0;
						}
					} else {
						var c = doc_idle.rows[0].cells[order_idle_index];
						c.innerHTML = c.innerHTML.replace(/.$/, "");
						cell.innerHTML = cell.innerHTML.replace(/$/, order_idle_reverse == 0 ? "&darr;" : "&uarr;");
						order_idle_index = cell.cellIndex;
					}
					reorder(table, order_idle_index, order_idle_reverse);
					return;
				}
			}

			function reorder(table, index, order) {
				var rows = [];
				while (table.rows.length > 1) {
					rows.push(table.rows[1]);
					table.deleteRow(1);
				}
				sort_index = index;
				sort_order = order;
				rows.sort(sort_table);
				for (var i in rows) {
					table.appendChild(rows[i]);
				}
				var odd = 1;
				for (var i=1; i<table.rows.length; i++) {
					table.rows[i].className = odd++ % 2 == 0 ? "v" : "w";
				}
				return;
			}

			function sort_table(a, b) {
				if (a.cells[0].tagName == "TH") return -1;
				if (b.cells[0].tagName == "TH") return 1;

				if (a.cells[sort_index].__search_t == 0) { /* integer */
					if (!sort_order) return a.cells[sort_index].__search_v - b.cells[sort_index].__search_v;
					return b.cells[sort_index].__search_v - a.cells[sort_index].__search_v;;
				}

				/* string */
				if (!sort_order) return a.cells[sort_index].__search_v.localeCompare(b.cells[sort_index].__search_v);
				else return b.cells[sort_index].__search_v.localeCompare(a.cells[sort_index].__search_v);
			}

			function playpause() {
				rate = 0;
				if (play) {
					play = 0;
					doc_play.innerHTML = "Play";
					doc_rate.disabled = false;
				} else {
					delay = parseInt(doc_rate.value);
					if (!delay || delay < 1) {
						doc_status.innerHTML = "Not valid 'refresh' value";
						return;
					}
					play = 1;
					doc_rate.disabled = true;
					doc_play.innerHTML = "Pause";
					setTimeout("callback()", delay * 1000);
				}
			}

			function refresh() {
				if (xhr_object == null) return;
				if (xhr_object.readyState > 0 && xhr_object.readyState < 4) {
					return; /* request is running */
				}
				xhr_object.open("GET", doc_url.value, true);
				xhr_object.onreadystatechange = function() {
					switch(xhr_object.readyState) {
						case 0:
							doc_status.innerHTML = "uninitialized";
							break;
						case 1:
							doc_status.innerHTML = "loading ...";
							break;
						case 2:
							doc_status.innerHTML = "loaded";
							break;
						case 3:
							doc_status.innerHTML = "interactive";
							break;
						case 4:
							doc_status.innerHTML = "complete";
							if (xhr_object.status == 200) {
								fpm_status(xhr_object.responseText);
							} else {
								doc_status.innerHTML = "Error " + xhr_object.status;
							}
							break;
					}
				}
				xhr_object.send();
			}

			function callback() {
				if (!play) return;
				refresh();
				setTimeout("callback()", delay * 1000);
			}

			function fpm_status(txt) {
				var json = null;

				while (doc_short.rows.length > 0) {
					doc_short.deleteRow(0);
				}

				while (doc_active.rows.length > 1) {
					doc_active.deleteRow(1);
				}

				while (doc_idle.rows.length > 1) {
					doc_idle.deleteRow(1);
				}

				try {
					json = JSON.parse(txt);
				} catch (e) {
					doc_status.innerHTML =  "Error while parsing json: '" + e + "': <br /><pre>" + txt + "</pre>";
					return;
				}

				for (var key in json) {
					if (key == "processes") continue;
					if (key == "state") continue;
					var row = doc_short.insertRow(doc_short.rows.length);
					var value = json[key];
					if (key == "start time") {
						value = new Date(value * 1000).toLocaleString();
					}
					if (key == "start since") {
						value = time_s(value);
					}
					var cell = row.insertCell(row.cells.length);
					cell.className = "e";
					cell.innerHTML = key;

					cell = row.insertCell(row.cells.length);
					cell.className = "v";
					cell.innerHTML = value;
				}

				if (json.processes) {
					process_full(json.processes, doc_active, "Idle", 0, 0);
					reorder(doc_active, order_active_index, order_active_reverse);

					process_full(json.processes, doc_idle, "Idle", 1, 1);
					reorder(doc_idle, order_idle_index, order_idle_reverse);
				}
			}

			function process_full(processes, table, state, equal, cpumem) {
				var odd = 1;

				for (var i in processes) {
					var proc = processes[i];
					if ((equal && proc.state == state) || (!equal && proc.state != state)) {
						var c = odd++ % 2 == 0 ? "v" : "w";
						var row = table.insertRow(-1);
						row.className = c;
						row.insertCell(-1).innerHTML = proc.pid;
						row.cells[row.cells.length - 1].__search_v = proc.pid;
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = date(proc['start time'] * 1000);;
						row.cells[row.cells.length - 1].__search_v = proc['start time'];
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = time_s(proc['start since']);
						row.cells[row.cells.length - 1].__search_v = proc['start since'];
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = proc.requests;
						row.cells[row.cells.length - 1].__search_v = proc.requests;
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = time_u(proc['request duration']);
						row.cells[row.cells.length - 1].__search_v = proc['request duration'];
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = proc['request method'];
						row.cells[row.cells.length - 1].__search_v = proc['request method'];
						row.cells[row.cells.length - 1].__search_t = 1;

						row.insertCell(-1).innerHTML = proc['request uri'];
						row.cells[row.cells.length - 1].__search_v = proc['request uri'];
						row.cells[row.cells.length - 1].__search_t = 1;

						row.insertCell(-1).innerHTML = proc['content length'];
						row.cells[row.cells.length - 1].__search_v = proc['content length'];
						row.cells[row.cells.length - 1].__search_t = 0;

						row.insertCell(-1).innerHTML = proc.user;
						row.cells[row.cells.length - 1].__search_v = proc.user;
						row.cells[row.cells.length - 1].__search_t = 1;

						row.insertCell(-1).innerHTML = proc.script;
						row.cells[row.cells.length - 1].__search_v = proc.script;
						row.cells[row.cells.length - 1].__search_t = 1;

						if (cpumem) {
							row.insertCell(-1).innerHTML = cpu(proc['last request cpu']);
							row.cells[row.cells.length - 1].__search_v = proc['last request cpu'];
							row.cells[row.cells.length - 1].__search_t = 0;

							row.insertCell(-1).innerHTML = memory(proc['last request memory']);
							row.cells[row.cells.length - 1].__search_v = proc['last request memory'];
							row.cells[row.cells.length - 1].__search_t = 0;
						}
					}
				}
			}

			function date(d) {
				var t = new Date(d);
				var r = "";

				r += (t.getDate() < 10 ? '0' : '') + t.getDate();
				r += '/';
				r += (t.getMonth() + 1 < 10 ? '0' : '') + (t.getMonth() + 1);
				r += '/';
				r += t.getFullYear();
				r += ' ';
				r += (t.getHours() < 10 ? '0' : '') + t.getHours();
				r += ':';
				r += (t.getMinutes() < 10 ? '0' : '') + t.getMinutes();
				r += ':';
				r += (t.getSeconds() < 10 ? '0' : '') + t.getSeconds();


				return r;
			}

			function cpu(c) {
				if (c == 0) return 0;
				return c + "%";
			}

			function memory(mem) {
				if (mem == 0) return 0;
				if (mem < 1024) {
					return mem + "B";
				}
				if (mem < 1024 * 1024) {
					return mem/1024 + "KB";
				}
				if (mem < 1024*1024*1024) {
					return mem/1024/1024 + "MB";
				}
			}

			function time_s(t) {
				var r = "";
				if (t < 60) {
					return t + 's';
				}

				r = (t % 60) + 's';
				t = Math.floor(t / 60);
				if (t < 60) {
					return t + 'm ' + r;
				}

				r = (t % 60) + 'm ' + r;
				t = Math.floor(t/60);

				if (t < 24) {
					return t + 'h ' + r;
				}

				return Math.floor(t/24) + 'd ' + (t % 24) + 'h ' + t;
			}

			function time_u(t) {
				var r = "";
				if (t < 1000) {
					return t + '&micro;s'
				}

				r = (t % 1000) + '&micro;s';
				t = Math.floor(t / 1000);
				if (t < 1000) {
					return t + 'ms ' + r;
				}

				return time_s(Math.floor(t/1000)) + ' ' + (t%1000) + 'ms ' + r;
			}
-->
		</script>
	</body>
</html>
PK�^�\B��shhpear/Mail/mock.phpnu�[���<?php
/**
 * Mock implementation
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017, Chuck Hagenbuch
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Chuck Hagenbuch <chuck@horde.org> 
 * @copyright   2010-2017 Chuck Hagenbuch
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/**
 * Mock implementation of the PEAR Mail:: interface for testing.
 * @access public
 * @package Mail
 * @version $Revision$
 */
class Mail_mock extends Mail {

    /**
     * Array of messages that have been sent with the mock.
     *
     * @var array
     */
    public $sentMessages = array();

    /**
     * Callback before sending mail.
     *
     * @var callback
     */
    protected $_preSendCallback;

    /**
     * Callback after sending mai.
     *
     * @var callback
     */
    protected $_postSendCallback;

    /**
     * Constructor.
     *
     * Instantiates a new Mail_mock:: object based on the parameters
     * passed in. It looks for the following parameters, both optional:
     *     preSendCallback   Called before an email would be sent.
     *     postSendCallback  Called after an email would have been sent.
     *
     * @param array Hash containing any parameters.
     */
    public function __construct($params)
    {
        if (isset($params['preSendCallback']) &&
            is_callable($params['preSendCallback'])) {
            $this->_preSendCallback = $params['preSendCallback'];
        }

        if (isset($params['postSendCallback']) &&
            is_callable($params['postSendCallback'])) {
            $this->_postSendCallback = $params['postSendCallback'];
        }
    }

    /**
     * Implements Mail_mock::send() function. Silently discards all
     * mail.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (ie, 'Subject'), and the array value
     *              is the header value (ie, 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               Mime parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     */
    public function send($recipients, $headers, $body)
    {
        if ($this->_preSendCallback) {
            call_user_func_array($this->_preSendCallback,
                                 array(&$this, $recipients, $headers, $body));
        }

        $entry = array('recipients' => $recipients, 'headers' => $headers, 'body' => $body);
        $this->sentMessages[] = $entry;

        if ($this->_postSendCallback) {
            call_user_func_array($this->_postSendCallback,
                                 array(&$this, $recipients, $headers, $body));
        }

        return true;
    }

}
PK�^�\E@�%>>pear/Mail/sendmail.phpnu�[���<?php
/**
 * Sendmail implementation of the PEAR Mail interface.
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017, Chuck Hagenbuch & Jon Parise
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Jon Parise <jon@php.net>
 * @author      Chuck Hagenbuch <chuck@horde.org>
 * @copyright   2010-2017 Chuck Hagenbuch
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/**
 * Sendmail implementation of the PEAR Mail:: interface.
 * @access public
 * @package Mail
 * @version $Revision$
 */
class Mail_sendmail extends Mail {

    /**
     * The location of the sendmail or sendmail wrapper binary on the
     * filesystem.
     * @var string
     */
    var $sendmail_path = '/usr/sbin/sendmail';

    /**
     * Any extra command-line parameters to pass to the sendmail or
     * sendmail wrapper binary.
     * @var string
     */
    var $sendmail_args = '-i';

    /**
     * Constructor.
     *
     * Instantiates a new Mail_sendmail:: object based on the parameters
     * passed in. It looks for the following parameters:
     *     sendmail_path    The location of the sendmail binary on the
     *                      filesystem. Defaults to '/usr/sbin/sendmail'.
     *
     *     sendmail_args    Any extra parameters to pass to the sendmail
     *                      or sendmail wrapper binary.
     *
     * If a parameter is present in the $params array, it replaces the
     * default.
     *
     * @param array $params Hash containing any parameters different from the
     *              defaults.
     */
    public function __construct($params)
    {
        if (isset($params['sendmail_path'])) {
            $this->sendmail_path = $params['sendmail_path'];
        }
        if (isset($params['sendmail_args'])) {
            $this->sendmail_args = $params['sendmail_args'];
        }

        /*
         * Because we need to pass message headers to the sendmail program on
         * the commandline, we can't guarantee the use of the standard "\r\n"
         * separator.  Instead, we use the system's native line separator.
         */
        if (defined('PHP_EOL')) {
            $this->sep = PHP_EOL;
        } else {
            $this->sep = (strpos(PHP_OS, 'WIN') === false) ? "\n" : "\r\n";
        }
    }

    /**
     * Implements Mail::send() function using the sendmail
     * command-line binary.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (ie, 'Subject'), and the array value
     *              is the header value (ie, 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               Mime parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     */
    public function send($recipients, $headers, $body)
    {
        if (!is_array($headers)) {
            return PEAR::raiseError('$headers must be an array');
        }

        $result = $this->_sanitizeHeaders($headers);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        $recipients = $this->parseRecipients($recipients);
        if (is_a($recipients, 'PEAR_Error')) {
            return $recipients;
        }
        $recipients = implode(' ', array_map('escapeshellarg', $recipients));

        $headerElements = $this->prepareHeaders($headers);
        if (is_a($headerElements, 'PEAR_Error')) {
            return $headerElements;
        }
        list($from, $text_headers) = $headerElements;

        /* Since few MTAs are going to allow this header to be forged
         * unless it's in the MAIL FROM: exchange, we'll use
         * Return-Path instead of From: if it's set. */
        if (!empty($headers['Return-Path'])) {
            $from = $headers['Return-Path'];
        }

        if (!isset($from)) {
            return PEAR::raiseError('No from address given.');
        } elseif (strpos($from, ' ') !== false ||
                  strpos($from, ';') !== false ||
                  strpos($from, '&') !== false ||
                  strpos($from, '`') !== false) {
            return PEAR::raiseError('From address specified with dangerous characters.');
        }

        $from = escapeshellarg($from); // Security bug #16200

        $mail = @popen($this->sendmail_path . (!empty($this->sendmail_args) ? ' ' . $this->sendmail_args : '') . " -f$from -- $recipients", 'w');
        if (!$mail) {
            return PEAR::raiseError('Failed to open sendmail [' . $this->sendmail_path . '] for execution.');
        }

        // Write the headers following by two newlines: one to end the headers
        // section and a second to separate the headers block from the body.
        fputs($mail, $text_headers . $this->sep . $this->sep);

        fputs($mail, $body);
        $result = pclose($mail);
        if (version_compare(phpversion(), '4.2.3') == -1) {
            // With older php versions, we need to shift the pclose
            // result to get the exit code.
            $result = $result >> 8 & 0xFF;
        }

        if ($result != 0) {
            return PEAR::raiseError('sendmail returned error code ' . $result,
                                    $result);
        }

        return true;
    }

}
PK�^�\�{��pear/Mail/null.phpnu�[���<?php
/**
 * Null implementation of the PEAR Mail interface
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017, Phil Kernick
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Phil Kernick <philk@rotfl.com.au>
 * @copyright   2010-2017 Phil Kernick
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/**
 * Null implementation of the PEAR Mail:: interface.
 * @access public
 * @package Mail
 * @version $Revision$
 */
class Mail_null extends Mail {

    /**
     * Implements Mail_null::send() function. Silently discards all
     * mail.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (ie, 'Subject'), and the array value
     *              is the header value (ie, 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               Mime parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     */
    public function send($recipients, $headers, $body)
    {
        return true;
    }

}
PK�^�\�+V����pear/Mail/mime.phpnu�[���<?php

/**
 * The Mail_Mime class is used to create MIME E-mail messages
 *
 * The Mail_Mime class provides an OO interface to create MIME
 * enabled email messages. This way you can create emails that
 * contain plain-text bodies, HTML bodies, attachments, inline
 * images and specific headers.
 *
 * Compatible with PHP version 5, 7 and 8
 *
 * LICENSE: This LICENSE is in the BSD license style.
 * Copyright (c) 2002-2003, Richard Heyes <richard@phpguru.org>
 * Copyright (c) 2003-2006, PEAR <pear-group@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the name of the authors, nor the names of its contributors 
 *   may be used to endorse or promote products derived from this 
 *   software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category  Mail
 * @package   Mail_Mime
 * @author    Richard Heyes  <richard@phpguru.org>
 * @author    Tomas V.V. Cox <cox@idecnet.com>
 * @author    Cipriano Groenendal <cipri@php.net>
 * @author    Sean Coates <sean@php.net>
 * @author    Aleksander Machniak <alec@php.net>
 * @copyright 2003-2006 PEAR <pear-group@php.net>
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/Mail_mime
 *
 *            This class is based on HTML Mime Mail class from
 *            Richard Heyes <richard@phpguru.org> which was based also
 *            in the mime_mail.class by Tobias Ratschiller <tobias@dnet.it>
 *            and Sascha Schumann <sascha@schumann.cx>
 */


require_once 'PEAR.php';
require_once 'Mail/mimePart.php';


/**
 * The Mail_Mime class provides an OO interface to create MIME
 * enabled email messages. This way you can create emails that
 * contain plain-text bodies, HTML bodies, attachments, inline
 * images and specific headers.
 *
 * @category  Mail
 * @package   Mail_Mime
 * @author    Richard Heyes  <richard@phpguru.org>
 * @author    Tomas V.V. Cox <cox@idecnet.com>
 * @author    Cipriano Groenendal <cipri@php.net>
 * @author    Sean Coates <sean@php.net>
 * @copyright 2003-2006 PEAR <pear-group@php.net>
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/Mail_mime
 */
class Mail_mime
{
    /**
     * Contains the plain text part of the email
     *
     * @var string
     */
    protected $txtbody = '';

    /**
     * Contains the html part of the email
     *
     * @var string
     */
    protected $htmlbody = '';

    /**
     * Contains the text/calendar part of the email
     *
     * @var string
     */
    protected $calbody = '';

    /**
     * List of the attached images
     *
     * @var array
     */
    protected $html_images = array();

    /**
     * List of the attachements
     *
     * @var array
     */
    protected $parts = array();

    /**
     * Headers for the mail
     *
     * @var array
     */
    protected $headers = array();

    /**
     * Build parameters
     *
     * @var array
     */
    protected $build_params = array(
        // What encoding to use for the headers
        // Options: quoted-printable or base64
        'head_encoding' => 'quoted-printable',
        // What encoding to use for plain text
        // Options: 7bit, 8bit, base64, or quoted-printable
        'text_encoding' => 'quoted-printable',
        // What encoding to use for html
        // Options: 7bit, 8bit, base64, or quoted-printable
        'html_encoding' => 'quoted-printable',
        // What encoding to use for calendar part
        // Options: 7bit, 8bit, base64, or quoted-printable
        'calendar_encoding' => 'quoted-printable',
        // The character set to use for html
        'html_charset'  => 'ISO-8859-1',
        // The character set to use for text
        'text_charset'  => 'ISO-8859-1',
        // The character set to use for calendar part
        'calendar_charset'  => 'UTF-8',
        // The character set to use for headers
        'head_charset'  => 'ISO-8859-1',
        // End-of-line sequence
        'eol'           => "\r\n",
        // Delay attachment files IO until building the message
        'delay_file_io' => false,
        // Default calendar method
        'calendar_method' => 'request',
        // multipart part preamble (RFC2046 5.1.1)
        'preamble' => '',
    );


    /**
     * Constructor function
     *
     * @param mixed $params Build parameters that change the way the email
     *                      is built. Should be an associative array.
     *                      See $_build_params.
     *
     * @return void
     */
    public function __construct($params = array())
    {
        // Backward-compatible EOL setting
        if (is_string($params)) {
            $this->build_params['eol'] = $params;
        } else if (defined('MAIL_MIME_CRLF') && !isset($params['eol'])) {
            $this->build_params['eol'] = MAIL_MIME_CRLF;
        }

        // Update build parameters
        if (!empty($params) && is_array($params)) {
            $this->build_params = array_merge($this->build_params, $params);
        }
    }

    /**
     * Set build parameter value
     *
     * @param string $name  Parameter name
     * @param string $value Parameter value
     *
     * @return void
     * @since  1.6.0
     */
    public function setParam($name, $value)
    {
        $this->build_params[$name] = $value;
    }

    /**
     * Get build parameter value
     *
     * @param string $name Parameter name
     *
     * @return mixed Parameter value
     * @since  1.6.0
     */
    public function getParam($name)
    {
        return isset($this->build_params[$name]) ? $this->build_params[$name] : null;
    }

    /**
     * Accessor function to set the body text. Body text is used if
     * it's not an html mail being sent or else is used to fill the
     * text/plain part that emails clients who don't support
     * html should show.
     *
     * @param string $data   Either a string or the file name with the contents
     * @param bool   $isfile If true the first param should be treated
     *                       as a file name, else as a string (default)
     * @param bool   $append If true the text or file is appended to
     *                       the existing body, else the old body is
     *                       overwritten
     *
     * @return mixed True on success or PEAR_Error object
     */
    public function setTXTBody($data, $isfile = false, $append = false)
    {
        return $this->setBody('txtbody', $data, $isfile, $append);
    }

    /**
     * Get message text body
     *
     * @return string Text body
     * @since  1.6.0
     */
    public function getTXTBody()
    {
        return $this->txtbody;
    }

    /**
     * Adds a html part to the mail.
     *
     * @param string $data   Either a string or the file name with the contents
     * @param bool   $isfile A flag that determines whether $data is a
     *                       filename, or a string(false, default)
     *
     * @return bool True on success or PEAR_Error object
     */
    public function setHTMLBody($data, $isfile = false)
    {
        return $this->setBody('htmlbody', $data, $isfile);
    }

    /**
     * Get message HTML body
     *
     * @return string HTML body
     * @since  1.6.0
     */
    public function getHTMLBody()
    {
        return $this->htmlbody;
    }

    /**
     * Function to set a body of text/calendar part (not attachment)
     *
     * @param string $data     Either a string or the file name with the contents
     * @param bool   $isfile   If true the first param should be treated
     *                         as a file name, else as a string (default)
     * @param bool   $append   If true the text or file is appended to
     *                         the existing body, else the old body is
     *                         overwritten
     * @param string $method   iCalendar object method
     * @param string $charset  iCalendar character set
     * @param string $encoding Transfer encoding
     *
     * @return mixed True on success or PEAR_Error object
     * @since  1.9.0
     */
    public function setCalendarBody($data, $isfile = false, $append = false,
        $method = 'request', $charset = 'UTF-8', $encoding = 'quoted-printable'
    ) {
        $result = $this->setBody('calbody', $data, $isfile, $append);

        if ($result === true) {
            $this->build_params['calendar_method']  = $method;
            $this->build_params['calendar_charset'] = $charset;
            $this->build_params['calendar_encoding'] = $encoding;
        }
    }

    /**
     * Get body of calendar part
     *
     * @return string Calendar part body
     * @since  1.9.0
     */
    public function getCalendarBody()
    {
        return $this->calbody;
    }

    /**
     * Adds an image to the list of embedded images.
     * Images added this way will be added as related parts of the HTML message.
     *
     * To correctly match the HTML image with the related attachment
     * HTML should refer to it by a filename (specified in $file or $name
     * arguments) or by cid:<content-id> (specified in $content_id arg).
     *
     * @param string $file       The image file name OR image data itself
     * @param string $c_type     The content type
     * @param string $name       The filename of the image. Used to find
     *                           the image in HTML content.
     * @param bool   $isfile     Whether $file is a filename or not.
     *                           Defaults to true
     * @param string $content_id Desired Content-ID of MIME part
     *                           Defaults to generated unique ID
     *
     * @return bool True on success
     */
    public function addHTMLImage($file,
        $c_type = 'application/octet-stream',
        $name = '',
        $isfile = true,
        $content_id = null
    ) {
        $bodyfile = null;

        if ($isfile) {
            // Don't load file into memory
            if ($this->build_params['delay_file_io']) {
                $filedata = null;
                $bodyfile = $file;
            } else {
                if (self::isError($filedata = $this->file2str($file))) {
                    return $filedata;
                }
            }

            $filename = $name ? $name : $file;
        } else {
            $filedata = $file;
            $filename = $name;
        }

        if (!$content_id) {
            $content_id = preg_replace('/[^0-9a-zA-Z]/', '', uniqid(time(), true));
        }

        $this->html_images[] = array(
            'body'      => $filedata,
            'body_file' => $bodyfile,
            'name'      => $filename,
            'c_type'    => $c_type,
            'cid'       => $content_id
        );

        return true;
    }

    /**
     * Adds a file to the list of attachments.
     *
     * @param mixed  $file        The file name or the file contents itself,
     *                            it can be also Mail_mimePart object
     * @param string $c_type      The content type
     * @param string $name        The filename of the attachment
     *                            Only use if $file is the contents
     * @param bool   $isfile      Whether $file is a filename or not. Defaults to true
     * @param string $encoding    The type of encoding to use. Defaults to base64.
     *                            Possible values: 7bit, 8bit, base64 or quoted-printable.
     * @param string $disposition The content-disposition of this file
     *                            Defaults to attachment.
     *                            Possible values: attachment, inline.
     * @param string $charset     The character set of attachment's content.
     * @param string $language    The language of the attachment
     * @param string $location    The RFC 2557.4 location of the attachment
     * @param string $n_encoding  Encoding of the attachment's name in Content-Type
     *                            By default filenames are encoded using RFC2231 method
     *                            Here you can set RFC2047 encoding (quoted-printable
     *                            or base64) instead
     * @param string $f_encoding  Encoding of the attachment's filename
     *                            in Content-Disposition header.
     * @param string $description Content-Description header
     * @param string $h_charset   The character set of the headers e.g. filename
     *                            If not specified, $charset will be used
     * @param array  $add_headers Additional part headers. Array keys can be in form
     *                            of <header_name>:<parameter_name>
     *
     * @return mixed True on success or PEAR_Error object
     */
    public function addAttachment($file,
        $c_type      = 'application/octet-stream',
        $name        = '',
        $isfile      = true,
        $encoding    = 'base64',
        $disposition = 'attachment',
        $charset     = '',
        $language    = '',
        $location    = '',
        $n_encoding  = null,
        $f_encoding  = null,
        $description = '',
        $h_charset   = null,
        $add_headers = array()
    ) {
        if ($file instanceof Mail_mimePart) {
            $this->parts[] = $file;
            return true;
        }

        $bodyfile = null;

        if ($isfile) {
            // Don't load file into memory
            if ($this->build_params['delay_file_io']) {
                $filedata = null;
                $bodyfile = $file;
            } else {
                if (self::isError($filedata = $this->file2str($file))) {
                    return $filedata;
                }
            }
            // Force the name the user supplied, otherwise use $file
            $filename = ($name ? $name : $this->basename($file));
        } else {
            $filedata = $file;
            $filename = $name;
        }

        if (!strlen($filename)) {
            $msg = "The supplied filename for the attachment can't be empty";
            return self::raiseError($msg);
        }

        $this->parts[] = array(
            'body'        => $filedata,
            'body_file'   => $bodyfile,
            'name'        => $filename,
            'c_type'      => $c_type,
            'charset'     => $charset,
            'encoding'    => $encoding,
            'language'    => $language,
            'location'    => $location,
            'disposition' => $disposition,
            'description' => $description,
            'add_headers' => $add_headers,
            'name_encoding'     => $n_encoding,
            'filename_encoding' => $f_encoding,
            'headers_charset'   => $h_charset,
        );

        return true;
    }

    /**
     * Checks if the current message has many parts
     *
     * @return bool True if the message has many parts, False otherwise.
     * @since  1.9.0
     */
    public function isMultipart()
    {
        return count($this->parts) > 0 || count($this->html_images) > 0
            || (strlen($this->htmlbody) > 0 && strlen($this->txtbody) > 0);
    }

    /**
     * Get the contents of the given file name as string
     *
     * @param string $file_name Path of file to process
     *
     * @return string Contents of $file_name
     */
    protected function file2str($file_name)
    {
        // Check state of file and raise an error properly
        if (!file_exists($file_name)) {
            return self::raiseError('File not found: ' . $file_name);
        }
        if (!is_file($file_name)) {
            return self::raiseError('Not a regular file: ' . $file_name);
        }
        if (!is_readable($file_name)) {
            return self::raiseError('File is not readable: ' . $file_name);
        }

        // Temporarily reset magic_quotes_runtime and read file contents
        if (version_compare(PHP_VERSION, '5.4.0', '<')) {
            $magic_quotes = @ini_set('magic_quotes_runtime', 0);
        }

        $cont = file_get_contents($file_name);

        if (isset($magic_quotes)) {
            @ini_set('magic_quotes_runtime', $magic_quotes);
        }

        return $cont;
    }

    /**
     * Adds a text subpart to the mimePart object and
     * returns it during the build process.
     *
     * @param mixed $obj The object to add the part to, or
     *                   anything else if a new object is to be created.
     *
     * @return object The text mimePart object
     */
    protected function addTextPart($obj = null)
    {
        return $this->addBodyPart($obj, $this->txtbody, 'text/plain', 'text');
    }

    /**
     * Adds a html subpart to the mimePart object and
     * returns it during the build process.
     *
     * @param mixed $obj The object to add the part to, or
     *                   anything else if a new object is to be created.
     *
     * @return object The html mimePart object
     */
    protected function addHtmlPart($obj = null)
    {
        return $this->addBodyPart($obj, $this->htmlbody, 'text/html', 'html');
    }

    /**
     * Adds a calendar subpart to the mimePart object and
     * returns it during the build process.
     *
     * @param mixed $obj The object to add the part to, or
     *                   anything else if a new object is to be created.
     *
     * @return object The text mimePart object
     */
    protected function addCalendarPart($obj = null)
    {
        $ctype = 'text/calendar; method='. $this->build_params['calendar_method'];

        return $this->addBodyPart($obj, $this->calbody, $ctype, 'calendar');
    }

    /**
     * Creates a new mimePart object, using multipart/mixed as
     * the initial content-type and returns it during the
     * build process.
     *
     * @param array $params Additional part parameters
     *
     * @return object The multipart/mixed mimePart object
     */
    protected function addMixedPart($params = array())
    {
        $params['content_type'] = 'multipart/mixed';
        $params['eol']          = $this->build_params['eol'];

        // Create empty multipart/mixed Mail_mimePart object to return
        return new Mail_mimePart('', $params);
    }

    /**
     * Adds a multipart/alternative part to a mimePart
     * object (or creates one), and returns it during
     * the build process.
     *
     * @param mixed $obj The object to add the part to, or
     *                   anything else if a new object is to be created.
     *
     * @return object The multipart/mixed mimePart object
     */
    protected function addAlternativePart($obj = null)
    {
        $params['content_type'] = 'multipart/alternative';
        $params['eol']          = $this->build_params['eol'];

        if (is_object($obj)) {
            $ret = $obj->addSubpart('', $params);
        } else {
            $ret = new Mail_mimePart('', $params);
        }

        return $ret;
    }

    /**
     * Adds a multipart/related part to a mimePart
     * object (or creates one), and returns it during
     * the build process.
     *
     * @param mixed $obj The object to add the part to, or
     *                   anything else if a new object is to be created
     *
     * @return object The multipart/mixed mimePart object
     */
    protected function addRelatedPart($obj = null)
    {
        $params['content_type'] = 'multipart/related';
        $params['eol']          = $this->build_params['eol'];

        if (is_object($obj)) {
            $ret = $obj->addSubpart('', $params);
        } else {
            $ret = new Mail_mimePart('', $params);
        }

        return $ret;
    }

    /**
     * Adds an html image subpart to a mimePart object
     * and returns it during the build process.
     *
     * @param object $obj   The mimePart to add the image to
     * @param array  $value The image information
     *
     * @return object The image mimePart object
     */
    protected function addHtmlImagePart($obj, $value)
    {
        $params['content_type'] = $value['c_type'];
        $params['encoding']     = 'base64';
        $params['disposition']  = 'inline';
        $params['filename']     = $value['name'];
        $params['cid']          = $value['cid'];
        $params['body_file']    = $value['body_file'];
        $params['eol']          = $this->build_params['eol'];

        if (!empty($value['name_encoding'])) {
            $params['name_encoding'] = $value['name_encoding'];
        }
        if (!empty($value['filename_encoding'])) {
            $params['filename_encoding'] = $value['filename_encoding'];
        }

        return $obj->addSubpart($value['body'], $params);
    }

    /**
     * Adds an attachment subpart to a mimePart object
     * and returns it during the build process.
     *
     * @param object $obj   The mimePart to add the image to
     * @param mixed  $value The attachment information array or Mail_mimePart object
     *
     * @return object The image mimePart object
     */
    protected function addAttachmentPart($obj, $value)
    {
        if ($value instanceof Mail_mimePart) {
            return $obj->addSubpart($value);
        }

        $params['eol']          = $this->build_params['eol'];
        $params['filename']     = $value['name'];
        $params['encoding']     = $value['encoding'];
        $params['content_type'] = $value['c_type'];
        $params['body_file']    = $value['body_file'];
        $params['disposition']  = isset($value['disposition']) ?
                                  $value['disposition'] : 'attachment';

        // content charset
        if (!empty($value['charset'])) {
            $params['charset'] = $value['charset'];
        }
        // headers charset (filename, description)
        if (!empty($value['headers_charset'])) {
            $params['headers_charset'] = $value['headers_charset'];
        }
        if (!empty($value['language'])) {
            $params['language'] = $value['language'];
        }
        if (!empty($value['location'])) {
            $params['location'] = $value['location'];
        }
        if (!empty($value['name_encoding'])) {
            $params['name_encoding'] = $value['name_encoding'];
        }
        if (!empty($value['filename_encoding'])) {
            $params['filename_encoding'] = $value['filename_encoding'];
        }
        if (!empty($value['description'])) {
            $params['description'] = $value['description'];
        }
        if (is_array($value['add_headers'])) {
            $params['headers'] = $value['add_headers'];
        }

        return $obj->addSubpart($value['body'], $params);
    }

    /**
     * Returns the complete e-mail, ready to send using an alternative
     * mail delivery method. Note that only the mailpart that is made
     * with Mail_Mime is created. This means that,
     * YOU WILL HAVE NO TO: HEADERS UNLESS YOU SET IT YOURSELF
     * using the $headers parameter!
     *
     * @param string $separation The separation between these two parts.
     * @param array  $params     The Build parameters passed to the
     *                           get() function. See get() for more info.
     * @param array  $headers    The extra headers that should be passed
     *                           to the headers() method.
     *                           See that function for more info.
     * @param bool   $overwrite  Overwrite the existing headers with new.
     *
     * @return mixed The complete e-mail or PEAR error object
     */
    public function getMessage($separation = null, $params = null, $headers = null,
        $overwrite = false
    ) {
        if ($separation === null) {
            $separation = $this->build_params['eol'];
        }

        $body = $this->get($params);

        if (self::isError($body)) {
            return $body;
        }

        return $this->txtHeaders($headers, $overwrite) . $separation . $body;
    }

    /**
     * Returns the complete e-mail body, ready to send using an alternative
     * mail delivery method.
     *
     * @param array $params The Build parameters passed to the
     *                      get() method. See get() for more info.
     *
     * @return mixed The e-mail body or PEAR error object
     * @since  1.6.0
     */
    public function getMessageBody($params = null)
    {
        return $this->get($params, null, true);
    }

    /**
     * Writes (appends) the complete e-mail into file.
     *
     * @param string $filename  Output file location
     * @param array  $params    The Build parameters passed to the
     *                          get() method. See get() for more info.
     * @param array  $headers   The extra headers that should be passed
     *                          to the headers() function.
     *                          See that function for more info.
     * @param bool   $overwrite Overwrite the existing headers with new.
     *
     * @return mixed True or PEAR error object
     * @since  1.6.0
     */
    public function saveMessage($filename, $params = null, $headers = null, $overwrite = false)
    {
        // Check state of file and raise an error properly
        if (file_exists($filename) && !is_writable($filename)) {
            return self::raiseError('File is not writable: ' . $filename);
        }

        // Temporarily reset magic_quotes_runtime and read file contents
        if (version_compare(PHP_VERSION, '5.4.0', '<')) {
            $magic_quotes = @ini_set('magic_quotes_runtime', 0);
        }

        if (!($fh = fopen($filename, 'ab'))) {
            return self::raiseError('Unable to open file: ' . $filename);
        }

        // Write message headers into file (skipping Content-* headers)
        $head = $this->txtHeaders($headers, $overwrite, true);
        if (fwrite($fh, $head) === false) {
            return self::raiseError('Error writing to file: ' . $filename);
        }

        fclose($fh);

        if (isset($magic_quotes)) {
            @ini_set('magic_quotes_runtime', $magic_quotes);
        }

        // Write the rest of the message into file
        $res = $this->get($params, $filename);

        return $res ? $res : true;
    }

    /**
     * Writes (appends) the complete e-mail body into file or stream.
     *
     * @param mixed $filename Output filename or file pointer where to save
     *                        the message instead of returning it
     * @param array $params   The Build parameters passed to the
     *                        get() method. See get() for more info.
     *
     * @return mixed True or PEAR error object
     * @since  1.6.0
     */
    public function saveMessageBody($filename, $params = null)
    {
        if (!is_resource($filename)) {
            // Check state of file and raise an error properly
            if (!file_exists($filename) || !is_writable($filename)) {
                return self::raiseError('File is not writable: ' . $filename);
            }

            if (!($fh = fopen($filename, 'ab'))) {
                return self::raiseError('Unable to open file: ' . $filename);
            }
        } else {
            $fh = $filename;
        }

        // Temporarily reset magic_quotes_runtime and read file contents
        if (version_compare(PHP_VERSION, '5.4.0', '<')) {
            $magic_quotes = @ini_set('magic_quotes_runtime', 0);
        }

        // Write the rest of the message into file
        $res = $this->get($params, $fh, true);

        if (!is_resource($filename)) {
            fclose($fh);
        }

        if (isset($magic_quotes)) {
            @ini_set('magic_quotes_runtime', $magic_quotes);
        }

        return $res ? $res : true;
    }

    /**
     * Builds the multipart message from the list ($this->parts) and
     * returns the mime content.
     *
     * @param array   $params    Build parameters that change the way the email
     *                           is built. Should be associative. See $_build_params.
     * @param mixed   $filename  Output filename or file pointer where to save
     *                           the message instead of returning it
     * @param boolean $skip_head True if you want to return/save only the message
     *                           without headers
     *
     * @return mixed The MIME message content string, null or PEAR error object
     */
    public function get($params = null, $filename = null, $skip_head = false)
    {
        if (!empty($params) && is_array($params)) {
            $this->build_params = array_merge($this->build_params, $params);
        }

        if (isset($this->headers['From'])) {
            // Bug #11381: Illegal characters in domain ID
            if (preg_match('#(@[0-9a-zA-Z\-\.]+)#', $this->headers['From'], $matches)) {
                $domainID = $matches[1];
            } else {
                $domainID = '@localhost';
            }

            foreach ($this->html_images as $i => $img) {
                $cid = $this->html_images[$i]['cid'];
                if (!preg_match('#'.preg_quote($domainID).'$#', $cid)) {
                    $this->html_images[$i]['cid'] = $cid . $domainID;
                }
            }
        }

        if (count($this->html_images) && strlen($this->htmlbody) > 0) {
            foreach ($this->html_images as $key => $value) {
                $rval  = preg_quote($value['name'], '#');
                $regex = array(
                    '#(\s)((?i)src|background|href(?-i))\s*=\s*(["\']?)' . $rval . '\3#',
                    '#(?i)url(?-i)\(\s*(["\']?)' . $rval . '\1\s*\)#',
                );

                $rep = array(
                    '\1\2=\3cid:' . $value['cid'] .'\3',
                    'url(\1cid:' . $value['cid'] . '\1)',
                );

                $this->htmlbody = preg_replace($regex, $rep, $this->htmlbody);
                $this->html_images[$key]['name']
                    = $this->basename($this->html_images[$key]['name']);
            }
        }

        $this->checkParams();

        $message = $this->buildBodyPart();

        if (!isset($message)) {
            return null;
        }

        // Use saved boundary
        if (!empty($this->build_params['boundary'])) {
            $boundary = $this->build_params['boundary'];
        } else {
            $boundary = null;
        }

        // Write output to file
        if ($filename) {
            // Append mimePart message headers and body into file
            $headers = $message->encodeToFile($filename, $boundary, $skip_head);
            if (self::isError($headers)) {
                return $headers;
            }
            $this->headers = array_merge($this->headers, $headers);
        } else {
            $output = $message->encode($boundary, $skip_head);
            if (self::isError($output)) {
                return $output;
            }
            $this->headers = array_merge($this->headers, $output['headers']);
        }

        // remember the boundary used, in case we'd handle headers() call later
        if (empty($boundary) && !empty($this->headers['Content-Type'])) {
            if (preg_match('/boundary="([^"]+)/', $this->headers['Content-Type'], $m)) {
                $this->build_params['boundary'] = $m[1];
            }
        }

        return $filename ? null : $output['body'];
    }

    /**
     * Builds the main body MIME part for the email body. It will add a mixed part
     * if attachments are found.  If no attachments are found  it will return an
     * alternative part if several body texts are found (text, html, calendar),
     * or a single part if only one body text is found.
     *
     * @return Mail_mimePart|null The corresponding part for the body or null.
     *
     * @see buildAlternativeParts
     * @see buildHtmlParts
     */
    protected function buildBodyPart()
    {
        $parts_count  = count($this->parts);
        $mixed_params = array('preamble' => $this->build_params['preamble']);
        $message      = null;

        if ($parts_count > 0) {
            $message = $this->addMixedPart($mixed_params);
            $this->buildAlternativeParts($message, null);
            for ($i = 0; $i < $parts_count; $i++) {
                $this->addAttachmentPart($message, $this->parts[$i]);
            }
        } else {
            $message = $this->buildAlternativeParts(null, $mixed_params);
        }

        return $message;
    }

    /**
     * Builds a single text, html, or calendar part only if one of them is found.
     * If two or more parts are found, then an alternative part containing them is built.
     *
     * @param Mail_mimePart|null $parent_part  The parent mime part to add
     *                                         the part or null
     * @param array              $mixed_params The needed params to create the
     *                                         part when no parent_part is
     *                                         received.
     *
     * @return null|object The main part built inside the method. It will be an
     *                     alternative part or text, html, or calendar part.
     *                     Null if no body texts are found.
     */
    protected function buildAlternativeParts($parent_part, $mixed_params = null)
    {
        $html               = strlen($this->htmlbody) > 0;
        $calendar           = strlen($this->calbody) > 0;
        $has_text           = strlen($this->txtbody) > 0;
        $alternatives_count = $html + $calendar + $has_text;

        if ($alternatives_count > 1) {
            $alt_part = $this->addAlternativePart($parent_part ? $parent_part : $mixed_params);
        } else {
            $alt_part = null;
        }

        $dest_part = $alt_part ? $alt_part : $parent_part;
        $part = null;

        if ($has_text) {
            $part = $this->addTextPart($dest_part);
        }

        if ($html) {
            $part = $this->buildHtmlParts($dest_part);
        }

        if ($calendar) {
            $part = $this->addCalendarPart($dest_part);
        }

        return $dest_part ? $dest_part : $part;
    }

    /**
     * Builds html part as a single part or inside a related part with the html
     * images thar were found.
     *
     * @param Mail_mimePart|null $parent_part The object to add the part to,
     *                                        or anything else if a new object
     *                                        is to be created.
     *
     * @return Mail_mimePart|null The created part or null if no htmlbody found.
     */
    protected function buildHtmlParts($parent_part)
    {
        if (!strlen($this->htmlbody)) {
            return null;
        }

        $count_html_images = count($this->html_images);

        if ($count_html_images > 0) {
            $part = $this->addRelatedPart($parent_part);
            $this->addHtmlPart($part);
        } else {
            $part = $this->addHtmlPart($parent_part);
        }

        for ($i = 0; $i < $count_html_images; $i++) {
            $this->addHtmlImagePart($part, $this->html_images[$i]);
        }

        return $part;
    }

    /**
     * Returns an array with the headers needed to prepend to the email
     * (MIME-Version and Content-Type). Format of argument is:
     * $array['header-name'] = 'header-value';
     *
     * @param array $xtra_headers Assoc array with any extra headers (optional)
     *                            (Don't set Content-Type for multipart messages here!)
     * @param bool  $overwrite    Overwrite already existing headers.
     * @param bool  $skip_content Don't return content headers: Content-Type,
     *                            Content-Disposition and Content-Transfer-Encoding
     *
     * @return array Assoc array with the mime headers
     */
    public function headers($xtra_headers = null, $overwrite = false, $skip_content = false)
    {
        // Add mime version header
        $headers['MIME-Version'] = '1.0';

        if (!empty($xtra_headers)) {
            $headers = array_merge($headers, $xtra_headers);
        }

        if ($overwrite) {
            $this->headers = array_merge($this->headers, $headers);
        } else {
            $this->headers = array_merge($headers, $this->headers);
        }

        // Always reset Content-Type/Content-Transfer-Encoding headers
        // In case the message structure changed in meantime
        unset($this->headers['Content-Type']);
        unset($this->headers['Content-Transfer-Encoding']);
        unset($this->headers['Content-Disposition']);

        $this->headers = array_merge($this->headers, $this->contentHeaders());

        $headers = $this->headers;

        if ($skip_content) {
            unset($headers['Content-Type']);
            unset($headers['Content-Transfer-Encoding']);
            unset($headers['Content-Disposition']);
        } else if (!empty($this->build_params['ctype'])) {
            $headers['Content-Type'] = $this->build_params['ctype'];
        }

        return $this->encodeHeaders($headers);
    }

    /**
     * Get the text version of the headers
     * (usefull if you want to use the PHP mail() function)
     *
     * @param array $xtra_headers Assoc array with any extra headers (optional)
     *                            (Don't set Content-Type for multipart messages here!)
     * @param bool  $overwrite    Overwrite the existing headers with new.
     * @param bool  $skip_content Don't return content headers: Content-Type,
     *                            Content-Disposition and Content-Transfer-Encoding
     *
     * @return string Plain text headers
     */
    public function txtHeaders($xtra_headers = null, $overwrite = false, $skip_content = false)
    {
        $headers = $this->headers($xtra_headers, $overwrite, $skip_content);

        // Place Received: headers at the beginning of the message
        // Spam detectors often flag messages with it after the Subject: as spam
        if (isset($headers['Received'])) {
            $received = $headers['Received'];
            unset($headers['Received']);
            $headers = array('Received' => $received) + $headers;
        }

        $ret = '';
        $eol = $this->build_params['eol'];

        foreach ($headers as $key => $val) {
            if (is_array($val)) {
                foreach ($val as $value) {
                    $ret .= "$key: $value" . $eol;
                }
            } else {
                $ret .= "$key: $val" . $eol;
            }
        }

        return $ret;
    }

    /**
     * Sets message Content-Type header.
     * Use it to build messages with various content-types e.g. miltipart/raport
     * not supported by contentHeaders() function.
     *
     * @param string $type   Type name
     * @param array  $params Hash array of header parameters
     *
     * @return void
     * @since  1.7.0
     */
    public function setContentType($type, $params = array())
    {
        $header = $type;

        $eol = !empty($this->build_params['eol']) ? $this->build_params['eol'] : "\r\n";

        // add parameters
        $token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#';

        if (is_array($params)) {
            foreach ($params as $name => $value) {
                if ($name == 'boundary') {
                    $this->build_params['boundary'] = $value;
                } else if (!preg_match($token_regexp, $value)) {
                    $header .= ";$eol $name=$value";
                } else {
                    $value = addcslashes($value, '\\"');
                    $header .= ";$eol $name=\"$value\"";
                }
            }
        }

        // add required boundary parameter if not defined
        if (stripos($type, 'multipart/') === 0) {
            if (empty($this->build_params['boundary'])) {
                $this->build_params['boundary'] = '=_' . md5(rand() . microtime());
            }

            $header .= ";$eol boundary=\"".$this->build_params['boundary']."\"";
        }

        $this->build_params['ctype'] = $header;
    }

    /**
     * Sets the Subject header
     *
     * @param string $subject String to set the subject to.
     *
     * @return void
     */
    public function setSubject($subject)
    {
        $this->headers['Subject'] = $subject;
    }

    /**
     * Set an email to the From (the sender) header
     *
     * @param string $email The email address to use
     *
     * @return void
     */
    public function setFrom($email)
    {
        $this->headers['From'] = $email;
    }

    /**
     * Add an email to the To header
     * (multiple calls to this method are allowed)
     *
     * @param string $email The email direction to add
     *
     * @return void
     */
    public function addTo($email)
    {
        if (isset($this->headers['To'])) {
            $this->headers['To'] .= ", $email";
        } else {
            $this->headers['To'] = $email;
        }
    }

    /**
     * Add an email to the Cc (carbon copy) header
     * (multiple calls to this method are allowed)
     *
     * @param string $email The email direction to add
     *
     * @return void
     */
    public function addCc($email)
    {
        if (isset($this->headers['Cc'])) {
            $this->headers['Cc'] .= ", $email";
        } else {
            $this->headers['Cc'] = $email;
        }
    }

    /**
     * Add an email to the Bcc (blank carbon copy) header
     * (multiple calls to this method are allowed)
     *
     * @param string $email The email direction to add
     *
     * @return void
     */
    public function addBcc($email)
    {
        if (isset($this->headers['Bcc'])) {
            $this->headers['Bcc'] .= ", $email";
        } else {
            $this->headers['Bcc'] = $email;
        }
    }

    /**
     * Since the PHP send function requires you to specify
     * recipients (To: header) separately from the other
     * headers, the To: header is not properly encoded.
     * To fix this, you can use this public method to encode
     * your recipients before sending to the send function.
     *
     * @param string $recipients A comma-delimited list of recipients
     *
     * @return string Encoded data
     */
    public function encodeRecipients($recipients)
    {
        $input  = array('To' => $recipients);
        $retval = $this->encodeHeaders($input);

        return $retval['To'] ;
    }

    /**
     * Encodes headers as per RFC2047
     *
     * @param array $input  The header data to encode
     * @param array $params Extra build parameters
     *
     * @return array Encoded data
     */
    protected function encodeHeaders($input, $params = array())
    {
        $build_params = $this->build_params;

        if (!empty($params)) {
            $build_params = array_merge($build_params, $params);
        }

        foreach ($input as $hdr_name => $hdr_value) {
            if (is_array($hdr_value)) {
                foreach ($hdr_value as $idx => $value) {
                    $input[$hdr_name][$idx] = $this->encodeHeader(
                        $hdr_name, $value,
                        $build_params['head_charset'], $build_params['head_encoding']
                    );
                }
            } else if ($hdr_value !== null) {
                $input[$hdr_name] = $this->encodeHeader(
                    $hdr_name, $hdr_value,
                    $build_params['head_charset'], $build_params['head_encoding']
                );
            } else {
                unset($input[$hdr_name]);
            }
        }

        return $input;
    }

    /**
     * Encodes a header as per RFC2047
     *
     * @param string $name     The header name
     * @param string $value    The header data to encode
     * @param string $charset  Character set name
     * @param string $encoding Encoding name (base64 or quoted-printable)
     *
     * @return string Encoded header data (without a name)
     * @since  1.5.3
     */
    public function encodeHeader($name, $value, $charset, $encoding)
    {
        return Mail_mimePart::encodeHeader(
            $name, $value, $charset, $encoding, $this->build_params['eol']
        );
    }

    /**
     * Get file's basename (locale independent)
     *
     * @param string $filename Filename
     *
     * @return string Basename
     */
    protected function basename($filename)
    {
        // basename() is not unicode safe and locale dependent
        if (stristr(PHP_OS, 'win') || stristr(PHP_OS, 'netware')) {
            return preg_replace('/^.*[\\\\\\/]/', '', $filename);
        } else {
            return preg_replace('/^.*[\/]/', '', $filename);
        }
    }

    /**
     * Get Content-Type and Content-Transfer-Encoding headers of the message
     *
     * @return array Headers array
     */
    protected function contentHeaders()
    {
        $attachments      = count($this->parts) > 0;
        $html_images      = count($this->html_images) > 0;
        $html             = strlen($this->htmlbody) > 0;
        $calendar         = strlen($this->calbody) > 0;
        $has_text         = strlen($this->txtbody) > 0;
        $has_alternatives = ($html + $calendar + $has_text) > 1;
        $headers          = array();

        // See get()
        switch (true) {
        case $has_text && !$attachments && !$has_alternatives:
            $headers['Content-Type'] = 'text/plain';
            break;

        case $html && !$html_images && !$attachments && !$has_alternatives:
            $headers['Content-Type'] = 'text/html';
            break;

        case $html && $html_images && !$attachments && !$has_alternatives:
            $headers['Content-Type'] = 'multipart/related';
            break;

        case $calendar && !$attachments && !$has_alternatives:
            $headers['Content-Type'] = 'text/calendar';
            break;

        case $has_alternatives && !$attachments:
            $headers['Content-Type'] = 'multipart/alternative';
            break;

        case $attachments:
            $headers['Content-Type'] = 'multipart/mixed';
            break;
        }

        // Note: This is outside of the above switch construct to workaround
        // opcache bug: https://bugzilla.opensuse.org/show_bug.cgi?id=1166235
        if (empty($headers)) {
            return $headers;
        }

        $this->checkParams();

        $eol = !empty($this->build_params['eol'])
            ? $this->build_params['eol'] : "\r\n";

        if ($headers['Content-Type'] == 'text/plain') {
            // single-part message: add charset and encoding
            if ($this->build_params['text_charset']) {
                $charset = 'charset=' . $this->build_params['text_charset'];
                // place charset parameter in the same line, if possible
                // 26 = strlen("Content-Type: text/plain; ")
                $headers['Content-Type']
                    .= (strlen($charset) + 26 <= 76) ? "; $charset" : ";$eol $charset";
            }

            $headers['Content-Transfer-Encoding']
                = $this->build_params['text_encoding'];
        } else if ($headers['Content-Type'] == 'text/html') {
            // single-part message: add charset and encoding
            if ($this->build_params['html_charset']) {
                $charset = 'charset=' . $this->build_params['html_charset'];
                // place charset parameter in the same line, if possible
                $headers['Content-Type']
                    .= (strlen($charset) + 25 <= 76) ? "; $charset" : ";$eol $charset";
            }
            $headers['Content-Transfer-Encoding']
                = $this->build_params['html_encoding'];
        } else if ($headers['Content-Type'] == 'text/calendar') {
            // single-part message: add charset and encoding
            if ($this->build_params['calendar_charset']) {
                $charset = 'charset=' . $this->build_params['calendar_charset'];
                $headers['Content-Type'] .= "; $charset";
            }

            if ($this->build_params['calendar_method']) {
                $method = 'method=' . $this->build_params['calendar_method'];
                $headers['Content-Type'] .= "; $method";
            }

            $headers['Content-Transfer-Encoding']
                = $this->build_params['calendar_encoding'];
        } else {
            // multipart message: and boundary
            if (!empty($this->build_params['boundary'])) {
                $boundary = $this->build_params['boundary'];
            } else if (!empty($this->headers['Content-Type'])
                && preg_match('/boundary="([^"]+)"/', $this->headers['Content-Type'], $m)
            ) {
                $boundary = $m[1];
            } else {
                $boundary = '=_' . md5(rand() . microtime());
            }

            $this->build_params['boundary'] = $boundary;
            $headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";
        }

        return $headers;
    }

    /**
     * Validate and set build parameters
     *
     * @return void
     */
    protected function checkParams()
    {
        $encodings = array('7bit', '8bit', 'base64', 'quoted-printable');

        $this->build_params['text_encoding']
            = strtolower($this->build_params['text_encoding']);
        $this->build_params['html_encoding']
            = strtolower($this->build_params['html_encoding']);
        $this->build_params['calendar_encoding']
            = strtolower($this->build_params['calendar_encoding']);

        if (!in_array($this->build_params['text_encoding'], $encodings)) {
            $this->build_params['text_encoding'] = '7bit';
        }
        if (!in_array($this->build_params['html_encoding'], $encodings)) {
            $this->build_params['html_encoding'] = '7bit';
        }
        if (!in_array($this->build_params['calendar_encoding'], $encodings)) {
            $this->build_params['calendar_encoding'] = '7bit';
        }

        // text body
        if ($this->build_params['text_encoding'] == '7bit'
            && !preg_match('/ascii/i', $this->build_params['text_charset'])
            && preg_match('/[^\x00-\x7F]/', $this->txtbody)
        ) {
            $this->build_params['text_encoding'] = 'quoted-printable';
        }
        // html body
        if ($this->build_params['html_encoding'] == '7bit'
            && !preg_match('/ascii/i', $this->build_params['html_charset'])
            && preg_match('/[^\x00-\x7F]/', $this->htmlbody)
        ) {
            $this->build_params['html_encoding'] = 'quoted-printable';
        }
        // calendar body
        if ($this->build_params['calendar_encoding'] == '7bit'
            && !preg_match('/ascii/i', $this->build_params['calendar_charset'])
            && preg_match('/[^\x00-\x7F]/', $this->calbody)
        ) {
            $this->build_params['calendar_encoding'] = 'quoted-printable';
        }
    }

    /**
     * Set body of specified message part
     *
     * @param string $type   One of: txtbody, calbody, htmlbody
     * @param string $data   Either a string or the file name with the contents
     * @param bool   $isfile If true the first param should be treated
     *                       as a file name, else as a string (default)
     * @param bool   $append If true the text or file is appended to
     *                       the existing body, else the old body is
     *                       overwritten
     *
     * @return mixed True on success or PEAR_Error object
     */
    protected function setBody($type, $data, $isfile = false, $append = false)
    {
        if ($isfile) {
            $data = $this->file2str($data);
            if (self::isError($data)) {
                return $data;
            }
        }

        if (!$append) {
            $this->{$type} = $data;
        } else {
            $this->{$type} .= $data;
        }

        return true;
    }

    /**
     * Adds a subpart to the mimePart object and
     * returns it during the build process.
     *
     * @param mixed  $obj   The object to add the part to, or
     *                      anything else if a new object is to be created.
     * @param string $body  Part body
     * @param string $ctype Part content type
     * @param string $type  Internal part type
     *
     * @return object The mimePart object
     */
    protected function addBodyPart($obj, $body, $ctype, $type)
    {
        $params['content_type'] = $ctype;
        $params['encoding']     = $this->build_params[$type . '_encoding'];
        $params['charset']      = $this->build_params[$type . '_charset'];
        $params['eol']          = $this->build_params['eol'];

        if (is_object($obj)) {
            $ret = $obj->addSubpart($body, $params);
        } else {
            $ret = new Mail_mimePart($body, $params);
        }

        return $ret;
    }

    /**
     * PEAR::isError implementation
     *
     * @param mixed $data Object
     *
     * @return bool True if object is an instance of PEAR_Error
     */
    public static function isError($data)
    {
        // PEAR::isError() is not PHP 5.4 compatible (see Bug #19473)
        if (is_a($data, 'PEAR_Error')) {
            return true;
        }

        return false;
    }

    /**
     * PEAR::raiseError implementation
     *
     * @param string $message A text error message
     *
     * @return PEAR_Error Instance of PEAR_Error
     */
    public static function raiseError($message)
    {
        // PEAR::raiseError() is not PHP 5.4 compatible
        return new PEAR_Error($message);
    }
}
PK�^�\�؛�J�J�pear/Mail/mimePart.phpnu�[���<?php
/**
 * The Mail_mimePart class is used to create MIME E-mail messages
 *
 * This class enables you to manipulate and build a mime email
 * from the ground up. The Mail_Mime class is a userfriendly api
 * to this class for people who aren't interested in the internals
 * of mime mail.
 * This class however allows full control over the email.
 *
 * Compatible with PHP version 5, 7 and 8
 *
 * LICENSE: This LICENSE is in the BSD license style.
 * Copyright (c) 2002-2003, Richard Heyes <richard@phpguru.org>
 * Copyright (c) 2003-2006, PEAR <pear-group@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the name of the authors, nor the names of its contributors
 *   may be used to endorse or promote products derived from this
 *   software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category  Mail
 * @package   Mail_Mime
 * @author    Richard Heyes  <richard@phpguru.org>
 * @author    Cipriano Groenendal <cipri@php.net>
 * @author    Sean Coates <sean@php.net>
 * @author    Aleksander Machniak <alec@php.net>
 * @copyright 2003-2006 PEAR <pear-group@php.net>
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/Mail_mime
 */

/**
 * Require PEAR
 *
 * This package depends on PEAR to raise errors.
 */
require_once 'PEAR.php';

/**
 * The Mail_mimePart class is used to create MIME E-mail messages
 *
 * This class enables you to manipulate and build a mime email
 * from the ground up. The Mail_Mime class is a userfriendly api
 * to this class for people who aren't interested in the internals
 * of mime mail.
 * This class however allows full control over the email.
 *
 * @category  Mail
 * @package   Mail_Mime
 * @author    Richard Heyes  <richard@phpguru.org>
 * @author    Cipriano Groenendal <cipri@php.net>
 * @author    Sean Coates <sean@php.net>
 * @author    Aleksander Machniak <alec@php.net>
 * @copyright 2003-2006 PEAR <pear-group@php.net>
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/Mail_mime
 */
class Mail_mimePart
{
    /**
     * The encoding type of this part
     *
     * @var string
     */
    protected $encoding;

    /**
     * An array of subparts
     *
     * @var array
     */
    protected $subparts = array();

    /**
     * The output of this part after being built
     *
     * @var string
     */
    protected $encoded;

    /**
     * Headers for this part
     *
     * @var array
     */
    protected $headers = array();

    /**
     * The body of this part (not encoded)
     *
     * @var string
     */
    protected $body;

    /**
     * The location of file with body of this part (not encoded)
     *
     * @var string
     */
    protected $body_file;

    /**
     * The short text of multipart part preamble (RFC2046 5.1.1)
     *
     * @var string
     */
    protected $preamble;

    /**
     * The end-of-line sequence
     *
     * @var string
     */
    protected $eol = "\r\n";


    /**
     * Constructor.
     *
     * Sets up the object.
     *
     * @param string $body   The body of the mime part if any.
     * @param array  $params An associative array of optional parameters:
     *                       - content_type: The content type for this part eg multipart/mixed
     *                       - encoding:  The encoding to use, 7bit, 8bit, base64, or quoted-printable
     *                       - charset: Content character set
     *                       - cid: Content ID to apply
     *                       - disposition: Content disposition, inline or attachment
     *                       - filename: Filename parameter for content disposition
     *                       - description: Content description
     *                       - name_encoding: Encoding of the attachment name (Content-Type)
     *                       By default filenames are encoded using RFC2231
     *                       Here you can set RFC2047 encoding (quoted-printable
     *                       or base64) instead
     *                       - filename_encoding: Encoding of the attachment filename (Content-Disposition)
     *                       See 'name_encoding'
     *                       - headers_charset: Charset of the headers e.g. filename, description.
     *                       If not set, 'charset' will be used
     *                       - eol: End of line sequence. Default: "\r\n"
     *                       - headers: Hash array with additional part headers. Array keys
     *                       can be in form of <header_name>:<parameter_name>
     *                       - body_file: Location of file with part's body (instead of $body)
     *                       - preamble: short text of multipart part preamble (RFC2046 5.1.1)
     */
    public function __construct($body = '', $params = array())
    {
        if (!empty($params['eol'])) {
            $this->eol = $params['eol'];
        } else if (defined('MAIL_MIMEPART_CRLF')) { // backward-copat.
            $this->eol = MAIL_MIMEPART_CRLF;
        }

        // Additional part headers
        if (!empty($params['headers']) && is_array($params['headers'])) {
            $headers = $params['headers'];
        }

        foreach ($params as $key => $value) {
            switch ($key) {
            case 'encoding':
                $this->encoding = $value;
                $headers['Content-Transfer-Encoding'] = $value;
                break;

            case 'cid':
                $headers['Content-ID'] = '<' . $value . '>';
                break;

            case 'location':
                $headers['Content-Location'] = $value;
                break;

            case 'body_file':
                $this->body_file = $value;
                break;

            case 'preamble':
                $this->preamble = $value;
                break;

            // for backward compatibility
            case 'dfilename':
                $params['filename'] = $value;
                break;
            }
        }

        // Default content-type
        if (empty($params['content_type'])) {
            $params['content_type'] = 'text/plain';
        }

        // Content-Type
        $headers['Content-Type'] = $params['content_type'];
        if (!empty($params['charset'])) {
            $charset = "charset={$params['charset']}";
            // place charset parameter in the same line, if possible
            if ((strlen($headers['Content-Type']) + strlen($charset) + 16) <= 76) {
                $headers['Content-Type'] .= '; ';
            } else {
                $headers['Content-Type'] .= ';' . $this->eol . ' ';
            }
            $headers['Content-Type'] .= $charset;

            // Default headers charset
            if (!isset($params['headers_charset'])) {
                $params['headers_charset'] = $params['charset'];
            }
        }

        // header values encoding parameters
        $h_charset  = !empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII';
        $h_language = !empty($params['language']) ? $params['language'] : null;
        $h_encoding = !empty($params['name_encoding']) ? $params['name_encoding'] : null;

        if (!empty($params['filename'])) {
            $headers['Content-Type'] .= ';' . $this->eol;
            $headers['Content-Type'] .= $this->buildHeaderParam(
                'name', $params['filename'], $h_charset, $h_language, $h_encoding
            );
        }

        // Content-Disposition
        if (!empty($params['disposition'])) {
            $headers['Content-Disposition'] = $params['disposition'];
            if (!empty($params['filename'])) {
                $headers['Content-Disposition'] .= ';' . $this->eol;
                $headers['Content-Disposition'] .= $this->buildHeaderParam(
                    'filename', $params['filename'], $h_charset, $h_language,
                    !empty($params['filename_encoding']) ? $params['filename_encoding'] : null
                );
            }

            // add attachment size
            $size = $this->body_file ? filesize($this->body_file) : strlen($body);
            if ($size) {
                $headers['Content-Disposition'] .= ';' . $this->eol . ' size=' . $size;
            }
        }

        if (!empty($params['description'])) {
            $headers['Content-Description'] = $this->encodeHeader(
                'Content-Description', $params['description'], $h_charset, $h_encoding,
                $this->eol
            );
        }

        // Search and add existing headers' parameters
        foreach ($headers as $key => $value) {
            $items = explode(':', $key);
            if (count($items) == 2) {
                $header = $items[0];
                $param  = $items[1];
                if (isset($headers[$header])) {
                    $headers[$header] .= ';' . $this->eol;
                }
                $headers[$header] .= $this->buildHeaderParam(
                    $param, $value, $h_charset, $h_language, $h_encoding
                );
                unset($headers[$key]);
            }
        }

        // Default encoding
        if (!isset($this->encoding)) {
            $this->encoding = '7bit';
        }

        // Assign stuff to member variables
        $this->encoded  = array();
        $this->headers  = $headers;
        $this->body     = $body;
    }

    /**
     * Encodes and returns the email. Also stores
     * it in the encoded member variable
     *
     * @param string $boundary Pre-defined boundary string
     *
     * @return An associative array containing two elements,
     *         body and headers. The headers element is itself
     *         an indexed array. On error returns PEAR error object.
     */
    public function encode($boundary=null)
    {
        $encoded =& $this->encoded;

        if (count($this->subparts)) {
            $boundary = $boundary ? $boundary : '=_' . md5(rand() . microtime());
            $eol = $this->eol;

            $this->headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";

            $encoded['body'] = '';

            if ($this->preamble) {
                $encoded['body'] .= $this->preamble . $eol . $eol;
            }

            for ($i = 0; $i < count($this->subparts); $i++) {
                $encoded['body'] .= '--' . $boundary . $eol;
                $tmp = $this->subparts[$i]->encode();
                if (is_a($tmp, 'PEAR_Error')) {
                    return $tmp;
                }
                foreach ($tmp['headers'] as $key => $value) {
                    $encoded['body'] .= $key . ': ' . $value . $eol;
                }
                $encoded['body'] .= $eol . $tmp['body'] . $eol;
            }

            $encoded['body'] .= '--' . $boundary . '--' . $eol;
        } else if ($this->body) {
            $encoded['body'] = $this->getEncodedData($this->body, $this->encoding);
        } else if ($this->body_file) {
            // Temporarily reset magic_quotes_runtime for file reads and writes
            if (version_compare(PHP_VERSION, '5.4.0', '<')) {
                $magic_quotes = @ini_set('magic_quotes_runtime', 0);
            }
            $body = $this->getEncodedDataFromFile($this->body_file, $this->encoding);
            if (isset($magic_quotes)) {
                @ini_set('magic_quotes_runtime', $magic_quotes);
            }

            if (is_a($body, 'PEAR_Error')) {
                return $body;
            }
            $encoded['body'] = $body;
        } else {
            $encoded['body'] = '';
        }

        // Add headers to $encoded
        $encoded['headers'] =& $this->headers;

        return $encoded;
    }

    /**
     * Encodes and saves the email into file or stream.
     * Data will be appended to the file/stream.
     *
     * @param mixed   $filename  Existing file location
     *                           or file pointer resource
     * @param string  $boundary  Pre-defined boundary string
     * @param boolean $skip_head True if you don't want to save headers
     *
     * @return array An associative array containing message headers
     *               or PEAR error object
     * @since  1.6.0
     */
    public function encodeToFile($filename, $boundary = null, $skip_head = false)
    {
        if (!is_resource($filename)) {
            if (file_exists($filename) && !is_writable($filename)) {
                $err = self::raiseError('File is not writeable: ' . $filename);
                return $err;
            }

            if (!($fh = fopen($filename, 'ab'))) {
                $err = self::raiseError('Unable to open file: ' . $filename);
                return $err;
            }
        } else {
            $fh = $filename;
        }

        // Temporarily reset magic_quotes_runtime for file reads and writes
        if (version_compare(PHP_VERSION, '5.4.0', '<')) {
            $magic_quotes = @ini_set('magic_quotes_runtime', 0);
        }

        $res = $this->encodePartToFile($fh, $boundary, $skip_head);

        if (!is_resource($filename)) {
            fclose($fh);
        }

        if (isset($magic_quotes)) {
            @ini_set('magic_quotes_runtime', $magic_quotes);
        }

        return is_a($res, 'PEAR_Error') ? $res : $this->headers;
    }

    /**
     * Encodes given email part into file
     *
     * @param string  $fh        Output file handle
     * @param string  $boundary  Pre-defined boundary string
     * @param boolean $skip_head True if you don't want to save headers
     *
     * @return array True on sucess or PEAR error object
     */
    protected function encodePartToFile($fh, $boundary = null, $skip_head = false)
    {
        $eol = $this->eol;

        if (count($this->subparts)) {
            $boundary = $boundary ? $boundary : '=_' . md5(rand() . microtime());
            $this->headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";
        }

        if (!$skip_head) {
            foreach ($this->headers as $key => $value) {
                fwrite($fh, $key . ': ' . $value . $eol);
            }
            $f_eol = $eol;
        } else {
            $f_eol = '';
        }

        if (count($this->subparts)) {
            if ($this->preamble) {
                fwrite($fh, $f_eol . $this->preamble . $eol);
                $f_eol = $eol;
            }

            for ($i = 0; $i < count($this->subparts); $i++) {
                fwrite($fh, $f_eol . '--' . $boundary . $eol);
                $res = $this->subparts[$i]->encodePartToFile($fh);
                if (is_a($res, 'PEAR_Error')) {
                    return $res;
                }
                $f_eol = $eol;
            }

            fwrite($fh, $eol . '--' . $boundary . '--' . $eol);
        } else if ($this->body) {
            fwrite($fh, $f_eol);
            fwrite($fh, $this->getEncodedData($this->body, $this->encoding));
        } else if ($this->body_file) {
            fwrite($fh, $f_eol);
            $res = $this->getEncodedDataFromFile(
                $this->body_file, $this->encoding, $fh
            );
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }
        }

        return true;
    }

    /**
     * Adds a subpart to current mime part and returns
     * a reference to it
     *
     * @param mixed $body   The body of the subpart or Mail_mimePart object
     * @param array $params The parameters for the subpart, same
     *                      as the $params argument for constructor
     *
     * @return Mail_mimePart A reference to the part you just added.
     */
    public function addSubpart($body, $params = null)
    {
        if ($body instanceof Mail_mimePart) {
            $part = $body;
        } else {
            $part = new Mail_mimePart($body, $params);
        }

        $this->subparts[] = $part;

        return $part;
    }

    /**
     * Returns encoded data based upon encoding passed to it
     *
     * @param string $data     The data to encode.
     * @param string $encoding The encoding type to use, 7bit, base64,
     *                         or quoted-printable.
     *
     * @return string Encoded data string
     */
    protected function getEncodedData($data, $encoding)
    {
        switch ($encoding) {
        case 'quoted-printable':
            return self::quotedPrintableEncode($data, 76, $this->eol);
            break;

        case 'base64':
            return rtrim(chunk_split(base64_encode($data), 76, $this->eol));
            break;

        case '8bit':
        case '7bit':
        default:
            return $data;
        }
    }

    /**
     * Returns encoded data based upon encoding passed to it
     *
     * @param string   $filename Data file location
     * @param string   $encoding The encoding type to use, 7bit, base64,
     *                           or quoted-printable.
     * @param resource $fh       Output file handle. If set, data will be
     *                           stored into it instead of returning it
     *
     * @return string Encoded data or PEAR error object
     */
    protected function getEncodedDataFromFile($filename, $encoding, $fh = null)
    {
        if (!is_readable($filename)) {
            $err = self::raiseError('Unable to read file: ' . $filename);
            return $err;
        }

        if (!($fd = fopen($filename, 'rb'))) {
            $err = self::raiseError('Could not open file: ' . $filename);
            return $err;
        }

        $data = '';

        switch ($encoding) {
        case 'quoted-printable':
            while (!feof($fd)) {
                $buffer = self::quotedPrintableEncode(fgets($fd), 76, $this->eol);
                if ($fh) {
                    fwrite($fh, $buffer);
                } else {
                    $data .= $buffer;
                }
            }
            break;

        case 'base64':
            while (!feof($fd)) {
                // Should read in a multiple of 57 bytes so that
                // the output is 76 bytes per line. Don't use big chunks
                // because base64 encoding is memory expensive
                $buffer = fread($fd, 57 * 9198); // ca. 0.5 MB
                $buffer = base64_encode($buffer);
                $buffer = chunk_split($buffer, 76, $this->eol);
                if (feof($fd)) {
                    $buffer = rtrim($buffer);
                }

                if ($fh) {
                    fwrite($fh, $buffer);
                } else {
                    $data .= $buffer;
                }
            }
            break;

        case '8bit':
        case '7bit':
        default:
            while (!feof($fd)) {
                $buffer = fread($fd, 1048576); // 1 MB
                if ($fh) {
                    fwrite($fh, $buffer);
                } else {
                    $data .= $buffer;
                }
            }
        }

        fclose($fd);

        if (!$fh) {
            return $data;
        }
    }

    /**
     * Encodes data to quoted-printable standard.
     *
     * @param string $input    The data to encode
     * @param int    $line_max Optional max line length. Should
     *                         not be more than 76 chars
     * @param string $eol      End-of-line sequence. Default: "\r\n"
     *
     * @return string Encoded data
     */
    public static function quotedPrintableEncode($input , $line_max = 76, $eol = "\r\n")
    {
        /*
        // imap_8bit() is extremely fast, but doesn't handle properly some characters
        if (function_exists('imap_8bit') && $line_max == 76) {
            $input = preg_replace('/\r?\n/', "\r\n", $input);
            $input = imap_8bit($input);
            if ($eol != "\r\n") {
                $input = str_replace("\r\n", $eol, $input);
            }
            return $input;
        }
        */
        $lines  = preg_split("/\r?\n/", $input);
        $escape = '=';
        $output = '';

        foreach ($lines as $idx => $line) {
            $newline = '';
            $i = 0;

            while (isset($line[$i])) {
                $char = $line[$i];
                $dec  = ord($char);
                $i++;

                if (($dec == 32) && (!isset($line[$i]))) {
                    // convert space at eol only
                    $char = '=20';
                } elseif ($dec == 9 && isset($line[$i])) {
                    ; // Do nothing if a TAB is not on eol
                } elseif (($dec == 61) || ($dec < 32) || ($dec > 126)) {
                    // Escape unprintable chars
                    $char = $escape . sprintf('%02X', $dec);
                } elseif (($dec == 46) && (($newline == '')
                    || ((strlen($newline) + strlen(".=")) > $line_max
                    && isset($line[$i])))
                ) {
                    // Bug #9722: convert full-stop at bol,
                    // some Windows servers need this, won't break anything (cipri)
                    // Bug #11731: full-stop at bol also needs to be encoded
                    // if this line would push us over the line_max limit.
                    $char = '=2E';
                }

                // EOL is not counted
                if ((strlen($newline) + strlen($char) == $line_max)
                    && !isset($line[$i])
                ) {
                    ; // no soft break is needed if we're the last char
                } elseif ((strlen($newline) + strlen($char)) >= $line_max) {
                    // soft line break; " =\r\n" is okay
                    $output  .= $newline . $escape . $eol;
                    $newline  = '';
                }

                $newline .= $char;
            } // end of for

            $output .= $newline . $eol;
            unset($lines[$idx]);
        }

        // Don't want last crlf
        $output = substr($output, 0, -1 * strlen($eol));

        return $output;
    }

    /**
     * Encodes the parameter of a header.
     *
     * @param string $name      The name of the header-parameter
     * @param string $value     The value of the paramter
     * @param string $charset   The characterset of $value
     * @param string $language  The language used in $value
     * @param string $encoding  Parameter encoding. If not set, parameter value
     *                          is encoded according to RFC2231
     * @param int    $maxLength The maximum length of a line. Defauls to 75
     *
     * @return string
     */
    protected function buildHeaderParam($name, $value, $charset = null,
        $language = null, $encoding = null, $maxLength = 75
    ) {
        // RFC 2045:
        // value needs encoding if contains non-ASCII chars or is longer than 78 chars
        if (!preg_match('#[^\x20-\x7E]#', $value)) {
            $token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D'
                . '\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#';
            if (!preg_match($token_regexp, $value)) {
                // token
                if (strlen($name) + strlen($value) + 3 <= $maxLength) {
                    return " {$name}={$value}";
                }
            } else {
                // quoted-string
                $quoted = addcslashes($value, '\\"');
                if (strlen($name) + strlen($quoted) + 5 <= $maxLength) {
                    return " {$name}=\"{$quoted}\"";
                }
            }
        }

        // RFC2047: use quoted-printable/base64 encoding
        if ($encoding == 'quoted-printable' || $encoding == 'base64') {
            return $this->buildRFC2047Param($name, $value, $charset, $encoding);
        }

        // RFC2231:
        $encValue = preg_replace_callback(
            '/([^\x21\x23\x24\x26\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E])/',
            array($this, 'encodeReplaceCallback'), $value
        );
        $value = "$charset'$language'$encValue";

        $header = " {$name}*={$value}";
        if (strlen($header) <= $maxLength) {
            return $header;
        }

        $preLength = strlen(" {$name}*0*=");
        $maxLength = max(16, $maxLength - $preLength - 3);
        $maxLengthReg = "|(.{0,$maxLength}[^\%][^\%])|";

        $headers = array();
        $headCount = 0;
        while ($value) {
            $matches = array();
            $found = preg_match($maxLengthReg, $value, $matches);
            if ($found) {
                $headers[] = " {$name}*{$headCount}*={$matches[0]}";
                $value = substr($value, strlen($matches[0]));
            } else {
                $headers[] = " {$name}*{$headCount}*={$value}";
                $value = '';
            }
            $headCount++;
        }

        $headers = implode(';' . $this->eol, $headers);
        return $headers;
    }

    /**
     * Encodes header parameter as per RFC2047 if needed
     *
     * @param string $name      The parameter name
     * @param string $value     The parameter value
     * @param string $charset   The parameter charset
     * @param string $encoding  Encoding type (quoted-printable or base64)
     * @param int    $maxLength Encoded parameter max length. Default: 76
     *
     * @return string Parameter line
     */
    protected function buildRFC2047Param($name, $value, $charset,
        $encoding = 'quoted-printable', $maxLength = 76
    ) {
        // WARNING: RFC 2047 says: "An 'encoded-word' MUST NOT be used in
        // parameter of a MIME Content-Type or Content-Disposition field",
        // but... it's supported by many clients/servers
        $quoted = '';

        if ($encoding == 'base64') {
            $value = base64_encode($value);
            $prefix = '=?' . $charset . '?B?';
            $suffix = '?=';

            // 2 x SPACE, 2 x '"', '=', ';'
            $add_len = strlen($prefix . $suffix) + strlen($name) + 6;
            $len = $add_len + strlen($value);

            while ($len > $maxLength) { 
                // We can cut base64-encoded string every 4 characters
                $real_len = floor(($maxLength - $add_len) / 4) * 4;
                $_quote = substr($value, 0, $real_len);
                $value = substr($value, $real_len);

                $quoted .= $prefix . $_quote . $suffix . $this->eol . ' ';
                $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';'
                $len = strlen($value) + $add_len;
            }
            $quoted .= $prefix . $value . $suffix;

        } else {
            // quoted-printable
            $value = $this->encodeQP($value);
            $prefix = '=?' . $charset . '?Q?';
            $suffix = '?=';

            // 2 x SPACE, 2 x '"', '=', ';'
            $add_len = strlen($prefix . $suffix) + strlen($name) + 6;
            $len = $add_len + strlen($value);

            while ($len > $maxLength) {
                $length = $maxLength - $add_len;
                // don't break any encoded letters
                if (preg_match("/^(.{0,$length}[^\=][^\=])/", $value, $matches)) {
                    $_quote = $matches[1];
                }

                $quoted .= $prefix . $_quote . $suffix . $this->eol . ' ';
                $value = substr($value, strlen($_quote));
                $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';'
                $len = strlen($value) + $add_len;
            }

            $quoted .= $prefix . $value . $suffix;
        }

        return " {$name}=\"{$quoted}\"";
    }

    /**
     * Return charset for mbstring functions.
     * Replace ISO-2022-JP with ISO-2022-JP-MS to convert Windows dependent
     * characters.
     *
     * @param string $charset A original charset
     *
     * @return string A charset for mbstring
     * @since  1.10.8
     */
    protected static function mbstringCharset($charset)
    {
        $mb_charset = $charset;

        if ($charset == 'ISO-2022-JP') {
            $mb_charset = 'ISO-2022-JP-MS';
        }

        return $mb_charset;
    }

    /**
     * Encodes a header as per RFC2047
     *
     * @param string $name     The header name
     * @param string $value    The header data to encode
     * @param string $charset  Character set name
     * @param string $encoding Encoding name (base64 or quoted-printable)
     * @param string $eol      End-of-line sequence. Default: "\r\n"
     *
     * @return string Encoded header data (without a name)
     * @since  1.6.1
     */
    public static function encodeHeader($name, $value, $charset = 'ISO-8859-1',
        $encoding = 'quoted-printable', $eol = "\r\n"
    ) {
        // Structured headers
        $comma_headers = array(
            'from', 'to', 'cc', 'bcc', 'sender', 'reply-to',
            'resent-from', 'resent-to', 'resent-cc', 'resent-bcc',
            'resent-sender', 'resent-reply-to',
            'mail-reply-to', 'mail-followup-to',
            'return-receipt-to', 'disposition-notification-to',
        );
        $other_headers = array(
            'references', 'in-reply-to', 'message-id', 'resent-message-id',
        );

        $name = strtolower($name);

        if (in_array($name, $comma_headers)) {
            $separator = ',';
        } else if (in_array($name, $other_headers)) {
            $separator = ' ';
        }

        if (!$charset) {
            $charset = 'ISO-8859-1';
        }

        // exploding quoted strings as well as some regexes below do not
        // work properly with some charset e.g. ISO-2022-JP, we'll use UTF-8
        $mb = $charset != 'UTF-8' && function_exists('mb_convert_encoding');
        $mb_charset = Mail_mimePart::mbstringCharset($charset);

        // Structured header (make sure addr-spec inside is not encoded)
        if (!empty($separator)) {
            // Simple e-mail address regexp
            $email_regexp = '([^\s<]+|("[^\r\n"]+"))@[^\s"]+';

            if ($mb) {
                $value = mb_convert_encoding($value, 'UTF-8', $mb_charset);
            }

            $parts = Mail_mimePart::explodeQuotedString("[\t$separator]", $value);
            $value = '';

            foreach ($parts as $part) {
                $part = preg_replace('/\r?\n[\s\t]*/', $eol . ' ', $part);
                $part = trim($part);

                if (!$part) {
                    continue;
                }
                if ($value) {
                    $value .= $separator == ',' ? $separator . ' ' : ' ';
                } else {
                    $value = $name . ': ';
                }

                // let's find phrase (name) and/or addr-spec
                if (preg_match('/^<' . $email_regexp . '>$/', $part)) {
                    $value .= $part;
                } else if (preg_match('/^' . $email_regexp . '$/', $part)) {
                    // address without brackets and without name
                    $value .= $part;
                } else if (preg_match('/<*' . $email_regexp . '>*$/', $part, $matches)) {
                    // address with name (handle name)
                    $address = $matches[0];
                    $word    = str_replace($address, '', $part);
                    $word    = trim($word);

                    // check if phrase requires quoting
                    if ($word) {
                        // non-ASCII: require encoding
                        if (preg_match('#([^\s\x21-\x7E]){1}#', $word)) {
                            if ($word[0] == '"' && $word[strlen($word)-1] == '"') {
                                // de-quote quoted-string, encoding changes
                                // string to atom
                                $word = substr($word, 1, -1);
                                $word = preg_replace('/\\\\([\\\\"])/', '$1', $word);
                            }
                            if ($mb) {
                                $word = mb_convert_encoding($word, $mb_charset, 'UTF-8');
                            }

                            // find length of last line
                            if (($pos = strrpos($value, $eol)) !== false) {
                                $last_len = strlen($value) - $pos;
                            } else {
                                $last_len = strlen($value);
                            }

                            $word = Mail_mimePart::encodeHeaderValue(
                                $word, $charset, $encoding, $last_len, $eol
                            );
                        } else if (($word[0] != '"' || $word[strlen($word)-1] != '"')
                            && preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $word)
                        ) {
                            // ASCII: quote string if needed
                            $word = '"'.addcslashes($word, '\\"').'"';
                        }
                    }

                    $value .= $word.' '.$address;
                } else {
                    if ($mb) {
                        $part = mb_convert_encoding($part, $mb_charset, 'UTF-8');
                    }
                    // addr-spec not found, don't encode (?)
                    $value .= $part;
                }

                // RFC2822 recommends 78 characters limit, use 76 from RFC2047
                $value = wordwrap($value, 76, $eol . ' ');
            }

            // remove header name prefix (there could be EOL too)
            $value = preg_replace(
                '/^'.$name.':('.preg_quote($eol, '/').')* /', '', $value
            );
        } else {
            // Unstructured header
            // non-ASCII: require encoding
            if (preg_match('#([^\s\x21-\x7E]){1}#', $value)) {
                if ($value[0] == '"' && $value[strlen($value)-1] == '"') {
                    if ($mb) {
                        $value = mb_convert_encoding($value, 'UTF-8', $mb_charset);
                    }
                    // de-quote quoted-string, encoding changes
                    // string to atom
                    $value = substr($value, 1, -1);
                    $value = preg_replace('/\\\\([\\\\"])/', '$1', $value);
                    if ($mb) {
                        $value = mb_convert_encoding($value, $mb_charset, 'UTF-8');
                    }
                }

                $value = Mail_mimePart::encodeHeaderValue(
                    $value, $charset, $encoding, strlen($name) + 2, $eol
                );
            } else if (strlen($name.': '.$value) > 78) {
                // ASCII: check if header line isn't too long and use folding
                $value = preg_replace('/\r?\n[\s\t]*/', $eol . ' ', $value);
                $tmp   = wordwrap($name . ': ' . $value, 78, $eol . ' ');
                $value = preg_replace('/^' . $name . ':\s*/', '', $tmp);
                // hard limit 998 (RFC2822)
                $value = wordwrap($value, 998, $eol . ' ', true);
            }
        }

        return $value;
    }

    /**
     * Explode quoted string
     *
     * @param string $delimiter Delimiter expression string for preg_match()
     * @param string $string    Input string
     *
     * @return array String tokens array
     */
    protected static function explodeQuotedString($delimiter, $string)
    {
        $result = array();
        $strlen = strlen($string);
        $quoted_string = '"(?:[^"\\\\]|\\\\.)*"';

        for ($p=$i=0; $i < $strlen; $i++) {
            if ($string[$i] === '"') {
                $r = preg_match("/$quoted_string/", $string, $matches, 0, $i);
                if (!$r || empty($matches[0])) {
                    break;
                }
                $i += strlen($matches[0]) - 1;
            } else if (preg_match("/$delimiter/", $string[$i])) {
                $result[] = substr($string, $p, $i - $p);
                $p = $i + 1;
            }
        }
        $result[] = substr($string, $p);
        return $result;
    }

    /**
     * Encodes a header value as per RFC2047
     *
     * @param string $value      The header data to encode
     * @param string $charset    Character set name
     * @param string $encoding   Encoding name (base64 or quoted-printable)
     * @param int    $prefix_len Prefix length. Default: 0
     * @param string $eol        End-of-line sequence. Default: "\r\n"
     *
     * @return string Encoded header data
     * @since  1.6.1
     */
    public static function encodeHeaderValue($value, $charset, $encoding, $prefix_len = 0, $eol = "\r\n")
    {
        // #17311: Use multibyte aware method (requires mbstring extension)
        if ($result = Mail_mimePart::encodeMB($value, $charset, $encoding, $prefix_len, $eol)) {
            return $result;
        }

        // Generate the header using the specified params and dynamicly
        // determine the maximum length of such strings.
        // 75 is the value specified in the RFC.
        $encoding = $encoding == 'base64' ? 'B' : 'Q';
        $prefix = '=?' . $charset . '?' . $encoding .'?';
        $suffix = '?=';
        $maxLength = 75 - strlen($prefix . $suffix);
        $maxLength1stLine = $maxLength - $prefix_len;

        if ($encoding == 'B') {
            // Base64 encode the entire string
            $value = base64_encode($value);

            // We can cut base64 every 4 characters, so the real max
            // we can get must be rounded down.
            $maxLength = $maxLength - ($maxLength % 4);
            $maxLength1stLine = $maxLength1stLine - ($maxLength1stLine % 4);

            $cutpoint = $maxLength1stLine;
            $output = '';

            while ($value) {
                // Split translated string at every $maxLength
                $part = substr($value, 0, $cutpoint);
                $value = substr($value, $cutpoint);
                $cutpoint = $maxLength;
                // RFC 2047 specifies that any split header should
                // be separated by a CRLF SPACE.
                if ($output) {
                    $output .= $eol . ' ';
                }
                $output .= $prefix . $part . $suffix;
            }
            $value = $output;
        } else {
            // quoted-printable encoding has been selected
            $value = Mail_mimePart::encodeQP($value);

            // This regexp will break QP-encoded text at every $maxLength
            // but will not break any encoded letters.
            $reg1st = "|(.{0,$maxLength1stLine}[^\=][^\=])|";
            $reg2nd = "|(.{0,$maxLength}[^\=][^\=])|";

            if (strlen($value) > $maxLength1stLine) {
                // Begin with the regexp for the first line.
                $reg = $reg1st;
                $output = '';
                while ($value) {
                    // Split translated string at every $maxLength
                    // But make sure not to break any translated chars.
                    $found = preg_match($reg, $value, $matches);

                    // After this first line, we need to use a different
                    // regexp for the first line.
                    $reg = $reg2nd;

                    // Save the found part and encapsulate it in the
                    // prefix & suffix. Then remove the part from the
                    // $value_out variable.
                    if ($found) {
                        $part = $matches[0];
                        $len = strlen($matches[0]);
                        $value = substr($value, $len);
                    } else {
                        $part = $value;
                        $value = '';
                    }

                    // RFC 2047 specifies that any split header should
                    // be separated by a CRLF SPACE
                    if ($output) {
                        $output .= $eol . ' ';
                    }
                    $output .= $prefix . $part . $suffix;
                }
                $value = $output;
            } else {
                $value = $prefix . $value . $suffix;
            }
        }

        return $value;
    }

    /**
     * Encodes the given string using quoted-printable
     *
     * @param string $str String to encode
     *
     * @return string Encoded string
     * @since  1.6.0
     */
    public static function encodeQP($str)
    {
        // Bug #17226 RFC 2047 restricts some characters
        // if the word is inside a phrase, permitted chars are only:
        // ASCII letters, decimal digits, "!", "*", "+", "-", "/", "=", and "_"

        // "=",  "_",  "?" must be encoded
        $regexp = '/([\x22-\x29\x2C\x2E\x3A-\x40\x5B-\x60\x7B-\x7E\x80-\xFF])/';
        $str = preg_replace_callback(
            $regexp, array('Mail_mimePart', 'qpReplaceCallback'), $str
        );

        return str_replace(' ', '_', $str);
    }

    /**
     * Encodes the given string using base64 or quoted-printable.
     * This method makes sure that encoded-word represents an integral
     * number of characters as per RFC2047.
     *
     * @param string $str        String to encode
     * @param string $charset    Character set name
     * @param string $encoding   Encoding name (base64 or quoted-printable)
     * @param int    $prefix_len Prefix length. Default: 0
     * @param string $eol        End-of-line sequence. Default: "\r\n"
     *
     * @return string Encoded string
     * @since  1.8.0
     */
    public static function encodeMB($str, $charset, $encoding, $prefix_len=0, $eol="\r\n")
    {
        if (!function_exists('mb_substr') || !function_exists('mb_strlen')) {
            return;
        }

        $encoding = $encoding == 'base64' ? 'B' : 'Q';
        // 75 is the value specified in the RFC
        $prefix = '=?' . $charset . '?'.$encoding.'?';
        $suffix = '?=';
        $maxLength = 75 - strlen($prefix . $suffix);
        $mb_charset = Mail_mimePart::mbstringCharset($charset);

        // A multi-octet character may not be split across adjacent encoded-words
        // So, we'll loop over each character
        // mb_stlen() with wrong charset will generate a warning here and return null
        $length      = mb_strlen($str, $mb_charset);
        $result      = '';
        $line_length = $prefix_len;

        if ($encoding == 'B') {
            // base64
            $start = 0;
            $prev  = '';

            for ($i=1; $i<=$length; $i++) {
                // See #17311
                $chunk = mb_substr($str, $start, $i-$start, $mb_charset);
                $chunk = base64_encode($chunk);
                $chunk_len = strlen($chunk);

                if ($line_length + $chunk_len == $maxLength || $i == $length) {
                    if ($result) {
                        $result .= "\n";
                    }
                    $result .= $chunk;
                    $line_length = 0;
                    $start = $i;
                } else if ($line_length + $chunk_len > $maxLength) {
                    if ($result) {
                        $result .= "\n";
                    }
                    if ($prev) {
                        $result .= $prev;
                    }
                    $line_length = 0;
                    $start = $i - 1;
                } else {
                    $prev = $chunk;
                }
            }
        } else {
            // quoted-printable
            // see encodeQP()
            $regexp = '/([\x22-\x29\x2C\x2E\x3A-\x40\x5B-\x60\x7B-\x7E\x80-\xFF])/';

            for ($i=0; $i<=$length; $i++) {
                $char = mb_substr($str, $i, 1, $mb_charset);
                // RFC recommends underline (instead of =20) in place of the space
                // that's one of the reasons why we're not using iconv_mime_encode()
                if ($char == ' ') {
                    $char = '_';
                    $char_len = 1;
                } else {
                    $char = preg_replace_callback(
                        $regexp, array('Mail_mimePart', 'qpReplaceCallback'), $char
                    );
                    $char_len = strlen($char);
                }

                if ($line_length + $char_len > $maxLength) {
                    if ($result) {
                        $result .= "\n";
                    }
                    $line_length = 0;
                }

                $result      .= $char;
                $line_length += $char_len;
            }
        }

        if ($result) {
            $result = $prefix
                .str_replace("\n", $suffix.$eol.' '.$prefix, $result).$suffix;
        }

        return $result;
    }

    /**
     * Callback function to replace extended characters (\x80-xFF) with their
     * ASCII values (RFC2047: quoted-printable)
     *
     * @param array $matches Preg_replace's matches array
     *
     * @return string Encoded character string
     */
    protected static function qpReplaceCallback($matches)
    {
        return sprintf('=%02X', ord($matches[1]));
    }

    /**
     * Callback function to replace extended characters (\x80-xFF) with their
     * ASCII values (RFC2231)
     *
     * @param array $matches Preg_replace's matches array
     *
     * @return string Encoded character string
     */
    protected static function encodeReplaceCallback($matches)
    {
        return sprintf('%%%02X', ord($matches[1]));
    }

    /**
     * PEAR::raiseError implementation
     *
     * @param string $message A text error message
     *
     * @return PEAR_Error Instance of PEAR_Error
     */
    public static function raiseError($message)
    {
        // PEAR::raiseError() is not PHP 5.4 compatible
        return new PEAR_Error($message);
    }
}
PK�^�\x�ع���pear/Mail/mimeDecode.phpnu�[���<?php
/**
 * The Mail_mimeDecode class is used to decode mail/mime messages
 *
 * This class will parse a raw mime email and return
 * the structure. Returned structure is similar to
 * that returned by imap_fetchstructure().
 *
 *  +----------------------------- IMPORTANT ------------------------------+
 *  | Usage of this class compared to native php extensions such as        |
 *  | mailparse or imap, is slow and may be feature deficient. If available|
 *  | you are STRONGLY recommended to use the php extensions.              |
 *  +----------------------------------------------------------------------+
 *
 * Compatible with PHP versions 4 and 5
 *
 * LICENSE: This LICENSE is in the BSD license style.
 * Copyright (c) 2002-2003, Richard Heyes <richard@phpguru.org>
 * Copyright (c) 2003-2006, PEAR <pear-group@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * - Neither the name of the authors, nor the names of its contributors 
 *   may be used to endorse or promote products derived from this 
 *   software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category   Mail
 * @package    Mail_Mime
 * @author     Richard Heyes  <richard@phpguru.org>
 * @author     George Schlossnagle <george@omniti.com>
 * @author     Cipriano Groenendal <cipri@php.net>
 * @author     Sean Coates <sean@php.net>
 * @copyright  2003-2006 PEAR <pear-group@php.net>
 * @license    http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version    CVS: $Id: mimeDecode.php 337165 2015-07-15 09:42:08Z alan_k $
 * @link       http://pear.php.net/package/Mail_mime
 */


/**
 * require PEAR
 *
 * This package depends on PEAR to raise errors.
 */
require_once 'PEAR.php';


/**
 * The Mail_mimeDecode class is used to decode mail/mime messages
 *
 * This class will parse a raw mime email and return the structure.
 * Returned structure is similar to that returned by imap_fetchstructure().
 *
 *  +----------------------------- IMPORTANT ------------------------------+
 *  | Usage of this class compared to native php extensions such as        |
 *  | mailparse or imap, is slow and may be feature deficient. If available|
 *  | you are STRONGLY recommended to use the php extensions.              |
 *  +----------------------------------------------------------------------+
 *
 * @category   Mail
 * @package    Mail_Mime
 * @author     Richard Heyes  <richard@phpguru.org>
 * @author     George Schlossnagle <george@omniti.com>
 * @author     Cipriano Groenendal <cipri@php.net>
 * @author     Sean Coates <sean@php.net>
 * @copyright  2003-2006 PEAR <pear-group@php.net>
 * @license    http://www.opensource.org/licenses/bsd-license.php BSD License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/Mail_mime
 */
class Mail_mimeDecode extends PEAR
{
    /**
     * The raw email to decode
     *
     * @var    string
     * @access private
     */
    var $_input;

    /**
     * The header part of the input
     *
     * @var    string
     * @access private
     */
    var $_header;

    /**
     * The body part of the input
     *
     * @var    string
     * @access private
     */
    var $_body;

    /**
     * If an error occurs, this is used to store the message
     *
     * @var    string
     * @access private
     */
    var $_error;

    /**
     * Flag to determine whether to include bodies in the
     * returned object.
     *
     * @var    boolean
     * @access private
     */
    var $_include_bodies;

    /**
     * Flag to determine whether to decode bodies
     *
     * @var    boolean
     * @access private
     */
    var $_decode_bodies;

    /**
     * Flag to determine whether to decode headers
     * (set to UTF8 to iconv convert headers)
     * @var    mixed 
     * @access private
     */
    var $_decode_headers;
  

    /**
     * Flag to determine whether to include attached messages
     * as body in the returned object. Depends on $_include_bodies
     *
     * @var    boolean
     * @access private
     */
    var $_rfc822_bodies;

    /**
     * Constructor.
     *
     * Sets up the object, initialise the variables, and splits and
     * stores the header and body of the input.
     *
     * @param string The input to decode
     * @access public
     */
    function __construct($input)
    {
        list($header, $body)   = $this->_splitBodyHeader($input);

        $this->_input          = $input;
        $this->_header         = $header;
        $this->_body           = $body;
        $this->_decode_bodies  = false;
        $this->_include_bodies = true;
        $this->_rfc822_bodies  = false;
    }
    // BC
    function Mail_mimeDecode($input)
    {
        $this->__construct($input);
    }
    

    /**
     * Begins the decoding process. If called statically
     * it will create an object and call the decode() method
     * of it.
     *
     * @param array An array of various parameters that determine
     *              various things:
     *              include_bodies - Whether to include the body in the returned
     *                               object.
     *              decode_bodies  - Whether to decode the bodies
     *                               of the parts. (Transfer encoding)
     *              decode_headers - Whether to decode headers,
     *                             - use "UTF8//IGNORE" to convert charset.
     *              
     *              input          - If called statically, this will be treated
     *                               as the input
     * @return object Decoded results
     * @access public
     */
    function decode($params = null)
    {
        // determine if this method has been called statically
        $isStatic = empty($this) || !is_a($this, __CLASS__);

        // Have we been called statically?
	// If so, create an object and pass details to that.
        if ($isStatic AND isset($params['input'])) {

            $obj = new Mail_mimeDecode($params['input']);
            $structure = $obj->decode($params);

        // Called statically but no input
        } elseif ($isStatic) {
            return PEAR::raiseError('Called statically and no input given');

        // Called via an object
        } else {
            $this->_include_bodies = isset($params['include_bodies']) ?
	                             $params['include_bodies'] : false;
            $this->_decode_bodies  = isset($params['decode_bodies']) ?
	                             $params['decode_bodies']  : false;
            $this->_decode_headers = isset($params['decode_headers']) ?
	                             $params['decode_headers'] : false;
            $this->_rfc822_bodies  = isset($params['rfc_822bodies']) ?
	                             $params['rfc_822bodies']  : false;
                                 
            if (is_string($this->_decode_headers) && !function_exists('iconv')) {
                 PEAR::raiseError('header decode conversion requested, however iconv is missing');
            }
                                 
            $structure = $this->_decode($this->_header, $this->_body);
            if ($structure === false) {
                $structure = $this->raiseError($this->_error);
            }
        }
    
        return $structure;
    }

    /**
     * Performs the decoding. Decodes the body string passed to it
     * If it finds certain content-types it will call itself in a
     * recursive fashion
     *
     * @param string Header section
     * @param string Body section
     * @return object Results of decoding process
     * @access private
     */
    function _decode($headers, $body, $default_ctype = 'text/plain')
    {
        $return = new stdClass;
        $return->headers = array();
        $headers = $this->_parseHeaders($headers);

        foreach ($headers as $value) {
            $value['value'] =  $this->_decodeHeader($value['value']);
            if (isset($return->headers[strtolower($value['name'])]) AND !is_array($return->headers[strtolower($value['name'])])) {
                $return->headers[strtolower($value['name'])]   = array($return->headers[strtolower($value['name'])]);
                $return->headers[strtolower($value['name'])][] = $value['value'];

            } elseif (isset($return->headers[strtolower($value['name'])])) {
                $return->headers[strtolower($value['name'])][] = $value['value'];

            } else {
                $return->headers[strtolower($value['name'])] = $value['value'];
            }
        }


        foreach ($headers as $key => $value) {
            $headers[$key]['name'] = strtolower($headers[$key]['name']);
            switch ($headers[$key]['name']) {

                case 'content-type':
                    $content_type = $this->_parseHeaderValue($headers[$key]['value']);

                    if (preg_match('/([0-9a-z+.-]+)\/([0-9a-z+.-]+)/i', $content_type['value'], $regs)) {
                        $return->ctype_primary   = $regs[1];
                        $return->ctype_secondary = $regs[2];
                    }

                    if (isset($content_type['other'])) {
                        foreach($content_type['other'] as $p_name => $p_value) {
                            $return->ctype_parameters[$p_name] = $p_value;
                        }
                    }
                    break;

                case 'content-disposition':
                    $content_disposition = $this->_parseHeaderValue($headers[$key]['value']);
                    $return->disposition   = $content_disposition['value'];
                    if (isset($content_disposition['other'])) {
                        foreach($content_disposition['other'] as $p_name => $p_value) {
                            $return->d_parameters[$p_name] = $p_value;
                        }
                    }
                    break;

                case 'content-transfer-encoding':
                    $content_transfer_encoding = $this->_parseHeaderValue($headers[$key]['value']);
                    break;
            }
        }

        if (isset($content_type)) {
            switch (strtolower($content_type['value'])) {
                case 'text/plain':
                    $encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit';
                    $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body) : null;
                    break;

                case 'text/html':
                    $encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit';
                    $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body) : null;
                    break;
                
                case 'multipart/signed': // PGP
                    $parts = $this->_boundarySplit($body, $content_type['other']['boundary'], true);
                    $return->parts['msg_body'] = $parts[0]; 
                    list($part_header, $part_body) = $this->_splitBodyHeader($parts[1]);
                    $return->parts['sig_hdr'] = $part_header;
                    $return->parts['sig_body'] = $part_body;
                    break;

                case 'multipart/parallel':
                case 'multipart/appledouble': // Appledouble mail
                case 'multipart/report': // RFC1892
                case 'multipart/signed': // PGP
                case 'multipart/digest':
                case 'multipart/alternative':
                case 'multipart/related':
                case 'multipart/relative': //#20431 - android
                case 'multipart/mixed':
                case 'application/vnd.wap.multipart.related':
                    if(!isset($content_type['other']['boundary'])){
                        $this->_error = 'No boundary found for ' . $content_type['value'] . ' part';
                        return false;
                    }

                    $default_ctype = (strtolower($content_type['value']) === 'multipart/digest') ? 'message/rfc822' : 'text/plain';

                    $parts = $this->_boundarySplit($body, $content_type['other']['boundary']);
                    for ($i = 0; $i < count($parts); $i++) {
                        list($part_header, $part_body) = $this->_splitBodyHeader($parts[$i]);
                        $part = $this->_decode($part_header, $part_body, $default_ctype);
                        if($part === false)
                            $part = $this->raiseError($this->_error);
                        $return->parts[] = $part;
                    }
                    break;

                case 'message/rfc822':
                case 'message/delivery-status': // #bug #18693
					if ($this->_rfc822_bodies) {
						$encoding = isset($content_transfer_encoding) ? $content_transfer_encoding['value'] : '7bit';
						$return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $encoding) : $body);
					}
                    $obj = new Mail_mimeDecode($body);
                    $return->parts[] = $obj->decode(array('include_bodies' => $this->_include_bodies,
					                                      'decode_bodies'  => $this->_decode_bodies,
														  'decode_headers' => $this->_decode_headers));
                    unset($obj);
                    break;

                default:
                    if(!isset($content_transfer_encoding['value']))
                        $content_transfer_encoding['value'] = '7bit';
                    $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body, $content_transfer_encoding['value']) : $body) : null;
                    break;
            }

        } else {
            $ctype = explode('/', $default_ctype);
            $return->ctype_primary   = $ctype[0];
            $return->ctype_secondary = $ctype[1];
            $this->_include_bodies ? $return->body = ($this->_decode_bodies ? $this->_decodeBody($body) : $body) : null;
        }

        return $return;
    }

    /**
     * Given the output of the above function, this will return an
     * array of references to the parts, indexed by mime number.
     *
     * @param  object $structure   The structure to go through
     * @param  string $mime_number Internal use only.
     * @return array               Mime numbers
     */
    function &getMimeNumbers(&$structure, $no_refs = false, $mime_number = '', $prepend = '')
    {
        $return = array();
        if (!empty($structure->parts)) {
            if ($mime_number != '') {
                $structure->mime_id = $prepend . $mime_number;
                $return[$prepend . $mime_number] = &$structure;
            }
            for ($i = 0; $i < count($structure->parts); $i++) {

            
                if (!empty($structure->headers['content-type']) AND substr(strtolower($structure->headers['content-type']), 0, 8) == 'message/') {
                    $prepend      = $prepend . $mime_number . '.';
                    $_mime_number = '';
                } else {
                    $_mime_number = ($mime_number == '' ? $i + 1 : sprintf('%s.%s', $mime_number, $i + 1));
                }

                $arr = &Mail_mimeDecode::getMimeNumbers($structure->parts[$i], $no_refs, $_mime_number, $prepend);
                foreach ($arr as $key => $val) {
                    $no_refs ? $return[$key] = '' : $return[$key] = &$arr[$key];
                }
            }
        } else {
            if ($mime_number == '') {
                $mime_number = '1';
            }
            $structure->mime_id = $prepend . $mime_number;
            $no_refs ? $return[$prepend . $mime_number] = '' : $return[$prepend . $mime_number] = &$structure;
        }
        
        return $return;
    }

    /**
     * Given a string containing a header and body
     * section, this function will split them (at the first
     * blank line) and return them.
     *
     * @param string Input to split apart
     * @return array Contains header and body section
     * @access private
     */
    function _splitBodyHeader($input)
    {
        if (preg_match("/^(.*?)\r?\n\r?\n(.*)/s", $input, $match)) {
            return array($match[1], $match[2]);
        }
        // bug #17325 - empty bodies are allowed. - we just check that at least one line 
        // of headers exist..
        if (count(explode("\n",$input))) {
            return array($input, '');
        }
        $this->_error = 'Could not split header and body';
        return false;
    }

    /**
     * Parse headers given in $input and return
     * as assoc array.
     *
     * @param string Headers to parse
     * @return array Contains parsed headers
     * @access private
     */
    function _parseHeaders($input)
    {

        if ($input !== '') {
            // Unfold the input
            $input   = preg_replace("/\r?\n/", "\r\n", $input);
            //#7065 - wrapping.. with encoded stuff.. - probably not needed,
            // wrapping space should only get removed if the trailing item on previous line is a 
            // encoded character
            $input   = preg_replace("/=\r\n(\t| )+/", '=', $input);
            $input   = preg_replace("/\r\n(\t| )+/", ' ', $input);
            
            $headers = explode("\r\n", trim($input));
            $got_start = false;
            foreach ($headers as $value) {
                if (!$got_start) {
                    // munge headers for mbox style from
                    if ($value[0] == '>') {
                        $value = substring($value, 1); // remove mbox >
                    }
                    if (substr($value,0,5) == 'From ') {
                        $value = 'Return-Path: ' . substr($value, 5);
                    } else {
                        $got_start = true;
                    }
                }
                
                $hdr_name = substr($value, 0, $pos = strpos($value, ':'));
                $hdr_value = substr($value, $pos+1);
                if($hdr_value[0] == ' ') {
                    $hdr_value = substr($hdr_value, 1);
                }

                $return[] = array(
                                  'name'  => $hdr_name,
                                  'value' =>  $hdr_value
                                 );
            }
        } else {
            $return = array();
        }

        return $return;
    }

    /**
     * Function to parse a header value,
     * extract first part, and any secondary
     * parts (after ;) This function is not as
     * robust as it could be. Eg. header comments
     * in the wrong place will probably break it.
     *
     * Extra things this can handle
     *   filename*0=......
     *   filename*1=......
     *
     *  This is where lines are broken in, and need merging.
     *
     *   filename*0*=ENC'lang'urlencoded data.
     *   filename*1*=ENC'lang'urlencoded data.
     *
     * 
     *
     * @param string Header value to parse
     * @return array Contains parsed result
     * @access private
     */
    function _parseHeaderValue($input)
    {
         if (($pos = strpos($input, ';')) === false) {
            $input = $this->_decodeHeader($input);
            $return['value'] = trim($input);
            return $return;
        }



        $value = substr($input, 0, $pos);
        $value = $this->_decodeHeader($value);
        $return['value'] = trim($value);
        $input = trim(substr($input, $pos+1));

        if (!strlen($input) > 0) {
            return $return;
        }
        // at this point input contains xxxx=".....";zzzz="...."
        // since we are dealing with quoted strings, we need to handle this properly..
        $i = 0;
        $l = strlen($input);
        $key = '';
        $val = false; // our string - including quotes..
        $q = false; // in quote..
        $lq = ''; // last quote..

        while ($i < $l) {
            
            $c = $input[$i];
            //var_dump(array('i'=>$i,'c'=>$c,'q'=>$q, 'lq'=>$lq, 'key'=>$key, 'val' =>$val));

            $escaped = false;
            if ($c == '\\') {
                $i++;
                if ($i == $l-1) { // end of string.
                    break;
                }
                $escaped = true;
                $c = $input[$i];
            }            


            // state - in key..
            if ($val === false) {
                if (!$escaped && $c == '=') {
                    $val = '';
                    $key = trim($key);
                    $i++;
                    continue;
                }
                if (!$escaped && $c == ';') {
                    if ($key) { // a key without a value..
                        $key= trim($key);
                        $return['other'][$key] = '';
                    }
                    $key = '';
                }
                $key .= $c;
                $i++;
                continue;
            }
                     
            // state - in value.. (as $val is set..)

            if ($q === false) {
                // not in quote yet.
                if ((!strlen($val) || $lq !== false) && $c == ' ' ||  $c == "\t") {
                    $i++;
                    continue; // skip leading spaces after '=' or after '"'
                }
                
                // do not de-quote 'xxx*= itesm.. 
                $key_is_trans = $key[strlen($key)-1] == '*';
                
                if (!$key_is_trans && !$escaped && ($c == '"' || $c == "'")) {
                    // start quoted area..
                    $q = $c;
                    // in theory should not happen raw text in value part..
                    // but we will handle it as a merged part of the string..
                    $val = !strlen(trim($val)) ? '' : trim($val);
                    $i++;
                    continue;
                }
                // got end....
                if (!$escaped && $c == ';') {
                     
                    $return['other'][$key] = trim($val);
                    $val = false;
                    $key = '';
                    $lq = false;
                    $i++;
                    continue;
                }

                $val .= $c;
                $i++;
                continue;
            }
            
            // state - in quote..
            if (!$escaped && $c == $q) {  // potential exit state..
                
                // end of quoted string..
                $lq = $q;
                $q = false;
                $i++;
                continue;
            }
                
            // normal char inside of quoted string..
            $val.= $c;
            $i++;
        }
        
        // do we have anything left..
        if (strlen(trim($key)) || $val !== false) {
           
            $val = trim($val);
          
            $return['other'][$key] = $val;
        }
       
        
        $clean_others = array();
        // merge added values. eg. *1[*]
        foreach($return['other'] as $key =>$val) {
            if (preg_match('/\*[0-9]+\**$/', $key)) {
                $key = preg_replace('/(.*)\*[0-9]+(\**)$/', '\1\2', $key);
                if (isset($clean_others[$key])) {
                    $clean_others[$key] .= $val;
                    continue;
                }
                
            }
            $clean_others[$key] = $val;
            
        }
         
        // handle language translation of '*' ending others.
        foreach( $clean_others as $key =>$val) {
            if ( $key[strlen($key)-1] != '*') {
                $clean_others[strtolower($key)] = $val;
                continue;
            }
            unset($clean_others[$key]);
            $key = substr($key,0,-1);
            //extended-initial-value := [charset] "'" [language] "'"
            //              extended-other-values
            $match = array();
            $info = preg_match("/^([^']+)'([^']*)'(.*)$/", $val, $match);
             
            $clean_others[$key] = urldecode($match[3]);
            $clean_others[strtolower($key)] = $clean_others[$key];
            $clean_others[strtolower($key).'-charset'] = $match[1];
            $clean_others[strtolower($key).'-language'] = $match[2];
            
            
        }
        
        
        $return['other'] = $clean_others;
        
        // decode values.
        foreach($return['other'] as $key =>$val) {
            $charset = isset($return['other'][$key . '-charset']) ?
                $return['other'][$key . '-charset']  : false;
            
            $return['other'][$key] = $this->_decodeHeader($val, $charset);
        }
        
        return $return;
    }

    /**
     * This function splits the input based
     * on the given boundary
     *
     * @param string Input to parse
     * @return array Contains array of resulting mime parts
     * @access private
     */
    function _boundarySplit($input, $boundary, $eatline = false)
    {
        $parts = array();

        $bs_possible = substr($boundary, 2, -2);
        $bs_check = '\"' . $bs_possible . '\"';

        if ($boundary == $bs_check) {
            $boundary = $bs_possible;
        }
        // eatline is used by multipart/signed.
        $tmp = $eatline ?
            preg_split("/\r?\n--".preg_quote($boundary, '/')."(|--)\n/", $input) :
            preg_split("/--".preg_quote($boundary, '/')."((?=\s)|--)/", $input);

        $len = count($tmp) -1;
        for ($i = 1; $i < $len; $i++) {
            if (strlen(trim($tmp[$i]))) {
                $parts[] = $tmp[$i];
            }
        }
        
        // add the last part on if it does not end with the 'closing indicator'
        if (!empty($tmp[$len]) && strlen(trim($tmp[$len])) && $tmp[$len][0] != '-') {
            $parts[] = $tmp[$len];
        }
        return $parts;
    }

    /**
     * Given a header, this function will decode it
     * according to RFC2047. Probably not *exactly*
     * conformant, but it does pass all the given
     * examples (in RFC2047).
     *
     * @param string Input header value to decode
     * @return string Decoded header value
     * @access private
     */
    function _decodeHeader($input, $default_charset=false)
    {
        if (!$this->_decode_headers) {
            return $input;
        }
        // Remove white space between encoded-words
        $input = preg_replace('/(=\?[^?]+\?(q|b)\?[^?]*\?=)(\s)+=\?/i', '\1=?', $input);

        // For each encoded-word...
        while (preg_match('/(=\?([^?]+)\?(q|b)\?([^?]*)\?=)/i', $input, $matches)) {

            $encoded  = $matches[1];
            $charset  = $matches[2];
            $encoding = $matches[3];
            $text     = $matches[4];

            switch (strtolower($encoding)) {
                case 'b':
                    $text = base64_decode($text);
                    break;

                case 'q':
                    $text = str_replace('_', ' ', $text);
                    preg_match_all('/=([a-f0-9]{2})/i', $text, $matches);
                    foreach($matches[1] as $value)
                        $text = str_replace('='.$value, chr(hexdec($value)), $text);
                    break;
            }
            if (is_string($this->_decode_headers)) {
                $conv = @iconv($charset, $this->_decode_headers, $text);
                $text = ($conv === false) ? $text : $conv;
            }
            $input = str_replace($encoded, $text, $input);
        }
        
        if ($default_charset  && is_string($this->_decode_headers)) {
            $conv = @iconv($charset, $this->_decode_headers, $input);
            $input = ($conv === false) ? $input : $conv;
        }
        
        return $input;
    }

    /**
     * Given a body string and an encoding type,
     * this function will decode and return it.
     *
     * @param  string Input body to decode
     * @param  string Encoding type to use.
     * @return string Decoded body
     * @access private
     */
    function _decodeBody($input, $encoding = '7bit')
    {
        switch (strtolower($encoding)) {
            case '7bit':
                return $input;
                break;

            case 'quoted-printable':
                return $this->_quotedPrintableDecode($input);
                break;

            case 'base64':
                return base64_decode($input);
                break;

            default:
                return $input;
        }
    }

    /**
     * Given a quoted-printable string, this
     * function will decode and return it.
     *
     * @param  string Input body to decode
     * @return string Decoded body
     * @access private
     */
    function _quotedPrintableDecode($input)
    {
        // Remove soft line breaks
        $input = preg_replace("/=\r?\n/", '', $input);

        // Replace encoded characters
		 
        $cb = create_function('$matches',  ' return chr(hexdec($matches[0]));');
         
        $input = preg_replace_callback( '/=([a-f0-9]{2})/i', $cb, $input);

        return $input;
    }

    /**
     * Checks the input for uuencoded files and returns
     * an array of them. Can be called statically, eg:
     *
     * $files =& Mail_mimeDecode::uudecode($some_text);
     *
     * It will check for the begin 666 ... end syntax
     * however and won't just blindly decode whatever you
     * pass it.
     *
     * @param  string Input body to look for attahcments in
     * @return array  Decoded bodies, filenames and permissions
     * @access public
     * @author Unknown
     */
    function &uudecode($input)
    {
        // Find all uuencoded sections
        preg_match_all("/begin ([0-7]{3}) (.+)\r?\n(.+)\r?\nend/Us", $input, $matches);

        for ($j = 0; $j < count($matches[3]); $j++) {

            $str      = $matches[3][$j];
            $filename = $matches[2][$j];
            $fileperm = $matches[1][$j];

            $file = '';
            $str = preg_split("/\r?\n/", trim($str));
            $strlen = count($str);

            for ($i = 0; $i < $strlen; $i++) {
                $pos = 1;
                $d = 0;
                $len=(int)(((ord(substr($str[$i],0,1)) -32) - ' ') & 077);

                while (($d + 3 <= $len) AND ($pos + 4 <= strlen($str[$i]))) {
                    $c0 = (ord(substr($str[$i],$pos,1)) ^ 0x20);
                    $c1 = (ord(substr($str[$i],$pos+1,1)) ^ 0x20);
                    $c2 = (ord(substr($str[$i],$pos+2,1)) ^ 0x20);
                    $c3 = (ord(substr($str[$i],$pos+3,1)) ^ 0x20);
                    $file .= chr(((($c0 - ' ') & 077) << 2) | ((($c1 - ' ') & 077) >> 4));

                    $file .= chr(((($c1 - ' ') & 077) << 4) | ((($c2 - ' ') & 077) >> 2));

                    $file .= chr(((($c2 - ' ') & 077) << 6) |  (($c3 - ' ') & 077));

                    $pos += 4;
                    $d += 3;
                }

                if (($d + 2 <= $len) && ($pos + 3 <= strlen($str[$i]))) {
                    $c0 = (ord(substr($str[$i],$pos,1)) ^ 0x20);
                    $c1 = (ord(substr($str[$i],$pos+1,1)) ^ 0x20);
                    $c2 = (ord(substr($str[$i],$pos+2,1)) ^ 0x20);
                    $file .= chr(((($c0 - ' ') & 077) << 2) | ((($c1 - ' ') & 077) >> 4));

                    $file .= chr(((($c1 - ' ') & 077) << 4) | ((($c2 - ' ') & 077) >> 2));

                    $pos += 3;
                    $d += 2;
                }

                if (($d + 1 <= $len) && ($pos + 2 <= strlen($str[$i]))) {
                    $c0 = (ord(substr($str[$i],$pos,1)) ^ 0x20);
                    $c1 = (ord(substr($str[$i],$pos+1,1)) ^ 0x20);
                    $file .= chr(((($c0 - ' ') & 077) << 2) | ((($c1 - ' ') & 077) >> 4));

                }
            }
            $files[] = array('filename' => $filename, 'fileperm' => $fileperm, 'filedata' => $file);
        }

        return $files;
    }

    /**
     * getSendArray() returns the arguments required for Mail::send()
     * used to build the arguments for a mail::send() call 
     *
     * Usage:
     * $mailtext = Full email (for example generated by a template)
     * $decoder = new Mail_mimeDecode($mailtext);
     * $parts =  $decoder->getSendArray();
     * if (!PEAR::isError($parts) {
     *     list($recipents,$headers,$body) = $parts;
     *     $mail = Mail::factory('smtp');
     *     $mail->send($recipents,$headers,$body);
     * } else {
     *     echo $parts->message;
     * }
     * @return mixed   array of recipeint, headers,body or Pear_Error
     * @access public
     * @author Alan Knowles <alan@akbkhome.com>
     */
    function getSendArray()
    {
        // prevent warning if this is not set
        $this->_decode_headers = FALSE;
        $headerlist =$this->_parseHeaders($this->_header);
        $to = "";
        if (!$headerlist) {
            return $this->raiseError("Message did not contain headers");
        }
        foreach($headerlist as $item) {
            $header[$item['name']] = $item['value'];
            switch (strtolower($item['name'])) {
                case "to":
                case "cc":
                case "bcc":
                    $to .= ",".$item['value'];
                default:
                   break;
            }
        }
        if ($to == "") {
            return $this->raiseError("Message did not contain any recipents");
        }
        $to = substr($to,1);
        return array($to,$header,$this->_body);
    } 

    /**
     * Returns a xml copy of the output of
     * Mail_mimeDecode::decode. Pass the output in as the
     * argument. This function can be called statically. Eg:
     *
     * $output = $obj->decode();
     * $xml    = Mail_mimeDecode::getXML($output);
     *
     * The DTD used for this should have been in the package. Or
     * alternatively you can get it from cvs, or here:
     * http://www.phpguru.org/xmail/xmail.dtd.
     *
     * @param  object Input to convert to xml. This should be the
     *                output of the Mail_mimeDecode::decode function
     * @return string XML version of input
     * @access public
     */
    function getXML($input)
    {
        $crlf    =  "\r\n";
        $output  = '<?xml version=\'1.0\'?>' . $crlf .
                   '<!DOCTYPE email SYSTEM "http://www.phpguru.org/xmail/xmail.dtd">' . $crlf .
                   '<email>' . $crlf .
                   Mail_mimeDecode::_getXML($input) .
                   '</email>';

        return $output;
    }

    /**
     * Function that does the actual conversion to xml. Does a single
     * mimepart at a time.
     *
     * @param  object  Input to convert to xml. This is a mimepart object.
     *                 It may or may not contain subparts.
     * @param  integer Number of tabs to indent
     * @return string  XML version of input
     * @access private
     */
    function _getXML($input, $indent = 1)
    {
        $htab    =  "\t";
        $crlf    =  "\r\n";
        $output  =  '';
        $headers = @(array)$input->headers;

        foreach ($headers as $hdr_name => $hdr_value) {

            // Multiple headers with this name
            if (is_array($headers[$hdr_name])) {
                for ($i = 0; $i < count($hdr_value); $i++) {
                    $output .= Mail_mimeDecode::_getXML_helper($hdr_name, $hdr_value[$i], $indent);
                }

            // Only one header of this sort
            } else {
                $output .= Mail_mimeDecode::_getXML_helper($hdr_name, $hdr_value, $indent);
            }
        }

        if (!empty($input->parts)) {
            for ($i = 0; $i < count($input->parts); $i++) {
                $output .= $crlf . str_repeat($htab, $indent) . '<mimepart>' . $crlf .
                           Mail_mimeDecode::_getXML($input->parts[$i], $indent+1) .
                           str_repeat($htab, $indent) . '</mimepart>' . $crlf;
            }
        } elseif (isset($input->body)) {
            $output .= $crlf . str_repeat($htab, $indent) . '<body><![CDATA[' .
                       $input->body . ']]></body>' . $crlf;
        }

        return $output;
    }

    /**
     * Helper function to _getXML(). Returns xml of a header.
     *
     * @param  string  Name of header
     * @param  string  Value of header
     * @param  integer Number of tabs to indent
     * @return string  XML version of input
     * @access private
     */
    function _getXML_helper($hdr_name, $hdr_value, $indent)
    {
        $htab   = "\t";
        $crlf   = "\r\n";
        $return = '';

        $new_hdr_value = ($hdr_name != 'received') ? Mail_mimeDecode::_parseHeaderValue($hdr_value) : array('value' => $hdr_value);
        $new_hdr_name  = str_replace(' ', '-', ucwords(str_replace('-', ' ', $hdr_name)));

        // Sort out any parameters
        if (!empty($new_hdr_value['other'])) {
            foreach ($new_hdr_value['other'] as $paramname => $paramvalue) {
                $params[] = str_repeat($htab, $indent) . $htab . '<parameter>' . $crlf .
                            str_repeat($htab, $indent) . $htab . $htab . '<paramname>' . htmlspecialchars($paramname) . '</paramname>' . $crlf .
                            str_repeat($htab, $indent) . $htab . $htab . '<paramvalue>' . htmlspecialchars($paramvalue) . '</paramvalue>' . $crlf .
                            str_repeat($htab, $indent) . $htab . '</parameter>' . $crlf;
            }

            $params = implode('', $params);
        } else {
            $params = '';
        }

        $return = str_repeat($htab, $indent) . '<header>' . $crlf .
                  str_repeat($htab, $indent) . $htab . '<headername>' . htmlspecialchars($new_hdr_name) . '</headername>' . $crlf .
                  str_repeat($htab, $indent) . $htab . '<headervalue>' . htmlspecialchars($new_hdr_value['value']) . '</headervalue>' . $crlf .
                  $params .
                  str_repeat($htab, $indent) . '</header>' . $crlf;

        return $return;
    }

} // End of class
PK�^�\@iE�\\pear/Mail/mail.phpnu�[���<?php
/**
 * internal PHP-mail() implementation of the PEAR Mail:: interface.
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017, Chuck Hagenbuch
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Chuck Hagenbuch <chuck@horde.org> 
 * @copyright   2010-2017 Chuck Hagenbuch
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/**
 * internal PHP-mail() implementation of the PEAR Mail:: interface.
 * @package Mail
 * @version $Revision$
 */
class Mail_mail extends Mail {

    /**
     * Any arguments to pass to the mail() function.
     * @var string
     */
    var $_params = '';

    /**
     * Constructor.
     *
     * Instantiates a new Mail_mail:: object based on the parameters
     * passed in.
     *
     * @param array $params Extra arguments for the mail() function.
     */
    public function __construct($params = null)
    {
        // The other mail implementations accept parameters as arrays.
        // In the interest of being consistent, explode an array into
        // a string of parameter arguments.
        if (is_array($params)) {
            $this->_params = join(' ', $params);
        } else {
            $this->_params = $params;
        }

        /* Because the mail() function may pass headers as command
         * line arguments, we can't guarantee the use of the standard
         * "\r\n" separator.  Instead, we use the system's native line
         * separator. */
        if (defined('PHP_EOL')) {
            $this->sep = PHP_EOL;
        } else {
            $this->sep = (strpos(PHP_OS, 'WIN') === false) ? "\n" : "\r\n";
        }
    }

    /**
     * Implements Mail_mail::send() function using php's built-in mail()
     * command.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (ie, 'Subject'), and the array value
     *              is the header value (ie, 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               Mime parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     */
    public function send($recipients, $headers, $body)
    {
        if (!is_array($headers)) {
            return PEAR::raiseError('$headers must be an array');
        }

        $result = $this->_sanitizeHeaders($headers);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        // If we're passed an array of recipients, implode it.
        if (is_array($recipients)) {
            $recipients = implode(', ', $recipients);
        }

        // Get the Subject out of the headers array so that we can
        // pass it as a seperate argument to mail().
        $subject = '';
        if (isset($headers['Subject'])) {
            $subject = $headers['Subject'];
            unset($headers['Subject']);
        }

        // Also remove the To: header.  The mail() function will add its own
        // To: header based on the contents of $recipients.
        unset($headers['To']);

        // Flatten the headers out.
        $headerElements = $this->prepareHeaders($headers);
        if (is_a($headerElements, 'PEAR_Error')) {
            return $headerElements;
        }
        list(, $text_headers) = $headerElements;

        // We only use mail()'s optional fifth parameter if the additional
        // parameters have been provided and we're not running in safe mode.
        if (empty($this->_params) || ini_get('safe_mode')) {
            $result = mail($recipients, $subject, $body, $text_headers);
        } else {
            $result = mail($recipients, $subject, $body, $text_headers,
                           $this->_params);
        }

        // If the mail() function returned failure, we need to create a
        // PEAR_Error object and return it instead of the boolean result.
        if ($result === false) {
            $result = PEAR::raiseError('mail() returned failure');
        }

        return $result;
    }

}
PK�^�\wԐE;E;pear/Mail/smtpmx.phpnu�[���<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * SMTP MX
 *
 * SMTP MX implementation of the PEAR Mail interface. Requires the Net_SMTP class.
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017 gERD Schaufelberger
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category   Mail
 * @package    Mail_smtpmx
 * @author     gERD Schaufelberger <gerd@php-tools.net>
 * @copyright  2010-2017 gERD Schaufelberger
 * @license    http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version    CVS: $Id$
 * @link       http://pear.php.net/package/Mail/
 */

require_once 'Net/SMTP.php';

/**
 * SMTP MX implementation of the PEAR Mail interface. Requires the Net_SMTP class.
 *
 *
 * @access public
 * @author  gERD Schaufelberger <gerd@php-tools.net>
 * @package Mail
 * @version $Revision$
 */
class Mail_smtpmx extends Mail {

    /**
     * SMTP connection object.
     *
     * @var object
     * @access private
     */
    var $_smtp = null;

    /**
     * The port the SMTP server is on.
     * @var integer
     * @see getservicebyname()
     */
    var $port = 25;

    /**
     * Hostname or domain that will be sent to the remote SMTP server in the
     * HELO / EHLO message.
     *
     * @var string
     * @see posix_uname()
     */
    var $mailname = 'localhost';

    /**
     * SMTP connection timeout value.  NULL indicates no timeout.
     *
     * @var integer
     */
    var $timeout = 10;

    /**
     * use either PEAR:Net_DNS or getmxrr
     *
     * @var boolean
     */
    var $withNetDns = true;

    /**
     * PEAR:Net_DNS_Resolver
     *
     * @var object
     */
    var $resolver;

    /**
     * Whether to use VERP or not. If not a boolean, the string value
     * will be used as the VERP separators.
     *
     * @var mixed boolean or string
     */
    var $verp = false;

    /**
     * Whether to use VRFY or not.
     *
     * @var boolean $vrfy
     */
    var $vrfy = false;

    /**
     * Switch to test mode - don't send emails for real
     *
     * @var boolean $debug
     */
    var $test = false;

    /**
     * Turn on Net_SMTP debugging?
     *
     * @var boolean $peardebug
     */
    var $debug = false;

    /**
     * internal error codes
     *
     * translate internal error identifier to PEAR-Error codes and human
     * readable messages.
     *
     * @var boolean $debug
     * @todo as I need unique error-codes to identify what exactly went wrond
     *       I did not use intergers as it should be. Instead I added a "namespace"
     *       for each code. This avoids conflicts with error codes from different
     *       classes. How can I use unique error codes and stay conform with PEAR?
     */
    var $errorCode = array(
        'not_connected' => array(
            'code'  => 1,
            'msg'   => 'Could not connect to any mail server ({HOST}) at port {PORT} to send mail to {RCPT}.'
        ),
        'failed_vrfy_rcpt' => array(
            'code'  => 2,
            'msg'   => 'Recipient "{RCPT}" could not be veryfied.'
        ),
        'failed_set_from' => array(
            'code'  => 3,
            'msg'   => 'Failed to set sender: {FROM}.'
        ),
        'failed_set_rcpt' => array(
            'code'  => 4,
            'msg'   => 'Failed to set recipient: {RCPT}.'
        ),
        'failed_send_data' => array(
            'code'  => 5,
            'msg'   => 'Failed to send mail to: {RCPT}.'
        ),
        'no_from' => array(
            'code'  => 5,
            'msg'   => 'No from address has be provided.'
        ),
        'send_data' => array(
            'code'  => 7,
            'msg'   => 'Failed to create Net_SMTP object.'
        ),
        'no_mx' => array(
            'code'  => 8,
            'msg'   => 'No MX-record for {RCPT} found.'
        ),
        'no_resolver' => array(
            'code'  => 9,
            'msg'   => 'Could not start resolver! Install PEAR:Net_DNS or switch off "netdns"'
        ),
        'failed_rset' => array(
            'code'  => 10,
            'msg'   => 'RSET command failed, SMTP-connection corrupt.'
        ),
    );

    /**
     * Constructor.
     *
     * Instantiates a new Mail_smtp:: object based on the parameters
     * passed in. It looks for the following parameters:
     *     mailname    The name of the local mail system (a valid hostname which matches the reverse lookup)
     *     port        smtp-port - the default comes from getservicebyname() and should work fine
     *     timeout     The SMTP connection timeout. Defaults to 30 seconds.
     *     vrfy        Whether to use VRFY or not. Defaults to false.
     *     verp        Whether to use VERP or not. Defaults to false.
     *     test        Activate test mode? Defaults to false.
     *     debug       Activate SMTP and Net_DNS debug mode? Defaults to false.
     *     netdns      whether to use PEAR:Net_DNS or the PHP build in function getmxrr, default is true
     *
     * If a parameter is present in the $params array, it replaces the
     * default.
     *
     * @access public
     * @param array Hash containing any parameters different from the
     *              defaults.
     * @see _Mail_smtpmx()
     */
    function __construct($params)
    {
        if (isset($params['mailname'])) {
            $this->mailname = $params['mailname'];
        } else {
            // try to find a valid mailname
            if (function_exists('posix_uname')) {
                $uname = posix_uname();
                $this->mailname = $uname['nodename'];
            }
        }

        // port number
        if (isset($params['port'])) {
            $this->_port = $params['port'];
        } else {
            $this->_port = getservbyname('smtp', 'tcp');
        }

        if (isset($params['timeout'])) $this->timeout = $params['timeout'];
        if (isset($params['verp'])) $this->verp = $params['verp'];
        if (isset($params['test'])) $this->test = $params['test'];
        if (isset($params['peardebug'])) $this->test = $params['peardebug'];
        if (isset($params['netdns'])) $this->withNetDns = $params['netdns'];
    }

    /**
     * Constructor wrapper for PHP4
     *
     * @access public
     * @param array Hash containing any parameters different from the defaults
     * @see __construct()
     */
    function Mail_smtpmx($params)
    {
        $this->__construct($params);
        register_shutdown_function(array(&$this, '__destruct'));
    }

    /**
     * Destructor implementation to ensure that we disconnect from any
     * potentially-alive persistent SMTP connections.
     */
    function __destruct()
    {
        if (is_object($this->_smtp)) {
            $this->_smtp->disconnect();
            $this->_smtp = null;
        }
    }

    /**
     * Implements Mail::send() function using SMTP direct delivery
     *
     * @access public
     * @param mixed $recipients in RFC822 style or array
     * @param array $headers The array of headers to send with the mail.
     * @param string $body The full text of the message body,
     * @return mixed Returns true on success, or a PEAR_Error
     */
    function send($recipients, $headers, $body)
    {
        if (!is_array($headers)) {
            return PEAR::raiseError('$headers must be an array');
        }

        $result = $this->_sanitizeHeaders($headers);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        // Prepare headers
        $headerElements = $this->prepareHeaders($headers);
        if (is_a($headerElements, 'PEAR_Error')) {
            return $headerElements;
        }
        list($from, $textHeaders) = $headerElements;

        // use 'Return-Path' if possible
        if (!empty($headers['Return-Path'])) {
            $from = $headers['Return-Path'];
        }
        if (!isset($from)) {
            return $this->_raiseError('no_from');
        }

        // Prepare recipients
        $recipients = $this->parseRecipients($recipients);
        if (is_a($recipients, 'PEAR_Error')) {
            return $recipients;
        }

        foreach ($recipients as $rcpt) {
            list($user, $host) = explode('@', $rcpt);

            $mx = $this->_getMx($host);
            if (is_a($mx, 'PEAR_Error')) {
                return $mx;
            }

            if (empty($mx)) {
                $info = array('rcpt' => $rcpt);
                return $this->_raiseError('no_mx', $info);
            }

            $connected = false;
            foreach ($mx as $mserver => $mpriority) {
                $this->_smtp = new Net_SMTP($mserver, $this->port, $this->mailname);

                // configure the SMTP connection.
                if ($this->debug) {
                    $this->_smtp->setDebug(true);
                }

                // attempt to connect to the configured SMTP server.
                $res = $this->_smtp->connect($this->timeout);
                if (is_a($res, 'PEAR_Error')) {
                    $this->_smtp = null;
                    continue;
                }

                // connection established
                if ($res) {
                    $connected = true;
                    break;
                }
            }

            if (!$connected) {
                $info = array(
                    'host' => implode(', ', array_keys($mx)),
                    'port' => $this->port,
                    'rcpt' => $rcpt,
                );
                return $this->_raiseError('not_connected', $info);
            }

            // Verify recipient
            if ($this->vrfy) {
                $res = $this->_smtp->vrfy($rcpt);
                if (is_a($res, 'PEAR_Error')) {
                    $info = array('rcpt' => $rcpt);
                    return $this->_raiseError('failed_vrfy_rcpt', $info);
                }
            }

            // mail from:
            $args['verp'] = $this->verp;
            $res = $this->_smtp->mailFrom($from, $args);
            if (is_a($res, 'PEAR_Error')) {
                $info = array('from' => $from);
                return $this->_raiseError('failed_set_from', $info);
            }

            // rcpt to:
            $res = $this->_smtp->rcptTo($rcpt);
            if (is_a($res, 'PEAR_Error')) {
                $info = array('rcpt' => $rcpt);
                return $this->_raiseError('failed_set_rcpt', $info);
            }

            // Don't send anything in test mode
            if ($this->test) {
                $result = $this->_smtp->rset();
                $res = $this->_smtp->rset();
                if (is_a($res, 'PEAR_Error')) {
                    return $this->_raiseError('failed_rset');
                }

                $this->_smtp->disconnect();
                $this->_smtp = null;
                return true;
            }

            // Send data
            $res = $this->_smtp->data($body, $textHeaders);
            if (is_a($res, 'PEAR_Error')) {
                $info = array('rcpt' => $rcpt);
                return $this->_raiseError('failed_send_data', $info);
            }

            $this->_smtp->disconnect();
            $this->_smtp = null;
        }

        return true;
    }

    /**
     * Recieve mx rexords for a spciefied host
     *
     * The MX records
     *
     * @access private
     * @param string $host mail host
     * @return mixed sorted
     */
    function _getMx($host)
    {
        $mx = array();

        if ($this->withNetDns) {
            $res = $this->_loadNetDns();
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }

            $response = $this->resolver->query($host, 'MX');
            if (!$response) {
                return false;
            }

            foreach ($response->answer as $rr) {
                if ($rr->type == 'MX') {
                    $mx[$rr->exchange] = $rr->preference;
                }
            }
        } else {
            $mxHost = array();
            $mxWeight = array();

            if (!getmxrr($host, $mxHost, $mxWeight)) {
                return false;
            }
            for ($i = 0; $i < count($mxHost); ++$i) {
                $mx[$mxHost[$i]] = $mxWeight[$i];
            }
        }

        asort($mx);
        return $mx;
    }

    /**
     * initialize PEAR:Net_DNS_Resolver
     *
     * @access private
     * @return boolean true on success
     */
    function _loadNetDns()
    {
        if (is_object($this->resolver)) {
            return true;
        }

        if (!include_once 'Net/DNS.php') {
            return $this->_raiseError('no_resolver');
        }

        $this->resolver = new Net_DNS_Resolver();
        if ($this->debug) {
            $this->resolver->test = 1;
        }

        return true;
    }

    /**
     * raise standardized error
     *
     * include additional information in error message
     *
     * @access private
     * @param string $id maps error ids to codes and message
     * @param array $info optional information in associative array
     * @see _errorCode
     */
    function _raiseError($id, $info = array())
    {
        $code = $this->errorCode[$id]['code'];
        $msg = $this->errorCode[$id]['msg'];

        // include info to messages
        if (!empty($info)) {
            $search = array();
            $replace = array();

            foreach ($info as $key => $value) {
                array_push($search, '{' . strtoupper($key) . '}');
                array_push($replace, $value);
            }

            $msg = str_replace($search, $replace, $msg);
        }

        return PEAR::raiseError($msg, $code);
    }

}
PK�^�\B�_Ǭ=�=pear/Mail/smtp.phpnu�[���<?php
/**
 * SMTP implementation of the PEAR Mail interface. Requires the Net_SMTP class.
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2010-2017, Chuck Hagenbuch & Jon Parise
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    HTTP
 * @package     HTTP_Request
 * @author      Jon Parise <jon@php.net> 
 * @author      Chuck Hagenbuch <chuck@horde.org>
 * @copyright   2010-2017 Chuck Hagenbuch
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/** Error: Failed to create a Net_SMTP object */
define('PEAR_MAIL_SMTP_ERROR_CREATE', 10000);

/** Error: Failed to connect to SMTP server */
define('PEAR_MAIL_SMTP_ERROR_CONNECT', 10001);

/** Error: SMTP authentication failure */
define('PEAR_MAIL_SMTP_ERROR_AUTH', 10002);

/** Error: No From: address has been provided */
define('PEAR_MAIL_SMTP_ERROR_FROM', 10003);

/** Error: Failed to set sender */
define('PEAR_MAIL_SMTP_ERROR_SENDER', 10004);

/** Error: Failed to add recipient */
define('PEAR_MAIL_SMTP_ERROR_RECIPIENT', 10005);

/** Error: Failed to send data */
define('PEAR_MAIL_SMTP_ERROR_DATA', 10006);

/**
 * SMTP implementation of the PEAR Mail interface. Requires the Net_SMTP class.
 * @access public
 * @package Mail
 * @version $Revision$
 */
class Mail_smtp extends Mail {

    /**
     * SMTP connection object.
     *
     * @var object
     * @access private
     */
    var $_smtp = null;

    /**
     * The list of service extension parameters to pass to the Net_SMTP
     * mailFrom() command.
     *
     * @var array
     */
    var $_extparams = array();

    /**
     * The SMTP host to connect to.
     *
     * @var string
     */
    var $host = 'localhost';

    /**
     * The port the SMTP server is on.
     *
     * @var integer
     */
    var $port = 25;

    /**
     * Should SMTP authentication be used?
     *
     * This value may be set to true, false or the name of a specific
     * authentication method.
     *
     * If the value is set to true, the Net_SMTP package will attempt to use
     * the best authentication method advertised by the remote SMTP server.
     *
     * @var mixed
     */
    var $auth = false;

    /**
     * The username to use if the SMTP server requires authentication.
     *
     * @var string
     */
    var $username = '';

    /**
     * The password to use if the SMTP server requires authentication.
     *
     * @var string
     */
    var $password = '';

    /**
     * Hostname or domain that will be sent to the remote SMTP server in the
     * HELO / EHLO message.
     *
     * @var string
     */
    var $localhost = 'localhost';

    /**
     * SMTP connection timeout value.  NULL indicates no timeout.
     *
     * @var integer
     */
    var $timeout = null;

    /**
     * Turn on Net_SMTP debugging?
     *
     * @var boolean $debug
     */
    var $debug = false;

    /**
     * Indicates whether or not the SMTP connection should persist over
     * multiple calls to the send() method.
     *
     * @var boolean
     */
    var $persist = false;

    /**
     * Use SMTP command pipelining (specified in RFC 2920) if the SMTP server
     * supports it. This speeds up delivery over high-latency connections. By
     * default, use the default value supplied by Net_SMTP.
     *
     * @var boolean
     */
    var $pipelining;

    /**
     * The list of socket options
     *
     * @var array
     */
    var $socket_options = array();

    /**
     * Constructor.
     *
     * Instantiates a new Mail_smtp:: object based on the parameters
     * passed in. It looks for the following parameters:
     *     host        The server to connect to. Defaults to localhost.
     *     port        The port to connect to. Defaults to 25.
     *     auth        SMTP authentication.  Defaults to none.
     *     username    The username to use for SMTP auth. No default.
     *     password    The password to use for SMTP auth. No default.
     *     localhost   The local hostname / domain. Defaults to localhost.
     *     timeout     The SMTP connection timeout. Defaults to none.
     *     verp        Whether to use VERP or not. Defaults to false.
     *                 DEPRECATED as of 1.2.0 (use setMailParams()).
     *     debug       Activate SMTP debug mode? Defaults to false.
     *     persist     Should the SMTP connection persist?
     *     pipelining  Use SMTP command pipelining
     *
     * If a parameter is present in the $params array, it replaces the
     * default.
     *
     * @param array Hash containing any parameters different from the
     *              defaults.
     */
    public function __construct($params)
    {
        if (isset($params['host'])) $this->host = $params['host'];
        if (isset($params['port'])) $this->port = $params['port'];
        if (isset($params['auth'])) $this->auth = $params['auth'];
        if (isset($params['username'])) $this->username = $params['username'];
        if (isset($params['password'])) $this->password = $params['password'];
        if (isset($params['localhost'])) $this->localhost = $params['localhost'];
        if (isset($params['timeout'])) $this->timeout = $params['timeout'];
        if (isset($params['debug'])) $this->debug = (bool)$params['debug'];
        if (isset($params['persist'])) $this->persist = (bool)$params['persist'];
        if (isset($params['pipelining'])) $this->pipelining = (bool)$params['pipelining'];
        if (isset($params['socket_options'])) $this->socket_options = $params['socket_options'];
        // Deprecated options
        if (isset($params['verp'])) {
            $this->addServiceExtensionParameter('XVERP', is_bool($params['verp']) ? null : $params['verp']);
        }
    }

    /**
     * Destructor implementation to ensure that we disconnect from any
     * potentially-alive persistent SMTP connections.
     */
    public function __destruct()
    {
        $this->disconnect();
    }

    /**
     * Implements Mail::send() function using SMTP.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (e.g., 'Subject'), and the array value
     *              is the header value (e.g., 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               MIME parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     */
    public function send($recipients, $headers, $body)
    {
        $result = $this->send_or_fail($recipients, $headers, $body);

        /* If persistent connections are disabled, destroy our SMTP object. */
        if ($this->persist === false) {
            $this->disconnect();
        }

        return $result;
    }

    protected function send_or_fail($recipients, $headers, $body)
    {
        /* If we don't already have an SMTP object, create one. */
        $result = $this->getSMTPObject();
        if (PEAR::isError($result)) {
            return $result;
        }

        if (!is_array($headers)) {
            return PEAR::raiseError('$headers must be an array');
        }

        $this->_sanitizeHeaders($headers);

        $headerElements = $this->prepareHeaders($headers);
        if (is_a($headerElements, 'PEAR_Error')) {
            $this->_smtp->rset();
            return $headerElements;
        }
        list($from, $textHeaders) = $headerElements;

        /* Since few MTAs are going to allow this header to be forged
         * unless it's in the MAIL FROM: exchange, we'll use
         * Return-Path instead of From: if it's set. */
        if (!empty($headers['Return-Path'])) {
            $from = $headers['Return-Path'];
        }

        if (!isset($from)) {
            $this->_smtp->rset();
            return PEAR::raiseError('No From: address has been provided',
                                    PEAR_MAIL_SMTP_ERROR_FROM);
        }

        $params = null;
        if (!empty($this->_extparams)) {
            foreach ($this->_extparams as $key => $val) {
                $params .= ' ' . $key . (is_null($val) ? '' : '=' . $val);
            }
        }
        if (PEAR::isError($res = $this->_smtp->mailFrom($from, ltrim($params)))) {
            $error = $this->_error("Failed to set sender: $from", $res);
            $this->_smtp->rset();
            return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_SENDER);
        }

        $recipients = $this->parseRecipients($recipients);
        if (is_a($recipients, 'PEAR_Error')) {
            $this->_smtp->rset();
            return $recipients;
        }

        foreach ($recipients as $recipient) {
            $res = $this->_smtp->rcptTo($recipient);
            if (is_a($res, 'PEAR_Error')) {
                $error = $this->_error("Failed to add recipient: $recipient", $res);
                $this->_smtp->rset();
                return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_RECIPIENT);
            }
        }

        /* Send the message's headers and the body as SMTP data. */
        $res = $this->_smtp->data($body, $textHeaders);
        list(,$args) = $this->_smtp->getResponse();

        if (preg_match("/ queued as (.*)/", $args, $queued)) {
            $this->queued_as = $queued[1];
        }

        /* we need the greeting; from it we can extract the authorative name of the mail server we've really connected to.
         * ideal if we're connecting to a round-robin of relay servers and need to track which exact one took the email */
        $this->greeting = $this->_smtp->getGreeting();

        if (is_a($res, 'PEAR_Error')) {
            $error = $this->_error('Failed to send data', $res);
            $this->_smtp->rset();
            return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_DATA);
        }

        return true;
    }

    /**
     * Connect to the SMTP server by instantiating a Net_SMTP object.
     *
     * @return mixed Returns a reference to the Net_SMTP object on success, or
     *               a PEAR_Error containing a descriptive error message on
     *               failure.
     *
     * @since  1.2.0
     */
    public function getSMTPObject()
    {
        if (is_object($this->_smtp) !== false) {
            return $this->_smtp;
        }

        include_once 'Net/SMTP.php';
        $this->_smtp = new Net_SMTP($this->host,
                                     $this->port,
                                     $this->localhost,
                                     $this->pipelining,
                                     0,
                                     $this->socket_options);

        /* If we still don't have an SMTP object at this point, fail. */
        if (is_object($this->_smtp) === false) {
            return PEAR::raiseError('Failed to create a Net_SMTP object',
                                    PEAR_MAIL_SMTP_ERROR_CREATE);
        }

        /* Configure the SMTP connection. */
        if ($this->debug) {
            $this->_smtp->setDebug(true);
        }

        /* Attempt to connect to the configured SMTP server. */
        if (PEAR::isError($res = $this->_smtp->connect($this->timeout))) {
            $error = $this->_error('Failed to connect to ' .
                                   $this->host . ':' . $this->port,
                                   $res);
            return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_CONNECT);
        }

        /* Attempt to authenticate if authentication has been enabled. */
        if ($this->auth) {
            $method = is_string($this->auth) ? $this->auth : '';

            if (PEAR::isError($res = $this->_smtp->auth($this->username,
                                                        $this->password,
                                                        $method))) {
                $error = $this->_error("$method authentication failure",
                                       $res);
                $this->_smtp->rset();
                return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_AUTH);
            }
        }

        return $this->_smtp;
    }

    /**
     * Add parameter associated with a SMTP service extension.
     *
     * @param string Extension keyword.
     * @param string Any value the keyword needs.
     *
     * @since 1.2.0
     */
    public function addServiceExtensionParameter($keyword, $value = null)
    {
        $this->_extparams[$keyword] = $value;
    }

    /**
     * Disconnect and destroy the current SMTP connection.
     *
     * @return boolean True if the SMTP connection no longer exists.
     *
     * @since  1.1.9
     */
    public function disconnect()
    {
        /* If we have an SMTP object, disconnect and destroy it. */
        if (is_object($this->_smtp) && $this->_smtp->disconnect()) {
            $this->_smtp = null;
        }

        /* We are disconnected if we no longer have an SMTP object. */
        return ($this->_smtp === null);
    }

    /**
     * Build a standardized string describing the current SMTP error.
     *
     * @param string $text  Custom string describing the error context.
     * @param object $error Reference to the current PEAR_Error object.
     *
     * @return string       A string describing the current SMTP error.
     *
     * @since  1.1.7
     */
    protected function _error($text, $error)
    {
        /* Split the SMTP response into a code and a response string. */
        list($code, $response) = $this->_smtp->getResponse();

        /* Build our standardized error string. */
        return $text
            . ' [SMTP: ' . $error->getMessage()
            . " (code: $code, response: $response)]";
    }

}
PK�^�\��A~�{�{pear/Mail/RFC822.phpnu�[���<?php
/**
 * RFC 822 Email address list validation Utility
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 2001-2017, Chuck Hagenbuch & Richard Heyes
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Richard Heyes <richard@phpguru.org>
 * @author      Chuck Hagenbuch <chuck@horde.org
 * @copyright   2001-2017 Richard Heyes
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

/**
 * RFC 822 Email address list validation Utility
 *
 * What is it?
 *
 * This class will take an address string, and parse it into it's consituent
 * parts, be that either addresses, groups, or combinations. Nested groups
 * are not supported. The structure it returns is pretty straight forward,
 * and is similar to that provided by the imap_rfc822_parse_adrlist(). Use
 * print_r() to view the structure.
 *
 * How do I use it?
 *
 * $address_string = 'My Group: "Richard" <richard@localhost> (A comment), ted@example.com (Ted Bloggs), Barney;';
 * $structure = Mail_RFC822::parseAddressList($address_string, 'example.com', true)
 * print_r($structure);
 *
 * @author  Richard Heyes <richard@phpguru.org>
 * @author  Chuck Hagenbuch <chuck@horde.org>
 * @version $Revision$
 * @license BSD
 * @package Mail
 */
class Mail_RFC822 {

    /**
     * The address being parsed by the RFC822 object.
     * @var string $address
     */
    var $address = '';

    /**
     * The default domain to use for unqualified addresses.
     * @var string $default_domain
     */
    var $default_domain = 'localhost';

    /**
     * Should we return a nested array showing groups, or flatten everything?
     * @var boolean $nestGroups
     */
    var $nestGroups = true;

    /**
     * Whether or not to validate atoms for non-ascii characters.
     * @var boolean $validate
     */
    var $validate = true;

    /**
     * The array of raw addresses built up as we parse.
     * @var array $addresses
     */
    var $addresses = array();

    /**
     * The final array of parsed address information that we build up.
     * @var array $structure
     */
    var $structure = array();

    /**
     * The current error message, if any.
     * @var string $error
     */
    var $error = null;

    /**
     * An internal counter/pointer.
     * @var integer $index
     */
    var $index = null;

    /**
     * The number of groups that have been found in the address list.
     * @var integer $num_groups
     * @access public
     */
    var $num_groups = 0;

    /**
     * A variable so that we can tell whether or not we're inside a
     * Mail_RFC822 object.
     * @var boolean $mailRFC822
     */
    var $mailRFC822 = true;

    /**
    * A limit after which processing stops
    * @var int $limit
    */
    var $limit = null;

    /**
     * Sets up the object. The address must either be set here or when
     * calling parseAddressList(). One or the other.
     *
     * @param string  $address         The address(es) to validate.
     * @param string  $default_domain  Default domain/host etc. If not supplied, will be set to localhost.
     * @param boolean $nest_groups     Whether to return the structure with groups nested for easier viewing.
     * @param boolean $validate        Whether to validate atoms. Turn this off if you need to run addresses through before encoding the personal names, for instance.
     *
     * @return object Mail_RFC822 A new Mail_RFC822 object.
     */
    public function __construct($address = null, $default_domain = null, $nest_groups = null, $validate = null, $limit = null)
    {
        if (isset($address))        $this->address        = $address;
        if (isset($default_domain)) $this->default_domain = $default_domain;
        if (isset($nest_groups))    $this->nestGroups     = $nest_groups;
        if (isset($validate))       $this->validate       = $validate;
        if (isset($limit))          $this->limit          = $limit;
    }

    /**
     * Starts the whole process. The address must either be set here
     * or when creating the object. One or the other.
     *
     * @param string  $address         The address(es) to validate.
     * @param string  $default_domain  Default domain/host etc.
     * @param boolean $nest_groups     Whether to return the structure with groups nested for easier viewing.
     * @param boolean $validate        Whether to validate atoms. Turn this off if you need to run addresses through before encoding the personal names, for instance.
     *
     * @return array A structured array of addresses.
     */
    public function parseAddressList($address = null, $default_domain = null, $nest_groups = null, $validate = null, $limit = null)
    {
        if (!isset($this) || !isset($this->mailRFC822)) {
            $obj = new Mail_RFC822($address, $default_domain, $nest_groups, $validate, $limit);
            return $obj->parseAddressList();
        }

        if (isset($address))        $this->address        = $address;
        if (isset($default_domain)) $this->default_domain = $default_domain;
        if (isset($nest_groups))    $this->nestGroups     = $nest_groups;
        if (isset($validate))       $this->validate       = $validate;
        if (isset($limit))          $this->limit          = $limit;

        $this->structure  = array();
        $this->addresses  = array();
        $this->error      = null;
        $this->index      = null;

        // Unfold any long lines in $this->address.
        $this->address = preg_replace('/\r?\n/', "\r\n", $this->address);
        $this->address = preg_replace('/\r\n(\t| )+/', ' ', $this->address);

        while ($this->address = $this->_splitAddresses($this->address));

        if ($this->address === false || isset($this->error)) {
            require_once 'PEAR.php';
            return PEAR::raiseError($this->error);
        }

        // Validate each address individually.  If we encounter an invalid
        // address, stop iterating and return an error immediately.
        foreach ($this->addresses as $address) {
            $valid = $this->_validateAddress($address);

            if ($valid === false || isset($this->error)) {
                require_once 'PEAR.php';
                return PEAR::raiseError($this->error);
            }

            if (!$this->nestGroups) {
                $this->structure = array_merge($this->structure, $valid);
            } else {
                $this->structure[] = $valid;
            }
        }

        return $this->structure;
    }

    /**
     * Splits an address into separate addresses.
     *
     * @param string $address The addresses to split.
     * @return boolean Success or failure.
     */
    protected function _splitAddresses($address)
    {
        if (!empty($this->limit) && count($this->addresses) == $this->limit) {
            return '';
        }

        if ($this->_isGroup($address) && !isset($this->error)) {
            $split_char = ';';
            $is_group   = true;
        } elseif (!isset($this->error)) {
            $split_char = ',';
            $is_group   = false;
        } elseif (isset($this->error)) {
            return false;
        }

        // Split the string based on the above ten or so lines.
        $parts  = explode($split_char, $address);
        $string = $this->_splitCheck($parts, $split_char);

        // If a group...
        if ($is_group) {
            // If $string does not contain a colon outside of
            // brackets/quotes etc then something's fubar.

            // First check there's a colon at all:
            if (strpos($string, ':') === false) {
                $this->error = 'Invalid address: ' . $string;
                return false;
            }

            // Now check it's outside of brackets/quotes:
            if (!$this->_splitCheck(explode(':', $string), ':')) {
                return false;
            }

            // We must have a group at this point, so increase the counter:
            $this->num_groups++;
        }

        // $string now contains the first full address/group.
        // Add to the addresses array.
        $this->addresses[] = array(
                                   'address' => trim($string),
                                   'group'   => $is_group
                                   );

        // Remove the now stored address from the initial line, the +1
        // is to account for the explode character.
        $address = trim(substr($address, strlen($string) + 1));

        // If the next char is a comma and this was a group, then
        // there are more addresses, otherwise, if there are any more
        // chars, then there is another address.
        if ($is_group && substr($address, 0, 1) == ','){
            $address = trim(substr($address, 1));
            return $address;

        } elseif (strlen($address) > 0) {
            return $address;

        } else {
            return '';
        }

        // If you got here then something's off
        return false;
    }

    /**
     * Checks for a group at the start of the string.
     *
     * @param string $address The address to check.
     * @return boolean Whether or not there is a group at the start of the string.
     */
    protected function _isGroup($address)
    {
        // First comma not in quotes, angles or escaped:
        $parts  = explode(',', $address);
        $string = $this->_splitCheck($parts, ',');

        // Now we have the first address, we can reliably check for a
        // group by searching for a colon that's not escaped or in
        // quotes or angle brackets.
        if (count($parts = explode(':', $string)) > 1) {
            $string2 = $this->_splitCheck($parts, ':');
            return ($string2 !== $string);
        } else {
            return false;
        }
    }

    /**
     * A common function that will check an exploded string.
     *
     * @param array $parts The exloded string.
     * @param string $char  The char that was exploded on.
     * @return mixed False if the string contains unclosed quotes/brackets, or the string on success.
     */
    protected function _splitCheck($parts, $char)
    {
        $string = $parts[0];

        for ($i = 0; $i < count($parts); $i++) {
            if ($this->_hasUnclosedQuotes($string)
                || $this->_hasUnclosedBrackets($string, '<>')
                || $this->_hasUnclosedBrackets($string, '[]')
                || $this->_hasUnclosedBrackets($string, '()')
                || substr($string, -1) == '\\') {
                if (isset($parts[$i + 1])) {
                    $string = $string . $char . $parts[$i + 1];
                } else {
                    $this->error = 'Invalid address spec. Unclosed bracket or quotes';
                    return false;
                }
            } else {
                $this->index = $i;
                break;
            }
        }

        return $string;
    }

    /**
     * Checks if a string has unclosed quotes or not.
     *
     * @param string $string  The string to check.
     * @return boolean  True if there are unclosed quotes inside the string,
     *                  false otherwise.
     */
    protected function _hasUnclosedQuotes($string)
    {
        $string = trim($string);
        $iMax = strlen($string);
        $in_quote = false;
        $i = $slashes = 0;

        for (; $i < $iMax; ++$i) {
            switch ($string[$i]) {
            case '\\':
                ++$slashes;
                break;

            case '"':
                if ($slashes % 2 == 0) {
                    $in_quote = !$in_quote;
                }
                // Fall through to default action below.

            default:
                $slashes = 0;
                break;
            }
        }

        return $in_quote;
    }

    /**
     * Checks if a string has an unclosed brackets or not. IMPORTANT:
     * This function handles both angle brackets and square brackets;
     *
     * @param string $string The string to check.
     * @param string $chars  The characters to check for.
     * @return boolean True if there are unclosed brackets inside the string, false otherwise.
     */
    protected function _hasUnclosedBrackets($string, $chars)
    {
        $num_angle_start = substr_count($string, $chars[0]);
        $num_angle_end   = substr_count($string, $chars[1]);

        $this->_hasUnclosedBracketsSub($string, $num_angle_start, $chars[0]);
        $this->_hasUnclosedBracketsSub($string, $num_angle_end, $chars[1]);

        if ($num_angle_start < $num_angle_end) {
            $this->error = 'Invalid address spec. Unmatched quote or bracket (' . $chars . ')';
            return false;
        } else {
            return ($num_angle_start > $num_angle_end);
        }
    }

    /**
     * Sub function that is used only by hasUnclosedBrackets().
     *
     * @param string $string The string to check.
     * @param integer &$num    The number of occurences.
     * @param string $char   The character to count.
     * @return integer The number of occurences of $char in $string, adjusted for backslashes.
     */
    protected function _hasUnclosedBracketsSub($string, &$num, $char)
    {
        $parts = explode($char, $string);
        for ($i = 0; $i < count($parts); $i++){
            if (substr($parts[$i], -1) == '\\' || $this->_hasUnclosedQuotes($parts[$i]))
                $num--;
            if (isset($parts[$i + 1]))
                $parts[$i + 1] = $parts[$i] . $char . $parts[$i + 1];
        }

        return $num;
    }

    /**
     * Function to begin checking the address.
     *
     * @param string $address The address to validate.
     * @return mixed False on failure, or a structured array of address information on success.
     */
    protected function _validateAddress($address)
    {
        $is_group = false;
        $addresses = array();

        if ($address['group']) {
            $is_group = true;

            // Get the group part of the name
            $parts     = explode(':', $address['address']);
            $groupname = $this->_splitCheck($parts, ':');
            $structure = array();

            // And validate the group part of the name.
            if (!$this->_validatePhrase($groupname)){
                $this->error = 'Group name did not validate.';
                return false;
            } else {
                // Don't include groups if we are not nesting
                // them. This avoids returning invalid addresses.
                if ($this->nestGroups) {
                    $structure = new stdClass;
                    $structure->groupname = $groupname;
                }
            }

            $address['address'] = ltrim(substr($address['address'], strlen($groupname . ':')));
        }

        // If a group then split on comma and put into an array.
        // Otherwise, Just put the whole address in an array.
        if ($is_group) {
            while (strlen($address['address']) > 0) {
                $parts       = explode(',', $address['address']);
                $addresses[] = $this->_splitCheck($parts, ',');
                $address['address'] = trim(substr($address['address'], strlen(end($addresses) . ',')));
            }
        } else {
            $addresses[] = $address['address'];
        }

        // Trim the whitespace from all of the address strings.
        array_map('trim', $addresses);

        // Validate each mailbox.
        // Format could be one of: name <geezer@domain.com>
        //                         geezer@domain.com
        //                         geezer
        // ... or any other format valid by RFC 822.
        for ($i = 0; $i < count($addresses); $i++) {
            if (!$this->validateMailbox($addresses[$i])) {
                if (empty($this->error)) {
                    $this->error = 'Validation failed for: ' . $addresses[$i];
                }
                return false;
            }
        }

        // Nested format
        if ($this->nestGroups) {
            if ($is_group) {
                $structure->addresses = $addresses;
            } else {
                $structure = $addresses[0];
            }

        // Flat format
        } else {
            if ($is_group) {
                $structure = array_merge($structure, $addresses);
            } else {
                $structure = $addresses;
            }
        }

        return $structure;
    }

    /**
     * Function to validate a phrase.
     *
     * @param string $phrase The phrase to check.
     * @return boolean Success or failure.
     */
    protected function _validatePhrase($phrase)
    {
        // Splits on one or more Tab or space.
        $parts = preg_split('/[ \\x09]+/', $phrase, -1, PREG_SPLIT_NO_EMPTY);

        $phrase_parts = array();
        while (count($parts) > 0){
            $phrase_parts[] = $this->_splitCheck($parts, ' ');
            for ($i = 0; $i < $this->index + 1; $i++)
                array_shift($parts);
        }

        foreach ($phrase_parts as $part) {
            // If quoted string:
            if (substr($part, 0, 1) == '"') {
                if (!$this->_validateQuotedString($part)) {
                    return false;
                }
                continue;
            }

            // Otherwise it's an atom:
            if (!$this->_validateAtom($part)) return false;
        }

        return true;
    }

    /**
     * Function to validate an atom which from rfc822 is:
     * atom = 1*<any CHAR except specials, SPACE and CTLs>
     *
     * If validation ($this->validate) has been turned off, then
     * validateAtom() doesn't actually check anything. This is so that you
     * can split a list of addresses up before encoding personal names
     * (umlauts, etc.), for example.
     *
     * @param string $atom The string to check.
     * @return boolean Success or failure.
     */
    protected function _validateAtom($atom)
    {
        if (!$this->validate) {
            // Validation has been turned off; assume the atom is okay.
            return true;
        }

        // Check for any char from ASCII 0 - ASCII 127
        if (!preg_match('/^[\\x00-\\x7E]+$/i', $atom, $matches)) {
            return false;
        }

        // Check for specials:
        if (preg_match('/[][()<>@,;\\:". ]/', $atom)) {
            return false;
        }

        // Check for control characters (ASCII 0-31):
        if (preg_match('/[\\x00-\\x1F]+/', $atom)) {
            return false;
        }

        return true;
    }

    /**
     * Function to validate quoted string, which is:
     * quoted-string = <"> *(qtext/quoted-pair) <">
     *
     * @param string $qstring The string to check
     * @return boolean Success or failure.
     */
    protected function _validateQuotedString($qstring)
    {
        // Leading and trailing "
        $qstring = substr($qstring, 1, -1);

        // Perform check, removing quoted characters first.
        return !preg_match('/[\x0D\\\\"]/', preg_replace('/\\\\./', '', $qstring));
    }

    /**
     * Function to validate a mailbox, which is:
     * mailbox =   addr-spec         ; simple address
     *           / phrase route-addr ; name and route-addr
     *
     * @param string &$mailbox The string to check.
     * @return boolean Success or failure.
     */
    public function validateMailbox(&$mailbox)
    {
        // A couple of defaults.
        $phrase  = '';
        $comment = '';
        $comments = array();

        // Catch any RFC822 comments and store them separately.
        $_mailbox = $mailbox;
        while (strlen(trim($_mailbox)) > 0) {
            $parts = explode('(', $_mailbox);
            $before_comment = $this->_splitCheck($parts, '(');
            if ($before_comment != $_mailbox) {
                // First char should be a (.
                $comment    = substr(str_replace($before_comment, '', $_mailbox), 1);
                $parts      = explode(')', $comment);
                $comment    = $this->_splitCheck($parts, ')');
                $comments[] = $comment;

                // +2 is for the brackets
                $_mailbox = substr($_mailbox, strpos($_mailbox, '('.$comment)+strlen($comment)+2);
            } else {
                break;
            }
        }

        foreach ($comments as $comment) {
            $mailbox = str_replace("($comment)", '', $mailbox);
        }

        $mailbox = trim($mailbox);

        // Check for name + route-addr
        if (substr($mailbox, -1) == '>' && substr($mailbox, 0, 1) != '<') {
            $parts  = explode('<', $mailbox);
            $name   = $this->_splitCheck($parts, '<');

            $phrase     = trim($name);
            $route_addr = trim(substr($mailbox, strlen($name.'<'), -1));

            if ($this->_validatePhrase($phrase) === false || ($route_addr = $this->_validateRouteAddr($route_addr)) === false) {
                return false;
            }

        // Only got addr-spec
        } else {
            // First snip angle brackets if present.
            if (substr($mailbox, 0, 1) == '<' && substr($mailbox, -1) == '>') {
                $addr_spec = substr($mailbox, 1, -1);
            } else {
                $addr_spec = $mailbox;
            }

            if (($addr_spec = $this->_validateAddrSpec($addr_spec)) === false) {
                return false;
            }
        }

        // Construct the object that will be returned.
        $mbox = new stdClass();

        // Add the phrase (even if empty) and comments
        $mbox->personal = $phrase;
        $mbox->comment  = isset($comments) ? $comments : array();

        if (isset($route_addr)) {
            $mbox->mailbox = $route_addr['local_part'];
            $mbox->host    = $route_addr['domain'];
            $route_addr['adl'] !== '' ? $mbox->adl = $route_addr['adl'] : '';
        } else {
            $mbox->mailbox = $addr_spec['local_part'];
            $mbox->host    = $addr_spec['domain'];
        }

        $mailbox = $mbox;
        return true;
    }

    /**
     * This function validates a route-addr which is:
     * route-addr = "<" [route] addr-spec ">"
     *
     * Angle brackets have already been removed at the point of
     * getting to this function.
     *
     * @param string $route_addr The string to check.
     * @return mixed False on failure, or an array containing validated address/route information on success.
     */
    protected function _validateRouteAddr($route_addr)
    {
        // Check for colon.
        if (strpos($route_addr, ':') !== false) {
            $parts = explode(':', $route_addr);
            $route = $this->_splitCheck($parts, ':');
        } else {
            $route = $route_addr;
        }

        // If $route is same as $route_addr then the colon was in
        // quotes or brackets or, of course, non existent.
        if ($route === $route_addr){
            unset($route);
            $addr_spec = $route_addr;
            if (($addr_spec = $this->_validateAddrSpec($addr_spec)) === false) {
                return false;
            }
        } else {
            // Validate route part.
            if (($route = $this->_validateRoute($route)) === false) {
                return false;
            }

            $addr_spec = substr($route_addr, strlen($route . ':'));

            // Validate addr-spec part.
            if (($addr_spec = $this->_validateAddrSpec($addr_spec)) === false) {
                return false;
            }
        }

        if (isset($route)) {
            $return['adl'] = $route;
        } else {
            $return['adl'] = '';
        }

        $return = array_merge($return, $addr_spec);
        return $return;
    }

    /**
     * Function to validate a route, which is:
     * route = 1#("@" domain) ":"
     *
     * @param string $route The string to check.
     * @return mixed False on failure, or the validated $route on success.
     */
    protected function _validateRoute($route)
    {
        // Split on comma.
        $domains = explode(',', trim($route));

        foreach ($domains as $domain) {
            $domain = str_replace('@', '', trim($domain));
            if (!$this->_validateDomain($domain)) return false;
        }

        return $route;
    }

    /**
     * Function to validate a domain, though this is not quite what
     * you expect of a strict internet domain.
     *
     * domain = sub-domain *("." sub-domain)
     *
     * @param string $domain The string to check.
     * @return mixed False on failure, or the validated domain on success.
     */
    protected function _validateDomain($domain)
    {
        // Note the different use of $subdomains and $sub_domains
        $subdomains = explode('.', $domain);

        while (count($subdomains) > 0) {
            $sub_domains[] = $this->_splitCheck($subdomains, '.');
            for ($i = 0; $i < $this->index + 1; $i++)
                array_shift($subdomains);
        }

        foreach ($sub_domains as $sub_domain) {
            if (!$this->_validateSubdomain(trim($sub_domain)))
                return false;
        }

        // Managed to get here, so return input.
        return $domain;
    }

    /**
     * Function to validate a subdomain:
     *   subdomain = domain-ref / domain-literal
     *
     * @param string $subdomain The string to check.
     * @return boolean Success or failure.
     */
    protected function _validateSubdomain($subdomain)
    {
        if (preg_match('|^\[(.*)]$|', $subdomain, $arr)){
            if (!$this->_validateDliteral($arr[1])) return false;
        } else {
            if (!$this->_validateAtom($subdomain)) return false;
        }

        // Got here, so return successful.
        return true;
    }

    /**
     * Function to validate a domain literal:
     *   domain-literal =  "[" *(dtext / quoted-pair) "]"
     *
     * @param string $dliteral The string to check.
     * @return boolean Success or failure.
     */
    protected function _validateDliteral($dliteral)
    {
        return !preg_match('/(.)[][\x0D\\\\]/', $dliteral, $matches) && ((! isset($matches[1])) || $matches[1] != '\\');
    }

    /**
     * Function to validate an addr-spec.
     *
     * addr-spec = local-part "@" domain
     *
     * @param string $addr_spec The string to check.
     * @return mixed False on failure, or the validated addr-spec on success.
     */
    protected function _validateAddrSpec($addr_spec)
    {
        $addr_spec = trim($addr_spec);

        // Split on @ sign if there is one.
        if (strpos($addr_spec, '@') !== false) {
            $parts      = explode('@', $addr_spec);
            $local_part = $this->_splitCheck($parts, '@');
            $domain     = substr($addr_spec, strlen($local_part . '@'));

        // No @ sign so assume the default domain.
        } else {
            $local_part = $addr_spec;
            $domain     = $this->default_domain;
        }

        if (($local_part = $this->_validateLocalPart($local_part)) === false) return false;
        if (($domain     = $this->_validateDomain($domain)) === false) return false;

        // Got here so return successful.
        return array('local_part' => $local_part, 'domain' => $domain);
    }

    /**
     * Function to validate the local part of an address:
     *   local-part = word *("." word)
     *
     * @param string $local_part
     * @return mixed False on failure, or the validated local part on success.
     */
    protected function _validateLocalPart($local_part)
    {
        $parts = explode('.', $local_part);
        $words = array();

        // Split the local_part into words.
        while (count($parts) > 0) {
            $words[] = $this->_splitCheck($parts, '.');
            for ($i = 0; $i < $this->index + 1; $i++) {
                array_shift($parts);
            }
        }

        // Validate each word.
        foreach ($words as $word) {
            // word cannot be empty (#17317)
            if ($word === '') {
                return false;
            }
            // If this word contains an unquoted space, it is invalid. (6.2.4)
            if (strpos($word, ' ') && $word[0] !== '"')
            {
                return false;
            }

            if ($this->_validatePhrase(trim($word)) === false) return false;
        }

        // Managed to get here, so return the input.
        return $local_part;
    }

    /**
     * Returns an approximate count of how many addresses are in the
     * given string. This is APPROXIMATE as it only splits based on a
     * comma which has no preceding backslash. Could be useful as
     * large amounts of addresses will end up producing *large*
     * structures when used with parseAddressList().
     *
     * @param  string $data Addresses to count
     * @return int          Approximate count
     */
    public function approximateCount($data)
    {
        return count(preg_split('/(?<!\\\\),/', $data));
    }

    /**
     * This is a email validating function separate to the rest of the
     * class. It simply validates whether an email is of the common
     * internet form: <user>@<domain>. This can be sufficient for most
     * people. Optional stricter mode can be utilised which restricts
     * mailbox characters allowed to alphanumeric, full stop, hyphen
     * and underscore.
     *
     * @param  string  $data   Address to check
     * @param  boolean $strict Optional stricter mode
     * @return mixed           False if it fails, an indexed array
     *                         username/domain if it matches
     */
    public function isValidInetAddress($data, $strict = false)
    {
        $regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i' : '/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i';
        if (preg_match($regex, trim($data), $matches)) {
            return array($matches[1], $matches[2]);
        } else {
            return false;
        }
    }

}
PK�^�\R]�IIpear/.registry/net_smtp.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.12";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:8:"Net_SMTP";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:38:"An implementation of the SMTP protocol";s:11:"description";s:78:"Provides an implementation of the SMTP protocol using PEAR's Net_Socket class.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:10:"Jon Parise";s:4:"user";s:3:"jon";s:5:"email";s:11:"jon@php.net";s:6:"active";s:3:"yes";}i:1;a:4:{s:4:"name";s:15:"Chuck Hagenbuch";s:4:"user";s:8:"chagenbu";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:3:"yes";}}s:4:"date";s:10:"2021-03-19";s:4:"time";s:8:"18:39:33";s:7:"version";a:2:{s:7:"release";s:6:"1.10.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:47:"https://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:27:"* Add the starttls() method";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:8:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5ef820d1bc73898b55a153576953fe70";s:4:"name";s:18:"examples/basic.php";s:4:"role";s:3:"doc";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0cd9a0c35d1ea17d46de9b5a39fb771d";s:4:"name";s:15:"tests/auth.phpt";s:4:"role";s:4:"test";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"89135826a107455d336071f3570ccd13";s:4:"name";s:16:"tests/basic.phpt";s:4:"role";s:4:"test";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8517c458ae5094ee3c31a545d51c69c8";s:4:"name";s:21:"tests/config.php.dist";s:4:"role";s:4:"test";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"15c9cb4ef93e0aee232b503e12fc21ee";s:4:"name";s:20:"tests/quotedata.phpt";s:4:"role";s:4:"test";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"00f931f5dd61430e6057f895decdb6af";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9ddd7d9135cfe6e573cd757edf6855f2";s:4:"name";s:10:"README.rst";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a157897ae2efc43eabd961597557243a";s:4:"name";s:12:"Net/SMTP.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:6:"1.10.1";}s:7:"package";a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.7";}}s:8:"optional";a:1:{s:7:"package";a:3:{s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.5";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:8:{s:18:"examples/basic.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5ef820d1bc73898b55a153576953fe70";s:4:"name";s:18:"examples/basic.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/doc/pear/Net_SMTP/examples/basic.php";}s:15:"tests/auth.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0cd9a0c35d1ea17d46de9b5a39fb771d";s:4:"name";s:15:"tests/auth.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/pear/test/Net_SMTP/tests/auth.phpt";}s:16:"tests/basic.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"89135826a107455d336071f3570ccd13";s:4:"name";s:16:"tests/basic.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/test/Net_SMTP/tests/basic.phpt";}s:21:"tests/config.php.dist";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8517c458ae5094ee3c31a545d51c69c8";s:4:"name";s:21:"tests/config.php.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/test/Net_SMTP/tests/config.php.dist";}s:20:"tests/quotedata.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"15c9cb4ef93e0aee232b503e12fc21ee";s:4:"name";s:20:"tests/quotedata.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/test/Net_SMTP/tests/quotedata.phpt";}s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"00f931f5dd61430e6057f895decdb6af";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:50:"/opt/alt/php54/usr/share/doc/pear/Net_SMTP/LICENSE";}s:10:"README.rst";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9ddd7d9135cfe6e573cd757edf6855f2";s:4:"name";s:10:"README.rst";s:4:"role";s:3:"doc";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/doc/pear/Net_SMTP/README.rst";}s:12:"Net/SMTP.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a157897ae2efc43eabd961597557243a";s:4:"name";s:12:"Net/SMTP.php";s:4:"role";s:3:"php";s:12:"installed_as";s:42:"/opt/alt/php54/usr/share/pear/Net/SMTP.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:51:"/opt/alt/php54/usr/share/doc/pear/Net_SMTP/examples";b:1;s:42:"/opt/alt/php54/usr/share/doc/pear/Net_SMTP";b:1;s:49:"/opt/alt/php54/usr/share/pear/test/Net_SMTP/tests";b:1;s:43:"/opt/alt/php54/usr/share/pear/test/Net_SMTP";b:1;s:33:"/opt/alt/php54/usr/share/pear/Net";b:1;}s:3:"old";a:7:{s:7:"version";s:6:"1.10.0";s:12:"release_date";s:10:"2021-03-19";s:13:"release_state";s:6:"stable";s:15:"release_license";s:12:"BSD-2-Clause";s:13:"release_notes";s:27:"* Add the starttls() method";s:12:"release_deps";a:4:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:6:"1.10.1";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:10:"Net_Socket";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.0.7";s:8:"optional";s:2:"no";}i:3;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:9:"Auth_SASL";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.0.5";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:2:{i:0;a:5:{s:4:"name";s:10:"Jon Parise";s:5:"email";s:11:"jon@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:3:"jon";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:15:"Chuck Hagenbuch";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:3:"yes";s:6:"handle";s:8:"chagenbu";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506498;}PK�^�\S�>,6,6(pear/.registry/structures_linkedlist.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.0";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:21:"Structures_LinkedList";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:41:"Implements singly and doubly-linked lists";s:11:"description";s:181:"A singly-linked list offers the ability to insert or delete
 nodes at any point within the list. A doubly-linked list also offers the
 ability to request previous nodes in the list.";s:4:"lead";a:4:{s:4:"name";s:9:"Dan Scott";s:4:"user";s:3:"dbs";s:5:"email";s:11:"dbs@php.net";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2010-08-15";s:4:"time";s:8:"10:13:00";s:7:"version";a:2:{s:7:"release";s:5:"0.2.2";s:3:"api";s:5:"0.2.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:38:"http://apache.org/licenses/LICENSE-2.0";}s:8:"_content";s:27:"Apache License, Version 2.0";}s:5:"notes";s:20:"* Fix package layout";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:4:"name";s:1:"/";}s:4:"file";a:22:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b7ac5a9d6d9a3eb2c3cbb1db76ad75a3";s:4:"name";s:32:"Structures/LinkedList/Double.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"310eefdff99016e4a3282dd02d5a7efa";s:4:"name";s:32:"Structures/LinkedList/Single.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"9b1565a45687bb631a452b152e0d3d15";s:4:"name";s:32:"examples/double_link_example.php";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"56d8c9a65cf967f09136a1b5b42fb787";s:4:"name";s:32:"examples/single_link_example.php";s:4:"role";s:3:"doc";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"54a63c64625c0b1785d890cc0ecb6957";s:4:"name";s:20:"tests/LinkTester.php";s:4:"role";s:4:"test";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6138a89189609d8b0c35a69ce6995457";s:4:"name";s:26:"tests/SingleLinkTester.php";s:4:"role";s:4:"test";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"c7a6ad89f79222cf62148893e88a0b5a";s:4:"name";s:19:"tests/link_001.phpt";s:4:"role";s:4:"test";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"960408b3ea85cfe453f7d4b1814784ea";s:4:"name";s:19:"tests/link_002.phpt";s:4:"role";s:4:"test";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"392d4c38523f764091433fdf19cf4943";s:4:"name";s:19:"tests/link_003.phpt";s:4:"role";s:4:"test";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"88bfd20fe97800c4f69ec7577abd2ecd";s:4:"name";s:19:"tests/link_004.phpt";s:4:"role";s:4:"test";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"dac8403b1df9d64e16e45e87121a74fa";s:4:"name";s:19:"tests/link_005.phpt";s:4:"role";s:4:"test";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"bfc84666dbe64008101adadecf008677";s:4:"name";s:19:"tests/link_006.phpt";s:4:"role";s:4:"test";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"1a7eb8c8a63ec97fdb0154214c679cfa";s:4:"name";s:19:"tests/link_007.phpt";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"86f0c12acf2706a82d0d0dc625ab3608";s:4:"name";s:26:"tests/single_link_001.phpt";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"19c3e9b406dffe9c315e0264e0d257f8";s:4:"name";s:26:"tests/single_link_002.phpt";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"d4029576a49c41f18c35f72bdb37da7e";s:4:"name";s:26:"tests/single_link_003.phpt";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"574cb63523d7716f37fad368eefc695b";s:4:"name";s:26:"tests/single_link_004.phpt";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"4712a8421da2369e72ec789e0fe3993f";s:4:"name";s:26:"tests/single_link_005.phpt";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"a7f31515a9a3260aa1c17e003a4c352c";s:4:"name";s:26:"tests/single_link_006.phpt";s:4:"role";s:4:"test";}}i:19;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6fe94be57c862475367ed91a7284a6b2";s:4:"name";s:26:"tests/single_link_007.phpt";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6e8edc55d5a37acbe96ed9860b8680cc";s:4:"name";s:9:"CHANGELOG";s:4:"role";s:3:"doc";}}i:21;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"3b83ef96387f14655fc854ddc3c6bd57";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:3:"5.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:22:{s:32:"Structures/LinkedList/Double.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b7ac5a9d6d9a3eb2c3cbb1db76ad75a3";s:4:"name";s:32:"Structures/LinkedList/Double.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/Structures/LinkedList/Double.php";}s:32:"Structures/LinkedList/Single.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"310eefdff99016e4a3282dd02d5a7efa";s:4:"name";s:32:"Structures/LinkedList/Single.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/Structures/LinkedList/Single.php";}s:32:"examples/double_link_example.php";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"9b1565a45687bb631a452b152e0d3d15";s:4:"name";s:32:"examples/double_link_example.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/doc/pear/Structures_LinkedList/examples/double_link_example.php";}s:32:"examples/single_link_example.php";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"56d8c9a65cf967f09136a1b5b42fb787";s:4:"name";s:32:"examples/single_link_example.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/doc/pear/Structures_LinkedList/examples/single_link_example.php";}s:20:"tests/LinkTester.php";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"54a63c64625c0b1785d890cc0ecb6957";s:4:"name";s:20:"tests/LinkTester.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/LinkTester.php";}s:26:"tests/SingleLinkTester.php";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6138a89189609d8b0c35a69ce6995457";s:4:"name";s:26:"tests/SingleLinkTester.php";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/SingleLinkTester.php";}s:19:"tests/link_001.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"c7a6ad89f79222cf62148893e88a0b5a";s:4:"name";s:19:"tests/link_001.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/link_001.phpt";}s:19:"tests/link_002.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"960408b3ea85cfe453f7d4b1814784ea";s:4:"name";s:19:"tests/link_002.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/link_002.phpt";}s:19:"tests/link_003.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"392d4c38523f764091433fdf19cf4943";s:4:"name";s:19:"tests/link_003.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/link_003.phpt";}s:19:"tests/link_004.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"88bfd20fe97800c4f69ec7577abd2ecd";s:4:"name";s:19:"tests/link_004.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/link_004.phpt";}s:19:"tests/link_005.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"dac8403b1df9d64e16e45e87121a74fa";s:4:"name";s:19:"tests/link_005.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/link_005.phpt";}s:19:"tests/link_006.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"bfc84666dbe64008101adadecf008677";s:4:"name";s:19:"tests/link_006.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/link_006.phpt";}s:19:"tests/link_007.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"1a7eb8c8a63ec97fdb0154214c679cfa";s:4:"name";s:19:"tests/link_007.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/link_007.phpt";}s:26:"tests/single_link_001.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"86f0c12acf2706a82d0d0dc625ab3608";s:4:"name";s:26:"tests/single_link_001.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/single_link_001.phpt";}s:26:"tests/single_link_002.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"19c3e9b406dffe9c315e0264e0d257f8";s:4:"name";s:26:"tests/single_link_002.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/single_link_002.phpt";}s:26:"tests/single_link_003.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"d4029576a49c41f18c35f72bdb37da7e";s:4:"name";s:26:"tests/single_link_003.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/single_link_003.phpt";}s:26:"tests/single_link_004.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"574cb63523d7716f37fad368eefc695b";s:4:"name";s:26:"tests/single_link_004.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/single_link_004.phpt";}s:26:"tests/single_link_005.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"4712a8421da2369e72ec789e0fe3993f";s:4:"name";s:26:"tests/single_link_005.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/single_link_005.phpt";}s:26:"tests/single_link_006.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"a7f31515a9a3260aa1c17e003a4c352c";s:4:"name";s:26:"tests/single_link_006.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/single_link_006.phpt";}s:26:"tests/single_link_007.phpt";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6fe94be57c862475367ed91a7284a6b2";s:4:"name";s:26:"tests/single_link_007.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests/single_link_007.phpt";}s:9:"CHANGELOG";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"6e8edc55d5a37acbe96ed9860b8680cc";s:4:"name";s:9:"CHANGELOG";s:4:"role";s:3:"doc";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/doc/pear/Structures_LinkedList/CHANGELOG";}s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:21:"Structures/LinkedList";s:6:"md5sum";s:32:"3b83ef96387f14655fc854ddc3c6bd57";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/doc/pear/Structures_LinkedList/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:6:{s:51:"/opt/alt/php54/usr/share/pear/Structures/LinkedList";b:1;s:40:"/opt/alt/php54/usr/share/pear/Structures";b:1;s:64:"/opt/alt/php54/usr/share/doc/pear/Structures_LinkedList/examples";b:1;s:55:"/opt/alt/php54/usr/share/doc/pear/Structures_LinkedList";b:1;s:62:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList/tests";b:1;s:56:"/opt/alt/php54/usr/share/pear/test/Structures_LinkedList";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"0.2.2";s:12:"release_date";s:10:"2010-08-15";s:13:"release_state";s:4:"beta";s:15:"release_license";s:27:"Apache License, Version 2.0";s:13:"release_notes";s:20:"* Fix package layout";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:3:"5.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:9:"Dan Scott";s:5:"email";s:11:"dbs@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:3:"dbs";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506497;}PK�^�\��4�D�D�pear/.registry/pear.regnu�[���a:24:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.13";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:16:"PEAR Base System";s:11:"description";s:1100:"The PEAR package contains:
 * the PEAR installer, for creating, distributing
   and installing packages
 * the PEAR_Exception PHP5 error handling mechanism
 * the PEAR_ErrorStack advanced error handling mechanism
 * the PEAR_Error error handling mechanism
 * the OS_Guess class for retrieving info about the OS
   where PHP is running on
 * the System class for quick handling of common operations
   with files and directories
 * the PEAR base class
  Features in a nutshell:
  * full support for channels
  * pre-download dependency validation
  * new package.xml 2.0 format allows tremendous flexibility while maintaining BC
  * support for optional dependency groups and limited support for sub-packaging
  * robust dependency support
  * full dependency validation on uninstall
  * remote install for hosts with only ftp access - no more problems with
    restricted host installation
  * full support for mirroring
  * support for bundling several packages into a single tarball
  * support for static dependencies on a url-based package
  * support for custom file roles and installation tasks";s:4:"lead";a:7:{i:0;a:4:{s:4:"name";s:11:"Greg Beaver";s:4:"user";s:6:"cellog";s:5:"email";s:14:"cellog@php.net";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:17:"Pierre-Alain Joye";s:4:"user";s:6:"pajoye";s:5:"email";s:14:"pierre@php.net";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:11:"Stig Bakken";s:4:"user";s:3:"ssb";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";}i:3;a:4:{s:4:"name";s:13:"Tomas V.V.Cox";s:4:"user";s:3:"cox";s:5:"email";s:15:"cox@idecnet.com";s:6:"active";s:2:"no";}i:4;a:4:{s:4:"name";s:13:"Helgi Thormar";s:4:"user";s:5:"dufuz";s:5:"email";s:13:"dufuz@php.net";s:6:"active";s:2:"no";}i:5;a:4:{s:4:"name";s:16:"Christian Weiske";s:4:"user";s:7:"cweiske";s:5:"email";s:15:"cweiske@php.net";s:6:"active";s:2:"no";}i:6;a:4:{s:4:"name";s:13:"Chuck Burgess";s:4:"user";s:7:"ashnazg";s:5:"email";s:15:"ashnazg@php.net";s:6:"active";s:3:"yes";}}s:9:"developer";a:4:{s:4:"name";s:9:"Tias Guns";s:4:"user";s:4:"tias";s:5:"email";s:12:"tias@php.net";s:6:"active";s:2:"no";}s:6:"helper";a:3:{i:0;a:4:{s:4:"name";s:11:"Tim Jackson";s:4:"user";s:4:"timj";s:5:"email";s:12:"timj@php.net";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:15:"Bertrand Gugger";s:4:"user";s:5:"toggg";s:5:"email";s:13:"toggg@php.net";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:13:"Martin Jansen";s:4:"user";s:2:"mj";s:5:"email";s:10:"mj@php.net";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2024-11-24";s:4:"time";s:8:"22:09:42";s:7:"version";a:2:{s:7:"release";s:7:"1.10.16";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:164:"* PR #141: Fix bug #27796: "Array to string" conversion warnings on installs/other actions
* PR #145: Never reference E_STRICT on PHP 8.4+
* PR #147: Fix tests 8.1+";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:105:{i:0;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c0482b234f269360953c87472b5cf746";s:4:"name";s:12:"OS/Guess.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:1;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b371e9c6b4d667abb8be01f2788dcf9";s:4:"name";s:27:"PEAR/ChannelFile/Parser.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8fd87e64002e11fd86eb2f3fbfee6599";s:4:"name";s:21:"PEAR/Command/Auth.xml";s:4:"role";s:3:"php";}}i:3;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"65b6b36c4cc53f2836ad09b070829877";s:4:"name";s:21:"PEAR/Command/Auth.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ce6bb5b6fdc02e0f50e7676403fd84a4";s:4:"name";s:22:"PEAR/Command/Build.xml";s:4:"role";s:3:"php";}}i:5;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e19325f59c4013694a4a06b61e7ac3be";s:4:"name";s:22:"PEAR/Command/Build.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6d5aab4d4308c3005b5f584c7783a031";s:4:"name";s:25:"PEAR/Command/Channels.xml";s:4:"role";s:3:"php";}}i:7;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"56b3b36834a751f6e7b86dcba6cefe2f";s:4:"name";s:25:"PEAR/Command/Channels.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:8;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aae7cc03e9b7fe7c4f504b970dca5411";s:4:"name";s:23:"PEAR/Command/Common.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"91f189cb9423b5e87ee0abc5ea1a2be3";s:4:"name";s:23:"PEAR/Command/Config.xml";s:4:"role";s:3:"php";}}i:10;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3c5d633b0e8d4e39e9bfb286f51130a5";s:4:"name";s:23:"PEAR/Command/Config.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"24d05213cae7faa3880bbb5e40998867";s:4:"name";s:24:"PEAR/Command/Install.xml";s:4:"role";s:3:"php";}}i:12;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3dab53d092878709aa16f73143600107";s:4:"name";s:24:"PEAR/Command/Install.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5cb62a04c0a268f4edd64a49a3895c92";s:4:"name";s:23:"PEAR/Command/Mirror.xml";s:4:"role";s:3:"php";}}i:14;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2f5798bb62453d8d1bffa3d050584232";s:4:"name";s:23:"PEAR/Command/Mirror.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9367dcd7e4dbdde423f9c4c7d3f3a919";s:4:"name";s:24:"PEAR/Command/Package.xml";s:4:"role";s:3:"php";}}i:16;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"57521ff1e89bcd23a853134f30836990";s:4:"name";s:24:"PEAR/Command/Package.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:2:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@DATA-DIR@";s:2:"to";s:8:"data_dir";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"28dc842ea725d8787b9f9c3dbca5aa22";s:4:"name";s:23:"PEAR/Command/Pickle.xml";s:4:"role";s:3:"php";}}i:18;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4025dd6411a73b19a5c19b3300060625";s:4:"name";s:23:"PEAR/Command/Pickle.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"49b046cfc14747f0365e02e9c3f0e6dc";s:4:"name";s:25:"PEAR/Command/Registry.xml";s:4:"role";s:3:"php";}}i:20;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9f2ea65794243f0b7287e8883f2ab60e";s:4:"name";s:25:"PEAR/Command/Registry.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"29c02e823879b4e3e291f6b36fb339f1";s:4:"name";s:23:"PEAR/Command/Remote.xml";s:4:"role";s:3:"php";}}i:22;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"42c51cbb21c103fe0288e5c16871f401";s:4:"name";s:23:"PEAR/Command/Remote.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a50c32015005e0761cc3b04679b29ed0";s:4:"name";s:21:"PEAR/Command/Test.xml";s:4:"role";s:3:"php";}}i:24;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fbb0098fcda7fa29adaa0714a325caea";s:4:"name";s:21:"PEAR/Command/Test.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:25;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9229a9711a893a18298e473212689ab4";s:4:"name";s:27:"PEAR/Downloader/Package.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:26;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5379be9492842c3af98241c6e226d285";s:4:"name";s:21:"PEAR/Frontend/CLI.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:27;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"adae220f10a82e5f78b8689a57387753";s:4:"name";s:30:"PEAR/Installer/Role/Common.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d8c62e6275e3aaa7784290912406092c";s:4:"name";s:27:"PEAR/Installer/Role/Cfg.xml";s:4:"role";s:3:"php";}}i:29;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d89d39dcc1c55fb4464f447ce4f84eed";s:4:"name";s:27:"PEAR/Installer/Role/Cfg.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"89a4a2a286e842d45a98974f40a0565c";s:4:"name";s:28:"PEAR/Installer/Role/Data.xml";s:4:"role";s:3:"php";}}i:31;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"89754e8d153937f3dd3266fd8897d965";s:4:"name";s:28:"PEAR/Installer/Role/Data.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b1ce0fe105251c3b75209d6518ee69ac";s:4:"name";s:27:"PEAR/Installer/Role/Doc.xml";s:4:"role";s:3:"php";}}i:33;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"849c557b355f78890ef47fcfd12073ab";s:4:"name";s:27:"PEAR/Installer/Role/Doc.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"af71c0ad42d16a323afe24a4f884ef15";s:4:"name";s:27:"PEAR/Installer/Role/Ext.xml";s:4:"role";s:3:"php";}}i:35;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7d3dc799576b3e3d74d187de118cc3e4";s:4:"name";s:27:"PEAR/Installer/Role/Ext.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"da6743f1e45cce72ea13aef5cdb14867";s:4:"name";s:27:"PEAR/Installer/Role/Man.xml";s:4:"role";s:3:"php";}}i:37;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2509a027ae42c4b96aa49557325a0ec4";s:4:"name";s:27:"PEAR/Installer/Role/Man.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ef88f0321d3e481c2130c95122cf76d8";s:4:"name";s:27:"PEAR/Installer/Role/Php.xml";s:4:"role";s:3:"php";}}i:39;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d7547896ec403dba2eed9825ed86ea64";s:4:"name";s:27:"PEAR/Installer/Role/Php.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"746461dc3b48af6d24094cb0211608f2";s:4:"name";s:30:"PEAR/Installer/Role/Script.xml";s:4:"role";s:3:"php";}}i:41;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"325c60df7f78be127741621561758f46";s:4:"name";s:30:"PEAR/Installer/Role/Script.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e147d63f168ea156fc2be38caaa63804";s:4:"name";s:27:"PEAR/Installer/Role/Src.xml";s:4:"role";s:3:"php";}}i:43;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"464722cee0665ebc75757f76532f0ab2";s:4:"name";s:27:"PEAR/Installer/Role/Src.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a24b596ec987aa5688fc19e8ed4e97ea";s:4:"name";s:28:"PEAR/Installer/Role/Test.xml";s:4:"role";s:3:"php";}}i:45;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a04eb2f4881ec6e6a13ae78f6a43e3cd";s:4:"name";s:28:"PEAR/Installer/Role/Test.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7641e71c5785bb33a4261ebe25ed0fd7";s:4:"name";s:27:"PEAR/Installer/Role/Www.xml";s:4:"role";s:3:"php";}}i:47;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"62699034e3186c2d68a6bb56a6cc23eb";s:4:"name";s:27:"PEAR/Installer/Role/Www.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:48;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e95f2d850fce183e221912b2c2056d04";s:4:"name";s:23:"PEAR/Installer/Role.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:49;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cfa08685115d5e2d7635225d73a91f39";s:4:"name";s:33:"PEAR/PackageFile/Generator/v1.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:50;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d264031153993866828e82129e389ab";s:4:"name";s:33:"PEAR/PackageFile/Generator/v2.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:51;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a2206e0e32ad2ba2f4e2a0c1797f295c";s:4:"name";s:30:"PEAR/PackageFile/Parser/v1.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:52;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3857f4b60878d64551a7cdae783437f7";s:4:"name";s:30:"PEAR/PackageFile/Parser/v2.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:53;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a253999b2109460badc3c71ad2c069e7";s:4:"name";s:26:"PEAR/PackageFile/v2/rw.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:54;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"44dafa313204f68b5fb54b9f61a86d0c";s:4:"name";s:33:"PEAR/PackageFile/v2/Validator.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:55;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cc1ea307bb79c0cbcff4a90a4656e96e";s:4:"name";s:23:"PEAR/PackageFile/v1.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:56;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9e6012d4ef9cb8e12e2ccadcbdcf3d24";s:4:"name";s:23:"PEAR/PackageFile/v2.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:57;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ce77cc6593d8d4eda5ff8620ff09d6ec";s:4:"name";s:16:"PEAR/REST/10.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:58;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bdbd1f2e8afa2cddddecf2687579d316";s:4:"name";s:16:"PEAR/REST/11.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:59;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"11179085b6efb577d37f45cc25e42a35";s:4:"name";s:16:"PEAR/REST/13.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:60;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0eb57da4993a3cfed69fe8135f10b05a";s:4:"name";s:34:"PEAR/Task/Postinstallscript/rw.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:61;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"46c1bdb9a7af8628643e639ec1c3bc58";s:4:"name";s:24:"PEAR/Task/Replace/rw.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:62;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"50e20dbde7e51bb5e11545c56482b68a";s:4:"name";s:24:"PEAR/Task/Unixeol/rw.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:63;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"340be01552844adb50f6e0fa37aa3ffe";s:4:"name";s:27:"PEAR/Task/Windowseol/rw.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:64;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ec7f8db335ad3b5a25d78682745185d1";s:4:"name";s:20:"PEAR/Task/Common.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:65;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86f240c600447fdb86bd38bd32c66c02";s:4:"name";s:31:"PEAR/Task/Postinstallscript.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:66;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c993cdedc64084a1c4b735baec048d50";s:4:"name";s:21:"PEAR/Task/Replace.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:67;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"76c4ca15858c005cda208a9da1f5eb2d";s:4:"name";s:21:"PEAR/Task/Unixeol.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:68;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d790eb3aa5ba22a33e42cb7c5f99fb25";s:4:"name";s:24:"PEAR/Task/Windowseol.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:69;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b3c83ca826a4825ca2db726ed7d4b245";s:4:"name";s:23:"PEAR/Validator/PECL.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:70;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7d89f25a54d100c2afd562fb3bd7c308";s:4:"name";s:16:"PEAR/Builder.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:71;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"edcd484ecfd400875df90ee480c5384d";s:4:"name";s:20:"PEAR/ChannelFile.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:72;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a5d56f9d15ff6d22c12f7db851f281e8";s:4:"name";s:16:"PEAR/Command.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:73;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0af44a13df74291ac2f46949d2035e0e";s:4:"name";s:15:"PEAR/Common.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:74;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"64d0f7b2737e5f182d0ab98bc77930d2";s:4:"name";s:15:"PEAR/Config.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:75;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7e8dfae09802be7f2e6170062bb80cbd";s:4:"name";s:21:"PEAR/DependencyDB.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:76;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"76fdabdee883fd16b986332552b9e3dc";s:4:"name";s:20:"PEAR/Dependency2.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:77;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2ccb7bb2d00eae201ee7ae1eef49ad8a";s:4:"name";s:19:"PEAR/Downloader.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:78;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea807632b63d2e0acd6924db23aaa0eb";s:4:"name";s:19:"PEAR/ErrorStack.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:79;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"544ed48cab9407a936d058d09e773e22";s:4:"name";s:18:"PEAR/Exception.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:80;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"31c0b91767550adf77f1c9bea92a0559";s:4:"name";s:17:"PEAR/Frontend.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:81;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8b85e42b840676ad3ae1c15e55b005b";s:4:"name";s:18:"PEAR/Installer.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:82;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2929765413405abf63574c8a544e4a04";s:4:"name";s:20:"PEAR/PackageFile.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:10:"@PEAR-VER@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:83;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ad25a29d464b62cbaaa3ca96e622526c";s:4:"name";s:17:"PEAR/Packager.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:84;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ef9d00adaeccff7516f08170096026d3";s:4:"name";s:14:"PEAR/Proxy.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:85;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ae8c1dcfddb6a2717e09239bb1430dc7";s:4:"name";s:17:"PEAR/Registry.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:86;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"389d1bad72267d3ed770abf0662d8086";s:4:"name";s:13:"PEAR/REST.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:87;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df0d7022e22fd78ecd82080ff4f108d5";s:4:"name";s:16:"PEAR/RunTest.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:88;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3711c281e0234203ec7879f53bc766ab";s:4:"name";s:17:"PEAR/Validate.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:89;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"da9510087eddd489945dde07260256ee";s:4:"name";s:18:"PEAR/XMLParser.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:90;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d888d06143e3cac0dae78bbb2e761366";s:4:"name";s:16:"scripts/pear.bat";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:3:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@bin_dir@";s:2:"to";s:7:"bin_dir";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:16:"tasks:windowseol";s:0:"";}i:91;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"17d7d08ce2c6c476eeaae4763f69efcc";s:4:"name";s:19:"scripts/peardev.bat";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:3:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@bin_dir@";s:2:"to";s:7:"bin_dir";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:16:"tasks:windowseol";s:0:"";}i:92;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1c5819d67da59739e6298d6094c58f7b";s:4:"name";s:16:"scripts/pecl.bat";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:3:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@bin_dir@";s:2:"to";s:7:"bin_dir";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:16:"tasks:windowseol";s:0:"";}i:93;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8ac139504e80bede470aef6d405100b6";s:4:"name";s:15:"scripts/pear.sh";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:4:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@pear_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}i:3;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:13:"tasks:unixeol";s:0:"";}i:94;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"08ea03525b4ba914dfd9ec69c4238cf4";s:4:"name";s:18:"scripts/peardev.sh";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:4:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@pear_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}i:3;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:13:"tasks:unixeol";s:0:"";}i:95;a:3:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bde09b17fa816d58bb136375a13119c3";s:4:"name";s:15:"scripts/pecl.sh";s:4:"role";s:6:"script";}s:13:"tasks:replace";a:4:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@pear_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}i:3;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}s:13:"tasks:unixeol";s:0:"";}i:96;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9b5d5e5bd017c50df00c6b34ef32652e";s:4:"name";s:19:"scripts/pearcmd.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:4:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@pear_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}i:3;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}}i:97;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"48867dfbb41f2532d034f56a79565893";s:4:"name";s:19:"scripts/peclcmd.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:4:{i:0;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_bin@";s:2:"to";s:7:"php_bin";s:4:"type";s:11:"pear-config";}}i:1;a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}i:2;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@pear_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}i:3;a:1:{s:7:"attribs";a:3:{s:4:"from";s:14:"@include_path@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"45b44486d8090de17b2a8b4211fab247";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eaac3d33068c6e67573ed44155b149ae";s:4:"name";s:7:"INSTALL";s:4:"role";s:3:"doc";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"69341ea97af9c88956568f8e7e41d4c6";s:4:"name";s:11:"package.dtd";s:4:"role";s:4:"data";}}i:101;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47aeb7eaff6438beb60bc42bc0e6c658";s:4:"name";s:8:"PEAR.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cd10521cc4054923a3d2b6e15b4df493";s:4:"name";s:10:"README.rst";s:4:"role";s:3:"doc";}}i:103;a:2:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba9e5c5a567e51b440808a8ed53cd76d";s:4:"name";s:10:"System.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"acd010e3bc43c0f72df584acde7b9158";s:4:"name";s:13:"template.spec";s:4:"role";s:4:"data";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:4:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:6:"1.10.1";}s:7:"package";a:4:{i:0;a:4:{s:4:"name";s:11:"Archive_Tar";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.9";s:11:"recommended";s:5:"1.4.4";}i:1;a:4:{s:4:"name";s:16:"Structures_Graph";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.1.0";s:11:"recommended";s:5:"1.1.1";}i:2;a:4:{s:4:"name";s:14:"Console_Getopt";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.1";s:11:"recommended";s:5:"1.4.3";}i:3;a:4:{s:4:"name";s:8:"XML_Util";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";s:11:"recommended";s:5:"1.4.5";}}s:9:"extension";a:2:{i:0;a:1:{s:4:"name";s:3:"xml";}i:1;a:1:{s:4:"name";s:4:"pcre";}}}s:5:"group";a:3:{i:0;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:26:"PEAR's web-based installer";s:4:"name";s:12:"webinstaller";}s:7:"package";a:3:{s:4:"name";s:17:"PEAR_Frontend_Web";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"0.5.1";}}i:1;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:30:"PEAR's PHP-GTK-based installer";s:4:"name";s:12:"gtkinstaller";}s:7:"package";a:3:{s:4:"name";s:17:"PEAR_Frontend_Gtk";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"0.4.0";}}i:2;a:2:{s:7:"attribs";a:2:{s:4:"hint";s:31:"PEAR's PHP-GTK2-based installer";s:4:"name";s:13:"gtk2installer";}s:7:"package";a:2:{s:4:"name";s:18:"PEAR_Frontend_Gtk2";s:7:"channel";s:12:"pear.php.net";}}}}s:10:"phprelease";a:2:{i:0;a:2:{s:17:"installconditions";a:1:{s:2:"os";a:1:{s:4:"name";s:7:"windows";}}s:8:"filelist";a:2:{s:7:"install";a:5:{i:0;a:1:{s:7:"attribs";a:2:{s:2:"as";s:8:"pear.bat";s:4:"name";s:16:"scripts/pear.bat";}}i:1;a:1:{s:7:"attribs";a:2:{s:2:"as";s:11:"peardev.bat";s:4:"name";s:19:"scripts/peardev.bat";}}i:2;a:1:{s:7:"attribs";a:2:{s:2:"as";s:8:"pecl.bat";s:4:"name";s:16:"scripts/pecl.bat";}}i:3;a:1:{s:7:"attribs";a:2:{s:2:"as";s:11:"pearcmd.php";s:4:"name";s:19:"scripts/pearcmd.php";}}i:4;a:1:{s:7:"attribs";a:2:{s:2:"as";s:11:"peclcmd.php";s:4:"name";s:19:"scripts/peclcmd.php";}}}s:6:"ignore";a:3:{i:0;a:1:{s:7:"attribs";a:1:{s:4:"name";s:18:"scripts/peardev.sh";}}i:1;a:1:{s:7:"attribs";a:1:{s:4:"name";s:15:"scripts/pear.sh";}}i:2;a:1:{s:7:"attribs";a:1:{s:4:"name";s:15:"scripts/pecl.sh";}}}}}i:1;a:1:{s:8:"filelist";a:2:{s:7:"install";a:5:{i:0;a:1:{s:7:"attribs";a:2:{s:2:"as";s:4:"pear";s:4:"name";s:15:"scripts/pear.sh";}}i:1;a:1:{s:7:"attribs";a:2:{s:2:"as";s:7:"peardev";s:4:"name";s:18:"scripts/peardev.sh";}}i:2;a:1:{s:7:"attribs";a:2:{s:2:"as";s:4:"pecl";s:4:"name";s:15:"scripts/pecl.sh";}}i:3;a:1:{s:7:"attribs";a:2:{s:2:"as";s:11:"pearcmd.php";s:4:"name";s:19:"scripts/pearcmd.php";}}i:4;a:1:{s:7:"attribs";a:2:{s:2:"as";s:11:"peclcmd.php";s:4:"name";s:19:"scripts/peclcmd.php";}}}s:6:"ignore";a:3:{i:0;a:1:{s:7:"attribs";a:1:{s:4:"name";s:16:"scripts/pear.bat";}}i:1;a:1:{s:7:"attribs";a:1:{s:4:"name";s:19:"scripts/peardev.bat";}}i:2;a:1:{s:7:"attribs";a:1:{s:4:"name";s:16:"scripts/pecl.bat";}}}}}}s:9:"changelog";a:1:{s:7:"release";a:35:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:11:"1.8.0alpha1";s:3:"api";s:5:"1.8.0";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-03-09";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:4876:"* Implement Request #10373: if pref_state=stable and installed package=beta, allow up to latest beta version [dufuz]
* Implement Request #10581: login / logout should map to channel-login / channel-logout [dufuz]
* Implement Request #10825: Only display the "invalid or missing package file"-error if it makes sense [dufuz]
* Implement Request #11170: script to generate Command/[command].xml [dufuz]
* Implement Request #11176: improve channel ... has updated its protocols message [dufuz]
* Implement Request #12706: pear list -a hard to read [dufuz]
* Implement Request #11353: upgrade-all and upgrade commands to upgrade within the same stability level [dufuz]
* Implement Request #13015: Add https discovery for channel.xml [dufuz / initial patch by Martin Roos]
* Implement Request #13927: install-pear.php should have option to set www_dir [timj]
* Implement Request #14324: Make the pear install command behave similar to apt-get [dufuz]
* Implement Request #14325: make pear upgrade with no params behave like pear upgrade-all [dufuz]
  - upgrade-all can be considered deprecated in favor of calling upgrade with no parameters to replicate
    better what other package managers are doing. upgrade-all will still work as intended.
* Implement Request #14504: add a channel parameter support to the upgrade function [dufuz]
  - Options -c ezc and --channel=ezc got added to upgrade and upgrade-all to allow for
    channel specific upgrades
* Implement Request #14556: install-pear-nozlib.phar should get download_dir config and other options [cweiske]
* Implement Request #15566: Add doc.php.net as a default channel [dufuz / saltybeagle]

* Fix PHP Bug #43857: --program-suffix not always reflected everywhere [cellog]
* Fix PHP Bug #47323: strotime warnings in make install [dufuz]

* Fix Bug #13908: pear info command and maintainers inactive not mentioned [dufuz]
* Fix Bug #13926: install-pear.php does not set cfg_dir if -d option set with no -c option [timj]
* Fix Bug #13943: tests fail when php.exe path contains spaces [dufuz / jorrit]
* Fix Bug #13953: config-set/config-show with channel alias fail [cellog]
* Fix Bug #13958: When a phpt tests exit() or die() xdebug coverage is not generated, patch by izi (David Jean Louis) [izi / dufuz]
* Fix Bug #14041: Unpredictable unit test processing sequence [dufuz]
* Fix Bug #14140: Strict warning not suppressed in the shutdown function [dufuz]
* Fix Bug #14210: pear list -ia brings warnings [dufuz]
* Fix Bug #14274: PEAR packager mangles package.xml encoding, then complains about it [dufuz]
* Fix Bug #14287: cannot upgrade from stable to beta via -beta when config is set to stable [dufuz]
* Fix Bug #14300: Package files themselves can not be served over https [dufuz / initial patch by Martin Roos]
* Fix Bug #14437: openbasedir warning when loading config [dufuz]
* Fix Bug #14558: PackageFile.php creates tmp directory outside configured temp_dir [cweiske]
* Fix Bug #14947: downloadHttp() is missing Host part of the HTTP Request when using Proxy [ifeghali]
* Fix Bug #14977: PEAR/Frontend.php doesn't require_once PEAR.php [dufuz]
* Fix Bug #15750: Unreachable code in PEAR_Downloader [dufuz]
* Fix Bug #15979: Package files incorrectly removed when splitting a package into multiple pkgs [dufuz]
* Fix Bug #15914: pear upgrade installs different version if desired version not found [dufuz]

NOTE!
Functions that have been deprecated for 3+ years in PEAR_Common, please take a moment
to migrate over to one of the alternatives that have ben provided:
* PEAR_Common->downloadHttp (use PEAR_Downloader->downloadHttp instead)
* PEAR_Common->infoFromTgzFile (use PEAR_PackageFile->fromTgzFile instead)
* PEAR_Common->infoFromDescriptionFile (use PEAR_PackageFile->fromPackageFile instead)
* PEAR_Common->infoFromString (use PEAR_PackageFile->fromXmlstring instead)
* PEAR_Common->infoFromArray (use PEAR_PackageFile->fromAnyFile instead)
* PEAR_Common->xmlFromInfo (use a PEAR_PackageFile_v* object's generator instead)
* PEAR_Common->validatePackageInfo (use the validation of PEAR_PackageFile objects)
* PEAR_Common->analyzeSourceCode (use a PEAR_PackageFile_v* object instead)
* PEAR_Common->detectDependencies (use PEAR_Downloader_Package->detectDependencies instead)
* PEAR_Common->buildProvidesArray (use PEAR_PackageFile_v1->_buildProvidesArray or
  PEAR_PackageFile_v2_Validator->_buildProvidesArray)

PHP 4.4 and 5.1.6 are now the minimum PHP requirements, for brave souls
pear upgrade -f PEAR will allow people with lower versions
to upgrade to this release but no guarantees will be made that it will work properly.

Support for XML RPC channels has been dropped - The only ones that used it
(pear.php.net and pecl.php.net) have used the REST interface for years now.
SOAP support also removed as it was only proof of concept.

Move codebase from the PHP License to New BSD 2 clause license";}i:1;a:5:{s:4:"date";s:10:"2009-03-27";s:7:"version";a:2:{s:7:"release";s:8:"1.8.0RC1";s:3:"api";s:5:"1.8.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:347:"* Fix Bug #14331: pear cvstag only works from inside the package directory [dufuz]
* Fix Bug #16045: E_Notice: Undefined index: channel in PEAR/DependencyDB.php [dufuz]

* Implemented Request #11230: better error message when mirror not in channel.xml file [dufuz]
* Implemented Request #13150: Add support for following HTTP 302 redirects [dufuz]";}i:2;a:5:{s:4:"date";s:10:"2009-04-10";s:7:"version";a:2:{s:7:"release";s:5:"1.8.0";s:3:"api";s:5:"1.8.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:5737:"Changes since RC1:
  * Fix Bug #14792: Bad md5sum for files with replaced content [dufuz]
  * Fix Bug #16057:-r is limited to 4 directories in depth [dufuz]
  * Fix Bug #16077: PEAR5::getStaticProperty does not return a reference to the property [dufuz]

  Remove custom XML_Util class in favor of using upstream XML_Util package as dependency

RC1 Release Notes:
  * Fix Bug #14331: pear cvstag only works from inside the package directory [dufuz]
  * Fix Bug #16045: E_Notice: Undefined index: channel in PEAR/DependencyDB.php [dufuz]

  * Implemented Request #11230: better error message when mirror not in channel.xml file [dufuz]
  * Implemented Request #13150: Add support for following HTTP 302 redirects [dufuz]

Alpha1 Release Notes:
  * Implement Request #10373: if pref_state=stable and installed package=beta, allow up to latest beta version [dufuz]
  * Implement Request #10581: login / logout should map to channel-login / channel-logout [dufuz]
  * Implement Request #10825: Only display the "invalid or missing package file"-error if it makes sense [dufuz]
  * Implement Request #11170: script to generate Command/[command].xml [dufuz]
  * Implement Request #11176: improve channel ... has updated its protocols message [dufuz]
  * Implement Request #12706: pear list -a hard to read [dufuz]
  * Implement Request #11353: upgrade-all and upgrade commands to upgrade within the same stability level [dufuz]
  * Implement Request #13015: Add https discovery for channel.xml [dufuz / initial patch by Martin Roos]
  * Implement Request #13927: install-pear.php should have option to set www_dir [timj]
  * Implement Request #14324: Make the pear install command behave similar to apt-get [dufuz]
  * Implement Request #14325: make pear upgrade with no params behave like pear upgrade-all [dufuz]
    - upgrade-all can be considered deprecated in favor of calling upgrade with no parameters to replicate
      better what other package managers are doing. upgrade-all will still work as intended.
  * Implement Request #14504: add a channel parameter support to the upgrade function [dufuz]
    - Options -c ezc and --channel=ezc got added to upgrade and upgrade-all to allow for
      channel specific upgrades
  * Implement Request #14556: install-pear-nozlib.phar should get download_dir config and other options [cweiske]
  * Implement Request #15566: Add doc.php.net as a default channel [dufuz / saltybeagle]

  * Fix PHP Bug #43857: --program-suffix not always reflected everywhere [cellog]
  * Fix PHP Bug #47323: strotime warnings in make install [dufuz]

  * Fix Bug #13908: pear info command and maintainers inactive not mentioned [dufuz]
  * Fix Bug #13926: install-pear.php does not set cfg_dir if -d option set with no -c option [timj]
  * Fix Bug #13943: tests fail when php.exe path contains spaces [dufuz / jorrit]
  * Fix Bug #13953: config-set/config-show with channel alias fail [cellog]
  * Fix Bug #13958: When a phpt tests exit() or die() xdebug coverage is not generated, patch by izi (David Jean Louis) [izi / dufuz]
  * Fix Bug #14041: Unpredictable unit test processing sequence [dufuz]
  * Fix Bug #14140: Strict warning not suppressed in the shutdown function [dufuz]
  * Fix Bug #14210: pear list -ia brings warnings [dufuz]
  * Fix Bug #14274: PEAR packager mangles package.xml encoding, then complains about it [dufuz]
  * Fix Bug #14287: cannot upgrade from stable to beta via -beta when config is set to stable [dufuz]
  * Fix Bug #14300: Package files themselves can not be served over https [dufuz / initial patch by Martin Roos]
  * Fix Bug #14437: openbasedir warning when loading config [dufuz]
  * Fix Bug #14558: PackageFile.php creates tmp directory outside configured temp_dir [cweiske]
  * Fix Bug #14947: downloadHttp() is missing Host part of the HTTP Request when using Proxy [ifeghali]
  * Fix Bug #14977: PEAR/Frontend.php doesn't require_once PEAR.php [dufuz]
  * Fix Bug #15750: Unreachable code in PEAR_Downloader [dufuz]
  * Fix Bug #15979: Package files incorrectly removed when splitting a package into multiple pkgs [dufuz]
  * Fix Bug #15914: pear upgrade installs different version if desired version not found [dufuz]

  NOTE!
  Functions that have been deprecated for 3+ years in PEAR_Common, please take a moment
  to migrate over to one of the alternatives that have ben provided:
  * PEAR_Common->downloadHttp (use PEAR_Downloader->downloadHttp instead)
  * PEAR_Common->infoFromTgzFile (use PEAR_PackageFile->fromTgzFile instead)
  * PEAR_Common->infoFromDescriptionFile (use PEAR_PackageFile->fromPackageFile instead)
  * PEAR_Common->infoFromString (use PEAR_PackageFile->fromXmlstring instead)
  * PEAR_Common->infoFromArray (use PEAR_PackageFile->fromAnyFile instead)
  * PEAR_Common->xmlFromInfo (use a PEAR_PackageFile_v* object's generator instead)
  * PEAR_Common->validatePackageInfo (use the validation of PEAR_PackageFile objects)
  * PEAR_Common->analyzeSourceCode (use a PEAR_PackageFile_v* object instead)
  * PEAR_Common->detectDependencies (use PEAR_Downloader_Package->detectDependencies instead)
  * PEAR_Common->buildProvidesArray (use PEAR_PackageFile_v1->_buildProvidesArray or
    PEAR_PackageFile_v2_Validator->_buildProvidesArray)

  PHP 4.4 and 5.1.6 are now the minimum PHP requirements, for brave souls
  pear upgrade -f PEAR will allow people with lower versions
  to upgrade to this release but no guarantees will be made that it will work properly.

  Support for XML RPC channels has been dropped - The only ones that used it
  (pear.php.net and pecl.php.net) have used the REST interface for years now.
  SOAP support also removed as it was only proof of concept.

  Move codebase from the PHP License to New BSD 2 clause license";}i:3;a:5:{s:4:"date";s:10:"2009-04-15";s:7:"version";a:2:{s:7:"release";s:5:"1.8.1";s:3:"api";s:5:"1.8.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:58:"* Fix Bug #16099 	PEAR crash on PHP4 (parse error) [dufuz]";}i:4;a:5:{s:4:"date";s:10:"2009-08-18";s:7:"version";a:2:{s:7:"release";s:8:"1.9.0RC1";s:3:"api";s:8:"1.9.0RC1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1106:"* Implement Request #16213: add alias to list-channels output [dufuz]
* Implement Request #16378: pear svntag [dufuz]
* Implement Request #16386: PEAR_Config::remove() does not support specifying a channel [timj]
* Implement Request #16396: package-dependencies should allow package names [dufuz]

* Fix Bug #11181: pear requests channel.xml from main server instead from mirror [dufuz]
* Fix Bug #14493: pear install --offline doesn't print out errors [dufuz]
* Fix Bug #11348: pear package-dependencies isn't well explained [dufuz]
* Fix Bug #16108: PEAR_PackageFile_Generator_v2 PHP4 parse error when running upgrade-all [dufuz]
* Fix Bug #16113: Installing certain packages fails due incorrect encoding handling [dufuz]
* Fix Bug #16122: PEAR RunTest failed to run as expected [dufuz]
* Fix Bug #16366: compiling 5.2.10 leads to non-functioning pear [dufuz]
* Fix Bug #16387: channel-logout does not support logging out from a non-default channel [timj]
* Fix Bug #16444: Setting preferred mirror fails [dufuz]
* Fix the shutdown functions where a index might not exist and thus raise a notice [derick]";}i:5;a:5:{s:4:"date";s:10:"2009-08-20";s:7:"version";a:2:{s:7:"release";s:8:"1.9.0RC2";s:3:"api";s:8:"1.9.0RC2";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:107:"* REST 1.4 file was occasionally being included but REST 1.4 is not intended for this release cycle [dufuz]";}i:6;a:5:{s:4:"date";s:10:"2009-08-21";s:7:"version";a:2:{s:7:"release";s:8:"1.9.0RC3";s:3:"api";s:8:"1.9.0RC3";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:70:"* Improved svntag support to handle packages like PEAR it self [dufuz]";}i:7;a:5:{s:4:"date";s:10:"2009-08-23";s:7:"version";a:2:{s:7:"release";s:8:"1.9.0RC4";s:3:"api";s:8:"1.9.0RC4";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:244:"* Fixed a problem where the original channel could not be set as a preferred_mirror again [dufuz]
* Make sure channel aliases can't be made to start with - [dufuz]
* Output issues with pear search [dufuz]
* Fixed couple of stray notices [dufuz]";}i:8;a:5:{s:4:"date";s:10:"2009-09-03";s:7:"version";a:2:{s:7:"release";s:5:"1.9.0";s:3:"api";s:5:"1.9.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:86:"* Fix  Bug #16547: The phar for PEAR installer uses ereg() which is deprecated [dufuz]";}i:9;a:5:{s:4:"date";s:10:"2010-05-26";s:7:"version";a:2:{s:7:"release";s:5:"1.9.1";s:3:"api";s:5:"1.9.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1111:"* svntag improvements, tag package files passed into the command and better directory checks [dufuz]
* rely on Structures_Graph minimum version instead of recommended version [saltybeagle]
* Fix Bug #12613: running go-pear.phar from C:\ fails [dufuz]
* Fix Bug #14841: Installing pear into directory with space fails [dufuz]
* Fix Bug #16644: pear.bat returns syntax error when parenthesis are in install path. [dufuz] [patch by bwaters (Bryan Waters)]
* Fix Bug #16767: Use of Depreciated HTML Attributes in the Exception class [dufuz] [patch by fuhrysteve (Stephen J. Fuhry)]
* Fix Bug #16864: "pear list-upgrades -i" issues E_WARNINGS [dufuz] [patch by rquadling (Richard Quadling)]
* Fix Bug #17220: command `pear help` outputs to stderr instead of stdout [dufuz]
* Fix Bug #17234: channel-discover adds port to HTTP Host header [dufuz]
* Fix Bug #17292: Code Coverage in PEAR_RunTest does not work with namespaces [sebastian]
* Fix Bug #17359: loadExtension() fails over missing dl() when used in multithread env [dufuz]
* Fix Bug #17378: pear info $package fails if directory with that name exists [dufuz]";}i:10;a:6:{s:4:"date";s:10:"2011-02-28";s:4:"time";s:8:"18:30:00";s:7:"version";a:2:{s:7:"release";s:5:"1.9.2";s:3:"api";s:5:"1.9.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1258:"Important! This is a security fix release. The advisory can be found at
http://pear.php.net/advisory-20110228.txt

    Bugs:
    * Fixed Bug #17463: Regression: On Windows, svntag [patch by doconnor]
    * Fixed Bug #17641: pecl-list doesn't sort packages by name [dufuz]
    * Fixed Bug #17781: invalid argument warning on foreach due to an empty optional dependencie [dufuz]
    * Fixed Bug #17801: PEAR run-tests wrongly detects php-cgi [patch by David Jean Louis (izi)]
    * Fixed Bug #17839: pear svntag does not tag package.xml file [dufuz]
    * Fixed Bug #17986: PEAR Installer cannot handle files moved between packages [dufuz]
    * Fixed Bug #17997: Strange output if directories are not writeable [dufuz]
    * Fixed Bug #18001: PEAR/RunTest coverage fails [dufuz]
    * Fixed Bug #18056 [SECURITY]: Symlink attack in PEAR install [dufuz]
    * Fixed Bug #18218: "pear package" does not allow the use of late static binding [dufuz and Christer Edvartsen]
    * Fixed Bug #18238: Wrong return code from "pear help" [till]
    * Fixed Bug #18308: Broken error message about missing channel validator [yunosh]

    This feature is implemented as a result of #18056
    * Implemented Request #16648: Use TMPDIR for builds instead of /var/tmp [dufuz]";}i:11;a:6:{s:4:"date";s:10:"2011-06-04";s:4:"time";s:8:"15:30:00";s:7:"version";a:2:{s:7:"release";s:5:"1.9.3";s:3:"api";s:5:"1.9.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:820:"* Fixed Bug #17744: Empty changelog causes fatal error in setChangelogentry [dufuz]
* Fixed Bug #18340: raiseErro typo [doconnor]
* Fixed Bug #18349: package.xml version not recognized when single quoted [dufuz]
* Fixed Bug #18364: date.timezone errors for sh/bat files when TZ is not set in php.ini [dufuz]
* Fixed Bug #18388: Parentheses error in REST.php line 232 [dufuz]
* Fixed Bug #18428: invalid preg_match patterns [glen]
* Fixed Bug #18486: REST/10.php does not check error condition [dufuz]
* Fixed a problem in RunTest and code coverage. Correctly register the
  code coverage shutdown function in case we are inside a namespace. [sebastian]
* Fixed a bug with extensions not providing their config.m4 and co in the root directory of
  their pecl package but rather in a sub directory, such as xhprof. [dufuz]";}i:12;a:6:{s:4:"date";s:10:"2011-07-06";s:4:"time";s:8:"15:30:00";s:7:"version";a:2:{s:7:"release";s:5:"1.9.4";s:3:"api";s:5:"1.9.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:705:"Bug Fixes:
* Bug #17350: "pear install --force" doesn't uninstall files from previous pkg versions [dufuz]
* Bug #18362: A whitespace TEMP_DIR path breaks install/upgrade functionality [dufuz]
* Bug #18440: bad tmp folder path on install : Unable to create path for C:/Program/tmp [dufuz]
* Bug #18581: "config-get -c" not returning channel's configuration when using alias [dufuz]
* Bug #18639: regression: installing xdebug fails most likely due to another fix [dufuz]

Features
* All System (the class) functions can now take in spaced paths as long as they are surrounded in quotes.
  Prior to this it was possible to do that by passing all values in as an array (by product of #18362, #18440) [dufuz]";}i:13;a:6:{s:4:"date";s:10:"2014-06-27";s:4:"time";s:8:"18:17:00";s:7:"version";a:2:{s:7:"release";s:9:"1.9.5dev1";s:3:"api";s:5:"1.9.5";}s:9:"stability";a:2:{s:7:"release";s:5:"devel";s:3:"api";s:5:"devel";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1093:"Bug fixes:
* Fix bug #18343: Entities in file names decoded during packaging [cweiske]
* Fix bug #18665: pecl extensions not enabled in empty php.ini files [Louis Opter]
* Fix bug #18834: Do not truncate cache file if it is a symlink [avb]
* Fix bug #18892: Parse error in Installer.php [ashnazg]
* Fix bug #19482: fix pearcmd for include paths with trailing backslash [cweiske]
* Fix bug #19793: PHP Notice about ob_end_clean() [cweiske]
* Fix bug #20086: Invalid regexp in PEAR_Builder::build() [avb]
* Fix bug #20203: split content-type and get real mime type [Samu Voutilainen]
* Fix bug #20283: use full path for "zend_extension=..." [cweiske]
* Fix bug #20284: Reset interpreter before running --CLEAN-- section php-cgi run [Mats Lindh]
* Fix bug #20285: fix spelling mistakes [Veres Lajos]
* Fix bug #20286: Support access of static variables on objects in validator [cweiske]
* Fix bug #20321: Correctly detect name of current user during installation [cweiske]
* Fix bug: let pear run-tests fail when there are failed tests [cweiske]
* Prepare a test for bug #18056 / bug #18834 [avb]";}i:14;a:6:{s:4:"date";s:10:"2014-07-12";s:4:"time";s:8:"14:22:23";s:7:"version";a:2:{s:7:"release";s:5:"1.9.5";s:3:"api";s:5:"1.9.5";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1137:"No changes since 1.9.5.dev1.

Bug fixes in 1.9.5.dev1:
* Fix bug #18343: Entities in file names decoded during packaging [cweiske]
* Fix bug #18665: pecl extensions not enabled in empty php.ini files [Louis Opter]
* Fix bug #18834: Do not truncate cache file if it is a symlink [avb]
* Fix bug #18892: Parse error in Installer.php [ashnazg]
* Fix bug #19482: fix pearcmd for include paths with trailing backslash [cweiske]
* Fix bug #19793: PHP Notice about ob_end_clean() [cweiske]
* Fix bug #20086: Invalid regexp in PEAR_Builder::build() [avb]
* Fix bug #20203: split content-type and get real mime type [Samu Voutilainen]
* Fix bug #20283: use full path for "zend_extension=..." [cweiske]
* Fix bug #20284: Reset interpreter before running --CLEAN-- section php-cgi run [Mats Lindh]
* Fix bug #20285: fix spelling mistakes [Veres Lajos]
* Fix bug #20286: Support access of static variables on objects in validator [cweiske]
* Fix bug #20321: Correctly detect name of current user during installation [cweiske]
* Fix bug: let pear run-tests fail when there are failed tests [cweiske]
* Prepare a test for bug #18056 / bug #18834 [avb]";}i:15;a:6:{s:4:"date";s:10:"2015-07-25";s:4:"time";s:8:"13:42:42";s:7:"version";a:2:{s:7:"release";s:10:"1.10.0dev1";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:5:"devel";s:3:"api";s:5:"devel";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:444:"* Implement #20488: Add support for PHP 7 [cweiske]
* Drop support for PHP 4 and 5.0 - 5.3 [cweiske]
* Remove deprecated methods [cweiske]
* Fix static warnings [cweiske]
* Fix #17045: avoid overwriting include path [glen]
* Fix #17399: "pear help" doesn't mention the "version" command [kguest]
* Add --showdiff to "pear run-tests" to print diff for failed tests [tyrael]
* Fix channel.xml downloading from https if it did not change [cweiske]";}i:16;a:6:{s:4:"date";s:10:"2015-07-31";s:4:"time";s:8:"09:42:42";s:7:"version";a:2:{s:7:"release";s:10:"1.10.0dev2";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:5:"devel";s:3:"api";s:5:"devel";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:328:"* Fix #18638 and #18405: Make PEAR::loadExtension static [cweiske]
* Fix #20319: allow pear to work when cache_dir is not writable [remicollet]
* Implement #20333: New role=man for man pages [bjori]
* Implement #20334: add "metadata_dir" configuration option [remicollet]
* Add long option names to install-pear.php [remicollet]";}i:17;a:6:{s:4:"date";s:10:"2015-09-28";s:4:"time";s:8:"09:42:42";s:7:"version";a:2:{s:7:"release";s:10:"1.10.0dev3";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:5:"devel";s:3:"api";s:5:"devel";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:227:"* Fix #20507: pear list-upgrades does not take PHP version into account [cweiske]
* Fix #20927: Use correct php-config [cweiske]
* Fix #20946: PEAR_Builder::log() declaration [remicollet]
* Remove PEAR/ErrorStack5.php [cweiske]";}i:18;a:6:{s:4:"date";s:10:"2015-10-07";s:4:"time";s:8:"11:22:42";s:7:"version";a:2:{s:7:"release";s:6:"1.10.0";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:1068:"No changes since version 1.10.0dev3.

Changes since version 1.9.5:
* Implement #20488: Add support for PHP 7 [cweiske]
* Drop support for PHP 4 and 5.0 - 5.3 [cweiske]
* Remove deprecated methods [cweiske]
* Add --showdiff to "pear run-tests" to print diff for failed tests [tyrael]
* Implement #20333: New role=man for man pages [bjori]
* Implement #20334: add "metadata_dir" configuration option [remicollet]
* Add long option names to install-pear.php [remicollet]
* Remove PEAR/ErrorStack5.php [cweiske]
* Fix #17045: avoid overwriting include path [glen]
* Fix #17399: "pear help" doesn't mention the "version" command [kguest]
* Fix #18638 and #18405: Make PEAR::loadExtension static [cweiske]
* Fix #20319: allow pear to work when cache_dir is not writable [remicollet]
* Fix #20507: pear list-upgrades does not take PHP version into account [cweiske]
* Fix #20927: Use correct php-config [cweiske]
* Fix #20946: PEAR_Builder::log() declaration [remicollet]
* Fix channel.xml downloading from https if it did not change [cweiske]
* Fix static warnings [cweiske]";}i:19;a:6:{s:4:"date";s:10:"2015-10-17";s:4:"time";s:8:"13:22:42";s:7:"version";a:2:{s:7:"release";s:6:"1.10.1";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:229:"* Fix bug #20959: Crash on channel discovery with channel.xml redirect [cweiske]
* Fix bug #20968: Incorrect call to __construct() from PEAR() [edlman]
* Add legacy constructor for PEAR_Error for backwards compatibility [cweiske]";}i:20;a:6:{s:4:"date";s:10:"2017-02-28";s:4:"time";s:8:"07:40:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.2";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:544:"* Fix Bug #4426:  PEAR_Autoloader __call() must take only 2 arguments [kna]
* Fix Bug #20989: fatal error/bug in the postinstallscript task [kguest]
* Fix Bug #20991: Strict Standards: startSession and run methods in PEAR_Task_Postinstallscript [kguest]
* Fix Bug #21001: PEAR_ERROR_DIE exit code is 0 [danielc]

* Pull Request #52: Channel's _lastmodified is an int and not a string [sathieu]
* Pull Request #53: Add proper HTTPS proxy support through the CONNECT verb [youknow0]
* Pull Request #58: Make method signatures compatible. [yunosh]";}i:21;a:6:{s:4:"date";s:10:"2017-02-28";s:4:"time";s:8:"10:15:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.3";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:42:"* Bug #21188: Class 'PEAR_Proxy' not found";}i:22;a:5:{s:4:"date";s:10:"2017-04-25";s:7:"version";a:2:{s:7:"release";s:6:"1.10.4";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:50:"* Bug #18102:  pear install does not fail on error";}i:23;a:5:{s:4:"date";s:10:"2017-06-27";s:7:"version";a:2:{s:7:"release";s:6:"1.10.5";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:73:"* Bug #21222:  PHP 7.2 compatibility: Upgrade to Archive_Tar 1.4.3 needed";}i:24;a:5:{s:4:"date";s:10:"2018-08-22";s:7:"version";a:2:{s:7:"release";s:6:"1.10.6";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:544:"* PR #70:  Fix notice undefined variable metadata_dir
* PR #71:  fix Warning: count(): Parameter must be an array or an object
* PR #74:  Bug #23744 Remove is_executable check
  * Bug #23744:  The is_executable check in the Which method when run on Windows is unnecessary
* PR #75:  Migrate old while(list() = each()) constructs to foreach
* PR #76:  Fix PHP Warning: "continue" targeting switch is equivalent to "break"
* PR #77:  proxy server auth
  * PR #72:  Correctly authenticate at proxy server
* PR #78:  array or Countable error in 7.2";}i:25;a:5:{s:4:"date";s:10:"2018-12-05";s:7:"version";a:2:{s:7:"release";s:6:"1.10.7";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:238:"* PR #79:  Prevent Unable to find the wrapper "channel" Warning
* PR #80:  fix Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"
* PR #81:  Add flags to PECL shell script for shared extensions";}i:26;a:5:{s:4:"date";s:10:"2019-02-07";s:7:"version";a:2:{s:7:"release";s:6:"1.10.8";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:83:"* PR #83:  Drop track_errors from options
* PR #84:  Fix PHP 8 compatibility issues";}i:27;a:5:{s:4:"date";s:10:"2019-03-13";s:7:"version";a:2:{s:7:"release";s:6:"1.10.9";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:191:"* PR #85:  Fixes static calls for PHP 8
* PR #86:  Adjust silencing check for PHP 8
* PR #87:  Comparison fixes
* PR #88:  Only add bin_dir to PATH if not already there (fixes PHP Bug #75852)";}i:28;a:5:{s:4:"date";s:10:"2019-11-19";s:7:"version";a:2:{s:7:"release";s:7:"1.10.10";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:672:"* PR #89:  Fix scripts/* include paths
* PR #90:  Non-interactive configureoption answers
* PR #91:  Added missing preg quote
* PR #92:  handle "lib64" case for glibc detection
* PR #93:  Fix PHP Notice: Trying to access array offset on value of type bool with 7.4
* PR #94:  Updated logic in useLocalCache to reuse getCacheId
* PR #95:  Fix manpage warning
* PR #96:  Implement the SOURCE_DATE_EPOCH specification
* PR #97:  Fix PHP 7.4 deprecation: array/string curly braces access
* PR #98:  Fix use of null/false as array
* PR #99:  Fix Travis builds on PHP 5.4 and 5.5
* PR #100: Honor PHP temp directory config
* PR #101: Fix documentation: the `--force` is required";}i:29;a:5:{s:4:"date";s:10:"2020-04-10";s:7:"version";a:2:{s:7:"release";s:7:"1.10.11";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:230:"* PR #102: Fix logging error for urls not in cache
* PR #103: Fix undefined constant name
* PR #105: Sort list of packages
* PR #106: Update REST.php
* PR #107: Update .travis.yml to include PHP 7.4
* PR #108: Remove unneeded code";}i:30;a:5:{s:4:"date";s:10:"2020-04-19";s:7:"version";a:2:{s:7:"release";s:7:"1.10.12";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:43:"* adjust dependencies based on new releases";}i:31;a:5:{s:4:"date";s:10:"2021-08-10";s:7:"version";a:2:{s:7:"release";s:7:"1.10.13";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:116:"* PR #114: unsupported protocol - use --force to continue
* PR #117: Add $this operator to _determineIfPowerpc calls";}i:32;a:5:{s:4:"date";s:10:"2023-11-26";s:7:"version";a:2:{s:7:"release";s:7:"1.10.14";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:583:"* PR #112: Put glue and pieces parameters to implode in correct order for PHP 7.4+
* PR #121: Fix PHP bug 81653: Typo in install-pear-nozlib.phar
* PR #122: add %S EXPECTF capability
* PR #124: Fix: Creation of dynamic property PEAR_Error::$callback is deprecated
* PR #125: Fixed extension loaded check for pecl binaries
* PR #126: Remove -n option from pecl.bat for shared extensions
* PR #127: fix Using ${var} in strings is deprecated
* PR #128: fix lingering license references to PHP license
* PR #129: Exclude tests from composer classmap
* PR #131: fix private lastError name";}i:33;a:5:{s:4:"date";s:10:"2024-03-09";s:7:"version";a:2:{s:7:"release";s:7:"1.10.15";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:100:"* PR #132: cleanup uneeded test
* PR #135: Fix PHP Deprecated: Calling get_class() without arguments";}i:34;a:5:{s:4:"date";s:10:"2024-11-24";s:7:"version";a:2:{s:7:"release";s:7:"1.10.16";s:3:"api";s:6:"1.10.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:164:"* PR #141: Fix bug #27796: "Array to string" conversion warnings on installs/other actions
* PR #145: Never reference E_STRICT on PHP 8.4+
* PR #147: Fix tests 8.1+";}}}s:8:"filelist";a:102:{s:12:"OS/Guess.php";a:4:{s:6:"md5sum";s:32:"c0482b234f269360953c87472b5cf746";s:4:"name";s:12:"OS/Guess.php";s:4:"role";s:3:"php";s:12:"installed_as";s:42:"/opt/alt/php54/usr/share/pear/OS/Guess.php";}s:27:"PEAR/ChannelFile/Parser.php";a:4:{s:6:"md5sum";s:32:"3b371e9c6b4d667abb8be01f2788dcf9";s:4:"name";s:27:"PEAR/ChannelFile/Parser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/ChannelFile/Parser.php";}s:21:"PEAR/Command/Auth.xml";a:4:{s:6:"md5sum";s:32:"8fd87e64002e11fd86eb2f3fbfee6599";s:4:"name";s:21:"PEAR/Command/Auth.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/PEAR/Command/Auth.xml";}s:21:"PEAR/Command/Auth.php";a:4:{s:6:"md5sum";s:32:"65b6b36c4cc53f2836ad09b070829877";s:4:"name";s:21:"PEAR/Command/Auth.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/PEAR/Command/Auth.php";}s:22:"PEAR/Command/Build.xml";a:4:{s:6:"md5sum";s:32:"ce6bb5b6fdc02e0f50e7676403fd84a4";s:4:"name";s:22:"PEAR/Command/Build.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:52:"/opt/alt/php54/usr/share/pear/PEAR/Command/Build.xml";}s:22:"PEAR/Command/Build.php";a:4:{s:6:"md5sum";s:32:"e19325f59c4013694a4a06b61e7ac3be";s:4:"name";s:22:"PEAR/Command/Build.php";s:4:"role";s:3:"php";s:12:"installed_as";s:52:"/opt/alt/php54/usr/share/pear/PEAR/Command/Build.php";}s:25:"PEAR/Command/Channels.xml";a:4:{s:6:"md5sum";s:32:"6d5aab4d4308c3005b5f584c7783a031";s:4:"name";s:25:"PEAR/Command/Channels.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php54/usr/share/pear/PEAR/Command/Channels.xml";}s:25:"PEAR/Command/Channels.php";a:4:{s:6:"md5sum";s:32:"56b3b36834a751f6e7b86dcba6cefe2f";s:4:"name";s:25:"PEAR/Command/Channels.php";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php54/usr/share/pear/PEAR/Command/Channels.php";}s:23:"PEAR/Command/Common.php";a:4:{s:6:"md5sum";s:32:"aae7cc03e9b7fe7c4f504b970dca5411";s:4:"name";s:23:"PEAR/Command/Common.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Command/Common.php";}s:23:"PEAR/Command/Config.xml";a:4:{s:6:"md5sum";s:32:"91f189cb9423b5e87ee0abc5ea1a2be3";s:4:"name";s:23:"PEAR/Command/Config.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Command/Config.xml";}s:23:"PEAR/Command/Config.php";a:4:{s:6:"md5sum";s:32:"3c5d633b0e8d4e39e9bfb286f51130a5";s:4:"name";s:23:"PEAR/Command/Config.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Command/Config.php";}s:24:"PEAR/Command/Install.xml";a:4:{s:6:"md5sum";s:32:"24d05213cae7faa3880bbb5e40998867";s:4:"name";s:24:"PEAR/Command/Install.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/pear/PEAR/Command/Install.xml";}s:24:"PEAR/Command/Install.php";a:4:{s:6:"md5sum";s:32:"3dab53d092878709aa16f73143600107";s:4:"name";s:24:"PEAR/Command/Install.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/pear/PEAR/Command/Install.php";}s:23:"PEAR/Command/Mirror.xml";a:4:{s:6:"md5sum";s:32:"5cb62a04c0a268f4edd64a49a3895c92";s:4:"name";s:23:"PEAR/Command/Mirror.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Command/Mirror.xml";}s:23:"PEAR/Command/Mirror.php";a:4:{s:6:"md5sum";s:32:"2f5798bb62453d8d1bffa3d050584232";s:4:"name";s:23:"PEAR/Command/Mirror.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Command/Mirror.php";}s:24:"PEAR/Command/Package.xml";a:4:{s:6:"md5sum";s:32:"9367dcd7e4dbdde423f9c4c7d3f3a919";s:4:"name";s:24:"PEAR/Command/Package.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/pear/PEAR/Command/Package.xml";}s:24:"PEAR/Command/Package.php";a:4:{s:6:"md5sum";s:32:"a0a6b2ba1e67351359cf105b6f863806";s:4:"name";s:24:"PEAR/Command/Package.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/pear/PEAR/Command/Package.php";}s:23:"PEAR/Command/Pickle.xml";a:4:{s:6:"md5sum";s:32:"28dc842ea725d8787b9f9c3dbca5aa22";s:4:"name";s:23:"PEAR/Command/Pickle.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Command/Pickle.xml";}s:23:"PEAR/Command/Pickle.php";a:4:{s:6:"md5sum";s:32:"4025dd6411a73b19a5c19b3300060625";s:4:"name";s:23:"PEAR/Command/Pickle.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Command/Pickle.php";}s:25:"PEAR/Command/Registry.xml";a:4:{s:6:"md5sum";s:32:"49b046cfc14747f0365e02e9c3f0e6dc";s:4:"name";s:25:"PEAR/Command/Registry.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php54/usr/share/pear/PEAR/Command/Registry.xml";}s:25:"PEAR/Command/Registry.php";a:4:{s:6:"md5sum";s:32:"9f2ea65794243f0b7287e8883f2ab60e";s:4:"name";s:25:"PEAR/Command/Registry.php";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php54/usr/share/pear/PEAR/Command/Registry.php";}s:23:"PEAR/Command/Remote.xml";a:4:{s:6:"md5sum";s:32:"29c02e823879b4e3e291f6b36fb339f1";s:4:"name";s:23:"PEAR/Command/Remote.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Command/Remote.xml";}s:23:"PEAR/Command/Remote.php";a:4:{s:6:"md5sum";s:32:"42c51cbb21c103fe0288e5c16871f401";s:4:"name";s:23:"PEAR/Command/Remote.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Command/Remote.php";}s:21:"PEAR/Command/Test.xml";a:4:{s:6:"md5sum";s:32:"a50c32015005e0761cc3b04679b29ed0";s:4:"name";s:21:"PEAR/Command/Test.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/PEAR/Command/Test.xml";}s:21:"PEAR/Command/Test.php";a:4:{s:6:"md5sum";s:32:"fbb0098fcda7fa29adaa0714a325caea";s:4:"name";s:21:"PEAR/Command/Test.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/PEAR/Command/Test.php";}s:27:"PEAR/Downloader/Package.php";a:4:{s:6:"md5sum";s:32:"9229a9711a893a18298e473212689ab4";s:4:"name";s:27:"PEAR/Downloader/Package.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Downloader/Package.php";}s:21:"PEAR/Frontend/CLI.php";a:4:{s:6:"md5sum";s:32:"5379be9492842c3af98241c6e226d285";s:4:"name";s:21:"PEAR/Frontend/CLI.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/PEAR/Frontend/CLI.php";}s:30:"PEAR/Installer/Role/Common.php";a:4:{s:6:"md5sum";s:32:"adae220f10a82e5f78b8689a57387753";s:4:"name";s:30:"PEAR/Installer/Role/Common.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Common.php";}s:27:"PEAR/Installer/Role/Cfg.xml";a:4:{s:6:"md5sum";s:32:"d8c62e6275e3aaa7784290912406092c";s:4:"name";s:27:"PEAR/Installer/Role/Cfg.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Cfg.xml";}s:27:"PEAR/Installer/Role/Cfg.php";a:4:{s:6:"md5sum";s:32:"d89d39dcc1c55fb4464f447ce4f84eed";s:4:"name";s:27:"PEAR/Installer/Role/Cfg.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Cfg.php";}s:28:"PEAR/Installer/Role/Data.xml";a:4:{s:6:"md5sum";s:32:"89a4a2a286e842d45a98974f40a0565c";s:4:"name";s:28:"PEAR/Installer/Role/Data.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:58:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Data.xml";}s:28:"PEAR/Installer/Role/Data.php";a:4:{s:6:"md5sum";s:32:"89754e8d153937f3dd3266fd8897d965";s:4:"name";s:28:"PEAR/Installer/Role/Data.php";s:4:"role";s:3:"php";s:12:"installed_as";s:58:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Data.php";}s:27:"PEAR/Installer/Role/Doc.xml";a:4:{s:6:"md5sum";s:32:"b1ce0fe105251c3b75209d6518ee69ac";s:4:"name";s:27:"PEAR/Installer/Role/Doc.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Doc.xml";}s:27:"PEAR/Installer/Role/Doc.php";a:4:{s:6:"md5sum";s:32:"849c557b355f78890ef47fcfd12073ab";s:4:"name";s:27:"PEAR/Installer/Role/Doc.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Doc.php";}s:27:"PEAR/Installer/Role/Ext.xml";a:4:{s:6:"md5sum";s:32:"af71c0ad42d16a323afe24a4f884ef15";s:4:"name";s:27:"PEAR/Installer/Role/Ext.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Ext.xml";}s:27:"PEAR/Installer/Role/Ext.php";a:4:{s:6:"md5sum";s:32:"7d3dc799576b3e3d74d187de118cc3e4";s:4:"name";s:27:"PEAR/Installer/Role/Ext.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Ext.php";}s:27:"PEAR/Installer/Role/Man.xml";a:4:{s:6:"md5sum";s:32:"da6743f1e45cce72ea13aef5cdb14867";s:4:"name";s:27:"PEAR/Installer/Role/Man.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Man.xml";}s:27:"PEAR/Installer/Role/Man.php";a:4:{s:6:"md5sum";s:32:"2509a027ae42c4b96aa49557325a0ec4";s:4:"name";s:27:"PEAR/Installer/Role/Man.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Man.php";}s:27:"PEAR/Installer/Role/Php.xml";a:4:{s:6:"md5sum";s:32:"ef88f0321d3e481c2130c95122cf76d8";s:4:"name";s:27:"PEAR/Installer/Role/Php.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Php.xml";}s:27:"PEAR/Installer/Role/Php.php";a:4:{s:6:"md5sum";s:32:"d7547896ec403dba2eed9825ed86ea64";s:4:"name";s:27:"PEAR/Installer/Role/Php.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Php.php";}s:30:"PEAR/Installer/Role/Script.xml";a:4:{s:6:"md5sum";s:32:"746461dc3b48af6d24094cb0211608f2";s:4:"name";s:30:"PEAR/Installer/Role/Script.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Script.xml";}s:30:"PEAR/Installer/Role/Script.php";a:4:{s:6:"md5sum";s:32:"325c60df7f78be127741621561758f46";s:4:"name";s:30:"PEAR/Installer/Role/Script.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Script.php";}s:27:"PEAR/Installer/Role/Src.xml";a:4:{s:6:"md5sum";s:32:"e147d63f168ea156fc2be38caaa63804";s:4:"name";s:27:"PEAR/Installer/Role/Src.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Src.xml";}s:27:"PEAR/Installer/Role/Src.php";a:4:{s:6:"md5sum";s:32:"464722cee0665ebc75757f76532f0ab2";s:4:"name";s:27:"PEAR/Installer/Role/Src.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Src.php";}s:28:"PEAR/Installer/Role/Test.xml";a:4:{s:6:"md5sum";s:32:"a24b596ec987aa5688fc19e8ed4e97ea";s:4:"name";s:28:"PEAR/Installer/Role/Test.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:58:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Test.xml";}s:28:"PEAR/Installer/Role/Test.php";a:4:{s:6:"md5sum";s:32:"a04eb2f4881ec6e6a13ae78f6a43e3cd";s:4:"name";s:28:"PEAR/Installer/Role/Test.php";s:4:"role";s:3:"php";s:12:"installed_as";s:58:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Test.php";}s:27:"PEAR/Installer/Role/Www.xml";a:4:{s:6:"md5sum";s:32:"7641e71c5785bb33a4261ebe25ed0fd7";s:4:"name";s:27:"PEAR/Installer/Role/Www.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Www.xml";}s:27:"PEAR/Installer/Role/Www.php";a:4:{s:6:"md5sum";s:32:"62699034e3186c2d68a6bb56a6cc23eb";s:4:"name";s:27:"PEAR/Installer/Role/Www.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role/Www.php";}s:23:"PEAR/Installer/Role.php";a:4:{s:6:"md5sum";s:32:"e95f2d850fce183e221912b2c2056d04";s:4:"name";s:23:"PEAR/Installer/Role.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role.php";}s:33:"PEAR/PackageFile/Generator/v1.php";a:4:{s:6:"md5sum";s:32:"cfa08685115d5e2d7635225d73a91f39";s:4:"name";s:33:"PEAR/PackageFile/Generator/v1.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/Generator/v1.php";}s:33:"PEAR/PackageFile/Generator/v2.php";a:4:{s:6:"md5sum";s:32:"8d264031153993866828e82129e389ab";s:4:"name";s:33:"PEAR/PackageFile/Generator/v2.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/Generator/v2.php";}s:30:"PEAR/PackageFile/Parser/v1.php";a:4:{s:6:"md5sum";s:32:"a2206e0e32ad2ba2f4e2a0c1797f295c";s:4:"name";s:30:"PEAR/PackageFile/Parser/v1.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/Parser/v1.php";}s:30:"PEAR/PackageFile/Parser/v2.php";a:4:{s:6:"md5sum";s:32:"3857f4b60878d64551a7cdae783437f7";s:4:"name";s:30:"PEAR/PackageFile/Parser/v2.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/Parser/v2.php";}s:26:"PEAR/PackageFile/v2/rw.php";a:4:{s:6:"md5sum";s:32:"a253999b2109460badc3c71ad2c069e7";s:4:"name";s:26:"PEAR/PackageFile/v2/rw.php";s:4:"role";s:3:"php";s:12:"installed_as";s:56:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/v2/rw.php";}s:33:"PEAR/PackageFile/v2/Validator.php";a:4:{s:6:"md5sum";s:32:"44dafa313204f68b5fb54b9f61a86d0c";s:4:"name";s:33:"PEAR/PackageFile/v2/Validator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/v2/Validator.php";}s:23:"PEAR/PackageFile/v1.php";a:4:{s:6:"md5sum";s:32:"cc1ea307bb79c0cbcff4a90a4656e96e";s:4:"name";s:23:"PEAR/PackageFile/v1.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/v1.php";}s:23:"PEAR/PackageFile/v2.php";a:4:{s:6:"md5sum";s:32:"9e6012d4ef9cb8e12e2ccadcbdcf3d24";s:4:"name";s:23:"PEAR/PackageFile/v2.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/v2.php";}s:16:"PEAR/REST/10.php";a:4:{s:6:"md5sum";s:32:"ce77cc6593d8d4eda5ff8620ff09d6ec";s:4:"name";s:16:"PEAR/REST/10.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php54/usr/share/pear/PEAR/REST/10.php";}s:16:"PEAR/REST/11.php";a:4:{s:6:"md5sum";s:32:"bdbd1f2e8afa2cddddecf2687579d316";s:4:"name";s:16:"PEAR/REST/11.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php54/usr/share/pear/PEAR/REST/11.php";}s:16:"PEAR/REST/13.php";a:4:{s:6:"md5sum";s:32:"11179085b6efb577d37f45cc25e42a35";s:4:"name";s:16:"PEAR/REST/13.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php54/usr/share/pear/PEAR/REST/13.php";}s:34:"PEAR/Task/Postinstallscript/rw.php";a:4:{s:6:"md5sum";s:32:"0eb57da4993a3cfed69fe8135f10b05a";s:4:"name";s:34:"PEAR/Task/Postinstallscript/rw.php";s:4:"role";s:3:"php";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/PEAR/Task/Postinstallscript/rw.php";}s:24:"PEAR/Task/Replace/rw.php";a:4:{s:6:"md5sum";s:32:"46c1bdb9a7af8628643e639ec1c3bc58";s:4:"name";s:24:"PEAR/Task/Replace/rw.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/pear/PEAR/Task/Replace/rw.php";}s:24:"PEAR/Task/Unixeol/rw.php";a:4:{s:6:"md5sum";s:32:"50e20dbde7e51bb5e11545c56482b68a";s:4:"name";s:24:"PEAR/Task/Unixeol/rw.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/pear/PEAR/Task/Unixeol/rw.php";}s:27:"PEAR/Task/Windowseol/rw.php";a:4:{s:6:"md5sum";s:32:"340be01552844adb50f6e0fa37aa3ffe";s:4:"name";s:27:"PEAR/Task/Windowseol/rw.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/PEAR/Task/Windowseol/rw.php";}s:20:"PEAR/Task/Common.php";a:4:{s:6:"md5sum";s:32:"ec7f8db335ad3b5a25d78682745185d1";s:4:"name";s:20:"PEAR/Task/Common.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php54/usr/share/pear/PEAR/Task/Common.php";}s:31:"PEAR/Task/Postinstallscript.php";a:4:{s:6:"md5sum";s:32:"86f240c600447fdb86bd38bd32c66c02";s:4:"name";s:31:"PEAR/Task/Postinstallscript.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/PEAR/Task/Postinstallscript.php";}s:21:"PEAR/Task/Replace.php";a:4:{s:6:"md5sum";s:32:"c993cdedc64084a1c4b735baec048d50";s:4:"name";s:21:"PEAR/Task/Replace.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/PEAR/Task/Replace.php";}s:21:"PEAR/Task/Unixeol.php";a:4:{s:6:"md5sum";s:32:"76c4ca15858c005cda208a9da1f5eb2d";s:4:"name";s:21:"PEAR/Task/Unixeol.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/PEAR/Task/Unixeol.php";}s:24:"PEAR/Task/Windowseol.php";a:4:{s:6:"md5sum";s:32:"d790eb3aa5ba22a33e42cb7c5f99fb25";s:4:"name";s:24:"PEAR/Task/Windowseol.php";s:4:"role";s:3:"php";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/pear/PEAR/Task/Windowseol.php";}s:23:"PEAR/Validator/PECL.php";a:4:{s:6:"md5sum";s:32:"b3c83ca826a4825ca2db726ed7d4b245";s:4:"name";s:23:"PEAR/Validator/PECL.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/PEAR/Validator/PECL.php";}s:16:"PEAR/Builder.php";a:4:{s:6:"md5sum";s:32:"7d89f25a54d100c2afd562fb3bd7c308";s:4:"name";s:16:"PEAR/Builder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php54/usr/share/pear/PEAR/Builder.php";}s:20:"PEAR/ChannelFile.php";a:4:{s:6:"md5sum";s:32:"edcd484ecfd400875df90ee480c5384d";s:4:"name";s:20:"PEAR/ChannelFile.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php54/usr/share/pear/PEAR/ChannelFile.php";}s:16:"PEAR/Command.php";a:4:{s:6:"md5sum";s:32:"a5d56f9d15ff6d22c12f7db851f281e8";s:4:"name";s:16:"PEAR/Command.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php54/usr/share/pear/PEAR/Command.php";}s:15:"PEAR/Common.php";a:4:{s:6:"md5sum";s:32:"0af44a13df74291ac2f46949d2035e0e";s:4:"name";s:15:"PEAR/Common.php";s:4:"role";s:3:"php";s:12:"installed_as";s:45:"/opt/alt/php54/usr/share/pear/PEAR/Common.php";}s:15:"PEAR/Config.php";a:4:{s:6:"md5sum";s:32:"64d0f7b2737e5f182d0ab98bc77930d2";s:4:"name";s:15:"PEAR/Config.php";s:4:"role";s:3:"php";s:12:"installed_as";s:45:"/opt/alt/php54/usr/share/pear/PEAR/Config.php";}s:21:"PEAR/DependencyDB.php";a:4:{s:6:"md5sum";s:32:"7e8dfae09802be7f2e6170062bb80cbd";s:4:"name";s:21:"PEAR/DependencyDB.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/PEAR/DependencyDB.php";}s:20:"PEAR/Dependency2.php";a:4:{s:6:"md5sum";s:32:"76fdabdee883fd16b986332552b9e3dc";s:4:"name";s:20:"PEAR/Dependency2.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php54/usr/share/pear/PEAR/Dependency2.php";}s:19:"PEAR/Downloader.php";a:4:{s:6:"md5sum";s:32:"2ccb7bb2d00eae201ee7ae1eef49ad8a";s:4:"name";s:19:"PEAR/Downloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php54/usr/share/pear/PEAR/Downloader.php";}s:19:"PEAR/ErrorStack.php";a:4:{s:6:"md5sum";s:32:"ea807632b63d2e0acd6924db23aaa0eb";s:4:"name";s:19:"PEAR/ErrorStack.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php54/usr/share/pear/PEAR/ErrorStack.php";}s:18:"PEAR/Exception.php";a:4:{s:6:"md5sum";s:32:"544ed48cab9407a936d058d09e773e22";s:4:"name";s:18:"PEAR/Exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php54/usr/share/pear/PEAR/Exception.php";}s:17:"PEAR/Frontend.php";a:4:{s:6:"md5sum";s:32:"31c0b91767550adf77f1c9bea92a0559";s:4:"name";s:17:"PEAR/Frontend.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php54/usr/share/pear/PEAR/Frontend.php";}s:18:"PEAR/Installer.php";a:4:{s:6:"md5sum";s:32:"b8b85e42b840676ad3ae1c15e55b005b";s:4:"name";s:18:"PEAR/Installer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php54/usr/share/pear/PEAR/Installer.php";}s:20:"PEAR/PackageFile.php";a:4:{s:6:"md5sum";s:32:"2929765413405abf63574c8a544e4a04";s:4:"name";s:20:"PEAR/PackageFile.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile.php";}s:17:"PEAR/Packager.php";a:4:{s:6:"md5sum";s:32:"ad25a29d464b62cbaaa3ca96e622526c";s:4:"name";s:17:"PEAR/Packager.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php54/usr/share/pear/PEAR/Packager.php";}s:14:"PEAR/Proxy.php";a:4:{s:6:"md5sum";s:32:"ef9d00adaeccff7516f08170096026d3";s:4:"name";s:14:"PEAR/Proxy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:44:"/opt/alt/php54/usr/share/pear/PEAR/Proxy.php";}s:17:"PEAR/Registry.php";a:4:{s:6:"md5sum";s:32:"ae8c1dcfddb6a2717e09239bb1430dc7";s:4:"name";s:17:"PEAR/Registry.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php54/usr/share/pear/PEAR/Registry.php";}s:13:"PEAR/REST.php";a:4:{s:6:"md5sum";s:32:"389d1bad72267d3ed770abf0662d8086";s:4:"name";s:13:"PEAR/REST.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php54/usr/share/pear/PEAR/REST.php";}s:16:"PEAR/RunTest.php";a:4:{s:6:"md5sum";s:32:"df0d7022e22fd78ecd82080ff4f108d5";s:4:"name";s:16:"PEAR/RunTest.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php54/usr/share/pear/PEAR/RunTest.php";}s:17:"PEAR/Validate.php";a:4:{s:6:"md5sum";s:32:"3711c281e0234203ec7879f53bc766ab";s:4:"name";s:17:"PEAR/Validate.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php54/usr/share/pear/PEAR/Validate.php";}s:18:"PEAR/XMLParser.php";a:4:{s:6:"md5sum";s:32:"da9510087eddd489945dde07260256ee";s:4:"name";s:18:"PEAR/XMLParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php54/usr/share/pear/PEAR/XMLParser.php";}s:15:"scripts/pear.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"da1eb6f7a5ac469f6209785eec218681";s:4:"name";s:15:"scripts/pear.sh";s:4:"role";s:6:"script";s:10:"install-as";s:4:"pear";s:12:"installed_as";s:27:"/opt/alt/php54/usr/bin/pear";}s:18:"scripts/peardev.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5cbc5f60a1d09b163d2b7646d9cfe508";s:4:"name";s:18:"scripts/peardev.sh";s:4:"role";s:6:"script";s:10:"install-as";s:7:"peardev";s:12:"installed_as";s:30:"/opt/alt/php54/usr/bin/peardev";}s:15:"scripts/pecl.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dde274be4a7988048be69cdf87d5462b";s:4:"name";s:15:"scripts/pecl.sh";s:4:"role";s:6:"script";s:10:"install-as";s:4:"pecl";s:12:"installed_as";s:27:"/opt/alt/php54/usr/bin/pecl";}s:19:"scripts/pearcmd.php";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8440e32bd629cde9a46a2895c0d0f70a";s:4:"name";s:19:"scripts/pearcmd.php";s:4:"role";s:3:"php";s:10:"install-as";s:11:"pearcmd.php";s:12:"installed_as";s:41:"/opt/alt/php54/usr/share/pear/pearcmd.php";}s:19:"scripts/peclcmd.php";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"da7c2e8da34bfd99cc1934aa1999dcc0";s:4:"name";s:19:"scripts/peclcmd.php";s:4:"role";s:3:"php";s:10:"install-as";s:11:"peclcmd.php";s:12:"installed_as";s:41:"/opt/alt/php54/usr/share/pear/peclcmd.php";}s:7:"LICENSE";a:4:{s:6:"md5sum";s:32:"45b44486d8090de17b2a8b4211fab247";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:46:"/opt/alt/php54/usr/share/doc/pear/PEAR/LICENSE";}s:7:"INSTALL";a:4:{s:6:"md5sum";s:32:"eaac3d33068c6e67573ed44155b149ae";s:4:"name";s:7:"INSTALL";s:4:"role";s:3:"doc";s:12:"installed_as";s:46:"/opt/alt/php54/usr/share/doc/pear/PEAR/INSTALL";}s:11:"package.dtd";a:4:{s:6:"md5sum";s:32:"69341ea97af9c88956568f8e7e41d4c6";s:4:"name";s:11:"package.dtd";s:4:"role";s:4:"data";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/data/PEAR/package.dtd";}s:8:"PEAR.php";a:4:{s:6:"md5sum";s:32:"47aeb7eaff6438beb60bc42bc0e6c658";s:4:"name";s:8:"PEAR.php";s:4:"role";s:3:"php";s:12:"installed_as";s:38:"/opt/alt/php54/usr/share/pear/PEAR.php";}s:10:"README.rst";a:4:{s:6:"md5sum";s:32:"cd10521cc4054923a3d2b6e15b4df493";s:4:"name";s:10:"README.rst";s:4:"role";s:3:"doc";s:12:"installed_as";s:49:"/opt/alt/php54/usr/share/doc/pear/PEAR/README.rst";}s:10:"System.php";a:4:{s:6:"md5sum";s:32:"ba9e5c5a567e51b440808a8ed53cd76d";s:4:"name";s:10:"System.php";s:4:"role";s:3:"php";s:12:"installed_as";s:40:"/opt/alt/php54/usr/share/pear/System.php";}s:13:"template.spec";a:4:{s:6:"md5sum";s:32:"acd010e3bc43c0f72df584acde7b9158";s:4:"name";s:13:"template.spec";s:4:"role";s:4:"data";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/data/PEAR/template.spec";}}s:12:"_lastversion";N;s:7:"dirtree";a:23:{s:32:"/opt/alt/php54/usr/share/pear/OS";b:1;s:46:"/opt/alt/php54/usr/share/pear/PEAR/ChannelFile";b:1;s:34:"/opt/alt/php54/usr/share/pear/PEAR";b:1;s:42:"/opt/alt/php54/usr/share/pear/PEAR/Command";b:1;s:45:"/opt/alt/php54/usr/share/pear/PEAR/Downloader";b:1;s:43:"/opt/alt/php54/usr/share/pear/PEAR/Frontend";b:1;s:49:"/opt/alt/php54/usr/share/pear/PEAR/Installer/Role";b:1;s:44:"/opt/alt/php54/usr/share/pear/PEAR/Installer";b:1;s:56:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/Generator";b:1;s:46:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile";b:1;s:53:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/Parser";b:1;s:49:"/opt/alt/php54/usr/share/pear/PEAR/PackageFile/v2";b:1;s:39:"/opt/alt/php54/usr/share/pear/PEAR/REST";b:1;s:57:"/opt/alt/php54/usr/share/pear/PEAR/Task/Postinstallscript";b:1;s:39:"/opt/alt/php54/usr/share/pear/PEAR/Task";b:1;s:47:"/opt/alt/php54/usr/share/pear/PEAR/Task/Replace";b:1;s:47:"/opt/alt/php54/usr/share/pear/PEAR/Task/Unixeol";b:1;s:50:"/opt/alt/php54/usr/share/pear/PEAR/Task/Windowseol";b:1;s:44:"/opt/alt/php54/usr/share/pear/PEAR/Validator";b:1;s:22:"/opt/alt/php54/usr/bin";b:1;s:29:"/opt/alt/php54/usr/share/pear";b:1;s:38:"/opt/alt/php54/usr/share/doc/pear/PEAR";b:1;s:39:"/opt/alt/php54/usr/share/pear/data/PEAR";b:1;}s:3:"old";a:7:{s:7:"version";s:7:"1.10.16";s:12:"release_date";s:10:"2024-11-24";s:13:"release_state";s:6:"stable";s:15:"release_license";s:15:"New BSD License";s:13:"release_notes";s:164:"* PR #141: Fix bug #27796: "Array to string" conversion warnings on installs/other actions
* PR #145: Never reference E_STRICT on PHP 8.4+
* PR #147: Fix tests 8.1+";s:12:"release_deps";a:8:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:6:"1.10.1";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:11:"Archive_Tar";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.9";s:8:"optional";s:2:"no";}i:3;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:16:"Structures_Graph";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.1.0";s:8:"optional";s:2:"no";}i:4;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:14:"Console_Getopt";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.1";s:8:"optional";s:2:"no";}i:5;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:8:"XML_Util";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:6;a:4:{s:4:"type";s:3:"ext";s:4:"name";s:3:"xml";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:7;a:4:{s:4:"type";s:3:"ext";s:4:"name";s:4:"pcre";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:11:{i:0;a:5:{s:4:"name";s:11:"Greg Beaver";s:5:"email";s:14:"cellog@php.net";s:6:"active";s:2:"no";s:6:"handle";s:6:"cellog";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:17:"Pierre-Alain Joye";s:5:"email";s:14:"pierre@php.net";s:6:"active";s:2:"no";s:6:"handle";s:6:"pajoye";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:11:"Stig Bakken";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";s:6:"handle";s:3:"ssb";s:4:"role";s:4:"lead";}i:3;a:5:{s:4:"name";s:13:"Tomas V.V.Cox";s:5:"email";s:15:"cox@idecnet.com";s:6:"active";s:2:"no";s:6:"handle";s:3:"cox";s:4:"role";s:4:"lead";}i:4;a:5:{s:4:"name";s:13:"Helgi Thormar";s:5:"email";s:13:"dufuz@php.net";s:6:"active";s:2:"no";s:6:"handle";s:5:"dufuz";s:4:"role";s:4:"lead";}i:5;a:5:{s:4:"name";s:16:"Christian Weiske";s:5:"email";s:15:"cweiske@php.net";s:6:"active";s:2:"no";s:6:"handle";s:7:"cweiske";s:4:"role";s:4:"lead";}i:6;a:5:{s:4:"name";s:13:"Chuck Burgess";s:5:"email";s:15:"ashnazg@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:7:"ashnazg";s:4:"role";s:4:"lead";}i:7;a:5:{s:4:"name";s:9:"Tias Guns";s:5:"email";s:12:"tias@php.net";s:6:"active";s:2:"no";s:6:"handle";s:4:"tias";s:4:"role";s:9:"developer";}i:8;a:5:{s:4:"name";s:11:"Tim Jackson";s:5:"email";s:12:"timj@php.net";s:6:"active";s:2:"no";s:6:"handle";s:4:"timj";s:4:"role";s:6:"helper";}i:9;a:5:{s:4:"name";s:15:"Bertrand Gugger";s:5:"email";s:13:"toggg@php.net";s:6:"active";s:2:"no";s:6:"handle";s:5:"toggg";s:4:"role";s:6:"helper";}i:10;a:5:{s:4:"name";s:13:"Martin Jansen";s:5:"email";s:10:"mj@php.net";s:6:"active";s:2:"no";s:6:"handle";s:2:"mj";s:4:"role";s:6:"helper";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747067530;}PK�^�\��V~pear/.registry/net_idna2.regnu�[���a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.3";s:7:"version";s:3:"2.0";s:5:"xmlns";s:36:"https://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:34:"https://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:42:"https://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:151:"https://pear.php.net/dtd/tasks-1.0 https://pear.php.net/dtd/tasks-1.0.xsd https://pear.php.net/dtd/package-2.0 https://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:9:"Net_IDNA2";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:31:"Punycode encoding and decoding.";s:11:"description";s:68:"This package helps you to encode and decode punycode strings easily.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:15:"Stefan Neufeind";s:4:"user";s:8:"neufeind";s:5:"email";s:29:"pear.neufeind@speedpartner.de";s:6:"active";s:3:"yes";}i:1;a:4:{s:4:"name";s:15:"Daniel O'Connor";s:4:"user";s:8:"doconnor";s:5:"email";s:24:"daniel.oconnor@gmail.com";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2017-03-06";s:4:"time";s:8:"20:40:58";s:7:"version";a:2:{s:7:"release";s:5:"0.2.0";s:3:"api";s:5:"0.2.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:40:"https://www.gnu.org/copyleft/lesser.html";}s:8:"_content";s:4:"LGPL";}s:5:"notes";s:165:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Bug #19375: Add static to the fuction getInstance
* Bug #21123: Signing the source package";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:5:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"41766020ff8f63f695c9bf7e86040e70";s:4:"name";s:13:"Net/IDNA2.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"72f605f2f6d9d56e07bb6bcec099d03a";s:4:"name";s:23:"Net/IDNA2/Exception.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"06c4217024082f0f3b6c5a7e61ac7130";s:4:"name";s:32:"Net/IDNA2/Exception/Nameprep.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"999210e6bd489aba06e5121a2788956f";s:4:"name";s:23:"tests/Net_IDNA2Test.php";s:4:"role";s:4:"test";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2996ea57df9e5e3153da8a94fbb3c603";s:4:"name";s:42:"tests/draft-josefsson-idn-test-vectors.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:6:"1.10.1";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:2:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.1.0";s:3:"api";s:5:"0.1.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2010-06-03";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:40:"https://www.gnu.org/copyleft/lesser.html";}s:8:"_content";s:4:"LGPL";}s:5:"notes";s:139:"QA Release
Bug #17430 	Multiple Net_IDNA class declarations
Warning: This package is now split between Net_IDNA (php4) and Net_IDNA2 (php5)";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.2.0";s:3:"api";s:5:"0.2.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2017-03-06";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:40:"https://www.gnu.org/copyleft/lesser.html";}s:8:"_content";s:4:"LGPL";}s:5:"notes";s:165:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Bug #19375: Add static to the fuction getInstance
* Bug #21123: Signing the source package";}}}s:8:"filelist";a:5:{s:13:"Net/IDNA2.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"41766020ff8f63f695c9bf7e86040e70";s:4:"name";s:13:"Net/IDNA2.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php54/usr/share/pear/Net/IDNA2.php";}s:23:"Net/IDNA2/Exception.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"72f605f2f6d9d56e07bb6bcec099d03a";s:4:"name";s:23:"Net/IDNA2/Exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/Net/IDNA2/Exception.php";}s:32:"Net/IDNA2/Exception/Nameprep.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"06c4217024082f0f3b6c5a7e61ac7130";s:4:"name";s:32:"Net/IDNA2/Exception/Nameprep.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/Net/IDNA2/Exception/Nameprep.php";}s:23:"tests/Net_IDNA2Test.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"999210e6bd489aba06e5121a2788956f";s:4:"name";s:23:"tests/Net_IDNA2Test.php";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/test/Net_IDNA2/tests/Net_IDNA2Test.php";}s:42:"tests/draft-josefsson-idn-test-vectors.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2996ea57df9e5e3153da8a94fbb3c603";s:4:"name";s:42:"tests/draft-josefsson-idn-test-vectors.php";s:4:"role";s:4:"test";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/test/Net_IDNA2/tests/draft-josefsson-idn-test-vectors.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:33:"/opt/alt/php54/usr/share/pear/Net";b:1;s:39:"/opt/alt/php54/usr/share/pear/Net/IDNA2";b:1;s:49:"/opt/alt/php54/usr/share/pear/Net/IDNA2/Exception";b:1;s:50:"/opt/alt/php54/usr/share/pear/test/Net_IDNA2/tests";b:1;s:44:"/opt/alt/php54/usr/share/pear/test/Net_IDNA2";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"0.2.0";s:12:"release_date";s:10:"2017-03-06";s:13:"release_state";s:4:"beta";s:15:"release_license";s:4:"LGPL";s:13:"release_notes";s:165:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Bug #19375: Add static to the fuction getInstance
* Bug #21123: Signing the source package";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:6:"1.10.1";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:2:{i:0;a:5:{s:4:"name";s:15:"Stefan Neufeind";s:5:"email";s:29:"pear.neufeind@speedpartner.de";s:6:"active";s:3:"yes";s:6:"handle";s:8:"neufeind";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:15:"Daniel O'Connor";s:5:"email";s:24:"daniel.oconnor@gmail.com";s:6:"active";s:2:"no";s:6:"handle";s:8:"doconnor";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506497;}PK�^�\�aT��pear/.registry/net_socket.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.3";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:24:"Network Socket Interface";s:11:"description";s:237:"Net_Socket is a class interface to TCP sockets.  It provides blocking
  and non-blocking operation, with different reading and writing modes
  (byte-wise, block-wise, line-wise and special formats like network
  byte-order ip addresses).";s:4:"lead";a:3:{i:0;a:4:{s:4:"name";s:15:"Chuck Hagenbuch";s:4:"user";s:8:"chagenbu";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:11:"Stig Bakken";s:4:"user";s:3:"ssb";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:19:"Aleksander Machniak";s:4:"user";s:4:"alec";s:5:"email";s:12:"alec@php.net";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2017-04-13";s:4:"time";s:8:"17:15:33";s:7:"version";a:2:{s:7:"release";s:5:"1.2.2";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:52:"* Bug #21178: $php_errormsg is deprecated in PHP 7.2";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:3:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f99081ef3a69bcc1faa0d90a9a616788";s:4:"name";s:14:"Net/Socket.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"61a9ed8d1604a739e6997149ea34e701";s:4:"name";s:9:"README.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"28575b04f4f2014316245d83e27343e1";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:6:"1.10.1";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:3:{s:14:"Net/Socket.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f99081ef3a69bcc1faa0d90a9a616788";s:4:"name";s:14:"Net/Socket.php";s:4:"role";s:3:"php";s:12:"installed_as";s:44:"/opt/alt/php54/usr/share/pear/Net/Socket.php";}s:9:"README.md";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"61a9ed8d1604a739e6997149ea34e701";s:4:"name";s:9:"README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/doc/pear/Net_Socket/README.md";}s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"28575b04f4f2014316245d83e27343e1";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:52:"/opt/alt/php54/usr/share/doc/pear/Net_Socket/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:2:{s:33:"/opt/alt/php54/usr/share/pear/Net";b:1;s:44:"/opt/alt/php54/usr/share/doc/pear/Net_Socket";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.2.2";s:12:"release_date";s:10:"2017-04-13";s:13:"release_state";s:6:"stable";s:15:"release_license";s:12:"BSD-2-Clause";s:13:"release_notes";s:52:"* Bug #21178: $php_errormsg is deprecated in PHP 7.2";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:6:"1.10.1";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:15:"Chuck Hagenbuch";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:2:"no";s:6:"handle";s:8:"chagenbu";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:11:"Stig Bakken";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";s:6:"handle";s:3:"ssb";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:19:"Aleksander Machniak";s:5:"email";s:12:"alec@php.net";s:6:"active";s:2:"no";s:6:"handle";s:4:"alec";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506497;}PK�^�\�y|&|&pear/.registry/auth_sasl.regnu�[���a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.3";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:153:"http://pear.php.net/dtd/tasks-1.0   http://pear.php.net/dtd/tasks-1.0.xsd   http://pear.php.net/dtd/package-2.0   http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:47:"Abstraction of various SASL mechanism responses";s:11:"description";s:152:"Provides code to generate responses to common SASL mechanisms, including:
- Digest-MD5
- Cram-MD5
- Plain
- Anonymous
- Login (Pseudo mechanism)
- SCRAM";s:4:"lead";a:3:{i:0;a:4:{s:4:"name";s:12:"Anish Mistry";s:4:"user";s:7:"amistry";s:5:"email";s:26:"amistry@am-productions.biz";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:13:"Richard Heyes";s:4:"user";s:7:"richard";s:5:"email";s:15:"richard@php.net";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:22:"Michael Bretterklieber";s:4:"user";s:8:"mbretter";s:5:"email";s:26:"michael@bretterklieber.com";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2017-03-07";s:4:"time";s:8:"14:04:34";s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:114:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Request #21033: PHP warning depreciated";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:9:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"60f7b5ba4d05fe0e518292963b14bddb";s:4:"name";s:23:"Auth/SASL/Anonymous.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2c817e4775b6f63f07ddb0c9cbd88b5";s:4:"name";s:20:"Auth/SASL/Common.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c6b3b3a4e0aec6a4e0728732ef6babc9";s:4:"name";s:21:"Auth/SASL/CramMD5.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"509e431141489a77a991401d64f15e9e";s:4:"name";s:23:"Auth/SASL/DigestMD5.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1d7478dd9dc5734ec9e16c158dcb6f76";s:4:"name";s:22:"Auth/SASL/External.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a0abcf277374b24262807150451b55e";s:4:"name";s:19:"Auth/SASL/Login.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bde1dcf2780d042c1de12e20a696e945";s:4:"name";s:19:"Auth/SASL/Plain.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e99f9f71abc36d64ca8e17ad6e5e7631";s:4:"name";s:19:"Auth/SASL/SCRAM.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b93e37947e1dd90e5fb639a1734f7a71";s:4:"name";s:13:"Auth/SASL.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:6:"1.10.1";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:7:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-03-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:114:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Request #21033: PHP warning depreciated";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.6";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-09-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:102:"QA release
* Bug #18856: Authentication warnings because of wrong Auth_SASL::factory argument [kguest]";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.5";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-09-04";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:256:"QA release
* Added support for any mechanism of the SCRAM family; with thanks to Jehan Pagès. [kguest]
* crammd5 and digestmd5 mechanisms name deprecated in favour of IANA registered names 'cram-md5' and 'digest-md5'; with thanks to Jehan Pagès. [kguest]";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.4";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-02-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:85:"QA release
* Fix bug #16624: open_basedir restriction warning in DigestMD5.php [till]";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.3";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-08-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:181:"QA release
* Move SVN to proper directory structure [cweiske]
* Fix Bug #8775: Error in package.xml
* Fix Bug #14671: Security issue due to seeding random number generator [cweiske]";}i:5;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.2";s:3:"api";s:5:"1.0.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-05-21";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:179:"* Fixed Bug #2143 Auth_SASL_DigestMD5::getResponse() generates invalid response
* Fixed Bug #6611 Suppress PHP 5 Notice Errors
* Fixed Bug #2154 realm isn't contained in challange";}i:6;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.1";s:3:"api";s:5:"1.0.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-11";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:59:"* Added authcid/authzid separation in PLAIN and DIGEST-MD5.";}}}s:8:"filelist";a:9:{s:23:"Auth/SASL/Anonymous.php";a:4:{s:6:"md5sum";s:32:"60f7b5ba4d05fe0e518292963b14bddb";s:4:"name";s:23:"Auth/SASL/Anonymous.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/Auth/SASL/Anonymous.php";}s:20:"Auth/SASL/Common.php";a:4:{s:6:"md5sum";s:32:"c2c817e4775b6f63f07ddb0c9cbd88b5";s:4:"name";s:20:"Auth/SASL/Common.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php54/usr/share/pear/Auth/SASL/Common.php";}s:21:"Auth/SASL/CramMD5.php";a:4:{s:6:"md5sum";s:32:"c6b3b3a4e0aec6a4e0728732ef6babc9";s:4:"name";s:21:"Auth/SASL/CramMD5.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/Auth/SASL/CramMD5.php";}s:23:"Auth/SASL/DigestMD5.php";a:4:{s:6:"md5sum";s:32:"509e431141489a77a991401d64f15e9e";s:4:"name";s:23:"Auth/SASL/DigestMD5.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/Auth/SASL/DigestMD5.php";}s:22:"Auth/SASL/External.php";a:4:{s:6:"md5sum";s:32:"1d7478dd9dc5734ec9e16c158dcb6f76";s:4:"name";s:22:"Auth/SASL/External.php";s:4:"role";s:3:"php";s:12:"installed_as";s:52:"/opt/alt/php54/usr/share/pear/Auth/SASL/External.php";}s:19:"Auth/SASL/Login.php";a:4:{s:6:"md5sum";s:32:"3a0abcf277374b24262807150451b55e";s:4:"name";s:19:"Auth/SASL/Login.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php54/usr/share/pear/Auth/SASL/Login.php";}s:19:"Auth/SASL/Plain.php";a:4:{s:6:"md5sum";s:32:"bde1dcf2780d042c1de12e20a696e945";s:4:"name";s:19:"Auth/SASL/Plain.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php54/usr/share/pear/Auth/SASL/Plain.php";}s:19:"Auth/SASL/SCRAM.php";a:4:{s:6:"md5sum";s:32:"e99f9f71abc36d64ca8e17ad6e5e7631";s:4:"name";s:19:"Auth/SASL/SCRAM.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php54/usr/share/pear/Auth/SASL/SCRAM.php";}s:13:"Auth/SASL.php";a:4:{s:6:"md5sum";s:32:"b93e37947e1dd90e5fb639a1734f7a71";s:4:"name";s:13:"Auth/SASL.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php54/usr/share/pear/Auth/SASL.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:2:{s:39:"/opt/alt/php54/usr/share/pear/Auth/SASL";b:1;s:34:"/opt/alt/php54/usr/share/pear/Auth";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.1.0";s:12:"release_date";s:10:"2017-03-07";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"BSD";s:13:"release_notes";s:114:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Request #21033: PHP warning depreciated";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:6:"1.10.1";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:12:"Anish Mistry";s:5:"email";s:26:"amistry@am-productions.biz";s:6:"active";s:2:"no";s:6:"handle";s:7:"amistry";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:13:"Richard Heyes";s:5:"email";s:15:"richard@php.net";s:6:"active";s:2:"no";s:6:"handle";s:7:"richard";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:22:"Michael Bretterklieber";s:5:"email";s:26:"michael@bretterklieber.com";s:6:"active";s:2:"no";s:6:"handle";s:8:"mbretter";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506497;}PK�^�\W���)�)!pear/.registry/console_getopt.regnu�[���a:25:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.10";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:14:"Console_Getopt";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:26:"Command-line option parser";s:11:"description";s:80:"This is a PHP implementation of "getopt" supporting both
short and long options.";s:4:"lead";a:4:{s:4:"name";s:15:"Andrei Zmievski";s:4:"user";s:6:"andrei";s:5:"email";s:14:"andrei@php.net";s:6:"active";s:2:"no";}s:9:"developer";a:4:{s:4:"name";s:11:"Stig Bakken";s:4:"user";s:3:"ssb";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";}s:6:"helper";a:4:{s:4:"name";s:11:"Greg Beaver";s:4:"user";s:6:"cellog";s:5:"email";s:14:"cellog@php.net";s:6:"active";s:2:"no";}s:4:"date";s:10:"2019-11-20";s:4:"time";s:8:"18:27:07";s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:98:"* PR #4:  Fix PHP 7.4 deprecation: array/string curly braces access
* PR #5:  fix phplint warnings";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:5:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63da5909aa85a0eb76e0ad0b5e00811a";s:4:"name";s:18:"Console/Getopt.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5a6fa63ce6f2370cdad11dc24a5addd0";s:4:"name";s:21:"tests/001-getopt.phpt";s:4:"role";s:4:"test";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7540b630cb8e7bfd8bb06fb65a010ae9";s:4:"name";s:19:"tests/bug10557.phpt";s:4:"role";s:4:"test";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e469de3628de85779118103b3248a44f";s:4:"name";s:19:"tests/bug11068.phpt";s:4:"role";s:4:"test";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cdc108b084ad8e82eeb2417f04b49ec8";s:4:"name";s:19:"tests/bug13140.phpt";s:4:"role";s:4:"test";}}}}}s:10:"compatible";a:4:{s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";s:3:"max";s:9:"1.999.999";}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.8.0";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:14:{i:0;a:5:{s:4:"date";s:10:"2019-11-20";s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:98:"* PR #4:  Fix PHP 7.4 deprecation: array/string curly braces access
* PR #5:  fix phplint warnings";}i:1;a:5:{s:4:"date";s:10:"2019-02-06";s:7:"version";a:2:{s:7:"release";s:5:"1.4.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:49:"* Remove use of each(), which is removed in PHP 8";}i:2;a:5:{s:4:"date";s:10:"2015-07-20";s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:34:"* Fix unit test on PHP 7 [cweiske]";}i:3;a:5:{s:4:"date";s:10:"2015-02-22";s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:46:"http://opensource.org/licenses/bsd-license.php";}s:8:"_content";s:12:"BSD-2-Clause";}s:5:"notes";s:111:"* Change license to BSD-2-Clause
* Set minimum PHP version to 5.4.0
* Mark static methods with "static" keyword";}i:4;a:5:{s:4:"date";s:10:"2011-03-07";s:7:"version";a:2:{s:7:"release";s:5:"1.3.1";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:51:"* Change the minimum PEAR installer dep to be lower";}i:5;a:6:{s:4:"date";s:10:"2010-12-11";s:4:"time";s:8:"20:20:13";s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:106:"* Implement Request #13140: [PATCH] to skip unknown parameters. [patch by rquadling, improved on by dufuz]";}i:6;a:5:{s:4:"date";s:10:"2007-06-12";s:7:"version";a:2:{s:7:"release";s:5:"1.2.3";s:3:"api";s:5:"1.2.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:58:"* fix Bug #11068: No way to read plain "-" option [cardoe]";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.2";s:3:"api";s:5:"1.2.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-02-17";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:165:"* fix Bug #4475: An ambiguous error occurred when specifying similar longoption name.
* fix Bug #10055: Not failing properly on short options missing required values";}i:8;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.1";s:3:"api";s:5:"1.2.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-12-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:126:"Fixed bugs #4448 (Long parameter values truncated with longoption parameter) and #7444 (Trailing spaces after php closing tag)";}i:9;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.2";s:3:"api";s:3:"1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-12-11";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:69:"Fix to preserve BC with 1.0 and allow correct behaviour for new users";}i:10;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.0";s:3:"api";s:3:"1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-09-13";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:14:"Stable release";}i:11;a:5:{s:7:"version";a:2:{s:7:"release";s:4:"0.11";s:3:"api";s:4:"0.11";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2002-05-26";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:89:"POSIX getopt compatibility fix: treat first element of args
        array as command name";}i:12;a:5:{s:7:"version";a:2:{s:7:"release";s:4:"0.10";s:3:"api";s:4:"0.10";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2002-05-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:13:"Packaging fix";}i:13;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.9";s:3:"api";s:3:"0.9";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2002-05-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:15:"Initial release";}}}s:8:"filelist";a:5:{s:18:"Console/Getopt.php";a:4:{s:6:"md5sum";s:32:"63da5909aa85a0eb76e0ad0b5e00811a";s:4:"name";s:18:"Console/Getopt.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php54/usr/share/pear/Console/Getopt.php";}s:21:"tests/001-getopt.phpt";a:4:{s:6:"md5sum";s:32:"5a6fa63ce6f2370cdad11dc24a5addd0";s:4:"name";s:21:"tests/001-getopt.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/test/Console_Getopt/tests/001-getopt.phpt";}s:19:"tests/bug10557.phpt";a:4:{s:6:"md5sum";s:32:"7540b630cb8e7bfd8bb06fb65a010ae9";s:4:"name";s:19:"tests/bug10557.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/test/Console_Getopt/tests/bug10557.phpt";}s:19:"tests/bug11068.phpt";a:4:{s:6:"md5sum";s:32:"e469de3628de85779118103b3248a44f";s:4:"name";s:19:"tests/bug11068.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/test/Console_Getopt/tests/bug11068.phpt";}s:19:"tests/bug13140.phpt";a:4:{s:6:"md5sum";s:32:"cdc108b084ad8e82eeb2417f04b49ec8";s:4:"name";s:19:"tests/bug13140.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/test/Console_Getopt/tests/bug13140.phpt";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:37:"/opt/alt/php54/usr/share/pear/Console";b:1;s:55:"/opt/alt/php54/usr/share/pear/test/Console_Getopt/tests";b:1;s:49:"/opt/alt/php54/usr/share/pear/test/Console_Getopt";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.4.3";s:12:"release_date";s:10:"2019-11-20";s:13:"release_state";s:6:"stable";s:15:"release_license";s:12:"BSD-2-Clause";s:13:"release_notes";s:98:"* PR #4:  Fix PHP 7.4 deprecation: array/string curly braces access
* PR #5:  fix phplint warnings";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.8.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:15:"Andrei Zmievski";s:5:"email";s:14:"andrei@php.net";s:6:"active";s:2:"no";s:6:"handle";s:6:"andrei";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:11:"Stig Bakken";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";s:6:"handle";s:3:"ssb";s:4:"role";s:9:"developer";}i:2;a:5:{s:4:"name";s:11:"Greg Beaver";s:5:"email";s:14:"cellog@php.net";s:6:"active";s:2:"no";s:6:"handle";s:6:"cellog";s:4:"role";s:6:"helper";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747067531;}PK�^�\<��.�.�pear/.registry/mail_mime.regnu�[���a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.12";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd             http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:9:"Mail_Mime";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:51:"Mail_Mime provides classes to create MIME messages.";s:11:"description";s:395:"Mail_Mime provides classes to deal with the creation and manipulation of MIME messages.
It allows people to create e-mail messages consisting of:
* Text Parts
* HTML Parts
* Inline HTML Images
* Attachments
* Attached messages

It supports big messages, base64 and quoted-printable encodings and
non-ASCII characters in filenames, subjects, recipients, etc. encoded
using RFC2047 and/or RFC2231.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:19:"Cipriano Groenendal";s:4:"user";s:5:"cipri";s:5:"email";s:13:"cipri@php.net";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:19:"Aleksander Machniak";s:4:"user";s:4:"alec";s:5:"email";s:12:"alec@php.net";s:6:"active";s:3:"yes";}}s:4:"date";s:10:"2021-09-05";s:4:"time";s:8:"08:43:21";s:7:"version";a:2:{s:7:"release";s:7:"1.10.11";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:246:"* Fix PHP 8.1: strlen(): Passing null to parameter #1 ($string) of type string is deprecated [alec]
* Fix encoding recipient names with @ character and no space between name and address [alec]
* Fix the license label in composer.json [jnkowa-gfk]";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:53:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"edd138f6c5497ae2b5d63620a67a931e";s:4:"name";s:25:"tests/class-filename.phpt";s:4:"role";s:4:"test";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"7ec986391d0af058316f66e5a507e059";s:4:"name";s:36:"tests/content_transfer_encoding.phpt";s:4:"role";s:4:"test";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"c1a43360d9b2cb5f9542503a4355c277";s:4:"name";s:24:"tests/encoding_case.phpt";s:4:"role";s:4:"test";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"bf50a200190cad5e2d4aae4e120ea09f";s:4:"name";s:32:"tests/headers_with_mbstring.phpt";s:4:"role";s:4:"test";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"9a2d207f873317125ff43c092f3f0d25";s:4:"name";s:35:"tests/headers_without_mbstring.phpt";s:4:"role";s:4:"test";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"25d4c5b9fdeaabc7810c26e6f89e95ca";s:4:"name";s:27:"tests/qp_encoding_test.phpt";s:4:"role";s:4:"test";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"958197f31b4a20c91dd42662595e7516";s:4:"name";s:41:"tests/sleep_wakeup_EOL-bug3488-part1.phpt";s:4:"role";s:4:"test";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"46675529f1f021b51a1aa0ae6c971cd2";s:4:"name";s:41:"tests/sleep_wakeup_EOL-bug3488-part2.phpt";s:4:"role";s:4:"test";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f8c05910737e451c7a9d4737b8d9f095";s:4:"name";s:26:"tests/test_Bug_3513_1.phpt";s:4:"role";s:4:"test";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"edb467a375ddf09e777a9388e2e8cbb5";s:4:"name";s:26:"tests/test_Bug_3513_2.phpt";s:4:"role";s:4:"test";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"70c2456445eaaa80779206e9e245d685";s:4:"name";s:26:"tests/test_Bug_3513_3.phpt";s:4:"role";s:4:"test";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"4cda500d0d7925e81a299f1d3db132a9";s:4:"name";s:26:"tests/test_Bug_7561_1.phpt";s:4:"role";s:4:"test";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"42a214e7e3d3afa07f8996b235222611";s:4:"name";s:26:"tests/test_Bug_8386_1.phpt";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ed78099563499f60386a128cb7b96925";s:4:"name";s:26:"tests/test_Bug_8541_1.phpt";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"5250a0693599b945e8642a1a289d7275";s:4:"name";s:26:"tests/test_Bug_9722_1.phpt";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b7f58f54e1485c23a60c83cd3cc5563e";s:4:"name";s:27:"tests/test_Bug_10596_1.phpt";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ccb53d80e7f5c9f28b11abce5fe5d490";s:4:"name";s:27:"tests/test_Bug_10816_1.phpt";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f3d92a1fff099173b8600fb3646d0614";s:4:"name";s:27:"tests/test_Bug_10999_1.phpt";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"3f2757d5db43abd8f177f094f4d53625";s:4:"name";s:25:"tests/test_Bug_11381.phpt";s:4:"role";s:4:"test";}}i:19;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"c64d675e73bc02fc94f5d03b3117cfa0";s:4:"name";s:25:"tests/test_Bug_11731.phpt";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8c9305ca05f5ed2d7cd7e31e4836f17a";s:4:"name";s:25:"tests/test_Bug_12165.phpt";s:4:"role";s:4:"test";}}i:21;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"2aa2c3dfbe44500809e79da994272611";s:4:"name";s:27:"tests/test_Bug_12385_1.phpt";s:4:"role";s:4:"test";}}i:22;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ef1d726233dbd3360c540fd6a959b0d0";s:4:"name";s:25:"tests/test_Bug_12411.phpt";s:4:"role";s:4:"test";}}i:23;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"a862a57ff622fcbb2328be6c805e2d05";s:4:"name";s:25:"tests/test_Bug_12466.phpt";s:4:"role";s:4:"test";}}i:24;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"4eddeeac08f351feb147ab6fda439526";s:4:"name";s:25:"tests/test_Bug_13032.phpt";s:4:"role";s:4:"test";}}i:25;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"de15a0657a83694bc6991c4184ccf9bd";s:4:"name";s:25:"tests/test_Bug_13444.phpt";s:4:"role";s:4:"test";}}i:26;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"80afe9fced03288884e9d302d1e65b2d";s:4:"name";s:25:"tests/test_Bug_13962.phpt";s:4:"role";s:4:"test";}}i:27;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"89bf87e798f4a149a150d4c2a505f976";s:4:"name";s:25:"tests/test_Bug_14529.phpt";s:4:"role";s:4:"test";}}i:28;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"5f9100adb1c609110ed495fafa819975";s:4:"name";s:25:"tests/test_Bug_14779.phpt";s:4:"role";s:4:"test";}}i:29;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"45eb42fe4e325da64f1ae8f149e2a396";s:4:"name";s:25:"tests/test_Bug_14780.phpt";s:4:"role";s:4:"test";}}i:30;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"609dad2083c54ba56ea691c488ca20e2";s:4:"name";s:25:"tests/test_Bug_15320.phpt";s:4:"role";s:4:"test";}}i:31;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f4ef08e416e775558e8075b531bbc814";s:4:"name";s:25:"tests/test_Bug_16539.phpt";s:4:"role";s:4:"test";}}i:32;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ed1bd0fc9067b3fb8b95808bfa315916";s:4:"name";s:25:"tests/test_Bug_17025.phpt";s:4:"role";s:4:"test";}}i:33;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8a37de74fb39fed4566617a7ea38bb69";s:4:"name";s:25:"tests/test_Bug_17175.phpt";s:4:"role";s:4:"test";}}i:34;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b9dee3c7c45d8c6c22f860e93c3769b9";s:4:"name";s:25:"tests/test_Bug_18083.phpt";s:4:"role";s:4:"test";}}i:35;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"96ce23ad1a1d6417facfcdd2baa9c8eb";s:4:"name";s:25:"tests/test_Bug_18772.phpt";s:4:"role";s:4:"test";}}i:36;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"dd98307b3224b173f7b54f7e403865a4";s:4:"name";s:25:"tests/test_Bug_19497.phpt";s:4:"role";s:4:"test";}}i:37;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"e1194180cb6a218fab69db90f88d1cb2";s:4:"name";s:25:"tests/test_Bug_20226.phpt";s:4:"role";s:4:"test";}}i:38;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"1b7919174edcd1cf5d5fd5a622fdac9b";s:4:"name";s:25:"tests/test_Bug_20273.phpt";s:4:"role";s:4:"test";}}i:39;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"6513c4b0c9e962c900d020124752333e";s:4:"name";s:25:"tests/test_Bug_20563.phpt";s:4:"role";s:4:"test";}}i:40;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"7c7a00818cb0f01fa6c52c920b9e76c6";s:4:"name";s:25:"tests/test_Bug_20564.phpt";s:4:"role";s:4:"test";}}i:41;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b9e31a9c24b05dfb6166512e04e2f056";s:4:"name";s:25:"tests/test_Bug_21027.phpt";s:4:"role";s:4:"test";}}i:42;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b634a5e99aa26a8b6df8fcfae07051b4";s:4:"name";s:25:"tests/test_Bug_21098.phpt";s:4:"role";s:4:"test";}}i:43;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b21be5b099a69428bd37e60589cdd485";s:4:"name";s:25:"tests/test_Bug_21205.phpt";s:4:"role";s:4:"test";}}i:44;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"bc152c12839964fba15da5673d25c4db";s:4:"name";s:25:"tests/test_Bug_21206.phpt";s:4:"role";s:4:"test";}}i:45;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ccf732525be42c955eea18e78490c3e1";s:4:"name";s:25:"tests/test_Bug_21255.phpt";s:4:"role";s:4:"test";}}i:46;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"579f1e11da6c8074dbf508dc1f1dedfa";s:4:"name";s:24:"tests/test_Bug_GH16.phpt";s:4:"role";s:4:"test";}}i:47;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"df32d66d9fccf7a0956422811283272a";s:4:"name";s:24:"tests/test_Bug_GH19.phpt";s:4:"role";s:4:"test";}}i:48;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b7b5b5bacc6a599cfaece35ad202ad1a";s:4:"name";s:24:"tests/test_Bug_GH26.phpt";s:4:"role";s:4:"test";}}i:49;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"e08958f1bb60561f072a3508b8fd3e2e";s:4:"name";s:29:"tests/test_linebreak_dot.phpt";s:4:"role";s:4:"test";}}i:50;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8398e9bfea0bc7c4ff0770ae3d6279fe";s:4:"name";s:35:"tests/test_linebreak_larger_76.phpt";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e5c9ac7f32e53afdeafd1a84343a89ae";s:4:"name";s:13:"Mail/mime.php";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"36128789ad1101d39d13b06ca2585576";s:4:"name";s:17:"Mail/mimePart.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.2.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.6.0";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:48:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.0";s:3:"api";s:3:"1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2001-12-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:53:"This is the initial release of the Mime_Mail package.";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.1";s:3:"api";s:3:"1.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-04-03";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:75:"This is a maintenance release with various bugfixes and minor enhancements.";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.2";s:3:"api";s:3:"1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-07-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:180:"* Added header encoding
* Altered mimePart to put boundary parameter on newline
* Changed addFrom() to setFrom()
* Added setSubject()
* Made mimePart inherit crlf setting from mime";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.1";s:3:"api";s:5:"1.2.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-07-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:62:"* License change
* Applied a few changes From Ilia Alshanetsky";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.3.0RC1";s:3:"api";s:8:"1.3.0RC1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-03-20";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:94:"* First release in over 2.5 years (!)
* MANY bugfixes (see the bugtracker)
* added a few tests";}i:5;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-04-01";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:141:"* First (stable) release in over 2.5 years (!)
* MANY bugfixes (see the bugtracker)
* added a few tests
* one small fix after RC1 (bug #3940)";}i:6;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-07-13";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:0:"";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.4.0a1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-03-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:1481:"* Changed License to BSD Style license, as that's what the code was since the beginning [cipri]
* Fix Bug #30: Mail_Mime: _encodeHeaders is not RFC-2047 compliant. [cipri]
* Fix Bug #3513: support of RFC2231 in header fields. [cipri]
* Fix Bug #4696: addAttachment crash [cipri]
* Fix Bug #5333: Only variables should be returned by reference; triggers notices since php 4.4.0 [cipri]
* Fix Bug #7561: Mail_mimePart::_quotedPrintableEncode() misbehavior with mbstring overload [cipri]
* Fix Bug #8223: Incorrectly encoded quoted-printable headers [cipri]
* Fix Bug #8386: HTML body not correctly encoded if attachments present [cipri]
* Fix Bug #8541: mimePart.php line delimiter is \r [cipri]
* Fix Bug #9347: Notices about references [cweiske]
* Fix Bug #9558: Broken multiline headers [cipri]
* Fix Bug #9956: Notices being thrown [cipri]
* Fix Bug #9976: Subject encoded twice [cipri]
* Implement Feature #2952: Mail_mime::headers() saves extra headers [cipri]
* Implement Feature #3636: Allow specification of charsets and encoding [cipri]
* Implement Feature #4057: Mail_Mime: Add name parameter for Content-Type [cipri]
* Implement Feature #4504: addHTMLImage does not work in cases when filename contains a path [cipri]
* Implement Feature #5837: Mail_Mime: Build message for Net_SMTP [cipri]
* Implement Feature #5934: Mail_Mime: choice for content disposition [cipri]
* Implement Feature #6568: Mail_Mime: inline images referenced in CSS definitions not replaced. [cipri]";}i:8;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.4.0a2";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:553:"* Fix Bug #9722: _quotedPrintableEncode does not encode dot at start of line on Windows
  platform [cipri]
* Fix Bug #9725: multipart/related & alternative wrong order [cipri]
* Fix Bug #10146: mbstring fails to recognize encodings. [cipri]
* Fix Bug #10158: Inline images not displayed on Mozilla Thunderbird [cipri]
* Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
* Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
* Fix Bug #10596: Incorrect handling of text and html '0' bodies [cipri]";}i:9;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.4.0a3";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:162:"* Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
* Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]";}i:10;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.4.0RC1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:75:"* Fix Bug #10232: Gmail creates double line break when \r\n is used [cipri]";}i:11;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.4.0RC2";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-22";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:187:"* Fix Bug #10791: Unit tests fail [cipri]
* Fix Bug #10792: No unit tests for recently fixed bugs [cipri]
* Fix Bug #10793: Long headers don't get wrapped since fix for Bug #10298 [cipri]";}i:12;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.4.0RC3";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:65:"* Fix Bug #10816: Unwanted linebreak at the end of output [cipri]";}i:13;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.4.0RC4";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-04-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"bsd style";}s:5:"notes";s:123:"* Fix Bug #3513: support of RFC2231 in header fields. [cipri]
* Fix Bug #10838: bad use of MIME encoding in header. [cipri]";}i:14;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-05-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:3343:"Release notes:
 * No more notices in PHP 5 /4.4.0.
 * Improved inline HTML image function.
 * Improved header encoding with foreign charsets.
 * Improved long header rendering.
 * More control over used Charsets and encoding schemes.
 * More configurable attachments and inline images.
 * Full RFC 2047 Support
 * Full RFC 2231 Support
 * Unit-tests

Fixed bugs:
 * Fix Bug #30: Mail_Mime: _encodeHeaders is not RFC-2047 compliant. [cipri]
 * Fix Bug #3513: support of RFC2231 in header fields. [cipri]
 * Fix Bug #4696: addAttachment crash [cipri]
 * Fix Bug #5333: Only variables should be returned by reference; triggers notices since
   php 4.4.0 [cipri]
 * Fix Bug #5400: Do not return function reference [cipri]
 * Fix Bug #5710: Little reference bugs [cipri]
 * Fix Bug #5890: Only variable references should be returned by reference [cipri]
 * Fix Bug #6260: Just a notice with PHP5 [cipri]
 * Fix Bug #6261: php 5.1.1 upgrade [cipri]
 * Fix Bug #6663: Notice about reference passing [cipri]
 * Fix Bug #7561: Mail_mimePart::_quotedPrintableEncode() misbehavior with mbstring
   overload [cipri]
 * Fix Bug #7713: PHP5 Notice: Only variable references should be returned by reference [cipri]
 * Fix Bug #8223: Incorrectly encoded quoted-printable headers [cipri]
 * Fix Bug #8386: HTML body not correctly encoded if attachments present [cipri]
 * Fix Bug #8541: mimePart.php line delimiter is \r [cipri]
 * Fix Bug #8812: user header updates overwritten [cipri]
 * Fix Bug #9347: Notices about references [cweiske]
 * Fix Bug #9558: Broken multiline headers [cipri]
 * Fix Bug #9722: _quotedPrintableEncode does not encode dot at start of line on Windows
   platform [cipri]
 * Fix Bug #9725: multipart/related & alternative wrong order [cipri]
 * Fix Bug #9956: Notices being thrown [cipri]
 * Fix Bug #9976: Subject encoded twice [cipri]
 * Fix Bug #10146: mbstring fails to recognize encodings. [cipri]
 * Fix Bug #10158: Inline images not displayed on Mozilla Thunderbird [cipri]
 * Fix Bug #10232: Gmail creates double line break when \r\n is used [cipri]
 * Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
 * Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
 * Fix Bug #10596: Incorrect handling of text and html '0' bodies [cipri]
 * Fix Bug #10791: Unit tests fail [cipri]
 * Fix Bug #10792: No unit tests for recently fixed bugs [cipri]
 * Fix Bug #10793: Long headers don't get wrapped since fix for Bug #10298 [cipri]
 * Fix Bug #10816: Unwanted linebreak at the end of output [cipri]
 * Fix Bug #10838: bad use of MIME encoding in header. [cipri]
Implemented Features:
 * Implement Feature #2952: Mail_mime::headers() saves extra headers [cipri]
 * Implement Feature #3636: Allow specification of charsets and encoding [cipri]
 * Implement Feature #4057: Mail_Mime: Add name parameter for Content-Type [cipri]
 * Implement Feature #4504: addHTMLImage does not work in cases when filename contains a path [cipri]
 * Implement Feature #5837: Mail_Mime: Build message for Net_SMTP [cipri]
 * Implement Feature #5934: Mail_Mime: choice for content disposition [cipri]
 * Implement Feature #6568: Mail_Mime: inline images referenced in CSS definitions not replaced. [cipri]
 * Implement Feature #10604: Put an option to specify Content-Location in the header [cipri]";}i:15;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.5.0a1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:25:"Split off mail_MimeDecode";}i:16;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.5.0RC1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:25:"Split off mail_MimeDecode";}i:17;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.0";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-17";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:25:"Split off Mail_MimeDecode";}i:18;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-20";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:55:"* Fix Bug #11344: Error at line 644 in mime.php [cipri]";}i:19;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.2";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-21";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:107:"* Fix Bug #11381: domain name is attached to content-id, trailing greater-than sign is
  not remove [cipri]";}i:20;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.3";s:3:"api";s:5:"1.3.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-12-29";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:1264:"Fixed bugs:
 * Fix Bug #14678: srand() lowers security [clockwerx]
 * Fix Bug #12921: _file2str not binary safe [walter]
 * Fix Bug #12385: Bad regex when replacing css style attachments [cipri]
 * Fix Bug #16911: Excessive semicolon in MIME header [alec]
 * Fix Bug #15320: Attachment charset is not set in Content-Type header [alec]
 * Fix Bug #16911: Lack of semicolon separator for MIME header parameters [alec]
 * Fix Bug #16846: Use preg_replace_callback() instead of /e modifier [alec]
 * Fix Bug #14779: Problem with an empty attachment [alec]
 * Fix Bug #15913: Optimize the memory used by Mail_mimePart::encode.
                   Avoid having attachments data duplicated in memory [alec]
 * Fix Bug #16539: Headers longer than 998 characters aren't wrapped [alec]
 * Fix Bug #11238: Wrong encoding of structured headers [alec]
 * Fix Bug #13641: iconv_mime_encode() seems to work different/errorious than
                   the build in logic. Removed 'ignore_iconv' param.  [alec]
 * Fix Bug #16706: Incorrect double-quotes RFC 2231-encoded parameter values [alec]
 * Fix Bug #14232: RFC2231: tspecials encoding in _buildHeaderParam() [alec]
Implemented Features:
 * Implement Feature #10438: Function (encodeHeader) for encoding of given header [alec]";}i:21;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.6.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-01-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:540:"Bugs Fixed:
 * Don't break specified headers folding [alec]
 * Bug #17025: Wrong headers() result for long unwrapable header value [alec]

Implemented Features:
 * Allow setting Content-ID for HTML Images [alec]
 * Added one setParam() in place of many set*() functions [alec]
 * Added getParam(), getTXTBody(), getHTMLBody() [alec]
 * Skip RFC2231's charset if filename contains only ASCII characters [alec]
 * Make sure that Received: headers are returned on the top [alec]
 * Added saveMessageBody() and getMessageBody() functions [alec]";}i:22;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.6.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-03-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:262:"Bugs Fixed:
 * Fix encoding of Return-Receipt-To and Disposition-Notification-To headers [alec]

Implemented Features:
 * Implement Feature #12466: Build parameters validation [alec]
 * Implement Feature #17175: Content-Description support for attachments [alec]";}i:23;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.6.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-03-23";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:103:"Bugs Fixed:
 * Fix Bug #17226: Non RFC-compliant quoted-printable encoding of structured headers [alec]";}i:24;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.7.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-04-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:233:"Implemented Features:
 * Added Mail_mime::setContentType() function with possibility to set various
   types in Content-Type header (also fixes problem with boundary parameter when Content-Type
   header was specified by user) [alec]";}i:25;a:5:{s:4:"date";s:10:"2010-07-29";s:7:"version";a:2:{s:7:"release";s:5:"1.8.0";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:314:"Bugs Fixed:
 * Double-addition of e-mail domain to content ID in HTML images [alec]
 * #17311: Multi-octet characters are split across adjacent 'encoded-word's [alec]
 * #17573: Place charset parameter in first line of Content-Type header (if possible) [alec]
Implemented Features:
 * #17518: addTo() method [alec]";}i:26;a:5:{s:4:"date";s:10:"2010-12-01";s:7:"version";a:2:{s:7:"release";s:5:"1.8.1";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:101:"Bugs Fixed:
 * #18083: Not possible to set separate charset for attachment content and headers [alec]";}i:27;a:5:{s:4:"date";s:10:"2011-08-10";s:7:"version";a:2:{s:7:"release";s:5:"1.8.2";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:207:"Bugs Fixed:
 * #18426: Fixed backward compatibility for "dfilename" parameter [alec]
 * Removed xmail.dtd, xmail.xsl from the package [alec]
 * Fixed handling of email addresses with quoted local part [alec]";}i:28;a:5:{s:4:"date";s:10:"2012-03-12";s:7:"version";a:2:{s:7:"release";s:5:"1.8.3";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:232:"* Request #19009: Remove error_reporting from tests [alec]
* Fixed Bug #19094: Email addresses do not have to contain a space between the name and address part [alec]
* Fixed Bug #19328: Wrong encoding of filenames with comma [alec]";}i:29;a:5:{s:4:"date";s:10:"2012-05-17";s:7:"version";a:2:{s:7:"release";s:5:"1.8.4";s:3:"api";s:5:"1.4.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:179:"* Request #19406: Allow to set individual attachment part headers [alec]
* Fixed Bug #18982: Non-static method Mail_mimePart::encodeHeader() should not be called statically [alec]";}i:30;a:5:{s:4:"date";s:10:"2012-06-09";s:7:"version";a:2:{s:7:"release";s:5:"1.8.5";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:198:"* Added possibility to set additional parameters of message part header, e.g. attachment size [alec]
* Added automatic setting of attachment size via Content-Disposition header size parameter [alec]";}i:31;a:5:{s:4:"date";s:10:"2012-10-23";s:7:"version";a:2:{s:7:"release";s:5:"1.8.6";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:235:"* Bug #19473: PEAR::isError() compatibility problem with PHP 5.4 [alec]
* Bug #19497: Attachment filename is cut on slash character [alec]
* Bug #19665: Add Mail-Reply-To and Mail-Followup-To to structured recipient headers list [alec]";}i:32;a:5:{s:4:"date";s:10:"2012-12-25";s:7:"version";a:2:{s:7:"release";s:5:"1.8.7";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:104:"* Bug #5333: Fix more return by reference errors [alec]
* Bug #19754: Fix compatibility with PHP4 [alec]";}i:33;a:5:{s:4:"date";s:10:"2013-07-05";s:7:"version";a:2:{s:7:"release";s:5:"1.8.8";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:294:"* Fixed warning/notice on (static vs. non-static) PEAR::raiseError() usage [alec]
* Fixed Bug #19761: PHP5 warnings about return by reference [alec]
* Fixed Bug #19770: Make cid generator more unique on Windows [alec]
* Fixed Bug #19987: E_STRICT warning when null is passed by reference [alec]";}i:34;a:5:{s:4:"date";s:10:"2014-05-14";s:7:"version";a:2:{s:7:"release";s:5:"1.8.9";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:219:"* Fixed Bug #20273: Incorrect handling of HTAB in encodeHeader() [alec]
* Fixed Bug #20226: Mail_mimePart::encodeHeader does not encode ISO-2022-JP string [alec]
* Fixed Bug #20222: Broken Compatybility with PHP4 [alec]";}i:35;a:6:{s:4:"date";s:10:"2015-07-05";s:4:"time";s:8:"12:50:00";s:7:"version";a:2:{s:7:"release";s:8:"1.9.0RC1";s:3:"api";s:5:"2.0.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:314:"* Drop PHP4 support, Fix warnings on PHP7 [alec]
* Request #20564: Added possibility to unset headers [alec]
* Request #20563: Added isMultipart() method [alec]
* Request #20565: Accept also a file pointer in Mail_mimePart::encodeToFile(),
                  Mail_mime::get() and Mail_mime::saveMessageBody() [alec]";}i:36;a:6:{s:4:"date";s:10:"2015-08-06";s:4:"time";s:8:"12:00:00";s:7:"version";a:2:{s:7:"release";s:5:"1.9.0";s:3:"api";s:5:"1.9.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:200:"* Bug #20921: Make Mail_mimePart::encodeHeaderValue() a static method [alec]
* Bug #20931: Really remove unset headers [alec]
* Request #18772: Added methods for creating text/calendar messages [alec]";}i:37;a:6:{s:4:"date";s:10:"2015-09-13";s:4:"time";s:8:"12:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.0";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:156:"* Add possibility to add externally created Mail_mimePart objects as attachments [alec]
* Add possibility to set preamble text for multipart messages [alec]";}i:38;a:6:{s:4:"date";s:10:"2017-05-21";s:4:"time";s:8:"12:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.1";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:286:"* Fix Bug 21206: explodeQuotedString() does not handle quoted strings correctly [dfukagaw28]
* Fix Bug 21205: Invalid encoding of headers with quoted multibyte strings in non-unicode charset [dfukagaw28]
* Fix Bug 21098: Discrepancy in handling of empty (but set) plain text part [alec]";}i:39;a:6:{s:4:"date";s:10:"2017-11-17";s:4:"time";s:8:"11:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.2";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:115:"* Fix Bug #21255: Boundary gets added twice when using setContentType() [alec]
* PHP 7.2 compatibility fixes [alec]";}i:40;a:6:{s:4:"date";s:10:"2019-09-25";s:4:"time";s:8:"08:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.3";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:78:"* Fix deprecation warning for get_magic_quotes_runtime() use on PHP 7.4 [alec]";}i:41;a:6:{s:4:"date";s:10:"2019-10-13";s:4:"time";s:8:"11:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.4";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:63:"* Fix E_STRICT errors introduced in the previous release [alec]";}i:42;a:6:{s:4:"date";s:10:"2020-01-24";s:4:"time";s:8:"19:00:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.5";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:158:"* Make sure to not set Content-Transfer-Encoding on multipart messages [alec]
* Added support for calendar invitations with attachments/html/images [jacalben]";}i:43;a:6:{s:4:"date";s:10:"2020-01-30";s:4:"time";s:8:"08:25:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.6";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:118:"* Fix different boundary in headers and body when using headers() after get() [alec]
* Removed phail.php script [alec]";}i:44;a:6:{s:4:"date";s:10:"2020-03-01";s:4:"time";s:8:"08:50:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.7";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:84:"* Fix invalid Content-Type for messages with only html part and inline images [alec]";}i:45;a:6:{s:4:"date";s:10:"2020-06-13";s:4:"time";s:8:"08:50:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.8";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:85:"* Fix encoding issues with ISO-2022-JP-MS input labelled with ISO-2022-JP [shirosaki]";}i:46;a:6:{s:4:"date";s:10:"2020-06-27";s:4:"time";s:8:"10:30:00";s:7:"version";a:2:{s:7:"release";s:6:"1.10.9";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:63:"* Added a workaround for an opcache bug on OpenSuse 15.1 [alec]";}i:47;a:6:{s:4:"date";s:10:"2021-01-17";s:4:"time";s:8:"09:25:00";s:7:"version";a:2:{s:7:"release";s:7:"1.10.10";s:3:"api";s:6:"1.10.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:191:"* Compatibility fixes for PHP 5.2 and 5.3 [alec]
* Corrected soft line breaks handling to be RFC compliant [ixs]
* Corrected line breaks for lines ending in dots and length more than 74 [ixs]";}}}s:8:"filelist";a:53:{s:25:"tests/class-filename.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"edd138f6c5497ae2b5d63620a67a931e";s:4:"name";s:25:"tests/class-filename.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/class-filename.phpt";}s:36:"tests/content_transfer_encoding.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"7ec986391d0af058316f66e5a507e059";s:4:"name";s:36:"tests/content_transfer_encoding.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/content_transfer_encoding.phpt";}s:24:"tests/encoding_case.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"c1a43360d9b2cb5f9542503a4355c277";s:4:"name";s:24:"tests/encoding_case.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/encoding_case.phpt";}s:32:"tests/headers_with_mbstring.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"bf50a200190cad5e2d4aae4e120ea09f";s:4:"name";s:32:"tests/headers_with_mbstring.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/headers_with_mbstring.phpt";}s:35:"tests/headers_without_mbstring.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"9a2d207f873317125ff43c092f3f0d25";s:4:"name";s:35:"tests/headers_without_mbstring.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/headers_without_mbstring.phpt";}s:27:"tests/qp_encoding_test.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"25d4c5b9fdeaabc7810c26e6f89e95ca";s:4:"name";s:27:"tests/qp_encoding_test.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/qp_encoding_test.phpt";}s:41:"tests/sleep_wakeup_EOL-bug3488-part1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"958197f31b4a20c91dd42662595e7516";s:4:"name";s:41:"tests/sleep_wakeup_EOL-bug3488-part1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part1.phpt";}s:41:"tests/sleep_wakeup_EOL-bug3488-part2.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"46675529f1f021b51a1aa0ae6c971cd2";s:4:"name";s:41:"tests/sleep_wakeup_EOL-bug3488-part2.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part2.phpt";}s:26:"tests/test_Bug_3513_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f8c05910737e451c7a9d4737b8d9f095";s:4:"name";s:26:"tests/test_Bug_3513_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_3513_1.phpt";}s:26:"tests/test_Bug_3513_2.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"edb467a375ddf09e777a9388e2e8cbb5";s:4:"name";s:26:"tests/test_Bug_3513_2.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_3513_2.phpt";}s:26:"tests/test_Bug_3513_3.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"70c2456445eaaa80779206e9e245d685";s:4:"name";s:26:"tests/test_Bug_3513_3.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_3513_3.phpt";}s:26:"tests/test_Bug_7561_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"4cda500d0d7925e81a299f1d3db132a9";s:4:"name";s:26:"tests/test_Bug_7561_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_7561_1.phpt";}s:26:"tests/test_Bug_8386_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"42a214e7e3d3afa07f8996b235222611";s:4:"name";s:26:"tests/test_Bug_8386_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_8386_1.phpt";}s:26:"tests/test_Bug_8541_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ed78099563499f60386a128cb7b96925";s:4:"name";s:26:"tests/test_Bug_8541_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_8541_1.phpt";}s:26:"tests/test_Bug_9722_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"5250a0693599b945e8642a1a289d7275";s:4:"name";s:26:"tests/test_Bug_9722_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_9722_1.phpt";}s:27:"tests/test_Bug_10596_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b7f58f54e1485c23a60c83cd3cc5563e";s:4:"name";s:27:"tests/test_Bug_10596_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_10596_1.phpt";}s:27:"tests/test_Bug_10816_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ccb53d80e7f5c9f28b11abce5fe5d490";s:4:"name";s:27:"tests/test_Bug_10816_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_10816_1.phpt";}s:27:"tests/test_Bug_10999_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f3d92a1fff099173b8600fb3646d0614";s:4:"name";s:27:"tests/test_Bug_10999_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_10999_1.phpt";}s:25:"tests/test_Bug_11381.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"3f2757d5db43abd8f177f094f4d53625";s:4:"name";s:25:"tests/test_Bug_11381.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_11381.phpt";}s:25:"tests/test_Bug_11731.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"c64d675e73bc02fc94f5d03b3117cfa0";s:4:"name";s:25:"tests/test_Bug_11731.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_11731.phpt";}s:25:"tests/test_Bug_12165.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8c9305ca05f5ed2d7cd7e31e4836f17a";s:4:"name";s:25:"tests/test_Bug_12165.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_12165.phpt";}s:27:"tests/test_Bug_12385_1.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"2aa2c3dfbe44500809e79da994272611";s:4:"name";s:27:"tests/test_Bug_12385_1.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_12385_1.phpt";}s:25:"tests/test_Bug_12411.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ef1d726233dbd3360c540fd6a959b0d0";s:4:"name";s:25:"tests/test_Bug_12411.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_12411.phpt";}s:25:"tests/test_Bug_12466.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"a862a57ff622fcbb2328be6c805e2d05";s:4:"name";s:25:"tests/test_Bug_12466.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_12466.phpt";}s:25:"tests/test_Bug_13032.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"4eddeeac08f351feb147ab6fda439526";s:4:"name";s:25:"tests/test_Bug_13032.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_13032.phpt";}s:25:"tests/test_Bug_13444.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"de15a0657a83694bc6991c4184ccf9bd";s:4:"name";s:25:"tests/test_Bug_13444.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_13444.phpt";}s:25:"tests/test_Bug_13962.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"80afe9fced03288884e9d302d1e65b2d";s:4:"name";s:25:"tests/test_Bug_13962.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_13962.phpt";}s:25:"tests/test_Bug_14529.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"89bf87e798f4a149a150d4c2a505f976";s:4:"name";s:25:"tests/test_Bug_14529.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_14529.phpt";}s:25:"tests/test_Bug_14779.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"5f9100adb1c609110ed495fafa819975";s:4:"name";s:25:"tests/test_Bug_14779.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_14779.phpt";}s:25:"tests/test_Bug_14780.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"45eb42fe4e325da64f1ae8f149e2a396";s:4:"name";s:25:"tests/test_Bug_14780.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_14780.phpt";}s:25:"tests/test_Bug_15320.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"609dad2083c54ba56ea691c488ca20e2";s:4:"name";s:25:"tests/test_Bug_15320.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_15320.phpt";}s:25:"tests/test_Bug_16539.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"f4ef08e416e775558e8075b531bbc814";s:4:"name";s:25:"tests/test_Bug_16539.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_16539.phpt";}s:25:"tests/test_Bug_17025.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ed1bd0fc9067b3fb8b95808bfa315916";s:4:"name";s:25:"tests/test_Bug_17025.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_17025.phpt";}s:25:"tests/test_Bug_17175.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8a37de74fb39fed4566617a7ea38bb69";s:4:"name";s:25:"tests/test_Bug_17175.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_17175.phpt";}s:25:"tests/test_Bug_18083.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b9dee3c7c45d8c6c22f860e93c3769b9";s:4:"name";s:25:"tests/test_Bug_18083.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_18083.phpt";}s:25:"tests/test_Bug_18772.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"96ce23ad1a1d6417facfcdd2baa9c8eb";s:4:"name";s:25:"tests/test_Bug_18772.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_18772.phpt";}s:25:"tests/test_Bug_19497.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"dd98307b3224b173f7b54f7e403865a4";s:4:"name";s:25:"tests/test_Bug_19497.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_19497.phpt";}s:25:"tests/test_Bug_20226.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"e1194180cb6a218fab69db90f88d1cb2";s:4:"name";s:25:"tests/test_Bug_20226.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_20226.phpt";}s:25:"tests/test_Bug_20273.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"1b7919174edcd1cf5d5fd5a622fdac9b";s:4:"name";s:25:"tests/test_Bug_20273.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_20273.phpt";}s:25:"tests/test_Bug_20563.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"6513c4b0c9e962c900d020124752333e";s:4:"name";s:25:"tests/test_Bug_20563.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_20563.phpt";}s:25:"tests/test_Bug_20564.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"7c7a00818cb0f01fa6c52c920b9e76c6";s:4:"name";s:25:"tests/test_Bug_20564.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_20564.phpt";}s:25:"tests/test_Bug_21027.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b9e31a9c24b05dfb6166512e04e2f056";s:4:"name";s:25:"tests/test_Bug_21027.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_21027.phpt";}s:25:"tests/test_Bug_21098.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b634a5e99aa26a8b6df8fcfae07051b4";s:4:"name";s:25:"tests/test_Bug_21098.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_21098.phpt";}s:25:"tests/test_Bug_21205.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b21be5b099a69428bd37e60589cdd485";s:4:"name";s:25:"tests/test_Bug_21205.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_21205.phpt";}s:25:"tests/test_Bug_21206.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"bc152c12839964fba15da5673d25c4db";s:4:"name";s:25:"tests/test_Bug_21206.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_21206.phpt";}s:25:"tests/test_Bug_21255.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"ccf732525be42c955eea18e78490c3e1";s:4:"name";s:25:"tests/test_Bug_21255.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_21255.phpt";}s:24:"tests/test_Bug_GH16.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"579f1e11da6c8074dbf508dc1f1dedfa";s:4:"name";s:24:"tests/test_Bug_GH16.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_GH16.phpt";}s:24:"tests/test_Bug_GH19.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"df32d66d9fccf7a0956422811283272a";s:4:"name";s:24:"tests/test_Bug_GH19.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_GH19.phpt";}s:24:"tests/test_Bug_GH26.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"b7b5b5bacc6a599cfaece35ad202ad1a";s:4:"name";s:24:"tests/test_Bug_GH26.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_Bug_GH26.phpt";}s:29:"tests/test_linebreak_dot.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"e08958f1bb60561f072a3508b8fd3e2e";s:4:"name";s:29:"tests/test_linebreak_dot.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_linebreak_dot.phpt";}s:35:"tests/test_linebreak_larger_76.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"8398e9bfea0bc7c4ff0770ae3d6279fe";s:4:"name";s:35:"tests/test_linebreak_larger_76.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests/test_linebreak_larger_76.phpt";}s:13:"Mail/mime.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e5c9ac7f32e53afdeafd1a84343a89ae";s:4:"name";s:13:"Mail/mime.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php54/usr/share/pear/Mail/mime.php";}s:17:"Mail/mimePart.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"36128789ad1101d39d13b06ca2585576";s:4:"name";s:17:"Mail/mimePart.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php54/usr/share/pear/Mail/mimePart.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:50:"/opt/alt/php54/usr/share/pear/test/Mail_Mime/tests";b:1;s:44:"/opt/alt/php54/usr/share/pear/test/Mail_Mime";b:1;s:34:"/opt/alt/php54/usr/share/pear/Mail";b:1;}s:3:"old";a:7:{s:7:"version";s:7:"1.10.11";s:12:"release_date";s:10:"2021-09-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:9:"BSD Style";s:13:"release_notes";s:246:"* Fix PHP 8.1: strlen(): Passing null to parameter #1 ($string) of type string is deprecated [alec]
* Fix encoding recipient names with @ character and no space between name and address [alec]
* Fix the license label in composer.json [jnkowa-gfk]";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.2.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.6.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:2:{i:0;a:5:{s:4:"name";s:19:"Cipriano Groenendal";s:5:"email";s:13:"cipri@php.net";s:6:"active";s:2:"no";s:6:"handle";s:5:"cipri";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:19:"Aleksander Machniak";s:5:"email";s:12:"alec@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:4:"alec";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506497;}PK�^�\g�k1{1{pear/.registry/xml_rpc.regnu�[���a:23:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:7:"XML_RPC";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:42:"PHP implementation of the XML-RPC protocol";s:11:"description";s:123:"A PEAR-ified version of Useful Inc's XML-RPC for PHP.

It has support for HTTP/HTTPS transport, proxies and authentication.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:11:"Stig Bakken";s:4:"user";s:3:"ssb";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:16:"Daniel Convissor";s:4:"user";s:7:"danielc";s:5:"email";s:15:"danielc@php.net";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2011-08-27";s:4:"time";s:8:"01:36:28";s:7:"version";a:2:{s:7:"release";s:5:"1.5.5";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:92:"* Adjust is_a() usage due to change in PHP 5.3.7.
* Fix error populating headers. Bug 18653.";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:12:{i:0;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"41158fbcb2d49755fdaf877f92e85362";s:4:"name";s:24:"tests/actual-request.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e9a0aa974052ee47c41ad0274c728dc6";s:4:"name";s:16:"tests/allgot.inc";s:4:"role";s:4:"test";}}i:2;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"60cd6342dd96bf0be4d4d3cbb7813cf4";s:4:"name";s:28:"tests/empty-value-struct.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:3;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2bdf63e6eba97ea12ac4f5a3a92fdc3a";s:4:"name";s:21:"tests/empty-value.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:4;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"94ab1218006a7dc8fdd362dffc48777f";s:4:"name";s:16:"tests/encode.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:5;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"74921ba059a82e2ec9c7734c187a3f2c";s:4:"name";s:21:"tests/extra-lines.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:6;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3e200b7a09217395196987f1e948871a";s:4:"name";s:19:"tests/protoport.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:7;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f3af6b2112368d543f80907f1b040b77";s:4:"name";s:19:"tests/test_Dump.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:8;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6fb82404a22f0e751697c8ffe0557a6a";s:4:"name";s:15:"tests/types.php";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b361011f028738d20e8905cfa2fcefc5";s:4:"name";s:11:"XML/RPC.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2036a5c5c6e965b93533cd050442fa98";s:4:"name";s:16:"XML/RPC/Dump.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8a0123129ef7eb5615505b95d0f0b72f";s:4:"name";s:18:"XML/RPC/Server.php";s:4:"role";s:3:"php";}}}}}s:10:"compatible";a:4:{s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:7:"1.4.0a1";s:3:"max";s:5:"1.4.9";}s:12:"dependencies";a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"4.2.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:7:"1.4.0a1";}s:9:"extension";a:1:{s:4:"name";s:3:"xml";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:39:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.1";s:3:"api";s:5:"1.0.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2001-09-25";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:132:"This is a PEAR-ified version of Useful Inc's 1.0.1 release.
Includes an urgent security fix identified by Dan Libby <dan@libby.com>.";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.2";s:3:"api";s:5:"1.0.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-04-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:48:"* E_ALL fixes
* fix HTTP response header parsing";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.3";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-05-19";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:51:"* fix bug when parsing responses with boolean types";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.4";s:3:"api";s:5:"1.0.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-10-02";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:68:"* added HTTP proxy authorization support (thanks to Arnaud Limbourg)";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-03-15";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:517:"* Added support for sequential arrays to XML_RPC_encode() (mroch)
* Cleaned up new XML_RPC_encode() changes a bit (mroch, pierre)
* Remove "require_once 'PEAR.php'", include only when needed to raise an error
* Replace echo and error_log() with raiseError() (mroch)
* Make all classes extend XML_RPC_Base, which will handle common functions  (mroch)
* be tolerant of junk after methodResponse (Luca Mariano, mroch)
* Silent notice even in the error log (pierre)
* fix include of shared xml extension on win32 (pierre)";}i:5;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC1";s:3:"api";s:8:"1.2.0RC1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2004-12-30";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:1187:"* Make things work with SSL.  Bug 2489.  (nkukard lbsd net)
* Allow array function callbacks (Matt Kane)
* Some minor speed-ups (Matt Kane)
* Add Dump.php to the package (Christian Weiske)
* Replace all line endings with \r\n.  Had only done replacements on \n.  Bug 2521.  (danielc)
* Silence fsockopen() errors.  Bug 1714.  (danielc)
* Encode empty arrays as an array. Bug 1493.  (danielc)
* Eliminate undefined index notice when submitting empty arrays to XML_RPC_Encode().  Bug 1819.  (danielc)
* Speed up check for enumerated arrays in XML_RPC_Encode().  (danielc)
* Prepend "XML_RPC_" to ERROR_NON_NUMERIC_FOUND, eliminating problem when eval()'ing error messages.  (danielc)
* Use XML_RPC_Base::raiseError() instead of PEAR::raiseError() in XML_RPC_ee() because PEAR.php is lazy loaded.  (danielc)
* Allow raiseError() to be called statically.  (danielc)
* Stop double escaping of character entities.  Bug 987.  (danielc)
  NOTICE: the following have been removed:
    * XML_RPC_dh()
    * $GLOBALS['XML_RPC_entities']
    * XML_RPC_entity_decode()
    * XML_RPC_lookup_entity()
* Determine the XML's encoding via the encoding attribute in the XML declaration.  Bug 52.  (danielc)";}i:6;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC2";s:3:"api";s:8:"1.2.0RC2";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-01-11";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:162:"* Handle ssl:// in the $server string.  (danielc)
* Also default to port 445 for ssl:// requests as well.  (danielc)
* Enhance debugging in the server.  (danielc)";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC3";s:3:"api";s:8:"1.2.0RC3";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-01-19";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:29:"* ssl uses port 443, not 445.";}i:8;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC4";s:3:"api";s:8:"1.2.0RC4";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-01-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:388:"* When a connection attempt fails, have the method return 0.  (danielc)
* Move the protocol/port checking/switching and the property settings from sendPayloadHTTP10() to the XML_RPC_Client constructor.  (danielc)
* Add tests for setting the client properties.  (danielc)
* Remove $GLOBALS['XML_RPC_twoslash'] since it's not used.  (danielc)
* Bundle the tests with the package.  (danielc)";}i:9;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC5";s:3:"api";s:8:"1.2.0RC5";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-01-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:91:"* If $port is 443 but a protocol isn't specified in $server, assume ssl:// is the protocol.";}i:10;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC6";s:3:"api";s:8:"1.2.0RC6";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-01-25";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:71:"* Don't put the protocol in the Host field of the POST data.  (danielc)";}i:11;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC7";s:3:"api";s:8:"1.2.0RC7";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-02-22";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:346:"* Add the setSendEncoding() method and $send_encoding
  property to XML_RPC_Message.  Request 3537.
* Allow class methods to be mapped using either syntax:
     'function' => 'hello::sayHello',
     or
     'function' => array('hello', 'sayhello'),
  Bug 3363.
* Use 8192 instead of 32768 for bytes in fread()
  in parseResponseFile().  Bug 3340.";}i:12;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.0";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-02-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:160:"* Provide the "stable" release.
* Add package2.xml for compatibility with PEAR 1.4.0.
* For changes since 1.1.0, see the changelogs for the various RC releases.";}i:13;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-03-01";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:65:"* Add isset() check before examining the dispatch map.  Bug 3658.";}i:14;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.2";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-03-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:122:"* When using a proxy, add the protocol to the Request-URI, making it an "absoluteURI" as per the HTTP 1.0 spec.  Bug 3679.";}i:15;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.3.0RC1";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-04-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:818:"* Improve timeout handling for situations where connection to server is made but no response is not received in time. Accomplished via stream_set_timeout().  Request 3963.
* Add Fault Code 6: "The requested method didn't return an XML_RPC_Response object."  Request 4032.
* Add the createServerPayload() and createServerHeaders() methods and the $server_payload and $server_headers properties.  Request 3121.
* As in earlier versions, if the $serviceNow parameter to XML_RPC_Server() is 0, no data will be returned, but now the new $server_payload and $server_headers properties will be set.
* Convert the parser handle to an integer before using it as an index for $XML_RPC_xh[$parser].  Reduces E_STRICT notices.  Bug 3782.
* Add createHeaders() method and $headers property to XML_RPC_Client to make testing easier.";}i:16;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.3.0RC2";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2005-05-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:383:"* If XML_RPC_Message::getParam() is given an incorrect parameter, raise an error with the new XML_RPC_ERROR_INCORRECT_PARAMS code and return FALSE.
* Handle improper requests to XML_RPC_Server::verifySignature().  Bug 4231.
* Try to allow HTTP 100 responses if followed by a 200 response.  Bug 4116.
* Help Delphi users by making RPCMETHODNAME an alias for METHODNAME.  Request 4205.";}i:17;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.3.0RC3";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-05-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:724:"* When verifying requests against function signatures, if the number of parameters don't match, provide an appropriate message.  NOTE: this resolves a path disclosure vulnerability.  (Refines the changes made in the last commit.)  Bug 4231.
* XML_RPC_Message::getParam() now returns an XML_RPC_Response object upon error.  Changed from Release 1.3.0RC2.
* Add the XML_RPC_Value::isValue() method. For testing if an item is an XML_RPC_Value object.
* If XML_RPC_Client::send() is given an incorrect $msg parameter, raise an error with the new XML_RPC_ERROR_PROGRAMMING code and return 0.
* Improve cross-platform operation by using PEAR::loadExtension() instead of dl().
* Use <br /> instead of <br> in XML_RPC_Value::dump().";}i:18;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-06-13";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:64:"* Stable release.  See earlier releases for changes since 1.2.2.";}i:19;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.1";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-06-29";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:42:"* Security fix. Update highly recommended!";}i:20;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.2";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-07-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:584:"* Eliminate path disclosure vulnerabilities by suppressing error messages when eval()'ing.
* Eliminate path disclosure vulnerability by catching bogus parameters submitted to XML_RPC_Value::serializeval().
* In XML_RPC_Server::service(), only call createServerPayload() and createServerHeaders() if necessary.  Fixes compatibility issue introduced in Release 1.3.0RC1 for users who set the $serviceNow parameter of XML_RPC_Server() to 0.  Bug 4757.
* Change "var $errstring" to "var $errstr".  Bug 4582.  Was put into CVS version 1.75 of RPC.php but didn't make it into RELEASE_1_3_1.";}i:21;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.3";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-07-15";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:220:"* Eliminate memory leak by resetting $XML_RPC_xh each time parseResponse() is called.  Bug 4780.
* Using socket_set_timeout() because stream_set_timeout() was introduced in 4.3.0, but we need to support 4.2.0.  Bug 4805.";}i:22;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-08-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:171:"* MAJOR SECURITY FIX: eliminate use of eval().
* Using socket_get_status() because stream_get_meta_data() was introduced in 4.3.0, but we need to support 4.2.0.  Bug 4805.";}i:23;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-09-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:158:"* Don't add debug info unless debug is on.  Bug 5136.
* Use is_a() instead of class_name() so people can use their own XML_RPC_Message objects.  Request 5002.";}i:24;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-09-18";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:53:"* Allow empty <value>'s without <types>'s.  Bug 5315.";}i:25;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-09-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:72:"* Make XML_RPC_encode() properly handle dateTime.iso8601.  Request 5117.";}i:26;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.4";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-10-15";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:46:"* Properly deal with empty values in struct's.";}i:27;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.5";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-01-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:114:"* Have server send headers individualy as opposed to sending them all at once. Necessary due to changes PHP 4.4.2.";}i:28;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.6";s:3:"api";s:5:"1.4.6";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-04-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:209:"* Add XML_RPC_Message::$remove_extra_lines property. Defaults to true. If set to false, extra lines are left in place. Bug 7088.
* Add XML_RPC_Message::$response_payload property. Makes logging responses easy.";}i:29;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.7";s:3:"api";s:5:"1.4.6";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-04-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:132:"* Add include_once for PEAR if need to load xml extension.  Bug 7358.
* Add dependency for xml extension in package file.  Bug 7358.";}i:30;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.8";s:3:"api";s:5:"1.4.6";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-04-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:34:"http://www.php.net/license/3_0.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:129:"* Characters other than alpha-numeric, punctuation, SP, TAB, LF and CR break the XML parser, encode value via Base 64.  Bug 7376.";}i:31;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.5.0RC1";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2006-06-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:749:"* Provide complete multi-byte string support for systems with the mbstring extension enabled. Bug 7837.
* If PHP's mbstring extension is enabled, use mb_convert_encoding() to ensure the client payload matches the intended encoding. This is a better resolution of Bug 7376.
* Turn off the default of automatically base64 encoding strings that can generate fatal errors in PHP's SAX parser. The automatic base64 encoding can be turned on via the new XML_RPC_Client::setAutoBase64() method. The auto-encoding is a workaround for systems that don't have PHP's mbstring extension available. (The automatic base64 encoding was added in the prior release, 1.4.8, and caused problems for users who don't control the receiving end of the requests.) Bug 7837.";}i:32;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.5.0RC2";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2006-06-21";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:127:"* If PHP's mbstring extension is enabled, use mb_convert_encoding() to ensure the server payload matches the intended encoding.";}i:33;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.0";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-07-11";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:134:"No changes from 1.5.0RC2.

The primary change from 1.4.8 is improved multi-byte support.  See the change log for complete information.";}i:34;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.1";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-10-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:280:"* Turn passing payload through mb_convert_encoding() off by default.  Use new XML_RPC_Message::setConvertPayloadEncoding() and XML_RPC_Server::setConvertPayloadEncoding() to turn it on.  Bug 8632.
* Have XML_RPC_Value::scalarval() return FALSE if value is not a scalar.  Bug 8251.";}i:35;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.2";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-08-18";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:64:"* Change license in empty-value-struct.php from PHP 3.0 to 3.01.";}i:36;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.3";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-01-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:242:"* Make licenses consistent.  Bug 12575.
* Fix serializedata() for non-sequentially indexed arrays.  Bug 16780.
* Show request information in debug mode.  Request 8240.
* Creating the payload before opening a socket connection.  Request 11981.";}i:37;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.4";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-07-03";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:209:"* Change ereg functions to preg due to deprecation (Request 17546 and then some.)
* Fix bugs in XML_RPC_Dump error detection process.
* Escape XML special characters in key names of struct elements. Bug 17368.";}i:38;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.5";s:3:"api";s:5:"1.5.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-08-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:35:"http://www.php.net/license/3_01.txt";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:92:"* Adjust is_a() usage due to change in PHP 5.3.7.
* Fix error populating headers. Bug 18653.";}}}s:8:"filelist";a:12:{s:24:"tests/actual-request.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"41158fbcb2d49755fdaf877f92e85362";s:4:"name";s:24:"tests/actual-request.php";s:4:"role";s:4:"test";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/test/XML_RPC/tests/actual-request.php";}s:16:"tests/allgot.inc";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e9a0aa974052ee47c41ad0274c728dc6";s:4:"name";s:16:"tests/allgot.inc";s:4:"role";s:4:"test";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/pear/test/XML_RPC/tests/allgot.inc";}s:28:"tests/empty-value-struct.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"60cd6342dd96bf0be4d4d3cbb7813cf4";s:4:"name";s:28:"tests/empty-value-struct.php";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/test/XML_RPC/tests/empty-value-struct.php";}s:21:"tests/empty-value.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2bdf63e6eba97ea12ac4f5a3a92fdc3a";s:4:"name";s:21:"tests/empty-value.php";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/test/XML_RPC/tests/empty-value.php";}s:16:"tests/encode.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"94ab1218006a7dc8fdd362dffc48777f";s:4:"name";s:16:"tests/encode.php";s:4:"role";s:4:"test";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/pear/test/XML_RPC/tests/encode.php";}s:21:"tests/extra-lines.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"74921ba059a82e2ec9c7734c187a3f2c";s:4:"name";s:21:"tests/extra-lines.php";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/test/XML_RPC/tests/extra-lines.php";}s:19:"tests/protoport.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3e200b7a09217395196987f1e948871a";s:4:"name";s:19:"tests/protoport.php";s:4:"role";s:4:"test";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/test/XML_RPC/tests/protoport.php";}s:19:"tests/test_Dump.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f3af6b2112368d543f80907f1b040b77";s:4:"name";s:19:"tests/test_Dump.php";s:4:"role";s:4:"test";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/test/XML_RPC/tests/test_Dump.php";}s:15:"tests/types.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6fb82404a22f0e751697c8ffe0557a6a";s:4:"name";s:15:"tests/types.php";s:4:"role";s:4:"test";s:12:"installed_as";s:58:"/opt/alt/php54/usr/share/pear/test/XML_RPC/tests/types.php";}s:11:"XML/RPC.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b361011f028738d20e8905cfa2fcefc5";s:4:"name";s:11:"XML/RPC.php";s:4:"role";s:3:"php";s:12:"installed_as";s:41:"/opt/alt/php54/usr/share/pear/XML/RPC.php";}s:16:"XML/RPC/Dump.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2036a5c5c6e965b93533cd050442fa98";s:4:"name";s:16:"XML/RPC/Dump.php";s:4:"role";s:3:"php";s:12:"installed_as";s:46:"/opt/alt/php54/usr/share/pear/XML/RPC/Dump.php";}s:18:"XML/RPC/Server.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8a0123129ef7eb5615505b95d0f0b72f";s:4:"name";s:18:"XML/RPC/Server.php";s:4:"role";s:3:"php";s:12:"installed_as";s:48:"/opt/alt/php54/usr/share/pear/XML/RPC/Server.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:4:{s:48:"/opt/alt/php54/usr/share/pear/test/XML_RPC/tests";b:1;s:42:"/opt/alt/php54/usr/share/pear/test/XML_RPC";b:1;s:33:"/opt/alt/php54/usr/share/pear/XML";b:1;s:37:"/opt/alt/php54/usr/share/pear/XML/RPC";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.5.5";s:12:"release_date";s:10:"2011-08-27";s:13:"release_state";s:6:"stable";s:15:"release_license";s:11:"PHP License";s:13:"release_notes";s:92:"* Adjust is_a() usage due to change in PHP 5.3.7.
* Fix error populating headers. Bug 18653.";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"4.2.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:7:"1.4.0a1";s:8:"optional";s:2:"no";}i:2;a:4:{s:4:"type";s:3:"ext";s:4:"name";s:3:"xml";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:2:{i:0;a:5:{s:4:"name";s:11:"Stig Bakken";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";s:6:"handle";s:3:"ssb";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:16:"Daniel Convissor";s:5:"email";s:15:"danielc@php.net";s:6:"active";s:2:"no";s:6:"handle";s:7:"danielc";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747067531;}PK�^�\ӫ	S)S)pear/.registry/mail.regnu�[���a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.3";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:4:"Mail";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:58:"Class that provides multiple interfaces for sending emails";s:11:"description";s:337:"PEAR's Mail package defines an interface for implementing mailers under the PEAR hierarchy.  It also provides supporting functions useful to multiple mailer backends.  Currently supported backends include: PHP's native mail() function, sendmail, and SMTP.  This package also provides a RFC822 email address list validation utility class.";s:4:"lead";a:4:{s:4:"name";s:15:"Chuck Hagenbuch";s:4:"user";s:8:"chagenbu";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:2:"no";}s:9:"developer";a:2:{i:0;a:4:{s:4:"name";s:13:"Richard Heyes";s:4:"user";s:7:"richard";s:5:"email";s:19:"richard@phpguru.org";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:19:"Aleksander Machniak";s:4:"user";s:4:"alec";s:5:"email";s:12:"alec@alec.pl";s:6:"active";s:3:"yes";}}s:4:"date";s:10:"2017-04-11";s:4:"time";s:8:"17:26:44";s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:44:"https://opensource.org/licenses/BSD-3-Clause";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:177:"* Loosen recognition of "queued as" server response (PR #10)

* Bug #20463: domain-literal parsing error
* Bug #20513: Mail_smtp::send() doesn't close socket for smtp connection";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:16:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8210c33901d415a2692944291632bf34";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4e86cd3b980f73ef320988a1b299ee07";s:4:"name";s:13:"Mail/mail.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"360b7b613c98c7703151c50a6e74c367";s:4:"name";s:13:"Mail/mock.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"30ce63a4a2c4558b3752b1c302e6e508";s:4:"name";s:13:"Mail/null.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7199f4e7b07919082a804edb8680c811";s:4:"name";s:15:"Mail/RFC822.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5dd0b6ff126608818f44f5866b61b3d0";s:4:"name";s:17:"Mail/sendmail.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1d236356d52f3dfa13b740a48a821586";s:4:"name";s:13:"Mail/smtp.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"853b55cf4803df8caaaa0dca363971ff";s:4:"name";s:15:"Mail/smtpmx.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3077f0c01f72cc29a6f8f0175e7fc8a7";s:4:"name";s:8:"Mail.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d66aa2a2f0bfe33f8a67d749a1a4d345";s:4:"name";s:15:"tests/9137.phpt";s:4:"role";s:4:"test";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"75d10361f686f1cc16637a9364e3eab7";s:4:"name";s:17:"tests/9137_2.phpt";s:4:"role";s:4:"test";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"63715aad2b5b3ae35c6b05acf04d9ad7";s:4:"name";s:16:"tests/13659.phpt";s:4:"role";s:4:"test";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e99f00d8f07232e0f129dd77ae9699c7";s:4:"name";s:19:"tests/bug17178.phpt";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c2036980390981cd6b89c1e5c903913e";s:4:"name";s:19:"tests/bug17317.phpt";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7b0eae971fe7595e7c1a563fbfcfee90";s:4:"name";s:17:"tests/rfc822.phpt";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"67becdb1027cefcb8dff1b691da630ab";s:4:"name";s:21:"tests/smtp_error.phpt";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.2.1";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.5.6";}}s:8:"optional";a:1:{s:7:"package";a:3:{s:4:"name";s:8:"Net_SMTP";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.1";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:16:{s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8210c33901d415a2692944291632bf34";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:46:"/opt/alt/php54/usr/share/doc/pear/Mail/LICENSE";}s:13:"Mail/mail.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4e86cd3b980f73ef320988a1b299ee07";s:4:"name";s:13:"Mail/mail.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php54/usr/share/pear/Mail/mail.php";}s:13:"Mail/mock.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"360b7b613c98c7703151c50a6e74c367";s:4:"name";s:13:"Mail/mock.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php54/usr/share/pear/Mail/mock.php";}s:13:"Mail/null.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"30ce63a4a2c4558b3752b1c302e6e508";s:4:"name";s:13:"Mail/null.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php54/usr/share/pear/Mail/null.php";}s:15:"Mail/RFC822.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7199f4e7b07919082a804edb8680c811";s:4:"name";s:15:"Mail/RFC822.php";s:4:"role";s:3:"php";s:12:"installed_as";s:45:"/opt/alt/php54/usr/share/pear/Mail/RFC822.php";}s:17:"Mail/sendmail.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5dd0b6ff126608818f44f5866b61b3d0";s:4:"name";s:17:"Mail/sendmail.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php54/usr/share/pear/Mail/sendmail.php";}s:13:"Mail/smtp.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1d236356d52f3dfa13b740a48a821586";s:4:"name";s:13:"Mail/smtp.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php54/usr/share/pear/Mail/smtp.php";}s:15:"Mail/smtpmx.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"853b55cf4803df8caaaa0dca363971ff";s:4:"name";s:15:"Mail/smtpmx.php";s:4:"role";s:3:"php";s:12:"installed_as";s:45:"/opt/alt/php54/usr/share/pear/Mail/smtpmx.php";}s:8:"Mail.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3077f0c01f72cc29a6f8f0175e7fc8a7";s:4:"name";s:8:"Mail.php";s:4:"role";s:3:"php";s:12:"installed_as";s:38:"/opt/alt/php54/usr/share/pear/Mail.php";}s:15:"tests/9137.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d66aa2a2f0bfe33f8a67d749a1a4d345";s:4:"name";s:15:"tests/9137.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:55:"/opt/alt/php54/usr/share/pear/test/Mail/tests/9137.phpt";}s:17:"tests/9137_2.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"75d10361f686f1cc16637a9364e3eab7";s:4:"name";s:17:"tests/9137_2.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/test/Mail/tests/9137_2.phpt";}s:16:"tests/13659.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"63715aad2b5b3ae35c6b05acf04d9ad7";s:4:"name";s:16:"tests/13659.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:56:"/opt/alt/php54/usr/share/pear/test/Mail/tests/13659.phpt";}s:19:"tests/bug17178.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e99f00d8f07232e0f129dd77ae9699c7";s:4:"name";s:19:"tests/bug17178.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/pear/test/Mail/tests/bug17178.phpt";}s:19:"tests/bug17317.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c2036980390981cd6b89c1e5c903913e";s:4:"name";s:19:"tests/bug17317.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/pear/test/Mail/tests/bug17317.phpt";}s:17:"tests/rfc822.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7b0eae971fe7595e7c1a563fbfcfee90";s:4:"name";s:17:"tests/rfc822.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/test/Mail/tests/rfc822.phpt";}s:21:"tests/smtp_error.phpt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"67becdb1027cefcb8dff1b691da630ab";s:4:"name";s:21:"tests/smtp_error.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/test/Mail/tests/smtp_error.phpt";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:38:"/opt/alt/php54/usr/share/doc/pear/Mail";b:1;s:34:"/opt/alt/php54/usr/share/pear/Mail";b:1;s:29:"/opt/alt/php54/usr/share/pear";b:1;s:45:"/opt/alt/php54/usr/share/pear/test/Mail/tests";b:1;s:39:"/opt/alt/php54/usr/share/pear/test/Mail";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.4.1";s:12:"release_date";s:10:"2017-04-11";s:13:"release_state";s:6:"stable";s:15:"release_license";s:15:"New BSD License";s:13:"release_notes";s:177:"* Loosen recognition of "queued as" server response (PR #10)

* Bug #20463: domain-literal parsing error
* Bug #20513: Mail_smtp::send() doesn't close socket for smtp connection";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.2.1";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.5.6";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:8:"Net_SMTP";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.1";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:15:"Chuck Hagenbuch";s:5:"email";s:15:"chuck@horde.org";s:6:"active";s:2:"no";s:6:"handle";s:8:"chagenbu";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:13:"Richard Heyes";s:5:"email";s:19:"richard@phpguru.org";s:6:"active";s:2:"no";s:6:"handle";s:7:"richard";s:4:"role";s:9:"developer";}i:2;a:5:{s:4:"name";s:19:"Aleksander Machniak";s:5:"email";s:12:"alec@alec.pl";s:6:"active";s:3:"yes";s:6:"handle";s:4:"alec";s:4:"role";s:9:"developer";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506497;}PK�^�\���:+:+"pear/.registry/mail_mimedecode.regnu�[���a:23:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.1";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:160:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd      http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:15:"Mail_mimeDecode";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:41:"Provides a class to decode mime messages.";s:11:"description";s:157:"Provides a class to deal with the decoding and interpreting of mime messages.
 This package used to be part of the Mail_Mime package, but has been split off.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:19:"Cipriano Groenendal";s:4:"user";s:5:"cipri";s:5:"email";s:13:"cipri@php.net";s:6:"active";s:3:"yes";}i:1;a:4:{s:4:"name";s:12:"Alan Knowles";s:4:"user";s:6:"alan_k";s:5:"email";s:17:"alan@akbkhome.com";s:6:"active";s:3:"yes";}}s:9:"developer";a:4:{s:4:"name";s:19:"George Schlossnagle";s:4:"user";s:13:"gschlossnagle";s:5:"email";s:17:"george@omniti.com";s:6:"active";s:2:"no";}s:4:"date";s:10:"2016-08-29";s:4:"time";s:8:"03:04:25";s:7:"version";a:2:{s:7:"release";s:5:"1.5.6";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:245:"Minor Bug fix release.
    #20431 - support for android
    #19762 - multipart signed not split correctly on line breaks
    #20027 - replace /e with preg_replace_callback
    #19762 - multipart/signed eating of new line, and expose sig_hdr etc.";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:5:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"05c45d0b58718ebe73860ebfe494dcef";s:4:"name";s:19:"Mail/mimeDecode.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"642acc06cdb217b6e64506182449d8f8";s:4:"name";s:29:"tests/parse_header_value.phpt";s:4:"role";s:4:"test";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"a0bc0c9b68e62a19202bd8fb26104f3c";s:4:"name";s:41:"tests/semicolon_content_type_bug1724.phpt";s:4:"role";s:4:"test";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"194810c478066eaeb28f51116b88e25a";s:4:"name";s:9:"xmail.dtd";s:4:"role";s:4:"data";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"61cea06fb6b4bd3a4b5e2d37384e14a9";s:4:"name";s:9:"xmail.xsl";s:4:"role";s:4:"data";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"4.3.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.6.0";}s:7:"package";a:4:{s:4:"name";s:9:"Mail_Mime";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";s:7:"exclude";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:8:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.1.0";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:15:"Initial Release";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.0.0RC1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-06-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:15:"Initial Release";}i:2;a:6:{s:4:"date";s:10:"2007-06-17";s:4:"time";s:8:"17:20:44";s:7:"version";a:2:{s:7:"release";s:5:"1.5.0";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:55:"First release of mail_mimeDecode as a seperate package.";}i:3;a:5:{s:4:"date";s:10:"2009-12-03";s:7:"version";a:2:{s:7:"release";s:5:"1.5.1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:245:"Minor Bugfix release.


    Bug Fixes
    #----- - fix bug in getSendArray() - not handling multiple recipents
    #14129 - E_NOTICE fixes

    Requests
    #12365 - Add option to also include raw attached messages patched on the request of till";}i:4;a:5:{s:4:"date";s:10:"2010-09-02";s:7:"version";a:2:{s:7:"release";s:5:"1.5.2";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:271:"Minor Bugfix release.
 
    Bug Fixes
    #4739 - regexp parsing of header values does not balance quoting correctly
           - Fix sponsored by http://webyog.com
    #17325 - empty body messages are valid messages
    #17276 - remove &new usage which throws errors now";}i:5;a:5:{s:4:"date";s:10:"2010-09-05";s:7:"version";a:2:{s:7:"release";s:5:"1.5.3";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:919:"Major Bugfix release.

    Apart from a major cleanout of the bug tracker for this package, this release includes a revamped
    parseHeaderValue which removes the rather flakey regex, with a real parser, which should be considerably more
    robust.
 
    Bug Fixes
        #17844 - all regression tests fixed - remove the last of the while list each() .. this is 2010 ;)...
        #11410 - support wap multipart
        #9616  - long strings as filename etc.. aaa*0=.... aaa*1=.... aaa*2=.... (merged into aaa=.....)
        #9100  - change to preg_split for mime boundary detection , in theory should catch boundaries in nested situations better...
        #7709  - check for last element on boundary split to see if its usable
        #7065  - wrapped header lines with encoding should be concated without spaces
        #6495  - missing body in decoded object
        #11537 - better decode and multi-line support";}i:6;a:5:{s:4:"date";s:10:"2010-09-14";s:7:"version";a:2:{s:7:"release";s:5:"1.5.4";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:268:"Critical Security release.
    
    It is highly recommended that users of 1.5.3 upgrade to this release, a change in the boundary detection
    code introduced a potential denial of service attack.
     
 
    Bug Fixes
        #17862 - quote boundary preg_split code";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.5.5";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-11-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:9:"BSD Style";}s:5:"notes";s:287:"Minor Bug fix release.

    #17959 - Boundaries ending with non-word characters - patch by Alex Adriaanese
    ------ - ignore whitespace and trailing cr/lf in last section of split
    ------ - correct spacing on multi-line headers. now only striped for encoded data. (on previous line)";}}}s:8:"filelist";a:5:{s:19:"Mail/mimeDecode.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"05c45d0b58718ebe73860ebfe494dcef";s:4:"name";s:19:"Mail/mimeDecode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php54/usr/share/pear/Mail/mimeDecode.php";}s:29:"tests/parse_header_value.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"642acc06cdb217b6e64506182449d8f8";s:4:"name";s:29:"tests/parse_header_value.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/test/Mail_mimeDecode/tests/parse_header_value.phpt";}s:41:"tests/semicolon_content_type_bug1724.phpt";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"a0bc0c9b68e62a19202bd8fb26104f3c";s:4:"name";s:41:"tests/semicolon_content_type_bug1724.phpt";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Mail_mimeDecode/tests/semicolon_content_type_bug1724.phpt";}s:9:"xmail.dtd";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"194810c478066eaeb28f51116b88e25a";s:4:"name";s:9:"xmail.dtd";s:4:"role";s:4:"data";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/data/Mail_mimeDecode/xmail.dtd";}s:9:"xmail.xsl";a:5:{s:14:"baseinstalldir";s:4:"Mail";s:6:"md5sum";s:32:"61cea06fb6b4bd3a4b5e2d37384e14a9";s:4:"name";s:9:"xmail.xsl";s:4:"role";s:4:"data";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/data/Mail_mimeDecode/xmail.xsl";}}s:12:"_lastversion";N;s:7:"dirtree";a:4:{s:34:"/opt/alt/php54/usr/share/pear/Mail";b:1;s:56:"/opt/alt/php54/usr/share/pear/test/Mail_mimeDecode/tests";b:1;s:50:"/opt/alt/php54/usr/share/pear/test/Mail_mimeDecode";b:1;s:50:"/opt/alt/php54/usr/share/pear/data/Mail_mimeDecode";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.5.6";s:12:"release_date";s:10:"2016-08-29";s:13:"release_state";s:6:"stable";s:15:"release_license";s:9:"BSD Style";s:13:"release_notes";s:245:"Minor Bug fix release.
    #20431 - support for android
    #19762 - multipart signed not split correctly on line breaks
    #20027 - replace /e with preg_replace_callback
    #19762 - multipart/signed eating of new line, and expose sig_hdr etc.";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"4.3.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.6.0";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:9:"Mail_Mime";s:3:"rel";s:2:"gt";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:19:"Cipriano Groenendal";s:5:"email";s:13:"cipri@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:5:"cipri";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:12:"Alan Knowles";s:5:"email";s:17:"alan@akbkhome.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"alan_k";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:19:"George Schlossnagle";s:5:"email";s:17:"george@omniti.com";s:6:"active";s:2:"no";s:6:"handle";s:13:"gschlossnagle";s:4:"role";s:9:"developer";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506497;}PK�^�\����ENENpear/.registry/net_sieve.regnu�[���a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.12";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:9:"Net_Sieve";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:34:"Handles talking to a sieve server.";s:11:"description";s:160:"This package provides an API to talk to servers implementing the managesieve protocol. It can be used to install and remove sieve scripts, mark them active etc.";s:4:"lead";a:5:{i:0;a:4:{s:4:"name";s:19:"Aleksander Machniak";s:4:"user";s:4:"alec";s:5:"email";s:12:"alec@alec.pl";s:6:"active";s:3:"yes";}i:1;a:4:{s:4:"name";s:13:"Jan Schneider";s:4:"user";s:6:"yunosh";s:5:"email";s:13:"jan@horde.org";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:13:"Richard Heyes";s:4:"user";s:7:"richard";s:5:"email";s:15:"richard@php.net";s:6:"active";s:2:"no";}i:3;a:4:{s:4:"name";s:21:"Damian Fernandez Sosa";s:4:"user";s:6:"damian";s:5:"email";s:20:"damlists@cnba.uba.ar";s:6:"active";s:2:"no";}i:4;a:4:{s:4:"name";s:12:"Anish Mistry";s:4:"user";s:7:"amistry";s:5:"email";s:26:"amistry@am-productions.biz";s:6:"active";s:2:"no";}}s:4:"date";s:10:"2021-04-24";s:4:"time";s:8:"13:33:52";s:7:"version";a:2:{s:7:"release";s:5:"1.4.5";s:3:"api";s:5:"1.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:38:"* Support XOAUTH2 authorization method";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:3:"Net";s:4:"name";s:1:"/";}s:4:"file";a:4:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"ef8cd688674fba85cc067e06c221e43b";s:4:"name";s:21:"tests/largescript.siv";s:4:"role";s:4:"test";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"7d772fe47ee45bdb521dd581281f38c3";s:4:"name";s:21:"tests/config.php.dist";s:4:"role";s:4:"test";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"6050fac5e66a4a6bbed7913f826974ed";s:4:"name";s:19:"tests/SieveTest.php";s:4:"role";s:4:"test";}}i:3;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"2a45a03c042351957f3435929a17bca3";s:4:"name";s:9:"Sieve.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:17:"@package_version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}}}}s:12:"dependencies";a:2:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.0.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:7:"1.4.0b1";}s:7:"package";a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:3:"1.0";}}s:8:"optional";a:1:{s:7:"package";a:3:{s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:3:"1.0";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:28:{i:0;a:5:{s:4:"date";s:10:"2018-03-04";s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:31:"* Support GSSAPI authentication";}i:1;a:5:{s:4:"date";s:10:"2018-02-14";s:7:"version";a:2:{s:7:"release";s:5:"1.4.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:78:"* Composer: Fix license identifier, don't use unbound version numbers for deps";}i:2;a:5:{s:4:"date";s:10:"2017-05-26";s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:199:"* Use 8bit instead of latin1 for string length in bytes calculation
* Extend listScripts() so it's possible to get an active script name in one go
* Request #20491: Skip redundant CAPABILITY requests";}i:3;a:5:{s:4:"date";s:10:"2017-05-21";s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:129:"* Dropped PHP4 support, fixed PHP7 warnings
* Fixed E_DEPRECATED warning on Auth_SASL::factory() call
* Enable later TLS versions";}i:4;a:5:{s:4:"date";s:10:"2015-01-20";s:7:"version";a:2:{s:7:"release";s:5:"1.3.4";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:70:"* Remove erroneous and unnecessary active script caching (Bug #20472).";}i:5;a:5:{s:4:"date";s:10:"2014-09-24";s:7:"version";a:2:{s:7:"release";s:5:"1.3.3";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:111:"* Fix notices from non-static calling of PEAR methods.
* Fix reading OK responses with string literal messages.";}i:6;a:5:{s:4:"date";s:10:"2011-08-06";s:7:"version";a:2:{s:7:"release";s:5:"1.3.2";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:146:"* Fix referrals if host data or user credentials are passed to connect() and login() instead of the constructor (Aleksander Machniak, Bug #17107).";}i:7;a:5:{s:4:"date";s:10:"2011-08-05";s:7:"version";a:2:{s:7:"release";s:5:"1.3.1";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:417:"* Query capabilities again after successful authentication (Jesse Crawford, Request #18382).
* Escape quotes and backslashes in script names, and use literal strings for script names with non-ASCII characters (Aleksander Machniak, Bug #16691).
* Work around broken STARTTLS behavior in Cyrus versions before 2.3.10 (Aleksander Machniak, Bug #18241).
* Improve string literal parsing (Aleksander Machniak, Bug #18228).";}i:8;a:5:{s:4:"date";s:10:"2010-07-01";s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:122:"* Add debug handler parameter to constructor.
* Fix LOGIN authentication (Agustín Eijo, Aleksander Machniak, Bug #17527).";}i:9;a:5:{s:4:"date";s:10:"2010-06-13";s:7:"version";a:2:{s:7:"release";s:5:"1.2.2";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:57:"* Fix SASL authentication without Auth_SASL (Bug #17489).";}i:10;a:5:{s:4:"date";s:10:"2010-04-19";s:7:"version";a:2:{s:7:"release";s:5:"1.2.1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:72:"* Fix DIGEST-MD5 authentication with Dovecot (Stef Simoens, Bug #17320).";}i:11;a:5:{s:4:"date";s:10:"2010-04-01";s:7:"version";a:2:{s:7:"release";s:5:"1.2.0";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:432:"Changes since version 1.2.0b1:
* Fix DIGEST-MD5 authentication (Aleksander Machniak, Bug #17285).
* Don't try to call dl() if mbstring extension isn't loaded (Bug #17038).
Changes since version 1.1.7:
* Added support for adding a custom debug handler (Aleksander Machniak, Request #16681).
* Fix breakage with certain locales, especially Turkish.
* Fix reading authentication responses without literals (Bug #16647).
* Code cleanup.";}i:12;a:5:{s:4:"date";s:10:"2009-10-07";s:7:"version";a:2:{s:7:"release";s:7:"1.2.0b1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:231:"* Added support for adding a custom debug handler (Aleksander Machniak, Request #16681).
* Fix breakage with certain locales, especially Turkish.
* Fix reading authentication responses without literals (Bug #16647).
* Code cleanup.";}i:13;a:5:{s:4:"date";s:10:"2009-07-24";s:7:"version";a:2:{s:7:"release";s:5:"1.1.7";s:3:"api";s:5:"1.1.6";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:91:"* Fixed STARTTLS support (Bug #14205).
* Added connect options and EXTERNAL authentication.";}i:14;a:5:{s:4:"date";s:10:"2008-03-22";s:7:"version";a:2:{s:7:"release";s:5:"1.1.6";s:3:"api";s:5:"1.1.6";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:88:"* Fixed Bug #9273
* Fixed copy/paste error in CRAM and DIGEST authentication error case.";}i:15;a:5:{s:4:"date";s:10:"2006-10-24";s:7:"version";a:2:{s:7:"release";s:5:"1.1.5";s:3:"api";s:5:"1.1.5";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:47:"* Fixed Bug connect() bug
* Fixed Request #8071";}i:16;a:5:{s:4:"date";s:10:"2006-09-09";s:7:"version";a:2:{s:7:"release";s:5:"1.1.4";s:3:"api";s:5:"1.1.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:207:"* Fixed Bug #8452 Unterminated read loop
* Fixed Bug #7845 Add mbstring support
* Added Request #8071 Enable the ability to toggle TLS support if available.
* Added Request #8453 Clean up PHPDoc and comments";}i:17;a:5:{s:4:"date";s:10:"2006-05-21";s:7:"version";a:2:{s:7:"release";s:5:"1.1.3";s:3:"api";s:5:"1.1.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:164:"* Correctly Fixed Bug #3519 Net_Sieve w/ externally established sockets
* Fixed Bug #7197 getScript() truncates long scripts
* Added PHPUnit2 regression test script";}i:18;a:5:{s:4:"date";s:10:"2006-02-09";s:7:"version";a:2:{s:7:"release";s:5:"1.1.2";s:3:"api";s:5:"1.1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:285:"* Fixed Request #4053 Added STARTTLS support for PHP 5.1 and above
    * Fixed Bug #3519 Net_Sieve w/ externally established sockets
    * Fixed Bug #4794 drops protocol prefix, e.g. "ssl://" in referrals
    * Fixed STARTTLS detection
    * Allow $options[] to be passed to Net_Socket";}i:19;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.1";s:3:"api";s:5:"1.1.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-02-02";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:53:"* Fixed Bug #3242 cyrus murder referrals not followed";}i:20;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-12-18";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:61:"* Fixed Bug #2728 Linebreaks not being read using getScript()";}i:21;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.1";s:3:"api";s:5:"1.0.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-03-13";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:17:"* Fixed BUG #1006";}i:22;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.0";s:3:"api";s:5:"1.0.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-03-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:108:"* Fixed DIGEST-MD5 sasl version handling (sasl v1.xx responses are diferent than v2.xx)
* Fixed LOGIN Method";}i:23;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.9.1";s:3:"api";s:5:"0.9.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2004-02-29";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:1138:"* There is an issue whith the DIGEST-MD5 method. in one installation it does not work but in my server it works perfect! please send me debug info to solve the problem if
it affects you or disable DIGEST-MD5
* some optimizations to the code
* added haveSpace() to check if the server has space to store the script. Use with care HAVESPACE seems to be broken in cyrus 2.0.16
* added hasExtension()
* added getExtensions()
* added referral support and automatic following of them. (it also handles the following of multireferrals).
* removed _getResponse replaced by _doCmd. (thanks to Etienne Goyer for this)
* added supportsAuthMech()
* if installed automatically uses Auth_SASL
* added CRAM-MD5 auth Method
* added DIGEST-MD5 auth Method
* added getAuthMechs() returns an array containing all the auth methods the server supports
* added hasAuthMech() to check if the server has a particular auth method
* _connect --> connect: now is a public method (without breaking BC)
* _login --> login: now is a public method (without breaking BC)
* fix typo  cmdAuthenticate() --->  _cmdAuthenticate()
* _doCmd() now parses string responses also.";}i:24;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.9.0";s:3:"api";s:5:"0.9.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2004-01-31";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:177:"* Added setDebug() method and debugging capabilities
* added disconnect() method
* added sample file test_sieve.php
* fixed bug #591
* automagically selects the best auth method";}i:25;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.8.1";s:3:"api";s:5:"0.8.1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2002-07-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:15:"Initial release";}i:26;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.8";s:3:"api";s:3:"0.8";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2002-05-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:3:"PHP";}s:5:"notes";s:15:"Initial release";}i:27;a:5:{s:4:"date";s:10:"2018-09-09";s:7:"version";a:2:{s:7:"release";s:5:"1.4.4";s:3:"api";s:5:"1.4.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:3:"BSD";}s:5:"notes";s:70:"* Fix PHP 7.3: Declaration of case-insensitive constants is deprecated";}}}s:8:"filelist";a:4:{s:21:"tests/largescript.siv";a:5:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"ef8cd688674fba85cc067e06c221e43b";s:4:"name";s:21:"tests/largescript.siv";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/test/Net_Sieve/tests/largescript.siv";}s:21:"tests/config.php.dist";a:5:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"7d772fe47ee45bdb521dd581281f38c3";s:4:"name";s:21:"tests/config.php.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/test/Net_Sieve/tests/config.php.dist";}s:19:"tests/SieveTest.php";a:5:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"6050fac5e66a4a6bbed7913f826974ed";s:4:"name";s:19:"tests/SieveTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/test/Net_Sieve/tests/SieveTest.php";}s:9:"Sieve.php";a:5:{s:14:"baseinstalldir";s:3:"Net";s:6:"md5sum";s:32:"2a45a03c042351957f3435929a17bca3";s:4:"name";s:9:"Sieve.php";s:4:"role";s:3:"php";s:12:"installed_as";s:43:"/opt/alt/php54/usr/share/pear/Net/Sieve.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:50:"/opt/alt/php54/usr/share/pear/test/Net_Sieve/tests";b:1;s:44:"/opt/alt/php54/usr/share/pear/test/Net_Sieve";b:1;s:33:"/opt/alt/php54/usr/share/pear/Net";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.4.5";s:12:"release_date";s:10:"2021-04-24";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"BSD";s:13:"release_notes";s:38:"* Support XOAUTH2 authorization method";s:12:"release_deps";a:4:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.0.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:7:"1.4.0b1";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:10:"Net_Socket";s:3:"rel";s:2:"ge";s:7:"version";s:3:"1.0";s:8:"optional";s:2:"no";}i:3;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:9:"Auth_SASL";s:3:"rel";s:2:"ge";s:7:"version";s:3:"1.0";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:5:{i:0;a:5:{s:4:"name";s:19:"Aleksander Machniak";s:5:"email";s:12:"alec@alec.pl";s:6:"active";s:3:"yes";s:6:"handle";s:4:"alec";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:13:"Jan Schneider";s:5:"email";s:13:"jan@horde.org";s:6:"active";s:2:"no";s:6:"handle";s:6:"yunosh";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:13:"Richard Heyes";s:5:"email";s:15:"richard@php.net";s:6:"active";s:2:"no";s:6:"handle";s:7:"richard";s:4:"role";s:4:"lead";}i:3;a:5:{s:4:"name";s:21:"Damian Fernandez Sosa";s:5:"email";s:20:"damlists@cnba.uba.ar";s:6:"active";s:2:"no";s:6:"handle";s:6:"damian";s:4:"role";s:4:"lead";}i:4;a:5:{s:4:"name";s:12:"Anish Mistry";s:5:"email";s:26:"amistry@am-productions.biz";s:6:"active";s:2:"no";s:6:"handle";s:7:"amistry";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506498;}PK�^�\1�ޢ++#pear/.registry/structures_graph.regnu�[���a:24:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:16:"Structures_Graph";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:40:"Graph datastructure manipulation library";s:11:"description";s:293:"Structures_Graph is a package for creating and manipulating graph datastructures. It allows building of directed
and undirected graphs, with data and metadata stored in nodes. The library provides functions for graph traversing
as well as for characteristic extraction from the graph topology.";s:4:"lead";a:4:{s:4:"name";s:16:"Sérgio Carvalho";s:4:"user";s:9:"sergiosgc";s:5:"email";s:32:"sergio.carvalho@portugalmail.com";s:6:"active";s:3:"yes";}s:6:"helper";a:4:{s:4:"name";s:12:"Brett Bieber";s:4:"user";s:11:"saltybeagle";s:5:"email";s:22:"brett.bieber@gmail.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2015-07-20";s:4:"time";s:8:"20:04:01";s:7:"version";a:2:{s:7:"release";s:5:"1.1.1";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";s:9:"LGPL-3.0+";s:5:"notes";s:55:"* Fix deprecated constructor warning on PHP 7 [cweiske]";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:12:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"628eb6532a8047bf5962fe24c1c245df";s:4:"name";s:52:"docs/tutorials/Structures_Graph/Structures_Graph.pkg";s:4:"role";s:3:"doc";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4b26eecd30f8695fc3739b1a5b59518e";s:4:"name";s:44:"Structures/Graph/Manipulator/AcyclicTest.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1f857de1fbbaace54b857ed9712f399f";s:4:"name";s:50:"Structures/Graph/Manipulator/TopologicalSorter.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f8e969f0b45d3859408901c8350bb701";s:4:"name";s:25:"Structures/Graph/Node.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"88ae1ad8bcd74d4b74ad845f55611cdd";s:4:"name";s:20:"Structures/Graph.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"65e4e85e573833516f5cc1d7a81db9c5";s:4:"name";s:18:"tests/AllTests.php";s:4:"role";s:4:"test";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"68ba309e2ac6713527f0fd31456457a1";s:4:"name";s:24:"tests/BasicGraphTest.php";s:4:"role";s:4:"test";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"190fc4634be55cd98608b72bc9d0a27f";s:4:"name";s:31:"tests/TopologicalSorterTest.php";s:4:"role";s:4:"test";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4dc0c43f054732ec0f2fc78458ebadde";s:4:"name";s:25:"tests/AcyclicTestTest.php";s:4:"role";s:4:"test";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"68ba309e2ac6713527f0fd31456457a1";s:4:"name";s:24:"tests/BasicGraphTest.php";s:4:"role";s:4:"test";}}i:10;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c891580ee21a7aa863ac32566c979fc5";s:4:"name";s:16:"tests/helper.inc";s:4:"role";s:4:"test";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@php_dir@";s:2:"to";s:7:"php_dir";s:4:"type";s:11:"pear-config";}}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b52f2d57d10c4f7ee67a7eb9615d5d24";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";}}}}}s:10:"compatible";a:4:{s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:8:"1.5.0RC3";s:3:"max";s:5:"1.9.1";}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.3";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:5:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.2";s:3:"api";s:5:"1.0.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-01-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:47:"http://opensource.org/licenses/lgpl-license.php";}s:8:"_content";s:4:"LGPL";}s:5:"notes";s:130:"- Bug #9682 only variables can be returned by reference
- fix Bug #9661 notice in Structures_Graph_Manipulator_Topological::sort()";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.3";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-10-11";s:7:"license";s:12:"LGPL License";s:5:"notes";s:258:"Bugfix Release:
Version 1.0.3 is functionally equivalent to 1.0.2 but with an updated package.xml file.
* Correct invalid md5 sum preventing installation with pyrus [saltybeagle]
* Add compatible tag for PEAR 1.5.0RC3-1.9.0 [saltybeagle]
* Update package.xml";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.4";s:3:"api";s:5:"1.0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-10-25";s:7:"license";s:12:"LGPL License";s:5:"notes";s:88:"Bugfix Release:
* Bug #17108 BasicGraph::test_directed_degree fails on PHP 5 [clockwerx]";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-02-26";s:7:"license";s:9:"LGPL-3.0+";s:5:"notes";s:128:"* Set minimum PHP version to 5.3
* Fix bug #19367: Incorrect FSF address in LICENSE
* Change license from LGPL-2.1+ to LGPL-3.0+";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.1";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-07-20";s:7:"license";s:9:"LGPL-3.0+";s:5:"notes";s:55:"* Fix deprecated constructor warning on PHP 7 [cweiske]";}}}s:8:"filelist";a:11:{s:52:"docs/tutorials/Structures_Graph/Structures_Graph.pkg";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"628eb6532a8047bf5962fe24c1c245df";s:4:"name";s:52:"docs/tutorials/Structures_Graph/Structures_Graph.pkg";s:4:"role";s:3:"doc";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/doc/pear/Structures_Graph/docs/tutorials/Structures_Graph/Structures_Graph.pkg";}s:44:"Structures/Graph/Manipulator/AcyclicTest.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4b26eecd30f8695fc3739b1a5b59518e";s:4:"name";s:44:"Structures/Graph/Manipulator/AcyclicTest.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Structures/Graph/Manipulator/AcyclicTest.php";}s:50:"Structures/Graph/Manipulator/TopologicalSorter.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1f857de1fbbaace54b857ed9712f399f";s:4:"name";s:50:"Structures/Graph/Manipulator/TopologicalSorter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Structures/Graph/Manipulator/TopologicalSorter.php";}s:25:"Structures/Graph/Node.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f8e969f0b45d3859408901c8350bb701";s:4:"name";s:25:"Structures/Graph/Node.php";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php54/usr/share/pear/Structures/Graph/Node.php";}s:20:"Structures/Graph.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"88ae1ad8bcd74d4b74ad845f55611cdd";s:4:"name";s:20:"Structures/Graph.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php54/usr/share/pear/Structures/Graph.php";}s:18:"tests/AllTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"65e4e85e573833516f5cc1d7a81db9c5";s:4:"name";s:18:"tests/AllTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/Structures_Graph/tests/AllTests.php";}s:24:"tests/BasicGraphTest.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"68ba309e2ac6713527f0fd31456457a1";s:4:"name";s:24:"tests/BasicGraphTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/test/Structures_Graph/tests/BasicGraphTest.php";}s:31:"tests/TopologicalSorterTest.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"190fc4634be55cd98608b72bc9d0a27f";s:4:"name";s:31:"tests/TopologicalSorterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Structures_Graph/tests/TopologicalSorterTest.php";}s:25:"tests/AcyclicTestTest.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4dc0c43f054732ec0f2fc78458ebadde";s:4:"name";s:25:"tests/AcyclicTestTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/test/Structures_Graph/tests/AcyclicTestTest.php";}s:16:"tests/helper.inc";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bc79a189610ad1e0efb5a365059c0ec4";s:4:"name";s:16:"tests/helper.inc";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/test/Structures_Graph/tests/helper.inc";}s:7:"LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b52f2d57d10c4f7ee67a7eb9615d5d24";s:4:"name";s:7:"LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:58:"/opt/alt/php54/usr/share/doc/pear/Structures_Graph/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:9:{s:82:"/opt/alt/php54/usr/share/doc/pear/Structures_Graph/docs/tutorials/Structures_Graph";b:1;s:65:"/opt/alt/php54/usr/share/doc/pear/Structures_Graph/docs/tutorials";b:1;s:55:"/opt/alt/php54/usr/share/doc/pear/Structures_Graph/docs";b:1;s:50:"/opt/alt/php54/usr/share/doc/pear/Structures_Graph";b:1;s:58:"/opt/alt/php54/usr/share/pear/Structures/Graph/Manipulator";b:1;s:46:"/opt/alt/php54/usr/share/pear/Structures/Graph";b:1;s:40:"/opt/alt/php54/usr/share/pear/Structures";b:1;s:57:"/opt/alt/php54/usr/share/pear/test/Structures_Graph/tests";b:1;s:51:"/opt/alt/php54/usr/share/pear/test/Structures_Graph";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.1.1";s:12:"release_date";s:10:"2015-07-20";s:13:"release_state";s:6:"stable";s:15:"release_license";s:9:"LGPL-3.0+";s:13:"release_notes";s:55:"* Fix deprecated constructor warning on PHP 7 [cweiske]";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.3";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:2:{i:0;a:5:{s:4:"name";s:16:"Sérgio Carvalho";s:5:"email";s:32:"sergio.carvalho@portugalmail.com";s:6:"active";s:3:"yes";s:6:"handle";s:9:"sergiosgc";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:12:"Brett Bieber";s:5:"email";s:22:"brett.bieber@gmail.com";s:6:"active";s:3:"yes";s:6:"handle";s:11:"saltybeagle";s:4:"role";s:6:"helper";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747067531;}PK�^�\��e�t�t�8pear/.registry/.channel.pear.symfony.com/cssselector.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:11:"CssSelector";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:30:"Symfony2 CssSelector Component";s:11:"description";s:30:"Symfony2 CssSelector Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:42";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:84:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e3e4f08d3d10d65070b694b3f63f7baf";s:4:"name";s:44:"Symfony/Component/CssSelector/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"29b39013d7b608953abbd2ec2a2b108e";s:4:"name";s:42:"Symfony/Component/CssSelector/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"404ca8cc75237ce4158c233f65f6c40a";s:4:"name";s:43:"Symfony/Component/CssSelector/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df4cdb60586ed7c6e160abcecb3946cb";s:4:"name";s:45:"Symfony/Component/CssSelector/CssSelector.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"208a57b71460b044d40b1540a9694a3a";s:4:"name";s:62:"Symfony/Component/CssSelector/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7118a4cf65f680202f0eaf2e908c2c0b";s:4:"name";s:68:"Symfony/Component/CssSelector/Exception/ExpressionErrorException.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aa0dca2be11eee1f425fa517042f77dd";s:4:"name";s:66:"Symfony/Component/CssSelector/Exception/InternalErrorException.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"88581acf1955252a238ba1e7a9065c68";s:4:"name";s:58:"Symfony/Component/CssSelector/Exception/ParseException.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9a8cda86fd4170ac7a11c040f4012ba3";s:4:"name";s:64:"Symfony/Component/CssSelector/Exception/SyntaxErrorException.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:37:"Symfony/Component/CssSelector/LICENSE";s:4:"role";s:3:"doc";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"adb8f4d1edc1238e6b87598afc3a14b8";s:4:"name";s:51:"Symfony/Component/CssSelector/Node/AbstractNode.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"824e4ddb5ff40b70d2ad71755ebe8dfd";s:4:"name";s:52:"Symfony/Component/CssSelector/Node/AttributeNode.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c6c998b135e447f8a28e3808f7e617f9";s:4:"name";s:48:"Symfony/Component/CssSelector/Node/ClassNode.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7106faa07e1e5c71d82fe996008c895f";s:4:"name";s:59:"Symfony/Component/CssSelector/Node/CombinedSelectorNode.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f21f0616e8265a5181e5f06a856c933b";s:4:"name";s:50:"Symfony/Component/CssSelector/Node/ElementNode.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e836280bfc66eafa6baf245f0a3c3bb0";s:4:"name";s:51:"Symfony/Component/CssSelector/Node/FunctionNode.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1a328bfb606d0643442c6170a9459759";s:4:"name";s:47:"Symfony/Component/CssSelector/Node/HashNode.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2cbeaac4f48dc4a66db5a248f8fec10";s:4:"name";s:51:"Symfony/Component/CssSelector/Node/NegationNode.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b5a728ee8ad1d423d62efdcf4f657c26";s:4:"name";s:52:"Symfony/Component/CssSelector/Node/NodeInterface.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4e924e9ba036136a008da903df86a360";s:4:"name";s:49:"Symfony/Component/CssSelector/Node/PseudoNode.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7b47cf534893303b4e3d0bfdc2c5e2ff";s:4:"name";s:51:"Symfony/Component/CssSelector/Node/SelectorNode.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bc8f1629f8cf146261b153e325d8ce1c";s:4:"name";s:50:"Symfony/Component/CssSelector/Node/Specificity.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"728097eaafd9e8018c6c7dcbebccea44";s:4:"name";s:63:"Symfony/Component/CssSelector/Parser/Handler/CommentHandler.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9c84b47596c28514679be9c51f81f16e";s:4:"name";s:65:"Symfony/Component/CssSelector/Parser/Handler/HandlerInterface.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4e97078058108e52db9b12c6da6a9109";s:4:"name";s:60:"Symfony/Component/CssSelector/Parser/Handler/HashHandler.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b7bf58f74e1fc2309e25b7baa9d1d343";s:4:"name";s:66:"Symfony/Component/CssSelector/Parser/Handler/IdentifierHandler.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"83ff03c0d6a16a4fcce0f5de9fa23308";s:4:"name";s:62:"Symfony/Component/CssSelector/Parser/Handler/NumberHandler.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"61b35623c7532945151ffa7dd7f5d100";s:4:"name";s:62:"Symfony/Component/CssSelector/Parser/Handler/StringHandler.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8f0d0212ec813837d767b7b26fe53585";s:4:"name";s:66:"Symfony/Component/CssSelector/Parser/Handler/WhitespaceHandler.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"809111f9a2ead47facf240b010627cb2";s:4:"name";s:47:"Symfony/Component/CssSelector/Parser/Parser.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dfbca8e2e63ac97e63cebf19545218fe";s:4:"name";s:56:"Symfony/Component/CssSelector/Parser/ParserInterface.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"45ecfcb66b87c2a3784a9632a246060f";s:4:"name";s:47:"Symfony/Component/CssSelector/Parser/Reader.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bbccdac49b44cddfdf5aa335af6cb7bb";s:4:"name";s:61:"Symfony/Component/CssSelector/Parser/Shortcut/ClassParser.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"804e233a3fea5cef8d63d07ac11d749b";s:4:"name";s:63:"Symfony/Component/CssSelector/Parser/Shortcut/ElementParser.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bc23d8eac5180583a554b3c469f88776";s:4:"name";s:67:"Symfony/Component/CssSelector/Parser/Shortcut/EmptyStringParser.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"17d6d96570644684f01a2024992ef78c";s:4:"name";s:60:"Symfony/Component/CssSelector/Parser/Shortcut/HashParser.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1f69e33454e833ed892e7ba74be9d6a8";s:4:"name";s:46:"Symfony/Component/CssSelector/Parser/Token.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"02f022d181917a067d284db4d05a5fd9";s:4:"name";s:60:"Symfony/Component/CssSelector/Parser/Tokenizer/Tokenizer.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a227118fac4ee4eee1a06ae3f58f561b";s:4:"name";s:68:"Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerEscaping.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5c6f061f1023771ed9ef034c39987e48";s:4:"name";s:68:"Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerPatterns.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a95da42ba62cfcf96ae0721c2aef6271";s:4:"name";s:52:"Symfony/Component/CssSelector/Parser/TokenStream.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6301c7c5ed355dad16bac2f2d7916334";s:4:"name";s:46:"Symfony/Component/CssSelector/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ae0bfe1d0ab7683160027e2028a500a9";s:4:"name";s:39:"Symfony/Component/CssSelector/README.md";s:4:"role";s:3:"doc";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"105f97c869d80ceaeab602ace2d02a4c";s:4:"name";s:55:"Symfony/Component/CssSelector/Tests/CssSelectorTest.php";s:4:"role";s:4:"test";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fb966a846c4b2274ede7f234737a3fdf";s:4:"name";s:61:"Symfony/Component/CssSelector/Tests/Node/AbstractNodeTest.php";s:4:"role";s:4:"test";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"092c2094b2f340fe776efd016fce5eb5";s:4:"name";s:62:"Symfony/Component/CssSelector/Tests/Node/AttributeNodeTest.php";s:4:"role";s:4:"test";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eca9764164e56b19fa1345e505ac00a3";s:4:"name";s:58:"Symfony/Component/CssSelector/Tests/Node/ClassNodeTest.php";s:4:"role";s:4:"test";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"214991c4a92512b719f1cc0be325019b";s:4:"name";s:69:"Symfony/Component/CssSelector/Tests/Node/CombinedSelectorNodeTest.php";s:4:"role";s:4:"test";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b4cb8f0c44fef00b721da4e933d9f205";s:4:"name";s:60:"Symfony/Component/CssSelector/Tests/Node/ElementNodeTest.php";s:4:"role";s:4:"test";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bbed27d30c8c4cc7c9ed8e69088600eb";s:4:"name";s:61:"Symfony/Component/CssSelector/Tests/Node/FunctionNodeTest.php";s:4:"role";s:4:"test";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"104b5fb3905b0d7557cd64af04afa077";s:4:"name";s:57:"Symfony/Component/CssSelector/Tests/Node/HashNodeTest.php";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d96b688675039a28d44ee2ecd0929df2";s:4:"name";s:61:"Symfony/Component/CssSelector/Tests/Node/NegationNodeTest.php";s:4:"role";s:4:"test";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"05dd9359681c2bbafed998ce4e35be76";s:4:"name";s:59:"Symfony/Component/CssSelector/Tests/Node/PseudoNodeTest.php";s:4:"role";s:4:"test";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4a5b7629d4b212920bd00024a5213657";s:4:"name";s:61:"Symfony/Component/CssSelector/Tests/Node/SelectorNodeTest.php";s:4:"role";s:4:"test";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b550b9aacb73e080022549bbda34caf6";s:4:"name";s:60:"Symfony/Component/CssSelector/Tests/Node/SpecificityTest.php";s:4:"role";s:4:"test";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"83af69d075f8471eb4bfc9cad8f13ff2";s:4:"name";s:74:"Symfony/Component/CssSelector/Tests/Parser/Handler/AbstractHandlerTest.php";s:4:"role";s:4:"test";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"196568e95d36d1ca21071e86dbb5eeb8";s:4:"name";s:73:"Symfony/Component/CssSelector/Tests/Parser/Handler/CommentHandlerTest.php";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"290658d56ebcffe5ce8f2c2c38e2931b";s:4:"name";s:70:"Symfony/Component/CssSelector/Tests/Parser/Handler/HashHandlerTest.php";s:4:"role";s:4:"test";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2273b97aa4a3c0610549edd8a278f689";s:4:"name";s:76:"Symfony/Component/CssSelector/Tests/Parser/Handler/IdentifierHandlerTest.php";s:4:"role";s:4:"test";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a384123020ded9dca1e5adb522f700df";s:4:"name";s:72:"Symfony/Component/CssSelector/Tests/Parser/Handler/NumberHandlerTest.php";s:4:"role";s:4:"test";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5df1ec9081c389b0a8171a15717be896";s:4:"name";s:72:"Symfony/Component/CssSelector/Tests/Parser/Handler/StringHandlerTest.php";s:4:"role";s:4:"test";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6b796bb0920add27d724e9d20f549938";s:4:"name";s:76:"Symfony/Component/CssSelector/Tests/Parser/Handler/WhitespaceHandlerTest.php";s:4:"role";s:4:"test";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1cde27c5bdf7267d0f57d4e1b956a4c1";s:4:"name";s:57:"Symfony/Component/CssSelector/Tests/Parser/ParserTest.php";s:4:"role";s:4:"test";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b6a8eb9014c35a8bdb4202200bc1c88";s:4:"name";s:57:"Symfony/Component/CssSelector/Tests/Parser/ReaderTest.php";s:4:"role";s:4:"test";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1b2c8035f78686902f20778b1cb8f797";s:4:"name";s:71:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/ClassParserTest.php";s:4:"role";s:4:"test";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8ba77c09ff5ffd51dc3ac24c09d0e122";s:4:"name";s:73:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/ElementParserTest.php";s:4:"role";s:4:"test";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c03a0a760a4fc403aa3924670d8db091";s:4:"name";s:77:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/EmptyStringParserTest.php";s:4:"role";s:4:"test";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9a34d1dab3847e8a0f506d33a828b316";s:4:"name";s:70:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/HashParserTest.php";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"abd404d57badfae769653f4db1db5d6d";s:4:"name";s:62:"Symfony/Component/CssSelector/Tests/Parser/TokenStreamTest.php";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ab650cab7dd7fef95d85b7941012a70a";s:4:"name";s:59:"Symfony/Component/CssSelector/Tests/XPath/Fixtures/ids.html";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"717695cc05565465bc3acf15d9a427f2";s:4:"name";s:59:"Symfony/Component/CssSelector/Tests/XPath/Fixtures/lang.xml";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"58178acfc40a4729a0c8b11ac242ece5";s:4:"name";s:66:"Symfony/Component/CssSelector/Tests/XPath/Fixtures/shakespear.html";s:4:"role";s:4:"test";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"297ff7c35ebed5a7b3e9d1b3a5edfe19";s:4:"name";s:60:"Symfony/Component/CssSelector/Tests/XPath/TranslatorTest.php";s:4:"role";s:4:"test";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"36f2db5086cfda27484bc54a7267cddf";s:4:"name";s:67:"Symfony/Component/CssSelector/XPath/Extension/AbstractExtension.php";s:4:"role";s:3:"php";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b146bf7b873f25e0b5a7424b67eff903";s:4:"name";s:76:"Symfony/Component/CssSelector/XPath/Extension/AttributeMatchingExtension.php";s:4:"role";s:3:"php";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8f84c67fd6012af8de284b01c0754748";s:4:"name";s:70:"Symfony/Component/CssSelector/XPath/Extension/CombinationExtension.php";s:4:"role";s:3:"php";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"959c23787abad9e8c4bbba199cf33f3e";s:4:"name";s:68:"Symfony/Component/CssSelector/XPath/Extension/ExtensionInterface.php";s:4:"role";s:3:"php";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5966f7a9794f6ccd306e8dfc127a3668";s:4:"name";s:67:"Symfony/Component/CssSelector/XPath/Extension/FunctionExtension.php";s:4:"role";s:3:"php";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ab07740061746645330dd5d41bb211e";s:4:"name";s:63:"Symfony/Component/CssSelector/XPath/Extension/HtmlExtension.php";s:4:"role";s:3:"php";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d1f044c7891470c22cdd9ec874cd287d";s:4:"name";s:63:"Symfony/Component/CssSelector/XPath/Extension/NodeExtension.php";s:4:"role";s:3:"php";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d16abca499c10dc7eede468dc8302dc6";s:4:"name";s:70:"Symfony/Component/CssSelector/XPath/Extension/PseudoClassExtension.php";s:4:"role";s:3:"php";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"008dda93517b6aba5b6f149946c576ab";s:4:"name";s:50:"Symfony/Component/CssSelector/XPath/Translator.php";s:4:"role";s:3:"php";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"64ba3e247c7e3d046227828a44179c7e";s:4:"name";s:59:"Symfony/Component/CssSelector/XPath/TranslatorInterface.php";s:4:"role";s:3:"php";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e795b62a50ce86fecf5ef2a576cc42bb";s:4:"name";s:49:"Symfony/Component/CssSelector/XPath/XPathExpr.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:84:{s:44:"Symfony/Component/CssSelector/autoloader.php";a:4:{s:6:"md5sum";s:32:"e3e4f08d3d10d65070b694b3f63f7baf";s:4:"name";s:44:"Symfony/Component/CssSelector/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/autoloader.php";}s:42:"Symfony/Component/CssSelector/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"29b39013d7b608953abbd2ec2a2b108e";s:4:"name";s:42:"Symfony/Component/CssSelector/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/doc/pear/CssSelector/Symfony/Component/CssSelector/CHANGELOG.md";}s:43:"Symfony/Component/CssSelector/composer.json";a:4:{s:6:"md5sum";s:32:"404ca8cc75237ce4158c233f65f6c40a";s:4:"name";s:43:"Symfony/Component/CssSelector/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/doc/pear/CssSelector/Symfony/Component/CssSelector/composer.json";}s:45:"Symfony/Component/CssSelector/CssSelector.php";a:4:{s:6:"md5sum";s:32:"df4cdb60586ed7c6e160abcecb3946cb";s:4:"name";s:45:"Symfony/Component/CssSelector/CssSelector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/CssSelector.php";}s:62:"Symfony/Component/CssSelector/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"208a57b71460b044d40b1540a9694a3a";s:4:"name";s:62:"Symfony/Component/CssSelector/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Exception/ExceptionInterface.php";}s:68:"Symfony/Component/CssSelector/Exception/ExpressionErrorException.php";a:4:{s:6:"md5sum";s:32:"7118a4cf65f680202f0eaf2e908c2c0b";s:4:"name";s:68:"Symfony/Component/CssSelector/Exception/ExpressionErrorException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Exception/ExpressionErrorException.php";}s:66:"Symfony/Component/CssSelector/Exception/InternalErrorException.php";a:4:{s:6:"md5sum";s:32:"aa0dca2be11eee1f425fa517042f77dd";s:4:"name";s:66:"Symfony/Component/CssSelector/Exception/InternalErrorException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Exception/InternalErrorException.php";}s:58:"Symfony/Component/CssSelector/Exception/ParseException.php";a:4:{s:6:"md5sum";s:32:"88581acf1955252a238ba1e7a9065c68";s:4:"name";s:58:"Symfony/Component/CssSelector/Exception/ParseException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Exception/ParseException.php";}s:64:"Symfony/Component/CssSelector/Exception/SyntaxErrorException.php";a:4:{s:6:"md5sum";s:32:"9a8cda86fd4170ac7a11c040f4012ba3";s:4:"name";s:64:"Symfony/Component/CssSelector/Exception/SyntaxErrorException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Exception/SyntaxErrorException.php";}s:37:"Symfony/Component/CssSelector/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:37:"Symfony/Component/CssSelector/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/CssSelector/Symfony/Component/CssSelector/LICENSE";}s:51:"Symfony/Component/CssSelector/Node/AbstractNode.php";a:4:{s:6:"md5sum";s:32:"adb8f4d1edc1238e6b87598afc3a14b8";s:4:"name";s:51:"Symfony/Component/CssSelector/Node/AbstractNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/AbstractNode.php";}s:52:"Symfony/Component/CssSelector/Node/AttributeNode.php";a:4:{s:6:"md5sum";s:32:"824e4ddb5ff40b70d2ad71755ebe8dfd";s:4:"name";s:52:"Symfony/Component/CssSelector/Node/AttributeNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/AttributeNode.php";}s:48:"Symfony/Component/CssSelector/Node/ClassNode.php";a:4:{s:6:"md5sum";s:32:"c6c998b135e447f8a28e3808f7e617f9";s:4:"name";s:48:"Symfony/Component/CssSelector/Node/ClassNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/ClassNode.php";}s:59:"Symfony/Component/CssSelector/Node/CombinedSelectorNode.php";a:4:{s:6:"md5sum";s:32:"7106faa07e1e5c71d82fe996008c895f";s:4:"name";s:59:"Symfony/Component/CssSelector/Node/CombinedSelectorNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/CombinedSelectorNode.php";}s:50:"Symfony/Component/CssSelector/Node/ElementNode.php";a:4:{s:6:"md5sum";s:32:"f21f0616e8265a5181e5f06a856c933b";s:4:"name";s:50:"Symfony/Component/CssSelector/Node/ElementNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/ElementNode.php";}s:51:"Symfony/Component/CssSelector/Node/FunctionNode.php";a:4:{s:6:"md5sum";s:32:"e836280bfc66eafa6baf245f0a3c3bb0";s:4:"name";s:51:"Symfony/Component/CssSelector/Node/FunctionNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/FunctionNode.php";}s:47:"Symfony/Component/CssSelector/Node/HashNode.php";a:4:{s:6:"md5sum";s:32:"1a328bfb606d0643442c6170a9459759";s:4:"name";s:47:"Symfony/Component/CssSelector/Node/HashNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/HashNode.php";}s:51:"Symfony/Component/CssSelector/Node/NegationNode.php";a:4:{s:6:"md5sum";s:32:"c2cbeaac4f48dc4a66db5a248f8fec10";s:4:"name";s:51:"Symfony/Component/CssSelector/Node/NegationNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/NegationNode.php";}s:52:"Symfony/Component/CssSelector/Node/NodeInterface.php";a:4:{s:6:"md5sum";s:32:"b5a728ee8ad1d423d62efdcf4f657c26";s:4:"name";s:52:"Symfony/Component/CssSelector/Node/NodeInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/NodeInterface.php";}s:49:"Symfony/Component/CssSelector/Node/PseudoNode.php";a:4:{s:6:"md5sum";s:32:"4e924e9ba036136a008da903df86a360";s:4:"name";s:49:"Symfony/Component/CssSelector/Node/PseudoNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/PseudoNode.php";}s:51:"Symfony/Component/CssSelector/Node/SelectorNode.php";a:4:{s:6:"md5sum";s:32:"7b47cf534893303b4e3d0bfdc2c5e2ff";s:4:"name";s:51:"Symfony/Component/CssSelector/Node/SelectorNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/SelectorNode.php";}s:50:"Symfony/Component/CssSelector/Node/Specificity.php";a:4:{s:6:"md5sum";s:32:"bc8f1629f8cf146261b153e325d8ce1c";s:4:"name";s:50:"Symfony/Component/CssSelector/Node/Specificity.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node/Specificity.php";}s:63:"Symfony/Component/CssSelector/Parser/Handler/CommentHandler.php";a:4:{s:6:"md5sum";s:32:"728097eaafd9e8018c6c7dcbebccea44";s:4:"name";s:63:"Symfony/Component/CssSelector/Parser/Handler/CommentHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Handler/CommentHandler.php";}s:65:"Symfony/Component/CssSelector/Parser/Handler/HandlerInterface.php";a:4:{s:6:"md5sum";s:32:"9c84b47596c28514679be9c51f81f16e";s:4:"name";s:65:"Symfony/Component/CssSelector/Parser/Handler/HandlerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Handler/HandlerInterface.php";}s:60:"Symfony/Component/CssSelector/Parser/Handler/HashHandler.php";a:4:{s:6:"md5sum";s:32:"4e97078058108e52db9b12c6da6a9109";s:4:"name";s:60:"Symfony/Component/CssSelector/Parser/Handler/HashHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Handler/HashHandler.php";}s:66:"Symfony/Component/CssSelector/Parser/Handler/IdentifierHandler.php";a:4:{s:6:"md5sum";s:32:"b7bf58f74e1fc2309e25b7baa9d1d343";s:4:"name";s:66:"Symfony/Component/CssSelector/Parser/Handler/IdentifierHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Handler/IdentifierHandler.php";}s:62:"Symfony/Component/CssSelector/Parser/Handler/NumberHandler.php";a:4:{s:6:"md5sum";s:32:"83ff03c0d6a16a4fcce0f5de9fa23308";s:4:"name";s:62:"Symfony/Component/CssSelector/Parser/Handler/NumberHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Handler/NumberHandler.php";}s:62:"Symfony/Component/CssSelector/Parser/Handler/StringHandler.php";a:4:{s:6:"md5sum";s:32:"61b35623c7532945151ffa7dd7f5d100";s:4:"name";s:62:"Symfony/Component/CssSelector/Parser/Handler/StringHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Handler/StringHandler.php";}s:66:"Symfony/Component/CssSelector/Parser/Handler/WhitespaceHandler.php";a:4:{s:6:"md5sum";s:32:"8f0d0212ec813837d767b7b26fe53585";s:4:"name";s:66:"Symfony/Component/CssSelector/Parser/Handler/WhitespaceHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Handler/WhitespaceHandler.php";}s:47:"Symfony/Component/CssSelector/Parser/Parser.php";a:4:{s:6:"md5sum";s:32:"809111f9a2ead47facf240b010627cb2";s:4:"name";s:47:"Symfony/Component/CssSelector/Parser/Parser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Parser.php";}s:56:"Symfony/Component/CssSelector/Parser/ParserInterface.php";a:4:{s:6:"md5sum";s:32:"dfbca8e2e63ac97e63cebf19545218fe";s:4:"name";s:56:"Symfony/Component/CssSelector/Parser/ParserInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/ParserInterface.php";}s:47:"Symfony/Component/CssSelector/Parser/Reader.php";a:4:{s:6:"md5sum";s:32:"45ecfcb66b87c2a3784a9632a246060f";s:4:"name";s:47:"Symfony/Component/CssSelector/Parser/Reader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Reader.php";}s:61:"Symfony/Component/CssSelector/Parser/Shortcut/ClassParser.php";a:4:{s:6:"md5sum";s:32:"bbccdac49b44cddfdf5aa335af6cb7bb";s:4:"name";s:61:"Symfony/Component/CssSelector/Parser/Shortcut/ClassParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Shortcut/ClassParser.php";}s:63:"Symfony/Component/CssSelector/Parser/Shortcut/ElementParser.php";a:4:{s:6:"md5sum";s:32:"804e233a3fea5cef8d63d07ac11d749b";s:4:"name";s:63:"Symfony/Component/CssSelector/Parser/Shortcut/ElementParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Shortcut/ElementParser.php";}s:67:"Symfony/Component/CssSelector/Parser/Shortcut/EmptyStringParser.php";a:4:{s:6:"md5sum";s:32:"bc23d8eac5180583a554b3c469f88776";s:4:"name";s:67:"Symfony/Component/CssSelector/Parser/Shortcut/EmptyStringParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Shortcut/EmptyStringParser.php";}s:60:"Symfony/Component/CssSelector/Parser/Shortcut/HashParser.php";a:4:{s:6:"md5sum";s:32:"17d6d96570644684f01a2024992ef78c";s:4:"name";s:60:"Symfony/Component/CssSelector/Parser/Shortcut/HashParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Shortcut/HashParser.php";}s:46:"Symfony/Component/CssSelector/Parser/Token.php";a:4:{s:6:"md5sum";s:32:"1f69e33454e833ed892e7ba74be9d6a8";s:4:"name";s:46:"Symfony/Component/CssSelector/Parser/Token.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Token.php";}s:60:"Symfony/Component/CssSelector/Parser/Tokenizer/Tokenizer.php";a:4:{s:6:"md5sum";s:32:"02f022d181917a067d284db4d05a5fd9";s:4:"name";s:60:"Symfony/Component/CssSelector/Parser/Tokenizer/Tokenizer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Tokenizer/Tokenizer.php";}s:68:"Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerEscaping.php";a:4:{s:6:"md5sum";s:32:"a227118fac4ee4eee1a06ae3f58f561b";s:4:"name";s:68:"Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerEscaping.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerEscaping.php";}s:68:"Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerPatterns.php";a:4:{s:6:"md5sum";s:32:"5c6f061f1023771ed9ef034c39987e48";s:4:"name";s:68:"Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerPatterns.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerPatterns.php";}s:52:"Symfony/Component/CssSelector/Parser/TokenStream.php";a:4:{s:6:"md5sum";s:32:"a95da42ba62cfcf96ae0721c2aef6271";s:4:"name";s:52:"Symfony/Component/CssSelector/Parser/TokenStream.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/TokenStream.php";}s:46:"Symfony/Component/CssSelector/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"6301c7c5ed355dad16bac2f2d7916334";s:4:"name";s:46:"Symfony/Component/CssSelector/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/phpunit.xml.dist";}s:39:"Symfony/Component/CssSelector/README.md";a:4:{s:6:"md5sum";s:32:"ae0bfe1d0ab7683160027e2028a500a9";s:4:"name";s:39:"Symfony/Component/CssSelector/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/doc/pear/CssSelector/Symfony/Component/CssSelector/README.md";}s:55:"Symfony/Component/CssSelector/Tests/CssSelectorTest.php";a:4:{s:6:"md5sum";s:32:"105f97c869d80ceaeab602ace2d02a4c";s:4:"name";s:55:"Symfony/Component/CssSelector/Tests/CssSelectorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/CssSelectorTest.php";}s:61:"Symfony/Component/CssSelector/Tests/Node/AbstractNodeTest.php";a:4:{s:6:"md5sum";s:32:"fb966a846c4b2274ede7f234737a3fdf";s:4:"name";s:61:"Symfony/Component/CssSelector/Tests/Node/AbstractNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/AbstractNodeTest.php";}s:62:"Symfony/Component/CssSelector/Tests/Node/AttributeNodeTest.php";a:4:{s:6:"md5sum";s:32:"092c2094b2f340fe776efd016fce5eb5";s:4:"name";s:62:"Symfony/Component/CssSelector/Tests/Node/AttributeNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/AttributeNodeTest.php";}s:58:"Symfony/Component/CssSelector/Tests/Node/ClassNodeTest.php";a:4:{s:6:"md5sum";s:32:"eca9764164e56b19fa1345e505ac00a3";s:4:"name";s:58:"Symfony/Component/CssSelector/Tests/Node/ClassNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/ClassNodeTest.php";}s:69:"Symfony/Component/CssSelector/Tests/Node/CombinedSelectorNodeTest.php";a:4:{s:6:"md5sum";s:32:"214991c4a92512b719f1cc0be325019b";s:4:"name";s:69:"Symfony/Component/CssSelector/Tests/Node/CombinedSelectorNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/CombinedSelectorNodeTest.php";}s:60:"Symfony/Component/CssSelector/Tests/Node/ElementNodeTest.php";a:4:{s:6:"md5sum";s:32:"b4cb8f0c44fef00b721da4e933d9f205";s:4:"name";s:60:"Symfony/Component/CssSelector/Tests/Node/ElementNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/ElementNodeTest.php";}s:61:"Symfony/Component/CssSelector/Tests/Node/FunctionNodeTest.php";a:4:{s:6:"md5sum";s:32:"bbed27d30c8c4cc7c9ed8e69088600eb";s:4:"name";s:61:"Symfony/Component/CssSelector/Tests/Node/FunctionNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/FunctionNodeTest.php";}s:57:"Symfony/Component/CssSelector/Tests/Node/HashNodeTest.php";a:4:{s:6:"md5sum";s:32:"104b5fb3905b0d7557cd64af04afa077";s:4:"name";s:57:"Symfony/Component/CssSelector/Tests/Node/HashNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/HashNodeTest.php";}s:61:"Symfony/Component/CssSelector/Tests/Node/NegationNodeTest.php";a:4:{s:6:"md5sum";s:32:"d96b688675039a28d44ee2ecd0929df2";s:4:"name";s:61:"Symfony/Component/CssSelector/Tests/Node/NegationNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/NegationNodeTest.php";}s:59:"Symfony/Component/CssSelector/Tests/Node/PseudoNodeTest.php";a:4:{s:6:"md5sum";s:32:"05dd9359681c2bbafed998ce4e35be76";s:4:"name";s:59:"Symfony/Component/CssSelector/Tests/Node/PseudoNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/PseudoNodeTest.php";}s:61:"Symfony/Component/CssSelector/Tests/Node/SelectorNodeTest.php";a:4:{s:6:"md5sum";s:32:"4a5b7629d4b212920bd00024a5213657";s:4:"name";s:61:"Symfony/Component/CssSelector/Tests/Node/SelectorNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/SelectorNodeTest.php";}s:60:"Symfony/Component/CssSelector/Tests/Node/SpecificityTest.php";a:4:{s:6:"md5sum";s:32:"b550b9aacb73e080022549bbda34caf6";s:4:"name";s:60:"Symfony/Component/CssSelector/Tests/Node/SpecificityTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node/SpecificityTest.php";}s:74:"Symfony/Component/CssSelector/Tests/Parser/Handler/AbstractHandlerTest.php";a:4:{s:6:"md5sum";s:32:"83af69d075f8471eb4bfc9cad8f13ff2";s:4:"name";s:74:"Symfony/Component/CssSelector/Tests/Parser/Handler/AbstractHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Handler/AbstractHandlerTest.php";}s:73:"Symfony/Component/CssSelector/Tests/Parser/Handler/CommentHandlerTest.php";a:4:{s:6:"md5sum";s:32:"196568e95d36d1ca21071e86dbb5eeb8";s:4:"name";s:73:"Symfony/Component/CssSelector/Tests/Parser/Handler/CommentHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Handler/CommentHandlerTest.php";}s:70:"Symfony/Component/CssSelector/Tests/Parser/Handler/HashHandlerTest.php";a:4:{s:6:"md5sum";s:32:"290658d56ebcffe5ce8f2c2c38e2931b";s:4:"name";s:70:"Symfony/Component/CssSelector/Tests/Parser/Handler/HashHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Handler/HashHandlerTest.php";}s:76:"Symfony/Component/CssSelector/Tests/Parser/Handler/IdentifierHandlerTest.php";a:4:{s:6:"md5sum";s:32:"2273b97aa4a3c0610549edd8a278f689";s:4:"name";s:76:"Symfony/Component/CssSelector/Tests/Parser/Handler/IdentifierHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Handler/IdentifierHandlerTest.php";}s:72:"Symfony/Component/CssSelector/Tests/Parser/Handler/NumberHandlerTest.php";a:4:{s:6:"md5sum";s:32:"a384123020ded9dca1e5adb522f700df";s:4:"name";s:72:"Symfony/Component/CssSelector/Tests/Parser/Handler/NumberHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Handler/NumberHandlerTest.php";}s:72:"Symfony/Component/CssSelector/Tests/Parser/Handler/StringHandlerTest.php";a:4:{s:6:"md5sum";s:32:"5df1ec9081c389b0a8171a15717be896";s:4:"name";s:72:"Symfony/Component/CssSelector/Tests/Parser/Handler/StringHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Handler/StringHandlerTest.php";}s:76:"Symfony/Component/CssSelector/Tests/Parser/Handler/WhitespaceHandlerTest.php";a:4:{s:6:"md5sum";s:32:"6b796bb0920add27d724e9d20f549938";s:4:"name";s:76:"Symfony/Component/CssSelector/Tests/Parser/Handler/WhitespaceHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Handler/WhitespaceHandlerTest.php";}s:57:"Symfony/Component/CssSelector/Tests/Parser/ParserTest.php";a:4:{s:6:"md5sum";s:32:"1cde27c5bdf7267d0f57d4e1b956a4c1";s:4:"name";s:57:"Symfony/Component/CssSelector/Tests/Parser/ParserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/ParserTest.php";}s:57:"Symfony/Component/CssSelector/Tests/Parser/ReaderTest.php";a:4:{s:6:"md5sum";s:32:"5b6a8eb9014c35a8bdb4202200bc1c88";s:4:"name";s:57:"Symfony/Component/CssSelector/Tests/Parser/ReaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/ReaderTest.php";}s:71:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/ClassParserTest.php";a:4:{s:6:"md5sum";s:32:"1b2c8035f78686902f20778b1cb8f797";s:4:"name";s:71:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/ClassParserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Shortcut/ClassParserTest.php";}s:73:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/ElementParserTest.php";a:4:{s:6:"md5sum";s:32:"8ba77c09ff5ffd51dc3ac24c09d0e122";s:4:"name";s:73:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/ElementParserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Shortcut/ElementParserTest.php";}s:77:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/EmptyStringParserTest.php";a:4:{s:6:"md5sum";s:32:"c03a0a760a4fc403aa3924670d8db091";s:4:"name";s:77:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/EmptyStringParserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Shortcut/EmptyStringParserTest.php";}s:70:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/HashParserTest.php";a:4:{s:6:"md5sum";s:32:"9a34d1dab3847e8a0f506d33a828b316";s:4:"name";s:70:"Symfony/Component/CssSelector/Tests/Parser/Shortcut/HashParserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Shortcut/HashParserTest.php";}s:62:"Symfony/Component/CssSelector/Tests/Parser/TokenStreamTest.php";a:4:{s:6:"md5sum";s:32:"abd404d57badfae769653f4db1db5d6d";s:4:"name";s:62:"Symfony/Component/CssSelector/Tests/Parser/TokenStreamTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/TokenStreamTest.php";}s:59:"Symfony/Component/CssSelector/Tests/XPath/Fixtures/ids.html";a:4:{s:6:"md5sum";s:32:"ab650cab7dd7fef95d85b7941012a70a";s:4:"name";s:59:"Symfony/Component/CssSelector/Tests/XPath/Fixtures/ids.html";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/XPath/Fixtures/ids.html";}s:59:"Symfony/Component/CssSelector/Tests/XPath/Fixtures/lang.xml";a:4:{s:6:"md5sum";s:32:"717695cc05565465bc3acf15d9a427f2";s:4:"name";s:59:"Symfony/Component/CssSelector/Tests/XPath/Fixtures/lang.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/XPath/Fixtures/lang.xml";}s:66:"Symfony/Component/CssSelector/Tests/XPath/Fixtures/shakespear.html";a:4:{s:6:"md5sum";s:32:"58178acfc40a4729a0c8b11ac242ece5";s:4:"name";s:66:"Symfony/Component/CssSelector/Tests/XPath/Fixtures/shakespear.html";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/XPath/Fixtures/shakespear.html";}s:60:"Symfony/Component/CssSelector/Tests/XPath/TranslatorTest.php";a:4:{s:6:"md5sum";s:32:"297ff7c35ebed5a7b3e9d1b3a5edfe19";s:4:"name";s:60:"Symfony/Component/CssSelector/Tests/XPath/TranslatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/XPath/TranslatorTest.php";}s:67:"Symfony/Component/CssSelector/XPath/Extension/AbstractExtension.php";a:4:{s:6:"md5sum";s:32:"36f2db5086cfda27484bc54a7267cddf";s:4:"name";s:67:"Symfony/Component/CssSelector/XPath/Extension/AbstractExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/Extension/AbstractExtension.php";}s:76:"Symfony/Component/CssSelector/XPath/Extension/AttributeMatchingExtension.php";a:4:{s:6:"md5sum";s:32:"b146bf7b873f25e0b5a7424b67eff903";s:4:"name";s:76:"Symfony/Component/CssSelector/XPath/Extension/AttributeMatchingExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/Extension/AttributeMatchingExtension.php";}s:70:"Symfony/Component/CssSelector/XPath/Extension/CombinationExtension.php";a:4:{s:6:"md5sum";s:32:"8f84c67fd6012af8de284b01c0754748";s:4:"name";s:70:"Symfony/Component/CssSelector/XPath/Extension/CombinationExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/Extension/CombinationExtension.php";}s:68:"Symfony/Component/CssSelector/XPath/Extension/ExtensionInterface.php";a:4:{s:6:"md5sum";s:32:"959c23787abad9e8c4bbba199cf33f3e";s:4:"name";s:68:"Symfony/Component/CssSelector/XPath/Extension/ExtensionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/Extension/ExtensionInterface.php";}s:67:"Symfony/Component/CssSelector/XPath/Extension/FunctionExtension.php";a:4:{s:6:"md5sum";s:32:"5966f7a9794f6ccd306e8dfc127a3668";s:4:"name";s:67:"Symfony/Component/CssSelector/XPath/Extension/FunctionExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/Extension/FunctionExtension.php";}s:63:"Symfony/Component/CssSelector/XPath/Extension/HtmlExtension.php";a:4:{s:6:"md5sum";s:32:"3ab07740061746645330dd5d41bb211e";s:4:"name";s:63:"Symfony/Component/CssSelector/XPath/Extension/HtmlExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/Extension/HtmlExtension.php";}s:63:"Symfony/Component/CssSelector/XPath/Extension/NodeExtension.php";a:4:{s:6:"md5sum";s:32:"d1f044c7891470c22cdd9ec874cd287d";s:4:"name";s:63:"Symfony/Component/CssSelector/XPath/Extension/NodeExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/Extension/NodeExtension.php";}s:70:"Symfony/Component/CssSelector/XPath/Extension/PseudoClassExtension.php";a:4:{s:6:"md5sum";s:32:"d16abca499c10dc7eede468dc8302dc6";s:4:"name";s:70:"Symfony/Component/CssSelector/XPath/Extension/PseudoClassExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/Extension/PseudoClassExtension.php";}s:50:"Symfony/Component/CssSelector/XPath/Translator.php";a:4:{s:6:"md5sum";s:32:"008dda93517b6aba5b6f149946c576ab";s:4:"name";s:50:"Symfony/Component/CssSelector/XPath/Translator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/Translator.php";}s:59:"Symfony/Component/CssSelector/XPath/TranslatorInterface.php";a:4:{s:6:"md5sum";s:32:"64ba3e247c7e3d046227828a44179c7e";s:4:"name";s:59:"Symfony/Component/CssSelector/XPath/TranslatorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/TranslatorInterface.php";}s:49:"Symfony/Component/CssSelector/XPath/XPathExpr.php";a:4:{s:6:"md5sum";s:32:"e795b62a50ce86fecf5ef2a576cc42bb";s:4:"name";s:49:"Symfony/Component/CssSelector/XPath/XPathExpr.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/XPathExpr.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:26:{s:59:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:75:"/opt/alt/php54/usr/share/doc/pear/CssSelector/Symfony/Component/CssSelector";b:1;s:63:"/opt/alt/php54/usr/share/doc/pear/CssSelector/Symfony/Component";b:1;s:53:"/opt/alt/php54/usr/share/doc/pear/CssSelector/Symfony";b:1;s:45:"/opt/alt/php54/usr/share/doc/pear/CssSelector";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Exception";b:1;s:64:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Node";b:1;s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Handler";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser";b:1;s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Shortcut";b:1;s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/Parser/Tokenizer";b:1;s:76:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector";b:1;s:64:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component";b:1;s:54:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony";b:1;s:46:"/opt/alt/php54/usr/share/pear/test/CssSelector";b:1;s:82:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Node";b:1;s:97:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Handler";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser";b:1;s:98:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/Parser/Shortcut";b:1;s:97:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/XPath/Fixtures";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/CssSelector/Symfony/Component/CssSelector/Tests/XPath";b:1;s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath/Extension";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/CssSelector/XPath";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\��!6dd8pear/.registry/.channel.pear.symfony.com/translation.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:11:"Translation";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:30:"Symfony2 Translation Component";s:11:"description";s:30:"Symfony2 Translation Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:50";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:119:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a23a3ebc32ad216eceb315d156d172df";s:4:"name";s:44:"Symfony/Component/Translation/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1b1901736a193dd839f00675dbe001e1";s:4:"name";s:61:"Symfony/Component/Translation/Catalogue/AbstractOperation.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1facd3924e3312ac6a9f6b9f586d84ae";s:4:"name";s:57:"Symfony/Component/Translation/Catalogue/DiffOperation.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c697c25f56c1bc59faffd23ae1bf5910";s:4:"name";s:58:"Symfony/Component/Translation/Catalogue/MergeOperation.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6b00bea9c66c6934740b6f5735573ed1";s:4:"name";s:62:"Symfony/Component/Translation/Catalogue/OperationInterface.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"33507730a223e93eab19a4481c82d258";s:4:"name";s:42:"Symfony/Component/Translation/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"08bb0002b0d0c9ef06a74417374b0db0";s:4:"name";s:43:"Symfony/Component/Translation/composer.json";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"af3a8b385fed749c0606e72124fc01c8";s:4:"name";s:54:"Symfony/Component/Translation/Dumper/CsvFileDumper.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"97df468b756ed060c2d9002ffb331f4c";s:4:"name";s:56:"Symfony/Component/Translation/Dumper/DumperInterface.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dd3b41f5ce0c7514217ae51ee01fd9b3";s:4:"name";s:51:"Symfony/Component/Translation/Dumper/FileDumper.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a2a5ea6e4a593fdb3ac4eb52b08c8fca";s:4:"name";s:57:"Symfony/Component/Translation/Dumper/IcuResFileDumper.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aa41a897df4b252a6763a7206a64740e";s:4:"name";s:54:"Symfony/Component/Translation/Dumper/IniFileDumper.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"590cefb5e2fdc8d5163101d1dea6c00c";s:4:"name";s:55:"Symfony/Component/Translation/Dumper/JsonFileDumper.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b221f1f93992940b41df842c71612a08";s:4:"name";s:53:"Symfony/Component/Translation/Dumper/MoFileDumper.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a4faacf4648772530eddd7b531a914e";s:4:"name";s:54:"Symfony/Component/Translation/Dumper/PhpFileDumper.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"151ba9edbfad4aad3a01404ed2d08aed";s:4:"name";s:53:"Symfony/Component/Translation/Dumper/PoFileDumper.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"97630cc685afa03a45769ce3c0c2d7b6";s:4:"name";s:53:"Symfony/Component/Translation/Dumper/QtFileDumper.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c50058cbe84ee0d6bc0c4291ac3c89e4";s:4:"name";s:56:"Symfony/Component/Translation/Dumper/XliffFileDumper.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6cb4733897f48f15596acd385bf27e6b";s:4:"name";s:55:"Symfony/Component/Translation/Dumper/YamlFileDumper.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3f815f25d3ba7fb52caf40896c1a3bfe";s:4:"name";s:62:"Symfony/Component/Translation/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2107111761ca276662adca40be545bbe";s:4:"name";s:68:"Symfony/Component/Translation/Exception/InvalidResourceException.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7022eff2bccadddbd74f490fb372cf54";s:4:"name";s:69:"Symfony/Component/Translation/Exception/NotFoundResourceException.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4594ea6e9bb83b2e11669b85cc5124fa";s:4:"name";s:58:"Symfony/Component/Translation/Extractor/ChainExtractor.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63c8d0cc53c869dc53eddb8bf644694a";s:4:"name";s:62:"Symfony/Component/Translation/Extractor/ExtractorInterface.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"be99041f6caf9560d052545df078a511";s:4:"name";s:52:"Symfony/Component/Translation/IdentityTranslator.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"84efe2082056a419a58c16cb7735ca56";s:4:"name";s:42:"Symfony/Component/Translation/Interval.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:37:"Symfony/Component/Translation/LICENSE";s:4:"role";s:3:"doc";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d6585b0daa5d9b9dbd3aec8f1333b890";s:4:"name";s:52:"Symfony/Component/Translation/Loader/ArrayLoader.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6ceb1af587dc0cc6c6545852f2b9f89b";s:4:"name";s:54:"Symfony/Component/Translation/Loader/CsvFileLoader.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ecc212d52f34f5ad922845af7d071fe7";s:4:"name";s:57:"Symfony/Component/Translation/Loader/IcuDatFileLoader.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"66f2c067c6e251949024920f3bb13578";s:4:"name";s:57:"Symfony/Component/Translation/Loader/IcuResFileLoader.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d9f98317740467a87c342bd7e44a2faa";s:4:"name";s:54:"Symfony/Component/Translation/Loader/IniFileLoader.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b744ab916a07e52c924b2d9712172e9";s:4:"name";s:55:"Symfony/Component/Translation/Loader/JsonFileLoader.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d375de50d632c97a369003780044ef6";s:4:"name";s:56:"Symfony/Component/Translation/Loader/LoaderInterface.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"00cd7c30a5185244b22912679da90d12";s:4:"name";s:53:"Symfony/Component/Translation/Loader/MoFileLoader.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bb211aa1fd5d3d46d8f9fc2e0b630bbb";s:4:"name";s:54:"Symfony/Component/Translation/Loader/PhpFileLoader.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7c81a6760f547728df4c0e7137c92cf7";s:4:"name";s:53:"Symfony/Component/Translation/Loader/PoFileLoader.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"50a221b191e5f83a44b03dfa6195ef3c";s:4:"name";s:53:"Symfony/Component/Translation/Loader/QtFileLoader.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fd528a896f7c6792b370930f64e58a2a";s:4:"name";s:84:"Symfony/Component/Translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8b0466500a88d4e511342b555534b991";s:4:"name";s:66:"Symfony/Component/Translation/Loader/schema/dic/xliff-core/xml.xsd";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6f15280899bde6a3c9edb8d87ea9b092";s:4:"name";s:56:"Symfony/Component/Translation/Loader/XliffFileLoader.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d468c9ed70a982ce1a2efc681d674673";s:4:"name";s:55:"Symfony/Component/Translation/Loader/YamlFileLoader.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d151ded1a0038bed7f8c790384cb7eed";s:4:"name";s:50:"Symfony/Component/Translation/MessageCatalogue.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f2204344dcccad5c042762fc39952f2a";s:4:"name";s:59:"Symfony/Component/Translation/MessageCatalogueInterface.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"52bef5f54fe4cf887d90872acba99605";s:4:"name";s:49:"Symfony/Component/Translation/MessageSelector.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"307866c58d58dd1e9370ad0d2c9b172a";s:4:"name";s:56:"Symfony/Component/Translation/MetadataAwareInterface.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"10d8a0a424c95688c056eaf8607eb645";s:4:"name";s:46:"Symfony/Component/Translation/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"72406471bc239d6b3346ca064f67b7aa";s:4:"name";s:52:"Symfony/Component/Translation/PluralizationRules.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cbcc27d78c155093251fccc294affb72";s:4:"name";s:39:"Symfony/Component/Translation/README.md";s:4:"role";s:3:"doc";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ef82bc07c69b7711d658500ab7dd1726";s:4:"name";s:71:"Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTest.php";s:4:"role";s:4:"test";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba72862554b59d792638dd7bbab730f9";s:4:"name";s:67:"Symfony/Component/Translation/Tests/Catalogue/DiffOperationTest.php";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47b9f33d19218deaf1497d67c08212c4";s:4:"name";s:68:"Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php";s:4:"role";s:4:"test";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"44032d28b28576fee4042715bbacf582";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Dumper/CsvFileDumperTest.php";s:4:"role";s:4:"test";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c9821802aa5b2075947b3154d4d111a9";s:4:"name";s:67:"Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php";s:4:"role";s:4:"test";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b655aaa49e41936ffe308420769beead";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Dumper/IniFileDumperTest.php";s:4:"role";s:4:"test";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7777f4777f747b0d66a09b38aba33417";s:4:"name";s:65:"Symfony/Component/Translation/Tests/Dumper/JsonFileDumperTest.php";s:4:"role";s:4:"test";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3691ee670197459ebef5ec634245d931";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Dumper/MoFileDumperTest.php";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f5359d8c55084adf386b7a09f084a314";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Dumper/PhpFileDumperTest.php";s:4:"role";s:4:"test";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f61a83220a0aa1785ea3f8b718cbaed0";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.php";s:4:"role";s:4:"test";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4f15fb0434c84bfda4ce4c7d838f134b";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Dumper/QtFileDumperTest.php";s:4:"role";s:4:"test";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fa10f05c9186753ac947af63fafc4f04";s:4:"name";s:66:"Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php";s:4:"role";s:4:"test";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"06948c7abe303c1e5b7b65b3cd2c6d25";s:4:"name";s:65:"Symfony/Component/Translation/Tests/Dumper/YamlFileDumperTest.php";s:4:"role";s:4:"test";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b1a95afebdd5bf7aea9b2e18853e026d";s:4:"name";s:65:"Symfony/Component/Translation/Tests/fixtures/empty-translation.po";s:4:"role";s:4:"test";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:54:"Symfony/Component/Translation/Tests/fixtures/empty.csv";s:4:"role";s:4:"test";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:54:"Symfony/Component/Translation/Tests/fixtures/empty.ini";s:4:"role";s:4:"test";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:55:"Symfony/Component/Translation/Tests/fixtures/empty.json";s:4:"role";s:4:"test";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:53:"Symfony/Component/Translation/Tests/fixtures/empty.mo";s:4:"role";s:4:"test";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:53:"Symfony/Component/Translation/Tests/fixtures/empty.po";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:54:"Symfony/Component/Translation/Tests/fixtures/empty.xlf";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:54:"Symfony/Component/Translation/Tests/fixtures/empty.yml";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"41f6a7717a25819ac739a14696c0d862";s:4:"name";s:57:"Symfony/Component/Translation/Tests/fixtures/encoding.xlf";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9bbb4b898a5bf5df996cd16e81cf28b8";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/invalid-xml-resources.xlf";s:4:"role";s:4:"test";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4b5652237273550cf07bb6553590ed96";s:4:"name";s:59:"Symfony/Component/Translation/Tests/fixtures/malformed.json";s:4:"role";s:4:"test";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"35641dad0a0e32afc365268d7cb35f5c";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/non-valid.xlf";s:4:"role";s:4:"test";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d3b07384d113edec49eaa6238ad5ff00";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/non-valid.yml";s:4:"role";s:4:"test";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"edbf7f268cd369b124286c4eaccc5da6";s:4:"name";s:55:"Symfony/Component/Translation/Tests/fixtures/plurals.mo";s:4:"role";s:4:"test";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cc4d3e4012a94aa6d416ffba63cec96a";s:4:"name";s:55:"Symfony/Component/Translation/Tests/fixtures/plurals.po";s:4:"role";s:4:"test";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cadcf346671c0adabf12cc639338617c";s:4:"name";s:56:"Symfony/Component/Translation/Tests/fixtures/resname.xlf";s:4:"role";s:4:"test";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bc9189406be84ec297464a514221406d";s:4:"name";s:83:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted/resources.dat";s:4:"role";s:4:"test";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d3d7cb5315b72e8a10083800232f975c";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.res";s:4:"role";s:4:"test";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"59bc61ceb778cfdad1353e72a91da038";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.txt";s:4:"role";s:4:"test";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bd4fd753b32b205184d61fe901f3cc99";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.res";s:4:"role";s:4:"test";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63b6f57aed45358ce8ee735e7d358369";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.txt";s:4:"role";s:4:"test";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a784644791b85cf23524cb50532459a9";s:4:"name";s:79:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/packagelist.txt";s:4:"role";s:4:"test";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5db6756e72842744a2f79e7976a27b27";s:4:"name";s:77:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/resources.dat";s:4:"role";s:4:"test";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"936c6496f075090509a4124930e62c25";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/res/en.res";s:4:"role";s:4:"test";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ca509ddac95802697c6409b6bdc24d6c";s:4:"name";s:64:"Symfony/Component/Translation/Tests/fixtures/resources-clean.xlf";s:4:"role";s:4:"test";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"349115d44a4b2b57ec0e12d5de001c1f";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/resources.csv";s:4:"role";s:4:"test";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a1c5d4a3d4363448836f7df17bd3dac9";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/resources.ini";s:4:"role";s:4:"test";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c4739e97d2e782ab9142b7cad4e36383";s:4:"name";s:59:"Symfony/Component/Translation/Tests/fixtures/resources.json";s:4:"role";s:4:"test";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"338bee6e134993372c561235d85caf5b";s:4:"name";s:57:"Symfony/Component/Translation/Tests/fixtures/resources.mo";s:4:"role";s:4:"test";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e5269ae0ff8b573e8e88b98a013a97de";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/resources.php";s:4:"role";s:4:"test";}}i:92;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ebffc260ffc01b8dd02a6a548b13f7a4";s:4:"name";s:57:"Symfony/Component/Translation/Tests/fixtures/resources.po";s:4:"role";s:4:"test";}}i:93;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"01ebead5e039c0d1301339fef7b7fd18";s:4:"name";s:57:"Symfony/Component/Translation/Tests/fixtures/resources.ts";s:4:"role";s:4:"test";}}i:94;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3046798068871c144081a6dad3f88e3d";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/resources.xlf";s:4:"role";s:4:"test";}}i:95;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"721aad13918f292d25bc9dc7d61b0e9c";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/resources.yml";s:4:"role";s:4:"test";}}i:96;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f22180b9a31a19606112508410f0806f";s:4:"name";s:54:"Symfony/Component/Translation/Tests/fixtures/valid.csv";s:4:"role";s:4:"test";}}i:97;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a566717bf4a4cdca4fa6d9f26b9887d";s:4:"name";s:60:"Symfony/Component/Translation/Tests/fixtures/withdoctype.xlf";s:4:"role";s:4:"test";}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b92bc0ed64d6ace1904940ebacb42a9d";s:4:"name";s:62:"Symfony/Component/Translation/Tests/IdentityTranslatorTest.php";s:4:"role";s:4:"test";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4c7466038f4c30f7e11bdf01f9de3917";s:4:"name";s:52:"Symfony/Component/Translation/Tests/IntervalTest.php";s:4:"role";s:4:"test";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c56f359209f462724e5c38d54d04aef7";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.php";s:4:"role";s:4:"test";}}i:101;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"148fb17fa10a63d083608ee34425f515";s:4:"name";s:67:"Symfony/Component/Translation/Tests/Loader/IcuDatFileLoaderTest.php";s:4:"role";s:4:"test";}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8db7645334a7fce25b180ee1e8727e12";s:4:"name";s:67:"Symfony/Component/Translation/Tests/Loader/IcuResFileLoaderTest.php";s:4:"role";s:4:"test";}}i:103;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eeb81233e12eacec0fd177f1945d73e3";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Loader/IniFileLoaderTest.php";s:4:"role";s:4:"test";}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e717797c994506a18cc642bba845e0bc";s:4:"name";s:65:"Symfony/Component/Translation/Tests/Loader/JsonFileLoaderTest.php";s:4:"role";s:4:"test";}}i:105;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7d906668f133a0c8ad7c7fcb5770d134";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Loader/LocalizedTestCase.php";s:4:"role";s:4:"test";}}i:106;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e918b2beafc848955034c08ea5cd56a5";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Loader/MoFileLoaderTest.php";s:4:"role";s:4:"test";}}i:107;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8a494f3c229871a27bb9fab851bb385b";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Loader/PhpFileLoaderTest.php";s:4:"role";s:4:"test";}}i:108;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"12960276054dc25012433c4e567d57b4";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.php";s:4:"role";s:4:"test";}}i:109;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2722873e9cf782a84462ce616be95f22";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Loader/QtFileLoaderTest.php";s:4:"role";s:4:"test";}}i:110;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ae55951ec7a0b72a091921a92ff76992";s:4:"name";s:66:"Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php";s:4:"role";s:4:"test";}}i:111;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b14fcada262a8c6207dd0cc66ec1242b";s:4:"name";s:65:"Symfony/Component/Translation/Tests/Loader/YamlFileLoaderTest.php";s:4:"role";s:4:"test";}}i:112;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"872c308ce18aec6300ccf4528c935a19";s:4:"name";s:60:"Symfony/Component/Translation/Tests/MessageCatalogueTest.php";s:4:"role";s:4:"test";}}i:113;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c958676ddc85bc7f30a74a48cd800ece";s:4:"name";s:59:"Symfony/Component/Translation/Tests/MessageSelectorTest.php";s:4:"role";s:4:"test";}}i:114;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a8205b61d5bb55f454536626190c7644";s:4:"name";s:62:"Symfony/Component/Translation/Tests/PluralizationRulesTest.php";s:4:"role";s:4:"test";}}i:115;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c186f9c867c206f22c1d85c81a6079d0";s:4:"name";s:54:"Symfony/Component/Translation/Tests/TranslatorTest.php";s:4:"role";s:4:"test";}}i:116;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d001250c9d39b0e193dc7952d7a81380";s:4:"name";s:44:"Symfony/Component/Translation/Translator.php";s:4:"role";s:3:"php";}}i:117;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5ce4343a5bf5d91357af795a7e800158";s:4:"name";s:53:"Symfony/Component/Translation/TranslatorInterface.php";s:4:"role";s:3:"php";}}i:118;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"292d9794772f9374b181254742a2428b";s:4:"name";s:58:"Symfony/Component/Translation/Writer/TranslationWriter.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}s:8:"optional";a:1:{s:7:"package";a:2:{s:4:"name";s:6:"Config";s:7:"channel";s:16:"pear.symfony.com";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:119:{s:44:"Symfony/Component/Translation/autoloader.php";a:4:{s:6:"md5sum";s:32:"a23a3ebc32ad216eceb315d156d172df";s:4:"name";s:44:"Symfony/Component/Translation/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/autoloader.php";}s:61:"Symfony/Component/Translation/Catalogue/AbstractOperation.php";a:4:{s:6:"md5sum";s:32:"1b1901736a193dd839f00675dbe001e1";s:4:"name";s:61:"Symfony/Component/Translation/Catalogue/AbstractOperation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Catalogue/AbstractOperation.php";}s:57:"Symfony/Component/Translation/Catalogue/DiffOperation.php";a:4:{s:6:"md5sum";s:32:"1facd3924e3312ac6a9f6b9f586d84ae";s:4:"name";s:57:"Symfony/Component/Translation/Catalogue/DiffOperation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Catalogue/DiffOperation.php";}s:58:"Symfony/Component/Translation/Catalogue/MergeOperation.php";a:4:{s:6:"md5sum";s:32:"c697c25f56c1bc59faffd23ae1bf5910";s:4:"name";s:58:"Symfony/Component/Translation/Catalogue/MergeOperation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Catalogue/MergeOperation.php";}s:62:"Symfony/Component/Translation/Catalogue/OperationInterface.php";a:4:{s:6:"md5sum";s:32:"6b00bea9c66c6934740b6f5735573ed1";s:4:"name";s:62:"Symfony/Component/Translation/Catalogue/OperationInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Catalogue/OperationInterface.php";}s:42:"Symfony/Component/Translation/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"33507730a223e93eab19a4481c82d258";s:4:"name";s:42:"Symfony/Component/Translation/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/doc/pear/Translation/Symfony/Component/Translation/CHANGELOG.md";}s:43:"Symfony/Component/Translation/composer.json";a:4:{s:6:"md5sum";s:32:"08bb0002b0d0c9ef06a74417374b0db0";s:4:"name";s:43:"Symfony/Component/Translation/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/doc/pear/Translation/Symfony/Component/Translation/composer.json";}s:54:"Symfony/Component/Translation/Dumper/CsvFileDumper.php";a:4:{s:6:"md5sum";s:32:"af3a8b385fed749c0606e72124fc01c8";s:4:"name";s:54:"Symfony/Component/Translation/Dumper/CsvFileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/CsvFileDumper.php";}s:56:"Symfony/Component/Translation/Dumper/DumperInterface.php";a:4:{s:6:"md5sum";s:32:"97df468b756ed060c2d9002ffb331f4c";s:4:"name";s:56:"Symfony/Component/Translation/Dumper/DumperInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/DumperInterface.php";}s:51:"Symfony/Component/Translation/Dumper/FileDumper.php";a:4:{s:6:"md5sum";s:32:"dd3b41f5ce0c7514217ae51ee01fd9b3";s:4:"name";s:51:"Symfony/Component/Translation/Dumper/FileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/FileDumper.php";}s:57:"Symfony/Component/Translation/Dumper/IcuResFileDumper.php";a:4:{s:6:"md5sum";s:32:"a2a5ea6e4a593fdb3ac4eb52b08c8fca";s:4:"name";s:57:"Symfony/Component/Translation/Dumper/IcuResFileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/IcuResFileDumper.php";}s:54:"Symfony/Component/Translation/Dumper/IniFileDumper.php";a:4:{s:6:"md5sum";s:32:"aa41a897df4b252a6763a7206a64740e";s:4:"name";s:54:"Symfony/Component/Translation/Dumper/IniFileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/IniFileDumper.php";}s:55:"Symfony/Component/Translation/Dumper/JsonFileDumper.php";a:4:{s:6:"md5sum";s:32:"590cefb5e2fdc8d5163101d1dea6c00c";s:4:"name";s:55:"Symfony/Component/Translation/Dumper/JsonFileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/JsonFileDumper.php";}s:53:"Symfony/Component/Translation/Dumper/MoFileDumper.php";a:4:{s:6:"md5sum";s:32:"b221f1f93992940b41df842c71612a08";s:4:"name";s:53:"Symfony/Component/Translation/Dumper/MoFileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/MoFileDumper.php";}s:54:"Symfony/Component/Translation/Dumper/PhpFileDumper.php";a:4:{s:6:"md5sum";s:32:"3a4faacf4648772530eddd7b531a914e";s:4:"name";s:54:"Symfony/Component/Translation/Dumper/PhpFileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/PhpFileDumper.php";}s:53:"Symfony/Component/Translation/Dumper/PoFileDumper.php";a:4:{s:6:"md5sum";s:32:"151ba9edbfad4aad3a01404ed2d08aed";s:4:"name";s:53:"Symfony/Component/Translation/Dumper/PoFileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/PoFileDumper.php";}s:53:"Symfony/Component/Translation/Dumper/QtFileDumper.php";a:4:{s:6:"md5sum";s:32:"97630cc685afa03a45769ce3c0c2d7b6";s:4:"name";s:53:"Symfony/Component/Translation/Dumper/QtFileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/QtFileDumper.php";}s:56:"Symfony/Component/Translation/Dumper/XliffFileDumper.php";a:4:{s:6:"md5sum";s:32:"c50058cbe84ee0d6bc0c4291ac3c89e4";s:4:"name";s:56:"Symfony/Component/Translation/Dumper/XliffFileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/XliffFileDumper.php";}s:55:"Symfony/Component/Translation/Dumper/YamlFileDumper.php";a:4:{s:6:"md5sum";s:32:"6cb4733897f48f15596acd385bf27e6b";s:4:"name";s:55:"Symfony/Component/Translation/Dumper/YamlFileDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper/YamlFileDumper.php";}s:62:"Symfony/Component/Translation/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"3f815f25d3ba7fb52caf40896c1a3bfe";s:4:"name";s:62:"Symfony/Component/Translation/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Exception/ExceptionInterface.php";}s:68:"Symfony/Component/Translation/Exception/InvalidResourceException.php";a:4:{s:6:"md5sum";s:32:"2107111761ca276662adca40be545bbe";s:4:"name";s:68:"Symfony/Component/Translation/Exception/InvalidResourceException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Exception/InvalidResourceException.php";}s:69:"Symfony/Component/Translation/Exception/NotFoundResourceException.php";a:4:{s:6:"md5sum";s:32:"7022eff2bccadddbd74f490fb372cf54";s:4:"name";s:69:"Symfony/Component/Translation/Exception/NotFoundResourceException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Exception/NotFoundResourceException.php";}s:58:"Symfony/Component/Translation/Extractor/ChainExtractor.php";a:4:{s:6:"md5sum";s:32:"4594ea6e9bb83b2e11669b85cc5124fa";s:4:"name";s:58:"Symfony/Component/Translation/Extractor/ChainExtractor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Extractor/ChainExtractor.php";}s:62:"Symfony/Component/Translation/Extractor/ExtractorInterface.php";a:4:{s:6:"md5sum";s:32:"63c8d0cc53c869dc53eddb8bf644694a";s:4:"name";s:62:"Symfony/Component/Translation/Extractor/ExtractorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Extractor/ExtractorInterface.php";}s:52:"Symfony/Component/Translation/IdentityTranslator.php";a:4:{s:6:"md5sum";s:32:"be99041f6caf9560d052545df078a511";s:4:"name";s:52:"Symfony/Component/Translation/IdentityTranslator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/IdentityTranslator.php";}s:42:"Symfony/Component/Translation/Interval.php";a:4:{s:6:"md5sum";s:32:"84efe2082056a419a58c16cb7735ca56";s:4:"name";s:42:"Symfony/Component/Translation/Interval.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Interval.php";}s:37:"Symfony/Component/Translation/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:37:"Symfony/Component/Translation/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/Translation/Symfony/Component/Translation/LICENSE";}s:52:"Symfony/Component/Translation/Loader/ArrayLoader.php";a:4:{s:6:"md5sum";s:32:"d6585b0daa5d9b9dbd3aec8f1333b890";s:4:"name";s:52:"Symfony/Component/Translation/Loader/ArrayLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/ArrayLoader.php";}s:54:"Symfony/Component/Translation/Loader/CsvFileLoader.php";a:4:{s:6:"md5sum";s:32:"6ceb1af587dc0cc6c6545852f2b9f89b";s:4:"name";s:54:"Symfony/Component/Translation/Loader/CsvFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/CsvFileLoader.php";}s:57:"Symfony/Component/Translation/Loader/IcuDatFileLoader.php";a:4:{s:6:"md5sum";s:32:"ecc212d52f34f5ad922845af7d071fe7";s:4:"name";s:57:"Symfony/Component/Translation/Loader/IcuDatFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/IcuDatFileLoader.php";}s:57:"Symfony/Component/Translation/Loader/IcuResFileLoader.php";a:4:{s:6:"md5sum";s:32:"66f2c067c6e251949024920f3bb13578";s:4:"name";s:57:"Symfony/Component/Translation/Loader/IcuResFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/IcuResFileLoader.php";}s:54:"Symfony/Component/Translation/Loader/IniFileLoader.php";a:4:{s:6:"md5sum";s:32:"d9f98317740467a87c342bd7e44a2faa";s:4:"name";s:54:"Symfony/Component/Translation/Loader/IniFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/IniFileLoader.php";}s:55:"Symfony/Component/Translation/Loader/JsonFileLoader.php";a:4:{s:6:"md5sum";s:32:"5b744ab916a07e52c924b2d9712172e9";s:4:"name";s:55:"Symfony/Component/Translation/Loader/JsonFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/JsonFileLoader.php";}s:56:"Symfony/Component/Translation/Loader/LoaderInterface.php";a:4:{s:6:"md5sum";s:32:"8d375de50d632c97a369003780044ef6";s:4:"name";s:56:"Symfony/Component/Translation/Loader/LoaderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/LoaderInterface.php";}s:53:"Symfony/Component/Translation/Loader/MoFileLoader.php";a:4:{s:6:"md5sum";s:32:"00cd7c30a5185244b22912679da90d12";s:4:"name";s:53:"Symfony/Component/Translation/Loader/MoFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/MoFileLoader.php";}s:54:"Symfony/Component/Translation/Loader/PhpFileLoader.php";a:4:{s:6:"md5sum";s:32:"bb211aa1fd5d3d46d8f9fc2e0b630bbb";s:4:"name";s:54:"Symfony/Component/Translation/Loader/PhpFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/PhpFileLoader.php";}s:53:"Symfony/Component/Translation/Loader/PoFileLoader.php";a:4:{s:6:"md5sum";s:32:"7c81a6760f547728df4c0e7137c92cf7";s:4:"name";s:53:"Symfony/Component/Translation/Loader/PoFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/PoFileLoader.php";}s:53:"Symfony/Component/Translation/Loader/QtFileLoader.php";a:4:{s:6:"md5sum";s:32:"50a221b191e5f83a44b03dfa6195ef3c";s:4:"name";s:53:"Symfony/Component/Translation/Loader/QtFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/QtFileLoader.php";}s:84:"Symfony/Component/Translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd";a:4:{s:6:"md5sum";s:32:"fd528a896f7c6792b370930f64e58a2a";s:4:"name";s:84:"Symfony/Component/Translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd";s:4:"role";s:3:"php";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd";}s:66:"Symfony/Component/Translation/Loader/schema/dic/xliff-core/xml.xsd";a:4:{s:6:"md5sum";s:32:"8b0466500a88d4e511342b555534b991";s:4:"name";s:66:"Symfony/Component/Translation/Loader/schema/dic/xliff-core/xml.xsd";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xml.xsd";}s:56:"Symfony/Component/Translation/Loader/XliffFileLoader.php";a:4:{s:6:"md5sum";s:32:"6f15280899bde6a3c9edb8d87ea9b092";s:4:"name";s:56:"Symfony/Component/Translation/Loader/XliffFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/XliffFileLoader.php";}s:55:"Symfony/Component/Translation/Loader/YamlFileLoader.php";a:4:{s:6:"md5sum";s:32:"d468c9ed70a982ce1a2efc681d674673";s:4:"name";s:55:"Symfony/Component/Translation/Loader/YamlFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/YamlFileLoader.php";}s:50:"Symfony/Component/Translation/MessageCatalogue.php";a:4:{s:6:"md5sum";s:32:"d151ded1a0038bed7f8c790384cb7eed";s:4:"name";s:50:"Symfony/Component/Translation/MessageCatalogue.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/MessageCatalogue.php";}s:59:"Symfony/Component/Translation/MessageCatalogueInterface.php";a:4:{s:6:"md5sum";s:32:"f2204344dcccad5c042762fc39952f2a";s:4:"name";s:59:"Symfony/Component/Translation/MessageCatalogueInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/MessageCatalogueInterface.php";}s:49:"Symfony/Component/Translation/MessageSelector.php";a:4:{s:6:"md5sum";s:32:"52bef5f54fe4cf887d90872acba99605";s:4:"name";s:49:"Symfony/Component/Translation/MessageSelector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/MessageSelector.php";}s:56:"Symfony/Component/Translation/MetadataAwareInterface.php";a:4:{s:6:"md5sum";s:32:"307866c58d58dd1e9370ad0d2c9b172a";s:4:"name";s:56:"Symfony/Component/Translation/MetadataAwareInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/MetadataAwareInterface.php";}s:46:"Symfony/Component/Translation/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"10d8a0a424c95688c056eaf8607eb645";s:4:"name";s:46:"Symfony/Component/Translation/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/phpunit.xml.dist";}s:52:"Symfony/Component/Translation/PluralizationRules.php";a:4:{s:6:"md5sum";s:32:"72406471bc239d6b3346ca064f67b7aa";s:4:"name";s:52:"Symfony/Component/Translation/PluralizationRules.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/PluralizationRules.php";}s:39:"Symfony/Component/Translation/README.md";a:4:{s:6:"md5sum";s:32:"cbcc27d78c155093251fccc294affb72";s:4:"name";s:39:"Symfony/Component/Translation/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/doc/pear/Translation/Symfony/Component/Translation/README.md";}s:71:"Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTest.php";a:4:{s:6:"md5sum";s:32:"ef82bc07c69b7711d658500ab7dd1726";s:4:"name";s:71:"Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTest.php";}s:67:"Symfony/Component/Translation/Tests/Catalogue/DiffOperationTest.php";a:4:{s:6:"md5sum";s:32:"ba72862554b59d792638dd7bbab730f9";s:4:"name";s:67:"Symfony/Component/Translation/Tests/Catalogue/DiffOperationTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Catalogue/DiffOperationTest.php";}s:68:"Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php";a:4:{s:6:"md5sum";s:32:"47b9f33d19218deaf1497d67c08212c4";s:4:"name";s:68:"Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php";}s:64:"Symfony/Component/Translation/Tests/Dumper/CsvFileDumperTest.php";a:4:{s:6:"md5sum";s:32:"44032d28b28576fee4042715bbacf582";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Dumper/CsvFileDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper/CsvFileDumperTest.php";}s:67:"Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php";a:4:{s:6:"md5sum";s:32:"c9821802aa5b2075947b3154d4d111a9";s:4:"name";s:67:"Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php";}s:64:"Symfony/Component/Translation/Tests/Dumper/IniFileDumperTest.php";a:4:{s:6:"md5sum";s:32:"b655aaa49e41936ffe308420769beead";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Dumper/IniFileDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper/IniFileDumperTest.php";}s:65:"Symfony/Component/Translation/Tests/Dumper/JsonFileDumperTest.php";a:4:{s:6:"md5sum";s:32:"7777f4777f747b0d66a09b38aba33417";s:4:"name";s:65:"Symfony/Component/Translation/Tests/Dumper/JsonFileDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper/JsonFileDumperTest.php";}s:63:"Symfony/Component/Translation/Tests/Dumper/MoFileDumperTest.php";a:4:{s:6:"md5sum";s:32:"3691ee670197459ebef5ec634245d931";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Dumper/MoFileDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper/MoFileDumperTest.php";}s:64:"Symfony/Component/Translation/Tests/Dumper/PhpFileDumperTest.php";a:4:{s:6:"md5sum";s:32:"f5359d8c55084adf386b7a09f084a314";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Dumper/PhpFileDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper/PhpFileDumperTest.php";}s:63:"Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.php";a:4:{s:6:"md5sum";s:32:"f61a83220a0aa1785ea3f8b718cbaed0";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.php";}s:63:"Symfony/Component/Translation/Tests/Dumper/QtFileDumperTest.php";a:4:{s:6:"md5sum";s:32:"4f15fb0434c84bfda4ce4c7d838f134b";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Dumper/QtFileDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper/QtFileDumperTest.php";}s:66:"Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php";a:4:{s:6:"md5sum";s:32:"fa10f05c9186753ac947af63fafc4f04";s:4:"name";s:66:"Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php";}s:65:"Symfony/Component/Translation/Tests/Dumper/YamlFileDumperTest.php";a:4:{s:6:"md5sum";s:32:"06948c7abe303c1e5b7b65b3cd2c6d25";s:4:"name";s:65:"Symfony/Component/Translation/Tests/Dumper/YamlFileDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper/YamlFileDumperTest.php";}s:65:"Symfony/Component/Translation/Tests/fixtures/empty-translation.po";a:4:{s:6:"md5sum";s:32:"b1a95afebdd5bf7aea9b2e18853e026d";s:4:"name";s:65:"Symfony/Component/Translation/Tests/fixtures/empty-translation.po";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty-translation.po";}s:54:"Symfony/Component/Translation/Tests/fixtures/empty.csv";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:54:"Symfony/Component/Translation/Tests/fixtures/empty.csv";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.csv";}s:54:"Symfony/Component/Translation/Tests/fixtures/empty.ini";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:54:"Symfony/Component/Translation/Tests/fixtures/empty.ini";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.ini";}s:55:"Symfony/Component/Translation/Tests/fixtures/empty.json";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:55:"Symfony/Component/Translation/Tests/fixtures/empty.json";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.json";}s:53:"Symfony/Component/Translation/Tests/fixtures/empty.mo";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:53:"Symfony/Component/Translation/Tests/fixtures/empty.mo";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.mo";}s:53:"Symfony/Component/Translation/Tests/fixtures/empty.po";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:53:"Symfony/Component/Translation/Tests/fixtures/empty.po";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.po";}s:54:"Symfony/Component/Translation/Tests/fixtures/empty.xlf";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:54:"Symfony/Component/Translation/Tests/fixtures/empty.xlf";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.xlf";}s:54:"Symfony/Component/Translation/Tests/fixtures/empty.yml";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:54:"Symfony/Component/Translation/Tests/fixtures/empty.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.yml";}s:57:"Symfony/Component/Translation/Tests/fixtures/encoding.xlf";a:4:{s:6:"md5sum";s:32:"41f6a7717a25819ac739a14696c0d862";s:4:"name";s:57:"Symfony/Component/Translation/Tests/fixtures/encoding.xlf";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/encoding.xlf";}s:70:"Symfony/Component/Translation/Tests/fixtures/invalid-xml-resources.xlf";a:4:{s:6:"md5sum";s:32:"9bbb4b898a5bf5df996cd16e81cf28b8";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/invalid-xml-resources.xlf";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/invalid-xml-resources.xlf";}s:59:"Symfony/Component/Translation/Tests/fixtures/malformed.json";a:4:{s:6:"md5sum";s:32:"4b5652237273550cf07bb6553590ed96";s:4:"name";s:59:"Symfony/Component/Translation/Tests/fixtures/malformed.json";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/malformed.json";}s:58:"Symfony/Component/Translation/Tests/fixtures/non-valid.xlf";a:4:{s:6:"md5sum";s:32:"35641dad0a0e32afc365268d7cb35f5c";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/non-valid.xlf";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/non-valid.xlf";}s:58:"Symfony/Component/Translation/Tests/fixtures/non-valid.yml";a:4:{s:6:"md5sum";s:32:"d3b07384d113edec49eaa6238ad5ff00";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/non-valid.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/non-valid.yml";}s:55:"Symfony/Component/Translation/Tests/fixtures/plurals.mo";a:4:{s:6:"md5sum";s:32:"edbf7f268cd369b124286c4eaccc5da6";s:4:"name";s:55:"Symfony/Component/Translation/Tests/fixtures/plurals.mo";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/plurals.mo";}s:55:"Symfony/Component/Translation/Tests/fixtures/plurals.po";a:4:{s:6:"md5sum";s:32:"cc4d3e4012a94aa6d416ffba63cec96a";s:4:"name";s:55:"Symfony/Component/Translation/Tests/fixtures/plurals.po";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/plurals.po";}s:56:"Symfony/Component/Translation/Tests/fixtures/resname.xlf";a:4:{s:6:"md5sum";s:32:"cadcf346671c0adabf12cc639338617c";s:4:"name";s:56:"Symfony/Component/Translation/Tests/fixtures/resname.xlf";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resname.xlf";}s:83:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted/resources.dat";a:4:{s:6:"md5sum";s:32:"bc9189406be84ec297464a514221406d";s:4:"name";s:83:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted/resources.dat";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted/resources.dat";}s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.res";a:4:{s:6:"md5sum";s:32:"d3d7cb5315b72e8a10083800232f975c";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.res";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.res";}s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.txt";a:4:{s:6:"md5sum";s:32:"59bc61ceb778cfdad1353e72a91da038";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.txt";}s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.res";a:4:{s:6:"md5sum";s:32:"bd4fd753b32b205184d61fe901f3cc99";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.res";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.res";}s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.txt";a:4:{s:6:"md5sum";s:32:"63b6f57aed45358ce8ee735e7d358369";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.txt";}s:79:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/packagelist.txt";a:4:{s:6:"md5sum";s:32:"a784644791b85cf23524cb50532459a9";s:4:"name";s:79:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/packagelist.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/packagelist.txt";}s:77:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/resources.dat";a:4:{s:6:"md5sum";s:32:"5db6756e72842744a2f79e7976a27b27";s:4:"name";s:77:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/resources.dat";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/resources.dat";}s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/res/en.res";a:4:{s:6:"md5sum";s:32:"936c6496f075090509a4124930e62c25";s:4:"name";s:70:"Symfony/Component/Translation/Tests/fixtures/resourcebundle/res/en.res";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/res/en.res";}s:64:"Symfony/Component/Translation/Tests/fixtures/resources-clean.xlf";a:4:{s:6:"md5sum";s:32:"ca509ddac95802697c6409b6bdc24d6c";s:4:"name";s:64:"Symfony/Component/Translation/Tests/fixtures/resources-clean.xlf";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources-clean.xlf";}s:58:"Symfony/Component/Translation/Tests/fixtures/resources.csv";a:4:{s:6:"md5sum";s:32:"349115d44a4b2b57ec0e12d5de001c1f";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/resources.csv";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.csv";}s:58:"Symfony/Component/Translation/Tests/fixtures/resources.ini";a:4:{s:6:"md5sum";s:32:"a1c5d4a3d4363448836f7df17bd3dac9";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/resources.ini";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.ini";}s:59:"Symfony/Component/Translation/Tests/fixtures/resources.json";a:4:{s:6:"md5sum";s:32:"c4739e97d2e782ab9142b7cad4e36383";s:4:"name";s:59:"Symfony/Component/Translation/Tests/fixtures/resources.json";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.json";}s:57:"Symfony/Component/Translation/Tests/fixtures/resources.mo";a:4:{s:6:"md5sum";s:32:"338bee6e134993372c561235d85caf5b";s:4:"name";s:57:"Symfony/Component/Translation/Tests/fixtures/resources.mo";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.mo";}s:58:"Symfony/Component/Translation/Tests/fixtures/resources.php";a:4:{s:6:"md5sum";s:32:"e5269ae0ff8b573e8e88b98a013a97de";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/resources.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.php";}s:57:"Symfony/Component/Translation/Tests/fixtures/resources.po";a:4:{s:6:"md5sum";s:32:"ebffc260ffc01b8dd02a6a548b13f7a4";s:4:"name";s:57:"Symfony/Component/Translation/Tests/fixtures/resources.po";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.po";}s:57:"Symfony/Component/Translation/Tests/fixtures/resources.ts";a:4:{s:6:"md5sum";s:32:"01ebead5e039c0d1301339fef7b7fd18";s:4:"name";s:57:"Symfony/Component/Translation/Tests/fixtures/resources.ts";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.ts";}s:58:"Symfony/Component/Translation/Tests/fixtures/resources.xlf";a:4:{s:6:"md5sum";s:32:"3046798068871c144081a6dad3f88e3d";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/resources.xlf";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.xlf";}s:58:"Symfony/Component/Translation/Tests/fixtures/resources.yml";a:4:{s:6:"md5sum";s:32:"721aad13918f292d25bc9dc7d61b0e9c";s:4:"name";s:58:"Symfony/Component/Translation/Tests/fixtures/resources.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.yml";}s:54:"Symfony/Component/Translation/Tests/fixtures/valid.csv";a:4:{s:6:"md5sum";s:32:"f22180b9a31a19606112508410f0806f";s:4:"name";s:54:"Symfony/Component/Translation/Tests/fixtures/valid.csv";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/valid.csv";}s:60:"Symfony/Component/Translation/Tests/fixtures/withdoctype.xlf";a:4:{s:6:"md5sum";s:32:"3a566717bf4a4cdca4fa6d9f26b9887d";s:4:"name";s:60:"Symfony/Component/Translation/Tests/fixtures/withdoctype.xlf";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/withdoctype.xlf";}s:62:"Symfony/Component/Translation/Tests/IdentityTranslatorTest.php";a:4:{s:6:"md5sum";s:32:"b92bc0ed64d6ace1904940ebacb42a9d";s:4:"name";s:62:"Symfony/Component/Translation/Tests/IdentityTranslatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/IdentityTranslatorTest.php";}s:52:"Symfony/Component/Translation/Tests/IntervalTest.php";a:4:{s:6:"md5sum";s:32:"4c7466038f4c30f7e11bdf01f9de3917";s:4:"name";s:52:"Symfony/Component/Translation/Tests/IntervalTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/IntervalTest.php";}s:64:"Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"c56f359209f462724e5c38d54d04aef7";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.php";}s:67:"Symfony/Component/Translation/Tests/Loader/IcuDatFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"148fb17fa10a63d083608ee34425f515";s:4:"name";s:67:"Symfony/Component/Translation/Tests/Loader/IcuDatFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/IcuDatFileLoaderTest.php";}s:67:"Symfony/Component/Translation/Tests/Loader/IcuResFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"8db7645334a7fce25b180ee1e8727e12";s:4:"name";s:67:"Symfony/Component/Translation/Tests/Loader/IcuResFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/IcuResFileLoaderTest.php";}s:64:"Symfony/Component/Translation/Tests/Loader/IniFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"eeb81233e12eacec0fd177f1945d73e3";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Loader/IniFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/IniFileLoaderTest.php";}s:65:"Symfony/Component/Translation/Tests/Loader/JsonFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"e717797c994506a18cc642bba845e0bc";s:4:"name";s:65:"Symfony/Component/Translation/Tests/Loader/JsonFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/JsonFileLoaderTest.php";}s:64:"Symfony/Component/Translation/Tests/Loader/LocalizedTestCase.php";a:4:{s:6:"md5sum";s:32:"7d906668f133a0c8ad7c7fcb5770d134";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Loader/LocalizedTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/LocalizedTestCase.php";}s:63:"Symfony/Component/Translation/Tests/Loader/MoFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"e918b2beafc848955034c08ea5cd56a5";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Loader/MoFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/MoFileLoaderTest.php";}s:64:"Symfony/Component/Translation/Tests/Loader/PhpFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"8a494f3c229871a27bb9fab851bb385b";s:4:"name";s:64:"Symfony/Component/Translation/Tests/Loader/PhpFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/PhpFileLoaderTest.php";}s:63:"Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"12960276054dc25012433c4e567d57b4";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.php";}s:63:"Symfony/Component/Translation/Tests/Loader/QtFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"2722873e9cf782a84462ce616be95f22";s:4:"name";s:63:"Symfony/Component/Translation/Tests/Loader/QtFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/QtFileLoaderTest.php";}s:66:"Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"ae55951ec7a0b72a091921a92ff76992";s:4:"name";s:66:"Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php";}s:65:"Symfony/Component/Translation/Tests/Loader/YamlFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"b14fcada262a8c6207dd0cc66ec1242b";s:4:"name";s:65:"Symfony/Component/Translation/Tests/Loader/YamlFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader/YamlFileLoaderTest.php";}s:60:"Symfony/Component/Translation/Tests/MessageCatalogueTest.php";a:4:{s:6:"md5sum";s:32:"872c308ce18aec6300ccf4528c935a19";s:4:"name";s:60:"Symfony/Component/Translation/Tests/MessageCatalogueTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/MessageCatalogueTest.php";}s:59:"Symfony/Component/Translation/Tests/MessageSelectorTest.php";a:4:{s:6:"md5sum";s:32:"c958676ddc85bc7f30a74a48cd800ece";s:4:"name";s:59:"Symfony/Component/Translation/Tests/MessageSelectorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/MessageSelectorTest.php";}s:62:"Symfony/Component/Translation/Tests/PluralizationRulesTest.php";a:4:{s:6:"md5sum";s:32:"a8205b61d5bb55f454536626190c7644";s:4:"name";s:62:"Symfony/Component/Translation/Tests/PluralizationRulesTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.php";}s:54:"Symfony/Component/Translation/Tests/TranslatorTest.php";a:4:{s:6:"md5sum";s:32:"c186f9c867c206f22c1d85c81a6079d0";s:4:"name";s:54:"Symfony/Component/Translation/Tests/TranslatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/TranslatorTest.php";}s:44:"Symfony/Component/Translation/Translator.php";a:4:{s:6:"md5sum";s:32:"d001250c9d39b0e193dc7952d7a81380";s:4:"name";s:44:"Symfony/Component/Translation/Translator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Translator.php";}s:53:"Symfony/Component/Translation/TranslatorInterface.php";a:4:{s:6:"md5sum";s:32:"5ce4343a5bf5d91357af795a7e800158";s:4:"name";s:53:"Symfony/Component/Translation/TranslatorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/TranslatorInterface.php";}s:58:"Symfony/Component/Translation/Writer/TranslationWriter.php";a:4:{s:6:"md5sum";s:32:"292d9794772f9374b181254742a2428b";s:4:"name";s:58:"Symfony/Component/Translation/Writer/TranslationWriter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Writer/TranslationWriter.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:29:{s:59:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Catalogue";b:1;s:75:"/opt/alt/php54/usr/share/doc/pear/Translation/Symfony/Component/Translation";b:1;s:63:"/opt/alt/php54/usr/share/doc/pear/Translation/Symfony/Component";b:1;s:53:"/opt/alt/php54/usr/share/doc/pear/Translation/Symfony";b:1;s:45:"/opt/alt/php54/usr/share/doc/pear/Translation";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Dumper";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Exception";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Extractor";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader";b:1;s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/schema/dic/xliff-core";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/schema/dic";b:1;s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Loader/schema";b:1;s:76:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation";b:1;s:64:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component";b:1;s:54:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony";b:1;s:46:"/opt/alt/php54/usr/share/pear/test/Translation";b:1;s:92:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Catalogue";b:1;s:82:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Dumper";b:1;s:91:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures";b:1;s:116:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted";b:1;s:106:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle";b:1;s:110:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat";b:1;s:110:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/res";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/Translation/Symfony/Component/Translation/Tests/Loader";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Translation/Writer";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:6:"Config";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506494;}PK�^�\��BgG3G3<pear/.registry/.channel.pear.symfony.com/eventdispatcher.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:15:"EventDispatcher";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:34:"Symfony2 EventDispatcher Component";s:11:"description";s:34:"Symfony2 EventDispatcher Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:43";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:19:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fee3b581ae2d88dae9a188672e9371fa";s:4:"name";s:48:"Symfony/Component/EventDispatcher/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c627c4133ea8e24eb579e4dafe26a9f1";s:4:"name";s:46:"Symfony/Component/EventDispatcher/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d93bc8dae4fd133748a9bd4ad791032b";s:4:"name";s:47:"Symfony/Component/EventDispatcher/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1f7db4681cb831f0f261094e9dea7df8";s:4:"name";s:67:"Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ec4b2758339bbb8439f50ae9b6134edf";s:4:"name";s:77:"Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d46c34f8bacd815af9a3af406d3b2ce9";s:4:"name";s:43:"Symfony/Component/EventDispatcher/Event.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7d4dcc000083c4f160538b434cf9e178";s:4:"name";s:53:"Symfony/Component/EventDispatcher/EventDispatcher.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e248cdbdf829780d183ee5e4aaab2055";s:4:"name";s:62:"Symfony/Component/EventDispatcher/EventDispatcherInterface.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6bc33100c6e66896fb9145e1bd4b8b85";s:4:"name";s:62:"Symfony/Component/EventDispatcher/EventSubscriberInterface.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"db4fa1cfbad8c627e27697d8c7bcb7fd";s:4:"name";s:50:"Symfony/Component/EventDispatcher/GenericEvent.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"94bee16721f3a1a865fc870941ec34f4";s:4:"name";s:62:"Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:41:"Symfony/Component/EventDispatcher/LICENSE";s:4:"role";s:3:"doc";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8131bd69d2ff57e333e8920e29dd03c1";s:4:"name";s:50:"Symfony/Component/EventDispatcher/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1732bff29f8f1972e7ba9430ed2881f0";s:4:"name";s:43:"Symfony/Component/EventDispatcher/README.md";s:4:"role";s:3:"doc";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5c527c6cda062487fd8f233918023177";s:4:"name";s:77:"Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1c72dfdf259e21f9ece7d32f7cb57333";s:4:"name";s:63:"Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2d8c1f9d12f69cfd4420faf7874573ab";s:4:"name";s:53:"Symfony/Component/EventDispatcher/Tests/EventTest.php";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8afc099e4ad8943631f79a86c5c17313";s:4:"name";s:60:"Symfony/Component/EventDispatcher/Tests/GenericEventTest.php";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"98be8e6e205035fbd3213cd1a5ebd68d";s:4:"name";s:72:"Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:19:{s:48:"Symfony/Component/EventDispatcher/autoloader.php";a:4:{s:6:"md5sum";s:32:"fee3b581ae2d88dae9a188672e9371fa";s:4:"name";s:48:"Symfony/Component/EventDispatcher/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher/autoloader.php";}s:46:"Symfony/Component/EventDispatcher/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"c627c4133ea8e24eb579e4dafe26a9f1";s:4:"name";s:46:"Symfony/Component/EventDispatcher/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/doc/pear/EventDispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md";}s:47:"Symfony/Component/EventDispatcher/composer.json";a:4:{s:6:"md5sum";s:32:"d93bc8dae4fd133748a9bd4ad791032b";s:4:"name";s:47:"Symfony/Component/EventDispatcher/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/doc/pear/EventDispatcher/Symfony/Component/EventDispatcher/composer.json";}s:67:"Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php";a:4:{s:6:"md5sum";s:32:"1f7db4681cb831f0f261094e9dea7df8";s:4:"name";s:67:"Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php";}s:77:"Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php";a:4:{s:6:"md5sum";s:32:"ec4b2758339bbb8439f50ae9b6134edf";s:4:"name";s:77:"Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php";}s:43:"Symfony/Component/EventDispatcher/Event.php";a:4:{s:6:"md5sum";s:32:"d46c34f8bacd815af9a3af406d3b2ce9";s:4:"name";s:43:"Symfony/Component/EventDispatcher/Event.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher/Event.php";}s:53:"Symfony/Component/EventDispatcher/EventDispatcher.php";a:4:{s:6:"md5sum";s:32:"7d4dcc000083c4f160538b434cf9e178";s:4:"name";s:53:"Symfony/Component/EventDispatcher/EventDispatcher.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher/EventDispatcher.php";}s:62:"Symfony/Component/EventDispatcher/EventDispatcherInterface.php";a:4:{s:6:"md5sum";s:32:"e248cdbdf829780d183ee5e4aaab2055";s:4:"name";s:62:"Symfony/Component/EventDispatcher/EventDispatcherInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher/EventDispatcherInterface.php";}s:62:"Symfony/Component/EventDispatcher/EventSubscriberInterface.php";a:4:{s:6:"md5sum";s:32:"6bc33100c6e66896fb9145e1bd4b8b85";s:4:"name";s:62:"Symfony/Component/EventDispatcher/EventSubscriberInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher/EventSubscriberInterface.php";}s:50:"Symfony/Component/EventDispatcher/GenericEvent.php";a:4:{s:6:"md5sum";s:32:"db4fa1cfbad8c627e27697d8c7bcb7fd";s:4:"name";s:50:"Symfony/Component/EventDispatcher/GenericEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher/GenericEvent.php";}s:62:"Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php";a:4:{s:6:"md5sum";s:32:"94bee16721f3a1a865fc870941ec34f4";s:4:"name";s:62:"Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php";}s:41:"Symfony/Component/EventDispatcher/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:41:"Symfony/Component/EventDispatcher/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/doc/pear/EventDispatcher/Symfony/Component/EventDispatcher/LICENSE";}s:50:"Symfony/Component/EventDispatcher/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"8131bd69d2ff57e333e8920e29dd03c1";s:4:"name";s:50:"Symfony/Component/EventDispatcher/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/EventDispatcher/Symfony/Component/EventDispatcher/phpunit.xml.dist";}s:43:"Symfony/Component/EventDispatcher/README.md";a:4:{s:6:"md5sum";s:32:"1732bff29f8f1972e7ba9430ed2881f0";s:4:"name";s:43:"Symfony/Component/EventDispatcher/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/doc/pear/EventDispatcher/Symfony/Component/EventDispatcher/README.md";}s:77:"Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php";a:4:{s:6:"md5sum";s:32:"5c527c6cda062487fd8f233918023177";s:4:"name";s:77:"Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php";}s:63:"Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php";a:4:{s:6:"md5sum";s:32:"1c72dfdf259e21f9ece7d32f7cb57333";s:4:"name";s:63:"Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php";}s:53:"Symfony/Component/EventDispatcher/Tests/EventTest.php";a:4:{s:6:"md5sum";s:32:"2d8c1f9d12f69cfd4420faf7874573ab";s:4:"name";s:53:"Symfony/Component/EventDispatcher/Tests/EventTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests/EventTest.php";}s:60:"Symfony/Component/EventDispatcher/Tests/GenericEventTest.php";a:4:{s:6:"md5sum";s:32:"8afc099e4ad8943631f79a86c5c17313";s:4:"name";s:60:"Symfony/Component/EventDispatcher/Tests/GenericEventTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php";}s:72:"Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php";a:4:{s:6:"md5sum";s:32:"98be8e6e205035fbd3213cd1a5ebd68d";s:4:"name";s:72:"Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:13:{s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:83:"/opt/alt/php54/usr/share/doc/pear/EventDispatcher/Symfony/Component/EventDispatcher";b:1;s:67:"/opt/alt/php54/usr/share/doc/pear/EventDispatcher/Symfony/Component";b:1;s:57:"/opt/alt/php54/usr/share/doc/pear/EventDispatcher/Symfony";b:1;s:49:"/opt/alt/php54/usr/share/doc/pear/EventDispatcher";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/EventDispatcher/Debug";b:1;s:84:"/opt/alt/php54/usr/share/pear/test/EventDispatcher/Symfony/Component/EventDispatcher";b:1;s:68:"/opt/alt/php54/usr/share/pear/test/EventDispatcher/Symfony/Component";b:1;s:58:"/opt/alt/php54/usr/share/pear/test/EventDispatcher/Symfony";b:1;s:50:"/opt/alt/php54/usr/share/pear/test/EventDispatcher";b:1;s:90:"/opt/alt/php54/usr/share/pear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\Yd��Y�Y1pear/.registry/.channel.pear.symfony.com/yaml.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:4:"Yaml";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:23:"Symfony2 Yaml Component";s:11:"description";s:23:"Symfony2 Yaml Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:51";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:41:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"07d78d85581e7b233bc906f888f1f406";s:4:"name";s:37:"Symfony/Component/Yaml/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"00392ab3e6199c8363f9e53646f7da22";s:4:"name";s:35:"Symfony/Component/Yaml/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"97ceba40e4d4b099b853d5390cc862a8";s:4:"name";s:36:"Symfony/Component/Yaml/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"42407158b32c6628e0969cabf060ff6c";s:4:"name";s:33:"Symfony/Component/Yaml/Dumper.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b70928e2c815afc3507267c9b5d69df8";s:4:"name";s:34:"Symfony/Component/Yaml/Escaper.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"40b05314535a494039c342a01e1d10d2";s:4:"name";s:50:"Symfony/Component/Yaml/Exception/DumpException.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a7ee6ec67e04faa2c2c29fef8adfc4fa";s:4:"name";s:55:"Symfony/Component/Yaml/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8c619a51b1b41cf5df563d956acb3a66";s:4:"name";s:51:"Symfony/Component/Yaml/Exception/ParseException.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"39bbaf9ae8b207093e4b8a9c09cdb081";s:4:"name";s:53:"Symfony/Component/Yaml/Exception/RuntimeException.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3613cd189e752204d25f0c5d68a6eadc";s:4:"name";s:33:"Symfony/Component/Yaml/Inline.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:30:"Symfony/Component/Yaml/LICENSE";s:4:"role";s:3:"doc";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"64c3b42307205bf8e361168c7ffbd62b";s:4:"name";s:33:"Symfony/Component/Yaml/Parser.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9e6fe22525058accf018c8080e12e2f1";s:4:"name";s:39:"Symfony/Component/Yaml/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"15ed39836fa36c899e3ec99bdfde8cac";s:4:"name";s:32:"Symfony/Component/Yaml/README.md";s:4:"role";s:3:"doc";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"64109519b10453da72024e12b4c07720";s:4:"name";s:43:"Symfony/Component/Yaml/Tests/DumperTest.php";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"52dbe7660c58107077d0e7069fe43498";s:4:"name";s:52:"Symfony/Component/Yaml/Tests/Fixtures/embededPhp.yml";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3fdad64212f2a04d91ccc15f2a5f7200";s:4:"name";s:59:"Symfony/Component/Yaml/Tests/Fixtures/escapedCharacters.yml";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"809db138c609075657d8d2e81fabaa5c";s:4:"name";s:47:"Symfony/Component/Yaml/Tests/Fixtures/index.yml";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ff1d8df08f5dfab1a2f23be6cf19c791";s:4:"name";s:52:"Symfony/Component/Yaml/Tests/Fixtures/sfComments.yml";s:4:"role";s:4:"test";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"835842c734605efa1665b90ccb266b97";s:4:"name";s:51:"Symfony/Component/Yaml/Tests/Fixtures/sfCompact.yml";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"809113de6e9d341fce21f0524dbaf43b";s:4:"name";s:52:"Symfony/Component/Yaml/Tests/Fixtures/sfMergeKey.yml";s:4:"role";s:4:"test";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"886595fda5f2aa969a232045dbd4941c";s:4:"name";s:51:"Symfony/Component/Yaml/Tests/Fixtures/sfObjects.yml";s:4:"role";s:4:"test";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7ab74ef2b099c462e66d223acdc12494";s:4:"name";s:50:"Symfony/Component/Yaml/Tests/Fixtures/sfQuotes.yml";s:4:"role";s:4:"test";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2cbc1c292d0a398e7044362758ea2c31";s:4:"name";s:49:"Symfony/Component/Yaml/Tests/Fixtures/sfTests.yml";s:4:"role";s:4:"test";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9bf9b30c034a48fd98f1ed6d4f033bb2";s:4:"name";s:63:"Symfony/Component/Yaml/Tests/Fixtures/unindentedCollections.yml";s:4:"role";s:4:"test";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"073781a1d2c37127a4296e9af7616624";s:4:"name";s:56:"Symfony/Component/Yaml/Tests/Fixtures/YtsAnchorAlias.yml";s:4:"role";s:4:"test";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0f7fe2f6fe3bd6af0ce48f0fde63410f";s:4:"name";s:55:"Symfony/Component/Yaml/Tests/Fixtures/YtsBasicTests.yml";s:4:"role";s:4:"test";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4c1744b763fce82db7d4e20c469b20cd";s:4:"name";s:57:"Symfony/Component/Yaml/Tests/Fixtures/YtsBlockMapping.yml";s:4:"role";s:4:"test";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ae486823d3d8c404cabc065416e8b0dc";s:4:"name";s:62:"Symfony/Component/Yaml/Tests/Fixtures/YtsDocumentSeparator.yml";s:4:"role";s:4:"test";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1a6d2fa2a7f53d4657b35baf4ecf67c6";s:4:"name";s:55:"Symfony/Component/Yaml/Tests/Fixtures/YtsErrorTests.yml";s:4:"role";s:4:"test";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"326c09dd8c5de226c680154c39206647";s:4:"name";s:60:"Symfony/Component/Yaml/Tests/Fixtures/YtsFlowCollections.yml";s:4:"role";s:4:"test";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bf21b6ca89e2aea63b62f60448b841b4";s:4:"name";s:58:"Symfony/Component/Yaml/Tests/Fixtures/YtsFoldedScalars.yml";s:4:"role";s:4:"test";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fda05f67ca13f8d50cb904b191039c04";s:4:"name";s:60:"Symfony/Component/Yaml/Tests/Fixtures/YtsNullsAndEmpties.yml";s:4:"role";s:4:"test";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0ac491faab843691cbf2fa415ef1ec2e";s:4:"name";s:66:"Symfony/Component/Yaml/Tests/Fixtures/YtsSpecificationExamples.yml";s:4:"role";s:4:"test";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"359b6d26b73597096784bc481887d8d7";s:4:"name";s:58:"Symfony/Component/Yaml/Tests/Fixtures/YtsTypeTransfers.yml";s:4:"role";s:4:"test";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8218e514512562e64f82e2c64a433a6a";s:4:"name";s:43:"Symfony/Component/Yaml/Tests/InlineTest.php";s:4:"role";s:4:"test";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9a72d3fa4559d2985c7f4d7fec8fe010";s:4:"name";s:51:"Symfony/Component/Yaml/Tests/ParseExceptionTest.php";s:4:"role";s:4:"test";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a240de639b531334340ecf2dc904d1b";s:4:"name";s:43:"Symfony/Component/Yaml/Tests/ParserTest.php";s:4:"role";s:4:"test";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c118d8ca1bda7adff52cfbe25ce80925";s:4:"name";s:41:"Symfony/Component/Yaml/Tests/YamlTest.php";s:4:"role";s:4:"test";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aa973644950ed041a389710050675f1b";s:4:"name";s:36:"Symfony/Component/Yaml/Unescaper.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b37c543884d443eeb0f3212cd1c5ce8f";s:4:"name";s:31:"Symfony/Component/Yaml/Yaml.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:41:{s:37:"Symfony/Component/Yaml/autoloader.php";a:4:{s:6:"md5sum";s:32:"07d78d85581e7b233bc906f888f1f406";s:4:"name";s:37:"Symfony/Component/Yaml/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/autoloader.php";}s:35:"Symfony/Component/Yaml/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"00392ab3e6199c8363f9e53646f7da22";s:4:"name";s:35:"Symfony/Component/Yaml/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/doc/pear/Yaml/Symfony/Component/Yaml/CHANGELOG.md";}s:36:"Symfony/Component/Yaml/composer.json";a:4:{s:6:"md5sum";s:32:"97ceba40e4d4b099b853d5390cc862a8";s:4:"name";s:36:"Symfony/Component/Yaml/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/doc/pear/Yaml/Symfony/Component/Yaml/composer.json";}s:33:"Symfony/Component/Yaml/Dumper.php";a:4:{s:6:"md5sum";s:32:"42407158b32c6628e0969cabf060ff6c";s:4:"name";s:33:"Symfony/Component/Yaml/Dumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Dumper.php";}s:34:"Symfony/Component/Yaml/Escaper.php";a:4:{s:6:"md5sum";s:32:"b70928e2c815afc3507267c9b5d69df8";s:4:"name";s:34:"Symfony/Component/Yaml/Escaper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Escaper.php";}s:50:"Symfony/Component/Yaml/Exception/DumpException.php";a:4:{s:6:"md5sum";s:32:"40b05314535a494039c342a01e1d10d2";s:4:"name";s:50:"Symfony/Component/Yaml/Exception/DumpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Exception/DumpException.php";}s:55:"Symfony/Component/Yaml/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"a7ee6ec67e04faa2c2c29fef8adfc4fa";s:4:"name";s:55:"Symfony/Component/Yaml/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Exception/ExceptionInterface.php";}s:51:"Symfony/Component/Yaml/Exception/ParseException.php";a:4:{s:6:"md5sum";s:32:"8c619a51b1b41cf5df563d956acb3a66";s:4:"name";s:51:"Symfony/Component/Yaml/Exception/ParseException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Exception/ParseException.php";}s:53:"Symfony/Component/Yaml/Exception/RuntimeException.php";a:4:{s:6:"md5sum";s:32:"39bbaf9ae8b207093e4b8a9c09cdb081";s:4:"name";s:53:"Symfony/Component/Yaml/Exception/RuntimeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Exception/RuntimeException.php";}s:33:"Symfony/Component/Yaml/Inline.php";a:4:{s:6:"md5sum";s:32:"3613cd189e752204d25f0c5d68a6eadc";s:4:"name";s:33:"Symfony/Component/Yaml/Inline.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Inline.php";}s:30:"Symfony/Component/Yaml/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:30:"Symfony/Component/Yaml/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/doc/pear/Yaml/Symfony/Component/Yaml/LICENSE";}s:33:"Symfony/Component/Yaml/Parser.php";a:4:{s:6:"md5sum";s:32:"64c3b42307205bf8e361168c7ffbd62b";s:4:"name";s:33:"Symfony/Component/Yaml/Parser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Parser.php";}s:39:"Symfony/Component/Yaml/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"9e6fe22525058accf018c8080e12e2f1";s:4:"name";s:39:"Symfony/Component/Yaml/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/phpunit.xml.dist";}s:32:"Symfony/Component/Yaml/README.md";a:4:{s:6:"md5sum";s:32:"15ed39836fa36c899e3ec99bdfde8cac";s:4:"name";s:32:"Symfony/Component/Yaml/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/doc/pear/Yaml/Symfony/Component/Yaml/README.md";}s:43:"Symfony/Component/Yaml/Tests/DumperTest.php";a:4:{s:6:"md5sum";s:32:"64109519b10453da72024e12b4c07720";s:4:"name";s:43:"Symfony/Component/Yaml/Tests/DumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/DumperTest.php";}s:52:"Symfony/Component/Yaml/Tests/Fixtures/embededPhp.yml";a:4:{s:6:"md5sum";s:32:"52dbe7660c58107077d0e7069fe43498";s:4:"name";s:52:"Symfony/Component/Yaml/Tests/Fixtures/embededPhp.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/embededPhp.yml";}s:59:"Symfony/Component/Yaml/Tests/Fixtures/escapedCharacters.yml";a:4:{s:6:"md5sum";s:32:"3fdad64212f2a04d91ccc15f2a5f7200";s:4:"name";s:59:"Symfony/Component/Yaml/Tests/Fixtures/escapedCharacters.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/escapedCharacters.yml";}s:47:"Symfony/Component/Yaml/Tests/Fixtures/index.yml";a:4:{s:6:"md5sum";s:32:"809db138c609075657d8d2e81fabaa5c";s:4:"name";s:47:"Symfony/Component/Yaml/Tests/Fixtures/index.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/index.yml";}s:52:"Symfony/Component/Yaml/Tests/Fixtures/sfComments.yml";a:4:{s:6:"md5sum";s:32:"ff1d8df08f5dfab1a2f23be6cf19c791";s:4:"name";s:52:"Symfony/Component/Yaml/Tests/Fixtures/sfComments.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfComments.yml";}s:51:"Symfony/Component/Yaml/Tests/Fixtures/sfCompact.yml";a:4:{s:6:"md5sum";s:32:"835842c734605efa1665b90ccb266b97";s:4:"name";s:51:"Symfony/Component/Yaml/Tests/Fixtures/sfCompact.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfCompact.yml";}s:52:"Symfony/Component/Yaml/Tests/Fixtures/sfMergeKey.yml";a:4:{s:6:"md5sum";s:32:"809113de6e9d341fce21f0524dbaf43b";s:4:"name";s:52:"Symfony/Component/Yaml/Tests/Fixtures/sfMergeKey.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfMergeKey.yml";}s:51:"Symfony/Component/Yaml/Tests/Fixtures/sfObjects.yml";a:4:{s:6:"md5sum";s:32:"886595fda5f2aa969a232045dbd4941c";s:4:"name";s:51:"Symfony/Component/Yaml/Tests/Fixtures/sfObjects.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfObjects.yml";}s:50:"Symfony/Component/Yaml/Tests/Fixtures/sfQuotes.yml";a:4:{s:6:"md5sum";s:32:"7ab74ef2b099c462e66d223acdc12494";s:4:"name";s:50:"Symfony/Component/Yaml/Tests/Fixtures/sfQuotes.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfQuotes.yml";}s:49:"Symfony/Component/Yaml/Tests/Fixtures/sfTests.yml";a:4:{s:6:"md5sum";s:32:"2cbc1c292d0a398e7044362758ea2c31";s:4:"name";s:49:"Symfony/Component/Yaml/Tests/Fixtures/sfTests.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfTests.yml";}s:63:"Symfony/Component/Yaml/Tests/Fixtures/unindentedCollections.yml";a:4:{s:6:"md5sum";s:32:"9bf9b30c034a48fd98f1ed6d4f033bb2";s:4:"name";s:63:"Symfony/Component/Yaml/Tests/Fixtures/unindentedCollections.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/unindentedCollections.yml";}s:56:"Symfony/Component/Yaml/Tests/Fixtures/YtsAnchorAlias.yml";a:4:{s:6:"md5sum";s:32:"073781a1d2c37127a4296e9af7616624";s:4:"name";s:56:"Symfony/Component/Yaml/Tests/Fixtures/YtsAnchorAlias.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsAnchorAlias.yml";}s:55:"Symfony/Component/Yaml/Tests/Fixtures/YtsBasicTests.yml";a:4:{s:6:"md5sum";s:32:"0f7fe2f6fe3bd6af0ce48f0fde63410f";s:4:"name";s:55:"Symfony/Component/Yaml/Tests/Fixtures/YtsBasicTests.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsBasicTests.yml";}s:57:"Symfony/Component/Yaml/Tests/Fixtures/YtsBlockMapping.yml";a:4:{s:6:"md5sum";s:32:"4c1744b763fce82db7d4e20c469b20cd";s:4:"name";s:57:"Symfony/Component/Yaml/Tests/Fixtures/YtsBlockMapping.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsBlockMapping.yml";}s:62:"Symfony/Component/Yaml/Tests/Fixtures/YtsDocumentSeparator.yml";a:4:{s:6:"md5sum";s:32:"ae486823d3d8c404cabc065416e8b0dc";s:4:"name";s:62:"Symfony/Component/Yaml/Tests/Fixtures/YtsDocumentSeparator.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsDocumentSeparator.yml";}s:55:"Symfony/Component/Yaml/Tests/Fixtures/YtsErrorTests.yml";a:4:{s:6:"md5sum";s:32:"1a6d2fa2a7f53d4657b35baf4ecf67c6";s:4:"name";s:55:"Symfony/Component/Yaml/Tests/Fixtures/YtsErrorTests.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsErrorTests.yml";}s:60:"Symfony/Component/Yaml/Tests/Fixtures/YtsFlowCollections.yml";a:4:{s:6:"md5sum";s:32:"326c09dd8c5de226c680154c39206647";s:4:"name";s:60:"Symfony/Component/Yaml/Tests/Fixtures/YtsFlowCollections.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsFlowCollections.yml";}s:58:"Symfony/Component/Yaml/Tests/Fixtures/YtsFoldedScalars.yml";a:4:{s:6:"md5sum";s:32:"bf21b6ca89e2aea63b62f60448b841b4";s:4:"name";s:58:"Symfony/Component/Yaml/Tests/Fixtures/YtsFoldedScalars.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsFoldedScalars.yml";}s:60:"Symfony/Component/Yaml/Tests/Fixtures/YtsNullsAndEmpties.yml";a:4:{s:6:"md5sum";s:32:"fda05f67ca13f8d50cb904b191039c04";s:4:"name";s:60:"Symfony/Component/Yaml/Tests/Fixtures/YtsNullsAndEmpties.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsNullsAndEmpties.yml";}s:66:"Symfony/Component/Yaml/Tests/Fixtures/YtsSpecificationExamples.yml";a:4:{s:6:"md5sum";s:32:"0ac491faab843691cbf2fa415ef1ec2e";s:4:"name";s:66:"Symfony/Component/Yaml/Tests/Fixtures/YtsSpecificationExamples.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsSpecificationExamples.yml";}s:58:"Symfony/Component/Yaml/Tests/Fixtures/YtsTypeTransfers.yml";a:4:{s:6:"md5sum";s:32:"359b6d26b73597096784bc481887d8d7";s:4:"name";s:58:"Symfony/Component/Yaml/Tests/Fixtures/YtsTypeTransfers.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsTypeTransfers.yml";}s:43:"Symfony/Component/Yaml/Tests/InlineTest.php";a:4:{s:6:"md5sum";s:32:"8218e514512562e64f82e2c64a433a6a";s:4:"name";s:43:"Symfony/Component/Yaml/Tests/InlineTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/InlineTest.php";}s:51:"Symfony/Component/Yaml/Tests/ParseExceptionTest.php";a:4:{s:6:"md5sum";s:32:"9a72d3fa4559d2985c7f4d7fec8fe010";s:4:"name";s:51:"Symfony/Component/Yaml/Tests/ParseExceptionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/ParseExceptionTest.php";}s:43:"Symfony/Component/Yaml/Tests/ParserTest.php";a:4:{s:6:"md5sum";s:32:"3a240de639b531334340ecf2dc904d1b";s:4:"name";s:43:"Symfony/Component/Yaml/Tests/ParserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/ParserTest.php";}s:41:"Symfony/Component/Yaml/Tests/YamlTest.php";a:4:{s:6:"md5sum";s:32:"c118d8ca1bda7adff52cfbe25ce80925";s:4:"name";s:41:"Symfony/Component/Yaml/Tests/YamlTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/YamlTest.php";}s:36:"Symfony/Component/Yaml/Unescaper.php";a:4:{s:6:"md5sum";s:32:"aa973644950ed041a389710050675f1b";s:4:"name";s:36:"Symfony/Component/Yaml/Unescaper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Unescaper.php";}s:31:"Symfony/Component/Yaml/Yaml.php";a:4:{s:6:"md5sum";s:32:"b37c543884d443eeb0f3212cd1c5ce8f";s:4:"name";s:31:"Symfony/Component/Yaml/Yaml.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Yaml.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:14:{s:52:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:61:"/opt/alt/php54/usr/share/doc/pear/Yaml/Symfony/Component/Yaml";b:1;s:56:"/opt/alt/php54/usr/share/doc/pear/Yaml/Symfony/Component";b:1;s:46:"/opt/alt/php54/usr/share/doc/pear/Yaml/Symfony";b:1;s:38:"/opt/alt/php54/usr/share/doc/pear/Yaml";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/Yaml/Exception";b:1;s:62:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml";b:1;s:57:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component";b:1;s:47:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony";b:1;s:39:"/opt/alt/php54/usr/share/pear/test/Yaml";b:1;s:68:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests";b:1;s:77:"/opt/alt/php54/usr/share/pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506495;}PK�^�\����3pear/.registry/.channel.pear.symfony.com/finder.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:6:"Finder";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:25:"Symfony2 Finder Component";s:11:"description";s:25:"Symfony2 Finder Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:44";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:86:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6fffc29b8377e9fb68b5e302b9ff0a97";s:4:"name";s:52:"Symfony/Component/Finder/Adapter/AbstractAdapter.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7dc817125e50b8b230fa1dd7b505a35b";s:4:"name";s:56:"Symfony/Component/Finder/Adapter/AbstractFindAdapter.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a6b49be9beaee46ef1b3ab81b65c3f5a";s:4:"name";s:53:"Symfony/Component/Finder/Adapter/AdapterInterface.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"787a004fec8cb06949f54d45d0a92dfa";s:4:"name";s:51:"Symfony/Component/Finder/Adapter/BsdFindAdapter.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86f218f5471a950cda80784f16635789";s:4:"name";s:51:"Symfony/Component/Finder/Adapter/GnuFindAdapter.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5550d6d59cd92735c58ea80f58766716";s:4:"name";s:47:"Symfony/Component/Finder/Adapter/PhpAdapter.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"70c27b109779dd46d3a9d0ef38565b42";s:4:"name";s:39:"Symfony/Component/Finder/autoloader.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f18e866785861bb62155c98357afe2d6";s:4:"name";s:37:"Symfony/Component/Finder/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ff527c6ba5d45d17b691dd2debe2c3d9";s:4:"name";s:50:"Symfony/Component/Finder/Comparator/Comparator.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f50830cff54249c3d2602120bf7adc56";s:4:"name";s:54:"Symfony/Component/Finder/Comparator/DateComparator.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5be54134d90a013d0685a58bdf395e99";s:4:"name";s:56:"Symfony/Component/Finder/Comparator/NumberComparator.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0ade20562cd194d6ef1d87e3811baf4d";s:4:"name";s:38:"Symfony/Component/Finder/composer.json";s:4:"role";s:3:"doc";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6ec2bf13ee80fa36603a8b1cbaeb3057";s:4:"name";s:60:"Symfony/Component/Finder/Exception/AccessDeniedException.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"543b917aa3964799c231b7f5730010b5";s:4:"name";s:62:"Symfony/Component/Finder/Exception/AdapterFailureException.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"509f10771d6f6158695f24d956ccf611";s:4:"name";s:57:"Symfony/Component/Finder/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0026a361b430ca5ce4bc1a8b199f1c82";s:4:"name";s:68:"Symfony/Component/Finder/Exception/OperationNotPermitedException.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9eb6fca673d7b360706d092ebc91519f";s:4:"name";s:67:"Symfony/Component/Finder/Exception/ShellCommandFailureException.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"344148f9472396a75e505102cade415c";s:4:"name";s:50:"Symfony/Component/Finder/Expression/Expression.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a231c7c1fcea375333c3b4a2c14ab532";s:4:"name";s:44:"Symfony/Component/Finder/Expression/Glob.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f6919b0c7a8545c57d85318b544d0f24";s:4:"name";s:45:"Symfony/Component/Finder/Expression/Regex.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"219c3a5985874bf148c4261c21db14bd";s:4:"name";s:54:"Symfony/Component/Finder/Expression/ValueInterface.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a4f805d1284bcd933f1ee022197c9226";s:4:"name";s:35:"Symfony/Component/Finder/Finder.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0b44ed57af5918230d1b82ecee9c3ba3";s:4:"name";s:33:"Symfony/Component/Finder/Glob.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b043b76cf6d7a5356b2515d28c7ff48a";s:4:"name";s:58:"Symfony/Component/Finder/Iterator/CustomFilterIterator.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"62f326275b0ded2de6cd6209ec2536af";s:4:"name";s:61:"Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"91fd43512fed83211c6cce453e6b45be";s:4:"name";s:62:"Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6cf1f8950c36872e6389337ae41c6268";s:4:"name";s:68:"Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"04c5aafbda629dc67e3d1b36ec56f692";s:4:"name";s:63:"Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c414b7cb71b775f369d676c345b3cbed";s:4:"name";s:60:"Symfony/Component/Finder/Iterator/FilenameFilterIterator.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"92a7737c720fb253f300a5e27cf7b0a3";s:4:"name";s:55:"Symfony/Component/Finder/Iterator/FilePathsIterator.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8848c8e1a14338fead3676ff724b0a18";s:4:"name";s:60:"Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"357568ea6a039bfaf363227eb4823b08";s:4:"name";s:52:"Symfony/Component/Finder/Iterator/FilterIterator.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8343ab9d4fcebfa7be797bccd8ef559";s:4:"name";s:64:"Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7bcb38607afc169b07443b4d166cd646";s:4:"name";s:56:"Symfony/Component/Finder/Iterator/PathFilterIterator.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"42d968969a5f86d4131876b013fa8222";s:4:"name";s:64:"Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5e5846ae6b28172c38b8398a9d9dfab7";s:4:"name";s:61:"Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"530f84682e9e9f218d1e349bfd6a62dc";s:4:"name";s:54:"Symfony/Component/Finder/Iterator/SortableIterator.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:32:"Symfony/Component/Finder/LICENSE";s:4:"role";s:3:"doc";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cef311635452da773abddebf14e2f6eb";s:4:"name";s:41:"Symfony/Component/Finder/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2456580383eb35b4f4a2529c6cc1264f";s:4:"name";s:34:"Symfony/Component/Finder/README.md";s:4:"role";s:3:"doc";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d66a35ad507168d1fa3034a61c2a94e8";s:4:"name";s:42:"Symfony/Component/Finder/Shell/Command.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fff1b9b5a47c24fa988f4340a5c52701";s:4:"name";s:40:"Symfony/Component/Finder/Shell/Shell.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c4117456dc277d299cf94ffee5d66410";s:4:"name";s:40:"Symfony/Component/Finder/SplFileInfo.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"feecb2cd50a7a248febac4044933ac3d";s:4:"name";s:60:"Symfony/Component/Finder/Tests/Comparator/ComparatorTest.php";s:4:"role";s:4:"test";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"89ff8698db0e90e9820b4c2d9322ea35";s:4:"name";s:64:"Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php";s:4:"role";s:4:"test";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"65c58bb38b3d2a7d3c40b1a28869cf9a";s:4:"name";s:66:"Symfony/Component/Finder/Tests/Comparator/NumberComparatorTest.php";s:4:"role";s:4:"test";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b079a8f0f48ea5bce7ea931822d23728";s:4:"name";s:60:"Symfony/Component/Finder/Tests/Expression/ExpressionTest.php";s:4:"role";s:4:"test";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8dbffcaf39e52ac3203f592066b7d4ed";s:4:"name";s:54:"Symfony/Component/Finder/Tests/Expression/GlobTest.php";s:4:"role";s:4:"test";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"14318667c0d8f805fe01762c1fc36d70";s:4:"name";s:55:"Symfony/Component/Finder/Tests/Expression/RegexTest.php";s:4:"role";s:4:"test";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c60edd9b00b8f99374c3a826e615e27c";s:4:"name";s:59:"Symfony/Component/Finder/Tests/FakeAdapter/DummyAdapter.php";s:4:"role";s:4:"test";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a73e2d28e02576a7851131285966ebab";s:4:"name";s:61:"Symfony/Component/Finder/Tests/FakeAdapter/FailingAdapter.php";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5509680e7bc94ac0fab1a75680b8cfe7";s:4:"name";s:59:"Symfony/Component/Finder/Tests/FakeAdapter/NamedAdapter.php";s:4:"role";s:4:"test";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5afaefa9e0c692d20ab98d9f573fda4e";s:4:"name";s:65:"Symfony/Component/Finder/Tests/FakeAdapter/UnsupportedAdapter.php";s:4:"role";s:4:"test";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"15e0e93e7d51a82b5b32e3518b7afc99";s:4:"name";s:45:"Symfony/Component/Finder/Tests/FinderTest.php";s:4:"role";s:4:"test";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:47:"Symfony/Component/Finder/Tests/Fixtures/A/a.dat";s:4:"role";s:4:"test";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:50:"Symfony/Component/Finder/Tests/Fixtures/A/B/ab.dat";s:4:"role";s:4:"test";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:53:"Symfony/Component/Finder/Tests/Fixtures/A/B/C/abc.dat";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:57:"Symfony/Component/Finder/Tests/Fixtures/copy/A/a.dat.copy";s:4:"role";s:4:"test";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:60:"Symfony/Component/Finder/Tests/Fixtures/copy/A/B/ab.dat.copy";s:4:"role";s:4:"test";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:63:"Symfony/Component/Finder/Tests/Fixtures/copy/A/B/C/abc.dat.copy";s:4:"role";s:4:"test";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6624837e7357e95e2183d9aa82a4a90f";s:4:"name";s:49:"Symfony/Component/Finder/Tests/Fixtures/dolor.txt";s:4:"role";s:4:"test";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"843affd355b258df359cb9b62a64289d";s:4:"name";s:49:"Symfony/Component/Finder/Tests/Fixtures/ipsum.txt";s:4:"role";s:4:"test";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bd58bbe99a4801c138ec8017d65cc7a4";s:4:"name";s:49:"Symfony/Component/Finder/Tests/Fixtures/lorem.txt";s:4:"role";s:4:"test";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:45:"Symfony/Component/Finder/Tests/Fixtures/one/a";s:4:"role";s:4:"test";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:52:"Symfony/Component/Finder/Tests/Fixtures/one/b/c.neon";s:4:"role";s:4:"test";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:52:"Symfony/Component/Finder/Tests/Fixtures/one/b/d.neon";s:4:"role";s:4:"test";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:58:"Symfony/Component/Finder/Tests/Fixtures/with space/foo.txt";s:4:"role";s:4:"test";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"57fa269cea0bbc73e2416764536b6746";s:4:"name";s:68:"Symfony/Component/Finder/Tests/Iterator/CustomFilterIteratorTest.php";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"173f134f8bccca2c1757a77b2ca77a93";s:4:"name";s:71:"Symfony/Component/Finder/Tests/Iterator/DateRangeFilterIteratorTest.php";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b10459df5f2e84c32758ab00b8c2a559";s:4:"name";s:72:"Symfony/Component/Finder/Tests/Iterator/DepthRangeFilterIteratorTest.php";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fb762b45fa48417171d592421504a258";s:4:"name";s:78:"Symfony/Component/Finder/Tests/Iterator/ExcludeDirectoryFilterIteratorTest.php";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1cf6511c36dee2f1029b6f41ac31ad65";s:4:"name";s:73:"Symfony/Component/Finder/Tests/Iterator/FilecontentFilterIteratorTest.php";s:4:"role";s:4:"test";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"41c49ff40fc3622a48c04df824684944";s:4:"name";s:70:"Symfony/Component/Finder/Tests/Iterator/FilenameFilterIteratorTest.php";s:4:"role";s:4:"test";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87f862713b1702931fd758cb0f9d70b0";s:4:"name";s:65:"Symfony/Component/Finder/Tests/Iterator/FilePathsIteratorTest.php";s:4:"role";s:4:"test";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0f08a73086ae0c8de3a110563240052a";s:4:"name";s:70:"Symfony/Component/Finder/Tests/Iterator/FileTypeFilterIteratorTest.php";s:4:"role";s:4:"test";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8683e26efd65bf17dc96e21c25b4326c";s:4:"name";s:62:"Symfony/Component/Finder/Tests/Iterator/FilterIteratorTest.php";s:4:"role";s:4:"test";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3efa2d95b80c889e65bf1c18d898201a";s:4:"name";s:52:"Symfony/Component/Finder/Tests/Iterator/Iterator.php";s:4:"role";s:4:"test";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e14ac4c44a1faa1d22e2188ae20a1e63";s:4:"name";s:60:"Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php";s:4:"role";s:4:"test";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5f9af5d1647b30d511aa017dcf8b3a72";s:4:"name";s:64:"Symfony/Component/Finder/Tests/Iterator/MockFileListIterator.php";s:4:"role";s:4:"test";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b7dae5a3886979bc733067fedf265bea";s:4:"name";s:59:"Symfony/Component/Finder/Tests/Iterator/MockSplFileInfo.php";s:4:"role";s:4:"test";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4e8d9d8ecf752a075cc7886c69bf5f93";s:4:"name";s:74:"Symfony/Component/Finder/Tests/Iterator/MultiplePcreFilterIteratorTest.php";s:4:"role";s:4:"test";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6f6ac3f2c9e2663f778d2ca0e700fc34";s:4:"name";s:66:"Symfony/Component/Finder/Tests/Iterator/PathFilterIteratorTest.php";s:4:"role";s:4:"test";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ff1381bf96a6d4b7e99328cd2a2e0a23";s:4:"name";s:64:"Symfony/Component/Finder/Tests/Iterator/RealIteratorTestCase.php";s:4:"role";s:4:"test";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a331462cae2726ae6e1f608f6da87bb";s:4:"name";s:74:"Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php";s:4:"role";s:4:"test";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"398cce21c68fe443d6303260d7c8a5cb";s:4:"name";s:71:"Symfony/Component/Finder/Tests/Iterator/SizeRangeFilterIteratorTest.php";s:4:"role";s:4:"test";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c08270fdc6490d0f92767a14506df3ad";s:4:"name";s:64:"Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:86:{s:52:"Symfony/Component/Finder/Adapter/AbstractAdapter.php";a:4:{s:6:"md5sum";s:32:"6fffc29b8377e9fb68b5e302b9ff0a97";s:4:"name";s:52:"Symfony/Component/Finder/Adapter/AbstractAdapter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Adapter/AbstractAdapter.php";}s:56:"Symfony/Component/Finder/Adapter/AbstractFindAdapter.php";a:4:{s:6:"md5sum";s:32:"7dc817125e50b8b230fa1dd7b505a35b";s:4:"name";s:56:"Symfony/Component/Finder/Adapter/AbstractFindAdapter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php";}s:53:"Symfony/Component/Finder/Adapter/AdapterInterface.php";a:4:{s:6:"md5sum";s:32:"a6b49be9beaee46ef1b3ab81b65c3f5a";s:4:"name";s:53:"Symfony/Component/Finder/Adapter/AdapterInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Adapter/AdapterInterface.php";}s:51:"Symfony/Component/Finder/Adapter/BsdFindAdapter.php";a:4:{s:6:"md5sum";s:32:"787a004fec8cb06949f54d45d0a92dfa";s:4:"name";s:51:"Symfony/Component/Finder/Adapter/BsdFindAdapter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Adapter/BsdFindAdapter.php";}s:51:"Symfony/Component/Finder/Adapter/GnuFindAdapter.php";a:4:{s:6:"md5sum";s:32:"86f218f5471a950cda80784f16635789";s:4:"name";s:51:"Symfony/Component/Finder/Adapter/GnuFindAdapter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Adapter/GnuFindAdapter.php";}s:47:"Symfony/Component/Finder/Adapter/PhpAdapter.php";a:4:{s:6:"md5sum";s:32:"5550d6d59cd92735c58ea80f58766716";s:4:"name";s:47:"Symfony/Component/Finder/Adapter/PhpAdapter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Adapter/PhpAdapter.php";}s:39:"Symfony/Component/Finder/autoloader.php";a:4:{s:6:"md5sum";s:32:"70c27b109779dd46d3a9d0ef38565b42";s:4:"name";s:39:"Symfony/Component/Finder/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/autoloader.php";}s:37:"Symfony/Component/Finder/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"f18e866785861bb62155c98357afe2d6";s:4:"name";s:37:"Symfony/Component/Finder/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/doc/pear/Finder/Symfony/Component/Finder/CHANGELOG.md";}s:50:"Symfony/Component/Finder/Comparator/Comparator.php";a:4:{s:6:"md5sum";s:32:"ff527c6ba5d45d17b691dd2debe2c3d9";s:4:"name";s:50:"Symfony/Component/Finder/Comparator/Comparator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Comparator/Comparator.php";}s:54:"Symfony/Component/Finder/Comparator/DateComparator.php";a:4:{s:6:"md5sum";s:32:"f50830cff54249c3d2602120bf7adc56";s:4:"name";s:54:"Symfony/Component/Finder/Comparator/DateComparator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Comparator/DateComparator.php";}s:56:"Symfony/Component/Finder/Comparator/NumberComparator.php";a:4:{s:6:"md5sum";s:32:"5be54134d90a013d0685a58bdf395e99";s:4:"name";s:56:"Symfony/Component/Finder/Comparator/NumberComparator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Comparator/NumberComparator.php";}s:38:"Symfony/Component/Finder/composer.json";a:4:{s:6:"md5sum";s:32:"0ade20562cd194d6ef1d87e3811baf4d";s:4:"name";s:38:"Symfony/Component/Finder/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/doc/pear/Finder/Symfony/Component/Finder/composer.json";}s:60:"Symfony/Component/Finder/Exception/AccessDeniedException.php";a:4:{s:6:"md5sum";s:32:"6ec2bf13ee80fa36603a8b1cbaeb3057";s:4:"name";s:60:"Symfony/Component/Finder/Exception/AccessDeniedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Exception/AccessDeniedException.php";}s:62:"Symfony/Component/Finder/Exception/AdapterFailureException.php";a:4:{s:6:"md5sum";s:32:"543b917aa3964799c231b7f5730010b5";s:4:"name";s:62:"Symfony/Component/Finder/Exception/AdapterFailureException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Exception/AdapterFailureException.php";}s:57:"Symfony/Component/Finder/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"509f10771d6f6158695f24d956ccf611";s:4:"name";s:57:"Symfony/Component/Finder/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Exception/ExceptionInterface.php";}s:68:"Symfony/Component/Finder/Exception/OperationNotPermitedException.php";a:4:{s:6:"md5sum";s:32:"0026a361b430ca5ce4bc1a8b199f1c82";s:4:"name";s:68:"Symfony/Component/Finder/Exception/OperationNotPermitedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Exception/OperationNotPermitedException.php";}s:67:"Symfony/Component/Finder/Exception/ShellCommandFailureException.php";a:4:{s:6:"md5sum";s:32:"9eb6fca673d7b360706d092ebc91519f";s:4:"name";s:67:"Symfony/Component/Finder/Exception/ShellCommandFailureException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Exception/ShellCommandFailureException.php";}s:50:"Symfony/Component/Finder/Expression/Expression.php";a:4:{s:6:"md5sum";s:32:"344148f9472396a75e505102cade415c";s:4:"name";s:50:"Symfony/Component/Finder/Expression/Expression.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Expression/Expression.php";}s:44:"Symfony/Component/Finder/Expression/Glob.php";a:4:{s:6:"md5sum";s:32:"a231c7c1fcea375333c3b4a2c14ab532";s:4:"name";s:44:"Symfony/Component/Finder/Expression/Glob.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Expression/Glob.php";}s:45:"Symfony/Component/Finder/Expression/Regex.php";a:4:{s:6:"md5sum";s:32:"f6919b0c7a8545c57d85318b544d0f24";s:4:"name";s:45:"Symfony/Component/Finder/Expression/Regex.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Expression/Regex.php";}s:54:"Symfony/Component/Finder/Expression/ValueInterface.php";a:4:{s:6:"md5sum";s:32:"219c3a5985874bf148c4261c21db14bd";s:4:"name";s:54:"Symfony/Component/Finder/Expression/ValueInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Expression/ValueInterface.php";}s:35:"Symfony/Component/Finder/Finder.php";a:4:{s:6:"md5sum";s:32:"a4f805d1284bcd933f1ee022197c9226";s:4:"name";s:35:"Symfony/Component/Finder/Finder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Finder.php";}s:33:"Symfony/Component/Finder/Glob.php";a:4:{s:6:"md5sum";s:32:"0b44ed57af5918230d1b82ecee9c3ba3";s:4:"name";s:33:"Symfony/Component/Finder/Glob.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Glob.php";}s:58:"Symfony/Component/Finder/Iterator/CustomFilterIterator.php";a:4:{s:6:"md5sum";s:32:"b043b76cf6d7a5356b2515d28c7ff48a";s:4:"name";s:58:"Symfony/Component/Finder/Iterator/CustomFilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/CustomFilterIterator.php";}s:61:"Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php";a:4:{s:6:"md5sum";s:32:"62f326275b0ded2de6cd6209ec2536af";s:4:"name";s:61:"Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php";}s:62:"Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php";a:4:{s:6:"md5sum";s:32:"91fd43512fed83211c6cce453e6b45be";s:4:"name";s:62:"Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php";}s:68:"Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php";a:4:{s:6:"md5sum";s:32:"6cf1f8950c36872e6389337ae41c6268";s:4:"name";s:68:"Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php";}s:63:"Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php";a:4:{s:6:"md5sum";s:32:"04c5aafbda629dc67e3d1b36ec56f692";s:4:"name";s:63:"Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php";}s:60:"Symfony/Component/Finder/Iterator/FilenameFilterIterator.php";a:4:{s:6:"md5sum";s:32:"c414b7cb71b775f369d676c345b3cbed";s:4:"name";s:60:"Symfony/Component/Finder/Iterator/FilenameFilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/FilenameFilterIterator.php";}s:55:"Symfony/Component/Finder/Iterator/FilePathsIterator.php";a:4:{s:6:"md5sum";s:32:"92a7737c720fb253f300a5e27cf7b0a3";s:4:"name";s:55:"Symfony/Component/Finder/Iterator/FilePathsIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/FilePathsIterator.php";}s:60:"Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php";a:4:{s:6:"md5sum";s:32:"8848c8e1a14338fead3676ff724b0a18";s:4:"name";s:60:"Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php";}s:52:"Symfony/Component/Finder/Iterator/FilterIterator.php";a:4:{s:6:"md5sum";s:32:"357568ea6a039bfaf363227eb4823b08";s:4:"name";s:52:"Symfony/Component/Finder/Iterator/FilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/FilterIterator.php";}s:64:"Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php";a:4:{s:6:"md5sum";s:32:"b8343ab9d4fcebfa7be797bccd8ef559";s:4:"name";s:64:"Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php";}s:56:"Symfony/Component/Finder/Iterator/PathFilterIterator.php";a:4:{s:6:"md5sum";s:32:"7bcb38607afc169b07443b4d166cd646";s:4:"name";s:56:"Symfony/Component/Finder/Iterator/PathFilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/PathFilterIterator.php";}s:64:"Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php";a:4:{s:6:"md5sum";s:32:"42d968969a5f86d4131876b013fa8222";s:4:"name";s:64:"Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php";}s:61:"Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php";a:4:{s:6:"md5sum";s:32:"5e5846ae6b28172c38b8398a9d9dfab7";s:4:"name";s:61:"Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php";}s:54:"Symfony/Component/Finder/Iterator/SortableIterator.php";a:4:{s:6:"md5sum";s:32:"530f84682e9e9f218d1e349bfd6a62dc";s:4:"name";s:54:"Symfony/Component/Finder/Iterator/SortableIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator/SortableIterator.php";}s:32:"Symfony/Component/Finder/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:32:"Symfony/Component/Finder/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/doc/pear/Finder/Symfony/Component/Finder/LICENSE";}s:41:"Symfony/Component/Finder/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"cef311635452da773abddebf14e2f6eb";s:4:"name";s:41:"Symfony/Component/Finder/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/phpunit.xml.dist";}s:34:"Symfony/Component/Finder/README.md";a:4:{s:6:"md5sum";s:32:"2456580383eb35b4f4a2529c6cc1264f";s:4:"name";s:34:"Symfony/Component/Finder/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/doc/pear/Finder/Symfony/Component/Finder/README.md";}s:42:"Symfony/Component/Finder/Shell/Command.php";a:4:{s:6:"md5sum";s:32:"d66a35ad507168d1fa3034a61c2a94e8";s:4:"name";s:42:"Symfony/Component/Finder/Shell/Command.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Shell/Command.php";}s:40:"Symfony/Component/Finder/Shell/Shell.php";a:4:{s:6:"md5sum";s:32:"fff1b9b5a47c24fa988f4340a5c52701";s:4:"name";s:40:"Symfony/Component/Finder/Shell/Shell.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Shell/Shell.php";}s:40:"Symfony/Component/Finder/SplFileInfo.php";a:4:{s:6:"md5sum";s:32:"c4117456dc277d299cf94ffee5d66410";s:4:"name";s:40:"Symfony/Component/Finder/SplFileInfo.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/SplFileInfo.php";}s:60:"Symfony/Component/Finder/Tests/Comparator/ComparatorTest.php";a:4:{s:6:"md5sum";s:32:"feecb2cd50a7a248febac4044933ac3d";s:4:"name";s:60:"Symfony/Component/Finder/Tests/Comparator/ComparatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Comparator/ComparatorTest.php";}s:64:"Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php";a:4:{s:6:"md5sum";s:32:"89ff8698db0e90e9820b4c2d9322ea35";s:4:"name";s:64:"Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php";}s:66:"Symfony/Component/Finder/Tests/Comparator/NumberComparatorTest.php";a:4:{s:6:"md5sum";s:32:"65c58bb38b3d2a7d3c40b1a28869cf9a";s:4:"name";s:66:"Symfony/Component/Finder/Tests/Comparator/NumberComparatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Comparator/NumberComparatorTest.php";}s:60:"Symfony/Component/Finder/Tests/Expression/ExpressionTest.php";a:4:{s:6:"md5sum";s:32:"b079a8f0f48ea5bce7ea931822d23728";s:4:"name";s:60:"Symfony/Component/Finder/Tests/Expression/ExpressionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Expression/ExpressionTest.php";}s:54:"Symfony/Component/Finder/Tests/Expression/GlobTest.php";a:4:{s:6:"md5sum";s:32:"8dbffcaf39e52ac3203f592066b7d4ed";s:4:"name";s:54:"Symfony/Component/Finder/Tests/Expression/GlobTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Expression/GlobTest.php";}s:55:"Symfony/Component/Finder/Tests/Expression/RegexTest.php";a:4:{s:6:"md5sum";s:32:"14318667c0d8f805fe01762c1fc36d70";s:4:"name";s:55:"Symfony/Component/Finder/Tests/Expression/RegexTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Expression/RegexTest.php";}s:59:"Symfony/Component/Finder/Tests/FakeAdapter/DummyAdapter.php";a:4:{s:6:"md5sum";s:32:"c60edd9b00b8f99374c3a826e615e27c";s:4:"name";s:59:"Symfony/Component/Finder/Tests/FakeAdapter/DummyAdapter.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/FakeAdapter/DummyAdapter.php";}s:61:"Symfony/Component/Finder/Tests/FakeAdapter/FailingAdapter.php";a:4:{s:6:"md5sum";s:32:"a73e2d28e02576a7851131285966ebab";s:4:"name";s:61:"Symfony/Component/Finder/Tests/FakeAdapter/FailingAdapter.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/FakeAdapter/FailingAdapter.php";}s:59:"Symfony/Component/Finder/Tests/FakeAdapter/NamedAdapter.php";a:4:{s:6:"md5sum";s:32:"5509680e7bc94ac0fab1a75680b8cfe7";s:4:"name";s:59:"Symfony/Component/Finder/Tests/FakeAdapter/NamedAdapter.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/FakeAdapter/NamedAdapter.php";}s:65:"Symfony/Component/Finder/Tests/FakeAdapter/UnsupportedAdapter.php";a:4:{s:6:"md5sum";s:32:"5afaefa9e0c692d20ab98d9f573fda4e";s:4:"name";s:65:"Symfony/Component/Finder/Tests/FakeAdapter/UnsupportedAdapter.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/FakeAdapter/UnsupportedAdapter.php";}s:45:"Symfony/Component/Finder/Tests/FinderTest.php";a:4:{s:6:"md5sum";s:32:"15e0e93e7d51a82b5b32e3518b7afc99";s:4:"name";s:45:"Symfony/Component/Finder/Tests/FinderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/FinderTest.php";}s:47:"Symfony/Component/Finder/Tests/Fixtures/A/a.dat";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:47:"Symfony/Component/Finder/Tests/Fixtures/A/a.dat";s:4:"role";s:4:"test";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/A/a.dat";}s:50:"Symfony/Component/Finder/Tests/Fixtures/A/B/ab.dat";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:50:"Symfony/Component/Finder/Tests/Fixtures/A/B/ab.dat";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/A/B/ab.dat";}s:53:"Symfony/Component/Finder/Tests/Fixtures/A/B/C/abc.dat";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:53:"Symfony/Component/Finder/Tests/Fixtures/A/B/C/abc.dat";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/A/B/C/abc.dat";}s:57:"Symfony/Component/Finder/Tests/Fixtures/copy/A/a.dat.copy";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:57:"Symfony/Component/Finder/Tests/Fixtures/copy/A/a.dat.copy";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/a.dat.copy";}s:60:"Symfony/Component/Finder/Tests/Fixtures/copy/A/B/ab.dat.copy";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:60:"Symfony/Component/Finder/Tests/Fixtures/copy/A/B/ab.dat.copy";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/B/ab.dat.copy";}s:63:"Symfony/Component/Finder/Tests/Fixtures/copy/A/B/C/abc.dat.copy";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:63:"Symfony/Component/Finder/Tests/Fixtures/copy/A/B/C/abc.dat.copy";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/B/C/abc.dat.copy";}s:49:"Symfony/Component/Finder/Tests/Fixtures/dolor.txt";a:4:{s:6:"md5sum";s:32:"6624837e7357e95e2183d9aa82a4a90f";s:4:"name";s:49:"Symfony/Component/Finder/Tests/Fixtures/dolor.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/dolor.txt";}s:49:"Symfony/Component/Finder/Tests/Fixtures/ipsum.txt";a:4:{s:6:"md5sum";s:32:"843affd355b258df359cb9b62a64289d";s:4:"name";s:49:"Symfony/Component/Finder/Tests/Fixtures/ipsum.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/ipsum.txt";}s:49:"Symfony/Component/Finder/Tests/Fixtures/lorem.txt";a:4:{s:6:"md5sum";s:32:"bd58bbe99a4801c138ec8017d65cc7a4";s:4:"name";s:49:"Symfony/Component/Finder/Tests/Fixtures/lorem.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/lorem.txt";}s:45:"Symfony/Component/Finder/Tests/Fixtures/one/a";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:45:"Symfony/Component/Finder/Tests/Fixtures/one/a";s:4:"role";s:4:"test";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/one/a";}s:52:"Symfony/Component/Finder/Tests/Fixtures/one/b/c.neon";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:52:"Symfony/Component/Finder/Tests/Fixtures/one/b/c.neon";s:4:"role";s:4:"test";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/one/b/c.neon";}s:52:"Symfony/Component/Finder/Tests/Fixtures/one/b/d.neon";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:52:"Symfony/Component/Finder/Tests/Fixtures/one/b/d.neon";s:4:"role";s:4:"test";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/one/b/d.neon";}s:58:"Symfony/Component/Finder/Tests/Fixtures/with space/foo.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:58:"Symfony/Component/Finder/Tests/Fixtures/with space/foo.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/with space/foo.txt";}s:68:"Symfony/Component/Finder/Tests/Iterator/CustomFilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"57fa269cea0bbc73e2416764536b6746";s:4:"name";s:68:"Symfony/Component/Finder/Tests/Iterator/CustomFilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/CustomFilterIteratorTest.php";}s:71:"Symfony/Component/Finder/Tests/Iterator/DateRangeFilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"173f134f8bccca2c1757a77b2ca77a93";s:4:"name";s:71:"Symfony/Component/Finder/Tests/Iterator/DateRangeFilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/DateRangeFilterIteratorTest.php";}s:72:"Symfony/Component/Finder/Tests/Iterator/DepthRangeFilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"b10459df5f2e84c32758ab00b8c2a559";s:4:"name";s:72:"Symfony/Component/Finder/Tests/Iterator/DepthRangeFilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/DepthRangeFilterIteratorTest.php";}s:78:"Symfony/Component/Finder/Tests/Iterator/ExcludeDirectoryFilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"fb762b45fa48417171d592421504a258";s:4:"name";s:78:"Symfony/Component/Finder/Tests/Iterator/ExcludeDirectoryFilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/ExcludeDirectoryFilterIteratorTest.php";}s:73:"Symfony/Component/Finder/Tests/Iterator/FilecontentFilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"1cf6511c36dee2f1029b6f41ac31ad65";s:4:"name";s:73:"Symfony/Component/Finder/Tests/Iterator/FilecontentFilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/FilecontentFilterIteratorTest.php";}s:70:"Symfony/Component/Finder/Tests/Iterator/FilenameFilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"41c49ff40fc3622a48c04df824684944";s:4:"name";s:70:"Symfony/Component/Finder/Tests/Iterator/FilenameFilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/FilenameFilterIteratorTest.php";}s:65:"Symfony/Component/Finder/Tests/Iterator/FilePathsIteratorTest.php";a:4:{s:6:"md5sum";s:32:"87f862713b1702931fd758cb0f9d70b0";s:4:"name";s:65:"Symfony/Component/Finder/Tests/Iterator/FilePathsIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/FilePathsIteratorTest.php";}s:70:"Symfony/Component/Finder/Tests/Iterator/FileTypeFilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"0f08a73086ae0c8de3a110563240052a";s:4:"name";s:70:"Symfony/Component/Finder/Tests/Iterator/FileTypeFilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/FileTypeFilterIteratorTest.php";}s:62:"Symfony/Component/Finder/Tests/Iterator/FilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"8683e26efd65bf17dc96e21c25b4326c";s:4:"name";s:62:"Symfony/Component/Finder/Tests/Iterator/FilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/FilterIteratorTest.php";}s:52:"Symfony/Component/Finder/Tests/Iterator/Iterator.php";a:4:{s:6:"md5sum";s:32:"3efa2d95b80c889e65bf1c18d898201a";s:4:"name";s:52:"Symfony/Component/Finder/Tests/Iterator/Iterator.php";s:4:"role";s:4:"test";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/Iterator.php";}s:60:"Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php";a:4:{s:6:"md5sum";s:32:"e14ac4c44a1faa1d22e2188ae20a1e63";s:4:"name";s:60:"Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php";}s:64:"Symfony/Component/Finder/Tests/Iterator/MockFileListIterator.php";a:4:{s:6:"md5sum";s:32:"5f9af5d1647b30d511aa017dcf8b3a72";s:4:"name";s:64:"Symfony/Component/Finder/Tests/Iterator/MockFileListIterator.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/MockFileListIterator.php";}s:59:"Symfony/Component/Finder/Tests/Iterator/MockSplFileInfo.php";a:4:{s:6:"md5sum";s:32:"b7dae5a3886979bc733067fedf265bea";s:4:"name";s:59:"Symfony/Component/Finder/Tests/Iterator/MockSplFileInfo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/MockSplFileInfo.php";}s:74:"Symfony/Component/Finder/Tests/Iterator/MultiplePcreFilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"4e8d9d8ecf752a075cc7886c69bf5f93";s:4:"name";s:74:"Symfony/Component/Finder/Tests/Iterator/MultiplePcreFilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/MultiplePcreFilterIteratorTest.php";}s:66:"Symfony/Component/Finder/Tests/Iterator/PathFilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"6f6ac3f2c9e2663f778d2ca0e700fc34";s:4:"name";s:66:"Symfony/Component/Finder/Tests/Iterator/PathFilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/PathFilterIteratorTest.php";}s:64:"Symfony/Component/Finder/Tests/Iterator/RealIteratorTestCase.php";a:4:{s:6:"md5sum";s:32:"ff1381bf96a6d4b7e99328cd2a2e0a23";s:4:"name";s:64:"Symfony/Component/Finder/Tests/Iterator/RealIteratorTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/RealIteratorTestCase.php";}s:74:"Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php";a:4:{s:6:"md5sum";s:32:"3a331462cae2726ae6e1f608f6da87bb";s:4:"name";s:74:"Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php";}s:71:"Symfony/Component/Finder/Tests/Iterator/SizeRangeFilterIteratorTest.php";a:4:{s:6:"md5sum";s:32:"398cce21c68fe443d6303260d7c8a5cb";s:4:"name";s:71:"Symfony/Component/Finder/Tests/Iterator/SizeRangeFilterIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/SizeRangeFilterIteratorTest.php";}s:64:"Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php";a:4:{s:6:"md5sum";s:32:"c08270fdc6490d0f92767a14506df3ad";s:4:"name";s:64:"Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:33:{s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Adapter";b:1;s:54:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:65:"/opt/alt/php54/usr/share/doc/pear/Finder/Symfony/Component/Finder";b:1;s:58:"/opt/alt/php54/usr/share/doc/pear/Finder/Symfony/Component";b:1;s:48:"/opt/alt/php54/usr/share/doc/pear/Finder/Symfony";b:1;s:40:"/opt/alt/php54/usr/share/doc/pear/Finder";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Comparator";b:1;s:64:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Exception";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Expression";b:1;s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Iterator";b:1;s:66:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder";b:1;s:59:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component";b:1;s:49:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony";b:1;s:41:"/opt/alt/php54/usr/share/pear/test/Finder";b:1;s:60:"/opt/alt/php54/usr/share/pear/Symfony/Component/Finder/Shell";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Comparator";b:1;s:72:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Expression";b:1;s:84:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/FakeAdapter";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/A";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures";b:1;s:85:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/A/B";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/A/B/C";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/copy/A";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/copy";b:1;s:90:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/B";b:1;s:92:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/copy/A/B/C";b:1;s:85:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/one";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/one/b";b:1;s:92:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Fixtures/with space";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Finder/Symfony/Component/Finder/Tests/Iterator";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\���^����3pear/.registry/.channel.pear.symfony.com/config.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:6:"Config";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:25:"Symfony2 Config Component";s:11:"description";s:25:"Symfony2 Config Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:41";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:100:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d05aef71cd966ce2c36098180be89f86";s:4:"name";s:39:"Symfony/Component/Config/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2e855ecea3b2fd176fcde9dcbee078b4";s:4:"name";s:37:"Symfony/Component/Config/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"01e6d3e3f3a09e1d220b680f222152b3";s:4:"name";s:38:"Symfony/Component/Config/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"237f4a7e38967f0ce1f4088a999e0bfa";s:4:"name";s:40:"Symfony/Component/Config/ConfigCache.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f43a790400b259a8a307fd4da828692d";s:4:"name";s:49:"Symfony/Component/Config/Definition/ArrayNode.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a93e8f4c6f94c2d8bf86546930191d59";s:4:"name";s:48:"Symfony/Component/Config/Definition/BaseNode.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea6292c05f9aa76ec66dded2fe411d44";s:4:"name";s:51:"Symfony/Component/Config/Definition/BooleanNode.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a6478a434beef0f4d0146d4ce64b9450";s:4:"name";s:67:"Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"79419f2566cf399be4660640a0405fa5";s:4:"name";s:69:"Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2935ae381b785ced6f6ec1eded9a9ce0";s:4:"name";s:66:"Symfony/Component/Config/Definition/Builder/EnumNodeDefinition.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4612723b84cd2729dd94020f1412539a";s:4:"name";s:59:"Symfony/Component/Config/Definition/Builder/ExprBuilder.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea6a82bed9a7bfe2f7c7e4bded4ba25e";s:4:"name";s:67:"Symfony/Component/Config/Definition/Builder/FloatNodeDefinition.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0de24b6c3b0846189e0e7140340e4c20";s:4:"name";s:69:"Symfony/Component/Config/Definition/Builder/IntegerNodeDefinition.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9a07191e37bffb3d56fd105365371a73";s:4:"name";s:60:"Symfony/Component/Config/Definition/Builder/MergeBuilder.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2c90e62ffffbcb9ee0f5b91d4b466f4a";s:4:"name";s:59:"Symfony/Component/Config/Definition/Builder/NodeBuilder.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"632c164c115dfa3969cc278fabb707ac";s:4:"name";s:62:"Symfony/Component/Config/Definition/Builder/NodeDefinition.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"511a0150b959a7eab00cbf0fed174c0a";s:4:"name";s:67:"Symfony/Component/Config/Definition/Builder/NodeParentInterface.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f03726ad2acc69648e3f4c92c3436b63";s:4:"name";s:68:"Symfony/Component/Config/Definition/Builder/NormalizationBuilder.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"23b4be07040f89b6bbc54fff80c97835";s:4:"name";s:69:"Symfony/Component/Config/Definition/Builder/NumericNodeDefinition.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ac0a6d2f8ae048f365844d761db049db";s:4:"name";s:77:"Symfony/Component/Config/Definition/Builder/ParentNodeDefinitionInterface.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d9fa4186f4448c3cad8152bb9b08a10d";s:4:"name";s:68:"Symfony/Component/Config/Definition/Builder/ScalarNodeDefinition.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"48f136a2fe26ef3b84f2f4e785dafdca";s:4:"name";s:59:"Symfony/Component/Config/Definition/Builder/TreeBuilder.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8c0ab61f8ce4e8a0b95fae338d07289d";s:4:"name";s:65:"Symfony/Component/Config/Definition/Builder/ValidationBuilder.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0563011a6e9c41ea7b14fccd4c384d91";s:4:"name";s:70:"Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3c993b6405debf926234927327e1540e";s:4:"name";s:62:"Symfony/Component/Config/Definition/ConfigurationInterface.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"180a524d66b02398fec5f36baf16db87";s:4:"name";s:65:"Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"88061b0ef652b050eacda9f9d086777f";s:4:"name";s:66:"Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4718c796e11ef0403e41dce26b7224ea";s:4:"name";s:48:"Symfony/Component/Config/Definition/EnumNode.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ede2ab4177afff995069bc54c4517f9e";s:4:"name";s:71:"Symfony/Component/Config/Definition/Exception/DuplicateKeyException.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a7eb222da39a7eefc7b0c04a1583cc44";s:4:"name";s:59:"Symfony/Component/Config/Definition/Exception/Exception.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e2a12d6760feb9f7c96d61e502f68b2c";s:4:"name";s:77:"Symfony/Component/Config/Definition/Exception/ForbiddenOverwriteException.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df898eea27890a50cb912e1dbb88f1b2";s:4:"name";s:79:"Symfony/Component/Config/Definition/Exception/InvalidConfigurationException.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aeb2ca3c7e035486a4ccebeac363125c";s:4:"name";s:76:"Symfony/Component/Config/Definition/Exception/InvalidDefinitionException.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4dc25832f90b656b88da8ac50789784a";s:4:"name";s:70:"Symfony/Component/Config/Definition/Exception/InvalidTypeException.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"55c97aa4e81643f04c3abd943cc29a24";s:4:"name";s:67:"Symfony/Component/Config/Definition/Exception/UnsetKeyException.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3e06f85a85b21a16869037e026ec5189";s:4:"name";s:49:"Symfony/Component/Config/Definition/FloatNode.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c06b0c32a7f8c540545b7a78662eba48";s:4:"name";s:51:"Symfony/Component/Config/Definition/IntegerNode.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c735fbb1542c2dbe1d8037b27b0beb7d";s:4:"name";s:53:"Symfony/Component/Config/Definition/NodeInterface.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"864cb20b0ce39fa3d8d30f96ee41674e";s:4:"name";s:51:"Symfony/Component/Config/Definition/NumericNode.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4d853174c3a8b201b3684fd8cdc5b768";s:4:"name";s:49:"Symfony/Component/Config/Definition/Processor.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dea67be834c0088d2b11880b694a38f9";s:4:"name";s:59:"Symfony/Component/Config/Definition/PrototypedArrayNode.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ef44def01e8a4abfa4eaabdab44a3e1e";s:4:"name";s:62:"Symfony/Component/Config/Definition/PrototypeNodeInterface.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"52e870bf26dfc67c5cc508f35728877d";s:4:"name";s:55:"Symfony/Component/Config/Definition/ReferenceDumper.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7b0e2b4e13486b70af9a70a2d8b9f403";s:4:"name";s:50:"Symfony/Component/Config/Definition/ScalarNode.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c83791bd28ed5e4abf7e79c3b906252f";s:4:"name";s:52:"Symfony/Component/Config/Definition/VariableNode.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b00d7fdeddee90ff6e91ffa0c0475e91";s:4:"name";s:81:"Symfony/Component/Config/Exception/FileLoaderImportCircularReferenceException.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e31db44ccc39c72d40a6a9edc2fa66c5";s:4:"name";s:62:"Symfony/Component/Config/Exception/FileLoaderLoadException.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8145d1e145a232182b2a7780b5fd2ac9";s:4:"name";s:40:"Symfony/Component/Config/FileLocator.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c7ad8a99c8bc28c7e0e151c4fc5acff7";s:4:"name";s:49:"Symfony/Component/Config/FileLocatorInterface.php";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:32:"Symfony/Component/Config/LICENSE";s:4:"role";s:3:"doc";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eeb0111110364ce7bb3bfcc9d771c21b";s:4:"name";s:52:"Symfony/Component/Config/Loader/DelegatingLoader.php";s:4:"role";s:3:"php";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"db1f00201bb87f7e952648484aedbeb2";s:4:"name";s:46:"Symfony/Component/Config/Loader/FileLoader.php";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"284f38e73bfa8153ed95e7aa99e91b3e";s:4:"name";s:42:"Symfony/Component/Config/Loader/Loader.php";s:4:"role";s:3:"php";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df23b397d09d2260b2fa666de641cef2";s:4:"name";s:51:"Symfony/Component/Config/Loader/LoaderInterface.php";s:4:"role";s:3:"php";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df8900364600fbe7fcb4b32dcd948715";s:4:"name";s:50:"Symfony/Component/Config/Loader/LoaderResolver.php";s:4:"role";s:3:"php";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ff8788c585296546155b51834d0c3919";s:4:"name";s:59:"Symfony/Component/Config/Loader/LoaderResolverInterface.php";s:4:"role";s:3:"php";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba93c00cbc0805b83cc9986edb1c47a0";s:4:"name";s:41:"Symfony/Component/Config/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"80fb119edb21de39ff671d640fc7f381";s:4:"name";s:34:"Symfony/Component/Config/README.md";s:4:"role";s:3:"doc";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"282da7b67d1a869a71f1810bdc3d8973";s:4:"name";s:55:"Symfony/Component/Config/Resource/DirectoryResource.php";s:4:"role";s:3:"php";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4f6a17cb16d8b483fd9b563fa6d2639f";s:4:"name";s:50:"Symfony/Component/Config/Resource/FileResource.php";s:4:"role";s:3:"php";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a822b81682a486b7817170ad83002141";s:4:"name";s:55:"Symfony/Component/Config/Resource/ResourceInterface.php";s:4:"role";s:3:"php";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b9a1f02f3774a704eab93339d9a34800";s:4:"name";s:50:"Symfony/Component/Config/Tests/ConfigCacheTest.php";s:4:"role";s:4:"test";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d6c9405065e761fd9bae37c68b9226cb";s:4:"name";s:59:"Symfony/Component/Config/Tests/Definition/ArrayNodeTest.php";s:4:"role";s:4:"test";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a78dc9a09b81abd4216dc1aa743b212c";s:4:"name";s:61:"Symfony/Component/Config/Tests/Definition/BooleanNodeTest.php";s:4:"role";s:4:"test";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"000369ac6ed9312c820a1a511480fcdd";s:4:"name";s:77:"Symfony/Component/Config/Tests/Definition/Builder/ArrayNodeDefinitionTest.php";s:4:"role";s:4:"test";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a6338f1a07bbe404e4caa1b1fdb179fd";s:4:"name";s:76:"Symfony/Component/Config/Tests/Definition/Builder/EnumNodeDefinitionTest.php";s:4:"role";s:4:"test";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d03be2c954f36df3c615e6a89eba304b";s:4:"name";s:69:"Symfony/Component/Config/Tests/Definition/Builder/ExprBuilderTest.php";s:4:"role";s:4:"test";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5deab29f7b387cd324ad3a2e3086d80d";s:4:"name";s:69:"Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"720159fadc5f8388c5c7cc16cfd9559e";s:4:"name";s:79:"Symfony/Component/Config/Tests/Definition/Builder/NumericNodeDefinitionTest.php";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"24a37c336daa3cd1a1d80d670505b32d";s:4:"name";s:69:"Symfony/Component/Config/Tests/Definition/Builder/TreeBuilderTest.php";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"565ad8f4a0db6f7e6c4173b711bc3976";s:4:"name";s:75:"Symfony/Component/Config/Tests/Definition/Dumper/XmlReferenceDumperTest.php";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ebf1ffd5db00b1c0e9b914fe83fb3169";s:4:"name";s:76:"Symfony/Component/Config/Tests/Definition/Dumper/YamlReferenceDumperTest.php";s:4:"role";s:4:"test";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"92624818027c535fe005d85d365bdaaa";s:4:"name";s:58:"Symfony/Component/Config/Tests/Definition/EnumNodeTest.php";s:4:"role";s:4:"test";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2f083bc35c2a3769c24a185d4bffd428";s:4:"name";s:62:"Symfony/Component/Config/Tests/Definition/FinalizationTest.php";s:4:"role";s:4:"test";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"78e5e5856b6071f3c7f9f8da4881a06d";s:4:"name";s:59:"Symfony/Component/Config/Tests/Definition/FloatNodeTest.php";s:4:"role";s:4:"test";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a5a4ed81aef01e766cb948154ae92643";s:4:"name";s:61:"Symfony/Component/Config/Tests/Definition/IntegerNodeTest.php";s:4:"role";s:4:"test";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a81e2313992cb216f88f46113da997ce";s:4:"name";s:55:"Symfony/Component/Config/Tests/Definition/MergeTest.php";s:4:"role";s:4:"test";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8ac64aa50fcdabc32efa4d76fa08737";s:4:"name";s:63:"Symfony/Component/Config/Tests/Definition/NormalizationTest.php";s:4:"role";s:4:"test";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dc6f3545eb30eb7efd1f84278c1b08dd";s:4:"name";s:69:"Symfony/Component/Config/Tests/Definition/PrototypedArrayNodeTest.php";s:4:"role";s:4:"test";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cab8145a6c30d31be3d4897cc68208f6";s:4:"name";s:60:"Symfony/Component/Config/Tests/Definition/ScalarNodeTest.php";s:4:"role";s:4:"test";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8157a7f666d2269ba36f5d12b71b392c";s:4:"name";s:50:"Symfony/Component/Config/Tests/FileLocatorTest.php";s:4:"role";s:4:"test";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:53:"Symfony/Component/Config/Tests/Fixtures/Again/foo.xml";s:4:"role";s:4:"test";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"61483df06205d8340ff30281494ddf4d";s:4:"name";s:69:"Symfony/Component/Config/Tests/Fixtures/Builder/BarNodeDefinition.php";s:4:"role";s:4:"test";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bb1913bbf75e3a341384f2dd58267465";s:4:"name";s:63:"Symfony/Component/Config/Tests/Fixtures/Builder/NodeBuilder.php";s:4:"role";s:4:"test";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c5057b3b1c5b4790985800ea90cd4d7a";s:4:"name";s:74:"Symfony/Component/Config/Tests/Fixtures/Builder/VariableNodeDefinition.php";s:4:"role";s:4:"test";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ca56644f6fcffdd18a57f5e29db5faf";s:4:"name";s:78:"Symfony/Component/Config/Tests/Fixtures/Configuration/ExampleConfiguration.php";s:4:"role";s:4:"test";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:47:"Symfony/Component/Config/Tests/Fixtures/foo.xml";s:4:"role";s:4:"test";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0b3c991715906416d884a53869b71210";s:4:"name";s:62:"Symfony/Component/Config/Tests/Fixtures/Util/document_type.xml";s:4:"role";s:4:"test";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9faea03761cbb774e569e0ddc15118a2";s:4:"name";s:56:"Symfony/Component/Config/Tests/Fixtures/Util/invalid.xml";s:4:"role";s:4:"test";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5527ef0a29820ff2870e0749cd38c297";s:4:"name";s:63:"Symfony/Component/Config/Tests/Fixtures/Util/invalid_schema.xml";s:4:"role";s:4:"test";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1ffa211272544831555c45f701a9e523";s:4:"name";s:55:"Symfony/Component/Config/Tests/Fixtures/Util/schema.xsd";s:4:"role";s:4:"test";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"57e37ff0b94a2574fe00e18efbc92a4c";s:4:"name";s:54:"Symfony/Component/Config/Tests/Fixtures/Util/valid.xml";s:4:"role";s:4:"test";}}i:92;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7cb65249e81babb2867f7a2afecc2201";s:4:"name";s:62:"Symfony/Component/Config/Tests/Loader/DelegatingLoaderTest.php";s:4:"role";s:4:"test";}}i:93;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7ea599ca7987b26ebbc49c7a204ed566";s:4:"name";s:56:"Symfony/Component/Config/Tests/Loader/FileLoaderTest.php";s:4:"role";s:4:"test";}}i:94;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4b52c0a493e0abe0c016757c3b81871f";s:4:"name";s:60:"Symfony/Component/Config/Tests/Loader/LoaderResolverTest.php";s:4:"role";s:4:"test";}}i:95;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"948c42a53d8bad4d6ba2a54c4ec000fd";s:4:"name";s:52:"Symfony/Component/Config/Tests/Loader/LoaderTest.php";s:4:"role";s:4:"test";}}i:96;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c4027624b5fb8e923b71f4eab6a996d0";s:4:"name";s:65:"Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php";s:4:"role";s:4:"test";}}i:97;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e37cf4fd016b4652013a54aed653a90c";s:4:"name";s:60:"Symfony/Component/Config/Tests/Resource/FileResourceTest.php";s:4:"role";s:4:"test";}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aa364fa2a9af8fb8fb396ba173c2b3b3";s:4:"name";s:52:"Symfony/Component/Config/Tests/Util/XmlUtilsTest.php";s:4:"role";s:4:"test";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b90ce309828aad9fe732e136489b77f6";s:4:"name";s:42:"Symfony/Component/Config/Util/XmlUtils.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:100:{s:39:"Symfony/Component/Config/autoloader.php";a:4:{s:6:"md5sum";s:32:"d05aef71cd966ce2c36098180be89f86";s:4:"name";s:39:"Symfony/Component/Config/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/autoloader.php";}s:37:"Symfony/Component/Config/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"2e855ecea3b2fd176fcde9dcbee078b4";s:4:"name";s:37:"Symfony/Component/Config/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/doc/pear/Config/Symfony/Component/Config/CHANGELOG.md";}s:38:"Symfony/Component/Config/composer.json";a:4:{s:6:"md5sum";s:32:"01e6d3e3f3a09e1d220b680f222152b3";s:4:"name";s:38:"Symfony/Component/Config/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/doc/pear/Config/Symfony/Component/Config/composer.json";}s:40:"Symfony/Component/Config/ConfigCache.php";a:4:{s:6:"md5sum";s:32:"237f4a7e38967f0ce1f4088a999e0bfa";s:4:"name";s:40:"Symfony/Component/Config/ConfigCache.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/ConfigCache.php";}s:49:"Symfony/Component/Config/Definition/ArrayNode.php";a:4:{s:6:"md5sum";s:32:"f43a790400b259a8a307fd4da828692d";s:4:"name";s:49:"Symfony/Component/Config/Definition/ArrayNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/ArrayNode.php";}s:48:"Symfony/Component/Config/Definition/BaseNode.php";a:4:{s:6:"md5sum";s:32:"a93e8f4c6f94c2d8bf86546930191d59";s:4:"name";s:48:"Symfony/Component/Config/Definition/BaseNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/BaseNode.php";}s:51:"Symfony/Component/Config/Definition/BooleanNode.php";a:4:{s:6:"md5sum";s:32:"ea6292c05f9aa76ec66dded2fe411d44";s:4:"name";s:51:"Symfony/Component/Config/Definition/BooleanNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/BooleanNode.php";}s:67:"Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php";a:4:{s:6:"md5sum";s:32:"a6478a434beef0f4d0146d4ce64b9450";s:4:"name";s:67:"Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php";}s:69:"Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php";a:4:{s:6:"md5sum";s:32:"79419f2566cf399be4660640a0405fa5";s:4:"name";s:69:"Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php";}s:66:"Symfony/Component/Config/Definition/Builder/EnumNodeDefinition.php";a:4:{s:6:"md5sum";s:32:"2935ae381b785ced6f6ec1eded9a9ce0";s:4:"name";s:66:"Symfony/Component/Config/Definition/Builder/EnumNodeDefinition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/EnumNodeDefinition.php";}s:59:"Symfony/Component/Config/Definition/Builder/ExprBuilder.php";a:4:{s:6:"md5sum";s:32:"4612723b84cd2729dd94020f1412539a";s:4:"name";s:59:"Symfony/Component/Config/Definition/Builder/ExprBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/ExprBuilder.php";}s:67:"Symfony/Component/Config/Definition/Builder/FloatNodeDefinition.php";a:4:{s:6:"md5sum";s:32:"ea6a82bed9a7bfe2f7c7e4bded4ba25e";s:4:"name";s:67:"Symfony/Component/Config/Definition/Builder/FloatNodeDefinition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/FloatNodeDefinition.php";}s:69:"Symfony/Component/Config/Definition/Builder/IntegerNodeDefinition.php";a:4:{s:6:"md5sum";s:32:"0de24b6c3b0846189e0e7140340e4c20";s:4:"name";s:69:"Symfony/Component/Config/Definition/Builder/IntegerNodeDefinition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/IntegerNodeDefinition.php";}s:60:"Symfony/Component/Config/Definition/Builder/MergeBuilder.php";a:4:{s:6:"md5sum";s:32:"9a07191e37bffb3d56fd105365371a73";s:4:"name";s:60:"Symfony/Component/Config/Definition/Builder/MergeBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/MergeBuilder.php";}s:59:"Symfony/Component/Config/Definition/Builder/NodeBuilder.php";a:4:{s:6:"md5sum";s:32:"2c90e62ffffbcb9ee0f5b91d4b466f4a";s:4:"name";s:59:"Symfony/Component/Config/Definition/Builder/NodeBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/NodeBuilder.php";}s:62:"Symfony/Component/Config/Definition/Builder/NodeDefinition.php";a:4:{s:6:"md5sum";s:32:"632c164c115dfa3969cc278fabb707ac";s:4:"name";s:62:"Symfony/Component/Config/Definition/Builder/NodeDefinition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/NodeDefinition.php";}s:67:"Symfony/Component/Config/Definition/Builder/NodeParentInterface.php";a:4:{s:6:"md5sum";s:32:"511a0150b959a7eab00cbf0fed174c0a";s:4:"name";s:67:"Symfony/Component/Config/Definition/Builder/NodeParentInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/NodeParentInterface.php";}s:68:"Symfony/Component/Config/Definition/Builder/NormalizationBuilder.php";a:4:{s:6:"md5sum";s:32:"f03726ad2acc69648e3f4c92c3436b63";s:4:"name";s:68:"Symfony/Component/Config/Definition/Builder/NormalizationBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/NormalizationBuilder.php";}s:69:"Symfony/Component/Config/Definition/Builder/NumericNodeDefinition.php";a:4:{s:6:"md5sum";s:32:"23b4be07040f89b6bbc54fff80c97835";s:4:"name";s:69:"Symfony/Component/Config/Definition/Builder/NumericNodeDefinition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/NumericNodeDefinition.php";}s:77:"Symfony/Component/Config/Definition/Builder/ParentNodeDefinitionInterface.php";a:4:{s:6:"md5sum";s:32:"ac0a6d2f8ae048f365844d761db049db";s:4:"name";s:77:"Symfony/Component/Config/Definition/Builder/ParentNodeDefinitionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/ParentNodeDefinitionInterface.php";}s:68:"Symfony/Component/Config/Definition/Builder/ScalarNodeDefinition.php";a:4:{s:6:"md5sum";s:32:"d9fa4186f4448c3cad8152bb9b08a10d";s:4:"name";s:68:"Symfony/Component/Config/Definition/Builder/ScalarNodeDefinition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/ScalarNodeDefinition.php";}s:59:"Symfony/Component/Config/Definition/Builder/TreeBuilder.php";a:4:{s:6:"md5sum";s:32:"48f136a2fe26ef3b84f2f4e785dafdca";s:4:"name";s:59:"Symfony/Component/Config/Definition/Builder/TreeBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/TreeBuilder.php";}s:65:"Symfony/Component/Config/Definition/Builder/ValidationBuilder.php";a:4:{s:6:"md5sum";s:32:"8c0ab61f8ce4e8a0b95fae338d07289d";s:4:"name";s:65:"Symfony/Component/Config/Definition/Builder/ValidationBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/ValidationBuilder.php";}s:70:"Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php";a:4:{s:6:"md5sum";s:32:"0563011a6e9c41ea7b14fccd4c384d91";s:4:"name";s:70:"Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php";}s:62:"Symfony/Component/Config/Definition/ConfigurationInterface.php";a:4:{s:6:"md5sum";s:32:"3c993b6405debf926234927327e1540e";s:4:"name";s:62:"Symfony/Component/Config/Definition/ConfigurationInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/ConfigurationInterface.php";}s:65:"Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.php";a:4:{s:6:"md5sum";s:32:"180a524d66b02398fec5f36baf16db87";s:4:"name";s:65:"Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.php";}s:66:"Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php";a:4:{s:6:"md5sum";s:32:"88061b0ef652b050eacda9f9d086777f";s:4:"name";s:66:"Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php";}s:48:"Symfony/Component/Config/Definition/EnumNode.php";a:4:{s:6:"md5sum";s:32:"4718c796e11ef0403e41dce26b7224ea";s:4:"name";s:48:"Symfony/Component/Config/Definition/EnumNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/EnumNode.php";}s:71:"Symfony/Component/Config/Definition/Exception/DuplicateKeyException.php";a:4:{s:6:"md5sum";s:32:"ede2ab4177afff995069bc54c4517f9e";s:4:"name";s:71:"Symfony/Component/Config/Definition/Exception/DuplicateKeyException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Exception/DuplicateKeyException.php";}s:59:"Symfony/Component/Config/Definition/Exception/Exception.php";a:4:{s:6:"md5sum";s:32:"a7eb222da39a7eefc7b0c04a1583cc44";s:4:"name";s:59:"Symfony/Component/Config/Definition/Exception/Exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Exception/Exception.php";}s:77:"Symfony/Component/Config/Definition/Exception/ForbiddenOverwriteException.php";a:4:{s:6:"md5sum";s:32:"e2a12d6760feb9f7c96d61e502f68b2c";s:4:"name";s:77:"Symfony/Component/Config/Definition/Exception/ForbiddenOverwriteException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Exception/ForbiddenOverwriteException.php";}s:79:"Symfony/Component/Config/Definition/Exception/InvalidConfigurationException.php";a:4:{s:6:"md5sum";s:32:"df898eea27890a50cb912e1dbb88f1b2";s:4:"name";s:79:"Symfony/Component/Config/Definition/Exception/InvalidConfigurationException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Exception/InvalidConfigurationException.php";}s:76:"Symfony/Component/Config/Definition/Exception/InvalidDefinitionException.php";a:4:{s:6:"md5sum";s:32:"aeb2ca3c7e035486a4ccebeac363125c";s:4:"name";s:76:"Symfony/Component/Config/Definition/Exception/InvalidDefinitionException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Exception/InvalidDefinitionException.php";}s:70:"Symfony/Component/Config/Definition/Exception/InvalidTypeException.php";a:4:{s:6:"md5sum";s:32:"4dc25832f90b656b88da8ac50789784a";s:4:"name";s:70:"Symfony/Component/Config/Definition/Exception/InvalidTypeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Exception/InvalidTypeException.php";}s:67:"Symfony/Component/Config/Definition/Exception/UnsetKeyException.php";a:4:{s:6:"md5sum";s:32:"55c97aa4e81643f04c3abd943cc29a24";s:4:"name";s:67:"Symfony/Component/Config/Definition/Exception/UnsetKeyException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Exception/UnsetKeyException.php";}s:49:"Symfony/Component/Config/Definition/FloatNode.php";a:4:{s:6:"md5sum";s:32:"3e06f85a85b21a16869037e026ec5189";s:4:"name";s:49:"Symfony/Component/Config/Definition/FloatNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/FloatNode.php";}s:51:"Symfony/Component/Config/Definition/IntegerNode.php";a:4:{s:6:"md5sum";s:32:"c06b0c32a7f8c540545b7a78662eba48";s:4:"name";s:51:"Symfony/Component/Config/Definition/IntegerNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/IntegerNode.php";}s:53:"Symfony/Component/Config/Definition/NodeInterface.php";a:4:{s:6:"md5sum";s:32:"c735fbb1542c2dbe1d8037b27b0beb7d";s:4:"name";s:53:"Symfony/Component/Config/Definition/NodeInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/NodeInterface.php";}s:51:"Symfony/Component/Config/Definition/NumericNode.php";a:4:{s:6:"md5sum";s:32:"864cb20b0ce39fa3d8d30f96ee41674e";s:4:"name";s:51:"Symfony/Component/Config/Definition/NumericNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/NumericNode.php";}s:49:"Symfony/Component/Config/Definition/Processor.php";a:4:{s:6:"md5sum";s:32:"4d853174c3a8b201b3684fd8cdc5b768";s:4:"name";s:49:"Symfony/Component/Config/Definition/Processor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Processor.php";}s:59:"Symfony/Component/Config/Definition/PrototypedArrayNode.php";a:4:{s:6:"md5sum";s:32:"dea67be834c0088d2b11880b694a38f9";s:4:"name";s:59:"Symfony/Component/Config/Definition/PrototypedArrayNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/PrototypedArrayNode.php";}s:62:"Symfony/Component/Config/Definition/PrototypeNodeInterface.php";a:4:{s:6:"md5sum";s:32:"ef44def01e8a4abfa4eaabdab44a3e1e";s:4:"name";s:62:"Symfony/Component/Config/Definition/PrototypeNodeInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/PrototypeNodeInterface.php";}s:55:"Symfony/Component/Config/Definition/ReferenceDumper.php";a:4:{s:6:"md5sum";s:32:"52e870bf26dfc67c5cc508f35728877d";s:4:"name";s:55:"Symfony/Component/Config/Definition/ReferenceDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/ReferenceDumper.php";}s:50:"Symfony/Component/Config/Definition/ScalarNode.php";a:4:{s:6:"md5sum";s:32:"7b0e2b4e13486b70af9a70a2d8b9f403";s:4:"name";s:50:"Symfony/Component/Config/Definition/ScalarNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/ScalarNode.php";}s:52:"Symfony/Component/Config/Definition/VariableNode.php";a:4:{s:6:"md5sum";s:32:"c83791bd28ed5e4abf7e79c3b906252f";s:4:"name";s:52:"Symfony/Component/Config/Definition/VariableNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/VariableNode.php";}s:81:"Symfony/Component/Config/Exception/FileLoaderImportCircularReferenceException.php";a:4:{s:6:"md5sum";s:32:"b00d7fdeddee90ff6e91ffa0c0475e91";s:4:"name";s:81:"Symfony/Component/Config/Exception/FileLoaderImportCircularReferenceException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Exception/FileLoaderImportCircularReferenceException.php";}s:62:"Symfony/Component/Config/Exception/FileLoaderLoadException.php";a:4:{s:6:"md5sum";s:32:"e31db44ccc39c72d40a6a9edc2fa66c5";s:4:"name";s:62:"Symfony/Component/Config/Exception/FileLoaderLoadException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Exception/FileLoaderLoadException.php";}s:40:"Symfony/Component/Config/FileLocator.php";a:4:{s:6:"md5sum";s:32:"8145d1e145a232182b2a7780b5fd2ac9";s:4:"name";s:40:"Symfony/Component/Config/FileLocator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/FileLocator.php";}s:49:"Symfony/Component/Config/FileLocatorInterface.php";a:4:{s:6:"md5sum";s:32:"c7ad8a99c8bc28c7e0e151c4fc5acff7";s:4:"name";s:49:"Symfony/Component/Config/FileLocatorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/FileLocatorInterface.php";}s:32:"Symfony/Component/Config/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:32:"Symfony/Component/Config/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/doc/pear/Config/Symfony/Component/Config/LICENSE";}s:52:"Symfony/Component/Config/Loader/DelegatingLoader.php";a:4:{s:6:"md5sum";s:32:"eeb0111110364ce7bb3bfcc9d771c21b";s:4:"name";s:52:"Symfony/Component/Config/Loader/DelegatingLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Loader/DelegatingLoader.php";}s:46:"Symfony/Component/Config/Loader/FileLoader.php";a:4:{s:6:"md5sum";s:32:"db1f00201bb87f7e952648484aedbeb2";s:4:"name";s:46:"Symfony/Component/Config/Loader/FileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Loader/FileLoader.php";}s:42:"Symfony/Component/Config/Loader/Loader.php";a:4:{s:6:"md5sum";s:32:"284f38e73bfa8153ed95e7aa99e91b3e";s:4:"name";s:42:"Symfony/Component/Config/Loader/Loader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Loader/Loader.php";}s:51:"Symfony/Component/Config/Loader/LoaderInterface.php";a:4:{s:6:"md5sum";s:32:"df23b397d09d2260b2fa666de641cef2";s:4:"name";s:51:"Symfony/Component/Config/Loader/LoaderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Loader/LoaderInterface.php";}s:50:"Symfony/Component/Config/Loader/LoaderResolver.php";a:4:{s:6:"md5sum";s:32:"df8900364600fbe7fcb4b32dcd948715";s:4:"name";s:50:"Symfony/Component/Config/Loader/LoaderResolver.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Loader/LoaderResolver.php";}s:59:"Symfony/Component/Config/Loader/LoaderResolverInterface.php";a:4:{s:6:"md5sum";s:32:"ff8788c585296546155b51834d0c3919";s:4:"name";s:59:"Symfony/Component/Config/Loader/LoaderResolverInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Loader/LoaderResolverInterface.php";}s:41:"Symfony/Component/Config/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"ba93c00cbc0805b83cc9986edb1c47a0";s:4:"name";s:41:"Symfony/Component/Config/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/phpunit.xml.dist";}s:34:"Symfony/Component/Config/README.md";a:4:{s:6:"md5sum";s:32:"80fb119edb21de39ff671d640fc7f381";s:4:"name";s:34:"Symfony/Component/Config/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/doc/pear/Config/Symfony/Component/Config/README.md";}s:55:"Symfony/Component/Config/Resource/DirectoryResource.php";a:4:{s:6:"md5sum";s:32:"282da7b67d1a869a71f1810bdc3d8973";s:4:"name";s:55:"Symfony/Component/Config/Resource/DirectoryResource.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Resource/DirectoryResource.php";}s:50:"Symfony/Component/Config/Resource/FileResource.php";a:4:{s:6:"md5sum";s:32:"4f6a17cb16d8b483fd9b563fa6d2639f";s:4:"name";s:50:"Symfony/Component/Config/Resource/FileResource.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Resource/FileResource.php";}s:55:"Symfony/Component/Config/Resource/ResourceInterface.php";a:4:{s:6:"md5sum";s:32:"a822b81682a486b7817170ad83002141";s:4:"name";s:55:"Symfony/Component/Config/Resource/ResourceInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Resource/ResourceInterface.php";}s:50:"Symfony/Component/Config/Tests/ConfigCacheTest.php";a:4:{s:6:"md5sum";s:32:"b9a1f02f3774a704eab93339d9a34800";s:4:"name";s:50:"Symfony/Component/Config/Tests/ConfigCacheTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/ConfigCacheTest.php";}s:59:"Symfony/Component/Config/Tests/Definition/ArrayNodeTest.php";a:4:{s:6:"md5sum";s:32:"d6c9405065e761fd9bae37c68b9226cb";s:4:"name";s:59:"Symfony/Component/Config/Tests/Definition/ArrayNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/ArrayNodeTest.php";}s:61:"Symfony/Component/Config/Tests/Definition/BooleanNodeTest.php";a:4:{s:6:"md5sum";s:32:"a78dc9a09b81abd4216dc1aa743b212c";s:4:"name";s:61:"Symfony/Component/Config/Tests/Definition/BooleanNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/BooleanNodeTest.php";}s:77:"Symfony/Component/Config/Tests/Definition/Builder/ArrayNodeDefinitionTest.php";a:4:{s:6:"md5sum";s:32:"000369ac6ed9312c820a1a511480fcdd";s:4:"name";s:77:"Symfony/Component/Config/Tests/Definition/Builder/ArrayNodeDefinitionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/ArrayNodeDefinitionTest.php";}s:76:"Symfony/Component/Config/Tests/Definition/Builder/EnumNodeDefinitionTest.php";a:4:{s:6:"md5sum";s:32:"a6338f1a07bbe404e4caa1b1fdb179fd";s:4:"name";s:76:"Symfony/Component/Config/Tests/Definition/Builder/EnumNodeDefinitionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/EnumNodeDefinitionTest.php";}s:69:"Symfony/Component/Config/Tests/Definition/Builder/ExprBuilderTest.php";a:4:{s:6:"md5sum";s:32:"d03be2c954f36df3c615e6a89eba304b";s:4:"name";s:69:"Symfony/Component/Config/Tests/Definition/Builder/ExprBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/ExprBuilderTest.php";}s:69:"Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php";a:4:{s:6:"md5sum";s:32:"5deab29f7b387cd324ad3a2e3086d80d";s:4:"name";s:69:"Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php";}s:79:"Symfony/Component/Config/Tests/Definition/Builder/NumericNodeDefinitionTest.php";a:4:{s:6:"md5sum";s:32:"720159fadc5f8388c5c7cc16cfd9559e";s:4:"name";s:79:"Symfony/Component/Config/Tests/Definition/Builder/NumericNodeDefinitionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/NumericNodeDefinitionTest.php";}s:69:"Symfony/Component/Config/Tests/Definition/Builder/TreeBuilderTest.php";a:4:{s:6:"md5sum";s:32:"24a37c336daa3cd1a1d80d670505b32d";s:4:"name";s:69:"Symfony/Component/Config/Tests/Definition/Builder/TreeBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/TreeBuilderTest.php";}s:75:"Symfony/Component/Config/Tests/Definition/Dumper/XmlReferenceDumperTest.php";a:4:{s:6:"md5sum";s:32:"565ad8f4a0db6f7e6c4173b711bc3976";s:4:"name";s:75:"Symfony/Component/Config/Tests/Definition/Dumper/XmlReferenceDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/Dumper/XmlReferenceDumperTest.php";}s:76:"Symfony/Component/Config/Tests/Definition/Dumper/YamlReferenceDumperTest.php";a:4:{s:6:"md5sum";s:32:"ebf1ffd5db00b1c0e9b914fe83fb3169";s:4:"name";s:76:"Symfony/Component/Config/Tests/Definition/Dumper/YamlReferenceDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/Dumper/YamlReferenceDumperTest.php";}s:58:"Symfony/Component/Config/Tests/Definition/EnumNodeTest.php";a:4:{s:6:"md5sum";s:32:"92624818027c535fe005d85d365bdaaa";s:4:"name";s:58:"Symfony/Component/Config/Tests/Definition/EnumNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/EnumNodeTest.php";}s:62:"Symfony/Component/Config/Tests/Definition/FinalizationTest.php";a:4:{s:6:"md5sum";s:32:"2f083bc35c2a3769c24a185d4bffd428";s:4:"name";s:62:"Symfony/Component/Config/Tests/Definition/FinalizationTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/FinalizationTest.php";}s:59:"Symfony/Component/Config/Tests/Definition/FloatNodeTest.php";a:4:{s:6:"md5sum";s:32:"78e5e5856b6071f3c7f9f8da4881a06d";s:4:"name";s:59:"Symfony/Component/Config/Tests/Definition/FloatNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/FloatNodeTest.php";}s:61:"Symfony/Component/Config/Tests/Definition/IntegerNodeTest.php";a:4:{s:6:"md5sum";s:32:"a5a4ed81aef01e766cb948154ae92643";s:4:"name";s:61:"Symfony/Component/Config/Tests/Definition/IntegerNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/IntegerNodeTest.php";}s:55:"Symfony/Component/Config/Tests/Definition/MergeTest.php";a:4:{s:6:"md5sum";s:32:"a81e2313992cb216f88f46113da997ce";s:4:"name";s:55:"Symfony/Component/Config/Tests/Definition/MergeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/MergeTest.php";}s:63:"Symfony/Component/Config/Tests/Definition/NormalizationTest.php";a:4:{s:6:"md5sum";s:32:"b8ac64aa50fcdabc32efa4d76fa08737";s:4:"name";s:63:"Symfony/Component/Config/Tests/Definition/NormalizationTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/NormalizationTest.php";}s:69:"Symfony/Component/Config/Tests/Definition/PrototypedArrayNodeTest.php";a:4:{s:6:"md5sum";s:32:"dc6f3545eb30eb7efd1f84278c1b08dd";s:4:"name";s:69:"Symfony/Component/Config/Tests/Definition/PrototypedArrayNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/PrototypedArrayNodeTest.php";}s:60:"Symfony/Component/Config/Tests/Definition/ScalarNodeTest.php";a:4:{s:6:"md5sum";s:32:"cab8145a6c30d31be3d4897cc68208f6";s:4:"name";s:60:"Symfony/Component/Config/Tests/Definition/ScalarNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/ScalarNodeTest.php";}s:50:"Symfony/Component/Config/Tests/FileLocatorTest.php";a:4:{s:6:"md5sum";s:32:"8157a7f666d2269ba36f5d12b71b392c";s:4:"name";s:50:"Symfony/Component/Config/Tests/FileLocatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/FileLocatorTest.php";}s:53:"Symfony/Component/Config/Tests/Fixtures/Again/foo.xml";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:53:"Symfony/Component/Config/Tests/Fixtures/Again/foo.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Again/foo.xml";}s:69:"Symfony/Component/Config/Tests/Fixtures/Builder/BarNodeDefinition.php";a:4:{s:6:"md5sum";s:32:"61483df06205d8340ff30281494ddf4d";s:4:"name";s:69:"Symfony/Component/Config/Tests/Fixtures/Builder/BarNodeDefinition.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Builder/BarNodeDefinition.php";}s:63:"Symfony/Component/Config/Tests/Fixtures/Builder/NodeBuilder.php";a:4:{s:6:"md5sum";s:32:"bb1913bbf75e3a341384f2dd58267465";s:4:"name";s:63:"Symfony/Component/Config/Tests/Fixtures/Builder/NodeBuilder.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Builder/NodeBuilder.php";}s:74:"Symfony/Component/Config/Tests/Fixtures/Builder/VariableNodeDefinition.php";a:4:{s:6:"md5sum";s:32:"c5057b3b1c5b4790985800ea90cd4d7a";s:4:"name";s:74:"Symfony/Component/Config/Tests/Fixtures/Builder/VariableNodeDefinition.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Builder/VariableNodeDefinition.php";}s:78:"Symfony/Component/Config/Tests/Fixtures/Configuration/ExampleConfiguration.php";a:4:{s:6:"md5sum";s:32:"3ca56644f6fcffdd18a57f5e29db5faf";s:4:"name";s:78:"Symfony/Component/Config/Tests/Fixtures/Configuration/ExampleConfiguration.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Configuration/ExampleConfiguration.php";}s:47:"Symfony/Component/Config/Tests/Fixtures/foo.xml";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:47:"Symfony/Component/Config/Tests/Fixtures/foo.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/foo.xml";}s:62:"Symfony/Component/Config/Tests/Fixtures/Util/document_type.xml";a:4:{s:6:"md5sum";s:32:"0b3c991715906416d884a53869b71210";s:4:"name";s:62:"Symfony/Component/Config/Tests/Fixtures/Util/document_type.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util/document_type.xml";}s:56:"Symfony/Component/Config/Tests/Fixtures/Util/invalid.xml";a:4:{s:6:"md5sum";s:32:"9faea03761cbb774e569e0ddc15118a2";s:4:"name";s:56:"Symfony/Component/Config/Tests/Fixtures/Util/invalid.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util/invalid.xml";}s:63:"Symfony/Component/Config/Tests/Fixtures/Util/invalid_schema.xml";a:4:{s:6:"md5sum";s:32:"5527ef0a29820ff2870e0749cd38c297";s:4:"name";s:63:"Symfony/Component/Config/Tests/Fixtures/Util/invalid_schema.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util/invalid_schema.xml";}s:55:"Symfony/Component/Config/Tests/Fixtures/Util/schema.xsd";a:4:{s:6:"md5sum";s:32:"1ffa211272544831555c45f701a9e523";s:4:"name";s:55:"Symfony/Component/Config/Tests/Fixtures/Util/schema.xsd";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util/schema.xsd";}s:54:"Symfony/Component/Config/Tests/Fixtures/Util/valid.xml";a:4:{s:6:"md5sum";s:32:"57e37ff0b94a2574fe00e18efbc92a4c";s:4:"name";s:54:"Symfony/Component/Config/Tests/Fixtures/Util/valid.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util/valid.xml";}s:62:"Symfony/Component/Config/Tests/Loader/DelegatingLoaderTest.php";a:4:{s:6:"md5sum";s:32:"7cb65249e81babb2867f7a2afecc2201";s:4:"name";s:62:"Symfony/Component/Config/Tests/Loader/DelegatingLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Loader/DelegatingLoaderTest.php";}s:56:"Symfony/Component/Config/Tests/Loader/FileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"7ea599ca7987b26ebbc49c7a204ed566";s:4:"name";s:56:"Symfony/Component/Config/Tests/Loader/FileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Loader/FileLoaderTest.php";}s:60:"Symfony/Component/Config/Tests/Loader/LoaderResolverTest.php";a:4:{s:6:"md5sum";s:32:"4b52c0a493e0abe0c016757c3b81871f";s:4:"name";s:60:"Symfony/Component/Config/Tests/Loader/LoaderResolverTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Loader/LoaderResolverTest.php";}s:52:"Symfony/Component/Config/Tests/Loader/LoaderTest.php";a:4:{s:6:"md5sum";s:32:"948c42a53d8bad4d6ba2a54c4ec000fd";s:4:"name";s:52:"Symfony/Component/Config/Tests/Loader/LoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Loader/LoaderTest.php";}s:65:"Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php";a:4:{s:6:"md5sum";s:32:"c4027624b5fb8e923b71f4eab6a996d0";s:4:"name";s:65:"Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php";}s:60:"Symfony/Component/Config/Tests/Resource/FileResourceTest.php";a:4:{s:6:"md5sum";s:32:"e37cf4fd016b4652013a54aed653a90c";s:4:"name";s:60:"Symfony/Component/Config/Tests/Resource/FileResourceTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Resource/FileResourceTest.php";}s:52:"Symfony/Component/Config/Tests/Util/XmlUtilsTest.php";a:4:{s:6:"md5sum";s:32:"aa364fa2a9af8fb8fb396ba173c2b3b3";s:4:"name";s:52:"Symfony/Component/Config/Tests/Util/XmlUtilsTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Util/XmlUtilsTest.php";}s:42:"Symfony/Component/Config/Util/XmlUtils.php";a:4:{s:6:"md5sum";s:32:"b90ce309828aad9fe732e136489b77f6";s:4:"name";s:42:"Symfony/Component/Config/Util/XmlUtils.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Util/XmlUtils.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:31:{s:54:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:65:"/opt/alt/php54/usr/share/doc/pear/Config/Symfony/Component/Config";b:1;s:58:"/opt/alt/php54/usr/share/doc/pear/Config/Symfony/Component";b:1;s:48:"/opt/alt/php54/usr/share/doc/pear/Config/Symfony";b:1;s:40:"/opt/alt/php54/usr/share/doc/pear/Config";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition";b:1;s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Builder";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Dumper";b:1;s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Definition/Exception";b:1;s:64:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Exception";b:1;s:61:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Loader";b:1;s:66:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config";b:1;s:59:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component";b:1;s:49:"/opt/alt/php54/usr/share/pear/test/Config/Symfony";b:1;s:41:"/opt/alt/php54/usr/share/pear/test/Config";b:1;s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Resource";b:1;s:72:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition";b:1;s:91:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/Builder";b:1;s:90:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Definition/Dumper";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Again";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Builder";b:1;s:95:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Configuration";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util";b:1;s:79:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Loader";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Resource";b:1;s:77:"/opt/alt/php54/usr/share/pear/test/Config/Symfony/Component/Config/Tests/Util";b:1;s:59:"/opt/alt/php54/usr/share/pear/Symfony/Component/Config/Util";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506492;}PK�^�\q��=h=h7pear/.registry/.channel.pear.symfony.com/serializer.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:10:"Serializer";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:29:"Symfony2 Serializer Component";s:11:"description";s:29:"Symfony2 Serializer Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:50";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:44:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8924fb8ebee45aa2f1cb733a311084fe";s:4:"name";s:43:"Symfony/Component/Serializer/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"124d3455707cf90eea4b75aad3128b99";s:4:"name";s:41:"Symfony/Component/Serializer/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4650d276ce46d27f209867df3fcf7079";s:4:"name";s:42:"Symfony/Component/Serializer/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df666b9ada7f68fadc2531c41d5fe73e";s:4:"name";s:53:"Symfony/Component/Serializer/Encoder/ChainDecoder.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5369492dbbe7d6ca9e13d39b780e2ba7";s:4:"name";s:53:"Symfony/Component/Serializer/Encoder/ChainEncoder.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d801732fc0ff9fa4f77b475b1949f5d7";s:4:"name";s:57:"Symfony/Component/Serializer/Encoder/DecoderInterface.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"60ab91988770567a746858bf9cebc15d";s:4:"name";s:57:"Symfony/Component/Serializer/Encoder/EncoderInterface.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1faccc4be8d9d1f7ee14019a197b24de";s:4:"name";s:51:"Symfony/Component/Serializer/Encoder/JsonDecode.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fd129010a819c8fbed0f9f8e295c3a6b";s:4:"name";s:51:"Symfony/Component/Serializer/Encoder/JsonEncode.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a0de4192caa291e2d2c478056fd08260";s:4:"name";s:52:"Symfony/Component/Serializer/Encoder/JsonEncoder.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b84dd04f4d9155d8bf22f64ad1ab2a21";s:4:"name";s:68:"Symfony/Component/Serializer/Encoder/NormalizationAwareInterface.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8a78de10c12341c3cd4f3086b9ae4fb1";s:4:"name";s:63:"Symfony/Component/Serializer/Encoder/SerializerAwareEncoder.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4b1bb45f51fbc0080c7bd83ec4d014b2";s:4:"name";s:51:"Symfony/Component/Serializer/Encoder/XmlEncoder.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"419f2f11a1889bc399f27e8b8ac383c4";s:4:"name";s:52:"Symfony/Component/Serializer/Exception/Exception.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f5a0271960a36477271010059aef7342";s:4:"name";s:67:"Symfony/Component/Serializer/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4fc4b4a3763cfb4f44c63967e9eb0300";s:4:"name";s:57:"Symfony/Component/Serializer/Exception/LogicException.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"117ae6cc407de0db333905e216f06310";s:4:"name";s:59:"Symfony/Component/Serializer/Exception/RuntimeException.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a874d8aa52e749c940da7945f0b5e86c";s:4:"name";s:67:"Symfony/Component/Serializer/Exception/UnexpectedValueException.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c04f7626016df14e0b48b74a67fbe300";s:4:"name";s:63:"Symfony/Component/Serializer/Exception/UnsupportedException.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/Serializer/LICENSE";s:4:"role";s:3:"doc";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b46b9f066240e486a59059f7c21f3757";s:4:"name";s:60:"Symfony/Component/Serializer/Normalizer/CustomNormalizer.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0c2569d8e753c961b4d79f7986f2bc3c";s:4:"name";s:67:"Symfony/Component/Serializer/Normalizer/DenormalizableInterface.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d993fdf8138bdb93b870c77f458c72c6";s:4:"name";s:65:"Symfony/Component/Serializer/Normalizer/DenormalizerInterface.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea2945858b665064abdf2c54dd76fb4a";s:4:"name";s:66:"Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"88ca8e957cc8d23917585f78154d3247";s:4:"name";s:65:"Symfony/Component/Serializer/Normalizer/NormalizableInterface.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2727f8dbe1b56a400cc24a1a5fcf9253";s:4:"name";s:63:"Symfony/Component/Serializer/Normalizer/NormalizerInterface.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"59fe1098fedc2bc327d5156c247a956b";s:4:"name";s:69:"Symfony/Component/Serializer/Normalizer/SerializerAwareNormalizer.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"03c13b185fe6ec3e58a43bb0f4d2096b";s:4:"name";s:45:"Symfony/Component/Serializer/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6fa24c500365e7fb17861841897a47b1";s:4:"name";s:38:"Symfony/Component/Serializer/README.md";s:4:"role";s:3:"doc";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5f529d8ae97ae12590c6a977dcb219d3";s:4:"name";s:43:"Symfony/Component/Serializer/Serializer.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"334216d0212e8a1a75aa0bdbfffe456a";s:4:"name";s:57:"Symfony/Component/Serializer/SerializerAwareInterface.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d33d507c40129e758c96d23be8431d7f";s:4:"name";s:52:"Symfony/Component/Serializer/SerializerInterface.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0486db74aa7aad1deb7fe72ccbe2d24a";s:4:"name";s:62:"Symfony/Component/Serializer/Tests/Encoder/JsonEncoderTest.php";s:4:"role";s:4:"test";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6f8f697b4c8ea3c42bc80167e05926fd";s:4:"name";s:61:"Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php";s:4:"role";s:4:"test";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fa38de70b4c6a5793c1db7fcbe72d93e";s:4:"name";s:67:"Symfony/Component/Serializer/Tests/Fixtures/DenormalizableDummy.php";s:4:"role";s:4:"test";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"75d3643bd45ff8c2fb0fa4b54be38ac1";s:4:"name";s:53:"Symfony/Component/Serializer/Tests/Fixtures/Dummy.php";s:4:"role";s:4:"test";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"14ce02d7ad086e845aa4179be6688758";s:4:"name";s:76:"Symfony/Component/Serializer/Tests/Fixtures/NormalizableTraversableDummy.php";s:4:"role";s:4:"test";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c23b959baa7a357482c451f66411c1a4";s:4:"name";s:59:"Symfony/Component/Serializer/Tests/Fixtures/ScalarDummy.php";s:4:"role";s:4:"test";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d09fd9c23681cee83015d259becf1adb";s:4:"name";s:64:"Symfony/Component/Serializer/Tests/Fixtures/TraversableDummy.php";s:4:"role";s:4:"test";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7a4eeaec6f791cba2dde2eed9943409e";s:4:"name";s:70:"Symfony/Component/Serializer/Tests/Normalizer/CustomNormalizerTest.php";s:4:"role";s:4:"test";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7299974c15e42153083a1ed5798bc5e9";s:4:"name";s:76:"Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php";s:4:"role";s:4:"test";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"00773fc534e38166aeb342f31d99b28e";s:4:"name";s:66:"Symfony/Component/Serializer/Tests/Normalizer/TestDenormalizer.php";s:4:"role";s:4:"test";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"878f34a6f5f9dd999c08d24154d605c5";s:4:"name";s:64:"Symfony/Component/Serializer/Tests/Normalizer/TestNormalizer.php";s:4:"role";s:4:"test";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"076b26e14077fa01721e8c8ace4a32cf";s:4:"name";s:53:"Symfony/Component/Serializer/Tests/SerializerTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:44:{s:43:"Symfony/Component/Serializer/autoloader.php";a:4:{s:6:"md5sum";s:32:"8924fb8ebee45aa2f1cb733a311084fe";s:4:"name";s:43:"Symfony/Component/Serializer/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/autoloader.php";}s:41:"Symfony/Component/Serializer/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"124d3455707cf90eea4b75aad3128b99";s:4:"name";s:41:"Symfony/Component/Serializer/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/doc/pear/Serializer/Symfony/Component/Serializer/CHANGELOG.md";}s:42:"Symfony/Component/Serializer/composer.json";a:4:{s:6:"md5sum";s:32:"4650d276ce46d27f209867df3fcf7079";s:4:"name";s:42:"Symfony/Component/Serializer/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/Serializer/Symfony/Component/Serializer/composer.json";}s:53:"Symfony/Component/Serializer/Encoder/ChainDecoder.php";a:4:{s:6:"md5sum";s:32:"df666b9ada7f68fadc2531c41d5fe73e";s:4:"name";s:53:"Symfony/Component/Serializer/Encoder/ChainDecoder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder/ChainDecoder.php";}s:53:"Symfony/Component/Serializer/Encoder/ChainEncoder.php";a:4:{s:6:"md5sum";s:32:"5369492dbbe7d6ca9e13d39b780e2ba7";s:4:"name";s:53:"Symfony/Component/Serializer/Encoder/ChainEncoder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder/ChainEncoder.php";}s:57:"Symfony/Component/Serializer/Encoder/DecoderInterface.php";a:4:{s:6:"md5sum";s:32:"d801732fc0ff9fa4f77b475b1949f5d7";s:4:"name";s:57:"Symfony/Component/Serializer/Encoder/DecoderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder/DecoderInterface.php";}s:57:"Symfony/Component/Serializer/Encoder/EncoderInterface.php";a:4:{s:6:"md5sum";s:32:"60ab91988770567a746858bf9cebc15d";s:4:"name";s:57:"Symfony/Component/Serializer/Encoder/EncoderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder/EncoderInterface.php";}s:51:"Symfony/Component/Serializer/Encoder/JsonDecode.php";a:4:{s:6:"md5sum";s:32:"1faccc4be8d9d1f7ee14019a197b24de";s:4:"name";s:51:"Symfony/Component/Serializer/Encoder/JsonDecode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder/JsonDecode.php";}s:51:"Symfony/Component/Serializer/Encoder/JsonEncode.php";a:4:{s:6:"md5sum";s:32:"fd129010a819c8fbed0f9f8e295c3a6b";s:4:"name";s:51:"Symfony/Component/Serializer/Encoder/JsonEncode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder/JsonEncode.php";}s:52:"Symfony/Component/Serializer/Encoder/JsonEncoder.php";a:4:{s:6:"md5sum";s:32:"a0de4192caa291e2d2c478056fd08260";s:4:"name";s:52:"Symfony/Component/Serializer/Encoder/JsonEncoder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder/JsonEncoder.php";}s:68:"Symfony/Component/Serializer/Encoder/NormalizationAwareInterface.php";a:4:{s:6:"md5sum";s:32:"b84dd04f4d9155d8bf22f64ad1ab2a21";s:4:"name";s:68:"Symfony/Component/Serializer/Encoder/NormalizationAwareInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder/NormalizationAwareInterface.php";}s:63:"Symfony/Component/Serializer/Encoder/SerializerAwareEncoder.php";a:4:{s:6:"md5sum";s:32:"8a78de10c12341c3cd4f3086b9ae4fb1";s:4:"name";s:63:"Symfony/Component/Serializer/Encoder/SerializerAwareEncoder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder/SerializerAwareEncoder.php";}s:51:"Symfony/Component/Serializer/Encoder/XmlEncoder.php";a:4:{s:6:"md5sum";s:32:"4b1bb45f51fbc0080c7bd83ec4d014b2";s:4:"name";s:51:"Symfony/Component/Serializer/Encoder/XmlEncoder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder/XmlEncoder.php";}s:52:"Symfony/Component/Serializer/Exception/Exception.php";a:4:{s:6:"md5sum";s:32:"419f2f11a1889bc399f27e8b8ac383c4";s:4:"name";s:52:"Symfony/Component/Serializer/Exception/Exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Exception/Exception.php";}s:67:"Symfony/Component/Serializer/Exception/InvalidArgumentException.php";a:4:{s:6:"md5sum";s:32:"f5a0271960a36477271010059aef7342";s:4:"name";s:67:"Symfony/Component/Serializer/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Exception/InvalidArgumentException.php";}s:57:"Symfony/Component/Serializer/Exception/LogicException.php";a:4:{s:6:"md5sum";s:32:"4fc4b4a3763cfb4f44c63967e9eb0300";s:4:"name";s:57:"Symfony/Component/Serializer/Exception/LogicException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Exception/LogicException.php";}s:59:"Symfony/Component/Serializer/Exception/RuntimeException.php";a:4:{s:6:"md5sum";s:32:"117ae6cc407de0db333905e216f06310";s:4:"name";s:59:"Symfony/Component/Serializer/Exception/RuntimeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Exception/RuntimeException.php";}s:67:"Symfony/Component/Serializer/Exception/UnexpectedValueException.php";a:4:{s:6:"md5sum";s:32:"a874d8aa52e749c940da7945f0b5e86c";s:4:"name";s:67:"Symfony/Component/Serializer/Exception/UnexpectedValueException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Exception/UnexpectedValueException.php";}s:63:"Symfony/Component/Serializer/Exception/UnsupportedException.php";a:4:{s:6:"md5sum";s:32:"c04f7626016df14e0b48b74a67fbe300";s:4:"name";s:63:"Symfony/Component/Serializer/Exception/UnsupportedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Exception/UnsupportedException.php";}s:36:"Symfony/Component/Serializer/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/Serializer/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/Serializer/Symfony/Component/Serializer/LICENSE";}s:60:"Symfony/Component/Serializer/Normalizer/CustomNormalizer.php";a:4:{s:6:"md5sum";s:32:"b46b9f066240e486a59059f7c21f3757";s:4:"name";s:60:"Symfony/Component/Serializer/Normalizer/CustomNormalizer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Normalizer/CustomNormalizer.php";}s:67:"Symfony/Component/Serializer/Normalizer/DenormalizableInterface.php";a:4:{s:6:"md5sum";s:32:"0c2569d8e753c961b4d79f7986f2bc3c";s:4:"name";s:67:"Symfony/Component/Serializer/Normalizer/DenormalizableInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Normalizer/DenormalizableInterface.php";}s:65:"Symfony/Component/Serializer/Normalizer/DenormalizerInterface.php";a:4:{s:6:"md5sum";s:32:"d993fdf8138bdb93b870c77f458c72c6";s:4:"name";s:65:"Symfony/Component/Serializer/Normalizer/DenormalizerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Normalizer/DenormalizerInterface.php";}s:66:"Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php";a:4:{s:6:"md5sum";s:32:"ea2945858b665064abdf2c54dd76fb4a";s:4:"name";s:66:"Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php";}s:65:"Symfony/Component/Serializer/Normalizer/NormalizableInterface.php";a:4:{s:6:"md5sum";s:32:"88ca8e957cc8d23917585f78154d3247";s:4:"name";s:65:"Symfony/Component/Serializer/Normalizer/NormalizableInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Normalizer/NormalizableInterface.php";}s:63:"Symfony/Component/Serializer/Normalizer/NormalizerInterface.php";a:4:{s:6:"md5sum";s:32:"2727f8dbe1b56a400cc24a1a5fcf9253";s:4:"name";s:63:"Symfony/Component/Serializer/Normalizer/NormalizerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Normalizer/NormalizerInterface.php";}s:69:"Symfony/Component/Serializer/Normalizer/SerializerAwareNormalizer.php";a:4:{s:6:"md5sum";s:32:"59fe1098fedc2bc327d5156c247a956b";s:4:"name";s:69:"Symfony/Component/Serializer/Normalizer/SerializerAwareNormalizer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Normalizer/SerializerAwareNormalizer.php";}s:45:"Symfony/Component/Serializer/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"03c13b185fe6ec3e58a43bb0f4d2096b";s:4:"name";s:45:"Symfony/Component/Serializer/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/phpunit.xml.dist";}s:38:"Symfony/Component/Serializer/README.md";a:4:{s:6:"md5sum";s:32:"6fa24c500365e7fb17861841897a47b1";s:4:"name";s:38:"Symfony/Component/Serializer/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/Serializer/Symfony/Component/Serializer/README.md";}s:43:"Symfony/Component/Serializer/Serializer.php";a:4:{s:6:"md5sum";s:32:"5f529d8ae97ae12590c6a977dcb219d3";s:4:"name";s:43:"Symfony/Component/Serializer/Serializer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Serializer.php";}s:57:"Symfony/Component/Serializer/SerializerAwareInterface.php";a:4:{s:6:"md5sum";s:32:"334216d0212e8a1a75aa0bdbfffe456a";s:4:"name";s:57:"Symfony/Component/Serializer/SerializerAwareInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/SerializerAwareInterface.php";}s:52:"Symfony/Component/Serializer/SerializerInterface.php";a:4:{s:6:"md5sum";s:32:"d33d507c40129e758c96d23be8431d7f";s:4:"name";s:52:"Symfony/Component/Serializer/SerializerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/SerializerInterface.php";}s:62:"Symfony/Component/Serializer/Tests/Encoder/JsonEncoderTest.php";a:4:{s:6:"md5sum";s:32:"0486db74aa7aad1deb7fe72ccbe2d24a";s:4:"name";s:62:"Symfony/Component/Serializer/Tests/Encoder/JsonEncoderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Encoder/JsonEncoderTest.php";}s:61:"Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php";a:4:{s:6:"md5sum";s:32:"6f8f697b4c8ea3c42bc80167e05926fd";s:4:"name";s:61:"Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php";}s:67:"Symfony/Component/Serializer/Tests/Fixtures/DenormalizableDummy.php";a:4:{s:6:"md5sum";s:32:"fa38de70b4c6a5793c1db7fcbe72d93e";s:4:"name";s:67:"Symfony/Component/Serializer/Tests/Fixtures/DenormalizableDummy.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Fixtures/DenormalizableDummy.php";}s:53:"Symfony/Component/Serializer/Tests/Fixtures/Dummy.php";a:4:{s:6:"md5sum";s:32:"75d3643bd45ff8c2fb0fa4b54be38ac1";s:4:"name";s:53:"Symfony/Component/Serializer/Tests/Fixtures/Dummy.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Fixtures/Dummy.php";}s:76:"Symfony/Component/Serializer/Tests/Fixtures/NormalizableTraversableDummy.php";a:4:{s:6:"md5sum";s:32:"14ce02d7ad086e845aa4179be6688758";s:4:"name";s:76:"Symfony/Component/Serializer/Tests/Fixtures/NormalizableTraversableDummy.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Fixtures/NormalizableTraversableDummy.php";}s:59:"Symfony/Component/Serializer/Tests/Fixtures/ScalarDummy.php";a:4:{s:6:"md5sum";s:32:"c23b959baa7a357482c451f66411c1a4";s:4:"name";s:59:"Symfony/Component/Serializer/Tests/Fixtures/ScalarDummy.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Fixtures/ScalarDummy.php";}s:64:"Symfony/Component/Serializer/Tests/Fixtures/TraversableDummy.php";a:4:{s:6:"md5sum";s:32:"d09fd9c23681cee83015d259becf1adb";s:4:"name";s:64:"Symfony/Component/Serializer/Tests/Fixtures/TraversableDummy.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Fixtures/TraversableDummy.php";}s:70:"Symfony/Component/Serializer/Tests/Normalizer/CustomNormalizerTest.php";a:4:{s:6:"md5sum";s:32:"7a4eeaec6f791cba2dde2eed9943409e";s:4:"name";s:70:"Symfony/Component/Serializer/Tests/Normalizer/CustomNormalizerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Normalizer/CustomNormalizerTest.php";}s:76:"Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php";a:4:{s:6:"md5sum";s:32:"7299974c15e42153083a1ed5798bc5e9";s:4:"name";s:76:"Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php";}s:66:"Symfony/Component/Serializer/Tests/Normalizer/TestDenormalizer.php";a:4:{s:6:"md5sum";s:32:"00773fc534e38166aeb342f31d99b28e";s:4:"name";s:66:"Symfony/Component/Serializer/Tests/Normalizer/TestDenormalizer.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Normalizer/TestDenormalizer.php";}s:64:"Symfony/Component/Serializer/Tests/Normalizer/TestNormalizer.php";a:4:{s:6:"md5sum";s:32:"878f34a6f5f9dd999c08d24154d605c5";s:4:"name";s:64:"Symfony/Component/Serializer/Tests/Normalizer/TestNormalizer.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Normalizer/TestNormalizer.php";}s:53:"Symfony/Component/Serializer/Tests/SerializerTest.php";a:4:{s:6:"md5sum";s:32:"076b26e14077fa01721e8c8ace4a32cf";s:4:"name";s:53:"Symfony/Component/Serializer/Tests/SerializerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/SerializerTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:18:{s:58:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:73:"/opt/alt/php54/usr/share/doc/pear/Serializer/Symfony/Component/Serializer";b:1;s:62:"/opt/alt/php54/usr/share/doc/pear/Serializer/Symfony/Component";b:1;s:52:"/opt/alt/php54/usr/share/doc/pear/Serializer/Symfony";b:1;s:44:"/opt/alt/php54/usr/share/doc/pear/Serializer";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Encoder";b:1;s:68:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Exception";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Serializer/Normalizer";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer";b:1;s:63:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component";b:1;s:53:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony";b:1;s:45:"/opt/alt/php54/usr/share/pear/test/Serializer";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Encoder";b:1;s:80:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Fixtures";b:1;s:91:"/opt/alt/php54/usr/share/pear/test/Serializer/Symfony/Component/Serializer/Tests/Normalizer";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\�#���1pear/.registry/.channel.pear.symfony.com/form.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:4:"Form";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:23:"Symfony2 Form Component";s:11:"description";s:23:"Symfony2 Form Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:45";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:337:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"501890934b78c1cda42337c3c85761f5";s:4:"name";s:44:"Symfony/Component/Form/AbstractExtension.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c855e95efaafd48a3b35f4e4ed7ef461";s:4:"name";s:49:"Symfony/Component/Form/AbstractRendererEngine.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fda8ea1864e57a50d81607d692e68c73";s:4:"name";s:39:"Symfony/Component/Form/AbstractType.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0cc218c093e9d4631ab2dd2276c567bd";s:4:"name";s:48:"Symfony/Component/Form/AbstractTypeExtension.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ccc700d8c25bc05b9e4a4b327a643f46";s:4:"name";s:37:"Symfony/Component/Form/autoloader.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e4221c7f370be7e1fae189ac0f0245f8";s:4:"name";s:33:"Symfony/Component/Form/Button.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d27ec47e44803a025e38d0067c824cdc";s:4:"name";s:40:"Symfony/Component/Form/ButtonBuilder.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2b9067ff341a18790204ea50c84102bd";s:4:"name";s:46:"Symfony/Component/Form/ButtonTypeInterface.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"902572561ace9999c9f8d8e0f37cd28f";s:4:"name";s:46:"Symfony/Component/Form/CallbackTransformer.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"abf0d085506e63678c96f8f9666c3b1c";s:4:"name";s:35:"Symfony/Component/Form/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0907b59351198bd99ceea685c9f7c7c2";s:4:"name";s:45:"Symfony/Component/Form/ClickableInterface.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5519e4c865c9aab62f36e8ccc2687a0a";s:4:"name";s:36:"Symfony/Component/Form/composer.json";s:4:"role";s:3:"doc";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"db3b117a3b8dd577bbd64a81766ad78d";s:4:"name";s:46:"Symfony/Component/Form/DataMapperInterface.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"555454867c9b8687d4ee00a014b981c1";s:4:"name";s:51:"Symfony/Component/Form/DataTransformerInterface.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bc89a72f34e3e1d4a6628d32b1511007";s:4:"name";s:58:"Symfony/Component/Form/Exception/AlreadyBoundException.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"419b77be4914d44fbe8f422c9dce819a";s:4:"name";s:62:"Symfony/Component/Form/Exception/AlreadySubmittedException.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a7e624979068a6ac1975cef01a181a64";s:4:"name";s:59:"Symfony/Component/Form/Exception/BadMethodCallException.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b43e60289f802c13894f4427988c2915";s:4:"name";s:58:"Symfony/Component/Form/Exception/ErrorMappingException.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1f4d4c025c5f49fd0e787f2095dcac58";s:4:"name";s:55:"Symfony/Component/Form/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a93c3e0ef8f9f1833b1ec31f26baaa92";s:4:"name";s:61:"Symfony/Component/Form/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"16b9f308c2cd41c6feea464a4c2a4078";s:4:"name";s:66:"Symfony/Component/Form/Exception/InvalidConfigurationException.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7acb2af6fec7e8015fdf9473ed22e568";s:4:"name";s:51:"Symfony/Component/Form/Exception/LogicException.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6439c29ccaba5ed08f068b56d1cb900a";s:4:"name";s:57:"Symfony/Component/Form/Exception/OutOfBoundsException.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"035137b05f9d396eebf788cd0475bfd2";s:4:"name";s:53:"Symfony/Component/Form/Exception/RuntimeException.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"05fafa90307ac0049080845bfc134e90";s:4:"name";s:56:"Symfony/Component/Form/Exception/StringCastException.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"04e43782ab8e754a86f812f93d3e80f0";s:4:"name";s:66:"Symfony/Component/Form/Exception/TransformationFailedException.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"93ab4195343c65feabe0a9a15e3b4e03";s:4:"name";s:60:"Symfony/Component/Form/Exception/UnexpectedTypeException.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fae7f67d21f3636dcfd9255b18c0f409";s:4:"name";s:63:"Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"75ef902d77e51ff120a5bb80a3ba4b2c";s:4:"name";s:72:"Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceListInterface.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6c60da1e88563e1e8ee345e908e99895";s:4:"name";s:67:"Symfony/Component/Form/Extension/Core/ChoiceList/LazyChoiceList.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"93d7bd50a57d6ce541c9e465f1f9c727";s:4:"name";s:69:"Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dd799ebc2f390f6c26a68d9b27163986";s:4:"name";s:69:"Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"249e325333e1e0bbf071c2352f1015ef";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/CoreExtension.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cf380dc09a61dcd25aa19cde02d5a496";s:4:"name";s:71:"Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b1463a8ca32434df6df7fdd15470ffe";s:4:"name";s:81:"Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"95ce9f75d9de781506bd27afae24a435";s:4:"name";s:81:"Symfony/Component/Form/Extension/Core/DataTransformer/BaseDateTimeTransformer.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1beb890d4d901ce9a49a02aa567d4d1d";s:4:"name";s:84:"Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bdc67501df308818f4ccb6e87fd4b460";s:4:"name";s:90:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToBooleanArrayTransformer.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d417455cb1a9c5f1ce2d0ae9b72c262a";s:4:"name";s:84:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToValuesTransformer.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b4ddb6ca1e45e39c27603e9a61746fe0";s:4:"name";s:89:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToBooleanArrayTransformer.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c23bb58d706b389464865d3baaa9dc0f";s:4:"name";s:82:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fb47a7c8ec22b84e657ba080eebf9185";s:4:"name";s:78:"Symfony/Component/Form/Extension/Core/DataTransformer/DataTransformerChain.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"987af4de3dad99dbe03d40ad481e59f5";s:4:"name";s:84:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"08fe73eed45b4e64f5a612fe384ee949";s:4:"name";s:94:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"536a31499542c247eeac9f887459ccb6";s:4:"name";s:86:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"84819444537109979c4ded0dcb5449d3";s:4:"name";s:85:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d420953c67b9ce03b78d46777f78934e";s:4:"name";s:88:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87c45ad85d859bc5ac1847dbe26f451f";s:4:"name";s:93:"Symfony/Component/Form/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformer.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"031be52b519ab452a56e72c0ad919f9d";s:4:"name";s:91:"Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fdab477194f1770c375e73e5571253c9";s:4:"name";s:92:"Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php";s:4:"role";s:3:"php";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0a1be99705fd6d15d2b67c9d7cc34f0a";s:4:"name";s:93:"Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php";s:4:"role";s:3:"php";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a9acfacc5c1d22709f2d9fb9572e5856";s:4:"name";s:86:"Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.php";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4fd81dac92cd7178a4df5463b909a67b";s:4:"name";s:80:"Symfony/Component/Form/Extension/Core/EventListener/FixCheckboxInputListener.php";s:4:"role";s:3:"php";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"def66949bde6d959e70d661d15f1e9e3";s:4:"name";s:77:"Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php";s:4:"role";s:3:"php";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f57106b0d09322f11efddefb368fb952";s:4:"name";s:78:"Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php";s:4:"role";s:3:"php";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1d42403d6e8be3877c66cdf6eeb7f375";s:4:"name";s:79:"Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php";s:4:"role";s:3:"php";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c79a52d764d974eaa9a1d742211220b9";s:4:"name";s:74:"Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php";s:4:"role";s:3:"php";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0bbbf865bc2c1c7b013b19cd49ea66f8";s:4:"name";s:68:"Symfony/Component/Form/Extension/Core/EventListener/TrimListener.php";s:4:"role";s:3:"php";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"058c321dda699e31ae2e164586817072";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/BaseType.php";s:4:"role";s:3:"php";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"601dc1defb9cfe03f57ecb55ec6519ee";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/BirthdayType.php";s:4:"role";s:3:"php";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df30378aa4224d2e19bfb48e3f22be73";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/ButtonType.php";s:4:"role";s:3:"php";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"20d7fadb63815c65c600ff1cab100d69";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/CheckboxType.php";s:4:"role";s:3:"php";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c7bce0021e92409791dc40237e44585e";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/ChoiceType.php";s:4:"role";s:3:"php";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"675668b49022522d4646aa90049c2650";s:4:"name";s:61:"Symfony/Component/Form/Extension/Core/Type/CollectionType.php";s:4:"role";s:3:"php";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"113a7ecb3ad40c9ffb38fd685db1ab3a";s:4:"name";s:58:"Symfony/Component/Form/Extension/Core/Type/CountryType.php";s:4:"role";s:3:"php";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0be9c69f93866ae116791fcfb7a77186";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/CurrencyType.php";s:4:"role";s:3:"php";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5d41f93fff961492d2de8bc4d71e7862";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/DateTimeType.php";s:4:"role";s:3:"php";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"35d0a4afbc155cd3838aebf3a564fb42";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/DateType.php";s:4:"role";s:3:"php";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"146a7c19ddde4cdca72343da4cfe17d5";s:4:"name";s:56:"Symfony/Component/Form/Extension/Core/Type/EmailType.php";s:4:"role";s:3:"php";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"060ed2ce1bef45de0340a9448c5f04f2";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/FileType.php";s:4:"role";s:3:"php";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"50f9fbd36e4a7e4b9136be87bf43cb8a";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/FormType.php";s:4:"role";s:3:"php";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"300baaff3c467b27ddcde08751708dc8";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/HiddenType.php";s:4:"role";s:3:"php";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"39268ae7dc189edbc1f1ac9cf01bdcb6";s:4:"name";s:58:"Symfony/Component/Form/Extension/Core/Type/IntegerType.php";s:4:"role";s:3:"php";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d463acc8367ee0afe8417a0aaba019fe";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/LanguageType.php";s:4:"role";s:3:"php";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a01e0f05fec87b35b3424829d33d1755";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/LocaleType.php";s:4:"role";s:3:"php";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"610e8b6a1425b2eb97a0d7c700edf05c";s:4:"name";s:56:"Symfony/Component/Form/Extension/Core/Type/MoneyType.php";s:4:"role";s:3:"php";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e5cd61198e2bc26e98d427ab26238c29";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/NumberType.php";s:4:"role";s:3:"php";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e404fb615ce73dc63a1849d3debb800a";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/PasswordType.php";s:4:"role";s:3:"php";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1049fece490815d0886c3ddff2bae892";s:4:"name";s:58:"Symfony/Component/Form/Extension/Core/Type/PercentType.php";s:4:"role";s:3:"php";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"90fba868b14c878176ada892065394bf";s:4:"name";s:56:"Symfony/Component/Form/Extension/Core/Type/RadioType.php";s:4:"role";s:3:"php";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f87bd813801d2d880e905cdd0ffa57da";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/RepeatedType.php";s:4:"role";s:3:"php";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c4df569621c1f85389b7c7cbf789bf63";s:4:"name";s:56:"Symfony/Component/Form/Extension/Core/Type/ResetType.php";s:4:"role";s:3:"php";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a6b0608cb9f219f8a8c192f64f141335";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/SearchType.php";s:4:"role";s:3:"php";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d689ab8ea2da255a67b7d2140af1627b";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/SubmitType.php";s:4:"role";s:3:"php";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"02627d9175c745247f7e59cf1c2d4562";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/TextareaType.php";s:4:"role";s:3:"php";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"79f868ef2b8c73154789fcaa591f8467";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/TextType.php";s:4:"role";s:3:"php";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"993e6cee3429a18fabdc70f0a67c7d57";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/TimeType.php";s:4:"role";s:3:"php";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f5607e197c52e096bf060d259aef4079";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/TimezoneType.php";s:4:"role";s:3:"php";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"38ac4b65d20ba774f1421dfd2acd3193";s:4:"name";s:54:"Symfony/Component/Form/Extension/Core/Type/UrlType.php";s:4:"role";s:3:"php";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"faafdc84e0bfdcd503be96fcb730c4c0";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/View/ChoiceView.php";s:4:"role";s:3:"php";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"75199e400bebc4583e278a7b24e96833";s:4:"name";s:55:"Symfony/Component/Form/Extension/Csrf/CsrfExtension.php";s:4:"role";s:3:"php";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a1592bafaa9d2402bb6806fd1ac3e9d";s:4:"name";s:74:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderAdapter.php";s:4:"role";s:3:"php";}}i:92;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e86115910210dec2676aeb707cb5acf0";s:4:"name";s:76:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.php";s:4:"role";s:3:"php";}}i:93;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"db64afcb25c6806ce15828e6ac8c790e";s:4:"name";s:78:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfTokenManagerAdapter.php";s:4:"role";s:3:"php";}}i:94;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a1f980527cf2cec99b44eaa1a09e0d4f";s:4:"name";s:74:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.php";s:4:"role";s:3:"php";}}i:95;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c939632d9abebe20853bc59ce816b457";s:4:"name";s:74:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/SessionCsrfProvider.php";s:4:"role";s:3:"php";}}i:96;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c17a0b6ad7348188b47da6647b50cc82";s:4:"name";s:78:"Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php";s:4:"role";s:3:"php";}}i:97;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0de14d86a9825500a9b8a71025542c1b";s:4:"name";s:68:"Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php";s:4:"role";s:3:"php";}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5c5494c1d8bb041b3b938f53a48bb1a1";s:4:"name";s:73:"Symfony/Component/Form/Extension/DataCollector/DataCollectorExtension.php";s:4:"role";s:3:"php";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1419e5bb5008ecb2d6d757bd7023fda8";s:4:"name";s:86:"Symfony/Component/Form/Extension/DataCollector/EventListener/DataCollectorListener.php";s:4:"role";s:3:"php";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fdf324521978ceec4f561d76770a08d2";s:4:"name";s:68:"Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php";s:4:"role";s:3:"php";}}i:101;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8e33ae446484b221f1a8f43b96689a9a";s:4:"name";s:77:"Symfony/Component/Form/Extension/DataCollector/FormDataCollectorInterface.php";s:4:"role";s:3:"php";}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c6dbee88cf57973284f2deb8b7d62266";s:4:"name";s:68:"Symfony/Component/Form/Extension/DataCollector/FormDataExtractor.php";s:4:"role";s:3:"php";}}i:103;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e0250a5d7bb1e0c5022cc5bead2126dc";s:4:"name";s:77:"Symfony/Component/Form/Extension/DataCollector/FormDataExtractorInterface.php";s:4:"role";s:3:"php";}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1d3278f320b0fc626c80ff21d4e4d798";s:4:"name";s:87:"Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php";s:4:"role";s:3:"php";}}i:105;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7acc20404d7bc268d80bd71d29b2c0da";s:4:"name";s:94:"Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeFactoryDataCollectorProxy.php";s:4:"role";s:3:"php";}}i:106;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"384aa6433ffc18edb15519d550103ca1";s:4:"name";s:82:"Symfony/Component/Form/Extension/DataCollector/Type/DataCollectorTypeExtension.php";s:4:"role";s:3:"php";}}i:107;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7284275881ceb92b987717feedba8057";s:4:"name";s:85:"Symfony/Component/Form/Extension/DependencyInjection/DependencyInjectionExtension.php";s:4:"role";s:3:"php";}}i:108;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6a452e346dc11c0a574bc2fbea9be01c";s:4:"name";s:85:"Symfony/Component/Form/Extension/HttpFoundation/EventListener/BindRequestListener.php";s:4:"role";s:3:"php";}}i:109;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bd10d86a58c151a1d8d2e072dc379389";s:4:"name";s:75:"Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationExtension.php";s:4:"role";s:3:"php";}}i:110;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1a1be6feca390ce87d232e08008b4059";s:4:"name";s:80:"Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php";s:4:"role";s:3:"php";}}i:111;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1cbed6494abb39f8a2731ff28bfc3b4f";s:4:"name";s:88:"Symfony/Component/Form/Extension/HttpFoundation/Type/FormTypeHttpFoundationExtension.php";s:4:"role";s:3:"php";}}i:112;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2ab352ab8da8a95d82c561e8d014708";s:4:"name";s:67:"Symfony/Component/Form/Extension/Templating/TemplatingExtension.php";s:4:"role";s:3:"php";}}i:113;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9b88d4aa06ab3e8e0f4882d2790814fc";s:4:"name";s:72:"Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php";s:4:"role";s:3:"php";}}i:114;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0024bfd2c88595778a825805a64dad44";s:4:"name";s:63:"Symfony/Component/Form/Extension/Validator/Constraints/Form.php";s:4:"role";s:3:"php";}}i:115;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7c71a0cb31da31a0222bdab4b7b926c7";s:4:"name";s:72:"Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php";s:4:"role";s:3:"php";}}i:116;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"26384c9335607d3a7a760ce64268a5d1";s:4:"name";s:79:"Symfony/Component/Form/Extension/Validator/EventListener/ValidationListener.php";s:4:"role";s:3:"php";}}i:117;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cbb86a1f46d4153ee8b6dcec13f3e3b3";s:4:"name";s:74:"Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php";s:4:"role";s:3:"php";}}i:118;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df9d49f2923e93c8a989badebd46d72b";s:4:"name";s:78:"Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php";s:4:"role";s:3:"php";}}i:119;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ee7f3c2ca05510b1e6f5ea736de843d";s:4:"name";s:82:"Symfony/Component/Form/Extension/Validator/Type/RepeatedTypeValidatorExtension.php";s:4:"role";s:3:"php";}}i:120;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ec1709e56bdc7ba193f1d204a1645348";s:4:"name";s:80:"Symfony/Component/Form/Extension/Validator/Type/SubmitTypeValidatorExtension.php";s:4:"role";s:3:"php";}}i:121;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6c0183dc4aa13461ba80a4b13bb6af0c";s:4:"name";s:64:"Symfony/Component/Form/Extension/Validator/Util/ServerParams.php";s:4:"role";s:3:"php";}}i:122;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"29479a50cbaa64713f9746a047bffd00";s:4:"name";s:65:"Symfony/Component/Form/Extension/Validator/ValidatorExtension.php";s:4:"role";s:3:"php";}}i:123;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7c15728df791933679ae099b2dc013ce";s:4:"name";s:67:"Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php";s:4:"role";s:3:"php";}}i:124;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"accd5b53d71708b247e3f8c6060b8441";s:4:"name";s:74:"Symfony/Component/Form/Extension/Validator/ViolationMapper/MappingRule.php";s:4:"role";s:3:"php";}}i:125;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"da806398ec8fc4c452e1eadda5c74a68";s:4:"name";s:75:"Symfony/Component/Form/Extension/Validator/ViolationMapper/RelativePath.php";s:4:"role";s:3:"php";}}i:126;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"61357f9417507d405f7fb1fb659b31d2";s:4:"name";s:78:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php";s:4:"role";s:3:"php";}}i:127;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"10303cd4370ce781654acabee5f88bab";s:4:"name";s:87:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapperInterface.php";s:4:"role";s:3:"php";}}i:128;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ccc9fe0cfc8d2d1f0daabc141e920038";s:4:"name";s:76:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPath.php";s:4:"role";s:3:"php";}}i:129;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c66988f503a7a69b3332463374596ba3";s:4:"name";s:84:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPathIterator.php";s:4:"role";s:3:"php";}}i:130;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"563c1163b71c3c482d91bf4877746632";s:4:"name";s:31:"Symfony/Component/Form/Form.php";s:4:"role";s:3:"php";}}i:131;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cca285ed5e381d817d56181ec219df0d";s:4:"name";s:38:"Symfony/Component/Form/FormBuilder.php";s:4:"role";s:3:"php";}}i:132;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9b5471bc4369497cf6ffd6e159a023ec";s:4:"name";s:47:"Symfony/Component/Form/FormBuilderInterface.php";s:4:"role";s:3:"php";}}i:133;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f478ae74fe1813693e1ba4e969d62410";s:4:"name";s:44:"Symfony/Component/Form/FormConfigBuilder.php";s:4:"role";s:3:"php";}}i:134;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6a46ac7e9313965ec6b1b95328f346a0";s:4:"name";s:53:"Symfony/Component/Form/FormConfigBuilderInterface.php";s:4:"role";s:3:"php";}}i:135;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0b0436e232cf7100a1ed02dc299cf7a2";s:4:"name";s:46:"Symfony/Component/Form/FormConfigInterface.php";s:4:"role";s:3:"php";}}i:136;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d77ce9907675beaf81a3065d1ecfd69c";s:4:"name";s:36:"Symfony/Component/Form/FormError.php";s:4:"role";s:3:"php";}}i:137;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"99268e4eaad4680f7e037cc00b31b370";s:4:"name";s:36:"Symfony/Component/Form/FormEvent.php";s:4:"role";s:3:"php";}}i:138;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e6d2f1d5c2986877bb25ed96014d3495";s:4:"name";s:37:"Symfony/Component/Form/FormEvents.php";s:4:"role";s:3:"php";}}i:139;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"396ae86cdd76d116832ba1f3b1ac5b73";s:4:"name";s:49:"Symfony/Component/Form/FormExtensionInterface.php";s:4:"role";s:3:"php";}}i:140;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"014013a6a76da3c380b12e79fd5895e5";s:4:"name";s:38:"Symfony/Component/Form/FormFactory.php";s:4:"role";s:3:"php";}}i:141;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b3f8c61b5ff170f0982a10bfa3f449ad";s:4:"name";s:45:"Symfony/Component/Form/FormFactoryBuilder.php";s:4:"role";s:3:"php";}}i:142;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1b58cdcfa7fe5eb921b37c73a4cc8ead";s:4:"name";s:54:"Symfony/Component/Form/FormFactoryBuilderInterface.php";s:4:"role";s:3:"php";}}i:143;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8f8a65e4ffe1ee2ac9165f41ff0defc0";s:4:"name";s:47:"Symfony/Component/Form/FormFactoryInterface.php";s:4:"role";s:3:"php";}}i:144;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bd326b430aabb6ae67bfdd63ac3a0cff";s:4:"name";s:40:"Symfony/Component/Form/FormInterface.php";s:4:"role";s:3:"php";}}i:145;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c017bb0aca3d2dc54133014309b994ca";s:4:"name";s:39:"Symfony/Component/Form/FormRegistry.php";s:4:"role";s:3:"php";}}i:146;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea9fc8c340f5d63126abf4741716bf0a";s:4:"name";s:48:"Symfony/Component/Form/FormRegistryInterface.php";s:4:"role";s:3:"php";}}i:147;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eed8b18f01216d190cf317392856361d";s:4:"name";s:39:"Symfony/Component/Form/FormRenderer.php";s:4:"role";s:3:"php";}}i:148;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4a12fb78c610af0b5f391e272fcb458b";s:4:"name";s:54:"Symfony/Component/Form/FormRendererEngineInterface.php";s:4:"role";s:3:"php";}}i:149;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"514aae640601bd2af792d2f280ad1d19";s:4:"name";s:48:"Symfony/Component/Form/FormRendererInterface.php";s:4:"role";s:3:"php";}}i:150;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9f253cdb5bd655feaa2ba9387c6cf0ad";s:4:"name";s:32:"Symfony/Component/Form/Forms.php";s:4:"role";s:3:"php";}}i:151;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"76847e41a7fc0945726fd7b00ddd9540";s:4:"name";s:53:"Symfony/Component/Form/FormTypeExtensionInterface.php";s:4:"role";s:3:"php";}}i:152;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d5097ac9bb6503026cda5c54c7106965";s:4:"name";s:47:"Symfony/Component/Form/FormTypeGuesserChain.php";s:4:"role";s:3:"php";}}i:153;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0fb144de45b5135b11815452309bc75f";s:4:"name";s:51:"Symfony/Component/Form/FormTypeGuesserInterface.php";s:4:"role";s:3:"php";}}i:154;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bbab1badee901017917edff90e58f2c1";s:4:"name";s:44:"Symfony/Component/Form/FormTypeInterface.php";s:4:"role";s:3:"php";}}i:155;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"68bdf09c1c46788c5e90ada37f78d540";s:4:"name";s:35:"Symfony/Component/Form/FormView.php";s:4:"role";s:3:"php";}}i:156;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7003fc846b738bbd923fa5656e22d95b";s:4:"name";s:38:"Symfony/Component/Form/Guess/Guess.php";s:4:"role";s:3:"php";}}i:157;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0fedff65f9ab6dfc490a9b469192b0a6";s:4:"name";s:42:"Symfony/Component/Form/Guess/TypeGuess.php";s:4:"role";s:3:"php";}}i:158;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fc080890a68c7a2e9f145556cfa0b6d3";s:4:"name";s:43:"Symfony/Component/Form/Guess/ValueGuess.php";s:4:"role";s:3:"php";}}i:159;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:30:"Symfony/Component/Form/LICENSE";s:4:"role";s:3:"doc";}}i:160;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"165b5d30323c31b5a70be0d4ed584fde";s:4:"name";s:47:"Symfony/Component/Form/NativeRequestHandler.php";s:4:"role";s:3:"php";}}i:161;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"66ef84fb360f766ab10567f114268e0f";s:4:"name";s:39:"Symfony/Component/Form/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:162;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ab4eca434dd1f8ac7df3666e1ed1b7df";s:4:"name";s:45:"Symfony/Component/Form/PreloadedExtension.php";s:4:"role";s:3:"php";}}i:163;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ebe5a2b970601e8bd9149d2c8dd1d3d1";s:4:"name";s:32:"Symfony/Component/Form/README.md";s:4:"role";s:3:"doc";}}i:164;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e16c038acbd7b2c01bcb48c7f40e728d";s:4:"name";s:50:"Symfony/Component/Form/RequestHandlerInterface.php";s:4:"role";s:3:"php";}}i:165;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0a3c5437610d92506335292ad7b6abf9";s:4:"name";s:43:"Symfony/Component/Form/ResolvedFormType.php";s:4:"role";s:3:"php";}}i:166;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5d25fc04121ed5f6e428165f5936c10f";s:4:"name";s:50:"Symfony/Component/Form/ResolvedFormTypeFactory.php";s:4:"role";s:3:"php";}}i:167;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fa408445a6fab81659c0cefed09bf3df";s:4:"name";s:59:"Symfony/Component/Form/ResolvedFormTypeFactoryInterface.php";s:4:"role";s:3:"php";}}i:168;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8c1edc5a2b254bdde6476893b156950";s:4:"name";s:52:"Symfony/Component/Form/ResolvedFormTypeInterface.php";s:4:"role";s:3:"php";}}i:169;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"256dafb4fae5e462d55a71ab388c0691";s:4:"name";s:54:"Symfony/Component/Form/Resources/config/validation.xml";s:4:"role";s:3:"php";}}i:170;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e0ad0b923b6ac791b49b9a4d33af7a25";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.ar.xlf";s:4:"role";s:3:"php";}}i:171;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1d5e19ca06d1aa8293b5887092685e05";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.bg.xlf";s:4:"role";s:3:"php";}}i:172;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c7ad1d90ad05603286ab378d72608d01";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.ca.xlf";s:4:"role";s:3:"php";}}i:173;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2b0bed4fc587230bd11e83b7bbe29339";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.cs.xlf";s:4:"role";s:3:"php";}}i:174;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e46f7c3da02bcd4fa8c379469310c217";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.da.xlf";s:4:"role";s:3:"php";}}i:175;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"921a3c43eb6bf008f7d4ae7d2e56233f";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.de.xlf";s:4:"role";s:3:"php";}}i:176;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a7470225a9c04a5c2b5f179d8060c38b";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.el.xlf";s:4:"role";s:3:"php";}}i:177;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8f7759249199e5589331c432c54c9197";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.en.xlf";s:4:"role";s:3:"php";}}i:178;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b086ea186d7babe85d8bfa78957acea4";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.es.xlf";s:4:"role";s:3:"php";}}i:179;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f81867f4f9fd2362db42befa9628c103";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.et.xlf";s:4:"role";s:3:"php";}}i:180;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0ae3f2a05c0e69cc63ef84384913a4fe";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.eu.xlf";s:4:"role";s:3:"php";}}i:181;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"321b2f3f5ac56ff0c81871b44fe369bd";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.fa.xlf";s:4:"role";s:3:"php";}}i:182;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8cbad436ab4b1d574690992f15e37397";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.fi.xlf";s:4:"role";s:3:"php";}}i:183;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8bfa3368c7beefedc897f3098744e5dd";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.fr.xlf";s:4:"role";s:3:"php";}}i:184;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b21174a0425a56615ac95065c4cd4f8f";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.gl.xlf";s:4:"role";s:3:"php";}}i:185;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f03c3342827959500fe8bca223400225";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.he.xlf";s:4:"role";s:3:"php";}}i:186;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b87096c3cc16d9580d15fe9a9ca4d70";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.hr.xlf";s:4:"role";s:3:"php";}}i:187;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c538c1a55b060abb01cc1795a650ff36";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.hu.xlf";s:4:"role";s:3:"php";}}i:188;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d7f271b6e610fa47ae614cd9d92f7c02";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.hy.xlf";s:4:"role";s:3:"php";}}i:189;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"313e2438c2476b78ab637cd9dcd5322d";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.id.xlf";s:4:"role";s:3:"php";}}i:190;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3fa13f3254812a6857a99351cf6003d8";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.it.xlf";s:4:"role";s:3:"php";}}i:191;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3f47d2db87b7262c21c8287472719479";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.ja.xlf";s:4:"role";s:3:"php";}}i:192;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f25583830baaccc529f6b4f0a845bd61";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.lb.xlf";s:4:"role";s:3:"php";}}i:193;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4ef7ab23ce55458844742317d905fa59";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.lt.xlf";s:4:"role";s:3:"php";}}i:194;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1cc55c8d2fb6eb1583b2d2cdfd54152e";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.lv.xlf";s:4:"role";s:3:"php";}}i:195;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4429ebdbb00601c0c67f43a06c4e8031";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.mn.xlf";s:4:"role";s:3:"php";}}i:196;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"017afa511ee2a18bddbbac0640cdb685";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.nb.xlf";s:4:"role";s:3:"php";}}i:197;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"94858839db1d8f8324759bf5e87c129d";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.nl.xlf";s:4:"role";s:3:"php";}}i:198;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c72a6e8c5c9dc76b0a9ceb275486acb3";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.pl.xlf";s:4:"role";s:3:"php";}}i:199;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bfda187791c843558b3bcc5327064e43";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.pt.xlf";s:4:"role";s:3:"php";}}i:200;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7cb1b50669945643c707acee4b13cf31";s:4:"name";s:66:"Symfony/Component/Form/Resources/translations/validators.pt_BR.xlf";s:4:"role";s:3:"php";}}i:201;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f2eaf2e4ba82e742cb6dff54c69f1271";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.ro.xlf";s:4:"role";s:3:"php";}}i:202;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6cbccc04ebb3a58158041e451c3bc536";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.ru.xlf";s:4:"role";s:3:"php";}}i:203;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d2e6bd911ddff3c7b526755179cf6ed9";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.sk.xlf";s:4:"role";s:3:"php";}}i:204;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cc42fc67ec1729fe317cd3b1c3b96dd6";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.sl.xlf";s:4:"role";s:3:"php";}}i:205;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"20e303068da12f5f5248ace8162051ad";s:4:"name";s:68:"Symfony/Component/Form/Resources/translations/validators.sr_Cyrl.xlf";s:4:"role";s:3:"php";}}i:206;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bdf4d302afd0b1b1b406009402b44f7d";s:4:"name";s:68:"Symfony/Component/Form/Resources/translations/validators.sr_Latn.xlf";s:4:"role";s:3:"php";}}i:207;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"642c23a8173bfd547a71b69a694195f0";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.sv.xlf";s:4:"role";s:3:"php";}}i:208;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6c03831d89108e565c8358f46d807e32";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.uk.xlf";s:4:"role";s:3:"php";}}i:209;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"96cbd8686b821bd2cf91839a6c26cc03";s:4:"name";s:66:"Symfony/Component/Form/Resources/translations/validators.zh_CN.xlf";s:4:"role";s:3:"php";}}i:210;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"658dff714ce275350a7f720a86484e55";s:4:"name";s:46:"Symfony/Component/Form/ReversedTransformer.php";s:4:"role";s:3:"php";}}i:211;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3fb340157282afcc9223daeab2aeb49f";s:4:"name";s:39:"Symfony/Component/Form/SubmitButton.php";s:4:"role";s:3:"php";}}i:212;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ee4f0e6ffe3b36ab57c806045f69d3";s:4:"name";s:46:"Symfony/Component/Form/SubmitButtonBuilder.php";s:4:"role";s:3:"php";}}i:213;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"721a1bd36d3a0cd93e5c57956435f861";s:4:"name";s:52:"Symfony/Component/Form/SubmitButtonTypeInterface.php";s:4:"role";s:3:"php";}}i:214;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"70d8401563ddaeefe2982c73218d9a41";s:4:"name";s:55:"Symfony/Component/Form/Test/DeprecationErrorHandler.php";s:4:"role";s:3:"php";}}i:215;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1847328f5ba757c0997121ed38fe9d61";s:4:"name";s:52:"Symfony/Component/Form/Test/FormBuilderInterface.php";s:4:"role";s:3:"php";}}i:216;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8dc56ae07547e6e8a521cb9d68ff7499";s:4:"name";s:55:"Symfony/Component/Form/Test/FormIntegrationTestCase.php";s:4:"role";s:3:"php";}}i:217;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba89cda1179d1dbc7ae395c4f165f458";s:4:"name";s:45:"Symfony/Component/Form/Test/FormInterface.php";s:4:"role";s:3:"php";}}i:218;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f8d472cfeb2fb094a9fed0a0e31e5900";s:4:"name";s:55:"Symfony/Component/Form/Test/FormPerformanceTestCase.php";s:4:"role";s:3:"php";}}i:219;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a14b6e8fcfd683fcf7498f9a02da523d";s:4:"name";s:44:"Symfony/Component/Form/Test/TypeTestCase.php";s:4:"role";s:3:"php";}}i:220;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"01e6c9a75c6347c2c215d6a15b0c79d5";s:4:"name";s:54:"Symfony/Component/Form/Tests/AbstractDivLayoutTest.php";s:4:"role";s:4:"test";}}i:221;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"993f833ed9fb277ec6f3a74a773d92ae";s:4:"name";s:54:"Symfony/Component/Form/Tests/AbstractExtensionTest.php";s:4:"role";s:4:"test";}}i:222;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"25108525cdb98b2c542d79ef69a08970";s:4:"name";s:49:"Symfony/Component/Form/Tests/AbstractFormTest.php";s:4:"role";s:4:"test";}}i:223;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5def14944ef79b573b5bd008ab84ca4b";s:4:"name";s:51:"Symfony/Component/Form/Tests/AbstractLayoutTest.php";s:4:"role";s:4:"test";}}i:224;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1e1eaca7aca8b88c93cd99d5d934dc12";s:4:"name";s:59:"Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php";s:4:"role";s:4:"test";}}i:225;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f18c692af6dbc9682b8fbfae88d5909c";s:4:"name";s:56:"Symfony/Component/Form/Tests/AbstractTableLayoutTest.php";s:4:"role";s:4:"test";}}i:226;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"487f6d057728873fdbda43c763ad9a3c";s:4:"name";s:60:"Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php";s:4:"role";s:4:"test";}}i:227;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3e01bd80c478bfef4e94cce5b05b810f";s:4:"name";s:49:"Symfony/Component/Form/Tests/CompoundFormTest.php";s:4:"role";s:4:"test";}}i:228;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"805f66672b74f69ef369360000ce28d7";s:4:"name";s:81:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/AbstractChoiceListTest.php";s:4:"role";s:4:"test";}}i:229;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0eb2d36957cb3f06b8246cf4d62845e6";s:4:"name";s:73:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ChoiceListTest.php";s:4:"role";s:4:"test";}}i:230;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4fe2229f0a5ccdfed66591f926d1408a";s:4:"name";s:77:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/LazyChoiceListTest.php";s:4:"role";s:4:"test";}}i:231;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9438557f7e55048a10c0da6dc9b5b7d5";s:4:"name";s:79:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ObjectChoiceListTest.php";s:4:"role";s:4:"test";}}i:232;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c887b01a87b147202efc194dd37f5654";s:4:"name";s:79:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleChoiceListTest.php";s:4:"role";s:4:"test";}}i:233;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"de020dd5c1bfe761abc83eb0d407b93b";s:4:"name";s:86:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleNumericChoiceListTest.php";s:4:"role";s:4:"test";}}i:234;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9b3671899963fbd7e534be6a316b9f7f";s:4:"name";s:81:"Symfony/Component/Form/Tests/Extension/Core/DataMapper/PropertyPathMapperTest.php";s:4:"role";s:4:"test";}}i:235;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fe5c56d887d5e3c625a29d58f19f14b2";s:4:"name";s:91:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ArrayToPartsTransformerTest.php";s:4:"role";s:4:"test";}}i:236;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1f0f17c4989a4bf7e663524addd19377";s:4:"name";s:91:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BaseDateTimeTransformerTest.php";s:4:"role";s:4:"test";}}i:237;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2656ea40e07d5722e5afae535a14c6f2";s:4:"name";s:94:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BooleanToStringTransformerTest.php";s:4:"role";s:4:"test";}}i:238;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f10f920c63a846fee23f895f6519b30c";s:4:"name";s:94:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoicesToValuesTransformerTest.php";s:4:"role";s:4:"test";}}i:239;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"81b526febe066ae1212cf792e057a858";s:4:"name";s:92:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoiceToValueTransformerTest.php";s:4:"role";s:4:"test";}}i:240;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d391c39a885af56bbe963d2884ce1581";s:4:"name";s:88:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DataTransformerChainTest.php";s:4:"role";s:4:"test";}}i:241;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2a0a01ad1cc0ede0f9a9610be868290e";s:4:"name";s:80:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeTestCase.php";s:4:"role";s:4:"test";}}i:242;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c333df3e9adfbd0151953a318603b358";s:4:"name";s:94:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php";s:4:"role";s:4:"test";}}i:243;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cff66917b58654868071c9ee011e36fa";s:4:"name";s:104:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php";s:4:"role";s:4:"test";}}i:244;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ca35365fd4c7e312165063c8754a9545";s:4:"name";s:96:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php";s:4:"role";s:4:"test";}}i:245;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eccc79ef623e695d17510a7c1537a88d";s:4:"name";s:95:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php";s:4:"role";s:4:"test";}}i:246;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e5ee536591d17b7bfe89945a498724ec";s:4:"name";s:98:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToTimestampTransformerTest.php";s:4:"role";s:4:"test";}}i:247;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0eac0ca2189eaf93a9fdaa18c2bfce45";s:4:"name";s:103:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformerTest.php";s:4:"role";s:4:"test";}}i:248;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"74344e0d818fb775d511fea0ee331e96";s:4:"name";s:101:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformerTest.php";s:4:"role";s:4:"test";}}i:249;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c7f0520009e30903c4b681d8038d1116";s:4:"name";s:102:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php";s:4:"role";s:4:"test";}}i:250;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3f3ac246acda56e18c45ede2ad738de5";s:4:"name";s:103:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php";s:4:"role";s:4:"test";}}i:251;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"340da808904f9f817f6bb74c6d1d1bae";s:4:"name";s:96:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ValueToDuplicatesTransformerTest.php";s:4:"role";s:4:"test";}}i:252;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47864719339897429512947960cec29e";s:4:"name";s:87:"Symfony/Component/Form/Tests/Extension/Core/EventListener/FixRadioInputListenerTest.php";s:4:"role";s:4:"test";}}i:253;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87aec5a94c94ec7a5dd1c0839eb0182b";s:4:"name";s:77:"Symfony/Component/Form/Tests/Extension/Core/EventListener/Fixtures/randomhash";s:4:"role";s:4:"test";}}i:254;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6cb15bfda3938a694ba12e947582ee1c";s:4:"name";s:88:"Symfony/Component/Form/Tests/Extension/Core/EventListener/FixUrlProtocolListenerTest.php";s:4:"role";s:4:"test";}}i:255;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e0bc897a2bcb5584079604cd7a932c4a";s:4:"name";s:100:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayObjectTest.php";s:4:"role";s:4:"test";}}i:256;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"541c2ff8d9b47ce17ab79a9f5c7da315";s:4:"name";s:94:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayTest.php";s:4:"role";s:4:"test";}}i:257;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b4d97e836cfe76c4b348b38ef0d3199";s:4:"name";s:106:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerCustomArrayObjectTest.php";s:4:"role";s:4:"test";}}i:258;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6cb07a92e893ccd4ddf1f93592d0ea12";s:4:"name";s:89:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerTest.php";s:4:"role";s:4:"test";}}i:259;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7726c3ab7d9e202ef7e50c6e18a0dc13";s:4:"name";s:84:"Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php";s:4:"role";s:4:"test";}}i:260;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"200a4cdc92f0b266f8b46b971fc5ec82";s:4:"name";s:78:"Symfony/Component/Form/Tests/Extension/Core/EventListener/TrimListenerTest.php";s:4:"role";s:4:"test";}}i:261;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d6a45bded973053fe2db03fce86a667f";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php";s:4:"role";s:4:"test";}}i:262;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"040223464ae2179f3aa78e84fd7b8511";s:4:"name";s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php";s:4:"role";s:4:"test";}}i:263;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"951887c57ca144e04ba2f2001fb12a5b";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php";s:4:"role";s:4:"test";}}i:264;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c435893620ce32c2bee017d4b0cb2157";s:4:"name";s:78:"Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypePerformanceTest.php";s:4:"role";s:4:"test";}}i:265;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9e18e82da0bbc8f4370d3f652ed8ad48";s:4:"name";s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php";s:4:"role";s:4:"test";}}i:266;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"643faa42c8a2cfc19880f78bc9d3bb83";s:4:"name";s:71:"Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php";s:4:"role";s:4:"test";}}i:267;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"196ba14f11fc05ed0a061a909d71b8cd";s:4:"name";s:68:"Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php";s:4:"role";s:4:"test";}}i:268;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e2b1c1525d0bf4cf02e807689138ec88";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php";s:4:"role";s:4:"test";}}i:269;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"91b9362007d0d02d7b55852d49a226d2";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php";s:4:"role";s:4:"test";}}i:270;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"42c8e0bc27d5102ce1b9f7d3807c436c";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php";s:4:"role";s:4:"test";}}i:271;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1bad6779778649a56a6df8ba51ac2442";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/FileTypeTest.php";s:4:"role";s:4:"test";}}i:272;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6384962d22490e2965944280e6da8dd3";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php";s:4:"role";s:4:"test";}}i:273;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"145ac554d44d2416c20efbc33490831b";s:4:"name";s:68:"Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php";s:4:"role";s:4:"test";}}i:274;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ae9dea4e2cd5149f1469249f0aabe2ac";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php";s:4:"role";s:4:"test";}}i:275;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b7946ff970129706743ad613161fd929";s:4:"name";s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php";s:4:"role";s:4:"test";}}i:276;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6bfc500ee59b3c0e85c23e2a4007fc52";s:4:"name";s:66:"Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php";s:4:"role";s:4:"test";}}i:277;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e680b158e130d104e812bc59a594fa08";s:4:"name";s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php";s:4:"role";s:4:"test";}}i:278;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a683610fb85dd825d4141a4b3f528e46";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php";s:4:"role";s:4:"test";}}i:279;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"369245a8723921b895a4591ba34005eb";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.php";s:4:"role";s:4:"test";}}i:280;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fe429eb590a75d6dd3a20bbf08d1e639";s:4:"name";s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/SubmitTypeTest.php";s:4:"role";s:4:"test";}}i:281;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1f837469d11ac48ff637e8fa08da7a44";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php";s:4:"role";s:4:"test";}}i:282;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1082d1f9f4683702300ce6a8be9c835b";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php";s:4:"role";s:4:"test";}}i:283;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e71b97847da4bbd7b694e2a7ea18c7b7";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/TypeTestCase.php";s:4:"role";s:4:"test";}}i:284;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1f33d8fa306ebdbad2cf4561557655ca";s:4:"name";s:64:"Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php";s:4:"role";s:4:"test";}}i:285;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d5607097da4e8ba843c7671fc95bd5ed";s:4:"name";s:84:"Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/DefaultCsrfProviderTest.php";s:4:"role";s:4:"test";}}i:286;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b01b266a7196ae1aaaf9b4d3d8f1f2ed";s:4:"name";s:84:"Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/SessionCsrfProviderTest.php";s:4:"role";s:4:"test";}}i:287;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"afcd45b858401261360a30c4cb0f9aba";s:4:"name";s:88:"Symfony/Component/Form/Tests/Extension/Csrf/EventListener/CsrfValidationListenerTest.php";s:4:"role";s:4:"test";}}i:288;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1ee5764d064d208a058c7719817c5935";s:4:"name";s:78:"Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php";s:4:"role";s:4:"test";}}i:289;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e69912900a62a5bb4c69d9c37ed2952e";s:4:"name";s:83:"Symfony/Component/Form/Tests/Extension/DataCollector/DataCollectorExtensionTest.php";s:4:"role";s:4:"test";}}i:290;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"deaf70e32c29e96b0a0f5de433b99dea";s:4:"name";s:78:"Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php";s:4:"role";s:4:"test";}}i:291;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d12c0ee191323d8ad5e0926d2484ec59";s:4:"name";s:78:"Symfony/Component/Form/Tests/Extension/DataCollector/FormDataExtractorTest.php";s:4:"role";s:4:"test";}}i:292;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d8948496dc0e6214e740ca00ca529e95";s:4:"name";s:92:"Symfony/Component/Form/Tests/Extension/DataCollector/Type/DataCollectorTypeExtensionTest.php";s:4:"role";s:4:"test";}}i:293;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6e2cdd48baa66831a820c785cf96d440";s:4:"name";s:95:"Symfony/Component/Form/Tests/Extension/HttpFoundation/EventListener/BindRequestListenerTest.php";s:4:"role";s:4:"test";}}i:294;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b2e0f962d2654c7b7bfabeec6feffe3a";s:4:"name";s:90:"Symfony/Component/Form/Tests/Extension/HttpFoundation/HttpFoundationRequestHandlerTest.php";s:4:"role";s:4:"test";}}i:295;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b843b76574f23418997cf5d299e1795d";s:4:"name";s:93:"Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorPerformanceTest.php";s:4:"role";s:4:"test";}}i:296;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3956a614fe00f61b9df4abd22fb94c77";s:4:"name";s:82:"Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php";s:4:"role";s:4:"test";}}i:297;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"159b78c63cad4f5c62977766f6680a69";s:4:"name";s:89:"Symfony/Component/Form/Tests/Extension/Validator/EventListener/ValidationListenerTest.php";s:4:"role";s:4:"test";}}i:298;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8ca1bca8a4d7d47e6d612d714c3e434d";s:4:"name";s:84:"Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php";s:4:"role";s:4:"test";}}i:299;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"68b380257c232e2600d07153905f0d5f";s:4:"name";s:88:"Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php";s:4:"role";s:4:"test";}}i:300;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"831836b41b079545f0670fe13ce7a212";s:4:"name";s:90:"Symfony/Component/Form/Tests/Extension/Validator/Type/SubmitTypeValidatorExtensionTest.php";s:4:"role";s:4:"test";}}i:301;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"49189d46e88a6d3d850c27b162c6e2ce";s:4:"name";s:70:"Symfony/Component/Form/Tests/Extension/Validator/Type/TypeTestCase.php";s:4:"role";s:4:"test";}}i:302;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d5cfc3ee82f42b842bc2d5c384142e5e";s:4:"name";s:74:"Symfony/Component/Form/Tests/Extension/Validator/Util/ServerParamsTest.php";s:4:"role";s:4:"test";}}i:303;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"19620e0f5149427d9bc81ff43f3f6849";s:4:"name";s:77:"Symfony/Component/Form/Tests/Extension/Validator/ValidatorTypeGuesserTest.php";s:4:"role";s:4:"test";}}i:304;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87696746275168d808097b9ac08eefd1";s:4:"name";s:88:"Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationMapperTest.php";s:4:"role";s:4:"test";}}i:305;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4be55d217fa73d2f0c14537f75635e84";s:4:"name";s:86:"Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationPathTest.php";s:4:"role";s:4:"test";}}i:306;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aaeeaa8b993916866478b077e0ae5f7b";s:4:"name";s:60:"Symfony/Component/Form/Tests/Fixtures/AlternatingRowType.php";s:4:"role";s:4:"test";}}i:307;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5c1563a26ab06e4cc72c80d1b4aa75a4";s:4:"name";s:48:"Symfony/Component/Form/Tests/Fixtures/Author.php";s:4:"role";s:4:"test";}}i:308;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"68c706abf40680b1fad0aa7c383af085";s:4:"name";s:52:"Symfony/Component/Form/Tests/Fixtures/AuthorType.php";s:4:"role";s:4:"test";}}i:309;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"80f520948113200553ccb1415f481af3";s:4:"name";s:59:"Symfony/Component/Form/Tests/Fixtures/CustomArrayObject.php";s:4:"role";s:4:"test";}}i:310;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"21ddaf5472929f397a80781c71c5904e";s:4:"name";s:62:"Symfony/Component/Form/Tests/Fixtures/FixedDataTransformer.php";s:4:"role";s:4:"test";}}i:311;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f2a8c5376aac3794f6ba81a263e4f2bf";s:4:"name";s:61:"Symfony/Component/Form/Tests/Fixtures/FixedFilterListener.php";s:4:"role";s:4:"test";}}i:312;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:41:"Symfony/Component/Form/Tests/Fixtures/foo";s:4:"role";s:4:"test";}}i:313;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"412bb3f7b15954b7685df57c03cc9216";s:4:"name";s:52:"Symfony/Component/Form/Tests/Fixtures/FooSubType.php";s:4:"role";s:4:"test";}}i:314;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"31c9db4f9cbf24f98688538f63431553";s:4:"name";s:70:"Symfony/Component/Form/Tests/Fixtures/FooSubTypeWithParentInstance.php";s:4:"role";s:4:"test";}}i:315;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"56722f2c6ccf149b5009818e705b661d";s:4:"name";s:49:"Symfony/Component/Form/Tests/Fixtures/FooType.php";s:4:"role";s:4:"test";}}i:316;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"344219ab84242c7d151ff482ebbca70b";s:4:"name";s:61:"Symfony/Component/Form/Tests/Fixtures/FooTypeBarExtension.php";s:4:"role";s:4:"test";}}i:317;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8178239dc9236054e8df7a4cbf7d7888";s:4:"name";s:61:"Symfony/Component/Form/Tests/Fixtures/FooTypeBazExtension.php";s:4:"role";s:4:"test";}}i:318;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e23c89ad471d8601a063b068cd6636ee";s:4:"name";s:55:"Symfony/Component/Form/Tests/Fixtures/TestExtension.php";s:4:"role";s:4:"test";}}i:319;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"72d98919f7d17ed12b851b748b795913";s:4:"name";s:48:"Symfony/Component/Form/Tests/FormBuilderTest.php";s:4:"role";s:4:"test";}}i:320;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0a53ef078ccdaf281872d03975b3f9c5";s:4:"name";s:47:"Symfony/Component/Form/Tests/FormConfigTest.php";s:4:"role";s:4:"test";}}i:321;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4808f4d1f807a2bd730db77dc250ea3a";s:4:"name";s:55:"Symfony/Component/Form/Tests/FormFactoryBuilderTest.php";s:4:"role";s:4:"test";}}i:322;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"148b1a32ce39b4536ce2cdabca226c8e";s:4:"name";s:48:"Symfony/Component/Form/Tests/FormFactoryTest.php";s:4:"role";s:4:"test";}}i:323;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cba12233a71fa6ad78db42d0b0358123";s:4:"name";s:56:"Symfony/Component/Form/Tests/FormIntegrationTestCase.php";s:4:"role";s:4:"test";}}i:324;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e899de2472926b4ada8acb636f1b5444";s:4:"name";s:56:"Symfony/Component/Form/Tests/FormPerformanceTestCase.php";s:4:"role";s:4:"test";}}i:325;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eeb0092e76c36e50791699eb2faaaa03";s:4:"name";s:49:"Symfony/Component/Form/Tests/FormRegistryTest.php";s:4:"role";s:4:"test";}}i:326;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1fc848f084ce8f7e10335f8175105886";s:4:"name";s:49:"Symfony/Component/Form/Tests/FormRendererTest.php";s:4:"role";s:4:"test";}}i:327;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fff8d24dbf03762ed0e2b6f15df45d2d";s:4:"name";s:48:"Symfony/Component/Form/Tests/Guess/GuessTest.php";s:4:"role";s:4:"test";}}i:328;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1877e570ea6b354cd5d9d9ba30418edb";s:4:"name";s:57:"Symfony/Component/Form/Tests/NativeRequestHandlerTest.php";s:4:"role";s:4:"test";}}i:329;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5261f73e95c249da67fe334c0927bf1f";s:4:"name";s:53:"Symfony/Component/Form/Tests/ResolvedFormTypeTest.php";s:4:"role";s:4:"test";}}i:330;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cfd0db6db50796656eb604515e87adda";s:4:"name";s:47:"Symfony/Component/Form/Tests/SimpleFormTest.php";s:4:"role";s:4:"test";}}i:331;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a7eeabaf53f6a3b60ec3ac2a78ce5002";s:4:"name";s:56:"Symfony/Component/Form/Tests/Util/OrderedHashMapTest.php";s:4:"role";s:4:"test";}}i:332;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d3566f471dce8351225b74b1c01058b6";s:4:"name";s:40:"Symfony/Component/Form/Util/FormUtil.php";s:4:"role";s:3:"php";}}i:333;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"98034987b9a71a6ec3a3f2fddd95f06a";s:4:"name";s:56:"Symfony/Component/Form/Util/InheritDataAwareIterator.php";s:4:"role";s:3:"php";}}i:334;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fe22cba7385d2b8406b6a7104b9cf58c";s:4:"name";s:46:"Symfony/Component/Form/Util/OrderedHashMap.php";s:4:"role";s:3:"php";}}i:335;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6240f5c5d77934285a2dddab60843429";s:4:"name";s:54:"Symfony/Component/Form/Util/OrderedHashMapIterator.php";s:4:"role";s:3:"php";}}i:336;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"da65af10d658064eddfec592c82eb95b";s:4:"name";s:56:"Symfony/Component/Form/Util/VirtualFormAwareIterator.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}s:7:"package";a:3:{i:0;a:2:{s:4:"name";s:15:"EventDispatcher";s:7:"channel";s:16:"pear.symfony.com";}i:1;a:2:{s:4:"name";s:9:"Validator";s:7:"channel";s:16:"pear.symfony.com";}i:2;a:2:{s:4:"name";s:6:"Locale";s:7:"channel";s:16:"pear.symfony.com";}}}s:8:"optional";a:1:{s:7:"package";a:2:{s:4:"name";s:14:"HttpFoundation";s:7:"channel";s:16:"pear.symfony.com";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:337:{s:44:"Symfony/Component/Form/AbstractExtension.php";a:4:{s:6:"md5sum";s:32:"501890934b78c1cda42337c3c85761f5";s:4:"name";s:44:"Symfony/Component/Form/AbstractExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/AbstractExtension.php";}s:49:"Symfony/Component/Form/AbstractRendererEngine.php";a:4:{s:6:"md5sum";s:32:"c855e95efaafd48a3b35f4e4ed7ef461";s:4:"name";s:49:"Symfony/Component/Form/AbstractRendererEngine.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/AbstractRendererEngine.php";}s:39:"Symfony/Component/Form/AbstractType.php";a:4:{s:6:"md5sum";s:32:"fda8ea1864e57a50d81607d692e68c73";s:4:"name";s:39:"Symfony/Component/Form/AbstractType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/AbstractType.php";}s:48:"Symfony/Component/Form/AbstractTypeExtension.php";a:4:{s:6:"md5sum";s:32:"0cc218c093e9d4631ab2dd2276c567bd";s:4:"name";s:48:"Symfony/Component/Form/AbstractTypeExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/AbstractTypeExtension.php";}s:37:"Symfony/Component/Form/autoloader.php";a:4:{s:6:"md5sum";s:32:"ccc700d8c25bc05b9e4a4b327a643f46";s:4:"name";s:37:"Symfony/Component/Form/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/autoloader.php";}s:33:"Symfony/Component/Form/Button.php";a:4:{s:6:"md5sum";s:32:"e4221c7f370be7e1fae189ac0f0245f8";s:4:"name";s:33:"Symfony/Component/Form/Button.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Button.php";}s:40:"Symfony/Component/Form/ButtonBuilder.php";a:4:{s:6:"md5sum";s:32:"d27ec47e44803a025e38d0067c824cdc";s:4:"name";s:40:"Symfony/Component/Form/ButtonBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/ButtonBuilder.php";}s:46:"Symfony/Component/Form/ButtonTypeInterface.php";a:4:{s:6:"md5sum";s:32:"2b9067ff341a18790204ea50c84102bd";s:4:"name";s:46:"Symfony/Component/Form/ButtonTypeInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/ButtonTypeInterface.php";}s:46:"Symfony/Component/Form/CallbackTransformer.php";a:4:{s:6:"md5sum";s:32:"902572561ace9999c9f8d8e0f37cd28f";s:4:"name";s:46:"Symfony/Component/Form/CallbackTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/CallbackTransformer.php";}s:35:"Symfony/Component/Form/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"abf0d085506e63678c96f8f9666c3b1c";s:4:"name";s:35:"Symfony/Component/Form/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/doc/pear/Form/Symfony/Component/Form/CHANGELOG.md";}s:45:"Symfony/Component/Form/ClickableInterface.php";a:4:{s:6:"md5sum";s:32:"0907b59351198bd99ceea685c9f7c7c2";s:4:"name";s:45:"Symfony/Component/Form/ClickableInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/ClickableInterface.php";}s:36:"Symfony/Component/Form/composer.json";a:4:{s:6:"md5sum";s:32:"5519e4c865c9aab62f36e8ccc2687a0a";s:4:"name";s:36:"Symfony/Component/Form/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/doc/pear/Form/Symfony/Component/Form/composer.json";}s:46:"Symfony/Component/Form/DataMapperInterface.php";a:4:{s:6:"md5sum";s:32:"db3b117a3b8dd577bbd64a81766ad78d";s:4:"name";s:46:"Symfony/Component/Form/DataMapperInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/DataMapperInterface.php";}s:51:"Symfony/Component/Form/DataTransformerInterface.php";a:4:{s:6:"md5sum";s:32:"555454867c9b8687d4ee00a014b981c1";s:4:"name";s:51:"Symfony/Component/Form/DataTransformerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/DataTransformerInterface.php";}s:58:"Symfony/Component/Form/Exception/AlreadyBoundException.php";a:4:{s:6:"md5sum";s:32:"bc89a72f34e3e1d4a6628d32b1511007";s:4:"name";s:58:"Symfony/Component/Form/Exception/AlreadyBoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/AlreadyBoundException.php";}s:62:"Symfony/Component/Form/Exception/AlreadySubmittedException.php";a:4:{s:6:"md5sum";s:32:"419b77be4914d44fbe8f422c9dce819a";s:4:"name";s:62:"Symfony/Component/Form/Exception/AlreadySubmittedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/AlreadySubmittedException.php";}s:59:"Symfony/Component/Form/Exception/BadMethodCallException.php";a:4:{s:6:"md5sum";s:32:"a7e624979068a6ac1975cef01a181a64";s:4:"name";s:59:"Symfony/Component/Form/Exception/BadMethodCallException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/BadMethodCallException.php";}s:58:"Symfony/Component/Form/Exception/ErrorMappingException.php";a:4:{s:6:"md5sum";s:32:"b43e60289f802c13894f4427988c2915";s:4:"name";s:58:"Symfony/Component/Form/Exception/ErrorMappingException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/ErrorMappingException.php";}s:55:"Symfony/Component/Form/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"1f4d4c025c5f49fd0e787f2095dcac58";s:4:"name";s:55:"Symfony/Component/Form/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/ExceptionInterface.php";}s:61:"Symfony/Component/Form/Exception/InvalidArgumentException.php";a:4:{s:6:"md5sum";s:32:"a93c3e0ef8f9f1833b1ec31f26baaa92";s:4:"name";s:61:"Symfony/Component/Form/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/InvalidArgumentException.php";}s:66:"Symfony/Component/Form/Exception/InvalidConfigurationException.php";a:4:{s:6:"md5sum";s:32:"16b9f308c2cd41c6feea464a4c2a4078";s:4:"name";s:66:"Symfony/Component/Form/Exception/InvalidConfigurationException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/InvalidConfigurationException.php";}s:51:"Symfony/Component/Form/Exception/LogicException.php";a:4:{s:6:"md5sum";s:32:"7acb2af6fec7e8015fdf9473ed22e568";s:4:"name";s:51:"Symfony/Component/Form/Exception/LogicException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/LogicException.php";}s:57:"Symfony/Component/Form/Exception/OutOfBoundsException.php";a:4:{s:6:"md5sum";s:32:"6439c29ccaba5ed08f068b56d1cb900a";s:4:"name";s:57:"Symfony/Component/Form/Exception/OutOfBoundsException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/OutOfBoundsException.php";}s:53:"Symfony/Component/Form/Exception/RuntimeException.php";a:4:{s:6:"md5sum";s:32:"035137b05f9d396eebf788cd0475bfd2";s:4:"name";s:53:"Symfony/Component/Form/Exception/RuntimeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/RuntimeException.php";}s:56:"Symfony/Component/Form/Exception/StringCastException.php";a:4:{s:6:"md5sum";s:32:"05fafa90307ac0049080845bfc134e90";s:4:"name";s:56:"Symfony/Component/Form/Exception/StringCastException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/StringCastException.php";}s:66:"Symfony/Component/Form/Exception/TransformationFailedException.php";a:4:{s:6:"md5sum";s:32:"04e43782ab8e754a86f812f93d3e80f0";s:4:"name";s:66:"Symfony/Component/Form/Exception/TransformationFailedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/TransformationFailedException.php";}s:60:"Symfony/Component/Form/Exception/UnexpectedTypeException.php";a:4:{s:6:"md5sum";s:32:"93ab4195343c65feabe0a9a15e3b4e03";s:4:"name";s:60:"Symfony/Component/Form/Exception/UnexpectedTypeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception/UnexpectedTypeException.php";}s:63:"Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php";a:4:{s:6:"md5sum";s:32:"fae7f67d21f3636dcfd9255b18c0f409";s:4:"name";s:63:"Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php";}s:72:"Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceListInterface.php";a:4:{s:6:"md5sum";s:32:"75ef902d77e51ff120a5bb80a3ba4b2c";s:4:"name";s:72:"Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceListInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceListInterface.php";}s:67:"Symfony/Component/Form/Extension/Core/ChoiceList/LazyChoiceList.php";a:4:{s:6:"md5sum";s:32:"6c60da1e88563e1e8ee345e908e99895";s:4:"name";s:67:"Symfony/Component/Form/Extension/Core/ChoiceList/LazyChoiceList.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/ChoiceList/LazyChoiceList.php";}s:69:"Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php";a:4:{s:6:"md5sum";s:32:"93d7bd50a57d6ce541c9e465f1f9c727";s:4:"name";s:69:"Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php";}s:69:"Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php";a:4:{s:6:"md5sum";s:32:"dd799ebc2f390f6c26a68d9b27163986";s:4:"name";s:69:"Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php";}s:55:"Symfony/Component/Form/Extension/Core/CoreExtension.php";a:4:{s:6:"md5sum";s:32:"249e325333e1e0bbf071c2352f1015ef";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/CoreExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/CoreExtension.php";}s:71:"Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php";a:4:{s:6:"md5sum";s:32:"cf380dc09a61dcd25aa19cde02d5a496";s:4:"name";s:71:"Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php";}s:81:"Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.php";a:4:{s:6:"md5sum";s:32:"5b1463a8ca32434df6df7fdd15470ffe";s:4:"name";s:81:"Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.php";}s:81:"Symfony/Component/Form/Extension/Core/DataTransformer/BaseDateTimeTransformer.php";a:4:{s:6:"md5sum";s:32:"95ce9f75d9de781506bd27afae24a435";s:4:"name";s:81:"Symfony/Component/Form/Extension/Core/DataTransformer/BaseDateTimeTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/BaseDateTimeTransformer.php";}s:84:"Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.php";a:4:{s:6:"md5sum";s:32:"1beb890d4d901ce9a49a02aa567d4d1d";s:4:"name";s:84:"Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.php";}s:90:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToBooleanArrayTransformer.php";a:4:{s:6:"md5sum";s:32:"bdc67501df308818f4ccb6e87fd4b460";s:4:"name";s:90:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToBooleanArrayTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToBooleanArrayTransformer.php";}s:84:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToValuesTransformer.php";a:4:{s:6:"md5sum";s:32:"d417455cb1a9c5f1ce2d0ae9b72c262a";s:4:"name";s:84:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToValuesTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToValuesTransformer.php";}s:89:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToBooleanArrayTransformer.php";a:4:{s:6:"md5sum";s:32:"b4ddb6ca1e45e39c27603e9a61746fe0";s:4:"name";s:89:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToBooleanArrayTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToBooleanArrayTransformer.php";}s:82:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php";a:4:{s:6:"md5sum";s:32:"c23bb58d706b389464865d3baaa9dc0f";s:4:"name";s:82:"Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php";}s:78:"Symfony/Component/Form/Extension/Core/DataTransformer/DataTransformerChain.php";a:4:{s:6:"md5sum";s:32:"fb47a7c8ec22b84e657ba080eebf9185";s:4:"name";s:78:"Symfony/Component/Form/Extension/Core/DataTransformer/DataTransformerChain.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/DataTransformerChain.php";}s:84:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php";a:4:{s:6:"md5sum";s:32:"987af4de3dad99dbe03d40ad481e59f5";s:4:"name";s:84:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php";}s:94:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php";a:4:{s:6:"md5sum";s:32:"08fe73eed45b4e64f5a612fe384ee949";s:4:"name";s:94:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php";}s:86:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php";a:4:{s:6:"md5sum";s:32:"536a31499542c247eeac9f887459ccb6";s:4:"name";s:86:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php";}s:85:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php";a:4:{s:6:"md5sum";s:32:"84819444537109979c4ded0dcb5449d3";s:4:"name";s:85:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php";}s:88:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php";a:4:{s:6:"md5sum";s:32:"d420953c67b9ce03b78d46777f78934e";s:4:"name";s:88:"Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php";}s:93:"Symfony/Component/Form/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformer.php";a:4:{s:6:"md5sum";s:32:"87c45ad85d859bc5ac1847dbe26f451f";s:4:"name";s:93:"Symfony/Component/Form/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformer.php";}s:91:"Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php";a:4:{s:6:"md5sum";s:32:"031be52b519ab452a56e72c0ad919f9d";s:4:"name";s:91:"Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php";}s:92:"Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php";a:4:{s:6:"md5sum";s:32:"fdab477194f1770c375e73e5571253c9";s:4:"name";s:92:"Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php";}s:93:"Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php";a:4:{s:6:"md5sum";s:32:"0a1be99705fd6d15d2b67c9d7cc34f0a";s:4:"name";s:93:"Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php";}s:86:"Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.php";a:4:{s:6:"md5sum";s:32:"a9acfacc5c1d22709f2d9fb9572e5856";s:4:"name";s:86:"Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.php";}s:80:"Symfony/Component/Form/Extension/Core/EventListener/FixCheckboxInputListener.php";a:4:{s:6:"md5sum";s:32:"4fd81dac92cd7178a4df5463b909a67b";s:4:"name";s:80:"Symfony/Component/Form/Extension/Core/EventListener/FixCheckboxInputListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/EventListener/FixCheckboxInputListener.php";}s:77:"Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php";a:4:{s:6:"md5sum";s:32:"def66949bde6d959e70d661d15f1e9e3";s:4:"name";s:77:"Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php";}s:78:"Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php";a:4:{s:6:"md5sum";s:32:"f57106b0d09322f11efddefb368fb952";s:4:"name";s:78:"Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php";}s:79:"Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php";a:4:{s:6:"md5sum";s:32:"1d42403d6e8be3877c66cdf6eeb7f375";s:4:"name";s:79:"Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php";}s:74:"Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php";a:4:{s:6:"md5sum";s:32:"c79a52d764d974eaa9a1d742211220b9";s:4:"name";s:74:"Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php";}s:68:"Symfony/Component/Form/Extension/Core/EventListener/TrimListener.php";a:4:{s:6:"md5sum";s:32:"0bbbf865bc2c1c7b013b19cd49ea66f8";s:4:"name";s:68:"Symfony/Component/Form/Extension/Core/EventListener/TrimListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/EventListener/TrimListener.php";}s:55:"Symfony/Component/Form/Extension/Core/Type/BaseType.php";a:4:{s:6:"md5sum";s:32:"058c321dda699e31ae2e164586817072";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/BaseType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/BaseType.php";}s:59:"Symfony/Component/Form/Extension/Core/Type/BirthdayType.php";a:4:{s:6:"md5sum";s:32:"601dc1defb9cfe03f57ecb55ec6519ee";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/BirthdayType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/BirthdayType.php";}s:57:"Symfony/Component/Form/Extension/Core/Type/ButtonType.php";a:4:{s:6:"md5sum";s:32:"df30378aa4224d2e19bfb48e3f22be73";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/ButtonType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/ButtonType.php";}s:59:"Symfony/Component/Form/Extension/Core/Type/CheckboxType.php";a:4:{s:6:"md5sum";s:32:"20d7fadb63815c65c600ff1cab100d69";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/CheckboxType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php";}s:57:"Symfony/Component/Form/Extension/Core/Type/ChoiceType.php";a:4:{s:6:"md5sum";s:32:"c7bce0021e92409791dc40237e44585e";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/ChoiceType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php";}s:61:"Symfony/Component/Form/Extension/Core/Type/CollectionType.php";a:4:{s:6:"md5sum";s:32:"675668b49022522d4646aa90049c2650";s:4:"name";s:61:"Symfony/Component/Form/Extension/Core/Type/CollectionType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/CollectionType.php";}s:58:"Symfony/Component/Form/Extension/Core/Type/CountryType.php";a:4:{s:6:"md5sum";s:32:"113a7ecb3ad40c9ffb38fd685db1ab3a";s:4:"name";s:58:"Symfony/Component/Form/Extension/Core/Type/CountryType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/CountryType.php";}s:59:"Symfony/Component/Form/Extension/Core/Type/CurrencyType.php";a:4:{s:6:"md5sum";s:32:"0be9c69f93866ae116791fcfb7a77186";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/CurrencyType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/CurrencyType.php";}s:59:"Symfony/Component/Form/Extension/Core/Type/DateTimeType.php";a:4:{s:6:"md5sum";s:32:"5d41f93fff961492d2de8bc4d71e7862";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/DateTimeType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php";}s:55:"Symfony/Component/Form/Extension/Core/Type/DateType.php";a:4:{s:6:"md5sum";s:32:"35d0a4afbc155cd3838aebf3a564fb42";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/DateType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/DateType.php";}s:56:"Symfony/Component/Form/Extension/Core/Type/EmailType.php";a:4:{s:6:"md5sum";s:32:"146a7c19ddde4cdca72343da4cfe17d5";s:4:"name";s:56:"Symfony/Component/Form/Extension/Core/Type/EmailType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/EmailType.php";}s:55:"Symfony/Component/Form/Extension/Core/Type/FileType.php";a:4:{s:6:"md5sum";s:32:"060ed2ce1bef45de0340a9448c5f04f2";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/FileType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/FileType.php";}s:55:"Symfony/Component/Form/Extension/Core/Type/FormType.php";a:4:{s:6:"md5sum";s:32:"50f9fbd36e4a7e4b9136be87bf43cb8a";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/FormType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/FormType.php";}s:57:"Symfony/Component/Form/Extension/Core/Type/HiddenType.php";a:4:{s:6:"md5sum";s:32:"300baaff3c467b27ddcde08751708dc8";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/HiddenType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/HiddenType.php";}s:58:"Symfony/Component/Form/Extension/Core/Type/IntegerType.php";a:4:{s:6:"md5sum";s:32:"39268ae7dc189edbc1f1ac9cf01bdcb6";s:4:"name";s:58:"Symfony/Component/Form/Extension/Core/Type/IntegerType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/IntegerType.php";}s:59:"Symfony/Component/Form/Extension/Core/Type/LanguageType.php";a:4:{s:6:"md5sum";s:32:"d463acc8367ee0afe8417a0aaba019fe";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/LanguageType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/LanguageType.php";}s:57:"Symfony/Component/Form/Extension/Core/Type/LocaleType.php";a:4:{s:6:"md5sum";s:32:"a01e0f05fec87b35b3424829d33d1755";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/LocaleType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/LocaleType.php";}s:56:"Symfony/Component/Form/Extension/Core/Type/MoneyType.php";a:4:{s:6:"md5sum";s:32:"610e8b6a1425b2eb97a0d7c700edf05c";s:4:"name";s:56:"Symfony/Component/Form/Extension/Core/Type/MoneyType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/MoneyType.php";}s:57:"Symfony/Component/Form/Extension/Core/Type/NumberType.php";a:4:{s:6:"md5sum";s:32:"e5cd61198e2bc26e98d427ab26238c29";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/NumberType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/NumberType.php";}s:59:"Symfony/Component/Form/Extension/Core/Type/PasswordType.php";a:4:{s:6:"md5sum";s:32:"e404fb615ce73dc63a1849d3debb800a";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/PasswordType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/PasswordType.php";}s:58:"Symfony/Component/Form/Extension/Core/Type/PercentType.php";a:4:{s:6:"md5sum";s:32:"1049fece490815d0886c3ddff2bae892";s:4:"name";s:58:"Symfony/Component/Form/Extension/Core/Type/PercentType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/PercentType.php";}s:56:"Symfony/Component/Form/Extension/Core/Type/RadioType.php";a:4:{s:6:"md5sum";s:32:"90fba868b14c878176ada892065394bf";s:4:"name";s:56:"Symfony/Component/Form/Extension/Core/Type/RadioType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/RadioType.php";}s:59:"Symfony/Component/Form/Extension/Core/Type/RepeatedType.php";a:4:{s:6:"md5sum";s:32:"f87bd813801d2d880e905cdd0ffa57da";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/RepeatedType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/RepeatedType.php";}s:56:"Symfony/Component/Form/Extension/Core/Type/ResetType.php";a:4:{s:6:"md5sum";s:32:"c4df569621c1f85389b7c7cbf789bf63";s:4:"name";s:56:"Symfony/Component/Form/Extension/Core/Type/ResetType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/ResetType.php";}s:57:"Symfony/Component/Form/Extension/Core/Type/SearchType.php";a:4:{s:6:"md5sum";s:32:"a6b0608cb9f219f8a8c192f64f141335";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/SearchType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/SearchType.php";}s:57:"Symfony/Component/Form/Extension/Core/Type/SubmitType.php";a:4:{s:6:"md5sum";s:32:"d689ab8ea2da255a67b7d2140af1627b";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/Type/SubmitType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/SubmitType.php";}s:59:"Symfony/Component/Form/Extension/Core/Type/TextareaType.php";a:4:{s:6:"md5sum";s:32:"02627d9175c745247f7e59cf1c2d4562";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/TextareaType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/TextareaType.php";}s:55:"Symfony/Component/Form/Extension/Core/Type/TextType.php";a:4:{s:6:"md5sum";s:32:"79f868ef2b8c73154789fcaa591f8467";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/TextType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/TextType.php";}s:55:"Symfony/Component/Form/Extension/Core/Type/TimeType.php";a:4:{s:6:"md5sum";s:32:"993e6cee3429a18fabdc70f0a67c7d57";s:4:"name";s:55:"Symfony/Component/Form/Extension/Core/Type/TimeType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/TimeType.php";}s:59:"Symfony/Component/Form/Extension/Core/Type/TimezoneType.php";a:4:{s:6:"md5sum";s:32:"f5607e197c52e096bf060d259aef4079";s:4:"name";s:59:"Symfony/Component/Form/Extension/Core/Type/TimezoneType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php";}s:54:"Symfony/Component/Form/Extension/Core/Type/UrlType.php";a:4:{s:6:"md5sum";s:32:"38ac4b65d20ba774f1421dfd2acd3193";s:4:"name";s:54:"Symfony/Component/Form/Extension/Core/Type/UrlType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type/UrlType.php";}s:57:"Symfony/Component/Form/Extension/Core/View/ChoiceView.php";a:4:{s:6:"md5sum";s:32:"faafdc84e0bfdcd503be96fcb730c4c0";s:4:"name";s:57:"Symfony/Component/Form/Extension/Core/View/ChoiceView.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/View/ChoiceView.php";}s:55:"Symfony/Component/Form/Extension/Csrf/CsrfExtension.php";a:4:{s:6:"md5sum";s:32:"75199e400bebc4583e278a7b24e96833";s:4:"name";s:55:"Symfony/Component/Form/Extension/Csrf/CsrfExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/CsrfExtension.php";}s:74:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderAdapter.php";a:4:{s:6:"md5sum";s:32:"3a1592bafaa9d2402bb6806fd1ac3e9d";s:4:"name";s:74:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderAdapter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderAdapter.php";}s:76:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.php";a:4:{s:6:"md5sum";s:32:"e86115910210dec2676aeb707cb5acf0";s:4:"name";s:76:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.php";}s:78:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfTokenManagerAdapter.php";a:4:{s:6:"md5sum";s:32:"db64afcb25c6806ce15828e6ac8c790e";s:4:"name";s:78:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfTokenManagerAdapter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfTokenManagerAdapter.php";}s:74:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.php";a:4:{s:6:"md5sum";s:32:"a1f980527cf2cec99b44eaa1a09e0d4f";s:4:"name";s:74:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.php";}s:74:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/SessionCsrfProvider.php";a:4:{s:6:"md5sum";s:32:"c939632d9abebe20853bc59ce816b457";s:4:"name";s:74:"Symfony/Component/Form/Extension/Csrf/CsrfProvider/SessionCsrfProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/CsrfProvider/SessionCsrfProvider.php";}s:78:"Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php";a:4:{s:6:"md5sum";s:32:"c17a0b6ad7348188b47da6647b50cc82";s:4:"name";s:78:"Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php";}s:68:"Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php";a:4:{s:6:"md5sum";s:32:"0de14d86a9825500a9b8a71025542c1b";s:4:"name";s:68:"Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php";}s:73:"Symfony/Component/Form/Extension/DataCollector/DataCollectorExtension.php";a:4:{s:6:"md5sum";s:32:"5c5494c1d8bb041b3b938f53a48bb1a1";s:4:"name";s:73:"Symfony/Component/Form/Extension/DataCollector/DataCollectorExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/DataCollectorExtension.php";}s:86:"Symfony/Component/Form/Extension/DataCollector/EventListener/DataCollectorListener.php";a:4:{s:6:"md5sum";s:32:"1419e5bb5008ecb2d6d757bd7023fda8";s:4:"name";s:86:"Symfony/Component/Form/Extension/DataCollector/EventListener/DataCollectorListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/EventListener/DataCollectorListener.php";}s:68:"Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php";a:4:{s:6:"md5sum";s:32:"fdf324521978ceec4f561d76770a08d2";s:4:"name";s:68:"Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php";}s:77:"Symfony/Component/Form/Extension/DataCollector/FormDataCollectorInterface.php";a:4:{s:6:"md5sum";s:32:"8e33ae446484b221f1a8f43b96689a9a";s:4:"name";s:77:"Symfony/Component/Form/Extension/DataCollector/FormDataCollectorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/FormDataCollectorInterface.php";}s:68:"Symfony/Component/Form/Extension/DataCollector/FormDataExtractor.php";a:4:{s:6:"md5sum";s:32:"c6dbee88cf57973284f2deb8b7d62266";s:4:"name";s:68:"Symfony/Component/Form/Extension/DataCollector/FormDataExtractor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/FormDataExtractor.php";}s:77:"Symfony/Component/Form/Extension/DataCollector/FormDataExtractorInterface.php";a:4:{s:6:"md5sum";s:32:"e0250a5d7bb1e0c5022cc5bead2126dc";s:4:"name";s:77:"Symfony/Component/Form/Extension/DataCollector/FormDataExtractorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/FormDataExtractorInterface.php";}s:87:"Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php";a:4:{s:6:"md5sum";s:32:"1d3278f320b0fc626c80ff21d4e4d798";s:4:"name";s:87:"Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php";}s:94:"Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeFactoryDataCollectorProxy.php";a:4:{s:6:"md5sum";s:32:"7acc20404d7bc268d80bd71d29b2c0da";s:4:"name";s:94:"Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeFactoryDataCollectorProxy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeFactoryDataCollectorProxy.php";}s:82:"Symfony/Component/Form/Extension/DataCollector/Type/DataCollectorTypeExtension.php";a:4:{s:6:"md5sum";s:32:"384aa6433ffc18edb15519d550103ca1";s:4:"name";s:82:"Symfony/Component/Form/Extension/DataCollector/Type/DataCollectorTypeExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/Type/DataCollectorTypeExtension.php";}s:85:"Symfony/Component/Form/Extension/DependencyInjection/DependencyInjectionExtension.php";a:4:{s:6:"md5sum";s:32:"7284275881ceb92b987717feedba8057";s:4:"name";s:85:"Symfony/Component/Form/Extension/DependencyInjection/DependencyInjectionExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DependencyInjection/DependencyInjectionExtension.php";}s:85:"Symfony/Component/Form/Extension/HttpFoundation/EventListener/BindRequestListener.php";a:4:{s:6:"md5sum";s:32:"6a452e346dc11c0a574bc2fbea9be01c";s:4:"name";s:85:"Symfony/Component/Form/Extension/HttpFoundation/EventListener/BindRequestListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/HttpFoundation/EventListener/BindRequestListener.php";}s:75:"Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationExtension.php";a:4:{s:6:"md5sum";s:32:"bd10d86a58c151a1d8d2e072dc379389";s:4:"name";s:75:"Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationExtension.php";}s:80:"Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php";a:4:{s:6:"md5sum";s:32:"1a1be6feca390ce87d232e08008b4059";s:4:"name";s:80:"Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php";}s:88:"Symfony/Component/Form/Extension/HttpFoundation/Type/FormTypeHttpFoundationExtension.php";a:4:{s:6:"md5sum";s:32:"1cbed6494abb39f8a2731ff28bfc3b4f";s:4:"name";s:88:"Symfony/Component/Form/Extension/HttpFoundation/Type/FormTypeHttpFoundationExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/HttpFoundation/Type/FormTypeHttpFoundationExtension.php";}s:67:"Symfony/Component/Form/Extension/Templating/TemplatingExtension.php";a:4:{s:6:"md5sum";s:32:"c2ab352ab8da8a95d82c561e8d014708";s:4:"name";s:67:"Symfony/Component/Form/Extension/Templating/TemplatingExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Templating/TemplatingExtension.php";}s:72:"Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php";a:4:{s:6:"md5sum";s:32:"9b88d4aa06ab3e8e0f4882d2790814fc";s:4:"name";s:72:"Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php";}s:63:"Symfony/Component/Form/Extension/Validator/Constraints/Form.php";a:4:{s:6:"md5sum";s:32:"0024bfd2c88595778a825805a64dad44";s:4:"name";s:63:"Symfony/Component/Form/Extension/Validator/Constraints/Form.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/Constraints/Form.php";}s:72:"Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php";a:4:{s:6:"md5sum";s:32:"7c71a0cb31da31a0222bdab4b7b926c7";s:4:"name";s:72:"Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php";}s:79:"Symfony/Component/Form/Extension/Validator/EventListener/ValidationListener.php";a:4:{s:6:"md5sum";s:32:"26384c9335607d3a7a760ce64268a5d1";s:4:"name";s:79:"Symfony/Component/Form/Extension/Validator/EventListener/ValidationListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/EventListener/ValidationListener.php";}s:74:"Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php";a:4:{s:6:"md5sum";s:32:"cbb86a1f46d4153ee8b6dcec13f3e3b3";s:4:"name";s:74:"Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php";}s:78:"Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php";a:4:{s:6:"md5sum";s:32:"df9d49f2923e93c8a989badebd46d72b";s:4:"name";s:78:"Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php";}s:82:"Symfony/Component/Form/Extension/Validator/Type/RepeatedTypeValidatorExtension.php";a:4:{s:6:"md5sum";s:32:"3ee7f3c2ca05510b1e6f5ea736de843d";s:4:"name";s:82:"Symfony/Component/Form/Extension/Validator/Type/RepeatedTypeValidatorExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/Type/RepeatedTypeValidatorExtension.php";}s:80:"Symfony/Component/Form/Extension/Validator/Type/SubmitTypeValidatorExtension.php";a:4:{s:6:"md5sum";s:32:"ec1709e56bdc7ba193f1d204a1645348";s:4:"name";s:80:"Symfony/Component/Form/Extension/Validator/Type/SubmitTypeValidatorExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/Type/SubmitTypeValidatorExtension.php";}s:64:"Symfony/Component/Form/Extension/Validator/Util/ServerParams.php";a:4:{s:6:"md5sum";s:32:"6c0183dc4aa13461ba80a4b13bb6af0c";s:4:"name";s:64:"Symfony/Component/Form/Extension/Validator/Util/ServerParams.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/Util/ServerParams.php";}s:65:"Symfony/Component/Form/Extension/Validator/ValidatorExtension.php";a:4:{s:6:"md5sum";s:32:"29479a50cbaa64713f9746a047bffd00";s:4:"name";s:65:"Symfony/Component/Form/Extension/Validator/ValidatorExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/ValidatorExtension.php";}s:67:"Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php";a:4:{s:6:"md5sum";s:32:"7c15728df791933679ae099b2dc013ce";s:4:"name";s:67:"Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php";}s:74:"Symfony/Component/Form/Extension/Validator/ViolationMapper/MappingRule.php";a:4:{s:6:"md5sum";s:32:"accd5b53d71708b247e3f8c6060b8441";s:4:"name";s:74:"Symfony/Component/Form/Extension/Validator/ViolationMapper/MappingRule.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/ViolationMapper/MappingRule.php";}s:75:"Symfony/Component/Form/Extension/Validator/ViolationMapper/RelativePath.php";a:4:{s:6:"md5sum";s:32:"da806398ec8fc4c452e1eadda5c74a68";s:4:"name";s:75:"Symfony/Component/Form/Extension/Validator/ViolationMapper/RelativePath.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/ViolationMapper/RelativePath.php";}s:78:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php";a:4:{s:6:"md5sum";s:32:"61357f9417507d405f7fb1fb659b31d2";s:4:"name";s:78:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php";}s:87:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapperInterface.php";a:4:{s:6:"md5sum";s:32:"10303cd4370ce781654acabee5f88bab";s:4:"name";s:87:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapperInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapperInterface.php";}s:76:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPath.php";a:4:{s:6:"md5sum";s:32:"ccc9fe0cfc8d2d1f0daabc141e920038";s:4:"name";s:76:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPath.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPath.php";}s:84:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPathIterator.php";a:4:{s:6:"md5sum";s:32:"c66988f503a7a69b3332463374596ba3";s:4:"name";s:84:"Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPathIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPathIterator.php";}s:31:"Symfony/Component/Form/Form.php";a:4:{s:6:"md5sum";s:32:"563c1163b71c3c482d91bf4877746632";s:4:"name";s:31:"Symfony/Component/Form/Form.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Form.php";}s:38:"Symfony/Component/Form/FormBuilder.php";a:4:{s:6:"md5sum";s:32:"cca285ed5e381d817d56181ec219df0d";s:4:"name";s:38:"Symfony/Component/Form/FormBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormBuilder.php";}s:47:"Symfony/Component/Form/FormBuilderInterface.php";a:4:{s:6:"md5sum";s:32:"9b5471bc4369497cf6ffd6e159a023ec";s:4:"name";s:47:"Symfony/Component/Form/FormBuilderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormBuilderInterface.php";}s:44:"Symfony/Component/Form/FormConfigBuilder.php";a:4:{s:6:"md5sum";s:32:"f478ae74fe1813693e1ba4e969d62410";s:4:"name";s:44:"Symfony/Component/Form/FormConfigBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormConfigBuilder.php";}s:53:"Symfony/Component/Form/FormConfigBuilderInterface.php";a:4:{s:6:"md5sum";s:32:"6a46ac7e9313965ec6b1b95328f346a0";s:4:"name";s:53:"Symfony/Component/Form/FormConfigBuilderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormConfigBuilderInterface.php";}s:46:"Symfony/Component/Form/FormConfigInterface.php";a:4:{s:6:"md5sum";s:32:"0b0436e232cf7100a1ed02dc299cf7a2";s:4:"name";s:46:"Symfony/Component/Form/FormConfigInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormConfigInterface.php";}s:36:"Symfony/Component/Form/FormError.php";a:4:{s:6:"md5sum";s:32:"d77ce9907675beaf81a3065d1ecfd69c";s:4:"name";s:36:"Symfony/Component/Form/FormError.php";s:4:"role";s:3:"php";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormError.php";}s:36:"Symfony/Component/Form/FormEvent.php";a:4:{s:6:"md5sum";s:32:"99268e4eaad4680f7e037cc00b31b370";s:4:"name";s:36:"Symfony/Component/Form/FormEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormEvent.php";}s:37:"Symfony/Component/Form/FormEvents.php";a:4:{s:6:"md5sum";s:32:"e6d2f1d5c2986877bb25ed96014d3495";s:4:"name";s:37:"Symfony/Component/Form/FormEvents.php";s:4:"role";s:3:"php";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormEvents.php";}s:49:"Symfony/Component/Form/FormExtensionInterface.php";a:4:{s:6:"md5sum";s:32:"396ae86cdd76d116832ba1f3b1ac5b73";s:4:"name";s:49:"Symfony/Component/Form/FormExtensionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormExtensionInterface.php";}s:38:"Symfony/Component/Form/FormFactory.php";a:4:{s:6:"md5sum";s:32:"014013a6a76da3c380b12e79fd5895e5";s:4:"name";s:38:"Symfony/Component/Form/FormFactory.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormFactory.php";}s:45:"Symfony/Component/Form/FormFactoryBuilder.php";a:4:{s:6:"md5sum";s:32:"b3f8c61b5ff170f0982a10bfa3f449ad";s:4:"name";s:45:"Symfony/Component/Form/FormFactoryBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormFactoryBuilder.php";}s:54:"Symfony/Component/Form/FormFactoryBuilderInterface.php";a:4:{s:6:"md5sum";s:32:"1b58cdcfa7fe5eb921b37c73a4cc8ead";s:4:"name";s:54:"Symfony/Component/Form/FormFactoryBuilderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormFactoryBuilderInterface.php";}s:47:"Symfony/Component/Form/FormFactoryInterface.php";a:4:{s:6:"md5sum";s:32:"8f8a65e4ffe1ee2ac9165f41ff0defc0";s:4:"name";s:47:"Symfony/Component/Form/FormFactoryInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormFactoryInterface.php";}s:40:"Symfony/Component/Form/FormInterface.php";a:4:{s:6:"md5sum";s:32:"bd326b430aabb6ae67bfdd63ac3a0cff";s:4:"name";s:40:"Symfony/Component/Form/FormInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormInterface.php";}s:39:"Symfony/Component/Form/FormRegistry.php";a:4:{s:6:"md5sum";s:32:"c017bb0aca3d2dc54133014309b994ca";s:4:"name";s:39:"Symfony/Component/Form/FormRegistry.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormRegistry.php";}s:48:"Symfony/Component/Form/FormRegistryInterface.php";a:4:{s:6:"md5sum";s:32:"ea9fc8c340f5d63126abf4741716bf0a";s:4:"name";s:48:"Symfony/Component/Form/FormRegistryInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormRegistryInterface.php";}s:39:"Symfony/Component/Form/FormRenderer.php";a:4:{s:6:"md5sum";s:32:"eed8b18f01216d190cf317392856361d";s:4:"name";s:39:"Symfony/Component/Form/FormRenderer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormRenderer.php";}s:54:"Symfony/Component/Form/FormRendererEngineInterface.php";a:4:{s:6:"md5sum";s:32:"4a12fb78c610af0b5f391e272fcb458b";s:4:"name";s:54:"Symfony/Component/Form/FormRendererEngineInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormRendererEngineInterface.php";}s:48:"Symfony/Component/Form/FormRendererInterface.php";a:4:{s:6:"md5sum";s:32:"514aae640601bd2af792d2f280ad1d19";s:4:"name";s:48:"Symfony/Component/Form/FormRendererInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormRendererInterface.php";}s:32:"Symfony/Component/Form/Forms.php";a:4:{s:6:"md5sum";s:32:"9f253cdb5bd655feaa2ba9387c6cf0ad";s:4:"name";s:32:"Symfony/Component/Form/Forms.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Forms.php";}s:53:"Symfony/Component/Form/FormTypeExtensionInterface.php";a:4:{s:6:"md5sum";s:32:"76847e41a7fc0945726fd7b00ddd9540";s:4:"name";s:53:"Symfony/Component/Form/FormTypeExtensionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormTypeExtensionInterface.php";}s:47:"Symfony/Component/Form/FormTypeGuesserChain.php";a:4:{s:6:"md5sum";s:32:"d5097ac9bb6503026cda5c54c7106965";s:4:"name";s:47:"Symfony/Component/Form/FormTypeGuesserChain.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormTypeGuesserChain.php";}s:51:"Symfony/Component/Form/FormTypeGuesserInterface.php";a:4:{s:6:"md5sum";s:32:"0fb144de45b5135b11815452309bc75f";s:4:"name";s:51:"Symfony/Component/Form/FormTypeGuesserInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormTypeGuesserInterface.php";}s:44:"Symfony/Component/Form/FormTypeInterface.php";a:4:{s:6:"md5sum";s:32:"bbab1badee901017917edff90e58f2c1";s:4:"name";s:44:"Symfony/Component/Form/FormTypeInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormTypeInterface.php";}s:35:"Symfony/Component/Form/FormView.php";a:4:{s:6:"md5sum";s:32:"68bdf09c1c46788c5e90ada37f78d540";s:4:"name";s:35:"Symfony/Component/Form/FormView.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/FormView.php";}s:38:"Symfony/Component/Form/Guess/Guess.php";a:4:{s:6:"md5sum";s:32:"7003fc846b738bbd923fa5656e22d95b";s:4:"name";s:38:"Symfony/Component/Form/Guess/Guess.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Guess/Guess.php";}s:42:"Symfony/Component/Form/Guess/TypeGuess.php";a:4:{s:6:"md5sum";s:32:"0fedff65f9ab6dfc490a9b469192b0a6";s:4:"name";s:42:"Symfony/Component/Form/Guess/TypeGuess.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Guess/TypeGuess.php";}s:43:"Symfony/Component/Form/Guess/ValueGuess.php";a:4:{s:6:"md5sum";s:32:"fc080890a68c7a2e9f145556cfa0b6d3";s:4:"name";s:43:"Symfony/Component/Form/Guess/ValueGuess.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Guess/ValueGuess.php";}s:30:"Symfony/Component/Form/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:30:"Symfony/Component/Form/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/doc/pear/Form/Symfony/Component/Form/LICENSE";}s:47:"Symfony/Component/Form/NativeRequestHandler.php";a:4:{s:6:"md5sum";s:32:"165b5d30323c31b5a70be0d4ed584fde";s:4:"name";s:47:"Symfony/Component/Form/NativeRequestHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/NativeRequestHandler.php";}s:39:"Symfony/Component/Form/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"66ef84fb360f766ab10567f114268e0f";s:4:"name";s:39:"Symfony/Component/Form/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/phpunit.xml.dist";}s:45:"Symfony/Component/Form/PreloadedExtension.php";a:4:{s:6:"md5sum";s:32:"ab4eca434dd1f8ac7df3666e1ed1b7df";s:4:"name";s:45:"Symfony/Component/Form/PreloadedExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/PreloadedExtension.php";}s:32:"Symfony/Component/Form/README.md";a:4:{s:6:"md5sum";s:32:"ebe5a2b970601e8bd9149d2c8dd1d3d1";s:4:"name";s:32:"Symfony/Component/Form/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/doc/pear/Form/Symfony/Component/Form/README.md";}s:50:"Symfony/Component/Form/RequestHandlerInterface.php";a:4:{s:6:"md5sum";s:32:"e16c038acbd7b2c01bcb48c7f40e728d";s:4:"name";s:50:"Symfony/Component/Form/RequestHandlerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/RequestHandlerInterface.php";}s:43:"Symfony/Component/Form/ResolvedFormType.php";a:4:{s:6:"md5sum";s:32:"0a3c5437610d92506335292ad7b6abf9";s:4:"name";s:43:"Symfony/Component/Form/ResolvedFormType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/ResolvedFormType.php";}s:50:"Symfony/Component/Form/ResolvedFormTypeFactory.php";a:4:{s:6:"md5sum";s:32:"5d25fc04121ed5f6e428165f5936c10f";s:4:"name";s:50:"Symfony/Component/Form/ResolvedFormTypeFactory.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/ResolvedFormTypeFactory.php";}s:59:"Symfony/Component/Form/ResolvedFormTypeFactoryInterface.php";a:4:{s:6:"md5sum";s:32:"fa408445a6fab81659c0cefed09bf3df";s:4:"name";s:59:"Symfony/Component/Form/ResolvedFormTypeFactoryInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/ResolvedFormTypeFactoryInterface.php";}s:52:"Symfony/Component/Form/ResolvedFormTypeInterface.php";a:4:{s:6:"md5sum";s:32:"b8c1edc5a2b254bdde6476893b156950";s:4:"name";s:52:"Symfony/Component/Form/ResolvedFormTypeInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/ResolvedFormTypeInterface.php";}s:54:"Symfony/Component/Form/Resources/config/validation.xml";a:4:{s:6:"md5sum";s:32:"256dafb4fae5e462d55a71ab388c0691";s:4:"name";s:54:"Symfony/Component/Form/Resources/config/validation.xml";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/config/validation.xml";}s:63:"Symfony/Component/Form/Resources/translations/validators.ar.xlf";a:4:{s:6:"md5sum";s:32:"e0ad0b923b6ac791b49b9a4d33af7a25";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.ar.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.ar.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.bg.xlf";a:4:{s:6:"md5sum";s:32:"1d5e19ca06d1aa8293b5887092685e05";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.bg.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.bg.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.ca.xlf";a:4:{s:6:"md5sum";s:32:"c7ad1d90ad05603286ab378d72608d01";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.ca.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.ca.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.cs.xlf";a:4:{s:6:"md5sum";s:32:"2b0bed4fc587230bd11e83b7bbe29339";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.cs.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.cs.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.da.xlf";a:4:{s:6:"md5sum";s:32:"e46f7c3da02bcd4fa8c379469310c217";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.da.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.da.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.de.xlf";a:4:{s:6:"md5sum";s:32:"921a3c43eb6bf008f7d4ae7d2e56233f";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.de.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.de.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.el.xlf";a:4:{s:6:"md5sum";s:32:"a7470225a9c04a5c2b5f179d8060c38b";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.el.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.el.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.en.xlf";a:4:{s:6:"md5sum";s:32:"8f7759249199e5589331c432c54c9197";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.en.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.en.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.es.xlf";a:4:{s:6:"md5sum";s:32:"b086ea186d7babe85d8bfa78957acea4";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.es.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.es.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.et.xlf";a:4:{s:6:"md5sum";s:32:"f81867f4f9fd2362db42befa9628c103";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.et.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.et.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.eu.xlf";a:4:{s:6:"md5sum";s:32:"0ae3f2a05c0e69cc63ef84384913a4fe";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.eu.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.eu.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.fa.xlf";a:4:{s:6:"md5sum";s:32:"321b2f3f5ac56ff0c81871b44fe369bd";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.fa.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.fa.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.fi.xlf";a:4:{s:6:"md5sum";s:32:"8cbad436ab4b1d574690992f15e37397";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.fi.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.fi.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.fr.xlf";a:4:{s:6:"md5sum";s:32:"8bfa3368c7beefedc897f3098744e5dd";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.fr.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.fr.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.gl.xlf";a:4:{s:6:"md5sum";s:32:"b21174a0425a56615ac95065c4cd4f8f";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.gl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.gl.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.he.xlf";a:4:{s:6:"md5sum";s:32:"f03c3342827959500fe8bca223400225";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.he.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.he.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.hr.xlf";a:4:{s:6:"md5sum";s:32:"3b87096c3cc16d9580d15fe9a9ca4d70";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.hr.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.hr.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.hu.xlf";a:4:{s:6:"md5sum";s:32:"c538c1a55b060abb01cc1795a650ff36";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.hu.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.hu.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.hy.xlf";a:4:{s:6:"md5sum";s:32:"d7f271b6e610fa47ae614cd9d92f7c02";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.hy.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.hy.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.id.xlf";a:4:{s:6:"md5sum";s:32:"313e2438c2476b78ab637cd9dcd5322d";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.id.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.id.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.it.xlf";a:4:{s:6:"md5sum";s:32:"3fa13f3254812a6857a99351cf6003d8";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.it.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.it.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.ja.xlf";a:4:{s:6:"md5sum";s:32:"3f47d2db87b7262c21c8287472719479";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.ja.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.ja.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.lb.xlf";a:4:{s:6:"md5sum";s:32:"f25583830baaccc529f6b4f0a845bd61";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.lb.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.lb.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.lt.xlf";a:4:{s:6:"md5sum";s:32:"4ef7ab23ce55458844742317d905fa59";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.lt.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.lt.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.lv.xlf";a:4:{s:6:"md5sum";s:32:"1cc55c8d2fb6eb1583b2d2cdfd54152e";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.lv.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.lv.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.mn.xlf";a:4:{s:6:"md5sum";s:32:"4429ebdbb00601c0c67f43a06c4e8031";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.mn.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.mn.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.nb.xlf";a:4:{s:6:"md5sum";s:32:"017afa511ee2a18bddbbac0640cdb685";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.nb.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.nb.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.nl.xlf";a:4:{s:6:"md5sum";s:32:"94858839db1d8f8324759bf5e87c129d";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.nl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.nl.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.pl.xlf";a:4:{s:6:"md5sum";s:32:"c72a6e8c5c9dc76b0a9ceb275486acb3";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.pl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.pl.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.pt.xlf";a:4:{s:6:"md5sum";s:32:"bfda187791c843558b3bcc5327064e43";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.pt.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.pt.xlf";}s:66:"Symfony/Component/Form/Resources/translations/validators.pt_BR.xlf";a:4:{s:6:"md5sum";s:32:"7cb1b50669945643c707acee4b13cf31";s:4:"name";s:66:"Symfony/Component/Form/Resources/translations/validators.pt_BR.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.pt_BR.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.ro.xlf";a:4:{s:6:"md5sum";s:32:"f2eaf2e4ba82e742cb6dff54c69f1271";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.ro.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.ro.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.ru.xlf";a:4:{s:6:"md5sum";s:32:"6cbccc04ebb3a58158041e451c3bc536";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.ru.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.ru.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.sk.xlf";a:4:{s:6:"md5sum";s:32:"d2e6bd911ddff3c7b526755179cf6ed9";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.sk.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.sk.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.sl.xlf";a:4:{s:6:"md5sum";s:32:"cc42fc67ec1729fe317cd3b1c3b96dd6";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.sl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.sl.xlf";}s:68:"Symfony/Component/Form/Resources/translations/validators.sr_Cyrl.xlf";a:4:{s:6:"md5sum";s:32:"20e303068da12f5f5248ace8162051ad";s:4:"name";s:68:"Symfony/Component/Form/Resources/translations/validators.sr_Cyrl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.sr_Cyrl.xlf";}s:68:"Symfony/Component/Form/Resources/translations/validators.sr_Latn.xlf";a:4:{s:6:"md5sum";s:32:"bdf4d302afd0b1b1b406009402b44f7d";s:4:"name";s:68:"Symfony/Component/Form/Resources/translations/validators.sr_Latn.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.sr_Latn.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.sv.xlf";a:4:{s:6:"md5sum";s:32:"642c23a8173bfd547a71b69a694195f0";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.sv.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.sv.xlf";}s:63:"Symfony/Component/Form/Resources/translations/validators.uk.xlf";a:4:{s:6:"md5sum";s:32:"6c03831d89108e565c8358f46d807e32";s:4:"name";s:63:"Symfony/Component/Form/Resources/translations/validators.uk.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.uk.xlf";}s:66:"Symfony/Component/Form/Resources/translations/validators.zh_CN.xlf";a:4:{s:6:"md5sum";s:32:"96cbd8686b821bd2cf91839a6c26cc03";s:4:"name";s:66:"Symfony/Component/Form/Resources/translations/validators.zh_CN.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations/validators.zh_CN.xlf";}s:46:"Symfony/Component/Form/ReversedTransformer.php";a:4:{s:6:"md5sum";s:32:"658dff714ce275350a7f720a86484e55";s:4:"name";s:46:"Symfony/Component/Form/ReversedTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/ReversedTransformer.php";}s:39:"Symfony/Component/Form/SubmitButton.php";a:4:{s:6:"md5sum";s:32:"3fb340157282afcc9223daeab2aeb49f";s:4:"name";s:39:"Symfony/Component/Form/SubmitButton.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/SubmitButton.php";}s:46:"Symfony/Component/Form/SubmitButtonBuilder.php";a:4:{s:6:"md5sum";s:32:"09ee4f0e6ffe3b36ab57c806045f69d3";s:4:"name";s:46:"Symfony/Component/Form/SubmitButtonBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/SubmitButtonBuilder.php";}s:52:"Symfony/Component/Form/SubmitButtonTypeInterface.php";a:4:{s:6:"md5sum";s:32:"721a1bd36d3a0cd93e5c57956435f861";s:4:"name";s:52:"Symfony/Component/Form/SubmitButtonTypeInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/SubmitButtonTypeInterface.php";}s:55:"Symfony/Component/Form/Test/DeprecationErrorHandler.php";a:4:{s:6:"md5sum";s:32:"70d8401563ddaeefe2982c73218d9a41";s:4:"name";s:55:"Symfony/Component/Form/Test/DeprecationErrorHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Test/DeprecationErrorHandler.php";}s:52:"Symfony/Component/Form/Test/FormBuilderInterface.php";a:4:{s:6:"md5sum";s:32:"1847328f5ba757c0997121ed38fe9d61";s:4:"name";s:52:"Symfony/Component/Form/Test/FormBuilderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Test/FormBuilderInterface.php";}s:55:"Symfony/Component/Form/Test/FormIntegrationTestCase.php";a:4:{s:6:"md5sum";s:32:"8dc56ae07547e6e8a521cb9d68ff7499";s:4:"name";s:55:"Symfony/Component/Form/Test/FormIntegrationTestCase.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Test/FormIntegrationTestCase.php";}s:45:"Symfony/Component/Form/Test/FormInterface.php";a:4:{s:6:"md5sum";s:32:"ba89cda1179d1dbc7ae395c4f165f458";s:4:"name";s:45:"Symfony/Component/Form/Test/FormInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Test/FormInterface.php";}s:55:"Symfony/Component/Form/Test/FormPerformanceTestCase.php";a:4:{s:6:"md5sum";s:32:"f8d472cfeb2fb094a9fed0a0e31e5900";s:4:"name";s:55:"Symfony/Component/Form/Test/FormPerformanceTestCase.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Test/FormPerformanceTestCase.php";}s:44:"Symfony/Component/Form/Test/TypeTestCase.php";a:4:{s:6:"md5sum";s:32:"a14b6e8fcfd683fcf7498f9a02da523d";s:4:"name";s:44:"Symfony/Component/Form/Test/TypeTestCase.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Test/TypeTestCase.php";}s:54:"Symfony/Component/Form/Tests/AbstractDivLayoutTest.php";a:4:{s:6:"md5sum";s:32:"01e6c9a75c6347c2c215d6a15b0c79d5";s:4:"name";s:54:"Symfony/Component/Form/Tests/AbstractDivLayoutTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php";}s:54:"Symfony/Component/Form/Tests/AbstractExtensionTest.php";a:4:{s:6:"md5sum";s:32:"993f833ed9fb277ec6f3a74a773d92ae";s:4:"name";s:54:"Symfony/Component/Form/Tests/AbstractExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/AbstractExtensionTest.php";}s:49:"Symfony/Component/Form/Tests/AbstractFormTest.php";a:4:{s:6:"md5sum";s:32:"25108525cdb98b2c542d79ef69a08970";s:4:"name";s:49:"Symfony/Component/Form/Tests/AbstractFormTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/AbstractFormTest.php";}s:51:"Symfony/Component/Form/Tests/AbstractLayoutTest.php";a:4:{s:6:"md5sum";s:32:"5def14944ef79b573b5bd008ab84ca4b";s:4:"name";s:51:"Symfony/Component/Form/Tests/AbstractLayoutTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/AbstractLayoutTest.php";}s:59:"Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php";a:4:{s:6:"md5sum";s:32:"1e1eaca7aca8b88c93cd99d5d934dc12";s:4:"name";s:59:"Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php";}s:56:"Symfony/Component/Form/Tests/AbstractTableLayoutTest.php";a:4:{s:6:"md5sum";s:32:"f18c692af6dbc9682b8fbfae88d5909c";s:4:"name";s:56:"Symfony/Component/Form/Tests/AbstractTableLayoutTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/AbstractTableLayoutTest.php";}s:60:"Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php";a:4:{s:6:"md5sum";s:32:"487f6d057728873fdbda43c763ad9a3c";s:4:"name";s:60:"Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php";}s:49:"Symfony/Component/Form/Tests/CompoundFormTest.php";a:4:{s:6:"md5sum";s:32:"3e01bd80c478bfef4e94cce5b05b810f";s:4:"name";s:49:"Symfony/Component/Form/Tests/CompoundFormTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/CompoundFormTest.php";}s:81:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/AbstractChoiceListTest.php";a:4:{s:6:"md5sum";s:32:"805f66672b74f69ef369360000ce28d7";s:4:"name";s:81:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/AbstractChoiceListTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/AbstractChoiceListTest.php";}s:73:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ChoiceListTest.php";a:4:{s:6:"md5sum";s:32:"0eb2d36957cb3f06b8246cf4d62845e6";s:4:"name";s:73:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ChoiceListTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ChoiceListTest.php";}s:77:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/LazyChoiceListTest.php";a:4:{s:6:"md5sum";s:32:"4fe2229f0a5ccdfed66591f926d1408a";s:4:"name";s:77:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/LazyChoiceListTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/LazyChoiceListTest.php";}s:79:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ObjectChoiceListTest.php";a:4:{s:6:"md5sum";s:32:"9438557f7e55048a10c0da6dc9b5b7d5";s:4:"name";s:79:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ObjectChoiceListTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ObjectChoiceListTest.php";}s:79:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleChoiceListTest.php";a:4:{s:6:"md5sum";s:32:"c887b01a87b147202efc194dd37f5654";s:4:"name";s:79:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleChoiceListTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleChoiceListTest.php";}s:86:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleNumericChoiceListTest.php";a:4:{s:6:"md5sum";s:32:"de020dd5c1bfe761abc83eb0d407b93b";s:4:"name";s:86:"Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleNumericChoiceListTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleNumericChoiceListTest.php";}s:81:"Symfony/Component/Form/Tests/Extension/Core/DataMapper/PropertyPathMapperTest.php";a:4:{s:6:"md5sum";s:32:"9b3671899963fbd7e534be6a316b9f7f";s:4:"name";s:81:"Symfony/Component/Form/Tests/Extension/Core/DataMapper/PropertyPathMapperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataMapper/PropertyPathMapperTest.php";}s:91:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ArrayToPartsTransformerTest.php";a:4:{s:6:"md5sum";s:32:"fe5c56d887d5e3c625a29d58f19f14b2";s:4:"name";s:91:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ArrayToPartsTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:131:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ArrayToPartsTransformerTest.php";}s:91:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BaseDateTimeTransformerTest.php";a:4:{s:6:"md5sum";s:32:"1f0f17c4989a4bf7e663524addd19377";s:4:"name";s:91:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BaseDateTimeTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:131:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BaseDateTimeTransformerTest.php";}s:94:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BooleanToStringTransformerTest.php";a:4:{s:6:"md5sum";s:32:"2656ea40e07d5722e5afae535a14c6f2";s:4:"name";s:94:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BooleanToStringTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BooleanToStringTransformerTest.php";}s:94:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoicesToValuesTransformerTest.php";a:4:{s:6:"md5sum";s:32:"f10f920c63a846fee23f895f6519b30c";s:4:"name";s:94:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoicesToValuesTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoicesToValuesTransformerTest.php";}s:92:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoiceToValueTransformerTest.php";a:4:{s:6:"md5sum";s:32:"81b526febe066ae1212cf792e057a858";s:4:"name";s:92:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoiceToValueTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:132:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoiceToValueTransformerTest.php";}s:88:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DataTransformerChainTest.php";a:4:{s:6:"md5sum";s:32:"d391c39a885af56bbe963d2884ce1581";s:4:"name";s:88:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DataTransformerChainTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DataTransformerChainTest.php";}s:80:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeTestCase.php";a:4:{s:6:"md5sum";s:32:"2a0a01ad1cc0ede0f9a9610be868290e";s:4:"name";s:80:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeTestCase.php";}s:94:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php";a:4:{s:6:"md5sum";s:32:"c333df3e9adfbd0151953a318603b358";s:4:"name";s:94:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php";}s:104:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php";a:4:{s:6:"md5sum";s:32:"cff66917b58654868071c9ee011e36fa";s:4:"name";s:104:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:144:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php";}s:96:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php";a:4:{s:6:"md5sum";s:32:"ca35365fd4c7e312165063c8754a9545";s:4:"name";s:96:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php";}s:95:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php";a:4:{s:6:"md5sum";s:32:"eccc79ef623e695d17510a7c1537a88d";s:4:"name";s:95:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php";}s:98:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToTimestampTransformerTest.php";a:4:{s:6:"md5sum";s:32:"e5ee536591d17b7bfe89945a498724ec";s:4:"name";s:98:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToTimestampTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:138:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToTimestampTransformerTest.php";}s:103:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformerTest.php";a:4:{s:6:"md5sum";s:32:"0eac0ca2189eaf93a9fdaa18c2bfce45";s:4:"name";s:103:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:143:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformerTest.php";}s:101:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformerTest.php";a:4:{s:6:"md5sum";s:32:"74344e0d818fb775d511fea0ee331e96";s:4:"name";s:101:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:141:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformerTest.php";}s:102:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php";a:4:{s:6:"md5sum";s:32:"c7f0520009e30903c4b681d8038d1116";s:4:"name";s:102:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:142:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php";}s:103:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php";a:4:{s:6:"md5sum";s:32:"3f3ac246acda56e18c45ede2ad738de5";s:4:"name";s:103:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:143:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php";}s:96:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ValueToDuplicatesTransformerTest.php";a:4:{s:6:"md5sum";s:32:"340da808904f9f817f6bb74c6d1d1bae";s:4:"name";s:96:"Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ValueToDuplicatesTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ValueToDuplicatesTransformerTest.php";}s:87:"Symfony/Component/Form/Tests/Extension/Core/EventListener/FixRadioInputListenerTest.php";a:4:{s:6:"md5sum";s:32:"47864719339897429512947960cec29e";s:4:"name";s:87:"Symfony/Component/Form/Tests/Extension/Core/EventListener/FixRadioInputListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/FixRadioInputListenerTest.php";}s:77:"Symfony/Component/Form/Tests/Extension/Core/EventListener/Fixtures/randomhash";a:4:{s:6:"md5sum";s:32:"87aec5a94c94ec7a5dd1c0839eb0182b";s:4:"name";s:77:"Symfony/Component/Form/Tests/Extension/Core/EventListener/Fixtures/randomhash";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/Fixtures/randomhash";}s:88:"Symfony/Component/Form/Tests/Extension/Core/EventListener/FixUrlProtocolListenerTest.php";a:4:{s:6:"md5sum";s:32:"6cb15bfda3938a694ba12e947582ee1c";s:4:"name";s:88:"Symfony/Component/Form/Tests/Extension/Core/EventListener/FixUrlProtocolListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/FixUrlProtocolListenerTest.php";}s:100:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayObjectTest.php";a:4:{s:6:"md5sum";s:32:"e0bc897a2bcb5584079604cd7a932c4a";s:4:"name";s:100:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayObjectTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:140:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayObjectTest.php";}s:94:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayTest.php";a:4:{s:6:"md5sum";s:32:"541c2ff8d9b47ce17ab79a9f5c7da315";s:4:"name";s:94:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayTest.php";}s:106:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerCustomArrayObjectTest.php";a:4:{s:6:"md5sum";s:32:"3b4d97e836cfe76c4b348b38ef0d3199";s:4:"name";s:106:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerCustomArrayObjectTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:146:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerCustomArrayObjectTest.php";}s:89:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerTest.php";a:4:{s:6:"md5sum";s:32:"6cb07a92e893ccd4ddf1f93592d0ea12";s:4:"name";s:89:"Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:129:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerTest.php";}s:84:"Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php";a:4:{s:6:"md5sum";s:32:"7726c3ab7d9e202ef7e50c6e18a0dc13";s:4:"name";s:84:"Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php";}s:78:"Symfony/Component/Form/Tests/Extension/Core/EventListener/TrimListenerTest.php";a:4:{s:6:"md5sum";s:32:"200a4cdc92f0b266f8b46b971fc5ec82";s:4:"name";s:78:"Symfony/Component/Form/Tests/Extension/Core/EventListener/TrimListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/TrimListenerTest.php";}s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php";a:4:{s:6:"md5sum";s:32:"d6a45bded973053fe2db03fce86a667f";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php";}s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php";a:4:{s:6:"md5sum";s:32:"040223464ae2179f3aa78e84fd7b8511";s:4:"name";s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php";}s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php";a:4:{s:6:"md5sum";s:32:"951887c57ca144e04ba2f2001fb12a5b";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php";}s:78:"Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypePerformanceTest.php";a:4:{s:6:"md5sum";s:32:"c435893620ce32c2bee017d4b0cb2157";s:4:"name";s:78:"Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypePerformanceTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypePerformanceTest.php";}s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php";a:4:{s:6:"md5sum";s:32:"9e18e82da0bbc8f4370d3f652ed8ad48";s:4:"name";s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php";}s:71:"Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php";a:4:{s:6:"md5sum";s:32:"643faa42c8a2cfc19880f78bc9d3bb83";s:4:"name";s:71:"Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php";}s:68:"Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php";a:4:{s:6:"md5sum";s:32:"196ba14f11fc05ed0a061a909d71b8cd";s:4:"name";s:68:"Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php";}s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php";a:4:{s:6:"md5sum";s:32:"e2b1c1525d0bf4cf02e807689138ec88";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php";}s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php";a:4:{s:6:"md5sum";s:32:"91b9362007d0d02d7b55852d49a226d2";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php";}s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php";a:4:{s:6:"md5sum";s:32:"42c8e0bc27d5102ce1b9f7d3807c436c";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php";}s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/FileTypeTest.php";a:4:{s:6:"md5sum";s:32:"1bad6779778649a56a6df8ba51ac2442";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/FileTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/FileTypeTest.php";}s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php";a:4:{s:6:"md5sum";s:32:"6384962d22490e2965944280e6da8dd3";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php";}s:68:"Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php";a:4:{s:6:"md5sum";s:32:"145ac554d44d2416c20efbc33490831b";s:4:"name";s:68:"Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php";}s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php";a:4:{s:6:"md5sum";s:32:"ae9dea4e2cd5149f1469249f0aabe2ac";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php";}s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php";a:4:{s:6:"md5sum";s:32:"b7946ff970129706743ad613161fd929";s:4:"name";s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php";}s:66:"Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php";a:4:{s:6:"md5sum";s:32:"6bfc500ee59b3c0e85c23e2a4007fc52";s:4:"name";s:66:"Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php";}s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php";a:4:{s:6:"md5sum";s:32:"e680b158e130d104e812bc59a594fa08";s:4:"name";s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php";}s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php";a:4:{s:6:"md5sum";s:32:"a683610fb85dd825d4141a4b3f528e46";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php";}s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.php";a:4:{s:6:"md5sum";s:32:"369245a8723921b895a4591ba34005eb";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.php";}s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/SubmitTypeTest.php";a:4:{s:6:"md5sum";s:32:"fe429eb590a75d6dd3a20bbf08d1e639";s:4:"name";s:67:"Symfony/Component/Form/Tests/Extension/Core/Type/SubmitTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/SubmitTypeTest.php";}s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php";a:4:{s:6:"md5sum";s:32:"1f837469d11ac48ff637e8fa08da7a44";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php";}s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php";a:4:{s:6:"md5sum";s:32:"1082d1f9f4683702300ce6a8be9c835b";s:4:"name";s:69:"Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php";}s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/TypeTestCase.php";a:4:{s:6:"md5sum";s:32:"e71b97847da4bbd7b694e2a7ea18c7b7";s:4:"name";s:65:"Symfony/Component/Form/Tests/Extension/Core/Type/TypeTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/TypeTestCase.php";}s:64:"Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php";a:4:{s:6:"md5sum";s:32:"1f33d8fa306ebdbad2cf4561557655ca";s:4:"name";s:64:"Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php";}s:84:"Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/DefaultCsrfProviderTest.php";a:4:{s:6:"md5sum";s:32:"d5607097da4e8ba843c7671fc95bd5ed";s:4:"name";s:84:"Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/DefaultCsrfProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/DefaultCsrfProviderTest.php";}s:84:"Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/SessionCsrfProviderTest.php";a:4:{s:6:"md5sum";s:32:"b01b266a7196ae1aaaf9b4d3d8f1f2ed";s:4:"name";s:84:"Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/SessionCsrfProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/SessionCsrfProviderTest.php";}s:88:"Symfony/Component/Form/Tests/Extension/Csrf/EventListener/CsrfValidationListenerTest.php";a:4:{s:6:"md5sum";s:32:"afcd45b858401261360a30c4cb0f9aba";s:4:"name";s:88:"Symfony/Component/Form/Tests/Extension/Csrf/EventListener/CsrfValidationListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/EventListener/CsrfValidationListenerTest.php";}s:78:"Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php";a:4:{s:6:"md5sum";s:32:"1ee5764d064d208a058c7719817c5935";s:4:"name";s:78:"Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php";}s:83:"Symfony/Component/Form/Tests/Extension/DataCollector/DataCollectorExtensionTest.php";a:4:{s:6:"md5sum";s:32:"e69912900a62a5bb4c69d9c37ed2952e";s:4:"name";s:83:"Symfony/Component/Form/Tests/Extension/DataCollector/DataCollectorExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/DataCollector/DataCollectorExtensionTest.php";}s:78:"Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php";a:4:{s:6:"md5sum";s:32:"deaf70e32c29e96b0a0f5de433b99dea";s:4:"name";s:78:"Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php";}s:78:"Symfony/Component/Form/Tests/Extension/DataCollector/FormDataExtractorTest.php";a:4:{s:6:"md5sum";s:32:"d12c0ee191323d8ad5e0926d2484ec59";s:4:"name";s:78:"Symfony/Component/Form/Tests/Extension/DataCollector/FormDataExtractorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataExtractorTest.php";}s:92:"Symfony/Component/Form/Tests/Extension/DataCollector/Type/DataCollectorTypeExtensionTest.php";a:4:{s:6:"md5sum";s:32:"d8948496dc0e6214e740ca00ca529e95";s:4:"name";s:92:"Symfony/Component/Form/Tests/Extension/DataCollector/Type/DataCollectorTypeExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:132:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/DataCollector/Type/DataCollectorTypeExtensionTest.php";}s:95:"Symfony/Component/Form/Tests/Extension/HttpFoundation/EventListener/BindRequestListenerTest.php";a:4:{s:6:"md5sum";s:32:"6e2cdd48baa66831a820c785cf96d440";s:4:"name";s:95:"Symfony/Component/Form/Tests/Extension/HttpFoundation/EventListener/BindRequestListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/HttpFoundation/EventListener/BindRequestListenerTest.php";}s:90:"Symfony/Component/Form/Tests/Extension/HttpFoundation/HttpFoundationRequestHandlerTest.php";a:4:{s:6:"md5sum";s:32:"b2e0f962d2654c7b7bfabeec6feffe3a";s:4:"name";s:90:"Symfony/Component/Form/Tests/Extension/HttpFoundation/HttpFoundationRequestHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/HttpFoundation/HttpFoundationRequestHandlerTest.php";}s:93:"Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorPerformanceTest.php";a:4:{s:6:"md5sum";s:32:"b843b76574f23418997cf5d299e1795d";s:4:"name";s:93:"Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorPerformanceTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:133:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorPerformanceTest.php";}s:82:"Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php";a:4:{s:6:"md5sum";s:32:"3956a614fe00f61b9df4abd22fb94c77";s:4:"name";s:82:"Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php";}s:89:"Symfony/Component/Form/Tests/Extension/Validator/EventListener/ValidationListenerTest.php";a:4:{s:6:"md5sum";s:32:"159b78c63cad4f5c62977766f6680a69";s:4:"name";s:89:"Symfony/Component/Form/Tests/Extension/Validator/EventListener/ValidationListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:129:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/EventListener/ValidationListenerTest.php";}s:84:"Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php";a:4:{s:6:"md5sum";s:32:"8ca1bca8a4d7d47e6d612d714c3e434d";s:4:"name";s:84:"Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php";}s:88:"Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php";a:4:{s:6:"md5sum";s:32:"68b380257c232e2600d07153905f0d5f";s:4:"name";s:88:"Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php";}s:90:"Symfony/Component/Form/Tests/Extension/Validator/Type/SubmitTypeValidatorExtensionTest.php";a:4:{s:6:"md5sum";s:32:"831836b41b079545f0670fe13ce7a212";s:4:"name";s:90:"Symfony/Component/Form/Tests/Extension/Validator/Type/SubmitTypeValidatorExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Type/SubmitTypeValidatorExtensionTest.php";}s:70:"Symfony/Component/Form/Tests/Extension/Validator/Type/TypeTestCase.php";a:4:{s:6:"md5sum";s:32:"49189d46e88a6d3d850c27b162c6e2ce";s:4:"name";s:70:"Symfony/Component/Form/Tests/Extension/Validator/Type/TypeTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Type/TypeTestCase.php";}s:74:"Symfony/Component/Form/Tests/Extension/Validator/Util/ServerParamsTest.php";a:4:{s:6:"md5sum";s:32:"d5cfc3ee82f42b842bc2d5c384142e5e";s:4:"name";s:74:"Symfony/Component/Form/Tests/Extension/Validator/Util/ServerParamsTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Util/ServerParamsTest.php";}s:77:"Symfony/Component/Form/Tests/Extension/Validator/ValidatorTypeGuesserTest.php";a:4:{s:6:"md5sum";s:32:"19620e0f5149427d9bc81ff43f3f6849";s:4:"name";s:77:"Symfony/Component/Form/Tests/Extension/Validator/ValidatorTypeGuesserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/ValidatorTypeGuesserTest.php";}s:88:"Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationMapperTest.php";a:4:{s:6:"md5sum";s:32:"87696746275168d808097b9ac08eefd1";s:4:"name";s:88:"Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationMapperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationMapperTest.php";}s:86:"Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationPathTest.php";a:4:{s:6:"md5sum";s:32:"4be55d217fa73d2f0c14537f75635e84";s:4:"name";s:86:"Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationPathTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationPathTest.php";}s:60:"Symfony/Component/Form/Tests/Fixtures/AlternatingRowType.php";a:4:{s:6:"md5sum";s:32:"aaeeaa8b993916866478b077e0ae5f7b";s:4:"name";s:60:"Symfony/Component/Form/Tests/Fixtures/AlternatingRowType.php";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/AlternatingRowType.php";}s:48:"Symfony/Component/Form/Tests/Fixtures/Author.php";a:4:{s:6:"md5sum";s:32:"5c1563a26ab06e4cc72c80d1b4aa75a4";s:4:"name";s:48:"Symfony/Component/Form/Tests/Fixtures/Author.php";s:4:"role";s:4:"test";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/Author.php";}s:52:"Symfony/Component/Form/Tests/Fixtures/AuthorType.php";a:4:{s:6:"md5sum";s:32:"68c706abf40680b1fad0aa7c383af085";s:4:"name";s:52:"Symfony/Component/Form/Tests/Fixtures/AuthorType.php";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/AuthorType.php";}s:59:"Symfony/Component/Form/Tests/Fixtures/CustomArrayObject.php";a:4:{s:6:"md5sum";s:32:"80f520948113200553ccb1415f481af3";s:4:"name";s:59:"Symfony/Component/Form/Tests/Fixtures/CustomArrayObject.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/CustomArrayObject.php";}s:62:"Symfony/Component/Form/Tests/Fixtures/FixedDataTransformer.php";a:4:{s:6:"md5sum";s:32:"21ddaf5472929f397a80781c71c5904e";s:4:"name";s:62:"Symfony/Component/Form/Tests/Fixtures/FixedDataTransformer.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/FixedDataTransformer.php";}s:61:"Symfony/Component/Form/Tests/Fixtures/FixedFilterListener.php";a:4:{s:6:"md5sum";s:32:"f2a8c5376aac3794f6ba81a263e4f2bf";s:4:"name";s:61:"Symfony/Component/Form/Tests/Fixtures/FixedFilterListener.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/FixedFilterListener.php";}s:41:"Symfony/Component/Form/Tests/Fixtures/foo";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:41:"Symfony/Component/Form/Tests/Fixtures/foo";s:4:"role";s:4:"test";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/foo";}s:52:"Symfony/Component/Form/Tests/Fixtures/FooSubType.php";a:4:{s:6:"md5sum";s:32:"412bb3f7b15954b7685df57c03cc9216";s:4:"name";s:52:"Symfony/Component/Form/Tests/Fixtures/FooSubType.php";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/FooSubType.php";}s:70:"Symfony/Component/Form/Tests/Fixtures/FooSubTypeWithParentInstance.php";a:4:{s:6:"md5sum";s:32:"31c9db4f9cbf24f98688538f63431553";s:4:"name";s:70:"Symfony/Component/Form/Tests/Fixtures/FooSubTypeWithParentInstance.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/FooSubTypeWithParentInstance.php";}s:49:"Symfony/Component/Form/Tests/Fixtures/FooType.php";a:4:{s:6:"md5sum";s:32:"56722f2c6ccf149b5009818e705b661d";s:4:"name";s:49:"Symfony/Component/Form/Tests/Fixtures/FooType.php";s:4:"role";s:4:"test";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/FooType.php";}s:61:"Symfony/Component/Form/Tests/Fixtures/FooTypeBarExtension.php";a:4:{s:6:"md5sum";s:32:"344219ab84242c7d151ff482ebbca70b";s:4:"name";s:61:"Symfony/Component/Form/Tests/Fixtures/FooTypeBarExtension.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/FooTypeBarExtension.php";}s:61:"Symfony/Component/Form/Tests/Fixtures/FooTypeBazExtension.php";a:4:{s:6:"md5sum";s:32:"8178239dc9236054e8df7a4cbf7d7888";s:4:"name";s:61:"Symfony/Component/Form/Tests/Fixtures/FooTypeBazExtension.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/FooTypeBazExtension.php";}s:55:"Symfony/Component/Form/Tests/Fixtures/TestExtension.php";a:4:{s:6:"md5sum";s:32:"e23c89ad471d8601a063b068cd6636ee";s:4:"name";s:55:"Symfony/Component/Form/Tests/Fixtures/TestExtension.php";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures/TestExtension.php";}s:48:"Symfony/Component/Form/Tests/FormBuilderTest.php";a:4:{s:6:"md5sum";s:32:"72d98919f7d17ed12b851b748b795913";s:4:"name";s:48:"Symfony/Component/Form/Tests/FormBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/FormBuilderTest.php";}s:47:"Symfony/Component/Form/Tests/FormConfigTest.php";a:4:{s:6:"md5sum";s:32:"0a53ef078ccdaf281872d03975b3f9c5";s:4:"name";s:47:"Symfony/Component/Form/Tests/FormConfigTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/FormConfigTest.php";}s:55:"Symfony/Component/Form/Tests/FormFactoryBuilderTest.php";a:4:{s:6:"md5sum";s:32:"4808f4d1f807a2bd730db77dc250ea3a";s:4:"name";s:55:"Symfony/Component/Form/Tests/FormFactoryBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/FormFactoryBuilderTest.php";}s:48:"Symfony/Component/Form/Tests/FormFactoryTest.php";a:4:{s:6:"md5sum";s:32:"148b1a32ce39b4536ce2cdabca226c8e";s:4:"name";s:48:"Symfony/Component/Form/Tests/FormFactoryTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/FormFactoryTest.php";}s:56:"Symfony/Component/Form/Tests/FormIntegrationTestCase.php";a:4:{s:6:"md5sum";s:32:"cba12233a71fa6ad78db42d0b0358123";s:4:"name";s:56:"Symfony/Component/Form/Tests/FormIntegrationTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/FormIntegrationTestCase.php";}s:56:"Symfony/Component/Form/Tests/FormPerformanceTestCase.php";a:4:{s:6:"md5sum";s:32:"e899de2472926b4ada8acb636f1b5444";s:4:"name";s:56:"Symfony/Component/Form/Tests/FormPerformanceTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/FormPerformanceTestCase.php";}s:49:"Symfony/Component/Form/Tests/FormRegistryTest.php";a:4:{s:6:"md5sum";s:32:"eeb0092e76c36e50791699eb2faaaa03";s:4:"name";s:49:"Symfony/Component/Form/Tests/FormRegistryTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/FormRegistryTest.php";}s:49:"Symfony/Component/Form/Tests/FormRendererTest.php";a:4:{s:6:"md5sum";s:32:"1fc848f084ce8f7e10335f8175105886";s:4:"name";s:49:"Symfony/Component/Form/Tests/FormRendererTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/FormRendererTest.php";}s:48:"Symfony/Component/Form/Tests/Guess/GuessTest.php";a:4:{s:6:"md5sum";s:32:"fff8d24dbf03762ed0e2b6f15df45d2d";s:4:"name";s:48:"Symfony/Component/Form/Tests/Guess/GuessTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Guess/GuessTest.php";}s:57:"Symfony/Component/Form/Tests/NativeRequestHandlerTest.php";a:4:{s:6:"md5sum";s:32:"1877e570ea6b354cd5d9d9ba30418edb";s:4:"name";s:57:"Symfony/Component/Form/Tests/NativeRequestHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/NativeRequestHandlerTest.php";}s:53:"Symfony/Component/Form/Tests/ResolvedFormTypeTest.php";a:4:{s:6:"md5sum";s:32:"5261f73e95c249da67fe334c0927bf1f";s:4:"name";s:53:"Symfony/Component/Form/Tests/ResolvedFormTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/ResolvedFormTypeTest.php";}s:47:"Symfony/Component/Form/Tests/SimpleFormTest.php";a:4:{s:6:"md5sum";s:32:"cfd0db6db50796656eb604515e87adda";s:4:"name";s:47:"Symfony/Component/Form/Tests/SimpleFormTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/SimpleFormTest.php";}s:56:"Symfony/Component/Form/Tests/Util/OrderedHashMapTest.php";a:4:{s:6:"md5sum";s:32:"a7eeabaf53f6a3b60ec3ac2a78ce5002";s:4:"name";s:56:"Symfony/Component/Form/Tests/Util/OrderedHashMapTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Util/OrderedHashMapTest.php";}s:40:"Symfony/Component/Form/Util/FormUtil.php";a:4:{s:6:"md5sum";s:32:"d3566f471dce8351225b74b1c01058b6";s:4:"name";s:40:"Symfony/Component/Form/Util/FormUtil.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Util/FormUtil.php";}s:56:"Symfony/Component/Form/Util/InheritDataAwareIterator.php";a:4:{s:6:"md5sum";s:32:"98034987b9a71a6ec3a3f2fddd95f06a";s:4:"name";s:56:"Symfony/Component/Form/Util/InheritDataAwareIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Util/InheritDataAwareIterator.php";}s:46:"Symfony/Component/Form/Util/OrderedHashMap.php";a:4:{s:6:"md5sum";s:32:"fe22cba7385d2b8406b6a7104b9cf58c";s:4:"name";s:46:"Symfony/Component/Form/Util/OrderedHashMap.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Util/OrderedHashMap.php";}s:54:"Symfony/Component/Form/Util/OrderedHashMapIterator.php";a:4:{s:6:"md5sum";s:32:"6240f5c5d77934285a2dddab60843429";s:4:"name";s:54:"Symfony/Component/Form/Util/OrderedHashMapIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Util/OrderedHashMapIterator.php";}s:56:"Symfony/Component/Form/Util/VirtualFormAwareIterator.php";a:4:{s:6:"md5sum";s:32:"da65af10d658064eddfec592c82eb95b";s:4:"name";s:56:"Symfony/Component/Form/Util/VirtualFormAwareIterator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Util/VirtualFormAwareIterator.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:71:{s:52:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:61:"/opt/alt/php54/usr/share/doc/pear/Form/Symfony/Component/Form";b:1;s:56:"/opt/alt/php54/usr/share/doc/pear/Form/Symfony/Component";b:1;s:46:"/opt/alt/php54/usr/share/doc/pear/Form/Symfony";b:1;s:38:"/opt/alt/php54/usr/share/doc/pear/Form";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Exception";b:1;s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/ChoiceList";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension";b:1;s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataMapper";b:1;s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/DataTransformer";b:1;s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/EventListener";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/Type";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Core/View";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf";b:1;s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/CsrfProvider";b:1;s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/EventListener";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Csrf/Type";b:1;s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector";b:1;s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/EventListener";b:1;s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/Proxy";b:1;s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DataCollector/Type";b:1;s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/DependencyInjection";b:1;s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/HttpFoundation/EventListener";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/HttpFoundation";b:1;s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/HttpFoundation/Type";b:1;s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Templating";b:1;s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/Constraints";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator";b:1;s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/EventListener";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/Type";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/Util";b:1;s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Extension/Validator/ViolationMapper";b:1;s:58:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Guess";b:1;s:62:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form";b:1;s:57:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component";b:1;s:47:"/opt/alt/php54/usr/share/pear/test/Form/Symfony";b:1;s:39:"/opt/alt/php54/usr/share/pear/test/Form";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/config";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources";b:1;s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Resources/translations";b:1;s:57:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Test";b:1;s:68:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests";b:1;s:94:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core";b:1;s:78:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension";b:1;s:94:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataMapper";b:1;s:99:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer";b:1;s:97:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener";b:1;s:106:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/Fixtures";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type";b:1;s:96:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf";b:1;s:97:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/EventListener";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/Type";b:1;s:92:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/DataCollector";b:1;s:97:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/DataCollector/Type";b:1;s:107:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/HttpFoundation/EventListener";b:1;s:93:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/HttpFoundation";b:1;s:100:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Constraints";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator";b:1;s:102:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/EventListener";b:1;s:93:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Type";b:1;s:93:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Util";b:1;s:104:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper";b:1;s:77:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Fixtures";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Guess";b:1;s:73:"/opt/alt/php54/usr/share/pear/test/Form/Symfony/Component/Form/Tests/Util";b:1;s:57:"/opt/alt/php54/usr/share/pear/Symfony/Component/Form/Util";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:6:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:15:"EventDispatcher";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:3;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:9:"Validator";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:4;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:6:"Locale";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:5;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:14:"HttpFoundation";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506495;}PK�^�\ýEd�d�4pear/.registry/.channel.pear.symfony.com/routing.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:7:"Routing";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:26:"Symfony2 Routing Component";s:11:"description";s:26:"Symfony2 Routing Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:49";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:108:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7adb81f5e4787d2604f54309fff0e3bb";s:4:"name";s:46:"Symfony/Component/Routing/Annotation/Route.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b60bdd621fae7d13b678e3f113935112";s:4:"name";s:40:"Symfony/Component/Routing/autoloader.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cb1e57ece0f6472ce554be747e48c528";s:4:"name";s:38:"Symfony/Component/Routing/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0baf57eaa3bff7b952d404d0dd811ad3";s:4:"name";s:43:"Symfony/Component/Routing/CompiledRoute.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e68bb57f1159982d6ccb4bf32818a790";s:4:"name";s:39:"Symfony/Component/Routing/composer.json";s:4:"role";s:3:"doc";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3d64f0b57c301a19b85b92d88902f492";s:4:"name";s:58:"Symfony/Component/Routing/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6b093524c85d31ed964c1da598962df7";s:4:"name";s:65:"Symfony/Component/Routing/Exception/InvalidParameterException.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2c38201b0c1a4c837e95d468dd663e3b";s:4:"name";s:65:"Symfony/Component/Routing/Exception/MethodNotAllowedException.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d2b4c2e8f43f6fd41e2c37bd6393d2d0";s:4:"name";s:75:"Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a8e5469ab6552d46a8f20e6f7f63f76f";s:4:"name";s:65:"Symfony/Component/Routing/Exception/ResourceNotFoundException.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5bf9cdaf9c5be880c320f3e547b7321c";s:4:"name";s:62:"Symfony/Component/Routing/Exception/RouteNotFoundException.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a387ca727c49a190b907162d5cf0239e";s:4:"name";s:73:"Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"585bce412c6f8b482b00264f04f8904f";s:4:"name";s:62:"Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"93d6bfa4c5d22436fdb2fabb49eb6116";s:4:"name";s:71:"Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0895f6715cb9ad1780264962b2e71b64";s:4:"name";s:65:"Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ae2d46c136e52ed92d5b3a0485406adc";s:4:"name";s:52:"Symfony/Component/Routing/Generator/UrlGenerator.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8abf3d984c783ee04d6a04a1ede324bd";s:4:"name";s:61:"Symfony/Component/Routing/Generator/UrlGeneratorInterface.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:33:"Symfony/Component/Routing/LICENSE";s:4:"role";s:3:"doc";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dd2947b7d0e4a3806e8055fb51ba23ff";s:4:"name";s:58:"Symfony/Component/Routing/Loader/AnnotationClassLoader.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7bea5831e2002735dee1875edf8526c6";s:4:"name";s:62:"Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6119f0547ce407854362d4acb8eca23b";s:4:"name";s:57:"Symfony/Component/Routing/Loader/AnnotationFileLoader.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"401fa43c0b8ba75aee4d6ee205f5de8e";s:4:"name";s:50:"Symfony/Component/Routing/Loader/ClosureLoader.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a19db6de99eb2baddcd560a30c232ecd";s:4:"name";s:50:"Symfony/Component/Routing/Loader/PhpFileLoader.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e03178ea7d1f063fd89ee2c8218f5b78";s:4:"name";s:63:"Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7e21f6c0b962f4cbb156dc81e73732a2";s:4:"name";s:50:"Symfony/Component/Routing/Loader/XmlFileLoader.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"459710f5848da9859f1569234a0b578e";s:4:"name";s:51:"Symfony/Component/Routing/Loader/YamlFileLoader.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"507197805b62457c0fe43210c946e931";s:4:"name";s:54:"Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c5f1fa04cbb07a028e79f7c442fc87ca";s:4:"name";s:64:"Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df4c19109cb173cd91453733a9c97922";s:4:"name";s:61:"Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"45c403eb0f5db93743a04d64c11e4b10";s:4:"name";s:67:"Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"850971f7d3c0b766bb8b63bb7f59cd2e";s:4:"name";s:56:"Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d3d51e47a11338eb959efbc24c56d157";s:4:"name";s:58:"Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"12d3638dbfcc3ecbc7e5e16c46b0a18c";s:4:"name";s:67:"Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9daade9ffbdeff369f03818ef2f73ce2";s:4:"name";s:61:"Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"357c83fcf951bdb206fca135dca5bb07";s:4:"name";s:60:"Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"001a000c9776f18c43a8ee4664b6e163";s:4:"name";s:69:"Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c623f743ec5d8113a010c2305f64b21e";s:4:"name";s:61:"Symfony/Component/Routing/Matcher/RequestMatcherInterface.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6c48a62311dd625f0d624495e1d5d6e3";s:4:"name";s:57:"Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0527f51011e56d17b92c0cd5ae204d54";s:4:"name";s:48:"Symfony/Component/Routing/Matcher/UrlMatcher.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ebcef73fd69167569dbf16207a5cc2b4";s:4:"name";s:57:"Symfony/Component/Routing/Matcher/UrlMatcherInterface.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"306433f88b741f2d72b11ff338743859";s:4:"name";s:42:"Symfony/Component/Routing/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f72998925a6eca826c1fe39175f7b63b";s:4:"name";s:35:"Symfony/Component/Routing/README.md";s:4:"role";s:3:"doc";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"516eaca4237df46d98fa7a57e8937fc2";s:4:"name";s:44:"Symfony/Component/Routing/RequestContext.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2c9cdcdd343d5761f123e325f96027a2";s:4:"name";s:58:"Symfony/Component/Routing/RequestContextAwareInterface.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a0b6b35abcbed3f170a90c9fa56703c1";s:4:"name";s:35:"Symfony/Component/Routing/Route.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d3c52daaaec1113c792edf9236828964";s:4:"name";s:45:"Symfony/Component/Routing/RouteCollection.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0dde56b2dd439922f60b19cc24ce00eb";s:4:"name";s:43:"Symfony/Component/Routing/RouteCompiler.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9bade2ca282845cdce2120a21147f955";s:4:"name";s:52:"Symfony/Component/Routing/RouteCompilerInterface.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cfa1e77acc20b94d2869303a3e343bdd";s:4:"name";s:36:"Symfony/Component/Routing/Router.php";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"28c2b609f629bb9c437624f5f9897a7f";s:4:"name";s:45:"Symfony/Component/Routing/RouterInterface.php";s:4:"role";s:3:"php";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"95f849d5323f5a02d2c1b26009cff39a";s:4:"name";s:56:"Symfony/Component/Routing/Tests/Annotation/RouteTest.php";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"329dc6eb58ed2841e9dff812a6f04f93";s:4:"name";s:53:"Symfony/Component/Routing/Tests/CompiledRouteTest.php";s:4:"role";s:4:"test";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:54:"Symfony/Component/Routing/Tests/Fixtures/annotated.php";s:4:"role";s:4:"test";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8faac9caece520eabbf87e072d996583";s:4:"name";s:75:"Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php";s:4:"role";s:4:"test";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"be20633112a29f2ada4e2989a31b7dc9";s:4:"name";s:70:"Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php";s:4:"role";s:4:"test";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1ec3b14820cead74554134842fa3498b";s:4:"name";s:70:"Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php";s:4:"role";s:4:"test";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3cad48848f57310d3f0136f2cff860f2";s:4:"name";s:64:"Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6ee192ca9034e12e89cb048b31f8e208";s:4:"name";s:67:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.apache";s:4:"role";s:4:"test";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"371781bd5bc58854e49e0b583470c685";s:4:"name";s:64:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php";s:4:"role";s:4:"test";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"24139b71d25f2706f9956ce94ec65d99";s:4:"name";s:67:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.apache";s:4:"role";s:4:"test";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3cd94c1ff96c25218039f7c6aefb56f2";s:4:"name";s:64:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php";s:4:"role";s:4:"test";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dd7da1ea21e2d886d079594d07e167dc";s:4:"name";s:64:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php";s:4:"role";s:4:"test";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:50:"Symfony/Component/Routing/Tests/Fixtures/empty.yml";s:4:"role";s:4:"test";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:48:"Symfony/Component/Routing/Tests/Fixtures/foo.xml";s:4:"role";s:4:"test";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:49:"Symfony/Component/Routing/Tests/Fixtures/foo1.xml";s:4:"role";s:4:"test";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bf3dd20043754c68c898fdfa423fe222";s:4:"name";s:55:"Symfony/Component/Routing/Tests/Fixtures/incomplete.yml";s:4:"role";s:4:"test";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d8e1d3483f7f8ccf90232bd90127aa92";s:4:"name";s:55:"Symfony/Component/Routing/Tests/Fixtures/missing_id.xml";s:4:"role";s:4:"test";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7cfffc2477dfdf9f9ae10de26b0fb51a";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/missing_path.xml";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cf3966d1a8d8470e67a08ae431058d0f";s:4:"name";s:60:"Symfony/Component/Routing/Tests/Fixtures/namespaceprefix.xml";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0612cba8c11d5b3cb54e50b2c749c21c";s:4:"name";s:73:"Symfony/Component/Routing/Tests/Fixtures/nonesense_resource_plus_path.yml";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8018429bdc8e300ac75c368660613c86";s:4:"name";s:76:"Symfony/Component/Routing/Tests/Fixtures/nonesense_type_without_resource.yml";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bc542914570693788cf3a8d2afbd45c2";s:4:"name";s:53:"Symfony/Component/Routing/Tests/Fixtures/nonvalid.xml";s:4:"role";s:4:"test";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d3b07384d113edec49eaa6238ad5ff00";s:4:"name";s:53:"Symfony/Component/Routing/Tests/Fixtures/nonvalid.yml";s:4:"role";s:4:"test";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"55ada43e144278e471a7ba1cdd7cc295";s:4:"name";s:54:"Symfony/Component/Routing/Tests/Fixtures/nonvalid2.yml";s:4:"role";s:4:"test";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"70579c6820523185fc90f5373c3821fd";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/nonvalidkeys.yml";s:4:"role";s:4:"test";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c859068a6d836761e048cd0edb727dcb";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/nonvalidnode.xml";s:4:"role";s:4:"test";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a4e93f76c7e4364bae051528417adfb2";s:4:"name";s:58:"Symfony/Component/Routing/Tests/Fixtures/nonvalidroute.xml";s:4:"role";s:4:"test";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"682451e5c01e3d3dd757fc8919d1d43c";s:4:"name";s:67:"Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php";s:4:"role";s:4:"test";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7586d7599fd0f4df8c339cb951e96497";s:4:"name";s:63:"Symfony/Component/Routing/Tests/Fixtures/special_route_name.yml";s:4:"role";s:4:"test";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"38aeb5d4ba857600ef5c0215739453c5";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/validpattern.php";s:4:"role";s:4:"test";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"56524e1e940a4197127becdfd7268a10";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/validpattern.xml";s:4:"role";s:4:"test";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"24dd856c57527517f9280aaa43bef110";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/validpattern.yml";s:4:"role";s:4:"test";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"839c3e52a85f8e4d6beee322a3115d93";s:4:"name";s:58:"Symfony/Component/Routing/Tests/Fixtures/validresource.xml";s:4:"role";s:4:"test";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e2fd3dead2fc9206e2d3fe8a33bfdedb";s:4:"name";s:58:"Symfony/Component/Routing/Tests/Fixtures/validresource.yml";s:4:"role";s:4:"test";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"561c119c08673fd8436e11424a20d808";s:4:"name";s:56:"Symfony/Component/Routing/Tests/Fixtures/withdoctype.xml";s:4:"role";s:4:"test";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7a9b9b426e9cbbe3c69b31c5a7ad0890";s:4:"name";s:75:"Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php";s:4:"role";s:4:"test";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5d99c062e8a7e57006a53e6579ac95c0";s:4:"name";s:62:"Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php";s:4:"role";s:4:"test";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5639a76d09ef4f3443810984ed8984ef";s:4:"name";s:71:"Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.php";s:4:"role";s:4:"test";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2f7f7a0c885391b6b97e8a99883ea05d";s:4:"name";s:68:"Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php";s:4:"role";s:4:"test";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dbfce1fde62363437f0aa8a33613e97c";s:4:"name";s:72:"Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.php";s:4:"role";s:4:"test";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4dfd29898087da820c09e85719a5c792";s:4:"name";s:67:"Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php";s:4:"role";s:4:"test";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7046a86d62fbf762f17b4776eccb4dc4";s:4:"name";s:60:"Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.php";s:4:"role";s:4:"test";}}i:92;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a2ab975045a0d412efbf0d5ac222972c";s:4:"name";s:60:"Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php";s:4:"role";s:4:"test";}}i:93;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d8319c0bc762ca704bb7908703d0c7e";s:4:"name";s:60:"Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php";s:4:"role";s:4:"test";}}i:94;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eebeb2d76e8045aa0098090259de5ee4";s:4:"name";s:61:"Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php";s:4:"role";s:4:"test";}}i:95;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba1d59f0b0d653e1aaf3ee0c6649bff7";s:4:"name";s:64:"Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php";s:4:"role";s:4:"test";}}i:96;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0642be5053da073e465f18f1b8fd887d";s:4:"name";s:74:"Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php";s:4:"role";s:4:"test";}}i:97;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b35d71387dc9d1d3240600e639f1bd9c";s:4:"name";s:71:"Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.php";s:4:"role";s:4:"test";}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4c13ddc57f8c8669a7d0527d745b8a68";s:4:"name";s:77:"Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php";s:4:"role";s:4:"test";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"84d694ec0d369ec8cc64177e4a1dc08d";s:4:"name";s:71:"Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php";s:4:"role";s:4:"test";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea86e71e661f737eb99b92f42c9b6eb4";s:4:"name";s:70:"Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php";s:4:"role";s:4:"test";}}i:101;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7ea68114d0c4d2f15535a6f6af9c4f16";s:4:"name";s:67:"Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php";s:4:"role";s:4:"test";}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"59b53c89eb44b45ad22a2e44e3cd7eea";s:4:"name";s:58:"Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php";s:4:"role";s:4:"test";}}i:103;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"504c9fa5bc66cfd0cfa38d73fbacfee5";s:4:"name";s:54:"Symfony/Component/Routing/Tests/RequestContextTest.php";s:4:"role";s:4:"test";}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f9071d027efd59e4a55cfbbdd9af4819";s:4:"name";s:55:"Symfony/Component/Routing/Tests/RouteCollectionTest.php";s:4:"role";s:4:"test";}}i:105;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f0ee1d58dd4ec0723688cab9d08adc4e";s:4:"name";s:53:"Symfony/Component/Routing/Tests/RouteCompilerTest.php";s:4:"role";s:4:"test";}}i:106;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5188e029a746903602beab36af4502b7";s:4:"name";s:46:"Symfony/Component/Routing/Tests/RouterTest.php";s:4:"role";s:4:"test";}}i:107;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"88ef12b30bd938f7583c2e9afc89b6f9";s:4:"name";s:45:"Symfony/Component/Routing/Tests/RouteTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}s:8:"optional";a:1:{s:7:"package";a:2:{i:0;a:2:{s:4:"name";s:6:"Config";s:7:"channel";s:16:"pear.symfony.com";}i:1;a:2:{s:4:"name";s:4:"Yaml";s:7:"channel";s:16:"pear.symfony.com";}}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:108:{s:46:"Symfony/Component/Routing/Annotation/Route.php";a:4:{s:6:"md5sum";s:32:"7adb81f5e4787d2604f54309fff0e3bb";s:4:"name";s:46:"Symfony/Component/Routing/Annotation/Route.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Annotation/Route.php";}s:40:"Symfony/Component/Routing/autoloader.php";a:4:{s:6:"md5sum";s:32:"b60bdd621fae7d13b678e3f113935112";s:4:"name";s:40:"Symfony/Component/Routing/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/autoloader.php";}s:38:"Symfony/Component/Routing/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"cb1e57ece0f6472ce554be747e48c528";s:4:"name";s:38:"Symfony/Component/Routing/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/doc/pear/Routing/Symfony/Component/Routing/CHANGELOG.md";}s:43:"Symfony/Component/Routing/CompiledRoute.php";a:4:{s:6:"md5sum";s:32:"0baf57eaa3bff7b952d404d0dd811ad3";s:4:"name";s:43:"Symfony/Component/Routing/CompiledRoute.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/CompiledRoute.php";}s:39:"Symfony/Component/Routing/composer.json";a:4:{s:6:"md5sum";s:32:"e68bb57f1159982d6ccb4bf32818a790";s:4:"name";s:39:"Symfony/Component/Routing/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/Routing/Symfony/Component/Routing/composer.json";}s:58:"Symfony/Component/Routing/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"3d64f0b57c301a19b85b92d88902f492";s:4:"name";s:58:"Symfony/Component/Routing/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Exception/ExceptionInterface.php";}s:65:"Symfony/Component/Routing/Exception/InvalidParameterException.php";a:4:{s:6:"md5sum";s:32:"6b093524c85d31ed964c1da598962df7";s:4:"name";s:65:"Symfony/Component/Routing/Exception/InvalidParameterException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Exception/InvalidParameterException.php";}s:65:"Symfony/Component/Routing/Exception/MethodNotAllowedException.php";a:4:{s:6:"md5sum";s:32:"2c38201b0c1a4c837e95d468dd663e3b";s:4:"name";s:65:"Symfony/Component/Routing/Exception/MethodNotAllowedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Exception/MethodNotAllowedException.php";}s:75:"Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php";a:4:{s:6:"md5sum";s:32:"d2b4c2e8f43f6fd41e2c37bd6393d2d0";s:4:"name";s:75:"Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php";}s:65:"Symfony/Component/Routing/Exception/ResourceNotFoundException.php";a:4:{s:6:"md5sum";s:32:"a8e5469ab6552d46a8f20e6f7f63f76f";s:4:"name";s:65:"Symfony/Component/Routing/Exception/ResourceNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Exception/ResourceNotFoundException.php";}s:62:"Symfony/Component/Routing/Exception/RouteNotFoundException.php";a:4:{s:6:"md5sum";s:32:"5bf9cdaf9c5be880c320f3e547b7321c";s:4:"name";s:62:"Symfony/Component/Routing/Exception/RouteNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Exception/RouteNotFoundException.php";}s:73:"Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php";a:4:{s:6:"md5sum";s:32:"a387ca727c49a190b907162d5cf0239e";s:4:"name";s:73:"Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php";}s:62:"Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php";a:4:{s:6:"md5sum";s:32:"585bce412c6f8b482b00264f04f8904f";s:4:"name";s:62:"Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php";}s:71:"Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php";a:4:{s:6:"md5sum";s:32:"93d6bfa4c5d22436fdb2fabb49eb6116";s:4:"name";s:71:"Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php";}s:65:"Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php";a:4:{s:6:"md5sum";s:32:"0895f6715cb9ad1780264962b2e71b64";s:4:"name";s:65:"Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php";}s:52:"Symfony/Component/Routing/Generator/UrlGenerator.php";a:4:{s:6:"md5sum";s:32:"ae2d46c136e52ed92d5b3a0485406adc";s:4:"name";s:52:"Symfony/Component/Routing/Generator/UrlGenerator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Generator/UrlGenerator.php";}s:61:"Symfony/Component/Routing/Generator/UrlGeneratorInterface.php";a:4:{s:6:"md5sum";s:32:"8abf3d984c783ee04d6a04a1ede324bd";s:4:"name";s:61:"Symfony/Component/Routing/Generator/UrlGeneratorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php";}s:33:"Symfony/Component/Routing/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:33:"Symfony/Component/Routing/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/doc/pear/Routing/Symfony/Component/Routing/LICENSE";}s:58:"Symfony/Component/Routing/Loader/AnnotationClassLoader.php";a:4:{s:6:"md5sum";s:32:"dd2947b7d0e4a3806e8055fb51ba23ff";s:4:"name";s:58:"Symfony/Component/Routing/Loader/AnnotationClassLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader/AnnotationClassLoader.php";}s:62:"Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php";a:4:{s:6:"md5sum";s:32:"7bea5831e2002735dee1875edf8526c6";s:4:"name";s:62:"Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php";}s:57:"Symfony/Component/Routing/Loader/AnnotationFileLoader.php";a:4:{s:6:"md5sum";s:32:"6119f0547ce407854362d4acb8eca23b";s:4:"name";s:57:"Symfony/Component/Routing/Loader/AnnotationFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader/AnnotationFileLoader.php";}s:50:"Symfony/Component/Routing/Loader/ClosureLoader.php";a:4:{s:6:"md5sum";s:32:"401fa43c0b8ba75aee4d6ee205f5de8e";s:4:"name";s:50:"Symfony/Component/Routing/Loader/ClosureLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader/ClosureLoader.php";}s:50:"Symfony/Component/Routing/Loader/PhpFileLoader.php";a:4:{s:6:"md5sum";s:32:"a19db6de99eb2baddcd560a30c232ecd";s:4:"name";s:50:"Symfony/Component/Routing/Loader/PhpFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader/PhpFileLoader.php";}s:63:"Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd";a:4:{s:6:"md5sum";s:32:"e03178ea7d1f063fd89ee2c8218f5b78";s:4:"name";s:63:"Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd";}s:50:"Symfony/Component/Routing/Loader/XmlFileLoader.php";a:4:{s:6:"md5sum";s:32:"7e21f6c0b962f4cbb156dc81e73732a2";s:4:"name";s:50:"Symfony/Component/Routing/Loader/XmlFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader/XmlFileLoader.php";}s:51:"Symfony/Component/Routing/Loader/YamlFileLoader.php";a:4:{s:6:"md5sum";s:32:"459710f5848da9859f1569234a0b578e";s:4:"name";s:51:"Symfony/Component/Routing/Loader/YamlFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader/YamlFileLoader.php";}s:54:"Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php";a:4:{s:6:"md5sum";s:32:"507197805b62457c0fe43210c946e931";s:4:"name";s:54:"Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php";}s:64:"Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php";a:4:{s:6:"md5sum";s:32:"c5f1fa04cbb07a028e79f7c442fc87ca";s:4:"name";s:64:"Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php";}s:61:"Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php";a:4:{s:6:"md5sum";s:32:"df4c19109cb173cd91453733a9c97922";s:4:"name";s:61:"Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php";}s:67:"Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php";a:4:{s:6:"md5sum";s:32:"45c403eb0f5db93743a04d64c11e4b10";s:4:"name";s:67:"Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php";}s:56:"Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php";a:4:{s:6:"md5sum";s:32:"850971f7d3c0b766bb8b63bb7f59cd2e";s:4:"name";s:56:"Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php";}s:58:"Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php";a:4:{s:6:"md5sum";s:32:"d3d51e47a11338eb959efbc24c56d157";s:4:"name";s:58:"Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php";}s:67:"Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php";a:4:{s:6:"md5sum";s:32:"12d3638dbfcc3ecbc7e5e16c46b0a18c";s:4:"name";s:67:"Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php";}s:61:"Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php";a:4:{s:6:"md5sum";s:32:"9daade9ffbdeff369f03818ef2f73ce2";s:4:"name";s:61:"Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php";}s:60:"Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php";a:4:{s:6:"md5sum";s:32:"357c83fcf951bdb206fca135dca5bb07";s:4:"name";s:60:"Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php";}s:69:"Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php";a:4:{s:6:"md5sum";s:32:"001a000c9776f18c43a8ee4664b6e163";s:4:"name";s:69:"Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php";}s:61:"Symfony/Component/Routing/Matcher/RequestMatcherInterface.php";a:4:{s:6:"md5sum";s:32:"c623f743ec5d8113a010c2305f64b21e";s:4:"name";s:61:"Symfony/Component/Routing/Matcher/RequestMatcherInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/RequestMatcherInterface.php";}s:57:"Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php";a:4:{s:6:"md5sum";s:32:"6c48a62311dd625f0d624495e1d5d6e3";s:4:"name";s:57:"Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php";}s:48:"Symfony/Component/Routing/Matcher/UrlMatcher.php";a:4:{s:6:"md5sum";s:32:"0527f51011e56d17b92c0cd5ae204d54";s:4:"name";s:48:"Symfony/Component/Routing/Matcher/UrlMatcher.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/UrlMatcher.php";}s:57:"Symfony/Component/Routing/Matcher/UrlMatcherInterface.php";a:4:{s:6:"md5sum";s:32:"ebcef73fd69167569dbf16207a5cc2b4";s:4:"name";s:57:"Symfony/Component/Routing/Matcher/UrlMatcherInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php";}s:42:"Symfony/Component/Routing/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"306433f88b741f2d72b11ff338743859";s:4:"name";s:42:"Symfony/Component/Routing/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/phpunit.xml.dist";}s:35:"Symfony/Component/Routing/README.md";a:4:{s:6:"md5sum";s:32:"f72998925a6eca826c1fe39175f7b63b";s:4:"name";s:35:"Symfony/Component/Routing/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/doc/pear/Routing/Symfony/Component/Routing/README.md";}s:44:"Symfony/Component/Routing/RequestContext.php";a:4:{s:6:"md5sum";s:32:"516eaca4237df46d98fa7a57e8937fc2";s:4:"name";s:44:"Symfony/Component/Routing/RequestContext.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/RequestContext.php";}s:58:"Symfony/Component/Routing/RequestContextAwareInterface.php";a:4:{s:6:"md5sum";s:32:"2c9cdcdd343d5761f123e325f96027a2";s:4:"name";s:58:"Symfony/Component/Routing/RequestContextAwareInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/RequestContextAwareInterface.php";}s:35:"Symfony/Component/Routing/Route.php";a:4:{s:6:"md5sum";s:32:"a0b6b35abcbed3f170a90c9fa56703c1";s:4:"name";s:35:"Symfony/Component/Routing/Route.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Route.php";}s:45:"Symfony/Component/Routing/RouteCollection.php";a:4:{s:6:"md5sum";s:32:"d3c52daaaec1113c792edf9236828964";s:4:"name";s:45:"Symfony/Component/Routing/RouteCollection.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/RouteCollection.php";}s:43:"Symfony/Component/Routing/RouteCompiler.php";a:4:{s:6:"md5sum";s:32:"0dde56b2dd439922f60b19cc24ce00eb";s:4:"name";s:43:"Symfony/Component/Routing/RouteCompiler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/RouteCompiler.php";}s:52:"Symfony/Component/Routing/RouteCompilerInterface.php";a:4:{s:6:"md5sum";s:32:"9bade2ca282845cdce2120a21147f955";s:4:"name";s:52:"Symfony/Component/Routing/RouteCompilerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/RouteCompilerInterface.php";}s:36:"Symfony/Component/Routing/Router.php";a:4:{s:6:"md5sum";s:32:"cfa1e77acc20b94d2869303a3e343bdd";s:4:"name";s:36:"Symfony/Component/Routing/Router.php";s:4:"role";s:3:"php";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Router.php";}s:45:"Symfony/Component/Routing/RouterInterface.php";a:4:{s:6:"md5sum";s:32:"28c2b609f629bb9c437624f5f9897a7f";s:4:"name";s:45:"Symfony/Component/Routing/RouterInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/RouterInterface.php";}s:56:"Symfony/Component/Routing/Tests/Annotation/RouteTest.php";a:4:{s:6:"md5sum";s:32:"95f849d5323f5a02d2c1b26009cff39a";s:4:"name";s:56:"Symfony/Component/Routing/Tests/Annotation/RouteTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Annotation/RouteTest.php";}s:53:"Symfony/Component/Routing/Tests/CompiledRouteTest.php";a:4:{s:6:"md5sum";s:32:"329dc6eb58ed2841e9dff812a6f04f93";s:4:"name";s:53:"Symfony/Component/Routing/Tests/CompiledRouteTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/CompiledRouteTest.php";}s:54:"Symfony/Component/Routing/Tests/Fixtures/annotated.php";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:54:"Symfony/Component/Routing/Tests/Fixtures/annotated.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/annotated.php";}s:75:"Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php";a:4:{s:6:"md5sum";s:32:"8faac9caece520eabbf87e072d996583";s:4:"name";s:75:"Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php";}s:70:"Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php";a:4:{s:6:"md5sum";s:32:"be20633112a29f2ada4e2989a31b7dc9";s:4:"name";s:70:"Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php";}s:70:"Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php";a:4:{s:6:"md5sum";s:32:"1ec3b14820cead74554134842fa3498b";s:4:"name";s:70:"Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php";}s:64:"Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php";a:4:{s:6:"md5sum";s:32:"3cad48848f57310d3f0136f2cff860f2";s:4:"name";s:64:"Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php";}s:67:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.apache";a:4:{s:6:"md5sum";s:32:"6ee192ca9034e12e89cb048b31f8e208";s:4:"name";s:67:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.apache";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.apache";}s:64:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php";a:4:{s:6:"md5sum";s:32:"371781bd5bc58854e49e0b583470c685";s:4:"name";s:64:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php";}s:67:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.apache";a:4:{s:6:"md5sum";s:32:"24139b71d25f2706f9956ce94ec65d99";s:4:"name";s:67:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.apache";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.apache";}s:64:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php";a:4:{s:6:"md5sum";s:32:"3cd94c1ff96c25218039f7c6aefb56f2";s:4:"name";s:64:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php";}s:64:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php";a:4:{s:6:"md5sum";s:32:"dd7da1ea21e2d886d079594d07e167dc";s:4:"name";s:64:"Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php";}s:50:"Symfony/Component/Routing/Tests/Fixtures/empty.yml";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:50:"Symfony/Component/Routing/Tests/Fixtures/empty.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/empty.yml";}s:48:"Symfony/Component/Routing/Tests/Fixtures/foo.xml";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:48:"Symfony/Component/Routing/Tests/Fixtures/foo.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/foo.xml";}s:49:"Symfony/Component/Routing/Tests/Fixtures/foo1.xml";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:49:"Symfony/Component/Routing/Tests/Fixtures/foo1.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/foo1.xml";}s:55:"Symfony/Component/Routing/Tests/Fixtures/incomplete.yml";a:4:{s:6:"md5sum";s:32:"bf3dd20043754c68c898fdfa423fe222";s:4:"name";s:55:"Symfony/Component/Routing/Tests/Fixtures/incomplete.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/incomplete.yml";}s:55:"Symfony/Component/Routing/Tests/Fixtures/missing_id.xml";a:4:{s:6:"md5sum";s:32:"d8e1d3483f7f8ccf90232bd90127aa92";s:4:"name";s:55:"Symfony/Component/Routing/Tests/Fixtures/missing_id.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/missing_id.xml";}s:57:"Symfony/Component/Routing/Tests/Fixtures/missing_path.xml";a:4:{s:6:"md5sum";s:32:"7cfffc2477dfdf9f9ae10de26b0fb51a";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/missing_path.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/missing_path.xml";}s:60:"Symfony/Component/Routing/Tests/Fixtures/namespaceprefix.xml";a:4:{s:6:"md5sum";s:32:"cf3966d1a8d8470e67a08ae431058d0f";s:4:"name";s:60:"Symfony/Component/Routing/Tests/Fixtures/namespaceprefix.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/namespaceprefix.xml";}s:73:"Symfony/Component/Routing/Tests/Fixtures/nonesense_resource_plus_path.yml";a:4:{s:6:"md5sum";s:32:"0612cba8c11d5b3cb54e50b2c749c21c";s:4:"name";s:73:"Symfony/Component/Routing/Tests/Fixtures/nonesense_resource_plus_path.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_resource_plus_path.yml";}s:76:"Symfony/Component/Routing/Tests/Fixtures/nonesense_type_without_resource.yml";a:4:{s:6:"md5sum";s:32:"8018429bdc8e300ac75c368660613c86";s:4:"name";s:76:"Symfony/Component/Routing/Tests/Fixtures/nonesense_type_without_resource.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_type_without_resource.yml";}s:53:"Symfony/Component/Routing/Tests/Fixtures/nonvalid.xml";a:4:{s:6:"md5sum";s:32:"bc542914570693788cf3a8d2afbd45c2";s:4:"name";s:53:"Symfony/Component/Routing/Tests/Fixtures/nonvalid.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.xml";}s:53:"Symfony/Component/Routing/Tests/Fixtures/nonvalid.yml";a:4:{s:6:"md5sum";s:32:"d3b07384d113edec49eaa6238ad5ff00";s:4:"name";s:53:"Symfony/Component/Routing/Tests/Fixtures/nonvalid.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.yml";}s:54:"Symfony/Component/Routing/Tests/Fixtures/nonvalid2.yml";a:4:{s:6:"md5sum";s:32:"55ada43e144278e471a7ba1cdd7cc295";s:4:"name";s:54:"Symfony/Component/Routing/Tests/Fixtures/nonvalid2.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid2.yml";}s:57:"Symfony/Component/Routing/Tests/Fixtures/nonvalidkeys.yml";a:4:{s:6:"md5sum";s:32:"70579c6820523185fc90f5373c3821fd";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/nonvalidkeys.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidkeys.yml";}s:57:"Symfony/Component/Routing/Tests/Fixtures/nonvalidnode.xml";a:4:{s:6:"md5sum";s:32:"c859068a6d836761e048cd0edb727dcb";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/nonvalidnode.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidnode.xml";}s:58:"Symfony/Component/Routing/Tests/Fixtures/nonvalidroute.xml";a:4:{s:6:"md5sum";s:32:"a4e93f76c7e4364bae051528417adfb2";s:4:"name";s:58:"Symfony/Component/Routing/Tests/Fixtures/nonvalidroute.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidroute.xml";}s:67:"Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php";a:4:{s:6:"md5sum";s:32:"682451e5c01e3d3dd757fc8919d1d43c";s:4:"name";s:67:"Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php";}s:63:"Symfony/Component/Routing/Tests/Fixtures/special_route_name.yml";a:4:{s:6:"md5sum";s:32:"7586d7599fd0f4df8c339cb951e96497";s:4:"name";s:63:"Symfony/Component/Routing/Tests/Fixtures/special_route_name.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/special_route_name.yml";}s:57:"Symfony/Component/Routing/Tests/Fixtures/validpattern.php";a:4:{s:6:"md5sum";s:32:"38aeb5d4ba857600ef5c0215739453c5";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/validpattern.php";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.php";}s:57:"Symfony/Component/Routing/Tests/Fixtures/validpattern.xml";a:4:{s:6:"md5sum";s:32:"56524e1e940a4197127becdfd7268a10";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/validpattern.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.xml";}s:57:"Symfony/Component/Routing/Tests/Fixtures/validpattern.yml";a:4:{s:6:"md5sum";s:32:"24dd856c57527517f9280aaa43bef110";s:4:"name";s:57:"Symfony/Component/Routing/Tests/Fixtures/validpattern.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.yml";}s:58:"Symfony/Component/Routing/Tests/Fixtures/validresource.xml";a:4:{s:6:"md5sum";s:32:"839c3e52a85f8e4d6beee322a3115d93";s:4:"name";s:58:"Symfony/Component/Routing/Tests/Fixtures/validresource.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/validresource.xml";}s:58:"Symfony/Component/Routing/Tests/Fixtures/validresource.yml";a:4:{s:6:"md5sum";s:32:"e2fd3dead2fc9206e2d3fe8a33bfdedb";s:4:"name";s:58:"Symfony/Component/Routing/Tests/Fixtures/validresource.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/validresource.yml";}s:56:"Symfony/Component/Routing/Tests/Fixtures/withdoctype.xml";a:4:{s:6:"md5sum";s:32:"561c119c08673fd8436e11424a20d808";s:4:"name";s:56:"Symfony/Component/Routing/Tests/Fixtures/withdoctype.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/withdoctype.xml";}s:75:"Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php";a:4:{s:6:"md5sum";s:32:"7a9b9b426e9cbbe3c69b31c5a7ad0890";s:4:"name";s:75:"Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php";}s:62:"Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php";a:4:{s:6:"md5sum";s:32:"5d99c062e8a7e57006a53e6579ac95c0";s:4:"name";s:62:"Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php";}s:71:"Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.php";a:4:{s:6:"md5sum";s:32:"5639a76d09ef4f3443810984ed8984ef";s:4:"name";s:71:"Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.php";}s:68:"Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php";a:4:{s:6:"md5sum";s:32:"2f7f7a0c885391b6b97e8a99883ea05d";s:4:"name";s:68:"Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php";}s:72:"Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.php";a:4:{s:6:"md5sum";s:32:"dbfce1fde62363437f0aa8a33613e97c";s:4:"name";s:72:"Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.php";}s:67:"Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"4dfd29898087da820c09e85719a5c792";s:4:"name";s:67:"Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php";}s:60:"Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.php";a:4:{s:6:"md5sum";s:32:"7046a86d62fbf762f17b4776eccb4dc4";s:4:"name";s:60:"Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.php";}s:60:"Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"a2ab975045a0d412efbf0d5ac222972c";s:4:"name";s:60:"Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php";}s:60:"Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"8d8319c0bc762ca704bb7908703d0c7e";s:4:"name";s:60:"Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php";}s:61:"Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"eebeb2d76e8045aa0098090259de5ee4";s:4:"name";s:61:"Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php";}s:64:"Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php";a:4:{s:6:"md5sum";s:32:"ba1d59f0b0d653e1aaf3ee0c6649bff7";s:4:"name";s:64:"Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php";}s:74:"Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php";a:4:{s:6:"md5sum";s:32:"0642be5053da073e465f18f1b8fd887d";s:4:"name";s:74:"Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php";}s:71:"Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.php";a:4:{s:6:"md5sum";s:32:"b35d71387dc9d1d3240600e639f1bd9c";s:4:"name";s:71:"Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.php";}s:77:"Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php";a:4:{s:6:"md5sum";s:32:"4c13ddc57f8c8669a7d0527d745b8a68";s:4:"name";s:77:"Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php";}s:71:"Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php";a:4:{s:6:"md5sum";s:32:"84d694ec0d369ec8cc64177e4a1dc08d";s:4:"name";s:71:"Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php";}s:70:"Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php";a:4:{s:6:"md5sum";s:32:"ea86e71e661f737eb99b92f42c9b6eb4";s:4:"name";s:70:"Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php";}s:67:"Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php";a:4:{s:6:"md5sum";s:32:"7ea68114d0c4d2f15535a6f6af9c4f16";s:4:"name";s:67:"Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php";}s:58:"Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php";a:4:{s:6:"md5sum";s:32:"59b53c89eb44b45ad22a2e44e3cd7eea";s:4:"name";s:58:"Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php";}s:54:"Symfony/Component/Routing/Tests/RequestContextTest.php";a:4:{s:6:"md5sum";s:32:"504c9fa5bc66cfd0cfa38d73fbacfee5";s:4:"name";s:54:"Symfony/Component/Routing/Tests/RequestContextTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/RequestContextTest.php";}s:55:"Symfony/Component/Routing/Tests/RouteCollectionTest.php";a:4:{s:6:"md5sum";s:32:"f9071d027efd59e4a55cfbbdd9af4819";s:4:"name";s:55:"Symfony/Component/Routing/Tests/RouteCollectionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/RouteCollectionTest.php";}s:53:"Symfony/Component/Routing/Tests/RouteCompilerTest.php";a:4:{s:6:"md5sum";s:32:"f0ee1d58dd4ec0723688cab9d08adc4e";s:4:"name";s:53:"Symfony/Component/Routing/Tests/RouteCompilerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/RouteCompilerTest.php";}s:46:"Symfony/Component/Routing/Tests/RouterTest.php";a:4:{s:6:"md5sum";s:32:"5188e029a746903602beab36af4502b7";s:4:"name";s:46:"Symfony/Component/Routing/Tests/RouterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/RouterTest.php";}s:45:"Symfony/Component/Routing/Tests/RouteTest.php";a:4:{s:6:"md5sum";s:32:"88ef12b30bd938f7583c2e9afc89b6f9";s:4:"name";s:45:"Symfony/Component/Routing/Tests/RouteTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/RouteTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:30:{s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Annotation";b:1;s:55:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:67:"/opt/alt/php54/usr/share/doc/pear/Routing/Symfony/Component/Routing";b:1;s:59:"/opt/alt/php54/usr/share/doc/pear/Routing/Symfony/Component";b:1;s:49:"/opt/alt/php54/usr/share/doc/pear/Routing/Symfony";b:1;s:41:"/opt/alt/php54/usr/share/doc/pear/Routing";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Exception";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Generator";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Generator/Dumper";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader/schema/routing";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Loader/schema";b:1;s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher";b:1;s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Routing/Matcher/Dumper";b:1;s:68:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing";b:1;s:60:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component";b:1;s:50:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony";b:1;s:42:"/opt/alt/php54/usr/share/pear/test/Routing";b:1;s:85:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Annotation";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures";b:1;s:100:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses";b:1;s:90:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper";b:1;s:91:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Generator/Dumper";b:1;s:84:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Generator";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Loader";b:1;s:82:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Matcher";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/Dumper";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:4:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:6:"Config";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:3;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:4:"Yaml";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\��W���;pear/.registry/.channel.pear.symfony.com/httpfoundation.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:14:"HttpFoundation";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:33:"Symfony2 HttpFoundation Component";s:11:"description";s:33:"Symfony2 HttpFoundation Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:46";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:115:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b884647f8a23d1ceb94626f3dbeb5b9e";s:4:"name";s:49:"Symfony/Component/HttpFoundation/AcceptHeader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2dc45b1974c5106ad115c8853e6ec45d";s:4:"name";s:53:"Symfony/Component/HttpFoundation/AcceptHeaderItem.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"428aaf05f7b32d9b5b0f21b5ff926bf0";s:4:"name";s:50:"Symfony/Component/HttpFoundation/ApacheRequest.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7bfad2b6b760e66d943597d5dd7491a5";s:4:"name";s:47:"Symfony/Component/HttpFoundation/autoloader.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1aa7a69563a388fd41290f35c444aaad";s:4:"name";s:55:"Symfony/Component/HttpFoundation/BinaryFileResponse.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"13f2dd00d17037b16bc5f880141269f1";s:4:"name";s:45:"Symfony/Component/HttpFoundation/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6f84da0f8178f7302a88987dae7cd454";s:4:"name";s:46:"Symfony/Component/HttpFoundation/composer.json";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1d21e30974e0cd17909cbd83570e6046";s:4:"name";s:43:"Symfony/Component/HttpFoundation/Cookie.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bb322f1b660d8526d54738c96bcc9496";s:4:"name";s:61:"Symfony/Component/HttpFoundation/ExpressionRequestMatcher.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f857d7f53c52b92f5b86304b3380b099";s:4:"name";s:73:"Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"82953ad2af851c787ed55bf754510432";s:4:"name";s:65:"Symfony/Component/HttpFoundation/File/Exception/FileException.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"77e5758e36af149ce24c50d5f5c4ac41";s:4:"name";s:73:"Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"098936dfa215052c68b1002c28d276f4";s:4:"name";s:75:"Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ad5b16c066a5f89c35c5117ebc1d53ea";s:4:"name";s:67:"Symfony/Component/HttpFoundation/File/Exception/UploadException.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"94d1593cd9789142752a88ccb73cc430";s:4:"name";s:46:"Symfony/Component/HttpFoundation/File/File.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86252c17f16fc39143aad01fd9240645";s:4:"name";s:67:"Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5fe7bad1c2c974c75aa2c3930334f702";s:4:"name";s:76:"Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"94700d9406139019d43f5f8c76177ef1";s:4:"name";s:76:"Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f0cd17205bf9382d367e9921ceab5d88";s:4:"name";s:74:"Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f2f92703a5eb0dc3c2a700de6bc6d6e1";s:4:"name";s:75:"Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f0f9de1376a61059af6fa4e90fbd5a13";s:4:"name";s:66:"Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d0a415ee45ad0bd75cdb2032c2cae123";s:4:"name";s:75:"Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a8f763ea3e59a4ff37cee3af896eb323";s:4:"name";s:54:"Symfony/Component/HttpFoundation/File/UploadedFile.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b4ca9658eb9774373d5bf710c2300638";s:4:"name";s:44:"Symfony/Component/HttpFoundation/FileBag.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1f23e1af0de42dd915e7a807fa1527f6";s:4:"name";s:46:"Symfony/Component/HttpFoundation/HeaderBag.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"45993bfa467d14b903e20885e6a2cf89";s:4:"name";s:44:"Symfony/Component/HttpFoundation/IpUtils.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b4c78dc282e052cb8859f763aedf2805";s:4:"name";s:49:"Symfony/Component/HttpFoundation/JsonResponse.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:40:"Symfony/Component/HttpFoundation/LICENSE";s:4:"role";s:3:"doc";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e223bb93e05d1476b5f12488151a825c";s:4:"name";s:49:"Symfony/Component/HttpFoundation/ParameterBag.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"169b47a2f05c53335bca6becdd389220";s:4:"name";s:49:"Symfony/Component/HttpFoundation/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7851474c7a43a34dd6639f5a126c8bba";s:4:"name";s:42:"Symfony/Component/HttpFoundation/README.md";s:4:"role";s:3:"doc";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0517940c519e1e6efeb564c84edda69c";s:4:"name";s:53:"Symfony/Component/HttpFoundation/RedirectResponse.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bd5c61af6d0cbe7f7edbba3736b87d3b";s:4:"name";s:44:"Symfony/Component/HttpFoundation/Request.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"970df6f9df3bf9150a685c6c6c3f6aa1";s:4:"name";s:51:"Symfony/Component/HttpFoundation/RequestMatcher.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7ecc8861d7377c89a003417ab5db02bf";s:4:"name";s:60:"Symfony/Component/HttpFoundation/RequestMatcherInterface.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"37fd73c5d42a949fff23de4fa0d15b48";s:4:"name";s:49:"Symfony/Component/HttpFoundation/RequestStack.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"94ad98f4affa4224d887336c1f3ea1dc";s:4:"name";s:76:"Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cc8f30d1b460ddd2cc4913bfcd3e78b4";s:4:"name";s:45:"Symfony/Component/HttpFoundation/Response.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"02ccee91a765c8b71e997a5a1885a82d";s:4:"name";s:54:"Symfony/Component/HttpFoundation/ResponseHeaderBag.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f0ac2d2b1071ccec5884200d0ab5e420";s:4:"name";s:46:"Symfony/Component/HttpFoundation/ServerBag.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09a642bc5ffa1e2e7cb7aad84cdbc755";s:4:"name";s:67:"Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47cf442d27aa801d2ee1c43eb1b92ab6";s:4:"name";s:76:"Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bb24d40c233c7edbeaed0286f399d22d";s:4:"name";s:77:"Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47e8fa7a8f184ec2bef7e90741a030bb";s:4:"name";s:69:"Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fd24bb3a7c43f869f28c5f27e08bb257";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ecf0692351b914a8822f5138d801682";s:4:"name";s:68:"Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b25cb46112eac2e01f6d48a0c89c4716";s:4:"name";s:52:"Symfony/Component/HttpFoundation/Session/Session.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"baa130a80f887fca702556b7cb7ac61e";s:4:"name";s:64:"Symfony/Component/HttpFoundation/Session/SessionBagInterface.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"33e385a590e619684d37bead5b90a7eb";s:4:"name";s:61:"Symfony/Component/HttpFoundation/Session/SessionInterface.php";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"93364ba7a594762ef28e712bb9dd7e48";s:4:"name";s:84:"Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php";s:4:"role";s:3:"php";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6c4948a4a2c2400936ecf7552e67f7d3";s:4:"name";s:83:"Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php";s:4:"role";s:3:"php";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b8368e6dcaa7edfd508726ebf1d0a5a";s:4:"name";s:82:"Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fe93aa5204757c30501b59d3ab98550b";s:4:"name";s:85:"Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php";s:4:"role";s:3:"php";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"36574daf922d67815c3efda0063b7af2";s:4:"name";s:81:"Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php";s:4:"role";s:3:"php";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"26845162d0cd8e65c3524bf2413b6025";s:4:"name";s:79:"Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php";s:4:"role";s:3:"php";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5d66bb0aff4e6e04dea4a71dc6b74f2d";s:4:"name";s:78:"Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php";s:4:"role";s:3:"php";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d5cc5b83b3809aa9cbe8023c7cfd3845";s:4:"name";s:85:"Symfony/Component/HttpFoundation/Session/Storage/Handler/WriteCheckSessionHandler.php";s:4:"role";s:3:"php";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0ba968002df893468d99e77dfde92b95";s:4:"name";s:64:"Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php";s:4:"role";s:3:"php";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8d920694b05fe7820867c8271e5b519";s:4:"name";s:76:"Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php";s:4:"role";s:3:"php";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bbe1e2bea9239bfe24e45baadb6a330d";s:4:"name";s:75:"Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php";s:4:"role";s:3:"php";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7b886167def5c49469577a533a4c2f6c";s:4:"name";s:73:"Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php";s:4:"role";s:3:"php";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d5a28453f64db20f1d07f28af5213cfb";s:4:"name";s:76:"Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php";s:4:"role";s:3:"php";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b9152152614a4e0d7886d16e8162926";s:4:"name";s:72:"Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php";s:4:"role";s:3:"php";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4da090373635a3ca9732171dadfd4ed0";s:4:"name";s:70:"Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php";s:4:"role";s:3:"php";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1436f383c0e3500de401861230f5400a";s:4:"name";s:78:"Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php";s:4:"role";s:3:"php";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"af85e7a0bab5c49be82a9244b4cde282";s:4:"name";s:76:"Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php";s:4:"role";s:3:"php";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4b1b42d5e606ea929c4406f32826fcca";s:4:"name";s:53:"Symfony/Component/HttpFoundation/StreamedResponse.php";s:4:"role";s:3:"php";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"71279e63c94c58a19de6c9bfe9183847";s:4:"name";s:63:"Symfony/Component/HttpFoundation/Tests/AcceptHeaderItemTest.php";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ca12f957cfb0c92c2f8715b455f29607";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Tests/AcceptHeaderTest.php";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7bc8ed0abe9d2fc50e676222891ede1a";s:4:"name";s:60:"Symfony/Component/HttpFoundation/Tests/ApacheRequestTest.php";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"806f7315eef4b6abdbe35a22c50369c0";s:4:"name";s:65:"Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1c7af317329cb2e4dae2e8582c090aad";s:4:"name";s:53:"Symfony/Component/HttpFoundation/Tests/CookieTest.php";s:4:"role";s:4:"test";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f156d2ad465b76775f67bdbf386083b3";s:4:"name";s:71:"Symfony/Component/HttpFoundation/Tests/ExpressionRequestMatcherTest.php";s:4:"role";s:4:"test";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7a08ef205764facbe5646cd24074c937";s:4:"name";s:56:"Symfony/Component/HttpFoundation/Tests/File/FileTest.php";s:4:"role";s:4:"test";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8fa14cdd754f91cc6554c9e71929cce7";s:4:"name";s:70:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/.unknownextension";s:4:"role";s:4:"test";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:69:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/directory/.empty";s:4:"role";s:4:"test";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87aec5a94c94ec7a5dd1c0839eb0182b";s:4:"name";s:57:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/test";s:4:"role";s:4:"test";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87aec5a94c94ec7a5dd1c0839eb0182b";s:4:"name";s:61:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/test.gif";s:4:"role";s:4:"test";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a167d71d8028a1eda64cc8d899f5f6e3";s:4:"name";s:69:"Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php";s:4:"role";s:4:"test";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7b45d61227c547c01973ae0d48082796";s:4:"name";s:64:"Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php";s:4:"role";s:4:"test";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"17f9729e4532b0faed835935233250d0";s:4:"name";s:54:"Symfony/Component/HttpFoundation/Tests/FileBagTest.php";s:4:"role";s:4:"test";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2ca1229b730159f6f7bf2ecfec49825";s:4:"name";s:56:"Symfony/Component/HttpFoundation/Tests/HeaderBagTest.php";s:4:"role";s:4:"test";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6c47d0ca15feaad0e369dd514101b100";s:4:"name";s:54:"Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php";s:4:"role";s:4:"test";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b443a39c7580eab6e59f53022284ae0";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Tests/JsonResponseTest.php";s:4:"role";s:4:"test";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"019b8d85e6f650aed3292af213a0643c";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php";s:4:"role";s:4:"test";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2379f3910f6f55a3c72315a25dfdf388";s:4:"name";s:63:"Symfony/Component/HttpFoundation/Tests/RedirectResponseTest.php";s:4:"role";s:4:"test";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"99352f4118b2c568fda24db10858555c";s:4:"name";s:61:"Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php";s:4:"role";s:4:"test";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5ab9a5e9dda53ed1f022634f8136d4fd";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Tests/RequestStackTest.php";s:4:"role";s:4:"test";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6406b7aabef145bb68b018da2b9d7780";s:4:"name";s:54:"Symfony/Component/HttpFoundation/Tests/RequestTest.php";s:4:"role";s:4:"test";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e268328250a58f53892622dff9ed2b37";s:4:"name";s:64:"Symfony/Component/HttpFoundation/Tests/ResponseHeaderBagTest.php";s:4:"role";s:4:"test";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a17240ff298468ada33c1f15e3ec5012";s:4:"name";s:55:"Symfony/Component/HttpFoundation/Tests/ResponseTest.php";s:4:"role";s:4:"test";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a86e8988d2cf1a094322bfd0b38c045";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Tests/ResponseTestCase.php";s:4:"role";s:4:"test";}}i:92;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"feb7545b69e0eda1a61be511e9135582";s:4:"name";s:56:"Symfony/Component/HttpFoundation/Tests/ServerBagTest.php";s:4:"role";s:4:"test";}}i:93;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fbcb35c2d86007ac5311394d67081cda";s:4:"name";s:77:"Symfony/Component/HttpFoundation/Tests/Session/Attribute/AttributeBagTest.php";s:4:"role";s:4:"test";}}i:94;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c281ff06081b6ae87f4356f37a2814e1";s:4:"name";s:87:"Symfony/Component/HttpFoundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php";s:4:"role";s:4:"test";}}i:95;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"763835431c792f3e0b5bbba96794542a";s:4:"name";s:79:"Symfony/Component/HttpFoundation/Tests/Session/Flash/AutoExpireFlashBagTest.php";s:4:"role";s:4:"test";}}i:96;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"18cf905cc6ead1acbf260f484564425f";s:4:"name";s:69:"Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php";s:4:"role";s:4:"test";}}i:97;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6a494d5992105e3ebe9c391b7d6f6a63";s:4:"name";s:62:"Symfony/Component/HttpFoundation/Tests/Session/SessionTest.php";s:4:"role";s:4:"test";}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f44ffbb61b65fe70de11d6469e48832a";s:4:"name";s:94:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php";s:4:"role";s:4:"test";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c7f7e944a63d1af11e55e6ec4a9374b2";s:4:"name";s:93:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php";s:4:"role";s:4:"test";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2f1f103720b87b039183451427d74c4";s:4:"name";s:92:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php";s:4:"role";s:4:"test";}}i:101;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8fa508beab426cea19a2cedabd5e9171";s:4:"name";s:95:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php";s:4:"role";s:4:"test";}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"45eae4ba5310a98dc04fcadf82bf720d";s:4:"name";s:91:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php";s:4:"role";s:4:"test";}}i:103;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2c0feb6c09d60d7e5926ea5a8da36080";s:4:"name";s:89:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php";s:4:"role";s:4:"test";}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f36ec391bb99db52a49f7ca30360ea26";s:4:"name";s:88:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php";s:4:"role";s:4:"test";}}i:105;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"11d0598235d0d7f8098bdc2145d9d69b";s:4:"name";s:95:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php";s:4:"role";s:4:"test";}}i:106;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fc2af1f274721774e972a5758278c8f3";s:4:"name";s:74:"Symfony/Component/HttpFoundation/Tests/Session/Storage/MetadataBagTest.php";s:4:"role";s:4:"test";}}i:107;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87a2d57546023c4094f6be942a4b13c2";s:4:"name";s:86:"Symfony/Component/HttpFoundation/Tests/Session/Storage/MockArraySessionStorageTest.php";s:4:"role";s:4:"test";}}i:108;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"592ade20d8c465762c8e5a121d60ac52";s:4:"name";s:85:"Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php";s:4:"role";s:4:"test";}}i:109;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bbc650e69324fd0d48491db754f248e4";s:4:"name";s:83:"Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php";s:4:"role";s:4:"test";}}i:110;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b10ca7f822772f799c1f1e68ad9eaf55";s:4:"name";s:86:"Symfony/Component/HttpFoundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php";s:4:"role";s:4:"test";}}i:111;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"da5bd63668cf3a8b28b6190b22b3271a";s:4:"name";s:82:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php";s:4:"role";s:4:"test";}}i:112;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1baf3702ba27dc4cfdfe750f18bd8b39";s:4:"name";s:80:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/NativeProxyTest.php";s:4:"role";s:4:"test";}}i:113;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e2a32ca244d28b43eb7a15edbb1f65c2";s:4:"name";s:88:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php";s:4:"role";s:4:"test";}}i:114;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"73647306210e7be2a18cf3a523275748";s:4:"name";s:63:"Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:115:{s:49:"Symfony/Component/HttpFoundation/AcceptHeader.php";a:4:{s:6:"md5sum";s:32:"b884647f8a23d1ceb94626f3dbeb5b9e";s:4:"name";s:49:"Symfony/Component/HttpFoundation/AcceptHeader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/AcceptHeader.php";}s:53:"Symfony/Component/HttpFoundation/AcceptHeaderItem.php";a:4:{s:6:"md5sum";s:32:"2dc45b1974c5106ad115c8853e6ec45d";s:4:"name";s:53:"Symfony/Component/HttpFoundation/AcceptHeaderItem.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/AcceptHeaderItem.php";}s:50:"Symfony/Component/HttpFoundation/ApacheRequest.php";a:4:{s:6:"md5sum";s:32:"428aaf05f7b32d9b5b0f21b5ff926bf0";s:4:"name";s:50:"Symfony/Component/HttpFoundation/ApacheRequest.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/ApacheRequest.php";}s:47:"Symfony/Component/HttpFoundation/autoloader.php";a:4:{s:6:"md5sum";s:32:"7bfad2b6b760e66d943597d5dd7491a5";s:4:"name";s:47:"Symfony/Component/HttpFoundation/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/autoloader.php";}s:55:"Symfony/Component/HttpFoundation/BinaryFileResponse.php";a:4:{s:6:"md5sum";s:32:"1aa7a69563a388fd41290f35c444aaad";s:4:"name";s:55:"Symfony/Component/HttpFoundation/BinaryFileResponse.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/BinaryFileResponse.php";}s:45:"Symfony/Component/HttpFoundation/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"13f2dd00d17037b16bc5f880141269f1";s:4:"name";s:45:"Symfony/Component/HttpFoundation/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/doc/pear/HttpFoundation/Symfony/Component/HttpFoundation/CHANGELOG.md";}s:46:"Symfony/Component/HttpFoundation/composer.json";a:4:{s:6:"md5sum";s:32:"6f84da0f8178f7302a88987dae7cd454";s:4:"name";s:46:"Symfony/Component/HttpFoundation/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/doc/pear/HttpFoundation/Symfony/Component/HttpFoundation/composer.json";}s:43:"Symfony/Component/HttpFoundation/Cookie.php";a:4:{s:6:"md5sum";s:32:"1d21e30974e0cd17909cbd83570e6046";s:4:"name";s:43:"Symfony/Component/HttpFoundation/Cookie.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Cookie.php";}s:61:"Symfony/Component/HttpFoundation/ExpressionRequestMatcher.php";a:4:{s:6:"md5sum";s:32:"bb322f1b660d8526d54738c96bcc9496";s:4:"name";s:61:"Symfony/Component/HttpFoundation/ExpressionRequestMatcher.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/ExpressionRequestMatcher.php";}s:73:"Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php";a:4:{s:6:"md5sum";s:32:"f857d7f53c52b92f5b86304b3380b099";s:4:"name";s:73:"Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php";}s:65:"Symfony/Component/HttpFoundation/File/Exception/FileException.php";a:4:{s:6:"md5sum";s:32:"82953ad2af851c787ed55bf754510432";s:4:"name";s:65:"Symfony/Component/HttpFoundation/File/Exception/FileException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/Exception/FileException.php";}s:73:"Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php";a:4:{s:6:"md5sum";s:32:"77e5758e36af149ce24c50d5f5c4ac41";s:4:"name";s:73:"Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php";}s:75:"Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php";a:4:{s:6:"md5sum";s:32:"098936dfa215052c68b1002c28d276f4";s:4:"name";s:75:"Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php";}s:67:"Symfony/Component/HttpFoundation/File/Exception/UploadException.php";a:4:{s:6:"md5sum";s:32:"ad5b16c066a5f89c35c5117ebc1d53ea";s:4:"name";s:67:"Symfony/Component/HttpFoundation/File/Exception/UploadException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/Exception/UploadException.php";}s:46:"Symfony/Component/HttpFoundation/File/File.php";a:4:{s:6:"md5sum";s:32:"94d1593cd9789142752a88ccb73cc430";s:4:"name";s:46:"Symfony/Component/HttpFoundation/File/File.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/File.php";}s:67:"Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php";a:4:{s:6:"md5sum";s:32:"86252c17f16fc39143aad01fd9240645";s:4:"name";s:67:"Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php";}s:76:"Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php";a:4:{s:6:"md5sum";s:32:"5fe7bad1c2c974c75aa2c3930334f702";s:4:"name";s:76:"Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php";}s:76:"Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php";a:4:{s:6:"md5sum";s:32:"94700d9406139019d43f5f8c76177ef1";s:4:"name";s:76:"Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php";}s:74:"Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php";a:4:{s:6:"md5sum";s:32:"f0cd17205bf9382d367e9921ceab5d88";s:4:"name";s:74:"Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php";}s:75:"Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php";a:4:{s:6:"md5sum";s:32:"f2f92703a5eb0dc3c2a700de6bc6d6e1";s:4:"name";s:75:"Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php";}s:66:"Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php";a:4:{s:6:"md5sum";s:32:"f0f9de1376a61059af6fa4e90fbd5a13";s:4:"name";s:66:"Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php";}s:75:"Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php";a:4:{s:6:"md5sum";s:32:"d0a415ee45ad0bd75cdb2032c2cae123";s:4:"name";s:75:"Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php";}s:54:"Symfony/Component/HttpFoundation/File/UploadedFile.php";a:4:{s:6:"md5sum";s:32:"a8f763ea3e59a4ff37cee3af896eb323";s:4:"name";s:54:"Symfony/Component/HttpFoundation/File/UploadedFile.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/UploadedFile.php";}s:44:"Symfony/Component/HttpFoundation/FileBag.php";a:4:{s:6:"md5sum";s:32:"b4ca9658eb9774373d5bf710c2300638";s:4:"name";s:44:"Symfony/Component/HttpFoundation/FileBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/FileBag.php";}s:46:"Symfony/Component/HttpFoundation/HeaderBag.php";a:4:{s:6:"md5sum";s:32:"1f23e1af0de42dd915e7a807fa1527f6";s:4:"name";s:46:"Symfony/Component/HttpFoundation/HeaderBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/HeaderBag.php";}s:44:"Symfony/Component/HttpFoundation/IpUtils.php";a:4:{s:6:"md5sum";s:32:"45993bfa467d14b903e20885e6a2cf89";s:4:"name";s:44:"Symfony/Component/HttpFoundation/IpUtils.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/IpUtils.php";}s:49:"Symfony/Component/HttpFoundation/JsonResponse.php";a:4:{s:6:"md5sum";s:32:"b4c78dc282e052cb8859f763aedf2805";s:4:"name";s:49:"Symfony/Component/HttpFoundation/JsonResponse.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/JsonResponse.php";}s:40:"Symfony/Component/HttpFoundation/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:40:"Symfony/Component/HttpFoundation/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/doc/pear/HttpFoundation/Symfony/Component/HttpFoundation/LICENSE";}s:49:"Symfony/Component/HttpFoundation/ParameterBag.php";a:4:{s:6:"md5sum";s:32:"e223bb93e05d1476b5f12488151a825c";s:4:"name";s:49:"Symfony/Component/HttpFoundation/ParameterBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/ParameterBag.php";}s:49:"Symfony/Component/HttpFoundation/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"169b47a2f05c53335bca6becdd389220";s:4:"name";s:49:"Symfony/Component/HttpFoundation/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/phpunit.xml.dist";}s:42:"Symfony/Component/HttpFoundation/README.md";a:4:{s:6:"md5sum";s:32:"7851474c7a43a34dd6639f5a126c8bba";s:4:"name";s:42:"Symfony/Component/HttpFoundation/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/doc/pear/HttpFoundation/Symfony/Component/HttpFoundation/README.md";}s:53:"Symfony/Component/HttpFoundation/RedirectResponse.php";a:4:{s:6:"md5sum";s:32:"0517940c519e1e6efeb564c84edda69c";s:4:"name";s:53:"Symfony/Component/HttpFoundation/RedirectResponse.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/RedirectResponse.php";}s:44:"Symfony/Component/HttpFoundation/Request.php";a:4:{s:6:"md5sum";s:32:"bd5c61af6d0cbe7f7edbba3736b87d3b";s:4:"name";s:44:"Symfony/Component/HttpFoundation/Request.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Request.php";}s:51:"Symfony/Component/HttpFoundation/RequestMatcher.php";a:4:{s:6:"md5sum";s:32:"970df6f9df3bf9150a685c6c6c3f6aa1";s:4:"name";s:51:"Symfony/Component/HttpFoundation/RequestMatcher.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/RequestMatcher.php";}s:60:"Symfony/Component/HttpFoundation/RequestMatcherInterface.php";a:4:{s:6:"md5sum";s:32:"7ecc8861d7377c89a003417ab5db02bf";s:4:"name";s:60:"Symfony/Component/HttpFoundation/RequestMatcherInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/RequestMatcherInterface.php";}s:49:"Symfony/Component/HttpFoundation/RequestStack.php";a:4:{s:6:"md5sum";s:32:"37fd73c5d42a949fff23de4fa0d15b48";s:4:"name";s:49:"Symfony/Component/HttpFoundation/RequestStack.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/RequestStack.php";}s:76:"Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php";a:4:{s:6:"md5sum";s:32:"94ad98f4affa4224d887336c1f3ea1dc";s:4:"name";s:76:"Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php";}s:45:"Symfony/Component/HttpFoundation/Response.php";a:4:{s:6:"md5sum";s:32:"cc8f30d1b460ddd2cc4913bfcd3e78b4";s:4:"name";s:45:"Symfony/Component/HttpFoundation/Response.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Response.php";}s:54:"Symfony/Component/HttpFoundation/ResponseHeaderBag.php";a:4:{s:6:"md5sum";s:32:"02ccee91a765c8b71e997a5a1885a82d";s:4:"name";s:54:"Symfony/Component/HttpFoundation/ResponseHeaderBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/ResponseHeaderBag.php";}s:46:"Symfony/Component/HttpFoundation/ServerBag.php";a:4:{s:6:"md5sum";s:32:"f0ac2d2b1071ccec5884200d0ab5e420";s:4:"name";s:46:"Symfony/Component/HttpFoundation/ServerBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/ServerBag.php";}s:67:"Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php";a:4:{s:6:"md5sum";s:32:"09a642bc5ffa1e2e7cb7aad84cdbc755";s:4:"name";s:67:"Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php";}s:76:"Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php";a:4:{s:6:"md5sum";s:32:"47cf442d27aa801d2ee1c43eb1b92ab6";s:4:"name";s:76:"Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php";}s:77:"Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php";a:4:{s:6:"md5sum";s:32:"bb24d40c233c7edbeaed0286f399d22d";s:4:"name";s:77:"Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php";}s:69:"Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php";a:4:{s:6:"md5sum";s:32:"47e8fa7a8f184ec2bef7e90741a030bb";s:4:"name";s:69:"Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php";}s:59:"Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php";a:4:{s:6:"md5sum";s:32:"fd24bb3a7c43f869f28c5f27e08bb257";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php";}s:68:"Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php";a:4:{s:6:"md5sum";s:32:"3ecf0692351b914a8822f5138d801682";s:4:"name";s:68:"Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php";}s:52:"Symfony/Component/HttpFoundation/Session/Session.php";a:4:{s:6:"md5sum";s:32:"b25cb46112eac2e01f6d48a0c89c4716";s:4:"name";s:52:"Symfony/Component/HttpFoundation/Session/Session.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Session.php";}s:64:"Symfony/Component/HttpFoundation/Session/SessionBagInterface.php";a:4:{s:6:"md5sum";s:32:"baa130a80f887fca702556b7cb7ac61e";s:4:"name";s:64:"Symfony/Component/HttpFoundation/Session/SessionBagInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php";}s:61:"Symfony/Component/HttpFoundation/Session/SessionInterface.php";a:4:{s:6:"md5sum";s:32:"33e385a590e619684d37bead5b90a7eb";s:4:"name";s:61:"Symfony/Component/HttpFoundation/Session/SessionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/SessionInterface.php";}s:84:"Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php";a:4:{s:6:"md5sum";s:32:"93364ba7a594762ef28e712bb9dd7e48";s:4:"name";s:84:"Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php";}s:83:"Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php";a:4:{s:6:"md5sum";s:32:"6c4948a4a2c2400936ecf7552e67f7d3";s:4:"name";s:83:"Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php";}s:82:"Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php";a:4:{s:6:"md5sum";s:32:"3b8368e6dcaa7edfd508726ebf1d0a5a";s:4:"name";s:82:"Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php";}s:85:"Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php";a:4:{s:6:"md5sum";s:32:"fe93aa5204757c30501b59d3ab98550b";s:4:"name";s:85:"Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php";}s:81:"Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php";a:4:{s:6:"md5sum";s:32:"36574daf922d67815c3efda0063b7af2";s:4:"name";s:81:"Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php";}s:79:"Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php";a:4:{s:6:"md5sum";s:32:"26845162d0cd8e65c3524bf2413b6025";s:4:"name";s:79:"Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php";}s:78:"Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php";a:4:{s:6:"md5sum";s:32:"5d66bb0aff4e6e04dea4a71dc6b74f2d";s:4:"name";s:78:"Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php";}s:85:"Symfony/Component/HttpFoundation/Session/Storage/Handler/WriteCheckSessionHandler.php";a:4:{s:6:"md5sum";s:32:"d5cc5b83b3809aa9cbe8023c7cfd3845";s:4:"name";s:85:"Symfony/Component/HttpFoundation/Session/Storage/Handler/WriteCheckSessionHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Handler/WriteCheckSessionHandler.php";}s:64:"Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php";a:4:{s:6:"md5sum";s:32:"0ba968002df893468d99e77dfde92b95";s:4:"name";s:64:"Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php";}s:76:"Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php";a:4:{s:6:"md5sum";s:32:"b8d920694b05fe7820867c8271e5b519";s:4:"name";s:76:"Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php";}s:75:"Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php";a:4:{s:6:"md5sum";s:32:"bbe1e2bea9239bfe24e45baadb6a330d";s:4:"name";s:75:"Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php";}s:73:"Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php";a:4:{s:6:"md5sum";s:32:"7b886167def5c49469577a533a4c2f6c";s:4:"name";s:73:"Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php";}s:76:"Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php";a:4:{s:6:"md5sum";s:32:"d5a28453f64db20f1d07f28af5213cfb";s:4:"name";s:76:"Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php";}s:72:"Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php";a:4:{s:6:"md5sum";s:32:"3b9152152614a4e0d7886d16e8162926";s:4:"name";s:72:"Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php";}s:70:"Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php";a:4:{s:6:"md5sum";s:32:"4da090373635a3ca9732171dadfd4ed0";s:4:"name";s:70:"Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php";}s:78:"Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php";a:4:{s:6:"md5sum";s:32:"1436f383c0e3500de401861230f5400a";s:4:"name";s:78:"Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php";}s:76:"Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php";a:4:{s:6:"md5sum";s:32:"af85e7a0bab5c49be82a9244b4cde282";s:4:"name";s:76:"Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php";}s:53:"Symfony/Component/HttpFoundation/StreamedResponse.php";a:4:{s:6:"md5sum";s:32:"4b1b42d5e606ea929c4406f32826fcca";s:4:"name";s:53:"Symfony/Component/HttpFoundation/StreamedResponse.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/StreamedResponse.php";}s:63:"Symfony/Component/HttpFoundation/Tests/AcceptHeaderItemTest.php";a:4:{s:6:"md5sum";s:32:"71279e63c94c58a19de6c9bfe9183847";s:4:"name";s:63:"Symfony/Component/HttpFoundation/Tests/AcceptHeaderItemTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderItemTest.php";}s:59:"Symfony/Component/HttpFoundation/Tests/AcceptHeaderTest.php";a:4:{s:6:"md5sum";s:32:"ca12f957cfb0c92c2f8715b455f29607";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Tests/AcceptHeaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderTest.php";}s:60:"Symfony/Component/HttpFoundation/Tests/ApacheRequestTest.php";a:4:{s:6:"md5sum";s:32:"7bc8ed0abe9d2fc50e676222891ede1a";s:4:"name";s:60:"Symfony/Component/HttpFoundation/Tests/ApacheRequestTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/ApacheRequestTest.php";}s:65:"Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php";a:4:{s:6:"md5sum";s:32:"806f7315eef4b6abdbe35a22c50369c0";s:4:"name";s:65:"Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php";}s:53:"Symfony/Component/HttpFoundation/Tests/CookieTest.php";a:4:{s:6:"md5sum";s:32:"1c7af317329cb2e4dae2e8582c090aad";s:4:"name";s:53:"Symfony/Component/HttpFoundation/Tests/CookieTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/CookieTest.php";}s:71:"Symfony/Component/HttpFoundation/Tests/ExpressionRequestMatcherTest.php";a:4:{s:6:"md5sum";s:32:"f156d2ad465b76775f67bdbf386083b3";s:4:"name";s:71:"Symfony/Component/HttpFoundation/Tests/ExpressionRequestMatcherTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/ExpressionRequestMatcherTest.php";}s:56:"Symfony/Component/HttpFoundation/Tests/File/FileTest.php";a:4:{s:6:"md5sum";s:32:"7a08ef205764facbe5646cd24074c937";s:4:"name";s:56:"Symfony/Component/HttpFoundation/Tests/File/FileTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File/FileTest.php";}s:70:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/.unknownextension";a:4:{s:6:"md5sum";s:32:"8fa14cdd754f91cc6554c9e71929cce7";s:4:"name";s:70:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/.unknownextension";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/.unknownextension";}s:69:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/directory/.empty";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:69:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/directory/.empty";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/directory/.empty";}s:57:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/test";a:4:{s:6:"md5sum";s:32:"87aec5a94c94ec7a5dd1c0839eb0182b";s:4:"name";s:57:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/test";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/test";}s:61:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/test.gif";a:4:{s:6:"md5sum";s:32:"87aec5a94c94ec7a5dd1c0839eb0182b";s:4:"name";s:61:"Symfony/Component/HttpFoundation/Tests/File/Fixtures/test.gif";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/test.gif";}s:69:"Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php";a:4:{s:6:"md5sum";s:32:"a167d71d8028a1eda64cc8d899f5f6e3";s:4:"name";s:69:"Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php";}s:64:"Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php";a:4:{s:6:"md5sum";s:32:"7b45d61227c547c01973ae0d48082796";s:4:"name";s:64:"Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php";}s:54:"Symfony/Component/HttpFoundation/Tests/FileBagTest.php";a:4:{s:6:"md5sum";s:32:"17f9729e4532b0faed835935233250d0";s:4:"name";s:54:"Symfony/Component/HttpFoundation/Tests/FileBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/FileBagTest.php";}s:56:"Symfony/Component/HttpFoundation/Tests/HeaderBagTest.php";a:4:{s:6:"md5sum";s:32:"c2ca1229b730159f6f7bf2ecfec49825";s:4:"name";s:56:"Symfony/Component/HttpFoundation/Tests/HeaderBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/HeaderBagTest.php";}s:54:"Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php";a:4:{s:6:"md5sum";s:32:"6c47d0ca15feaad0e369dd514101b100";s:4:"name";s:54:"Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php";}s:59:"Symfony/Component/HttpFoundation/Tests/JsonResponseTest.php";a:4:{s:6:"md5sum";s:32:"3b443a39c7580eab6e59f53022284ae0";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Tests/JsonResponseTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/JsonResponseTest.php";}s:59:"Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php";a:4:{s:6:"md5sum";s:32:"019b8d85e6f650aed3292af213a0643c";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php";}s:63:"Symfony/Component/HttpFoundation/Tests/RedirectResponseTest.php";a:4:{s:6:"md5sum";s:32:"2379f3910f6f55a3c72315a25dfdf388";s:4:"name";s:63:"Symfony/Component/HttpFoundation/Tests/RedirectResponseTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/RedirectResponseTest.php";}s:61:"Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php";a:4:{s:6:"md5sum";s:32:"99352f4118b2c568fda24db10858555c";s:4:"name";s:61:"Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php";}s:59:"Symfony/Component/HttpFoundation/Tests/RequestStackTest.php";a:4:{s:6:"md5sum";s:32:"5ab9a5e9dda53ed1f022634f8136d4fd";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Tests/RequestStackTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/RequestStackTest.php";}s:54:"Symfony/Component/HttpFoundation/Tests/RequestTest.php";a:4:{s:6:"md5sum";s:32:"6406b7aabef145bb68b018da2b9d7780";s:4:"name";s:54:"Symfony/Component/HttpFoundation/Tests/RequestTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/RequestTest.php";}s:64:"Symfony/Component/HttpFoundation/Tests/ResponseHeaderBagTest.php";a:4:{s:6:"md5sum";s:32:"e268328250a58f53892622dff9ed2b37";s:4:"name";s:64:"Symfony/Component/HttpFoundation/Tests/ResponseHeaderBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/ResponseHeaderBagTest.php";}s:55:"Symfony/Component/HttpFoundation/Tests/ResponseTest.php";a:4:{s:6:"md5sum";s:32:"a17240ff298468ada33c1f15e3ec5012";s:4:"name";s:55:"Symfony/Component/HttpFoundation/Tests/ResponseTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php";}s:59:"Symfony/Component/HttpFoundation/Tests/ResponseTestCase.php";a:4:{s:6:"md5sum";s:32:"3a86e8988d2cf1a094322bfd0b38c045";s:4:"name";s:59:"Symfony/Component/HttpFoundation/Tests/ResponseTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/ResponseTestCase.php";}s:56:"Symfony/Component/HttpFoundation/Tests/ServerBagTest.php";a:4:{s:6:"md5sum";s:32:"feb7545b69e0eda1a61be511e9135582";s:4:"name";s:56:"Symfony/Component/HttpFoundation/Tests/ServerBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/ServerBagTest.php";}s:77:"Symfony/Component/HttpFoundation/Tests/Session/Attribute/AttributeBagTest.php";a:4:{s:6:"md5sum";s:32:"fbcb35c2d86007ac5311394d67081cda";s:4:"name";s:77:"Symfony/Component/HttpFoundation/Tests/Session/Attribute/AttributeBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/AttributeBagTest.php";}s:87:"Symfony/Component/HttpFoundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php";a:4:{s:6:"md5sum";s:32:"c281ff06081b6ae87f4356f37a2814e1";s:4:"name";s:87:"Symfony/Component/HttpFoundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:137:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php";}s:79:"Symfony/Component/HttpFoundation/Tests/Session/Flash/AutoExpireFlashBagTest.php";a:4:{s:6:"md5sum";s:32:"763835431c792f3e0b5bbba96794542a";s:4:"name";s:79:"Symfony/Component/HttpFoundation/Tests/Session/Flash/AutoExpireFlashBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:129:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/AutoExpireFlashBagTest.php";}s:69:"Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php";a:4:{s:6:"md5sum";s:32:"18cf905cc6ead1acbf260f484564425f";s:4:"name";s:69:"Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php";}s:62:"Symfony/Component/HttpFoundation/Tests/Session/SessionTest.php";a:4:{s:6:"md5sum";s:32:"6a494d5992105e3ebe9c391b7d6f6a63";s:4:"name";s:62:"Symfony/Component/HttpFoundation/Tests/Session/SessionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/SessionTest.php";}s:94:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php";a:4:{s:6:"md5sum";s:32:"f44ffbb61b65fe70de11d6469e48832a";s:4:"name";s:94:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:144:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php";}s:93:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php";a:4:{s:6:"md5sum";s:32:"c7f7e944a63d1af11e55e6ec4a9374b2";s:4:"name";s:93:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:143:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php";}s:92:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php";a:4:{s:6:"md5sum";s:32:"c2f1f103720b87b039183451427d74c4";s:4:"name";s:92:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:142:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php";}s:95:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php";a:4:{s:6:"md5sum";s:32:"8fa508beab426cea19a2cedabd5e9171";s:4:"name";s:95:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:145:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php";}s:91:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php";a:4:{s:6:"md5sum";s:32:"45eae4ba5310a98dc04fcadf82bf720d";s:4:"name";s:91:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:141:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php";}s:89:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php";a:4:{s:6:"md5sum";s:32:"2c0feb6c09d60d7e5926ea5a8da36080";s:4:"name";s:89:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:139:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php";}s:88:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php";a:4:{s:6:"md5sum";s:32:"f36ec391bb99db52a49f7ca30360ea26";s:4:"name";s:88:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:138:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php";}s:95:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php";a:4:{s:6:"md5sum";s:32:"11d0598235d0d7f8098bdc2145d9d69b";s:4:"name";s:95:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:145:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php";}s:74:"Symfony/Component/HttpFoundation/Tests/Session/Storage/MetadataBagTest.php";a:4:{s:6:"md5sum";s:32:"fc2af1f274721774e972a5758278c8f3";s:4:"name";s:74:"Symfony/Component/HttpFoundation/Tests/Session/Storage/MetadataBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MetadataBagTest.php";}s:86:"Symfony/Component/HttpFoundation/Tests/Session/Storage/MockArraySessionStorageTest.php";a:4:{s:6:"md5sum";s:32:"87a2d57546023c4094f6be942a4b13c2";s:4:"name";s:86:"Symfony/Component/HttpFoundation/Tests/Session/Storage/MockArraySessionStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockArraySessionStorageTest.php";}s:85:"Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php";a:4:{s:6:"md5sum";s:32:"592ade20d8c465762c8e5a121d60ac52";s:4:"name";s:85:"Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php";}s:83:"Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php";a:4:{s:6:"md5sum";s:32:"bbc650e69324fd0d48491db754f248e4";s:4:"name";s:83:"Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:133:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php";}s:86:"Symfony/Component/HttpFoundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php";a:4:{s:6:"md5sum";s:32:"b10ca7f822772f799c1f1e68ad9eaf55";s:4:"name";s:86:"Symfony/Component/HttpFoundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php";}s:82:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php";a:4:{s:6:"md5sum";s:32:"da5bd63668cf3a8b28b6190b22b3271a";s:4:"name";s:82:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:132:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php";}s:80:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/NativeProxyTest.php";a:4:{s:6:"md5sum";s:32:"1baf3702ba27dc4cfdfe750f18bd8b39";s:4:"name";s:80:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/NativeProxyTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/NativeProxyTest.php";}s:88:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php";a:4:{s:6:"md5sum";s:32:"e2a32ca244d28b43eb7a15edbb1f65c2";s:4:"name";s:88:"Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:138:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php";}s:63:"Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php";a:4:{s:6:"md5sum";s:32:"73647306210e7be2a18cf3a523275748";s:4:"name";s:63:"Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:33:{s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:81:"/opt/alt/php54/usr/share/doc/pear/HttpFoundation/Symfony/Component/HttpFoundation";b:1;s:66:"/opt/alt/php54/usr/share/doc/pear/HttpFoundation/Symfony/Component";b:1;s:56:"/opt/alt/php54/usr/share/doc/pear/HttpFoundation/Symfony";b:1;s:48:"/opt/alt/php54/usr/share/doc/pear/HttpFoundation";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/Exception";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File";b:1;s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/File/MimeType";b:1;s:82:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation";b:1;s:67:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component";b:1;s:57:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony";b:1;s:49:"/opt/alt/php54/usr/share/pear/test/HttpFoundation";b:1;s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Resources/stubs";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Resources";b:1;s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Attribute";b:1;s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session";b:1;s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Flash";b:1;s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Handler";b:1;s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage";b:1;s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpFoundation/Session/Storage/Proxy";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests";b:1;s:93:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File";b:1;s:102:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures";b:1;s:112:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/directory";b:1;s:102:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/File/MimeType";b:1;s:106:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute";b:1;s:96:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session";b:1;s:102:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Flash";b:1;s:112:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler";b:1;s:104:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage";b:1;s:110:"/opt/alt/php54/usr/share/pear/test/HttpFoundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\�K�Z�(�(<pear/.registry/.channel.pear.symfony.com/optionsresolver.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:15:"OptionsResolver";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:34:"Symfony2 OptionsResolver Component";s:11:"description";s:34:"Symfony2 OptionsResolver Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:48";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:14:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a351ecd36b8eb4040ec96d7ec31f606e";s:4:"name";s:48:"Symfony/Component/OptionsResolver/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d028132a61a91d82422a3cc88d3ac8cf";s:4:"name";s:47:"Symfony/Component/OptionsResolver/composer.json";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2ca14134f105bf2a71ed27637b98f09e";s:4:"name";s:66:"Symfony/Component/OptionsResolver/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bd08096bf1d71b06a87f0dcd24f80509";s:4:"name";s:71:"Symfony/Component/OptionsResolver/Exception/InvalidOptionsException.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"712f40bc8e04cfe34ae80939e4a2e355";s:4:"name";s:71:"Symfony/Component/OptionsResolver/Exception/MissingOptionsException.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"024bce08820bd8d6cc23550a23bde693";s:4:"name";s:73:"Symfony/Component/OptionsResolver/Exception/OptionDefinitionException.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:41:"Symfony/Component/OptionsResolver/LICENSE";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dccf3a502dc75c9505bd6bdd739bc6ff";s:4:"name";s:45:"Symfony/Component/OptionsResolver/Options.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"70afa5bf5e189ff6d9d635a45a271619";s:4:"name";s:53:"Symfony/Component/OptionsResolver/OptionsResolver.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ef4778c5c504e26462c4c7125f31c85";s:4:"name";s:62:"Symfony/Component/OptionsResolver/OptionsResolverInterface.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b33f90f18f3c99cc4fbd7a7b80135861";s:4:"name";s:50:"Symfony/Component/OptionsResolver/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87e9152d083c05e57a1617141023e4c0";s:4:"name";s:43:"Symfony/Component/OptionsResolver/README.md";s:4:"role";s:3:"doc";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9e6f46d9615ef96878e18e853f1cf600";s:4:"name";s:63:"Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"db23027503faa4cc9b402a87d5108f24";s:4:"name";s:55:"Symfony/Component/OptionsResolver/Tests/OptionsTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:14:{s:48:"Symfony/Component/OptionsResolver/autoloader.php";a:4:{s:6:"md5sum";s:32:"a351ecd36b8eb4040ec96d7ec31f606e";s:4:"name";s:48:"Symfony/Component/OptionsResolver/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/OptionsResolver/autoloader.php";}s:47:"Symfony/Component/OptionsResolver/composer.json";a:4:{s:6:"md5sum";s:32:"d028132a61a91d82422a3cc88d3ac8cf";s:4:"name";s:47:"Symfony/Component/OptionsResolver/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/doc/pear/OptionsResolver/Symfony/Component/OptionsResolver/composer.json";}s:66:"Symfony/Component/OptionsResolver/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"2ca14134f105bf2a71ed27637b98f09e";s:4:"name";s:66:"Symfony/Component/OptionsResolver/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/OptionsResolver/Exception/ExceptionInterface.php";}s:71:"Symfony/Component/OptionsResolver/Exception/InvalidOptionsException.php";a:4:{s:6:"md5sum";s:32:"bd08096bf1d71b06a87f0dcd24f80509";s:4:"name";s:71:"Symfony/Component/OptionsResolver/Exception/InvalidOptionsException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/OptionsResolver/Exception/InvalidOptionsException.php";}s:71:"Symfony/Component/OptionsResolver/Exception/MissingOptionsException.php";a:4:{s:6:"md5sum";s:32:"712f40bc8e04cfe34ae80939e4a2e355";s:4:"name";s:71:"Symfony/Component/OptionsResolver/Exception/MissingOptionsException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/OptionsResolver/Exception/MissingOptionsException.php";}s:73:"Symfony/Component/OptionsResolver/Exception/OptionDefinitionException.php";a:4:{s:6:"md5sum";s:32:"024bce08820bd8d6cc23550a23bde693";s:4:"name";s:73:"Symfony/Component/OptionsResolver/Exception/OptionDefinitionException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/OptionsResolver/Exception/OptionDefinitionException.php";}s:41:"Symfony/Component/OptionsResolver/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:41:"Symfony/Component/OptionsResolver/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/doc/pear/OptionsResolver/Symfony/Component/OptionsResolver/LICENSE";}s:45:"Symfony/Component/OptionsResolver/Options.php";a:4:{s:6:"md5sum";s:32:"dccf3a502dc75c9505bd6bdd739bc6ff";s:4:"name";s:45:"Symfony/Component/OptionsResolver/Options.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/OptionsResolver/Options.php";}s:53:"Symfony/Component/OptionsResolver/OptionsResolver.php";a:4:{s:6:"md5sum";s:32:"70afa5bf5e189ff6d9d635a45a271619";s:4:"name";s:53:"Symfony/Component/OptionsResolver/OptionsResolver.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/OptionsResolver/OptionsResolver.php";}s:62:"Symfony/Component/OptionsResolver/OptionsResolverInterface.php";a:4:{s:6:"md5sum";s:32:"3ef4778c5c504e26462c4c7125f31c85";s:4:"name";s:62:"Symfony/Component/OptionsResolver/OptionsResolverInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/OptionsResolver/OptionsResolverInterface.php";}s:50:"Symfony/Component/OptionsResolver/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"b33f90f18f3c99cc4fbd7a7b80135861";s:4:"name";s:50:"Symfony/Component/OptionsResolver/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/OptionsResolver/Symfony/Component/OptionsResolver/phpunit.xml.dist";}s:43:"Symfony/Component/OptionsResolver/README.md";a:4:{s:6:"md5sum";s:32:"87e9152d083c05e57a1617141023e4c0";s:4:"name";s:43:"Symfony/Component/OptionsResolver/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/doc/pear/OptionsResolver/Symfony/Component/OptionsResolver/README.md";}s:63:"Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php";a:4:{s:6:"md5sum";s:32:"9e6f46d9615ef96878e18e853f1cf600";s:4:"name";s:63:"Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/OptionsResolver/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php";}s:55:"Symfony/Component/OptionsResolver/Tests/OptionsTest.php";a:4:{s:6:"md5sum";s:32:"db23027503faa4cc9b402a87d5108f24";s:4:"name";s:55:"Symfony/Component/OptionsResolver/Tests/OptionsTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/OptionsResolver/Symfony/Component/OptionsResolver/Tests/OptionsTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:13:{s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/OptionsResolver";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:83:"/opt/alt/php54/usr/share/doc/pear/OptionsResolver/Symfony/Component/OptionsResolver";b:1;s:67:"/opt/alt/php54/usr/share/doc/pear/OptionsResolver/Symfony/Component";b:1;s:57:"/opt/alt/php54/usr/share/doc/pear/OptionsResolver/Symfony";b:1;s:49:"/opt/alt/php54/usr/share/doc/pear/OptionsResolver";b:1;s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/OptionsResolver/Exception";b:1;s:84:"/opt/alt/php54/usr/share/pear/test/OptionsResolver/Symfony/Component/OptionsResolver";b:1;s:68:"/opt/alt/php54/usr/share/pear/test/OptionsResolver/Symfony/Component";b:1;s:58:"/opt/alt/php54/usr/share/pear/test/OptionsResolver/Symfony";b:1;s:50:"/opt/alt/php54/usr/share/pear/test/OptionsResolver";b:1;s:90:"/opt/alt/php54/usr/share/pear/test/OptionsResolver/Symfony/Component/OptionsResolver/Tests";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\>���f�f5pear/.registry/.channel.pear.symfony.com/security.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:8:"Security";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:27:"Symfony2 Security Component";s:11:"description";s:27:"Symfony2 Security Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:49";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:372:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5365c3fd47df815d4353473ac6373ad7";s:4:"name";s:44:"Symfony/Component/Security/Acl/composer.json";s:4:"role";s:3:"doc";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0ecf07a353f03ea4c6976d0cf98d5b51";s:4:"name";s:51:"Symfony/Component/Security/Acl/Dbal/AclProvider.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"333ff4aca2f234109cd7ebe9a03c7f25";s:4:"name";s:58:"Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a38fab3cddce11ba90e1569be5f0d806";s:4:"name";s:46:"Symfony/Component/Security/Acl/Dbal/Schema.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e8f587fcaf0a3057321516e59fc0ce87";s:4:"name";s:45:"Symfony/Component/Security/Acl/Domain/Acl.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cccc32d88c312fb7dac66b08d9e67e45";s:4:"name";s:60:"Symfony/Component/Security/Acl/Domain/AclCollectionCache.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b4fee19b12185f0ee45a2e97f5fcb8a4";s:4:"name";s:53:"Symfony/Component/Security/Acl/Domain/AuditLogger.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2f552f22f35c47d5d523c187d25039eb";s:4:"name";s:58:"Symfony/Component/Security/Acl/Domain/DoctrineAclCache.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7d02a171381bed25a818a33a2a714803";s:4:"name";s:47:"Symfony/Component/Security/Acl/Domain/Entry.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f0b1b92b49934c59ecc126fbb41b72c2";s:4:"name";s:52:"Symfony/Component/Security/Acl/Domain/FieldEntry.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3eadb08eafffe705a6dd8de5f96e1ca1";s:4:"name";s:56:"Symfony/Component/Security/Acl/Domain/ObjectIdentity.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1baa7e094b60dbd7a2eaf4d38b5125cc";s:4:"name";s:73:"Symfony/Component/Security/Acl/Domain/ObjectIdentityRetrievalStrategy.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea6329b78543f0536dc1b2019c291eb2";s:4:"name";s:68:"Symfony/Component/Security/Acl/Domain/PermissionGrantingStrategy.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d082f117ebbe68492e03855adbaa7704";s:4:"name";s:62:"Symfony/Component/Security/Acl/Domain/RoleSecurityIdentity.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2a34925fb304b1a8d724ca4cf2aafb5f";s:4:"name";s:75:"Symfony/Component/Security/Acl/Domain/SecurityIdentityRetrievalStrategy.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e48d7c38d196eea74cf250fcddd8d189";s:4:"name";s:62:"Symfony/Component/Security/Acl/Domain/UserSecurityIdentity.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"82a5465e98dd2475f706a9cacc65db37";s:4:"name";s:70:"Symfony/Component/Security/Acl/Exception/AclAlreadyExistsException.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8b3ec9dfe9d9f345a3ddce26bd4fab8b";s:4:"name";s:65:"Symfony/Component/Security/Acl/Exception/AclNotFoundException.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7e3eb281d553454f0f59d5f282948216";s:4:"name";s:76:"Symfony/Component/Security/Acl/Exception/ConcurrentModificationException.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e3b6ea7de5ec436c7503f1d7312249bc";s:4:"name";s:54:"Symfony/Component/Security/Acl/Exception/Exception.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4be9ba33e0d97e970d6f541480901eb0";s:4:"name";s:73:"Symfony/Component/Security/Acl/Exception/InvalidDomainObjectException.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aca5379067c0fd0c2240eb986eac8268";s:4:"name";s:64:"Symfony/Component/Security/Acl/Exception/NoAceFoundException.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7a0ca03655455c96a2fe053bc72b4de3";s:4:"name";s:69:"Symfony/Component/Security/Acl/Exception/NotAllAclsFoundException.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2415593ec8d8a343e6f4328ddb0c2a1d";s:4:"name";s:66:"Symfony/Component/Security/Acl/Exception/SidNotLoadedException.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:38:"Symfony/Component/Security/Acl/LICENSE";s:4:"role";s:3:"doc";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ab5d60682e988c0e7eb0dd1512dabade";s:4:"name";s:58:"Symfony/Component/Security/Acl/Model/AclCacheInterface.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"870a09318c3c65e3523e19130607f1ab";s:4:"name";s:53:"Symfony/Component/Security/Acl/Model/AclInterface.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7ea089827ee0d4ed26b0d57b8f20dc28";s:4:"name";s:61:"Symfony/Component/Security/Acl/Model/AclProviderInterface.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63c76e68e9ccf7ec307696ac8ca44e8f";s:4:"name";s:62:"Symfony/Component/Security/Acl/Model/AuditableAclInterface.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f989613d6c0286594696efc106774415";s:4:"name";s:64:"Symfony/Component/Security/Acl/Model/AuditableEntryInterface.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c5d9ae1862d7c0a6d442f053d5acac39";s:4:"name";s:61:"Symfony/Component/Security/Acl/Model/AuditLoggerInterface.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4d278f8d01215e4be53a264dad150173";s:4:"name";s:62:"Symfony/Component/Security/Acl/Model/DomainObjectInterface.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"72e6a4f7f0ffe6d84e6e6462827ee54a";s:4:"name";s:55:"Symfony/Component/Security/Acl/Model/EntryInterface.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2968e44f1b60586feb144fe02c5e15c3";s:4:"name";s:60:"Symfony/Component/Security/Acl/Model/FieldEntryInterface.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e1c009bf3a30308c68b2fc8b959fc1d4";s:4:"name";s:60:"Symfony/Component/Security/Acl/Model/MutableAclInterface.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fb020f4efc07611baef0206e0783b87e";s:4:"name";s:68:"Symfony/Component/Security/Acl/Model/MutableAclProviderInterface.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"29d14ee35eebd9faf6d38b97b02ea8cb";s:4:"name";s:64:"Symfony/Component/Security/Acl/Model/ObjectIdentityInterface.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4c49500b0054ee78894935bebed56210";s:4:"name";s:81:"Symfony/Component/Security/Acl/Model/ObjectIdentityRetrievalStrategyInterface.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"713c07bfa636d7d6ad4d85d91b5f4ac4";s:4:"name";s:76:"Symfony/Component/Security/Acl/Model/PermissionGrantingStrategyInterface.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"212111e56b11d7fba72dc585289786cb";s:4:"name";s:66:"Symfony/Component/Security/Acl/Model/SecurityIdentityInterface.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0896de7498e35f5f02a9755832172a96";s:4:"name";s:83:"Symfony/Component/Security/Acl/Model/SecurityIdentityRetrievalStrategyInterface.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"83e5de08b981e358d3daea8b304988ca";s:4:"name";s:64:"Symfony/Component/Security/Acl/Permission/BasicPermissionMap.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7918106bfa1e9cc64ca25efa8f2428f9";s:4:"name";s:57:"Symfony/Component/Security/Acl/Permission/MaskBuilder.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"024f4e1c3b24a5a42fe258e9ed3d83bb";s:4:"name";s:68:"Symfony/Component/Security/Acl/Permission/PermissionMapInterface.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"74a4ed032849f83ee138f3ea572c315f";s:4:"name";s:47:"Symfony/Component/Security/Acl/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5213a3c25b290a621867f47359a85972";s:4:"name";s:40:"Symfony/Component/Security/Acl/README.md";s:4:"role";s:3:"doc";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"29202e9e8819885a0237ad1f5c4f1a3a";s:4:"name";s:60:"Symfony/Component/Security/Acl/Resources/bin/generateSql.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"128855e565e079eb859f350be880f395";s:4:"name";s:55:"Symfony/Component/Security/Acl/Resources/schema/db2.sql";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"61db757bf91fc032fee7a78fe3ca8888";s:4:"name";s:59:"Symfony/Component/Security/Acl/Resources/schema/drizzle.sql";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"be1bec1133a89cf3e7298b380d5dd9a9";s:4:"name";s:57:"Symfony/Component/Security/Acl/Resources/schema/mssql.sql";s:4:"role";s:3:"php";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"626ac34142835a1c4936290b79a05f66";s:4:"name";s:57:"Symfony/Component/Security/Acl/Resources/schema/mysql.sql";s:4:"role";s:3:"php";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6173f90ea584ec65392676ba164d9464";s:4:"name";s:58:"Symfony/Component/Security/Acl/Resources/schema/oracle.sql";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"50585e970a570428d65f9e9507da8aa8";s:4:"name";s:62:"Symfony/Component/Security/Acl/Resources/schema/postgresql.sql";s:4:"role";s:3:"php";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b93a223813116f02a5cba763bd07069a";s:4:"name";s:58:"Symfony/Component/Security/Acl/Resources/schema/sqlite.sql";s:4:"role";s:3:"php";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"357d0712d7b5b92a0d8315364e0518ea";s:4:"name";s:70:"Symfony/Component/Security/Acl/Tests/Dbal/AclProviderBenchmarkTest.php";s:4:"role";s:4:"test";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d332e19775917958bec95d017be52be5";s:4:"name";s:61:"Symfony/Component/Security/Acl/Tests/Dbal/AclProviderTest.php";s:4:"role";s:4:"test";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1a46fcac5ad21b5b28b9590b1b4863fc";s:4:"name";s:68:"Symfony/Component/Security/Acl/Tests/Dbal/MutableAclProviderTest.php";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"70968eae1eaa4395492e7dbd5797be65";s:4:"name";s:55:"Symfony/Component/Security/Acl/Tests/Domain/AclTest.php";s:4:"role";s:4:"test";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86049b2dce3364e94f6683df05125acf";s:4:"name";s:63:"Symfony/Component/Security/Acl/Tests/Domain/AuditLoggerTest.php";s:4:"role";s:4:"test";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"099e0b3bcfdb454e46b46687a38d8a3b";s:4:"name";s:68:"Symfony/Component/Security/Acl/Tests/Domain/DoctrineAclCacheTest.php";s:4:"role";s:4:"test";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4022249f6c81298b7f58ea4653ece650";s:4:"name";s:57:"Symfony/Component/Security/Acl/Tests/Domain/EntryTest.php";s:4:"role";s:4:"test";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f3699fe6be1b8b45c015629251cc6f64";s:4:"name";s:62:"Symfony/Component/Security/Acl/Tests/Domain/FieldEntryTest.php";s:4:"role";s:4:"test";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d56675ee8ce9da6ee089ab1486db1035";s:4:"name";s:83:"Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityRetrievalStrategyTest.php";s:4:"role";s:4:"test";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"af2604cee5638a6e0642f3c1478826c1";s:4:"name";s:66:"Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityTest.php";s:4:"role";s:4:"test";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"75605e8ea69d528cea564242326e8b8d";s:4:"name";s:78:"Symfony/Component/Security/Acl/Tests/Domain/PermissionGrantingStrategyTest.php";s:4:"role";s:4:"test";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b4555d0ee6f2d61a752b0416ee9b79e8";s:4:"name";s:72:"Symfony/Component/Security/Acl/Tests/Domain/RoleSecurityIdentityTest.php";s:4:"role";s:4:"test";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"78c619c9cec05fdf11f5de9d48b56454";s:4:"name";s:85:"Symfony/Component/Security/Acl/Tests/Domain/SecurityIdentityRetrievalStrategyTest.php";s:4:"role";s:4:"test";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"74e0d9ba1641b5cf21905336aca0d348";s:4:"name";s:72:"Symfony/Component/Security/Acl/Tests/Domain/UserSecurityIdentityTest.php";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a353f4f911920e43f2e09ae3ac32d349";s:4:"name";s:74:"Symfony/Component/Security/Acl/Tests/Permission/BasicPermissionMapTest.php";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3546d4afbaf25b0a4d40c216549ee272";s:4:"name";s:67:"Symfony/Component/Security/Acl/Tests/Permission/MaskBuilderTest.php";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3c9129e03017adb641e9268149b935bc";s:4:"name";s:59:"Symfony/Component/Security/Acl/Tests/Voter/AclVoterTest.php";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8cafc8e1f14343b87cb0f58a25f463a0";s:4:"name";s:49:"Symfony/Component/Security/Acl/Voter/AclVoter.php";s:4:"role";s:3:"php";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"180a2b1ab4b985facb353d6edeeb78ce";s:4:"name";s:50:"Symfony/Component/Security/Acl/Voter/FieldVote.php";s:4:"role";s:3:"php";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0fb7efcc9c1574920f39f115e9863b68";s:4:"name";s:41:"Symfony/Component/Security/autoloader.php";s:4:"role";s:3:"php";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2def4fa9f9525638a5a9c6f556ba1386";s:4:"name";s:39:"Symfony/Component/Security/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f0488bd3f14f86892ce93d89dad55776";s:4:"name";s:40:"Symfony/Component/Security/composer.json";s:4:"role";s:3:"doc";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c78d485138ebdc2fa2be48a396cb9ad2";s:4:"name";s:81:"Symfony/Component/Security/Core/Authentication/AuthenticationManagerInterface.php";s:4:"role";s:3:"php";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"61167585d6d54cf1861b70f2344632c1";s:4:"name";s:80:"Symfony/Component/Security/Core/Authentication/AuthenticationProviderManager.php";s:4:"role";s:3:"php";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4a5356ef0cf45593536da075d0d367a1";s:4:"name";s:78:"Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolver.php";s:4:"role";s:3:"php";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dda5e9627c9c68a695cdd5071de86834";s:4:"name";s:87:"Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.php";s:4:"role";s:3:"php";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"00cb0dfecd7dc6fedc2426932405dbec";s:4:"name";s:91:"Symfony/Component/Security/Core/Authentication/Provider/AnonymousAuthenticationProvider.php";s:4:"role";s:3:"php";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"07f5b8692dd849851a84662b9f60b759";s:4:"name";s:91:"Symfony/Component/Security/Core/Authentication/Provider/AuthenticationProviderInterface.php";s:4:"role";s:3:"php";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ccc63dc0c7c865036a3e64fb6819073e";s:4:"name";s:85:"Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php";s:4:"role";s:3:"php";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df05c4c0bdbdb5f00d68909724d552af";s:4:"name";s:98:"Symfony/Component/Security/Core/Authentication/Provider/PreAuthenticatedAuthenticationProvider.php";s:4:"role";s:3:"php";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bdcb91d96aacde5a99192f145495e66e";s:4:"name";s:92:"Symfony/Component/Security/Core/Authentication/Provider/RememberMeAuthenticationProvider.php";s:4:"role";s:3:"php";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"62c25b49d796de82786905533be97a8b";s:4:"name";s:88:"Symfony/Component/Security/Core/Authentication/Provider/SimpleAuthenticationProvider.php";s:4:"role";s:3:"php";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4f720340d1992a6261fc7cf795ca0b4d";s:4:"name";s:86:"Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php";s:4:"role";s:3:"php";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"563ca47a94d2f91eb98c8091590f6ab2";s:4:"name";s:83:"Symfony/Component/Security/Core/Authentication/RememberMe/InMemoryTokenProvider.php";s:4:"role";s:3:"php";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4888d2851eff9cf472a9acf0e93e33a4";s:4:"name";s:77:"Symfony/Component/Security/Core/Authentication/RememberMe/PersistentToken.php";s:4:"role";s:3:"php";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2945e844ab362b935608de1ccf071018";s:4:"name";s:86:"Symfony/Component/Security/Core/Authentication/RememberMe/PersistentTokenInterface.php";s:4:"role";s:3:"php";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5ba08141bb0ac7eb83d877a87e9689ed";s:4:"name";s:84:"Symfony/Component/Security/Core/Authentication/RememberMe/TokenProviderInterface.php";s:4:"role";s:3:"php";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cfc5b482e19a6559b87fa3cc80665720";s:4:"name";s:79:"Symfony/Component/Security/Core/Authentication/SimpleAuthenticatorInterface.php";s:4:"role";s:3:"php";}}i:92;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3dd46ffbfb5919606d71d89c5bf82f97";s:4:"name";s:83:"Symfony/Component/Security/Core/Authentication/SimpleFormAuthenticatorInterface.php";s:4:"role";s:3:"php";}}i:93;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"417cad7687deea94ba31fe8d86fcbdf1";s:4:"name";s:82:"Symfony/Component/Security/Core/Authentication/SimplePreAuthenticatorInterface.php";s:4:"role";s:3:"php";}}i:94;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"50a0fa6d56839562be5866c8a3915497";s:4:"name";s:70:"Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php";s:4:"role";s:3:"php";}}i:95;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4185126f45762b4301b9b6cb2d159bb9";s:4:"name";s:71:"Symfony/Component/Security/Core/Authentication/Token/AnonymousToken.php";s:4:"role";s:3:"php";}}i:96;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e5015c2bc9254901b0255ced46129f93";s:4:"name";s:78:"Symfony/Component/Security/Core/Authentication/Token/PreAuthenticatedToken.php";s:4:"role";s:3:"php";}}i:97;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"822307b7ea3a72ec932599c9bece3a97";s:4:"name";s:72:"Symfony/Component/Security/Core/Authentication/Token/RememberMeToken.php";s:4:"role";s:3:"php";}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4143633b44f1659cf8409a64ca407b51";s:4:"name";s:71:"Symfony/Component/Security/Core/Authentication/Token/TokenInterface.php";s:4:"role";s:3:"php";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4bd196890e484daf675d82322028be1c";s:4:"name";s:78:"Symfony/Component/Security/Core/Authentication/Token/UsernamePasswordToken.php";s:4:"role";s:3:"php";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cdc9190c3179e73eaecdbbbca659b22e";s:4:"name";s:56:"Symfony/Component/Security/Core/AuthenticationEvents.php";s:4:"role";s:3:"php";}}i:101;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4a6916eb9cf4fc40f478dbb623ffdce9";s:4:"name";s:71:"Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php";s:4:"role";s:3:"php";}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2865601c03c45ce3621d9013c5347d9f";s:4:"name";s:80:"Symfony/Component/Security/Core/Authorization/AccessDecisionManagerInterface.php";s:4:"role";s:3:"php";}}i:103;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b7fae5344cfe097002ea98131ce6956";s:4:"name";s:68:"Symfony/Component/Security/Core/Authorization/ExpressionLanguage.php";s:4:"role";s:3:"php";}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f2f64cf4065691e1e0b9c4c0f1425f80";s:4:"name";s:74:"Symfony/Component/Security/Core/Authorization/Voter/AuthenticatedVoter.php";s:4:"role";s:3:"php";}}i:105;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2ea414aff917d1469902138f7e0d5cd0";s:4:"name";s:71:"Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php";s:4:"role";s:3:"php";}}i:106;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"089ca490f923e6a32cf080b0e2a27e2f";s:4:"name";s:74:"Symfony/Component/Security/Core/Authorization/Voter/RoleHierarchyVoter.php";s:4:"role";s:3:"php";}}i:107;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ff0a673dff9312faaebb78b23a04535f";s:4:"name";s:65:"Symfony/Component/Security/Core/Authorization/Voter/RoleVoter.php";s:4:"role";s:3:"php";}}i:108;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"003e7949d849e45e4fdffa9a835a2599";s:4:"name";s:70:"Symfony/Component/Security/Core/Authorization/Voter/VoterInterface.php";s:4:"role";s:3:"php";}}i:109;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"15e1e6270e2d6d3318237d3363338f50";s:4:"name";s:45:"Symfony/Component/Security/Core/composer.json";s:4:"role";s:3:"doc";}}i:110;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a7a02c1c8ee5f97fdc8c267b48ae13ed";s:4:"name";s:63:"Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php";s:4:"role";s:3:"php";}}i:111;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0f16a3510e7372c61dd03b2b3bb7564f";s:4:"name";s:65:"Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php";s:4:"role";s:3:"php";}}i:112;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6c687634e27d9118951ce27c88dfe481";s:4:"name";s:58:"Symfony/Component/Security/Core/Encoder/EncoderFactory.php";s:4:"role";s:3:"php";}}i:113;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1330018384392f42e4b5caa6cb012f95";s:4:"name";s:67:"Symfony/Component/Security/Core/Encoder/EncoderFactoryInterface.php";s:4:"role";s:3:"php";}}i:114;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7cd742b70754d9c9d8f0ca029ef4b64f";s:4:"name";s:72:"Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php";s:4:"role";s:3:"php";}}i:115;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0dde4a14a6d89ad005406ffbf9422d1f";s:4:"name";s:68:"Symfony/Component/Security/Core/Encoder/PasswordEncoderInterface.php";s:4:"role";s:3:"php";}}i:116;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a97a3832eee0a328215a49fb252282fb";s:4:"name";s:65:"Symfony/Component/Security/Core/Encoder/Pbkdf2PasswordEncoder.php";s:4:"role";s:3:"php";}}i:117;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e07d25f0fa35b7bfc88b3d19478da95e";s:4:"name";s:68:"Symfony/Component/Security/Core/Encoder/PlaintextPasswordEncoder.php";s:4:"role";s:3:"php";}}i:118;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e976a22829d8fd7b3a67528c5f68610f";s:4:"name";s:61:"Symfony/Component/Security/Core/Event/AuthenticationEvent.php";s:4:"role";s:3:"php";}}i:119;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c303cb0e16eab8cbaa2d24d416dc89b1";s:4:"name";s:68:"Symfony/Component/Security/Core/Event/AuthenticationFailureEvent.php";s:4:"role";s:3:"php";}}i:120;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"92c25b19f903e89aa16d8cd887600d9b";s:4:"name";s:67:"Symfony/Component/Security/Core/Exception/AccessDeniedException.php";s:4:"role";s:3:"php";}}i:121;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cbaf077cb23fd56e405fe305089be4f1";s:4:"name";s:69:"Symfony/Component/Security/Core/Exception/AccountExpiredException.php";s:4:"role";s:3:"php";}}i:122;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"897def6142e95038f5b7e1be80789952";s:4:"name";s:68:"Symfony/Component/Security/Core/Exception/AccountStatusException.php";s:4:"role";s:3:"php";}}i:123;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f216cb63ef5a186ee50eba5144ceddc7";s:4:"name";s:88:"Symfony/Component/Security/Core/Exception/AuthenticationCredentialsNotFoundException.php";s:4:"role";s:3:"php";}}i:124;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"29cc9dc1a7659e59a786dd9788937455";s:4:"name";s:69:"Symfony/Component/Security/Core/Exception/AuthenticationException.php";s:4:"role";s:3:"php";}}i:125;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9208968ac310a1959595d8bfc270c270";s:4:"name";s:76:"Symfony/Component/Security/Core/Exception/AuthenticationServiceException.php";s:4:"role";s:3:"php";}}i:126;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8dcc2180afe1ca2a5ba64b3b7b9374b7";s:4:"name";s:69:"Symfony/Component/Security/Core/Exception/BadCredentialsException.php";s:4:"role";s:3:"php";}}i:127;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1501fc38bd5c20b9c3bc3fde481d096d";s:4:"name";s:66:"Symfony/Component/Security/Core/Exception/CookieTheftException.php";s:4:"role";s:3:"php";}}i:128;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7f862b829f86bf262fef80f92fa1efd9";s:4:"name";s:73:"Symfony/Component/Security/Core/Exception/CredentialsExpiredException.php";s:4:"role";s:3:"php";}}i:129;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"964e01e15a4fc37e74bf8b832495e786";s:4:"name";s:63:"Symfony/Component/Security/Core/Exception/DisabledException.php";s:4:"role";s:3:"php";}}i:130;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"13fca1be9c3957516e99beb9811cbea5";s:4:"name";s:64:"Symfony/Component/Security/Core/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:131;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"437a16a50032457b90bec37786b55947";s:4:"name";s:81:"Symfony/Component/Security/Core/Exception/InsufficientAuthenticationException.php";s:4:"role";s:3:"php";}}i:132;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5851c6d868699f1dc1e6eccb96793449";s:4:"name";s:70:"Symfony/Component/Security/Core/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";}}i:133;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0822aa405f9ea4d78d55f91c8b74eeb7";s:4:"name";s:71:"Symfony/Component/Security/Core/Exception/InvalidCsrfTokenException.php";s:4:"role";s:3:"php";}}i:134;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5d23c71dcff00d3f9a716115caa7164d";s:4:"name";s:61:"Symfony/Component/Security/Core/Exception/LockedException.php";s:4:"role";s:3:"php";}}i:135;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7e9bb714f4fdc03bf4158d3ebafd9181";s:4:"name";s:61:"Symfony/Component/Security/Core/Exception/LogoutException.php";s:4:"role";s:3:"php";}}i:136;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba9525c7d4bc829f3569f785b9399c18";s:4:"name";s:67:"Symfony/Component/Security/Core/Exception/NonceExpiredException.php";s:4:"role";s:3:"php";}}i:137;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bc44ab7bd2bf3f5118c22c174d164773";s:4:"name";s:71:"Symfony/Component/Security/Core/Exception/ProviderNotFoundException.php";s:4:"role";s:3:"php";}}i:138;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eedf3a5276fc76bb3c7854d3ae9410ea";s:4:"name";s:62:"Symfony/Component/Security/Core/Exception/RuntimeException.php";s:4:"role";s:3:"php";}}i:139;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"67db74104de766f8625e248576f999da";s:4:"name";s:73:"Symfony/Component/Security/Core/Exception/SessionUnavailableException.php";s:4:"role";s:3:"php";}}i:140;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d9b2b76d30d8faa7835d19faa92e7746";s:4:"name";s:68:"Symfony/Component/Security/Core/Exception/TokenNotFoundException.php";s:4:"role";s:3:"php";}}i:141;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6a7031722e579b577881dd26548a2582";s:4:"name";s:70:"Symfony/Component/Security/Core/Exception/UnsupportedUserException.php";s:4:"role";s:3:"php";}}i:142;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1bbd1cdc4a27e69cb001f60f6f17b953";s:4:"name";s:71:"Symfony/Component/Security/Core/Exception/UsernameNotFoundException.php";s:4:"role";s:3:"php";}}i:143;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:39:"Symfony/Component/Security/Core/LICENSE";s:4:"role";s:3:"doc";}}i:144;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b24852b42833e802e562d16e16c4e819";s:4:"name";s:48:"Symfony/Component/Security/Core/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:145;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f20b648364f60e5c4c4093a968fc5331";s:4:"name";s:41:"Symfony/Component/Security/Core/README.md";s:4:"role";s:3:"doc";}}i:146;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1e750b4762305800f3dd181eab53e2ba";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.ar.xlf";s:4:"role";s:3:"php";}}i:147;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"31cbf1bd957d4f4c3401c20d9a1b10bc";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.ca.xlf";s:4:"role";s:3:"php";}}i:148;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0cf2e748f73950fb74f6a5978ab773f4";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.cs.xlf";s:4:"role";s:3:"php";}}i:149;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fcd7c0a40a3a5b074abce43148053890";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.da.xlf";s:4:"role";s:3:"php";}}i:150;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a01afc0ce8bdc7598652c6560fae8512";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.de.xlf";s:4:"role";s:3:"php";}}i:151;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2883d0b5e1e7eeed7ec66ea9853f5cc";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.el.xlf";s:4:"role";s:3:"php";}}i:152;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0c6a0114323a39fad8cb33246be7b7d9";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.en.xlf";s:4:"role";s:3:"php";}}i:153;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7ae3e719888ac0c94aeda98734b5e9f5";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.es.xlf";s:4:"role";s:3:"php";}}i:154;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eef6f0230157636659e13c466e498cd9";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.fa.xlf";s:4:"role";s:3:"php";}}i:155;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d726781df922dfb126eb85c6c1cf7f5";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.fr.xlf";s:4:"role";s:3:"php";}}i:156;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d24525aa71ea6294f1b0dad40d7a5b70";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.gl.xlf";s:4:"role";s:3:"php";}}i:157;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8704be78d7be163b715e166f07257e3";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.hu.xlf";s:4:"role";s:3:"php";}}i:158;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47a2f3df6c37532fe6a486073aebd0a1";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.it.xlf";s:4:"role";s:3:"php";}}i:159;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"defce0bf7d3e026fbdaebb0cfe7abbd6";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.lb.xlf";s:4:"role";s:3:"php";}}i:160;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"79d67b79332d77ce5d39a8531f219538";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.nl.xlf";s:4:"role";s:3:"php";}}i:161;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ca24d84b0c49e93e8425dbc96b5d479";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.no.xlf";s:4:"role";s:3:"php";}}i:162;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f6e927ae45bf961507418d03db1c676d";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.pl.xlf";s:4:"role";s:3:"php";}}i:163;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ff2d10ee020b23d10e8a49c3f72b77af";s:4:"name";s:73:"Symfony/Component/Security/Core/Resources/translations/security.pt_BR.xlf";s:4:"role";s:3:"php";}}i:164;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2855177bf25fd860bca194067f350e0a";s:4:"name";s:73:"Symfony/Component/Security/Core/Resources/translations/security.pt_PT.xlf";s:4:"role";s:3:"php";}}i:165;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f07b53a0e13bb3f1267b212e07b49a14";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.ro.xlf";s:4:"role";s:3:"php";}}i:166;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f943d4b750be69bd91e03eca27df52f5";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.ru.xlf";s:4:"role";s:3:"php";}}i:167;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a570f49a5deb0bba84a8f5ce71018b32";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.sk.xlf";s:4:"role";s:3:"php";}}i:168;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0a5e641bcbd17d9502a2f2f3e1d51999";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.sl.xlf";s:4:"role";s:3:"php";}}i:169;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"823f2ed1191ec9723d46f2516d700973";s:4:"name";s:75:"Symfony/Component/Security/Core/Resources/translations/security.sr_Cyrl.xlf";s:4:"role";s:3:"php";}}i:170;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a95969c966594fa2afcf4c0f58dcf034";s:4:"name";s:75:"Symfony/Component/Security/Core/Resources/translations/security.sr_Latn.xlf";s:4:"role";s:3:"php";}}i:171;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ef66c814ecc8a2fc5fbbe30dd23f3a82";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.sv.xlf";s:4:"role";s:3:"php";}}i:172;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0d789d9cb295319cb483f864ca99b2bf";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.tr.xlf";s:4:"role";s:3:"php";}}i:173;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c7e13f578ddab881e5bb035d0e905048";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.ua.xlf";s:4:"role";s:3:"php";}}i:174;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3050382d1549c2b01456b9361e8facd3";s:4:"name";s:45:"Symfony/Component/Security/Core/Role/Role.php";s:4:"role";s:3:"php";}}i:175;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bca85cac483875c294bb4577942b5e13";s:4:"name";s:54:"Symfony/Component/Security/Core/Role/RoleHierarchy.php";s:4:"role";s:3:"php";}}i:176;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"675f61146da7cd1caec751a2d261b0e6";s:4:"name";s:63:"Symfony/Component/Security/Core/Role/RoleHierarchyInterface.php";s:4:"role";s:3:"php";}}i:177;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b03592fb0521d323c36939ab08985fce";s:4:"name";s:54:"Symfony/Component/Security/Core/Role/RoleInterface.php";s:4:"role";s:3:"php";}}i:178;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8826f3ebe695c64183b161bc895da3d9";s:4:"name";s:55:"Symfony/Component/Security/Core/Role/SwitchUserRole.php";s:4:"role";s:3:"php";}}i:179;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"10ecd1343fe383863fcf07aea6e1484e";s:4:"name";s:51:"Symfony/Component/Security/Core/SecurityContext.php";s:4:"role";s:3:"php";}}i:180;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"55a5781675e114c92bad8bad5aa2830d";s:4:"name";s:60:"Symfony/Component/Security/Core/SecurityContextInterface.php";s:4:"role";s:3:"php";}}i:181;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b63b6b59d9a86eb0d75e0b96f791cebe";s:4:"name";s:90:"Symfony/Component/Security/Core/Tests/Authentication/AuthenticationProviderManagerTest.php";s:4:"role";s:4:"test";}}i:182;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"678c0f4dcee8c6b4c914596f68e8066c";s:4:"name";s:88:"Symfony/Component/Security/Core/Tests/Authentication/AuthenticationTrustResolverTest.php";s:4:"role";s:4:"test";}}i:183;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9b7f1e61792f26921f8ac8005047ec5a";s:4:"name";s:101:"Symfony/Component/Security/Core/Tests/Authentication/Provider/AnonymousAuthenticationProviderTest.php";s:4:"role";s:4:"test";}}i:184;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9e46dd36c66d8390ff4ef27308eaf788";s:4:"name";s:95:"Symfony/Component/Security/Core/Tests/Authentication/Provider/DaoAuthenticationProviderTest.php";s:4:"role";s:4:"test";}}i:185;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"56a160fc914fa20188f3fb4428231071";s:4:"name";s:108:"Symfony/Component/Security/Core/Tests/Authentication/Provider/PreAuthenticatedAuthenticationProviderTest.php";s:4:"role";s:4:"test";}}i:186;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7d87ce759a8a0bc6a43e083bcbf65a7e";s:4:"name";s:102:"Symfony/Component/Security/Core/Tests/Authentication/Provider/RememberMeAuthenticationProviderTest.php";s:4:"role";s:4:"test";}}i:187;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"878a24250d15912e8875b761f1b18cd6";s:4:"name";s:96:"Symfony/Component/Security/Core/Tests/Authentication/Provider/UserAuthenticationProviderTest.php";s:4:"role";s:4:"test";}}i:188;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dd3f29d0edf632c2e0668095d433e2b8";s:4:"name";s:93:"Symfony/Component/Security/Core/Tests/Authentication/RememberMe/InMemoryTokenProviderTest.php";s:4:"role";s:4:"test";}}i:189;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"333af5f2e4fca41f0ad52c067fc6f6fa";s:4:"name";s:87:"Symfony/Component/Security/Core/Tests/Authentication/RememberMe/PersistentTokenTest.php";s:4:"role";s:4:"test";}}i:190;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63d1895301e8c4db998257793246ddd4";s:4:"name";s:80:"Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php";s:4:"role";s:4:"test";}}i:191;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"165abe0414d3fd9f6b87b77a974dbf87";s:4:"name";s:81:"Symfony/Component/Security/Core/Tests/Authentication/Token/AnonymousTokenTest.php";s:4:"role";s:4:"test";}}i:192;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea0e9ad02afbff6e37eb9dcceb635102";s:4:"name";s:88:"Symfony/Component/Security/Core/Tests/Authentication/Token/PreAuthenticatedTokenTest.php";s:4:"role";s:4:"test";}}i:193;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"881577a37dc13881037471af86e54c26";s:4:"name";s:88:"Symfony/Component/Security/Core/Tests/Authentication/Token/UsernamePasswordTokenTest.php";s:4:"role";s:4:"test";}}i:194;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"01615835979113e72ba01df5db514cfe";s:4:"name";s:81:"Symfony/Component/Security/Core/Tests/Authorization/AccessDecisionManagerTest.php";s:4:"role";s:4:"test";}}i:195;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"53e2015913c42918f488b6b5768dcfd6";s:4:"name";s:78:"Symfony/Component/Security/Core/Tests/Authorization/ExpressionLanguageTest.php";s:4:"role";s:4:"test";}}i:196;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09a4601d7459111b412a28d8b3ba77e6";s:4:"name";s:84:"Symfony/Component/Security/Core/Tests/Authorization/Voter/AuthenticatedVoterTest.php";s:4:"role";s:4:"test";}}i:197;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f7de9f0134587eca878b84fa96cd4e11";s:4:"name";s:81:"Symfony/Component/Security/Core/Tests/Authorization/Voter/ExpressionVoterTest.php";s:4:"role";s:4:"test";}}i:198;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1515e17b427defd7ede0b26cd62d6f7c";s:4:"name";s:84:"Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleHierarchyVoterTest.php";s:4:"role";s:4:"test";}}i:199;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6eafbf6e21bcb931d7deeb6c7a03d09d";s:4:"name";s:75:"Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleVoterTest.php";s:4:"role";s:4:"test";}}i:200;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"262dd768f1ab73f96eee0a29a7665d3f";s:4:"name";s:73:"Symfony/Component/Security/Core/Tests/Encoder/BasePasswordEncoderTest.php";s:4:"role";s:4:"test";}}i:201;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a052af732959cb4100386622650cde49";s:4:"name";s:75:"Symfony/Component/Security/Core/Tests/Encoder/BCryptPasswordEncoderTest.php";s:4:"role";s:4:"test";}}i:202;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c4466a3921e1ef6bc3ffa19e825cc264";s:4:"name";s:68:"Symfony/Component/Security/Core/Tests/Encoder/EncoderFactoryTest.php";s:4:"role";s:4:"test";}}i:203;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1a2e9523c0f574255c5e8cc12563036d";s:4:"name";s:82:"Symfony/Component/Security/Core/Tests/Encoder/MessageDigestPasswordEncoderTest.php";s:4:"role";s:4:"test";}}i:204;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47d32cbddb94e8c940a067da8bd652c8";s:4:"name";s:75:"Symfony/Component/Security/Core/Tests/Encoder/Pbkdf2PasswordEncoderTest.php";s:4:"role";s:4:"test";}}i:205;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9a3e27e7243e0aef39d89ce5048f0156";s:4:"name";s:78:"Symfony/Component/Security/Core/Tests/Encoder/PlaintextPasswordEncoderTest.php";s:4:"role";s:4:"test";}}i:206;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e84df0653432699a74f9892f39cd801d";s:4:"name";s:64:"Symfony/Component/Security/Core/Tests/Role/RoleHierarchyTest.php";s:4:"role";s:4:"test";}}i:207;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6faeaa1b59d680fc64f68f187d3b8ad4";s:4:"name";s:55:"Symfony/Component/Security/Core/Tests/Role/RoleTest.php";s:4:"role";s:4:"test";}}i:208;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63e6fa508f87e6843cdc7d4dbb310ed4";s:4:"name";s:65:"Symfony/Component/Security/Core/Tests/Role/SwitchUserRoleTest.php";s:4:"role";s:4:"test";}}i:209;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c6a315c41a473173516a7b97d7bd135f";s:4:"name";s:61:"Symfony/Component/Security/Core/Tests/SecurityContextTest.php";s:4:"role";s:4:"test";}}i:210;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"39059760376a28b3a1289ebeeefbf9ef";s:4:"name";s:68:"Symfony/Component/Security/Core/Tests/User/ChainUserProviderTest.php";s:4:"role";s:4:"test";}}i:211;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"92589d6ad763ccd817043e6b5fb5865d";s:4:"name";s:55:"Symfony/Component/Security/Core/Tests/User/UserTest.php";s:4:"role";s:4:"test";}}i:212;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"51ae9e53749a60e2d99ca0fa4893a68a";s:4:"name";s:61:"Symfony/Component/Security/Core/Tests/Util/ClassUtilsTest.php";s:4:"role";s:4:"test";}}i:213;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"172dc84386daa4193854aad1078407fb";s:4:"name";s:63:"Symfony/Component/Security/Core/Tests/Util/SecureRandomTest.php";s:4:"role";s:4:"test";}}i:214;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a80a7c57b6922fd9a9925a82a7741a01";s:4:"name";s:62:"Symfony/Component/Security/Core/Tests/Util/StringUtilsTest.php";s:4:"role";s:4:"test";}}i:215;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2ecdc8fea6ea459acf382fbd0de514c";s:4:"name";s:89:"Symfony/Component/Security/Core/Tests/Validator/Constraints/UserPasswordValidatorTest.php";s:4:"role";s:4:"test";}}i:216;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dac22529730e8721ae339aacb05b561c";s:4:"name";s:62:"Symfony/Component/Security/Core/User/AdvancedUserInterface.php";s:4:"role";s:3:"php";}}i:217;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"16ad9f1561e239188cb64ff12a4cd713";s:4:"name";s:58:"Symfony/Component/Security/Core/User/ChainUserProvider.php";s:4:"role";s:3:"php";}}i:218;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"053bfd3d7feb51135f125c471e0919f2";s:4:"name";s:59:"Symfony/Component/Security/Core/User/EquatableInterface.php";s:4:"role";s:3:"php";}}i:219;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c62ec26256558502bdff94ccdff8f4c3";s:4:"name";s:61:"Symfony/Component/Security/Core/User/InMemoryUserProvider.php";s:4:"role";s:3:"php";}}i:220;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a36d5dcfd2e90b7079473de27ece3f0c";s:4:"name";s:45:"Symfony/Component/Security/Core/User/User.php";s:4:"role";s:3:"php";}}i:221;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"915fa1f4c48a7ce2f501c26b7a784f28";s:4:"name";s:52:"Symfony/Component/Security/Core/User/UserChecker.php";s:4:"role";s:3:"php";}}i:222;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"388e848eda1ffa8b46dd0ae9bf227b90";s:4:"name";s:61:"Symfony/Component/Security/Core/User/UserCheckerInterface.php";s:4:"role";s:3:"php";}}i:223;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47ee6a0d6557868aaf10450f4137462b";s:4:"name";s:54:"Symfony/Component/Security/Core/User/UserInterface.php";s:4:"role";s:3:"php";}}i:224;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"482f41d8bda5807c72c319d1d2a11c09";s:4:"name";s:62:"Symfony/Component/Security/Core/User/UserProviderInterface.php";s:4:"role";s:3:"php";}}i:225;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dd14c33e711d9ac06c1507157e32f166";s:4:"name";s:51:"Symfony/Component/Security/Core/Util/ClassUtils.php";s:4:"role";s:3:"php";}}i:226;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9b650297a6cfe3a6947488561371c574";s:4:"name";s:53:"Symfony/Component/Security/Core/Util/SecureRandom.php";s:4:"role";s:3:"php";}}i:227;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9ac637cacec94e99f0a7af4154ea16ef";s:4:"name";s:62:"Symfony/Component/Security/Core/Util/SecureRandomInterface.php";s:4:"role";s:3:"php";}}i:228;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e9ba381671f8b8f44a880028850a3dc6";s:4:"name";s:52:"Symfony/Component/Security/Core/Util/StringUtils.php";s:4:"role";s:3:"php";}}i:229;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"681b19bd49acd0a67bf514c0a420e164";s:4:"name";s:70:"Symfony/Component/Security/Core/Validator/Constraints/UserPassword.php";s:4:"role";s:3:"php";}}i:230;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"73b05740588c9089f62ddccb23b85de2";s:4:"name";s:79:"Symfony/Component/Security/Core/Validator/Constraints/UserPasswordValidator.php";s:4:"role";s:3:"php";}}i:231;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8bf68c5cb8ecade41dedb7a808186bfc";s:4:"name";s:45:"Symfony/Component/Security/Csrf/composer.json";s:4:"role";s:3:"doc";}}i:232;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8dd9faf3aa313127ffcf0106abafdb34";s:4:"name";s:45:"Symfony/Component/Security/Csrf/CsrfToken.php";s:4:"role";s:3:"php";}}i:233;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4584d3d466fbd310bd1c3730a53aba62";s:4:"name";s:52:"Symfony/Component/Security/Csrf/CsrfTokenManager.php";s:4:"role";s:3:"php";}}i:234;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4f9257a2c8b6285605af062e31e92c51";s:4:"name";s:61:"Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.php";s:4:"role";s:3:"php";}}i:235;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"283b3574fff8ff0c093c8c2c74024fb0";s:4:"name";s:68:"Symfony/Component/Security/Csrf/Exception/TokenNotFoundException.php";s:4:"role";s:3:"php";}}i:236;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:39:"Symfony/Component/Security/Csrf/LICENSE";s:4:"role";s:3:"doc";}}i:237;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4a5e98782fbba28092cafe77c3168c51";s:4:"name";s:48:"Symfony/Component/Security/Csrf/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:238;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f7759c45cd4a446a228ed648286acf8f";s:4:"name";s:41:"Symfony/Component/Security/Csrf/README.md";s:4:"role";s:3:"doc";}}i:239;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3de809f4f691151c195fba128ff1e32d";s:4:"name";s:62:"Symfony/Component/Security/Csrf/Tests/CsrfTokenManagerTest.php";s:4:"role";s:4:"test";}}i:240;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bc23118b2998753a1a5d8d744edb93e9";s:4:"name";s:82:"Symfony/Component/Security/Csrf/Tests/TokenGenerator/UriSafeTokenGeneratorTest.php";s:4:"role";s:4:"test";}}i:241;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"362691003c5cc955877ecd235ef329d5";s:4:"name";s:84:"Symfony/Component/Security/Csrf/Tests/TokenStorage/NativeSessionTokenStorageTest.php";s:4:"role";s:4:"test";}}i:242;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6a12af8493e94dd61cffa21f05b8dac8";s:4:"name";s:78:"Symfony/Component/Security/Csrf/Tests/TokenStorage/SessionTokenStorageTest.php";s:4:"role";s:4:"test";}}i:243;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dab50ef252b23f81bc0a28dd6ed3c2f0";s:4:"name";s:74:"Symfony/Component/Security/Csrf/TokenGenerator/TokenGeneratorInterface.php";s:4:"role";s:3:"php";}}i:244;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2cac1d204af23007d684c61435e0275a";s:4:"name";s:72:"Symfony/Component/Security/Csrf/TokenGenerator/UriSafeTokenGenerator.php";s:4:"role";s:3:"php";}}i:245;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c6aa4826742510546c711553b19d87a4";s:4:"name";s:74:"Symfony/Component/Security/Csrf/TokenStorage/NativeSessionTokenStorage.php";s:4:"role";s:3:"php";}}i:246;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3525f5f7040f8b2e3fb7f2df67c3e52b";s:4:"name";s:68:"Symfony/Component/Security/Csrf/TokenStorage/SessionTokenStorage.php";s:4:"role";s:3:"php";}}i:247;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"602d9216e9b1d1f0d22b31c902e5b4bb";s:4:"name";s:70:"Symfony/Component/Security/Csrf/TokenStorage/TokenStorageInterface.php";s:4:"role";s:3:"php";}}i:248;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9df423675054d980e7bae7cc92020c03";s:4:"name";s:45:"Symfony/Component/Security/Http/AccessMap.php";s:4:"role";s:3:"php";}}i:249;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"43086a06e68384eaccab38dfb698786d";s:4:"name";s:54:"Symfony/Component/Security/Http/AccessMapInterface.php";s:4:"role";s:3:"php";}}i:250;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1a26ecccd324ea272277edffc5c84886";s:4:"name";s:88:"Symfony/Component/Security/Http/Authentication/AuthenticationFailureHandlerInterface.php";s:4:"role";s:3:"php";}}i:251;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1249ffb01efe413cfd97a5337cb00137";s:4:"name";s:88:"Symfony/Component/Security/Http/Authentication/AuthenticationSuccessHandlerInterface.php";s:4:"role";s:3:"php";}}i:252;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4b78405b37b8d39c63538f637fd497dc";s:4:"name";s:86:"Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php";s:4:"role";s:3:"php";}}i:253;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d1a101bba266130a6fdbfc92126cef07";s:4:"name";s:86:"Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php";s:4:"role";s:3:"php";}}i:254;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ed65679f667d9ef57a6791a64a8bd6c2";s:4:"name";s:78:"Symfony/Component/Security/Http/Authentication/SimpleAuthenticationHandler.php";s:4:"role";s:3:"php";}}i:255;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"afbc8d72124b7a6aee7879fa64325a9f";s:4:"name";s:78:"Symfony/Component/Security/Http/Authorization/AccessDeniedHandlerInterface.php";s:4:"role";s:3:"php";}}i:256;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b7cd3c1e3d2a0a5cacc080b87c9e590";s:4:"name";s:45:"Symfony/Component/Security/Http/composer.json";s:4:"role";s:3:"doc";}}i:257;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6d3ec77aadf630304cff4ed3c026b086";s:4:"name";s:80:"Symfony/Component/Security/Http/EntryPoint/AuthenticationEntryPointInterface.php";s:4:"role";s:3:"php";}}i:258;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0cacf36e7c79e4ca8e7fad2ad771335d";s:4:"name";s:76:"Symfony/Component/Security/Http/EntryPoint/BasicAuthenticationEntryPoint.php";s:4:"role";s:3:"php";}}i:259;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0916b4aabd44274d2a1d24d7eccd3370";s:4:"name";s:77:"Symfony/Component/Security/Http/EntryPoint/DigestAuthenticationEntryPoint.php";s:4:"role";s:3:"php";}}i:260;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"957245bb0cc25e4ddfa36ff11b60cf31";s:4:"name";s:75:"Symfony/Component/Security/Http/EntryPoint/FormAuthenticationEntryPoint.php";s:4:"role";s:3:"php";}}i:261;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e3cec247e8df4a6e97c579e4ea923bc4";s:4:"name";s:76:"Symfony/Component/Security/Http/EntryPoint/RetryAuthenticationEntryPoint.php";s:4:"role";s:3:"php";}}i:262;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"99b4defc6b93df2b7f1c0b4dedef3ff9";s:4:"name";s:63:"Symfony/Component/Security/Http/Event/InteractiveLoginEvent.php";s:4:"role";s:3:"php";}}i:263;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7ce04d8a18a0487f987e31fc88bd68c5";s:4:"name";s:57:"Symfony/Component/Security/Http/Event/SwitchUserEvent.php";s:4:"role";s:3:"php";}}i:264;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c38b7e9b63bb0cc12e471d58062964b7";s:4:"name";s:75:"Symfony/Component/Security/Http/Firewall/AbstractAuthenticationListener.php";s:4:"role";s:3:"php";}}i:265;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0a1aebef9c2f8f6a328e6227052df7ab";s:4:"name";s:77:"Symfony/Component/Security/Http/Firewall/AbstractPreAuthenticatedListener.php";s:4:"role";s:3:"php";}}i:266;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5aa38481213505e4d4b3308202f16ae2";s:4:"name";s:59:"Symfony/Component/Security/Http/Firewall/AccessListener.php";s:4:"role";s:3:"php";}}i:267;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fffa376fb78716df7994bd30c2c3d8e2";s:4:"name";s:76:"Symfony/Component/Security/Http/Firewall/AnonymousAuthenticationListener.php";s:4:"role";s:3:"php";}}i:268;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b35cfc2ded8a8aa315ba7ee88ae788b5";s:4:"name";s:72:"Symfony/Component/Security/Http/Firewall/BasicAuthenticationListener.php";s:4:"role";s:3:"php";}}i:269;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"850ac32b9360422daedb18164af00887";s:4:"name";s:60:"Symfony/Component/Security/Http/Firewall/ChannelListener.php";s:4:"role";s:3:"php";}}i:270;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"096bd4d9e3b975fcac84503f61384b7e";s:4:"name";s:60:"Symfony/Component/Security/Http/Firewall/ContextListener.php";s:4:"role";s:3:"php";}}i:271;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c9c8fa0fd59936274a596a360568a575";s:4:"name";s:73:"Symfony/Component/Security/Http/Firewall/DigestAuthenticationListener.php";s:4:"role";s:3:"php";}}i:272;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0b7d00f42228ca3d4827012968c69a8c";s:4:"name";s:62:"Symfony/Component/Security/Http/Firewall/ExceptionListener.php";s:4:"role";s:3:"php";}}i:273;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6f43f337a4368b4d7b1cce0e76b51b10";s:4:"name";s:62:"Symfony/Component/Security/Http/Firewall/ListenerInterface.php";s:4:"role";s:3:"php";}}i:274;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"42ad987ff1e6284b2fd2f11d5cf09725";s:4:"name";s:59:"Symfony/Component/Security/Http/Firewall/LogoutListener.php";s:4:"role";s:3:"php";}}i:275;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"becb8470e4e05de6ad82ff6bf7e646fc";s:4:"name";s:63:"Symfony/Component/Security/Http/Firewall/RememberMeListener.php";s:4:"role";s:3:"php";}}i:276;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3c80c1a805d89cfd4f475aa5d8517267";s:4:"name";s:77:"Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.php";s:4:"role";s:3:"php";}}i:277;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e06e2b324e79ee890f1feebba9bc8ac3";s:4:"name";s:76:"Symfony/Component/Security/Http/Firewall/SimplePreAuthenticationListener.php";s:4:"role";s:3:"php";}}i:278;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"62963e5323a197109f7f7f3e860154ca";s:4:"name";s:63:"Symfony/Component/Security/Http/Firewall/SwitchUserListener.php";s:4:"role";s:3:"php";}}i:279;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4f883d92d37fd6eb289b50abd37ae680";s:4:"name";s:87:"Symfony/Component/Security/Http/Firewall/UsernamePasswordFormAuthenticationListener.php";s:4:"role";s:3:"php";}}i:280;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"08351ed63f27f17c1b35b08600cc8864";s:4:"name";s:71:"Symfony/Component/Security/Http/Firewall/X509AuthenticationListener.php";s:4:"role";s:3:"php";}}i:281;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ee01a78804fc30696b6ec0eeef5c59a6";s:4:"name";s:44:"Symfony/Component/Security/Http/Firewall.php";s:4:"role";s:3:"php";}}i:282;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2a749495dc3be6af3a2fd28e729c80a6";s:4:"name";s:47:"Symfony/Component/Security/Http/FirewallMap.php";s:4:"role";s:3:"php";}}i:283;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87ce09ab99f6ec6b472a725abff910c5";s:4:"name";s:56:"Symfony/Component/Security/Http/FirewallMapInterface.php";s:4:"role";s:3:"php";}}i:284;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a2bb9c5c5076b9a7978f301b64c00b9e";s:4:"name";s:45:"Symfony/Component/Security/Http/HttpUtils.php";s:4:"role";s:3:"php";}}i:285;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:39:"Symfony/Component/Security/Http/LICENSE";s:4:"role";s:3:"doc";}}i:286;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e5ddc1de0d071bdeacbcd2325ed2d4ae";s:4:"name";s:70:"Symfony/Component/Security/Http/Logout/CookieClearingLogoutHandler.php";s:4:"role";s:3:"php";}}i:287;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"45d84fb75d34ea9135c5b72108e1dbf7";s:4:"name";s:70:"Symfony/Component/Security/Http/Logout/DefaultLogoutSuccessHandler.php";s:4:"role";s:3:"php";}}i:288;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eefeebbc791fa1bccf5a3952be87ba78";s:4:"name";s:65:"Symfony/Component/Security/Http/Logout/LogoutHandlerInterface.php";s:4:"role";s:3:"php";}}i:289;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cc172ba7205b41a32dd97a56eadf4cc8";s:4:"name";s:72:"Symfony/Component/Security/Http/Logout/LogoutSuccessHandlerInterface.php";s:4:"role";s:3:"php";}}i:290;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aecd2ef66d8aade29cc47157048e4a21";s:4:"name";s:63:"Symfony/Component/Security/Http/Logout/SessionLogoutHandler.php";s:4:"role";s:3:"php";}}i:291;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2f041adb26153b8fb15facf2c6af231d";s:4:"name";s:48:"Symfony/Component/Security/Http/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:292;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a345783d58ade730c9a01639748b41c6";s:4:"name";s:41:"Symfony/Component/Security/Http/README.md";s:4:"role";s:3:"doc";}}i:293;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b72e5cba34abbeea45218aced16a6359";s:4:"name";s:73:"Symfony/Component/Security/Http/RememberMe/AbstractRememberMeServices.php";s:4:"role";s:3:"php";}}i:294;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"435ea3e4c99dd22c771c99f16392c656";s:4:"name";s:85:"Symfony/Component/Security/Http/RememberMe/PersistentTokenBasedRememberMeServices.php";s:4:"role";s:3:"php";}}i:295;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d0150afc723a4bb2f322842c1e0a8ce6";s:4:"name";s:74:"Symfony/Component/Security/Http/RememberMe/RememberMeServicesInterface.php";s:4:"role";s:3:"php";}}i:296;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1d39556b7575907aa6f092bb4c07f387";s:4:"name";s:63:"Symfony/Component/Security/Http/RememberMe/ResponseListener.php";s:4:"role";s:3:"php";}}i:297;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2e0288eec870215f3f4b8e360afbcf21";s:4:"name";s:75:"Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php";s:4:"role";s:3:"php";}}i:298;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"80cf473a2f0baee880e458d5946fde6b";s:4:"name";s:50:"Symfony/Component/Security/Http/SecurityEvents.php";s:4:"role";s:3:"php";}}i:299;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f4eee94c1c2e104f0ce7b8d5bd349fa0";s:4:"name";s:73:"Symfony/Component/Security/Http/Session/SessionAuthenticationStrategy.php";s:4:"role";s:3:"php";}}i:300;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a8df527492a3c775c0c2d3affaec1268";s:4:"name";s:82:"Symfony/Component/Security/Http/Session/SessionAuthenticationStrategyInterface.php";s:4:"role";s:3:"php";}}i:301;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1e501db8e61f7fbbe1ce2046846d0d16";s:4:"name";s:55:"Symfony/Component/Security/Http/Tests/AccessMapTest.php";s:4:"role";s:4:"test";}}i:302;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d3e7326491ec2358ba350f4a937d9778";s:4:"name";s:96:"Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.php";s:4:"role";s:4:"test";}}i:303;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f238eea0886f4d046befadaa74b02fbe";s:4:"name";s:96:"Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.php";s:4:"role";s:4:"test";}}i:304;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d5cef550f4e58533d96feab10cdf02d7";s:4:"name";s:88:"Symfony/Component/Security/Http/Tests/Authentication/SimpleAuthenticationHandlerTest.php";s:4:"role";s:4:"test";}}i:305;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"44e155837ffd4ba5e88a3fe86fa0371a";s:4:"name";s:86:"Symfony/Component/Security/Http/Tests/EntryPoint/BasicAuthenticationEntryPointTest.php";s:4:"role";s:4:"test";}}i:306;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cf8ce9dfa9ef2b8cf64c2bca4eeaa2ee";s:4:"name";s:87:"Symfony/Component/Security/Http/Tests/EntryPoint/DigestAuthenticationEntryPointTest.php";s:4:"role";s:4:"test";}}i:307;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6f33e2bc5d33de50781109deaa92375b";s:4:"name";s:85:"Symfony/Component/Security/Http/Tests/EntryPoint/FormAuthenticationEntryPointTest.php";s:4:"role";s:4:"test";}}i:308;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9e4221ac3557ad490f50b572a1cb6da0";s:4:"name";s:86:"Symfony/Component/Security/Http/Tests/EntryPoint/RetryAuthenticationEntryPointTest.php";s:4:"role";s:4:"test";}}i:309;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7616457ff22f218eb84d0582b3a32d99";s:4:"name";s:87:"Symfony/Component/Security/Http/Tests/Firewall/AbstractPreAuthenticatedListenerTest.php";s:4:"role";s:4:"test";}}i:310;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"50390ecbf94ded92656d9de6570d63c1";s:4:"name";s:69:"Symfony/Component/Security/Http/Tests/Firewall/AccessListenerTest.php";s:4:"role";s:4:"test";}}i:311;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d3745efe02656a6a40d2421791a65ab2";s:4:"name";s:86:"Symfony/Component/Security/Http/Tests/Firewall/AnonymousAuthenticationListenerTest.php";s:4:"role";s:4:"test";}}i:312;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f9b4fe52898a270086a0323bc9e744d2";s:4:"name";s:82:"Symfony/Component/Security/Http/Tests/Firewall/BasicAuthenticationListenerTest.php";s:4:"role";s:4:"test";}}i:313;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"39f3a9fbfd8fb369e3518c1f737c69d1";s:4:"name";s:70:"Symfony/Component/Security/Http/Tests/Firewall/ChannelListenerTest.php";s:4:"role";s:4:"test";}}i:314;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fefeae0b89d7bce7c98fd5f79e64fb80";s:4:"name";s:70:"Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php";s:4:"role";s:4:"test";}}i:315;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0cd7a88d1e73a7c2397a05ee835b416e";s:4:"name";s:65:"Symfony/Component/Security/Http/Tests/Firewall/DigestDataTest.php";s:4:"role";s:4:"test";}}i:316;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bdc936486eb622f5ebc89def545d34cc";s:4:"name";s:69:"Symfony/Component/Security/Http/Tests/Firewall/LogoutListenerTest.php";s:4:"role";s:4:"test";}}i:317;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5aa221a87c438540d59e8d06cbc51e43";s:4:"name";s:73:"Symfony/Component/Security/Http/Tests/Firewall/RememberMeListenerTest.php";s:4:"role";s:4:"test";}}i:318;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4e401aaf8580c5f225065eb296d09ffd";s:4:"name";s:73:"Symfony/Component/Security/Http/Tests/Firewall/SwitchUserListenerTest.php";s:4:"role";s:4:"test";}}i:319;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"62ada44f4eeb63bc411ebff114f5f340";s:4:"name";s:81:"Symfony/Component/Security/Http/Tests/Firewall/X509AuthenticationListenerTest.php";s:4:"role";s:4:"test";}}i:320;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"90e0766898394d8523cb8d3093b8ad0f";s:4:"name";s:57:"Symfony/Component/Security/Http/Tests/FirewallMapTest.php";s:4:"role";s:4:"test";}}i:321;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"58a4fef6ae246369bdff44ea9566e2e7";s:4:"name";s:54:"Symfony/Component/Security/Http/Tests/FirewallTest.php";s:4:"role";s:4:"test";}}i:322;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a65c06a07157d8b2f79f1718fe9acc3a";s:4:"name";s:55:"Symfony/Component/Security/Http/Tests/HttpUtilsTest.php";s:4:"role";s:4:"test";}}i:323;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d82d3ab3c92583cd9aa15b9ed8ae9db2";s:4:"name";s:80:"Symfony/Component/Security/Http/Tests/Logout/CookieClearingLogoutHandlerTest.php";s:4:"role";s:4:"test";}}i:324;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b35e129cc7f5bc083d3b855f286a2228";s:4:"name";s:80:"Symfony/Component/Security/Http/Tests/Logout/DefaultLogoutSuccessHandlerTest.php";s:4:"role";s:4:"test";}}i:325;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"31043c56e00a9f85591f7aeb1a0d7abe";s:4:"name";s:73:"Symfony/Component/Security/Http/Tests/Logout/SessionLogoutHandlerTest.php";s:4:"role";s:4:"test";}}i:326;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a4f462fe63db2978e9eb7b9088a332a1";s:4:"name";s:83:"Symfony/Component/Security/Http/Tests/RememberMe/AbstractRememberMeServicesTest.php";s:4:"role";s:4:"test";}}i:327;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1dcfd5f481984cbcbe252c35abb90560";s:4:"name";s:95:"Symfony/Component/Security/Http/Tests/RememberMe/PersistentTokenBasedRememberMeServicesTest.php";s:4:"role";s:4:"test";}}i:328;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d8f1bc020d5b21d2de0433c2839b08f9";s:4:"name";s:73:"Symfony/Component/Security/Http/Tests/RememberMe/ResponseListenerTest.php";s:4:"role";s:4:"test";}}i:329;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e4109def8460d75d5f052f67ec6ba970";s:4:"name";s:85:"Symfony/Component/Security/Http/Tests/RememberMe/TokenBasedRememberMeServicesTest.php";s:4:"role";s:4:"test";}}i:330;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7787c557da28fb7dd4cc86318f909bb3";s:4:"name";s:83:"Symfony/Component/Security/Http/Tests/Session/SessionAuthenticationStrategyTest.php";s:4:"role";s:4:"test";}}i:331;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:34:"Symfony/Component/Security/LICENSE";s:4:"role";s:3:"doc";}}i:332;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b48391335127152904b86aef4327b6ba";s:4:"name";s:43:"Symfony/Component/Security/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:333;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4dec033fca5592436030a98806bbf6d7";s:4:"name";s:36:"Symfony/Component/Security/README.md";s:4:"role";s:3:"doc";}}i:334;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1e750b4762305800f3dd181eab53e2ba";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ar.xlf";s:4:"role";s:3:"php";}}i:335;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"60f216b50da4b49da27b177ba8ca3b46";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.bg.xlf";s:4:"role";s:3:"php";}}i:336;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"31cbf1bd957d4f4c3401c20d9a1b10bc";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ca.xlf";s:4:"role";s:3:"php";}}i:337;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0cf2e748f73950fb74f6a5978ab773f4";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.cs.xlf";s:4:"role";s:3:"php";}}i:338;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6d1c01434b6521da496cf9c91c144ea1";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.da.xlf";s:4:"role";s:3:"php";}}i:339;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a01afc0ce8bdc7598652c6560fae8512";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.de.xlf";s:4:"role";s:3:"php";}}i:340;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2883d0b5e1e7eeed7ec66ea9853f5cc";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.el.xlf";s:4:"role";s:3:"php";}}i:341;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0c6a0114323a39fad8cb33246be7b7d9";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.en.xlf";s:4:"role";s:3:"php";}}i:342;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7ae3e719888ac0c94aeda98734b5e9f5";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.es.xlf";s:4:"role";s:3:"php";}}i:343;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eef6f0230157636659e13c466e498cd9";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.fa.xlf";s:4:"role";s:3:"php";}}i:344;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d726781df922dfb126eb85c6c1cf7f5";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.fr.xlf";s:4:"role";s:3:"php";}}i:345;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d24525aa71ea6294f1b0dad40d7a5b70";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.gl.xlf";s:4:"role";s:3:"php";}}i:346;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7b03fcbcf3c6586ee539377f3f5a3bdc";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.hr.xlf";s:4:"role";s:3:"php";}}i:347;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8704be78d7be163b715e166f07257e3";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.hu.xlf";s:4:"role";s:3:"php";}}i:348;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"40ec159baa27f18ea7ab7924e652ec97";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.id.xlf";s:4:"role";s:3:"php";}}i:349;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47a2f3df6c37532fe6a486073aebd0a1";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.it.xlf";s:4:"role";s:3:"php";}}i:350;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"acf99e98e5ffff85489c97c78a83b317";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ja.xlf";s:4:"role";s:3:"php";}}i:351;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"defce0bf7d3e026fbdaebb0cfe7abbd6";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.lb.xlf";s:4:"role";s:3:"php";}}i:352;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"79d67b79332d77ce5d39a8531f219538";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.nl.xlf";s:4:"role";s:3:"php";}}i:353;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"03051a200f3f0f13a30ed957026a1784";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.no.xlf";s:4:"role";s:3:"php";}}i:354;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f6e927ae45bf961507418d03db1c676d";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.pl.xlf";s:4:"role";s:3:"php";}}i:355;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5140f0e3d9b00962b72eb4f3cce9b2a4";s:4:"name";s:68:"Symfony/Component/Security/Resources/translations/security.pt_BR.xlf";s:4:"role";s:3:"php";}}i:356;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2855177bf25fd860bca194067f350e0a";s:4:"name";s:68:"Symfony/Component/Security/Resources/translations/security.pt_PT.xlf";s:4:"role";s:3:"php";}}i:357;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f07b53a0e13bb3f1267b212e07b49a14";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ro.xlf";s:4:"role";s:3:"php";}}i:358;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f943d4b750be69bd91e03eca27df52f5";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ru.xlf";s:4:"role";s:3:"php";}}i:359;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a570f49a5deb0bba84a8f5ce71018b32";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.sk.xlf";s:4:"role";s:3:"php";}}i:360;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0a5e641bcbd17d9502a2f2f3e1d51999";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.sl.xlf";s:4:"role";s:3:"php";}}i:361;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"823f2ed1191ec9723d46f2516d700973";s:4:"name";s:70:"Symfony/Component/Security/Resources/translations/security.sr_Cyrl.xlf";s:4:"role";s:3:"php";}}i:362;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a95969c966594fa2afcf4c0f58dcf034";s:4:"name";s:70:"Symfony/Component/Security/Resources/translations/security.sr_Latn.xlf";s:4:"role";s:3:"php";}}i:363;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ef66c814ecc8a2fc5fbbe30dd23f3a82";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.sv.xlf";s:4:"role";s:3:"php";}}i:364;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0d789d9cb295319cb483f864ca99b2bf";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.tr.xlf";s:4:"role";s:3:"php";}}i:365;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c7e13f578ddab881e5bb035d0e905048";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ua.xlf";s:4:"role";s:3:"php";}}i:366;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b549799b91bf73427ed2c0de26e8d27e";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.vi.xlf";s:4:"role";s:3:"php";}}i:367;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c1985d9108a24d1e66b1832cf6c0fae7";s:4:"name";s:68:"Symfony/Component/Security/Resources/translations/security.zh_CN.xlf";s:4:"role";s:3:"php";}}i:368;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"82c8dfa2a45c9aca1e839e448574b12b";s:4:"name";s:82:"Symfony/Component/Security/Tests/Core/Authentication/Token/RememberMeTokenTest.php";s:4:"role";s:4:"test";}}i:369;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"77f76d7ae94a351ec03076059c96f80d";s:4:"name";s:71:"Symfony/Component/Security/Tests/Core/User/InMemoryUserProviderTest.php";s:4:"role";s:4:"test";}}i:370;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b095a4893cc953a6aa42a368c70c8a5";s:4:"name";s:62:"Symfony/Component/Security/Tests/Core/User/UserCheckerTest.php";s:4:"role";s:4:"test";}}i:371;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"693af9a30d85b3907c6147d9ddb56df8";s:4:"name";s:72:"Symfony/Component/Security/Tests/Http/Firewall/ExceptionListenerTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}s:7:"package";a:3:{i:0;a:2:{s:4:"name";s:10:"HttpKernel";s:7:"channel";s:16:"pear.symfony.com";}i:1;a:2:{s:4:"name";s:14:"HttpFoundation";s:7:"channel";s:16:"pear.symfony.com";}i:2;a:2:{s:4:"name";s:15:"EventDispatcher";s:7:"channel";s:16:"pear.symfony.com";}}}s:8:"optional";a:1:{s:7:"package";a:4:{i:0;a:2:{s:4:"name";s:7:"Routing";s:7:"channel";s:16:"pear.symfony.com";}i:1;a:2:{s:4:"name";s:6:"Finder";s:7:"channel";s:16:"pear.symfony.com";}i:2;a:2:{s:4:"name";s:11:"ClassLoader";s:7:"channel";s:16:"pear.symfony.com";}i:3;a:2:{s:4:"name";s:4:"Form";s:7:"channel";s:16:"pear.symfony.com";}}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:372:{s:44:"Symfony/Component/Security/Acl/composer.json";a:4:{s:6:"md5sum";s:32:"5365c3fd47df815d4353473ac6373ad7";s:4:"name";s:44:"Symfony/Component/Security/Acl/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Acl/composer.json";}s:51:"Symfony/Component/Security/Acl/Dbal/AclProvider.php";a:4:{s:6:"md5sum";s:32:"0ecf07a353f03ea4c6976d0cf98d5b51";s:4:"name";s:51:"Symfony/Component/Security/Acl/Dbal/AclProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Dbal/AclProvider.php";}s:58:"Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php";a:4:{s:6:"md5sum";s:32:"333ff4aca2f234109cd7ebe9a03c7f25";s:4:"name";s:58:"Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php";}s:46:"Symfony/Component/Security/Acl/Dbal/Schema.php";a:4:{s:6:"md5sum";s:32:"a38fab3cddce11ba90e1569be5f0d806";s:4:"name";s:46:"Symfony/Component/Security/Acl/Dbal/Schema.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Dbal/Schema.php";}s:45:"Symfony/Component/Security/Acl/Domain/Acl.php";a:4:{s:6:"md5sum";s:32:"e8f587fcaf0a3057321516e59fc0ce87";s:4:"name";s:45:"Symfony/Component/Security/Acl/Domain/Acl.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/Acl.php";}s:60:"Symfony/Component/Security/Acl/Domain/AclCollectionCache.php";a:4:{s:6:"md5sum";s:32:"cccc32d88c312fb7dac66b08d9e67e45";s:4:"name";s:60:"Symfony/Component/Security/Acl/Domain/AclCollectionCache.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/AclCollectionCache.php";}s:53:"Symfony/Component/Security/Acl/Domain/AuditLogger.php";a:4:{s:6:"md5sum";s:32:"b4fee19b12185f0ee45a2e97f5fcb8a4";s:4:"name";s:53:"Symfony/Component/Security/Acl/Domain/AuditLogger.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/AuditLogger.php";}s:58:"Symfony/Component/Security/Acl/Domain/DoctrineAclCache.php";a:4:{s:6:"md5sum";s:32:"2f552f22f35c47d5d523c187d25039eb";s:4:"name";s:58:"Symfony/Component/Security/Acl/Domain/DoctrineAclCache.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/DoctrineAclCache.php";}s:47:"Symfony/Component/Security/Acl/Domain/Entry.php";a:4:{s:6:"md5sum";s:32:"7d02a171381bed25a818a33a2a714803";s:4:"name";s:47:"Symfony/Component/Security/Acl/Domain/Entry.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/Entry.php";}s:52:"Symfony/Component/Security/Acl/Domain/FieldEntry.php";a:4:{s:6:"md5sum";s:32:"f0b1b92b49934c59ecc126fbb41b72c2";s:4:"name";s:52:"Symfony/Component/Security/Acl/Domain/FieldEntry.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/FieldEntry.php";}s:56:"Symfony/Component/Security/Acl/Domain/ObjectIdentity.php";a:4:{s:6:"md5sum";s:32:"3eadb08eafffe705a6dd8de5f96e1ca1";s:4:"name";s:56:"Symfony/Component/Security/Acl/Domain/ObjectIdentity.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/ObjectIdentity.php";}s:73:"Symfony/Component/Security/Acl/Domain/ObjectIdentityRetrievalStrategy.php";a:4:{s:6:"md5sum";s:32:"1baa7e094b60dbd7a2eaf4d38b5125cc";s:4:"name";s:73:"Symfony/Component/Security/Acl/Domain/ObjectIdentityRetrievalStrategy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/ObjectIdentityRetrievalStrategy.php";}s:68:"Symfony/Component/Security/Acl/Domain/PermissionGrantingStrategy.php";a:4:{s:6:"md5sum";s:32:"ea6329b78543f0536dc1b2019c291eb2";s:4:"name";s:68:"Symfony/Component/Security/Acl/Domain/PermissionGrantingStrategy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/PermissionGrantingStrategy.php";}s:62:"Symfony/Component/Security/Acl/Domain/RoleSecurityIdentity.php";a:4:{s:6:"md5sum";s:32:"d082f117ebbe68492e03855adbaa7704";s:4:"name";s:62:"Symfony/Component/Security/Acl/Domain/RoleSecurityIdentity.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/RoleSecurityIdentity.php";}s:75:"Symfony/Component/Security/Acl/Domain/SecurityIdentityRetrievalStrategy.php";a:4:{s:6:"md5sum";s:32:"2a34925fb304b1a8d724ca4cf2aafb5f";s:4:"name";s:75:"Symfony/Component/Security/Acl/Domain/SecurityIdentityRetrievalStrategy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/SecurityIdentityRetrievalStrategy.php";}s:62:"Symfony/Component/Security/Acl/Domain/UserSecurityIdentity.php";a:4:{s:6:"md5sum";s:32:"e48d7c38d196eea74cf250fcddd8d189";s:4:"name";s:62:"Symfony/Component/Security/Acl/Domain/UserSecurityIdentity.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain/UserSecurityIdentity.php";}s:70:"Symfony/Component/Security/Acl/Exception/AclAlreadyExistsException.php";a:4:{s:6:"md5sum";s:32:"82a5465e98dd2475f706a9cacc65db37";s:4:"name";s:70:"Symfony/Component/Security/Acl/Exception/AclAlreadyExistsException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Exception/AclAlreadyExistsException.php";}s:65:"Symfony/Component/Security/Acl/Exception/AclNotFoundException.php";a:4:{s:6:"md5sum";s:32:"8b3ec9dfe9d9f345a3ddce26bd4fab8b";s:4:"name";s:65:"Symfony/Component/Security/Acl/Exception/AclNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Exception/AclNotFoundException.php";}s:76:"Symfony/Component/Security/Acl/Exception/ConcurrentModificationException.php";a:4:{s:6:"md5sum";s:32:"7e3eb281d553454f0f59d5f282948216";s:4:"name";s:76:"Symfony/Component/Security/Acl/Exception/ConcurrentModificationException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Exception/ConcurrentModificationException.php";}s:54:"Symfony/Component/Security/Acl/Exception/Exception.php";a:4:{s:6:"md5sum";s:32:"e3b6ea7de5ec436c7503f1d7312249bc";s:4:"name";s:54:"Symfony/Component/Security/Acl/Exception/Exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Exception/Exception.php";}s:73:"Symfony/Component/Security/Acl/Exception/InvalidDomainObjectException.php";a:4:{s:6:"md5sum";s:32:"4be9ba33e0d97e970d6f541480901eb0";s:4:"name";s:73:"Symfony/Component/Security/Acl/Exception/InvalidDomainObjectException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Exception/InvalidDomainObjectException.php";}s:64:"Symfony/Component/Security/Acl/Exception/NoAceFoundException.php";a:4:{s:6:"md5sum";s:32:"aca5379067c0fd0c2240eb986eac8268";s:4:"name";s:64:"Symfony/Component/Security/Acl/Exception/NoAceFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Exception/NoAceFoundException.php";}s:69:"Symfony/Component/Security/Acl/Exception/NotAllAclsFoundException.php";a:4:{s:6:"md5sum";s:32:"7a0ca03655455c96a2fe053bc72b4de3";s:4:"name";s:69:"Symfony/Component/Security/Acl/Exception/NotAllAclsFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Exception/NotAllAclsFoundException.php";}s:66:"Symfony/Component/Security/Acl/Exception/SidNotLoadedException.php";a:4:{s:6:"md5sum";s:32:"2415593ec8d8a343e6f4328ddb0c2a1d";s:4:"name";s:66:"Symfony/Component/Security/Acl/Exception/SidNotLoadedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Exception/SidNotLoadedException.php";}s:38:"Symfony/Component/Security/Acl/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:38:"Symfony/Component/Security/Acl/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Acl/LICENSE";}s:58:"Symfony/Component/Security/Acl/Model/AclCacheInterface.php";a:4:{s:6:"md5sum";s:32:"ab5d60682e988c0e7eb0dd1512dabade";s:4:"name";s:58:"Symfony/Component/Security/Acl/Model/AclCacheInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/AclCacheInterface.php";}s:53:"Symfony/Component/Security/Acl/Model/AclInterface.php";a:4:{s:6:"md5sum";s:32:"870a09318c3c65e3523e19130607f1ab";s:4:"name";s:53:"Symfony/Component/Security/Acl/Model/AclInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/AclInterface.php";}s:61:"Symfony/Component/Security/Acl/Model/AclProviderInterface.php";a:4:{s:6:"md5sum";s:32:"7ea089827ee0d4ed26b0d57b8f20dc28";s:4:"name";s:61:"Symfony/Component/Security/Acl/Model/AclProviderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/AclProviderInterface.php";}s:62:"Symfony/Component/Security/Acl/Model/AuditableAclInterface.php";a:4:{s:6:"md5sum";s:32:"63c76e68e9ccf7ec307696ac8ca44e8f";s:4:"name";s:62:"Symfony/Component/Security/Acl/Model/AuditableAclInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/AuditableAclInterface.php";}s:64:"Symfony/Component/Security/Acl/Model/AuditableEntryInterface.php";a:4:{s:6:"md5sum";s:32:"f989613d6c0286594696efc106774415";s:4:"name";s:64:"Symfony/Component/Security/Acl/Model/AuditableEntryInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/AuditableEntryInterface.php";}s:61:"Symfony/Component/Security/Acl/Model/AuditLoggerInterface.php";a:4:{s:6:"md5sum";s:32:"c5d9ae1862d7c0a6d442f053d5acac39";s:4:"name";s:61:"Symfony/Component/Security/Acl/Model/AuditLoggerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/AuditLoggerInterface.php";}s:62:"Symfony/Component/Security/Acl/Model/DomainObjectInterface.php";a:4:{s:6:"md5sum";s:32:"4d278f8d01215e4be53a264dad150173";s:4:"name";s:62:"Symfony/Component/Security/Acl/Model/DomainObjectInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/DomainObjectInterface.php";}s:55:"Symfony/Component/Security/Acl/Model/EntryInterface.php";a:4:{s:6:"md5sum";s:32:"72e6a4f7f0ffe6d84e6e6462827ee54a";s:4:"name";s:55:"Symfony/Component/Security/Acl/Model/EntryInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/EntryInterface.php";}s:60:"Symfony/Component/Security/Acl/Model/FieldEntryInterface.php";a:4:{s:6:"md5sum";s:32:"2968e44f1b60586feb144fe02c5e15c3";s:4:"name";s:60:"Symfony/Component/Security/Acl/Model/FieldEntryInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/FieldEntryInterface.php";}s:60:"Symfony/Component/Security/Acl/Model/MutableAclInterface.php";a:4:{s:6:"md5sum";s:32:"e1c009bf3a30308c68b2fc8b959fc1d4";s:4:"name";s:60:"Symfony/Component/Security/Acl/Model/MutableAclInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/MutableAclInterface.php";}s:68:"Symfony/Component/Security/Acl/Model/MutableAclProviderInterface.php";a:4:{s:6:"md5sum";s:32:"fb020f4efc07611baef0206e0783b87e";s:4:"name";s:68:"Symfony/Component/Security/Acl/Model/MutableAclProviderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/MutableAclProviderInterface.php";}s:64:"Symfony/Component/Security/Acl/Model/ObjectIdentityInterface.php";a:4:{s:6:"md5sum";s:32:"29d14ee35eebd9faf6d38b97b02ea8cb";s:4:"name";s:64:"Symfony/Component/Security/Acl/Model/ObjectIdentityInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/ObjectIdentityInterface.php";}s:81:"Symfony/Component/Security/Acl/Model/ObjectIdentityRetrievalStrategyInterface.php";a:4:{s:6:"md5sum";s:32:"4c49500b0054ee78894935bebed56210";s:4:"name";s:81:"Symfony/Component/Security/Acl/Model/ObjectIdentityRetrievalStrategyInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/ObjectIdentityRetrievalStrategyInterface.php";}s:76:"Symfony/Component/Security/Acl/Model/PermissionGrantingStrategyInterface.php";a:4:{s:6:"md5sum";s:32:"713c07bfa636d7d6ad4d85d91b5f4ac4";s:4:"name";s:76:"Symfony/Component/Security/Acl/Model/PermissionGrantingStrategyInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/PermissionGrantingStrategyInterface.php";}s:66:"Symfony/Component/Security/Acl/Model/SecurityIdentityInterface.php";a:4:{s:6:"md5sum";s:32:"212111e56b11d7fba72dc585289786cb";s:4:"name";s:66:"Symfony/Component/Security/Acl/Model/SecurityIdentityInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/SecurityIdentityInterface.php";}s:83:"Symfony/Component/Security/Acl/Model/SecurityIdentityRetrievalStrategyInterface.php";a:4:{s:6:"md5sum";s:32:"0896de7498e35f5f02a9755832172a96";s:4:"name";s:83:"Symfony/Component/Security/Acl/Model/SecurityIdentityRetrievalStrategyInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model/SecurityIdentityRetrievalStrategyInterface.php";}s:64:"Symfony/Component/Security/Acl/Permission/BasicPermissionMap.php";a:4:{s:6:"md5sum";s:32:"83e5de08b981e358d3daea8b304988ca";s:4:"name";s:64:"Symfony/Component/Security/Acl/Permission/BasicPermissionMap.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Permission/BasicPermissionMap.php";}s:57:"Symfony/Component/Security/Acl/Permission/MaskBuilder.php";a:4:{s:6:"md5sum";s:32:"7918106bfa1e9cc64ca25efa8f2428f9";s:4:"name";s:57:"Symfony/Component/Security/Acl/Permission/MaskBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Permission/MaskBuilder.php";}s:68:"Symfony/Component/Security/Acl/Permission/PermissionMapInterface.php";a:4:{s:6:"md5sum";s:32:"024f4e1c3b24a5a42fe258e9ed3d83bb";s:4:"name";s:68:"Symfony/Component/Security/Acl/Permission/PermissionMapInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Permission/PermissionMapInterface.php";}s:47:"Symfony/Component/Security/Acl/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"74a4ed032849f83ee138f3ea572c315f";s:4:"name";s:47:"Symfony/Component/Security/Acl/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/phpunit.xml.dist";}s:40:"Symfony/Component/Security/Acl/README.md";a:4:{s:6:"md5sum";s:32:"5213a3c25b290a621867f47359a85972";s:4:"name";s:40:"Symfony/Component/Security/Acl/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Acl/README.md";}s:60:"Symfony/Component/Security/Acl/Resources/bin/generateSql.php";a:4:{s:6:"md5sum";s:32:"29202e9e8819885a0237ad1f5c4f1a3a";s:4:"name";s:60:"Symfony/Component/Security/Acl/Resources/bin/generateSql.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources/bin/generateSql.php";}s:55:"Symfony/Component/Security/Acl/Resources/schema/db2.sql";a:4:{s:6:"md5sum";s:32:"128855e565e079eb859f350be880f395";s:4:"name";s:55:"Symfony/Component/Security/Acl/Resources/schema/db2.sql";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources/schema/db2.sql";}s:59:"Symfony/Component/Security/Acl/Resources/schema/drizzle.sql";a:4:{s:6:"md5sum";s:32:"61db757bf91fc032fee7a78fe3ca8888";s:4:"name";s:59:"Symfony/Component/Security/Acl/Resources/schema/drizzle.sql";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources/schema/drizzle.sql";}s:57:"Symfony/Component/Security/Acl/Resources/schema/mssql.sql";a:4:{s:6:"md5sum";s:32:"be1bec1133a89cf3e7298b380d5dd9a9";s:4:"name";s:57:"Symfony/Component/Security/Acl/Resources/schema/mssql.sql";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources/schema/mssql.sql";}s:57:"Symfony/Component/Security/Acl/Resources/schema/mysql.sql";a:4:{s:6:"md5sum";s:32:"626ac34142835a1c4936290b79a05f66";s:4:"name";s:57:"Symfony/Component/Security/Acl/Resources/schema/mysql.sql";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources/schema/mysql.sql";}s:58:"Symfony/Component/Security/Acl/Resources/schema/oracle.sql";a:4:{s:6:"md5sum";s:32:"6173f90ea584ec65392676ba164d9464";s:4:"name";s:58:"Symfony/Component/Security/Acl/Resources/schema/oracle.sql";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources/schema/oracle.sql";}s:62:"Symfony/Component/Security/Acl/Resources/schema/postgresql.sql";a:4:{s:6:"md5sum";s:32:"50585e970a570428d65f9e9507da8aa8";s:4:"name";s:62:"Symfony/Component/Security/Acl/Resources/schema/postgresql.sql";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources/schema/postgresql.sql";}s:58:"Symfony/Component/Security/Acl/Resources/schema/sqlite.sql";a:4:{s:6:"md5sum";s:32:"b93a223813116f02a5cba763bd07069a";s:4:"name";s:58:"Symfony/Component/Security/Acl/Resources/schema/sqlite.sql";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources/schema/sqlite.sql";}s:70:"Symfony/Component/Security/Acl/Tests/Dbal/AclProviderBenchmarkTest.php";a:4:{s:6:"md5sum";s:32:"357d0712d7b5b92a0d8315364e0518ea";s:4:"name";s:70:"Symfony/Component/Security/Acl/Tests/Dbal/AclProviderBenchmarkTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Dbal/AclProviderBenchmarkTest.php";}s:61:"Symfony/Component/Security/Acl/Tests/Dbal/AclProviderTest.php";a:4:{s:6:"md5sum";s:32:"d332e19775917958bec95d017be52be5";s:4:"name";s:61:"Symfony/Component/Security/Acl/Tests/Dbal/AclProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Dbal/AclProviderTest.php";}s:68:"Symfony/Component/Security/Acl/Tests/Dbal/MutableAclProviderTest.php";a:4:{s:6:"md5sum";s:32:"1a46fcac5ad21b5b28b9590b1b4863fc";s:4:"name";s:68:"Symfony/Component/Security/Acl/Tests/Dbal/MutableAclProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Dbal/MutableAclProviderTest.php";}s:55:"Symfony/Component/Security/Acl/Tests/Domain/AclTest.php";a:4:{s:6:"md5sum";s:32:"70968eae1eaa4395492e7dbd5797be65";s:4:"name";s:55:"Symfony/Component/Security/Acl/Tests/Domain/AclTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/AclTest.php";}s:63:"Symfony/Component/Security/Acl/Tests/Domain/AuditLoggerTest.php";a:4:{s:6:"md5sum";s:32:"86049b2dce3364e94f6683df05125acf";s:4:"name";s:63:"Symfony/Component/Security/Acl/Tests/Domain/AuditLoggerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/AuditLoggerTest.php";}s:68:"Symfony/Component/Security/Acl/Tests/Domain/DoctrineAclCacheTest.php";a:4:{s:6:"md5sum";s:32:"099e0b3bcfdb454e46b46687a38d8a3b";s:4:"name";s:68:"Symfony/Component/Security/Acl/Tests/Domain/DoctrineAclCacheTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/DoctrineAclCacheTest.php";}s:57:"Symfony/Component/Security/Acl/Tests/Domain/EntryTest.php";a:4:{s:6:"md5sum";s:32:"4022249f6c81298b7f58ea4653ece650";s:4:"name";s:57:"Symfony/Component/Security/Acl/Tests/Domain/EntryTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/EntryTest.php";}s:62:"Symfony/Component/Security/Acl/Tests/Domain/FieldEntryTest.php";a:4:{s:6:"md5sum";s:32:"f3699fe6be1b8b45c015629251cc6f64";s:4:"name";s:62:"Symfony/Component/Security/Acl/Tests/Domain/FieldEntryTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/FieldEntryTest.php";}s:83:"Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityRetrievalStrategyTest.php";a:4:{s:6:"md5sum";s:32:"d56675ee8ce9da6ee089ab1486db1035";s:4:"name";s:83:"Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityRetrievalStrategyTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityRetrievalStrategyTest.php";}s:66:"Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityTest.php";a:4:{s:6:"md5sum";s:32:"af2604cee5638a6e0642f3c1478826c1";s:4:"name";s:66:"Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityTest.php";}s:78:"Symfony/Component/Security/Acl/Tests/Domain/PermissionGrantingStrategyTest.php";a:4:{s:6:"md5sum";s:32:"75605e8ea69d528cea564242326e8b8d";s:4:"name";s:78:"Symfony/Component/Security/Acl/Tests/Domain/PermissionGrantingStrategyTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/PermissionGrantingStrategyTest.php";}s:72:"Symfony/Component/Security/Acl/Tests/Domain/RoleSecurityIdentityTest.php";a:4:{s:6:"md5sum";s:32:"b4555d0ee6f2d61a752b0416ee9b79e8";s:4:"name";s:72:"Symfony/Component/Security/Acl/Tests/Domain/RoleSecurityIdentityTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/RoleSecurityIdentityTest.php";}s:85:"Symfony/Component/Security/Acl/Tests/Domain/SecurityIdentityRetrievalStrategyTest.php";a:4:{s:6:"md5sum";s:32:"78c619c9cec05fdf11f5de9d48b56454";s:4:"name";s:85:"Symfony/Component/Security/Acl/Tests/Domain/SecurityIdentityRetrievalStrategyTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:129:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/SecurityIdentityRetrievalStrategyTest.php";}s:72:"Symfony/Component/Security/Acl/Tests/Domain/UserSecurityIdentityTest.php";a:4:{s:6:"md5sum";s:32:"74e0d9ba1641b5cf21905336aca0d348";s:4:"name";s:72:"Symfony/Component/Security/Acl/Tests/Domain/UserSecurityIdentityTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/UserSecurityIdentityTest.php";}s:74:"Symfony/Component/Security/Acl/Tests/Permission/BasicPermissionMapTest.php";a:4:{s:6:"md5sum";s:32:"a353f4f911920e43f2e09ae3ac32d349";s:4:"name";s:74:"Symfony/Component/Security/Acl/Tests/Permission/BasicPermissionMapTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Permission/BasicPermissionMapTest.php";}s:67:"Symfony/Component/Security/Acl/Tests/Permission/MaskBuilderTest.php";a:4:{s:6:"md5sum";s:32:"3546d4afbaf25b0a4d40c216549ee272";s:4:"name";s:67:"Symfony/Component/Security/Acl/Tests/Permission/MaskBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Permission/MaskBuilderTest.php";}s:59:"Symfony/Component/Security/Acl/Tests/Voter/AclVoterTest.php";a:4:{s:6:"md5sum";s:32:"3c9129e03017adb641e9268149b935bc";s:4:"name";s:59:"Symfony/Component/Security/Acl/Tests/Voter/AclVoterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Voter/AclVoterTest.php";}s:49:"Symfony/Component/Security/Acl/Voter/AclVoter.php";a:4:{s:6:"md5sum";s:32:"8cafc8e1f14343b87cb0f58a25f463a0";s:4:"name";s:49:"Symfony/Component/Security/Acl/Voter/AclVoter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Voter/AclVoter.php";}s:50:"Symfony/Component/Security/Acl/Voter/FieldVote.php";a:4:{s:6:"md5sum";s:32:"180a2b1ab4b985facb353d6edeeb78ce";s:4:"name";s:50:"Symfony/Component/Security/Acl/Voter/FieldVote.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Voter/FieldVote.php";}s:41:"Symfony/Component/Security/autoloader.php";a:4:{s:6:"md5sum";s:32:"0fb7efcc9c1574920f39f115e9863b68";s:4:"name";s:41:"Symfony/Component/Security/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/autoloader.php";}s:39:"Symfony/Component/Security/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"2def4fa9f9525638a5a9c6f556ba1386";s:4:"name";s:39:"Symfony/Component/Security/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/CHANGELOG.md";}s:40:"Symfony/Component/Security/composer.json";a:4:{s:6:"md5sum";s:32:"f0488bd3f14f86892ce93d89dad55776";s:4:"name";s:40:"Symfony/Component/Security/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/composer.json";}s:81:"Symfony/Component/Security/Core/Authentication/AuthenticationManagerInterface.php";a:4:{s:6:"md5sum";s:32:"c78d485138ebdc2fa2be48a396cb9ad2";s:4:"name";s:81:"Symfony/Component/Security/Core/Authentication/AuthenticationManagerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/AuthenticationManagerInterface.php";}s:80:"Symfony/Component/Security/Core/Authentication/AuthenticationProviderManager.php";a:4:{s:6:"md5sum";s:32:"61167585d6d54cf1861b70f2344632c1";s:4:"name";s:80:"Symfony/Component/Security/Core/Authentication/AuthenticationProviderManager.php";s:4:"role";s:3:"php";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/AuthenticationProviderManager.php";}s:78:"Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolver.php";a:4:{s:6:"md5sum";s:32:"4a5356ef0cf45593536da075d0d367a1";s:4:"name";s:78:"Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolver.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolver.php";}s:87:"Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.php";a:4:{s:6:"md5sum";s:32:"dda5e9627c9c68a695cdd5071de86834";s:4:"name";s:87:"Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.php";}s:91:"Symfony/Component/Security/Core/Authentication/Provider/AnonymousAuthenticationProvider.php";a:4:{s:6:"md5sum";s:32:"00cb0dfecd7dc6fedc2426932405dbec";s:4:"name";s:91:"Symfony/Component/Security/Core/Authentication/Provider/AnonymousAuthenticationProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Provider/AnonymousAuthenticationProvider.php";}s:91:"Symfony/Component/Security/Core/Authentication/Provider/AuthenticationProviderInterface.php";a:4:{s:6:"md5sum";s:32:"07f5b8692dd849851a84662b9f60b759";s:4:"name";s:91:"Symfony/Component/Security/Core/Authentication/Provider/AuthenticationProviderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Provider/AuthenticationProviderInterface.php";}s:85:"Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php";a:4:{s:6:"md5sum";s:32:"ccc63dc0c7c865036a3e64fb6819073e";s:4:"name";s:85:"Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php";}s:98:"Symfony/Component/Security/Core/Authentication/Provider/PreAuthenticatedAuthenticationProvider.php";a:4:{s:6:"md5sum";s:32:"df05c4c0bdbdb5f00d68909724d552af";s:4:"name";s:98:"Symfony/Component/Security/Core/Authentication/Provider/PreAuthenticatedAuthenticationProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Provider/PreAuthenticatedAuthenticationProvider.php";}s:92:"Symfony/Component/Security/Core/Authentication/Provider/RememberMeAuthenticationProvider.php";a:4:{s:6:"md5sum";s:32:"bdcb91d96aacde5a99192f145495e66e";s:4:"name";s:92:"Symfony/Component/Security/Core/Authentication/Provider/RememberMeAuthenticationProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Provider/RememberMeAuthenticationProvider.php";}s:88:"Symfony/Component/Security/Core/Authentication/Provider/SimpleAuthenticationProvider.php";a:4:{s:6:"md5sum";s:32:"62c25b49d796de82786905533be97a8b";s:4:"name";s:88:"Symfony/Component/Security/Core/Authentication/Provider/SimpleAuthenticationProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Provider/SimpleAuthenticationProvider.php";}s:86:"Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php";a:4:{s:6:"md5sum";s:32:"4f720340d1992a6261fc7cf795ca0b4d";s:4:"name";s:86:"Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php";}s:83:"Symfony/Component/Security/Core/Authentication/RememberMe/InMemoryTokenProvider.php";a:4:{s:6:"md5sum";s:32:"563ca47a94d2f91eb98c8091590f6ab2";s:4:"name";s:83:"Symfony/Component/Security/Core/Authentication/RememberMe/InMemoryTokenProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/RememberMe/InMemoryTokenProvider.php";}s:77:"Symfony/Component/Security/Core/Authentication/RememberMe/PersistentToken.php";a:4:{s:6:"md5sum";s:32:"4888d2851eff9cf472a9acf0e93e33a4";s:4:"name";s:77:"Symfony/Component/Security/Core/Authentication/RememberMe/PersistentToken.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/RememberMe/PersistentToken.php";}s:86:"Symfony/Component/Security/Core/Authentication/RememberMe/PersistentTokenInterface.php";a:4:{s:6:"md5sum";s:32:"2945e844ab362b935608de1ccf071018";s:4:"name";s:86:"Symfony/Component/Security/Core/Authentication/RememberMe/PersistentTokenInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/RememberMe/PersistentTokenInterface.php";}s:84:"Symfony/Component/Security/Core/Authentication/RememberMe/TokenProviderInterface.php";a:4:{s:6:"md5sum";s:32:"5ba08141bb0ac7eb83d877a87e9689ed";s:4:"name";s:84:"Symfony/Component/Security/Core/Authentication/RememberMe/TokenProviderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/RememberMe/TokenProviderInterface.php";}s:79:"Symfony/Component/Security/Core/Authentication/SimpleAuthenticatorInterface.php";a:4:{s:6:"md5sum";s:32:"cfc5b482e19a6559b87fa3cc80665720";s:4:"name";s:79:"Symfony/Component/Security/Core/Authentication/SimpleAuthenticatorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/SimpleAuthenticatorInterface.php";}s:83:"Symfony/Component/Security/Core/Authentication/SimpleFormAuthenticatorInterface.php";a:4:{s:6:"md5sum";s:32:"3dd46ffbfb5919606d71d89c5bf82f97";s:4:"name";s:83:"Symfony/Component/Security/Core/Authentication/SimpleFormAuthenticatorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/SimpleFormAuthenticatorInterface.php";}s:82:"Symfony/Component/Security/Core/Authentication/SimplePreAuthenticatorInterface.php";a:4:{s:6:"md5sum";s:32:"417cad7687deea94ba31fe8d86fcbdf1";s:4:"name";s:82:"Symfony/Component/Security/Core/Authentication/SimplePreAuthenticatorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/SimplePreAuthenticatorInterface.php";}s:70:"Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php";a:4:{s:6:"md5sum";s:32:"50a0fa6d56839562be5866c8a3915497";s:4:"name";s:70:"Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php";}s:71:"Symfony/Component/Security/Core/Authentication/Token/AnonymousToken.php";a:4:{s:6:"md5sum";s:32:"4185126f45762b4301b9b6cb2d159bb9";s:4:"name";s:71:"Symfony/Component/Security/Core/Authentication/Token/AnonymousToken.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Token/AnonymousToken.php";}s:78:"Symfony/Component/Security/Core/Authentication/Token/PreAuthenticatedToken.php";a:4:{s:6:"md5sum";s:32:"e5015c2bc9254901b0255ced46129f93";s:4:"name";s:78:"Symfony/Component/Security/Core/Authentication/Token/PreAuthenticatedToken.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Token/PreAuthenticatedToken.php";}s:72:"Symfony/Component/Security/Core/Authentication/Token/RememberMeToken.php";a:4:{s:6:"md5sum";s:32:"822307b7ea3a72ec932599c9bece3a97";s:4:"name";s:72:"Symfony/Component/Security/Core/Authentication/Token/RememberMeToken.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Token/RememberMeToken.php";}s:71:"Symfony/Component/Security/Core/Authentication/Token/TokenInterface.php";a:4:{s:6:"md5sum";s:32:"4143633b44f1659cf8409a64ca407b51";s:4:"name";s:71:"Symfony/Component/Security/Core/Authentication/Token/TokenInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Token/TokenInterface.php";}s:78:"Symfony/Component/Security/Core/Authentication/Token/UsernamePasswordToken.php";a:4:{s:6:"md5sum";s:32:"4bd196890e484daf675d82322028be1c";s:4:"name";s:78:"Symfony/Component/Security/Core/Authentication/Token/UsernamePasswordToken.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Token/UsernamePasswordToken.php";}s:56:"Symfony/Component/Security/Core/AuthenticationEvents.php";a:4:{s:6:"md5sum";s:32:"cdc9190c3179e73eaecdbbbca659b22e";s:4:"name";s:56:"Symfony/Component/Security/Core/AuthenticationEvents.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/AuthenticationEvents.php";}s:71:"Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php";a:4:{s:6:"md5sum";s:32:"4a6916eb9cf4fc40f478dbb623ffdce9";s:4:"name";s:71:"Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php";}s:80:"Symfony/Component/Security/Core/Authorization/AccessDecisionManagerInterface.php";a:4:{s:6:"md5sum";s:32:"2865601c03c45ce3621d9013c5347d9f";s:4:"name";s:80:"Symfony/Component/Security/Core/Authorization/AccessDecisionManagerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authorization/AccessDecisionManagerInterface.php";}s:68:"Symfony/Component/Security/Core/Authorization/ExpressionLanguage.php";a:4:{s:6:"md5sum";s:32:"3b7fae5344cfe097002ea98131ce6956";s:4:"name";s:68:"Symfony/Component/Security/Core/Authorization/ExpressionLanguage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authorization/ExpressionLanguage.php";}s:74:"Symfony/Component/Security/Core/Authorization/Voter/AuthenticatedVoter.php";a:4:{s:6:"md5sum";s:32:"f2f64cf4065691e1e0b9c4c0f1425f80";s:4:"name";s:74:"Symfony/Component/Security/Core/Authorization/Voter/AuthenticatedVoter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authorization/Voter/AuthenticatedVoter.php";}s:71:"Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php";a:4:{s:6:"md5sum";s:32:"2ea414aff917d1469902138f7e0d5cd0";s:4:"name";s:71:"Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php";}s:74:"Symfony/Component/Security/Core/Authorization/Voter/RoleHierarchyVoter.php";a:4:{s:6:"md5sum";s:32:"089ca490f923e6a32cf080b0e2a27e2f";s:4:"name";s:74:"Symfony/Component/Security/Core/Authorization/Voter/RoleHierarchyVoter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authorization/Voter/RoleHierarchyVoter.php";}s:65:"Symfony/Component/Security/Core/Authorization/Voter/RoleVoter.php";a:4:{s:6:"md5sum";s:32:"ff0a673dff9312faaebb78b23a04535f";s:4:"name";s:65:"Symfony/Component/Security/Core/Authorization/Voter/RoleVoter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authorization/Voter/RoleVoter.php";}s:70:"Symfony/Component/Security/Core/Authorization/Voter/VoterInterface.php";a:4:{s:6:"md5sum";s:32:"003e7949d849e45e4fdffa9a835a2599";s:4:"name";s:70:"Symfony/Component/Security/Core/Authorization/Voter/VoterInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authorization/Voter/VoterInterface.php";}s:45:"Symfony/Component/Security/Core/composer.json";a:4:{s:6:"md5sum";s:32:"15e1e6270e2d6d3318237d3363338f50";s:4:"name";s:45:"Symfony/Component/Security/Core/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Core/composer.json";}s:63:"Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php";a:4:{s:6:"md5sum";s:32:"a7a02c1c8ee5f97fdc8c267b48ae13ed";s:4:"name";s:63:"Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php";}s:65:"Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php";a:4:{s:6:"md5sum";s:32:"0f16a3510e7372c61dd03b2b3bb7564f";s:4:"name";s:65:"Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php";}s:58:"Symfony/Component/Security/Core/Encoder/EncoderFactory.php";a:4:{s:6:"md5sum";s:32:"6c687634e27d9118951ce27c88dfe481";s:4:"name";s:58:"Symfony/Component/Security/Core/Encoder/EncoderFactory.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Encoder/EncoderFactory.php";}s:67:"Symfony/Component/Security/Core/Encoder/EncoderFactoryInterface.php";a:4:{s:6:"md5sum";s:32:"1330018384392f42e4b5caa6cb012f95";s:4:"name";s:67:"Symfony/Component/Security/Core/Encoder/EncoderFactoryInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Encoder/EncoderFactoryInterface.php";}s:72:"Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php";a:4:{s:6:"md5sum";s:32:"7cd742b70754d9c9d8f0ca029ef4b64f";s:4:"name";s:72:"Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php";}s:68:"Symfony/Component/Security/Core/Encoder/PasswordEncoderInterface.php";a:4:{s:6:"md5sum";s:32:"0dde4a14a6d89ad005406ffbf9422d1f";s:4:"name";s:68:"Symfony/Component/Security/Core/Encoder/PasswordEncoderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Encoder/PasswordEncoderInterface.php";}s:65:"Symfony/Component/Security/Core/Encoder/Pbkdf2PasswordEncoder.php";a:4:{s:6:"md5sum";s:32:"a97a3832eee0a328215a49fb252282fb";s:4:"name";s:65:"Symfony/Component/Security/Core/Encoder/Pbkdf2PasswordEncoder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Encoder/Pbkdf2PasswordEncoder.php";}s:68:"Symfony/Component/Security/Core/Encoder/PlaintextPasswordEncoder.php";a:4:{s:6:"md5sum";s:32:"e07d25f0fa35b7bfc88b3d19478da95e";s:4:"name";s:68:"Symfony/Component/Security/Core/Encoder/PlaintextPasswordEncoder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Encoder/PlaintextPasswordEncoder.php";}s:61:"Symfony/Component/Security/Core/Event/AuthenticationEvent.php";a:4:{s:6:"md5sum";s:32:"e976a22829d8fd7b3a67528c5f68610f";s:4:"name";s:61:"Symfony/Component/Security/Core/Event/AuthenticationEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Event/AuthenticationEvent.php";}s:68:"Symfony/Component/Security/Core/Event/AuthenticationFailureEvent.php";a:4:{s:6:"md5sum";s:32:"c303cb0e16eab8cbaa2d24d416dc89b1";s:4:"name";s:68:"Symfony/Component/Security/Core/Event/AuthenticationFailureEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Event/AuthenticationFailureEvent.php";}s:67:"Symfony/Component/Security/Core/Exception/AccessDeniedException.php";a:4:{s:6:"md5sum";s:32:"92c25b19f903e89aa16d8cd887600d9b";s:4:"name";s:67:"Symfony/Component/Security/Core/Exception/AccessDeniedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/AccessDeniedException.php";}s:69:"Symfony/Component/Security/Core/Exception/AccountExpiredException.php";a:4:{s:6:"md5sum";s:32:"cbaf077cb23fd56e405fe305089be4f1";s:4:"name";s:69:"Symfony/Component/Security/Core/Exception/AccountExpiredException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/AccountExpiredException.php";}s:68:"Symfony/Component/Security/Core/Exception/AccountStatusException.php";a:4:{s:6:"md5sum";s:32:"897def6142e95038f5b7e1be80789952";s:4:"name";s:68:"Symfony/Component/Security/Core/Exception/AccountStatusException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/AccountStatusException.php";}s:88:"Symfony/Component/Security/Core/Exception/AuthenticationCredentialsNotFoundException.php";a:4:{s:6:"md5sum";s:32:"f216cb63ef5a186ee50eba5144ceddc7";s:4:"name";s:88:"Symfony/Component/Security/Core/Exception/AuthenticationCredentialsNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/AuthenticationCredentialsNotFoundException.php";}s:69:"Symfony/Component/Security/Core/Exception/AuthenticationException.php";a:4:{s:6:"md5sum";s:32:"29cc9dc1a7659e59a786dd9788937455";s:4:"name";s:69:"Symfony/Component/Security/Core/Exception/AuthenticationException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/AuthenticationException.php";}s:76:"Symfony/Component/Security/Core/Exception/AuthenticationServiceException.php";a:4:{s:6:"md5sum";s:32:"9208968ac310a1959595d8bfc270c270";s:4:"name";s:76:"Symfony/Component/Security/Core/Exception/AuthenticationServiceException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/AuthenticationServiceException.php";}s:69:"Symfony/Component/Security/Core/Exception/BadCredentialsException.php";a:4:{s:6:"md5sum";s:32:"8dcc2180afe1ca2a5ba64b3b7b9374b7";s:4:"name";s:69:"Symfony/Component/Security/Core/Exception/BadCredentialsException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/BadCredentialsException.php";}s:66:"Symfony/Component/Security/Core/Exception/CookieTheftException.php";a:4:{s:6:"md5sum";s:32:"1501fc38bd5c20b9c3bc3fde481d096d";s:4:"name";s:66:"Symfony/Component/Security/Core/Exception/CookieTheftException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/CookieTheftException.php";}s:73:"Symfony/Component/Security/Core/Exception/CredentialsExpiredException.php";a:4:{s:6:"md5sum";s:32:"7f862b829f86bf262fef80f92fa1efd9";s:4:"name";s:73:"Symfony/Component/Security/Core/Exception/CredentialsExpiredException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/CredentialsExpiredException.php";}s:63:"Symfony/Component/Security/Core/Exception/DisabledException.php";a:4:{s:6:"md5sum";s:32:"964e01e15a4fc37e74bf8b832495e786";s:4:"name";s:63:"Symfony/Component/Security/Core/Exception/DisabledException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/DisabledException.php";}s:64:"Symfony/Component/Security/Core/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"13fca1be9c3957516e99beb9811cbea5";s:4:"name";s:64:"Symfony/Component/Security/Core/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/ExceptionInterface.php";}s:81:"Symfony/Component/Security/Core/Exception/InsufficientAuthenticationException.php";a:4:{s:6:"md5sum";s:32:"437a16a50032457b90bec37786b55947";s:4:"name";s:81:"Symfony/Component/Security/Core/Exception/InsufficientAuthenticationException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/InsufficientAuthenticationException.php";}s:70:"Symfony/Component/Security/Core/Exception/InvalidArgumentException.php";a:4:{s:6:"md5sum";s:32:"5851c6d868699f1dc1e6eccb96793449";s:4:"name";s:70:"Symfony/Component/Security/Core/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/InvalidArgumentException.php";}s:71:"Symfony/Component/Security/Core/Exception/InvalidCsrfTokenException.php";a:4:{s:6:"md5sum";s:32:"0822aa405f9ea4d78d55f91c8b74eeb7";s:4:"name";s:71:"Symfony/Component/Security/Core/Exception/InvalidCsrfTokenException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/InvalidCsrfTokenException.php";}s:61:"Symfony/Component/Security/Core/Exception/LockedException.php";a:4:{s:6:"md5sum";s:32:"5d23c71dcff00d3f9a716115caa7164d";s:4:"name";s:61:"Symfony/Component/Security/Core/Exception/LockedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/LockedException.php";}s:61:"Symfony/Component/Security/Core/Exception/LogoutException.php";a:4:{s:6:"md5sum";s:32:"7e9bb714f4fdc03bf4158d3ebafd9181";s:4:"name";s:61:"Symfony/Component/Security/Core/Exception/LogoutException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/LogoutException.php";}s:67:"Symfony/Component/Security/Core/Exception/NonceExpiredException.php";a:4:{s:6:"md5sum";s:32:"ba9525c7d4bc829f3569f785b9399c18";s:4:"name";s:67:"Symfony/Component/Security/Core/Exception/NonceExpiredException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/NonceExpiredException.php";}s:71:"Symfony/Component/Security/Core/Exception/ProviderNotFoundException.php";a:4:{s:6:"md5sum";s:32:"bc44ab7bd2bf3f5118c22c174d164773";s:4:"name";s:71:"Symfony/Component/Security/Core/Exception/ProviderNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/ProviderNotFoundException.php";}s:62:"Symfony/Component/Security/Core/Exception/RuntimeException.php";a:4:{s:6:"md5sum";s:32:"eedf3a5276fc76bb3c7854d3ae9410ea";s:4:"name";s:62:"Symfony/Component/Security/Core/Exception/RuntimeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/RuntimeException.php";}s:73:"Symfony/Component/Security/Core/Exception/SessionUnavailableException.php";a:4:{s:6:"md5sum";s:32:"67db74104de766f8625e248576f999da";s:4:"name";s:73:"Symfony/Component/Security/Core/Exception/SessionUnavailableException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/SessionUnavailableException.php";}s:68:"Symfony/Component/Security/Core/Exception/TokenNotFoundException.php";a:4:{s:6:"md5sum";s:32:"d9b2b76d30d8faa7835d19faa92e7746";s:4:"name";s:68:"Symfony/Component/Security/Core/Exception/TokenNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/TokenNotFoundException.php";}s:70:"Symfony/Component/Security/Core/Exception/UnsupportedUserException.php";a:4:{s:6:"md5sum";s:32:"6a7031722e579b577881dd26548a2582";s:4:"name";s:70:"Symfony/Component/Security/Core/Exception/UnsupportedUserException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/UnsupportedUserException.php";}s:71:"Symfony/Component/Security/Core/Exception/UsernameNotFoundException.php";a:4:{s:6:"md5sum";s:32:"1bbd1cdc4a27e69cb001f60f6f17b953";s:4:"name";s:71:"Symfony/Component/Security/Core/Exception/UsernameNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception/UsernameNotFoundException.php";}s:39:"Symfony/Component/Security/Core/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:39:"Symfony/Component/Security/Core/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Core/LICENSE";}s:48:"Symfony/Component/Security/Core/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"b24852b42833e802e562d16e16c4e819";s:4:"name";s:48:"Symfony/Component/Security/Core/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/phpunit.xml.dist";}s:41:"Symfony/Component/Security/Core/README.md";a:4:{s:6:"md5sum";s:32:"f20b648364f60e5c4c4093a968fc5331";s:4:"name";s:41:"Symfony/Component/Security/Core/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Core/README.md";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.ar.xlf";a:4:{s:6:"md5sum";s:32:"1e750b4762305800f3dd181eab53e2ba";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.ar.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.ar.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.ca.xlf";a:4:{s:6:"md5sum";s:32:"31cbf1bd957d4f4c3401c20d9a1b10bc";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.ca.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.ca.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.cs.xlf";a:4:{s:6:"md5sum";s:32:"0cf2e748f73950fb74f6a5978ab773f4";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.cs.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.cs.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.da.xlf";a:4:{s:6:"md5sum";s:32:"fcd7c0a40a3a5b074abce43148053890";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.da.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.da.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.de.xlf";a:4:{s:6:"md5sum";s:32:"a01afc0ce8bdc7598652c6560fae8512";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.de.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.de.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.el.xlf";a:4:{s:6:"md5sum";s:32:"c2883d0b5e1e7eeed7ec66ea9853f5cc";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.el.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.el.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.en.xlf";a:4:{s:6:"md5sum";s:32:"0c6a0114323a39fad8cb33246be7b7d9";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.en.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.en.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.es.xlf";a:4:{s:6:"md5sum";s:32:"7ae3e719888ac0c94aeda98734b5e9f5";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.es.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.es.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.fa.xlf";a:4:{s:6:"md5sum";s:32:"eef6f0230157636659e13c466e498cd9";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.fa.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.fa.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.fr.xlf";a:4:{s:6:"md5sum";s:32:"8d726781df922dfb126eb85c6c1cf7f5";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.fr.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.fr.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.gl.xlf";a:4:{s:6:"md5sum";s:32:"d24525aa71ea6294f1b0dad40d7a5b70";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.gl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.gl.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.hu.xlf";a:4:{s:6:"md5sum";s:32:"b8704be78d7be163b715e166f07257e3";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.hu.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.hu.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.it.xlf";a:4:{s:6:"md5sum";s:32:"47a2f3df6c37532fe6a486073aebd0a1";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.it.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.it.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.lb.xlf";a:4:{s:6:"md5sum";s:32:"defce0bf7d3e026fbdaebb0cfe7abbd6";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.lb.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.lb.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.nl.xlf";a:4:{s:6:"md5sum";s:32:"79d67b79332d77ce5d39a8531f219538";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.nl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.nl.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.no.xlf";a:4:{s:6:"md5sum";s:32:"3ca24d84b0c49e93e8425dbc96b5d479";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.no.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.no.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.pl.xlf";a:4:{s:6:"md5sum";s:32:"f6e927ae45bf961507418d03db1c676d";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.pl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.pl.xlf";}s:73:"Symfony/Component/Security/Core/Resources/translations/security.pt_BR.xlf";a:4:{s:6:"md5sum";s:32:"ff2d10ee020b23d10e8a49c3f72b77af";s:4:"name";s:73:"Symfony/Component/Security/Core/Resources/translations/security.pt_BR.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.pt_BR.xlf";}s:73:"Symfony/Component/Security/Core/Resources/translations/security.pt_PT.xlf";a:4:{s:6:"md5sum";s:32:"2855177bf25fd860bca194067f350e0a";s:4:"name";s:73:"Symfony/Component/Security/Core/Resources/translations/security.pt_PT.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.pt_PT.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.ro.xlf";a:4:{s:6:"md5sum";s:32:"f07b53a0e13bb3f1267b212e07b49a14";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.ro.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.ro.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.ru.xlf";a:4:{s:6:"md5sum";s:32:"f943d4b750be69bd91e03eca27df52f5";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.ru.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.ru.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.sk.xlf";a:4:{s:6:"md5sum";s:32:"a570f49a5deb0bba84a8f5ce71018b32";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.sk.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.sk.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.sl.xlf";a:4:{s:6:"md5sum";s:32:"0a5e641bcbd17d9502a2f2f3e1d51999";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.sl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.sl.xlf";}s:75:"Symfony/Component/Security/Core/Resources/translations/security.sr_Cyrl.xlf";a:4:{s:6:"md5sum";s:32:"823f2ed1191ec9723d46f2516d700973";s:4:"name";s:75:"Symfony/Component/Security/Core/Resources/translations/security.sr_Cyrl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.sr_Cyrl.xlf";}s:75:"Symfony/Component/Security/Core/Resources/translations/security.sr_Latn.xlf";a:4:{s:6:"md5sum";s:32:"a95969c966594fa2afcf4c0f58dcf034";s:4:"name";s:75:"Symfony/Component/Security/Core/Resources/translations/security.sr_Latn.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.sr_Latn.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.sv.xlf";a:4:{s:6:"md5sum";s:32:"ef66c814ecc8a2fc5fbbe30dd23f3a82";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.sv.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.sv.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.tr.xlf";a:4:{s:6:"md5sum";s:32:"0d789d9cb295319cb483f864ca99b2bf";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.tr.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.tr.xlf";}s:70:"Symfony/Component/Security/Core/Resources/translations/security.ua.xlf";a:4:{s:6:"md5sum";s:32:"c7e13f578ddab881e5bb035d0e905048";s:4:"name";s:70:"Symfony/Component/Security/Core/Resources/translations/security.ua.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations/security.ua.xlf";}s:45:"Symfony/Component/Security/Core/Role/Role.php";a:4:{s:6:"md5sum";s:32:"3050382d1549c2b01456b9361e8facd3";s:4:"name";s:45:"Symfony/Component/Security/Core/Role/Role.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Role/Role.php";}s:54:"Symfony/Component/Security/Core/Role/RoleHierarchy.php";a:4:{s:6:"md5sum";s:32:"bca85cac483875c294bb4577942b5e13";s:4:"name";s:54:"Symfony/Component/Security/Core/Role/RoleHierarchy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Role/RoleHierarchy.php";}s:63:"Symfony/Component/Security/Core/Role/RoleHierarchyInterface.php";a:4:{s:6:"md5sum";s:32:"675f61146da7cd1caec751a2d261b0e6";s:4:"name";s:63:"Symfony/Component/Security/Core/Role/RoleHierarchyInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Role/RoleHierarchyInterface.php";}s:54:"Symfony/Component/Security/Core/Role/RoleInterface.php";a:4:{s:6:"md5sum";s:32:"b03592fb0521d323c36939ab08985fce";s:4:"name";s:54:"Symfony/Component/Security/Core/Role/RoleInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Role/RoleInterface.php";}s:55:"Symfony/Component/Security/Core/Role/SwitchUserRole.php";a:4:{s:6:"md5sum";s:32:"8826f3ebe695c64183b161bc895da3d9";s:4:"name";s:55:"Symfony/Component/Security/Core/Role/SwitchUserRole.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Role/SwitchUserRole.php";}s:51:"Symfony/Component/Security/Core/SecurityContext.php";a:4:{s:6:"md5sum";s:32:"10ecd1343fe383863fcf07aea6e1484e";s:4:"name";s:51:"Symfony/Component/Security/Core/SecurityContext.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/SecurityContext.php";}s:60:"Symfony/Component/Security/Core/SecurityContextInterface.php";a:4:{s:6:"md5sum";s:32:"55a5781675e114c92bad8bad5aa2830d";s:4:"name";s:60:"Symfony/Component/Security/Core/SecurityContextInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/SecurityContextInterface.php";}s:90:"Symfony/Component/Security/Core/Tests/Authentication/AuthenticationProviderManagerTest.php";a:4:{s:6:"md5sum";s:32:"b63b6b59d9a86eb0d75e0b96f791cebe";s:4:"name";s:90:"Symfony/Component/Security/Core/Tests/Authentication/AuthenticationProviderManagerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/AuthenticationProviderManagerTest.php";}s:88:"Symfony/Component/Security/Core/Tests/Authentication/AuthenticationTrustResolverTest.php";a:4:{s:6:"md5sum";s:32:"678c0f4dcee8c6b4c914596f68e8066c";s:4:"name";s:88:"Symfony/Component/Security/Core/Tests/Authentication/AuthenticationTrustResolverTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:132:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/AuthenticationTrustResolverTest.php";}s:101:"Symfony/Component/Security/Core/Tests/Authentication/Provider/AnonymousAuthenticationProviderTest.php";a:4:{s:6:"md5sum";s:32:"9b7f1e61792f26921f8ac8005047ec5a";s:4:"name";s:101:"Symfony/Component/Security/Core/Tests/Authentication/Provider/AnonymousAuthenticationProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:145:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider/AnonymousAuthenticationProviderTest.php";}s:95:"Symfony/Component/Security/Core/Tests/Authentication/Provider/DaoAuthenticationProviderTest.php";a:4:{s:6:"md5sum";s:32:"9e46dd36c66d8390ff4ef27308eaf788";s:4:"name";s:95:"Symfony/Component/Security/Core/Tests/Authentication/Provider/DaoAuthenticationProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:139:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider/DaoAuthenticationProviderTest.php";}s:108:"Symfony/Component/Security/Core/Tests/Authentication/Provider/PreAuthenticatedAuthenticationProviderTest.php";a:4:{s:6:"md5sum";s:32:"56a160fc914fa20188f3fb4428231071";s:4:"name";s:108:"Symfony/Component/Security/Core/Tests/Authentication/Provider/PreAuthenticatedAuthenticationProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:152:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider/PreAuthenticatedAuthenticationProviderTest.php";}s:102:"Symfony/Component/Security/Core/Tests/Authentication/Provider/RememberMeAuthenticationProviderTest.php";a:4:{s:6:"md5sum";s:32:"7d87ce759a8a0bc6a43e083bcbf65a7e";s:4:"name";s:102:"Symfony/Component/Security/Core/Tests/Authentication/Provider/RememberMeAuthenticationProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:146:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider/RememberMeAuthenticationProviderTest.php";}s:96:"Symfony/Component/Security/Core/Tests/Authentication/Provider/UserAuthenticationProviderTest.php";a:4:{s:6:"md5sum";s:32:"878a24250d15912e8875b761f1b18cd6";s:4:"name";s:96:"Symfony/Component/Security/Core/Tests/Authentication/Provider/UserAuthenticationProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:140:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider/UserAuthenticationProviderTest.php";}s:93:"Symfony/Component/Security/Core/Tests/Authentication/RememberMe/InMemoryTokenProviderTest.php";a:4:{s:6:"md5sum";s:32:"dd3f29d0edf632c2e0668095d433e2b8";s:4:"name";s:93:"Symfony/Component/Security/Core/Tests/Authentication/RememberMe/InMemoryTokenProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:137:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/RememberMe/InMemoryTokenProviderTest.php";}s:87:"Symfony/Component/Security/Core/Tests/Authentication/RememberMe/PersistentTokenTest.php";a:4:{s:6:"md5sum";s:32:"333af5f2e4fca41f0ad52c067fc6f6fa";s:4:"name";s:87:"Symfony/Component/Security/Core/Tests/Authentication/RememberMe/PersistentTokenTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:131:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/RememberMe/PersistentTokenTest.php";}s:80:"Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php";a:4:{s:6:"md5sum";s:32:"63d1895301e8c4db998257793246ddd4";s:4:"name";s:80:"Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php";}s:81:"Symfony/Component/Security/Core/Tests/Authentication/Token/AnonymousTokenTest.php";a:4:{s:6:"md5sum";s:32:"165abe0414d3fd9f6b87b77a974dbf87";s:4:"name";s:81:"Symfony/Component/Security/Core/Tests/Authentication/Token/AnonymousTokenTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Token/AnonymousTokenTest.php";}s:88:"Symfony/Component/Security/Core/Tests/Authentication/Token/PreAuthenticatedTokenTest.php";a:4:{s:6:"md5sum";s:32:"ea0e9ad02afbff6e37eb9dcceb635102";s:4:"name";s:88:"Symfony/Component/Security/Core/Tests/Authentication/Token/PreAuthenticatedTokenTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:132:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Token/PreAuthenticatedTokenTest.php";}s:88:"Symfony/Component/Security/Core/Tests/Authentication/Token/UsernamePasswordTokenTest.php";a:4:{s:6:"md5sum";s:32:"881577a37dc13881037471af86e54c26";s:4:"name";s:88:"Symfony/Component/Security/Core/Tests/Authentication/Token/UsernamePasswordTokenTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:132:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Token/UsernamePasswordTokenTest.php";}s:81:"Symfony/Component/Security/Core/Tests/Authorization/AccessDecisionManagerTest.php";a:4:{s:6:"md5sum";s:32:"01615835979113e72ba01df5db514cfe";s:4:"name";s:81:"Symfony/Component/Security/Core/Tests/Authorization/AccessDecisionManagerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/AccessDecisionManagerTest.php";}s:78:"Symfony/Component/Security/Core/Tests/Authorization/ExpressionLanguageTest.php";a:4:{s:6:"md5sum";s:32:"53e2015913c42918f488b6b5768dcfd6";s:4:"name";s:78:"Symfony/Component/Security/Core/Tests/Authorization/ExpressionLanguageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/ExpressionLanguageTest.php";}s:84:"Symfony/Component/Security/Core/Tests/Authorization/Voter/AuthenticatedVoterTest.php";a:4:{s:6:"md5sum";s:32:"09a4601d7459111b412a28d8b3ba77e6";s:4:"name";s:84:"Symfony/Component/Security/Core/Tests/Authorization/Voter/AuthenticatedVoterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/Voter/AuthenticatedVoterTest.php";}s:81:"Symfony/Component/Security/Core/Tests/Authorization/Voter/ExpressionVoterTest.php";a:4:{s:6:"md5sum";s:32:"f7de9f0134587eca878b84fa96cd4e11";s:4:"name";s:81:"Symfony/Component/Security/Core/Tests/Authorization/Voter/ExpressionVoterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/Voter/ExpressionVoterTest.php";}s:84:"Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleHierarchyVoterTest.php";a:4:{s:6:"md5sum";s:32:"1515e17b427defd7ede0b26cd62d6f7c";s:4:"name";s:84:"Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleHierarchyVoterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleHierarchyVoterTest.php";}s:75:"Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleVoterTest.php";a:4:{s:6:"md5sum";s:32:"6eafbf6e21bcb931d7deeb6c7a03d09d";s:4:"name";s:75:"Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleVoterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleVoterTest.php";}s:73:"Symfony/Component/Security/Core/Tests/Encoder/BasePasswordEncoderTest.php";a:4:{s:6:"md5sum";s:32:"262dd768f1ab73f96eee0a29a7665d3f";s:4:"name";s:73:"Symfony/Component/Security/Core/Tests/Encoder/BasePasswordEncoderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/BasePasswordEncoderTest.php";}s:75:"Symfony/Component/Security/Core/Tests/Encoder/BCryptPasswordEncoderTest.php";a:4:{s:6:"md5sum";s:32:"a052af732959cb4100386622650cde49";s:4:"name";s:75:"Symfony/Component/Security/Core/Tests/Encoder/BCryptPasswordEncoderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/BCryptPasswordEncoderTest.php";}s:68:"Symfony/Component/Security/Core/Tests/Encoder/EncoderFactoryTest.php";a:4:{s:6:"md5sum";s:32:"c4466a3921e1ef6bc3ffa19e825cc264";s:4:"name";s:68:"Symfony/Component/Security/Core/Tests/Encoder/EncoderFactoryTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/EncoderFactoryTest.php";}s:82:"Symfony/Component/Security/Core/Tests/Encoder/MessageDigestPasswordEncoderTest.php";a:4:{s:6:"md5sum";s:32:"1a2e9523c0f574255c5e8cc12563036d";s:4:"name";s:82:"Symfony/Component/Security/Core/Tests/Encoder/MessageDigestPasswordEncoderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/MessageDigestPasswordEncoderTest.php";}s:75:"Symfony/Component/Security/Core/Tests/Encoder/Pbkdf2PasswordEncoderTest.php";a:4:{s:6:"md5sum";s:32:"47d32cbddb94e8c940a067da8bd652c8";s:4:"name";s:75:"Symfony/Component/Security/Core/Tests/Encoder/Pbkdf2PasswordEncoderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/Pbkdf2PasswordEncoderTest.php";}s:78:"Symfony/Component/Security/Core/Tests/Encoder/PlaintextPasswordEncoderTest.php";a:4:{s:6:"md5sum";s:32:"9a3e27e7243e0aef39d89ce5048f0156";s:4:"name";s:78:"Symfony/Component/Security/Core/Tests/Encoder/PlaintextPasswordEncoderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/PlaintextPasswordEncoderTest.php";}s:64:"Symfony/Component/Security/Core/Tests/Role/RoleHierarchyTest.php";a:4:{s:6:"md5sum";s:32:"e84df0653432699a74f9892f39cd801d";s:4:"name";s:64:"Symfony/Component/Security/Core/Tests/Role/RoleHierarchyTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Role/RoleHierarchyTest.php";}s:55:"Symfony/Component/Security/Core/Tests/Role/RoleTest.php";a:4:{s:6:"md5sum";s:32:"6faeaa1b59d680fc64f68f187d3b8ad4";s:4:"name";s:55:"Symfony/Component/Security/Core/Tests/Role/RoleTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Role/RoleTest.php";}s:65:"Symfony/Component/Security/Core/Tests/Role/SwitchUserRoleTest.php";a:4:{s:6:"md5sum";s:32:"63e6fa508f87e6843cdc7d4dbb310ed4";s:4:"name";s:65:"Symfony/Component/Security/Core/Tests/Role/SwitchUserRoleTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Role/SwitchUserRoleTest.php";}s:61:"Symfony/Component/Security/Core/Tests/SecurityContextTest.php";a:4:{s:6:"md5sum";s:32:"c6a315c41a473173516a7b97d7bd135f";s:4:"name";s:61:"Symfony/Component/Security/Core/Tests/SecurityContextTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/SecurityContextTest.php";}s:68:"Symfony/Component/Security/Core/Tests/User/ChainUserProviderTest.php";a:4:{s:6:"md5sum";s:32:"39059760376a28b3a1289ebeeefbf9ef";s:4:"name";s:68:"Symfony/Component/Security/Core/Tests/User/ChainUserProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/User/ChainUserProviderTest.php";}s:55:"Symfony/Component/Security/Core/Tests/User/UserTest.php";a:4:{s:6:"md5sum";s:32:"92589d6ad763ccd817043e6b5fb5865d";s:4:"name";s:55:"Symfony/Component/Security/Core/Tests/User/UserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/User/UserTest.php";}s:61:"Symfony/Component/Security/Core/Tests/Util/ClassUtilsTest.php";a:4:{s:6:"md5sum";s:32:"51ae9e53749a60e2d99ca0fa4893a68a";s:4:"name";s:61:"Symfony/Component/Security/Core/Tests/Util/ClassUtilsTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Util/ClassUtilsTest.php";}s:63:"Symfony/Component/Security/Core/Tests/Util/SecureRandomTest.php";a:4:{s:6:"md5sum";s:32:"172dc84386daa4193854aad1078407fb";s:4:"name";s:63:"Symfony/Component/Security/Core/Tests/Util/SecureRandomTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Util/SecureRandomTest.php";}s:62:"Symfony/Component/Security/Core/Tests/Util/StringUtilsTest.php";a:4:{s:6:"md5sum";s:32:"a80a7c57b6922fd9a9925a82a7741a01";s:4:"name";s:62:"Symfony/Component/Security/Core/Tests/Util/StringUtilsTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Util/StringUtilsTest.php";}s:89:"Symfony/Component/Security/Core/Tests/Validator/Constraints/UserPasswordValidatorTest.php";a:4:{s:6:"md5sum";s:32:"c2ecdc8fea6ea459acf382fbd0de514c";s:4:"name";s:89:"Symfony/Component/Security/Core/Tests/Validator/Constraints/UserPasswordValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:133:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Validator/Constraints/UserPasswordValidatorTest.php";}s:62:"Symfony/Component/Security/Core/User/AdvancedUserInterface.php";a:4:{s:6:"md5sum";s:32:"dac22529730e8721ae339aacb05b561c";s:4:"name";s:62:"Symfony/Component/Security/Core/User/AdvancedUserInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/User/AdvancedUserInterface.php";}s:58:"Symfony/Component/Security/Core/User/ChainUserProvider.php";a:4:{s:6:"md5sum";s:32:"16ad9f1561e239188cb64ff12a4cd713";s:4:"name";s:58:"Symfony/Component/Security/Core/User/ChainUserProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/User/ChainUserProvider.php";}s:59:"Symfony/Component/Security/Core/User/EquatableInterface.php";a:4:{s:6:"md5sum";s:32:"053bfd3d7feb51135f125c471e0919f2";s:4:"name";s:59:"Symfony/Component/Security/Core/User/EquatableInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/User/EquatableInterface.php";}s:61:"Symfony/Component/Security/Core/User/InMemoryUserProvider.php";a:4:{s:6:"md5sum";s:32:"c62ec26256558502bdff94ccdff8f4c3";s:4:"name";s:61:"Symfony/Component/Security/Core/User/InMemoryUserProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/User/InMemoryUserProvider.php";}s:45:"Symfony/Component/Security/Core/User/User.php";a:4:{s:6:"md5sum";s:32:"a36d5dcfd2e90b7079473de27ece3f0c";s:4:"name";s:45:"Symfony/Component/Security/Core/User/User.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/User/User.php";}s:52:"Symfony/Component/Security/Core/User/UserChecker.php";a:4:{s:6:"md5sum";s:32:"915fa1f4c48a7ce2f501c26b7a784f28";s:4:"name";s:52:"Symfony/Component/Security/Core/User/UserChecker.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/User/UserChecker.php";}s:61:"Symfony/Component/Security/Core/User/UserCheckerInterface.php";a:4:{s:6:"md5sum";s:32:"388e848eda1ffa8b46dd0ae9bf227b90";s:4:"name";s:61:"Symfony/Component/Security/Core/User/UserCheckerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/User/UserCheckerInterface.php";}s:54:"Symfony/Component/Security/Core/User/UserInterface.php";a:4:{s:6:"md5sum";s:32:"47ee6a0d6557868aaf10450f4137462b";s:4:"name";s:54:"Symfony/Component/Security/Core/User/UserInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/User/UserInterface.php";}s:62:"Symfony/Component/Security/Core/User/UserProviderInterface.php";a:4:{s:6:"md5sum";s:32:"482f41d8bda5807c72c319d1d2a11c09";s:4:"name";s:62:"Symfony/Component/Security/Core/User/UserProviderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/User/UserProviderInterface.php";}s:51:"Symfony/Component/Security/Core/Util/ClassUtils.php";a:4:{s:6:"md5sum";s:32:"dd14c33e711d9ac06c1507157e32f166";s:4:"name";s:51:"Symfony/Component/Security/Core/Util/ClassUtils.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Util/ClassUtils.php";}s:53:"Symfony/Component/Security/Core/Util/SecureRandom.php";a:4:{s:6:"md5sum";s:32:"9b650297a6cfe3a6947488561371c574";s:4:"name";s:53:"Symfony/Component/Security/Core/Util/SecureRandom.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Util/SecureRandom.php";}s:62:"Symfony/Component/Security/Core/Util/SecureRandomInterface.php";a:4:{s:6:"md5sum";s:32:"9ac637cacec94e99f0a7af4154ea16ef";s:4:"name";s:62:"Symfony/Component/Security/Core/Util/SecureRandomInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Util/SecureRandomInterface.php";}s:52:"Symfony/Component/Security/Core/Util/StringUtils.php";a:4:{s:6:"md5sum";s:32:"e9ba381671f8b8f44a880028850a3dc6";s:4:"name";s:52:"Symfony/Component/Security/Core/Util/StringUtils.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Util/StringUtils.php";}s:70:"Symfony/Component/Security/Core/Validator/Constraints/UserPassword.php";a:4:{s:6:"md5sum";s:32:"681b19bd49acd0a67bf514c0a420e164";s:4:"name";s:70:"Symfony/Component/Security/Core/Validator/Constraints/UserPassword.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Validator/Constraints/UserPassword.php";}s:79:"Symfony/Component/Security/Core/Validator/Constraints/UserPasswordValidator.php";a:4:{s:6:"md5sum";s:32:"73b05740588c9089f62ddccb23b85de2";s:4:"name";s:79:"Symfony/Component/Security/Core/Validator/Constraints/UserPasswordValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Validator/Constraints/UserPasswordValidator.php";}s:45:"Symfony/Component/Security/Csrf/composer.json";a:4:{s:6:"md5sum";s:32:"8bf68c5cb8ecade41dedb7a808186bfc";s:4:"name";s:45:"Symfony/Component/Security/Csrf/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Csrf/composer.json";}s:45:"Symfony/Component/Security/Csrf/CsrfToken.php";a:4:{s:6:"md5sum";s:32:"8dd9faf3aa313127ffcf0106abafdb34";s:4:"name";s:45:"Symfony/Component/Security/Csrf/CsrfToken.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/CsrfToken.php";}s:52:"Symfony/Component/Security/Csrf/CsrfTokenManager.php";a:4:{s:6:"md5sum";s:32:"4584d3d466fbd310bd1c3730a53aba62";s:4:"name";s:52:"Symfony/Component/Security/Csrf/CsrfTokenManager.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/CsrfTokenManager.php";}s:61:"Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.php";a:4:{s:6:"md5sum";s:32:"4f9257a2c8b6285605af062e31e92c51";s:4:"name";s:61:"Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.php";}s:68:"Symfony/Component/Security/Csrf/Exception/TokenNotFoundException.php";a:4:{s:6:"md5sum";s:32:"283b3574fff8ff0c093c8c2c74024fb0";s:4:"name";s:68:"Symfony/Component/Security/Csrf/Exception/TokenNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/Exception/TokenNotFoundException.php";}s:39:"Symfony/Component/Security/Csrf/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:39:"Symfony/Component/Security/Csrf/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Csrf/LICENSE";}s:48:"Symfony/Component/Security/Csrf/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"4a5e98782fbba28092cafe77c3168c51";s:4:"name";s:48:"Symfony/Component/Security/Csrf/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Csrf/phpunit.xml.dist";}s:41:"Symfony/Component/Security/Csrf/README.md";a:4:{s:6:"md5sum";s:32:"f7759c45cd4a446a228ed648286acf8f";s:4:"name";s:41:"Symfony/Component/Security/Csrf/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Csrf/README.md";}s:62:"Symfony/Component/Security/Csrf/Tests/CsrfTokenManagerTest.php";a:4:{s:6:"md5sum";s:32:"3de809f4f691151c195fba128ff1e32d";s:4:"name";s:62:"Symfony/Component/Security/Csrf/Tests/CsrfTokenManagerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Csrf/Tests/CsrfTokenManagerTest.php";}s:82:"Symfony/Component/Security/Csrf/Tests/TokenGenerator/UriSafeTokenGeneratorTest.php";a:4:{s:6:"md5sum";s:32:"bc23118b2998753a1a5d8d744edb93e9";s:4:"name";s:82:"Symfony/Component/Security/Csrf/Tests/TokenGenerator/UriSafeTokenGeneratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Csrf/Tests/TokenGenerator/UriSafeTokenGeneratorTest.php";}s:84:"Symfony/Component/Security/Csrf/Tests/TokenStorage/NativeSessionTokenStorageTest.php";a:4:{s:6:"md5sum";s:32:"362691003c5cc955877ecd235ef329d5";s:4:"name";s:84:"Symfony/Component/Security/Csrf/Tests/TokenStorage/NativeSessionTokenStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Csrf/Tests/TokenStorage/NativeSessionTokenStorageTest.php";}s:78:"Symfony/Component/Security/Csrf/Tests/TokenStorage/SessionTokenStorageTest.php";a:4:{s:6:"md5sum";s:32:"6a12af8493e94dd61cffa21f05b8dac8";s:4:"name";s:78:"Symfony/Component/Security/Csrf/Tests/TokenStorage/SessionTokenStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Csrf/Tests/TokenStorage/SessionTokenStorageTest.php";}s:74:"Symfony/Component/Security/Csrf/TokenGenerator/TokenGeneratorInterface.php";a:4:{s:6:"md5sum";s:32:"dab50ef252b23f81bc0a28dd6ed3c2f0";s:4:"name";s:74:"Symfony/Component/Security/Csrf/TokenGenerator/TokenGeneratorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/TokenGenerator/TokenGeneratorInterface.php";}s:72:"Symfony/Component/Security/Csrf/TokenGenerator/UriSafeTokenGenerator.php";a:4:{s:6:"md5sum";s:32:"2cac1d204af23007d684c61435e0275a";s:4:"name";s:72:"Symfony/Component/Security/Csrf/TokenGenerator/UriSafeTokenGenerator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/TokenGenerator/UriSafeTokenGenerator.php";}s:74:"Symfony/Component/Security/Csrf/TokenStorage/NativeSessionTokenStorage.php";a:4:{s:6:"md5sum";s:32:"c6aa4826742510546c711553b19d87a4";s:4:"name";s:74:"Symfony/Component/Security/Csrf/TokenStorage/NativeSessionTokenStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/TokenStorage/NativeSessionTokenStorage.php";}s:68:"Symfony/Component/Security/Csrf/TokenStorage/SessionTokenStorage.php";a:4:{s:6:"md5sum";s:32:"3525f5f7040f8b2e3fb7f2df67c3e52b";s:4:"name";s:68:"Symfony/Component/Security/Csrf/TokenStorage/SessionTokenStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/TokenStorage/SessionTokenStorage.php";}s:70:"Symfony/Component/Security/Csrf/TokenStorage/TokenStorageInterface.php";a:4:{s:6:"md5sum";s:32:"602d9216e9b1d1f0d22b31c902e5b4bb";s:4:"name";s:70:"Symfony/Component/Security/Csrf/TokenStorage/TokenStorageInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/TokenStorage/TokenStorageInterface.php";}s:45:"Symfony/Component/Security/Http/AccessMap.php";a:4:{s:6:"md5sum";s:32:"9df423675054d980e7bae7cc92020c03";s:4:"name";s:45:"Symfony/Component/Security/Http/AccessMap.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/AccessMap.php";}s:54:"Symfony/Component/Security/Http/AccessMapInterface.php";a:4:{s:6:"md5sum";s:32:"43086a06e68384eaccab38dfb698786d";s:4:"name";s:54:"Symfony/Component/Security/Http/AccessMapInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/AccessMapInterface.php";}s:88:"Symfony/Component/Security/Http/Authentication/AuthenticationFailureHandlerInterface.php";a:4:{s:6:"md5sum";s:32:"1a26ecccd324ea272277edffc5c84886";s:4:"name";s:88:"Symfony/Component/Security/Http/Authentication/AuthenticationFailureHandlerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Authentication/AuthenticationFailureHandlerInterface.php";}s:88:"Symfony/Component/Security/Http/Authentication/AuthenticationSuccessHandlerInterface.php";a:4:{s:6:"md5sum";s:32:"1249ffb01efe413cfd97a5337cb00137";s:4:"name";s:88:"Symfony/Component/Security/Http/Authentication/AuthenticationSuccessHandlerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Authentication/AuthenticationSuccessHandlerInterface.php";}s:86:"Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php";a:4:{s:6:"md5sum";s:32:"4b78405b37b8d39c63538f637fd497dc";s:4:"name";s:86:"Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php";}s:86:"Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php";a:4:{s:6:"md5sum";s:32:"d1a101bba266130a6fdbfc92126cef07";s:4:"name";s:86:"Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php";}s:78:"Symfony/Component/Security/Http/Authentication/SimpleAuthenticationHandler.php";a:4:{s:6:"md5sum";s:32:"ed65679f667d9ef57a6791a64a8bd6c2";s:4:"name";s:78:"Symfony/Component/Security/Http/Authentication/SimpleAuthenticationHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Authentication/SimpleAuthenticationHandler.php";}s:78:"Symfony/Component/Security/Http/Authorization/AccessDeniedHandlerInterface.php";a:4:{s:6:"md5sum";s:32:"afbc8d72124b7a6aee7879fa64325a9f";s:4:"name";s:78:"Symfony/Component/Security/Http/Authorization/AccessDeniedHandlerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Authorization/AccessDeniedHandlerInterface.php";}s:45:"Symfony/Component/Security/Http/composer.json";a:4:{s:6:"md5sum";s:32:"5b7cd3c1e3d2a0a5cacc080b87c9e590";s:4:"name";s:45:"Symfony/Component/Security/Http/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Http/composer.json";}s:80:"Symfony/Component/Security/Http/EntryPoint/AuthenticationEntryPointInterface.php";a:4:{s:6:"md5sum";s:32:"6d3ec77aadf630304cff4ed3c026b086";s:4:"name";s:80:"Symfony/Component/Security/Http/EntryPoint/AuthenticationEntryPointInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/EntryPoint/AuthenticationEntryPointInterface.php";}s:76:"Symfony/Component/Security/Http/EntryPoint/BasicAuthenticationEntryPoint.php";a:4:{s:6:"md5sum";s:32:"0cacf36e7c79e4ca8e7fad2ad771335d";s:4:"name";s:76:"Symfony/Component/Security/Http/EntryPoint/BasicAuthenticationEntryPoint.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/EntryPoint/BasicAuthenticationEntryPoint.php";}s:77:"Symfony/Component/Security/Http/EntryPoint/DigestAuthenticationEntryPoint.php";a:4:{s:6:"md5sum";s:32:"0916b4aabd44274d2a1d24d7eccd3370";s:4:"name";s:77:"Symfony/Component/Security/Http/EntryPoint/DigestAuthenticationEntryPoint.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/EntryPoint/DigestAuthenticationEntryPoint.php";}s:75:"Symfony/Component/Security/Http/EntryPoint/FormAuthenticationEntryPoint.php";a:4:{s:6:"md5sum";s:32:"957245bb0cc25e4ddfa36ff11b60cf31";s:4:"name";s:75:"Symfony/Component/Security/Http/EntryPoint/FormAuthenticationEntryPoint.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/EntryPoint/FormAuthenticationEntryPoint.php";}s:76:"Symfony/Component/Security/Http/EntryPoint/RetryAuthenticationEntryPoint.php";a:4:{s:6:"md5sum";s:32:"e3cec247e8df4a6e97c579e4ea923bc4";s:4:"name";s:76:"Symfony/Component/Security/Http/EntryPoint/RetryAuthenticationEntryPoint.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/EntryPoint/RetryAuthenticationEntryPoint.php";}s:63:"Symfony/Component/Security/Http/Event/InteractiveLoginEvent.php";a:4:{s:6:"md5sum";s:32:"99b4defc6b93df2b7f1c0b4dedef3ff9";s:4:"name";s:63:"Symfony/Component/Security/Http/Event/InteractiveLoginEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Event/InteractiveLoginEvent.php";}s:57:"Symfony/Component/Security/Http/Event/SwitchUserEvent.php";a:4:{s:6:"md5sum";s:32:"7ce04d8a18a0487f987e31fc88bd68c5";s:4:"name";s:57:"Symfony/Component/Security/Http/Event/SwitchUserEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Event/SwitchUserEvent.php";}s:75:"Symfony/Component/Security/Http/Firewall/AbstractAuthenticationListener.php";a:4:{s:6:"md5sum";s:32:"c38b7e9b63bb0cc12e471d58062964b7";s:4:"name";s:75:"Symfony/Component/Security/Http/Firewall/AbstractAuthenticationListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/AbstractAuthenticationListener.php";}s:77:"Symfony/Component/Security/Http/Firewall/AbstractPreAuthenticatedListener.php";a:4:{s:6:"md5sum";s:32:"0a1aebef9c2f8f6a328e6227052df7ab";s:4:"name";s:77:"Symfony/Component/Security/Http/Firewall/AbstractPreAuthenticatedListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/AbstractPreAuthenticatedListener.php";}s:59:"Symfony/Component/Security/Http/Firewall/AccessListener.php";a:4:{s:6:"md5sum";s:32:"5aa38481213505e4d4b3308202f16ae2";s:4:"name";s:59:"Symfony/Component/Security/Http/Firewall/AccessListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/AccessListener.php";}s:76:"Symfony/Component/Security/Http/Firewall/AnonymousAuthenticationListener.php";a:4:{s:6:"md5sum";s:32:"fffa376fb78716df7994bd30c2c3d8e2";s:4:"name";s:76:"Symfony/Component/Security/Http/Firewall/AnonymousAuthenticationListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/AnonymousAuthenticationListener.php";}s:72:"Symfony/Component/Security/Http/Firewall/BasicAuthenticationListener.php";a:4:{s:6:"md5sum";s:32:"b35cfc2ded8a8aa315ba7ee88ae788b5";s:4:"name";s:72:"Symfony/Component/Security/Http/Firewall/BasicAuthenticationListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/BasicAuthenticationListener.php";}s:60:"Symfony/Component/Security/Http/Firewall/ChannelListener.php";a:4:{s:6:"md5sum";s:32:"850ac32b9360422daedb18164af00887";s:4:"name";s:60:"Symfony/Component/Security/Http/Firewall/ChannelListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/ChannelListener.php";}s:60:"Symfony/Component/Security/Http/Firewall/ContextListener.php";a:4:{s:6:"md5sum";s:32:"096bd4d9e3b975fcac84503f61384b7e";s:4:"name";s:60:"Symfony/Component/Security/Http/Firewall/ContextListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/ContextListener.php";}s:73:"Symfony/Component/Security/Http/Firewall/DigestAuthenticationListener.php";a:4:{s:6:"md5sum";s:32:"c9c8fa0fd59936274a596a360568a575";s:4:"name";s:73:"Symfony/Component/Security/Http/Firewall/DigestAuthenticationListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/DigestAuthenticationListener.php";}s:62:"Symfony/Component/Security/Http/Firewall/ExceptionListener.php";a:4:{s:6:"md5sum";s:32:"0b7d00f42228ca3d4827012968c69a8c";s:4:"name";s:62:"Symfony/Component/Security/Http/Firewall/ExceptionListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/ExceptionListener.php";}s:62:"Symfony/Component/Security/Http/Firewall/ListenerInterface.php";a:4:{s:6:"md5sum";s:32:"6f43f337a4368b4d7b1cce0e76b51b10";s:4:"name";s:62:"Symfony/Component/Security/Http/Firewall/ListenerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/ListenerInterface.php";}s:59:"Symfony/Component/Security/Http/Firewall/LogoutListener.php";a:4:{s:6:"md5sum";s:32:"42ad987ff1e6284b2fd2f11d5cf09725";s:4:"name";s:59:"Symfony/Component/Security/Http/Firewall/LogoutListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/LogoutListener.php";}s:63:"Symfony/Component/Security/Http/Firewall/RememberMeListener.php";a:4:{s:6:"md5sum";s:32:"becb8470e4e05de6ad82ff6bf7e646fc";s:4:"name";s:63:"Symfony/Component/Security/Http/Firewall/RememberMeListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/RememberMeListener.php";}s:77:"Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.php";a:4:{s:6:"md5sum";s:32:"3c80c1a805d89cfd4f475aa5d8517267";s:4:"name";s:77:"Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.php";}s:76:"Symfony/Component/Security/Http/Firewall/SimplePreAuthenticationListener.php";a:4:{s:6:"md5sum";s:32:"e06e2b324e79ee890f1feebba9bc8ac3";s:4:"name";s:76:"Symfony/Component/Security/Http/Firewall/SimplePreAuthenticationListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/SimplePreAuthenticationListener.php";}s:63:"Symfony/Component/Security/Http/Firewall/SwitchUserListener.php";a:4:{s:6:"md5sum";s:32:"62963e5323a197109f7f7f3e860154ca";s:4:"name";s:63:"Symfony/Component/Security/Http/Firewall/SwitchUserListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/SwitchUserListener.php";}s:87:"Symfony/Component/Security/Http/Firewall/UsernamePasswordFormAuthenticationListener.php";a:4:{s:6:"md5sum";s:32:"4f883d92d37fd6eb289b50abd37ae680";s:4:"name";s:87:"Symfony/Component/Security/Http/Firewall/UsernamePasswordFormAuthenticationListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/UsernamePasswordFormAuthenticationListener.php";}s:71:"Symfony/Component/Security/Http/Firewall/X509AuthenticationListener.php";a:4:{s:6:"md5sum";s:32:"08351ed63f27f17c1b35b08600cc8864";s:4:"name";s:71:"Symfony/Component/Security/Http/Firewall/X509AuthenticationListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall/X509AuthenticationListener.php";}s:44:"Symfony/Component/Security/Http/Firewall.php";a:4:{s:6:"md5sum";s:32:"ee01a78804fc30696b6ec0eeef5c59a6";s:4:"name";s:44:"Symfony/Component/Security/Http/Firewall.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall.php";}s:47:"Symfony/Component/Security/Http/FirewallMap.php";a:4:{s:6:"md5sum";s:32:"2a749495dc3be6af3a2fd28e729c80a6";s:4:"name";s:47:"Symfony/Component/Security/Http/FirewallMap.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/FirewallMap.php";}s:56:"Symfony/Component/Security/Http/FirewallMapInterface.php";a:4:{s:6:"md5sum";s:32:"87ce09ab99f6ec6b472a725abff910c5";s:4:"name";s:56:"Symfony/Component/Security/Http/FirewallMapInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/FirewallMapInterface.php";}s:45:"Symfony/Component/Security/Http/HttpUtils.php";a:4:{s:6:"md5sum";s:32:"a2bb9c5c5076b9a7978f301b64c00b9e";s:4:"name";s:45:"Symfony/Component/Security/Http/HttpUtils.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/HttpUtils.php";}s:39:"Symfony/Component/Security/Http/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:39:"Symfony/Component/Security/Http/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Http/LICENSE";}s:70:"Symfony/Component/Security/Http/Logout/CookieClearingLogoutHandler.php";a:4:{s:6:"md5sum";s:32:"e5ddc1de0d071bdeacbcd2325ed2d4ae";s:4:"name";s:70:"Symfony/Component/Security/Http/Logout/CookieClearingLogoutHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Logout/CookieClearingLogoutHandler.php";}s:70:"Symfony/Component/Security/Http/Logout/DefaultLogoutSuccessHandler.php";a:4:{s:6:"md5sum";s:32:"45d84fb75d34ea9135c5b72108e1dbf7";s:4:"name";s:70:"Symfony/Component/Security/Http/Logout/DefaultLogoutSuccessHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Logout/DefaultLogoutSuccessHandler.php";}s:65:"Symfony/Component/Security/Http/Logout/LogoutHandlerInterface.php";a:4:{s:6:"md5sum";s:32:"eefeebbc791fa1bccf5a3952be87ba78";s:4:"name";s:65:"Symfony/Component/Security/Http/Logout/LogoutHandlerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Logout/LogoutHandlerInterface.php";}s:72:"Symfony/Component/Security/Http/Logout/LogoutSuccessHandlerInterface.php";a:4:{s:6:"md5sum";s:32:"cc172ba7205b41a32dd97a56eadf4cc8";s:4:"name";s:72:"Symfony/Component/Security/Http/Logout/LogoutSuccessHandlerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Logout/LogoutSuccessHandlerInterface.php";}s:63:"Symfony/Component/Security/Http/Logout/SessionLogoutHandler.php";a:4:{s:6:"md5sum";s:32:"aecd2ef66d8aade29cc47157048e4a21";s:4:"name";s:63:"Symfony/Component/Security/Http/Logout/SessionLogoutHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Logout/SessionLogoutHandler.php";}s:48:"Symfony/Component/Security/Http/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"2f041adb26153b8fb15facf2c6af231d";s:4:"name";s:48:"Symfony/Component/Security/Http/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/phpunit.xml.dist";}s:41:"Symfony/Component/Security/Http/README.md";a:4:{s:6:"md5sum";s:32:"a345783d58ade730c9a01639748b41c6";s:4:"name";s:41:"Symfony/Component/Security/Http/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Http/README.md";}s:73:"Symfony/Component/Security/Http/RememberMe/AbstractRememberMeServices.php";a:4:{s:6:"md5sum";s:32:"b72e5cba34abbeea45218aced16a6359";s:4:"name";s:73:"Symfony/Component/Security/Http/RememberMe/AbstractRememberMeServices.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/RememberMe/AbstractRememberMeServices.php";}s:85:"Symfony/Component/Security/Http/RememberMe/PersistentTokenBasedRememberMeServices.php";a:4:{s:6:"md5sum";s:32:"435ea3e4c99dd22c771c99f16392c656";s:4:"name";s:85:"Symfony/Component/Security/Http/RememberMe/PersistentTokenBasedRememberMeServices.php";s:4:"role";s:3:"php";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/RememberMe/PersistentTokenBasedRememberMeServices.php";}s:74:"Symfony/Component/Security/Http/RememberMe/RememberMeServicesInterface.php";a:4:{s:6:"md5sum";s:32:"d0150afc723a4bb2f322842c1e0a8ce6";s:4:"name";s:74:"Symfony/Component/Security/Http/RememberMe/RememberMeServicesInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/RememberMe/RememberMeServicesInterface.php";}s:63:"Symfony/Component/Security/Http/RememberMe/ResponseListener.php";a:4:{s:6:"md5sum";s:32:"1d39556b7575907aa6f092bb4c07f387";s:4:"name";s:63:"Symfony/Component/Security/Http/RememberMe/ResponseListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/RememberMe/ResponseListener.php";}s:75:"Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php";a:4:{s:6:"md5sum";s:32:"2e0288eec870215f3f4b8e360afbcf21";s:4:"name";s:75:"Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php";}s:50:"Symfony/Component/Security/Http/SecurityEvents.php";a:4:{s:6:"md5sum";s:32:"80cf473a2f0baee880e458d5946fde6b";s:4:"name";s:50:"Symfony/Component/Security/Http/SecurityEvents.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/SecurityEvents.php";}s:73:"Symfony/Component/Security/Http/Session/SessionAuthenticationStrategy.php";a:4:{s:6:"md5sum";s:32:"f4eee94c1c2e104f0ce7b8d5bd349fa0";s:4:"name";s:73:"Symfony/Component/Security/Http/Session/SessionAuthenticationStrategy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Session/SessionAuthenticationStrategy.php";}s:82:"Symfony/Component/Security/Http/Session/SessionAuthenticationStrategyInterface.php";a:4:{s:6:"md5sum";s:32:"a8df527492a3c775c0c2d3affaec1268";s:4:"name";s:82:"Symfony/Component/Security/Http/Session/SessionAuthenticationStrategyInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Session/SessionAuthenticationStrategyInterface.php";}s:55:"Symfony/Component/Security/Http/Tests/AccessMapTest.php";a:4:{s:6:"md5sum";s:32:"1e501db8e61f7fbbe1ce2046846d0d16";s:4:"name";s:55:"Symfony/Component/Security/Http/Tests/AccessMapTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/AccessMapTest.php";}s:96:"Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.php";a:4:{s:6:"md5sum";s:32:"d3e7326491ec2358ba350f4a937d9778";s:4:"name";s:96:"Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:140:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.php";}s:96:"Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.php";a:4:{s:6:"md5sum";s:32:"f238eea0886f4d046befadaa74b02fbe";s:4:"name";s:96:"Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:140:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.php";}s:88:"Symfony/Component/Security/Http/Tests/Authentication/SimpleAuthenticationHandlerTest.php";a:4:{s:6:"md5sum";s:32:"d5cef550f4e58533d96feab10cdf02d7";s:4:"name";s:88:"Symfony/Component/Security/Http/Tests/Authentication/SimpleAuthenticationHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:132:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Authentication/SimpleAuthenticationHandlerTest.php";}s:86:"Symfony/Component/Security/Http/Tests/EntryPoint/BasicAuthenticationEntryPointTest.php";a:4:{s:6:"md5sum";s:32:"44e155837ffd4ba5e88a3fe86fa0371a";s:4:"name";s:86:"Symfony/Component/Security/Http/Tests/EntryPoint/BasicAuthenticationEntryPointTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/EntryPoint/BasicAuthenticationEntryPointTest.php";}s:87:"Symfony/Component/Security/Http/Tests/EntryPoint/DigestAuthenticationEntryPointTest.php";a:4:{s:6:"md5sum";s:32:"cf8ce9dfa9ef2b8cf64c2bca4eeaa2ee";s:4:"name";s:87:"Symfony/Component/Security/Http/Tests/EntryPoint/DigestAuthenticationEntryPointTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:131:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/EntryPoint/DigestAuthenticationEntryPointTest.php";}s:85:"Symfony/Component/Security/Http/Tests/EntryPoint/FormAuthenticationEntryPointTest.php";a:4:{s:6:"md5sum";s:32:"6f33e2bc5d33de50781109deaa92375b";s:4:"name";s:85:"Symfony/Component/Security/Http/Tests/EntryPoint/FormAuthenticationEntryPointTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:129:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/EntryPoint/FormAuthenticationEntryPointTest.php";}s:86:"Symfony/Component/Security/Http/Tests/EntryPoint/RetryAuthenticationEntryPointTest.php";a:4:{s:6:"md5sum";s:32:"9e4221ac3557ad490f50b572a1cb6da0";s:4:"name";s:86:"Symfony/Component/Security/Http/Tests/EntryPoint/RetryAuthenticationEntryPointTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/EntryPoint/RetryAuthenticationEntryPointTest.php";}s:87:"Symfony/Component/Security/Http/Tests/Firewall/AbstractPreAuthenticatedListenerTest.php";a:4:{s:6:"md5sum";s:32:"7616457ff22f218eb84d0582b3a32d99";s:4:"name";s:87:"Symfony/Component/Security/Http/Tests/Firewall/AbstractPreAuthenticatedListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:131:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/AbstractPreAuthenticatedListenerTest.php";}s:69:"Symfony/Component/Security/Http/Tests/Firewall/AccessListenerTest.php";a:4:{s:6:"md5sum";s:32:"50390ecbf94ded92656d9de6570d63c1";s:4:"name";s:69:"Symfony/Component/Security/Http/Tests/Firewall/AccessListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/AccessListenerTest.php";}s:86:"Symfony/Component/Security/Http/Tests/Firewall/AnonymousAuthenticationListenerTest.php";a:4:{s:6:"md5sum";s:32:"d3745efe02656a6a40d2421791a65ab2";s:4:"name";s:86:"Symfony/Component/Security/Http/Tests/Firewall/AnonymousAuthenticationListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/AnonymousAuthenticationListenerTest.php";}s:82:"Symfony/Component/Security/Http/Tests/Firewall/BasicAuthenticationListenerTest.php";a:4:{s:6:"md5sum";s:32:"f9b4fe52898a270086a0323bc9e744d2";s:4:"name";s:82:"Symfony/Component/Security/Http/Tests/Firewall/BasicAuthenticationListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/BasicAuthenticationListenerTest.php";}s:70:"Symfony/Component/Security/Http/Tests/Firewall/ChannelListenerTest.php";a:4:{s:6:"md5sum";s:32:"39f3a9fbfd8fb369e3518c1f737c69d1";s:4:"name";s:70:"Symfony/Component/Security/Http/Tests/Firewall/ChannelListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/ChannelListenerTest.php";}s:70:"Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php";a:4:{s:6:"md5sum";s:32:"fefeae0b89d7bce7c98fd5f79e64fb80";s:4:"name";s:70:"Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php";}s:65:"Symfony/Component/Security/Http/Tests/Firewall/DigestDataTest.php";a:4:{s:6:"md5sum";s:32:"0cd7a88d1e73a7c2397a05ee835b416e";s:4:"name";s:65:"Symfony/Component/Security/Http/Tests/Firewall/DigestDataTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/DigestDataTest.php";}s:69:"Symfony/Component/Security/Http/Tests/Firewall/LogoutListenerTest.php";a:4:{s:6:"md5sum";s:32:"bdc936486eb622f5ebc89def545d34cc";s:4:"name";s:69:"Symfony/Component/Security/Http/Tests/Firewall/LogoutListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/LogoutListenerTest.php";}s:73:"Symfony/Component/Security/Http/Tests/Firewall/RememberMeListenerTest.php";a:4:{s:6:"md5sum";s:32:"5aa221a87c438540d59e8d06cbc51e43";s:4:"name";s:73:"Symfony/Component/Security/Http/Tests/Firewall/RememberMeListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/RememberMeListenerTest.php";}s:73:"Symfony/Component/Security/Http/Tests/Firewall/SwitchUserListenerTest.php";a:4:{s:6:"md5sum";s:32:"4e401aaf8580c5f225065eb296d09ffd";s:4:"name";s:73:"Symfony/Component/Security/Http/Tests/Firewall/SwitchUserListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/SwitchUserListenerTest.php";}s:81:"Symfony/Component/Security/Http/Tests/Firewall/X509AuthenticationListenerTest.php";a:4:{s:6:"md5sum";s:32:"62ada44f4eeb63bc411ebff114f5f340";s:4:"name";s:81:"Symfony/Component/Security/Http/Tests/Firewall/X509AuthenticationListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/X509AuthenticationListenerTest.php";}s:57:"Symfony/Component/Security/Http/Tests/FirewallMapTest.php";a:4:{s:6:"md5sum";s:32:"90e0766898394d8523cb8d3093b8ad0f";s:4:"name";s:57:"Symfony/Component/Security/Http/Tests/FirewallMapTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/FirewallMapTest.php";}s:54:"Symfony/Component/Security/Http/Tests/FirewallTest.php";a:4:{s:6:"md5sum";s:32:"58a4fef6ae246369bdff44ea9566e2e7";s:4:"name";s:54:"Symfony/Component/Security/Http/Tests/FirewallTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/FirewallTest.php";}s:55:"Symfony/Component/Security/Http/Tests/HttpUtilsTest.php";a:4:{s:6:"md5sum";s:32:"a65c06a07157d8b2f79f1718fe9acc3a";s:4:"name";s:55:"Symfony/Component/Security/Http/Tests/HttpUtilsTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/HttpUtilsTest.php";}s:80:"Symfony/Component/Security/Http/Tests/Logout/CookieClearingLogoutHandlerTest.php";a:4:{s:6:"md5sum";s:32:"d82d3ab3c92583cd9aa15b9ed8ae9db2";s:4:"name";s:80:"Symfony/Component/Security/Http/Tests/Logout/CookieClearingLogoutHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Logout/CookieClearingLogoutHandlerTest.php";}s:80:"Symfony/Component/Security/Http/Tests/Logout/DefaultLogoutSuccessHandlerTest.php";a:4:{s:6:"md5sum";s:32:"b35e129cc7f5bc083d3b855f286a2228";s:4:"name";s:80:"Symfony/Component/Security/Http/Tests/Logout/DefaultLogoutSuccessHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Logout/DefaultLogoutSuccessHandlerTest.php";}s:73:"Symfony/Component/Security/Http/Tests/Logout/SessionLogoutHandlerTest.php";a:4:{s:6:"md5sum";s:32:"31043c56e00a9f85591f7aeb1a0d7abe";s:4:"name";s:73:"Symfony/Component/Security/Http/Tests/Logout/SessionLogoutHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Logout/SessionLogoutHandlerTest.php";}s:83:"Symfony/Component/Security/Http/Tests/RememberMe/AbstractRememberMeServicesTest.php";a:4:{s:6:"md5sum";s:32:"a4f462fe63db2978e9eb7b9088a332a1";s:4:"name";s:83:"Symfony/Component/Security/Http/Tests/RememberMe/AbstractRememberMeServicesTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/RememberMe/AbstractRememberMeServicesTest.php";}s:95:"Symfony/Component/Security/Http/Tests/RememberMe/PersistentTokenBasedRememberMeServicesTest.php";a:4:{s:6:"md5sum";s:32:"1dcfd5f481984cbcbe252c35abb90560";s:4:"name";s:95:"Symfony/Component/Security/Http/Tests/RememberMe/PersistentTokenBasedRememberMeServicesTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:139:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/RememberMe/PersistentTokenBasedRememberMeServicesTest.php";}s:73:"Symfony/Component/Security/Http/Tests/RememberMe/ResponseListenerTest.php";a:4:{s:6:"md5sum";s:32:"d8f1bc020d5b21d2de0433c2839b08f9";s:4:"name";s:73:"Symfony/Component/Security/Http/Tests/RememberMe/ResponseListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/RememberMe/ResponseListenerTest.php";}s:85:"Symfony/Component/Security/Http/Tests/RememberMe/TokenBasedRememberMeServicesTest.php";a:4:{s:6:"md5sum";s:32:"e4109def8460d75d5f052f67ec6ba970";s:4:"name";s:85:"Symfony/Component/Security/Http/Tests/RememberMe/TokenBasedRememberMeServicesTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:129:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/RememberMe/TokenBasedRememberMeServicesTest.php";}s:83:"Symfony/Component/Security/Http/Tests/Session/SessionAuthenticationStrategyTest.php";a:4:{s:6:"md5sum";s:32:"7787c557da28fb7dd4cc86318f909bb3";s:4:"name";s:83:"Symfony/Component/Security/Http/Tests/Session/SessionAuthenticationStrategyTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Session/SessionAuthenticationStrategyTest.php";}s:34:"Symfony/Component/Security/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:34:"Symfony/Component/Security/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/LICENSE";}s:43:"Symfony/Component/Security/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"b48391335127152904b86aef4327b6ba";s:4:"name";s:43:"Symfony/Component/Security/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/phpunit.xml.dist";}s:36:"Symfony/Component/Security/README.md";a:4:{s:6:"md5sum";s:32:"4dec033fca5592436030a98806bbf6d7";s:4:"name";s:36:"Symfony/Component/Security/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/README.md";}s:65:"Symfony/Component/Security/Resources/translations/security.ar.xlf";a:4:{s:6:"md5sum";s:32:"1e750b4762305800f3dd181eab53e2ba";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ar.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.ar.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.bg.xlf";a:4:{s:6:"md5sum";s:32:"60f216b50da4b49da27b177ba8ca3b46";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.bg.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.bg.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.ca.xlf";a:4:{s:6:"md5sum";s:32:"31cbf1bd957d4f4c3401c20d9a1b10bc";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ca.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.ca.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.cs.xlf";a:4:{s:6:"md5sum";s:32:"0cf2e748f73950fb74f6a5978ab773f4";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.cs.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.cs.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.da.xlf";a:4:{s:6:"md5sum";s:32:"6d1c01434b6521da496cf9c91c144ea1";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.da.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.da.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.de.xlf";a:4:{s:6:"md5sum";s:32:"a01afc0ce8bdc7598652c6560fae8512";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.de.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.de.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.el.xlf";a:4:{s:6:"md5sum";s:32:"c2883d0b5e1e7eeed7ec66ea9853f5cc";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.el.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.el.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.en.xlf";a:4:{s:6:"md5sum";s:32:"0c6a0114323a39fad8cb33246be7b7d9";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.en.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.en.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.es.xlf";a:4:{s:6:"md5sum";s:32:"7ae3e719888ac0c94aeda98734b5e9f5";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.es.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.es.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.fa.xlf";a:4:{s:6:"md5sum";s:32:"eef6f0230157636659e13c466e498cd9";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.fa.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.fa.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.fr.xlf";a:4:{s:6:"md5sum";s:32:"8d726781df922dfb126eb85c6c1cf7f5";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.fr.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.fr.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.gl.xlf";a:4:{s:6:"md5sum";s:32:"d24525aa71ea6294f1b0dad40d7a5b70";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.gl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.gl.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.hr.xlf";a:4:{s:6:"md5sum";s:32:"7b03fcbcf3c6586ee539377f3f5a3bdc";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.hr.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.hr.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.hu.xlf";a:4:{s:6:"md5sum";s:32:"b8704be78d7be163b715e166f07257e3";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.hu.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.hu.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.id.xlf";a:4:{s:6:"md5sum";s:32:"40ec159baa27f18ea7ab7924e652ec97";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.id.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.id.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.it.xlf";a:4:{s:6:"md5sum";s:32:"47a2f3df6c37532fe6a486073aebd0a1";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.it.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.it.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.ja.xlf";a:4:{s:6:"md5sum";s:32:"acf99e98e5ffff85489c97c78a83b317";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ja.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.ja.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.lb.xlf";a:4:{s:6:"md5sum";s:32:"defce0bf7d3e026fbdaebb0cfe7abbd6";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.lb.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.lb.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.nl.xlf";a:4:{s:6:"md5sum";s:32:"79d67b79332d77ce5d39a8531f219538";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.nl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.nl.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.no.xlf";a:4:{s:6:"md5sum";s:32:"03051a200f3f0f13a30ed957026a1784";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.no.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.no.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.pl.xlf";a:4:{s:6:"md5sum";s:32:"f6e927ae45bf961507418d03db1c676d";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.pl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.pl.xlf";}s:68:"Symfony/Component/Security/Resources/translations/security.pt_BR.xlf";a:4:{s:6:"md5sum";s:32:"5140f0e3d9b00962b72eb4f3cce9b2a4";s:4:"name";s:68:"Symfony/Component/Security/Resources/translations/security.pt_BR.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.pt_BR.xlf";}s:68:"Symfony/Component/Security/Resources/translations/security.pt_PT.xlf";a:4:{s:6:"md5sum";s:32:"2855177bf25fd860bca194067f350e0a";s:4:"name";s:68:"Symfony/Component/Security/Resources/translations/security.pt_PT.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.pt_PT.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.ro.xlf";a:4:{s:6:"md5sum";s:32:"f07b53a0e13bb3f1267b212e07b49a14";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ro.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.ro.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.ru.xlf";a:4:{s:6:"md5sum";s:32:"f943d4b750be69bd91e03eca27df52f5";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ru.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.ru.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.sk.xlf";a:4:{s:6:"md5sum";s:32:"a570f49a5deb0bba84a8f5ce71018b32";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.sk.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.sk.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.sl.xlf";a:4:{s:6:"md5sum";s:32:"0a5e641bcbd17d9502a2f2f3e1d51999";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.sl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.sl.xlf";}s:70:"Symfony/Component/Security/Resources/translations/security.sr_Cyrl.xlf";a:4:{s:6:"md5sum";s:32:"823f2ed1191ec9723d46f2516d700973";s:4:"name";s:70:"Symfony/Component/Security/Resources/translations/security.sr_Cyrl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.sr_Cyrl.xlf";}s:70:"Symfony/Component/Security/Resources/translations/security.sr_Latn.xlf";a:4:{s:6:"md5sum";s:32:"a95969c966594fa2afcf4c0f58dcf034";s:4:"name";s:70:"Symfony/Component/Security/Resources/translations/security.sr_Latn.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.sr_Latn.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.sv.xlf";a:4:{s:6:"md5sum";s:32:"ef66c814ecc8a2fc5fbbe30dd23f3a82";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.sv.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.sv.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.tr.xlf";a:4:{s:6:"md5sum";s:32:"0d789d9cb295319cb483f864ca99b2bf";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.tr.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.tr.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.ua.xlf";a:4:{s:6:"md5sum";s:32:"c7e13f578ddab881e5bb035d0e905048";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.ua.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.ua.xlf";}s:65:"Symfony/Component/Security/Resources/translations/security.vi.xlf";a:4:{s:6:"md5sum";s:32:"b549799b91bf73427ed2c0de26e8d27e";s:4:"name";s:65:"Symfony/Component/Security/Resources/translations/security.vi.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.vi.xlf";}s:68:"Symfony/Component/Security/Resources/translations/security.zh_CN.xlf";a:4:{s:6:"md5sum";s:32:"c1985d9108a24d1e66b1832cf6c0fae7";s:4:"name";s:68:"Symfony/Component/Security/Resources/translations/security.zh_CN.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations/security.zh_CN.xlf";}s:82:"Symfony/Component/Security/Tests/Core/Authentication/Token/RememberMeTokenTest.php";a:4:{s:6:"md5sum";s:32:"82c8dfa2a45c9aca1e839e448574b12b";s:4:"name";s:82:"Symfony/Component/Security/Tests/Core/Authentication/Token/RememberMeTokenTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests/Core/Authentication/Token/RememberMeTokenTest.php";}s:71:"Symfony/Component/Security/Tests/Core/User/InMemoryUserProviderTest.php";a:4:{s:6:"md5sum";s:32:"77f76d7ae94a351ec03076059c96f80d";s:4:"name";s:71:"Symfony/Component/Security/Tests/Core/User/InMemoryUserProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests/Core/User/InMemoryUserProviderTest.php";}s:62:"Symfony/Component/Security/Tests/Core/User/UserCheckerTest.php";a:4:{s:6:"md5sum";s:32:"3b095a4893cc953a6aa42a368c70c8a5";s:4:"name";s:62:"Symfony/Component/Security/Tests/Core/User/UserCheckerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests/Core/User/UserCheckerTest.php";}s:72:"Symfony/Component/Security/Tests/Http/Firewall/ExceptionListenerTest.php";a:4:{s:6:"md5sum";s:32:"693af9a30d85b3907c6147d9ddb56df8";s:4:"name";s:72:"Symfony/Component/Security/Tests/Http/Firewall/ExceptionListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests/Http/Firewall/ExceptionListenerTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:96:{s:73:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Acl";b:1;s:69:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security";b:1;s:60:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component";b:1;s:50:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony";b:1;s:42:"/opt/alt/php54/usr/share/doc/pear/Security";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Dbal";b:1;s:60:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl";b:1;s:56:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Domain";b:1;s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Exception";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Model";b:1;s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Permission";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl";b:1;s:70:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security";b:1;s:61:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component";b:1;s:51:"/opt/alt/php54/usr/share/pear/test/Security/Symfony";b:1;s:43:"/opt/alt/php54/usr/share/pear/test/Security";b:1;s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources/bin";b:1;s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Resources/schema";b:1;s:85:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Dbal";b:1;s:80:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain";b:1;s:91:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Permission";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Acl/Tests/Voter";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Acl/Voter";b:1;s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication";b:1;s:61:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core";b:1;s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Provider";b:1;s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/RememberMe";b:1;s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authentication/Token";b:1;s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authorization";b:1;s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Authorization/Voter";b:1;s:74:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Core";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Encoder";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Event";b:1;s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Exception";b:1;s:75:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core";b:1;s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources/translations";b:1;s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Resources";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Role";b:1;s:96:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests";b:1;s:105:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider";b:1;s:107:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/RememberMe";b:1;s:102:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Token";b:1;s:95:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authorization";b:1;s:101:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/Voter";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Encoder";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Role";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/User";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Util";b:1;s:103:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Validator/Constraints";b:1;s:91:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Core/Tests/Validator";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/User";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Util";b:1;s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Validator/Constraints";b:1;s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Core/Validator";b:1;s:74:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Csrf";b:1;s:61:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf";b:1;s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/Exception";b:1;s:75:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Csrf";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Csrf/Tests";b:1;s:96:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Csrf/Tests/TokenGenerator";b:1;s:94:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Csrf/Tests/TokenStorage";b:1;s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/TokenGenerator";b:1;s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Csrf/TokenStorage";b:1;s:61:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http";b:1;s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Authentication";b:1;s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Authorization";b:1;s:74:"/opt/alt/php54/usr/share/doc/pear/Security/Symfony/Component/Security/Http";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/EntryPoint";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Event";b:1;s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Firewall";b:1;s:68:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Logout";b:1;s:75:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/RememberMe";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Http/Session";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests";b:1;s:96:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Authentication";b:1;s:92:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/EntryPoint";b:1;s:90:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Logout";b:1;s:92:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/RememberMe";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Http/Tests/Session";b:1;s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources/translations";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Security/Resources";b:1;s:102:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests/Core/Authentication/Token";b:1;s:96:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests/Core/Authentication";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests/Core";b:1;s:76:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests/Core/User";b:1;s:90:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests/Http/Firewall";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Security/Symfony/Component/Security/Tests/Http";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:9:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:10:"HttpKernel";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:3;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:14:"HttpFoundation";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:4;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:15:"EventDispatcher";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:5;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:7:"Routing";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:6;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:6:"Finder";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:7;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:11:"ClassLoader";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:8;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:4:"Form";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506496;}PK�^�\jO��R�R3pear/.registry/.channel.pear.symfony.com/locale.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:6:"Locale";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:25:"Symfony2 Locale Component";s:11:"description";s:25:"Symfony2 Locale Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:48";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:35:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"542a733e26cbb9c622157b81f47f1482";s:4:"name";s:39:"Symfony/Component/Locale/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4c0b87688bb528a3a7ea580c26e45a55";s:4:"name";s:37:"Symfony/Component/Locale/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"492a08d5a533b5455b0c0f4a5278730a";s:4:"name";s:38:"Symfony/Component/Locale/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c04c627983b2d98473c617463971669a";s:4:"name";s:76:"Symfony/Component/Locale/Exception/MethodArgumentNotImplementedException.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"37f4cb921e4bf39cffab88ca9c073957";s:4:"name";s:81:"Symfony/Component/Locale/Exception/MethodArgumentValueNotImplementedException.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0acb3d816693f31d77fe86ce33e12267";s:4:"name";s:68:"Symfony/Component/Locale/Exception/MethodNotImplementedException.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d9b3b933f5665a44fc234a81d8716e57";s:4:"name";s:62:"Symfony/Component/Locale/Exception/NotImplementedException.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:32:"Symfony/Component/Locale/LICENSE";s:4:"role";s:3:"doc";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c04b169bfa42cc7c6227cec9664e4778";s:4:"name";s:35:"Symfony/Component/Locale/Locale.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cb19198a8d7b5f9c20b7e5286dfc5399";s:4:"name";s:41:"Symfony/Component/Locale/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"53feb3fe807239186f141bdccd2c8a12";s:4:"name";s:34:"Symfony/Component/Locale/README.md";s:4:"role";s:3:"doc";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"65d4e17de2f07c8974d5a1ba1ea8ecb9";s:4:"name";s:60:"Symfony/Component/Locale/Stub/DateFormat/AmPmTransformer.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0afa98da9f2d567ba83308042be5d57d";s:4:"name";s:65:"Symfony/Component/Locale/Stub/DateFormat/DayOfWeekTransformer.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1556b0af9881cfe4a437c6a6c11877a9";s:4:"name";s:65:"Symfony/Component/Locale/Stub/DateFormat/DayOfYearTransformer.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"41dd3c3fa8529b6d21084f9cfef7e8f0";s:4:"name";s:59:"Symfony/Component/Locale/Stub/DateFormat/DayTransformer.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5df741e714305d31466a93d4ad487c80";s:4:"name";s:60:"Symfony/Component/Locale/Stub/DateFormat/FullTransformer.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1434500e2980f6118fe9f038fb154011";s:4:"name";s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour1200Transformer.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8de2a07a2c433f79a3d31fb5c2c7ca77";s:4:"name";s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour1201Transformer.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f5301ded09e7bb57fed47d3e8655a0f0";s:4:"name";s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour2400Transformer.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a115ff0afd31e182e27ce4c5cc3d89e7";s:4:"name";s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour2401Transformer.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1021c5207903eb1d01b40dcb3a502a84";s:4:"name";s:60:"Symfony/Component/Locale/Stub/DateFormat/HourTransformer.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"289e115d57e61733b8dd1b1646d7535d";s:4:"name";s:62:"Symfony/Component/Locale/Stub/DateFormat/MinuteTransformer.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ee9f1d1081ade3a43deba9c85376f120";s:4:"name";s:61:"Symfony/Component/Locale/Stub/DateFormat/MonthTransformer.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ff38c4bfc0ebc8c6d14e5af40e1eb8ec";s:4:"name";s:63:"Symfony/Component/Locale/Stub/DateFormat/QuarterTransformer.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8ea0c30873f9f25be91854267f35f283";s:4:"name";s:62:"Symfony/Component/Locale/Stub/DateFormat/SecondTransformer.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"38681181a097a88e205d05a25cb26ad6";s:4:"name";s:64:"Symfony/Component/Locale/Stub/DateFormat/TimeZoneTransformer.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"551a2f8a32c86667a9d9a7e648a1a043";s:4:"name";s:56:"Symfony/Component/Locale/Stub/DateFormat/Transformer.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b9b0b8a353f49639e74f12e1ec85ba69";s:4:"name";s:60:"Symfony/Component/Locale/Stub/DateFormat/YearTransformer.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ecbf7ee2d715f64e448ac48c0ce1986f";s:4:"name";s:46:"Symfony/Component/Locale/Stub/StubCollator.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"33399ff7b83a42d5f3a4e1b0cf0db655";s:4:"name";s:42:"Symfony/Component/Locale/Stub/StubIntl.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"80236bbeab6b375a842ab2e8f399eb1e";s:4:"name";s:55:"Symfony/Component/Locale/Stub/StubIntlDateFormatter.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fb93d653fed48a9b3a162af71e9edb2d";s:4:"name";s:44:"Symfony/Component/Locale/Stub/StubLocale.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"241d35bfb8ac82eea2203af325d08756";s:4:"name";s:53:"Symfony/Component/Locale/Stub/StubNumberFormatter.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"138590ade23ab1e386034814c8b118d0";s:4:"name";s:45:"Symfony/Component/Locale/Tests/LocaleTest.php";s:4:"role";s:4:"test";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"688a2326a62876a742c3aa76779ba504";s:4:"name";s:54:"Symfony/Component/Locale/Tests/Stub/StubLocaleTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:35:{s:39:"Symfony/Component/Locale/autoloader.php";a:4:{s:6:"md5sum";s:32:"542a733e26cbb9c622157b81f47f1482";s:4:"name";s:39:"Symfony/Component/Locale/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/autoloader.php";}s:37:"Symfony/Component/Locale/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"4c0b87688bb528a3a7ea580c26e45a55";s:4:"name";s:37:"Symfony/Component/Locale/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/doc/pear/Locale/Symfony/Component/Locale/CHANGELOG.md";}s:38:"Symfony/Component/Locale/composer.json";a:4:{s:6:"md5sum";s:32:"492a08d5a533b5455b0c0f4a5278730a";s:4:"name";s:38:"Symfony/Component/Locale/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/doc/pear/Locale/Symfony/Component/Locale/composer.json";}s:76:"Symfony/Component/Locale/Exception/MethodArgumentNotImplementedException.php";a:4:{s:6:"md5sum";s:32:"c04c627983b2d98473c617463971669a";s:4:"name";s:76:"Symfony/Component/Locale/Exception/MethodArgumentNotImplementedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Exception/MethodArgumentNotImplementedException.php";}s:81:"Symfony/Component/Locale/Exception/MethodArgumentValueNotImplementedException.php";a:4:{s:6:"md5sum";s:32:"37f4cb921e4bf39cffab88ca9c073957";s:4:"name";s:81:"Symfony/Component/Locale/Exception/MethodArgumentValueNotImplementedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Exception/MethodArgumentValueNotImplementedException.php";}s:68:"Symfony/Component/Locale/Exception/MethodNotImplementedException.php";a:4:{s:6:"md5sum";s:32:"0acb3d816693f31d77fe86ce33e12267";s:4:"name";s:68:"Symfony/Component/Locale/Exception/MethodNotImplementedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Exception/MethodNotImplementedException.php";}s:62:"Symfony/Component/Locale/Exception/NotImplementedException.php";a:4:{s:6:"md5sum";s:32:"d9b3b933f5665a44fc234a81d8716e57";s:4:"name";s:62:"Symfony/Component/Locale/Exception/NotImplementedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Exception/NotImplementedException.php";}s:32:"Symfony/Component/Locale/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:32:"Symfony/Component/Locale/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/doc/pear/Locale/Symfony/Component/Locale/LICENSE";}s:35:"Symfony/Component/Locale/Locale.php";a:4:{s:6:"md5sum";s:32:"c04b169bfa42cc7c6227cec9664e4778";s:4:"name";s:35:"Symfony/Component/Locale/Locale.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Locale.php";}s:41:"Symfony/Component/Locale/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"cb19198a8d7b5f9c20b7e5286dfc5399";s:4:"name";s:41:"Symfony/Component/Locale/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/test/Locale/Symfony/Component/Locale/phpunit.xml.dist";}s:34:"Symfony/Component/Locale/README.md";a:4:{s:6:"md5sum";s:32:"53feb3fe807239186f141bdccd2c8a12";s:4:"name";s:34:"Symfony/Component/Locale/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/doc/pear/Locale/Symfony/Component/Locale/README.md";}s:60:"Symfony/Component/Locale/Stub/DateFormat/AmPmTransformer.php";a:4:{s:6:"md5sum";s:32:"65d4e17de2f07c8974d5a1ba1ea8ecb9";s:4:"name";s:60:"Symfony/Component/Locale/Stub/DateFormat/AmPmTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/AmPmTransformer.php";}s:65:"Symfony/Component/Locale/Stub/DateFormat/DayOfWeekTransformer.php";a:4:{s:6:"md5sum";s:32:"0afa98da9f2d567ba83308042be5d57d";s:4:"name";s:65:"Symfony/Component/Locale/Stub/DateFormat/DayOfWeekTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/DayOfWeekTransformer.php";}s:65:"Symfony/Component/Locale/Stub/DateFormat/DayOfYearTransformer.php";a:4:{s:6:"md5sum";s:32:"1556b0af9881cfe4a437c6a6c11877a9";s:4:"name";s:65:"Symfony/Component/Locale/Stub/DateFormat/DayOfYearTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/DayOfYearTransformer.php";}s:59:"Symfony/Component/Locale/Stub/DateFormat/DayTransformer.php";a:4:{s:6:"md5sum";s:32:"41dd3c3fa8529b6d21084f9cfef7e8f0";s:4:"name";s:59:"Symfony/Component/Locale/Stub/DateFormat/DayTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/DayTransformer.php";}s:60:"Symfony/Component/Locale/Stub/DateFormat/FullTransformer.php";a:4:{s:6:"md5sum";s:32:"5df741e714305d31466a93d4ad487c80";s:4:"name";s:60:"Symfony/Component/Locale/Stub/DateFormat/FullTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/FullTransformer.php";}s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour1200Transformer.php";a:4:{s:6:"md5sum";s:32:"1434500e2980f6118fe9f038fb154011";s:4:"name";s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour1200Transformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/Hour1200Transformer.php";}s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour1201Transformer.php";a:4:{s:6:"md5sum";s:32:"8de2a07a2c433f79a3d31fb5c2c7ca77";s:4:"name";s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour1201Transformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/Hour1201Transformer.php";}s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour2400Transformer.php";a:4:{s:6:"md5sum";s:32:"f5301ded09e7bb57fed47d3e8655a0f0";s:4:"name";s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour2400Transformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/Hour2400Transformer.php";}s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour2401Transformer.php";a:4:{s:6:"md5sum";s:32:"a115ff0afd31e182e27ce4c5cc3d89e7";s:4:"name";s:64:"Symfony/Component/Locale/Stub/DateFormat/Hour2401Transformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/Hour2401Transformer.php";}s:60:"Symfony/Component/Locale/Stub/DateFormat/HourTransformer.php";a:4:{s:6:"md5sum";s:32:"1021c5207903eb1d01b40dcb3a502a84";s:4:"name";s:60:"Symfony/Component/Locale/Stub/DateFormat/HourTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/HourTransformer.php";}s:62:"Symfony/Component/Locale/Stub/DateFormat/MinuteTransformer.php";a:4:{s:6:"md5sum";s:32:"289e115d57e61733b8dd1b1646d7535d";s:4:"name";s:62:"Symfony/Component/Locale/Stub/DateFormat/MinuteTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/MinuteTransformer.php";}s:61:"Symfony/Component/Locale/Stub/DateFormat/MonthTransformer.php";a:4:{s:6:"md5sum";s:32:"ee9f1d1081ade3a43deba9c85376f120";s:4:"name";s:61:"Symfony/Component/Locale/Stub/DateFormat/MonthTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/MonthTransformer.php";}s:63:"Symfony/Component/Locale/Stub/DateFormat/QuarterTransformer.php";a:4:{s:6:"md5sum";s:32:"ff38c4bfc0ebc8c6d14e5af40e1eb8ec";s:4:"name";s:63:"Symfony/Component/Locale/Stub/DateFormat/QuarterTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/QuarterTransformer.php";}s:62:"Symfony/Component/Locale/Stub/DateFormat/SecondTransformer.php";a:4:{s:6:"md5sum";s:32:"8ea0c30873f9f25be91854267f35f283";s:4:"name";s:62:"Symfony/Component/Locale/Stub/DateFormat/SecondTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/SecondTransformer.php";}s:64:"Symfony/Component/Locale/Stub/DateFormat/TimeZoneTransformer.php";a:4:{s:6:"md5sum";s:32:"38681181a097a88e205d05a25cb26ad6";s:4:"name";s:64:"Symfony/Component/Locale/Stub/DateFormat/TimeZoneTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/TimeZoneTransformer.php";}s:56:"Symfony/Component/Locale/Stub/DateFormat/Transformer.php";a:4:{s:6:"md5sum";s:32:"551a2f8a32c86667a9d9a7e648a1a043";s:4:"name";s:56:"Symfony/Component/Locale/Stub/DateFormat/Transformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/Transformer.php";}s:60:"Symfony/Component/Locale/Stub/DateFormat/YearTransformer.php";a:4:{s:6:"md5sum";s:32:"b9b0b8a353f49639e74f12e1ec85ba69";s:4:"name";s:60:"Symfony/Component/Locale/Stub/DateFormat/YearTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat/YearTransformer.php";}s:46:"Symfony/Component/Locale/Stub/StubCollator.php";a:4:{s:6:"md5sum";s:32:"ecbf7ee2d715f64e448ac48c0ce1986f";s:4:"name";s:46:"Symfony/Component/Locale/Stub/StubCollator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/StubCollator.php";}s:42:"Symfony/Component/Locale/Stub/StubIntl.php";a:4:{s:6:"md5sum";s:32:"33399ff7b83a42d5f3a4e1b0cf0db655";s:4:"name";s:42:"Symfony/Component/Locale/Stub/StubIntl.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/StubIntl.php";}s:55:"Symfony/Component/Locale/Stub/StubIntlDateFormatter.php";a:4:{s:6:"md5sum";s:32:"80236bbeab6b375a842ab2e8f399eb1e";s:4:"name";s:55:"Symfony/Component/Locale/Stub/StubIntlDateFormatter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/StubIntlDateFormatter.php";}s:44:"Symfony/Component/Locale/Stub/StubLocale.php";a:4:{s:6:"md5sum";s:32:"fb93d653fed48a9b3a162af71e9edb2d";s:4:"name";s:44:"Symfony/Component/Locale/Stub/StubLocale.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/StubLocale.php";}s:53:"Symfony/Component/Locale/Stub/StubNumberFormatter.php";a:4:{s:6:"md5sum";s:32:"241d35bfb8ac82eea2203af325d08756";s:4:"name";s:53:"Symfony/Component/Locale/Stub/StubNumberFormatter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/StubNumberFormatter.php";}s:45:"Symfony/Component/Locale/Tests/LocaleTest.php";a:4:{s:6:"md5sum";s:32:"138590ade23ab1e386034814c8b118d0";s:4:"name";s:45:"Symfony/Component/Locale/Tests/LocaleTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/test/Locale/Symfony/Component/Locale/Tests/LocaleTest.php";}s:54:"Symfony/Component/Locale/Tests/Stub/StubLocaleTest.php";a:4:{s:6:"md5sum";s:32:"688a2326a62876a742c3aa76779ba504";s:4:"name";s:54:"Symfony/Component/Locale/Tests/Stub/StubLocaleTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Locale/Symfony/Component/Locale/Tests/Stub/StubLocaleTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:16:{s:54:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:65:"/opt/alt/php54/usr/share/doc/pear/Locale/Symfony/Component/Locale";b:1;s:58:"/opt/alt/php54/usr/share/doc/pear/Locale/Symfony/Component";b:1;s:48:"/opt/alt/php54/usr/share/doc/pear/Locale/Symfony";b:1;s:40:"/opt/alt/php54/usr/share/doc/pear/Locale";b:1;s:64:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Exception";b:1;s:66:"/opt/alt/php54/usr/share/pear/test/Locale/Symfony/Component/Locale";b:1;s:59:"/opt/alt/php54/usr/share/pear/test/Locale/Symfony/Component";b:1;s:49:"/opt/alt/php54/usr/share/pear/test/Locale/Symfony";b:1;s:41:"/opt/alt/php54/usr/share/pear/test/Locale";b:1;s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub/DateFormat";b:1;s:59:"/opt/alt/php54/usr/share/pear/Symfony/Component/Locale/Stub";b:1;s:72:"/opt/alt/php54/usr/share/pear/test/Locale/Symfony/Component/Locale/Tests";b:1;s:77:"/opt/alt/php54/usr/share/pear/test/Locale/Symfony/Component/Locale/Tests/Stub";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\�3�Ų.�.7pear/.registry/.channel.pear.symfony.com/browserkit.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:10:"BrowserKit";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:29:"Symfony2 BrowserKit Component";s:11:"description";s:29:"Symfony2 BrowserKit Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:40";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:18:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"73fd6d413cc833c5246ceca2eadb68b9";s:4:"name";s:43:"Symfony/Component/BrowserKit/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6dbcbfc4c59d34785c38be32ace2caba";s:4:"name";s:41:"Symfony/Component/BrowserKit/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5674d7e1c5c7b6fe316522b571465467";s:4:"name";s:39:"Symfony/Component/BrowserKit/Client.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"be724b81eaca8742bce61a417240b6fc";s:4:"name";s:42:"Symfony/Component/BrowserKit/composer.json";s:4:"role";s:3:"doc";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f69714aa6ba33d7e1b0bc3b187304d47";s:4:"name";s:39:"Symfony/Component/BrowserKit/Cookie.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"56cd2a8a6894ee87ad2dc34902176a2b";s:4:"name";s:42:"Symfony/Component/BrowserKit/CookieJar.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"38f98f3e64dae73376a7b422dd2606de";s:4:"name";s:40:"Symfony/Component/BrowserKit/History.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/BrowserKit/LICENSE";s:4:"role";s:3:"doc";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fc3e7c04f789c929b337c69a123cb973";s:4:"name";s:45:"Symfony/Component/BrowserKit/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8735649e3edbb9efbc585ae2bc80c977";s:4:"name";s:38:"Symfony/Component/BrowserKit/README.md";s:4:"role";s:3:"doc";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4861bcb9490eadd0c465c5fedcfc6ba6";s:4:"name";s:40:"Symfony/Component/BrowserKit/Request.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"36277cc2c016b665d292b9ac6e1b3071";s:4:"name";s:41:"Symfony/Component/BrowserKit/Response.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7a01acf3983981e9631779baca742a93";s:4:"name";s:49:"Symfony/Component/BrowserKit/Tests/ClientTest.php";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"95ca664f7f929e6360504b978714aeb9";s:4:"name";s:52:"Symfony/Component/BrowserKit/Tests/CookieJarTest.php";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b6ecdb8942a989d1aa67f60c278d2551";s:4:"name";s:49:"Symfony/Component/BrowserKit/Tests/CookieTest.php";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1e71cb797c1fa1e81325c1265a8f4cfd";s:4:"name";s:50:"Symfony/Component/BrowserKit/Tests/HistoryTest.php";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"28dcc60e83cc2fba65b3d07eda487fd1";s:4:"name";s:50:"Symfony/Component/BrowserKit/Tests/RequestTest.php";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9b193b5af166845cca3e3f7e1aeab1eb";s:4:"name";s:51:"Symfony/Component/BrowserKit/Tests/ResponseTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}s:7:"package";a:2:{s:4:"name";s:10:"DomCrawler";s:7:"channel";s:16:"pear.symfony.com";}}s:8:"optional";a:1:{s:7:"package";a:2:{s:4:"name";s:7:"Process";s:7:"channel";s:16:"pear.symfony.com";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:18:{s:43:"Symfony/Component/BrowserKit/autoloader.php";a:4:{s:6:"md5sum";s:32:"73fd6d413cc833c5246ceca2eadb68b9";s:4:"name";s:43:"Symfony/Component/BrowserKit/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/BrowserKit/autoloader.php";}s:41:"Symfony/Component/BrowserKit/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"6dbcbfc4c59d34785c38be32ace2caba";s:4:"name";s:41:"Symfony/Component/BrowserKit/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/doc/pear/BrowserKit/Symfony/Component/BrowserKit/CHANGELOG.md";}s:39:"Symfony/Component/BrowserKit/Client.php";a:4:{s:6:"md5sum";s:32:"5674d7e1c5c7b6fe316522b571465467";s:4:"name";s:39:"Symfony/Component/BrowserKit/Client.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/BrowserKit/Client.php";}s:42:"Symfony/Component/BrowserKit/composer.json";a:4:{s:6:"md5sum";s:32:"be724b81eaca8742bce61a417240b6fc";s:4:"name";s:42:"Symfony/Component/BrowserKit/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/BrowserKit/Symfony/Component/BrowserKit/composer.json";}s:39:"Symfony/Component/BrowserKit/Cookie.php";a:4:{s:6:"md5sum";s:32:"f69714aa6ba33d7e1b0bc3b187304d47";s:4:"name";s:39:"Symfony/Component/BrowserKit/Cookie.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/BrowserKit/Cookie.php";}s:42:"Symfony/Component/BrowserKit/CookieJar.php";a:4:{s:6:"md5sum";s:32:"56cd2a8a6894ee87ad2dc34902176a2b";s:4:"name";s:42:"Symfony/Component/BrowserKit/CookieJar.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/BrowserKit/CookieJar.php";}s:40:"Symfony/Component/BrowserKit/History.php";a:4:{s:6:"md5sum";s:32:"38f98f3e64dae73376a7b422dd2606de";s:4:"name";s:40:"Symfony/Component/BrowserKit/History.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/BrowserKit/History.php";}s:36:"Symfony/Component/BrowserKit/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/BrowserKit/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/BrowserKit/Symfony/Component/BrowserKit/LICENSE";}s:45:"Symfony/Component/BrowserKit/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"fc3e7c04f789c929b337c69a123cb973";s:4:"name";s:45:"Symfony/Component/BrowserKit/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony/Component/BrowserKit/phpunit.xml.dist";}s:38:"Symfony/Component/BrowserKit/README.md";a:4:{s:6:"md5sum";s:32:"8735649e3edbb9efbc585ae2bc80c977";s:4:"name";s:38:"Symfony/Component/BrowserKit/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/BrowserKit/Symfony/Component/BrowserKit/README.md";}s:40:"Symfony/Component/BrowserKit/Request.php";a:4:{s:6:"md5sum";s:32:"4861bcb9490eadd0c465c5fedcfc6ba6";s:4:"name";s:40:"Symfony/Component/BrowserKit/Request.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/BrowserKit/Request.php";}s:41:"Symfony/Component/BrowserKit/Response.php";a:4:{s:6:"md5sum";s:32:"36277cc2c016b665d292b9ac6e1b3071";s:4:"name";s:41:"Symfony/Component/BrowserKit/Response.php";s:4:"role";s:3:"php";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/BrowserKit/Response.php";}s:49:"Symfony/Component/BrowserKit/Tests/ClientTest.php";a:4:{s:6:"md5sum";s:32:"7a01acf3983981e9631779baca742a93";s:4:"name";s:49:"Symfony/Component/BrowserKit/Tests/ClientTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/ClientTest.php";}s:52:"Symfony/Component/BrowserKit/Tests/CookieJarTest.php";a:4:{s:6:"md5sum";s:32:"95ca664f7f929e6360504b978714aeb9";s:4:"name";s:52:"Symfony/Component/BrowserKit/Tests/CookieJarTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/CookieJarTest.php";}s:49:"Symfony/Component/BrowserKit/Tests/CookieTest.php";a:4:{s:6:"md5sum";s:32:"b6ecdb8942a989d1aa67f60c278d2551";s:4:"name";s:49:"Symfony/Component/BrowserKit/Tests/CookieTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/CookieTest.php";}s:50:"Symfony/Component/BrowserKit/Tests/HistoryTest.php";a:4:{s:6:"md5sum";s:32:"1e71cb797c1fa1e81325c1265a8f4cfd";s:4:"name";s:50:"Symfony/Component/BrowserKit/Tests/HistoryTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/HistoryTest.php";}s:50:"Symfony/Component/BrowserKit/Tests/RequestTest.php";a:4:{s:6:"md5sum";s:32:"28dcc60e83cc2fba65b3d07eda487fd1";s:4:"name";s:50:"Symfony/Component/BrowserKit/Tests/RequestTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/RequestTest.php";}s:51:"Symfony/Component/BrowserKit/Tests/ResponseTest.php";a:4:{s:6:"md5sum";s:32:"9b193b5af166845cca3e3f7e1aeab1eb";s:4:"name";s:51:"Symfony/Component/BrowserKit/Tests/ResponseTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/ResponseTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:12:{s:58:"/opt/alt/php54/usr/share/pear/Symfony/Component/BrowserKit";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:73:"/opt/alt/php54/usr/share/doc/pear/BrowserKit/Symfony/Component/BrowserKit";b:1;s:62:"/opt/alt/php54/usr/share/doc/pear/BrowserKit/Symfony/Component";b:1;s:52:"/opt/alt/php54/usr/share/doc/pear/BrowserKit/Symfony";b:1;s:44:"/opt/alt/php54/usr/share/doc/pear/BrowserKit";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony/Component/BrowserKit";b:1;s:63:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony/Component";b:1;s:53:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony";b:1;s:45:"/opt/alt/php54/usr/share/pear/test/BrowserKit";b:1;s:80:"/opt/alt/php54/usr/share/pear/test/BrowserKit/Symfony/Component/BrowserKit/Tests";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:4:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:10:"DomCrawler";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:3;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:7:"Process";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506495;}PK�^�\�.�P��;pear/.registry/.channel.pear.symfony.com/doctrinebridge.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:14:"DoctrineBridge";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:24:"Symfony2 Doctrine Bridge";s:11:"description";s:24:"Symfony2 Doctrine Bridge";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:40";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:76:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1146b84b00fda99b2d6838fa9a092b09";s:4:"name";s:38:"Symfony/Bridge/Doctrine/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a6c5324a02c7431af568fb0ddf4d701f";s:4:"name";s:56:"Symfony/Bridge/Doctrine/CacheWarmer/ProxyCacheWarmer.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6288b2050507fae3fbcf270b26daecff";s:4:"name";s:36:"Symfony/Bridge/Doctrine/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7da86c460e3e1814e41daa76393cfb95";s:4:"name";s:37:"Symfony/Bridge/Doctrine/composer.json";s:4:"role";s:3:"doc";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"54fd5d577b9f49258d19b109ad98ea08";s:4:"name";s:54:"Symfony/Bridge/Doctrine/ContainerAwareEventManager.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e725f92a17d0dee93e1522be12eb1367";s:4:"name";s:63:"Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0d5327cdcc6a003bb2dd541c1b4951be";s:4:"name";s:61:"Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d88b54e05093c8cc6fcc688bf43e2495";s:4:"name";s:73:"Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5159d0f708ad9a1b244b725d5c5c252d";s:4:"name";s:83:"Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bc6c6ff5e47d6bc1ead4eb2454142819";s:4:"name";s:101:"Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6407dfb228cb9e74521f045de4567c0b";s:4:"name";s:81:"Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"62012802efbda5aae97d5b17e36c7ac3";s:4:"name";s:83:"Symfony/Bridge/Doctrine/DependencyInjection/Security/UserProvider/EntityFactory.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"36edb41f784aa345f1a6b6aee0177512";s:4:"name";s:66:"Symfony/Bridge/Doctrine/ExpressionLanguage/DoctrineParserCache.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8f34ce5da6bd523b2e2c183b9d311454";s:4:"name";s:60:"Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d5f011953d39f7682b2d1bd38bfc103f";s:4:"name";s:65:"Symfony/Bridge/Doctrine/Form/ChoiceList/EntityLoaderInterface.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f458540aedd232db5a808163e8953c3e";s:4:"name";s:65:"Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a6abbc1e07395be54a0cc9bcc7e8a021";s:4:"name";s:77:"Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0394473ded0681f92cfd74d66810cf46";s:4:"name";s:53:"Symfony/Bridge/Doctrine/Form/DoctrineOrmExtension.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"70635596be0740792c9b01fc717a07c6";s:4:"name";s:55:"Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"922055b81eb74eab130af3678e23d728";s:4:"name";s:78:"Symfony/Bridge/Doctrine/Form/EventListener/MergeDoctrineCollectionListener.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"422792a0aec2cfaf54e7aed842e41a1b";s:4:"name";s:50:"Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4027caad2522bb92ecb104212e740bbb";s:4:"name";s:48:"Symfony/Bridge/Doctrine/Form/Type/EntityType.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c3a63e53318e44d71e48d38e72e6368f";s:4:"name";s:61:"Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandler.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5c638ddb71981e9ee7de51ad672f04be";s:4:"name";s:67:"Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandlerSchema.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:31:"Symfony/Bridge/Doctrine/LICENSE";s:4:"role";s:3:"doc";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a264db6fc25f6bbbf6f7f6866ab775b8";s:4:"name";s:45:"Symfony/Bridge/Doctrine/Logger/DbalLogger.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9aba8e500e2eb6c85e0c5142b3ab01dc";s:4:"name";s:43:"Symfony/Bridge/Doctrine/ManagerRegistry.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"028b26c34311c37ce5a78efcb95cd3a1";s:4:"name";s:40:"Symfony/Bridge/Doctrine/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0dfbf896145a1d79d4536a6457375891";s:4:"name";s:33:"Symfony/Bridge/Doctrine/README.md";s:4:"role";s:3:"doc";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"97de5e0e6b0a5567a4d05c49145f007b";s:4:"name";s:45:"Symfony/Bridge/Doctrine/RegistryInterface.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"58d4be45f6a67d0120082b9909fb7470";s:4:"name";s:69:"Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cd4fb5647f556391d48bf4417639bebc";s:4:"name";s:60:"Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cd11805976770714b196a683096710fa";s:4:"name";s:51:"Symfony/Bridge/Doctrine/Test/DoctrineTestHelper.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:2:{s:4:"name";s:43:"Symfony/Bridge/Doctrine/Tests/bootstrap.php";s:4:"role";s:4:"test";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63a9dd7b5978e2e653914cee374dd6f0";s:4:"name";s:64:"Symfony/Bridge/Doctrine/Tests/ContainerAwareEventManagerTest.php";s:4:"role";s:4:"test";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"22af804224173c290f9ea48275ea6265";s:4:"name";s:73:"Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorTest.php";s:4:"role";s:4:"test";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"317c03bfcf9de63ddb87b75b5219b0e1";s:4:"name";s:71:"Symfony/Bridge/Doctrine/Tests/DataFixtures/ContainerAwareLoaderTest.php";s:4:"role";s:4:"test";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6b953b8a87ad83b1fa9ca6c5b44b28e5";s:4:"name";s:111:"Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php";s:4:"role";s:4:"test";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cbab10b2d43dd63dc2b6c4afd2e3ba50";s:4:"name";s:53:"Symfony/Bridge/Doctrine/Tests/DoctrineOrmTestCase.php";s:4:"role";s:4:"test";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"91879a9d73006a12ffc8c62d83ac857c";s:4:"name";s:76:"Symfony/Bridge/Doctrine/Tests/ExpressionLanguage/DoctrineParserCacheTest.php";s:4:"role";s:4:"test";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"237107a72edb5333186c85275ac35e1c";s:4:"name";s:60:"Symfony/Bridge/Doctrine/Tests/Fixtures/AssociationEntity.php";s:4:"role";s:4:"test";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d4361cc34fb44804debe2ec8e0e832f8";s:4:"name";s:63:"Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeIntIdEntity.php";s:4:"role";s:4:"test";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"73b3184c3b0a6bfc68db74c507f1ff7c";s:4:"name";s:66:"Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeStringIdEntity.php";s:4:"role";s:4:"test";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8db7e5383a0e848cc8f60964d12d350";s:4:"name";s:64:"Symfony/Bridge/Doctrine/Tests/Fixtures/ContainerAwareFixture.php";s:4:"role";s:4:"test";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e4cd9ce9c40b8e76edb083fc526bcd44";s:4:"name";s:59:"Symfony/Bridge/Doctrine/Tests/Fixtures/DoubleNameEntity.php";s:4:"role";s:4:"test";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2325d0c65a178f8bfddcf0a76e53cb00";s:4:"name";s:58:"Symfony/Bridge/Doctrine/Tests/Fixtures/GroupableEntity.php";s:4:"role";s:4:"test";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"01edea44eacb41bdeb553b9445bd2b53";s:4:"name";s:60:"Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntity.php";s:4:"role";s:4:"test";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c13f44c8fccf2a768c1dfe09cdcf644c";s:4:"name";s:70:"Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdNoToStringEntity.php";s:4:"role";s:4:"test";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f3044b3a9be916f4b6433cd993933d4b";s:4:"name";s:63:"Symfony/Bridge/Doctrine/Tests/Fixtures/SingleStringIdEntity.php";s:4:"role";s:4:"test";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"27921595ac59f8d35f99ea9b8a80474c";s:4:"name";s:47:"Symfony/Bridge/Doctrine/Tests/Fixtures/User.php";s:4:"role";s:4:"test";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"62be3ca48dad09bc19de00a6133ae33c";s:4:"name";s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListCompositeIdTest.php";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c53d2568937b7272b41253c169f1b990";s:4:"name";s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleIntIdTest.php";s:4:"role";s:4:"test";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"696f31cf938c23921a506d3dc5b1bd3f";s:4:"name";s:92:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleStringIdTest.php";s:4:"role";s:4:"test";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e3002da166df138152291131d2563147";s:4:"name";s:78:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListTest.php";s:4:"role";s:4:"test";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ed38d6eebc677c1e49f92360dc968726";s:4:"name";s:77:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/GenericEntityChoiceListTest.php";s:4:"role";s:4:"test";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"53cb635842c3610fc376aa099a878cbb";s:4:"name";s:87:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListCompositeIdTest.php";s:4:"role";s:4:"test";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2e6faf750e515b875b39ef0f003d8b3d";s:4:"name";s:87:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleIntIdTest.php";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c8e9e517d8c3f0df5f28f2fb135164e9";s:4:"name";s:90:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleStringIdTest.php";s:4:"role";s:4:"test";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3f0f7533860351145dbb49b781cd9af9";s:4:"name";s:75:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/ORMQueryBuilderLoaderTest.php";s:4:"role";s:4:"test";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"978f11f0d52668cdf4c0f9777bfb8b72";s:4:"name";s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdTest.php";s:4:"role";s:4:"test";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"300a5b1f88f5435bd0d2fef5d292a66f";s:4:"name";s:105:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdWithQueryBuilderTest.php";s:4:"role";s:4:"test";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"484e207192fd43eb7badfc0f226df4fb";s:4:"name";s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdTest.php";s:4:"role";s:4:"test";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"657d384a368a05153a8d73dbf60da002";s:4:"name";s:105:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdWithQueryBuilderTest.php";s:4:"role";s:4:"test";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"315093405e4abafe143eb918ee7789cf";s:4:"name";s:92:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdTest.php";s:4:"role";s:4:"test";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fbff3030e3294a22d224256064aaec4f";s:4:"name";s:108:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdWithQueryBuilderTest.php";s:4:"role";s:4:"test";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba4a60892ec0398da11b48b522615034";s:4:"name";s:87:"Symfony/Bridge/Doctrine/Tests/Form/DataTransformer/CollectionToArrayTransformerTest.php";s:4:"role";s:4:"test";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4748628e6ff78737995c71507068c5f7";s:4:"name";s:65:"Symfony/Bridge/Doctrine/Tests/Form/DoctrineOrmTypeGuesserTest.php";s:4:"role";s:4:"test";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5be318cfed40c93338f512e25f69da67";s:4:"name";s:69:"Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypePerformanceTest.php";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b801ad3cbcc65d3883d8258894a5d326";s:4:"name";s:58:"Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"98f90ab5043368eb3d7848ef09fccb80";s:4:"name";s:71:"Symfony/Bridge/Doctrine/Tests/HttpFoundation/DbalSessionHandlerTest.php";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2feb485f27b025ee74707d55945fed91";s:4:"name";s:55:"Symfony/Bridge/Doctrine/Tests/Logger/DbalLoggerTest.php";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"56abcb81046969cf32a1c8b690790640";s:4:"name";s:70:"Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php";s:4:"role";s:4:"test";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c1fd3987c9391a54ac76430fff7db778";s:4:"name";s:75:"Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueValidatorTest.php";s:4:"role";s:4:"test";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4403085a6acb5b72d6876c25374a01ee";s:4:"name";s:62:"Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.php";s:4:"role";s:3:"php";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"28ee255baf4b1e3a6d539f7e598ac2ca";s:4:"name";s:71:"Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php";s:4:"role";s:3:"php";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c432d786fb2e4848b42aad6b61ff9fac";s:4:"name";s:57:"Symfony/Bridge/Doctrine/Validator/DoctrineInitializer.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}s:8:"optional";a:1:{s:7:"package";a:2:{i:0;a:2:{s:4:"name";s:9:"Validator";s:7:"channel";s:16:"pear.symfony.com";}i:1;a:2:{s:4:"name";s:4:"Form";s:7:"channel";s:16:"pear.symfony.com";}}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:76:{s:38:"Symfony/Bridge/Doctrine/autoloader.php";a:4:{s:6:"md5sum";s:32:"1146b84b00fda99b2d6838fa9a092b09";s:4:"name";s:38:"Symfony/Bridge/Doctrine/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/autoloader.php";}s:56:"Symfony/Bridge/Doctrine/CacheWarmer/ProxyCacheWarmer.php";a:4:{s:6:"md5sum";s:32:"a6c5324a02c7431af568fb0ddf4d701f";s:4:"name";s:56:"Symfony/Bridge/Doctrine/CacheWarmer/ProxyCacheWarmer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/CacheWarmer/ProxyCacheWarmer.php";}s:36:"Symfony/Bridge/Doctrine/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"6288b2050507fae3fbcf270b26daecff";s:4:"name";s:36:"Symfony/Bridge/Doctrine/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/doc/pear/DoctrineBridge/Symfony/Bridge/Doctrine/CHANGELOG.md";}s:37:"Symfony/Bridge/Doctrine/composer.json";a:4:{s:6:"md5sum";s:32:"7da86c460e3e1814e41daa76393cfb95";s:4:"name";s:37:"Symfony/Bridge/Doctrine/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/doc/pear/DoctrineBridge/Symfony/Bridge/Doctrine/composer.json";}s:54:"Symfony/Bridge/Doctrine/ContainerAwareEventManager.php";a:4:{s:6:"md5sum";s:32:"54fd5d577b9f49258d19b109ad98ea08";s:4:"name";s:54:"Symfony/Bridge/Doctrine/ContainerAwareEventManager.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/ContainerAwareEventManager.php";}s:63:"Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php";a:4:{s:6:"md5sum";s:32:"e725f92a17d0dee93e1522be12eb1367";s:4:"name";s:63:"Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php";}s:61:"Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php";a:4:{s:6:"md5sum";s:32:"0d5327cdcc6a003bb2dd541c1b4951be";s:4:"name";s:61:"Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php";}s:73:"Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php";a:4:{s:6:"md5sum";s:32:"d88b54e05093c8cc6fcc688bf43e2495";s:4:"name";s:73:"Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php";}s:83:"Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.php";a:4:{s:6:"md5sum";s:32:"5159d0f708ad9a1b244b725d5c5c252d";s:4:"name";s:83:"Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.php";}s:101:"Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php";a:4:{s:6:"md5sum";s:32:"bc6c6ff5e47d6bc1ead4eb2454142819";s:4:"name";s:101:"Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:131:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php";}s:81:"Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php";a:4:{s:6:"md5sum";s:32:"6407dfb228cb9e74521f045de4567c0b";s:4:"name";s:81:"Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php";}s:83:"Symfony/Bridge/Doctrine/DependencyInjection/Security/UserProvider/EntityFactory.php";a:4:{s:6:"md5sum";s:32:"62012802efbda5aae97d5b17e36c7ac3";s:4:"name";s:83:"Symfony/Bridge/Doctrine/DependencyInjection/Security/UserProvider/EntityFactory.php";s:4:"role";s:3:"php";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DependencyInjection/Security/UserProvider/EntityFactory.php";}s:66:"Symfony/Bridge/Doctrine/ExpressionLanguage/DoctrineParserCache.php";a:4:{s:6:"md5sum";s:32:"36edb41f784aa345f1a6b6aee0177512";s:4:"name";s:66:"Symfony/Bridge/Doctrine/ExpressionLanguage/DoctrineParserCache.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/ExpressionLanguage/DoctrineParserCache.php";}s:60:"Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php";a:4:{s:6:"md5sum";s:32:"8f34ce5da6bd523b2e2c183b9d311454";s:4:"name";s:60:"Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php";}s:65:"Symfony/Bridge/Doctrine/Form/ChoiceList/EntityLoaderInterface.php";a:4:{s:6:"md5sum";s:32:"d5f011953d39f7682b2d1bd38bfc103f";s:4:"name";s:65:"Symfony/Bridge/Doctrine/Form/ChoiceList/EntityLoaderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityLoaderInterface.php";}s:65:"Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php";a:4:{s:6:"md5sum";s:32:"f458540aedd232db5a808163e8953c3e";s:4:"name";s:65:"Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php";}s:77:"Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php";a:4:{s:6:"md5sum";s:32:"a6abbc1e07395be54a0cc9bcc7e8a021";s:4:"name";s:77:"Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php";}s:53:"Symfony/Bridge/Doctrine/Form/DoctrineOrmExtension.php";a:4:{s:6:"md5sum";s:32:"0394473ded0681f92cfd74d66810cf46";s:4:"name";s:53:"Symfony/Bridge/Doctrine/Form/DoctrineOrmExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/DoctrineOrmExtension.php";}s:55:"Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php";a:4:{s:6:"md5sum";s:32:"70635596be0740792c9b01fc717a07c6";s:4:"name";s:55:"Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php";}s:78:"Symfony/Bridge/Doctrine/Form/EventListener/MergeDoctrineCollectionListener.php";a:4:{s:6:"md5sum";s:32:"922055b81eb74eab130af3678e23d728";s:4:"name";s:78:"Symfony/Bridge/Doctrine/Form/EventListener/MergeDoctrineCollectionListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/EventListener/MergeDoctrineCollectionListener.php";}s:50:"Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php";a:4:{s:6:"md5sum";s:32:"422792a0aec2cfaf54e7aed842e41a1b";s:4:"name";s:50:"Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php";}s:48:"Symfony/Bridge/Doctrine/Form/Type/EntityType.php";a:4:{s:6:"md5sum";s:32:"4027caad2522bb92ecb104212e740bbb";s:4:"name";s:48:"Symfony/Bridge/Doctrine/Form/Type/EntityType.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/Type/EntityType.php";}s:61:"Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandler.php";a:4:{s:6:"md5sum";s:32:"c3a63e53318e44d71e48d38e72e6368f";s:4:"name";s:61:"Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandler.php";}s:67:"Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandlerSchema.php";a:4:{s:6:"md5sum";s:32:"5c638ddb71981e9ee7de51ad672f04be";s:4:"name";s:67:"Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandlerSchema.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandlerSchema.php";}s:31:"Symfony/Bridge/Doctrine/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:31:"Symfony/Bridge/Doctrine/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/doc/pear/DoctrineBridge/Symfony/Bridge/Doctrine/LICENSE";}s:45:"Symfony/Bridge/Doctrine/Logger/DbalLogger.php";a:4:{s:6:"md5sum";s:32:"a264db6fc25f6bbbf6f7f6866ab775b8";s:4:"name";s:45:"Symfony/Bridge/Doctrine/Logger/DbalLogger.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Logger/DbalLogger.php";}s:43:"Symfony/Bridge/Doctrine/ManagerRegistry.php";a:4:{s:6:"md5sum";s:32:"9aba8e500e2eb6c85e0c5142b3ab01dc";s:4:"name";s:43:"Symfony/Bridge/Doctrine/ManagerRegistry.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/ManagerRegistry.php";}s:40:"Symfony/Bridge/Doctrine/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"028b26c34311c37ce5a78efcb95cd3a1";s:4:"name";s:40:"Symfony/Bridge/Doctrine/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/phpunit.xml.dist";}s:33:"Symfony/Bridge/Doctrine/README.md";a:4:{s:6:"md5sum";s:32:"0dfbf896145a1d79d4536a6457375891";s:4:"name";s:33:"Symfony/Bridge/Doctrine/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/doc/pear/DoctrineBridge/Symfony/Bridge/Doctrine/README.md";}s:45:"Symfony/Bridge/Doctrine/RegistryInterface.php";a:4:{s:6:"md5sum";s:32:"97de5e0e6b0a5567a4d05c49145f007b";s:4:"name";s:45:"Symfony/Bridge/Doctrine/RegistryInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/RegistryInterface.php";}s:69:"Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php";a:4:{s:6:"md5sum";s:32:"58d4be45f6a67d0120082b9909fb7470";s:4:"name";s:69:"Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php";}s:60:"Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php";a:4:{s:6:"md5sum";s:32:"cd4fb5647f556391d48bf4417639bebc";s:4:"name";s:60:"Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php";}s:51:"Symfony/Bridge/Doctrine/Test/DoctrineTestHelper.php";a:4:{s:6:"md5sum";s:32:"cd11805976770714b196a683096710fa";s:4:"name";s:51:"Symfony/Bridge/Doctrine/Test/DoctrineTestHelper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Test/DoctrineTestHelper.php";}s:43:"Symfony/Bridge/Doctrine/Tests/bootstrap.php";a:3:{s:4:"name";s:43:"Symfony/Bridge/Doctrine/Tests/bootstrap.php";s:4:"role";s:4:"test";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/bootstrap.php";}s:64:"Symfony/Bridge/Doctrine/Tests/ContainerAwareEventManagerTest.php";a:4:{s:6:"md5sum";s:32:"63a9dd7b5978e2e653914cee374dd6f0";s:4:"name";s:64:"Symfony/Bridge/Doctrine/Tests/ContainerAwareEventManagerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/ContainerAwareEventManagerTest.php";}s:73:"Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorTest.php";a:4:{s:6:"md5sum";s:32:"22af804224173c290f9ea48275ea6265";s:4:"name";s:73:"Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorTest.php";}s:71:"Symfony/Bridge/Doctrine/Tests/DataFixtures/ContainerAwareLoaderTest.php";a:4:{s:6:"md5sum";s:32:"317c03bfcf9de63ddb87b75b5219b0e1";s:4:"name";s:71:"Symfony/Bridge/Doctrine/Tests/DataFixtures/ContainerAwareLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DataFixtures/ContainerAwareLoaderTest.php";}s:111:"Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php";a:4:{s:6:"md5sum";s:32:"6b953b8a87ad83b1fa9ca6c5b44b28e5";s:4:"name";s:111:"Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:161:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php";}s:53:"Symfony/Bridge/Doctrine/Tests/DoctrineOrmTestCase.php";a:4:{s:6:"md5sum";s:32:"cbab10b2d43dd63dc2b6c4afd2e3ba50";s:4:"name";s:53:"Symfony/Bridge/Doctrine/Tests/DoctrineOrmTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DoctrineOrmTestCase.php";}s:76:"Symfony/Bridge/Doctrine/Tests/ExpressionLanguage/DoctrineParserCacheTest.php";a:4:{s:6:"md5sum";s:32:"91879a9d73006a12ffc8c62d83ac857c";s:4:"name";s:76:"Symfony/Bridge/Doctrine/Tests/ExpressionLanguage/DoctrineParserCacheTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/ExpressionLanguage/DoctrineParserCacheTest.php";}s:60:"Symfony/Bridge/Doctrine/Tests/Fixtures/AssociationEntity.php";a:4:{s:6:"md5sum";s:32:"237107a72edb5333186c85275ac35e1c";s:4:"name";s:60:"Symfony/Bridge/Doctrine/Tests/Fixtures/AssociationEntity.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/AssociationEntity.php";}s:63:"Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeIntIdEntity.php";a:4:{s:6:"md5sum";s:32:"d4361cc34fb44804debe2ec8e0e832f8";s:4:"name";s:63:"Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeIntIdEntity.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeIntIdEntity.php";}s:66:"Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeStringIdEntity.php";a:4:{s:6:"md5sum";s:32:"73b3184c3b0a6bfc68db74c507f1ff7c";s:4:"name";s:66:"Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeStringIdEntity.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeStringIdEntity.php";}s:64:"Symfony/Bridge/Doctrine/Tests/Fixtures/ContainerAwareFixture.php";a:4:{s:6:"md5sum";s:32:"b8db7e5383a0e848cc8f60964d12d350";s:4:"name";s:64:"Symfony/Bridge/Doctrine/Tests/Fixtures/ContainerAwareFixture.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/ContainerAwareFixture.php";}s:59:"Symfony/Bridge/Doctrine/Tests/Fixtures/DoubleNameEntity.php";a:4:{s:6:"md5sum";s:32:"e4cd9ce9c40b8e76edb083fc526bcd44";s:4:"name";s:59:"Symfony/Bridge/Doctrine/Tests/Fixtures/DoubleNameEntity.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/DoubleNameEntity.php";}s:58:"Symfony/Bridge/Doctrine/Tests/Fixtures/GroupableEntity.php";a:4:{s:6:"md5sum";s:32:"2325d0c65a178f8bfddcf0a76e53cb00";s:4:"name";s:58:"Symfony/Bridge/Doctrine/Tests/Fixtures/GroupableEntity.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/GroupableEntity.php";}s:60:"Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntity.php";a:4:{s:6:"md5sum";s:32:"01edea44eacb41bdeb553b9445bd2b53";s:4:"name";s:60:"Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntity.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntity.php";}s:70:"Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdNoToStringEntity.php";a:4:{s:6:"md5sum";s:32:"c13f44c8fccf2a768c1dfe09cdcf644c";s:4:"name";s:70:"Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdNoToStringEntity.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdNoToStringEntity.php";}s:63:"Symfony/Bridge/Doctrine/Tests/Fixtures/SingleStringIdEntity.php";a:4:{s:6:"md5sum";s:32:"f3044b3a9be916f4b6433cd993933d4b";s:4:"name";s:63:"Symfony/Bridge/Doctrine/Tests/Fixtures/SingleStringIdEntity.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleStringIdEntity.php";}s:47:"Symfony/Bridge/Doctrine/Tests/Fixtures/User.php";a:4:{s:6:"md5sum";s:32:"27921595ac59f8d35f99ea9b8a80474c";s:4:"name";s:47:"Symfony/Bridge/Doctrine/Tests/Fixtures/User.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/User.php";}s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListCompositeIdTest.php";a:4:{s:6:"md5sum";s:32:"62be3ca48dad09bc19de00a6133ae33c";s:4:"name";s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListCompositeIdTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:139:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListCompositeIdTest.php";}s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleIntIdTest.php";a:4:{s:6:"md5sum";s:32:"c53d2568937b7272b41253c169f1b990";s:4:"name";s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleIntIdTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:139:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleIntIdTest.php";}s:92:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleStringIdTest.php";a:4:{s:6:"md5sum";s:32:"696f31cf938c23921a506d3dc5b1bd3f";s:4:"name";s:92:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleStringIdTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:142:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleStringIdTest.php";}s:78:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListTest.php";a:4:{s:6:"md5sum";s:32:"e3002da166df138152291131d2563147";s:4:"name";s:78:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListTest.php";}s:77:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/GenericEntityChoiceListTest.php";a:4:{s:6:"md5sum";s:32:"ed38d6eebc677c1e49f92360dc968726";s:4:"name";s:77:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/GenericEntityChoiceListTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/GenericEntityChoiceListTest.php";}s:87:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListCompositeIdTest.php";a:4:{s:6:"md5sum";s:32:"53cb635842c3610fc376aa099a878cbb";s:4:"name";s:87:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListCompositeIdTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:137:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListCompositeIdTest.php";}s:87:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleIntIdTest.php";a:4:{s:6:"md5sum";s:32:"2e6faf750e515b875b39ef0f003d8b3d";s:4:"name";s:87:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleIntIdTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:137:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleIntIdTest.php";}s:90:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleStringIdTest.php";a:4:{s:6:"md5sum";s:32:"c8e9e517d8c3f0df5f28f2fb135164e9";s:4:"name";s:90:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleStringIdTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:140:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleStringIdTest.php";}s:75:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/ORMQueryBuilderLoaderTest.php";a:4:{s:6:"md5sum";s:32:"3f0f7533860351145dbb49b781cd9af9";s:4:"name";s:75:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/ORMQueryBuilderLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/ORMQueryBuilderLoaderTest.php";}s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdTest.php";a:4:{s:6:"md5sum";s:32:"978f11f0d52668cdf4c0f9777bfb8b72";s:4:"name";s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:139:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdTest.php";}s:105:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdWithQueryBuilderTest.php";a:4:{s:6:"md5sum";s:32:"300a5b1f88f5435bd0d2fef5d292a66f";s:4:"name";s:105:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdWithQueryBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:155:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdWithQueryBuilderTest.php";}s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdTest.php";a:4:{s:6:"md5sum";s:32:"484e207192fd43eb7badfc0f226df4fb";s:4:"name";s:89:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:139:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdTest.php";}s:105:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdWithQueryBuilderTest.php";a:4:{s:6:"md5sum";s:32:"657d384a368a05153a8d73dbf60da002";s:4:"name";s:105:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdWithQueryBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:155:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdWithQueryBuilderTest.php";}s:92:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdTest.php";a:4:{s:6:"md5sum";s:32:"315093405e4abafe143eb918ee7789cf";s:4:"name";s:92:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:142:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdTest.php";}s:108:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdWithQueryBuilderTest.php";a:4:{s:6:"md5sum";s:32:"fbff3030e3294a22d224256064aaec4f";s:4:"name";s:108:"Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdWithQueryBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:158:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdWithQueryBuilderTest.php";}s:87:"Symfony/Bridge/Doctrine/Tests/Form/DataTransformer/CollectionToArrayTransformerTest.php";a:4:{s:6:"md5sum";s:32:"ba4a60892ec0398da11b48b522615034";s:4:"name";s:87:"Symfony/Bridge/Doctrine/Tests/Form/DataTransformer/CollectionToArrayTransformerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:137:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/DataTransformer/CollectionToArrayTransformerTest.php";}s:65:"Symfony/Bridge/Doctrine/Tests/Form/DoctrineOrmTypeGuesserTest.php";a:4:{s:6:"md5sum";s:32:"4748628e6ff78737995c71507068c5f7";s:4:"name";s:65:"Symfony/Bridge/Doctrine/Tests/Form/DoctrineOrmTypeGuesserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/DoctrineOrmTypeGuesserTest.php";}s:69:"Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypePerformanceTest.php";a:4:{s:6:"md5sum";s:32:"5be318cfed40c93338f512e25f69da67";s:4:"name";s:69:"Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypePerformanceTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypePerformanceTest.php";}s:58:"Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php";a:4:{s:6:"md5sum";s:32:"b801ad3cbcc65d3883d8258894a5d326";s:4:"name";s:58:"Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php";}s:71:"Symfony/Bridge/Doctrine/Tests/HttpFoundation/DbalSessionHandlerTest.php";a:4:{s:6:"md5sum";s:32:"98f90ab5043368eb3d7848ef09fccb80";s:4:"name";s:71:"Symfony/Bridge/Doctrine/Tests/HttpFoundation/DbalSessionHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/HttpFoundation/DbalSessionHandlerTest.php";}s:55:"Symfony/Bridge/Doctrine/Tests/Logger/DbalLoggerTest.php";a:4:{s:6:"md5sum";s:32:"2feb485f27b025ee74707d55945fed91";s:4:"name";s:55:"Symfony/Bridge/Doctrine/Tests/Logger/DbalLoggerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Logger/DbalLoggerTest.php";}s:70:"Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php";a:4:{s:6:"md5sum";s:32:"56abcb81046969cf32a1c8b690790640";s:4:"name";s:70:"Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php";}s:75:"Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueValidatorTest.php";a:4:{s:6:"md5sum";s:32:"c1fd3987c9391a54ac76430fff7db778";s:4:"name";s:75:"Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueValidatorTest.php";}s:62:"Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.php";a:4:{s:6:"md5sum";s:32:"4403085a6acb5b72d6876c25374a01ee";s:4:"name";s:62:"Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.php";}s:71:"Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php";a:4:{s:6:"md5sum";s:32:"28ee255baf4b1e3a6d539f7e598ac2ca";s:4:"name";s:71:"Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php";}s:57:"Symfony/Bridge/Doctrine/Validator/DoctrineInitializer.php";a:4:{s:6:"md5sum";s:32:"c432d786fb2e4848b42aad6b61ff9fac";s:4:"name";s:57:"Symfony/Bridge/Doctrine/Validator/DoctrineInitializer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Validator/DoctrineInitializer.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:49:{s:53:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine";b:1;s:44:"/opt/alt/php54/usr/share/pear/Symfony/Bridge";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/CacheWarmer";b:1;s:72:"/opt/alt/php54/usr/share/doc/pear/DoctrineBridge/Symfony/Bridge/Doctrine";b:1;s:63:"/opt/alt/php54/usr/share/doc/pear/DoctrineBridge/Symfony/Bridge";b:1;s:56:"/opt/alt/php54/usr/share/doc/pear/DoctrineBridge/Symfony";b:1;s:48:"/opt/alt/php54/usr/share/doc/pear/DoctrineBridge";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DataCollector";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DataFixtures";b:1;s:73:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DependencyInjection";b:1;s:86:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass";b:1;s:95:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DependencyInjection/Security/UserProvider";b:1;s:82:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/DependencyInjection/Security";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/ExpressionLanguage";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/ChoiceList";b:1;s:58:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form";b:1;s:74:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/DataTransformer";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/EventListener";b:1;s:63:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Form/Type";b:1;s:68:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/HttpFoundation";b:1;s:60:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Logger";b:1;s:73:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine";b:1;s:64:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge";b:1;s:57:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony";b:1;s:49:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge";b:1;s:73:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Security/RememberMe";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Security";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Security/User";b:1;s:58:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Test";b:1;s:79:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests";b:1;s:93:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DataCollector";b:1;s:92:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DataFixtures";b:1;s:112:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass";b:1;s:99:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DependencyInjection";b:1;s:98:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/ExpressionLanguage";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures";b:1;s:95:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList";b:1;s:84:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form";b:1;s:100:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/DataTransformer";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/Type";b:1;s:94:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/HttpFoundation";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Logger";b:1;s:93:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Security/User";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Security";b:1;s:101:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Validator/Constraints";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Validator";b:1;s:75:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Validator/Constraints";b:1;s:63:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Doctrine/Validator";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:4:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:9:"Validator";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:3;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:4:"Form";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\������4pear/.registry/.channel.pear.symfony.com/console.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:7:"Console";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:26:"Symfony2 Console Component";s:11:"description";s:26:"Symfony2 Console Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:42";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:178:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d7fa5d3e678f32b207a275d566bd226b";s:4:"name";s:41:"Symfony/Component/Console/Application.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a67fcf08fe6f3092f954fdd247d138d8";s:4:"name";s:40:"Symfony/Component/Console/autoloader.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e2b61d6b18ded64f0686599db5c7fb5b";s:4:"name";s:38:"Symfony/Component/Console/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"80d4d8e858f5a83230701aed15e6f9ff";s:4:"name";s:45:"Symfony/Component/Console/Command/Command.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d10467979ea85e92951425fd351347ac";s:4:"name";s:49:"Symfony/Component/Console/Command/HelpCommand.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7f0bd50020e8b9c39d79692f3e32db8f";s:4:"name";s:49:"Symfony/Component/Console/Command/ListCommand.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9e146f5ae7085917809444efe2d868c6";s:4:"name";s:39:"Symfony/Component/Console/composer.json";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"10001de60b8e31092612e73dc02300d7";s:4:"name";s:43:"Symfony/Component/Console/ConsoleEvents.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e5ffa840297bdf9232762c38218846dc";s:4:"name";s:63:"Symfony/Component/Console/Descriptor/ApplicationDescription.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e08a534aa99b2e90d1538a0c166973e5";s:4:"name";s:51:"Symfony/Component/Console/Descriptor/Descriptor.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d5b9abe215ed28ac8ca7fe9d72fc9ddd";s:4:"name";s:60:"Symfony/Component/Console/Descriptor/DescriptorInterface.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a997223049fcf34294263e3a6c37e230";s:4:"name";s:55:"Symfony/Component/Console/Descriptor/JsonDescriptor.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bec9d13cc9cb6e778c4f4083199137b6";s:4:"name";s:59:"Symfony/Component/Console/Descriptor/MarkdownDescriptor.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"97b571928164645af31610ea97bc43fb";s:4:"name";s:55:"Symfony/Component/Console/Descriptor/TextDescriptor.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a9214dd6cf39faa121dc4de62996071a";s:4:"name";s:54:"Symfony/Component/Console/Descriptor/XmlDescriptor.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2832db2aee4207de5d53d012b314436d";s:4:"name";s:55:"Symfony/Component/Console/Event/ConsoleCommandEvent.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aaaa8c390cd99e01d7bb2649a735e469";s:4:"name";s:48:"Symfony/Component/Console/Event/ConsoleEvent.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"22e5c027468f33b0bd20540b41af7a74";s:4:"name";s:57:"Symfony/Component/Console/Event/ConsoleExceptionEvent.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"82fbfa586f39a859d66a45221cb773c1";s:4:"name";s:57:"Symfony/Component/Console/Event/ConsoleTerminateEvent.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"304b90bba47ad3ed5534a37ec1647980";s:4:"name";s:55:"Symfony/Component/Console/Formatter/OutputFormatter.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"75e7364468e427f080f86354f9bab9b9";s:4:"name";s:64:"Symfony/Component/Console/Formatter/OutputFormatterInterface.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4d0b8e5a84926a6013be77aa123e61eb";s:4:"name";s:60:"Symfony/Component/Console/Formatter/OutputFormatterStyle.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"091bf3ec019e14a48b1f61ef7cb6871a";s:4:"name";s:69:"Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"27952fd939968e3615ce7ada4c761e0e";s:4:"name";s:65:"Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d5bb73eb73014de416365c07cd81cac5";s:4:"name";s:53:"Symfony/Component/Console/Helper/DescriptorHelper.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ae0bb3641414453024a3d71275abd1c1";s:4:"name";s:49:"Symfony/Component/Console/Helper/DialogHelper.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86ebeb32b3353bc7ba4363bf7a05fa2f";s:4:"name";s:52:"Symfony/Component/Console/Helper/FormatterHelper.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"426298ce1ccd85ab527a5cef78f9a33b";s:4:"name";s:43:"Symfony/Component/Console/Helper/Helper.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e9012e6f3559129d513da4ba75ebf4e9";s:4:"name";s:52:"Symfony/Component/Console/Helper/HelperInterface.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9c0badab04f9b052cec6a06c3f11fb07";s:4:"name";s:46:"Symfony/Component/Console/Helper/HelperSet.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c75592e1f3b10c1f35961c50d55ae58d";s:4:"name";s:53:"Symfony/Component/Console/Helper/InputAwareHelper.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c6c85dbb2f08fa52bc6739ba6896bdc9";s:4:"name";s:51:"Symfony/Component/Console/Helper/ProgressHelper.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1671e0f028279a642e6c0f7dcaa474c4";s:4:"name";s:48:"Symfony/Component/Console/Helper/TableHelper.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e95b97c2b870d6223e84a995c93f16ce";s:4:"name";s:45:"Symfony/Component/Console/Input/ArgvInput.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1e51135fb1c605381452c4d0cae3f1c4";s:4:"name";s:46:"Symfony/Component/Console/Input/ArrayInput.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87ba519b169574bdcaabaef68740989a";s:4:"name";s:41:"Symfony/Component/Console/Input/Input.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2f88afd2a0f1601dcfd3cce07092197";s:4:"name";s:49:"Symfony/Component/Console/Input/InputArgument.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a67cb5e626983b20e2c03b618d7ab012";s:4:"name";s:55:"Symfony/Component/Console/Input/InputAwareInterface.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"74e92dce0c01082eb3d96959f3268509";s:4:"name";s:51:"Symfony/Component/Console/Input/InputDefinition.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9a40ecfaca79fa6bed0e459c035fdb5c";s:4:"name";s:50:"Symfony/Component/Console/Input/InputInterface.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2712657bb89ede768dfb9d0eb1f1d256";s:4:"name";s:47:"Symfony/Component/Console/Input/InputOption.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eaf496e1188492448d9cfe8dfbcede6a";s:4:"name";s:47:"Symfony/Component/Console/Input/StringInput.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:33:"Symfony/Component/Console/LICENSE";s:4:"role";s:3:"doc";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"07bca2bc77753b0b0cc4502f109c4a8e";s:4:"name";s:51:"Symfony/Component/Console/Output/BufferedOutput.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"64e00ce49a3a47e8ea7b8885f10c1ee6";s:4:"name";s:50:"Symfony/Component/Console/Output/ConsoleOutput.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9cf400160437ff90febb665841a968fe";s:4:"name";s:59:"Symfony/Component/Console/Output/ConsoleOutputInterface.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"561f460b93be0c27aa9be546af49e9ec";s:4:"name";s:47:"Symfony/Component/Console/Output/NullOutput.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"15c209a7581a632e6979d5441a02f241";s:4:"name";s:43:"Symfony/Component/Console/Output/Output.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ac6d776cf82c8b887395c54482f17bd7";s:4:"name";s:52:"Symfony/Component/Console/Output/OutputInterface.php";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dc57630f625779ad86f6f3d8240ad0c3";s:4:"name";s:49:"Symfony/Component/Console/Output/StreamOutput.php";s:4:"role";s:3:"php";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c94fc23909e8f1d27908cd0486653611";s:4:"name";s:42:"Symfony/Component/Console/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"70a92aecafcdc1f689a2a798acccefe4";s:4:"name";s:35:"Symfony/Component/Console/README.md";s:4:"role";s:3:"doc";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3613d8d83b78ce3561680a447eb6a24a";s:4:"name";s:55:"Symfony/Component/Console/Resources/bin/hiddeninput.exe";s:4:"role";s:3:"php";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fedc847f6c992a242e45a167b0cf1866";s:4:"name";s:35:"Symfony/Component/Console/Shell.php";s:4:"role";s:3:"php";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f2c7b88716f13cb54825a933832a74a8";s:4:"name";s:54:"Symfony/Component/Console/Tester/ApplicationTester.php";s:4:"role";s:3:"php";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9b7bf197b61b1b3c23772c57a2ec3ee5";s:4:"name";s:50:"Symfony/Component/Console/Tester/CommandTester.php";s:4:"role";s:3:"php";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4113e99075832dfdf616eb1d40466b5f";s:4:"name";s:51:"Symfony/Component/Console/Tests/ApplicationTest.php";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"95ad26aa722775521f90d097b79d23b7";s:4:"name";s:55:"Symfony/Component/Console/Tests/Command/CommandTest.php";s:4:"role";s:4:"test";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e8f9a01b23091cef3ed6346feaf38b9c";s:4:"name";s:59:"Symfony/Component/Console/Tests/Command/HelpCommandTest.php";s:4:"role";s:4:"test";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e7562df5cc8110fb5a6e44cbc39a7c03";s:4:"name";s:59:"Symfony/Component/Console/Tests/Command/ListCommandTest.php";s:4:"role";s:4:"test";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"531b8d11ed5d639162a8cbc8c1b7fe53";s:4:"name";s:69:"Symfony/Component/Console/Tests/Descriptor/AbstractDescriptorTest.php";s:4:"role";s:4:"test";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8b6ccffc99cb2ffea82e6e65171dc329";s:4:"name";s:65:"Symfony/Component/Console/Tests/Descriptor/JsonDescriptorTest.php";s:4:"role";s:4:"test";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0738e024a2a5fd48f033acec21ebe484";s:4:"name";s:69:"Symfony/Component/Console/Tests/Descriptor/MarkdownDescriptorTest.php";s:4:"role";s:4:"test";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e364df76cc57c1a8221422eac8425501";s:4:"name";s:62:"Symfony/Component/Console/Tests/Descriptor/ObjectsProvider.php";s:4:"role";s:4:"test";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a5a110579ab493bc21572ec836e8b94e";s:4:"name";s:65:"Symfony/Component/Console/Tests/Descriptor/TextDescriptorTest.php";s:4:"role";s:4:"test";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aa6b0e47cc2693587024ee3d9b2efc6c";s:4:"name";s:64:"Symfony/Component/Console/Tests/Descriptor/XmlDescriptorTest.php";s:4:"role";s:4:"test";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea331a512e8c0d80230ff1f7b1254316";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/application_1.json";s:4:"role";s:4:"test";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2e34db40b7841a8df627415fd72762df";s:4:"name";s:57:"Symfony/Component/Console/Tests/Fixtures/application_1.md";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3d936937d3bcf607fc54faad2558a453";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/application_1.txt";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d819500ef4e850b75c623682dc38c900";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/application_1.xml";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c461b890d0d7849cfb5eb5bbbc113e66";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/application_2.json";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fd2188a4c78bd7bc1a3778a0af6311c5";s:4:"name";s:57:"Symfony/Component/Console/Tests/Fixtures/application_2.md";s:4:"role";s:4:"test";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d66df90611c1e4fc0161d4307d18ece1";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/application_2.txt";s:4:"role";s:4:"test";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d9d7ea7073a523ad2a07ae345b22316f";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/application_2.xml";s:4:"role";s:4:"test";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b40b7c5e2ce450d92801ad9f5420ea77";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/application_astext1.txt";s:4:"role";s:4:"test";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"345da50027f0969cf6b362f3f9088186";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/application_astext2.txt";s:4:"role";s:4:"test";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"507250131eb057d025531c669a4aab19";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/application_asxml1.txt";s:4:"role";s:4:"test";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fd7e97279731abc448a7577095054ca8";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/application_asxml2.txt";s:4:"role";s:4:"test";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aa0a9b41081ebab06350041597bd4542";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/application_gethelp.txt";s:4:"role";s:4:"test";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"977a66011fcade49927bb6ac41477792";s:4:"name";s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception1.txt";s:4:"role";s:4:"test";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"38d86d41d4fb194a695eaddfe2a8d2df";s:4:"name";s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception2.txt";s:4:"role";s:4:"test";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"711b8a7b6ec59bb13332c79763666e14";s:4:"name";s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception3.txt";s:4:"role";s:4:"test";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"037657ca60cd7c8ff945ce145684aec6";s:4:"name";s:82:"Symfony/Component/Console/Tests/Fixtures/application_renderexception3decorated.txt";s:4:"role";s:4:"test";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0b5b31d2023ae8ec6e2eef0e08e0400c";s:4:"name";s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception4.txt";s:4:"role";s:4:"test";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47745f267210a2e2fb9860082194efd2";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/application_run1.txt";s:4:"role";s:4:"test";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ff916ea07ab6a3777814eafa148c9c34";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/application_run2.txt";s:4:"role";s:4:"test";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e1651d791eebaeed9a568412fe433ce2";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/application_run3.txt";s:4:"role";s:4:"test";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c7759de3fcd0263d72d1fad2390dc914";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/application_run4.txt";s:4:"role";s:4:"test";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5bb7afd8d7266c4b53acdd0ba4bc87ce";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/BarBucCommand.php";s:4:"role";s:4:"test";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8464fa011bb28109fd087727f1216458";s:4:"name";s:55:"Symfony/Component/Console/Tests/Fixtures/command_1.json";s:4:"role";s:4:"test";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"44b8f270513ba511d0d971b52b2396d6";s:4:"name";s:53:"Symfony/Component/Console/Tests/Fixtures/command_1.md";s:4:"role";s:4:"test";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"40f52be95eb599167faf4fb1382e93e7";s:4:"name";s:54:"Symfony/Component/Console/Tests/Fixtures/command_1.txt";s:4:"role";s:4:"test";}}i:92;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d4a21bb6906c17693a2cf2d990f17441";s:4:"name";s:54:"Symfony/Component/Console/Tests/Fixtures/command_1.xml";s:4:"role";s:4:"test";}}i:93;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8ff624584c774ae83144627314d66587";s:4:"name";s:55:"Symfony/Component/Console/Tests/Fixtures/command_2.json";s:4:"role";s:4:"test";}}i:94;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"65763c3a87b5e2a625fdd143edaf03fe";s:4:"name";s:53:"Symfony/Component/Console/Tests/Fixtures/command_2.md";s:4:"role";s:4:"test";}}i:95;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5680ffddd8fc44a29d0ea39f9ab09906";s:4:"name";s:54:"Symfony/Component/Console/Tests/Fixtures/command_2.txt";s:4:"role";s:4:"test";}}i:96;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8cac2b7fac663f8d0fd15c22f1160981";s:4:"name";s:54:"Symfony/Component/Console/Tests/Fixtures/command_2.xml";s:4:"role";s:4:"test";}}i:97;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ac50a755a5dcf9dbbf7d03564c134b5c";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/command_astext.txt";s:4:"role";s:4:"test";}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d94936284533d2495f2eb207fa02e232";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/command_asxml.txt";s:4:"role";s:4:"test";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6a54005ec1a08c1a7f9d7b098dec09f3";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/definition_astext.txt";s:4:"role";s:4:"test";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"205994db49721172eac27b69ff37ec4f";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/definition_asxml.txt";s:4:"role";s:4:"test";}}i:101;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cb827ac9aecc15b6592f8c153317b31d";s:4:"name";s:67:"Symfony/Component/Console/Tests/Fixtures/DescriptorApplication1.php";s:4:"role";s:4:"test";}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d929bab60eb3fd020e15b45a3c54d168";s:4:"name";s:67:"Symfony/Component/Console/Tests/Fixtures/DescriptorApplication2.php";s:4:"role";s:4:"test";}}i:103;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"50c23e03725ffd75f65d76b07e71887a";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/DescriptorCommand1.php";s:4:"role";s:4:"test";}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8cc36b0c8be8ac7db7897d5ac4eee699";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/DescriptorCommand2.php";s:4:"role";s:4:"test";}}i:105;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df52584a64822a983eb5d927acedb8c1";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/Foo1Command.php";s:4:"role";s:4:"test";}}i:106;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cf36c22795c10c04984b683ff3f1fe79";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/Foo2Command.php";s:4:"role";s:4:"test";}}i:107;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"14ec4962d6e9d9be56dbb5a90f1c01bc";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/Foo3Command.php";s:4:"role";s:4:"test";}}i:108;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a747ae989c89cbff1df48d301d69ff9a";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/Foo4Command.php";s:4:"role";s:4:"test";}}i:109;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ab33a181019dd14b892e920906a83e41";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/Foo5Command.php";s:4:"role";s:4:"test";}}i:110;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c409f073d1a760445d7c692bf6668848";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/FoobarCommand.php";s:4:"role";s:4:"test";}}i:111;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"45276372456804d1c3cc11c30e1e26e4";s:4:"name";s:55:"Symfony/Component/Console/Tests/Fixtures/FooCommand.php";s:4:"role";s:4:"test";}}i:112;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"87e6eeef0f89e57d691ca8a35bb91e12";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.json";s:4:"role";s:4:"test";}}i:113;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f51385902d2eb98e5c7236b26f720741";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.md";s:4:"role";s:4:"test";}}i:114;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"49ec5d491a17d9f6c93e3b6194757de0";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.txt";s:4:"role";s:4:"test";}}i:115;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0c308f004edf7c0b6aaec03f028e8747";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.xml";s:4:"role";s:4:"test";}}i:116;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7b189366871c1bb8b146087dcc1b20cf";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.json";s:4:"role";s:4:"test";}}i:117;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3f2fd328c9393a8ede70602631d68c9f";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.md";s:4:"role";s:4:"test";}}i:118;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c4567546600e6c71ee236a870b9a5d16";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.txt";s:4:"role";s:4:"test";}}i:119;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"57a965ef131103e13d8befdb1a0e8465";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.xml";s:4:"role";s:4:"test";}}i:120;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eacb43809707dd26dcb8a0c34f1cd337";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.json";s:4:"role";s:4:"test";}}i:121;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"92b02b5435642c4f31ccc943b751c30e";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.md";s:4:"role";s:4:"test";}}i:122;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e512053db481dbd2ac228f790e4a5c31";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.txt";s:4:"role";s:4:"test";}}i:123;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4b5eacb65951dd1047832992de231669";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.xml";s:4:"role";s:4:"test";}}i:124;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6b6cd5a30b7f04a27b3615fcb66fbb60";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.json";s:4:"role";s:4:"test";}}i:125;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.md";s:4:"role";s:4:"test";}}i:126;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.txt";s:4:"role";s:4:"test";}}i:127;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d1ccbc21759a3a9fbf5c8540d9083f47";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.xml";s:4:"role";s:4:"test";}}i:128;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"96c29539ac20c5289ce924a2b53e0a74";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.json";s:4:"role";s:4:"test";}}i:129;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"65e283e532971f65a0531cef86ec1ff7";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.md";s:4:"role";s:4:"test";}}i:130;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63bc1a5ff3064f65a2acd1f3fe791164";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.txt";s:4:"role";s:4:"test";}}i:131;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a856c4c0e7a21895a75fccd1f7ad9652";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.xml";s:4:"role";s:4:"test";}}i:132;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e3e2853d5735de1d839b7378cea925f6";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.json";s:4:"role";s:4:"test";}}i:133;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cf4db1e7e783877fedcc11f228f057f7";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.md";s:4:"role";s:4:"test";}}i:134;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6517879eab6c613d4ccc9e8f11dc00cc";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.txt";s:4:"role";s:4:"test";}}i:135;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cf9890033c9b3296c3f0a84ad7a40f26";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.xml";s:4:"role";s:4:"test";}}i:136;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a0d3b5beb936e28bcfa0b2a09038e477";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.json";s:4:"role";s:4:"test";}}i:137;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"55bdf86d23a2c802d4c7d36922a16cc8";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.md";s:4:"role";s:4:"test";}}i:138;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6a351cab07e83967475ce418f11389c9";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.txt";s:4:"role";s:4:"test";}}i:139;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"732625b8bef91e2b6e5e42b135714673";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.xml";s:4:"role";s:4:"test";}}i:140;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"275c5ca8fae2603962435abee86abc22";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_1.json";s:4:"role";s:4:"test";}}i:141;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2f3b3fce4e6cc97d37c2cdf2a8545a17";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_1.md";s:4:"role";s:4:"test";}}i:142;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7c446b0b7764679b0675e2bf7c15d5ef";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_1.txt";s:4:"role";s:4:"test";}}i:143;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2441944e792817317e54ca3e6bf3478a";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_1.xml";s:4:"role";s:4:"test";}}i:144;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8ad4b5bb7f68b81ac5baf6f86c54f216";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_2.json";s:4:"role";s:4:"test";}}i:145;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"febad80dc8502990d7631dfa7e710725";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_2.md";s:4:"role";s:4:"test";}}i:146;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4cebdddb6ee8776268fe824f5ebc8b14";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_2.txt";s:4:"role";s:4:"test";}}i:147;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ad9f550cbdd67e7bda7bfb78ebbc4d57";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_2.xml";s:4:"role";s:4:"test";}}i:148;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2eb676e70f06dff589fc461b96da5c61";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_3.json";s:4:"role";s:4:"test";}}i:149;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"03a09ae47b81986ec50edd6608fa2426";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_3.md";s:4:"role";s:4:"test";}}i:150;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7eada46556b0ce341069f353b063e45e";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_3.txt";s:4:"role";s:4:"test";}}i:151;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8c91b697596ccf87b48c58ecbae02aa6";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_3.xml";s:4:"role";s:4:"test";}}i:152;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"20c72909569d5ec92465f7c7dc002381";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_4.json";s:4:"role";s:4:"test";}}i:153;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4b02ffc507306a9d887e73d2fca429ba";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_4.md";s:4:"role";s:4:"test";}}i:154;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7d49ce52263e22bbdd37e687455478ea";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_4.txt";s:4:"role";s:4:"test";}}i:155;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"960e79c93c46361c3bd250b5fe73d25b";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_4.xml";s:4:"role";s:4:"test";}}i:156;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cdfd10039b833b3d0cd4bc946d6d0e52";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/TestCommand.php";s:4:"role";s:4:"test";}}i:157;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d65f80f685c098367d357b79b1085660";s:4:"name";s:75:"Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleStackTest.php";s:4:"role";s:4:"test";}}i:158;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"772ad7157614e0a3336b0e79bfd8c018";s:4:"name";s:70:"Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php";s:4:"role";s:4:"test";}}i:159;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1932fadfa3ba33810457dc7c7caf4200";s:4:"name";s:65:"Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php";s:4:"role";s:4:"test";}}i:160;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c080187a3a540acbd38ea4e72e197073";s:4:"name";s:59:"Symfony/Component/Console/Tests/Helper/DialogHelperTest.php";s:4:"role";s:4:"test";}}i:161;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"caffe5a35cfde20acff28a1b2ede9523";s:4:"name";s:62:"Symfony/Component/Console/Tests/Helper/FormatterHelperTest.php";s:4:"role";s:4:"test";}}i:162;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0c4b855c7ad31b88262a32f083903d5b";s:4:"name";s:56:"Symfony/Component/Console/Tests/Helper/HelperSetTest.php";s:4:"role";s:4:"test";}}i:163;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d460c56a019e5bfd59f1d2d91970812";s:4:"name";s:61:"Symfony/Component/Console/Tests/Helper/ProgressHelperTest.php";s:4:"role";s:4:"test";}}i:164;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7c598e6ffdbd3c17865a4c54cbe34c78";s:4:"name";s:58:"Symfony/Component/Console/Tests/Helper/TableHelperTest.php";s:4:"role";s:4:"test";}}i:165;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2d5b2e942330756fcbc30062e9007f1e";s:4:"name";s:55:"Symfony/Component/Console/Tests/Input/ArgvInputTest.php";s:4:"role";s:4:"test";}}i:166;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a90b8bafe8ede004c6ed61ecc8224a3f";s:4:"name";s:56:"Symfony/Component/Console/Tests/Input/ArrayInputTest.php";s:4:"role";s:4:"test";}}i:167;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7fe249cea32fc176d04f2520a018bdd8";s:4:"name";s:59:"Symfony/Component/Console/Tests/Input/InputArgumentTest.php";s:4:"role";s:4:"test";}}i:168;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"debb5202554762ad79bbd9353fcd04b7";s:4:"name";s:61:"Symfony/Component/Console/Tests/Input/InputDefinitionTest.php";s:4:"role";s:4:"test";}}i:169;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b6f2af5b4b79ed25113742022e86c77a";s:4:"name";s:57:"Symfony/Component/Console/Tests/Input/InputOptionTest.php";s:4:"role";s:4:"test";}}i:170;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f9129bb377ebb93a88cfcc97795055ff";s:4:"name";s:51:"Symfony/Component/Console/Tests/Input/InputTest.php";s:4:"role";s:4:"test";}}i:171;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6d3e24ab1bdf3f1048c89aded3fdfc42";s:4:"name";s:57:"Symfony/Component/Console/Tests/Input/StringInputTest.php";s:4:"role";s:4:"test";}}i:172;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5f42c7a490159ffee9e4d44297f6cbb0";s:4:"name";s:60:"Symfony/Component/Console/Tests/Output/ConsoleOutputTest.php";s:4:"role";s:4:"test";}}i:173;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b663167dfed0b653e8bc70890b8d417";s:4:"name";s:57:"Symfony/Component/Console/Tests/Output/NullOutputTest.php";s:4:"role";s:4:"test";}}i:174;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eb5d8d732894bc94242983e61d9ea828";s:4:"name";s:53:"Symfony/Component/Console/Tests/Output/OutputTest.php";s:4:"role";s:4:"test";}}i:175;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d9e51b68858e010abf7c9856411f9f3e";s:4:"name";s:59:"Symfony/Component/Console/Tests/Output/StreamOutputTest.php";s:4:"role";s:4:"test";}}i:176;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ed2c4ba2123801176abd8f7b15cfce2e";s:4:"name";s:64:"Symfony/Component/Console/Tests/Tester/ApplicationTesterTest.php";s:4:"role";s:4:"test";}}i:177;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dc805845c9fb25bf57604fda8b19c86d";s:4:"name";s:60:"Symfony/Component/Console/Tests/Tester/CommandTesterTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:178:{s:41:"Symfony/Component/Console/Application.php";a:4:{s:6:"md5sum";s:32:"d7fa5d3e678f32b207a275d566bd226b";s:4:"name";s:41:"Symfony/Component/Console/Application.php";s:4:"role";s:3:"php";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Application.php";}s:40:"Symfony/Component/Console/autoloader.php";a:4:{s:6:"md5sum";s:32:"a67fcf08fe6f3092f954fdd247d138d8";s:4:"name";s:40:"Symfony/Component/Console/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/autoloader.php";}s:38:"Symfony/Component/Console/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"e2b61d6b18ded64f0686599db5c7fb5b";s:4:"name";s:38:"Symfony/Component/Console/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/doc/pear/Console/Symfony/Component/Console/CHANGELOG.md";}s:45:"Symfony/Component/Console/Command/Command.php";a:4:{s:6:"md5sum";s:32:"80d4d8e858f5a83230701aed15e6f9ff";s:4:"name";s:45:"Symfony/Component/Console/Command/Command.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Command/Command.php";}s:49:"Symfony/Component/Console/Command/HelpCommand.php";a:4:{s:6:"md5sum";s:32:"d10467979ea85e92951425fd351347ac";s:4:"name";s:49:"Symfony/Component/Console/Command/HelpCommand.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Command/HelpCommand.php";}s:49:"Symfony/Component/Console/Command/ListCommand.php";a:4:{s:6:"md5sum";s:32:"7f0bd50020e8b9c39d79692f3e32db8f";s:4:"name";s:49:"Symfony/Component/Console/Command/ListCommand.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Command/ListCommand.php";}s:39:"Symfony/Component/Console/composer.json";a:4:{s:6:"md5sum";s:32:"9e146f5ae7085917809444efe2d868c6";s:4:"name";s:39:"Symfony/Component/Console/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/Console/Symfony/Component/Console/composer.json";}s:43:"Symfony/Component/Console/ConsoleEvents.php";a:4:{s:6:"md5sum";s:32:"10001de60b8e31092612e73dc02300d7";s:4:"name";s:43:"Symfony/Component/Console/ConsoleEvents.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/ConsoleEvents.php";}s:63:"Symfony/Component/Console/Descriptor/ApplicationDescription.php";a:4:{s:6:"md5sum";s:32:"e5ffa840297bdf9232762c38218846dc";s:4:"name";s:63:"Symfony/Component/Console/Descriptor/ApplicationDescription.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Descriptor/ApplicationDescription.php";}s:51:"Symfony/Component/Console/Descriptor/Descriptor.php";a:4:{s:6:"md5sum";s:32:"e08a534aa99b2e90d1538a0c166973e5";s:4:"name";s:51:"Symfony/Component/Console/Descriptor/Descriptor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Descriptor/Descriptor.php";}s:60:"Symfony/Component/Console/Descriptor/DescriptorInterface.php";a:4:{s:6:"md5sum";s:32:"d5b9abe215ed28ac8ca7fe9d72fc9ddd";s:4:"name";s:60:"Symfony/Component/Console/Descriptor/DescriptorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Descriptor/DescriptorInterface.php";}s:55:"Symfony/Component/Console/Descriptor/JsonDescriptor.php";a:4:{s:6:"md5sum";s:32:"a997223049fcf34294263e3a6c37e230";s:4:"name";s:55:"Symfony/Component/Console/Descriptor/JsonDescriptor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Descriptor/JsonDescriptor.php";}s:59:"Symfony/Component/Console/Descriptor/MarkdownDescriptor.php";a:4:{s:6:"md5sum";s:32:"bec9d13cc9cb6e778c4f4083199137b6";s:4:"name";s:59:"Symfony/Component/Console/Descriptor/MarkdownDescriptor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Descriptor/MarkdownDescriptor.php";}s:55:"Symfony/Component/Console/Descriptor/TextDescriptor.php";a:4:{s:6:"md5sum";s:32:"97b571928164645af31610ea97bc43fb";s:4:"name";s:55:"Symfony/Component/Console/Descriptor/TextDescriptor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Descriptor/TextDescriptor.php";}s:54:"Symfony/Component/Console/Descriptor/XmlDescriptor.php";a:4:{s:6:"md5sum";s:32:"a9214dd6cf39faa121dc4de62996071a";s:4:"name";s:54:"Symfony/Component/Console/Descriptor/XmlDescriptor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Descriptor/XmlDescriptor.php";}s:55:"Symfony/Component/Console/Event/ConsoleCommandEvent.php";a:4:{s:6:"md5sum";s:32:"2832db2aee4207de5d53d012b314436d";s:4:"name";s:55:"Symfony/Component/Console/Event/ConsoleCommandEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Event/ConsoleCommandEvent.php";}s:48:"Symfony/Component/Console/Event/ConsoleEvent.php";a:4:{s:6:"md5sum";s:32:"aaaa8c390cd99e01d7bb2649a735e469";s:4:"name";s:48:"Symfony/Component/Console/Event/ConsoleEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Event/ConsoleEvent.php";}s:57:"Symfony/Component/Console/Event/ConsoleExceptionEvent.php";a:4:{s:6:"md5sum";s:32:"22e5c027468f33b0bd20540b41af7a74";s:4:"name";s:57:"Symfony/Component/Console/Event/ConsoleExceptionEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Event/ConsoleExceptionEvent.php";}s:57:"Symfony/Component/Console/Event/ConsoleTerminateEvent.php";a:4:{s:6:"md5sum";s:32:"82fbfa586f39a859d66a45221cb773c1";s:4:"name";s:57:"Symfony/Component/Console/Event/ConsoleTerminateEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Event/ConsoleTerminateEvent.php";}s:55:"Symfony/Component/Console/Formatter/OutputFormatter.php";a:4:{s:6:"md5sum";s:32:"304b90bba47ad3ed5534a37ec1647980";s:4:"name";s:55:"Symfony/Component/Console/Formatter/OutputFormatter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Formatter/OutputFormatter.php";}s:64:"Symfony/Component/Console/Formatter/OutputFormatterInterface.php";a:4:{s:6:"md5sum";s:32:"75e7364468e427f080f86354f9bab9b9";s:4:"name";s:64:"Symfony/Component/Console/Formatter/OutputFormatterInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Formatter/OutputFormatterInterface.php";}s:60:"Symfony/Component/Console/Formatter/OutputFormatterStyle.php";a:4:{s:6:"md5sum";s:32:"4d0b8e5a84926a6013be77aa123e61eb";s:4:"name";s:60:"Symfony/Component/Console/Formatter/OutputFormatterStyle.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Formatter/OutputFormatterStyle.php";}s:69:"Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php";a:4:{s:6:"md5sum";s:32:"091bf3ec019e14a48b1f61ef7cb6871a";s:4:"name";s:69:"Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php";}s:65:"Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php";a:4:{s:6:"md5sum";s:32:"27952fd939968e3615ce7ada4c761e0e";s:4:"name";s:65:"Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php";}s:53:"Symfony/Component/Console/Helper/DescriptorHelper.php";a:4:{s:6:"md5sum";s:32:"d5bb73eb73014de416365c07cd81cac5";s:4:"name";s:53:"Symfony/Component/Console/Helper/DescriptorHelper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Helper/DescriptorHelper.php";}s:49:"Symfony/Component/Console/Helper/DialogHelper.php";a:4:{s:6:"md5sum";s:32:"ae0bb3641414453024a3d71275abd1c1";s:4:"name";s:49:"Symfony/Component/Console/Helper/DialogHelper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Helper/DialogHelper.php";}s:52:"Symfony/Component/Console/Helper/FormatterHelper.php";a:4:{s:6:"md5sum";s:32:"86ebeb32b3353bc7ba4363bf7a05fa2f";s:4:"name";s:52:"Symfony/Component/Console/Helper/FormatterHelper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Helper/FormatterHelper.php";}s:43:"Symfony/Component/Console/Helper/Helper.php";a:4:{s:6:"md5sum";s:32:"426298ce1ccd85ab527a5cef78f9a33b";s:4:"name";s:43:"Symfony/Component/Console/Helper/Helper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Helper/Helper.php";}s:52:"Symfony/Component/Console/Helper/HelperInterface.php";a:4:{s:6:"md5sum";s:32:"e9012e6f3559129d513da4ba75ebf4e9";s:4:"name";s:52:"Symfony/Component/Console/Helper/HelperInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Helper/HelperInterface.php";}s:46:"Symfony/Component/Console/Helper/HelperSet.php";a:4:{s:6:"md5sum";s:32:"9c0badab04f9b052cec6a06c3f11fb07";s:4:"name";s:46:"Symfony/Component/Console/Helper/HelperSet.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Helper/HelperSet.php";}s:53:"Symfony/Component/Console/Helper/InputAwareHelper.php";a:4:{s:6:"md5sum";s:32:"c75592e1f3b10c1f35961c50d55ae58d";s:4:"name";s:53:"Symfony/Component/Console/Helper/InputAwareHelper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Helper/InputAwareHelper.php";}s:51:"Symfony/Component/Console/Helper/ProgressHelper.php";a:4:{s:6:"md5sum";s:32:"c6c85dbb2f08fa52bc6739ba6896bdc9";s:4:"name";s:51:"Symfony/Component/Console/Helper/ProgressHelper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Helper/ProgressHelper.php";}s:48:"Symfony/Component/Console/Helper/TableHelper.php";a:4:{s:6:"md5sum";s:32:"1671e0f028279a642e6c0f7dcaa474c4";s:4:"name";s:48:"Symfony/Component/Console/Helper/TableHelper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Helper/TableHelper.php";}s:45:"Symfony/Component/Console/Input/ArgvInput.php";a:4:{s:6:"md5sum";s:32:"e95b97c2b870d6223e84a995c93f16ce";s:4:"name";s:45:"Symfony/Component/Console/Input/ArgvInput.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Input/ArgvInput.php";}s:46:"Symfony/Component/Console/Input/ArrayInput.php";a:4:{s:6:"md5sum";s:32:"1e51135fb1c605381452c4d0cae3f1c4";s:4:"name";s:46:"Symfony/Component/Console/Input/ArrayInput.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Input/ArrayInput.php";}s:41:"Symfony/Component/Console/Input/Input.php";a:4:{s:6:"md5sum";s:32:"87ba519b169574bdcaabaef68740989a";s:4:"name";s:41:"Symfony/Component/Console/Input/Input.php";s:4:"role";s:3:"php";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Input/Input.php";}s:49:"Symfony/Component/Console/Input/InputArgument.php";a:4:{s:6:"md5sum";s:32:"c2f88afd2a0f1601dcfd3cce07092197";s:4:"name";s:49:"Symfony/Component/Console/Input/InputArgument.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Input/InputArgument.php";}s:55:"Symfony/Component/Console/Input/InputAwareInterface.php";a:4:{s:6:"md5sum";s:32:"a67cb5e626983b20e2c03b618d7ab012";s:4:"name";s:55:"Symfony/Component/Console/Input/InputAwareInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Input/InputAwareInterface.php";}s:51:"Symfony/Component/Console/Input/InputDefinition.php";a:4:{s:6:"md5sum";s:32:"74e92dce0c01082eb3d96959f3268509";s:4:"name";s:51:"Symfony/Component/Console/Input/InputDefinition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Input/InputDefinition.php";}s:50:"Symfony/Component/Console/Input/InputInterface.php";a:4:{s:6:"md5sum";s:32:"9a40ecfaca79fa6bed0e459c035fdb5c";s:4:"name";s:50:"Symfony/Component/Console/Input/InputInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Input/InputInterface.php";}s:47:"Symfony/Component/Console/Input/InputOption.php";a:4:{s:6:"md5sum";s:32:"2712657bb89ede768dfb9d0eb1f1d256";s:4:"name";s:47:"Symfony/Component/Console/Input/InputOption.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Input/InputOption.php";}s:47:"Symfony/Component/Console/Input/StringInput.php";a:4:{s:6:"md5sum";s:32:"eaf496e1188492448d9cfe8dfbcede6a";s:4:"name";s:47:"Symfony/Component/Console/Input/StringInput.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Input/StringInput.php";}s:33:"Symfony/Component/Console/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:33:"Symfony/Component/Console/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/doc/pear/Console/Symfony/Component/Console/LICENSE";}s:51:"Symfony/Component/Console/Output/BufferedOutput.php";a:4:{s:6:"md5sum";s:32:"07bca2bc77753b0b0cc4502f109c4a8e";s:4:"name";s:51:"Symfony/Component/Console/Output/BufferedOutput.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Output/BufferedOutput.php";}s:50:"Symfony/Component/Console/Output/ConsoleOutput.php";a:4:{s:6:"md5sum";s:32:"64e00ce49a3a47e8ea7b8885f10c1ee6";s:4:"name";s:50:"Symfony/Component/Console/Output/ConsoleOutput.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Output/ConsoleOutput.php";}s:59:"Symfony/Component/Console/Output/ConsoleOutputInterface.php";a:4:{s:6:"md5sum";s:32:"9cf400160437ff90febb665841a968fe";s:4:"name";s:59:"Symfony/Component/Console/Output/ConsoleOutputInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Output/ConsoleOutputInterface.php";}s:47:"Symfony/Component/Console/Output/NullOutput.php";a:4:{s:6:"md5sum";s:32:"561f460b93be0c27aa9be546af49e9ec";s:4:"name";s:47:"Symfony/Component/Console/Output/NullOutput.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Output/NullOutput.php";}s:43:"Symfony/Component/Console/Output/Output.php";a:4:{s:6:"md5sum";s:32:"15c209a7581a632e6979d5441a02f241";s:4:"name";s:43:"Symfony/Component/Console/Output/Output.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Output/Output.php";}s:52:"Symfony/Component/Console/Output/OutputInterface.php";a:4:{s:6:"md5sum";s:32:"ac6d776cf82c8b887395c54482f17bd7";s:4:"name";s:52:"Symfony/Component/Console/Output/OutputInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Output/OutputInterface.php";}s:49:"Symfony/Component/Console/Output/StreamOutput.php";a:4:{s:6:"md5sum";s:32:"dc57630f625779ad86f6f3d8240ad0c3";s:4:"name";s:49:"Symfony/Component/Console/Output/StreamOutput.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Output/StreamOutput.php";}s:42:"Symfony/Component/Console/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"c94fc23909e8f1d27908cd0486653611";s:4:"name";s:42:"Symfony/Component/Console/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/phpunit.xml.dist";}s:35:"Symfony/Component/Console/README.md";a:4:{s:6:"md5sum";s:32:"70a92aecafcdc1f689a2a798acccefe4";s:4:"name";s:35:"Symfony/Component/Console/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/doc/pear/Console/Symfony/Component/Console/README.md";}s:55:"Symfony/Component/Console/Resources/bin/hiddeninput.exe";a:4:{s:6:"md5sum";s:32:"3613d8d83b78ce3561680a447eb6a24a";s:4:"name";s:55:"Symfony/Component/Console/Resources/bin/hiddeninput.exe";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Resources/bin/hiddeninput.exe";}s:35:"Symfony/Component/Console/Shell.php";a:4:{s:6:"md5sum";s:32:"fedc847f6c992a242e45a167b0cf1866";s:4:"name";s:35:"Symfony/Component/Console/Shell.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Shell.php";}s:54:"Symfony/Component/Console/Tester/ApplicationTester.php";a:4:{s:6:"md5sum";s:32:"f2c7b88716f13cb54825a933832a74a8";s:4:"name";s:54:"Symfony/Component/Console/Tester/ApplicationTester.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Tester/ApplicationTester.php";}s:50:"Symfony/Component/Console/Tester/CommandTester.php";a:4:{s:6:"md5sum";s:32:"9b7bf197b61b1b3c23772c57a2ec3ee5";s:4:"name";s:50:"Symfony/Component/Console/Tester/CommandTester.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Tester/CommandTester.php";}s:51:"Symfony/Component/Console/Tests/ApplicationTest.php";a:4:{s:6:"md5sum";s:32:"4113e99075832dfdf616eb1d40466b5f";s:4:"name";s:51:"Symfony/Component/Console/Tests/ApplicationTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/ApplicationTest.php";}s:55:"Symfony/Component/Console/Tests/Command/CommandTest.php";a:4:{s:6:"md5sum";s:32:"95ad26aa722775521f90d097b79d23b7";s:4:"name";s:55:"Symfony/Component/Console/Tests/Command/CommandTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Command/CommandTest.php";}s:59:"Symfony/Component/Console/Tests/Command/HelpCommandTest.php";a:4:{s:6:"md5sum";s:32:"e8f9a01b23091cef3ed6346feaf38b9c";s:4:"name";s:59:"Symfony/Component/Console/Tests/Command/HelpCommandTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Command/HelpCommandTest.php";}s:59:"Symfony/Component/Console/Tests/Command/ListCommandTest.php";a:4:{s:6:"md5sum";s:32:"e7562df5cc8110fb5a6e44cbc39a7c03";s:4:"name";s:59:"Symfony/Component/Console/Tests/Command/ListCommandTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Command/ListCommandTest.php";}s:69:"Symfony/Component/Console/Tests/Descriptor/AbstractDescriptorTest.php";a:4:{s:6:"md5sum";s:32:"531b8d11ed5d639162a8cbc8c1b7fe53";s:4:"name";s:69:"Symfony/Component/Console/Tests/Descriptor/AbstractDescriptorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Descriptor/AbstractDescriptorTest.php";}s:65:"Symfony/Component/Console/Tests/Descriptor/JsonDescriptorTest.php";a:4:{s:6:"md5sum";s:32:"8b6ccffc99cb2ffea82e6e65171dc329";s:4:"name";s:65:"Symfony/Component/Console/Tests/Descriptor/JsonDescriptorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Descriptor/JsonDescriptorTest.php";}s:69:"Symfony/Component/Console/Tests/Descriptor/MarkdownDescriptorTest.php";a:4:{s:6:"md5sum";s:32:"0738e024a2a5fd48f033acec21ebe484";s:4:"name";s:69:"Symfony/Component/Console/Tests/Descriptor/MarkdownDescriptorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Descriptor/MarkdownDescriptorTest.php";}s:62:"Symfony/Component/Console/Tests/Descriptor/ObjectsProvider.php";a:4:{s:6:"md5sum";s:32:"e364df76cc57c1a8221422eac8425501";s:4:"name";s:62:"Symfony/Component/Console/Tests/Descriptor/ObjectsProvider.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Descriptor/ObjectsProvider.php";}s:65:"Symfony/Component/Console/Tests/Descriptor/TextDescriptorTest.php";a:4:{s:6:"md5sum";s:32:"a5a110579ab493bc21572ec836e8b94e";s:4:"name";s:65:"Symfony/Component/Console/Tests/Descriptor/TextDescriptorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Descriptor/TextDescriptorTest.php";}s:64:"Symfony/Component/Console/Tests/Descriptor/XmlDescriptorTest.php";a:4:{s:6:"md5sum";s:32:"aa6b0e47cc2693587024ee3d9b2efc6c";s:4:"name";s:64:"Symfony/Component/Console/Tests/Descriptor/XmlDescriptorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Descriptor/XmlDescriptorTest.php";}s:59:"Symfony/Component/Console/Tests/Fixtures/application_1.json";a:4:{s:6:"md5sum";s:32:"ea331a512e8c0d80230ff1f7b1254316";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/application_1.json";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_1.json";}s:57:"Symfony/Component/Console/Tests/Fixtures/application_1.md";a:4:{s:6:"md5sum";s:32:"2e34db40b7841a8df627415fd72762df";s:4:"name";s:57:"Symfony/Component/Console/Tests/Fixtures/application_1.md";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_1.md";}s:58:"Symfony/Component/Console/Tests/Fixtures/application_1.txt";a:4:{s:6:"md5sum";s:32:"3d936937d3bcf607fc54faad2558a453";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/application_1.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_1.txt";}s:58:"Symfony/Component/Console/Tests/Fixtures/application_1.xml";a:4:{s:6:"md5sum";s:32:"d819500ef4e850b75c623682dc38c900";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/application_1.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_1.xml";}s:59:"Symfony/Component/Console/Tests/Fixtures/application_2.json";a:4:{s:6:"md5sum";s:32:"c461b890d0d7849cfb5eb5bbbc113e66";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/application_2.json";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_2.json";}s:57:"Symfony/Component/Console/Tests/Fixtures/application_2.md";a:4:{s:6:"md5sum";s:32:"fd2188a4c78bd7bc1a3778a0af6311c5";s:4:"name";s:57:"Symfony/Component/Console/Tests/Fixtures/application_2.md";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_2.md";}s:58:"Symfony/Component/Console/Tests/Fixtures/application_2.txt";a:4:{s:6:"md5sum";s:32:"d66df90611c1e4fc0161d4307d18ece1";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/application_2.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_2.txt";}s:58:"Symfony/Component/Console/Tests/Fixtures/application_2.xml";a:4:{s:6:"md5sum";s:32:"d9d7ea7073a523ad2a07ae345b22316f";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/application_2.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_2.xml";}s:64:"Symfony/Component/Console/Tests/Fixtures/application_astext1.txt";a:4:{s:6:"md5sum";s:32:"b40b7c5e2ce450d92801ad9f5420ea77";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/application_astext1.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_astext1.txt";}s:64:"Symfony/Component/Console/Tests/Fixtures/application_astext2.txt";a:4:{s:6:"md5sum";s:32:"345da50027f0969cf6b362f3f9088186";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/application_astext2.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_astext2.txt";}s:63:"Symfony/Component/Console/Tests/Fixtures/application_asxml1.txt";a:4:{s:6:"md5sum";s:32:"507250131eb057d025531c669a4aab19";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/application_asxml1.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_asxml1.txt";}s:63:"Symfony/Component/Console/Tests/Fixtures/application_asxml2.txt";a:4:{s:6:"md5sum";s:32:"fd7e97279731abc448a7577095054ca8";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/application_asxml2.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_asxml2.txt";}s:64:"Symfony/Component/Console/Tests/Fixtures/application_gethelp.txt";a:4:{s:6:"md5sum";s:32:"aa0a9b41081ebab06350041597bd4542";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/application_gethelp.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_gethelp.txt";}s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception1.txt";a:4:{s:6:"md5sum";s:32:"977a66011fcade49927bb6ac41477792";s:4:"name";s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception1.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_renderexception1.txt";}s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception2.txt";a:4:{s:6:"md5sum";s:32:"38d86d41d4fb194a695eaddfe2a8d2df";s:4:"name";s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception2.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_renderexception2.txt";}s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception3.txt";a:4:{s:6:"md5sum";s:32:"711b8a7b6ec59bb13332c79763666e14";s:4:"name";s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception3.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_renderexception3.txt";}s:82:"Symfony/Component/Console/Tests/Fixtures/application_renderexception3decorated.txt";a:4:{s:6:"md5sum";s:32:"037657ca60cd7c8ff945ce145684aec6";s:4:"name";s:82:"Symfony/Component/Console/Tests/Fixtures/application_renderexception3decorated.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_renderexception3decorated.txt";}s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception4.txt";a:4:{s:6:"md5sum";s:32:"0b5b31d2023ae8ec6e2eef0e08e0400c";s:4:"name";s:73:"Symfony/Component/Console/Tests/Fixtures/application_renderexception4.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_renderexception4.txt";}s:61:"Symfony/Component/Console/Tests/Fixtures/application_run1.txt";a:4:{s:6:"md5sum";s:32:"47745f267210a2e2fb9860082194efd2";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/application_run1.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_run1.txt";}s:61:"Symfony/Component/Console/Tests/Fixtures/application_run2.txt";a:4:{s:6:"md5sum";s:32:"ff916ea07ab6a3777814eafa148c9c34";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/application_run2.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_run2.txt";}s:61:"Symfony/Component/Console/Tests/Fixtures/application_run3.txt";a:4:{s:6:"md5sum";s:32:"e1651d791eebaeed9a568412fe433ce2";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/application_run3.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_run3.txt";}s:61:"Symfony/Component/Console/Tests/Fixtures/application_run4.txt";a:4:{s:6:"md5sum";s:32:"c7759de3fcd0263d72d1fad2390dc914";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/application_run4.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_run4.txt";}s:58:"Symfony/Component/Console/Tests/Fixtures/BarBucCommand.php";a:4:{s:6:"md5sum";s:32:"5bb7afd8d7266c4b53acdd0ba4bc87ce";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/BarBucCommand.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/BarBucCommand.php";}s:55:"Symfony/Component/Console/Tests/Fixtures/command_1.json";a:4:{s:6:"md5sum";s:32:"8464fa011bb28109fd087727f1216458";s:4:"name";s:55:"Symfony/Component/Console/Tests/Fixtures/command_1.json";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_1.json";}s:53:"Symfony/Component/Console/Tests/Fixtures/command_1.md";a:4:{s:6:"md5sum";s:32:"44b8f270513ba511d0d971b52b2396d6";s:4:"name";s:53:"Symfony/Component/Console/Tests/Fixtures/command_1.md";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_1.md";}s:54:"Symfony/Component/Console/Tests/Fixtures/command_1.txt";a:4:{s:6:"md5sum";s:32:"40f52be95eb599167faf4fb1382e93e7";s:4:"name";s:54:"Symfony/Component/Console/Tests/Fixtures/command_1.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_1.txt";}s:54:"Symfony/Component/Console/Tests/Fixtures/command_1.xml";a:4:{s:6:"md5sum";s:32:"d4a21bb6906c17693a2cf2d990f17441";s:4:"name";s:54:"Symfony/Component/Console/Tests/Fixtures/command_1.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_1.xml";}s:55:"Symfony/Component/Console/Tests/Fixtures/command_2.json";a:4:{s:6:"md5sum";s:32:"8ff624584c774ae83144627314d66587";s:4:"name";s:55:"Symfony/Component/Console/Tests/Fixtures/command_2.json";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_2.json";}s:53:"Symfony/Component/Console/Tests/Fixtures/command_2.md";a:4:{s:6:"md5sum";s:32:"65763c3a87b5e2a625fdd143edaf03fe";s:4:"name";s:53:"Symfony/Component/Console/Tests/Fixtures/command_2.md";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_2.md";}s:54:"Symfony/Component/Console/Tests/Fixtures/command_2.txt";a:4:{s:6:"md5sum";s:32:"5680ffddd8fc44a29d0ea39f9ab09906";s:4:"name";s:54:"Symfony/Component/Console/Tests/Fixtures/command_2.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_2.txt";}s:54:"Symfony/Component/Console/Tests/Fixtures/command_2.xml";a:4:{s:6:"md5sum";s:32:"8cac2b7fac663f8d0fd15c22f1160981";s:4:"name";s:54:"Symfony/Component/Console/Tests/Fixtures/command_2.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_2.xml";}s:59:"Symfony/Component/Console/Tests/Fixtures/command_astext.txt";a:4:{s:6:"md5sum";s:32:"ac50a755a5dcf9dbbf7d03564c134b5c";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/command_astext.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_astext.txt";}s:58:"Symfony/Component/Console/Tests/Fixtures/command_asxml.txt";a:4:{s:6:"md5sum";s:32:"d94936284533d2495f2eb207fa02e232";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/command_asxml.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_asxml.txt";}s:62:"Symfony/Component/Console/Tests/Fixtures/definition_astext.txt";a:4:{s:6:"md5sum";s:32:"6a54005ec1a08c1a7f9d7b098dec09f3";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/definition_astext.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/definition_astext.txt";}s:61:"Symfony/Component/Console/Tests/Fixtures/definition_asxml.txt";a:4:{s:6:"md5sum";s:32:"205994db49721172eac27b69ff37ec4f";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/definition_asxml.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/definition_asxml.txt";}s:67:"Symfony/Component/Console/Tests/Fixtures/DescriptorApplication1.php";a:4:{s:6:"md5sum";s:32:"cb827ac9aecc15b6592f8c153317b31d";s:4:"name";s:67:"Symfony/Component/Console/Tests/Fixtures/DescriptorApplication1.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/DescriptorApplication1.php";}s:67:"Symfony/Component/Console/Tests/Fixtures/DescriptorApplication2.php";a:4:{s:6:"md5sum";s:32:"d929bab60eb3fd020e15b45a3c54d168";s:4:"name";s:67:"Symfony/Component/Console/Tests/Fixtures/DescriptorApplication2.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/DescriptorApplication2.php";}s:63:"Symfony/Component/Console/Tests/Fixtures/DescriptorCommand1.php";a:4:{s:6:"md5sum";s:32:"50c23e03725ffd75f65d76b07e71887a";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/DescriptorCommand1.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/DescriptorCommand1.php";}s:63:"Symfony/Component/Console/Tests/Fixtures/DescriptorCommand2.php";a:4:{s:6:"md5sum";s:32:"8cc36b0c8be8ac7db7897d5ac4eee699";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/DescriptorCommand2.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/DescriptorCommand2.php";}s:56:"Symfony/Component/Console/Tests/Fixtures/Foo1Command.php";a:4:{s:6:"md5sum";s:32:"df52584a64822a983eb5d927acedb8c1";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/Foo1Command.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/Foo1Command.php";}s:56:"Symfony/Component/Console/Tests/Fixtures/Foo2Command.php";a:4:{s:6:"md5sum";s:32:"cf36c22795c10c04984b683ff3f1fe79";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/Foo2Command.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/Foo2Command.php";}s:56:"Symfony/Component/Console/Tests/Fixtures/Foo3Command.php";a:4:{s:6:"md5sum";s:32:"14ec4962d6e9d9be56dbb5a90f1c01bc";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/Foo3Command.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/Foo3Command.php";}s:56:"Symfony/Component/Console/Tests/Fixtures/Foo4Command.php";a:4:{s:6:"md5sum";s:32:"a747ae989c89cbff1df48d301d69ff9a";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/Foo4Command.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/Foo4Command.php";}s:56:"Symfony/Component/Console/Tests/Fixtures/Foo5Command.php";a:4:{s:6:"md5sum";s:32:"ab33a181019dd14b892e920906a83e41";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/Foo5Command.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/Foo5Command.php";}s:58:"Symfony/Component/Console/Tests/Fixtures/FoobarCommand.php";a:4:{s:6:"md5sum";s:32:"c409f073d1a760445d7c692bf6668848";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/FoobarCommand.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/FoobarCommand.php";}s:55:"Symfony/Component/Console/Tests/Fixtures/FooCommand.php";a:4:{s:6:"md5sum";s:32:"45276372456804d1c3cc11c30e1e26e4";s:4:"name";s:55:"Symfony/Component/Console/Tests/Fixtures/FooCommand.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/FooCommand.php";}s:62:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.json";a:4:{s:6:"md5sum";s:32:"87e6eeef0f89e57d691ca8a35bb91e12";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.json";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_1.json";}s:60:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.md";a:4:{s:6:"md5sum";s:32:"f51385902d2eb98e5c7236b26f720741";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.md";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_1.md";}s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.txt";a:4:{s:6:"md5sum";s:32:"49ec5d491a17d9f6c93e3b6194757de0";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_1.txt";}s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.xml";a:4:{s:6:"md5sum";s:32:"0c308f004edf7c0b6aaec03f028e8747";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_1.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_1.xml";}s:62:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.json";a:4:{s:6:"md5sum";s:32:"7b189366871c1bb8b146087dcc1b20cf";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.json";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_2.json";}s:60:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.md";a:4:{s:6:"md5sum";s:32:"3f2fd328c9393a8ede70602631d68c9f";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.md";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_2.md";}s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.txt";a:4:{s:6:"md5sum";s:32:"c4567546600e6c71ee236a870b9a5d16";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_2.txt";}s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.xml";a:4:{s:6:"md5sum";s:32:"57a965ef131103e13d8befdb1a0e8465";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_2.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_2.xml";}s:62:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.json";a:4:{s:6:"md5sum";s:32:"eacb43809707dd26dcb8a0c34f1cd337";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.json";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_3.json";}s:60:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.md";a:4:{s:6:"md5sum";s:32:"92b02b5435642c4f31ccc943b751c30e";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.md";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_3.md";}s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.txt";a:4:{s:6:"md5sum";s:32:"e512053db481dbd2ac228f790e4a5c31";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_3.txt";}s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.xml";a:4:{s:6:"md5sum";s:32:"4b5eacb65951dd1047832992de231669";s:4:"name";s:61:"Symfony/Component/Console/Tests/Fixtures/input_argument_3.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_3.xml";}s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.json";a:4:{s:6:"md5sum";s:32:"6b6cd5a30b7f04a27b3615fcb66fbb60";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.json";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_1.json";}s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.md";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.md";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_1.md";}s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_1.txt";}s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.xml";a:4:{s:6:"md5sum";s:32:"d1ccbc21759a3a9fbf5c8540d9083f47";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_1.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_1.xml";}s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.json";a:4:{s:6:"md5sum";s:32:"96c29539ac20c5289ce924a2b53e0a74";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.json";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_2.json";}s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.md";a:4:{s:6:"md5sum";s:32:"65e283e532971f65a0531cef86ec1ff7";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.md";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_2.md";}s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.txt";a:4:{s:6:"md5sum";s:32:"63bc1a5ff3064f65a2acd1f3fe791164";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_2.txt";}s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.xml";a:4:{s:6:"md5sum";s:32:"a856c4c0e7a21895a75fccd1f7ad9652";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_2.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_2.xml";}s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.json";a:4:{s:6:"md5sum";s:32:"e3e2853d5735de1d839b7378cea925f6";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.json";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_3.json";}s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.md";a:4:{s:6:"md5sum";s:32:"cf4db1e7e783877fedcc11f228f057f7";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.md";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_3.md";}s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.txt";a:4:{s:6:"md5sum";s:32:"6517879eab6c613d4ccc9e8f11dc00cc";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_3.txt";}s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.xml";a:4:{s:6:"md5sum";s:32:"cf9890033c9b3296c3f0a84ad7a40f26";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_3.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_3.xml";}s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.json";a:4:{s:6:"md5sum";s:32:"a0d3b5beb936e28bcfa0b2a09038e477";s:4:"name";s:64:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.json";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_4.json";}s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.md";a:4:{s:6:"md5sum";s:32:"55bdf86d23a2c802d4c7d36922a16cc8";s:4:"name";s:62:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.md";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_4.md";}s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.txt";a:4:{s:6:"md5sum";s:32:"6a351cab07e83967475ce418f11389c9";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_4.txt";}s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.xml";a:4:{s:6:"md5sum";s:32:"732625b8bef91e2b6e5e42b135714673";s:4:"name";s:63:"Symfony/Component/Console/Tests/Fixtures/input_definition_4.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_4.xml";}s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_1.json";a:4:{s:6:"md5sum";s:32:"275c5ca8fae2603962435abee86abc22";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_1.json";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_1.json";}s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_1.md";a:4:{s:6:"md5sum";s:32:"2f3b3fce4e6cc97d37c2cdf2a8545a17";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_1.md";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_1.md";}s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_1.txt";a:4:{s:6:"md5sum";s:32:"7c446b0b7764679b0675e2bf7c15d5ef";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_1.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_1.txt";}s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_1.xml";a:4:{s:6:"md5sum";s:32:"2441944e792817317e54ca3e6bf3478a";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_1.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_1.xml";}s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_2.json";a:4:{s:6:"md5sum";s:32:"8ad4b5bb7f68b81ac5baf6f86c54f216";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_2.json";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_2.json";}s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_2.md";a:4:{s:6:"md5sum";s:32:"febad80dc8502990d7631dfa7e710725";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_2.md";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_2.md";}s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_2.txt";a:4:{s:6:"md5sum";s:32:"4cebdddb6ee8776268fe824f5ebc8b14";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_2.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_2.txt";}s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_2.xml";a:4:{s:6:"md5sum";s:32:"ad9f550cbdd67e7bda7bfb78ebbc4d57";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_2.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_2.xml";}s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_3.json";a:4:{s:6:"md5sum";s:32:"2eb676e70f06dff589fc461b96da5c61";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_3.json";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_3.json";}s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_3.md";a:4:{s:6:"md5sum";s:32:"03a09ae47b81986ec50edd6608fa2426";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_3.md";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_3.md";}s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_3.txt";a:4:{s:6:"md5sum";s:32:"7eada46556b0ce341069f353b063e45e";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_3.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_3.txt";}s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_3.xml";a:4:{s:6:"md5sum";s:32:"8c91b697596ccf87b48c58ecbae02aa6";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_3.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_3.xml";}s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_4.json";a:4:{s:6:"md5sum";s:32:"20c72909569d5ec92465f7c7dc002381";s:4:"name";s:60:"Symfony/Component/Console/Tests/Fixtures/input_option_4.json";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_4.json";}s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_4.md";a:4:{s:6:"md5sum";s:32:"4b02ffc507306a9d887e73d2fca429ba";s:4:"name";s:58:"Symfony/Component/Console/Tests/Fixtures/input_option_4.md";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_4.md";}s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_4.txt";a:4:{s:6:"md5sum";s:32:"7d49ce52263e22bbdd37e687455478ea";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_4.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_4.txt";}s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_4.xml";a:4:{s:6:"md5sum";s:32:"960e79c93c46361c3bd250b5fe73d25b";s:4:"name";s:59:"Symfony/Component/Console/Tests/Fixtures/input_option_4.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_4.xml";}s:56:"Symfony/Component/Console/Tests/Fixtures/TestCommand.php";a:4:{s:6:"md5sum";s:32:"cdfd10039b833b3d0cd4bc946d6d0e52";s:4:"name";s:56:"Symfony/Component/Console/Tests/Fixtures/TestCommand.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures/TestCommand.php";}s:75:"Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleStackTest.php";a:4:{s:6:"md5sum";s:32:"d65f80f685c098367d357b79b1085660";s:4:"name";s:75:"Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleStackTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleStackTest.php";}s:70:"Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php";a:4:{s:6:"md5sum";s:32:"772ad7157614e0a3336b0e79bfd8c018";s:4:"name";s:70:"Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php";}s:65:"Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php";a:4:{s:6:"md5sum";s:32:"1932fadfa3ba33810457dc7c7caf4200";s:4:"name";s:65:"Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php";}s:59:"Symfony/Component/Console/Tests/Helper/DialogHelperTest.php";a:4:{s:6:"md5sum";s:32:"c080187a3a540acbd38ea4e72e197073";s:4:"name";s:59:"Symfony/Component/Console/Tests/Helper/DialogHelperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Helper/DialogHelperTest.php";}s:62:"Symfony/Component/Console/Tests/Helper/FormatterHelperTest.php";a:4:{s:6:"md5sum";s:32:"caffe5a35cfde20acff28a1b2ede9523";s:4:"name";s:62:"Symfony/Component/Console/Tests/Helper/FormatterHelperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Helper/FormatterHelperTest.php";}s:56:"Symfony/Component/Console/Tests/Helper/HelperSetTest.php";a:4:{s:6:"md5sum";s:32:"0c4b855c7ad31b88262a32f083903d5b";s:4:"name";s:56:"Symfony/Component/Console/Tests/Helper/HelperSetTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Helper/HelperSetTest.php";}s:61:"Symfony/Component/Console/Tests/Helper/ProgressHelperTest.php";a:4:{s:6:"md5sum";s:32:"8d460c56a019e5bfd59f1d2d91970812";s:4:"name";s:61:"Symfony/Component/Console/Tests/Helper/ProgressHelperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Helper/ProgressHelperTest.php";}s:58:"Symfony/Component/Console/Tests/Helper/TableHelperTest.php";a:4:{s:6:"md5sum";s:32:"7c598e6ffdbd3c17865a4c54cbe34c78";s:4:"name";s:58:"Symfony/Component/Console/Tests/Helper/TableHelperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Helper/TableHelperTest.php";}s:55:"Symfony/Component/Console/Tests/Input/ArgvInputTest.php";a:4:{s:6:"md5sum";s:32:"2d5b2e942330756fcbc30062e9007f1e";s:4:"name";s:55:"Symfony/Component/Console/Tests/Input/ArgvInputTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Input/ArgvInputTest.php";}s:56:"Symfony/Component/Console/Tests/Input/ArrayInputTest.php";a:4:{s:6:"md5sum";s:32:"a90b8bafe8ede004c6ed61ecc8224a3f";s:4:"name";s:56:"Symfony/Component/Console/Tests/Input/ArrayInputTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Input/ArrayInputTest.php";}s:59:"Symfony/Component/Console/Tests/Input/InputArgumentTest.php";a:4:{s:6:"md5sum";s:32:"7fe249cea32fc176d04f2520a018bdd8";s:4:"name";s:59:"Symfony/Component/Console/Tests/Input/InputArgumentTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Input/InputArgumentTest.php";}s:61:"Symfony/Component/Console/Tests/Input/InputDefinitionTest.php";a:4:{s:6:"md5sum";s:32:"debb5202554762ad79bbd9353fcd04b7";s:4:"name";s:61:"Symfony/Component/Console/Tests/Input/InputDefinitionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Input/InputDefinitionTest.php";}s:57:"Symfony/Component/Console/Tests/Input/InputOptionTest.php";a:4:{s:6:"md5sum";s:32:"b6f2af5b4b79ed25113742022e86c77a";s:4:"name";s:57:"Symfony/Component/Console/Tests/Input/InputOptionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Input/InputOptionTest.php";}s:51:"Symfony/Component/Console/Tests/Input/InputTest.php";a:4:{s:6:"md5sum";s:32:"f9129bb377ebb93a88cfcc97795055ff";s:4:"name";s:51:"Symfony/Component/Console/Tests/Input/InputTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Input/InputTest.php";}s:57:"Symfony/Component/Console/Tests/Input/StringInputTest.php";a:4:{s:6:"md5sum";s:32:"6d3e24ab1bdf3f1048c89aded3fdfc42";s:4:"name";s:57:"Symfony/Component/Console/Tests/Input/StringInputTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Input/StringInputTest.php";}s:60:"Symfony/Component/Console/Tests/Output/ConsoleOutputTest.php";a:4:{s:6:"md5sum";s:32:"5f42c7a490159ffee9e4d44297f6cbb0";s:4:"name";s:60:"Symfony/Component/Console/Tests/Output/ConsoleOutputTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Output/ConsoleOutputTest.php";}s:57:"Symfony/Component/Console/Tests/Output/NullOutputTest.php";a:4:{s:6:"md5sum";s:32:"3b663167dfed0b653e8bc70890b8d417";s:4:"name";s:57:"Symfony/Component/Console/Tests/Output/NullOutputTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Output/NullOutputTest.php";}s:53:"Symfony/Component/Console/Tests/Output/OutputTest.php";a:4:{s:6:"md5sum";s:32:"eb5d8d732894bc94242983e61d9ea828";s:4:"name";s:53:"Symfony/Component/Console/Tests/Output/OutputTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Output/OutputTest.php";}s:59:"Symfony/Component/Console/Tests/Output/StreamOutputTest.php";a:4:{s:6:"md5sum";s:32:"d9e51b68858e010abf7c9856411f9f3e";s:4:"name";s:59:"Symfony/Component/Console/Tests/Output/StreamOutputTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Output/StreamOutputTest.php";}s:64:"Symfony/Component/Console/Tests/Tester/ApplicationTesterTest.php";a:4:{s:6:"md5sum";s:32:"ed2c4ba2123801176abd8f7b15cfce2e";s:4:"name";s:64:"Symfony/Component/Console/Tests/Tester/ApplicationTesterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Tester/ApplicationTesterTest.php";}s:60:"Symfony/Component/Console/Tests/Tester/CommandTesterTest.php";a:4:{s:6:"md5sum";s:32:"dc805845c9fb25bf57604fda8b19c86d";s:4:"name";s:60:"Symfony/Component/Console/Tests/Tester/CommandTesterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Tester/CommandTesterTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:30:{s:55:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:67:"/opt/alt/php54/usr/share/doc/pear/Console/Symfony/Component/Console";b:1;s:59:"/opt/alt/php54/usr/share/doc/pear/Console/Symfony/Component";b:1;s:49:"/opt/alt/php54/usr/share/doc/pear/Console/Symfony";b:1;s:41:"/opt/alt/php54/usr/share/doc/pear/Console";b:1;s:63:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Command";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Descriptor";b:1;s:61:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Event";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Formatter";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Helper";b:1;s:61:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Input";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Output";b:1;s:68:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console";b:1;s:60:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component";b:1;s:50:"/opt/alt/php54/usr/share/pear/test/Console/Symfony";b:1;s:42:"/opt/alt/php54/usr/share/pear/test/Console";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Resources/bin";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Resources";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/Console/Tester";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests";b:1;s:82:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Command";b:1;s:85:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Descriptor";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Fixtures";b:1;s:84:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Formatter";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Helper";b:1;s:80:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Input";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Output";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/Console/Symfony/Component/Console/Tests/Tester";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506492;}PK�^�\�@�zx@x@7pear/.registry/.channel.pear.symfony.com/domcrawler.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:10:"DomCrawler";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:29:"Symfony2 DomCrawler Component";s:11:"description";s:29:"Symfony2 DomCrawler Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:43";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:26:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"778e5e4c2ef79bf3eab9659a2efe2bee";s:4:"name";s:43:"Symfony/Component/DomCrawler/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2cafc6f4bf64390dcbd0a455be44b6d8";s:4:"name";s:41:"Symfony/Component/DomCrawler/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d1cc79159630ef76a89b80dc11c51f15";s:4:"name";s:42:"Symfony/Component/DomCrawler/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6509c142e976bd66f4c7ec226d050f71";s:4:"name";s:40:"Symfony/Component/DomCrawler/Crawler.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c551faa84079802e0f9b88648d2743ae";s:4:"name";s:54:"Symfony/Component/DomCrawler/Field/ChoiceFormField.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2cc904288c9ada108fc772afd46eeba1";s:4:"name";s:52:"Symfony/Component/DomCrawler/Field/FileFormField.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d4d90fb70896ed262bd9b01238be9986";s:4:"name";s:48:"Symfony/Component/DomCrawler/Field/FormField.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d945707a2751cc30160d16f1e7868a59";s:4:"name";s:53:"Symfony/Component/DomCrawler/Field/InputFormField.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e58b3d248716078974dd6e62c678c09e";s:4:"name";s:56:"Symfony/Component/DomCrawler/Field/TextareaFormField.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"891f2a57a1951ad1bf4956f5df94b682";s:4:"name";s:37:"Symfony/Component/DomCrawler/Form.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"51dd5f3a8bf36823985d4c1d7618d4b6";s:4:"name";s:50:"Symfony/Component/DomCrawler/FormFieldRegistry.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/DomCrawler/LICENSE";s:4:"role";s:3:"doc";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f2ed81516a26ccf90ac75d6404bf9589";s:4:"name";s:37:"Symfony/Component/DomCrawler/Link.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"67ea9aa8b6d108bb9f3268da0569c703";s:4:"name";s:45:"Symfony/Component/DomCrawler/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4dbc593d8cc7445cafc62cd73c13f5de";s:4:"name";s:38:"Symfony/Component/DomCrawler/README.md";s:4:"role";s:3:"doc";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ecd3daf12dad9c75b96803ec9caeaf4";s:4:"name";s:50:"Symfony/Component/DomCrawler/Tests/CrawlerTest.php";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ce57f830f14f9225111bba2434fe2927";s:4:"name";s:64:"Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"77e2087cd2c221981f6d465fa3ceeb7b";s:4:"name";s:62:"Symfony/Component/DomCrawler/Tests/Field/FileFormFieldTest.php";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"55c98c4590e2c55a7dd4d1bd6074e319";s:4:"name";s:58:"Symfony/Component/DomCrawler/Tests/Field/FormFieldTest.php";s:4:"role";s:4:"test";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"933f6abce62f92d04cfa09025919076f";s:4:"name";s:62:"Symfony/Component/DomCrawler/Tests/Field/FormFieldTestCase.php";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0fa26bf8503badc839759f9f75d5a099";s:4:"name";s:63:"Symfony/Component/DomCrawler/Tests/Field/InputFormFieldTest.php";s:4:"role";s:4:"test";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e1d8139694476b22f6cc345f42d0a018";s:4:"name";s:66:"Symfony/Component/DomCrawler/Tests/Field/TextareaFormFieldTest.php";s:4:"role";s:4:"test";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2205e48de5f93c784733ffcca841d2b5";s:4:"name";s:56:"Symfony/Component/DomCrawler/Tests/Fixtures/no-extension";s:4:"role";s:4:"test";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"974fdff2161430f0a84d086ed023b85c";s:4:"name";s:61:"Symfony/Component/DomCrawler/Tests/Fixtures/windows-1250.html";s:4:"role";s:4:"test";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"00b7ea673d9c353455199b68cdfde0e4";s:4:"name";s:47:"Symfony/Component/DomCrawler/Tests/FormTest.php";s:4:"role";s:4:"test";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a634e1da9e7f548d92635fac8614781a";s:4:"name";s:47:"Symfony/Component/DomCrawler/Tests/LinkTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}s:8:"optional";a:1:{s:7:"package";a:2:{s:4:"name";s:11:"CssSelector";s:7:"channel";s:16:"pear.symfony.com";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:26:{s:43:"Symfony/Component/DomCrawler/autoloader.php";a:4:{s:6:"md5sum";s:32:"778e5e4c2ef79bf3eab9659a2efe2bee";s:4:"name";s:43:"Symfony/Component/DomCrawler/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/autoloader.php";}s:41:"Symfony/Component/DomCrawler/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"2cafc6f4bf64390dcbd0a455be44b6d8";s:4:"name";s:41:"Symfony/Component/DomCrawler/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/doc/pear/DomCrawler/Symfony/Component/DomCrawler/CHANGELOG.md";}s:42:"Symfony/Component/DomCrawler/composer.json";a:4:{s:6:"md5sum";s:32:"d1cc79159630ef76a89b80dc11c51f15";s:4:"name";s:42:"Symfony/Component/DomCrawler/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/DomCrawler/Symfony/Component/DomCrawler/composer.json";}s:40:"Symfony/Component/DomCrawler/Crawler.php";a:4:{s:6:"md5sum";s:32:"6509c142e976bd66f4c7ec226d050f71";s:4:"name";s:40:"Symfony/Component/DomCrawler/Crawler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/Crawler.php";}s:54:"Symfony/Component/DomCrawler/Field/ChoiceFormField.php";a:4:{s:6:"md5sum";s:32:"c551faa84079802e0f9b88648d2743ae";s:4:"name";s:54:"Symfony/Component/DomCrawler/Field/ChoiceFormField.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/Field/ChoiceFormField.php";}s:52:"Symfony/Component/DomCrawler/Field/FileFormField.php";a:4:{s:6:"md5sum";s:32:"2cc904288c9ada108fc772afd46eeba1";s:4:"name";s:52:"Symfony/Component/DomCrawler/Field/FileFormField.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/Field/FileFormField.php";}s:48:"Symfony/Component/DomCrawler/Field/FormField.php";a:4:{s:6:"md5sum";s:32:"d4d90fb70896ed262bd9b01238be9986";s:4:"name";s:48:"Symfony/Component/DomCrawler/Field/FormField.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/Field/FormField.php";}s:53:"Symfony/Component/DomCrawler/Field/InputFormField.php";a:4:{s:6:"md5sum";s:32:"d945707a2751cc30160d16f1e7868a59";s:4:"name";s:53:"Symfony/Component/DomCrawler/Field/InputFormField.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/Field/InputFormField.php";}s:56:"Symfony/Component/DomCrawler/Field/TextareaFormField.php";a:4:{s:6:"md5sum";s:32:"e58b3d248716078974dd6e62c678c09e";s:4:"name";s:56:"Symfony/Component/DomCrawler/Field/TextareaFormField.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/Field/TextareaFormField.php";}s:37:"Symfony/Component/DomCrawler/Form.php";a:4:{s:6:"md5sum";s:32:"891f2a57a1951ad1bf4956f5df94b682";s:4:"name";s:37:"Symfony/Component/DomCrawler/Form.php";s:4:"role";s:3:"php";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/Form.php";}s:50:"Symfony/Component/DomCrawler/FormFieldRegistry.php";a:4:{s:6:"md5sum";s:32:"51dd5f3a8bf36823985d4c1d7618d4b6";s:4:"name";s:50:"Symfony/Component/DomCrawler/FormFieldRegistry.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/FormFieldRegistry.php";}s:36:"Symfony/Component/DomCrawler/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/DomCrawler/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/DomCrawler/Symfony/Component/DomCrawler/LICENSE";}s:37:"Symfony/Component/DomCrawler/Link.php";a:4:{s:6:"md5sum";s:32:"f2ed81516a26ccf90ac75d6404bf9589";s:4:"name";s:37:"Symfony/Component/DomCrawler/Link.php";s:4:"role";s:3:"php";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/Link.php";}s:45:"Symfony/Component/DomCrawler/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"67ea9aa8b6d108bb9f3268da0569c703";s:4:"name";s:45:"Symfony/Component/DomCrawler/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/phpunit.xml.dist";}s:38:"Symfony/Component/DomCrawler/README.md";a:4:{s:6:"md5sum";s:32:"4dbc593d8cc7445cafc62cd73c13f5de";s:4:"name";s:38:"Symfony/Component/DomCrawler/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/DomCrawler/Symfony/Component/DomCrawler/README.md";}s:50:"Symfony/Component/DomCrawler/Tests/CrawlerTest.php";a:4:{s:6:"md5sum";s:32:"3ecd3daf12dad9c75b96803ec9caeaf4";s:4:"name";s:50:"Symfony/Component/DomCrawler/Tests/CrawlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/CrawlerTest.php";}s:64:"Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php";a:4:{s:6:"md5sum";s:32:"ce57f830f14f9225111bba2434fe2927";s:4:"name";s:64:"Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php";}s:62:"Symfony/Component/DomCrawler/Tests/Field/FileFormFieldTest.php";a:4:{s:6:"md5sum";s:32:"77e2087cd2c221981f6d465fa3ceeb7b";s:4:"name";s:62:"Symfony/Component/DomCrawler/Tests/Field/FileFormFieldTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/FileFormFieldTest.php";}s:58:"Symfony/Component/DomCrawler/Tests/Field/FormFieldTest.php";a:4:{s:6:"md5sum";s:32:"55c98c4590e2c55a7dd4d1bd6074e319";s:4:"name";s:58:"Symfony/Component/DomCrawler/Tests/Field/FormFieldTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/FormFieldTest.php";}s:62:"Symfony/Component/DomCrawler/Tests/Field/FormFieldTestCase.php";a:4:{s:6:"md5sum";s:32:"933f6abce62f92d04cfa09025919076f";s:4:"name";s:62:"Symfony/Component/DomCrawler/Tests/Field/FormFieldTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/FormFieldTestCase.php";}s:63:"Symfony/Component/DomCrawler/Tests/Field/InputFormFieldTest.php";a:4:{s:6:"md5sum";s:32:"0fa26bf8503badc839759f9f75d5a099";s:4:"name";s:63:"Symfony/Component/DomCrawler/Tests/Field/InputFormFieldTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/InputFormFieldTest.php";}s:66:"Symfony/Component/DomCrawler/Tests/Field/TextareaFormFieldTest.php";a:4:{s:6:"md5sum";s:32:"e1d8139694476b22f6cc345f42d0a018";s:4:"name";s:66:"Symfony/Component/DomCrawler/Tests/Field/TextareaFormFieldTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/TextareaFormFieldTest.php";}s:56:"Symfony/Component/DomCrawler/Tests/Fixtures/no-extension";a:4:{s:6:"md5sum";s:32:"2205e48de5f93c784733ffcca841d2b5";s:4:"name";s:56:"Symfony/Component/DomCrawler/Tests/Fixtures/no-extension";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Fixtures/no-extension";}s:61:"Symfony/Component/DomCrawler/Tests/Fixtures/windows-1250.html";a:4:{s:6:"md5sum";s:32:"974fdff2161430f0a84d086ed023b85c";s:4:"name";s:61:"Symfony/Component/DomCrawler/Tests/Fixtures/windows-1250.html";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Fixtures/windows-1250.html";}s:47:"Symfony/Component/DomCrawler/Tests/FormTest.php";a:4:{s:6:"md5sum";s:32:"00b7ea673d9c353455199b68cdfde0e4";s:4:"name";s:47:"Symfony/Component/DomCrawler/Tests/FormTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/FormTest.php";}s:47:"Symfony/Component/DomCrawler/Tests/LinkTest.php";a:4:{s:6:"md5sum";s:32:"a634e1da9e7f548d92635fac8614781a";s:4:"name";s:47:"Symfony/Component/DomCrawler/Tests/LinkTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/LinkTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:15:{s:58:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:73:"/opt/alt/php54/usr/share/doc/pear/DomCrawler/Symfony/Component/DomCrawler";b:1;s:62:"/opt/alt/php54/usr/share/doc/pear/DomCrawler/Symfony/Component";b:1;s:52:"/opt/alt/php54/usr/share/doc/pear/DomCrawler/Symfony";b:1;s:44:"/opt/alt/php54/usr/share/doc/pear/DomCrawler";b:1;s:64:"/opt/alt/php54/usr/share/pear/Symfony/Component/DomCrawler/Field";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler";b:1;s:63:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component";b:1;s:53:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony";b:1;s:45:"/opt/alt/php54/usr/share/pear/test/DomCrawler";b:1;s:80:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Fixtures";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:11:"CssSelector";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\ Gw�̟̟6pear/.registry/.channel.pear.symfony.com/validator.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:9:"Validator";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:28:"Symfony2 Validator Component";s:11:"description";s:28:"Symfony2 Validator Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:51";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:307:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"70881b5188a71a54eaaa5174d35b8a7d";s:4:"name";s:42:"Symfony/Component/Validator/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"460bbf634d57fb9eb81d53f051e8ab23";s:4:"name";s:40:"Symfony/Component/Validator/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9b310a8a94f594586e92f197f9c2b271";s:4:"name";s:51:"Symfony/Component/Validator/ClassBasedInterface.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3af3b2a12af30fa1161d400c5fa160db";s:4:"name";s:41:"Symfony/Component/Validator/composer.json";s:4:"role";s:3:"doc";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4673b9af925a35c9c4bed05edab5facb";s:4:"name";s:42:"Symfony/Component/Validator/Constraint.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8aa49d6a48f577e0f496ed051e1e3e35";s:4:"name";s:62:"Symfony/Component/Validator/Constraints/AbstractComparison.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cd63ee91f580c33ed3e5027672c447cf";s:4:"name";s:71:"Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"81fa182a1f3260d61a45e0c9a886300a";s:4:"name";s:47:"Symfony/Component/Validator/Constraints/All.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"76ee8f2dd2d0a1ff7329ddd7f4e812a8";s:4:"name";s:56:"Symfony/Component/Validator/Constraints/AllValidator.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"77b52c16bd1289663a73f66f39190eed";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Blank.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6bf52b86aeb6e4b7e762994e61b30656";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/BlankValidator.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"16cf9f642a14848b9bc3ef3b883f19d1";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/Callback.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ad21e0f04423e82992c83f14e893779e";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/CallbackValidator.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"056ebff8baa348be8202ca6b297c4d01";s:4:"name";s:54:"Symfony/Component/Validator/Constraints/CardScheme.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"284da971d7406e599a1233b2d2206376";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/CardSchemeValidator.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"49d0c082a54602ac483ce2afffb57431";s:4:"name";s:50:"Symfony/Component/Validator/Constraints/Choice.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c6988852a1c710e4832e4a0cf5f465ed";s:4:"name";s:59:"Symfony/Component/Validator/Constraints/ChoiceValidator.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09520f3d5eacb03f804fadf2d0afd2d2";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/Collection/Optional.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a084bfe09407f23250f410ed4c00c05f";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/Collection/Required.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5ca5192af79d7355af8a4017b671a8fb";s:4:"name";s:54:"Symfony/Component/Validator/Constraints/Collection.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2a15094f63da567965053d81cec8b6bc";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/CollectionValidator.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d60afc2a00394329890f41050239d6be";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Count.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8912e6648f1801a81237b64ad79beea8";s:4:"name";s:51:"Symfony/Component/Validator/Constraints/Country.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5a7bd5263e9707dd6acab56907453cb4";s:4:"name";s:60:"Symfony/Component/Validator/Constraints/CountryValidator.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b63f576f4acf1cf05dd4a10b8dcdf613";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/CountValidator.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dd7316794387746194d2d2fb42b7eb7f";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/Currency.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9dfda60fe4dedc960dec518bcdf21a7f";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/CurrencyValidator.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5e1a2350fefabcba23f44ced82b9e830";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Date.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7146e3c517edfd501fdec3734e5a6f55";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/DateTime.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"113eb18edd006507eb982c46d58fa85f";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/DateTimeValidator.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b2d3caa73ec728ede046f0358cf001a0";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/DateValidator.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3aa9b1e92fed777c1439d01d7eb6af23";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Email.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"01b056747cb908f564510334d5cf80fb";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/EmailValidator.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1203a215e52460149441441579253d47";s:4:"name";s:51:"Symfony/Component/Validator/Constraints/EqualTo.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"85299aea76d2e9973c0a2a1f39796640";s:4:"name";s:60:"Symfony/Component/Validator/Constraints/EqualToValidator.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5bf3ff6df741685faf77a3568bb8b633";s:4:"name";s:53:"Symfony/Component/Validator/Constraints/Existence.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"900f7ff58ceb2ae76007bb5a6394d921";s:4:"name";s:54:"Symfony/Component/Validator/Constraints/Expression.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ede516fce7c1f487d08359ba11ae2ff";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/ExpressionValidator.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09d73194877b4dda8d4300f24e195013";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/False.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"79467bb4ee325740c202f9c8b97010a9";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/FalseValidator.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6e8e581ad9077fb13150682285df29b1";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/File.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d08c81702c68afd2c2757543f7d5193b";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/FileValidator.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"79767d486e626e5c77b78bd7afe4aee9";s:4:"name";s:55:"Symfony/Component/Validator/Constraints/GreaterThan.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ebb17f4ce792e12fecff1e9bb4b41e21";s:4:"name";s:62:"Symfony/Component/Validator/Constraints/GreaterThanOrEqual.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e4430a7d1c6f9f03c7a770ddda909d5f";s:4:"name";s:71:"Symfony/Component/Validator/Constraints/GreaterThanOrEqualValidator.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2ff68d36a30ee563937565accdaf91e3";s:4:"name";s:64:"Symfony/Component/Validator/Constraints/GreaterThanValidator.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"15201fe63d343b6b1e1a739fcaad8662";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/GroupSequence.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"38089465890121217bdedbd833ee95e4";s:4:"name";s:65:"Symfony/Component/Validator/Constraints/GroupSequenceProvider.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b6c69a9eb08622192d6af7a1f90bde3";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Iban.php";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"767699246ea9dae9c99b112253ef0af0";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/IbanValidator.php";s:4:"role";s:3:"php";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c170ea25fe3922db43490b571011a438";s:4:"name";s:55:"Symfony/Component/Validator/Constraints/IdenticalTo.php";s:4:"role";s:3:"php";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"56257e543ffc3632a272b284cd7ceeda";s:4:"name";s:64:"Symfony/Component/Validator/Constraints/IdenticalToValidator.php";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"92f832be76aed1cfcd18d276ff45bce9";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Image.php";s:4:"role";s:3:"php";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a95e09bb82ad891054f0680144487871";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/ImageValidator.php";s:4:"role";s:3:"php";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1ff307af5e1d02b5da016f7fd3c64816";s:4:"name";s:46:"Symfony/Component/Validator/Constraints/Ip.php";s:4:"role";s:3:"php";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"66c5af8b916684cf0c166c280cb00aa5";s:4:"name";s:55:"Symfony/Component/Validator/Constraints/IpValidator.php";s:4:"role";s:3:"php";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0eb759966852ddb84bd6b24c967040b7";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Isbn.php";s:4:"role";s:3:"php";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ff5b531b2a454c10fce5ae7c0894a22a";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/IsbnValidator.php";s:4:"role";s:3:"php";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ee14ff1ba2ba521a7eb166ef651a1c75";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Issn.php";s:4:"role";s:3:"php";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"93a39aba6f6a4f5a23ea91108425fa07";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/IssnValidator.php";s:4:"role";s:3:"php";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5ba57bdea0848798ae8da31a78f1c072";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/Language.php";s:4:"role";s:3:"php";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"27e3692dbfe009a21c71f826e9ab7fe1";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/LanguageValidator.php";s:4:"role";s:3:"php";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1f0169f057954dec8280c2c4931b0a13";s:4:"name";s:50:"Symfony/Component/Validator/Constraints/Length.php";s:4:"role";s:3:"php";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"93de9c9c5ab7e3b8c19c671004a50ad4";s:4:"name";s:59:"Symfony/Component/Validator/Constraints/LengthValidator.php";s:4:"role";s:3:"php";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eb6377f01e9cc6440dfa4e183ef8c4ab";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/LessThan.php";s:4:"role";s:3:"php";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09d85d86e5798681d39dfe598df6c562";s:4:"name";s:59:"Symfony/Component/Validator/Constraints/LessThanOrEqual.php";s:4:"role";s:3:"php";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"564b53c3325126cc54ee9c14102b170a";s:4:"name";s:68:"Symfony/Component/Validator/Constraints/LessThanOrEqualValidator.php";s:4:"role";s:3:"php";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aa4623bfdf3d9d518660aeb634367252";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/LessThanValidator.php";s:4:"role";s:3:"php";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"de036e7a36b266c549985ededcb96344";s:4:"name";s:50:"Symfony/Component/Validator/Constraints/Locale.php";s:4:"role";s:3:"php";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4b3b59f35f25cb78b8b25a266d405986";s:4:"name";s:59:"Symfony/Component/Validator/Constraints/LocaleValidator.php";s:4:"role";s:3:"php";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"25dc43335a20b9a6e3b31b43a762e762";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Luhn.php";s:4:"role";s:3:"php";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f7360bdeef47916280c4e15ce1be91b1";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/LuhnValidator.php";s:4:"role";s:3:"php";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"868b62aca0723c3b457144aaf6c93a62";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/NotBlank.php";s:4:"role";s:3:"php";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d095cf646d98ffc63c8404b87dc64c3a";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/NotBlankValidator.php";s:4:"role";s:3:"php";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"54a792ce51e206d9f1f342acf8de0ca6";s:4:"name";s:54:"Symfony/Component/Validator/Constraints/NotEqualTo.php";s:4:"role";s:3:"php";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba17b4508a92681c1ecb989e31150989";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/NotEqualToValidator.php";s:4:"role";s:3:"php";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b0cf3bbae80822776f2ebe3853331da2";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/NotIdenticalTo.php";s:4:"role";s:3:"php";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3fb62be8d95c084095e2bb8354fa6cb2";s:4:"name";s:67:"Symfony/Component/Validator/Constraints/NotIdenticalToValidator.php";s:4:"role";s:3:"php";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1797b9ea7b21a35e5d2d1d68ca7fe157";s:4:"name";s:51:"Symfony/Component/Validator/Constraints/NotNull.php";s:4:"role";s:3:"php";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d7a3af7c2064d4ff44733151eef7630d";s:4:"name";s:60:"Symfony/Component/Validator/Constraints/NotNullValidator.php";s:4:"role";s:3:"php";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1c8478dc05ca6a3af5499c59220d99b0";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Null.php";s:4:"role";s:3:"php";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"412fc8b35206517d8c2844aec558d6f5";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/NullValidator.php";s:4:"role";s:3:"php";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"82b49cbb8deeed5086002af1d2e3d06f";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/Optional.php";s:4:"role";s:3:"php";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1875728a92acf358891dc559c15127fa";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Range.php";s:4:"role";s:3:"php";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5756018ef45c81919b3214d78b0e6eb4";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/RangeValidator.php";s:4:"role";s:3:"php";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f7a9e04cd4262d3f80fcbe70b9c4e806";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Regex.php";s:4:"role";s:3:"php";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea6c897666cc7a6af2ff4d913f82a392";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/RegexValidator.php";s:4:"role";s:3:"php";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"acbae820b5540dde9ec681dd85429861";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/Required.php";s:4:"role";s:3:"php";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"67b70d9e097e05da71488e09b6e90b95";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Time.php";s:4:"role";s:3:"php";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"334dffc652e93fa5bd706116c9b44257";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/TimeValidator.php";s:4:"role";s:3:"php";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a78e9cd61bb76287a0522b1e5b7b392b";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/True.php";s:4:"role";s:3:"php";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"637d4488ec6112faf64aae361929d040";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/TrueValidator.php";s:4:"role";s:3:"php";}}i:92;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d965c82e65e8289f8ecb88d83fc83de7";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Type.php";s:4:"role";s:3:"php";}}i:93;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9f24a3872c47a60f1a990c9f199e14c2";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/TypeValidator.php";s:4:"role";s:3:"php";}}i:94;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ee711e399a3f093e7b3545692ebf7f62";s:4:"name";s:47:"Symfony/Component/Validator/Constraints/Url.php";s:4:"role";s:3:"php";}}i:95;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"38d0b621d809fc73a63e73c9b2eec6f0";s:4:"name";s:56:"Symfony/Component/Validator/Constraints/UrlValidator.php";s:4:"role";s:3:"php";}}i:96;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1bb212699fe8609180681b51be678cd4";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Valid.php";s:4:"role";s:3:"php";}}i:97;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d599a1ef98a59cddd0952a2217e6a61a";s:4:"name";s:51:"Symfony/Component/Validator/ConstraintValidator.php";s:4:"role";s:3:"php";}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1dc05c3449f8ee63549a2672f762c635";s:4:"name";s:58:"Symfony/Component/Validator/ConstraintValidatorFactory.php";s:4:"role";s:3:"php";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f322ea75c86e7e0fe44bf0e55b45522e";s:4:"name";s:67:"Symfony/Component/Validator/ConstraintValidatorFactoryInterface.php";s:4:"role";s:3:"php";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"62e34e25daf9b43c27cd8111b2c10ede";s:4:"name";s:60:"Symfony/Component/Validator/ConstraintValidatorInterface.php";s:4:"role";s:3:"php";}}i:101;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"687daad19e5f43350617c063490aa100";s:4:"name";s:51:"Symfony/Component/Validator/ConstraintViolation.php";s:4:"role";s:3:"php";}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ef89d7f0cbae45ed31aa8a72fc13487d";s:4:"name";s:60:"Symfony/Component/Validator/ConstraintViolationInterface.php";s:4:"role";s:3:"php";}}i:103;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2c8b4b7b53a10d1f269c2ce53c7e901";s:4:"name";s:55:"Symfony/Component/Validator/ConstraintViolationList.php";s:4:"role";s:3:"php";}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"36c862c3c9a1e8e797fe4b6ef4c91546";s:4:"name";s:64:"Symfony/Component/Validator/ConstraintViolationListInterface.php";s:4:"role";s:3:"php";}}i:105;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4be17f7858f92496b9d0527bcd7cd720";s:4:"name";s:49:"Symfony/Component/Validator/DefaultTranslator.php";s:4:"role";s:3:"php";}}i:106;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e1602d2dcf95a9052da9a432db6c1875";s:4:"name";s:64:"Symfony/Component/Validator/Exception/BadMethodCallException.php";s:4:"role";s:3:"php";}}i:107;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5fcc0f865c77f52e9847378da9f0489c";s:4:"name";s:71:"Symfony/Component/Validator/Exception/ConstraintDefinitionException.php";s:4:"role";s:3:"php";}}i:108;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0b0c94ce85588dd563f8767426eafdcc";s:4:"name";s:60:"Symfony/Component/Validator/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:109;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ed9aa39f207cff711cb5c8fc86114395";s:4:"name";s:66:"Symfony/Component/Validator/Exception/GroupDefinitionException.php";s:4:"role";s:3:"php";}}i:110;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bd79de35ad0e084b8400e08793205a69";s:4:"name";s:66:"Symfony/Component/Validator/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";}}i:111;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7dcead75d21f8d0a56980c4a07d7aca4";s:4:"name";s:65:"Symfony/Component/Validator/Exception/InvalidOptionsException.php";s:4:"role";s:3:"php";}}i:112;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9f68ce5c519e7ae740485b54d04e1d51";s:4:"name";s:58:"Symfony/Component/Validator/Exception/MappingException.php";s:4:"role";s:3:"php";}}i:113;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b53533773e89efd08b4e8fee6b186579";s:4:"name";s:65:"Symfony/Component/Validator/Exception/MissingOptionsException.php";s:4:"role";s:3:"php";}}i:114;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e9bea930f7bceee8d7dde50dd85e9ba7";s:4:"name";s:65:"Symfony/Component/Validator/Exception/NoSuchMetadataException.php";s:4:"role";s:3:"php";}}i:115;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"99d749d07f412b89d5af760e96666226";s:4:"name";s:58:"Symfony/Component/Validator/Exception/RuntimeException.php";s:4:"role";s:3:"php";}}i:116;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"49ee74315300fe571873b44bdd13e171";s:4:"name";s:65:"Symfony/Component/Validator/Exception/UnexpectedTypeException.php";s:4:"role";s:3:"php";}}i:117;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a0a8b64183db5f06140fbe08503efdaf";s:4:"name";s:60:"Symfony/Component/Validator/Exception/ValidatorException.php";s:4:"role";s:3:"php";}}i:118;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"915a47ef778253a6c7a1e2a2528aa996";s:4:"name";s:48:"Symfony/Component/Validator/ExecutionContext.php";s:4:"role";s:3:"php";}}i:119;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"676e8179bba9e6d350680ef1ea759b9e";s:4:"name";s:57:"Symfony/Component/Validator/ExecutionContextInterface.php";s:4:"role";s:3:"php";}}i:120;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ca92e46f393618f0efc6954ca2466939";s:4:"name";s:63:"Symfony/Component/Validator/GlobalExecutionContextInterface.php";s:4:"role";s:3:"php";}}i:121;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"381af269f7e5fb28e87a5c81a3707621";s:4:"name";s:62:"Symfony/Component/Validator/GroupSequenceProviderInterface.php";s:4:"role";s:3:"php";}}i:122;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:35:"Symfony/Component/Validator/LICENSE";s:4:"role";s:3:"doc";}}i:123;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4ff2d258e293c0d3347a56678051e8d3";s:4:"name";s:64:"Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php";s:4:"role";s:3:"php";}}i:124;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"462497cd0cf5d29d523b5a0d75b81ca0";s:4:"name";s:54:"Symfony/Component/Validator/Mapping/Cache/ApcCache.php";s:4:"role";s:3:"php";}}i:125;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8a7b01dab83206f30d02ceb5ccc8c171";s:4:"name";s:60:"Symfony/Component/Validator/Mapping/Cache/CacheInterface.php";s:4:"role";s:3:"php";}}i:126;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b7ce80520c8d175471f396247948cdc3";s:4:"name";s:53:"Symfony/Component/Validator/Mapping/ClassMetadata.php";s:4:"role";s:3:"php";}}i:127;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b708c68549204312c540ee7dacb9ad87";s:4:"name";s:60:"Symfony/Component/Validator/Mapping/ClassMetadataFactory.php";s:4:"role";s:3:"php";}}i:128;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6d8a4315440eca7b33bee8a2c2df3cf0";s:4:"name";s:55:"Symfony/Component/Validator/Mapping/ElementMetadata.php";s:4:"role";s:3:"php";}}i:129;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"66734470bd1916de0ca3f01784364005";s:4:"name";s:54:"Symfony/Component/Validator/Mapping/GetterMetadata.php";s:4:"role";s:3:"php";}}i:130;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4aafbfbbc0d5d5430ee20aff7da60f5c";s:4:"name";s:61:"Symfony/Component/Validator/Mapping/Loader/AbstractLoader.php";s:4:"role";s:3:"php";}}i:131;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8ad79406bc548394a200e712dee0c30f";s:4:"name";s:63:"Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php";s:4:"role";s:3:"php";}}i:132;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9b4a61c8b30fae02788429854ba81036";s:4:"name";s:57:"Symfony/Component/Validator/Mapping/Loader/FileLoader.php";s:4:"role";s:3:"php";}}i:133;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4af7f07bfcfa849e66999ab1ee24f876";s:4:"name";s:58:"Symfony/Component/Validator/Mapping/Loader/FilesLoader.php";s:4:"role";s:3:"php";}}i:134;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8b284df5873ac5725b5c4705b69d530b";s:4:"name";s:58:"Symfony/Component/Validator/Mapping/Loader/LoaderChain.php";s:4:"role";s:3:"php";}}i:135;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d202e225a6b817c2829e10f98d04abdd";s:4:"name";s:62:"Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php";s:4:"role";s:3:"php";}}i:136;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2f1f4e105fe3d987790a62d0a36ace39";s:4:"name";s:99:"Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd";s:4:"role";s:3:"php";}}i:137;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1005146f217d0bcdaabe67f3c3e9c225";s:4:"name";s:65:"Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php";s:4:"role";s:3:"php";}}i:138;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c8d1f2225f940f29028386fe2fbbfe7a";s:4:"name";s:60:"Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php";s:4:"role";s:3:"php";}}i:139;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"31fdec6936f6c041c6c9d4a3d3cec86e";s:4:"name";s:61:"Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php";s:4:"role";s:3:"php";}}i:140;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a712b89ff6fe80354296a3b399c6139f";s:4:"name";s:61:"Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php";s:4:"role";s:3:"php";}}i:141;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8db3ad3b587098ac95ad6d25317c2e9c";s:4:"name";s:62:"Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php";s:4:"role";s:3:"php";}}i:142;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8c45e691d8e03b05b3a893e3acdb5a0f";s:4:"name";s:54:"Symfony/Component/Validator/Mapping/MemberMetadata.php";s:4:"role";s:3:"php";}}i:143;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f44bb51a8950d588ae2dd0ab7bf17a1f";s:4:"name";s:56:"Symfony/Component/Validator/Mapping/PropertyMetadata.php";s:4:"role";s:3:"php";}}i:144;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4db44d9e04ab20b9b5757aaac84e4aa7";s:4:"name";s:56:"Symfony/Component/Validator/MetadataFactoryInterface.php";s:4:"role";s:3:"php";}}i:145;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ee339e11db2658139a134c3824c8afd7";s:4:"name";s:49:"Symfony/Component/Validator/MetadataInterface.php";s:4:"role";s:3:"php";}}i:146;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"00b9e5fab71633739ff82314900aa9c9";s:4:"name";s:58:"Symfony/Component/Validator/ObjectInitializerInterface.php";s:4:"role";s:3:"php";}}i:147;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"78843eae0d52d5f5909f1087a44295b7";s:4:"name";s:44:"Symfony/Component/Validator/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:148;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6e7e28f7b1ff78536561fcda9521b4dc";s:4:"name";s:66:"Symfony/Component/Validator/PropertyMetadataContainerInterface.php";s:4:"role";s:3:"php";}}i:149;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f6c682d20098aac0b0502374eaa79df1";s:4:"name";s:57:"Symfony/Component/Validator/PropertyMetadataInterface.php";s:4:"role";s:3:"php";}}i:150;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"909b0bb88dcdb6cdee5dce42ec11e0d8";s:4:"name";s:37:"Symfony/Component/Validator/README.md";s:4:"role";s:3:"doc";}}i:151;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c23dd67e56958cc57e1147fce770d730";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.af.xlf";s:4:"role";s:3:"php";}}i:152;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2a03a4464216db4d71c91a1fd5f0c696";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.ar.xlf";s:4:"role";s:3:"php";}}i:153;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d4011977e7d9fed5e3c57c9b5e09077e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.bg.xlf";s:4:"role";s:3:"php";}}i:154;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a17496bce86c96c7d447a148b2d29e8a";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.ca.xlf";s:4:"role";s:3:"php";}}i:155;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bbda69a9cc105df6d0e915e93ea4de6d";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.cs.xlf";s:4:"role";s:3:"php";}}i:156;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"117e80d2ecc0ed11fe07dcef7d023d3f";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.cy.xlf";s:4:"role";s:3:"php";}}i:157;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"793dcd9686793b163ac089ce11e98f35";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.da.xlf";s:4:"role";s:3:"php";}}i:158;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7645ad8b8789c647baf9d713603dcc4e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.de.xlf";s:4:"role";s:3:"php";}}i:159;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"84e8b57b7cd181c41a9f2c609d9d2fcf";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.el.xlf";s:4:"role";s:3:"php";}}i:160;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f6b79a83f78a4d434657c2246bfa3299";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.en.xlf";s:4:"role";s:3:"php";}}i:161;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6d37d37db86c98e7c2c0058e8ca627d5";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.es.xlf";s:4:"role";s:3:"php";}}i:162;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"51f14210b3a9c9a53edaee7055d04e0e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.et.xlf";s:4:"role";s:3:"php";}}i:163;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2af5064bdebe03bb807ff16385d5d06e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.eu.xlf";s:4:"role";s:3:"php";}}i:164;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1e07a45e3288a48103d69c34ab9e61e6";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.fa.xlf";s:4:"role";s:3:"php";}}i:165;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"46b3152b9dd89f59e42e0e72844a12ec";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.fi.xlf";s:4:"role";s:3:"php";}}i:166;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47603272bbc1c04e050be6413d350d02";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.fr.xlf";s:4:"role";s:3:"php";}}i:167;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f86071db1ba3ea2ff60161e5cc8b5e71";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.gl.xlf";s:4:"role";s:3:"php";}}i:168;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"88b6ab9440768505c046b7ef1309dd2e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.he.xlf";s:4:"role";s:3:"php";}}i:169;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a37851b29fd856938b8029924661c408";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.hr.xlf";s:4:"role";s:3:"php";}}i:170;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0b4a4f159d4577d218cf405a8b69f48e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.hu.xlf";s:4:"role";s:3:"php";}}i:171;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"822214a574b126ce160d5caed2a08175";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.hy.xlf";s:4:"role";s:3:"php";}}i:172;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"72642d91259f21b72dd1bf1005ebac4e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.id.xlf";s:4:"role";s:3:"php";}}i:173;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"96673a4cfc1e20bf2417dff5f41093c3";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.it.xlf";s:4:"role";s:3:"php";}}i:174;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"26ce7bce56a82a9ae623a109bcb3c47d";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.ja.xlf";s:4:"role";s:3:"php";}}i:175;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9c0e28952956db6812685e121ea2c010";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.lb.xlf";s:4:"role";s:3:"php";}}i:176;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8633947d9242120d0b273bedd0044c6b";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.lt.xlf";s:4:"role";s:3:"php";}}i:177;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5d6b61cab4e816991ff98ff64821dbc9";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.mn.xlf";s:4:"role";s:3:"php";}}i:178;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fc5bde0bb7a5dfafb1a061dd38dd335a";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.nb.xlf";s:4:"role";s:3:"php";}}i:179;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8620371a13ed6d660f8daafbefdf55a4";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.nl.xlf";s:4:"role";s:3:"php";}}i:180;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4a7aefa9d1b652a741d38936701a7bea";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.no.xlf";s:4:"role";s:3:"php";}}i:181;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"43cadc96e23d6bb270ccde1e20cd3940";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.pl.xlf";s:4:"role";s:3:"php";}}i:182;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"807707efabc65ad9992ff9b79531b1ec";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.pt.xlf";s:4:"role";s:3:"php";}}i:183;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86ef4e2fd4d0ca78e4aff92a496d6750";s:4:"name";s:71:"Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf";s:4:"role";s:3:"php";}}i:184;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"710b8a67f921af1756390e5c16732043";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.ro.xlf";s:4:"role";s:3:"php";}}i:185;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"60f16b6952726dfd1f92d3764bad85a5";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.ru.xlf";s:4:"role";s:3:"php";}}i:186;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fb5f5e62d477c3790fdba5fbc97fc238";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.sk.xlf";s:4:"role";s:3:"php";}}i:187;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e6a4af47341fa4c1b79e73b869df66b9";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.sl.xlf";s:4:"role";s:3:"php";}}i:188;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1f2fb26d0dd0131a51f36f7107c8bac2";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.sq.xlf";s:4:"role";s:3:"php";}}i:189;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8bc6bb4b4b0ff9d03446c0c0ffd49983";s:4:"name";s:73:"Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf";s:4:"role";s:3:"php";}}i:190;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"243a40ad3d4d74eed428066e6d6e7ef0";s:4:"name";s:73:"Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf";s:4:"role";s:3:"php";}}i:191;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ad1dd35b2ceccaa8a744ff08ebb1c759";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.sv.xlf";s:4:"role";s:3:"php";}}i:192;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a51133637a933c33aa1c7be7bc2c8f90";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.tr.xlf";s:4:"role";s:3:"php";}}i:193;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a4ec8b32ecc077c50c875fc46eec46b";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.uk.xlf";s:4:"role";s:3:"php";}}i:194;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"65930b6493ef965d3721753893c549b8";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.vi.xlf";s:4:"role";s:3:"php";}}i:195;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8ea9d18b4b8b0e0973d4461e4a4b31cf";s:4:"name";s:71:"Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf";s:4:"role";s:3:"php";}}i:196;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"336e3f4fcb54962d47342a9c58e80367";s:4:"name";s:71:"Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlf";s:4:"role";s:3:"php";}}i:197;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"df674acd306f8fa14a401b024b9bdc7f";s:4:"name";s:85:"Symfony/Component/Validator/Tests/Constraints/AbstractComparisonValidatorTestCase.php";s:4:"role";s:4:"test";}}i:198;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1179a8a955d42d44c8ed974c1819fb2e";s:4:"name";s:57:"Symfony/Component/Validator/Tests/Constraints/AllTest.php";s:4:"role";s:4:"test";}}i:199;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"96d4e47954bfb402594f16426d7d00ec";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Constraints/AllValidatorTest.php";s:4:"role";s:4:"test";}}i:200;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b269201734d4f62ecf56991d0ca84714";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php";s:4:"role";s:4:"test";}}i:201;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d5b9313f897e13ecc42be33565e6a835";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/CallbackValidatorTest.php";s:4:"role";s:4:"test";}}i:202;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"43d071b4c94aa19cfd7c010958397284";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php";s:4:"role";s:4:"test";}}i:203;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e16564bb61b350db55712205e43c2ee7";s:4:"name";s:69:"Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php";s:4:"role";s:4:"test";}}i:204;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"71210b53ae36ca85b8cab158c1cdc5f3";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Constraints/CollectionTest.php";s:4:"role";s:4:"test";}}i:205;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0b20dac6c8b275500c652f1e9726f68e";s:4:"name";s:84:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayObjectTest.php";s:4:"role";s:4:"test";}}i:206;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f860057334309da67249317f86faf070";s:4:"name";s:78:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayTest.php";s:4:"role";s:4:"test";}}i:207;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"83079c79103474984cdabd95062b7d03";s:4:"name";s:90:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorCustomArrayObjectTest.php";s:4:"role";s:4:"test";}}i:208;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"abb52acdf76b84de090fd27d778abc25";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php";s:4:"role";s:4:"test";}}i:209;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"088335785b72fe09bb08a78cb174a9b8";s:4:"name";s:70:"Symfony/Component/Validator/Tests/Constraints/CountryValidatorTest.php";s:4:"role";s:4:"test";}}i:210;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"81cfd6f9c23a49e571849bbf93242d45";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/CountValidatorArrayTest.php";s:4:"role";s:4:"test";}}i:211;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"31cd334579c8f399f099aaae60e0daf8";s:4:"name";s:77:"Symfony/Component/Validator/Tests/Constraints/CountValidatorCountableTest.php";s:4:"role";s:4:"test";}}i:212;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2baf2ba710f51a96efb9dfdf4e8e1b90";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/CountValidatorTest.php";s:4:"role";s:4:"test";}}i:213;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6f443701a1d6c8b3e6e56fb330da132e";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/CurrencyValidatorTest.php";s:4:"role";s:4:"test";}}i:214;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ff807a49e3f2b98577ba78573388e54d";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php";s:4:"role";s:4:"test";}}i:215;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86f3b37b7d92d05b0f6e20b355d2612c";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php";s:4:"role";s:4:"test";}}i:216;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7a87cf58056325eae85ff00bf9a938ed";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php";s:4:"role";s:4:"test";}}i:217;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7893495310cce59b359b7b0b283dfc5c";s:4:"name";s:70:"Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php";s:4:"role";s:4:"test";}}i:218;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8df8fad7f1e3f234cd3f70cfab62dd7c";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php";s:4:"role";s:4:"test";}}i:219;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"24905eea4858997f8247238e243632a8";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php";s:4:"role";s:4:"test";}}i:220;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"89a984927585c53fe1032b9f636133ff";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/FileValidatorObjectTest.php";s:4:"role";s:4:"test";}}i:221;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8a4da84c8f7e8ef54b806bd808bcc0c5";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php";s:4:"role";s:4:"test";}}i:222;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63c0fea7da6af037f5c07e530c4daba6";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php";s:4:"role";s:4:"test";}}i:223;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"583932c265a6b3fc7b64e3ce5781d982";s:4:"name";s:63:"Symfony/Component/Validator/Tests/Constraints/Fixtures/test.gif";s:4:"role";s:4:"test";}}i:224;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fdcf796bda19a6af822251135ba90fc1";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/Fixtures/test_landscape.gif";s:4:"role";s:4:"test";}}i:225;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0aeea019389321d9f37b03634b480bc3";s:4:"name";s:72:"Symfony/Component/Validator/Tests/Constraints/Fixtures/test_portrait.gif";s:4:"role";s:4:"test";}}i:226;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7c9ea0cc06b77db6e3ad76e02dfb250f";s:4:"name";s:81:"Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php";s:4:"role";s:4:"test";}}i:227;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3c4700309337c186d07c5db8620a7f16";s:4:"name";s:74:"Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php";s:4:"role";s:4:"test";}}i:228;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"24a0a471799799b4dabe807fcb55eef4";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php";s:4:"role";s:4:"test";}}i:229;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"158ec986b80be1639be50889f6d1a755";s:4:"name";s:74:"Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php";s:4:"role";s:4:"test";}}i:230;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"78dec98020821252b9a0e1cdd237c9b8";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php";s:4:"role";s:4:"test";}}i:231;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b2b8bde3a236afaa56a0efc95040457b";s:4:"name";s:65:"Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php";s:4:"role";s:4:"test";}}i:232;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e2e478a4e70021c8be50511adb544e17";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/IsbnValidatorTest.php";s:4:"role";s:4:"test";}}i:233;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e442a58274f84d70010c01704f2be5eb";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/IssnValidatorTest.php";s:4:"role";s:4:"test";}}i:234;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c000845e88198140e3a2e265ae4b5682";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php";s:4:"role";s:4:"test";}}i:235;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cd2e05c3024174f384f7034838eaa1f5";s:4:"name";s:69:"Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php";s:4:"role";s:4:"test";}}i:236;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2f4d2435eefd4ba92994fbc4c725a203";s:4:"name";s:78:"Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php";s:4:"role";s:4:"test";}}i:237;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d82f8a856a9d95cd7a6d8fd6a0734981";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php";s:4:"role";s:4:"test";}}i:238;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3debe15a84780f2383a690dfbb867a1d";s:4:"name";s:69:"Symfony/Component/Validator/Tests/Constraints/LocaleValidatorTest.php";s:4:"role";s:4:"test";}}i:239;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8fff3ed85f1a0ea2f1414606d66031aa";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php";s:4:"role";s:4:"test";}}i:240;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d26340b6b9e5ddf8d71968b27c288db2";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php";s:4:"role";s:4:"test";}}i:241;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"002a50c1e4557d0b89860f47c279fc74";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php";s:4:"role";s:4:"test";}}i:242;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4ea56306c1dbab2f83e077512a59a769";s:4:"name";s:77:"Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php";s:4:"role";s:4:"test";}}i:243;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b3e3c45f358f75c450c27bcf9a046576";s:4:"name";s:70:"Symfony/Component/Validator/Tests/Constraints/NotNullValidatorTest.php";s:4:"role";s:4:"test";}}i:244;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e8e343b9fb22cecd94a9a08b993d0c3a";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php";s:4:"role";s:4:"test";}}i:245;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f02807065a8b9e4e578ec2e806cb9b81";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php";s:4:"role";s:4:"test";}}i:246;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"457e33f80230fd2eebaa65404aa0f085";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php";s:4:"role";s:4:"test";}}i:247;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9943acc92b78efc760c440e0f8d94998";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php";s:4:"role";s:4:"test";}}i:248;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fe42e8bb7b68a0bb8aae4325746f2bf9";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php";s:4:"role";s:4:"test";}}i:249;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"61b6a4967362f4ac3dcbecbdcbf11156";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php";s:4:"role";s:4:"test";}}i:250;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c61759a19cd93a2d382d40ac2e689acd";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php";s:4:"role";s:4:"test";}}i:251;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2d93246dad9e589df5a83163e06fb877";s:4:"name";s:59:"Symfony/Component/Validator/Tests/Constraints/ValidTest.php";s:4:"role";s:4:"test";}}i:252;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"142a99b58afedf51b2c454fff02a65f3";s:4:"name";s:52:"Symfony/Component/Validator/Tests/ConstraintTest.php";s:4:"role";s:4:"test";}}i:253;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0584669a9a12dcadae796248aa9b42ff";s:4:"name";s:65:"Symfony/Component/Validator/Tests/ConstraintViolationListTest.php";s:4:"role";s:4:"test";}}i:254;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1319acdb0db4325c870ae4972e13efae";s:4:"name";s:61:"Symfony/Component/Validator/Tests/ConstraintViolationTest.php";s:4:"role";s:4:"test";}}i:255;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5aaa025907f20560822461a587c25457";s:4:"name";s:58:"Symfony/Component/Validator/Tests/ExecutionContextTest.php";s:4:"role";s:4:"test";}}i:256;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9454ace17fc81c19efac384cf4c50713";s:4:"name";s:60:"Symfony/Component/Validator/Tests/Fixtures/CallbackClass.php";s:4:"role";s:4:"test";}}i:257;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2ce3e43d62dc225654afccb6614717be";s:4:"name";s:62:"Symfony/Component/Validator/Tests/Fixtures/ClassConstraint.php";s:4:"role";s:4:"test";}}i:258;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d4169102f57729661cb27febaab2d23f";s:4:"name";s:58:"Symfony/Component/Validator/Tests/Fixtures/ConstraintA.php";s:4:"role";s:4:"test";}}i:259;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e2c1daf935b4f95134c33129662adf08";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php";s:4:"role";s:4:"test";}}i:260;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0157e96965ab4870f6965fbfa96a1612";s:4:"name";s:58:"Symfony/Component/Validator/Tests/Fixtures/ConstraintB.php";s:4:"role";s:4:"test";}}i:261;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8cd11e6488e0bce8f9c4de961754b500";s:4:"name";s:58:"Symfony/Component/Validator/Tests/Fixtures/ConstraintC.php";s:4:"role";s:4:"test";}}i:262;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2576db20cea1031e94f9b93ef5f9303a";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Fixtures/ConstraintWithValue.php";s:4:"role";s:4:"test";}}i:263;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7763c0812a069714f24f431567726500";s:4:"name";s:75:"Symfony/Component/Validator/Tests/Fixtures/ConstraintWithValueAsDefault.php";s:4:"role";s:4:"test";}}i:264;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6b6e6d9a60b2254024c55566fe79b08f";s:4:"name";s:53:"Symfony/Component/Validator/Tests/Fixtures/Entity.php";s:4:"role";s:4:"test";}}i:265;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea31fab8aec5a8884f460f66daf7c993";s:4:"name";s:62:"Symfony/Component/Validator/Tests/Fixtures/EntityInterface.php";s:4:"role";s:4:"test";}}i:266;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a66c0953945928c193165c50757bcf04";s:4:"name";s:59:"Symfony/Component/Validator/Tests/Fixtures/EntityParent.php";s:4:"role";s:4:"test";}}i:267;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"72db5eaa66dc69f67e2d4ad5eb82b0e8";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Fixtures/FailingConstraint.php";s:4:"role";s:4:"test";}}i:268;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c97e5a72d1d2befa96bea40821ec2c3a";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php";s:4:"role";s:4:"test";}}i:269;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"edcb2a57ff4308821104e31a3ffd5167";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Fixtures/FakeMetadataFactory.php";s:4:"role";s:4:"test";}}i:270;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"068493fec3128c8cb2d29f6c5b0eaad0";s:4:"name";s:58:"Symfony/Component/Validator/Tests/Fixtures/FilesLoader.php";s:4:"role";s:4:"test";}}i:271;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ad8147295941a1cc399da4034cd61c49";s:4:"name";s:74:"Symfony/Component/Validator/Tests/Fixtures/GroupSequenceProviderEntity.php";s:4:"role";s:4:"test";}}i:272;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ddb0895d24c9c089229b3b932538aabd";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Fixtures/InvalidConstraint.php";s:4:"role";s:4:"test";}}i:273;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5681169dbdca0c79b579401520a7173d";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Fixtures/InvalidConstraintValidator.php";s:4:"role";s:4:"test";}}i:274;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fbc643d2960104a96a86a281f0d099bb";s:4:"name";s:65:"Symfony/Component/Validator/Tests/Fixtures/PropertyConstraint.php";s:4:"role";s:4:"test";}}i:275;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9d6e84977cc653a0673858a764ec39d6";s:4:"name";s:56:"Symfony/Component/Validator/Tests/Fixtures/Reference.php";s:4:"role";s:4:"test";}}i:276;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7353a9cae56c607794bee8094e41ffd4";s:4:"name";s:74:"Symfony/Component/Validator/Tests/Mapping/BlackholeMetadataFactoryTest.php";s:4:"role";s:4:"test";}}i:277;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d720776b21d7ce674a7365e5d2e38d2";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Mapping/Cache/ApcCacheTest.php";s:4:"role";s:4:"test";}}i:278;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9fe738a4b6ba7f5105f2190fd449268e";s:4:"name";s:70:"Symfony/Component/Validator/Tests/Mapping/ClassMetadataFactoryTest.php";s:4:"role";s:4:"test";}}i:279;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a4495fa7cfe81f702f45d66a7fca8617";s:4:"name";s:63:"Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php";s:4:"role";s:4:"test";}}i:280;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4384111241f1abc0445a06c539451f2a";s:4:"name";s:65:"Symfony/Component/Validator/Tests/Mapping/ElementMetadataTest.php";s:4:"role";s:4:"test";}}i:281;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d7f74984a4455152140bed27936361c0";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Mapping/GetterMetadataTest.php";s:4:"role";s:4:"test";}}i:282;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0175b97f1eb69fcce94b306e900db362";s:4:"name";s:79:"Symfony/Component/Validator/Tests/Mapping/Loader/AbstractMethodStaticLoader.php";s:4:"role";s:4:"test";}}i:283;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"05410e4aaaf0a9a25ddc5c4134924390";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Mapping/Loader/AnnotationLoaderTest.php";s:4:"role";s:4:"test";}}i:284;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c75233f90b5cfa4a398e1f9e543bf5bc";s:4:"name";s:83:"Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping-non-strings.xml";s:4:"role";s:4:"test";}}i:285;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"16ec478e3cf1b1bc1cab57aed6dadc6a";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.xml";s:4:"role";s:4:"test";}}i:286;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7643e62f12cd427f2b5fd1fa9a5f6133";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.yml";s:4:"role";s:4:"test";}}i:287;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Mapping/Loader/empty-mapping.yml";s:4:"role";s:4:"test";}}i:288;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3bcfc4369f23356627bddd2555552d7f";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Mapping/Loader/FilesLoaderTest.php";s:4:"role";s:4:"test";}}i:289;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e28f9bc1f67084ac7661410da1fceaed";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Mapping/Loader/LoaderChainTest.php";s:4:"role";s:4:"test";}}i:290;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d3b07384d113edec49eaa6238ad5ff00";s:4:"name";s:69:"Symfony/Component/Validator/Tests/Mapping/Loader/nonvalid-mapping.yml";s:4:"role";s:4:"test";}}i:291;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"561fb1c6e9ee5b4de0ab14129619af6f";s:4:"name";s:75:"Symfony/Component/Validator/Tests/Mapping/Loader/StaticMethodLoaderTest.php";s:4:"role";s:4:"test";}}i:292;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bf3a0038b2c219b56536ee96a18b5f7d";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Mapping/Loader/withdoctype.xml";s:4:"role";s:4:"test";}}i:293;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fee7255c9f688a416d2fe1d34a1e3389";s:4:"name";s:70:"Symfony/Component/Validator/Tests/Mapping/Loader/XmlFileLoaderTest.php";s:4:"role";s:4:"test";}}i:294;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"adc321984d79e773e10da8b4a1d2cbd4";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Mapping/Loader/YamlFileLoaderTest.php";s:4:"role";s:4:"test";}}i:295;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b60229644c0267c6db54c14164b8d4c6";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Mapping/MemberMetadataTest.php";s:4:"role";s:4:"test";}}i:296;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"58769dbf877b4372cf5f4b418bee5d1a";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php";s:4:"role";s:4:"test";}}i:297;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4380de8196121010c2219a131015c0bd";s:4:"name";s:59:"Symfony/Component/Validator/Tests/ValidationVisitorTest.php";s:4:"role";s:4:"test";}}i:298;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b599d3d7e28f3c31dd64a8e4a461798";s:4:"name";s:58:"Symfony/Component/Validator/Tests/ValidatorBuilderTest.php";s:4:"role";s:4:"test";}}i:299;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c0d58093c8f48e173cf012832b5eff3d";s:4:"name";s:51:"Symfony/Component/Validator/Tests/ValidatorTest.php";s:4:"role";s:4:"test";}}i:300;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cb4be714363c679edca5adea512653db";s:4:"name";s:42:"Symfony/Component/Validator/Validation.php";s:4:"role";s:3:"php";}}i:301;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7c3d1976b86cb3bee62b80d06037a82c";s:4:"name";s:49:"Symfony/Component/Validator/ValidationVisitor.php";s:4:"role";s:3:"php";}}i:302;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d9246ccdbae1aac172f0b344b77a0a6c";s:4:"name";s:58:"Symfony/Component/Validator/ValidationVisitorInterface.php";s:4:"role";s:3:"php";}}i:303;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dab18aca325ae61509511a918442e133";s:4:"name";s:41:"Symfony/Component/Validator/Validator.php";s:4:"role";s:3:"php";}}i:304;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f3e3ae245a988856adea2ef86b30d27f";s:4:"name";s:48:"Symfony/Component/Validator/ValidatorBuilder.php";s:4:"role";s:3:"php";}}i:305;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f3528198e3b2790e1a7ffee686196923";s:4:"name";s:57:"Symfony/Component/Validator/ValidatorBuilderInterface.php";s:4:"role";s:3:"php";}}i:306;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7e994e15443d4bf79a747b6454bb5e76";s:4:"name";s:50:"Symfony/Component/Validator/ValidatorInterface.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}s:8:"optional";a:1:{s:7:"package";a:2:{i:0;a:2:{s:4:"name";s:4:"Yaml";s:7:"channel";s:16:"pear.symfony.com";}i:1;a:2:{s:4:"name";s:14:"HttpFoundation";s:7:"channel";s:16:"pear.symfony.com";}}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:307:{s:42:"Symfony/Component/Validator/autoloader.php";a:4:{s:6:"md5sum";s:32:"70881b5188a71a54eaaa5174d35b8a7d";s:4:"name";s:42:"Symfony/Component/Validator/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/autoloader.php";}s:40:"Symfony/Component/Validator/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"460bbf634d57fb9eb81d53f051e8ab23";s:4:"name";s:40:"Symfony/Component/Validator/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/doc/pear/Validator/Symfony/Component/Validator/CHANGELOG.md";}s:51:"Symfony/Component/Validator/ClassBasedInterface.php";a:4:{s:6:"md5sum";s:32:"9b310a8a94f594586e92f197f9c2b271";s:4:"name";s:51:"Symfony/Component/Validator/ClassBasedInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ClassBasedInterface.php";}s:41:"Symfony/Component/Validator/composer.json";a:4:{s:6:"md5sum";s:32:"3af3b2a12af30fa1161d400c5fa160db";s:4:"name";s:41:"Symfony/Component/Validator/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/doc/pear/Validator/Symfony/Component/Validator/composer.json";}s:42:"Symfony/Component/Validator/Constraint.php";a:4:{s:6:"md5sum";s:32:"4673b9af925a35c9c4bed05edab5facb";s:4:"name";s:42:"Symfony/Component/Validator/Constraint.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraint.php";}s:62:"Symfony/Component/Validator/Constraints/AbstractComparison.php";a:4:{s:6:"md5sum";s:32:"8aa49d6a48f577e0f496ed051e1e3e35";s:4:"name";s:62:"Symfony/Component/Validator/Constraints/AbstractComparison.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/AbstractComparison.php";}s:71:"Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php";a:4:{s:6:"md5sum";s:32:"cd63ee91f580c33ed3e5027672c447cf";s:4:"name";s:71:"Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php";}s:47:"Symfony/Component/Validator/Constraints/All.php";a:4:{s:6:"md5sum";s:32:"81fa182a1f3260d61a45e0c9a886300a";s:4:"name";s:47:"Symfony/Component/Validator/Constraints/All.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/All.php";}s:56:"Symfony/Component/Validator/Constraints/AllValidator.php";a:4:{s:6:"md5sum";s:32:"76ee8f2dd2d0a1ff7329ddd7f4e812a8";s:4:"name";s:56:"Symfony/Component/Validator/Constraints/AllValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/AllValidator.php";}s:49:"Symfony/Component/Validator/Constraints/Blank.php";a:4:{s:6:"md5sum";s:32:"77b52c16bd1289663a73f66f39190eed";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Blank.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Blank.php";}s:58:"Symfony/Component/Validator/Constraints/BlankValidator.php";a:4:{s:6:"md5sum";s:32:"6bf52b86aeb6e4b7e762994e61b30656";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/BlankValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/BlankValidator.php";}s:52:"Symfony/Component/Validator/Constraints/Callback.php";a:4:{s:6:"md5sum";s:32:"16cf9f642a14848b9bc3ef3b883f19d1";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/Callback.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Callback.php";}s:61:"Symfony/Component/Validator/Constraints/CallbackValidator.php";a:4:{s:6:"md5sum";s:32:"ad21e0f04423e82992c83f14e893779e";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/CallbackValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/CallbackValidator.php";}s:54:"Symfony/Component/Validator/Constraints/CardScheme.php";a:4:{s:6:"md5sum";s:32:"056ebff8baa348be8202ca6b297c4d01";s:4:"name";s:54:"Symfony/Component/Validator/Constraints/CardScheme.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/CardScheme.php";}s:63:"Symfony/Component/Validator/Constraints/CardSchemeValidator.php";a:4:{s:6:"md5sum";s:32:"284da971d7406e599a1233b2d2206376";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/CardSchemeValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/CardSchemeValidator.php";}s:50:"Symfony/Component/Validator/Constraints/Choice.php";a:4:{s:6:"md5sum";s:32:"49d0c082a54602ac483ce2afffb57431";s:4:"name";s:50:"Symfony/Component/Validator/Constraints/Choice.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Choice.php";}s:59:"Symfony/Component/Validator/Constraints/ChoiceValidator.php";a:4:{s:6:"md5sum";s:32:"c6988852a1c710e4832e4a0cf5f465ed";s:4:"name";s:59:"Symfony/Component/Validator/Constraints/ChoiceValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/ChoiceValidator.php";}s:63:"Symfony/Component/Validator/Constraints/Collection/Optional.php";a:4:{s:6:"md5sum";s:32:"09520f3d5eacb03f804fadf2d0afd2d2";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/Collection/Optional.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Collection/Optional.php";}s:63:"Symfony/Component/Validator/Constraints/Collection/Required.php";a:4:{s:6:"md5sum";s:32:"a084bfe09407f23250f410ed4c00c05f";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/Collection/Required.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Collection/Required.php";}s:54:"Symfony/Component/Validator/Constraints/Collection.php";a:4:{s:6:"md5sum";s:32:"5ca5192af79d7355af8a4017b671a8fb";s:4:"name";s:54:"Symfony/Component/Validator/Constraints/Collection.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Collection.php";}s:63:"Symfony/Component/Validator/Constraints/CollectionValidator.php";a:4:{s:6:"md5sum";s:32:"2a15094f63da567965053d81cec8b6bc";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/CollectionValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/CollectionValidator.php";}s:49:"Symfony/Component/Validator/Constraints/Count.php";a:4:{s:6:"md5sum";s:32:"d60afc2a00394329890f41050239d6be";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Count.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Count.php";}s:51:"Symfony/Component/Validator/Constraints/Country.php";a:4:{s:6:"md5sum";s:32:"8912e6648f1801a81237b64ad79beea8";s:4:"name";s:51:"Symfony/Component/Validator/Constraints/Country.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Country.php";}s:60:"Symfony/Component/Validator/Constraints/CountryValidator.php";a:4:{s:6:"md5sum";s:32:"5a7bd5263e9707dd6acab56907453cb4";s:4:"name";s:60:"Symfony/Component/Validator/Constraints/CountryValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/CountryValidator.php";}s:58:"Symfony/Component/Validator/Constraints/CountValidator.php";a:4:{s:6:"md5sum";s:32:"b63f576f4acf1cf05dd4a10b8dcdf613";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/CountValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/CountValidator.php";}s:52:"Symfony/Component/Validator/Constraints/Currency.php";a:4:{s:6:"md5sum";s:32:"dd7316794387746194d2d2fb42b7eb7f";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/Currency.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Currency.php";}s:61:"Symfony/Component/Validator/Constraints/CurrencyValidator.php";a:4:{s:6:"md5sum";s:32:"9dfda60fe4dedc960dec518bcdf21a7f";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/CurrencyValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/CurrencyValidator.php";}s:48:"Symfony/Component/Validator/Constraints/Date.php";a:4:{s:6:"md5sum";s:32:"5e1a2350fefabcba23f44ced82b9e830";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Date.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Date.php";}s:52:"Symfony/Component/Validator/Constraints/DateTime.php";a:4:{s:6:"md5sum";s:32:"7146e3c517edfd501fdec3734e5a6f55";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/DateTime.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/DateTime.php";}s:61:"Symfony/Component/Validator/Constraints/DateTimeValidator.php";a:4:{s:6:"md5sum";s:32:"113eb18edd006507eb982c46d58fa85f";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/DateTimeValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/DateTimeValidator.php";}s:57:"Symfony/Component/Validator/Constraints/DateValidator.php";a:4:{s:6:"md5sum";s:32:"b2d3caa73ec728ede046f0358cf001a0";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/DateValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/DateValidator.php";}s:49:"Symfony/Component/Validator/Constraints/Email.php";a:4:{s:6:"md5sum";s:32:"3aa9b1e92fed777c1439d01d7eb6af23";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Email.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Email.php";}s:58:"Symfony/Component/Validator/Constraints/EmailValidator.php";a:4:{s:6:"md5sum";s:32:"01b056747cb908f564510334d5cf80fb";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/EmailValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/EmailValidator.php";}s:51:"Symfony/Component/Validator/Constraints/EqualTo.php";a:4:{s:6:"md5sum";s:32:"1203a215e52460149441441579253d47";s:4:"name";s:51:"Symfony/Component/Validator/Constraints/EqualTo.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/EqualTo.php";}s:60:"Symfony/Component/Validator/Constraints/EqualToValidator.php";a:4:{s:6:"md5sum";s:32:"85299aea76d2e9973c0a2a1f39796640";s:4:"name";s:60:"Symfony/Component/Validator/Constraints/EqualToValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/EqualToValidator.php";}s:53:"Symfony/Component/Validator/Constraints/Existence.php";a:4:{s:6:"md5sum";s:32:"5bf3ff6df741685faf77a3568bb8b633";s:4:"name";s:53:"Symfony/Component/Validator/Constraints/Existence.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Existence.php";}s:54:"Symfony/Component/Validator/Constraints/Expression.php";a:4:{s:6:"md5sum";s:32:"900f7ff58ceb2ae76007bb5a6394d921";s:4:"name";s:54:"Symfony/Component/Validator/Constraints/Expression.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Expression.php";}s:63:"Symfony/Component/Validator/Constraints/ExpressionValidator.php";a:4:{s:6:"md5sum";s:32:"3ede516fce7c1f487d08359ba11ae2ff";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/ExpressionValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/ExpressionValidator.php";}s:49:"Symfony/Component/Validator/Constraints/False.php";a:4:{s:6:"md5sum";s:32:"09d73194877b4dda8d4300f24e195013";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/False.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/False.php";}s:58:"Symfony/Component/Validator/Constraints/FalseValidator.php";a:4:{s:6:"md5sum";s:32:"79467bb4ee325740c202f9c8b97010a9";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/FalseValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/FalseValidator.php";}s:48:"Symfony/Component/Validator/Constraints/File.php";a:4:{s:6:"md5sum";s:32:"6e8e581ad9077fb13150682285df29b1";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/File.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/File.php";}s:57:"Symfony/Component/Validator/Constraints/FileValidator.php";a:4:{s:6:"md5sum";s:32:"d08c81702c68afd2c2757543f7d5193b";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/FileValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/FileValidator.php";}s:55:"Symfony/Component/Validator/Constraints/GreaterThan.php";a:4:{s:6:"md5sum";s:32:"79767d486e626e5c77b78bd7afe4aee9";s:4:"name";s:55:"Symfony/Component/Validator/Constraints/GreaterThan.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/GreaterThan.php";}s:62:"Symfony/Component/Validator/Constraints/GreaterThanOrEqual.php";a:4:{s:6:"md5sum";s:32:"ebb17f4ce792e12fecff1e9bb4b41e21";s:4:"name";s:62:"Symfony/Component/Validator/Constraints/GreaterThanOrEqual.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/GreaterThanOrEqual.php";}s:71:"Symfony/Component/Validator/Constraints/GreaterThanOrEqualValidator.php";a:4:{s:6:"md5sum";s:32:"e4430a7d1c6f9f03c7a770ddda909d5f";s:4:"name";s:71:"Symfony/Component/Validator/Constraints/GreaterThanOrEqualValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/GreaterThanOrEqualValidator.php";}s:64:"Symfony/Component/Validator/Constraints/GreaterThanValidator.php";a:4:{s:6:"md5sum";s:32:"2ff68d36a30ee563937565accdaf91e3";s:4:"name";s:64:"Symfony/Component/Validator/Constraints/GreaterThanValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/GreaterThanValidator.php";}s:57:"Symfony/Component/Validator/Constraints/GroupSequence.php";a:4:{s:6:"md5sum";s:32:"15201fe63d343b6b1e1a739fcaad8662";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/GroupSequence.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/GroupSequence.php";}s:65:"Symfony/Component/Validator/Constraints/GroupSequenceProvider.php";a:4:{s:6:"md5sum";s:32:"38089465890121217bdedbd833ee95e4";s:4:"name";s:65:"Symfony/Component/Validator/Constraints/GroupSequenceProvider.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/GroupSequenceProvider.php";}s:48:"Symfony/Component/Validator/Constraints/Iban.php";a:4:{s:6:"md5sum";s:32:"3b6c69a9eb08622192d6af7a1f90bde3";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Iban.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Iban.php";}s:57:"Symfony/Component/Validator/Constraints/IbanValidator.php";a:4:{s:6:"md5sum";s:32:"767699246ea9dae9c99b112253ef0af0";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/IbanValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/IbanValidator.php";}s:55:"Symfony/Component/Validator/Constraints/IdenticalTo.php";a:4:{s:6:"md5sum";s:32:"c170ea25fe3922db43490b571011a438";s:4:"name";s:55:"Symfony/Component/Validator/Constraints/IdenticalTo.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/IdenticalTo.php";}s:64:"Symfony/Component/Validator/Constraints/IdenticalToValidator.php";a:4:{s:6:"md5sum";s:32:"56257e543ffc3632a272b284cd7ceeda";s:4:"name";s:64:"Symfony/Component/Validator/Constraints/IdenticalToValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/IdenticalToValidator.php";}s:49:"Symfony/Component/Validator/Constraints/Image.php";a:4:{s:6:"md5sum";s:32:"92f832be76aed1cfcd18d276ff45bce9";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Image.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Image.php";}s:58:"Symfony/Component/Validator/Constraints/ImageValidator.php";a:4:{s:6:"md5sum";s:32:"a95e09bb82ad891054f0680144487871";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/ImageValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/ImageValidator.php";}s:46:"Symfony/Component/Validator/Constraints/Ip.php";a:4:{s:6:"md5sum";s:32:"1ff307af5e1d02b5da016f7fd3c64816";s:4:"name";s:46:"Symfony/Component/Validator/Constraints/Ip.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Ip.php";}s:55:"Symfony/Component/Validator/Constraints/IpValidator.php";a:4:{s:6:"md5sum";s:32:"66c5af8b916684cf0c166c280cb00aa5";s:4:"name";s:55:"Symfony/Component/Validator/Constraints/IpValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/IpValidator.php";}s:48:"Symfony/Component/Validator/Constraints/Isbn.php";a:4:{s:6:"md5sum";s:32:"0eb759966852ddb84bd6b24c967040b7";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Isbn.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Isbn.php";}s:57:"Symfony/Component/Validator/Constraints/IsbnValidator.php";a:4:{s:6:"md5sum";s:32:"ff5b531b2a454c10fce5ae7c0894a22a";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/IsbnValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/IsbnValidator.php";}s:48:"Symfony/Component/Validator/Constraints/Issn.php";a:4:{s:6:"md5sum";s:32:"ee14ff1ba2ba521a7eb166ef651a1c75";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Issn.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Issn.php";}s:57:"Symfony/Component/Validator/Constraints/IssnValidator.php";a:4:{s:6:"md5sum";s:32:"93a39aba6f6a4f5a23ea91108425fa07";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/IssnValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/IssnValidator.php";}s:52:"Symfony/Component/Validator/Constraints/Language.php";a:4:{s:6:"md5sum";s:32:"5ba57bdea0848798ae8da31a78f1c072";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/Language.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Language.php";}s:61:"Symfony/Component/Validator/Constraints/LanguageValidator.php";a:4:{s:6:"md5sum";s:32:"27e3692dbfe009a21c71f826e9ab7fe1";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/LanguageValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/LanguageValidator.php";}s:50:"Symfony/Component/Validator/Constraints/Length.php";a:4:{s:6:"md5sum";s:32:"1f0169f057954dec8280c2c4931b0a13";s:4:"name";s:50:"Symfony/Component/Validator/Constraints/Length.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Length.php";}s:59:"Symfony/Component/Validator/Constraints/LengthValidator.php";a:4:{s:6:"md5sum";s:32:"93de9c9c5ab7e3b8c19c671004a50ad4";s:4:"name";s:59:"Symfony/Component/Validator/Constraints/LengthValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/LengthValidator.php";}s:52:"Symfony/Component/Validator/Constraints/LessThan.php";a:4:{s:6:"md5sum";s:32:"eb6377f01e9cc6440dfa4e183ef8c4ab";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/LessThan.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/LessThan.php";}s:59:"Symfony/Component/Validator/Constraints/LessThanOrEqual.php";a:4:{s:6:"md5sum";s:32:"09d85d86e5798681d39dfe598df6c562";s:4:"name";s:59:"Symfony/Component/Validator/Constraints/LessThanOrEqual.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/LessThanOrEqual.php";}s:68:"Symfony/Component/Validator/Constraints/LessThanOrEqualValidator.php";a:4:{s:6:"md5sum";s:32:"564b53c3325126cc54ee9c14102b170a";s:4:"name";s:68:"Symfony/Component/Validator/Constraints/LessThanOrEqualValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/LessThanOrEqualValidator.php";}s:61:"Symfony/Component/Validator/Constraints/LessThanValidator.php";a:4:{s:6:"md5sum";s:32:"aa4623bfdf3d9d518660aeb634367252";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/LessThanValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/LessThanValidator.php";}s:50:"Symfony/Component/Validator/Constraints/Locale.php";a:4:{s:6:"md5sum";s:32:"de036e7a36b266c549985ededcb96344";s:4:"name";s:50:"Symfony/Component/Validator/Constraints/Locale.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Locale.php";}s:59:"Symfony/Component/Validator/Constraints/LocaleValidator.php";a:4:{s:6:"md5sum";s:32:"4b3b59f35f25cb78b8b25a266d405986";s:4:"name";s:59:"Symfony/Component/Validator/Constraints/LocaleValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/LocaleValidator.php";}s:48:"Symfony/Component/Validator/Constraints/Luhn.php";a:4:{s:6:"md5sum";s:32:"25dc43335a20b9a6e3b31b43a762e762";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Luhn.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Luhn.php";}s:57:"Symfony/Component/Validator/Constraints/LuhnValidator.php";a:4:{s:6:"md5sum";s:32:"f7360bdeef47916280c4e15ce1be91b1";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/LuhnValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/LuhnValidator.php";}s:52:"Symfony/Component/Validator/Constraints/NotBlank.php";a:4:{s:6:"md5sum";s:32:"868b62aca0723c3b457144aaf6c93a62";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/NotBlank.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/NotBlank.php";}s:61:"Symfony/Component/Validator/Constraints/NotBlankValidator.php";a:4:{s:6:"md5sum";s:32:"d095cf646d98ffc63c8404b87dc64c3a";s:4:"name";s:61:"Symfony/Component/Validator/Constraints/NotBlankValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/NotBlankValidator.php";}s:54:"Symfony/Component/Validator/Constraints/NotEqualTo.php";a:4:{s:6:"md5sum";s:32:"54a792ce51e206d9f1f342acf8de0ca6";s:4:"name";s:54:"Symfony/Component/Validator/Constraints/NotEqualTo.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/NotEqualTo.php";}s:63:"Symfony/Component/Validator/Constraints/NotEqualToValidator.php";a:4:{s:6:"md5sum";s:32:"ba17b4508a92681c1ecb989e31150989";s:4:"name";s:63:"Symfony/Component/Validator/Constraints/NotEqualToValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/NotEqualToValidator.php";}s:58:"Symfony/Component/Validator/Constraints/NotIdenticalTo.php";a:4:{s:6:"md5sum";s:32:"b0cf3bbae80822776f2ebe3853331da2";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/NotIdenticalTo.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/NotIdenticalTo.php";}s:67:"Symfony/Component/Validator/Constraints/NotIdenticalToValidator.php";a:4:{s:6:"md5sum";s:32:"3fb62be8d95c084095e2bb8354fa6cb2";s:4:"name";s:67:"Symfony/Component/Validator/Constraints/NotIdenticalToValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/NotIdenticalToValidator.php";}s:51:"Symfony/Component/Validator/Constraints/NotNull.php";a:4:{s:6:"md5sum";s:32:"1797b9ea7b21a35e5d2d1d68ca7fe157";s:4:"name";s:51:"Symfony/Component/Validator/Constraints/NotNull.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/NotNull.php";}s:60:"Symfony/Component/Validator/Constraints/NotNullValidator.php";a:4:{s:6:"md5sum";s:32:"d7a3af7c2064d4ff44733151eef7630d";s:4:"name";s:60:"Symfony/Component/Validator/Constraints/NotNullValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/NotNullValidator.php";}s:48:"Symfony/Component/Validator/Constraints/Null.php";a:4:{s:6:"md5sum";s:32:"1c8478dc05ca6a3af5499c59220d99b0";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Null.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Null.php";}s:57:"Symfony/Component/Validator/Constraints/NullValidator.php";a:4:{s:6:"md5sum";s:32:"412fc8b35206517d8c2844aec558d6f5";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/NullValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/NullValidator.php";}s:52:"Symfony/Component/Validator/Constraints/Optional.php";a:4:{s:6:"md5sum";s:32:"82b49cbb8deeed5086002af1d2e3d06f";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/Optional.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Optional.php";}s:49:"Symfony/Component/Validator/Constraints/Range.php";a:4:{s:6:"md5sum";s:32:"1875728a92acf358891dc559c15127fa";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Range.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Range.php";}s:58:"Symfony/Component/Validator/Constraints/RangeValidator.php";a:4:{s:6:"md5sum";s:32:"5756018ef45c81919b3214d78b0e6eb4";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/RangeValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/RangeValidator.php";}s:49:"Symfony/Component/Validator/Constraints/Regex.php";a:4:{s:6:"md5sum";s:32:"f7a9e04cd4262d3f80fcbe70b9c4e806";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Regex.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Regex.php";}s:58:"Symfony/Component/Validator/Constraints/RegexValidator.php";a:4:{s:6:"md5sum";s:32:"ea6c897666cc7a6af2ff4d913f82a392";s:4:"name";s:58:"Symfony/Component/Validator/Constraints/RegexValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/RegexValidator.php";}s:52:"Symfony/Component/Validator/Constraints/Required.php";a:4:{s:6:"md5sum";s:32:"acbae820b5540dde9ec681dd85429861";s:4:"name";s:52:"Symfony/Component/Validator/Constraints/Required.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Required.php";}s:48:"Symfony/Component/Validator/Constraints/Time.php";a:4:{s:6:"md5sum";s:32:"67b70d9e097e05da71488e09b6e90b95";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Time.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Time.php";}s:57:"Symfony/Component/Validator/Constraints/TimeValidator.php";a:4:{s:6:"md5sum";s:32:"334dffc652e93fa5bd706116c9b44257";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/TimeValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/TimeValidator.php";}s:48:"Symfony/Component/Validator/Constraints/True.php";a:4:{s:6:"md5sum";s:32:"a78e9cd61bb76287a0522b1e5b7b392b";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/True.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/True.php";}s:57:"Symfony/Component/Validator/Constraints/TrueValidator.php";a:4:{s:6:"md5sum";s:32:"637d4488ec6112faf64aae361929d040";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/TrueValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/TrueValidator.php";}s:48:"Symfony/Component/Validator/Constraints/Type.php";a:4:{s:6:"md5sum";s:32:"d965c82e65e8289f8ecb88d83fc83de7";s:4:"name";s:48:"Symfony/Component/Validator/Constraints/Type.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Type.php";}s:57:"Symfony/Component/Validator/Constraints/TypeValidator.php";a:4:{s:6:"md5sum";s:32:"9f24a3872c47a60f1a990c9f199e14c2";s:4:"name";s:57:"Symfony/Component/Validator/Constraints/TypeValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/TypeValidator.php";}s:47:"Symfony/Component/Validator/Constraints/Url.php";a:4:{s:6:"md5sum";s:32:"ee711e399a3f093e7b3545692ebf7f62";s:4:"name";s:47:"Symfony/Component/Validator/Constraints/Url.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Url.php";}s:56:"Symfony/Component/Validator/Constraints/UrlValidator.php";a:4:{s:6:"md5sum";s:32:"38d0b621d809fc73a63e73c9b2eec6f0";s:4:"name";s:56:"Symfony/Component/Validator/Constraints/UrlValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/UrlValidator.php";}s:49:"Symfony/Component/Validator/Constraints/Valid.php";a:4:{s:6:"md5sum";s:32:"1bb212699fe8609180681b51be678cd4";s:4:"name";s:49:"Symfony/Component/Validator/Constraints/Valid.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Valid.php";}s:51:"Symfony/Component/Validator/ConstraintValidator.php";a:4:{s:6:"md5sum";s:32:"d599a1ef98a59cddd0952a2217e6a61a";s:4:"name";s:51:"Symfony/Component/Validator/ConstraintValidator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ConstraintValidator.php";}s:58:"Symfony/Component/Validator/ConstraintValidatorFactory.php";a:4:{s:6:"md5sum";s:32:"1dc05c3449f8ee63549a2672f762c635";s:4:"name";s:58:"Symfony/Component/Validator/ConstraintValidatorFactory.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ConstraintValidatorFactory.php";}s:67:"Symfony/Component/Validator/ConstraintValidatorFactoryInterface.php";a:4:{s:6:"md5sum";s:32:"f322ea75c86e7e0fe44bf0e55b45522e";s:4:"name";s:67:"Symfony/Component/Validator/ConstraintValidatorFactoryInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ConstraintValidatorFactoryInterface.php";}s:60:"Symfony/Component/Validator/ConstraintValidatorInterface.php";a:4:{s:6:"md5sum";s:32:"62e34e25daf9b43c27cd8111b2c10ede";s:4:"name";s:60:"Symfony/Component/Validator/ConstraintValidatorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ConstraintValidatorInterface.php";}s:51:"Symfony/Component/Validator/ConstraintViolation.php";a:4:{s:6:"md5sum";s:32:"687daad19e5f43350617c063490aa100";s:4:"name";s:51:"Symfony/Component/Validator/ConstraintViolation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ConstraintViolation.php";}s:60:"Symfony/Component/Validator/ConstraintViolationInterface.php";a:4:{s:6:"md5sum";s:32:"ef89d7f0cbae45ed31aa8a72fc13487d";s:4:"name";s:60:"Symfony/Component/Validator/ConstraintViolationInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ConstraintViolationInterface.php";}s:55:"Symfony/Component/Validator/ConstraintViolationList.php";a:4:{s:6:"md5sum";s:32:"c2c8b4b7b53a10d1f269c2ce53c7e901";s:4:"name";s:55:"Symfony/Component/Validator/ConstraintViolationList.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ConstraintViolationList.php";}s:64:"Symfony/Component/Validator/ConstraintViolationListInterface.php";a:4:{s:6:"md5sum";s:32:"36c862c3c9a1e8e797fe4b6ef4c91546";s:4:"name";s:64:"Symfony/Component/Validator/ConstraintViolationListInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ConstraintViolationListInterface.php";}s:49:"Symfony/Component/Validator/DefaultTranslator.php";a:4:{s:6:"md5sum";s:32:"4be17f7858f92496b9d0527bcd7cd720";s:4:"name";s:49:"Symfony/Component/Validator/DefaultTranslator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/DefaultTranslator.php";}s:64:"Symfony/Component/Validator/Exception/BadMethodCallException.php";a:4:{s:6:"md5sum";s:32:"e1602d2dcf95a9052da9a432db6c1875";s:4:"name";s:64:"Symfony/Component/Validator/Exception/BadMethodCallException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/BadMethodCallException.php";}s:71:"Symfony/Component/Validator/Exception/ConstraintDefinitionException.php";a:4:{s:6:"md5sum";s:32:"5fcc0f865c77f52e9847378da9f0489c";s:4:"name";s:71:"Symfony/Component/Validator/Exception/ConstraintDefinitionException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/ConstraintDefinitionException.php";}s:60:"Symfony/Component/Validator/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"0b0c94ce85588dd563f8767426eafdcc";s:4:"name";s:60:"Symfony/Component/Validator/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/ExceptionInterface.php";}s:66:"Symfony/Component/Validator/Exception/GroupDefinitionException.php";a:4:{s:6:"md5sum";s:32:"ed9aa39f207cff711cb5c8fc86114395";s:4:"name";s:66:"Symfony/Component/Validator/Exception/GroupDefinitionException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/GroupDefinitionException.php";}s:66:"Symfony/Component/Validator/Exception/InvalidArgumentException.php";a:4:{s:6:"md5sum";s:32:"bd79de35ad0e084b8400e08793205a69";s:4:"name";s:66:"Symfony/Component/Validator/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/InvalidArgumentException.php";}s:65:"Symfony/Component/Validator/Exception/InvalidOptionsException.php";a:4:{s:6:"md5sum";s:32:"7dcead75d21f8d0a56980c4a07d7aca4";s:4:"name";s:65:"Symfony/Component/Validator/Exception/InvalidOptionsException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/InvalidOptionsException.php";}s:58:"Symfony/Component/Validator/Exception/MappingException.php";a:4:{s:6:"md5sum";s:32:"9f68ce5c519e7ae740485b54d04e1d51";s:4:"name";s:58:"Symfony/Component/Validator/Exception/MappingException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/MappingException.php";}s:65:"Symfony/Component/Validator/Exception/MissingOptionsException.php";a:4:{s:6:"md5sum";s:32:"b53533773e89efd08b4e8fee6b186579";s:4:"name";s:65:"Symfony/Component/Validator/Exception/MissingOptionsException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/MissingOptionsException.php";}s:65:"Symfony/Component/Validator/Exception/NoSuchMetadataException.php";a:4:{s:6:"md5sum";s:32:"e9bea930f7bceee8d7dde50dd85e9ba7";s:4:"name";s:65:"Symfony/Component/Validator/Exception/NoSuchMetadataException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/NoSuchMetadataException.php";}s:58:"Symfony/Component/Validator/Exception/RuntimeException.php";a:4:{s:6:"md5sum";s:32:"99d749d07f412b89d5af760e96666226";s:4:"name";s:58:"Symfony/Component/Validator/Exception/RuntimeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/RuntimeException.php";}s:65:"Symfony/Component/Validator/Exception/UnexpectedTypeException.php";a:4:{s:6:"md5sum";s:32:"49ee74315300fe571873b44bdd13e171";s:4:"name";s:65:"Symfony/Component/Validator/Exception/UnexpectedTypeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/UnexpectedTypeException.php";}s:60:"Symfony/Component/Validator/Exception/ValidatorException.php";a:4:{s:6:"md5sum";s:32:"a0a8b64183db5f06140fbe08503efdaf";s:4:"name";s:60:"Symfony/Component/Validator/Exception/ValidatorException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception/ValidatorException.php";}s:48:"Symfony/Component/Validator/ExecutionContext.php";a:4:{s:6:"md5sum";s:32:"915a47ef778253a6c7a1e2a2528aa996";s:4:"name";s:48:"Symfony/Component/Validator/ExecutionContext.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ExecutionContext.php";}s:57:"Symfony/Component/Validator/ExecutionContextInterface.php";a:4:{s:6:"md5sum";s:32:"676e8179bba9e6d350680ef1ea759b9e";s:4:"name";s:57:"Symfony/Component/Validator/ExecutionContextInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ExecutionContextInterface.php";}s:63:"Symfony/Component/Validator/GlobalExecutionContextInterface.php";a:4:{s:6:"md5sum";s:32:"ca92e46f393618f0efc6954ca2466939";s:4:"name";s:63:"Symfony/Component/Validator/GlobalExecutionContextInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/GlobalExecutionContextInterface.php";}s:62:"Symfony/Component/Validator/GroupSequenceProviderInterface.php";a:4:{s:6:"md5sum";s:32:"381af269f7e5fb28e87a5c81a3707621";s:4:"name";s:62:"Symfony/Component/Validator/GroupSequenceProviderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/GroupSequenceProviderInterface.php";}s:35:"Symfony/Component/Validator/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:35:"Symfony/Component/Validator/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/doc/pear/Validator/Symfony/Component/Validator/LICENSE";}s:64:"Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php";a:4:{s:6:"md5sum";s:32:"4ff2d258e293c0d3347a56678051e8d3";s:4:"name";s:64:"Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php";}s:54:"Symfony/Component/Validator/Mapping/Cache/ApcCache.php";a:4:{s:6:"md5sum";s:32:"462497cd0cf5d29d523b5a0d75b81ca0";s:4:"name";s:54:"Symfony/Component/Validator/Mapping/Cache/ApcCache.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Cache/ApcCache.php";}s:60:"Symfony/Component/Validator/Mapping/Cache/CacheInterface.php";a:4:{s:6:"md5sum";s:32:"8a7b01dab83206f30d02ceb5ccc8c171";s:4:"name";s:60:"Symfony/Component/Validator/Mapping/Cache/CacheInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Cache/CacheInterface.php";}s:53:"Symfony/Component/Validator/Mapping/ClassMetadata.php";a:4:{s:6:"md5sum";s:32:"b7ce80520c8d175471f396247948cdc3";s:4:"name";s:53:"Symfony/Component/Validator/Mapping/ClassMetadata.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/ClassMetadata.php";}s:60:"Symfony/Component/Validator/Mapping/ClassMetadataFactory.php";a:4:{s:6:"md5sum";s:32:"b708c68549204312c540ee7dacb9ad87";s:4:"name";s:60:"Symfony/Component/Validator/Mapping/ClassMetadataFactory.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/ClassMetadataFactory.php";}s:55:"Symfony/Component/Validator/Mapping/ElementMetadata.php";a:4:{s:6:"md5sum";s:32:"6d8a4315440eca7b33bee8a2c2df3cf0";s:4:"name";s:55:"Symfony/Component/Validator/Mapping/ElementMetadata.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/ElementMetadata.php";}s:54:"Symfony/Component/Validator/Mapping/GetterMetadata.php";a:4:{s:6:"md5sum";s:32:"66734470bd1916de0ca3f01784364005";s:4:"name";s:54:"Symfony/Component/Validator/Mapping/GetterMetadata.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/GetterMetadata.php";}s:61:"Symfony/Component/Validator/Mapping/Loader/AbstractLoader.php";a:4:{s:6:"md5sum";s:32:"4aafbfbbc0d5d5430ee20aff7da60f5c";s:4:"name";s:61:"Symfony/Component/Validator/Mapping/Loader/AbstractLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/AbstractLoader.php";}s:63:"Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php";a:4:{s:6:"md5sum";s:32:"8ad79406bc548394a200e712dee0c30f";s:4:"name";s:63:"Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php";}s:57:"Symfony/Component/Validator/Mapping/Loader/FileLoader.php";a:4:{s:6:"md5sum";s:32:"9b4a61c8b30fae02788429854ba81036";s:4:"name";s:57:"Symfony/Component/Validator/Mapping/Loader/FileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/FileLoader.php";}s:58:"Symfony/Component/Validator/Mapping/Loader/FilesLoader.php";a:4:{s:6:"md5sum";s:32:"4af7f07bfcfa849e66999ab1ee24f876";s:4:"name";s:58:"Symfony/Component/Validator/Mapping/Loader/FilesLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/FilesLoader.php";}s:58:"Symfony/Component/Validator/Mapping/Loader/LoaderChain.php";a:4:{s:6:"md5sum";s:32:"8b284df5873ac5725b5c4705b69d530b";s:4:"name";s:58:"Symfony/Component/Validator/Mapping/Loader/LoaderChain.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/LoaderChain.php";}s:62:"Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php";a:4:{s:6:"md5sum";s:32:"d202e225a6b817c2829e10f98d04abdd";s:4:"name";s:62:"Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php";}s:99:"Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd";a:4:{s:6:"md5sum";s:32:"2f1f4e105fe3d987790a62d0a36ace39";s:4:"name";s:99:"Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd";s:4:"role";s:3:"php";s:12:"installed_as";s:129:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd";}s:65:"Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php";a:4:{s:6:"md5sum";s:32:"1005146f217d0bcdaabe67f3c3e9c225";s:4:"name";s:65:"Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php";}s:60:"Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php";a:4:{s:6:"md5sum";s:32:"c8d1f2225f940f29028386fe2fbbfe7a";s:4:"name";s:60:"Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php";}s:61:"Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php";a:4:{s:6:"md5sum";s:32:"31fdec6936f6c041c6c9d4a3d3cec86e";s:4:"name";s:61:"Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php";}s:61:"Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php";a:4:{s:6:"md5sum";s:32:"a712b89ff6fe80354296a3b399c6139f";s:4:"name";s:61:"Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php";}s:62:"Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php";a:4:{s:6:"md5sum";s:32:"8db3ad3b587098ac95ad6d25317c2e9c";s:4:"name";s:62:"Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php";}s:54:"Symfony/Component/Validator/Mapping/MemberMetadata.php";a:4:{s:6:"md5sum";s:32:"8c45e691d8e03b05b3a893e3acdb5a0f";s:4:"name";s:54:"Symfony/Component/Validator/Mapping/MemberMetadata.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/MemberMetadata.php";}s:56:"Symfony/Component/Validator/Mapping/PropertyMetadata.php";a:4:{s:6:"md5sum";s:32:"f44bb51a8950d588ae2dd0ab7bf17a1f";s:4:"name";s:56:"Symfony/Component/Validator/Mapping/PropertyMetadata.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/PropertyMetadata.php";}s:56:"Symfony/Component/Validator/MetadataFactoryInterface.php";a:4:{s:6:"md5sum";s:32:"4db44d9e04ab20b9b5757aaac84e4aa7";s:4:"name";s:56:"Symfony/Component/Validator/MetadataFactoryInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/MetadataFactoryInterface.php";}s:49:"Symfony/Component/Validator/MetadataInterface.php";a:4:{s:6:"md5sum";s:32:"ee339e11db2658139a134c3824c8afd7";s:4:"name";s:49:"Symfony/Component/Validator/MetadataInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/MetadataInterface.php";}s:58:"Symfony/Component/Validator/ObjectInitializerInterface.php";a:4:{s:6:"md5sum";s:32:"00b9e5fab71633739ff82314900aa9c9";s:4:"name";s:58:"Symfony/Component/Validator/ObjectInitializerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ObjectInitializerInterface.php";}s:44:"Symfony/Component/Validator/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"78843eae0d52d5f5909f1087a44295b7";s:4:"name";s:44:"Symfony/Component/Validator/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/phpunit.xml.dist";}s:66:"Symfony/Component/Validator/PropertyMetadataContainerInterface.php";a:4:{s:6:"md5sum";s:32:"6e7e28f7b1ff78536561fcda9521b4dc";s:4:"name";s:66:"Symfony/Component/Validator/PropertyMetadataContainerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/PropertyMetadataContainerInterface.php";}s:57:"Symfony/Component/Validator/PropertyMetadataInterface.php";a:4:{s:6:"md5sum";s:32:"f6c682d20098aac0b0502374eaa79df1";s:4:"name";s:57:"Symfony/Component/Validator/PropertyMetadataInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/PropertyMetadataInterface.php";}s:37:"Symfony/Component/Validator/README.md";a:4:{s:6:"md5sum";s:32:"909b0bb88dcdb6cdee5dce42ec11e0d8";s:4:"name";s:37:"Symfony/Component/Validator/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/Validator/Symfony/Component/Validator/README.md";}s:68:"Symfony/Component/Validator/Resources/translations/validators.af.xlf";a:4:{s:6:"md5sum";s:32:"c23dd67e56958cc57e1147fce770d730";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.af.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.af.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.ar.xlf";a:4:{s:6:"md5sum";s:32:"2a03a4464216db4d71c91a1fd5f0c696";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.ar.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.ar.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.bg.xlf";a:4:{s:6:"md5sum";s:32:"d4011977e7d9fed5e3c57c9b5e09077e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.bg.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.bg.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.ca.xlf";a:4:{s:6:"md5sum";s:32:"a17496bce86c96c7d447a148b2d29e8a";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.ca.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.ca.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.cs.xlf";a:4:{s:6:"md5sum";s:32:"bbda69a9cc105df6d0e915e93ea4de6d";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.cs.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.cs.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.cy.xlf";a:4:{s:6:"md5sum";s:32:"117e80d2ecc0ed11fe07dcef7d023d3f";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.cy.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.cy.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.da.xlf";a:4:{s:6:"md5sum";s:32:"793dcd9686793b163ac089ce11e98f35";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.da.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.da.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.de.xlf";a:4:{s:6:"md5sum";s:32:"7645ad8b8789c647baf9d713603dcc4e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.de.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.de.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.el.xlf";a:4:{s:6:"md5sum";s:32:"84e8b57b7cd181c41a9f2c609d9d2fcf";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.el.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.el.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.en.xlf";a:4:{s:6:"md5sum";s:32:"f6b79a83f78a4d434657c2246bfa3299";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.en.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.en.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.es.xlf";a:4:{s:6:"md5sum";s:32:"6d37d37db86c98e7c2c0058e8ca627d5";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.es.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.es.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.et.xlf";a:4:{s:6:"md5sum";s:32:"51f14210b3a9c9a53edaee7055d04e0e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.et.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.et.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.eu.xlf";a:4:{s:6:"md5sum";s:32:"2af5064bdebe03bb807ff16385d5d06e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.eu.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.eu.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.fa.xlf";a:4:{s:6:"md5sum";s:32:"1e07a45e3288a48103d69c34ab9e61e6";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.fa.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.fa.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.fi.xlf";a:4:{s:6:"md5sum";s:32:"46b3152b9dd89f59e42e0e72844a12ec";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.fi.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.fi.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.fr.xlf";a:4:{s:6:"md5sum";s:32:"47603272bbc1c04e050be6413d350d02";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.fr.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.fr.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.gl.xlf";a:4:{s:6:"md5sum";s:32:"f86071db1ba3ea2ff60161e5cc8b5e71";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.gl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.gl.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.he.xlf";a:4:{s:6:"md5sum";s:32:"88b6ab9440768505c046b7ef1309dd2e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.he.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.he.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.hr.xlf";a:4:{s:6:"md5sum";s:32:"a37851b29fd856938b8029924661c408";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.hr.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.hr.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.hu.xlf";a:4:{s:6:"md5sum";s:32:"0b4a4f159d4577d218cf405a8b69f48e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.hu.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.hu.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.hy.xlf";a:4:{s:6:"md5sum";s:32:"822214a574b126ce160d5caed2a08175";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.hy.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.hy.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.id.xlf";a:4:{s:6:"md5sum";s:32:"72642d91259f21b72dd1bf1005ebac4e";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.id.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.id.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.it.xlf";a:4:{s:6:"md5sum";s:32:"96673a4cfc1e20bf2417dff5f41093c3";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.it.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.it.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.ja.xlf";a:4:{s:6:"md5sum";s:32:"26ce7bce56a82a9ae623a109bcb3c47d";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.ja.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.ja.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.lb.xlf";a:4:{s:6:"md5sum";s:32:"9c0e28952956db6812685e121ea2c010";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.lb.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.lb.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.lt.xlf";a:4:{s:6:"md5sum";s:32:"8633947d9242120d0b273bedd0044c6b";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.lt.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.lt.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.mn.xlf";a:4:{s:6:"md5sum";s:32:"5d6b61cab4e816991ff98ff64821dbc9";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.mn.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.mn.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.nb.xlf";a:4:{s:6:"md5sum";s:32:"fc5bde0bb7a5dfafb1a061dd38dd335a";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.nb.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.nb.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.nl.xlf";a:4:{s:6:"md5sum";s:32:"8620371a13ed6d660f8daafbefdf55a4";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.nl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.nl.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.no.xlf";a:4:{s:6:"md5sum";s:32:"4a7aefa9d1b652a741d38936701a7bea";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.no.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.no.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.pl.xlf";a:4:{s:6:"md5sum";s:32:"43cadc96e23d6bb270ccde1e20cd3940";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.pl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.pl.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.pt.xlf";a:4:{s:6:"md5sum";s:32:"807707efabc65ad9992ff9b79531b1ec";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.pt.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.pt.xlf";}s:71:"Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf";a:4:{s:6:"md5sum";s:32:"86ef4e2fd4d0ca78e4aff92a496d6750";s:4:"name";s:71:"Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.ro.xlf";a:4:{s:6:"md5sum";s:32:"710b8a67f921af1756390e5c16732043";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.ro.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.ro.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.ru.xlf";a:4:{s:6:"md5sum";s:32:"60f16b6952726dfd1f92d3764bad85a5";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.ru.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.ru.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.sk.xlf";a:4:{s:6:"md5sum";s:32:"fb5f5e62d477c3790fdba5fbc97fc238";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.sk.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.sk.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.sl.xlf";a:4:{s:6:"md5sum";s:32:"e6a4af47341fa4c1b79e73b869df66b9";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.sl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.sl.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.sq.xlf";a:4:{s:6:"md5sum";s:32:"1f2fb26d0dd0131a51f36f7107c8bac2";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.sq.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.sq.xlf";}s:73:"Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf";a:4:{s:6:"md5sum";s:32:"8bc6bb4b4b0ff9d03446c0c0ffd49983";s:4:"name";s:73:"Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf";}s:73:"Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf";a:4:{s:6:"md5sum";s:32:"243a40ad3d4d74eed428066e6d6e7ef0";s:4:"name";s:73:"Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.sv.xlf";a:4:{s:6:"md5sum";s:32:"ad1dd35b2ceccaa8a744ff08ebb1c759";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.sv.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.sv.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.tr.xlf";a:4:{s:6:"md5sum";s:32:"a51133637a933c33aa1c7be7bc2c8f90";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.tr.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.tr.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.uk.xlf";a:4:{s:6:"md5sum";s:32:"3a4ec8b32ecc077c50c875fc46eec46b";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.uk.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.uk.xlf";}s:68:"Symfony/Component/Validator/Resources/translations/validators.vi.xlf";a:4:{s:6:"md5sum";s:32:"65930b6493ef965d3721753893c549b8";s:4:"name";s:68:"Symfony/Component/Validator/Resources/translations/validators.vi.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.vi.xlf";}s:71:"Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf";a:4:{s:6:"md5sum";s:32:"8ea9d18b4b8b0e0973d4461e4a4b31cf";s:4:"name";s:71:"Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf";}s:71:"Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlf";a:4:{s:6:"md5sum";s:32:"336e3f4fcb54962d47342a9c58e80367";s:4:"name";s:71:"Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlf";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlf";}s:85:"Symfony/Component/Validator/Tests/Constraints/AbstractComparisonValidatorTestCase.php";a:4:{s:6:"md5sum";s:32:"df674acd306f8fa14a401b024b9bdc7f";s:4:"name";s:85:"Symfony/Component/Validator/Tests/Constraints/AbstractComparisonValidatorTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/AbstractComparisonValidatorTestCase.php";}s:57:"Symfony/Component/Validator/Tests/Constraints/AllTest.php";a:4:{s:6:"md5sum";s:32:"1179a8a955d42d44c8ed974c1819fb2e";s:4:"name";s:57:"Symfony/Component/Validator/Tests/Constraints/AllTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/AllTest.php";}s:66:"Symfony/Component/Validator/Tests/Constraints/AllValidatorTest.php";a:4:{s:6:"md5sum";s:32:"96d4e47954bfb402594f16426d7d00ec";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Constraints/AllValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/AllValidatorTest.php";}s:68:"Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php";a:4:{s:6:"md5sum";s:32:"b269201734d4f62ecf56991d0ca84714";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php";}s:71:"Symfony/Component/Validator/Tests/Constraints/CallbackValidatorTest.php";a:4:{s:6:"md5sum";s:32:"d5b9313f897e13ecc42be33565e6a835";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/CallbackValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CallbackValidatorTest.php";}s:73:"Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php";a:4:{s:6:"md5sum";s:32:"43d071b4c94aa19cfd7c010958397284";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php";}s:69:"Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php";a:4:{s:6:"md5sum";s:32:"e16564bb61b350db55712205e43c2ee7";s:4:"name";s:69:"Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php";}s:64:"Symfony/Component/Validator/Tests/Constraints/CollectionTest.php";a:4:{s:6:"md5sum";s:32:"71210b53ae36ca85b8cab158c1cdc5f3";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Constraints/CollectionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php";}s:84:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayObjectTest.php";a:4:{s:6:"md5sum";s:32:"0b20dac6c8b275500c652f1e9726f68e";s:4:"name";s:84:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayObjectTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:129:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayObjectTest.php";}s:78:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayTest.php";a:4:{s:6:"md5sum";s:32:"f860057334309da67249317f86faf070";s:4:"name";s:78:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayTest.php";}s:90:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorCustomArrayObjectTest.php";a:4:{s:6:"md5sum";s:32:"83079c79103474984cdabd95062b7d03";s:4:"name";s:90:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorCustomArrayObjectTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorCustomArrayObjectTest.php";}s:73:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php";a:4:{s:6:"md5sum";s:32:"abb52acdf76b84de090fd27d778abc25";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php";}s:70:"Symfony/Component/Validator/Tests/Constraints/CountryValidatorTest.php";a:4:{s:6:"md5sum";s:32:"088335785b72fe09bb08a78cb174a9b8";s:4:"name";s:70:"Symfony/Component/Validator/Tests/Constraints/CountryValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CountryValidatorTest.php";}s:73:"Symfony/Component/Validator/Tests/Constraints/CountValidatorArrayTest.php";a:4:{s:6:"md5sum";s:32:"81cfd6f9c23a49e571849bbf93242d45";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/CountValidatorArrayTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorArrayTest.php";}s:77:"Symfony/Component/Validator/Tests/Constraints/CountValidatorCountableTest.php";a:4:{s:6:"md5sum";s:32:"31cd334579c8f399f099aaae60e0daf8";s:4:"name";s:77:"Symfony/Component/Validator/Tests/Constraints/CountValidatorCountableTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorCountableTest.php";}s:68:"Symfony/Component/Validator/Tests/Constraints/CountValidatorTest.php";a:4:{s:6:"md5sum";s:32:"2baf2ba710f51a96efb9dfdf4e8e1b90";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/CountValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CountValidatorTest.php";}s:71:"Symfony/Component/Validator/Tests/Constraints/CurrencyValidatorTest.php";a:4:{s:6:"md5sum";s:32:"6f443701a1d6c8b3e6e56fb330da132e";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/CurrencyValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/CurrencyValidatorTest.php";}s:71:"Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php";a:4:{s:6:"md5sum";s:32:"ff807a49e3f2b98577ba78573388e54d";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php";}s:67:"Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php";a:4:{s:6:"md5sum";s:32:"86f3b37b7d92d05b0f6e20b355d2612c";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php";}s:68:"Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php";a:4:{s:6:"md5sum";s:32:"7a87cf58056325eae85ff00bf9a938ed";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php";}s:70:"Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php";a:4:{s:6:"md5sum";s:32:"7893495310cce59b359b7b0b283dfc5c";s:4:"name";s:70:"Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php";}s:73:"Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php";a:4:{s:6:"md5sum";s:32:"8df8fad7f1e3f234cd3f70cfab62dd7c";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php";}s:68:"Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php";a:4:{s:6:"md5sum";s:32:"24905eea4858997f8247238e243632a8";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php";}s:73:"Symfony/Component/Validator/Tests/Constraints/FileValidatorObjectTest.php";a:4:{s:6:"md5sum";s:32:"89a984927585c53fe1032b9f636133ff";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/FileValidatorObjectTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorObjectTest.php";}s:71:"Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php";a:4:{s:6:"md5sum";s:32:"8a4da84c8f7e8ef54b806bd808bcc0c5";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php";}s:67:"Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php";a:4:{s:6:"md5sum";s:32:"63c0fea7da6af037f5c07e530c4daba6";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php";}s:63:"Symfony/Component/Validator/Tests/Constraints/Fixtures/test.gif";a:4:{s:6:"md5sum";s:32:"583932c265a6b3fc7b64e3ce5781d982";s:4:"name";s:63:"Symfony/Component/Validator/Tests/Constraints/Fixtures/test.gif";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/Fixtures/test.gif";}s:73:"Symfony/Component/Validator/Tests/Constraints/Fixtures/test_landscape.gif";a:4:{s:6:"md5sum";s:32:"fdcf796bda19a6af822251135ba90fc1";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/Fixtures/test_landscape.gif";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/Fixtures/test_landscape.gif";}s:72:"Symfony/Component/Validator/Tests/Constraints/Fixtures/test_portrait.gif";a:4:{s:6:"md5sum";s:32:"0aeea019389321d9f37b03634b480bc3";s:4:"name";s:72:"Symfony/Component/Validator/Tests/Constraints/Fixtures/test_portrait.gif";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/Fixtures/test_portrait.gif";}s:81:"Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php";a:4:{s:6:"md5sum";s:32:"7c9ea0cc06b77db6e3ad76e02dfb250f";s:4:"name";s:81:"Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php";}s:74:"Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php";a:4:{s:6:"md5sum";s:32:"3c4700309337c186d07c5db8620a7f16";s:4:"name";s:74:"Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php";}s:67:"Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php";a:4:{s:6:"md5sum";s:32:"24a0a471799799b4dabe807fcb55eef4";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php";}s:74:"Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php";a:4:{s:6:"md5sum";s:32:"158ec986b80be1639be50889f6d1a755";s:4:"name";s:74:"Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php";}s:68:"Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php";a:4:{s:6:"md5sum";s:32:"78dec98020821252b9a0e1cdd237c9b8";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php";}s:65:"Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php";a:4:{s:6:"md5sum";s:32:"b2b8bde3a236afaa56a0efc95040457b";s:4:"name";s:65:"Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php";}s:67:"Symfony/Component/Validator/Tests/Constraints/IsbnValidatorTest.php";a:4:{s:6:"md5sum";s:32:"e2e478a4e70021c8be50511adb544e17";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/IsbnValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/IsbnValidatorTest.php";}s:67:"Symfony/Component/Validator/Tests/Constraints/IssnValidatorTest.php";a:4:{s:6:"md5sum";s:32:"e442a58274f84d70010c01704f2be5eb";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/IssnValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/IssnValidatorTest.php";}s:71:"Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php";a:4:{s:6:"md5sum";s:32:"c000845e88198140e3a2e265ae4b5682";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php";}s:69:"Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php";a:4:{s:6:"md5sum";s:32:"cd2e05c3024174f384f7034838eaa1f5";s:4:"name";s:69:"Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php";}s:78:"Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php";a:4:{s:6:"md5sum";s:32:"2f4d2435eefd4ba92994fbc4c725a203";s:4:"name";s:78:"Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php";}s:71:"Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php";a:4:{s:6:"md5sum";s:32:"d82f8a856a9d95cd7a6d8fd6a0734981";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php";}s:69:"Symfony/Component/Validator/Tests/Constraints/LocaleValidatorTest.php";a:4:{s:6:"md5sum";s:32:"3debe15a84780f2383a690dfbb867a1d";s:4:"name";s:69:"Symfony/Component/Validator/Tests/Constraints/LocaleValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/LocaleValidatorTest.php";}s:67:"Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php";a:4:{s:6:"md5sum";s:32:"8fff3ed85f1a0ea2f1414606d66031aa";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php";}s:71:"Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php";a:4:{s:6:"md5sum";s:32:"d26340b6b9e5ddf8d71968b27c288db2";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php";}s:73:"Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php";a:4:{s:6:"md5sum";s:32:"002a50c1e4557d0b89860f47c279fc74";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php";}s:77:"Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php";a:4:{s:6:"md5sum";s:32:"4ea56306c1dbab2f83e077512a59a769";s:4:"name";s:77:"Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php";}s:70:"Symfony/Component/Validator/Tests/Constraints/NotNullValidatorTest.php";a:4:{s:6:"md5sum";s:32:"b3e3c45f358f75c450c27bcf9a046576";s:4:"name";s:70:"Symfony/Component/Validator/Tests/Constraints/NotNullValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/NotNullValidatorTest.php";}s:67:"Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php";a:4:{s:6:"md5sum";s:32:"e8e343b9fb22cecd94a9a08b993d0c3a";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php";}s:68:"Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php";a:4:{s:6:"md5sum";s:32:"f02807065a8b9e4e578ec2e806cb9b81";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php";}s:68:"Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php";a:4:{s:6:"md5sum";s:32:"457e33f80230fd2eebaa65404aa0f085";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php";}s:67:"Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php";a:4:{s:6:"md5sum";s:32:"9943acc92b78efc760c440e0f8d94998";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php";}s:67:"Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php";a:4:{s:6:"md5sum";s:32:"fe42e8bb7b68a0bb8aae4325746f2bf9";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php";}s:67:"Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php";a:4:{s:6:"md5sum";s:32:"61b6a4967362f4ac3dcbecbdcbf11156";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php";}s:66:"Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php";a:4:{s:6:"md5sum";s:32:"c61759a19cd93a2d382d40ac2e689acd";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php";}s:59:"Symfony/Component/Validator/Tests/Constraints/ValidTest.php";a:4:{s:6:"md5sum";s:32:"2d93246dad9e589df5a83163e06fb877";s:4:"name";s:59:"Symfony/Component/Validator/Tests/Constraints/ValidTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/ValidTest.php";}s:52:"Symfony/Component/Validator/Tests/ConstraintTest.php";a:4:{s:6:"md5sum";s:32:"142a99b58afedf51b2c454fff02a65f3";s:4:"name";s:52:"Symfony/Component/Validator/Tests/ConstraintTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/ConstraintTest.php";}s:65:"Symfony/Component/Validator/Tests/ConstraintViolationListTest.php";a:4:{s:6:"md5sum";s:32:"0584669a9a12dcadae796248aa9b42ff";s:4:"name";s:65:"Symfony/Component/Validator/Tests/ConstraintViolationListTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/ConstraintViolationListTest.php";}s:61:"Symfony/Component/Validator/Tests/ConstraintViolationTest.php";a:4:{s:6:"md5sum";s:32:"1319acdb0db4325c870ae4972e13efae";s:4:"name";s:61:"Symfony/Component/Validator/Tests/ConstraintViolationTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/ConstraintViolationTest.php";}s:58:"Symfony/Component/Validator/Tests/ExecutionContextTest.php";a:4:{s:6:"md5sum";s:32:"5aaa025907f20560822461a587c25457";s:4:"name";s:58:"Symfony/Component/Validator/Tests/ExecutionContextTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/ExecutionContextTest.php";}s:60:"Symfony/Component/Validator/Tests/Fixtures/CallbackClass.php";a:4:{s:6:"md5sum";s:32:"9454ace17fc81c19efac384cf4c50713";s:4:"name";s:60:"Symfony/Component/Validator/Tests/Fixtures/CallbackClass.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/CallbackClass.php";}s:62:"Symfony/Component/Validator/Tests/Fixtures/ClassConstraint.php";a:4:{s:6:"md5sum";s:32:"2ce3e43d62dc225654afccb6614717be";s:4:"name";s:62:"Symfony/Component/Validator/Tests/Fixtures/ClassConstraint.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/ClassConstraint.php";}s:58:"Symfony/Component/Validator/Tests/Fixtures/ConstraintA.php";a:4:{s:6:"md5sum";s:32:"d4169102f57729661cb27febaab2d23f";s:4:"name";s:58:"Symfony/Component/Validator/Tests/Fixtures/ConstraintA.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintA.php";}s:67:"Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php";a:4:{s:6:"md5sum";s:32:"e2c1daf935b4f95134c33129662adf08";s:4:"name";s:67:"Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php";}s:58:"Symfony/Component/Validator/Tests/Fixtures/ConstraintB.php";a:4:{s:6:"md5sum";s:32:"0157e96965ab4870f6965fbfa96a1612";s:4:"name";s:58:"Symfony/Component/Validator/Tests/Fixtures/ConstraintB.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintB.php";}s:58:"Symfony/Component/Validator/Tests/Fixtures/ConstraintC.php";a:4:{s:6:"md5sum";s:32:"8cd11e6488e0bce8f9c4de961754b500";s:4:"name";s:58:"Symfony/Component/Validator/Tests/Fixtures/ConstraintC.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintC.php";}s:66:"Symfony/Component/Validator/Tests/Fixtures/ConstraintWithValue.php";a:4:{s:6:"md5sum";s:32:"2576db20cea1031e94f9b93ef5f9303a";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Fixtures/ConstraintWithValue.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintWithValue.php";}s:75:"Symfony/Component/Validator/Tests/Fixtures/ConstraintWithValueAsDefault.php";a:4:{s:6:"md5sum";s:32:"7763c0812a069714f24f431567726500";s:4:"name";s:75:"Symfony/Component/Validator/Tests/Fixtures/ConstraintWithValueAsDefault.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/ConstraintWithValueAsDefault.php";}s:53:"Symfony/Component/Validator/Tests/Fixtures/Entity.php";a:4:{s:6:"md5sum";s:32:"6b6e6d9a60b2254024c55566fe79b08f";s:4:"name";s:53:"Symfony/Component/Validator/Tests/Fixtures/Entity.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/Entity.php";}s:62:"Symfony/Component/Validator/Tests/Fixtures/EntityInterface.php";a:4:{s:6:"md5sum";s:32:"ea31fab8aec5a8884f460f66daf7c993";s:4:"name";s:62:"Symfony/Component/Validator/Tests/Fixtures/EntityInterface.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/EntityInterface.php";}s:59:"Symfony/Component/Validator/Tests/Fixtures/EntityParent.php";a:4:{s:6:"md5sum";s:32:"a66c0953945928c193165c50757bcf04";s:4:"name";s:59:"Symfony/Component/Validator/Tests/Fixtures/EntityParent.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/EntityParent.php";}s:64:"Symfony/Component/Validator/Tests/Fixtures/FailingConstraint.php";a:4:{s:6:"md5sum";s:32:"72db5eaa66dc69f67e2d4ad5eb82b0e8";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Fixtures/FailingConstraint.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraint.php";}s:73:"Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php";a:4:{s:6:"md5sum";s:32:"c97e5a72d1d2befa96bea40821ec2c3a";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php";}s:66:"Symfony/Component/Validator/Tests/Fixtures/FakeMetadataFactory.php";a:4:{s:6:"md5sum";s:32:"edcb2a57ff4308821104e31a3ffd5167";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Fixtures/FakeMetadataFactory.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/FakeMetadataFactory.php";}s:58:"Symfony/Component/Validator/Tests/Fixtures/FilesLoader.php";a:4:{s:6:"md5sum";s:32:"068493fec3128c8cb2d29f6c5b0eaad0";s:4:"name";s:58:"Symfony/Component/Validator/Tests/Fixtures/FilesLoader.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/FilesLoader.php";}s:74:"Symfony/Component/Validator/Tests/Fixtures/GroupSequenceProviderEntity.php";a:4:{s:6:"md5sum";s:32:"ad8147295941a1cc399da4034cd61c49";s:4:"name";s:74:"Symfony/Component/Validator/Tests/Fixtures/GroupSequenceProviderEntity.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/GroupSequenceProviderEntity.php";}s:64:"Symfony/Component/Validator/Tests/Fixtures/InvalidConstraint.php";a:4:{s:6:"md5sum";s:32:"ddb0895d24c9c089229b3b932538aabd";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Fixtures/InvalidConstraint.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/InvalidConstraint.php";}s:73:"Symfony/Component/Validator/Tests/Fixtures/InvalidConstraintValidator.php";a:4:{s:6:"md5sum";s:32:"5681169dbdca0c79b579401520a7173d";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Fixtures/InvalidConstraintValidator.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/InvalidConstraintValidator.php";}s:65:"Symfony/Component/Validator/Tests/Fixtures/PropertyConstraint.php";a:4:{s:6:"md5sum";s:32:"fbc643d2960104a96a86a281f0d099bb";s:4:"name";s:65:"Symfony/Component/Validator/Tests/Fixtures/PropertyConstraint.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/PropertyConstraint.php";}s:56:"Symfony/Component/Validator/Tests/Fixtures/Reference.php";a:4:{s:6:"md5sum";s:32:"9d6e84977cc653a0673858a764ec39d6";s:4:"name";s:56:"Symfony/Component/Validator/Tests/Fixtures/Reference.php";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures/Reference.php";}s:74:"Symfony/Component/Validator/Tests/Mapping/BlackholeMetadataFactoryTest.php";a:4:{s:6:"md5sum";s:32:"7353a9cae56c607794bee8094e41ffd4";s:4:"name";s:74:"Symfony/Component/Validator/Tests/Mapping/BlackholeMetadataFactoryTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/BlackholeMetadataFactoryTest.php";}s:64:"Symfony/Component/Validator/Tests/Mapping/Cache/ApcCacheTest.php";a:4:{s:6:"md5sum";s:32:"8d720776b21d7ce674a7365e5d2e38d2";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Mapping/Cache/ApcCacheTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Cache/ApcCacheTest.php";}s:70:"Symfony/Component/Validator/Tests/Mapping/ClassMetadataFactoryTest.php";a:4:{s:6:"md5sum";s:32:"9fe738a4b6ba7f5105f2190fd449268e";s:4:"name";s:70:"Symfony/Component/Validator/Tests/Mapping/ClassMetadataFactoryTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/ClassMetadataFactoryTest.php";}s:63:"Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php";a:4:{s:6:"md5sum";s:32:"a4495fa7cfe81f702f45d66a7fca8617";s:4:"name";s:63:"Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php";}s:65:"Symfony/Component/Validator/Tests/Mapping/ElementMetadataTest.php";a:4:{s:6:"md5sum";s:32:"4384111241f1abc0445a06c539451f2a";s:4:"name";s:65:"Symfony/Component/Validator/Tests/Mapping/ElementMetadataTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/ElementMetadataTest.php";}s:64:"Symfony/Component/Validator/Tests/Mapping/GetterMetadataTest.php";a:4:{s:6:"md5sum";s:32:"d7f74984a4455152140bed27936361c0";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Mapping/GetterMetadataTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/GetterMetadataTest.php";}s:79:"Symfony/Component/Validator/Tests/Mapping/Loader/AbstractMethodStaticLoader.php";a:4:{s:6:"md5sum";s:32:"0175b97f1eb69fcce94b306e900db362";s:4:"name";s:79:"Symfony/Component/Validator/Tests/Mapping/Loader/AbstractMethodStaticLoader.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/AbstractMethodStaticLoader.php";}s:73:"Symfony/Component/Validator/Tests/Mapping/Loader/AnnotationLoaderTest.php";a:4:{s:6:"md5sum";s:32:"05410e4aaaf0a9a25ddc5c4134924390";s:4:"name";s:73:"Symfony/Component/Validator/Tests/Mapping/Loader/AnnotationLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/AnnotationLoaderTest.php";}s:83:"Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping-non-strings.xml";a:4:{s:6:"md5sum";s:32:"c75233f90b5cfa4a398e1f9e543bf5bc";s:4:"name";s:83:"Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping-non-strings.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping-non-strings.xml";}s:71:"Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.xml";a:4:{s:6:"md5sum";s:32:"16ec478e3cf1b1bc1cab57aed6dadc6a";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.xml";}s:71:"Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.yml";a:4:{s:6:"md5sum";s:32:"7643e62f12cd427f2b5fd1fa9a5f6133";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.yml";}s:66:"Symfony/Component/Validator/Tests/Mapping/Loader/empty-mapping.yml";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Mapping/Loader/empty-mapping.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/empty-mapping.yml";}s:68:"Symfony/Component/Validator/Tests/Mapping/Loader/FilesLoaderTest.php";a:4:{s:6:"md5sum";s:32:"3bcfc4369f23356627bddd2555552d7f";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Mapping/Loader/FilesLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/FilesLoaderTest.php";}s:68:"Symfony/Component/Validator/Tests/Mapping/Loader/LoaderChainTest.php";a:4:{s:6:"md5sum";s:32:"e28f9bc1f67084ac7661410da1fceaed";s:4:"name";s:68:"Symfony/Component/Validator/Tests/Mapping/Loader/LoaderChainTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/LoaderChainTest.php";}s:69:"Symfony/Component/Validator/Tests/Mapping/Loader/nonvalid-mapping.yml";a:4:{s:6:"md5sum";s:32:"d3b07384d113edec49eaa6238ad5ff00";s:4:"name";s:69:"Symfony/Component/Validator/Tests/Mapping/Loader/nonvalid-mapping.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/nonvalid-mapping.yml";}s:75:"Symfony/Component/Validator/Tests/Mapping/Loader/StaticMethodLoaderTest.php";a:4:{s:6:"md5sum";s:32:"561fb1c6e9ee5b4de0ab14129619af6f";s:4:"name";s:75:"Symfony/Component/Validator/Tests/Mapping/Loader/StaticMethodLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/StaticMethodLoaderTest.php";}s:64:"Symfony/Component/Validator/Tests/Mapping/Loader/withdoctype.xml";a:4:{s:6:"md5sum";s:32:"bf3a0038b2c219b56536ee96a18b5f7d";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Mapping/Loader/withdoctype.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/withdoctype.xml";}s:70:"Symfony/Component/Validator/Tests/Mapping/Loader/XmlFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"fee7255c9f688a416d2fe1d34a1e3389";s:4:"name";s:70:"Symfony/Component/Validator/Tests/Mapping/Loader/XmlFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/XmlFileLoaderTest.php";}s:71:"Symfony/Component/Validator/Tests/Mapping/Loader/YamlFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"adc321984d79e773e10da8b4a1d2cbd4";s:4:"name";s:71:"Symfony/Component/Validator/Tests/Mapping/Loader/YamlFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader/YamlFileLoaderTest.php";}s:64:"Symfony/Component/Validator/Tests/Mapping/MemberMetadataTest.php";a:4:{s:6:"md5sum";s:32:"b60229644c0267c6db54c14164b8d4c6";s:4:"name";s:64:"Symfony/Component/Validator/Tests/Mapping/MemberMetadataTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/MemberMetadataTest.php";}s:66:"Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php";a:4:{s:6:"md5sum";s:32:"58769dbf877b4372cf5f4b418bee5d1a";s:4:"name";s:66:"Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php";}s:59:"Symfony/Component/Validator/Tests/ValidationVisitorTest.php";a:4:{s:6:"md5sum";s:32:"4380de8196121010c2219a131015c0bd";s:4:"name";s:59:"Symfony/Component/Validator/Tests/ValidationVisitorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/ValidationVisitorTest.php";}s:58:"Symfony/Component/Validator/Tests/ValidatorBuilderTest.php";a:4:{s:6:"md5sum";s:32:"5b599d3d7e28f3c31dd64a8e4a461798";s:4:"name";s:58:"Symfony/Component/Validator/Tests/ValidatorBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/ValidatorBuilderTest.php";}s:51:"Symfony/Component/Validator/Tests/ValidatorTest.php";a:4:{s:6:"md5sum";s:32:"c0d58093c8f48e173cf012832b5eff3d";s:4:"name";s:51:"Symfony/Component/Validator/Tests/ValidatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/ValidatorTest.php";}s:42:"Symfony/Component/Validator/Validation.php";a:4:{s:6:"md5sum";s:32:"cb4be714363c679edca5adea512653db";s:4:"name";s:42:"Symfony/Component/Validator/Validation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Validation.php";}s:49:"Symfony/Component/Validator/ValidationVisitor.php";a:4:{s:6:"md5sum";s:32:"7c3d1976b86cb3bee62b80d06037a82c";s:4:"name";s:49:"Symfony/Component/Validator/ValidationVisitor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ValidationVisitor.php";}s:58:"Symfony/Component/Validator/ValidationVisitorInterface.php";a:4:{s:6:"md5sum";s:32:"d9246ccdbae1aac172f0b344b77a0a6c";s:4:"name";s:58:"Symfony/Component/Validator/ValidationVisitorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ValidationVisitorInterface.php";}s:41:"Symfony/Component/Validator/Validator.php";a:4:{s:6:"md5sum";s:32:"dab18aca325ae61509511a918442e133";s:4:"name";s:41:"Symfony/Component/Validator/Validator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Validator.php";}s:48:"Symfony/Component/Validator/ValidatorBuilder.php";a:4:{s:6:"md5sum";s:32:"f3e3ae245a988856adea2ef86b30d27f";s:4:"name";s:48:"Symfony/Component/Validator/ValidatorBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ValidatorBuilder.php";}s:57:"Symfony/Component/Validator/ValidatorBuilderInterface.php";a:4:{s:6:"md5sum";s:32:"f3528198e3b2790e1a7ffee686196923";s:4:"name";s:57:"Symfony/Component/Validator/ValidatorBuilderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ValidatorBuilderInterface.php";}s:50:"Symfony/Component/Validator/ValidatorInterface.php";a:4:{s:6:"md5sum";s:32:"7e994e15443d4bf79a747b6454bb5e76";s:4:"name";s:50:"Symfony/Component/Validator/ValidatorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/ValidatorInterface.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:29:{s:57:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:71:"/opt/alt/php54/usr/share/doc/pear/Validator/Symfony/Component/Validator";b:1;s:61:"/opt/alt/php54/usr/share/doc/pear/Validator/Symfony/Component";b:1;s:51:"/opt/alt/php54/usr/share/doc/pear/Validator/Symfony";b:1;s:43:"/opt/alt/php54/usr/share/doc/pear/Validator";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints";b:1;s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Constraints/Collection";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Exception";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping";b:1;s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Cache";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader";b:1;s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping";b:1;s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/schema/dic";b:1;s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Mapping/Loader/schema";b:1;s:72:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator";b:1;s:62:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component";b:1;s:52:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony";b:1;s:44:"/opt/alt/php54/usr/share/pear/test/Validator";b:1;s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources/translations";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Validator/Resources";b:1;s:90:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints";b:1;s:78:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests";b:1;s:99:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Constraints/Fixtures";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Fixtures";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping";b:1;s:92:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Cache";b:1;s:93:"/opt/alt/php54/usr/share/pear/test/Validator/Symfony/Component/Validator/Tests/Mapping/Loader";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:4:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:4:"Yaml";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:3;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:14:"HttpFoundation";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506495;}PK�^�\px�NJNJ4pear/.registry/.channel.pear.symfony.com/process.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:7:"Process";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:26:"Symfony2 Process Component";s:11:"description";s:26:"Symfony2 Process Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:48";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:32:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d39ea12d1764b05af5e85dae2c48c793";s:4:"name";s:40:"Symfony/Component/Process/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1c079058bd8ecb9a361d7d315fb5e5ae";s:4:"name";s:38:"Symfony/Component/Process/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bf954605bb40623c26cfca6fdc344c5e";s:4:"name";s:39:"Symfony/Component/Process/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"723a4615b94a21c979c9cfe85d81e50a";s:4:"name";s:58:"Symfony/Component/Process/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b3c8598f88e6ac643dda6cb6f29fb3ba";s:4:"name";s:64:"Symfony/Component/Process/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"72ef3efed027815b107a71f4e987754d";s:4:"name";s:54:"Symfony/Component/Process/Exception/LogicException.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7726c705c207d8bd0455597b19f5e035";s:4:"name";s:62:"Symfony/Component/Process/Exception/ProcessFailedException.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"da8b86018e9365453290e986630fdac9";s:4:"name";s:64:"Symfony/Component/Process/Exception/ProcessTimedOutException.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5173fb5053527af7b83077085b192d67";s:4:"name";s:56:"Symfony/Component/Process/Exception/RuntimeException.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ec007221c50ca2fa099de00cc14d95f8";s:4:"name";s:46:"Symfony/Component/Process/ExecutableFinder.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:33:"Symfony/Component/Process/LICENSE";s:4:"role";s:3:"doc";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fba1a6b8ff2371258f20c316c3aee410";s:4:"name";s:49:"Symfony/Component/Process/PhpExecutableFinder.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2218c2a825f09243ab31c4194dc71ac8";s:4:"name";s:40:"Symfony/Component/Process/PhpProcess.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"38416969b8bd90a8627afbdea4d56fbb";s:4:"name";s:42:"Symfony/Component/Process/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d6a4515f04d6a7095c32c8becf869ea2";s:4:"name";s:37:"Symfony/Component/Process/Process.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"22a24c881ccc2a334cb39f3406386ab4";s:4:"name";s:44:"Symfony/Component/Process/ProcessBuilder.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9170706e98976ed4b63ec5496e553454";s:4:"name";s:42:"Symfony/Component/Process/ProcessPipes.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e656122ad88214d14d5fb0da26038958";s:4:"name";s:42:"Symfony/Component/Process/ProcessUtils.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f2d4849606123482d1ee255038021f68";s:4:"name";s:35:"Symfony/Component/Process/README.md";s:4:"role";s:3:"doc";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8c50bc22c7ee63d0b781721e49cd29f3";s:4:"name";s:55:"Symfony/Component/Process/Tests/AbstractProcessTest.php";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"536f711e6e2aa61bf065b29e8631825f";s:4:"name";s:54:"Symfony/Component/Process/Tests/NonStopableProcess.php";s:4:"role";s:4:"test";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7f5014eeb10fe782977f36a0a363b339";s:4:"name";s:59:"Symfony/Component/Process/Tests/PhpExecutableFinderTest.php";s:4:"role";s:4:"test";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5636117b645854523f4e49119e05286a";s:4:"name";s:50:"Symfony/Component/Process/Tests/PhpProcessTest.php";s:4:"role";s:4:"test";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4bb65137b612922b87bae61f12ddaa93";s:4:"name";s:71:"Symfony/Component/Process/Tests/PipeStdinInStdoutStdErrStreamSelect.php";s:4:"role";s:4:"test";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"841d9ebee0e41be0280387ae00485d31";s:4:"name";s:54:"Symfony/Component/Process/Tests/ProcessBuilderTest.php";s:4:"role";s:4:"test";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"548e570239c6a450fba22a768ada8542";s:4:"name";s:62:"Symfony/Component/Process/Tests/ProcessFailedExceptionTest.php";s:4:"role";s:4:"test";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fadee2df6610863207b16c6077b5c282";s:4:"name";s:64:"Symfony/Component/Process/Tests/ProcessInSigchildEnvironment.php";s:4:"role";s:4:"test";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2afe80bbab70e5a8badccebb32021372";s:4:"name";s:52:"Symfony/Component/Process/Tests/ProcessUtilsTest.php";s:4:"role";s:4:"test";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"00f0e0d73858eae9e670635a5c0d66f6";s:4:"name";s:63:"Symfony/Component/Process/Tests/SigchildDisabledProcessTest.php";s:4:"role";s:4:"test";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c3d833e3cc8e7545bfaefff2d369b07b";s:4:"name";s:62:"Symfony/Component/Process/Tests/SigchildEnabledProcessTest.php";s:4:"role";s:4:"test";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b75bfa6a7dfd6efbc39a5f7f870fa64c";s:4:"name";s:50:"Symfony/Component/Process/Tests/SignalListener.php";s:4:"role";s:4:"test";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d952eb9a5f29bc454a9263a38453feb";s:4:"name";s:53:"Symfony/Component/Process/Tests/SimpleProcessTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:32:{s:40:"Symfony/Component/Process/autoloader.php";a:4:{s:6:"md5sum";s:32:"d39ea12d1764b05af5e85dae2c48c793";s:4:"name";s:40:"Symfony/Component/Process/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/autoloader.php";}s:38:"Symfony/Component/Process/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"1c079058bd8ecb9a361d7d315fb5e5ae";s:4:"name";s:38:"Symfony/Component/Process/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/doc/pear/Process/Symfony/Component/Process/CHANGELOG.md";}s:39:"Symfony/Component/Process/composer.json";a:4:{s:6:"md5sum";s:32:"bf954605bb40623c26cfca6fdc344c5e";s:4:"name";s:39:"Symfony/Component/Process/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/Process/Symfony/Component/Process/composer.json";}s:58:"Symfony/Component/Process/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"723a4615b94a21c979c9cfe85d81e50a";s:4:"name";s:58:"Symfony/Component/Process/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/Exception/ExceptionInterface.php";}s:64:"Symfony/Component/Process/Exception/InvalidArgumentException.php";a:4:{s:6:"md5sum";s:32:"b3c8598f88e6ac643dda6cb6f29fb3ba";s:4:"name";s:64:"Symfony/Component/Process/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/Exception/InvalidArgumentException.php";}s:54:"Symfony/Component/Process/Exception/LogicException.php";a:4:{s:6:"md5sum";s:32:"72ef3efed027815b107a71f4e987754d";s:4:"name";s:54:"Symfony/Component/Process/Exception/LogicException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/Exception/LogicException.php";}s:62:"Symfony/Component/Process/Exception/ProcessFailedException.php";a:4:{s:6:"md5sum";s:32:"7726c705c207d8bd0455597b19f5e035";s:4:"name";s:62:"Symfony/Component/Process/Exception/ProcessFailedException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/Exception/ProcessFailedException.php";}s:64:"Symfony/Component/Process/Exception/ProcessTimedOutException.php";a:4:{s:6:"md5sum";s:32:"da8b86018e9365453290e986630fdac9";s:4:"name";s:64:"Symfony/Component/Process/Exception/ProcessTimedOutException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/Exception/ProcessTimedOutException.php";}s:56:"Symfony/Component/Process/Exception/RuntimeException.php";a:4:{s:6:"md5sum";s:32:"5173fb5053527af7b83077085b192d67";s:4:"name";s:56:"Symfony/Component/Process/Exception/RuntimeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/Exception/RuntimeException.php";}s:46:"Symfony/Component/Process/ExecutableFinder.php";a:4:{s:6:"md5sum";s:32:"ec007221c50ca2fa099de00cc14d95f8";s:4:"name";s:46:"Symfony/Component/Process/ExecutableFinder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/ExecutableFinder.php";}s:33:"Symfony/Component/Process/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:33:"Symfony/Component/Process/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/doc/pear/Process/Symfony/Component/Process/LICENSE";}s:49:"Symfony/Component/Process/PhpExecutableFinder.php";a:4:{s:6:"md5sum";s:32:"fba1a6b8ff2371258f20c316c3aee410";s:4:"name";s:49:"Symfony/Component/Process/PhpExecutableFinder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/PhpExecutableFinder.php";}s:40:"Symfony/Component/Process/PhpProcess.php";a:4:{s:6:"md5sum";s:32:"2218c2a825f09243ab31c4194dc71ac8";s:4:"name";s:40:"Symfony/Component/Process/PhpProcess.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/PhpProcess.php";}s:42:"Symfony/Component/Process/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"38416969b8bd90a8627afbdea4d56fbb";s:4:"name";s:42:"Symfony/Component/Process/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/phpunit.xml.dist";}s:37:"Symfony/Component/Process/Process.php";a:4:{s:6:"md5sum";s:32:"d6a4515f04d6a7095c32c8becf869ea2";s:4:"name";s:37:"Symfony/Component/Process/Process.php";s:4:"role";s:3:"php";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/Process.php";}s:44:"Symfony/Component/Process/ProcessBuilder.php";a:4:{s:6:"md5sum";s:32:"22a24c881ccc2a334cb39f3406386ab4";s:4:"name";s:44:"Symfony/Component/Process/ProcessBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/ProcessBuilder.php";}s:42:"Symfony/Component/Process/ProcessPipes.php";a:4:{s:6:"md5sum";s:32:"9170706e98976ed4b63ec5496e553454";s:4:"name";s:42:"Symfony/Component/Process/ProcessPipes.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/ProcessPipes.php";}s:42:"Symfony/Component/Process/ProcessUtils.php";a:4:{s:6:"md5sum";s:32:"e656122ad88214d14d5fb0da26038958";s:4:"name";s:42:"Symfony/Component/Process/ProcessUtils.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/ProcessUtils.php";}s:35:"Symfony/Component/Process/README.md";a:4:{s:6:"md5sum";s:32:"f2d4849606123482d1ee255038021f68";s:4:"name";s:35:"Symfony/Component/Process/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/doc/pear/Process/Symfony/Component/Process/README.md";}s:55:"Symfony/Component/Process/Tests/AbstractProcessTest.php";a:4:{s:6:"md5sum";s:32:"8c50bc22c7ee63d0b781721e49cd29f3";s:4:"name";s:55:"Symfony/Component/Process/Tests/AbstractProcessTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/AbstractProcessTest.php";}s:54:"Symfony/Component/Process/Tests/NonStopableProcess.php";a:4:{s:6:"md5sum";s:32:"536f711e6e2aa61bf065b29e8631825f";s:4:"name";s:54:"Symfony/Component/Process/Tests/NonStopableProcess.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/NonStopableProcess.php";}s:59:"Symfony/Component/Process/Tests/PhpExecutableFinderTest.php";a:4:{s:6:"md5sum";s:32:"7f5014eeb10fe782977f36a0a363b339";s:4:"name";s:59:"Symfony/Component/Process/Tests/PhpExecutableFinderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/PhpExecutableFinderTest.php";}s:50:"Symfony/Component/Process/Tests/PhpProcessTest.php";a:4:{s:6:"md5sum";s:32:"5636117b645854523f4e49119e05286a";s:4:"name";s:50:"Symfony/Component/Process/Tests/PhpProcessTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/PhpProcessTest.php";}s:71:"Symfony/Component/Process/Tests/PipeStdinInStdoutStdErrStreamSelect.php";a:4:{s:6:"md5sum";s:32:"4bb65137b612922b87bae61f12ddaa93";s:4:"name";s:71:"Symfony/Component/Process/Tests/PipeStdinInStdoutStdErrStreamSelect.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/PipeStdinInStdoutStdErrStreamSelect.php";}s:54:"Symfony/Component/Process/Tests/ProcessBuilderTest.php";a:4:{s:6:"md5sum";s:32:"841d9ebee0e41be0280387ae00485d31";s:4:"name";s:54:"Symfony/Component/Process/Tests/ProcessBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/ProcessBuilderTest.php";}s:62:"Symfony/Component/Process/Tests/ProcessFailedExceptionTest.php";a:4:{s:6:"md5sum";s:32:"548e570239c6a450fba22a768ada8542";s:4:"name";s:62:"Symfony/Component/Process/Tests/ProcessFailedExceptionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/ProcessFailedExceptionTest.php";}s:64:"Symfony/Component/Process/Tests/ProcessInSigchildEnvironment.php";a:4:{s:6:"md5sum";s:32:"fadee2df6610863207b16c6077b5c282";s:4:"name";s:64:"Symfony/Component/Process/Tests/ProcessInSigchildEnvironment.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/ProcessInSigchildEnvironment.php";}s:52:"Symfony/Component/Process/Tests/ProcessUtilsTest.php";a:4:{s:6:"md5sum";s:32:"2afe80bbab70e5a8badccebb32021372";s:4:"name";s:52:"Symfony/Component/Process/Tests/ProcessUtilsTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/ProcessUtilsTest.php";}s:63:"Symfony/Component/Process/Tests/SigchildDisabledProcessTest.php";a:4:{s:6:"md5sum";s:32:"00f0e0d73858eae9e670635a5c0d66f6";s:4:"name";s:63:"Symfony/Component/Process/Tests/SigchildDisabledProcessTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/SigchildDisabledProcessTest.php";}s:62:"Symfony/Component/Process/Tests/SigchildEnabledProcessTest.php";a:4:{s:6:"md5sum";s:32:"c3d833e3cc8e7545bfaefff2d369b07b";s:4:"name";s:62:"Symfony/Component/Process/Tests/SigchildEnabledProcessTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/SigchildEnabledProcessTest.php";}s:50:"Symfony/Component/Process/Tests/SignalListener.php";a:4:{s:6:"md5sum";s:32:"b75bfa6a7dfd6efbc39a5f7f870fa64c";s:4:"name";s:50:"Symfony/Component/Process/Tests/SignalListener.php";s:4:"role";s:4:"test";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/SignalListener.php";}s:53:"Symfony/Component/Process/Tests/SimpleProcessTest.php";a:4:{s:6:"md5sum";s:32:"8d952eb9a5f29bc454a9263a38453feb";s:4:"name";s:53:"Symfony/Component/Process/Tests/SimpleProcessTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests/SimpleProcessTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:13:{s:55:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:67:"/opt/alt/php54/usr/share/doc/pear/Process/Symfony/Component/Process";b:1;s:59:"/opt/alt/php54/usr/share/doc/pear/Process/Symfony/Component";b:1;s:49:"/opt/alt/php54/usr/share/doc/pear/Process/Symfony";b:1;s:41:"/opt/alt/php54/usr/share/doc/pear/Process";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Process/Exception";b:1;s:68:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process";b:1;s:60:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component";b:1;s:50:"/opt/alt/php54/usr/share/pear/test/Process/Symfony";b:1;s:42:"/opt/alt/php54/usr/share/pear/test/Process";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/Process/Symfony/Component/Process/Tests";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\��4=/�/�7pear/.registry/.channel.pear.symfony.com/twigbridge.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:10:"TwigBridge";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:20:"Symfony2 Twig Bridge";s:11:"description";s:20:"Symfony2 Twig Bridge";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:40";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:64:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e563ac483a8dbba1bc0548a4235a144a";s:4:"name";s:34:"Symfony/Bridge/Twig/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"24b7a25e7391c3ca87f58d8a328a10f9";s:4:"name";s:32:"Symfony/Bridge/Twig/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f95ddec9fc8092fd32900b7bff18b251";s:4:"name";s:33:"Symfony/Bridge/Twig/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ce21bdc85dfe3a9363d954915f655592";s:4:"name";s:47:"Symfony/Bridge/Twig/Extension/CodeExtension.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"65698eda8cff6e905e08122e58687c86";s:4:"name";s:53:"Symfony/Bridge/Twig/Extension/ExpressionExtension.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c3ee7041691d8a13626e3242b50ba9a2";s:4:"name";s:47:"Symfony/Bridge/Twig/Extension/FormExtension.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ae8fd7e7957f71843eb72b0dfea84386";s:4:"name";s:53:"Symfony/Bridge/Twig/Extension/HttpKernelExtension.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b1e34bbc300fb73296ed795e3cf200b5";s:4:"name";s:50:"Symfony/Bridge/Twig/Extension/RoutingExtension.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"406e316d507396925ce36c5039bf0c6b";s:4:"name";s:51:"Symfony/Bridge/Twig/Extension/SecurityExtension.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bcbf90a6081eb164ebf8aa26424034cf";s:4:"name";s:52:"Symfony/Bridge/Twig/Extension/StopwatchExtension.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cee4a3d32bbd87757b2c6cd4de05e209";s:4:"name";s:54:"Symfony/Bridge/Twig/Extension/TranslationExtension.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ae5855df258047211247fdfb8cb9cb9c";s:4:"name";s:47:"Symfony/Bridge/Twig/Extension/YamlExtension.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"96815060d6bee8fbcfecd4f0ca94cc7c";s:4:"name";s:41:"Symfony/Bridge/Twig/Form/TwigRenderer.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"edf3b98358b100da17afa76a9acacdd5";s:4:"name";s:47:"Symfony/Bridge/Twig/Form/TwigRendererEngine.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"02bc975c2fcb576a69c8e5ffa2e14ce5";s:4:"name";s:56:"Symfony/Bridge/Twig/Form/TwigRendererEngineInterface.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"96103a4ce079ad131d65578737a381c6";s:4:"name";s:50:"Symfony/Bridge/Twig/Form/TwigRendererInterface.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:27:"Symfony/Bridge/Twig/LICENSE";s:4:"role";s:3:"doc";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eeaac65947d7a23199b9ab2b3421295f";s:4:"name";s:44:"Symfony/Bridge/Twig/Node/FormEnctypeNode.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a7532f88e5dbae6209363fc2d5fdc358";s:4:"name";s:42:"Symfony/Bridge/Twig/Node/FormThemeNode.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9a15391aa07a352fae06f7ed12a9fd60";s:4:"name";s:44:"Symfony/Bridge/Twig/Node/RenderBlockNode.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2e379adad86d64a326c899290ede04ad";s:4:"name";s:53:"Symfony/Bridge/Twig/Node/SearchAndRenderBlockNode.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"23ed426e4e8ecbb7694e7ea41b9b0890";s:4:"name";s:42:"Symfony/Bridge/Twig/Node/StopwatchNode.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0526f6b70eaba23a52160d231433f9a2";s:4:"name";s:51:"Symfony/Bridge/Twig/Node/TransDefaultDomainNode.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e1d88cb3d69813c50c1d7f847a3998fb";s:4:"name";s:38:"Symfony/Bridge/Twig/Node/TransNode.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"748686792da8fc6ece450126fadad7c8";s:4:"name";s:41:"Symfony/Bridge/Twig/NodeVisitor/Scope.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"519ceb71a1f48a857850fefc9f899e65";s:4:"name";s:71:"Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"20a1ae206f399b7a45474eed11242532";s:4:"name";s:58:"Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b2790b452896e6c319fef59e08204ca3";s:4:"name";s:36:"Symfony/Bridge/Twig/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09c10943b1bd396bdd40244b6f1670de";s:4:"name";s:29:"Symfony/Bridge/Twig/README.md";s:4:"role";s:3:"doc";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7db396d0e3531236572ab842e1d785f3";s:4:"name";s:66:"Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bf705e344ab695195d83108c5a744291";s:4:"name";s:68:"Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"62b01d26c529435b127df0b68da87a8e";s:4:"name";s:57:"Symfony/Bridge/Twig/Tests/Extension/child_label.html.twig";s:4:"role";s:4:"test";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"de9fa5a69d9ffeaace77f48c8c970a16";s:4:"name";s:57:"Symfony/Bridge/Twig/Tests/Extension/CodeExtensionTest.php";s:4:"role";s:4:"test";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"341920fd913325029b8875d19416f539";s:4:"name";s:60:"Symfony/Bridge/Twig/Tests/Extension/custom_widgets.html.twig";s:4:"role";s:4:"test";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"59f22743c289e6a916c20f335245b023";s:4:"name";s:63:"Symfony/Bridge/Twig/Tests/Extension/ExpressionExtensionTest.php";s:4:"role";s:4:"test";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d721545275f06c65c48b93fff1d63008";s:4:"name";s:69:"Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubFilesystemLoader.php";s:4:"role";s:4:"test";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2e4ed81306cf97510d18da3f33289fd7";s:4:"name";s:63:"Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubTranslator.php";s:4:"role";s:4:"test";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"54d08b06b4f1626df69403bfba38218f";s:4:"name";s:66:"Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php";s:4:"role";s:4:"test";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ce9150c7e8fabcbe1539051f087a5c7b";s:4:"name";s:68:"Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php";s:4:"role";s:4:"test";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b54b450a89e781ad60a2807fb2678eeb";s:4:"name";s:63:"Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php";s:4:"role";s:4:"test";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6753e22fa543cb3368c9e0000e2f270c";s:4:"name";s:66:"Symfony/Bridge/Twig/Tests/Extension/page_dynamic_extends.html.twig";s:4:"role";s:4:"test";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6861f5bb94faf3b42691192cf3017750";s:4:"name";s:58:"Symfony/Bridge/Twig/Tests/Extension/parent_label.html.twig";s:4:"role";s:4:"test";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7897b6f0d377c1dcbc7b1a9d34450b40";s:4:"name";s:60:"Symfony/Bridge/Twig/Tests/Extension/RoutingExtensionTest.php";s:4:"role";s:4:"test";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"40377cd7f95bb691e04c883df5a09db5";s:4:"name";s:62:"Symfony/Bridge/Twig/Tests/Extension/StopwatchExtensionTest.php";s:4:"role";s:4:"test";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d43686f93a9702b4cfd91df3053b602b";s:4:"name";s:51:"Symfony/Bridge/Twig/Tests/Extension/theme.html.twig";s:4:"role";s:4:"test";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d172147242bd0b80e328e6e9e88dd5e7";s:4:"name";s:59:"Symfony/Bridge/Twig/Tests/Extension/theme_extends.html.twig";s:4:"role";s:4:"test";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e4a1661a04d5bafdd840b035f0c9511e";s:4:"name";s:55:"Symfony/Bridge/Twig/Tests/Extension/theme_use.html.twig";s:4:"role";s:4:"test";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eb868a90365c1c3b2f7573551a8a45a3";s:4:"name";s:64:"Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php";s:4:"role";s:4:"test";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0af17ef668b1281a4e89bf51028ec695";s:4:"name";s:48:"Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php";s:4:"role";s:4:"test";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7b8b963bd2b033ae246edd3ba7d6f97e";s:4:"name";s:63:"Symfony/Bridge/Twig/Tests/Node/SearchAndRenderBlockNodeTest.php";s:4:"role";s:4:"test";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7fd3f6760029514c0a55503418d8b0b4";s:4:"name";s:51:"Symfony/Bridge/Twig/Tests/NodeVisitor/ScopeTest.php";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c8f71ffe1e4fcb0bb4a69120feb30bd0";s:4:"name";s:81:"Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php";s:4:"role";s:4:"test";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ec0588a5b4d7dd36d668a39a8849dd72";s:4:"name";s:68:"Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationNodeVisitorTest.php";s:4:"role";s:4:"test";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d8c329c5c7afb266a65967762f0684f2";s:4:"name";s:58:"Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php";s:4:"role";s:4:"test";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"95b22c803b2c8065500328508c60ed02";s:4:"name";s:66:"Symfony/Bridge/Twig/Tests/TokenParser/FormThemeTokenParserTest.php";s:4:"role";s:4:"test";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9cd79976725b5279223a0e16a318f292";s:4:"name";s:59:"Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php";s:4:"role";s:4:"test";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f73d33e407b60220f8c6af100a4d0358";s:4:"name";s:44:"Symfony/Bridge/Twig/Tests/TwigEngineTest.php";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b4e9ee4d27632d7c1f1de3795480df67";s:4:"name";s:56:"Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php";s:4:"role";s:3:"php";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"748c45d30621f1f2d245102924f7fdff";s:4:"name";s:56:"Symfony/Bridge/Twig/TokenParser/StopwatchTokenParser.php";s:4:"role";s:3:"php";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0354e3a6d83924f2da374f158de149ba";s:4:"name";s:58:"Symfony/Bridge/Twig/TokenParser/TransChoiceTokenParser.php";s:4:"role";s:3:"php";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"58650d506d0035b1622780ababcfca5a";s:4:"name";s:65:"Symfony/Bridge/Twig/TokenParser/TransDefaultDomainTokenParser.php";s:4:"role";s:3:"php";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"27e4d98f60a06de551c32d2e852c7139";s:4:"name";s:52:"Symfony/Bridge/Twig/TokenParser/TransTokenParser.php";s:4:"role";s:3:"php";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b914862fe8b32c41e260ea530bd430f1";s:4:"name";s:49:"Symfony/Bridge/Twig/Translation/TwigExtractor.php";s:4:"role";s:3:"php";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e11b1b874251de2867b3673a674ff71d";s:4:"name";s:34:"Symfony/Bridge/Twig/TwigEngine.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}s:8:"optional";a:1:{s:7:"package";a:4:{i:0;a:2:{s:4:"name";s:4:"Form";s:7:"channel";s:16:"pear.symfony.com";}i:1;a:2:{s:4:"name";s:7:"Routing";s:7:"channel";s:16:"pear.symfony.com";}i:2;a:2:{s:4:"name";s:11:"Translation";s:7:"channel";s:16:"pear.symfony.com";}i:3;a:2:{s:4:"name";s:4:"Yaml";s:7:"channel";s:16:"pear.symfony.com";}}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:64:{s:34:"Symfony/Bridge/Twig/autoloader.php";a:4:{s:6:"md5sum";s:32:"e563ac483a8dbba1bc0548a4235a144a";s:4:"name";s:34:"Symfony/Bridge/Twig/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/autoloader.php";}s:32:"Symfony/Bridge/Twig/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"24b7a25e7391c3ca87f58d8a328a10f9";s:4:"name";s:32:"Symfony/Bridge/Twig/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/doc/pear/TwigBridge/Symfony/Bridge/Twig/CHANGELOG.md";}s:33:"Symfony/Bridge/Twig/composer.json";a:4:{s:6:"md5sum";s:32:"f95ddec9fc8092fd32900b7bff18b251";s:4:"name";s:33:"Symfony/Bridge/Twig/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/doc/pear/TwigBridge/Symfony/Bridge/Twig/composer.json";}s:47:"Symfony/Bridge/Twig/Extension/CodeExtension.php";a:4:{s:6:"md5sum";s:32:"ce21bdc85dfe3a9363d954915f655592";s:4:"name";s:47:"Symfony/Bridge/Twig/Extension/CodeExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Extension/CodeExtension.php";}s:53:"Symfony/Bridge/Twig/Extension/ExpressionExtension.php";a:4:{s:6:"md5sum";s:32:"65698eda8cff6e905e08122e58687c86";s:4:"name";s:53:"Symfony/Bridge/Twig/Extension/ExpressionExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Extension/ExpressionExtension.php";}s:47:"Symfony/Bridge/Twig/Extension/FormExtension.php";a:4:{s:6:"md5sum";s:32:"c3ee7041691d8a13626e3242b50ba9a2";s:4:"name";s:47:"Symfony/Bridge/Twig/Extension/FormExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Extension/FormExtension.php";}s:53:"Symfony/Bridge/Twig/Extension/HttpKernelExtension.php";a:4:{s:6:"md5sum";s:32:"ae8fd7e7957f71843eb72b0dfea84386";s:4:"name";s:53:"Symfony/Bridge/Twig/Extension/HttpKernelExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Extension/HttpKernelExtension.php";}s:50:"Symfony/Bridge/Twig/Extension/RoutingExtension.php";a:4:{s:6:"md5sum";s:32:"b1e34bbc300fb73296ed795e3cf200b5";s:4:"name";s:50:"Symfony/Bridge/Twig/Extension/RoutingExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Extension/RoutingExtension.php";}s:51:"Symfony/Bridge/Twig/Extension/SecurityExtension.php";a:4:{s:6:"md5sum";s:32:"406e316d507396925ce36c5039bf0c6b";s:4:"name";s:51:"Symfony/Bridge/Twig/Extension/SecurityExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Extension/SecurityExtension.php";}s:52:"Symfony/Bridge/Twig/Extension/StopwatchExtension.php";a:4:{s:6:"md5sum";s:32:"bcbf90a6081eb164ebf8aa26424034cf";s:4:"name";s:52:"Symfony/Bridge/Twig/Extension/StopwatchExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Extension/StopwatchExtension.php";}s:54:"Symfony/Bridge/Twig/Extension/TranslationExtension.php";a:4:{s:6:"md5sum";s:32:"cee4a3d32bbd87757b2c6cd4de05e209";s:4:"name";s:54:"Symfony/Bridge/Twig/Extension/TranslationExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Extension/TranslationExtension.php";}s:47:"Symfony/Bridge/Twig/Extension/YamlExtension.php";a:4:{s:6:"md5sum";s:32:"ae5855df258047211247fdfb8cb9cb9c";s:4:"name";s:47:"Symfony/Bridge/Twig/Extension/YamlExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Extension/YamlExtension.php";}s:41:"Symfony/Bridge/Twig/Form/TwigRenderer.php";a:4:{s:6:"md5sum";s:32:"96815060d6bee8fbcfecd4f0ca94cc7c";s:4:"name";s:41:"Symfony/Bridge/Twig/Form/TwigRenderer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Form/TwigRenderer.php";}s:47:"Symfony/Bridge/Twig/Form/TwigRendererEngine.php";a:4:{s:6:"md5sum";s:32:"edf3b98358b100da17afa76a9acacdd5";s:4:"name";s:47:"Symfony/Bridge/Twig/Form/TwigRendererEngine.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Form/TwigRendererEngine.php";}s:56:"Symfony/Bridge/Twig/Form/TwigRendererEngineInterface.php";a:4:{s:6:"md5sum";s:32:"02bc975c2fcb576a69c8e5ffa2e14ce5";s:4:"name";s:56:"Symfony/Bridge/Twig/Form/TwigRendererEngineInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Form/TwigRendererEngineInterface.php";}s:50:"Symfony/Bridge/Twig/Form/TwigRendererInterface.php";a:4:{s:6:"md5sum";s:32:"96103a4ce079ad131d65578737a381c6";s:4:"name";s:50:"Symfony/Bridge/Twig/Form/TwigRendererInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Form/TwigRendererInterface.php";}s:27:"Symfony/Bridge/Twig/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:27:"Symfony/Bridge/Twig/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/doc/pear/TwigBridge/Symfony/Bridge/Twig/LICENSE";}s:44:"Symfony/Bridge/Twig/Node/FormEnctypeNode.php";a:4:{s:6:"md5sum";s:32:"eeaac65947d7a23199b9ab2b3421295f";s:4:"name";s:44:"Symfony/Bridge/Twig/Node/FormEnctypeNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Node/FormEnctypeNode.php";}s:42:"Symfony/Bridge/Twig/Node/FormThemeNode.php";a:4:{s:6:"md5sum";s:32:"a7532f88e5dbae6209363fc2d5fdc358";s:4:"name";s:42:"Symfony/Bridge/Twig/Node/FormThemeNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Node/FormThemeNode.php";}s:44:"Symfony/Bridge/Twig/Node/RenderBlockNode.php";a:4:{s:6:"md5sum";s:32:"9a15391aa07a352fae06f7ed12a9fd60";s:4:"name";s:44:"Symfony/Bridge/Twig/Node/RenderBlockNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Node/RenderBlockNode.php";}s:53:"Symfony/Bridge/Twig/Node/SearchAndRenderBlockNode.php";a:4:{s:6:"md5sum";s:32:"2e379adad86d64a326c899290ede04ad";s:4:"name";s:53:"Symfony/Bridge/Twig/Node/SearchAndRenderBlockNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Node/SearchAndRenderBlockNode.php";}s:42:"Symfony/Bridge/Twig/Node/StopwatchNode.php";a:4:{s:6:"md5sum";s:32:"23ed426e4e8ecbb7694e7ea41b9b0890";s:4:"name";s:42:"Symfony/Bridge/Twig/Node/StopwatchNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Node/StopwatchNode.php";}s:51:"Symfony/Bridge/Twig/Node/TransDefaultDomainNode.php";a:4:{s:6:"md5sum";s:32:"0526f6b70eaba23a52160d231433f9a2";s:4:"name";s:51:"Symfony/Bridge/Twig/Node/TransDefaultDomainNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Node/TransDefaultDomainNode.php";}s:38:"Symfony/Bridge/Twig/Node/TransNode.php";a:4:{s:6:"md5sum";s:32:"e1d88cb3d69813c50c1d7f847a3998fb";s:4:"name";s:38:"Symfony/Bridge/Twig/Node/TransNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Node/TransNode.php";}s:41:"Symfony/Bridge/Twig/NodeVisitor/Scope.php";a:4:{s:6:"md5sum";s:32:"748686792da8fc6ece450126fadad7c8";s:4:"name";s:41:"Symfony/Bridge/Twig/NodeVisitor/Scope.php";s:4:"role";s:3:"php";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/NodeVisitor/Scope.php";}s:71:"Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php";a:4:{s:6:"md5sum";s:32:"519ceb71a1f48a857850fefc9f899e65";s:4:"name";s:71:"Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php";}s:58:"Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php";a:4:{s:6:"md5sum";s:32:"20a1ae206f399b7a45474eed11242532";s:4:"name";s:58:"Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php";}s:36:"Symfony/Bridge/Twig/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"b2790b452896e6c319fef59e08204ca3";s:4:"name";s:36:"Symfony/Bridge/Twig/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/phpunit.xml.dist";}s:29:"Symfony/Bridge/Twig/README.md";a:4:{s:6:"md5sum";s:32:"09c10943b1bd396bdd40244b6f1670de";s:4:"name";s:29:"Symfony/Bridge/Twig/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/doc/pear/TwigBridge/Symfony/Bridge/Twig/README.md";}s:66:"Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig";a:4:{s:6:"md5sum";s:32:"7db396d0e3531236572ab842e1d785f3";s:4:"name";s:66:"Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig";}s:68:"Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig";a:4:{s:6:"md5sum";s:32:"bf705e344ab695195d83108c5a744291";s:4:"name";s:68:"Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig";}s:57:"Symfony/Bridge/Twig/Tests/Extension/child_label.html.twig";a:4:{s:6:"md5sum";s:32:"62b01d26c529435b127df0b68da87a8e";s:4:"name";s:57:"Symfony/Bridge/Twig/Tests/Extension/child_label.html.twig";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/child_label.html.twig";}s:57:"Symfony/Bridge/Twig/Tests/Extension/CodeExtensionTest.php";a:4:{s:6:"md5sum";s:32:"de9fa5a69d9ffeaace77f48c8c970a16";s:4:"name";s:57:"Symfony/Bridge/Twig/Tests/Extension/CodeExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/CodeExtensionTest.php";}s:60:"Symfony/Bridge/Twig/Tests/Extension/custom_widgets.html.twig";a:4:{s:6:"md5sum";s:32:"341920fd913325029b8875d19416f539";s:4:"name";s:60:"Symfony/Bridge/Twig/Tests/Extension/custom_widgets.html.twig";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/custom_widgets.html.twig";}s:63:"Symfony/Bridge/Twig/Tests/Extension/ExpressionExtensionTest.php";a:4:{s:6:"md5sum";s:32:"59f22743c289e6a916c20f335245b023";s:4:"name";s:63:"Symfony/Bridge/Twig/Tests/Extension/ExpressionExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/ExpressionExtensionTest.php";}s:69:"Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubFilesystemLoader.php";a:4:{s:6:"md5sum";s:32:"d721545275f06c65c48b93fff1d63008";s:4:"name";s:69:"Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubFilesystemLoader.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubFilesystemLoader.php";}s:63:"Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubTranslator.php";a:4:{s:6:"md5sum";s:32:"2e4ed81306cf97510d18da3f33289fd7";s:4:"name";s:63:"Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubTranslator.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubTranslator.php";}s:66:"Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php";a:4:{s:6:"md5sum";s:32:"54d08b06b4f1626df69403bfba38218f";s:4:"name";s:66:"Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php";}s:68:"Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php";a:4:{s:6:"md5sum";s:32:"ce9150c7e8fabcbe1539051f087a5c7b";s:4:"name";s:68:"Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php";}s:63:"Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php";a:4:{s:6:"md5sum";s:32:"b54b450a89e781ad60a2807fb2678eeb";s:4:"name";s:63:"Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php";}s:66:"Symfony/Bridge/Twig/Tests/Extension/page_dynamic_extends.html.twig";a:4:{s:6:"md5sum";s:32:"6753e22fa543cb3368c9e0000e2f270c";s:4:"name";s:66:"Symfony/Bridge/Twig/Tests/Extension/page_dynamic_extends.html.twig";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/page_dynamic_extends.html.twig";}s:58:"Symfony/Bridge/Twig/Tests/Extension/parent_label.html.twig";a:4:{s:6:"md5sum";s:32:"6861f5bb94faf3b42691192cf3017750";s:4:"name";s:58:"Symfony/Bridge/Twig/Tests/Extension/parent_label.html.twig";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/parent_label.html.twig";}s:60:"Symfony/Bridge/Twig/Tests/Extension/RoutingExtensionTest.php";a:4:{s:6:"md5sum";s:32:"7897b6f0d377c1dcbc7b1a9d34450b40";s:4:"name";s:60:"Symfony/Bridge/Twig/Tests/Extension/RoutingExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/RoutingExtensionTest.php";}s:62:"Symfony/Bridge/Twig/Tests/Extension/StopwatchExtensionTest.php";a:4:{s:6:"md5sum";s:32:"40377cd7f95bb691e04c883df5a09db5";s:4:"name";s:62:"Symfony/Bridge/Twig/Tests/Extension/StopwatchExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/StopwatchExtensionTest.php";}s:51:"Symfony/Bridge/Twig/Tests/Extension/theme.html.twig";a:4:{s:6:"md5sum";s:32:"d43686f93a9702b4cfd91df3053b602b";s:4:"name";s:51:"Symfony/Bridge/Twig/Tests/Extension/theme.html.twig";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/theme.html.twig";}s:59:"Symfony/Bridge/Twig/Tests/Extension/theme_extends.html.twig";a:4:{s:6:"md5sum";s:32:"d172147242bd0b80e328e6e9e88dd5e7";s:4:"name";s:59:"Symfony/Bridge/Twig/Tests/Extension/theme_extends.html.twig";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/theme_extends.html.twig";}s:55:"Symfony/Bridge/Twig/Tests/Extension/theme_use.html.twig";a:4:{s:6:"md5sum";s:32:"e4a1661a04d5bafdd840b035f0c9511e";s:4:"name";s:55:"Symfony/Bridge/Twig/Tests/Extension/theme_use.html.twig";s:4:"role";s:4:"test";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/theme_use.html.twig";}s:64:"Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php";a:4:{s:6:"md5sum";s:32:"eb868a90365c1c3b2f7573551a8a45a3";s:4:"name";s:64:"Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php";}s:48:"Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php";a:4:{s:6:"md5sum";s:32:"0af17ef668b1281a4e89bf51028ec695";s:4:"name";s:48:"Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php";}s:63:"Symfony/Bridge/Twig/Tests/Node/SearchAndRenderBlockNodeTest.php";a:4:{s:6:"md5sum";s:32:"7b8b963bd2b033ae246edd3ba7d6f97e";s:4:"name";s:63:"Symfony/Bridge/Twig/Tests/Node/SearchAndRenderBlockNodeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Node/SearchAndRenderBlockNodeTest.php";}s:51:"Symfony/Bridge/Twig/Tests/NodeVisitor/ScopeTest.php";a:4:{s:6:"md5sum";s:32:"7fd3f6760029514c0a55503418d8b0b4";s:4:"name";s:51:"Symfony/Bridge/Twig/Tests/NodeVisitor/ScopeTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/NodeVisitor/ScopeTest.php";}s:81:"Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php";a:4:{s:6:"md5sum";s:32:"c8f71ffe1e4fcb0bb4a69120feb30bd0";s:4:"name";s:81:"Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php";}s:68:"Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationNodeVisitorTest.php";a:4:{s:6:"md5sum";s:32:"ec0588a5b4d7dd36d668a39a8849dd72";s:4:"name";s:68:"Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationNodeVisitorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationNodeVisitorTest.php";}s:58:"Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php";a:4:{s:6:"md5sum";s:32:"d8c329c5c7afb266a65967762f0684f2";s:4:"name";s:58:"Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php";}s:66:"Symfony/Bridge/Twig/Tests/TokenParser/FormThemeTokenParserTest.php";a:4:{s:6:"md5sum";s:32:"95b22c803b2c8065500328508c60ed02";s:4:"name";s:66:"Symfony/Bridge/Twig/Tests/TokenParser/FormThemeTokenParserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/TokenParser/FormThemeTokenParserTest.php";}s:59:"Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php";a:4:{s:6:"md5sum";s:32:"9cd79976725b5279223a0e16a318f292";s:4:"name";s:59:"Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php";}s:44:"Symfony/Bridge/Twig/Tests/TwigEngineTest.php";a:4:{s:6:"md5sum";s:32:"f73d33e407b60220f8c6af100a4d0358";s:4:"name";s:44:"Symfony/Bridge/Twig/Tests/TwigEngineTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/TwigEngineTest.php";}s:56:"Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php";a:4:{s:6:"md5sum";s:32:"b4e9ee4d27632d7c1f1de3795480df67";s:4:"name";s:56:"Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php";}s:56:"Symfony/Bridge/Twig/TokenParser/StopwatchTokenParser.php";a:4:{s:6:"md5sum";s:32:"748c45d30621f1f2d245102924f7fdff";s:4:"name";s:56:"Symfony/Bridge/Twig/TokenParser/StopwatchTokenParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/TokenParser/StopwatchTokenParser.php";}s:58:"Symfony/Bridge/Twig/TokenParser/TransChoiceTokenParser.php";a:4:{s:6:"md5sum";s:32:"0354e3a6d83924f2da374f158de149ba";s:4:"name";s:58:"Symfony/Bridge/Twig/TokenParser/TransChoiceTokenParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/TokenParser/TransChoiceTokenParser.php";}s:65:"Symfony/Bridge/Twig/TokenParser/TransDefaultDomainTokenParser.php";a:4:{s:6:"md5sum";s:32:"58650d506d0035b1622780ababcfca5a";s:4:"name";s:65:"Symfony/Bridge/Twig/TokenParser/TransDefaultDomainTokenParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/TokenParser/TransDefaultDomainTokenParser.php";}s:52:"Symfony/Bridge/Twig/TokenParser/TransTokenParser.php";a:4:{s:6:"md5sum";s:32:"27e4d98f60a06de551c32d2e852c7139";s:4:"name";s:52:"Symfony/Bridge/Twig/TokenParser/TransTokenParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/TokenParser/TransTokenParser.php";}s:49:"Symfony/Bridge/Twig/Translation/TwigExtractor.php";a:4:{s:6:"md5sum";s:32:"b914862fe8b32c41e260ea530bd430f1";s:4:"name";s:49:"Symfony/Bridge/Twig/Translation/TwigExtractor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Translation/TwigExtractor.php";}s:34:"Symfony/Bridge/Twig/TwigEngine.php";a:4:{s:6:"md5sum";s:32:"e11b1b874251de2867b3673a674ff71d";s:4:"name";s:34:"Symfony/Bridge/Twig/TwigEngine.php";s:4:"role";s:3:"php";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/TwigEngine.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:27:{s:49:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig";b:1;s:44:"/opt/alt/php54/usr/share/pear/Symfony/Bridge";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:64:"/opt/alt/php54/usr/share/doc/pear/TwigBridge/Symfony/Bridge/Twig";b:1;s:59:"/opt/alt/php54/usr/share/doc/pear/TwigBridge/Symfony/Bridge";b:1;s:52:"/opt/alt/php54/usr/share/doc/pear/TwigBridge/Symfony";b:1;s:44:"/opt/alt/php54/usr/share/doc/pear/TwigBridge";b:1;s:59:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Extension";b:1;s:54:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Form";b:1;s:54:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Node";b:1;s:61:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/NodeVisitor";b:1;s:65:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig";b:1;s:60:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge";b:1;s:53:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony";b:1;s:45:"/opt/alt/php54/usr/share/pear/test/TwigBridge";b:1;s:70:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Resources/views/Form";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Resources/views";b:1;s:59:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Resources";b:1;s:81:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension";b:1;s:71:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests";b:1;s:90:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Extension/Fixtures";b:1;s:76:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Node";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/NodeVisitor";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/TokenParser";b:1;s:83:"/opt/alt/php54/usr/share/pear/test/TwigBridge/Symfony/Bridge/Twig/Tests/Translation";b:1;s:61:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/TokenParser";b:1;s:61:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Twig/Translation";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:6:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:4:"Form";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:3;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:7:"Routing";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:4;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:11:"Translation";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:5;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:4:"Yaml";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506495;}PK�^�\�eBEg�g�@pear/.registry/.channel.pear.symfony.com/dependencyinjection.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:19:"DependencyInjection";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:38:"Symfony2 DependencyInjection Component";s:11:"description";s:38:"Symfony2 DependencyInjection Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:43";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:192:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8083d8117acb0fe0ea5dcd87cf7ffef7";s:4:"name";s:47:"Symfony/Component/DependencyInjection/Alias.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7879012b46b3b27b8d8414b844ca3537";s:4:"name";s:52:"Symfony/Component/DependencyInjection/autoloader.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"514e07efd3462ee25be372a3d60bbd80";s:4:"name";s:50:"Symfony/Component/DependencyInjection/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"675a6bc1d3c3f3b2783f885f0521178b";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6091faa40727a56f10ba2146abf615e1";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2b373903ccf9d566a6927aed6c3c6650";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"69b6713e0ee778e9b2cad497a9082151";s:4:"name";s:95:"Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7b1410dc03224741083a4d762836a91b";s:4:"name";s:77:"Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"14bcd46172f5ac3e022e1d8f4fe1b08c";s:4:"name";s:59:"Symfony/Component/DependencyInjection/Compiler/Compiler.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1292a88c9fadf67d117a659fb0bfd499";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ec4dc3e58fc8046e43c0874a99ea29e6";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d18aa0d044d4725eaacd006c55b8e366";s:4:"name";s:67:"Symfony/Component/DependencyInjection/Compiler/LoggingFormatter.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5015cca96bf517b4780e5acfbcce2142";s:4:"name";s:82:"Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8517ede71e527623a58dc3bca253c687";s:4:"name";s:61:"Symfony/Component/DependencyInjection/Compiler/PassConfig.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"270937e454d381dae233d817e52069ec";s:4:"name";s:80:"Symfony/Component/DependencyInjection/Compiler/RemoveAbstractDefinitionsPass.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"77d93353f41f2505251e003a33993f31";s:4:"name";s:75:"Symfony/Component/DependencyInjection/Compiler/RemovePrivateAliasesPass.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"82421fc37d82eeb210772fc9b5cc407d";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bee7b2336c610435c89fdc854101b604";s:4:"name";s:74:"Symfony/Component/DependencyInjection/Compiler/RepeatablePassInterface.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f9167d35e36bf31d5aac396564f27bbb";s:4:"name";s:63:"Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0ece3d877daaabc8be38509d97752e2c";s:4:"name";s:85:"Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5e11621457d51880c84844518e300306";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"15580e12e088ce2dc2fc89936e27bdc0";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f33dfb27625ccb59d575de3fd0e3862f";s:4:"name";s:83:"Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"69e660af3582cdacbfa328e0280a5740";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"965e8e3c37eea82b6eb961df50d9014d";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0e3f4ba1f08962ec73803a78f7a8c3f2";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphEdge.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ce32fc9229295bec473e33ce95cfe4d";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5ed58de81d8eb7d0d3d316ee27368e11";s:4:"name";s:51:"Symfony/Component/DependencyInjection/composer.json";s:4:"role";s:3:"doc";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d87452c514f1fd3daa1d76050329e0cc";s:4:"name";s:51:"Symfony/Component/DependencyInjection/Container.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4318c2ce4d160e6d183edce4928db696";s:4:"name";s:56:"Symfony/Component/DependencyInjection/ContainerAware.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b4bbd2a21e9afe2cd25d26c37c54bfa9";s:4:"name";s:65:"Symfony/Component/DependencyInjection/ContainerAwareInterface.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"304f3c4322c235b332992d829d68e50b";s:4:"name";s:61:"Symfony/Component/DependencyInjection/ContainerAwareTrait.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6599366a3251af3d99243b49316fb9fe";s:4:"name";s:58:"Symfony/Component/DependencyInjection/ContainerBuilder.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2531b72281ed8336ff1afbb7ada89bb8";s:4:"name";s:60:"Symfony/Component/DependencyInjection/ContainerInterface.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"047285baeb298041af1ae447da6e55b3";s:4:"name";s:52:"Symfony/Component/DependencyInjection/Definition.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cf838655798392939269b928daeb17f3";s:4:"name";s:61:"Symfony/Component/DependencyInjection/DefinitionDecorator.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3b295c276bb774433a45f1ee0339a299";s:4:"name";s:55:"Symfony/Component/DependencyInjection/Dumper/Dumper.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b9dd1589f9ffac4366fd4148d9e78ade";s:4:"name";s:64:"Symfony/Component/DependencyInjection/Dumper/DumperInterface.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"688f77795fc125e75645706bf19ec8cf";s:4:"name";s:63:"Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bd310f7ab99d2c941dff3b3b402a1fd7";s:4:"name";s:58:"Symfony/Component/DependencyInjection/Dumper/PhpDumper.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"abe8dcd883cb0c698d7e91f2c600f45c";s:4:"name";s:58:"Symfony/Component/DependencyInjection/Dumper/XmlDumper.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"409f8a23d69eaa1272fd7cbb75d23026";s:4:"name";s:59:"Symfony/Component/DependencyInjection/Dumper/YamlDumper.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7881aa76d06f7b9e4bd45dc85ae0d52e";s:4:"name";s:74:"Symfony/Component/DependencyInjection/Exception/BadMethodCallException.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d79633abb224cffc0597be170aca74ea";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9022cb0f19ecaf1198318f0c178c5264";s:4:"name";s:74:"Symfony/Component/DependencyInjection/Exception/InactiveScopeException.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f1b09121e6850f5271d8bd3a6837efd3";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b78b4f59982df23deaf0242aec3d4a9";s:4:"name";s:66:"Symfony/Component/DependencyInjection/Exception/LogicException.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"792b235a45e9f4c0c7a7280580b1a2a3";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Exception/OutOfBoundsException.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7b059f59730003361cceadd8965ad7c5";s:4:"name";s:87:"Symfony/Component/DependencyInjection/Exception/ParameterCircularReferenceException.php";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6d83c2934f82a5ef7992b7081eaeffd7";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Exception/ParameterNotFoundException.php";s:4:"role";s:3:"php";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4e4d9c135fec917ae3fa78f25fbd7f85";s:4:"name";s:68:"Symfony/Component/DependencyInjection/Exception/RuntimeException.php";s:4:"role";s:3:"php";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0d73336fcf6534c59887f8b5687d1bd6";s:4:"name";s:83:"Symfony/Component/DependencyInjection/Exception/ScopeCrossingInjectionException.php";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"719ca3a89890fcb941cca1b16a0fafef";s:4:"name";s:83:"Symfony/Component/DependencyInjection/Exception/ScopeWideningInjectionException.php";s:4:"role";s:3:"php";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8ac40af4863b3c6cd9311cc1a29cf802";s:4:"name";s:85:"Symfony/Component/DependencyInjection/Exception/ServiceCircularReferenceException.php";s:4:"role";s:3:"php";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9785d054cb75a079dcecc97fc77a8ebb";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Exception/ServiceNotFoundException.php";s:4:"role";s:3:"php";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3eebc81d79682bdbfe5ce43980d2ab92";s:4:"name";s:60:"Symfony/Component/DependencyInjection/ExpressionLanguage.php";s:4:"role";s:3:"php";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"819fae3f0bfd1d3ba7dd2a4fc29f89e8";s:4:"name";s:83:"Symfony/Component/DependencyInjection/Extension/ConfigurationExtensionInterface.php";s:4:"role";s:3:"php";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"80cf4c6b7246bd342cf87699c23d0114";s:4:"name";s:61:"Symfony/Component/DependencyInjection/Extension/Extension.php";s:4:"role";s:3:"php";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d9f5df364b37addf087305ce17842de9";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php";s:4:"role";s:3:"php";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0eea6361b5960d4ff58646b75864898f";s:4:"name";s:77:"Symfony/Component/DependencyInjection/Extension/PrependExtensionInterface.php";s:4:"role";s:3:"php";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"78118376c3e263f9eb58313ee1bb6f5a";s:4:"name";s:74:"Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php";s:4:"role";s:3:"php";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2195bb770e5851fa1ebd680906ae112b";s:4:"name";s:86:"Symfony/Component/DependencyInjection/LazyProxy/Instantiator/InstantiatorInterface.php";s:4:"role";s:3:"php";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bf8b05c0ab1b67dda36944d6a5d0d653";s:4:"name";s:88:"Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.php";s:4:"role";s:3:"php";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0ff96280df12f153aee121649615763f";s:4:"name";s:77:"Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/DumperInterface.php";s:4:"role";s:3:"php";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8857647188554714f60a97a1a5f54fa0";s:4:"name";s:72:"Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.php";s:4:"role";s:3:"php";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:45:"Symfony/Component/DependencyInjection/LICENSE";s:4:"role";s:3:"doc";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"262400ebaa94fc67c3cf2c89015cc395";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Loader/ClosureLoader.php";s:4:"role";s:3:"php";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"378be59c411306f23d8adb22fcaedad6";s:4:"name";s:59:"Symfony/Component/DependencyInjection/Loader/FileLoader.php";s:4:"role";s:3:"php";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"682de96cf34a4ac9f93d1e5c9d2cb153";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Loader/IniFileLoader.php";s:4:"role";s:3:"php";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ce3bf3b148cb1be2d7e30a5c589f9af9";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php";s:4:"role";s:3:"php";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"32beacc60968ee62e94f66672e3a7ec2";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd";s:4:"role";s:3:"php";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ed4c6f9c796d3986362a7a67dac9bc47";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php";s:4:"role";s:3:"php";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5df455b7334b17e89c9e094cf5978291";s:4:"name";s:63:"Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php";s:4:"role";s:3:"php";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7b2faf5e73ce778720b67e94cf6d2bba";s:4:"name";s:51:"Symfony/Component/DependencyInjection/Parameter.php";s:4:"role";s:3:"php";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c975b424d378e0060f13f23f218768d5";s:4:"name";s:73:"Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php";s:4:"role";s:3:"php";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ce95aa07d7fe9d8e35dd1cf0af3b508e";s:4:"name";s:67:"Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php";s:4:"role";s:3:"php";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a1d6864e44ce2807160e6ccbd8e2d730";s:4:"name";s:76:"Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php";s:4:"role";s:3:"php";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e9b92b932a912fe805d01f4fa1d196d7";s:4:"name";s:54:"Symfony/Component/DependencyInjection/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1b27a3a51d5eeea9a6ee9fb5aed79c1f";s:4:"name";s:47:"Symfony/Component/DependencyInjection/README.md";s:4:"role";s:3:"doc";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a472c7a6d20af6710b87a299b9fdb855";s:4:"name";s:51:"Symfony/Component/DependencyInjection/Reference.php";s:4:"role";s:3:"php";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d464293058a891542cef77f9e14e18b4";s:4:"name";s:47:"Symfony/Component/DependencyInjection/Scope.php";s:4:"role";s:3:"php";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b990c20640f9a64135bcf0369f4e22a6";s:4:"name";s:56:"Symfony/Component/DependencyInjection/ScopeInterface.php";s:4:"role";s:3:"php";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"66c75a60290a0461dc4e28feed7952dc";s:4:"name";s:58:"Symfony/Component/DependencyInjection/SimpleXMLElement.php";s:4:"role";s:3:"php";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3c47bde46b89617dcd69f4ebf5056865";s:4:"name";s:66:"Symfony/Component/DependencyInjection/TaggedContainerInterface.php";s:4:"role";s:3:"php";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d54cef7b3cb33ee1e7042d26c584f7fe";s:4:"name";s:89:"Symfony/Component/DependencyInjection/Tests/Compiler/AnalyzeServiceReferencesPassTest.php";s:4:"role";s:4:"test";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1a6f4aa36bb6dca84bcec6c5b3a4aa1f";s:4:"name";s:88:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php";s:4:"role";s:4:"test";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"637d842f3a08a0f1bce0921ba641c049";s:4:"name";s:88:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php";s:4:"role";s:4:"test";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8cecafcb0696950082f24bdc0ed79beb";s:4:"name";s:105:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php";s:4:"role";s:4:"test";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"150d6c72e7fa4958c3750097d6985874";s:4:"name";s:87:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckReferenceValidityPassTest.php";s:4:"role";s:4:"test";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d38af5ce9bbb76b8b8e8ff4881347669";s:4:"name";s:89:"Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php";s:4:"role";s:4:"test";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6495d73686ede93887cf537f6e9ec0e9";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php";s:4:"role";s:4:"test";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"69e56c8a628567929f063b36ab9a2e84";s:4:"name";s:88:"Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php";s:4:"role";s:4:"test";}}i:92;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d8a0328438ce5162a8b8585be178673d";s:4:"name";s:95:"Symfony/Component/DependencyInjection/Tests/Compiler/ReplaceAliasByActualDefinitionPassTest.php";s:4:"role";s:4:"test";}}i:93;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7547b1b316c37533be6820e12815f3cf";s:4:"name";s:91:"Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php";s:4:"role";s:4:"test";}}i:94;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2c41afba4dc70fc0f903ebe52befd642";s:4:"name";s:89:"Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.php";s:4:"role";s:4:"test";}}i:95;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"13b4ec5501d3cba658a6973dcffa9799";s:4:"name";s:91:"Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.php";s:4:"role";s:4:"test";}}i:96;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aa9b5e5dc4e83673b333455f0d863130";s:4:"name";s:68:"Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php";s:4:"role";s:4:"test";}}i:97;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e2ff857908d1e4161ea4c3dd8993c9a2";s:4:"name";s:61:"Symfony/Component/DependencyInjection/Tests/ContainerTest.php";s:4:"role";s:4:"test";}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea1ce9dbce7920ea2631ffbfbead7658";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Tests/CrossCheckTest.php";s:4:"role";s:4:"test";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e5b34b5cef82e20befe6943b167b3dce";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/DefinitionDecoratorTest.php";s:4:"role";s:4:"test";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dbee36c02395ef4885ca72420bf98503";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Tests/DefinitionTest.php";s:4:"role";s:4:"test";}}i:101;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5518fa88c922a8c873133651e233386b";s:4:"name";s:73:"Symfony/Component/DependencyInjection/Tests/Dumper/GraphvizDumperTest.php";s:4:"role";s:4:"test";}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"03e6215b1c0abc0fa0a11642e4786649";s:4:"name";s:68:"Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php";s:4:"role";s:4:"test";}}i:103;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"af6f3ad2f9b929dcbac53b8a48f122f3";s:4:"name";s:68:"Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php";s:4:"role";s:4:"test";}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d6ae9074c31ddfb3794ff731d60b20bb";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php";s:4:"role";s:4:"test";}}i:105;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"939faedda209b4d87552d4fe7cd7ca24";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Extension/ExtensionTest.php";s:4:"role";s:4:"test";}}i:106;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6422feace05a5ed96c42ed848d10006c";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container10.php";s:4:"role";s:4:"test";}}i:107;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1ff966b209cd577bd0d6bb36d7e649e4";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container11.php";s:4:"role";s:4:"test";}}i:108;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1acdceda33fce9015eff3bf7d156135b";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container12.php";s:4:"role";s:4:"test";}}i:109;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"00b3703e57b5c9586ec0e398ea7a20b2";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container13.php";s:4:"role";s:4:"test";}}i:110;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b21b1c14c129dd16d9414a26aa263c45";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container14.php";s:4:"role";s:4:"test";}}i:111;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4bf1be8db545cde3ba7d0e6f6297308d";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php";s:4:"role";s:4:"test";}}i:112;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"098b361885203b2d00989fce70938512";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.php";s:4:"role";s:4:"test";}}i:113;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f06eb418f0f04a719312f0e4ca232e9d";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces1.php";s:4:"role";s:4:"test";}}i:114;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a0ccfd20143be600667c0e98fb665071";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces2.php";s:4:"role";s:4:"test";}}i:115;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"02cffa6095e3a31d691a5bdcdbe7c227";s:4:"name";s:75:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services1.dot";s:4:"role";s:4:"test";}}i:116;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5bf12610e2c2a95c5506a1b92ee929f6";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10-1.dot";s:4:"role";s:4:"test";}}i:117;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5eda7f5d745f7686812c80927819c499";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10.dot";s:4:"role";s:4:"test";}}i:118;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8f1d93f127c665d4f17b81c9cadc1e90";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dot";s:4:"role";s:4:"test";}}i:119;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a7b7d8d68fc8e2f58dfd94d5de28604c";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services14.dot";s:4:"role";s:4:"test";}}i:120;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"17882b73c2f05f5bed8a8761f693ee75";s:4:"name";s:75:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dot";s:4:"role";s:4:"test";}}i:121;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6c18955e7fff0a445ccd323169edfa39";s:4:"name";s:73:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/classes.php";s:4:"role";s:4:"test";}}i:122;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"658357428dc406d5f951a31a951a468b";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/createphar.php";s:4:"role";s:4:"test";}}i:123;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f38316643924184c25c2d323eb2115c8";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/foo.php";s:4:"role";s:4:"test";}}i:124;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d378aa4475659bdd4d5d1d1a7898a5d8";s:4:"name";s:82:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.php";s:4:"role";s:4:"test";}}i:125;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2533e30245d301e424eb76b539244446";s:4:"name";s:89:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtension.php";s:4:"role";s:4:"test";}}i:126;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b4a17c6724b7c820a73579d094cdd932";s:4:"name";s:96:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtensionInPhar.phar";s:4:"role";s:4:"test";}}i:127;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cd16e7c41fc369846a5eb4a42d1e5b93";s:4:"name";s:84:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/schema/project-1.0.xsd";s:4:"role";s:4:"test";}}i:128;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"547a11b176c7c7905611acd1582252d6";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/nonvalid.ini";s:4:"role";s:4:"test";}}i:129;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4a8f0aad32fe89d804cb85703f0e2965";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters.ini";s:4:"role";s:4:"test";}}i:130;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cc1e7671d8c8e219998593b0069ac474";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters1.ini";s:4:"role";s:4:"test";}}i:131;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e2432dcd44bad3082cff4aabce9d2f33";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters2.ini";s:4:"role";s:4:"test";}}i:132;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"efe219ab816512283367c226a1656ee4";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php";s:4:"role";s:4:"test";}}i:133;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"99506344d5fcc588c963e91e473a06d1";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1.php";s:4:"role";s:4:"test";}}i:134;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9b7bf72ef23353c753f51bf557706ef4";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php";s:4:"role";s:4:"test";}}i:135;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"11e72fc308dfdadaedc9544c8756769b";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services11.php";s:4:"role";s:4:"test";}}i:136;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"44b0afab75892ad4556743db23d1e629";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php";s:4:"role";s:4:"test";}}i:137;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"80b20e5ead9c8ff04678100303294161";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php";s:4:"role";s:4:"test";}}i:138;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8e9a27269a37e19f37566f39801b484";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php";s:4:"role";s:4:"test";}}i:139;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0a223fc28b123a00eeae0ce7825953eb";s:4:"name";s:67:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/simple.php";s:4:"role";s:4:"test";}}i:140;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d741c7a31311ead4df2057e523afeba3";s:4:"name";s:80:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension1/services.xml";s:4:"role";s:4:"test";}}i:141;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f932ffc98518b016fc6383139b711c96";s:4:"name";s:80:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension2/services.xml";s:4:"role";s:4:"test";}}i:142;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d144314f085c31ccb0a41f802f306649";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services1.xml";s:4:"role";s:4:"test";}}i:143;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8a597cf4214e62043465a1d135cbf428";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services2.xml";s:4:"role";s:4:"test";}}i:144;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2a00696fd70991a11a2aa0e1e5d61e75";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services3.xml";s:4:"role";s:4:"test";}}i:145;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"340f21074d0ff685079b5fc0b80dacdf";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services4.xml";s:4:"role";s:4:"test";}}i:146;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7dade70bc8de90a4c116d01df8744179";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services5.xml";s:4:"role";s:4:"test";}}i:147;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"873eec7bf6988585b8be9ed78d32d4f0";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services6.xml";s:4:"role";s:4:"test";}}i:148;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"834d96fb17d411d3c25df34a8e12339c";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services7.xml";s:4:"role";s:4:"test";}}i:149;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e1fb95406c0ff63742800fdc95eb99f6";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/nonvalid.xml";s:4:"role";s:4:"test";}}i:150;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d7c935e1400a979267225dfbe9519a9e";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services1.xml";s:4:"role";s:4:"test";}}i:151;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"525da15fe7d63e3e0f8ae78a96929107";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services10.xml";s:4:"role";s:4:"test";}}i:152;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0bed9c78fc2a7b638d81d6e948474ed9";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services13.xml";s:4:"role";s:4:"test";}}i:153;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"af73c797e9dabde154c0460a294ab77d";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services2.xml";s:4:"role";s:4:"test";}}i:154;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b8fbad821d7f9b92a37c6ec30fbb8a9";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services3.xml";s:4:"role";s:4:"test";}}i:155;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b6edb71e890234adad9ebb17e88fb6f";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4.xml";s:4:"role";s:4:"test";}}i:156;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"53040074af5e742e3e7bc6a820f0b17d";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4_bad_import.xml";s:4:"role";s:4:"test";}}i:157;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6f50270290cb9bafc719886743286773";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services5.xml";s:4:"role";s:4:"test";}}i:158;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"15f37e20652d85a361cccc6a6f9322ac";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services6.xml";s:4:"role";s:4:"test";}}i:159;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3f0cd2a9228c7f1479f535b48beb3f21";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services7.xml";s:4:"role";s:4:"test";}}i:160;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"71f5c7df64436e6adf6fb4457d7b5075";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml";s:4:"role";s:4:"test";}}i:161;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ca60e6bf5f65fff971f8d13a644a9acb";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml";s:4:"role";s:4:"test";}}i:162;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"561c119c08673fd8436e11424a20d808";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/withdoctype.xml";s:4:"role";s:4:"test";}}i:163;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2b4b910651d1e7de3a74cc6872184be8";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag1.yml";s:4:"role";s:4:"test";}}i:164;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2651cca5fcafb2d3328d2d18cc825f2f";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag2.yml";s:4:"role";s:4:"test";}}i:165;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8b67ba68bb2c5551ac4bc3f7a865839d";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag3.yml";s:4:"role";s:4:"test";}}i:166;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"037bf52fe0bfa7b643b837d08dfdf92d";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid1.yml";s:4:"role";s:4:"test";}}i:167;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d42f2da1df5ecdf29be4ac27edda0c12";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid2.yml";s:4:"role";s:4:"test";}}i:168;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"68b329da9893e34099c7d8ad5cb9c940";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services1.yml";s:4:"role";s:4:"test";}}i:169;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"98428e36b00061da1b64b1e64781e4d0";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services10.yml";s:4:"role";s:4:"test";}}i:170;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8fc6f5242a9a9a0092dcc9387e2f826c";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services11.yml";s:4:"role";s:4:"test";}}i:171;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9ed1d963ba546e9772a3808f08a91376";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services13.yml";s:4:"role";s:4:"test";}}i:172;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"be17d9c22568cf11a27193704cc13703";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.yml";s:4:"role";s:4:"test";}}i:173;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2011daeb4d44240efd2caddf60d84038";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services3.yml";s:4:"role";s:4:"test";}}i:174;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3e738ce0eb54d9aa53021bb09649e45b";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4.yml";s:4:"role";s:4:"test";}}i:175;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d1b518eb8021cccac6ac53ffc1157781";s:4:"name";s:82:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4_bad_import.yml";s:4:"role";s:4:"test";}}i:176;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6f37efe61e948638cb95cbeebee34a7d";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services6.yml";s:4:"role";s:4:"test";}}i:177;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6de30e3ec6f5769fffa3a84921d5ea58";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services7.yml";s:4:"role";s:4:"test";}}i:178;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2d887f6e7ab72fc1ef7710f090ac6892";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml";s:4:"role";s:4:"test";}}i:179;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0c0c237a0f162b1035bc9a31bfb7e3f3";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml";s:4:"role";s:4:"test";}}i:180;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b26bc2f643dea09195075d0096e874a0";s:4:"name";s:98:"Symfony/Component/DependencyInjection/Tests/LazyProxy/Instantiator/RealServiceInstantiatorTest.php";s:4:"role";s:4:"test";}}i:181;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e0c0229d4f3141bae74c4bbe30a06b21";s:4:"name";s:82:"Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/NullDumperTest.php";s:4:"role";s:4:"test";}}i:182;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"97399006240deb90b22bcdb49ab08f61";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Loader/ClosureLoaderTest.php";s:4:"role";s:4:"test";}}i:183;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8e3c7ae75fb774783dc26b6c33ca93f5";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Loader/IniFileLoaderTest.php";s:4:"role";s:4:"test";}}i:184;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c26312ff35c5941814fe09fdfecf216e";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php";s:4:"role";s:4:"test";}}i:185;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d702b36279525fb4751489f2e3285414";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php";s:4:"role";s:4:"test";}}i:186;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ae936ba0577f3144075883fc4a845ce";s:4:"name";s:73:"Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php";s:4:"role";s:4:"test";}}i:187;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f967ec9e8b4a79bf91bd5b4675fbc70c";s:4:"name";s:83:"Symfony/Component/DependencyInjection/Tests/ParameterBag/FrozenParameterBagTest.php";s:4:"role";s:4:"test";}}i:188;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6db6b2ca8ed272df55332f0916be0ad9";s:4:"name";s:77:"Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php";s:4:"role";s:4:"test";}}i:189;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"965987dd3ddde1039ebe8c42d83a241b";s:4:"name";s:61:"Symfony/Component/DependencyInjection/Tests/ParameterTest.php";s:4:"role";s:4:"test";}}i:190;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"203939f24651f40960e928d69a8c6a08";s:4:"name";s:61:"Symfony/Component/DependencyInjection/Tests/ReferenceTest.php";s:4:"role";s:4:"test";}}i:191;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ed13f0022bf056748456b80c702dbe21";s:4:"name";s:50:"Symfony/Component/DependencyInjection/Variable.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}s:8:"optional";a:1:{s:7:"package";a:2:{i:0;a:2:{s:4:"name";s:6:"Config";s:7:"channel";s:16:"pear.symfony.com";}i:1;a:2:{s:4:"name";s:4:"Yaml";s:7:"channel";s:16:"pear.symfony.com";}}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:192:{s:47:"Symfony/Component/DependencyInjection/Alias.php";a:4:{s:6:"md5sum";s:32:"8083d8117acb0fe0ea5dcd87cf7ffef7";s:4:"name";s:47:"Symfony/Component/DependencyInjection/Alias.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Alias.php";}s:52:"Symfony/Component/DependencyInjection/autoloader.php";a:4:{s:6:"md5sum";s:32:"7879012b46b3b27b8d8414b844ca3537";s:4:"name";s:52:"Symfony/Component/DependencyInjection/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/autoloader.php";}s:50:"Symfony/Component/DependencyInjection/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"514e07efd3462ee25be372a3d60bbd80";s:4:"name";s:50:"Symfony/Component/DependencyInjection/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/doc/pear/DependencyInjection/Symfony/Component/DependencyInjection/CHANGELOG.md";}s:79:"Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php";a:4:{s:6:"md5sum";s:32:"675a6bc1d3c3f3b2783f885f0521178b";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php";}s:78:"Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php";a:4:{s:6:"md5sum";s:32:"6091faa40727a56f10ba2146abf615e1";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php";}s:78:"Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php";a:4:{s:6:"md5sum";s:32:"2b373903ccf9d566a6927aed6c3c6650";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php";}s:95:"Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php";a:4:{s:6:"md5sum";s:32:"69b6713e0ee778e9b2cad497a9082151";s:4:"name";s:95:"Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php";}s:77:"Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php";a:4:{s:6:"md5sum";s:32:"7b1410dc03224741083a4d762836a91b";s:4:"name";s:77:"Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php";}s:59:"Symfony/Component/DependencyInjection/Compiler/Compiler.php";a:4:{s:6:"md5sum";s:32:"14bcd46172f5ac3e022e1d8f4fe1b08c";s:4:"name";s:59:"Symfony/Component/DependencyInjection/Compiler/Compiler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/Compiler.php";}s:72:"Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface.php";a:4:{s:6:"md5sum";s:32:"1292a88c9fadf67d117a659fb0bfd499";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface.php";}s:79:"Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php";a:4:{s:6:"md5sum";s:32:"ec4dc3e58fc8046e43c0874a99ea29e6";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php";}s:67:"Symfony/Component/DependencyInjection/Compiler/LoggingFormatter.php";a:4:{s:6:"md5sum";s:32:"d18aa0d044d4725eaacd006c55b8e366";s:4:"name";s:67:"Symfony/Component/DependencyInjection/Compiler/LoggingFormatter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/LoggingFormatter.php";}s:82:"Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php";a:4:{s:6:"md5sum";s:32:"5015cca96bf517b4780e5acfbcce2142";s:4:"name";s:82:"Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php";}s:61:"Symfony/Component/DependencyInjection/Compiler/PassConfig.php";a:4:{s:6:"md5sum";s:32:"8517ede71e527623a58dc3bca253c687";s:4:"name";s:61:"Symfony/Component/DependencyInjection/Compiler/PassConfig.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/PassConfig.php";}s:80:"Symfony/Component/DependencyInjection/Compiler/RemoveAbstractDefinitionsPass.php";a:4:{s:6:"md5sum";s:32:"270937e454d381dae233d817e52069ec";s:4:"name";s:80:"Symfony/Component/DependencyInjection/Compiler/RemoveAbstractDefinitionsPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/RemoveAbstractDefinitionsPass.php";}s:75:"Symfony/Component/DependencyInjection/Compiler/RemovePrivateAliasesPass.php";a:4:{s:6:"md5sum";s:32:"77d93353f41f2505251e003a33993f31";s:4:"name";s:75:"Symfony/Component/DependencyInjection/Compiler/RemovePrivateAliasesPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/RemovePrivateAliasesPass.php";}s:78:"Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php";a:4:{s:6:"md5sum";s:32:"82421fc37d82eeb210772fc9b5cc407d";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php";}s:74:"Symfony/Component/DependencyInjection/Compiler/RepeatablePassInterface.php";a:4:{s:6:"md5sum";s:32:"bee7b2336c610435c89fdc854101b604";s:4:"name";s:74:"Symfony/Component/DependencyInjection/Compiler/RepeatablePassInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/RepeatablePassInterface.php";}s:63:"Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php";a:4:{s:6:"md5sum";s:32:"f9167d35e36bf31d5aac396564f27bbb";s:4:"name";s:63:"Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php";}s:85:"Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php";a:4:{s:6:"md5sum";s:32:"0ece3d877daaabc8be38509d97752e2c";s:4:"name";s:85:"Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php";}s:81:"Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php";a:4:{s:6:"md5sum";s:32:"5e11621457d51880c84844518e300306";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php";}s:79:"Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php";a:4:{s:6:"md5sum";s:32:"15580e12e088ce2dc2fc89936e27bdc0";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php";}s:83:"Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php";a:4:{s:6:"md5sum";s:32:"f33dfb27625ccb59d575de3fd0e3862f";s:4:"name";s:83:"Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php";}s:81:"Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php";a:4:{s:6:"md5sum";s:32:"69e660af3582cdacbfa328e0280a5740";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php";}s:72:"Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php";a:4:{s:6:"md5sum";s:32:"965e8e3c37eea82b6eb961df50d9014d";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php";}s:76:"Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphEdge.php";a:4:{s:6:"md5sum";s:32:"0e3f4ba1f08962ec73803a78f7a8c3f2";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphEdge.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphEdge.php";}s:76:"Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php";a:4:{s:6:"md5sum";s:32:"3ce32fc9229295bec473e33ce95cfe4d";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php";}s:51:"Symfony/Component/DependencyInjection/composer.json";a:4:{s:6:"md5sum";s:32:"5ed58de81d8eb7d0d3d316ee27368e11";s:4:"name";s:51:"Symfony/Component/DependencyInjection/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/doc/pear/DependencyInjection/Symfony/Component/DependencyInjection/composer.json";}s:51:"Symfony/Component/DependencyInjection/Container.php";a:4:{s:6:"md5sum";s:32:"d87452c514f1fd3daa1d76050329e0cc";s:4:"name";s:51:"Symfony/Component/DependencyInjection/Container.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Container.php";}s:56:"Symfony/Component/DependencyInjection/ContainerAware.php";a:4:{s:6:"md5sum";s:32:"4318c2ce4d160e6d183edce4928db696";s:4:"name";s:56:"Symfony/Component/DependencyInjection/ContainerAware.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ContainerAware.php";}s:65:"Symfony/Component/DependencyInjection/ContainerAwareInterface.php";a:4:{s:6:"md5sum";s:32:"b4bbd2a21e9afe2cd25d26c37c54bfa9";s:4:"name";s:65:"Symfony/Component/DependencyInjection/ContainerAwareInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ContainerAwareInterface.php";}s:61:"Symfony/Component/DependencyInjection/ContainerAwareTrait.php";a:4:{s:6:"md5sum";s:32:"304f3c4322c235b332992d829d68e50b";s:4:"name";s:61:"Symfony/Component/DependencyInjection/ContainerAwareTrait.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ContainerAwareTrait.php";}s:58:"Symfony/Component/DependencyInjection/ContainerBuilder.php";a:4:{s:6:"md5sum";s:32:"6599366a3251af3d99243b49316fb9fe";s:4:"name";s:58:"Symfony/Component/DependencyInjection/ContainerBuilder.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ContainerBuilder.php";}s:60:"Symfony/Component/DependencyInjection/ContainerInterface.php";a:4:{s:6:"md5sum";s:32:"2531b72281ed8336ff1afbb7ada89bb8";s:4:"name";s:60:"Symfony/Component/DependencyInjection/ContainerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ContainerInterface.php";}s:52:"Symfony/Component/DependencyInjection/Definition.php";a:4:{s:6:"md5sum";s:32:"047285baeb298041af1ae447da6e55b3";s:4:"name";s:52:"Symfony/Component/DependencyInjection/Definition.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Definition.php";}s:61:"Symfony/Component/DependencyInjection/DefinitionDecorator.php";a:4:{s:6:"md5sum";s:32:"cf838655798392939269b928daeb17f3";s:4:"name";s:61:"Symfony/Component/DependencyInjection/DefinitionDecorator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/DefinitionDecorator.php";}s:55:"Symfony/Component/DependencyInjection/Dumper/Dumper.php";a:4:{s:6:"md5sum";s:32:"3b295c276bb774433a45f1ee0339a299";s:4:"name";s:55:"Symfony/Component/DependencyInjection/Dumper/Dumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Dumper/Dumper.php";}s:64:"Symfony/Component/DependencyInjection/Dumper/DumperInterface.php";a:4:{s:6:"md5sum";s:32:"b9dd1589f9ffac4366fd4148d9e78ade";s:4:"name";s:64:"Symfony/Component/DependencyInjection/Dumper/DumperInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Dumper/DumperInterface.php";}s:63:"Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php";a:4:{s:6:"md5sum";s:32:"688f77795fc125e75645706bf19ec8cf";s:4:"name";s:63:"Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php";}s:58:"Symfony/Component/DependencyInjection/Dumper/PhpDumper.php";a:4:{s:6:"md5sum";s:32:"bd310f7ab99d2c941dff3b3b402a1fd7";s:4:"name";s:58:"Symfony/Component/DependencyInjection/Dumper/PhpDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php";}s:58:"Symfony/Component/DependencyInjection/Dumper/XmlDumper.php";a:4:{s:6:"md5sum";s:32:"abe8dcd883cb0c698d7e91f2c600f45c";s:4:"name";s:58:"Symfony/Component/DependencyInjection/Dumper/XmlDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php";}s:59:"Symfony/Component/DependencyInjection/Dumper/YamlDumper.php";a:4:{s:6:"md5sum";s:32:"409f8a23d69eaa1272fd7cbb75d23026";s:4:"name";s:59:"Symfony/Component/DependencyInjection/Dumper/YamlDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php";}s:74:"Symfony/Component/DependencyInjection/Exception/BadMethodCallException.php";a:4:{s:6:"md5sum";s:32:"7881aa76d06f7b9e4bd45dc85ae0d52e";s:4:"name";s:74:"Symfony/Component/DependencyInjection/Exception/BadMethodCallException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/BadMethodCallException.php";}s:70:"Symfony/Component/DependencyInjection/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"d79633abb224cffc0597be170aca74ea";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/ExceptionInterface.php";}s:74:"Symfony/Component/DependencyInjection/Exception/InactiveScopeException.php";a:4:{s:6:"md5sum";s:32:"9022cb0f19ecaf1198318f0c178c5264";s:4:"name";s:74:"Symfony/Component/DependencyInjection/Exception/InactiveScopeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/InactiveScopeException.php";}s:76:"Symfony/Component/DependencyInjection/Exception/InvalidArgumentException.php";a:4:{s:6:"md5sum";s:32:"f1b09121e6850f5271d8bd3a6837efd3";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Exception/InvalidArgumentException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/InvalidArgumentException.php";}s:66:"Symfony/Component/DependencyInjection/Exception/LogicException.php";a:4:{s:6:"md5sum";s:32:"5b78b4f59982df23deaf0242aec3d4a9";s:4:"name";s:66:"Symfony/Component/DependencyInjection/Exception/LogicException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/LogicException.php";}s:72:"Symfony/Component/DependencyInjection/Exception/OutOfBoundsException.php";a:4:{s:6:"md5sum";s:32:"792b235a45e9f4c0c7a7280580b1a2a3";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Exception/OutOfBoundsException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/OutOfBoundsException.php";}s:87:"Symfony/Component/DependencyInjection/Exception/ParameterCircularReferenceException.php";a:4:{s:6:"md5sum";s:32:"7b059f59730003361cceadd8965ad7c5";s:4:"name";s:87:"Symfony/Component/DependencyInjection/Exception/ParameterCircularReferenceException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/ParameterCircularReferenceException.php";}s:78:"Symfony/Component/DependencyInjection/Exception/ParameterNotFoundException.php";a:4:{s:6:"md5sum";s:32:"6d83c2934f82a5ef7992b7081eaeffd7";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Exception/ParameterNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/ParameterNotFoundException.php";}s:68:"Symfony/Component/DependencyInjection/Exception/RuntimeException.php";a:4:{s:6:"md5sum";s:32:"4e4d9c135fec917ae3fa78f25fbd7f85";s:4:"name";s:68:"Symfony/Component/DependencyInjection/Exception/RuntimeException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/RuntimeException.php";}s:83:"Symfony/Component/DependencyInjection/Exception/ScopeCrossingInjectionException.php";a:4:{s:6:"md5sum";s:32:"0d73336fcf6534c59887f8b5687d1bd6";s:4:"name";s:83:"Symfony/Component/DependencyInjection/Exception/ScopeCrossingInjectionException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/ScopeCrossingInjectionException.php";}s:83:"Symfony/Component/DependencyInjection/Exception/ScopeWideningInjectionException.php";a:4:{s:6:"md5sum";s:32:"719ca3a89890fcb941cca1b16a0fafef";s:4:"name";s:83:"Symfony/Component/DependencyInjection/Exception/ScopeWideningInjectionException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/ScopeWideningInjectionException.php";}s:85:"Symfony/Component/DependencyInjection/Exception/ServiceCircularReferenceException.php";a:4:{s:6:"md5sum";s:32:"8ac40af4863b3c6cd9311cc1a29cf802";s:4:"name";s:85:"Symfony/Component/DependencyInjection/Exception/ServiceCircularReferenceException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/ServiceCircularReferenceException.php";}s:76:"Symfony/Component/DependencyInjection/Exception/ServiceNotFoundException.php";a:4:{s:6:"md5sum";s:32:"9785d054cb75a079dcecc97fc77a8ebb";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Exception/ServiceNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception/ServiceNotFoundException.php";}s:60:"Symfony/Component/DependencyInjection/ExpressionLanguage.php";a:4:{s:6:"md5sum";s:32:"3eebc81d79682bdbfe5ce43980d2ab92";s:4:"name";s:60:"Symfony/Component/DependencyInjection/ExpressionLanguage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ExpressionLanguage.php";}s:83:"Symfony/Component/DependencyInjection/Extension/ConfigurationExtensionInterface.php";a:4:{s:6:"md5sum";s:32:"819fae3f0bfd1d3ba7dd2a4fc29f89e8";s:4:"name";s:83:"Symfony/Component/DependencyInjection/Extension/ConfigurationExtensionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Extension/ConfigurationExtensionInterface.php";}s:61:"Symfony/Component/DependencyInjection/Extension/Extension.php";a:4:{s:6:"md5sum";s:32:"80cf4c6b7246bd342cf87699c23d0114";s:4:"name";s:61:"Symfony/Component/DependencyInjection/Extension/Extension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Extension/Extension.php";}s:70:"Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php";a:4:{s:6:"md5sum";s:32:"d9f5df364b37addf087305ce17842de9";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php";}s:77:"Symfony/Component/DependencyInjection/Extension/PrependExtensionInterface.php";a:4:{s:6:"md5sum";s:32:"0eea6361b5960d4ff58646b75864898f";s:4:"name";s:77:"Symfony/Component/DependencyInjection/Extension/PrependExtensionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Extension/PrependExtensionInterface.php";}s:74:"Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php";a:4:{s:6:"md5sum";s:32:"78118376c3e263f9eb58313ee1bb6f5a";s:4:"name";s:74:"Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php";}s:86:"Symfony/Component/DependencyInjection/LazyProxy/Instantiator/InstantiatorInterface.php";a:4:{s:6:"md5sum";s:32:"2195bb770e5851fa1ebd680906ae112b";s:4:"name";s:86:"Symfony/Component/DependencyInjection/LazyProxy/Instantiator/InstantiatorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/InstantiatorInterface.php";}s:88:"Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.php";a:4:{s:6:"md5sum";s:32:"bf8b05c0ab1b67dda36944d6a5d0d653";s:4:"name";s:88:"Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.php";}s:77:"Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/DumperInterface.php";a:4:{s:6:"md5sum";s:32:"0ff96280df12f153aee121649615763f";s:4:"name";s:77:"Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/DumperInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/DumperInterface.php";}s:72:"Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.php";a:4:{s:6:"md5sum";s:32:"8857647188554714f60a97a1a5f54fa0";s:4:"name";s:72:"Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.php";}s:45:"Symfony/Component/DependencyInjection/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:45:"Symfony/Component/DependencyInjection/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/doc/pear/DependencyInjection/Symfony/Component/DependencyInjection/LICENSE";}s:62:"Symfony/Component/DependencyInjection/Loader/ClosureLoader.php";a:4:{s:6:"md5sum";s:32:"262400ebaa94fc67c3cf2c89015cc395";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Loader/ClosureLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader/ClosureLoader.php";}s:59:"Symfony/Component/DependencyInjection/Loader/FileLoader.php";a:4:{s:6:"md5sum";s:32:"378be59c411306f23d8adb22fcaedad6";s:4:"name";s:59:"Symfony/Component/DependencyInjection/Loader/FileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader/FileLoader.php";}s:62:"Symfony/Component/DependencyInjection/Loader/IniFileLoader.php";a:4:{s:6:"md5sum";s:32:"682de96cf34a4ac9f93d1e5c9d2cb153";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Loader/IniFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader/IniFileLoader.php";}s:62:"Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php";a:4:{s:6:"md5sum";s:32:"ce3bf3b148cb1be2d7e30a5c589f9af9";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php";}s:81:"Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd";a:4:{s:6:"md5sum";s:32:"32beacc60968ee62e94f66672e3a7ec2";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd";s:4:"role";s:3:"php";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd";}s:62:"Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php";a:4:{s:6:"md5sum";s:32:"ed4c6f9c796d3986362a7a67dac9bc47";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php";}s:63:"Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php";a:4:{s:6:"md5sum";s:32:"5df455b7334b17e89c9e094cf5978291";s:4:"name";s:63:"Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php";}s:51:"Symfony/Component/DependencyInjection/Parameter.php";a:4:{s:6:"md5sum";s:32:"7b2faf5e73ce778720b67e94cf6d2bba";s:4:"name";s:51:"Symfony/Component/DependencyInjection/Parameter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Parameter.php";}s:73:"Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php";a:4:{s:6:"md5sum";s:32:"c975b424d378e0060f13f23f218768d5";s:4:"name";s:73:"Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php";}s:67:"Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php";a:4:{s:6:"md5sum";s:32:"ce95aa07d7fe9d8e35dd1cf0af3b508e";s:4:"name";s:67:"Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php";}s:76:"Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php";a:4:{s:6:"md5sum";s:32:"a1d6864e44ce2807160e6ccbd8e2d730";s:4:"name";s:76:"Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php";}s:54:"Symfony/Component/DependencyInjection/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"e9b92b932a912fe805d01f4fa1d196d7";s:4:"name";s:54:"Symfony/Component/DependencyInjection/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/phpunit.xml.dist";}s:47:"Symfony/Component/DependencyInjection/README.md";a:4:{s:6:"md5sum";s:32:"1b27a3a51d5eeea9a6ee9fb5aed79c1f";s:4:"name";s:47:"Symfony/Component/DependencyInjection/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/doc/pear/DependencyInjection/Symfony/Component/DependencyInjection/README.md";}s:51:"Symfony/Component/DependencyInjection/Reference.php";a:4:{s:6:"md5sum";s:32:"a472c7a6d20af6710b87a299b9fdb855";s:4:"name";s:51:"Symfony/Component/DependencyInjection/Reference.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Reference.php";}s:47:"Symfony/Component/DependencyInjection/Scope.php";a:4:{s:6:"md5sum";s:32:"d464293058a891542cef77f9e14e18b4";s:4:"name";s:47:"Symfony/Component/DependencyInjection/Scope.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Scope.php";}s:56:"Symfony/Component/DependencyInjection/ScopeInterface.php";a:4:{s:6:"md5sum";s:32:"b990c20640f9a64135bcf0369f4e22a6";s:4:"name";s:56:"Symfony/Component/DependencyInjection/ScopeInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ScopeInterface.php";}s:58:"Symfony/Component/DependencyInjection/SimpleXMLElement.php";a:4:{s:6:"md5sum";s:32:"66c75a60290a0461dc4e28feed7952dc";s:4:"name";s:58:"Symfony/Component/DependencyInjection/SimpleXMLElement.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/SimpleXMLElement.php";}s:66:"Symfony/Component/DependencyInjection/TaggedContainerInterface.php";a:4:{s:6:"md5sum";s:32:"3c47bde46b89617dcd69f4ebf5056865";s:4:"name";s:66:"Symfony/Component/DependencyInjection/TaggedContainerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/TaggedContainerInterface.php";}s:89:"Symfony/Component/DependencyInjection/Tests/Compiler/AnalyzeServiceReferencesPassTest.php";a:4:{s:6:"md5sum";s:32:"d54cef7b3cb33ee1e7042d26c584f7fe";s:4:"name";s:89:"Symfony/Component/DependencyInjection/Tests/Compiler/AnalyzeServiceReferencesPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:144:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/AnalyzeServiceReferencesPassTest.php";}s:88:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php";a:4:{s:6:"md5sum";s:32:"1a6f4aa36bb6dca84bcec6c5b3a4aa1f";s:4:"name";s:88:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:143:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php";}s:88:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php";a:4:{s:6:"md5sum";s:32:"637d842f3a08a0f1bce0921ba641c049";s:4:"name";s:88:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:143:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php";}s:105:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php";a:4:{s:6:"md5sum";s:32:"8cecafcb0696950082f24bdc0ed79beb";s:4:"name";s:105:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:160:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php";}s:87:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckReferenceValidityPassTest.php";a:4:{s:6:"md5sum";s:32:"150d6c72e7fa4958c3750097d6985874";s:4:"name";s:87:"Symfony/Component/DependencyInjection/Tests/Compiler/CheckReferenceValidityPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:142:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckReferenceValidityPassTest.php";}s:89:"Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php";a:4:{s:6:"md5sum";s:32:"d38af5ce9bbb76b8b8e8ff4881347669";s:4:"name";s:89:"Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:144:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php";}s:72:"Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php";a:4:{s:6:"md5sum";s:32:"6495d73686ede93887cf537f6e9ec0e9";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php";}s:88:"Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php";a:4:{s:6:"md5sum";s:32:"69e56c8a628567929f063b36ab9a2e84";s:4:"name";s:88:"Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:143:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php";}s:95:"Symfony/Component/DependencyInjection/Tests/Compiler/ReplaceAliasByActualDefinitionPassTest.php";a:4:{s:6:"md5sum";s:32:"d8a0328438ce5162a8b8585be178673d";s:4:"name";s:95:"Symfony/Component/DependencyInjection/Tests/Compiler/ReplaceAliasByActualDefinitionPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:150:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/ReplaceAliasByActualDefinitionPassTest.php";}s:91:"Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php";a:4:{s:6:"md5sum";s:32:"7547b1b316c37533be6820e12815f3cf";s:4:"name";s:91:"Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:146:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php";}s:89:"Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.php";a:4:{s:6:"md5sum";s:32:"2c41afba4dc70fc0f903ebe52befd642";s:4:"name";s:89:"Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:144:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.php";}s:91:"Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.php";a:4:{s:6:"md5sum";s:32:"13b4ec5501d3cba658a6973dcffa9799";s:4:"name";s:91:"Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:146:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.php";}s:68:"Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php";a:4:{s:6:"md5sum";s:32:"aa9b5e5dc4e83673b333455f0d863130";s:4:"name";s:68:"Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php";}s:61:"Symfony/Component/DependencyInjection/Tests/ContainerTest.php";a:4:{s:6:"md5sum";s:32:"e2ff857908d1e4161ea4c3dd8993c9a2";s:4:"name";s:61:"Symfony/Component/DependencyInjection/Tests/ContainerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ContainerTest.php";}s:62:"Symfony/Component/DependencyInjection/Tests/CrossCheckTest.php";a:4:{s:6:"md5sum";s:32:"ea1ce9dbce7920ea2631ffbfbead7658";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Tests/CrossCheckTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/CrossCheckTest.php";}s:71:"Symfony/Component/DependencyInjection/Tests/DefinitionDecoratorTest.php";a:4:{s:6:"md5sum";s:32:"e5b34b5cef82e20befe6943b167b3dce";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/DefinitionDecoratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/DefinitionDecoratorTest.php";}s:62:"Symfony/Component/DependencyInjection/Tests/DefinitionTest.php";a:4:{s:6:"md5sum";s:32:"dbee36c02395ef4885ca72420bf98503";s:4:"name";s:62:"Symfony/Component/DependencyInjection/Tests/DefinitionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php";}s:73:"Symfony/Component/DependencyInjection/Tests/Dumper/GraphvizDumperTest.php";a:4:{s:6:"md5sum";s:32:"5518fa88c922a8c873133651e233386b";s:4:"name";s:73:"Symfony/Component/DependencyInjection/Tests/Dumper/GraphvizDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Dumper/GraphvizDumperTest.php";}s:68:"Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php";a:4:{s:6:"md5sum";s:32:"03e6215b1c0abc0fa0a11642e4786649";s:4:"name";s:68:"Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php";}s:68:"Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php";a:4:{s:6:"md5sum";s:32:"af6f3ad2f9b929dcbac53b8a48f122f3";s:4:"name";s:68:"Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php";}s:69:"Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php";a:4:{s:6:"md5sum";s:32:"d6ae9074c31ddfb3794ff731d60b20bb";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php";}s:71:"Symfony/Component/DependencyInjection/Tests/Extension/ExtensionTest.php";a:4:{s:6:"md5sum";s:32:"939faedda209b4d87552d4fe7cd7ca24";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Extension/ExtensionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Extension/ExtensionTest.php";}s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container10.php";a:4:{s:6:"md5sum";s:32:"6422feace05a5ed96c42ed848d10006c";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container10.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container10.php";}s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container11.php";a:4:{s:6:"md5sum";s:32:"1ff966b209cd577bd0d6bb36d7e649e4";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container11.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container11.php";}s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container12.php";a:4:{s:6:"md5sum";s:32:"1acdceda33fce9015eff3bf7d156135b";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container12.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container12.php";}s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container13.php";a:4:{s:6:"md5sum";s:32:"00b3703e57b5c9586ec0e398ea7a20b2";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container13.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container13.php";}s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container14.php";a:4:{s:6:"md5sum";s:32:"b21b1c14c129dd16d9414a26aa263c45";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container14.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container14.php";}s:78:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php";a:4:{s:6:"md5sum";s:32:"4bf1be8db545cde3ba7d0e6f6297308d";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php";s:4:"role";s:4:"test";s:12:"installed_as";s:133:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php";}s:78:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.php";a:4:{s:6:"md5sum";s:32:"098b361885203b2d00989fce70938512";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.php";s:4:"role";s:4:"test";s:12:"installed_as";s:133:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.php";}s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces1.php";a:4:{s:6:"md5sum";s:32:"f06eb418f0f04a719312f0e4ca232e9d";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces1.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces1.php";}s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces2.php";a:4:{s:6:"md5sum";s:32:"a0ccfd20143be600667c0e98fb665071";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces2.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces2.php";}s:75:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services1.dot";a:4:{s:6:"md5sum";s:32:"02cffa6095e3a31d691a5bdcdbe7c227";s:4:"name";s:75:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services1.dot";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services1.dot";}s:78:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10-1.dot";a:4:{s:6:"md5sum";s:32:"5bf12610e2c2a95c5506a1b92ee929f6";s:4:"name";s:78:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10-1.dot";s:4:"role";s:4:"test";s:12:"installed_as";s:133:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10-1.dot";}s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10.dot";a:4:{s:6:"md5sum";s:32:"5eda7f5d745f7686812c80927819c499";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10.dot";s:4:"role";s:4:"test";s:12:"installed_as";s:131:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10.dot";}s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dot";a:4:{s:6:"md5sum";s:32:"8f1d93f127c665d4f17b81c9cadc1e90";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dot";s:4:"role";s:4:"test";s:12:"installed_as";s:131:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dot";}s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services14.dot";a:4:{s:6:"md5sum";s:32:"a7b7d8d68fc8e2f58dfd94d5de28604c";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services14.dot";s:4:"role";s:4:"test";s:12:"installed_as";s:131:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services14.dot";}s:75:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dot";a:4:{s:6:"md5sum";s:32:"17882b73c2f05f5bed8a8761f693ee75";s:4:"name";s:75:"Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dot";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dot";}s:73:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/classes.php";a:4:{s:6:"md5sum";s:32:"6c18955e7fff0a445ccd323169edfa39";s:4:"name";s:73:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/classes.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/classes.php";}s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/createphar.php";a:4:{s:6:"md5sum";s:32:"658357428dc406d5f951a31a951a468b";s:4:"name";s:76:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/createphar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:131:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/createphar.php";}s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/foo.php";a:4:{s:6:"md5sum";s:32:"f38316643924184c25c2d323eb2115c8";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/foo.php";}s:82:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.php";a:4:{s:6:"md5sum";s:32:"d378aa4475659bdd4d5d1d1a7898a5d8";s:4:"name";s:82:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.php";s:4:"role";s:4:"test";s:12:"installed_as";s:137:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.php";}s:89:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtension.php";a:4:{s:6:"md5sum";s:32:"2533e30245d301e424eb76b539244446";s:4:"name";s:89:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtension.php";s:4:"role";s:4:"test";s:12:"installed_as";s:144:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtension.php";}s:96:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtensionInPhar.phar";a:4:{s:6:"md5sum";s:32:"b4a17c6724b7c820a73579d094cdd932";s:4:"name";s:96:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtensionInPhar.phar";s:4:"role";s:4:"test";s:12:"installed_as";s:151:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtensionInPhar.phar";}s:84:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/schema/project-1.0.xsd";a:4:{s:6:"md5sum";s:32:"cd16e7c41fc369846a5eb4a42d1e5b93";s:4:"name";s:84:"Symfony/Component/DependencyInjection/Tests/Fixtures/includes/schema/project-1.0.xsd";s:4:"role";s:4:"test";s:12:"installed_as";s:139:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/schema/project-1.0.xsd";}s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/nonvalid.ini";a:4:{s:6:"md5sum";s:32:"547a11b176c7c7905611acd1582252d6";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/nonvalid.ini";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/ini/nonvalid.ini";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters.ini";a:4:{s:6:"md5sum";s:32:"4a8f0aad32fe89d804cb85703f0e2965";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters.ini";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters.ini";}s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters1.ini";a:4:{s:6:"md5sum";s:32:"cc1e7671d8c8e219998593b0069ac474";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters1.ini";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters1.ini";}s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters2.ini";a:4:{s:6:"md5sum";s:32:"e2432dcd44bad3082cff4aabce9d2f33";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters2.ini";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters2.ini";}s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php";a:4:{s:6:"md5sum";s:32:"efe219ab816512283367c226a1656ee4";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1.php";a:4:{s:6:"md5sum";s:32:"99506344d5fcc588c963e91e473a06d1";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1.php";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php";a:4:{s:6:"md5sum";s:32:"9b7bf72ef23353c753f51bf557706ef4";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services11.php";a:4:{s:6:"md5sum";s:32:"11e72fc308dfdadaedc9544c8756769b";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services11.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services11.php";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php";a:4:{s:6:"md5sum";s:32:"44b0afab75892ad4556743db23d1e629";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php";a:4:{s:6:"md5sum";s:32:"80b20e5ead9c8ff04678100303294161";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php";}s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php";a:4:{s:6:"md5sum";s:32:"b8e9a27269a37e19f37566f39801b484";s:4:"name";s:79:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php";}s:67:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/simple.php";a:4:{s:6:"md5sum";s:32:"0a223fc28b123a00eeae0ce7825953eb";s:4:"name";s:67:"Symfony/Component/DependencyInjection/Tests/Fixtures/php/simple.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/simple.php";}s:80:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension1/services.xml";a:4:{s:6:"md5sum";s:32:"d741c7a31311ead4df2057e523afeba3";s:4:"name";s:80:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension1/services.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension1/services.xml";}s:80:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension2/services.xml";a:4:{s:6:"md5sum";s:32:"f932ffc98518b016fc6383139b711c96";s:4:"name";s:80:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension2/services.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension2/services.xml";}s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services1.xml";a:4:{s:6:"md5sum";s:32:"d144314f085c31ccb0a41f802f306649";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services1.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services1.xml";}s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services2.xml";a:4:{s:6:"md5sum";s:32:"8a597cf4214e62043465a1d135cbf428";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services2.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services2.xml";}s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services3.xml";a:4:{s:6:"md5sum";s:32:"2a00696fd70991a11a2aa0e1e5d61e75";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services3.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services3.xml";}s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services4.xml";a:4:{s:6:"md5sum";s:32:"340f21074d0ff685079b5fc0b80dacdf";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services4.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services4.xml";}s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services5.xml";a:4:{s:6:"md5sum";s:32:"7dade70bc8de90a4c116d01df8744179";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services5.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services5.xml";}s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services6.xml";a:4:{s:6:"md5sum";s:32:"873eec7bf6988585b8be9ed78d32d4f0";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services6.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services6.xml";}s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services7.xml";a:4:{s:6:"md5sum";s:32:"834d96fb17d411d3c25df34a8e12339c";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services7.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services7.xml";}s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/nonvalid.xml";a:4:{s:6:"md5sum";s:32:"e1fb95406c0ff63742800fdc95eb99f6";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/nonvalid.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/nonvalid.xml";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services1.xml";a:4:{s:6:"md5sum";s:32:"d7c935e1400a979267225dfbe9519a9e";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services1.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services1.xml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services10.xml";a:4:{s:6:"md5sum";s:32:"525da15fe7d63e3e0f8ae78a96929107";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services10.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services10.xml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services13.xml";a:4:{s:6:"md5sum";s:32:"0bed9c78fc2a7b638d81d6e948474ed9";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services13.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services13.xml";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services2.xml";a:4:{s:6:"md5sum";s:32:"af73c797e9dabde154c0460a294ab77d";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services2.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services2.xml";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services3.xml";a:4:{s:6:"md5sum";s:32:"5b8fbad821d7f9b92a37c6ec30fbb8a9";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services3.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services3.xml";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4.xml";a:4:{s:6:"md5sum";s:32:"5b6edb71e890234adad9ebb17e88fb6f";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4.xml";}s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4_bad_import.xml";a:4:{s:6:"md5sum";s:32:"53040074af5e742e3e7bc6a820f0b17d";s:4:"name";s:81:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4_bad_import.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:136:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4_bad_import.xml";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services5.xml";a:4:{s:6:"md5sum";s:32:"6f50270290cb9bafc719886743286773";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services5.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services5.xml";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services6.xml";a:4:{s:6:"md5sum";s:32:"15f37e20652d85a361cccc6a6f9322ac";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services6.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services6.xml";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services7.xml";a:4:{s:6:"md5sum";s:32:"3f0cd2a9228c7f1479f535b48beb3f21";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services7.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services7.xml";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml";a:4:{s:6:"md5sum";s:32:"71f5c7df64436e6adf6fb4457d7b5075";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml";}s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml";a:4:{s:6:"md5sum";s:32:"ca60e6bf5f65fff971f8d13a644a9acb";s:4:"name";s:70:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml";}s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/withdoctype.xml";a:4:{s:6:"md5sum";s:32:"561c119c08673fd8436e11424a20d808";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/xml/withdoctype.xml";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/withdoctype.xml";}s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag1.yml";a:4:{s:6:"md5sum";s:32:"2b4b910651d1e7de3a74cc6872184be8";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag1.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag1.yml";}s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag2.yml";a:4:{s:6:"md5sum";s:32:"2651cca5fcafb2d3328d2d18cc825f2f";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag2.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag2.yml";}s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag3.yml";a:4:{s:6:"md5sum";s:32:"8b67ba68bb2c5551ac4bc3f7a865839d";s:4:"name";s:69:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag3.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag3.yml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid1.yml";a:4:{s:6:"md5sum";s:32:"037bf52fe0bfa7b643b837d08dfdf92d";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid1.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid1.yml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid2.yml";a:4:{s:6:"md5sum";s:32:"d42f2da1df5ecdf29be4ac27edda0c12";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid2.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid2.yml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services1.yml";a:4:{s:6:"md5sum";s:32:"68b329da9893e34099c7d8ad5cb9c940";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services1.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services1.yml";}s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services10.yml";a:4:{s:6:"md5sum";s:32:"98428e36b00061da1b64b1e64781e4d0";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services10.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services10.yml";}s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services11.yml";a:4:{s:6:"md5sum";s:32:"8fc6f5242a9a9a0092dcc9387e2f826c";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services11.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services11.yml";}s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services13.yml";a:4:{s:6:"md5sum";s:32:"9ed1d963ba546e9772a3808f08a91376";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services13.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services13.yml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.yml";a:4:{s:6:"md5sum";s:32:"be17d9c22568cf11a27193704cc13703";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.yml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services3.yml";a:4:{s:6:"md5sum";s:32:"2011daeb4d44240efd2caddf60d84038";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services3.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services3.yml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4.yml";a:4:{s:6:"md5sum";s:32:"3e738ce0eb54d9aa53021bb09649e45b";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4.yml";}s:82:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4_bad_import.yml";a:4:{s:6:"md5sum";s:32:"d1b518eb8021cccac6ac53ffc1157781";s:4:"name";s:82:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4_bad_import.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:137:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4_bad_import.yml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services6.yml";a:4:{s:6:"md5sum";s:32:"6f37efe61e948638cb95cbeebee34a7d";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services6.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services6.yml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services7.yml";a:4:{s:6:"md5sum";s:32:"6de30e3ec6f5769fffa3a84921d5ea58";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services7.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services7.yml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml";a:4:{s:6:"md5sum";s:32:"2d887f6e7ab72fc1ef7710f090ac6892";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml";}s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml";a:4:{s:6:"md5sum";s:32:"0c0c237a0f162b1035bc9a31bfb7e3f3";s:4:"name";s:71:"Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml";}s:98:"Symfony/Component/DependencyInjection/Tests/LazyProxy/Instantiator/RealServiceInstantiatorTest.php";a:4:{s:6:"md5sum";s:32:"b26bc2f643dea09195075d0096e874a0";s:4:"name";s:98:"Symfony/Component/DependencyInjection/Tests/LazyProxy/Instantiator/RealServiceInstantiatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:153:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/LazyProxy/Instantiator/RealServiceInstantiatorTest.php";}s:82:"Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/NullDumperTest.php";a:4:{s:6:"md5sum";s:32:"e0c0229d4f3141bae74c4bbe30a06b21";s:4:"name";s:82:"Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/NullDumperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:137:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/NullDumperTest.php";}s:72:"Symfony/Component/DependencyInjection/Tests/Loader/ClosureLoaderTest.php";a:4:{s:6:"md5sum";s:32:"97399006240deb90b22bcdb49ab08f61";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Loader/ClosureLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader/ClosureLoaderTest.php";}s:72:"Symfony/Component/DependencyInjection/Tests/Loader/IniFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"8e3c7ae75fb774783dc26b6c33ca93f5";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Loader/IniFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader/IniFileLoaderTest.php";}s:72:"Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"c26312ff35c5941814fe09fdfecf216e";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php";}s:72:"Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"d702b36279525fb4751489f2e3285414";s:4:"name";s:72:"Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php";}s:73:"Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php";a:4:{s:6:"md5sum";s:32:"3ae936ba0577f3144075883fc4a845ce";s:4:"name";s:73:"Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php";}s:83:"Symfony/Component/DependencyInjection/Tests/ParameterBag/FrozenParameterBagTest.php";a:4:{s:6:"md5sum";s:32:"f967ec9e8b4a79bf91bd5b4675fbc70c";s:4:"name";s:83:"Symfony/Component/DependencyInjection/Tests/ParameterBag/FrozenParameterBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:138:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ParameterBag/FrozenParameterBagTest.php";}s:77:"Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php";a:4:{s:6:"md5sum";s:32:"6db6b2ca8ed272df55332f0916be0ad9";s:4:"name";s:77:"Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:132:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php";}s:61:"Symfony/Component/DependencyInjection/Tests/ParameterTest.php";a:4:{s:6:"md5sum";s:32:"965987dd3ddde1039ebe8c42d83a241b";s:4:"name";s:61:"Symfony/Component/DependencyInjection/Tests/ParameterTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ParameterTest.php";}s:61:"Symfony/Component/DependencyInjection/Tests/ReferenceTest.php";a:4:{s:6:"md5sum";s:32:"203939f24651f40960e928d69a8c6a08";s:4:"name";s:61:"Symfony/Component/DependencyInjection/Tests/ReferenceTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ReferenceTest.php";}s:50:"Symfony/Component/DependencyInjection/Variable.php";a:4:{s:6:"md5sum";s:32:"ed13f0022bf056748456b80c702dbe21";s:4:"name";s:50:"Symfony/Component/DependencyInjection/Variable.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Variable.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:44:{s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:91:"/opt/alt/php54/usr/share/doc/pear/DependencyInjection/Symfony/Component/DependencyInjection";b:1;s:71:"/opt/alt/php54/usr/share/doc/pear/DependencyInjection/Symfony/Component";b:1;s:61:"/opt/alt/php54/usr/share/doc/pear/DependencyInjection/Symfony";b:1;s:53:"/opt/alt/php54/usr/share/doc/pear/DependencyInjection";b:1;s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Compiler";b:1;s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Dumper";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Exception";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Extension";b:1;s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/LazyProxy/Instantiator";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/LazyProxy";b:1;s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper";b:1;s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader";b:1;s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader/schema/dic/services";b:1;s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader/schema/dic";b:1;s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/Loader/schema";b:1;s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/DependencyInjection/ParameterBag";b:1;s:92:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection";b:1;s:72:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component";b:1;s:62:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony";b:1;s:54:"/opt/alt/php54/usr/share/pear/test/DependencyInjection";b:1;s:107:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler";b:1;s:98:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests";b:1;s:105:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Dumper";b:1;s:108:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Extension";b:1;s:118:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers";b:1;s:107:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures";b:1;s:116:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz";b:1;s:116:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes";b:1;s:123:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/schema";b:1;s:111:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/ini";b:1;s:111:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php";b:1;s:122:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension1";b:1;s:111:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml";b:1;s:122:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension2";b:1;s:122:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions";b:1;s:112:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml";b:1;s:121:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/LazyProxy/Instantiator";b:1;s:108:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/LazyProxy";b:1;s:118:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper";b:1;s:105:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader";b:1;s:111:"/opt/alt/php54/usr/share/pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ParameterBag";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:4:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:6:"Config";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:3;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:4:"Yaml";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\K�������7pear/.registry/.channel.pear.symfony.com/httpkernel.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:10:"HttpKernel";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:29:"Symfony2 HttpKernel Component";s:11:"description";s:29:"Symfony2 HttpKernel Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:47";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:190:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a1af1bc22f997eb0aaeb301a8d715989";s:4:"name";s:43:"Symfony/Component/HttpKernel/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"034988ec8522419fef54715968ff5640";s:4:"name";s:46:"Symfony/Component/HttpKernel/Bundle/Bundle.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eced991d4b8fe038cf5a39d571e03389";s:4:"name";s:55:"Symfony/Component/HttpKernel/Bundle/BundleInterface.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1ab9fcfe250122ae01956d7d1df16c01";s:4:"name";s:67:"Symfony/Component/HttpKernel/CacheClearer/CacheClearerInterface.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"940b15c92fa6ba0a1e508239610228a8";s:4:"name";s:63:"Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7435d5f981a3db589251151722cebbf0";s:4:"name";s:56:"Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"07e93162aecd5b6c4dffea675f2684b1";s:4:"name";s:65:"Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"75d231528a43ed388b3b742e68b6c43a";s:4:"name";s:65:"Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d0ccc4f26ea62bd6a3d1c528664b49b5";s:4:"name";s:62:"Symfony/Component/HttpKernel/CacheWarmer/WarmableInterface.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2d18e70a6cd04cddb49776f32632599a";s:4:"name";s:41:"Symfony/Component/HttpKernel/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d1bc00e92123f8295cb75492e39f9dc5";s:4:"name";s:39:"Symfony/Component/HttpKernel/Client.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"44dd55d48bc718e4380133c689a1cc18";s:4:"name";s:42:"Symfony/Component/HttpKernel/composer.json";s:4:"role";s:3:"doc";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8873220cb27f7c61053fc2feb76d138e";s:4:"name";s:51:"Symfony/Component/HttpKernel/Config/FileLocator.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a649fc31311b4b336290e86a7615eed0";s:4:"name";s:63:"Symfony/Component/HttpKernel/Controller/ControllerReference.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4df25d60d1eefb2844dcbaa250428ca8";s:4:"name";s:62:"Symfony/Component/HttpKernel/Controller/ControllerResolver.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"743a4faee533d426fe09db12e53501ab";s:4:"name";s:71:"Symfony/Component/HttpKernel/Controller/ControllerResolverInterface.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"25b16c005e61a48d621c219456d553bc";s:4:"name";s:71:"Symfony/Component/HttpKernel/Controller/TraceableControllerResolver.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e69af41765bee94a115225f3a5d25cf1";s:4:"name";s:66:"Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5dbe243c81e871e949be8298cadf4f4a";s:4:"name";s:60:"Symfony/Component/HttpKernel/DataCollector/DataCollector.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ffd4ec58caeabebaab60382110104899";s:4:"name";s:69:"Symfony/Component/HttpKernel/DataCollector/DataCollectorInterface.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"54add9b16cd4329326a940ce70255f7a";s:4:"name";s:65:"Symfony/Component/HttpKernel/DataCollector/EventDataCollector.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"206153be1698da0605d1dff2c04d6f7e";s:4:"name";s:69:"Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3cbcfac5aa0d0d92b5ffe9bfbdb4379d";s:4:"name";s:73:"Symfony/Component/HttpKernel/DataCollector/LateDataCollectorInterface.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7f91f64a97e2780be6d214434d1974aa";s:4:"name";s:66:"Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"39b08f06e47dbe55291666d79dfe77ea";s:4:"name";s:66:"Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6331bb9218f46832e73986ca4ad45a30";s:4:"name";s:67:"Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"27268087d500134868734ba6352b9c74";s:4:"name";s:66:"Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fce90930e38e9cd4641aacf2764ed6f4";s:4:"name";s:64:"Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7d66d96e42598dea22dad278b9ac3b2a";s:4:"name";s:65:"Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ab27b3a991a404a9f83ad33c137ddc64";s:4:"name";s:51:"Symfony/Component/HttpKernel/Debug/ErrorHandler.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"abd0e561ece8935db9925995726a9c3a";s:4:"name";s:55:"Symfony/Component/HttpKernel/Debug/ExceptionHandler.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"42886c591f797433ebfa6c4a75e0fb34";s:4:"name";s:63:"Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6def64fd265b897b89f8e82b229ac9f3";s:4:"name";s:74:"Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"177422f6ff3ceb6a638f8a7e5ec4f166";s:4:"name";s:74:"Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"12960ef346b18a127742a5cda62960ac";s:4:"name";s:77:"Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"da97a0908acb2f0576a735ee424f424d";s:4:"name";s:62:"Symfony/Component/HttpKernel/DependencyInjection/Extension.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aef8eb59f79f4881d9f63e831c3c8546";s:4:"name";s:84:"Symfony/Component/HttpKernel/DependencyInjection/MergeExtensionConfigurationPass.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2c9db8df37168a875bebf70976bc2bda";s:4:"name";s:74:"Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"947b8934d83f90492c51cfb3a4e8bf34";s:4:"name";s:60:"Symfony/Component/HttpKernel/Event/FilterControllerEvent.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c9c047b7ab1488a4eb857d71286c42eb";s:4:"name";s:58:"Symfony/Component/HttpKernel/Event/FilterResponseEvent.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aae774c8c1c640f429459d3800a02806";s:4:"name";s:57:"Symfony/Component/HttpKernel/Event/FinishRequestEvent.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63460a57e5067155dccae05cf237d193";s:4:"name";s:55:"Symfony/Component/HttpKernel/Event/GetResponseEvent.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9049ee5a681b82f0471a2a2f3b405a1e";s:4:"name";s:74:"Symfony/Component/HttpKernel/Event/GetResponseForControllerResultEvent.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86e1625ae2dbb2a4d98dff9d02365f00";s:4:"name";s:67:"Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f7a5741350e52e946bd15455c71bff2a";s:4:"name";s:50:"Symfony/Component/HttpKernel/Event/KernelEvent.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"010c1849bb93d622dcabdcdbfa4f04a3";s:4:"name";s:56:"Symfony/Component/HttpKernel/Event/PostResponseEvent.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"892d5e12db614472e9aaa1f8aec879ab";s:4:"name";s:67:"Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b9821a05b72584a3a374a93bee0f4314";s:4:"name";s:58:"Symfony/Component/HttpKernel/EventListener/EsiListener.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ec0b722acddc40bc24c04bcb735aefdc";s:4:"name";s:64:"Symfony/Component/HttpKernel/EventListener/ExceptionListener.php";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0f5e7d02ae8c0deb48e6da848e70c313";s:4:"name";s:63:"Symfony/Component/HttpKernel/EventListener/FragmentListener.php";s:4:"role";s:3:"php";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b300d4915a4478d77599e2cc5899f553";s:4:"name";s:61:"Symfony/Component/HttpKernel/EventListener/LocaleListener.php";s:4:"role";s:3:"php";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a80ed8fee6a904ffbebca1d9850182b8";s:4:"name";s:63:"Symfony/Component/HttpKernel/EventListener/ProfilerListener.php";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9f012c160c2b78e89e457aed4c054cf0";s:4:"name";s:63:"Symfony/Component/HttpKernel/EventListener/ResponseListener.php";s:4:"role";s:3:"php";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bcfe15dc4f5806b2a8516ef3509c38e3";s:4:"name";s:61:"Symfony/Component/HttpKernel/EventListener/RouterListener.php";s:4:"role";s:3:"php";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"04649898f8756be91b4907fd10654daf";s:4:"name";s:62:"Symfony/Component/HttpKernel/EventListener/SessionListener.php";s:4:"role";s:3:"php";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"57b574b30b287bfbe406beba0769749b";s:4:"name";s:71:"Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php";s:4:"role";s:3:"php";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c6a6e3f8b65f17d2dc889e4b2c99635b";s:4:"name";s:66:"Symfony/Component/HttpKernel/EventListener/TestSessionListener.php";s:4:"role";s:3:"php";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c73ec96922ce59adb33ca4bfefa8030c";s:4:"name";s:68:"Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php";s:4:"role";s:3:"php";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6cf7e6c73081980c26b6ecad6d0efc1b";s:4:"name";s:66:"Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php";s:4:"role";s:3:"php";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2d4d5a8229cf646d3b4b75d593f14d3b";s:4:"name";s:64:"Symfony/Component/HttpKernel/Exception/ConflictHttpException.php";s:4:"role";s:3:"php";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6b3122c7757ff734e12bec8a74c25a98";s:4:"name";s:62:"Symfony/Component/HttpKernel/Exception/FatalErrorException.php";s:4:"role";s:3:"php";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7a74b213d324d95f414b50650d893331";s:4:"name";s:59:"Symfony/Component/HttpKernel/Exception/FlattenException.php";s:4:"role";s:3:"php";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e8a597fe1f0d5b3525f9649f25ed78b9";s:4:"name";s:60:"Symfony/Component/HttpKernel/Exception/GoneHttpException.php";s:4:"role";s:3:"php";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dff8d6e0c64447e27bc68937a77dddd4";s:4:"name";s:56:"Symfony/Component/HttpKernel/Exception/HttpException.php";s:4:"role";s:3:"php";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5287f16f397ce02139bb29f4f915ba73";s:4:"name";s:65:"Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php";s:4:"role";s:3:"php";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c03fdcab809f96c2edf326ef5d329840";s:4:"name";s:70:"Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php";s:4:"role";s:3:"php";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"27a47db2975d463cc92750a50af7b692";s:4:"name";s:72:"Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.php";s:4:"role";s:3:"php";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ef3c26636669dab061813267c477ea3a";s:4:"name";s:69:"Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php";s:4:"role";s:3:"php";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e082b7408c1b8c6b4e89c909db565d24";s:4:"name";s:64:"Symfony/Component/HttpKernel/Exception/NotFoundHttpException.php";s:4:"role";s:3:"php";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"59bc8fe9c3f62fed6aa80c7004b175b1";s:4:"name";s:74:"Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php";s:4:"role";s:3:"php";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f389be4cfb101bc034f78207e8918de9";s:4:"name";s:76:"Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php";s:4:"role";s:3:"php";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e4519a15bbd32746e2cdb50690432dca";s:4:"name";s:74:"Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php";s:4:"role";s:3:"php";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a11ab40bfda34f0f200196711b7a1a5e";s:4:"name";s:71:"Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php";s:4:"role";s:3:"php";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2bc4556d5f4010d1b0d6eb59a6d99295";s:4:"name";s:68:"Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.php";s:4:"role";s:3:"php";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"54ea4537a407708dc6a1fa2b614e6092";s:4:"name";s:76:"Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php";s:4:"role";s:3:"php";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"90c57168f27173fdb9c128cc3dceec6c";s:4:"name";s:61:"Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php";s:4:"role";s:3:"php";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e7b606e96e7696fefaf0290bd134a364";s:4:"name";s:57:"Symfony/Component/HttpKernel/Fragment/FragmentHandler.php";s:4:"role";s:3:"php";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"92c2b17efc0ff03094dbe55603835cd7";s:4:"name";s:67:"Symfony/Component/HttpKernel/Fragment/FragmentRendererInterface.php";s:4:"role";s:3:"php";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eb63af63d6d386b8ce0b6faeda979a5c";s:4:"name";s:66:"Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php";s:4:"role";s:3:"php";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"71d698c9b1e16a25819450db6db7cb57";s:4:"name";s:64:"Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php";s:4:"role";s:3:"php";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fbce96e11756ed0deb106c0192e29a8a";s:4:"name";s:66:"Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php";s:4:"role";s:3:"php";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fa7788cbb3d094b334c129d4b12df2f1";s:4:"name";s:46:"Symfony/Component/HttpKernel/HttpCache/Esi.php";s:4:"role";s:3:"php";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"45e69313f1a53d5ebab91bf3c18d48ec";s:4:"name";s:67:"Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.php";s:4:"role";s:3:"php";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"091ed77cd920fc81d7cc3fa663a20be4";s:4:"name";s:76:"Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategyInterface.php";s:4:"role";s:3:"php";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c49bf34675051f7bed1f6444d720a412";s:4:"name";s:52:"Symfony/Component/HttpKernel/HttpCache/HttpCache.php";s:4:"role";s:3:"php";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a5f55c6da48996bf5e0cec62eb9dfa9b";s:4:"name";s:48:"Symfony/Component/HttpKernel/HttpCache/Store.php";s:4:"role";s:3:"php";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"23cb34a2a464e310a6cc4ad8053190b4";s:4:"name";s:57:"Symfony/Component/HttpKernel/HttpCache/StoreInterface.php";s:4:"role";s:3:"php";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"90b674ef382b3241a3533e5561c285e3";s:4:"name";s:43:"Symfony/Component/HttpKernel/HttpKernel.php";s:4:"role";s:3:"php";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a26257098916c1d939b7b0a04f44dfb8";s:4:"name";s:52:"Symfony/Component/HttpKernel/HttpKernelInterface.php";s:4:"role";s:3:"php";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba5fe007a2ac71d42ccc2c8d10cf5326";s:4:"name";s:39:"Symfony/Component/HttpKernel/Kernel.php";s:4:"role";s:3:"php";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"84732b3d13c1d962a9ca76189f5f5086";s:4:"name";s:45:"Symfony/Component/HttpKernel/KernelEvents.php";s:4:"role";s:3:"php";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b2547cd0399c7d610c3c31bf8fafc1c1";s:4:"name";s:48:"Symfony/Component/HttpKernel/KernelInterface.php";s:4:"role";s:3:"php";}}i:92;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/HttpKernel/LICENSE";s:4:"role";s:3:"doc";}}i:93;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"729e7e46e4dd1a18559aa41e58548e09";s:4:"name";s:57:"Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php";s:4:"role";s:3:"php";}}i:94;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a63e038a0c6c529619b2197afcf54e57";s:4:"name";s:52:"Symfony/Component/HttpKernel/Log/LoggerInterface.php";s:4:"role";s:3:"php";}}i:95;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fdaed4279e4932db9593cab3d9801f80";s:4:"name";s:47:"Symfony/Component/HttpKernel/Log/NullLogger.php";s:4:"role";s:3:"php";}}i:96;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"480db13c5bc7a6911c241df127572a69";s:4:"name";s:45:"Symfony/Component/HttpKernel/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:97;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f42eab7a5e7ec989509aefc70a57e76c";s:4:"name";s:69:"Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php";s:4:"role";s:3:"php";}}i:98;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a0a7571fcf3f33c4958016fef0ac6e1";s:4:"name";s:61:"Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php";s:4:"role";s:3:"php";}}i:99;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c6e448f617b7211c44095e8730c4a2bd";s:4:"name";s:66:"Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php";s:4:"role";s:3:"php";}}i:100;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"439c84953c390c2310af0b269b63c37b";s:4:"name";s:65:"Symfony/Component/HttpKernel/Profiler/MemcacheProfilerStorage.php";s:4:"role";s:3:"php";}}i:101;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c1743fb29d46daedfa747ed47b9494c1";s:4:"name";s:64:"Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php";s:4:"role";s:3:"php";}}i:102;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4d2027032d2e5c190aa65e54394db133";s:4:"name";s:62:"Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php";s:4:"role";s:3:"php";}}i:103;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d24566fd44b8a4b06c64127a5a03c2a";s:4:"name";s:60:"Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php";s:4:"role";s:3:"php";}}i:104;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"af734240bcbd3fc0ecfc377333f9bcd9";s:4:"name";s:49:"Symfony/Component/HttpKernel/Profiler/Profile.php";s:4:"role";s:3:"php";}}i:105;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3433ee1c2d23c78d68774f83c97eb578";s:4:"name";s:50:"Symfony/Component/HttpKernel/Profiler/Profiler.php";s:4:"role";s:3:"php";}}i:106;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"17d9e40eefdb2fad667dc74ebf858c85";s:4:"name";s:66:"Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php";s:4:"role";s:3:"php";}}i:107;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e10da26d143cc3a6336f7e97c7f4d535";s:4:"name";s:62:"Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php";s:4:"role";s:3:"php";}}i:108;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b69028b6ff27fff88714b26e65d6d6cf";s:4:"name";s:63:"Symfony/Component/HttpKernel/Profiler/SqliteProfilerStorage.php";s:4:"role";s:3:"php";}}i:109;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a88bdc6a3df6948b04db2f5d8c76c865";s:4:"name";s:38:"Symfony/Component/HttpKernel/README.md";s:4:"role";s:3:"doc";}}i:110;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63651d1c2efa91187e171c23fa108bcc";s:4:"name";s:52:"Symfony/Component/HttpKernel/TerminableInterface.php";s:4:"role";s:3:"php";}}i:111;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5db4015a25ec64975433954495425cb9";s:4:"name";s:56:"Symfony/Component/HttpKernel/Tests/Bundle/BundleTest.php";s:4:"role";s:4:"test";}}i:112;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"719d0acb32f69e30070481fc995d7c95";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/CacheClearer/ChainCacheClearerTest.php";s:4:"role";s:4:"test";}}i:113;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a670a188bc612138042a48ce08d0d86c";s:4:"name";s:75:"Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php";s:4:"role";s:4:"test";}}i:114;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aa85344cf1c9a4ea3472caad8fd270e1";s:4:"name";s:66:"Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerTest.php";s:4:"role";s:4:"test";}}i:115;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d8434d3e6d9ab70624691695c0463227";s:4:"name";s:49:"Symfony/Component/HttpKernel/Tests/ClientTest.php";s:4:"role";s:4:"test";}}i:116;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5e1515ccdd440d46fca79579beb81ea1";s:4:"name";s:61:"Symfony/Component/HttpKernel/Tests/Config/FileLocatorTest.php";s:4:"role";s:4:"test";}}i:117;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"537f569f63ee14058800342fc3e0a242";s:4:"name";s:72:"Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php";s:4:"role";s:4:"test";}}i:118;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"39a22588190c09f58431a38ce9ebd6bc";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/DataCollector/ConfigDataCollectorTest.php";s:4:"role";s:4:"test";}}i:119;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0cf6afafd5af55e00d3c5f9ba31d8917";s:4:"name";s:79:"Symfony/Component/HttpKernel/Tests/DataCollector/ExceptionDataCollectorTest.php";s:4:"role";s:4:"test";}}i:120;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"db74032e31e4161dc21aaf9443a4910f";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/DataCollector/LoggerDataCollectorTest.php";s:4:"role";s:4:"test";}}i:121;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"dd889c18076eab8becd1544e90472aae";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/DataCollector/MemoryDataCollectorTest.php";s:4:"role";s:4:"test";}}i:122;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cdab18131698b1915f326cbe376097c2";s:4:"name";s:77:"Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.php";s:4:"role";s:4:"test";}}i:123;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cad604b1dab9e0178b105ccee837ab52";s:4:"name";s:74:"Symfony/Component/HttpKernel/Tests/DataCollector/TimeDataCollectorTest.php";s:4:"role";s:4:"test";}}i:124;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"47bb53262ba95915cc2f7c2c905ccd04";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php";s:4:"role";s:4:"test";}}i:125;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"761aed0102e13403661542c40ff2441a";s:4:"name";s:87:"Symfony/Component/HttpKernel/Tests/DependencyInjection/ContainerAwareHttpKernelTest.php";s:4:"role";s:4:"test";}}i:126;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"92e4fbfef80def18781bd8a16000b2ec";s:4:"name";s:94:"Symfony/Component/HttpKernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php";s:4:"role";s:4:"test";}}i:127;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b8ec326aa5b3ad38b2aceb0f6f9f2b17";s:4:"name";s:84:"Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.php";s:4:"role";s:4:"test";}}i:128;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0af1d216963fc1ad9bf090060c450f69";s:4:"name";s:68:"Symfony/Component/HttpKernel/Tests/EventListener/EsiListenerTest.php";s:4:"role";s:4:"test";}}i:129;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3d35f03216a8c24fbec0d4690f6a4e9b";s:4:"name";s:74:"Symfony/Component/HttpKernel/Tests/EventListener/ExceptionListenerTest.php";s:4:"role";s:4:"test";}}i:130;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2b58c87811bcb1e4d1e01a66b57d4a28";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/EventListener/FragmentListenerTest.php";s:4:"role";s:4:"test";}}i:131;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4e1ca37427ffb634328d287bf5bb179b";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/EventListener/LocaleListenerTest.php";s:4:"role";s:4:"test";}}i:132;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0badf4d0b6a602b51de96b965d34b5a4";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/EventListener/ProfilerListenerTest.php";s:4:"role";s:4:"test";}}i:133;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"459a71cfa659bd53df29387cabad577b";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/EventListener/ResponseListenerTest.php";s:4:"role";s:4:"test";}}i:134;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"60d79091d972859015aeea894ceb632f";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/EventListener/RouterListenerTest.php";s:4:"role";s:4:"test";}}i:135;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c3c274823c0ae42288813e3881f5b2d9";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/EventListener/TestSessionListenerTest.php";s:4:"role";s:4:"test";}}i:136;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:72:"Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/foo.txt";s:4:"role";s:4:"test";}}i:137;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/hide.txt";s:4:"role";s:4:"test";}}i:138;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:65:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/bar.txt";s:4:"role";s:4:"test";}}i:139;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:65:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/foo.txt";s:4:"role";s:4:"test";}}i:140;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:75:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt";s:4:"role";s:4:"test";}}i:141;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:65:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle2Bundle/foo.txt";s:4:"role";s:4:"test";}}i:142;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9ab5af02cc19f043e6ab4c12f826be86";s:4:"name";s:66:"Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/classes.map";s:4:"role";s:4:"test";}}i:143;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0d04f0c8627b1c410d6d47246199fb55";s:4:"name";s:89:"Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/MockObjectTestProjectContainer.php";s:4:"role";s:4:"test";}}i:144;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/foo.txt";s:4:"role";s:4:"test";}}i:145;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:74:"Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/hide.txt";s:4:"role";s:4:"test";}}i:146;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"087e3dc7776e8d94ff7ae2852dc912bd";s:4:"name";s:91:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php";s:4:"role";s:4:"test";}}i:147;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"27015c77094432ed5a984416d760fd74";s:4:"name";s:114:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php";s:4:"role";s:4:"test";}}i:148;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a1e589e6fb85f086e2d31f4f37e62fe9";s:4:"name";s:91:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php";s:4:"role";s:4:"test";}}i:149;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6cbbfc883c6a2ff486474f87476f0563";s:4:"name";s:89:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php";s:4:"role";s:4:"test";}}i:150;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"54610c5e45d73507ef3b70c59a6140c2";s:4:"name";s:89:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php";s:4:"role";s:4:"test";}}i:151;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"580c52df0c49dbe51b8953eafa44adff";s:4:"name";s:116:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php";s:4:"role";s:4:"test";}}i:152;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e2b6b77bad66ea379f550eeaa0c99476";s:4:"name";s:93:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php";s:4:"role";s:4:"test";}}i:153;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f5505afbf35dae7260891f4a9fd1cfd4";s:4:"name";s:60:"Symfony/Component/HttpKernel/Tests/Fixtures/FooBarBundle.php";s:4:"role";s:4:"test";}}i:154;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"468ec4e8ecf949b24336c3e2557bc7bf";s:4:"name";s:69:"Symfony/Component/HttpKernel/Tests/Fixtures/KernelForOverrideName.php";s:4:"role";s:4:"test";}}i:155;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c9615a710a6e8dfdb0dd2daaa77b8377";s:4:"name";s:61:"Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php";s:4:"role";s:4:"test";}}i:156;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/BaseBundle/hide.txt";s:4:"role";s:4:"test";}}i:157;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:75:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt";s:4:"role";s:4:"test";}}i:158;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/ChildBundle/foo.txt";s:4:"role";s:4:"test";}}i:159;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/FooBundle/foo.txt";s:4:"role";s:4:"test";}}i:160;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"caac83e9f7141808a279c9415b3d631d";s:4:"name";s:58:"Symfony/Component/HttpKernel/Tests/Fixtures/TestClient.php";s:4:"role";s:4:"test";}}i:161;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cf1be212b7c33954b81cbb5f17f90901";s:4:"name";s:67:"Symfony/Component/HttpKernel/Tests/Fixtures/TestEventDispatcher.php";s:4:"role";s:4:"test";}}i:162;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bc9d6216414586747e3857fcc1884c33";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php";s:4:"role";s:4:"test";}}i:163;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fa6ac6afb43b8f9f17bac5f34b8079b1";s:4:"name";s:67:"Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.php";s:4:"role";s:4:"test";}}i:164;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d42e11990c445631c29d351e1050bc12";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php";s:4:"role";s:4:"test";}}i:165;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0914364078b13a058fc4ad858a9a97a2";s:4:"name";s:74:"Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php";s:4:"role";s:4:"test";}}i:166;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"99d3a3885bcaaeaa9d7daa7628d16b6b";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php";s:4:"role";s:4:"test";}}i:167;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0839be428bd44e163cd68390f4ef49da";s:4:"name";s:56:"Symfony/Component/HttpKernel/Tests/HttpCache/EsiTest.php";s:4:"role";s:4:"test";}}i:168;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"58d82c49cec84700cfeac27313345271";s:4:"name";s:62:"Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php";s:4:"role";s:4:"test";}}i:169;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b03bb6f91a5309a1e83e6b892a9759cc";s:4:"name";s:66:"Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php";s:4:"role";s:4:"test";}}i:170;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"070e9eeb7eff1f89e79917937aa7b692";s:4:"name";s:58:"Symfony/Component/HttpKernel/Tests/HttpCache/StoreTest.php";s:4:"role";s:4:"test";}}i:171;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9968d637c2ee0189e7983c285f1cb353";s:4:"name";s:63:"Symfony/Component/HttpKernel/Tests/HttpCache/TestHttpKernel.php";s:4:"role";s:4:"test";}}i:172;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f8033c30b37e92bfbc3c61885dc4f6d2";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/HttpCache/TestMultipleHttpKernel.php";s:4:"role";s:4:"test";}}i:173;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cc31bf84e75276fcc9efa9f5f0c45302";s:4:"name";s:53:"Symfony/Component/HttpKernel/Tests/HttpKernelTest.php";s:4:"role";s:4:"test";}}i:174;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"985b62eefe124bbd995e6c9da0b46dbf";s:4:"name";s:49:"Symfony/Component/HttpKernel/Tests/KernelTest.php";s:4:"role";s:4:"test";}}i:175;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f544395e09366b61d2e01f49c15066ff";s:4:"name";s:45:"Symfony/Component/HttpKernel/Tests/Logger.php";s:4:"role";s:4:"test";}}i:176;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3d025b1cac5e80626a19849b06a41e91";s:4:"name";s:75:"Symfony/Component/HttpKernel/Tests/Profiler/AbstractProfilerStorageTest.php";s:4:"role";s:4:"test";}}i:177;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"12f40567e2687864d629e2437915b127";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/Profiler/FileProfilerStorageTest.php";s:4:"role";s:4:"test";}}i:178;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f88559896ea0d7bea467da273976fcc3";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/Profiler/MemcachedProfilerStorageTest.php";s:4:"role";s:4:"test";}}i:179;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"285f9b91923d397ff0704c465eb76378";s:4:"name";s:75:"Symfony/Component/HttpKernel/Tests/Profiler/MemcacheProfilerStorageTest.php";s:4:"role";s:4:"test";}}i:180;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a9448076fbd5c7d42bb595bf6626226b";s:4:"name";s:66:"Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.php";s:4:"role";s:4:"test";}}i:181;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aaee125b4e1132032c58f5ca4c03bb40";s:4:"name";s:65:"Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.php";s:4:"role";s:4:"test";}}i:182;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"796c2e18d225e482facc9de766f8bba7";s:4:"name";s:62:"Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php";s:4:"role";s:4:"test";}}i:183;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ed9ba23032795739acc33ba5d1970557";s:4:"name";s:74:"Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php";s:4:"role";s:4:"test";}}i:184;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9a65333f51c36b0b6a837f1105c2d022";s:4:"name";s:60:"Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.php";s:4:"role";s:4:"test";}}i:185;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e84fca3c3f76faa48cf1b760ab1fc079";s:4:"name";s:72:"Symfony/Component/HttpKernel/Tests/Profiler/RedisProfilerStorageTest.php";s:4:"role";s:4:"test";}}i:186;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fad36380de80995905e7a2046f3d01b0";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Profiler/SqliteProfilerStorageTest.php";s:4:"role";s:4:"test";}}i:187;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b8daaba0cf9db86b60c25116c7ab8a4";s:4:"name";s:53:"Symfony/Component/HttpKernel/Tests/TestHttpKernel.php";s:4:"role";s:4:"test";}}i:188;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bf06babf2bdca6d62c7960c8a9e53e68";s:4:"name";s:52:"Symfony/Component/HttpKernel/Tests/UriSignerTest.php";s:4:"role";s:4:"test";}}i:189;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9daa3c983b391a8dae8e4e7b34f26e07";s:4:"name";s:42:"Symfony/Component/HttpKernel/UriSigner.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:2:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}s:7:"package";a:2:{i:0;a:2:{s:4:"name";s:14:"HttpFoundation";s:7:"channel";s:16:"pear.symfony.com";}i:1;a:2:{s:4:"name";s:15:"EventDispatcher";s:7:"channel";s:16:"pear.symfony.com";}}}s:8:"optional";a:1:{s:7:"package";a:6:{i:0;a:2:{s:4:"name";s:6:"Config";s:7:"channel";s:16:"pear.symfony.com";}i:1;a:2:{s:4:"name";s:19:"DependencyInjection";s:7:"channel";s:16:"pear.symfony.com";}i:2;a:2:{s:4:"name";s:11:"ClassLoader";s:7:"channel";s:16:"pear.symfony.com";}i:3;a:2:{s:4:"name";s:10:"BrowserKit";s:7:"channel";s:16:"pear.symfony.com";}i:4;a:2:{s:4:"name";s:7:"Console";s:7:"channel";s:16:"pear.symfony.com";}i:5;a:2:{s:4:"name";s:6:"Finder";s:7:"channel";s:16:"pear.symfony.com";}}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:190:{s:43:"Symfony/Component/HttpKernel/autoloader.php";a:4:{s:6:"md5sum";s:32:"a1af1bc22f997eb0aaeb301a8d715989";s:4:"name";s:43:"Symfony/Component/HttpKernel/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/autoloader.php";}s:46:"Symfony/Component/HttpKernel/Bundle/Bundle.php";a:4:{s:6:"md5sum";s:32:"034988ec8522419fef54715968ff5640";s:4:"name";s:46:"Symfony/Component/HttpKernel/Bundle/Bundle.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Bundle/Bundle.php";}s:55:"Symfony/Component/HttpKernel/Bundle/BundleInterface.php";a:4:{s:6:"md5sum";s:32:"eced991d4b8fe038cf5a39d571e03389";s:4:"name";s:55:"Symfony/Component/HttpKernel/Bundle/BundleInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Bundle/BundleInterface.php";}s:67:"Symfony/Component/HttpKernel/CacheClearer/CacheClearerInterface.php";a:4:{s:6:"md5sum";s:32:"1ab9fcfe250122ae01956d7d1df16c01";s:4:"name";s:67:"Symfony/Component/HttpKernel/CacheClearer/CacheClearerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/CacheClearer/CacheClearerInterface.php";}s:63:"Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php";a:4:{s:6:"md5sum";s:32:"940b15c92fa6ba0a1e508239610228a8";s:4:"name";s:63:"Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php";}s:56:"Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.php";a:4:{s:6:"md5sum";s:32:"7435d5f981a3db589251151722cebbf0";s:4:"name";s:56:"Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.php";}s:65:"Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php";a:4:{s:6:"md5sum";s:32:"07e93162aecd5b6c4dffea675f2684b1";s:4:"name";s:65:"Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php";}s:65:"Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php";a:4:{s:6:"md5sum";s:32:"75d231528a43ed388b3b742e68b6c43a";s:4:"name";s:65:"Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php";}s:62:"Symfony/Component/HttpKernel/CacheWarmer/WarmableInterface.php";a:4:{s:6:"md5sum";s:32:"d0ccc4f26ea62bd6a3d1c528664b49b5";s:4:"name";s:62:"Symfony/Component/HttpKernel/CacheWarmer/WarmableInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/CacheWarmer/WarmableInterface.php";}s:41:"Symfony/Component/HttpKernel/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"2d18e70a6cd04cddb49776f32632599a";s:4:"name";s:41:"Symfony/Component/HttpKernel/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/doc/pear/HttpKernel/Symfony/Component/HttpKernel/CHANGELOG.md";}s:39:"Symfony/Component/HttpKernel/Client.php";a:4:{s:6:"md5sum";s:32:"d1bc00e92123f8295cb75492e39f9dc5";s:4:"name";s:39:"Symfony/Component/HttpKernel/Client.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Client.php";}s:42:"Symfony/Component/HttpKernel/composer.json";a:4:{s:6:"md5sum";s:32:"44dd55d48bc718e4380133c689a1cc18";s:4:"name";s:42:"Symfony/Component/HttpKernel/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/HttpKernel/Symfony/Component/HttpKernel/composer.json";}s:51:"Symfony/Component/HttpKernel/Config/FileLocator.php";a:4:{s:6:"md5sum";s:32:"8873220cb27f7c61053fc2feb76d138e";s:4:"name";s:51:"Symfony/Component/HttpKernel/Config/FileLocator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Config/FileLocator.php";}s:63:"Symfony/Component/HttpKernel/Controller/ControllerReference.php";a:4:{s:6:"md5sum";s:32:"a649fc31311b4b336290e86a7615eed0";s:4:"name";s:63:"Symfony/Component/HttpKernel/Controller/ControllerReference.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Controller/ControllerReference.php";}s:62:"Symfony/Component/HttpKernel/Controller/ControllerResolver.php";a:4:{s:6:"md5sum";s:32:"4df25d60d1eefb2844dcbaa250428ca8";s:4:"name";s:62:"Symfony/Component/HttpKernel/Controller/ControllerResolver.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Controller/ControllerResolver.php";}s:71:"Symfony/Component/HttpKernel/Controller/ControllerResolverInterface.php";a:4:{s:6:"md5sum";s:32:"743a4faee533d426fe09db12e53501ab";s:4:"name";s:71:"Symfony/Component/HttpKernel/Controller/ControllerResolverInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Controller/ControllerResolverInterface.php";}s:71:"Symfony/Component/HttpKernel/Controller/TraceableControllerResolver.php";a:4:{s:6:"md5sum";s:32:"25b16c005e61a48d621c219456d553bc";s:4:"name";s:71:"Symfony/Component/HttpKernel/Controller/TraceableControllerResolver.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Controller/TraceableControllerResolver.php";}s:66:"Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php";a:4:{s:6:"md5sum";s:32:"e69af41765bee94a115225f3a5d25cf1";s:4:"name";s:66:"Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php";}s:60:"Symfony/Component/HttpKernel/DataCollector/DataCollector.php";a:4:{s:6:"md5sum";s:32:"5dbe243c81e871e949be8298cadf4f4a";s:4:"name";s:60:"Symfony/Component/HttpKernel/DataCollector/DataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/DataCollector.php";}s:69:"Symfony/Component/HttpKernel/DataCollector/DataCollectorInterface.php";a:4:{s:6:"md5sum";s:32:"ffd4ec58caeabebaab60382110104899";s:4:"name";s:69:"Symfony/Component/HttpKernel/DataCollector/DataCollectorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/DataCollectorInterface.php";}s:65:"Symfony/Component/HttpKernel/DataCollector/EventDataCollector.php";a:4:{s:6:"md5sum";s:32:"54add9b16cd4329326a940ce70255f7a";s:4:"name";s:65:"Symfony/Component/HttpKernel/DataCollector/EventDataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/EventDataCollector.php";}s:69:"Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php";a:4:{s:6:"md5sum";s:32:"206153be1698da0605d1dff2c04d6f7e";s:4:"name";s:69:"Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php";}s:73:"Symfony/Component/HttpKernel/DataCollector/LateDataCollectorInterface.php";a:4:{s:6:"md5sum";s:32:"3cbcfac5aa0d0d92b5ffe9bfbdb4379d";s:4:"name";s:73:"Symfony/Component/HttpKernel/DataCollector/LateDataCollectorInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/LateDataCollectorInterface.php";}s:66:"Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php";a:4:{s:6:"md5sum";s:32:"7f91f64a97e2780be6d214434d1974aa";s:4:"name";s:66:"Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php";}s:66:"Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php";a:4:{s:6:"md5sum";s:32:"39b08f06e47dbe55291666d79dfe77ea";s:4:"name";s:66:"Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php";}s:67:"Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php";a:4:{s:6:"md5sum";s:32:"6331bb9218f46832e73986ca4ad45a30";s:4:"name";s:67:"Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php";}s:66:"Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php";a:4:{s:6:"md5sum";s:32:"27268087d500134868734ba6352b9c74";s:4:"name";s:66:"Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php";}s:64:"Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php";a:4:{s:6:"md5sum";s:32:"fce90930e38e9cd4641aacf2764ed6f4";s:4:"name";s:64:"Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php";}s:65:"Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php";a:4:{s:6:"md5sum";s:32:"7d66d96e42598dea22dad278b9ac3b2a";s:4:"name";s:65:"Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php";}s:51:"Symfony/Component/HttpKernel/Debug/ErrorHandler.php";a:4:{s:6:"md5sum";s:32:"ab27b3a991a404a9f83ad33c137ddc64";s:4:"name";s:51:"Symfony/Component/HttpKernel/Debug/ErrorHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Debug/ErrorHandler.php";}s:55:"Symfony/Component/HttpKernel/Debug/ExceptionHandler.php";a:4:{s:6:"md5sum";s:32:"abd0e561ece8935db9925995726a9c3a";s:4:"name";s:55:"Symfony/Component/HttpKernel/Debug/ExceptionHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Debug/ExceptionHandler.php";}s:63:"Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php";a:4:{s:6:"md5sum";s:32:"42886c591f797433ebfa6c4a75e0fb34";s:4:"name";s:63:"Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php";}s:74:"Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php";a:4:{s:6:"md5sum";s:32:"6def64fd265b897b89f8e82b229ac9f3";s:4:"name";s:74:"Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php";}s:74:"Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php";a:4:{s:6:"md5sum";s:32:"177422f6ff3ceb6a638f8a7e5ec4f166";s:4:"name";s:74:"Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php";}s:77:"Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel.php";a:4:{s:6:"md5sum";s:32:"12960ef346b18a127742a5cda62960ac";s:4:"name";s:77:"Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel.php";s:4:"role";s:3:"php";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel.php";}s:62:"Symfony/Component/HttpKernel/DependencyInjection/Extension.php";a:4:{s:6:"md5sum";s:32:"da97a0908acb2f0576a735ee424f424d";s:4:"name";s:62:"Symfony/Component/HttpKernel/DependencyInjection/Extension.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DependencyInjection/Extension.php";}s:84:"Symfony/Component/HttpKernel/DependencyInjection/MergeExtensionConfigurationPass.php";a:4:{s:6:"md5sum";s:32:"aef8eb59f79f4881d9f63e831c3c8546";s:4:"name";s:84:"Symfony/Component/HttpKernel/DependencyInjection/MergeExtensionConfigurationPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DependencyInjection/MergeExtensionConfigurationPass.php";}s:74:"Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php";a:4:{s:6:"md5sum";s:32:"2c9db8df37168a875bebf70976bc2bda";s:4:"name";s:74:"Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php";}s:60:"Symfony/Component/HttpKernel/Event/FilterControllerEvent.php";a:4:{s:6:"md5sum";s:32:"947b8934d83f90492c51cfb3a4e8bf34";s:4:"name";s:60:"Symfony/Component/HttpKernel/Event/FilterControllerEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Event/FilterControllerEvent.php";}s:58:"Symfony/Component/HttpKernel/Event/FilterResponseEvent.php";a:4:{s:6:"md5sum";s:32:"c9c047b7ab1488a4eb857d71286c42eb";s:4:"name";s:58:"Symfony/Component/HttpKernel/Event/FilterResponseEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Event/FilterResponseEvent.php";}s:57:"Symfony/Component/HttpKernel/Event/FinishRequestEvent.php";a:4:{s:6:"md5sum";s:32:"aae774c8c1c640f429459d3800a02806";s:4:"name";s:57:"Symfony/Component/HttpKernel/Event/FinishRequestEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Event/FinishRequestEvent.php";}s:55:"Symfony/Component/HttpKernel/Event/GetResponseEvent.php";a:4:{s:6:"md5sum";s:32:"63460a57e5067155dccae05cf237d193";s:4:"name";s:55:"Symfony/Component/HttpKernel/Event/GetResponseEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Event/GetResponseEvent.php";}s:74:"Symfony/Component/HttpKernel/Event/GetResponseForControllerResultEvent.php";a:4:{s:6:"md5sum";s:32:"9049ee5a681b82f0471a2a2f3b405a1e";s:4:"name";s:74:"Symfony/Component/HttpKernel/Event/GetResponseForControllerResultEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Event/GetResponseForControllerResultEvent.php";}s:67:"Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.php";a:4:{s:6:"md5sum";s:32:"86e1625ae2dbb2a4d98dff9d02365f00";s:4:"name";s:67:"Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.php";}s:50:"Symfony/Component/HttpKernel/Event/KernelEvent.php";a:4:{s:6:"md5sum";s:32:"f7a5741350e52e946bd15455c71bff2a";s:4:"name";s:50:"Symfony/Component/HttpKernel/Event/KernelEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Event/KernelEvent.php";}s:56:"Symfony/Component/HttpKernel/Event/PostResponseEvent.php";a:4:{s:6:"md5sum";s:32:"010c1849bb93d622dcabdcdbfa4f04a3";s:4:"name";s:56:"Symfony/Component/HttpKernel/Event/PostResponseEvent.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Event/PostResponseEvent.php";}s:67:"Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php";a:4:{s:6:"md5sum";s:32:"892d5e12db614472e9aaa1f8aec879ab";s:4:"name";s:67:"Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php";}s:58:"Symfony/Component/HttpKernel/EventListener/EsiListener.php";a:4:{s:6:"md5sum";s:32:"b9821a05b72584a3a374a93bee0f4314";s:4:"name";s:58:"Symfony/Component/HttpKernel/EventListener/EsiListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/EsiListener.php";}s:64:"Symfony/Component/HttpKernel/EventListener/ExceptionListener.php";a:4:{s:6:"md5sum";s:32:"ec0b722acddc40bc24c04bcb735aefdc";s:4:"name";s:64:"Symfony/Component/HttpKernel/EventListener/ExceptionListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php";}s:63:"Symfony/Component/HttpKernel/EventListener/FragmentListener.php";a:4:{s:6:"md5sum";s:32:"0f5e7d02ae8c0deb48e6da848e70c313";s:4:"name";s:63:"Symfony/Component/HttpKernel/EventListener/FragmentListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/FragmentListener.php";}s:61:"Symfony/Component/HttpKernel/EventListener/LocaleListener.php";a:4:{s:6:"md5sum";s:32:"b300d4915a4478d77599e2cc5899f553";s:4:"name";s:61:"Symfony/Component/HttpKernel/EventListener/LocaleListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/LocaleListener.php";}s:63:"Symfony/Component/HttpKernel/EventListener/ProfilerListener.php";a:4:{s:6:"md5sum";s:32:"a80ed8fee6a904ffbebca1d9850182b8";s:4:"name";s:63:"Symfony/Component/HttpKernel/EventListener/ProfilerListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/ProfilerListener.php";}s:63:"Symfony/Component/HttpKernel/EventListener/ResponseListener.php";a:4:{s:6:"md5sum";s:32:"9f012c160c2b78e89e457aed4c054cf0";s:4:"name";s:63:"Symfony/Component/HttpKernel/EventListener/ResponseListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/ResponseListener.php";}s:61:"Symfony/Component/HttpKernel/EventListener/RouterListener.php";a:4:{s:6:"md5sum";s:32:"bcfe15dc4f5806b2a8516ef3509c38e3";s:4:"name";s:61:"Symfony/Component/HttpKernel/EventListener/RouterListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/RouterListener.php";}s:62:"Symfony/Component/HttpKernel/EventListener/SessionListener.php";a:4:{s:6:"md5sum";s:32:"04649898f8756be91b4907fd10654daf";s:4:"name";s:62:"Symfony/Component/HttpKernel/EventListener/SessionListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/SessionListener.php";}s:71:"Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php";a:4:{s:6:"md5sum";s:32:"57b574b30b287bfbe406beba0769749b";s:4:"name";s:71:"Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php";}s:66:"Symfony/Component/HttpKernel/EventListener/TestSessionListener.php";a:4:{s:6:"md5sum";s:32:"c6a6e3f8b65f17d2dc889e4b2c99635b";s:4:"name";s:66:"Symfony/Component/HttpKernel/EventListener/TestSessionListener.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener/TestSessionListener.php";}s:68:"Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php";a:4:{s:6:"md5sum";s:32:"c73ec96922ce59adb33ca4bfefa8030c";s:4:"name";s:68:"Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php";}s:66:"Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php";a:4:{s:6:"md5sum";s:32:"6cf7e6c73081980c26b6ecad6d0efc1b";s:4:"name";s:66:"Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php";}s:64:"Symfony/Component/HttpKernel/Exception/ConflictHttpException.php";a:4:{s:6:"md5sum";s:32:"2d4d5a8229cf646d3b4b75d593f14d3b";s:4:"name";s:64:"Symfony/Component/HttpKernel/Exception/ConflictHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/ConflictHttpException.php";}s:62:"Symfony/Component/HttpKernel/Exception/FatalErrorException.php";a:4:{s:6:"md5sum";s:32:"6b3122c7757ff734e12bec8a74c25a98";s:4:"name";s:62:"Symfony/Component/HttpKernel/Exception/FatalErrorException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/FatalErrorException.php";}s:59:"Symfony/Component/HttpKernel/Exception/FlattenException.php";a:4:{s:6:"md5sum";s:32:"7a74b213d324d95f414b50650d893331";s:4:"name";s:59:"Symfony/Component/HttpKernel/Exception/FlattenException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/FlattenException.php";}s:60:"Symfony/Component/HttpKernel/Exception/GoneHttpException.php";a:4:{s:6:"md5sum";s:32:"e8a597fe1f0d5b3525f9649f25ed78b9";s:4:"name";s:60:"Symfony/Component/HttpKernel/Exception/GoneHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/GoneHttpException.php";}s:56:"Symfony/Component/HttpKernel/Exception/HttpException.php";a:4:{s:6:"md5sum";s:32:"dff8d6e0c64447e27bc68937a77dddd4";s:4:"name";s:56:"Symfony/Component/HttpKernel/Exception/HttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/HttpException.php";}s:65:"Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"5287f16f397ce02139bb29f4f915ba73";s:4:"name";s:65:"Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php";}s:70:"Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php";a:4:{s:6:"md5sum";s:32:"c03fdcab809f96c2edf326ef5d329840";s:4:"name";s:70:"Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:100:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php";}s:72:"Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.php";a:4:{s:6:"md5sum";s:32:"27a47db2975d463cc92750a50af7b692";s:4:"name";s:72:"Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.php";}s:69:"Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php";a:4:{s:6:"md5sum";s:32:"ef3c26636669dab061813267c477ea3a";s:4:"name";s:69:"Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php";}s:64:"Symfony/Component/HttpKernel/Exception/NotFoundHttpException.php";a:4:{s:6:"md5sum";s:32:"e082b7408c1b8c6b4e89c909db565d24";s:4:"name";s:64:"Symfony/Component/HttpKernel/Exception/NotFoundHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/NotFoundHttpException.php";}s:74:"Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php";a:4:{s:6:"md5sum";s:32:"59bc8fe9c3f62fed6aa80c7004b175b1";s:4:"name";s:74:"Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php";}s:76:"Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php";a:4:{s:6:"md5sum";s:32:"f389be4cfb101bc034f78207e8918de9";s:4:"name";s:76:"Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php";}s:74:"Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php";a:4:{s:6:"md5sum";s:32:"e4519a15bbd32746e2cdb50690432dca";s:4:"name";s:74:"Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php";}s:71:"Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php";a:4:{s:6:"md5sum";s:32:"a11ab40bfda34f0f200196711b7a1a5e";s:4:"name";s:71:"Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:101:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php";}s:68:"Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.php";a:4:{s:6:"md5sum";s:32:"2bc4556d5f4010d1b0d6eb59a6d99295";s:4:"name";s:68:"Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.php";}s:76:"Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php";a:4:{s:6:"md5sum";s:32:"54ea4537a407708dc6a1fa2b614e6092";s:4:"name";s:76:"Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php";}s:61:"Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php";a:4:{s:6:"md5sum";s:32:"90c57168f27173fdb9c128cc3dceec6c";s:4:"name";s:61:"Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php";}s:57:"Symfony/Component/HttpKernel/Fragment/FragmentHandler.php";a:4:{s:6:"md5sum";s:32:"e7b606e96e7696fefaf0290bd134a364";s:4:"name";s:57:"Symfony/Component/HttpKernel/Fragment/FragmentHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php";}s:67:"Symfony/Component/HttpKernel/Fragment/FragmentRendererInterface.php";a:4:{s:6:"md5sum";s:32:"92c2b17efc0ff03094dbe55603835cd7";s:4:"name";s:67:"Symfony/Component/HttpKernel/Fragment/FragmentRendererInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Fragment/FragmentRendererInterface.php";}s:66:"Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php";a:4:{s:6:"md5sum";s:32:"eb63af63d6d386b8ce0b6faeda979a5c";s:4:"name";s:66:"Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php";}s:64:"Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php";a:4:{s:6:"md5sum";s:32:"71d698c9b1e16a25819450db6db7cb57";s:4:"name";s:64:"Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php";}s:66:"Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php";a:4:{s:6:"md5sum";s:32:"fbce96e11756ed0deb106c0192e29a8a";s:4:"name";s:66:"Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php";}s:46:"Symfony/Component/HttpKernel/HttpCache/Esi.php";a:4:{s:6:"md5sum";s:32:"fa7788cbb3d094b334c129d4b12df2f1";s:4:"name";s:46:"Symfony/Component/HttpKernel/HttpCache/Esi.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/HttpCache/Esi.php";}s:67:"Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.php";a:4:{s:6:"md5sum";s:32:"45e69313f1a53d5ebab91bf3c18d48ec";s:4:"name";s:67:"Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.php";s:4:"role";s:3:"php";s:12:"installed_as";s:97:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.php";}s:76:"Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategyInterface.php";a:4:{s:6:"md5sum";s:32:"091ed77cd920fc81d7cc3fa663a20be4";s:4:"name";s:76:"Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategyInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategyInterface.php";}s:52:"Symfony/Component/HttpKernel/HttpCache/HttpCache.php";a:4:{s:6:"md5sum";s:32:"c49bf34675051f7bed1f6444d720a412";s:4:"name";s:52:"Symfony/Component/HttpKernel/HttpCache/HttpCache.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/HttpCache/HttpCache.php";}s:48:"Symfony/Component/HttpKernel/HttpCache/Store.php";a:4:{s:6:"md5sum";s:32:"a5f55c6da48996bf5e0cec62eb9dfa9b";s:4:"name";s:48:"Symfony/Component/HttpKernel/HttpCache/Store.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/HttpCache/Store.php";}s:57:"Symfony/Component/HttpKernel/HttpCache/StoreInterface.php";a:4:{s:6:"md5sum";s:32:"23cb34a2a464e310a6cc4ad8053190b4";s:4:"name";s:57:"Symfony/Component/HttpKernel/HttpCache/StoreInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/HttpCache/StoreInterface.php";}s:43:"Symfony/Component/HttpKernel/HttpKernel.php";a:4:{s:6:"md5sum";s:32:"90b674ef382b3241a3533e5561c285e3";s:4:"name";s:43:"Symfony/Component/HttpKernel/HttpKernel.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/HttpKernel.php";}s:52:"Symfony/Component/HttpKernel/HttpKernelInterface.php";a:4:{s:6:"md5sum";s:32:"a26257098916c1d939b7b0a04f44dfb8";s:4:"name";s:52:"Symfony/Component/HttpKernel/HttpKernelInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/HttpKernelInterface.php";}s:39:"Symfony/Component/HttpKernel/Kernel.php";a:4:{s:6:"md5sum";s:32:"ba5fe007a2ac71d42ccc2c8d10cf5326";s:4:"name";s:39:"Symfony/Component/HttpKernel/Kernel.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Kernel.php";}s:45:"Symfony/Component/HttpKernel/KernelEvents.php";a:4:{s:6:"md5sum";s:32:"84732b3d13c1d962a9ca76189f5f5086";s:4:"name";s:45:"Symfony/Component/HttpKernel/KernelEvents.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/KernelEvents.php";}s:48:"Symfony/Component/HttpKernel/KernelInterface.php";a:4:{s:6:"md5sum";s:32:"b2547cd0399c7d610c3c31bf8fafc1c1";s:4:"name";s:48:"Symfony/Component/HttpKernel/KernelInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/KernelInterface.php";}s:36:"Symfony/Component/HttpKernel/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/HttpKernel/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/HttpKernel/Symfony/Component/HttpKernel/LICENSE";}s:57:"Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php";a:4:{s:6:"md5sum";s:32:"729e7e46e4dd1a18559aa41e58548e09";s:4:"name";s:57:"Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php";}s:52:"Symfony/Component/HttpKernel/Log/LoggerInterface.php";a:4:{s:6:"md5sum";s:32:"a63e038a0c6c529619b2197afcf54e57";s:4:"name";s:52:"Symfony/Component/HttpKernel/Log/LoggerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Log/LoggerInterface.php";}s:47:"Symfony/Component/HttpKernel/Log/NullLogger.php";a:4:{s:6:"md5sum";s:32:"fdaed4279e4932db9593cab3d9801f80";s:4:"name";s:47:"Symfony/Component/HttpKernel/Log/NullLogger.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Log/NullLogger.php";}s:45:"Symfony/Component/HttpKernel/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"480db13c5bc7a6911c241df127572a69";s:4:"name";s:45:"Symfony/Component/HttpKernel/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/phpunit.xml.dist";}s:69:"Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php";a:4:{s:6:"md5sum";s:32:"f42eab7a5e7ec989509aefc70a57e76c";s:4:"name";s:69:"Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php";}s:61:"Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php";a:4:{s:6:"md5sum";s:32:"3a0a7571fcf3f33c4958016fef0ac6e1";s:4:"name";s:61:"Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php";}s:66:"Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php";a:4:{s:6:"md5sum";s:32:"c6e448f617b7211c44095e8730c4a2bd";s:4:"name";s:66:"Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php";}s:65:"Symfony/Component/HttpKernel/Profiler/MemcacheProfilerStorage.php";a:4:{s:6:"md5sum";s:32:"439c84953c390c2310af0b269b63c37b";s:4:"name";s:65:"Symfony/Component/HttpKernel/Profiler/MemcacheProfilerStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/MemcacheProfilerStorage.php";}s:64:"Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php";a:4:{s:6:"md5sum";s:32:"c1743fb29d46daedfa747ed47b9494c1";s:4:"name";s:64:"Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php";}s:62:"Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php";a:4:{s:6:"md5sum";s:32:"4d2027032d2e5c190aa65e54394db133";s:4:"name";s:62:"Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php";}s:60:"Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php";a:4:{s:6:"md5sum";s:32:"8d24566fd44b8a4b06c64127a5a03c2a";s:4:"name";s:60:"Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php";}s:49:"Symfony/Component/HttpKernel/Profiler/Profile.php";a:4:{s:6:"md5sum";s:32:"af734240bcbd3fc0ecfc377333f9bcd9";s:4:"name";s:49:"Symfony/Component/HttpKernel/Profiler/Profile.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/Profile.php";}s:50:"Symfony/Component/HttpKernel/Profiler/Profiler.php";a:4:{s:6:"md5sum";s:32:"3433ee1c2d23c78d68774f83c97eb578";s:4:"name";s:50:"Symfony/Component/HttpKernel/Profiler/Profiler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/Profiler.php";}s:66:"Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php";a:4:{s:6:"md5sum";s:32:"17d9e40eefdb2fad667dc74ebf858c85";s:4:"name";s:66:"Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php";}s:62:"Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php";a:4:{s:6:"md5sum";s:32:"e10da26d143cc3a6336f7e97c7f4d535";s:4:"name";s:62:"Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php";}s:63:"Symfony/Component/HttpKernel/Profiler/SqliteProfilerStorage.php";a:4:{s:6:"md5sum";s:32:"b69028b6ff27fff88714b26e65d6d6cf";s:4:"name";s:63:"Symfony/Component/HttpKernel/Profiler/SqliteProfilerStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler/SqliteProfilerStorage.php";}s:38:"Symfony/Component/HttpKernel/README.md";a:4:{s:6:"md5sum";s:32:"a88bdc6a3df6948b04db2f5d8c76c865";s:4:"name";s:38:"Symfony/Component/HttpKernel/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/HttpKernel/Symfony/Component/HttpKernel/README.md";}s:52:"Symfony/Component/HttpKernel/TerminableInterface.php";a:4:{s:6:"md5sum";s:32:"63651d1c2efa91187e171c23fa108bcc";s:4:"name";s:52:"Symfony/Component/HttpKernel/TerminableInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/TerminableInterface.php";}s:56:"Symfony/Component/HttpKernel/Tests/Bundle/BundleTest.php";a:4:{s:6:"md5sum";s:32:"5db4015a25ec64975433954495425cb9";s:4:"name";s:56:"Symfony/Component/HttpKernel/Tests/Bundle/BundleTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Bundle/BundleTest.php";}s:73:"Symfony/Component/HttpKernel/Tests/CacheClearer/ChainCacheClearerTest.php";a:4:{s:6:"md5sum";s:32:"719d0acb32f69e30070481fc995d7c95";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/CacheClearer/ChainCacheClearerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/CacheClearer/ChainCacheClearerTest.php";}s:75:"Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php";a:4:{s:6:"md5sum";s:32:"a670a188bc612138042a48ce08d0d86c";s:4:"name";s:75:"Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php";}s:66:"Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerTest.php";a:4:{s:6:"md5sum";s:32:"aa85344cf1c9a4ea3472caad8fd270e1";s:4:"name";s:66:"Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerTest.php";}s:49:"Symfony/Component/HttpKernel/Tests/ClientTest.php";a:4:{s:6:"md5sum";s:32:"d8434d3e6d9ab70624691695c0463227";s:4:"name";s:49:"Symfony/Component/HttpKernel/Tests/ClientTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/ClientTest.php";}s:61:"Symfony/Component/HttpKernel/Tests/Config/FileLocatorTest.php";a:4:{s:6:"md5sum";s:32:"5e1515ccdd440d46fca79579beb81ea1";s:4:"name";s:61:"Symfony/Component/HttpKernel/Tests/Config/FileLocatorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Config/FileLocatorTest.php";}s:72:"Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php";a:4:{s:6:"md5sum";s:32:"537f569f63ee14058800342fc3e0a242";s:4:"name";s:72:"Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php";}s:76:"Symfony/Component/HttpKernel/Tests/DataCollector/ConfigDataCollectorTest.php";a:4:{s:6:"md5sum";s:32:"39a22588190c09f58431a38ce9ebd6bc";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/DataCollector/ConfigDataCollectorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/ConfigDataCollectorTest.php";}s:79:"Symfony/Component/HttpKernel/Tests/DataCollector/ExceptionDataCollectorTest.php";a:4:{s:6:"md5sum";s:32:"0cf6afafd5af55e00d3c5f9ba31d8917";s:4:"name";s:79:"Symfony/Component/HttpKernel/Tests/DataCollector/ExceptionDataCollectorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/ExceptionDataCollectorTest.php";}s:76:"Symfony/Component/HttpKernel/Tests/DataCollector/LoggerDataCollectorTest.php";a:4:{s:6:"md5sum";s:32:"db74032e31e4161dc21aaf9443a4910f";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/DataCollector/LoggerDataCollectorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/LoggerDataCollectorTest.php";}s:76:"Symfony/Component/HttpKernel/Tests/DataCollector/MemoryDataCollectorTest.php";a:4:{s:6:"md5sum";s:32:"dd889c18076eab8becd1544e90472aae";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/DataCollector/MemoryDataCollectorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/MemoryDataCollectorTest.php";}s:77:"Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.php";a:4:{s:6:"md5sum";s:32:"cdab18131698b1915f326cbe376097c2";s:4:"name";s:77:"Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.php";}s:74:"Symfony/Component/HttpKernel/Tests/DataCollector/TimeDataCollectorTest.php";a:4:{s:6:"md5sum";s:32:"cad604b1dab9e0178b105ccee837ab52";s:4:"name";s:74:"Symfony/Component/HttpKernel/Tests/DataCollector/TimeDataCollectorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/TimeDataCollectorTest.php";}s:73:"Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php";a:4:{s:6:"md5sum";s:32:"47bb53262ba95915cc2f7c2c905ccd04";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php";}s:87:"Symfony/Component/HttpKernel/Tests/DependencyInjection/ContainerAwareHttpKernelTest.php";a:4:{s:6:"md5sum";s:32:"761aed0102e13403661542c40ff2441a";s:4:"name";s:87:"Symfony/Component/HttpKernel/Tests/DependencyInjection/ContainerAwareHttpKernelTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:133:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/ContainerAwareHttpKernelTest.php";}s:94:"Symfony/Component/HttpKernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php";a:4:{s:6:"md5sum";s:32:"92e4fbfef80def18781bd8a16000b2ec";s:4:"name";s:94:"Symfony/Component/HttpKernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:140:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php";}s:84:"Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.php";a:4:{s:6:"md5sum";s:32:"b8ec326aa5b3ad38b2aceb0f6f9f2b17";s:4:"name";s:84:"Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:130:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.php";}s:68:"Symfony/Component/HttpKernel/Tests/EventListener/EsiListenerTest.php";a:4:{s:6:"md5sum";s:32:"0af1d216963fc1ad9bf090060c450f69";s:4:"name";s:68:"Symfony/Component/HttpKernel/Tests/EventListener/EsiListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/EsiListenerTest.php";}s:74:"Symfony/Component/HttpKernel/Tests/EventListener/ExceptionListenerTest.php";a:4:{s:6:"md5sum";s:32:"3d35f03216a8c24fbec0d4690f6a4e9b";s:4:"name";s:74:"Symfony/Component/HttpKernel/Tests/EventListener/ExceptionListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/ExceptionListenerTest.php";}s:73:"Symfony/Component/HttpKernel/Tests/EventListener/FragmentListenerTest.php";a:4:{s:6:"md5sum";s:32:"2b58c87811bcb1e4d1e01a66b57d4a28";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/EventListener/FragmentListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/FragmentListenerTest.php";}s:71:"Symfony/Component/HttpKernel/Tests/EventListener/LocaleListenerTest.php";a:4:{s:6:"md5sum";s:32:"4e1ca37427ffb634328d287bf5bb179b";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/EventListener/LocaleListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/LocaleListenerTest.php";}s:73:"Symfony/Component/HttpKernel/Tests/EventListener/ProfilerListenerTest.php";a:4:{s:6:"md5sum";s:32:"0badf4d0b6a602b51de96b965d34b5a4";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/EventListener/ProfilerListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/ProfilerListenerTest.php";}s:73:"Symfony/Component/HttpKernel/Tests/EventListener/ResponseListenerTest.php";a:4:{s:6:"md5sum";s:32:"459a71cfa659bd53df29387cabad577b";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/EventListener/ResponseListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/ResponseListenerTest.php";}s:71:"Symfony/Component/HttpKernel/Tests/EventListener/RouterListenerTest.php";a:4:{s:6:"md5sum";s:32:"60d79091d972859015aeea894ceb632f";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/EventListener/RouterListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/RouterListenerTest.php";}s:76:"Symfony/Component/HttpKernel/Tests/EventListener/TestSessionListenerTest.php";a:4:{s:6:"md5sum";s:32:"c3c274823c0ae42288813e3881f5b2d9";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/EventListener/TestSessionListenerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/TestSessionListenerTest.php";}s:72:"Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/foo.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:72:"Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/foo.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/foo.txt";}s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/hide.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/hide.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/hide.txt";}s:65:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/bar.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:65:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/bar.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/bar.txt";}s:65:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/foo.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:65:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/foo.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/foo.txt";}s:75:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:75:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt";}s:65:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle2Bundle/foo.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:65:"Symfony/Component/HttpKernel/Tests/Fixtures/Bundle2Bundle/foo.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle2Bundle/foo.txt";}s:66:"Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/classes.map";a:4:{s:6:"md5sum";s:32:"9ab5af02cc19f043e6ab4c12f826be86";s:4:"name";s:66:"Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/classes.map";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/classes.map";}s:89:"Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/MockObjectTestProjectContainer.php";a:4:{s:6:"md5sum";s:32:"0d04f0c8627b1c410d6d47246199fb55";s:4:"name";s:89:"Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/MockObjectTestProjectContainer.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/MockObjectTestProjectContainer.php";}s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/foo.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/foo.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/foo.txt";}s:74:"Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/hide.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:74:"Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/hide.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/hide.txt";}s:91:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php";a:4:{s:6:"md5sum";s:32:"087e3dc7776e8d94ff7ae2852dc912bd";s:4:"name";s:91:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php";s:4:"role";s:4:"test";s:12:"installed_as";s:137:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php";}s:114:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php";a:4:{s:6:"md5sum";s:32:"27015c77094432ed5a984416d760fd74";s:4:"name";s:114:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php";s:4:"role";s:4:"test";s:12:"installed_as";s:160:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php";}s:91:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php";a:4:{s:6:"md5sum";s:32:"a1e589e6fb85f086e2d31f4f37e62fe9";s:4:"name";s:91:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php";s:4:"role";s:4:"test";s:12:"installed_as";s:137:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php";}s:89:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php";a:4:{s:6:"md5sum";s:32:"6cbbfc883c6a2ff486474f87476f0563";s:4:"name";s:89:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php";}s:89:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php";a:4:{s:6:"md5sum";s:32:"54610c5e45d73507ef3b70c59a6140c2";s:4:"name";s:89:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php";}s:116:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php";a:4:{s:6:"md5sum";s:32:"580c52df0c49dbe51b8953eafa44adff";s:4:"name";s:116:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php";s:4:"role";s:4:"test";s:12:"installed_as";s:162:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php";}s:93:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php";a:4:{s:6:"md5sum";s:32:"e2b6b77bad66ea379f550eeaa0c99476";s:4:"name";s:93:"Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php";s:4:"role";s:4:"test";s:12:"installed_as";s:139:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php";}s:60:"Symfony/Component/HttpKernel/Tests/Fixtures/FooBarBundle.php";a:4:{s:6:"md5sum";s:32:"f5505afbf35dae7260891f4a9fd1cfd4";s:4:"name";s:60:"Symfony/Component/HttpKernel/Tests/Fixtures/FooBarBundle.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/FooBarBundle.php";}s:69:"Symfony/Component/HttpKernel/Tests/Fixtures/KernelForOverrideName.php";a:4:{s:6:"md5sum";s:32:"468ec4e8ecf949b24336c3e2557bc7bf";s:4:"name";s:69:"Symfony/Component/HttpKernel/Tests/Fixtures/KernelForOverrideName.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForOverrideName.php";}s:61:"Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php";a:4:{s:6:"md5sum";s:32:"c9615a710a6e8dfdb0dd2daaa77b8377";s:4:"name";s:61:"Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php";}s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/BaseBundle/hide.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/BaseBundle/hide.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/BaseBundle/hide.txt";}s:75:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:75:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt";}s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/ChildBundle/foo.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/ChildBundle/foo.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/ChildBundle/foo.txt";}s:71:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/FooBundle/foo.txt";a:4:{s:6:"md5sum";s:32:"d41d8cd98f00b204e9800998ecf8427e";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/Fixtures/Resources/FooBundle/foo.txt";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/FooBundle/foo.txt";}s:58:"Symfony/Component/HttpKernel/Tests/Fixtures/TestClient.php";a:4:{s:6:"md5sum";s:32:"caac83e9f7141808a279c9415b3d631d";s:4:"name";s:58:"Symfony/Component/HttpKernel/Tests/Fixtures/TestClient.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/TestClient.php";}s:67:"Symfony/Component/HttpKernel/Tests/Fixtures/TestEventDispatcher.php";a:4:{s:6:"md5sum";s:32:"cf1be212b7c33954b81cbb5f17f90901";s:4:"name";s:67:"Symfony/Component/HttpKernel/Tests/Fixtures/TestEventDispatcher.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/TestEventDispatcher.php";}s:71:"Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php";a:4:{s:6:"md5sum";s:32:"bc9d6216414586747e3857fcc1884c33";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php";}s:67:"Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.php";a:4:{s:6:"md5sum";s:32:"fa6ac6afb43b8f9f17bac5f34b8079b1";s:4:"name";s:67:"Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:113:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.php";}s:76:"Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php";a:4:{s:6:"md5sum";s:32:"d42e11990c445631c29d351e1050bc12";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php";}s:74:"Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php";a:4:{s:6:"md5sum";s:32:"0914364078b13a058fc4ad858a9a97a2";s:4:"name";s:74:"Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php";}s:76:"Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php";a:4:{s:6:"md5sum";s:32:"99d3a3885bcaaeaa9d7daa7628d16b6b";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php";}s:56:"Symfony/Component/HttpKernel/Tests/HttpCache/EsiTest.php";a:4:{s:6:"md5sum";s:32:"0839be428bd44e163cd68390f4ef49da";s:4:"name";s:56:"Symfony/Component/HttpKernel/Tests/HttpCache/EsiTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/EsiTest.php";}s:62:"Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php";a:4:{s:6:"md5sum";s:32:"58d82c49cec84700cfeac27313345271";s:4:"name";s:62:"Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php";}s:66:"Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php";a:4:{s:6:"md5sum";s:32:"b03bb6f91a5309a1e83e6b892a9759cc";s:4:"name";s:66:"Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php";}s:58:"Symfony/Component/HttpKernel/Tests/HttpCache/StoreTest.php";a:4:{s:6:"md5sum";s:32:"070e9eeb7eff1f89e79917937aa7b692";s:4:"name";s:58:"Symfony/Component/HttpKernel/Tests/HttpCache/StoreTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/StoreTest.php";}s:63:"Symfony/Component/HttpKernel/Tests/HttpCache/TestHttpKernel.php";a:4:{s:6:"md5sum";s:32:"9968d637c2ee0189e7983c285f1cb353";s:4:"name";s:63:"Symfony/Component/HttpKernel/Tests/HttpCache/TestHttpKernel.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/TestHttpKernel.php";}s:71:"Symfony/Component/HttpKernel/Tests/HttpCache/TestMultipleHttpKernel.php";a:4:{s:6:"md5sum";s:32:"f8033c30b37e92bfbc3c61885dc4f6d2";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/HttpCache/TestMultipleHttpKernel.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/TestMultipleHttpKernel.php";}s:53:"Symfony/Component/HttpKernel/Tests/HttpKernelTest.php";a:4:{s:6:"md5sum";s:32:"cc31bf84e75276fcc9efa9f5f0c45302";s:4:"name";s:53:"Symfony/Component/HttpKernel/Tests/HttpKernelTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php";}s:49:"Symfony/Component/HttpKernel/Tests/KernelTest.php";a:4:{s:6:"md5sum";s:32:"985b62eefe124bbd995e6c9da0b46dbf";s:4:"name";s:49:"Symfony/Component/HttpKernel/Tests/KernelTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/KernelTest.php";}s:45:"Symfony/Component/HttpKernel/Tests/Logger.php";a:4:{s:6:"md5sum";s:32:"f544395e09366b61d2e01f49c15066ff";s:4:"name";s:45:"Symfony/Component/HttpKernel/Tests/Logger.php";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Logger.php";}s:75:"Symfony/Component/HttpKernel/Tests/Profiler/AbstractProfilerStorageTest.php";a:4:{s:6:"md5sum";s:32:"3d025b1cac5e80626a19849b06a41e91";s:4:"name";s:75:"Symfony/Component/HttpKernel/Tests/Profiler/AbstractProfilerStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/AbstractProfilerStorageTest.php";}s:71:"Symfony/Component/HttpKernel/Tests/Profiler/FileProfilerStorageTest.php";a:4:{s:6:"md5sum";s:32:"12f40567e2687864d629e2437915b127";s:4:"name";s:71:"Symfony/Component/HttpKernel/Tests/Profiler/FileProfilerStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/FileProfilerStorageTest.php";}s:76:"Symfony/Component/HttpKernel/Tests/Profiler/MemcachedProfilerStorageTest.php";a:4:{s:6:"md5sum";s:32:"f88559896ea0d7bea467da273976fcc3";s:4:"name";s:76:"Symfony/Component/HttpKernel/Tests/Profiler/MemcachedProfilerStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/MemcachedProfilerStorageTest.php";}s:75:"Symfony/Component/HttpKernel/Tests/Profiler/MemcacheProfilerStorageTest.php";a:4:{s:6:"md5sum";s:32:"285f9b91923d397ff0704c465eb76378";s:4:"name";s:75:"Symfony/Component/HttpKernel/Tests/Profiler/MemcacheProfilerStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/MemcacheProfilerStorageTest.php";}s:66:"Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.php";a:4:{s:6:"md5sum";s:32:"a9448076fbd5c7d42bb595bf6626226b";s:4:"name";s:66:"Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.php";}s:65:"Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.php";a:4:{s:6:"md5sum";s:32:"aaee125b4e1132032c58f5ca4c03bb40";s:4:"name";s:65:"Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.php";}s:62:"Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php";a:4:{s:6:"md5sum";s:32:"796c2e18d225e482facc9de766f8bba7";s:4:"name";s:62:"Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php";}s:74:"Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php";a:4:{s:6:"md5sum";s:32:"ed9ba23032795739acc33ba5d1970557";s:4:"name";s:74:"Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php";}s:60:"Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.php";a:4:{s:6:"md5sum";s:32:"9a65333f51c36b0b6a837f1105c2d022";s:4:"name";s:60:"Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.php";}s:72:"Symfony/Component/HttpKernel/Tests/Profiler/RedisProfilerStorageTest.php";a:4:{s:6:"md5sum";s:32:"e84fca3c3f76faa48cf1b760ab1fc079";s:4:"name";s:72:"Symfony/Component/HttpKernel/Tests/Profiler/RedisProfilerStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/RedisProfilerStorageTest.php";}s:73:"Symfony/Component/HttpKernel/Tests/Profiler/SqliteProfilerStorageTest.php";a:4:{s:6:"md5sum";s:32:"fad36380de80995905e7a2046f3d01b0";s:4:"name";s:73:"Symfony/Component/HttpKernel/Tests/Profiler/SqliteProfilerStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/SqliteProfilerStorageTest.php";}s:53:"Symfony/Component/HttpKernel/Tests/TestHttpKernel.php";a:4:{s:6:"md5sum";s:32:"5b8daaba0cf9db86b60c25116c7ab8a4";s:4:"name";s:53:"Symfony/Component/HttpKernel/Tests/TestHttpKernel.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/TestHttpKernel.php";}s:52:"Symfony/Component/HttpKernel/Tests/UriSignerTest.php";a:4:{s:6:"md5sum";s:32:"bf06babf2bdca6d62c7960c8a9e53e68";s:4:"name";s:52:"Symfony/Component/HttpKernel/Tests/UriSignerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/UriSignerTest.php";}s:42:"Symfony/Component/HttpKernel/UriSigner.php";a:4:{s:6:"md5sum";s:32:"9daa3c983b391a8dae8e4e7b34f26e07";s:4:"name";s:42:"Symfony/Component/HttpKernel/UriSigner.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/UriSigner.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:62:{s:58:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Bundle";b:1;s:71:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/CacheClearer";b:1;s:70:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/CacheWarmer";b:1;s:73:"/opt/alt/php54/usr/share/doc/pear/HttpKernel/Symfony/Component/HttpKernel";b:1;s:62:"/opt/alt/php54/usr/share/doc/pear/HttpKernel/Symfony/Component";b:1;s:52:"/opt/alt/php54/usr/share/doc/pear/HttpKernel/Symfony";b:1;s:44:"/opt/alt/php54/usr/share/doc/pear/HttpKernel";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Config";b:1;s:69:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Controller";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector";b:1;s:77:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DataCollector/Util";b:1;s:64:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Debug";b:1;s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/DependencyInjection";b:1;s:64:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Event";b:1;s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/EventListener";b:1;s:68:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Exception";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Fragment";b:1;s:68:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/HttpCache";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Log";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel";b:1;s:63:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component";b:1;s:53:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony";b:1;s:45:"/opt/alt/php54/usr/share/pear/test/HttpKernel";b:1;s:67:"/opt/alt/php54/usr/share/pear/Symfony/Component/HttpKernel/Profiler";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Bundle";b:1;s:80:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests";b:1;s:93:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/CacheClearer";b:1;s:92:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/CacheWarmer";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Config";b:1;s:91:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Controller";b:1;s:94:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector";b:1;s:86:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Debug";b:1;s:100:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DependencyInjection";b:1;s:94:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener";b:1;s:110:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources";b:1;s:100:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures";b:1;s:103:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle";b:1;s:113:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/Resources";b:1;s:103:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle2Bundle";b:1;s:100:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/cache/test";b:1;s:95:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/cache";b:1;s:111:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources";b:1;s:101:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle";b:1;s:111:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionAbsentBundle";b:1;s:131:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection";b:1;s:111:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle";b:1;s:120:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command";b:1;s:112:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle";b:1;s:132:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection";b:1;s:110:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/BaseBundle";b:1;s:99:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources";b:1;s:113:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/Bundle1Bundle";b:1;s:111:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/ChildBundle";b:1;s:109:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/FooBundle";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment";b:1;s:90:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler";b:1;s:94:"/opt/alt/php54/usr/share/pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:10:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:14:"HttpFoundation";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:3;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:15:"EventDispatcher";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}i:4;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:6:"Config";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:5;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:19:"DependencyInjection";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:6;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:11:"ClassLoader";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:7;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:10:"BrowserKit";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:8;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:7:"Console";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}i:9;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:6:"Finder";s:3:"rel";s:3:"has";s:8:"optional";s:3:"yes";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506495;}PK�^�\�E�ӭ+�+:pear/.registry/.channel.pear.symfony.com/monologbridge.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:13:"MonologBridge";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:23:"Symfony2 Monolog Bridge";s:11:"description";s:23:"Symfony2 Monolog Bridge";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:40";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:16:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bdbad7393ee44f10ac322df29bfa77ad";s:4:"name";s:37:"Symfony/Bridge/Monolog/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"094d6ae95193dc93574972855a7d4832";s:4:"name";s:35:"Symfony/Bridge/Monolog/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a8f1a867d0764615189e8bf0b52c96cc";s:4:"name";s:36:"Symfony/Bridge/Monolog/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"501339390d395617968209b4da17d804";s:4:"name";s:53:"Symfony/Bridge/Monolog/Formatter/ConsoleFormatter.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"21b3ac07925411b737467982255e1eee";s:4:"name";s:51:"Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1904f40387634917013822e9f3141616";s:4:"name";s:49:"Symfony/Bridge/Monolog/Handler/ConsoleHandler.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ed987f0a4d874ea227a55837e8cdd126";s:4:"name";s:47:"Symfony/Bridge/Monolog/Handler/DebugHandler.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"da8c5260e05c07e61be644d857f3a23d";s:4:"name";s:49:"Symfony/Bridge/Monolog/Handler/FirePHPHandler.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f9fc834e5db8ab23a2894046a5c73f0f";s:4:"name";s:53:"Symfony/Bridge/Monolog/Handler/SwiftMailerHandler.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:30:"Symfony/Bridge/Monolog/LICENSE";s:4:"role";s:3:"doc";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b938f174102a5986f62e1d936e86ff1";s:4:"name";s:33:"Symfony/Bridge/Monolog/Logger.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"13114b196ecb2d5d366e5d55a86e7eb6";s:4:"name";s:39:"Symfony/Bridge/Monolog/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"befbcf0b3ce8ecfb5781cf0666659938";s:4:"name";s:49:"Symfony/Bridge/Monolog/Processor/WebProcessor.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"854dbd178e5fb104a7456c87fab8c54f";s:4:"name";s:32:"Symfony/Bridge/Monolog/README.md";s:4:"role";s:3:"doc";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a08dee274cc27bc65d50e26ac214d71f";s:4:"name";s:59:"Symfony/Bridge/Monolog/Tests/Handler/ConsoleHandlerTest.php";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"79c355f88c71490f32bc2a5d48aa1ee0";s:4:"name";s:59:"Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}s:7:"package";a:2:{s:4:"name";s:10:"HttpKernel";s:7:"channel";s:16:"pear.symfony.com";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:16:{s:37:"Symfony/Bridge/Monolog/autoloader.php";a:4:{s:6:"md5sum";s:32:"bdbad7393ee44f10ac322df29bfa77ad";s:4:"name";s:37:"Symfony/Bridge/Monolog/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/autoloader.php";}s:35:"Symfony/Bridge/Monolog/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"094d6ae95193dc93574972855a7d4832";s:4:"name";s:35:"Symfony/Bridge/Monolog/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/MonologBridge/Symfony/Bridge/Monolog/CHANGELOG.md";}s:36:"Symfony/Bridge/Monolog/composer.json";a:4:{s:6:"md5sum";s:32:"a8f1a867d0764615189e8bf0b52c96cc";s:4:"name";s:36:"Symfony/Bridge/Monolog/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/doc/pear/MonologBridge/Symfony/Bridge/Monolog/composer.json";}s:53:"Symfony/Bridge/Monolog/Formatter/ConsoleFormatter.php";a:4:{s:6:"md5sum";s:32:"501339390d395617968209b4da17d804";s:4:"name";s:53:"Symfony/Bridge/Monolog/Formatter/ConsoleFormatter.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Formatter/ConsoleFormatter.php";}s:51:"Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php";a:4:{s:6:"md5sum";s:32:"21b3ac07925411b737467982255e1eee";s:4:"name";s:51:"Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php";}s:49:"Symfony/Bridge/Monolog/Handler/ConsoleHandler.php";a:4:{s:6:"md5sum";s:32:"1904f40387634917013822e9f3141616";s:4:"name";s:49:"Symfony/Bridge/Monolog/Handler/ConsoleHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Handler/ConsoleHandler.php";}s:47:"Symfony/Bridge/Monolog/Handler/DebugHandler.php";a:4:{s:6:"md5sum";s:32:"ed987f0a4d874ea227a55837e8cdd126";s:4:"name";s:47:"Symfony/Bridge/Monolog/Handler/DebugHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Handler/DebugHandler.php";}s:49:"Symfony/Bridge/Monolog/Handler/FirePHPHandler.php";a:4:{s:6:"md5sum";s:32:"da8c5260e05c07e61be644d857f3a23d";s:4:"name";s:49:"Symfony/Bridge/Monolog/Handler/FirePHPHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Handler/FirePHPHandler.php";}s:53:"Symfony/Bridge/Monolog/Handler/SwiftMailerHandler.php";a:4:{s:6:"md5sum";s:32:"f9fc834e5db8ab23a2894046a5c73f0f";s:4:"name";s:53:"Symfony/Bridge/Monolog/Handler/SwiftMailerHandler.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Handler/SwiftMailerHandler.php";}s:30:"Symfony/Bridge/Monolog/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:30:"Symfony/Bridge/Monolog/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/doc/pear/MonologBridge/Symfony/Bridge/Monolog/LICENSE";}s:33:"Symfony/Bridge/Monolog/Logger.php";a:4:{s:6:"md5sum";s:32:"5b938f174102a5986f62e1d936e86ff1";s:4:"name";s:33:"Symfony/Bridge/Monolog/Logger.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Logger.php";}s:39:"Symfony/Bridge/Monolog/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"13114b196ecb2d5d366e5d55a86e7eb6";s:4:"name";s:39:"Symfony/Bridge/Monolog/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/test/MonologBridge/Symfony/Bridge/Monolog/phpunit.xml.dist";}s:49:"Symfony/Bridge/Monolog/Processor/WebProcessor.php";a:4:{s:6:"md5sum";s:32:"befbcf0b3ce8ecfb5781cf0666659938";s:4:"name";s:49:"Symfony/Bridge/Monolog/Processor/WebProcessor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Processor/WebProcessor.php";}s:32:"Symfony/Bridge/Monolog/README.md";a:4:{s:6:"md5sum";s:32:"854dbd178e5fb104a7456c87fab8c54f";s:4:"name";s:32:"Symfony/Bridge/Monolog/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/doc/pear/MonologBridge/Symfony/Bridge/Monolog/README.md";}s:59:"Symfony/Bridge/Monolog/Tests/Handler/ConsoleHandlerTest.php";a:4:{s:6:"md5sum";s:32:"a08dee274cc27bc65d50e26ac214d71f";s:4:"name";s:59:"Symfony/Bridge/Monolog/Tests/Handler/ConsoleHandlerTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/MonologBridge/Symfony/Bridge/Monolog/Tests/Handler/ConsoleHandlerTest.php";}s:59:"Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php";a:4:{s:6:"md5sum";s:32:"79c355f88c71490f32bc2a5d48aa1ee0";s:4:"name";s:59:"Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/MonologBridge/Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:17:{s:52:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog";b:1;s:44:"/opt/alt/php54/usr/share/pear/Symfony/Bridge";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:70:"/opt/alt/php54/usr/share/doc/pear/MonologBridge/Symfony/Bridge/Monolog";b:1;s:62:"/opt/alt/php54/usr/share/doc/pear/MonologBridge/Symfony/Bridge";b:1;s:55:"/opt/alt/php54/usr/share/doc/pear/MonologBridge/Symfony";b:1;s:47:"/opt/alt/php54/usr/share/doc/pear/MonologBridge";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Formatter";b:1;s:60:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Handler";b:1;s:71:"/opt/alt/php54/usr/share/pear/test/MonologBridge/Symfony/Bridge/Monolog";b:1;s:63:"/opt/alt/php54/usr/share/pear/test/MonologBridge/Symfony/Bridge";b:1;s:56:"/opt/alt/php54/usr/share/pear/test/MonologBridge/Symfony";b:1;s:48:"/opt/alt/php54/usr/share/pear/test/MonologBridge";b:1;s:62:"/opt/alt/php54/usr/share/pear/Symfony/Bridge/Monolog/Processor";b:1;s:85:"/opt/alt/php54/usr/share/pear/test/MonologBridge/Symfony/Bridge/Monolog/Tests/Handler";b:1;s:77:"/opt/alt/php54/usr/share/pear/test/MonologBridge/Symfony/Bridge/Monolog/Tests";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/MonologBridge/Symfony/Bridge/Monolog/Tests/Processor";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}i:2;a:5:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"pear.symfony.com";s:4:"name";s:10:"HttpKernel";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506495;}PK�^�\D�zX�&�&7pear/.registry/.channel.pear.symfony.com/filesystem.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:10:"Filesystem";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:29:"Symfony2 Filesystem Component";s:11:"description";s:29:"Symfony2 Filesystem Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:44";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:14:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"eeadcdf200225ed18f3d9bd70b310375";s:4:"name";s:43:"Symfony/Component/Filesystem/autoloader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1537577578897cb0d5702f346fae3c82";s:4:"name";s:41:"Symfony/Component/Filesystem/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0719190f9b9a19976e07424c786da406";s:4:"name";s:42:"Symfony/Component/Filesystem/composer.json";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"11a7d451ae71b6aeba9e1236a53865f0";s:4:"name";s:61:"Symfony/Component/Filesystem/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8a8b119b88f20a5a3078e051a308f741";s:4:"name";s:64:"Symfony/Component/Filesystem/Exception/FileNotFoundException.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"79569770a034723c06472d45b57d74da";s:4:"name";s:54:"Symfony/Component/Filesystem/Exception/IOException.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9ce81ced7d137497a4aa3639b2c445fe";s:4:"name";s:63:"Symfony/Component/Filesystem/Exception/IOExceptionInterface.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"356b2ce6a1d41b8cae77ef6fd9258b06";s:4:"name";s:43:"Symfony/Component/Filesystem/Filesystem.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/Filesystem/LICENSE";s:4:"role";s:3:"doc";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1579e7260973d3c54b34f0a2b0342f8f";s:4:"name";s:45:"Symfony/Component/Filesystem/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a954a92f9fc04cd3aabdff075b04252f";s:4:"name";s:38:"Symfony/Component/Filesystem/README.md";s:4:"role";s:3:"doc";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4108eeb04e7693cca06fb785b91553ab";s:4:"name";s:52:"Symfony/Component/Filesystem/Tests/ExceptionTest.php";s:4:"role";s:4:"test";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e7e4c5588c1846edc92e286385fcfb42";s:4:"name";s:53:"Symfony/Component/Filesystem/Tests/FilesystemTest.php";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0e10c90ef941c3e68756586a5f197b8e";s:4:"name";s:57:"Symfony/Component/Filesystem/Tests/FilesystemTestCase.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:14:{s:43:"Symfony/Component/Filesystem/autoloader.php";a:4:{s:6:"md5sum";s:32:"eeadcdf200225ed18f3d9bd70b310375";s:4:"name";s:43:"Symfony/Component/Filesystem/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Filesystem/autoloader.php";}s:41:"Symfony/Component/Filesystem/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"1537577578897cb0d5702f346fae3c82";s:4:"name";s:41:"Symfony/Component/Filesystem/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/doc/pear/Filesystem/Symfony/Component/Filesystem/CHANGELOG.md";}s:42:"Symfony/Component/Filesystem/composer.json";a:4:{s:6:"md5sum";s:32:"0719190f9b9a19976e07424c786da406";s:4:"name";s:42:"Symfony/Component/Filesystem/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/Filesystem/Symfony/Component/Filesystem/composer.json";}s:61:"Symfony/Component/Filesystem/Exception/ExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"11a7d451ae71b6aeba9e1236a53865f0";s:4:"name";s:61:"Symfony/Component/Filesystem/Exception/ExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/Symfony/Component/Filesystem/Exception/ExceptionInterface.php";}s:64:"Symfony/Component/Filesystem/Exception/FileNotFoundException.php";a:4:{s:6:"md5sum";s:32:"8a8b119b88f20a5a3078e051a308f741";s:4:"name";s:64:"Symfony/Component/Filesystem/Exception/FileNotFoundException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:94:"/opt/alt/php54/usr/share/pear/Symfony/Component/Filesystem/Exception/FileNotFoundException.php";}s:54:"Symfony/Component/Filesystem/Exception/IOException.php";a:4:{s:6:"md5sum";s:32:"79569770a034723c06472d45b57d74da";s:4:"name";s:54:"Symfony/Component/Filesystem/Exception/IOException.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Filesystem/Exception/IOException.php";}s:63:"Symfony/Component/Filesystem/Exception/IOExceptionInterface.php";a:4:{s:6:"md5sum";s:32:"9ce81ced7d137497a4aa3639b2c445fe";s:4:"name";s:63:"Symfony/Component/Filesystem/Exception/IOExceptionInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/Symfony/Component/Filesystem/Exception/IOExceptionInterface.php";}s:43:"Symfony/Component/Filesystem/Filesystem.php";a:4:{s:6:"md5sum";s:32:"356b2ce6a1d41b8cae77ef6fd9258b06";s:4:"name";s:43:"Symfony/Component/Filesystem/Filesystem.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Filesystem/Filesystem.php";}s:36:"Symfony/Component/Filesystem/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/Filesystem/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/Filesystem/Symfony/Component/Filesystem/LICENSE";}s:45:"Symfony/Component/Filesystem/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"1579e7260973d3c54b34f0a2b0342f8f";s:4:"name";s:45:"Symfony/Component/Filesystem/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Filesystem/Symfony/Component/Filesystem/phpunit.xml.dist";}s:38:"Symfony/Component/Filesystem/README.md";a:4:{s:6:"md5sum";s:32:"a954a92f9fc04cd3aabdff075b04252f";s:4:"name";s:38:"Symfony/Component/Filesystem/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/Filesystem/Symfony/Component/Filesystem/README.md";}s:52:"Symfony/Component/Filesystem/Tests/ExceptionTest.php";a:4:{s:6:"md5sum";s:32:"4108eeb04e7693cca06fb785b91553ab";s:4:"name";s:52:"Symfony/Component/Filesystem/Tests/ExceptionTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Filesystem/Symfony/Component/Filesystem/Tests/ExceptionTest.php";}s:53:"Symfony/Component/Filesystem/Tests/FilesystemTest.php";a:4:{s:6:"md5sum";s:32:"e7e4c5588c1846edc92e286385fcfb42";s:4:"name";s:53:"Symfony/Component/Filesystem/Tests/FilesystemTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:99:"/opt/alt/php54/usr/share/pear/test/Filesystem/Symfony/Component/Filesystem/Tests/FilesystemTest.php";}s:57:"Symfony/Component/Filesystem/Tests/FilesystemTestCase.php";a:4:{s:6:"md5sum";s:32:"0e10c90ef941c3e68756586a5f197b8e";s:4:"name";s:57:"Symfony/Component/Filesystem/Tests/FilesystemTestCase.php";s:4:"role";s:4:"test";s:12:"installed_as";s:103:"/opt/alt/php54/usr/share/pear/test/Filesystem/Symfony/Component/Filesystem/Tests/FilesystemTestCase.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:13:{s:58:"/opt/alt/php54/usr/share/pear/Symfony/Component/Filesystem";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:73:"/opt/alt/php54/usr/share/doc/pear/Filesystem/Symfony/Component/Filesystem";b:1;s:62:"/opt/alt/php54/usr/share/doc/pear/Filesystem/Symfony/Component";b:1;s:52:"/opt/alt/php54/usr/share/doc/pear/Filesystem/Symfony";b:1;s:44:"/opt/alt/php54/usr/share/doc/pear/Filesystem";b:1;s:68:"/opt/alt/php54/usr/share/pear/Symfony/Component/Filesystem/Exception";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/Filesystem/Symfony/Component/Filesystem";b:1;s:63:"/opt/alt/php54/usr/share/pear/test/Filesystem/Symfony/Component";b:1;s:53:"/opt/alt/php54/usr/share/pear/test/Filesystem/Symfony";b:1;s:45:"/opt/alt/php54/usr/share/pear/test/Filesystem";b:1;s:80:"/opt/alt/php54/usr/share/pear/test/Filesystem/Symfony/Component/Filesystem/Tests";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506493;}PK�^�\ @O���8pear/.registry/.channel.pear.symfony.com/classloader.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:11:"ClassLoader";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:30:"Symfony2 ClassLoader Component";s:11:"description";s:30:"Symfony2 ClassLoader Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:41";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:92:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86d9a3b8315c0692848769a9c1c3e9c5";s:4:"name";s:48:"Symfony/Component/ClassLoader/ApcClassLoader.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"13864652955ff0c5022e5553b509729e";s:4:"name";s:57:"Symfony/Component/ClassLoader/ApcUniversalClassLoader.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aa24c1ac162b51d1d2a67f57d35ee63e";s:4:"name";s:44:"Symfony/Component/ClassLoader/autoloader.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d6726c438f9e0dfb95fe8b7bc95e626";s:4:"name";s:42:"Symfony/Component/ClassLoader/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e93bc22ebc1bddbcb25c82b3bdcd9e2f";s:4:"name";s:55:"Symfony/Component/ClassLoader/ClassCollectionLoader.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"524dfe8aff9aefd074d38ecdc888a399";s:4:"name";s:45:"Symfony/Component/ClassLoader/ClassLoader.php";s:4:"role";s:3:"php";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3866e36ec0fe67f2469b8ec8aeb5333c";s:4:"name";s:51:"Symfony/Component/ClassLoader/ClassMapGenerator.php";s:4:"role";s:3:"php";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"86212875c79eac9dde10dbb43b2d24fc";s:4:"name";s:43:"Symfony/Component/ClassLoader/composer.json";s:4:"role";s:3:"doc";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d81299fddda21c2171161445bd865017";s:4:"name";s:50:"Symfony/Component/ClassLoader/DebugClassLoader.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"edc1307f2a08518aefb89f5aab8a477e";s:4:"name";s:59:"Symfony/Component/ClassLoader/DebugUniversalClassLoader.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:37:"Symfony/Component/ClassLoader/LICENSE";s:4:"role";s:3:"doc";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"82e86d3ab5084a7720463b20db3f467b";s:4:"name";s:48:"Symfony/Component/ClassLoader/MapClassLoader.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4e2184459091a9fbfc707851521b361c";s:4:"name";s:46:"Symfony/Component/ClassLoader/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09b871124a6d3cce9dbb4f7727f7f810";s:4:"name";s:39:"Symfony/Component/ClassLoader/README.md";s:4:"role";s:3:"doc";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3fb37ebb53adc1aa6b55c84c49fcf5a8";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.php";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"23912b93dc7de2003f49d7f1e2c25732";s:4:"name";s:65:"Symfony/Component/ClassLoader/Tests/ClassCollectionLoaderTest.php";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6a58f5ed32089b0458e3ee031f30c804";s:4:"name";s:55:"Symfony/Component/ClassLoader/Tests/ClassLoaderTest.php";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6cd9f7dac5d5f1daa2d40903ae0c4d23";s:4:"name";s:61:"Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7839cd8c5550658fbc5dd8f50db33db4";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Bar.php";s:4:"role";s:4:"test";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e85a0c52a4381199ded8fca8e42c1875";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Foo.php";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"80ffae60899e48b99924c3a907d38255";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Bar.php";s:4:"role";s:4:"test";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9c0b9aefd4284a57d7f649b8cde024c5";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Foo.php";s:4:"role";s:4:"test";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"44d59b6bdb3555587a3be549beb19451";s:4:"name";s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Bar.php";s:4:"role";s:4:"test";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"89c3f524e25d5abff91ddae0a9aa39f8";s:4:"name";s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Foo.php";s:4:"role";s:4:"test";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"59093638625c5324d12879437e82ac23";s:4:"name";s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Bar.php";s:4:"role";s:4:"test";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3a0c0cab70920049cf7c910659bbdddb";s:4:"name";s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Foo.php";s:4:"role";s:4:"test";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9affd828e7b937fa5dab9348a1c106c3";s:4:"name";s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Bar.php";s:4:"role";s:4:"test";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"565482b47ad54f50794890243d517198";s:4:"name";s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Foo.php";s:4:"role";s:4:"test";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3f41e3c6878caa34053b0df735fd06d4";s:4:"name";s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Bar.php";s:4:"role";s:4:"test";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"199f5fc8858ff6ba24e9a1927a436a1f";s:4:"name";s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Foo.php";s:4:"role";s:4:"test";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"88f045e809ca7fb0c18dfdbb7bbedbfc";s:4:"name";s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Bar.php";s:4:"role";s:4:"test";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0a6020428498f5d43bdd1871bdfe5fff";s:4:"name";s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Foo.php";s:4:"role";s:4:"test";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"133c40a5d435bb2607fcaba19a177e92";s:4:"name";s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Bar.php";s:4:"role";s:4:"test";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b4809859bdbb243d35edfa3da736c859";s:4:"name";s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Foo.php";s:4:"role";s:4:"test";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"83f27620b7ba2c11696bdf11716d223d";s:4:"name";s:81:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Apc/Pearlike/FooBar.php";s:4:"role";s:4:"test";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"03276dc89dca3856b642091121781aa7";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Namespaced/FooBar.php";s:4:"role";s:4:"test";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"450ce1f75995d3855e2890174cad81c9";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Bar.php";s:4:"role";s:4:"test";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"272f5b10737a621697301cef1fd00c34";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Baz.php";s:4:"role";s:4:"test";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b52382287fd5a64b85c707f0841c797d";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Foo.php";s:4:"role";s:4:"test";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"03276dc89dca3856b642091121781aa7";s:4:"name";s:70:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/FooBar.php";s:4:"role";s:4:"test";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5d889368e4bd7b30ea2179f77d82816f";s:4:"name";s:65:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Bar.php";s:4:"role";s:4:"test";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"03ca66795cd12fdb9d39b41825906973";s:4:"name";s:65:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Baz.php";s:4:"role";s:4:"test";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f2002a4177d860d4b3763db043f9776f";s:4:"name";s:65:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Foo.php";s:4:"role";s:4:"test";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"1234b8d86aed91dae669333ff5ae887f";s:4:"name";s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Bar.php";s:4:"role";s:4:"test";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c3ff0020d627887437102f59aaa6d5a0";s:4:"name";s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Foo.php";s:4:"role";s:4:"test";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"16acd0ac1810324ade58e7f527b11721";s:4:"name";s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Bar.php";s:4:"role";s:4:"test";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"cbe4fddcef55d82678ce042506df312e";s:4:"name";s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Foo.php";s:4:"role";s:4:"test";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7171280695f683129338bbc9127e8a5b";s:4:"name";s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Bar.php";s:4:"role";s:4:"test";}}i:48;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"64b36c967661286fb774e010be84b5fc";s:4:"name";s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Foo.php";s:4:"role";s:4:"test";}}i:49;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d01e56d7432f31c185ea81acd0c3e43e";s:4:"name";s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Bar.php";s:4:"role";s:4:"test";}}i:50;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8c8934c39f7727374b802bea9c0892eb";s:4:"name";s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Foo.php";s:4:"role";s:4:"test";}}i:51;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c0ba313164bfc6fc725c67e515af6368";s:4:"name";s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.php";s:4:"role";s:4:"test";}}i:52;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c718b10e49ff27e12c0674e674e85a6b";s:4:"name";s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/ATrait.php";s:4:"role";s:4:"test";}}i:53;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0322eeaef5105762706853bd4445f92d";s:4:"name";s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.php";s:4:"role";s:4:"test";}}i:54;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f6d6d69da53085f34b2363d23081783f";s:4:"name";s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/BTrait.php";s:4:"role";s:4:"test";}}i:55;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ea775929d42f58af393b4f224c59b1c9";s:4:"name";s:78:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CInterface.php";s:4:"role";s:4:"test";}}i:56;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f925be736833be1a46dcb4878537cfe3";s:4:"name";s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CTrait.php";s:4:"role";s:4:"test";}}i:57;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d1a43cd2eb1d650a46793b4324717801";s:4:"name";s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/D.php";s:4:"role";s:4:"test";}}i:58;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"676dc682573657553221b8997da6fe5f";s:4:"name";s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/E.php";s:4:"role";s:4:"test";}}i:59;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"6ea7e288f1a6c11ad35be1011275cf49";s:4:"name";s:78:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/GInterface.php";s:4:"role";s:4:"test";}}i:60;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"087217e8655325395af4f0dec57cde9b";s:4:"name";s:68:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.php";s:4:"role";s:4:"test";}}i:61;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"439f18e59d963c281150e47387e575e9";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notAClass.php";s:4:"role";s:4:"test";}}i:62;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"959a2c47ea204306eccdd8fb6bf09d9c";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notPhpFile.md";s:4:"role";s:4:"test";}}i:63;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"23a88b412716678374cb83b3bd84f281";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.php";s:4:"role";s:4:"test";}}i:64;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e4d922295055f51230604c8e3d231eae";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.php";s:4:"role";s:4:"test";}}i:65;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b183b2f81d0a3580b8494e2a315b5c0f";s:4:"name";s:71:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.php";s:4:"role";s:4:"test";}}i:66;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3925f28e4b3d85670506ec8f20ad5c1a";s:4:"name";s:68:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.php";s:4:"role";s:4:"test";}}i:67;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bbbb1f58e6ce45f7f2fcf18009537d34";s:4:"name";s:60:"Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.php";s:4:"role";s:4:"test";}}i:68;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"4bc49eb260c97d801f0c924b3cbb9e83";s:4:"name";s:75:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced/FooBar.php";s:4:"role";s:4:"test";}}i:69;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7f38452cd551fb2149367bc6b11329e2";s:4:"name";s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced2/FooBar.php";s:4:"role";s:4:"test";}}i:70;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f8188170d810646eafce22ad6458c37c";s:4:"name";s:73:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike/FooBar.php";s:4:"role";s:4:"test";}}i:71;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fe464b289785a184fb96897588e17915";s:4:"name";s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike2/FooBar.php";s:4:"role";s:4:"test";}}i:72;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"22c1ff3bd402ac54f7663e249ee27265";s:4:"name";s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/includepath/Foo.php";s:4:"role";s:4:"test";}}i:73;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0bd20d6bd956d80ab403aab7ec1692d3";s:4:"name";s:63:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Bar.php";s:4:"role";s:4:"test";}}i:74;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"669a66483c0b6c6d301928afdc9c4e4f";s:4:"name";s:63:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Baz.php";s:4:"role";s:4:"test";}}i:75;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"004debf153631e65aa55a6a595f5e859";s:4:"name";s:63:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Foo.php";s:4:"role";s:4:"test";}}i:76;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63773f312e4568035cea34d1e7049f93";s:4:"name";s:72:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/WithComments.php";s:4:"role";s:4:"test";}}i:77;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"0e1341c26bd5098d0666416a99328602";s:4:"name";s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Bar.php";s:4:"role";s:4:"test";}}i:78;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f7037244d76da1670a0b6ab35980d735";s:4:"name";s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Baz.php";s:4:"role";s:4:"test";}}i:79;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7017318cc8fb7cb1b43f1f7caf023e5b";s:4:"name";s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Foo.php";s:4:"role";s:4:"test";}}i:80;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"092caf7c7dda0fd29b6a4eb94e16e8c7";s:4:"name";s:61:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Bar.php";s:4:"role";s:4:"test";}}i:81;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7ec330e5918e68855ea1928650677c2e";s:4:"name";s:61:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Baz.php";s:4:"role";s:4:"test";}}i:82;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2ccc8e12aac56ba8a19cc5749f4ddef6";s:4:"name";s:61:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Foo.php";s:4:"role";s:4:"test";}}i:83;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"8d6f9450b4d45d80d880d449c0f8ec73";s:4:"name";s:70:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/WithComments.php";s:4:"role";s:4:"test";}}i:84;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"43c84f5dcf75beec1d21efa12d74d135";s:4:"name";s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Bar.php";s:4:"role";s:4:"test";}}i:85;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"14a87e5a8699b57391eff2c94f576c18";s:4:"name";s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Baz.php";s:4:"role";s:4:"test";}}i:86;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ed2a4f5ef1c5a5b94181d4caff23caff";s:4:"name";s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Foo.php";s:4:"role";s:4:"test";}}i:87;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d560ea07154ede9772e22e33f7ef7628";s:4:"name";s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.php";s:4:"role";s:4:"test";}}i:88;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"393a45c8a8fc03e36dd139563e531f89";s:4:"name";s:64:"Symfony/Component/ClassLoader/Tests/UniversalClassLoaderTest.php";s:4:"role";s:4:"test";}}i:89;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"aaf07f8f264c4476277d3fc72ce31258";s:4:"name";s:54:"Symfony/Component/ClassLoader/UniversalClassLoader.php";s:4:"role";s:3:"php";}}i:90;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c41f5cdde6c04556fa520cb0eaecb4f1";s:4:"name";s:53:"Symfony/Component/ClassLoader/WinCacheClassLoader.php";s:4:"role";s:3:"php";}}i:91;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"626c7922f978832591daa87ec9388708";s:4:"name";s:51:"Symfony/Component/ClassLoader/XcacheClassLoader.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:92:{s:48:"Symfony/Component/ClassLoader/ApcClassLoader.php";a:4:{s:6:"md5sum";s:32:"86d9a3b8315c0692848769a9c1c3e9c5";s:4:"name";s:48:"Symfony/Component/ClassLoader/ApcClassLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/ApcClassLoader.php";}s:57:"Symfony/Component/ClassLoader/ApcUniversalClassLoader.php";a:4:{s:6:"md5sum";s:32:"13864652955ff0c5022e5553b509729e";s:4:"name";s:57:"Symfony/Component/ClassLoader/ApcUniversalClassLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php";}s:44:"Symfony/Component/ClassLoader/autoloader.php";a:4:{s:6:"md5sum";s:32:"aa24c1ac162b51d1d2a67f57d35ee63e";s:4:"name";s:44:"Symfony/Component/ClassLoader/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/autoloader.php";}s:42:"Symfony/Component/ClassLoader/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"8d6726c438f9e0dfb95fe8b7bc95e626";s:4:"name";s:42:"Symfony/Component/ClassLoader/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/doc/pear/ClassLoader/Symfony/Component/ClassLoader/CHANGELOG.md";}s:55:"Symfony/Component/ClassLoader/ClassCollectionLoader.php";a:4:{s:6:"md5sum";s:32:"e93bc22ebc1bddbcb25c82b3bdcd9e2f";s:4:"name";s:55:"Symfony/Component/ClassLoader/ClassCollectionLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/ClassCollectionLoader.php";}s:45:"Symfony/Component/ClassLoader/ClassLoader.php";a:4:{s:6:"md5sum";s:32:"524dfe8aff9aefd074d38ecdc888a399";s:4:"name";s:45:"Symfony/Component/ClassLoader/ClassLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/ClassLoader.php";}s:51:"Symfony/Component/ClassLoader/ClassMapGenerator.php";a:4:{s:6:"md5sum";s:32:"3866e36ec0fe67f2469b8ec8aeb5333c";s:4:"name";s:51:"Symfony/Component/ClassLoader/ClassMapGenerator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/ClassMapGenerator.php";}s:43:"Symfony/Component/ClassLoader/composer.json";a:4:{s:6:"md5sum";s:32:"86212875c79eac9dde10dbb43b2d24fc";s:4:"name";s:43:"Symfony/Component/ClassLoader/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/doc/pear/ClassLoader/Symfony/Component/ClassLoader/composer.json";}s:50:"Symfony/Component/ClassLoader/DebugClassLoader.php";a:4:{s:6:"md5sum";s:32:"d81299fddda21c2171161445bd865017";s:4:"name";s:50:"Symfony/Component/ClassLoader/DebugClassLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/DebugClassLoader.php";}s:59:"Symfony/Component/ClassLoader/DebugUniversalClassLoader.php";a:4:{s:6:"md5sum";s:32:"edc1307f2a08518aefb89f5aab8a477e";s:4:"name";s:59:"Symfony/Component/ClassLoader/DebugUniversalClassLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/DebugUniversalClassLoader.php";}s:37:"Symfony/Component/ClassLoader/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:37:"Symfony/Component/ClassLoader/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/ClassLoader/Symfony/Component/ClassLoader/LICENSE";}s:48:"Symfony/Component/ClassLoader/MapClassLoader.php";a:4:{s:6:"md5sum";s:32:"82e86d3ab5084a7720463b20db3f467b";s:4:"name";s:48:"Symfony/Component/ClassLoader/MapClassLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/MapClassLoader.php";}s:46:"Symfony/Component/ClassLoader/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"4e2184459091a9fbfc707851521b361c";s:4:"name";s:46:"Symfony/Component/ClassLoader/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/phpunit.xml.dist";}s:39:"Symfony/Component/ClassLoader/README.md";a:4:{s:6:"md5sum";s:32:"09b871124a6d3cce9dbb4f7727f7f810";s:4:"name";s:39:"Symfony/Component/ClassLoader/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/doc/pear/ClassLoader/Symfony/Component/ClassLoader/README.md";}s:67:"Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.php";a:4:{s:6:"md5sum";s:32:"3fb37ebb53adc1aa6b55c84c49fcf5a8";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.php";}s:65:"Symfony/Component/ClassLoader/Tests/ClassCollectionLoaderTest.php";a:4:{s:6:"md5sum";s:32:"23912b93dc7de2003f49d7f1e2c25732";s:4:"name";s:65:"Symfony/Component/ClassLoader/Tests/ClassCollectionLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/ClassCollectionLoaderTest.php";}s:55:"Symfony/Component/ClassLoader/Tests/ClassLoaderTest.php";a:4:{s:6:"md5sum";s:32:"6a58f5ed32089b0458e3ee031f30c804";s:4:"name";s:55:"Symfony/Component/ClassLoader/Tests/ClassLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/ClassLoaderTest.php";}s:61:"Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php";a:4:{s:6:"md5sum";s:32:"6cd9f7dac5d5f1daa2d40903ae0c4d23";s:4:"name";s:61:"Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php";}s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Bar.php";a:4:{s:6:"md5sum";s:32:"7839cd8c5550658fbc5dd8f50db33db4";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Bar.php";}s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Foo.php";a:4:{s:6:"md5sum";s:32:"e85a0c52a4381199ded8fca8e42c1875";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Foo.php";}s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Bar.php";a:4:{s:6:"md5sum";s:32:"80ffae60899e48b99924c3a907d38255";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Bar.php";}s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Foo.php";a:4:{s:6:"md5sum";s:32:"9c0b9aefd4284a57d7f649b8cde024c5";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Foo.php";}s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Bar.php";a:4:{s:6:"md5sum";s:32:"44d59b6bdb3555587a3be549beb19451";s:4:"name";s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Bar.php";}s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Foo.php";a:4:{s:6:"md5sum";s:32:"89c3f524e25d5abff91ddae0a9aa39f8";s:4:"name";s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Foo.php";}s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Bar.php";a:4:{s:6:"md5sum";s:32:"59093638625c5324d12879437e82ac23";s:4:"name";s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Bar.php";}s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Foo.php";a:4:{s:6:"md5sum";s:32:"3a0c0cab70920049cf7c910659bbdddb";s:4:"name";s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Foo.php";}s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Bar.php";a:4:{s:6:"md5sum";s:32:"9affd828e7b937fa5dab9348a1c106c3";s:4:"name";s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Bar.php";}s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Foo.php";a:4:{s:6:"md5sum";s:32:"565482b47ad54f50794890243d517198";s:4:"name";s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Foo.php";}s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Bar.php";a:4:{s:6:"md5sum";s:32:"3f41e3c6878caa34053b0df735fd06d4";s:4:"name";s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Bar.php";}s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Foo.php";a:4:{s:6:"md5sum";s:32:"199f5fc8858ff6ba24e9a1927a436a1f";s:4:"name";s:87:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:134:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Foo.php";}s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Bar.php";a:4:{s:6:"md5sum";s:32:"88f045e809ca7fb0c18dfdbb7bbedbfc";s:4:"name";s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Bar.php";}s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Foo.php";a:4:{s:6:"md5sum";s:32:"0a6020428498f5d43bdd1871bdfe5fff";s:4:"name";s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Foo.php";}s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Bar.php";a:4:{s:6:"md5sum";s:32:"133c40a5d435bb2607fcaba19a177e92";s:4:"name";s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Bar.php";}s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Foo.php";a:4:{s:6:"md5sum";s:32:"b4809859bdbb243d35edfa3da736c859";s:4:"name";s:88:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:135:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Foo.php";}s:81:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Apc/Pearlike/FooBar.php";a:4:{s:6:"md5sum";s:32:"83f27620b7ba2c11696bdf11716d223d";s:4:"name";s:81:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Apc/Pearlike/FooBar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:128:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Apc/Pearlike/FooBar.php";}s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Namespaced/FooBar.php";a:4:{s:6:"md5sum";s:32:"03276dc89dca3856b642091121781aa7";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Namespaced/FooBar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Namespaced/FooBar.php";}s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Bar.php";a:4:{s:6:"md5sum";s:32:"450ce1f75995d3855e2890174cad81c9";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Bar.php";}s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Baz.php";a:4:{s:6:"md5sum";s:32:"272f5b10737a621697301cef1fd00c34";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Baz.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Baz.php";}s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Foo.php";a:4:{s:6:"md5sum";s:32:"b52382287fd5a64b85c707f0841c797d";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Foo.php";}s:70:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/FooBar.php";a:4:{s:6:"md5sum";s:32:"03276dc89dca3856b642091121781aa7";s:4:"name";s:70:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/FooBar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/FooBar.php";}s:65:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Bar.php";a:4:{s:6:"md5sum";s:32:"5d889368e4bd7b30ea2179f77d82816f";s:4:"name";s:65:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Bar.php";}s:65:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Baz.php";a:4:{s:6:"md5sum";s:32:"03ca66795cd12fdb9d39b41825906973";s:4:"name";s:65:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Baz.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Baz.php";}s:65:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Foo.php";a:4:{s:6:"md5sum";s:32:"f2002a4177d860d4b3763db043f9776f";s:4:"name";s:65:"Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Foo.php";}s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Bar.php";a:4:{s:6:"md5sum";s:32:"1234b8d86aed91dae669333ff5ae887f";s:4:"name";s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Bar.php";}s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Foo.php";a:4:{s:6:"md5sum";s:32:"c3ff0020d627887437102f59aaa6d5a0";s:4:"name";s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Foo.php";}s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Bar.php";a:4:{s:6:"md5sum";s:32:"16acd0ac1810324ade58e7f527b11721";s:4:"name";s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Bar.php";}s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Foo.php";a:4:{s:6:"md5sum";s:32:"cbe4fddcef55d82678ce042506df312e";s:4:"name";s:80:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:127:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Foo.php";}s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Bar.php";a:4:{s:6:"md5sum";s:32:"7171280695f683129338bbc9127e8a5b";s:4:"name";s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Bar.php";}s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Foo.php";a:4:{s:6:"md5sum";s:32:"64b36c967661286fb774e010be84b5fc";s:4:"name";s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Foo.php";}s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Bar.php";a:4:{s:6:"md5sum";s:32:"d01e56d7432f31c185ea81acd0c3e43e";s:4:"name";s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Bar.php";}s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Foo.php";a:4:{s:6:"md5sum";s:32:"8c8934c39f7727374b802bea9c0892eb";s:4:"name";s:77:"Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:124:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Foo.php";}s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.php";a:4:{s:6:"md5sum";s:32:"c0ba313164bfc6fc725c67e515af6368";s:4:"name";s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.php";}s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/ATrait.php";a:4:{s:6:"md5sum";s:32:"c718b10e49ff27e12c0674e674e85a6b";s:4:"name";s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/ATrait.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/ATrait.php";}s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.php";a:4:{s:6:"md5sum";s:32:"0322eeaef5105762706853bd4445f92d";s:4:"name";s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.php";}s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/BTrait.php";a:4:{s:6:"md5sum";s:32:"f6d6d69da53085f34b2363d23081783f";s:4:"name";s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/BTrait.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/BTrait.php";}s:78:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CInterface.php";a:4:{s:6:"md5sum";s:32:"ea775929d42f58af393b4f224c59b1c9";s:4:"name";s:78:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CInterface.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CInterface.php";}s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CTrait.php";a:4:{s:6:"md5sum";s:32:"f925be736833be1a46dcb4878537cfe3";s:4:"name";s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CTrait.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CTrait.php";}s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/D.php";a:4:{s:6:"md5sum";s:32:"d1a43cd2eb1d650a46793b4324717801";s:4:"name";s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/D.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/D.php";}s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/E.php";a:4:{s:6:"md5sum";s:32:"676dc682573657553221b8997da6fe5f";s:4:"name";s:69:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/E.php";s:4:"role";s:4:"test";s:12:"installed_as";s:116:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/E.php";}s:78:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/GInterface.php";a:4:{s:6:"md5sum";s:32:"6ea7e288f1a6c11ad35be1011275cf49";s:4:"name";s:78:"Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/GInterface.php";s:4:"role";s:4:"test";s:12:"installed_as";s:125:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/GInterface.php";}s:68:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.php";a:4:{s:6:"md5sum";s:32:"087217e8655325395af4f0dec57cde9b";s:4:"name";s:68:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.php";}s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notAClass.php";a:4:{s:6:"md5sum";s:32:"439f18e59d963c281150e47387e575e9";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notAClass.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notAClass.php";}s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notPhpFile.md";a:4:{s:6:"md5sum";s:32:"959a2c47ea204306eccdd8fb6bf09d9c";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notPhpFile.md";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notPhpFile.md";}s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.php";a:4:{s:6:"md5sum";s:32:"23a88b412716678374cb83b3bd84f281";s:4:"name";s:79:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.php";s:4:"role";s:4:"test";s:12:"installed_as";s:126:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.php";}s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.php";a:4:{s:6:"md5sum";s:32:"e4d922295055f51230604c8e3d231eae";s:4:"name";s:67:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.php";s:4:"role";s:4:"test";s:12:"installed_as";s:114:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.php";}s:71:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.php";a:4:{s:6:"md5sum";s:32:"b183b2f81d0a3580b8494e2a315b5c0f";s:4:"name";s:71:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.php";s:4:"role";s:4:"test";s:12:"installed_as";s:118:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.php";}s:68:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.php";a:4:{s:6:"md5sum";s:32:"3925f28e4b3d85670506ec8f20ad5c1a";s:4:"name";s:68:"Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.php";s:4:"role";s:4:"test";s:12:"installed_as";s:115:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.php";}s:60:"Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.php";a:4:{s:6:"md5sum";s:32:"bbbb1f58e6ce45f7f2fcf18009537d34";s:4:"name";s:60:"Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.php";}s:75:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced/FooBar.php";a:4:{s:6:"md5sum";s:32:"4bc49eb260c97d801f0c924b3cbb9e83";s:4:"name";s:75:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced/FooBar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:122:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced/FooBar.php";}s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced2/FooBar.php";a:4:{s:6:"md5sum";s:32:"7f38452cd551fb2149367bc6b11329e2";s:4:"name";s:76:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced2/FooBar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:123:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced2/FooBar.php";}s:73:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike/FooBar.php";a:4:{s:6:"md5sum";s:32:"f8188170d810646eafce22ad6458c37c";s:4:"name";s:73:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike/FooBar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:120:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike/FooBar.php";}s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike2/FooBar.php";a:4:{s:6:"md5sum";s:32:"fe464b289785a184fb96897588e17915";s:4:"name";s:74:"Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike2/FooBar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:121:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike2/FooBar.php";}s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/includepath/Foo.php";a:4:{s:6:"md5sum";s:32:"22c1ff3bd402ac54f7663e249ee27265";s:4:"name";s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/includepath/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/includepath/Foo.php";}s:63:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Bar.php";a:4:{s:6:"md5sum";s:32:"0bd20d6bd956d80ab403aab7ec1692d3";s:4:"name";s:63:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Bar.php";}s:63:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Baz.php";a:4:{s:6:"md5sum";s:32:"669a66483c0b6c6d301928afdc9c4e4f";s:4:"name";s:63:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Baz.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Baz.php";}s:63:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Foo.php";a:4:{s:6:"md5sum";s:32:"004debf153631e65aa55a6a595f5e859";s:4:"name";s:63:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Foo.php";}s:72:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/WithComments.php";a:4:{s:6:"md5sum";s:32:"63773f312e4568035cea34d1e7049f93";s:4:"name";s:72:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/WithComments.php";s:4:"role";s:4:"test";s:12:"installed_as";s:119:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/WithComments.php";}s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Bar.php";a:4:{s:6:"md5sum";s:32:"0e1341c26bd5098d0666416a99328602";s:4:"name";s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Bar.php";}s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Baz.php";a:4:{s:6:"md5sum";s:32:"f7037244d76da1670a0b6ab35980d735";s:4:"name";s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Baz.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Baz.php";}s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Foo.php";a:4:{s:6:"md5sum";s:32:"7017318cc8fb7cb1b43f1f7caf023e5b";s:4:"name";s:64:"Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Foo.php";}s:61:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Bar.php";a:4:{s:6:"md5sum";s:32:"092caf7c7dda0fd29b6a4eb94e16e8c7";s:4:"name";s:61:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Bar.php";}s:61:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Baz.php";a:4:{s:6:"md5sum";s:32:"7ec330e5918e68855ea1928650677c2e";s:4:"name";s:61:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Baz.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Baz.php";}s:61:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Foo.php";a:4:{s:6:"md5sum";s:32:"2ccc8e12aac56ba8a19cc5749f4ddef6";s:4:"name";s:61:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Foo.php";}s:70:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/WithComments.php";a:4:{s:6:"md5sum";s:32:"8d6f9450b4d45d80d880d449c0f8ec73";s:4:"name";s:70:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/WithComments.php";s:4:"role";s:4:"test";s:12:"installed_as";s:117:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/WithComments.php";}s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Bar.php";a:4:{s:6:"md5sum";s:32:"43c84f5dcf75beec1d21efa12d74d135";s:4:"name";s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Bar.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Bar.php";}s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Baz.php";a:4:{s:6:"md5sum";s:32:"14a87e5a8699b57391eff2c94f576c18";s:4:"name";s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Baz.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Baz.php";}s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Foo.php";a:4:{s:6:"md5sum";s:32:"ed2a4f5ef1c5a5b94181d4caff23caff";s:4:"name";s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Foo.php";}s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.php";a:4:{s:6:"md5sum";s:32:"d560ea07154ede9772e22e33f7ef7628";s:4:"name";s:62:"Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.php";s:4:"role";s:4:"test";s:12:"installed_as";s:109:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.php";}s:64:"Symfony/Component/ClassLoader/Tests/UniversalClassLoaderTest.php";a:4:{s:6:"md5sum";s:32:"393a45c8a8fc03e36dd139563e531f89";s:4:"name";s:64:"Symfony/Component/ClassLoader/Tests/UniversalClassLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:111:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/UniversalClassLoaderTest.php";}s:54:"Symfony/Component/ClassLoader/UniversalClassLoader.php";a:4:{s:6:"md5sum";s:32:"aaf07f8f264c4476277d3fc72ce31258";s:4:"name";s:54:"Symfony/Component/ClassLoader/UniversalClassLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/UniversalClassLoader.php";}s:53:"Symfony/Component/ClassLoader/WinCacheClassLoader.php";a:4:{s:6:"md5sum";s:32:"c41f5cdde6c04556fa520cb0eaecb4f1";s:4:"name";s:53:"Symfony/Component/ClassLoader/WinCacheClassLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/WinCacheClassLoader.php";}s:51:"Symfony/Component/ClassLoader/XcacheClassLoader.php";a:4:{s:6:"md5sum";s:32:"626c7922f978832591daa87ec9388708";s:4:"name";s:51:"Symfony/Component/ClassLoader/XcacheClassLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader/XcacheClassLoader.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:66:{s:59:"/opt/alt/php54/usr/share/pear/Symfony/Component/ClassLoader";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:75:"/opt/alt/php54/usr/share/doc/pear/ClassLoader/Symfony/Component/ClassLoader";b:1;s:63:"/opt/alt/php54/usr/share/doc/pear/ClassLoader/Symfony/Component";b:1;s:53:"/opt/alt/php54/usr/share/doc/pear/ClassLoader/Symfony";b:1;s:45:"/opt/alt/php54/usr/share/doc/pear/ClassLoader";b:1;s:76:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader";b:1;s:64:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component";b:1;s:54:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony";b:1;s:46:"/opt/alt/php54/usr/share/pear/test/ClassLoader";b:1;s:82:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests";b:1;s:118:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A";b:1;s:116:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision";b:1;s:97:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha";b:1;s:91:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures";b:1;s:118:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C";b:1;s:115:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A";b:1;s:113:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision";b:1;s:115:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C";b:1;s:126:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A";b:1;s:124:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision";b:1;s:105:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc";b:1;s:101:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha";b:1;s:95:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc";b:1;s:126:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A";b:1;s:124:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision";b:1;s:127:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B";b:1;s:125:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A";b:1;s:123:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision";b:1;s:104:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc";b:1;s:100:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta";b:1;s:127:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B";b:1;s:125:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A";b:1;s:123:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision";b:1;s:117:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Apc/Pearlike";b:1;s:108:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Apc";b:1;s:104:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback";b:1;s:115:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Namespaced";b:1;s:106:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced";b:1;s:104:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike";b:1;s:119:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B";b:1;s:117:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A";b:1;s:115:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision";b:1;s:96:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta";b:1;s:119:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B";b:1;s:117:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C";b:1;s:116:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B";b:1;s:114:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A";b:1;s:112:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision";b:1;s:116:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B";b:1;s:114:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C";b:1;s:110:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents";b:1;s:100:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap";b:1;s:96:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/deps";b:1;s:111:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced";b:1;s:100:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback";b:1;s:112:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced2";b:1;s:109:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike";b:1;s:110:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike2";b:1;s:103:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/includepath";b:1;s:102:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced";b:1;s:103:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2";b:1;s:100:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike";b:1;s:101:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2";b:1;s:98:"/opt/alt/php54/usr/share/pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/php5.4";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506492;}PK�^�\��19n9n7pear/.registry/.channel.pear.symfony.com/templating.regnu�[���a:21:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.4";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:10:"Templating";s:7:"channel";s:16:"pear.symfony.com";s:7:"summary";s:29:"Symfony2 Templating Component";s:11:"description";s:29:"Symfony2 Templating Component";s:4:"lead";a:4:{s:4:"name";s:16:"Fabien Potencier";s:4:"user";s:6:"fabpot";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2014-04-05";s:4:"time";s:8:"09:33:50";s:7:"version";a:2:{s:7:"release";s:5:"2.4.3";s:3:"api";s:5:"2.4.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/mit-license.php";}s:8:"_content";s:3:"MIT";}s:5:"notes";s:1:"-";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:48:{i:0;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"06b983618b554cae26b0044aaa5c9d73";s:4:"name";s:46:"Symfony/Component/Templating/Asset/Package.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7e410f0980078e771b887babe9631606";s:4:"name";s:55:"Symfony/Component/Templating/Asset/PackageInterface.php";s:4:"role";s:3:"php";}}i:2;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"232397a846ea18664111f3c1d12ff472";s:4:"name";s:50:"Symfony/Component/Templating/Asset/PathPackage.php";s:4:"role";s:3:"php";}}i:3;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"63a22883dfdbe426044cedb7d53baca1";s:4:"name";s:49:"Symfony/Component/Templating/Asset/UrlPackage.php";s:4:"role";s:3:"php";}}i:4;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"23396df31b16af1e830dfe9e78024cf0";s:4:"name";s:43:"Symfony/Component/Templating/autoloader.php";s:4:"role";s:3:"php";}}i:5;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"89d1f39500f81f0ace0eed9b8faa5551";s:4:"name";s:41:"Symfony/Component/Templating/CHANGELOG.md";s:4:"role";s:3:"doc";}}i:6;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f66f26953286d35a671e8c32cd1681a8";s:4:"name";s:42:"Symfony/Component/Templating/composer.json";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"642fd458181e0187d0feb00b7e0f75e6";s:4:"name";s:50:"Symfony/Component/Templating/DebuggerInterface.php";s:4:"role";s:3:"php";}}i:8;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"349f44b99680e0274463b4bc8a40a297";s:4:"name";s:49:"Symfony/Component/Templating/DelegatingEngine.php";s:4:"role";s:3:"php";}}i:9;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d4d57b7adde79b59d61784e7101bc2b4";s:4:"name";s:48:"Symfony/Component/Templating/EngineInterface.php";s:4:"role";s:3:"php";}}i:10;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"efd612dd3df5651085059babfd618c0c";s:4:"name";s:52:"Symfony/Component/Templating/Helper/AssetsHelper.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"435c9f3811b3c90d60d313b68732d945";s:4:"name";s:56:"Symfony/Component/Templating/Helper/CoreAssetsHelper.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"d8603eef845f79857f5b16070419dd26";s:4:"name";s:46:"Symfony/Component/Templating/Helper/Helper.php";s:4:"role";s:3:"php";}}i:13;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"e8fe75ce7386af338af3950d0034097e";s:4:"name";s:55:"Symfony/Component/Templating/Helper/HelperInterface.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"57b81e8d6ab2d04742b112a8ccb4d872";s:4:"name";s:51:"Symfony/Component/Templating/Helper/SlotsHelper.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/Templating/LICENSE";s:4:"role";s:3:"doc";}}i:16;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"89596c802c4299ca1172753ec423949b";s:4:"name";s:51:"Symfony/Component/Templating/Loader/CacheLoader.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f59523a1dadec70ddced8d1927ffee29";s:4:"name";s:51:"Symfony/Component/Templating/Loader/ChainLoader.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b837a9ec3d5a2db85df099eba2097698";s:4:"name";s:56:"Symfony/Component/Templating/Loader/FilesystemLoader.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"97282ffb972085264fecee72b756b3e6";s:4:"name";s:46:"Symfony/Component/Templating/Loader/Loader.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"109568b82844f26ec90af5c86612c8e9";s:4:"name";s:55:"Symfony/Component/Templating/Loader/LoaderInterface.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"3ac0b6c8fe96f6a29642e44a8b9d5a0e";s:4:"name";s:42:"Symfony/Component/Templating/PhpEngine.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"66cbf2744288df20f1abc6004d0e56d7";s:4:"name";s:45:"Symfony/Component/Templating/phpunit.xml.dist";s:4:"role";s:4:"test";}}i:23;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"9800cdf7c1a285748e75873cd5a2937b";s:4:"name";s:38:"Symfony/Component/Templating/README.md";s:4:"role";s:3:"doc";}}i:24;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"548638b42e7d927ed988b8cc3851f88d";s:4:"name";s:52:"Symfony/Component/Templating/Storage/FileStorage.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a6f76f3ee3f61a03fe53ef24e6cb5ae7";s:4:"name";s:48:"Symfony/Component/Templating/Storage/Storage.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"226ffc381aade4bd7bb108d2c64c5c3f";s:4:"name";s:54:"Symfony/Component/Templating/Storage/StringStorage.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"28196c12bf8f3244d8147af0eb7372a6";s:4:"name";s:57:"Symfony/Component/Templating/StreamingEngineInterface.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"5b776a8c0df58c4fcfaf1e63ff35ffc6";s:4:"name";s:51:"Symfony/Component/Templating/TemplateNameParser.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c2b1e13dc4495ca0f80f699542b170a6";s:4:"name";s:60:"Symfony/Component/Templating/TemplateNameParserInterface.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"306070b0a6238aaac07959f3ea304346";s:4:"name";s:50:"Symfony/Component/Templating/TemplateReference.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"2e255a20204431df5138c0365f7527b5";s:4:"name";s:59:"Symfony/Component/Templating/TemplateReferenceInterface.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"59973b4b1ccd3cc2022355241d9c1461";s:4:"name";s:59:"Symfony/Component/Templating/Tests/DelegatingEngineTest.php";s:4:"role";s:4:"test";}}i:33;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a8ac9b5e185e2ecf3418e612a788bd6c";s:4:"name";s:60:"Symfony/Component/Templating/Tests/Fixtures/SimpleHelper.php";s:4:"role";s:4:"test";}}i:34;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fda093af55ec1dc89ec8745c85eda0d5";s:4:"name";s:61:"Symfony/Component/Templating/Tests/Fixtures/templates/foo.php";s:4:"role";s:4:"test";}}i:35;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"b6505a4ee8e1f29f1f200cad2d44f4cc";s:4:"name";s:62:"Symfony/Component/Templating/Tests/Helper/AssetsHelperTest.php";s:4:"role";s:4:"test";}}i:36;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"a6cf2f490b1f97c2c077bec828d77cd0";s:4:"name";s:66:"Symfony/Component/Templating/Tests/Helper/CoreAssetsHelperTest.php";s:4:"role";s:4:"test";}}i:37;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"7e3bc2e0f3a2d85ba4df24d03a49f72d";s:4:"name";s:56:"Symfony/Component/Templating/Tests/Helper/HelperTest.php";s:4:"role";s:4:"test";}}i:38;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"76d50b1a2294fb8a77d763564d54d396";s:4:"name";s:61:"Symfony/Component/Templating/Tests/Helper/SlotsHelperTest.php";s:4:"role";s:4:"test";}}i:39;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"71bc444643de4a7fbb625bfe0d8b4504";s:4:"name";s:61:"Symfony/Component/Templating/Tests/Loader/CacheLoaderTest.php";s:4:"role";s:4:"test";}}i:40;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f0ff11bbde7e6014a3de882429ec8dfd";s:4:"name";s:61:"Symfony/Component/Templating/Tests/Loader/ChainLoaderTest.php";s:4:"role";s:4:"test";}}i:41;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"bc936938ae234301e0730c88b67d4848";s:4:"name";s:66:"Symfony/Component/Templating/Tests/Loader/FilesystemLoaderTest.php";s:4:"role";s:4:"test";}}i:42;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"ba61470efa3642af0b71ba3c951d344f";s:4:"name";s:56:"Symfony/Component/Templating/Tests/Loader/LoaderTest.php";s:4:"role";s:4:"test";}}i:43;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"f22ccaa9e1bfd0be7d7a4dba394cbd04";s:4:"name";s:52:"Symfony/Component/Templating/Tests/PhpEngineTest.php";s:4:"role";s:4:"test";}}i:44;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"80b97e6950ae0e4db418375f6af09909";s:4:"name";s:62:"Symfony/Component/Templating/Tests/Storage/FileStorageTest.php";s:4:"role";s:4:"test";}}i:45;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"32856c6ce86000b67c21b30b4521b939";s:4:"name";s:58:"Symfony/Component/Templating/Tests/Storage/StorageTest.php";s:4:"role";s:4:"test";}}i:46;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"fc4254f64c0206186a69673bd355b74b";s:4:"name";s:64:"Symfony/Component/Templating/Tests/Storage/StringStorageTest.php";s:4:"role";s:4:"test";}}i:47;a:1:{s:7:"attribs";a:3:{s:6:"md5sum";s:32:"c9a0c56b51df4382d0628855d9ebf395";s:4:"name";s:61:"Symfony/Component/Templating/Tests/TemplateNameParserTest.php";s:4:"role";s:4:"test";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.3.2";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.0";}}}s:10:"phprelease";s:0:"";s:8:"filelist";a:48:{s:46:"Symfony/Component/Templating/Asset/Package.php";a:4:{s:6:"md5sum";s:32:"06b983618b554cae26b0044aaa5c9d73";s:4:"name";s:46:"Symfony/Component/Templating/Asset/Package.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Asset/Package.php";}s:55:"Symfony/Component/Templating/Asset/PackageInterface.php";a:4:{s:6:"md5sum";s:32:"7e410f0980078e771b887babe9631606";s:4:"name";s:55:"Symfony/Component/Templating/Asset/PackageInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Asset/PackageInterface.php";}s:50:"Symfony/Component/Templating/Asset/PathPackage.php";a:4:{s:6:"md5sum";s:32:"232397a846ea18664111f3c1d12ff472";s:4:"name";s:50:"Symfony/Component/Templating/Asset/PathPackage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Asset/PathPackage.php";}s:49:"Symfony/Component/Templating/Asset/UrlPackage.php";a:4:{s:6:"md5sum";s:32:"63a22883dfdbe426044cedb7d53baca1";s:4:"name";s:49:"Symfony/Component/Templating/Asset/UrlPackage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Asset/UrlPackage.php";}s:43:"Symfony/Component/Templating/autoloader.php";a:4:{s:6:"md5sum";s:32:"23396df31b16af1e830dfe9e78024cf0";s:4:"name";s:43:"Symfony/Component/Templating/autoloader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/autoloader.php";}s:41:"Symfony/Component/Templating/CHANGELOG.md";a:4:{s:6:"md5sum";s:32:"89d1f39500f81f0ace0eed9b8faa5551";s:4:"name";s:41:"Symfony/Component/Templating/CHANGELOG.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/doc/pear/Templating/Symfony/Component/Templating/CHANGELOG.md";}s:42:"Symfony/Component/Templating/composer.json";a:4:{s:6:"md5sum";s:32:"f66f26953286d35a671e8c32cd1681a8";s:4:"name";s:42:"Symfony/Component/Templating/composer.json";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/Templating/Symfony/Component/Templating/composer.json";}s:50:"Symfony/Component/Templating/DebuggerInterface.php";a:4:{s:6:"md5sum";s:32:"642fd458181e0187d0feb00b7e0f75e6";s:4:"name";s:50:"Symfony/Component/Templating/DebuggerInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/DebuggerInterface.php";}s:49:"Symfony/Component/Templating/DelegatingEngine.php";a:4:{s:6:"md5sum";s:32:"349f44b99680e0274463b4bc8a40a297";s:4:"name";s:49:"Symfony/Component/Templating/DelegatingEngine.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/DelegatingEngine.php";}s:48:"Symfony/Component/Templating/EngineInterface.php";a:4:{s:6:"md5sum";s:32:"d4d57b7adde79b59d61784e7101bc2b4";s:4:"name";s:48:"Symfony/Component/Templating/EngineInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/EngineInterface.php";}s:52:"Symfony/Component/Templating/Helper/AssetsHelper.php";a:4:{s:6:"md5sum";s:32:"efd612dd3df5651085059babfd618c0c";s:4:"name";s:52:"Symfony/Component/Templating/Helper/AssetsHelper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Helper/AssetsHelper.php";}s:56:"Symfony/Component/Templating/Helper/CoreAssetsHelper.php";a:4:{s:6:"md5sum";s:32:"435c9f3811b3c90d60d313b68732d945";s:4:"name";s:56:"Symfony/Component/Templating/Helper/CoreAssetsHelper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Helper/CoreAssetsHelper.php";}s:46:"Symfony/Component/Templating/Helper/Helper.php";a:4:{s:6:"md5sum";s:32:"d8603eef845f79857f5b16070419dd26";s:4:"name";s:46:"Symfony/Component/Templating/Helper/Helper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Helper/Helper.php";}s:55:"Symfony/Component/Templating/Helper/HelperInterface.php";a:4:{s:6:"md5sum";s:32:"e8fe75ce7386af338af3950d0034097e";s:4:"name";s:55:"Symfony/Component/Templating/Helper/HelperInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Helper/HelperInterface.php";}s:51:"Symfony/Component/Templating/Helper/SlotsHelper.php";a:4:{s:6:"md5sum";s:32:"57b81e8d6ab2d04742b112a8ccb4d872";s:4:"name";s:51:"Symfony/Component/Templating/Helper/SlotsHelper.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Helper/SlotsHelper.php";}s:36:"Symfony/Component/Templating/LICENSE";a:4:{s:6:"md5sum";s:32:"09ce405e925cdeb923da1789121864c7";s:4:"name";s:36:"Symfony/Component/Templating/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/doc/pear/Templating/Symfony/Component/Templating/LICENSE";}s:51:"Symfony/Component/Templating/Loader/CacheLoader.php";a:4:{s:6:"md5sum";s:32:"89596c802c4299ca1172753ec423949b";s:4:"name";s:51:"Symfony/Component/Templating/Loader/CacheLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Loader/CacheLoader.php";}s:51:"Symfony/Component/Templating/Loader/ChainLoader.php";a:4:{s:6:"md5sum";s:32:"f59523a1dadec70ddced8d1927ffee29";s:4:"name";s:51:"Symfony/Component/Templating/Loader/ChainLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Loader/ChainLoader.php";}s:56:"Symfony/Component/Templating/Loader/FilesystemLoader.php";a:4:{s:6:"md5sum";s:32:"b837a9ec3d5a2db85df099eba2097698";s:4:"name";s:56:"Symfony/Component/Templating/Loader/FilesystemLoader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:86:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Loader/FilesystemLoader.php";}s:46:"Symfony/Component/Templating/Loader/Loader.php";a:4:{s:6:"md5sum";s:32:"97282ffb972085264fecee72b756b3e6";s:4:"name";s:46:"Symfony/Component/Templating/Loader/Loader.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Loader/Loader.php";}s:55:"Symfony/Component/Templating/Loader/LoaderInterface.php";a:4:{s:6:"md5sum";s:32:"109568b82844f26ec90af5c86612c8e9";s:4:"name";s:55:"Symfony/Component/Templating/Loader/LoaderInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Loader/LoaderInterface.php";}s:42:"Symfony/Component/Templating/PhpEngine.php";a:4:{s:6:"md5sum";s:32:"3ac0b6c8fe96f6a29642e44a8b9d5a0e";s:4:"name";s:42:"Symfony/Component/Templating/PhpEngine.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/PhpEngine.php";}s:45:"Symfony/Component/Templating/phpunit.xml.dist";a:4:{s:6:"md5sum";s:32:"66cbf2744288df20f1abc6004d0e56d7";s:4:"name";s:45:"Symfony/Component/Templating/phpunit.xml.dist";s:4:"role";s:4:"test";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/phpunit.xml.dist";}s:38:"Symfony/Component/Templating/README.md";a:4:{s:6:"md5sum";s:32:"9800cdf7c1a285748e75873cd5a2937b";s:4:"name";s:38:"Symfony/Component/Templating/README.md";s:4:"role";s:3:"doc";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/doc/pear/Templating/Symfony/Component/Templating/README.md";}s:52:"Symfony/Component/Templating/Storage/FileStorage.php";a:4:{s:6:"md5sum";s:32:"548638b42e7d927ed988b8cc3851f88d";s:4:"name";s:52:"Symfony/Component/Templating/Storage/FileStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Storage/FileStorage.php";}s:48:"Symfony/Component/Templating/Storage/Storage.php";a:4:{s:6:"md5sum";s:32:"a6f76f3ee3f61a03fe53ef24e6cb5ae7";s:4:"name";s:48:"Symfony/Component/Templating/Storage/Storage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Storage/Storage.php";}s:54:"Symfony/Component/Templating/Storage/StringStorage.php";a:4:{s:6:"md5sum";s:32:"226ffc381aade4bd7bb108d2c64c5c3f";s:4:"name";s:54:"Symfony/Component/Templating/Storage/StringStorage.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Storage/StringStorage.php";}s:57:"Symfony/Component/Templating/StreamingEngineInterface.php";a:4:{s:6:"md5sum";s:32:"28196c12bf8f3244d8147af0eb7372a6";s:4:"name";s:57:"Symfony/Component/Templating/StreamingEngineInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/StreamingEngineInterface.php";}s:51:"Symfony/Component/Templating/TemplateNameParser.php";a:4:{s:6:"md5sum";s:32:"5b776a8c0df58c4fcfaf1e63ff35ffc6";s:4:"name";s:51:"Symfony/Component/Templating/TemplateNameParser.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/TemplateNameParser.php";}s:60:"Symfony/Component/Templating/TemplateNameParserInterface.php";a:4:{s:6:"md5sum";s:32:"c2b1e13dc4495ca0f80f699542b170a6";s:4:"name";s:60:"Symfony/Component/Templating/TemplateNameParserInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/TemplateNameParserInterface.php";}s:50:"Symfony/Component/Templating/TemplateReference.php";a:4:{s:6:"md5sum";s:32:"306070b0a6238aaac07959f3ea304346";s:4:"name";s:50:"Symfony/Component/Templating/TemplateReference.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/TemplateReference.php";}s:59:"Symfony/Component/Templating/TemplateReferenceInterface.php";a:4:{s:6:"md5sum";s:32:"2e255a20204431df5138c0365f7527b5";s:4:"name";s:59:"Symfony/Component/Templating/TemplateReferenceInterface.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/TemplateReferenceInterface.php";}s:59:"Symfony/Component/Templating/Tests/DelegatingEngineTest.php";a:4:{s:6:"md5sum";s:32:"59973b4b1ccd3cc2022355241d9c1461";s:4:"name";s:59:"Symfony/Component/Templating/Tests/DelegatingEngineTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:105:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/DelegatingEngineTest.php";}s:60:"Symfony/Component/Templating/Tests/Fixtures/SimpleHelper.php";a:4:{s:6:"md5sum";s:32:"a8ac9b5e185e2ecf3418e612a788bd6c";s:4:"name";s:60:"Symfony/Component/Templating/Tests/Fixtures/SimpleHelper.php";s:4:"role";s:4:"test";s:12:"installed_as";s:106:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Fixtures/SimpleHelper.php";}s:61:"Symfony/Component/Templating/Tests/Fixtures/templates/foo.php";a:4:{s:6:"md5sum";s:32:"fda093af55ec1dc89ec8745c85eda0d5";s:4:"name";s:61:"Symfony/Component/Templating/Tests/Fixtures/templates/foo.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Fixtures/templates/foo.php";}s:62:"Symfony/Component/Templating/Tests/Helper/AssetsHelperTest.php";a:4:{s:6:"md5sum";s:32:"b6505a4ee8e1f29f1f200cad2d44f4cc";s:4:"name";s:62:"Symfony/Component/Templating/Tests/Helper/AssetsHelperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Helper/AssetsHelperTest.php";}s:66:"Symfony/Component/Templating/Tests/Helper/CoreAssetsHelperTest.php";a:4:{s:6:"md5sum";s:32:"a6cf2f490b1f97c2c077bec828d77cd0";s:4:"name";s:66:"Symfony/Component/Templating/Tests/Helper/CoreAssetsHelperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Helper/CoreAssetsHelperTest.php";}s:56:"Symfony/Component/Templating/Tests/Helper/HelperTest.php";a:4:{s:6:"md5sum";s:32:"7e3bc2e0f3a2d85ba4df24d03a49f72d";s:4:"name";s:56:"Symfony/Component/Templating/Tests/Helper/HelperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Helper/HelperTest.php";}s:61:"Symfony/Component/Templating/Tests/Helper/SlotsHelperTest.php";a:4:{s:6:"md5sum";s:32:"76d50b1a2294fb8a77d763564d54d396";s:4:"name";s:61:"Symfony/Component/Templating/Tests/Helper/SlotsHelperTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Helper/SlotsHelperTest.php";}s:61:"Symfony/Component/Templating/Tests/Loader/CacheLoaderTest.php";a:4:{s:6:"md5sum";s:32:"71bc444643de4a7fbb625bfe0d8b4504";s:4:"name";s:61:"Symfony/Component/Templating/Tests/Loader/CacheLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Loader/CacheLoaderTest.php";}s:61:"Symfony/Component/Templating/Tests/Loader/ChainLoaderTest.php";a:4:{s:6:"md5sum";s:32:"f0ff11bbde7e6014a3de882429ec8dfd";s:4:"name";s:61:"Symfony/Component/Templating/Tests/Loader/ChainLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Loader/ChainLoaderTest.php";}s:66:"Symfony/Component/Templating/Tests/Loader/FilesystemLoaderTest.php";a:4:{s:6:"md5sum";s:32:"bc936938ae234301e0730c88b67d4848";s:4:"name";s:66:"Symfony/Component/Templating/Tests/Loader/FilesystemLoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:112:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Loader/FilesystemLoaderTest.php";}s:56:"Symfony/Component/Templating/Tests/Loader/LoaderTest.php";a:4:{s:6:"md5sum";s:32:"ba61470efa3642af0b71ba3c951d344f";s:4:"name";s:56:"Symfony/Component/Templating/Tests/Loader/LoaderTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:102:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Loader/LoaderTest.php";}s:52:"Symfony/Component/Templating/Tests/PhpEngineTest.php";a:4:{s:6:"md5sum";s:32:"f22ccaa9e1bfd0be7d7a4dba394cbd04";s:4:"name";s:52:"Symfony/Component/Templating/Tests/PhpEngineTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:98:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/PhpEngineTest.php";}s:62:"Symfony/Component/Templating/Tests/Storage/FileStorageTest.php";a:4:{s:6:"md5sum";s:32:"80b97e6950ae0e4db418375f6af09909";s:4:"name";s:62:"Symfony/Component/Templating/Tests/Storage/FileStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:108:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Storage/FileStorageTest.php";}s:58:"Symfony/Component/Templating/Tests/Storage/StorageTest.php";a:4:{s:6:"md5sum";s:32:"32856c6ce86000b67c21b30b4521b939";s:4:"name";s:58:"Symfony/Component/Templating/Tests/Storage/StorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:104:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Storage/StorageTest.php";}s:64:"Symfony/Component/Templating/Tests/Storage/StringStorageTest.php";a:4:{s:6:"md5sum";s:32:"fc4254f64c0206186a69673bd355b74b";s:4:"name";s:64:"Symfony/Component/Templating/Tests/Storage/StringStorageTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:110:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Storage/StringStorageTest.php";}s:61:"Symfony/Component/Templating/Tests/TemplateNameParserTest.php";a:4:{s:6:"md5sum";s:32:"c9a0c56b51df4382d0628855d9ebf395";s:4:"name";s:61:"Symfony/Component/Templating/Tests/TemplateNameParserTest.php";s:4:"role";s:4:"test";s:12:"installed_as";s:107:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/TemplateNameParserTest.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:21:{s:64:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Asset";b:1;s:58:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating";b:1;s:47:"/opt/alt/php54/usr/share/pear/Symfony/Component";b:1;s:37:"/opt/alt/php54/usr/share/pear/Symfony";b:1;s:73:"/opt/alt/php54/usr/share/doc/pear/Templating/Symfony/Component/Templating";b:1;s:62:"/opt/alt/php54/usr/share/doc/pear/Templating/Symfony/Component";b:1;s:52:"/opt/alt/php54/usr/share/doc/pear/Templating/Symfony";b:1;s:44:"/opt/alt/php54/usr/share/doc/pear/Templating";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Helper";b:1;s:65:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Loader";b:1;s:74:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating";b:1;s:63:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component";b:1;s:53:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony";b:1;s:45:"/opt/alt/php54/usr/share/pear/test/Templating";b:1;s:66:"/opt/alt/php54/usr/share/pear/Symfony/Component/Templating/Storage";b:1;s:80:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests";b:1;s:89:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Fixtures";b:1;s:99:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Fixtures/templates";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Helper";b:1;s:87:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Loader";b:1;s:88:"/opt/alt/php54/usr/share/pear/test/Templating/Symfony/Component/Templating/Tests/Storage";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"2.4.3";s:12:"release_date";s:10:"2014-04-05";s:13:"release_state";s:6:"stable";s:15:"release_license";s:3:"MIT";s:13:"release_notes";s:1:"-";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.3.2";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:16:"Fabien Potencier";s:5:"email";s:18:"fabien@symfony.com";s:6:"active";s:3:"yes";s:6:"handle";s:6:"fabpot";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506494;}PK�^�\塕""1pear/.registry/.channel.components.ez.no/file.regnu�[���a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.6.1";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:4:"File";s:7:"channel";s:16:"components.ez.no";s:7:"summary";s:77:"Provides support for file operations which are not covered by PHP or are just";s:11:"description";s:86:"Provides support for file operations which are not covered by PHP or are just
missing.";s:4:"lead";a:4:{s:4:"name";s:10:"eZ systems";s:4:"user";s:3:"ezc";s:5:"email";s:9:"ezc@ez.no";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2007-12-17";s:4:"time";s:8:"10:05:20";s:7:"version";a:2:{s:7:"release";s:3:"1.2";s:3:"api";s:3:"1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";s:7:"New BSD";s:5:"notes";s:13:"- No changes.";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:13:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1fea496598ff896af1a9e9c8d0ec2121";s:4:"name";s:24:"design/class_diagram.png";s:4:"role";s:4:"data";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4df8185638df9786f8623e98731a5fba";s:4:"name";s:17:"design/design.txt";s:4:"role";s:4:"data";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e66684eedcbb29f0bcec8785edeb2746";s:4:"name";s:15:"design/file.xml";s:4:"role";s:4:"data";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b41ecc87d2a775fbb5eb91df085b4990";s:4:"name";s:26:"design/file_operations.png";s:4:"role";s:4:"data";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f5c40ec66e89cf17fb8dad4c0c8c8f4b";s:4:"name";s:14:"design/md5.png";s:4:"role";s:4:"data";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3a728985b18b3c682c1977f2d6cece89";s:4:"name";s:23:"design/requirements.txt";s:4:"role";s:4:"data";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6a44661d8d0ed5dea17e26938c1c388c";s:4:"name";s:12:"docs/CREDITS";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9b53d942ef8c5a2d0e17e527c8c18792";s:4:"name";s:12:"docs/LICENSE";s:4:"role";s:3:"doc";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e062103b8204517acbbbc57ed1a79bfa";s:4:"name";s:17:"docs/tutorial.txt";s:4:"role";s:3:"doc";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e13077f15f79b21c318dc328bdc789c4";s:4:"name";s:26:"docs/tutorial_autoload.php";s:4:"role";s:3:"doc";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6f5a826d9e4ac53914069ecf9599c90e";s:4:"name";s:30:"ezc/autoload/file_autoload.php";s:4:"role";s:3:"php";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e4017db6ff3d10118bd3b7ed0d50d846";s:4:"name";s:17:"ezc/File/file.php";s:4:"role";s:3:"php";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6f5a826d9e4ac53914069ecf9599c90e";s:4:"name";s:26:"ezc/File/file_autoload.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.1.1";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.2";}s:7:"package";a:3:{s:4:"name";s:4:"Base";s:7:"channel";s:16:"components.ez.no";s:3:"min";s:3:"1.4";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.2";s:3:"api";s:3:"1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-12-17";s:7:"license";s:7:"New BSD";s:5:"notes";s:13:"- No changes.";}}s:8:"filelist";a:13:{s:24:"design/class_diagram.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1fea496598ff896af1a9e9c8d0ec2121";s:4:"name";s:24:"design/class_diagram.png";s:4:"role";s:4:"data";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/data/File/design/class_diagram.png";}s:17:"design/design.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4df8185638df9786f8623e98731a5fba";s:4:"name";s:17:"design/design.txt";s:4:"role";s:4:"data";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/data/File/design/design.txt";}s:15:"design/file.xml";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e66684eedcbb29f0bcec8785edeb2746";s:4:"name";s:15:"design/file.xml";s:4:"role";s:4:"data";s:12:"installed_as";s:55:"/opt/alt/php54/usr/share/pear/data/File/design/file.xml";}s:26:"design/file_operations.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b41ecc87d2a775fbb5eb91df085b4990";s:4:"name";s:26:"design/file_operations.png";s:4:"role";s:4:"data";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/data/File/design/file_operations.png";}s:14:"design/md5.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f5c40ec66e89cf17fb8dad4c0c8c8f4b";s:4:"name";s:14:"design/md5.png";s:4:"role";s:4:"data";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/pear/data/File/design/md5.png";}s:23:"design/requirements.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3a728985b18b3c682c1977f2d6cece89";s:4:"name";s:23:"design/requirements.txt";s:4:"role";s:4:"data";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/data/File/design/requirements.txt";}s:12:"docs/CREDITS";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6a44661d8d0ed5dea17e26938c1c388c";s:4:"name";s:12:"docs/CREDITS";s:4:"role";s:3:"doc";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/doc/pear/File/docs/CREDITS";}s:12:"docs/LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9b53d942ef8c5a2d0e17e527c8c18792";s:4:"name";s:12:"docs/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/doc/pear/File/docs/LICENSE";}s:17:"docs/tutorial.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e062103b8204517acbbbc57ed1a79bfa";s:4:"name";s:17:"docs/tutorial.txt";s:4:"role";s:3:"doc";s:12:"installed_as";s:56:"/opt/alt/php54/usr/share/doc/pear/File/docs/tutorial.txt";}s:26:"docs/tutorial_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e13077f15f79b21c318dc328bdc789c4";s:4:"name";s:26:"docs/tutorial_autoload.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/doc/pear/File/docs/tutorial_autoload.php";}s:30:"ezc/autoload/file_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6f5a826d9e4ac53914069ecf9599c90e";s:4:"name";s:30:"ezc/autoload/file_autoload.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/ezc/autoload/file_autoload.php";}s:17:"ezc/File/file.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e4017db6ff3d10118bd3b7ed0d50d846";s:4:"name";s:17:"ezc/File/file.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php54/usr/share/pear/ezc/File/file.php";}s:26:"ezc/File/file_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6f5a826d9e4ac53914069ecf9599c90e";s:4:"name";s:26:"ezc/File/file_autoload.php";s:4:"role";s:3:"php";s:12:"installed_as";s:56:"/opt/alt/php54/usr/share/pear/ezc/File/file_autoload.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:7:{s:46:"/opt/alt/php54/usr/share/pear/data/File/design";b:1;s:39:"/opt/alt/php54/usr/share/pear/data/File";b:1;s:43:"/opt/alt/php54/usr/share/doc/pear/File/docs";b:1;s:38:"/opt/alt/php54/usr/share/doc/pear/File";b:1;s:42:"/opt/alt/php54/usr/share/pear/ezc/autoload";b:1;s:33:"/opt/alt/php54/usr/share/pear/ezc";b:1;s:38:"/opt/alt/php54/usr/share/pear/ezc/File";b:1;}s:3:"old";a:7:{s:7:"version";s:3:"1.2";s:12:"release_date";s:10:"2007-12-17";s:13:"release_state";s:6:"stable";s:15:"release_license";s:7:"New BSD";s:13:"release_notes";s:13:"- No changes.";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.1.1";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.2";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"components.ez.no";s:4:"name";s:4:"Base";s:3:"rel";s:2:"ge";s:7:"version";s:3:"1.4";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:10:"eZ systems";s:5:"email";s:9:"ezc@ez.no";s:6:"active";s:3:"yes";s:6:"handle";s:3:"ezc";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506490;}PK�^�\���4p4p1pear/.registry/.channel.components.ez.no/base.regnu�[���a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.0";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:4:"Base";s:7:"channel";s:16:"components.ez.no";s:7:"summary";s:77:"The Base package provides the basic infrastructure that all packages rely on.";s:11:"description";s:127:"The Base package provides the basic infrastructure that all packages rely on.
Therefore every component relies on this package.";s:4:"lead";a:4:{s:4:"name";s:10:"eZ systems";s:4:"user";s:3:"ezc";s:5:"email";s:9:"ezc@ez.no";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2009-12-21";s:4:"time";s:8:"12:14:24";s:7:"version";a:2:{s:7:"release";s:3:"1.8";s:3:"api";s:3:"1.8";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";s:7:"New BSD";s:5:"notes";s:73:"- Fixed issue #15896: Autoload not working for all lowercase class names.";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:53:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"ab5f9f34361961cc74b309325509e87f";s:4:"name";s:24:"design/class_diagram.png";s:4:"role";s:4:"data";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"64dbc0df23c0142f806e3837a4557c07";s:4:"name";s:17:"design/design.txt";s:4:"role";s:4:"data";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"524b92ec3bf9055dd50e0a527b2f4b9c";s:4:"name";s:36:"docs/repos/autoloads/my_autoload.php";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bd6af5ed742435bd1cdc7f2f4f5b998a";s:4:"name";s:38:"docs/repos/autoloads/your_autoload.php";s:4:"role";s:3:"doc";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1300956dd09bc8fc6346eca3ad5d07d9";s:4:"name";s:26:"docs/repos/Me/myclass1.php";s:4:"role";s:3:"doc";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9f53d279b27b65a325be9274d49f6f74";s:4:"name";s:26:"docs/repos/Me/myclass2.php";s:4:"role";s:3:"doc";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8a4863c1e5bc1b10e25fe78b028acd2f";s:4:"name";s:29:"docs/repos/You/yourclass1.php";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2ff7777b81e887c50b09e23bbaa9c152";s:4:"name";s:29:"docs/repos/You/yourclass2.php";s:4:"role";s:3:"doc";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6a44661d8d0ed5dea17e26938c1c388c";s:4:"name";s:12:"docs/CREDITS";s:4:"role";s:3:"doc";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0d01eec9cb573a51f7cb73a1573c5350";s:4:"name";s:12:"docs/LICENSE";s:4:"role";s:3:"doc";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"15e07d15fb1865740da5a5255da0b330";s:4:"name";s:17:"docs/tutorial.txt";s:4:"role";s:3:"doc";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c62acdb41db6b2f5f90506fda0ffe426";s:4:"name";s:26:"docs/tutorial_autoload.php";s:4:"role";s:3:"doc";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7a4a698465b2dbcf948d5a9abdf16ab6";s:4:"name";s:28:"docs/tutorial_example_01.php";s:4:"role";s:3:"doc";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1493849915073e203c09c0615ad1dc22";s:4:"name";s:28:"docs/tutorial_example_02.php";s:4:"role";s:3:"doc";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"09ddc9170be2be2f9a197823f4fb05b3";s:4:"name";s:28:"docs/tutorial_example_03.php";s:4:"role";s:3:"doc";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c93496ab05d259e2f2867c177a31b9df";s:4:"name";s:28:"docs/tutorial_example_04.php";s:4:"role";s:3:"doc";}}i:16;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f6399aeed38cbc422ba7a95a4cc3e4d1";s:4:"name";s:37:"docs/tutorial_lazy_initialization.php";s:4:"role";s:3:"doc";}}i:17;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bf570452286a6c882531370b75ef4ed5";s:4:"name";s:30:"ezc/autoload/base_autoload.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4cbf7efc1654c118c1ab4013da584ea2";s:4:"name";s:32:"ezc/Base/exceptions/autoload.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"26ae1c2a3243187d8b281a33e28ab388";s:4:"name";s:54:"ezc/Base/exceptions/double_class_repository_prefix.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1b1d2ccf1d83e9f2126ce6d423ad4a06";s:4:"name";s:33:"ezc/Base/exceptions/exception.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d9b8d14dcddd1453d36025842a915c88";s:4:"name";s:43:"ezc/Base/exceptions/extension_not_found.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"83889a8ded5df760a1184a44e64beb08";s:4:"name";s:38:"ezc/Base/exceptions/file_exception.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2a2d0e89497bd188477d43f5a87701d8";s:4:"name";s:31:"ezc/Base/exceptions/file_io.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"cee70f6094d8e6a1da052f3b2e9913ab";s:4:"name";s:38:"ezc/Base/exceptions/file_not_found.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"249cdcf29b1fc357587301d1a8f8a25f";s:4:"name";s:39:"ezc/Base/exceptions/file_permission.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f914328c784c38af9dcb71d6fdbbac42";s:4:"name";s:51:"ezc/Base/exceptions/functionality_not_supported.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9ae4f81ab15f52153132439840096a47";s:4:"name";s:48:"ezc/Base/exceptions/init_callback_configured.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f4f5f5d9599ea1cdde2929e4dbbcbdbe";s:4:"name";s:46:"ezc/Base/exceptions/invalid_callback_class.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"416b95f88e0480547b51340afef5d647";s:4:"name";s:44:"ezc/Base/exceptions/invalid_parent_class.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e6147c51e29536df0683a49aeab920e8";s:4:"name";s:42:"ezc/Base/exceptions/property_not_found.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"58e2f2dc39f347b59a1afc957a8cdfcd";s:4:"name";s:43:"ezc/Base/exceptions/property_permission.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8b95e40352468ff28126fc02abc8a9b6";s:4:"name";s:41:"ezc/Base/exceptions/setting_not_found.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a9dd91058d170afb1728619c7b848504";s:4:"name";s:37:"ezc/Base/exceptions/setting_value.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"ba9fd1b76372a61fdf21788fb57652e3";s:4:"name";s:29:"ezc/Base/exceptions/value.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"990f3ff806a9b5e7b11d172d8dd98462";s:4:"name";s:32:"ezc/Base/exceptions/whatever.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dc2ea8522a7c06d5b3569a43ff536e7e";s:4:"name";s:49:"ezc/Base/interfaces/configuration_initializer.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9f7c4a9cb5cf5c9647f7a827ebe9e435";s:4:"name";s:34:"ezc/Base/interfaces/exportable.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"916e40d5c700ab2888c01e4ebf587dcc";s:4:"name";s:35:"ezc/Base/interfaces/persistable.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"71fc5b479b6d8aa27103a16a29a715ea";s:4:"name";s:26:"ezc/Base/metadata/pear.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"988bce2474a73cf18bad85a2fb9112cf";s:4:"name";s:29:"ezc/Base/metadata/tarball.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"cb22067aa3adbf0152698040c6194ff8";s:4:"name";s:29:"ezc/Base/options/autoload.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"23efc7803de088935e856b72e0ee8bea";s:4:"name";s:38:"ezc/Base/structs/file_find_context.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6dd22392400103056ced0bac2769197c";s:4:"name";s:41:"ezc/Base/structs/repository_directory.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3c4ce22ba182187085b754f643ee00bd";s:4:"name";s:17:"ezc/Base/base.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bf570452286a6c882531370b75ef4ed5";s:4:"name";s:26:"ezc/Base/base_autoload.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:3:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:26:"ezc/Base/ezc_bootstrap.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6fd930e0989b4f0ab940d7bfd6f41c90";s:4:"name";s:21:"ezc/Base/features.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dbe0d8855229df798919b9b1d3f84373";s:4:"name";s:17:"ezc/Base/file.php";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0ccaeea1d41417f464914cebb064b7d7";s:4:"name";s:17:"ezc/Base/init.php";s:4:"role";s:3:"php";}}i:50;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a6c718b782e8c23497183a11ab1e8954";s:4:"name";s:21:"ezc/Base/metadata.php";s:4:"role";s:3:"php";}}i:51;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"89b149eb5eddf69c1424fd9883d51382";s:4:"name";s:20:"ezc/Base/options.php";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d817afdeef8ee0d02e1cebddfc8915e5";s:4:"name";s:19:"ezc/Base/struct.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.2.1";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.2";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.8";s:3:"api";s:3:"1.8";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-12-21";s:7:"license";s:7:"New BSD";s:5:"notes";s:73:"- Fixed issue #15896: Autoload not working for all lowercase class names.";}}s:8:"filelist";a:53:{s:24:"design/class_diagram.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"ab5f9f34361961cc74b309325509e87f";s:4:"name";s:24:"design/class_diagram.png";s:4:"role";s:4:"data";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/data/Base/design/class_diagram.png";}s:17:"design/design.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"64dbc0df23c0142f806e3837a4557c07";s:4:"name";s:17:"design/design.txt";s:4:"role";s:4:"data";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/data/Base/design/design.txt";}s:36:"docs/repos/autoloads/my_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"524b92ec3bf9055dd50e0a527b2f4b9c";s:4:"name";s:36:"docs/repos/autoloads/my_autoload.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/doc/pear/Base/docs/repos/autoloads/my_autoload.php";}s:38:"docs/repos/autoloads/your_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bd6af5ed742435bd1cdc7f2f4f5b998a";s:4:"name";s:38:"docs/repos/autoloads/your_autoload.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/doc/pear/Base/docs/repos/autoloads/your_autoload.php";}s:26:"docs/repos/Me/myclass1.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1300956dd09bc8fc6346eca3ad5d07d9";s:4:"name";s:26:"docs/repos/Me/myclass1.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/doc/pear/Base/docs/repos/Me/myclass1.php";}s:26:"docs/repos/Me/myclass2.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9f53d279b27b65a325be9274d49f6f74";s:4:"name";s:26:"docs/repos/Me/myclass2.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/doc/pear/Base/docs/repos/Me/myclass2.php";}s:29:"docs/repos/You/yourclass1.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8a4863c1e5bc1b10e25fe78b028acd2f";s:4:"name";s:29:"docs/repos/You/yourclass1.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/doc/pear/Base/docs/repos/You/yourclass1.php";}s:29:"docs/repos/You/yourclass2.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2ff7777b81e887c50b09e23bbaa9c152";s:4:"name";s:29:"docs/repos/You/yourclass2.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/doc/pear/Base/docs/repos/You/yourclass2.php";}s:12:"docs/CREDITS";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6a44661d8d0ed5dea17e26938c1c388c";s:4:"name";s:12:"docs/CREDITS";s:4:"role";s:3:"doc";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/doc/pear/Base/docs/CREDITS";}s:12:"docs/LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0d01eec9cb573a51f7cb73a1573c5350";s:4:"name";s:12:"docs/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/doc/pear/Base/docs/LICENSE";}s:17:"docs/tutorial.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"15e07d15fb1865740da5a5255da0b330";s:4:"name";s:17:"docs/tutorial.txt";s:4:"role";s:3:"doc";s:12:"installed_as";s:56:"/opt/alt/php54/usr/share/doc/pear/Base/docs/tutorial.txt";}s:26:"docs/tutorial_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c62acdb41db6b2f5f90506fda0ffe426";s:4:"name";s:26:"docs/tutorial_autoload.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/doc/pear/Base/docs/tutorial_autoload.php";}s:28:"docs/tutorial_example_01.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7a4a698465b2dbcf948d5a9abdf16ab6";s:4:"name";s:28:"docs/tutorial_example_01.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/doc/pear/Base/docs/tutorial_example_01.php";}s:28:"docs/tutorial_example_02.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1493849915073e203c09c0615ad1dc22";s:4:"name";s:28:"docs/tutorial_example_02.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/doc/pear/Base/docs/tutorial_example_02.php";}s:28:"docs/tutorial_example_03.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"09ddc9170be2be2f9a197823f4fb05b3";s:4:"name";s:28:"docs/tutorial_example_03.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/doc/pear/Base/docs/tutorial_example_03.php";}s:28:"docs/tutorial_example_04.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c93496ab05d259e2f2867c177a31b9df";s:4:"name";s:28:"docs/tutorial_example_04.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/doc/pear/Base/docs/tutorial_example_04.php";}s:37:"docs/tutorial_lazy_initialization.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f6399aeed38cbc422ba7a95a4cc3e4d1";s:4:"name";s:37:"docs/tutorial_lazy_initialization.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/doc/pear/Base/docs/tutorial_lazy_initialization.php";}s:30:"ezc/autoload/base_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bf570452286a6c882531370b75ef4ed5";s:4:"name";s:30:"ezc/autoload/base_autoload.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/ezc/autoload/base_autoload.php";}s:32:"ezc/Base/exceptions/autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4cbf7efc1654c118c1ab4013da584ea2";s:4:"name";s:32:"ezc/Base/exceptions/autoload.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/autoload.php";}s:54:"ezc/Base/exceptions/double_class_repository_prefix.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"26ae1c2a3243187d8b281a33e28ab388";s:4:"name";s:54:"ezc/Base/exceptions/double_class_repository_prefix.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/double_class_repository_prefix.php";}s:33:"ezc/Base/exceptions/exception.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1b1d2ccf1d83e9f2126ce6d423ad4a06";s:4:"name";s:33:"ezc/Base/exceptions/exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/exception.php";}s:43:"ezc/Base/exceptions/extension_not_found.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d9b8d14dcddd1453d36025842a915c88";s:4:"name";s:43:"ezc/Base/exceptions/extension_not_found.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/extension_not_found.php";}s:38:"ezc/Base/exceptions/file_exception.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"83889a8ded5df760a1184a44e64beb08";s:4:"name";s:38:"ezc/Base/exceptions/file_exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/file_exception.php";}s:31:"ezc/Base/exceptions/file_io.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2a2d0e89497bd188477d43f5a87701d8";s:4:"name";s:31:"ezc/Base/exceptions/file_io.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/file_io.php";}s:38:"ezc/Base/exceptions/file_not_found.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"cee70f6094d8e6a1da052f3b2e9913ab";s:4:"name";s:38:"ezc/Base/exceptions/file_not_found.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/file_not_found.php";}s:39:"ezc/Base/exceptions/file_permission.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"249cdcf29b1fc357587301d1a8f8a25f";s:4:"name";s:39:"ezc/Base/exceptions/file_permission.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/file_permission.php";}s:51:"ezc/Base/exceptions/functionality_not_supported.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f914328c784c38af9dcb71d6fdbbac42";s:4:"name";s:51:"ezc/Base/exceptions/functionality_not_supported.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/functionality_not_supported.php";}s:48:"ezc/Base/exceptions/init_callback_configured.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9ae4f81ab15f52153132439840096a47";s:4:"name";s:48:"ezc/Base/exceptions/init_callback_configured.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/init_callback_configured.php";}s:46:"ezc/Base/exceptions/invalid_callback_class.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f4f5f5d9599ea1cdde2929e4dbbcbdbe";s:4:"name";s:46:"ezc/Base/exceptions/invalid_callback_class.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/invalid_callback_class.php";}s:44:"ezc/Base/exceptions/invalid_parent_class.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"416b95f88e0480547b51340afef5d647";s:4:"name";s:44:"ezc/Base/exceptions/invalid_parent_class.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/invalid_parent_class.php";}s:42:"ezc/Base/exceptions/property_not_found.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e6147c51e29536df0683a49aeab920e8";s:4:"name";s:42:"ezc/Base/exceptions/property_not_found.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/property_not_found.php";}s:43:"ezc/Base/exceptions/property_permission.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"58e2f2dc39f347b59a1afc957a8cdfcd";s:4:"name";s:43:"ezc/Base/exceptions/property_permission.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/property_permission.php";}s:41:"ezc/Base/exceptions/setting_not_found.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8b95e40352468ff28126fc02abc8a9b6";s:4:"name";s:41:"ezc/Base/exceptions/setting_not_found.php";s:4:"role";s:3:"php";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/setting_not_found.php";}s:37:"ezc/Base/exceptions/setting_value.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a9dd91058d170afb1728619c7b848504";s:4:"name";s:37:"ezc/Base/exceptions/setting_value.php";s:4:"role";s:3:"php";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/setting_value.php";}s:29:"ezc/Base/exceptions/value.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"ba9fd1b76372a61fdf21788fb57652e3";s:4:"name";s:29:"ezc/Base/exceptions/value.php";s:4:"role";s:3:"php";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/value.php";}s:32:"ezc/Base/exceptions/whatever.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"990f3ff806a9b5e7b11d172d8dd98462";s:4:"name";s:32:"ezc/Base/exceptions/whatever.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions/whatever.php";}s:49:"ezc/Base/interfaces/configuration_initializer.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dc2ea8522a7c06d5b3569a43ff536e7e";s:4:"name";s:49:"ezc/Base/interfaces/configuration_initializer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/ezc/Base/interfaces/configuration_initializer.php";}s:34:"ezc/Base/interfaces/exportable.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9f7c4a9cb5cf5c9647f7a827ebe9e435";s:4:"name";s:34:"ezc/Base/interfaces/exportable.php";s:4:"role";s:3:"php";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/ezc/Base/interfaces/exportable.php";}s:35:"ezc/Base/interfaces/persistable.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"916e40d5c700ab2888c01e4ebf587dcc";s:4:"name";s:35:"ezc/Base/interfaces/persistable.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/ezc/Base/interfaces/persistable.php";}s:26:"ezc/Base/metadata/pear.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"71fc5b479b6d8aa27103a16a29a715ea";s:4:"name";s:26:"ezc/Base/metadata/pear.php";s:4:"role";s:3:"php";s:12:"installed_as";s:56:"/opt/alt/php54/usr/share/pear/ezc/Base/metadata/pear.php";}s:29:"ezc/Base/metadata/tarball.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"988bce2474a73cf18bad85a2fb9112cf";s:4:"name";s:29:"ezc/Base/metadata/tarball.php";s:4:"role";s:3:"php";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/pear/ezc/Base/metadata/tarball.php";}s:29:"ezc/Base/options/autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"cb22067aa3adbf0152698040c6194ff8";s:4:"name";s:29:"ezc/Base/options/autoload.php";s:4:"role";s:3:"php";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/pear/ezc/Base/options/autoload.php";}s:38:"ezc/Base/structs/file_find_context.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"23efc7803de088935e856b72e0ee8bea";s:4:"name";s:38:"ezc/Base/structs/file_find_context.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/ezc/Base/structs/file_find_context.php";}s:41:"ezc/Base/structs/repository_directory.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6dd22392400103056ced0bac2769197c";s:4:"name";s:41:"ezc/Base/structs/repository_directory.php";s:4:"role";s:3:"php";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/ezc/Base/structs/repository_directory.php";}s:17:"ezc/Base/base.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3c4ce22ba182187085b754f643ee00bd";s:4:"name";s:17:"ezc/Base/base.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php54/usr/share/pear/ezc/Base/base.php";}s:26:"ezc/Base/base_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bf570452286a6c882531370b75ef4ed5";s:4:"name";s:26:"ezc/Base/base_autoload.php";s:4:"role";s:3:"php";s:12:"installed_as";s:56:"/opt/alt/php54/usr/share/pear/ezc/Base/base_autoload.php";}s:26:"ezc/Base/ezc_bootstrap.php";a:4:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:26:"ezc/Base/ezc_bootstrap.php";s:4:"role";s:3:"php";s:12:"installed_as";s:56:"/opt/alt/php54/usr/share/pear/ezc/Base/ezc_bootstrap.php";}s:21:"ezc/Base/features.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6fd930e0989b4f0ab940d7bfd6f41c90";s:4:"name";s:21:"ezc/Base/features.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/ezc/Base/features.php";}s:17:"ezc/Base/file.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dbe0d8855229df798919b9b1d3f84373";s:4:"name";s:17:"ezc/Base/file.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php54/usr/share/pear/ezc/Base/file.php";}s:17:"ezc/Base/init.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0ccaeea1d41417f464914cebb064b7d7";s:4:"name";s:17:"ezc/Base/init.php";s:4:"role";s:3:"php";s:12:"installed_as";s:47:"/opt/alt/php54/usr/share/pear/ezc/Base/init.php";}s:21:"ezc/Base/metadata.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a6c718b782e8c23497183a11ab1e8954";s:4:"name";s:21:"ezc/Base/metadata.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/ezc/Base/metadata.php";}s:20:"ezc/Base/options.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"89b149eb5eddf69c1424fd9883d51382";s:4:"name";s:20:"ezc/Base/options.php";s:4:"role";s:3:"php";s:12:"installed_as";s:50:"/opt/alt/php54/usr/share/pear/ezc/Base/options.php";}s:19:"ezc/Base/struct.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d817afdeef8ee0d02e1cebddfc8915e5";s:4:"name";s:19:"ezc/Base/struct.php";s:4:"role";s:3:"php";s:12:"installed_as";s:49:"/opt/alt/php54/usr/share/pear/ezc/Base/struct.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:16:{s:46:"/opt/alt/php54/usr/share/pear/data/Base/design";b:1;s:39:"/opt/alt/php54/usr/share/pear/data/Base";b:1;s:59:"/opt/alt/php54/usr/share/doc/pear/Base/docs/repos/autoloads";b:1;s:49:"/opt/alt/php54/usr/share/doc/pear/Base/docs/repos";b:1;s:43:"/opt/alt/php54/usr/share/doc/pear/Base/docs";b:1;s:38:"/opt/alt/php54/usr/share/doc/pear/Base";b:1;s:52:"/opt/alt/php54/usr/share/doc/pear/Base/docs/repos/Me";b:1;s:53:"/opt/alt/php54/usr/share/doc/pear/Base/docs/repos/You";b:1;s:42:"/opt/alt/php54/usr/share/pear/ezc/autoload";b:1;s:33:"/opt/alt/php54/usr/share/pear/ezc";b:1;s:49:"/opt/alt/php54/usr/share/pear/ezc/Base/exceptions";b:1;s:38:"/opt/alt/php54/usr/share/pear/ezc/Base";b:1;s:49:"/opt/alt/php54/usr/share/pear/ezc/Base/interfaces";b:1;s:47:"/opt/alt/php54/usr/share/pear/ezc/Base/metadata";b:1;s:46:"/opt/alt/php54/usr/share/pear/ezc/Base/options";b:1;s:46:"/opt/alt/php54/usr/share/pear/ezc/Base/structs";b:1;}s:3:"old";a:7:{s:7:"version";s:3:"1.8";s:12:"release_date";s:10:"2009-12-21";s:13:"release_state";s:6:"stable";s:15:"release_license";s:7:"New BSD";s:13:"release_notes";s:73:"- Fixed issue #15896: Autoload not working for all lowercase class names.";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.2.1";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.2";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:10:"eZ systems";s:5:"email";s:9:"ezc@ez.no";s:6:"active";s:3:"yes";s:6:"handle";s:3:"ezc";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506489;}PK�^�\M�i�����9pear/.registry/.channel.components.ez.no/consoletools.regnu�[���a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.0";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:12:"ConsoleTools";s:7:"channel";s:16:"components.ez.no";s:7:"summary";s:78:"A set of classes to do different actions with the console (also called shell).";s:11:"description";s:187:"A set of classes to do different actions with the console (also called shell).
It can render a progress bar, tables and a status bar and contains a class for
parsing command line options.";s:4:"lead";a:4:{s:4:"name";s:10:"eZ systems";s:4:"user";s:3:"ezc";s:5:"email";s:9:"ezc@ez.no";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2010-03-22";s:4:"time";s:8:"14:30:18";s:7:"version";a:2:{s:7:"release";s:5:"1.6.1";s:3:"api";s:5:"1.6.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";s:7:"New BSD";s:5:"notes";s:86:"- Fixed issue #16055: Corrected regression in error message for option
  dependencies.";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:106:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"53a2fd46c86d99b961c171a66af52294";s:4:"name";s:24:"design/class_diagram.png";s:4:"role";s:4:"data";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b0e9037513638b06959702b4827d2325";s:4:"name";s:18:"design/console.png";s:4:"role";s:4:"data";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8ec71d0399e811d3ebb49a3a69bea3ad";s:4:"name";s:18:"design/console.xml";s:4:"role";s:4:"data";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"928f4cfd27eaac584c14e11562a1810e";s:4:"name";s:29:"design/console_parameters.png";s:4:"role";s:4:"data";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b984260ee10c0d466594d1c7356fc379";s:4:"name";s:21:"design/design-1.3.txt";s:4:"role";s:4:"data";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9f3666f1fe43c02d93453b6cf5e19f5b";s:4:"name";s:17:"design/design.txt";s:4:"role";s:4:"data";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e3f42a8f3d4359c2619a8abb8c40ae98";s:4:"name";s:45:"docs/img/consoletools_tutorial_example_06.png";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9ef80166b15efecb1fcb147f3eb4a016";s:4:"name";s:45:"docs/img/consoletools_tutorial_example_07.png";s:4:"role";s:3:"doc";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3be4110812d95440c78d6c313d4ed380";s:4:"name";s:45:"docs/img/consoletools_tutorial_example_08.png";s:4:"role";s:3:"doc";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"37c35a19bbe6c983a8ae1c24b9f9c273";s:4:"name";s:45:"docs/img/consoletools_tutorial_example_09.png";s:4:"role";s:3:"doc";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4375674d7ff2271227b5ae9ae1c420f4";s:4:"name";s:45:"docs/img/consoletools_tutorial_example_10.png";s:4:"role";s:3:"doc";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6a44661d8d0ed5dea17e26938c1c388c";s:4:"name";s:12:"docs/CREDITS";s:4:"role";s:3:"doc";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0ded8f674cdc9657885309057e67812f";s:4:"name";s:22:"docs/example_input.php";s:4:"role";s:3:"doc";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"84de543cd335e89b01fab831f231b743";s:4:"name";s:33:"docs/example_menu_dialog_full.php";s:4:"role";s:3:"doc";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b5d0ab2ebca4628c4e1e3bc05ecea61b";s:4:"name";s:23:"docs/example_output.php";s:4:"role";s:3:"doc";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"09648ac0219bfc18c5d7a093b55b280b";s:4:"name";s:28:"docs/example_progressbar.php";s:4:"role";s:3:"doc";}}i:16;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9519aa6d3253ad82f64c7a2c5109fa31";s:4:"name";s:32:"docs/example_progressmonitor.php";s:4:"role";s:3:"doc";}}i:17;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7382b1d71ddeb7bd43b90d582ba18a3b";s:4:"name";s:48:"docs/example_question_dialog_collection_full.php";s:4:"role";s:3:"doc";}}i:18;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"169505e53923c6389ddd987f894328e0";s:4:"name";s:46:"docs/example_question_dialog_factory_yesno.php";s:4:"role";s:3:"doc";}}i:19;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"600a19f4d49a65c5d03c8b3c74d735ac";s:4:"name";s:42:"docs/example_question_dialog_type_full.php";s:4:"role";s:3:"doc";}}i:20;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e829e952f3fa572461175c0966035d51";s:4:"name";s:26:"docs/example_statusbar.php";s:4:"role";s:3:"doc";}}i:21;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1bf46b2ac9e3b5b565a05027d4610918";s:4:"name";s:22:"docs/example_table.php";s:4:"role";s:3:"doc";}}i:22;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"628360cad5c0d6a59a5847faeebfc21d";s:4:"name";s:24:"docs/example_table_2.php";s:4:"role";s:3:"doc";}}i:23;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0d01eec9cb573a51f7cb73a1573c5350";s:4:"name";s:12:"docs/LICENSE";s:4:"role";s:3:"doc";}}i:24;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d33dcb646a07d63a828bf455309d0926";s:4:"name";s:17:"docs/tutorial.txt";s:4:"role";s:3:"doc";}}i:25;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c62acdb41db6b2f5f90506fda0ffe426";s:4:"name";s:26:"docs/tutorial_autoload.php";s:4:"role";s:3:"doc";}}i:26;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"38c2ae0cf8bef46d317983818fc7eeec";s:4:"name";s:41:"docs/tutorial_example_01_output_basic.php";s:4:"role";s:3:"doc";}}i:27;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a9b566b706b217b704f824dd528c245d";s:4:"name";s:44:"docs/tutorial_example_02_output_advanced.php";s:4:"role";s:3:"doc";}}i:28;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5f256cd79a513a1ae8b6d9743dcaf883";s:4:"name";s:43:"docs/tutorial_example_03_output_options.php";s:4:"role";s:3:"doc";}}i:29;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0afbac38453f8d496b9c5ebdff4b7f54";s:4:"name";s:40:"docs/tutorial_example_04_input_basic.php";s:4:"role";s:3:"doc";}}i:30;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9c4dafa4f5a08f20bfc6edc07d3e52a8";s:4:"name";s:43:"docs/tutorial_example_05_input_advanced.php";s:4:"role";s:3:"doc";}}i:31;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2eb8cdf0581dac44124a279903a090b6";s:4:"name";s:46:"docs/tutorial_example_06_progressbar_basic.php";s:4:"role";s:3:"doc";}}i:32;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"ad542c60b818a175aa8f59cbe99f3765";s:4:"name";s:49:"docs/tutorial_example_07_progressbar_advanced.php";s:4:"role";s:3:"doc";}}i:33;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c93007242a832d49a573a9ff71af468d";s:4:"name";s:38:"docs/tutorial_example_08_statusbar.php";s:4:"role";s:3:"doc";}}i:34;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f2de74f7a46f15af94e54f02b8c5190c";s:4:"name";s:40:"docs/tutorial_example_09_table_basic.php";s:4:"role";s:3:"doc";}}i:35;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9c322bff4f25aacbc30b2816a3a693ce";s:4:"name";s:43:"docs/tutorial_example_10_table_advanced.php";s:4:"role";s:3:"doc";}}i:36;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4255cae3b9b8a8ed4a0bf2e6be293925";s:4:"name";s:44:"docs/tutorial_example_11_progressmonitor.php";s:4:"role";s:3:"doc";}}i:37;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5642c76dcad0f38c2bb9cc813ec86635";s:4:"name";s:44:"docs/tutorial_example_12_input_arguments.php";s:4:"role";s:3:"doc";}}i:38;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9dc353f51cf619db963b72ace3e554a1";s:4:"name";s:44:"docs/tutorial_example_13_dialog_question.php";s:4:"role";s:3:"doc";}}i:39;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2fe7147cf77f8595caec34390a869e00";s:4:"name";s:49:"docs/tutorial_example_14_dialog_yesnoquestion.php";s:4:"role";s:3:"doc";}}i:40;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"416ae4c5c942d184d083f89f1d958578";s:4:"name";s:40:"docs/tutorial_example_15_dialog_menu.php";s:4:"role";s:3:"doc";}}i:41;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7e204a3db8893993c618d9fccb63ce80";s:4:"name";s:40:"docs/tutorial_example_output_targets.php";s:4:"role";s:3:"doc";}}i:42;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a5d0832dc9a28b1b83e377ec2f72503c";s:4:"name";s:33:"ezc/autoload/console_autoload.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e168dc91ef4aa95feb62c374850439ad";s:4:"name";s:58:"ezc/ConsoleTools/dialog/validators/menu_dialog_default.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bb23b9eb4ce6ecfc74d3d14697522302";s:4:"name";s:65:"ezc/ConsoleTools/dialog/validators/question_dialog_collection.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6bf4939fecdf3612d26258304e116d68";s:4:"name";s:62:"ezc/ConsoleTools/dialog/validators/question_dialog_mapping.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4426ac09a206b255af3f86e138f3d280";s:4:"name";s:60:"ezc/ConsoleTools/dialog/validators/question_dialog_regex.php";s:4:"role";s:3:"php";}}i:47;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"67f5529cb45617843e60a0ea3e4c2941";s:4:"name";s:59:"ezc/ConsoleTools/dialog/validators/question_dialog_type.php";s:4:"role";s:3:"php";}}i:48;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4c8dbaf88d94e339940d87341e9e511c";s:4:"name";s:39:"ezc/ConsoleTools/dialog/menu_dialog.php";s:4:"role";s:3:"php";}}i:49;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a0f9e7fcbc20920a7718ab4063cedbb3";s:4:"name";s:43:"ezc/ConsoleTools/dialog/question_dialog.php";s:4:"role";s:3:"php";}}i:50;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"76cf3873bf8de152961bef1a958de739";s:4:"name";s:40:"ezc/ConsoleTools/exceptions/argument.php";s:4:"role";s:3:"php";}}i:51;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e76fb2146d1ab7770ab7b55acac395f6";s:4:"name";s:59:"ezc/ConsoleTools/exceptions/argument_already_registered.php";s:4:"role";s:3:"php";}}i:52;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b9e1712dced4a71c03299d2d629d8bd9";s:4:"name";s:60:"ezc/ConsoleTools/exceptions/argument_mandatory_violation.php";s:4:"role";s:3:"php";}}i:53;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"016560b74a1713b240b3b2831fb9ce15";s:4:"name";s:49:"ezc/ConsoleTools/exceptions/argument_too_many.php";s:4:"role";s:3:"php";}}i:54;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a928f645d541811a6cb268cfcf989103";s:4:"name";s:55:"ezc/ConsoleTools/exceptions/argument_type_violation.php";s:4:"role";s:3:"php";}}i:55;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dfafc6e5a8f5e95b3f9d7fc83256ba3a";s:4:"name";s:44:"ezc/ConsoleTools/exceptions/dialog_abort.php";s:4:"role";s:3:"php";}}i:56;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3a0932a2bd5a048165650d9c1c65d394";s:4:"name";s:41:"ezc/ConsoleTools/exceptions/exception.php";s:4:"role";s:3:"php";}}i:57;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"55ec00268bfdcabaececab9717e670b0";s:4:"name";s:51:"ezc/ConsoleTools/exceptions/invalid_option_name.php";s:4:"role";s:3:"php";}}i:58;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8387a3ed2488c13d8e85ac1f36d2776d";s:4:"name";s:53:"ezc/ConsoleTools/exceptions/invalid_output_target.php";s:4:"role";s:3:"php";}}i:59;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"adf293f0a7b64a11ad750ceb7d8d06fb";s:4:"name";s:50:"ezc/ConsoleTools/exceptions/no_position_stored.php";s:4:"role";s:3:"php";}}i:60;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"26c6652ca11a904feb0114ea063137ad";s:4:"name";s:54:"ezc/ConsoleTools/exceptions/no_valid_dialog_result.php";s:4:"role";s:3:"php";}}i:61;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1342642994f7e2af6617ab50e1d50201";s:4:"name";s:38:"ezc/ConsoleTools/exceptions/option.php";s:4:"role";s:3:"php";}}i:62;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1c82d9cd44cab9cd2912a7ff85fe778b";s:4:"name";s:57:"ezc/ConsoleTools/exceptions/option_already_registered.php";s:4:"role";s:3:"php";}}i:63;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"920d616d1bc71c83e4730273219d2734";s:4:"name";s:58:"ezc/ConsoleTools/exceptions/option_arguments_violation.php";s:4:"role";s:3:"php";}}i:64;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"524d16a055a3d3a41c2dc3c0c1a1fed2";s:4:"name";s:59:"ezc/ConsoleTools/exceptions/option_dependency_violation.php";s:4:"role";s:3:"php";}}i:65;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"99291a96437e2ab968e1db9e8ef14a11";s:4:"name";s:58:"ezc/ConsoleTools/exceptions/option_exclusion_violation.php";s:4:"role";s:3:"php";}}i:66;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1f5f85eb8c761af0a4c0cf72552a87ac";s:4:"name";s:58:"ezc/ConsoleTools/exceptions/option_mandatory_violation.php";s:4:"role";s:3:"php";}}i:67;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"17756f682466ebd0e1854eefcdb392fb";s:4:"name";s:52:"ezc/ConsoleTools/exceptions/option_missing_value.php";s:4:"role";s:3:"php";}}i:68;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"779c88d8911c1a37a8f62c07a7609fd1";s:4:"name";s:49:"ezc/ConsoleTools/exceptions/option_not_exists.php";s:4:"role";s:3:"php";}}i:69;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bcef6b269e9518b5ab50a665dcefdae4";s:4:"name";s:47:"ezc/ConsoleTools/exceptions/option_no_alias.php";s:4:"role";s:3:"php";}}i:70;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"22cb7a2e3afecccbe82e7a43b7e3c0b0";s:4:"name";s:60:"ezc/ConsoleTools/exceptions/option_string_not_wellformed.php";s:4:"role";s:3:"php";}}i:71;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e65ae0e90ec95ec1b02d427585bcb147";s:4:"name";s:54:"ezc/ConsoleTools/exceptions/option_too_many_values.php";s:4:"role";s:3:"php";}}i:72;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c1b97683c2dada4c35d670f22bf4bfd9";s:4:"name";s:53:"ezc/ConsoleTools/exceptions/option_type_violation.php";s:4:"role";s:3:"php";}}i:73;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1358c658d502de8757d6a8e4ae40d636";s:4:"name";s:51:"ezc/ConsoleTools/input/help_generators/standard.php";s:4:"role";s:3:"php";}}i:74;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3d2a4f1bb8d46856c6da3c266fa8b019";s:4:"name";s:46:"ezc/ConsoleTools/input/validators/standard.php";s:4:"role";s:3:"php";}}i:75;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a3c508cecae94655b9d134c18bf16ad2";s:4:"name";s:35:"ezc/ConsoleTools/input/argument.php";s:4:"role";s:3:"php";}}i:76;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"64be58bc0e7faef3f8548b69f8975ced";s:4:"name";s:36:"ezc/ConsoleTools/input/arguments.php";s:4:"role";s:3:"php";}}i:77;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"464bd6804e9ea90cd7e8c4e395f51a70";s:4:"name";s:33:"ezc/ConsoleTools/input/option.php";s:4:"role";s:3:"php";}}i:78;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"da1589cfccd05250f85b1d8c30f4da7c";s:4:"name";s:38:"ezc/ConsoleTools/interfaces/dialog.php";s:4:"role";s:3:"php";}}i:79;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"fbc7fafd21090e559cbc707bf8d2ea5a";s:4:"name";s:48:"ezc/ConsoleTools/interfaces/dialog_validator.php";s:4:"role";s:3:"php";}}i:80;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1e0b4eb1a29c41f385781ca8b9c3e442";s:4:"name";s:52:"ezc/ConsoleTools/interfaces/input_help_generator.php";s:4:"role";s:3:"php";}}i:81;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2e5f1707fe47153bf4b1e48aa01cf76c";s:4:"name";s:47:"ezc/ConsoleTools/interfaces/input_validator.php";s:4:"role";s:3:"php";}}i:82;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e7e4198450a70f692c5882464a7e9e11";s:4:"name";s:53:"ezc/ConsoleTools/interfaces/menu_dialog_validator.php";s:4:"role";s:3:"php";}}i:83;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8e2d83164e1a649c3f59a13f3915a9f8";s:4:"name";s:57:"ezc/ConsoleTools/interfaces/question_dialog_validator.php";s:4:"role";s:3:"php";}}i:84;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c8c8969fe1528d7e4c28db6c078b0245";s:4:"name";s:35:"ezc/ConsoleTools/options/dialog.php";s:4:"role";s:3:"php";}}i:85;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6f5724cd06d9d4541428384879d42eec";s:4:"name";s:40:"ezc/ConsoleTools/options/menu_dialog.php";s:4:"role";s:3:"php";}}i:86;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c0482b1ed0ecff49594bace3aa62d4d0";s:4:"name";s:35:"ezc/ConsoleTools/options/output.php";s:4:"role";s:3:"php";}}i:87;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3e6808ce1f4843313b1c5d9997507f91";s:4:"name";s:40:"ezc/ConsoleTools/options/progressbar.php";s:4:"role";s:3:"php";}}i:88;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dc171e2272f4929c312c553d452b807d";s:4:"name";s:44:"ezc/ConsoleTools/options/progressmonitor.php";s:4:"role";s:3:"php";}}i:89;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"069eb222843610015ed324dca2b56dec";s:4:"name";s:44:"ezc/ConsoleTools/options/question_dialog.php";s:4:"role";s:3:"php";}}i:90;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"70d32f729b97d036e7729f7426bc7b45";s:4:"name";s:38:"ezc/ConsoleTools/options/statusbar.php";s:4:"role";s:3:"php";}}i:91;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7426cf158c78345d7656a0e23b752d25";s:4:"name";s:34:"ezc/ConsoleTools/options/table.php";s:4:"role";s:3:"php";}}i:92;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"772506539fa9180fbfe3167d95462bdd";s:4:"name";s:40:"ezc/ConsoleTools/structs/option_rule.php";s:4:"role";s:3:"php";}}i:93;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a7ef5dd26f2d70fe8374200c52136451";s:4:"name";s:42:"ezc/ConsoleTools/structs/output_format.php";s:4:"role";s:3:"php";}}i:94;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"fe2a5c4ebcce728d87dab9ffaec878ef";s:4:"name";s:43:"ezc/ConsoleTools/structs/output_formats.php";s:4:"role";s:3:"php";}}i:95;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"84edad158922a7b0b07975b720fd11d4";s:4:"name";s:31:"ezc/ConsoleTools/table/cell.php";s:4:"role";s:3:"php";}}i:96;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2d99e475e21a0a82fd0051ae07e47f4d";s:4:"name";s:30:"ezc/ConsoleTools/table/row.php";s:4:"role";s:3:"php";}}i:97;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1f23811735a6bd4f98b8c2f9a688d934";s:4:"name";s:33:"ezc/ConsoleTools/tools/string.php";s:4:"role";s:3:"php";}}i:98;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a5d0832dc9a28b1b83e377ec2f72503c";s:4:"name";s:37:"ezc/ConsoleTools/console_autoload.php";s:4:"role";s:3:"php";}}i:99;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"131b67a1b928ff63db8ffd6eefbe17b6";s:4:"name";s:34:"ezc/ConsoleTools/dialog_viewer.php";s:4:"role";s:3:"php";}}i:100;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"35da1f48b0fa95bf771729f5bafe3220";s:4:"name";s:26:"ezc/ConsoleTools/input.php";s:4:"role";s:3:"php";}}i:101;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f7b975843f75809d42e6710a7793b4c6";s:4:"name";s:27:"ezc/ConsoleTools/output.php";s:4:"role";s:3:"php";}}i:102;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7de9cac1d84eca29792d54241b210633";s:4:"name";s:32:"ezc/ConsoleTools/progressbar.php";s:4:"role";s:3:"php";}}i:103;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f3b0f156acc3ee5d6e5c1652aac5cb47";s:4:"name";s:36:"ezc/ConsoleTools/progressmonitor.php";s:4:"role";s:3:"php";}}i:104;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d6a504831ced759070096f0585b27e45";s:4:"name";s:30:"ezc/ConsoleTools/statusbar.php";s:4:"role";s:3:"php";}}i:105;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a78728a6c0328a88aec5ea16201e68f0";s:4:"name";s:26:"ezc/ConsoleTools/table.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.2.1";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.2";}s:7:"package";a:3:{s:4:"name";s:4:"Base";s:7:"channel";s:16:"components.ez.no";s:3:"min";s:3:"1.8";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.6.1";s:3:"api";s:5:"1.6.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-03-22";s:7:"license";s:7:"New BSD";s:5:"notes";s:86:"- Fixed issue #16055: Corrected regression in error message for option
  dependencies.";}}s:8:"filelist";a:106:{s:24:"design/class_diagram.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"53a2fd46c86d99b961c171a66af52294";s:4:"name";s:24:"design/class_diagram.png";s:4:"role";s:4:"data";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/data/ConsoleTools/design/class_diagram.png";}s:18:"design/console.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b0e9037513638b06959702b4827d2325";s:4:"name";s:18:"design/console.png";s:4:"role";s:4:"data";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/data/ConsoleTools/design/console.png";}s:18:"design/console.xml";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8ec71d0399e811d3ebb49a3a69bea3ad";s:4:"name";s:18:"design/console.xml";s:4:"role";s:4:"data";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/data/ConsoleTools/design/console.xml";}s:29:"design/console_parameters.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"928f4cfd27eaac584c14e11562a1810e";s:4:"name";s:29:"design/console_parameters.png";s:4:"role";s:4:"data";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/data/ConsoleTools/design/console_parameters.png";}s:21:"design/design-1.3.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b984260ee10c0d466594d1c7356fc379";s:4:"name";s:21:"design/design-1.3.txt";s:4:"role";s:4:"data";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/data/ConsoleTools/design/design-1.3.txt";}s:17:"design/design.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9f3666f1fe43c02d93453b6cf5e19f5b";s:4:"name";s:17:"design/design.txt";s:4:"role";s:4:"data";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/data/ConsoleTools/design/design.txt";}s:45:"docs/img/consoletools_tutorial_example_06.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e3f42a8f3d4359c2619a8abb8c40ae98";s:4:"name";s:45:"docs/img/consoletools_tutorial_example_06.png";s:4:"role";s:3:"doc";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/img/consoletools_tutorial_example_06.png";}s:45:"docs/img/consoletools_tutorial_example_07.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9ef80166b15efecb1fcb147f3eb4a016";s:4:"name";s:45:"docs/img/consoletools_tutorial_example_07.png";s:4:"role";s:3:"doc";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/img/consoletools_tutorial_example_07.png";}s:45:"docs/img/consoletools_tutorial_example_08.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3be4110812d95440c78d6c313d4ed380";s:4:"name";s:45:"docs/img/consoletools_tutorial_example_08.png";s:4:"role";s:3:"doc";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/img/consoletools_tutorial_example_08.png";}s:45:"docs/img/consoletools_tutorial_example_09.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"37c35a19bbe6c983a8ae1c24b9f9c273";s:4:"name";s:45:"docs/img/consoletools_tutorial_example_09.png";s:4:"role";s:3:"doc";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/img/consoletools_tutorial_example_09.png";}s:45:"docs/img/consoletools_tutorial_example_10.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4375674d7ff2271227b5ae9ae1c420f4";s:4:"name";s:45:"docs/img/consoletools_tutorial_example_10.png";s:4:"role";s:3:"doc";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/img/consoletools_tutorial_example_10.png";}s:12:"docs/CREDITS";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6a44661d8d0ed5dea17e26938c1c388c";s:4:"name";s:12:"docs/CREDITS";s:4:"role";s:3:"doc";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/CREDITS";}s:22:"docs/example_input.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0ded8f674cdc9657885309057e67812f";s:4:"name";s:22:"docs/example_input.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_input.php";}s:33:"docs/example_menu_dialog_full.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"84de543cd335e89b01fab831f231b743";s:4:"name";s:33:"docs/example_menu_dialog_full.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_menu_dialog_full.php";}s:23:"docs/example_output.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b5d0ab2ebca4628c4e1e3bc05ecea61b";s:4:"name";s:23:"docs/example_output.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_output.php";}s:28:"docs/example_progressbar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"09648ac0219bfc18c5d7a093b55b280b";s:4:"name";s:28:"docs/example_progressbar.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_progressbar.php";}s:32:"docs/example_progressmonitor.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9519aa6d3253ad82f64c7a2c5109fa31";s:4:"name";s:32:"docs/example_progressmonitor.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_progressmonitor.php";}s:48:"docs/example_question_dialog_collection_full.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7382b1d71ddeb7bd43b90d582ba18a3b";s:4:"name";s:48:"docs/example_question_dialog_collection_full.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_question_dialog_collection_full.php";}s:46:"docs/example_question_dialog_factory_yesno.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"169505e53923c6389ddd987f894328e0";s:4:"name";s:46:"docs/example_question_dialog_factory_yesno.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_question_dialog_factory_yesno.php";}s:42:"docs/example_question_dialog_type_full.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"600a19f4d49a65c5d03c8b3c74d735ac";s:4:"name";s:42:"docs/example_question_dialog_type_full.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_question_dialog_type_full.php";}s:26:"docs/example_statusbar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e829e952f3fa572461175c0966035d51";s:4:"name";s:26:"docs/example_statusbar.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_statusbar.php";}s:22:"docs/example_table.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1bf46b2ac9e3b5b565a05027d4610918";s:4:"name";s:22:"docs/example_table.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_table.php";}s:24:"docs/example_table_2.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"628360cad5c0d6a59a5847faeebfc21d";s:4:"name";s:24:"docs/example_table_2.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/example_table_2.php";}s:12:"docs/LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0d01eec9cb573a51f7cb73a1573c5350";s:4:"name";s:12:"docs/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/LICENSE";}s:17:"docs/tutorial.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d33dcb646a07d63a828bf455309d0926";s:4:"name";s:17:"docs/tutorial.txt";s:4:"role";s:3:"doc";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial.txt";}s:26:"docs/tutorial_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c62acdb41db6b2f5f90506fda0ffe426";s:4:"name";s:26:"docs/tutorial_autoload.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_autoload.php";}s:41:"docs/tutorial_example_01_output_basic.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"38c2ae0cf8bef46d317983818fc7eeec";s:4:"name";s:41:"docs/tutorial_example_01_output_basic.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_01_output_basic.php";}s:44:"docs/tutorial_example_02_output_advanced.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a9b566b706b217b704f824dd528c245d";s:4:"name";s:44:"docs/tutorial_example_02_output_advanced.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_02_output_advanced.php";}s:43:"docs/tutorial_example_03_output_options.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5f256cd79a513a1ae8b6d9743dcaf883";s:4:"name";s:43:"docs/tutorial_example_03_output_options.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_03_output_options.php";}s:40:"docs/tutorial_example_04_input_basic.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0afbac38453f8d496b9c5ebdff4b7f54";s:4:"name";s:40:"docs/tutorial_example_04_input_basic.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_04_input_basic.php";}s:43:"docs/tutorial_example_05_input_advanced.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9c4dafa4f5a08f20bfc6edc07d3e52a8";s:4:"name";s:43:"docs/tutorial_example_05_input_advanced.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_05_input_advanced.php";}s:46:"docs/tutorial_example_06_progressbar_basic.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2eb8cdf0581dac44124a279903a090b6";s:4:"name";s:46:"docs/tutorial_example_06_progressbar_basic.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:93:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_06_progressbar_basic.php";}s:49:"docs/tutorial_example_07_progressbar_advanced.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"ad542c60b818a175aa8f59cbe99f3765";s:4:"name";s:49:"docs/tutorial_example_07_progressbar_advanced.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_07_progressbar_advanced.php";}s:38:"docs/tutorial_example_08_statusbar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c93007242a832d49a573a9ff71af468d";s:4:"name";s:38:"docs/tutorial_example_08_statusbar.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_08_statusbar.php";}s:40:"docs/tutorial_example_09_table_basic.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f2de74f7a46f15af94e54f02b8c5190c";s:4:"name";s:40:"docs/tutorial_example_09_table_basic.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_09_table_basic.php";}s:43:"docs/tutorial_example_10_table_advanced.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9c322bff4f25aacbc30b2816a3a693ce";s:4:"name";s:43:"docs/tutorial_example_10_table_advanced.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_10_table_advanced.php";}s:44:"docs/tutorial_example_11_progressmonitor.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4255cae3b9b8a8ed4a0bf2e6be293925";s:4:"name";s:44:"docs/tutorial_example_11_progressmonitor.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_11_progressmonitor.php";}s:44:"docs/tutorial_example_12_input_arguments.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5642c76dcad0f38c2bb9cc813ec86635";s:4:"name";s:44:"docs/tutorial_example_12_input_arguments.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_12_input_arguments.php";}s:44:"docs/tutorial_example_13_dialog_question.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9dc353f51cf619db963b72ace3e554a1";s:4:"name";s:44:"docs/tutorial_example_13_dialog_question.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:91:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_13_dialog_question.php";}s:49:"docs/tutorial_example_14_dialog_yesnoquestion.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2fe7147cf77f8595caec34390a869e00";s:4:"name";s:49:"docs/tutorial_example_14_dialog_yesnoquestion.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:96:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_14_dialog_yesnoquestion.php";}s:40:"docs/tutorial_example_15_dialog_menu.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"416ae4c5c942d184d083f89f1d958578";s:4:"name";s:40:"docs/tutorial_example_15_dialog_menu.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_15_dialog_menu.php";}s:40:"docs/tutorial_example_output_targets.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7e204a3db8893993c618d9fccb63ce80";s:4:"name";s:40:"docs/tutorial_example_output_targets.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/tutorial_example_output_targets.php";}s:33:"ezc/autoload/console_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a5d0832dc9a28b1b83e377ec2f72503c";s:4:"name";s:33:"ezc/autoload/console_autoload.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/ezc/autoload/console_autoload.php";}s:58:"ezc/ConsoleTools/dialog/validators/menu_dialog_default.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e168dc91ef4aa95feb62c374850439ad";s:4:"name";s:58:"ezc/ConsoleTools/dialog/validators/menu_dialog_default.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/dialog/validators/menu_dialog_default.php";}s:65:"ezc/ConsoleTools/dialog/validators/question_dialog_collection.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bb23b9eb4ce6ecfc74d3d14697522302";s:4:"name";s:65:"ezc/ConsoleTools/dialog/validators/question_dialog_collection.php";s:4:"role";s:3:"php";s:12:"installed_as";s:95:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/dialog/validators/question_dialog_collection.php";}s:62:"ezc/ConsoleTools/dialog/validators/question_dialog_mapping.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6bf4939fecdf3612d26258304e116d68";s:4:"name";s:62:"ezc/ConsoleTools/dialog/validators/question_dialog_mapping.php";s:4:"role";s:3:"php";s:12:"installed_as";s:92:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/dialog/validators/question_dialog_mapping.php";}s:60:"ezc/ConsoleTools/dialog/validators/question_dialog_regex.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4426ac09a206b255af3f86e138f3d280";s:4:"name";s:60:"ezc/ConsoleTools/dialog/validators/question_dialog_regex.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/dialog/validators/question_dialog_regex.php";}s:59:"ezc/ConsoleTools/dialog/validators/question_dialog_type.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"67f5529cb45617843e60a0ea3e4c2941";s:4:"name";s:59:"ezc/ConsoleTools/dialog/validators/question_dialog_type.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/dialog/validators/question_dialog_type.php";}s:39:"ezc/ConsoleTools/dialog/menu_dialog.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"4c8dbaf88d94e339940d87341e9e511c";s:4:"name";s:39:"ezc/ConsoleTools/dialog/menu_dialog.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/dialog/menu_dialog.php";}s:43:"ezc/ConsoleTools/dialog/question_dialog.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a0f9e7fcbc20920a7718ab4063cedbb3";s:4:"name";s:43:"ezc/ConsoleTools/dialog/question_dialog.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/dialog/question_dialog.php";}s:40:"ezc/ConsoleTools/exceptions/argument.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"76cf3873bf8de152961bef1a958de739";s:4:"name";s:40:"ezc/ConsoleTools/exceptions/argument.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/argument.php";}s:59:"ezc/ConsoleTools/exceptions/argument_already_registered.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e76fb2146d1ab7770ab7b55acac395f6";s:4:"name";s:59:"ezc/ConsoleTools/exceptions/argument_already_registered.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/argument_already_registered.php";}s:60:"ezc/ConsoleTools/exceptions/argument_mandatory_violation.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b9e1712dced4a71c03299d2d629d8bd9";s:4:"name";s:60:"ezc/ConsoleTools/exceptions/argument_mandatory_violation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/argument_mandatory_violation.php";}s:49:"ezc/ConsoleTools/exceptions/argument_too_many.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"016560b74a1713b240b3b2831fb9ce15";s:4:"name";s:49:"ezc/ConsoleTools/exceptions/argument_too_many.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/argument_too_many.php";}s:55:"ezc/ConsoleTools/exceptions/argument_type_violation.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a928f645d541811a6cb268cfcf989103";s:4:"name";s:55:"ezc/ConsoleTools/exceptions/argument_type_violation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:85:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/argument_type_violation.php";}s:44:"ezc/ConsoleTools/exceptions/dialog_abort.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dfafc6e5a8f5e95b3f9d7fc83256ba3a";s:4:"name";s:44:"ezc/ConsoleTools/exceptions/dialog_abort.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/dialog_abort.php";}s:41:"ezc/ConsoleTools/exceptions/exception.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3a0932a2bd5a048165650d9c1c65d394";s:4:"name";s:41:"ezc/ConsoleTools/exceptions/exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/exception.php";}s:51:"ezc/ConsoleTools/exceptions/invalid_option_name.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"55ec00268bfdcabaececab9717e670b0";s:4:"name";s:51:"ezc/ConsoleTools/exceptions/invalid_option_name.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/invalid_option_name.php";}s:53:"ezc/ConsoleTools/exceptions/invalid_output_target.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8387a3ed2488c13d8e85ac1f36d2776d";s:4:"name";s:53:"ezc/ConsoleTools/exceptions/invalid_output_target.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/invalid_output_target.php";}s:50:"ezc/ConsoleTools/exceptions/no_position_stored.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"adf293f0a7b64a11ad750ceb7d8d06fb";s:4:"name";s:50:"ezc/ConsoleTools/exceptions/no_position_stored.php";s:4:"role";s:3:"php";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/no_position_stored.php";}s:54:"ezc/ConsoleTools/exceptions/no_valid_dialog_result.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"26c6652ca11a904feb0114ea063137ad";s:4:"name";s:54:"ezc/ConsoleTools/exceptions/no_valid_dialog_result.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/no_valid_dialog_result.php";}s:38:"ezc/ConsoleTools/exceptions/option.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1342642994f7e2af6617ab50e1d50201";s:4:"name";s:38:"ezc/ConsoleTools/exceptions/option.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option.php";}s:57:"ezc/ConsoleTools/exceptions/option_already_registered.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1c82d9cd44cab9cd2912a7ff85fe778b";s:4:"name";s:57:"ezc/ConsoleTools/exceptions/option_already_registered.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_already_registered.php";}s:58:"ezc/ConsoleTools/exceptions/option_arguments_violation.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"920d616d1bc71c83e4730273219d2734";s:4:"name";s:58:"ezc/ConsoleTools/exceptions/option_arguments_violation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_arguments_violation.php";}s:59:"ezc/ConsoleTools/exceptions/option_dependency_violation.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"524d16a055a3d3a41c2dc3c0c1a1fed2";s:4:"name";s:59:"ezc/ConsoleTools/exceptions/option_dependency_violation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:89:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_dependency_violation.php";}s:58:"ezc/ConsoleTools/exceptions/option_exclusion_violation.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"99291a96437e2ab968e1db9e8ef14a11";s:4:"name";s:58:"ezc/ConsoleTools/exceptions/option_exclusion_violation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_exclusion_violation.php";}s:58:"ezc/ConsoleTools/exceptions/option_mandatory_violation.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1f5f85eb8c761af0a4c0cf72552a87ac";s:4:"name";s:58:"ezc/ConsoleTools/exceptions/option_mandatory_violation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:88:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_mandatory_violation.php";}s:52:"ezc/ConsoleTools/exceptions/option_missing_value.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"17756f682466ebd0e1854eefcdb392fb";s:4:"name";s:52:"ezc/ConsoleTools/exceptions/option_missing_value.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_missing_value.php";}s:49:"ezc/ConsoleTools/exceptions/option_not_exists.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"779c88d8911c1a37a8f62c07a7609fd1";s:4:"name";s:49:"ezc/ConsoleTools/exceptions/option_not_exists.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_not_exists.php";}s:47:"ezc/ConsoleTools/exceptions/option_no_alias.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"bcef6b269e9518b5ab50a665dcefdae4";s:4:"name";s:47:"ezc/ConsoleTools/exceptions/option_no_alias.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_no_alias.php";}s:60:"ezc/ConsoleTools/exceptions/option_string_not_wellformed.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"22cb7a2e3afecccbe82e7a43b7e3c0b0";s:4:"name";s:60:"ezc/ConsoleTools/exceptions/option_string_not_wellformed.php";s:4:"role";s:3:"php";s:12:"installed_as";s:90:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_string_not_wellformed.php";}s:54:"ezc/ConsoleTools/exceptions/option_too_many_values.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e65ae0e90ec95ec1b02d427585bcb147";s:4:"name";s:54:"ezc/ConsoleTools/exceptions/option_too_many_values.php";s:4:"role";s:3:"php";s:12:"installed_as";s:84:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_too_many_values.php";}s:53:"ezc/ConsoleTools/exceptions/option_type_violation.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c1b97683c2dada4c35d670f22bf4bfd9";s:4:"name";s:53:"ezc/ConsoleTools/exceptions/option_type_violation.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions/option_type_violation.php";}s:51:"ezc/ConsoleTools/input/help_generators/standard.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1358c658d502de8757d6a8e4ae40d636";s:4:"name";s:51:"ezc/ConsoleTools/input/help_generators/standard.php";s:4:"role";s:3:"php";s:12:"installed_as";s:81:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/input/help_generators/standard.php";}s:46:"ezc/ConsoleTools/input/validators/standard.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3d2a4f1bb8d46856c6da3c266fa8b019";s:4:"name";s:46:"ezc/ConsoleTools/input/validators/standard.php";s:4:"role";s:3:"php";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/input/validators/standard.php";}s:35:"ezc/ConsoleTools/input/argument.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a3c508cecae94655b9d134c18bf16ad2";s:4:"name";s:35:"ezc/ConsoleTools/input/argument.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/input/argument.php";}s:36:"ezc/ConsoleTools/input/arguments.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"64be58bc0e7faef3f8548b69f8975ced";s:4:"name";s:36:"ezc/ConsoleTools/input/arguments.php";s:4:"role";s:3:"php";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/input/arguments.php";}s:33:"ezc/ConsoleTools/input/option.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"464bd6804e9ea90cd7e8c4e395f51a70";s:4:"name";s:33:"ezc/ConsoleTools/input/option.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/input/option.php";}s:38:"ezc/ConsoleTools/interfaces/dialog.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"da1589cfccd05250f85b1d8c30f4da7c";s:4:"name";s:38:"ezc/ConsoleTools/interfaces/dialog.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/interfaces/dialog.php";}s:48:"ezc/ConsoleTools/interfaces/dialog_validator.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"fbc7fafd21090e559cbc707bf8d2ea5a";s:4:"name";s:48:"ezc/ConsoleTools/interfaces/dialog_validator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:78:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/interfaces/dialog_validator.php";}s:52:"ezc/ConsoleTools/interfaces/input_help_generator.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1e0b4eb1a29c41f385781ca8b9c3e442";s:4:"name";s:52:"ezc/ConsoleTools/interfaces/input_help_generator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:82:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/interfaces/input_help_generator.php";}s:47:"ezc/ConsoleTools/interfaces/input_validator.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2e5f1707fe47153bf4b1e48aa01cf76c";s:4:"name";s:47:"ezc/ConsoleTools/interfaces/input_validator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/interfaces/input_validator.php";}s:53:"ezc/ConsoleTools/interfaces/menu_dialog_validator.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e7e4198450a70f692c5882464a7e9e11";s:4:"name";s:53:"ezc/ConsoleTools/interfaces/menu_dialog_validator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:83:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/interfaces/menu_dialog_validator.php";}s:57:"ezc/ConsoleTools/interfaces/question_dialog_validator.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8e2d83164e1a649c3f59a13f3915a9f8";s:4:"name";s:57:"ezc/ConsoleTools/interfaces/question_dialog_validator.php";s:4:"role";s:3:"php";s:12:"installed_as";s:87:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/interfaces/question_dialog_validator.php";}s:35:"ezc/ConsoleTools/options/dialog.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c8c8969fe1528d7e4c28db6c078b0245";s:4:"name";s:35:"ezc/ConsoleTools/options/dialog.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/options/dialog.php";}s:40:"ezc/ConsoleTools/options/menu_dialog.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6f5724cd06d9d4541428384879d42eec";s:4:"name";s:40:"ezc/ConsoleTools/options/menu_dialog.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/options/menu_dialog.php";}s:35:"ezc/ConsoleTools/options/output.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c0482b1ed0ecff49594bace3aa62d4d0";s:4:"name";s:35:"ezc/ConsoleTools/options/output.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/options/output.php";}s:40:"ezc/ConsoleTools/options/progressbar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3e6808ce1f4843313b1c5d9997507f91";s:4:"name";s:40:"ezc/ConsoleTools/options/progressbar.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/options/progressbar.php";}s:44:"ezc/ConsoleTools/options/progressmonitor.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dc171e2272f4929c312c553d452b807d";s:4:"name";s:44:"ezc/ConsoleTools/options/progressmonitor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/options/progressmonitor.php";}s:44:"ezc/ConsoleTools/options/question_dialog.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"069eb222843610015ed324dca2b56dec";s:4:"name";s:44:"ezc/ConsoleTools/options/question_dialog.php";s:4:"role";s:3:"php";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/options/question_dialog.php";}s:38:"ezc/ConsoleTools/options/statusbar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"70d32f729b97d036e7729f7426bc7b45";s:4:"name";s:38:"ezc/ConsoleTools/options/statusbar.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/options/statusbar.php";}s:34:"ezc/ConsoleTools/options/table.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7426cf158c78345d7656a0e23b752d25";s:4:"name";s:34:"ezc/ConsoleTools/options/table.php";s:4:"role";s:3:"php";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/options/table.php";}s:40:"ezc/ConsoleTools/structs/option_rule.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"772506539fa9180fbfe3167d95462bdd";s:4:"name";s:40:"ezc/ConsoleTools/structs/option_rule.php";s:4:"role";s:3:"php";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/structs/option_rule.php";}s:42:"ezc/ConsoleTools/structs/output_format.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a7ef5dd26f2d70fe8374200c52136451";s:4:"name";s:42:"ezc/ConsoleTools/structs/output_format.php";s:4:"role";s:3:"php";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/structs/output_format.php";}s:43:"ezc/ConsoleTools/structs/output_formats.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"fe2a5c4ebcce728d87dab9ffaec878ef";s:4:"name";s:43:"ezc/ConsoleTools/structs/output_formats.php";s:4:"role";s:3:"php";s:12:"installed_as";s:73:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/structs/output_formats.php";}s:31:"ezc/ConsoleTools/table/cell.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"84edad158922a7b0b07975b720fd11d4";s:4:"name";s:31:"ezc/ConsoleTools/table/cell.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/table/cell.php";}s:30:"ezc/ConsoleTools/table/row.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2d99e475e21a0a82fd0051ae07e47f4d";s:4:"name";s:30:"ezc/ConsoleTools/table/row.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/table/row.php";}s:33:"ezc/ConsoleTools/tools/string.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1f23811735a6bd4f98b8c2f9a688d934";s:4:"name";s:33:"ezc/ConsoleTools/tools/string.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/tools/string.php";}s:37:"ezc/ConsoleTools/console_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a5d0832dc9a28b1b83e377ec2f72503c";s:4:"name";s:37:"ezc/ConsoleTools/console_autoload.php";s:4:"role";s:3:"php";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/console_autoload.php";}s:34:"ezc/ConsoleTools/dialog_viewer.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"131b67a1b928ff63db8ffd6eefbe17b6";s:4:"name";s:34:"ezc/ConsoleTools/dialog_viewer.php";s:4:"role";s:3:"php";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/dialog_viewer.php";}s:26:"ezc/ConsoleTools/input.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"35da1f48b0fa95bf771729f5bafe3220";s:4:"name";s:26:"ezc/ConsoleTools/input.php";s:4:"role";s:3:"php";s:12:"installed_as";s:56:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/input.php";}s:27:"ezc/ConsoleTools/output.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f7b975843f75809d42e6710a7793b4c6";s:4:"name";s:27:"ezc/ConsoleTools/output.php";s:4:"role";s:3:"php";s:12:"installed_as";s:57:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/output.php";}s:32:"ezc/ConsoleTools/progressbar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7de9cac1d84eca29792d54241b210633";s:4:"name";s:32:"ezc/ConsoleTools/progressbar.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/progressbar.php";}s:36:"ezc/ConsoleTools/progressmonitor.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f3b0f156acc3ee5d6e5c1652aac5cb47";s:4:"name";s:36:"ezc/ConsoleTools/progressmonitor.php";s:4:"role";s:3:"php";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/progressmonitor.php";}s:30:"ezc/ConsoleTools/statusbar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d6a504831ced759070096f0585b27e45";s:4:"name";s:30:"ezc/ConsoleTools/statusbar.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/statusbar.php";}s:26:"ezc/ConsoleTools/table.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a78728a6c0328a88aec5ea16201e68f0";s:4:"name";s:26:"ezc/ConsoleTools/table.php";s:4:"role";s:3:"php";s:12:"installed_as";s:56:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/table.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:19:{s:54:"/opt/alt/php54/usr/share/pear/data/ConsoleTools/design";b:1;s:47:"/opt/alt/php54/usr/share/pear/data/ConsoleTools";b:1;s:55:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs/img";b:1;s:51:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools/docs";b:1;s:46:"/opt/alt/php54/usr/share/doc/pear/ConsoleTools";b:1;s:42:"/opt/alt/php54/usr/share/pear/ezc/autoload";b:1;s:33:"/opt/alt/php54/usr/share/pear/ezc";b:1;s:64:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/dialog/validators";b:1;s:53:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/dialog";b:1;s:46:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools";b:1;s:57:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/exceptions";b:1;s:68:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/input/help_generators";b:1;s:52:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/input";b:1;s:63:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/input/validators";b:1;s:57:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/interfaces";b:1;s:54:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/options";b:1;s:54:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/structs";b:1;s:52:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/table";b:1;s:52:"/opt/alt/php54/usr/share/pear/ezc/ConsoleTools/tools";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.6.1";s:12:"release_date";s:10:"2010-03-22";s:13:"release_state";s:6:"stable";s:15:"release_license";s:7:"New BSD";s:13:"release_notes";s:86:"- Fixed issue #16055: Corrected regression in error message for option
  dependencies.";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.2.1";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.2";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"components.ez.no";s:4:"name";s:4:"Base";s:3:"rel";s:2:"ge";s:7:"version";s:3:"1.8";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:10:"eZ systems";s:5:"email";s:9:"ezc@ez.no";s:6:"active";s:3:"yes";s:6:"handle";s:3:"ezc";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506489;}PK�^�\L����e�e4pear/.registry/.channel.components.ez.no/archive.regnu�[���a:22:{s:7:"attribs";a:6:{s:15:"packagerversion";s:5:"1.9.0";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:7:"Archive";s:7:"channel";s:16:"components.ez.no";s:7:"summary";s:72:"The component allows you to create, modify, and extract archive files of";s:11:"description";s:195:"The component allows you to create, modify, and extract archive files of 
various formats.  The currently supported archives formats are Tar (with 
the flavours: ustar, v7, pax, and gnu) and Zip.";s:4:"lead";a:4:{s:4:"name";s:10:"eZ systems";s:4:"user";s:3:"ezc";s:5:"email";s:9:"ezc@ez.no";s:6:"active";s:3:"yes";}s:4:"date";s:10:"2010-03-22";s:4:"time";s:8:"14:22:30";s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";s:7:"New BSD";s:5:"notes";s:88:"- Fixed #16030: Archive calls posix_* functions even it is only an optional
  depedency.";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:47:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"72bf37bbd23ecb988ed26621668b9ea0";s:4:"name";s:24:"design/class_diagram.png";s:4:"role";s:4:"data";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"741c4ea6a06af6567cd1afe5fed41a53";s:4:"name";s:17:"design/design.txt";s:4:"role";s:4:"data";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6a44661d8d0ed5dea17e26938c1c388c";s:4:"name";s:12:"docs/CREDITS";s:4:"role";s:3:"doc";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2a77e280aa2ae4f807969d0ac3c8152d";s:4:"name";s:16:"docs/example.php";s:4:"role";s:3:"doc";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0d01eec9cb573a51f7cb73a1573c5350";s:4:"name";s:12:"docs/LICENSE";s:4:"role";s:3:"doc";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8d06fa57a81f0a0a5896e5e0457ecebe";s:4:"name";s:17:"docs/tutorial.txt";s:4:"role";s:3:"doc";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c62acdb41db6b2f5f90506fda0ffe426";s:4:"name";s:26:"docs/tutorial_autoload.php";s:4:"role";s:3:"doc";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f313af43fda7b4a1d3406d8231af04bf";s:4:"name";s:29:"docs/tutorial_directories.php";s:4:"role";s:3:"doc";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"65dd3a672e2653f9684af63dbe7b8f39";s:4:"name";s:25:"docs/tutorial_extract.php";s:4:"role";s:3:"doc";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b559a62025c86b39e2b8318f3e6ed8ef";s:4:"name";s:26:"docs/tutorial_iterator.php";s:4:"role";s:3:"doc";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"060715d13ae55509316734f4eb855088";s:4:"name";s:27:"docs/tutorial_read_only.php";s:4:"role";s:3:"doc";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"45e5934942ff8129b05a5111bff812b6";s:4:"name";s:27:"docs/tutorial_recursive.php";s:4:"role";s:3:"doc";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a6af136dfae2051d9c681072fc5be848";s:4:"name";s:27:"docs/tutorial_replacing.php";s:4:"role";s:3:"doc";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8bfdfa690b70a22d4561bf29f87e6cee";s:4:"name";s:37:"ezc/Archive/exceptions/block_size.php";s:4:"role";s:3:"php";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"36b0f5f2a917c3ebb575ea2c94ebeb53";s:4:"name";s:35:"ezc/Archive/exceptions/checksum.php";s:4:"role";s:3:"php";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"19eb3fb3e6ca070d4105b047642f473c";s:4:"name";s:32:"ezc/Archive/exceptions/empty.php";s:4:"role";s:3:"php";}}i:16;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9ad968fb58ff679a0179d959b09832e1";s:4:"name";s:39:"ezc/Archive/exceptions/entry_prefix.php";s:4:"role";s:3:"php";}}i:17;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e84a507b5d7b2d207d0a775c26cbe3a7";s:4:"name";s:36:"ezc/Archive/exceptions/exception.php";s:4:"role";s:3:"php";}}i:18;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"005847d4bde9c903016e3581509bfaf1";s:4:"name";s:45:"ezc/Archive/exceptions/internal_exception.php";s:4:"role";s:3:"php";}}i:19;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"759c2a56665336bf4663c9d19cdd3b2e";s:4:"name";s:29:"ezc/Archive/exceptions/io.php";s:4:"role";s:3:"php";}}i:20;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6fd01fdde9913f1321664f289ec64997";s:4:"name";s:39:"ezc/Archive/exceptions/unknown_type.php";s:4:"role";s:3:"php";}}i:21;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"ec58eb3f5b58f6abdad6b3b91eb8ee53";s:4:"name";s:32:"ezc/Archive/exceptions/value.php";s:4:"role";s:3:"php";}}i:22;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"96b9ad061c90bbeeb5a4daad7d25f586";s:4:"name";s:31:"ezc/Archive/file/block_file.php";s:4:"role";s:3:"php";}}i:23;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"35ebb368ad87b6284664436e670957a2";s:4:"name";s:35:"ezc/Archive/file/character_file.php";s:4:"role";s:3:"php";}}i:24;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"90067477c3b91fbd36960305b5008dc3";s:4:"name";s:25:"ezc/Archive/file/file.php";s:4:"role";s:3:"php";}}i:25;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5b0e79a77cdded79f2f726709557ba0d";s:4:"name";s:35:"ezc/Archive/interfaces/callback.php";s:4:"role";s:3:"php";}}i:26;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"43801773c1b08d20220549a839a11b64";s:4:"name";s:31:"ezc/Archive/options/archive.php";s:4:"role";s:3:"php";}}i:27;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8aff13d2dce9722eb6c017cb56ba0251";s:4:"name";s:28:"ezc/Archive/structs/file.php";s:4:"role";s:3:"php";}}i:28;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"42f4fa41c122b57c7437be5eba2a6681";s:4:"name";s:31:"ezc/Archive/tar/headers/gnu.php";s:4:"role";s:3:"php";}}i:29;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2c538adde875f634371fc03fdf96d5eb";s:4:"name";s:31:"ezc/Archive/tar/headers/pax.php";s:4:"role";s:3:"php";}}i:30;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f740ab119f65467ebdb063afa8e8a1be";s:4:"name";s:33:"ezc/Archive/tar/headers/ustar.php";s:4:"role";s:3:"php";}}i:31;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6411e0637dd4a8f695fee9db1ac4d009";s:4:"name";s:30:"ezc/Archive/tar/headers/v7.php";s:4:"role";s:3:"php";}}i:32;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"33fe42a1cae20f63c1d6cf76c56e7a7c";s:4:"name";s:23:"ezc/Archive/tar/gnu.php";s:4:"role";s:3:"php";}}i:33;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7859fc155b9533787f030970ecf13946";s:4:"name";s:23:"ezc/Archive/tar/pax.php";s:4:"role";s:3:"php";}}i:34;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"87ed07d8eefe3a60197c606b1d2a23a7";s:4:"name";s:25:"ezc/Archive/tar/ustar.php";s:4:"role";s:3:"php";}}i:35;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c2ae79e94564bd272cfa2679184473f2";s:4:"name";s:22:"ezc/Archive/tar/v7.php";s:4:"role";s:3:"php";}}i:36;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3da3d0671f6672514c83d19c81390132";s:4:"name";s:31:"ezc/Archive/utils/checksums.php";s:4:"role";s:3:"php";}}i:37;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"aff89d61a3e1d5098f5ae1c46573b34c";s:4:"name";s:31:"ezc/Archive/utils/file_type.php";s:4:"role";s:3:"php";}}i:38;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"376245afd1446211dc5af606e6df0c67";s:4:"name";s:31:"ezc/Archive/utils/stat_mode.php";s:4:"role";s:3:"php";}}i:39;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3738ab744b6c5bdd1caddd32ea09a84d";s:4:"name";s:45:"ezc/Archive/zip/headers/central_directory.php";s:4:"role";s:3:"php";}}i:40;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f34787c23bf83a287adf52776c9fb463";s:4:"name";s:49:"ezc/Archive/zip/headers/central_directory_end.php";s:4:"role";s:3:"php";}}i:41;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"379e451359f472247c253ae9034b146c";s:4:"name";s:38:"ezc/Archive/zip/headers/local_file.php";s:4:"role";s:3:"php";}}i:42;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6927126b5039b4c393e270f3d52a20da";s:4:"name";s:23:"ezc/Archive/zip/zip.php";s:4:"role";s:3:"php";}}i:43;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1775383dca270e61680af527a93d0f68";s:4:"name";s:23:"ezc/Archive/archive.php";s:4:"role";s:3:"php";}}i:44;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f95a0357cca0dee2450504a3c41d4629";s:4:"name";s:32:"ezc/Archive/archive_autoload.php";s:4:"role";s:3:"php";}}i:45;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"10cee0df9b58cf85787bf50e11307050";s:4:"name";s:21:"ezc/Archive/entry.php";s:4:"role";s:3:"php";}}i:46;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f95a0357cca0dee2450504a3c41d4629";s:4:"name";s:33:"ezc/autoload/archive_autoload.php";s:4:"role";s:3:"php";}}}}}s:12:"dependencies";a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.2.1";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.4.2";}s:7:"package";a:3:{s:4:"name";s:4:"Base";s:7:"channel";s:16:"components.ez.no";s:3:"min";s:3:"1.8";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-03-22";s:7:"license";s:7:"New BSD";s:5:"notes";s:88:"- Fixed #16030: Archive calls posix_* functions even it is only an optional
  depedency.";}}s:8:"filelist";a:47:{s:24:"design/class_diagram.png";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"72bf37bbd23ecb988ed26621668b9ea0";s:4:"name";s:24:"design/class_diagram.png";s:4:"role";s:4:"data";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/data/Archive/design/class_diagram.png";}s:17:"design/design.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"741c4ea6a06af6567cd1afe5fed41a53";s:4:"name";s:17:"design/design.txt";s:4:"role";s:4:"data";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/data/Archive/design/design.txt";}s:12:"docs/CREDITS";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6a44661d8d0ed5dea17e26938c1c388c";s:4:"name";s:12:"docs/CREDITS";s:4:"role";s:3:"doc";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/CREDITS";}s:16:"docs/example.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2a77e280aa2ae4f807969d0ac3c8152d";s:4:"name";s:16:"docs/example.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:58:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/example.php";}s:12:"docs/LICENSE";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0d01eec9cb573a51f7cb73a1573c5350";s:4:"name";s:12:"docs/LICENSE";s:4:"role";s:3:"doc";s:12:"installed_as";s:54:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/LICENSE";}s:17:"docs/tutorial.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8d06fa57a81f0a0a5896e5e0457ecebe";s:4:"name";s:17:"docs/tutorial.txt";s:4:"role";s:3:"doc";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/tutorial.txt";}s:26:"docs/tutorial_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c62acdb41db6b2f5f90506fda0ffe426";s:4:"name";s:26:"docs/tutorial_autoload.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/tutorial_autoload.php";}s:29:"docs/tutorial_directories.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f313af43fda7b4a1d3406d8231af04bf";s:4:"name";s:29:"docs/tutorial_directories.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/tutorial_directories.php";}s:25:"docs/tutorial_extract.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"65dd3a672e2653f9684af63dbe7b8f39";s:4:"name";s:25:"docs/tutorial_extract.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/tutorial_extract.php";}s:26:"docs/tutorial_iterator.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b559a62025c86b39e2b8318f3e6ed8ef";s:4:"name";s:26:"docs/tutorial_iterator.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/tutorial_iterator.php";}s:27:"docs/tutorial_read_only.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"060715d13ae55509316734f4eb855088";s:4:"name";s:27:"docs/tutorial_read_only.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/tutorial_read_only.php";}s:27:"docs/tutorial_recursive.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"45e5934942ff8129b05a5111bff812b6";s:4:"name";s:27:"docs/tutorial_recursive.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/tutorial_recursive.php";}s:27:"docs/tutorial_replacing.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a6af136dfae2051d9c681072fc5be848";s:4:"name";s:27:"docs/tutorial_replacing.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/doc/pear/Archive/docs/tutorial_replacing.php";}s:37:"ezc/Archive/exceptions/block_size.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8bfdfa690b70a22d4561bf29f87e6cee";s:4:"name";s:37:"ezc/Archive/exceptions/block_size.php";s:4:"role";s:3:"php";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/ezc/Archive/exceptions/block_size.php";}s:35:"ezc/Archive/exceptions/checksum.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"36b0f5f2a917c3ebb575ea2c94ebeb53";s:4:"name";s:35:"ezc/Archive/exceptions/checksum.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/ezc/Archive/exceptions/checksum.php";}s:32:"ezc/Archive/exceptions/empty.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"19eb3fb3e6ca070d4105b047642f473c";s:4:"name";s:32:"ezc/Archive/exceptions/empty.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/ezc/Archive/exceptions/empty.php";}s:39:"ezc/Archive/exceptions/entry_prefix.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9ad968fb58ff679a0179d959b09832e1";s:4:"name";s:39:"ezc/Archive/exceptions/entry_prefix.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/ezc/Archive/exceptions/entry_prefix.php";}s:36:"ezc/Archive/exceptions/exception.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e84a507b5d7b2d207d0a775c26cbe3a7";s:4:"name";s:36:"ezc/Archive/exceptions/exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/ezc/Archive/exceptions/exception.php";}s:45:"ezc/Archive/exceptions/internal_exception.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"005847d4bde9c903016e3581509bfaf1";s:4:"name";s:45:"ezc/Archive/exceptions/internal_exception.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/ezc/Archive/exceptions/internal_exception.php";}s:29:"ezc/Archive/exceptions/io.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"759c2a56665336bf4663c9d19cdd3b2e";s:4:"name";s:29:"ezc/Archive/exceptions/io.php";s:4:"role";s:3:"php";s:12:"installed_as";s:59:"/opt/alt/php54/usr/share/pear/ezc/Archive/exceptions/io.php";}s:39:"ezc/Archive/exceptions/unknown_type.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6fd01fdde9913f1321664f289ec64997";s:4:"name";s:39:"ezc/Archive/exceptions/unknown_type.php";s:4:"role";s:3:"php";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/ezc/Archive/exceptions/unknown_type.php";}s:32:"ezc/Archive/exceptions/value.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"ec58eb3f5b58f6abdad6b3b91eb8ee53";s:4:"name";s:32:"ezc/Archive/exceptions/value.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/ezc/Archive/exceptions/value.php";}s:31:"ezc/Archive/file/block_file.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"96b9ad061c90bbeeb5a4daad7d25f586";s:4:"name";s:31:"ezc/Archive/file/block_file.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/ezc/Archive/file/block_file.php";}s:35:"ezc/Archive/file/character_file.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"35ebb368ad87b6284664436e670957a2";s:4:"name";s:35:"ezc/Archive/file/character_file.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/ezc/Archive/file/character_file.php";}s:25:"ezc/Archive/file/file.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"90067477c3b91fbd36960305b5008dc3";s:4:"name";s:25:"ezc/Archive/file/file.php";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php54/usr/share/pear/ezc/Archive/file/file.php";}s:35:"ezc/Archive/interfaces/callback.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"5b0e79a77cdded79f2f726709557ba0d";s:4:"name";s:35:"ezc/Archive/interfaces/callback.php";s:4:"role";s:3:"php";s:12:"installed_as";s:65:"/opt/alt/php54/usr/share/pear/ezc/Archive/interfaces/callback.php";}s:31:"ezc/Archive/options/archive.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"43801773c1b08d20220549a839a11b64";s:4:"name";s:31:"ezc/Archive/options/archive.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/ezc/Archive/options/archive.php";}s:28:"ezc/Archive/structs/file.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"8aff13d2dce9722eb6c017cb56ba0251";s:4:"name";s:28:"ezc/Archive/structs/file.php";s:4:"role";s:3:"php";s:12:"installed_as";s:58:"/opt/alt/php54/usr/share/pear/ezc/Archive/structs/file.php";}s:31:"ezc/Archive/tar/headers/gnu.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"42f4fa41c122b57c7437be5eba2a6681";s:4:"name";s:31:"ezc/Archive/tar/headers/gnu.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/ezc/Archive/tar/headers/gnu.php";}s:31:"ezc/Archive/tar/headers/pax.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2c538adde875f634371fc03fdf96d5eb";s:4:"name";s:31:"ezc/Archive/tar/headers/pax.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/ezc/Archive/tar/headers/pax.php";}s:33:"ezc/Archive/tar/headers/ustar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f740ab119f65467ebdb063afa8e8a1be";s:4:"name";s:33:"ezc/Archive/tar/headers/ustar.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/ezc/Archive/tar/headers/ustar.php";}s:30:"ezc/Archive/tar/headers/v7.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6411e0637dd4a8f695fee9db1ac4d009";s:4:"name";s:30:"ezc/Archive/tar/headers/v7.php";s:4:"role";s:3:"php";s:12:"installed_as";s:60:"/opt/alt/php54/usr/share/pear/ezc/Archive/tar/headers/v7.php";}s:23:"ezc/Archive/tar/gnu.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"33fe42a1cae20f63c1d6cf76c56e7a7c";s:4:"name";s:23:"ezc/Archive/tar/gnu.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/ezc/Archive/tar/gnu.php";}s:23:"ezc/Archive/tar/pax.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"7859fc155b9533787f030970ecf13946";s:4:"name";s:23:"ezc/Archive/tar/pax.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/ezc/Archive/tar/pax.php";}s:25:"ezc/Archive/tar/ustar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"87ed07d8eefe3a60197c606b1d2a23a7";s:4:"name";s:25:"ezc/Archive/tar/ustar.php";s:4:"role";s:3:"php";s:12:"installed_as";s:55:"/opt/alt/php54/usr/share/pear/ezc/Archive/tar/ustar.php";}s:22:"ezc/Archive/tar/v7.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"c2ae79e94564bd272cfa2679184473f2";s:4:"name";s:22:"ezc/Archive/tar/v7.php";s:4:"role";s:3:"php";s:12:"installed_as";s:52:"/opt/alt/php54/usr/share/pear/ezc/Archive/tar/v7.php";}s:31:"ezc/Archive/utils/checksums.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3da3d0671f6672514c83d19c81390132";s:4:"name";s:31:"ezc/Archive/utils/checksums.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/ezc/Archive/utils/checksums.php";}s:31:"ezc/Archive/utils/file_type.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"aff89d61a3e1d5098f5ae1c46573b34c";s:4:"name";s:31:"ezc/Archive/utils/file_type.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/ezc/Archive/utils/file_type.php";}s:31:"ezc/Archive/utils/stat_mode.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"376245afd1446211dc5af606e6df0c67";s:4:"name";s:31:"ezc/Archive/utils/stat_mode.php";s:4:"role";s:3:"php";s:12:"installed_as";s:61:"/opt/alt/php54/usr/share/pear/ezc/Archive/utils/stat_mode.php";}s:45:"ezc/Archive/zip/headers/central_directory.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"3738ab744b6c5bdd1caddd32ea09a84d";s:4:"name";s:45:"ezc/Archive/zip/headers/central_directory.php";s:4:"role";s:3:"php";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/ezc/Archive/zip/headers/central_directory.php";}s:49:"ezc/Archive/zip/headers/central_directory_end.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f34787c23bf83a287adf52776c9fb463";s:4:"name";s:49:"ezc/Archive/zip/headers/central_directory_end.php";s:4:"role";s:3:"php";s:12:"installed_as";s:79:"/opt/alt/php54/usr/share/pear/ezc/Archive/zip/headers/central_directory_end.php";}s:38:"ezc/Archive/zip/headers/local_file.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"379e451359f472247c253ae9034b146c";s:4:"name";s:38:"ezc/Archive/zip/headers/local_file.php";s:4:"role";s:3:"php";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/ezc/Archive/zip/headers/local_file.php";}s:23:"ezc/Archive/zip/zip.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6927126b5039b4c393e270f3d52a20da";s:4:"name";s:23:"ezc/Archive/zip/zip.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/ezc/Archive/zip/zip.php";}s:23:"ezc/Archive/archive.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"1775383dca270e61680af527a93d0f68";s:4:"name";s:23:"ezc/Archive/archive.php";s:4:"role";s:3:"php";s:12:"installed_as";s:53:"/opt/alt/php54/usr/share/pear/ezc/Archive/archive.php";}s:32:"ezc/Archive/archive_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f95a0357cca0dee2450504a3c41d4629";s:4:"name";s:32:"ezc/Archive/archive_autoload.php";s:4:"role";s:3:"php";s:12:"installed_as";s:62:"/opt/alt/php54/usr/share/pear/ezc/Archive/archive_autoload.php";}s:21:"ezc/Archive/entry.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"10cee0df9b58cf85787bf50e11307050";s:4:"name";s:21:"ezc/Archive/entry.php";s:4:"role";s:3:"php";s:12:"installed_as";s:51:"/opt/alt/php54/usr/share/pear/ezc/Archive/entry.php";}s:33:"ezc/autoload/archive_autoload.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f95a0357cca0dee2450504a3c41d4629";s:4:"name";s:33:"ezc/autoload/archive_autoload.php";s:4:"role";s:3:"php";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/pear/ezc/autoload/archive_autoload.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:17:{s:49:"/opt/alt/php54/usr/share/pear/data/Archive/design";b:1;s:42:"/opt/alt/php54/usr/share/pear/data/Archive";b:1;s:46:"/opt/alt/php54/usr/share/doc/pear/Archive/docs";b:1;s:41:"/opt/alt/php54/usr/share/doc/pear/Archive";b:1;s:52:"/opt/alt/php54/usr/share/pear/ezc/Archive/exceptions";b:1;s:41:"/opt/alt/php54/usr/share/pear/ezc/Archive";b:1;s:33:"/opt/alt/php54/usr/share/pear/ezc";b:1;s:46:"/opt/alt/php54/usr/share/pear/ezc/Archive/file";b:1;s:52:"/opt/alt/php54/usr/share/pear/ezc/Archive/interfaces";b:1;s:49:"/opt/alt/php54/usr/share/pear/ezc/Archive/options";b:1;s:49:"/opt/alt/php54/usr/share/pear/ezc/Archive/structs";b:1;s:53:"/opt/alt/php54/usr/share/pear/ezc/Archive/tar/headers";b:1;s:45:"/opt/alt/php54/usr/share/pear/ezc/Archive/tar";b:1;s:47:"/opt/alt/php54/usr/share/pear/ezc/Archive/utils";b:1;s:53:"/opt/alt/php54/usr/share/pear/ezc/Archive/zip/headers";b:1;s:45:"/opt/alt/php54/usr/share/pear/ezc/Archive/zip";b:1;s:42:"/opt/alt/php54/usr/share/pear/ezc/autoload";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.4.1";s:12:"release_date";s:10:"2010-03-22";s:13:"release_state";s:6:"stable";s:15:"release_license";s:7:"New BSD";s:13:"release_notes";s:88:"- Fixed #16030: Archive calls posix_* functions even it is only an optional
  depedency.";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.2.1";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.4.2";s:8:"optional";s:2:"no";}i:2;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:16:"components.ez.no";s:4:"name";s:4:"Base";s:3:"rel";s:2:"ge";s:7:"version";s:3:"1.8";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:1:{i:0;a:5:{s:4:"name";s:10:"eZ systems";s:5:"email";s:9:"ezc@ez.no";s:6:"active";s:3:"yes";s:6:"handle";s:3:"ezc";s:4:"role";s:4:"lead";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1709506489;}PK�^�\�/�uvuvpear/.registry/xml_util.regnu�[���a:23:{s:7:"attribs";a:6:{s:15:"packagerversion";s:6:"1.10.5";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:159:"http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:8:"XML_Util";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:17:"XML utility class";s:11:"description";s:192:"Selection of methods that are often needed when working with XML documents.  Functionality includes creating of attribute lists from arrays, creation of tags, validation of XML names and more.";s:4:"lead";a:2:{i:0;a:4:{s:4:"name";s:13:"Chuck Burgess";s:4:"user";s:7:"ashnazg";s:5:"email";s:15:"ashnazg@php.net";s:6:"active";s:3:"yes";}i:1;a:4:{s:4:"name";s:15:"Stephan Schmidt";s:4:"user";s:5:"schst";s:5:"email";s:19:"schst@php-tools.net";s:6:"active";s:2:"no";}}s:6:"helper";a:4:{s:4:"name";s:12:"Davey Shafik";s:4:"user";s:5:"davey";s:5:"email";s:13:"davey@php.net";s:6:"active";s:2:"no";}s:4:"date";s:10:"2020-04-19";s:4:"time";s:8:"14:54:10";s:7:"version";a:2:{s:7:"release";s:5:"1.4.5";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:64:"* PR #12: fix Trying to access array offset on value of type int";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:2:{s:14:"baseinstalldir";s:1:"/";s:4:"name";s:1:"/";}s:4:"file";a:25:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"af2746028ae4395f549855a5e444ada7";s:4:"name";s:20:"examples/example.php";s:4:"role";s:3:"doc";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b9e52f4aa372c4067c609f49c2285b8f";s:4:"name";s:21:"examples/example2.php";s:4:"role";s:3:"doc";}}i:2;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d0af9354df0962e70e9e2215b5611b9c";s:4:"name";s:27:"tests/AbstractUnitTests.php";s:4:"role";s:4:"test";}}i:3;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"57ce547d64d6e1f2986c313407deffef";s:4:"name";s:25:"tests/ApiVersionTests.php";s:4:"role";s:4:"test";}}i:4;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2d0427db94790df7ada24a744547edf5";s:4:"name";s:33:"tests/AttributesToStringTests.php";s:4:"role";s:4:"test";}}i:5;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"673d1438c4718a70c5da3fe019027db4";s:4:"name";s:32:"tests/CollapseEmptyTagsTests.php";s:4:"role";s:4:"test";}}i:6;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"46b981f91edd163f1cd021cfef5d1bb1";s:4:"name";s:33:"tests/CreateCDataSectionTests.php";s:4:"role";s:4:"test";}}i:7;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6aa925b879572e9b3f1885b7cdbb223b";s:4:"name";s:28:"tests/CreateCommentTests.php";s:4:"role";s:4:"test";}}i:8;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dbc083b62a020fa245fde5a7828a4806";s:4:"name";s:31:"tests/CreateEndElementTests.php";s:4:"role";s:4:"test";}}i:9;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f58e38343ecf60811c842d4cfc8194ae";s:4:"name";s:33:"tests/CreateStartElementTests.php";s:4:"role";s:4:"test";}}i:10;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9385fba272f4ebccf4c95d43d16dcff4";s:4:"name";s:24:"tests/CreateTagTests.php";s:4:"role";s:4:"test";}}i:11;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"51e7ba1390e6dadc3c0be0c960bf171d";s:4:"name";s:33:"tests/CreateTagFromArrayTests.php";s:4:"role";s:4:"test";}}i:12;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6bbb54ef4cf56dc2c0b558b295de5668";s:4:"name";s:36:"tests/GetDocTypeDeclarationTests.php";s:4:"role";s:4:"test";}}i:13;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"825b440b0ee8abd10b4df017c08bf15f";s:4:"name";s:32:"tests/GetXmlDeclarationTests.php";s:4:"role";s:4:"test";}}i:14;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e6783bb330f8f2ae7225f02d56f194e4";s:4:"name";s:26:"tests/IsValidNameTests.php";s:4:"role";s:4:"test";}}i:15;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b273525b905ae6d5fc53adcb3ce0b8d9";s:4:"name";s:25:"tests/RaiseErrorTests.php";s:4:"role";s:4:"test";}}i:16;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"20befbef5e55639539336761a17c64f3";s:4:"name";s:30:"tests/ReplaceEntitiesTests.php";s:4:"role";s:4:"test";}}i:17;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a3ceff3302e31f90130be01c312b33b3";s:4:"name";s:30:"tests/ReverseEntitiesTests.php";s:4:"role";s:4:"test";}}i:18;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"aeb95108896180ef77a7dce3c310a3b8";s:4:"name";s:33:"tests/SplitQualifiedNameTests.php";s:4:"role";s:4:"test";}}i:19;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e93010b1eff68f889fefcb006bf20b63";s:4:"name";s:22:"tests/Bug4950Tests.php";s:4:"role";s:4:"test";}}i:20;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"748ffb640e13e7b960385c7e12413782";s:4:"name";s:22:"tests/Bug5392Tests.php";s:4:"role";s:4:"test";}}i:21;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"01e68b66e27a6fdb197d572c67ae6bc5";s:4:"name";s:23:"tests/Bug18343Tests.php";s:4:"role";s:4:"test";}}i:22;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d945220c38344bc773b18244439bb0cc";s:4:"name";s:23:"tests/Bug21177Tests.php";s:4:"role";s:4:"test";}}i:23;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"af2672bb90875c2e00f93f563bfafe70";s:4:"name";s:23:"tests/Bug21184Tests.php";s:4:"role";s:4:"test";}}i:24;a:2:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0db6fa9c169bf6904aa7e588c2325a13";s:4:"name";s:12:"XML/Util.php";s:4:"role";s:3:"php";}s:13:"tasks:replace";a:1:{s:7:"attribs";a:3:{s:4:"from";s:9:"@version@";s:2:"to";s:7:"version";s:4:"type";s:12:"package-info";}}}}}}s:12:"dependencies";a:1:{s:8:"required";a:3:{s:3:"php";a:1:{s:3:"min";s:5:"5.4.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.9.0";}s:9:"extension";a:1:{s:4:"name";s:4:"pcre";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:31:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.1";s:3:"api";s:3:"0.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-08-01";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:14:"inital release";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.1.1";s:3:"api";s:5:"0.1.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-08-02";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:41:"bugfix: removed bug in createTagFromArray";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.2";s:3:"api";s:3:"0.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-08-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:39:"added XML_Util::getDocTypeDeclaration()";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.2.1";s:3:"api";s:5:"0.2.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:70:"fixed bug with zero as tag content in createTagFromArray and createTag";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.3";s:3:"api";s:3:"0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:49:"added createStartElement() and createEndElement()";}i:5;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.4";s:3:"api";s:3:"0.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-21";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:132:"added createCDataSection(),
added support for CData sections in createTag* methods,
fixed bug #23,
fixed bug in splitQualifiedName()";}i:6;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.5";s:3:"api";s:3:"0.5";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-23";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:170:"added support for multiline attributes in attributesToString(), createTag*() and createStartElement (requested by Yavor Shahpasov for XML_Serializer),
added createComment";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.5.1";s:3:"api";s:5:"0.5.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-09-26";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:102:"added default namespace parameter (optional) in splitQualifiedName() (requested by Sebastian Bergmann)";}i:8;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.5.2";s:3:"api";s:5:"0.5.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-11-22";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:78:"now creates XHTML compliant empty tags (Davey),
minor whitespace fixes (Davey)";}i:9;a:5:{s:7:"version";a:2:{s:7:"release";s:10:"0.6.0beta1";s:3:"api";s:10:"0.6.0beta1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2004-05-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:567:"- Fixed bug 1438 (namespaces not accepted for isValidName()) (thanks to davey)
- added optional parameter to replaceEntities() to define the set of entities to replace
- added optional parameter to attributesToString() to define, whether entities should be replaced (requested by Sebastian Bergmann)
- allowed second parameter to XML_Util::attributesToString() to be an array containing options (easier to use, if you only need to set the last parameter)
- introduced XML_Util::raiseError() to avoid the necessity of including PEAR.php, will only be included on error";}i:10;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.6.0";s:3:"api";s:5:"0.6.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-06-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:567:"- Fixed bug 1438 (namespaces not accepted for isValidName()) (thanks to davey)
- added optional parameter to replaceEntities() to define the set of entities to replace
- added optional parameter to attributesToString() to define, whether entities should be replaced (requested by Sebastian Bergmann)
- allowed second parameter to XML_Util::attributesToString() to be an array containing options (easier to use, if you only need to set the last parameter)
- introduced XML_Util::raiseError() to avoid the necessity of including PEAR.php, will only be included on error";}i:11;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"0.6.1";s:3:"api";s:5:"0.6.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-10-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:103:"- Added check for tag name (either as local part or qualified name) in createTagFromArray() (bug #1083)";}i:12;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.0.0";s:3:"api";s:5:"1.0.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-10-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:41:"- Added reverseEntities() (request #2639)";}i:13;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.0";s:3:"api";s:5:"1.1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-11-19";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:73:"- Added collapseEmptyTags (patch by Sebastian Bergmann and Thomas Duffey)";}i:14;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.1";s:3:"api";s:5:"1.1.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-12-23";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:306:"- fixed bug in replaceEntities() and reverseEntities() in conjunction with XML_UTIL_ENTITIES_HTML
- createTag() and createTagFromArray() now accept XML_UTIL_ENTITIES_XML, XML_UTIL_ENTITIES_XML_REQUIRED, XML_UTIL_ENTITIES_HTML, XML_UTIL_ENTITIES_NONE and XML_UTIL_CDATA_SECTION as $replaceEntities parameter";}i:15;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.2";s:3:"api";s:5:"1.1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-12-01";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:207:"- fixed bug #5419: isValidName() now checks for character classes
- implemented request #8196: added optional parameter to influence array sorting to createTag() createTagFromArray() and createStartElement()";}i:16;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.1.4";s:3:"api";s:5:"1.1.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2006-12-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:61:"- Fixed bug #9561: Not allowing underscores in middle of tags";}i:17;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.2.0a1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:5:"alpha";}s:4:"date";s:10:"2008-05-04";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:208:"Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|ja.doma]";}i:18;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"1.2.0a2";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:5:"alpha";s:3:"api";s:5:"alpha";}s:4:"date";s:10:"2008-05-22";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:403:"Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)";}i:19;a:5:{s:7:"version";a:2:{s:7:"release";s:8:"1.2.0RC1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2008-07-12";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:403:"Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)";}i:20;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.0";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2008-07-26";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:403:"Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)";}i:21;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.1";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-12-31";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:68:"Fixed Bug #14760: Bug in getDocTypeDeclaration() [ashnazg|fpospisil]";}i:22;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.2";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2014-06-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:194:"QA release

Bug #18343 Entities in file names decoded during packaging
Bug #19174	upgrade PHPUnit require statements & other fixes (for PEAR QA Team)
Request #19750	examples/example.php encoding";}i:23;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.2.3";s:3:"api";s:5:"1.2.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2014-06-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:40:"Bug #20293	Broken installation for 1.2.2";}i:24;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-02-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:76:"* Set minimum PHP version to 5.3.0
* Mark static methods with static keyword";}i:25;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-02-03";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:203:"* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Adds a new XML_UTIL_COLLAPSE_NONE option
  for preventing empty tag collapsing.

* Request #15467 CDATA sections and blank nodes";}i:26;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-02-07";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:58:"* Bug #21177 XML_Util::collapseEmptyTags() can return NULL";}i:27;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-02-22";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:27:"* Bug #21184 Collapse issue";}i:28;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-06-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:63:"* Decrease minimum PEAR version to 1.9.0 to allow PEAR upgrades";}i:29;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.4";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-12-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:29:"* PR #11: fix phplint warning";}i:30;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.5";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2020-04-19";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:42:"http://opensource.org/licenses/bsd-license";}s:8:"_content";s:11:"BSD License";}s:5:"notes";s:64:"* PR #12: fix Trying to access array offset on value of type int";}}}s:8:"filelist";a:25:{s:20:"examples/example.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"af2746028ae4395f549855a5e444ada7";s:4:"name";s:20:"examples/example.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:63:"/opt/alt/php54/usr/share/doc/pear/XML_Util/examples/example.php";}s:21:"examples/example2.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b9e52f4aa372c4067c609f49c2285b8f";s:4:"name";s:21:"examples/example2.php";s:4:"role";s:3:"doc";s:12:"installed_as";s:64:"/opt/alt/php54/usr/share/doc/pear/XML_Util/examples/example2.php";}s:27:"tests/AbstractUnitTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d0af9354df0962e70e9e2215b5611b9c";s:4:"name";s:27:"tests/AbstractUnitTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:71:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/AbstractUnitTests.php";}s:25:"tests/ApiVersionTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"57ce547d64d6e1f2986c313407deffef";s:4:"name";s:25:"tests/ApiVersionTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/ApiVersionTests.php";}s:33:"tests/AttributesToStringTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2d0427db94790df7ada24a744547edf5";s:4:"name";s:33:"tests/AttributesToStringTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/AttributesToStringTests.php";}s:32:"tests/CollapseEmptyTagsTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"673d1438c4718a70c5da3fe019027db4";s:4:"name";s:32:"tests/CollapseEmptyTagsTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/CollapseEmptyTagsTests.php";}s:33:"tests/CreateCDataSectionTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"46b981f91edd163f1cd021cfef5d1bb1";s:4:"name";s:33:"tests/CreateCDataSectionTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/CreateCDataSectionTests.php";}s:28:"tests/CreateCommentTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6aa925b879572e9b3f1885b7cdbb223b";s:4:"name";s:28:"tests/CreateCommentTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:72:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/CreateCommentTests.php";}s:31:"tests/CreateEndElementTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"dbc083b62a020fa245fde5a7828a4806";s:4:"name";s:31:"tests/CreateEndElementTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:75:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/CreateEndElementTests.php";}s:33:"tests/CreateStartElementTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"f58e38343ecf60811c842d4cfc8194ae";s:4:"name";s:33:"tests/CreateStartElementTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/CreateStartElementTests.php";}s:24:"tests/CreateTagTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"9385fba272f4ebccf4c95d43d16dcff4";s:4:"name";s:24:"tests/CreateTagTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/CreateTagTests.php";}s:33:"tests/CreateTagFromArrayTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"51e7ba1390e6dadc3c0be0c960bf171d";s:4:"name";s:33:"tests/CreateTagFromArrayTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/CreateTagFromArrayTests.php";}s:36:"tests/GetDocTypeDeclarationTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"6bbb54ef4cf56dc2c0b558b295de5668";s:4:"name";s:36:"tests/GetDocTypeDeclarationTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:80:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/GetDocTypeDeclarationTests.php";}s:32:"tests/GetXmlDeclarationTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"825b440b0ee8abd10b4df017c08bf15f";s:4:"name";s:32:"tests/GetXmlDeclarationTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:76:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/GetXmlDeclarationTests.php";}s:26:"tests/IsValidNameTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e6783bb330f8f2ae7225f02d56f194e4";s:4:"name";s:26:"tests/IsValidNameTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:70:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/IsValidNameTests.php";}s:25:"tests/RaiseErrorTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"b273525b905ae6d5fc53adcb3ce0b8d9";s:4:"name";s:25:"tests/RaiseErrorTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:69:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/RaiseErrorTests.php";}s:30:"tests/ReplaceEntitiesTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"20befbef5e55639539336761a17c64f3";s:4:"name";s:30:"tests/ReplaceEntitiesTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/ReplaceEntitiesTests.php";}s:30:"tests/ReverseEntitiesTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"a3ceff3302e31f90130be01c312b33b3";s:4:"name";s:30:"tests/ReverseEntitiesTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:74:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/ReverseEntitiesTests.php";}s:33:"tests/SplitQualifiedNameTests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"aeb95108896180ef77a7dce3c310a3b8";s:4:"name";s:33:"tests/SplitQualifiedNameTests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:77:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/SplitQualifiedNameTests.php";}s:22:"tests/Bug4950Tests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e93010b1eff68f889fefcb006bf20b63";s:4:"name";s:22:"tests/Bug4950Tests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/Bug4950Tests.php";}s:22:"tests/Bug5392Tests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"748ffb640e13e7b960385c7e12413782";s:4:"name";s:22:"tests/Bug5392Tests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/Bug5392Tests.php";}s:23:"tests/Bug18343Tests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"01e68b66e27a6fdb197d572c67ae6bc5";s:4:"name";s:23:"tests/Bug18343Tests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/Bug18343Tests.php";}s:23:"tests/Bug21177Tests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d945220c38344bc773b18244439bb0cc";s:4:"name";s:23:"tests/Bug21177Tests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/Bug21177Tests.php";}s:23:"tests/Bug21184Tests.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"af2672bb90875c2e00f93f563bfafe70";s:4:"name";s:23:"tests/Bug21184Tests.php";s:4:"role";s:4:"test";s:12:"installed_as";s:67:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests/Bug21184Tests.php";}s:12:"XML/Util.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"0db6fa9c169bf6904aa7e588c2325a13";s:4:"name";s:12:"XML/Util.php";s:4:"role";s:3:"php";s:12:"installed_as";s:42:"/opt/alt/php54/usr/share/pear/XML/Util.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:51:"/opt/alt/php54/usr/share/doc/pear/XML_Util/examples";b:1;s:42:"/opt/alt/php54/usr/share/doc/pear/XML_Util";b:1;s:49:"/opt/alt/php54/usr/share/pear/test/XML_Util/tests";b:1;s:43:"/opt/alt/php54/usr/share/pear/test/XML_Util";b:1;s:33:"/opt/alt/php54/usr/share/pear/XML";b:1;}s:3:"old";a:7:{s:7:"version";s:5:"1.4.5";s:12:"release_date";s:10:"2020-04-19";s:13:"release_state";s:6:"stable";s:15:"release_license";s:11:"BSD License";s:13:"release_notes";s:64:"* PR #12: fix Trying to access array offset on value of type int";s:12:"release_deps";a:3:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.4.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.9.0";s:8:"optional";s:2:"no";}i:2;a:4:{s:4:"type";s:3:"ext";s:4:"name";s:4:"pcre";s:3:"rel";s:3:"has";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:3:{i:0;a:5:{s:4:"name";s:13:"Chuck Burgess";s:5:"email";s:15:"ashnazg@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:7:"ashnazg";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:15:"Stephan Schmidt";s:5:"email";s:19:"schst@php-tools.net";s:6:"active";s:2:"no";s:6:"handle";s:5:"schst";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:12:"Davey Shafik";s:5:"email";s:13:"davey@php.net";s:6:"active";s:2:"no";s:6:"handle";s:5:"davey";s:4:"role";s:6:"helper";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747067531;}PK�^�\��IݠW�Wpear/.registry/archive_tar.regnu�[���a:24:{s:7:"attribs";a:6:{s:15:"packagerversion";s:7:"1.10.12";s:7:"version";s:3:"2.0";s:5:"xmlns";s:35:"http://pear.php.net/dtd/package-2.0";s:11:"xmlns:tasks";s:33:"http://pear.php.net/dtd/tasks-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:147:"http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd";}s:4:"name";s:11:"Archive_Tar";s:7:"channel";s:12:"pear.php.net";s:7:"summary";s:25:"Tar file management class";s:11:"description";s:321:"This class provides handling of tar files in PHP.
It supports creating, listing, extracting and adding to tar files.
Gzip support is available if PHP has the zlib extension built-in or
loaded. Bz2 compression is also supported with the bz2 extension loaded.
Also Lzma2 compressed archives are supported with xz extension.";s:4:"lead";a:3:{i:0;a:4:{s:4:"name";s:14:"Vincent Blavet";s:4:"user";s:7:"vblavet";s:5:"email";s:22:"vincent@phpconcept.net";s:6:"active";s:2:"no";}i:1;a:4:{s:4:"name";s:11:"Greg Beaver";s:4:"user";s:6:"cellog";s:5:"email";s:22:"greg@chiaraquartet.net";s:6:"active";s:2:"no";}i:2;a:4:{s:4:"name";s:12:"Michiel Rook";s:4:"user";s:5:"mrook";s:5:"email";s:13:"mrook@php.net";s:6:"active";s:3:"yes";}}s:6:"helper";a:4:{s:4:"name";s:11:"Stig Bakken";s:4:"user";s:3:"ssb";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";}s:4:"date";s:10:"2021-07-20";s:4:"time";s:8:"19:35:29";s:7:"version";a:2:{s:7:"release";s:6:"1.4.14";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:60:"* Properly fix symbolic link path traversal (CVE-2021-32610)";s:8:"contents";a:1:{s:3:"dir";a:2:{s:7:"attribs";a:1:{s:4:"name";s:1:"/";}s:4:"file";a:2:{i:0;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"95f04c226245ad192b52c9164c1287ad";s:4:"name";s:15:"Archive/Tar.php";s:4:"role";s:3:"php";}}i:1;a:1:{s:7:"attribs";a:4:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2fb90f0be7089a45c09a0d1182792419";s:4:"name";s:20:"docs/Archive_Tar.txt";s:4:"role";s:3:"doc";}}}}}s:10:"compatible";a:4:{s:4:"name";s:4:"PEAR";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.8.0";s:3:"max";s:7:"1.10.10";}s:12:"dependencies";a:1:{s:8:"required";a:2:{s:3:"php";a:1:{s:3:"min";s:5:"5.2.0";}s:13:"pearinstaller";a:1:{s:3:"min";s:5:"1.9.0";}}}s:10:"phprelease";s:0:"";s:9:"changelog";a:1:{s:7:"release";a:39:{i:0;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.4.13";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2021-02-16";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:81:"* Fix Bug #27010: Relative symlinks failing (out-of path file extraction) [mrook]";}i:1;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.4.12";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2021-01-18";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:82:"* Fix Bug #27008: Symlink out-of-path write vulnerability (CVE-2020-36193) [mrook]";}i:2;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.4.11";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2020-11-19";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:97:"* Fix Bug #27002: Filename manipulation vulnerabilities (CVE-2020-28948 / CVE-2020-28949) [mrook]";}i:3;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.4.10";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2020-09-15";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:165:"* Fix block padding when the file buffer length is a multiple of 512 and smaller than Archive_Tar buffer length
* Don't try to copy username/groupname in chroot jail";}i:4;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.9";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-12-04";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:67:"* Implement Feature #23861: Add option to disallow symlinks [mrook]";}i:5;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.8";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-10-21";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:79:"* Fix Bug #23852: PHP 7.4 - Archive_Tar->_readHeader throws deprecation [mrook]";}i:6;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.7";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-04-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:53:"* Improved performance by increasing read buffer size";}i:7;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.6";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-02-01";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:67:"* Improve path traversal detection for forward and backward slashes";}i:8;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.5";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2019-01-02";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:54:"* Fix Bug #23788: Relative symlinks are broken [mrook]";}i:9;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.4";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2018-12-20";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:127:"* Fix Bug #21058: Long symlinks are not supported [mrook]
 * Fix Bug #23782: Prevent phar:// files from being extracted [mrook]";}i:10;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.3";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2017-06-11";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:103:"* Fix Bug #21218: Cannot use result of built-in function in write context in PHP
   7.2.0alpha1 [mrook]";}i:11;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.2";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2016-02-25";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:164:"* Fix reading of archives with files > 8GB
* Performance optimizations
* Do not try to call require_once on PEAR.php if it has already been loaded by the autoloader";}i:12;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.1";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-08-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:60:"* Update composer.json to use pear-core-minimal 1.10.0alpha2";}i:13;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.4.0";s:3:"api";s:5:"1.4.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-07-20";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:104:"* Add support for PHP 7
* Drop support for PHP 4
* Add visibility declarations to methods and properties";}i:14;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.16";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-04-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:73:"* Fix Bug #20514: invalid package.xml; not installable with pyrus [mrook]";}i:15;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.15";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-03-05";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:33:"* Fixes composer.json parse error";}i:16;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.14";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2015-02-26";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:74:"* Fix Bug #18505: Possible incorrect handling of file names in TAR [mrook]";}i:17;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.13";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2014-09-02";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:16:"New BSD
 License";}s:5:"notes";s:36:"* Fix Bug #20382: gzopen fix [mrook]";}i:18;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.12";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2014-08-04";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:16:"New BSD
 License";}s:5:"notes";s:350:"* Fix Bug #19964: Memory leaking in Archive_Tar [mrook]
 * Fix Bug #20246: Broken with php 5.5.9 [mrook]
 * Fix Bug #20275: "pax_global_header" looks like a regular file
 * [mrook]
 * Implement Feature #19827: pass filename to _addFile function - downstream
 * patch [mrook]
 * Implement Feature #20132: Add custom mode/uid/gid to addString() [mrook]";}i:19;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.11";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2013-02-09";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:18:"New BSD
   License";}s:5:"notes";s:128:"* Fix Bug #19746: Broken with PHP 5.5 [mrook]
 * Implement Feature #11258: Custom date/time in files added on-the-fly
 * [mrook]";}i:20;a:5:{s:7:"version";a:2:{s:7:"release";s:6:"1.3.10";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2012-04-10";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:18:"New BSD
   License";}s:5:"notes";s:143:"* Fix Bug #13361: Unable to add() some files (ex. mp3) [mrook]
 * Fix Bug #19330: Class creates incorrect (non-readable) tar.gz file
 * [mrook]";}i:21;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.9";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2012-02-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:17:"New BSD   License";}s:5:"notes";s:259:"* Fix Bug #16759: No error thrown from missing PHP zlib functions [mrook]
 * Fix Bug #18877: Incorrect handling of backslashes in filenames on Linux [mrook]
 * Fix Bug #19085: Error while packaging [mrook]
 * Fix Bug #19289: Invalid tar file generated [mrook]";}i:22;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.8";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2011-10-14";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:449:"* Fix Bug #17853: Test failure: dirtraversal.phpt [mrook]
 * Fix Bug #18512: dead links are not saved in tar file [mrook]
 * Fix Bug #18702: Unpacks incorrectly on long file names using header prefix [mrook]
 * Implement Feature #10145: Patch to return a Pear Error Object on failure [mrook]
 * Implement Feature #17491: Option to preserve permissions [mrook]
 * Implement Feature #17813: Prevent PHP notice when extracting corrupted archive [mrook]";}i:23;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.7";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-04-26";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:25:"PEAR compatibility update";}i:24;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.6";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2010-03-09";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:168:"* Fix Bug #16963: extractList can't extract zipped files from big tar [mrook]
 * Implement Feature #4013: Ignoring files and directories on creating an archive. [mrook]";}i:25;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.5";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-12-31";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:64:"* Fix Bug #16958: Update 'compatible' tag in package.xml [mrook]";}i:26;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.4";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-12-30";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:338:"* Fix Bug #11871: wrong result of ::listContent() if filename begins or ends with space [mrook]
 * Fix Bug #12462: invalid tar magic [mrook]
 * Fix Bug #13918: Long filenames may get up to 511 0x00 bytes appended on read [mrook]
 * Fix Bug #16202: Bogus modification times [mrook]
 * Implement Feature #16212: Die is not exception [mrook]";}i:27;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.3";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2009-03-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:50:"http://www.opensource.org/licenses/bsd-license.php";}s:8:"_content";s:15:"New BSD License";}s:5:"notes";s:249:"Change the license to New BSD license

   minor bugfix release
   * fix Bug #9921 compression with bzip2 fails [cellog]
   * fix Bug #11594 _readLongHeader leaves 0 bytes in filename [jamessas]
   * fix Bug #11769 Incorrect symlink handing [fajar99]";}i:28;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.2";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2007-01-03";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:484:"Correct Bug #4016
Remove duplicate remove error display with '@'
Correct Bug #3909 : Check existence of OS_WINDOWS constant
Correct Bug #5452 fix for "lone zero block" when untarring packages
Change filemode (from pear-core/Archive/Tar.php v.1.21)
Correct Bug #6486 Can not extract symlinks
Correct Bug #6933 Archive_Tar (Tar file management class) Directory traversal
Correct Bug #8114 Files added on-the-fly not storing date
Correct Bug #9352 Bug on _dirCheck function over nfs path";}i:29;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.1";s:3:"api";s:5:"1.3.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-03-17";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:17:"Correct Bug #3855";}i:30;a:5:{s:7:"version";a:2:{s:7:"release";s:5:"1.3.0";s:3:"api";s:5:"1.3.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2005-03-06";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:40:"Bugs correction (2475, 2488, 2135, 2176)";}i:31;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.2";s:3:"api";s:3:"1.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2004-05-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:71:"Add support for other separator than the space char and bug
	correction";}i:32;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.1";s:3:"api";s:3:"1.1";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-05-28";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:141:"* Add support for BZ2 compression
* Add support for add and extract without using temporary files : methods addString() and extractInString()";}i:33;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"1.0";s:3:"api";s:3:"1.0";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2003-01-24";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:23:"Change status to stable";}i:34;a:5:{s:7:"version";a:2:{s:7:"release";s:7:"0.10-b1";s:3:"api";s:7:"0.10-b1";}s:9:"stability";a:2:{s:7:"release";s:4:"beta";s:3:"api";s:4:"beta";}s:4:"date";s:10:"2003-01-08";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:59:"Add support for long filenames (greater than 99 characters)";}i:35;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.9";s:3:"api";s:3:"0.9";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-05-27";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:25:"Auto-detect gzip'ed files";}i:36;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.4";s:3:"api";s:3:"0.4";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-05-20";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:51:"Windows bugfix: use forward slashes inside archives";}i:37;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.2";s:3:"api";s:3:"0.2";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-02-18";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:29:"From initial commit to stable";}i:38;a:5:{s:7:"version";a:2:{s:7:"release";s:3:"0.3";s:3:"api";s:3:"0.3";}s:9:"stability";a:2:{s:7:"release";s:6:"stable";s:3:"api";s:6:"stable";}s:4:"date";s:10:"2002-04-13";s:7:"license";a:2:{s:7:"attribs";a:1:{s:3:"uri";s:26:"http://www.php.net/license";}s:8:"_content";s:11:"PHP License";}s:5:"notes";s:47:"Windows bugfix: used wrong directory separators";}}}s:8:"filelist";a:2:{s:15:"Archive/Tar.php";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"95f04c226245ad192b52c9164c1287ad";s:4:"name";s:15:"Archive/Tar.php";s:4:"role";s:3:"php";s:12:"installed_as";s:45:"/opt/alt/php54/usr/share/pear/Archive/Tar.php";}s:20:"docs/Archive_Tar.txt";a:5:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2fb90f0be7089a45c09a0d1182792419";s:4:"name";s:20:"docs/Archive_Tar.txt";s:4:"role";s:3:"doc";s:12:"installed_as";s:66:"/opt/alt/php54/usr/share/doc/pear/Archive_Tar/docs/Archive_Tar.txt";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:37:"/opt/alt/php54/usr/share/pear/Archive";b:1;s:50:"/opt/alt/php54/usr/share/doc/pear/Archive_Tar/docs";b:1;s:45:"/opt/alt/php54/usr/share/doc/pear/Archive_Tar";b:1;}s:3:"old";a:7:{s:7:"version";s:6:"1.4.14";s:12:"release_date";s:10:"2021-07-20";s:13:"release_state";s:6:"stable";s:15:"release_license";s:15:"New BSD License";s:13:"release_notes";s:60:"* Properly fix symbolic link path traversal (CVE-2021-32610)";s:12:"release_deps";a:2:{i:0;a:4:{s:4:"type";s:3:"php";s:3:"rel";s:2:"ge";s:7:"version";s:5:"5.2.0";s:8:"optional";s:2:"no";}i:1;a:6:{s:4:"type";s:3:"pkg";s:7:"channel";s:12:"pear.php.net";s:4:"name";s:4:"PEAR";s:3:"rel";s:2:"ge";s:7:"version";s:5:"1.9.0";s:8:"optional";s:2:"no";}}s:11:"maintainers";a:4:{i:0;a:5:{s:4:"name";s:14:"Vincent Blavet";s:5:"email";s:22:"vincent@phpconcept.net";s:6:"active";s:2:"no";s:6:"handle";s:7:"vblavet";s:4:"role";s:4:"lead";}i:1;a:5:{s:4:"name";s:11:"Greg Beaver";s:5:"email";s:22:"greg@chiaraquartet.net";s:6:"active";s:2:"no";s:6:"handle";s:6:"cellog";s:4:"role";s:4:"lead";}i:2;a:5:{s:4:"name";s:12:"Michiel Rook";s:5:"email";s:13:"mrook@php.net";s:6:"active";s:3:"yes";s:6:"handle";s:5:"mrook";s:4:"role";s:4:"lead";}i:3;a:5:{s:4:"name";s:11:"Stig Bakken";s:5:"email";s:12:"stig@php.net";s:6:"active";s:2:"no";s:6:"handle";s:3:"ssb";s:4:"role";s:6:"helper";}}}s:10:"xsdversion";s:3:"2.0";s:13:"_lastmodified";i:1747067530;}PK�^�\���=YYpear/Archive/Tar.phpnu�[���<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * File::CSV
 *
 * PHP versions 4 and 5
 *
 * Copyright (c) 1997-2008,
 * Vincent Blavet <vincent@phpconcept.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright notice,
 *       this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category  File_Formats
 * @package   Archive_Tar
 * @author    Vincent Blavet <vincent@phpconcept.net>
 * @copyright 1997-2010 The Authors
 * @license   http://www.opensource.org/licenses/bsd-license.php New BSD License
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/Archive_Tar
 */

// If the PEAR class cannot be loaded via the autoloader,
// then try to require_once it from the PHP include path.
if (!class_exists('PEAR')) {
    require_once 'PEAR.php';
}

define('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
define('ARCHIVE_TAR_END_BLOCK', pack("a512", ''));

if (!function_exists('gzopen') && function_exists('gzopen64')) {
    function gzopen($filename, $mode, $use_include_path = 0)
    {
        return gzopen64($filename, $mode, $use_include_path);
    }
}

if (!function_exists('gztell') && function_exists('gztell64')) {
    function gztell($zp)
    {
        return gztell64($zp);
    }
}

if (!function_exists('gzseek') && function_exists('gzseek64')) {
    function gzseek($zp, $offset, $whence = SEEK_SET)
    {
        return gzseek64($zp, $offset, $whence);
    }
}

/**
 * Creates a (compressed) Tar archive
 *
 * @package Archive_Tar
 * @author  Vincent Blavet <vincent@phpconcept.net>
 * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
 * @version $Revision$
 */
class Archive_Tar extends PEAR
{
    /**
     * @var string Name of the Tar
     */
    public $_tarname = '';

    /**
     * @var boolean if true, the Tar file will be gzipped
     */
    public $_compress = false;

    /**
     * @var string Type of compression : 'none', 'gz', 'bz2' or 'lzma2'
     */
    public $_compress_type = 'none';

    /**
     * @var string Explode separator
     */
    public $_separator = ' ';

    /**
     * @var file descriptor
     */
    public $_file = 0;

    /**
     * @var string Local Tar name of a remote Tar (http:// or ftp://)
     */
    public $_temp_tarname = '';

    /**
     * @var string regular expression for ignoring files or directories
     */
    public $_ignore_regexp = '';

    /**
     * @var object PEAR_Error object
     */
    public $error_object = null;

    /**
     * Format for data extraction
     *
     * @var string
     */
    public $_fmt = '';

    /**
     * @var int Length of the read buffer in bytes
     */
    protected $buffer_length;

    /**
     * Archive_Tar Class constructor. This flavour of the constructor only
     * declare a new Archive_Tar object, identifying it by the name of the
     * tar file.
     * If the compress argument is set the tar will be read or created as a
     * gzip or bz2 compressed TAR file.
     *
     * @param string $p_tarname The name of the tar archive to create
     * @param string $p_compress can be null, 'gz', 'bz2' or 'lzma2'. This
     *               parameter indicates if gzip, bz2 or lzma2 compression
     *               is required.  For compatibility reason the
     *               boolean value 'true' means 'gz'.
     * @param int $buffer_length Length of the read buffer in bytes
     *
     * @return bool
     */
    public function __construct($p_tarname, $p_compress = null, $buffer_length = 512)
    {
        parent::__construct();

        $this->_compress = false;
        $this->_compress_type = 'none';
        if (($p_compress === null) || ($p_compress == '')) {
            if (@file_exists($p_tarname)) {
                if ($fp = @fopen($p_tarname, "rb")) {
                    // look for gzip magic cookie
                    $data = fread($fp, 2);
                    fclose($fp);
                    if ($data == "\37\213") {
                        $this->_compress = true;
                        $this->_compress_type = 'gz';
                        // No sure it's enought for a magic code ....
                    } elseif ($data == "BZ") {
                        $this->_compress = true;
                        $this->_compress_type = 'bz2';
                    } elseif (file_get_contents($p_tarname, false, null, 1, 4) == '7zXZ') {
                        $this->_compress = true;
                        $this->_compress_type = 'lzma2';
                    }
                }
            } else {
                // probably a remote file or some file accessible
                // through a stream interface
                if (substr($p_tarname, -2) == 'gz') {
                    $this->_compress = true;
                    $this->_compress_type = 'gz';
                } elseif ((substr($p_tarname, -3) == 'bz2') ||
                    (substr($p_tarname, -2) == 'bz')
                ) {
                    $this->_compress = true;
                    $this->_compress_type = 'bz2';
                } else {
                    if (substr($p_tarname, -2) == 'xz') {
                        $this->_compress = true;
                        $this->_compress_type = 'lzma2';
                    }
                }
            }
        } else {
            if (($p_compress === true) || ($p_compress == 'gz')) {
                $this->_compress = true;
                $this->_compress_type = 'gz';
            } else {
                if ($p_compress == 'bz2') {
                    $this->_compress = true;
                    $this->_compress_type = 'bz2';
                } else {
                    if ($p_compress == 'lzma2') {
                        $this->_compress = true;
                        $this->_compress_type = 'lzma2';
                    } else {
                        $this->_error(
                            "Unsupported compression type '$p_compress'\n" .
                            "Supported types are 'gz', 'bz2' and 'lzma2'.\n"
                        );
                        return false;
                    }
                }
            }
        }
        $this->_tarname = $p_tarname;
        if ($this->_compress) { // assert zlib or bz2 or xz extension support
            if ($this->_compress_type == 'gz') {
                $extname = 'zlib';
            } else {
                if ($this->_compress_type == 'bz2') {
                    $extname = 'bz2';
                } else {
                    if ($this->_compress_type == 'lzma2') {
                        $extname = 'xz';
                    }
                }
            }

            if (!extension_loaded($extname)) {
                PEAR::loadExtension($extname);
            }
            if (!extension_loaded($extname)) {
                $this->_error(
                    "The extension '$extname' couldn't be found.\n" .
                    "Please make sure your version of PHP was built " .
                    "with '$extname' support.\n"
                );
                return false;
            }
        }


        if (version_compare(PHP_VERSION, "5.5.0-dev") < 0) {
            $this->_fmt = "a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" .
                "a8checksum/a1typeflag/a100link/a6magic/a2version/" .
                "a32uname/a32gname/a8devmajor/a8devminor/a131prefix";
        } else {
            $this->_fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" .
                "Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" .
                "Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix";
        }


        $this->buffer_length = $buffer_length;
    }

    public function __destruct()
    {
        $this->_close();
        // ----- Look for a local copy to delete
        if ($this->_temp_tarname != '' && (bool) preg_match('/^tar[[:alnum:]]*\.tmp$/', $this->_temp_tarname)) {
            @unlink($this->_temp_tarname);
        }
    }

    /**
     * This method creates the archive file and add the files / directories
     * that are listed in $p_filelist.
     * If a file with the same name exist and is writable, it is replaced
     * by the new tar.
     * The method return false and a PEAR error text.
     * The $p_filelist parameter can be an array of string, each string
     * representing a filename or a directory name with their path if
     * needed. It can also be a single string with names separated by a
     * single blank.
     * For each directory added in the archive, the files and
     * sub-directories are also added.
     * See also createModify() method for more details.
     *
     * @param array $p_filelist An array of filenames and directory names, or a
     *              single string with names separated by a single
     *              blank space.
     *
     * @return true on success, false on error.
     * @see    createModify()
     */
    public function create($p_filelist)
    {
        return $this->createModify($p_filelist, '', '');
    }

    /**
     * This method add the files / directories that are listed in $p_filelist in
     * the archive. If the archive does not exist it is created.
     * The method return false and a PEAR error text.
     * The files and directories listed are only added at the end of the archive,
     * even if a file with the same name is already archived.
     * See also createModify() method for more details.
     *
     * @param array $p_filelist An array of filenames and directory names, or a
     *              single string with names separated by a single
     *              blank space.
     *
     * @return true on success, false on error.
     * @see    createModify()
     * @access public
     */
    public function add($p_filelist)
    {
        return $this->addModify($p_filelist, '', '');
    }

    /**
     * @param string $p_path
     * @param bool $p_preserve
     * @param bool $p_symlinks
     * @return bool
     */
    public function extract($p_path = '', $p_preserve = false, $p_symlinks = true)
    {
        return $this->extractModify($p_path, '', $p_preserve, $p_symlinks);
    }

    /**
     * @return array|int
     */
    public function listContent()
    {
        $v_list_detail = array();

        if ($this->_openRead()) {
            if (!$this->_extractList('', $v_list_detail, "list", '', '')) {
                unset($v_list_detail);
                $v_list_detail = 0;
            }
            $this->_close();
        }

        return $v_list_detail;
    }

    /**
     * This method creates the archive file and add the files / directories
     * that are listed in $p_filelist.
     * If the file already exists and is writable, it is replaced by the
     * new tar. It is a create and not an add. If the file exists and is
     * read-only or is a directory it is not replaced. The method return
     * false and a PEAR error text.
     * The $p_filelist parameter can be an array of string, each string
     * representing a filename or a directory name with their path if
     * needed. It can also be a single string with names separated by a
     * single blank.
     * The path indicated in $p_remove_dir will be removed from the
     * memorized path of each file / directory listed when this path
     * exists. By default nothing is removed (empty path '')
     * The path indicated in $p_add_dir will be added at the beginning of
     * the memorized path of each file / directory listed. However it can
     * be set to empty ''. The adding of a path is done after the removing
     * of path.
     * The path add/remove ability enables the user to prepare an archive
     * for extraction in a different path than the origin files are.
     * See also addModify() method for file adding properties.
     *
     * @param array $p_filelist An array of filenames and directory names,
     *                             or a single string with names separated by
     *                             a single blank space.
     * @param string $p_add_dir A string which contains a path to be added
     *                             to the memorized path of each element in
     *                             the list.
     * @param string $p_remove_dir A string which contains a path to be
     *                             removed from the memorized path of each
     *                             element in the list, when relevant.
     *
     * @return boolean true on success, false on error.
     * @see addModify()
     */
    public function createModify($p_filelist, $p_add_dir, $p_remove_dir = '')
    {
        $v_result = true;

        if (!$this->_openWrite()) {
            return false;
        }

        if ($p_filelist != '') {
            if (is_array($p_filelist)) {
                $v_list = $p_filelist;
            } elseif (is_string($p_filelist)) {
                $v_list = explode($this->_separator, $p_filelist);
            } else {
                $this->_cleanFile();
                $this->_error('Invalid file list');
                return false;
            }

            $v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir);
        }

        if ($v_result) {
            $this->_writeFooter();
            $this->_close();
        } else {
            $this->_cleanFile();
        }

        return $v_result;
    }

    /**
     * This method add the files / directories listed in $p_filelist at the
     * end of the existing archive. If the archive does not yet exists it
     * is created.
     * The $p_filelist parameter can be an array of string, each string
     * representing a filename or a directory name with their path if
     * needed. It can also be a single string with names separated by a
     * single blank.
     * The path indicated in $p_remove_dir will be removed from the
     * memorized path of each file / directory listed when this path
     * exists. By default nothing is removed (empty path '')
     * The path indicated in $p_add_dir will be added at the beginning of
     * the memorized path of each file / directory listed. However it can
     * be set to empty ''. The adding of a path is done after the removing
     * of path.
     * The path add/remove ability enables the user to prepare an archive
     * for extraction in a different path than the origin files are.
     * If a file/dir is already in the archive it will only be added at the
     * end of the archive. There is no update of the existing archived
     * file/dir. However while extracting the archive, the last file will
     * replace the first one. This results in a none optimization of the
     * archive size.
     * If a file/dir does not exist the file/dir is ignored. However an
     * error text is send to PEAR error.
     * If a file/dir is not readable the file/dir is ignored. However an
     * error text is send to PEAR error.
     *
     * @param array $p_filelist An array of filenames and directory
     *                             names, or a single string with names
     *                             separated by a single blank space.
     * @param string $p_add_dir A string which contains a path to be
     *                             added to the memorized path of each
     *                             element in the list.
     * @param string $p_remove_dir A string which contains a path to be
     *                             removed from the memorized path of
     *                             each element in the list, when
     *                             relevant.
     *
     * @return true on success, false on error.
     */
    public function addModify($p_filelist, $p_add_dir, $p_remove_dir = '')
    {
        $v_result = true;

        if (!$this->_isArchive()) {
            $v_result = $this->createModify(
                $p_filelist,
                $p_add_dir,
                $p_remove_dir
            );
        } else {
            if (is_array($p_filelist)) {
                $v_list = $p_filelist;
            } elseif (is_string($p_filelist)) {
                $v_list = explode($this->_separator, $p_filelist);
            } else {
                $this->_error('Invalid file list');
                return false;
            }

            $v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir);
        }

        return $v_result;
    }

    /**
     * This method add a single string as a file at the
     * end of the existing archive. If the archive does not yet exists it
     * is created.
     *
     * @param string $p_filename A string which contains the full
     *                           filename path that will be associated
     *                           with the string.
     * @param string $p_string The content of the file added in
     *                           the archive.
     * @param bool|int $p_datetime A custom date/time (unix timestamp)
     *                           for the file (optional).
     * @param array $p_params An array of optional params:
     *                               stamp => the datetime (replaces
     *                                   datetime above if it exists)
     *                               mode => the permissions on the
     *                                   file (600 by default)
     *                               type => is this a link?  See the
     *                                   tar specification for details.
     *                                   (default = regular file)
     *                               uid => the user ID of the file
     *                                   (default = 0 = root)
     *                               gid => the group ID of the file
     *                                   (default = 0 = root)
     *
     * @return true on success, false on error.
     */
    public function addString($p_filename, $p_string, $p_datetime = false, $p_params = array())
    {
        $p_stamp = @$p_params["stamp"] ? $p_params["stamp"] : ($p_datetime ? $p_datetime : time());
        $p_mode = @$p_params["mode"] ? $p_params["mode"] : 0600;
        $p_type = @$p_params["type"] ? $p_params["type"] : "";
        $p_uid = @$p_params["uid"] ? $p_params["uid"] : "";
        $p_gid = @$p_params["gid"] ? $p_params["gid"] : "";
        $v_result = true;

        if (!$this->_isArchive()) {
            if (!$this->_openWrite()) {
                return false;
            }
            $this->_close();
        }

        if (!$this->_openAppend()) {
            return false;
        }

        // Need to check the get back to the temporary file ? ....
        $v_result = $this->_addString($p_filename, $p_string, $p_datetime, $p_params);

        $this->_writeFooter();

        $this->_close();

        return $v_result;
    }

    /**
     * This method extract all the content of the archive in the directory
     * indicated by $p_path. When relevant the memorized path of the
     * files/dir can be modified by removing the $p_remove_path path at the
     * beginning of the file/dir path.
     * While extracting a file, if the directory path does not exists it is
     * created.
     * While extracting a file, if the file already exists it is replaced
     * without looking for last modification date.
     * While extracting a file, if the file already exists and is write
     * protected, the extraction is aborted.
     * While extracting a file, if a directory with the same name already
     * exists, the extraction is aborted.
     * While extracting a directory, if a file with the same name already
     * exists, the extraction is aborted.
     * While extracting a file/directory if the destination directory exist
     * and is write protected, or does not exist but can not be created,
     * the extraction is aborted.
     * If after extraction an extracted file does not show the correct
     * stored file size, the extraction is aborted.
     * When the extraction is aborted, a PEAR error text is set and false
     * is returned. However the result can be a partial extraction that may
     * need to be manually cleaned.
     *
     * @param string $p_path The path of the directory where the
     *                               files/dir need to by extracted.
     * @param string $p_remove_path Part of the memorized path that can be
     *                               removed if present at the beginning of
     *                               the file/dir path.
     * @param boolean $p_preserve Preserve user/group ownership of files
     * @param boolean $p_symlinks Allow symlinks.
     *
     * @return boolean true on success, false on error.
     * @see    extractList()
     */
    public function extractModify($p_path, $p_remove_path, $p_preserve = false, $p_symlinks = true)
    {
        $v_result = true;
        $v_list_detail = array();

        if ($v_result = $this->_openRead()) {
            $v_result = $this->_extractList(
                $p_path,
                $v_list_detail,
                "complete",
                0,
                $p_remove_path,
                $p_preserve,
                $p_symlinks
            );
            $this->_close();
        }

        return $v_result;
    }

    /**
     * This method extract from the archive one file identified by $p_filename.
     * The return value is a string with the file content, or NULL on error.
     *
     * @param string $p_filename The path of the file to extract in a string.
     *
     * @return a string with the file content or NULL.
     */
    public function extractInString($p_filename)
    {
        if ($this->_openRead()) {
            $v_result = $this->_extractInString($p_filename);
            $this->_close();
        } else {
            $v_result = null;
        }

        return $v_result;
    }

    /**
     * This method extract from the archive only the files indicated in the
     * $p_filelist. These files are extracted in the current directory or
     * in the directory indicated by the optional $p_path parameter.
     * If indicated the $p_remove_path can be used in the same way as it is
     * used in extractModify() method.
     *
     * @param array $p_filelist An array of filenames and directory names,
     *                               or a single string with names separated
     *                               by a single blank space.
     * @param string $p_path The path of the directory where the
     *                               files/dir need to by extracted.
     * @param string $p_remove_path Part of the memorized path that can be
     *                               removed if present at the beginning of
     *                               the file/dir path.
     * @param boolean $p_preserve Preserve user/group ownership of files
     * @param boolean $p_symlinks Allow symlinks.
     *
     * @return true on success, false on error.
     * @see    extractModify()
     */
    public function extractList($p_filelist, $p_path = '', $p_remove_path = '', $p_preserve = false, $p_symlinks = true)
    {
        $v_result = true;
        $v_list_detail = array();

        if (is_array($p_filelist)) {
            $v_list = $p_filelist;
        } elseif (is_string($p_filelist)) {
            $v_list = explode($this->_separator, $p_filelist);
        } else {
            $this->_error('Invalid string list');
            return false;
        }

        if ($v_result = $this->_openRead()) {
            $v_result = $this->_extractList(
                $p_path,
                $v_list_detail,
                "partial",
                $v_list,
                $p_remove_path,
                $p_preserve,
                $p_symlinks
            );
            $this->_close();
        }

        return $v_result;
    }

    /**
     * This method set specific attributes of the archive. It uses a variable
     * list of parameters, in the format attribute code + attribute values :
     * $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ',');
     *
     * @return true on success, false on error.
     */
    public function setAttribute()
    {
        $v_result = true;

        // ----- Get the number of variable list of arguments
        if (($v_size = func_num_args()) == 0) {
            return true;
        }

        // ----- Get the arguments
        $v_att_list = func_get_args();

        // ----- Read the attributes
        $i = 0;
        while ($i < $v_size) {

            // ----- Look for next option
            switch ($v_att_list[$i]) {
                // ----- Look for options that request a string value
                case ARCHIVE_TAR_ATT_SEPARATOR :
                    // ----- Check the number of parameters
                    if (($i + 1) >= $v_size) {
                        $this->_error(
                            'Invalid number of parameters for '
                            . 'attribute ARCHIVE_TAR_ATT_SEPARATOR'
                        );
                        return false;
                    }

                    // ----- Get the value
                    $this->_separator = $v_att_list[$i + 1];
                    $i++;
                    break;

                default :
                    $this->_error('Unknown attribute code ' . $v_att_list[$i] . '');
                    return false;
            }

            // ----- Next attribute
            $i++;
        }

        return $v_result;
    }

    /**
     * This method sets the regular expression for ignoring files and directories
     * at import, for example:
     * $arch->setIgnoreRegexp("#CVS|\.svn#");
     *
     * @param string $regexp regular expression defining which files or directories to ignore
     */
    public function setIgnoreRegexp($regexp)
    {
        $this->_ignore_regexp = $regexp;
    }

    /**
     * This method sets the regular expression for ignoring all files and directories
     * matching the filenames in the array list at import, for example:
     * $arch->setIgnoreList(array('CVS', '.svn', 'bin/tool'));
     *
     * @param array $list a list of file or directory names to ignore
     *
     * @access public
     */
    public function setIgnoreList($list)
    {
        $list = str_replace(array('#', '.', '^', '$'), array('\#', '\.', '\^', '\$'), $list);
        $regexp = '#/' . join('$|/', $list) . '#';
        $this->setIgnoreRegexp($regexp);
    }

    /**
     * @param string $p_message
     */
    public function _error($p_message)
    {
        $this->error_object = $this->raiseError($p_message);
    }

    /**
     * @param string $p_message
     */
    public function _warning($p_message)
    {
        $this->error_object = $this->raiseError($p_message);
    }

    /**
     * @param string $p_filename
     * @return bool
     */
    public function _isArchive($p_filename = null)
    {
        if ($p_filename == null) {
            $p_filename = $this->_tarname;
        }
        clearstatcache();
        return @is_file($p_filename) && !@is_link($p_filename);
    }

    /**
     * @return bool
     */
    public function _openWrite()
    {
        if ($this->_compress_type == 'gz' && function_exists('gzopen')) {
            $this->_file = @gzopen($this->_tarname, "wb9");
        } else {
            if ($this->_compress_type == 'bz2' && function_exists('bzopen')) {
                $this->_file = @bzopen($this->_tarname, "w");
            } else {
                if ($this->_compress_type == 'lzma2' && function_exists('xzopen')) {
                    $this->_file = @xzopen($this->_tarname, 'w');
                } else {
                    if ($this->_compress_type == 'none') {
                        $this->_file = @fopen($this->_tarname, "wb");
                    } else {
                        $this->_error(
                            'Unknown or missing compression type ('
                            . $this->_compress_type . ')'
                        );
                        return false;
                    }
                }
            }
        }

        if ($this->_file == 0) {
            $this->_error(
                'Unable to open in write mode \''
                . $this->_tarname . '\''
            );
            return false;
        }

        return true;
    }

    /**
     * @return bool
     */
    public function _openRead()
    {
        if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') {

            // ----- Look if a local copy need to be done
            if ($this->_temp_tarname == '') {
                $this->_temp_tarname = uniqid('tar') . '.tmp';
                if (!$v_file_from = @fopen($this->_tarname, 'rb')) {
                    $this->_error(
                        'Unable to open in read mode \''
                        . $this->_tarname . '\''
                    );
                    $this->_temp_tarname = '';
                    return false;
                }
                if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) {
                    $this->_error(
                        'Unable to open in write mode \''
                        . $this->_temp_tarname . '\''
                    );
                    $this->_temp_tarname = '';
                    return false;
                }
                while ($v_data = @fread($v_file_from, 1024)) {
                    @fwrite($v_file_to, $v_data);
                }
                @fclose($v_file_from);
                @fclose($v_file_to);
            }

            // ----- File to open if the local copy
            $v_filename = $this->_temp_tarname;
        } else {
            // ----- File to open if the normal Tar file

            $v_filename = $this->_tarname;
        }

        if ($this->_compress_type == 'gz' && function_exists('gzopen')) {
            $this->_file = @gzopen($v_filename, "rb");
        } else {
            if ($this->_compress_type == 'bz2' && function_exists('bzopen')) {
                $this->_file = @bzopen($v_filename, "r");
            } else {
                if ($this->_compress_type == 'lzma2' && function_exists('xzopen')) {
                    $this->_file = @xzopen($v_filename, "r");
                } else {
                    if ($this->_compress_type == 'none') {
                        $this->_file = @fopen($v_filename, "rb");
                    } else {
                        $this->_error(
                            'Unknown or missing compression type ('
                            . $this->_compress_type . ')'
                        );
                        return false;
                    }
                }
            }
        }

        if ($this->_file == 0) {
            $this->_error('Unable to open in read mode \'' . $v_filename . '\'');
            return false;
        }

        return true;
    }

    /**
     * @return bool
     */
    public function _openReadWrite()
    {
        if ($this->_compress_type == 'gz') {
            $this->_file = @gzopen($this->_tarname, "r+b");
        } else {
            if ($this->_compress_type == 'bz2') {
                $this->_error(
                    'Unable to open bz2 in read/write mode \''
                    . $this->_tarname . '\' (limitation of bz2 extension)'
                );
                return false;
            } else {
                if ($this->_compress_type == 'lzma2') {
                    $this->_error(
                        'Unable to open lzma2 in read/write mode \''
                        . $this->_tarname . '\' (limitation of lzma2 extension)'
                    );
                    return false;
                } else {
                    if ($this->_compress_type == 'none') {
                        $this->_file = @fopen($this->_tarname, "r+b");
                    } else {
                        $this->_error(
                            'Unknown or missing compression type ('
                            . $this->_compress_type . ')'
                        );
                        return false;
                    }
                }
            }
        }

        if ($this->_file == 0) {
            $this->_error(
                'Unable to open in read/write mode \''
                . $this->_tarname . '\''
            );
            return false;
        }

        return true;
    }

    /**
     * @return bool
     */
    public function _close()
    {
        //if (isset($this->_file)) {
        if (is_resource($this->_file)) {
            if ($this->_compress_type == 'gz') {
                @gzclose($this->_file);
            } else {
                if ($this->_compress_type == 'bz2') {
                    @bzclose($this->_file);
                } else {
                    if ($this->_compress_type == 'lzma2') {
                        @xzclose($this->_file);
                    } else {
                        if ($this->_compress_type == 'none') {
                            @fclose($this->_file);
                        } else {
                            $this->_error(
                                'Unknown or missing compression type ('
                                . $this->_compress_type . ')'
                            );
                        }
                    }
                }
            }

            $this->_file = 0;
        }

        // ----- Look if a local copy need to be erase
        // Note that it might be interesting to keep the url for a time : ToDo
        if ($this->_temp_tarname != '') {
            @unlink($this->_temp_tarname);
            $this->_temp_tarname = '';
        }

        return true;
    }

    /**
     * @return bool
     */
    public function _cleanFile()
    {
        $this->_close();

        // ----- Look for a local copy
        if ($this->_temp_tarname != '') {
            // ----- Remove the local copy but not the remote tarname
            @unlink($this->_temp_tarname);
            $this->_temp_tarname = '';
        } else {
            // ----- Remove the local tarname file
            @unlink($this->_tarname);
        }
        $this->_tarname = '';

        return true;
    }

    /**
     * @param mixed $p_binary_data
     * @param integer $p_len
     * @return bool
     */
    public function _writeBlock($p_binary_data, $p_len = null)
    {
        if (is_resource($this->_file)) {
            if ($p_len === null) {
                if ($this->_compress_type == 'gz') {
                    @gzputs($this->_file, $p_binary_data);
                } else {
                    if ($this->_compress_type == 'bz2') {
                        @bzwrite($this->_file, $p_binary_data);
                    } else {
                        if ($this->_compress_type == 'lzma2') {
                            @xzwrite($this->_file, $p_binary_data);
                        } else {
                            if ($this->_compress_type == 'none') {
                                @fputs($this->_file, $p_binary_data);
                            } else {
                                $this->_error(
                                    'Unknown or missing compression type ('
                                    . $this->_compress_type . ')'
                                );
                            }
                        }
                    }
                }
            } else {
                if ($this->_compress_type == 'gz') {
                    @gzputs($this->_file, $p_binary_data, $p_len);
                } else {
                    if ($this->_compress_type == 'bz2') {
                        @bzwrite($this->_file, $p_binary_data, $p_len);
                    } else {
                        if ($this->_compress_type == 'lzma2') {
                            @xzwrite($this->_file, $p_binary_data, $p_len);
                        } else {
                            if ($this->_compress_type == 'none') {
                                @fputs($this->_file, $p_binary_data, $p_len);
                            } else {
                                $this->_error(
                                    'Unknown or missing compression type ('
                                    . $this->_compress_type . ')'
                                );
                            }
                        }
                    }
                }
            }
        }
        return true;
    }

    /**
     * @return null|string
     */
    public function _readBlock()
    {
        $v_block = null;
        if (is_resource($this->_file)) {
            if ($this->_compress_type == 'gz') {
                $v_block = @gzread($this->_file, 512);
            } else {
                if ($this->_compress_type == 'bz2') {
                    $v_block = @bzread($this->_file, 512);
                } else {
                    if ($this->_compress_type == 'lzma2') {
                        $v_block = @xzread($this->_file, 512);
                    } else {
                        if ($this->_compress_type == 'none') {
                            $v_block = @fread($this->_file, 512);
                        } else {
                            $this->_error(
                                'Unknown or missing compression type ('
                                . $this->_compress_type . ')'
                            );
                        }
                    }
                }
            }
        }
        return $v_block;
    }

    /**
     * @param null $p_len
     * @return bool
     */
    public function _jumpBlock($p_len = null)
    {
        if (is_resource($this->_file)) {
            if ($p_len === null) {
                $p_len = 1;
            }

            if ($this->_compress_type == 'gz') {
                @gzseek($this->_file, gztell($this->_file) + ($p_len * 512));
            } else {
                if ($this->_compress_type == 'bz2') {
                    // ----- Replace missing bztell() and bzseek()
                    for ($i = 0; $i < $p_len; $i++) {
                        $this->_readBlock();
                    }
                } else {
                    if ($this->_compress_type == 'lzma2') {
                        // ----- Replace missing xztell() and xzseek()
                        for ($i = 0; $i < $p_len; $i++) {
                            $this->_readBlock();
                        }
                    } else {
                        if ($this->_compress_type == 'none') {
                            @fseek($this->_file, $p_len * 512, SEEK_CUR);
                        } else {
                            $this->_error(
                                'Unknown or missing compression type ('
                                . $this->_compress_type . ')'
                            );
                        }
                    }
                }
            }
        }
        return true;
    }

    /**
     * @return bool
     */
    public function _writeFooter()
    {
        if (is_resource($this->_file)) {
            // ----- Write the last 0 filled block for end of archive
            $v_binary_data = pack('a1024', '');
            $this->_writeBlock($v_binary_data);
        }
        return true;
    }

    /**
     * @param array $p_list
     * @param string $p_add_dir
     * @param string $p_remove_dir
     * @return bool
     */
    public function _addList($p_list, $p_add_dir, $p_remove_dir)
    {
        $v_result = true;
        $v_header = array();

        // ----- Remove potential windows directory separator
        $p_add_dir = $this->_translateWinPath($p_add_dir);
        $p_remove_dir = $this->_translateWinPath($p_remove_dir, false);

        if (!$this->_file) {
            $this->_error('Invalid file descriptor');
            return false;
        }

        if (sizeof($p_list) == 0) {
            return true;
        }

        foreach ($p_list as $v_filename) {
            if (!$v_result) {
                break;
            }

            // ----- Skip the current tar name
            if ($v_filename == $this->_tarname) {
                continue;
            }

            if ($v_filename == '') {
                continue;
            }

            // ----- ignore files and directories matching the ignore regular expression
            if ($this->_ignore_regexp && preg_match($this->_ignore_regexp, '/' . $v_filename)) {
                $this->_warning("File '$v_filename' ignored");
                continue;
            }

            if (!file_exists($v_filename) && !is_link($v_filename)) {
                $this->_warning("File '$v_filename' does not exist");
                continue;
            }

            // ----- Add the file or directory header
            if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir)) {
                return false;
            }

            if (@is_dir($v_filename) && !@is_link($v_filename)) {
                if (!($p_hdir = opendir($v_filename))) {
                    $this->_warning("Directory '$v_filename' can not be read");
                    continue;
                }
                while (false !== ($p_hitem = readdir($p_hdir))) {
                    if (($p_hitem != '.') && ($p_hitem != '..')) {
                        if ($v_filename != ".") {
                            $p_temp_list[0] = $v_filename . '/' . $p_hitem;
                        } else {
                            $p_temp_list[0] = $p_hitem;
                        }

                        $v_result = $this->_addList(
                            $p_temp_list,
                            $p_add_dir,
                            $p_remove_dir
                        );
                    }
                }

                unset($p_temp_list);
                unset($p_hdir);
                unset($p_hitem);
            }
        }

        return $v_result;
    }

    /**
     * @param string $p_filename
     * @param mixed $p_header
     * @param string $p_add_dir
     * @param string $p_remove_dir
     * @param null $v_stored_filename
     * @return bool
     */
    public function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir, $v_stored_filename = null)
    {
        if (!$this->_file) {
            $this->_error('Invalid file descriptor');
            return false;
        }

        if ($p_filename == '') {
            $this->_error('Invalid file name');
            return false;
        }

        if (is_null($v_stored_filename)) {
            // ----- Calculate the stored filename
            $p_filename = $this->_translateWinPath($p_filename, false);
            $v_stored_filename = $p_filename;

            if (strcmp($p_filename, $p_remove_dir) == 0) {
                return true;
            }

            if ($p_remove_dir != '') {
                if (substr($p_remove_dir, -1) != '/') {
                    $p_remove_dir .= '/';
                }

                if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) {
                    $v_stored_filename = substr($p_filename, strlen($p_remove_dir));
                }
            }

            $v_stored_filename = $this->_translateWinPath($v_stored_filename);
            if ($p_add_dir != '') {
                if (substr($p_add_dir, -1) == '/') {
                    $v_stored_filename = $p_add_dir . $v_stored_filename;
                } else {
                    $v_stored_filename = $p_add_dir . '/' . $v_stored_filename;
                }
            }

            $v_stored_filename = $this->_pathReduction($v_stored_filename);
        }

        if ($this->_isArchive($p_filename)) {
            if (($v_file = @fopen($p_filename, "rb")) == 0) {
                $this->_warning(
                    "Unable to open file '" . $p_filename
                    . "' in binary read mode"
                );
                return true;
            }

            if (!$this->_writeHeader($p_filename, $v_stored_filename)) {
                return false;
            }

            while (($v_buffer = fread($v_file, $this->buffer_length)) != '') {
                $buffer_length = strlen("$v_buffer");
                if ($buffer_length != $this->buffer_length) {
                    $pack_size = ((int)($buffer_length / 512) + ($buffer_length % 512 !== 0 ? 1 : 0)) * 512;
                    $pack_format = sprintf('a%d', $pack_size);
                } else {
                    $pack_format = sprintf('a%d', $this->buffer_length);
                }
                $v_binary_data = pack($pack_format, "$v_buffer");
                $this->_writeBlock($v_binary_data);
            }

            fclose($v_file);
        } else {
            // ----- Only header for dir
            if (!$this->_writeHeader($p_filename, $v_stored_filename)) {
                return false;
            }
        }

        return true;
    }

    /**
     * @param string $p_filename
     * @param string $p_string
     * @param bool $p_datetime
     * @param array $p_params
     * @return bool
     */
    public function _addString($p_filename, $p_string, $p_datetime = false, $p_params = array())
    {
        $p_stamp = @$p_params["stamp"] ? $p_params["stamp"] : ($p_datetime ? $p_datetime : time());
        $p_mode = @$p_params["mode"] ? $p_params["mode"] : 0600;
        $p_type = @$p_params["type"] ? $p_params["type"] : "";
        $p_uid = @$p_params["uid"] ? $p_params["uid"] : 0;
        $p_gid = @$p_params["gid"] ? $p_params["gid"] : 0;
        if (!$this->_file) {
            $this->_error('Invalid file descriptor');
            return false;
        }

        if ($p_filename == '') {
            $this->_error('Invalid file name');
            return false;
        }

        // ----- Calculate the stored filename
        $p_filename = $this->_translateWinPath($p_filename, false);

        // ----- If datetime is not specified, set current time
        if ($p_datetime === false) {
            $p_datetime = time();
        }

        if (!$this->_writeHeaderBlock(
            $p_filename,
            strlen($p_string),
            $p_stamp,
            $p_mode,
            $p_type,
            $p_uid,
            $p_gid
        )
        ) {
            return false;
        }

        $i = 0;
        while (($v_buffer = substr($p_string, (($i++) * 512), 512)) != '') {
            $v_binary_data = pack("a512", $v_buffer);
            $this->_writeBlock($v_binary_data);
        }

        return true;
    }

    /**
     * @param string $p_filename
     * @param string $p_stored_filename
     * @return bool
     */
    public function _writeHeader($p_filename, $p_stored_filename)
    {
        if ($p_stored_filename == '') {
            $p_stored_filename = $p_filename;
        }

        $v_reduced_filename = $this->_pathReduction($p_stored_filename);

        if (strlen($v_reduced_filename) > 99) {
            if (!$this->_writeLongHeader($v_reduced_filename, false)) {
                return false;
            }
        }

        $v_linkname = '';
        if (@is_link($p_filename)) {
            $v_linkname = readlink($p_filename);
        }

        if (strlen($v_linkname) > 99) {
            if (!$this->_writeLongHeader($v_linkname, true)) {
                return false;
            }
        }

        $v_info = lstat($p_filename);
        $v_uid = sprintf("%07s", DecOct($v_info[4]));
        $v_gid = sprintf("%07s", DecOct($v_info[5]));
        $v_perms = sprintf("%07s", DecOct($v_info['mode'] & 000777));
        $v_mtime = sprintf("%011s", DecOct($v_info['mtime']));

        if (@is_link($p_filename)) {
            $v_typeflag = '2';
            $v_size = sprintf("%011s", DecOct(0));
        } elseif (@is_dir($p_filename)) {
            $v_typeflag = "5";
            $v_size = sprintf("%011s", DecOct(0));
        } else {
            $v_typeflag = '0';
            clearstatcache();
            $v_size = sprintf("%011s", DecOct($v_info['size']));
        }

        $v_magic = 'ustar ';
        $v_version = ' ';
        $v_uname = '';
        $v_gname = '';

        if (function_exists('posix_getpwuid')) {
            $userinfo = posix_getpwuid($v_info[4]);
            $groupinfo = posix_getgrgid($v_info[5]);

            if (isset($userinfo['name'])) {
                $v_uname = $userinfo['name'];
            }

            if (isset($groupinfo['name'])) {
                $v_gname = $groupinfo['name'];
            }
        }

        $v_devmajor = '';
        $v_devminor = '';
        $v_prefix = '';

        $v_binary_data_first = pack(
            "a100a8a8a8a12a12",
            $v_reduced_filename,
            $v_perms,
            $v_uid,
            $v_gid,
            $v_size,
            $v_mtime
        );
        $v_binary_data_last = pack(
            "a1a100a6a2a32a32a8a8a155a12",
            $v_typeflag,
            $v_linkname,
            $v_magic,
            $v_version,
            $v_uname,
            $v_gname,
            $v_devmajor,
            $v_devminor,
            $v_prefix,
            ''
        );

        // ----- Calculate the checksum
        $v_checksum = 0;
        // ..... First part of the header
        for ($i = 0; $i < 148; $i++) {
            $v_checksum += ord(substr($v_binary_data_first, $i, 1));
        }
        // ..... Ignore the checksum value and replace it by ' ' (space)
        for ($i = 148; $i < 156; $i++) {
            $v_checksum += ord(' ');
        }
        // ..... Last part of the header
        for ($i = 156, $j = 0; $i < 512; $i++, $j++) {
            $v_checksum += ord(substr($v_binary_data_last, $j, 1));
        }

        // ----- Write the first 148 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_first, 148);

        // ----- Write the calculated checksum
        $v_checksum = sprintf("%06s\0 ", DecOct($v_checksum));
        $v_binary_data = pack("a8", $v_checksum);
        $this->_writeBlock($v_binary_data, 8);

        // ----- Write the last 356 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_last, 356);

        return true;
    }

    /**
     * @param string $p_filename
     * @param int $p_size
     * @param int $p_mtime
     * @param int $p_perms
     * @param string $p_type
     * @param int $p_uid
     * @param int $p_gid
     * @return bool
     */
    public function _writeHeaderBlock(
        $p_filename,
        $p_size,
        $p_mtime = 0,
        $p_perms = 0,
        $p_type = '',
        $p_uid = 0,
        $p_gid = 0
    )
    {
        $p_filename = $this->_pathReduction($p_filename);

        if (strlen($p_filename) > 99) {
            if (!$this->_writeLongHeader($p_filename, false)) {
                return false;
            }
        }

        if ($p_type == "5") {
            $v_size = sprintf("%011s", DecOct(0));
        } else {
            $v_size = sprintf("%011s", DecOct($p_size));
        }

        $v_uid = sprintf("%07s", DecOct($p_uid));
        $v_gid = sprintf("%07s", DecOct($p_gid));
        $v_perms = sprintf("%07s", DecOct($p_perms & 000777));

        $v_mtime = sprintf("%11s", DecOct($p_mtime));

        $v_linkname = '';

        $v_magic = 'ustar ';

        $v_version = ' ';

        if (function_exists('posix_getpwuid')) {
            $userinfo = posix_getpwuid($p_uid);
            $groupinfo = posix_getgrgid($p_gid);

            if ($userinfo === false || $groupinfo === false) {
                $v_uname = '';
                $v_gname = '';
            } else {
                $v_uname = $userinfo['name'];
                $v_gname = $groupinfo['name'];
            }
        } else {
            $v_uname = '';
            $v_gname = '';
        }

        $v_devmajor = '';

        $v_devminor = '';

        $v_prefix = '';

        $v_binary_data_first = pack(
            "a100a8a8a8a12A12",
            $p_filename,
            $v_perms,
            $v_uid,
            $v_gid,
            $v_size,
            $v_mtime
        );
        $v_binary_data_last = pack(
            "a1a100a6a2a32a32a8a8a155a12",
            $p_type,
            $v_linkname,
            $v_magic,
            $v_version,
            $v_uname,
            $v_gname,
            $v_devmajor,
            $v_devminor,
            $v_prefix,
            ''
        );

        // ----- Calculate the checksum
        $v_checksum = 0;
        // ..... First part of the header
        for ($i = 0; $i < 148; $i++) {
            $v_checksum += ord(substr($v_binary_data_first, $i, 1));
        }
        // ..... Ignore the checksum value and replace it by ' ' (space)
        for ($i = 148; $i < 156; $i++) {
            $v_checksum += ord(' ');
        }
        // ..... Last part of the header
        for ($i = 156, $j = 0; $i < 512; $i++, $j++) {
            $v_checksum += ord(substr($v_binary_data_last, $j, 1));
        }

        // ----- Write the first 148 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_first, 148);

        // ----- Write the calculated checksum
        $v_checksum = sprintf("%06s ", DecOct($v_checksum));
        $v_binary_data = pack("a8", $v_checksum);
        $this->_writeBlock($v_binary_data, 8);

        // ----- Write the last 356 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_last, 356);

        return true;
    }

    /**
     * @param string $p_filename
     * @return bool
     */
    public function _writeLongHeader($p_filename, $is_link = false)
    {
        $v_uid = sprintf("%07s", 0);
        $v_gid = sprintf("%07s", 0);
        $v_perms = sprintf("%07s", 0);
        $v_size = sprintf("%'011s", DecOct(strlen($p_filename)));
        $v_mtime = sprintf("%011s", 0);
        $v_typeflag = ($is_link ? 'K' : 'L');
        $v_linkname = '';
        $v_magic = 'ustar ';
        $v_version = ' ';
        $v_uname = '';
        $v_gname = '';
        $v_devmajor = '';
        $v_devminor = '';
        $v_prefix = '';

        $v_binary_data_first = pack(
            "a100a8a8a8a12a12",
            '././@LongLink',
            $v_perms,
            $v_uid,
            $v_gid,
            $v_size,
            $v_mtime
        );
        $v_binary_data_last = pack(
            "a1a100a6a2a32a32a8a8a155a12",
            $v_typeflag,
            $v_linkname,
            $v_magic,
            $v_version,
            $v_uname,
            $v_gname,
            $v_devmajor,
            $v_devminor,
            $v_prefix,
            ''
        );

        // ----- Calculate the checksum
        $v_checksum = 0;
        // ..... First part of the header
        for ($i = 0; $i < 148; $i++) {
            $v_checksum += ord(substr($v_binary_data_first, $i, 1));
        }
        // ..... Ignore the checksum value and replace it by ' ' (space)
        for ($i = 148; $i < 156; $i++) {
            $v_checksum += ord(' ');
        }
        // ..... Last part of the header
        for ($i = 156, $j = 0; $i < 512; $i++, $j++) {
            $v_checksum += ord(substr($v_binary_data_last, $j, 1));
        }

        // ----- Write the first 148 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_first, 148);

        // ----- Write the calculated checksum
        $v_checksum = sprintf("%06s\0 ", DecOct($v_checksum));
        $v_binary_data = pack("a8", $v_checksum);
        $this->_writeBlock($v_binary_data, 8);

        // ----- Write the last 356 bytes of the header in the archive
        $this->_writeBlock($v_binary_data_last, 356);

        // ----- Write the filename as content of the block
        $i = 0;
        while (($v_buffer = substr($p_filename, (($i++) * 512), 512)) != '') {
            $v_binary_data = pack("a512", "$v_buffer");
            $this->_writeBlock($v_binary_data);
        }

        return true;
    }

    /**
     * @param mixed $v_binary_data
     * @param mixed $v_header
     * @return bool
     */
    public function _readHeader($v_binary_data, &$v_header)
    {
        if (strlen($v_binary_data) == 0) {
            $v_header['filename'] = '';
            return true;
        }

        if (strlen($v_binary_data) != 512) {
            $v_header['filename'] = '';
            $this->_error('Invalid block size : ' . strlen($v_binary_data));
            return false;
        }

        if (!is_array($v_header)) {
            $v_header = array();
        }
        // ----- Calculate the checksum
        $v_checksum = 0;
        // ..... First part of the header
        $v_binary_split = str_split($v_binary_data);
        $v_checksum += array_sum(array_map('ord', array_slice($v_binary_split, 0, 148)));
        $v_checksum += array_sum(array_map('ord', array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',)));
        $v_checksum += array_sum(array_map('ord', array_slice($v_binary_split, 156, 512)));


        $v_data = unpack($this->_fmt, $v_binary_data);

        if (strlen($v_data["prefix"]) > 0) {
            $v_data["filename"] = "$v_data[prefix]/$v_data[filename]";
        }

        // ----- Extract the checksum
        $v_data_checksum = trim($v_data['checksum']);
        if (!preg_match('/^[0-7]*$/', $v_data_checksum)) {
            $this->_error(
                'Invalid checksum for file "' . $v_data['filename']
                . '" : ' . $v_data_checksum . ' extracted'
            );
            return false;
        }

        $v_header['checksum'] = OctDec($v_data_checksum);
        if ($v_header['checksum'] != $v_checksum) {
            $v_header['filename'] = '';

            // ----- Look for last block (empty block)
            if (($v_checksum == 256) && ($v_header['checksum'] == 0)) {
                return true;
            }

            $this->_error(
                'Invalid checksum for file "' . $v_data['filename']
                . '" : ' . $v_checksum . ' calculated, '
                . $v_header['checksum'] . ' expected'
            );
            return false;
        }

        // ----- Extract the properties
        $v_header['filename'] = rtrim($v_data['filename'], "\0");
        if ($this->_isMaliciousFilename($v_header['filename'])) {
            $this->_error(
                'Malicious .tar detected, file "' . $v_header['filename'] .
                '" will not install in desired directory tree'
            );
            return false;
        }
        $v_header['mode'] = OctDec(trim($v_data['mode']));
        $v_header['uid'] = OctDec(trim($v_data['uid']));
        $v_header['gid'] = OctDec(trim($v_data['gid']));
        $v_header['size'] = $this->_tarRecToSize($v_data['size']);
        $v_header['mtime'] = OctDec(trim($v_data['mtime']));
        if (($v_header['typeflag'] = $v_data['typeflag']) == "5") {
            $v_header['size'] = 0;
        }
        $v_header['link'] = trim($v_data['link']);
        /* ----- All these fields are removed form the header because
        they do not carry interesting info
        $v_header[magic] = trim($v_data[magic]);
        $v_header[version] = trim($v_data[version]);
        $v_header[uname] = trim($v_data[uname]);
        $v_header[gname] = trim($v_data[gname]);
        $v_header[devmajor] = trim($v_data[devmajor]);
        $v_header[devminor] = trim($v_data[devminor]);
        */

        return true;
    }

    /**
     * Convert Tar record size to actual size
     *
     * @param string $tar_size
     * @return size of tar record in bytes
     */
    private function _tarRecToSize($tar_size)
    {
        /*
         * First byte of size has a special meaning if bit 7 is set.
         *
         * Bit 7 indicates base-256 encoding if set.
         * Bit 6 is the sign bit.
         * Bits 5:0 are most significant value bits.
         */
        $ch = ord($tar_size[0]);
        if ($ch & 0x80) {
            // Full 12-bytes record is required.
            $rec_str = $tar_size . "\x00";

            $size = ($ch & 0x40) ? -1 : 0;
            $size = ($size << 6) | ($ch & 0x3f);

            for ($num_ch = 1; $num_ch < 12; ++$num_ch) {
                $size = ($size * 256) + ord($rec_str[$num_ch]);
            }

            return $size;

        } else {
            return OctDec(trim($tar_size));
        }
    }

    /**
     * Detect and report a malicious file name
     *
     * @param string $file
     *
     * @return bool
     */
    private function _isMaliciousFilename($file)
    {
        if (strpos($file, '://') !== false) {
            return true;
        }
        if (strpos($file, '../') !== false || strpos($file, '..\\') !== false) {
            return true;
        }
        return false;
    }

    /**
     * @param $v_header
     * @return bool
     */
    public function _readLongHeader(&$v_header)
    {
        $v_filename = '';
        $v_filesize = $v_header['size'];
        $n = floor($v_header['size'] / 512);
        for ($i = 0; $i < $n; $i++) {
            $v_content = $this->_readBlock();
            $v_filename .= $v_content;
        }
        if (($v_header['size'] % 512) != 0) {
            $v_content = $this->_readBlock();
            $v_filename .= $v_content;
        }

        // ----- Read the next header
        $v_binary_data = $this->_readBlock();

        if (!$this->_readHeader($v_binary_data, $v_header)) {
            return false;
        }

        $v_filename = rtrim(substr($v_filename, 0, $v_filesize), "\0");
        $v_header['filename'] = $v_filename;
        if ($this->_isMaliciousFilename($v_filename)) {
            $this->_error(
                'Malicious .tar detected, file "' . $v_filename .
                '" will not install in desired directory tree'
            );
            return false;
        }

        return true;
    }

    /**
     * This method extract from the archive one file identified by $p_filename.
     * The return value is a string with the file content, or null on error.
     *
     * @param string $p_filename The path of the file to extract in a string.
     *
     * @return a string with the file content or null.
     */
    private function _extractInString($p_filename)
    {
        $v_result_str = "";

        while (strlen($v_binary_data = $this->_readBlock()) != 0) {
            if (!$this->_readHeader($v_binary_data, $v_header)) {
                return null;
            }

            if ($v_header['filename'] == '') {
                continue;
            }

            switch ($v_header['typeflag']) {
                case 'L':
                    {
                        if (!$this->_readLongHeader($v_header)) {
                            return null;
                        }
                    }
                    break;

                case 'K':
                    {
                        $v_link_header = $v_header;
                        if (!$this->_readLongHeader($v_link_header)) {
                            return null;
                        }
                        $v_header['link'] = $v_link_header['filename'];
                    }
                    break;
            }

            if ($v_header['filename'] == $p_filename) {
                if ($v_header['typeflag'] == "5") {
                    $this->_error(
                        'Unable to extract in string a directory '
                        . 'entry {' . $v_header['filename'] . '}'
                    );
                    return null;
                } else {
                    $n = floor($v_header['size'] / 512);
                    for ($i = 0; $i < $n; $i++) {
                        $v_result_str .= $this->_readBlock();
                    }
                    if (($v_header['size'] % 512) != 0) {
                        $v_content = $this->_readBlock();
                        $v_result_str .= substr(
                            $v_content,
                            0,
                            ($v_header['size'] % 512)
                        );
                    }
                    return $v_result_str;
                }
            } else {
                $this->_jumpBlock(ceil(($v_header['size'] / 512)));
            }
        }

        return null;
    }

    /**
     * @param string $p_path
     * @param string $p_list_detail
     * @param string $p_mode
     * @param string $p_file_list
     * @param string $p_remove_path
     * @param bool $p_preserve
     * @param bool $p_symlinks
     * @return bool
     */
    public function _extractList(
        $p_path,
        &$p_list_detail,
        $p_mode,
        $p_file_list,
        $p_remove_path,
        $p_preserve = false,
        $p_symlinks = true
    )
    {
        $v_result = true;
        $v_nb = 0;
        $v_extract_all = true;
        $v_listing = false;

        $p_path = $this->_translateWinPath($p_path, false);
        if ($p_path == '' || (substr($p_path, 0, 1) != '/'
                && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))
        ) {
            $p_path = "./" . $p_path;
        }
        $p_remove_path = $this->_translateWinPath($p_remove_path);

        // ----- Look for path to remove format (should end by /)
        if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/')) {
            $p_remove_path .= '/';
        }
        $p_remove_path_size = strlen($p_remove_path);

        switch ($p_mode) {
            case "complete" :
                $v_extract_all = true;
                $v_listing = false;
                break;
            case "partial" :
                $v_extract_all = false;
                $v_listing = false;
                break;
            case "list" :
                $v_extract_all = false;
                $v_listing = true;
                break;
            default :
                $this->_error('Invalid extract mode (' . $p_mode . ')');
                return false;
        }

        clearstatcache();

        while (strlen($v_binary_data = $this->_readBlock()) != 0) {
            $v_extract_file = false;
            $v_extraction_stopped = 0;

            if (!$this->_readHeader($v_binary_data, $v_header)) {
                return false;
            }

            if ($v_header['filename'] == '') {
                continue;
            }

            switch ($v_header['typeflag']) {
                case 'L':
                    {
                        if (!$this->_readLongHeader($v_header)) {
                            return null;
                        }
                    }
                    break;

                case 'K':
                    {
                        $v_link_header = $v_header;
                        if (!$this->_readLongHeader($v_link_header)) {
                            return null;
                        }
                        $v_header['link'] = $v_link_header['filename'];
                    }
                    break;
            }

            // ignore extended / pax headers
            if ($v_header['typeflag'] == 'x' || $v_header['typeflag'] == 'g') {
                $this->_jumpBlock(ceil(($v_header['size'] / 512)));
                continue;
            }

            if ((!$v_extract_all) && (is_array($p_file_list))) {
                // ----- By default no unzip if the file is not found
                $v_extract_file = false;

                for ($i = 0; $i < sizeof($p_file_list); $i++) {
                    // ----- Look if it is a directory
                    if (substr($p_file_list[$i], -1) == '/') {
                        // ----- Look if the directory is in the filename path
                        if ((strlen($v_header['filename']) > strlen($p_file_list[$i]))
                            && (substr($v_header['filename'], 0, strlen($p_file_list[$i]))
                                == $p_file_list[$i])
                        ) {
                            $v_extract_file = true;
                            break;
                        }
                    } // ----- It is a file, so compare the file names
                    elseif ($p_file_list[$i] == $v_header['filename']) {
                        $v_extract_file = true;
                        break;
                    }
                }
            } else {
                $v_extract_file = true;
            }

            // ----- Look if this file need to be extracted
            if (($v_extract_file) && (!$v_listing)) {
                if (($p_remove_path != '')
                    && (substr($v_header['filename'] . '/', 0, $p_remove_path_size)
                        == $p_remove_path)
                ) {
                    $v_header['filename'] = substr(
                        $v_header['filename'],
                        $p_remove_path_size
                    );
                    if ($v_header['filename'] == '') {
                        continue;
                    }
                }
                if (($p_path != './') && ($p_path != '/')) {
                    while (substr($p_path, -1) == '/') {
                        $p_path = substr($p_path, 0, strlen($p_path) - 1);
                    }

                    if (substr($v_header['filename'], 0, 1) == '/') {
                        $v_header['filename'] = $p_path . $v_header['filename'];
                    } else {
                        $v_header['filename'] = $p_path . '/' . $v_header['filename'];
                    }
                }
                if (file_exists($v_header['filename'])) {
                    if ((@is_dir($v_header['filename']))
                        && ($v_header['typeflag'] == '')
                    ) {
                        $this->_error(
                            'File ' . $v_header['filename']
                            . ' already exists as a directory'
                        );
                        return false;
                    }
                    if (($this->_isArchive($v_header['filename']))
                        && ($v_header['typeflag'] == "5")
                    ) {
                        $this->_error(
                            'Directory ' . $v_header['filename']
                            . ' already exists as a file'
                        );
                        return false;
                    }
                    if (!is_writeable($v_header['filename'])) {
                        $this->_error(
                            'File ' . $v_header['filename']
                            . ' already exists and is write protected'
                        );
                        return false;
                    }
                    if (filemtime($v_header['filename']) > $v_header['mtime']) {
                        // To be completed : An error or silent no replace ?
                    }
                } // ----- Check the directory availability and create it if necessary
                elseif (($v_result
                        = $this->_dirCheck(
                        ($v_header['typeflag'] == "5"
                            ? $v_header['filename']
                            : dirname($v_header['filename']))
                    )) != 1
                ) {
                    $this->_error('Unable to create path for ' . $v_header['filename']);
                    return false;
                }

                if ($v_extract_file) {
                    if ($v_header['typeflag'] == "5") {
                        if (!@file_exists($v_header['filename'])) {
                            if (!@mkdir($v_header['filename'], 0777)) {
                                $this->_error(
                                    'Unable to create directory {'
                                    . $v_header['filename'] . '}'
                                );
                                return false;
                            }
                        }
                    } elseif ($v_header['typeflag'] == "2") {
                        if (!$p_symlinks) {
                            $this->_warning('Symbolic links are not allowed. '
                                . 'Unable to extract {'
                                . $v_header['filename'] . '}'
                            );
                            return false;
                        }
                        $absolute_link = FALSE;
                        $link_depth = 0;
                        if (strpos($v_header['link'], "/") === 0 || strpos($v_header['link'], ':') !== FALSE) {
                          $absolute_link = TRUE;
                        }
                        else {
                            $s_filename = preg_replace('@^' . preg_quote($p_path) . '@', "", $v_header['filename']);
                            $s_linkname = str_replace('\\', '/', $v_header['link']);
                            foreach (explode("/", $s_filename) as $dir) {
                                if ($dir === "..") {
                                    $link_depth--;
                                } elseif ($dir !== "" && $dir !== "." ) {
                                    $link_depth++;
                                }
                            }
                            foreach (explode("/", $s_linkname) as $dir){
                                if ($link_depth <= 0) {
                                    break;
                                }
                                if ($dir === "..") {
                                    $link_depth--;
                                } elseif ($dir !== "" && $dir !== ".") {
                                    $link_depth++;
                                }
                            }
                        }
                        if ($absolute_link || $link_depth <= 0) {
                            $this->_error(
                                 'Out-of-path file extraction {'
                                 . $v_header['filename'] . ' --> ' .
                                 $v_header['link'] . '}'
                            );
                            return false;
                        }
                        if (@file_exists($v_header['filename'])) {
                            @unlink($v_header['filename']);
                        }
                        if (!@symlink($v_header['link'], $v_header['filename'])) {
                            $this->_error(
                                'Unable to extract symbolic link {'
                                . $v_header['filename'] . '}'
                            );
                            return false;
                        }
                    } else {
                        if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) {
                            $this->_error(
                                'Error while opening {' . $v_header['filename']
                                . '} in write binary mode'
                            );
                            return false;
                        } else {
                            $n = floor($v_header['size'] / 512);
                            for ($i = 0; $i < $n; $i++) {
                                $v_content = $this->_readBlock();
                                fwrite($v_dest_file, $v_content, 512);
                            }
                            if (($v_header['size'] % 512) != 0) {
                                $v_content = $this->_readBlock();
                                fwrite($v_dest_file, $v_content, ($v_header['size'] % 512));
                            }

                            @fclose($v_dest_file);

                            if ($p_preserve) {
                                @chown($v_header['filename'], $v_header['uid']);
                                @chgrp($v_header['filename'], $v_header['gid']);
                            }

                            // ----- Change the file mode, mtime
                            @touch($v_header['filename'], $v_header['mtime']);
                            if ($v_header['mode'] & 0111) {
                                // make file executable, obey umask
                                $mode = fileperms($v_header['filename']) | (~umask() & 0111);
                                @chmod($v_header['filename'], $mode);
                            }
                        }

                        // ----- Check the file size
                        clearstatcache();
                        if (!is_file($v_header['filename'])) {
                            $this->_error(
                                'Extracted file ' . $v_header['filename']
                                . 'does not exist. Archive may be corrupted.'
                            );
                            return false;
                        }

                        $filesize = filesize($v_header['filename']);
                        if ($filesize != $v_header['size']) {
                            $this->_error(
                                'Extracted file ' . $v_header['filename']
                                . ' does not have the correct file size \''
                                . $filesize
                                . '\' (' . $v_header['size']
                                . ' expected). Archive may be corrupted.'
                            );
                            return false;
                        }
                    }
                } else {
                    $this->_jumpBlock(ceil(($v_header['size'] / 512)));
                }
            } else {
                $this->_jumpBlock(ceil(($v_header['size'] / 512)));
            }

            /* TBC : Seems to be unused ...
            if ($this->_compress)
              $v_end_of_file = @gzeof($this->_file);
            else
              $v_end_of_file = @feof($this->_file);
              */

            if ($v_listing || $v_extract_file || $v_extraction_stopped) {
                // ----- Log extracted files
                if (($v_file_dir = dirname($v_header['filename']))
                    == $v_header['filename']
                ) {
                    $v_file_dir = '';
                }
                if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == '')) {
                    $v_file_dir = '/';
                }

                $p_list_detail[$v_nb++] = $v_header;
                if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) {
                    return true;
                }
            }
        }

        return true;
    }

    /**
     * @return bool
     */
    public function _openAppend()
    {
        if (filesize($this->_tarname) == 0) {
            return $this->_openWrite();
        }

        if ($this->_compress) {
            $this->_close();

            if (!@rename($this->_tarname, $this->_tarname . ".tmp")) {
                $this->_error(
                    'Error while renaming \'' . $this->_tarname
                    . '\' to temporary file \'' . $this->_tarname
                    . '.tmp\''
                );
                return false;
            }

            if ($this->_compress_type == 'gz') {
                $v_temp_tar = @gzopen($this->_tarname . ".tmp", "rb");
            } elseif ($this->_compress_type == 'bz2') {
                $v_temp_tar = @bzopen($this->_tarname . ".tmp", "r");
            } elseif ($this->_compress_type == 'lzma2') {
                $v_temp_tar = @xzopen($this->_tarname . ".tmp", "r");
            }


            if ($v_temp_tar == 0) {
                $this->_error(
                    'Unable to open file \'' . $this->_tarname
                    . '.tmp\' in binary read mode'
                );
                @rename($this->_tarname . ".tmp", $this->_tarname);
                return false;
            }

            if (!$this->_openWrite()) {
                @rename($this->_tarname . ".tmp", $this->_tarname);
                return false;
            }

            if ($this->_compress_type == 'gz') {
                $end_blocks = 0;

                while (!@gzeof($v_temp_tar)) {
                    $v_buffer = @gzread($v_temp_tar, 512);
                    if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
                        $end_blocks++;
                        // do not copy end blocks, we will re-make them
                        // after appending
                        continue;
                    } elseif ($end_blocks > 0) {
                        for ($i = 0; $i < $end_blocks; $i++) {
                            $this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
                        }
                        $end_blocks = 0;
                    }
                    $v_binary_data = pack("a512", $v_buffer);
                    $this->_writeBlock($v_binary_data);
                }

                @gzclose($v_temp_tar);
            } elseif ($this->_compress_type == 'bz2') {
                $end_blocks = 0;

                while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) {
                    if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
                        $end_blocks++;
                        // do not copy end blocks, we will re-make them
                        // after appending
                        continue;
                    } elseif ($end_blocks > 0) {
                        for ($i = 0; $i < $end_blocks; $i++) {
                            $this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
                        }
                        $end_blocks = 0;
                    }
                    $v_binary_data = pack("a512", $v_buffer);
                    $this->_writeBlock($v_binary_data);
                }

                @bzclose($v_temp_tar);
            } elseif ($this->_compress_type == 'lzma2') {
                $end_blocks = 0;

                while (strlen($v_buffer = @xzread($v_temp_tar, 512)) > 0) {
                    if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) {
                        $end_blocks++;
                        // do not copy end blocks, we will re-make them
                        // after appending
                        continue;
                    } elseif ($end_blocks > 0) {
                        for ($i = 0; $i < $end_blocks; $i++) {
                            $this->_writeBlock(ARCHIVE_TAR_END_BLOCK);
                        }
                        $end_blocks = 0;
                    }
                    $v_binary_data = pack("a512", $v_buffer);
                    $this->_writeBlock($v_binary_data);
                }

                @xzclose($v_temp_tar);
            }

            if (!@unlink($this->_tarname . ".tmp")) {
                $this->_error(
                    'Error while deleting temporary file \''
                    . $this->_tarname . '.tmp\''
                );
            }
        } else {
            // ----- For not compressed tar, just add files before the last
            //       one or two 512 bytes block
            if (!$this->_openReadWrite()) {
                return false;
            }

            clearstatcache();
            $v_size = filesize($this->_tarname);

            // We might have zero, one or two end blocks.
            // The standard is two, but we should try to handle
            // other cases.
            fseek($this->_file, $v_size - 1024);
            if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
                fseek($this->_file, $v_size - 1024);
            } elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) {
                fseek($this->_file, $v_size - 512);
            }
        }

        return true;
    }

    /**
     * @param $p_filelist
     * @param string $p_add_dir
     * @param string $p_remove_dir
     * @return bool
     */
    public function _append($p_filelist, $p_add_dir = '', $p_remove_dir = '')
    {
        if (!$this->_openAppend()) {
            return false;
        }

        if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir)) {
            $this->_writeFooter();
        }

        $this->_close();

        return true;
    }

    /**
     * Check if a directory exists and create it (including parent
     * dirs) if not.
     *
     * @param string $p_dir directory to check
     *
     * @return bool true if the directory exists or was created
     */
    public function _dirCheck($p_dir)
    {
        clearstatcache();
        if ((@is_dir($p_dir)) || ($p_dir == '')) {
            return true;
        }

        $p_parent_dir = dirname($p_dir);

        if (($p_parent_dir != $p_dir) &&
            ($p_parent_dir != '') &&
            (!$this->_dirCheck($p_parent_dir))
        ) {
            return false;
        }

        if (!@mkdir($p_dir, 0777)) {
            $this->_error("Unable to create directory '$p_dir'");
            return false;
        }

        return true;
    }

    /**
     * Compress path by changing for example "/dir/foo/../bar" to "/dir/bar",
     * rand emove double slashes.
     *
     * @param string $p_dir path to reduce
     *
     * @return string reduced path
     */
    private function _pathReduction($p_dir)
    {
        $v_result = '';

        // ----- Look for not empty path
        if ($p_dir != '') {
            // ----- Explode path by directory names
            $v_list = explode('/', $p_dir);

            // ----- Study directories from last to first
            for ($i = sizeof($v_list) - 1; $i >= 0; $i--) {
                // ----- Look for current path
                if ($v_list[$i] == ".") {
                    // ----- Ignore this directory
                    // Should be the first $i=0, but no check is done
                } else {
                    if ($v_list[$i] == "..") {
                        // ----- Ignore it and ignore the $i-1
                        $i--;
                    } else {
                        if (($v_list[$i] == '')
                            && ($i != (sizeof($v_list) - 1))
                            && ($i != 0)
                        ) {
                            // ----- Ignore only the double '//' in path,
                            // but not the first and last /
                        } else {
                            $v_result = $v_list[$i] . ($i != (sizeof($v_list) - 1) ? '/'
                                    . $v_result : '');
                        }
                    }
                }
            }
        }

        if (defined('OS_WINDOWS') && OS_WINDOWS) {
            $v_result = strtr($v_result, '\\', '/');
        }

        return $v_result;
    }

    /**
     * @param $p_path
     * @param bool $p_remove_disk_letter
     * @return string
     */
    public function _translateWinPath($p_path, $p_remove_disk_letter = true)
    {
        if (defined('OS_WINDOWS') && OS_WINDOWS) {
            // ----- Look for potential disk letter
            if (($p_remove_disk_letter)
                && (($v_position = strpos($p_path, ':')) != false)
            ) {
                $p_path = substr($p_path, $v_position + 1);
            }
            // ----- Change potential windows directory separator
            if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\')) {
                $p_path = strtr($p_path, '\\', '/');
            }
        }
        return $p_path;
    }
}
PK�^�\�o�P�Ppear/System.phpnu�[���<?php
/**
 * File/Directory manipulation
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    System
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR.php';
require_once 'Console/Getopt.php';

$GLOBALS['_System_temp_files'] = array();

/**
* System offers cross platform compatible system functions
*
* Static functions for different operations. Should work under
* Unix and Windows. The names and usage has been taken from its respectively
* GNU commands. The functions will return (bool) false on error and will
* trigger the error with the PHP trigger_error() function (you can silence
* the error by prefixing a '@' sign after the function call, but this
* is not recommended practice.  Instead use an error handler with
* {@link set_error_handler()}).
*
* Documentation on this class you can find in:
* http://pear.php.net/manual/
*
* Example usage:
* if (!@System::rm('-r file1 dir1')) {
*    print "could not delete file1 or dir1";
* }
*
* In case you need to to pass file names with spaces,
* pass the params as an array:
*
* System::rm(array('-r', $file1, $dir1));
*
* @category   pear
* @package    System
* @author     Tomas V.V. Cox <cox@idecnet.com>
* @copyright  1997-2006 The PHP Group
* @license    http://opensource.org/licenses/bsd-license.php New BSD License
* @version    Release: 1.10.16
* @link       http://pear.php.net/package/PEAR
* @since      Class available since Release 0.1
* @static
*/
class System
{
    /**
     * returns the commandline arguments of a function
     *
     * @param    string  $argv           the commandline
     * @param    string  $short_options  the allowed option short-tags
     * @param    string  $long_options   the allowed option long-tags
     * @return   array   the given options and there values
     */
    public static function _parseArgs($argv, $short_options, $long_options = null)
    {
        if (!is_array($argv) && $argv !== null) {
            /*
            // Quote all items that are a short option
            $av = preg_split('/(\A| )--?[a-z0-9]+[ =]?((?<!\\\\)((,\s*)|((?<!,)\s+))?)/i', $argv, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);
            $offset = 0;
            foreach ($av as $a) {
                $b = trim($a[0]);
                if ($b[0] == '"' || $b[0] == "'") {
                    continue;
                }

                $escape = escapeshellarg($b);
                $pos = $a[1] + $offset;
                $argv = substr_replace($argv, $escape, $pos, strlen($b));
                $offset += 2;
            }
            */

            // Find all items, quoted or otherwise
            preg_match_all("/(?:[\"'])(.*?)(?:['\"])|([^\s]+)/", $argv, $av);
            $argv = $av[1];
            foreach ($av[2] as $k => $a) {
                if (empty($a)) {
                    continue;
                }
                $argv[$k] = trim($a) ;
            }
        }

        return Console_Getopt::getopt2($argv, $short_options, $long_options);
    }

    /**
     * Output errors with PHP trigger_error(). You can silence the errors
     * with prefixing a "@" sign to the function call: @System::mkdir(..);
     *
     * @param mixed $error a PEAR error or a string with the error message
     * @return bool false
     */
    protected static function raiseError($error)
    {
        if (PEAR::isError($error)) {
            $error = $error->getMessage();
        }
        trigger_error($error, E_USER_WARNING);
        return false;
    }

    /**
     * Creates a nested array representing the structure of a directory
     *
     * System::_dirToStruct('dir1', 0) =>
     *   Array
     *    (
     *    [dirs] => Array
     *        (
     *            [0] => dir1
     *        )
     *
     *    [files] => Array
     *        (
     *            [0] => dir1/file2
     *            [1] => dir1/file3
     *        )
     *    )
     * @param    string  $sPath      Name of the directory
     * @param    integer $maxinst    max. deep of the lookup
     * @param    integer $aktinst    starting deep of the lookup
     * @param    bool    $silent     if true, do not emit errors.
     * @return   array   the structure of the dir
     */
    protected static function _dirToStruct($sPath, $maxinst, $aktinst = 0, $silent = false)
    {
        $struct = array('dirs' => array(), 'files' => array());
        if (($dir = @opendir($sPath)) === false) {
            if (!$silent) {
                System::raiseError("Could not open dir $sPath");
            }
            return $struct; // XXX could not open error
        }

        $struct['dirs'][] = $sPath = realpath($sPath); // XXX don't add if '.' or '..' ?
        $list = array();
        while (false !== ($file = readdir($dir))) {
            if ($file != '.' && $file != '..') {
                $list[] = $file;
            }
        }

        closedir($dir);
        natsort($list);
        if ($aktinst < $maxinst || $maxinst == 0) {
            foreach ($list as $val) {
                $path = $sPath . DIRECTORY_SEPARATOR . $val;
                if (is_dir($path) && !is_link($path)) {
                    $tmp    = System::_dirToStruct($path, $maxinst, $aktinst+1, $silent);
                    $struct = array_merge_recursive($struct, $tmp);
                } else {
                    $struct['files'][] = $path;
                }
            }
        }

        return $struct;
    }

    /**
     * Creates a nested array representing the structure of a directory and files
     *
     * @param    array $files Array listing files and dirs
     * @return   array
     * @static
     * @see System::_dirToStruct()
     */
    protected static function _multipleToStruct($files)
    {
        $struct = array('dirs' => array(), 'files' => array());
        settype($files, 'array');
        foreach ($files as $file) {
            if (is_dir($file) && !is_link($file)) {
                $tmp    = System::_dirToStruct($file, 0);
                $struct = array_merge_recursive($tmp, $struct);
            } else {
                if (!in_array($file, $struct['files'])) {
                    $struct['files'][] = $file;
                }
            }
        }
        return $struct;
    }

    /**
     * The rm command for removing files.
     * Supports multiple files and dirs and also recursive deletes
     *
     * @param    string  $args   the arguments for rm
     * @return   mixed   PEAR_Error or true for success
     * @static
     * @access   public
     */
    public static function rm($args)
    {
        $opts = System::_parseArgs($args, 'rf'); // "f" does nothing but I like it :-)
        if (PEAR::isError($opts)) {
            return System::raiseError($opts);
        }
        foreach ($opts[0] as $opt) {
            if ($opt[0] == 'r') {
                $do_recursive = true;
            }
        }
        $ret = true;
        if (isset($do_recursive)) {
            $struct = System::_multipleToStruct($opts[1]);
            foreach ($struct['files'] as $file) {
                if (!@unlink($file)) {
                    $ret = false;
                }
            }

            rsort($struct['dirs']);
            foreach ($struct['dirs'] as $dir) {
                if (!@rmdir($dir)) {
                    $ret = false;
                }
            }
        } else {
            foreach ($opts[1] as $file) {
                $delete = (is_dir($file)) ? 'rmdir' : 'unlink';
                if (!@$delete($file)) {
                    $ret = false;
                }
            }
        }
        return $ret;
    }

    /**
     * Make directories.
     *
     * The -p option will create parent directories
     * @param    string  $args    the name of the director(y|ies) to create
     * @return   bool    True for success
     */
    public static function mkDir($args)
    {
        $opts = System::_parseArgs($args, 'pm:');
        if (PEAR::isError($opts)) {
            return System::raiseError($opts);
        }

        $mode = 0777; // default mode
        foreach ($opts[0] as $opt) {
            if ($opt[0] == 'p') {
                $create_parents = true;
            } elseif ($opt[0] == 'm') {
                // if the mode is clearly an octal number (starts with 0)
                // convert it to decimal
                if (strlen($opt[1]) && $opt[1][0] == '0') {
                    $opt[1] = octdec($opt[1]);
                } else {
                    // convert to int
                    $opt[1] += 0;
                }
                $mode = $opt[1];
            }
        }

        $ret = true;
        if (isset($create_parents)) {
            foreach ($opts[1] as $dir) {
                $dirstack = array();
                while ((!file_exists($dir) || !is_dir($dir)) &&
                        $dir != DIRECTORY_SEPARATOR) {
                    array_unshift($dirstack, $dir);
                    $dir = dirname($dir);
                }

                while ($newdir = array_shift($dirstack)) {
                    if (!is_writeable(dirname($newdir))) {
                        $ret = false;
                        break;
                    }

                    if (!mkdir($newdir, $mode)) {
                        $ret = false;
                    }
                }
            }
        } else {
            foreach($opts[1] as $dir) {
                if ((@file_exists($dir) || !is_dir($dir)) && !mkdir($dir, $mode)) {
                    $ret = false;
                }
            }
        }

        return $ret;
    }

    /**
     * Concatenate files
     *
     * Usage:
     * 1) $var = System::cat('sample.txt test.txt');
     * 2) System::cat('sample.txt test.txt > final.txt');
     * 3) System::cat('sample.txt test.txt >> final.txt');
     *
     * Note: as the class use fopen, urls should work also
     *
     * @param    string  $args   the arguments
     * @return   boolean true on success
     */
    public static function &cat($args)
    {
        $ret = null;
        $files = array();
        if (!is_array($args)) {
            $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
        }

        $count_args = count($args);
        for ($i = 0; $i < $count_args; $i++) {
            if ($args[$i] == '>') {
                $mode = 'wb';
                $outputfile = $args[$i+1];
                break;
            } elseif ($args[$i] == '>>') {
                $mode = 'ab+';
                $outputfile = $args[$i+1];
                break;
            } else {
                $files[] = $args[$i];
            }
        }
        $outputfd = false;
        if (isset($mode)) {
            if (!$outputfd = fopen($outputfile, $mode)) {
                $err = System::raiseError("Could not open $outputfile");
                return $err;
            }
            $ret = true;
        }
        foreach ($files as $file) {
            if (!$fd = fopen($file, 'r')) {
                System::raiseError("Could not open $file");
                continue;
            }
            while ($cont = fread($fd, 2048)) {
                if (is_resource($outputfd)) {
                    fwrite($outputfd, $cont);
                } else {
                    $ret .= $cont;
                }
            }
            fclose($fd);
        }
        if (is_resource($outputfd)) {
            fclose($outputfd);
        }
        return $ret;
    }

    /**
     * Creates temporary files or directories. This function will remove
     * the created files when the scripts finish its execution.
     *
     * Usage:
     *   1) $tempfile = System::mktemp("prefix");
     *   2) $tempdir  = System::mktemp("-d prefix");
     *   3) $tempfile = System::mktemp();
     *   4) $tempfile = System::mktemp("-t /var/tmp prefix");
     *
     * prefix -> The string that will be prepended to the temp name
     *           (defaults to "tmp").
     * -d     -> A temporary dir will be created instead of a file.
     * -t     -> The target dir where the temporary (file|dir) will be created. If
     *           this param is missing by default the env vars TMP on Windows or
     *           TMPDIR in Unix will be used. If these vars are also missing
     *           c:\windows\temp or /tmp will be used.
     *
     * @param   string  $args  The arguments
     * @return  mixed   the full path of the created (file|dir) or false
     * @see System::tmpdir()
     */
    public static function mktemp($args = null)
    {
        static $first_time = true;
        $opts = System::_parseArgs($args, 't:d');
        if (PEAR::isError($opts)) {
            return System::raiseError($opts);
        }

        foreach ($opts[0] as $opt) {
            if ($opt[0] == 'd') {
                $tmp_is_dir = true;
            } elseif ($opt[0] == 't') {
                $tmpdir = $opt[1];
            }
        }

        $prefix = (isset($opts[1][0])) ? $opts[1][0] : 'tmp';
        if (!isset($tmpdir)) {
            $tmpdir = System::tmpdir();
        }

        if (!System::mkDir(array('-p', $tmpdir))) {
            return false;
        }

        $tmp = tempnam($tmpdir, $prefix);
        if (isset($tmp_is_dir)) {
            unlink($tmp); // be careful possible race condition here
            if (!mkdir($tmp, 0700)) {
                return System::raiseError("Unable to create temporary directory $tmpdir");
            }
        }

        $GLOBALS['_System_temp_files'][] = $tmp;
        if (isset($tmp_is_dir)) {
            //$GLOBALS['_System_temp_files'][] = dirname($tmp);
        }

        if ($first_time) {
            PEAR::registerShutdownFunc(array('System', '_removeTmpFiles'));
            $first_time = false;
        }

        return $tmp;
    }

    /**
     * Remove temporary files created my mkTemp. This function is executed
     * at script shutdown time
     */
    public static function _removeTmpFiles()
    {
        if (count($GLOBALS['_System_temp_files'])) {
            $delete = $GLOBALS['_System_temp_files'];
            array_unshift($delete, '-r');
            System::rm($delete);
            $GLOBALS['_System_temp_files'] = array();
        }
    }

    /**
     * Get the path of the temporal directory set in the system
     * by looking in its environments variables.
     * Note: php.ini-recommended removes the "E" from the variables_order setting,
     * making unavaible the $_ENV array, that s why we do tests with _ENV
     *
     * @return string The temporary directory on the system
     */
    public static function tmpdir()
    {
        if (OS_WINDOWS) {
            if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP')) {
                return $var;
            }
            if ($var = isset($_ENV['TEMP']) ? $_ENV['TEMP'] : getenv('TEMP')) {
                return $var;
            }
            if ($var = isset($_ENV['USERPROFILE']) ? $_ENV['USERPROFILE'] : getenv('USERPROFILE')) {
                return $var;
            }
            if ($var = isset($_ENV['windir']) ? $_ENV['windir'] : getenv('windir')) {
                return $var;
            }
            return getenv('SystemRoot') . '\temp';
        }
        if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR')) {
            return $var;
        }
        return realpath(function_exists('sys_get_temp_dir') ? sys_get_temp_dir() : '/tmp');
    }

    /**
     * The "which" command (show the full path of a command)
     *
     * @param string $program The command to search for
     * @param mixed  $fallback Value to return if $program is not found
     *
     * @return mixed A string with the full path or false if not found
     * @author Stig Bakken <ssb@php.net>
     */
    public static function which($program, $fallback = false)
    {
        // enforce API
        if (!is_string($program) || '' == $program) {
            return $fallback;
        }

        // full path given
        if (basename($program) != $program) {
            $path_elements[] = dirname($program);
            $program = basename($program);
        } else {
            $path = getenv('PATH');
            if (!$path) {
                $path = getenv('Path'); // some OSes are just stupid enough to do this
            }

            $path_elements = explode(PATH_SEPARATOR, $path);
        }

        if (OS_WINDOWS) {
            $exe_suffixes = getenv('PATHEXT')
                                ? explode(PATH_SEPARATOR, getenv('PATHEXT'))
                                : array('.exe','.bat','.cmd','.com');
            // allow passing a command.exe param
            if (strpos($program, '.') !== false) {
                array_unshift($exe_suffixes, '');
            }
        } else {
            $exe_suffixes = array('');
        }

        foreach ($exe_suffixes as $suff) {
            foreach ($path_elements as $dir) {
                $file = $dir . DIRECTORY_SEPARATOR . $program . $suff;
                // It's possible to run a .bat on Windows that is_executable
                // would return false for. The is_executable check is meaningless...
                if (OS_WINDOWS) {
                    if (file_exists($file)) {
                        return $file;
                    }
                } else {
                    if (is_executable($file)) {
                        return $file;
                    }
                }
            }
        }
        return $fallback;
    }

    /**
     * The "find" command
     *
     * Usage:
     *
     * System::find($dir);
     * System::find("$dir -type d");
     * System::find("$dir -type f");
     * System::find("$dir -name *.php");
     * System::find("$dir -name *.php -name *.htm*");
     * System::find("$dir -maxdepth 1");
     *
     * Params implemented:
     * $dir            -> Start the search at this directory
     * -type d         -> return only directories
     * -type f         -> return only files
     * -maxdepth <n>   -> max depth of recursion
     * -name <pattern> -> search pattern (bash style). Multiple -name param allowed
     *
     * @param  mixed Either array or string with the command line
     * @return array Array of found files
     */
    public static function find($args)
    {
        if (!is_array($args)) {
            $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
        }
        $dir = realpath(array_shift($args));
        if (!$dir) {
            return array();
        }
        $patterns = array();
        $depth = 0;
        $do_files = $do_dirs = true;
        $args_count = count($args);
        for ($i = 0; $i < $args_count; $i++) {
            switch ($args[$i]) {
                case '-type':
                    if (in_array($args[$i+1], array('d', 'f'))) {
                        if ($args[$i+1] == 'd') {
                            $do_files = false;
                        } else {
                            $do_dirs = false;
                        }
                    }
                    $i++;
                    break;
                case '-name':
                    $name = preg_quote($args[$i+1], '#');
                    // our magic characters ? and * have just been escaped,
                    // so now we change the escaped versions to PCRE operators
                    $name = strtr($name, array('\?' => '.', '\*' => '.*'));
                    $patterns[] = '('.$name.')';
                    $i++;
                    break;
                case '-maxdepth':
                    $depth = $args[$i+1];
                    break;
            }
        }
        $path = System::_dirToStruct($dir, $depth, 0, true);
        if ($do_files && $do_dirs) {
            $files = array_merge($path['files'], $path['dirs']);
        } elseif ($do_dirs) {
            $files = $path['dirs'];
        } else {
            $files = $path['files'];
        }
        if (count($patterns)) {
            $dsq = preg_quote(DIRECTORY_SEPARATOR, '#');
            $pattern = '#(^|'.$dsq.')'.implode('|', $patterns).'($|'.$dsq.')#';
            $ret = array();
            $files_count = count($files);
            for ($i = 0; $i < $files_count; $i++) {
                // only search in the part of the file below the current directory
                $filepart = basename($files[$i]);
                if (preg_match($pattern, $filepart)) {
                    $ret[] = $files[$i];
                }
            }
            return $ret;
        }
        return $files;
    }
}
PK�^�\P'hB�&�&
pear/Mail.phpnu�[���<?php
/**
 * PEAR's Mail:: interface.
 *
 * PHP version 5
 *
 * LICENSE:
 *
 * Copyright (c) 1997-2017, Chuck Hagenbuch & Richard Heyes
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category    Mail
 * @package     Mail
 * @author      Chuck Hagenbuch <chuck@horde.org>
 * @copyright   1997-2017 Chuck Hagenbuch
 * @license     http://opensource.org/licenses/BSD-3-Clause New BSD License
 * @version     CVS: $Id$
 * @link        http://pear.php.net/package/Mail/
 */

require_once 'PEAR.php';

/**
 * PEAR's Mail:: interface. Defines the interface for implementing
 * mailers under the PEAR hierarchy, and provides supporting functions
 * useful in multiple mailer backends.
 *
 * @version $Revision$
 * @package Mail
 */
class Mail
{
    /**
     * Line terminator used for separating header lines.
     * @var string
     */
    public $sep = "\r\n";

    /**
     * Provides an interface for generating Mail:: objects of various
     * types
     *
     * @param string $driver The kind of Mail:: object to instantiate.
     * @param array  $params The parameters to pass to the Mail:: object.
     *
     * @return object Mail a instance of the driver class or if fails a PEAR Error
     */
    public static function factory($driver, $params = array())
    {
        $driver = strtolower($driver);
        @include_once 'Mail/' . $driver . '.php';
        $class = 'Mail_' . $driver;
        if (class_exists($class)) {
            $mailer = new $class($params);
            return $mailer;
        } else {
            return PEAR::raiseError('Unable to find class for driver ' . $driver);
        }
    }

    /**
     * Implements Mail::send() function using php's built-in mail()
     * command.
     *
     * @param mixed $recipients Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid. This may contain recipients not
     *              specified in the headers, for Bcc:, resending
     *              messages, etc.
     *
     * @param array $headers The array of headers to send with the mail, in an
     *              associative array, where the array key is the
     *              header name (ie, 'Subject'), and the array value
     *              is the header value (ie, 'test'). The header
     *              produced from those values would be 'Subject:
     *              test'.
     *
     * @param string $body The full text of the message body, including any
     *               Mime parts, etc.
     *
     * @return mixed Returns true on success, or a PEAR_Error
     *               containing a descriptive error message on
     *               failure.
     *
     * @deprecated use Mail_mail::send instead
     */
    public function send($recipients, $headers, $body)
    {
        if (!is_array($headers)) {
            return PEAR::raiseError('$headers must be an array');
        }

        $result = $this->_sanitizeHeaders($headers);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        // if we're passed an array of recipients, implode it.
        if (is_array($recipients)) {
            $recipients = implode(', ', $recipients);
        }

        // get the Subject out of the headers array so that we can
        // pass it as a seperate argument to mail().
        $subject = '';
        if (isset($headers['Subject'])) {
            $subject = $headers['Subject'];
            unset($headers['Subject']);
        }

        // flatten the headers out.
        list(, $text_headers) = Mail::prepareHeaders($headers);

        return mail($recipients, $subject, $body, $text_headers);
    }

    /**
     * Sanitize an array of mail headers by removing any additional header
     * strings present in a legitimate header's value.  The goal of this
     * filter is to prevent mail injection attacks.
     *
     * @param array $headers The associative array of headers to sanitize.
     */
    protected function _sanitizeHeaders(&$headers)
    {
        foreach ($headers as $key => $value) {
            $headers[$key] =
                preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i',
                             null, $value);
        }
    }

    /**
     * Take an array of mail headers and return a string containing
     * text usable in sending a message.
     *
     * @param array $headers The array of headers to prepare, in an associative
     *              array, where the array key is the header name (ie,
     *              'Subject'), and the array value is the header
     *              value (ie, 'test'). The header produced from those
     *              values would be 'Subject: test'.
     *
     * @return mixed Returns false if it encounters a bad address,
     *               otherwise returns an array containing two
     *               elements: Any From: address found in the headers,
     *               and the plain text version of the headers.
     */
    protected function prepareHeaders($headers)
    {
        $lines = array();
        $from = null;

        foreach ($headers as $key => $value) {
            if (strcasecmp($key, 'From') === 0) {
                include_once 'Mail/RFC822.php';
                $parser = new Mail_RFC822();
                $addresses = $parser->parseAddressList($value, 'localhost', false);
                if (is_a($addresses, 'PEAR_Error')) {
                    return $addresses;
                }

                $from = $addresses[0]->mailbox . '@' . $addresses[0]->host;

                // Reject envelope From: addresses with spaces.
                if (strstr($from, ' ')) {
                    return false;
                }

                $lines[] = $key . ': ' . $value;
            } elseif (strcasecmp($key, 'Received') === 0) {
                $received = array();
                if (is_array($value)) {
                    foreach ($value as $line) {
                        $received[] = $key . ': ' . $line;
                    }
                }
                else {
                    $received[] = $key . ': ' . $value;
                }
                // Put Received: headers at the top.  Spam detectors often
                // flag messages with Received: headers after the Subject:
                // as spam.
                $lines = array_merge($received, $lines);
            } else {
                // If $value is an array (i.e., a list of addresses), convert
                // it to a comma-delimited string of its elements (addresses).
                if (is_array($value)) {
                    $value = implode(', ', $value);
                }
                $lines[] = $key . ': ' . $value;
            }
        }

        return array($from, join($this->sep, $lines));
    }

    /**
     * Take a set of recipients and parse them, returning an array of
     * bare addresses (forward paths) that can be passed to sendmail
     * or an smtp server with the rcpt to: command.
     *
     * @param mixed Either a comma-seperated list of recipients
     *              (RFC822 compliant), or an array of recipients,
     *              each RFC822 valid.
     *
     * @return mixed An array of forward paths (bare addresses) or a PEAR_Error
     *               object if the address list could not be parsed.
     */
    protected function parseRecipients($recipients)
    {
        include_once 'Mail/RFC822.php';

        // if we're passed an array, assume addresses are valid and
        // implode them before parsing.
        if (is_array($recipients)) {
            $recipients = implode(', ', $recipients);
        }

        // Parse recipients, leaving out all personal info. This is
        // for smtp recipients, etc. All relevant personal information
        // should already be in the headers.
        $Mail_RFC822 = new Mail_RFC822();
        $addresses = $Mail_RFC822->parseAddressList($recipients, 'localhost', false);

        // If parseAddressList() returned a PEAR_Error object, just return it.
        if (is_a($addresses, 'PEAR_Error')) {
            return $addresses;
        }

        $recipients = array();
        if (is_array($addresses)) {
            foreach ($addresses as $ob) {
                $recipients[] = $ob->mailbox . '@' . $ob->host;
            }
        }

        return $recipients;
    }

}
PK�^�\P(~�T
T
pear/Auth/SASL/CramMD5.phpnu�[���<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2002-2003 Richard Heyes                                 | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Richard Heyes <richard@php.net>                               | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* Implmentation of CRAM-MD5 SASL mechanism
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_CramMD5 extends Auth_SASL_Common
{
    /**
    * Implements the CRAM-MD5 SASL mechanism
    * This DOES NOT base64 encode the return value,
    * you will need to do that yourself.
    *
    * @param string $user      Username
    * @param string $pass      Password
    * @param string $challenge The challenge supplied by the server.
    *                          this should be already base64_decoded.
    *
    * @return string The string to pass back to the server, of the form
    *                "<user> <digest>". This is NOT base64_encoded.
    */
    function getResponse($user, $pass, $challenge)
    {
        return $user . ' ' . $this->_HMAC_MD5($pass, $challenge);
    }
}
?>PK�^�\vR�r,,pear/Auth/SASL/External.phpnu�[���<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2008 Christoph Schulz                                   | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Christoph Schulz <develop@kristov.de>                         | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* Implmentation of EXTERNAL SASL mechanism
*
* @author  Christoph Schulz <develop@kristov.de>
* @access  public
* @version 1.0.3
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_External extends Auth_SASL_Common
{
    /**
    * Returns EXTERNAL response
    *
    * @param  string $authcid   Authentication id (username)
    * @param  string $pass      Password
    * @param  string $authzid   Autorization id
    * @return string            EXTERNAL Response
    */
    function getResponse($authcid, $pass, $authzid = '')
    {
        return $authzid;
    }
}
?>
PK�^�\�T�pear/Auth/SASL/Common.phpnu�[���<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes                                 |
// | All rights reserved.                                                  |
// |                                                                       |
// | Redistribution and use in source and binary forms, with or without    |
// | modification, are permitted provided that the following conditions    |
// | are met:                                                              |
// |                                                                       |
// | o Redistributions of source code must retain the above copyright      |
// |   notice, this list of conditions and the following disclaimer.       |
// | o Redistributions in binary form must reproduce the above copyright   |
// |   notice, this list of conditions and the following disclaimer in the |
// |   documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote      |
// |   products derived from this software without specific prior written  |
// |   permission.                                                         |
// |                                                                       |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
// |                                                                       |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net>                               |
// +-----------------------------------------------------------------------+
//
// $Id$

/**
* Common functionality to SASL mechanisms
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

class Auth_SASL_Common
{
    /**
    * Function which implements HMAC MD5 digest
    *
    * @param  string $key  The secret key
    * @param  string $data The data to hash
    * @param  bool $raw_output Whether the digest is returned in binary or hexadecimal format.
    *
    * @return string       The HMAC-MD5 digest
    */
    function _HMAC_MD5($key, $data, $raw_output = FALSE)
    {
        if (strlen($key) > 64) {
            $key = pack('H32', md5($key));
        }

        if (strlen($key) < 64) {
            $key = str_pad($key, 64, chr(0));
        }

        $k_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36), 64);
        $k_opad = substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64);

        $inner  = pack('H32', md5($k_ipad . $data));
        $digest = md5($k_opad . $inner, $raw_output);

        return $digest;
    }

    /**
    * Function which implements HMAC-SHA-1 digest
    *
    * @param  string $key  The secret key
    * @param  string $data The data to hash
    * @param  bool $raw_output Whether the digest is returned in binary or hexadecimal format.
    * @return string       The HMAC-SHA-1 digest
    * @author Jehan <jehan.marmottard@gmail.com>
    * @access protected
    */
    protected function _HMAC_SHA1($key, $data, $raw_output = FALSE)
    {
        if (strlen($key) > 64) {
            $key = sha1($key, TRUE);
        }

        if (strlen($key) < 64) {
            $key = str_pad($key, 64, chr(0));
        }

        $k_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36), 64);
        $k_opad = substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64);

        $inner  = pack('H40', sha1($k_ipad . $data));
        $digest = sha1($k_opad . $inner, $raw_output);

         return $digest;
     }
}
?>
PK�^�\�J�}
}
pear/Auth/SASL/Anonymous.phpnu�[���<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2002-2003 Richard Heyes                                 | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Richard Heyes <richard@php.net>                               | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* Implmentation of ANONYMOUS SASL mechanism
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_Anonymous extends Auth_SASL_Common
{
    /**
    * Not much to do here except return the token supplied.
    * No encoding, hashing or encryption takes place for this
    * mechanism, simply one of:
    *  o An email address
    *  o An opaque string not containing "@" that can be interpreted
    *    by the sysadmin
    *  o Nothing
    *
    * We could have some logic here for the second option, but this
    * would by no means create something interpretable.
    *
    * @param  string $token Optional email address or string to provide
    *                       as trace information.
    * @return string        The unaltered input token
    */
    function getResponse($token = '')
    {
        return $token;
    }
}
?>PK�^�\�<� OOpear/Auth/SASL/Login.phpnu�[���<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2002-2003 Richard Heyes                                 | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Richard Heyes <richard@php.net>                               | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* This is technically not a SASL mechanism, however
* it's used by Net_Sieve, Net_Cyrus and potentially
* other protocols , so here is a good place to abstract
* it.
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_Login extends Auth_SASL_Common
{
    /**
    * Pseudo SASL LOGIN mechanism
    *
    * @param  string $user Username
    * @param  string $pass Password
    * @return string       LOGIN string
    */
    function getResponse($user, $pass)
    {
        return sprintf('LOGIN %s %s', $user, $pass);
    }
}
?>PK�^�\����==pear/Auth/SASL/Plain.phpnu�[���<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2002-2003 Richard Heyes                                 | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Richard Heyes <richard@php.net>                               | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* Implmentation of PLAIN SASL mechanism
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_Plain extends Auth_SASL_Common
{
    /**
    * Returns PLAIN response
    *
    * @param  string $authcid   Authentication id (username)
    * @param  string $pass      Password
    * @param  string $authzid   Autorization id
    * @return string            PLAIN Response
    */
    function getResponse($authcid, $pass, $authzid = '')
    {
        return $authzid . chr(0) . $authcid . chr(0) . $pass;
    }
}
?>
PK�^�\%ׅtg!g!pear/Auth/SASL/DigestMD5.phpnu�[���<?php
// +-----------------------------------------------------------------------+ 
// | Copyright (c) 2002-2003 Richard Heyes                                 | 
// | All rights reserved.                                                  | 
// |                                                                       | 
// | Redistribution and use in source and binary forms, with or without    | 
// | modification, are permitted provided that the following conditions    | 
// | are met:                                                              | 
// |                                                                       | 
// | o Redistributions of source code must retain the above copyright      | 
// |   notice, this list of conditions and the following disclaimer.       | 
// | o Redistributions in binary form must reproduce the above copyright   | 
// |   notice, this list of conditions and the following disclaimer in the | 
// |   documentation and/or other materials provided with the distribution.| 
// | o The names of the authors may not be used to endorse or promote      | 
// |   products derived from this software without specific prior written  | 
// |   permission.                                                         | 
// |                                                                       | 
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | 
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | 
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | 
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | 
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | 
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | 
// |                                                                       | 
// +-----------------------------------------------------------------------+ 
// | Author: Richard Heyes <richard@php.net>                               | 
// +-----------------------------------------------------------------------+ 
// 
// $Id$

/**
* Implmentation of DIGEST-MD5 SASL mechanism
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_DigestMD5 extends Auth_SASL_Common
{
    /**
    * Provides the (main) client response for DIGEST-MD5
    * requires a few extra parameters than the other
    * mechanisms, which are unavoidable.
    * 
    * @param  string $authcid   Authentication id (username)
    * @param  string $pass      Password
    * @param  string $challenge The digest challenge sent by the server
    * @param  string $hostname  The hostname of the machine you're connecting to
    * @param  string $service   The servicename (eg. imap, pop, acap etc)
    * @param  string $authzid   Authorization id (username to proxy as)
    * @return string            The digest response (NOT base64 encoded)
    * @access public
    */
    function getResponse($authcid, $pass, $challenge, $hostname, $service, $authzid = '')
    {
        $challenge = $this->_parseChallenge($challenge);
        $authzid_string = '';
        if ($authzid != '') {
            $authzid_string = ',authzid="' . $authzid . '"'; 
        }

        if (!empty($challenge)) {
            $cnonce         = $this->_getCnonce();
            $digest_uri     = sprintf('%s/%s', $service, $hostname);
            $response_value = $this->_getResponseValue($authcid, $pass, $challenge['realm'], $challenge['nonce'], $cnonce, $digest_uri, $authzid);

            if ($challenge['realm']) {
                return sprintf('username="%s",realm="%s"' . $authzid_string  .
',nonce="%s",cnonce="%s",nc=00000001,qop=auth,digest-uri="%s",response=%s,maxbuf=%d', $authcid, $challenge['realm'], $challenge['nonce'], $cnonce, $digest_uri, $response_value, $challenge['maxbuf']);
            } else {
                return sprintf('username="%s"' . $authzid_string  . ',nonce="%s",cnonce="%s",nc=00000001,qop=auth,digest-uri="%s",response=%s,maxbuf=%d', $authcid, $challenge['nonce'], $cnonce, $digest_uri, $response_value, $challenge['maxbuf']);
            }
        } else {
            return PEAR::raiseError('Invalid digest challenge');
        }
    }
    
    /**
    * Parses and verifies the digest challenge*
    *
    * @param  string $challenge The digest challenge
    * @return array             The parsed challenge as an assoc
    *                           array in the form "directive => value".
    * @access private
    */
    function _parseChallenge($challenge)
    {
        $tokens = array();
        while (preg_match('/^([a-z-]+)=("[^"]+(?<!\\\)"|[^,]+)/i', $challenge, $matches)) {

            // Ignore these as per rfc2831
            if ($matches[1] == 'opaque' OR $matches[1] == 'domain') {
                $challenge = substr($challenge, strlen($matches[0]) + 1);
                continue;
            }

            // Allowed multiple "realm" and "auth-param"
            if (!empty($tokens[$matches[1]]) AND ($matches[1] == 'realm' OR $matches[1] == 'auth-param')) {
                if (is_array($tokens[$matches[1]])) {
                    $tokens[$matches[1]][] = preg_replace('/^"(.*)"$/', '\\1', $matches[2]);
                } else {
                    $tokens[$matches[1]] = array($tokens[$matches[1]], preg_replace('/^"(.*)"$/', '\\1', $matches[2]));
                }

            // Any other multiple instance = failure
            } elseif (!empty($tokens[$matches[1]])) {
                $tokens = array();
                break;

            } else {
                $tokens[$matches[1]] = preg_replace('/^"(.*)"$/', '\\1', $matches[2]);
            }

            // Remove the just parsed directive from the challenge
            $challenge = substr($challenge, strlen($matches[0]) + 1);
        }

        /**
        * Defaults and required directives
        */
        // Realm
        if (empty($tokens['realm'])) {
            $tokens['realm'] = "";
        }

        // Maxbuf
        if (empty($tokens['maxbuf'])) {
            $tokens['maxbuf'] = 65536;
        }

        // Required: nonce, algorithm
        if (empty($tokens['nonce']) OR empty($tokens['algorithm'])) {
            return array();
        }

        return $tokens;
    }

    /**
    * Creates the response= part of the digest response
    *
    * @param  string $authcid    Authentication id (username)
    * @param  string $pass       Password
    * @param  string $realm      Realm as provided by the server
    * @param  string $nonce      Nonce as provided by the server
    * @param  string $cnonce     Client nonce
    * @param  string $digest_uri The digest-uri= value part of the response
    * @param  string $authzid    Authorization id
    * @return string             The response= part of the digest response
    * @access private
    */    
    function _getResponseValue($authcid, $pass, $realm, $nonce, $cnonce, $digest_uri, $authzid = '')
    {
        if ($authzid == '') {
            $A1 = sprintf('%s:%s:%s', pack('H32', md5(sprintf('%s:%s:%s', $authcid, $realm, $pass))), $nonce, $cnonce);
        } else {
            $A1 = sprintf('%s:%s:%s:%s', pack('H32', md5(sprintf('%s:%s:%s', $authcid, $realm, $pass))), $nonce, $cnonce, $authzid);
        }
        $A2 = 'AUTHENTICATE:' . $digest_uri;
        return md5(sprintf('%s:%s:00000001:%s:auth:%s', md5($A1), $nonce, $cnonce, md5($A2)));
    }

    /**
    * Creates the client nonce for the response
    *
    * @return string  The cnonce value
    * @access private
    */
    function _getCnonce()
    {
        if (@file_exists('/dev/urandom') && $fd = @fopen('/dev/urandom', 'r')) {
            return base64_encode(fread($fd, 32));

        } elseif (@file_exists('/dev/random') && $fd = @fopen('/dev/random', 'r')) {
            return base64_encode(fread($fd, 32));

        } else {
            $str = '';
            for ($i=0; $i<32; $i++) {
                $str .= chr(mt_rand(0, 255));
            }
            
            return base64_encode($str);
        }
    }
}
?>
PK�^�\ќ��0�0pear/Auth/SASL/SCRAM.phpnu�[���<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2011 Jehan                                              |
// | All rights reserved.                                                  |
// |                                                                       |
// | Redistribution and use in source and binary forms, with or without    |
// | modification, are permitted provided that the following conditions    |
// | are met:                                                              |
// |                                                                       |
// | o Redistributions of source code must retain the above copyright      |
// |   notice, this list of conditions and the following disclaimer.       |
// | o Redistributions in binary form must reproduce the above copyright   |
// |   notice, this list of conditions and the following disclaimer in the |
// |   documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote      |
// |   products derived from this software without specific prior written  |
// |   permission.                                                         |
// |                                                                       |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
// |                                                                       |
// +-----------------------------------------------------------------------+
// | Author: Jehan <jehan.marmottard@gmail.com                             |
// +-----------------------------------------------------------------------+
//
// $Id$

/**
* Implementation of SCRAM-* SASL mechanisms.
* SCRAM mechanisms have 3 main steps (initial response, response to the server challenge, then server signature
* verification) which keep state-awareness. Therefore a single class instanciation must be done and reused for the whole
* authentication process.
*
* @author  Jehan <jehan.marmottard@gmail.com>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('Auth/SASL/Common.php');

class Auth_SASL_SCRAM extends Auth_SASL_Common
{
    /**
    * Construct a SCRAM-H client where 'H' is a cryptographic hash function.
    *
    * @param string $hash The name cryptographic hash function 'H' as registered by IANA in the "Hash Function Textual
    * Names" registry.
    * @link http://www.iana.org/assignments/hash-function-text-names/hash-function-text-names.xml "Hash Function Textual
    * Names"
    * format of core PHP hash function.
    * @access public
    */
    function __construct($hash)
    {
        // Though I could be strict, I will actually also accept the naming used in the PHP core hash framework.
        // For instance "sha1" is accepted, while the registered hash name should be "SHA-1".
        $hash = strtolower($hash);
        $hashes = array('md2' => 'md2',
            'md5' => 'md5',
            'sha-1' => 'sha1',
            'sha1' => 'sha1',
            'sha-224' > 'sha224',
            'sha224' > 'sha224',
            'sha-256' => 'sha256',
            'sha256' => 'sha256',
            'sha-384' => 'sha384',
            'sha384' => 'sha384',
            'sha-512' => 'sha512',
            'sha512' => 'sha512');
        if (function_exists('hash_hmac') && isset($hashes[$hash]))
        {
            $this->hash = create_function('$data', 'return hash("' . $hashes[$hash] . '", $data, TRUE);');
            $this->hmac = create_function('$key,$str,$raw', 'return hash_hmac("' . $hashes[$hash] . '", $str, $key, $raw);');
        }
        elseif ($hash == 'md5')
        {
            $this->hash = create_function('$data', 'return md5($data, true);');
            $this->hmac = array($this, '_HMAC_MD5');
        }
        elseif (in_array($hash, array('sha1', 'sha-1')))
        {
            $this->hash = create_function('$data', 'return sha1($data, true);');
            $this->hmac = array($this, '_HMAC_SHA1');
        }
        else
            return PEAR::raiseError('Invalid SASL mechanism type');
    }

    /**
    * Provides the (main) client response for SCRAM-H.
    *
    * @param  string $authcid   Authentication id (username)
    * @param  string $pass      Password
    * @param  string $challenge The challenge sent by the server.
    * If the challenge is NULL or an empty string, the result will be the "initial response".
    * @param  string $authzid   Authorization id (username to proxy as)
    * @return string|false      The response (binary, NOT base64 encoded)
    * @access public
    */
    public function getResponse($authcid, $pass, $challenge = NULL, $authzid = NULL)
    {
        $authcid = $this->_formatName($authcid);
        if (empty($authcid))
        {
            return false;
        }
        if (!empty($authzid))
        {
            $authzid = $this->_formatName($authzid);
            if (empty($authzid))
            {
                return false;
            }
        }

        if (empty($challenge))
        {
            return $this->_generateInitialResponse($authcid, $authzid);
        }
        else
        {
            return $this->_generateResponse($challenge, $pass);
        }

    }

    /**
    * Prepare a name for inclusion in a SCRAM response.
    *
    * @param string $username a name to be prepared.
    * @return string the reformated name.
    * @access private
    */
    private function _formatName($username)
    {
        // TODO: prepare through the SASLprep profile of the stringprep algorithm.
        // See RFC-4013.

        $username = str_replace('=', '=3D', $username);
        $username = str_replace(',', '=2C', $username);
        return $username;
    }

    /**
    * Generate the initial response which can be either sent directly in the first message or as a response to an empty
    * server challenge.
    *
    * @param string $authcid Prepared authentication identity.
    * @param string $authzid Prepared authorization identity.
    * @return string The SCRAM response to send.
    * @access private
    */
    private function _generateInitialResponse($authcid, $authzid)
    {
        $init_rep = '';
        $gs2_cbind_flag = 'n,'; // TODO: support channel binding.
        $this->gs2_header = $gs2_cbind_flag . (!empty($authzid)? 'a=' . $authzid : '') . ',';

        // I must generate a client nonce and "save" it for later comparison on second response.
        $this->cnonce = $this->_getCnonce();
        // XXX: in the future, when mandatory and/or optional extensions are defined in any updated RFC,
        // this message can be updated.
        $this->first_message_bare = 'n=' . $authcid . ',r=' . $this->cnonce;
        return $this->gs2_header . $this->first_message_bare;
    }

    /**
    * Parses and verifies a non-empty SCRAM challenge.
    *
    * @param  string $challenge The SCRAM challenge
    * @return string|false      The response to send; false in case of wrong challenge or if an initial response has not
    * been generated first.
    * @access private
    */
    private function _generateResponse($challenge, $password)
    {
        // XXX: as I don't support mandatory extension, I would fail on them.
        // And I simply ignore any optional extension.
        $server_message_regexp = "#^r=([\x21-\x2B\x2D-\x7E]+),s=((?:[A-Za-z0-9/+]{4})*(?:[A-Za-z0-9]{3}=|[A-Xa-z0-9]{2}==)?),i=([0-9]*)(,[A-Za-z]=[^,])*$#";
        if (!isset($this->cnonce, $this->gs2_header)
            || !preg_match($server_message_regexp, $challenge, $matches))
        {
            return false;
        }
        $nonce = $matches[1];
        $salt = base64_decode($matches[2]);
        if (!$salt)
        {
            // Invalid Base64.
            return false;
        }
        $i = intval($matches[3]);

        $cnonce = substr($nonce, 0, strlen($this->cnonce));
        if ($cnonce <> $this->cnonce)
        {
            // Invalid challenge! Are we under attack?
            return false;
        }

        $channel_binding = 'c=' . base64_encode($this->gs2_header); // TODO: support channel binding.
        $final_message = $channel_binding . ',r=' . $nonce; // XXX: no extension.

        // TODO: $password = $this->normalize($password); // SASLprep profile of stringprep.
        $saltedPassword = $this->hi($password, $salt, $i);
        $this->saltedPassword = $saltedPassword;
        $clientKey = call_user_func($this->hmac, $saltedPassword, "Client Key", TRUE);
        $storedKey = call_user_func($this->hash, $clientKey, TRUE);
        $authMessage = $this->first_message_bare . ',' . $challenge . ',' . $final_message;
        $this->authMessage = $authMessage;
        $clientSignature = call_user_func($this->hmac, $storedKey, $authMessage, TRUE);
        $clientProof = $clientKey ^ $clientSignature;
        $proof = ',p=' . base64_encode($clientProof);

        return $final_message . $proof;
    }

    /**
    * SCRAM has also a server verification step. On a successful outcome, it will send additional data which must
    * absolutely be checked against this function. If this fails, the entity which we are communicating with is probably
    * not the server as it has not access to your ServerKey.
    *
    * @param string $data The additional data sent along a successful outcome.
    * @return bool Whether the server has been authenticated.
    * If false, the client must close the connection and consider to be under a MITM attack.
    * @access public
    */
    public function processOutcome($data)
    {
        $verifier_regexp = '#^v=((?:[A-Za-z0-9/+]{4})*(?:[A-Za-z0-9]{3}=|[A-Xa-z0-9]{2}==)?)$#';
        if (!isset($this->saltedPassword, $this->authMessage)
            || !preg_match($verifier_regexp, $data, $matches))
        {
            // This cannot be an outcome, you never sent the challenge's response.
            return false;
        }

        $verifier = $matches[1];
        $proposed_serverSignature = base64_decode($verifier);
        $serverKey = call_user_func($this->hmac, $this->saltedPassword, "Server Key", true);
        $serverSignature = call_user_func($this->hmac, $serverKey, $this->authMessage, TRUE);
        return ($proposed_serverSignature === $serverSignature);
    }

    /**
    * Hi() call, which is essentially PBKDF2 (RFC-2898) with HMAC-H() as the pseudorandom function.
    *
    * @param string $str The string to hash.
    * @param string $hash The hash value.
    * @param int $i The iteration count.
    * @access private
    */
    private function hi($str, $salt, $i)
    {
        $int1 = "\0\0\0\1";
        $ui = call_user_func($this->hmac, $str, $salt . $int1, true);
        $result = $ui;
        for ($k = 1; $k < $i; $k++)
        {
            $ui = call_user_func($this->hmac, $str, $ui, true);
            $result = $result ^ $ui;
        }
        return $result;
    }


    /**
    * Creates the client nonce for the response
    *
    * @return string  The cnonce value
    * @access private
    * @author  Richard Heyes <richard@php.net>
    */
    private function _getCnonce()
    {
        // TODO: I reused the nonce function from the DigestMD5 class.
        // I should probably make this a protected function in Common.
        if (@file_exists('/dev/urandom') && $fd = @fopen('/dev/urandom', 'r')) {
            return base64_encode(fread($fd, 32));

        } elseif (@file_exists('/dev/random') && $fd = @fopen('/dev/random', 'r')) {
            return base64_encode(fread($fd, 32));

        } else {
            $str = '';
            for ($i=0; $i<32; $i++) {
                $str .= chr(mt_rand(0, 255));
            }

            return base64_encode($str);
        }
    }

}

?>
PK�^�\2r����pear/Auth/SASL.phpnu�[���<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes                                 |
// | All rights reserved.                                                  |
// |                                                                       |
// | Redistribution and use in source and binary forms, with or without    |
// | modification, are permitted provided that the following conditions    |
// | are met:                                                              |
// |                                                                       |
// | o Redistributions of source code must retain the above copyright      |
// |   notice, this list of conditions and the following disclaimer.       |
// | o Redistributions in binary form must reproduce the above copyright   |
// |   notice, this list of conditions and the following disclaimer in the |
// |   documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote      |
// |   products derived from this software without specific prior written  |
// |   permission.                                                         |
// |                                                                       |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
// |                                                                       |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net>                               |
// +-----------------------------------------------------------------------+
//
// $Id$

/**
* Client implementation of various SASL mechanisms
*
* @author  Richard Heyes <richard@php.net>
* @access  public
* @version 1.0
* @package Auth_SASL
*/

require_once('PEAR.php');

class Auth_SASL
{
    /**
    * Factory class. Returns an object of the request
    * type.
    *
    * @param string $type One of: Anonymous
    *                             Plain
    *                             CramMD5
    *                             DigestMD5
    *                             SCRAM-* (any mechanism of the SCRAM family)
    *                     Types are not case sensitive
    */
    public static function factory($type)
    {
        switch (strtolower($type)) {
            case 'anonymous':
                $filename  = 'Auth/SASL/Anonymous.php';
                $classname = 'Auth_SASL_Anonymous';
                break;

            case 'login':
                $filename  = 'Auth/SASL/Login.php';
                $classname = 'Auth_SASL_Login';
                break;

            case 'plain':
                $filename  = 'Auth/SASL/Plain.php';
                $classname = 'Auth_SASL_Plain';
                break;

            case 'external':
                $filename  = 'Auth/SASL/External.php';
                $classname = 'Auth_SASL_External';
                break;

            case 'crammd5':
                // $msg = 'Deprecated mechanism name. Use IANA-registered name: CRAM-MD5.';
                // trigger_error($msg, E_USER_DEPRECATED);
            case 'cram-md5':
                $filename  = 'Auth/SASL/CramMD5.php';
                $classname = 'Auth_SASL_CramMD5';
                break;

            case 'digestmd5':
                // $msg = 'Deprecated mechanism name. Use IANA-registered name: DIGEST-MD5.';
                // trigger_error($msg, E_USER_DEPRECATED);
            case 'digest-md5':
                // $msg = 'DIGEST-MD5 is a deprecated SASL mechanism as per RFC-6331. Using it could be a security risk.';
                // trigger_error($msg, E_USER_NOTICE);
                $filename  = 'Auth/SASL/DigestMD5.php';
                $classname = 'Auth_SASL_DigestMD5';
                break;

            default:
                $scram = '/^SCRAM-(.{1,9})$/i';
                if (preg_match($scram, $type, $matches))
                {
                    $hash = $matches[1];
                    $filename = dirname(__FILE__) .'/SASL/SCRAM.php';
                    $classname = 'Auth_SASL_SCRAM';
                    $parameter = $hash;
                    break;
                }
                return PEAR::raiseError('Invalid SASL mechanism type');
                break;
        }

        require_once($filename);
        if (isset($parameter))
            $obj = new $classname($parameter);
        else
            $obj = new $classname();
        return $obj;
    }
}

?>
PK�^�\=V+�3�3pear/.depdbnu�[���a:3:{s:8:"_version";s:3:"1.0";s:12:"dependencies";a:3:{s:12:"pear.php.net";a:5:{s:4:"pear";a:9:{i:0;a:3:{s:3:"dep";a:4:{s:4:"name";s:11:"Archive_Tar";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";s:11:"recommended";s:5:"1.4.4";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:4:{s:4:"name";s:16:"Structures_Graph";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.1.0";s:11:"recommended";s:5:"1.1.1";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:2;a:3:{s:3:"dep";a:4:{s:4:"name";s:14:"Console_Getopt";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.1";s:11:"recommended";s:5:"1.4.1";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:3;a:3:{s:3:"dep";a:4:{s:4:"name";s:8:"XML_Util";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.3.0";s:11:"recommended";s:5:"1.4.3";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:4;a:3:{s:3:"dep";a:4:{s:4:"name";s:17:"PEAR_Frontend_Web";s:7:"channel";s:12:"pear.php.net";s:3:"max";s:3:"0.4";s:9:"conflicts";s:0:"";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:5;a:3:{s:3:"dep";a:5:{s:4:"name";s:17:"PEAR_Frontend_Gtk";s:7:"channel";s:12:"pear.php.net";s:3:"max";s:5:"0.4.0";s:7:"exclude";s:5:"0.4.0";s:9:"conflicts";s:0:"";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:6;a:3:{s:3:"dep";a:3:{s:4:"name";s:17:"PEAR_Frontend_Web";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"0.5.1";}s:4:"type";s:8:"optional";s:5:"group";s:12:"webinstaller";}i:7;a:3:{s:3:"dep";a:3:{s:4:"name";s:17:"PEAR_Frontend_Gtk";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"0.4.0";}s:4:"type";s:8:"optional";s:5:"group";s:12:"gtkinstaller";}i:8;a:3:{s:3:"dep";a:2:{s:4:"name";s:18:"PEAR_Frontend_Gtk2";s:7:"channel";s:12:"pear.php.net";}s:4:"type";s:8:"optional";s:5:"group";s:13:"gtk2installer";}}s:4:"mail";a:1:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:8:"Net_SMTP";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.1";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:15:"mail_mimedecode";a:1:{i:0;a:3:{s:3:"dep";a:4:{s:4:"name";s:9:"Mail_Mime";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.4.0";s:7:"exclude";s:5:"1.4.0";}s:4:"type";s:8:"required";s:5:"group";b:0;}}s:9:"net_sieve";a:2:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:3:"1.0";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:3:{s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:3:"1.0";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:8:"net_smtp";a:2:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.7";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:3:{s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.5";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}}s:16:"components.ez.no";a:3:{s:7:"archive";a:1:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:4:"Base";s:7:"channel";s:16:"components.ez.no";s:3:"min";s:3:"1.8";}s:4:"type";s:8:"required";s:5:"group";b:0;}}s:12:"consoletools";a:1:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:4:"Base";s:7:"channel";s:16:"components.ez.no";s:3:"min";s:3:"1.8";}s:4:"type";s:8:"required";s:5:"group";b:0;}}s:4:"file";a:1:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:4:"Base";s:7:"channel";s:16:"components.ez.no";s:3:"min";s:3:"1.4";}s:4:"type";s:8:"required";s:5:"group";b:0;}}}s:16:"pear.symfony.com";a:12:{s:19:"dependencyinjection";a:2:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:6:"Config";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:2:{s:4:"name";s:4:"Yaml";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:14:"doctrinebridge";a:2:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:9:"Validator";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:2:{s:4:"name";s:4:"Form";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:10:"domcrawler";a:1:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:11:"CssSelector";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:7:"routing";a:2:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:6:"Config";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:2:{s:4:"name";s:4:"Yaml";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:11:"translation";a:1:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:6:"Config";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:10:"twigbridge";a:4:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:4:"Form";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:2:{s:4:"name";s:7:"Routing";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:2;a:3:{s:3:"dep";a:2:{s:4:"name";s:11:"Translation";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:3;a:3:{s:3:"dep";a:2:{s:4:"name";s:4:"Yaml";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:9:"validator";a:2:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:4:"Yaml";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:2:{s:4:"name";s:14:"HttpFoundation";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:10:"browserkit";a:2:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:10:"DomCrawler";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:2:{s:4:"name";s:7:"Process";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:4:"form";a:4:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:15:"EventDispatcher";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:2:{s:4:"name";s:9:"Validator";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:2;a:3:{s:3:"dep";a:2:{s:4:"name";s:6:"Locale";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:3;a:3:{s:3:"dep";a:2:{s:4:"name";s:14:"HttpFoundation";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:10:"httpkernel";a:8:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:14:"HttpFoundation";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:2:{s:4:"name";s:15:"EventDispatcher";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:2;a:3:{s:3:"dep";a:2:{s:4:"name";s:6:"Config";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:3;a:3:{s:3:"dep";a:2:{s:4:"name";s:19:"DependencyInjection";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:4;a:3:{s:3:"dep";a:2:{s:4:"name";s:11:"ClassLoader";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:5;a:3:{s:3:"dep";a:2:{s:4:"name";s:10:"BrowserKit";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:6;a:3:{s:3:"dep";a:2:{s:4:"name";s:7:"Console";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:7;a:3:{s:3:"dep";a:2:{s:4:"name";s:6:"Finder";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:13:"monologbridge";a:1:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:10:"HttpKernel";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"required";s:5:"group";b:0;}}s:8:"security";a:7:{i:0;a:3:{s:3:"dep";a:2:{s:4:"name";s:10:"HttpKernel";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:2:{s:4:"name";s:14:"HttpFoundation";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:2;a:3:{s:3:"dep";a:2:{s:4:"name";s:15:"EventDispatcher";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:3;a:3:{s:3:"dep";a:2:{s:4:"name";s:7:"Routing";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:4;a:3:{s:3:"dep";a:2:{s:4:"name";s:6:"Finder";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:5;a:3:{s:3:"dep";a:2:{s:4:"name";s:11:"ClassLoader";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}i:6;a:3:{s:3:"dep";a:2:{s:4:"name";s:4:"Form";s:7:"channel";s:16:"pear.symfony.com";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}}}s:8:"packages";a:3:{s:12:"pear.php.net";a:11:{s:11:"archive_tar";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:16:"structures_graph";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:14:"console_getopt";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:8:"xml_util";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:17:"pear_frontend_web";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:17:"pear_frontend_gtk";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:18:"pear_frontend_gtk2";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:8:"net_smtp";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"mail";}}s:9:"mail_mime";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:15:"mail_mimedecode";}}s:10:"net_socket";a:2:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:9:"net_sieve";}i:1;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:8:"net_smtp";}}s:9:"auth_sasl";a:2:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:9:"net_sieve";}i:1;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:8:"net_smtp";}}}s:16:"components.ez.no";a:1:{s:4:"base";a:3:{i:0;a:2:{s:7:"channel";s:16:"components.ez.no";s:7:"package";s:7:"archive";}i:1;a:2:{s:7:"channel";s:16:"components.ez.no";s:7:"package";s:12:"consoletools";}i:2;a:2:{s:7:"channel";s:16:"components.ez.no";s:7:"package";s:4:"file";}}}s:16:"pear.symfony.com";a:18:{s:6:"config";a:4:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:19:"dependencyinjection";}i:1;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:7:"routing";}i:2;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:11:"translation";}i:3;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"httpkernel";}}s:4:"yaml";a:4:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:19:"dependencyinjection";}i:1;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:7:"routing";}i:2;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"twigbridge";}i:3;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:9:"validator";}}s:9:"validator";a:2:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:14:"doctrinebridge";}i:1;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:4:"form";}}s:4:"form";a:3:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:14:"doctrinebridge";}i:1;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"twigbridge";}i:2;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:8:"security";}}s:11:"cssselector";a:1:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"domcrawler";}}s:7:"routing";a:2:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"twigbridge";}i:1;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:8:"security";}}s:11:"translation";a:1:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"twigbridge";}}s:14:"httpfoundation";a:4:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:9:"validator";}i:1;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:4:"form";}i:2;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"httpkernel";}i:3;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:8:"security";}}s:10:"domcrawler";a:1:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"browserkit";}}s:7:"process";a:1:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"browserkit";}}s:15:"eventdispatcher";a:3:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:4:"form";}i:1;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"httpkernel";}i:2;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:8:"security";}}s:6:"locale";a:1:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:4:"form";}}s:19:"dependencyinjection";a:1:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"httpkernel";}}s:11:"classloader";a:2:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"httpkernel";}i:1;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:8:"security";}}s:10:"browserkit";a:1:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"httpkernel";}}s:7:"console";a:1:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"httpkernel";}}s:6:"finder";a:2:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:10:"httpkernel";}i:1;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:8:"security";}}s:10:"httpkernel";a:2:{i:0;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:13:"monologbridge";}i:1;a:2:{s:7:"channel";s:16:"pear.symfony.com";s:7:"package";s:8:"security";}}}}}PK�^�\��b�8�8&pear/.pkgxml/Symfony2_Config-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Config</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Config Component</summary>
 <description>Symfony2 Config Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:41</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="d05aef71cd966ce2c36098180be89f86" name="Symfony/Component/Config/autoloader.php" role="php" />
   <file md5sum="2e855ecea3b2fd176fcde9dcbee078b4" name="Symfony/Component/Config/CHANGELOG.md" role="doc" />
   <file md5sum="01e6d3e3f3a09e1d220b680f222152b3" name="Symfony/Component/Config/composer.json" role="doc" />
   <file md5sum="237f4a7e38967f0ce1f4088a999e0bfa" name="Symfony/Component/Config/ConfigCache.php" role="php" />
   <file md5sum="f43a790400b259a8a307fd4da828692d" name="Symfony/Component/Config/Definition/ArrayNode.php" role="php" />
   <file md5sum="a93e8f4c6f94c2d8bf86546930191d59" name="Symfony/Component/Config/Definition/BaseNode.php" role="php" />
   <file md5sum="ea6292c05f9aa76ec66dded2fe411d44" name="Symfony/Component/Config/Definition/BooleanNode.php" role="php" />
   <file md5sum="a6478a434beef0f4d0146d4ce64b9450" name="Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.php" role="php" />
   <file md5sum="79419f2566cf399be4660640a0405fa5" name="Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.php" role="php" />
   <file md5sum="2935ae381b785ced6f6ec1eded9a9ce0" name="Symfony/Component/Config/Definition/Builder/EnumNodeDefinition.php" role="php" />
   <file md5sum="4612723b84cd2729dd94020f1412539a" name="Symfony/Component/Config/Definition/Builder/ExprBuilder.php" role="php" />
   <file md5sum="ea6a82bed9a7bfe2f7c7e4bded4ba25e" name="Symfony/Component/Config/Definition/Builder/FloatNodeDefinition.php" role="php" />
   <file md5sum="0de24b6c3b0846189e0e7140340e4c20" name="Symfony/Component/Config/Definition/Builder/IntegerNodeDefinition.php" role="php" />
   <file md5sum="9a07191e37bffb3d56fd105365371a73" name="Symfony/Component/Config/Definition/Builder/MergeBuilder.php" role="php" />
   <file md5sum="2c90e62ffffbcb9ee0f5b91d4b466f4a" name="Symfony/Component/Config/Definition/Builder/NodeBuilder.php" role="php" />
   <file md5sum="632c164c115dfa3969cc278fabb707ac" name="Symfony/Component/Config/Definition/Builder/NodeDefinition.php" role="php" />
   <file md5sum="511a0150b959a7eab00cbf0fed174c0a" name="Symfony/Component/Config/Definition/Builder/NodeParentInterface.php" role="php" />
   <file md5sum="f03726ad2acc69648e3f4c92c3436b63" name="Symfony/Component/Config/Definition/Builder/NormalizationBuilder.php" role="php" />
   <file md5sum="23b4be07040f89b6bbc54fff80c97835" name="Symfony/Component/Config/Definition/Builder/NumericNodeDefinition.php" role="php" />
   <file md5sum="ac0a6d2f8ae048f365844d761db049db" name="Symfony/Component/Config/Definition/Builder/ParentNodeDefinitionInterface.php" role="php" />
   <file md5sum="d9fa4186f4448c3cad8152bb9b08a10d" name="Symfony/Component/Config/Definition/Builder/ScalarNodeDefinition.php" role="php" />
   <file md5sum="48f136a2fe26ef3b84f2f4e785dafdca" name="Symfony/Component/Config/Definition/Builder/TreeBuilder.php" role="php" />
   <file md5sum="8c0ab61f8ce4e8a0b95fae338d07289d" name="Symfony/Component/Config/Definition/Builder/ValidationBuilder.php" role="php" />
   <file md5sum="0563011a6e9c41ea7b14fccd4c384d91" name="Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.php" role="php" />
   <file md5sum="3c993b6405debf926234927327e1540e" name="Symfony/Component/Config/Definition/ConfigurationInterface.php" role="php" />
   <file md5sum="180a524d66b02398fec5f36baf16db87" name="Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.php" role="php" />
   <file md5sum="88061b0ef652b050eacda9f9d086777f" name="Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php" role="php" />
   <file md5sum="4718c796e11ef0403e41dce26b7224ea" name="Symfony/Component/Config/Definition/EnumNode.php" role="php" />
   <file md5sum="ede2ab4177afff995069bc54c4517f9e" name="Symfony/Component/Config/Definition/Exception/DuplicateKeyException.php" role="php" />
   <file md5sum="a7eb222da39a7eefc7b0c04a1583cc44" name="Symfony/Component/Config/Definition/Exception/Exception.php" role="php" />
   <file md5sum="e2a12d6760feb9f7c96d61e502f68b2c" name="Symfony/Component/Config/Definition/Exception/ForbiddenOverwriteException.php" role="php" />
   <file md5sum="df898eea27890a50cb912e1dbb88f1b2" name="Symfony/Component/Config/Definition/Exception/InvalidConfigurationException.php" role="php" />
   <file md5sum="aeb2ca3c7e035486a4ccebeac363125c" name="Symfony/Component/Config/Definition/Exception/InvalidDefinitionException.php" role="php" />
   <file md5sum="4dc25832f90b656b88da8ac50789784a" name="Symfony/Component/Config/Definition/Exception/InvalidTypeException.php" role="php" />
   <file md5sum="55c97aa4e81643f04c3abd943cc29a24" name="Symfony/Component/Config/Definition/Exception/UnsetKeyException.php" role="php" />
   <file md5sum="3e06f85a85b21a16869037e026ec5189" name="Symfony/Component/Config/Definition/FloatNode.php" role="php" />
   <file md5sum="c06b0c32a7f8c540545b7a78662eba48" name="Symfony/Component/Config/Definition/IntegerNode.php" role="php" />
   <file md5sum="c735fbb1542c2dbe1d8037b27b0beb7d" name="Symfony/Component/Config/Definition/NodeInterface.php" role="php" />
   <file md5sum="864cb20b0ce39fa3d8d30f96ee41674e" name="Symfony/Component/Config/Definition/NumericNode.php" role="php" />
   <file md5sum="4d853174c3a8b201b3684fd8cdc5b768" name="Symfony/Component/Config/Definition/Processor.php" role="php" />
   <file md5sum="dea67be834c0088d2b11880b694a38f9" name="Symfony/Component/Config/Definition/PrototypedArrayNode.php" role="php" />
   <file md5sum="ef44def01e8a4abfa4eaabdab44a3e1e" name="Symfony/Component/Config/Definition/PrototypeNodeInterface.php" role="php" />
   <file md5sum="52e870bf26dfc67c5cc508f35728877d" name="Symfony/Component/Config/Definition/ReferenceDumper.php" role="php" />
   <file md5sum="7b0e2b4e13486b70af9a70a2d8b9f403" name="Symfony/Component/Config/Definition/ScalarNode.php" role="php" />
   <file md5sum="c83791bd28ed5e4abf7e79c3b906252f" name="Symfony/Component/Config/Definition/VariableNode.php" role="php" />
   <file md5sum="b00d7fdeddee90ff6e91ffa0c0475e91" name="Symfony/Component/Config/Exception/FileLoaderImportCircularReferenceException.php" role="php" />
   <file md5sum="e31db44ccc39c72d40a6a9edc2fa66c5" name="Symfony/Component/Config/Exception/FileLoaderLoadException.php" role="php" />
   <file md5sum="8145d1e145a232182b2a7780b5fd2ac9" name="Symfony/Component/Config/FileLocator.php" role="php" />
   <file md5sum="c7ad8a99c8bc28c7e0e151c4fc5acff7" name="Symfony/Component/Config/FileLocatorInterface.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Config/LICENSE" role="doc" />
   <file md5sum="eeb0111110364ce7bb3bfcc9d771c21b" name="Symfony/Component/Config/Loader/DelegatingLoader.php" role="php" />
   <file md5sum="db1f00201bb87f7e952648484aedbeb2" name="Symfony/Component/Config/Loader/FileLoader.php" role="php" />
   <file md5sum="284f38e73bfa8153ed95e7aa99e91b3e" name="Symfony/Component/Config/Loader/Loader.php" role="php" />
   <file md5sum="df23b397d09d2260b2fa666de641cef2" name="Symfony/Component/Config/Loader/LoaderInterface.php" role="php" />
   <file md5sum="df8900364600fbe7fcb4b32dcd948715" name="Symfony/Component/Config/Loader/LoaderResolver.php" role="php" />
   <file md5sum="ff8788c585296546155b51834d0c3919" name="Symfony/Component/Config/Loader/LoaderResolverInterface.php" role="php" />
   <file md5sum="ba93c00cbc0805b83cc9986edb1c47a0" name="Symfony/Component/Config/phpunit.xml.dist" role="test" />
   <file md5sum="80fb119edb21de39ff671d640fc7f381" name="Symfony/Component/Config/README.md" role="doc" />
   <file md5sum="282da7b67d1a869a71f1810bdc3d8973" name="Symfony/Component/Config/Resource/DirectoryResource.php" role="php" />
   <file md5sum="4f6a17cb16d8b483fd9b563fa6d2639f" name="Symfony/Component/Config/Resource/FileResource.php" role="php" />
   <file md5sum="a822b81682a486b7817170ad83002141" name="Symfony/Component/Config/Resource/ResourceInterface.php" role="php" />
   <file md5sum="b9a1f02f3774a704eab93339d9a34800" name="Symfony/Component/Config/Tests/ConfigCacheTest.php" role="test" />
   <file md5sum="d6c9405065e761fd9bae37c68b9226cb" name="Symfony/Component/Config/Tests/Definition/ArrayNodeTest.php" role="test" />
   <file md5sum="a78dc9a09b81abd4216dc1aa743b212c" name="Symfony/Component/Config/Tests/Definition/BooleanNodeTest.php" role="test" />
   <file md5sum="000369ac6ed9312c820a1a511480fcdd" name="Symfony/Component/Config/Tests/Definition/Builder/ArrayNodeDefinitionTest.php" role="test" />
   <file md5sum="a6338f1a07bbe404e4caa1b1fdb179fd" name="Symfony/Component/Config/Tests/Definition/Builder/EnumNodeDefinitionTest.php" role="test" />
   <file md5sum="d03be2c954f36df3c615e6a89eba304b" name="Symfony/Component/Config/Tests/Definition/Builder/ExprBuilderTest.php" role="test" />
   <file md5sum="5deab29f7b387cd324ad3a2e3086d80d" name="Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.php" role="test" />
   <file md5sum="720159fadc5f8388c5c7cc16cfd9559e" name="Symfony/Component/Config/Tests/Definition/Builder/NumericNodeDefinitionTest.php" role="test" />
   <file md5sum="24a37c336daa3cd1a1d80d670505b32d" name="Symfony/Component/Config/Tests/Definition/Builder/TreeBuilderTest.php" role="test" />
   <file md5sum="565ad8f4a0db6f7e6c4173b711bc3976" name="Symfony/Component/Config/Tests/Definition/Dumper/XmlReferenceDumperTest.php" role="test" />
   <file md5sum="ebf1ffd5db00b1c0e9b914fe83fb3169" name="Symfony/Component/Config/Tests/Definition/Dumper/YamlReferenceDumperTest.php" role="test" />
   <file md5sum="92624818027c535fe005d85d365bdaaa" name="Symfony/Component/Config/Tests/Definition/EnumNodeTest.php" role="test" />
   <file md5sum="2f083bc35c2a3769c24a185d4bffd428" name="Symfony/Component/Config/Tests/Definition/FinalizationTest.php" role="test" />
   <file md5sum="78e5e5856b6071f3c7f9f8da4881a06d" name="Symfony/Component/Config/Tests/Definition/FloatNodeTest.php" role="test" />
   <file md5sum="a5a4ed81aef01e766cb948154ae92643" name="Symfony/Component/Config/Tests/Definition/IntegerNodeTest.php" role="test" />
   <file md5sum="a81e2313992cb216f88f46113da997ce" name="Symfony/Component/Config/Tests/Definition/MergeTest.php" role="test" />
   <file md5sum="b8ac64aa50fcdabc32efa4d76fa08737" name="Symfony/Component/Config/Tests/Definition/NormalizationTest.php" role="test" />
   <file md5sum="dc6f3545eb30eb7efd1f84278c1b08dd" name="Symfony/Component/Config/Tests/Definition/PrototypedArrayNodeTest.php" role="test" />
   <file md5sum="cab8145a6c30d31be3d4897cc68208f6" name="Symfony/Component/Config/Tests/Definition/ScalarNodeTest.php" role="test" />
   <file md5sum="8157a7f666d2269ba36f5d12b71b392c" name="Symfony/Component/Config/Tests/FileLocatorTest.php" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Config/Tests/Fixtures/Again/foo.xml" role="test" />
   <file md5sum="61483df06205d8340ff30281494ddf4d" name="Symfony/Component/Config/Tests/Fixtures/Builder/BarNodeDefinition.php" role="test" />
   <file md5sum="bb1913bbf75e3a341384f2dd58267465" name="Symfony/Component/Config/Tests/Fixtures/Builder/NodeBuilder.php" role="test" />
   <file md5sum="c5057b3b1c5b4790985800ea90cd4d7a" name="Symfony/Component/Config/Tests/Fixtures/Builder/VariableNodeDefinition.php" role="test" />
   <file md5sum="3ca56644f6fcffdd18a57f5e29db5faf" name="Symfony/Component/Config/Tests/Fixtures/Configuration/ExampleConfiguration.php" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Config/Tests/Fixtures/foo.xml" role="test" />
   <file md5sum="0b3c991715906416d884a53869b71210" name="Symfony/Component/Config/Tests/Fixtures/Util/document_type.xml" role="test" />
   <file md5sum="9faea03761cbb774e569e0ddc15118a2" name="Symfony/Component/Config/Tests/Fixtures/Util/invalid.xml" role="test" />
   <file md5sum="5527ef0a29820ff2870e0749cd38c297" name="Symfony/Component/Config/Tests/Fixtures/Util/invalid_schema.xml" role="test" />
   <file md5sum="1ffa211272544831555c45f701a9e523" name="Symfony/Component/Config/Tests/Fixtures/Util/schema.xsd" role="test" />
   <file md5sum="57e37ff0b94a2574fe00e18efbc92a4c" name="Symfony/Component/Config/Tests/Fixtures/Util/valid.xml" role="test" />
   <file md5sum="7cb65249e81babb2867f7a2afecc2201" name="Symfony/Component/Config/Tests/Loader/DelegatingLoaderTest.php" role="test" />
   <file md5sum="7ea599ca7987b26ebbc49c7a204ed566" name="Symfony/Component/Config/Tests/Loader/FileLoaderTest.php" role="test" />
   <file md5sum="4b52c0a493e0abe0c016757c3b81871f" name="Symfony/Component/Config/Tests/Loader/LoaderResolverTest.php" role="test" />
   <file md5sum="948c42a53d8bad4d6ba2a54c4ec000fd" name="Symfony/Component/Config/Tests/Loader/LoaderTest.php" role="test" />
   <file md5sum="c4027624b5fb8e923b71f4eab6a996d0" name="Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.php" role="test" />
   <file md5sum="e37cf4fd016b4652013a54aed653a90c" name="Symfony/Component/Config/Tests/Resource/FileResourceTest.php" role="test" />
   <file md5sum="aa364fa2a9af8fb8fb396ba173c2b3b3" name="Symfony/Component/Config/Tests/Util/XmlUtilsTest.php" role="test" />
   <file md5sum="b90ce309828aad9fe732e136489b77f6" name="Symfony/Component/Config/Util/XmlUtils.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\Z2�iHH pear/.pkgxml/Pear_Mail-1.4.1.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.3" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Mail</name>
 <channel>pear.php.net</channel>
 <summary>Class that provides multiple interfaces for sending emails</summary>
 <description>PEAR&apos;s Mail package defines an interface for implementing mailers under the PEAR hierarchy.  It also provides supporting functions useful to multiple mailer backends.  Currently supported backends include: PHP&apos;s native mail() function, sendmail, and SMTP.  This package also provides a RFC822 email address list validation utility class.</description>
 <lead>
  <name>Chuck Hagenbuch</name>
  <user>chagenbu</user>
  <email>chuck@horde.org</email>
  <active>no</active>
 </lead>
 <developer>
  <name>Richard Heyes</name>
  <user>richard</user>
  <email>richard@phpguru.org</email>
  <active>no</active>
 </developer>
 <developer>
  <name>Aleksander Machniak</name>
  <user>alec</user>
  <email>alec@alec.pl</email>
  <active>yes</active>
 </developer>
 <date>2017-04-11</date>
 <time>17:26:44</time>
 <version>
  <release>1.4.1</release>
  <api>1.3.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="https://opensource.org/licenses/BSD-3-Clause">New BSD License</license>
 <notes>
* Loosen recognition of &quot;queued as&quot; server response (PR #10)

* Bug #20463: domain-literal parsing error
* Bug #20513: Mail_smtp::send() doesn&apos;t close socket for smtp connection
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="8210c33901d415a2692944291632bf34" name="LICENSE" role="doc" />
   <file baseinstalldir="/" md5sum="4e86cd3b980f73ef320988a1b299ee07" name="Mail/mail.php" role="php" />
   <file baseinstalldir="/" md5sum="360b7b613c98c7703151c50a6e74c367" name="Mail/mock.php" role="php" />
   <file baseinstalldir="/" md5sum="30ce63a4a2c4558b3752b1c302e6e508" name="Mail/null.php" role="php" />
   <file baseinstalldir="/" md5sum="7199f4e7b07919082a804edb8680c811" name="Mail/RFC822.php" role="php" />
   <file baseinstalldir="/" md5sum="5dd0b6ff126608818f44f5866b61b3d0" name="Mail/sendmail.php" role="php" />
   <file baseinstalldir="/" md5sum="1d236356d52f3dfa13b740a48a821586" name="Mail/smtp.php" role="php" />
   <file baseinstalldir="/" md5sum="853b55cf4803df8caaaa0dca363971ff" name="Mail/smtpmx.php" role="php" />
   <file baseinstalldir="/" md5sum="3077f0c01f72cc29a6f8f0175e7fc8a7" name="Mail.php" role="php" />
   <file baseinstalldir="/" md5sum="d66aa2a2f0bfe33f8a67d749a1a4d345" name="tests/9137.phpt" role="test" />
   <file baseinstalldir="/" md5sum="75d10361f686f1cc16637a9364e3eab7" name="tests/9137_2.phpt" role="test" />
   <file baseinstalldir="/" md5sum="63715aad2b5b3ae35c6b05acf04d9ad7" name="tests/13659.phpt" role="test" />
   <file baseinstalldir="/" md5sum="e99f00d8f07232e0f129dd77ae9699c7" name="tests/bug17178.phpt" role="test" />
   <file baseinstalldir="/" md5sum="c2036980390981cd6b89c1e5c903913e" name="tests/bug17317.phpt" role="test" />
   <file baseinstalldir="/" md5sum="7b0eae971fe7595e7c1a563fbfcfee90" name="tests/rfc822.phpt" role="test" />
   <file baseinstalldir="/" md5sum="67becdb1027cefcb8dff1b691da630ab" name="tests/smtp_error.phpt" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.2.1</min>
   </php>
   <pearinstaller>
    <min>1.5.6</min>
   </pearinstaller>
  </required>
  <optional>
   <package>
    <name>Net_SMTP</name>
    <channel>pear.php.net</channel>
    <min>1.4.1</min>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\�3�--1pear/.pkgxml/Pear_Structures_LinkedList-0.2.2.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.0" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Structures_LinkedList</name>
 <channel>pear.php.net</channel>
 <summary>Implements singly and doubly-linked lists</summary>
 <description>A singly-linked list offers the ability to insert or delete
 nodes at any point within the list. A doubly-linked list also offers the
 ability to request previous nodes in the list.</description>
 <lead>
  <name>Dan Scott</name>
  <user>dbs</user>
  <email>dbs@php.net</email>
  <active>yes</active>
 </lead>
 <date>2010-08-15</date>
 <time>10:13:00</time>
 <version>
  <release>0.2.2</release>
  <api>0.2.0</api>
 </version>
 <stability>
  <release>beta</release>
  <api>beta</api>
 </stability>
 <license uri="http://apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</license>
 <notes>
* Fix package layout
 </notes>
 <contents>
  <dir baseinstalldir="Structures/LinkedList" name="/">
   <file baseinstalldir="/" md5sum="b7ac5a9d6d9a3eb2c3cbb1db76ad75a3" name="Structures/LinkedList/Double.php" role="php" />
   <file baseinstalldir="/" md5sum="310eefdff99016e4a3282dd02d5a7efa" name="Structures/LinkedList/Single.php" role="php" />
   <file baseinstalldir="Structures/LinkedList" md5sum="9b1565a45687bb631a452b152e0d3d15" name="examples/double_link_example.php" role="doc" />
   <file baseinstalldir="Structures/LinkedList" md5sum="56d8c9a65cf967f09136a1b5b42fb787" name="examples/single_link_example.php" role="doc" />
   <file baseinstalldir="Structures/LinkedList" md5sum="54a63c64625c0b1785d890cc0ecb6957" name="tests/LinkTester.php" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="6138a89189609d8b0c35a69ce6995457" name="tests/SingleLinkTester.php" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="c7a6ad89f79222cf62148893e88a0b5a" name="tests/link_001.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="960408b3ea85cfe453f7d4b1814784ea" name="tests/link_002.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="392d4c38523f764091433fdf19cf4943" name="tests/link_003.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="88bfd20fe97800c4f69ec7577abd2ecd" name="tests/link_004.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="dac8403b1df9d64e16e45e87121a74fa" name="tests/link_005.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="bfc84666dbe64008101adadecf008677" name="tests/link_006.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="1a7eb8c8a63ec97fdb0154214c679cfa" name="tests/link_007.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="86f0c12acf2706a82d0d0dc625ab3608" name="tests/single_link_001.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="19c3e9b406dffe9c315e0264e0d257f8" name="tests/single_link_002.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="d4029576a49c41f18c35f72bdb37da7e" name="tests/single_link_003.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="574cb63523d7716f37fad368eefc695b" name="tests/single_link_004.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="4712a8421da2369e72ec789e0fe3993f" name="tests/single_link_005.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="a7f31515a9a3260aa1c17e003a4c352c" name="tests/single_link_006.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="6fe94be57c862475367ed91a7284a6b2" name="tests/single_link_007.phpt" role="test" />
   <file baseinstalldir="Structures/LinkedList" md5sum="6e8edc55d5a37acbe96ed9860b8680cc" name="CHANGELOG" role="doc" />
   <file baseinstalldir="Structures/LinkedList" md5sum="3b83ef96387f14655fc854ddc3c6bd57" name="LICENSE" role="doc" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.0</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\s�YY'pear/.pkgxml/Symfony2_Process-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Process</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Process Component</summary>
 <description>Symfony2 Process Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:48</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="d39ea12d1764b05af5e85dae2c48c793" name="Symfony/Component/Process/autoloader.php" role="php" />
   <file md5sum="1c079058bd8ecb9a361d7d315fb5e5ae" name="Symfony/Component/Process/CHANGELOG.md" role="doc" />
   <file md5sum="bf954605bb40623c26cfca6fdc344c5e" name="Symfony/Component/Process/composer.json" role="doc" />
   <file md5sum="723a4615b94a21c979c9cfe85d81e50a" name="Symfony/Component/Process/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="b3c8598f88e6ac643dda6cb6f29fb3ba" name="Symfony/Component/Process/Exception/InvalidArgumentException.php" role="php" />
   <file md5sum="72ef3efed027815b107a71f4e987754d" name="Symfony/Component/Process/Exception/LogicException.php" role="php" />
   <file md5sum="7726c705c207d8bd0455597b19f5e035" name="Symfony/Component/Process/Exception/ProcessFailedException.php" role="php" />
   <file md5sum="da8b86018e9365453290e986630fdac9" name="Symfony/Component/Process/Exception/ProcessTimedOutException.php" role="php" />
   <file md5sum="5173fb5053527af7b83077085b192d67" name="Symfony/Component/Process/Exception/RuntimeException.php" role="php" />
   <file md5sum="ec007221c50ca2fa099de00cc14d95f8" name="Symfony/Component/Process/ExecutableFinder.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Process/LICENSE" role="doc" />
   <file md5sum="fba1a6b8ff2371258f20c316c3aee410" name="Symfony/Component/Process/PhpExecutableFinder.php" role="php" />
   <file md5sum="2218c2a825f09243ab31c4194dc71ac8" name="Symfony/Component/Process/PhpProcess.php" role="php" />
   <file md5sum="38416969b8bd90a8627afbdea4d56fbb" name="Symfony/Component/Process/phpunit.xml.dist" role="test" />
   <file md5sum="d6a4515f04d6a7095c32c8becf869ea2" name="Symfony/Component/Process/Process.php" role="php" />
   <file md5sum="22a24c881ccc2a334cb39f3406386ab4" name="Symfony/Component/Process/ProcessBuilder.php" role="php" />
   <file md5sum="9170706e98976ed4b63ec5496e553454" name="Symfony/Component/Process/ProcessPipes.php" role="php" />
   <file md5sum="e656122ad88214d14d5fb0da26038958" name="Symfony/Component/Process/ProcessUtils.php" role="php" />
   <file md5sum="f2d4849606123482d1ee255038021f68" name="Symfony/Component/Process/README.md" role="doc" />
   <file md5sum="8c50bc22c7ee63d0b781721e49cd29f3" name="Symfony/Component/Process/Tests/AbstractProcessTest.php" role="test" />
   <file md5sum="536f711e6e2aa61bf065b29e8631825f" name="Symfony/Component/Process/Tests/NonStopableProcess.php" role="test" />
   <file md5sum="7f5014eeb10fe782977f36a0a363b339" name="Symfony/Component/Process/Tests/PhpExecutableFinderTest.php" role="test" />
   <file md5sum="5636117b645854523f4e49119e05286a" name="Symfony/Component/Process/Tests/PhpProcessTest.php" role="test" />
   <file md5sum="4bb65137b612922b87bae61f12ddaa93" name="Symfony/Component/Process/Tests/PipeStdinInStdoutStdErrStreamSelect.php" role="test" />
   <file md5sum="841d9ebee0e41be0280387ae00485d31" name="Symfony/Component/Process/Tests/ProcessBuilderTest.php" role="test" />
   <file md5sum="548e570239c6a450fba22a768ada8542" name="Symfony/Component/Process/Tests/ProcessFailedExceptionTest.php" role="test" />
   <file md5sum="fadee2df6610863207b16c6077b5c282" name="Symfony/Component/Process/Tests/ProcessInSigchildEnvironment.php" role="test" />
   <file md5sum="2afe80bbab70e5a8badccebb32021372" name="Symfony/Component/Process/Tests/ProcessUtilsTest.php" role="test" />
   <file md5sum="00f0e0d73858eae9e670635a5c0d66f6" name="Symfony/Component/Process/Tests/SigchildDisabledProcessTest.php" role="test" />
   <file md5sum="c3d833e3cc8e7545bfaefff2d369b07b" name="Symfony/Component/Process/Tests/SigchildEnabledProcessTest.php" role="test" />
   <file md5sum="b75bfa6a7dfd6efbc39a5f7f870fa64c" name="Symfony/Component/Process/Tests/SignalListener.php" role="test" />
   <file md5sum="8d952eb9a5f29bc454a9263a38453feb" name="Symfony/Component/Process/Tests/SimpleProcessTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\�/�h����'pear/.pkgxml/Pear_Mail_Mime-1.10.11.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.12" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd             http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Mail_Mime</name>
 <channel>pear.php.net</channel>
 <summary>Mail_Mime provides classes to create MIME messages.</summary>
 <description>Mail_Mime provides classes to deal with the creation and manipulation of MIME messages.
It allows people to create e-mail messages consisting of:
* Text Parts
* HTML Parts
* Inline HTML Images
* Attachments
* Attached messages

It supports big messages, base64 and quoted-printable encodings and
non-ASCII characters in filenames, subjects, recipients, etc. encoded
using RFC2047 and/or RFC2231.</description>
 <lead>
  <name>Cipriano Groenendal</name>
  <user>cipri</user>
  <email>cipri@php.net</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Aleksander Machniak</name>
  <user>alec</user>
  <email>alec@php.net</email>
  <active>yes</active>
 </lead>
 <date>2021-09-05</date>
 <time>08:43:21</time>
 <version>
  <release>1.10.11</release>
  <api>1.10.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
 <notes>
* Fix PHP 8.1: strlen(): Passing null to parameter #1 ($string) of type string is deprecated [alec]
* Fix encoding recipient names with @ character and no space between name and address [alec]
* Fix the license label in composer.json [jnkowa-gfk]
 </notes>
 <contents>
  <dir name="/">
   <file baseinstalldir="Mail" md5sum="edd138f6c5497ae2b5d63620a67a931e" name="tests/class-filename.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="7ec986391d0af058316f66e5a507e059" name="tests/content_transfer_encoding.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="c1a43360d9b2cb5f9542503a4355c277" name="tests/encoding_case.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="bf50a200190cad5e2d4aae4e120ea09f" name="tests/headers_with_mbstring.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="9a2d207f873317125ff43c092f3f0d25" name="tests/headers_without_mbstring.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="25d4c5b9fdeaabc7810c26e6f89e95ca" name="tests/qp_encoding_test.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="958197f31b4a20c91dd42662595e7516" name="tests/sleep_wakeup_EOL-bug3488-part1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="46675529f1f021b51a1aa0ae6c971cd2" name="tests/sleep_wakeup_EOL-bug3488-part2.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="f8c05910737e451c7a9d4737b8d9f095" name="tests/test_Bug_3513_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="edb467a375ddf09e777a9388e2e8cbb5" name="tests/test_Bug_3513_2.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="70c2456445eaaa80779206e9e245d685" name="tests/test_Bug_3513_3.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="4cda500d0d7925e81a299f1d3db132a9" name="tests/test_Bug_7561_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="42a214e7e3d3afa07f8996b235222611" name="tests/test_Bug_8386_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="ed78099563499f60386a128cb7b96925" name="tests/test_Bug_8541_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="5250a0693599b945e8642a1a289d7275" name="tests/test_Bug_9722_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b7f58f54e1485c23a60c83cd3cc5563e" name="tests/test_Bug_10596_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="ccb53d80e7f5c9f28b11abce5fe5d490" name="tests/test_Bug_10816_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="f3d92a1fff099173b8600fb3646d0614" name="tests/test_Bug_10999_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="3f2757d5db43abd8f177f094f4d53625" name="tests/test_Bug_11381.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="c64d675e73bc02fc94f5d03b3117cfa0" name="tests/test_Bug_11731.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="8c9305ca05f5ed2d7cd7e31e4836f17a" name="tests/test_Bug_12165.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="2aa2c3dfbe44500809e79da994272611" name="tests/test_Bug_12385_1.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="ef1d726233dbd3360c540fd6a959b0d0" name="tests/test_Bug_12411.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="a862a57ff622fcbb2328be6c805e2d05" name="tests/test_Bug_12466.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="4eddeeac08f351feb147ab6fda439526" name="tests/test_Bug_13032.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="de15a0657a83694bc6991c4184ccf9bd" name="tests/test_Bug_13444.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="80afe9fced03288884e9d302d1e65b2d" name="tests/test_Bug_13962.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="89bf87e798f4a149a150d4c2a505f976" name="tests/test_Bug_14529.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="5f9100adb1c609110ed495fafa819975" name="tests/test_Bug_14779.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="45eb42fe4e325da64f1ae8f149e2a396" name="tests/test_Bug_14780.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="609dad2083c54ba56ea691c488ca20e2" name="tests/test_Bug_15320.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="f4ef08e416e775558e8075b531bbc814" name="tests/test_Bug_16539.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="ed1bd0fc9067b3fb8b95808bfa315916" name="tests/test_Bug_17025.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="8a37de74fb39fed4566617a7ea38bb69" name="tests/test_Bug_17175.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b9dee3c7c45d8c6c22f860e93c3769b9" name="tests/test_Bug_18083.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="96ce23ad1a1d6417facfcdd2baa9c8eb" name="tests/test_Bug_18772.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="dd98307b3224b173f7b54f7e403865a4" name="tests/test_Bug_19497.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="e1194180cb6a218fab69db90f88d1cb2" name="tests/test_Bug_20226.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="1b7919174edcd1cf5d5fd5a622fdac9b" name="tests/test_Bug_20273.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="6513c4b0c9e962c900d020124752333e" name="tests/test_Bug_20563.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="7c7a00818cb0f01fa6c52c920b9e76c6" name="tests/test_Bug_20564.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b9e31a9c24b05dfb6166512e04e2f056" name="tests/test_Bug_21027.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b634a5e99aa26a8b6df8fcfae07051b4" name="tests/test_Bug_21098.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b21be5b099a69428bd37e60589cdd485" name="tests/test_Bug_21205.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="bc152c12839964fba15da5673d25c4db" name="tests/test_Bug_21206.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="ccf732525be42c955eea18e78490c3e1" name="tests/test_Bug_21255.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="579f1e11da6c8074dbf508dc1f1dedfa" name="tests/test_Bug_GH16.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="df32d66d9fccf7a0956422811283272a" name="tests/test_Bug_GH19.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="b7b5b5bacc6a599cfaece35ad202ad1a" name="tests/test_Bug_GH26.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="e08958f1bb60561f072a3508b8fd3e2e" name="tests/test_linebreak_dot.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="8398e9bfea0bc7c4ff0770ae3d6279fe" name="tests/test_linebreak_larger_76.phpt" role="test" />
   <file baseinstalldir="/" md5sum="e5c9ac7f32e53afdeafd1a84343a89ae" name="Mail/mime.php" role="php" />
   <file baseinstalldir="/" md5sum="36128789ad1101d39d13b06ca2585576" name="Mail/mimePart.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.2.0</min>
   </php>
   <pearinstaller>
    <min>1.6.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>1.0</release>
    <api>1.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2001-12-28</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
This is the initial release of the Mime_Mail package.
   </notes>
  </release>
  <release>
   <version>
    <release>1.1</release>
    <api>1.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2002-04-03</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
This is a maintenance release with various bugfixes and minor enhancements.
   </notes>
  </release>
  <release>
   <version>
    <release>1.2</release>
    <api>1.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2002-07-14</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
* Added header encoding
* Altered mimePart to put boundary parameter on newline
* Changed addFrom() to setFrom()
* Added setSubject()
* Made mimePart inherit crlf setting from mime
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.1</release>
    <api>1.2.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2002-07-27</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
* License change
* Applied a few changes From Ilia Alshanetsky
   </notes>
  </release>
  <release>
   <version>
    <release>1.3.0RC1</release>
    <api>1.3.0RC1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2005-03-20</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
* First release in over 2.5 years (!)
* MANY bugfixes (see the bugtracker)
* added a few tests
   </notes>
  </release>
  <release>
   <version>
    <release>1.3.0</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2005-04-01</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
* First (stable) release in over 2.5 years (!)
* MANY bugfixes (see the bugtracker)
* added a few tests
* one small fix after RC1 (bug #3940)
   </notes>
  </release>
  <release>
   <version>
    <release>1.3.1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2005-07-13</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>

   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0a1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>stable</api>
   </stability>
   <date>2007-03-08</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Changed License to BSD Style license, as that&apos;s what the code was since the beginning [cipri]
* Fix Bug #30: Mail_Mime: _encodeHeaders is not RFC-2047 compliant. [cipri]
* Fix Bug #3513: support of RFC2231 in header fields. [cipri]
* Fix Bug #4696: addAttachment crash [cipri]
* Fix Bug #5333: Only variables should be returned by reference; triggers notices since php 4.4.0 [cipri]
* Fix Bug #7561: Mail_mimePart::_quotedPrintableEncode() misbehavior with mbstring overload [cipri]
* Fix Bug #8223: Incorrectly encoded quoted-printable headers [cipri]
* Fix Bug #8386: HTML body not correctly encoded if attachments present [cipri]
* Fix Bug #8541: mimePart.php line delimiter is \r [cipri]
* Fix Bug #9347: Notices about references [cweiske]
* Fix Bug #9558: Broken multiline headers [cipri]
* Fix Bug #9956: Notices being thrown [cipri]
* Fix Bug #9976: Subject encoded twice [cipri]
* Implement Feature #2952: Mail_mime::headers() saves extra headers [cipri]
* Implement Feature #3636: Allow specification of charsets and encoding [cipri]
* Implement Feature #4057: Mail_Mime: Add name parameter for Content-Type [cipri]
* Implement Feature #4504: addHTMLImage does not work in cases when filename contains a path [cipri]
* Implement Feature #5837: Mail_Mime: Build message for Net_SMTP [cipri]
* Implement Feature #5934: Mail_Mime: choice for content disposition [cipri]
* Implement Feature #6568: Mail_Mime: inline images referenced in CSS definitions not replaced. [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0a2</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>stable</api>
   </stability>
   <date>2007-04-05</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #9722: _quotedPrintableEncode does not encode dot at start of line on Windows
  platform [cipri]
* Fix Bug #9725: multipart/related &amp; alternative wrong order [cipri]
* Fix Bug #10146: mbstring fails to recognize encodings. [cipri]
* Fix Bug #10158: Inline images not displayed on Mozilla Thunderbird [cipri]
* Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
* Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
* Fix Bug #10596: Incorrect handling of text and html &apos;0&apos; bodies [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0a3</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>stable</api>
   </stability>
   <date>2007-04-05</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
* Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0RC1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-04-12</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #10232: Gmail creates double line break when \r\n is used [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0RC2</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-04-22</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #10791: Unit tests fail [cipri]
* Fix Bug #10792: No unit tests for recently fixed bugs [cipri]
* Fix Bug #10793: Long headers don&apos;t get wrapped since fix for Bug #10298 [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0RC3</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-04-24</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #10816: Unwanted linebreak at the end of output [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0RC4</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-04-28</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
   <notes>
* Fix Bug #3513: support of RFC2231 in header fields. [cipri]
* Fix Bug #10838: bad use of MIME encoding in header. [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2007-05-05</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Release notes:
 * No more notices in PHP 5 /4.4.0.
 * Improved inline HTML image function.
 * Improved header encoding with foreign charsets.
 * Improved long header rendering.
 * More control over used Charsets and encoding schemes.
 * More configurable attachments and inline images.
 * Full RFC 2047 Support
 * Full RFC 2231 Support
 * Unit-tests

Fixed bugs:
 * Fix Bug #30: Mail_Mime: _encodeHeaders is not RFC-2047 compliant. [cipri]
 * Fix Bug #3513: support of RFC2231 in header fields. [cipri]
 * Fix Bug #4696: addAttachment crash [cipri]
 * Fix Bug #5333: Only variables should be returned by reference; triggers notices since
   php 4.4.0 [cipri]
 * Fix Bug #5400: Do not return function reference [cipri]
 * Fix Bug #5710: Little reference bugs [cipri]
 * Fix Bug #5890: Only variable references should be returned by reference [cipri]
 * Fix Bug #6260: Just a notice with PHP5 [cipri]
 * Fix Bug #6261: php 5.1.1 upgrade [cipri]
 * Fix Bug #6663: Notice about reference passing [cipri]
 * Fix Bug #7561: Mail_mimePart::_quotedPrintableEncode() misbehavior with mbstring
   overload [cipri]
 * Fix Bug #7713: PHP5 Notice: Only variable references should be returned by reference [cipri]
 * Fix Bug #8223: Incorrectly encoded quoted-printable headers [cipri]
 * Fix Bug #8386: HTML body not correctly encoded if attachments present [cipri]
 * Fix Bug #8541: mimePart.php line delimiter is \r [cipri]
 * Fix Bug #8812: user header updates overwritten [cipri]
 * Fix Bug #9347: Notices about references [cweiske]
 * Fix Bug #9558: Broken multiline headers [cipri]
 * Fix Bug #9722: _quotedPrintableEncode does not encode dot at start of line on Windows
   platform [cipri]
 * Fix Bug #9725: multipart/related &amp; alternative wrong order [cipri]
 * Fix Bug #9956: Notices being thrown [cipri]
 * Fix Bug #9976: Subject encoded twice [cipri]
 * Fix Bug #10146: mbstring fails to recognize encodings. [cipri]
 * Fix Bug #10158: Inline images not displayed on Mozilla Thunderbird [cipri]
 * Fix Bug #10232: Gmail creates double line break when \r\n is used [cipri]
 * Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
 * Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
 * Fix Bug #10596: Incorrect handling of text and html &apos;0&apos; bodies [cipri]
 * Fix Bug #10791: Unit tests fail [cipri]
 * Fix Bug #10792: No unit tests for recently fixed bugs [cipri]
 * Fix Bug #10793: Long headers don&apos;t get wrapped since fix for Bug #10298 [cipri]
 * Fix Bug #10816: Unwanted linebreak at the end of output [cipri]
 * Fix Bug #10838: bad use of MIME encoding in header. [cipri]
Implemented Features:
 * Implement Feature #2952: Mail_mime::headers() saves extra headers [cipri]
 * Implement Feature #3636: Allow specification of charsets and encoding [cipri]
 * Implement Feature #4057: Mail_Mime: Add name parameter for Content-Type [cipri]
 * Implement Feature #4504: addHTMLImage does not work in cases when filename contains a path [cipri]
 * Implement Feature #5837: Mail_Mime: Build message for Net_SMTP [cipri]
 * Implement Feature #5934: Mail_Mime: choice for content disposition [cipri]
 * Implement Feature #6568: Mail_Mime: inline images referenced in CSS definitions not replaced. [cipri]
 * Implement Feature #10604: Put an option to specify Content-Location in the header [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.0a1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>stable</api>
   </stability>
   <date>2007-06-10</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Split off mail_MimeDecode
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.0RC1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-06-10</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Split off mail_MimeDecode
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.0</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2007-06-17</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Split off Mail_MimeDecode
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2007-06-20</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix Bug #11344: Error at line 644 in mime.php [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.2</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2007-06-21</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix Bug #11381: domain name is attached to content-id, trailing greater-than sign is
  not remove [cipri]
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.3</release>
    <api>1.3.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2009-12-29</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Fixed bugs:
 * Fix Bug #14678: srand() lowers security [clockwerx]
 * Fix Bug #12921: _file2str not binary safe [walter]
 * Fix Bug #12385: Bad regex when replacing css style attachments [cipri]
 * Fix Bug #16911: Excessive semicolon in MIME header [alec]
 * Fix Bug #15320: Attachment charset is not set in Content-Type header [alec]
 * Fix Bug #16911: Lack of semicolon separator for MIME header parameters [alec]
 * Fix Bug #16846: Use preg_replace_callback() instead of /e modifier [alec]
 * Fix Bug #14779: Problem with an empty attachment [alec]
 * Fix Bug #15913: Optimize the memory used by Mail_mimePart::encode.
                   Avoid having attachments data duplicated in memory [alec]
 * Fix Bug #16539: Headers longer than 998 characters aren&apos;t wrapped [alec]
 * Fix Bug #11238: Wrong encoding of structured headers [alec]
 * Fix Bug #13641: iconv_mime_encode() seems to work different/errorious than
                   the build in logic. Removed &apos;ignore_iconv&apos; param.  [alec]
 * Fix Bug #16706: Incorrect double-quotes RFC 2231-encoded parameter values [alec]
 * Fix Bug #14232: RFC2231: tspecials encoding in _buildHeaderParam() [alec]
Implemented Features:
 * Implement Feature #10438: Function (encodeHeader) for encoding of given header [alec]
   </notes>
  </release>
  <release>
   <version>
    <release>1.6.0</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-01-27</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * Don&apos;t break specified headers folding [alec]
 * Bug #17025: Wrong headers() result for long unwrapable header value [alec]

Implemented Features:
 * Allow setting Content-ID for HTML Images [alec]
 * Added one setParam() in place of many set*() functions [alec]
 * Added getParam(), getTXTBody(), getHTMLBody() [alec]
 * Skip RFC2231&apos;s charset if filename contains only ASCII characters [alec]
 * Make sure that Received: headers are returned on the top [alec]
 * Added saveMessageBody() and getMessageBody() functions [alec]
   </notes>
  </release>
  <release>
   <version>
    <release>1.6.1</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-03-08</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * Fix encoding of Return-Receipt-To and Disposition-Notification-To headers [alec]

Implemented Features:
 * Implement Feature #12466: Build parameters validation [alec]
 * Implement Feature #17175: Content-Description support for attachments [alec]
   </notes>
  </release>
  <release>
   <version>
    <release>1.6.2</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-03-23</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * Fix Bug #17226: Non RFC-compliant quoted-printable encoding of structured headers [alec]
   </notes>
  </release>
  <release>
   <version>
    <release>1.7.0</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-04-12</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Implemented Features:
 * Added Mail_mime::setContentType() function with possibility to set various
   types in Content-Type header (also fixes problem with boundary parameter when Content-Type
   header was specified by user) [alec]
   </notes>
  </release>
  <release>
   <date>2010-07-29</date>
   <version>
    <release>1.8.0</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * Double-addition of e-mail domain to content ID in HTML images [alec]
 * #17311: Multi-octet characters are split across adjacent &apos;encoded-word&apos;s [alec]
 * #17573: Place charset parameter in first line of Content-Type header (if possible) [alec]
Implemented Features:
 * #17518: addTo() method [alec]
   </notes>
  </release>
  <release>
   <date>2010-12-01</date>
   <version>
    <release>1.8.1</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * #18083: Not possible to set separate charset for attachment content and headers [alec]
   </notes>
  </release>
  <release>
   <date>2011-08-10</date>
   <version>
    <release>1.8.2</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Bugs Fixed:
 * #18426: Fixed backward compatibility for &quot;dfilename&quot; parameter [alec]
 * Removed xmail.dtd, xmail.xsl from the package [alec]
 * Fixed handling of email addresses with quoted local part [alec]
   </notes>
  </release>
  <release>
   <date>2012-03-12</date>
   <version>
    <release>1.8.3</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Request #19009: Remove error_reporting from tests [alec]
* Fixed Bug #19094: Email addresses do not have to contain a space between the name and address part [alec]
* Fixed Bug #19328: Wrong encoding of filenames with comma [alec]
   </notes>
  </release>
  <release>
   <date>2012-05-17</date>
   <version>
    <release>1.8.4</release>
    <api>1.4.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Request #19406: Allow to set individual attachment part headers [alec]
* Fixed Bug #18982: Non-static method Mail_mimePart::encodeHeader() should not be called statically [alec]
   </notes>
  </release>
  <release>
   <date>2012-06-09</date>
   <version>
    <release>1.8.5</release>
    <api>1.4.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Added possibility to set additional parameters of message part header, e.g. attachment size [alec]
* Added automatic setting of attachment size via Content-Disposition header size parameter [alec]
   </notes>
  </release>
  <release>
   <date>2012-10-23</date>
   <version>
    <release>1.8.6</release>
    <api>1.4.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Bug #19473: PEAR::isError() compatibility problem with PHP 5.4 [alec]
* Bug #19497: Attachment filename is cut on slash character [alec]
* Bug #19665: Add Mail-Reply-To and Mail-Followup-To to structured recipient headers list [alec]
   </notes>
  </release>
  <release>
   <date>2012-12-25</date>
   <version>
    <release>1.8.7</release>
    <api>1.4.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Bug #5333: Fix more return by reference errors [alec]
* Bug #19754: Fix compatibility with PHP4 [alec]
   </notes>
  </release>
  <release>
   <date>2013-07-05</date>
   <version>
    <release>1.8.8</release>
    <api>1.4.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fixed warning/notice on (static vs. non-static) PEAR::raiseError() usage [alec]
* Fixed Bug #19761: PHP5 warnings about return by reference [alec]
* Fixed Bug #19770: Make cid generator more unique on Windows [alec]
* Fixed Bug #19987: E_STRICT warning when null is passed by reference [alec]
   </notes>
  </release>
  <release>
   <date>2014-05-14</date>
   <version>
    <release>1.8.9</release>
    <api>1.4.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fixed Bug #20273: Incorrect handling of HTAB in encodeHeader() [alec]
* Fixed Bug #20226: Mail_mimePart::encodeHeader does not encode ISO-2022-JP string [alec]
* Fixed Bug #20222: Broken Compatybility with PHP4 [alec]
   </notes>
  </release>
  <release>
   <date>2015-07-05</date>
   <time>12:50:00</time>
   <version>
    <release>1.9.0RC1</release>
    <api>2.0.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Drop PHP4 support, Fix warnings on PHP7 [alec]
* Request #20564: Added possibility to unset headers [alec]
* Request #20563: Added isMultipart() method [alec]
* Request #20565: Accept also a file pointer in Mail_mimePart::encodeToFile(),
                  Mail_mime::get() and Mail_mime::saveMessageBody() [alec]
   </notes>
  </release>
  <release>
   <date>2015-08-06</date>
   <time>12:00:00</time>
   <version>
    <release>1.9.0</release>
    <api>1.9.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Bug #20921: Make Mail_mimePart::encodeHeaderValue() a static method [alec]
* Bug #20931: Really remove unset headers [alec]
* Request #18772: Added methods for creating text/calendar messages [alec]
   </notes>
  </release>
  <release>
   <date>2015-09-13</date>
   <time>12:00:00</time>
   <version>
    <release>1.10.0</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Add possibility to add externally created Mail_mimePart objects as attachments [alec]
* Add possibility to set preamble text for multipart messages [alec]
   </notes>
  </release>
  <release>
   <date>2017-05-21</date>
   <time>12:00:00</time>
   <version>
    <release>1.10.1</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix Bug 21206: explodeQuotedString() does not handle quoted strings correctly [dfukagaw28]
* Fix Bug 21205: Invalid encoding of headers with quoted multibyte strings in non-unicode charset [dfukagaw28]
* Fix Bug 21098: Discrepancy in handling of empty (but set) plain text part [alec]
   </notes>
  </release>
  <release>
   <date>2017-11-17</date>
   <time>11:00:00</time>
   <version>
    <release>1.10.2</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix Bug #21255: Boundary gets added twice when using setContentType() [alec]
* PHP 7.2 compatibility fixes [alec]
   </notes>
  </release>
  <release>
   <date>2019-09-25</date>
   <time>08:00:00</time>
   <version>
    <release>1.10.3</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix deprecation warning for get_magic_quotes_runtime() use on PHP 7.4 [alec]
   </notes>
  </release>
  <release>
   <date>2019-10-13</date>
   <time>11:00:00</time>
   <version>
    <release>1.10.4</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix E_STRICT errors introduced in the previous release [alec]
   </notes>
  </release>
  <release>
   <date>2020-01-24</date>
   <time>19:00:00</time>
   <version>
    <release>1.10.5</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Make sure to not set Content-Transfer-Encoding on multipart messages [alec]
* Added support for calendar invitations with attachments/html/images [jacalben]
   </notes>
  </release>
  <release>
   <date>2020-01-30</date>
   <time>08:25:00</time>
   <version>
    <release>1.10.6</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix different boundary in headers and body when using headers() after get() [alec]
* Removed phail.php script [alec]
   </notes>
  </release>
  <release>
   <date>2020-03-01</date>
   <time>08:50:00</time>
   <version>
    <release>1.10.7</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix invalid Content-Type for messages with only html part and inline images [alec]
   </notes>
  </release>
  <release>
   <date>2020-06-13</date>
   <time>08:50:00</time>
   <version>
    <release>1.10.8</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Fix encoding issues with ISO-2022-JP-MS input labelled with ISO-2022-JP [shirosaki]
   </notes>
  </release>
  <release>
   <date>2020-06-27</date>
   <time>10:30:00</time>
   <version>
    <release>1.10.9</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Added a workaround for an opcache bug on OpenSuse 15.1 [alec]
   </notes>
  </release>
  <release>
   <date>2021-01-17</date>
   <time>09:25:00</time>
   <version>
    <release>1.10.10</release>
    <api>1.10.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
* Compatibility fixes for PHP 5.2 and 5.3 [alec]
* Corrected soft line breaks handling to be RFC compliant [ixs]
* Corrected line breaks for lines ending in dots and length more than 74 [ixs]
   </notes>
  </release>
 </changelog>
</package>
PK�^�\z�WzDD%pear/.pkgxml/Pear_Net_IDNA2-0.2.0.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.3" version="2.0" xmlns="https://pear.php.net/dtd/package-2.0" xmlns:tasks="https://pear.php.net/dtd/tasks-1.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://pear.php.net/dtd/tasks-1.0 https://pear.php.net/dtd/tasks-1.0.xsd https://pear.php.net/dtd/package-2.0 https://pear.php.net/dtd/package-2.0.xsd">
 <name>Net_IDNA2</name>
 <channel>pear.php.net</channel>
 <summary>Punycode encoding and decoding.</summary>
 <description>This package helps you to encode and decode punycode strings easily.</description>
 <lead>
  <name>Stefan Neufeind</name>
  <user>neufeind</user>
  <email>pear.neufeind@speedpartner.de</email>
  <active>yes</active>
 </lead>
 <lead>
  <name>Daniel O&apos;Connor</name>
  <user>doconnor</user>
  <email>daniel.oconnor@gmail.com</email>
  <active>no</active>
 </lead>
 <date>2017-03-06</date>
 <time>20:40:58</time>
 <version>
  <release>0.2.0</release>
  <api>0.2.0</api>
 </version>
 <stability>
  <release>beta</release>
  <api>beta</api>
 </stability>
 <license uri="https://www.gnu.org/copyleft/lesser.html">LGPL</license>
 <notes>
* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Bug #19375: Add static to the fuction getInstance
* Bug #21123: Signing the source package
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="41766020ff8f63f695c9bf7e86040e70" name="Net/IDNA2.php" role="php" />
   <file baseinstalldir="/" md5sum="72f605f2f6d9d56e07bb6bcec099d03a" name="Net/IDNA2/Exception.php" role="php" />
   <file baseinstalldir="/" md5sum="06c4217024082f0f3b6c5a7e61ac7130" name="Net/IDNA2/Exception/Nameprep.php" role="php" />
   <file baseinstalldir="/" md5sum="999210e6bd489aba06e5121a2788956f" name="tests/Net_IDNA2Test.php" role="test" />
   <file baseinstalldir="/" md5sum="2996ea57df9e5e3153da8a94fbb3c603" name="tests/draft-josefsson-idn-test-vectors.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.4.0</min>
   </php>
   <pearinstaller>
    <min>1.10.1</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>0.1.0</release>
    <api>0.1.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2010-06-03</date>
   <license uri="https://www.gnu.org/copyleft/lesser.html">LGPL</license>
   <notes>
QA Release
Bug #17430 	Multiple Net_IDNA class declarations
Warning: This package is now split between Net_IDNA (php4) and Net_IDNA2 (php5)
   </notes>
  </release>
  <release>
   <version>
    <release>0.2.0</release>
    <api>0.2.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2017-03-06</date>
   <license uri="https://www.gnu.org/copyleft/lesser.html">LGPL</license>
   <notes>
* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Bug #19375: Add static to the fuction getInstance
* Bug #21123: Signing the source package
   </notes>
  </release>
 </changelog>
</package>
PK�^�\�|g��)pear/.pkgxml/Symfony2_Validator-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Validator</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Validator Component</summary>
 <description>Symfony2 Validator Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:51</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="70881b5188a71a54eaaa5174d35b8a7d" name="Symfony/Component/Validator/autoloader.php" role="php" />
   <file md5sum="460bbf634d57fb9eb81d53f051e8ab23" name="Symfony/Component/Validator/CHANGELOG.md" role="doc" />
   <file md5sum="9b310a8a94f594586e92f197f9c2b271" name="Symfony/Component/Validator/ClassBasedInterface.php" role="php" />
   <file md5sum="3af3b2a12af30fa1161d400c5fa160db" name="Symfony/Component/Validator/composer.json" role="doc" />
   <file md5sum="4673b9af925a35c9c4bed05edab5facb" name="Symfony/Component/Validator/Constraint.php" role="php" />
   <file md5sum="8aa49d6a48f577e0f496ed051e1e3e35" name="Symfony/Component/Validator/Constraints/AbstractComparison.php" role="php" />
   <file md5sum="cd63ee91f580c33ed3e5027672c447cf" name="Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php" role="php" />
   <file md5sum="81fa182a1f3260d61a45e0c9a886300a" name="Symfony/Component/Validator/Constraints/All.php" role="php" />
   <file md5sum="76ee8f2dd2d0a1ff7329ddd7f4e812a8" name="Symfony/Component/Validator/Constraints/AllValidator.php" role="php" />
   <file md5sum="77b52c16bd1289663a73f66f39190eed" name="Symfony/Component/Validator/Constraints/Blank.php" role="php" />
   <file md5sum="6bf52b86aeb6e4b7e762994e61b30656" name="Symfony/Component/Validator/Constraints/BlankValidator.php" role="php" />
   <file md5sum="16cf9f642a14848b9bc3ef3b883f19d1" name="Symfony/Component/Validator/Constraints/Callback.php" role="php" />
   <file md5sum="ad21e0f04423e82992c83f14e893779e" name="Symfony/Component/Validator/Constraints/CallbackValidator.php" role="php" />
   <file md5sum="056ebff8baa348be8202ca6b297c4d01" name="Symfony/Component/Validator/Constraints/CardScheme.php" role="php" />
   <file md5sum="284da971d7406e599a1233b2d2206376" name="Symfony/Component/Validator/Constraints/CardSchemeValidator.php" role="php" />
   <file md5sum="49d0c082a54602ac483ce2afffb57431" name="Symfony/Component/Validator/Constraints/Choice.php" role="php" />
   <file md5sum="c6988852a1c710e4832e4a0cf5f465ed" name="Symfony/Component/Validator/Constraints/ChoiceValidator.php" role="php" />
   <file md5sum="09520f3d5eacb03f804fadf2d0afd2d2" name="Symfony/Component/Validator/Constraints/Collection/Optional.php" role="php" />
   <file md5sum="a084bfe09407f23250f410ed4c00c05f" name="Symfony/Component/Validator/Constraints/Collection/Required.php" role="php" />
   <file md5sum="5ca5192af79d7355af8a4017b671a8fb" name="Symfony/Component/Validator/Constraints/Collection.php" role="php" />
   <file md5sum="2a15094f63da567965053d81cec8b6bc" name="Symfony/Component/Validator/Constraints/CollectionValidator.php" role="php" />
   <file md5sum="d60afc2a00394329890f41050239d6be" name="Symfony/Component/Validator/Constraints/Count.php" role="php" />
   <file md5sum="8912e6648f1801a81237b64ad79beea8" name="Symfony/Component/Validator/Constraints/Country.php" role="php" />
   <file md5sum="5a7bd5263e9707dd6acab56907453cb4" name="Symfony/Component/Validator/Constraints/CountryValidator.php" role="php" />
   <file md5sum="b63f576f4acf1cf05dd4a10b8dcdf613" name="Symfony/Component/Validator/Constraints/CountValidator.php" role="php" />
   <file md5sum="dd7316794387746194d2d2fb42b7eb7f" name="Symfony/Component/Validator/Constraints/Currency.php" role="php" />
   <file md5sum="9dfda60fe4dedc960dec518bcdf21a7f" name="Symfony/Component/Validator/Constraints/CurrencyValidator.php" role="php" />
   <file md5sum="5e1a2350fefabcba23f44ced82b9e830" name="Symfony/Component/Validator/Constraints/Date.php" role="php" />
   <file md5sum="7146e3c517edfd501fdec3734e5a6f55" name="Symfony/Component/Validator/Constraints/DateTime.php" role="php" />
   <file md5sum="113eb18edd006507eb982c46d58fa85f" name="Symfony/Component/Validator/Constraints/DateTimeValidator.php" role="php" />
   <file md5sum="b2d3caa73ec728ede046f0358cf001a0" name="Symfony/Component/Validator/Constraints/DateValidator.php" role="php" />
   <file md5sum="3aa9b1e92fed777c1439d01d7eb6af23" name="Symfony/Component/Validator/Constraints/Email.php" role="php" />
   <file md5sum="01b056747cb908f564510334d5cf80fb" name="Symfony/Component/Validator/Constraints/EmailValidator.php" role="php" />
   <file md5sum="1203a215e52460149441441579253d47" name="Symfony/Component/Validator/Constraints/EqualTo.php" role="php" />
   <file md5sum="85299aea76d2e9973c0a2a1f39796640" name="Symfony/Component/Validator/Constraints/EqualToValidator.php" role="php" />
   <file md5sum="5bf3ff6df741685faf77a3568bb8b633" name="Symfony/Component/Validator/Constraints/Existence.php" role="php" />
   <file md5sum="900f7ff58ceb2ae76007bb5a6394d921" name="Symfony/Component/Validator/Constraints/Expression.php" role="php" />
   <file md5sum="3ede516fce7c1f487d08359ba11ae2ff" name="Symfony/Component/Validator/Constraints/ExpressionValidator.php" role="php" />
   <file md5sum="09d73194877b4dda8d4300f24e195013" name="Symfony/Component/Validator/Constraints/False.php" role="php" />
   <file md5sum="79467bb4ee325740c202f9c8b97010a9" name="Symfony/Component/Validator/Constraints/FalseValidator.php" role="php" />
   <file md5sum="6e8e581ad9077fb13150682285df29b1" name="Symfony/Component/Validator/Constraints/File.php" role="php" />
   <file md5sum="d08c81702c68afd2c2757543f7d5193b" name="Symfony/Component/Validator/Constraints/FileValidator.php" role="php" />
   <file md5sum="79767d486e626e5c77b78bd7afe4aee9" name="Symfony/Component/Validator/Constraints/GreaterThan.php" role="php" />
   <file md5sum="ebb17f4ce792e12fecff1e9bb4b41e21" name="Symfony/Component/Validator/Constraints/GreaterThanOrEqual.php" role="php" />
   <file md5sum="e4430a7d1c6f9f03c7a770ddda909d5f" name="Symfony/Component/Validator/Constraints/GreaterThanOrEqualValidator.php" role="php" />
   <file md5sum="2ff68d36a30ee563937565accdaf91e3" name="Symfony/Component/Validator/Constraints/GreaterThanValidator.php" role="php" />
   <file md5sum="15201fe63d343b6b1e1a739fcaad8662" name="Symfony/Component/Validator/Constraints/GroupSequence.php" role="php" />
   <file md5sum="38089465890121217bdedbd833ee95e4" name="Symfony/Component/Validator/Constraints/GroupSequenceProvider.php" role="php" />
   <file md5sum="3b6c69a9eb08622192d6af7a1f90bde3" name="Symfony/Component/Validator/Constraints/Iban.php" role="php" />
   <file md5sum="767699246ea9dae9c99b112253ef0af0" name="Symfony/Component/Validator/Constraints/IbanValidator.php" role="php" />
   <file md5sum="c170ea25fe3922db43490b571011a438" name="Symfony/Component/Validator/Constraints/IdenticalTo.php" role="php" />
   <file md5sum="56257e543ffc3632a272b284cd7ceeda" name="Symfony/Component/Validator/Constraints/IdenticalToValidator.php" role="php" />
   <file md5sum="92f832be76aed1cfcd18d276ff45bce9" name="Symfony/Component/Validator/Constraints/Image.php" role="php" />
   <file md5sum="a95e09bb82ad891054f0680144487871" name="Symfony/Component/Validator/Constraints/ImageValidator.php" role="php" />
   <file md5sum="1ff307af5e1d02b5da016f7fd3c64816" name="Symfony/Component/Validator/Constraints/Ip.php" role="php" />
   <file md5sum="66c5af8b916684cf0c166c280cb00aa5" name="Symfony/Component/Validator/Constraints/IpValidator.php" role="php" />
   <file md5sum="0eb759966852ddb84bd6b24c967040b7" name="Symfony/Component/Validator/Constraints/Isbn.php" role="php" />
   <file md5sum="ff5b531b2a454c10fce5ae7c0894a22a" name="Symfony/Component/Validator/Constraints/IsbnValidator.php" role="php" />
   <file md5sum="ee14ff1ba2ba521a7eb166ef651a1c75" name="Symfony/Component/Validator/Constraints/Issn.php" role="php" />
   <file md5sum="93a39aba6f6a4f5a23ea91108425fa07" name="Symfony/Component/Validator/Constraints/IssnValidator.php" role="php" />
   <file md5sum="5ba57bdea0848798ae8da31a78f1c072" name="Symfony/Component/Validator/Constraints/Language.php" role="php" />
   <file md5sum="27e3692dbfe009a21c71f826e9ab7fe1" name="Symfony/Component/Validator/Constraints/LanguageValidator.php" role="php" />
   <file md5sum="1f0169f057954dec8280c2c4931b0a13" name="Symfony/Component/Validator/Constraints/Length.php" role="php" />
   <file md5sum="93de9c9c5ab7e3b8c19c671004a50ad4" name="Symfony/Component/Validator/Constraints/LengthValidator.php" role="php" />
   <file md5sum="eb6377f01e9cc6440dfa4e183ef8c4ab" name="Symfony/Component/Validator/Constraints/LessThan.php" role="php" />
   <file md5sum="09d85d86e5798681d39dfe598df6c562" name="Symfony/Component/Validator/Constraints/LessThanOrEqual.php" role="php" />
   <file md5sum="564b53c3325126cc54ee9c14102b170a" name="Symfony/Component/Validator/Constraints/LessThanOrEqualValidator.php" role="php" />
   <file md5sum="aa4623bfdf3d9d518660aeb634367252" name="Symfony/Component/Validator/Constraints/LessThanValidator.php" role="php" />
   <file md5sum="de036e7a36b266c549985ededcb96344" name="Symfony/Component/Validator/Constraints/Locale.php" role="php" />
   <file md5sum="4b3b59f35f25cb78b8b25a266d405986" name="Symfony/Component/Validator/Constraints/LocaleValidator.php" role="php" />
   <file md5sum="25dc43335a20b9a6e3b31b43a762e762" name="Symfony/Component/Validator/Constraints/Luhn.php" role="php" />
   <file md5sum="f7360bdeef47916280c4e15ce1be91b1" name="Symfony/Component/Validator/Constraints/LuhnValidator.php" role="php" />
   <file md5sum="868b62aca0723c3b457144aaf6c93a62" name="Symfony/Component/Validator/Constraints/NotBlank.php" role="php" />
   <file md5sum="d095cf646d98ffc63c8404b87dc64c3a" name="Symfony/Component/Validator/Constraints/NotBlankValidator.php" role="php" />
   <file md5sum="54a792ce51e206d9f1f342acf8de0ca6" name="Symfony/Component/Validator/Constraints/NotEqualTo.php" role="php" />
   <file md5sum="ba17b4508a92681c1ecb989e31150989" name="Symfony/Component/Validator/Constraints/NotEqualToValidator.php" role="php" />
   <file md5sum="b0cf3bbae80822776f2ebe3853331da2" name="Symfony/Component/Validator/Constraints/NotIdenticalTo.php" role="php" />
   <file md5sum="3fb62be8d95c084095e2bb8354fa6cb2" name="Symfony/Component/Validator/Constraints/NotIdenticalToValidator.php" role="php" />
   <file md5sum="1797b9ea7b21a35e5d2d1d68ca7fe157" name="Symfony/Component/Validator/Constraints/NotNull.php" role="php" />
   <file md5sum="d7a3af7c2064d4ff44733151eef7630d" name="Symfony/Component/Validator/Constraints/NotNullValidator.php" role="php" />
   <file md5sum="1c8478dc05ca6a3af5499c59220d99b0" name="Symfony/Component/Validator/Constraints/Null.php" role="php" />
   <file md5sum="412fc8b35206517d8c2844aec558d6f5" name="Symfony/Component/Validator/Constraints/NullValidator.php" role="php" />
   <file md5sum="82b49cbb8deeed5086002af1d2e3d06f" name="Symfony/Component/Validator/Constraints/Optional.php" role="php" />
   <file md5sum="1875728a92acf358891dc559c15127fa" name="Symfony/Component/Validator/Constraints/Range.php" role="php" />
   <file md5sum="5756018ef45c81919b3214d78b0e6eb4" name="Symfony/Component/Validator/Constraints/RangeValidator.php" role="php" />
   <file md5sum="f7a9e04cd4262d3f80fcbe70b9c4e806" name="Symfony/Component/Validator/Constraints/Regex.php" role="php" />
   <file md5sum="ea6c897666cc7a6af2ff4d913f82a392" name="Symfony/Component/Validator/Constraints/RegexValidator.php" role="php" />
   <file md5sum="acbae820b5540dde9ec681dd85429861" name="Symfony/Component/Validator/Constraints/Required.php" role="php" />
   <file md5sum="67b70d9e097e05da71488e09b6e90b95" name="Symfony/Component/Validator/Constraints/Time.php" role="php" />
   <file md5sum="334dffc652e93fa5bd706116c9b44257" name="Symfony/Component/Validator/Constraints/TimeValidator.php" role="php" />
   <file md5sum="a78e9cd61bb76287a0522b1e5b7b392b" name="Symfony/Component/Validator/Constraints/True.php" role="php" />
   <file md5sum="637d4488ec6112faf64aae361929d040" name="Symfony/Component/Validator/Constraints/TrueValidator.php" role="php" />
   <file md5sum="d965c82e65e8289f8ecb88d83fc83de7" name="Symfony/Component/Validator/Constraints/Type.php" role="php" />
   <file md5sum="9f24a3872c47a60f1a990c9f199e14c2" name="Symfony/Component/Validator/Constraints/TypeValidator.php" role="php" />
   <file md5sum="ee711e399a3f093e7b3545692ebf7f62" name="Symfony/Component/Validator/Constraints/Url.php" role="php" />
   <file md5sum="38d0b621d809fc73a63e73c9b2eec6f0" name="Symfony/Component/Validator/Constraints/UrlValidator.php" role="php" />
   <file md5sum="1bb212699fe8609180681b51be678cd4" name="Symfony/Component/Validator/Constraints/Valid.php" role="php" />
   <file md5sum="d599a1ef98a59cddd0952a2217e6a61a" name="Symfony/Component/Validator/ConstraintValidator.php" role="php" />
   <file md5sum="1dc05c3449f8ee63549a2672f762c635" name="Symfony/Component/Validator/ConstraintValidatorFactory.php" role="php" />
   <file md5sum="f322ea75c86e7e0fe44bf0e55b45522e" name="Symfony/Component/Validator/ConstraintValidatorFactoryInterface.php" role="php" />
   <file md5sum="62e34e25daf9b43c27cd8111b2c10ede" name="Symfony/Component/Validator/ConstraintValidatorInterface.php" role="php" />
   <file md5sum="687daad19e5f43350617c063490aa100" name="Symfony/Component/Validator/ConstraintViolation.php" role="php" />
   <file md5sum="ef89d7f0cbae45ed31aa8a72fc13487d" name="Symfony/Component/Validator/ConstraintViolationInterface.php" role="php" />
   <file md5sum="c2c8b4b7b53a10d1f269c2ce53c7e901" name="Symfony/Component/Validator/ConstraintViolationList.php" role="php" />
   <file md5sum="36c862c3c9a1e8e797fe4b6ef4c91546" name="Symfony/Component/Validator/ConstraintViolationListInterface.php" role="php" />
   <file md5sum="4be17f7858f92496b9d0527bcd7cd720" name="Symfony/Component/Validator/DefaultTranslator.php" role="php" />
   <file md5sum="e1602d2dcf95a9052da9a432db6c1875" name="Symfony/Component/Validator/Exception/BadMethodCallException.php" role="php" />
   <file md5sum="5fcc0f865c77f52e9847378da9f0489c" name="Symfony/Component/Validator/Exception/ConstraintDefinitionException.php" role="php" />
   <file md5sum="0b0c94ce85588dd563f8767426eafdcc" name="Symfony/Component/Validator/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="ed9aa39f207cff711cb5c8fc86114395" name="Symfony/Component/Validator/Exception/GroupDefinitionException.php" role="php" />
   <file md5sum="bd79de35ad0e084b8400e08793205a69" name="Symfony/Component/Validator/Exception/InvalidArgumentException.php" role="php" />
   <file md5sum="7dcead75d21f8d0a56980c4a07d7aca4" name="Symfony/Component/Validator/Exception/InvalidOptionsException.php" role="php" />
   <file md5sum="9f68ce5c519e7ae740485b54d04e1d51" name="Symfony/Component/Validator/Exception/MappingException.php" role="php" />
   <file md5sum="b53533773e89efd08b4e8fee6b186579" name="Symfony/Component/Validator/Exception/MissingOptionsException.php" role="php" />
   <file md5sum="e9bea930f7bceee8d7dde50dd85e9ba7" name="Symfony/Component/Validator/Exception/NoSuchMetadataException.php" role="php" />
   <file md5sum="99d749d07f412b89d5af760e96666226" name="Symfony/Component/Validator/Exception/RuntimeException.php" role="php" />
   <file md5sum="49ee74315300fe571873b44bdd13e171" name="Symfony/Component/Validator/Exception/UnexpectedTypeException.php" role="php" />
   <file md5sum="a0a8b64183db5f06140fbe08503efdaf" name="Symfony/Component/Validator/Exception/ValidatorException.php" role="php" />
   <file md5sum="915a47ef778253a6c7a1e2a2528aa996" name="Symfony/Component/Validator/ExecutionContext.php" role="php" />
   <file md5sum="676e8179bba9e6d350680ef1ea759b9e" name="Symfony/Component/Validator/ExecutionContextInterface.php" role="php" />
   <file md5sum="ca92e46f393618f0efc6954ca2466939" name="Symfony/Component/Validator/GlobalExecutionContextInterface.php" role="php" />
   <file md5sum="381af269f7e5fb28e87a5c81a3707621" name="Symfony/Component/Validator/GroupSequenceProviderInterface.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Validator/LICENSE" role="doc" />
   <file md5sum="4ff2d258e293c0d3347a56678051e8d3" name="Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.php" role="php" />
   <file md5sum="462497cd0cf5d29d523b5a0d75b81ca0" name="Symfony/Component/Validator/Mapping/Cache/ApcCache.php" role="php" />
   <file md5sum="8a7b01dab83206f30d02ceb5ccc8c171" name="Symfony/Component/Validator/Mapping/Cache/CacheInterface.php" role="php" />
   <file md5sum="b7ce80520c8d175471f396247948cdc3" name="Symfony/Component/Validator/Mapping/ClassMetadata.php" role="php" />
   <file md5sum="b708c68549204312c540ee7dacb9ad87" name="Symfony/Component/Validator/Mapping/ClassMetadataFactory.php" role="php" />
   <file md5sum="6d8a4315440eca7b33bee8a2c2df3cf0" name="Symfony/Component/Validator/Mapping/ElementMetadata.php" role="php" />
   <file md5sum="66734470bd1916de0ca3f01784364005" name="Symfony/Component/Validator/Mapping/GetterMetadata.php" role="php" />
   <file md5sum="4aafbfbbc0d5d5430ee20aff7da60f5c" name="Symfony/Component/Validator/Mapping/Loader/AbstractLoader.php" role="php" />
   <file md5sum="8ad79406bc548394a200e712dee0c30f" name="Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.php" role="php" />
   <file md5sum="9b4a61c8b30fae02788429854ba81036" name="Symfony/Component/Validator/Mapping/Loader/FileLoader.php" role="php" />
   <file md5sum="4af7f07bfcfa849e66999ab1ee24f876" name="Symfony/Component/Validator/Mapping/Loader/FilesLoader.php" role="php" />
   <file md5sum="8b284df5873ac5725b5c4705b69d530b" name="Symfony/Component/Validator/Mapping/Loader/LoaderChain.php" role="php" />
   <file md5sum="d202e225a6b817c2829e10f98d04abdd" name="Symfony/Component/Validator/Mapping/Loader/LoaderInterface.php" role="php" />
   <file md5sum="2f1f4e105fe3d987790a62d0a36ace39" name="Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd" role="php" />
   <file md5sum="1005146f217d0bcdaabe67f3c3e9c225" name="Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.php" role="php" />
   <file md5sum="c8d1f2225f940f29028386fe2fbbfe7a" name="Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.php" role="php" />
   <file md5sum="31fdec6936f6c041c6c9d4a3d3cec86e" name="Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.php" role="php" />
   <file md5sum="a712b89ff6fe80354296a3b399c6139f" name="Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.php" role="php" />
   <file md5sum="8db3ad3b587098ac95ad6d25317c2e9c" name="Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.php" role="php" />
   <file md5sum="8c45e691d8e03b05b3a893e3acdb5a0f" name="Symfony/Component/Validator/Mapping/MemberMetadata.php" role="php" />
   <file md5sum="f44bb51a8950d588ae2dd0ab7bf17a1f" name="Symfony/Component/Validator/Mapping/PropertyMetadata.php" role="php" />
   <file md5sum="4db44d9e04ab20b9b5757aaac84e4aa7" name="Symfony/Component/Validator/MetadataFactoryInterface.php" role="php" />
   <file md5sum="ee339e11db2658139a134c3824c8afd7" name="Symfony/Component/Validator/MetadataInterface.php" role="php" />
   <file md5sum="00b9e5fab71633739ff82314900aa9c9" name="Symfony/Component/Validator/ObjectInitializerInterface.php" role="php" />
   <file md5sum="78843eae0d52d5f5909f1087a44295b7" name="Symfony/Component/Validator/phpunit.xml.dist" role="test" />
   <file md5sum="6e7e28f7b1ff78536561fcda9521b4dc" name="Symfony/Component/Validator/PropertyMetadataContainerInterface.php" role="php" />
   <file md5sum="f6c682d20098aac0b0502374eaa79df1" name="Symfony/Component/Validator/PropertyMetadataInterface.php" role="php" />
   <file md5sum="909b0bb88dcdb6cdee5dce42ec11e0d8" name="Symfony/Component/Validator/README.md" role="doc" />
   <file md5sum="c23dd67e56958cc57e1147fce770d730" name="Symfony/Component/Validator/Resources/translations/validators.af.xlf" role="php" />
   <file md5sum="2a03a4464216db4d71c91a1fd5f0c696" name="Symfony/Component/Validator/Resources/translations/validators.ar.xlf" role="php" />
   <file md5sum="d4011977e7d9fed5e3c57c9b5e09077e" name="Symfony/Component/Validator/Resources/translations/validators.bg.xlf" role="php" />
   <file md5sum="a17496bce86c96c7d447a148b2d29e8a" name="Symfony/Component/Validator/Resources/translations/validators.ca.xlf" role="php" />
   <file md5sum="bbda69a9cc105df6d0e915e93ea4de6d" name="Symfony/Component/Validator/Resources/translations/validators.cs.xlf" role="php" />
   <file md5sum="117e80d2ecc0ed11fe07dcef7d023d3f" name="Symfony/Component/Validator/Resources/translations/validators.cy.xlf" role="php" />
   <file md5sum="793dcd9686793b163ac089ce11e98f35" name="Symfony/Component/Validator/Resources/translations/validators.da.xlf" role="php" />
   <file md5sum="7645ad8b8789c647baf9d713603dcc4e" name="Symfony/Component/Validator/Resources/translations/validators.de.xlf" role="php" />
   <file md5sum="84e8b57b7cd181c41a9f2c609d9d2fcf" name="Symfony/Component/Validator/Resources/translations/validators.el.xlf" role="php" />
   <file md5sum="f6b79a83f78a4d434657c2246bfa3299" name="Symfony/Component/Validator/Resources/translations/validators.en.xlf" role="php" />
   <file md5sum="6d37d37db86c98e7c2c0058e8ca627d5" name="Symfony/Component/Validator/Resources/translations/validators.es.xlf" role="php" />
   <file md5sum="51f14210b3a9c9a53edaee7055d04e0e" name="Symfony/Component/Validator/Resources/translations/validators.et.xlf" role="php" />
   <file md5sum="2af5064bdebe03bb807ff16385d5d06e" name="Symfony/Component/Validator/Resources/translations/validators.eu.xlf" role="php" />
   <file md5sum="1e07a45e3288a48103d69c34ab9e61e6" name="Symfony/Component/Validator/Resources/translations/validators.fa.xlf" role="php" />
   <file md5sum="46b3152b9dd89f59e42e0e72844a12ec" name="Symfony/Component/Validator/Resources/translations/validators.fi.xlf" role="php" />
   <file md5sum="47603272bbc1c04e050be6413d350d02" name="Symfony/Component/Validator/Resources/translations/validators.fr.xlf" role="php" />
   <file md5sum="f86071db1ba3ea2ff60161e5cc8b5e71" name="Symfony/Component/Validator/Resources/translations/validators.gl.xlf" role="php" />
   <file md5sum="88b6ab9440768505c046b7ef1309dd2e" name="Symfony/Component/Validator/Resources/translations/validators.he.xlf" role="php" />
   <file md5sum="a37851b29fd856938b8029924661c408" name="Symfony/Component/Validator/Resources/translations/validators.hr.xlf" role="php" />
   <file md5sum="0b4a4f159d4577d218cf405a8b69f48e" name="Symfony/Component/Validator/Resources/translations/validators.hu.xlf" role="php" />
   <file md5sum="822214a574b126ce160d5caed2a08175" name="Symfony/Component/Validator/Resources/translations/validators.hy.xlf" role="php" />
   <file md5sum="72642d91259f21b72dd1bf1005ebac4e" name="Symfony/Component/Validator/Resources/translations/validators.id.xlf" role="php" />
   <file md5sum="96673a4cfc1e20bf2417dff5f41093c3" name="Symfony/Component/Validator/Resources/translations/validators.it.xlf" role="php" />
   <file md5sum="26ce7bce56a82a9ae623a109bcb3c47d" name="Symfony/Component/Validator/Resources/translations/validators.ja.xlf" role="php" />
   <file md5sum="9c0e28952956db6812685e121ea2c010" name="Symfony/Component/Validator/Resources/translations/validators.lb.xlf" role="php" />
   <file md5sum="8633947d9242120d0b273bedd0044c6b" name="Symfony/Component/Validator/Resources/translations/validators.lt.xlf" role="php" />
   <file md5sum="5d6b61cab4e816991ff98ff64821dbc9" name="Symfony/Component/Validator/Resources/translations/validators.mn.xlf" role="php" />
   <file md5sum="fc5bde0bb7a5dfafb1a061dd38dd335a" name="Symfony/Component/Validator/Resources/translations/validators.nb.xlf" role="php" />
   <file md5sum="8620371a13ed6d660f8daafbefdf55a4" name="Symfony/Component/Validator/Resources/translations/validators.nl.xlf" role="php" />
   <file md5sum="4a7aefa9d1b652a741d38936701a7bea" name="Symfony/Component/Validator/Resources/translations/validators.no.xlf" role="php" />
   <file md5sum="43cadc96e23d6bb270ccde1e20cd3940" name="Symfony/Component/Validator/Resources/translations/validators.pl.xlf" role="php" />
   <file md5sum="807707efabc65ad9992ff9b79531b1ec" name="Symfony/Component/Validator/Resources/translations/validators.pt.xlf" role="php" />
   <file md5sum="86ef4e2fd4d0ca78e4aff92a496d6750" name="Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf" role="php" />
   <file md5sum="710b8a67f921af1756390e5c16732043" name="Symfony/Component/Validator/Resources/translations/validators.ro.xlf" role="php" />
   <file md5sum="60f16b6952726dfd1f92d3764bad85a5" name="Symfony/Component/Validator/Resources/translations/validators.ru.xlf" role="php" />
   <file md5sum="fb5f5e62d477c3790fdba5fbc97fc238" name="Symfony/Component/Validator/Resources/translations/validators.sk.xlf" role="php" />
   <file md5sum="e6a4af47341fa4c1b79e73b869df66b9" name="Symfony/Component/Validator/Resources/translations/validators.sl.xlf" role="php" />
   <file md5sum="1f2fb26d0dd0131a51f36f7107c8bac2" name="Symfony/Component/Validator/Resources/translations/validators.sq.xlf" role="php" />
   <file md5sum="8bc6bb4b4b0ff9d03446c0c0ffd49983" name="Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf" role="php" />
   <file md5sum="243a40ad3d4d74eed428066e6d6e7ef0" name="Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf" role="php" />
   <file md5sum="ad1dd35b2ceccaa8a744ff08ebb1c759" name="Symfony/Component/Validator/Resources/translations/validators.sv.xlf" role="php" />
   <file md5sum="a51133637a933c33aa1c7be7bc2c8f90" name="Symfony/Component/Validator/Resources/translations/validators.tr.xlf" role="php" />
   <file md5sum="3a4ec8b32ecc077c50c875fc46eec46b" name="Symfony/Component/Validator/Resources/translations/validators.uk.xlf" role="php" />
   <file md5sum="65930b6493ef965d3721753893c549b8" name="Symfony/Component/Validator/Resources/translations/validators.vi.xlf" role="php" />
   <file md5sum="8ea9d18b4b8b0e0973d4461e4a4b31cf" name="Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf" role="php" />
   <file md5sum="336e3f4fcb54962d47342a9c58e80367" name="Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlf" role="php" />
   <file md5sum="df674acd306f8fa14a401b024b9bdc7f" name="Symfony/Component/Validator/Tests/Constraints/AbstractComparisonValidatorTestCase.php" role="test" />
   <file md5sum="1179a8a955d42d44c8ed974c1819fb2e" name="Symfony/Component/Validator/Tests/Constraints/AllTest.php" role="test" />
   <file md5sum="96d4e47954bfb402594f16426d7d00ec" name="Symfony/Component/Validator/Tests/Constraints/AllValidatorTest.php" role="test" />
   <file md5sum="b269201734d4f62ecf56991d0ca84714" name="Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php" role="test" />
   <file md5sum="d5b9313f897e13ecc42be33565e6a835" name="Symfony/Component/Validator/Tests/Constraints/CallbackValidatorTest.php" role="test" />
   <file md5sum="43d071b4c94aa19cfd7c010958397284" name="Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php" role="test" />
   <file md5sum="e16564bb61b350db55712205e43c2ee7" name="Symfony/Component/Validator/Tests/Constraints/ChoiceValidatorTest.php" role="test" />
   <file md5sum="71210b53ae36ca85b8cab158c1cdc5f3" name="Symfony/Component/Validator/Tests/Constraints/CollectionTest.php" role="test" />
   <file md5sum="0b20dac6c8b275500c652f1e9726f68e" name="Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayObjectTest.php" role="test" />
   <file md5sum="f860057334309da67249317f86faf070" name="Symfony/Component/Validator/Tests/Constraints/CollectionValidatorArrayTest.php" role="test" />
   <file md5sum="83079c79103474984cdabd95062b7d03" name="Symfony/Component/Validator/Tests/Constraints/CollectionValidatorCustomArrayObjectTest.php" role="test" />
   <file md5sum="abb52acdf76b84de090fd27d778abc25" name="Symfony/Component/Validator/Tests/Constraints/CollectionValidatorTest.php" role="test" />
   <file md5sum="088335785b72fe09bb08a78cb174a9b8" name="Symfony/Component/Validator/Tests/Constraints/CountryValidatorTest.php" role="test" />
   <file md5sum="81cfd6f9c23a49e571849bbf93242d45" name="Symfony/Component/Validator/Tests/Constraints/CountValidatorArrayTest.php" role="test" />
   <file md5sum="31cd334579c8f399f099aaae60e0daf8" name="Symfony/Component/Validator/Tests/Constraints/CountValidatorCountableTest.php" role="test" />
   <file md5sum="2baf2ba710f51a96efb9dfdf4e8e1b90" name="Symfony/Component/Validator/Tests/Constraints/CountValidatorTest.php" role="test" />
   <file md5sum="6f443701a1d6c8b3e6e56fb330da132e" name="Symfony/Component/Validator/Tests/Constraints/CurrencyValidatorTest.php" role="test" />
   <file md5sum="ff807a49e3f2b98577ba78573388e54d" name="Symfony/Component/Validator/Tests/Constraints/DateTimeValidatorTest.php" role="test" />
   <file md5sum="86f3b37b7d92d05b0f6e20b355d2612c" name="Symfony/Component/Validator/Tests/Constraints/DateValidatorTest.php" role="test" />
   <file md5sum="7a87cf58056325eae85ff00bf9a938ed" name="Symfony/Component/Validator/Tests/Constraints/EmailValidatorTest.php" role="test" />
   <file md5sum="7893495310cce59b359b7b0b283dfc5c" name="Symfony/Component/Validator/Tests/Constraints/EqualToValidatorTest.php" role="test" />
   <file md5sum="8df8fad7f1e3f234cd3f70cfab62dd7c" name="Symfony/Component/Validator/Tests/Constraints/ExpressionValidatorTest.php" role="test" />
   <file md5sum="24905eea4858997f8247238e243632a8" name="Symfony/Component/Validator/Tests/Constraints/FalseValidatorTest.php" role="test" />
   <file md5sum="89a984927585c53fe1032b9f636133ff" name="Symfony/Component/Validator/Tests/Constraints/FileValidatorObjectTest.php" role="test" />
   <file md5sum="8a4da84c8f7e8ef54b806bd808bcc0c5" name="Symfony/Component/Validator/Tests/Constraints/FileValidatorPathTest.php" role="test" />
   <file md5sum="63c0fea7da6af037f5c07e530c4daba6" name="Symfony/Component/Validator/Tests/Constraints/FileValidatorTest.php" role="test" />
   <file md5sum="583932c265a6b3fc7b64e3ce5781d982" name="Symfony/Component/Validator/Tests/Constraints/Fixtures/test.gif" role="test" />
   <file md5sum="fdcf796bda19a6af822251135ba90fc1" name="Symfony/Component/Validator/Tests/Constraints/Fixtures/test_landscape.gif" role="test" />
   <file md5sum="0aeea019389321d9f37b03634b480bc3" name="Symfony/Component/Validator/Tests/Constraints/Fixtures/test_portrait.gif" role="test" />
   <file md5sum="7c9ea0cc06b77db6e3ad76e02dfb250f" name="Symfony/Component/Validator/Tests/Constraints/GreaterThanOrEqualValidatorTest.php" role="test" />
   <file md5sum="3c4700309337c186d07c5db8620a7f16" name="Symfony/Component/Validator/Tests/Constraints/GreaterThanValidatorTest.php" role="test" />
   <file md5sum="24a0a471799799b4dabe807fcb55eef4" name="Symfony/Component/Validator/Tests/Constraints/IbanValidatorTest.php" role="test" />
   <file md5sum="158ec986b80be1639be50889f6d1a755" name="Symfony/Component/Validator/Tests/Constraints/IdenticalToValidatorTest.php" role="test" />
   <file md5sum="78dec98020821252b9a0e1cdd237c9b8" name="Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php" role="test" />
   <file md5sum="b2b8bde3a236afaa56a0efc95040457b" name="Symfony/Component/Validator/Tests/Constraints/IpValidatorTest.php" role="test" />
   <file md5sum="e2e478a4e70021c8be50511adb544e17" name="Symfony/Component/Validator/Tests/Constraints/IsbnValidatorTest.php" role="test" />
   <file md5sum="e442a58274f84d70010c01704f2be5eb" name="Symfony/Component/Validator/Tests/Constraints/IssnValidatorTest.php" role="test" />
   <file md5sum="c000845e88198140e3a2e265ae4b5682" name="Symfony/Component/Validator/Tests/Constraints/LanguageValidatorTest.php" role="test" />
   <file md5sum="cd2e05c3024174f384f7034838eaa1f5" name="Symfony/Component/Validator/Tests/Constraints/LengthValidatorTest.php" role="test" />
   <file md5sum="2f4d2435eefd4ba92994fbc4c725a203" name="Symfony/Component/Validator/Tests/Constraints/LessThanOrEqualValidatorTest.php" role="test" />
   <file md5sum="d82f8a856a9d95cd7a6d8fd6a0734981" name="Symfony/Component/Validator/Tests/Constraints/LessThanValidatorTest.php" role="test" />
   <file md5sum="3debe15a84780f2383a690dfbb867a1d" name="Symfony/Component/Validator/Tests/Constraints/LocaleValidatorTest.php" role="test" />
   <file md5sum="8fff3ed85f1a0ea2f1414606d66031aa" name="Symfony/Component/Validator/Tests/Constraints/LuhnValidatorTest.php" role="test" />
   <file md5sum="d26340b6b9e5ddf8d71968b27c288db2" name="Symfony/Component/Validator/Tests/Constraints/NotBlankValidatorTest.php" role="test" />
   <file md5sum="002a50c1e4557d0b89860f47c279fc74" name="Symfony/Component/Validator/Tests/Constraints/NotEqualToValidatorTest.php" role="test" />
   <file md5sum="4ea56306c1dbab2f83e077512a59a769" name="Symfony/Component/Validator/Tests/Constraints/NotIdenticalToValidatorTest.php" role="test" />
   <file md5sum="b3e3c45f358f75c450c27bcf9a046576" name="Symfony/Component/Validator/Tests/Constraints/NotNullValidatorTest.php" role="test" />
   <file md5sum="e8e343b9fb22cecd94a9a08b993d0c3a" name="Symfony/Component/Validator/Tests/Constraints/NullValidatorTest.php" role="test" />
   <file md5sum="f02807065a8b9e4e578ec2e806cb9b81" name="Symfony/Component/Validator/Tests/Constraints/RangeValidatorTest.php" role="test" />
   <file md5sum="457e33f80230fd2eebaa65404aa0f085" name="Symfony/Component/Validator/Tests/Constraints/RegexValidatorTest.php" role="test" />
   <file md5sum="9943acc92b78efc760c440e0f8d94998" name="Symfony/Component/Validator/Tests/Constraints/TimeValidatorTest.php" role="test" />
   <file md5sum="fe42e8bb7b68a0bb8aae4325746f2bf9" name="Symfony/Component/Validator/Tests/Constraints/TrueValidatorTest.php" role="test" />
   <file md5sum="61b6a4967362f4ac3dcbecbdcbf11156" name="Symfony/Component/Validator/Tests/Constraints/TypeValidatorTest.php" role="test" />
   <file md5sum="c61759a19cd93a2d382d40ac2e689acd" name="Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php" role="test" />
   <file md5sum="2d93246dad9e589df5a83163e06fb877" name="Symfony/Component/Validator/Tests/Constraints/ValidTest.php" role="test" />
   <file md5sum="142a99b58afedf51b2c454fff02a65f3" name="Symfony/Component/Validator/Tests/ConstraintTest.php" role="test" />
   <file md5sum="0584669a9a12dcadae796248aa9b42ff" name="Symfony/Component/Validator/Tests/ConstraintViolationListTest.php" role="test" />
   <file md5sum="1319acdb0db4325c870ae4972e13efae" name="Symfony/Component/Validator/Tests/ConstraintViolationTest.php" role="test" />
   <file md5sum="5aaa025907f20560822461a587c25457" name="Symfony/Component/Validator/Tests/ExecutionContextTest.php" role="test" />
   <file md5sum="9454ace17fc81c19efac384cf4c50713" name="Symfony/Component/Validator/Tests/Fixtures/CallbackClass.php" role="test" />
   <file md5sum="2ce3e43d62dc225654afccb6614717be" name="Symfony/Component/Validator/Tests/Fixtures/ClassConstraint.php" role="test" />
   <file md5sum="d4169102f57729661cb27febaab2d23f" name="Symfony/Component/Validator/Tests/Fixtures/ConstraintA.php" role="test" />
   <file md5sum="e2c1daf935b4f95134c33129662adf08" name="Symfony/Component/Validator/Tests/Fixtures/ConstraintAValidator.php" role="test" />
   <file md5sum="0157e96965ab4870f6965fbfa96a1612" name="Symfony/Component/Validator/Tests/Fixtures/ConstraintB.php" role="test" />
   <file md5sum="8cd11e6488e0bce8f9c4de961754b500" name="Symfony/Component/Validator/Tests/Fixtures/ConstraintC.php" role="test" />
   <file md5sum="2576db20cea1031e94f9b93ef5f9303a" name="Symfony/Component/Validator/Tests/Fixtures/ConstraintWithValue.php" role="test" />
   <file md5sum="7763c0812a069714f24f431567726500" name="Symfony/Component/Validator/Tests/Fixtures/ConstraintWithValueAsDefault.php" role="test" />
   <file md5sum="6b6e6d9a60b2254024c55566fe79b08f" name="Symfony/Component/Validator/Tests/Fixtures/Entity.php" role="test" />
   <file md5sum="ea31fab8aec5a8884f460f66daf7c993" name="Symfony/Component/Validator/Tests/Fixtures/EntityInterface.php" role="test" />
   <file md5sum="a66c0953945928c193165c50757bcf04" name="Symfony/Component/Validator/Tests/Fixtures/EntityParent.php" role="test" />
   <file md5sum="72db5eaa66dc69f67e2d4ad5eb82b0e8" name="Symfony/Component/Validator/Tests/Fixtures/FailingConstraint.php" role="test" />
   <file md5sum="c97e5a72d1d2befa96bea40821ec2c3a" name="Symfony/Component/Validator/Tests/Fixtures/FailingConstraintValidator.php" role="test" />
   <file md5sum="edcb2a57ff4308821104e31a3ffd5167" name="Symfony/Component/Validator/Tests/Fixtures/FakeMetadataFactory.php" role="test" />
   <file md5sum="068493fec3128c8cb2d29f6c5b0eaad0" name="Symfony/Component/Validator/Tests/Fixtures/FilesLoader.php" role="test" />
   <file md5sum="ad8147295941a1cc399da4034cd61c49" name="Symfony/Component/Validator/Tests/Fixtures/GroupSequenceProviderEntity.php" role="test" />
   <file md5sum="ddb0895d24c9c089229b3b932538aabd" name="Symfony/Component/Validator/Tests/Fixtures/InvalidConstraint.php" role="test" />
   <file md5sum="5681169dbdca0c79b579401520a7173d" name="Symfony/Component/Validator/Tests/Fixtures/InvalidConstraintValidator.php" role="test" />
   <file md5sum="fbc643d2960104a96a86a281f0d099bb" name="Symfony/Component/Validator/Tests/Fixtures/PropertyConstraint.php" role="test" />
   <file md5sum="9d6e84977cc653a0673858a764ec39d6" name="Symfony/Component/Validator/Tests/Fixtures/Reference.php" role="test" />
   <file md5sum="7353a9cae56c607794bee8094e41ffd4" name="Symfony/Component/Validator/Tests/Mapping/BlackholeMetadataFactoryTest.php" role="test" />
   <file md5sum="8d720776b21d7ce674a7365e5d2e38d2" name="Symfony/Component/Validator/Tests/Mapping/Cache/ApcCacheTest.php" role="test" />
   <file md5sum="9fe738a4b6ba7f5105f2190fd449268e" name="Symfony/Component/Validator/Tests/Mapping/ClassMetadataFactoryTest.php" role="test" />
   <file md5sum="a4495fa7cfe81f702f45d66a7fca8617" name="Symfony/Component/Validator/Tests/Mapping/ClassMetadataTest.php" role="test" />
   <file md5sum="4384111241f1abc0445a06c539451f2a" name="Symfony/Component/Validator/Tests/Mapping/ElementMetadataTest.php" role="test" />
   <file md5sum="d7f74984a4455152140bed27936361c0" name="Symfony/Component/Validator/Tests/Mapping/GetterMetadataTest.php" role="test" />
   <file md5sum="0175b97f1eb69fcce94b306e900db362" name="Symfony/Component/Validator/Tests/Mapping/Loader/AbstractMethodStaticLoader.php" role="test" />
   <file md5sum="05410e4aaaf0a9a25ddc5c4134924390" name="Symfony/Component/Validator/Tests/Mapping/Loader/AnnotationLoaderTest.php" role="test" />
   <file md5sum="c75233f90b5cfa4a398e1f9e543bf5bc" name="Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping-non-strings.xml" role="test" />
   <file md5sum="16ec478e3cf1b1bc1cab57aed6dadc6a" name="Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.xml" role="test" />
   <file md5sum="7643e62f12cd427f2b5fd1fa9a5f6133" name="Symfony/Component/Validator/Tests/Mapping/Loader/constraint-mapping.yml" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Validator/Tests/Mapping/Loader/empty-mapping.yml" role="test" />
   <file md5sum="3bcfc4369f23356627bddd2555552d7f" name="Symfony/Component/Validator/Tests/Mapping/Loader/FilesLoaderTest.php" role="test" />
   <file md5sum="e28f9bc1f67084ac7661410da1fceaed" name="Symfony/Component/Validator/Tests/Mapping/Loader/LoaderChainTest.php" role="test" />
   <file md5sum="d3b07384d113edec49eaa6238ad5ff00" name="Symfony/Component/Validator/Tests/Mapping/Loader/nonvalid-mapping.yml" role="test" />
   <file md5sum="561fb1c6e9ee5b4de0ab14129619af6f" name="Symfony/Component/Validator/Tests/Mapping/Loader/StaticMethodLoaderTest.php" role="test" />
   <file md5sum="bf3a0038b2c219b56536ee96a18b5f7d" name="Symfony/Component/Validator/Tests/Mapping/Loader/withdoctype.xml" role="test" />
   <file md5sum="fee7255c9f688a416d2fe1d34a1e3389" name="Symfony/Component/Validator/Tests/Mapping/Loader/XmlFileLoaderTest.php" role="test" />
   <file md5sum="adc321984d79e773e10da8b4a1d2cbd4" name="Symfony/Component/Validator/Tests/Mapping/Loader/YamlFileLoaderTest.php" role="test" />
   <file md5sum="b60229644c0267c6db54c14164b8d4c6" name="Symfony/Component/Validator/Tests/Mapping/MemberMetadataTest.php" role="test" />
   <file md5sum="58769dbf877b4372cf5f4b418bee5d1a" name="Symfony/Component/Validator/Tests/Mapping/PropertyMetadataTest.php" role="test" />
   <file md5sum="4380de8196121010c2219a131015c0bd" name="Symfony/Component/Validator/Tests/ValidationVisitorTest.php" role="test" />
   <file md5sum="5b599d3d7e28f3c31dd64a8e4a461798" name="Symfony/Component/Validator/Tests/ValidatorBuilderTest.php" role="test" />
   <file md5sum="c0d58093c8f48e173cf012832b5eff3d" name="Symfony/Component/Validator/Tests/ValidatorTest.php" role="test" />
   <file md5sum="cb4be714363c679edca5adea512653db" name="Symfony/Component/Validator/Validation.php" role="php" />
   <file md5sum="7c3d1976b86cb3bee62b80d06037a82c" name="Symfony/Component/Validator/ValidationVisitor.php" role="php" />
   <file md5sum="d9246ccdbae1aac172f0b344b77a0a6c" name="Symfony/Component/Validator/ValidationVisitorInterface.php" role="php" />
   <file md5sum="dab18aca325ae61509511a918442e133" name="Symfony/Component/Validator/Validator.php" role="php" />
   <file md5sum="f3e3ae245a988856adea2ef86b30d27f" name="Symfony/Component/Validator/ValidatorBuilder.php" role="php" />
   <file md5sum="f3528198e3b2790e1a7ffee686196923" name="Symfony/Component/Validator/ValidatorBuilderInterface.php" role="php" />
   <file md5sum="7e994e15443d4bf79a747b6454bb5e76" name="Symfony/Component/Validator/ValidatorInterface.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
  <optional>
   <package>
    <name>Yaml</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>HttpFoundation</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\�$v��/pear/.pkgxml/Symfony2_OptionsResolver-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>OptionsResolver</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 OptionsResolver Component</summary>
 <description>Symfony2 OptionsResolver Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:48</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="a351ecd36b8eb4040ec96d7ec31f606e" name="Symfony/Component/OptionsResolver/autoloader.php" role="php" />
   <file md5sum="d028132a61a91d82422a3cc88d3ac8cf" name="Symfony/Component/OptionsResolver/composer.json" role="doc" />
   <file md5sum="2ca14134f105bf2a71ed27637b98f09e" name="Symfony/Component/OptionsResolver/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="bd08096bf1d71b06a87f0dcd24f80509" name="Symfony/Component/OptionsResolver/Exception/InvalidOptionsException.php" role="php" />
   <file md5sum="712f40bc8e04cfe34ae80939e4a2e355" name="Symfony/Component/OptionsResolver/Exception/MissingOptionsException.php" role="php" />
   <file md5sum="024bce08820bd8d6cc23550a23bde693" name="Symfony/Component/OptionsResolver/Exception/OptionDefinitionException.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/OptionsResolver/LICENSE" role="doc" />
   <file md5sum="dccf3a502dc75c9505bd6bdd739bc6ff" name="Symfony/Component/OptionsResolver/Options.php" role="php" />
   <file md5sum="70afa5bf5e189ff6d9d635a45a271619" name="Symfony/Component/OptionsResolver/OptionsResolver.php" role="php" />
   <file md5sum="3ef4778c5c504e26462c4c7125f31c85" name="Symfony/Component/OptionsResolver/OptionsResolverInterface.php" role="php" />
   <file md5sum="b33f90f18f3c99cc4fbd7a7b80135861" name="Symfony/Component/OptionsResolver/phpunit.xml.dist" role="test" />
   <file md5sum="87e9152d083c05e57a1617141023e4c0" name="Symfony/Component/OptionsResolver/README.md" role="doc" />
   <file md5sum="9e6f46d9615ef96878e18e853f1cf600" name="Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.php" role="test" />
   <file md5sum="db23027503faa4cc9b402a87d5108f24" name="Symfony/Component/OptionsResolver/Tests/OptionsTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\��c���%pear/.pkgxml/Pear_Auth_SASL-1.1.0.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.3" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0   http://pear.php.net/dtd/tasks-1.0.xsd   http://pear.php.net/dtd/package-2.0   http://pear.php.net/dtd/package-2.0.xsd">
 <name>Auth_SASL</name>
 <channel>pear.php.net</channel>
 <summary>Abstraction of various SASL mechanism responses</summary>
 <description>Provides code to generate responses to common SASL mechanisms, including:
- Digest-MD5
- Cram-MD5
- Plain
- Anonymous
- Login (Pseudo mechanism)
- SCRAM</description>
 <lead>
  <name>Anish Mistry</name>
  <user>amistry</user>
  <email>amistry@am-productions.biz</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Richard Heyes</name>
  <user>richard</user>
  <email>richard@php.net</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Michael Bretterklieber</name>
  <user>mbretter</user>
  <email>michael@bretterklieber.com</email>
  <active>no</active>
 </lead>
 <date>2017-03-07</date>
 <time>14:04:34</time>
 <version>
  <release>1.1.0</release>
  <api>1.1.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
 <notes>
* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Request #21033: PHP warning depreciated
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="60f7b5ba4d05fe0e518292963b14bddb" name="Auth/SASL/Anonymous.php" role="php" />
   <file md5sum="c2c817e4775b6f63f07ddb0c9cbd88b5" name="Auth/SASL/Common.php" role="php" />
   <file md5sum="c6b3b3a4e0aec6a4e0728732ef6babc9" name="Auth/SASL/CramMD5.php" role="php" />
   <file md5sum="509e431141489a77a991401d64f15e9e" name="Auth/SASL/DigestMD5.php" role="php" />
   <file md5sum="1d7478dd9dc5734ec9e16c158dcb6f76" name="Auth/SASL/External.php" role="php" />
   <file md5sum="3a0abcf277374b24262807150451b55e" name="Auth/SASL/Login.php" role="php" />
   <file md5sum="bde1dcf2780d042c1de12e20a696e945" name="Auth/SASL/Plain.php" role="php" />
   <file md5sum="e99f9f71abc36d64ca8e17ad6e5e7631" name="Auth/SASL/SCRAM.php" role="php" />
   <file md5sum="b93e37947e1dd90e5fb639a1734f7a71" name="Auth/SASL.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.4.0</min>
   </php>
   <pearinstaller>
    <min>1.10.1</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>1.1.0</release>
    <api>1.1.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2017-03-07</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Request #21033: PHP warning depreciated
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.6</release>
    <api>1.0.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2011-09-27</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
QA release
* Bug #18856: Authentication warnings because of wrong Auth_SASL::factory argument [kguest]
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.5</release>
    <api>1.0.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2011-09-04</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
QA release
* Added support for any mechanism of the SCRAM family; with thanks to Jehan Pagès. [kguest]
* crammd5 and digestmd5 mechanisms name deprecated in favour of IANA registered names &apos;cram-md5&apos; and &apos;digest-md5&apos;; with thanks to Jehan Pagès. [kguest]
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.4</release>
    <api>1.0.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-02-07</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
QA release
* Fix bug #16624: open_basedir restriction warning in DigestMD5.php [till]
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.3</release>
    <api>1.0.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2009-08-05</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
QA release
* Move SVN to proper directory structure [cweiske]
* Fix Bug #8775: Error in package.xml
* Fix Bug #14671: Security issue due to seeding random number generator [cweiske]
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.2</release>
    <api>1.0.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2006-05-21</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug #2143 Auth_SASL_DigestMD5::getResponse() generates invalid response
* Fixed Bug #6611 Suppress PHP 5 Notice Errors
* Fixed Bug #2154 realm isn&apos;t contained in challange
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.1</release>
    <api>1.0.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-11</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Added authcid/authzid separation in PLAIN and DIGEST-MD5.
   </notes>
  </release>
 </changelog>
</package>
PK�^�\�7�p�K�Kpear/.pkgxml/XML_Util.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.5" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd">
 <name>XML_Util</name>
 <channel>pear.php.net</channel>
 <summary>XML utility class</summary>
 <description>Selection of methods that are often needed when working with XML documents.  Functionality includes creating of attribute lists from arrays, creation of tags, validation of XML names and more.</description>
 <lead>
  <name>Chuck Burgess</name>
  <user>ashnazg</user>
  <email>ashnazg@php.net</email>
  <active>yes</active>
 </lead>
 <lead>
  <name>Stephan Schmidt</name>
  <user>schst</user>
  <email>schst@php-tools.net</email>
  <active>no</active>
 </lead>
 <helper>
  <name>Davey Shafik</name>
  <user>davey</user>
  <email>davey@php.net</email>
  <active>no</active>
 </helper>
 <date>2020-04-19</date>
 <time>14:54:10</time>
 <version>
  <release>1.4.5</release>
  <api>1.4.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
 <notes>
* PR #12: fix Trying to access array offset on value of type int
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="af2746028ae4395f549855a5e444ada7" name="examples/example.php" role="doc" />
   <file baseinstalldir="/" md5sum="b9e52f4aa372c4067c609f49c2285b8f" name="examples/example2.php" role="doc" />
   <file baseinstalldir="/" md5sum="d0af9354df0962e70e9e2215b5611b9c" name="tests/AbstractUnitTests.php" role="test" />
   <file baseinstalldir="/" md5sum="57ce547d64d6e1f2986c313407deffef" name="tests/ApiVersionTests.php" role="test" />
   <file baseinstalldir="/" md5sum="2d0427db94790df7ada24a744547edf5" name="tests/AttributesToStringTests.php" role="test" />
   <file baseinstalldir="/" md5sum="673d1438c4718a70c5da3fe019027db4" name="tests/CollapseEmptyTagsTests.php" role="test" />
   <file baseinstalldir="/" md5sum="46b981f91edd163f1cd021cfef5d1bb1" name="tests/CreateCDataSectionTests.php" role="test" />
   <file baseinstalldir="/" md5sum="6aa925b879572e9b3f1885b7cdbb223b" name="tests/CreateCommentTests.php" role="test" />
   <file baseinstalldir="/" md5sum="dbc083b62a020fa245fde5a7828a4806" name="tests/CreateEndElementTests.php" role="test" />
   <file baseinstalldir="/" md5sum="f58e38343ecf60811c842d4cfc8194ae" name="tests/CreateStartElementTests.php" role="test" />
   <file baseinstalldir="/" md5sum="9385fba272f4ebccf4c95d43d16dcff4" name="tests/CreateTagTests.php" role="test" />
   <file baseinstalldir="/" md5sum="51e7ba1390e6dadc3c0be0c960bf171d" name="tests/CreateTagFromArrayTests.php" role="test" />
   <file baseinstalldir="/" md5sum="6bbb54ef4cf56dc2c0b558b295de5668" name="tests/GetDocTypeDeclarationTests.php" role="test" />
   <file baseinstalldir="/" md5sum="825b440b0ee8abd10b4df017c08bf15f" name="tests/GetXmlDeclarationTests.php" role="test" />
   <file baseinstalldir="/" md5sum="e6783bb330f8f2ae7225f02d56f194e4" name="tests/IsValidNameTests.php" role="test" />
   <file baseinstalldir="/" md5sum="b273525b905ae6d5fc53adcb3ce0b8d9" name="tests/RaiseErrorTests.php" role="test" />
   <file baseinstalldir="/" md5sum="20befbef5e55639539336761a17c64f3" name="tests/ReplaceEntitiesTests.php" role="test" />
   <file baseinstalldir="/" md5sum="a3ceff3302e31f90130be01c312b33b3" name="tests/ReverseEntitiesTests.php" role="test" />
   <file baseinstalldir="/" md5sum="aeb95108896180ef77a7dce3c310a3b8" name="tests/SplitQualifiedNameTests.php" role="test" />
   <file baseinstalldir="/" md5sum="e93010b1eff68f889fefcb006bf20b63" name="tests/Bug4950Tests.php" role="test" />
   <file baseinstalldir="/" md5sum="748ffb640e13e7b960385c7e12413782" name="tests/Bug5392Tests.php" role="test" />
   <file baseinstalldir="/" md5sum="01e68b66e27a6fdb197d572c67ae6bc5" name="tests/Bug18343Tests.php" role="test" />
   <file baseinstalldir="/" md5sum="d945220c38344bc773b18244439bb0cc" name="tests/Bug21177Tests.php" role="test" />
   <file baseinstalldir="/" md5sum="af2672bb90875c2e00f93f563bfafe70" name="tests/Bug21184Tests.php" role="test" />
   <file baseinstalldir="/" md5sum="0db6fa9c169bf6904aa7e588c2325a13" name="XML/Util.php" role="php">
    <tasks:replace from="@version@" to="version" type="package-info" />
   </file>
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.4.0</min>
   </php>
   <pearinstaller>
    <min>1.9.0</min>
   </pearinstaller>
   <extension>
    <name>pcre</name>
   </extension>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>0.1</release>
    <api>0.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-08-01</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
inital release
   </notes>
  </release>
  <release>
   <version>
    <release>0.1.1</release>
    <api>0.1.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-08-02</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
bugfix: removed bug in createTagFromArray
   </notes>
  </release>
  <release>
   <version>
    <release>0.2</release>
    <api>0.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-08-12</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
added XML_Util::getDocTypeDeclaration()
   </notes>
  </release>
  <release>
   <version>
    <release>0.2.1</release>
    <api>0.2.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-05</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
fixed bug with zero as tag content in createTagFromArray and createTag
   </notes>
  </release>
  <release>
   <version>
    <release>0.3</release>
    <api>0.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-12</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
added createStartElement() and createEndElement()
   </notes>
  </release>
  <release>
   <version>
    <release>0.4</release>
    <api>0.4</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-21</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
added createCDataSection(),
added support for CData sections in createTag* methods,
fixed bug #23,
fixed bug in splitQualifiedName()
   </notes>
  </release>
  <release>
   <version>
    <release>0.5</release>
    <api>0.5</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-23</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
added support for multiline attributes in attributesToString(), createTag*() and createStartElement (requested by Yavor Shahpasov for XML_Serializer),
added createComment
   </notes>
  </release>
  <release>
   <version>
    <release>0.5.1</release>
    <api>0.5.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-09-26</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
added default namespace parameter (optional) in splitQualifiedName() (requested by Sebastian Bergmann)
   </notes>
  </release>
  <release>
   <version>
    <release>0.5.2</release>
    <api>0.5.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2003-11-22</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
now creates XHTML compliant empty tags (Davey),
minor whitespace fixes (Davey)
   </notes>
  </release>
  <release>
   <version>
    <release>0.6.0beta1</release>
    <api>0.6.0beta1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2004-05-24</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Fixed bug 1438 (namespaces not accepted for isValidName()) (thanks to davey)
- added optional parameter to replaceEntities() to define the set of entities to replace
- added optional parameter to attributesToString() to define, whether entities should be replaced (requested by Sebastian Bergmann)
- allowed second parameter to XML_Util::attributesToString() to be an array containing options (easier to use, if you only need to set the last parameter)
- introduced XML_Util::raiseError() to avoid the necessity of including PEAR.php, will only be included on error
   </notes>
  </release>
  <release>
   <version>
    <release>0.6.0</release>
    <api>0.6.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-06-07</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Fixed bug 1438 (namespaces not accepted for isValidName()) (thanks to davey)
- added optional parameter to replaceEntities() to define the set of entities to replace
- added optional parameter to attributesToString() to define, whether entities should be replaced (requested by Sebastian Bergmann)
- allowed second parameter to XML_Util::attributesToString() to be an array containing options (easier to use, if you only need to set the last parameter)
- introduced XML_Util::raiseError() to avoid the necessity of including PEAR.php, will only be included on error
   </notes>
  </release>
  <release>
   <version>
    <release>0.6.1</release>
    <api>0.6.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-10-28</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Added check for tag name (either as local part or qualified name) in createTagFromArray() (bug #1083)
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.0</release>
    <api>1.0.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-10-28</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Added reverseEntities() (request #2639)
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.0</release>
    <api>1.1.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-11-19</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Added collapseEmptyTags (patch by Sebastian Bergmann and Thomas Duffey)
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.1</release>
    <api>1.1.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-12-23</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- fixed bug in replaceEntities() and reverseEntities() in conjunction with XML_UTIL_ENTITIES_HTML
- createTag() and createTagFromArray() now accept XML_UTIL_ENTITIES_XML, XML_UTIL_ENTITIES_XML_REQUIRED, XML_UTIL_ENTITIES_HTML, XML_UTIL_ENTITIES_NONE and XML_UTIL_CDATA_SECTION as $replaceEntities parameter
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.2</release>
    <api>1.1.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2006-12-01</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- fixed bug #5419: isValidName() now checks for character classes
- implemented request #8196: added optional parameter to influence array sorting to createTag() createTagFromArray() and createStartElement()
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.4</release>
    <api>1.1.4</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2006-12-16</date>
   <license uri="http://www.php.net/license">PHP License</license>
   <notes>
- Fixed bug #9561: Not allowing underscores in middle of tags
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.0a1</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>alpha</api>
   </stability>
   <date>2008-05-04</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|ja.doma]
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.0a2</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>alpha</api>
   </stability>
   <date>2008-05-22</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.0RC1</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2008-07-12</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.0</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2008-07-26</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Changed license to New BSD License (Req #13826 [ashnazg])
Added a test suite against all API methods [ashnazg]
Switch to package.xml v2 [ashnazg]
Added Req #13839: Missing XHTML empty tags to collapse [ashnazg|drry]
Fixed Bug #5392: encoding of ISO-8859-1 is the only supported encoding [ashnazg]
Fixed Bug #4950: Incorrect CDATA serializing [ashnazg|drry]
-- (this fix differs from the one in v1.2.0a1)
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.1</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2011-12-31</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Fixed Bug #14760: Bug in getDocTypeDeclaration() [ashnazg|fpospisil]
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.2</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2014-06-07</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
QA release

Bug #18343 Entities in file names decoded during packaging
Bug #19174	upgrade PHPUnit require statements &amp; other fixes (for PEAR QA Team)
Request #19750	examples/example.php encoding
   </notes>
  </release>
  <release>
   <version>
    <release>1.2.3</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2014-06-07</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
Bug #20293	Broken installation for 1.2.2
   </notes>
  </release>
  <release>
   <version>
    <release>1.3.0</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2015-02-27</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* Set minimum PHP version to 5.3.0
* Mark static methods with static keyword
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2017-02-03</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* Set minimum PHP version to 5.4.0
* Set minimum PEAR version to 1.10.1

* Adds a new XML_UTIL_COLLAPSE_NONE option
  for preventing empty tag collapsing.

* Request #15467 CDATA sections and blank nodes
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.1</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2017-02-07</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* Bug #21177 XML_Util::collapseEmptyTags() can return NULL
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.2</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2017-02-22</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* Bug #21184 Collapse issue
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.3</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2017-06-28</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* Decrease minimum PEAR version to 1.9.0 to allow PEAR upgrades
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.4</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2019-12-05</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* PR #11: fix phplint warning
   </notes>
  </release>
  <release>
   <version>
    <release>1.4.5</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2020-04-19</date>
   <license uri="http://opensource.org/licenses/bsd-license">BSD License</license>
   <notes>
* PR #12: fix Trying to access array offset on value of type int
   </notes>
  </release>
 </changelog>
</package>
PK�^�\>t�B�B+pear/.pkgxml/Symfony2_Translation-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Translation</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Translation Component</summary>
 <description>Symfony2 Translation Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:50</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="a23a3ebc32ad216eceb315d156d172df" name="Symfony/Component/Translation/autoloader.php" role="php" />
   <file md5sum="1b1901736a193dd839f00675dbe001e1" name="Symfony/Component/Translation/Catalogue/AbstractOperation.php" role="php" />
   <file md5sum="1facd3924e3312ac6a9f6b9f586d84ae" name="Symfony/Component/Translation/Catalogue/DiffOperation.php" role="php" />
   <file md5sum="c697c25f56c1bc59faffd23ae1bf5910" name="Symfony/Component/Translation/Catalogue/MergeOperation.php" role="php" />
   <file md5sum="6b00bea9c66c6934740b6f5735573ed1" name="Symfony/Component/Translation/Catalogue/OperationInterface.php" role="php" />
   <file md5sum="33507730a223e93eab19a4481c82d258" name="Symfony/Component/Translation/CHANGELOG.md" role="doc" />
   <file md5sum="08bb0002b0d0c9ef06a74417374b0db0" name="Symfony/Component/Translation/composer.json" role="doc" />
   <file md5sum="af3a8b385fed749c0606e72124fc01c8" name="Symfony/Component/Translation/Dumper/CsvFileDumper.php" role="php" />
   <file md5sum="97df468b756ed060c2d9002ffb331f4c" name="Symfony/Component/Translation/Dumper/DumperInterface.php" role="php" />
   <file md5sum="dd3b41f5ce0c7514217ae51ee01fd9b3" name="Symfony/Component/Translation/Dumper/FileDumper.php" role="php" />
   <file md5sum="a2a5ea6e4a593fdb3ac4eb52b08c8fca" name="Symfony/Component/Translation/Dumper/IcuResFileDumper.php" role="php" />
   <file md5sum="aa41a897df4b252a6763a7206a64740e" name="Symfony/Component/Translation/Dumper/IniFileDumper.php" role="php" />
   <file md5sum="590cefb5e2fdc8d5163101d1dea6c00c" name="Symfony/Component/Translation/Dumper/JsonFileDumper.php" role="php" />
   <file md5sum="b221f1f93992940b41df842c71612a08" name="Symfony/Component/Translation/Dumper/MoFileDumper.php" role="php" />
   <file md5sum="3a4faacf4648772530eddd7b531a914e" name="Symfony/Component/Translation/Dumper/PhpFileDumper.php" role="php" />
   <file md5sum="151ba9edbfad4aad3a01404ed2d08aed" name="Symfony/Component/Translation/Dumper/PoFileDumper.php" role="php" />
   <file md5sum="97630cc685afa03a45769ce3c0c2d7b6" name="Symfony/Component/Translation/Dumper/QtFileDumper.php" role="php" />
   <file md5sum="c50058cbe84ee0d6bc0c4291ac3c89e4" name="Symfony/Component/Translation/Dumper/XliffFileDumper.php" role="php" />
   <file md5sum="6cb4733897f48f15596acd385bf27e6b" name="Symfony/Component/Translation/Dumper/YamlFileDumper.php" role="php" />
   <file md5sum="3f815f25d3ba7fb52caf40896c1a3bfe" name="Symfony/Component/Translation/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="2107111761ca276662adca40be545bbe" name="Symfony/Component/Translation/Exception/InvalidResourceException.php" role="php" />
   <file md5sum="7022eff2bccadddbd74f490fb372cf54" name="Symfony/Component/Translation/Exception/NotFoundResourceException.php" role="php" />
   <file md5sum="4594ea6e9bb83b2e11669b85cc5124fa" name="Symfony/Component/Translation/Extractor/ChainExtractor.php" role="php" />
   <file md5sum="63c8d0cc53c869dc53eddb8bf644694a" name="Symfony/Component/Translation/Extractor/ExtractorInterface.php" role="php" />
   <file md5sum="be99041f6caf9560d052545df078a511" name="Symfony/Component/Translation/IdentityTranslator.php" role="php" />
   <file md5sum="84efe2082056a419a58c16cb7735ca56" name="Symfony/Component/Translation/Interval.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Translation/LICENSE" role="doc" />
   <file md5sum="d6585b0daa5d9b9dbd3aec8f1333b890" name="Symfony/Component/Translation/Loader/ArrayLoader.php" role="php" />
   <file md5sum="6ceb1af587dc0cc6c6545852f2b9f89b" name="Symfony/Component/Translation/Loader/CsvFileLoader.php" role="php" />
   <file md5sum="ecc212d52f34f5ad922845af7d071fe7" name="Symfony/Component/Translation/Loader/IcuDatFileLoader.php" role="php" />
   <file md5sum="66f2c067c6e251949024920f3bb13578" name="Symfony/Component/Translation/Loader/IcuResFileLoader.php" role="php" />
   <file md5sum="d9f98317740467a87c342bd7e44a2faa" name="Symfony/Component/Translation/Loader/IniFileLoader.php" role="php" />
   <file md5sum="5b744ab916a07e52c924b2d9712172e9" name="Symfony/Component/Translation/Loader/JsonFileLoader.php" role="php" />
   <file md5sum="8d375de50d632c97a369003780044ef6" name="Symfony/Component/Translation/Loader/LoaderInterface.php" role="php" />
   <file md5sum="00cd7c30a5185244b22912679da90d12" name="Symfony/Component/Translation/Loader/MoFileLoader.php" role="php" />
   <file md5sum="bb211aa1fd5d3d46d8f9fc2e0b630bbb" name="Symfony/Component/Translation/Loader/PhpFileLoader.php" role="php" />
   <file md5sum="7c81a6760f547728df4c0e7137c92cf7" name="Symfony/Component/Translation/Loader/PoFileLoader.php" role="php" />
   <file md5sum="50a221b191e5f83a44b03dfa6195ef3c" name="Symfony/Component/Translation/Loader/QtFileLoader.php" role="php" />
   <file md5sum="fd528a896f7c6792b370930f64e58a2a" name="Symfony/Component/Translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd" role="php" />
   <file md5sum="8b0466500a88d4e511342b555534b991" name="Symfony/Component/Translation/Loader/schema/dic/xliff-core/xml.xsd" role="php" />
   <file md5sum="6f15280899bde6a3c9edb8d87ea9b092" name="Symfony/Component/Translation/Loader/XliffFileLoader.php" role="php" />
   <file md5sum="d468c9ed70a982ce1a2efc681d674673" name="Symfony/Component/Translation/Loader/YamlFileLoader.php" role="php" />
   <file md5sum="d151ded1a0038bed7f8c790384cb7eed" name="Symfony/Component/Translation/MessageCatalogue.php" role="php" />
   <file md5sum="f2204344dcccad5c042762fc39952f2a" name="Symfony/Component/Translation/MessageCatalogueInterface.php" role="php" />
   <file md5sum="52bef5f54fe4cf887d90872acba99605" name="Symfony/Component/Translation/MessageSelector.php" role="php" />
   <file md5sum="307866c58d58dd1e9370ad0d2c9b172a" name="Symfony/Component/Translation/MetadataAwareInterface.php" role="php" />
   <file md5sum="10d8a0a424c95688c056eaf8607eb645" name="Symfony/Component/Translation/phpunit.xml.dist" role="test" />
   <file md5sum="72406471bc239d6b3346ca064f67b7aa" name="Symfony/Component/Translation/PluralizationRules.php" role="php" />
   <file md5sum="cbcc27d78c155093251fccc294affb72" name="Symfony/Component/Translation/README.md" role="doc" />
   <file md5sum="ef82bc07c69b7711d658500ab7dd1726" name="Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTest.php" role="test" />
   <file md5sum="ba72862554b59d792638dd7bbab730f9" name="Symfony/Component/Translation/Tests/Catalogue/DiffOperationTest.php" role="test" />
   <file md5sum="47b9f33d19218deaf1497d67c08212c4" name="Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php" role="test" />
   <file md5sum="44032d28b28576fee4042715bbacf582" name="Symfony/Component/Translation/Tests/Dumper/CsvFileDumperTest.php" role="test" />
   <file md5sum="c9821802aa5b2075947b3154d4d111a9" name="Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.php" role="test" />
   <file md5sum="b655aaa49e41936ffe308420769beead" name="Symfony/Component/Translation/Tests/Dumper/IniFileDumperTest.php" role="test" />
   <file md5sum="7777f4777f747b0d66a09b38aba33417" name="Symfony/Component/Translation/Tests/Dumper/JsonFileDumperTest.php" role="test" />
   <file md5sum="3691ee670197459ebef5ec634245d931" name="Symfony/Component/Translation/Tests/Dumper/MoFileDumperTest.php" role="test" />
   <file md5sum="f5359d8c55084adf386b7a09f084a314" name="Symfony/Component/Translation/Tests/Dumper/PhpFileDumperTest.php" role="test" />
   <file md5sum="f61a83220a0aa1785ea3f8b718cbaed0" name="Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.php" role="test" />
   <file md5sum="4f15fb0434c84bfda4ce4c7d838f134b" name="Symfony/Component/Translation/Tests/Dumper/QtFileDumperTest.php" role="test" />
   <file md5sum="fa10f05c9186753ac947af63fafc4f04" name="Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php" role="test" />
   <file md5sum="06948c7abe303c1e5b7b65b3cd2c6d25" name="Symfony/Component/Translation/Tests/Dumper/YamlFileDumperTest.php" role="test" />
   <file md5sum="b1a95afebdd5bf7aea9b2e18853e026d" name="Symfony/Component/Translation/Tests/fixtures/empty-translation.po" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Translation/Tests/fixtures/empty.csv" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Translation/Tests/fixtures/empty.ini" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Translation/Tests/fixtures/empty.json" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Translation/Tests/fixtures/empty.mo" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Translation/Tests/fixtures/empty.po" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Translation/Tests/fixtures/empty.xlf" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Translation/Tests/fixtures/empty.yml" role="test" />
   <file md5sum="41f6a7717a25819ac739a14696c0d862" name="Symfony/Component/Translation/Tests/fixtures/encoding.xlf" role="test" />
   <file md5sum="9bbb4b898a5bf5df996cd16e81cf28b8" name="Symfony/Component/Translation/Tests/fixtures/invalid-xml-resources.xlf" role="test" />
   <file md5sum="4b5652237273550cf07bb6553590ed96" name="Symfony/Component/Translation/Tests/fixtures/malformed.json" role="test" />
   <file md5sum="35641dad0a0e32afc365268d7cb35f5c" name="Symfony/Component/Translation/Tests/fixtures/non-valid.xlf" role="test" />
   <file md5sum="d3b07384d113edec49eaa6238ad5ff00" name="Symfony/Component/Translation/Tests/fixtures/non-valid.yml" role="test" />
   <file md5sum="edbf7f268cd369b124286c4eaccc5da6" name="Symfony/Component/Translation/Tests/fixtures/plurals.mo" role="test" />
   <file md5sum="cc4d3e4012a94aa6d416ffba63cec96a" name="Symfony/Component/Translation/Tests/fixtures/plurals.po" role="test" />
   <file md5sum="cadcf346671c0adabf12cc639338617c" name="Symfony/Component/Translation/Tests/fixtures/resname.xlf" role="test" />
   <file md5sum="bc9189406be84ec297464a514221406d" name="Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted/resources.dat" role="test" />
   <file md5sum="d3d7cb5315b72e8a10083800232f975c" name="Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.res" role="test" />
   <file md5sum="59bc61ceb778cfdad1353e72a91da038" name="Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.txt" role="test" />
   <file md5sum="bd4fd753b32b205184d61fe901f3cc99" name="Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.res" role="test" />
   <file md5sum="63b6f57aed45358ce8ee735e7d358369" name="Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.txt" role="test" />
   <file md5sum="a784644791b85cf23524cb50532459a9" name="Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/packagelist.txt" role="test" />
   <file md5sum="5db6756e72842744a2f79e7976a27b27" name="Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/resources.dat" role="test" />
   <file md5sum="936c6496f075090509a4124930e62c25" name="Symfony/Component/Translation/Tests/fixtures/resourcebundle/res/en.res" role="test" />
   <file md5sum="ca509ddac95802697c6409b6bdc24d6c" name="Symfony/Component/Translation/Tests/fixtures/resources-clean.xlf" role="test" />
   <file md5sum="349115d44a4b2b57ec0e12d5de001c1f" name="Symfony/Component/Translation/Tests/fixtures/resources.csv" role="test" />
   <file md5sum="a1c5d4a3d4363448836f7df17bd3dac9" name="Symfony/Component/Translation/Tests/fixtures/resources.ini" role="test" />
   <file md5sum="c4739e97d2e782ab9142b7cad4e36383" name="Symfony/Component/Translation/Tests/fixtures/resources.json" role="test" />
   <file md5sum="338bee6e134993372c561235d85caf5b" name="Symfony/Component/Translation/Tests/fixtures/resources.mo" role="test" />
   <file md5sum="e5269ae0ff8b573e8e88b98a013a97de" name="Symfony/Component/Translation/Tests/fixtures/resources.php" role="test" />
   <file md5sum="ebffc260ffc01b8dd02a6a548b13f7a4" name="Symfony/Component/Translation/Tests/fixtures/resources.po" role="test" />
   <file md5sum="01ebead5e039c0d1301339fef7b7fd18" name="Symfony/Component/Translation/Tests/fixtures/resources.ts" role="test" />
   <file md5sum="3046798068871c144081a6dad3f88e3d" name="Symfony/Component/Translation/Tests/fixtures/resources.xlf" role="test" />
   <file md5sum="721aad13918f292d25bc9dc7d61b0e9c" name="Symfony/Component/Translation/Tests/fixtures/resources.yml" role="test" />
   <file md5sum="f22180b9a31a19606112508410f0806f" name="Symfony/Component/Translation/Tests/fixtures/valid.csv" role="test" />
   <file md5sum="3a566717bf4a4cdca4fa6d9f26b9887d" name="Symfony/Component/Translation/Tests/fixtures/withdoctype.xlf" role="test" />
   <file md5sum="b92bc0ed64d6ace1904940ebacb42a9d" name="Symfony/Component/Translation/Tests/IdentityTranslatorTest.php" role="test" />
   <file md5sum="4c7466038f4c30f7e11bdf01f9de3917" name="Symfony/Component/Translation/Tests/IntervalTest.php" role="test" />
   <file md5sum="c56f359209f462724e5c38d54d04aef7" name="Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.php" role="test" />
   <file md5sum="148fb17fa10a63d083608ee34425f515" name="Symfony/Component/Translation/Tests/Loader/IcuDatFileLoaderTest.php" role="test" />
   <file md5sum="8db7645334a7fce25b180ee1e8727e12" name="Symfony/Component/Translation/Tests/Loader/IcuResFileLoaderTest.php" role="test" />
   <file md5sum="eeb81233e12eacec0fd177f1945d73e3" name="Symfony/Component/Translation/Tests/Loader/IniFileLoaderTest.php" role="test" />
   <file md5sum="e717797c994506a18cc642bba845e0bc" name="Symfony/Component/Translation/Tests/Loader/JsonFileLoaderTest.php" role="test" />
   <file md5sum="7d906668f133a0c8ad7c7fcb5770d134" name="Symfony/Component/Translation/Tests/Loader/LocalizedTestCase.php" role="test" />
   <file md5sum="e918b2beafc848955034c08ea5cd56a5" name="Symfony/Component/Translation/Tests/Loader/MoFileLoaderTest.php" role="test" />
   <file md5sum="8a494f3c229871a27bb9fab851bb385b" name="Symfony/Component/Translation/Tests/Loader/PhpFileLoaderTest.php" role="test" />
   <file md5sum="12960276054dc25012433c4e567d57b4" name="Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.php" role="test" />
   <file md5sum="2722873e9cf782a84462ce616be95f22" name="Symfony/Component/Translation/Tests/Loader/QtFileLoaderTest.php" role="test" />
   <file md5sum="ae55951ec7a0b72a091921a92ff76992" name="Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.php" role="test" />
   <file md5sum="b14fcada262a8c6207dd0cc66ec1242b" name="Symfony/Component/Translation/Tests/Loader/YamlFileLoaderTest.php" role="test" />
   <file md5sum="872c308ce18aec6300ccf4528c935a19" name="Symfony/Component/Translation/Tests/MessageCatalogueTest.php" role="test" />
   <file md5sum="c958676ddc85bc7f30a74a48cd800ece" name="Symfony/Component/Translation/Tests/MessageSelectorTest.php" role="test" />
   <file md5sum="a8205b61d5bb55f454536626190c7644" name="Symfony/Component/Translation/Tests/PluralizationRulesTest.php" role="test" />
   <file md5sum="c186f9c867c206f22c1d85c81a6079d0" name="Symfony/Component/Translation/Tests/TranslatorTest.php" role="test" />
   <file md5sum="d001250c9d39b0e193dc7952d7a81380" name="Symfony/Component/Translation/Translator.php" role="php" />
   <file md5sum="5ce4343a5bf5d91357af795a7e800158" name="Symfony/Component/Translation/TranslatorInterface.php" role="php" />
   <file md5sum="292d9794772f9374b181254742a2428b" name="Symfony/Component/Translation/Writer/TranslationWriter.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
  <optional>
   <package>
    <name>Config</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\��-=-='pear/.pkgxml/Symfony2_Routing-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Routing</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Routing Component</summary>
 <description>Symfony2 Routing Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:49</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="7adb81f5e4787d2604f54309fff0e3bb" name="Symfony/Component/Routing/Annotation/Route.php" role="php" />
   <file md5sum="b60bdd621fae7d13b678e3f113935112" name="Symfony/Component/Routing/autoloader.php" role="php" />
   <file md5sum="cb1e57ece0f6472ce554be747e48c528" name="Symfony/Component/Routing/CHANGELOG.md" role="doc" />
   <file md5sum="0baf57eaa3bff7b952d404d0dd811ad3" name="Symfony/Component/Routing/CompiledRoute.php" role="php" />
   <file md5sum="e68bb57f1159982d6ccb4bf32818a790" name="Symfony/Component/Routing/composer.json" role="doc" />
   <file md5sum="3d64f0b57c301a19b85b92d88902f492" name="Symfony/Component/Routing/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="6b093524c85d31ed964c1da598962df7" name="Symfony/Component/Routing/Exception/InvalidParameterException.php" role="php" />
   <file md5sum="2c38201b0c1a4c837e95d468dd663e3b" name="Symfony/Component/Routing/Exception/MethodNotAllowedException.php" role="php" />
   <file md5sum="d2b4c2e8f43f6fd41e2c37bd6393d2d0" name="Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php" role="php" />
   <file md5sum="a8e5469ab6552d46a8f20e6f7f63f76f" name="Symfony/Component/Routing/Exception/ResourceNotFoundException.php" role="php" />
   <file md5sum="5bf9cdaf9c5be880c320f3e547b7321c" name="Symfony/Component/Routing/Exception/RouteNotFoundException.php" role="php" />
   <file md5sum="a387ca727c49a190b907162d5cf0239e" name="Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php" role="php" />
   <file md5sum="585bce412c6f8b482b00264f04f8904f" name="Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php" role="php" />
   <file md5sum="93d6bfa4c5d22436fdb2fabb49eb6116" name="Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php" role="php" />
   <file md5sum="0895f6715cb9ad1780264962b2e71b64" name="Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php" role="php" />
   <file md5sum="ae2d46c136e52ed92d5b3a0485406adc" name="Symfony/Component/Routing/Generator/UrlGenerator.php" role="php" />
   <file md5sum="8abf3d984c783ee04d6a04a1ede324bd" name="Symfony/Component/Routing/Generator/UrlGeneratorInterface.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Routing/LICENSE" role="doc" />
   <file md5sum="dd2947b7d0e4a3806e8055fb51ba23ff" name="Symfony/Component/Routing/Loader/AnnotationClassLoader.php" role="php" />
   <file md5sum="7bea5831e2002735dee1875edf8526c6" name="Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php" role="php" />
   <file md5sum="6119f0547ce407854362d4acb8eca23b" name="Symfony/Component/Routing/Loader/AnnotationFileLoader.php" role="php" />
   <file md5sum="401fa43c0b8ba75aee4d6ee205f5de8e" name="Symfony/Component/Routing/Loader/ClosureLoader.php" role="php" />
   <file md5sum="a19db6de99eb2baddcd560a30c232ecd" name="Symfony/Component/Routing/Loader/PhpFileLoader.php" role="php" />
   <file md5sum="e03178ea7d1f063fd89ee2c8218f5b78" name="Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd" role="php" />
   <file md5sum="7e21f6c0b962f4cbb156dc81e73732a2" name="Symfony/Component/Routing/Loader/XmlFileLoader.php" role="php" />
   <file md5sum="459710f5848da9859f1569234a0b578e" name="Symfony/Component/Routing/Loader/YamlFileLoader.php" role="php" />
   <file md5sum="507197805b62457c0fe43210c946e931" name="Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php" role="php" />
   <file md5sum="c5f1fa04cbb07a028e79f7c442fc87ca" name="Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php" role="php" />
   <file md5sum="df4c19109cb173cd91453733a9c97922" name="Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php" role="php" />
   <file md5sum="45c403eb0f5db93743a04d64c11e4b10" name="Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php" role="php" />
   <file md5sum="850971f7d3c0b766bb8b63bb7f59cd2e" name="Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php" role="php" />
   <file md5sum="d3d51e47a11338eb959efbc24c56d157" name="Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php" role="php" />
   <file md5sum="12d3638dbfcc3ecbc7e5e16c46b0a18c" name="Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php" role="php" />
   <file md5sum="9daade9ffbdeff369f03818ef2f73ce2" name="Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php" role="php" />
   <file md5sum="357c83fcf951bdb206fca135dca5bb07" name="Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php" role="php" />
   <file md5sum="001a000c9776f18c43a8ee4664b6e163" name="Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php" role="php" />
   <file md5sum="c623f743ec5d8113a010c2305f64b21e" name="Symfony/Component/Routing/Matcher/RequestMatcherInterface.php" role="php" />
   <file md5sum="6c48a62311dd625f0d624495e1d5d6e3" name="Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php" role="php" />
   <file md5sum="0527f51011e56d17b92c0cd5ae204d54" name="Symfony/Component/Routing/Matcher/UrlMatcher.php" role="php" />
   <file md5sum="ebcef73fd69167569dbf16207a5cc2b4" name="Symfony/Component/Routing/Matcher/UrlMatcherInterface.php" role="php" />
   <file md5sum="306433f88b741f2d72b11ff338743859" name="Symfony/Component/Routing/phpunit.xml.dist" role="test" />
   <file md5sum="f72998925a6eca826c1fe39175f7b63b" name="Symfony/Component/Routing/README.md" role="doc" />
   <file md5sum="516eaca4237df46d98fa7a57e8937fc2" name="Symfony/Component/Routing/RequestContext.php" role="php" />
   <file md5sum="2c9cdcdd343d5761f123e325f96027a2" name="Symfony/Component/Routing/RequestContextAwareInterface.php" role="php" />
   <file md5sum="a0b6b35abcbed3f170a90c9fa56703c1" name="Symfony/Component/Routing/Route.php" role="php" />
   <file md5sum="d3c52daaaec1113c792edf9236828964" name="Symfony/Component/Routing/RouteCollection.php" role="php" />
   <file md5sum="0dde56b2dd439922f60b19cc24ce00eb" name="Symfony/Component/Routing/RouteCompiler.php" role="php" />
   <file md5sum="9bade2ca282845cdce2120a21147f955" name="Symfony/Component/Routing/RouteCompilerInterface.php" role="php" />
   <file md5sum="cfa1e77acc20b94d2869303a3e343bdd" name="Symfony/Component/Routing/Router.php" role="php" />
   <file md5sum="28c2b609f629bb9c437624f5f9897a7f" name="Symfony/Component/Routing/RouterInterface.php" role="php" />
   <file md5sum="95f849d5323f5a02d2c1b26009cff39a" name="Symfony/Component/Routing/Tests/Annotation/RouteTest.php" role="test" />
   <file md5sum="329dc6eb58ed2841e9dff812a6f04f93" name="Symfony/Component/Routing/Tests/CompiledRouteTest.php" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Routing/Tests/Fixtures/annotated.php" role="test" />
   <file md5sum="8faac9caece520eabbf87e072d996583" name="Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php" role="test" />
   <file md5sum="be20633112a29f2ada4e2989a31b7dc9" name="Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php" role="test" />
   <file md5sum="1ec3b14820cead74554134842fa3498b" name="Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php" role="test" />
   <file md5sum="3cad48848f57310d3f0136f2cff860f2" name="Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php" role="test" />
   <file md5sum="6ee192ca9034e12e89cb048b31f8e208" name="Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.apache" role="test" />
   <file md5sum="371781bd5bc58854e49e0b583470c685" name="Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php" role="test" />
   <file md5sum="24139b71d25f2706f9956ce94ec65d99" name="Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.apache" role="test" />
   <file md5sum="3cd94c1ff96c25218039f7c6aefb56f2" name="Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php" role="test" />
   <file md5sum="dd7da1ea21e2d886d079594d07e167dc" name="Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Routing/Tests/Fixtures/empty.yml" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Routing/Tests/Fixtures/foo.xml" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Routing/Tests/Fixtures/foo1.xml" role="test" />
   <file md5sum="bf3dd20043754c68c898fdfa423fe222" name="Symfony/Component/Routing/Tests/Fixtures/incomplete.yml" role="test" />
   <file md5sum="d8e1d3483f7f8ccf90232bd90127aa92" name="Symfony/Component/Routing/Tests/Fixtures/missing_id.xml" role="test" />
   <file md5sum="7cfffc2477dfdf9f9ae10de26b0fb51a" name="Symfony/Component/Routing/Tests/Fixtures/missing_path.xml" role="test" />
   <file md5sum="cf3966d1a8d8470e67a08ae431058d0f" name="Symfony/Component/Routing/Tests/Fixtures/namespaceprefix.xml" role="test" />
   <file md5sum="0612cba8c11d5b3cb54e50b2c749c21c" name="Symfony/Component/Routing/Tests/Fixtures/nonesense_resource_plus_path.yml" role="test" />
   <file md5sum="8018429bdc8e300ac75c368660613c86" name="Symfony/Component/Routing/Tests/Fixtures/nonesense_type_without_resource.yml" role="test" />
   <file md5sum="bc542914570693788cf3a8d2afbd45c2" name="Symfony/Component/Routing/Tests/Fixtures/nonvalid.xml" role="test" />
   <file md5sum="d3b07384d113edec49eaa6238ad5ff00" name="Symfony/Component/Routing/Tests/Fixtures/nonvalid.yml" role="test" />
   <file md5sum="55ada43e144278e471a7ba1cdd7cc295" name="Symfony/Component/Routing/Tests/Fixtures/nonvalid2.yml" role="test" />
   <file md5sum="70579c6820523185fc90f5373c3821fd" name="Symfony/Component/Routing/Tests/Fixtures/nonvalidkeys.yml" role="test" />
   <file md5sum="c859068a6d836761e048cd0edb727dcb" name="Symfony/Component/Routing/Tests/Fixtures/nonvalidnode.xml" role="test" />
   <file md5sum="a4e93f76c7e4364bae051528417adfb2" name="Symfony/Component/Routing/Tests/Fixtures/nonvalidroute.xml" role="test" />
   <file md5sum="682451e5c01e3d3dd757fc8919d1d43c" name="Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php" role="test" />
   <file md5sum="7586d7599fd0f4df8c339cb951e96497" name="Symfony/Component/Routing/Tests/Fixtures/special_route_name.yml" role="test" />
   <file md5sum="38aeb5d4ba857600ef5c0215739453c5" name="Symfony/Component/Routing/Tests/Fixtures/validpattern.php" role="test" />
   <file md5sum="56524e1e940a4197127becdfd7268a10" name="Symfony/Component/Routing/Tests/Fixtures/validpattern.xml" role="test" />
   <file md5sum="24dd856c57527517f9280aaa43bef110" name="Symfony/Component/Routing/Tests/Fixtures/validpattern.yml" role="test" />
   <file md5sum="839c3e52a85f8e4d6beee322a3115d93" name="Symfony/Component/Routing/Tests/Fixtures/validresource.xml" role="test" />
   <file md5sum="e2fd3dead2fc9206e2d3fe8a33bfdedb" name="Symfony/Component/Routing/Tests/Fixtures/validresource.yml" role="test" />
   <file md5sum="561c119c08673fd8436e11424a20d808" name="Symfony/Component/Routing/Tests/Fixtures/withdoctype.xml" role="test" />
   <file md5sum="7a9b9b426e9cbbe3c69b31c5a7ad0890" name="Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php" role="test" />
   <file md5sum="5d99c062e8a7e57006a53e6579ac95c0" name="Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php" role="test" />
   <file md5sum="5639a76d09ef4f3443810984ed8984ef" name="Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.php" role="test" />
   <file md5sum="2f7f7a0c885391b6b97e8a99883ea05d" name="Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php" role="test" />
   <file md5sum="dbfce1fde62363437f0aa8a33613e97c" name="Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.php" role="test" />
   <file md5sum="4dfd29898087da820c09e85719a5c792" name="Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php" role="test" />
   <file md5sum="7046a86d62fbf762f17b4776eccb4dc4" name="Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.php" role="test" />
   <file md5sum="a2ab975045a0d412efbf0d5ac222972c" name="Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php" role="test" />
   <file md5sum="8d8319c0bc762ca704bb7908703d0c7e" name="Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php" role="test" />
   <file md5sum="eebeb2d76e8045aa0098090259de5ee4" name="Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php" role="test" />
   <file md5sum="ba1d59f0b0d653e1aaf3ee0c6649bff7" name="Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php" role="test" />
   <file md5sum="0642be5053da073e465f18f1b8fd887d" name="Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php" role="test" />
   <file md5sum="b35d71387dc9d1d3240600e639f1bd9c" name="Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.php" role="test" />
   <file md5sum="4c13ddc57f8c8669a7d0527d745b8a68" name="Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php" role="test" />
   <file md5sum="84d694ec0d369ec8cc64177e4a1dc08d" name="Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php" role="test" />
   <file md5sum="ea86e71e661f737eb99b92f42c9b6eb4" name="Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php" role="test" />
   <file md5sum="7ea68114d0c4d2f15535a6f6af9c4f16" name="Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php" role="test" />
   <file md5sum="59b53c89eb44b45ad22a2e44e3cd7eea" name="Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php" role="test" />
   <file md5sum="504c9fa5bc66cfd0cfa38d73fbacfee5" name="Symfony/Component/Routing/Tests/RequestContextTest.php" role="test" />
   <file md5sum="f9071d027efd59e4a55cfbbdd9af4819" name="Symfony/Component/Routing/Tests/RouteCollectionTest.php" role="test" />
   <file md5sum="f0ee1d58dd4ec0723688cab9d08adc4e" name="Symfony/Component/Routing/Tests/RouteCompilerTest.php" role="test" />
   <file md5sum="5188e029a746903602beab36af4502b7" name="Symfony/Component/Routing/Tests/RouterTest.php" role="test" />
   <file md5sum="88ef12b30bd938f7583c2e9afc89b6f9" name="Symfony/Component/Routing/Tests/RouteTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
  <optional>
   <package>
    <name>Config</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Yaml</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\'J�z++pear/.pkgxml/symfony2.xmlnu�[���<?xml version="1.0" encoding="UTF-8" ?>
<channel version="1.0" xmlns="http://pear.php.net/channel-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/channel-1.0 http://pear.php.net/dtd/channel-1.0.xsd">
    <name>pear.symfony.com</name>
    <summary>Symfony2 PEAR channel</summary>
    <suggestedalias>symfony2</suggestedalias>
    <servers>
        <primary>
            <rest>
                <baseurl type="REST1.0">http://pear.symfony.com/rest/</baseurl>
                <baseurl type="REST1.1">http://pear.symfony.com/rest/</baseurl>
                <baseurl type="REST1.2">http://pear.symfony.com/rest/</baseurl>
                <baseurl type="REST1.3">http://pear.symfony.com/rest/</baseurl>
            </rest>
        </primary>
    </servers>
</channel>PK�^�\�k�b��/pear/.pkgxml/Symfony2_EventDispatcher-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>EventDispatcher</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 EventDispatcher Component</summary>
 <description>Symfony2 EventDispatcher Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:43</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="fee3b581ae2d88dae9a188672e9371fa" name="Symfony/Component/EventDispatcher/autoloader.php" role="php" />
   <file md5sum="c627c4133ea8e24eb579e4dafe26a9f1" name="Symfony/Component/EventDispatcher/CHANGELOG.md" role="doc" />
   <file md5sum="d93bc8dae4fd133748a9bd4ad791032b" name="Symfony/Component/EventDispatcher/composer.json" role="doc" />
   <file md5sum="1f7db4681cb831f0f261094e9dea7df8" name="Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php" role="php" />
   <file md5sum="ec4b2758339bbb8439f50ae9b6134edf" name="Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php" role="php" />
   <file md5sum="d46c34f8bacd815af9a3af406d3b2ce9" name="Symfony/Component/EventDispatcher/Event.php" role="php" />
   <file md5sum="7d4dcc000083c4f160538b434cf9e178" name="Symfony/Component/EventDispatcher/EventDispatcher.php" role="php" />
   <file md5sum="e248cdbdf829780d183ee5e4aaab2055" name="Symfony/Component/EventDispatcher/EventDispatcherInterface.php" role="php" />
   <file md5sum="6bc33100c6e66896fb9145e1bd4b8b85" name="Symfony/Component/EventDispatcher/EventSubscriberInterface.php" role="php" />
   <file md5sum="db4fa1cfbad8c627e27697d8c7bcb7fd" name="Symfony/Component/EventDispatcher/GenericEvent.php" role="php" />
   <file md5sum="94bee16721f3a1a865fc870941ec34f4" name="Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/EventDispatcher/LICENSE" role="doc" />
   <file md5sum="8131bd69d2ff57e333e8920e29dd03c1" name="Symfony/Component/EventDispatcher/phpunit.xml.dist" role="test" />
   <file md5sum="1732bff29f8f1972e7ba9430ed2881f0" name="Symfony/Component/EventDispatcher/README.md" role="doc" />
   <file md5sum="5c527c6cda062487fd8f233918023177" name="Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php" role="test" />
   <file md5sum="1c72dfdf259e21f9ece7d32f7cb57333" name="Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php" role="test" />
   <file md5sum="2d8c1f9d12f69cfd4420faf7874573ab" name="Symfony/Component/EventDispatcher/Tests/EventTest.php" role="test" />
   <file md5sum="8afc099e4ad8943631f79a86c5c17313" name="Symfony/Component/EventDispatcher/Tests/GenericEventTest.php" role="test" />
   <file md5sum="98be8e6e205035fbd3213cd1a5ebd68d" name="Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\�ಹ��pear/.pkgxml/Pear.listnu�[���pear.php.net/Auth_SASL
pear.php.net/Mail
pear.php.net/Mail_Mime
pear.php.net/Mail_mimeDecode
pear.php.net/Net_IDNA2
pear.php.net/Net_SMTP
pear.php.net/Net_Sieve
pear.php.net/Net_Socket
pear.php.net/Structures_LinkedList
PK�^�\u&6��%�%*pear/.pkgxml/Symfony2_TwigBridge-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>TwigBridge</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Twig Bridge</summary>
 <description>Symfony2 Twig Bridge</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:40</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="e563ac483a8dbba1bc0548a4235a144a" name="Symfony/Bridge/Twig/autoloader.php" role="php" />
   <file md5sum="24b7a25e7391c3ca87f58d8a328a10f9" name="Symfony/Bridge/Twig/CHANGELOG.md" role="doc" />
   <file md5sum="f95ddec9fc8092fd32900b7bff18b251" name="Symfony/Bridge/Twig/composer.json" role="doc" />
   <file md5sum="ce21bdc85dfe3a9363d954915f655592" name="Symfony/Bridge/Twig/Extension/CodeExtension.php" role="php" />
   <file md5sum="65698eda8cff6e905e08122e58687c86" name="Symfony/Bridge/Twig/Extension/ExpressionExtension.php" role="php" />
   <file md5sum="c3ee7041691d8a13626e3242b50ba9a2" name="Symfony/Bridge/Twig/Extension/FormExtension.php" role="php" />
   <file md5sum="ae8fd7e7957f71843eb72b0dfea84386" name="Symfony/Bridge/Twig/Extension/HttpKernelExtension.php" role="php" />
   <file md5sum="b1e34bbc300fb73296ed795e3cf200b5" name="Symfony/Bridge/Twig/Extension/RoutingExtension.php" role="php" />
   <file md5sum="406e316d507396925ce36c5039bf0c6b" name="Symfony/Bridge/Twig/Extension/SecurityExtension.php" role="php" />
   <file md5sum="bcbf90a6081eb164ebf8aa26424034cf" name="Symfony/Bridge/Twig/Extension/StopwatchExtension.php" role="php" />
   <file md5sum="cee4a3d32bbd87757b2c6cd4de05e209" name="Symfony/Bridge/Twig/Extension/TranslationExtension.php" role="php" />
   <file md5sum="ae5855df258047211247fdfb8cb9cb9c" name="Symfony/Bridge/Twig/Extension/YamlExtension.php" role="php" />
   <file md5sum="96815060d6bee8fbcfecd4f0ca94cc7c" name="Symfony/Bridge/Twig/Form/TwigRenderer.php" role="php" />
   <file md5sum="edf3b98358b100da17afa76a9acacdd5" name="Symfony/Bridge/Twig/Form/TwigRendererEngine.php" role="php" />
   <file md5sum="02bc975c2fcb576a69c8e5ffa2e14ce5" name="Symfony/Bridge/Twig/Form/TwigRendererEngineInterface.php" role="php" />
   <file md5sum="96103a4ce079ad131d65578737a381c6" name="Symfony/Bridge/Twig/Form/TwigRendererInterface.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Bridge/Twig/LICENSE" role="doc" />
   <file md5sum="eeaac65947d7a23199b9ab2b3421295f" name="Symfony/Bridge/Twig/Node/FormEnctypeNode.php" role="php" />
   <file md5sum="a7532f88e5dbae6209363fc2d5fdc358" name="Symfony/Bridge/Twig/Node/FormThemeNode.php" role="php" />
   <file md5sum="9a15391aa07a352fae06f7ed12a9fd60" name="Symfony/Bridge/Twig/Node/RenderBlockNode.php" role="php" />
   <file md5sum="2e379adad86d64a326c899290ede04ad" name="Symfony/Bridge/Twig/Node/SearchAndRenderBlockNode.php" role="php" />
   <file md5sum="23ed426e4e8ecbb7694e7ea41b9b0890" name="Symfony/Bridge/Twig/Node/StopwatchNode.php" role="php" />
   <file md5sum="0526f6b70eaba23a52160d231433f9a2" name="Symfony/Bridge/Twig/Node/TransDefaultDomainNode.php" role="php" />
   <file md5sum="e1d88cb3d69813c50c1d7f847a3998fb" name="Symfony/Bridge/Twig/Node/TransNode.php" role="php" />
   <file md5sum="748686792da8fc6ece450126fadad7c8" name="Symfony/Bridge/Twig/NodeVisitor/Scope.php" role="php" />
   <file md5sum="519ceb71a1f48a857850fefc9f899e65" name="Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php" role="php" />
   <file md5sum="20a1ae206f399b7a45474eed11242532" name="Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php" role="php" />
   <file md5sum="b2790b452896e6c319fef59e08204ca3" name="Symfony/Bridge/Twig/phpunit.xml.dist" role="test" />
   <file md5sum="09c10943b1bd396bdd40244b6f1670de" name="Symfony/Bridge/Twig/README.md" role="doc" />
   <file md5sum="7db396d0e3531236572ab842e1d785f3" name="Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig" role="php" />
   <file md5sum="bf705e344ab695195d83108c5a744291" name="Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twig" role="php" />
   <file md5sum="62b01d26c529435b127df0b68da87a8e" name="Symfony/Bridge/Twig/Tests/Extension/child_label.html.twig" role="test" />
   <file md5sum="de9fa5a69d9ffeaace77f48c8c970a16" name="Symfony/Bridge/Twig/Tests/Extension/CodeExtensionTest.php" role="test" />
   <file md5sum="341920fd913325029b8875d19416f539" name="Symfony/Bridge/Twig/Tests/Extension/custom_widgets.html.twig" role="test" />
   <file md5sum="59f22743c289e6a916c20f335245b023" name="Symfony/Bridge/Twig/Tests/Extension/ExpressionExtensionTest.php" role="test" />
   <file md5sum="d721545275f06c65c48b93fff1d63008" name="Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubFilesystemLoader.php" role="test" />
   <file md5sum="2e4ed81306cf97510d18da3f33289fd7" name="Symfony/Bridge/Twig/Tests/Extension/Fixtures/StubTranslator.php" role="test" />
   <file md5sum="54d08b06b4f1626df69403bfba38218f" name="Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php" role="test" />
   <file md5sum="ce9150c7e8fabcbe1539051f087a5c7b" name="Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php" role="test" />
   <file md5sum="b54b450a89e781ad60a2807fb2678eeb" name="Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php" role="test" />
   <file md5sum="6753e22fa543cb3368c9e0000e2f270c" name="Symfony/Bridge/Twig/Tests/Extension/page_dynamic_extends.html.twig" role="test" />
   <file md5sum="6861f5bb94faf3b42691192cf3017750" name="Symfony/Bridge/Twig/Tests/Extension/parent_label.html.twig" role="test" />
   <file md5sum="7897b6f0d377c1dcbc7b1a9d34450b40" name="Symfony/Bridge/Twig/Tests/Extension/RoutingExtensionTest.php" role="test" />
   <file md5sum="40377cd7f95bb691e04c883df5a09db5" name="Symfony/Bridge/Twig/Tests/Extension/StopwatchExtensionTest.php" role="test" />
   <file md5sum="d43686f93a9702b4cfd91df3053b602b" name="Symfony/Bridge/Twig/Tests/Extension/theme.html.twig" role="test" />
   <file md5sum="d172147242bd0b80e328e6e9e88dd5e7" name="Symfony/Bridge/Twig/Tests/Extension/theme_extends.html.twig" role="test" />
   <file md5sum="e4a1661a04d5bafdd840b035f0c9511e" name="Symfony/Bridge/Twig/Tests/Extension/theme_use.html.twig" role="test" />
   <file md5sum="eb868a90365c1c3b2f7573551a8a45a3" name="Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php" role="test" />
   <file md5sum="0af17ef668b1281a4e89bf51028ec695" name="Symfony/Bridge/Twig/Tests/Node/FormThemeTest.php" role="test" />
   <file md5sum="7b8b963bd2b033ae246edd3ba7d6f97e" name="Symfony/Bridge/Twig/Tests/Node/SearchAndRenderBlockNodeTest.php" role="test" />
   <file md5sum="7fd3f6760029514c0a55503418d8b0b4" name="Symfony/Bridge/Twig/Tests/NodeVisitor/ScopeTest.php" role="test" />
   <file md5sum="c8f71ffe1e4fcb0bb4a69120feb30bd0" name="Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationDefaultDomainNodeVisitorTest.php" role="test" />
   <file md5sum="ec0588a5b4d7dd36d668a39a8849dd72" name="Symfony/Bridge/Twig/Tests/NodeVisitor/TranslationNodeVisitorTest.php" role="test" />
   <file md5sum="d8c329c5c7afb266a65967762f0684f2" name="Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php" role="test" />
   <file md5sum="95b22c803b2c8065500328508c60ed02" name="Symfony/Bridge/Twig/Tests/TokenParser/FormThemeTokenParserTest.php" role="test" />
   <file md5sum="9cd79976725b5279223a0e16a318f292" name="Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php" role="test" />
   <file md5sum="f73d33e407b60220f8c6af100a4d0358" name="Symfony/Bridge/Twig/Tests/TwigEngineTest.php" role="test" />
   <file md5sum="b4e9ee4d27632d7c1f1de3795480df67" name="Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php" role="php" />
   <file md5sum="748c45d30621f1f2d245102924f7fdff" name="Symfony/Bridge/Twig/TokenParser/StopwatchTokenParser.php" role="php" />
   <file md5sum="0354e3a6d83924f2da374f158de149ba" name="Symfony/Bridge/Twig/TokenParser/TransChoiceTokenParser.php" role="php" />
   <file md5sum="58650d506d0035b1622780ababcfca5a" name="Symfony/Bridge/Twig/TokenParser/TransDefaultDomainTokenParser.php" role="php" />
   <file md5sum="27e4d98f60a06de551c32d2e852c7139" name="Symfony/Bridge/Twig/TokenParser/TransTokenParser.php" role="php" />
   <file md5sum="b914862fe8b32c41e260ea530bd430f1" name="Symfony/Bridge/Twig/Translation/TwigExtractor.php" role="php" />
   <file md5sum="e11b1b874251de2867b3673a674ff71d" name="Symfony/Bridge/Twig/TwigEngine.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
  <optional>
   <package>
    <name>Form</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Routing</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Translation</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Yaml</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\��IZ��*pear/.pkgxml/Symfony2_Templating-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Templating</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Templating Component</summary>
 <description>Symfony2 Templating Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:50</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="06b983618b554cae26b0044aaa5c9d73" name="Symfony/Component/Templating/Asset/Package.php" role="php" />
   <file md5sum="7e410f0980078e771b887babe9631606" name="Symfony/Component/Templating/Asset/PackageInterface.php" role="php" />
   <file md5sum="232397a846ea18664111f3c1d12ff472" name="Symfony/Component/Templating/Asset/PathPackage.php" role="php" />
   <file md5sum="63a22883dfdbe426044cedb7d53baca1" name="Symfony/Component/Templating/Asset/UrlPackage.php" role="php" />
   <file md5sum="23396df31b16af1e830dfe9e78024cf0" name="Symfony/Component/Templating/autoloader.php" role="php" />
   <file md5sum="89d1f39500f81f0ace0eed9b8faa5551" name="Symfony/Component/Templating/CHANGELOG.md" role="doc" />
   <file md5sum="f66f26953286d35a671e8c32cd1681a8" name="Symfony/Component/Templating/composer.json" role="doc" />
   <file md5sum="642fd458181e0187d0feb00b7e0f75e6" name="Symfony/Component/Templating/DebuggerInterface.php" role="php" />
   <file md5sum="349f44b99680e0274463b4bc8a40a297" name="Symfony/Component/Templating/DelegatingEngine.php" role="php" />
   <file md5sum="d4d57b7adde79b59d61784e7101bc2b4" name="Symfony/Component/Templating/EngineInterface.php" role="php" />
   <file md5sum="efd612dd3df5651085059babfd618c0c" name="Symfony/Component/Templating/Helper/AssetsHelper.php" role="php" />
   <file md5sum="435c9f3811b3c90d60d313b68732d945" name="Symfony/Component/Templating/Helper/CoreAssetsHelper.php" role="php" />
   <file md5sum="d8603eef845f79857f5b16070419dd26" name="Symfony/Component/Templating/Helper/Helper.php" role="php" />
   <file md5sum="e8fe75ce7386af338af3950d0034097e" name="Symfony/Component/Templating/Helper/HelperInterface.php" role="php" />
   <file md5sum="57b81e8d6ab2d04742b112a8ccb4d872" name="Symfony/Component/Templating/Helper/SlotsHelper.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Templating/LICENSE" role="doc" />
   <file md5sum="89596c802c4299ca1172753ec423949b" name="Symfony/Component/Templating/Loader/CacheLoader.php" role="php" />
   <file md5sum="f59523a1dadec70ddced8d1927ffee29" name="Symfony/Component/Templating/Loader/ChainLoader.php" role="php" />
   <file md5sum="b837a9ec3d5a2db85df099eba2097698" name="Symfony/Component/Templating/Loader/FilesystemLoader.php" role="php" />
   <file md5sum="97282ffb972085264fecee72b756b3e6" name="Symfony/Component/Templating/Loader/Loader.php" role="php" />
   <file md5sum="109568b82844f26ec90af5c86612c8e9" name="Symfony/Component/Templating/Loader/LoaderInterface.php" role="php" />
   <file md5sum="3ac0b6c8fe96f6a29642e44a8b9d5a0e" name="Symfony/Component/Templating/PhpEngine.php" role="php" />
   <file md5sum="66cbf2744288df20f1abc6004d0e56d7" name="Symfony/Component/Templating/phpunit.xml.dist" role="test" />
   <file md5sum="9800cdf7c1a285748e75873cd5a2937b" name="Symfony/Component/Templating/README.md" role="doc" />
   <file md5sum="548638b42e7d927ed988b8cc3851f88d" name="Symfony/Component/Templating/Storage/FileStorage.php" role="php" />
   <file md5sum="a6f76f3ee3f61a03fe53ef24e6cb5ae7" name="Symfony/Component/Templating/Storage/Storage.php" role="php" />
   <file md5sum="226ffc381aade4bd7bb108d2c64c5c3f" name="Symfony/Component/Templating/Storage/StringStorage.php" role="php" />
   <file md5sum="28196c12bf8f3244d8147af0eb7372a6" name="Symfony/Component/Templating/StreamingEngineInterface.php" role="php" />
   <file md5sum="5b776a8c0df58c4fcfaf1e63ff35ffc6" name="Symfony/Component/Templating/TemplateNameParser.php" role="php" />
   <file md5sum="c2b1e13dc4495ca0f80f699542b170a6" name="Symfony/Component/Templating/TemplateNameParserInterface.php" role="php" />
   <file md5sum="306070b0a6238aaac07959f3ea304346" name="Symfony/Component/Templating/TemplateReference.php" role="php" />
   <file md5sum="2e255a20204431df5138c0365f7527b5" name="Symfony/Component/Templating/TemplateReferenceInterface.php" role="php" />
   <file md5sum="59973b4b1ccd3cc2022355241d9c1461" name="Symfony/Component/Templating/Tests/DelegatingEngineTest.php" role="test" />
   <file md5sum="a8ac9b5e185e2ecf3418e612a788bd6c" name="Symfony/Component/Templating/Tests/Fixtures/SimpleHelper.php" role="test" />
   <file md5sum="fda093af55ec1dc89ec8745c85eda0d5" name="Symfony/Component/Templating/Tests/Fixtures/templates/foo.php" role="test" />
   <file md5sum="b6505a4ee8e1f29f1f200cad2d44f4cc" name="Symfony/Component/Templating/Tests/Helper/AssetsHelperTest.php" role="test" />
   <file md5sum="a6cf2f490b1f97c2c077bec828d77cd0" name="Symfony/Component/Templating/Tests/Helper/CoreAssetsHelperTest.php" role="test" />
   <file md5sum="7e3bc2e0f3a2d85ba4df24d03a49f72d" name="Symfony/Component/Templating/Tests/Helper/HelperTest.php" role="test" />
   <file md5sum="76d50b1a2294fb8a77d763564d54d396" name="Symfony/Component/Templating/Tests/Helper/SlotsHelperTest.php" role="test" />
   <file md5sum="71bc444643de4a7fbb625bfe0d8b4504" name="Symfony/Component/Templating/Tests/Loader/CacheLoaderTest.php" role="test" />
   <file md5sum="f0ff11bbde7e6014a3de882429ec8dfd" name="Symfony/Component/Templating/Tests/Loader/ChainLoaderTest.php" role="test" />
   <file md5sum="bc936938ae234301e0730c88b67d4848" name="Symfony/Component/Templating/Tests/Loader/FilesystemLoaderTest.php" role="test" />
   <file md5sum="ba61470efa3642af0b71ba3c951d344f" name="Symfony/Component/Templating/Tests/Loader/LoaderTest.php" role="test" />
   <file md5sum="f22ccaa9e1bfd0be7d7a4dba394cbd04" name="Symfony/Component/Templating/Tests/PhpEngineTest.php" role="test" />
   <file md5sum="80b97e6950ae0e4db418375f6af09909" name="Symfony/Component/Templating/Tests/Storage/FileStorageTest.php" role="test" />
   <file md5sum="32856c6ce86000b67c21b30b4521b939" name="Symfony/Component/Templating/Tests/Storage/StorageTest.php" role="test" />
   <file md5sum="fc4254f64c0206186a69673bd355b74b" name="Symfony/Component/Templating/Tests/Storage/StringStorageTest.php" role="test" />
   <file md5sum="c9a0c56b51df4382d0628855d9ebf395" name="Symfony/Component/Templating/Tests/TemplateNameParserTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\?�4��
�
*pear/.pkgxml/Symfony2_BrowserKit-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>BrowserKit</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 BrowserKit Component</summary>
 <description>Symfony2 BrowserKit Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:40</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="73fd6d413cc833c5246ceca2eadb68b9" name="Symfony/Component/BrowserKit/autoloader.php" role="php" />
   <file md5sum="6dbcbfc4c59d34785c38be32ace2caba" name="Symfony/Component/BrowserKit/CHANGELOG.md" role="doc" />
   <file md5sum="5674d7e1c5c7b6fe316522b571465467" name="Symfony/Component/BrowserKit/Client.php" role="php" />
   <file md5sum="be724b81eaca8742bce61a417240b6fc" name="Symfony/Component/BrowserKit/composer.json" role="doc" />
   <file md5sum="f69714aa6ba33d7e1b0bc3b187304d47" name="Symfony/Component/BrowserKit/Cookie.php" role="php" />
   <file md5sum="56cd2a8a6894ee87ad2dc34902176a2b" name="Symfony/Component/BrowserKit/CookieJar.php" role="php" />
   <file md5sum="38f98f3e64dae73376a7b422dd2606de" name="Symfony/Component/BrowserKit/History.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/BrowserKit/LICENSE" role="doc" />
   <file md5sum="fc3e7c04f789c929b337c69a123cb973" name="Symfony/Component/BrowserKit/phpunit.xml.dist" role="test" />
   <file md5sum="8735649e3edbb9efbc585ae2bc80c977" name="Symfony/Component/BrowserKit/README.md" role="doc" />
   <file md5sum="4861bcb9490eadd0c465c5fedcfc6ba6" name="Symfony/Component/BrowserKit/Request.php" role="php" />
   <file md5sum="36277cc2c016b665d292b9ac6e1b3071" name="Symfony/Component/BrowserKit/Response.php" role="php" />
   <file md5sum="7a01acf3983981e9631779baca742a93" name="Symfony/Component/BrowserKit/Tests/ClientTest.php" role="test" />
   <file md5sum="95ca664f7f929e6360504b978714aeb9" name="Symfony/Component/BrowserKit/Tests/CookieJarTest.php" role="test" />
   <file md5sum="b6ecdb8942a989d1aa67f60c278d2551" name="Symfony/Component/BrowserKit/Tests/CookieTest.php" role="test" />
   <file md5sum="1e71cb797c1fa1e81325c1265a8f4cfd" name="Symfony/Component/BrowserKit/Tests/HistoryTest.php" role="test" />
   <file md5sum="28dcc60e83cc2fba65b3d07eda487fd1" name="Symfony/Component/BrowserKit/Tests/RequestTest.php" role="test" />
   <file md5sum="9b193b5af166845cca3e3f7e1aeab1eb" name="Symfony/Component/BrowserKit/Tests/ResponseTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
   <package>
    <name>DomCrawler</name>
    <channel>pear.symfony.com</channel>
   </package>
  </required>
  <optional>
   <package>
    <name>Process</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\��F��*pear/.pkgxml/Symfony2_DomCrawler-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>DomCrawler</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 DomCrawler Component</summary>
 <description>Symfony2 DomCrawler Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:43</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="778e5e4c2ef79bf3eab9659a2efe2bee" name="Symfony/Component/DomCrawler/autoloader.php" role="php" />
   <file md5sum="2cafc6f4bf64390dcbd0a455be44b6d8" name="Symfony/Component/DomCrawler/CHANGELOG.md" role="doc" />
   <file md5sum="d1cc79159630ef76a89b80dc11c51f15" name="Symfony/Component/DomCrawler/composer.json" role="doc" />
   <file md5sum="6509c142e976bd66f4c7ec226d050f71" name="Symfony/Component/DomCrawler/Crawler.php" role="php" />
   <file md5sum="c551faa84079802e0f9b88648d2743ae" name="Symfony/Component/DomCrawler/Field/ChoiceFormField.php" role="php" />
   <file md5sum="2cc904288c9ada108fc772afd46eeba1" name="Symfony/Component/DomCrawler/Field/FileFormField.php" role="php" />
   <file md5sum="d4d90fb70896ed262bd9b01238be9986" name="Symfony/Component/DomCrawler/Field/FormField.php" role="php" />
   <file md5sum="d945707a2751cc30160d16f1e7868a59" name="Symfony/Component/DomCrawler/Field/InputFormField.php" role="php" />
   <file md5sum="e58b3d248716078974dd6e62c678c09e" name="Symfony/Component/DomCrawler/Field/TextareaFormField.php" role="php" />
   <file md5sum="891f2a57a1951ad1bf4956f5df94b682" name="Symfony/Component/DomCrawler/Form.php" role="php" />
   <file md5sum="51dd5f3a8bf36823985d4c1d7618d4b6" name="Symfony/Component/DomCrawler/FormFieldRegistry.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/DomCrawler/LICENSE" role="doc" />
   <file md5sum="f2ed81516a26ccf90ac75d6404bf9589" name="Symfony/Component/DomCrawler/Link.php" role="php" />
   <file md5sum="67ea9aa8b6d108bb9f3268da0569c703" name="Symfony/Component/DomCrawler/phpunit.xml.dist" role="test" />
   <file md5sum="4dbc593d8cc7445cafc62cd73c13f5de" name="Symfony/Component/DomCrawler/README.md" role="doc" />
   <file md5sum="3ecd3daf12dad9c75b96803ec9caeaf4" name="Symfony/Component/DomCrawler/Tests/CrawlerTest.php" role="test" />
   <file md5sum="ce57f830f14f9225111bba2434fe2927" name="Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php" role="test" />
   <file md5sum="77e2087cd2c221981f6d465fa3ceeb7b" name="Symfony/Component/DomCrawler/Tests/Field/FileFormFieldTest.php" role="test" />
   <file md5sum="55c98c4590e2c55a7dd4d1bd6074e319" name="Symfony/Component/DomCrawler/Tests/Field/FormFieldTest.php" role="test" />
   <file md5sum="933f6abce62f92d04cfa09025919076f" name="Symfony/Component/DomCrawler/Tests/Field/FormFieldTestCase.php" role="test" />
   <file md5sum="0fa26bf8503badc839759f9f75d5a099" name="Symfony/Component/DomCrawler/Tests/Field/InputFormFieldTest.php" role="test" />
   <file md5sum="e1d8139694476b22f6cc345f42d0a018" name="Symfony/Component/DomCrawler/Tests/Field/TextareaFormFieldTest.php" role="test" />
   <file md5sum="2205e48de5f93c784733ffcca841d2b5" name="Symfony/Component/DomCrawler/Tests/Fixtures/no-extension" role="test" />
   <file md5sum="974fdff2161430f0a84d086ed023b85c" name="Symfony/Component/DomCrawler/Tests/Fixtures/windows-1250.html" role="test" />
   <file md5sum="00b7ea673d9c353455199b68cdfde0e4" name="Symfony/Component/DomCrawler/Tests/FormTest.php" role="test" />
   <file md5sum="a634e1da9e7f548d92635fac8614781a" name="Symfony/Component/DomCrawler/Tests/LinkTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
  <optional>
   <package>
    <name>CssSelector</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\�3'�C�C.pear/.pkgxml/Symfony2_HttpFoundation-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>HttpFoundation</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 HttpFoundation Component</summary>
 <description>Symfony2 HttpFoundation Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:46</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="b884647f8a23d1ceb94626f3dbeb5b9e" name="Symfony/Component/HttpFoundation/AcceptHeader.php" role="php" />
   <file md5sum="2dc45b1974c5106ad115c8853e6ec45d" name="Symfony/Component/HttpFoundation/AcceptHeaderItem.php" role="php" />
   <file md5sum="428aaf05f7b32d9b5b0f21b5ff926bf0" name="Symfony/Component/HttpFoundation/ApacheRequest.php" role="php" />
   <file md5sum="7bfad2b6b760e66d943597d5dd7491a5" name="Symfony/Component/HttpFoundation/autoloader.php" role="php" />
   <file md5sum="1aa7a69563a388fd41290f35c444aaad" name="Symfony/Component/HttpFoundation/BinaryFileResponse.php" role="php" />
   <file md5sum="13f2dd00d17037b16bc5f880141269f1" name="Symfony/Component/HttpFoundation/CHANGELOG.md" role="doc" />
   <file md5sum="6f84da0f8178f7302a88987dae7cd454" name="Symfony/Component/HttpFoundation/composer.json" role="doc" />
   <file md5sum="1d21e30974e0cd17909cbd83570e6046" name="Symfony/Component/HttpFoundation/Cookie.php" role="php" />
   <file md5sum="bb322f1b660d8526d54738c96bcc9496" name="Symfony/Component/HttpFoundation/ExpressionRequestMatcher.php" role="php" />
   <file md5sum="f857d7f53c52b92f5b86304b3380b099" name="Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php" role="php" />
   <file md5sum="82953ad2af851c787ed55bf754510432" name="Symfony/Component/HttpFoundation/File/Exception/FileException.php" role="php" />
   <file md5sum="77e5758e36af149ce24c50d5f5c4ac41" name="Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php" role="php" />
   <file md5sum="098936dfa215052c68b1002c28d276f4" name="Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php" role="php" />
   <file md5sum="ad5b16c066a5f89c35c5117ebc1d53ea" name="Symfony/Component/HttpFoundation/File/Exception/UploadException.php" role="php" />
   <file md5sum="94d1593cd9789142752a88ccb73cc430" name="Symfony/Component/HttpFoundation/File/File.php" role="php" />
   <file md5sum="86252c17f16fc39143aad01fd9240645" name="Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php" role="php" />
   <file md5sum="5fe7bad1c2c974c75aa2c3930334f702" name="Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php" role="php" />
   <file md5sum="94700d9406139019d43f5f8c76177ef1" name="Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php" role="php" />
   <file md5sum="f0cd17205bf9382d367e9921ceab5d88" name="Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php" role="php" />
   <file md5sum="f2f92703a5eb0dc3c2a700de6bc6d6e1" name="Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php" role="php" />
   <file md5sum="f0f9de1376a61059af6fa4e90fbd5a13" name="Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php" role="php" />
   <file md5sum="d0a415ee45ad0bd75cdb2032c2cae123" name="Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php" role="php" />
   <file md5sum="a8f763ea3e59a4ff37cee3af896eb323" name="Symfony/Component/HttpFoundation/File/UploadedFile.php" role="php" />
   <file md5sum="b4ca9658eb9774373d5bf710c2300638" name="Symfony/Component/HttpFoundation/FileBag.php" role="php" />
   <file md5sum="1f23e1af0de42dd915e7a807fa1527f6" name="Symfony/Component/HttpFoundation/HeaderBag.php" role="php" />
   <file md5sum="45993bfa467d14b903e20885e6a2cf89" name="Symfony/Component/HttpFoundation/IpUtils.php" role="php" />
   <file md5sum="b4c78dc282e052cb8859f763aedf2805" name="Symfony/Component/HttpFoundation/JsonResponse.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/HttpFoundation/LICENSE" role="doc" />
   <file md5sum="e223bb93e05d1476b5f12488151a825c" name="Symfony/Component/HttpFoundation/ParameterBag.php" role="php" />
   <file md5sum="169b47a2f05c53335bca6becdd389220" name="Symfony/Component/HttpFoundation/phpunit.xml.dist" role="test" />
   <file md5sum="7851474c7a43a34dd6639f5a126c8bba" name="Symfony/Component/HttpFoundation/README.md" role="doc" />
   <file md5sum="0517940c519e1e6efeb564c84edda69c" name="Symfony/Component/HttpFoundation/RedirectResponse.php" role="php" />
   <file md5sum="bd5c61af6d0cbe7f7edbba3736b87d3b" name="Symfony/Component/HttpFoundation/Request.php" role="php" />
   <file md5sum="970df6f9df3bf9150a685c6c6c3f6aa1" name="Symfony/Component/HttpFoundation/RequestMatcher.php" role="php" />
   <file md5sum="7ecc8861d7377c89a003417ab5db02bf" name="Symfony/Component/HttpFoundation/RequestMatcherInterface.php" role="php" />
   <file md5sum="37fd73c5d42a949fff23de4fa0d15b48" name="Symfony/Component/HttpFoundation/RequestStack.php" role="php" />
   <file md5sum="94ad98f4affa4224d887336c1f3ea1dc" name="Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php" role="php" />
   <file md5sum="cc8f30d1b460ddd2cc4913bfcd3e78b4" name="Symfony/Component/HttpFoundation/Response.php" role="php" />
   <file md5sum="02ccee91a765c8b71e997a5a1885a82d" name="Symfony/Component/HttpFoundation/ResponseHeaderBag.php" role="php" />
   <file md5sum="f0ac2d2b1071ccec5884200d0ab5e420" name="Symfony/Component/HttpFoundation/ServerBag.php" role="php" />
   <file md5sum="09a642bc5ffa1e2e7cb7aad84cdbc755" name="Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php" role="php" />
   <file md5sum="47cf442d27aa801d2ee1c43eb1b92ab6" name="Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php" role="php" />
   <file md5sum="bb24d40c233c7edbeaed0286f399d22d" name="Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php" role="php" />
   <file md5sum="47e8fa7a8f184ec2bef7e90741a030bb" name="Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php" role="php" />
   <file md5sum="fd24bb3a7c43f869f28c5f27e08bb257" name="Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php" role="php" />
   <file md5sum="3ecf0692351b914a8822f5138d801682" name="Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php" role="php" />
   <file md5sum="b25cb46112eac2e01f6d48a0c89c4716" name="Symfony/Component/HttpFoundation/Session/Session.php" role="php" />
   <file md5sum="baa130a80f887fca702556b7cb7ac61e" name="Symfony/Component/HttpFoundation/Session/SessionBagInterface.php" role="php" />
   <file md5sum="33e385a590e619684d37bead5b90a7eb" name="Symfony/Component/HttpFoundation/Session/SessionInterface.php" role="php" />
   <file md5sum="93364ba7a594762ef28e712bb9dd7e48" name="Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php" role="php" />
   <file md5sum="6c4948a4a2c2400936ecf7552e67f7d3" name="Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php" role="php" />
   <file md5sum="3b8368e6dcaa7edfd508726ebf1d0a5a" name="Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php" role="php" />
   <file md5sum="fe93aa5204757c30501b59d3ab98550b" name="Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php" role="php" />
   <file md5sum="36574daf922d67815c3efda0063b7af2" name="Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php" role="php" />
   <file md5sum="26845162d0cd8e65c3524bf2413b6025" name="Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php" role="php" />
   <file md5sum="5d66bb0aff4e6e04dea4a71dc6b74f2d" name="Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php" role="php" />
   <file md5sum="d5cc5b83b3809aa9cbe8023c7cfd3845" name="Symfony/Component/HttpFoundation/Session/Storage/Handler/WriteCheckSessionHandler.php" role="php" />
   <file md5sum="0ba968002df893468d99e77dfde92b95" name="Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php" role="php" />
   <file md5sum="b8d920694b05fe7820867c8271e5b519" name="Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php" role="php" />
   <file md5sum="bbe1e2bea9239bfe24e45baadb6a330d" name="Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php" role="php" />
   <file md5sum="7b886167def5c49469577a533a4c2f6c" name="Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php" role="php" />
   <file md5sum="d5a28453f64db20f1d07f28af5213cfb" name="Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php" role="php" />
   <file md5sum="3b9152152614a4e0d7886d16e8162926" name="Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php" role="php" />
   <file md5sum="4da090373635a3ca9732171dadfd4ed0" name="Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php" role="php" />
   <file md5sum="1436f383c0e3500de401861230f5400a" name="Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php" role="php" />
   <file md5sum="af85e7a0bab5c49be82a9244b4cde282" name="Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php" role="php" />
   <file md5sum="4b1b42d5e606ea929c4406f32826fcca" name="Symfony/Component/HttpFoundation/StreamedResponse.php" role="php" />
   <file md5sum="71279e63c94c58a19de6c9bfe9183847" name="Symfony/Component/HttpFoundation/Tests/AcceptHeaderItemTest.php" role="test" />
   <file md5sum="ca12f957cfb0c92c2f8715b455f29607" name="Symfony/Component/HttpFoundation/Tests/AcceptHeaderTest.php" role="test" />
   <file md5sum="7bc8ed0abe9d2fc50e676222891ede1a" name="Symfony/Component/HttpFoundation/Tests/ApacheRequestTest.php" role="test" />
   <file md5sum="806f7315eef4b6abdbe35a22c50369c0" name="Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php" role="test" />
   <file md5sum="1c7af317329cb2e4dae2e8582c090aad" name="Symfony/Component/HttpFoundation/Tests/CookieTest.php" role="test" />
   <file md5sum="f156d2ad465b76775f67bdbf386083b3" name="Symfony/Component/HttpFoundation/Tests/ExpressionRequestMatcherTest.php" role="test" />
   <file md5sum="7a08ef205764facbe5646cd24074c937" name="Symfony/Component/HttpFoundation/Tests/File/FileTest.php" role="test" />
   <file md5sum="8fa14cdd754f91cc6554c9e71929cce7" name="Symfony/Component/HttpFoundation/Tests/File/Fixtures/.unknownextension" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpFoundation/Tests/File/Fixtures/directory/.empty" role="test" />
   <file md5sum="87aec5a94c94ec7a5dd1c0839eb0182b" name="Symfony/Component/HttpFoundation/Tests/File/Fixtures/test" role="test" />
   <file md5sum="87aec5a94c94ec7a5dd1c0839eb0182b" name="Symfony/Component/HttpFoundation/Tests/File/Fixtures/test.gif" role="test" />
   <file md5sum="a167d71d8028a1eda64cc8d899f5f6e3" name="Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php" role="test" />
   <file md5sum="7b45d61227c547c01973ae0d48082796" name="Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php" role="test" />
   <file md5sum="17f9729e4532b0faed835935233250d0" name="Symfony/Component/HttpFoundation/Tests/FileBagTest.php" role="test" />
   <file md5sum="c2ca1229b730159f6f7bf2ecfec49825" name="Symfony/Component/HttpFoundation/Tests/HeaderBagTest.php" role="test" />
   <file md5sum="6c47d0ca15feaad0e369dd514101b100" name="Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php" role="test" />
   <file md5sum="3b443a39c7580eab6e59f53022284ae0" name="Symfony/Component/HttpFoundation/Tests/JsonResponseTest.php" role="test" />
   <file md5sum="019b8d85e6f650aed3292af213a0643c" name="Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php" role="test" />
   <file md5sum="2379f3910f6f55a3c72315a25dfdf388" name="Symfony/Component/HttpFoundation/Tests/RedirectResponseTest.php" role="test" />
   <file md5sum="99352f4118b2c568fda24db10858555c" name="Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php" role="test" />
   <file md5sum="5ab9a5e9dda53ed1f022634f8136d4fd" name="Symfony/Component/HttpFoundation/Tests/RequestStackTest.php" role="test" />
   <file md5sum="6406b7aabef145bb68b018da2b9d7780" name="Symfony/Component/HttpFoundation/Tests/RequestTest.php" role="test" />
   <file md5sum="e268328250a58f53892622dff9ed2b37" name="Symfony/Component/HttpFoundation/Tests/ResponseHeaderBagTest.php" role="test" />
   <file md5sum="a17240ff298468ada33c1f15e3ec5012" name="Symfony/Component/HttpFoundation/Tests/ResponseTest.php" role="test" />
   <file md5sum="3a86e8988d2cf1a094322bfd0b38c045" name="Symfony/Component/HttpFoundation/Tests/ResponseTestCase.php" role="test" />
   <file md5sum="feb7545b69e0eda1a61be511e9135582" name="Symfony/Component/HttpFoundation/Tests/ServerBagTest.php" role="test" />
   <file md5sum="fbcb35c2d86007ac5311394d67081cda" name="Symfony/Component/HttpFoundation/Tests/Session/Attribute/AttributeBagTest.php" role="test" />
   <file md5sum="c281ff06081b6ae87f4356f37a2814e1" name="Symfony/Component/HttpFoundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php" role="test" />
   <file md5sum="763835431c792f3e0b5bbba96794542a" name="Symfony/Component/HttpFoundation/Tests/Session/Flash/AutoExpireFlashBagTest.php" role="test" />
   <file md5sum="18cf905cc6ead1acbf260f484564425f" name="Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php" role="test" />
   <file md5sum="6a494d5992105e3ebe9c391b7d6f6a63" name="Symfony/Component/HttpFoundation/Tests/Session/SessionTest.php" role="test" />
   <file md5sum="f44ffbb61b65fe70de11d6469e48832a" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php" role="test" />
   <file md5sum="c7f7e944a63d1af11e55e6ec4a9374b2" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php" role="test" />
   <file md5sum="c2f1f103720b87b039183451427d74c4" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php" role="test" />
   <file md5sum="8fa508beab426cea19a2cedabd5e9171" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php" role="test" />
   <file md5sum="45eae4ba5310a98dc04fcadf82bf720d" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php" role="test" />
   <file md5sum="2c0feb6c09d60d7e5926ea5a8da36080" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php" role="test" />
   <file md5sum="f36ec391bb99db52a49f7ca30360ea26" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php" role="test" />
   <file md5sum="11d0598235d0d7f8098bdc2145d9d69b" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php" role="test" />
   <file md5sum="fc2af1f274721774e972a5758278c8f3" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/MetadataBagTest.php" role="test" />
   <file md5sum="87a2d57546023c4094f6be942a4b13c2" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/MockArraySessionStorageTest.php" role="test" />
   <file md5sum="592ade20d8c465762c8e5a121d60ac52" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php" role="test" />
   <file md5sum="bbc650e69324fd0d48491db754f248e4" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php" role="test" />
   <file md5sum="b10ca7f822772f799c1f1e68ad9eaf55" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php" role="test" />
   <file md5sum="da5bd63668cf3a8b28b6190b22b3271a" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php" role="test" />
   <file md5sum="1baf3702ba27dc4cfdfe750f18bd8b39" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/NativeProxyTest.php" role="test" />
   <file md5sum="e2a32ca244d28b43eb7a15edbb1f65c2" name="Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php" role="test" />
   <file md5sum="73647306210e7be2a18cf3a523275748" name="Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\n#)v�>�>'pear/.pkgxml/eZc_ConsoleTools-1.6.1.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.0" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd">
 <name>ConsoleTools</name>
 <channel>components.ez.no</channel>
 <summary>A set of classes to do different actions with the console (also called shell).</summary>
 <description>A set of classes to do different actions with the console (also called shell).
It can render a progress bar, tables and a status bar and contains a class for
parsing command line options.</description>
 <lead>
  <name>eZ systems</name>
  <user>ezc</user>
  <email>ezc@ez.no</email>
  <active>yes</active>
 </lead>
 <date>2010-03-22</date>
 <time>14:30:18</time>
 <version>
  <release>1.6.1</release>
  <api>1.6.1</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license>New BSD</license>
 <notes>
- Fixed issue #16055: Corrected regression in error message for option
  dependencies.
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="53a2fd46c86d99b961c171a66af52294" name="design/class_diagram.png" role="data" />
   <file baseinstalldir="/" md5sum="b0e9037513638b06959702b4827d2325" name="design/console.png" role="data" />
   <file baseinstalldir="/" md5sum="8ec71d0399e811d3ebb49a3a69bea3ad" name="design/console.xml" role="data" />
   <file baseinstalldir="/" md5sum="928f4cfd27eaac584c14e11562a1810e" name="design/console_parameters.png" role="data" />
   <file baseinstalldir="/" md5sum="b984260ee10c0d466594d1c7356fc379" name="design/design-1.3.txt" role="data" />
   <file baseinstalldir="/" md5sum="9f3666f1fe43c02d93453b6cf5e19f5b" name="design/design.txt" role="data" />
   <file baseinstalldir="/" md5sum="e3f42a8f3d4359c2619a8abb8c40ae98" name="docs/img/consoletools_tutorial_example_06.png" role="doc" />
   <file baseinstalldir="/" md5sum="9ef80166b15efecb1fcb147f3eb4a016" name="docs/img/consoletools_tutorial_example_07.png" role="doc" />
   <file baseinstalldir="/" md5sum="3be4110812d95440c78d6c313d4ed380" name="docs/img/consoletools_tutorial_example_08.png" role="doc" />
   <file baseinstalldir="/" md5sum="37c35a19bbe6c983a8ae1c24b9f9c273" name="docs/img/consoletools_tutorial_example_09.png" role="doc" />
   <file baseinstalldir="/" md5sum="4375674d7ff2271227b5ae9ae1c420f4" name="docs/img/consoletools_tutorial_example_10.png" role="doc" />
   <file baseinstalldir="/" md5sum="6a44661d8d0ed5dea17e26938c1c388c" name="docs/CREDITS" role="doc" />
   <file baseinstalldir="/" md5sum="0ded8f674cdc9657885309057e67812f" name="docs/example_input.php" role="doc" />
   <file baseinstalldir="/" md5sum="84de543cd335e89b01fab831f231b743" name="docs/example_menu_dialog_full.php" role="doc" />
   <file baseinstalldir="/" md5sum="b5d0ab2ebca4628c4e1e3bc05ecea61b" name="docs/example_output.php" role="doc" />
   <file baseinstalldir="/" md5sum="09648ac0219bfc18c5d7a093b55b280b" name="docs/example_progressbar.php" role="doc" />
   <file baseinstalldir="/" md5sum="9519aa6d3253ad82f64c7a2c5109fa31" name="docs/example_progressmonitor.php" role="doc" />
   <file baseinstalldir="/" md5sum="7382b1d71ddeb7bd43b90d582ba18a3b" name="docs/example_question_dialog_collection_full.php" role="doc" />
   <file baseinstalldir="/" md5sum="169505e53923c6389ddd987f894328e0" name="docs/example_question_dialog_factory_yesno.php" role="doc" />
   <file baseinstalldir="/" md5sum="600a19f4d49a65c5d03c8b3c74d735ac" name="docs/example_question_dialog_type_full.php" role="doc" />
   <file baseinstalldir="/" md5sum="e829e952f3fa572461175c0966035d51" name="docs/example_statusbar.php" role="doc" />
   <file baseinstalldir="/" md5sum="1bf46b2ac9e3b5b565a05027d4610918" name="docs/example_table.php" role="doc" />
   <file baseinstalldir="/" md5sum="628360cad5c0d6a59a5847faeebfc21d" name="docs/example_table_2.php" role="doc" />
   <file baseinstalldir="/" md5sum="0d01eec9cb573a51f7cb73a1573c5350" name="docs/LICENSE" role="doc" />
   <file baseinstalldir="/" md5sum="d33dcb646a07d63a828bf455309d0926" name="docs/tutorial.txt" role="doc" />
   <file baseinstalldir="/" md5sum="c62acdb41db6b2f5f90506fda0ffe426" name="docs/tutorial_autoload.php" role="doc" />
   <file baseinstalldir="/" md5sum="38c2ae0cf8bef46d317983818fc7eeec" name="docs/tutorial_example_01_output_basic.php" role="doc" />
   <file baseinstalldir="/" md5sum="a9b566b706b217b704f824dd528c245d" name="docs/tutorial_example_02_output_advanced.php" role="doc" />
   <file baseinstalldir="/" md5sum="5f256cd79a513a1ae8b6d9743dcaf883" name="docs/tutorial_example_03_output_options.php" role="doc" />
   <file baseinstalldir="/" md5sum="0afbac38453f8d496b9c5ebdff4b7f54" name="docs/tutorial_example_04_input_basic.php" role="doc" />
   <file baseinstalldir="/" md5sum="9c4dafa4f5a08f20bfc6edc07d3e52a8" name="docs/tutorial_example_05_input_advanced.php" role="doc" />
   <file baseinstalldir="/" md5sum="2eb8cdf0581dac44124a279903a090b6" name="docs/tutorial_example_06_progressbar_basic.php" role="doc" />
   <file baseinstalldir="/" md5sum="ad542c60b818a175aa8f59cbe99f3765" name="docs/tutorial_example_07_progressbar_advanced.php" role="doc" />
   <file baseinstalldir="/" md5sum="c93007242a832d49a573a9ff71af468d" name="docs/tutorial_example_08_statusbar.php" role="doc" />
   <file baseinstalldir="/" md5sum="f2de74f7a46f15af94e54f02b8c5190c" name="docs/tutorial_example_09_table_basic.php" role="doc" />
   <file baseinstalldir="/" md5sum="9c322bff4f25aacbc30b2816a3a693ce" name="docs/tutorial_example_10_table_advanced.php" role="doc" />
   <file baseinstalldir="/" md5sum="4255cae3b9b8a8ed4a0bf2e6be293925" name="docs/tutorial_example_11_progressmonitor.php" role="doc" />
   <file baseinstalldir="/" md5sum="5642c76dcad0f38c2bb9cc813ec86635" name="docs/tutorial_example_12_input_arguments.php" role="doc" />
   <file baseinstalldir="/" md5sum="9dc353f51cf619db963b72ace3e554a1" name="docs/tutorial_example_13_dialog_question.php" role="doc" />
   <file baseinstalldir="/" md5sum="2fe7147cf77f8595caec34390a869e00" name="docs/tutorial_example_14_dialog_yesnoquestion.php" role="doc" />
   <file baseinstalldir="/" md5sum="416ae4c5c942d184d083f89f1d958578" name="docs/tutorial_example_15_dialog_menu.php" role="doc" />
   <file baseinstalldir="/" md5sum="7e204a3db8893993c618d9fccb63ce80" name="docs/tutorial_example_output_targets.php" role="doc" />
   <file baseinstalldir="/" md5sum="a5d0832dc9a28b1b83e377ec2f72503c" name="ezc/autoload/console_autoload.php" role="php" />
   <file baseinstalldir="/" md5sum="e168dc91ef4aa95feb62c374850439ad" name="ezc/ConsoleTools/dialog/validators/menu_dialog_default.php" role="php" />
   <file baseinstalldir="/" md5sum="bb23b9eb4ce6ecfc74d3d14697522302" name="ezc/ConsoleTools/dialog/validators/question_dialog_collection.php" role="php" />
   <file baseinstalldir="/" md5sum="6bf4939fecdf3612d26258304e116d68" name="ezc/ConsoleTools/dialog/validators/question_dialog_mapping.php" role="php" />
   <file baseinstalldir="/" md5sum="4426ac09a206b255af3f86e138f3d280" name="ezc/ConsoleTools/dialog/validators/question_dialog_regex.php" role="php" />
   <file baseinstalldir="/" md5sum="67f5529cb45617843e60a0ea3e4c2941" name="ezc/ConsoleTools/dialog/validators/question_dialog_type.php" role="php" />
   <file baseinstalldir="/" md5sum="4c8dbaf88d94e339940d87341e9e511c" name="ezc/ConsoleTools/dialog/menu_dialog.php" role="php" />
   <file baseinstalldir="/" md5sum="a0f9e7fcbc20920a7718ab4063cedbb3" name="ezc/ConsoleTools/dialog/question_dialog.php" role="php" />
   <file baseinstalldir="/" md5sum="76cf3873bf8de152961bef1a958de739" name="ezc/ConsoleTools/exceptions/argument.php" role="php" />
   <file baseinstalldir="/" md5sum="e76fb2146d1ab7770ab7b55acac395f6" name="ezc/ConsoleTools/exceptions/argument_already_registered.php" role="php" />
   <file baseinstalldir="/" md5sum="b9e1712dced4a71c03299d2d629d8bd9" name="ezc/ConsoleTools/exceptions/argument_mandatory_violation.php" role="php" />
   <file baseinstalldir="/" md5sum="016560b74a1713b240b3b2831fb9ce15" name="ezc/ConsoleTools/exceptions/argument_too_many.php" role="php" />
   <file baseinstalldir="/" md5sum="a928f645d541811a6cb268cfcf989103" name="ezc/ConsoleTools/exceptions/argument_type_violation.php" role="php" />
   <file baseinstalldir="/" md5sum="dfafc6e5a8f5e95b3f9d7fc83256ba3a" name="ezc/ConsoleTools/exceptions/dialog_abort.php" role="php" />
   <file baseinstalldir="/" md5sum="3a0932a2bd5a048165650d9c1c65d394" name="ezc/ConsoleTools/exceptions/exception.php" role="php" />
   <file baseinstalldir="/" md5sum="55ec00268bfdcabaececab9717e670b0" name="ezc/ConsoleTools/exceptions/invalid_option_name.php" role="php" />
   <file baseinstalldir="/" md5sum="8387a3ed2488c13d8e85ac1f36d2776d" name="ezc/ConsoleTools/exceptions/invalid_output_target.php" role="php" />
   <file baseinstalldir="/" md5sum="adf293f0a7b64a11ad750ceb7d8d06fb" name="ezc/ConsoleTools/exceptions/no_position_stored.php" role="php" />
   <file baseinstalldir="/" md5sum="26c6652ca11a904feb0114ea063137ad" name="ezc/ConsoleTools/exceptions/no_valid_dialog_result.php" role="php" />
   <file baseinstalldir="/" md5sum="1342642994f7e2af6617ab50e1d50201" name="ezc/ConsoleTools/exceptions/option.php" role="php" />
   <file baseinstalldir="/" md5sum="1c82d9cd44cab9cd2912a7ff85fe778b" name="ezc/ConsoleTools/exceptions/option_already_registered.php" role="php" />
   <file baseinstalldir="/" md5sum="920d616d1bc71c83e4730273219d2734" name="ezc/ConsoleTools/exceptions/option_arguments_violation.php" role="php" />
   <file baseinstalldir="/" md5sum="524d16a055a3d3a41c2dc3c0c1a1fed2" name="ezc/ConsoleTools/exceptions/option_dependency_violation.php" role="php" />
   <file baseinstalldir="/" md5sum="99291a96437e2ab968e1db9e8ef14a11" name="ezc/ConsoleTools/exceptions/option_exclusion_violation.php" role="php" />
   <file baseinstalldir="/" md5sum="1f5f85eb8c761af0a4c0cf72552a87ac" name="ezc/ConsoleTools/exceptions/option_mandatory_violation.php" role="php" />
   <file baseinstalldir="/" md5sum="17756f682466ebd0e1854eefcdb392fb" name="ezc/ConsoleTools/exceptions/option_missing_value.php" role="php" />
   <file baseinstalldir="/" md5sum="779c88d8911c1a37a8f62c07a7609fd1" name="ezc/ConsoleTools/exceptions/option_not_exists.php" role="php" />
   <file baseinstalldir="/" md5sum="bcef6b269e9518b5ab50a665dcefdae4" name="ezc/ConsoleTools/exceptions/option_no_alias.php" role="php" />
   <file baseinstalldir="/" md5sum="22cb7a2e3afecccbe82e7a43b7e3c0b0" name="ezc/ConsoleTools/exceptions/option_string_not_wellformed.php" role="php" />
   <file baseinstalldir="/" md5sum="e65ae0e90ec95ec1b02d427585bcb147" name="ezc/ConsoleTools/exceptions/option_too_many_values.php" role="php" />
   <file baseinstalldir="/" md5sum="c1b97683c2dada4c35d670f22bf4bfd9" name="ezc/ConsoleTools/exceptions/option_type_violation.php" role="php" />
   <file baseinstalldir="/" md5sum="1358c658d502de8757d6a8e4ae40d636" name="ezc/ConsoleTools/input/help_generators/standard.php" role="php" />
   <file baseinstalldir="/" md5sum="3d2a4f1bb8d46856c6da3c266fa8b019" name="ezc/ConsoleTools/input/validators/standard.php" role="php" />
   <file baseinstalldir="/" md5sum="a3c508cecae94655b9d134c18bf16ad2" name="ezc/ConsoleTools/input/argument.php" role="php" />
   <file baseinstalldir="/" md5sum="64be58bc0e7faef3f8548b69f8975ced" name="ezc/ConsoleTools/input/arguments.php" role="php" />
   <file baseinstalldir="/" md5sum="464bd6804e9ea90cd7e8c4e395f51a70" name="ezc/ConsoleTools/input/option.php" role="php" />
   <file baseinstalldir="/" md5sum="da1589cfccd05250f85b1d8c30f4da7c" name="ezc/ConsoleTools/interfaces/dialog.php" role="php" />
   <file baseinstalldir="/" md5sum="fbc7fafd21090e559cbc707bf8d2ea5a" name="ezc/ConsoleTools/interfaces/dialog_validator.php" role="php" />
   <file baseinstalldir="/" md5sum="1e0b4eb1a29c41f385781ca8b9c3e442" name="ezc/ConsoleTools/interfaces/input_help_generator.php" role="php" />
   <file baseinstalldir="/" md5sum="2e5f1707fe47153bf4b1e48aa01cf76c" name="ezc/ConsoleTools/interfaces/input_validator.php" role="php" />
   <file baseinstalldir="/" md5sum="e7e4198450a70f692c5882464a7e9e11" name="ezc/ConsoleTools/interfaces/menu_dialog_validator.php" role="php" />
   <file baseinstalldir="/" md5sum="8e2d83164e1a649c3f59a13f3915a9f8" name="ezc/ConsoleTools/interfaces/question_dialog_validator.php" role="php" />
   <file baseinstalldir="/" md5sum="c8c8969fe1528d7e4c28db6c078b0245" name="ezc/ConsoleTools/options/dialog.php" role="php" />
   <file baseinstalldir="/" md5sum="6f5724cd06d9d4541428384879d42eec" name="ezc/ConsoleTools/options/menu_dialog.php" role="php" />
   <file baseinstalldir="/" md5sum="c0482b1ed0ecff49594bace3aa62d4d0" name="ezc/ConsoleTools/options/output.php" role="php" />
   <file baseinstalldir="/" md5sum="3e6808ce1f4843313b1c5d9997507f91" name="ezc/ConsoleTools/options/progressbar.php" role="php" />
   <file baseinstalldir="/" md5sum="dc171e2272f4929c312c553d452b807d" name="ezc/ConsoleTools/options/progressmonitor.php" role="php" />
   <file baseinstalldir="/" md5sum="069eb222843610015ed324dca2b56dec" name="ezc/ConsoleTools/options/question_dialog.php" role="php" />
   <file baseinstalldir="/" md5sum="70d32f729b97d036e7729f7426bc7b45" name="ezc/ConsoleTools/options/statusbar.php" role="php" />
   <file baseinstalldir="/" md5sum="7426cf158c78345d7656a0e23b752d25" name="ezc/ConsoleTools/options/table.php" role="php" />
   <file baseinstalldir="/" md5sum="772506539fa9180fbfe3167d95462bdd" name="ezc/ConsoleTools/structs/option_rule.php" role="php" />
   <file baseinstalldir="/" md5sum="a7ef5dd26f2d70fe8374200c52136451" name="ezc/ConsoleTools/structs/output_format.php" role="php" />
   <file baseinstalldir="/" md5sum="fe2a5c4ebcce728d87dab9ffaec878ef" name="ezc/ConsoleTools/structs/output_formats.php" role="php" />
   <file baseinstalldir="/" md5sum="84edad158922a7b0b07975b720fd11d4" name="ezc/ConsoleTools/table/cell.php" role="php" />
   <file baseinstalldir="/" md5sum="2d99e475e21a0a82fd0051ae07e47f4d" name="ezc/ConsoleTools/table/row.php" role="php" />
   <file baseinstalldir="/" md5sum="1f23811735a6bd4f98b8c2f9a688d934" name="ezc/ConsoleTools/tools/string.php" role="php" />
   <file baseinstalldir="/" md5sum="a5d0832dc9a28b1b83e377ec2f72503c" name="ezc/ConsoleTools/console_autoload.php" role="php" />
   <file baseinstalldir="/" md5sum="131b67a1b928ff63db8ffd6eefbe17b6" name="ezc/ConsoleTools/dialog_viewer.php" role="php" />
   <file baseinstalldir="/" md5sum="35da1f48b0fa95bf771729f5bafe3220" name="ezc/ConsoleTools/input.php" role="php" />
   <file baseinstalldir="/" md5sum="f7b975843f75809d42e6710a7793b4c6" name="ezc/ConsoleTools/output.php" role="php" />
   <file baseinstalldir="/" md5sum="7de9cac1d84eca29792d54241b210633" name="ezc/ConsoleTools/progressbar.php" role="php" />
   <file baseinstalldir="/" md5sum="f3b0f156acc3ee5d6e5c1652aac5cb47" name="ezc/ConsoleTools/progressmonitor.php" role="php" />
   <file baseinstalldir="/" md5sum="d6a504831ced759070096f0585b27e45" name="ezc/ConsoleTools/statusbar.php" role="php" />
   <file baseinstalldir="/" md5sum="a78728a6c0328a88aec5ea16201e68f0" name="ezc/ConsoleTools/table.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.2.1</min>
   </php>
   <pearinstaller>
    <min>1.4.2</min>
   </pearinstaller>
   <package>
    <name>Base</name>
    <channel>components.ez.no</channel>
    <min>1.8</min>
   </package>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>1.6.1</release>
    <api>1.6.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-03-22</date>
   <license>New BSD</license>
   <notes>
- Fixed issue #16055: Corrected regression in error message for option
  dependencies.
   </notes>
  </release>
 </changelog>
</package>
PK�^�\ȗ��&pear/.pkgxml/Pear_Net_Socket-1.2.2.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.3" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Net_Socket</name>
 <channel>pear.php.net</channel>
 <summary>Network Socket Interface</summary>
 <description>Net_Socket is a class interface to TCP sockets.  It provides blocking
  and non-blocking operation, with different reading and writing modes
  (byte-wise, block-wise, line-wise and special formats like network
  byte-order ip addresses).</description>
 <lead>
  <name>Chuck Hagenbuch</name>
  <user>chagenbu</user>
  <email>chuck@horde.org</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Stig Bakken</name>
  <user>ssb</user>
  <email>stig@php.net</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Aleksander Machniak</name>
  <user>alec</user>
  <email>alec@php.net</email>
  <active>no</active>
 </lead>
 <date>2017-04-13</date>
 <time>17:15:33</time>
 <version>
  <release>1.2.2</release>
  <api>1.2.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD-2-Clause</license>
 <notes>
* Bug #21178: $php_errormsg is deprecated in PHP 7.2
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="f99081ef3a69bcc1faa0d90a9a616788" name="Net/Socket.php" role="php" />
   <file baseinstalldir="/" md5sum="61a9ed8d1604a739e6997149ea34e701" name="README.md" role="doc" />
   <file baseinstalldir="/" md5sum="28575b04f4f2014316245d83e27343e1" name="LICENSE" role="doc" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.4.0</min>
   </php>
   <pearinstaller>
    <min>1.10.1</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\�Q���?�?%pear/.pkgxml/Pear_Net_Sieve-1.4.5.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.12" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Net_Sieve</name>
 <channel>pear.php.net</channel>
 <summary>Handles talking to a sieve server.</summary>
 <description>This package provides an API to talk to servers implementing the managesieve protocol. It can be used to install and remove sieve scripts, mark them active etc.</description>
 <lead>
  <name>Aleksander Machniak</name>
  <user>alec</user>
  <email>alec@alec.pl</email>
  <active>yes</active>
 </lead>
 <lead>
  <name>Jan Schneider</name>
  <user>yunosh</user>
  <email>jan@horde.org</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Richard Heyes</name>
  <user>richard</user>
  <email>richard@php.net</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Damian Fernandez Sosa</name>
  <user>damian</user>
  <email>damlists@cnba.uba.ar</email>
  <active>no</active>
 </lead>
 <lead>
  <name>Anish Mistry</name>
  <user>amistry</user>
  <email>amistry@am-productions.biz</email>
  <active>no</active>
 </lead>
 <date>2021-04-24</date>
 <time>13:33:52</time>
 <version>
  <release>1.4.5</release>
  <api>1.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
 <notes>
* Support XOAUTH2 authorization method
 </notes>
 <contents>
  <dir baseinstalldir="Net" name="/">
   <file baseinstalldir="Net" md5sum="ef8cd688674fba85cc067e06c221e43b" name="tests/largescript.siv" role="test" />
   <file baseinstalldir="Net" md5sum="7d772fe47ee45bdb521dd581281f38c3" name="tests/config.php.dist" role="test" />
   <file baseinstalldir="Net" md5sum="6050fac5e66a4a6bbed7913f826974ed" name="tests/SieveTest.php" role="test" />
   <file baseinstalldir="Net" md5sum="2a45a03c042351957f3435929a17bca3" name="Sieve.php" role="php">
    <tasks:replace from="@package_version@" to="version" type="package-info" />
   </file>
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.0.0</min>
   </php>
   <pearinstaller>
    <min>1.4.0b1</min>
   </pearinstaller>
   <package>
    <name>Net_Socket</name>
    <channel>pear.php.net</channel>
    <min>1.0</min>
   </package>
  </required>
  <optional>
   <package>
    <name>Auth_SASL</name>
    <channel>pear.php.net</channel>
    <min>1.0</min>
   </package>
  </optional>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <date>2018-03-04</date>
   <version>
    <release>1.4.3</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Support GSSAPI authentication
   </notes>
  </release>
  <release>
   <date>2018-02-14</date>
   <version>
    <release>1.4.2</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Composer: Fix license identifier, don&apos;t use unbound version numbers for deps
   </notes>
  </release>
  <release>
   <date>2017-05-26</date>
   <version>
    <release>1.4.1</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Use 8bit instead of latin1 for string length in bytes calculation
* Extend listScripts() so it&apos;s possible to get an active script name in one go
* Request #20491: Skip redundant CAPABILITY requests
   </notes>
  </release>
  <release>
   <date>2017-05-21</date>
   <version>
    <release>1.4.0</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Dropped PHP4 support, fixed PHP7 warnings
* Fixed E_DEPRECATED warning on Auth_SASL::factory() call
* Enable later TLS versions
   </notes>
  </release>
  <release>
   <date>2015-01-20</date>
   <version>
    <release>1.3.4</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Remove erroneous and unnecessary active script caching (Bug #20472).
   </notes>
  </release>
  <release>
   <date>2014-09-24</date>
   <version>
    <release>1.3.3</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fix notices from non-static calling of PEAR methods.
* Fix reading OK responses with string literal messages.
   </notes>
  </release>
  <release>
   <date>2011-08-06</date>
   <version>
    <release>1.3.2</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fix referrals if host data or user credentials are passed to connect() and login() instead of the constructor (Aleksander Machniak, Bug #17107).
   </notes>
  </release>
  <release>
   <date>2011-08-05</date>
   <version>
    <release>1.3.1</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Query capabilities again after successful authentication (Jesse Crawford, Request #18382).
* Escape quotes and backslashes in script names, and use literal strings for script names with non-ASCII characters (Aleksander Machniak, Bug #16691).
* Work around broken STARTTLS behavior in Cyrus versions before 2.3.10 (Aleksander Machniak, Bug #18241).
* Improve string literal parsing (Aleksander Machniak, Bug #18228).
   </notes>
  </release>
  <release>
   <date>2010-07-01</date>
   <version>
    <release>1.3.0</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Add debug handler parameter to constructor.
* Fix LOGIN authentication (Agustín Eijo, Aleksander Machniak, Bug #17527).
   </notes>
  </release>
  <release>
   <date>2010-06-13</date>
   <version>
    <release>1.2.2</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fix SASL authentication without Auth_SASL (Bug #17489).
   </notes>
  </release>
  <release>
   <date>2010-04-19</date>
   <version>
    <release>1.2.1</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fix DIGEST-MD5 authentication with Dovecot (Stef Simoens, Bug #17320).
   </notes>
  </release>
  <release>
   <date>2010-04-01</date>
   <version>
    <release>1.2.0</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
Changes since version 1.2.0b1:
* Fix DIGEST-MD5 authentication (Aleksander Machniak, Bug #17285).
* Don&apos;t try to call dl() if mbstring extension isn&apos;t loaded (Bug #17038).
Changes since version 1.1.7:
* Added support for adding a custom debug handler (Aleksander Machniak, Request #16681).
* Fix breakage with certain locales, especially Turkish.
* Fix reading authentication responses without literals (Bug #16647).
* Code cleanup.
   </notes>
  </release>
  <release>
   <date>2009-10-07</date>
   <version>
    <release>1.2.0b1</release>
    <api>1.2.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Added support for adding a custom debug handler (Aleksander Machniak, Request #16681).
* Fix breakage with certain locales, especially Turkish.
* Fix reading authentication responses without literals (Bug #16647).
* Code cleanup.
   </notes>
  </release>
  <release>
   <date>2009-07-24</date>
   <version>
    <release>1.1.7</release>
    <api>1.1.6</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed STARTTLS support (Bug #14205).
* Added connect options and EXTERNAL authentication.
   </notes>
  </release>
  <release>
   <date>2008-03-22</date>
   <version>
    <release>1.1.6</release>
    <api>1.1.6</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug #9273
* Fixed copy/paste error in CRAM and DIGEST authentication error case.
   </notes>
  </release>
  <release>
   <date>2006-10-24</date>
   <version>
    <release>1.1.5</release>
    <api>1.1.5</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug connect() bug
* Fixed Request #8071
   </notes>
  </release>
  <release>
   <date>2006-09-09</date>
   <version>
    <release>1.1.4</release>
    <api>1.1.4</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug #8452 Unterminated read loop
* Fixed Bug #7845 Add mbstring support
* Added Request #8071 Enable the ability to toggle TLS support if available.
* Added Request #8453 Clean up PHPDoc and comments
   </notes>
  </release>
  <release>
   <date>2006-05-21</date>
   <version>
    <release>1.1.3</release>
    <api>1.1.3</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Correctly Fixed Bug #3519 Net_Sieve w/ externally established sockets
* Fixed Bug #7197 getScript() truncates long scripts
* Added PHPUnit2 regression test script
   </notes>
  </release>
  <release>
   <date>2006-02-09</date>
   <version>
    <release>1.1.2</release>
    <api>1.1.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Request #4053 Added STARTTLS support for PHP 5.1 and above
    * Fixed Bug #3519 Net_Sieve w/ externally established sockets
    * Fixed Bug #4794 drops protocol prefix, e.g. &quot;ssl://&quot; in referrals
    * Fixed STARTTLS detection
    * Allow $options[] to be passed to Net_Socket
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.1</release>
    <api>1.1.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2005-02-02</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug #3242 cyrus murder referrals not followed
   </notes>
  </release>
  <release>
   <version>
    <release>1.1.0</release>
    <api>1.1.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-12-18</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed Bug #2728 Linebreaks not being read using getScript()
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.1</release>
    <api>1.0.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-03-13</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed BUG #1006
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.0</release>
    <api>1.0.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2004-03-10</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fixed DIGEST-MD5 sasl version handling (sasl v1.xx responses are diferent than v2.xx)
* Fixed LOGIN Method
   </notes>
  </release>
  <release>
   <version>
    <release>0.9.1</release>
    <api>0.9.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2004-02-29</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* There is an issue whith the DIGEST-MD5 method. in one installation it does not work but in my server it works perfect! please send me debug info to solve the problem if
it affects you or disable DIGEST-MD5
* some optimizations to the code
* added haveSpace() to check if the server has space to store the script. Use with care HAVESPACE seems to be broken in cyrus 2.0.16
* added hasExtension()
* added getExtensions()
* added referral support and automatic following of them. (it also handles the following of multireferrals).
* removed _getResponse replaced by _doCmd. (thanks to Etienne Goyer for this)
* added supportsAuthMech()
* if installed automatically uses Auth_SASL
* added CRAM-MD5 auth Method
* added DIGEST-MD5 auth Method
* added getAuthMechs() returns an array containing all the auth methods the server supports
* added hasAuthMech() to check if the server has a particular auth method
* _connect --&gt; connect: now is a public method (without breaking BC)
* _login --&gt; login: now is a public method (without breaking BC)
* fix typo  cmdAuthenticate() ---&gt;  _cmdAuthenticate()
* _doCmd() now parses string responses also.
   </notes>
  </release>
  <release>
   <version>
    <release>0.9.0</release>
    <api>0.9.0</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2004-01-31</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Added setDebug() method and debugging capabilities
* added disconnect() method
* added sample file test_sieve.php
* fixed bug #591
* automagically selects the best auth method
   </notes>
  </release>
  <release>
   <version>
    <release>0.8.1</release>
    <api>0.8.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2002-07-27</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
Initial release
   </notes>
  </release>
  <release>
   <version>
    <release>0.8</release>
    <api>0.8</api>
   </version>
   <stability>
    <release>beta</release>
    <api>beta</api>
   </stability>
   <date>2002-05-10</date>
   <license uri="http://www.php.net/license">PHP</license>
   <notes>
Initial release
   </notes>
  </release>
  <release>
   <date>2018-09-09</date>
   <version>
    <release>1.4.4</release>
    <api>1.4.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD</license>
   <notes>
* Fix PHP 7.3: Declaration of case-insensitive constants is deprecated
   </notes>
  </release>
 </changelog>
</package>
PK�^�\A��~0~0+pear/.pkgxml/Symfony2_CssSelector-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>CssSelector</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 CssSelector Component</summary>
 <description>Symfony2 CssSelector Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:42</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="e3e4f08d3d10d65070b694b3f63f7baf" name="Symfony/Component/CssSelector/autoloader.php" role="php" />
   <file md5sum="29b39013d7b608953abbd2ec2a2b108e" name="Symfony/Component/CssSelector/CHANGELOG.md" role="doc" />
   <file md5sum="404ca8cc75237ce4158c233f65f6c40a" name="Symfony/Component/CssSelector/composer.json" role="doc" />
   <file md5sum="df4cdb60586ed7c6e160abcecb3946cb" name="Symfony/Component/CssSelector/CssSelector.php" role="php" />
   <file md5sum="208a57b71460b044d40b1540a9694a3a" name="Symfony/Component/CssSelector/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="7118a4cf65f680202f0eaf2e908c2c0b" name="Symfony/Component/CssSelector/Exception/ExpressionErrorException.php" role="php" />
   <file md5sum="aa0dca2be11eee1f425fa517042f77dd" name="Symfony/Component/CssSelector/Exception/InternalErrorException.php" role="php" />
   <file md5sum="88581acf1955252a238ba1e7a9065c68" name="Symfony/Component/CssSelector/Exception/ParseException.php" role="php" />
   <file md5sum="9a8cda86fd4170ac7a11c040f4012ba3" name="Symfony/Component/CssSelector/Exception/SyntaxErrorException.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/CssSelector/LICENSE" role="doc" />
   <file md5sum="adb8f4d1edc1238e6b87598afc3a14b8" name="Symfony/Component/CssSelector/Node/AbstractNode.php" role="php" />
   <file md5sum="824e4ddb5ff40b70d2ad71755ebe8dfd" name="Symfony/Component/CssSelector/Node/AttributeNode.php" role="php" />
   <file md5sum="c6c998b135e447f8a28e3808f7e617f9" name="Symfony/Component/CssSelector/Node/ClassNode.php" role="php" />
   <file md5sum="7106faa07e1e5c71d82fe996008c895f" name="Symfony/Component/CssSelector/Node/CombinedSelectorNode.php" role="php" />
   <file md5sum="f21f0616e8265a5181e5f06a856c933b" name="Symfony/Component/CssSelector/Node/ElementNode.php" role="php" />
   <file md5sum="e836280bfc66eafa6baf245f0a3c3bb0" name="Symfony/Component/CssSelector/Node/FunctionNode.php" role="php" />
   <file md5sum="1a328bfb606d0643442c6170a9459759" name="Symfony/Component/CssSelector/Node/HashNode.php" role="php" />
   <file md5sum="c2cbeaac4f48dc4a66db5a248f8fec10" name="Symfony/Component/CssSelector/Node/NegationNode.php" role="php" />
   <file md5sum="b5a728ee8ad1d423d62efdcf4f657c26" name="Symfony/Component/CssSelector/Node/NodeInterface.php" role="php" />
   <file md5sum="4e924e9ba036136a008da903df86a360" name="Symfony/Component/CssSelector/Node/PseudoNode.php" role="php" />
   <file md5sum="7b47cf534893303b4e3d0bfdc2c5e2ff" name="Symfony/Component/CssSelector/Node/SelectorNode.php" role="php" />
   <file md5sum="bc8f1629f8cf146261b153e325d8ce1c" name="Symfony/Component/CssSelector/Node/Specificity.php" role="php" />
   <file md5sum="728097eaafd9e8018c6c7dcbebccea44" name="Symfony/Component/CssSelector/Parser/Handler/CommentHandler.php" role="php" />
   <file md5sum="9c84b47596c28514679be9c51f81f16e" name="Symfony/Component/CssSelector/Parser/Handler/HandlerInterface.php" role="php" />
   <file md5sum="4e97078058108e52db9b12c6da6a9109" name="Symfony/Component/CssSelector/Parser/Handler/HashHandler.php" role="php" />
   <file md5sum="b7bf58f74e1fc2309e25b7baa9d1d343" name="Symfony/Component/CssSelector/Parser/Handler/IdentifierHandler.php" role="php" />
   <file md5sum="83ff03c0d6a16a4fcce0f5de9fa23308" name="Symfony/Component/CssSelector/Parser/Handler/NumberHandler.php" role="php" />
   <file md5sum="61b35623c7532945151ffa7dd7f5d100" name="Symfony/Component/CssSelector/Parser/Handler/StringHandler.php" role="php" />
   <file md5sum="8f0d0212ec813837d767b7b26fe53585" name="Symfony/Component/CssSelector/Parser/Handler/WhitespaceHandler.php" role="php" />
   <file md5sum="809111f9a2ead47facf240b010627cb2" name="Symfony/Component/CssSelector/Parser/Parser.php" role="php" />
   <file md5sum="dfbca8e2e63ac97e63cebf19545218fe" name="Symfony/Component/CssSelector/Parser/ParserInterface.php" role="php" />
   <file md5sum="45ecfcb66b87c2a3784a9632a246060f" name="Symfony/Component/CssSelector/Parser/Reader.php" role="php" />
   <file md5sum="bbccdac49b44cddfdf5aa335af6cb7bb" name="Symfony/Component/CssSelector/Parser/Shortcut/ClassParser.php" role="php" />
   <file md5sum="804e233a3fea5cef8d63d07ac11d749b" name="Symfony/Component/CssSelector/Parser/Shortcut/ElementParser.php" role="php" />
   <file md5sum="bc23d8eac5180583a554b3c469f88776" name="Symfony/Component/CssSelector/Parser/Shortcut/EmptyStringParser.php" role="php" />
   <file md5sum="17d6d96570644684f01a2024992ef78c" name="Symfony/Component/CssSelector/Parser/Shortcut/HashParser.php" role="php" />
   <file md5sum="1f69e33454e833ed892e7ba74be9d6a8" name="Symfony/Component/CssSelector/Parser/Token.php" role="php" />
   <file md5sum="02f022d181917a067d284db4d05a5fd9" name="Symfony/Component/CssSelector/Parser/Tokenizer/Tokenizer.php" role="php" />
   <file md5sum="a227118fac4ee4eee1a06ae3f58f561b" name="Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerEscaping.php" role="php" />
   <file md5sum="5c6f061f1023771ed9ef034c39987e48" name="Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerPatterns.php" role="php" />
   <file md5sum="a95da42ba62cfcf96ae0721c2aef6271" name="Symfony/Component/CssSelector/Parser/TokenStream.php" role="php" />
   <file md5sum="6301c7c5ed355dad16bac2f2d7916334" name="Symfony/Component/CssSelector/phpunit.xml.dist" role="test" />
   <file md5sum="ae0bfe1d0ab7683160027e2028a500a9" name="Symfony/Component/CssSelector/README.md" role="doc" />
   <file md5sum="105f97c869d80ceaeab602ace2d02a4c" name="Symfony/Component/CssSelector/Tests/CssSelectorTest.php" role="test" />
   <file md5sum="fb966a846c4b2274ede7f234737a3fdf" name="Symfony/Component/CssSelector/Tests/Node/AbstractNodeTest.php" role="test" />
   <file md5sum="092c2094b2f340fe776efd016fce5eb5" name="Symfony/Component/CssSelector/Tests/Node/AttributeNodeTest.php" role="test" />
   <file md5sum="eca9764164e56b19fa1345e505ac00a3" name="Symfony/Component/CssSelector/Tests/Node/ClassNodeTest.php" role="test" />
   <file md5sum="214991c4a92512b719f1cc0be325019b" name="Symfony/Component/CssSelector/Tests/Node/CombinedSelectorNodeTest.php" role="test" />
   <file md5sum="b4cb8f0c44fef00b721da4e933d9f205" name="Symfony/Component/CssSelector/Tests/Node/ElementNodeTest.php" role="test" />
   <file md5sum="bbed27d30c8c4cc7c9ed8e69088600eb" name="Symfony/Component/CssSelector/Tests/Node/FunctionNodeTest.php" role="test" />
   <file md5sum="104b5fb3905b0d7557cd64af04afa077" name="Symfony/Component/CssSelector/Tests/Node/HashNodeTest.php" role="test" />
   <file md5sum="d96b688675039a28d44ee2ecd0929df2" name="Symfony/Component/CssSelector/Tests/Node/NegationNodeTest.php" role="test" />
   <file md5sum="05dd9359681c2bbafed998ce4e35be76" name="Symfony/Component/CssSelector/Tests/Node/PseudoNodeTest.php" role="test" />
   <file md5sum="4a5b7629d4b212920bd00024a5213657" name="Symfony/Component/CssSelector/Tests/Node/SelectorNodeTest.php" role="test" />
   <file md5sum="b550b9aacb73e080022549bbda34caf6" name="Symfony/Component/CssSelector/Tests/Node/SpecificityTest.php" role="test" />
   <file md5sum="83af69d075f8471eb4bfc9cad8f13ff2" name="Symfony/Component/CssSelector/Tests/Parser/Handler/AbstractHandlerTest.php" role="test" />
   <file md5sum="196568e95d36d1ca21071e86dbb5eeb8" name="Symfony/Component/CssSelector/Tests/Parser/Handler/CommentHandlerTest.php" role="test" />
   <file md5sum="290658d56ebcffe5ce8f2c2c38e2931b" name="Symfony/Component/CssSelector/Tests/Parser/Handler/HashHandlerTest.php" role="test" />
   <file md5sum="2273b97aa4a3c0610549edd8a278f689" name="Symfony/Component/CssSelector/Tests/Parser/Handler/IdentifierHandlerTest.php" role="test" />
   <file md5sum="a384123020ded9dca1e5adb522f700df" name="Symfony/Component/CssSelector/Tests/Parser/Handler/NumberHandlerTest.php" role="test" />
   <file md5sum="5df1ec9081c389b0a8171a15717be896" name="Symfony/Component/CssSelector/Tests/Parser/Handler/StringHandlerTest.php" role="test" />
   <file md5sum="6b796bb0920add27d724e9d20f549938" name="Symfony/Component/CssSelector/Tests/Parser/Handler/WhitespaceHandlerTest.php" role="test" />
   <file md5sum="1cde27c5bdf7267d0f57d4e1b956a4c1" name="Symfony/Component/CssSelector/Tests/Parser/ParserTest.php" role="test" />
   <file md5sum="5b6a8eb9014c35a8bdb4202200bc1c88" name="Symfony/Component/CssSelector/Tests/Parser/ReaderTest.php" role="test" />
   <file md5sum="1b2c8035f78686902f20778b1cb8f797" name="Symfony/Component/CssSelector/Tests/Parser/Shortcut/ClassParserTest.php" role="test" />
   <file md5sum="8ba77c09ff5ffd51dc3ac24c09d0e122" name="Symfony/Component/CssSelector/Tests/Parser/Shortcut/ElementParserTest.php" role="test" />
   <file md5sum="c03a0a760a4fc403aa3924670d8db091" name="Symfony/Component/CssSelector/Tests/Parser/Shortcut/EmptyStringParserTest.php" role="test" />
   <file md5sum="9a34d1dab3847e8a0f506d33a828b316" name="Symfony/Component/CssSelector/Tests/Parser/Shortcut/HashParserTest.php" role="test" />
   <file md5sum="abd404d57badfae769653f4db1db5d6d" name="Symfony/Component/CssSelector/Tests/Parser/TokenStreamTest.php" role="test" />
   <file md5sum="ab650cab7dd7fef95d85b7941012a70a" name="Symfony/Component/CssSelector/Tests/XPath/Fixtures/ids.html" role="test" />
   <file md5sum="717695cc05565465bc3acf15d9a427f2" name="Symfony/Component/CssSelector/Tests/XPath/Fixtures/lang.xml" role="test" />
   <file md5sum="58178acfc40a4729a0c8b11ac242ece5" name="Symfony/Component/CssSelector/Tests/XPath/Fixtures/shakespear.html" role="test" />
   <file md5sum="297ff7c35ebed5a7b3e9d1b3a5edfe19" name="Symfony/Component/CssSelector/Tests/XPath/TranslatorTest.php" role="test" />
   <file md5sum="36f2db5086cfda27484bc54a7267cddf" name="Symfony/Component/CssSelector/XPath/Extension/AbstractExtension.php" role="php" />
   <file md5sum="b146bf7b873f25e0b5a7424b67eff903" name="Symfony/Component/CssSelector/XPath/Extension/AttributeMatchingExtension.php" role="php" />
   <file md5sum="8f84c67fd6012af8de284b01c0754748" name="Symfony/Component/CssSelector/XPath/Extension/CombinationExtension.php" role="php" />
   <file md5sum="959c23787abad9e8c4bbba199cf33f3e" name="Symfony/Component/CssSelector/XPath/Extension/ExtensionInterface.php" role="php" />
   <file md5sum="5966f7a9794f6ccd306e8dfc127a3668" name="Symfony/Component/CssSelector/XPath/Extension/FunctionExtension.php" role="php" />
   <file md5sum="3ab07740061746645330dd5d41bb211e" name="Symfony/Component/CssSelector/XPath/Extension/HtmlExtension.php" role="php" />
   <file md5sum="d1f044c7891470c22cdd9ec874cd287d" name="Symfony/Component/CssSelector/XPath/Extension/NodeExtension.php" role="php" />
   <file md5sum="d16abca499c10dc7eede468dc8302dc6" name="Symfony/Component/CssSelector/XPath/Extension/PseudoClassExtension.php" role="php" />
   <file md5sum="008dda93517b6aba5b6f149946c576ab" name="Symfony/Component/CssSelector/XPath/Translator.php" role="php" />
   <file md5sum="64ba3e247c7e3d046227828a44179c7e" name="Symfony/Component/CssSelector/XPath/TranslatorInterface.php" role="php" />
   <file md5sum="e795b62a50ce86fecf5ef2a576cc42bb" name="Symfony/Component/CssSelector/XPath/XPathExpr.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\�܋Fccpear/.pkgxml/eZc.listnu�[���components.ez.no/Archive
components.ez.no/Base
components.ez.no/ConsoleTools
components.ez.no/File
PK�^�\tWY�n�n*pear/.pkgxml/Symfony2_HttpKernel-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>HttpKernel</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 HttpKernel Component</summary>
 <description>Symfony2 HttpKernel Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:47</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="a1af1bc22f997eb0aaeb301a8d715989" name="Symfony/Component/HttpKernel/autoloader.php" role="php" />
   <file md5sum="034988ec8522419fef54715968ff5640" name="Symfony/Component/HttpKernel/Bundle/Bundle.php" role="php" />
   <file md5sum="eced991d4b8fe038cf5a39d571e03389" name="Symfony/Component/HttpKernel/Bundle/BundleInterface.php" role="php" />
   <file md5sum="1ab9fcfe250122ae01956d7d1df16c01" name="Symfony/Component/HttpKernel/CacheClearer/CacheClearerInterface.php" role="php" />
   <file md5sum="940b15c92fa6ba0a1e508239610228a8" name="Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.php" role="php" />
   <file md5sum="7435d5f981a3db589251151722cebbf0" name="Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.php" role="php" />
   <file md5sum="07e93162aecd5b6c4dffea675f2684b1" name="Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php" role="php" />
   <file md5sum="75d231528a43ed388b3b742e68b6c43a" name="Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.php" role="php" />
   <file md5sum="d0ccc4f26ea62bd6a3d1c528664b49b5" name="Symfony/Component/HttpKernel/CacheWarmer/WarmableInterface.php" role="php" />
   <file md5sum="2d18e70a6cd04cddb49776f32632599a" name="Symfony/Component/HttpKernel/CHANGELOG.md" role="doc" />
   <file md5sum="d1bc00e92123f8295cb75492e39f9dc5" name="Symfony/Component/HttpKernel/Client.php" role="php" />
   <file md5sum="44dd55d48bc718e4380133c689a1cc18" name="Symfony/Component/HttpKernel/composer.json" role="doc" />
   <file md5sum="8873220cb27f7c61053fc2feb76d138e" name="Symfony/Component/HttpKernel/Config/FileLocator.php" role="php" />
   <file md5sum="a649fc31311b4b336290e86a7615eed0" name="Symfony/Component/HttpKernel/Controller/ControllerReference.php" role="php" />
   <file md5sum="4df25d60d1eefb2844dcbaa250428ca8" name="Symfony/Component/HttpKernel/Controller/ControllerResolver.php" role="php" />
   <file md5sum="743a4faee533d426fe09db12e53501ab" name="Symfony/Component/HttpKernel/Controller/ControllerResolverInterface.php" role="php" />
   <file md5sum="25b16c005e61a48d621c219456d553bc" name="Symfony/Component/HttpKernel/Controller/TraceableControllerResolver.php" role="php" />
   <file md5sum="e69af41765bee94a115225f3a5d25cf1" name="Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php" role="php" />
   <file md5sum="5dbe243c81e871e949be8298cadf4f4a" name="Symfony/Component/HttpKernel/DataCollector/DataCollector.php" role="php" />
   <file md5sum="ffd4ec58caeabebaab60382110104899" name="Symfony/Component/HttpKernel/DataCollector/DataCollectorInterface.php" role="php" />
   <file md5sum="54add9b16cd4329326a940ce70255f7a" name="Symfony/Component/HttpKernel/DataCollector/EventDataCollector.php" role="php" />
   <file md5sum="206153be1698da0605d1dff2c04d6f7e" name="Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.php" role="php" />
   <file md5sum="3cbcfac5aa0d0d92b5ffe9bfbdb4379d" name="Symfony/Component/HttpKernel/DataCollector/LateDataCollectorInterface.php" role="php" />
   <file md5sum="7f91f64a97e2780be6d214434d1974aa" name="Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php" role="php" />
   <file md5sum="39b08f06e47dbe55291666d79dfe77ea" name="Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.php" role="php" />
   <file md5sum="6331bb9218f46832e73986ca4ad45a30" name="Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.php" role="php" />
   <file md5sum="27268087d500134868734ba6352b9c74" name="Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.php" role="php" />
   <file md5sum="fce90930e38e9cd4641aacf2764ed6f4" name="Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.php" role="php" />
   <file md5sum="7d66d96e42598dea22dad278b9ac3b2a" name="Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php" role="php" />
   <file md5sum="ab27b3a991a404a9f83ad33c137ddc64" name="Symfony/Component/HttpKernel/Debug/ErrorHandler.php" role="php" />
   <file md5sum="abd0e561ece8935db9925995726a9c3a" name="Symfony/Component/HttpKernel/Debug/ExceptionHandler.php" role="php" />
   <file md5sum="42886c591f797433ebfa6c4a75e0fb34" name="Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php" role="php" />
   <file md5sum="6def64fd265b897b89f8e82b229ac9f3" name="Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php" role="php" />
   <file md5sum="177422f6ff3ceb6a638f8a7e5ec4f166" name="Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.php" role="php" />
   <file md5sum="12960ef346b18a127742a5cda62960ac" name="Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel.php" role="php" />
   <file md5sum="da97a0908acb2f0576a735ee424f424d" name="Symfony/Component/HttpKernel/DependencyInjection/Extension.php" role="php" />
   <file md5sum="aef8eb59f79f4881d9f63e831c3c8546" name="Symfony/Component/HttpKernel/DependencyInjection/MergeExtensionConfigurationPass.php" role="php" />
   <file md5sum="2c9db8df37168a875bebf70976bc2bda" name="Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php" role="php" />
   <file md5sum="947b8934d83f90492c51cfb3a4e8bf34" name="Symfony/Component/HttpKernel/Event/FilterControllerEvent.php" role="php" />
   <file md5sum="c9c047b7ab1488a4eb857d71286c42eb" name="Symfony/Component/HttpKernel/Event/FilterResponseEvent.php" role="php" />
   <file md5sum="aae774c8c1c640f429459d3800a02806" name="Symfony/Component/HttpKernel/Event/FinishRequestEvent.php" role="php" />
   <file md5sum="63460a57e5067155dccae05cf237d193" name="Symfony/Component/HttpKernel/Event/GetResponseEvent.php" role="php" />
   <file md5sum="9049ee5a681b82f0471a2a2f3b405a1e" name="Symfony/Component/HttpKernel/Event/GetResponseForControllerResultEvent.php" role="php" />
   <file md5sum="86e1625ae2dbb2a4d98dff9d02365f00" name="Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.php" role="php" />
   <file md5sum="f7a5741350e52e946bd15455c71bff2a" name="Symfony/Component/HttpKernel/Event/KernelEvent.php" role="php" />
   <file md5sum="010c1849bb93d622dcabdcdbfa4f04a3" name="Symfony/Component/HttpKernel/Event/PostResponseEvent.php" role="php" />
   <file md5sum="892d5e12db614472e9aaa1f8aec879ab" name="Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.php" role="php" />
   <file md5sum="b9821a05b72584a3a374a93bee0f4314" name="Symfony/Component/HttpKernel/EventListener/EsiListener.php" role="php" />
   <file md5sum="ec0b722acddc40bc24c04bcb735aefdc" name="Symfony/Component/HttpKernel/EventListener/ExceptionListener.php" role="php" />
   <file md5sum="0f5e7d02ae8c0deb48e6da848e70c313" name="Symfony/Component/HttpKernel/EventListener/FragmentListener.php" role="php" />
   <file md5sum="b300d4915a4478d77599e2cc5899f553" name="Symfony/Component/HttpKernel/EventListener/LocaleListener.php" role="php" />
   <file md5sum="a80ed8fee6a904ffbebca1d9850182b8" name="Symfony/Component/HttpKernel/EventListener/ProfilerListener.php" role="php" />
   <file md5sum="9f012c160c2b78e89e457aed4c054cf0" name="Symfony/Component/HttpKernel/EventListener/ResponseListener.php" role="php" />
   <file md5sum="bcfe15dc4f5806b2a8516ef3509c38e3" name="Symfony/Component/HttpKernel/EventListener/RouterListener.php" role="php" />
   <file md5sum="04649898f8756be91b4907fd10654daf" name="Symfony/Component/HttpKernel/EventListener/SessionListener.php" role="php" />
   <file md5sum="57b574b30b287bfbe406beba0769749b" name="Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php" role="php" />
   <file md5sum="c6a6e3f8b65f17d2dc889e4b2c99635b" name="Symfony/Component/HttpKernel/EventListener/TestSessionListener.php" role="php" />
   <file md5sum="c73ec96922ce59adb33ca4bfefa8030c" name="Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.php" role="php" />
   <file md5sum="6cf7e6c73081980c26b6ecad6d0efc1b" name="Symfony/Component/HttpKernel/Exception/BadRequestHttpException.php" role="php" />
   <file md5sum="2d4d5a8229cf646d3b4b75d593f14d3b" name="Symfony/Component/HttpKernel/Exception/ConflictHttpException.php" role="php" />
   <file md5sum="6b3122c7757ff734e12bec8a74c25a98" name="Symfony/Component/HttpKernel/Exception/FatalErrorException.php" role="php" />
   <file md5sum="7a74b213d324d95f414b50650d893331" name="Symfony/Component/HttpKernel/Exception/FlattenException.php" role="php" />
   <file md5sum="e8a597fe1f0d5b3525f9649f25ed78b9" name="Symfony/Component/HttpKernel/Exception/GoneHttpException.php" role="php" />
   <file md5sum="dff8d6e0c64447e27bc68937a77dddd4" name="Symfony/Component/HttpKernel/Exception/HttpException.php" role="php" />
   <file md5sum="5287f16f397ce02139bb29f4f915ba73" name="Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.php" role="php" />
   <file md5sum="c03fdcab809f96c2edf326ef5d329840" name="Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.php" role="php" />
   <file md5sum="27a47db2975d463cc92750a50af7b692" name="Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.php" role="php" />
   <file md5sum="ef3c26636669dab061813267c477ea3a" name="Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.php" role="php" />
   <file md5sum="e082b7408c1b8c6b4e89c909db565d24" name="Symfony/Component/HttpKernel/Exception/NotFoundHttpException.php" role="php" />
   <file md5sum="59bc8fe9c3f62fed6aa80c7004b175b1" name="Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.php" role="php" />
   <file md5sum="f389be4cfb101bc034f78207e8918de9" name="Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.php" role="php" />
   <file md5sum="e4519a15bbd32746e2cdb50690432dca" name="Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.php" role="php" />
   <file md5sum="a11ab40bfda34f0f200196711b7a1a5e" name="Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.php" role="php" />
   <file md5sum="2bc4556d5f4010d1b0d6eb59a6d99295" name="Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.php" role="php" />
   <file md5sum="54ea4537a407708dc6a1fa2b614e6092" name="Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.php" role="php" />
   <file md5sum="90c57168f27173fdb9c128cc3dceec6c" name="Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.php" role="php" />
   <file md5sum="e7b606e96e7696fefaf0290bd134a364" name="Symfony/Component/HttpKernel/Fragment/FragmentHandler.php" role="php" />
   <file md5sum="92c2b17efc0ff03094dbe55603835cd7" name="Symfony/Component/HttpKernel/Fragment/FragmentRendererInterface.php" role="php" />
   <file md5sum="eb63af63d6d386b8ce0b6faeda979a5c" name="Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.php" role="php" />
   <file md5sum="71d698c9b1e16a25819450db6db7cb57" name="Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php" role="php" />
   <file md5sum="fbce96e11756ed0deb106c0192e29a8a" name="Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php" role="php" />
   <file md5sum="fa7788cbb3d094b334c129d4b12df2f1" name="Symfony/Component/HttpKernel/HttpCache/Esi.php" role="php" />
   <file md5sum="45e69313f1a53d5ebab91bf3c18d48ec" name="Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.php" role="php" />
   <file md5sum="091ed77cd920fc81d7cc3fa663a20be4" name="Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategyInterface.php" role="php" />
   <file md5sum="c49bf34675051f7bed1f6444d720a412" name="Symfony/Component/HttpKernel/HttpCache/HttpCache.php" role="php" />
   <file md5sum="a5f55c6da48996bf5e0cec62eb9dfa9b" name="Symfony/Component/HttpKernel/HttpCache/Store.php" role="php" />
   <file md5sum="23cb34a2a464e310a6cc4ad8053190b4" name="Symfony/Component/HttpKernel/HttpCache/StoreInterface.php" role="php" />
   <file md5sum="90b674ef382b3241a3533e5561c285e3" name="Symfony/Component/HttpKernel/HttpKernel.php" role="php" />
   <file md5sum="a26257098916c1d939b7b0a04f44dfb8" name="Symfony/Component/HttpKernel/HttpKernelInterface.php" role="php" />
   <file md5sum="ba5fe007a2ac71d42ccc2c8d10cf5326" name="Symfony/Component/HttpKernel/Kernel.php" role="php" />
   <file md5sum="84732b3d13c1d962a9ca76189f5f5086" name="Symfony/Component/HttpKernel/KernelEvents.php" role="php" />
   <file md5sum="b2547cd0399c7d610c3c31bf8fafc1c1" name="Symfony/Component/HttpKernel/KernelInterface.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/HttpKernel/LICENSE" role="doc" />
   <file md5sum="729e7e46e4dd1a18559aa41e58548e09" name="Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php" role="php" />
   <file md5sum="a63e038a0c6c529619b2197afcf54e57" name="Symfony/Component/HttpKernel/Log/LoggerInterface.php" role="php" />
   <file md5sum="fdaed4279e4932db9593cab3d9801f80" name="Symfony/Component/HttpKernel/Log/NullLogger.php" role="php" />
   <file md5sum="480db13c5bc7a6911c241df127572a69" name="Symfony/Component/HttpKernel/phpunit.xml.dist" role="test" />
   <file md5sum="f42eab7a5e7ec989509aefc70a57e76c" name="Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.php" role="php" />
   <file md5sum="3a0a7571fcf3f33c4958016fef0ac6e1" name="Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php" role="php" />
   <file md5sum="c6e448f617b7211c44095e8730c4a2bd" name="Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.php" role="php" />
   <file md5sum="439c84953c390c2310af0b269b63c37b" name="Symfony/Component/HttpKernel/Profiler/MemcacheProfilerStorage.php" role="php" />
   <file md5sum="c1743fb29d46daedfa747ed47b9494c1" name="Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.php" role="php" />
   <file md5sum="4d2027032d2e5c190aa65e54394db133" name="Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.php" role="php" />
   <file md5sum="8d24566fd44b8a4b06c64127a5a03c2a" name="Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.php" role="php" />
   <file md5sum="af734240bcbd3fc0ecfc377333f9bcd9" name="Symfony/Component/HttpKernel/Profiler/Profile.php" role="php" />
   <file md5sum="3433ee1c2d23c78d68774f83c97eb578" name="Symfony/Component/HttpKernel/Profiler/Profiler.php" role="php" />
   <file md5sum="17d9e40eefdb2fad667dc74ebf858c85" name="Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.php" role="php" />
   <file md5sum="e10da26d143cc3a6336f7e97c7f4d535" name="Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.php" role="php" />
   <file md5sum="b69028b6ff27fff88714b26e65d6d6cf" name="Symfony/Component/HttpKernel/Profiler/SqliteProfilerStorage.php" role="php" />
   <file md5sum="a88bdc6a3df6948b04db2f5d8c76c865" name="Symfony/Component/HttpKernel/README.md" role="doc" />
   <file md5sum="63651d1c2efa91187e171c23fa108bcc" name="Symfony/Component/HttpKernel/TerminableInterface.php" role="php" />
   <file md5sum="5db4015a25ec64975433954495425cb9" name="Symfony/Component/HttpKernel/Tests/Bundle/BundleTest.php" role="test" />
   <file md5sum="719d0acb32f69e30070481fc995d7c95" name="Symfony/Component/HttpKernel/Tests/CacheClearer/ChainCacheClearerTest.php" role="test" />
   <file md5sum="a670a188bc612138042a48ce08d0d86c" name="Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerAggregateTest.php" role="test" />
   <file md5sum="aa85344cf1c9a4ea3472caad8fd270e1" name="Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerTest.php" role="test" />
   <file md5sum="d8434d3e6d9ab70624691695c0463227" name="Symfony/Component/HttpKernel/Tests/ClientTest.php" role="test" />
   <file md5sum="5e1515ccdd440d46fca79579beb81ea1" name="Symfony/Component/HttpKernel/Tests/Config/FileLocatorTest.php" role="test" />
   <file md5sum="537f569f63ee14058800342fc3e0a242" name="Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php" role="test" />
   <file md5sum="39a22588190c09f58431a38ce9ebd6bc" name="Symfony/Component/HttpKernel/Tests/DataCollector/ConfigDataCollectorTest.php" role="test" />
   <file md5sum="0cf6afafd5af55e00d3c5f9ba31d8917" name="Symfony/Component/HttpKernel/Tests/DataCollector/ExceptionDataCollectorTest.php" role="test" />
   <file md5sum="db74032e31e4161dc21aaf9443a4910f" name="Symfony/Component/HttpKernel/Tests/DataCollector/LoggerDataCollectorTest.php" role="test" />
   <file md5sum="dd889c18076eab8becd1544e90472aae" name="Symfony/Component/HttpKernel/Tests/DataCollector/MemoryDataCollectorTest.php" role="test" />
   <file md5sum="cdab18131698b1915f326cbe376097c2" name="Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.php" role="test" />
   <file md5sum="cad604b1dab9e0178b105ccee837ab52" name="Symfony/Component/HttpKernel/Tests/DataCollector/TimeDataCollectorTest.php" role="test" />
   <file md5sum="47bb53262ba95915cc2f7c2c905ccd04" name="Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php" role="test" />
   <file md5sum="761aed0102e13403661542c40ff2441a" name="Symfony/Component/HttpKernel/Tests/DependencyInjection/ContainerAwareHttpKernelTest.php" role="test" />
   <file md5sum="92e4fbfef80def18781bd8a16000b2ec" name="Symfony/Component/HttpKernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.php" role="test" />
   <file md5sum="b8ec326aa5b3ad38b2aceb0f6f9f2b17" name="Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.php" role="test" />
   <file md5sum="0af1d216963fc1ad9bf090060c450f69" name="Symfony/Component/HttpKernel/Tests/EventListener/EsiListenerTest.php" role="test" />
   <file md5sum="3d35f03216a8c24fbec0d4690f6a4e9b" name="Symfony/Component/HttpKernel/Tests/EventListener/ExceptionListenerTest.php" role="test" />
   <file md5sum="2b58c87811bcb1e4d1e01a66b57d4a28" name="Symfony/Component/HttpKernel/Tests/EventListener/FragmentListenerTest.php" role="test" />
   <file md5sum="4e1ca37427ffb634328d287bf5bb179b" name="Symfony/Component/HttpKernel/Tests/EventListener/LocaleListenerTest.php" role="test" />
   <file md5sum="0badf4d0b6a602b51de96b965d34b5a4" name="Symfony/Component/HttpKernel/Tests/EventListener/ProfilerListenerTest.php" role="test" />
   <file md5sum="459a71cfa659bd53df29387cabad577b" name="Symfony/Component/HttpKernel/Tests/EventListener/ResponseListenerTest.php" role="test" />
   <file md5sum="60d79091d972859015aeea894ceb632f" name="Symfony/Component/HttpKernel/Tests/EventListener/RouterListenerTest.php" role="test" />
   <file md5sum="c3c274823c0ae42288813e3881f5b2d9" name="Symfony/Component/HttpKernel/Tests/EventListener/TestSessionListenerTest.php" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/foo.txt" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/hide.txt" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/bar.txt" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/foo.txt" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txt" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/Bundle2Bundle/foo.txt" role="test" />
   <file md5sum="9ab5af02cc19f043e6ab4c12f826be86" name="Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/classes.map" role="test" />
   <file md5sum="0d04f0c8627b1c410d6d47246199fb55" name="Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/MockObjectTestProjectContainer.php" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/foo.txt" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/hide.txt" role="test" />
   <file md5sum="087e3dc7776e8d94ff7ae2852dc912bd" name="Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.php" role="test" />
   <file md5sum="27015c77094432ed5a984416d760fd74" name="Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.php" role="test" />
   <file md5sum="a1e589e6fb85f086e2d31f4f37e62fe9" name="Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.php" role="test" />
   <file md5sum="6cbbfc883c6a2ff486474f87476f0563" name="Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.php" role="test" />
   <file md5sum="54610c5e45d73507ef3b70c59a6140c2" name="Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.php" role="test" />
   <file md5sum="580c52df0c49dbe51b8953eafa44adff" name="Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.php" role="test" />
   <file md5sum="e2b6b77bad66ea379f550eeaa0c99476" name="Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php" role="test" />
   <file md5sum="f5505afbf35dae7260891f4a9fd1cfd4" name="Symfony/Component/HttpKernel/Tests/Fixtures/FooBarBundle.php" role="test" />
   <file md5sum="468ec4e8ecf949b24336c3e2557bc7bf" name="Symfony/Component/HttpKernel/Tests/Fixtures/KernelForOverrideName.php" role="test" />
   <file md5sum="c9615a710a6e8dfdb0dd2daaa77b8377" name="Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/Resources/BaseBundle/hide.txt" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txt" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/Resources/ChildBundle/foo.txt" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/HttpKernel/Tests/Fixtures/Resources/FooBundle/foo.txt" role="test" />
   <file md5sum="caac83e9f7141808a279c9415b3d631d" name="Symfony/Component/HttpKernel/Tests/Fixtures/TestClient.php" role="test" />
   <file md5sum="cf1be212b7c33954b81cbb5f17f90901" name="Symfony/Component/HttpKernel/Tests/Fixtures/TestEventDispatcher.php" role="test" />
   <file md5sum="bc9d6216414586747e3857fcc1884c33" name="Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php" role="test" />
   <file md5sum="fa6ac6afb43b8f9f17bac5f34b8079b1" name="Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.php" role="test" />
   <file md5sum="d42e11990c445631c29d351e1050bc12" name="Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php" role="test" />
   <file md5sum="0914364078b13a058fc4ad858a9a97a2" name="Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php" role="test" />
   <file md5sum="99d3a3885bcaaeaa9d7daa7628d16b6b" name="Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php" role="test" />
   <file md5sum="0839be428bd44e163cd68390f4ef49da" name="Symfony/Component/HttpKernel/Tests/HttpCache/EsiTest.php" role="test" />
   <file md5sum="58d82c49cec84700cfeac27313345271" name="Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.php" role="test" />
   <file md5sum="b03bb6f91a5309a1e83e6b892a9759cc" name="Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.php" role="test" />
   <file md5sum="070e9eeb7eff1f89e79917937aa7b692" name="Symfony/Component/HttpKernel/Tests/HttpCache/StoreTest.php" role="test" />
   <file md5sum="9968d637c2ee0189e7983c285f1cb353" name="Symfony/Component/HttpKernel/Tests/HttpCache/TestHttpKernel.php" role="test" />
   <file md5sum="f8033c30b37e92bfbc3c61885dc4f6d2" name="Symfony/Component/HttpKernel/Tests/HttpCache/TestMultipleHttpKernel.php" role="test" />
   <file md5sum="cc31bf84e75276fcc9efa9f5f0c45302" name="Symfony/Component/HttpKernel/Tests/HttpKernelTest.php" role="test" />
   <file md5sum="985b62eefe124bbd995e6c9da0b46dbf" name="Symfony/Component/HttpKernel/Tests/KernelTest.php" role="test" />
   <file md5sum="f544395e09366b61d2e01f49c15066ff" name="Symfony/Component/HttpKernel/Tests/Logger.php" role="test" />
   <file md5sum="3d025b1cac5e80626a19849b06a41e91" name="Symfony/Component/HttpKernel/Tests/Profiler/AbstractProfilerStorageTest.php" role="test" />
   <file md5sum="12f40567e2687864d629e2437915b127" name="Symfony/Component/HttpKernel/Tests/Profiler/FileProfilerStorageTest.php" role="test" />
   <file md5sum="f88559896ea0d7bea467da273976fcc3" name="Symfony/Component/HttpKernel/Tests/Profiler/MemcachedProfilerStorageTest.php" role="test" />
   <file md5sum="285f9b91923d397ff0704c465eb76378" name="Symfony/Component/HttpKernel/Tests/Profiler/MemcacheProfilerStorageTest.php" role="test" />
   <file md5sum="a9448076fbd5c7d42bb595bf6626226b" name="Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.php" role="test" />
   <file md5sum="aaee125b4e1132032c58f5ca4c03bb40" name="Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.php" role="test" />
   <file md5sum="796c2e18d225e482facc9de766f8bba7" name="Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.php" role="test" />
   <file md5sum="ed9ba23032795739acc33ba5d1970557" name="Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.php" role="test" />
   <file md5sum="9a65333f51c36b0b6a837f1105c2d022" name="Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.php" role="test" />
   <file md5sum="e84fca3c3f76faa48cf1b760ab1fc079" name="Symfony/Component/HttpKernel/Tests/Profiler/RedisProfilerStorageTest.php" role="test" />
   <file md5sum="fad36380de80995905e7a2046f3d01b0" name="Symfony/Component/HttpKernel/Tests/Profiler/SqliteProfilerStorageTest.php" role="test" />
   <file md5sum="5b8daaba0cf9db86b60c25116c7ab8a4" name="Symfony/Component/HttpKernel/Tests/TestHttpKernel.php" role="test" />
   <file md5sum="bf06babf2bdca6d62c7960c8a9e53e68" name="Symfony/Component/HttpKernel/Tests/UriSignerTest.php" role="test" />
   <file md5sum="9daa3c983b391a8dae8e4e7b34f26e07" name="Symfony/Component/HttpKernel/UriSigner.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
   <package>
    <name>HttpFoundation</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>EventDispatcher</name>
    <channel>pear.symfony.com</channel>
   </package>
  </required>
  <optional>
   <package>
    <name>Config</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>DependencyInjection</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>ClassLoader</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>BrowserKit</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Console</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Finder</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\�����pear/.pkgxml/Symfony2.listnu�[���pear.symfony.com/BrowserKit
pear.symfony.com/ClassLoader
pear.symfony.com/Config
pear.symfony.com/Console
pear.symfony.com/CssSelector
pear.symfony.com/DependencyInjection
pear.symfony.com/DoctrineBridge
pear.symfony.com/DomCrawler
pear.symfony.com/EventDispatcher
pear.symfony.com/Filesystem
pear.symfony.com/Finder
pear.symfony.com/Form
pear.symfony.com/HttpFoundation
pear.symfony.com/HttpKernel
pear.symfony.com/Locale
pear.symfony.com/MonologBridge
pear.symfony.com/OptionsResolver
pear.symfony.com/Process
pear.symfony.com/Routing
pear.symfony.com/Security
pear.symfony.com/Serializer
pear.symfony.com/Templating
pear.symfony.com/Translation
pear.symfony.com/TwigBridge
pear.symfony.com/Validator
pear.symfony.com/Yaml
PK�^�\��UU�_�_'pear/.pkgxml/Symfony2_Console-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Console</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Console Component</summary>
 <description>Symfony2 Console Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:42</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="d7fa5d3e678f32b207a275d566bd226b" name="Symfony/Component/Console/Application.php" role="php" />
   <file md5sum="a67fcf08fe6f3092f954fdd247d138d8" name="Symfony/Component/Console/autoloader.php" role="php" />
   <file md5sum="e2b61d6b18ded64f0686599db5c7fb5b" name="Symfony/Component/Console/CHANGELOG.md" role="doc" />
   <file md5sum="80d4d8e858f5a83230701aed15e6f9ff" name="Symfony/Component/Console/Command/Command.php" role="php" />
   <file md5sum="d10467979ea85e92951425fd351347ac" name="Symfony/Component/Console/Command/HelpCommand.php" role="php" />
   <file md5sum="7f0bd50020e8b9c39d79692f3e32db8f" name="Symfony/Component/Console/Command/ListCommand.php" role="php" />
   <file md5sum="9e146f5ae7085917809444efe2d868c6" name="Symfony/Component/Console/composer.json" role="doc" />
   <file md5sum="10001de60b8e31092612e73dc02300d7" name="Symfony/Component/Console/ConsoleEvents.php" role="php" />
   <file md5sum="e5ffa840297bdf9232762c38218846dc" name="Symfony/Component/Console/Descriptor/ApplicationDescription.php" role="php" />
   <file md5sum="e08a534aa99b2e90d1538a0c166973e5" name="Symfony/Component/Console/Descriptor/Descriptor.php" role="php" />
   <file md5sum="d5b9abe215ed28ac8ca7fe9d72fc9ddd" name="Symfony/Component/Console/Descriptor/DescriptorInterface.php" role="php" />
   <file md5sum="a997223049fcf34294263e3a6c37e230" name="Symfony/Component/Console/Descriptor/JsonDescriptor.php" role="php" />
   <file md5sum="bec9d13cc9cb6e778c4f4083199137b6" name="Symfony/Component/Console/Descriptor/MarkdownDescriptor.php" role="php" />
   <file md5sum="97b571928164645af31610ea97bc43fb" name="Symfony/Component/Console/Descriptor/TextDescriptor.php" role="php" />
   <file md5sum="a9214dd6cf39faa121dc4de62996071a" name="Symfony/Component/Console/Descriptor/XmlDescriptor.php" role="php" />
   <file md5sum="2832db2aee4207de5d53d012b314436d" name="Symfony/Component/Console/Event/ConsoleCommandEvent.php" role="php" />
   <file md5sum="aaaa8c390cd99e01d7bb2649a735e469" name="Symfony/Component/Console/Event/ConsoleEvent.php" role="php" />
   <file md5sum="22e5c027468f33b0bd20540b41af7a74" name="Symfony/Component/Console/Event/ConsoleExceptionEvent.php" role="php" />
   <file md5sum="82fbfa586f39a859d66a45221cb773c1" name="Symfony/Component/Console/Event/ConsoleTerminateEvent.php" role="php" />
   <file md5sum="304b90bba47ad3ed5534a37ec1647980" name="Symfony/Component/Console/Formatter/OutputFormatter.php" role="php" />
   <file md5sum="75e7364468e427f080f86354f9bab9b9" name="Symfony/Component/Console/Formatter/OutputFormatterInterface.php" role="php" />
   <file md5sum="4d0b8e5a84926a6013be77aa123e61eb" name="Symfony/Component/Console/Formatter/OutputFormatterStyle.php" role="php" />
   <file md5sum="091bf3ec019e14a48b1f61ef7cb6871a" name="Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php" role="php" />
   <file md5sum="27952fd939968e3615ce7ada4c761e0e" name="Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php" role="php" />
   <file md5sum="d5bb73eb73014de416365c07cd81cac5" name="Symfony/Component/Console/Helper/DescriptorHelper.php" role="php" />
   <file md5sum="ae0bb3641414453024a3d71275abd1c1" name="Symfony/Component/Console/Helper/DialogHelper.php" role="php" />
   <file md5sum="86ebeb32b3353bc7ba4363bf7a05fa2f" name="Symfony/Component/Console/Helper/FormatterHelper.php" role="php" />
   <file md5sum="426298ce1ccd85ab527a5cef78f9a33b" name="Symfony/Component/Console/Helper/Helper.php" role="php" />
   <file md5sum="e9012e6f3559129d513da4ba75ebf4e9" name="Symfony/Component/Console/Helper/HelperInterface.php" role="php" />
   <file md5sum="9c0badab04f9b052cec6a06c3f11fb07" name="Symfony/Component/Console/Helper/HelperSet.php" role="php" />
   <file md5sum="c75592e1f3b10c1f35961c50d55ae58d" name="Symfony/Component/Console/Helper/InputAwareHelper.php" role="php" />
   <file md5sum="c6c85dbb2f08fa52bc6739ba6896bdc9" name="Symfony/Component/Console/Helper/ProgressHelper.php" role="php" />
   <file md5sum="1671e0f028279a642e6c0f7dcaa474c4" name="Symfony/Component/Console/Helper/TableHelper.php" role="php" />
   <file md5sum="e95b97c2b870d6223e84a995c93f16ce" name="Symfony/Component/Console/Input/ArgvInput.php" role="php" />
   <file md5sum="1e51135fb1c605381452c4d0cae3f1c4" name="Symfony/Component/Console/Input/ArrayInput.php" role="php" />
   <file md5sum="87ba519b169574bdcaabaef68740989a" name="Symfony/Component/Console/Input/Input.php" role="php" />
   <file md5sum="c2f88afd2a0f1601dcfd3cce07092197" name="Symfony/Component/Console/Input/InputArgument.php" role="php" />
   <file md5sum="a67cb5e626983b20e2c03b618d7ab012" name="Symfony/Component/Console/Input/InputAwareInterface.php" role="php" />
   <file md5sum="74e92dce0c01082eb3d96959f3268509" name="Symfony/Component/Console/Input/InputDefinition.php" role="php" />
   <file md5sum="9a40ecfaca79fa6bed0e459c035fdb5c" name="Symfony/Component/Console/Input/InputInterface.php" role="php" />
   <file md5sum="2712657bb89ede768dfb9d0eb1f1d256" name="Symfony/Component/Console/Input/InputOption.php" role="php" />
   <file md5sum="eaf496e1188492448d9cfe8dfbcede6a" name="Symfony/Component/Console/Input/StringInput.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Console/LICENSE" role="doc" />
   <file md5sum="07bca2bc77753b0b0cc4502f109c4a8e" name="Symfony/Component/Console/Output/BufferedOutput.php" role="php" />
   <file md5sum="64e00ce49a3a47e8ea7b8885f10c1ee6" name="Symfony/Component/Console/Output/ConsoleOutput.php" role="php" />
   <file md5sum="9cf400160437ff90febb665841a968fe" name="Symfony/Component/Console/Output/ConsoleOutputInterface.php" role="php" />
   <file md5sum="561f460b93be0c27aa9be546af49e9ec" name="Symfony/Component/Console/Output/NullOutput.php" role="php" />
   <file md5sum="15c209a7581a632e6979d5441a02f241" name="Symfony/Component/Console/Output/Output.php" role="php" />
   <file md5sum="ac6d776cf82c8b887395c54482f17bd7" name="Symfony/Component/Console/Output/OutputInterface.php" role="php" />
   <file md5sum="dc57630f625779ad86f6f3d8240ad0c3" name="Symfony/Component/Console/Output/StreamOutput.php" role="php" />
   <file md5sum="c94fc23909e8f1d27908cd0486653611" name="Symfony/Component/Console/phpunit.xml.dist" role="test" />
   <file md5sum="70a92aecafcdc1f689a2a798acccefe4" name="Symfony/Component/Console/README.md" role="doc" />
   <file md5sum="3613d8d83b78ce3561680a447eb6a24a" name="Symfony/Component/Console/Resources/bin/hiddeninput.exe" role="php" />
   <file md5sum="fedc847f6c992a242e45a167b0cf1866" name="Symfony/Component/Console/Shell.php" role="php" />
   <file md5sum="f2c7b88716f13cb54825a933832a74a8" name="Symfony/Component/Console/Tester/ApplicationTester.php" role="php" />
   <file md5sum="9b7bf197b61b1b3c23772c57a2ec3ee5" name="Symfony/Component/Console/Tester/CommandTester.php" role="php" />
   <file md5sum="4113e99075832dfdf616eb1d40466b5f" name="Symfony/Component/Console/Tests/ApplicationTest.php" role="test" />
   <file md5sum="95ad26aa722775521f90d097b79d23b7" name="Symfony/Component/Console/Tests/Command/CommandTest.php" role="test" />
   <file md5sum="e8f9a01b23091cef3ed6346feaf38b9c" name="Symfony/Component/Console/Tests/Command/HelpCommandTest.php" role="test" />
   <file md5sum="e7562df5cc8110fb5a6e44cbc39a7c03" name="Symfony/Component/Console/Tests/Command/ListCommandTest.php" role="test" />
   <file md5sum="531b8d11ed5d639162a8cbc8c1b7fe53" name="Symfony/Component/Console/Tests/Descriptor/AbstractDescriptorTest.php" role="test" />
   <file md5sum="8b6ccffc99cb2ffea82e6e65171dc329" name="Symfony/Component/Console/Tests/Descriptor/JsonDescriptorTest.php" role="test" />
   <file md5sum="0738e024a2a5fd48f033acec21ebe484" name="Symfony/Component/Console/Tests/Descriptor/MarkdownDescriptorTest.php" role="test" />
   <file md5sum="e364df76cc57c1a8221422eac8425501" name="Symfony/Component/Console/Tests/Descriptor/ObjectsProvider.php" role="test" />
   <file md5sum="a5a110579ab493bc21572ec836e8b94e" name="Symfony/Component/Console/Tests/Descriptor/TextDescriptorTest.php" role="test" />
   <file md5sum="aa6b0e47cc2693587024ee3d9b2efc6c" name="Symfony/Component/Console/Tests/Descriptor/XmlDescriptorTest.php" role="test" />
   <file md5sum="ea331a512e8c0d80230ff1f7b1254316" name="Symfony/Component/Console/Tests/Fixtures/application_1.json" role="test" />
   <file md5sum="2e34db40b7841a8df627415fd72762df" name="Symfony/Component/Console/Tests/Fixtures/application_1.md" role="test" />
   <file md5sum="3d936937d3bcf607fc54faad2558a453" name="Symfony/Component/Console/Tests/Fixtures/application_1.txt" role="test" />
   <file md5sum="d819500ef4e850b75c623682dc38c900" name="Symfony/Component/Console/Tests/Fixtures/application_1.xml" role="test" />
   <file md5sum="c461b890d0d7849cfb5eb5bbbc113e66" name="Symfony/Component/Console/Tests/Fixtures/application_2.json" role="test" />
   <file md5sum="fd2188a4c78bd7bc1a3778a0af6311c5" name="Symfony/Component/Console/Tests/Fixtures/application_2.md" role="test" />
   <file md5sum="d66df90611c1e4fc0161d4307d18ece1" name="Symfony/Component/Console/Tests/Fixtures/application_2.txt" role="test" />
   <file md5sum="d9d7ea7073a523ad2a07ae345b22316f" name="Symfony/Component/Console/Tests/Fixtures/application_2.xml" role="test" />
   <file md5sum="b40b7c5e2ce450d92801ad9f5420ea77" name="Symfony/Component/Console/Tests/Fixtures/application_astext1.txt" role="test" />
   <file md5sum="345da50027f0969cf6b362f3f9088186" name="Symfony/Component/Console/Tests/Fixtures/application_astext2.txt" role="test" />
   <file md5sum="507250131eb057d025531c669a4aab19" name="Symfony/Component/Console/Tests/Fixtures/application_asxml1.txt" role="test" />
   <file md5sum="fd7e97279731abc448a7577095054ca8" name="Symfony/Component/Console/Tests/Fixtures/application_asxml2.txt" role="test" />
   <file md5sum="aa0a9b41081ebab06350041597bd4542" name="Symfony/Component/Console/Tests/Fixtures/application_gethelp.txt" role="test" />
   <file md5sum="977a66011fcade49927bb6ac41477792" name="Symfony/Component/Console/Tests/Fixtures/application_renderexception1.txt" role="test" />
   <file md5sum="38d86d41d4fb194a695eaddfe2a8d2df" name="Symfony/Component/Console/Tests/Fixtures/application_renderexception2.txt" role="test" />
   <file md5sum="711b8a7b6ec59bb13332c79763666e14" name="Symfony/Component/Console/Tests/Fixtures/application_renderexception3.txt" role="test" />
   <file md5sum="037657ca60cd7c8ff945ce145684aec6" name="Symfony/Component/Console/Tests/Fixtures/application_renderexception3decorated.txt" role="test" />
   <file md5sum="0b5b31d2023ae8ec6e2eef0e08e0400c" name="Symfony/Component/Console/Tests/Fixtures/application_renderexception4.txt" role="test" />
   <file md5sum="47745f267210a2e2fb9860082194efd2" name="Symfony/Component/Console/Tests/Fixtures/application_run1.txt" role="test" />
   <file md5sum="ff916ea07ab6a3777814eafa148c9c34" name="Symfony/Component/Console/Tests/Fixtures/application_run2.txt" role="test" />
   <file md5sum="e1651d791eebaeed9a568412fe433ce2" name="Symfony/Component/Console/Tests/Fixtures/application_run3.txt" role="test" />
   <file md5sum="c7759de3fcd0263d72d1fad2390dc914" name="Symfony/Component/Console/Tests/Fixtures/application_run4.txt" role="test" />
   <file md5sum="5bb7afd8d7266c4b53acdd0ba4bc87ce" name="Symfony/Component/Console/Tests/Fixtures/BarBucCommand.php" role="test" />
   <file md5sum="8464fa011bb28109fd087727f1216458" name="Symfony/Component/Console/Tests/Fixtures/command_1.json" role="test" />
   <file md5sum="44b8f270513ba511d0d971b52b2396d6" name="Symfony/Component/Console/Tests/Fixtures/command_1.md" role="test" />
   <file md5sum="40f52be95eb599167faf4fb1382e93e7" name="Symfony/Component/Console/Tests/Fixtures/command_1.txt" role="test" />
   <file md5sum="d4a21bb6906c17693a2cf2d990f17441" name="Symfony/Component/Console/Tests/Fixtures/command_1.xml" role="test" />
   <file md5sum="8ff624584c774ae83144627314d66587" name="Symfony/Component/Console/Tests/Fixtures/command_2.json" role="test" />
   <file md5sum="65763c3a87b5e2a625fdd143edaf03fe" name="Symfony/Component/Console/Tests/Fixtures/command_2.md" role="test" />
   <file md5sum="5680ffddd8fc44a29d0ea39f9ab09906" name="Symfony/Component/Console/Tests/Fixtures/command_2.txt" role="test" />
   <file md5sum="8cac2b7fac663f8d0fd15c22f1160981" name="Symfony/Component/Console/Tests/Fixtures/command_2.xml" role="test" />
   <file md5sum="ac50a755a5dcf9dbbf7d03564c134b5c" name="Symfony/Component/Console/Tests/Fixtures/command_astext.txt" role="test" />
   <file md5sum="d94936284533d2495f2eb207fa02e232" name="Symfony/Component/Console/Tests/Fixtures/command_asxml.txt" role="test" />
   <file md5sum="6a54005ec1a08c1a7f9d7b098dec09f3" name="Symfony/Component/Console/Tests/Fixtures/definition_astext.txt" role="test" />
   <file md5sum="205994db49721172eac27b69ff37ec4f" name="Symfony/Component/Console/Tests/Fixtures/definition_asxml.txt" role="test" />
   <file md5sum="cb827ac9aecc15b6592f8c153317b31d" name="Symfony/Component/Console/Tests/Fixtures/DescriptorApplication1.php" role="test" />
   <file md5sum="d929bab60eb3fd020e15b45a3c54d168" name="Symfony/Component/Console/Tests/Fixtures/DescriptorApplication2.php" role="test" />
   <file md5sum="50c23e03725ffd75f65d76b07e71887a" name="Symfony/Component/Console/Tests/Fixtures/DescriptorCommand1.php" role="test" />
   <file md5sum="8cc36b0c8be8ac7db7897d5ac4eee699" name="Symfony/Component/Console/Tests/Fixtures/DescriptorCommand2.php" role="test" />
   <file md5sum="df52584a64822a983eb5d927acedb8c1" name="Symfony/Component/Console/Tests/Fixtures/Foo1Command.php" role="test" />
   <file md5sum="cf36c22795c10c04984b683ff3f1fe79" name="Symfony/Component/Console/Tests/Fixtures/Foo2Command.php" role="test" />
   <file md5sum="14ec4962d6e9d9be56dbb5a90f1c01bc" name="Symfony/Component/Console/Tests/Fixtures/Foo3Command.php" role="test" />
   <file md5sum="a747ae989c89cbff1df48d301d69ff9a" name="Symfony/Component/Console/Tests/Fixtures/Foo4Command.php" role="test" />
   <file md5sum="ab33a181019dd14b892e920906a83e41" name="Symfony/Component/Console/Tests/Fixtures/Foo5Command.php" role="test" />
   <file md5sum="c409f073d1a760445d7c692bf6668848" name="Symfony/Component/Console/Tests/Fixtures/FoobarCommand.php" role="test" />
   <file md5sum="45276372456804d1c3cc11c30e1e26e4" name="Symfony/Component/Console/Tests/Fixtures/FooCommand.php" role="test" />
   <file md5sum="87e6eeef0f89e57d691ca8a35bb91e12" name="Symfony/Component/Console/Tests/Fixtures/input_argument_1.json" role="test" />
   <file md5sum="f51385902d2eb98e5c7236b26f720741" name="Symfony/Component/Console/Tests/Fixtures/input_argument_1.md" role="test" />
   <file md5sum="49ec5d491a17d9f6c93e3b6194757de0" name="Symfony/Component/Console/Tests/Fixtures/input_argument_1.txt" role="test" />
   <file md5sum="0c308f004edf7c0b6aaec03f028e8747" name="Symfony/Component/Console/Tests/Fixtures/input_argument_1.xml" role="test" />
   <file md5sum="7b189366871c1bb8b146087dcc1b20cf" name="Symfony/Component/Console/Tests/Fixtures/input_argument_2.json" role="test" />
   <file md5sum="3f2fd328c9393a8ede70602631d68c9f" name="Symfony/Component/Console/Tests/Fixtures/input_argument_2.md" role="test" />
   <file md5sum="c4567546600e6c71ee236a870b9a5d16" name="Symfony/Component/Console/Tests/Fixtures/input_argument_2.txt" role="test" />
   <file md5sum="57a965ef131103e13d8befdb1a0e8465" name="Symfony/Component/Console/Tests/Fixtures/input_argument_2.xml" role="test" />
   <file md5sum="eacb43809707dd26dcb8a0c34f1cd337" name="Symfony/Component/Console/Tests/Fixtures/input_argument_3.json" role="test" />
   <file md5sum="92b02b5435642c4f31ccc943b751c30e" name="Symfony/Component/Console/Tests/Fixtures/input_argument_3.md" role="test" />
   <file md5sum="e512053db481dbd2ac228f790e4a5c31" name="Symfony/Component/Console/Tests/Fixtures/input_argument_3.txt" role="test" />
   <file md5sum="4b5eacb65951dd1047832992de231669" name="Symfony/Component/Console/Tests/Fixtures/input_argument_3.xml" role="test" />
   <file md5sum="6b6cd5a30b7f04a27b3615fcb66fbb60" name="Symfony/Component/Console/Tests/Fixtures/input_definition_1.json" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Console/Tests/Fixtures/input_definition_1.md" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Console/Tests/Fixtures/input_definition_1.txt" role="test" />
   <file md5sum="d1ccbc21759a3a9fbf5c8540d9083f47" name="Symfony/Component/Console/Tests/Fixtures/input_definition_1.xml" role="test" />
   <file md5sum="96c29539ac20c5289ce924a2b53e0a74" name="Symfony/Component/Console/Tests/Fixtures/input_definition_2.json" role="test" />
   <file md5sum="65e283e532971f65a0531cef86ec1ff7" name="Symfony/Component/Console/Tests/Fixtures/input_definition_2.md" role="test" />
   <file md5sum="63bc1a5ff3064f65a2acd1f3fe791164" name="Symfony/Component/Console/Tests/Fixtures/input_definition_2.txt" role="test" />
   <file md5sum="a856c4c0e7a21895a75fccd1f7ad9652" name="Symfony/Component/Console/Tests/Fixtures/input_definition_2.xml" role="test" />
   <file md5sum="e3e2853d5735de1d839b7378cea925f6" name="Symfony/Component/Console/Tests/Fixtures/input_definition_3.json" role="test" />
   <file md5sum="cf4db1e7e783877fedcc11f228f057f7" name="Symfony/Component/Console/Tests/Fixtures/input_definition_3.md" role="test" />
   <file md5sum="6517879eab6c613d4ccc9e8f11dc00cc" name="Symfony/Component/Console/Tests/Fixtures/input_definition_3.txt" role="test" />
   <file md5sum="cf9890033c9b3296c3f0a84ad7a40f26" name="Symfony/Component/Console/Tests/Fixtures/input_definition_3.xml" role="test" />
   <file md5sum="a0d3b5beb936e28bcfa0b2a09038e477" name="Symfony/Component/Console/Tests/Fixtures/input_definition_4.json" role="test" />
   <file md5sum="55bdf86d23a2c802d4c7d36922a16cc8" name="Symfony/Component/Console/Tests/Fixtures/input_definition_4.md" role="test" />
   <file md5sum="6a351cab07e83967475ce418f11389c9" name="Symfony/Component/Console/Tests/Fixtures/input_definition_4.txt" role="test" />
   <file md5sum="732625b8bef91e2b6e5e42b135714673" name="Symfony/Component/Console/Tests/Fixtures/input_definition_4.xml" role="test" />
   <file md5sum="275c5ca8fae2603962435abee86abc22" name="Symfony/Component/Console/Tests/Fixtures/input_option_1.json" role="test" />
   <file md5sum="2f3b3fce4e6cc97d37c2cdf2a8545a17" name="Symfony/Component/Console/Tests/Fixtures/input_option_1.md" role="test" />
   <file md5sum="7c446b0b7764679b0675e2bf7c15d5ef" name="Symfony/Component/Console/Tests/Fixtures/input_option_1.txt" role="test" />
   <file md5sum="2441944e792817317e54ca3e6bf3478a" name="Symfony/Component/Console/Tests/Fixtures/input_option_1.xml" role="test" />
   <file md5sum="8ad4b5bb7f68b81ac5baf6f86c54f216" name="Symfony/Component/Console/Tests/Fixtures/input_option_2.json" role="test" />
   <file md5sum="febad80dc8502990d7631dfa7e710725" name="Symfony/Component/Console/Tests/Fixtures/input_option_2.md" role="test" />
   <file md5sum="4cebdddb6ee8776268fe824f5ebc8b14" name="Symfony/Component/Console/Tests/Fixtures/input_option_2.txt" role="test" />
   <file md5sum="ad9f550cbdd67e7bda7bfb78ebbc4d57" name="Symfony/Component/Console/Tests/Fixtures/input_option_2.xml" role="test" />
   <file md5sum="2eb676e70f06dff589fc461b96da5c61" name="Symfony/Component/Console/Tests/Fixtures/input_option_3.json" role="test" />
   <file md5sum="03a09ae47b81986ec50edd6608fa2426" name="Symfony/Component/Console/Tests/Fixtures/input_option_3.md" role="test" />
   <file md5sum="7eada46556b0ce341069f353b063e45e" name="Symfony/Component/Console/Tests/Fixtures/input_option_3.txt" role="test" />
   <file md5sum="8c91b697596ccf87b48c58ecbae02aa6" name="Symfony/Component/Console/Tests/Fixtures/input_option_3.xml" role="test" />
   <file md5sum="20c72909569d5ec92465f7c7dc002381" name="Symfony/Component/Console/Tests/Fixtures/input_option_4.json" role="test" />
   <file md5sum="4b02ffc507306a9d887e73d2fca429ba" name="Symfony/Component/Console/Tests/Fixtures/input_option_4.md" role="test" />
   <file md5sum="7d49ce52263e22bbdd37e687455478ea" name="Symfony/Component/Console/Tests/Fixtures/input_option_4.txt" role="test" />
   <file md5sum="960e79c93c46361c3bd250b5fe73d25b" name="Symfony/Component/Console/Tests/Fixtures/input_option_4.xml" role="test" />
   <file md5sum="cdfd10039b833b3d0cd4bc946d6d0e52" name="Symfony/Component/Console/Tests/Fixtures/TestCommand.php" role="test" />
   <file md5sum="d65f80f685c098367d357b79b1085660" name="Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleStackTest.php" role="test" />
   <file md5sum="772ad7157614e0a3336b0e79bfd8c018" name="Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.php" role="test" />
   <file md5sum="1932fadfa3ba33810457dc7c7caf4200" name="Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.php" role="test" />
   <file md5sum="c080187a3a540acbd38ea4e72e197073" name="Symfony/Component/Console/Tests/Helper/DialogHelperTest.php" role="test" />
   <file md5sum="caffe5a35cfde20acff28a1b2ede9523" name="Symfony/Component/Console/Tests/Helper/FormatterHelperTest.php" role="test" />
   <file md5sum="0c4b855c7ad31b88262a32f083903d5b" name="Symfony/Component/Console/Tests/Helper/HelperSetTest.php" role="test" />
   <file md5sum="8d460c56a019e5bfd59f1d2d91970812" name="Symfony/Component/Console/Tests/Helper/ProgressHelperTest.php" role="test" />
   <file md5sum="7c598e6ffdbd3c17865a4c54cbe34c78" name="Symfony/Component/Console/Tests/Helper/TableHelperTest.php" role="test" />
   <file md5sum="2d5b2e942330756fcbc30062e9007f1e" name="Symfony/Component/Console/Tests/Input/ArgvInputTest.php" role="test" />
   <file md5sum="a90b8bafe8ede004c6ed61ecc8224a3f" name="Symfony/Component/Console/Tests/Input/ArrayInputTest.php" role="test" />
   <file md5sum="7fe249cea32fc176d04f2520a018bdd8" name="Symfony/Component/Console/Tests/Input/InputArgumentTest.php" role="test" />
   <file md5sum="debb5202554762ad79bbd9353fcd04b7" name="Symfony/Component/Console/Tests/Input/InputDefinitionTest.php" role="test" />
   <file md5sum="b6f2af5b4b79ed25113742022e86c77a" name="Symfony/Component/Console/Tests/Input/InputOptionTest.php" role="test" />
   <file md5sum="f9129bb377ebb93a88cfcc97795055ff" name="Symfony/Component/Console/Tests/Input/InputTest.php" role="test" />
   <file md5sum="6d3e24ab1bdf3f1048c89aded3fdfc42" name="Symfony/Component/Console/Tests/Input/StringInputTest.php" role="test" />
   <file md5sum="5f42c7a490159ffee9e4d44297f6cbb0" name="Symfony/Component/Console/Tests/Output/ConsoleOutputTest.php" role="test" />
   <file md5sum="3b663167dfed0b653e8bc70890b8d417" name="Symfony/Component/Console/Tests/Output/NullOutputTest.php" role="test" />
   <file md5sum="eb5d8d732894bc94242983e61d9ea828" name="Symfony/Component/Console/Tests/Output/OutputTest.php" role="test" />
   <file md5sum="d9e51b68858e010abf7c9856411f9f3e" name="Symfony/Component/Console/Tests/Output/StreamOutputTest.php" role="test" />
   <file md5sum="ed2c4ba2123801176abd8f7b15cfce2e" name="Symfony/Component/Console/Tests/Tester/ApplicationTesterTest.php" role="test" />
   <file md5sum="dc805845c9fb25bf57604fda8b19c86d" name="Symfony/Component/Console/Tests/Tester/CommandTesterTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\��n�++$pear/.pkgxml/Symfony2_Yaml-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Yaml</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Yaml Component</summary>
 <description>Symfony2 Yaml Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:51</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="07d78d85581e7b233bc906f888f1f406" name="Symfony/Component/Yaml/autoloader.php" role="php" />
   <file md5sum="00392ab3e6199c8363f9e53646f7da22" name="Symfony/Component/Yaml/CHANGELOG.md" role="doc" />
   <file md5sum="97ceba40e4d4b099b853d5390cc862a8" name="Symfony/Component/Yaml/composer.json" role="doc" />
   <file md5sum="42407158b32c6628e0969cabf060ff6c" name="Symfony/Component/Yaml/Dumper.php" role="php" />
   <file md5sum="b70928e2c815afc3507267c9b5d69df8" name="Symfony/Component/Yaml/Escaper.php" role="php" />
   <file md5sum="40b05314535a494039c342a01e1d10d2" name="Symfony/Component/Yaml/Exception/DumpException.php" role="php" />
   <file md5sum="a7ee6ec67e04faa2c2c29fef8adfc4fa" name="Symfony/Component/Yaml/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="8c619a51b1b41cf5df563d956acb3a66" name="Symfony/Component/Yaml/Exception/ParseException.php" role="php" />
   <file md5sum="39bbaf9ae8b207093e4b8a9c09cdb081" name="Symfony/Component/Yaml/Exception/RuntimeException.php" role="php" />
   <file md5sum="3613cd189e752204d25f0c5d68a6eadc" name="Symfony/Component/Yaml/Inline.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Yaml/LICENSE" role="doc" />
   <file md5sum="64c3b42307205bf8e361168c7ffbd62b" name="Symfony/Component/Yaml/Parser.php" role="php" />
   <file md5sum="9e6fe22525058accf018c8080e12e2f1" name="Symfony/Component/Yaml/phpunit.xml.dist" role="test" />
   <file md5sum="15ed39836fa36c899e3ec99bdfde8cac" name="Symfony/Component/Yaml/README.md" role="doc" />
   <file md5sum="64109519b10453da72024e12b4c07720" name="Symfony/Component/Yaml/Tests/DumperTest.php" role="test" />
   <file md5sum="52dbe7660c58107077d0e7069fe43498" name="Symfony/Component/Yaml/Tests/Fixtures/embededPhp.yml" role="test" />
   <file md5sum="3fdad64212f2a04d91ccc15f2a5f7200" name="Symfony/Component/Yaml/Tests/Fixtures/escapedCharacters.yml" role="test" />
   <file md5sum="809db138c609075657d8d2e81fabaa5c" name="Symfony/Component/Yaml/Tests/Fixtures/index.yml" role="test" />
   <file md5sum="ff1d8df08f5dfab1a2f23be6cf19c791" name="Symfony/Component/Yaml/Tests/Fixtures/sfComments.yml" role="test" />
   <file md5sum="835842c734605efa1665b90ccb266b97" name="Symfony/Component/Yaml/Tests/Fixtures/sfCompact.yml" role="test" />
   <file md5sum="809113de6e9d341fce21f0524dbaf43b" name="Symfony/Component/Yaml/Tests/Fixtures/sfMergeKey.yml" role="test" />
   <file md5sum="886595fda5f2aa969a232045dbd4941c" name="Symfony/Component/Yaml/Tests/Fixtures/sfObjects.yml" role="test" />
   <file md5sum="7ab74ef2b099c462e66d223acdc12494" name="Symfony/Component/Yaml/Tests/Fixtures/sfQuotes.yml" role="test" />
   <file md5sum="2cbc1c292d0a398e7044362758ea2c31" name="Symfony/Component/Yaml/Tests/Fixtures/sfTests.yml" role="test" />
   <file md5sum="9bf9b30c034a48fd98f1ed6d4f033bb2" name="Symfony/Component/Yaml/Tests/Fixtures/unindentedCollections.yml" role="test" />
   <file md5sum="073781a1d2c37127a4296e9af7616624" name="Symfony/Component/Yaml/Tests/Fixtures/YtsAnchorAlias.yml" role="test" />
   <file md5sum="0f7fe2f6fe3bd6af0ce48f0fde63410f" name="Symfony/Component/Yaml/Tests/Fixtures/YtsBasicTests.yml" role="test" />
   <file md5sum="4c1744b763fce82db7d4e20c469b20cd" name="Symfony/Component/Yaml/Tests/Fixtures/YtsBlockMapping.yml" role="test" />
   <file md5sum="ae486823d3d8c404cabc065416e8b0dc" name="Symfony/Component/Yaml/Tests/Fixtures/YtsDocumentSeparator.yml" role="test" />
   <file md5sum="1a6d2fa2a7f53d4657b35baf4ecf67c6" name="Symfony/Component/Yaml/Tests/Fixtures/YtsErrorTests.yml" role="test" />
   <file md5sum="326c09dd8c5de226c680154c39206647" name="Symfony/Component/Yaml/Tests/Fixtures/YtsFlowCollections.yml" role="test" />
   <file md5sum="bf21b6ca89e2aea63b62f60448b841b4" name="Symfony/Component/Yaml/Tests/Fixtures/YtsFoldedScalars.yml" role="test" />
   <file md5sum="fda05f67ca13f8d50cb904b191039c04" name="Symfony/Component/Yaml/Tests/Fixtures/YtsNullsAndEmpties.yml" role="test" />
   <file md5sum="0ac491faab843691cbf2fa415ef1ec2e" name="Symfony/Component/Yaml/Tests/Fixtures/YtsSpecificationExamples.yml" role="test" />
   <file md5sum="359b6d26b73597096784bc481887d8d7" name="Symfony/Component/Yaml/Tests/Fixtures/YtsTypeTransfers.yml" role="test" />
   <file md5sum="8218e514512562e64f82e2c64a433a6a" name="Symfony/Component/Yaml/Tests/InlineTest.php" role="test" />
   <file md5sum="9a72d3fa4559d2985c7f4d7fec8fe010" name="Symfony/Component/Yaml/Tests/ParseExceptionTest.php" role="test" />
   <file md5sum="3a240de639b531334340ecf2dc904d1b" name="Symfony/Component/Yaml/Tests/ParserTest.php" role="test" />
   <file md5sum="c118d8ca1bda7adff52cfbe25ce80925" name="Symfony/Component/Yaml/Tests/YamlTest.php" role="test" />
   <file md5sum="aa973644950ed041a389710050675f1b" name="Symfony/Component/Yaml/Unescaper.php" role="php" />
   <file md5sum="b37c543884d443eeb0f3212cd1c5ce8f" name="Symfony/Component/Yaml/Yaml.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\=��4��-pear/.pkgxml/Symfony2_MonologBridge-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>MonologBridge</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Monolog Bridge</summary>
 <description>Symfony2 Monolog Bridge</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:40</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="bdbad7393ee44f10ac322df29bfa77ad" name="Symfony/Bridge/Monolog/autoloader.php" role="php" />
   <file md5sum="094d6ae95193dc93574972855a7d4832" name="Symfony/Bridge/Monolog/CHANGELOG.md" role="doc" />
   <file md5sum="a8f1a867d0764615189e8bf0b52c96cc" name="Symfony/Bridge/Monolog/composer.json" role="doc" />
   <file md5sum="501339390d395617968209b4da17d804" name="Symfony/Bridge/Monolog/Formatter/ConsoleFormatter.php" role="php" />
   <file md5sum="21b3ac07925411b737467982255e1eee" name="Symfony/Bridge/Monolog/Handler/ChromePhpHandler.php" role="php" />
   <file md5sum="1904f40387634917013822e9f3141616" name="Symfony/Bridge/Monolog/Handler/ConsoleHandler.php" role="php" />
   <file md5sum="ed987f0a4d874ea227a55837e8cdd126" name="Symfony/Bridge/Monolog/Handler/DebugHandler.php" role="php" />
   <file md5sum="da8c5260e05c07e61be644d857f3a23d" name="Symfony/Bridge/Monolog/Handler/FirePHPHandler.php" role="php" />
   <file md5sum="f9fc834e5db8ab23a2894046a5c73f0f" name="Symfony/Bridge/Monolog/Handler/SwiftMailerHandler.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Bridge/Monolog/LICENSE" role="doc" />
   <file md5sum="5b938f174102a5986f62e1d936e86ff1" name="Symfony/Bridge/Monolog/Logger.php" role="php" />
   <file md5sum="13114b196ecb2d5d366e5d55a86e7eb6" name="Symfony/Bridge/Monolog/phpunit.xml.dist" role="test" />
   <file md5sum="befbcf0b3ce8ecfb5781cf0666659938" name="Symfony/Bridge/Monolog/Processor/WebProcessor.php" role="php" />
   <file md5sum="854dbd178e5fb104a7456c87fab8c54f" name="Symfony/Bridge/Monolog/README.md" role="doc" />
   <file md5sum="a08dee274cc27bc65d50e26ac214d71f" name="Symfony/Bridge/Monolog/Tests/Handler/ConsoleHandlerTest.php" role="test" />
   <file md5sum="79c355f88c71490f32bc2a5d48aa1ee0" name="Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
   <package>
    <name>HttpKernel</name>
    <channel>pear.symfony.com</channel>
   </package>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\8���pear/.pkgxml/phpunit.xmlnu�[���<?xml version="1.0" encoding="UTF-8" ?>
<channel version="1.0" xmlns="http://pear.php.net/channel-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/channel-1.0 http://pear.php.net/dtd/channel-1.0.xsd">
  <name>pear.phpunit.de</name>
  <summary>PHPUnit PEAR Channel</summary>
  <suggestedalias>phpunit</suggestedalias>
  <servers>
    <primary>
      <rest>
        <baseurl type="REST1.0">http://pear.phpunit.de/rest/</baseurl>
        <baseurl type="REST1.1">http://pear.phpunit.de/rest/</baseurl>
        <baseurl type="REST1.2">http://pear.phpunit.de/rest/</baseurl>
        <baseurl type="REST1.3">http://pear.phpunit.de/rest/</baseurl>
      </rest>
    </primary>
  </servers>
</channel>PK�^�\�܄�����(pear/.pkgxml/Symfony2_Security-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Security</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Security Component</summary>
 <description>Symfony2 Security Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:49</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="5365c3fd47df815d4353473ac6373ad7" name="Symfony/Component/Security/Acl/composer.json" role="doc" />
   <file md5sum="0ecf07a353f03ea4c6976d0cf98d5b51" name="Symfony/Component/Security/Acl/Dbal/AclProvider.php" role="php" />
   <file md5sum="333ff4aca2f234109cd7ebe9a03c7f25" name="Symfony/Component/Security/Acl/Dbal/MutableAclProvider.php" role="php" />
   <file md5sum="a38fab3cddce11ba90e1569be5f0d806" name="Symfony/Component/Security/Acl/Dbal/Schema.php" role="php" />
   <file md5sum="e8f587fcaf0a3057321516e59fc0ce87" name="Symfony/Component/Security/Acl/Domain/Acl.php" role="php" />
   <file md5sum="cccc32d88c312fb7dac66b08d9e67e45" name="Symfony/Component/Security/Acl/Domain/AclCollectionCache.php" role="php" />
   <file md5sum="b4fee19b12185f0ee45a2e97f5fcb8a4" name="Symfony/Component/Security/Acl/Domain/AuditLogger.php" role="php" />
   <file md5sum="2f552f22f35c47d5d523c187d25039eb" name="Symfony/Component/Security/Acl/Domain/DoctrineAclCache.php" role="php" />
   <file md5sum="7d02a171381bed25a818a33a2a714803" name="Symfony/Component/Security/Acl/Domain/Entry.php" role="php" />
   <file md5sum="f0b1b92b49934c59ecc126fbb41b72c2" name="Symfony/Component/Security/Acl/Domain/FieldEntry.php" role="php" />
   <file md5sum="3eadb08eafffe705a6dd8de5f96e1ca1" name="Symfony/Component/Security/Acl/Domain/ObjectIdentity.php" role="php" />
   <file md5sum="1baa7e094b60dbd7a2eaf4d38b5125cc" name="Symfony/Component/Security/Acl/Domain/ObjectIdentityRetrievalStrategy.php" role="php" />
   <file md5sum="ea6329b78543f0536dc1b2019c291eb2" name="Symfony/Component/Security/Acl/Domain/PermissionGrantingStrategy.php" role="php" />
   <file md5sum="d082f117ebbe68492e03855adbaa7704" name="Symfony/Component/Security/Acl/Domain/RoleSecurityIdentity.php" role="php" />
   <file md5sum="2a34925fb304b1a8d724ca4cf2aafb5f" name="Symfony/Component/Security/Acl/Domain/SecurityIdentityRetrievalStrategy.php" role="php" />
   <file md5sum="e48d7c38d196eea74cf250fcddd8d189" name="Symfony/Component/Security/Acl/Domain/UserSecurityIdentity.php" role="php" />
   <file md5sum="82a5465e98dd2475f706a9cacc65db37" name="Symfony/Component/Security/Acl/Exception/AclAlreadyExistsException.php" role="php" />
   <file md5sum="8b3ec9dfe9d9f345a3ddce26bd4fab8b" name="Symfony/Component/Security/Acl/Exception/AclNotFoundException.php" role="php" />
   <file md5sum="7e3eb281d553454f0f59d5f282948216" name="Symfony/Component/Security/Acl/Exception/ConcurrentModificationException.php" role="php" />
   <file md5sum="e3b6ea7de5ec436c7503f1d7312249bc" name="Symfony/Component/Security/Acl/Exception/Exception.php" role="php" />
   <file md5sum="4be9ba33e0d97e970d6f541480901eb0" name="Symfony/Component/Security/Acl/Exception/InvalidDomainObjectException.php" role="php" />
   <file md5sum="aca5379067c0fd0c2240eb986eac8268" name="Symfony/Component/Security/Acl/Exception/NoAceFoundException.php" role="php" />
   <file md5sum="7a0ca03655455c96a2fe053bc72b4de3" name="Symfony/Component/Security/Acl/Exception/NotAllAclsFoundException.php" role="php" />
   <file md5sum="2415593ec8d8a343e6f4328ddb0c2a1d" name="Symfony/Component/Security/Acl/Exception/SidNotLoadedException.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Security/Acl/LICENSE" role="doc" />
   <file md5sum="ab5d60682e988c0e7eb0dd1512dabade" name="Symfony/Component/Security/Acl/Model/AclCacheInterface.php" role="php" />
   <file md5sum="870a09318c3c65e3523e19130607f1ab" name="Symfony/Component/Security/Acl/Model/AclInterface.php" role="php" />
   <file md5sum="7ea089827ee0d4ed26b0d57b8f20dc28" name="Symfony/Component/Security/Acl/Model/AclProviderInterface.php" role="php" />
   <file md5sum="63c76e68e9ccf7ec307696ac8ca44e8f" name="Symfony/Component/Security/Acl/Model/AuditableAclInterface.php" role="php" />
   <file md5sum="f989613d6c0286594696efc106774415" name="Symfony/Component/Security/Acl/Model/AuditableEntryInterface.php" role="php" />
   <file md5sum="c5d9ae1862d7c0a6d442f053d5acac39" name="Symfony/Component/Security/Acl/Model/AuditLoggerInterface.php" role="php" />
   <file md5sum="4d278f8d01215e4be53a264dad150173" name="Symfony/Component/Security/Acl/Model/DomainObjectInterface.php" role="php" />
   <file md5sum="72e6a4f7f0ffe6d84e6e6462827ee54a" name="Symfony/Component/Security/Acl/Model/EntryInterface.php" role="php" />
   <file md5sum="2968e44f1b60586feb144fe02c5e15c3" name="Symfony/Component/Security/Acl/Model/FieldEntryInterface.php" role="php" />
   <file md5sum="e1c009bf3a30308c68b2fc8b959fc1d4" name="Symfony/Component/Security/Acl/Model/MutableAclInterface.php" role="php" />
   <file md5sum="fb020f4efc07611baef0206e0783b87e" name="Symfony/Component/Security/Acl/Model/MutableAclProviderInterface.php" role="php" />
   <file md5sum="29d14ee35eebd9faf6d38b97b02ea8cb" name="Symfony/Component/Security/Acl/Model/ObjectIdentityInterface.php" role="php" />
   <file md5sum="4c49500b0054ee78894935bebed56210" name="Symfony/Component/Security/Acl/Model/ObjectIdentityRetrievalStrategyInterface.php" role="php" />
   <file md5sum="713c07bfa636d7d6ad4d85d91b5f4ac4" name="Symfony/Component/Security/Acl/Model/PermissionGrantingStrategyInterface.php" role="php" />
   <file md5sum="212111e56b11d7fba72dc585289786cb" name="Symfony/Component/Security/Acl/Model/SecurityIdentityInterface.php" role="php" />
   <file md5sum="0896de7498e35f5f02a9755832172a96" name="Symfony/Component/Security/Acl/Model/SecurityIdentityRetrievalStrategyInterface.php" role="php" />
   <file md5sum="83e5de08b981e358d3daea8b304988ca" name="Symfony/Component/Security/Acl/Permission/BasicPermissionMap.php" role="php" />
   <file md5sum="7918106bfa1e9cc64ca25efa8f2428f9" name="Symfony/Component/Security/Acl/Permission/MaskBuilder.php" role="php" />
   <file md5sum="024f4e1c3b24a5a42fe258e9ed3d83bb" name="Symfony/Component/Security/Acl/Permission/PermissionMapInterface.php" role="php" />
   <file md5sum="74a4ed032849f83ee138f3ea572c315f" name="Symfony/Component/Security/Acl/phpunit.xml.dist" role="test" />
   <file md5sum="5213a3c25b290a621867f47359a85972" name="Symfony/Component/Security/Acl/README.md" role="doc" />
   <file md5sum="29202e9e8819885a0237ad1f5c4f1a3a" name="Symfony/Component/Security/Acl/Resources/bin/generateSql.php" role="php" />
   <file md5sum="128855e565e079eb859f350be880f395" name="Symfony/Component/Security/Acl/Resources/schema/db2.sql" role="php" />
   <file md5sum="61db757bf91fc032fee7a78fe3ca8888" name="Symfony/Component/Security/Acl/Resources/schema/drizzle.sql" role="php" />
   <file md5sum="be1bec1133a89cf3e7298b380d5dd9a9" name="Symfony/Component/Security/Acl/Resources/schema/mssql.sql" role="php" />
   <file md5sum="626ac34142835a1c4936290b79a05f66" name="Symfony/Component/Security/Acl/Resources/schema/mysql.sql" role="php" />
   <file md5sum="6173f90ea584ec65392676ba164d9464" name="Symfony/Component/Security/Acl/Resources/schema/oracle.sql" role="php" />
   <file md5sum="50585e970a570428d65f9e9507da8aa8" name="Symfony/Component/Security/Acl/Resources/schema/postgresql.sql" role="php" />
   <file md5sum="b93a223813116f02a5cba763bd07069a" name="Symfony/Component/Security/Acl/Resources/schema/sqlite.sql" role="php" />
   <file md5sum="357d0712d7b5b92a0d8315364e0518ea" name="Symfony/Component/Security/Acl/Tests/Dbal/AclProviderBenchmarkTest.php" role="test" />
   <file md5sum="d332e19775917958bec95d017be52be5" name="Symfony/Component/Security/Acl/Tests/Dbal/AclProviderTest.php" role="test" />
   <file md5sum="1a46fcac5ad21b5b28b9590b1b4863fc" name="Symfony/Component/Security/Acl/Tests/Dbal/MutableAclProviderTest.php" role="test" />
   <file md5sum="70968eae1eaa4395492e7dbd5797be65" name="Symfony/Component/Security/Acl/Tests/Domain/AclTest.php" role="test" />
   <file md5sum="86049b2dce3364e94f6683df05125acf" name="Symfony/Component/Security/Acl/Tests/Domain/AuditLoggerTest.php" role="test" />
   <file md5sum="099e0b3bcfdb454e46b46687a38d8a3b" name="Symfony/Component/Security/Acl/Tests/Domain/DoctrineAclCacheTest.php" role="test" />
   <file md5sum="4022249f6c81298b7f58ea4653ece650" name="Symfony/Component/Security/Acl/Tests/Domain/EntryTest.php" role="test" />
   <file md5sum="f3699fe6be1b8b45c015629251cc6f64" name="Symfony/Component/Security/Acl/Tests/Domain/FieldEntryTest.php" role="test" />
   <file md5sum="d56675ee8ce9da6ee089ab1486db1035" name="Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityRetrievalStrategyTest.php" role="test" />
   <file md5sum="af2604cee5638a6e0642f3c1478826c1" name="Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityTest.php" role="test" />
   <file md5sum="75605e8ea69d528cea564242326e8b8d" name="Symfony/Component/Security/Acl/Tests/Domain/PermissionGrantingStrategyTest.php" role="test" />
   <file md5sum="b4555d0ee6f2d61a752b0416ee9b79e8" name="Symfony/Component/Security/Acl/Tests/Domain/RoleSecurityIdentityTest.php" role="test" />
   <file md5sum="78c619c9cec05fdf11f5de9d48b56454" name="Symfony/Component/Security/Acl/Tests/Domain/SecurityIdentityRetrievalStrategyTest.php" role="test" />
   <file md5sum="74e0d9ba1641b5cf21905336aca0d348" name="Symfony/Component/Security/Acl/Tests/Domain/UserSecurityIdentityTest.php" role="test" />
   <file md5sum="a353f4f911920e43f2e09ae3ac32d349" name="Symfony/Component/Security/Acl/Tests/Permission/BasicPermissionMapTest.php" role="test" />
   <file md5sum="3546d4afbaf25b0a4d40c216549ee272" name="Symfony/Component/Security/Acl/Tests/Permission/MaskBuilderTest.php" role="test" />
   <file md5sum="3c9129e03017adb641e9268149b935bc" name="Symfony/Component/Security/Acl/Tests/Voter/AclVoterTest.php" role="test" />
   <file md5sum="8cafc8e1f14343b87cb0f58a25f463a0" name="Symfony/Component/Security/Acl/Voter/AclVoter.php" role="php" />
   <file md5sum="180a2b1ab4b985facb353d6edeeb78ce" name="Symfony/Component/Security/Acl/Voter/FieldVote.php" role="php" />
   <file md5sum="0fb7efcc9c1574920f39f115e9863b68" name="Symfony/Component/Security/autoloader.php" role="php" />
   <file md5sum="2def4fa9f9525638a5a9c6f556ba1386" name="Symfony/Component/Security/CHANGELOG.md" role="doc" />
   <file md5sum="f0488bd3f14f86892ce93d89dad55776" name="Symfony/Component/Security/composer.json" role="doc" />
   <file md5sum="c78d485138ebdc2fa2be48a396cb9ad2" name="Symfony/Component/Security/Core/Authentication/AuthenticationManagerInterface.php" role="php" />
   <file md5sum="61167585d6d54cf1861b70f2344632c1" name="Symfony/Component/Security/Core/Authentication/AuthenticationProviderManager.php" role="php" />
   <file md5sum="4a5356ef0cf45593536da075d0d367a1" name="Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolver.php" role="php" />
   <file md5sum="dda5e9627c9c68a695cdd5071de86834" name="Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.php" role="php" />
   <file md5sum="00cb0dfecd7dc6fedc2426932405dbec" name="Symfony/Component/Security/Core/Authentication/Provider/AnonymousAuthenticationProvider.php" role="php" />
   <file md5sum="07f5b8692dd849851a84662b9f60b759" name="Symfony/Component/Security/Core/Authentication/Provider/AuthenticationProviderInterface.php" role="php" />
   <file md5sum="ccc63dc0c7c865036a3e64fb6819073e" name="Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php" role="php" />
   <file md5sum="df05c4c0bdbdb5f00d68909724d552af" name="Symfony/Component/Security/Core/Authentication/Provider/PreAuthenticatedAuthenticationProvider.php" role="php" />
   <file md5sum="bdcb91d96aacde5a99192f145495e66e" name="Symfony/Component/Security/Core/Authentication/Provider/RememberMeAuthenticationProvider.php" role="php" />
   <file md5sum="62c25b49d796de82786905533be97a8b" name="Symfony/Component/Security/Core/Authentication/Provider/SimpleAuthenticationProvider.php" role="php" />
   <file md5sum="4f720340d1992a6261fc7cf795ca0b4d" name="Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php" role="php" />
   <file md5sum="563ca47a94d2f91eb98c8091590f6ab2" name="Symfony/Component/Security/Core/Authentication/RememberMe/InMemoryTokenProvider.php" role="php" />
   <file md5sum="4888d2851eff9cf472a9acf0e93e33a4" name="Symfony/Component/Security/Core/Authentication/RememberMe/PersistentToken.php" role="php" />
   <file md5sum="2945e844ab362b935608de1ccf071018" name="Symfony/Component/Security/Core/Authentication/RememberMe/PersistentTokenInterface.php" role="php" />
   <file md5sum="5ba08141bb0ac7eb83d877a87e9689ed" name="Symfony/Component/Security/Core/Authentication/RememberMe/TokenProviderInterface.php" role="php" />
   <file md5sum="cfc5b482e19a6559b87fa3cc80665720" name="Symfony/Component/Security/Core/Authentication/SimpleAuthenticatorInterface.php" role="php" />
   <file md5sum="3dd46ffbfb5919606d71d89c5bf82f97" name="Symfony/Component/Security/Core/Authentication/SimpleFormAuthenticatorInterface.php" role="php" />
   <file md5sum="417cad7687deea94ba31fe8d86fcbdf1" name="Symfony/Component/Security/Core/Authentication/SimplePreAuthenticatorInterface.php" role="php" />
   <file md5sum="50a0fa6d56839562be5866c8a3915497" name="Symfony/Component/Security/Core/Authentication/Token/AbstractToken.php" role="php" />
   <file md5sum="4185126f45762b4301b9b6cb2d159bb9" name="Symfony/Component/Security/Core/Authentication/Token/AnonymousToken.php" role="php" />
   <file md5sum="e5015c2bc9254901b0255ced46129f93" name="Symfony/Component/Security/Core/Authentication/Token/PreAuthenticatedToken.php" role="php" />
   <file md5sum="822307b7ea3a72ec932599c9bece3a97" name="Symfony/Component/Security/Core/Authentication/Token/RememberMeToken.php" role="php" />
   <file md5sum="4143633b44f1659cf8409a64ca407b51" name="Symfony/Component/Security/Core/Authentication/Token/TokenInterface.php" role="php" />
   <file md5sum="4bd196890e484daf675d82322028be1c" name="Symfony/Component/Security/Core/Authentication/Token/UsernamePasswordToken.php" role="php" />
   <file md5sum="cdc9190c3179e73eaecdbbbca659b22e" name="Symfony/Component/Security/Core/AuthenticationEvents.php" role="php" />
   <file md5sum="4a6916eb9cf4fc40f478dbb623ffdce9" name="Symfony/Component/Security/Core/Authorization/AccessDecisionManager.php" role="php" />
   <file md5sum="2865601c03c45ce3621d9013c5347d9f" name="Symfony/Component/Security/Core/Authorization/AccessDecisionManagerInterface.php" role="php" />
   <file md5sum="3b7fae5344cfe097002ea98131ce6956" name="Symfony/Component/Security/Core/Authorization/ExpressionLanguage.php" role="php" />
   <file md5sum="f2f64cf4065691e1e0b9c4c0f1425f80" name="Symfony/Component/Security/Core/Authorization/Voter/AuthenticatedVoter.php" role="php" />
   <file md5sum="2ea414aff917d1469902138f7e0d5cd0" name="Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.php" role="php" />
   <file md5sum="089ca490f923e6a32cf080b0e2a27e2f" name="Symfony/Component/Security/Core/Authorization/Voter/RoleHierarchyVoter.php" role="php" />
   <file md5sum="ff0a673dff9312faaebb78b23a04535f" name="Symfony/Component/Security/Core/Authorization/Voter/RoleVoter.php" role="php" />
   <file md5sum="003e7949d849e45e4fdffa9a835a2599" name="Symfony/Component/Security/Core/Authorization/Voter/VoterInterface.php" role="php" />
   <file md5sum="15e1e6270e2d6d3318237d3363338f50" name="Symfony/Component/Security/Core/composer.json" role="doc" />
   <file md5sum="a7a02c1c8ee5f97fdc8c267b48ae13ed" name="Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.php" role="php" />
   <file md5sum="0f16a3510e7372c61dd03b2b3bb7564f" name="Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php" role="php" />
   <file md5sum="6c687634e27d9118951ce27c88dfe481" name="Symfony/Component/Security/Core/Encoder/EncoderFactory.php" role="php" />
   <file md5sum="1330018384392f42e4b5caa6cb012f95" name="Symfony/Component/Security/Core/Encoder/EncoderFactoryInterface.php" role="php" />
   <file md5sum="7cd742b70754d9c9d8f0ca029ef4b64f" name="Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.php" role="php" />
   <file md5sum="0dde4a14a6d89ad005406ffbf9422d1f" name="Symfony/Component/Security/Core/Encoder/PasswordEncoderInterface.php" role="php" />
   <file md5sum="a97a3832eee0a328215a49fb252282fb" name="Symfony/Component/Security/Core/Encoder/Pbkdf2PasswordEncoder.php" role="php" />
   <file md5sum="e07d25f0fa35b7bfc88b3d19478da95e" name="Symfony/Component/Security/Core/Encoder/PlaintextPasswordEncoder.php" role="php" />
   <file md5sum="e976a22829d8fd7b3a67528c5f68610f" name="Symfony/Component/Security/Core/Event/AuthenticationEvent.php" role="php" />
   <file md5sum="c303cb0e16eab8cbaa2d24d416dc89b1" name="Symfony/Component/Security/Core/Event/AuthenticationFailureEvent.php" role="php" />
   <file md5sum="92c25b19f903e89aa16d8cd887600d9b" name="Symfony/Component/Security/Core/Exception/AccessDeniedException.php" role="php" />
   <file md5sum="cbaf077cb23fd56e405fe305089be4f1" name="Symfony/Component/Security/Core/Exception/AccountExpiredException.php" role="php" />
   <file md5sum="897def6142e95038f5b7e1be80789952" name="Symfony/Component/Security/Core/Exception/AccountStatusException.php" role="php" />
   <file md5sum="f216cb63ef5a186ee50eba5144ceddc7" name="Symfony/Component/Security/Core/Exception/AuthenticationCredentialsNotFoundException.php" role="php" />
   <file md5sum="29cc9dc1a7659e59a786dd9788937455" name="Symfony/Component/Security/Core/Exception/AuthenticationException.php" role="php" />
   <file md5sum="9208968ac310a1959595d8bfc270c270" name="Symfony/Component/Security/Core/Exception/AuthenticationServiceException.php" role="php" />
   <file md5sum="8dcc2180afe1ca2a5ba64b3b7b9374b7" name="Symfony/Component/Security/Core/Exception/BadCredentialsException.php" role="php" />
   <file md5sum="1501fc38bd5c20b9c3bc3fde481d096d" name="Symfony/Component/Security/Core/Exception/CookieTheftException.php" role="php" />
   <file md5sum="7f862b829f86bf262fef80f92fa1efd9" name="Symfony/Component/Security/Core/Exception/CredentialsExpiredException.php" role="php" />
   <file md5sum="964e01e15a4fc37e74bf8b832495e786" name="Symfony/Component/Security/Core/Exception/DisabledException.php" role="php" />
   <file md5sum="13fca1be9c3957516e99beb9811cbea5" name="Symfony/Component/Security/Core/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="437a16a50032457b90bec37786b55947" name="Symfony/Component/Security/Core/Exception/InsufficientAuthenticationException.php" role="php" />
   <file md5sum="5851c6d868699f1dc1e6eccb96793449" name="Symfony/Component/Security/Core/Exception/InvalidArgumentException.php" role="php" />
   <file md5sum="0822aa405f9ea4d78d55f91c8b74eeb7" name="Symfony/Component/Security/Core/Exception/InvalidCsrfTokenException.php" role="php" />
   <file md5sum="5d23c71dcff00d3f9a716115caa7164d" name="Symfony/Component/Security/Core/Exception/LockedException.php" role="php" />
   <file md5sum="7e9bb714f4fdc03bf4158d3ebafd9181" name="Symfony/Component/Security/Core/Exception/LogoutException.php" role="php" />
   <file md5sum="ba9525c7d4bc829f3569f785b9399c18" name="Symfony/Component/Security/Core/Exception/NonceExpiredException.php" role="php" />
   <file md5sum="bc44ab7bd2bf3f5118c22c174d164773" name="Symfony/Component/Security/Core/Exception/ProviderNotFoundException.php" role="php" />
   <file md5sum="eedf3a5276fc76bb3c7854d3ae9410ea" name="Symfony/Component/Security/Core/Exception/RuntimeException.php" role="php" />
   <file md5sum="67db74104de766f8625e248576f999da" name="Symfony/Component/Security/Core/Exception/SessionUnavailableException.php" role="php" />
   <file md5sum="d9b2b76d30d8faa7835d19faa92e7746" name="Symfony/Component/Security/Core/Exception/TokenNotFoundException.php" role="php" />
   <file md5sum="6a7031722e579b577881dd26548a2582" name="Symfony/Component/Security/Core/Exception/UnsupportedUserException.php" role="php" />
   <file md5sum="1bbd1cdc4a27e69cb001f60f6f17b953" name="Symfony/Component/Security/Core/Exception/UsernameNotFoundException.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Security/Core/LICENSE" role="doc" />
   <file md5sum="b24852b42833e802e562d16e16c4e819" name="Symfony/Component/Security/Core/phpunit.xml.dist" role="test" />
   <file md5sum="f20b648364f60e5c4c4093a968fc5331" name="Symfony/Component/Security/Core/README.md" role="doc" />
   <file md5sum="1e750b4762305800f3dd181eab53e2ba" name="Symfony/Component/Security/Core/Resources/translations/security.ar.xlf" role="php" />
   <file md5sum="31cbf1bd957d4f4c3401c20d9a1b10bc" name="Symfony/Component/Security/Core/Resources/translations/security.ca.xlf" role="php" />
   <file md5sum="0cf2e748f73950fb74f6a5978ab773f4" name="Symfony/Component/Security/Core/Resources/translations/security.cs.xlf" role="php" />
   <file md5sum="fcd7c0a40a3a5b074abce43148053890" name="Symfony/Component/Security/Core/Resources/translations/security.da.xlf" role="php" />
   <file md5sum="a01afc0ce8bdc7598652c6560fae8512" name="Symfony/Component/Security/Core/Resources/translations/security.de.xlf" role="php" />
   <file md5sum="c2883d0b5e1e7eeed7ec66ea9853f5cc" name="Symfony/Component/Security/Core/Resources/translations/security.el.xlf" role="php" />
   <file md5sum="0c6a0114323a39fad8cb33246be7b7d9" name="Symfony/Component/Security/Core/Resources/translations/security.en.xlf" role="php" />
   <file md5sum="7ae3e719888ac0c94aeda98734b5e9f5" name="Symfony/Component/Security/Core/Resources/translations/security.es.xlf" role="php" />
   <file md5sum="eef6f0230157636659e13c466e498cd9" name="Symfony/Component/Security/Core/Resources/translations/security.fa.xlf" role="php" />
   <file md5sum="8d726781df922dfb126eb85c6c1cf7f5" name="Symfony/Component/Security/Core/Resources/translations/security.fr.xlf" role="php" />
   <file md5sum="d24525aa71ea6294f1b0dad40d7a5b70" name="Symfony/Component/Security/Core/Resources/translations/security.gl.xlf" role="php" />
   <file md5sum="b8704be78d7be163b715e166f07257e3" name="Symfony/Component/Security/Core/Resources/translations/security.hu.xlf" role="php" />
   <file md5sum="47a2f3df6c37532fe6a486073aebd0a1" name="Symfony/Component/Security/Core/Resources/translations/security.it.xlf" role="php" />
   <file md5sum="defce0bf7d3e026fbdaebb0cfe7abbd6" name="Symfony/Component/Security/Core/Resources/translations/security.lb.xlf" role="php" />
   <file md5sum="79d67b79332d77ce5d39a8531f219538" name="Symfony/Component/Security/Core/Resources/translations/security.nl.xlf" role="php" />
   <file md5sum="3ca24d84b0c49e93e8425dbc96b5d479" name="Symfony/Component/Security/Core/Resources/translations/security.no.xlf" role="php" />
   <file md5sum="f6e927ae45bf961507418d03db1c676d" name="Symfony/Component/Security/Core/Resources/translations/security.pl.xlf" role="php" />
   <file md5sum="ff2d10ee020b23d10e8a49c3f72b77af" name="Symfony/Component/Security/Core/Resources/translations/security.pt_BR.xlf" role="php" />
   <file md5sum="2855177bf25fd860bca194067f350e0a" name="Symfony/Component/Security/Core/Resources/translations/security.pt_PT.xlf" role="php" />
   <file md5sum="f07b53a0e13bb3f1267b212e07b49a14" name="Symfony/Component/Security/Core/Resources/translations/security.ro.xlf" role="php" />
   <file md5sum="f943d4b750be69bd91e03eca27df52f5" name="Symfony/Component/Security/Core/Resources/translations/security.ru.xlf" role="php" />
   <file md5sum="a570f49a5deb0bba84a8f5ce71018b32" name="Symfony/Component/Security/Core/Resources/translations/security.sk.xlf" role="php" />
   <file md5sum="0a5e641bcbd17d9502a2f2f3e1d51999" name="Symfony/Component/Security/Core/Resources/translations/security.sl.xlf" role="php" />
   <file md5sum="823f2ed1191ec9723d46f2516d700973" name="Symfony/Component/Security/Core/Resources/translations/security.sr_Cyrl.xlf" role="php" />
   <file md5sum="a95969c966594fa2afcf4c0f58dcf034" name="Symfony/Component/Security/Core/Resources/translations/security.sr_Latn.xlf" role="php" />
   <file md5sum="ef66c814ecc8a2fc5fbbe30dd23f3a82" name="Symfony/Component/Security/Core/Resources/translations/security.sv.xlf" role="php" />
   <file md5sum="0d789d9cb295319cb483f864ca99b2bf" name="Symfony/Component/Security/Core/Resources/translations/security.tr.xlf" role="php" />
   <file md5sum="c7e13f578ddab881e5bb035d0e905048" name="Symfony/Component/Security/Core/Resources/translations/security.ua.xlf" role="php" />
   <file md5sum="3050382d1549c2b01456b9361e8facd3" name="Symfony/Component/Security/Core/Role/Role.php" role="php" />
   <file md5sum="bca85cac483875c294bb4577942b5e13" name="Symfony/Component/Security/Core/Role/RoleHierarchy.php" role="php" />
   <file md5sum="675f61146da7cd1caec751a2d261b0e6" name="Symfony/Component/Security/Core/Role/RoleHierarchyInterface.php" role="php" />
   <file md5sum="b03592fb0521d323c36939ab08985fce" name="Symfony/Component/Security/Core/Role/RoleInterface.php" role="php" />
   <file md5sum="8826f3ebe695c64183b161bc895da3d9" name="Symfony/Component/Security/Core/Role/SwitchUserRole.php" role="php" />
   <file md5sum="10ecd1343fe383863fcf07aea6e1484e" name="Symfony/Component/Security/Core/SecurityContext.php" role="php" />
   <file md5sum="55a5781675e114c92bad8bad5aa2830d" name="Symfony/Component/Security/Core/SecurityContextInterface.php" role="php" />
   <file md5sum="b63b6b59d9a86eb0d75e0b96f791cebe" name="Symfony/Component/Security/Core/Tests/Authentication/AuthenticationProviderManagerTest.php" role="test" />
   <file md5sum="678c0f4dcee8c6b4c914596f68e8066c" name="Symfony/Component/Security/Core/Tests/Authentication/AuthenticationTrustResolverTest.php" role="test" />
   <file md5sum="9b7f1e61792f26921f8ac8005047ec5a" name="Symfony/Component/Security/Core/Tests/Authentication/Provider/AnonymousAuthenticationProviderTest.php" role="test" />
   <file md5sum="9e46dd36c66d8390ff4ef27308eaf788" name="Symfony/Component/Security/Core/Tests/Authentication/Provider/DaoAuthenticationProviderTest.php" role="test" />
   <file md5sum="56a160fc914fa20188f3fb4428231071" name="Symfony/Component/Security/Core/Tests/Authentication/Provider/PreAuthenticatedAuthenticationProviderTest.php" role="test" />
   <file md5sum="7d87ce759a8a0bc6a43e083bcbf65a7e" name="Symfony/Component/Security/Core/Tests/Authentication/Provider/RememberMeAuthenticationProviderTest.php" role="test" />
   <file md5sum="878a24250d15912e8875b761f1b18cd6" name="Symfony/Component/Security/Core/Tests/Authentication/Provider/UserAuthenticationProviderTest.php" role="test" />
   <file md5sum="dd3f29d0edf632c2e0668095d433e2b8" name="Symfony/Component/Security/Core/Tests/Authentication/RememberMe/InMemoryTokenProviderTest.php" role="test" />
   <file md5sum="333af5f2e4fca41f0ad52c067fc6f6fa" name="Symfony/Component/Security/Core/Tests/Authentication/RememberMe/PersistentTokenTest.php" role="test" />
   <file md5sum="63d1895301e8c4db998257793246ddd4" name="Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php" role="test" />
   <file md5sum="165abe0414d3fd9f6b87b77a974dbf87" name="Symfony/Component/Security/Core/Tests/Authentication/Token/AnonymousTokenTest.php" role="test" />
   <file md5sum="ea0e9ad02afbff6e37eb9dcceb635102" name="Symfony/Component/Security/Core/Tests/Authentication/Token/PreAuthenticatedTokenTest.php" role="test" />
   <file md5sum="881577a37dc13881037471af86e54c26" name="Symfony/Component/Security/Core/Tests/Authentication/Token/UsernamePasswordTokenTest.php" role="test" />
   <file md5sum="01615835979113e72ba01df5db514cfe" name="Symfony/Component/Security/Core/Tests/Authorization/AccessDecisionManagerTest.php" role="test" />
   <file md5sum="53e2015913c42918f488b6b5768dcfd6" name="Symfony/Component/Security/Core/Tests/Authorization/ExpressionLanguageTest.php" role="test" />
   <file md5sum="09a4601d7459111b412a28d8b3ba77e6" name="Symfony/Component/Security/Core/Tests/Authorization/Voter/AuthenticatedVoterTest.php" role="test" />
   <file md5sum="f7de9f0134587eca878b84fa96cd4e11" name="Symfony/Component/Security/Core/Tests/Authorization/Voter/ExpressionVoterTest.php" role="test" />
   <file md5sum="1515e17b427defd7ede0b26cd62d6f7c" name="Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleHierarchyVoterTest.php" role="test" />
   <file md5sum="6eafbf6e21bcb931d7deeb6c7a03d09d" name="Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleVoterTest.php" role="test" />
   <file md5sum="262dd768f1ab73f96eee0a29a7665d3f" name="Symfony/Component/Security/Core/Tests/Encoder/BasePasswordEncoderTest.php" role="test" />
   <file md5sum="a052af732959cb4100386622650cde49" name="Symfony/Component/Security/Core/Tests/Encoder/BCryptPasswordEncoderTest.php" role="test" />
   <file md5sum="c4466a3921e1ef6bc3ffa19e825cc264" name="Symfony/Component/Security/Core/Tests/Encoder/EncoderFactoryTest.php" role="test" />
   <file md5sum="1a2e9523c0f574255c5e8cc12563036d" name="Symfony/Component/Security/Core/Tests/Encoder/MessageDigestPasswordEncoderTest.php" role="test" />
   <file md5sum="47d32cbddb94e8c940a067da8bd652c8" name="Symfony/Component/Security/Core/Tests/Encoder/Pbkdf2PasswordEncoderTest.php" role="test" />
   <file md5sum="9a3e27e7243e0aef39d89ce5048f0156" name="Symfony/Component/Security/Core/Tests/Encoder/PlaintextPasswordEncoderTest.php" role="test" />
   <file md5sum="e84df0653432699a74f9892f39cd801d" name="Symfony/Component/Security/Core/Tests/Role/RoleHierarchyTest.php" role="test" />
   <file md5sum="6faeaa1b59d680fc64f68f187d3b8ad4" name="Symfony/Component/Security/Core/Tests/Role/RoleTest.php" role="test" />
   <file md5sum="63e6fa508f87e6843cdc7d4dbb310ed4" name="Symfony/Component/Security/Core/Tests/Role/SwitchUserRoleTest.php" role="test" />
   <file md5sum="c6a315c41a473173516a7b97d7bd135f" name="Symfony/Component/Security/Core/Tests/SecurityContextTest.php" role="test" />
   <file md5sum="39059760376a28b3a1289ebeeefbf9ef" name="Symfony/Component/Security/Core/Tests/User/ChainUserProviderTest.php" role="test" />
   <file md5sum="92589d6ad763ccd817043e6b5fb5865d" name="Symfony/Component/Security/Core/Tests/User/UserTest.php" role="test" />
   <file md5sum="51ae9e53749a60e2d99ca0fa4893a68a" name="Symfony/Component/Security/Core/Tests/Util/ClassUtilsTest.php" role="test" />
   <file md5sum="172dc84386daa4193854aad1078407fb" name="Symfony/Component/Security/Core/Tests/Util/SecureRandomTest.php" role="test" />
   <file md5sum="a80a7c57b6922fd9a9925a82a7741a01" name="Symfony/Component/Security/Core/Tests/Util/StringUtilsTest.php" role="test" />
   <file md5sum="c2ecdc8fea6ea459acf382fbd0de514c" name="Symfony/Component/Security/Core/Tests/Validator/Constraints/UserPasswordValidatorTest.php" role="test" />
   <file md5sum="dac22529730e8721ae339aacb05b561c" name="Symfony/Component/Security/Core/User/AdvancedUserInterface.php" role="php" />
   <file md5sum="16ad9f1561e239188cb64ff12a4cd713" name="Symfony/Component/Security/Core/User/ChainUserProvider.php" role="php" />
   <file md5sum="053bfd3d7feb51135f125c471e0919f2" name="Symfony/Component/Security/Core/User/EquatableInterface.php" role="php" />
   <file md5sum="c62ec26256558502bdff94ccdff8f4c3" name="Symfony/Component/Security/Core/User/InMemoryUserProvider.php" role="php" />
   <file md5sum="a36d5dcfd2e90b7079473de27ece3f0c" name="Symfony/Component/Security/Core/User/User.php" role="php" />
   <file md5sum="915fa1f4c48a7ce2f501c26b7a784f28" name="Symfony/Component/Security/Core/User/UserChecker.php" role="php" />
   <file md5sum="388e848eda1ffa8b46dd0ae9bf227b90" name="Symfony/Component/Security/Core/User/UserCheckerInterface.php" role="php" />
   <file md5sum="47ee6a0d6557868aaf10450f4137462b" name="Symfony/Component/Security/Core/User/UserInterface.php" role="php" />
   <file md5sum="482f41d8bda5807c72c319d1d2a11c09" name="Symfony/Component/Security/Core/User/UserProviderInterface.php" role="php" />
   <file md5sum="dd14c33e711d9ac06c1507157e32f166" name="Symfony/Component/Security/Core/Util/ClassUtils.php" role="php" />
   <file md5sum="9b650297a6cfe3a6947488561371c574" name="Symfony/Component/Security/Core/Util/SecureRandom.php" role="php" />
   <file md5sum="9ac637cacec94e99f0a7af4154ea16ef" name="Symfony/Component/Security/Core/Util/SecureRandomInterface.php" role="php" />
   <file md5sum="e9ba381671f8b8f44a880028850a3dc6" name="Symfony/Component/Security/Core/Util/StringUtils.php" role="php" />
   <file md5sum="681b19bd49acd0a67bf514c0a420e164" name="Symfony/Component/Security/Core/Validator/Constraints/UserPassword.php" role="php" />
   <file md5sum="73b05740588c9089f62ddccb23b85de2" name="Symfony/Component/Security/Core/Validator/Constraints/UserPasswordValidator.php" role="php" />
   <file md5sum="8bf68c5cb8ecade41dedb7a808186bfc" name="Symfony/Component/Security/Csrf/composer.json" role="doc" />
   <file md5sum="8dd9faf3aa313127ffcf0106abafdb34" name="Symfony/Component/Security/Csrf/CsrfToken.php" role="php" />
   <file md5sum="4584d3d466fbd310bd1c3730a53aba62" name="Symfony/Component/Security/Csrf/CsrfTokenManager.php" role="php" />
   <file md5sum="4f9257a2c8b6285605af062e31e92c51" name="Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.php" role="php" />
   <file md5sum="283b3574fff8ff0c093c8c2c74024fb0" name="Symfony/Component/Security/Csrf/Exception/TokenNotFoundException.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Security/Csrf/LICENSE" role="doc" />
   <file md5sum="4a5e98782fbba28092cafe77c3168c51" name="Symfony/Component/Security/Csrf/phpunit.xml.dist" role="test" />
   <file md5sum="f7759c45cd4a446a228ed648286acf8f" name="Symfony/Component/Security/Csrf/README.md" role="doc" />
   <file md5sum="3de809f4f691151c195fba128ff1e32d" name="Symfony/Component/Security/Csrf/Tests/CsrfTokenManagerTest.php" role="test" />
   <file md5sum="bc23118b2998753a1a5d8d744edb93e9" name="Symfony/Component/Security/Csrf/Tests/TokenGenerator/UriSafeTokenGeneratorTest.php" role="test" />
   <file md5sum="362691003c5cc955877ecd235ef329d5" name="Symfony/Component/Security/Csrf/Tests/TokenStorage/NativeSessionTokenStorageTest.php" role="test" />
   <file md5sum="6a12af8493e94dd61cffa21f05b8dac8" name="Symfony/Component/Security/Csrf/Tests/TokenStorage/SessionTokenStorageTest.php" role="test" />
   <file md5sum="dab50ef252b23f81bc0a28dd6ed3c2f0" name="Symfony/Component/Security/Csrf/TokenGenerator/TokenGeneratorInterface.php" role="php" />
   <file md5sum="2cac1d204af23007d684c61435e0275a" name="Symfony/Component/Security/Csrf/TokenGenerator/UriSafeTokenGenerator.php" role="php" />
   <file md5sum="c6aa4826742510546c711553b19d87a4" name="Symfony/Component/Security/Csrf/TokenStorage/NativeSessionTokenStorage.php" role="php" />
   <file md5sum="3525f5f7040f8b2e3fb7f2df67c3e52b" name="Symfony/Component/Security/Csrf/TokenStorage/SessionTokenStorage.php" role="php" />
   <file md5sum="602d9216e9b1d1f0d22b31c902e5b4bb" name="Symfony/Component/Security/Csrf/TokenStorage/TokenStorageInterface.php" role="php" />
   <file md5sum="9df423675054d980e7bae7cc92020c03" name="Symfony/Component/Security/Http/AccessMap.php" role="php" />
   <file md5sum="43086a06e68384eaccab38dfb698786d" name="Symfony/Component/Security/Http/AccessMapInterface.php" role="php" />
   <file md5sum="1a26ecccd324ea272277edffc5c84886" name="Symfony/Component/Security/Http/Authentication/AuthenticationFailureHandlerInterface.php" role="php" />
   <file md5sum="1249ffb01efe413cfd97a5337cb00137" name="Symfony/Component/Security/Http/Authentication/AuthenticationSuccessHandlerInterface.php" role="php" />
   <file md5sum="4b78405b37b8d39c63538f637fd497dc" name="Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php" role="php" />
   <file md5sum="d1a101bba266130a6fdbfc92126cef07" name="Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.php" role="php" />
   <file md5sum="ed65679f667d9ef57a6791a64a8bd6c2" name="Symfony/Component/Security/Http/Authentication/SimpleAuthenticationHandler.php" role="php" />
   <file md5sum="afbc8d72124b7a6aee7879fa64325a9f" name="Symfony/Component/Security/Http/Authorization/AccessDeniedHandlerInterface.php" role="php" />
   <file md5sum="5b7cd3c1e3d2a0a5cacc080b87c9e590" name="Symfony/Component/Security/Http/composer.json" role="doc" />
   <file md5sum="6d3ec77aadf630304cff4ed3c026b086" name="Symfony/Component/Security/Http/EntryPoint/AuthenticationEntryPointInterface.php" role="php" />
   <file md5sum="0cacf36e7c79e4ca8e7fad2ad771335d" name="Symfony/Component/Security/Http/EntryPoint/BasicAuthenticationEntryPoint.php" role="php" />
   <file md5sum="0916b4aabd44274d2a1d24d7eccd3370" name="Symfony/Component/Security/Http/EntryPoint/DigestAuthenticationEntryPoint.php" role="php" />
   <file md5sum="957245bb0cc25e4ddfa36ff11b60cf31" name="Symfony/Component/Security/Http/EntryPoint/FormAuthenticationEntryPoint.php" role="php" />
   <file md5sum="e3cec247e8df4a6e97c579e4ea923bc4" name="Symfony/Component/Security/Http/EntryPoint/RetryAuthenticationEntryPoint.php" role="php" />
   <file md5sum="99b4defc6b93df2b7f1c0b4dedef3ff9" name="Symfony/Component/Security/Http/Event/InteractiveLoginEvent.php" role="php" />
   <file md5sum="7ce04d8a18a0487f987e31fc88bd68c5" name="Symfony/Component/Security/Http/Event/SwitchUserEvent.php" role="php" />
   <file md5sum="c38b7e9b63bb0cc12e471d58062964b7" name="Symfony/Component/Security/Http/Firewall/AbstractAuthenticationListener.php" role="php" />
   <file md5sum="0a1aebef9c2f8f6a328e6227052df7ab" name="Symfony/Component/Security/Http/Firewall/AbstractPreAuthenticatedListener.php" role="php" />
   <file md5sum="5aa38481213505e4d4b3308202f16ae2" name="Symfony/Component/Security/Http/Firewall/AccessListener.php" role="php" />
   <file md5sum="fffa376fb78716df7994bd30c2c3d8e2" name="Symfony/Component/Security/Http/Firewall/AnonymousAuthenticationListener.php" role="php" />
   <file md5sum="b35cfc2ded8a8aa315ba7ee88ae788b5" name="Symfony/Component/Security/Http/Firewall/BasicAuthenticationListener.php" role="php" />
   <file md5sum="850ac32b9360422daedb18164af00887" name="Symfony/Component/Security/Http/Firewall/ChannelListener.php" role="php" />
   <file md5sum="096bd4d9e3b975fcac84503f61384b7e" name="Symfony/Component/Security/Http/Firewall/ContextListener.php" role="php" />
   <file md5sum="c9c8fa0fd59936274a596a360568a575" name="Symfony/Component/Security/Http/Firewall/DigestAuthenticationListener.php" role="php" />
   <file md5sum="0b7d00f42228ca3d4827012968c69a8c" name="Symfony/Component/Security/Http/Firewall/ExceptionListener.php" role="php" />
   <file md5sum="6f43f337a4368b4d7b1cce0e76b51b10" name="Symfony/Component/Security/Http/Firewall/ListenerInterface.php" role="php" />
   <file md5sum="42ad987ff1e6284b2fd2f11d5cf09725" name="Symfony/Component/Security/Http/Firewall/LogoutListener.php" role="php" />
   <file md5sum="becb8470e4e05de6ad82ff6bf7e646fc" name="Symfony/Component/Security/Http/Firewall/RememberMeListener.php" role="php" />
   <file md5sum="3c80c1a805d89cfd4f475aa5d8517267" name="Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.php" role="php" />
   <file md5sum="e06e2b324e79ee890f1feebba9bc8ac3" name="Symfony/Component/Security/Http/Firewall/SimplePreAuthenticationListener.php" role="php" />
   <file md5sum="62963e5323a197109f7f7f3e860154ca" name="Symfony/Component/Security/Http/Firewall/SwitchUserListener.php" role="php" />
   <file md5sum="4f883d92d37fd6eb289b50abd37ae680" name="Symfony/Component/Security/Http/Firewall/UsernamePasswordFormAuthenticationListener.php" role="php" />
   <file md5sum="08351ed63f27f17c1b35b08600cc8864" name="Symfony/Component/Security/Http/Firewall/X509AuthenticationListener.php" role="php" />
   <file md5sum="ee01a78804fc30696b6ec0eeef5c59a6" name="Symfony/Component/Security/Http/Firewall.php" role="php" />
   <file md5sum="2a749495dc3be6af3a2fd28e729c80a6" name="Symfony/Component/Security/Http/FirewallMap.php" role="php" />
   <file md5sum="87ce09ab99f6ec6b472a725abff910c5" name="Symfony/Component/Security/Http/FirewallMapInterface.php" role="php" />
   <file md5sum="a2bb9c5c5076b9a7978f301b64c00b9e" name="Symfony/Component/Security/Http/HttpUtils.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Security/Http/LICENSE" role="doc" />
   <file md5sum="e5ddc1de0d071bdeacbcd2325ed2d4ae" name="Symfony/Component/Security/Http/Logout/CookieClearingLogoutHandler.php" role="php" />
   <file md5sum="45d84fb75d34ea9135c5b72108e1dbf7" name="Symfony/Component/Security/Http/Logout/DefaultLogoutSuccessHandler.php" role="php" />
   <file md5sum="eefeebbc791fa1bccf5a3952be87ba78" name="Symfony/Component/Security/Http/Logout/LogoutHandlerInterface.php" role="php" />
   <file md5sum="cc172ba7205b41a32dd97a56eadf4cc8" name="Symfony/Component/Security/Http/Logout/LogoutSuccessHandlerInterface.php" role="php" />
   <file md5sum="aecd2ef66d8aade29cc47157048e4a21" name="Symfony/Component/Security/Http/Logout/SessionLogoutHandler.php" role="php" />
   <file md5sum="2f041adb26153b8fb15facf2c6af231d" name="Symfony/Component/Security/Http/phpunit.xml.dist" role="test" />
   <file md5sum="a345783d58ade730c9a01639748b41c6" name="Symfony/Component/Security/Http/README.md" role="doc" />
   <file md5sum="b72e5cba34abbeea45218aced16a6359" name="Symfony/Component/Security/Http/RememberMe/AbstractRememberMeServices.php" role="php" />
   <file md5sum="435ea3e4c99dd22c771c99f16392c656" name="Symfony/Component/Security/Http/RememberMe/PersistentTokenBasedRememberMeServices.php" role="php" />
   <file md5sum="d0150afc723a4bb2f322842c1e0a8ce6" name="Symfony/Component/Security/Http/RememberMe/RememberMeServicesInterface.php" role="php" />
   <file md5sum="1d39556b7575907aa6f092bb4c07f387" name="Symfony/Component/Security/Http/RememberMe/ResponseListener.php" role="php" />
   <file md5sum="2e0288eec870215f3f4b8e360afbcf21" name="Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.php" role="php" />
   <file md5sum="80cf473a2f0baee880e458d5946fde6b" name="Symfony/Component/Security/Http/SecurityEvents.php" role="php" />
   <file md5sum="f4eee94c1c2e104f0ce7b8d5bd349fa0" name="Symfony/Component/Security/Http/Session/SessionAuthenticationStrategy.php" role="php" />
   <file md5sum="a8df527492a3c775c0c2d3affaec1268" name="Symfony/Component/Security/Http/Session/SessionAuthenticationStrategyInterface.php" role="php" />
   <file md5sum="1e501db8e61f7fbbe1ce2046846d0d16" name="Symfony/Component/Security/Http/Tests/AccessMapTest.php" role="test" />
   <file md5sum="d3e7326491ec2358ba350f4a937d9778" name="Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.php" role="test" />
   <file md5sum="f238eea0886f4d046befadaa74b02fbe" name="Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.php" role="test" />
   <file md5sum="d5cef550f4e58533d96feab10cdf02d7" name="Symfony/Component/Security/Http/Tests/Authentication/SimpleAuthenticationHandlerTest.php" role="test" />
   <file md5sum="44e155837ffd4ba5e88a3fe86fa0371a" name="Symfony/Component/Security/Http/Tests/EntryPoint/BasicAuthenticationEntryPointTest.php" role="test" />
   <file md5sum="cf8ce9dfa9ef2b8cf64c2bca4eeaa2ee" name="Symfony/Component/Security/Http/Tests/EntryPoint/DigestAuthenticationEntryPointTest.php" role="test" />
   <file md5sum="6f33e2bc5d33de50781109deaa92375b" name="Symfony/Component/Security/Http/Tests/EntryPoint/FormAuthenticationEntryPointTest.php" role="test" />
   <file md5sum="9e4221ac3557ad490f50b572a1cb6da0" name="Symfony/Component/Security/Http/Tests/EntryPoint/RetryAuthenticationEntryPointTest.php" role="test" />
   <file md5sum="7616457ff22f218eb84d0582b3a32d99" name="Symfony/Component/Security/Http/Tests/Firewall/AbstractPreAuthenticatedListenerTest.php" role="test" />
   <file md5sum="50390ecbf94ded92656d9de6570d63c1" name="Symfony/Component/Security/Http/Tests/Firewall/AccessListenerTest.php" role="test" />
   <file md5sum="d3745efe02656a6a40d2421791a65ab2" name="Symfony/Component/Security/Http/Tests/Firewall/AnonymousAuthenticationListenerTest.php" role="test" />
   <file md5sum="f9b4fe52898a270086a0323bc9e744d2" name="Symfony/Component/Security/Http/Tests/Firewall/BasicAuthenticationListenerTest.php" role="test" />
   <file md5sum="39f3a9fbfd8fb369e3518c1f737c69d1" name="Symfony/Component/Security/Http/Tests/Firewall/ChannelListenerTest.php" role="test" />
   <file md5sum="fefeae0b89d7bce7c98fd5f79e64fb80" name="Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php" role="test" />
   <file md5sum="0cd7a88d1e73a7c2397a05ee835b416e" name="Symfony/Component/Security/Http/Tests/Firewall/DigestDataTest.php" role="test" />
   <file md5sum="bdc936486eb622f5ebc89def545d34cc" name="Symfony/Component/Security/Http/Tests/Firewall/LogoutListenerTest.php" role="test" />
   <file md5sum="5aa221a87c438540d59e8d06cbc51e43" name="Symfony/Component/Security/Http/Tests/Firewall/RememberMeListenerTest.php" role="test" />
   <file md5sum="4e401aaf8580c5f225065eb296d09ffd" name="Symfony/Component/Security/Http/Tests/Firewall/SwitchUserListenerTest.php" role="test" />
   <file md5sum="62ada44f4eeb63bc411ebff114f5f340" name="Symfony/Component/Security/Http/Tests/Firewall/X509AuthenticationListenerTest.php" role="test" />
   <file md5sum="90e0766898394d8523cb8d3093b8ad0f" name="Symfony/Component/Security/Http/Tests/FirewallMapTest.php" role="test" />
   <file md5sum="58a4fef6ae246369bdff44ea9566e2e7" name="Symfony/Component/Security/Http/Tests/FirewallTest.php" role="test" />
   <file md5sum="a65c06a07157d8b2f79f1718fe9acc3a" name="Symfony/Component/Security/Http/Tests/HttpUtilsTest.php" role="test" />
   <file md5sum="d82d3ab3c92583cd9aa15b9ed8ae9db2" name="Symfony/Component/Security/Http/Tests/Logout/CookieClearingLogoutHandlerTest.php" role="test" />
   <file md5sum="b35e129cc7f5bc083d3b855f286a2228" name="Symfony/Component/Security/Http/Tests/Logout/DefaultLogoutSuccessHandlerTest.php" role="test" />
   <file md5sum="31043c56e00a9f85591f7aeb1a0d7abe" name="Symfony/Component/Security/Http/Tests/Logout/SessionLogoutHandlerTest.php" role="test" />
   <file md5sum="a4f462fe63db2978e9eb7b9088a332a1" name="Symfony/Component/Security/Http/Tests/RememberMe/AbstractRememberMeServicesTest.php" role="test" />
   <file md5sum="1dcfd5f481984cbcbe252c35abb90560" name="Symfony/Component/Security/Http/Tests/RememberMe/PersistentTokenBasedRememberMeServicesTest.php" role="test" />
   <file md5sum="d8f1bc020d5b21d2de0433c2839b08f9" name="Symfony/Component/Security/Http/Tests/RememberMe/ResponseListenerTest.php" role="test" />
   <file md5sum="e4109def8460d75d5f052f67ec6ba970" name="Symfony/Component/Security/Http/Tests/RememberMe/TokenBasedRememberMeServicesTest.php" role="test" />
   <file md5sum="7787c557da28fb7dd4cc86318f909bb3" name="Symfony/Component/Security/Http/Tests/Session/SessionAuthenticationStrategyTest.php" role="test" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Security/LICENSE" role="doc" />
   <file md5sum="b48391335127152904b86aef4327b6ba" name="Symfony/Component/Security/phpunit.xml.dist" role="test" />
   <file md5sum="4dec033fca5592436030a98806bbf6d7" name="Symfony/Component/Security/README.md" role="doc" />
   <file md5sum="1e750b4762305800f3dd181eab53e2ba" name="Symfony/Component/Security/Resources/translations/security.ar.xlf" role="php" />
   <file md5sum="60f216b50da4b49da27b177ba8ca3b46" name="Symfony/Component/Security/Resources/translations/security.bg.xlf" role="php" />
   <file md5sum="31cbf1bd957d4f4c3401c20d9a1b10bc" name="Symfony/Component/Security/Resources/translations/security.ca.xlf" role="php" />
   <file md5sum="0cf2e748f73950fb74f6a5978ab773f4" name="Symfony/Component/Security/Resources/translations/security.cs.xlf" role="php" />
   <file md5sum="6d1c01434b6521da496cf9c91c144ea1" name="Symfony/Component/Security/Resources/translations/security.da.xlf" role="php" />
   <file md5sum="a01afc0ce8bdc7598652c6560fae8512" name="Symfony/Component/Security/Resources/translations/security.de.xlf" role="php" />
   <file md5sum="c2883d0b5e1e7eeed7ec66ea9853f5cc" name="Symfony/Component/Security/Resources/translations/security.el.xlf" role="php" />
   <file md5sum="0c6a0114323a39fad8cb33246be7b7d9" name="Symfony/Component/Security/Resources/translations/security.en.xlf" role="php" />
   <file md5sum="7ae3e719888ac0c94aeda98734b5e9f5" name="Symfony/Component/Security/Resources/translations/security.es.xlf" role="php" />
   <file md5sum="eef6f0230157636659e13c466e498cd9" name="Symfony/Component/Security/Resources/translations/security.fa.xlf" role="php" />
   <file md5sum="8d726781df922dfb126eb85c6c1cf7f5" name="Symfony/Component/Security/Resources/translations/security.fr.xlf" role="php" />
   <file md5sum="d24525aa71ea6294f1b0dad40d7a5b70" name="Symfony/Component/Security/Resources/translations/security.gl.xlf" role="php" />
   <file md5sum="7b03fcbcf3c6586ee539377f3f5a3bdc" name="Symfony/Component/Security/Resources/translations/security.hr.xlf" role="php" />
   <file md5sum="b8704be78d7be163b715e166f07257e3" name="Symfony/Component/Security/Resources/translations/security.hu.xlf" role="php" />
   <file md5sum="40ec159baa27f18ea7ab7924e652ec97" name="Symfony/Component/Security/Resources/translations/security.id.xlf" role="php" />
   <file md5sum="47a2f3df6c37532fe6a486073aebd0a1" name="Symfony/Component/Security/Resources/translations/security.it.xlf" role="php" />
   <file md5sum="acf99e98e5ffff85489c97c78a83b317" name="Symfony/Component/Security/Resources/translations/security.ja.xlf" role="php" />
   <file md5sum="defce0bf7d3e026fbdaebb0cfe7abbd6" name="Symfony/Component/Security/Resources/translations/security.lb.xlf" role="php" />
   <file md5sum="79d67b79332d77ce5d39a8531f219538" name="Symfony/Component/Security/Resources/translations/security.nl.xlf" role="php" />
   <file md5sum="03051a200f3f0f13a30ed957026a1784" name="Symfony/Component/Security/Resources/translations/security.no.xlf" role="php" />
   <file md5sum="f6e927ae45bf961507418d03db1c676d" name="Symfony/Component/Security/Resources/translations/security.pl.xlf" role="php" />
   <file md5sum="5140f0e3d9b00962b72eb4f3cce9b2a4" name="Symfony/Component/Security/Resources/translations/security.pt_BR.xlf" role="php" />
   <file md5sum="2855177bf25fd860bca194067f350e0a" name="Symfony/Component/Security/Resources/translations/security.pt_PT.xlf" role="php" />
   <file md5sum="f07b53a0e13bb3f1267b212e07b49a14" name="Symfony/Component/Security/Resources/translations/security.ro.xlf" role="php" />
   <file md5sum="f943d4b750be69bd91e03eca27df52f5" name="Symfony/Component/Security/Resources/translations/security.ru.xlf" role="php" />
   <file md5sum="a570f49a5deb0bba84a8f5ce71018b32" name="Symfony/Component/Security/Resources/translations/security.sk.xlf" role="php" />
   <file md5sum="0a5e641bcbd17d9502a2f2f3e1d51999" name="Symfony/Component/Security/Resources/translations/security.sl.xlf" role="php" />
   <file md5sum="823f2ed1191ec9723d46f2516d700973" name="Symfony/Component/Security/Resources/translations/security.sr_Cyrl.xlf" role="php" />
   <file md5sum="a95969c966594fa2afcf4c0f58dcf034" name="Symfony/Component/Security/Resources/translations/security.sr_Latn.xlf" role="php" />
   <file md5sum="ef66c814ecc8a2fc5fbbe30dd23f3a82" name="Symfony/Component/Security/Resources/translations/security.sv.xlf" role="php" />
   <file md5sum="0d789d9cb295319cb483f864ca99b2bf" name="Symfony/Component/Security/Resources/translations/security.tr.xlf" role="php" />
   <file md5sum="c7e13f578ddab881e5bb035d0e905048" name="Symfony/Component/Security/Resources/translations/security.ua.xlf" role="php" />
   <file md5sum="b549799b91bf73427ed2c0de26e8d27e" name="Symfony/Component/Security/Resources/translations/security.vi.xlf" role="php" />
   <file md5sum="c1985d9108a24d1e66b1832cf6c0fae7" name="Symfony/Component/Security/Resources/translations/security.zh_CN.xlf" role="php" />
   <file md5sum="82c8dfa2a45c9aca1e839e448574b12b" name="Symfony/Component/Security/Tests/Core/Authentication/Token/RememberMeTokenTest.php" role="test" />
   <file md5sum="77f76d7ae94a351ec03076059c96f80d" name="Symfony/Component/Security/Tests/Core/User/InMemoryUserProviderTest.php" role="test" />
   <file md5sum="3b095a4893cc953a6aa42a368c70c8a5" name="Symfony/Component/Security/Tests/Core/User/UserCheckerTest.php" role="test" />
   <file md5sum="693af9a30d85b3907c6147d9ddb56df8" name="Symfony/Component/Security/Tests/Http/Firewall/ExceptionListenerTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
   <package>
    <name>HttpKernel</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>HttpFoundation</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>EventDispatcher</name>
    <channel>pear.symfony.com</channel>
   </package>
  </required>
  <optional>
   <package>
    <name>Routing</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Finder</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>ClassLoader</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Form</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\a������$pear/.pkgxml/Symfony2_Form-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Form</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Form Component</summary>
 <description>Symfony2 Form Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:45</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="501890934b78c1cda42337c3c85761f5" name="Symfony/Component/Form/AbstractExtension.php" role="php" />
   <file md5sum="c855e95efaafd48a3b35f4e4ed7ef461" name="Symfony/Component/Form/AbstractRendererEngine.php" role="php" />
   <file md5sum="fda8ea1864e57a50d81607d692e68c73" name="Symfony/Component/Form/AbstractType.php" role="php" />
   <file md5sum="0cc218c093e9d4631ab2dd2276c567bd" name="Symfony/Component/Form/AbstractTypeExtension.php" role="php" />
   <file md5sum="ccc700d8c25bc05b9e4a4b327a643f46" name="Symfony/Component/Form/autoloader.php" role="php" />
   <file md5sum="e4221c7f370be7e1fae189ac0f0245f8" name="Symfony/Component/Form/Button.php" role="php" />
   <file md5sum="d27ec47e44803a025e38d0067c824cdc" name="Symfony/Component/Form/ButtonBuilder.php" role="php" />
   <file md5sum="2b9067ff341a18790204ea50c84102bd" name="Symfony/Component/Form/ButtonTypeInterface.php" role="php" />
   <file md5sum="902572561ace9999c9f8d8e0f37cd28f" name="Symfony/Component/Form/CallbackTransformer.php" role="php" />
   <file md5sum="abf0d085506e63678c96f8f9666c3b1c" name="Symfony/Component/Form/CHANGELOG.md" role="doc" />
   <file md5sum="0907b59351198bd99ceea685c9f7c7c2" name="Symfony/Component/Form/ClickableInterface.php" role="php" />
   <file md5sum="5519e4c865c9aab62f36e8ccc2687a0a" name="Symfony/Component/Form/composer.json" role="doc" />
   <file md5sum="db3b117a3b8dd577bbd64a81766ad78d" name="Symfony/Component/Form/DataMapperInterface.php" role="php" />
   <file md5sum="555454867c9b8687d4ee00a014b981c1" name="Symfony/Component/Form/DataTransformerInterface.php" role="php" />
   <file md5sum="bc89a72f34e3e1d4a6628d32b1511007" name="Symfony/Component/Form/Exception/AlreadyBoundException.php" role="php" />
   <file md5sum="419b77be4914d44fbe8f422c9dce819a" name="Symfony/Component/Form/Exception/AlreadySubmittedException.php" role="php" />
   <file md5sum="a7e624979068a6ac1975cef01a181a64" name="Symfony/Component/Form/Exception/BadMethodCallException.php" role="php" />
   <file md5sum="b43e60289f802c13894f4427988c2915" name="Symfony/Component/Form/Exception/ErrorMappingException.php" role="php" />
   <file md5sum="1f4d4c025c5f49fd0e787f2095dcac58" name="Symfony/Component/Form/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="a93c3e0ef8f9f1833b1ec31f26baaa92" name="Symfony/Component/Form/Exception/InvalidArgumentException.php" role="php" />
   <file md5sum="16b9f308c2cd41c6feea464a4c2a4078" name="Symfony/Component/Form/Exception/InvalidConfigurationException.php" role="php" />
   <file md5sum="7acb2af6fec7e8015fdf9473ed22e568" name="Symfony/Component/Form/Exception/LogicException.php" role="php" />
   <file md5sum="6439c29ccaba5ed08f068b56d1cb900a" name="Symfony/Component/Form/Exception/OutOfBoundsException.php" role="php" />
   <file md5sum="035137b05f9d396eebf788cd0475bfd2" name="Symfony/Component/Form/Exception/RuntimeException.php" role="php" />
   <file md5sum="05fafa90307ac0049080845bfc134e90" name="Symfony/Component/Form/Exception/StringCastException.php" role="php" />
   <file md5sum="04e43782ab8e754a86f812f93d3e80f0" name="Symfony/Component/Form/Exception/TransformationFailedException.php" role="php" />
   <file md5sum="93ab4195343c65feabe0a9a15e3b4e03" name="Symfony/Component/Form/Exception/UnexpectedTypeException.php" role="php" />
   <file md5sum="fae7f67d21f3636dcfd9255b18c0f409" name="Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php" role="php" />
   <file md5sum="75ef902d77e51ff120a5bb80a3ba4b2c" name="Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceListInterface.php" role="php" />
   <file md5sum="6c60da1e88563e1e8ee345e908e99895" name="Symfony/Component/Form/Extension/Core/ChoiceList/LazyChoiceList.php" role="php" />
   <file md5sum="93d7bd50a57d6ce541c9e465f1f9c727" name="Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php" role="php" />
   <file md5sum="dd799ebc2f390f6c26a68d9b27163986" name="Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php" role="php" />
   <file md5sum="249e325333e1e0bbf071c2352f1015ef" name="Symfony/Component/Form/Extension/Core/CoreExtension.php" role="php" />
   <file md5sum="cf380dc09a61dcd25aa19cde02d5a496" name="Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php" role="php" />
   <file md5sum="5b1463a8ca32434df6df7fdd15470ffe" name="Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.php" role="php" />
   <file md5sum="95ce9f75d9de781506bd27afae24a435" name="Symfony/Component/Form/Extension/Core/DataTransformer/BaseDateTimeTransformer.php" role="php" />
   <file md5sum="1beb890d4d901ce9a49a02aa567d4d1d" name="Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.php" role="php" />
   <file md5sum="bdc67501df308818f4ccb6e87fd4b460" name="Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToBooleanArrayTransformer.php" role="php" />
   <file md5sum="d417455cb1a9c5f1ce2d0ae9b72c262a" name="Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToValuesTransformer.php" role="php" />
   <file md5sum="b4ddb6ca1e45e39c27603e9a61746fe0" name="Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToBooleanArrayTransformer.php" role="php" />
   <file md5sum="c23bb58d706b389464865d3baaa9dc0f" name="Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.php" role="php" />
   <file md5sum="fb47a7c8ec22b84e657ba080eebf9185" name="Symfony/Component/Form/Extension/Core/DataTransformer/DataTransformerChain.php" role="php" />
   <file md5sum="987af4de3dad99dbe03d40ad481e59f5" name="Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.php" role="php" />
   <file md5sum="08fe73eed45b4e64f5a612fe384ee949" name="Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php" role="php" />
   <file md5sum="536a31499542c247eeac9f887459ccb6" name="Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.php" role="php" />
   <file md5sum="84819444537109979c4ded0dcb5449d3" name="Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.php" role="php" />
   <file md5sum="d420953c67b9ce03b78d46777f78934e" name="Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.php" role="php" />
   <file md5sum="87c45ad85d859bc5ac1847dbe26f451f" name="Symfony/Component/Form/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformer.php" role="php" />
   <file md5sum="031be52b519ab452a56e72c0ad919f9d" name="Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php" role="php" />
   <file md5sum="fdab477194f1770c375e73e5571253c9" name="Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php" role="php" />
   <file md5sum="0a1be99705fd6d15d2b67c9d7cc34f0a" name="Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php" role="php" />
   <file md5sum="a9acfacc5c1d22709f2d9fb9572e5856" name="Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.php" role="php" />
   <file md5sum="4fd81dac92cd7178a4df5463b909a67b" name="Symfony/Component/Form/Extension/Core/EventListener/FixCheckboxInputListener.php" role="php" />
   <file md5sum="def66949bde6d959e70d661d15f1e9e3" name="Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.php" role="php" />
   <file md5sum="f57106b0d09322f11efddefb368fb952" name="Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php" role="php" />
   <file md5sum="1d42403d6e8be3877c66cdf6eeb7f375" name="Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php" role="php" />
   <file md5sum="c79a52d764d974eaa9a1d742211220b9" name="Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php" role="php" />
   <file md5sum="0bbbf865bc2c1c7b013b19cd49ea66f8" name="Symfony/Component/Form/Extension/Core/EventListener/TrimListener.php" role="php" />
   <file md5sum="058c321dda699e31ae2e164586817072" name="Symfony/Component/Form/Extension/Core/Type/BaseType.php" role="php" />
   <file md5sum="601dc1defb9cfe03f57ecb55ec6519ee" name="Symfony/Component/Form/Extension/Core/Type/BirthdayType.php" role="php" />
   <file md5sum="df30378aa4224d2e19bfb48e3f22be73" name="Symfony/Component/Form/Extension/Core/Type/ButtonType.php" role="php" />
   <file md5sum="20d7fadb63815c65c600ff1cab100d69" name="Symfony/Component/Form/Extension/Core/Type/CheckboxType.php" role="php" />
   <file md5sum="c7bce0021e92409791dc40237e44585e" name="Symfony/Component/Form/Extension/Core/Type/ChoiceType.php" role="php" />
   <file md5sum="675668b49022522d4646aa90049c2650" name="Symfony/Component/Form/Extension/Core/Type/CollectionType.php" role="php" />
   <file md5sum="113a7ecb3ad40c9ffb38fd685db1ab3a" name="Symfony/Component/Form/Extension/Core/Type/CountryType.php" role="php" />
   <file md5sum="0be9c69f93866ae116791fcfb7a77186" name="Symfony/Component/Form/Extension/Core/Type/CurrencyType.php" role="php" />
   <file md5sum="5d41f93fff961492d2de8bc4d71e7862" name="Symfony/Component/Form/Extension/Core/Type/DateTimeType.php" role="php" />
   <file md5sum="35d0a4afbc155cd3838aebf3a564fb42" name="Symfony/Component/Form/Extension/Core/Type/DateType.php" role="php" />
   <file md5sum="146a7c19ddde4cdca72343da4cfe17d5" name="Symfony/Component/Form/Extension/Core/Type/EmailType.php" role="php" />
   <file md5sum="060ed2ce1bef45de0340a9448c5f04f2" name="Symfony/Component/Form/Extension/Core/Type/FileType.php" role="php" />
   <file md5sum="50f9fbd36e4a7e4b9136be87bf43cb8a" name="Symfony/Component/Form/Extension/Core/Type/FormType.php" role="php" />
   <file md5sum="300baaff3c467b27ddcde08751708dc8" name="Symfony/Component/Form/Extension/Core/Type/HiddenType.php" role="php" />
   <file md5sum="39268ae7dc189edbc1f1ac9cf01bdcb6" name="Symfony/Component/Form/Extension/Core/Type/IntegerType.php" role="php" />
   <file md5sum="d463acc8367ee0afe8417a0aaba019fe" name="Symfony/Component/Form/Extension/Core/Type/LanguageType.php" role="php" />
   <file md5sum="a01e0f05fec87b35b3424829d33d1755" name="Symfony/Component/Form/Extension/Core/Type/LocaleType.php" role="php" />
   <file md5sum="610e8b6a1425b2eb97a0d7c700edf05c" name="Symfony/Component/Form/Extension/Core/Type/MoneyType.php" role="php" />
   <file md5sum="e5cd61198e2bc26e98d427ab26238c29" name="Symfony/Component/Form/Extension/Core/Type/NumberType.php" role="php" />
   <file md5sum="e404fb615ce73dc63a1849d3debb800a" name="Symfony/Component/Form/Extension/Core/Type/PasswordType.php" role="php" />
   <file md5sum="1049fece490815d0886c3ddff2bae892" name="Symfony/Component/Form/Extension/Core/Type/PercentType.php" role="php" />
   <file md5sum="90fba868b14c878176ada892065394bf" name="Symfony/Component/Form/Extension/Core/Type/RadioType.php" role="php" />
   <file md5sum="f87bd813801d2d880e905cdd0ffa57da" name="Symfony/Component/Form/Extension/Core/Type/RepeatedType.php" role="php" />
   <file md5sum="c4df569621c1f85389b7c7cbf789bf63" name="Symfony/Component/Form/Extension/Core/Type/ResetType.php" role="php" />
   <file md5sum="a6b0608cb9f219f8a8c192f64f141335" name="Symfony/Component/Form/Extension/Core/Type/SearchType.php" role="php" />
   <file md5sum="d689ab8ea2da255a67b7d2140af1627b" name="Symfony/Component/Form/Extension/Core/Type/SubmitType.php" role="php" />
   <file md5sum="02627d9175c745247f7e59cf1c2d4562" name="Symfony/Component/Form/Extension/Core/Type/TextareaType.php" role="php" />
   <file md5sum="79f868ef2b8c73154789fcaa591f8467" name="Symfony/Component/Form/Extension/Core/Type/TextType.php" role="php" />
   <file md5sum="993e6cee3429a18fabdc70f0a67c7d57" name="Symfony/Component/Form/Extension/Core/Type/TimeType.php" role="php" />
   <file md5sum="f5607e197c52e096bf060d259aef4079" name="Symfony/Component/Form/Extension/Core/Type/TimezoneType.php" role="php" />
   <file md5sum="38ac4b65d20ba774f1421dfd2acd3193" name="Symfony/Component/Form/Extension/Core/Type/UrlType.php" role="php" />
   <file md5sum="faafdc84e0bfdcd503be96fcb730c4c0" name="Symfony/Component/Form/Extension/Core/View/ChoiceView.php" role="php" />
   <file md5sum="75199e400bebc4583e278a7b24e96833" name="Symfony/Component/Form/Extension/Csrf/CsrfExtension.php" role="php" />
   <file md5sum="3a1592bafaa9d2402bb6806fd1ac3e9d" name="Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderAdapter.php" role="php" />
   <file md5sum="e86115910210dec2676aeb707cb5acf0" name="Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.php" role="php" />
   <file md5sum="db64afcb25c6806ce15828e6ac8c790e" name="Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfTokenManagerAdapter.php" role="php" />
   <file md5sum="a1f980527cf2cec99b44eaa1a09e0d4f" name="Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.php" role="php" />
   <file md5sum="c939632d9abebe20853bc59ce816b457" name="Symfony/Component/Form/Extension/Csrf/CsrfProvider/SessionCsrfProvider.php" role="php" />
   <file md5sum="c17a0b6ad7348188b47da6647b50cc82" name="Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php" role="php" />
   <file md5sum="0de14d86a9825500a9b8a71025542c1b" name="Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php" role="php" />
   <file md5sum="5c5494c1d8bb041b3b938f53a48bb1a1" name="Symfony/Component/Form/Extension/DataCollector/DataCollectorExtension.php" role="php" />
   <file md5sum="1419e5bb5008ecb2d6d757bd7023fda8" name="Symfony/Component/Form/Extension/DataCollector/EventListener/DataCollectorListener.php" role="php" />
   <file md5sum="fdf324521978ceec4f561d76770a08d2" name="Symfony/Component/Form/Extension/DataCollector/FormDataCollector.php" role="php" />
   <file md5sum="8e33ae446484b221f1a8f43b96689a9a" name="Symfony/Component/Form/Extension/DataCollector/FormDataCollectorInterface.php" role="php" />
   <file md5sum="c6dbee88cf57973284f2deb8b7d62266" name="Symfony/Component/Form/Extension/DataCollector/FormDataExtractor.php" role="php" />
   <file md5sum="e0250a5d7bb1e0c5022cc5bead2126dc" name="Symfony/Component/Form/Extension/DataCollector/FormDataExtractorInterface.php" role="php" />
   <file md5sum="1d3278f320b0fc626c80ff21d4e4d798" name="Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php" role="php" />
   <file md5sum="7acc20404d7bc268d80bd71d29b2c0da" name="Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeFactoryDataCollectorProxy.php" role="php" />
   <file md5sum="384aa6433ffc18edb15519d550103ca1" name="Symfony/Component/Form/Extension/DataCollector/Type/DataCollectorTypeExtension.php" role="php" />
   <file md5sum="7284275881ceb92b987717feedba8057" name="Symfony/Component/Form/Extension/DependencyInjection/DependencyInjectionExtension.php" role="php" />
   <file md5sum="6a452e346dc11c0a574bc2fbea9be01c" name="Symfony/Component/Form/Extension/HttpFoundation/EventListener/BindRequestListener.php" role="php" />
   <file md5sum="bd10d86a58c151a1d8d2e072dc379389" name="Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationExtension.php" role="php" />
   <file md5sum="1a1be6feca390ce87d232e08008b4059" name="Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php" role="php" />
   <file md5sum="1cbed6494abb39f8a2731ff28bfc3b4f" name="Symfony/Component/Form/Extension/HttpFoundation/Type/FormTypeHttpFoundationExtension.php" role="php" />
   <file md5sum="c2ab352ab8da8a95d82c561e8d014708" name="Symfony/Component/Form/Extension/Templating/TemplatingExtension.php" role="php" />
   <file md5sum="9b88d4aa06ab3e8e0f4882d2790814fc" name="Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.php" role="php" />
   <file md5sum="0024bfd2c88595778a825805a64dad44" name="Symfony/Component/Form/Extension/Validator/Constraints/Form.php" role="php" />
   <file md5sum="7c71a0cb31da31a0222bdab4b7b926c7" name="Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php" role="php" />
   <file md5sum="26384c9335607d3a7a760ce64268a5d1" name="Symfony/Component/Form/Extension/Validator/EventListener/ValidationListener.php" role="php" />
   <file md5sum="cbb86a1f46d4153ee8b6dcec13f3e3b3" name="Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php" role="php" />
   <file md5sum="df9d49f2923e93c8a989badebd46d72b" name="Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php" role="php" />
   <file md5sum="3ee7f3c2ca05510b1e6f5ea736de843d" name="Symfony/Component/Form/Extension/Validator/Type/RepeatedTypeValidatorExtension.php" role="php" />
   <file md5sum="ec1709e56bdc7ba193f1d204a1645348" name="Symfony/Component/Form/Extension/Validator/Type/SubmitTypeValidatorExtension.php" role="php" />
   <file md5sum="6c0183dc4aa13461ba80a4b13bb6af0c" name="Symfony/Component/Form/Extension/Validator/Util/ServerParams.php" role="php" />
   <file md5sum="29479a50cbaa64713f9746a047bffd00" name="Symfony/Component/Form/Extension/Validator/ValidatorExtension.php" role="php" />
   <file md5sum="7c15728df791933679ae099b2dc013ce" name="Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.php" role="php" />
   <file md5sum="accd5b53d71708b247e3f8c6060b8441" name="Symfony/Component/Form/Extension/Validator/ViolationMapper/MappingRule.php" role="php" />
   <file md5sum="da806398ec8fc4c452e1eadda5c74a68" name="Symfony/Component/Form/Extension/Validator/ViolationMapper/RelativePath.php" role="php" />
   <file md5sum="61357f9417507d405f7fb1fb659b31d2" name="Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php" role="php" />
   <file md5sum="10303cd4370ce781654acabee5f88bab" name="Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapperInterface.php" role="php" />
   <file md5sum="ccc9fe0cfc8d2d1f0daabc141e920038" name="Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPath.php" role="php" />
   <file md5sum="c66988f503a7a69b3332463374596ba3" name="Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPathIterator.php" role="php" />
   <file md5sum="563c1163b71c3c482d91bf4877746632" name="Symfony/Component/Form/Form.php" role="php" />
   <file md5sum="cca285ed5e381d817d56181ec219df0d" name="Symfony/Component/Form/FormBuilder.php" role="php" />
   <file md5sum="9b5471bc4369497cf6ffd6e159a023ec" name="Symfony/Component/Form/FormBuilderInterface.php" role="php" />
   <file md5sum="f478ae74fe1813693e1ba4e969d62410" name="Symfony/Component/Form/FormConfigBuilder.php" role="php" />
   <file md5sum="6a46ac7e9313965ec6b1b95328f346a0" name="Symfony/Component/Form/FormConfigBuilderInterface.php" role="php" />
   <file md5sum="0b0436e232cf7100a1ed02dc299cf7a2" name="Symfony/Component/Form/FormConfigInterface.php" role="php" />
   <file md5sum="d77ce9907675beaf81a3065d1ecfd69c" name="Symfony/Component/Form/FormError.php" role="php" />
   <file md5sum="99268e4eaad4680f7e037cc00b31b370" name="Symfony/Component/Form/FormEvent.php" role="php" />
   <file md5sum="e6d2f1d5c2986877bb25ed96014d3495" name="Symfony/Component/Form/FormEvents.php" role="php" />
   <file md5sum="396ae86cdd76d116832ba1f3b1ac5b73" name="Symfony/Component/Form/FormExtensionInterface.php" role="php" />
   <file md5sum="014013a6a76da3c380b12e79fd5895e5" name="Symfony/Component/Form/FormFactory.php" role="php" />
   <file md5sum="b3f8c61b5ff170f0982a10bfa3f449ad" name="Symfony/Component/Form/FormFactoryBuilder.php" role="php" />
   <file md5sum="1b58cdcfa7fe5eb921b37c73a4cc8ead" name="Symfony/Component/Form/FormFactoryBuilderInterface.php" role="php" />
   <file md5sum="8f8a65e4ffe1ee2ac9165f41ff0defc0" name="Symfony/Component/Form/FormFactoryInterface.php" role="php" />
   <file md5sum="bd326b430aabb6ae67bfdd63ac3a0cff" name="Symfony/Component/Form/FormInterface.php" role="php" />
   <file md5sum="c017bb0aca3d2dc54133014309b994ca" name="Symfony/Component/Form/FormRegistry.php" role="php" />
   <file md5sum="ea9fc8c340f5d63126abf4741716bf0a" name="Symfony/Component/Form/FormRegistryInterface.php" role="php" />
   <file md5sum="eed8b18f01216d190cf317392856361d" name="Symfony/Component/Form/FormRenderer.php" role="php" />
   <file md5sum="4a12fb78c610af0b5f391e272fcb458b" name="Symfony/Component/Form/FormRendererEngineInterface.php" role="php" />
   <file md5sum="514aae640601bd2af792d2f280ad1d19" name="Symfony/Component/Form/FormRendererInterface.php" role="php" />
   <file md5sum="9f253cdb5bd655feaa2ba9387c6cf0ad" name="Symfony/Component/Form/Forms.php" role="php" />
   <file md5sum="76847e41a7fc0945726fd7b00ddd9540" name="Symfony/Component/Form/FormTypeExtensionInterface.php" role="php" />
   <file md5sum="d5097ac9bb6503026cda5c54c7106965" name="Symfony/Component/Form/FormTypeGuesserChain.php" role="php" />
   <file md5sum="0fb144de45b5135b11815452309bc75f" name="Symfony/Component/Form/FormTypeGuesserInterface.php" role="php" />
   <file md5sum="bbab1badee901017917edff90e58f2c1" name="Symfony/Component/Form/FormTypeInterface.php" role="php" />
   <file md5sum="68bdf09c1c46788c5e90ada37f78d540" name="Symfony/Component/Form/FormView.php" role="php" />
   <file md5sum="7003fc846b738bbd923fa5656e22d95b" name="Symfony/Component/Form/Guess/Guess.php" role="php" />
   <file md5sum="0fedff65f9ab6dfc490a9b469192b0a6" name="Symfony/Component/Form/Guess/TypeGuess.php" role="php" />
   <file md5sum="fc080890a68c7a2e9f145556cfa0b6d3" name="Symfony/Component/Form/Guess/ValueGuess.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Form/LICENSE" role="doc" />
   <file md5sum="165b5d30323c31b5a70be0d4ed584fde" name="Symfony/Component/Form/NativeRequestHandler.php" role="php" />
   <file md5sum="66ef84fb360f766ab10567f114268e0f" name="Symfony/Component/Form/phpunit.xml.dist" role="test" />
   <file md5sum="ab4eca434dd1f8ac7df3666e1ed1b7df" name="Symfony/Component/Form/PreloadedExtension.php" role="php" />
   <file md5sum="ebe5a2b970601e8bd9149d2c8dd1d3d1" name="Symfony/Component/Form/README.md" role="doc" />
   <file md5sum="e16c038acbd7b2c01bcb48c7f40e728d" name="Symfony/Component/Form/RequestHandlerInterface.php" role="php" />
   <file md5sum="0a3c5437610d92506335292ad7b6abf9" name="Symfony/Component/Form/ResolvedFormType.php" role="php" />
   <file md5sum="5d25fc04121ed5f6e428165f5936c10f" name="Symfony/Component/Form/ResolvedFormTypeFactory.php" role="php" />
   <file md5sum="fa408445a6fab81659c0cefed09bf3df" name="Symfony/Component/Form/ResolvedFormTypeFactoryInterface.php" role="php" />
   <file md5sum="b8c1edc5a2b254bdde6476893b156950" name="Symfony/Component/Form/ResolvedFormTypeInterface.php" role="php" />
   <file md5sum="256dafb4fae5e462d55a71ab388c0691" name="Symfony/Component/Form/Resources/config/validation.xml" role="php" />
   <file md5sum="e0ad0b923b6ac791b49b9a4d33af7a25" name="Symfony/Component/Form/Resources/translations/validators.ar.xlf" role="php" />
   <file md5sum="1d5e19ca06d1aa8293b5887092685e05" name="Symfony/Component/Form/Resources/translations/validators.bg.xlf" role="php" />
   <file md5sum="c7ad1d90ad05603286ab378d72608d01" name="Symfony/Component/Form/Resources/translations/validators.ca.xlf" role="php" />
   <file md5sum="2b0bed4fc587230bd11e83b7bbe29339" name="Symfony/Component/Form/Resources/translations/validators.cs.xlf" role="php" />
   <file md5sum="e46f7c3da02bcd4fa8c379469310c217" name="Symfony/Component/Form/Resources/translations/validators.da.xlf" role="php" />
   <file md5sum="921a3c43eb6bf008f7d4ae7d2e56233f" name="Symfony/Component/Form/Resources/translations/validators.de.xlf" role="php" />
   <file md5sum="a7470225a9c04a5c2b5f179d8060c38b" name="Symfony/Component/Form/Resources/translations/validators.el.xlf" role="php" />
   <file md5sum="8f7759249199e5589331c432c54c9197" name="Symfony/Component/Form/Resources/translations/validators.en.xlf" role="php" />
   <file md5sum="b086ea186d7babe85d8bfa78957acea4" name="Symfony/Component/Form/Resources/translations/validators.es.xlf" role="php" />
   <file md5sum="f81867f4f9fd2362db42befa9628c103" name="Symfony/Component/Form/Resources/translations/validators.et.xlf" role="php" />
   <file md5sum="0ae3f2a05c0e69cc63ef84384913a4fe" name="Symfony/Component/Form/Resources/translations/validators.eu.xlf" role="php" />
   <file md5sum="321b2f3f5ac56ff0c81871b44fe369bd" name="Symfony/Component/Form/Resources/translations/validators.fa.xlf" role="php" />
   <file md5sum="8cbad436ab4b1d574690992f15e37397" name="Symfony/Component/Form/Resources/translations/validators.fi.xlf" role="php" />
   <file md5sum="8bfa3368c7beefedc897f3098744e5dd" name="Symfony/Component/Form/Resources/translations/validators.fr.xlf" role="php" />
   <file md5sum="b21174a0425a56615ac95065c4cd4f8f" name="Symfony/Component/Form/Resources/translations/validators.gl.xlf" role="php" />
   <file md5sum="f03c3342827959500fe8bca223400225" name="Symfony/Component/Form/Resources/translations/validators.he.xlf" role="php" />
   <file md5sum="3b87096c3cc16d9580d15fe9a9ca4d70" name="Symfony/Component/Form/Resources/translations/validators.hr.xlf" role="php" />
   <file md5sum="c538c1a55b060abb01cc1795a650ff36" name="Symfony/Component/Form/Resources/translations/validators.hu.xlf" role="php" />
   <file md5sum="d7f271b6e610fa47ae614cd9d92f7c02" name="Symfony/Component/Form/Resources/translations/validators.hy.xlf" role="php" />
   <file md5sum="313e2438c2476b78ab637cd9dcd5322d" name="Symfony/Component/Form/Resources/translations/validators.id.xlf" role="php" />
   <file md5sum="3fa13f3254812a6857a99351cf6003d8" name="Symfony/Component/Form/Resources/translations/validators.it.xlf" role="php" />
   <file md5sum="3f47d2db87b7262c21c8287472719479" name="Symfony/Component/Form/Resources/translations/validators.ja.xlf" role="php" />
   <file md5sum="f25583830baaccc529f6b4f0a845bd61" name="Symfony/Component/Form/Resources/translations/validators.lb.xlf" role="php" />
   <file md5sum="4ef7ab23ce55458844742317d905fa59" name="Symfony/Component/Form/Resources/translations/validators.lt.xlf" role="php" />
   <file md5sum="1cc55c8d2fb6eb1583b2d2cdfd54152e" name="Symfony/Component/Form/Resources/translations/validators.lv.xlf" role="php" />
   <file md5sum="4429ebdbb00601c0c67f43a06c4e8031" name="Symfony/Component/Form/Resources/translations/validators.mn.xlf" role="php" />
   <file md5sum="017afa511ee2a18bddbbac0640cdb685" name="Symfony/Component/Form/Resources/translations/validators.nb.xlf" role="php" />
   <file md5sum="94858839db1d8f8324759bf5e87c129d" name="Symfony/Component/Form/Resources/translations/validators.nl.xlf" role="php" />
   <file md5sum="c72a6e8c5c9dc76b0a9ceb275486acb3" name="Symfony/Component/Form/Resources/translations/validators.pl.xlf" role="php" />
   <file md5sum="bfda187791c843558b3bcc5327064e43" name="Symfony/Component/Form/Resources/translations/validators.pt.xlf" role="php" />
   <file md5sum="7cb1b50669945643c707acee4b13cf31" name="Symfony/Component/Form/Resources/translations/validators.pt_BR.xlf" role="php" />
   <file md5sum="f2eaf2e4ba82e742cb6dff54c69f1271" name="Symfony/Component/Form/Resources/translations/validators.ro.xlf" role="php" />
   <file md5sum="6cbccc04ebb3a58158041e451c3bc536" name="Symfony/Component/Form/Resources/translations/validators.ru.xlf" role="php" />
   <file md5sum="d2e6bd911ddff3c7b526755179cf6ed9" name="Symfony/Component/Form/Resources/translations/validators.sk.xlf" role="php" />
   <file md5sum="cc42fc67ec1729fe317cd3b1c3b96dd6" name="Symfony/Component/Form/Resources/translations/validators.sl.xlf" role="php" />
   <file md5sum="20e303068da12f5f5248ace8162051ad" name="Symfony/Component/Form/Resources/translations/validators.sr_Cyrl.xlf" role="php" />
   <file md5sum="bdf4d302afd0b1b1b406009402b44f7d" name="Symfony/Component/Form/Resources/translations/validators.sr_Latn.xlf" role="php" />
   <file md5sum="642c23a8173bfd547a71b69a694195f0" name="Symfony/Component/Form/Resources/translations/validators.sv.xlf" role="php" />
   <file md5sum="6c03831d89108e565c8358f46d807e32" name="Symfony/Component/Form/Resources/translations/validators.uk.xlf" role="php" />
   <file md5sum="96cbd8686b821bd2cf91839a6c26cc03" name="Symfony/Component/Form/Resources/translations/validators.zh_CN.xlf" role="php" />
   <file md5sum="658dff714ce275350a7f720a86484e55" name="Symfony/Component/Form/ReversedTransformer.php" role="php" />
   <file md5sum="3fb340157282afcc9223daeab2aeb49f" name="Symfony/Component/Form/SubmitButton.php" role="php" />
   <file md5sum="09ee4f0e6ffe3b36ab57c806045f69d3" name="Symfony/Component/Form/SubmitButtonBuilder.php" role="php" />
   <file md5sum="721a1bd36d3a0cd93e5c57956435f861" name="Symfony/Component/Form/SubmitButtonTypeInterface.php" role="php" />
   <file md5sum="70d8401563ddaeefe2982c73218d9a41" name="Symfony/Component/Form/Test/DeprecationErrorHandler.php" role="php" />
   <file md5sum="1847328f5ba757c0997121ed38fe9d61" name="Symfony/Component/Form/Test/FormBuilderInterface.php" role="php" />
   <file md5sum="8dc56ae07547e6e8a521cb9d68ff7499" name="Symfony/Component/Form/Test/FormIntegrationTestCase.php" role="php" />
   <file md5sum="ba89cda1179d1dbc7ae395c4f165f458" name="Symfony/Component/Form/Test/FormInterface.php" role="php" />
   <file md5sum="f8d472cfeb2fb094a9fed0a0e31e5900" name="Symfony/Component/Form/Test/FormPerformanceTestCase.php" role="php" />
   <file md5sum="a14b6e8fcfd683fcf7498f9a02da523d" name="Symfony/Component/Form/Test/TypeTestCase.php" role="php" />
   <file md5sum="01e6c9a75c6347c2c215d6a15b0c79d5" name="Symfony/Component/Form/Tests/AbstractDivLayoutTest.php" role="test" />
   <file md5sum="993f833ed9fb277ec6f3a74a773d92ae" name="Symfony/Component/Form/Tests/AbstractExtensionTest.php" role="test" />
   <file md5sum="25108525cdb98b2c542d79ef69a08970" name="Symfony/Component/Form/Tests/AbstractFormTest.php" role="test" />
   <file md5sum="5def14944ef79b573b5bd008ab84ca4b" name="Symfony/Component/Form/Tests/AbstractLayoutTest.php" role="test" />
   <file md5sum="1e1eaca7aca8b88c93cd99d5d934dc12" name="Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php" role="test" />
   <file md5sum="f18c692af6dbc9682b8fbfae88d5909c" name="Symfony/Component/Form/Tests/AbstractTableLayoutTest.php" role="test" />
   <file md5sum="487f6d057728873fdbda43c763ad9a3c" name="Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php" role="test" />
   <file md5sum="3e01bd80c478bfef4e94cce5b05b810f" name="Symfony/Component/Form/Tests/CompoundFormTest.php" role="test" />
   <file md5sum="805f66672b74f69ef369360000ce28d7" name="Symfony/Component/Form/Tests/Extension/Core/ChoiceList/AbstractChoiceListTest.php" role="test" />
   <file md5sum="0eb2d36957cb3f06b8246cf4d62845e6" name="Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ChoiceListTest.php" role="test" />
   <file md5sum="4fe2229f0a5ccdfed66591f926d1408a" name="Symfony/Component/Form/Tests/Extension/Core/ChoiceList/LazyChoiceListTest.php" role="test" />
   <file md5sum="9438557f7e55048a10c0da6dc9b5b7d5" name="Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ObjectChoiceListTest.php" role="test" />
   <file md5sum="c887b01a87b147202efc194dd37f5654" name="Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleChoiceListTest.php" role="test" />
   <file md5sum="de020dd5c1bfe761abc83eb0d407b93b" name="Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleNumericChoiceListTest.php" role="test" />
   <file md5sum="9b3671899963fbd7e534be6a316b9f7f" name="Symfony/Component/Form/Tests/Extension/Core/DataMapper/PropertyPathMapperTest.php" role="test" />
   <file md5sum="fe5c56d887d5e3c625a29d58f19f14b2" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ArrayToPartsTransformerTest.php" role="test" />
   <file md5sum="1f0f17c4989a4bf7e663524addd19377" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BaseDateTimeTransformerTest.php" role="test" />
   <file md5sum="2656ea40e07d5722e5afae535a14c6f2" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BooleanToStringTransformerTest.php" role="test" />
   <file md5sum="f10f920c63a846fee23f895f6519b30c" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoicesToValuesTransformerTest.php" role="test" />
   <file md5sum="81b526febe066ae1212cf792e057a858" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoiceToValueTransformerTest.php" role="test" />
   <file md5sum="d391c39a885af56bbe963d2884ce1581" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DataTransformerChainTest.php" role="test" />
   <file md5sum="2a0a01ad1cc0ede0f9a9610be868290e" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeTestCase.php" role="test" />
   <file md5sum="c333df3e9adfbd0151953a318603b358" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.php" role="test" />
   <file md5sum="cff66917b58654868071c9ee011e36fa" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php" role="test" />
   <file md5sum="ca35365fd4c7e312165063c8754a9545" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.php" role="test" />
   <file md5sum="eccc79ef623e695d17510a7c1537a88d" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.php" role="test" />
   <file md5sum="e5ee536591d17b7bfe89945a498724ec" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToTimestampTransformerTest.php" role="test" />
   <file md5sum="0eac0ca2189eaf93a9fdaa18c2bfce45" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformerTest.php" role="test" />
   <file md5sum="74344e0d818fb775d511fea0ee331e96" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformerTest.php" role="test" />
   <file md5sum="c7f0520009e30903c4b681d8038d1116" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php" role="test" />
   <file md5sum="3f3ac246acda56e18c45ede2ad738de5" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php" role="test" />
   <file md5sum="340da808904f9f817f6bb74c6d1d1bae" name="Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ValueToDuplicatesTransformerTest.php" role="test" />
   <file md5sum="47864719339897429512947960cec29e" name="Symfony/Component/Form/Tests/Extension/Core/EventListener/FixRadioInputListenerTest.php" role="test" />
   <file md5sum="87aec5a94c94ec7a5dd1c0839eb0182b" name="Symfony/Component/Form/Tests/Extension/Core/EventListener/Fixtures/randomhash" role="test" />
   <file md5sum="6cb15bfda3938a694ba12e947582ee1c" name="Symfony/Component/Form/Tests/Extension/Core/EventListener/FixUrlProtocolListenerTest.php" role="test" />
   <file md5sum="e0bc897a2bcb5584079604cd7a932c4a" name="Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayObjectTest.php" role="test" />
   <file md5sum="541c2ff8d9b47ce17ab79a9f5c7da315" name="Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayTest.php" role="test" />
   <file md5sum="3b4d97e836cfe76c4b348b38ef0d3199" name="Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerCustomArrayObjectTest.php" role="test" />
   <file md5sum="6cb07a92e893ccd4ddf1f93592d0ea12" name="Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerTest.php" role="test" />
   <file md5sum="7726c3ab7d9e202ef7e50c6e18a0dc13" name="Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php" role="test" />
   <file md5sum="200a4cdc92f0b266f8b46b971fc5ec82" name="Symfony/Component/Form/Tests/Extension/Core/EventListener/TrimListenerTest.php" role="test" />
   <file md5sum="d6a45bded973053fe2db03fce86a667f" name="Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php" role="test" />
   <file md5sum="040223464ae2179f3aa78e84fd7b8511" name="Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php" role="test" />
   <file md5sum="951887c57ca144e04ba2f2001fb12a5b" name="Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php" role="test" />
   <file md5sum="c435893620ce32c2bee017d4b0cb2157" name="Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypePerformanceTest.php" role="test" />
   <file md5sum="9e18e82da0bbc8f4370d3f652ed8ad48" name="Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php" role="test" />
   <file md5sum="643faa42c8a2cfc19880f78bc9d3bb83" name="Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php" role="test" />
   <file md5sum="196ba14f11fc05ed0a061a909d71b8cd" name="Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php" role="test" />
   <file md5sum="e2b1c1525d0bf4cf02e807689138ec88" name="Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php" role="test" />
   <file md5sum="91b9362007d0d02d7b55852d49a226d2" name="Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php" role="test" />
   <file md5sum="42c8e0bc27d5102ce1b9f7d3807c436c" name="Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php" role="test" />
   <file md5sum="1bad6779778649a56a6df8ba51ac2442" name="Symfony/Component/Form/Tests/Extension/Core/Type/FileTypeTest.php" role="test" />
   <file md5sum="6384962d22490e2965944280e6da8dd3" name="Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php" role="test" />
   <file md5sum="145ac554d44d2416c20efbc33490831b" name="Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php" role="test" />
   <file md5sum="ae9dea4e2cd5149f1469249f0aabe2ac" name="Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php" role="test" />
   <file md5sum="b7946ff970129706743ad613161fd929" name="Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php" role="test" />
   <file md5sum="6bfc500ee59b3c0e85c23e2a4007fc52" name="Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php" role="test" />
   <file md5sum="e680b158e130d104e812bc59a594fa08" name="Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php" role="test" />
   <file md5sum="a683610fb85dd825d4141a4b3f528e46" name="Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php" role="test" />
   <file md5sum="369245a8723921b895a4591ba34005eb" name="Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.php" role="test" />
   <file md5sum="fe429eb590a75d6dd3a20bbf08d1e639" name="Symfony/Component/Form/Tests/Extension/Core/Type/SubmitTypeTest.php" role="test" />
   <file md5sum="1f837469d11ac48ff637e8fa08da7a44" name="Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php" role="test" />
   <file md5sum="1082d1f9f4683702300ce6a8be9c835b" name="Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php" role="test" />
   <file md5sum="e71b97847da4bbd7b694e2a7ea18c7b7" name="Symfony/Component/Form/Tests/Extension/Core/Type/TypeTestCase.php" role="test" />
   <file md5sum="1f33d8fa306ebdbad2cf4561557655ca" name="Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php" role="test" />
   <file md5sum="d5607097da4e8ba843c7671fc95bd5ed" name="Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/DefaultCsrfProviderTest.php" role="test" />
   <file md5sum="b01b266a7196ae1aaaf9b4d3d8f1f2ed" name="Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/SessionCsrfProviderTest.php" role="test" />
   <file md5sum="afcd45b858401261360a30c4cb0f9aba" name="Symfony/Component/Form/Tests/Extension/Csrf/EventListener/CsrfValidationListenerTest.php" role="test" />
   <file md5sum="1ee5764d064d208a058c7719817c5935" name="Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php" role="test" />
   <file md5sum="e69912900a62a5bb4c69d9c37ed2952e" name="Symfony/Component/Form/Tests/Extension/DataCollector/DataCollectorExtensionTest.php" role="test" />
   <file md5sum="deaf70e32c29e96b0a0f5de433b99dea" name="Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php" role="test" />
   <file md5sum="d12c0ee191323d8ad5e0926d2484ec59" name="Symfony/Component/Form/Tests/Extension/DataCollector/FormDataExtractorTest.php" role="test" />
   <file md5sum="d8948496dc0e6214e740ca00ca529e95" name="Symfony/Component/Form/Tests/Extension/DataCollector/Type/DataCollectorTypeExtensionTest.php" role="test" />
   <file md5sum="6e2cdd48baa66831a820c785cf96d440" name="Symfony/Component/Form/Tests/Extension/HttpFoundation/EventListener/BindRequestListenerTest.php" role="test" />
   <file md5sum="b2e0f962d2654c7b7bfabeec6feffe3a" name="Symfony/Component/Form/Tests/Extension/HttpFoundation/HttpFoundationRequestHandlerTest.php" role="test" />
   <file md5sum="b843b76574f23418997cf5d299e1795d" name="Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorPerformanceTest.php" role="test" />
   <file md5sum="3956a614fe00f61b9df4abd22fb94c77" name="Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php" role="test" />
   <file md5sum="159b78c63cad4f5c62977766f6680a69" name="Symfony/Component/Form/Tests/Extension/Validator/EventListener/ValidationListenerTest.php" role="test" />
   <file md5sum="8ca1bca8a4d7d47e6d612d714c3e434d" name="Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php" role="test" />
   <file md5sum="68b380257c232e2600d07153905f0d5f" name="Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php" role="test" />
   <file md5sum="831836b41b079545f0670fe13ce7a212" name="Symfony/Component/Form/Tests/Extension/Validator/Type/SubmitTypeValidatorExtensionTest.php" role="test" />
   <file md5sum="49189d46e88a6d3d850c27b162c6e2ce" name="Symfony/Component/Form/Tests/Extension/Validator/Type/TypeTestCase.php" role="test" />
   <file md5sum="d5cfc3ee82f42b842bc2d5c384142e5e" name="Symfony/Component/Form/Tests/Extension/Validator/Util/ServerParamsTest.php" role="test" />
   <file md5sum="19620e0f5149427d9bc81ff43f3f6849" name="Symfony/Component/Form/Tests/Extension/Validator/ValidatorTypeGuesserTest.php" role="test" />
   <file md5sum="87696746275168d808097b9ac08eefd1" name="Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationMapperTest.php" role="test" />
   <file md5sum="4be55d217fa73d2f0c14537f75635e84" name="Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationPathTest.php" role="test" />
   <file md5sum="aaeeaa8b993916866478b077e0ae5f7b" name="Symfony/Component/Form/Tests/Fixtures/AlternatingRowType.php" role="test" />
   <file md5sum="5c1563a26ab06e4cc72c80d1b4aa75a4" name="Symfony/Component/Form/Tests/Fixtures/Author.php" role="test" />
   <file md5sum="68c706abf40680b1fad0aa7c383af085" name="Symfony/Component/Form/Tests/Fixtures/AuthorType.php" role="test" />
   <file md5sum="80f520948113200553ccb1415f481af3" name="Symfony/Component/Form/Tests/Fixtures/CustomArrayObject.php" role="test" />
   <file md5sum="21ddaf5472929f397a80781c71c5904e" name="Symfony/Component/Form/Tests/Fixtures/FixedDataTransformer.php" role="test" />
   <file md5sum="f2a8c5376aac3794f6ba81a263e4f2bf" name="Symfony/Component/Form/Tests/Fixtures/FixedFilterListener.php" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Form/Tests/Fixtures/foo" role="test" />
   <file md5sum="412bb3f7b15954b7685df57c03cc9216" name="Symfony/Component/Form/Tests/Fixtures/FooSubType.php" role="test" />
   <file md5sum="31c9db4f9cbf24f98688538f63431553" name="Symfony/Component/Form/Tests/Fixtures/FooSubTypeWithParentInstance.php" role="test" />
   <file md5sum="56722f2c6ccf149b5009818e705b661d" name="Symfony/Component/Form/Tests/Fixtures/FooType.php" role="test" />
   <file md5sum="344219ab84242c7d151ff482ebbca70b" name="Symfony/Component/Form/Tests/Fixtures/FooTypeBarExtension.php" role="test" />
   <file md5sum="8178239dc9236054e8df7a4cbf7d7888" name="Symfony/Component/Form/Tests/Fixtures/FooTypeBazExtension.php" role="test" />
   <file md5sum="e23c89ad471d8601a063b068cd6636ee" name="Symfony/Component/Form/Tests/Fixtures/TestExtension.php" role="test" />
   <file md5sum="72d98919f7d17ed12b851b748b795913" name="Symfony/Component/Form/Tests/FormBuilderTest.php" role="test" />
   <file md5sum="0a53ef078ccdaf281872d03975b3f9c5" name="Symfony/Component/Form/Tests/FormConfigTest.php" role="test" />
   <file md5sum="4808f4d1f807a2bd730db77dc250ea3a" name="Symfony/Component/Form/Tests/FormFactoryBuilderTest.php" role="test" />
   <file md5sum="148b1a32ce39b4536ce2cdabca226c8e" name="Symfony/Component/Form/Tests/FormFactoryTest.php" role="test" />
   <file md5sum="cba12233a71fa6ad78db42d0b0358123" name="Symfony/Component/Form/Tests/FormIntegrationTestCase.php" role="test" />
   <file md5sum="e899de2472926b4ada8acb636f1b5444" name="Symfony/Component/Form/Tests/FormPerformanceTestCase.php" role="test" />
   <file md5sum="eeb0092e76c36e50791699eb2faaaa03" name="Symfony/Component/Form/Tests/FormRegistryTest.php" role="test" />
   <file md5sum="1fc848f084ce8f7e10335f8175105886" name="Symfony/Component/Form/Tests/FormRendererTest.php" role="test" />
   <file md5sum="fff8d24dbf03762ed0e2b6f15df45d2d" name="Symfony/Component/Form/Tests/Guess/GuessTest.php" role="test" />
   <file md5sum="1877e570ea6b354cd5d9d9ba30418edb" name="Symfony/Component/Form/Tests/NativeRequestHandlerTest.php" role="test" />
   <file md5sum="5261f73e95c249da67fe334c0927bf1f" name="Symfony/Component/Form/Tests/ResolvedFormTypeTest.php" role="test" />
   <file md5sum="cfd0db6db50796656eb604515e87adda" name="Symfony/Component/Form/Tests/SimpleFormTest.php" role="test" />
   <file md5sum="a7eeabaf53f6a3b60ec3ac2a78ce5002" name="Symfony/Component/Form/Tests/Util/OrderedHashMapTest.php" role="test" />
   <file md5sum="d3566f471dce8351225b74b1c01058b6" name="Symfony/Component/Form/Util/FormUtil.php" role="php" />
   <file md5sum="98034987b9a71a6ec3a3f2fddd95f06a" name="Symfony/Component/Form/Util/InheritDataAwareIterator.php" role="php" />
   <file md5sum="fe22cba7385d2b8406b6a7104b9cf58c" name="Symfony/Component/Form/Util/OrderedHashMap.php" role="php" />
   <file md5sum="6240f5c5d77934285a2dddab60843429" name="Symfony/Component/Form/Util/OrderedHashMapIterator.php" role="php" />
   <file md5sum="da65af10d658064eddfec592c82eb95b" name="Symfony/Component/Form/Util/VirtualFormAwareIterator.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
   <package>
    <name>EventDispatcher</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Validator</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Locale</name>
    <channel>pear.symfony.com</channel>
   </package>
  </required>
  <optional>
   <package>
    <name>HttpFoundation</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\�d+)SS&pear/.pkgxml/Symfony2_Locale-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Locale</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Locale Component</summary>
 <description>Symfony2 Locale Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:48</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="542a733e26cbb9c622157b81f47f1482" name="Symfony/Component/Locale/autoloader.php" role="php" />
   <file md5sum="4c0b87688bb528a3a7ea580c26e45a55" name="Symfony/Component/Locale/CHANGELOG.md" role="doc" />
   <file md5sum="492a08d5a533b5455b0c0f4a5278730a" name="Symfony/Component/Locale/composer.json" role="doc" />
   <file md5sum="c04c627983b2d98473c617463971669a" name="Symfony/Component/Locale/Exception/MethodArgumentNotImplementedException.php" role="php" />
   <file md5sum="37f4cb921e4bf39cffab88ca9c073957" name="Symfony/Component/Locale/Exception/MethodArgumentValueNotImplementedException.php" role="php" />
   <file md5sum="0acb3d816693f31d77fe86ce33e12267" name="Symfony/Component/Locale/Exception/MethodNotImplementedException.php" role="php" />
   <file md5sum="d9b3b933f5665a44fc234a81d8716e57" name="Symfony/Component/Locale/Exception/NotImplementedException.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Locale/LICENSE" role="doc" />
   <file md5sum="c04b169bfa42cc7c6227cec9664e4778" name="Symfony/Component/Locale/Locale.php" role="php" />
   <file md5sum="cb19198a8d7b5f9c20b7e5286dfc5399" name="Symfony/Component/Locale/phpunit.xml.dist" role="test" />
   <file md5sum="53feb3fe807239186f141bdccd2c8a12" name="Symfony/Component/Locale/README.md" role="doc" />
   <file md5sum="65d4e17de2f07c8974d5a1ba1ea8ecb9" name="Symfony/Component/Locale/Stub/DateFormat/AmPmTransformer.php" role="php" />
   <file md5sum="0afa98da9f2d567ba83308042be5d57d" name="Symfony/Component/Locale/Stub/DateFormat/DayOfWeekTransformer.php" role="php" />
   <file md5sum="1556b0af9881cfe4a437c6a6c11877a9" name="Symfony/Component/Locale/Stub/DateFormat/DayOfYearTransformer.php" role="php" />
   <file md5sum="41dd3c3fa8529b6d21084f9cfef7e8f0" name="Symfony/Component/Locale/Stub/DateFormat/DayTransformer.php" role="php" />
   <file md5sum="5df741e714305d31466a93d4ad487c80" name="Symfony/Component/Locale/Stub/DateFormat/FullTransformer.php" role="php" />
   <file md5sum="1434500e2980f6118fe9f038fb154011" name="Symfony/Component/Locale/Stub/DateFormat/Hour1200Transformer.php" role="php" />
   <file md5sum="8de2a07a2c433f79a3d31fb5c2c7ca77" name="Symfony/Component/Locale/Stub/DateFormat/Hour1201Transformer.php" role="php" />
   <file md5sum="f5301ded09e7bb57fed47d3e8655a0f0" name="Symfony/Component/Locale/Stub/DateFormat/Hour2400Transformer.php" role="php" />
   <file md5sum="a115ff0afd31e182e27ce4c5cc3d89e7" name="Symfony/Component/Locale/Stub/DateFormat/Hour2401Transformer.php" role="php" />
   <file md5sum="1021c5207903eb1d01b40dcb3a502a84" name="Symfony/Component/Locale/Stub/DateFormat/HourTransformer.php" role="php" />
   <file md5sum="289e115d57e61733b8dd1b1646d7535d" name="Symfony/Component/Locale/Stub/DateFormat/MinuteTransformer.php" role="php" />
   <file md5sum="ee9f1d1081ade3a43deba9c85376f120" name="Symfony/Component/Locale/Stub/DateFormat/MonthTransformer.php" role="php" />
   <file md5sum="ff38c4bfc0ebc8c6d14e5af40e1eb8ec" name="Symfony/Component/Locale/Stub/DateFormat/QuarterTransformer.php" role="php" />
   <file md5sum="8ea0c30873f9f25be91854267f35f283" name="Symfony/Component/Locale/Stub/DateFormat/SecondTransformer.php" role="php" />
   <file md5sum="38681181a097a88e205d05a25cb26ad6" name="Symfony/Component/Locale/Stub/DateFormat/TimeZoneTransformer.php" role="php" />
   <file md5sum="551a2f8a32c86667a9d9a7e648a1a043" name="Symfony/Component/Locale/Stub/DateFormat/Transformer.php" role="php" />
   <file md5sum="b9b0b8a353f49639e74f12e1ec85ba69" name="Symfony/Component/Locale/Stub/DateFormat/YearTransformer.php" role="php" />
   <file md5sum="ecbf7ee2d715f64e448ac48c0ce1986f" name="Symfony/Component/Locale/Stub/StubCollator.php" role="php" />
   <file md5sum="33399ff7b83a42d5f3a4e1b0cf0db655" name="Symfony/Component/Locale/Stub/StubIntl.php" role="php" />
   <file md5sum="80236bbeab6b375a842ab2e8f399eb1e" name="Symfony/Component/Locale/Stub/StubIntlDateFormatter.php" role="php" />
   <file md5sum="fb93d653fed48a9b3a162af71e9edb2d" name="Symfony/Component/Locale/Stub/StubLocale.php" role="php" />
   <file md5sum="241d35bfb8ac82eea2203af325d08756" name="Symfony/Component/Locale/Stub/StubNumberFormatter.php" role="php" />
   <file md5sum="138590ade23ab1e386034814c8b118d0" name="Symfony/Component/Locale/Tests/LocaleTest.php" role="test" />
   <file md5sum="688a2326a62876a742c3aa76779ba504" name="Symfony/Component/Locale/Tests/Stub/StubLocaleTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\#�r�

%pear/.pkgxml/Pear_Net_SMTP-1.10.0.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.12" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Net_SMTP</name>
 <channel>pear.php.net</channel>
 <summary>An implementation of the SMTP protocol</summary>
 <description>Provides an implementation of the SMTP protocol using PEAR&apos;s Net_Socket class.</description>
 <lead>
  <name>Jon Parise</name>
  <user>jon</user>
  <email>jon@php.net</email>
  <active>yes</active>
 </lead>
 <lead>
  <name>Chuck Hagenbuch</name>
  <user>chagenbu</user>
  <email>chuck@horde.org</email>
  <active>yes</active>
 </lead>
 <date>2021-03-19</date>
 <time>18:39:33</time>
 <version>
  <release>1.10.0</release>
  <api>1.4.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="https://opensource.org/licenses/bsd-license.php">BSD-2-Clause</license>
 <notes>
* Add the starttls() method
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="5ef820d1bc73898b55a153576953fe70" name="examples/basic.php" role="doc" />
   <file baseinstalldir="/" md5sum="0cd9a0c35d1ea17d46de9b5a39fb771d" name="tests/auth.phpt" role="test" />
   <file baseinstalldir="/" md5sum="89135826a107455d336071f3570ccd13" name="tests/basic.phpt" role="test" />
   <file baseinstalldir="/" md5sum="8517c458ae5094ee3c31a545d51c69c8" name="tests/config.php.dist" role="test" />
   <file baseinstalldir="/" md5sum="15c9cb4ef93e0aee232b503e12fc21ee" name="tests/quotedata.phpt" role="test" />
   <file baseinstalldir="/" md5sum="00f931f5dd61430e6057f895decdb6af" name="LICENSE" role="doc" />
   <file baseinstalldir="/" md5sum="9ddd7d9135cfe6e573cd757edf6855f2" name="README.rst" role="doc" />
   <file baseinstalldir="/" md5sum="a157897ae2efc43eabd961597557243a" name="Net/SMTP.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.4.0</min>
   </php>
   <pearinstaller>
    <min>1.10.1</min>
   </pearinstaller>
   <package>
    <name>Net_Socket</name>
    <channel>pear.php.net</channel>
    <min>1.0.7</min>
   </package>
  </required>
  <optional>
   <package>
    <name>Auth_SASL</name>
    <channel>pear.php.net</channel>
    <min>1.0.5</min>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\�n�J/J/.pear/.pkgxml/Symfony2_DoctrineBridge-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>DoctrineBridge</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Doctrine Bridge</summary>
 <description>Symfony2 Doctrine Bridge</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:40</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="1146b84b00fda99b2d6838fa9a092b09" name="Symfony/Bridge/Doctrine/autoloader.php" role="php" />
   <file md5sum="a6c5324a02c7431af568fb0ddf4d701f" name="Symfony/Bridge/Doctrine/CacheWarmer/ProxyCacheWarmer.php" role="php" />
   <file md5sum="6288b2050507fae3fbcf270b26daecff" name="Symfony/Bridge/Doctrine/CHANGELOG.md" role="doc" />
   <file md5sum="7da86c460e3e1814e41daa76393cfb95" name="Symfony/Bridge/Doctrine/composer.json" role="doc" />
   <file md5sum="54fd5d577b9f49258d19b109ad98ea08" name="Symfony/Bridge/Doctrine/ContainerAwareEventManager.php" role="php" />
   <file md5sum="e725f92a17d0dee93e1522be12eb1367" name="Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php" role="php" />
   <file md5sum="0d5327cdcc6a003bb2dd541c1b4951be" name="Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php" role="php" />
   <file md5sum="d88b54e05093c8cc6fcc688bf43e2495" name="Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php" role="php" />
   <file md5sum="5159d0f708ad9a1b244b725d5c5c252d" name="Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.php" role="php" />
   <file md5sum="bc6c6ff5e47d6bc1ead4eb2454142819" name="Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php" role="php" />
   <file md5sum="6407dfb228cb9e74521f045de4567c0b" name="Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.php" role="php" />
   <file md5sum="62012802efbda5aae97d5b17e36c7ac3" name="Symfony/Bridge/Doctrine/DependencyInjection/Security/UserProvider/EntityFactory.php" role="php" />
   <file md5sum="36edb41f784aa345f1a6b6aee0177512" name="Symfony/Bridge/Doctrine/ExpressionLanguage/DoctrineParserCache.php" role="php" />
   <file md5sum="8f34ce5da6bd523b2e2c183b9d311454" name="Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php" role="php" />
   <file md5sum="d5f011953d39f7682b2d1bd38bfc103f" name="Symfony/Bridge/Doctrine/Form/ChoiceList/EntityLoaderInterface.php" role="php" />
   <file md5sum="f458540aedd232db5a808163e8953c3e" name="Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php" role="php" />
   <file md5sum="a6abbc1e07395be54a0cc9bcc7e8a021" name="Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php" role="php" />
   <file md5sum="0394473ded0681f92cfd74d66810cf46" name="Symfony/Bridge/Doctrine/Form/DoctrineOrmExtension.php" role="php" />
   <file md5sum="70635596be0740792c9b01fc717a07c6" name="Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php" role="php" />
   <file md5sum="922055b81eb74eab130af3678e23d728" name="Symfony/Bridge/Doctrine/Form/EventListener/MergeDoctrineCollectionListener.php" role="php" />
   <file md5sum="422792a0aec2cfaf54e7aed842e41a1b" name="Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php" role="php" />
   <file md5sum="4027caad2522bb92ecb104212e740bbb" name="Symfony/Bridge/Doctrine/Form/Type/EntityType.php" role="php" />
   <file md5sum="c3a63e53318e44d71e48d38e72e6368f" name="Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandler.php" role="php" />
   <file md5sum="5c638ddb71981e9ee7de51ad672f04be" name="Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandlerSchema.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Bridge/Doctrine/LICENSE" role="doc" />
   <file md5sum="a264db6fc25f6bbbf6f7f6866ab775b8" name="Symfony/Bridge/Doctrine/Logger/DbalLogger.php" role="php" />
   <file md5sum="9aba8e500e2eb6c85e0c5142b3ab01dc" name="Symfony/Bridge/Doctrine/ManagerRegistry.php" role="php" />
   <file md5sum="028b26c34311c37ce5a78efcb95cd3a1" name="Symfony/Bridge/Doctrine/phpunit.xml.dist" role="test" />
   <file md5sum="0dfbf896145a1d79d4536a6457375891" name="Symfony/Bridge/Doctrine/README.md" role="doc" />
   <file md5sum="97de5e0e6b0a5567a4d05c49145f007b" name="Symfony/Bridge/Doctrine/RegistryInterface.php" role="php" />
   <file md5sum="58d4be45f6a67d0120082b9909fb7470" name="Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php" role="php" />
   <file md5sum="cd4fb5647f556391d48bf4417639bebc" name="Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php" role="php" />
   <file md5sum="cd11805976770714b196a683096710fa" name="Symfony/Bridge/Doctrine/Test/DoctrineTestHelper.php" role="php" />
   <file name="Symfony/Bridge/Doctrine/Tests/bootstrap.php" role="test" />
   <file md5sum="63a9dd7b5978e2e653914cee374dd6f0" name="Symfony/Bridge/Doctrine/Tests/ContainerAwareEventManagerTest.php" role="test" />
   <file md5sum="22af804224173c290f9ea48275ea6265" name="Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorTest.php" role="test" />
   <file md5sum="317c03bfcf9de63ddb87b75b5219b0e1" name="Symfony/Bridge/Doctrine/Tests/DataFixtures/ContainerAwareLoaderTest.php" role="test" />
   <file md5sum="6b953b8a87ad83b1fa9ca6c5b44b28e5" name="Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php" role="test" />
   <file md5sum="cbab10b2d43dd63dc2b6c4afd2e3ba50" name="Symfony/Bridge/Doctrine/Tests/DoctrineOrmTestCase.php" role="test" />
   <file md5sum="91879a9d73006a12ffc8c62d83ac857c" name="Symfony/Bridge/Doctrine/Tests/ExpressionLanguage/DoctrineParserCacheTest.php" role="test" />
   <file md5sum="237107a72edb5333186c85275ac35e1c" name="Symfony/Bridge/Doctrine/Tests/Fixtures/AssociationEntity.php" role="test" />
   <file md5sum="d4361cc34fb44804debe2ec8e0e832f8" name="Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeIntIdEntity.php" role="test" />
   <file md5sum="73b3184c3b0a6bfc68db74c507f1ff7c" name="Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeStringIdEntity.php" role="test" />
   <file md5sum="b8db7e5383a0e848cc8f60964d12d350" name="Symfony/Bridge/Doctrine/Tests/Fixtures/ContainerAwareFixture.php" role="test" />
   <file md5sum="e4cd9ce9c40b8e76edb083fc526bcd44" name="Symfony/Bridge/Doctrine/Tests/Fixtures/DoubleNameEntity.php" role="test" />
   <file md5sum="2325d0c65a178f8bfddcf0a76e53cb00" name="Symfony/Bridge/Doctrine/Tests/Fixtures/GroupableEntity.php" role="test" />
   <file md5sum="01edea44eacb41bdeb553b9445bd2b53" name="Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntity.php" role="test" />
   <file md5sum="c13f44c8fccf2a768c1dfe09cdcf644c" name="Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdNoToStringEntity.php" role="test" />
   <file md5sum="f3044b3a9be916f4b6433cd993933d4b" name="Symfony/Bridge/Doctrine/Tests/Fixtures/SingleStringIdEntity.php" role="test" />
   <file md5sum="27921595ac59f8d35f99ea9b8a80474c" name="Symfony/Bridge/Doctrine/Tests/Fixtures/User.php" role="test" />
   <file md5sum="62be3ca48dad09bc19de00a6133ae33c" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListCompositeIdTest.php" role="test" />
   <file md5sum="c53d2568937b7272b41253c169f1b990" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleIntIdTest.php" role="test" />
   <file md5sum="696f31cf938c23921a506d3dc5b1bd3f" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleStringIdTest.php" role="test" />
   <file md5sum="e3002da166df138152291131d2563147" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListTest.php" role="test" />
   <file md5sum="ed38d6eebc677c1e49f92360dc968726" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/GenericEntityChoiceListTest.php" role="test" />
   <file md5sum="53cb635842c3610fc376aa099a878cbb" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListCompositeIdTest.php" role="test" />
   <file md5sum="2e6faf750e515b875b39ef0f003d8b3d" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleIntIdTest.php" role="test" />
   <file md5sum="c8e9e517d8c3f0df5f28f2fb135164e9" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleStringIdTest.php" role="test" />
   <file md5sum="3f0f7533860351145dbb49b781cd9af9" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/ORMQueryBuilderLoaderTest.php" role="test" />
   <file md5sum="978f11f0d52668cdf4c0f9777bfb8b72" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdTest.php" role="test" />
   <file md5sum="300a5b1f88f5435bd0d2fef5d292a66f" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdWithQueryBuilderTest.php" role="test" />
   <file md5sum="484e207192fd43eb7badfc0f226df4fb" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdTest.php" role="test" />
   <file md5sum="657d384a368a05153a8d73dbf60da002" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdWithQueryBuilderTest.php" role="test" />
   <file md5sum="315093405e4abafe143eb918ee7789cf" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdTest.php" role="test" />
   <file md5sum="fbff3030e3294a22d224256064aaec4f" name="Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdWithQueryBuilderTest.php" role="test" />
   <file md5sum="ba4a60892ec0398da11b48b522615034" name="Symfony/Bridge/Doctrine/Tests/Form/DataTransformer/CollectionToArrayTransformerTest.php" role="test" />
   <file md5sum="4748628e6ff78737995c71507068c5f7" name="Symfony/Bridge/Doctrine/Tests/Form/DoctrineOrmTypeGuesserTest.php" role="test" />
   <file md5sum="5be318cfed40c93338f512e25f69da67" name="Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypePerformanceTest.php" role="test" />
   <file md5sum="b801ad3cbcc65d3883d8258894a5d326" name="Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php" role="test" />
   <file md5sum="98f90ab5043368eb3d7848ef09fccb80" name="Symfony/Bridge/Doctrine/Tests/HttpFoundation/DbalSessionHandlerTest.php" role="test" />
   <file md5sum="2feb485f27b025ee74707d55945fed91" name="Symfony/Bridge/Doctrine/Tests/Logger/DbalLoggerTest.php" role="test" />
   <file md5sum="56abcb81046969cf32a1c8b690790640" name="Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php" role="test" />
   <file md5sum="c1fd3987c9391a54ac76430fff7db778" name="Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueValidatorTest.php" role="test" />
   <file md5sum="4403085a6acb5b72d6876c25374a01ee" name="Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.php" role="php" />
   <file md5sum="28ee255baf4b1e3a6d539f7e598ac2ca" name="Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php" role="php" />
   <file md5sum="c432d786fb2e4848b42aad6b61ff9fac" name="Symfony/Bridge/Doctrine/Validator/DoctrineInitializer.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
  <optional>
   <package>
    <name>Validator</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Form</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\�1��ss3pear/.pkgxml/Symfony2_DependencyInjection-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>DependencyInjection</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 DependencyInjection Component</summary>
 <description>Symfony2 DependencyInjection Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:43</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="8083d8117acb0fe0ea5dcd87cf7ffef7" name="Symfony/Component/DependencyInjection/Alias.php" role="php" />
   <file md5sum="7879012b46b3b27b8d8414b844ca3537" name="Symfony/Component/DependencyInjection/autoloader.php" role="php" />
   <file md5sum="514e07efd3462ee25be372a3d60bbd80" name="Symfony/Component/DependencyInjection/CHANGELOG.md" role="doc" />
   <file md5sum="675a6bc1d3c3f3b2783f885f0521178b" name="Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.php" role="php" />
   <file md5sum="6091faa40727a56f10ba2146abf615e1" name="Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php" role="php" />
   <file md5sum="2b373903ccf9d566a6927aed6c3c6650" name="Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php" role="php" />
   <file md5sum="69b6713e0ee778e9b2cad497a9082151" name="Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php" role="php" />
   <file md5sum="7b1410dc03224741083a4d762836a91b" name="Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.php" role="php" />
   <file md5sum="14bcd46172f5ac3e022e1d8f4fe1b08c" name="Symfony/Component/DependencyInjection/Compiler/Compiler.php" role="php" />
   <file md5sum="1292a88c9fadf67d117a659fb0bfd499" name="Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface.php" role="php" />
   <file md5sum="ec4dc3e58fc8046e43c0874a99ea29e6" name="Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php" role="php" />
   <file md5sum="d18aa0d044d4725eaacd006c55b8e366" name="Symfony/Component/DependencyInjection/Compiler/LoggingFormatter.php" role="php" />
   <file md5sum="5015cca96bf517b4780e5acfbcce2142" name="Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php" role="php" />
   <file md5sum="8517ede71e527623a58dc3bca253c687" name="Symfony/Component/DependencyInjection/Compiler/PassConfig.php" role="php" />
   <file md5sum="270937e454d381dae233d817e52069ec" name="Symfony/Component/DependencyInjection/Compiler/RemoveAbstractDefinitionsPass.php" role="php" />
   <file md5sum="77d93353f41f2505251e003a33993f31" name="Symfony/Component/DependencyInjection/Compiler/RemovePrivateAliasesPass.php" role="php" />
   <file md5sum="82421fc37d82eeb210772fc9b5cc407d" name="Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.php" role="php" />
   <file md5sum="bee7b2336c610435c89fdc854101b604" name="Symfony/Component/DependencyInjection/Compiler/RepeatablePassInterface.php" role="php" />
   <file md5sum="f9167d35e36bf31d5aac396564f27bbb" name="Symfony/Component/DependencyInjection/Compiler/RepeatedPass.php" role="php" />
   <file md5sum="0ece3d877daaabc8be38509d97752e2c" name="Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php" role="php" />
   <file md5sum="5e11621457d51880c84844518e300306" name="Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.php" role="php" />
   <file md5sum="15580e12e088ce2dc2fc89936e27bdc0" name="Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.php" role="php" />
   <file md5sum="f33dfb27625ccb59d575de3fd0e3862f" name="Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.php" role="php" />
   <file md5sum="69e660af3582cdacbfa328e0280a5740" name="Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php" role="php" />
   <file md5sum="965e8e3c37eea82b6eb961df50d9014d" name="Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.php" role="php" />
   <file md5sum="0e3f4ba1f08962ec73803a78f7a8c3f2" name="Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphEdge.php" role="php" />
   <file md5sum="3ce32fc9229295bec473e33ce95cfe4d" name="Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.php" role="php" />
   <file md5sum="5ed58de81d8eb7d0d3d316ee27368e11" name="Symfony/Component/DependencyInjection/composer.json" role="doc" />
   <file md5sum="d87452c514f1fd3daa1d76050329e0cc" name="Symfony/Component/DependencyInjection/Container.php" role="php" />
   <file md5sum="4318c2ce4d160e6d183edce4928db696" name="Symfony/Component/DependencyInjection/ContainerAware.php" role="php" />
   <file md5sum="b4bbd2a21e9afe2cd25d26c37c54bfa9" name="Symfony/Component/DependencyInjection/ContainerAwareInterface.php" role="php" />
   <file md5sum="304f3c4322c235b332992d829d68e50b" name="Symfony/Component/DependencyInjection/ContainerAwareTrait.php" role="php" />
   <file md5sum="6599366a3251af3d99243b49316fb9fe" name="Symfony/Component/DependencyInjection/ContainerBuilder.php" role="php" />
   <file md5sum="2531b72281ed8336ff1afbb7ada89bb8" name="Symfony/Component/DependencyInjection/ContainerInterface.php" role="php" />
   <file md5sum="047285baeb298041af1ae447da6e55b3" name="Symfony/Component/DependencyInjection/Definition.php" role="php" />
   <file md5sum="cf838655798392939269b928daeb17f3" name="Symfony/Component/DependencyInjection/DefinitionDecorator.php" role="php" />
   <file md5sum="3b295c276bb774433a45f1ee0339a299" name="Symfony/Component/DependencyInjection/Dumper/Dumper.php" role="php" />
   <file md5sum="b9dd1589f9ffac4366fd4148d9e78ade" name="Symfony/Component/DependencyInjection/Dumper/DumperInterface.php" role="php" />
   <file md5sum="688f77795fc125e75645706bf19ec8cf" name="Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php" role="php" />
   <file md5sum="bd310f7ab99d2c941dff3b3b402a1fd7" name="Symfony/Component/DependencyInjection/Dumper/PhpDumper.php" role="php" />
   <file md5sum="abe8dcd883cb0c698d7e91f2c600f45c" name="Symfony/Component/DependencyInjection/Dumper/XmlDumper.php" role="php" />
   <file md5sum="409f8a23d69eaa1272fd7cbb75d23026" name="Symfony/Component/DependencyInjection/Dumper/YamlDumper.php" role="php" />
   <file md5sum="7881aa76d06f7b9e4bd45dc85ae0d52e" name="Symfony/Component/DependencyInjection/Exception/BadMethodCallException.php" role="php" />
   <file md5sum="d79633abb224cffc0597be170aca74ea" name="Symfony/Component/DependencyInjection/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="9022cb0f19ecaf1198318f0c178c5264" name="Symfony/Component/DependencyInjection/Exception/InactiveScopeException.php" role="php" />
   <file md5sum="f1b09121e6850f5271d8bd3a6837efd3" name="Symfony/Component/DependencyInjection/Exception/InvalidArgumentException.php" role="php" />
   <file md5sum="5b78b4f59982df23deaf0242aec3d4a9" name="Symfony/Component/DependencyInjection/Exception/LogicException.php" role="php" />
   <file md5sum="792b235a45e9f4c0c7a7280580b1a2a3" name="Symfony/Component/DependencyInjection/Exception/OutOfBoundsException.php" role="php" />
   <file md5sum="7b059f59730003361cceadd8965ad7c5" name="Symfony/Component/DependencyInjection/Exception/ParameterCircularReferenceException.php" role="php" />
   <file md5sum="6d83c2934f82a5ef7992b7081eaeffd7" name="Symfony/Component/DependencyInjection/Exception/ParameterNotFoundException.php" role="php" />
   <file md5sum="4e4d9c135fec917ae3fa78f25fbd7f85" name="Symfony/Component/DependencyInjection/Exception/RuntimeException.php" role="php" />
   <file md5sum="0d73336fcf6534c59887f8b5687d1bd6" name="Symfony/Component/DependencyInjection/Exception/ScopeCrossingInjectionException.php" role="php" />
   <file md5sum="719ca3a89890fcb941cca1b16a0fafef" name="Symfony/Component/DependencyInjection/Exception/ScopeWideningInjectionException.php" role="php" />
   <file md5sum="8ac40af4863b3c6cd9311cc1a29cf802" name="Symfony/Component/DependencyInjection/Exception/ServiceCircularReferenceException.php" role="php" />
   <file md5sum="9785d054cb75a079dcecc97fc77a8ebb" name="Symfony/Component/DependencyInjection/Exception/ServiceNotFoundException.php" role="php" />
   <file md5sum="3eebc81d79682bdbfe5ce43980d2ab92" name="Symfony/Component/DependencyInjection/ExpressionLanguage.php" role="php" />
   <file md5sum="819fae3f0bfd1d3ba7dd2a4fc29f89e8" name="Symfony/Component/DependencyInjection/Extension/ConfigurationExtensionInterface.php" role="php" />
   <file md5sum="80cf4c6b7246bd342cf87699c23d0114" name="Symfony/Component/DependencyInjection/Extension/Extension.php" role="php" />
   <file md5sum="d9f5df364b37addf087305ce17842de9" name="Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php" role="php" />
   <file md5sum="0eea6361b5960d4ff58646b75864898f" name="Symfony/Component/DependencyInjection/Extension/PrependExtensionInterface.php" role="php" />
   <file md5sum="78118376c3e263f9eb58313ee1bb6f5a" name="Symfony/Component/DependencyInjection/IntrospectableContainerInterface.php" role="php" />
   <file md5sum="2195bb770e5851fa1ebd680906ae112b" name="Symfony/Component/DependencyInjection/LazyProxy/Instantiator/InstantiatorInterface.php" role="php" />
   <file md5sum="bf8b05c0ab1b67dda36944d6a5d0d653" name="Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.php" role="php" />
   <file md5sum="0ff96280df12f153aee121649615763f" name="Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/DumperInterface.php" role="php" />
   <file md5sum="8857647188554714f60a97a1a5f54fa0" name="Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/DependencyInjection/LICENSE" role="doc" />
   <file md5sum="262400ebaa94fc67c3cf2c89015cc395" name="Symfony/Component/DependencyInjection/Loader/ClosureLoader.php" role="php" />
   <file md5sum="378be59c411306f23d8adb22fcaedad6" name="Symfony/Component/DependencyInjection/Loader/FileLoader.php" role="php" />
   <file md5sum="682de96cf34a4ac9f93d1e5c9d2cb153" name="Symfony/Component/DependencyInjection/Loader/IniFileLoader.php" role="php" />
   <file md5sum="ce3bf3b148cb1be2d7e30a5c589f9af9" name="Symfony/Component/DependencyInjection/Loader/PhpFileLoader.php" role="php" />
   <file md5sum="32beacc60968ee62e94f66672e3a7ec2" name="Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd" role="php" />
   <file md5sum="ed4c6f9c796d3986362a7a67dac9bc47" name="Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php" role="php" />
   <file md5sum="5df455b7334b17e89c9e094cf5978291" name="Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php" role="php" />
   <file md5sum="7b2faf5e73ce778720b67e94cf6d2bba" name="Symfony/Component/DependencyInjection/Parameter.php" role="php" />
   <file md5sum="c975b424d378e0060f13f23f218768d5" name="Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.php" role="php" />
   <file md5sum="ce95aa07d7fe9d8e35dd1cf0af3b508e" name="Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php" role="php" />
   <file md5sum="a1d6864e44ce2807160e6ccbd8e2d730" name="Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php" role="php" />
   <file md5sum="e9b92b932a912fe805d01f4fa1d196d7" name="Symfony/Component/DependencyInjection/phpunit.xml.dist" role="test" />
   <file md5sum="1b27a3a51d5eeea9a6ee9fb5aed79c1f" name="Symfony/Component/DependencyInjection/README.md" role="doc" />
   <file md5sum="a472c7a6d20af6710b87a299b9fdb855" name="Symfony/Component/DependencyInjection/Reference.php" role="php" />
   <file md5sum="d464293058a891542cef77f9e14e18b4" name="Symfony/Component/DependencyInjection/Scope.php" role="php" />
   <file md5sum="b990c20640f9a64135bcf0369f4e22a6" name="Symfony/Component/DependencyInjection/ScopeInterface.php" role="php" />
   <file md5sum="66c75a60290a0461dc4e28feed7952dc" name="Symfony/Component/DependencyInjection/SimpleXMLElement.php" role="php" />
   <file md5sum="3c47bde46b89617dcd69f4ebf5056865" name="Symfony/Component/DependencyInjection/TaggedContainerInterface.php" role="php" />
   <file md5sum="d54cef7b3cb33ee1e7042d26c584f7fe" name="Symfony/Component/DependencyInjection/Tests/Compiler/AnalyzeServiceReferencesPassTest.php" role="test" />
   <file md5sum="1a6f4aa36bb6dca84bcec6c5b3a4aa1f" name="Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php" role="test" />
   <file md5sum="637d842f3a08a0f1bce0921ba641c049" name="Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php" role="test" />
   <file md5sum="8cecafcb0696950082f24bdc0ed79beb" name="Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php" role="test" />
   <file md5sum="150d6c72e7fa4958c3750097d6985874" name="Symfony/Component/DependencyInjection/Tests/Compiler/CheckReferenceValidityPassTest.php" role="test" />
   <file md5sum="d38af5ce9bbb76b8b8e8ff4881347669" name="Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.php" role="test" />
   <file md5sum="6495d73686ede93887cf537f6e9ec0e9" name="Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php" role="test" />
   <file md5sum="69e56c8a628567929f063b36ab9a2e84" name="Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.php" role="test" />
   <file md5sum="d8a0328438ce5162a8b8585be178673d" name="Symfony/Component/DependencyInjection/Tests/Compiler/ReplaceAliasByActualDefinitionPassTest.php" role="test" />
   <file md5sum="7547b1b316c37533be6820e12815f3cf" name="Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.php" role="test" />
   <file md5sum="2c41afba4dc70fc0f903ebe52befd642" name="Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.php" role="test" />
   <file md5sum="13b4ec5501d3cba658a6973dcffa9799" name="Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.php" role="test" />
   <file md5sum="aa9b5e5dc4e83673b333455f0d863130" name="Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php" role="test" />
   <file md5sum="e2ff857908d1e4161ea4c3dd8993c9a2" name="Symfony/Component/DependencyInjection/Tests/ContainerTest.php" role="test" />
   <file md5sum="ea1ce9dbce7920ea2631ffbfbead7658" name="Symfony/Component/DependencyInjection/Tests/CrossCheckTest.php" role="test" />
   <file md5sum="e5b34b5cef82e20befe6943b167b3dce" name="Symfony/Component/DependencyInjection/Tests/DefinitionDecoratorTest.php" role="test" />
   <file md5sum="dbee36c02395ef4885ca72420bf98503" name="Symfony/Component/DependencyInjection/Tests/DefinitionTest.php" role="test" />
   <file md5sum="5518fa88c922a8c873133651e233386b" name="Symfony/Component/DependencyInjection/Tests/Dumper/GraphvizDumperTest.php" role="test" />
   <file md5sum="03e6215b1c0abc0fa0a11642e4786649" name="Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php" role="test" />
   <file md5sum="af6f3ad2f9b929dcbac53b8a48f122f3" name="Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php" role="test" />
   <file md5sum="d6ae9074c31ddfb3794ff731d60b20bb" name="Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php" role="test" />
   <file md5sum="939faedda209b4d87552d4fe7cd7ca24" name="Symfony/Component/DependencyInjection/Tests/Extension/ExtensionTest.php" role="test" />
   <file md5sum="6422feace05a5ed96c42ed848d10006c" name="Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container10.php" role="test" />
   <file md5sum="1ff966b209cd577bd0d6bb36d7e649e4" name="Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container11.php" role="test" />
   <file md5sum="1acdceda33fce9015eff3bf7d156135b" name="Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container12.php" role="test" />
   <file md5sum="00b3703e57b5c9586ec0e398ea7a20b2" name="Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container13.php" role="test" />
   <file md5sum="b21b1c14c129dd16d9414a26aa263c45" name="Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container14.php" role="test" />
   <file md5sum="4bf1be8db545cde3ba7d0e6f6297308d" name="Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php" role="test" />
   <file md5sum="098b361885203b2d00989fce70938512" name="Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.php" role="test" />
   <file md5sum="f06eb418f0f04a719312f0e4ca232e9d" name="Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces1.php" role="test" />
   <file md5sum="a0ccfd20143be600667c0e98fb665071" name="Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces2.php" role="test" />
   <file md5sum="02cffa6095e3a31d691a5bdcdbe7c227" name="Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services1.dot" role="test" />
   <file md5sum="5bf12610e2c2a95c5506a1b92ee929f6" name="Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10-1.dot" role="test" />
   <file md5sum="5eda7f5d745f7686812c80927819c499" name="Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10.dot" role="test" />
   <file md5sum="8f1d93f127c665d4f17b81c9cadc1e90" name="Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dot" role="test" />
   <file md5sum="a7b7d8d68fc8e2f58dfd94d5de28604c" name="Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services14.dot" role="test" />
   <file md5sum="17882b73c2f05f5bed8a8761f693ee75" name="Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dot" role="test" />
   <file md5sum="6c18955e7fff0a445ccd323169edfa39" name="Symfony/Component/DependencyInjection/Tests/Fixtures/includes/classes.php" role="test" />
   <file md5sum="658357428dc406d5f951a31a951a468b" name="Symfony/Component/DependencyInjection/Tests/Fixtures/includes/createphar.php" role="test" />
   <file md5sum="f38316643924184c25c2d323eb2115c8" name="Symfony/Component/DependencyInjection/Tests/Fixtures/includes/foo.php" role="test" />
   <file md5sum="d378aa4475659bdd4d5d1d1a7898a5d8" name="Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.php" role="test" />
   <file md5sum="2533e30245d301e424eb76b539244446" name="Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtension.php" role="test" />
   <file md5sum="b4a17c6724b7c820a73579d094cdd932" name="Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtensionInPhar.phar" role="test" />
   <file md5sum="cd16e7c41fc369846a5eb4a42d1e5b93" name="Symfony/Component/DependencyInjection/Tests/Fixtures/includes/schema/project-1.0.xsd" role="test" />
   <file md5sum="547a11b176c7c7905611acd1582252d6" name="Symfony/Component/DependencyInjection/Tests/Fixtures/ini/nonvalid.ini" role="test" />
   <file md5sum="4a8f0aad32fe89d804cb85703f0e2965" name="Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters.ini" role="test" />
   <file md5sum="cc1e7671d8c8e219998593b0069ac474" name="Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters1.ini" role="test" />
   <file md5sum="e2432dcd44bad3082cff4aabce9d2f33" name="Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters2.ini" role="test" />
   <file md5sum="efe219ab816512283367c226a1656ee4" name="Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.php" role="test" />
   <file md5sum="99506344d5fcc588c963e91e473a06d1" name="Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1.php" role="test" />
   <file md5sum="9b7bf72ef23353c753f51bf557706ef4" name="Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.php" role="test" />
   <file md5sum="11e72fc308dfdadaedc9544c8756769b" name="Symfony/Component/DependencyInjection/Tests/Fixtures/php/services11.php" role="test" />
   <file md5sum="44b0afab75892ad4556743db23d1e629" name="Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php" role="test" />
   <file md5sum="80b20e5ead9c8ff04678100303294161" name="Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php" role="test" />
   <file md5sum="b8e9a27269a37e19f37566f39801b484" name="Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php" role="test" />
   <file md5sum="0a223fc28b123a00eeae0ce7825953eb" name="Symfony/Component/DependencyInjection/Tests/Fixtures/php/simple.php" role="test" />
   <file md5sum="d741c7a31311ead4df2057e523afeba3" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension1/services.xml" role="test" />
   <file md5sum="f932ffc98518b016fc6383139b711c96" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension2/services.xml" role="test" />
   <file md5sum="d144314f085c31ccb0a41f802f306649" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services1.xml" role="test" />
   <file md5sum="8a597cf4214e62043465a1d135cbf428" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services2.xml" role="test" />
   <file md5sum="2a00696fd70991a11a2aa0e1e5d61e75" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services3.xml" role="test" />
   <file md5sum="340f21074d0ff685079b5fc0b80dacdf" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services4.xml" role="test" />
   <file md5sum="7dade70bc8de90a4c116d01df8744179" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services5.xml" role="test" />
   <file md5sum="873eec7bf6988585b8be9ed78d32d4f0" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services6.xml" role="test" />
   <file md5sum="834d96fb17d411d3c25df34a8e12339c" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services7.xml" role="test" />
   <file md5sum="e1fb95406c0ff63742800fdc95eb99f6" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/nonvalid.xml" role="test" />
   <file md5sum="d7c935e1400a979267225dfbe9519a9e" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services1.xml" role="test" />
   <file md5sum="525da15fe7d63e3e0f8ae78a96929107" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services10.xml" role="test" />
   <file md5sum="0bed9c78fc2a7b638d81d6e948474ed9" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services13.xml" role="test" />
   <file md5sum="af73c797e9dabde154c0460a294ab77d" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services2.xml" role="test" />
   <file md5sum="5b8fbad821d7f9b92a37c6ec30fbb8a9" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services3.xml" role="test" />
   <file md5sum="5b6edb71e890234adad9ebb17e88fb6f" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4.xml" role="test" />
   <file md5sum="53040074af5e742e3e7bc6a820f0b17d" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4_bad_import.xml" role="test" />
   <file md5sum="6f50270290cb9bafc719886743286773" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services5.xml" role="test" />
   <file md5sum="15f37e20652d85a361cccc6a6f9322ac" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services6.xml" role="test" />
   <file md5sum="3f0cd2a9228c7f1479f535b48beb3f21" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services7.xml" role="test" />
   <file md5sum="71f5c7df64436e6adf6fb4457d7b5075" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml" role="test" />
   <file md5sum="ca60e6bf5f65fff971f8d13a644a9acb" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml" role="test" />
   <file md5sum="561c119c08673fd8436e11424a20d808" name="Symfony/Component/DependencyInjection/Tests/Fixtures/xml/withdoctype.xml" role="test" />
   <file md5sum="2b4b910651d1e7de3a74cc6872184be8" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag1.yml" role="test" />
   <file md5sum="2651cca5fcafb2d3328d2d18cc825f2f" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag2.yml" role="test" />
   <file md5sum="8b67ba68bb2c5551ac4bc3f7a865839d" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag3.yml" role="test" />
   <file md5sum="037bf52fe0bfa7b643b837d08dfdf92d" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid1.yml" role="test" />
   <file md5sum="d42f2da1df5ecdf29be4ac27edda0c12" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid2.yml" role="test" />
   <file md5sum="68b329da9893e34099c7d8ad5cb9c940" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services1.yml" role="test" />
   <file md5sum="98428e36b00061da1b64b1e64781e4d0" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services10.yml" role="test" />
   <file md5sum="8fc6f5242a9a9a0092dcc9387e2f826c" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services11.yml" role="test" />
   <file md5sum="9ed1d963ba546e9772a3808f08a91376" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services13.yml" role="test" />
   <file md5sum="be17d9c22568cf11a27193704cc13703" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.yml" role="test" />
   <file md5sum="2011daeb4d44240efd2caddf60d84038" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services3.yml" role="test" />
   <file md5sum="3e738ce0eb54d9aa53021bb09649e45b" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4.yml" role="test" />
   <file md5sum="d1b518eb8021cccac6ac53ffc1157781" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4_bad_import.yml" role="test" />
   <file md5sum="6f37efe61e948638cb95cbeebee34a7d" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services6.yml" role="test" />
   <file md5sum="6de30e3ec6f5769fffa3a84921d5ea58" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services7.yml" role="test" />
   <file md5sum="2d887f6e7ab72fc1ef7710f090ac6892" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml" role="test" />
   <file md5sum="0c0c237a0f162b1035bc9a31bfb7e3f3" name="Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml" role="test" />
   <file md5sum="b26bc2f643dea09195075d0096e874a0" name="Symfony/Component/DependencyInjection/Tests/LazyProxy/Instantiator/RealServiceInstantiatorTest.php" role="test" />
   <file md5sum="e0c0229d4f3141bae74c4bbe30a06b21" name="Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/NullDumperTest.php" role="test" />
   <file md5sum="97399006240deb90b22bcdb49ab08f61" name="Symfony/Component/DependencyInjection/Tests/Loader/ClosureLoaderTest.php" role="test" />
   <file md5sum="8e3c7ae75fb774783dc26b6c33ca93f5" name="Symfony/Component/DependencyInjection/Tests/Loader/IniFileLoaderTest.php" role="test" />
   <file md5sum="c26312ff35c5941814fe09fdfecf216e" name="Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php" role="test" />
   <file md5sum="d702b36279525fb4751489f2e3285414" name="Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php" role="test" />
   <file md5sum="3ae936ba0577f3144075883fc4a845ce" name="Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php" role="test" />
   <file md5sum="f967ec9e8b4a79bf91bd5b4675fbc70c" name="Symfony/Component/DependencyInjection/Tests/ParameterBag/FrozenParameterBagTest.php" role="test" />
   <file md5sum="6db6b2ca8ed272df55332f0916be0ad9" name="Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php" role="test" />
   <file md5sum="965987dd3ddde1039ebe8c42d83a241b" name="Symfony/Component/DependencyInjection/Tests/ParameterTest.php" role="test" />
   <file md5sum="203939f24651f40960e928d69a8c6a08" name="Symfony/Component/DependencyInjection/Tests/ReferenceTest.php" role="test" />
   <file md5sum="ed13f0022bf056748456b80c702dbe21" name="Symfony/Component/DependencyInjection/Variable.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
  <optional>
   <package>
    <name>Config</name>
    <channel>pear.symfony.com</channel>
   </package>
   <package>
    <name>Yaml</name>
    <channel>pear.symfony.com</channel>
   </package>
  </optional>
 </dependencies>
 <phprelease />
</package>
PK�^�\}3YN��"pear/.pkgxml/eZc_Archive-1.4.1.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.0" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd">
 <name>Archive</name>
 <channel>components.ez.no</channel>
 <summary>The component allows you to create, modify, and extract archive files of</summary>
 <description>The component allows you to create, modify, and extract archive files of 
various formats.  The currently supported archives formats are Tar (with 
the flavours: ustar, v7, pax, and gnu) and Zip.</description>
 <lead>
  <name>eZ systems</name>
  <user>ezc</user>
  <email>ezc@ez.no</email>
  <active>yes</active>
 </lead>
 <date>2010-03-22</date>
 <time>14:22:30</time>
 <version>
  <release>1.4.1</release>
  <api>1.4.1</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license>New BSD</license>
 <notes>
- Fixed #16030: Archive calls posix_* functions even it is only an optional
  depedency.
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="72bf37bbd23ecb988ed26621668b9ea0" name="design/class_diagram.png" role="data" />
   <file baseinstalldir="/" md5sum="741c4ea6a06af6567cd1afe5fed41a53" name="design/design.txt" role="data" />
   <file baseinstalldir="/" md5sum="6a44661d8d0ed5dea17e26938c1c388c" name="docs/CREDITS" role="doc" />
   <file baseinstalldir="/" md5sum="2a77e280aa2ae4f807969d0ac3c8152d" name="docs/example.php" role="doc" />
   <file baseinstalldir="/" md5sum="0d01eec9cb573a51f7cb73a1573c5350" name="docs/LICENSE" role="doc" />
   <file baseinstalldir="/" md5sum="8d06fa57a81f0a0a5896e5e0457ecebe" name="docs/tutorial.txt" role="doc" />
   <file baseinstalldir="/" md5sum="c62acdb41db6b2f5f90506fda0ffe426" name="docs/tutorial_autoload.php" role="doc" />
   <file baseinstalldir="/" md5sum="f313af43fda7b4a1d3406d8231af04bf" name="docs/tutorial_directories.php" role="doc" />
   <file baseinstalldir="/" md5sum="65dd3a672e2653f9684af63dbe7b8f39" name="docs/tutorial_extract.php" role="doc" />
   <file baseinstalldir="/" md5sum="b559a62025c86b39e2b8318f3e6ed8ef" name="docs/tutorial_iterator.php" role="doc" />
   <file baseinstalldir="/" md5sum="060715d13ae55509316734f4eb855088" name="docs/tutorial_read_only.php" role="doc" />
   <file baseinstalldir="/" md5sum="45e5934942ff8129b05a5111bff812b6" name="docs/tutorial_recursive.php" role="doc" />
   <file baseinstalldir="/" md5sum="a6af136dfae2051d9c681072fc5be848" name="docs/tutorial_replacing.php" role="doc" />
   <file baseinstalldir="/" md5sum="8bfdfa690b70a22d4561bf29f87e6cee" name="ezc/Archive/exceptions/block_size.php" role="php" />
   <file baseinstalldir="/" md5sum="36b0f5f2a917c3ebb575ea2c94ebeb53" name="ezc/Archive/exceptions/checksum.php" role="php" />
   <file baseinstalldir="/" md5sum="19eb3fb3e6ca070d4105b047642f473c" name="ezc/Archive/exceptions/empty.php" role="php" />
   <file baseinstalldir="/" md5sum="9ad968fb58ff679a0179d959b09832e1" name="ezc/Archive/exceptions/entry_prefix.php" role="php" />
   <file baseinstalldir="/" md5sum="e84a507b5d7b2d207d0a775c26cbe3a7" name="ezc/Archive/exceptions/exception.php" role="php" />
   <file baseinstalldir="/" md5sum="005847d4bde9c903016e3581509bfaf1" name="ezc/Archive/exceptions/internal_exception.php" role="php" />
   <file baseinstalldir="/" md5sum="759c2a56665336bf4663c9d19cdd3b2e" name="ezc/Archive/exceptions/io.php" role="php" />
   <file baseinstalldir="/" md5sum="6fd01fdde9913f1321664f289ec64997" name="ezc/Archive/exceptions/unknown_type.php" role="php" />
   <file baseinstalldir="/" md5sum="ec58eb3f5b58f6abdad6b3b91eb8ee53" name="ezc/Archive/exceptions/value.php" role="php" />
   <file baseinstalldir="/" md5sum="96b9ad061c90bbeeb5a4daad7d25f586" name="ezc/Archive/file/block_file.php" role="php" />
   <file baseinstalldir="/" md5sum="35ebb368ad87b6284664436e670957a2" name="ezc/Archive/file/character_file.php" role="php" />
   <file baseinstalldir="/" md5sum="90067477c3b91fbd36960305b5008dc3" name="ezc/Archive/file/file.php" role="php" />
   <file baseinstalldir="/" md5sum="5b0e79a77cdded79f2f726709557ba0d" name="ezc/Archive/interfaces/callback.php" role="php" />
   <file baseinstalldir="/" md5sum="43801773c1b08d20220549a839a11b64" name="ezc/Archive/options/archive.php" role="php" />
   <file baseinstalldir="/" md5sum="8aff13d2dce9722eb6c017cb56ba0251" name="ezc/Archive/structs/file.php" role="php" />
   <file baseinstalldir="/" md5sum="42f4fa41c122b57c7437be5eba2a6681" name="ezc/Archive/tar/headers/gnu.php" role="php" />
   <file baseinstalldir="/" md5sum="2c538adde875f634371fc03fdf96d5eb" name="ezc/Archive/tar/headers/pax.php" role="php" />
   <file baseinstalldir="/" md5sum="f740ab119f65467ebdb063afa8e8a1be" name="ezc/Archive/tar/headers/ustar.php" role="php" />
   <file baseinstalldir="/" md5sum="6411e0637dd4a8f695fee9db1ac4d009" name="ezc/Archive/tar/headers/v7.php" role="php" />
   <file baseinstalldir="/" md5sum="33fe42a1cae20f63c1d6cf76c56e7a7c" name="ezc/Archive/tar/gnu.php" role="php" />
   <file baseinstalldir="/" md5sum="7859fc155b9533787f030970ecf13946" name="ezc/Archive/tar/pax.php" role="php" />
   <file baseinstalldir="/" md5sum="87ed07d8eefe3a60197c606b1d2a23a7" name="ezc/Archive/tar/ustar.php" role="php" />
   <file baseinstalldir="/" md5sum="c2ae79e94564bd272cfa2679184473f2" name="ezc/Archive/tar/v7.php" role="php" />
   <file baseinstalldir="/" md5sum="3da3d0671f6672514c83d19c81390132" name="ezc/Archive/utils/checksums.php" role="php" />
   <file baseinstalldir="/" md5sum="aff89d61a3e1d5098f5ae1c46573b34c" name="ezc/Archive/utils/file_type.php" role="php" />
   <file baseinstalldir="/" md5sum="376245afd1446211dc5af606e6df0c67" name="ezc/Archive/utils/stat_mode.php" role="php" />
   <file baseinstalldir="/" md5sum="3738ab744b6c5bdd1caddd32ea09a84d" name="ezc/Archive/zip/headers/central_directory.php" role="php" />
   <file baseinstalldir="/" md5sum="f34787c23bf83a287adf52776c9fb463" name="ezc/Archive/zip/headers/central_directory_end.php" role="php" />
   <file baseinstalldir="/" md5sum="379e451359f472247c253ae9034b146c" name="ezc/Archive/zip/headers/local_file.php" role="php" />
   <file baseinstalldir="/" md5sum="6927126b5039b4c393e270f3d52a20da" name="ezc/Archive/zip/zip.php" role="php" />
   <file baseinstalldir="/" md5sum="1775383dca270e61680af527a93d0f68" name="ezc/Archive/archive.php" role="php" />
   <file baseinstalldir="/" md5sum="f95a0357cca0dee2450504a3c41d4629" name="ezc/Archive/archive_autoload.php" role="php" />
   <file baseinstalldir="/" md5sum="10cee0df9b58cf85787bf50e11307050" name="ezc/Archive/entry.php" role="php" />
   <file baseinstalldir="/" md5sum="f95a0357cca0dee2450504a3c41d4629" name="ezc/autoload/archive_autoload.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.2.1</min>
   </php>
   <pearinstaller>
    <min>1.4.2</min>
   </pearinstaller>
   <package>
    <name>Base</name>
    <channel>components.ez.no</channel>
    <min>1.8</min>
   </package>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>1.4.1</release>
    <api>1.4.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2010-03-22</date>
   <license>New BSD</license>
   <notes>
- Fixed #16030: Archive calls posix_* functions even it is only an optional
  depedency.
   </notes>
  </release>
 </changelog>
</package>
PK�^�\�oA A pear/.pkgxml/eZc_Base-1.8.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.0" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd">
 <name>Base</name>
 <channel>components.ez.no</channel>
 <summary>The Base package provides the basic infrastructure that all packages rely on.</summary>
 <description>The Base package provides the basic infrastructure that all packages rely on.
Therefore every component relies on this package.</description>
 <lead>
  <name>eZ systems</name>
  <user>ezc</user>
  <email>ezc@ez.no</email>
  <active>yes</active>
 </lead>
 <date>2009-12-21</date>
 <time>12:14:24</time>
 <version>
  <release>1.8</release>
  <api>1.8</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license>New BSD</license>
 <notes>
- Fixed issue #15896: Autoload not working for all lowercase class names.
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="ab5f9f34361961cc74b309325509e87f" name="design/class_diagram.png" role="data" />
   <file baseinstalldir="/" md5sum="64dbc0df23c0142f806e3837a4557c07" name="design/design.txt" role="data" />
   <file baseinstalldir="/" md5sum="524b92ec3bf9055dd50e0a527b2f4b9c" name="docs/repos/autoloads/my_autoload.php" role="doc" />
   <file baseinstalldir="/" md5sum="bd6af5ed742435bd1cdc7f2f4f5b998a" name="docs/repos/autoloads/your_autoload.php" role="doc" />
   <file baseinstalldir="/" md5sum="1300956dd09bc8fc6346eca3ad5d07d9" name="docs/repos/Me/myclass1.php" role="doc" />
   <file baseinstalldir="/" md5sum="9f53d279b27b65a325be9274d49f6f74" name="docs/repos/Me/myclass2.php" role="doc" />
   <file baseinstalldir="/" md5sum="8a4863c1e5bc1b10e25fe78b028acd2f" name="docs/repos/You/yourclass1.php" role="doc" />
   <file baseinstalldir="/" md5sum="2ff7777b81e887c50b09e23bbaa9c152" name="docs/repos/You/yourclass2.php" role="doc" />
   <file baseinstalldir="/" md5sum="6a44661d8d0ed5dea17e26938c1c388c" name="docs/CREDITS" role="doc" />
   <file baseinstalldir="/" md5sum="0d01eec9cb573a51f7cb73a1573c5350" name="docs/LICENSE" role="doc" />
   <file baseinstalldir="/" md5sum="15e07d15fb1865740da5a5255da0b330" name="docs/tutorial.txt" role="doc" />
   <file baseinstalldir="/" md5sum="c62acdb41db6b2f5f90506fda0ffe426" name="docs/tutorial_autoload.php" role="doc" />
   <file baseinstalldir="/" md5sum="7a4a698465b2dbcf948d5a9abdf16ab6" name="docs/tutorial_example_01.php" role="doc" />
   <file baseinstalldir="/" md5sum="1493849915073e203c09c0615ad1dc22" name="docs/tutorial_example_02.php" role="doc" />
   <file baseinstalldir="/" md5sum="09ddc9170be2be2f9a197823f4fb05b3" name="docs/tutorial_example_03.php" role="doc" />
   <file baseinstalldir="/" md5sum="c93496ab05d259e2f2867c177a31b9df" name="docs/tutorial_example_04.php" role="doc" />
   <file baseinstalldir="/" md5sum="f6399aeed38cbc422ba7a95a4cc3e4d1" name="docs/tutorial_lazy_initialization.php" role="doc" />
   <file baseinstalldir="/" md5sum="bf570452286a6c882531370b75ef4ed5" name="ezc/autoload/base_autoload.php" role="php" />
   <file baseinstalldir="/" md5sum="4cbf7efc1654c118c1ab4013da584ea2" name="ezc/Base/exceptions/autoload.php" role="php" />
   <file baseinstalldir="/" md5sum="26ae1c2a3243187d8b281a33e28ab388" name="ezc/Base/exceptions/double_class_repository_prefix.php" role="php" />
   <file baseinstalldir="/" md5sum="1b1d2ccf1d83e9f2126ce6d423ad4a06" name="ezc/Base/exceptions/exception.php" role="php" />
   <file baseinstalldir="/" md5sum="d9b8d14dcddd1453d36025842a915c88" name="ezc/Base/exceptions/extension_not_found.php" role="php" />
   <file baseinstalldir="/" md5sum="83889a8ded5df760a1184a44e64beb08" name="ezc/Base/exceptions/file_exception.php" role="php" />
   <file baseinstalldir="/" md5sum="2a2d0e89497bd188477d43f5a87701d8" name="ezc/Base/exceptions/file_io.php" role="php" />
   <file baseinstalldir="/" md5sum="cee70f6094d8e6a1da052f3b2e9913ab" name="ezc/Base/exceptions/file_not_found.php" role="php" />
   <file baseinstalldir="/" md5sum="249cdcf29b1fc357587301d1a8f8a25f" name="ezc/Base/exceptions/file_permission.php" role="php" />
   <file baseinstalldir="/" md5sum="f914328c784c38af9dcb71d6fdbbac42" name="ezc/Base/exceptions/functionality_not_supported.php" role="php" />
   <file baseinstalldir="/" md5sum="9ae4f81ab15f52153132439840096a47" name="ezc/Base/exceptions/init_callback_configured.php" role="php" />
   <file baseinstalldir="/" md5sum="f4f5f5d9599ea1cdde2929e4dbbcbdbe" name="ezc/Base/exceptions/invalid_callback_class.php" role="php" />
   <file baseinstalldir="/" md5sum="416b95f88e0480547b51340afef5d647" name="ezc/Base/exceptions/invalid_parent_class.php" role="php" />
   <file baseinstalldir="/" md5sum="e6147c51e29536df0683a49aeab920e8" name="ezc/Base/exceptions/property_not_found.php" role="php" />
   <file baseinstalldir="/" md5sum="58e2f2dc39f347b59a1afc957a8cdfcd" name="ezc/Base/exceptions/property_permission.php" role="php" />
   <file baseinstalldir="/" md5sum="8b95e40352468ff28126fc02abc8a9b6" name="ezc/Base/exceptions/setting_not_found.php" role="php" />
   <file baseinstalldir="/" md5sum="a9dd91058d170afb1728619c7b848504" name="ezc/Base/exceptions/setting_value.php" role="php" />
   <file baseinstalldir="/" md5sum="ba9fd1b76372a61fdf21788fb57652e3" name="ezc/Base/exceptions/value.php" role="php" />
   <file baseinstalldir="/" md5sum="990f3ff806a9b5e7b11d172d8dd98462" name="ezc/Base/exceptions/whatever.php" role="php" />
   <file baseinstalldir="/" md5sum="dc2ea8522a7c06d5b3569a43ff536e7e" name="ezc/Base/interfaces/configuration_initializer.php" role="php" />
   <file baseinstalldir="/" md5sum="9f7c4a9cb5cf5c9647f7a827ebe9e435" name="ezc/Base/interfaces/exportable.php" role="php" />
   <file baseinstalldir="/" md5sum="916e40d5c700ab2888c01e4ebf587dcc" name="ezc/Base/interfaces/persistable.php" role="php" />
   <file baseinstalldir="/" md5sum="71fc5b479b6d8aa27103a16a29a715ea" name="ezc/Base/metadata/pear.php" role="php" />
   <file baseinstalldir="/" md5sum="988bce2474a73cf18bad85a2fb9112cf" name="ezc/Base/metadata/tarball.php" role="php" />
   <file baseinstalldir="/" md5sum="cb22067aa3adbf0152698040c6194ff8" name="ezc/Base/options/autoload.php" role="php" />
   <file baseinstalldir="/" md5sum="23efc7803de088935e856b72e0ee8bea" name="ezc/Base/structs/file_find_context.php" role="php" />
   <file baseinstalldir="/" md5sum="6dd22392400103056ced0bac2769197c" name="ezc/Base/structs/repository_directory.php" role="php" />
   <file baseinstalldir="/" md5sum="3c4ce22ba182187085b754f643ee00bd" name="ezc/Base/base.php" role="php" />
   <file baseinstalldir="/" md5sum="bf570452286a6c882531370b75ef4ed5" name="ezc/Base/base_autoload.php" role="php" />
   <file baseinstalldir="/" name="ezc/Base/ezc_bootstrap.php" role="php" />
   <file baseinstalldir="/" md5sum="6fd930e0989b4f0ab940d7bfd6f41c90" name="ezc/Base/features.php" role="php" />
   <file baseinstalldir="/" md5sum="dbe0d8855229df798919b9b1d3f84373" name="ezc/Base/file.php" role="php" />
   <file baseinstalldir="/" md5sum="0ccaeea1d41417f464914cebb064b7d7" name="ezc/Base/init.php" role="php" />
   <file baseinstalldir="/" md5sum="a6c718b782e8c23497183a11ab1e8954" name="ezc/Base/metadata.php" role="php" />
   <file baseinstalldir="/" md5sum="89b149eb5eddf69c1424fd9883d51382" name="ezc/Base/options.php" role="php" />
   <file baseinstalldir="/" md5sum="d817afdeef8ee0d02e1cebddfc8915e5" name="ezc/Base/struct.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.2.1</min>
   </php>
   <pearinstaller>
    <min>1.4.2</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>1.8</release>
    <api>1.8</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2009-12-21</date>
   <license>New BSD</license>
   <notes>
- Fixed issue #15896: Autoload not working for all lowercase class names.
   </notes>
  </release>
 </changelog>
</package>
PK�^�\�
v~[0[0&pear/.pkgxml/Symfony2_Finder-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Finder</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Finder Component</summary>
 <description>Symfony2 Finder Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:44</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="6fffc29b8377e9fb68b5e302b9ff0a97" name="Symfony/Component/Finder/Adapter/AbstractAdapter.php" role="php" />
   <file md5sum="7dc817125e50b8b230fa1dd7b505a35b" name="Symfony/Component/Finder/Adapter/AbstractFindAdapter.php" role="php" />
   <file md5sum="a6b49be9beaee46ef1b3ab81b65c3f5a" name="Symfony/Component/Finder/Adapter/AdapterInterface.php" role="php" />
   <file md5sum="787a004fec8cb06949f54d45d0a92dfa" name="Symfony/Component/Finder/Adapter/BsdFindAdapter.php" role="php" />
   <file md5sum="86f218f5471a950cda80784f16635789" name="Symfony/Component/Finder/Adapter/GnuFindAdapter.php" role="php" />
   <file md5sum="5550d6d59cd92735c58ea80f58766716" name="Symfony/Component/Finder/Adapter/PhpAdapter.php" role="php" />
   <file md5sum="70c27b109779dd46d3a9d0ef38565b42" name="Symfony/Component/Finder/autoloader.php" role="php" />
   <file md5sum="f18e866785861bb62155c98357afe2d6" name="Symfony/Component/Finder/CHANGELOG.md" role="doc" />
   <file md5sum="ff527c6ba5d45d17b691dd2debe2c3d9" name="Symfony/Component/Finder/Comparator/Comparator.php" role="php" />
   <file md5sum="f50830cff54249c3d2602120bf7adc56" name="Symfony/Component/Finder/Comparator/DateComparator.php" role="php" />
   <file md5sum="5be54134d90a013d0685a58bdf395e99" name="Symfony/Component/Finder/Comparator/NumberComparator.php" role="php" />
   <file md5sum="0ade20562cd194d6ef1d87e3811baf4d" name="Symfony/Component/Finder/composer.json" role="doc" />
   <file md5sum="6ec2bf13ee80fa36603a8b1cbaeb3057" name="Symfony/Component/Finder/Exception/AccessDeniedException.php" role="php" />
   <file md5sum="543b917aa3964799c231b7f5730010b5" name="Symfony/Component/Finder/Exception/AdapterFailureException.php" role="php" />
   <file md5sum="509f10771d6f6158695f24d956ccf611" name="Symfony/Component/Finder/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="0026a361b430ca5ce4bc1a8b199f1c82" name="Symfony/Component/Finder/Exception/OperationNotPermitedException.php" role="php" />
   <file md5sum="9eb6fca673d7b360706d092ebc91519f" name="Symfony/Component/Finder/Exception/ShellCommandFailureException.php" role="php" />
   <file md5sum="344148f9472396a75e505102cade415c" name="Symfony/Component/Finder/Expression/Expression.php" role="php" />
   <file md5sum="a231c7c1fcea375333c3b4a2c14ab532" name="Symfony/Component/Finder/Expression/Glob.php" role="php" />
   <file md5sum="f6919b0c7a8545c57d85318b544d0f24" name="Symfony/Component/Finder/Expression/Regex.php" role="php" />
   <file md5sum="219c3a5985874bf148c4261c21db14bd" name="Symfony/Component/Finder/Expression/ValueInterface.php" role="php" />
   <file md5sum="a4f805d1284bcd933f1ee022197c9226" name="Symfony/Component/Finder/Finder.php" role="php" />
   <file md5sum="0b44ed57af5918230d1b82ecee9c3ba3" name="Symfony/Component/Finder/Glob.php" role="php" />
   <file md5sum="b043b76cf6d7a5356b2515d28c7ff48a" name="Symfony/Component/Finder/Iterator/CustomFilterIterator.php" role="php" />
   <file md5sum="62f326275b0ded2de6cd6209ec2536af" name="Symfony/Component/Finder/Iterator/DateRangeFilterIterator.php" role="php" />
   <file md5sum="91fd43512fed83211c6cce453e6b45be" name="Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.php" role="php" />
   <file md5sum="6cf1f8950c36872e6389337ae41c6268" name="Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.php" role="php" />
   <file md5sum="04c5aafbda629dc67e3d1b36ec56f692" name="Symfony/Component/Finder/Iterator/FilecontentFilterIterator.php" role="php" />
   <file md5sum="c414b7cb71b775f369d676c345b3cbed" name="Symfony/Component/Finder/Iterator/FilenameFilterIterator.php" role="php" />
   <file md5sum="92a7737c720fb253f300a5e27cf7b0a3" name="Symfony/Component/Finder/Iterator/FilePathsIterator.php" role="php" />
   <file md5sum="8848c8e1a14338fead3676ff724b0a18" name="Symfony/Component/Finder/Iterator/FileTypeFilterIterator.php" role="php" />
   <file md5sum="357568ea6a039bfaf363227eb4823b08" name="Symfony/Component/Finder/Iterator/FilterIterator.php" role="php" />
   <file md5sum="b8343ab9d4fcebfa7be797bccd8ef559" name="Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.php" role="php" />
   <file md5sum="7bcb38607afc169b07443b4d166cd646" name="Symfony/Component/Finder/Iterator/PathFilterIterator.php" role="php" />
   <file md5sum="42d968969a5f86d4131876b013fa8222" name="Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.php" role="php" />
   <file md5sum="5e5846ae6b28172c38b8398a9d9dfab7" name="Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.php" role="php" />
   <file md5sum="530f84682e9e9f218d1e349bfd6a62dc" name="Symfony/Component/Finder/Iterator/SortableIterator.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Finder/LICENSE" role="doc" />
   <file md5sum="cef311635452da773abddebf14e2f6eb" name="Symfony/Component/Finder/phpunit.xml.dist" role="test" />
   <file md5sum="2456580383eb35b4f4a2529c6cc1264f" name="Symfony/Component/Finder/README.md" role="doc" />
   <file md5sum="d66a35ad507168d1fa3034a61c2a94e8" name="Symfony/Component/Finder/Shell/Command.php" role="php" />
   <file md5sum="fff1b9b5a47c24fa988f4340a5c52701" name="Symfony/Component/Finder/Shell/Shell.php" role="php" />
   <file md5sum="c4117456dc277d299cf94ffee5d66410" name="Symfony/Component/Finder/SplFileInfo.php" role="php" />
   <file md5sum="feecb2cd50a7a248febac4044933ac3d" name="Symfony/Component/Finder/Tests/Comparator/ComparatorTest.php" role="test" />
   <file md5sum="89ff8698db0e90e9820b4c2d9322ea35" name="Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php" role="test" />
   <file md5sum="65c58bb38b3d2a7d3c40b1a28869cf9a" name="Symfony/Component/Finder/Tests/Comparator/NumberComparatorTest.php" role="test" />
   <file md5sum="b079a8f0f48ea5bce7ea931822d23728" name="Symfony/Component/Finder/Tests/Expression/ExpressionTest.php" role="test" />
   <file md5sum="8dbffcaf39e52ac3203f592066b7d4ed" name="Symfony/Component/Finder/Tests/Expression/GlobTest.php" role="test" />
   <file md5sum="14318667c0d8f805fe01762c1fc36d70" name="Symfony/Component/Finder/Tests/Expression/RegexTest.php" role="test" />
   <file md5sum="c60edd9b00b8f99374c3a826e615e27c" name="Symfony/Component/Finder/Tests/FakeAdapter/DummyAdapter.php" role="test" />
   <file md5sum="a73e2d28e02576a7851131285966ebab" name="Symfony/Component/Finder/Tests/FakeAdapter/FailingAdapter.php" role="test" />
   <file md5sum="5509680e7bc94ac0fab1a75680b8cfe7" name="Symfony/Component/Finder/Tests/FakeAdapter/NamedAdapter.php" role="test" />
   <file md5sum="5afaefa9e0c692d20ab98d9f573fda4e" name="Symfony/Component/Finder/Tests/FakeAdapter/UnsupportedAdapter.php" role="test" />
   <file md5sum="15e0e93e7d51a82b5b32e3518b7afc99" name="Symfony/Component/Finder/Tests/FinderTest.php" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Finder/Tests/Fixtures/A/a.dat" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Finder/Tests/Fixtures/A/B/ab.dat" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Finder/Tests/Fixtures/A/B/C/abc.dat" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Finder/Tests/Fixtures/copy/A/a.dat.copy" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Finder/Tests/Fixtures/copy/A/B/ab.dat.copy" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Finder/Tests/Fixtures/copy/A/B/C/abc.dat.copy" role="test" />
   <file md5sum="6624837e7357e95e2183d9aa82a4a90f" name="Symfony/Component/Finder/Tests/Fixtures/dolor.txt" role="test" />
   <file md5sum="843affd355b258df359cb9b62a64289d" name="Symfony/Component/Finder/Tests/Fixtures/ipsum.txt" role="test" />
   <file md5sum="bd58bbe99a4801c138ec8017d65cc7a4" name="Symfony/Component/Finder/Tests/Fixtures/lorem.txt" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Finder/Tests/Fixtures/one/a" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Finder/Tests/Fixtures/one/b/c.neon" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Finder/Tests/Fixtures/one/b/d.neon" role="test" />
   <file md5sum="d41d8cd98f00b204e9800998ecf8427e" name="Symfony/Component/Finder/Tests/Fixtures/with space/foo.txt" role="test" />
   <file md5sum="57fa269cea0bbc73e2416764536b6746" name="Symfony/Component/Finder/Tests/Iterator/CustomFilterIteratorTest.php" role="test" />
   <file md5sum="173f134f8bccca2c1757a77b2ca77a93" name="Symfony/Component/Finder/Tests/Iterator/DateRangeFilterIteratorTest.php" role="test" />
   <file md5sum="b10459df5f2e84c32758ab00b8c2a559" name="Symfony/Component/Finder/Tests/Iterator/DepthRangeFilterIteratorTest.php" role="test" />
   <file md5sum="fb762b45fa48417171d592421504a258" name="Symfony/Component/Finder/Tests/Iterator/ExcludeDirectoryFilterIteratorTest.php" role="test" />
   <file md5sum="1cf6511c36dee2f1029b6f41ac31ad65" name="Symfony/Component/Finder/Tests/Iterator/FilecontentFilterIteratorTest.php" role="test" />
   <file md5sum="41c49ff40fc3622a48c04df824684944" name="Symfony/Component/Finder/Tests/Iterator/FilenameFilterIteratorTest.php" role="test" />
   <file md5sum="87f862713b1702931fd758cb0f9d70b0" name="Symfony/Component/Finder/Tests/Iterator/FilePathsIteratorTest.php" role="test" />
   <file md5sum="0f08a73086ae0c8de3a110563240052a" name="Symfony/Component/Finder/Tests/Iterator/FileTypeFilterIteratorTest.php" role="test" />
   <file md5sum="8683e26efd65bf17dc96e21c25b4326c" name="Symfony/Component/Finder/Tests/Iterator/FilterIteratorTest.php" role="test" />
   <file md5sum="3efa2d95b80c889e65bf1c18d898201a" name="Symfony/Component/Finder/Tests/Iterator/Iterator.php" role="test" />
   <file md5sum="e14ac4c44a1faa1d22e2188ae20a1e63" name="Symfony/Component/Finder/Tests/Iterator/IteratorTestCase.php" role="test" />
   <file md5sum="5f9af5d1647b30d511aa017dcf8b3a72" name="Symfony/Component/Finder/Tests/Iterator/MockFileListIterator.php" role="test" />
   <file md5sum="b7dae5a3886979bc733067fedf265bea" name="Symfony/Component/Finder/Tests/Iterator/MockSplFileInfo.php" role="test" />
   <file md5sum="4e8d9d8ecf752a075cc7886c69bf5f93" name="Symfony/Component/Finder/Tests/Iterator/MultiplePcreFilterIteratorTest.php" role="test" />
   <file md5sum="6f6ac3f2c9e2663f778d2ca0e700fc34" name="Symfony/Component/Finder/Tests/Iterator/PathFilterIteratorTest.php" role="test" />
   <file md5sum="ff1381bf96a6d4b7e99328cd2a2e0a23" name="Symfony/Component/Finder/Tests/Iterator/RealIteratorTestCase.php" role="test" />
   <file md5sum="3a331462cae2726ae6e1f608f6da87bb" name="Symfony/Component/Finder/Tests/Iterator/RecursiveDirectoryIteratorTest.php" role="test" />
   <file md5sum="398cce21c68fe443d6303260d7c8a5cb" name="Symfony/Component/Finder/Tests/Iterator/SizeRangeFilterIteratorTest.php" role="test" />
   <file md5sum="c08270fdc6490d0f92767a14506df3ad" name="Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\^\F[[*pear/.pkgxml/Symfony2_Serializer-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Serializer</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Serializer Component</summary>
 <description>Symfony2 Serializer Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:50</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="8924fb8ebee45aa2f1cb733a311084fe" name="Symfony/Component/Serializer/autoloader.php" role="php" />
   <file md5sum="124d3455707cf90eea4b75aad3128b99" name="Symfony/Component/Serializer/CHANGELOG.md" role="doc" />
   <file md5sum="4650d276ce46d27f209867df3fcf7079" name="Symfony/Component/Serializer/composer.json" role="doc" />
   <file md5sum="df666b9ada7f68fadc2531c41d5fe73e" name="Symfony/Component/Serializer/Encoder/ChainDecoder.php" role="php" />
   <file md5sum="5369492dbbe7d6ca9e13d39b780e2ba7" name="Symfony/Component/Serializer/Encoder/ChainEncoder.php" role="php" />
   <file md5sum="d801732fc0ff9fa4f77b475b1949f5d7" name="Symfony/Component/Serializer/Encoder/DecoderInterface.php" role="php" />
   <file md5sum="60ab91988770567a746858bf9cebc15d" name="Symfony/Component/Serializer/Encoder/EncoderInterface.php" role="php" />
   <file md5sum="1faccc4be8d9d1f7ee14019a197b24de" name="Symfony/Component/Serializer/Encoder/JsonDecode.php" role="php" />
   <file md5sum="fd129010a819c8fbed0f9f8e295c3a6b" name="Symfony/Component/Serializer/Encoder/JsonEncode.php" role="php" />
   <file md5sum="a0de4192caa291e2d2c478056fd08260" name="Symfony/Component/Serializer/Encoder/JsonEncoder.php" role="php" />
   <file md5sum="b84dd04f4d9155d8bf22f64ad1ab2a21" name="Symfony/Component/Serializer/Encoder/NormalizationAwareInterface.php" role="php" />
   <file md5sum="8a78de10c12341c3cd4f3086b9ae4fb1" name="Symfony/Component/Serializer/Encoder/SerializerAwareEncoder.php" role="php" />
   <file md5sum="4b1bb45f51fbc0080c7bd83ec4d014b2" name="Symfony/Component/Serializer/Encoder/XmlEncoder.php" role="php" />
   <file md5sum="419f2f11a1889bc399f27e8b8ac383c4" name="Symfony/Component/Serializer/Exception/Exception.php" role="php" />
   <file md5sum="f5a0271960a36477271010059aef7342" name="Symfony/Component/Serializer/Exception/InvalidArgumentException.php" role="php" />
   <file md5sum="4fc4b4a3763cfb4f44c63967e9eb0300" name="Symfony/Component/Serializer/Exception/LogicException.php" role="php" />
   <file md5sum="117ae6cc407de0db333905e216f06310" name="Symfony/Component/Serializer/Exception/RuntimeException.php" role="php" />
   <file md5sum="a874d8aa52e749c940da7945f0b5e86c" name="Symfony/Component/Serializer/Exception/UnexpectedValueException.php" role="php" />
   <file md5sum="c04f7626016df14e0b48b74a67fbe300" name="Symfony/Component/Serializer/Exception/UnsupportedException.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Serializer/LICENSE" role="doc" />
   <file md5sum="b46b9f066240e486a59059f7c21f3757" name="Symfony/Component/Serializer/Normalizer/CustomNormalizer.php" role="php" />
   <file md5sum="0c2569d8e753c961b4d79f7986f2bc3c" name="Symfony/Component/Serializer/Normalizer/DenormalizableInterface.php" role="php" />
   <file md5sum="d993fdf8138bdb93b870c77f458c72c6" name="Symfony/Component/Serializer/Normalizer/DenormalizerInterface.php" role="php" />
   <file md5sum="ea2945858b665064abdf2c54dd76fb4a" name="Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php" role="php" />
   <file md5sum="88ca8e957cc8d23917585f78154d3247" name="Symfony/Component/Serializer/Normalizer/NormalizableInterface.php" role="php" />
   <file md5sum="2727f8dbe1b56a400cc24a1a5fcf9253" name="Symfony/Component/Serializer/Normalizer/NormalizerInterface.php" role="php" />
   <file md5sum="59fe1098fedc2bc327d5156c247a956b" name="Symfony/Component/Serializer/Normalizer/SerializerAwareNormalizer.php" role="php" />
   <file md5sum="03c13b185fe6ec3e58a43bb0f4d2096b" name="Symfony/Component/Serializer/phpunit.xml.dist" role="test" />
   <file md5sum="6fa24c500365e7fb17861841897a47b1" name="Symfony/Component/Serializer/README.md" role="doc" />
   <file md5sum="5f529d8ae97ae12590c6a977dcb219d3" name="Symfony/Component/Serializer/Serializer.php" role="php" />
   <file md5sum="334216d0212e8a1a75aa0bdbfffe456a" name="Symfony/Component/Serializer/SerializerAwareInterface.php" role="php" />
   <file md5sum="d33d507c40129e758c96d23be8431d7f" name="Symfony/Component/Serializer/SerializerInterface.php" role="php" />
   <file md5sum="0486db74aa7aad1deb7fe72ccbe2d24a" name="Symfony/Component/Serializer/Tests/Encoder/JsonEncoderTest.php" role="test" />
   <file md5sum="6f8f697b4c8ea3c42bc80167e05926fd" name="Symfony/Component/Serializer/Tests/Encoder/XmlEncoderTest.php" role="test" />
   <file md5sum="fa38de70b4c6a5793c1db7fcbe72d93e" name="Symfony/Component/Serializer/Tests/Fixtures/DenormalizableDummy.php" role="test" />
   <file md5sum="75d3643bd45ff8c2fb0fa4b54be38ac1" name="Symfony/Component/Serializer/Tests/Fixtures/Dummy.php" role="test" />
   <file md5sum="14ce02d7ad086e845aa4179be6688758" name="Symfony/Component/Serializer/Tests/Fixtures/NormalizableTraversableDummy.php" role="test" />
   <file md5sum="c23b959baa7a357482c451f66411c1a4" name="Symfony/Component/Serializer/Tests/Fixtures/ScalarDummy.php" role="test" />
   <file md5sum="d09fd9c23681cee83015d259becf1adb" name="Symfony/Component/Serializer/Tests/Fixtures/TraversableDummy.php" role="test" />
   <file md5sum="7a4eeaec6f791cba2dde2eed9943409e" name="Symfony/Component/Serializer/Tests/Normalizer/CustomNormalizerTest.php" role="test" />
   <file md5sum="7299974c15e42153083a1ed5798bc5e9" name="Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php" role="test" />
   <file md5sum="00773fc534e38166aeb342f31d99b28e" name="Symfony/Component/Serializer/Tests/Normalizer/TestDenormalizer.php" role="test" />
   <file md5sum="878f34a6f5f9dd999c08d24154d605c5" name="Symfony/Component/Serializer/Tests/Normalizer/TestNormalizer.php" role="test" />
   <file md5sum="076b26e14077fa01721e8c8ace4a32cf" name="Symfony/Component/Serializer/Tests/SerializerTest.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\���\\pear/.pkgxml/eZc_File-1.2.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.6.1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd     http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd">
 <name>File</name>
 <channel>components.ez.no</channel>
 <summary>Provides support for file operations which are not covered by PHP or are just</summary>
 <description>Provides support for file operations which are not covered by PHP or are just
missing.</description>
 <lead>
  <name>eZ systems</name>
  <user>ezc</user>
  <email>ezc@ez.no</email>
  <active>yes</active>
 </lead>
 <date>2007-12-17</date>
 <time>10:05:20</time>
 <version>
  <release>1.2</release>
  <api>1.2</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license>New BSD</license>
 <notes>- No changes.</notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="1fea496598ff896af1a9e9c8d0ec2121" name="design/class_diagram.png" role="data" />
   <file baseinstalldir="/" md5sum="4df8185638df9786f8623e98731a5fba" name="design/design.txt" role="data" />
   <file baseinstalldir="/" md5sum="e66684eedcbb29f0bcec8785edeb2746" name="design/file.xml" role="data" />
   <file baseinstalldir="/" md5sum="b41ecc87d2a775fbb5eb91df085b4990" name="design/file_operations.png" role="data" />
   <file baseinstalldir="/" md5sum="f5c40ec66e89cf17fb8dad4c0c8c8f4b" name="design/md5.png" role="data" />
   <file baseinstalldir="/" md5sum="3a728985b18b3c682c1977f2d6cece89" name="design/requirements.txt" role="data" />
   <file baseinstalldir="/" md5sum="6a44661d8d0ed5dea17e26938c1c388c" name="docs/CREDITS" role="doc" />
   <file baseinstalldir="/" md5sum="9b53d942ef8c5a2d0e17e527c8c18792" name="docs/LICENSE" role="doc" />
   <file baseinstalldir="/" md5sum="e062103b8204517acbbbc57ed1a79bfa" name="docs/tutorial.txt" role="doc" />
   <file baseinstalldir="/" md5sum="e13077f15f79b21c318dc328bdc789c4" name="docs/tutorial_autoload.php" role="doc" />
   <file baseinstalldir="/" md5sum="6f5a826d9e4ac53914069ecf9599c90e" name="ezc/autoload/file_autoload.php" role="php" />
   <file baseinstalldir="/" md5sum="e4017db6ff3d10118bd3b7ed0d50d846" name="ezc/File/file.php" role="php" />
   <file baseinstalldir="/" md5sum="6f5a826d9e4ac53914069ecf9599c90e" name="ezc/File/file_autoload.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.1.1</min>
   </php>
   <pearinstaller>
    <min>1.4.2</min>
   </pearinstaller>
   <package>
    <name>Base</name>
    <channel>components.ez.no</channel>
    <min>1.4</min>
   </package>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>1.2</release>
    <api>1.2</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2007-12-17</date>
   <license>New BSD</license>
   <notes>- No changes.</notes>
  </release>
 </changelog>
</package>
PK�^�\��t8��*pear/.pkgxml/Symfony2_Filesystem-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>Filesystem</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 Filesystem Component</summary>
 <description>Symfony2 Filesystem Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:44</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="eeadcdf200225ed18f3d9bd70b310375" name="Symfony/Component/Filesystem/autoloader.php" role="php" />
   <file md5sum="1537577578897cb0d5702f346fae3c82" name="Symfony/Component/Filesystem/CHANGELOG.md" role="doc" />
   <file md5sum="0719190f9b9a19976e07424c786da406" name="Symfony/Component/Filesystem/composer.json" role="doc" />
   <file md5sum="11a7d451ae71b6aeba9e1236a53865f0" name="Symfony/Component/Filesystem/Exception/ExceptionInterface.php" role="php" />
   <file md5sum="8a8b119b88f20a5a3078e051a308f741" name="Symfony/Component/Filesystem/Exception/FileNotFoundException.php" role="php" />
   <file md5sum="79569770a034723c06472d45b57d74da" name="Symfony/Component/Filesystem/Exception/IOException.php" role="php" />
   <file md5sum="9ce81ced7d137497a4aa3639b2c445fe" name="Symfony/Component/Filesystem/Exception/IOExceptionInterface.php" role="php" />
   <file md5sum="356b2ce6a1d41b8cae77ef6fd9258b06" name="Symfony/Component/Filesystem/Filesystem.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/Filesystem/LICENSE" role="doc" />
   <file md5sum="1579e7260973d3c54b34f0a2b0342f8f" name="Symfony/Component/Filesystem/phpunit.xml.dist" role="test" />
   <file md5sum="a954a92f9fc04cd3aabdff075b04252f" name="Symfony/Component/Filesystem/README.md" role="doc" />
   <file md5sum="4108eeb04e7693cca06fb785b91553ab" name="Symfony/Component/Filesystem/Tests/ExceptionTest.php" role="test" />
   <file md5sum="e7e4c5588c1846edc92e286385fcfb42" name="Symfony/Component/Filesystem/Tests/FilesystemTest.php" role="test" />
   <file md5sum="0e10c90ef941c3e68756586a5f197b8e" name="Symfony/Component/Filesystem/Tests/FilesystemTestCase.php" role="test" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\�*�OOpear/.pkgxml/ezc.xmlnu�[���<?xml version="1.0" encoding="ISO-8859-1" ?>
<channel version="1.0" xmlns="http://pear.php.net/channel-1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://pear.php.net/dtd/channel-1.0 http://pear.php.net/dtd/channel-1.0.xsd">
 <name>components.ez.no</name>
 <summary>eZ Enterprise components</summary>
 <suggestedalias>ezc</suggestedalias>
 <validatepackage version="1.0">PEAR_Validator_PECL</validatepackage>
 <servers>
  <primary>
   <rest>
    <baseurl type="REST1.0">http://components.ez.no/</baseurl>
   </rest>
  </primary>
 </servers>
</channel>
PK�^�\%ONO��+pear/.pkgxml/Pear_Mail_mimeDecode-1.5.6.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.10.1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0     http://pear.php.net/dtd/tasks-1.0.xsd      http://pear.php.net/dtd/package-2.0     http://pear.php.net/dtd/package-2.0.xsd">
 <name>Mail_mimeDecode</name>
 <channel>pear.php.net</channel>
 <summary>Provides a class to decode mime messages.</summary>
 <description>Provides a class to deal with the decoding and interpreting of mime messages.
 This package used to be part of the Mail_Mime package, but has been split off.</description>
 <lead>
  <name>Cipriano Groenendal</name>
  <user>cipri</user>
  <email>cipri@php.net</email>
  <active>yes</active>
 </lead>
 <lead>
  <name>Alan Knowles</name>
  <user>alan_k</user>
  <email>alan@akbkhome.com</email>
  <active>yes</active>
 </lead>
 <developer>
  <name>George Schlossnagle</name>
  <user>gschlossnagle</user>
  <email>george@omniti.com</email>
  <active>no</active>
 </developer>
 <date>2016-08-29</date>
 <time>03:04:25</time>
 <version>
  <release>1.5.6</release>
  <api>1.3.1</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
 <notes>
Minor Bug fix release.
    #20431 - support for android
    #19762 - multipart signed not split correctly on line breaks
    #20027 - replace /e with preg_replace_callback
    #19762 - multipart/signed eating of new line, and expose sig_hdr etc.
 </notes>
 <contents>
  <dir baseinstalldir="/" name="/">
   <file baseinstalldir="/" md5sum="05c45d0b58718ebe73860ebfe494dcef" name="Mail/mimeDecode.php" role="php" />
   <file baseinstalldir="Mail" md5sum="642acc06cdb217b6e64506182449d8f8" name="tests/parse_header_value.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="a0bc0c9b68e62a19202bd8fb26104f3c" name="tests/semicolon_content_type_bug1724.phpt" role="test" />
   <file baseinstalldir="Mail" md5sum="194810c478066eaeb28f51116b88e25a" name="xmail.dtd" role="data" />
   <file baseinstalldir="Mail" md5sum="61cea06fb6b4bd3a4b5e2d37384e14a9" name="xmail.xsl" role="data" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>4.3.0</min>
   </php>
   <pearinstaller>
    <min>1.6.0</min>
   </pearinstaller>
   <package>
    <name>Mail_Mime</name>
    <channel>pear.php.net</channel>
    <min>1.4.0</min>
    <exclude>1.4.0</exclude>
   </package>
  </required>
 </dependencies>
 <phprelease />
 <changelog>
  <release>
   <version>
    <release>0.1.0</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>stable</api>
   </stability>
   <date>2007-06-10</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Initial Release
   </notes>
  </release>
  <release>
   <version>
    <release>1.0.0RC1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>beta</release>
    <api>stable</api>
   </stability>
   <date>2007-06-10</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Initial Release
   </notes>
  </release>
  <release>
   <date>2007-06-17</date>
   <time>17:20:44</time>
   <version>
    <release>1.5.0</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
First release of mail_mimeDecode as a seperate package.
   </notes>
  </release>
  <release>
   <date>2009-12-03</date>
   <version>
    <release>1.5.1</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Minor Bugfix release.


    Bug Fixes
    #----- - fix bug in getSendArray() - not handling multiple recipents
    #14129 - E_NOTICE fixes

    Requests
    #12365 - Add option to also include raw attached messages patched on the request of till
   </notes>
  </release>
  <release>
   <date>2010-09-02</date>
   <version>
    <release>1.5.2</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Minor Bugfix release.
 
    Bug Fixes
    #4739 - regexp parsing of header values does not balance quoting correctly
           - Fix sponsored by http://webyog.com
    #17325 - empty body messages are valid messages
    #17276 - remove &amp;new usage which throws errors now
   </notes>
  </release>
  <release>
   <date>2010-09-05</date>
   <version>
    <release>1.5.3</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Major Bugfix release.

    Apart from a major cleanout of the bug tracker for this package, this release includes a revamped
    parseHeaderValue which removes the rather flakey regex, with a real parser, which should be considerably more
    robust.
 
    Bug Fixes
        #17844 - all regression tests fixed - remove the last of the while list each() .. this is 2010 ;)...
        #11410 - support wap multipart
        #9616  - long strings as filename etc.. aaa*0=.... aaa*1=.... aaa*2=.... (merged into aaa=.....)
        #9100  - change to preg_split for mime boundary detection , in theory should catch boundaries in nested situations better...
        #7709  - check for last element on boundary split to see if its usable
        #7065  - wrapped header lines with encoding should be concated without spaces
        #6495  - missing body in decoded object
        #11537 - better decode and multi-line support
   </notes>
  </release>
  <release>
   <date>2010-09-14</date>
   <version>
    <release>1.5.4</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Critical Security release.
    
    It is highly recommended that users of 1.5.3 upgrade to this release, a change in the boundary detection
    code introduced a potential denial of service attack.
     
 
    Bug Fixes
        #17862 - quote boundary preg_split code
   </notes>
  </release>
  <release>
   <version>
    <release>1.5.5</release>
    <api>1.3.1</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2011-11-16</date>
   <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
   <notes>
Minor Bug fix release.

    #17959 - Boundaries ending with non-word characters - patch by Alex Adriaanese
    ------ - ignore whitespace and trailing cr/lf in last section of split
    ------ - correct spacing on multi-line headers. now only striped for encoded data. (on previous line)
   </notes>
  </release>
 </changelog>
</package>
PK�^�\�$n��7�7+pear/.pkgxml/Symfony2_ClassLoader-2.4.3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 <name>ClassLoader</name>
 <channel>pear.symfony.com</channel>
 <summary>Symfony2 ClassLoader Component</summary>
 <description>Symfony2 ClassLoader Component</description>
 <lead>
  <name>Fabien Potencier</name>
  <user>fabpot</user>
  <email>fabien@symfony.com</email>
  <active>yes</active>
 </lead>
 <date>2014-04-05</date>
 <time>09:33:41</time>
 <version>
  <release>2.4.3</release>
  <api>2.4.3</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.opensource.org/licenses/mit-license.php">MIT</license>
 <notes>
-
 </notes>
 <contents>
  <dir name="/">
   <file md5sum="86d9a3b8315c0692848769a9c1c3e9c5" name="Symfony/Component/ClassLoader/ApcClassLoader.php" role="php" />
   <file md5sum="13864652955ff0c5022e5553b509729e" name="Symfony/Component/ClassLoader/ApcUniversalClassLoader.php" role="php" />
   <file md5sum="aa24c1ac162b51d1d2a67f57d35ee63e" name="Symfony/Component/ClassLoader/autoloader.php" role="php" />
   <file md5sum="8d6726c438f9e0dfb95fe8b7bc95e626" name="Symfony/Component/ClassLoader/CHANGELOG.md" role="doc" />
   <file md5sum="e93bc22ebc1bddbcb25c82b3bdcd9e2f" name="Symfony/Component/ClassLoader/ClassCollectionLoader.php" role="php" />
   <file md5sum="524dfe8aff9aefd074d38ecdc888a399" name="Symfony/Component/ClassLoader/ClassLoader.php" role="php" />
   <file md5sum="3866e36ec0fe67f2469b8ec8aeb5333c" name="Symfony/Component/ClassLoader/ClassMapGenerator.php" role="php" />
   <file md5sum="86212875c79eac9dde10dbb43b2d24fc" name="Symfony/Component/ClassLoader/composer.json" role="doc" />
   <file md5sum="d81299fddda21c2171161445bd865017" name="Symfony/Component/ClassLoader/DebugClassLoader.php" role="php" />
   <file md5sum="edc1307f2a08518aefb89f5aab8a477e" name="Symfony/Component/ClassLoader/DebugUniversalClassLoader.php" role="php" />
   <file md5sum="09ce405e925cdeb923da1789121864c7" name="Symfony/Component/ClassLoader/LICENSE" role="doc" />
   <file md5sum="82e86d3ab5084a7720463b20db3f467b" name="Symfony/Component/ClassLoader/MapClassLoader.php" role="php" />
   <file md5sum="4e2184459091a9fbfc707851521b361c" name="Symfony/Component/ClassLoader/phpunit.xml.dist" role="test" />
   <file md5sum="09b871124a6d3cce9dbb4f7727f7f810" name="Symfony/Component/ClassLoader/README.md" role="doc" />
   <file md5sum="3fb37ebb53adc1aa6b55c84c49fcf5a8" name="Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.php" role="test" />
   <file md5sum="23912b93dc7de2003f49d7f1e2c25732" name="Symfony/Component/ClassLoader/Tests/ClassCollectionLoaderTest.php" role="test" />
   <file md5sum="6a58f5ed32089b0458e3ee031f30c804" name="Symfony/Component/ClassLoader/Tests/ClassLoaderTest.php" role="test" />
   <file md5sum="6cd9f7dac5d5f1daa2d40903ae0c4d23" name="Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php" role="test" />
   <file md5sum="7839cd8c5550658fbc5dd8f50db33db4" name="Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Bar.php" role="test" />
   <file md5sum="e85a0c52a4381199ded8fca8e42c1875" name="Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Foo.php" role="test" />
   <file md5sum="80ffae60899e48b99924c3a907d38255" name="Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Bar.php" role="test" />
   <file md5sum="9c0b9aefd4284a57d7f649b8cde024c5" name="Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Foo.php" role="test" />
   <file md5sum="44d59b6bdb3555587a3be549beb19451" name="Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Bar.php" role="test" />
   <file md5sum="89c3f524e25d5abff91ddae0a9aa39f8" name="Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Foo.php" role="test" />
   <file md5sum="59093638625c5324d12879437e82ac23" name="Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Bar.php" role="test" />
   <file md5sum="3a0c0cab70920049cf7c910659bbdddb" name="Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Foo.php" role="test" />
   <file md5sum="9affd828e7b937fa5dab9348a1c106c3" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Bar.php" role="test" />
   <file md5sum="565482b47ad54f50794890243d517198" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Foo.php" role="test" />
   <file md5sum="3f41e3c6878caa34053b0df735fd06d4" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Bar.php" role="test" />
   <file md5sum="199f5fc8858ff6ba24e9a1927a436a1f" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Foo.php" role="test" />
   <file md5sum="88f045e809ca7fb0c18dfdbb7bbedbfc" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Bar.php" role="test" />
   <file md5sum="0a6020428498f5d43bdd1871bdfe5fff" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Foo.php" role="test" />
   <file md5sum="133c40a5d435bb2607fcaba19a177e92" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Bar.php" role="test" />
   <file md5sum="b4809859bdbb243d35edfa3da736c859" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Foo.php" role="test" />
   <file md5sum="83f27620b7ba2c11696bdf11716d223d" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Apc/Pearlike/FooBar.php" role="test" />
   <file md5sum="03276dc89dca3856b642091121781aa7" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Namespaced/FooBar.php" role="test" />
   <file md5sum="450ce1f75995d3855e2890174cad81c9" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Bar.php" role="test" />
   <file md5sum="272f5b10737a621697301cef1fd00c34" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Baz.php" role="test" />
   <file md5sum="b52382287fd5a64b85c707f0841c797d" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Foo.php" role="test" />
   <file md5sum="03276dc89dca3856b642091121781aa7" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/FooBar.php" role="test" />
   <file md5sum="5d889368e4bd7b30ea2179f77d82816f" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Bar.php" role="test" />
   <file md5sum="03ca66795cd12fdb9d39b41825906973" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Baz.php" role="test" />
   <file md5sum="f2002a4177d860d4b3763db043f9776f" name="Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Foo.php" role="test" />
   <file md5sum="1234b8d86aed91dae669333ff5ae887f" name="Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Bar.php" role="test" />
   <file md5sum="c3ff0020d627887437102f59aaa6d5a0" name="Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Foo.php" role="test" />
   <file md5sum="16acd0ac1810324ade58e7f527b11721" name="Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Bar.php" role="test" />
   <file md5sum="cbe4fddcef55d82678ce042506df312e" name="Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Foo.php" role="test" />
   <file md5sum="7171280695f683129338bbc9127e8a5b" name="Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Bar.php" role="test" />
   <file md5sum="64b36c967661286fb774e010be84b5fc" name="Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Foo.php" role="test" />
   <file md5sum="d01e56d7432f31c185ea81acd0c3e43e" name="Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Bar.php" role="test" />
   <file md5sum="8c8934c39f7727374b802bea9c0892eb" name="Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Foo.php" role="test" />
   <file md5sum="c0ba313164bfc6fc725c67e515af6368" name="Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.php" role="test" />
   <file md5sum="c718b10e49ff27e12c0674e674e85a6b" name="Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/ATrait.php" role="test" />
   <file md5sum="0322eeaef5105762706853bd4445f92d" name="Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.php" role="test" />
   <file md5sum="f6d6d69da53085f34b2363d23081783f" name="Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/BTrait.php" role="test" />
   <file md5sum="ea775929d42f58af393b4f224c59b1c9" name="Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CInterface.php" role="test" />
   <file md5sum="f925be736833be1a46dcb4878537cfe3" name="Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CTrait.php" role="test" />
   <file md5sum="d1a43cd2eb1d650a46793b4324717801" name="Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/D.php" role="test" />
   <file md5sum="676dc682573657553221b8997da6fe5f" name="Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/E.php" role="test" />
   <file md5sum="6ea7e288f1a6c11ad35be1011275cf49" name="Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/GInterface.php" role="test" />
   <file md5sum="087217e8655325395af4f0dec57cde9b" name="Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.php" role="test" />
   <file md5sum="439f18e59d963c281150e47387e575e9" name="Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notAClass.php" role="test" />
   <file md5sum="959a2c47ea204306eccdd8fb6bf09d9c" name="Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notPhpFile.md" role="test" />
   <file md5sum="23a88b412716678374cb83b3bd84f281" name="Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.php" role="test" />
   <file md5sum="e4d922295055f51230604c8e3d231eae" name="Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.php" role="test" />
   <file md5sum="b183b2f81d0a3580b8494e2a315b5c0f" name="Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.php" role="test" />
   <file md5sum="3925f28e4b3d85670506ec8f20ad5c1a" name="Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.php" role="test" />
   <file md5sum="bbbb1f58e6ce45f7f2fcf18009537d34" name="Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.php" role="test" />
   <file md5sum="4bc49eb260c97d801f0c924b3cbb9e83" name="Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced/FooBar.php" role="test" />
   <file md5sum="7f38452cd551fb2149367bc6b11329e2" name="Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced2/FooBar.php" role="test" />
   <file md5sum="f8188170d810646eafce22ad6458c37c" name="Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike/FooBar.php" role="test" />
   <file md5sum="fe464b289785a184fb96897588e17915" name="Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike2/FooBar.php" role="test" />
   <file md5sum="22c1ff3bd402ac54f7663e249ee27265" name="Symfony/Component/ClassLoader/Tests/Fixtures/includepath/Foo.php" role="test" />
   <file md5sum="0bd20d6bd956d80ab403aab7ec1692d3" name="Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Bar.php" role="test" />
   <file md5sum="669a66483c0b6c6d301928afdc9c4e4f" name="Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Baz.php" role="test" />
   <file md5sum="004debf153631e65aa55a6a595f5e859" name="Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Foo.php" role="test" />
   <file md5sum="63773f312e4568035cea34d1e7049f93" name="Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/WithComments.php" role="test" />
   <file md5sum="0e1341c26bd5098d0666416a99328602" name="Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Bar.php" role="test" />
   <file md5sum="f7037244d76da1670a0b6ab35980d735" name="Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Baz.php" role="test" />
   <file md5sum="7017318cc8fb7cb1b43f1f7caf023e5b" name="Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Foo.php" role="test" />
   <file md5sum="092caf7c7dda0fd29b6a4eb94e16e8c7" name="Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Bar.php" role="test" />
   <file md5sum="7ec330e5918e68855ea1928650677c2e" name="Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Baz.php" role="test" />
   <file md5sum="2ccc8e12aac56ba8a19cc5749f4ddef6" name="Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Foo.php" role="test" />
   <file md5sum="8d6f9450b4d45d80d880d449c0f8ec73" name="Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/WithComments.php" role="test" />
   <file md5sum="43c84f5dcf75beec1d21efa12d74d135" name="Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Bar.php" role="test" />
   <file md5sum="14a87e5a8699b57391eff2c94f576c18" name="Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Baz.php" role="test" />
   <file md5sum="ed2a4f5ef1c5a5b94181d4caff23caff" name="Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Foo.php" role="test" />
   <file md5sum="d560ea07154ede9772e22e33f7ef7628" name="Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.php" role="test" />
   <file md5sum="393a45c8a8fc03e36dd139563e531f89" name="Symfony/Component/ClassLoader/Tests/UniversalClassLoaderTest.php" role="test" />
   <file md5sum="aaf07f8f264c4476277d3fc72ce31258" name="Symfony/Component/ClassLoader/UniversalClassLoader.php" role="php" />
   <file md5sum="c41f5cdde6c04556fa520cb0eaecb4f1" name="Symfony/Component/ClassLoader/WinCacheClassLoader.php" role="php" />
   <file md5sum="626c7922f978832591daa87ec9388708" name="Symfony/Component/ClassLoader/XcacheClassLoader.php" role="php" />
  </dir>
 </contents>
 <dependencies>
  <required>
   <php>
    <min>5.3.2</min>
   </php>
   <pearinstaller>
    <min>1.4.0</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease />
</package>
PK�^�\�T�,�,pear/OS/Guess.phpnu�[���<?php
/**
 * The OS_Guess class
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Stig Bakken <ssb@php.net>
 * @author    Gregory Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since PEAR 0.1
 */

// {{{ uname examples

// php_uname() without args returns the same as 'uname -a', or a PHP-custom
// string for Windows.
// PHP versions prior to 4.3 return the uname of the host where PHP was built,
// as of 4.3 it returns the uname of the host running the PHP code.
//
// PC RedHat Linux 7.1:
// Linux host.example.com 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown
//
// PC Debian Potato:
// Linux host 2.4.17 #2 SMP Tue Feb 12 15:10:04 CET 2002 i686 unknown
//
// PC FreeBSD 3.3:
// FreeBSD host.example.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Feb 21 00:42:31 CET 2000     root@example.com:/usr/src/sys/compile/CONFIG  i386
//
// PC FreeBSD 4.3:
// FreeBSD host.example.com 4.3-RELEASE FreeBSD 4.3-RELEASE #1: Mon Jun 25 11:19:43 EDT 2001     root@example.com:/usr/src/sys/compile/CONFIG  i386
//
// PC FreeBSD 4.5:
// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb  6 23:59:23 CET 2002     root@example.com:/usr/src/sys/compile/CONFIG  i386
//
// PC FreeBSD 4.5 w/uname from GNU shellutils:
// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb  i386 unknown
//
// HP 9000/712 HP-UX 10:
// HP-UX iq B.10.10 A 9000/712 2008429113 two-user license
//
// HP 9000/712 HP-UX 10 w/uname from GNU shellutils:
// HP-UX host B.10.10 A 9000/712 unknown
//
// IBM RS6000/550 AIX 4.3:
// AIX host 3 4 000003531C00
//
// AIX 4.3 w/uname from GNU shellutils:
// AIX host 3 4 000003531C00 unknown
//
// SGI Onyx IRIX 6.5 w/uname from GNU shellutils:
// IRIX64 host 6.5 01091820 IP19 mips
//
// SGI Onyx IRIX 6.5:
// IRIX64 host 6.5 01091820 IP19
//
// SparcStation 20 Solaris 8 w/uname from GNU shellutils:
// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc
//
// SparcStation 20 Solaris 8:
// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc SUNW,SPARCstation-20
//
// Mac OS X (Darwin)
// Darwin home-eden.local 7.5.0 Darwin Kernel Version 7.5.0: Thu Aug  5 19:26:16 PDT 2004; root:xnu/xnu-517.7.21.obj~3/RELEASE_PPC  Power Macintosh
//
// Mac OS X early versions
//

// }}}

/* TODO:
 * - define endianness, to allow matchSignature("bigend") etc.
 */

/**
 * Retrieves information about the current operating system
 *
 * This class uses php_uname() to grok information about the current OS
 *
 * @category  pear
 * @package   PEAR
 * @author    Stig Bakken <ssb@php.net>
 * @author    Gregory Beaver <cellog@php.net>
 * @copyright 1997-2020 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 0.1
 */
class OS_Guess
{
    var $sysname;
    var $nodename;
    var $cpu;
    var $release;
    var $extra;

    function __construct($uname = null)
    {
        list($this->sysname,
             $this->release,
             $this->cpu,
             $this->extra,
             $this->nodename) = $this->parseSignature($uname);
    }

    function parseSignature($uname = null)
    {
        static $sysmap = array(
            'HP-UX' => 'hpux',
            'IRIX64' => 'irix',
        );
        static $cpumap = array(
            'i586' => 'i386',
            'i686' => 'i386',
            'ppc' => 'powerpc',
        );
        if ($uname === null) {
            $uname = php_uname();
        }
        $parts = preg_split('/\s+/', trim($uname));
        $n = count($parts);

        $release  = $machine = $cpu = '';
        $sysname  = $parts[0];
        $nodename = $parts[1];
        $cpu      = $parts[$n-1];
        $extra = '';
        if ($cpu == 'unknown') {
            $cpu = $parts[$n - 2];
        }

        switch ($sysname) {
            case 'AIX' :
                $release = "$parts[3].$parts[2]";
                break;
            case 'Windows' :
                $release = $parts[1];
                if ($release == '95/98') {
                    $release = '9x';
                }
                $cpu = 'i386';
                break;
            case 'Linux' :
                $extra = $this->_detectGlibcVersion();
                // use only the first two digits from the kernel version
                $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
                break;
            case 'Mac' :
                $sysname = 'darwin';
                $nodename = $parts[2];
                $release = $parts[3];
                $cpu = $this->_determineIfPowerpc($cpu, $parts);
                break;
            case 'Darwin' :
                $cpu = $this->_determineIfPowerpc($cpu, $parts);
                $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
                break;
            default:
                $release = preg_replace('/-.*/', '', $parts[2]);
                break;
        }

        if (isset($sysmap[$sysname])) {
            $sysname = $sysmap[$sysname];
        } else {
            $sysname = strtolower($sysname);
        }
        if (isset($cpumap[$cpu])) {
            $cpu = $cpumap[$cpu];
        }
        return array($sysname, $release, $cpu, $extra, $nodename);
    }

    function _determineIfPowerpc($cpu, $parts)
    {
        $n = count($parts);
        if ($cpu == 'Macintosh' && $parts[$n - 2] == 'Power') {
            $cpu = 'powerpc';
        }
        return $cpu;
    }

    function _detectGlibcVersion()
    {
        static $glibc = false;
        if ($glibc !== false) {
            return $glibc; // no need to run this multiple times
        }
        $major = $minor = 0;
        include_once "System.php";

        // Let's try reading possible libc.so.6 symlinks
        $libcs = array(
            '/lib64/libc.so.6',
            '/lib/libc.so.6',
            '/lib/i386-linux-gnu/libc.so.6'
        );
        $versions = array();
        foreach ($libcs as $file) {
            $versions = $this->_readGlibCVersionFromSymlink($file);
            if ($versions != []) {
                list($major, $minor) = $versions;
                break;
            }
        }

        // Use glibc's <features.h> header file to
        // get major and minor version number:
        if (!($major && $minor)) {
            $versions = $this->_readGlibCVersionFromFeaturesHeaderFile();
        }
        if (is_array($versions) && $versions != []) {
            list($major, $minor) = $versions;
        }

        if (!($major && $minor)) {
            return $glibc = '';
        }

        return $glibc = "glibc{$major}.{$minor}";
    }

    function _readGlibCVersionFromSymlink($file)
    {
        $versions = array();
        if (@is_link($file)
            && (preg_match('/^libc-(.*)\.so$/', basename(readlink($file)), $matches))
        ) {
            $versions = explode('.', $matches[1]);
        }
        return $versions;
    }


    function _readGlibCVersionFromFeaturesHeaderFile()
    {
        $features_header_file = '/usr/include/features.h';
        if (!(@file_exists($features_header_file)
            && @is_readable($features_header_file))
        ) {
            return array();
        }
        if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) {
            return $this->_parseFeaturesHeaderFile($features_header_file);
        } // no cpp

        return $this->_fromGlibCTest();
    }

    function _parseFeaturesHeaderFile($features_header_file)
    {
        $features_file = fopen($features_header_file, 'rb');
        while (!feof($features_file)) {
            $line = fgets($features_file, 8192);
            if (!$this->_IsADefinition($line)) {
                continue;
            }
            if (strpos($line, '__GLIBC__')) {
                // major version number #define __GLIBC__ version
                $line = preg_split('/\s+/', $line);
                $glibc_major = trim($line[2]);
                if (isset($glibc_minor)) {
                    break;
                }
                continue;
            }

            if (strpos($line, '__GLIBC_MINOR__')) {
                // got the minor version number
                // #define __GLIBC_MINOR__ version
                $line = preg_split('/\s+/', $line);
                $glibc_minor = trim($line[2]);
                if (isset($glibc_major)) {
                    break;
                }
            }
        }
        fclose($features_file);
        if (!isset($glibc_major) || !isset($glibc_minor)) {
            return array();
        }
        return array(trim($glibc_major), trim($glibc_minor));
    }

    function _IsADefinition($line)
    {
        if ($line === false) {
            return false;
        }
        return strpos(trim($line), '#define') !== false;
    }

    function _fromGlibCTest()
    {
        $major = null;
        $minor = null;

        $tmpfile = System::mktemp("glibctest");
        $fp = fopen($tmpfile, "w");
        fwrite($fp, "#include <features.h>\n__GLIBC__ __GLIBC_MINOR__\n");
        fclose($fp);
        $cpp = popen("/usr/bin/cpp $tmpfile", "r");
        while ($line = fgets($cpp, 1024)) {
            if ($line[0] == '#' || trim($line) == '') {
                continue;
            }

            if (list($major, $minor) = explode(' ', trim($line))) {
                break;
            }
        }
        pclose($cpp);
        unlink($tmpfile);
        if ($major !== null && $minor !== null) {
            return [$major, $minor];
        }
    }

    function getSignature()
    {
        if (empty($this->extra)) {
            return "{$this->sysname}-{$this->release}-{$this->cpu}";
        }
        return "{$this->sysname}-{$this->release}-{$this->cpu}-{$this->extra}";
    }

    function getSysname()
    {
        return $this->sysname;
    }

    function getNodename()
    {
        return $this->nodename;
    }

    function getCpu()
    {
        return $this->cpu;
    }

    function getRelease()
    {
        return $this->release;
    }

    function getExtra()
    {
        return $this->extra;
    }

    function matchSignature($match)
    {
        $fragments = is_array($match) ? $match : explode('-', $match);
        $n = count($fragments);
        $matches = 0;
        if ($n > 0) {
            $matches += $this->_matchFragment($fragments[0], $this->sysname);
        }
        if ($n > 1) {
            $matches += $this->_matchFragment($fragments[1], $this->release);
        }
        if ($n > 2) {
            $matches += $this->_matchFragment($fragments[2], $this->cpu);
        }
        if ($n > 3) {
            $matches += $this->_matchFragment($fragments[3], $this->extra);
        }
        return ($matches == $n);
    }

    function _matchFragment($fragment, $value)
    {
        if (strcspn($fragment, '*?') < strlen($fragment)) {
            $expression = str_replace(
                array('*', '?', '/'),
                array('.*', '.', '\\/'),
                $fragment
            );
            $reg = '/^' . $expression . '\\z/';
            return preg_match($reg, $value);
        }
        return ($fragment == '*' || !strcasecmp($fragment, $value));
    }
}
/*
 * Local Variables:
 * indent-tabs-mode: nil
 * c-basic-offset: 4
 * End:
 */
PK�^�\ioK��pear/XML/RPC/Dump.phpnu�[���<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Function and class to dump XML_RPC_Value objects in a nice way
 *
 * Should be helpful as a normal var_dump(..) displays all internals which
 * doesn't really give you an overview due to too much information.
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Christian Weiske <cweiske@php.net>
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: Dump.php 300962 2010-07-03 02:24:24Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 */


/**
 * Pull in the XML_RPC class
 */
require_once 'XML/RPC.php';


/**
 * Generates the dump of the XML_RPC_Value and echoes it
 *
 * @param object $value  the XML_RPC_Value object to dump
 *
 * @return void
 */
function XML_RPC_Dump($value)
{
    $dumper = new XML_RPC_Dump();
    echo $dumper->generateDump($value);
}


/**
 * Class which generates a dump of a XML_RPC_Value object
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Christian Weiske <cweiske@php.net>
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Dump
{
    /**
     * The indentation array cache
     * @var array
     */
    var $arIndent      = array();

    /**
     * The spaces used for indenting the XML
     * @var string
     */
    var $strBaseIndent = '    ';

    /**
     * Returns the dump in XML format without printing it out
     *
     * @param object $value   the XML_RPC_Value object to dump
     * @param int    $nLevel  the level of indentation
     *
     * @return string  the dump
     */
    function generateDump($value, $nLevel = 0)
    {
        if (!is_object($value) || strtolower(get_class($value)) != 'xml_rpc_value') {
            require_once 'PEAR.php';
            PEAR::raiseError('Tried to dump non-XML_RPC_Value variable' . "\r\n",
                             0, PEAR_ERROR_PRINT);
            if (is_object($value)) {
                $strType = get_class($value);
            } else {
                $strType = gettype($value);
            }
            return $this->getIndent($nLevel) . 'NOT A XML_RPC_Value: '
                   . $strType . "\r\n";
        }

        switch ($value->kindOf()) {
        case 'struct':
            $ret = $this->genStruct($value, $nLevel);
            break;
        case 'array':
            $ret = $this->genArray($value, $nLevel);
            break;
        case 'scalar':
            $ret = $this->genScalar($value->scalarval(), $nLevel);
            break;
        default:
            require_once 'PEAR.php';
            PEAR::raiseError('Illegal type "' . $value->kindOf()
                             . '" in XML_RPC_Value' . "\r\n", 0,
                             PEAR_ERROR_PRINT);
        }

        return $ret;
    }

    /**
     * Returns the scalar value dump
     *
     * @param object $value   the scalar XML_RPC_Value object to dump
     * @param int    $nLevel  the level of indentation
     *
     * @return string  Dumped version of the scalar value
     */
    function genScalar($value, $nLevel)
    {
        if (gettype($value) == 'object') {
            $strClass = ' ' . get_class($value);
        } else {
            $strClass = '';
        }
        return $this->getIndent($nLevel) . gettype($value) . $strClass
               . ' ' . $value . "\r\n";
    }

    /**
     * Returns the dump of a struct
     *
     * @param object $value   the struct XML_RPC_Value object to dump
     * @param int    $nLevel  the level of indentation
     *
     * @return string  Dumped version of the scalar value
     */
    function genStruct($value, $nLevel)
    {
        $value->structreset();
        $strOutput = $this->getIndent($nLevel) . 'struct' . "\r\n";
        while (list($key, $keyval) = $value->structeach()) {
            $strOutput .= $this->getIndent($nLevel + 1) . $key . "\r\n";
            $strOutput .= $this->generateDump($keyval, $nLevel + 2);
        }
        return $strOutput;
    }

    /**
     * Returns the dump of an array
     *
     * @param object $value   the array XML_RPC_Value object to dump
     * @param int    $nLevel  the level of indentation
     *
     * @return string  Dumped version of the scalar value
     */
    function genArray($value, $nLevel)
    {
        $nSize     = $value->arraysize();
        $strOutput = $this->getIndent($nLevel) . 'array' . "\r\n";
        for($nA = 0; $nA < $nSize; $nA++) {
            $strOutput .= $this->getIndent($nLevel + 1) . $nA . "\r\n";
            $strOutput .= $this->generateDump($value->arraymem($nA),
                                              $nLevel + 2);
        }
        return $strOutput;
    }

    /**
     * Returns the indent for a specific level and caches it for faster use
     *
     * @param int $nLevel  the level
     *
     * @return string  the indented string
     */
    function getIndent($nLevel)
    {
        if (!isset($this->arIndent[$nLevel])) {
            $this->arIndent[$nLevel] = str_repeat($this->strBaseIndent, $nLevel);
        }
        return $this->arIndent[$nLevel];
    }
}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * c-hanging-comment-ender-p: nil
 * End:
 */

?>
PK�^�\G�J�W�Wpear/XML/RPC/Server.phpnu�[���<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Server commands for our PHP implementation of the XML-RPC protocol
 *
 * This is a PEAR-ified version of Useful inc's XML-RPC for PHP.
 * It has support for HTTP transport, proxies and authentication.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: Server.php 315558 2011-08-26 14:42:51Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 */


/**
 * Pull in the XML_RPC class
 */
require_once 'XML/RPC.php';


/**
 * signature for system.listMethods: return = array,
 * parameters = a string or nothing
 * @global array $GLOBALS['XML_RPC_Server_listMethods_sig']
 */
$GLOBALS['XML_RPC_Server_listMethods_sig'] = array(
    array($GLOBALS['XML_RPC_Array'],
          $GLOBALS['XML_RPC_String']
    ),
    array($GLOBALS['XML_RPC_Array'])
);

/**
 * docstring for system.listMethods
 * @global string $GLOBALS['XML_RPC_Server_listMethods_doc']
 */
$GLOBALS['XML_RPC_Server_listMethods_doc'] = 'This method lists all the'
        . ' methods that the XML-RPC server knows how to dispatch';

/**
 * signature for system.methodSignature: return = array,
 * parameters = string
 * @global array $GLOBALS['XML_RPC_Server_methodSignature_sig']
 */
$GLOBALS['XML_RPC_Server_methodSignature_sig'] = array(
    array($GLOBALS['XML_RPC_Array'],
          $GLOBALS['XML_RPC_String']
    )
);

/**
 * docstring for system.methodSignature
 * @global string $GLOBALS['XML_RPC_Server_methodSignature_doc']
 */
$GLOBALS['XML_RPC_Server_methodSignature_doc'] = 'Returns an array of known'
        . ' signatures (an array of arrays) for the method name passed. If'
        . ' no signatures are known, returns a none-array (test for type !='
        . ' array to detect missing signature)';

/**
 * signature for system.methodHelp: return = string,
 * parameters = string
 * @global array $GLOBALS['XML_RPC_Server_methodHelp_sig']
 */
$GLOBALS['XML_RPC_Server_methodHelp_sig'] = array(
    array($GLOBALS['XML_RPC_String'],
          $GLOBALS['XML_RPC_String']
    )
);

/**
 * docstring for methodHelp
 * @global string $GLOBALS['XML_RPC_Server_methodHelp_doc']
 */
$GLOBALS['XML_RPC_Server_methodHelp_doc'] = 'Returns help text if defined'
        . ' for the method passed, otherwise returns an empty string';

/**
 * dispatch map for the automatically declared XML-RPC methods.
 * @global array $GLOBALS['XML_RPC_Server_dmap']
 */
$GLOBALS['XML_RPC_Server_dmap'] = array(
    'system.listMethods' => array(
        'function'  => 'XML_RPC_Server_listMethods',
        'signature' => $GLOBALS['XML_RPC_Server_listMethods_sig'],
        'docstring' => $GLOBALS['XML_RPC_Server_listMethods_doc']
    ),
    'system.methodHelp' => array(
        'function'  => 'XML_RPC_Server_methodHelp',
        'signature' => $GLOBALS['XML_RPC_Server_methodHelp_sig'],
        'docstring' => $GLOBALS['XML_RPC_Server_methodHelp_doc']
    ),
    'system.methodSignature' => array(
        'function'  => 'XML_RPC_Server_methodSignature',
        'signature' => $GLOBALS['XML_RPC_Server_methodSignature_sig'],
        'docstring' => $GLOBALS['XML_RPC_Server_methodSignature_doc']
    )
);

/**
 * @global string $GLOBALS['XML_RPC_Server_debuginfo']
 */
$GLOBALS['XML_RPC_Server_debuginfo'] = '';


/**
 * Lists all the methods that the XML-RPC server knows how to dispatch
 *
 * @return object  a new XML_RPC_Response object
 */
function XML_RPC_Server_listMethods($server, $m)
{
    global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;

    $v = new XML_RPC_Value();
    $outAr = array();
    foreach ($server->dmap as $key => $val) {
        $outAr[] = new XML_RPC_Value($key, 'string');
    }
    foreach ($XML_RPC_Server_dmap as $key => $val) {
        $outAr[] = new XML_RPC_Value($key, 'string');
    }
    $v->addArray($outAr);
    return new XML_RPC_Response($v);
}

/**
 * Returns an array of known signatures (an array of arrays)
 * for the given method
 *
 * If no signatures are known, returns a none-array
 * (test for type != array to detect missing signature)
 *
 * @return object  a new XML_RPC_Response object
 */
function XML_RPC_Server_methodSignature($server, $m)
{
    global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;

    $methName = $m->getParam(0);
    $methName = $methName->scalarval();
    if (strpos($methName, 'system.') === 0) {
        $dmap = $XML_RPC_Server_dmap;
        $sysCall = 1;
    } else {
        $dmap = $server->dmap;
        $sysCall = 0;
    }
    //  print "<!-- ${methName} -->\n";
    if (isset($dmap[$methName])) {
        if ($dmap[$methName]['signature']) {
            $sigs = array();
            $thesigs = $dmap[$methName]['signature'];
            for ($i = 0; $i < sizeof($thesigs); $i++) {
                $cursig = array();
                $inSig = $thesigs[$i];
                for ($j = 0; $j < sizeof($inSig); $j++) {
                    $cursig[] = new XML_RPC_Value($inSig[$j], 'string');
                }
                $sigs[] = new XML_RPC_Value($cursig, 'array');
            }
            $r = new XML_RPC_Response(new XML_RPC_Value($sigs, 'array'));
        } else {
            $r = new XML_RPC_Response(new XML_RPC_Value('undef', 'string'));
        }
    } else {
        $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'],
                                  $XML_RPC_str['introspect_unknown']);
    }
    return $r;
}

/**
 * Returns help text if defined for the method passed, otherwise returns
 * an empty string
 *
 * @return object  a new XML_RPC_Response object
 */
function XML_RPC_Server_methodHelp($server, $m)
{
    global $XML_RPC_err, $XML_RPC_str, $XML_RPC_Server_dmap;

    $methName = $m->getParam(0);
    $methName = $methName->scalarval();
    if (strpos($methName, 'system.') === 0) {
        $dmap = $XML_RPC_Server_dmap;
        $sysCall = 1;
    } else {
        $dmap = $server->dmap;
        $sysCall = 0;
    }

    if (isset($dmap[$methName])) {
        if ($dmap[$methName]['docstring']) {
            $r = new XML_RPC_Response(new XML_RPC_Value($dmap[$methName]['docstring']),
                                                        'string');
        } else {
            $r = new XML_RPC_Response(new XML_RPC_Value('', 'string'));
        }
    } else {
        $r = new XML_RPC_Response(0, $XML_RPC_err['introspect_unknown'],
                                     $XML_RPC_str['introspect_unknown']);
    }
    return $r;
}

/**
 * @return void
 */
function XML_RPC_Server_debugmsg($m)
{
    global $XML_RPC_Server_debuginfo;
    $XML_RPC_Server_debuginfo = $XML_RPC_Server_debuginfo . $m . "\n";
}


/**
 * A server for receiving and replying to XML RPC requests
 *
 * <code>
 * $server = new XML_RPC_Server(
 *     array(
 *         'isan8' =>
 *             array(
 *                 'function' => 'is_8',
 *                 'signature' =>
 *                      array(
 *                          array('boolean', 'int'),
 *                          array('boolean', 'int', 'boolean'),
 *                          array('boolean', 'string'),
 *                          array('boolean', 'string', 'boolean'),
 *                      ),
 *                 'docstring' => 'Is the value an 8?'
 *             ),
 *     ),
 *     1,
 *     0
 * ); 
 * </code>
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Server
{
    /**
     * Should the payload's content be passed through mb_convert_encoding()?
     *
     * @see XML_RPC_Server::setConvertPayloadEncoding()
     * @since Property available since Release 1.5.1
     * @var boolean
     */
    var $convert_payload_encoding = false;

    /**
     * The dispatch map, listing the methods this server provides.
     * @var array
     */
    var $dmap = array();

    /**
     * The present response's encoding
     * @var string
     * @see XML_RPC_Message::getEncoding()
     */
    var $encoding = '';

    /**
     * Debug mode (0 = off, 1 = on)
     * @var integer
     */
    var $debug = 0;

    /**
     * The response's HTTP headers
     * @var string
     */
    var $server_headers = '';

    /**
     * The response's XML payload
     * @var string
     */
    var $server_payload = '';


    /**
     * Constructor for the XML_RPC_Server class
     *
     * @param array $dispMap   the dispatch map. An associative array
     *                          explaining each function. The keys of the main
     *                          array are the procedure names used by the
     *                          clients. The value is another associative array
     *                          that contains up to three elements:
     *                            + The 'function' element's value is the name
     *                              of the function or method that gets called.
     *                              To define a class' method: 'class::method'.
     *                            + The 'signature' element (optional) is an
     *                              array describing the return values and
     *                              parameters
     *                            + The 'docstring' element (optional) is a
     *                              string describing what the method does
     * @param int $serviceNow  should the HTTP response be sent now?
     *                          (1 = yes, 0 = no)
     * @param int $debug       should debug output be displayed?
     *                          (1 = yes, 0 = no)
     *
     * @return void
     */
    function XML_RPC_Server($dispMap, $serviceNow = 1, $debug = 0)
    {
        global $HTTP_RAW_POST_DATA;

        if ($debug) {
            $this->debug = 1;
        } else {
            $this->debug = 0;
        }

        $this->dmap = $dispMap;

        if ($serviceNow) {
            $this->service();
        } else {
            $this->createServerPayload();
            $this->createServerHeaders();
        }
    }

    /**
     * @return string  the debug information if debug debug mode is on
     */
    function serializeDebug()
    {
        global $XML_RPC_Server_debuginfo, $HTTP_RAW_POST_DATA;

        if ($this->debug) {
            XML_RPC_Server_debugmsg('vvv POST DATA RECEIVED BY SERVER vvv' . "\n"
                                    . $HTTP_RAW_POST_DATA
                                    . "\n" . '^^^ END POST DATA ^^^');
        }

        if ($XML_RPC_Server_debuginfo != '') {
            return "<!-- PEAR XML_RPC SERVER DEBUG INFO:\n\n"
                   . str_replace('--', '- - ', $XML_RPC_Server_debuginfo)
                   . "-->\n";
        } else {
            return '';
        }
    }

    /**
     * Sets whether the payload's content gets passed through
     * mb_convert_encoding()
     *
     * Returns PEAR_ERROR object if mb_convert_encoding() isn't available.
     *
     * @param int $in  where 1 = on, 0 = off
     *
     * @return void
     *
     * @see XML_RPC_Message::getEncoding()
     * @since Method available since Release 1.5.1
     */
    function setConvertPayloadEncoding($in)
    {
        if ($in && !function_exists('mb_convert_encoding')) {
            return $this->raiseError('mb_convert_encoding() is not available',
                              XML_RPC_ERROR_PROGRAMMING);
        }
        $this->convert_payload_encoding = $in;
    }

    /**
     * Sends the response
     *
     * The encoding and content-type are determined by
     * XML_RPC_Message::getEncoding()
     *
     * @return void
     *
     * @uses XML_RPC_Server::createServerPayload(),
     *       XML_RPC_Server::createServerHeaders()
     */
    function service()
    {
        if (!$this->server_payload) {
            $this->createServerPayload();
        }
        if (!$this->server_headers) {
            $this->createServerHeaders();
        }

        /*
         * $server_headers needs to remain a string for compatibility with
         * old scripts using this package, but PHP 4.4.2 no longer allows
         * line breaks in header() calls.  So, we split each header into
         * an individual call.  The initial replace handles the off chance
         * that someone composed a single header with multiple lines, which
         * the RFCs allow.
         */
        $this->server_headers = preg_replace("@[\r\n]+[ \t]+@",
                                ' ', trim($this->server_headers));
        $headers = preg_split("@[\r\n]+@", $this->server_headers);
        foreach ($headers as $header)
        {
            header($header);
        }

        print $this->server_payload;
    }

    /**
     * Generates the payload and puts it in the $server_payload property
     *
     * If XML_RPC_Server::setConvertPayloadEncoding() was set to true,
     * the payload gets passed through mb_convert_encoding()
     * to ensure the payload matches the encoding set in the
     * XML declaration.  The encoding type can be manually set via
     * XML_RPC_Message::setSendEncoding().
     *
     * @return void
     *
     * @uses XML_RPC_Server::parseRequest(), XML_RPC_Server::$encoding,
     *       XML_RPC_Response::serialize(), XML_RPC_Server::serializeDebug()
     * @see  XML_RPC_Server::setConvertPayloadEncoding()
     */
    function createServerPayload()
    {
        $r = $this->parseRequest();
        $this->server_payload = '<?xml version="1.0" encoding="'
                              . $this->encoding . '"?>' . "\n"
                              . $this->serializeDebug()
                              . $r->serialize();
        if ($this->convert_payload_encoding) {
            $this->server_payload = mb_convert_encoding($this->server_payload,
                                                        $this->encoding);
        }
    }

    /**
     * Determines the HTTP headers and puts them in the $server_headers
     * property
     *
     * @return boolean  TRUE if okay, FALSE if $server_payload isn't set.
     *
     * @uses XML_RPC_Server::createServerPayload(),
     *       XML_RPC_Server::$server_headers
     */
    function createServerHeaders()
    {
        if (!$this->server_payload) {
            return false;
        }
        $this->server_headers = 'Content-Length: '
                              . strlen($this->server_payload) . "\r\n"
                              . 'Content-Type: text/xml;'
                              . ' charset=' . $this->encoding;
        return true;
    }

    /**
     * @return array
     */
    function verifySignature($in, $sig)
    {
        for ($i = 0; $i < sizeof($sig); $i++) {
            // check each possible signature in turn
            $cursig = $sig[$i];
            if (sizeof($cursig) == $in->getNumParams() + 1) {
                $itsOK = 1;
                for ($n = 0; $n < $in->getNumParams(); $n++) {
                    $p = $in->getParam($n);
                    // print "<!-- $p -->\n";
                    if ($p->kindOf() == 'scalar') {
                        $pt = $p->scalartyp();
                    } else {
                        $pt = $p->kindOf();
                    }
                    // $n+1 as first type of sig is return type
                    if ($pt != $cursig[$n+1]) {
                        $itsOK = 0;
                        $pno = $n+1;
                        $wanted = $cursig[$n+1];
                        $got = $pt;
                        break;
                    }
                }
                if ($itsOK) {
                    return array(1);
                }
            }
        }
        if (isset($wanted)) {
            return array(0, "Wanted ${wanted}, got ${got} at param ${pno}");
        } else {
            $allowed = array();
            foreach ($sig as $val) {
                end($val);
                $allowed[] = key($val);
            }
            $allowed = array_unique($allowed);
            $last = count($allowed) - 1;
            if ($last > 0) {
                $allowed[$last] = 'or ' . $allowed[$last];
            }
            return array(0,
                         'Signature permits ' . implode(', ', $allowed)
                                . ' parameters but the request had '
                                . $in->getNumParams());
        }
    }

    /**
     * @return object  a new XML_RPC_Response object
     *
     * @uses XML_RPC_Message::getEncoding(), XML_RPC_Server::$encoding
     */
    function parseRequest($data = '')
    {
        global $XML_RPC_xh, $HTTP_RAW_POST_DATA,
                $XML_RPC_err, $XML_RPC_str, $XML_RPC_errxml,
                $XML_RPC_defencoding, $XML_RPC_Server_dmap;

        if ($data == '') {
            $data = $HTTP_RAW_POST_DATA;
        }

        $this->encoding = XML_RPC_Message::getEncoding($data);
        $parser_resource = xml_parser_create($this->encoding);
        $parser = (int) $parser_resource;

        $XML_RPC_xh[$parser] = array();
        $XML_RPC_xh[$parser]['cm']     = 0;
        $XML_RPC_xh[$parser]['isf']    = 0;
        $XML_RPC_xh[$parser]['params'] = array();
        $XML_RPC_xh[$parser]['method'] = '';
        $XML_RPC_xh[$parser]['stack'] = array();	
        $XML_RPC_xh[$parser]['valuestack'] = array();	

        $plist = '';

        // decompose incoming XML into request structure

        xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
        xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee');
        xml_set_character_data_handler($parser_resource, 'XML_RPC_cd');
        if (!xml_parse($parser_resource, $data, 1)) {
            // return XML error as a faultCode
            $r = new XML_RPC_Response(0,
                                      $XML_RPC_errxml+xml_get_error_code($parser_resource),
                                      sprintf('XML error: %s at line %d',
                                              xml_error_string(xml_get_error_code($parser_resource)),
                                              xml_get_current_line_number($parser_resource)));
            xml_parser_free($parser_resource);
        } elseif ($XML_RPC_xh[$parser]['isf']>1) {
            $r = new XML_RPC_Response(0,
                                      $XML_RPC_err['invalid_request'],
                                      $XML_RPC_str['invalid_request']
                                      . ': '
                                      . $XML_RPC_xh[$parser]['isf_reason']);
            xml_parser_free($parser_resource);
        } else {
            xml_parser_free($parser_resource);
            $m = new XML_RPC_Message($XML_RPC_xh[$parser]['method']);
            // now add parameters in
            for ($i = 0; $i < sizeof($XML_RPC_xh[$parser]['params']); $i++) {
                // print '<!-- ' . $XML_RPC_xh[$parser]['params'][$i]. "-->\n";
                $plist .= "$i - " . var_export($XML_RPC_xh[$parser]['params'][$i], true) . " \n";
                $m->addParam($XML_RPC_xh[$parser]['params'][$i]);
            }

            if ($this->debug) {
                XML_RPC_Server_debugmsg($plist);
            }

            // now to deal with the method
            $methName = $XML_RPC_xh[$parser]['method'];
            if (strpos($methName, 'system.') === 0) {
                $dmap = $XML_RPC_Server_dmap;
                $sysCall = 1;
            } else {
                $dmap = $this->dmap;
                $sysCall = 0;
            }

            if (isset($dmap[$methName]['function'])
                && is_string($dmap[$methName]['function'])
                && strpos($dmap[$methName]['function'], '::') !== false)
            {
                $dmap[$methName]['function'] =
                        explode('::', $dmap[$methName]['function']);
            }

            if (isset($dmap[$methName]['function'])
                && is_callable($dmap[$methName]['function']))
            {
                // dispatch if exists
                if (isset($dmap[$methName]['signature'])) {
                    $sr = $this->verifySignature($m,
                                                 $dmap[$methName]['signature'] );
                }
                if (!isset($dmap[$methName]['signature']) || $sr[0]) {
                    // if no signature or correct signature
                    if ($sysCall) {
                        $r = call_user_func($dmap[$methName]['function'], $this, $m);
                    } else {
                        $r = call_user_func($dmap[$methName]['function'], $m);
                    }
                    if (!is_object($r) || !is_a($r, 'XML_RPC_Response')) {
                        $r = new XML_RPC_Response(0, $XML_RPC_err['not_response_object'],
                                                  $XML_RPC_str['not_response_object']);
                    }
                } else {
                    $r = new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'],
                                              $XML_RPC_str['incorrect_params']
                                              . ': ' . $sr[1]);
                }
            } else {
                // else prepare error response
                $r = new XML_RPC_Response(0, $XML_RPC_err['unknown_method'],
                                          $XML_RPC_str['unknown_method']);
            }
        }
        return $r;
    }

    /**
     * Echos back the input packet as a string value
     *
     * @return void
     *
     * Useful for debugging.
     */
    function echoInput()
    {
        global $HTTP_RAW_POST_DATA;

        $r = new XML_RPC_Response(0);
        $r->xv = new XML_RPC_Value("'Aha said I: '" . $HTTP_RAW_POST_DATA, 'string');
        print $r->serialize();
    }
}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * c-hanging-comment-ender-p: nil
 * End:
 */

?>
PK�^�\c���}�}pear/XML/Util.phpnu�[���<?php
/**
 * XML_Util
 *
 * XML Utilities package
 *
 * PHP versions 4 and 5
 *
 * LICENSE:
 *
 * Copyright (c) 2003-2008 Stephan Schmidt <schst@php.net>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *    * The name of the author may not be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category  XML
 * @package   XML_Util
 * @author    Stephan Schmidt <schst@php.net>
 * @copyright 2003-2008 Stephan Schmidt <schst@php.net>
 * @license   http://opensource.org/licenses/bsd-license New BSD License
 * @version   CVS: $Id$
 * @link      http://pear.php.net/package/XML_Util
 */

/**
 * Error code for invalid chars in XML name
 */
define('XML_UTIL_ERROR_INVALID_CHARS', 51);

/**
 * Error code for invalid chars in XML name
 */
define('XML_UTIL_ERROR_INVALID_START', 52);

/**
 * Error code for non-scalar tag content
 */
define('XML_UTIL_ERROR_NON_SCALAR_CONTENT', 60);

/**
 * Error code for missing tag name
 */
define('XML_UTIL_ERROR_NO_TAG_NAME', 61);

/**
 * Replace XML entities
 */
define('XML_UTIL_REPLACE_ENTITIES', 1);

/**
 * Embedd content in a CData Section
 */
define('XML_UTIL_CDATA_SECTION', 5);

/**
 * Do not replace entitites
 */
define('XML_UTIL_ENTITIES_NONE', 0);

/**
 * Replace all XML entitites
 * This setting will replace <, >, ", ' and &
 */
define('XML_UTIL_ENTITIES_XML', 1);

/**
 * Replace only required XML entitites
 * This setting will replace <, " and &
 */
define('XML_UTIL_ENTITIES_XML_REQUIRED', 2);

/**
 * Replace HTML entitites
 * @link http://www.php.net/htmlentities
 */
define('XML_UTIL_ENTITIES_HTML', 3);

/**
 * Do not collapse any empty tags.
 */
define('XML_UTIL_COLLAPSE_NONE', 0);

/**
 * Collapse all empty tags.
 */
define('XML_UTIL_COLLAPSE_ALL', 1);

/**
 * Collapse only empty XHTML tags that have no end tag.
 */
define('XML_UTIL_COLLAPSE_XHTML_ONLY', 2);

/**
 * Utility class for working with XML documents
 *
 * @category  XML
 * @package   XML_Util
 * @author    Stephan Schmidt <schst@php.net>
 * @copyright 2003-2008 Stephan Schmidt <schst@php.net>
 * @license   http://opensource.org/licenses/bsd-license New BSD License
 * @version   Release: 1.4.5
 * @link      http://pear.php.net/package/XML_Util
 */
class XML_Util
{
    /**
     * Return API version
     *
     * @return string $version API version
     */
    public static function apiVersion()
    {
        return '1.4';
    }

    /**
     * Replace XML entities
     *
     * With the optional second parameter, you may select, which
     * entities should be replaced.
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // replace XML entites:
     * $string = XML_Util::replaceEntities('This string contains < & >.');
     * </code>
     *
     * With the optional third parameter, you may pass the character encoding
     * <code>
     * require_once 'XML/Util.php';
     *
     * // replace XML entites in UTF-8:
     * $string = XML_Util::replaceEntities(
     *     'This string contains < & > as well as ä, ö, ß, à and ê',
     *     XML_UTIL_ENTITIES_HTML,
     *     'UTF-8'
     * );
     * </code>
     *
     * @param string $string          string where XML special chars
     *                                should be replaced
     * @param int    $replaceEntities setting for entities in attribute values
     *                                (one of XML_UTIL_ENTITIES_XML,
     *                                XML_UTIL_ENTITIES_XML_REQUIRED,
     *                                XML_UTIL_ENTITIES_HTML)
     * @param string $encoding        encoding value (if any)...
     *                                must be a valid encoding as determined
     *                                by the htmlentities() function
     *
     * @return string string with replaced chars
     * @see    reverseEntities()
     */
    public static function replaceEntities(
        $string, $replaceEntities = XML_UTIL_ENTITIES_XML, $encoding = 'ISO-8859-1'
    ) {
        switch ($replaceEntities) {
        case XML_UTIL_ENTITIES_XML:
            return strtr(
                $string,
                array(
                    '&'  => '&amp;',
                    '>'  => '&gt;',
                    '<'  => '&lt;',
                    '"'  => '&quot;',
                    '\'' => '&apos;'
                )
            );
            break;
        case XML_UTIL_ENTITIES_XML_REQUIRED:
            return strtr(
                $string,
                array(
                    '&' => '&amp;',
                    '<' => '&lt;',
                    '"' => '&quot;'
                )
            );
            break;
        case XML_UTIL_ENTITIES_HTML:
            return htmlentities($string, ENT_COMPAT, $encoding);
            break;
        }
        return $string;
    }

    /**
     * Reverse XML entities
     *
     * With the optional second parameter, you may select, which
     * entities should be reversed.
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // reverse XML entites:
     * $string = XML_Util::reverseEntities('This string contains &lt; &amp; &gt;.');
     * </code>
     *
     * With the optional third parameter, you may pass the character encoding
     * <code>
     * require_once 'XML/Util.php';
     *
     * // reverse XML entites in UTF-8:
     * $string = XML_Util::reverseEntities(
     *     'This string contains &lt; &amp; &gt; as well as'
     *     . ' &auml;, &ouml;, &szlig;, &agrave; and &ecirc;',
     *     XML_UTIL_ENTITIES_HTML,
     *     'UTF-8'
     * );
     * </code>
     *
     * @param string $string          string where XML special chars
     *                                should be replaced
     * @param int    $replaceEntities setting for entities in attribute values
     *                                (one of XML_UTIL_ENTITIES_XML,
     *                                XML_UTIL_ENTITIES_XML_REQUIRED,
     *                                XML_UTIL_ENTITIES_HTML)
     * @param string $encoding        encoding value (if any)...
     *                                must be a valid encoding as determined
     *                                by the html_entity_decode() function
     *
     * @return string string with replaced chars
     * @see    replaceEntities()
     */
    public static function reverseEntities(
        $string, $replaceEntities = XML_UTIL_ENTITIES_XML, $encoding = 'ISO-8859-1'
    ) {
        switch ($replaceEntities) {
        case XML_UTIL_ENTITIES_XML:
            return strtr(
                $string,
                array(
                    '&amp;'  => '&',
                    '&gt;'   => '>',
                    '&lt;'   => '<',
                    '&quot;' => '"',
                    '&apos;' => '\''
                )
            );
            break;
        case XML_UTIL_ENTITIES_XML_REQUIRED:
            return strtr(
                $string,
                array(
                    '&amp;'  => '&',
                    '&lt;'   => '<',
                    '&quot;' => '"'
                )
            );
            break;
        case XML_UTIL_ENTITIES_HTML:
            return html_entity_decode($string, ENT_COMPAT, $encoding);
            break;
        }
        return $string;
    }

    /**
     * Build an xml declaration
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // get an XML declaration:
     * $xmlDecl = XML_Util::getXMLDeclaration('1.0', 'UTF-8', true);
     * </code>
     *
     * @param string $version    xml version
     * @param string $encoding   character encoding
     * @param bool   $standalone document is standalone (or not)
     *
     * @return string xml declaration
     * @uses   attributesToString() to serialize the attributes of the
     *         XML declaration
     */
    public static function getXMLDeclaration(
        $version = '1.0', $encoding = null, $standalone = null
    ) {
        $attributes = array(
            'version' => $version,
        );
        // add encoding
        if ($encoding !== null) {
            $attributes['encoding'] = $encoding;
        }
        // add standalone, if specified
        if ($standalone !== null) {
            $attributes['standalone'] = $standalone ? 'yes' : 'no';
        }

        return sprintf(
            '<?xml%s?>',
            XML_Util::attributesToString($attributes, false)
        );
    }

    /**
     * Build a document type declaration
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // get a doctype declaration:
     * $xmlDecl = XML_Util::getDocTypeDeclaration('rootTag','myDocType.dtd');
     * </code>
     *
     * @param string $root        name of the root tag
     * @param string $uri         uri of the doctype definition
     *                            (or array with uri and public id)
     * @param string $internalDtd internal dtd entries
     *
     * @return string doctype declaration
     * @since  0.2
     */
    public static function getDocTypeDeclaration(
        $root, $uri = null, $internalDtd = null
    ) {
        if (is_array($uri)) {
            $ref = sprintf(' PUBLIC "%s" "%s"', $uri['id'], $uri['uri']);
        } elseif (!empty($uri)) {
            $ref = sprintf(' SYSTEM "%s"', $uri);
        } else {
            $ref = '';
        }

        if (empty($internalDtd)) {
            return sprintf('<!DOCTYPE %s%s>', $root, $ref);
        } else {
            return sprintf("<!DOCTYPE %s%s [\n%s\n]>", $root, $ref, $internalDtd);
        }
    }

    /**
     * Create string representation of an attribute list
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // build an attribute string
     * $att = array(
     *              'foo'   =>  'bar',
     *              'argh'  =>  'tomato'
     *            );
     *
     * $attList = XML_Util::attributesToString($att);
     * </code>
     *
     * @param array      $attributes attribute array
     * @param bool|array $sort       sort attribute list alphabetically,
     *                               may also be an assoc array containing
     *                               the keys 'sort', 'multiline', 'indent',
     *                               'linebreak' and 'entities'
     * @param bool       $multiline  use linebreaks, if more than
     *                               one attribute is given
     * @param string     $indent     string used for indentation of
     *                               multiline attributes
     * @param string     $linebreak  string used for linebreaks of
     *                               multiline attributes
     * @param int        $entities   setting for entities in attribute values
     *                               (one of XML_UTIL_ENTITIES_NONE,
     *                               XML_UTIL_ENTITIES_XML,
     *                               XML_UTIL_ENTITIES_XML_REQUIRED,
     *                               XML_UTIL_ENTITIES_HTML)
     *
     * @return string string representation of the attributes
     * @uses   replaceEntities() to replace XML entities in attribute values
     * @todo   allow sort also to be an options array
     */
    public static function attributesToString(
        $attributes, $sort = true, $multiline = false,
        $indent = '    ', $linebreak = "\n", $entities = XML_UTIL_ENTITIES_XML
    ) {
        /*
         * second parameter may be an array
         */
        if (is_array($sort)) {
            if (isset($sort['multiline'])) {
                $multiline = $sort['multiline'];
            }
            if (isset($sort['indent'])) {
                $indent = $sort['indent'];
            }
            if (isset($sort['linebreak'])) {
                $multiline = $sort['linebreak'];
            }
            if (isset($sort['entities'])) {
                $entities = $sort['entities'];
            }
            if (isset($sort['sort'])) {
                $sort = $sort['sort'];
            } else {
                $sort = true;
            }
        }
        $string = '';
        if (is_array($attributes) && !empty($attributes)) {
            if ($sort) {
                ksort($attributes);
            }
            if (!$multiline || count($attributes) == 1) {
                foreach ($attributes as $key => $value) {
                    if ($entities != XML_UTIL_ENTITIES_NONE) {
                        if ($entities === XML_UTIL_CDATA_SECTION) {
                            $entities = XML_UTIL_ENTITIES_XML;
                        }
                        $value = XML_Util::replaceEntities($value, $entities);
                    }
                    $string .= ' ' . $key . '="' . $value . '"';
                }
            } else {
                $first = true;
                foreach ($attributes as $key => $value) {
                    if ($entities != XML_UTIL_ENTITIES_NONE) {
                        $value = XML_Util::replaceEntities($value, $entities);
                    }
                    if ($first) {
                        $string .= ' ' . $key . '="' . $value . '"';
                        $first   = false;
                    } else {
                        $string .= $linebreak . $indent . $key . '="' . $value . '"';
                    }
                }
            }
        }
        return $string;
    }

    /**
     * Collapses empty tags.
     *
     * @param string $xml  XML
     * @param int    $mode Whether to collapse all empty tags (XML_UTIL_COLLAPSE_ALL)
     *                      or only XHTML (XML_UTIL_COLLAPSE_XHTML_ONLY) ones.
     *
     * @return string XML
     */
    public static function collapseEmptyTags($xml, $mode = XML_UTIL_COLLAPSE_ALL)
    {
        if (preg_match('~<([^>])+/>~s', $xml, $matches)) {
            // it's already an empty tag
            return $xml;
        }
        switch ($mode) {
            case XML_UTIL_COLLAPSE_ALL:
                $preg1 =
                    '~<' .
                        '(?:' .
                            '(https?://[^:\s]+:\w+)' .  // <http://foo.com:bar  ($1)
                            '|(\w+:\w+)' .              // <foo:bar             ($2)
                            '|(\w+)' .                  // <foo                 ($3)
                        ')+' .
                        '([^>]*)' .                     // attributes           ($4)
                    '>' .
                    '<\/(\1|\2|\3)>' .                  // 1, 2, or 3 again     ($5)
                    '~s'
                ;
                $preg2 =
                    '<' .
                        '${1}${2}${3}' .    // tag (only one should have been populated)
                        '${4}' .            // attributes
                    ' />'
                ;
                return (preg_replace($preg1, $preg2, $xml)?:$xml);
                break;
            case XML_UTIL_COLLAPSE_XHTML_ONLY:
                return (
                    preg_replace(
                        '/<(area|base(?:font)?|br|col|frame|hr|img|input|isindex|link|meta|'
                        . 'param)([^>]*)><\/\\1>/s',
                        '<\\1\\2 />',
                        $xml
                    ) ?: $xml
                );
                break;
            case XML_UTIL_COLLAPSE_NONE:
                // fall thru
            default:
                return $xml;
        }
    }

    /**
     * Create a tag
     *
     * This method will call XML_Util::createTagFromArray(), which
     * is more flexible.
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // create an XML tag:
     * $tag = XML_Util::createTag('myNs:myTag',
     *     array('foo' => 'bar'),
     *     'This is inside the tag',
     *     'http://www.w3c.org/myNs#');
     * </code>
     *
     * @param string $qname           qualified tagname (including namespace)
     * @param array  $attributes      array containg attributes
     * @param mixed  $content         the content
     * @param string $namespaceUri    URI of the namespace
     * @param int    $replaceEntities whether to replace XML special chars in
     *                                content, embedd it in a CData section
     *                                or none of both
     * @param bool   $multiline       whether to create a multiline tag where
     *                                each attribute gets written to a single line
     * @param string $indent          string used to indent attributes
     *                                (_auto indents attributes so they start
     *                                at the same column)
     * @param string $linebreak       string used for linebreaks
     * @param bool   $sortAttributes  Whether to sort the attributes or not
     * @param int    $collapseTagMode How to handle a content-less, and thus collapseable, tag
     *
     * @return string XML tag
     * @see    createTagFromArray()
     * @uses   createTagFromArray() to create the tag
     */
    public static function createTag(
        $qname, $attributes = array(), $content = null,
        $namespaceUri = null, $replaceEntities = XML_UTIL_REPLACE_ENTITIES,
        $multiline = false, $indent = '_auto', $linebreak = "\n",
        $sortAttributes = true, $collapseTagMode = XML_UTIL_COLLAPSE_ALL
    ) {
        $tag = array(
            'qname'      => $qname,
            'attributes' => $attributes
        );

        // add tag content
        if ($content !== null) {
            $tag['content'] = $content;
        }

        // add namespace Uri
        if ($namespaceUri !== null) {
            $tag['namespaceUri'] = $namespaceUri;
        }

        return XML_Util::createTagFromArray(
            $tag, $replaceEntities, $multiline,
            $indent, $linebreak, $sortAttributes,
            $collapseTagMode
        );
    }

    /**
     * Create a tag from an array.
     * This method awaits an array in the following format
     * <pre>
     * array(
     *     // qualified name of the tag
     *     'qname' => $qname
     *
     *     // namespace prefix (optional, if qname is specified or no namespace)
     *     'namespace' => $namespace
     *
     *     // local part of the tagname (optional, if qname is specified)
     *     'localpart' => $localpart,
     *
     *     // array containing all attributes (optional)
     *     'attributes' => array(),
     *
     *     // tag content (optional)
     *     'content' => $content,
     *
     *     // namespaceUri for the given namespace (optional)
     *     'namespaceUri' => $namespaceUri
     * )
     * </pre>
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * $tag = array(
     *     'qname'        => 'foo:bar',
     *     'namespaceUri' => 'http://foo.com',
     *     'attributes'   => array('key' => 'value', 'argh' => 'fruit&vegetable'),
     *     'content'      => 'I\'m inside the tag',
     * );
     * // creating a tag with qualified name and namespaceUri
     * $string = XML_Util::createTagFromArray($tag);
     * </code>
     *
     * @param array  $tag             tag definition
     * @param int    $replaceEntities whether to replace XML special chars in
     *                                content, embedd it in a CData section
     *                                or none of both
     * @param bool   $multiline       whether to create a multiline tag where each
     *                                attribute gets written to a single line
     * @param string $indent          string used to indent attributes
     *                                (_auto indents attributes so they start
     *                                at the same column)
     * @param string $linebreak       string used for linebreaks
     * @param bool   $sortAttributes  Whether to sort the attributes or not
     * @param int    $collapseTagMode How to handle a content-less, and thus collapseable, tag
     *
     * @return string XML tag
     *
     * @see  createTag()
     * @uses attributesToString() to serialize the attributes of the tag
     * @uses splitQualifiedName() to get local part and namespace of a qualified name
     * @uses createCDataSection()
     * @uses collapseEmptyTags()
     * @uses raiseError()
     */
    public static function createTagFromArray(
        $tag, $replaceEntities = XML_UTIL_REPLACE_ENTITIES,
        $multiline = false, $indent = '_auto', $linebreak = "\n",
        $sortAttributes = true, $collapseTagMode = XML_UTIL_COLLAPSE_ALL
    ) {
        if (isset($tag['content']) && !is_scalar($tag['content'])) {
            return XML_Util::raiseError(
                'Supplied non-scalar value as tag content',
                XML_UTIL_ERROR_NON_SCALAR_CONTENT
            );
        }

        if (!isset($tag['qname']) && !isset($tag['localPart'])) {
            return XML_Util::raiseError(
                'You must either supply a qualified name '
                . '(qname) or local tag name (localPart).',
                XML_UTIL_ERROR_NO_TAG_NAME
            );
        }

        // if no attributes hav been set, use empty attributes
        if (!isset($tag['attributes']) || !is_array($tag['attributes'])) {
            $tag['attributes'] = array();
        }

        if (isset($tag['namespaces'])) {
            foreach ($tag['namespaces'] as $ns => $uri) {
                $tag['attributes']['xmlns:' . $ns] = $uri;
            }
        }

        if (!isset($tag['qname'])) {
            // qualified name is not given

            // check for namespace
            if (isset($tag['namespace']) && !empty($tag['namespace'])) {
                $tag['qname'] = $tag['namespace'] . ':' . $tag['localPart'];
            } else {
                $tag['qname'] = $tag['localPart'];
            }
        } elseif (isset($tag['namespaceUri']) && !isset($tag['namespace'])) {
            // namespace URI is set, but no namespace

            $parts = XML_Util::splitQualifiedName($tag['qname']);

            $tag['localPart'] = $parts['localPart'];
            if (isset($parts['namespace'])) {
                $tag['namespace'] = $parts['namespace'];
            }
        }

        if (isset($tag['namespaceUri']) && !empty($tag['namespaceUri'])) {
            // is a namespace given
            if (isset($tag['namespace']) && !empty($tag['namespace'])) {
                $tag['attributes']['xmlns:' . $tag['namespace']]
                    = $tag['namespaceUri'];
            } else {
                // define this Uri as the default namespace
                $tag['attributes']['xmlns'] = $tag['namespaceUri'];
            }
        }

        if (!array_key_exists('content', $tag)) {
            $tag['content'] = '';
        }

        // check for multiline attributes
        if ($multiline === true) {
            if ($indent === '_auto') {
                $indent = str_repeat(' ', (strlen($tag['qname'])+2));
            }
        }

        // create attribute list
        $attList = XML_Util::attributesToString(
            $tag['attributes'],
            $sortAttributes, $multiline, $indent, $linebreak
        );

        switch ($replaceEntities) {
        case XML_UTIL_ENTITIES_NONE:
            break;
        case XML_UTIL_CDATA_SECTION:
            $tag['content'] = XML_Util::createCDataSection($tag['content']);
            break;
        default:
            $tag['content'] = XML_Util::replaceEntities(
                $tag['content'], $replaceEntities
            );
            break;
        }
        $tag = sprintf(
            '<%s%s>%s</%s>', $tag['qname'], $attList, $tag['content'],
            $tag['qname']
        );

        return self::collapseEmptyTags($tag, $collapseTagMode);
    }

    /**
     * Create a start element
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // create an XML start element:
     * $tag = XML_Util::createStartElement('myNs:myTag',
     *     array('foo' => 'bar') ,'http://www.w3c.org/myNs#');
     * </code>
     *
     * @param string $qname          qualified tagname (including namespace)
     * @param array  $attributes     array containg attributes
     * @param string $namespaceUri   URI of the namespace
     * @param bool   $multiline      whether to create a multiline tag where each
     *                               attribute gets written to a single line
     * @param string $indent         string used to indent attributes (_auto indents
     *                               attributes so they start at the same column)
     * @param string $linebreak      string used for linebreaks
     * @param bool   $sortAttributes Whether to sort the attributes or not
     *
     * @return string XML start element
     * @see    createEndElement(), createTag()
     */
    public static function createStartElement(
        $qname, $attributes = array(), $namespaceUri = null,
        $multiline = false, $indent = '_auto', $linebreak = "\n",
        $sortAttributes = true
    ) {
        // if no attributes hav been set, use empty attributes
        if (!isset($attributes) || !is_array($attributes)) {
            $attributes = array();
        }

        if ($namespaceUri != null) {
            $parts = XML_Util::splitQualifiedName($qname);
        }

        // check for multiline attributes
        if ($multiline === true) {
            if ($indent === '_auto') {
                $indent = str_repeat(' ', (strlen($qname)+2));
            }
        }

        if ($namespaceUri != null) {
            // is a namespace given
            if (isset($parts['namespace']) && !empty($parts['namespace'])) {
                $attributes['xmlns:' . $parts['namespace']] = $namespaceUri;
            } else {
                // define this Uri as the default namespace
                $attributes['xmlns'] = $namespaceUri;
            }
        }

        // create attribute list
        $attList = XML_Util::attributesToString(
            $attributes, $sortAttributes,
            $multiline, $indent, $linebreak
        );
        $element = sprintf('<%s%s>', $qname, $attList);
        return  $element;
    }

    /**
     * Create an end element
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // create an XML start element:
     * $tag = XML_Util::createEndElement('myNs:myTag');
     * </code>
     *
     * @param string $qname qualified tagname (including namespace)
     *
     * @return string XML end element
     * @see    createStartElement(), createTag()
     */
    public static function createEndElement($qname)
    {
        $element = sprintf('</%s>', $qname);
        return $element;
    }

    /**
     * Create an XML comment
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // create an XML start element:
     * $tag = XML_Util::createComment('I am a comment');
     * </code>
     *
     * @param string $content content of the comment
     *
     * @return string XML comment
     */
    public static function createComment($content)
    {
        $comment = sprintf('<!-- %s -->', $content);
        return $comment;
    }

    /**
     * Create a CData section
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // create a CData section
     * $tag = XML_Util::createCDataSection('I am content.');
     * </code>
     *
     * @param string $data data of the CData section
     *
     * @return string CData section with content
     */
    public static function createCDataSection($data)
    {
        return sprintf(
            '<![CDATA[%s]]>',
            preg_replace('/\]\]>/', ']]]]><![CDATA[>', strval($data))
        );
    }

    /**
     * Split qualified name and return namespace and local part
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // split qualified tag
     * $parts = XML_Util::splitQualifiedName('xslt:stylesheet');
     * </code>
     * the returned array will contain two elements:
     * <pre>
     * array(
     *     'namespace' => 'xslt',
     *     'localPart' => 'stylesheet'
     * );
     * </pre>
     *
     * @param string $qname     qualified tag name
     * @param string $defaultNs default namespace (optional)
     *
     * @return array array containing namespace and local part
     */
    public static function splitQualifiedName($qname, $defaultNs = null)
    {
        if (strstr($qname, ':')) {
            $tmp = explode(':', $qname);
            return array(
                'namespace' => $tmp[0],
                'localPart' => $tmp[1]
            );
        }
        return array(
            'namespace' => $defaultNs,
            'localPart' => $qname
        );
    }

    /**
     * Check, whether string is valid XML name
     *
     * <p>XML names are used for tagname, attribute names and various
     * other, lesser known entities.</p>
     * <p>An XML name may only consist of alphanumeric characters,
     * dashes, undescores and periods, and has to start with a letter
     * or an underscore.</p>
     *
     * <code>
     * require_once 'XML/Util.php';
     *
     * // verify tag name
     * $result = XML_Util::isValidName('invalidTag?');
     * if (is_a($result, 'PEAR_Error')) {
     *    print 'Invalid XML name: ' . $result->getMessage();
     * }
     * </code>
     *
     * @param string $string string that should be checked
     *
     * @return mixed true, if string is a valid XML name, PEAR error otherwise
     *
     * @todo support for other charsets
     * @todo PEAR CS - unable to avoid 85-char limit on second preg_match
     */
    public static function isValidName($string)
    {
        // check for invalid chars
        if (!is_string($string) || !strlen($string) || !preg_match('/^[[:alpha:]_]\\z/', $string[0])) {
            return XML_Util::raiseError(
                'XML names may only start with letter or underscore',
                XML_UTIL_ERROR_INVALID_START
            );
        }

        // check for invalid chars
        $match = preg_match(
            '/^([[:alpha:]_]([[:alnum:]\-\.]*)?:)?'
            . '[[:alpha:]_]([[:alnum:]\_\-\.]+)?\\z/',
            $string
        );
        if (!$match) {
            return XML_Util::raiseError(
                'XML names may only contain alphanumeric '
                . 'chars, period, hyphen, colon and underscores',
                XML_UTIL_ERROR_INVALID_CHARS
            );
        }
        // XML name is valid
        return true;
    }

    /**
     * Replacement for XML_Util::raiseError
     *
     * Avoids the necessity to always require
     * PEAR.php
     *
     * @param string $msg  error message
     * @param int    $code error code
     *
     * @return PEAR_Error
     * @todo   PEAR CS - should this use include_once instead?
     */
    public static function raiseError($msg, $code)
    {
        include_once 'PEAR.php';
        return PEAR::raiseError($msg, $code);
    }
}
?>
PK�^�\�/=�����pear/XML/RPC.phpnu�[���<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * PHP implementation of the XML-RPC protocol
 *
 * This is a PEAR-ified version of Useful inc's XML-RPC for PHP.
 * It has support for HTTP transport, proxies and authentication.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: RPC.php 315594 2011-08-27 01:03:57Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 */


if (!function_exists('xml_parser_create')) {
    include_once 'PEAR.php';
    PEAR::loadExtension('xml');
}

/**#@+
 * Error constants
 */
/**
 * Parameter values don't match parameter types
 */
define('XML_RPC_ERROR_INVALID_TYPE', 101);
/**
 * Parameter declared to be numeric but the values are not
 */
define('XML_RPC_ERROR_NON_NUMERIC_FOUND', 102);
/**
 * Communication error
 */
define('XML_RPC_ERROR_CONNECTION_FAILED', 103);
/**
 * The array or struct has already been started
 */
define('XML_RPC_ERROR_ALREADY_INITIALIZED', 104);
/**
 * Incorrect parameters submitted
 */
define('XML_RPC_ERROR_INCORRECT_PARAMS', 105);
/**
 * Programming error by developer
 */
define('XML_RPC_ERROR_PROGRAMMING', 106);
/**#@-*/


/**
 * Data types
 * @global string $GLOBALS['XML_RPC_I4']
 */
$GLOBALS['XML_RPC_I4'] = 'i4';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Int']
 */
$GLOBALS['XML_RPC_Int'] = 'int';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Boolean']
 */
$GLOBALS['XML_RPC_Boolean'] = 'boolean';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Double']
 */
$GLOBALS['XML_RPC_Double'] = 'double';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_String']
 */
$GLOBALS['XML_RPC_String'] = 'string';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_DateTime']
 */
$GLOBALS['XML_RPC_DateTime'] = 'dateTime.iso8601';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Base64']
 */
$GLOBALS['XML_RPC_Base64'] = 'base64';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Array']
 */
$GLOBALS['XML_RPC_Array'] = 'array';

/**
 * Data types
 * @global string $GLOBALS['XML_RPC_Struct']
 */
$GLOBALS['XML_RPC_Struct'] = 'struct';


/**
 * Data type meta-types
 * @global array $GLOBALS['XML_RPC_Types']
 */
$GLOBALS['XML_RPC_Types'] = array(
    $GLOBALS['XML_RPC_I4']       => 1,
    $GLOBALS['XML_RPC_Int']      => 1,
    $GLOBALS['XML_RPC_Boolean']  => 1,
    $GLOBALS['XML_RPC_String']   => 1,
    $GLOBALS['XML_RPC_Double']   => 1,
    $GLOBALS['XML_RPC_DateTime'] => 1,
    $GLOBALS['XML_RPC_Base64']   => 1,
    $GLOBALS['XML_RPC_Array']    => 2,
    $GLOBALS['XML_RPC_Struct']   => 3,
);


/**
 * Error message numbers
 * @global array $GLOBALS['XML_RPC_err']
 */
$GLOBALS['XML_RPC_err'] = array(
    'unknown_method'      => 1,
    'invalid_return'      => 2,
    'incorrect_params'    => 3,
    'introspect_unknown'  => 4,
    'http_error'          => 5,
    'not_response_object' => 6,
    'invalid_request'     => 7,
);

/**
 * Error message strings
 * @global array $GLOBALS['XML_RPC_str']
 */
$GLOBALS['XML_RPC_str'] = array(
    'unknown_method'      => 'Unknown method',
    'invalid_return'      => 'Invalid return payload: enable debugging to examine incoming payload',
    'incorrect_params'    => 'Incorrect parameters passed to method',
    'introspect_unknown'  => 'Can\'t introspect: method unknown',
    'http_error'          => 'Didn\'t receive 200 OK from remote server.',
    'not_response_object' => 'The requested method didn\'t return an XML_RPC_Response object.',
    'invalid_request'     => 'Invalid request payload',
);


/**
 * Default XML encoding (ISO-8859-1, UTF-8 or US-ASCII)
 * @global string $GLOBALS['XML_RPC_defencoding']
 */
$GLOBALS['XML_RPC_defencoding'] = 'UTF-8';

/**
 * User error codes start at 800
 * @global int $GLOBALS['XML_RPC_erruser']
 */
$GLOBALS['XML_RPC_erruser'] = 800;

/**
 * XML parse error codes start at 100
 * @global int $GLOBALS['XML_RPC_errxml']
 */
$GLOBALS['XML_RPC_errxml'] = 100;


/**
 * Compose backslashes for escaping regexp
 * @global string $GLOBALS['XML_RPC_backslash']
 */
$GLOBALS['XML_RPC_backslash'] = chr(92) . chr(92);


/**
 * Should we automatically base64 encode strings that contain characters
 * which can cause PHP's SAX-based XML parser to break?
 * @global boolean $GLOBALS['XML_RPC_auto_base64']
 */
$GLOBALS['XML_RPC_auto_base64'] = false;


/**
 * Valid parents of XML elements
 * @global array $GLOBALS['XML_RPC_valid_parents']
 */
$GLOBALS['XML_RPC_valid_parents'] = array(
    'BOOLEAN' => array('VALUE'),
    'I4' => array('VALUE'),
    'INT' => array('VALUE'),
    'STRING' => array('VALUE'),
    'DOUBLE' => array('VALUE'),
    'DATETIME.ISO8601' => array('VALUE'),
    'BASE64' => array('VALUE'),
    'ARRAY' => array('VALUE'),
    'STRUCT' => array('VALUE'),
    'PARAM' => array('PARAMS'),
    'METHODNAME' => array('METHODCALL'),
    'PARAMS' => array('METHODCALL', 'METHODRESPONSE'),
    'MEMBER' => array('STRUCT'),
    'NAME' => array('MEMBER'),
    'DATA' => array('ARRAY'),
    'FAULT' => array('METHODRESPONSE'),
    'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT'),
);


/**
 * Stores state during parsing
 *
 * quick explanation of components:
 *   + ac     = accumulates values
 *   + qt     = decides if quotes are needed for evaluation
 *   + cm     = denotes struct or array (comma needed)
 *   + isf    = indicates a fault
 *   + lv     = indicates "looking for a value": implements the logic
 *               to allow values with no types to be strings
 *   + params = stores parameters in method calls
 *   + method = stores method name
 *
 * @global array $GLOBALS['XML_RPC_xh']
 */
$GLOBALS['XML_RPC_xh'] = array();


/**
 * Start element handler for the XML parser
 *
 * @return void
 */
function XML_RPC_se($parser_resource, $name, $attrs)
{
    global $XML_RPC_xh, $XML_RPC_valid_parents;

    $parser = (int) $parser_resource;

    // if invalid xmlrpc already detected, skip all processing
    if ($XML_RPC_xh[$parser]['isf'] >= 2) {
        return;
    }

    // check for correct element nesting
    // top level element can only be of 2 types
    if (count($XML_RPC_xh[$parser]['stack']) == 0) {
        if ($name != 'METHODRESPONSE' && $name != 'METHODCALL') {
            $XML_RPC_xh[$parser]['isf'] = 2;
            $XML_RPC_xh[$parser]['isf_reason'] = 'missing top level xmlrpc element';
            return;
        }
    } else {
        // not top level element: see if parent is OK
        if (!in_array($XML_RPC_xh[$parser]['stack'][0], $XML_RPC_valid_parents[$name])) {
            $name = preg_replace('@[^a-zA-Z0-9._-]@', '', $name);
            $XML_RPC_xh[$parser]['isf'] = 2;
            $XML_RPC_xh[$parser]['isf_reason'] = "xmlrpc element $name cannot be child of {$XML_RPC_xh[$parser]['stack'][0]}";
            return;
        }
    }

    switch ($name) {
    case 'STRUCT':
        $XML_RPC_xh[$parser]['cm']++;

        // turn quoting off
        $XML_RPC_xh[$parser]['qt'] = 0;

        $cur_val = array();
        $cur_val['value'] = array();
        $cur_val['members'] = 1;
        array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
        break;

    case 'ARRAY':
        $XML_RPC_xh[$parser]['cm']++;

        // turn quoting off
        $XML_RPC_xh[$parser]['qt'] = 0;

        $cur_val = array();
        $cur_val['value'] = array();
        $cur_val['members'] = 0;
        array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
        break;

    case 'NAME':
        $XML_RPC_xh[$parser]['ac'] = '';
        break;

    case 'FAULT':
        $XML_RPC_xh[$parser]['isf'] = 1;
        break;

    case 'PARAM':
        $XML_RPC_xh[$parser]['valuestack'] = array();
        break;

    case 'VALUE':
        $XML_RPC_xh[$parser]['lv'] = 1;
        $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_String'];
        $XML_RPC_xh[$parser]['ac'] = '';
        $XML_RPC_xh[$parser]['qt'] = 0;
        // look for a value: if this is still 1 by the
        // time we reach the first data segment then the type is string
        // by implication and we need to add in a quote
        break;

    case 'I4':
    case 'INT':
    case 'STRING':
    case 'BOOLEAN':
    case 'DOUBLE':
    case 'DATETIME.ISO8601':
    case 'BASE64':
        $XML_RPC_xh[$parser]['ac'] = ''; // reset the accumulator

        if ($name == 'DATETIME.ISO8601' || $name == 'STRING') {
            $XML_RPC_xh[$parser]['qt'] = 1;

            if ($name == 'DATETIME.ISO8601') {
                $XML_RPC_xh[$parser]['vt'] = $GLOBALS['XML_RPC_DateTime'];
            }

        } elseif ($name == 'BASE64') {
            $XML_RPC_xh[$parser]['qt'] = 2;
        } else {
            // No quoting is required here -- but
            // at the end of the element we must check
            // for data format errors.
            $XML_RPC_xh[$parser]['qt'] = 0;
        }
        break;

    case 'MEMBER':
        $XML_RPC_xh[$parser]['ac'] = '';
        break;

    case 'DATA':
    case 'METHODCALL':
    case 'METHODNAME':
    case 'METHODRESPONSE':
    case 'PARAMS':
        // valid elements that add little to processing
        break;
    }


    // Save current element to stack
    array_unshift($XML_RPC_xh[$parser]['stack'], $name);

    if ($name != 'VALUE') {
        $XML_RPC_xh[$parser]['lv'] = 0;
    }
}

/**
 * End element handler for the XML parser
 *
 * @return void
 */
function XML_RPC_ee($parser_resource, $name)
{
    global $XML_RPC_xh;

    $parser = (int) $parser_resource;

    if ($XML_RPC_xh[$parser]['isf'] >= 2) {
        return;
    }

    // push this element from stack
    // NB: if XML validates, correct opening/closing is guaranteed and
    // we do not have to check for $name == $curr_elem.
    // we also checked for proper nesting at start of elements...
    $curr_elem = array_shift($XML_RPC_xh[$parser]['stack']);

    switch ($name) {
    case 'STRUCT':
    case 'ARRAY':
    $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
    $XML_RPC_xh[$parser]['value'] = $cur_val['value'];
        $XML_RPC_xh[$parser]['vt'] = strtolower($name);
        $XML_RPC_xh[$parser]['cm']--;
        break;

    case 'NAME':
    $XML_RPC_xh[$parser]['valuestack'][0]['name'] = $XML_RPC_xh[$parser]['ac'];
        break;

    case 'BOOLEAN':
        // special case here: we translate boolean 1 or 0 into PHP
        // constants true or false
        if ($XML_RPC_xh[$parser]['ac'] == '1') {
            $XML_RPC_xh[$parser]['ac'] = 'true';
        } else {
            $XML_RPC_xh[$parser]['ac'] = 'false';
        }

        $XML_RPC_xh[$parser]['vt'] = strtolower($name);
        // Drop through intentionally.

    case 'I4':
    case 'INT':
    case 'STRING':
    case 'DOUBLE':
    case 'DATETIME.ISO8601':
    case 'BASE64':
        if ($XML_RPC_xh[$parser]['qt'] == 1) {
            // we use double quotes rather than single so backslashification works OK
            $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
        } elseif ($XML_RPC_xh[$parser]['qt'] == 2) {
            $XML_RPC_xh[$parser]['value'] = base64_decode($XML_RPC_xh[$parser]['ac']);
        } elseif ($name == 'BOOLEAN') {
            $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
        } else {
            // we have an I4, INT or a DOUBLE
            // we must check that only 0123456789-.<space> are characters here
            if (!preg_match("@^[+-]?[0123456789 \t\.]+$@", $XML_RPC_xh[$parser]['ac'])) {
                XML_RPC_Base::raiseError('Non-numeric value received in INT or DOUBLE',
                                         XML_RPC_ERROR_NON_NUMERIC_FOUND);
                $XML_RPC_xh[$parser]['value'] = XML_RPC_ERROR_NON_NUMERIC_FOUND;
            } else {
                // it's ok, add it on
                $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
            }
        }

        $XML_RPC_xh[$parser]['ac'] = '';
        $XML_RPC_xh[$parser]['qt'] = 0;
        $XML_RPC_xh[$parser]['lv'] = 3; // indicate we've found a value
        break;

    case 'VALUE':
        if ($XML_RPC_xh[$parser]['vt'] == $GLOBALS['XML_RPC_String']) {
            if (strlen($XML_RPC_xh[$parser]['ac']) > 0) {
                $XML_RPC_xh[$parser]['value'] = $XML_RPC_xh[$parser]['ac'];
            } elseif ($XML_RPC_xh[$parser]['lv'] == 1) {
                // The <value> element was empty.
                $XML_RPC_xh[$parser]['value'] = '';
            }
        }

        $temp = new XML_RPC_Value($XML_RPC_xh[$parser]['value'], $XML_RPC_xh[$parser]['vt']);

        $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
        if (is_array($cur_val)) {
            if ($cur_val['members']==0) {
                $cur_val['value'][] = $temp;
            } else {
                $XML_RPC_xh[$parser]['value'] = $temp;
            }
            array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
        } else {
            $XML_RPC_xh[$parser]['value'] = $temp;
        }
        break;

    case 'MEMBER':
        $XML_RPC_xh[$parser]['ac'] = '';
        $XML_RPC_xh[$parser]['qt'] = 0;

        $cur_val = array_shift($XML_RPC_xh[$parser]['valuestack']);
        if (is_array($cur_val)) {
            if ($cur_val['members']==1) {
                $cur_val['value'][$cur_val['name']] = $XML_RPC_xh[$parser]['value'];
            }
            array_unshift($XML_RPC_xh[$parser]['valuestack'], $cur_val);
        }
        break;

    case 'DATA':
        $XML_RPC_xh[$parser]['ac'] = '';
        $XML_RPC_xh[$parser]['qt'] = 0;
        break;

    case 'PARAM':
        $XML_RPC_xh[$parser]['params'][] = $XML_RPC_xh[$parser]['value'];
        break;

    case 'METHODNAME':
    case 'RPCMETHODNAME':
        $XML_RPC_xh[$parser]['method'] = preg_replace("@^[\n\r\t ]+@", '',
                                                      $XML_RPC_xh[$parser]['ac']);
        break;
    }

    // if it's a valid type name, set the type
    if (isset($GLOBALS['XML_RPC_Types'][strtolower($name)])) {
        $XML_RPC_xh[$parser]['vt'] = strtolower($name);
    }
}

/**
 * Character data handler for the XML parser
 *
 * @return void
 */
function XML_RPC_cd($parser_resource, $data)
{
    global $XML_RPC_xh, $XML_RPC_backslash;

    $parser = (int) $parser_resource;

    if ($XML_RPC_xh[$parser]['lv'] != 3) {
        // "lookforvalue==3" means that we've found an entire value
        // and should discard any further character data

        if ($XML_RPC_xh[$parser]['lv'] == 1) {
            // if we've found text and we're just in a <value> then
            // turn quoting on, as this will be a string
            $XML_RPC_xh[$parser]['qt'] = 1;
            // and say we've found a value
            $XML_RPC_xh[$parser]['lv'] = 2;
        }

        // replace characters that eval would
        // do special things with
        if (!isset($XML_RPC_xh[$parser]['ac'])) {
            $XML_RPC_xh[$parser]['ac'] = '';
        }
        $XML_RPC_xh[$parser]['ac'] .= $data;
    }
}

/**
 * The common methods and properties for all of the XML_RPC classes
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Base {

    /**
     * PEAR Error handling
     *
     * @return object  PEAR_Error object
     */
    function raiseError($msg, $code)
    {
        include_once 'PEAR.php';
        if (is_object(@$this)) {
            return PEAR::raiseError(get_class($this) . ': ' . $msg, $code);
        } else {
            return PEAR::raiseError('XML_RPC: ' . $msg, $code);
        }
    }

    /**
     * Tell whether something is a PEAR_Error object
     *
     * @param mixed $value  the item to check
     *
     * @return bool  whether $value is a PEAR_Error object or not
     *
     * @access public
     */
    function isError($value)
    {
        return is_object($value) && is_a($value, 'PEAR_Error');
    }
}

/**
 * The methods and properties for submitting XML RPC requests
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Client extends XML_RPC_Base {

    /**
     * The path and name of the RPC server script you want the request to go to
     * @var string
     */
    var $path = '';

    /**
     * The name of the remote server to connect to
     * @var string
     */
    var $server = '';

    /**
     * The protocol to use in contacting the remote server
     * @var string
     */
    var $protocol = 'http://';

    /**
     * The port for connecting to the remote server
     *
     * The default is 80 for http:// connections
     * and 443 for https:// and ssl:// connections.
     *
     * @var integer
     */
    var $port = 80;

    /**
     * A user name for accessing the RPC server
     * @var string
     * @see XML_RPC_Client::setCredentials()
     */
    var $username = '';

    /**
     * A password for accessing the RPC server
     * @var string
     * @see XML_RPC_Client::setCredentials()
     */
    var $password = '';

    /**
     * The name of the proxy server to use, if any
     * @var string
     */
    var $proxy = '';

    /**
     * The protocol to use in contacting the proxy server, if any
     * @var string
     */
    var $proxy_protocol = 'http://';

    /**
     * The port for connecting to the proxy server
     *
     * The default is 8080 for http:// connections
     * and 443 for https:// and ssl:// connections.
     *
     * @var integer
     */
    var $proxy_port = 8080;

    /**
     * A user name for accessing the proxy server
     * @var string
     */
    var $proxy_user = '';

    /**
     * A password for accessing the proxy server
     * @var string
     */
    var $proxy_pass = '';

    /**
     * The error number, if any
     * @var integer
     */
    var $errno = 0;

    /**
     * The error message, if any
     * @var string
     */
    var $errstr = '';

    /**
     * The current debug mode (1 = on, 0 = off)
     * @var integer
     */
    var $debug = 0;

    /**
     * The HTTP headers for the current request.
     * @var string
     */
    var $headers = '';


    /**
     * Sets the object's properties
     *
     * @param string  $path        the path and name of the RPC server script
     *                              you want the request to go to
     * @param string  $server      the URL of the remote server to connect to.
     *                              If this parameter doesn't specify a
     *                              protocol and $port is 443, ssl:// is
     *                              assumed.
     * @param integer $port        a port for connecting to the remote server.
     *                              Defaults to 80 for http:// connections and
     *                              443 for https:// and ssl:// connections.
     * @param string  $proxy       the URL of the proxy server to use, if any.
     *                              If this parameter doesn't specify a
     *                              protocol and $port is 443, ssl:// is
     *                              assumed.
     * @param integer $proxy_port  a port for connecting to the remote server.
     *                              Defaults to 8080 for http:// connections and
     *                              443 for https:// and ssl:// connections.
     * @param string  $proxy_user  a user name for accessing the proxy server
     * @param string  $proxy_pass  a password for accessing the proxy server
     *
     * @return void
     */
    function XML_RPC_Client($path, $server, $port = 0,
                            $proxy = '', $proxy_port = 0,
                            $proxy_user = '', $proxy_pass = '')
    {
        $this->path       = $path;
        $this->proxy_user = $proxy_user;
        $this->proxy_pass = $proxy_pass;

        preg_match('@^(http://|https://|ssl://)?(.*)$@', $server, $match);
        if ($match[1] == '') {
            if ($port == 443) {
                $this->server   = $match[2];
                $this->protocol = 'ssl://';
                $this->port     = 443;
            } else {
                $this->server = $match[2];
                if ($port) {
                    $this->port = $port;
                }
            }
        } elseif ($match[1] == 'http://') {
            $this->server = $match[2];
            if ($port) {
                $this->port = $port;
            }
        } else {
            $this->server   = $match[2];
            $this->protocol = 'ssl://';
            if ($port) {
                $this->port = $port;
            } else {
                $this->port = 443;
            }
        }

        if ($proxy) {
            preg_match('@^(http://|https://|ssl://)?(.*)$@', $proxy, $match);
            if ($match[1] == '') {
                if ($proxy_port == 443) {
                    $this->proxy          = $match[2];
                    $this->proxy_protocol = 'ssl://';
                    $this->proxy_port     = 443;
                } else {
                    $this->proxy = $match[2];
                    if ($proxy_port) {
                        $this->proxy_port = $proxy_port;
                    }
                }
            } elseif ($match[1] == 'http://') {
                $this->proxy = $match[2];
                if ($proxy_port) {
                    $this->proxy_port = $proxy_port;
                }
            } else {
                $this->proxy          = $match[2];
                $this->proxy_protocol = 'ssl://';
                if ($proxy_port) {
                    $this->proxy_port = $proxy_port;
                } else {
                    $this->proxy_port = 443;
                }
            }
        }
    }

    /**
     * Change the current debug mode
     *
     * @param int $in  where 1 = on, 0 = off
     *
     * @return void
     */
    function setDebug($in)
    {
        if ($in) {
            $this->debug = 1;
        } else {
            $this->debug = 0;
        }
    }

    /**
     * Sets whether strings that contain characters which may cause PHP's
     * SAX-based XML parser to break should be automatically base64 encoded
     *
     * This is is a workaround for systems that don't have PHP's mbstring
     * extension available.
     *
     * @param int $in  where 1 = on, 0 = off
     *
     * @return void
     */
    function setAutoBase64($in)
    {
        if ($in) {
            $GLOBALS['XML_RPC_auto_base64'] = true;
        } else {
            $GLOBALS['XML_RPC_auto_base64'] = false;
        }
    }

    /**
     * Set username and password properties for connecting to the RPC server
     *
     * @param string $u  the user name
     * @param string $p  the password
     *
     * @return void
     *
     * @see XML_RPC_Client::$username, XML_RPC_Client::$password
     */
    function setCredentials($u, $p)
    {
        $this->username = $u;
        $this->password = $p;
    }

    /**
     * Transmit the RPC request via HTTP 1.0 protocol
     *
     * @param object $msg       the XML_RPC_Message object
     * @param int    $timeout   how many seconds to wait for the request
     *
     * @return object  an XML_RPC_Response object.  0 is returned if any
     *                  problems happen.
     *
     * @see XML_RPC_Message, XML_RPC_Client::XML_RPC_Client(),
     *      XML_RPC_Client::setCredentials()
     */
    function send($msg, $timeout = 0)
    {
        if (!is_object($msg) || !is_a($msg, 'XML_RPC_Message')) {
            $this->errstr = 'send()\'s $msg parameter must be an'
                          . ' XML_RPC_Message object.';
            $this->raiseError($this->errstr, XML_RPC_ERROR_PROGRAMMING);
            return 0;
        }
        $msg->debug = $this->debug;
        return $this->sendPayloadHTTP10($msg, $this->server, $this->port,
                                        $timeout, $this->username,
                                        $this->password);
    }

    /**
     * Transmit the RPC request via HTTP 1.0 protocol
     *
     * Requests should be sent using XML_RPC_Client send() rather than
     * calling this method directly.
     *
     * @param object $msg       the XML_RPC_Message object
     * @param string $server    the server to send the request to
     * @param int    $port      the server port send the request to
     * @param int    $timeout   how many seconds to wait for the request
     *                           before giving up
     * @param string $username  a user name for accessing the RPC server
     * @param string $password  a password for accessing the RPC server
     *
     * @return object  an XML_RPC_Response object.  0 is returned if any
     *                  problems happen.
     *
     * @access protected
     * @see XML_RPC_Client::send()
     */
    function sendPayloadHTTP10($msg, $server, $port, $timeout = 0,
                               $username = '', $password = '')
    {
        // Pre-emptive BC hacks for fools calling sendPayloadHTTP10() directly
        if ($username != $this->username) {
            $this->setCredentials($username, $password);
        }

        // Only create the payload if it was not created previously
        if (empty($msg->payload)) {
            $msg->createPayload();
        }
        $this->createHeaders($msg);

        $op  = $this->headers . "\r\n\r\n";
        $op .= $msg->payload;

        if ($this->debug) {
            print "\n<pre>---SENT---\n";
            print $op;
            print "\n---END---</pre>\n";
        }

        /*
         * If we're using a proxy open a socket to the proxy server
         * instead to the xml-rpc server
         */
        if ($this->proxy) {
            if ($this->proxy_protocol == 'http://') {
                $protocol = '';
            } else {
                $protocol = $this->proxy_protocol;
            }
            if ($timeout > 0) {
                $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port,
                                 $this->errno, $this->errstr, $timeout);
            } else {
                $fp = @fsockopen($protocol . $this->proxy, $this->proxy_port,
                                 $this->errno, $this->errstr);
            }
        } else {
            if ($this->protocol == 'http://') {
                $protocol = '';
            } else {
                $protocol = $this->protocol;
            }
            if ($timeout > 0) {
                $fp = @fsockopen($protocol . $server, $port,
                                 $this->errno, $this->errstr, $timeout);
            } else {
                $fp = @fsockopen($protocol . $server, $port,
                                 $this->errno, $this->errstr);
            }
        }

        /*
         * Just raising the error without returning it is strange,
         * but keep it here for backwards compatibility.
         */
        if (!$fp && $this->proxy) {
            $this->raiseError('Connection to proxy server '
                              . $this->proxy . ':' . $this->proxy_port
                              . ' failed. ' . $this->errstr,
                              XML_RPC_ERROR_CONNECTION_FAILED);
            return 0;
        } elseif (!$fp) {
            $this->raiseError('Connection to RPC server '
                              . $server . ':' . $port
                              . ' failed. ' . $this->errstr,
                              XML_RPC_ERROR_CONNECTION_FAILED);
            return 0;
        }

        if ($timeout) {
            /*
             * Using socket_set_timeout() because stream_set_timeout()
             * was introduced in 4.3.0, but we need to support 4.2.0.
             */
            socket_set_timeout($fp, $timeout);
        }

        if (!fputs($fp, $op, strlen($op))) {
            $this->errstr = 'Write error';
            return 0;
        }
        $resp = $msg->parseResponseFile($fp);

        $meta = socket_get_status($fp);
        if ($meta['timed_out']) {
            fclose($fp);
            $this->errstr = 'RPC server did not send response before timeout.';
            $this->raiseError($this->errstr, XML_RPC_ERROR_CONNECTION_FAILED);
            return 0;
        }

        fclose($fp);
        return $resp;
    }

    /**
     * Determines the HTTP headers and puts it in the $headers property
     *
     * @param object $msg       the XML_RPC_Message object
     *
     * @return boolean  TRUE if okay, FALSE if the message payload isn't set.
     *
     * @access protected
     */
    function createHeaders($msg)
    {
        if (empty($msg->payload)) {
            return false;
        }
        if ($this->proxy) {
            $this->headers = 'POST ' . $this->protocol . $this->server;
            if ($this->proxy_port) {
                $this->headers .= ':' . $this->port;
            }
        } else {
           $this->headers = 'POST ';
        }
        $this->headers .= $this->path. " HTTP/1.0\r\n";

        $this->headers .= "User-Agent: PEAR XML_RPC\r\n";
        $this->headers .= 'Host: ' . $this->server . "\r\n";

        if ($this->proxy && $this->proxy_user) {
            $this->headers .= 'Proxy-Authorization: Basic '
                     . base64_encode("$this->proxy_user:$this->proxy_pass")
                     . "\r\n";
        }

        // thanks to Grant Rauscher <grant7@firstworld.net> for this
        if ($this->username) {
            $this->headers .= 'Authorization: Basic '
                     . base64_encode("$this->username:$this->password")
                     . "\r\n";
        }

        $this->headers .= "Content-Type: text/xml\r\n";
        $this->headers .= 'Content-Length: ' . strlen($msg->payload);
        return true;
    }
}

/**
 * The methods and properties for interpreting responses to XML RPC requests
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Response extends XML_RPC_Base
{
    var $xv;
    var $fn;
    var $fs;
    var $hdrs;

    /**
     * @return void
     */
    function XML_RPC_Response($val, $fcode = 0, $fstr = '')
    {
        if ($fcode != 0) {
            $this->fn = $fcode;
            $this->fs = htmlspecialchars($fstr);
        } else {
            $this->xv = $val;
        }
    }

    /**
     * @return int  the error code
     */
    function faultCode()
    {
        if (isset($this->fn)) {
            return $this->fn;
        } else {
            return 0;
        }
    }

    /**
     * @return string  the error string
     */
    function faultString()
    {
        return $this->fs;
    }

    /**
     * @return mixed  the value
     */
    function value()
    {
        return $this->xv;
    }

    /**
     * @return string  the error message in XML format
     */
    function serialize()
    {
        $rs = "<methodResponse>\n";
        if ($this->fn) {
            $rs .= "<fault>
  <value>
    <struct>
      <member>
        <name>faultCode</name>
        <value><int>" . $this->fn . "</int></value>
      </member>
      <member>
        <name>faultString</name>
        <value><string>" . $this->fs . "</string></value>
      </member>
    </struct>
  </value>
</fault>";
        } else {
            $rs .= "<params>\n<param>\n" . $this->xv->serialize() .
        "</param>\n</params>";
        }
        $rs .= "\n</methodResponse>";
        return $rs;
    }
}

/**
 * The methods and properties for composing XML RPC messages
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Message extends XML_RPC_Base
{
    /**
     * Should the payload's content be passed through mb_convert_encoding()?
     *
     * @see XML_RPC_Message::setConvertPayloadEncoding()
     * @since Property available since Release 1.5.1
     * @var boolean
     */
    var $convert_payload_encoding = false;

    /**
     * The current debug mode (1 = on, 0 = off)
     * @var integer
     */
    var $debug = 0;

    /**
     * The encoding to be used for outgoing messages
     *
     * Defaults to the value of <var>$GLOBALS['XML_RPC_defencoding']</var>
     *
     * @var string
     * @see XML_RPC_Message::setSendEncoding(),
     *      $GLOBALS['XML_RPC_defencoding'], XML_RPC_Message::xml_header()
     */
    var $send_encoding = '';

    /**
     * The method presently being evaluated
     * @var string
     */
    var $methodname = '';

    /**
     * @var array
     */
    var $params = array();

    /**
     * The XML message being generated
     * @var string
     */
    var $payload = '';

    /**
     * Should extra line breaks be removed from the payload?
     * @since Property available since Release 1.4.6
     * @var boolean
     */
    var $remove_extra_lines = true;

    /**
     * The XML response from the remote server
     * @since Property available since Release 1.4.6
     * @var string
     */
    var $response_payload = '';


    /**
     * @return void
     */
    function XML_RPC_Message($meth, $pars = 0)
    {
        $this->methodname = $meth;
        if (is_array($pars) && sizeof($pars) > 0) {
            for ($i = 0; $i < sizeof($pars); $i++) {
                $this->addParam($pars[$i]);
            }
        }
    }

    /**
     * Produces the XML declaration including the encoding attribute
     *
     * The encoding is determined by this class' <var>$send_encoding</var>
     * property.  If the <var>$send_encoding</var> property is not set, use
     * <var>$GLOBALS['XML_RPC_defencoding']</var>.
     *
     * @return string  the XML declaration and <methodCall> element
     *
     * @see XML_RPC_Message::setSendEncoding(),
     *      XML_RPC_Message::$send_encoding, $GLOBALS['XML_RPC_defencoding']
     */
    function xml_header()
    {
        global $XML_RPC_defencoding;

        if (!$this->send_encoding) {
            $this->send_encoding = $XML_RPC_defencoding;
        }
        return '<?xml version="1.0" encoding="' . $this->send_encoding . '"?>'
               . "\n<methodCall>\n";
    }

    /**
     * @return string  the closing </methodCall> tag
     */
    function xml_footer()
    {
        return "</methodCall>\n";
    }

    /**
     * Fills the XML_RPC_Message::$payload property
     *
     * Part of the process makes sure all line endings are in DOS format
     * (CRLF), which is probably required by specifications.
     *
     * If XML_RPC_Message::setConvertPayloadEncoding() was set to true,
     * the payload gets passed through mb_convert_encoding()
     * to ensure the payload matches the encoding set in the
     * XML declaration.  The encoding type can be manually set via
     * XML_RPC_Message::setSendEncoding().
     *
     * @return void
     *
     * @uses XML_RPC_Message::xml_header(), XML_RPC_Message::xml_footer()
     * @see XML_RPC_Message::setSendEncoding(), $GLOBALS['XML_RPC_defencoding'],
     *      XML_RPC_Message::setConvertPayloadEncoding()
     */
    function createPayload()
    {
        $this->payload = $this->xml_header();
        $this->payload .= '<methodName>' . $this->methodname . "</methodName>\n";
        $this->payload .= "<params>\n";
        for ($i = 0; $i < sizeof($this->params); $i++) {
            $p = $this->params[$i];
            $this->payload .= "<param>\n" . $p->serialize() . "</param>\n";
        }
        $this->payload .= "</params>\n";
        $this->payload .= $this->xml_footer();
        if ($this->remove_extra_lines) {
            $this->payload = preg_replace("@[\r\n]+@", "\r\n", $this->payload);
        } else {
            $this->payload = preg_replace("@\r\n|\n|\r|\n\r@", "\r\n", $this->payload);
        }
        if ($this->convert_payload_encoding) {
            $this->payload = mb_convert_encoding($this->payload, $this->send_encoding);
        }
    }

    /**
     * @return string  the name of the method
     */
    function method($meth = '')
    {
        if ($meth != '') {
            $this->methodname = $meth;
        }
        return $this->methodname;
    }

    /**
     * @return string  the payload
     */
    function serialize()
    {
        $this->createPayload();
        return $this->payload;
    }

    /**
     * @return void
     */
    function addParam($par)
    {
        $this->params[] = $par;
    }

    /**
     * Obtains an XML_RPC_Value object for the given parameter
     *
     * @param int $i  the index number of the parameter to obtain
     *
     * @return object  the XML_RPC_Value object.
     *                  If the parameter doesn't exist, an XML_RPC_Response object.
     *
     * @since Returns XML_RPC_Response object on error since Release 1.3.0
     */
    function getParam($i)
    {
        global $XML_RPC_err, $XML_RPC_str;

        if (isset($this->params[$i])) {
            return $this->params[$i];
        } else {
            $this->raiseError('The submitted request did not contain this parameter',
                              XML_RPC_ERROR_INCORRECT_PARAMS);
            return new XML_RPC_Response(0, $XML_RPC_err['incorrect_params'],
                                        $XML_RPC_str['incorrect_params']);
        }
    }

    /**
     * @return int  the number of parameters
     */
    function getNumParams()
    {
        return sizeof($this->params);
    }

    /**
     * Sets whether the payload's content gets passed through
     * mb_convert_encoding()
     *
     * Returns PEAR_ERROR object if mb_convert_encoding() isn't available.
     *
     * @param int $in  where 1 = on, 0 = off
     *
     * @return void
     *
     * @see XML_RPC_Message::setSendEncoding()
     * @since Method available since Release 1.5.1
     */
    function setConvertPayloadEncoding($in)
    {
        if ($in && !function_exists('mb_convert_encoding')) {
            return $this->raiseError('mb_convert_encoding() is not available',
                              XML_RPC_ERROR_PROGRAMMING);
        }
        $this->convert_payload_encoding = $in;
    }

    /**
     * Sets the XML declaration's encoding attribute
     *
     * @param string $type  the encoding type (ISO-8859-1, UTF-8 or US-ASCII)
     *
     * @return void
     *
     * @see XML_RPC_Message::setConvertPayloadEncoding(), XML_RPC_Message::xml_header()
     * @since Method available since Release 1.2.0
     */
    function setSendEncoding($type)
    {
        $this->send_encoding = $type;
    }

    /**
     * Determine the XML's encoding via the encoding attribute
     * in the XML declaration
     *
     * If the encoding parameter is not set or is not ISO-8859-1, UTF-8
     * or US-ASCII, $XML_RPC_defencoding will be returned.
     *
     * @param string $data  the XML that will be parsed
     *
     * @return string  the encoding to be used
     *
     * @link   http://php.net/xml_parser_create
     * @since  Method available since Release 1.2.0
     */
    function getEncoding($data)
    {
        global $XML_RPC_defencoding;

        if (preg_match('@<\?xml[^>]*\s*encoding\s*=\s*[\'"]([^"\']*)[\'"]@',
                       $data, $match))
        {
            $match[1] = trim(strtoupper($match[1]));
            switch ($match[1]) {
                case 'ISO-8859-1':
                case 'UTF-8':
                case 'US-ASCII':
                    return $match[1];
                    break;

                default:
                    return $XML_RPC_defencoding;
            }
        } else {
            return $XML_RPC_defencoding;
        }
    }

    /**
     * @return object  a new XML_RPC_Response object
     */
    function parseResponseFile($fp)
    {
        $ipd = '';
        while ($data = @fread($fp, 8192)) {
            $ipd .= $data;
        }
        return $this->parseResponse($ipd);
    }

    /**
     * @return object  a new XML_RPC_Response object
     */
    function parseResponse($data = '')
    {
        global $XML_RPC_xh, $XML_RPC_err, $XML_RPC_str, $XML_RPC_defencoding;

        $encoding = $this->getEncoding($data);
        $parser_resource = xml_parser_create($encoding);
        $parser = (int) $parser_resource;

        $XML_RPC_xh = array();
        $XML_RPC_xh[$parser] = array();

        $XML_RPC_xh[$parser]['cm'] = 0;
        $XML_RPC_xh[$parser]['isf'] = 0;
        $XML_RPC_xh[$parser]['ac'] = '';
        $XML_RPC_xh[$parser]['qt'] = '';
        $XML_RPC_xh[$parser]['stack'] = array();
        $XML_RPC_xh[$parser]['valuestack'] = array();

        xml_parser_set_option($parser_resource, XML_OPTION_CASE_FOLDING, true);
        xml_set_element_handler($parser_resource, 'XML_RPC_se', 'XML_RPC_ee');
        xml_set_character_data_handler($parser_resource, 'XML_RPC_cd');

        $hdrfnd = 0;
        if ($this->debug) {
            print "\n<pre>---GOT---\n";
            print isset($_SERVER['SERVER_PROTOCOL']) ? htmlspecialchars($data) : $data;
            print "\n---END---</pre>\n";
        }

        // See if response is a 200 or a 100 then a 200, else raise error.
        // But only do this if we're using the HTTP protocol.
        if (preg_match('@^HTTP@', $data) &&
            !preg_match('@^HTTP/[0-9\.]+ 200 @', $data) &&
            !preg_match('@^HTTP/[0-9\.]+ 10[0-9]([A-Z ]+)?[\r\n]+HTTP/[0-9\.]+ 200@', $data))
        {
                $errstr = substr($data, 0, strpos($data, "\n") - 1);
                error_log('HTTP error, got response: ' . $errstr);
                $r = new XML_RPC_Response(0, $XML_RPC_err['http_error'],
                                          $XML_RPC_str['http_error'] . ' (' .
                                          $errstr . ')');
                xml_parser_free($parser_resource);
                return $r;
        }

        // gotta get rid of headers here
        if (!$hdrfnd && ($brpos = strpos($data,"\r\n\r\n"))) {
            $XML_RPC_xh[$parser]['ha'] = substr($data, 0, $brpos);
            $data = substr($data, $brpos + 4);
            $hdrfnd = 1;
        }

        /*
         * be tolerant of junk after methodResponse
         * (e.g. javascript automatically inserted by free hosts)
         * thanks to Luca Mariano <luca.mariano@email.it>
         */
        $data = substr($data, 0, strpos($data, "</methodResponse>") + 17);
        $this->response_payload = $data;

        if (!xml_parse($parser_resource, $data, sizeof($data))) {
            // thanks to Peter Kocks <peter.kocks@baygate.com>
            if (xml_get_current_line_number($parser_resource) == 1) {
                $errstr = 'XML error at line 1, check URL';
            } else {
                $errstr = sprintf('XML error: %s at line %d',
                                  xml_error_string(xml_get_error_code($parser_resource)),
                                  xml_get_current_line_number($parser_resource));
            }
            error_log($errstr);
            $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
                                      $XML_RPC_str['invalid_return']);
            xml_parser_free($parser_resource);
            return $r;
        }

        xml_parser_free($parser_resource);

        if ($this->debug) {
            print "\n<pre>---PARSED---\n";
            var_dump($XML_RPC_xh[$parser]['value']);
            print "---END---</pre>\n";
        }

        if ($XML_RPC_xh[$parser]['isf'] > 1) {
            $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
                                      $XML_RPC_str['invalid_return'].' '.$XML_RPC_xh[$parser]['isf_reason']);
        } elseif (!is_object($XML_RPC_xh[$parser]['value'])) {
            // then something odd has happened
            // and it's time to generate a client side error
            // indicating something odd went on
            $r = new XML_RPC_Response(0, $XML_RPC_err['invalid_return'],
                                      $XML_RPC_str['invalid_return']);
        } else {
            $v = $XML_RPC_xh[$parser]['value'];
            if ($XML_RPC_xh[$parser]['isf']) {
                $f = $v->structmem('faultCode');
                $fs = $v->structmem('faultString');
                $r = new XML_RPC_Response($v, $f->scalarval(),
                                          $fs->scalarval());
            } else {
                $r = new XML_RPC_Response($v);
            }
        }
        $r->hdrs = preg_split("@\r?\n@", $XML_RPC_xh[$parser]['ha']);
        return $r;
    }
}

/**
 * The methods and properties that represent data in XML RPC format
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Edd Dumbill <edd@usefulinc.com>
 * @author     Stig Bakken <stig@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  1999-2001 Edd Dumbill, 2001-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/XML_RPC
 */
class XML_RPC_Value extends XML_RPC_Base
{
    var $me = array();
    var $mytype = 0;

    /**
     * @return void
     */
    function XML_RPC_Value($val = -1, $type = '')
    {
        $this->me = array();
        $this->mytype = 0;
        if ($val != -1 || $type != '') {
            if ($type == '') {
                $type = 'string';
            }
            if (!array_key_exists($type, $GLOBALS['XML_RPC_Types'])) {
                // XXX
                // need some way to report this error
            } elseif ($GLOBALS['XML_RPC_Types'][$type] == 1) {
                $this->addScalar($val, $type);
            } elseif ($GLOBALS['XML_RPC_Types'][$type] == 2) {
                $this->addArray($val);
            } elseif ($GLOBALS['XML_RPC_Types'][$type] == 3) {
                $this->addStruct($val);
            }
        }
    }

    /**
     * @return int  returns 1 if successful or 0 if there are problems
     */
    function addScalar($val, $type = 'string')
    {
        if ($this->mytype == 1) {
            $this->raiseError('Scalar can have only one value',
                              XML_RPC_ERROR_INVALID_TYPE);
            return 0;
        }
        $typeof = $GLOBALS['XML_RPC_Types'][$type];
        if ($typeof != 1) {
            $this->raiseError("Not a scalar type (${typeof})",
                              XML_RPC_ERROR_INVALID_TYPE);
            return 0;
        }

        if ($type == $GLOBALS['XML_RPC_Boolean']) {
            if (strcasecmp($val, 'true') == 0
                || $val == 1
                || ($val == true && strcasecmp($val, 'false')))
            {
                $val = 1;
            } else {
                $val = 0;
            }
        }

        if ($this->mytype == 2) {
            // we're adding to an array here
            $ar = $this->me['array'];
            $ar[] = new XML_RPC_Value($val, $type);
            $this->me['array'] = $ar;
        } else {
            // a scalar, so set the value and remember we're scalar
            $this->me[$type] = $val;
            $this->mytype = $typeof;
        }
        return 1;
    }

    /**
     * @return int  returns 1 if successful or 0 if there are problems
     */
    function addArray($vals)
    {
        if ($this->mytype != 0) {
            $this->raiseError(
                    'Already initialized as a [' . $this->kindOf() . ']',
                    XML_RPC_ERROR_ALREADY_INITIALIZED);
            return 0;
        }
        $this->mytype = $GLOBALS['XML_RPC_Types']['array'];
        $this->me['array'] = $vals;
        return 1;
    }

    /**
     * @return int  returns 1 if successful or 0 if there are problems
     */
    function addStruct($vals)
    {
        if ($this->mytype != 0) {
            $this->raiseError(
                    'Already initialized as a [' . $this->kindOf() . ']',
                    XML_RPC_ERROR_ALREADY_INITIALIZED);
            return 0;
        }
        $this->mytype = $GLOBALS['XML_RPC_Types']['struct'];
        $this->me['struct'] = $vals;
        return 1;
    }

    /**
     * @return void
     */
    function dump($ar)
    {
        reset($ar);
        foreach ($ar as $key => $val) {
            echo "$key => $val<br />";
            if ($key == 'array') {
                foreach ($val as $key2 => $val2) {
                    echo "-- $key2 => $val2<br />";
                }
            }
        }
    }

    /**
     * @return string  the data type of the current value
     */
    function kindOf()
    {
        switch ($this->mytype) {
        case 3:
            return 'struct';

        case 2:
            return 'array';

        case 1:
            return 'scalar';

        default:
            return 'undef';
        }
    }

    /**
     * @return string  the data in XML format
     */
    function serializedata($typ, $val)
    {
        $rs = '';
        if (!array_key_exists($typ, $GLOBALS['XML_RPC_Types'])) {
            // XXX
            // need some way to report this error
            return;
        }
        switch ($GLOBALS['XML_RPC_Types'][$typ]) {
        case 3:
            // struct
            $rs .= "<struct>\n";
            reset($val);
            foreach ($val as $key2 => $val2) {
                $rs .= "<member><name>" . htmlspecialchars($key2) . "</name>\n";
                $rs .= $this->serializeval($val2);
                $rs .= "</member>\n";
            }
            $rs .= '</struct>';
            break;

        case 2:
            // array
            $rs .= "<array>\n<data>\n";
            foreach ($val as $value) {
                $rs .= $this->serializeval($value);
            }
            $rs .= "</data>\n</array>";
            break;

        case 1:
            switch ($typ) {
            case $GLOBALS['XML_RPC_Base64']:
                $rs .= "<${typ}>" . base64_encode($val) . "</${typ}>";
                break;
            case $GLOBALS['XML_RPC_Boolean']:
                $rs .= "<${typ}>" . ($val ? '1' : '0') . "</${typ}>";
                break;
            case $GLOBALS['XML_RPC_String']:
                $rs .= "<${typ}>" . htmlspecialchars($val). "</${typ}>";
                break;
            default:
                $rs .= "<${typ}>${val}</${typ}>";
            }
        }
        return $rs;
    }

    /**
     * @return string  the data in XML format
     */
    function serialize()
    {
        return $this->serializeval($this);
    }

    /**
     * @return string  the data in XML format
     */
    function serializeval($o)
    {
        if (!is_object($o) || empty($o->me) || !is_array($o->me)) {
            return '';
        }
        $ar = $o->me;
        reset($ar);
        list($typ, $val) = each($ar);
        return '<value>' .  $this->serializedata($typ, $val) .  "</value>\n";
    }

    /**
     * @return mixed  the contents of the element requested
     */
    function structmem($m)
    {
        return $this->me['struct'][$m];
    }

    /**
     * @return void
     */
    function structreset()
    {
        reset($this->me['struct']);
    }

    /**
     * @return  the key/value pair of the struct's current element
     */
    function structeach()
    {
        return each($this->me['struct']);
    }

    /**
     * @return mixed  the current value
     */
    function getval()
    {
        // UNSTABLE

        reset($this->me);
        $b = current($this->me);

        // contributed by I Sofer, 2001-03-24
        // add support for nested arrays to scalarval
        // i've created a new method here, so as to
        // preserve back compatibility

        if (is_array($b)) {
            foreach ($b as $id => $cont) {
                $b[$id] = $cont->scalarval();
            }
        }

        // add support for structures directly encoding php objects
        if (is_object($b)) {
            $t = get_object_vars($b);
            foreach ($t as $id => $cont) {
                $t[$id] = $cont->scalarval();
            }
            foreach ($t as $id => $cont) {
                $b->$id = $cont;
            }
        }

        // end contrib
        return $b;
    }

    /**
     * @return mixed  the current element's scalar value.  If the value is
     *                 not scalar, FALSE is returned.
     */
    function scalarval()
    {
        reset($this->me);
        $v = current($this->me);
        if (!is_scalar($v)) {
            $v = false;
        }
        return $v;
    }

    /**
     * @return string
     */
    function scalartyp()
    {
        reset($this->me);
        $a = key($this->me);
        if ($a == $GLOBALS['XML_RPC_I4']) {
            $a = $GLOBALS['XML_RPC_Int'];
        }
        return $a;
    }

    /**
     * @return mixed  the struct's current element
     */
    function arraymem($m)
    {
        return $this->me['array'][$m];
    }

    /**
     * @return int  the number of elements in the array
     */
    function arraysize()
    {
        reset($this->me);
        list($a, $b) = each($this->me);
        return sizeof($b);
    }

    /**
     * Determines if the item submitted is an XML_RPC_Value object
     *
     * @param mixed $val  the variable to be evaluated
     *
     * @return bool  TRUE if the item is an XML_RPC_Value object
     *
     * @static
     * @since Method available since Release 1.3.0
     */
    function isValue($val)
    {
        return (strtolower(get_class($val)) == 'xml_rpc_value');
    }
}

/**
 * Return an ISO8601 encoded string
 *
 * While timezones ought to be supported, the XML-RPC spec says:
 *
 * "Don't assume a timezone. It should be specified by the server in its
 * documentation what assumptions it makes about timezones."
 *
 * This routine always assumes localtime unless $utc is set to 1, in which
 * case UTC is assumed and an adjustment for locale is made when encoding.
 *
 * @return string  the formatted date
 */
function XML_RPC_iso8601_encode($timet, $utc = 0)
{
    if (!$utc) {
        $t = strftime('%Y%m%dT%H:%M:%S', $timet);
    } else {
        if (function_exists('gmstrftime')) {
            // gmstrftime doesn't exist in some versions
            // of PHP
            $t = gmstrftime('%Y%m%dT%H:%M:%S', $timet);
        } else {
            $t = strftime('%Y%m%dT%H:%M:%S', $timet - date('Z'));
        }
    }
    return $t;
}

/**
 * Convert a datetime string into a Unix timestamp
 *
 * While timezones ought to be supported, the XML-RPC spec says:
 *
 * "Don't assume a timezone. It should be specified by the server in its
 * documentation what assumptions it makes about timezones."
 *
 * This routine always assumes localtime unless $utc is set to 1, in which
 * case UTC is assumed and an adjustment for locale is made when encoding.
 *
 * @return int  the unix timestamp of the date submitted
 */
function XML_RPC_iso8601_decode($idate, $utc = 0)
{
    $t = 0;
    if (preg_match('@([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})@', $idate, $regs)) {
        if ($utc) {
            $t = gmmktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
        } else {
            $t = mktime($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]);
        }
    }
    return $t;
}

/**
 * Converts an XML_RPC_Value object into native PHP types
 *
 * @param object $XML_RPC_val  the XML_RPC_Value object to decode
 *
 * @return mixed  the PHP values
 */
function XML_RPC_decode($XML_RPC_val)
{
    $kind = $XML_RPC_val->kindOf();

    if ($kind == 'scalar') {
        return $XML_RPC_val->scalarval();

    } elseif ($kind == 'array') {
        $size = $XML_RPC_val->arraysize();
        $arr = array();
        for ($i = 0; $i < $size; $i++) {
            $arr[] = XML_RPC_decode($XML_RPC_val->arraymem($i));
        }
        return $arr;

    } elseif ($kind == 'struct') {
        $XML_RPC_val->structreset();
        $arr = array();
        while (list($key, $value) = $XML_RPC_val->structeach()) {
            $arr[$key] = XML_RPC_decode($value);
        }
        return $arr;
    }
}

/**
 * Converts native PHP types into an XML_RPC_Value object
 *
 * @param mixed $php_val  the PHP value or variable you want encoded
 *
 * @return object  the XML_RPC_Value object
 */
function XML_RPC_encode($php_val)
{
    $type = gettype($php_val);
    $XML_RPC_val = new XML_RPC_Value;

    switch ($type) {
    case 'array':
        if (empty($php_val)) {
            $XML_RPC_val->addArray($php_val);
            break;
        }
        $tmp = array_diff(array_keys($php_val), range(0, count($php_val)-1));
        if (empty($tmp)) {
           $arr = array();
           foreach ($php_val as $k => $v) {
               $arr[$k] = XML_RPC_encode($v);
           }
           $XML_RPC_val->addArray($arr);
           break;
        }
        // fall though if it's not an enumerated array

    case 'object':
        $arr = array();
        foreach ($php_val as $k => $v) {
            $arr[$k] = XML_RPC_encode($v);
        }
        $XML_RPC_val->addStruct($arr);
        break;

    case 'integer':
        $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Int']);
        break;

    case 'double':
        $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Double']);
        break;

    case 'string':
    case 'NULL':
        if (preg_match('@^[0-9]{8}\T{1}[0-9]{2}\:[0-9]{2}\:[0-9]{2}$@', $php_val)) {
            $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_DateTime']);
        } elseif ($GLOBALS['XML_RPC_auto_base64']
                  && preg_match("@[^ -~\t\r\n]@", $php_val))
        {
            // Characters other than alpha-numeric, punctuation, SP, TAB,
            // LF and CR break the XML parser, encode value via Base 64.
            $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Base64']);
        } else {
            $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_String']);
        }
        break;

    case 'boolean':
        // Add support for encoding/decoding of booleans, since they
        // are supported in PHP
        // by <G_Giunta_2001-02-29>
        $XML_RPC_val->addScalar($php_val, $GLOBALS['XML_RPC_Boolean']);
        break;

    case 'unknown type':
    default:
        $XML_RPC_val = false;
    }
    return $XML_RPC_val;
}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * c-hanging-comment-ender-p: nil
 * End:
 */

?>
PK�^�\�'7,����
pear/PEAR.phpnu�[���<?php
/**
 * PEAR, the PHP Extension and Application Repository
 *
 * PEAR class and PEAR_Error class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Sterling Hughes <sterling@php.net>
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2010 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**#@+
 * ERROR constants
 */
define('PEAR_ERROR_RETURN',     1);
define('PEAR_ERROR_PRINT',      2);
define('PEAR_ERROR_TRIGGER',    4);
define('PEAR_ERROR_DIE',        8);
define('PEAR_ERROR_CALLBACK',  16);
/**
 * WARNING: obsolete
 * @deprecated
 */
define('PEAR_ERROR_EXCEPTION', 32);
/**#@-*/

if (substr(PHP_OS, 0, 3) == 'WIN') {
    define('OS_WINDOWS', true);
    define('OS_UNIX',    false);
    define('PEAR_OS',    'Windows');
} else {
    define('OS_WINDOWS', false);
    define('OS_UNIX',    true);
    define('PEAR_OS',    'Unix'); // blatant assumption
}

$GLOBALS['_PEAR_default_error_mode']     = PEAR_ERROR_RETURN;
$GLOBALS['_PEAR_default_error_options']  = E_USER_NOTICE;
$GLOBALS['_PEAR_destructor_object_list'] = array();
$GLOBALS['_PEAR_shutdown_funcs']         = array();
$GLOBALS['_PEAR_error_handler_stack']    = array();

if(function_exists('ini_set')) {
    @ini_set('track_errors', true);
}

/**
 * Base class for other PEAR classes.  Provides rudimentary
 * emulation of destructors.
 *
 * If you want a destructor in your class, inherit PEAR and make a
 * destructor method called _yourclassname (same name as the
 * constructor, but with a "_" prefix).  Also, in your constructor you
 * have to call the PEAR constructor: $this->PEAR();.
 * The destructor method will be called without parameters.  Note that
 * at in some SAPI implementations (such as Apache), any output during
 * the request shutdown (in which destructors are called) seems to be
 * discarded.  If you need to get any debug information from your
 * destructor, use error_log(), syslog() or something similar.
 *
 * IMPORTANT! To use the emulated destructors you need to create the
 * objects by reference: $obj =& new PEAR_child;
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2006 The PHP Group
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @see        PEAR_Error
 * @since      Class available since PHP 4.0.2
 * @link        http://pear.php.net/manual/en/core.pear.php#core.pear.pear
 */
class PEAR
{
    /**
     * Whether to enable internal debug messages.
     *
     * @var     bool
     * @access  private
     */
    var $_debug = false;

    /**
     * Default error mode for this object.
     *
     * @var     int
     * @access  private
     */
    var $_default_error_mode = null;

    /**
     * Default error options used for this object when error mode
     * is PEAR_ERROR_TRIGGER.
     *
     * @var     int
     * @access  private
     */
    var $_default_error_options = null;

    /**
     * Default error handler (callback) for this object, if error mode is
     * PEAR_ERROR_CALLBACK.
     *
     * @var     string
     * @access  private
     */
    var $_default_error_handler = '';

    /**
     * Which class to use for error objects.
     *
     * @var     string
     * @access  private
     */
    var $_error_class = 'PEAR_Error';

    /**
     * An array of expected errors.
     *
     * @var     array
     * @access  private
     */
    var $_expected_errors = array();

    /**
     * List of methods that can be called both statically and non-statically.
     * @var array
     */
    protected static $bivalentMethods = array(
        'setErrorHandling' => true,
        'raiseError' => true,
        'throwError' => true,
        'pushErrorHandling' => true,
        'popErrorHandling' => true,
    );

    /**
     * Constructor.  Registers this object in
     * $_PEAR_destructor_object_list for destructor emulation if a
     * destructor object exists.
     *
     * @param string $error_class  (optional) which class to use for
     *        error objects, defaults to PEAR_Error.
     * @access public
     * @return void
     */
    function __construct($error_class = null)
    {
        $classname = strtolower(get_class($this));
        if ($this->_debug) {
            print "PEAR constructor called, class=$classname\n";
        }

        if ($error_class !== null) {
            $this->_error_class = $error_class;
        }

        while ($classname && strcasecmp($classname, "pear")) {
            $destructor = "_$classname";
            if (method_exists($this, $destructor)) {
                global $_PEAR_destructor_object_list;
                $_PEAR_destructor_object_list[] = $this;
                if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
                    register_shutdown_function("_PEAR_call_destructors");
                    $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
                }
                break;
            } else {
                $classname = get_parent_class($classname);
            }
        }
    }

    /**
     * Only here for backwards compatibility.
     * E.g. Archive_Tar calls $this->PEAR() in its constructor.
     *
     * @param string $error_class Which class to use for error objects,
     *                            defaults to PEAR_Error.
     */
    public function PEAR($error_class = null)
    {
        self::__construct($error_class);
    }

    /**
     * Destructor (the emulated type of...).  Does nothing right now,
     * but is included for forward compatibility, so subclass
     * destructors should always call it.
     *
     * See the note in the class desciption about output from
     * destructors.
     *
     * @access public
     * @return void
     */
    function _PEAR() {
        if ($this->_debug) {
            printf("PEAR destructor called, class=%s\n", strtolower(get_class($this)));
        }
    }

    public function __call($method, $arguments)
    {
        if (!isset(self::$bivalentMethods[$method])) {
            trigger_error(
                'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR
            );
        }
        return call_user_func_array(
            array(__CLASS__, '_' . $method),
            array_merge(array($this), $arguments)
        );
    }

    public static function __callStatic($method, $arguments)
    {
        if (!isset(self::$bivalentMethods[$method])) {
            trigger_error(
                'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR
            );
        }
        return call_user_func_array(
            array(__CLASS__, '_' . $method),
            array_merge(array(null), $arguments)
        );
    }

    /**
    * If you have a class that's mostly/entirely static, and you need static
    * properties, you can use this method to simulate them. Eg. in your method(s)
    * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');
    * You MUST use a reference, or they will not persist!
    *
    * @param  string $class  The calling classname, to prevent clashes
    * @param  string $var    The variable to retrieve.
    * @return mixed   A reference to the variable. If not set it will be
    *                 auto initialised to NULL.
    */
    public static function &getStaticProperty($class, $var)
    {
        static $properties;
        if (!isset($properties[$class])) {
            $properties[$class] = array();
        }

        if (!array_key_exists($var, $properties[$class])) {
            $properties[$class][$var] = null;
        }

        return $properties[$class][$var];
    }

    /**
    * Use this function to register a shutdown method for static
    * classes.
    *
    * @param  mixed $func  The function name (or array of class/method) to call
    * @param  mixed $args  The arguments to pass to the function
    *
    * @return void
    */
    public static function registerShutdownFunc($func, $args = array())
    {
        // if we are called statically, there is a potential
        // that no shutdown func is registered.  Bug #6445
        if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
            register_shutdown_function("_PEAR_call_destructors");
            $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
        }
        $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);
    }

    /**
     * Tell whether a value is a PEAR error.
     *
     * @param   mixed $data   the value to test
     * @param   int   $code   if $data is an error object, return true
     *                        only if $code is a string and
     *                        $obj->getMessage() == $code or
     *                        $code is an integer and $obj->getCode() == $code
     *
     * @return  bool    true if parameter is an error
     */
    public static function isError($data, $code = null)
    {
        if (!is_a($data, 'PEAR_Error')) {
            return false;
        }

        if (is_null($code)) {
            return true;
        } elseif (is_string($code)) {
            return $data->getMessage() == $code;
        }

        return $data->getCode() == $code;
    }

    /**
     * Sets how errors generated by this object should be handled.
     * Can be invoked both in objects and statically.  If called
     * statically, setErrorHandling sets the default behaviour for all
     * PEAR objects.  If called in an object, setErrorHandling sets
     * the default behaviour for that object.
     *
     * @param object $object
     *        Object the method was called on (non-static mode)
     *
     * @param int $mode
     *        One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
     *        PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
     *        PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
     *
     * @param mixed $options
     *        When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
     *        of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
     *
     *        When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
     *        to be the callback function or method.  A callback
     *        function is a string with the name of the function, a
     *        callback method is an array of two elements: the element
     *        at index 0 is the object, and the element at index 1 is
     *        the name of the method to call in the object.
     *
     *        When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
     *        a printf format string used when printing the error
     *        message.
     *
     * @access public
     * @return void
     * @see PEAR_ERROR_RETURN
     * @see PEAR_ERROR_PRINT
     * @see PEAR_ERROR_TRIGGER
     * @see PEAR_ERROR_DIE
     * @see PEAR_ERROR_CALLBACK
     * @see PEAR_ERROR_EXCEPTION
     *
     * @since PHP 4.0.5
     */
    protected static function _setErrorHandling(
        $object, $mode = null, $options = null
    ) {
        if ($object !== null) {
            $setmode     = &$object->_default_error_mode;
            $setoptions  = &$object->_default_error_options;
        } else {
            $setmode     = &$GLOBALS['_PEAR_default_error_mode'];
            $setoptions  = &$GLOBALS['_PEAR_default_error_options'];
        }

        switch ($mode) {
            case PEAR_ERROR_EXCEPTION:
            case PEAR_ERROR_RETURN:
            case PEAR_ERROR_PRINT:
            case PEAR_ERROR_TRIGGER:
            case PEAR_ERROR_DIE:
            case null:
                $setmode = $mode;
                $setoptions = $options;
                break;

            case PEAR_ERROR_CALLBACK:
                $setmode = $mode;
                // class/object method callback
                if (is_callable($options)) {
                    $setoptions = $options;
                } else {
                    trigger_error("invalid error callback", E_USER_WARNING);
                }
                break;

            default:
                trigger_error("invalid error mode", E_USER_WARNING);
                break;
        }
    }

    /**
     * This method is used to tell which errors you expect to get.
     * Expected errors are always returned with error mode
     * PEAR_ERROR_RETURN.  Expected error codes are stored in a stack,
     * and this method pushes a new element onto it.  The list of
     * expected errors are in effect until they are popped off the
     * stack with the popExpect() method.
     *
     * Note that this method can not be called statically
     *
     * @param mixed $code a single error code or an array of error codes to expect
     *
     * @return int     the new depth of the "expected errors" stack
     * @access public
     */
    function expectError($code = '*')
    {
        if (is_array($code)) {
            array_push($this->_expected_errors, $code);
        } else {
            array_push($this->_expected_errors, array($code));
        }
        return count($this->_expected_errors);
    }

    /**
     * This method pops one element off the expected error codes
     * stack.
     *
     * @return array   the list of error codes that were popped
     */
    function popExpect()
    {
        return array_pop($this->_expected_errors);
    }

    /**
     * This method checks unsets an error code if available
     *
     * @param mixed error code
     * @return bool true if the error code was unset, false otherwise
     * @access private
     * @since PHP 4.3.0
     */
    function _checkDelExpect($error_code)
    {
        $deleted = false;
        foreach ($this->_expected_errors as $key => $error_array) {
            if (in_array($error_code, $error_array)) {
                unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
                $deleted = true;
            }

            // clean up empty arrays
            if (0 == count($this->_expected_errors[$key])) {
                unset($this->_expected_errors[$key]);
            }
        }

        return $deleted;
    }

    /**
     * This method deletes all occurrences of the specified element from
     * the expected error codes stack.
     *
     * @param  mixed $error_code error code that should be deleted
     * @return mixed list of error codes that were deleted or error
     * @access public
     * @since PHP 4.3.0
     */
    function delExpect($error_code)
    {
        $deleted = false;
        if ((is_array($error_code) && (0 != count($error_code)))) {
            // $error_code is a non-empty array here; we walk through it trying
            // to unset all values
            foreach ($error_code as $key => $error) {
                $deleted =  $this->_checkDelExpect($error) ? true : false;
            }

            return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
        } elseif (!empty($error_code)) {
            // $error_code comes alone, trying to unset it
            if ($this->_checkDelExpect($error_code)) {
                return true;
            }

            return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
        }

        // $error_code is empty
        return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME
    }

    /**
     * This method is a wrapper that returns an instance of the
     * configured error class with this object's default error
     * handling applied.  If the $mode and $options parameters are not
     * specified, the object's defaults are used.
     *
     * @param mixed $message a text error message or a PEAR error object
     *
     * @param int $code      a numeric error code (it is up to your class
     *                  to define these if you want to use codes)
     *
     * @param int $mode      One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
     *                  PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
     *                  PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.
     *
     * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter
     *                  specifies the PHP-internal error level (one of
     *                  E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
     *                  If $mode is PEAR_ERROR_CALLBACK, this
     *                  parameter specifies the callback function or
     *                  method.  In other error modes this parameter
     *                  is ignored.
     *
     * @param string $userinfo If you need to pass along for example debug
     *                  information, this parameter is meant for that.
     *
     * @param string $error_class The returned error object will be
     *                  instantiated from this class, if specified.
     *
     * @param bool $skipmsg If true, raiseError will only pass error codes,
     *                  the error message parameter will be dropped.
     *
     * @return object   a PEAR error object
     * @see PEAR::setErrorHandling
     * @since PHP 4.0.5
     */
    protected static function _raiseError($object,
                         $message = null,
                         $code = null,
                         $mode = null,
                         $options = null,
                         $userinfo = null,
                         $error_class = null,
                         $skipmsg = false)
    {
        // The error is yet a PEAR error object
        if (is_object($message)) {
            $code        = $message->getCode();
            $userinfo    = $message->getUserInfo();
            $error_class = $message->getType();
            $message->error_message_prefix = '';
            $message     = $message->getMessage();
        }

        if (
            $object !== null &&
            isset($object->_expected_errors) &&
            count($object->_expected_errors) > 0 &&
            count($exp = end($object->_expected_errors))
        ) {
            if ($exp[0] === "*" ||
                (is_int(reset($exp)) && in_array($code, $exp)) ||
                (is_string(reset($exp)) && in_array($message, $exp))
            ) {
                $mode = PEAR_ERROR_RETURN;
            }
        }

        // No mode given, try global ones
        if ($mode === null) {
            // Class error handler
            if ($object !== null && isset($object->_default_error_mode)) {
                $mode    = $object->_default_error_mode;
                $options = $object->_default_error_options;
            // Global error handler
            } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) {
                $mode    = $GLOBALS['_PEAR_default_error_mode'];
                $options = $GLOBALS['_PEAR_default_error_options'];
            }
        }

        if ($error_class !== null) {
            $ec = $error_class;
        } elseif ($object !== null && isset($object->_error_class)) {
            $ec = $object->_error_class;
        } else {
            $ec = 'PEAR_Error';
        }

        if ($skipmsg) {
            $a = new $ec($code, $mode, $options, $userinfo);
        } else {
            $a = new $ec($message, $code, $mode, $options, $userinfo);
        }

        return $a;
    }

    /**
     * Simpler form of raiseError with fewer options.  In most cases
     * message, code and userinfo are enough.
     *
     * @param mixed $message a text error message or a PEAR error object
     *
     * @param int $code      a numeric error code (it is up to your class
     *                  to define these if you want to use codes)
     *
     * @param string $userinfo If you need to pass along for example debug
     *                  information, this parameter is meant for that.
     *
     * @return object   a PEAR error object
     * @see PEAR::raiseError
     */
    protected static function _throwError($object, $message = null, $code = null, $userinfo = null)
    {
        if ($object !== null) {
            $a = $object->raiseError($message, $code, null, null, $userinfo);
            return $a;
        }

        $a = PEAR::raiseError($message, $code, null, null, $userinfo);
        return $a;
    }

    public static function staticPushErrorHandling($mode, $options = null)
    {
        $stack       = &$GLOBALS['_PEAR_error_handler_stack'];
        $def_mode    = &$GLOBALS['_PEAR_default_error_mode'];
        $def_options = &$GLOBALS['_PEAR_default_error_options'];
        $stack[] = array($def_mode, $def_options);
        switch ($mode) {
            case PEAR_ERROR_EXCEPTION:
            case PEAR_ERROR_RETURN:
            case PEAR_ERROR_PRINT:
            case PEAR_ERROR_TRIGGER:
            case PEAR_ERROR_DIE:
            case null:
                $def_mode = $mode;
                $def_options = $options;
                break;

            case PEAR_ERROR_CALLBACK:
                $def_mode = $mode;
                // class/object method callback
                if (is_callable($options)) {
                    $def_options = $options;
                } else {
                    trigger_error("invalid error callback", E_USER_WARNING);
                }
                break;

            default:
                trigger_error("invalid error mode", E_USER_WARNING);
                break;
        }
        $stack[] = array($mode, $options);
        return true;
    }

    public static function staticPopErrorHandling()
    {
        $stack = &$GLOBALS['_PEAR_error_handler_stack'];
        $setmode     = &$GLOBALS['_PEAR_default_error_mode'];
        $setoptions  = &$GLOBALS['_PEAR_default_error_options'];
        array_pop($stack);
        list($mode, $options) = $stack[sizeof($stack) - 1];
        array_pop($stack);
        switch ($mode) {
            case PEAR_ERROR_EXCEPTION:
            case PEAR_ERROR_RETURN:
            case PEAR_ERROR_PRINT:
            case PEAR_ERROR_TRIGGER:
            case PEAR_ERROR_DIE:
            case null:
                $setmode = $mode;
                $setoptions = $options;
                break;

            case PEAR_ERROR_CALLBACK:
                $setmode = $mode;
                // class/object method callback
                if (is_callable($options)) {
                    $setoptions = $options;
                } else {
                    trigger_error("invalid error callback", E_USER_WARNING);
                }
                break;

            default:
                trigger_error("invalid error mode", E_USER_WARNING);
                break;
        }
        return true;
    }

    /**
     * Push a new error handler on top of the error handler options stack. With this
     * you can easily override the actual error handler for some code and restore
     * it later with popErrorHandling.
     *
     * @param mixed $mode (same as setErrorHandling)
     * @param mixed $options (same as setErrorHandling)
     *
     * @return bool Always true
     *
     * @see PEAR::setErrorHandling
     */
    protected static function _pushErrorHandling($object, $mode, $options = null)
    {
        $stack = &$GLOBALS['_PEAR_error_handler_stack'];
        if ($object !== null) {
            $def_mode    = &$object->_default_error_mode;
            $def_options = &$object->_default_error_options;
        } else {
            $def_mode    = &$GLOBALS['_PEAR_default_error_mode'];
            $def_options = &$GLOBALS['_PEAR_default_error_options'];
        }
        $stack[] = array($def_mode, $def_options);

        if ($object !== null) {
            $object->setErrorHandling($mode, $options);
        } else {
            PEAR::setErrorHandling($mode, $options);
        }
        $stack[] = array($mode, $options);
        return true;
    }

    /**
    * Pop the last error handler used
    *
    * @return bool Always true
    *
    * @see PEAR::pushErrorHandling
    */
    protected static function _popErrorHandling($object)
    {
        $stack = &$GLOBALS['_PEAR_error_handler_stack'];
        array_pop($stack);
        list($mode, $options) = $stack[sizeof($stack) - 1];
        array_pop($stack);
        if ($object !== null) {
            $object->setErrorHandling($mode, $options);
        } else {
            PEAR::setErrorHandling($mode, $options);
        }
        return true;
    }

    /**
    * OS independent PHP extension load. Remember to take care
    * on the correct extension name for case sensitive OSes.
    *
    * @param string $ext The extension name
    * @return bool Success or not on the dl() call
    */
    public static function loadExtension($ext)
    {
        if (extension_loaded($ext)) {
            return true;
        }

        // if either returns true dl() will produce a FATAL error, stop that
        if (
            function_exists('dl') === false ||
            ini_get('enable_dl') != 1
        ) {
            return false;
        }

        if (OS_WINDOWS) {
            $suffix = '.dll';
        } elseif (PHP_OS == 'HP-UX') {
            $suffix = '.sl';
        } elseif (PHP_OS == 'AIX') {
            $suffix = '.a';
        } elseif (PHP_OS == 'OSX') {
            $suffix = '.bundle';
        } else {
            $suffix = '.so';
        }

        return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);
    }

    /**
     * Get SOURCE_DATE_EPOCH environment variable
     * See https://reproducible-builds.org/specs/source-date-epoch/
     *
     * @return int
     * @access public
     */
    static function getSourceDateEpoch()
    {
        if ($source_date_epoch = getenv('SOURCE_DATE_EPOCH')) {
            if (preg_match('/^\d+$/', $source_date_epoch)) {
                return (int) $source_date_epoch;
            } else {
            //  "If the value is malformed, the build process SHOULD exit with a non-zero error code."
            self::raiseError("Invalid SOURCE_DATE_EPOCH: $source_date_epoch");
            exit(1);
            }
        } else {
            return time();
        }
    }
}

function _PEAR_call_destructors()
{
    global $_PEAR_destructor_object_list;
    if (is_array($_PEAR_destructor_object_list) &&
        sizeof($_PEAR_destructor_object_list))
    {
        reset($_PEAR_destructor_object_list);

        $destructLifoExists = PEAR::getStaticProperty('PEAR', 'destructlifo');

        if ($destructLifoExists) {
            $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);
        }

        foreach ($_PEAR_destructor_object_list as $k => $objref) {
            $classname = get_class($objref);
            while ($classname) {
                $destructor = "_$classname";
                if (method_exists($objref, $destructor)) {
                    $objref->$destructor();
                    break;
                } else {
                    $classname = get_parent_class($classname);
                }
            }
        }
        // Empty the object list to ensure that destructors are
        // not called more than once.
        $_PEAR_destructor_object_list = array();
    }

    // Now call the shutdown functions
    if (
        isset($GLOBALS['_PEAR_shutdown_funcs']) &&
        is_array($GLOBALS['_PEAR_shutdown_funcs']) &&
        !empty($GLOBALS['_PEAR_shutdown_funcs'])
    ) {
        foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {
            call_user_func_array($value[0], $value[1]);
        }
    }
}

/**
 * Standard PEAR error class for PHP 4
 *
 * This class is supserseded by {@link PEAR_Exception} in PHP 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V. Cox <cox@idecnet.com>
 * @author     Gregory Beaver <cellog@php.net>
 * @copyright  1997-2006 The PHP Group
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/manual/en/core.pear.pear-error.php
 * @see        PEAR::raiseError(), PEAR::throwError()
 * @since      Class available since PHP 4.0.2
 */
class PEAR_Error
{
    var $error_message_prefix = '';
    var $mode                 = PEAR_ERROR_RETURN;
    var $level                = E_USER_NOTICE;
    var $code                 = -1;
    var $message              = '';
    var $userinfo             = '';
    var $backtrace            = null;
    var $callback             = null;

    /**
     * PEAR_Error constructor
     *
     * @param string $message  message
     *
     * @param int $code     (optional) error code
     *
     * @param int $mode     (optional) error mode, one of: PEAR_ERROR_RETURN,
     * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,
     * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION
     *
     * @param mixed $options   (optional) error level, _OR_ in the case of
     * PEAR_ERROR_CALLBACK, the callback function or object/method
     * tuple.
     *
     * @param string $userinfo (optional) additional user/debug info
     *
     * @access public
     *
     */
    function __construct($message = 'unknown error', $code = null,
                        $mode = null, $options = null, $userinfo = null)
    {
        if ($mode === null) {
            $mode = PEAR_ERROR_RETURN;
        }
        $this->message   = $message;
        $this->code      = $code;
        $this->mode      = $mode;
        $this->userinfo  = $userinfo;

        $skiptrace = PEAR::getStaticProperty('PEAR_Error', 'skiptrace');

        if (!$skiptrace) {
            $this->backtrace = debug_backtrace();
            if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) {
                unset($this->backtrace[0]['object']);
            }
        }

        if ($mode & PEAR_ERROR_CALLBACK) {
            $this->level = E_USER_NOTICE;
            $this->callback = $options;
        } else {
            if ($options === null) {
                $options = E_USER_NOTICE;
            }

            $this->level = $options;
            $this->callback = null;
        }

        if ($this->mode & PEAR_ERROR_PRINT) {
            if (is_null($options) || is_int($options)) {
                $format = "%s";
            } else {
                $format = $options;
            }

            printf($format, $this->getMessage());
        }

        if ($this->mode & PEAR_ERROR_TRIGGER) {
            trigger_error($this->getMessage(), $this->level);
        }

        if ($this->mode & PEAR_ERROR_DIE) {
            $msg = $this->getMessage();
            if (is_null($options) || is_int($options)) {
                $format = "%s";
                if (substr($msg, -1) != "\n") {
                    $msg .= "\n";
                }
            } else {
                $format = $options;
            }
            printf($format, $msg);
            exit($code);
        }

        if ($this->mode & PEAR_ERROR_CALLBACK && is_callable($this->callback)) {
            call_user_func($this->callback, $this);
        }

        if ($this->mode & PEAR_ERROR_EXCEPTION) {
            trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING);
            eval('$e = new Exception($this->message, $this->code);throw($e);');
        }
    }

    /**
     * Only here for backwards compatibility.
     *
     * Class "Cache_Error" still uses it, among others.
     *
     * @param string $message  Message
     * @param int    $code     Error code
     * @param int    $mode     Error mode
     * @param mixed  $options  See __construct()
     * @param string $userinfo Additional user/debug info
     */
    public function PEAR_Error(
        $message = 'unknown error', $code = null, $mode = null,
        $options = null, $userinfo = null
    ) {
        self::__construct($message, $code, $mode, $options, $userinfo);
    }

    /**
     * Get the error mode from an error object.
     *
     * @return int error mode
     * @access public
     */
    function getMode()
    {
        return $this->mode;
    }

    /**
     * Get the callback function/method from an error object.
     *
     * @return mixed callback function or object/method array
     * @access public
     */
    function getCallback()
    {
        return $this->callback;
    }

    /**
     * Get the error message from an error object.
     *
     * @return  string  full error message
     * @access public
     */
    function getMessage()
    {
        return ($this->error_message_prefix . $this->message);
    }

    /**
     * Get error code from an error object
     *
     * @return int error code
     * @access public
     */
     function getCode()
     {
        return $this->code;
     }

    /**
     * Get the name of this error/exception.
     *
     * @return string error/exception name (type)
     * @access public
     */
    function getType()
    {
        return get_class($this);
    }

    /**
     * Get additional user-supplied information.
     *
     * @return string user-supplied information
     * @access public
     */
    function getUserInfo()
    {
        return $this->userinfo;
    }

    /**
     * Get additional debug information supplied by the application.
     *
     * @return string debug information
     * @access public
     */
    function getDebugInfo()
    {
        return $this->getUserInfo();
    }

    /**
     * Get the call backtrace from where the error was generated.
     * Supported with PHP 4.3.0 or newer.
     *
     * @param int $frame (optional) what frame to fetch
     * @return array Backtrace, or NULL if not available.
     * @access public
     */
    function getBacktrace($frame = null)
    {
        if (defined('PEAR_IGNORE_BACKTRACE')) {
            return null;
        }
        if ($frame === null) {
            return $this->backtrace;
        }
        return $this->backtrace[$frame];
    }

    function addUserInfo($info)
    {
        if (empty($this->userinfo)) {
            $this->userinfo = $info;
        } else {
            $this->userinfo .= " ** $info";
        }
    }

    function __toString()
    {
        return $this->getMessage();
    }

    /**
     * Make a string representation of this object.
     *
     * @return string a string with an object summary
     * @access public
     */
    function toString()
    {
        $modes = array();
        $levels = array(E_USER_NOTICE  => 'notice',
                        E_USER_WARNING => 'warning',
                        E_USER_ERROR   => 'error');
        if ($this->mode & PEAR_ERROR_CALLBACK) {
            if (is_array($this->callback)) {
                $callback = (is_object($this->callback[0]) ?
                    strtolower(get_class($this->callback[0])) :
                    $this->callback[0]) . '::' .
                    $this->callback[1];
            } else {
                $callback = $this->callback;
            }
            return sprintf('[%s: message="%s" code=%d mode=callback '.
                           'callback=%s prefix="%s" info="%s"]',
                           strtolower(get_class($this)), $this->message, $this->code,
                           $callback, $this->error_message_prefix,
                           $this->userinfo);
        }
        if ($this->mode & PEAR_ERROR_PRINT) {
            $modes[] = 'print';
        }
        if ($this->mode & PEAR_ERROR_TRIGGER) {
            $modes[] = 'trigger';
        }
        if ($this->mode & PEAR_ERROR_DIE) {
            $modes[] = 'die';
        }
        if ($this->mode & PEAR_ERROR_RETURN) {
            $modes[] = 'return';
        }
        return sprintf('[%s: message="%s" code=%d mode=%s level=%s '.
                       'prefix="%s" info="%s"]',
                       strtolower(get_class($this)), $this->message, $this->code,
                       implode("|", $modes), $levels[$this->level],
                       $this->error_message_prefix,
                       $this->userinfo);
    }
}

/*
 * Local Variables:
 * mode: php
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 */
PK�^�\����Z�Z�pear/Net/Sieve.phpnu�[���<?php
/**
 * This file contains the Net_Sieve class.
 *
 * PHP version 5
 *
 * +-----------------------------------------------------------------------+
 * | All rights reserved.                                                  |
 * |                                                                       |
 * | Redistribution and use in source and binary forms, with or without    |
 * | modification, are permitted provided that the following conditions    |
 * | are met:                                                              |
 * |                                                                       |
 * | o Redistributions of source code must retain the above copyright      |
 * |   notice, this list of conditions and the following disclaimer.       |
 * | o Redistributions in binary form must reproduce the above copyright   |
 * |   notice, this list of conditions and the following disclaimer in the |
 * |   documentation and/or other materials provided with the distribution.|
 * |                                                                       |
 * | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
 * | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
 * | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
 * | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
 * | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
 * | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
 * | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
 * | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
 * | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
 * | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
 * | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
 * +-----------------------------------------------------------------------+
 *
 * @category  Networking
 * @package   Net_Sieve
 * @author    Richard Heyes <richard@phpguru.org>
 * @author    Damian Fernandez Sosa <damlists@cnba.uba.ar>
 * @author    Anish Mistry <amistry@am-productions.biz>
 * @author    Jan Schneider <jan@horde.org>
 * @copyright 2002-2003 Richard Heyes
 * @copyright 2006-2008 Anish Mistry
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD
 * @link      http://pear.php.net/package/Net_Sieve
 */

require_once 'PEAR.php';
require_once 'Net/Socket.php';

/**
 * Disconnected state
 *
 * @const NET_SIEVE_STATE_DISCONNECTED
 */
define('NET_SIEVE_STATE_DISCONNECTED', 1);

/**
 * Authorisation state
 *
 * @const NET_SIEVE_STATE_AUTHORISATION
 */
define('NET_SIEVE_STATE_AUTHORISATION', 2);

/**
 * Transaction state
 *
 * @const NET_SIEVE_STATE_TRANSACTION
 */
define('NET_SIEVE_STATE_TRANSACTION', 3);


/**
 * A class for talking to the timsieved server which comes with Cyrus IMAP.
 *
 * @category  Networking
 * @package   Net_Sieve
 * @author    Richard Heyes <richard@phpguru.org>
 * @author    Damian Fernandez Sosa <damlists@cnba.uba.ar>
 * @author    Anish Mistry <amistry@am-productions.biz>
 * @author    Jan Schneider <jan@horde.org>
 * @author    Neil Munday <neil@mundayweb.com>
 * @copyright 2002-2003 Richard Heyes
 * @copyright 2006-2008 Anish Mistry
 * @license   http://www.opensource.org/licenses/bsd-license.php BSD
 * @version   Release: 1.4.5
 * @link      http://pear.php.net/package/Net_Sieve
 * @link      http://tools.ietf.org/html/rfc5228 RFC 5228 (Sieve: An Email
 *            Filtering Language)
 * @link      http://tools.ietf.org/html/rfc5804 RFC 5804 A Protocol for
 *            Remotely Managing Sieve Scripts
 */
class Net_Sieve
{
    /**
     * The authentication methods this class supports.
     *
     * Can be overwritten if having problems with certain methods.
     *
     * @var array
     */
    var $supportedAuthMethods = array(
        'DIGEST-MD5',
        'CRAM-MD5',
        'EXTERNAL',
        'PLAIN' ,
        'LOGIN',
        'GSSAPI',
        'XOAUTH2'
    );

    /**
     * SASL authentication methods that require Auth_SASL.
     *
     * @var array
     */
    var $supportedSASLAuthMethods = array('DIGEST-MD5', 'CRAM-MD5');

    /**
     * The socket handle.
     *
     * @var resource
     */
    var $_sock;

    /**
     * Parameters and connection information.
     *
     * @var array
     */
    var $_data;

    /**
     * Current state of the connection.
     *
     * One of the NET_SIEVE_STATE_* constants.
     *
     * @var integer
     */
    var $_state;

    /**
     * PEAR object to avoid strict warnings.
     *
     * @var PEAR_Error
     */
    var $_pear;

    /**
     * Constructor error.
     *
     * @var PEAR_Error
     */
    var $_error;

    /**
     * Whether to enable debugging.
     *
     * @var boolean
     */
    var $_debug = false;

    /**
     * Debug output handler.
     *
     * This has to be a valid callback.
     *
     * @var string|array
     */
    var $_debug_handler = null;

    /**
     * Whether to pick up an already established connection.
     *
     * @var boolean
     */
    var $_bypassAuth = false;

    /**
     * Whether to use TLS if available.
     *
     * @var boolean
     */
    var $_useTLS = true;

    /**
     * Additional options for stream_context_create().
     *
     * @var array
     */
    var $_options = null;

    /**
     * Maximum number of referral loops
     *
     * @var array
     */
    var $_maxReferralCount = 15;

    /**
     * Kerberos service principal to use for GSSAPI authentication.
     *
     * @var string
     */
    var $_gssapiPrincipal = null;

    /**
     * Kerberos service cname to use for GSSAPI authentication.
     *
     * @var string
     */
    var $_gssapiCN = null;

    /**
     * Constructor.
     *
     * Sets up the object, connects to the server and logs in. Stores any
     * generated error in $this->_error, which can be retrieved using the
     * getError() method.
     *
     * @param string  $user       Login username.
     * @param string  $pass       Login password.
     * @param string  $host       Hostname of server.
     * @param string  $port       Port of server.
     * @param string  $logintype  Type of login to perform (see
     *                            $supportedAuthMethods).
     * @param string  $euser      Effective user. If authenticating as an
     *                            administrator, login as this user.
     * @param boolean $debug      Whether to enable debugging (@see setDebug()).
     * @param string  $bypassAuth Skip the authentication phase. Useful if the
     *                            socket is already open.
     * @param boolean $useTLS     Use TLS if available.
     * @param array   $options    Additional options for
     *                            stream_context_create().
     * @param mixed   $handler    A callback handler for the debug output.
     * @param string  $principal  Kerberos service principal to use
     *                            with GSSAPI authentication.
     * @param string  $cname      Kerberos service cname to use
     *                            with GSSAPI authentication.
     */
    function __construct($user = null, $pass  = null, $host = 'localhost',
        $port = 2000, $logintype = '', $euser = '',
        $debug = false, $bypassAuth = false, $useTLS = true,
        $options = null, $handler = null, $principal = null, $cname = null
    ) {
        $this->_pear = new PEAR();
        $this->_state             = NET_SIEVE_STATE_DISCONNECTED;
        $this->_data['user']      = $user;
        $this->_data['pass']      = $pass;
        $this->_data['host']      = $host;
        $this->_data['port']      = $port;
        $this->_data['logintype'] = $logintype;
        $this->_data['euser']     = $euser;
        $this->_sock              = new Net_Socket();
        $this->_bypassAuth        = $bypassAuth;
        $this->_useTLS            = $useTLS;
        $this->_options           = (array) $options;
        $this->_gssapiPrincipal   = $principal;
        $this->_gssapiCN          = $cname;

        $this->setDebug($debug, $handler);

        /* Try to include the Auth_SASL package.  If the package is not
         * available, we disable the authentication methods that depend upon
         * it. */
        if ((@include_once 'Auth/SASL.php') === false) {
            $this->_debug('Auth_SASL not present');
            $this->supportedAuthMethods = array_diff(
                $this->supportedAuthMethods,
                $this->supportedSASLAuthMethods
            );
        }

        if (strlen($user) && strlen($pass)) {
            $this->_error = $this->_handleConnectAndLogin();
        }
    }

    /**
     * Returns any error that may have been generated in the constructor.
     *
     * @return boolean|PEAR_Error  False if no error, PEAR_Error otherwise.
     */
    function getError()
    {
        return is_a($this->_error, 'PEAR_Error') ? $this->_error : false;
    }

    /**
     * Sets the debug state and handler function.
     *
     * @param boolean $debug   Whether to enable debugging.
     * @param string  $handler A custom debug handler. Must be a valid callback.
     *
     * @return void
     */
    function setDebug($debug = true, $handler = null)
    {
        $this->_debug = $debug;
        $this->_debug_handler = $handler;
    }

    /**
     * Sets the Kerberos service principal for use with GSSAPI
     * authentication.
     *
     * @param string $principal The Kerberos service principal
     *
     * @return void
     */
    function setServicePrincipal($principal)
    {
        $this->_gssapiPrincipal = $principal;
    }

    /**
     * Sets the Kerberos service CName for use with GSSAPI
     * authentication.
     *
     * @param string $cname The Kerberos service principal
     *
     * @return void
     */
    function setServiceCN($cname)
    {
        $this->_gssapiCN = $cname;
    }

    /**
     * Connects to the server and logs in.
     *
     * @return boolean  True on success, PEAR_Error on failure.
     */
    function _handleConnectAndLogin()
    {
        $res = $this->connect($this->_data['host'], $this->_data['port'], $this->_options, $this->_useTLS);
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        if ($this->_bypassAuth === false) {
            $res = $this->login($this->_data['user'], $this->_data['pass'], $this->_data['logintype'], $this->_data['euser'], $this->_bypassAuth);
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }
        }

        return true;
    }

    /**
     * Handles connecting to the server and checks the response validity.
     *
     * @param string  $host    Hostname of server.
     * @param string  $port    Port of server.
     * @param array   $options List of options to pass to
     *                         stream_context_create().
     * @param boolean $useTLS  Use TLS if available.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function connect($host, $port, $options = null, $useTLS = true)
    {
        $this->_data['host'] = $host;
        $this->_data['port'] = $port;
        $this->_useTLS       = $useTLS;

        if (is_array($options)) {
            $this->_options = array_merge($this->_options, $options);
        }

        if (NET_SIEVE_STATE_DISCONNECTED != $this->_state) {
            return $this->_pear->raiseError('Not currently in DISCONNECTED state', 1);
        }

        $res = $this->_sock->connect($host, $port, false, 5, $options);
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        if ($this->_bypassAuth) {
            $this->_state = NET_SIEVE_STATE_TRANSACTION;

            // Reset capabilities
            $this->_parseCapability('');
        } else {
            $this->_state = NET_SIEVE_STATE_AUTHORISATION;

            $res = $this->_doCmd();
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }

            // Reset capabilities (use unattended capabilities)
            $this->_parseCapability($res);
        }

        // Explicitly ask for the capabilities if needed
        if (empty($this->_capability['implementation'])) {
            $res = $this->_cmdCapability();
            if (is_a($res, 'PEAR_Error')) {
                return $this->_pear->raiseError(
                    'Failed to connect, server said: ' . $res->getMessage(), 2
                );
            }
        }

        // Check if we can enable TLS via STARTTLS.
        if ($useTLS && !empty($this->_capability['starttls'])
            && function_exists('stream_socket_enable_crypto')
        ) {
            $res = $this->_startTLS();
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }
        }

        return true;
    }

    /**
     * Disconnect from the Sieve server.
     *
     * @param boolean $sendLogoutCMD Whether to send LOGOUT command before
     *                               disconnecting.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function disconnect($sendLogoutCMD = true)
    {
        return $this->_cmdLogout($sendLogoutCMD);
    }

    /**
     * Logs into server.
     *
     * @param string  $user       Login username.
     * @param string  $pass       Login password.
     * @param string  $logintype  Type of login method to use.
     * @param string  $euser      Effective UID (perform on behalf of $euser).
     * @param boolean $bypassAuth Do not perform authentication.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function login($user, $pass, $logintype = null, $euser = '', $bypassAuth = false)
    {
        $this->_data['user']      = $user;
        $this->_data['pass']      = $pass;
        $this->_data['logintype'] = $logintype;
        $this->_data['euser']     = $euser;
        $this->_bypassAuth        = $bypassAuth;

        if (NET_SIEVE_STATE_AUTHORISATION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        if (!$bypassAuth ) {
            $res = $this->_cmdAuthenticate($user, $pass, $logintype, $euser);
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }
        }

        $this->_state = NET_SIEVE_STATE_TRANSACTION;

        return true;
    }

    /**
     * Returns an indexed array of scripts currently on the server.
     *
     * @param string $active Will be set to the name of the active script
     *
     * @return array  Indexed array of scriptnames, PEAR_Error on failure
     */
    function listScripts(&$active = null)
    {
        if (is_array($scripts = $this->_cmdListScripts())) {
            if (isset($scripts[1])) {
                $active = $scripts[1];
            }

            return $scripts[0];
        }

        return $scripts;
    }

    /**
     * Returns the active script.
     *
     * @return string  The active scriptname.
     */
    function getActive()
    {
        if (is_array($scripts = $this->_cmdListScripts())) {
            return $scripts[1];
        }
    }

    /**
     * Sets the active script.
     *
     * @param string $scriptname The name of the script to be set as active.
     *
     * @return boolean  True on success, PEAR_Error on failure.
     */
    function setActive($scriptname)
    {
        return $this->_cmdSetActive($scriptname);
    }

    /**
     * Retrieves a script.
     *
     * @param string $scriptname The name of the script to be retrieved.
     *
     * @return string  The script on success, PEAR_Error on failure.
     */
    function getScript($scriptname)
    {
        return $this->_cmdGetScript($scriptname);
    }

    /**
     * Adds a script to the server.
     *
     * @param string  $scriptname Name of the script.
     * @param string  $script     The script content.
     * @param boolean $makeactive Whether to make this the active script.
     *
     * @return boolean  True on success, PEAR_Error on failure.
     */
    function installScript($scriptname, $script, $makeactive = false)
    {
        $res = $this->_cmdPutScript($scriptname, $script);
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        if ($makeactive) {
            return $this->_cmdSetActive($scriptname);
        }

        return true;
    }

    /**
     * Removes a script from the server.
     *
     * @param string $scriptname Name of the script.
     *
     * @return boolean  True on success, PEAR_Error on failure.
     */
    function removeScript($scriptname)
    {
        return $this->_cmdDeleteScript($scriptname);
    }

    /**
     * Checks if the server has space to store the script by the server.
     *
     * @param string  $scriptname The name of the script to mark as active.
     * @param integer $size       The size of the script.
     *
     * @return boolean|PEAR_Error  True if there is space, PEAR_Error otherwise.
     *
     * @todo Rename to hasSpace()
     */
    function haveSpace($scriptname, $size)
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in TRANSACTION state', 1);
        }

        $res = $this->_doCmd(sprintf('HAVESPACE %s %d', $this->_escape($scriptname), $size));
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        return true;
    }

    /**
     * Returns the list of extensions the server supports.
     *
     * @return array  List of extensions or PEAR_Error on failure.
     */
    function getExtensions()
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 7);
        }

        return $this->_capability['extensions'];
    }

    /**
     * Returns whether the server supports an extension.
     *
     * @param string $extension The extension to check.
     *
     * @return boolean  Whether the extension is supported or PEAR_Error on
     *                  failure.
     */
    function hasExtension($extension)
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 7);
        }

        $extension = trim($this->_toUpper($extension));
        if (is_array($this->_capability['extensions'])) {
            foreach ($this->_capability['extensions'] as $ext) {
                if ($ext == $extension) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Returns the list of authentication methods the server supports.
     *
     * @return array  List of authentication methods or PEAR_Error on failure.
     */
    function getAuthMechs()
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 7);
        }

        return $this->_capability['sasl'];
    }

    /**
     * Returns whether the server supports an authentication method.
     *
     * @param string $method The method to check.
     *
     * @return boolean  Whether the method is supported or PEAR_Error on
     *                  failure.
     */
    function hasAuthMech($method)
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 7);
        }

        $method = trim($this->_toUpper($method));

        if (is_array($this->_capability['sasl'])) {
            foreach ($this->_capability['sasl'] as $sasl) {
                if ($sasl == $method) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Handles the authentication using any known method.
     *
     * @param string $uid        The userid to authenticate as.
     * @param string $pwd        The password to authenticate with.
     * @param string $userMethod The method to use. If empty, the class chooses
     *                           the best (strongest) available method.
     * @param string $euser      The effective uid to authenticate as.
     *
     * @return void
     */
    function _cmdAuthenticate($uid, $pwd, $userMethod = null, $euser = '')
    {
        $method = $this->_getBestAuthMethod($userMethod);
        if (is_a($method, 'PEAR_Error')) {
            return $method;
        }

        switch ($method) {
        case 'DIGEST-MD5':
            return $this->_authDigestMD5($uid, $pwd, $euser);
        case 'CRAM-MD5':
            $result = $this->_authCRAMMD5($uid, $pwd, $euser);
            break;
        case 'LOGIN':
            $result = $this->_authLOGIN($uid, $pwd, $euser);
            break;
        case 'PLAIN':
            $result = $this->_authPLAIN($uid, $pwd, $euser);
            break;
        case 'EXTERNAL':
            $result = $this->_authEXTERNAL($uid, $pwd, $euser);
            break;
        case 'GSSAPI':
            $result = $this->_authGSSAPI($pwd);
            break;
        case 'XOAUTH2':
            $result = $this->_authXOAUTH2($uid, $pwd, $euser);
            break;
        default :
            $result = $this->_pear->raiseError(
                $method . ' is not a supported authentication method'
            );
            break;
        }

        $res = $this->_doCmd();
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        if ($this->_pear->isError($res = $this->_cmdCapability())) {
            return $this->_pear->raiseError(
                'Failed to connect, server said: ' . $res->getMessage(), 2
            );
        }

        return $result;
    }

    /**
     * Authenticates the user using the PLAIN method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $pass  The password to authenticate with.
     * @param string $euser The effective uid to authenticate as.
     *
     * @return void
     */
    function _authPLAIN($user, $pass, $euser)
    {
        return $this->_sendCmd(
            sprintf(
                'AUTHENTICATE "PLAIN" "%s"',
                base64_encode($euser . chr(0) . $user . chr(0) . $pass)
            )
        );
    }

    /**
     * Authenticates the user using the GSSAPI method.
     *
     * @note the PHP krb5 extension is required and the service principal and cname
     *       must have been set.
     * @see  setServicePrincipal()
     *
     * @return void
     */
    function _authGSSAPI()
    {
        if (!extension_loaded('krb5')) {
            return $this->_pear->raiseError('The krb5 extension is required for GSSAPI authentication', 2);
        }

        if (!$this->_gssapiPrincipal) {
            return $this->_pear->raiseError('No Kerberos service principal set', 2);
        }

        if (!$this->_gssapiCN) {
            return $this->_pear->raiseError('No Kerberos service CName set', 2);
        }

        putenv('KRB5CCNAME=' . $this->_gssapiCN);

        try {
            $ccache = new KRB5CCache();
            $ccache->open($this->_gssapiCN);

            $gssapicontext = new GSSAPIContext();
            $gssapicontext->acquireCredentials($ccache);

            $token   = '';
            $success = $gssapicontext->initSecContext($this->_gssapiPrincipal, null, null, null, $token);
            $token   = base64_encode($token);
        }
        catch (Exception $e) {
            return $this->_pear->raiseError('GSSAPI authentication failed: ' . $e->getMessage());
        }

        $this->_sendCmd("AUTHENTICATE \"GSSAPI\" {" . strlen($token) . "+}");

        $response = $this->_doCmd($token, true);

        try {
            $challenge = base64_decode(substr($response, 1, -1));
            $gssapicontext->unwrap($challenge, $challenge);
            $gssapicontext->wrap($challenge, $challenge, true);
        }
        catch (Exception $e) {
            return $this->_pear->raiseError('GSSAPI authentication failed: ' . $e->getMessage());
        }

        $response = base64_encode($challenge);

        $this->_sendCmd("{" . strlen($response) . "+}");

        return $this->_sendCmd($response);
    }

    /**
     * Authenticates the user using the LOGIN method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $pass  The password to authenticate with.
     * @param string $euser The effective uid to authenticate as. Not used.
     *
     * @return void
     */
    function _authLOGIN($user, $pass, $euser)
    {
        $result = $this->_sendCmd('AUTHENTICATE "LOGIN"');
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        $result = $this->_doCmd('"' . base64_encode($user) . '"', true);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        return $this->_doCmd('"' . base64_encode($pass) . '"', true);
    }

    /**
     * Authenticates the user using the CRAM-MD5 method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $pass  The password to authenticate with.
     * @param string $euser The effective uid to authenticate as. Not used.
     *
     * @return void
     */
    function _authCRAMMD5($user, $pass, $euser)
    {
        $challenge = $this->_doCmd('AUTHENTICATE "CRAM-MD5"', true);
        if (is_a($challenge, 'PEAR_Error')) {
            return $challenge;
        }

        $auth_sasl = new Auth_SASL;
        $cram      = $auth_sasl->factory('crammd5');
        $challenge = base64_decode(trim($challenge));
        $response  = $cram->getResponse($user, $pass, $challenge);

        if (is_a($response, 'PEAR_Error')) {
            return $response;
        }

        return $this->_sendStringResponse(base64_encode($response));
    }

    /**
     * Authenticates the user using the DIGEST-MD5 method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $pass  The password to authenticate with.
     * @param string $euser The effective uid to authenticate as.
     *
     * @return void
     */
    function _authDigestMD5($user, $pass, $euser)
    {
        $challenge = $this->_doCmd('AUTHENTICATE "DIGEST-MD5"', true);
        if (is_a($challenge, 'PEAR_Error')) {
            return $challenge;
        }

        $auth_sasl = new Auth_SASL;
        $digest    = $auth_sasl->factory('digestmd5');
        $challenge = base64_decode(trim($challenge));

        // @todo Really 'localhost'?
        $response = $digest->getResponse($user, $pass, $challenge, 'localhost', 'sieve', $euser);
        if (is_a($response, 'PEAR_Error')) {
            return $response;
        }

        $result = $this->_sendStringResponse(base64_encode($response));
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        $result = $this->_doCmd('', true);
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        if ($this->_toUpper(substr($result, 0, 2)) == 'OK') {
            return;
        }

        /* We don't use the protocol's third step because SIEVE doesn't allow
         * subsequent authentication, so we just silently ignore it. */
        $result = $this->_sendStringResponse('');
        if (is_a($result, 'PEAR_Error')) {
            return $result;
        }

        return $this->_doCmd();
    }

    /**
     * Authenticates the user using the EXTERNAL method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $pass  The password to authenticate with.
     * @param string $euser The effective uid to authenticate as.
     *
     * @return void
     *
     * @since 1.1.7
     */
    function _authEXTERNAL($user, $pass, $euser)
    {
        $cmd = sprintf(
            'AUTHENTICATE "EXTERNAL" "%s"',
            base64_encode(strlen($euser) ? $euser : $user)
        );

        return $this->_sendCmd($cmd);
    }

    /**
     * Authenticates the user using the XOAUTH2 method.
     *
     * @param string $user  The userid to authenticate as.
     * @param string $token The token to authenticate with.
     * @param string $euser The effective uid to authenticate as.
     *
     * @return void
     */
    function _authXOAUTH2($user, $token, $euser)
    {
        // default to $user if $euser is not set
        if (! $euser) {
            $euser = $user;
        }

        $auth = base64_encode("user=$euser\001auth=$token\001\001");
        return $this->_sendCmd("AUTHENTICATE \"XOAUTH2\" \"$auth\"");
    }

    /**
     * Removes a script from the server.
     *
     * @param string $scriptname Name of the script to delete.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function _cmdDeleteScript($scriptname)
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        $res = $this->_doCmd(sprintf('DELETESCRIPT %s', $this->_escape($scriptname)));
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        return true;
    }

    /**
     * Retrieves the contents of the named script.
     *
     * @param string $scriptname Name of the script to retrieve.
     *
     * @return string  The script if successful, PEAR_Error otherwise.
     */
    function _cmdGetScript($scriptname)
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        $res = $this->_doCmd(sprintf('GETSCRIPT %s', $this->_escape($scriptname)));
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        return preg_replace('/^{[0-9]+}\r\n/', '', $res);
    }

    /**
     * Sets the active script, i.e. the one that gets run on new mail by the
     * server.
     *
     * @param string $scriptname The name of the script to mark as active.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function _cmdSetActive($scriptname)
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        $res = $this->_doCmd(sprintf('SETACTIVE %s', $this->_escape($scriptname)));
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        return true;
    }

    /**
     * Returns the list of scripts on the server.
     *
     * @return array  An array with the list of scripts in the first element
     *                and the active script in the second element on success,
     *                PEAR_Error otherwise.
     */
    function _cmdListScripts()
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        $res = $this->_doCmd('LISTSCRIPTS');
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        $scripts = array();
        $activescript = null;
        $res = explode("\r\n", $res);
        foreach ($res as $value) {
            if (preg_match('/^"(.*)"( ACTIVE)?$/i', $value, $matches)) {
                $script_name = stripslashes($matches[1]);
                $scripts[] = $script_name;
                if (!empty($matches[2])) {
                    $activescript = $script_name;
                }
            }
        }

        return array($scripts, $activescript);
    }

    /**
     * Adds a script to the server.
     *
     * @param string $scriptname Name of the new script.
     * @param string $scriptdata The new script.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function _cmdPutScript($scriptname, $scriptdata)
    {
        if (NET_SIEVE_STATE_TRANSACTION != $this->_state) {
            return $this->_pear->raiseError('Not currently in AUTHORISATION state', 1);
        }

        $stringLength = $this->_getLineLength($scriptdata);
        $command      = sprintf(
            "PUTSCRIPT %s {%d+}\r\n%s",
            $this->_escape($scriptname),
            $stringLength,
            $scriptdata
        );

        $res = $this->_doCmd($command);
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        return true;
    }

    /**
     * Logs out of the server and terminates the connection.
     *
     * @param boolean $sendLogoutCMD Whether to send LOGOUT command before
     *                               disconnecting.
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function _cmdLogout($sendLogoutCMD = true)
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 1);
        }

        if ($sendLogoutCMD) {
            $res = $this->_doCmd('LOGOUT');
            if (is_a($res, 'PEAR_Error')) {
                return $res;
            }
        }

        $this->_sock->disconnect();
        $this->_state = NET_SIEVE_STATE_DISCONNECTED;

        return true;
    }

    /**
     * Sends the CAPABILITY command
     *
     * @return boolean  True on success, PEAR_Error otherwise.
     */
    function _cmdCapability()
    {
        if (NET_SIEVE_STATE_DISCONNECTED == $this->_state) {
            return $this->_pear->raiseError('Not currently connected', 1);
        }
        $res = $this->_doCmd('CAPABILITY');
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }
        $this->_parseCapability($res);
        return true;
    }

    /**
     * Parses the response from the CAPABILITY command and stores the result
     * in $_capability.
     *
     * @param string $data The response from the capability command.
     *
     * @return void
     */
    function _parseCapability($data)
    {
        // Clear the cached capabilities.
        $this->_capability = array('sasl' => array(),
                                   'extensions' => array());

        $data = preg_split('/\r?\n/', $this->_toUpper($data), -1, PREG_SPLIT_NO_EMPTY);

        for ($i = 0; $i < count($data); $i++) {
            if (!preg_match('/^"([A-Z]+)"( "(.*)")?$/', $data[$i], $matches)) {
                continue;
            }
            switch ($matches[1]) {
            case 'IMPLEMENTATION':
                $this->_capability['implementation'] = $matches[3];
                break;

            case 'SASL':
                if (!empty($matches[3])) {
                    $this->_capability['sasl'] = preg_split('/\s+/', $matches[3]);
                }
                break;

            case 'SIEVE':
                if (!empty($matches[3])) {
                    $this->_capability['extensions'] = preg_split('/\s+/', $matches[3]);
                }
                break;

            case 'STARTTLS':
                $this->_capability['starttls'] = true;
                break;
            }
        }
    }

    /**
     * Sends a command to the server
     *
     * @param string $cmd The command to send.
     *
     * @return void
     */
    function _sendCmd($cmd)
    {
        $status = $this->_sock->getStatus();
        if (is_a($status, 'PEAR_Error') || $status['eof']) {
            return $this->_pear->raiseError('Failed to write to socket: connection lost');
        }
        $error = $this->_sock->write($cmd . "\r\n");
        if (is_a($error, 'PEAR_Error')) {
            return $this->_pear->raiseError(
                'Failed to write to socket: ' . $error->getMessage()
            );
        }
        $this->_debug("C: $cmd");
    }

    /**
     * Sends a string response to the server.
     *
     * @param string $str The string to send.
     *
     * @return void
     */
    function _sendStringResponse($str)
    {
        return $this->_sendCmd('{' . $this->_getLineLength($str) . "+}\r\n" . $str);
    }

    /**
     * Receives a single line from the server.
     *
     * @return string  The server response line.
     */
    function _recvLn()
    {
        $lastline = $this->_sock->gets(8192);
        if (is_a($lastline, 'PEAR_Error')) {
            return $this->_pear->raiseError(
                'Failed to read from socket: ' . $lastline->getMessage()
            );
        }

        $lastline = rtrim($lastline);
        $this->_debug("S: $lastline");

        if ($lastline === '') {
            return $this->_pear->raiseError('Failed to read from socket');
        }

        return $lastline;
    }

    /**
     * Receives a number of bytes from the server.
     *
     * @param integer $length Number of bytes to read.
     *
     * @return string The server response.
     */
    function _recvBytes($length)
    {
        $response = '';
        $response_length = 0;
        while ($response_length < $length) {
            $response .= $this->_sock->read($length - $response_length);
            $response_length = $this->_getLineLength($response);
        }
        $this->_debug('S: ' . rtrim($response));
        return $response;
    }

    /**
     * Send a command and retrieves a response from the server.
     *
     * @param string  $cmd  The command to send.
     * @param boolean $auth Whether this is an authentication command.
     *
     * @return string|PEAR_Error Reponse string if an OK response, PEAR_Error
     *                           if a NO response.
     */
    function _doCmd($cmd = '', $auth = false)
    {
        $referralCount = 0;
        while ($referralCount < $this->_maxReferralCount) {
            if (strlen($cmd)) {
                $error = $this->_sendCmd($cmd);
                if (is_a($error, 'PEAR_Error')) {
                    return $error;
                }
            }

            $response = '';
            while (true) {
                $line = $this->_recvLn();
                if (is_a($line, 'PEAR_Error')) {
                    return $line;
                }

                if (preg_match('/^(OK|NO)/i', $line, $tag)) {
                    // Check for string literal message.
                    if (preg_match('/{([0-9]+)}$/', $line, $matches)) {
                        $line = substr($line, 0, -(strlen($matches[1]) + 2))
                            . str_replace(
                                "\r\n", ' ', $this->_recvBytes($matches[1] + 2)
                            );
                    }

                    if ('OK' == $this->_toUpper($tag[1])) {
                        $response .= $line;
                        return rtrim($response);
                    }

                    return $this->_pear->raiseError(trim($response . substr($line, 2)), 3);
                }

                if (preg_match('/^BYE/i', $line)) {
                    $error = $this->disconnect(false);
                    if (is_a($error, 'PEAR_Error')) {
                        return $this->_pear->raiseError(
                            'Cannot handle BYE, the error was: '
                            . $error->getMessage(),
                            4
                        );
                    }
                    // Check for referral, then follow it.  Otherwise, carp an
                    // error.
                    if (preg_match('/^bye \(referral "(sieve:\/\/)?([^"]+)/i', $line, $matches)) {
                        // Replace the old host with the referral host
                        // preserving any protocol prefix.
                        $this->_data['host'] = preg_replace(
                            '/\w+(?!(\w|\:\/\/)).*/', $matches[2],
                            $this->_data['host']
                        );
                        $error = $this->_handleConnectAndLogin();
                        if (is_a($error, 'PEAR_Error')) {
                            return $this->_pear->raiseError(
                                'Cannot follow referral to '
                                . $this->_data['host'] . ', the error was: '
                                . $error->getMessage(),
                                5
                            );
                        }
                        break;
                    }
                    return $this->_pear->raiseError(trim($response . $line), 6);
                }

                if (preg_match('/^{([0-9]+)}/', $line, $matches)) {
                    // Matches literal string responses.
                    $line = $this->_recvBytes($matches[1] + 2);
                    if (!$auth) {
                        // Receive the pending OK only if we aren't
                        // authenticating since string responses during
                        // authentication don't need an OK.
                        $this->_recvLn();
                    }
                    return $line;
                }

                if ($auth) {
                    // String responses during authentication don't need an
                    // OK.
                    $response .= $line;
                    return rtrim($response);
                }

                $response .= $line . "\r\n";
                $referralCount++;
            }
        }

        return $this->_pear->raiseError('Max referral count (' . $referralCount . ') reached. Cyrus murder loop error?', 7);
    }

    /**
     * Returns the name of the best authentication method that the server
     * has advertised.
     *
     * @param string $userMethod Only consider this method as available.
     *
     * @return string  The name of the best supported authentication method or
     *                 a PEAR_Error object on failure.
     */
    function _getBestAuthMethod($userMethod = null)
    {
        if (!isset($this->_capability['sasl'])) {
            return $this->_pear->raiseError('This server doesn\'t support any authentication methods. SASL problem?');
        }
        if (!$this->_capability['sasl']) {
            return $this->_pear->raiseError('This server doesn\'t support any authentication methods.');
        }

        if ($userMethod) {
            if (in_array($userMethod, $this->_capability['sasl'])) {
                return $userMethod;
            }

            $msg = 'No supported authentication method found. The server supports these methods: %s, but we want to use: %s';
            return $this->_pear->raiseError(
                sprintf($msg, implode(', ', $this->_capability['sasl']), $userMethod)
            );
        }

        foreach ($this->supportedAuthMethods as $method) {
            if (in_array($method, $this->_capability['sasl'])) {
                return $method;
            }
        }

        $msg = 'No supported authentication method found. The server supports these methods: %s, but we only support: %s';
        return $this->_pear->raiseError(
            sprintf($msg, implode(', ', $this->_capability['sasl']), implode(', ', $this->supportedAuthMethods))
        );
    }

    /**
     * Starts a TLS connection.
     *
     * @return boolean  True on success, PEAR_Error on failure.
     */
    function _startTLS()
    {
        $res = $this->_doCmd('STARTTLS');
        if (is_a($res, 'PEAR_Error')) {
            return $res;
        }

        if (isset($this->_options['ssl']['crypto_method'])) {
            $crypto_method = $this->_options['ssl']['crypto_method'];
        } else {
            // There is no flag to enable all TLS methods. Net_SMTP
            // handles enabling TLS similarly.
            $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT
                | @STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
                | @STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
        }

        if (!stream_socket_enable_crypto($this->_sock->fp, true, $crypto_method)) {
            return $this->_pear->raiseError('Failed to establish TLS connection', 2);
        }

        $this->_debug('STARTTLS negotiation successful');

        // The server should be sending a CAPABILITY response after
        // negotiating TLS. Read it, and ignore if it doesn't.
        // Unfortunately old Cyrus versions are broken and don't send a
        // CAPABILITY response, thus we would wait here forever. Parse the
        // Cyrus version and work around this broken behavior.
        if (!preg_match('/^CYRUS TIMSIEVED V([0-9.]+)/', $this->_capability['implementation'], $matches)
            || version_compare($matches[1], '2.3.10', '>=')
        ) {
            $res = $this->_doCmd();
        }

        // Reset capabilities (use unattended capabilities)
        $this->_parseCapability(is_string($res) ? $res : '');

        // Query the server capabilities again now that we are under encryption.
        if (empty($this->_capability['implementation'])) {
            $res = $this->_cmdCapability();
            if (is_a($res, 'PEAR_Error')) {
                return $this->_pear->raiseError(
                    'Failed to connect, server said: ' . $res->getMessage(), 2
                );
            }
        }

        return true;
    }

    /**
     * Returns the length of a string.
     *
     * @param string $string A string.
     *
     * @return integer  The length of the string.
     */
    function _getLineLength($string)
    {
        if (extension_loaded('mbstring')) {
            return mb_strlen($string, '8bit');
        } else {
            return strlen($string);
        }
    }

    /**
     * Locale independant strtoupper() implementation.
     *
     * @param string $string The string to convert to lowercase.
     *
     * @return string  The lowercased string, based on ASCII encoding.
     */
    function _toUpper($string)
    {
        $language = setlocale(LC_CTYPE, 0);
        setlocale(LC_CTYPE, 'C');
        $string = strtoupper($string);
        setlocale(LC_CTYPE, $language);
        return $string;
    }

    /**
     * Converts strings into RFC's quoted-string or literal-c2s form.
     *
     * @param string $string The string to convert.
     *
     * @return string Result string.
     */
    function _escape($string)
    {
        // Some implementations don't allow UTF-8 characters in quoted-string,
        // use literal-c2s.
        if (preg_match('/[^\x01-\x09\x0B-\x0C\x0E-\x7F]/', $string)) {
            return sprintf("{%d+}\r\n%s", $this->_getLineLength($string), $string);
        }

        return '"' . addcslashes($string, '\\"') . '"';
    }

    /**
     * Write debug text to the current debug output handler.
     *
     * @param string $message Debug message text.
     *
     * @return void
     */
    function _debug($message)
    {
        if ($this->_debug) {
            if ($this->_debug_handler) {
                call_user_func_array($this->_debug_handler, array(&$this, $message));
            } else {
                echo "$message\n";
            }
        }
    }
}
PK�^�\z��|����pear/Net/SMTP.phpnu�[���<?php
/** vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP Version 5 and 7                                                  |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2021 Jon Parise and Chuck Hagenbuch               |
// | All rights reserved.                                                 |
// |                                                                      |
// | Redistribution and use in source and binary forms, with or without   |
// | modification, are permitted provided that the following conditions   |
// | are met:                                                             |
// |                                                                      |
// | 1. Redistributions of source code must retain the above copyright    |
// |    notice, this list of conditions and the following disclaimer.     |
// |                                                                      |
// | 2. Redistributions in binary form must reproduce the above copyright |
// |    notice, this list of conditions and the following disclaimer in   |
// |    the documentation and/or other materials provided with the        |
// |    distribution.                                                     |
// |                                                                      |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE       |
// | COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;     |
// | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER     |
// | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT   |
// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN    |
// | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      |
// | POSSIBILITY OF SUCH DAMAGE.                                          |
// +----------------------------------------------------------------------+
// | Authors: Chuck Hagenbuch <chuck@horde.org>                           |
// |          Jon Parise <jon@php.net>                                    |
// |          Damian Alejandro Fernandez Sosa <damlists@cnba.uba.ar>      |
// +----------------------------------------------------------------------+

require_once 'PEAR.php';
require_once 'Net/Socket.php';

/**
 * Provides an implementation of the SMTP protocol using PEAR's
 * Net_Socket class.
 *
 * @package Net_SMTP
 * @author  Chuck Hagenbuch <chuck@horde.org>
 * @author  Jon Parise <jon@php.net>
 * @author  Damian Alejandro Fernandez Sosa <damlists@cnba.uba.ar>
 * @license http://opensource.org/licenses/bsd-license.php BSD-2-Clause
 *
 * @example basic.php A basic implementation of the Net_SMTP package.
 */
class Net_SMTP
{
    /**
     * The server to connect to.
     * @var string
     */
    public $host = 'localhost';

    /**
     * The port to connect to.
     * @var int
     */
    public $port = 25;

    /**
     * The value to give when sending EHLO or HELO.
     * @var string
     */
    public $localhost = 'localhost';

    /**
     * List of supported authentication methods, in preferential order.
     * @var array
     */
    public $auth_methods = array();

    /**
     * Use SMTP command pipelining (specified in RFC 2920) if the SMTP
     * server supports it.
     *
     * When pipeling is enabled, rcptTo(), mailFrom(), sendFrom(),
     * somlFrom() and samlFrom() do not wait for a response from the
     * SMTP server but return immediately.
     *
     * @var bool
     */
    public $pipelining = false;

    /**
     * Number of pipelined commands.
     * @var int
     */
    protected $pipelined_commands = 0;

    /**
     * Should debugging output be enabled?
     * @var boolean
     */
    protected $debug = false;

    /**
     * Debug output handler.
     * @var callback
     */
    protected $debug_handler = null;

    /**
     * The socket resource being used to connect to the SMTP server.
     * @var resource
     */
    protected $socket = null;

    /**
     * Array of socket options that will be passed to Net_Socket::connect().
     * @see stream_context_create()
     * @var array
     */
    protected $socket_options = null;

    /**
     * The socket I/O timeout value in seconds.
     * @var int
     */
    protected $timeout = 0;

    /**
     * The most recent server response code.
     * @var int
     */
    protected $code = -1;

    /**
     * The most recent server response arguments.
     * @var array
     */
    protected $arguments = array();

    /**
     * Stores the SMTP server's greeting string.
     * @var string
     */
    protected $greeting = null;

    /**
     * Stores detected features of the SMTP server.
     * @var array
     */
    protected $esmtp = array();

    /**
     * Instantiates a new Net_SMTP object, overriding any defaults
     * with parameters that are passed in.
     *
     * If you have SSL support in PHP, you can connect to a server
     * over SSL using an 'ssl://' prefix:
     *
     *   // 465 is a common smtps port.
     *   $smtp = new Net_SMTP('ssl://mail.host.com', 465);
     *   $smtp->connect();
     *
     * @param string  $host             The server to connect to.
     * @param integer $port             The port to connect to.
     * @param string  $localhost        The value to give when sending EHLO or HELO.
     * @param boolean $pipelining       Use SMTP command pipelining
     * @param integer $timeout          Socket I/O timeout in seconds.
     * @param array   $socket_options   Socket stream_context_create() options.
     * @param string  $gssapi_principal GSSAPI service principal name
     * @param string  $gssapi_cname     GSSAPI credentials cache
     *
     * @since 1.0
     */
    public function __construct($host = null, $port = null, $localhost = null,
        $pipelining = false, $timeout = 0, $socket_options = null,
        $gssapi_principal=null, $gssapi_cname=null
    ) {
        if (isset($host)) {
            $this->host = $host;
        }
        if (isset($port)) {
            $this->port = $port;
        }
        if (isset($localhost)) {
            $this->localhost = $localhost;
        }

        $this->pipelining       = $pipelining;
        $this->socket           = new Net_Socket();
        $this->socket_options   = $socket_options;
        $this->timeout          = $timeout;
        $this->gssapi_principal = $gssapi_principal;
        $this->gssapi_cname     = $gssapi_cname;

        /* If PHP krb5 extension is loaded, we enable GSSAPI method. */
        if (extension_loaded('krb5')) {
            $this->setAuthMethod('GSSAPI', array($this, 'authGSSAPI'));
        }

        /* Include the Auth_SASL package.  If the package is available, we
         * enable the authentication methods that depend upon it. */
        if (@include_once 'Auth/SASL.php') {
            $this->setAuthMethod('CRAM-MD5', array($this, 'authCramMD5'));
            $this->setAuthMethod('DIGEST-MD5', array($this, 'authDigestMD5'));
        }

        /* These standard authentication methods are always available. */
        $this->setAuthMethod('LOGIN', array($this, 'authLogin'), false);
        $this->setAuthMethod('PLAIN', array($this, 'authPlain'), false);
        $this->setAuthMethod('XOAUTH2', array($this, 'authXOAuth2'), false);
    }

    /**
     * Set the socket I/O timeout value in seconds plus microseconds.
     *
     * @param integer $seconds      Timeout value in seconds.
     * @param integer $microseconds Additional value in microseconds.
     *
     * @since 1.5.0
     */
    public function setTimeout($seconds, $microseconds = 0)
    {
        return $this->socket->setTimeout($seconds, $microseconds);
    }

    /**
     * Set the value of the debugging flag.
     *
     * @param boolean  $debug   New value for the debugging flag.
     * @param callback $handler Debug handler callback
     *
     * @since 1.1.0
     */
    public function setDebug($debug, $handler = null)
    {
        $this->debug         = $debug;
        $this->debug_handler = $handler;
    }

    /**
     * Write the given debug text to the current debug output handler.
     *
     * @param string $message Debug mesage text.
     *
     * @since 1.3.3
     */
    protected function debug($message)
    {
        if ($this->debug) {
            if ($this->debug_handler) {
                call_user_func_array(
                    $this->debug_handler, array(&$this, $message)
                );
            } else {
                echo "DEBUG: $message\n";
            }
        }
    }

    /**
     * Send the given string of data to the server.
     *
     * @param string $data The string of data to send.
     *
     * @return mixed The number of bytes that were actually written,
     *               or a PEAR_Error object on failure.
     *
     * @since 1.1.0
     */
    protected function send($data)
    {
        $this->debug("Send: $data");

        $result = $this->socket->write($data);
        if (!$result || PEAR::isError($result)) {
            $msg = $result ? $result->getMessage() : "unknown error";
            return PEAR::raiseError("Failed to write to socket: $msg");
        }

        return $result;
    }

    /**
     * Send a command to the server with an optional string of
     * arguments.  A carriage return / linefeed (CRLF) sequence will
     * be appended to each command string before it is sent to the
     * SMTP server - an error will be thrown if the command string
     * already contains any newline characters. Use send() for
     * commands that must contain newlines.
     *
     * @param string $command The SMTP command to send to the server.
     * @param string $args    A string of optional arguments to append
     *                        to the command.
     *
     * @return mixed The result of the send() call.
     *
     * @since 1.1.0
     */
    protected function put($command, $args = '')
    {
        if (!empty($args)) {
            $command .= ' ' . $args;
        }

        if (strcspn($command, "\r\n") !== strlen($command)) {
            return PEAR::raiseError('Commands cannot contain newlines');
        }

        return $this->send($command . "\r\n");
    }

    /**
     * Read a reply from the SMTP server.  The reply consists of a response
     * code and a response message.
     *
     * @param mixed $valid The set of valid response codes.  These
     *                     may be specified as an array of integer
     *                     values or as a single integer value.
     * @param bool  $later Do not parse the response now, but wait
     *                     until the last command in the pipelined
     *                     command group
     *
     * @return mixed True if the server returned a valid response code or
     *               a PEAR_Error object is an error condition is reached.
     *
     * @since 1.1.0
     *
     * @see getResponse
     */
    protected function parseResponse($valid, $later = false)
    {
        $this->code      = -1;
        $this->arguments = array();

        if ($later) {
            $this->pipelined_commands++;
            return true;
        }

        for ($i = 0; $i <= $this->pipelined_commands; $i++) {
            while ($line = $this->socket->readLine()) {
                $this->debug("Recv: $line");

                /* If we receive an empty line, the connection was closed. */
                if (empty($line)) {
                    $this->disconnect();
                    return PEAR::raiseError('Connection was closed');
                }

                /* Read the code and store the rest in the arguments array. */
                $code = substr($line, 0, 3);
                $this->arguments[] = trim(substr($line, 4));

                /* Check the syntax of the response code. */
                if (is_numeric($code)) {
                    $this->code = (int)$code;
                } else {
                    $this->code = -1;
                    break;
                }

                /* If this is not a multiline response, we're done. */
                if (substr($line, 3, 1) != '-') {
                    break;
                }
            }
        }

        $this->pipelined_commands = 0;

        /* Compare the server's response code with the valid code/codes. */
        if (is_int($valid) && ($this->code === $valid)) {
            return true;
        } elseif (is_array($valid) && in_array($this->code, $valid, true)) {
            return true;
        }

        return PEAR::raiseError('Invalid response code received from server', $this->code);
    }

    /**
     * Issue an SMTP command and verify its response.
     *
     * @param string $command The SMTP command string or data.
     * @param mixed  $valid   The set of valid response codes. These
     *                        may be specified as an array of integer
     *                        values or as a single integer value.
     *
     * @return mixed True on success or a PEAR_Error object on failure.
     *
     * @since 1.6.0
     */
    public function command($command, $valid)
    {
        if (PEAR::isError($error = $this->put($command))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse($valid))) {
            return $error;
        }

        return true;
    }

    /**
     * Return a 2-tuple containing the last response from the SMTP server.
     *
     * @return array A two-element array: the first element contains the
     *               response code as an integer and the second element
     *               contains the response's arguments as a string.
     *
     * @since 1.1.0
     */
    public function getResponse()
    {
        return array($this->code, join("\n", $this->arguments));
    }

    /**
     * Return the SMTP server's greeting string.
     *
     * @return string A string containing the greeting string, or null if
     *                a greeting has not been received.
     *
     * @since 1.3.3
     */
    public function getGreeting()
    {
        return $this->greeting;
    }

    /**
     * Attempt to connect to the SMTP server.
     *
     * @param int  $timeout    The timeout value (in seconds) for the
     *                         socket connection attempt.
     * @param bool $persistent Should a persistent socket connection
     *                         be used?
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function connect($timeout = null, $persistent = false)
    {
        $this->greeting = null;

        $result = $this->socket->connect(
            $this->host, $this->port, $persistent, $timeout, $this->socket_options
        );

        if (PEAR::isError($result)) {
            return PEAR::raiseError(
                'Failed to connect socket: ' . $result->getMessage()
            );
        }

        /*
         * Now that we're connected, reset the socket's timeout value for
         * future I/O operations.  This allows us to have different socket
         * timeout values for the initial connection (our $timeout parameter)
         * and all other socket operations.
         */
        if ($this->timeout > 0) {
            if (PEAR::isError($error = $this->setTimeout($this->timeout))) {
                return $error;
            }
        }

        if (PEAR::isError($error = $this->parseResponse(220))) {
            return $error;
        }

        /* Extract and store a copy of the server's greeting string. */
        list(, $this->greeting) = $this->getResponse();

        if (PEAR::isError($error = $this->negotiate())) {
            return $error;
        }

        return true;
    }

    /**
     * Attempt to disconnect from the SMTP server.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function disconnect()
    {
        if (PEAR::isError($error = $this->put('QUIT'))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(221))) {
            return $error;
        }
        if (PEAR::isError($error = $this->socket->disconnect())) {
            return PEAR::raiseError(
                'Failed to disconnect socket: ' . $error->getMessage()
            );
        }

        return true;
    }

    /**
     * Attempt to send the EHLO command and obtain a list of ESMTP
     * extensions available, and failing that just send HELO.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     *
     * @since 1.1.0
     */
    protected function negotiate()
    {
        if (PEAR::isError($error = $this->put('EHLO', $this->localhost))) {
            return $error;
        }

        if (PEAR::isError($this->parseResponse(250))) {
            /* If the EHLO failed, try the simpler HELO command. */
            if (PEAR::isError($error = $this->put('HELO', $this->localhost))) {
                return $error;
            }
            if (PEAR::isError($this->parseResponse(250))) {
                return PEAR::raiseError('HELO was not accepted', $this->code);
            }

            return true;
        }

        foreach ($this->arguments as $argument) {
            $verb      = strtok($argument, ' ');
            $len       = strlen($verb);
            $arguments = substr($argument, $len + 1, strlen($argument) - $len - 1);
            $this->esmtp[$verb] = $arguments;
        }

        if (!isset($this->esmtp['PIPELINING'])) {
            $this->pipelining = false;
        }

        return true;
    }

    /**
     * Returns the name of the best authentication method that the server
     * has advertised.
     *
     * @return mixed Returns a string containing the name of the best
     *               supported authentication method or a PEAR_Error object
     *               if a failure condition is encountered.
     * @since 1.1.0
     */
    protected function getBestAuthMethod()
    {
        $available_methods = explode(' ', $this->esmtp['AUTH']);

        foreach ($this->auth_methods as $method => $callback) {
            if (in_array($method, $available_methods)) {
                return $method;
            }
        }

        return PEAR::raiseError('No supported authentication methods');
    }
    
    /**
     * Establish STARTTLS Connection.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, true on success, or false if SSL/TLS
     *               isn't available.
     * @since 1.10.0
     */
    public function starttls()
    {
        /* We can only attempt a TLS connection if one has been requested,
         * we're running PHP 5.1.0 or later, have access to the OpenSSL
         * extension, are connected to an SMTP server which supports the
         * STARTTLS extension, and aren't already connected over a secure
         * (SSL) socket connection. */
        if (version_compare(PHP_VERSION, '5.1.0', '>=')
            && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
            && strncasecmp($this->host, 'ssl://', 6) !== 0
            ) {
                /* Start the TLS connection attempt. */
                if (PEAR::isError($result = $this->put('STARTTLS'))) {
                    return $result;
                }
                if (PEAR::isError($result = $this->parseResponse(220))) {
                    return $result;
                }
                if (isset($this->socket_options['ssl']['crypto_method'])) {
                    $crypto_method = $this->socket_options['ssl']['crypto_method'];
                } else {
                    /* STREAM_CRYPTO_METHOD_TLS_ANY_CLIENT constant does not exist
                     * and STREAM_CRYPTO_METHOD_SSLv23_CLIENT constant is
                     * inconsistent across PHP versions. */
                    $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT
                    | @STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
                    | @STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
                }
                if (PEAR::isError($result = $this->socket->enableCrypto(true, $crypto_method))) {
                    return $result;
                } elseif ($result !== true) {
                    return PEAR::raiseError('STARTTLS failed');
                }
                
                /* Send EHLO again to recieve the AUTH string from the
                 * SMTP server. */
                $this->negotiate();
            } else {
                return false;
            }
            
            return true;
    }
        
    /**
     * Attempt to do SMTP authentication.
     *
     * @param string $uid    The userid to authenticate as.
     * @param string $pwd    The password to authenticate with.
     * @param string $method The requested authentication method.  If none is
     *                       specified, the best supported method will be used.
     * @param bool   $tls    Flag indicating whether or not TLS should be attempted.
     * @param string $authz  An optional authorization identifier.  If specified, this
     *                       identifier will be used as the authorization proxy.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function auth($uid, $pwd , $method = '', $tls = true, $authz = '')
    {
        /* We can only attempt a TLS connection if one has been requested,
         * we're running PHP 5.1.0 or later, have access to the OpenSSL
         * extension, are connected to an SMTP server which supports the
         * STARTTLS extension, and aren't already connected over a secure
         * (SSL) socket connection. */
        if ($tls) {
            /* Start the TLS connection attempt. */
            if (PEAR::isError($starttls = $this->starttls())) {
                return $starttls;
            }
        }

        if (empty($this->esmtp['AUTH'])) {
            return PEAR::raiseError('SMTP server does not support authentication');
        }

        /* If no method has been specified, get the name of the best
         * supported method advertised by the SMTP server. */
        if (empty($method)) {
            if (PEAR::isError($method = $this->getBestAuthMethod())) {
                /* Return the PEAR_Error object from _getBestAuthMethod(). */
                return $method;
            }
        } else {
            $method = strtoupper($method);
            if (!array_key_exists($method, $this->auth_methods)) {
                return PEAR::raiseError("$method is not a supported authentication method");
            }
        }

        if (!isset($this->auth_methods[$method])) {
            return PEAR::raiseError("$method is not a supported authentication method");
        }

        if (!is_callable($this->auth_methods[$method], false)) {
            return PEAR::raiseError("$method authentication method cannot be called");
        }

        if (is_array($this->auth_methods[$method])) {
            list($object, $method) = $this->auth_methods[$method];
            $result = $object->{$method}($uid, $pwd, $authz, $this);
        } else {
            $func   = $this->auth_methods[$method];
            $result = $func($uid, $pwd, $authz, $this);
        }

        /* If an error was encountered, return the PEAR_Error object. */
        if (PEAR::isError($result)) {
            return $result;
        }

        return true;
    }

    /**
     * Add a new authentication method.
     *
     * @param string $name     The authentication method name (e.g. 'PLAIN')
     * @param mixed  $callback The authentication callback (given as the name of a
     *                         function or as an (object, method name) array).
     * @param bool   $prepend  Should the new method be prepended to the list of
     *                         available methods?  This is the default behavior,
     *                         giving the new method the highest priority.
     *
     * @return mixed True on success or a PEAR_Error object on failure.
     *
     * @since 1.6.0
     */
    public function setAuthMethod($name, $callback, $prepend = true)
    {
        if (!is_string($name)) {
            return PEAR::raiseError('Method name is not a string');
        }

        if (!is_string($callback) && !is_array($callback)) {
            return PEAR::raiseError('Method callback must be string or array');
        }

        if (is_array($callback)) {
            if (!is_object($callback[0]) || !is_string($callback[1])) {
                return PEAR::raiseError('Bad mMethod callback array');
            }
        }

        if ($prepend) {
            $this->auth_methods = array_merge(
                array($name => $callback), $this->auth_methods
            );
        } else {
            $this->auth_methods[$name] = $callback;
        }

        return true;
    }

    /**
     * Authenticates the user using the DIGEST-MD5 method.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $pwd   The password to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.1.0
     */
    protected function authDigestMD5($uid, $pwd, $authz = '')
    {
        if (PEAR::isError($error = $this->put('AUTH', 'DIGEST-MD5'))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            /* 503: Error: already authenticated */
            if ($this->code === 503) {
                return true;
            }
            return $error;
        }

        $auth_sasl = new Auth_SASL;
        $digest    = $auth_sasl->factory('digest-md5');
        $challenge = base64_decode($this->arguments[0]);
        $auth_str  = base64_encode(
            $digest->getResponse($uid, $pwd, $challenge, $this->host, "smtp", $authz)
        );

        if (PEAR::isError($error = $this->put($auth_str))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            return $error;
        }

        /* We don't use the protocol's third step because SMTP doesn't
         * allow subsequent authentication, so we just silently ignore
         * it. */
        if (PEAR::isError($error = $this->put(''))) {
            return $error;
        }
        /* 235: Authentication successful */
        if (PEAR::isError($error = $this->parseResponse(235))) {
            return $error;
        }
    }

    /**
     * Authenticates the user using the CRAM-MD5 method.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $pwd   The password to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.1.0
     */
    protected function authCRAMMD5($uid, $pwd, $authz = '')
    {
        if (PEAR::isError($error = $this->put('AUTH', 'CRAM-MD5'))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            /* 503: Error: already authenticated */
            if ($this->code === 503) {
                return true;
            }
            return $error;
        }

        $auth_sasl = new Auth_SASL;
        $challenge = base64_decode($this->arguments[0]);
        $cram      = $auth_sasl->factory('cram-md5');
        $auth_str  = base64_encode($cram->getResponse($uid, $pwd, $challenge));

        if (PEAR::isError($error = $this->put($auth_str))) {
            return $error;
        }

        /* 235: Authentication successful */
        if (PEAR::isError($error = $this->parseResponse(235))) {
            return $error;
        }
    }

    /**
     * Authenticates the user using the LOGIN method.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $pwd   The password to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.1.0
     */
    protected function authLogin($uid, $pwd, $authz = '')
    {
        if (PEAR::isError($error = $this->put('AUTH', 'LOGIN'))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            /* 503: Error: already authenticated */
            if ($this->code === 503) {
                return true;
            }
            return $error;
        }

        if (PEAR::isError($error = $this->put(base64_encode($uid)))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            return $error;
        }

        if (PEAR::isError($error = $this->put(base64_encode($pwd)))) {
            return $error;
        }

        /* 235: Authentication successful */
        if (PEAR::isError($error = $this->parseResponse(235))) {
            return $error;
        }

        return true;
    }

    /**
     * Authenticates the user using the PLAIN method.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $pwd   The password to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.1.0
     */
    protected function authPlain($uid, $pwd, $authz = '')
    {
        if (PEAR::isError($error = $this->put('AUTH', 'PLAIN'))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            /* 503: Error: already authenticated */
            if ($this->code === 503) {
                return true;
            }
            return $error;
        }

        $auth_str = base64_encode($authz . chr(0) . $uid . chr(0) . $pwd);

        if (PEAR::isError($error = $this->put($auth_str))) {
            return $error;
        }

        /* 235: Authentication successful */
        if (PEAR::isError($error = $this->parseResponse(235))) {
            return $error;
        }

        return true;
    }

     /**
     * Authenticates the user using the GSSAPI method.
     *
     * PHP krb5 extension is required,
     * service principal and credentials cache must be set.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $pwd   The password to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     */
    protected function authGSSAPI($uid, $pwd, $authz = '')
    {
        if (PEAR::isError($error = $this->put('AUTH', 'GSSAPI'))) {
            return $error;
        }
        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            /* 503: Error: already authenticated */
            if ($this->code === 503) {
                return true;
            }
            return $error;
        }

        if (!$this->gssapi_principal) {
            return PEAR::raiseError('No Kerberos service principal set', 2);
        }

        if (!empty($this->gssapi_cname)) {
            putenv('KRB5CCNAME=' . $this->gssapi_cname);
        }

        try {
            $ccache = new KRB5CCache();
            if (!empty($this->gssapi_cname)) {
                $ccache->open($this->gssapi_cname);
            }
            
            $gssapicontext = new GSSAPIContext();
            $gssapicontext->acquireCredentials($ccache);

            $token   = '';
            $success = $gssapicontext->initSecContext($this->gssapi_principal, null, null, null, $token);
            $token   = base64_encode($token);
        }
        catch (Exception $e) {
            return PEAR::raiseError('GSSAPI authentication failed: ' . $e->getMessage());
        }

        if (PEAR::isError($error = $this->put($token))) {
            return $error;
        }

        /* 334: Continue authentication request */
        if (PEAR::isError($error = $this->parseResponse(334))) {
            return $error;
        }

        $response = $this->arguments[0];

        try {
            $challenge = base64_decode($response);
            $gssapicontext->unwrap($challenge, $challenge);
            $gssapicontext->wrap($challenge, $challenge, true);
        }
        catch (Exception $e) {
            return PEAR::raiseError('GSSAPI authentication failed: ' . $e->getMessage());
        }

        if (PEAR::isError($error = $this->put(base64_encode($challenge)))) {
            return $error;
        }

        /* 235: Authentication successful */
        if (PEAR::isError($error = $this->parseResponse(235))) {
            return $error;
        }

        return true;
    }

    /**
     * Authenticates the user using the XOAUTH2 method.
     *
     * @param string $uid   The userid to authenticate as.
     * @param string $token The access token to authenticate with.
     * @param string $authz The optional authorization proxy identifier.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.9.0
     */
    public function authXOAuth2($uid, $token, $authz, $conn)
    {
        $auth = base64_encode("user=$uid\1auth=$token\1\1");
        if (PEAR::isError($error = $this->put('AUTH', 'XOAUTH2 ' . $auth))) {
            return $error;
        }

        /* 235: Authentication successful or 334: Continue authentication */
        if (PEAR::isError($error = $this->parseResponse([235, 334]))) {
            return $error;
        }

        /* 334: Continue authentication request */
        if ($this->code === 334) {
            /* Send an empty line as response to 334 */
            if (PEAR::isError($error = $this->put(''))) {
                return $error;
            }

            /* Expect 235: Authentication successful */
            if (PEAR::isError($error = $this->parseResponse(235))) {
                return $error;
            }
        }

        return true;
    }

    /**
     * Send the HELO command.
     *
     * @param string $domain The domain name to say we are.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function helo($domain)
    {
        if (PEAR::isError($error = $this->put('HELO', $domain))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250))) {
            return $error;
        }

        return true;
    }

    /**
     * Return the list of SMTP service extensions advertised by the server.
     *
     * @return array The list of SMTP service extensions.
     * @since 1.3
     */
    public function getServiceExtensions()
    {
        return $this->esmtp;
    }

    /**
     * Send the MAIL FROM: command.
     *
     * @param string $sender The sender (reverse path) to set.
     * @param string $params String containing additional MAIL parameters,
     *                       such as the NOTIFY flags defined by RFC 1891
     *                       or the VERP protocol.
     *
     *                       If $params is an array, only the 'verp' option
     *                       is supported.  If 'verp' is true, the XVERP
     *                       parameter is appended to the MAIL command.
     *                       If the 'verp' value is a string, the full
     *                       XVERP=value parameter is appended.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function mailFrom($sender, $params = null)
    {
        $args = "FROM:<$sender>";

        /* Support the deprecated array form of $params. */
        if (is_array($params) && isset($params['verp'])) {
            if ($params['verp'] === true) {
                $args .= ' XVERP';
            } elseif (trim($params['verp'])) {
                $args .= ' XVERP=' . $params['verp'];
            }
        } elseif (is_string($params) && !empty($params)) {
            $args .= ' ' . $params;
        }

        if (PEAR::isError($error = $this->put('MAIL', $args))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the RCPT TO: command.
     *
     * @param string $recipient The recipient (forward path) to add.
     * @param string $params    String containing additional RCPT parameters,
     *                          such as the NOTIFY flags defined by RFC 1891.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     *
     * @since 1.0
     */
    public function rcptTo($recipient, $params = null)
    {
        $args = "TO:<$recipient>";
        if (is_string($params)) {
            $args .= ' ' . $params;
        }

        if (PEAR::isError($error = $this->put('RCPT', $args))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(array(250, 251), $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Quote the data so that it meets SMTP standards.
     *
     * This is provided as a separate public function to facilitate
     * easier overloading for the cases where it is desirable to
     * customize the quoting behavior.
     *
     * @param string &$data The message text to quote. The string must be passed
     *                      by reference, and the text will be modified in place.
     *
     * @since 1.2
     */
    public function quotedata(&$data)
    {
        /* Because a single leading period (.) signifies an end to the
         * data, legitimate leading periods need to be "doubled" ('..'). */
        $data = preg_replace('/^\./m', '..', $data);

        /* Change Unix (\n) and Mac (\r) linefeeds into CRLF's (\r\n). */
        $data = preg_replace('/(?:\r\n|\n|\r(?!\n))/', "\r\n", $data);
    }

    /**
     * Send the DATA command.
     *
     * @param mixed  $data    The message data, either as a string or an open
     *                        file resource.
     * @param string $headers The message headers.  If $headers is provided,
     *                        $data is assumed to contain only body data.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function data($data, $headers = null)
    {
        /* Verify that $data is a supported type. */
        if (!is_string($data) && !is_resource($data)) {
            return PEAR::raiseError('Expected a string or file resource');
        }

        /* Start by considering the size of the optional headers string.  We
         * also account for the addition 4 character "\r\n\r\n" separator
         * sequence. */
        $size = $headers_size = (is_null($headers)) ? 0 : strlen($headers) + 4;

        if (is_resource($data)) {
            $stat = fstat($data);
            if ($stat === false) {
                return PEAR::raiseError('Failed to get file size');
            }
            $size += $stat['size'];
        } else {
            $size += strlen($data);
        }

        /* RFC 1870, section 3, subsection 3 states "a value of zero indicates
         * that no fixed maximum message size is in force".  Furthermore, it
         * says that if "the parameter is omitted no information is conveyed
         * about the server's fixed maximum message size". */
        $limit = (isset($this->esmtp['SIZE'])) ? $this->esmtp['SIZE'] : 0;
        if ($limit > 0 && $size >= $limit) {
            return PEAR::raiseError('Message size exceeds server limit');
        }

        /* Initiate the DATA command. */
        if (PEAR::isError($error = $this->put('DATA'))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(354))) {
            return $error;
        }

        /* If we have a separate headers string, send it first. */
        if (!is_null($headers)) {
            $this->quotedata($headers);
            if (PEAR::isError($result = $this->send($headers . "\r\n\r\n"))) {
                return $result;
            }

            /* Subtract the headers size now that they've been sent. */
            $size -= $headers_size;
        }

        /* Now we can send the message body data. */
        if (is_resource($data)) {
            /* Stream the contents of the file resource out over our socket
             * connection, line by line.  Each line must be run through the
             * quoting routine. */
            while (strlen($line = fread($data, 8192)) > 0) {
                /* If the last character is an newline, we need to grab the
                 * next character to check to see if it is a period. */
                while (!feof($data)) {
                    $char = fread($data, 1);
                    $line .= $char;
                    if ($char != "\n") {
                        break;
                    }
                }
                $this->quotedata($line);
                if (PEAR::isError($result = $this->send($line))) {
                    return $result;
                }
            }

             $last = $line;
        } else {
            /*
             * Break up the data by sending one chunk (up to 512k) at a time.
             * This approach reduces our peak memory usage.
             */
            for ($offset = 0; $offset < $size;) {
                $end = $offset + 512000;

                /*
                 * Ensure we don't read beyond our data size or span multiple
                 * lines.  quotedata() can't properly handle character data
                 * that's split across two line break boundaries.
                 */
                if ($end >= $size) {
                    $end = $size;
                } else {
                    for (; $end < $size; $end++) {
                        if ($data[$end] != "\n") {
                            break;
                        }
                    }
                }

                /* Extract our chunk and run it through the quoting routine. */
                $chunk = substr($data, $offset, $end - $offset);
                $this->quotedata($chunk);

                /* If we run into a problem along the way, abort. */
                if (PEAR::isError($result = $this->send($chunk))) {
                    return $result;
                }

                /* Advance the offset to the end of this chunk. */
                $offset = $end;
            }

            $last = $chunk;
        }

        /* Don't add another CRLF sequence if it's already in the data */
        $terminator = (substr($last, -2) == "\r\n" ? '' : "\r\n") . ".\r\n";

        /* Finally, send the DATA terminator sequence. */
        if (PEAR::isError($result = $this->send($terminator))) {
            return $result;
        }

        /* Verify that the data was successfully received by the server. */
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the SEND FROM: command.
     *
     * @param string $path The reverse path to send.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.2.6
     */
    public function sendFrom($path)
    {
        if (PEAR::isError($error = $this->put('SEND', "FROM:<$path>"))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the SOML FROM: command.
     *
     * @param string $path The reverse path to send.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.2.6
     */
    public function somlFrom($path)
    {
        if (PEAR::isError($error = $this->put('SOML', "FROM:<$path>"))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the SAML FROM: command.
     *
     * @param string $path The reverse path to send.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.2.6
     */
    public function samlFrom($path)
    {
        if (PEAR::isError($error = $this->put('SAML', "FROM:<$path>"))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the RSET command.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since  1.0
     */
    public function rset()
    {
        if (PEAR::isError($error = $this->put('RSET'))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the VRFY command.
     *
     * @param string $string The string to verify
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function vrfy($string)
    {
        /* Note: 251 is also a valid response code */
        if (PEAR::isError($error = $this->put('VRFY', $string))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(array(250, 252)))) {
            return $error;
        }

        return true;
    }

    /**
     * Send the NOOP command.
     *
     * @return mixed Returns a PEAR_Error with an error message on any
     *               kind of failure, or true on success.
     * @since 1.0
     */
    public function noop()
    {
        if (PEAR::isError($error = $this->put('NOOP'))) {
            return $error;
        }
        if (PEAR::isError($error = $this->parseResponse(250))) {
            return $error;
        }

        return true;
    }

    /**
     * Backwards-compatibility method.  identifySender()'s functionality is
     * now handled internally.
     *
     * @return boolean This method always return true.
     *
     * @since 1.0
     */
    public function identifySender()
    {
        return true;
    }
}
PK�^�\���NFUFUpear/Net/Socket.phpnu�[���<?php
/**
 * Net_Socket
 *
 * PHP Version 5
 *
 * LICENSE:
 *
 * Copyright (c) 1997-2017 The PHP Group
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * o Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * o Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @category  Net
 * @package   Net_Socket
 * @author    Stig Bakken <ssb@php.net>
 * @author    Chuck Hagenbuch <chuck@horde.org>
 * @copyright 1997-2017 The PHP Group
 * @license   http://opensource.org/licenses/bsd-license.php BSD-2-Clause
 * @link      http://pear.php.net/packages/Net_Socket
 */

require_once 'PEAR.php';

define('NET_SOCKET_READ', 1);
define('NET_SOCKET_WRITE', 2);
define('NET_SOCKET_ERROR', 4);

/**
 * Generalized Socket class.
 *
 * @category  Net
 * @package   Net_Socket
 * @author    Stig Bakken <ssb@php.net>
 * @author    Chuck Hagenbuch <chuck@horde.org>
 * @copyright 1997-2017 The PHP Group
 * @license   http://opensource.org/licenses/bsd-license.php BSD-2-Clause
 * @link      http://pear.php.net/packages/Net_Socket
 */
class Net_Socket extends PEAR
{
    /**
     * Socket file pointer.
     * @var resource $fp
     */
    public $fp = null;

    /**
     * Whether the socket is blocking. Defaults to true.
     * @var boolean $blocking
     */
    public $blocking = true;

    /**
     * Whether the socket is persistent. Defaults to false.
     * @var boolean $persistent
     */
    public $persistent = false;

    /**
     * The IP address to connect to.
     * @var string $addr
     */
    public $addr = '';

    /**
     * The port number to connect to.
     * @var integer $port
     */
    public $port = 0;

    /**
     * Number of seconds to wait on socket operations before assuming
     * there's no more data. Defaults to no timeout.
     * @var integer|float $timeout
     */
    public $timeout = null;

    /**
     * Number of bytes to read at a time in readLine() and
     * readAll(). Defaults to 2048.
     * @var integer $lineLength
     */
    public $lineLength = 2048;

    /**
     * The string to use as a newline terminator. Usually "\r\n" or "\n".
     * @var string $newline
     */
    public $newline = "\r\n";

    /**
     * Connect to the specified port. If called when the socket is
     * already connected, it disconnects and connects again.
     *
     * @param string $addr IP address or host name (may be with protocol prefix).
     * @param integer $port TCP port number.
     * @param boolean $persistent (optional) Whether the connection is
     *                            persistent (kept open between requests
     *                            by the web server).
     * @param integer $timeout (optional) Connection socket timeout.
     * @param array $options See options for stream_context_create.
     *
     * @access public
     *
     * @return boolean|PEAR_Error  True on success or a PEAR_Error on failure.
     */
    public function connect(
        $addr,
        $port = 0,
        $persistent = null,
        $timeout = null,
        $options = null
    ) {
        if (is_resource($this->fp)) {
            @fclose($this->fp);
            $this->fp = null;
        }

        if (!$addr) {
            return $this->raiseError('$addr cannot be empty');
        } else {
            if (strspn($addr, ':.0123456789') === strlen($addr)) {
                $this->addr = strpos($addr, ':') !== false ? '[' . $addr . ']' : $addr;
            } else {
                $this->addr = $addr;
            }
        }

        $this->port = $port % 65536;

        if ($persistent !== null) {
            $this->persistent = $persistent;
        }

        $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen';
        $errno = 0;
        $errstr = '';

        if (function_exists('error_clear_last')) {
            error_clear_last();
        } else {
            $old_track_errors = @ini_set('track_errors', 1);
        }

        if ($timeout <= 0) {
            $timeout = @ini_get('default_socket_timeout');
        }

        if ($options && function_exists('stream_context_create')) {
            $context = stream_context_create($options);

            // Since PHP 5 fsockopen doesn't allow context specification
            if (function_exists('stream_socket_client')) {
                $flags = STREAM_CLIENT_CONNECT;

                if ($this->persistent) {
                    $flags = STREAM_CLIENT_PERSISTENT;
                }

                $addr = $this->addr . ':' . $this->port;
                $fp = @stream_socket_client($addr, $errno, $errstr,
                    $timeout, $flags, $context);
            } else {
                $fp = @$openfunc($this->addr, $this->port, $errno,
                    $errstr, $timeout, $context);
            }
        } else {
            $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $timeout);
        }

        if (!$fp) {
            if ($errno === 0 && !strlen($errstr)) {
                $errstr = '';
                if (isset($old_track_errors)) {
                    $errstr = $php_errormsg ?: '';  
                    @ini_set('track_errors', $old_track_errors);
                } else {
                    $lastError = error_get_last();
                    if (isset($lastError['message'])) {
                        $errstr = $lastError['message'];
                    }
                }
            }

            return $this->raiseError($errstr, $errno);
        }

        if (isset($old_track_errors)) {
            @ini_set('track_errors', $old_track_errors);
        }

        $this->fp = $fp;
        $this->setTimeout();

        return $this->setBlocking($this->blocking);
    }

    /**
     * Disconnects from the peer, closes the socket.
     *
     * @access public
     * @return mixed true on success or a PEAR_Error instance otherwise
     */
    public function disconnect()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        @fclose($this->fp);
        $this->fp = null;

        return true;
    }

    /**
     * Set the newline character/sequence to use.
     *
     * @param string $newline Newline character(s)
     * @return boolean True
     */
    public function setNewline($newline)
    {
        $this->newline = $newline;

        return true;
    }

    /**
     * Find out if the socket is in blocking mode.
     *
     * @access public
     * @return boolean  The current blocking mode.
     */
    public function isBlocking()
    {
        return $this->blocking;
    }

    /**
     * Sets whether the socket connection should be blocking or
     * not. A read call to a non-blocking socket will return immediately
     * if there is no data available, whereas it will block until there
     * is data for blocking sockets.
     *
     * @param boolean $mode True for blocking sockets, false for nonblocking.
     *
     * @access public
     * @return mixed true on success or a PEAR_Error instance otherwise
     */
    public function setBlocking($mode)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $this->blocking = $mode;
        stream_set_blocking($this->fp, (int)$this->blocking);

        return true;
    }

    /**
     * Sets the timeout value on socket descriptor,
     * expressed in the sum of seconds and microseconds
     *
     * @param integer $seconds Seconds.
     * @param integer $microseconds Microseconds, optional.
     *
     * @access public
     * @return mixed True on success or false on failure or
     *               a PEAR_Error instance when not connected
     */
    public function setTimeout($seconds = null, $microseconds = null)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        if ($seconds === null && $microseconds === null) {
            $seconds = (int)$this->timeout;
            $microseconds = (int)(($this->timeout - $seconds) * 1000000);
        } else {
            $this->timeout = $seconds + $microseconds / 1000000;
        }

        if ($this->timeout > 0) {
            return stream_set_timeout($this->fp, (int)$seconds, (int)$microseconds);
        } else {
            return false;
        }
    }

    /**
     * Sets the file buffering size on the stream.
     * See php's stream_set_write_buffer for more information.
     *
     * @param integer $size Write buffer size.
     *
     * @access public
     * @return mixed on success or an PEAR_Error object otherwise
     */
    public function setWriteBuffer($size)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $returned = stream_set_write_buffer($this->fp, $size);
        if ($returned === 0) {
            return true;
        }

        return $this->raiseError('Cannot set write buffer.');
    }

    /**
     * Returns information about an existing socket resource.
     * Currently returns four entries in the result array:
     *
     * <p>
     * timed_out (bool) - The socket timed out waiting for data<br>
     * blocked (bool) - The socket was blocked<br>
     * eof (bool) - Indicates EOF event<br>
     * unread_bytes (int) - Number of bytes left in the socket buffer<br>
     * </p>
     *
     * @access public
     * @return mixed Array containing information about existing socket
     *               resource or a PEAR_Error instance otherwise
     */
    public function getStatus()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        return stream_get_meta_data($this->fp);
    }

    /**
     * Get a specified line of data
     *
     * @param int $size Reading ends when size - 1 bytes have been read,
     *                  or a newline or an EOF (whichever comes first).
     *                  If no size is specified, it will keep reading from
     *                  the stream until it reaches the end of the line.
     *
     * @access public
     * @return mixed $size bytes of data from the socket, or a PEAR_Error if
     *         not connected. If an error occurs, FALSE is returned.
     */
    public function gets($size = null)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        if (null === $size) {
            return @fgets($this->fp);
        } else {
            return @fgets($this->fp, $size);
        }
    }

    /**
     * Read a specified amount of data. This is guaranteed to return,
     * and has the added benefit of getting everything in one fread()
     * chunk; if you know the size of the data you're getting
     * beforehand, this is definitely the way to go.
     *
     * @param integer $size The number of bytes to read from the socket.
     *
     * @access public
     * @return string $size bytes of data from the socket, or a PEAR_Error if
     *         not connected.
     */
    public function read($size)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        return @fread($this->fp, $size);
    }

    /**
     * Write a specified amount of data.
     *
     * @param string $data Data to write.
     * @param integer $blocksize Amount of data to write at once.
     *                           NULL means all at once.
     *
     * @access public
     * @return mixed If the socket is not connected, returns an instance of
     *               PEAR_Error.
     *               If the write succeeds, returns the number of bytes written.
     *               If the write fails, returns false.
     *               If the socket times out, returns an instance of PEAR_Error.
     */
    public function write($data, $blocksize = null)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        if (null === $blocksize && !OS_WINDOWS) {
            $written = @fwrite($this->fp, $data);

            // Check for timeout or lost connection
            if ($written === false) {
                $meta_data = $this->getStatus();

                if (!is_array($meta_data)) {
                    return $meta_data; // PEAR_Error
                }

                if (!empty($meta_data['timed_out'])) {
                    return $this->raiseError('timed out');
                }
            }

            return $written;
        } else {
            if (null === $blocksize) {
                $blocksize = 1024;
            }

            $pos = 0;
            $size = strlen($data);
            while ($pos < $size) {
                $written = @fwrite($this->fp, substr($data, $pos, $blocksize));

                // Check for timeout or lost connection
                if ($written === false) {
                    $meta_data = $this->getStatus();

                    if (!is_array($meta_data)) {
                        return $meta_data; // PEAR_Error
                    }

                    if (!empty($meta_data['timed_out'])) {
                        return $this->raiseError('timed out');
                    }

                    return $written;
                }

                $pos += $written;
            }

            return $pos;
        }
    }

    /**
     * Write a line of data to the socket, followed by a trailing newline.
     *
     * @param string $data Data to write
     *
     * @access public
     * @return mixed fwrite() result, or PEAR_Error when not connected
     */
    public function writeLine($data)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        return fwrite($this->fp, $data . $this->newline);
    }

    /**
     * Tests for end-of-file on a socket descriptor.
     *
     * Also returns true if the socket is disconnected.
     *
     * @access public
     * @return bool
     */
    public function eof()
    {
        return (!is_resource($this->fp) || feof($this->fp));
    }

    /**
     * Reads a byte of data
     *
     * @access public
     * @return integer 1 byte of data from the socket, or a PEAR_Error if
     *         not connected.
     */
    public function readByte()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        return ord(@fread($this->fp, 1));
    }

    /**
     * Reads a word of data
     *
     * @access public
     * @return integer 1 word of data from the socket, or a PEAR_Error if
     *         not connected.
     */
    public function readWord()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $buf = @fread($this->fp, 2);

        return (ord($buf[0]) + (ord($buf[1]) << 8));
    }

    /**
     * Reads an int of data
     *
     * @access public
     * @return integer  1 int of data from the socket, or a PEAR_Error if
     *                  not connected.
     */
    public function readInt()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $buf = @fread($this->fp, 4);

        return (ord($buf[0]) + (ord($buf[1]) << 8) +
            (ord($buf[2]) << 16) + (ord($buf[3]) << 24));
    }

    /**
     * Reads a zero-terminated string of data
     *
     * @access public
     * @return string, or a PEAR_Error if
     *         not connected.
     */
    public function readString()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $string = '';
        while (($char = @fread($this->fp, 1)) !== "\x00") {
            $string .= $char;
        }

        return $string;
    }

    /**
     * Reads an IP Address and returns it in a dot formatted string
     *
     * @access public
     * @return string Dot formatted string, or a PEAR_Error if
     *         not connected.
     */
    public function readIPAddress()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $buf = @fread($this->fp, 4);

        return sprintf('%d.%d.%d.%d', ord($buf[0]), ord($buf[1]),
            ord($buf[2]), ord($buf[3]));
    }

    /**
     * Read until either the end of the socket or a newline, whichever
     * comes first. Strips the trailing newline from the returned data.
     *
     * @access public
     * @return string All available data up to a newline, without that
     *         newline, or until the end of the socket, or a PEAR_Error if
     *         not connected.
     */
    public function readLine()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $line = '';

        $timeout = time() + $this->timeout;

        while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) {
            $line .= @fgets($this->fp, $this->lineLength);
            if (substr($line, -1) == "\n") {
                return rtrim($line, $this->newline);
            }
        }

        return $line;
    }

    /**
     * Read until the socket closes, or until there is no more data in
     * the inner PHP buffer. If the inner buffer is empty, in blocking
     * mode we wait for at least 1 byte of data. Therefore, in
     * blocking mode, if there is no data at all to be read, this
     * function will never exit (unless the socket is closed on the
     * remote end).
     *
     * @access public
     *
     * @return string  All data until the socket closes, or a PEAR_Error if
     *                 not connected.
     */
    public function readAll()
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $data = '';
        $timeout = time() + $this->timeout;

        while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) {
            $data .= @fread($this->fp, $this->lineLength);
        }

        return $data;
    }

    /**
     * Runs the equivalent of the select() system call on the socket
     * with a timeout specified by tv_sec and tv_usec.
     *
     * @param integer $state Which of read/write/error to check for.
     * @param integer $tv_sec Number of seconds for timeout.
     * @param integer $tv_usec Number of microseconds for timeout.
     *
     * @access public
     * @return False if select fails, integer describing which of read/write/error
     *         are ready, or PEAR_Error if not connected.
     */
    public function select($state, $tv_sec, $tv_usec = 0)
    {
        if (!is_resource($this->fp)) {
            return $this->raiseError('not connected');
        }

        $read = null;
        $write = null;
        $except = null;
        if ($state & NET_SOCKET_READ) {
            $read[] = $this->fp;
        }
        if ($state & NET_SOCKET_WRITE) {
            $write[] = $this->fp;
        }
        if ($state & NET_SOCKET_ERROR) {
            $except[] = $this->fp;
        }
        if (false === ($sr = stream_select($read, $write, $except,
                $tv_sec, $tv_usec))
        ) {
            return false;
        }

        $result = 0;
        if (count($read)) {
            $result |= NET_SOCKET_READ;
        }
        if (count($write)) {
            $result |= NET_SOCKET_WRITE;
        }
        if (count($except)) {
            $result |= NET_SOCKET_ERROR;
        }

        return $result;
    }

    /**
     * Turns encryption on/off on a connected socket.
     *
     * @param bool $enabled Set this parameter to true to enable encryption
     *                         and false to disable encryption.
     * @param integer $type Type of encryption. See stream_socket_enable_crypto()
     *                         for values.
     *
     * @see    http://se.php.net/manual/en/function.stream-socket-enable-crypto.php
     * @access public
     * @return false on error, true on success and 0 if there isn't enough data
     *         and the user should try again (non-blocking sockets only).
     *         A PEAR_Error object is returned if the socket is not
     *         connected
     */
    public function enableCrypto($enabled, $type)
    {
        if (version_compare(phpversion(), '5.1.0', '>=')) {
            if (!is_resource($this->fp)) {
                return $this->raiseError('not connected');
            }

            return @stream_socket_enable_crypto($this->fp, $enabled, $type);
        } else {
            $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0';

            return $this->raiseError($msg);
        }
    }

}
PK�^�\���S66pear/Net/IDNA2/Exception.phpnu�[���<?php
class Net_IDNA2_Exception extends Exception
{
}
PK�^�\&��#rr%pear/Net/IDNA2/Exception/Nameprep.phpnu�[���<?php
require_once 'Net/IDNA2/Exception.php';

class Net_IDNA2_Exception_Nameprep extends Net_IDNA2_Exception
{
}
PK�^�\��
����pear/Net/IDNA2.phpnu�[���<?php

// {{{ license

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
//
// +----------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU Lesser General Public License as       |
// | published by the Free Software Foundation; either version 2.1 of the |
// | License, or (at your option) any later version.                      |
// |                                                                      |
// | This library 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    |
// | Lesser General Public License for more details.                      |
// |                                                                      |
// | You should have received a copy of the GNU Lesser General Public     |
// | License along with this library; if not, write to the Free Software  |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 |
// | USA.                                                                 |
// +----------------------------------------------------------------------+
//

// }}}
require_once 'Net/IDNA2/Exception.php';
require_once 'Net/IDNA2/Exception/Nameprep.php';

/**
 * Encode/decode Internationalized Domain Names.
 *
 * The class allows one to convert internationalized domain names
 * (see RFC 3490 for details) as they can be used with various registries worldwide
 * to be translated between their original (localized) form and their encoded form
 * as it will be used in the DNS (Domain Name System).
 *
 * The class provides two public methods, encode() and decode(), which do exactly
 * what you would expect them to do. You are allowed to use complete domain names,
 * simple strings and complete email addresses as well. That means, that you might
 * use any of the following notations:
 *
 * - www.n�rgler.com
 * - xn--nrgler-wxa
 * - xn--brse-5qa.xn--knrz-1ra.info
 *
 * Unicode input might be given as either UTF-8 string, UCS-4 string or UCS-4
 * array. Unicode output is available in the same formats.
 * You can select your preferred format via {@link set_paramter()}.
 *
 * ACE input and output is always expected to be ASCII.
 *
 * @package Net
 * @author  Markus Nix <mnix@docuverse.de>
 * @author  Matthias Sommerfeld <mso@phlylabs.de>
 * @author  Stefan Neufeind <pear.neufeind@speedpartner.de>
 * @version $Id$
 */
class Net_IDNA2
{
    // {{{ npdata
    /**
     * These Unicode codepoints are
     * mapped to nothing, See RFC3454 for details
     *
     * @static
     * @var array
     * @access private
     */
    private static $_np_map_nothing = array(
        0xAD,
        0x34F,
        0x1806,
        0x180B,
        0x180C,
        0x180D,
        0x200B,
        0x200C,
        0x200D,
        0x2060,
        0xFE00,
        0xFE01,
        0xFE02,
        0xFE03,
        0xFE04,
        0xFE05,
        0xFE06,
        0xFE07,
        0xFE08,
        0xFE09,
        0xFE0A,
        0xFE0B,
        0xFE0C,
        0xFE0D,
        0xFE0E,
        0xFE0F,
        0xFEFF
    );

    /**
     * Prohibited codepints
     *
     * @static
     * @var array
     * @access private
     */
    private static $_general_prohibited = array(
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        0xA,
        0xB,
        0xC,
        0xD,
        0xE,
        0xF,
        0x10,
        0x11,
        0x12,
        0x13,
        0x14,
        0x15,
        0x16,
        0x17,
        0x18,
        0x19,
        0x1A,
        0x1B,
        0x1C,
        0x1D,
        0x1E,
        0x1F,
        0x20,
        0x21,
        0x22,
        0x23,
        0x24,
        0x25,
        0x26,
        0x27,
        0x28,
        0x29,
        0x2A,
        0x2B,
        0x2C,
        0x2F,
        0x3B,
        0x3C,
        0x3D,
        0x3E,
        0x3F,
        0x40,
        0x5B,
        0x5C,
        0x5D,
        0x5E,
        0x5F,
        0x60,
        0x7B,
        0x7C,
        0x7D,
        0x7E,
        0x7F,
        0x3002
    );

    /**
     * Codepints prohibited by Nameprep
     * @static
     * @var array
     * @access private
     */
    private static $_np_prohibit = array(
        0xA0,
        0x1680,
        0x2000,
        0x2001,
        0x2002,
        0x2003,
        0x2004,
        0x2005,
        0x2006,
        0x2007,
        0x2008,
        0x2009,
        0x200A,
        0x200B,
        0x202F,
        0x205F,
        0x3000,
        0x6DD,
        0x70F,
        0x180E,
        0x200C,
        0x200D,
        0x2028,
        0x2029,
        0xFEFF,
        0xFFF9,
        0xFFFA,
        0xFFFB,
        0xFFFC,
        0xFFFE,
        0xFFFF,
        0x1FFFE,
        0x1FFFF,
        0x2FFFE,
        0x2FFFF,
        0x3FFFE,
        0x3FFFF,
        0x4FFFE,
        0x4FFFF,
        0x5FFFE,
        0x5FFFF,
        0x6FFFE,
        0x6FFFF,
        0x7FFFE,
        0x7FFFF,
        0x8FFFE,
        0x8FFFF,
        0x9FFFE,
        0x9FFFF,
        0xAFFFE,
        0xAFFFF,
        0xBFFFE,
        0xBFFFF,
        0xCFFFE,
        0xCFFFF,
        0xDFFFE,
        0xDFFFF,
        0xEFFFE,
        0xEFFFF,
        0xFFFFE,
        0xFFFFF,
        0x10FFFE,
        0x10FFFF,
        0xFFF9,
        0xFFFA,
        0xFFFB,
        0xFFFC,
        0xFFFD,
        0x340,
        0x341,
        0x200E,
        0x200F,
        0x202A,
        0x202B,
        0x202C,
        0x202D,
        0x202E,
        0x206A,
        0x206B,
        0x206C,
        0x206D,
        0x206E,
        0x206F,
        0xE0001
    );

    /**
     * Codepoint ranges prohibited by nameprep
     *
     * @static
     * @var array
     * @access private
     */
    private static $_np_prohibit_ranges = array(
        array(0x80,     0x9F    ),
        array(0x2060,   0x206F  ),
        array(0x1D173,  0x1D17A ),
        array(0xE000,   0xF8FF  ),
        array(0xF0000,  0xFFFFD ),
        array(0x100000, 0x10FFFD),
        array(0xFDD0,   0xFDEF  ),
        array(0xD800,   0xDFFF  ),
        array(0x2FF0,   0x2FFB  ),
        array(0xE0020,  0xE007F )
    );

    /**
     * Replacement mappings (casemapping, replacement sequences, ...)
     *
     * @static
     * @var array
     * @access private
     */
    private static $_np_replacemaps = array(
        0x41    => array(0x61),
        0x42    => array(0x62),
        0x43    => array(0x63),
        0x44    => array(0x64),
        0x45    => array(0x65),
        0x46    => array(0x66),
        0x47    => array(0x67),
        0x48    => array(0x68),
        0x49    => array(0x69),
        0x4A    => array(0x6A),
        0x4B    => array(0x6B),
        0x4C    => array(0x6C),
        0x4D    => array(0x6D),
        0x4E    => array(0x6E),
        0x4F    => array(0x6F),
        0x50    => array(0x70),
        0x51    => array(0x71),
        0x52    => array(0x72),
        0x53    => array(0x73),
        0x54    => array(0x74),
        0x55    => array(0x75),
        0x56    => array(0x76),
        0x57    => array(0x77),
        0x58    => array(0x78),
        0x59    => array(0x79),
        0x5A    => array(0x7A),
        0xB5    => array(0x3BC),
        0xC0    => array(0xE0),
        0xC1    => array(0xE1),
        0xC2    => array(0xE2),
        0xC3    => array(0xE3),
        0xC4    => array(0xE4),
        0xC5    => array(0xE5),
        0xC6    => array(0xE6),
        0xC7    => array(0xE7),
        0xC8    => array(0xE8),
        0xC9    => array(0xE9),
        0xCA    => array(0xEA),
        0xCB    => array(0xEB),
        0xCC    => array(0xEC),
        0xCD    => array(0xED),
        0xCE    => array(0xEE),
        0xCF    => array(0xEF),
        0xD0    => array(0xF0),
        0xD1    => array(0xF1),
        0xD2    => array(0xF2),
        0xD3    => array(0xF3),
        0xD4    => array(0xF4),
        0xD5    => array(0xF5),
        0xD6    => array(0xF6),
        0xD8    => array(0xF8),
        0xD9    => array(0xF9),
        0xDA    => array(0xFA),
        0xDB    => array(0xFB),
        0xDC    => array(0xFC),
        0xDD    => array(0xFD),
        0xDE    => array(0xFE),
        0xDF    => array(0x73, 0x73),
        0x100   => array(0x101),
        0x102   => array(0x103),
        0x104   => array(0x105),
        0x106   => array(0x107),
        0x108   => array(0x109),
        0x10A   => array(0x10B),
        0x10C   => array(0x10D),
        0x10E   => array(0x10F),
        0x110   => array(0x111),
        0x112   => array(0x113),
        0x114   => array(0x115),
        0x116   => array(0x117),
        0x118   => array(0x119),
        0x11A   => array(0x11B),
        0x11C   => array(0x11D),
        0x11E   => array(0x11F),
        0x120   => array(0x121),
        0x122   => array(0x123),
        0x124   => array(0x125),
        0x126   => array(0x127),
        0x128   => array(0x129),
        0x12A   => array(0x12B),
        0x12C   => array(0x12D),
        0x12E   => array(0x12F),
        0x130   => array(0x69, 0x307),
        0x132   => array(0x133),
        0x134   => array(0x135),
        0x136   => array(0x137),
        0x139   => array(0x13A),
        0x13B   => array(0x13C),
        0x13D   => array(0x13E),
        0x13F   => array(0x140),
        0x141   => array(0x142),
        0x143   => array(0x144),
        0x145   => array(0x146),
        0x147   => array(0x148),
        0x149   => array(0x2BC, 0x6E),
        0x14A   => array(0x14B),
        0x14C   => array(0x14D),
        0x14E   => array(0x14F),
        0x150   => array(0x151),
        0x152   => array(0x153),
        0x154   => array(0x155),
        0x156   => array(0x157),
        0x158   => array(0x159),
        0x15A   => array(0x15B),
        0x15C   => array(0x15D),
        0x15E   => array(0x15F),
        0x160   => array(0x161),
        0x162   => array(0x163),
        0x164   => array(0x165),
        0x166   => array(0x167),
        0x168   => array(0x169),
        0x16A   => array(0x16B),
        0x16C   => array(0x16D),
        0x16E   => array(0x16F),
        0x170   => array(0x171),
        0x172   => array(0x173),
        0x174   => array(0x175),
        0x176   => array(0x177),
        0x178   => array(0xFF),
        0x179   => array(0x17A),
        0x17B   => array(0x17C),
        0x17D   => array(0x17E),
        0x17F   => array(0x73),
        0x181   => array(0x253),
        0x182   => array(0x183),
        0x184   => array(0x185),
        0x186   => array(0x254),
        0x187   => array(0x188),
        0x189   => array(0x256),
        0x18A   => array(0x257),
        0x18B   => array(0x18C),
        0x18E   => array(0x1DD),
        0x18F   => array(0x259),
        0x190   => array(0x25B),
        0x191   => array(0x192),
        0x193   => array(0x260),
        0x194   => array(0x263),
        0x196   => array(0x269),
        0x197   => array(0x268),
        0x198   => array(0x199),
        0x19C   => array(0x26F),
        0x19D   => array(0x272),
        0x19F   => array(0x275),
        0x1A0   => array(0x1A1),
        0x1A2   => array(0x1A3),
        0x1A4   => array(0x1A5),
        0x1A6   => array(0x280),
        0x1A7   => array(0x1A8),
        0x1A9   => array(0x283),
        0x1AC   => array(0x1AD),
        0x1AE   => array(0x288),
        0x1AF   => array(0x1B0),
        0x1B1   => array(0x28A),
        0x1B2   => array(0x28B),
        0x1B3   => array(0x1B4),
        0x1B5   => array(0x1B6),
        0x1B7   => array(0x292),
        0x1B8   => array(0x1B9),
        0x1BC   => array(0x1BD),
        0x1C4   => array(0x1C6),
        0x1C5   => array(0x1C6),
        0x1C7   => array(0x1C9),
        0x1C8   => array(0x1C9),
        0x1CA   => array(0x1CC),
        0x1CB   => array(0x1CC),
        0x1CD   => array(0x1CE),
        0x1CF   => array(0x1D0),
        0x1D1   => array(0x1D2),
        0x1D3   => array(0x1D4),
        0x1D5   => array(0x1D6),
        0x1D7   => array(0x1D8),
        0x1D9   => array(0x1DA),
        0x1DB   => array(0x1DC),
        0x1DE   => array(0x1DF),
        0x1E0   => array(0x1E1),
        0x1E2   => array(0x1E3),
        0x1E4   => array(0x1E5),
        0x1E6   => array(0x1E7),
        0x1E8   => array(0x1E9),
        0x1EA   => array(0x1EB),
        0x1EC   => array(0x1ED),
        0x1EE   => array(0x1EF),
        0x1F0   => array(0x6A, 0x30C),
        0x1F1   => array(0x1F3),
        0x1F2   => array(0x1F3),
        0x1F4   => array(0x1F5),
        0x1F6   => array(0x195),
        0x1F7   => array(0x1BF),
        0x1F8   => array(0x1F9),
        0x1FA   => array(0x1FB),
        0x1FC   => array(0x1FD),
        0x1FE   => array(0x1FF),
        0x200   => array(0x201),
        0x202   => array(0x203),
        0x204   => array(0x205),
        0x206   => array(0x207),
        0x208   => array(0x209),
        0x20A   => array(0x20B),
        0x20C   => array(0x20D),
        0x20E   => array(0x20F),
        0x210   => array(0x211),
        0x212   => array(0x213),
        0x214   => array(0x215),
        0x216   => array(0x217),
        0x218   => array(0x219),
        0x21A   => array(0x21B),
        0x21C   => array(0x21D),
        0x21E   => array(0x21F),
        0x220   => array(0x19E),
        0x222   => array(0x223),
        0x224   => array(0x225),
        0x226   => array(0x227),
        0x228   => array(0x229),
        0x22A   => array(0x22B),
        0x22C   => array(0x22D),
        0x22E   => array(0x22F),
        0x230   => array(0x231),
        0x232   => array(0x233),
        0x345   => array(0x3B9),
        0x37A   => array(0x20, 0x3B9),
        0x386   => array(0x3AC),
        0x388   => array(0x3AD),
        0x389   => array(0x3AE),
        0x38A   => array(0x3AF),
        0x38C   => array(0x3CC),
        0x38E   => array(0x3CD),
        0x38F   => array(0x3CE),
        0x390   => array(0x3B9, 0x308, 0x301),
        0x391   => array(0x3B1),
        0x392   => array(0x3B2),
        0x393   => array(0x3B3),
        0x394   => array(0x3B4),
        0x395   => array(0x3B5),
        0x396   => array(0x3B6),
        0x397   => array(0x3B7),
        0x398   => array(0x3B8),
        0x399   => array(0x3B9),
        0x39A   => array(0x3BA),
        0x39B   => array(0x3BB),
        0x39C   => array(0x3BC),
        0x39D   => array(0x3BD),
        0x39E   => array(0x3BE),
        0x39F   => array(0x3BF),
        0x3A0   => array(0x3C0),
        0x3A1   => array(0x3C1),
        0x3A3   => array(0x3C3),
        0x3A4   => array(0x3C4),
        0x3A5   => array(0x3C5),
        0x3A6   => array(0x3C6),
        0x3A7   => array(0x3C7),
        0x3A8   => array(0x3C8),
        0x3A9   => array(0x3C9),
        0x3AA   => array(0x3CA),
        0x3AB   => array(0x3CB),
        0x3B0   => array(0x3C5, 0x308, 0x301),
        0x3C2   => array(0x3C3),
        0x3D0   => array(0x3B2),
        0x3D1   => array(0x3B8),
        0x3D2   => array(0x3C5),
        0x3D3   => array(0x3CD),
        0x3D4   => array(0x3CB),
        0x3D5   => array(0x3C6),
        0x3D6   => array(0x3C0),
        0x3D8   => array(0x3D9),
        0x3DA   => array(0x3DB),
        0x3DC   => array(0x3DD),
        0x3DE   => array(0x3DF),
        0x3E0   => array(0x3E1),
        0x3E2   => array(0x3E3),
        0x3E4   => array(0x3E5),
        0x3E6   => array(0x3E7),
        0x3E8   => array(0x3E9),
        0x3EA   => array(0x3EB),
        0x3EC   => array(0x3ED),
        0x3EE   => array(0x3EF),
        0x3F0   => array(0x3BA),
        0x3F1   => array(0x3C1),
        0x3F2   => array(0x3C3),
        0x3F4   => array(0x3B8),
        0x3F5   => array(0x3B5),
        0x400   => array(0x450),
        0x401   => array(0x451),
        0x402   => array(0x452),
        0x403   => array(0x453),
        0x404   => array(0x454),
        0x405   => array(0x455),
        0x406   => array(0x456),
        0x407   => array(0x457),
        0x408   => array(0x458),
        0x409   => array(0x459),
        0x40A   => array(0x45A),
        0x40B   => array(0x45B),
        0x40C   => array(0x45C),
        0x40D   => array(0x45D),
        0x40E   => array(0x45E),
        0x40F   => array(0x45F),
        0x410   => array(0x430),
        0x411   => array(0x431),
        0x412   => array(0x432),
        0x413   => array(0x433),
        0x414   => array(0x434),
        0x415   => array(0x435),
        0x416   => array(0x436),
        0x417   => array(0x437),
        0x418   => array(0x438),
        0x419   => array(0x439),
        0x41A   => array(0x43A),
        0x41B   => array(0x43B),
        0x41C   => array(0x43C),
        0x41D   => array(0x43D),
        0x41E   => array(0x43E),
        0x41F   => array(0x43F),
        0x420   => array(0x440),
        0x421   => array(0x441),
        0x422   => array(0x442),
        0x423   => array(0x443),
        0x424   => array(0x444),
        0x425   => array(0x445),
        0x426   => array(0x446),
        0x427   => array(0x447),
        0x428   => array(0x448),
        0x429   => array(0x449),
        0x42A   => array(0x44A),
        0x42B   => array(0x44B),
        0x42C   => array(0x44C),
        0x42D   => array(0x44D),
        0x42E   => array(0x44E),
        0x42F   => array(0x44F),
        0x460   => array(0x461),
        0x462   => array(0x463),
        0x464   => array(0x465),
        0x466   => array(0x467),
        0x468   => array(0x469),
        0x46A   => array(0x46B),
        0x46C   => array(0x46D),
        0x46E   => array(0x46F),
        0x470   => array(0x471),
        0x472   => array(0x473),
        0x474   => array(0x475),
        0x476   => array(0x477),
        0x478   => array(0x479),
        0x47A   => array(0x47B),
        0x47C   => array(0x47D),
        0x47E   => array(0x47F),
        0x480   => array(0x481),
        0x48A   => array(0x48B),
        0x48C   => array(0x48D),
        0x48E   => array(0x48F),
        0x490   => array(0x491),
        0x492   => array(0x493),
        0x494   => array(0x495),
        0x496   => array(0x497),
        0x498   => array(0x499),
        0x49A   => array(0x49B),
        0x49C   => array(0x49D),
        0x49E   => array(0x49F),
        0x4A0   => array(0x4A1),
        0x4A2   => array(0x4A3),
        0x4A4   => array(0x4A5),
        0x4A6   => array(0x4A7),
        0x4A8   => array(0x4A9),
        0x4AA   => array(0x4AB),
        0x4AC   => array(0x4AD),
        0x4AE   => array(0x4AF),
        0x4B0   => array(0x4B1),
        0x4B2   => array(0x4B3),
        0x4B4   => array(0x4B5),
        0x4B6   => array(0x4B7),
        0x4B8   => array(0x4B9),
        0x4BA   => array(0x4BB),
        0x4BC   => array(0x4BD),
        0x4BE   => array(0x4BF),
        0x4C1   => array(0x4C2),
        0x4C3   => array(0x4C4),
        0x4C5   => array(0x4C6),
        0x4C7   => array(0x4C8),
        0x4C9   => array(0x4CA),
        0x4CB   => array(0x4CC),
        0x4CD   => array(0x4CE),
        0x4D0   => array(0x4D1),
        0x4D2   => array(0x4D3),
        0x4D4   => array(0x4D5),
        0x4D6   => array(0x4D7),
        0x4D8   => array(0x4D9),
        0x4DA   => array(0x4DB),
        0x4DC   => array(0x4DD),
        0x4DE   => array(0x4DF),
        0x4E0   => array(0x4E1),
        0x4E2   => array(0x4E3),
        0x4E4   => array(0x4E5),
        0x4E6   => array(0x4E7),
        0x4E8   => array(0x4E9),
        0x4EA   => array(0x4EB),
        0x4EC   => array(0x4ED),
        0x4EE   => array(0x4EF),
        0x4F0   => array(0x4F1),
        0x4F2   => array(0x4F3),
        0x4F4   => array(0x4F5),
        0x4F8   => array(0x4F9),
        0x500   => array(0x501),
        0x502   => array(0x503),
        0x504   => array(0x505),
        0x506   => array(0x507),
        0x508   => array(0x509),
        0x50A   => array(0x50B),
        0x50C   => array(0x50D),
        0x50E   => array(0x50F),
        0x531   => array(0x561),
        0x532   => array(0x562),
        0x533   => array(0x563),
        0x534   => array(0x564),
        0x535   => array(0x565),
        0x536   => array(0x566),
        0x537   => array(0x567),
        0x538   => array(0x568),
        0x539   => array(0x569),
        0x53A   => array(0x56A),
        0x53B   => array(0x56B),
        0x53C   => array(0x56C),
        0x53D   => array(0x56D),
        0x53E   => array(0x56E),
        0x53F   => array(0x56F),
        0x540   => array(0x570),
        0x541   => array(0x571),
        0x542   => array(0x572),
        0x543   => array(0x573),
        0x544   => array(0x574),
        0x545   => array(0x575),
        0x546   => array(0x576),
        0x547   => array(0x577),
        0x548   => array(0x578),
        0x549   => array(0x579),
        0x54A   => array(0x57A),
        0x54B   => array(0x57B),
        0x54C   => array(0x57C),
        0x54D   => array(0x57D),
        0x54E   => array(0x57E),
        0x54F   => array(0x57F),
        0x550   => array(0x580),
        0x551   => array(0x581),
        0x552   => array(0x582),
        0x553   => array(0x583),
        0x554   => array(0x584),
        0x555   => array(0x585),
        0x556   => array(0x586),
        0x587   => array(0x565, 0x582),
        0x1E00  => array(0x1E01),
        0x1E02  => array(0x1E03),
        0x1E04  => array(0x1E05),
        0x1E06  => array(0x1E07),
        0x1E08  => array(0x1E09),
        0x1E0A  => array(0x1E0B),
        0x1E0C  => array(0x1E0D),
        0x1E0E  => array(0x1E0F),
        0x1E10  => array(0x1E11),
        0x1E12  => array(0x1E13),
        0x1E14  => array(0x1E15),
        0x1E16  => array(0x1E17),
        0x1E18  => array(0x1E19),
        0x1E1A  => array(0x1E1B),
        0x1E1C  => array(0x1E1D),
        0x1E1E  => array(0x1E1F),
        0x1E20  => array(0x1E21),
        0x1E22  => array(0x1E23),
        0x1E24  => array(0x1E25),
        0x1E26  => array(0x1E27),
        0x1E28  => array(0x1E29),
        0x1E2A  => array(0x1E2B),
        0x1E2C  => array(0x1E2D),
        0x1E2E  => array(0x1E2F),
        0x1E30  => array(0x1E31),
        0x1E32  => array(0x1E33),
        0x1E34  => array(0x1E35),
        0x1E36  => array(0x1E37),
        0x1E38  => array(0x1E39),
        0x1E3A  => array(0x1E3B),
        0x1E3C  => array(0x1E3D),
        0x1E3E  => array(0x1E3F),
        0x1E40  => array(0x1E41),
        0x1E42  => array(0x1E43),
        0x1E44  => array(0x1E45),
        0x1E46  => array(0x1E47),
        0x1E48  => array(0x1E49),
        0x1E4A  => array(0x1E4B),
        0x1E4C  => array(0x1E4D),
        0x1E4E  => array(0x1E4F),
        0x1E50  => array(0x1E51),
        0x1E52  => array(0x1E53),
        0x1E54  => array(0x1E55),
        0x1E56  => array(0x1E57),
        0x1E58  => array(0x1E59),
        0x1E5A  => array(0x1E5B),
        0x1E5C  => array(0x1E5D),
        0x1E5E  => array(0x1E5F),
        0x1E60  => array(0x1E61),
        0x1E62  => array(0x1E63),
        0x1E64  => array(0x1E65),
        0x1E66  => array(0x1E67),
        0x1E68  => array(0x1E69),
        0x1E6A  => array(0x1E6B),
        0x1E6C  => array(0x1E6D),
        0x1E6E  => array(0x1E6F),
        0x1E70  => array(0x1E71),
        0x1E72  => array(0x1E73),
        0x1E74  => array(0x1E75),
        0x1E76  => array(0x1E77),
        0x1E78  => array(0x1E79),
        0x1E7A  => array(0x1E7B),
        0x1E7C  => array(0x1E7D),
        0x1E7E  => array(0x1E7F),
        0x1E80  => array(0x1E81),
        0x1E82  => array(0x1E83),
        0x1E84  => array(0x1E85),
        0x1E86  => array(0x1E87),
        0x1E88  => array(0x1E89),
        0x1E8A  => array(0x1E8B),
        0x1E8C  => array(0x1E8D),
        0x1E8E  => array(0x1E8F),
        0x1E90  => array(0x1E91),
        0x1E92  => array(0x1E93),
        0x1E94  => array(0x1E95),
        0x1E96  => array(0x68, 0x331),
        0x1E97  => array(0x74, 0x308),
        0x1E98  => array(0x77, 0x30A),
        0x1E99  => array(0x79, 0x30A),
        0x1E9A  => array(0x61, 0x2BE),
        0x1E9B  => array(0x1E61),
        0x1EA0  => array(0x1EA1),
        0x1EA2  => array(0x1EA3),
        0x1EA4  => array(0x1EA5),
        0x1EA6  => array(0x1EA7),
        0x1EA8  => array(0x1EA9),
        0x1EAA  => array(0x1EAB),
        0x1EAC  => array(0x1EAD),
        0x1EAE  => array(0x1EAF),
        0x1EB0  => array(0x1EB1),
        0x1EB2  => array(0x1EB3),
        0x1EB4  => array(0x1EB5),
        0x1EB6  => array(0x1EB7),
        0x1EB8  => array(0x1EB9),
        0x1EBA  => array(0x1EBB),
        0x1EBC  => array(0x1EBD),
        0x1EBE  => array(0x1EBF),
        0x1EC0  => array(0x1EC1),
        0x1EC2  => array(0x1EC3),
        0x1EC4  => array(0x1EC5),
        0x1EC6  => array(0x1EC7),
        0x1EC8  => array(0x1EC9),
        0x1ECA  => array(0x1ECB),
        0x1ECC  => array(0x1ECD),
        0x1ECE  => array(0x1ECF),
        0x1ED0  => array(0x1ED1),
        0x1ED2  => array(0x1ED3),
        0x1ED4  => array(0x1ED5),
        0x1ED6  => array(0x1ED7),
        0x1ED8  => array(0x1ED9),
        0x1EDA  => array(0x1EDB),
        0x1EDC  => array(0x1EDD),
        0x1EDE  => array(0x1EDF),
        0x1EE0  => array(0x1EE1),
        0x1EE2  => array(0x1EE3),
        0x1EE4  => array(0x1EE5),
        0x1EE6  => array(0x1EE7),
        0x1EE8  => array(0x1EE9),
        0x1EEA  => array(0x1EEB),
        0x1EEC  => array(0x1EED),
        0x1EEE  => array(0x1EEF),
        0x1EF0  => array(0x1EF1),
        0x1EF2  => array(0x1EF3),
        0x1EF4  => array(0x1EF5),
        0x1EF6  => array(0x1EF7),
        0x1EF8  => array(0x1EF9),
        0x1F08  => array(0x1F00),
        0x1F09  => array(0x1F01),
        0x1F0A  => array(0x1F02),
        0x1F0B  => array(0x1F03),
        0x1F0C  => array(0x1F04),
        0x1F0D  => array(0x1F05),
        0x1F0E  => array(0x1F06),
        0x1F0F  => array(0x1F07),
        0x1F18  => array(0x1F10),
        0x1F19  => array(0x1F11),
        0x1F1A  => array(0x1F12),
        0x1F1B  => array(0x1F13),
        0x1F1C  => array(0x1F14),
        0x1F1D  => array(0x1F15),
        0x1F28  => array(0x1F20),
        0x1F29  => array(0x1F21),
        0x1F2A  => array(0x1F22),
        0x1F2B  => array(0x1F23),
        0x1F2C  => array(0x1F24),
        0x1F2D  => array(0x1F25),
        0x1F2E  => array(0x1F26),
        0x1F2F  => array(0x1F27),
        0x1F38  => array(0x1F30),
        0x1F39  => array(0x1F31),
        0x1F3A  => array(0x1F32),
        0x1F3B  => array(0x1F33),
        0x1F3C  => array(0x1F34),
        0x1F3D  => array(0x1F35),
        0x1F3E  => array(0x1F36),
        0x1F3F  => array(0x1F37),
        0x1F48  => array(0x1F40),
        0x1F49  => array(0x1F41),
        0x1F4A  => array(0x1F42),
        0x1F4B  => array(0x1F43),
        0x1F4C  => array(0x1F44),
        0x1F4D  => array(0x1F45),
        0x1F50  => array(0x3C5, 0x313),
        0x1F52  => array(0x3C5, 0x313, 0x300),
        0x1F54  => array(0x3C5, 0x313, 0x301),
        0x1F56  => array(0x3C5, 0x313, 0x342),
        0x1F59  => array(0x1F51),
        0x1F5B  => array(0x1F53),
        0x1F5D  => array(0x1F55),
        0x1F5F  => array(0x1F57),
        0x1F68  => array(0x1F60),
        0x1F69  => array(0x1F61),
        0x1F6A  => array(0x1F62),
        0x1F6B  => array(0x1F63),
        0x1F6C  => array(0x1F64),
        0x1F6D  => array(0x1F65),
        0x1F6E  => array(0x1F66),
        0x1F6F  => array(0x1F67),
        0x1F80  => array(0x1F00, 0x3B9),
        0x1F81  => array(0x1F01, 0x3B9),
        0x1F82  => array(0x1F02, 0x3B9),
        0x1F83  => array(0x1F03, 0x3B9),
        0x1F84  => array(0x1F04, 0x3B9),
        0x1F85  => array(0x1F05, 0x3B9),
        0x1F86  => array(0x1F06, 0x3B9),
        0x1F87  => array(0x1F07, 0x3B9),
        0x1F88  => array(0x1F00, 0x3B9),
        0x1F89  => array(0x1F01, 0x3B9),
        0x1F8A  => array(0x1F02, 0x3B9),
        0x1F8B  => array(0x1F03, 0x3B9),
        0x1F8C  => array(0x1F04, 0x3B9),
        0x1F8D  => array(0x1F05, 0x3B9),
        0x1F8E  => array(0x1F06, 0x3B9),
        0x1F8F  => array(0x1F07, 0x3B9),
        0x1F90  => array(0x1F20, 0x3B9),
        0x1F91  => array(0x1F21, 0x3B9),
        0x1F92  => array(0x1F22, 0x3B9),
        0x1F93  => array(0x1F23, 0x3B9),
        0x1F94  => array(0x1F24, 0x3B9),
        0x1F95  => array(0x1F25, 0x3B9),
        0x1F96  => array(0x1F26, 0x3B9),
        0x1F97  => array(0x1F27, 0x3B9),
        0x1F98  => array(0x1F20, 0x3B9),
        0x1F99  => array(0x1F21, 0x3B9),
        0x1F9A  => array(0x1F22, 0x3B9),
        0x1F9B  => array(0x1F23, 0x3B9),
        0x1F9C  => array(0x1F24, 0x3B9),
        0x1F9D  => array(0x1F25, 0x3B9),
        0x1F9E  => array(0x1F26, 0x3B9),
        0x1F9F  => array(0x1F27, 0x3B9),
        0x1FA0  => array(0x1F60, 0x3B9),
        0x1FA1  => array(0x1F61, 0x3B9),
        0x1FA2  => array(0x1F62, 0x3B9),
        0x1FA3  => array(0x1F63, 0x3B9),
        0x1FA4  => array(0x1F64, 0x3B9),
        0x1FA5  => array(0x1F65, 0x3B9),
        0x1FA6  => array(0x1F66, 0x3B9),
        0x1FA7  => array(0x1F67, 0x3B9),
        0x1FA8  => array(0x1F60, 0x3B9),
        0x1FA9  => array(0x1F61, 0x3B9),
        0x1FAA  => array(0x1F62, 0x3B9),
        0x1FAB  => array(0x1F63, 0x3B9),
        0x1FAC  => array(0x1F64, 0x3B9),
        0x1FAD  => array(0x1F65, 0x3B9),
        0x1FAE  => array(0x1F66, 0x3B9),
        0x1FAF  => array(0x1F67, 0x3B9),
        0x1FB2  => array(0x1F70, 0x3B9),
        0x1FB3  => array(0x3B1, 0x3B9),
        0x1FB4  => array(0x3AC, 0x3B9),
        0x1FB6  => array(0x3B1, 0x342),
        0x1FB7  => array(0x3B1, 0x342, 0x3B9),
        0x1FB8  => array(0x1FB0),
        0x1FB9  => array(0x1FB1),
        0x1FBA  => array(0x1F70),
        0x1FBB  => array(0x1F71),
        0x1FBC  => array(0x3B1, 0x3B9),
        0x1FBE  => array(0x3B9),
        0x1FC2  => array(0x1F74, 0x3B9),
        0x1FC3  => array(0x3B7, 0x3B9),
        0x1FC4  => array(0x3AE, 0x3B9),
        0x1FC6  => array(0x3B7, 0x342),
        0x1FC7  => array(0x3B7, 0x342, 0x3B9),
        0x1FC8  => array(0x1F72),
        0x1FC9  => array(0x1F73),
        0x1FCA  => array(0x1F74),
        0x1FCB  => array(0x1F75),
        0x1FCC  => array(0x3B7, 0x3B9),
        0x1FD2  => array(0x3B9, 0x308, 0x300),
        0x1FD3  => array(0x3B9, 0x308, 0x301),
        0x1FD6  => array(0x3B9, 0x342),
        0x1FD7  => array(0x3B9, 0x308, 0x342),
        0x1FD8  => array(0x1FD0),
        0x1FD9  => array(0x1FD1),
        0x1FDA  => array(0x1F76),
        0x1FDB  => array(0x1F77),
        0x1FE2  => array(0x3C5, 0x308, 0x300),
        0x1FE3  => array(0x3C5, 0x308, 0x301),
        0x1FE4  => array(0x3C1, 0x313),
        0x1FE6  => array(0x3C5, 0x342),
        0x1FE7  => array(0x3C5, 0x308, 0x342),
        0x1FE8  => array(0x1FE0),
        0x1FE9  => array(0x1FE1),
        0x1FEA  => array(0x1F7A),
        0x1FEB  => array(0x1F7B),
        0x1FEC  => array(0x1FE5),
        0x1FF2  => array(0x1F7C, 0x3B9),
        0x1FF3  => array(0x3C9, 0x3B9),
        0x1FF4  => array(0x3CE, 0x3B9),
        0x1FF6  => array(0x3C9, 0x342),
        0x1FF7  => array(0x3C9, 0x342, 0x3B9),
        0x1FF8  => array(0x1F78),
        0x1FF9  => array(0x1F79),
        0x1FFA  => array(0x1F7C),
        0x1FFB  => array(0x1F7D),
        0x1FFC  => array(0x3C9, 0x3B9),
        0x20A8  => array(0x72, 0x73),
        0x2102  => array(0x63),
        0x2103  => array(0xB0, 0x63),
        0x2107  => array(0x25B),
        0x2109  => array(0xB0, 0x66),
        0x210B  => array(0x68),
        0x210C  => array(0x68),
        0x210D  => array(0x68),
        0x2110  => array(0x69),
        0x2111  => array(0x69),
        0x2112  => array(0x6C),
        0x2115  => array(0x6E),
        0x2116  => array(0x6E, 0x6F),
        0x2119  => array(0x70),
        0x211A  => array(0x71),
        0x211B  => array(0x72),
        0x211C  => array(0x72),
        0x211D  => array(0x72),
        0x2120  => array(0x73, 0x6D),
        0x2121  => array(0x74, 0x65, 0x6C),
        0x2122  => array(0x74, 0x6D),
        0x2124  => array(0x7A),
        0x2126  => array(0x3C9),
        0x2128  => array(0x7A),
        0x212A  => array(0x6B),
        0x212B  => array(0xE5),
        0x212C  => array(0x62),
        0x212D  => array(0x63),
        0x2130  => array(0x65),
        0x2131  => array(0x66),
        0x2133  => array(0x6D),
        0x213E  => array(0x3B3),
        0x213F  => array(0x3C0),
        0x2145  => array(0x64),
        0x2160  => array(0x2170),
        0x2161  => array(0x2171),
        0x2162  => array(0x2172),
        0x2163  => array(0x2173),
        0x2164  => array(0x2174),
        0x2165  => array(0x2175),
        0x2166  => array(0x2176),
        0x2167  => array(0x2177),
        0x2168  => array(0x2178),
        0x2169  => array(0x2179),
        0x216A  => array(0x217A),
        0x216B  => array(0x217B),
        0x216C  => array(0x217C),
        0x216D  => array(0x217D),
        0x216E  => array(0x217E),
        0x216F  => array(0x217F),
        0x24B6  => array(0x24D0),
        0x24B7  => array(0x24D1),
        0x24B8  => array(0x24D2),
        0x24B9  => array(0x24D3),
        0x24BA  => array(0x24D4),
        0x24BB  => array(0x24D5),
        0x24BC  => array(0x24D6),
        0x24BD  => array(0x24D7),
        0x24BE  => array(0x24D8),
        0x24BF  => array(0x24D9),
        0x24C0  => array(0x24DA),
        0x24C1  => array(0x24DB),
        0x24C2  => array(0x24DC),
        0x24C3  => array(0x24DD),
        0x24C4  => array(0x24DE),
        0x24C5  => array(0x24DF),
        0x24C6  => array(0x24E0),
        0x24C7  => array(0x24E1),
        0x24C8  => array(0x24E2),
        0x24C9  => array(0x24E3),
        0x24CA  => array(0x24E4),
        0x24CB  => array(0x24E5),
        0x24CC  => array(0x24E6),
        0x24CD  => array(0x24E7),
        0x24CE  => array(0x24E8),
        0x24CF  => array(0x24E9),
        0x3371  => array(0x68, 0x70, 0x61),
        0x3373  => array(0x61, 0x75),
        0x3375  => array(0x6F, 0x76),
        0x3380  => array(0x70, 0x61),
        0x3381  => array(0x6E, 0x61),
        0x3382  => array(0x3BC, 0x61),
        0x3383  => array(0x6D, 0x61),
        0x3384  => array(0x6B, 0x61),
        0x3385  => array(0x6B, 0x62),
        0x3386  => array(0x6D, 0x62),
        0x3387  => array(0x67, 0x62),
        0x338A  => array(0x70, 0x66),
        0x338B  => array(0x6E, 0x66),
        0x338C  => array(0x3BC, 0x66),
        0x3390  => array(0x68, 0x7A),
        0x3391  => array(0x6B, 0x68, 0x7A),
        0x3392  => array(0x6D, 0x68, 0x7A),
        0x3393  => array(0x67, 0x68, 0x7A),
        0x3394  => array(0x74, 0x68, 0x7A),
        0x33A9  => array(0x70, 0x61),
        0x33AA  => array(0x6B, 0x70, 0x61),
        0x33AB  => array(0x6D, 0x70, 0x61),
        0x33AC  => array(0x67, 0x70, 0x61),
        0x33B4  => array(0x70, 0x76),
        0x33B5  => array(0x6E, 0x76),
        0x33B6  => array(0x3BC, 0x76),
        0x33B7  => array(0x6D, 0x76),
        0x33B8  => array(0x6B, 0x76),
        0x33B9  => array(0x6D, 0x76),
        0x33BA  => array(0x70, 0x77),
        0x33BB  => array(0x6E, 0x77),
        0x33BC  => array(0x3BC, 0x77),
        0x33BD  => array(0x6D, 0x77),
        0x33BE  => array(0x6B, 0x77),
        0x33BF  => array(0x6D, 0x77),
        0x33C0  => array(0x6B, 0x3C9),
        0x33C1  => array(0x6D, 0x3C9),
        /* 0x33C2  => array(0x61, 0x2E, 0x6D, 0x2E), */
        0x33C3  => array(0x62, 0x71),
        0x33C6  => array(0x63, 0x2215, 0x6B, 0x67),
        0x33C7  => array(0x63, 0x6F, 0x2E),
        0x33C8  => array(0x64, 0x62),
        0x33C9  => array(0x67, 0x79),
        0x33CB  => array(0x68, 0x70),
        0x33CD  => array(0x6B, 0x6B),
        0x33CE  => array(0x6B, 0x6D),
        0x33D7  => array(0x70, 0x68),
        0x33D9  => array(0x70, 0x70, 0x6D),
        0x33DA  => array(0x70, 0x72),
        0x33DC  => array(0x73, 0x76),
        0x33DD  => array(0x77, 0x62),
        0xFB00  => array(0x66, 0x66),
        0xFB01  => array(0x66, 0x69),
        0xFB02  => array(0x66, 0x6C),
        0xFB03  => array(0x66, 0x66, 0x69),
        0xFB04  => array(0x66, 0x66, 0x6C),
        0xFB05  => array(0x73, 0x74),
        0xFB06  => array(0x73, 0x74),
        0xFB13  => array(0x574, 0x576),
        0xFB14  => array(0x574, 0x565),
        0xFB15  => array(0x574, 0x56B),
        0xFB16  => array(0x57E, 0x576),
        0xFB17  => array(0x574, 0x56D),
        0xFF21  => array(0xFF41),
        0xFF22  => array(0xFF42),
        0xFF23  => array(0xFF43),
        0xFF24  => array(0xFF44),
        0xFF25  => array(0xFF45),
        0xFF26  => array(0xFF46),
        0xFF27  => array(0xFF47),
        0xFF28  => array(0xFF48),
        0xFF29  => array(0xFF49),
        0xFF2A  => array(0xFF4A),
        0xFF2B  => array(0xFF4B),
        0xFF2C  => array(0xFF4C),
        0xFF2D  => array(0xFF4D),
        0xFF2E  => array(0xFF4E),
        0xFF2F  => array(0xFF4F),
        0xFF30  => array(0xFF50),
        0xFF31  => array(0xFF51),
        0xFF32  => array(0xFF52),
        0xFF33  => array(0xFF53),
        0xFF34  => array(0xFF54),
        0xFF35  => array(0xFF55),
        0xFF36  => array(0xFF56),
        0xFF37  => array(0xFF57),
        0xFF38  => array(0xFF58),
        0xFF39  => array(0xFF59),
        0xFF3A  => array(0xFF5A),
        0x10400 => array(0x10428),
        0x10401 => array(0x10429),
        0x10402 => array(0x1042A),
        0x10403 => array(0x1042B),
        0x10404 => array(0x1042C),
        0x10405 => array(0x1042D),
        0x10406 => array(0x1042E),
        0x10407 => array(0x1042F),
        0x10408 => array(0x10430),
        0x10409 => array(0x10431),
        0x1040A => array(0x10432),
        0x1040B => array(0x10433),
        0x1040C => array(0x10434),
        0x1040D => array(0x10435),
        0x1040E => array(0x10436),
        0x1040F => array(0x10437),
        0x10410 => array(0x10438),
        0x10411 => array(0x10439),
        0x10412 => array(0x1043A),
        0x10413 => array(0x1043B),
        0x10414 => array(0x1043C),
        0x10415 => array(0x1043D),
        0x10416 => array(0x1043E),
        0x10417 => array(0x1043F),
        0x10418 => array(0x10440),
        0x10419 => array(0x10441),
        0x1041A => array(0x10442),
        0x1041B => array(0x10443),
        0x1041C => array(0x10444),
        0x1041D => array(0x10445),
        0x1041E => array(0x10446),
        0x1041F => array(0x10447),
        0x10420 => array(0x10448),
        0x10421 => array(0x10449),
        0x10422 => array(0x1044A),
        0x10423 => array(0x1044B),
        0x10424 => array(0x1044C),
        0x10425 => array(0x1044D),
        0x1D400 => array(0x61),
        0x1D401 => array(0x62),
        0x1D402 => array(0x63),
        0x1D403 => array(0x64),
        0x1D404 => array(0x65),
        0x1D405 => array(0x66),
        0x1D406 => array(0x67),
        0x1D407 => array(0x68),
        0x1D408 => array(0x69),
        0x1D409 => array(0x6A),
        0x1D40A => array(0x6B),
        0x1D40B => array(0x6C),
        0x1D40C => array(0x6D),
        0x1D40D => array(0x6E),
        0x1D40E => array(0x6F),
        0x1D40F => array(0x70),
        0x1D410 => array(0x71),
        0x1D411 => array(0x72),
        0x1D412 => array(0x73),
        0x1D413 => array(0x74),
        0x1D414 => array(0x75),
        0x1D415 => array(0x76),
        0x1D416 => array(0x77),
        0x1D417 => array(0x78),
        0x1D418 => array(0x79),
        0x1D419 => array(0x7A),
        0x1D434 => array(0x61),
        0x1D435 => array(0x62),
        0x1D436 => array(0x63),
        0x1D437 => array(0x64),
        0x1D438 => array(0x65),
        0x1D439 => array(0x66),
        0x1D43A => array(0x67),
        0x1D43B => array(0x68),
        0x1D43C => array(0x69),
        0x1D43D => array(0x6A),
        0x1D43E => array(0x6B),
        0x1D43F => array(0x6C),
        0x1D440 => array(0x6D),
        0x1D441 => array(0x6E),
        0x1D442 => array(0x6F),
        0x1D443 => array(0x70),
        0x1D444 => array(0x71),
        0x1D445 => array(0x72),
        0x1D446 => array(0x73),
        0x1D447 => array(0x74),
        0x1D448 => array(0x75),
        0x1D449 => array(0x76),
        0x1D44A => array(0x77),
        0x1D44B => array(0x78),
        0x1D44C => array(0x79),
        0x1D44D => array(0x7A),
        0x1D468 => array(0x61),
        0x1D469 => array(0x62),
        0x1D46A => array(0x63),
        0x1D46B => array(0x64),
        0x1D46C => array(0x65),
        0x1D46D => array(0x66),
        0x1D46E => array(0x67),
        0x1D46F => array(0x68),
        0x1D470 => array(0x69),
        0x1D471 => array(0x6A),
        0x1D472 => array(0x6B),
        0x1D473 => array(0x6C),
        0x1D474 => array(0x6D),
        0x1D475 => array(0x6E),
        0x1D476 => array(0x6F),
        0x1D477 => array(0x70),
        0x1D478 => array(0x71),
        0x1D479 => array(0x72),
        0x1D47A => array(0x73),
        0x1D47B => array(0x74),
        0x1D47C => array(0x75),
        0x1D47D => array(0x76),
        0x1D47E => array(0x77),
        0x1D47F => array(0x78),
        0x1D480 => array(0x79),
        0x1D481 => array(0x7A),
        0x1D49C => array(0x61),
        0x1D49E => array(0x63),
        0x1D49F => array(0x64),
        0x1D4A2 => array(0x67),
        0x1D4A5 => array(0x6A),
        0x1D4A6 => array(0x6B),
        0x1D4A9 => array(0x6E),
        0x1D4AA => array(0x6F),
        0x1D4AB => array(0x70),
        0x1D4AC => array(0x71),
        0x1D4AE => array(0x73),
        0x1D4AF => array(0x74),
        0x1D4B0 => array(0x75),
        0x1D4B1 => array(0x76),
        0x1D4B2 => array(0x77),
        0x1D4B3 => array(0x78),
        0x1D4B4 => array(0x79),
        0x1D4B5 => array(0x7A),
        0x1D4D0 => array(0x61),
        0x1D4D1 => array(0x62),
        0x1D4D2 => array(0x63),
        0x1D4D3 => array(0x64),
        0x1D4D4 => array(0x65),
        0x1D4D5 => array(0x66),
        0x1D4D6 => array(0x67),
        0x1D4D7 => array(0x68),
        0x1D4D8 => array(0x69),
        0x1D4D9 => array(0x6A),
        0x1D4DA => array(0x6B),
        0x1D4DB => array(0x6C),
        0x1D4DC => array(0x6D),
        0x1D4DD => array(0x6E),
        0x1D4DE => array(0x6F),
        0x1D4DF => array(0x70),
        0x1D4E0 => array(0x71),
        0x1D4E1 => array(0x72),
        0x1D4E2 => array(0x73),
        0x1D4E3 => array(0x74),
        0x1D4E4 => array(0x75),
        0x1D4E5 => array(0x76),
        0x1D4E6 => array(0x77),
        0x1D4E7 => array(0x78),
        0x1D4E8 => array(0x79),
        0x1D4E9 => array(0x7A),
        0x1D504 => array(0x61),
        0x1D505 => array(0x62),
        0x1D507 => array(0x64),
        0x1D508 => array(0x65),
        0x1D509 => array(0x66),
        0x1D50A => array(0x67),
        0x1D50D => array(0x6A),
        0x1D50E => array(0x6B),
        0x1D50F => array(0x6C),
        0x1D510 => array(0x6D),
        0x1D511 => array(0x6E),
        0x1D512 => array(0x6F),
        0x1D513 => array(0x70),
        0x1D514 => array(0x71),
        0x1D516 => array(0x73),
        0x1D517 => array(0x74),
        0x1D518 => array(0x75),
        0x1D519 => array(0x76),
        0x1D51A => array(0x77),
        0x1D51B => array(0x78),
        0x1D51C => array(0x79),
        0x1D538 => array(0x61),
        0x1D539 => array(0x62),
        0x1D53B => array(0x64),
        0x1D53C => array(0x65),
        0x1D53D => array(0x66),
        0x1D53E => array(0x67),
        0x1D540 => array(0x69),
        0x1D541 => array(0x6A),
        0x1D542 => array(0x6B),
        0x1D543 => array(0x6C),
        0x1D544 => array(0x6D),
        0x1D546 => array(0x6F),
        0x1D54A => array(0x73),
        0x1D54B => array(0x74),
        0x1D54C => array(0x75),
        0x1D54D => array(0x76),
        0x1D54E => array(0x77),
        0x1D54F => array(0x78),
        0x1D550 => array(0x79),
        0x1D56C => array(0x61),
        0x1D56D => array(0x62),
        0x1D56E => array(0x63),
        0x1D56F => array(0x64),
        0x1D570 => array(0x65),
        0x1D571 => array(0x66),
        0x1D572 => array(0x67),
        0x1D573 => array(0x68),
        0x1D574 => array(0x69),
        0x1D575 => array(0x6A),
        0x1D576 => array(0x6B),
        0x1D577 => array(0x6C),
        0x1D578 => array(0x6D),
        0x1D579 => array(0x6E),
        0x1D57A => array(0x6F),
        0x1D57B => array(0x70),
        0x1D57C => array(0x71),
        0x1D57D => array(0x72),
        0x1D57E => array(0x73),
        0x1D57F => array(0x74),
        0x1D580 => array(0x75),
        0x1D581 => array(0x76),
        0x1D582 => array(0x77),
        0x1D583 => array(0x78),
        0x1D584 => array(0x79),
        0x1D585 => array(0x7A),
        0x1D5A0 => array(0x61),
        0x1D5A1 => array(0x62),
        0x1D5A2 => array(0x63),
        0x1D5A3 => array(0x64),
        0x1D5A4 => array(0x65),
        0x1D5A5 => array(0x66),
        0x1D5A6 => array(0x67),
        0x1D5A7 => array(0x68),
        0x1D5A8 => array(0x69),
        0x1D5A9 => array(0x6A),
        0x1D5AA => array(0x6B),
        0x1D5AB => array(0x6C),
        0x1D5AC => array(0x6D),
        0x1D5AD => array(0x6E),
        0x1D5AE => array(0x6F),
        0x1D5AF => array(0x70),
        0x1D5B0 => array(0x71),
        0x1D5B1 => array(0x72),
        0x1D5B2 => array(0x73),
        0x1D5B3 => array(0x74),
        0x1D5B4 => array(0x75),
        0x1D5B5 => array(0x76),
        0x1D5B6 => array(0x77),
        0x1D5B7 => array(0x78),
        0x1D5B8 => array(0x79),
        0x1D5B9 => array(0x7A),
        0x1D5D4 => array(0x61),
        0x1D5D5 => array(0x62),
        0x1D5D6 => array(0x63),
        0x1D5D7 => array(0x64),
        0x1D5D8 => array(0x65),
        0x1D5D9 => array(0x66),
        0x1D5DA => array(0x67),
        0x1D5DB => array(0x68),
        0x1D5DC => array(0x69),
        0x1D5DD => array(0x6A),
        0x1D5DE => array(0x6B),
        0x1D5DF => array(0x6C),
        0x1D5E0 => array(0x6D),
        0x1D5E1 => array(0x6E),
        0x1D5E2 => array(0x6F),
        0x1D5E3 => array(0x70),
        0x1D5E4 => array(0x71),
        0x1D5E5 => array(0x72),
        0x1D5E6 => array(0x73),
        0x1D5E7 => array(0x74),
        0x1D5E8 => array(0x75),
        0x1D5E9 => array(0x76),
        0x1D5EA => array(0x77),
        0x1D5EB => array(0x78),
        0x1D5EC => array(0x79),
        0x1D5ED => array(0x7A),
        0x1D608 => array(0x61),
        0x1D609 => array(0x62),
        0x1D60A => array(0x63),
        0x1D60B => array(0x64),
        0x1D60C => array(0x65),
        0x1D60D => array(0x66),
        0x1D60E => array(0x67),
        0x1D60F => array(0x68),
        0x1D610 => array(0x69),
        0x1D611 => array(0x6A),
        0x1D612 => array(0x6B),
        0x1D613 => array(0x6C),
        0x1D614 => array(0x6D),
        0x1D615 => array(0x6E),
        0x1D616 => array(0x6F),
        0x1D617 => array(0x70),
        0x1D618 => array(0x71),
        0x1D619 => array(0x72),
        0x1D61A => array(0x73),
        0x1D61B => array(0x74),
        0x1D61C => array(0x75),
        0x1D61D => array(0x76),
        0x1D61E => array(0x77),
        0x1D61F => array(0x78),
        0x1D620 => array(0x79),
        0x1D621 => array(0x7A),
        0x1D63C => array(0x61),
        0x1D63D => array(0x62),
        0x1D63E => array(0x63),
        0x1D63F => array(0x64),
        0x1D640 => array(0x65),
        0x1D641 => array(0x66),
        0x1D642 => array(0x67),
        0x1D643 => array(0x68),
        0x1D644 => array(0x69),
        0x1D645 => array(0x6A),
        0x1D646 => array(0x6B),
        0x1D647 => array(0x6C),
        0x1D648 => array(0x6D),
        0x1D649 => array(0x6E),
        0x1D64A => array(0x6F),
        0x1D64B => array(0x70),
        0x1D64C => array(0x71),
        0x1D64D => array(0x72),
        0x1D64E => array(0x73),
        0x1D64F => array(0x74),
        0x1D650 => array(0x75),
        0x1D651 => array(0x76),
        0x1D652 => array(0x77),
        0x1D653 => array(0x78),
        0x1D654 => array(0x79),
        0x1D655 => array(0x7A),
        0x1D670 => array(0x61),
        0x1D671 => array(0x62),
        0x1D672 => array(0x63),
        0x1D673 => array(0x64),
        0x1D674 => array(0x65),
        0x1D675 => array(0x66),
        0x1D676 => array(0x67),
        0x1D677 => array(0x68),
        0x1D678 => array(0x69),
        0x1D679 => array(0x6A),
        0x1D67A => array(0x6B),
        0x1D67B => array(0x6C),
        0x1D67C => array(0x6D),
        0x1D67D => array(0x6E),
        0x1D67E => array(0x6F),
        0x1D67F => array(0x70),
        0x1D680 => array(0x71),
        0x1D681 => array(0x72),
        0x1D682 => array(0x73),
        0x1D683 => array(0x74),
        0x1D684 => array(0x75),
        0x1D685 => array(0x76),
        0x1D686 => array(0x77),
        0x1D687 => array(0x78),
        0x1D688 => array(0x79),
        0x1D689 => array(0x7A),
        0x1D6A8 => array(0x3B1),
        0x1D6A9 => array(0x3B2),
        0x1D6AA => array(0x3B3),
        0x1D6AB => array(0x3B4),
        0x1D6AC => array(0x3B5),
        0x1D6AD => array(0x3B6),
        0x1D6AE => array(0x3B7),
        0x1D6AF => array(0x3B8),
        0x1D6B0 => array(0x3B9),
        0x1D6B1 => array(0x3BA),
        0x1D6B2 => array(0x3BB),
        0x1D6B3 => array(0x3BC),
        0x1D6B4 => array(0x3BD),
        0x1D6B5 => array(0x3BE),
        0x1D6B6 => array(0x3BF),
        0x1D6B7 => array(0x3C0),
        0x1D6B8 => array(0x3C1),
        0x1D6B9 => array(0x3B8),
        0x1D6BA => array(0x3C3),
        0x1D6BB => array(0x3C4),
        0x1D6BC => array(0x3C5),
        0x1D6BD => array(0x3C6),
        0x1D6BE => array(0x3C7),
        0x1D6BF => array(0x3C8),
        0x1D6C0 => array(0x3C9),
        0x1D6D3 => array(0x3C3),
        0x1D6E2 => array(0x3B1),
        0x1D6E3 => array(0x3B2),
        0x1D6E4 => array(0x3B3),
        0x1D6E5 => array(0x3B4),
        0x1D6E6 => array(0x3B5),
        0x1D6E7 => array(0x3B6),
        0x1D6E8 => array(0x3B7),
        0x1D6E9 => array(0x3B8),
        0x1D6EA => array(0x3B9),
        0x1D6EB => array(0x3BA),
        0x1D6EC => array(0x3BB),
        0x1D6ED => array(0x3BC),
        0x1D6EE => array(0x3BD),
        0x1D6EF => array(0x3BE),
        0x1D6F0 => array(0x3BF),
        0x1D6F1 => array(0x3C0),
        0x1D6F2 => array(0x3C1),
        0x1D6F3 => array(0x3B8),
        0x1D6F4 => array(0x3C3),
        0x1D6F5 => array(0x3C4),
        0x1D6F6 => array(0x3C5),
        0x1D6F7 => array(0x3C6),
        0x1D6F8 => array(0x3C7),
        0x1D6F9 => array(0x3C8),
        0x1D6FA => array(0x3C9),
        0x1D70D => array(0x3C3),
        0x1D71C => array(0x3B1),
        0x1D71D => array(0x3B2),
        0x1D71E => array(0x3B3),
        0x1D71F => array(0x3B4),
        0x1D720 => array(0x3B5),
        0x1D721 => array(0x3B6),
        0x1D722 => array(0x3B7),
        0x1D723 => array(0x3B8),
        0x1D724 => array(0x3B9),
        0x1D725 => array(0x3BA),
        0x1D726 => array(0x3BB),
        0x1D727 => array(0x3BC),
        0x1D728 => array(0x3BD),
        0x1D729 => array(0x3BE),
        0x1D72A => array(0x3BF),
        0x1D72B => array(0x3C0),
        0x1D72C => array(0x3C1),
        0x1D72D => array(0x3B8),
        0x1D72E => array(0x3C3),
        0x1D72F => array(0x3C4),
        0x1D730 => array(0x3C5),
        0x1D731 => array(0x3C6),
        0x1D732 => array(0x3C7),
        0x1D733 => array(0x3C8),
        0x1D734 => array(0x3C9),
        0x1D747 => array(0x3C3),
        0x1D756 => array(0x3B1),
        0x1D757 => array(0x3B2),
        0x1D758 => array(0x3B3),
        0x1D759 => array(0x3B4),
        0x1D75A => array(0x3B5),
        0x1D75B => array(0x3B6),
        0x1D75C => array(0x3B7),
        0x1D75D => array(0x3B8),
        0x1D75E => array(0x3B9),
        0x1D75F => array(0x3BA),
        0x1D760 => array(0x3BB),
        0x1D761 => array(0x3BC),
        0x1D762 => array(0x3BD),
        0x1D763 => array(0x3BE),
        0x1D764 => array(0x3BF),
        0x1D765 => array(0x3C0),
        0x1D766 => array(0x3C1),
        0x1D767 => array(0x3B8),
        0x1D768 => array(0x3C3),
        0x1D769 => array(0x3C4),
        0x1D76A => array(0x3C5),
        0x1D76B => array(0x3C6),
        0x1D76C => array(0x3C7),
        0x1D76D => array(0x3C8),
        0x1D76E => array(0x3C9),
        0x1D781 => array(0x3C3),
        0x1D790 => array(0x3B1),
        0x1D791 => array(0x3B2),
        0x1D792 => array(0x3B3),
        0x1D793 => array(0x3B4),
        0x1D794 => array(0x3B5),
        0x1D795 => array(0x3B6),
        0x1D796 => array(0x3B7),
        0x1D797 => array(0x3B8),
        0x1D798 => array(0x3B9),
        0x1D799 => array(0x3BA),
        0x1D79A => array(0x3BB),
        0x1D79B => array(0x3BC),
        0x1D79C => array(0x3BD),
        0x1D79D => array(0x3BE),
        0x1D79E => array(0x3BF),
        0x1D79F => array(0x3C0),
        0x1D7A0 => array(0x3C1),
        0x1D7A1 => array(0x3B8),
        0x1D7A2 => array(0x3C3),
        0x1D7A3 => array(0x3C4),
        0x1D7A4 => array(0x3C5),
        0x1D7A5 => array(0x3C6),
        0x1D7A6 => array(0x3C7),
        0x1D7A7 => array(0x3C8),
        0x1D7A8 => array(0x3C9),
        0x1D7BB => array(0x3C3),
        0x3F9   => array(0x3C3),
        0x1D2C  => array(0x61),
        0x1D2D  => array(0xE6),
        0x1D2E  => array(0x62),
        0x1D30  => array(0x64),
        0x1D31  => array(0x65),
        0x1D32  => array(0x1DD),
        0x1D33  => array(0x67),
        0x1D34  => array(0x68),
        0x1D35  => array(0x69),
        0x1D36  => array(0x6A),
        0x1D37  => array(0x6B),
        0x1D38  => array(0x6C),
        0x1D39  => array(0x6D),
        0x1D3A  => array(0x6E),
        0x1D3C  => array(0x6F),
        0x1D3D  => array(0x223),
        0x1D3E  => array(0x70),
        0x1D3F  => array(0x72),
        0x1D40  => array(0x74),
        0x1D41  => array(0x75),
        0x1D42  => array(0x77),
        0x213B  => array(0x66, 0x61, 0x78),
        0x3250  => array(0x70, 0x74, 0x65),
        0x32CC  => array(0x68, 0x67),
        0x32CE  => array(0x65, 0x76),
        0x32CF  => array(0x6C, 0x74, 0x64),
        0x337A  => array(0x69, 0x75),
        0x33DE  => array(0x76, 0x2215, 0x6D),
        0x33DF  => array(0x61, 0x2215, 0x6D)
    );

    /**
     * Normalization Combining Classes; Code Points not listed
     * got Combining Class 0.
     *
     * @static
     * @var array
     * @access private
     */
    private static $_np_norm_combcls = array(
        0x334   => 1,
        0x335   => 1,
        0x336   => 1,
        0x337   => 1,
        0x338   => 1,
        0x93C   => 7,
        0x9BC   => 7,
        0xA3C   => 7,
        0xABC   => 7,
        0xB3C   => 7,
        0xCBC   => 7,
        0x1037  => 7,
        0x3099  => 8,
        0x309A  => 8,
        0x94D   => 9,
        0x9CD   => 9,
        0xA4D   => 9,
        0xACD   => 9,
        0xB4D   => 9,
        0xBCD   => 9,
        0xC4D   => 9,
        0xCCD   => 9,
        0xD4D   => 9,
        0xDCA   => 9,
        0xE3A   => 9,
        0xF84   => 9,
        0x1039  => 9,
        0x1714  => 9,
        0x1734  => 9,
        0x17D2  => 9,
        0x5B0   => 10,
        0x5B1   => 11,
        0x5B2   => 12,
        0x5B3   => 13,
        0x5B4   => 14,
        0x5B5   => 15,
        0x5B6   => 16,
        0x5B7   => 17,
        0x5B8   => 18,
        0x5B9   => 19,
        0x5BB   => 20,
        0x5Bc   => 21,
        0x5BD   => 22,
        0x5BF   => 23,
        0x5C1   => 24,
        0x5C2   => 25,
        0xFB1E  => 26,
        0x64B   => 27,
        0x64C   => 28,
        0x64D   => 29,
        0x64E   => 30,
        0x64F   => 31,
        0x650   => 32,
        0x651   => 33,
        0x652   => 34,
        0x670   => 35,
        0x711   => 36,
        0xC55   => 84,
        0xC56   => 91,
        0xE38   => 103,
        0xE39   => 103,
        0xE48   => 107,
        0xE49   => 107,
        0xE4A   => 107,
        0xE4B   => 107,
        0xEB8   => 118,
        0xEB9   => 118,
        0xEC8   => 122,
        0xEC9   => 122,
        0xECA   => 122,
        0xECB   => 122,
        0xF71   => 129,
        0xF72   => 130,
        0xF7A   => 130,
        0xF7B   => 130,
        0xF7C   => 130,
        0xF7D   => 130,
        0xF80   => 130,
        0xF74   => 132,
        0x321   => 202,
        0x322   => 202,
        0x327   => 202,
        0x328   => 202,
        0x31B   => 216,
        0xF39   => 216,
        0x1D165 => 216,
        0x1D166 => 216,
        0x1D16E => 216,
        0x1D16F => 216,
        0x1D170 => 216,
        0x1D171 => 216,
        0x1D172 => 216,
        0x302A  => 218,
        0x316   => 220,
        0x317   => 220,
        0x318   => 220,
        0x319   => 220,
        0x31C   => 220,
        0x31D   => 220,
        0x31E   => 220,
        0x31F   => 220,
        0x320   => 220,
        0x323   => 220,
        0x324   => 220,
        0x325   => 220,
        0x326   => 220,
        0x329   => 220,
        0x32A   => 220,
        0x32B   => 220,
        0x32C   => 220,
        0x32D   => 220,
        0x32E   => 220,
        0x32F   => 220,
        0x330   => 220,
        0x331   => 220,
        0x332   => 220,
        0x333   => 220,
        0x339   => 220,
        0x33A   => 220,
        0x33B   => 220,
        0x33C   => 220,
        0x347   => 220,
        0x348   => 220,
        0x349   => 220,
        0x34D   => 220,
        0x34E   => 220,
        0x353   => 220,
        0x354   => 220,
        0x355   => 220,
        0x356   => 220,
        0x591   => 220,
        0x596   => 220,
        0x59B   => 220,
        0x5A3   => 220,
        0x5A4   => 220,
        0x5A5   => 220,
        0x5A6   => 220,
        0x5A7   => 220,
        0x5AA   => 220,
        0x655   => 220,
        0x656   => 220,
        0x6E3   => 220,
        0x6EA   => 220,
        0x6ED   => 220,
        0x731   => 220,
        0x734   => 220,
        0x737   => 220,
        0x738   => 220,
        0x739   => 220,
        0x73B   => 220,
        0x73C   => 220,
        0x73E   => 220,
        0x742   => 220,
        0x744   => 220,
        0x746   => 220,
        0x748   => 220,
        0x952   => 220,
        0xF18   => 220,
        0xF19   => 220,
        0xF35   => 220,
        0xF37   => 220,
        0xFC6   => 220,
        0x193B  => 220,
        0x20E8  => 220,
        0x1D17B => 220,
        0x1D17C => 220,
        0x1D17D => 220,
        0x1D17E => 220,
        0x1D17F => 220,
        0x1D180 => 220,
        0x1D181 => 220,
        0x1D182 => 220,
        0x1D18A => 220,
        0x1D18B => 220,
        0x59A   => 222,
        0x5AD   => 222,
        0x1929  => 222,
        0x302D  => 222,
        0x302E  => 224,
        0x302F  => 224,
        0x1D16D => 226,
        0x5AE   => 228,
        0x18A9  => 228,
        0x302B  => 228,
        0x300   => 230,
        0x301   => 230,
        0x302   => 230,
        0x303   => 230,
        0x304   => 230,
        0x305   => 230,
        0x306   => 230,
        0x307   => 230,
        0x308   => 230,
        0x309   => 230,
        0x30A   => 230,
        0x30B   => 230,
        0x30C   => 230,
        0x30D   => 230,
        0x30E   => 230,
        0x30F   => 230,
        0x310   => 230,
        0x311   => 230,
        0x312   => 230,
        0x313   => 230,
        0x314   => 230,
        0x33D   => 230,
        0x33E   => 230,
        0x33F   => 230,
        0x340   => 230,
        0x341   => 230,
        0x342   => 230,
        0x343   => 230,
        0x344   => 230,
        0x346   => 230,
        0x34A   => 230,
        0x34B   => 230,
        0x34C   => 230,
        0x350   => 230,
        0x351   => 230,
        0x352   => 230,
        0x357   => 230,
        0x363   => 230,
        0x364   => 230,
        0x365   => 230,
        0x366   => 230,
        0x367   => 230,
        0x368   => 230,
        0x369   => 230,
        0x36A   => 230,
        0x36B   => 230,
        0x36C   => 230,
        0x36D   => 230,
        0x36E   => 230,
        0x36F   => 230,
        0x483   => 230,
        0x484   => 230,
        0x485   => 230,
        0x486   => 230,
        0x592   => 230,
        0x593   => 230,
        0x594   => 230,
        0x595   => 230,
        0x597   => 230,
        0x598   => 230,
        0x599   => 230,
        0x59C   => 230,
        0x59D   => 230,
        0x59E   => 230,
        0x59F   => 230,
        0x5A0   => 230,
        0x5A1   => 230,
        0x5A8   => 230,
        0x5A9   => 230,
        0x5AB   => 230,
        0x5AC   => 230,
        0x5AF   => 230,
        0x5C4   => 230,
        0x610   => 230,
        0x611   => 230,
        0x612   => 230,
        0x613   => 230,
        0x614   => 230,
        0x615   => 230,
        0x653   => 230,
        0x654   => 230,
        0x657   => 230,
        0x658   => 230,
        0x6D6   => 230,
        0x6D7   => 230,
        0x6D8   => 230,
        0x6D9   => 230,
        0x6DA   => 230,
        0x6DB   => 230,
        0x6DC   => 230,
        0x6DF   => 230,
        0x6E0   => 230,
        0x6E1   => 230,
        0x6E2   => 230,
        0x6E4   => 230,
        0x6E7   => 230,
        0x6E8   => 230,
        0x6EB   => 230,
        0x6EC   => 230,
        0x730   => 230,
        0x732   => 230,
        0x733   => 230,
        0x735   => 230,
        0x736   => 230,
        0x73A   => 230,
        0x73D   => 230,
        0x73F   => 230,
        0x740   => 230,
        0x741   => 230,
        0x743   => 230,
        0x745   => 230,
        0x747   => 230,
        0x749   => 230,
        0x74A   => 230,
        0x951   => 230,
        0x953   => 230,
        0x954   => 230,
        0xF82   => 230,
        0xF83   => 230,
        0xF86   => 230,
        0xF87   => 230,
        0x170D  => 230,
        0x193A  => 230,
        0x20D0  => 230,
        0x20D1  => 230,
        0x20D4  => 230,
        0x20D5  => 230,
        0x20D6  => 230,
        0x20D7  => 230,
        0x20DB  => 230,
        0x20DC  => 230,
        0x20E1  => 230,
        0x20E7  => 230,
        0x20E9  => 230,
        0xFE20  => 230,
        0xFE21  => 230,
        0xFE22  => 230,
        0xFE23  => 230,
        0x1D185 => 230,
        0x1D186 => 230,
        0x1D187 => 230,
        0x1D189 => 230,
        0x1D188 => 230,
        0x1D1AA => 230,
        0x1D1AB => 230,
        0x1D1AC => 230,
        0x1D1AD => 230,
        0x315   => 232,
        0x31A   => 232,
        0x302C  => 232,
        0x35F   => 233,
        0x362   => 233,
        0x35D   => 234,
        0x35E   => 234,
        0x360   => 234,
        0x361   => 234,
        0x345   => 240
    );
    // }}}

    // {{{ properties
    /**
     * @var string
     * @access private
     */
    private $_punycode_prefix = 'xn--';

    /**
     * @access private
     */
    private $_invalid_ucs = 0x80000000;

    /**
     * @access private
     */
    private $_max_ucs = 0x10FFFF;

    /**
     * @var int
     * @access private
     */
    private $_base = 36;

    /**
     * @var int
     * @access private
     */
    private $_tmin = 1;

    /**
     * @var int
     * @access private
     */
    private $_tmax = 26;

    /**
     * @var int
     * @access private
     */
    private $_skew = 38;

    /**
     * @var int
     * @access private
     */
    private $_damp = 700;

    /**
     * @var int
     * @access private
     */
    private $_initial_bias = 72;

    /**
     * @var int
     * @access private
     */
    private $_initial_n = 0x80;

    /**
     * @var int
     * @access private
     */
    private $_slast;

    /**
     * @access private
     */
    private $_sbase = 0xAC00;

    /**
     * @access private
     */
    private $_lbase = 0x1100;

    /**
     * @access private
     */
    private $_vbase = 0x1161;

    /**
     * @access private
     */
    private $_tbase = 0x11a7;

    /**
     * @var int
     * @access private
     */
    private $_lcount = 19;

    /**
     * @var int
     * @access private
     */
    private $_vcount = 21;

    /**
     * @var int
     * @access private
     */
    private $_tcount = 28;

    /**
     * vcount * tcount
     *
     * @var int
     * @access private
     */
    private $_ncount = 588;

    /**
     * lcount * tcount * vcount
     *
     * @var int
     * @access private
     */
    private $_scount = 11172;

    /**
     * Default encoding for encode()'s input and decode()'s output is UTF-8;
     * Other possible encodings are ucs4_string and ucs4_array
     * See {@link setParams()} for how to select these
     *
     * @var bool
     * @access private
     */
    private $_api_encoding = 'utf8';

    /**
     * Overlong UTF-8 encodings are forbidden
     *
     * @var bool
     * @access private
     */
    private $_allow_overlong = false;

    /**
     * Behave strict or not
     *
     * @var bool
     * @access private
     */
    private $_strict_mode = false;

    /**
     * IDNA-version to use
     *
     * Values are "2003" and "2008".
     * Defaults to "2003", since that was the original version and for
     * compatibility with previous versions of this library.
     * If you need to encode "new" characters like the German "Eszett",
     * please switch to 2008 first before encoding.
     *
     * @var bool
     * @access private
     */
    private $_version = '2003';

    /**
     * Cached value indicating whether or not mbstring function overloading is
     * on for strlen
     *
     * This is cached for optimal performance.
     *
     * @var boolean
     * @see Net_IDNA2::_byteLength()
     */
    private static $_mb_string_overload = null;
    // }}}


    // {{{ constructor
    /**
     * Constructor
     *
     * @param array $options Options to initialise the object with
     *
     * @access public
     * @see    setParams()
     */
    public function __construct($options = null)
    {
        $this->_slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;

        if (is_array($options)) {
            $this->setParams($options);
        }

        // populate mbstring overloading cache if not set
        if (self::$_mb_string_overload === null) {
            self::$_mb_string_overload = (extension_loaded('mbstring')
                && (ini_get('mbstring.func_overload') & 0x02) === 0x02);
        }
    }
    // }}}


    /**
     * Sets a new option value. Available options and values:
     *
     * [utf8 -     Use either UTF-8 or ISO-8859-1 as input (true for UTF-8, false
     *             otherwise); The output is always UTF-8]
     * [overlong - Unicode does not allow unnecessarily long encodings of chars,
     *             to allow this, set this parameter to true, else to false;
     *             default is false.]
     * [strict -   true: strict mode, good for registration purposes - Causes errors
     *             on failures; false: loose mode, ideal for "wildlife" applications
     *             by silently ignoring errors and returning the original input instead]
     *
     * @param mixed  $option Parameter to set (string: single parameter; array of Parameter => Value pairs)
     * @param string $value  Value to use (if parameter 1 is a string)
     *
     * @return boolean       true on success, false otherwise
     * @access public
     */
    public function setParams($option, $value = false)
    {
        if (!is_array($option)) {
            $option = array($option => $value);
        }

        foreach ($option as $k => $v) {
            switch ($k) {
            case 'encoding':
                switch ($v) {
                case 'utf8':
                case 'ucs4_string':
                case 'ucs4_array':
                    $this->_api_encoding = $v;
                    break;

                default:
                    throw new InvalidArgumentException('Set Parameter: Unknown parameter '.$v.' for option '.$k);
                }

                break;

            case 'overlong':
                $this->_allow_overlong = ($v) ? true : false;
                break;

            case 'strict':
                $this->_strict_mode = ($v) ? true : false;
                break;

            case 'version':
                if (in_array($v, array('2003', '2008'))) {
                    $this->_version = $v;
                } else {
                    throw new InvalidArgumentException('Set Parameter: Invalid parameter '.$v.' for option '.$k);
                }
                break;

            default:
                return false;
            }
        }

        return true;
    }

    /**
     * Encode a given UTF-8 domain name.
     *
     * @param string $decoded           Domain name (UTF-8 or UCS-4)
     * @param string $one_time_encoding Desired input encoding, see {@link set_parameter}
     *                                  If not given will use default-encoding
     *
     * @return string Encoded Domain name (ACE string)
     * @return mixed  processed string
     * @throws Exception
     * @access public
     */
    public function encode($decoded, $one_time_encoding = false)
    {
        // Forcing conversion of input to UCS4 array
        // If one time encoding is given, use this, else the objects property
        switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
        case 'utf8':
            $decoded = $this->_utf8_to_ucs4($decoded);
            break;
        case 'ucs4_string':
            $decoded = $this->_ucs4_string_to_ucs4($decoded);
        case 'ucs4_array': // No break; before this line. Catch case, but do nothing
            break;
        default:
            throw new InvalidArgumentException('Unsupported input format');
        }

        // No input, no output, what else did you expect?
        if (empty($decoded)) return '';

        // Anchors for iteration
        $last_begin = 0;
        // Output string
        $output = '';

        foreach ($decoded as $k => $v) {
            // Make sure to use just the plain dot
            switch($v) {
            case 0x3002:
            case 0xFF0E:
            case 0xFF61:
                $decoded[$k] = 0x2E;
                // It's right, no break here
                // The codepoints above have to be converted to dots anyway

            // Stumbling across an anchoring character
            case 0x2E:
            case 0x2F:
            case 0x3A:
            case 0x3F:
            case 0x40:
                // Neither email addresses nor URLs allowed in strict mode
                if ($this->_strict_mode) {
                    throw new InvalidArgumentException('Neither email addresses nor URLs are allowed in strict mode.');
                }
                // Skip first char
                if ($k) {
                    $encoded = '';
                    $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k)-$last_begin)));
                    if ($encoded) {
                        $output .= $encoded;
                    } else {
                        $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k)-$last_begin)));
                    }
                    $output .= chr($decoded[$k]);
                }
                $last_begin = $k + 1;
            }
        }
        // Catch the rest of the string
        if ($last_begin) {
            $inp_len = sizeof($decoded);
            $encoded = '';
            $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
            if ($encoded) {
                $output .= $encoded;
            } else {
                $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len)-$last_begin)));
            }
            return $output;
        }

        if ($output = $this->_encode($decoded)) {
            return $output;
        }

        return $this->_ucs4_to_utf8($decoded);
    }

    /**
     * Decode a given ACE domain name.
     *
     * @param string $input             Domain name (ACE string)
     * @param string $one_time_encoding Desired output encoding, see {@link set_parameter}
     *
     * @return string                   Decoded Domain name (UTF-8 or UCS-4)
     * @throws Exception
     * @access public
     */
    public function decode($input, $one_time_encoding = false)
    {
        // Optionally set
        if ($one_time_encoding) {
            switch ($one_time_encoding) {
            case 'utf8':
            case 'ucs4_string':
            case 'ucs4_array':
                break;
            default:
                throw new InvalidArgumentException('Unknown encoding '.$one_time_encoding);
            }
        }
        // Make sure to drop any newline characters around
        $input = trim($input);

        // Negotiate input and try to determine, whether it is a plain string,
        // an email address or something like a complete URL
        if (strpos($input, '@')) { // Maybe it is an email address
            // No no in strict mode
            if ($this->_strict_mode) {
                throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode');
            }
            list($email_pref, $input) = explode('@', $input, 2);
            $arr = explode('.', $input);
            foreach ($arr as $k => $v) {
                $conv = $this->_decode($v);
                if ($conv) $arr[$k] = $conv;
            }
            $return = $email_pref . '@' . join('.', $arr);
        } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
            // No no in strict mode
            if ($this->_strict_mode) {
                throw new InvalidArgumentException('Only simple domain name parts can be handled in strict mode');
            }

            $parsed = parse_url($input);
            if (isset($parsed['host'])) {
                $arr = explode('.', $parsed['host']);
                foreach ($arr as $k => $v) {
                    $conv = $this->_decode($v);
                    if ($conv) $arr[$k] = $conv;
                }
                $parsed['host'] = join('.', $arr);
                if (isset($parsed['scheme'])) {
                    $parsed['scheme'] .= (strtolower($parsed['scheme']) == 'mailto') ? ':' : '://';
                }
                $return = $this->_unparse_url($parsed);
            } else { // parse_url seems to have failed, try without it
                $arr = explode('.', $input);
                foreach ($arr as $k => $v) {
                    $conv = $this->_decode($v);
                    if ($conv) $arr[$k] = $conv;
                }
                $return = join('.', $arr);
            }
        } else { // Otherwise we consider it being a pure domain name string
            $return = $this->_decode($input);
        }
        // The output is UTF-8 by default, other output formats need conversion here
        // If one time encoding is given, use this, else the objects property
        switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
        case 'utf8':
            return $return;
            break;
        case 'ucs4_string':
            return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));
            break;
        case 'ucs4_array':
            return $this->_utf8_to_ucs4($return);
            break;
        default:
            throw new InvalidArgumentException('Unsupported output format');
        }
    }


    // {{{ private
    /**
     * Opposite function to parse_url()
     *
     * Inspired by code from comments of php.net-documentation for parse_url()
     *
     * @param array $parts_arr parts (strings) as returned by parse_url()
     *
     * @return string
     * @access private
     */
    private function _unparse_url($parts_arr)
    {
        if (!empty($parts_arr['scheme'])) {
            $ret_url = $parts_arr['scheme'];
        }
        if (!empty($parts_arr['user'])) {
            $ret_url .= $parts_arr['user'];
            if (!empty($parts_arr['pass'])) {
                $ret_url .= ':' . $parts_arr['pass'];
            }
            $ret_url .= '@';
        }
        $ret_url .= $parts_arr['host'];
        if (!empty($parts_arr['port'])) {
            $ret_url .= ':' . $parts_arr['port'];
        }
        $ret_url .= $parts_arr['path'];
        if (!empty($parts_arr['query'])) {
            $ret_url .= '?' . $parts_arr['query'];
        }
        if (!empty($parts_arr['fragment'])) {
            $ret_url .= '#' . $parts_arr['fragment'];
        }
        return $ret_url;
    }

    /**
     * The actual encoding algorithm.
     *
     * @param string $decoded Decoded string which should be encoded
     *
     * @return string         Encoded string
     * @throws Exception
     * @access private
     */
    private function _encode($decoded)
    {
        // We cannot encode a domain name containing the Punycode prefix
        $extract = self::_byteLength($this->_punycode_prefix);
        $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
        $check_deco = array_slice($decoded, 0, $extract);

        if ($check_pref == $check_deco) {
            throw new InvalidArgumentException('This is already a punycode string');
        }

        // We will not try to encode strings consisting of basic code points only
        $encodable = false;
        foreach ($decoded as $k => $v) {
            if ($v > 0x7a) {
                $encodable = true;
                break;
            }
        }
        if (!$encodable) {
            if ($this->_strict_mode) {
                throw new InvalidArgumentException('The given string does not contain encodable chars');
            }

            return false;
        }

        // Do NAMEPREP
        $decoded = $this->_nameprep($decoded);

        $deco_len = count($decoded);

        // Empty array
        if (!$deco_len) {
            return false;
        }

        // How many chars have been consumed
        $codecount = 0;

        // Start with the prefix; copy it to output
        $encoded = $this->_punycode_prefix;

        $encoded = '';
        // Copy all basic code points to output
        for ($i = 0; $i < $deco_len; ++$i) {
            $test = $decoded[$i];
            // Will match [0-9a-zA-Z-]
            if ((0x2F < $test && $test < 0x40)
                || (0x40 < $test && $test < 0x5B)
                || (0x60 < $test && $test <= 0x7B)
                || (0x2D == $test)
            ) {
                $encoded .= chr($decoded[$i]);
                $codecount++;
            }
        }

        // All codepoints were basic ones
        if ($codecount == $deco_len) {
            return $encoded;
        }

        // Start with the prefix; copy it to output
        $encoded = $this->_punycode_prefix . $encoded;

        // If we have basic code points in output, add an hyphen to the end
        if ($codecount) {
            $encoded .= '-';
        }

        // Now find and encode all non-basic code points
        $is_first  = true;
        $cur_code  = $this->_initial_n;
        $bias      = $this->_initial_bias;
        $delta     = 0;

        while ($codecount < $deco_len) {
            // Find the smallest code point >= the current code point and
            // remember the last ouccrence of it in the input
            for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
                if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
                    $next_code = $decoded[$i];
                }
            }

            $delta += ($next_code - $cur_code) * ($codecount + 1);
            $cur_code = $next_code;

            // Scan input again and encode all characters whose code point is $cur_code
            for ($i = 0; $i < $deco_len; $i++) {
                if ($decoded[$i] < $cur_code) {
                    $delta++;
                } else if ($decoded[$i] == $cur_code) {
                    for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
                        $t = ($k <= $bias)?
                            $this->_tmin :
                            (($k >= $bias + $this->_tmax)? $this->_tmax : $k - $bias);

                        if ($q < $t) {
                            break;
                        }

                        $encoded .= $this->_encodeDigit(ceil($t + (($q - $t) % ($this->_base - $t))));
                        $q = ($q - $t) / ($this->_base - $t);
                    }

                    $encoded .= $this->_encodeDigit($q);
                    $bias = $this->_adapt($delta, $codecount + 1, $is_first);
                    $codecount++;
                    $delta = 0;
                    $is_first = false;
                }
            }

            $delta++;
            $cur_code++;
        }

        return $encoded;
    }

    /**
     * The actual decoding algorithm.
     *
     * @param string $encoded Encoded string which should be decoded
     *
     * @return string         Decoded string
     * @throws Exception
     * @access private
     */
    private function _decode($encoded)
    {
        // We do need to find the Punycode prefix
        if (!preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $encoded)) {
            return false;
        }

        $encode_test = preg_replace('!^' . preg_quote($this->_punycode_prefix, '!') . '!', '', $encoded);

        // If nothing left after removing the prefix, it is hopeless
        if (!$encode_test) {
            return false;
        }

        // Find last occurrence of the delimiter
        $delim_pos = strrpos($encoded, '-');

        if ($delim_pos > self::_byteLength($this->_punycode_prefix)) {
            for ($k = self::_byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) {
                $decoded[] = ord($encoded{$k});
            }
        } else {
            $decoded = array();
        }

        $deco_len = count($decoded);
        $enco_len = self::_byteLength($encoded);

        // Wandering through the strings; init
        $is_first = true;
        $bias     = $this->_initial_bias;
        $idx      = 0;
        $char     = $this->_initial_n;

        for ($enco_idx = ($delim_pos)? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
            for ($old_idx = $idx, $w = 1, $k = $this->_base; 1 ; $k += $this->_base) {
                $digit = $this->_decodeDigit($encoded{$enco_idx++});
                $idx += $digit * $w;

                $t = ($k <= $bias) ?
                    $this->_tmin :
                    (($k >= $bias + $this->_tmax)? $this->_tmax : ($k - $bias));

                if ($digit < $t) {
                    break;
                }

                $w = (int)($w * ($this->_base - $t));
            }

            $bias      = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
            $is_first  = false;
            $char     += (int) ($idx / ($deco_len + 1));
            $idx      %= ($deco_len + 1);

            if ($deco_len > 0) {
                // Make room for the decoded char
                for ($i = $deco_len; $i > $idx; $i--) {
                    $decoded[$i] = $decoded[($i - 1)];
                }
            }

            $decoded[$idx++] = $char;
        }

        return $this->_ucs4_to_utf8($decoded);
    }

    /**
     * Adapt the bias according to the current code point and position.
     *
     * @param int     $delta    ...
     * @param int     $npoints  ...
     * @param boolean $is_first ...
     *
     * @return int
     * @access private
     */
    private function _adapt($delta, $npoints, $is_first)
    {
        $delta = (int) ($is_first ? ($delta / $this->_damp) : ($delta / 2));
        $delta += (int) ($delta / $npoints);

        for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
            $delta = (int) ($delta / ($this->_base - $this->_tmin));
        }

        return (int) ($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
    }

    /**
     * Encoding a certain digit.
     *
     * @param int $d One digit to encode
     *
     * @return char  Encoded digit
     * @access private
     */
    private function _encodeDigit($d)
    {
        return chr($d + 22 + 75 * ($d < 26));
    }

    /**
     * Decode a certain digit.
     *
     * @param char $cp One digit (character) to decode
     *
     * @return int     Decoded digit
     * @access private
     */
    private function _decodeDigit($cp)
    {
        $cp = ord($cp);
        return ($cp - 48 < 10)? $cp - 22 : (($cp - 65 < 26)? $cp - 65 : (($cp - 97 < 26)? $cp - 97 : $this->_base));
    }

    /**
     * Do Nameprep according to RFC3491 and RFC3454.
     *
     * @param array $input Unicode Characters
     *
     * @return string      Unicode Characters, Nameprep'd
     * @throws Exception
     * @access private
     */
    private function _nameprep($input)
    {
        $output = array();

        // Walking through the input array, performing the required steps on each of
        // the input chars and putting the result into the output array
        // While mapping required chars we apply the canonical ordering

        foreach ($input as $v) {
            // Map to nothing == skip that code point
            if (in_array($v, self::$_np_map_nothing)) {
                continue;
            }

            // Try to find prohibited input
            if (in_array($v, self::$_np_prohibit) || in_array($v, self::$_general_prohibited)) {
                throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v));
            }

            foreach (self::$_np_prohibit_ranges as $range) {
                if ($range[0] <= $v && $v <= $range[1]) {
                    throw new Net_IDNA2_Exception_Nameprep('Prohibited input U+' . sprintf('%08X', $v));
                }
            }

            // Hangul syllable decomposition
            if (0xAC00 <= $v && $v <= 0xD7AF) {
                foreach ($this->_hangulDecompose($v) as $out) {
                    $output[] = $out;
                }
            } else if (($this->_version == '2003') && isset(self::$_np_replacemaps[$v])) {
                // There's a decomposition mapping for that code point
                // Decompositions only in version 2003 (original) of IDNA
                foreach ($this->_applyCannonicalOrdering(self::$_np_replacemaps[$v]) as $out) {
                    $output[] = $out;
                }
            } else {
                $output[] = $v;
            }
        }

        // Combine code points

        $last_class   = 0;
        $last_starter = 0;
        $out_len      = count($output);

        for ($i = 0; $i < $out_len; ++$i) {
            $class = $this->_getCombiningClass($output[$i]);

            if ((!$last_class || $last_class != $class) && $class) {
                // Try to match
                $seq_len = $i - $last_starter;
                $out = $this->_combine(array_slice($output, $last_starter, $seq_len));

                // On match: Replace the last starter with the composed character and remove
                // the now redundant non-starter(s)
                if ($out) {
                    $output[$last_starter] = $out;

                    if (count($out) != $seq_len) {
                        for ($j = $i + 1; $j < $out_len; ++$j) {
                            $output[$j - 1] = $output[$j];
                        }

                        unset($output[$out_len]);
                    }

                    // Rewind the for loop by one, since there can be more possible compositions
                    $i--;
                    $out_len--;
                    $last_class = ($i == $last_starter)? 0 : $this->_getCombiningClass($output[$i - 1]);

                    continue;
                }
            }

            // The current class is 0
            if (!$class) {
                $last_starter = $i;
            }

            $last_class = $class;
        }

        return $output;
    }

    /**
     * Decomposes a Hangul syllable
     * (see http://www.unicode.org/unicode/reports/tr15/#Hangul).
     *
     * @param integer $char 32bit UCS4 code point
     *
     * @return array        Either Hangul Syllable decomposed or original 32bit
     *                      value as one value array
     * @access private
     */
    private function _hangulDecompose($char)
    {
        $sindex = $char - $this->_sbase;

        if ($sindex < 0 || $sindex >= $this->_scount) {
            return array($char);
        }

        $result   = array();
        $T        = $this->_tbase + $sindex % $this->_tcount;
        $result[] = (int)($this->_lbase +  $sindex / $this->_ncount);
        $result[] = (int)($this->_vbase + ($sindex % $this->_ncount) / $this->_tcount);

        if ($T != $this->_tbase) {
            $result[] = $T;
        }

        return $result;
    }

    /**
     * Ccomposes a Hangul syllable
     * (see http://www.unicode.org/unicode/reports/tr15/#Hangul).
     *
     * @param array $input Decomposed UCS4 sequence
     *
     * @return array       UCS4 sequence with syllables composed
     * @access private
     */
    private function _hangulCompose($input)
    {
        $inp_len = count($input);

        if (!$inp_len) {
            return array();
        }

        $result   = array();
        $last     = $input[0];
        $result[] = $last; // copy first char from input to output

        for ($i = 1; $i < $inp_len; ++$i) {
            $char = $input[$i];

            // Find out, wether two current characters from L and V
            $lindex = $last - $this->_lbase;

            if (0 <= $lindex && $lindex < $this->_lcount) {
                $vindex = $char - $this->_vbase;

                if (0 <= $vindex && $vindex < $this->_vcount) {
                    // create syllable of form LV
                    $last    = ($this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount);
                    $out_off = count($result) - 1;
                    $result[$out_off] = $last; // reset last

                    // discard char
                    continue;
                }
            }

            // Find out, wether two current characters are LV and T
            $sindex = $last - $this->_sbase;

            if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount) == 0) {
                $tindex = $char - $this->_tbase;

                if (0 <= $tindex && $tindex <= $this->_tcount) {
                    // create syllable of form LVT
                    $last += $tindex;
                    $out_off = count($result) - 1;
                    $result[$out_off] = $last; // reset last

                    // discard char
                    continue;
                }
            }

            // if neither case was true, just add the character
            $last = $char;
            $result[] = $char;
        }

        return $result;
    }

    /**
     * Returns the combining class of a certain wide char.
     *
     * @param integer $char Wide char to check (32bit integer)
     *
     * @return integer      Combining class if found, else 0
     * @access private
     */
    private function _getCombiningClass($char)
    {
        return isset(self::$_np_norm_combcls[$char])? self::$_np_norm_combcls[$char] : 0;
    }

    /**
     * Apllies the canonical ordering of a decomposed UCS4 sequence.
     *
     * @param array $input Decomposed UCS4 sequence
     *
     * @return array       Ordered USC4 sequence
     * @access private
     */
    private function _applyCannonicalOrdering($input)
    {
        $swap = true;
        $size = count($input);

        while ($swap) {
            $swap = false;
            $last = $this->_getCombiningClass($input[0]);

            for ($i = 0; $i < $size - 1; ++$i) {
                $next = $this->_getCombiningClass($input[$i + 1]);

                if ($next != 0 && $last > $next) {
                    // Move item leftward until it fits
                    for ($j = $i + 1; $j > 0; --$j) {
                        if ($this->_getCombiningClass($input[$j - 1]) <= $next) {
                            break;
                        }

                        $t = $input[$j];
                        $input[$j] = $input[$j - 1];
                        $input[$j - 1] = $t;
                        $swap = 1;
                    }

                    // Reentering the loop looking at the old character again
                    $next = $last;
                }

                $last = $next;
            }
        }

        return $input;
    }

    /**
     * Do composition of a sequence of starter and non-starter.
     *
     * @param array $input UCS4 Decomposed sequence
     *
     * @return array       Ordered USC4 sequence
     * @access private
     */
    private function _combine($input)
    {
        $inp_len = count($input);

        // Is it a Hangul syllable?
        if (1 != $inp_len) {
            $hangul = $this->_hangulCompose($input);

            // This place is probably wrong
            if (count($hangul) != $inp_len) {
                return $hangul;
            }
        }

        foreach (self::$_np_replacemaps as $np_src => $np_target) {
            if ($np_target[0] != $input[0]) {
                continue;
            }

            if (count($np_target) != $inp_len) {
                continue;
            }

            $hit = false;

            foreach ($input as $k2 => $v2) {
                if ($v2 == $np_target[$k2]) {
                    $hit = true;
                } else {
                    $hit = false;
                    break;
                }
            }

            if ($hit) {
                return $np_src;
            }
        }

        return false;
    }

    /**
     * This converts an UTF-8 encoded string to its UCS-4 (array) representation
     * By talking about UCS-4 we mean arrays of 32bit integers representing
     * each of the "chars". This is due to PHP not being able to handle strings with
     * bit depth different from 8. This applies to the reverse method _ucs4_to_utf8(), too.
     * The following UTF-8 encodings are supported:
     *
     * bytes bits  representation
     * 1        7  0xxxxxxx
     * 2       11  110xxxxx 10xxxxxx
     * 3       16  1110xxxx 10xxxxxx 10xxxxxx
     * 4       21  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
     * 5       26  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
     * 6       31  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
     *
     * Each x represents a bit that can be used to store character data.
     *
     * @param string $input utf8-encoded string
     *
     * @return array        ucs4-encoded array
     * @throws Exception
     * @access private
     */
    private function _utf8_to_ucs4($input)
    {
        $output = array();
        $out_len = 0;
        $inp_len = self::_byteLength($input, '8bit');
        $mode = 'next';
        $test = 'none';
        for ($k = 0; $k < $inp_len; ++$k) {
            $v = ord($input{$k}); // Extract byte from input string

            if ($v < 128) { // We found an ASCII char - put into string as is
                $output[$out_len] = $v;
                ++$out_len;
                if ('add' == $mode) {
                    throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
                }
                continue;
            }
            if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
                $start_byte = $v;
                $mode = 'add';
                $test = 'range';
                if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
                    $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
                    $v = ($v - 192) << 6;
                } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
                    $next_byte = 1;
                    $v = ($v - 224) << 12;
                } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
                    $next_byte = 2;
                    $v = ($v - 240) << 18;
                } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
                    $next_byte = 3;
                    $v = ($v - 248) << 24;
                } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
                    $next_byte = 4;
                    $v = ($v - 252) << 30;
                } else {
                    throw new UnexpectedValueException('This might be UTF-8, but I don\'t understand it at byte '.$k);
                }
                if ('add' == $mode) {
                    $output[$out_len] = (int) $v;
                    ++$out_len;
                    continue;
                }
            }
            if ('add' == $mode) {
                if (!$this->_allow_overlong && $test == 'range') {
                    $test = 'none';
                    if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
                        throw new OutOfRangeException('Bogus UTF-8 character detected (out of legal range) at byte '.$k);
                    }
                }
                if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
                    $v = ($v - 128) << ($next_byte * 6);
                    $output[($out_len - 1)] += $v;
                    --$next_byte;
                } else {
                    throw new UnexpectedValueException('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k);
                }
                if ($next_byte < 0) {
                    $mode = 'next';
                }
            }
        } // for
        return $output;
    }

    /**
     * Convert UCS-4 array into UTF-8 string
     *
     * @param array $input ucs4-encoded array
     *
     * @return string      utf8-encoded string
     * @throws Exception
     * @access private
     */
    private function _ucs4_to_utf8($input)
    {
        $output = '';

        foreach ($input as $v) {
            // $v = ord($v);

            if ($v < 128) {
                // 7bit are transferred literally
                $output .= chr($v);
            } else if ($v < 1 << 11) {
                // 2 bytes
                $output .= chr(192 + ($v >> 6))
                    . chr(128 + ($v & 63));
            } else if ($v < 1 << 16) {
                // 3 bytes
                $output .= chr(224 + ($v >> 12))
                    . chr(128 + (($v >> 6) & 63))
                    . chr(128 + ($v & 63));
            } else if ($v < 1 << 21) {
                // 4 bytes
                $output .= chr(240 + ($v >> 18))
                    . chr(128 + (($v >> 12) & 63))
                    . chr(128 + (($v >>  6) & 63))
                    . chr(128 + ($v & 63));
            } else if ($v < 1 << 26) {
                // 5 bytes
                $output .= chr(248 + ($v >> 24))
                    . chr(128 + (($v >> 18) & 63))
                    . chr(128 + (($v >> 12) & 63))
                    . chr(128 + (($v >>  6) & 63))
                    . chr(128 + ($v & 63));
            } else if ($v < 1 << 31) {
                // 6 bytes
                $output .= chr(252 + ($v >> 30))
                    . chr(128 + (($v >> 24) & 63))
                    . chr(128 + (($v >> 18) & 63))
                    . chr(128 + (($v >> 12) & 63))
                    . chr(128 + (($v >>  6) & 63))
                    . chr(128 + ($v & 63));
            } else {
                throw new UnexpectedValueException('Conversion from UCS-4 to UTF-8 failed: malformed input');
            }
        }

        return $output;
    }

    /**
     * Convert UCS-4 array into UCS-4 string
     *
     * @param array $input ucs4-encoded array
     *
     * @return string      ucs4-encoded string
     * @throws Exception
     * @access private
     */
    private function _ucs4_to_ucs4_string($input)
    {
        $output = '';
        // Take array values and split output to 4 bytes per value
        // The bit mask is 255, which reads &11111111
        foreach ($input as $v) {
            $output .= ($v & (255 << 24) >> 24) . ($v & (255 << 16) >> 16) . ($v & (255 << 8) >> 8) . ($v & 255);
        }
        return $output;
    }

    /**
     * Convert UCS-4 string into UCS-4 array
     *
     * @param string $input ucs4-encoded string
     *
     * @return array        ucs4-encoded array
     * @throws InvalidArgumentException
     * @access private
     */
    private function _ucs4_string_to_ucs4($input)
    {
        $output = array();

        $inp_len = self::_byteLength($input);
        // Input length must be dividable by 4
        if ($inp_len % 4) {
            throw new InvalidArgumentException('Input UCS4 string is broken');
        }

        // Empty input - return empty output
        if (!$inp_len) {
            return $output;
        }

        for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
            // Increment output position every 4 input bytes
            if (!$i % 4) {
                $out_len++;
                $output[$out_len] = 0;
            }
            $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
        }
        return $output;
    }

    /**
     * Echo hex representation of UCS4 sequence.
     *
     * @param array   $input       UCS4 sequence
     * @param boolean $include_bit Include bitmask in output
     *
     * @return void
     * @static
     * @access private
     */
    private static function _showHex($input, $include_bit = false)
    {
        foreach ($input as $k => $v) {
            echo '[', $k, '] => ', sprintf('%X', $v);

            if ($include_bit) {
                echo ' (', Net_IDNA2::_showBitmask($v), ')';
            }

            echo "\n";
        }
    }

    /**
     * Gives you a bit representation of given Byte (8 bits), Word (16 bits) or DWord (32 bits)
     * Output width is automagically determined
     *
     * @param int $octet ...
     *
     * @return string    Bitmask-representation
     * @static
     * @access private
     */
    private static function _showBitmask($octet)
    {
        if ($octet >= (1 << 16)) {
            $w = 31;
        } else if ($octet >= (1 << 8)) {
            $w = 15;
        } else {
            $w = 7;
        }

        $return = '';

        for ($i = $w; $i > -1; $i--) {
            $return .= ($octet & (1 << $i))? '1' : '0';
        }

        return $return;
    }

    /**
     * Gets the length of a string in bytes even if mbstring function
     * overloading is turned on
     *
     * @param string $string the string for which to get the length.
     *
     * @return integer the length of the string in bytes.
     *
     * @see Net_IDNA2::$_mb_string_overload
     */
    private static function _byteLength($string)
    {
        if (self::$_mb_string_overload) {
            return mb_strlen($string, '8bit');
        }
        return strlen((binary)$string);
    }

    // }}}}

    // {{{ factory
    /**
     * Attempts to return a concrete IDNA instance for either php4 or php5.
     *
     * @param array $params Set of paramaters
     *
     * @return Net_IDNA2
     * @access public
     */
    public static function getInstance($params = array())
    {
        return new Net_IDNA2($params);
    }
    // }}}

    // {{{ singleton
    /**
     * Attempts to return a concrete IDNA instance for either php4 or php5,
     * only creating a new instance if no IDNA instance with the same
     * parameters currently exists.
     *
     * @param array $params Set of parameters
     *
     * @return object Net_IDNA2
     * @access public
     */
    public static function singleton($params = array())
    {
        static $instances;
        if (!isset($instances)) {
            $instances = array();
        }

        $signature = serialize($params);
        if (!isset($instances[$signature])) {
            $instances[$signature] = Net_IDNA2::getInstance($params);
        }

        return $instances[$signature];
    }
    // }}}
}

?>
PK�^�\t}�[��Dpear/Symfony/Component/HttpKernel/Profiler/SqliteProfilerStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

/**
 * SqliteProfilerStorage stores profiling information in a SQLite database.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SqliteProfilerStorage extends PdoProfilerStorage
{
    /**
     * @throws \RuntimeException When neither of SQLite3 or PDO_SQLite extension is enabled
     */
    protected function initDb()
    {
        if (null === $this->db || $this->db instanceof \SQLite3) {
            if (0 !== strpos($this->dsn, 'sqlite')) {
                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Sqlite with an invalid dsn "%s". The expected format is "sqlite:/path/to/the/db/file".', $this->dsn));
            }
            if (class_exists('SQLite3')) {
                $db = new \SQLite3(substr($this->dsn, 7, strlen($this->dsn)), \SQLITE3_OPEN_READWRITE | \SQLITE3_OPEN_CREATE);
                if (method_exists($db, 'busyTimeout')) {
                    // busyTimeout only exists for PHP >= 5.3.3
                    $db->busyTimeout(1000);
                }
            } elseif (class_exists('PDO') && in_array('sqlite', \PDO::getAvailableDrivers(), true)) {
                $db = new \PDO($this->dsn);
            } else {
                throw new \RuntimeException('You need to enable either the SQLite3 or PDO_SQLite extension for the profiler to run properly.');
            }

            $db->exec('PRAGMA temp_store=MEMORY; PRAGMA journal_mode=MEMORY;');
            $db->exec('CREATE TABLE IF NOT EXISTS sf_profiler_data (token STRING, data STRING, ip STRING, method STRING, url STRING, time INTEGER, parent STRING, created_at INTEGER)');
            $db->exec('CREATE INDEX IF NOT EXISTS data_created_at ON sf_profiler_data (created_at)');
            $db->exec('CREATE INDEX IF NOT EXISTS data_ip ON sf_profiler_data (ip)');
            $db->exec('CREATE INDEX IF NOT EXISTS data_method ON sf_profiler_data (method)');
            $db->exec('CREATE INDEX IF NOT EXISTS data_url ON sf_profiler_data (url)');
            $db->exec('CREATE INDEX IF NOT EXISTS data_parent ON sf_profiler_data (parent)');
            $db->exec('CREATE UNIQUE INDEX IF NOT EXISTS data_token ON sf_profiler_data (token)');

            $this->db = $db;
        }

        return $this->db;
    }

    protected function exec($db, $query, array $args = array())
    {
        if ($db instanceof \SQLite3) {
            $stmt = $this->prepareStatement($db, $query);
            foreach ($args as $arg => $val) {
                $stmt->bindValue($arg, $val, is_int($val) ? \SQLITE3_INTEGER : \SQLITE3_TEXT);
            }

            $res = $stmt->execute();
            if (false === $res) {
                throw new \RuntimeException(sprintf('Error executing SQLite query "%s"', $query));
            }
            $res->finalize();
        } else {
            parent::exec($db, $query, $args);
        }
    }

    protected function fetch($db, $query, array $args = array())
    {
        $return = array();

        if ($db instanceof \SQLite3) {
            $stmt = $this->prepareStatement($db, $query, true);
            foreach ($args as $arg => $val) {
                $stmt->bindValue($arg, $val, is_int($val) ? \SQLITE3_INTEGER : \SQLITE3_TEXT);
            }
            $res = $stmt->execute();
            while ($row = $res->fetchArray(\SQLITE3_ASSOC)) {
                $return[] = $row;
            }
            $res->finalize();
            $stmt->close();
        } else {
            $return = parent::fetch($db, $query, $args);
        }

        return $return;
    }

    /**
     * {@inheritdoc}
     */
    protected function buildCriteria($ip, $url, $start, $end, $limit, $method)
    {
        $criteria = array();
        $args = array();

        if ($ip = preg_replace('/[^\d\.]/', '', $ip)) {
            $criteria[] = 'ip LIKE :ip';
            $args[':ip'] = '%'.$ip.'%';
        }

        if ($url) {
            $criteria[] = 'url LIKE :url ESCAPE "\"';
            $args[':url'] = '%'.addcslashes($url, '%_\\').'%';
        }

        if ($method) {
            $criteria[] = 'method = :method';
            $args[':method'] = $method;
        }

        if (!empty($start)) {
            $criteria[] = 'time >= :start';
            $args[':start'] = $start;
        }

        if (!empty($end)) {
            $criteria[] = 'time <= :end';
            $args[':end'] = $end;
        }

        return array($criteria, $args);
    }

    protected function close($db)
    {
        if ($db instanceof \SQLite3) {
            $db->close();
        }
    }
}
PK�^�\� ��6pear/Symfony/Component/HttpKernel/Profiler/Profile.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;

/**
 * Profile.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Profile
{
    private $token;

    /**
     * @var DataCollectorInterface[]
     */
    private $collectors = array();

    private $ip;
    private $method;
    private $url;
    private $time;

    /**
     * @var Profile
     */
    private $parent;

    /**
     * @var Profile[]
     */
    private $children = array();

    /**
     * Constructor.
     *
     * @param string $token The token
     */
    public function __construct($token)
    {
        $this->token = $token;
    }

    /**
     * Sets the token.
     *
     * @param string $token The token
     */
    public function setToken($token)
    {
        $this->token = $token;
    }

    /**
     * Gets the token.
     *
     * @return string The token
     */
    public function getToken()
    {
        return $this->token;
    }

    /**
     * Sets the parent token
     *
     * @param Profile $parent The parent Profile
     */
    public function setParent(Profile $parent)
    {
        $this->parent = $parent;
    }

    /**
     * Returns the parent profile.
     *
     * @return Profile The parent profile
     */
    public function getParent()
    {
        return $this->parent;
    }

    /**
     * Returns the parent token.
     *
     * @return null|string The parent token
     */
    public function getParentToken()
    {
        return $this->parent ? $this->parent->getToken() : null;
    }

    /**
     * Returns the IP.
     *
     * @return string The IP
     */
    public function getIp()
    {
        return $this->ip;
    }

    /**
     * Sets the IP.
     *
     * @param string $ip
     */
    public function setIp($ip)
    {
        $this->ip = $ip;
    }

    /**
     * Returns the request method.
     *
     * @return string The request method
     */
    public function getMethod()
    {
        return $this->method;
    }

    public function setMethod($method)
    {
        $this->method = $method;
    }

    /**
     * Returns the URL.
     *
     * @return string The URL
     */
    public function getUrl()
    {
        return $this->url;
    }

    public function setUrl($url)
    {
        $this->url = $url;
    }

    /**
     * Returns the time.
     *
     * @return string The time
     */
    public function getTime()
    {
        if (null === $this->time) {
            return 0;
        }

        return $this->time;
    }

    public function setTime($time)
    {
        $this->time = $time;
    }

    /**
     * Finds children profilers.
     *
     * @return Profile[] An array of Profile
     */
    public function getChildren()
    {
        return $this->children;
    }

    /**
     * Sets children profiler.
     *
     * @param Profile[] $children An array of Profile
     */
    public function setChildren(array $children)
    {
        $this->children = array();
        foreach ($children as $child) {
            $this->addChild($child);
        }
    }

    /**
     * Adds the child token
     *
     * @param Profile $child The child Profile
     */
    public function addChild(Profile $child)
    {
        $this->children[] = $child;
        $child->setParent($this);
    }

    /**
     * Gets a Collector by name.
     *
     * @param string $name A collector name
     *
     * @return DataCollectorInterface A DataCollectorInterface instance
     *
     * @throws \InvalidArgumentException if the collector does not exist
     */
    public function getCollector($name)
    {
        if (!isset($this->collectors[$name])) {
            throw new \InvalidArgumentException(sprintf('Collector "%s" does not exist.', $name));
        }

        return $this->collectors[$name];
    }

    /**
     * Gets the Collectors associated with this profile.
     *
     * @return DataCollectorInterface[]
     */
    public function getCollectors()
    {
        return $this->collectors;
    }

    /**
     * Sets the Collectors associated with this profile.
     *
     * @param DataCollectorInterface[] $collectors
     */
    public function setCollectors(array $collectors)
    {
        $this->collectors = array();
        foreach ($collectors as $collector) {
            $this->addCollector($collector);
        }
    }

    /**
     * Adds a Collector.
     *
     * @param DataCollectorInterface $collector A DataCollectorInterface instance
     */
    public function addCollector(DataCollectorInterface $collector)
    {
        $this->collectors[$collector->getName()] = $collector;
    }

    /**
     * Returns true if a Collector for the given name exists.
     *
     * @param string $name A collector name
     *
     * @return Boolean
     */
    public function hasCollector($name)
    {
        return isset($this->collectors[$name]);
    }

    public function __sleep()
    {
        return array('token', 'parent', 'children', 'collectors', 'ip', 'method', 'url', 'time');
    }
}
PK�^�\�rLU��Gpear/Symfony/Component/HttpKernel/Profiler/ProfilerStorageInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

/**
 * ProfilerStorageInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface ProfilerStorageInterface
{
    /**
     * Finds profiler tokens for the given criteria.
     *
     * @param string   $ip     The IP
     * @param string   $url    The URL
     * @param string   $limit  The maximum number of tokens to return
     * @param string   $method The request method
     * @param int|null $start  The start date to search from
     * @param int|null $end    The end date to search to
     *
     * @return array An array of tokens
     */
    public function find($ip, $url, $limit, $method, $start = null, $end = null);

    /**
     * Reads data associated with the given token.
     *
     * The method returns false if the token does not exist in the storage.
     *
     * @param string $token A token
     *
     * @return Profile The profile associated with token
     */
    public function read($token);

    /**
     * Saves a Profile.
     *
     * @param Profile $profile A Profile instance
     *
     * @return Boolean Write operation successful
     */
    public function write(Profile $profile);

    /**
     * Purges all data from the database.
     */
    public function purge();
}
PK�^�\iY~2
2
Fpear/Symfony/Component/HttpKernel/Profiler/MemcacheProfilerStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

/**
 * Memcache Profiler Storage
 *
 * @author Andrej Hudec <pulzarraider@gmail.com>
 */
class MemcacheProfilerStorage extends BaseMemcacheProfilerStorage
{
    /**
     * @var \Memcache
     */
    private $memcache;

    /**
     * Internal convenience method that returns the instance of the Memcache
     *
     * @return \Memcache
     *
     * @throws \RuntimeException
     */
    protected function getMemcache()
    {
        if (null === $this->memcache) {
            if (!preg_match('#^memcache://(?(?=\[.*\])\[(.*)\]|(.*)):(.*)$#', $this->dsn, $matches)) {
                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Memcache with an invalid dsn "%s". The expected format is "memcache://[host]:port".', $this->dsn));
            }

            $host = $matches[1] ?: $matches[2];
            $port = $matches[3];

            $memcache = new \Memcache();
            $memcache->addServer($host, $port);

            $this->memcache = $memcache;
        }

        return $this->memcache;
    }

    /**
     * Set instance of the Memcache
     *
     * @param \Memcache $memcache
     */
    public function setMemcache($memcache)
    {
        $this->memcache = $memcache;
    }

    /**
     * {@inheritdoc}
     */
    protected function getValue($key)
    {
        return $this->getMemcache()->get($key);
    }

    /**
     * {@inheritdoc}
     */
    protected function setValue($key, $value, $expiration = 0)
    {
        return $this->getMemcache()->set($key, $value, false, time() + $expiration);
    }

    /**
     * {@inheritdoc}
     */
    protected function delete($key)
    {
        return $this->getMemcache()->delete($key);
    }

    /**
     * {@inheritdoc}
     */
    protected function appendValue($key, $value, $expiration = 0)
    {
        $memcache = $this->getMemcache();

        if (method_exists($memcache, 'append')) {

            // Memcache v3.0
            if (!$result = $memcache->append($key, $value, false, $expiration)) {
                return $memcache->set($key, $value, false, $expiration);
            }

            return $result;
        }

        // simulate append in Memcache <3.0
        $content = $memcache->get($key);

        return $memcache->set($key, $content.$value, false, $expiration);
    }
}
PK�^�\�t��Jpear/Symfony/Component/HttpKernel/Profiler/BaseMemcacheProfilerStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

/**
 * Base Memcache storage for profiling information in a Memcache.
 *
 * @author Andrej Hudec <pulzarraider@gmail.com>
 */
abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
{
    const TOKEN_PREFIX = 'sf_profiler_';

    protected $dsn;
    protected $lifetime;

    /**
     * Constructor.
     *
     * @param string $dsn      A data source name
     * @param string $username
     * @param string $password
     * @param int    $lifetime The lifetime to use for the purge
     */
    public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
    {
        $this->dsn = $dsn;
        $this->lifetime = (int) $lifetime;
    }

    /**
     * {@inheritdoc}
     */
    public function find($ip, $url, $limit, $method, $start = null, $end = null)
    {
        $indexName = $this->getIndexName();

        $indexContent = $this->getValue($indexName);
        if (!$indexContent) {
            return array();
        }

        $profileList = explode("\n", $indexContent);
        $result = array();

        foreach ($profileList as $item) {

            if ($limit === 0) {
                break;
            }

            if ($item=='') {
                continue;
            }

            list($itemToken, $itemIp, $itemMethod, $itemUrl, $itemTime, $itemParent) = explode("\t", $item, 6);

            $itemTime = (int) $itemTime;

            if ($ip && false === strpos($itemIp, $ip) || $url && false === strpos($itemUrl, $url) || $method && false === strpos($itemMethod, $method)) {
                continue;
            }

            if (!empty($start) && $itemTime < $start) {
                continue;
            }

            if (!empty($end) && $itemTime > $end) {
                continue;
            }

            $result[$itemToken]  = array(
                'token'  => $itemToken,
                'ip'     => $itemIp,
                'method' => $itemMethod,
                'url'    => $itemUrl,
                'time'   => $itemTime,
                'parent' => $itemParent,
            );
            --$limit;
        }

        usort($result, function ($a, $b) {
            if ($a['time'] === $b['time']) {
                return 0;
            }

            return $a['time'] > $b['time'] ? -1 : 1;
        });

        return $result;
    }

    /**
     * {@inheritdoc}
     */
    public function purge()
    {
        // delete only items from index
        $indexName = $this->getIndexName();

        $indexContent = $this->getValue($indexName);

        if (!$indexContent) {
            return false;
        }

        $profileList = explode("\n", $indexContent);

        foreach ($profileList as $item) {
            if ($item == '') {
                continue;
            }

            if (false !== $pos = strpos($item, "\t")) {
                $this->delete($this->getItemName(substr($item, 0, $pos)));
            }
        }

        return $this->delete($indexName);
    }

    /**
     * {@inheritdoc}
     */
    public function read($token)
    {
        if (empty($token)) {
            return false;
        }

        $profile = $this->getValue($this->getItemName($token));

        if (false !== $profile) {
            $profile = $this->createProfileFromData($token, $profile);
        }

        return $profile;
    }

    /**
     * {@inheritdoc}
     */
    public function write(Profile $profile)
    {
        $data = array(
            'token'    => $profile->getToken(),
            'parent'   => $profile->getParentToken(),
            'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
            'data'     => $profile->getCollectors(),
            'ip'       => $profile->getIp(),
            'method'   => $profile->getMethod(),
            'url'      => $profile->getUrl(),
            'time'     => $profile->getTime(),
        );

        $profileIndexed = false !== $this->getValue($this->getItemName($profile->getToken()));

        if ($this->setValue($this->getItemName($profile->getToken()), $data, $this->lifetime)) {

            if (!$profileIndexed) {
                // Add to index
                $indexName = $this->getIndexName();

                $indexRow = implode("\t", array(
                    $profile->getToken(),
                    $profile->getIp(),
                    $profile->getMethod(),
                    $profile->getUrl(),
                    $profile->getTime(),
                    $profile->getParentToken(),
                ))."\n";

                return $this->appendValue($indexName, $indexRow, $this->lifetime);
            }

            return true;
        }

        return false;
    }

    /**
     * Retrieve item from the memcache server
     *
     * @param string $key
     *
     * @return mixed
     */
    abstract protected function getValue($key);

    /**
     * Store an item on the memcache server under the specified key
     *
     * @param string $key
     * @param mixed  $value
     * @param int    $expiration
     *
     * @return boolean
     */
    abstract protected function setValue($key, $value, $expiration = 0);

    /**
     * Delete item from the memcache server
     *
     * @param string $key
     *
     * @return boolean
     */
    abstract protected function delete($key);

    /**
     * Append data to an existing item on the memcache server
     * @param string $key
     * @param string $value
     * @param int    $expiration
     *
     * @return boolean
     */
    abstract protected function appendValue($key, $value, $expiration = 0);

    private function createProfileFromData($token, $data, $parent = null)
    {
        $profile = new Profile($token);
        $profile->setIp($data['ip']);
        $profile->setMethod($data['method']);
        $profile->setUrl($data['url']);
        $profile->setTime($data['time']);
        $profile->setCollectors($data['data']);

        if (!$parent && $data['parent']) {
            $parent = $this->read($data['parent']);
        }

        if ($parent) {
            $profile->setParent($parent);
        }

        foreach ($data['children'] as $token) {
            if (!$token) {
                continue;
            }

            if (!$childProfileData = $this->getValue($this->getItemName($token))) {
                continue;
            }

            $profile->addChild($this->createProfileFromData($token, $childProfileData, $profile));
        }

        return $profile;
    }

    /**
     * Get item name
     *
     * @param string $token
     *
     * @return string
     */
    private function getItemName($token)
    {
        $name = self::TOKEN_PREFIX.$token;

        if ($this->isItemNameValid($name)) {
            return $name;
        }

        return false;
    }

    /**
     * Get name of index
     *
     * @return string
     */
    private function getIndexName()
    {
        $name = self::TOKEN_PREFIX.'index';

        if ($this->isItemNameValid($name)) {
            return $name;
        }

        return false;
    }

    private function isItemNameValid($name)
    {
        $length = strlen($name);

        if ($length > 250) {
            throw new \RuntimeException(sprintf('The memcache item key "%s" is too long (%s bytes). Allowed maximum size is 250 bytes.', $name, $length));
        }

        return true;
    }

}
PK�^�\���

7pear/Symfony/Component/HttpKernel/Profiler/Profiler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;
use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
use Psr\Log\LoggerInterface;

/**
 * Profiler.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Profiler
{
    /**
     * @var ProfilerStorageInterface
     */
    private $storage;

    /**
     * @var DataCollectorInterface[]
     */
    private $collectors = array();

    /**
     * @var LoggerInterface
     */
    private $logger;

    /**
     * @var Boolean
     */
    private $enabled = true;

    /**
     * Constructor.
     *
     * @param ProfilerStorageInterface $storage A ProfilerStorageInterface instance
     * @param LoggerInterface          $logger  A LoggerInterface instance
     */
    public function __construct(ProfilerStorageInterface $storage, LoggerInterface $logger = null)
    {
        $this->storage = $storage;
        $this->logger = $logger;
    }

    /**
     * Disables the profiler.
     */
    public function disable()
    {
        $this->enabled = false;
    }

    /**
     * Enables the profiler.
     */
    public function enable()
    {
        $this->enabled = true;
    }

    /**
     * Loads the Profile for the given Response.
     *
     * @param Response $response A Response instance
     *
     * @return Profile A Profile instance
     */
    public function loadProfileFromResponse(Response $response)
    {
        if (!$token = $response->headers->get('X-Debug-Token')) {
            return false;
        }

        return $this->loadProfile($token);
    }

    /**
     * Loads the Profile for the given token.
     *
     * @param string $token A token
     *
     * @return Profile A Profile instance
     */
    public function loadProfile($token)
    {
        return $this->storage->read($token);
    }

    /**
     * Saves a Profile.
     *
     * @param Profile $profile A Profile instance
     *
     * @return Boolean
     */
    public function saveProfile(Profile $profile)
    {
        // late collect
        foreach ($profile->getCollectors() as $collector) {
            if ($collector instanceof LateDataCollectorInterface) {
                $collector->lateCollect();
            }
        }

        if (!($ret = $this->storage->write($profile)) && null !== $this->logger) {
            $this->logger->warning('Unable to store the profiler information.');
        }

        return $ret;
    }

    /**
     * Purges all data from the storage.
     */
    public function purge()
    {
        $this->storage->purge();
    }

    /**
     * Exports the current profiler data.
     *
     * @param Profile $profile A Profile instance
     *
     * @return string The exported data
     */
    public function export(Profile $profile)
    {
        return base64_encode(serialize($profile));
    }

    /**
     * Imports data into the profiler storage.
     *
     * @param string $data A data string as exported by the export() method
     *
     * @return Profile A Profile instance
     */
    public function import($data)
    {
        $profile = unserialize(base64_decode($data));

        if ($this->storage->read($profile->getToken())) {
            return false;
        }

        $this->saveProfile($profile);

        return $profile;
    }

    /**
     * Finds profiler tokens for the given criteria.
     *
     * @param string $ip     The IP
     * @param string $url    The URL
     * @param string $limit  The maximum number of tokens to return
     * @param string $method The request method
     * @param string $start  The start date to search from
     * @param string $end    The end date to search to
     *
     * @return array An array of tokens
     *
     * @see http://fr2.php.net/manual/en/datetime.formats.php for the supported date/time formats
     */
    public function find($ip, $url, $limit, $method, $start, $end)
    {
        if ('' != $start && null !== $start) {
            $start = new \DateTime($start);
            $start = $start->getTimestamp();
        } else {
            $start = null;
        }

        if ('' != $end && null !== $end) {
            $end = new \DateTime($end);
            $end = $end->getTimestamp();
        } else {
            $end = null;
        }

        return $this->storage->find($ip, $url, $limit, $method, $start, $end);
    }

    /**
     * Collects data for the given Response.
     *
     * @param Request    $request   A Request instance
     * @param Response   $response  A Response instance
     * @param \Exception $exception An exception instance if the request threw one
     *
     * @return Profile|null A Profile instance or null if the profiler is disabled
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        if (false === $this->enabled) {
            return;
        }

        $profile = new Profile(substr(hash('sha256', uniqid(mt_rand(), true)), 0, 6));
        $profile->setTime(time());
        $profile->setUrl($request->getUri());
        $profile->setIp($request->getClientIp());
        $profile->setMethod($request->getMethod());

        $response->headers->set('X-Debug-Token', $profile->getToken());

        foreach ($this->collectors as $collector) {
            $collector->collect($request, $response, $exception);

            // we need to clone for sub-requests
            $profile->addCollector(clone $collector);
        }

        return $profile;
    }

    /**
     * Gets the Collectors associated with this profiler.
     *
     * @return array An array of collectors
     */
    public function all()
    {
        return $this->collectors;
    }

    /**
     * Sets the Collectors associated with this profiler.
     *
     * @param DataCollectorInterface[] $collectors An array of collectors
     */
    public function set(array $collectors = array())
    {
        $this->collectors = array();
        foreach ($collectors as $collector) {
            $this->add($collector);
        }
    }

    /**
     * Adds a Collector.
     *
     * @param DataCollectorInterface $collector A DataCollectorInterface instance
     */
    public function add(DataCollectorInterface $collector)
    {
        $this->collectors[$collector->getName()] = $collector;
    }

    /**
     * Returns true if a Collector for the given name exists.
     *
     * @param string $name A collector name
     *
     * @return Boolean
     */
    public function has($name)
    {
        return isset($this->collectors[$name]);
    }

    /**
     * Gets a Collector by name.
     *
     * @param string $name A collector name
     *
     * @return DataCollectorInterface A DataCollectorInterface instance
     *
     * @throws \InvalidArgumentException if the collector does not exist
     */
    public function get($name)
    {
        if (!isset($this->collectors[$name])) {
            throw new \InvalidArgumentException(sprintf('Collector "%s" does not exist.', $name));
        }

        return $this->collectors[$name];
    }
}
PK�^�\N����'�'Cpear/Symfony/Component/HttpKernel/Profiler/RedisProfilerStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

/**
 * RedisProfilerStorage stores profiling information in Redis.
 *
 * @author Andrej Hudec <pulzarraider@gmail.com>
 * @author Stephane PY <py.stephane1@gmail.com>
 */
class RedisProfilerStorage implements ProfilerStorageInterface
{
    const TOKEN_PREFIX = 'sf_profiler_';

    const REDIS_OPT_SERIALIZER = 1;
    const REDIS_OPT_PREFIX = 2;
    const REDIS_SERIALIZER_NONE = 0;
    const REDIS_SERIALIZER_PHP = 1;

    protected $dsn;
    protected $lifetime;

    /**
     * @var \Redis
     */
    private $redis;

    /**
     * Constructor.
     *
     * @param string $dsn      A data source name
     * @param string $username Not used
     * @param string $password Not used
     * @param int    $lifetime The lifetime to use for the purge
     */
    public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
    {
        $this->dsn = $dsn;
        $this->lifetime = (int) $lifetime;
    }

    /**
     * {@inheritdoc}
     */
    public function find($ip, $url, $limit, $method, $start = null, $end = null)
    {
        $indexName = $this->getIndexName();

        if (!$indexContent = $this->getValue($indexName, self::REDIS_SERIALIZER_NONE)) {
            return array();
        }

        $profileList = array_reverse(explode("\n", $indexContent));
        $result = array();

        foreach ($profileList as $item) {
            if ($limit === 0) {
                break;
            }

            if ($item == '') {
                continue;
            }

            list($itemToken, $itemIp, $itemMethod, $itemUrl, $itemTime, $itemParent) = explode("\t", $item, 6);

            $itemTime = (int) $itemTime;

            if ($ip && false === strpos($itemIp, $ip) || $url && false === strpos($itemUrl, $url) || $method && false === strpos($itemMethod, $method)) {
                continue;
            }

            if (!empty($start) && $itemTime < $start) {
                continue;
            }

            if (!empty($end) && $itemTime > $end) {
                continue;
            }

            $result[] = array(
                'token'  => $itemToken,
                'ip'     => $itemIp,
                'method' => $itemMethod,
                'url'    => $itemUrl,
                'time'   => $itemTime,
                'parent' => $itemParent,
            );
            --$limit;
        }

        return $result;
    }

    /**
     * {@inheritdoc}
     */
    public function purge()
    {
        // delete only items from index
        $indexName = $this->getIndexName();

        $indexContent = $this->getValue($indexName, self::REDIS_SERIALIZER_NONE);

        if (!$indexContent) {
            return false;
        }

        $profileList = explode("\n", $indexContent);

        $result = array();

        foreach ($profileList as $item) {
            if ($item == '') {
                continue;
            }

            if (false !== $pos = strpos($item, "\t")) {
                $result[] = $this->getItemName(substr($item, 0, $pos));
            }
        }

        $result[] = $indexName;

        return $this->delete($result);
    }

    /**
     * {@inheritdoc}
     */
    public function read($token)
    {
        if (empty($token)) {
            return false;
        }

        $profile = $this->getValue($this->getItemName($token), self::REDIS_SERIALIZER_PHP);

        if (false !== $profile) {
            $profile = $this->createProfileFromData($token, $profile);
        }

        return $profile;
    }

    /**
     * {@inheritdoc}
     */
    public function write(Profile $profile)
    {
        $data = array(
            'token'    => $profile->getToken(),
            'parent'   => $profile->getParentToken(),
            'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
            'data'     => $profile->getCollectors(),
            'ip'       => $profile->getIp(),
            'method'   => $profile->getMethod(),
            'url'      => $profile->getUrl(),
            'time'     => $profile->getTime(),
        );

        $profileIndexed = false !== $this->getValue($this->getItemName($profile->getToken()));

        if ($this->setValue($this->getItemName($profile->getToken()), $data, $this->lifetime, self::REDIS_SERIALIZER_PHP)) {

            if (!$profileIndexed) {
                // Add to index
                $indexName = $this->getIndexName();

                $indexRow = implode("\t", array(
                    $profile->getToken(),
                    $profile->getIp(),
                    $profile->getMethod(),
                    $profile->getUrl(),
                    $profile->getTime(),
                    $profile->getParentToken(),
                ))."\n";

                return $this->appendValue($indexName, $indexRow, $this->lifetime);
            }

            return true;
        }

        return false;
    }

    /**
     * Internal convenience method that returns the instance of Redis.
     *
     * @return \Redis
     *
     * @throws \RuntimeException
     */
    protected function getRedis()
    {
        if (null === $this->redis) {
            $data = parse_url($this->dsn);

            if (false === $data || !isset($data['scheme']) || $data['scheme'] !== 'redis' || !isset($data['host']) || !isset($data['port'])) {
                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Redis with an invalid dsn "%s". The minimal expected format is "redis://[host]:port".', $this->dsn));
            }

            if (!extension_loaded('redis')) {
                throw new \RuntimeException('RedisProfilerStorage requires that the redis extension is loaded.');
            }

            $redis = new \Redis();
            $redis->connect($data['host'], $data['port']);

            if (isset($data['path'])) {
                $redis->select(substr($data['path'], 1));
            }

            if (isset($data['pass'])) {
                $redis->auth($data['pass']);
            }

            $redis->setOption(self::REDIS_OPT_PREFIX, self::TOKEN_PREFIX);

            $this->redis = $redis;
        }

        return $this->redis;
    }

    /**
     * Set instance of the Redis
     *
     * @param \Redis $redis
     */
    public function setRedis($redis)
    {
        $this->redis = $redis;
    }

    private function createProfileFromData($token, $data, $parent = null)
    {
        $profile = new Profile($token);
        $profile->setIp($data['ip']);
        $profile->setMethod($data['method']);
        $profile->setUrl($data['url']);
        $profile->setTime($data['time']);
        $profile->setCollectors($data['data']);

        if (!$parent && $data['parent']) {
            $parent = $this->read($data['parent']);
        }

        if ($parent) {
            $profile->setParent($parent);
        }

        foreach ($data['children'] as $token) {
            if (!$token) {
                continue;
            }

            if (!$childProfileData = $this->getValue($this->getItemName($token), self::REDIS_SERIALIZER_PHP)) {
                continue;
            }

            $profile->addChild($this->createProfileFromData($token, $childProfileData, $profile));
        }

        return $profile;
    }

    /**
     * Gets the item name.
     *
     * @param string $token
     *
     * @return string
     */
    private function getItemName($token)
    {
        $name = $token;

        if ($this->isItemNameValid($name)) {
            return $name;
        }

        return false;
    }

    /**
     * Gets the name of the index.
     *
     * @return string
     */
    private function getIndexName()
    {
        $name = 'index';

        if ($this->isItemNameValid($name)) {
            return $name;
        }

        return false;
    }

    private function isItemNameValid($name)
    {
        $length = strlen($name);

        if ($length > 2147483648) {
            throw new \RuntimeException(sprintf('The Redis item key "%s" is too long (%s bytes). Allowed maximum size is 2^31 bytes.', $name, $length));
        }

        return true;
    }

    /**
     * Retrieves an item from the Redis server.
     *
     * @param string $key
     * @param int    $serializer
     *
     * @return mixed
     */
    private function getValue($key, $serializer = self::REDIS_SERIALIZER_NONE)
    {
        $redis = $this->getRedis();
        $redis->setOption(self::REDIS_OPT_SERIALIZER, $serializer);

        return $redis->get($key);
    }

    /**
     * Stores an item on the Redis server under the specified key.
     *
     * @param string $key
     * @param mixed  $value
     * @param int    $expiration
     * @param int    $serializer
     *
     * @return Boolean
     */
    private function setValue($key, $value, $expiration = 0, $serializer = self::REDIS_SERIALIZER_NONE)
    {
        $redis = $this->getRedis();
        $redis->setOption(self::REDIS_OPT_SERIALIZER, $serializer);

        return $redis->setex($key, $expiration, $value);
    }

    /**
     * Appends data to an existing item on the Redis server.
     *
     * @param string $key
     * @param string $value
     * @param int    $expiration
     *
     * @return Boolean
     */
    private function appendValue($key, $value, $expiration = 0)
    {
        $redis = $this->getRedis();
        $redis->setOption(self::REDIS_OPT_SERIALIZER, self::REDIS_SERIALIZER_NONE);

        if ($redis->exists($key)) {
            $redis->append($key, $value);

            return $redis->setTimeout($key, $expiration);
        }

        return $redis->setex($key, $expiration, $value);
    }

    /**
     * Removes the specified keys.
     *
     * @param array $keys
     *
     * @return Boolean
     */
    private function delete(array $keys)
    {
        return (bool) $this->getRedis()->delete($keys);
    }
}
PK�^�\T��sX	X	Cpear/Symfony/Component/HttpKernel/Profiler/MysqlProfilerStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

/**
 * A ProfilerStorage for Mysql
 *
 * @author Jan Schumann <js@schumann-it.com>
 */
class MysqlProfilerStorage extends PdoProfilerStorage
{
    /**
     * {@inheritdoc}
     */
    protected function initDb()
    {
        if (null === $this->db) {
            if (0 !== strpos($this->dsn, 'mysql')) {
                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Mysql with an invalid dsn "%s". The expected format is "mysql:dbname=database_name;host=host_name".', $this->dsn));
            }

            if (!class_exists('PDO') || !in_array('mysql', \PDO::getAvailableDrivers(), true)) {
                throw new \RuntimeException('You need to enable PDO_Mysql extension for the profiler to run properly.');
            }

            $db = new \PDO($this->dsn, $this->username, $this->password);
            $db->exec('CREATE TABLE IF NOT EXISTS sf_profiler_data (token VARCHAR(255) PRIMARY KEY, data LONGTEXT, ip VARCHAR(64), method VARCHAR(6), url VARCHAR(255), time INTEGER UNSIGNED, parent VARCHAR(255), created_at INTEGER UNSIGNED, KEY (created_at), KEY (ip), KEY (method), KEY (url), KEY (parent))');

            $this->db = $db;
        }

        return $this->db;
    }

    /**
     * {@inheritdoc}
     */
    protected function buildCriteria($ip, $url, $start, $end, $limit, $method)
    {
        $criteria = array();
        $args = array();

        if ($ip = preg_replace('/[^\d\.]/', '', $ip)) {
            $criteria[] = 'ip LIKE :ip';
            $args[':ip'] = '%'.$ip.'%';
        }

        if ($url) {
            $criteria[] = 'url LIKE :url';
            $args[':url'] = '%'.addcslashes($url, '%_\\').'%';
        }

        if ($method) {
            $criteria[] = 'method = :method';
            $args[':method'] = $method;
        }

        if (!empty($start)) {
            $criteria[] = 'time >= :start';
            $args[':start'] = $start;
        }

        if (!empty($end)) {
            $criteria[] = 'time <= :end';
            $args[':end'] = $end;
        }

        return array($criteria, $args);
    }
}
PK�^�\�����Apear/Symfony/Component/HttpKernel/Profiler/PdoProfilerStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

/**
 * Base PDO storage for profiling information in a PDO database.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jan Schumann <js@schumann-it.com>
 */
abstract class PdoProfilerStorage implements ProfilerStorageInterface
{
    protected $dsn;
    protected $username;
    protected $password;
    protected $lifetime;
    protected $db;

    /**
     * Constructor.
     *
     * @param string  $dsn      A data source name
     * @param string  $username The username for the database
     * @param string  $password The password for the database
     * @param integer $lifetime The lifetime to use for the purge
     */
    public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
    {
        $this->dsn = $dsn;
        $this->username = $username;
        $this->password = $password;
        $this->lifetime = (int) $lifetime;
    }

    /**
     * {@inheritdoc}
     */
    public function find($ip, $url, $limit, $method, $start = null, $end = null)
    {
        if (null === $start) {
            $start = 0;
        }

        if (null === $end) {
            $end = time();
        }

        list($criteria, $args) = $this->buildCriteria($ip, $url, $start, $end, $limit, $method);

        $criteria = $criteria ? 'WHERE '.implode(' AND ', $criteria) : '';

        $db = $this->initDb();
        $tokens = $this->fetch($db, 'SELECT token, ip, method, url, time, parent FROM sf_profiler_data '.$criteria.' ORDER BY time DESC LIMIT '.((integer) $limit), $args);
        $this->close($db);

        return $tokens;
    }

    /**
     * {@inheritdoc}
     */
    public function read($token)
    {
        $db = $this->initDb();
        $args = array(':token' => $token);
        $data = $this->fetch($db, 'SELECT data, parent, ip, method, url, time FROM sf_profiler_data WHERE token = :token LIMIT 1', $args);
        $this->close($db);
        if (isset($data[0]['data'])) {
            return $this->createProfileFromData($token, $data[0]);
        }

        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function write(Profile $profile)
    {
        $db = $this->initDb();
        $args = array(
            ':token'      => $profile->getToken(),
            ':parent'     => $profile->getParentToken(),
            ':data'       => base64_encode(serialize($profile->getCollectors())),
            ':ip'         => $profile->getIp(),
            ':method'     => $profile->getMethod(),
            ':url'        => $profile->getUrl(),
            ':time'       => $profile->getTime(),
            ':created_at' => time(),
        );

        try {
            if ($this->has($profile->getToken())) {
                $this->exec($db, 'UPDATE sf_profiler_data SET parent = :parent, data = :data, ip = :ip, method = :method, url = :url, time = :time, created_at = :created_at WHERE token = :token', $args);
            } else {
                $this->exec($db, 'INSERT INTO sf_profiler_data (token, parent, data, ip, method, url, time, created_at) VALUES (:token, :parent, :data, :ip, :method, :url, :time, :created_at)', $args);
            }
            $this->cleanup();
            $status = true;
        } catch (\Exception $e) {
            $status = false;
        }

        $this->close($db);

        return $status;
    }

    /**
     * {@inheritdoc}
     */
    public function purge()
    {
        $db = $this->initDb();
        $this->exec($db, 'DELETE FROM sf_profiler_data');
        $this->close($db);
    }

    /**
     * Build SQL criteria to fetch records by ip and url
     *
     * @param string $ip     The IP
     * @param string $url    The URL
     * @param string $start  The start period to search from
     * @param string $end    The end period to search to
     * @param string $limit  The maximum number of tokens to return
     * @param string $method The request method
     *
     * @return array An array with (criteria, args)
     */
    abstract protected function buildCriteria($ip, $url, $start, $end, $limit, $method);

    /**
     * Initializes the database
     *
     * @throws \RuntimeException When the requested database driver is not installed
     */
    abstract protected function initDb();

    protected function cleanup()
    {
        $db = $this->initDb();
        $this->exec($db, 'DELETE FROM sf_profiler_data WHERE created_at < :time', array(':time' => time() - $this->lifetime));
        $this->close($db);
    }

    protected function exec($db, $query, array $args = array())
    {
        $stmt = $this->prepareStatement($db, $query);

        foreach ($args as $arg => $val) {
            $stmt->bindValue($arg, $val, is_int($val) ? \PDO::PARAM_INT : \PDO::PARAM_STR);
        }
        $success = $stmt->execute();
        if (!$success) {
            throw new \RuntimeException(sprintf('Error executing query "%s"', $query));
        }
    }

    protected function prepareStatement($db, $query)
    {
        try {
            $stmt = $db->prepare($query);
        } catch (\Exception $e) {
            $stmt = false;
        }

        if (false === $stmt) {
            throw new \RuntimeException('The database cannot successfully prepare the statement');
        }

        return $stmt;
    }

    protected function fetch($db, $query, array $args = array())
    {
        $stmt = $this->prepareStatement($db, $query);

        foreach ($args as $arg => $val) {
            $stmt->bindValue($arg, $val, is_int($val) ? \PDO::PARAM_INT : \PDO::PARAM_STR);
        }
        $stmt->execute();
        $return = $stmt->fetchAll(\PDO::FETCH_ASSOC);

        return $return;
    }

    protected function close($db)
    {
    }

    protected function createProfileFromData($token, $data, $parent = null)
    {
        $profile = new Profile($token);
        $profile->setIp($data['ip']);
        $profile->setMethod($data['method']);
        $profile->setUrl($data['url']);
        $profile->setTime($data['time']);
        $profile->setCollectors(unserialize(base64_decode($data['data'])));

        if (!$parent && !empty($data['parent'])) {
            $parent = $this->read($data['parent']);
        }

        if ($parent) {
            $profile->setParent($parent);
        }

        $profile->setChildren($this->readChildren($token, $profile));

        return $profile;
    }

    /**
     * Reads the child profiles for the given token.
     *
     * @param string $token  The parent token
     * @param string $parent The parent instance
     *
     * @return Profile[] An array of Profile instance
     */
    protected function readChildren($token, $parent)
    {
        $db = $this->initDb();
        $data = $this->fetch($db, 'SELECT token, data, ip, method, url, time FROM sf_profiler_data WHERE parent = :token', array(':token' => $token));
        $this->close($db);

        if (!$data) {
            return array();
        }

        $profiles = array();
        foreach ($data as $d) {
            $profiles[] = $this->createProfileFromData($d['token'], $d, $parent);
        }

        return $profiles;
    }

    /**
     * Returns whether data for the given token already exists in storage.
     *
     * @param string $token The profile token
     *
     * @return string
     */
    protected function has($token)
    {
        $db = $this->initDb();
        $tokenExists = $this->fetch($db, 'SELECT 1 FROM sf_profiler_data WHERE token = :token LIMIT 1', array(':token' => $token));
        $this->close($db);

        return !empty($tokenExists);
    }
}
PK�^�\B�WzllEpear/Symfony/Component/HttpKernel/Profiler/MongoDbProfilerStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

class MongoDbProfilerStorage implements ProfilerStorageInterface
{
    protected $dsn;
    protected $lifetime;
    private $mongo;

    /**
     * Constructor.
     *
     * @param string  $dsn      A data source name
     * @param string  $username Not used
     * @param string  $password Not used
     * @param integer $lifetime The lifetime to use for the purge
     */
    public function __construct($dsn, $username = '', $password = '', $lifetime = 86400)
    {
        $this->dsn = $dsn;
        $this->lifetime = (int) $lifetime;
    }

    /**
     * {@inheritdoc}
     */
    public function find($ip, $url, $limit, $method, $start = null, $end = null)
    {
        $cursor = $this->getMongo()->find($this->buildQuery($ip, $url, $method, $start, $end), array('_id', 'parent', 'ip', 'method', 'url', 'time'))->sort(array('time' => -1))->limit($limit);

        $tokens = array();
        foreach ($cursor as $profile) {
            $tokens[] = $this->getData($profile);
        }

        return $tokens;
    }

    /**
     * {@inheritdoc}
     */
    public function purge()
    {
        $this->getMongo()->remove(array());
    }

    /**
     * {@inheritdoc}
     */
    public function read($token)
    {
        $profile = $this->getMongo()->findOne(array('_id' => $token, 'data' => array('$exists' => true)));

        if (null !== $profile) {
            $profile = $this->createProfileFromData($this->getData($profile));
        }

        return $profile;
    }

    /**
     * {@inheritdoc}
     */
    public function write(Profile $profile)
    {
        $this->cleanup();

        $record = array(
            '_id' => $profile->getToken(),
            'parent' => $profile->getParentToken(),
            'data' => base64_encode(serialize($profile->getCollectors())),
            'ip' => $profile->getIp(),
            'method' => $profile->getMethod(),
            'url' => $profile->getUrl(),
            'time' => $profile->getTime()
        );

        $result = $this->getMongo()->update(array('_id' => $profile->getToken()), array_filter($record, function ($v) { return !empty($v); }), array('upsert' => true));

        return (boolean) (isset($result['ok']) ? $result['ok'] : $result);
    }

    /**
     * Internal convenience method that returns the instance of the MongoDB Collection
     *
     * @return \MongoCollection
     *
     * @throws \RuntimeException
     */
    protected function getMongo()
    {
        if (null !== $this->mongo) {
            return $this->mongo;
        }

        if (!$parsedDsn = $this->parseDsn($this->dsn)) {
            throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use MongoDB with an invalid dsn "%s". The expected format is "mongodb://[user:pass@]host/database/collection"', $this->dsn));
        }

        list($server, $database, $collection) = $parsedDsn;
        $mongoClass = version_compare(phpversion('mongo'), '1.3.0', '<') ? '\Mongo' : '\MongoClient';
        $mongo = new $mongoClass($server);

        return $this->mongo = $mongo->selectCollection($database, $collection);
    }

    /**
     * @param array $data
     *
     * @return Profile
     */
    protected function createProfileFromData(array $data)
    {
        $profile = $this->getProfile($data);

        if ($data['parent']) {
            $parent = $this->getMongo()->findOne(array('_id' => $data['parent'], 'data' => array('$exists' => true)));
            if ($parent) {
                $profile->setParent($this->getProfile($this->getData($parent)));
            }
        }

        $profile->setChildren($this->readChildren($data['token']));

        return $profile;
    }

    /**
     * @param string $token
     *
     * @return Profile[] An array of Profile instances
     */
    protected function readChildren($token)
    {
        $profiles = array();

        $cursor = $this->getMongo()->find(array('parent' => $token, 'data' => array('$exists' => true)));
        foreach ($cursor as $d) {
            $profiles[] = $this->getProfile($this->getData($d));
        }

        return $profiles;
    }

    protected function cleanup()
    {
        $this->getMongo()->remove(array('time' => array('$lt' => time() - $this->lifetime)));
    }

    /**
     * @param string $ip
     * @param string $url
     * @param string $method
     * @param int    $start
     * @param int    $end
     *
     * @return array
     */
    private function buildQuery($ip, $url, $method, $start, $end)
    {
        $query = array();

        if (!empty($ip)) {
            $query['ip'] = $ip;
        }

        if (!empty($url)) {
            $query['url'] = $url;
        }

        if (!empty($method)) {
            $query['method'] = $method;
        }

        if (!empty($start) || !empty($end)) {
            $query['time'] = array();
        }

        if (!empty($start)) {
            $query['time']['$gte'] = $start;
        }

        if (!empty($end)) {
            $query['time']['$lte'] = $end;
        }

        return $query;
    }

    /**
     * @param array $data
     *
     * @return array
     */
    private function getData(array $data)
    {
        return array(
            'token' => $data['_id'],
            'parent' => isset($data['parent']) ? $data['parent'] : null,
            'ip' => isset($data['ip']) ? $data['ip'] : null,
            'method' => isset($data['method']) ? $data['method'] : null,
            'url' => isset($data['url']) ? $data['url'] : null,
            'time' => isset($data['time']) ? $data['time'] : null,
            'data' => isset($data['data']) ? $data['data'] : null,
        );
    }

    /**
     * @param array $data
     *
     * @return Profile
     */
    private function getProfile(array $data)
    {
        $profile = new Profile($data['token']);
        $profile->setIp($data['ip']);
        $profile->setMethod($data['method']);
        $profile->setUrl($data['url']);
        $profile->setTime($data['time']);
        $profile->setCollectors(unserialize(base64_decode($data['data'])));

        return $profile;
    }

    /**
     * @param string $dsn
     *
     * @return null|array Array($server, $database, $collection)
     */
    private function parseDsn($dsn)
    {
        if (!preg_match('#^(mongodb://.*)/(.*)/(.*)$#', $dsn, $matches)) {
            return;
        }

        $server = $matches[1];
        $database = $matches[2];
        $collection = $matches[3];
        preg_match('#^mongodb://(([^:]+):?(.*)(?=@))?@?([^/]*)(.*)$#', $server, $matchesServer);

        if ('' == $matchesServer[5] && '' != $matches[2]) {
            $server .= '/'.$matches[2];
        }

        return array($server, $database, $collection);
    }
}
PK�^�\$���	�	Gpear/Symfony/Component/HttpKernel/Profiler/MemcachedProfilerStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

/**
 * Memcached Profiler Storage
 *
 * @author Andrej Hudec <pulzarraider@gmail.com>
 */
class MemcachedProfilerStorage extends BaseMemcacheProfilerStorage
{
    /**
     * @var \Memcached
     */
    private $memcached;

    /**
     * Internal convenience method that returns the instance of the Memcached
     *
     * @return \Memcached
     *
     * @throws \RuntimeException
     */
    protected function getMemcached()
    {
        if (null === $this->memcached) {
            if (!preg_match('#^memcached://(?(?=\[.*\])\[(.*)\]|(.*)):(.*)$#', $this->dsn, $matches)) {
                throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use Memcached with an invalid dsn "%s". The expected format is "memcached://[host]:port".', $this->dsn));
            }

            $host = $matches[1] ?: $matches[2];
            $port = $matches[3];

            $memcached = new \Memcached();

            // disable compression to allow appending
            $memcached->setOption(\Memcached::OPT_COMPRESSION, false);

            $memcached->addServer($host, $port);

            $this->memcached = $memcached;
        }

        return $this->memcached;
    }

    /**
     * Set instance of the Memcached
     *
     * @param \Memcached $memcached
     */
    public function setMemcached($memcached)
    {
        $this->memcached = $memcached;
    }

    /**
     * {@inheritdoc}
     */
    protected function getValue($key)
    {
        return $this->getMemcached()->get($key);
    }

    /**
     * {@inheritdoc}
     */
    protected function setValue($key, $value, $expiration = 0)
    {
        return $this->getMemcached()->set($key, $value, time() + $expiration);
    }

    /**
     * {@inheritdoc}
     */
    protected function delete($key)
    {
        return $this->getMemcached()->delete($key);
    }

    /**
     * {@inheritdoc}
     */
    protected function appendValue($key, $value, $expiration = 0)
    {
        $memcached = $this->getMemcached();

        if (!$result = $memcached->append($key, $value)) {
            return $memcached->set($key, $value, $expiration);
        }

        return $result;
    }
}
PK�^�\\Y�`��Bpear/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.phpnu�[���<?php
/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Profiler;

/**
 * Storage for profiler using files.
 *
 * @author Alexandre Salomé <alexandre.salome@gmail.com>
 */
class FileProfilerStorage implements ProfilerStorageInterface
{
    /**
     * Folder where profiler data are stored.
     *
     * @var string
     */
    private $folder;

    /**
     * Constructs the file storage using a "dsn-like" path.
     *
     * Example : "file:/path/to/the/storage/folder"
     *
     * @param string $dsn The DSN
     *
     * @throws \RuntimeException
     */
    public function __construct($dsn)
    {
        if (0 !== strpos($dsn, 'file:')) {
            throw new \RuntimeException(sprintf('Please check your configuration. You are trying to use FileStorage with an invalid dsn "%s". The expected format is "file:/path/to/the/storage/folder".', $dsn));
        }
        $this->folder = substr($dsn, 5);

        if (!is_dir($this->folder)) {
            mkdir($this->folder, 0777, true);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function find($ip, $url, $limit, $method, $start = null, $end = null)
    {
        $file = $this->getIndexFilename();

        if (!file_exists($file)) {
            return array();
        }

        $file = fopen($file, 'r');
        fseek($file, 0, SEEK_END);

        $result = array();
        while (count($result) < $limit && $line = $this->readLineFromFile($file)) {
            list($csvToken, $csvIp, $csvMethod, $csvUrl, $csvTime, $csvParent) = str_getcsv($line);

            $csvTime = (int) $csvTime;

            if ($ip && false === strpos($csvIp, $ip) || $url && false === strpos($csvUrl, $url) || $method && false === strpos($csvMethod, $method)) {
                continue;
            }

            if (!empty($start) && $csvTime < $start) {
                continue;
            }

            if (!empty($end) && $csvTime > $end) {
                continue;
            }

            $result[$csvToken] = array(
                'token'  => $csvToken,
                'ip'     => $csvIp,
                'method' => $csvMethod,
                'url'    => $csvUrl,
                'time'   => $csvTime,
                'parent' => $csvParent,
            );
        }

        fclose($file);

        return array_values($result);
    }

    /**
     * {@inheritdoc}
     */
    public function purge()
    {
        $flags = \FilesystemIterator::SKIP_DOTS;
        $iterator = new \RecursiveDirectoryIterator($this->folder, $flags);
        $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::CHILD_FIRST);

        foreach ($iterator as $file) {
            if (is_file($file)) {
                unlink($file);
            } else {
                rmdir($file);
            }
        }
    }

    /**
     * {@inheritdoc}
     */
    public function read($token)
    {
        if (!$token || !file_exists($file = $this->getFilename($token))) {
            return null;
        }

        return $this->createProfileFromData($token, unserialize(file_get_contents($file)));
    }

    /**
     * {@inheritdoc}
     */
    public function write(Profile $profile)
    {
        $file = $this->getFilename($profile->getToken());

        $profileIndexed = is_file($file);
        if (!$profileIndexed) {
            // Create directory
            $dir = dirname($file);
            if (!is_dir($dir)) {
                mkdir($dir, 0777, true);
            }
        }

        // Store profile
        $data = array(
            'token'    => $profile->getToken(),
            'parent'   => $profile->getParentToken(),
            'children' => array_map(function ($p) { return $p->getToken(); }, $profile->getChildren()),
            'data'     => $profile->getCollectors(),
            'ip'       => $profile->getIp(),
            'method'   => $profile->getMethod(),
            'url'      => $profile->getUrl(),
            'time'     => $profile->getTime(),
        );

        if (false === file_put_contents($file, serialize($data))) {
            return false;
        }

        if (!$profileIndexed) {
            // Add to index
            if (false === $file = fopen($this->getIndexFilename(), 'a')) {
                return false;
            }

            fputcsv($file, array(
                $profile->getToken(),
                $profile->getIp(),
                $profile->getMethod(),
                $profile->getUrl(),
                $profile->getTime(),
                $profile->getParentToken(),
            ));
            fclose($file);
        }

        return true;
    }

    /**
     * Gets filename to store data, associated to the token.
     *
     * @param string $token
     *
     * @return string The profile filename
     */
    protected function getFilename($token)
    {
        // Uses 4 last characters, because first are mostly the same.
        $folderA = substr($token, -2, 2);
        $folderB = substr($token, -4, 2);

        return $this->folder.'/'.$folderA.'/'.$folderB.'/'.$token;
    }

    /**
     * Gets the index filename.
     *
     * @return string The index filename
     */
    protected function getIndexFilename()
    {
        return $this->folder.'/index.csv';
    }

    /**
     * Reads a line in the file, backward.
     *
     * This function automatically skips the empty lines and do not include the line return in result value.
     *
     * @param resource $file The file resource, with the pointer placed at the end of the line to read
     *
     * @return mixed A string representing the line or null if beginning of file is reached
     */
    protected function readLineFromFile($file)
    {
        $line = '';
        $position = ftell($file);

        if (0 === $position) {
            return null;
        }

        while (true) {
            $chunkSize = min($position, 1024);
            $position -= $chunkSize;
            fseek($file, $position);

            if (0 === $chunkSize) {
                // bof reached
                break;
            }

            $buffer = fread($file, $chunkSize);

            if (false === ($upTo = strrpos($buffer, "\n"))) {
                $line = $buffer.$line;
                continue;
            }

            $position += $upTo;
            $line = substr($buffer, $upTo + 1).$line;
            fseek($file, max(0, $position), SEEK_SET);

            if ('' !== $line) {
                break;
            }
        }

        return '' === $line ? null : $line;
    }

    protected function createProfileFromData($token, $data, $parent = null)
    {
        $profile = new Profile($token);
        $profile->setIp($data['ip']);
        $profile->setMethod($data['method']);
        $profile->setUrl($data['url']);
        $profile->setTime($data['time']);
        $profile->setCollectors($data['data']);

        if (!$parent && $data['parent']) {
            $parent = $this->read($data['parent']);
        }

        if ($parent) {
            $profile->setParent($parent);
        }

        foreach ($data['children'] as $token) {
            if (!$token || !file_exists($file = $this->getFilename($token))) {
                continue;
            }

            $profile->addChild($this->createProfileFromData($token, unserialize(file_get_contents($file)), $profile));
        }

        return $profile;
    }
}
PK�^�\_��S77Fpear/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\CacheWarmer;

/**
 * Interface for classes able to warm up the cache.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface CacheWarmerInterface extends WarmableInterface
{
    /**
     * Checks whether this warmer is optional or not.
     *
     * Optional warmers can be ignored on certain conditions.
     *
     * A warmer should return true if the cache can be
     * generated incrementally and on-demand.
     *
     * @return Boolean true if the warmer is optional, false otherwise
     */
    public function isOptional();
}
PK�^�\��8ee=pear/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\CacheWarmer;

/**
 * Abstract cache warmer that knows how to write a file to the cache.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class CacheWarmer implements CacheWarmerInterface
{
    protected function writeCacheFile($file, $content)
    {
        $tmpFile = tempnam(dirname($file), basename($file));
        if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $file)) {
            @chmod($file, 0666 & ~umask());

            return;
        }

        throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $file));
    }
}
PK�^�\�R�!MMFpear/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\CacheWarmer;

/**
 * Aggregates several cache warmers into a single one.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class CacheWarmerAggregate implements CacheWarmerInterface
{
    protected $warmers = array();
    protected $optionalsEnabled = false;

    public function __construct(array $warmers = array())
    {
        foreach ($warmers as $warmer) {
            $this->add($warmer);
        }
    }

    public function enableOptionalWarmers()
    {
        $this->optionalsEnabled = true;
    }

    /**
     * Warms up the cache.
     *
     * @param string $cacheDir The cache directory
     */
    public function warmUp($cacheDir)
    {
        foreach ($this->warmers as $warmer) {
            if (!$this->optionalsEnabled && $warmer->isOptional()) {
                continue;
            }

            $warmer->warmUp($cacheDir);
        }
    }

    /**
     * Checks whether this warmer is optional or not.
     *
     * @return Boolean always true
     */
    public function isOptional()
    {
        return false;
    }

    public function setWarmers(array $warmers)
    {
        $this->warmers = array();
        foreach ($warmers as $warmer) {
            $this->add($warmer);
        }
    }

    public function add(CacheWarmerInterface $warmer)
    {
        $this->warmers[] = $warmer;
    }
}
PK�^�\���^FFCpear/Symfony/Component/HttpKernel/CacheWarmer/WarmableInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\CacheWarmer;

/**
 * Interface for classes that support warming their cache.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface WarmableInterface
{
    /**
     * Warms up the cache.
     *
     * @param string $cacheDir The cache directory
     */
    public function warmUp($cacheDir);
}
PK�^�\�3�a��<pear/Symfony/Component/HttpKernel/Bundle/BundleInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Bundle;

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;

/**
 * BundleInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface BundleInterface extends ContainerAwareInterface
{
    /**
     * Boots the Bundle.
     *
     * @api
     */
    public function boot();

    /**
     * Shutdowns the Bundle.
     *
     * @api
     */
    public function shutdown();

    /**
     * Builds the bundle.
     *
     * It is only ever called once when the cache is empty.
     *
     * @param ContainerBuilder $container A ContainerBuilder instance
     *
     * @api
     */
    public function build(ContainerBuilder $container);

    /**
     * Returns the container extension that should be implicitly loaded.
     *
     * @return ExtensionInterface|null The default extension or null if there is none
     *
     * @api
     */
    public function getContainerExtension();

    /**
     * Returns the bundle name that this bundle overrides.
     *
     * Despite its name, this method does not imply any parent/child relationship
     * between the bundles, just a way to extend and override an existing
     * bundle.
     *
     * @return string The Bundle name it overrides or null if no parent
     *
     * @api
     */
    public function getParent();

    /**
     * Returns the bundle name (the class short name).
     *
     * @return string The Bundle name
     *
     * @api
     */
    public function getName();

    /**
     * Gets the Bundle namespace.
     *
     * @return string The Bundle namespace
     *
     * @api
     */
    public function getNamespace();

    /**
     * Gets the Bundle directory path.
     *
     * The path should always be returned as a Unix path (with /).
     *
     * @return string The Bundle absolute path
     *
     * @api
     */
    public function getPath();
}
PK�^�\!���ll3pear/Symfony/Component/HttpKernel/Bundle/Bundle.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Bundle;

use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\Console\Application;
use Symfony\Component\Finder\Finder;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;

/**
 * An implementation of BundleInterface that adds a few conventions
 * for DependencyInjection extensions and Console commands.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
abstract class Bundle extends ContainerAware implements BundleInterface
{
    protected $name;
    protected $extension;
    protected $path;

    /**
     * Boots the Bundle.
     */
    public function boot()
    {
    }

    /**
     * Shutdowns the Bundle.
     */
    public function shutdown()
    {
    }

    /**
     * Builds the bundle.
     *
     * It is only ever called once when the cache is empty.
     *
     * This method can be overridden to register compilation passes,
     * other extensions, ...
     *
     * @param ContainerBuilder $container A ContainerBuilder instance
     */
    public function build(ContainerBuilder $container)
    {
    }

    /**
     * Returns the bundle's container extension.
     *
     * @return ExtensionInterface|null The container extension
     *
     * @throws \LogicException
     *
     * @api
     */
    public function getContainerExtension()
    {
        if (null === $this->extension) {
            $basename = preg_replace('/Bundle$/', '', $this->getName());

            $class = $this->getNamespace().'\\DependencyInjection\\'.$basename.'Extension';
            if (class_exists($class)) {
                $extension = new $class();

                // check naming convention
                $expectedAlias = Container::underscore($basename);
                if ($expectedAlias != $extension->getAlias()) {
                    throw new \LogicException(sprintf(
                        'The extension alias for the default extension of a '.
                        'bundle must be the underscored version of the '.
                        'bundle name ("%s" instead of "%s")',
                        $expectedAlias, $extension->getAlias()
                    ));
                }

                $this->extension = $extension;
            } else {
                $this->extension = false;
            }
        }

        if ($this->extension) {
            return $this->extension;
        }
    }

    /**
     * Gets the Bundle namespace.
     *
     * @return string The Bundle namespace
     *
     * @api
     */
    public function getNamespace()
    {
        $class = get_class($this);

        return substr($class, 0, strrpos($class, '\\'));
    }

    /**
     * Gets the Bundle directory path.
     *
     * @return string The Bundle absolute path
     *
     * @api
     */
    public function getPath()
    {
        if (null === $this->path) {
            $reflected = new \ReflectionObject($this);
            $this->path = dirname($reflected->getFileName());
        }

        return $this->path;
    }

    /**
     * Returns the bundle parent name.
     *
     * @return string The Bundle parent name it overrides or null if no parent
     *
     * @api
     */
    public function getParent()
    {
        return null;
    }

    /**
     * Returns the bundle name (the class short name).
     *
     * @return string The Bundle name
     *
     * @api
     */
    final public function getName()
    {
        if (null !== $this->name) {
            return $this->name;
        }

        $name = get_class($this);
        $pos = strrpos($name, '\\');

        return $this->name = false === $pos ? $name : substr($name, $pos + 1);
    }

    /**
     * Finds and registers Commands.
     *
     * Override this method if your bundle commands do not follow the conventions:
     *
     * * Commands are in the 'Command' sub-directory
     * * Commands extend Symfony\Component\Console\Command\Command
     *
     * @param Application $application An Application instance
     */
    public function registerCommands(Application $application)
    {
        if (!is_dir($dir = $this->getPath().'/Command')) {
            return;
        }

        $finder = new Finder();
        $finder->files()->name('*Command.php')->in($dir);

        $prefix = $this->getNamespace().'\\Command';
        foreach ($finder as $file) {
            $ns = $prefix;
            if ($relativePath = $file->getRelativePath()) {
                $ns .= '\\'.strtr($relativePath, '/', '\\');
            }
            $class = $ns.'\\'.$file->getBasename('.php');
            if ($this->container) {
                $alias = 'console.command.'.strtolower(str_replace('\\', '_', $class));
                if ($this->container->has($alias)) {
                    continue;
                }
            }
            $r = new \ReflectionClass($class);
            if ($r->isSubclassOf('Symfony\\Component\\Console\\Command\\Command') && !$r->isAbstract() && !$r->getConstructor()->getNumberOfRequiredParameters()) {
                $application->add($r->newInstance());
            }
        }
    }
}
PK�^�\N�#�FF,pear/Symfony/Component/HttpKernel/Client.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel;

use Symfony\Component\BrowserKit\Client as BaseClient;
use Symfony\Component\BrowserKit\Request as DomRequest;
use Symfony\Component\BrowserKit\Response as DomResponse;
use Symfony\Component\BrowserKit\Cookie as DomCookie;
use Symfony\Component\BrowserKit\History;
use Symfony\Component\BrowserKit\CookieJar;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Client simulates a browser and makes requests to a Kernel object.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Client extends BaseClient
{
    protected $kernel;

    /**
     * Constructor.
     *
     * @param HttpKernelInterface $kernel    An HttpKernel instance
     * @param array               $server    The server parameters (equivalent of $_SERVER)
     * @param History             $history   A History instance to store the browser history
     * @param CookieJar           $cookieJar A CookieJar instance to store the cookies
     */
    public function __construct(HttpKernelInterface $kernel, array $server = array(), History $history = null, CookieJar $cookieJar = null)
    {
        // These class properties must be set before calling the parent constructor, as it may depend on it.
        $this->kernel = $kernel;
        $this->followRedirects = false;

        parent::__construct($server, $history, $cookieJar);
    }

    /**
     * {@inheritdoc}
     *
     * @return Request|null A Request instance
     */
    public function getRequest()
    {
        return parent::getRequest();
    }

    /**
     * {@inheritdoc}
     *
     * @return Response|null A Response instance
     */
    public function getResponse()
    {
        return parent::getResponse();
    }

    /**
     * Makes a request.
     *
     * @param Request $request A Request instance
     *
     * @return Response A Response instance
     */
    protected function doRequest($request)
    {
        $response = $this->kernel->handle($request);

        if ($this->kernel instanceof TerminableInterface) {
            $this->kernel->terminate($request, $response);
        }

        return $response;
    }

    /**
     * Returns the script to execute when the request must be insulated.
     *
     * @param Request $request A Request instance
     *
     * @return string
     */
    protected function getScript($request)
    {
        $kernel = str_replace("'", "\\'", serialize($this->kernel));
        $request = str_replace("'", "\\'", serialize($request));

        $r = new \ReflectionClass('\\Symfony\\Component\\ClassLoader\\ClassLoader');
        $requirePath = str_replace("'", "\\'", $r->getFileName());
        $symfonyPath = str_replace("'", "\\'", realpath(__DIR__.'/../../..'));

        $code = <<<EOF
<?php

require_once '$requirePath';

\$loader = new Symfony\Component\ClassLoader\ClassLoader();
\$loader->addPrefix('Symfony', '$symfonyPath');
\$loader->register();

\$kernel = unserialize('$kernel');
\$request = unserialize('$request');
EOF;

        return $code.$this->getHandleScript();
    }

    protected function getHandleScript()
    {
        return <<<'EOF'
$response = $kernel->handle($request);

if ($kernel instanceof Symfony\Component\HttpKernel\TerminableInterface) {
    $kernel->terminate($request, $response);
}

echo serialize($response);
EOF;
    }

    /**
     * Converts the BrowserKit request to a HttpKernel request.
     *
     * @param DomRequest $request A DomRequest instance
     *
     * @return Request A Request instance
     */
    protected function filterRequest(DomRequest $request)
    {
        $httpRequest = Request::create($request->getUri(), $request->getMethod(), $request->getParameters(), $request->getCookies(), $request->getFiles(), $request->getServer(), $request->getContent());

        $httpRequest->files->replace($this->filterFiles($httpRequest->files->all()));

        return $httpRequest;
    }

    /**
     * Filters an array of files.
     *
     * This method created test instances of UploadedFile so that the move()
     * method can be called on those instances.
     *
     * If the size of a file is greater than the allowed size (from php.ini) then
     * an invalid UploadedFile is returned with an error set to UPLOAD_ERR_INI_SIZE.
     *
     * @see Symfony\Component\HttpFoundation\File\UploadedFile
     *
     * @param array $files An array of files
     *
     * @return array An array with all uploaded files marked as already moved
     */
    protected function filterFiles(array $files)
    {
        $filtered = array();
        foreach ($files as $key => $value) {
            if (is_array($value)) {
                $filtered[$key] = $this->filterFiles($value);
            } elseif ($value instanceof UploadedFile) {
                if ($value->isValid() && $value->getSize() > UploadedFile::getMaxFilesize()) {
                    $filtered[$key] = new UploadedFile(
                        '',
                        $value->getClientOriginalName(),
                        $value->getClientMimeType(),
                        0,
                        UPLOAD_ERR_INI_SIZE,
                        true
                    );
                } else {
                    $filtered[$key] = new UploadedFile(
                        $value->getPathname(),
                        $value->getClientOriginalName(),
                        $value->getClientMimeType(),
                        $value->getClientSize(),
                        $value->getError(),
                        true
                    );
                }
            } else {
                $filtered[$key] = $value;
            }
        }

        return $filtered;
    }

    /**
     * Converts the HttpKernel response to a BrowserKit response.
     *
     * @param Response $response A Response instance
     *
     * @return DomResponse A DomResponse instance
     */
    protected function filterResponse($response)
    {
        $headers = $response->headers->all();
        if ($response->headers->getCookies()) {
            $cookies = array();
            foreach ($response->headers->getCookies() as $cookie) {
                $cookies[] = new DomCookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
            }
            $headers['Set-Cookie'] = $cookies;
        }

        // this is needed to support StreamedResponse
        ob_start();
        $response->sendContent();
        $content = ob_get_clean();

        return new DomResponse($content, $response->getStatusCode(), $headers);
    }
}
PK�^�\&!#ffYpear/Symfony/Component/HttpKernel/DependencyInjection/MergeExtensionConfigurationPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\MergeExtensionConfigurationPass as BaseMergeExtensionConfigurationPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Ensures certain extensions are always loaded.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 */
class MergeExtensionConfigurationPass extends BaseMergeExtensionConfigurationPass
{
    private $extensions;

    public function __construct(array $extensions)
    {
        $this->extensions = $extensions;
    }

    public function process(ContainerBuilder $container)
    {
        foreach ($this->extensions as $extension) {
            if (!count($container->getExtensionConfig($extension))) {
                $container->loadFromExtension($extension, array());
            }
        }

        parent::process($container);
    }
}
PK�^�\�k���Opear/Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;

/**
 * Compiler pass to register tagged services for an event dispatcher.
 */
class RegisterListenersPass implements CompilerPassInterface
{
    /**
     * @var string
     */
    protected $dispatcherService;

    /**
     * @var string
     */
    protected $listenerTag;

    /**
     * @var string
     */
    protected $subscriberTag;

    /**
     * Constructor.
     *
     * @param string $dispatcherService Service name of the event dispatcher in processed container
     * @param string $listenerTag       Tag name used for listener
     * @param string $subscriberTag     Tag name used for subscribers
     */
    public function __construct($dispatcherService = 'event_dispatcher', $listenerTag = 'kernel.event_listener', $subscriberTag = 'kernel.event_subscriber')
    {
        $this->dispatcherService = $dispatcherService;
        $this->listenerTag = $listenerTag;
        $this->subscriberTag = $subscriberTag;
    }

    public function process(ContainerBuilder $container)
    {
        if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) {
            return;
        }

        $definition = $container->findDefinition($this->dispatcherService);

        foreach ($container->findTaggedServiceIds($this->listenerTag) as $id => $events) {
            $def = $container->getDefinition($id);
            if (!$def->isPublic()) {
                throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event listeners are lazy-loaded.', $id));
            }

            if ($def->isAbstract()) {
                throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event listeners are lazy-loaded.', $id));
            }

            foreach ($events as $event) {
                $priority = isset($event['priority']) ? $event['priority'] : 0;

                if (!isset($event['event'])) {
                    throw new \InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag));
                }

                if (!isset($event['method'])) {
                    $event['method'] = 'on'.preg_replace_callback(array(
                        '/(?<=\b)[a-z]/i',
                        '/[^a-z0-9]/i',
                    ), function ($matches) { return strtoupper($matches[0]); }, $event['event']);
                    $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']);
                }

                $definition->addMethodCall('addListenerService', array($event['event'], array($id, $event['method']), $priority));
            }
        }

        foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) {
            $def = $container->getDefinition($id);
            if (!$def->isPublic()) {
                throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event subscribers are lazy-loaded.', $id));
            }

            // We must assume that the class value has been correctly filled, even if the service is created by a factory
            $class = $def->getClass();

            $refClass = new \ReflectionClass($class);
            $interface = 'Symfony\Component\EventDispatcher\EventSubscriberInterface';
            if (!$refClass->implementsInterface($interface)) {
                throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface));
            }

            $definition->addMethodCall('addSubscriberService', array($id, $class));
        }
    }
}
PK�^�\���u__Opear/Symfony/Component/HttpKernel/DependencyInjection/ConfigurableExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * This extension sub-class provides first-class integration with the
 * Config/Definition Component.
 *
 * You can use this as base class if you
 *
 *    a) use the Config/Definition component for configuration
 *    b) your configuration class is named "Configuration" and
 *    c) the configuration class resides in the DependencyInjection sub-folder
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
abstract class ConfigurableExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    final public function load(array $configs, ContainerBuilder $container)
    {
        $this->loadInternal($this->processConfiguration($this->getConfiguration($configs, $container), $configs), $container);
    }

    /**
     * Configures the passed container according to the merged configuration.
     *
     * @param array            $mergedConfig
     * @param ContainerBuilder $container
     */
    abstract protected function loadInternal(array $mergedConfig, ContainerBuilder $container);
}
PK�^�\QNR��Opear/Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\HttpKernel\Kernel;

/**
 * Sets the classes to compile in the cache for the container.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class AddClassesToCachePass implements CompilerPassInterface
{
    private $kernel;

    public function __construct(Kernel $kernel)
    {
        $this->kernel = $kernel;
    }

    /**
     * {@inheritDoc}
     */
    public function process(ContainerBuilder $container)
    {
        $classes = array();
        foreach ($container->getExtensions() as $extension) {
            if ($extension instanceof Extension) {
                $classes = array_merge($classes, $extension->getClassesToCompile());
            }
        }

        $this->kernel->setClassCache(array_unique($container->getParameterBag()->resolveValue($classes)));
    }
}
PK�^�\�6�V
V
Rpear/Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Scope;

/**
 * Adds a managed request scope.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ContainerAwareHttpKernel extends HttpKernel
{
    protected $container;

    /**
     * Constructor.
     *
     * @param EventDispatcherInterface    $dispatcher         An EventDispatcherInterface instance
     * @param ContainerInterface          $container          A ContainerInterface instance
     * @param ControllerResolverInterface $controllerResolver A ControllerResolverInterface instance
     * @param RequestStack                $requestStack       A stack for master/sub requests
     */
    public function __construct(EventDispatcherInterface $dispatcher, ContainerInterface $container, ControllerResolverInterface $controllerResolver, RequestStack $requestStack = null)
    {
        parent::__construct($dispatcher, $controllerResolver, $requestStack);

        $this->container = $container;

        // the request scope might have been created before (see FrameworkBundle)
        if (!$container->hasScope('request')) {
            $container->addScope(new Scope('request'));
        }
    }

    /**
     * {@inheritdoc}
     */
    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        $request->headers->set('X-Php-Ob-Level', ob_get_level());

        $this->container->enterScope('request');
        $this->container->set('request', $request, 'request');

        try {
            $response = parent::handle($request, $type, $catch);
        } catch (\Exception $e) {
            $this->container->set('request', null, 'request');
            $this->container->leaveScope('request');

            throw $e;
        }

        $this->container->set('request', null, 'request');
        $this->container->leaveScope('request');

        return $response;
    }
}
PK�^�\;��M��Cpear/Symfony/Component/HttpKernel/DependencyInjection/Extension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DependencyInjection;

use Symfony\Component\DependencyInjection\Extension\Extension as BaseExtension;

/**
 * Allow adding classes to the class cache.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Extension extends BaseExtension
{
    private $classes = array();

    /**
     * Gets the classes to cache.
     *
     * @return array An array of classes
     */
    public function getClassesToCompile()
    {
        return $this->classes;
    }

    /**
     * Adds classes to the class cache.
     *
     * @param array $classes An array of classes
     */
    public function addClassesToCompile(array $classes)
    {
        $this->classes = array_merge($this->classes, $classes);
    }
}
PK�^�\�?.��\�\,pear/Symfony/Component/HttpKernel/Kernel.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel;

use Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator;
use Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Bundle\BundleInterface;
use Symfony\Component\HttpKernel\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass;
use Symfony\Component\HttpKernel\DependencyInjection\AddClassesToCachePass;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\ConfigCache;
use Symfony\Component\ClassLoader\ClassCollectionLoader;

/**
 * The Kernel is the heart of the Symfony system.
 *
 * It manages an environment made of bundles.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
abstract class Kernel implements KernelInterface, TerminableInterface
{
    /**
     * @var BundleInterface[]
     */
    protected $bundles = array();

    protected $bundleMap;
    protected $container;
    protected $rootDir;
    protected $environment;
    protected $debug;
    protected $booted = false;
    protected $name;
    protected $startTime;
    protected $loadClassCache;

    const VERSION         = '2.4.3';
    const VERSION_ID      = '20403';
    const MAJOR_VERSION   = '2';
    const MINOR_VERSION   = '4';
    const RELEASE_VERSION = '3';
    const EXTRA_VERSION   = '';

    /**
     * Constructor.
     *
     * @param string  $environment The environment
     * @param Boolean $debug       Whether to enable debugging or not
     *
     * @api
     */
    public function __construct($environment, $debug)
    {
        $this->environment = $environment;
        $this->debug = (Boolean) $debug;
        $this->rootDir = $this->getRootDir();
        $this->name = $this->getName();

        if ($this->debug) {
            $this->startTime = microtime(true);
        }

        $this->init();
    }

    /**
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Move your logic in the constructor instead.
     */
    public function init()
    {
    }

    public function __clone()
    {
        if ($this->debug) {
            $this->startTime = microtime(true);
        }

        $this->booted = false;
        $this->container = null;
    }

    /**
     * Boots the current kernel.
     *
     * @api
     */
    public function boot()
    {
        if (true === $this->booted) {
            return;
        }

        if ($this->loadClassCache) {
            $this->doLoadClassCache($this->loadClassCache[0], $this->loadClassCache[1]);
        }

        // init bundles
        $this->initializeBundles();

        // init container
        $this->initializeContainer();

        foreach ($this->getBundles() as $bundle) {
            $bundle->setContainer($this->container);
            $bundle->boot();
        }

        $this->booted = true;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function terminate(Request $request, Response $response)
    {
        if (false === $this->booted) {
            return;
        }

        if ($this->getHttpKernel() instanceof TerminableInterface) {
            $this->getHttpKernel()->terminate($request, $response);
        }
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function shutdown()
    {
        if (false === $this->booted) {
            return;
        }

        $this->booted = false;

        foreach ($this->getBundles() as $bundle) {
            $bundle->shutdown();
            $bundle->setContainer(null);
        }

        $this->container = null;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        if (false === $this->booted) {
            $this->boot();
        }

        return $this->getHttpKernel()->handle($request, $type, $catch);
    }

    /**
     * Gets a HTTP kernel from the container
     *
     * @return HttpKernel
     */
    protected function getHttpKernel()
    {
        return $this->container->get('http_kernel');
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getBundles()
    {
        return $this->bundles;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function isClassInActiveBundle($class)
    {
        foreach ($this->getBundles() as $bundle) {
            if (0 === strpos($class, $bundle->getNamespace())) {
                return true;
            }
        }

        return false;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getBundle($name, $first = true)
    {
        if (!isset($this->bundleMap[$name])) {
            throw new \InvalidArgumentException(sprintf('Bundle "%s" does not exist or it is not enabled. Maybe you forgot to add it in the registerBundles() method of your %s.php file?', $name, get_class($this)));
        }

        if (true === $first) {
            return $this->bundleMap[$name][0];
        }

        return $this->bundleMap[$name];
    }

    /**
     * Returns the file path for a given resource.
     *
     * A Resource can be a file or a directory.
     *
     * The resource name must follow the following pattern:
     *
     *     @<BundleName>/path/to/a/file.something
     *
     * where BundleName is the name of the bundle
     * and the remaining part is the relative path in the bundle.
     *
     * If $dir is passed, and the first segment of the path is "Resources",
     * this method will look for a file named:
     *
     *     $dir/<BundleName>/path/without/Resources
     *
     * before looking in the bundle resource folder.
     *
     * @param string  $name  A resource name to locate
     * @param string  $dir   A directory where to look for the resource first
     * @param Boolean $first Whether to return the first path or paths for all matching bundles
     *
     * @return string|array The absolute path of the resource or an array if $first is false
     *
     * @throws \InvalidArgumentException if the file cannot be found or the name is not valid
     * @throws \RuntimeException         if the name contains invalid/unsafe
     * @throws \RuntimeException         if a custom resource is hidden by a resource in a derived bundle
     *
     * @api
     */
    public function locateResource($name, $dir = null, $first = true)
    {
        if ('@' !== $name[0]) {
            throw new \InvalidArgumentException(sprintf('A resource name must start with @ ("%s" given).', $name));
        }

        if (false !== strpos($name, '..')) {
            throw new \RuntimeException(sprintf('File name "%s" contains invalid characters (..).', $name));
        }

        $bundleName = substr($name, 1);
        $path = '';
        if (false !== strpos($bundleName, '/')) {
            list($bundleName, $path) = explode('/', $bundleName, 2);
        }

        $isResource = 0 === strpos($path, 'Resources') && null !== $dir;
        $overridePath = substr($path, 9);
        $resourceBundle = null;
        $bundles = $this->getBundle($bundleName, false);
        $files = array();

        foreach ($bundles as $bundle) {
            if ($isResource && file_exists($file = $dir.'/'.$bundle->getName().$overridePath)) {
                if (null !== $resourceBundle) {
                    throw new \RuntimeException(sprintf('"%s" resource is hidden by a resource from the "%s" derived bundle. Create a "%s" file to override the bundle resource.',
                        $file,
                        $resourceBundle,
                        $dir.'/'.$bundles[0]->getName().$overridePath
                    ));
                }

                if ($first) {
                    return $file;
                }
                $files[] = $file;
            }

            if (file_exists($file = $bundle->getPath().'/'.$path)) {
                if ($first && !$isResource) {
                    return $file;
                }
                $files[] = $file;
                $resourceBundle = $bundle->getName();
            }
        }

        if (count($files) > 0) {
            return $first && $isResource ? $files[0] : $files;
        }

        throw new \InvalidArgumentException(sprintf('Unable to find file "%s".', $name));
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getName()
    {
        if (null === $this->name) {
            $this->name = preg_replace('/[^a-zA-Z0-9_]+/', '', basename($this->rootDir));
        }

        return $this->name;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getEnvironment()
    {
        return $this->environment;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function isDebug()
    {
        return $this->debug;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getRootDir()
    {
        if (null === $this->rootDir) {
            $r = new \ReflectionObject($this);
            $this->rootDir = str_replace('\\', '/', dirname($r->getFileName()));
        }

        return $this->rootDir;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getContainer()
    {
        return $this->container;
    }

    /**
     * Loads the PHP class cache.
     *
     * This methods only registers the fact that you want to load the cache classes.
     * The cache will actually only be loaded when the Kernel is booted.
     *
     * That optimization is mainly useful when using the HttpCache class in which
     * case the class cache is not loaded if the Response is in the cache.
     *
     * @param string $name      The cache name prefix
     * @param string $extension File extension of the resulting file
     */
    public function loadClassCache($name = 'classes', $extension = '.php')
    {
        $this->loadClassCache = array($name, $extension);
    }

    /**
     * Used internally.
     */
    public function setClassCache(array $classes)
    {
        file_put_contents($this->getCacheDir().'/classes.map', sprintf('<?php return %s;', var_export($classes, true)));
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getStartTime()
    {
        return $this->debug ? $this->startTime : -INF;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getCacheDir()
    {
        return $this->rootDir.'/cache/'.$this->environment;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getLogDir()
    {
        return $this->rootDir.'/logs';
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getCharset()
    {
        return 'UTF-8';
    }

    protected function doLoadClassCache($name, $extension)
    {
        if (!$this->booted && is_file($this->getCacheDir().'/classes.map')) {
            ClassCollectionLoader::load(include($this->getCacheDir().'/classes.map'), $this->getCacheDir(), $name, $this->debug, false, $extension);
        }
    }

    /**
     * Initializes the data structures related to the bundle management.
     *
     *  - the bundles property maps a bundle name to the bundle instance,
     *  - the bundleMap property maps a bundle name to the bundle inheritance hierarchy (most derived bundle first).
     *
     * @throws \LogicException if two bundles share a common name
     * @throws \LogicException if a bundle tries to extend a non-registered bundle
     * @throws \LogicException if a bundle tries to extend itself
     * @throws \LogicException if two bundles extend the same ancestor
     */
    protected function initializeBundles()
    {
        // init bundles
        $this->bundles = array();
        $topMostBundles = array();
        $directChildren = array();

        foreach ($this->registerBundles() as $bundle) {
            $name = $bundle->getName();
            if (isset($this->bundles[$name])) {
                throw new \LogicException(sprintf('Trying to register two bundles with the same name "%s"', $name));
            }
            $this->bundles[$name] = $bundle;

            if ($parentName = $bundle->getParent()) {
                if (isset($directChildren[$parentName])) {
                    throw new \LogicException(sprintf('Bundle "%s" is directly extended by two bundles "%s" and "%s".', $parentName, $name, $directChildren[$parentName]));
                }
                if ($parentName == $name) {
                    throw new \LogicException(sprintf('Bundle "%s" can not extend itself.', $name));
                }
                $directChildren[$parentName] = $name;
            } else {
                $topMostBundles[$name] = $bundle;
            }
        }

        // look for orphans
        if (!empty($directChildren) && count($diff = array_diff_key($directChildren, $this->bundles))) {
            $diff = array_keys($diff);

            throw new \LogicException(sprintf('Bundle "%s" extends bundle "%s", which is not registered.', $directChildren[$diff[0]], $diff[0]));
        }

        // inheritance
        $this->bundleMap = array();
        foreach ($topMostBundles as $name => $bundle) {
            $bundleMap = array($bundle);
            $hierarchy = array($name);

            while (isset($directChildren[$name])) {
                $name = $directChildren[$name];
                array_unshift($bundleMap, $this->bundles[$name]);
                $hierarchy[] = $name;
            }

            foreach ($hierarchy as $bundle) {
                $this->bundleMap[$bundle] = $bundleMap;
                array_pop($bundleMap);
            }
        }

    }

    /**
     * Gets the container class.
     *
     * @return string The container class
     */
    protected function getContainerClass()
    {
        return $this->name.ucfirst($this->environment).($this->debug ? 'Debug' : '').'ProjectContainer';
    }

    /**
     * Gets the container's base class.
     *
     * All names except Container must be fully qualified.
     *
     * @return string
     */
    protected function getContainerBaseClass()
    {
        return 'Container';
    }

    /**
     * Initializes the service container.
     *
     * The cached version of the service container is used when fresh, otherwise the
     * container is built.
     */
    protected function initializeContainer()
    {
        $class = $this->getContainerClass();
        $cache = new ConfigCache($this->getCacheDir().'/'.$class.'.php', $this->debug);
        $fresh = true;
        if (!$cache->isFresh()) {
            $container = $this->buildContainer();
            $container->compile();
            $this->dumpContainer($cache, $container, $class, $this->getContainerBaseClass());

            $fresh = false;
        }

        require_once $cache;

        $this->container = new $class();
        $this->container->set('kernel', $this);

        if (!$fresh && $this->container->has('cache_warmer')) {
            $this->container->get('cache_warmer')->warmUp($this->container->getParameter('kernel.cache_dir'));
        }
    }

    /**
     * Returns the kernel parameters.
     *
     * @return array An array of kernel parameters
     */
    protected function getKernelParameters()
    {
        $bundles = array();
        foreach ($this->bundles as $name => $bundle) {
            $bundles[$name] = get_class($bundle);
        }

        return array_merge(
            array(
                'kernel.root_dir'        => $this->rootDir,
                'kernel.environment'     => $this->environment,
                'kernel.debug'           => $this->debug,
                'kernel.name'            => $this->name,
                'kernel.cache_dir'       => $this->getCacheDir(),
                'kernel.logs_dir'        => $this->getLogDir(),
                'kernel.bundles'         => $bundles,
                'kernel.charset'         => $this->getCharset(),
                'kernel.container_class' => $this->getContainerClass(),
            ),
            $this->getEnvParameters()
        );
    }

    /**
     * Gets the environment parameters.
     *
     * Only the parameters starting with "SYMFONY__" are considered.
     *
     * @return array An array of parameters
     */
    protected function getEnvParameters()
    {
        $parameters = array();
        foreach ($_SERVER as $key => $value) {
            if (0 === strpos($key, 'SYMFONY__')) {
                $parameters[strtolower(str_replace('__', '.', substr($key, 9)))] = $value;
            }
        }

        return $parameters;
    }

    /**
     * Builds the service container.
     *
     * @return ContainerBuilder The compiled service container
     *
     * @throws \RuntimeException
     */
    protected function buildContainer()
    {
        foreach (array('cache' => $this->getCacheDir(), 'logs' => $this->getLogDir()) as $name => $dir) {
            if (!is_dir($dir)) {
                if (false === @mkdir($dir, 0777, true)) {
                    throw new \RuntimeException(sprintf("Unable to create the %s directory (%s)\n", $name, $dir));
                }
            } elseif (!is_writable($dir)) {
                throw new \RuntimeException(sprintf("Unable to write in the %s directory (%s)\n", $name, $dir));
            }
        }

        $container = $this->getContainerBuilder();
        $container->addObjectResource($this);
        $this->prepareContainer($container);

        if (null !== $cont = $this->registerContainerConfiguration($this->getContainerLoader($container))) {
            $container->merge($cont);
        }

        $container->addCompilerPass(new AddClassesToCachePass($this));

        return $container;
    }

    /**
     * Prepares the ContainerBuilder before it is compiled.
     *
     * @param ContainerBuilder $container A ContainerBuilder instance
     */
    protected function prepareContainer(ContainerBuilder $container)
    {
        $extensions = array();
        foreach ($this->bundles as $bundle) {
            if ($extension = $bundle->getContainerExtension()) {
                $container->registerExtension($extension);
                $extensions[] = $extension->getAlias();
            }

            if ($this->debug) {
                $container->addObjectResource($bundle);
            }
        }
        foreach ($this->bundles as $bundle) {
            $bundle->build($container);
        }

        // ensure these extensions are implicitly loaded
        $container->getCompilerPassConfig()->setMergePass(new MergeExtensionConfigurationPass($extensions));
    }

    /**
     * Gets a new ContainerBuilder instance used to build the service container.
     *
     * @return ContainerBuilder
     */
    protected function getContainerBuilder()
    {
        $container = new ContainerBuilder(new ParameterBag($this->getKernelParameters()));

        if (class_exists('ProxyManager\Configuration')) {
            $container->setProxyInstantiator(new RuntimeInstantiator());
        }

        return $container;
    }

    /**
     * Dumps the service container to PHP code in the cache.
     *
     * @param ConfigCache      $cache     The config cache
     * @param ContainerBuilder $container The service container
     * @param string           $class     The name of the class to generate
     * @param string           $baseClass The name of the container's base class
     */
    protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class, $baseClass)
    {
        // cache the container
        $dumper = new PhpDumper($container);

        if (class_exists('ProxyManager\Configuration')) {
            $dumper->setProxyDumper(new ProxyDumper());
        }

        $content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass));
        if (!$this->debug) {
            $content = static::stripComments($content);
        }

        $cache->write($content, $container->getResources());
    }

    /**
     * Returns a loader for the container.
     *
     * @param ContainerInterface $container The service container
     *
     * @return DelegatingLoader The loader
     */
    protected function getContainerLoader(ContainerInterface $container)
    {
        $locator = new FileLocator($this);
        $resolver = new LoaderResolver(array(
            new XmlFileLoader($container, $locator),
            new YamlFileLoader($container, $locator),
            new IniFileLoader($container, $locator),
            new PhpFileLoader($container, $locator),
            new ClosureLoader($container),
        ));

        return new DelegatingLoader($resolver);
    }

    /**
     * Removes comments from a PHP source string.
     *
     * We don't use the PHP php_strip_whitespace() function
     * as we want the content to be readable and well-formatted.
     *
     * @param string $source A PHP string
     *
     * @return string The PHP string with the comments removed
     */
    public static function stripComments($source)
    {
        if (!function_exists('token_get_all')) {
            return $source;
        }

        $rawChunk = '';
        $output = '';
        $tokens = token_get_all($source);
        $ignoreSpace = false;
        for (reset($tokens); false !== $token = current($tokens); next($tokens)) {
            if (is_string($token)) {
                $rawChunk .= $token;
            } elseif (T_START_HEREDOC === $token[0]) {
                $output .= $rawChunk.$token[1];
                do {
                    $token = next($tokens);
                    $output .= $token[1];
                } while ($token[0] !== T_END_HEREDOC);
                $rawChunk = '';
            } elseif (T_WHITESPACE === $token[0]) {
                if ($ignoreSpace) {
                    $ignoreSpace = false;

                    continue;
                }

                // replace multiple new lines with a single newline
                $rawChunk .= preg_replace(array('/\n{2,}/S'), "\n", $token[1]);
            } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) {
                $ignoreSpace = true;
            } else {
                $rawChunk .= $token[1];

                // The PHP-open tag already has a new-line
                if (T_OPEN_TAG === $token[0]) {
                    $ignoreSpace = true;
                }
            }
        }

        $output .= $rawChunk;

        return $output;
    }

    public function serialize()
    {
        return serialize(array($this->environment, $this->debug));
    }

    public function unserialize($data)
    {
        list($environment, $debug) = unserialize($data);

        $this->__construct($environment, $debug);
    }
}
PK�^�\���9��<pear/Symfony/Component/HttpKernel/Debug/ExceptionHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Debug;

use Symfony\Component\Debug\ExceptionHandler as DebugExceptionHandler;

/**
 * ExceptionHandler converts an exception to a Response object.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
 */
class ExceptionHandler extends DebugExceptionHandler
{
}
PK�^�\�eڮ55Dpear/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Debug;

use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Profiler\Profiler;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcherInterface;

/**
 * Collects some data about event listeners.
 *
 * This event dispatcher delegates the dispatching to another one.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TraceableEventDispatcher implements EventDispatcherInterface, TraceableEventDispatcherInterface
{
    private $logger;
    private $called = array();
    private $stopwatch;
    private $dispatcher;
    private $wrappedListeners = array();
    private $firstCalledEvent = array();
    private $lastEventId = 0;

    /**
     * Constructor.
     *
     * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance
     * @param Stopwatch                $stopwatch  A Stopwatch instance
     * @param LoggerInterface          $logger     A LoggerInterface instance
     */
    public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null)
    {
        $this->dispatcher = $dispatcher;
        $this->stopwatch = $stopwatch;
        $this->logger = $logger;
    }

    /**
     * Sets the profiler.
     *
     * The traceable event dispatcher does not use the profiler anymore.
     * The job is now done directly by the Profiler listener and the
     * data collectors themselves.
     *
     * @param Profiler|null $profiler A Profiler instance
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function setProfiler(Profiler $profiler = null)
    {
    }

    /**
     * {@inheritDoc}
     */
    public function addListener($eventName, $listener, $priority = 0)
    {
        $this->dispatcher->addListener($eventName, $listener, $priority);
    }

    /**
     * {@inheritdoc}
     */
    public function addSubscriber(EventSubscriberInterface $subscriber)
    {
        $this->dispatcher->addSubscriber($subscriber);
    }

    /**
     * {@inheritdoc}
     */
    public function removeListener($eventName, $listener)
    {
        return $this->dispatcher->removeListener($eventName, $listener);
    }

    /**
     * {@inheritdoc}
     */
    public function removeSubscriber(EventSubscriberInterface $subscriber)
    {
        return $this->dispatcher->removeSubscriber($subscriber);
    }

    /**
     * {@inheritdoc}
     */
    public function getListeners($eventName = null)
    {
        return $this->dispatcher->getListeners($eventName);
    }

    /**
     * {@inheritdoc}
     */
    public function hasListeners($eventName = null)
    {
        return $this->dispatcher->hasListeners($eventName);
    }

    /**
     * {@inheritdoc}
     */
    public function dispatch($eventName, Event $event = null)
    {
        if (null === $event) {
            $event = new Event();
        }

        $eventId = ++$this->lastEventId;

        $this->preDispatch($eventName, $eventId, $event);

        $e = $this->stopwatch->start($eventName, 'section');

        $this->firstCalledEvent[$eventName] = $this->stopwatch->start($eventName.'.loading', 'event_listener_loading');

        if (!$this->dispatcher->hasListeners($eventName)) {
            $this->firstCalledEvent[$eventName]->stop();
        }

        $this->dispatcher->dispatch($eventName, $event);

        unset($this->firstCalledEvent[$eventName]);

        if ($e->isStarted()) {
            $e->stop();
        }

        $this->postDispatch($eventName, $eventId, $event);

        return $event;
    }

    /**
     * {@inheritDoc}
     */
    public function getCalledListeners()
    {
        return $this->called;
    }

    /**
     * {@inheritDoc}
     */
    public function getNotCalledListeners()
    {
        $notCalled = array();

        foreach ($this->getListeners() as $name => $listeners) {
            foreach ($listeners as $listener) {
                $info = $this->getListenerInfo($listener, null, $name);
                if (!isset($this->called[$name.'.'.$info['pretty']])) {
                    $notCalled[$name.'.'.$info['pretty']] = $info;
                }
            }
        }

        return $notCalled;
    }

    /**
     * Proxies all method calls to the original event dispatcher.
     *
     * @param string $method    The method name
     * @param array  $arguments The method arguments
     *
     * @return mixed
     */
    public function __call($method, $arguments)
    {
        return call_user_func_array(array($this->dispatcher, $method), $arguments);
    }

    /**
     * This is a private method and must not be used.
     *
     * This method is public because it is used in a closure.
     * Whenever Symfony will require PHP 5.4, this could be changed
     * to a proper private method.
     */
    public function logSkippedListeners($eventName, $eventId, Event $event, $listener)
    {
        if (null === $this->logger) {
            return;
        }

        $info = $this->getListenerInfo($listener, $eventId, $eventName);

        $this->logger->debug(sprintf('Listener "%s" stopped propagation of the event "%s".', $info['pretty'], $eventName));

        $skippedListeners = $this->getListeners($eventName);
        $skipped = false;

        foreach ($skippedListeners as $skippedListener) {
            $skippedListener = $this->unwrapListener($skippedListener, $eventId);

            if ($skipped) {
                $info = $this->getListenerInfo($skippedListener, $eventId, $eventName);
                $this->logger->debug(sprintf('Listener "%s" was not called for event "%s".', $info['pretty'], $eventName));
            }

            if ($skippedListener === $listener) {
                $skipped = true;
            }
        }
    }

    /**
     * This is a private method.
     *
     * This method is public because it is used in a closure.
     * Whenever Symfony will require PHP 5.4, this could be changed
     * to a proper private method.
     */
    public function preListenerCall($eventName, $eventId, $listener)
    {
        // is it the first called listener?
        if (isset($this->firstCalledEvent[$eventName])) {
            $this->firstCalledEvent[$eventName]->stop();

            unset($this->firstCalledEvent[$eventName]);
        }

        $info = $this->getListenerInfo($listener, $eventId, $eventName);

        if (null !== $this->logger) {
            $this->logger->debug(sprintf('Notified event "%s" to listener "%s".', $eventName, $info['pretty']));
        }

        $this->called[$eventName.'.'.$info['pretty']] = $info;

        return $this->stopwatch->start(isset($info['class']) ? $info['class'] : $info['type'], 'event_listener');
    }

    /**
     * Returns information about the listener
     *
     * @param object $listener  The listener
     * @param string $eventName The event name
     *
     * @return array Information about the listener
     */
    private function getListenerInfo($listener, $eventId, $eventName)
    {
        $listener = $this->unwrapListener($listener, $eventId);

        $info = array(
            'event' => $eventName,
        );
        if ($listener instanceof \Closure) {
            $info += array(
                'type' => 'Closure',
                'pretty' => 'closure'
            );
        } elseif (is_string($listener)) {
            try {
                $r = new \ReflectionFunction($listener);
                $file = $r->getFileName();
                $line = $r->getStartLine();
            } catch (\ReflectionException $e) {
                $file = null;
                $line = null;
            }
            $info += array(
                'type'  => 'Function',
                'function' => $listener,
                'file'  => $file,
                'line'  => $line,
                'pretty' => $listener,
            );
        } elseif (is_array($listener) || (is_object($listener) && is_callable($listener))) {
            if (!is_array($listener)) {
                $listener = array($listener, '__invoke');
            }
            $class = is_object($listener[0]) ? get_class($listener[0]) : $listener[0];
            try {
                $r = new \ReflectionMethod($class, $listener[1]);
                $file = $r->getFileName();
                $line = $r->getStartLine();
            } catch (\ReflectionException $e) {
                $file = null;
                $line = null;
            }
            $info += array(
                'type'  => 'Method',
                'class' => $class,
                'method' => $listener[1],
                'file'  => $file,
                'line'  => $line,
                'pretty' => $class.'::'.$listener[1],
            );
        }

        return $info;
    }

    private function preDispatch($eventName, $eventId, Event $event)
    {
        // wrap all listeners before they are called
        $this->wrappedListeners[$eventId] = new \SplObjectStorage();

        $listeners = $this->dispatcher->getListeners($eventName);

        foreach ($listeners as $listener) {
            $this->dispatcher->removeListener($eventName, $listener);
            $wrapped = $this->wrapListener($eventName, $eventId, $listener);
            $this->wrappedListeners[$eventId][$wrapped] = $listener;
            $this->dispatcher->addListener($eventName, $wrapped);
        }

        switch ($eventName) {
            case KernelEvents::REQUEST:
                $this->stopwatch->openSection();
                break;
            case KernelEvents::VIEW:
            case KernelEvents::RESPONSE:
                // stop only if a controller has been executed
                if ($this->stopwatch->isStarted('controller')) {
                    $this->stopwatch->stop('controller');
                }
                break;
            case KernelEvents::TERMINATE:
                $token = $event->getResponse()->headers->get('X-Debug-Token');
                // There is a very special case when using builtin AppCache class as kernel wrapper, in the case
                // of an ESI request leading to a `stale` response [B]  inside a `fresh` cached response [A].
                // In this case, `$token` contains the [B] debug token, but the  open `stopwatch` section ID
                // is equal to the [A] debug token. Trying to reopen section with the [B] token throws an exception
                // which must be caught.
                try {
                    $this->stopwatch->openSection($token);
                } catch (\LogicException $e) {}
                break;
        }
    }

    private function postDispatch($eventName, $eventId, Event $event)
    {
        switch ($eventName) {
            case KernelEvents::CONTROLLER:
                $this->stopwatch->start('controller', 'section');
                break;
            case KernelEvents::RESPONSE:
                $token = $event->getResponse()->headers->get('X-Debug-Token');
                $this->stopwatch->stopSection($token);
                break;
            case KernelEvents::TERMINATE:
                // In the special case described in the `preDispatch` method above, the `$token` section
                // does not exist, then closing it throws an exception which must be caught.
                $token = $event->getResponse()->headers->get('X-Debug-Token');
                try {
                    $this->stopwatch->stopSection($token);
                } catch (\LogicException $e) {}
                break;
        }

        foreach ($this->wrappedListeners[$eventId] as $wrapped) {
            $this->dispatcher->removeListener($eventName, $wrapped);
            $this->dispatcher->addListener($eventName, $this->wrappedListeners[$eventId][$wrapped]);
        }

        unset($this->wrappedListeners[$eventId]);
    }

    private function wrapListener($eventName, $eventId, $listener)
    {
        $self = $this;

        return function (Event $event) use ($self, $eventName, $eventId, $listener) {
            $e = $self->preListenerCall($eventName, $eventId, $listener);

            call_user_func($listener, $event, $eventName, $self);

            if ($e->isStarted()) {
                $e->stop();
            }

            if ($event->isPropagationStopped()) {
                $self->logSkippedListeners($eventName, $eventId, $event, $listener);
            }
        };
    }

    private function unwrapListener($listener, $eventId)
    {
        // get the original listener
        if (is_object($listener)) {
            if (null === $eventId) {
                foreach (array_keys($this->wrappedListeners) as $eventId) {
                    if (isset($this->wrappedListeners[$eventId][$listener])) {
                        return $this->wrappedListeners[$eventId][$listener];
                    }
                }
            } elseif (isset($this->wrappedListeners[$eventId][$listener])) {
                return $this->wrappedListeners[$eventId][$listener];
            }
        }

        return $listener;
    }
}
PK�^�\��KK8pear/Symfony/Component/HttpKernel/Debug/ErrorHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Debug;

use Symfony\Component\Debug\ErrorHandler as DebugErrorHandler;

/**
 * ErrorHandler.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
 */
class ErrorHandler extends DebugErrorHandler
{
}
PK�^�\J��=[[>pear/Symfony/Component/HttpKernel/Log/DebugLoggerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Log;

/**
 * DebugLoggerInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface DebugLoggerInterface
{
    /**
     * Returns an array of logs.
     *
     * A log is an array with the following mandatory keys:
     * timestamp, message, priority, and priorityName.
     * It can also have an optional context key containing an array.
     *
     * @return array An array of logs
     */
    public function getLogs();

    /**
     * Returns the number of errors.
     *
     * @return integer The number of errors
     */
    public function countErrors();
}
PK�^�\>�<���4pear/Symfony/Component/HttpKernel/Log/NullLogger.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Log;

use Psr\Log\NullLogger as PsrNullLogger;

/**
 * NullLogger.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class NullLogger extends PsrNullLogger implements LoggerInterface
{
    /**
     * @api
     * @deprecated since 2.2, to be removed in 3.0. Use emergency() which is PSR-3 compatible.
     */
    public function emerg($message, array $context = array())
    {
    }

    /**
     * @api
     * @deprecated since 2.2, to be removed in 3.0. Use critical() which is PSR-3 compatible.
     */
    public function crit($message, array $context = array())
    {
    }

    /**
     * @api
     * @deprecated since 2.2, to be removed in 3.0. Use error() which is PSR-3 compatible.
     */
    public function err($message, array $context = array())
    {
    }

    /**
     * @api
     * @deprecated since 2.2, to be removed in 3.0. Use warning() which is PSR-3 compatible.
     */
    public function warn($message, array $context = array())
    {
    }
}
PK�^�\~�[�

9pear/Symfony/Component/HttpKernel/Log/LoggerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Log;

use Psr\Log\LoggerInterface as PsrLogger;

/**
 * LoggerInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @deprecated since 2.2, to be removed in 3.0. Type-hint \Psr\Log\LoggerInterface instead.
 * @api
 */
interface LoggerInterface extends PsrLogger
{
    /**
     * @api
     * @deprecated since 2.2, to be removed in 3.0. Use emergency() which is PSR-3 compatible.
     */
    public function emerg($message, array $context = array());

    /**
     * @api
     * @deprecated since 2.2, to be removed in 3.0. Use critical() which is PSR-3 compatible.
     */
    public function crit($message, array $context = array());

    /**
     * @api
     * @deprecated since 2.2, to be removed in 3.0. Use error() which is PSR-3 compatible.
     */
    public function err($message, array $context = array());

    /**
     * @api
     * @deprecated since 2.2, to be removed in 3.0. Use warning() which is PSR-3 compatible.
     */
    public function warn($message, array $context = array());
}
PK�^�\�^t�9pear/Symfony/Component/HttpKernel/TerminableInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Terminable extends the Kernel request/response cycle with dispatching a post
 * response event after sending the response and before shutting down the kernel.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @author Pierre Minnieur <pierre.minnieur@sensiolabs.de>
 *
 * @api
 */
interface TerminableInterface
{
    /**
     * Terminates a request/response cycle.
     *
     * Should be called after sending the response and before shutting down the kernel.
     *
     * @param Request  $request  A Request instance
     * @param Response $response A Response instance
     *
     * @api
     */
    public function terminate(Request $request, Response $response);
}
PK�^�\�zTT0pear/Symfony/Component/HttpKernel/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\HttpKernel\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�^�\�`g��?pear/Symfony/Component/HttpKernel/Event/FilterResponseEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Allows to filter a Response object
 *
 * You can call getResponse() to retrieve the current response. With
 * setResponse() you can set a new response that will be returned to the
 * browser.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class FilterResponseEvent extends KernelEvent
{
    /**
     * The current response object
     * @var Response
     */
    private $response;

    public function __construct(HttpKernelInterface $kernel, Request $request, $requestType, Response $response)
    {
        parent::__construct($kernel, $request, $requestType);

        $this->setResponse($response);
    }

    /**
     * Returns the current response object
     *
     * @return Response
     *
     * @api
     */
    public function getResponse()
    {
        return $this->response;
    }

    /**
     * Sets a new response object
     *
     * @param Response $response
     *
     * @api
     */
    public function setResponse(Response $response)
    {
        $this->response = $response;
    }
}
PK�^�\}�x��7pear/Symfony/Component/HttpKernel/Event/KernelEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\EventDispatcher\Event;

/**
 * Base class for events thrown in the HttpKernel component
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class KernelEvent extends Event
{
    /**
     * The kernel in which this event was thrown
     * @var HttpKernelInterface
     */
    private $kernel;

    /**
     * The request the kernel is currently processing
     * @var Request
     */
    private $request;

    /**
     * The request type the kernel is currently processing.  One of
     * HttpKernelInterface::MASTER_REQUEST and HttpKernelInterface::SUB_REQUEST
     * @var integer
     */
    private $requestType;

    public function __construct(HttpKernelInterface $kernel, Request $request, $requestType)
    {
        $this->kernel = $kernel;
        $this->request = $request;
        $this->requestType = $requestType;
    }

    /**
     * Returns the kernel in which this event was thrown
     *
     * @return HttpKernelInterface
     *
     * @api
     */
    public function getKernel()
    {
        return $this->kernel;
    }

    /**
     * Returns the request the kernel is currently processing
     *
     * @return Request
     *
     * @api
     */
    public function getRequest()
    {
        return $this->request;
    }

    /**
     * Returns the request type the kernel is currently processing
     *
     * @return integer  One of HttpKernelInterface::MASTER_REQUEST and
     *                  HttpKernelInterface::SUB_REQUEST
     *
     * @api
     */
    public function getRequestType()
    {
        return $this->requestType;
    }

    /**
     * Checks if this is a master request.
     *
     * @return Boolean True if the request is a master request
     *
     * @api
     */
    public function isMasterRequest()
    {
        return HttpKernelInterface::MASTER_REQUEST === $this->requestType;
    }
}
PK�^�\�9����Hpear/Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * Allows to create a response for a thrown exception
 *
 * Call setResponse() to set the response that will be returned for the
 * current request. The propagation of this event is stopped as soon as a
 * response is set.
 *
 * You can also call setException() to replace the thrown exception. This
 * exception will be thrown if no response is set during processing of this
 * event.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class GetResponseForExceptionEvent extends GetResponseEvent
{
    /**
     * The exception object
     * @var \Exception
     */
    private $exception;

    public function __construct(HttpKernelInterface $kernel, Request $request, $requestType, \Exception $e)
    {
        parent::__construct($kernel, $request, $requestType);

        $this->setException($e);
    }

    /**
     * Returns the thrown exception
     *
     * @return \Exception  The thrown exception
     *
     * @api
     */
    public function getException()
    {
        return $this->exception;
    }

    /**
     * Replaces the thrown exception
     *
     * This exception will be thrown if no response is set in the event.
     *
     * @param \Exception $exception The thrown exception
     *
     * @api
     */
    public function setException(\Exception $exception)
    {
        $this->exception = $exception;
    }
}
PK�^�\
�7���>pear/Symfony/Component/HttpKernel/Event/FinishRequestEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Event;

/**
 * Triggered whenever a request is fully processed.
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 */
class FinishRequestEvent extends KernelEvent
{
}
PK�^�\��,&&=pear/Symfony/Component/HttpKernel/Event/PostResponseEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Allows to execute logic after a response was sent
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class PostResponseEvent extends Event
{
    /**
     * The kernel in which this event was thrown
     * @var HttpKernelInterface
     */
    private $kernel;

    private $request;

    private $response;

    public function __construct(HttpKernelInterface $kernel, Request $request, Response $response)
    {
        $this->kernel = $kernel;
        $this->request = $request;
        $this->response = $response;
    }

    /**
     * Returns the kernel in which this event was thrown.
     *
     * @return HttpKernelInterface
     */
    public function getKernel()
    {
        return $this->kernel;
    }

    /**
     * Returns the request for which this event was thrown.
     *
     * @return Request
     */
    public function getRequest()
    {
        return $this->request;
    }

    /**
     * Returns the response for which this event was thrown.
     *
     * @return Response
     */
    public function getResponse()
    {
        return $this->response;
    }
}
PK�^�\9�I��<pear/Symfony/Component/HttpKernel/Event/GetResponseEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpFoundation\Response;

/**
 * Allows to create a response for a request
 *
 * Call setResponse() to set the response that will be returned for the
 * current request. The propagation of this event is stopped as soon as a
 * response is set.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class GetResponseEvent extends KernelEvent
{
    /**
     * The response object
     * @var Response
     */
    private $response;

    /**
     * Returns the response object
     *
     * @return Response
     *
     * @api
     */
    public function getResponse()
    {
        return $this->response;
    }

    /**
     * Sets a response and stops event propagation
     *
     * @param Response $response
     *
     * @api
     */
    public function setResponse(Response $response)
    {
        $this->response = $response;

        $this->stopPropagation();
    }

    /**
     * Returns whether a response was set
     *
     * @return Boolean Whether a response was set
     *
     * @api
     */
    public function hasResponse()
    {
        return null !== $this->response;
    }
}
PK�^�\٨�.kkOpear/Symfony/Component/HttpKernel/Event/GetResponseForControllerResultEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * Allows to create a response for the return value of a controller
 *
 * Call setResponse() to set the response that will be returned for the
 * current request. The propagation of this event is stopped as soon as a
 * response is set.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class GetResponseForControllerResultEvent extends GetResponseEvent
{
    /**
     * The return value of the controller
     *
     * @var mixed
     */
    private $controllerResult;

    public function __construct(HttpKernelInterface $kernel, Request $request, $requestType, $controllerResult)
    {
        parent::__construct($kernel, $request, $requestType);

        $this->controllerResult = $controllerResult;
    }

    /**
     * Returns the return value of the controller.
     *
     * @return mixed The controller return value
     *
     * @api
     */
    public function getControllerResult()
    {
        return $this->controllerResult;
    }

    /**
     * Assigns the return value of the controller.
     *
     * @param mixed $controllerResult The controller return value
     *
     * @api
     */
    public function setControllerResult($controllerResult)
    {
        $this->controllerResult = $controllerResult;
    }
}
PK�^�\�%���	�	Apear/Symfony/Component/HttpKernel/Event/FilterControllerEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Event;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * Allows filtering of a controller callable
 *
 * You can call getController() to retrieve the current controller. With
 * setController() you can set a new controller that is used in the processing
 * of the request.
 *
 * Controllers should be callables.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class FilterControllerEvent extends KernelEvent
{
    /**
     * The current controller
     * @var callable
     */
    private $controller;

    public function __construct(HttpKernelInterface $kernel, $controller, Request $request, $requestType)
    {
        parent::__construct($kernel, $request, $requestType);

        $this->setController($controller);
    }

    /**
     * Returns the current controller
     *
     * @return callable
     *
     * @api
     */
    public function getController()
    {
        return $this->controller;
    }

    /**
     * Sets a new controller
     *
     * @param callable $controller
     *
     * @throws \LogicException
     *
     * @api
     */
    public function setController($controller)
    {
        // controller must be a callable
        if (!is_callable($controller)) {
            throw new \LogicException(sprintf('The controller must be a callable (%s given).', $this->varToString($controller)));
        }

        $this->controller = $controller;
    }

    private function varToString($var)
    {
        if (is_object($var)) {
            return sprintf('Object(%s)', get_class($var));
        }

        if (is_array($var)) {
            $a = array();
            foreach ($var as $k => $v) {
                $a[] = sprintf('%s => %s', $k, $this->varToString($v));
            }

            return sprintf("Array(%s)", implode(', ', $a));
        }

        if (is_resource($var)) {
            return sprintf('Resource(%s)', get_resource_type($var));
        }

        if (null === $var) {
            return 'null';
        }

        if (false === $var) {
            return 'false';
        }

        if (true === $var) {
            return 'true';
        }

        return (string) $var;
    }
}
PK�^�\�k�t$$0pear/Symfony/Component/HttpKernel/HttpKernel.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel;

use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * HttpKernel notifies events to convert a Request object to a Response one.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class HttpKernel implements HttpKernelInterface, TerminableInterface
{
    protected $dispatcher;
    protected $resolver;
    protected $requestStack;

    /**
     * Constructor
     *
     * @param EventDispatcherInterface    $dispatcher   An EventDispatcherInterface instance
     * @param ControllerResolverInterface $resolver     A ControllerResolverInterface instance
     * @param RequestStack                $requestStack A stack for master/sub requests
     *
     * @api
     */
    public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, RequestStack $requestStack = null)
    {
        $this->dispatcher = $dispatcher;
        $this->resolver = $resolver;
        $this->requestStack = $requestStack ?: new RequestStack();
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        try {
            return $this->handleRaw($request, $type);
        } catch (\Exception $e) {
            if (false === $catch) {
                $this->finishRequest($request, $type);

                throw $e;
            }

            return $this->handleException($e, $request, $type);
        }
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function terminate(Request $request, Response $response)
    {
        $this->dispatcher->dispatch(KernelEvents::TERMINATE, new PostResponseEvent($this, $request, $response));
    }

    /**
     * Handles a request to convert it to a response.
     *
     * Exceptions are not caught.
     *
     * @param Request $request A Request instance
     * @param integer $type    The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
     *
     * @return Response A Response instance
     *
     * @throws \LogicException If one of the listener does not behave as expected
     * @throws NotFoundHttpException When controller cannot be found
     */
    private function handleRaw(Request $request, $type = self::MASTER_REQUEST)
    {
        $this->requestStack->push($request);

        // request
        $event = new GetResponseEvent($this, $request, $type);
        $this->dispatcher->dispatch(KernelEvents::REQUEST, $event);

        if ($event->hasResponse()) {
            return $this->filterResponse($event->getResponse(), $request, $type);
        }

        // load controller
        if (false === $controller = $this->resolver->getController($request)) {
            throw new NotFoundHttpException(sprintf('Unable to find the controller for path "%s". Maybe you forgot to add the matching route in your routing configuration?', $request->getPathInfo()));
        }

        $event = new FilterControllerEvent($this, $controller, $request, $type);
        $this->dispatcher->dispatch(KernelEvents::CONTROLLER, $event);
        $controller = $event->getController();

        // controller arguments
        $arguments = $this->resolver->getArguments($request, $controller);

        // call controller
        $response = call_user_func_array($controller, $arguments);

        // view
        if (!$response instanceof Response) {
            $event = new GetResponseForControllerResultEvent($this, $request, $type, $response);
            $this->dispatcher->dispatch(KernelEvents::VIEW, $event);

            if ($event->hasResponse()) {
                $response = $event->getResponse();
            }

            if (!$response instanceof Response) {
                $msg = sprintf('The controller must return a response (%s given).', $this->varToString($response));

                // the user may have forgotten to return something
                if (null === $response) {
                    $msg .= ' Did you forget to add a return statement somewhere in your controller?';
                }
                throw new \LogicException($msg);
            }
        }

        return $this->filterResponse($response, $request, $type);
    }

    /**
     * Filters a response object.
     *
     * @param Response $response A Response instance
     * @param Request  $request  An error message in case the response is not a Response object
     * @param integer  $type     The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
     *
     * @return Response The filtered Response instance
     *
     * @throws \RuntimeException if the passed object is not a Response instance
     */
    private function filterResponse(Response $response, Request $request, $type)
    {
        $event = new FilterResponseEvent($this, $request, $type, $response);

        $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);

        $this->finishRequest($request, $type);

        return $event->getResponse();
    }

    /**
     * Publishes the finish request event, then pop the request from the stack.
     *
     * Note that the order of the operations is important here, otherwise
     * operations such as {@link RequestStack::getParentRequest()} can lead to
     * weird results.
     *
     * @param Request $request
     * @param int     $type
     */
    private function finishRequest(Request $request, $type)
    {
        $this->dispatcher->dispatch(KernelEvents::FINISH_REQUEST, new FinishRequestEvent($this, $request, $type));
        $this->requestStack->pop();
    }

    /**
     * Handles an exception by trying to convert it to a Response.
     *
     * @param \Exception $e       An \Exception instance
     * @param Request    $request A Request instance
     * @param integer    $type    The type of the request
     *
     * @return Response A Response instance
     *
     * @throws \Exception
     */
    private function handleException(\Exception $e, $request, $type)
    {
        $event = new GetResponseForExceptionEvent($this, $request, $type, $e);
        $this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event);

        // a listener might have replaced the exception
        $e = $event->getException();

        if (!$event->hasResponse()) {
            $this->finishRequest($request, $type);

            throw $e;
        }

        $response = $event->getResponse();

        // the developer asked for a specific status code
        if ($response->headers->has('X-Status-Code')) {
            $response->setStatusCode($response->headers->get('X-Status-Code'));

            $response->headers->remove('X-Status-Code');
        } elseif (!$response->isClientError() && !$response->isServerError() && !$response->isRedirect()) {
            // ensure that we actually have an error response
            if ($e instanceof HttpExceptionInterface) {
                // keep the HTTP status code and headers
                $response->setStatusCode($e->getStatusCode());
                $response->headers->add($e->getHeaders());
            } else {
                $response->setStatusCode(500);
            }
        }

        try {
            return $this->filterResponse($response, $request, $type);
        } catch (\Exception $e) {
            return $response;
        }
    }

    private function varToString($var)
    {
        if (is_object($var)) {
            return sprintf('Object(%s)', get_class($var));
        }

        if (is_array($var)) {
            $a = array();
            foreach ($var as $k => $v) {
                $a[] = sprintf('%s => %s', $k, $this->varToString($v));
            }

            return sprintf("Array(%s)", implode(', ', $a));
        }

        if (is_resource($var)) {
            return sprintf('Resource(%s)', get_resource_type($var));
        }

        if (null === $var) {
            return 'null';
        }

        if (false === $var) {
            return 'false';
        }

        if (true === $var) {
            return 'true';
        }

        return (string) $var;
    }
}
PK�^�\S
�"P
P
Bpear/Symfony/Component/HttpKernel/EventListener/LocaleListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RequestContextAwareInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Initializes the locale based on the current request.
 *
 * This listener works in 2 modes:
 *
 *  * 2.3 compatibility mode where you must call setRequest whenever the Request changes.
 *  * 2.4+ mode where you must pass a RequestStack instance in the constructor.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class LocaleListener implements EventSubscriberInterface
{
    private $router;
    private $defaultLocale;
    private $requestStack;

    /**
     * RequestStack will become required in 3.0.
     */
    public function __construct($defaultLocale = 'en', RequestContextAwareInterface $router = null, RequestStack $requestStack = null)
    {
        $this->defaultLocale = $defaultLocale;
        $this->requestStack = $requestStack;
        $this->router = $router;
    }

    /**
     * Sets the current Request.
     *
     * This method was used to synchronize the Request, but as the HttpKernel
     * is doing that automatically now, you should never call it directly.
     * It is kept public for BC with the 2.3 version.
     *
     * @param Request|null $request A Request instance
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function setRequest(Request $request = null)
    {
        if (null === $request) {
            return;
        }

        $this->setLocale($request);
        $this->setRouterContext($request);
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        $request->setDefaultLocale($this->defaultLocale);

        $this->setLocale($request);
        $this->setRouterContext($request);
    }

    public function onKernelFinishRequest(FinishRequestEvent $event)
    {
        if (null === $this->requestStack) {
            return; // removed when requestStack is required
        }

        if (null !== $parentRequest = $this->requestStack->getParentRequest()) {
            $this->setRouterContext($parentRequest);
        }
    }

    private function setLocale(Request $request)
    {
        if ($locale = $request->attributes->get('_locale')) {
            $request->setLocale($locale);
        }
    }

    private function setRouterContext(Request $request)
    {
        if (null !== $this->router) {
            $this->router->getContext()->setParameter('_locale', $request->getLocale());
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            // must be registered after the Router to have access to the _locale
            KernelEvents::REQUEST => array(array('onKernelRequest', 16)),
            KernelEvents::FINISH_REQUEST => array(array('onKernelFinishRequest', 0)),
        );
    }
}
PK�^�\��	���Epear/Symfony/Component/HttpKernel/EventListener/ExceptionListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Exception\FlattenException;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * ExceptionListener.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ExceptionListener implements EventSubscriberInterface
{
    protected $controller;
    protected $logger;

    public function __construct($controller, LoggerInterface $logger = null)
    {
        $this->controller = $controller;
        $this->logger = $logger;
    }

    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        static $handling;

        if (true === $handling) {
            return false;
        }

        $handling = true;

        $exception = $event->getException();
        $request = $event->getRequest();

        $this->logException($exception, sprintf('Uncaught PHP Exception %s: "%s" at %s line %s', get_class($exception), $exception->getMessage(), $exception->getFile(), $exception->getLine()));

        $request = $this->duplicateRequest($exception, $request);

        try {
            $response = $event->getKernel()->handle($request, HttpKernelInterface::SUB_REQUEST, true);
        } catch (\Exception $e) {
            $this->logException($exception, sprintf('Exception thrown when handling an exception (%s: %s)', get_class($e), $e->getMessage()), false);

            // set handling to false otherwise it wont be able to handle further more
            $handling = false;

            // re-throw the exception from within HttpKernel as this is a catch-all
            return;
        }

        $event->setResponse($response);

        $handling = false;
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::EXCEPTION => array('onKernelException', -128),
        );
    }

    /**
     * Logs an exception.
     *
     * @param \Exception $exception The original \Exception instance
     * @param string     $message   The error message to log
     * @param Boolean    $original  False when the handling of the exception thrown another exception
     */
    protected function logException(\Exception $exception, $message, $original = true)
    {
        $isCritical = !$exception instanceof HttpExceptionInterface || $exception->getStatusCode() >= 500;
        $context = array('exception' => $exception);
        if (null !== $this->logger) {
            if ($isCritical) {
                $this->logger->critical($message, $context);
            } else {
                $this->logger->error($message, $context);
            }
        } elseif (!$original || $isCritical) {
            error_log($message);
        }
    }

    /**
     * Clones the request for the exception.
     *
     * @param \Exception $exception The thrown exception.
     * @param Request $request The original request.
     *
     * @return Request $request The cloned request.
     */
    protected function duplicateRequest(\Exception $exception, Request $request)
    {
        $attributes = array(
            '_controller' => $this->controller,
            'exception' => FlattenException::create($exception),
            'logger' => $this->logger instanceof DebugLoggerInterface ? $this->logger : null,
            // keep for BC -- as $format can be an argument of the controller callable
            // see src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php
            // @deprecated in 2.4, to be removed in 3.0
            'format' => $request->getRequestFormat(),
        );
        $request = $request->duplicate(null, null, $attributes);
        $request->setMethod('GET');

        return $request;
    }
}
PK�^�\�|$���Hpear/Symfony/Component/HttpKernel/EventListener/ErrorsLoggerListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Debug\ErrorHandler;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * Injects the logger into the ErrorHandler, so that it can log various errors.
 *
 * @author Colin Frei <colin@colinfrei.com>
 * @author Konstantin Myakshin <koc-dp@yandex.ru>
 */
class ErrorsLoggerListener implements EventSubscriberInterface
{
    private $channel;

    private $logger;

    public function __construct($channel, LoggerInterface $logger = null)
    {
        $this->channel = $channel;
        $this->logger = $logger;
    }

    public function injectLogger()
    {
        if (null !== $this->logger) {
            ErrorHandler::setLogger($this->logger, $this->channel);
        }
    }

    public static function getSubscribedEvents()
    {
        return array(KernelEvents::REQUEST => 'injectLogger');
    }
}
PK�^�\����
�
Dpear/Symfony/Component/HttpKernel/EventListener/FragmentListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\IpUtils;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\UriSigner;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Handles content fragments represented by special URIs.
 *
 * All URL paths starting with /_fragment are handled as
 * content fragments by this listener.
 *
 * If the request does not come from a trusted IP, it throws an
 * AccessDeniedHttpException exception.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FragmentListener implements EventSubscriberInterface
{
    private $signer;
    private $fragmentPath;

    /**
     * Constructor.
     *
     * @param UriSigner $signer       A UriSigner instance
     * @param string    $fragmentPath The path that triggers this listener
     */
    public function __construct(UriSigner $signer, $fragmentPath = '/_fragment')
    {
        $this->signer = $signer;
        $this->fragmentPath = $fragmentPath;
    }

    /**
     * Fixes request attributes when the path is '/_fragment'.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     *
     * @throws AccessDeniedHttpException if the request does not come from a trusted IP.
     */
    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        if ($this->fragmentPath !== rawurldecode($request->getPathInfo())) {
            return;
        }

        $this->validateRequest($request);

        parse_str($request->query->get('_path', ''), $attributes);
        $request->attributes->add($attributes);
        $request->attributes->set('_route_params', array_replace($request->attributes->get('_route_params', array()), $attributes));
        $request->query->remove('_path');
    }

    protected function validateRequest(Request $request)
    {
        // is the Request safe?
        if (!$request->isMethodSafe()) {
            throw new AccessDeniedHttpException();
        }

        // does the Request come from a trusted IP?
        $trustedIps = array_merge($this->getLocalIpAddresses(), $request->getTrustedProxies());
        $remoteAddress = $request->server->get('REMOTE_ADDR');
        if (IpUtils::checkIp($remoteAddress, $trustedIps)) {
            return;
        }

        // is the Request signed?
        // we cannot use $request->getUri() here as we want to work with the original URI (no query string reordering)
        if ($this->signer->check($request->getSchemeAndHttpHost().$request->getBaseUrl().$request->getPathInfo().(null !== ($qs = $request->server->get('QUERY_STRING')) ? '?'.$qs : ''))) {
            return;
        }

        throw new AccessDeniedHttpException();
    }

    protected function getLocalIpAddresses()
    {
        return array('127.0.0.1', 'fe80::1', '::1');
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array(array('onKernelRequest', 48)),
        );
    }
}
PK�^�\�	��--Bpear/Symfony/Component/HttpKernel/EventListener/RouterListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RequestContextAwareInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * Initializes the context from the request and sets request attributes based on a matching route.
 *
 * This listener works in 2 modes:
 *
 *  * 2.3 compatibility mode where you must call setRequest whenever the Request changes.
 *  * 2.4+ mode where you must pass a RequestStack instance in the constructor.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class RouterListener implements EventSubscriberInterface
{
    private $matcher;
    private $context;
    private $logger;
    private $request;
    private $requestStack;

    /**
     * Constructor.
     *
     * RequestStack will become required in 3.0.
     *
     * @param UrlMatcherInterface|RequestMatcherInterface $matcher The Url or Request matcher
     * @param RequestContext|null                         $context The RequestContext (can be null when $matcher implements RequestContextAwareInterface)
     * @param LoggerInterface|null                        $logger  The logger
     *
     * @throws \InvalidArgumentException
     */
    public function __construct($matcher, RequestContext $context = null, LoggerInterface $logger = null, RequestStack $requestStack = null)
    {
        if (!$matcher instanceof UrlMatcherInterface && !$matcher instanceof RequestMatcherInterface) {
            throw new \InvalidArgumentException('Matcher must either implement UrlMatcherInterface or RequestMatcherInterface.');
        }

        if (null === $context && !$matcher instanceof RequestContextAwareInterface) {
            throw new \InvalidArgumentException('You must either pass a RequestContext or the matcher must implement RequestContextAwareInterface.');
        }

        $this->matcher = $matcher;
        $this->context = $context ?: $matcher->getContext();
        $this->requestStack = $requestStack;
        $this->logger = $logger;
    }

    /**
     * Sets the current Request.
     *
     * This method was used to synchronize the Request, but as the HttpKernel
     * is doing that automatically now, you should never call it directly.
     * It is kept public for BC with the 2.3 version.
     *
     * @param Request|null $request A Request instance
     *
     * @deprecated Deprecated since version 2.4, to be moved to a private function in 3.0.
     */
    public function setRequest(Request $request = null)
    {
        if (null !== $request && $this->request !== $request) {
            $this->context->fromRequest($request);
        }
        $this->request = $request;
    }

    public function onKernelFinishRequest(FinishRequestEvent $event)
    {
        if (null === $this->requestStack) {
            return; // removed when requestStack is required
        }

        $this->setRequest($this->requestStack->getParentRequest());
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        // initialize the context that is also used by the generator (assuming matcher and generator share the same context instance)
        // we call setRequest even if most of the time, it has already been done to keep compatibility
        // with frameworks which do not use the Symfony service container
        // when we have a RequestStack, no need to do it
        if (null !== $this->requestStack) {
            $this->setRequest($request);
        }

        if ($request->attributes->has('_controller')) {
            // routing is already done
            return;
        }

        // add attributes based on the request (routing)
        try {
            // matching a request is more powerful than matching a URL path + context, so try that first
            if ($this->matcher instanceof RequestMatcherInterface) {
                $parameters = $this->matcher->matchRequest($request);
            } else {
                $parameters = $this->matcher->match($request->getPathInfo());
            }

            if (null !== $this->logger) {
                $this->logger->info(sprintf('Matched route "%s" (parameters: %s)', $parameters['_route'], $this->parametersToString($parameters)));
            }

            $request->attributes->add($parameters);
            unset($parameters['_route']);
            unset($parameters['_controller']);
            $request->attributes->set('_route_params', $parameters);
        } catch (ResourceNotFoundException $e) {
            $message = sprintf('No route found for "%s %s"', $request->getMethod(), $request->getPathInfo());

            if ($referer = $request->headers->get('referer')) {
                $message .= sprintf(' (from "%s")', $referer);
            }

            throw new NotFoundHttpException($message, $e);
        } catch (MethodNotAllowedException $e) {
            $message = sprintf('No route found for "%s %s": Method Not Allowed (Allow: %s)', $request->getMethod(), $request->getPathInfo(), implode(', ', $e->getAllowedMethods()));

            throw new MethodNotAllowedHttpException($e->getAllowedMethods(), $message, $e);
        }
    }

    private function parametersToString(array $parameters)
    {
        $pieces = array();
        foreach ($parameters as $key => $val) {
            $pieces[] = sprintf('"%s": "%s"', $key, (is_string($val) ? $val : json_encode($val)));
        }

        return implode(', ', $pieces);
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array(array('onKernelRequest', 32)),
            KernelEvents::FINISH_REQUEST => array(array('onKernelFinishRequest', 0)),
        );
    }
}
PK�^�\���$$Lpear/Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * StreamedResponseListener is responsible for sending the Response
 * to the client.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class StreamedResponseListener implements EventSubscriberInterface
{
    /**
     * Filters the Response.
     *
     * @param FilterResponseEvent $event A FilterResponseEvent instance
     */
    public function onKernelResponse(FilterResponseEvent $event)
    {
        if (!$event->isMasterRequest()) {
            return;
        }

        $response = $event->getResponse();

        if ($response instanceof StreamedResponse) {
            $response->send();
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::RESPONSE => array('onKernelResponse', -1024),
        );
    }
}
PK�^�\P�C�yyDpear/Symfony/Component/HttpKernel/EventListener/ResponseListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * ResponseListener fixes the Response headers based on the Request.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ResponseListener implements EventSubscriberInterface
{
    private $charset;

    public function __construct($charset)
    {
        $this->charset = $charset;
    }

    /**
     * Filters the Response.
     *
     * @param FilterResponseEvent $event A FilterResponseEvent instance
     */
    public function onKernelResponse(FilterResponseEvent $event)
    {
        if (!$event->isMasterRequest()) {
            return;
        }

        $response = $event->getResponse();

        if (null === $response->getCharset()) {
            $response->setCharset($this->charset);
        }

        $response->prepare($event->getRequest());
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::RESPONSE => 'onKernelResponse',
        );
    }
}
PK�^�\��^��?pear/Symfony/Component/HttpKernel/EventListener/EsiListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\HttpCache\Esi;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * EsiListener adds a Surrogate-Control HTTP header when the Response needs to be parsed for ESI.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class EsiListener implements EventSubscriberInterface
{
    private $esi;

    /**
     * Constructor.
     *
     * @param Esi $esi An ESI instance
     */
    public function __construct(Esi $esi = null)
    {
        $this->esi = $esi;
    }

    /**
     * Filters the Response.
     *
     * @param FilterResponseEvent $event A FilterResponseEvent instance
     */
    public function onKernelResponse(FilterResponseEvent $event)
    {
        if (!$event->isMasterRequest() || null === $this->esi) {
            return;
        }

        $this->esi->addSurrogateControl($event->getResponse());
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::RESPONSE => 'onKernelResponse',
        );
    }
}
PK_�\/�)A
A
Gpear/Symfony/Component/HttpKernel/EventListener/TestSessionListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * TestSessionListener.
 *
 * Saves session in test environment.
 *
 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class TestSessionListener implements EventSubscriberInterface
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
            return;
        }

        // bootstrap the session
        $session = $this->getSession();
        if (!$session) {
            return;
        }

        $cookies = $event->getRequest()->cookies;

        if ($cookies->has($session->getName())) {
            $session->setId($cookies->get($session->getName()));
        }
    }

    /**
     * Checks if session was initialized and saves if current request is master
     * Runs on 'kernel.response' in test environment
     *
     * @param FilterResponseEvent $event
     */
    public function onKernelResponse(FilterResponseEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
            return;
        }

        $session = $event->getRequest()->getSession();
        if ($session && $session->isStarted()) {
            $session->save();
            $params = session_get_cookie_params();
            $event->getResponse()->headers->setCookie(new Cookie($session->getName(), $session->getId(), 0 === $params['lifetime'] ? 0 : time() + $params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly']));
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array('onKernelRequest', 192),
            KernelEvents::RESPONSE => array('onKernelResponse', -128),
        );
    }

    /**
     * Gets the session object.
     *
     * @return SessionInterface|null A SessionInterface instance of null if no session is available
     */
    abstract protected function getSession();
}
PK_�\@S��Cpear/Symfony/Component/HttpKernel/EventListener/SessionListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Sets the session in the request.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
abstract class SessionListener implements EventSubscriberInterface
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
            return;
        }

        $request = $event->getRequest();
        $session = $this->getSession();
        if (null === $session || $request->hasSession()) {
            return;
        }

        $request->setSession($session);
    }

    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array('onKernelRequest', 128),
        );
    }

    /**
     * Gets the session object.
     *
     * @return SessionInterface|null A SessionInterface instance of null if no session is available
     */
    abstract protected function getSession();
}
PK_�\E^����Dpear/Symfony/Component/HttpKernel/EventListener/ProfilerListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Profiler\Profiler;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * ProfilerListener collects data for the current request by listening to the onKernelResponse event.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ProfilerListener implements EventSubscriberInterface
{
    protected $profiler;
    protected $matcher;
    protected $onlyException;
    protected $onlyMasterRequests;
    protected $exception;
    protected $requests = array();
    protected $profiles;
    protected $requestStack;
    protected $parents;

    /**
     * Constructor.
     *
     * @param Profiler                $profiler           A Profiler instance
     * @param RequestMatcherInterface $matcher            A RequestMatcher instance
     * @param Boolean                 $onlyException      true if the profiler only collects data when an exception occurs, false otherwise
     * @param Boolean                 $onlyMasterRequests true if the profiler only collects data when the request is a master request, false otherwise
     */
    public function __construct(Profiler $profiler, RequestMatcherInterface $matcher = null, $onlyException = false, $onlyMasterRequests = false, RequestStack $requestStack = null)
    {
        $this->profiler = $profiler;
        $this->matcher = $matcher;
        $this->onlyException = (Boolean) $onlyException;
        $this->onlyMasterRequests = (Boolean) $onlyMasterRequests;
        $this->profiles = new \SplObjectStorage();
        $this->parents = new \SplObjectStorage();
        $this->requestStack = $requestStack;
    }

    /**
     * Handles the onKernelException event.
     *
     * @param GetResponseForExceptionEvent $event A GetResponseForExceptionEvent instance
     */
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        if ($this->onlyMasterRequests && !$event->isMasterRequest()) {
            return;
        }

        $this->exception = $event->getException();
    }

    /**
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function onKernelRequest(GetResponseEvent $event)
    {
        if (null === $this->requestStack) {
            $this->requests[] = $event->getRequest();
        }
    }

    /**
     * Handles the onKernelResponse event.
     *
     * @param FilterResponseEvent $event A FilterResponseEvent instance
     */
    public function onKernelResponse(FilterResponseEvent $event)
    {
        $master = $event->isMasterRequest();
        if ($this->onlyMasterRequests && !$master) {
            return;
        }

        if ($this->onlyException && null === $this->exception) {
            return;
        }

        $request = $event->getRequest();
        $exception = $this->exception;
        $this->exception = null;

        if (null !== $this->matcher && !$this->matcher->matches($request)) {
            return;
        }

        if (!$profile = $this->profiler->collect($request, $event->getResponse(), $exception)) {
            return;
        }

        $this->profiles[$request] = $profile;

        if (null !== $this->requestStack) {
            $this->parents[$request] = $this->requestStack->getParentRequest();
        } elseif (!$master) {
            // to be removed when requestStack is required
            array_pop($this->requests);

            $this->parents[$request] = end($this->requests);
        }
    }

    public function onKernelTerminate(PostResponseEvent $event)
    {
        // attach children to parents
        foreach ($this->profiles as $request) {
            // isset call should be removed when requestStack is required
            if (isset($this->parents[$request]) && null !== $parentRequest = $this->parents[$request]) {
                if (isset($this->profiles[$parentRequest])) {
                    $this->profiles[$parentRequest]->addChild($this->profiles[$request]);
                }
            }
        }

        // save profiles
        foreach ($this->profiles as $request) {
            $this->profiler->saveProfile($this->profiles[$request]);
        }

        $this->profiles = new \SplObjectStorage();
        $this->parents = new \SplObjectStorage();
        $this->requests = array();
    }

    public static function getSubscribedEvents()
    {
        return array(
            // kernel.request must be registered as early as possible to not break
            // when an exception is thrown in any other kernel.request listener
            KernelEvents::REQUEST => array('onKernelRequest', 1024),
            KernelEvents::RESPONSE => array('onKernelResponse', -100),
            KernelEvents::EXCEPTION => 'onKernelException',
            KernelEvents::TERMINATE => array('onKernelTerminate', -1024),
        );
    }
}
PK_�\�J�z��/pear/Symfony/Component/HttpKernel/UriSigner.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel;

/**
 * Signs URIs.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class UriSigner
{
    private $secret;

    /**
     * Constructor.
     *
     * @param string $secret A secret
     */
    public function __construct($secret)
    {
        $this->secret = $secret;
    }

    /**
     * Signs a URI.
     *
     * The given URI is signed by adding a _hash query string parameter
     * which value depends on the URI and the secret.
     *
     * @param string $uri A URI to sign
     *
     * @return string The signed URI
     */
    public function sign($uri)
    {
        return $uri.(false === (strpos($uri, '?')) ? '?' : '&').'_hash='.$this->computeHash($uri);
    }

    /**
     * Checks that a URI contains the correct hash.
     *
     * The _hash query string parameter must be the last one
     * (as it is generated that way by the sign() method, it should
     * never be a problem).
     *
     * @param string $uri A signed URI
     *
     * @return Boolean True if the URI is signed correctly, false otherwise
     */
    public function check($uri)
    {
        if (!preg_match('/^(.*)(?:\?|&)_hash=(.+?)$/', $uri, $matches)) {
            return false;
        }

        return $this->computeHash($matches[1]) === $matches[2];
    }

    private function computeHash($uri)
    {
        return urlencode(base64_encode(hash_hmac('sha256', $uri, $this->secret, true)));
    }
}
PK_�\+�;XXOpear/Symfony/Component/HttpKernel/Exception/ServiceUnavailableHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * ServiceUnavailableHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 */
class ServiceUnavailableHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param int|string  $retryAfter The number of seconds or HTTP-date after which the request may be retried
     * @param string      $message    The internal exception message
     * @param \Exception  $previous   The previous exception
     * @param integer     $code       The internal exception code
     */
    public function __construct($retryAfter = null, $message = null, \Exception $previous = null, $code = 0)
    {
        $headers = array();
        if ($retryAfter) {
            $headers = array('Retry-After' => $retryAfter);
        }

        parent::__construct(503, $message, $previous, $headers, $code);
    }
}
PK_�\*���Ipear/Symfony/Component/HttpKernel/Exception/UnauthorizedHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * UnauthorizedHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 */
class UnauthorizedHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $challenge WWW-Authenticate challenge string
     * @param string     $message   The internal exception message
     * @param \Exception $previous  The previous exception
     * @param integer    $code      The internal exception code
     */
    public function __construct($challenge, $message = null, \Exception $previous = null, $code = 0)
    {
        $headers = array('WWW-Authenticate' => $challenge);

        parent::__construct(401, $message, $previous, $headers, $code);
    }
}
PK_�\�ST��@pear/Symfony/Component/HttpKernel/Exception/FlattenException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

use Symfony\Component\Debug\Exception\FlattenException as DebugFlattenException;

/**
 * FlattenException wraps a PHP Exception to be able to serialize it.
 *
 * Basically, this class removes all objects from the trace.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
 */
class FlattenException extends DebugFlattenException
{
}
PK_�\�瞻??Epear/Symfony/Component/HttpKernel/Exception/NotFoundHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * NotFoundHttpException.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class NotFoundHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message  The internal exception message
     * @param \Exception $previous The previous exception
     * @param integer    $code     The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(404, $message, $previous, array(), $code);
    }
}
PK_�\W1�d��=pear/Symfony/Component/HttpKernel/Exception/HttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * HttpException.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 */
class HttpException extends \RuntimeException implements HttpExceptionInterface
{
    private $statusCode;
    private $headers;

    public function __construct($statusCode, $message = null, \Exception $previous = null, array $headers = array(), $code = 0)
    {
        $this->statusCode = $statusCode;
        $this->headers = $headers;

        parent::__construct($message, $code, $previous);
    }

    public function getStatusCode()
    {
        return $this->statusCode;
    }

    public function getHeaders()
    {
        return $this->headers;
    }
}
PK_�\C%؝SSQpear/Symfony/Component/HttpKernel/Exception/UnsupportedMediaTypeHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * UnsupportedMediaTypeHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 */
class UnsupportedMediaTypeHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message   The internal exception message
     * @param \Exception $previous  The previous exception
     * @param integer    $code      The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(415, $message, $previous, array(), $code);
    }
}
PK_�\^���Cpear/Symfony/Component/HttpKernel/Exception/FatalErrorException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

use Symfony\Component\Debug\Exception\FatalErrorException as DebugFatalErrorException;

/**
 * Fatal Error Exception.
 *
 * @author Konstanton Myakshin <koc-dp@yandex.ru>
 *
 * @deprecated Deprecated in 2.3, to be removed in 3.0. Use the same class from the Debug component instead.
 */
class FatalErrorException extends DebugFatalErrorException
{
}
PK_�\<��~��Mpear/Symfony/Component/HttpKernel/Exception/MethodNotAllowedHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * MethodNotAllowedHttpException.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 */
class MethodNotAllowedHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param array      $allow    An array of allowed methods
     * @param string     $message  The internal exception message
     * @param \Exception $previous The previous exception
     * @param integer    $code     The internal exception code
     */
    public function __construct(array $allow, $message = null, \Exception $previous = null, $code = 0)
    {
        $headers = array('Allow' => strtoupper(implode(', ', $allow)));

        parent::__construct(405, $message, $previous, $headers, $code);
    }
}
PK_�\��7��Lpear/Symfony/Component/HttpKernel/Exception/TooManyRequestsHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * TooManyRequestsHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 * @see http://tools.ietf.org/html/rfc6585
 */
class TooManyRequestsHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param integer|string $retryAfter The number of seconds or HTTP-date after which the request may be retried
     * @param string         $message    The internal exception message
     * @param \Exception     $previous   The previous exception
     * @param integer        $code       The internal exception code
     */
    public function __construct($retryAfter = null, $message = null, \Exception $previous = null, $code = 0)
    {
        $headers = array();
        if ($retryAfter) {
            $headers = array('Retry-After' => $retryAfter);
        }

        parent::__construct(429, $message, $previous, $headers, $code);
    }
}
PK_�\�� GGKpear/Symfony/Component/HttpKernel/Exception/LengthRequiredHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * LengthRequiredHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 */
class LengthRequiredHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message   The internal exception message
     * @param \Exception $previous  The previous exception
     * @param integer    $code      The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(411, $message, $previous, array(), $code);
    }
}
PK_�\)8*uuIpear/Symfony/Component/HttpKernel/Exception/AccessDeniedHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * AccessDeniedHttpException.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Christophe Coevoet <stof@notk.org>
 */
class AccessDeniedHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message  The internal exception message
     * @param \Exception $previous The previous exception
     * @param integer    $code     The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(403, $message, $previous, array(), $code);
    }
}
PK_�\N�0�;;Epear/Symfony/Component/HttpKernel/Exception/ConflictHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * ConflictHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 */
class ConflictHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message   The internal exception message
     * @param \Exception $previous  The previous exception
     * @param integer    $code      The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(409, $message, $previous, array(), $code);
    }
}
PK_�\���EEJpear/Symfony/Component/HttpKernel/Exception/NotAcceptableHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * NotAcceptableHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 */
class NotAcceptableHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message   The internal exception message
     * @param \Exception $previous  The previous exception
     * @param integer    $code      The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(406, $message, $previous, array(), $code);
    }
}
PK_�\rQrW��Fpear/Symfony/Component/HttpKernel/Exception/HttpExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * Interface for HTTP error exceptions.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 */
interface HttpExceptionInterface
{
    /**
     * Returns the status code.
     *
     * @return integer An HTTP response status code
     */
    public function getStatusCode();

    /**
     * Returns response headers.
     *
     * @return array Response headers
     */
    public function getHeaders();
}
PK	_�\�+�~~Qpear/Symfony/Component/HttpKernel/Exception/PreconditionRequiredHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * PreconditionRequiredHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 * @see http://tools.ietf.org/html/rfc6585
 */
class PreconditionRequiredHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message   The internal exception message
     * @param \Exception $previous  The previous exception
     * @param integer    $code      The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(428, $message, $previous, array(), $code);
    }
}
PK
_�\�Ѕ33Apear/Symfony/Component/HttpKernel/Exception/GoneHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * GoneHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 */
class GoneHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message   The internal exception message
     * @param \Exception $previous  The previous exception
     * @param integer    $code      The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(410, $message, $previous, array(), $code);
    }
}
PK
_�\�;C�OOOpear/Symfony/Component/HttpKernel/Exception/PreconditionFailedHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * PreconditionFailedHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 */
class PreconditionFailedHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message   The internal exception message
     * @param \Exception $previous  The previous exception
     * @param integer    $code      The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(412, $message, $previous, array(), $code);
    }
}
PK_�\[G�??Gpear/Symfony/Component/HttpKernel/Exception/BadRequestHttpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * BadRequestHttpException.
 *
 * @author Ben Ramsey <ben@benramsey.com>
 */
class BadRequestHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message   The internal exception message
     * @param \Exception $previous  The previous exception
     * @param integer    $code      The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(400, $message, $previous, array(), $code);
    }
}
PK_�\��d��8pear/Symfony/Component/HttpKernel/Config/FileLocator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Config;

use Symfony\Component\Config\FileLocator as BaseFileLocator;
use Symfony\Component\HttpKernel\KernelInterface;

/**
 * FileLocator uses the KernelInterface to locate resources in bundles.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FileLocator extends BaseFileLocator
{
    private $kernel;
    private $path;

    /**
     * Constructor.
     *
     * @param KernelInterface $kernel A KernelInterface instance
     * @param null|string     $path   The path the global resource directory
     * @param array           $paths  An array of paths where to look for resources
     */
    public function __construct(KernelInterface $kernel, $path = null, array $paths = array())
    {
        $this->kernel = $kernel;
        if (null !== $path) {
            $this->path = $path;
            $paths[] = $path;
        }

        parent::__construct($paths);
    }

    /**
     * {@inheritdoc}
     */
    public function locate($file, $currentPath = null, $first = true)
    {
        if ('@' === $file[0]) {
            return $this->kernel->locateResource($file, $this->path, $first);
        }

        return parent::locate($file, $currentPath, $first);
    }
}
PK_�\���=AA9pear/Symfony/Component/HttpKernel/HttpKernelInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * HttpKernelInterface handles a Request to convert it to a Response.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface HttpKernelInterface
{
    const MASTER_REQUEST = 1;
    const SUB_REQUEST = 2;

    /**
     * Handles a Request to convert it to a Response.
     *
     * When $catch is true, the implementation must catch all exceptions
     * and do its best to convert them to a Response instance.
     *
     * @param Request $request A Request instance
     * @param integer $type    The type of the request
     *                          (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
     * @param Boolean $catch Whether to catch exceptions or not
     *
     * @return Response A Response instance
     *
     * @throws \Exception When an Exception occurs during processing
     *
     * @api
     */
    public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true);
}
PK_�\Yxځ55Hpear/Symfony/Component/HttpKernel/CacheClearer/CacheClearerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\CacheClearer;

/**
 * CacheClearerInterface.
 *
 * @author Dustin Dobervich <ddobervich@gmail.com>
 */
interface CacheClearerInterface
{
    /**
     * Clears any caches necessary.
     *
     * @param string $cacheDir The cache directory.
     */
    public function clear($cacheDir);
}
PK
_�\���Dpear/Symfony/Component/HttpKernel/CacheClearer/ChainCacheClearer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\CacheClearer;

/**
 * ChainCacheClearer.
 *
 * @author Dustin Dobervich <ddobervich@gmail.com>
 */
class ChainCacheClearer implements CacheClearerInterface
{
    /**
     * @var array $clearers
     */
    protected $clearers;

    /**
     * Constructs a new instance of ChainCacheClearer.
     *
     * @param array $clearers The initial clearers.
     */
    public function __construct(array $clearers = array())
    {
        $this->clearers = $clearers;
    }

    /**
     * {@inheritDoc}
     */
    public function clear($cacheDir)
    {
        foreach ($this->clearers as $clearer) {
            $clearer->clear($cacheDir);
        }
    }

    /**
     * Adds a cache clearer to the aggregate.
     *
     * @param CacheClearerInterface $clearer
     */
    public function add(CacheClearerInterface $clearer)
    {
        $this->clearers[] = $clearer;
    }
}
PK_�\��R��>pear/Symfony/Component/HttpKernel/Fragment/FragmentHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Controller\ControllerReference;

/**
 * Renders a URI that represents a resource fragment.
 *
 * This class handles the rendering of resource fragments that are included into
 * a main resource. The handling of the rendering is managed by specialized renderers.
 *
 * This listener works in 2 modes:
 *
 *  * 2.3 compatibility mode where you must call setRequest whenever the Request changes.
 *  * 2.4+ mode where you must pass a RequestStack instance in the constructor.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @see FragmentRendererInterface
 */
class FragmentHandler
{
    private $debug;
    private $renderers = array();
    private $request;
    private $requestStack;

    /**
     * Constructor.
     *
     * RequestStack will become required in 3.0.
     *
     * @param FragmentRendererInterface[] $renderers    An array of FragmentRendererInterface instances
     * @param Boolean                     $debug        Whether the debug mode is enabled or not
     * @param RequestStack|null           $requestStack The Request stack that controls the lifecycle of requests
     */
    public function __construct(array $renderers = array(), $debug = false, RequestStack $requestStack = null)
    {
        $this->requestStack = $requestStack;
        foreach ($renderers as $renderer) {
            $this->addRenderer($renderer);
        }
        $this->debug = $debug;
    }

    /**
     * Adds a renderer.
     *
     * @param FragmentRendererInterface $renderer A FragmentRendererInterface instance
     */
    public function addRenderer(FragmentRendererInterface $renderer)
    {
        $this->renderers[$renderer->getName()] = $renderer;
    }

    /**
     * Sets the current Request.
     *
     * This method was used to synchronize the Request, but as the HttpKernel
     * is doing that automatically now, you should never call it directly.
     * It is kept public for BC with the 2.3 version.
     *
     * @param Request|null $request A Request instance
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function setRequest(Request $request = null)
    {
        $this->request = $request;
    }

    /**
     * Renders a URI and returns the Response content.
     *
     * Available options:
     *
     *  * ignore_errors: true to return an empty string in case of an error
     *
     * @param string|ControllerReference $uri      A URI as a string or a ControllerReference instance
     * @param string                     $renderer The renderer name
     * @param array                      $options  An array of options
     *
     * @return string|null The Response content or null when the Response is streamed
     *
     * @throws \InvalidArgumentException when the renderer does not exist
     * @throws \LogicException           when the Request is not successful
     */
    public function render($uri, $renderer = 'inline', array $options = array())
    {
        if (!isset($options['ignore_errors'])) {
            $options['ignore_errors'] = !$this->debug;
        }

        if (!isset($this->renderers[$renderer])) {
            throw new \InvalidArgumentException(sprintf('The "%s" renderer does not exist.', $renderer));
        }

        if (!$request = $this->getRequest()) {
            throw new \LogicException('Rendering a fragment can only be done when handling a Request.');
        }

        return $this->deliver($this->renderers[$renderer]->render($uri, $request, $options));
    }

    /**
     * Delivers the Response as a string.
     *
     * When the Response is a StreamedResponse, the content is streamed immediately
     * instead of being returned.
     *
     * @param Response $response A Response instance
     *
     * @return string|null The Response content or null when the Response is streamed
     *
     * @throws \RuntimeException when the Response is not successful
     */
    protected function deliver(Response $response)
    {
        if (!$response->isSuccessful()) {
            throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %s).', $this->getRequest()->getUri(), $response->getStatusCode()));
        }

        if (!$response instanceof StreamedResponse) {
            return $response->getContent();
        }

        $response->sendContent();
    }

    private function getRequest()
    {
        return $this->requestStack ? $this->requestStack->getCurrentRequest() : $this->request;
    }
}
PK_�\�j�g�	�	Bpear/Symfony/Component/HttpKernel/Fragment/EsiFragmentRenderer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\HttpCache\Esi;

/**
 * Implements the ESI rendering strategy.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class EsiFragmentRenderer extends RoutableFragmentRenderer
{
    private $esi;
    private $inlineStrategy;

    /**
     * Constructor.
     *
     * The "fallback" strategy when ESI is not available should always be an
     * instance of InlineFragmentRenderer.
     *
     * @param Esi                    $esi            An Esi instance
     * @param InlineFragmentRenderer $inlineStrategy The inline strategy to use when ESI is not supported
     */
    public function __construct(Esi $esi = null, InlineFragmentRenderer $inlineStrategy)
    {
        $this->esi = $esi;
        $this->inlineStrategy = $inlineStrategy;
    }

    /**
     * {@inheritdoc}
     *
     * Note that if the current Request has no ESI capability, this method
     * falls back to use the inline rendering strategy.
     *
     * Additional available options:
     *
     *  * alt: an alternative URI to render in case of an error
     *  * comment: a comment to add when returning an esi:include tag
     *
     * @see Symfony\Component\HttpKernel\HttpCache\ESI
     */
    public function render($uri, Request $request, array $options = array())
    {
        if (!$this->esi || !$this->esi->hasSurrogateEsiCapability($request)) {
            return $this->inlineStrategy->render($uri, $request, $options);
        }

        if ($uri instanceof ControllerReference) {
            $uri = $this->generateFragmentUri($uri, $request);
        }

        $alt = isset($options['alt']) ? $options['alt'] : null;
        if ($alt instanceof ControllerReference) {
            $alt = $this->generateFragmentUri($alt, $request);
        }

        $tag = $this->esi->renderIncludeTag($uri, $alt, isset($options['ignore_errors']) ? $options['ignore_errors'] : false, isset($options['comment']) ? $options['comment'] : '');

        return new Response($tag);
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'esi';
    }
}
PK_�\qK-##Epear/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * Implements the inline rendering strategy where the Request is rendered by the current HTTP kernel.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class InlineFragmentRenderer extends RoutableFragmentRenderer
{
    private $kernel;
    private $dispatcher;

    /**
     * Constructor.
     *
     * @param HttpKernelInterface      $kernel     A HttpKernelInterface instance
     * @param EventDispatcherInterface $dispatcher A EventDispatcherInterface instance
     */
    public function __construct(HttpKernelInterface $kernel, EventDispatcherInterface $dispatcher = null)
    {
        $this->kernel = $kernel;
        $this->dispatcher = $dispatcher;
    }

    /**
     * {@inheritdoc}
     *
     * Additional available options:
     *
     *  * alt: an alternative URI to render in case of an error
     */
    public function render($uri, Request $request, array $options = array())
    {
        $reference = null;
        if ($uri instanceof ControllerReference) {
            $reference = $uri;

            // Remove attributes from the generated URI because if not, the Symfony
            // routing system will use them to populate the Request attributes. We don't
            // want that as we want to preserve objects (so we manually set Request attributes
            // below instead)
            $attributes = $reference->attributes;
            $reference->attributes = array();

            // The request format and locale might have been overridden by the user
            foreach (array('_format', '_locale') as $key) {
                if (isset($attributes[$key])) {
                    $reference->attributes[$key] = $attributes[$key];
                }
            }

            $uri = $this->generateFragmentUri($uri, $request, false, false);

            $reference->attributes = array_merge($attributes, $reference->attributes);
        }

        $subRequest = $this->createSubRequest($uri, $request);

        // override Request attributes as they can be objects (which are not supported by the generated URI)
        if (null !== $reference) {
            $subRequest->attributes->add($reference->attributes);
        }

        $level = ob_get_level();
        try {
            return $this->kernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);
        } catch (\Exception $e) {
            // we dispatch the exception event to trigger the logging
            // the response that comes back is simply ignored
            if (isset($options['ignore_errors']) && $options['ignore_errors'] && $this->dispatcher) {
                $event = new GetResponseForExceptionEvent($this->kernel, $request, HttpKernelInterface::SUB_REQUEST, $e);

                $this->dispatcher->dispatch(KernelEvents::EXCEPTION, $event);
            }

            // let's clean up the output buffers that were created by the sub-request
            while (ob_get_level() > $level) {
                ob_get_clean();
            }

            if (isset($options['alt'])) {
                $alt = $options['alt'];
                unset($options['alt']);

                return $this->render($alt, $request, $options);
            }

            if (!isset($options['ignore_errors']) || !$options['ignore_errors']) {
                throw $e;
            }

            return new Response();
        }
    }

    protected function createSubRequest($uri, Request $request)
    {
        $cookies = $request->cookies->all();
        $server = $request->server->all();

        // Override the arguments to emulate a sub-request.
        // Sub-request object will point to localhost as client ip and real client ip
        // will be included into trusted header for client ip
        try {
            if ($trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
                $currentXForwardedFor = $request->headers->get($trustedHeaderName, '');

                $server['HTTP_'.$trustedHeaderName] = ($currentXForwardedFor ? $currentXForwardedFor.', ' : '').$request->getClientIp();
            }
        } catch (\InvalidArgumentException $e) {
            // Do nothing
        }

        $server['REMOTE_ADDR'] = '127.0.0.1';

        $subRequest = Request::create($uri, 'get', array(), $cookies, array(), $server);
        if ($request->headers->has('Surrogate-Capability')) {
            $subRequest->headers->set('Surrogate-Capability', $request->headers->get('Surrogate-Capability'));
        }

        if ($session = $request->getSession()) {
            $subRequest->setSession($session);
        }

        return $subRequest;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'inline';
    }
}
PK_�\z�����Hpear/Symfony/Component/HttpKernel/Fragment/FragmentRendererInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpFoundation\Response;

/**
 * Interface implemented by all rendering strategies.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @see Symfony\Component\HttpKernel\FragmentRenderer
 */
interface FragmentRendererInterface
{
    /**
     * Renders a URI and returns the Response content.
     *
     * @param string|ControllerReference $uri     A URI as a string or a ControllerReference instance
     * @param Request                    $request A Request instance
     * @param array                      $options An array of options
     *
     * @return Response A Response instance
     */
    public function render($uri, Request $request, array $options = array());

    /**
     * Gets the name of the strategy.
     *
     * @return string The strategy name
     */
    public function getName();
}
PK_�\m���33Gpear/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Fragment;

use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\EventListener\FragmentListener;

/**
 * Adds the possibility to generate a fragment URI for a given Controller.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class RoutableFragmentRenderer implements FragmentRendererInterface
{
    private $fragmentPath = '/_fragment';

    /**
     * Sets the fragment path that triggers the fragment listener.
     *
     * @param string $path The path
     *
     * @see FragmentListener
     */
    public function setFragmentPath($path)
    {
        $this->fragmentPath = $path;
    }

    /**
     * Generates a fragment URI for a given controller.
     *
     * @param ControllerReference  $reference A ControllerReference instance
     * @param Request              $request   A Request instance
     * @param Boolean              $absolute  Whether to generate an absolute URL or not
     * @param Boolean              $strict    Whether to allow non-scalar attributes or not
     *
     * @return string A fragment URI
     */
    protected function generateFragmentUri(ControllerReference $reference, Request $request, $absolute = false, $strict = true)
    {
        if ($strict) {
            $this->checkNonScalar($reference->attributes);
        }

        // We need to forward the current _format and _locale values as we don't have
        // a proper routing pattern to do the job for us.
        // This makes things inconsistent if you switch from rendering a controller
        // to rendering a route if the route pattern does not contain the special
        // _format and _locale placeholders.
        if (!isset($reference->attributes['_format'])) {
            $reference->attributes['_format'] = $request->getRequestFormat();
        }
        if (!isset($reference->attributes['_locale'])) {
            $reference->attributes['_locale'] = $request->getLocale();
        }

        $reference->attributes['_controller'] = $reference->controller;

        $reference->query['_path'] = http_build_query($reference->attributes, '', '&');

        $path = $this->fragmentPath.'?'.http_build_query($reference->query, '', '&');

        if ($absolute) {
            return $request->getUriForPath($path);
        }

        return $request->getBaseUrl().$path;
    }

    private function checkNonScalar($values)
    {
        foreach ($values as $key => $value) {
            if (is_array($value)) {
                $this->checkNonScalar($value);
            } elseif (!is_scalar($value) && null !== $value) {
                throw new \LogicException(sprintf('Controller attributes cannot contain non-scalar/non-null values (value for key "%s" is not a scalar or null).', $key));
            }
        }
    }
}
PK_�\5앾��Gpear/Symfony/Component/HttpKernel/Fragment/HIncludeFragmentRenderer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Fragment;

if (!defined('ENT_SUBSTITUTE')) {
    define('ENT_SUBSTITUTE', 8);
}

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Templating\EngineInterface;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\UriSigner;

/**
 * Implements the Hinclude rendering strategy.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class HIncludeFragmentRenderer extends RoutableFragmentRenderer
{
    private $globalDefaultTemplate;
    private $signer;
    private $templating;
    private $charset;

    /**
     * Constructor.
     *
     * @param EngineInterface|\Twig_Environment $templating            An EngineInterface or a \Twig_Environment instance
     * @param UriSigner                         $signer                A UriSigner instance
     * @param string                            $globalDefaultTemplate The global default content (it can be a template name or the content)
     * @param string                            $charset
     */
    public function __construct($templating = null, UriSigner $signer = null, $globalDefaultTemplate = null, $charset = 'utf-8')
    {
        $this->setTemplating($templating);
        $this->globalDefaultTemplate = $globalDefaultTemplate;
        $this->signer = $signer;
        $this->charset = $charset;
    }

    /**
     * Sets the templating engine to use to render the default content.
     *
     * @param EngineInterface|\Twig_Environment|null $templating An EngineInterface or a \Twig_Environment instance
     *
     * @throws \InvalidArgumentException
     */
    public function setTemplating($templating)
    {
        if (null !== $templating && !$templating instanceof EngineInterface && !$templating instanceof \Twig_Environment) {
            throw new \InvalidArgumentException('The hinclude rendering strategy needs an instance of \Twig_Environment or Symfony\Component\Templating\EngineInterface');
        }

        $this->templating = $templating;
    }

    /**
     * Checks if a templating engine has been set.
     *
     * @return Boolean true if the templating engine has been set, false otherwise
     */
    public function hasTemplating()
    {
        return null !== $this->templating;
    }

    /**
     * {@inheritdoc}
     *
     * Additional available options:
     *
     *  * default:    The default content (it can be a template name or the content)
     *  * id:         An optional hx:include tag id attribute
     *  * attributes: An optional array of hx:include tag attributes
     */
    public function render($uri, Request $request, array $options = array())
    {
        if ($uri instanceof ControllerReference) {
            if (null === $this->signer) {
                throw new \LogicException('You must use a proper URI when using the Hinclude rendering strategy or set a URL signer.');
            }

            // we need to sign the absolute URI, but want to return the path only.
            $uri = substr($this->signer->sign($this->generateFragmentUri($uri, $request, true)), strlen($request->getSchemeAndHttpHost()));
        }

        // We need to replace ampersands in the URI with the encoded form in order to return valid html/xml content.
        $uri = str_replace('&', '&amp;', $uri);

        $template = isset($options['default']) ? $options['default'] : $this->globalDefaultTemplate;
        if (null !== $this->templating && $template && $this->templateExists($template)) {
            $content = $this->templating->render($template);
        } else {
            $content = $template;
        }

        $attributes = isset($options['attributes']) && is_array($options['attributes']) ? $options['attributes'] : array();
        if (isset($options['id']) && $options['id']) {
            $attributes['id'] = $options['id'];
        }
        $renderedAttributes = '';
        if (count($attributes) > 0) {
            foreach ($attributes as $attribute => $value) {
                $renderedAttributes .= sprintf(
                    ' %s="%s"',
                    htmlspecialchars($attribute, ENT_QUOTES | ENT_SUBSTITUTE, $this->charset, false),
                    htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, $this->charset, false)
                );
            }
        }

        return new Response(sprintf('<hx:include src="%s"%s>%s</hx:include>', $uri, $renderedAttributes, $content));
    }

    /**
     * @param string $template
     *
     * @return boolean
     */
    private function templateExists($template)
    {
        if ($this->templating instanceof EngineInterface) {
            try {
                return $this->templating->exists($template);
            } catch (\InvalidArgumentException $e) {
                return false;
            }
        }

        $loader = $this->templating->getLoader();
        if ($loader instanceof \Twig_ExistsLoaderInterface) {
            return $loader->exists($template);
        }

        try {
            $loader->getSource($template);

            return true;
        } catch (\Twig_Error_Loader $e) {
        }

        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'hinclude';
    }
}
PK_�\�xXXDpear/Symfony/Component/HttpKernel/Controller/ControllerReference.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Controller;

/**
 * Acts as a marker and a data holder for a Controller.
 *
 * Some methods in Symfony accept both a URI (as a string) or a controller as
 * an argument. In the latter case, instead of passing an array representing
 * the controller, you can use an instance of this class.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @see Symfony\Component\HttpKernel\FragmentRenderer
 * @see Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface
 */
class ControllerReference
{
    public $controller;
    public $attributes = array();
    public $query = array();

    /**
     * Constructor.
     *
     * @param string $controller The controller name
     * @param array  $attributes An array of parameters to add to the Request attributes
     * @param array  $query      An array of parameters to add to the Request query string
     */
    public function __construct($controller, array $attributes = array(), array $query = array())
    {
        $this->controller = $controller;
        $this->attributes = $attributes;
        $this->query = $query;
    }
}
PK_�\^/|GooLpear/Symfony/Component/HttpKernel/Controller/ControllerResolverInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Controller;

use Symfony\Component\HttpFoundation\Request;

/**
 * A ControllerResolverInterface implementation knows how to determine the
 * controller to execute based on a Request object.
 *
 * It can also determine the arguments to pass to the Controller.
 *
 * A Controller can be any valid PHP callable.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface ControllerResolverInterface
{
    /**
     * Returns the Controller instance associated with a Request.
     *
     * As several resolvers can exist for a single application, a resolver must
     * return false when it is not able to determine the controller.
     *
     * The resolver must only throw an exception when it should be able to load
     * controller but cannot because of some errors made by the developer.
     *
     * @param Request $request A Request instance
     *
     * @return callable|false A PHP callable representing the Controller,
     *                        or false if this resolver is not able to determine the controller
     *
     * @throws \LogicException If the controller can't be found
     *
     * @api
     */
    public function getController(Request $request);

    /**
     * Returns the arguments to pass to the controller.
     *
     * @param Request  $request    A Request instance
     * @param callable $controller A PHP callable
     *
     * @return array An array of arguments to pass to the controller
     *
     * @throws \RuntimeException When value for argument given is not provided
     *
     * @api
     */
    public function getArguments(Request $request, $controller);
}
PK_�\NC��ttCpear/Symfony/Component/HttpKernel/Controller/ControllerResolver.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Controller;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * ControllerResolver.
 *
 * This implementation uses the '_controller' request attribute to determine
 * the controller to execute and uses the request attributes to determine
 * the controller method arguments.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ControllerResolver implements ControllerResolverInterface
{
    private $logger;

    /**
     * Constructor.
     *
     * @param LoggerInterface $logger A LoggerInterface instance
     */
    public function __construct(LoggerInterface $logger = null)
    {
        $this->logger = $logger;
    }

    /**
     * {@inheritdoc}
     *
     * This method looks for a '_controller' request attribute that represents
     * the controller name (a string like ClassName::MethodName).
     *
     * @api
     */
    public function getController(Request $request)
    {
        if (!$controller = $request->attributes->get('_controller')) {
            if (null !== $this->logger) {
                $this->logger->warning('Unable to look for the controller as the "_controller" parameter is missing');
            }

            return false;
        }

        if (is_array($controller)) {
            return $controller;
        }

        if (is_object($controller)) {
            if (method_exists($controller, '__invoke')) {
                return $controller;
            }

            throw new \InvalidArgumentException(sprintf('Controller "%s" for URI "%s" is not callable.', get_class($controller), $request->getPathInfo()));
        }

        if (false === strpos($controller, ':')) {
            if (method_exists($controller, '__invoke')) {
                return new $controller();
            } elseif (function_exists($controller)) {
                return $controller;
            }
        }

        $callable = $this->createController($controller);

        if (!is_callable($callable)) {
            throw new \InvalidArgumentException(sprintf('Controller "%s" for URI "%s" is not callable.', $controller, $request->getPathInfo()));
        }

        return $callable;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getArguments(Request $request, $controller)
    {
        if (is_array($controller)) {
            $r = new \ReflectionMethod($controller[0], $controller[1]);
        } elseif (is_object($controller) && !$controller instanceof \Closure) {
            $r = new \ReflectionObject($controller);
            $r = $r->getMethod('__invoke');
        } else {
            $r = new \ReflectionFunction($controller);
        }

        return $this->doGetArguments($request, $controller, $r->getParameters());
    }

    protected function doGetArguments(Request $request, $controller, array $parameters)
    {
        $attributes = $request->attributes->all();
        $arguments = array();
        foreach ($parameters as $param) {
            if (array_key_exists($param->name, $attributes)) {
                $arguments[] = $attributes[$param->name];
            } elseif ($param->getClass() && $param->getClass()->isInstance($request)) {
                $arguments[] = $request;
            } elseif ($param->isDefaultValueAvailable()) {
                $arguments[] = $param->getDefaultValue();
            } else {
                if (is_array($controller)) {
                    $repr = sprintf('%s::%s()', get_class($controller[0]), $controller[1]);
                } elseif (is_object($controller)) {
                    $repr = get_class($controller);
                } else {
                    $repr = $controller;
                }

                throw new \RuntimeException(sprintf('Controller "%s" requires that you provide a value for the "$%s" argument (because there is no default value or because there is a non optional argument after this one).', $repr, $param->name));
            }
        }

        return $arguments;
    }

    /**
     * Returns a callable for the given controller.
     *
     * @param string $controller A Controller string
     *
     * @return mixed A PHP callable
     *
     * @throws \InvalidArgumentException
     */
    protected function createController($controller)
    {
        if (false === strpos($controller, '::')) {
            throw new \InvalidArgumentException(sprintf('Unable to find controller "%s".', $controller));
        }

        list($class, $method) = explode('::', $controller, 2);

        if (!class_exists($class)) {
            throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
        }

        return array(new $class(), $method);
    }
}
PK_�\��|�Lpear/Symfony/Component/HttpKernel/Controller/TraceableControllerResolver.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Controller;

use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Component\HttpFoundation\Request;

/**
 * TraceableControllerResolver.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TraceableControllerResolver implements ControllerResolverInterface
{
    private $resolver;
    private $stopwatch;

    /**
     * Constructor.
     *
     * @param ControllerResolverInterface $resolver  A ControllerResolverInterface instance
     * @param Stopwatch                   $stopwatch A Stopwatch instance
     */
    public function __construct(ControllerResolverInterface $resolver, Stopwatch $stopwatch)
    {
        $this->resolver = $resolver;
        $this->stopwatch = $stopwatch;
    }

    /**
     * {@inheritdoc}
     */
    public function getController(Request $request)
    {
        $e = $this->stopwatch->start('controller.get_callable');

        $ret = $this->resolver->getController($request);

        $e->stop();

        return $ret;
    }

    /**
     * {@inheritdoc}
     */
    public function getArguments(Request $request, $controller)
    {
        $e = $this->stopwatch->start('controller.get_arguments');

        $ret = $this->resolver->getArguments($request, $controller);

        $e->stop();

        return $ret;
    }
}
PK_�\��޹�Gpear/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Debug\ErrorHandler;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;

/**
 * LogDataCollector.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class LoggerDataCollector extends DataCollector implements LateDataCollectorInterface
{
    private $logger;

    public function __construct($logger = null)
    {
        if (null !== $logger && $logger instanceof DebugLoggerInterface) {
            $this->logger = $logger;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        // everything is done as late as possible
    }

    /**
     * {@inheritdoc}
     */
    public function lateCollect()
    {
        if (null !== $this->logger) {
            $this->data = array(
                'error_count'       => $this->logger->countErrors(),
                'logs'              => $this->sanitizeLogs($this->logger->getLogs()),
                'deprecation_count' => $this->computeDeprecationCount()
            );
        }
    }

    /**
     * Gets the called events.
     *
     * @return array An array of called events
     *
     * @see TraceableEventDispatcherInterface
     */
    public function countErrors()
    {
        return isset($this->data['error_count']) ? $this->data['error_count'] : 0;
    }

    /**
     * Gets the logs.
     *
     * @return array An array of logs
     */
    public function getLogs()
    {
        return isset($this->data['logs']) ? $this->data['logs'] : array();
    }

    public function countDeprecations()
    {
        return isset($this->data['deprecation_count']) ? $this->data['deprecation_count'] : 0;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'logger';
    }

    private function sanitizeLogs($logs)
    {
        foreach ($logs as $i => $log) {
            $logs[$i]['context'] = $this->sanitizeContext($log['context']);
        }

        return $logs;
    }

    private function sanitizeContext($context)
    {
        if (is_array($context)) {
            foreach ($context as $key => $value) {
                $context[$key] = $this->sanitizeContext($value);
            }

            return $context;
        }

        if (is_resource($context)) {
            return sprintf('Resource(%s)', get_resource_type($context));
        }

        if (is_object($context)) {
            return sprintf('Object(%s)', get_class($context));
        }

        return $context;
    }

    private function computeDeprecationCount()
    {
        $count = 0;
        foreach ($this->logger->getLogs() as $log) {
            if (isset($log['context']['type']) && ErrorHandler::TYPE_DEPRECATION === $log['context']['type']) {
                $count++;
            }
        }

        return $count;
    }
}
PK_�\��+66Fpear/Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector\Util;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ValueExporter
{
    /**
     * Converts a PHP value to a string.
     *
     * @param mixed $value The PHP value
     *
     * @return string The string representation of the given value
     */
    public function exportValue($value)
    {
        if (is_object($value)) {
            return sprintf('Object(%s)', get_class($value));
        }

        if (is_array($value)) {
            $a = array();
            foreach ($value as $k => $v) {
                $a[] = sprintf('%s => %s', $k, $this->exportValue($v));
            }

            return sprintf("Array(%s)", implode(', ', $a));
        }

        if (is_resource($value)) {
            return sprintf('Resource(%s)', get_resource_type($value));
        }

        if (null === $value) {
            return 'null';
        }

        if (false === $value) {
            return 'false';
        }

        if (true === $value) {
            return 'true';
        }

        return (string) $value;
    }
}
PK_�\(���;	;	Gpear/Symfony/Component/HttpKernel/DataCollector/MemoryDataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * MemoryDataCollector.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class MemoryDataCollector extends DataCollector implements LateDataCollectorInterface
{
    public function __construct()
    {
        $this->data = array(
            'memory'       => 0,
            'memory_limit' => $this->convertToBytes(ini_get('memory_limit')),
        );
    }

    /**
     * {@inheritdoc}
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        $this->updateMemoryUsage();
    }

    /**
     * {@inheritdoc}
     */
    public function lateCollect()
    {
        $this->updateMemoryUsage();
    }

    /**
     * Gets the memory.
     *
     * @return integer The memory
     */
    public function getMemory()
    {
        return $this->data['memory'];
    }

    /**
     * Gets the PHP memory limit.
     *
     * @return integer The memory limit
     */
    public function getMemoryLimit()
    {
        return $this->data['memory_limit'];
    }

    /**
     * Updates the memory usage data.
     */
    public function updateMemoryUsage()
    {
        $this->data['memory'] = memory_get_peak_usage(true);
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'memory';
    }

    private function convertToBytes($memoryLimit)
    {
        if ('-1' === $memoryLimit) {
            return -1;
        }

        $memoryLimit = strtolower($memoryLimit);
        $max = strtolower(ltrim($memoryLimit, '+'));
        if (0 === strpos($max, '0x')) {
            $max = intval($max, 16);
        } elseif (0 === strpos($max, '0')) {
            $max = intval($max, 8);
        } else {
            $max = intval($max);
        }

        switch (substr($memoryLimit, -1)) {
            case 't': $max *= 1024;
            case 'g': $max *= 1024;
            case 'm': $max *= 1024;
            case 'k': $max *= 1024;
        }

        return $max;
    }
}
PK_�\����
�
Fpear/Symfony/Component/HttpKernel/DataCollector/EventDataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcherInterface;

/**
 * EventDataCollector.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class EventDataCollector extends DataCollector implements LateDataCollectorInterface
{
    protected $dispatcher;

    public function __construct(EventDispatcherInterface $dispatcher = null)
    {
        $this->dispatcher = $dispatcher;
    }

    /**
     * {@inheritdoc}
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        $this->data = array(
            'called_listeners'     => array(),
            'not_called_listeners' => array(),
        );
    }

    public function lateCollect()
    {
        if ($this->dispatcher instanceof TraceableEventDispatcherInterface) {
            $this->setCalledListeners($this->dispatcher->getCalledListeners());
            $this->setNotCalledListeners($this->dispatcher->getNotCalledListeners());
        }
    }

    /**
     * Sets the called listeners.
     *
     * @param array $listeners An array of called listeners
     *
     * @see TraceableEventDispatcherInterface
     */
    public function setCalledListeners(array $listeners)
    {
        $this->data['called_listeners'] = $listeners;
    }

    /**
     * Gets the called listeners.
     *
     * @return array An array of called listeners
     *
     * @see TraceableEventDispatcherInterface
     */
    public function getCalledListeners()
    {
        return $this->data['called_listeners'];
    }

    /**
     * Sets the not called listeners.
     *
     * @param array $listeners An array of not called listeners
     *
     * @see TraceableEventDispatcherInterface
     */
    public function setNotCalledListeners(array $listeners)
    {
        $this->data['not_called_listeners'] = $listeners;
    }

    /**
     * Gets the not called listeners.
     *
     * @return array An array of not called listeners
     *
     * @see TraceableEventDispatcherInterface
     */
    public function getNotCalledListeners()
    {
        return $this->data['not_called_listeners'];
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'events';
    }
}
PK_�\IYz��(�(Hpear/Symfony/Component/HttpKernel/DataCollector/RequestDataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\HeaderBag;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * RequestDataCollector.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class RequestDataCollector extends DataCollector implements EventSubscriberInterface
{
    protected $controllers;

    public function __construct()
    {
        $this->controllers = new \SplObjectStorage();
    }

    /**
     * {@inheritdoc}
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        $responseHeaders = $response->headers->all();
        $cookies = array();
        foreach ($response->headers->getCookies() as $cookie) {
            $cookies[] = $this->getCookieHeader($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
        }
        if (count($cookies) > 0) {
            $responseHeaders['Set-Cookie'] = $cookies;
        }

        $attributes = array();
        foreach ($request->attributes->all() as $key => $value) {
            if ('_route' === $key && is_object($value)) {
                $attributes['_route'] = $this->varToString($value->getPath());
            } elseif ('_route_params' === $key) {
                foreach ($value as $key => $v) {
                    $attributes['_route_params'][$key] = $this->varToString($v);
                }
            } else {
                $attributes[$key] = $this->varToString($value);
            }
        }

        $content = null;
        try {
            $content = $request->getContent();
        } catch (\LogicException $e) {
            // the user already got the request content as a resource
            $content = false;
        }

        $sessionMetadata = array();
        $sessionAttributes = array();
        $flashes = array();
        if ($request->hasSession()) {
            $session = $request->getSession();
            if ($session->isStarted()) {
                $sessionMetadata['Created'] = date(DATE_RFC822, $session->getMetadataBag()->getCreated());
                $sessionMetadata['Last used'] = date(DATE_RFC822, $session->getMetadataBag()->getLastUsed());
                $sessionMetadata['Lifetime'] = $session->getMetadataBag()->getLifetime();
                $sessionAttributes = $session->all();
                $flashes = $session->getFlashBag()->peekAll();
            }
        }

        $statusCode = $response->getStatusCode();

        $this->data = array(
            'format'             => $request->getRequestFormat(),
            'content'            => $content,
            'content_type'       => $response->headers->get('Content-Type') ? $response->headers->get('Content-Type') : 'text/html',
            'status_text'        => isset(Response::$statusTexts[$statusCode]) ? Response::$statusTexts[$statusCode] : '',
            'status_code'        => $statusCode,
            'request_query'      => $request->query->all(),
            'request_request'    => $request->request->all(),
            'request_headers'    => $request->headers->all(),
            'request_server'     => $request->server->all(),
            'request_cookies'    => $request->cookies->all(),
            'request_attributes' => $attributes,
            'response_headers'   => $responseHeaders,
            'session_metadata'   => $sessionMetadata,
            'session_attributes' => $sessionAttributes,
            'flashes'            => $flashes,
            'path_info'          => $request->getPathInfo(),
            'controller'         => 'n/a',
            'locale'             => $request->getLocale(),
        );

        if (isset($this->data['request_headers']['php-auth-pw'])) {
            $this->data['request_headers']['php-auth-pw'] = '******';
        }

        if (isset($this->data['request_server']['PHP_AUTH_PW'])) {
            $this->data['request_server']['PHP_AUTH_PW'] = '******';
        }

        if (isset($this->controllers[$request])) {
            $controller = $this->controllers[$request];
            if (is_array($controller)) {
                try {
                    $r = new \ReflectionMethod($controller[0], $controller[1]);
                    $this->data['controller'] = array(
                        'class'  => is_object($controller[0]) ? get_class($controller[0]) : $controller[0],
                        'method' => $controller[1],
                        'file'   => $r->getFilename(),
                        'line'   => $r->getStartLine(),
                    );
                } catch (\ReflectionException $re) {
                    if (is_callable($controller)) {
                        // using __call or  __callStatic
                        $this->data['controller'] = array(
                            'class'  => is_object($controller[0]) ? get_class($controller[0]) : $controller[0],
                            'method' => $controller[1],
                            'file'   => 'n/a',
                            'line'   => 'n/a',
                        );
                    }
                }
            } elseif ($controller instanceof \Closure) {
                $r = new \ReflectionFunction($controller);
                $this->data['controller'] = array(
                    'class'  => $r->getName(),
                    'method' => null,
                    'file'   => $r->getFilename(),
                    'line'   => $r->getStartLine(),
                );
            } else {
                $this->data['controller'] = (string) $controller ?: 'n/a';
            }
            unset($this->controllers[$request]);
        }
    }

    public function getPathInfo()
    {
        return $this->data['path_info'];
    }

    public function getRequestRequest()
    {
        return new ParameterBag($this->data['request_request']);
    }

    public function getRequestQuery()
    {
        return new ParameterBag($this->data['request_query']);
    }

    public function getRequestHeaders()
    {
        return new HeaderBag($this->data['request_headers']);
    }

    public function getRequestServer()
    {
        return new ParameterBag($this->data['request_server']);
    }

    public function getRequestCookies()
    {
        return new ParameterBag($this->data['request_cookies']);
    }

    public function getRequestAttributes()
    {
        return new ParameterBag($this->data['request_attributes']);
    }

    public function getResponseHeaders()
    {
        return new ResponseHeaderBag($this->data['response_headers']);
    }

    public function getSessionMetadata()
    {
        return $this->data['session_metadata'];
    }

    public function getSessionAttributes()
    {
        return $this->data['session_attributes'];
    }

    public function getFlashes()
    {
        return $this->data['flashes'];
    }

    public function getContent()
    {
        return $this->data['content'];
    }

    public function getContentType()
    {
        return $this->data['content_type'];
    }

    public function getStatusText()
    {
        return $this->data['status_text'];
    }

    public function getStatusCode()
    {
        return $this->data['status_code'];
    }

    public function getFormat()
    {
        return $this->data['format'];
    }

    public function getLocale()
    {
        return $this->data['locale'];
    }

    /**
     * Gets the route name.
     *
     * The _route request attributes is automatically set by the Router Matcher.
     *
     * @return string The route
     */
    public function getRoute()
    {
        return isset($this->data['request_attributes']['_route']) ? $this->data['request_attributes']['_route'] : '';
    }

    /**
     * Gets the route parameters.
     *
     * The _route_params request attributes is automatically set by the RouterListener.
     *
     * @return array The parameters
     */
    public function getRouteParams()
    {
        return isset($this->data['request_attributes']['_route_params']) ? $this->data['request_attributes']['_route_params'] : array();
    }

    /**
     * Gets the controller.
     *
     * @return string The controller as a string
     */
    public function getController()
    {
        return $this->data['controller'];
    }

    public function onKernelController(FilterControllerEvent $event)
    {
        $this->controllers[$event->getRequest()] = $event->getController();
    }

    public static function getSubscribedEvents()
    {
        return array(KernelEvents::CONTROLLER => 'onKernelController');
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'request';
    }

    private function getCookieHeader($name, $value, $expires, $path, $domain, $secure, $httponly)
    {
        $cookie = sprintf('%s=%s', $name, urlencode($value));

        if (0 !== $expires) {
            if (is_numeric($expires)) {
                $expires = (int) $expires;
            } elseif ($expires instanceof \DateTime) {
                $expires = $expires->getTimestamp();
            } else {
                $expires = strtotime($expires);
                if (false === $expires || -1 == $expires) {
                    throw new \InvalidArgumentException(sprintf('The "expires" cookie parameter is not valid.', $expires));
                }
            }

            $cookie .= '; expires='.str_replace('+0000', '', \DateTime::createFromFormat('U', $expires, new \DateTimeZone('GMT'))->format('D, d-M-Y H:i:s T'));
        }

        if ($domain) {
            $cookie .= '; domain='.$domain;
        }

        $cookie .= '; path='.$path;

        if ($secure) {
            $cookie .= '; secure';
        }

        if ($httponly) {
            $cookie .= '; httponly';
        }

        return $cookie;
    }
}
PK_�\�8���Jpear/Symfony/Component/HttpKernel/DataCollector/ExceptionDataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\FlattenException;

/**
 * ExceptionDataCollector.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ExceptionDataCollector extends DataCollector
{
    /**
     * {@inheritdoc}
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        if (null !== $exception) {
            $this->data = array(
                'exception' => FlattenException::create($exception),
            );
        }
    }

    /**
     * Checks if the exception is not null.
     *
     * @return Boolean true if the exception is not null, false otherwise
     */
    public function hasException()
    {
        return isset($this->data['exception']);
    }

    /**
     * Gets the exception.
     *
     * @return \Exception The exception
     */
    public function getException()
    {
        return $this->data['exception'];
    }

    /**
     * Gets the exception message.
     *
     * @return string The exception message
     */
    public function getMessage()
    {
        return $this->data['exception']->getMessage();
    }

    /**
     * Gets the exception code.
     *
     * @return integer The exception code
     */
    public function getCode()
    {
        return $this->data['exception']->getCode();
    }

    /**
     * Gets the status code.
     *
     * @return integer The status code
     */
    public function getStatusCode()
    {
        return $this->data['exception']->getStatusCode();
    }

    /**
     * Gets the exception trace.
     *
     * @return array The exception trace
     */
    public function getTrace()
    {
        return $this->data['exception']->getTrace();
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'exception';
    }
}
PK_�\ƏGV��Epear/Symfony/Component/HttpKernel/DataCollector/TimeDataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;

/**
 * TimeDataCollector.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TimeDataCollector extends DataCollector implements LateDataCollectorInterface
{
    protected $kernel;
    protected $stopwatch;

    public function __construct(KernelInterface $kernel = null, $stopwatch = null)
    {
        $this->kernel = $kernel;
        $this->stopwatch = $stopwatch;
    }

    /**
     * {@inheritdoc}
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        if (null !== $this->kernel) {
            $startTime = $this->kernel->getStartTime();
        } else {
            $startTime = $request->server->get('REQUEST_TIME_FLOAT', $request->server->get('REQUEST_TIME'));
        }

        $this->data = array(
            'token'      => $response->headers->get('X-Debug-Token'),
            'start_time' => $startTime * 1000,
            'events'     => array(),
        );
    }

    /**
     * {@inheritdoc}
     */
    public function lateCollect()
    {
        if (null !== $this->stopwatch && isset($this->data['token'])) {
            $this->setEvents($this->stopwatch->getSectionEvents($this->data['token']));
        }
        unset($this->data['token']);
    }

    /**
     * Sets the request events.
     *
     * @param array $events The request events
     */
    public function setEvents(array $events)
    {
        foreach ($events as $event) {
            $event->ensureStopped();
        }

        $this->data['events'] = $events;
    }

    /**
     * Gets the request events.
     *
     * @return array The request events
     */
    public function getEvents()
    {
        return $this->data['events'];
    }

    /**
     * Gets the request elapsed time.
     *
     * @return float The elapsed time
     */
    public function getDuration()
    {
        if (!isset($this->data['events']['__section__'])) {
            return 0;
        }

        $lastEvent = $this->data['events']['__section__'];

        return $lastEvent->getOrigin() + $lastEvent->getDuration() - $this->getStartTime();
    }

    /**
     * Gets the initialization time.
     *
     * This is the time spent until the beginning of the request handling.
     *
     * @return float The elapsed time
     */
    public function getInitTime()
    {
        if (!isset($this->data['events']['__section__'])) {
            return 0;
        }

        return $this->data['events']['__section__']->getOrigin() - $this->getStartTime();
    }

    /**
     * Gets the request time.
     *
     * @return integer The time
     */
    public function getStartTime()
    {
        return $this->data['start_time'];
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'time';
    }
}
PK_�\��.�Jpear/Symfony/Component/HttpKernel/DataCollector/DataCollectorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * DataCollectorInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface DataCollectorInterface
{
    /**
     * Collects data for the given Request and Response.
     *
     * @param Request    $request   A Request instance
     * @param Response   $response  A Response instance
     * @param \Exception $exception An Exception instance
     *
     * @api
     */
    public function collect(Request $request, Response $response, \Exception $exception = null);

    /**
     * Returns the name of the collector.
     *
     * @return string The collector name
     *
     * @api
     */
    public function getName();
}
PK_�\n�--Apear/Symfony/Component/HttpKernel/DataCollector/DataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpKernel\DataCollector\Util\ValueExporter;

/**
 * DataCollector.
 *
 * Children of this class must store the collected data in the data property.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bernhard Schussek <bschussek@symfony.com>
 */
abstract class DataCollector implements DataCollectorInterface, \Serializable
{
    protected $data;

    /**
     * @var ValueExporter
     */
    private $valueExporter;

    public function serialize()
    {
        return serialize($this->data);
    }

    public function unserialize($data)
    {
        $this->data = unserialize($data);
    }

    /**
     * Converts a PHP variable to a string.
     *
     * @param mixed $var A PHP variable
     *
     * @return string The string representation of the variable
     */
    protected function varToString($var)
    {
        if (null === $this->valueExporter) {
            $this->valueExporter = new ValueExporter();
        }

        return $this->valueExporter->exportValue($var);
    }
}
PK_�\�2��~~Gpear/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * ConfigDataCollector.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ConfigDataCollector extends DataCollector
{
    private $kernel;
    private $name;
    private $version;

    /**
     * Constructor.
     *
     * @param string $name    The name of the application using the web profiler
     * @param string $version The version of the application using the web profiler
     */
    public function __construct($name = null, $version = null)
    {
        $this->name = $name;
        $this->version = $version;
    }

    /**
     * Sets the Kernel associated with this Request.
     *
     * @param KernelInterface $kernel A KernelInterface instance
     */
    public function setKernel(KernelInterface $kernel = null)
    {
        $this->kernel = $kernel;
    }

    /**
     * {@inheritdoc}
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        $this->data = array(
            'app_name'             => $this->name,
            'app_version'          => $this->version,
            'token'                => $response->headers->get('X-Debug-Token'),
            'symfony_version'      => Kernel::VERSION,
            'name'                 => isset($this->kernel) ? $this->kernel->getName() : 'n/a',
            'env'                  => isset($this->kernel) ? $this->kernel->getEnvironment() : 'n/a',
            'debug'                => isset($this->kernel) ? $this->kernel->isDebug() : 'n/a',
            'php_version'          => PHP_VERSION,
            'xdebug_enabled'       => extension_loaded('xdebug'),
            'eaccel_enabled'       => extension_loaded('eaccelerator') && ini_get('eaccelerator.enable'),
            'apc_enabled'          => extension_loaded('apc') && ini_get('apc.enabled'),
            'xcache_enabled'       => extension_loaded('xcache') && ini_get('xcache.cacher'),
            'wincache_enabled'     => extension_loaded('wincache') && ini_get('wincache.ocenabled'),
            'zend_opcache_enabled' => extension_loaded('Zend OPcache') && ini_get('opcache.enable'),
            'bundles'              => array(),
            'sapi_name'            => php_sapi_name()
        );

        if (isset($this->kernel)) {
            foreach ($this->kernel->getBundles() as $name => $bundle) {
                $this->data['bundles'][$name] = $bundle->getPath();
            }
        }
    }

    public function getApplicationName()
    {
        return $this->data['app_name'];
    }

    public function getApplicationVersion()
    {
        return $this->data['app_version'];
    }

    /**
     * Gets the token.
     *
     * @return string The token
     */
    public function getToken()
    {
        return $this->data['token'];
    }

    /**
     * Gets the Symfony version.
     *
     * @return string The Symfony version
     */
    public function getSymfonyVersion()
    {
        return $this->data['symfony_version'];
    }

    /**
     * Gets the PHP version.
     *
     * @return string The PHP version
     */
    public function getPhpVersion()
    {
        return $this->data['php_version'];
    }

    /**
     * Gets the application name.
     *
     * @return string The application name
     */
    public function getAppName()
    {
        return $this->data['name'];
    }

    /**
     * Gets the environment.
     *
     * @return string The environment
     */
    public function getEnv()
    {
        return $this->data['env'];
    }

    /**
     * Returns true if the debug is enabled.
     *
     * @return Boolean true if debug is enabled, false otherwise
     */
    public function isDebug()
    {
        return $this->data['debug'];
    }

    /**
     * Returns true if the XDebug is enabled.
     *
     * @return Boolean true if XDebug is enabled, false otherwise
     */
    public function hasXDebug()
    {
        return $this->data['xdebug_enabled'];
    }

    /**
     * Returns true if EAccelerator is enabled.
     *
     * @return Boolean true if EAccelerator is enabled, false otherwise
     */
    public function hasEAccelerator()
    {
        return $this->data['eaccel_enabled'];
    }

    /**
     * Returns true if APC is enabled.
     *
     * @return Boolean true if APC is enabled, false otherwise
     */
    public function hasApc()
    {
        return $this->data['apc_enabled'];
    }

    /**
     * Returns true if Zend OPcache is enabled
     *
     * @return Boolean true if Zend OPcache is enabled, false otherwise
     */
    public function hasZendOpcache()
    {
        return $this->data['zend_opcache_enabled'];
    }

    /**
     * Returns true if XCache is enabled.
     *
     * @return Boolean true if XCache is enabled, false otherwise
     */
    public function hasXCache()
    {
        return $this->data['xcache_enabled'];
    }

    /**
     * Returns true if WinCache is enabled.
     *
     * @return Boolean true if WinCache is enabled, false otherwise
     */
    public function hasWinCache()
    {
        return $this->data['wincache_enabled'];
    }

    /**
     * Returns true if any accelerator is enabled.
     *
     * @return Boolean true if any accelerator is enabled, false otherwise
     */
    public function hasAccelerator()
    {
        return $this->hasApc() || $this->hasZendOpcache() || $this->hasEAccelerator() || $this->hasXCache() || $this->hasWinCache();
    }

    public function getBundles()
    {
        return $this->data['bundles'];
    }

    /**
     * Gets the PHP SAPI name.
     *
     * @return string The environment
     */
    public function getSapiName()
    {
        return $this->data['sapi_name'];
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'config';
    }
}
PK_�\�@:o	o	Gpear/Symfony/Component/HttpKernel/DataCollector/RouterDataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

/**
 * RouterDataCollector.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class RouterDataCollector extends DataCollector
{
    protected $controllers;

    public function __construct()
    {
        $this->controllers = new \SplObjectStorage();

        $this->data = array(
            'redirect' => false,
            'url'      => null,
            'route'    => null,
        );
    }

    /**
     * {@inheritdoc}
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        if ($response instanceof RedirectResponse) {
            $this->data['redirect'] = true;
            $this->data['url'] = $response->getTargetUrl();

            if ($this->controllers->contains($request)) {
                $this->data['route'] = $this->guessRoute($request, $this->controllers[$request]);
            }
        }

        unset($this->controllers[$request]);
    }

    protected function guessRoute(Request $request, $controller)
    {
        return 'n/a';
    }

    /**
     * Remembers the controller associated to each request.
     *
     * @param FilterControllerEvent $event The filter controller event
     */
    public function onKernelController(FilterControllerEvent $event)
    {
        $this->controllers[$event->getRequest()] = $event->getController();
    }

    /**
     * @return Boolean Whether this request will result in a redirect
     */
    public function getRedirect()
    {
        return $this->data['redirect'];
    }

    /**
     * @return string|null The target URL
     */
    public function getTargetUrl()
    {
        return $this->data['url'];
    }

    /**
     * @return string|null The target route
     */
    public function getTargetRoute()
    {
        return $this->data['route'];
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'router';
    }
}
PK_�\�
<Npear/Symfony/Component/HttpKernel/DataCollector/LateDataCollectorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\DataCollector;

/**
 * LateDataCollectorInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface LateDataCollectorInterface
{
    /**
     * Collects data as late as possible.
     */
    public function lateCollect();
}
PK_�\\�[���5pear/Symfony/Component/HttpKernel/KernelInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Bundle\BundleInterface;
use Symfony\Component\Config\Loader\LoaderInterface;

/**
 * The Kernel is the heart of the Symfony system.
 *
 * It manages an environment made of bundles.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface KernelInterface extends HttpKernelInterface, \Serializable
{
    /**
     * Returns an array of bundles to register.
     *
     * @return BundleInterface[] An array of bundle instances.
     *
     * @api
     */
    public function registerBundles();

    /**
     * Loads the container configuration.
     *
     * @param LoaderInterface $loader A LoaderInterface instance
     *
     * @api
     */
    public function registerContainerConfiguration(LoaderInterface $loader);

    /**
     * Boots the current kernel.
     *
     * @api
     */
    public function boot();

    /**
     * Shutdowns the kernel.
     *
     * This method is mainly useful when doing functional testing.
     *
     * @api
     */
    public function shutdown();

    /**
     * Gets the registered bundle instances.
     *
     * @return BundleInterface[] An array of registered bundle instances
     *
     * @api
     */
    public function getBundles();

    /**
     * Checks if a given class name belongs to an active bundle.
     *
     * @param string $class A class name
     *
     * @return Boolean true if the class belongs to an active bundle, false otherwise
     *
     * @api
     */
    public function isClassInActiveBundle($class);

    /**
     * Returns a bundle and optionally its descendants by its name.
     *
     * @param string  $name  Bundle name
     * @param Boolean $first Whether to return the first bundle only or together with its descendants
     *
     * @return BundleInterface|BundleInterface[] A BundleInterface instance or an array of BundleInterface instances if $first is false
     *
     * @throws \InvalidArgumentException when the bundle is not enabled
     *
     * @api
     */
    public function getBundle($name, $first = true);

    /**
     * Returns the file path for a given resource.
     *
     * A Resource can be a file or a directory.
     *
     * The resource name must follow the following pattern:
     *
     *     @BundleName/path/to/a/file.something
     *
     * where BundleName is the name of the bundle
     * and the remaining part is the relative path in the bundle.
     *
     * If $dir is passed, and the first segment of the path is Resources,
     * this method will look for a file named:
     *
     *     $dir/BundleName/path/without/Resources
     *
     * @param string  $name  A resource name to locate
     * @param string  $dir   A directory where to look for the resource first
     * @param Boolean $first Whether to return the first path or paths for all matching bundles
     *
     * @return string|array The absolute path of the resource or an array if $first is false
     *
     * @throws \InvalidArgumentException if the file cannot be found or the name is not valid
     * @throws \RuntimeException         if the name contains invalid/unsafe characters
     *
     * @api
     */
    public function locateResource($name, $dir = null, $first = true);

    /**
     * Gets the name of the kernel.
     *
     * @return string The kernel name
     *
     * @api
     */
    public function getName();

    /**
     * Gets the environment.
     *
     * @return string The current environment
     *
     * @api
     */
    public function getEnvironment();

    /**
     * Checks if debug mode is enabled.
     *
     * @return Boolean true if debug mode is enabled, false otherwise
     *
     * @api
     */
    public function isDebug();

    /**
     * Gets the application root dir.
     *
     * @return string The application root dir
     *
     * @api
     */
    public function getRootDir();

    /**
     * Gets the current container.
     *
     * @return ContainerInterface A ContainerInterface instance
     *
     * @api
     */
    public function getContainer();

    /**
     * Gets the request start time (not available if debug is disabled).
     *
     * @return integer The request start timestamp
     *
     * @api
     */
    public function getStartTime();

    /**
     * Gets the cache directory.
     *
     * @return string The cache directory
     *
     * @api
     */
    public function getCacheDir();

    /**
     * Gets the log directory.
     *
     * @return string The log directory
     *
     * @api
     */
    public function getLogDir();

    /**
     * Gets the charset of the application.
     *
     * @return string The charset
     *
     * @api
     */
    public function getCharset();
}
PK_�\���ss2pear/Symfony/Component/HttpKernel/KernelEvents.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel;

/**
 * Contains all events thrown in the HttpKernel component
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
final class KernelEvents
{
    /**
     * The REQUEST event occurs at the very beginning of request
     * dispatching
     *
     * This event allows you to create a response for a request before any
     * other code in the framework is executed. The event listener method
     * receives a Symfony\Component\HttpKernel\Event\GetResponseEvent
     * instance.
     *
     * @var string
     *
     * @api
     */
    const REQUEST = 'kernel.request';

    /**
     * The EXCEPTION event occurs when an uncaught exception appears
     *
     * This event allows you to create a response for a thrown exception or
     * to modify the thrown exception. The event listener method receives
     * a Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent
     * instance.
     *
     * @var string
     *
     * @api
     */
    const EXCEPTION = 'kernel.exception';

    /**
     * The VIEW event occurs when the return value of a controller
     * is not a Response instance
     *
     * This event allows you to create a response for the return value of the
     * controller. The event listener method receives a
     * Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent
     * instance.
     *
     * @var string
     *
     * @api
     */
    const VIEW = 'kernel.view';

    /**
     * The CONTROLLER event occurs once a controller was found for
     * handling a request
     *
     * This event allows you to change the controller that will handle the
     * request. The event listener method receives a
     * Symfony\Component\HttpKernel\Event\FilterControllerEvent instance.
     *
     * @var string
     *
     * @api
     */
    const CONTROLLER = 'kernel.controller';

    /**
     * The RESPONSE event occurs once a response was created for
     * replying to a request
     *
     * This event allows you to modify or replace the response that will be
     * replied. The event listener method receives a
     * Symfony\Component\HttpKernel\Event\FilterResponseEvent instance.
     *
     * @var string
     *
     * @api
     */
    const RESPONSE = 'kernel.response';

    /**
     * The TERMINATE event occurs once a response was sent
     *
     * This event allows you to run expensive post-response jobs.
     * The event listener method receives a
     * Symfony\Component\HttpKernel\Event\PostResponseEvent instance.
     *
     * @var string
     */
    const TERMINATE = 'kernel.terminate';

    /**
     * The REQUEST_FINISHED event occurs when a response was generated for a request.
     *
     * This event allows you to reset the global and environmental state of
     * the application, when it was changed during the request.
     *
     * @var string
     */
    const FINISH_REQUEST = 'kernel.finish_request';
}
PK_�\����b
b
>pear/Symfony/Component/HttpKernel/HttpCache/StoreInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * This code is partially based on the Rack-Cache library by Ryan Tomayko,
 * which is released under the MIT license.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Interface implemented by HTTP cache stores.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface StoreInterface
{
    /**
     * Locates a cached Response for the Request provided.
     *
     * @param Request $request A Request instance
     *
     * @return Response|null A Response instance, or null if no cache entry was found
     */
    public function lookup(Request $request);

    /**
     * Writes a cache entry to the store for the given Request and Response.
     *
     * Existing entries are read and any that match the response are removed. This
     * method calls write with the new list of cache entries.
     *
     * @param Request  $request  A Request instance
     * @param Response $response A Response instance
     *
     * @return string The key under which the response is stored
     */
    public function write(Request $request, Response $response);

    /**
     * Invalidates all cache entries that match the request.
     *
     * @param Request $request A Request instance
     */
    public function invalidate(Request $request);

    /**
     * Locks the cache for a given Request.
     *
     * @param Request $request A Request instance
     *
     * @return Boolean|string true if the lock is acquired, the path to the current lock otherwise
     */
    public function lock(Request $request);

    /**
     * Releases the lock for the given Request.
     *
     * @param Request $request A Request instance
     *
     * @return Boolean False if the lock file does not exist or cannot be unlocked, true otherwise
     */
    public function unlock(Request $request);

    /**
     * Returns whether or not a lock exists.
     *
     * @param Request $request A Request instance
     *
     * @return Boolean true if lock exists, false otherwise
     */
    public function isLocked(Request $request);

    /**
     * Purges data for the given URL.
     *
     * @param string $url A URL
     *
     * @return Boolean true if the URL exists and has been purged, false otherwise
     */
    public function purge($url);

    /**
     * Cleanups storage.
     */
    public function cleanup();
}
PK_�\�w�n n 3pear/Symfony/Component/HttpKernel/HttpCache/Esi.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;

/**
 * Esi implements the ESI capabilities to Request and Response instances.
 *
 * For more information, read the following W3C notes:
 *
 *  * ESI Language Specification 1.0 (http://www.w3.org/TR/esi-lang)
 *
 *  * Edge Architecture Specification (http://www.w3.org/TR/edge-arch)
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Esi
{
    private $contentTypes;

    /**
     * Constructor.
     *
     * @param array $contentTypes An array of content-type that should be parsed for ESI information.
     *                           (default: text/html, text/xml, application/xhtml+xml, and application/xml)
     */
    public function __construct(array $contentTypes = array('text/html', 'text/xml', 'application/xhtml+xml', 'application/xml'))
    {
        $this->contentTypes = $contentTypes;
    }

    /**
     * Returns a new cache strategy instance.
     *
     * @return EsiResponseCacheStrategyInterface A EsiResponseCacheStrategyInterface instance
     */
    public function createCacheStrategy()
    {
        return new EsiResponseCacheStrategy();
    }

    /**
     * Checks that at least one surrogate has ESI/1.0 capability.
     *
     * @param Request $request A Request instance
     *
     * @return Boolean true if one surrogate has ESI/1.0 capability, false otherwise
     */
    public function hasSurrogateEsiCapability(Request $request)
    {
        if (null === $value = $request->headers->get('Surrogate-Capability')) {
            return false;
        }

        return false !== strpos($value, 'ESI/1.0');
    }

    /**
     * Adds ESI/1.0 capability to the given Request.
     *
     * @param Request $request A Request instance
     */
    public function addSurrogateEsiCapability(Request $request)
    {
        $current = $request->headers->get('Surrogate-Capability');
        $new = 'symfony2="ESI/1.0"';

        $request->headers->set('Surrogate-Capability', $current ? $current.', '.$new : $new);
    }

    /**
     * Adds HTTP headers to specify that the Response needs to be parsed for ESI.
     *
     * This method only adds an ESI HTTP header if the Response has some ESI tags.
     *
     * @param Response $response A Response instance
     */
    public function addSurrogateControl(Response $response)
    {
        if (false !== strpos($response->getContent(), '<esi:include')) {
            $response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
        }
    }

    /**
     * Checks that the Response needs to be parsed for ESI tags.
     *
     * @param Response $response A Response instance
     *
     * @return Boolean true if the Response needs to be parsed, false otherwise
     */
    public function needsEsiParsing(Response $response)
    {
        if (!$control = $response->headers->get('Surrogate-Control')) {
            return false;
        }

        return (Boolean) preg_match('#content="[^"]*ESI/1.0[^"]*"#', $control);
    }

    /**
     * Renders an ESI tag.
     *
     * @param string  $uri          A URI
     * @param string  $alt          An alternate URI
     * @param Boolean $ignoreErrors Whether to ignore errors or not
     * @param string  $comment      A comment to add as an esi:include tag
     *
     * @return string
     */
    public function renderIncludeTag($uri, $alt = null, $ignoreErrors = true, $comment = '')
    {
        $html = sprintf('<esi:include src="%s"%s%s />',
            $uri,
            $ignoreErrors ? ' onerror="continue"' : '',
            $alt ? sprintf(' alt="%s"', $alt) : ''
        );

        if (!empty($comment)) {
            return sprintf("<esi:comment text=\"%s\" />\n%s", $comment, $html);
        }

        return $html;
    }

    /**
     * Replaces a Response ESI tags with the included resource content.
     *
     * @param Request  $request  A Request instance
     * @param Response $response A Response instance
     *
     * @return Response
     */
    public function process(Request $request, Response $response)
    {
        $this->request = $request;
        $type = $response->headers->get('Content-Type');
        if (empty($type)) {
            $type = 'text/html';
        }

        $parts = explode(';', $type);
        if (!in_array($parts[0], $this->contentTypes)) {
            return $response;
        }

        // we don't use a proper XML parser here as we can have ESI tags in a plain text response
        $content = $response->getContent();
        $content = str_replace(array('<?', '<%'), array('<?php echo "<?"; ?>', '<?php echo "<%"; ?>'), $content);
        $content = preg_replace_callback('#<esi\:include\s+(.*?)\s*(?:/|</esi\:include)>#', array($this, 'handleEsiIncludeTag'), $content);
        $content = preg_replace('#<esi\:comment[^>]*(?:/|</esi\:comment)>#', '', $content);
        $content = preg_replace('#<esi\:remove>.*?</esi\:remove>#', '', $content);

        $response->setContent($content);
        $response->headers->set('X-Body-Eval', 'ESI');

        // remove ESI/1.0 from the Surrogate-Control header
        if ($response->headers->has('Surrogate-Control')) {
            $value = $response->headers->get('Surrogate-Control');
            if ('content="ESI/1.0"' == $value) {
                $response->headers->remove('Surrogate-Control');
            } elseif (preg_match('#,\s*content="ESI/1.0"#', $value)) {
                $response->headers->set('Surrogate-Control', preg_replace('#,\s*content="ESI/1.0"#', '', $value));
            } elseif (preg_match('#content="ESI/1.0",\s*#', $value)) {
                $response->headers->set('Surrogate-Control', preg_replace('#content="ESI/1.0",\s*#', '', $value));
            }
        }
    }

    /**
     * Handles an ESI from the cache.
     *
     * @param HttpCache $cache        An HttpCache instance
     * @param string    $uri          The main URI
     * @param string    $alt          An alternative URI
     * @param Boolean   $ignoreErrors Whether to ignore errors or not
     *
     * @return string
     *
     * @throws \RuntimeException
     * @throws \Exception
     */
    public function handle(HttpCache $cache, $uri, $alt, $ignoreErrors)
    {
        $subRequest = Request::create($uri, 'get', array(), $cache->getRequest()->cookies->all(), array(), $cache->getRequest()->server->all());

        try {
            $response = $cache->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true);

            if (!$response->isSuccessful()) {
                throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %s).', $subRequest->getUri(), $response->getStatusCode()));
            }

            return $response->getContent();
        } catch (\Exception $e) {
            if ($alt) {
                return $this->handle($cache, $alt, '', $ignoreErrors);
            }

            if (!$ignoreErrors) {
                throw $e;
            }
        }
    }

    /**
     * Handles an ESI include tag (called internally).
     *
     * @param array $attributes An array containing the attributes.
     *
     * @return string The response content for the include.
     *
     * @throws \RuntimeException
     */
    private function handleEsiIncludeTag($attributes)
    {
        $options = array();
        preg_match_all('/(src|onerror|alt)="([^"]*?)"/', $attributes[1], $matches, PREG_SET_ORDER);
        foreach ($matches as $set) {
            $options[$set[1]] = $set[2];
        }

        if (!isset($options['src'])) {
            throw new \RuntimeException('Unable to process an ESI tag without a "src" attribute.');
        }

        return sprintf('<?php echo $this->esi->handle($this, \'%s\', \'%s\', %s) ?>'."\n",
            $options['src'],
            isset($options['alt']) ? $options['alt'] : null,
            isset($options['onerror']) && 'continue' == $options['onerror'] ? 'true' : 'false'
        );
    }
}
PK_�\�#��[�[9pear/Symfony/Component/HttpKernel/HttpCache/HttpCache.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * This code is partially based on the Rack-Cache library by Ryan Tomayko,
 * which is released under the MIT license.
 * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801)
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\TerminableInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Cache provides HTTP caching.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class HttpCache implements HttpKernelInterface, TerminableInterface
{
    private $kernel;
    private $store;
    private $request;
    private $esi;
    private $esiCacheStrategy;
    private $options = array();
    private $traces = array();

    /**
     * Constructor.
     *
     * The available options are:
     *
     *   * debug:                 If true, the traces are added as a HTTP header to ease debugging
     *
     *   * default_ttl            The number of seconds that a cache entry should be considered
     *                            fresh when no explicit freshness information is provided in
     *                            a response. Explicit Cache-Control or Expires headers
     *                            override this value. (default: 0)
     *
     *   * private_headers        Set of request headers that trigger "private" cache-control behavior
     *                            on responses that don't explicitly state whether the response is
     *                            public or private via a Cache-Control directive. (default: Authorization and Cookie)
     *
     *   * allow_reload           Specifies whether the client can force a cache reload by including a
     *                            Cache-Control "no-cache" directive in the request. Set it to ``true``
     *                            for compliance with RFC 2616. (default: false)
     *
     *   * allow_revalidate       Specifies whether the client can force a cache revalidate by including
     *                            a Cache-Control "max-age=0" directive in the request. Set it to ``true``
     *                            for compliance with RFC 2616. (default: false)
     *
     *   * stale_while_revalidate Specifies the default number of seconds (the granularity is the second as the
     *                            Response TTL precision is a second) during which the cache can immediately return
     *                            a stale response while it revalidates it in the background (default: 2).
     *                            This setting is overridden by the stale-while-revalidate HTTP Cache-Control
     *                            extension (see RFC 5861).
     *
     *   * stale_if_error         Specifies the default number of seconds (the granularity is the second) during which
     *                            the cache can serve a stale response when an error is encountered (default: 60).
     *                            This setting is overridden by the stale-if-error HTTP Cache-Control extension
     *                            (see RFC 5861).
     *
     * @param HttpKernelInterface $kernel  An HttpKernelInterface instance
     * @param StoreInterface      $store   A Store instance
     * @param Esi                 $esi     An Esi instance
     * @param array               $options An array of options
     */
    public function __construct(HttpKernelInterface $kernel, StoreInterface $store, Esi $esi = null, array $options = array())
    {
        $this->store = $store;
        $this->kernel = $kernel;
        $this->esi = $esi;

        // needed in case there is a fatal error because the backend is too slow to respond
        register_shutdown_function(array($this->store, 'cleanup'));

        $this->options = array_merge(array(
            'debug'                  => false,
            'default_ttl'            => 0,
            'private_headers'        => array('Authorization', 'Cookie'),
            'allow_reload'           => false,
            'allow_revalidate'       => false,
            'stale_while_revalidate' => 2,
            'stale_if_error'         => 60,
        ), $options);
    }

    /**
     * Gets the current store.
     *
     * @return StoreInterface $store A StoreInterface instance
     */
    public function getStore()
    {
        return $this->store;
    }

    /**
     * Returns an array of events that took place during processing of the last request.
     *
     * @return array An array of events
     */
    public function getTraces()
    {
        return $this->traces;
    }

    /**
     * Returns a log message for the events of the last request processing.
     *
     * @return string A log message
     */
    public function getLog()
    {
        $log = array();
        foreach ($this->traces as $request => $traces) {
            $log[] = sprintf('%s: %s', $request, implode(', ', $traces));
        }

        return implode('; ', $log);
    }

    /**
     * Gets the Request instance associated with the master request.
     *
     * @return Request A Request instance
     */
    public function getRequest()
    {
        return $this->request;
    }

    /**
     * Gets the Kernel instance
     *
     * @return HttpKernelInterface An HttpKernelInterface instance
     */
    public function getKernel()
    {
        return $this->kernel;
    }


    /**
     * Gets the Esi instance
     *
     * @return Esi An Esi instance
     */
    public function getEsi()
    {
        return $this->esi;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        // FIXME: catch exceptions and implement a 500 error page here? -> in Varnish, there is a built-in error page mechanism
        if (HttpKernelInterface::MASTER_REQUEST === $type) {
            $this->traces = array();
            $this->request = $request;
            if (null !== $this->esi) {
                $this->esiCacheStrategy = $this->esi->createCacheStrategy();
            }
        }

        $path = $request->getPathInfo();
        if ($qs = $request->getQueryString()) {
            $path .= '?'.$qs;
        }
        $this->traces[$request->getMethod().' '.$path] = array();

        if (!$request->isMethodSafe()) {
            $response = $this->invalidate($request, $catch);
        } elseif ($request->headers->has('expect')) {
            $response = $this->pass($request, $catch);
        } else {
            $response = $this->lookup($request, $catch);
        }

        $this->restoreResponseBody($request, $response);

        $response->setDate(new \DateTime(null, new \DateTimeZone('UTC')));

        if (HttpKernelInterface::MASTER_REQUEST === $type && $this->options['debug']) {
            $response->headers->set('X-Symfony-Cache', $this->getLog());
        }

        if (null !== $this->esi) {
            if (HttpKernelInterface::MASTER_REQUEST === $type) {
                $this->esiCacheStrategy->update($response);
            } else {
                $this->esiCacheStrategy->add($response);
            }
        }

        $response->prepare($request);

        $response->isNotModified($request);

        return $response;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function terminate(Request $request, Response $response)
    {
        if ($this->getKernel() instanceof TerminableInterface) {
            $this->getKernel()->terminate($request, $response);
        }
    }

    /**
     * Forwards the Request to the backend without storing the Response in the cache.
     *
     * @param Request $request A Request instance
     * @param Boolean $catch   Whether to process exceptions
     *
     * @return Response A Response instance
     */
    protected function pass(Request $request, $catch = false)
    {
        $this->record($request, 'pass');

        return $this->forward($request, $catch);
    }

    /**
     * Invalidates non-safe methods (like POST, PUT, and DELETE).
     *
     * @param Request $request A Request instance
     * @param Boolean $catch   Whether to process exceptions
     *
     * @return Response A Response instance
     *
     * @throws \Exception
     *
     * @see RFC2616 13.10
     */
    protected function invalidate(Request $request, $catch = false)
    {
        $response = $this->pass($request, $catch);

        // invalidate only when the response is successful
        if ($response->isSuccessful() || $response->isRedirect()) {
            try {
                $this->store->invalidate($request, $catch);

                // As per the RFC, invalidate Location and Content-Location URLs if present
                foreach (array('Location', 'Content-Location') as $header) {
                    if ($uri = $response->headers->get($header)) {
                        $subRequest = Request::create($uri, 'get', array(), array(), array(), $request->server->all());

                        $this->store->invalidate($subRequest);
                    }
                }

                $this->record($request, 'invalidate');
            } catch (\Exception $e) {
                $this->record($request, 'invalidate-failed');

                if ($this->options['debug']) {
                    throw $e;
                }
            }
        }

        return $response;
    }

    /**
     * Lookups a Response from the cache for the given Request.
     *
     * When a matching cache entry is found and is fresh, it uses it as the
     * response without forwarding any request to the backend. When a matching
     * cache entry is found but is stale, it attempts to "validate" the entry with
     * the backend using conditional GET. When no matching cache entry is found,
     * it triggers "miss" processing.
     *
     * @param Request $request A Request instance
     * @param Boolean $catch   whether to process exceptions
     *
     * @return Response A Response instance
     *
     * @throws \Exception
     */
    protected function lookup(Request $request, $catch = false)
    {
        // if allow_reload and no-cache Cache-Control, allow a cache reload
        if ($this->options['allow_reload'] && $request->isNoCache()) {
            $this->record($request, 'reload');

            return $this->fetch($request, $catch);
        }

        try {
            $entry = $this->store->lookup($request);
        } catch (\Exception $e) {
            $this->record($request, 'lookup-failed');

            if ($this->options['debug']) {
                throw $e;
            }

            return $this->pass($request, $catch);
        }

        if (null === $entry) {
            $this->record($request, 'miss');

            return $this->fetch($request, $catch);
        }

        if (!$this->isFreshEnough($request, $entry)) {
            $this->record($request, 'stale');

            return $this->validate($request, $entry, $catch);
        }

        $this->record($request, 'fresh');

        $entry->headers->set('Age', $entry->getAge());

        return $entry;
    }

    /**
     * Validates that a cache entry is fresh.
     *
     * The original request is used as a template for a conditional
     * GET request with the backend.
     *
     * @param Request  $request A Request instance
     * @param Response $entry   A Response instance to validate
     * @param Boolean  $catch   Whether to process exceptions
     *
     * @return Response A Response instance
     */
    protected function validate(Request $request, Response $entry, $catch = false)
    {
        $subRequest = clone $request;

        // send no head requests because we want content
        $subRequest->setMethod('GET');

        // add our cached last-modified validator
        $subRequest->headers->set('if_modified_since', $entry->headers->get('Last-Modified'));

        // Add our cached etag validator to the environment.
        // We keep the etags from the client to handle the case when the client
        // has a different private valid entry which is not cached here.
        $cachedEtags = $entry->getEtag() ? array($entry->getEtag()) : array();
        $requestEtags = $request->getEtags();
        if ($etags = array_unique(array_merge($cachedEtags, $requestEtags))) {
            $subRequest->headers->set('if_none_match', implode(', ', $etags));
        }

        $response = $this->forward($subRequest, $catch, $entry);

        if (304 == $response->getStatusCode()) {
            $this->record($request, 'valid');

            // return the response and not the cache entry if the response is valid but not cached
            $etag = $response->getEtag();
            if ($etag && in_array($etag, $requestEtags) && !in_array($etag, $cachedEtags)) {
                return $response;
            }

            $entry = clone $entry;
            $entry->headers->remove('Date');

            foreach (array('Date', 'Expires', 'Cache-Control', 'ETag', 'Last-Modified') as $name) {
                if ($response->headers->has($name)) {
                    $entry->headers->set($name, $response->headers->get($name));
                }
            }

            $response = $entry;
        } else {
            $this->record($request, 'invalid');
        }

        if ($response->isCacheable()) {
            $this->store($request, $response);
        }

        return $response;
    }

    /**
     * Forwards the Request to the backend and determines whether the response should be stored.
     *
     * This methods is triggered when the cache missed or a reload is required.
     *
     * @param Request $request A Request instance
     * @param Boolean $catch   whether to process exceptions
     *
     * @return Response A Response instance
     */
    protected function fetch(Request $request, $catch = false)
    {
        $subRequest = clone $request;

        // send no head requests because we want content
        $subRequest->setMethod('GET');

        // avoid that the backend sends no content
        $subRequest->headers->remove('if_modified_since');
        $subRequest->headers->remove('if_none_match');

        $response = $this->forward($subRequest, $catch);

        if ($this->isPrivateRequest($request) && !$response->headers->hasCacheControlDirective('public')) {
            $response->setPrivate(true);
        } elseif ($this->options['default_ttl'] > 0 && null === $response->getTtl() && !$response->headers->getCacheControlDirective('must-revalidate')) {
            $response->setTtl($this->options['default_ttl']);
        }

        if ($response->isCacheable()) {
            $this->store($request, $response);
        }

        return $response;
    }

    /**
     * Forwards the Request to the backend and returns the Response.
     *
     * @param Request  $request A Request instance
     * @param Boolean  $catch   Whether to catch exceptions or not
     * @param Response $entry   A Response instance (the stale entry if present, null otherwise)
     *
     * @return Response A Response instance
     */
    protected function forward(Request $request, $catch = false, Response $entry = null)
    {
        if ($this->esi) {
            $this->esi->addSurrogateEsiCapability($request);
        }

        // modify the X-Forwarded-For header if needed
        $forwardedFor = $request->headers->get('X-Forwarded-For');
        if ($forwardedFor) {
            $request->headers->set('X-Forwarded-For', $forwardedFor.', '.$request->server->get('REMOTE_ADDR'));
        } else {
            $request->headers->set('X-Forwarded-For', $request->server->get('REMOTE_ADDR'));
        }

        // fix the client IP address by setting it to 127.0.0.1 as HttpCache
        // is always called from the same process as the backend.
        $request->server->set('REMOTE_ADDR', '127.0.0.1');

        // always a "master" request (as the real master request can be in cache)
        $response = $this->kernel->handle($request, HttpKernelInterface::MASTER_REQUEST, $catch);
        // FIXME: we probably need to also catch exceptions if raw === true

        // we don't implement the stale-if-error on Requests, which is nonetheless part of the RFC
        if (null !== $entry && in_array($response->getStatusCode(), array(500, 502, 503, 504))) {
            if (null === $age = $entry->headers->getCacheControlDirective('stale-if-error')) {
                $age = $this->options['stale_if_error'];
            }

            if (abs($entry->getTtl()) < $age) {
                $this->record($request, 'stale-if-error');

                return $entry;
            }
        }

        $this->processResponseBody($request, $response);

        return $response;
    }

    /**
     * Checks whether the cache entry is "fresh enough" to satisfy the Request.
     *
     * @param Request  $request A Request instance
     * @param Response $entry   A Response instance
     *
     * @return Boolean true if the cache entry if fresh enough, false otherwise
     */
    protected function isFreshEnough(Request $request, Response $entry)
    {
        if (!$entry->isFresh()) {
            return $this->lock($request, $entry);
        }

        if ($this->options['allow_revalidate'] && null !== $maxAge = $request->headers->getCacheControlDirective('max-age')) {
            return $maxAge > 0 && $maxAge >= $entry->getAge();
        }

        return true;
    }

    /**
     * Locks a Request during the call to the backend.
     *
     * @param Request  $request A Request instance
     * @param Response $entry   A Response instance
     *
     * @return Boolean true if the cache entry can be returned even if it is staled, false otherwise
     */
    protected function lock(Request $request, Response $entry)
    {
        // try to acquire a lock to call the backend
        $lock = $this->store->lock($request, $entry);

        // there is already another process calling the backend
        if (true !== $lock) {
            // check if we can serve the stale entry
            if (null === $age = $entry->headers->getCacheControlDirective('stale-while-revalidate')) {
                $age = $this->options['stale_while_revalidate'];
            }

            if (abs($entry->getTtl()) < $age) {
                $this->record($request, 'stale-while-revalidate');

                // server the stale response while there is a revalidation
                return true;
            }

            // wait for the lock to be released
            $wait = 0;
            while ($this->store->isLocked($request) && $wait < 5000000) {
                usleep(50000);
                $wait += 50000;
            }

            if ($wait < 2000000) {
                // replace the current entry with the fresh one
                $new = $this->lookup($request);
                $entry->headers = $new->headers;
                $entry->setContent($new->getContent());
                $entry->setStatusCode($new->getStatusCode());
                $entry->setProtocolVersion($new->getProtocolVersion());
                foreach ($new->headers->getCookies() as $cookie) {
                    $entry->headers->setCookie($cookie);
                }
            } else {
                // backend is slow as hell, send a 503 response (to avoid the dog pile effect)
                $entry->setStatusCode(503);
                $entry->setContent('503 Service Unavailable');
                $entry->headers->set('Retry-After', 10);
            }

            return true;
        }

        // we have the lock, call the backend
        return false;
    }

    /**
     * Writes the Response to the cache.
     *
     * @param Request  $request  A Request instance
     * @param Response $response A Response instance
     *
     * @throws \Exception
     */
    protected function store(Request $request, Response $response)
    {
        try {
            $this->store->write($request, $response);

            $this->record($request, 'store');

            $response->headers->set('Age', $response->getAge());
        } catch (\Exception $e) {
            $this->record($request, 'store-failed');

            if ($this->options['debug']) {
                throw $e;
            }
        }

        // now that the response is cached, release the lock
        $this->store->unlock($request);
    }

    /**
     * Restores the Response body.
     *
     * @param Request  $request  A Request instance
     * @param Response $response A Response instance
     *
     * @return Response A Response instance
     */
    private function restoreResponseBody(Request $request, Response $response)
    {
        if ($request->isMethod('HEAD') || 304 === $response->getStatusCode()) {
            $response->setContent(null);
            $response->headers->remove('X-Body-Eval');
            $response->headers->remove('X-Body-File');

            return;
        }

        if ($response->headers->has('X-Body-Eval')) {
            ob_start();

            if ($response->headers->has('X-Body-File')) {
                include $response->headers->get('X-Body-File');
            } else {
                eval('; ?>'.$response->getContent().'<?php ;');
            }

            $response->setContent(ob_get_clean());
            $response->headers->remove('X-Body-Eval');
            if (!$response->headers->has('Transfer-Encoding')) {
                $response->headers->set('Content-Length', strlen($response->getContent()));
            }
        } elseif ($response->headers->has('X-Body-File')) {
            $response->setContent(file_get_contents($response->headers->get('X-Body-File')));
        } else {
            return;
        }

        $response->headers->remove('X-Body-File');
    }

    protected function processResponseBody(Request $request, Response $response)
    {
        if (null !== $this->esi && $this->esi->needsEsiParsing($response)) {
            $this->esi->process($request, $response);
        }
    }

    /**
     * Checks if the Request includes authorization or other sensitive information
     * that should cause the Response to be considered private by default.
     *
     * @param Request $request A Request instance
     *
     * @return Boolean true if the Request is private, false otherwise
     */
    private function isPrivateRequest(Request $request)
    {
        foreach ($this->options['private_headers'] as $key) {
            $key = strtolower(str_replace('HTTP_', '', $key));

            if ('cookie' === $key) {
                if (count($request->cookies->all())) {
                    return true;
                }
            } elseif ($request->headers->has($key)) {
                return true;
            }
        }

        return false;
    }

    /**
     * Records that an event took place.
     *
     * @param Request $request A Request instance
     * @param string  $event   The event name
     */
    private function record(Request $request, $event)
    {
        $path = $request->getPathInfo();
        if ($qs = $request->getQueryString()) {
            $path .= '?'.$qs;
        }
        $this->traces[$request->getMethod().' '.$path][] = $event;
    }
}
PK_�\M~��CCQpear/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategyInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * This code is partially based on the Rack-Cache library by Ryan Tomayko,
 * which is released under the MIT license.
 * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801)
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Response;

/**
 * EsiResponseCacheStrategyInterface implementations know how to compute the
 * Response cache HTTP header based on the different ESI response cache headers.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface EsiResponseCacheStrategyInterface
{
    /**
     * Adds a Response.
     *
     * @param Response $response
     */
    public function add(Response $response);

    /**
     * Updates the Response HTTP headers based on the embedded Responses.
     *
     * @param Response $response
     */
    public function update(Response $response);
}
PK_�\�K:�1�15pear/Symfony/Component/HttpKernel/HttpCache/Store.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * This code is partially based on the Rack-Cache library by Ryan Tomayko,
 * which is released under the MIT license.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Store implements all the logic for storing cache metadata (Request and Response headers).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Store implements StoreInterface
{
    protected $root;
    private $keyCache;
    private $locks;

    /**
     * Constructor.
     *
     * @param string $root The path to the cache directory
     */
    public function __construct($root)
    {
        $this->root = $root;
        if (!is_dir($this->root)) {
            mkdir($this->root, 0777, true);
        }
        $this->keyCache = new \SplObjectStorage();
        $this->locks = array();
    }

    /**
     * Cleanups storage.
     */
    public function cleanup()
    {
        // unlock everything
        foreach ($this->locks as $lock) {
            if (file_exists($lock)) {
                @unlink($lock);
            }
        }

        $error = error_get_last();
        if (1 === $error['type'] && false === headers_sent()) {
            // send a 503
            header('HTTP/1.0 503 Service Unavailable');
            header('Retry-After: 10');
            echo '503 Service Unavailable';
        }
    }

    /**
     * Locks the cache for a given Request.
     *
     * @param Request $request A Request instance
     *
     * @return Boolean|string true if the lock is acquired, the path to the current lock otherwise
     */
    public function lock(Request $request)
    {
        $path = $this->getPath($this->getCacheKey($request).'.lck');
        if (!is_dir(dirname($path)) && false === @mkdir(dirname($path), 0777, true)) {
            return false;
        }

        $lock = @fopen($path, 'x');
        if (false !== $lock) {
            fclose($lock);

            $this->locks[] = $path;

            return true;
        }

        return !file_exists($path) ?: $path;
    }

    /**
     * Releases the lock for the given Request.
     *
     * @param Request $request A Request instance
     *
     * @return Boolean False if the lock file does not exist or cannot be unlocked, true otherwise
     */
    public function unlock(Request $request)
    {
        $file = $this->getPath($this->getCacheKey($request).'.lck');

        return is_file($file) ? @unlink($file) : false;
    }

    public function isLocked(Request $request)
    {
        return is_file($this->getPath($this->getCacheKey($request).'.lck'));
    }

    /**
     * Locates a cached Response for the Request provided.
     *
     * @param Request $request A Request instance
     *
     * @return Response|null A Response instance, or null if no cache entry was found
     */
    public function lookup(Request $request)
    {
        $key = $this->getCacheKey($request);

        if (!$entries = $this->getMetadata($key)) {
            return null;
        }

        // find a cached entry that matches the request.
        $match = null;
        foreach ($entries as $entry) {
            if ($this->requestsMatch(isset($entry[1]['vary'][0]) ? $entry[1]['vary'][0] : '', $request->headers->all(), $entry[0])) {
                $match = $entry;

                break;
            }
        }

        if (null === $match) {
            return null;
        }

        list($req, $headers) = $match;
        if (is_file($body = $this->getPath($headers['x-content-digest'][0]))) {
            return $this->restoreResponse($headers, $body);
        }

        // TODO the metaStore referenced an entity that doesn't exist in
        // the entityStore. We definitely want to return nil but we should
        // also purge the entry from the meta-store when this is detected.
        return null;
    }

    /**
     * Writes a cache entry to the store for the given Request and Response.
     *
     * Existing entries are read and any that match the response are removed. This
     * method calls write with the new list of cache entries.
     *
     * @param Request  $request  A Request instance
     * @param Response $response A Response instance
     *
     * @return string The key under which the response is stored
     *
     * @throws \RuntimeException
     */
    public function write(Request $request, Response $response)
    {
        $key = $this->getCacheKey($request);
        $storedEnv = $this->persistRequest($request);

        // write the response body to the entity store if this is the original response
        if (!$response->headers->has('X-Content-Digest')) {
            $digest = $this->generateContentDigest($response);

            if (false === $this->save($digest, $response->getContent())) {
                throw new \RuntimeException('Unable to store the entity.');
            }

            $response->headers->set('X-Content-Digest', $digest);

            if (!$response->headers->has('Transfer-Encoding')) {
                $response->headers->set('Content-Length', strlen($response->getContent()));
            }
        }

        // read existing cache entries, remove non-varying, and add this one to the list
        $entries = array();
        $vary = $response->headers->get('vary');
        foreach ($this->getMetadata($key) as $entry) {
            if (!isset($entry[1]['vary'][0])) {
                $entry[1]['vary'] = array('');
            }

            if ($vary != $entry[1]['vary'][0] || !$this->requestsMatch($vary, $entry[0], $storedEnv)) {
                $entries[] = $entry;
            }
        }

        $headers = $this->persistResponse($response);
        unset($headers['age']);

        array_unshift($entries, array($storedEnv, $headers));

        if (false === $this->save($key, serialize($entries))) {
            throw new \RuntimeException('Unable to store the metadata.');
        }

        return $key;
    }

    /**
     * Returns content digest for $response.
     *
     * @param Response $response
     *
     * @return string
     */
    protected function generateContentDigest(Response $response)
    {
        return 'en'.hash('sha256', $response->getContent());
    }

    /**
     * Invalidates all cache entries that match the request.
     *
     * @param Request $request A Request instance
     *
     * @throws \RuntimeException
     */
    public function invalidate(Request $request)
    {
        $modified = false;
        $key = $this->getCacheKey($request);

        $entries = array();
        foreach ($this->getMetadata($key) as $entry) {
            $response = $this->restoreResponse($entry[1]);
            if ($response->isFresh()) {
                $response->expire();
                $modified = true;
                $entries[] = array($entry[0], $this->persistResponse($response));
            } else {
                $entries[] = $entry;
            }
        }

        if ($modified) {
            if (false === $this->save($key, serialize($entries))) {
                throw new \RuntimeException('Unable to store the metadata.');
            }
        }
    }

    /**
     * Determines whether two Request HTTP header sets are non-varying based on
     * the vary response header value provided.
     *
     * @param string $vary A Response vary header
     * @param array  $env1 A Request HTTP header array
     * @param array  $env2 A Request HTTP header array
     *
     * @return Boolean true if the two environments match, false otherwise
     */
    private function requestsMatch($vary, $env1, $env2)
    {
        if (empty($vary)) {
            return true;
        }

        foreach (preg_split('/[\s,]+/', $vary) as $header) {
            $key = strtr(strtolower($header), '_', '-');
            $v1 = isset($env1[$key]) ? $env1[$key] : null;
            $v2 = isset($env2[$key]) ? $env2[$key] : null;
            if ($v1 !== $v2) {
                return false;
            }
        }

        return true;
    }

    /**
     * Gets all data associated with the given key.
     *
     * Use this method only if you know what you are doing.
     *
     * @param string $key The store key
     *
     * @return array An array of data associated with the key
     */
    private function getMetadata($key)
    {
        if (false === $entries = $this->load($key)) {
            return array();
        }

        return unserialize($entries);
    }

    /**
     * Purges data for the given URL.
     *
     * @param string $url A URL
     *
     * @return Boolean true if the URL exists and has been purged, false otherwise
     */
    public function purge($url)
    {
        if (is_file($path = $this->getPath($this->getCacheKey(Request::create($url))))) {
            unlink($path);

            return true;
        }

        return false;
    }

    /**
     * Loads data for the given key.
     *
     * @param string $key The store key
     *
     * @return string The data associated with the key
     */
    private function load($key)
    {
        $path = $this->getPath($key);

        return is_file($path) ? file_get_contents($path) : false;
    }

    /**
     * Save data for the given key.
     *
     * @param string $key  The store key
     * @param string $data The data to store
     *
     * @return Boolean
     */
    private function save($key, $data)
    {
        $path = $this->getPath($key);
        if (!is_dir(dirname($path)) && false === @mkdir(dirname($path), 0777, true)) {
            return false;
        }

        $tmpFile = tempnam(dirname($path), basename($path));
        if (false === $fp = @fopen($tmpFile, 'wb')) {
            return false;
        }
        @fwrite($fp, $data);
        @fclose($fp);

        if ($data != file_get_contents($tmpFile)) {
            return false;
        }

        if (false === @rename($tmpFile, $path)) {
            return false;
        }

        @chmod($path, 0666 & ~umask());
    }

    public function getPath($key)
    {
        return $this->root.DIRECTORY_SEPARATOR.substr($key, 0, 2).DIRECTORY_SEPARATOR.substr($key, 2, 2).DIRECTORY_SEPARATOR.substr($key, 4, 2).DIRECTORY_SEPARATOR.substr($key, 6);
    }

    /**
     * Generates a cache key for the given Request.
     *
     * This method should return a key that must only depend on a
     * normalized version of the request URI.
     *
     * If the same URI can have more than one representation, based on some
     * headers, use a Vary header to indicate them, and each representation will
     * be stored independently under the same cache key.
     *
     * @param Request $request A Request instance
     *
     * @return string A key for the given Request
     */
    protected function generateCacheKey(Request $request)
    {
        return 'md'.hash('sha256', $request->getUri());
    }

    /**
     * Returns a cache key for the given Request.
     *
     * @param Request $request A Request instance
     *
     * @return string A key for the given Request
     */
    private function getCacheKey(Request $request)
    {
        if (isset($this->keyCache[$request])) {
            return $this->keyCache[$request];
        }

        return $this->keyCache[$request] = $this->generateCacheKey($request);
    }

    /**
     * Persists the Request HTTP headers.
     *
     * @param Request $request A Request instance
     *
     * @return array An array of HTTP headers
     */
    private function persistRequest(Request $request)
    {
        return $request->headers->all();
    }

    /**
     * Persists the Response HTTP headers.
     *
     * @param Response $response A Response instance
     *
     * @return array An array of HTTP headers
     */
    private function persistResponse(Response $response)
    {
        $headers = $response->headers->all();
        $headers['X-Status'] = array($response->getStatusCode());

        return $headers;
    }

    /**
     * Restores a Response from the HTTP headers and body.
     *
     * @param array  $headers An array of HTTP headers for the Response
     * @param string $body    The Response body
     *
     * @return Response
     */
    private function restoreResponse($headers, $body = null)
    {
        $status = $headers['X-Status'][0];
        unset($headers['X-Status']);

        if (null !== $body) {
            $headers['X-Body-File'] = array($body);
        }

        return new Response($body, $status, $headers);
    }
}
PK_�\/��)�	�	Hpear/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * This code is partially based on the Rack-Cache library by Ryan Tomayko,
 * which is released under the MIT license.
 * (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801)
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\HttpCache;

use Symfony\Component\HttpFoundation\Response;

/**
 * EsiResponseCacheStrategy knows how to compute the Response cache HTTP header
 * based on the different ESI response cache headers.
 *
 * This implementation changes the master response TTL to the smallest TTL received
 * or force validation if one of the ESI has validation cache strategy.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class EsiResponseCacheStrategy implements EsiResponseCacheStrategyInterface
{
    private $cacheable = true;
    private $embeddedResponses = 0;
    private $ttls = array();
    private $maxAges = array();

    /**
     * {@inheritdoc}
     */
    public function add(Response $response)
    {
        if ($response->isValidateable()) {
            $this->cacheable = false;
        } else {
            $this->ttls[] = $response->getTtl();
            $this->maxAges[] = $response->getMaxAge();
        }

        $this->embeddedResponses++;
    }

    /**
     * {@inheritdoc}
     */
    public function update(Response $response)
    {
        // if we have no embedded Response, do nothing
        if (0 === $this->embeddedResponses) {
            return;
        }

        // Remove validation related headers in order to avoid browsers using
        // their own cache, because some of the response content comes from
        // at least one embedded response (which likely has a different caching strategy).
        if ($response->isValidateable()) {
            $response->setEtag(null);
            $response->setLastModified(null);
            $this->cacheable = false;
        }

        if (!$this->cacheable) {
            $response->headers->set('Cache-Control', 'no-cache, must-revalidate');

            return;
        }

        $this->ttls[] = $response->getTtl();
        $this->maxAges[] = $response->getMaxAge();

        if (null !== $maxAge = min($this->maxAges)) {
            $response->setSharedMaxAge($maxAge);
            $response->headers->set('Age', $maxAge - min($this->ttls));
        }
        $response->setMaxAge(0);
    }
}
PK _�\U����Cpear/Symfony/Component/EventDispatcher/EventDispatcherInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher;

/**
 * The EventDispatcherInterface is the central point of Symfony's event listener system.
 * Listeners are registered on the manager and events are dispatched through the
 * manager.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
interface EventDispatcherInterface
{
    /**
     * Dispatches an event to all registered listeners.
     *
     * @param string $eventName The name of the event to dispatch. The name of
     *                          the event is the name of the method that is
     *                          invoked on listeners.
     * @param Event $event The event to pass to the event handlers/listeners.
     *                          If not supplied, an empty Event instance is created.
     *
     * @return Event
     *
     * @api
     */
    public function dispatch($eventName, Event $event = null);

    /**
     * Adds an event listener that listens on the specified events.
     *
     * @param string   $eventName The event to listen on
     * @param callable $listener  The listener
     * @param integer  $priority  The higher this value, the earlier an event
     *                            listener will be triggered in the chain (defaults to 0)
     *
     * @api
     */
    public function addListener($eventName, $listener, $priority = 0);

    /**
     * Adds an event subscriber.
     *
     * The subscriber is asked for all the events he is
     * interested in and added as a listener for these events.
     *
     * @param EventSubscriberInterface $subscriber The subscriber.
     *
     * @api
     */
    public function addSubscriber(EventSubscriberInterface $subscriber);

    /**
     * Removes an event listener from the specified events.
     *
     * @param string|array $eventName The event(s) to remove a listener from
     * @param callable     $listener  The listener to remove
     */
    public function removeListener($eventName, $listener);

    /**
     * Removes an event subscriber.
     *
     * @param EventSubscriberInterface $subscriber The subscriber
     */
    public function removeSubscriber(EventSubscriberInterface $subscriber);

    /**
     * Gets the listeners of a specific event or all listeners.
     *
     * @param string $eventName The name of the event
     *
     * @return array The event listeners for the specified event, or all event listeners by event name
     */
    public function getListeners($eventName = null);

    /**
     * Checks whether an event has any registered listeners.
     *
     * @param string $eventName The name of the event
     *
     * @return Boolean true if the specified event has any listeners, false otherwise
     */
    public function hasListeners($eventName = null);
}
PK!_�\,��DD7pear/Symfony/Component/EventDispatcher/GenericEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher;

/**
 * Event encapsulation class.
 *
 * Encapsulates events thus decoupling the observer from the subject they encapsulate.
 *
 * @author Drak <drak@zikula.org>
 */
class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
{
    /**
     * Event subject.
     *
     * @var mixed usually object or callable
     */
    protected $subject;

    /**
     * Array of arguments.
     *
     * @var array
     */
    protected $arguments;

    /**
     * Encapsulate an event with $subject and $args.
     *
     * @param mixed $subject   The subject of the event, usually an object.
     * @param array $arguments Arguments to store in the event.
     */
    public function __construct($subject = null, array $arguments = array())
    {
        $this->subject = $subject;
        $this->arguments = $arguments;
    }

    /**
     * Getter for subject property.
     *
     * @return mixed $subject The observer subject.
     */
    public function getSubject()
    {
        return $this->subject;
    }

    /**
     * Get argument by key.
     *
     * @param string $key Key.
     *
     * @throws \InvalidArgumentException If key is not found.
     *
     * @return mixed Contents of array key.
     */
    public function getArgument($key)
    {
        if ($this->hasArgument($key)) {
            return $this->arguments[$key];
        }

        throw new \InvalidArgumentException(sprintf('%s not found in %s', $key, $this->getName()));
    }

    /**
     * Add argument to event.
     *
     * @param string $key   Argument name.
     * @param mixed  $value Value.
     *
     * @return GenericEvent
     */
    public function setArgument($key, $value)
    {
        $this->arguments[$key] = $value;

        return $this;
    }

    /**
     * Getter for all arguments.
     *
     * @return array
     */
    public function getArguments()
    {
        return $this->arguments;
    }

    /**
     * Set args property.
     *
     * @param array $args Arguments.
     *
     * @return GenericEvent
     */
    public function setArguments(array $args = array())
    {
        $this->arguments = $args;

        return $this;
    }

    /**
     * Has argument.
     *
     * @param string $key Key of arguments array.
     *
     * @return boolean
     */
    public function hasArgument($key)
    {
        return array_key_exists($key, $this->arguments);
    }

    /**
     * ArrayAccess for argument getter.
     *
     * @param string $key Array key.
     *
     * @throws \InvalidArgumentException If key does not exist in $this->args.
     *
     * @return mixed
     */
    public function offsetGet($key)
    {
        return $this->getArgument($key);
    }

    /**
     * ArrayAccess for argument setter.
     *
     * @param string $key   Array key to set.
     * @param mixed  $value Value.
     */
    public function offsetSet($key, $value)
    {
        $this->setArgument($key, $value);
    }

    /**
     * ArrayAccess for unset argument.
     *
     * @param string $key Array key.
     */
    public function offsetUnset($key)
    {
        if ($this->hasArgument($key)) {
            unset($this->arguments[$key]);
        }
    }

    /**
     * ArrayAccess has argument.
     *
     * @param string $key Array key.
     *
     * @return boolean
     */
    public function offsetExists($key)
    {
        return $this->hasArgument($key);
    }

    /**
     * IteratorAggregate for iterating over the object like an array
     *
     * @return \ArrayIterator
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->arguments);
    }
}
PK!_�\�
���Rpear/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher\Debug;

/**
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface TraceableEventDispatcherInterface
{
    /**
     * Gets the called listeners.
     *
     * @return array An array of called listeners
     */
    public function getCalledListeners();

    /**
     * Gets the not called listeners.
     *
     * @return array An array of not called listeners
     */
    public function getNotCalledListeners();
}
PK"_�\Y�"��:pear/Symfony/Component/EventDispatcher/EventDispatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher;

/**
 * The EventDispatcherInterface is the central point of Symfony's event listener system.
 *
 * Listeners are registered on the manager and events are dispatched through the
 * manager.
 *
 * @author  Guilherme Blanco <guilhermeblanco@hotmail.com>
 * @author  Jonathan Wage <jonwage@gmail.com>
 * @author  Roman Borschel <roman@code-factory.org>
 * @author  Bernhard Schussek <bschussek@gmail.com>
 * @author  Fabien Potencier <fabien@symfony.com>
 * @author  Jordi Boggiano <j.boggiano@seld.be>
 * @author  Jordan Alliot <jordan.alliot@gmail.com>
 *
 * @api
 */
class EventDispatcher implements EventDispatcherInterface
{
    private $listeners = array();
    private $sorted = array();

    /**
     * @see EventDispatcherInterface::dispatch
     *
     * @api
     */
    public function dispatch($eventName, Event $event = null)
    {
        if (null === $event) {
            $event = new Event();
        }

        $event->setDispatcher($this);
        $event->setName($eventName);

        if (!isset($this->listeners[$eventName])) {
            return $event;
        }

        $this->doDispatch($this->getListeners($eventName), $eventName, $event);

        return $event;
    }

    /**
     * @see EventDispatcherInterface::getListeners
     */
    public function getListeners($eventName = null)
    {
        if (null !== $eventName) {
            if (!isset($this->sorted[$eventName])) {
                $this->sortListeners($eventName);
            }

            return $this->sorted[$eventName];
        }

        foreach (array_keys($this->listeners) as $eventName) {
            if (!isset($this->sorted[$eventName])) {
                $this->sortListeners($eventName);
            }
        }

        return $this->sorted;
    }

    /**
     * @see EventDispatcherInterface::hasListeners
     */
    public function hasListeners($eventName = null)
    {
        return (Boolean) count($this->getListeners($eventName));
    }

    /**
     * @see EventDispatcherInterface::addListener
     *
     * @api
     */
    public function addListener($eventName, $listener, $priority = 0)
    {
        $this->listeners[$eventName][$priority][] = $listener;
        unset($this->sorted[$eventName]);
    }

    /**
     * @see EventDispatcherInterface::removeListener
     */
    public function removeListener($eventName, $listener)
    {
        if (!isset($this->listeners[$eventName])) {
            return;
        }

        foreach ($this->listeners[$eventName] as $priority => $listeners) {
            if (false !== ($key = array_search($listener, $listeners, true))) {
                unset($this->listeners[$eventName][$priority][$key], $this->sorted[$eventName]);
            }
        }
    }

    /**
     * @see EventDispatcherInterface::addSubscriber
     *
     * @api
     */
    public function addSubscriber(EventSubscriberInterface $subscriber)
    {
        foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
            if (is_string($params)) {
                $this->addListener($eventName, array($subscriber, $params));
            } elseif (is_string($params[0])) {
                $this->addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0);
            } else {
                foreach ($params as $listener) {
                    $this->addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0);
                }
            }
        }
    }

    /**
     * @see EventDispatcherInterface::removeSubscriber
     */
    public function removeSubscriber(EventSubscriberInterface $subscriber)
    {
        foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
            if (is_array($params) && is_array($params[0])) {
                foreach ($params as $listener) {
                    $this->removeListener($eventName, array($subscriber, $listener[0]));
                }
            } else {
                $this->removeListener($eventName, array($subscriber, is_string($params) ? $params : $params[0]));
            }
        }
    }

    /**
     * Triggers the listeners of an event.
     *
     * This method can be overridden to add functionality that is executed
     * for each listener.
     *
     * @param callable[] $listeners The event listeners.
     * @param string     $eventName The name of the event to dispatch.
     * @param Event      $event     The event object to pass to the event handlers/listeners.
     */
    protected function doDispatch($listeners, $eventName, Event $event)
    {
        foreach ($listeners as $listener) {
            call_user_func($listener, $event, $eventName, $this);
            if ($event->isPropagationStopped()) {
                break;
            }
        }
    }

    /**
     * Sorts the internal list of listeners for the given event by priority.
     *
     * @param string $eventName The name of the event.
     */
    private function sortListeners($eventName)
    {
        $this->sorted[$eventName] = array();

        if (isset($this->listeners[$eventName])) {
            krsort($this->listeners[$eventName]);
            $this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]);
        }
    }
}
PK"_�\s���Cpear/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher;

/**
 * A read-only proxy for an event dispatcher.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ImmutableEventDispatcher implements EventDispatcherInterface
{
    /**
     * The proxied dispatcher.
     * @var EventDispatcherInterface
     */
    private $dispatcher;

    /**
     * Creates an unmodifiable proxy for an event dispatcher.
     *
     * @param EventDispatcherInterface $dispatcher The proxied event dispatcher.
     */
    public function __construct(EventDispatcherInterface $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }

    /**
     * {@inheritdoc}
     */
    public function dispatch($eventName, Event $event = null)
    {
        return $this->dispatcher->dispatch($eventName, $event);
    }

    /**
     * {@inheritdoc}
     */
    public function addListener($eventName, $listener, $priority = 0)
    {
        throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
    }

    /**
     * {@inheritdoc}
     */
    public function addSubscriber(EventSubscriberInterface $subscriber)
    {
        throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
    }

    /**
     * {@inheritdoc}
     */
    public function removeListener($eventName, $listener)
    {
        throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
    }

    /**
     * {@inheritdoc}
     */
    public function removeSubscriber(EventSubscriberInterface $subscriber)
    {
        throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.');
    }

    /**
     * {@inheritdoc}
     */
    public function getListeners($eventName = null)
    {
        return $this->dispatcher->getListeners($eventName);
    }

    /**
     * {@inheritdoc}
     */
    public function hasListeners($eventName = null)
    {
        return $this->dispatcher->hasListeners($eventName);
    }
}
PK#_�\��YY5pear/Symfony/Component/EventDispatcher/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\EventDispatcher\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK#_�\cG�11Cpear/Symfony/Component/EventDispatcher/EventSubscriberInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher;

/**
 * An EventSubscriber knows himself what events he is interested in.
 * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes
 * {@link getSubscribedEvents} and registers the subscriber as a listener for all
 * returned events.
 *
 * @author  Guilherme Blanco <guilhermeblanco@hotmail.com>
 * @author  Jonathan Wage <jonwage@gmail.com>
 * @author  Roman Borschel <roman@code-factory.org>
 * @author  Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
interface EventSubscriberInterface
{
    /**
     * Returns an array of event names this subscriber wants to listen to.
     *
     * The array keys are event names and the value can be:
     *
     *  * The method name to call (priority defaults to 0)
     *  * An array composed of the method name to call and the priority
     *  * An array of arrays composed of the method names to call and respective
     *    priorities, or 0 if unset
     *
     * For instance:
     *
     *  * array('eventName' => 'methodName')
     *  * array('eventName' => array('methodName', $priority))
     *  * array('eventName' => array(array('methodName1', $priority), array('methodName2'))
     *
     * @return array The event names to listen to
     *
     * @api
     */
    public static function getSubscribedEvents();
}
PK#_�\��NmHpear/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher;

use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Lazily loads listeners and subscribers from the dependency injection
 * container
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Jordan Alliot <jordan.alliot@gmail.com>
 */
class ContainerAwareEventDispatcher extends EventDispatcher
{
    /**
     * The container from where services are loaded
     * @var ContainerInterface
     */
    private $container;

    /**
     * The service IDs of the event listeners and subscribers
     * @var array
     */
    private $listenerIds = array();

    /**
     * The services registered as listeners
     * @var array
     */
    private $listeners = array();

    /**
     * Constructor.
     *
     * @param ContainerInterface $container A ContainerInterface instance
     */
    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    /**
     * Adds a service as event listener
     *
     * @param string $eventName Event for which the listener is added
     * @param array  $callback  The service ID of the listener service & the method
     *                            name that has to be called
     * @param integer $priority The higher this value, the earlier an event listener
     *                            will be triggered in the chain.
     *                            Defaults to 0.
     *
     * @throws \InvalidArgumentException
     */
    public function addListenerService($eventName, $callback, $priority = 0)
    {
        if (!is_array($callback) || 2 !== count($callback)) {
            throw new \InvalidArgumentException('Expected an array("service", "method") argument');
        }

        $this->listenerIds[$eventName][] = array($callback[0], $callback[1], $priority);
    }

    public function removeListener($eventName, $listener)
    {
        $this->lazyLoad($eventName);

        if (isset($this->listeners[$eventName])) {
            foreach ($this->listeners[$eventName] as $key => $l) {
                foreach ($this->listenerIds[$eventName] as $i => $args) {
                    list($serviceId, $method, $priority) = $args;
                    if ($key === $serviceId.'.'.$method) {
                        if ($listener === array($l, $method)) {
                            unset($this->listeners[$eventName][$key]);
                            if (empty($this->listeners[$eventName])) {
                                unset($this->listeners[$eventName]);
                            }
                            unset($this->listenerIds[$eventName][$i]);
                            if (empty($this->listenerIds[$eventName])) {
                                unset($this->listenerIds[$eventName]);
                            }
                        }
                    }
                }
            }
        }

        parent::removeListener($eventName, $listener);
    }

    /**
     * @see EventDispatcherInterface::hasListeners
     */
    public function hasListeners($eventName = null)
    {
        if (null === $eventName) {
            return (Boolean) count($this->listenerIds) || (Boolean) count($this->listeners);
        }

        if (isset($this->listenerIds[$eventName])) {
            return true;
        }

        return parent::hasListeners($eventName);
    }

    /**
     * @see EventDispatcherInterface::getListeners
     */
    public function getListeners($eventName = null)
    {
        if (null === $eventName) {
            foreach (array_keys($this->listenerIds) as $serviceEventName) {
                $this->lazyLoad($serviceEventName);
            }
        } else {
            $this->lazyLoad($eventName);
        }

        return parent::getListeners($eventName);
    }

    /**
     * Adds a service as event subscriber
     *
     * @param string $serviceId The service ID of the subscriber service
     * @param string $class     The service's class name (which must implement EventSubscriberInterface)
     */
    public function addSubscriberService($serviceId, $class)
    {
        foreach ($class::getSubscribedEvents() as $eventName => $params) {
            if (is_string($params)) {
                $this->listenerIds[$eventName][] = array($serviceId, $params, 0);
            } elseif (is_string($params[0])) {
                $this->listenerIds[$eventName][] = array($serviceId, $params[0], isset($params[1]) ? $params[1] : 0);
            } else {
                foreach ($params as $listener) {
                    $this->listenerIds[$eventName][] = array($serviceId, $listener[0], isset($listener[1]) ? $listener[1] : 0);
                }
            }
        }
    }

    /**
     * {@inheritDoc}
     *
     * Lazily loads listeners for this event from the dependency injection
     * container.
     *
     * @throws \InvalidArgumentException if the service is not defined
     */
    public function dispatch($eventName, Event $event = null)
    {
        $this->lazyLoad($eventName);

        return parent::dispatch($eventName, $event);
    }

    public function getContainer()
    {
        return $this->container;
    }

    /**
     * Lazily loads listeners for this event from the dependency injection
     * container.
     *
     * @param string $eventName The name of the event to dispatch. The name of
     *                          the event is the name of the method that is
     *                          invoked on listeners.
     */
    protected function lazyLoad($eventName)
    {
        if (isset($this->listenerIds[$eventName])) {
            foreach ($this->listenerIds[$eventName] as $args) {
                list($serviceId, $method, $priority) = $args;
                $listener = $this->container->get($serviceId);

                $key = $serviceId.'.'.$method;
                if (!isset($this->listeners[$eventName][$key])) {
                    $this->addListener($eventName, array($listener, $method), $priority);
                } elseif ($listener !== $this->listeners[$eventName][$key]) {
                    parent::removeListener($eventName, array($this->listeners[$eventName][$key], $method));
                    $this->addListener($eventName, array($listener, $method), $priority);
                }

                $this->listeners[$eventName][$key] = $listener;
            }
        }
    }
}
PK$_�\b�k���0pear/Symfony/Component/EventDispatcher/Event.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher;

/**
 * Event is the base class for classes containing event data.
 *
 * This class contains no event data. It is used by events that do not pass
 * state information to an event handler when an event is raised.
 *
 * You can call the method stopPropagation() to abort the execution of
 * further listeners in your event listener.
 *
 * @author  Guilherme Blanco <guilhermeblanco@hotmail.com>
 * @author  Jonathan Wage <jonwage@gmail.com>
 * @author  Roman Borschel <roman@code-factory.org>
 * @author  Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Event
{
    /**
     * @var Boolean Whether no further event listeners should be triggered
     */
    private $propagationStopped = false;

    /**
     * @var EventDispatcher Dispatcher that dispatched this event
     */
    private $dispatcher;

    /**
     * @var string This event's name
     */
    private $name;

    /**
     * Returns whether further event listeners should be triggered.
     *
     * @see Event::stopPropagation
     * @return Boolean Whether propagation was already stopped for this event.
     *
     * @api
     */
    public function isPropagationStopped()
    {
        return $this->propagationStopped;
    }

    /**
     * Stops the propagation of the event to further event listeners.
     *
     * If multiple event listeners are connected to the same event, no
     * further event listener will be triggered once any trigger calls
     * stopPropagation().
     *
     * @api
     */
    public function stopPropagation()
    {
        $this->propagationStopped = true;
    }

    /**
     * Stores the EventDispatcher that dispatches this Event
     *
     * @param EventDispatcherInterface $dispatcher
     *
     * @deprecated Deprecated in 2.4, to be removed in 3.0. The event dispatcher is passed to the listener call.
     *
     * @api
     */
    public function setDispatcher(EventDispatcherInterface $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }

    /**
     * Returns the EventDispatcher that dispatches this Event
     *
     * @return EventDispatcherInterface
     *
     * @deprecated Deprecated in 2.4, to be removed in 3.0. The event dispatcher is passed to the listener call.
     *
     * @api
     */
    public function getDispatcher()
    {
        return $this->dispatcher;
    }

    /**
     * Gets the event's name.
     *
     * @return string
     *
     * @deprecated Deprecated in 2.4, to be removed in 3.0. The event name is passed to the listener call.
     *
     * @api
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Sets the event's name property.
     *
     * @param string $name The event name.
     *
     * @deprecated Deprecated in 2.4, to be removed in 3.0. The event name is passed to the listener call.
     *
     * @api
     */
    public function setName($name)
    {
        $this->name = $name;
    }
}
PK$_�\�e�G��1pear/Symfony/Component/Translation/Translator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation;

use Symfony\Component\Translation\Loader\LoaderInterface;
use Symfony\Component\Translation\Exception\NotFoundResourceException;

/**
 * Translator.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Translator implements TranslatorInterface
{
    /**
     * @var MessageCatalogueInterface[]
     */
    protected $catalogues = array();

    /**
     * @var string
     */
    protected $locale;

    /**
     * @var array
     */
    private $fallbackLocales = array();

    /**
     * @var LoaderInterface[]
     */
    private $loaders = array();

    /**
     * @var array
     */
    private $resources = array();

    /**
     * @var MessageSelector
     */
    private $selector;

    /**
     * Constructor.
     *
     * @param string               $locale   The locale
     * @param MessageSelector|null $selector The message selector for pluralization
     *
     * @api
     */
    public function __construct($locale, MessageSelector $selector = null)
    {
        $this->locale = $locale;
        $this->selector = $selector ?: new MessageSelector();
    }

    /**
     * Adds a Loader.
     *
     * @param string          $format The name of the loader (@see addResource())
     * @param LoaderInterface $loader A LoaderInterface instance
     *
     * @api
     */
    public function addLoader($format, LoaderInterface $loader)
    {
        $this->loaders[$format] = $loader;
    }

    /**
     * Adds a Resource.
     *
     * @param string $format   The name of the loader (@see addLoader())
     * @param mixed  $resource The resource name
     * @param string $locale   The locale
     * @param string $domain   The domain
     *
     * @api
     */
    public function addResource($format, $resource, $locale, $domain = null)
    {
        if (null === $domain) {
            $domain = 'messages';
        }

        $this->resources[$locale][] = array($format, $resource, $domain);

        if (in_array($locale, $this->fallbackLocales)) {
            $this->catalogues = array();
        } else {
            unset($this->catalogues[$locale]);
        }
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function setLocale($locale)
    {
        $this->locale = $locale;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getLocale()
    {
        return $this->locale;
    }

    /**
     * Sets the fallback locale(s).
     *
     * @param string|array $locales The fallback locale(s)
     *
     * @deprecated since 2.3, to be removed in 3.0. Use setFallbackLocales() instead.
     *
     * @api
     */
    public function setFallbackLocale($locales)
    {
        $this->setFallbackLocales(is_array($locales) ? $locales : array($locales));
    }

    /**
     * Sets the fallback locales.
     *
     * @param array $locales The fallback locales
     *
     * @api
     */
    public function setFallbackLocales(array $locales)
    {
        // needed as the fallback locales are linked to the already loaded catalogues
        $this->catalogues = array();

        $this->fallbackLocales = $locales;
    }

    /**
     * Gets the fallback locales.
     *
     * @return array $locales The fallback locales
     *
     * @api
     */
    public function getFallbackLocales()
    {
        return $this->fallbackLocales;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function trans($id, array $parameters = array(), $domain = null, $locale = null)
    {
        if (null === $locale) {
            $locale = $this->getLocale();
        }

        if (null === $domain) {
            $domain = 'messages';
        }

        if (!isset($this->catalogues[$locale])) {
            $this->loadCatalogue($locale);
        }

        return strtr($this->catalogues[$locale]->get((string) $id, $domain), $parameters);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
    {
        if (null === $locale) {
            $locale = $this->getLocale();
        }

        if (null === $domain) {
            $domain = 'messages';
        }

        if (!isset($this->catalogues[$locale])) {
            $this->loadCatalogue($locale);
        }

        $id = (string) $id;

        $catalogue = $this->catalogues[$locale];
        while (!$catalogue->defines($id, $domain)) {
            if ($cat = $catalogue->getFallbackCatalogue()) {
                $catalogue = $cat;
                $locale = $catalogue->getLocale();
            } else {
                break;
            }
        }

        return strtr($this->selector->choose($catalogue->get($id, $domain), (int) $number, $locale), $parameters);
    }

    /**
     * Gets the loaders.
     *
     * @return array LoaderInterface[]
     */
    protected function getLoaders()
    {
        return $this->loaders;
    }

    protected function loadCatalogue($locale)
    {
        try {
            $this->doLoadCatalogue($locale);
        } catch (NotFoundResourceException $e) {
            if (!$this->computeFallbackLocales($locale)) {
                throw $e;
            }
        }
        $this->loadFallbackCatalogues($locale);
    }

    private function doLoadCatalogue($locale)
    {
        $this->catalogues[$locale] = new MessageCatalogue($locale);

        if (isset($this->resources[$locale])) {
            foreach ($this->resources[$locale] as $resource) {
                if (!isset($this->loaders[$resource[0]])) {
                    throw new \RuntimeException(sprintf('The "%s" translation loader is not registered.', $resource[0]));
                }
                $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2]));
            }
        }
    }

    private function loadFallbackCatalogues($locale)
    {
        $current = $this->catalogues[$locale];

        foreach ($this->computeFallbackLocales($locale) as $fallback) {
            if (!isset($this->catalogues[$fallback])) {
                $this->doLoadCatalogue($fallback);
            }

            $current->addFallbackCatalogue($this->catalogues[$fallback]);
            $current = $this->catalogues[$fallback];
        }
    }

    protected function computeFallbackLocales($locale)
    {
        $locales = array();
        foreach ($this->fallbackLocales as $fallback) {
            if ($fallback === $locale) {
                continue;
            }

            $locales[] = $fallback;
        }

        if (strrchr($locale, '_') !== false) {
            array_unshift($locales, substr($locale, 0, -strlen(strrchr($locale, '_'))));
        }

        return array_unique($locales);
    }
}
PK%_�\P�?�}}?pear/Symfony/Component/Translation/Writer/TranslationWriter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Writer;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\DumperInterface;

/**
 * TranslationWriter writes translation messages.
 *
 * @author Michel Salib <michelsalib@hotmail.com>
 */
class TranslationWriter
{
    /**
     * Dumpers used for export.
     *
     * @var array
     */
    private $dumpers = array();

    /**
     * Adds a dumper to the writer.
     *
     * @param string          $format The format of the dumper
     * @param DumperInterface $dumper The dumper
     */
    public function addDumper($format, DumperInterface $dumper)
    {
        $this->dumpers[$format] = $dumper;
    }

    /**
     * Obtains the list of supported formats.
     *
     * @return array
     */
    public function getFormats()
    {
        return array_keys($this->dumpers);
    }

    /**
     * Writes translation from the catalogue according to the selected format.
     *
     * @param MessageCatalogue $catalogue The message catalogue to dump
     * @param string           $format    The format to use to dump the messages
     * @param array            $options   Options that are passed to the dumper
     *
     * @throws \InvalidArgumentException
     */
    public function writeTranslations(MessageCatalogue $catalogue, $format, $options = array())
    {
        if (!isset($this->dumpers[$format])) {
            throw new \InvalidArgumentException(sprintf('There is no dumper associated with format "%s".', $format));
        }

        // get the right dumper
        $dumper = $this->dumpers[$format];

        // save
        $dumper->dump($catalogue, $options);
    }
}
PK&_�\�d�<<9pear/Symfony/Component/Translation/IdentityTranslator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation;

/**
 * IdentityTranslator does not translate anything.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class IdentityTranslator implements TranslatorInterface
{
    private $selector;
    private $locale;

    /**
     * Constructor.
     *
     * @param MessageSelector|null $selector The message selector for pluralization
     *
     * @api
     */
    public function __construct(MessageSelector $selector = null)
    {
        $this->selector = $selector ?: new MessageSelector();
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function setLocale($locale)
    {
        $this->locale = $locale;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getLocale()
    {
        return $this->locale ?: \Locale::getDefault();
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function trans($id, array $parameters = array(), $domain = null, $locale = null)
    {
        return strtr((string) $id, $parameters);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
    {
        return strtr($this->selector->choose((string) $id, (int) $number, $locale ?: $this->getLocale()), $parameters);
    }
}
PK&_�\��֛�@pear/Symfony/Component/Translation/MessageCatalogueInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation;

use Symfony\Component\Config\Resource\ResourceInterface;

/**
 * MessageCatalogueInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface MessageCatalogueInterface
{
    /**
     * Gets the catalogue locale.
     *
     * @return string The locale
     *
     * @api
     */
    public function getLocale();

    /**
     * Gets the domains.
     *
     * @return array An array of domains
     *
     * @api
     */
    public function getDomains();

    /**
     * Gets the messages within a given domain.
     *
     * If $domain is null, it returns all messages.
     *
     * @param string $domain The domain name
     *
     * @return array An array of messages
     *
     * @api
     */
    public function all($domain = null);

    /**
     * Sets a message translation.
     *
     * @param string $id          The message id
     * @param string $translation The messages translation
     * @param string $domain      The domain name
     *
     * @api
     */
    public function set($id, $translation, $domain = 'messages');

    /**
     * Checks if a message has a translation.
     *
     * @param string $id     The message id
     * @param string $domain The domain name
     *
     * @return Boolean true if the message has a translation, false otherwise
     *
     * @api
     */
    public function has($id, $domain = 'messages');

    /**
     * Checks if a message has a translation (it does not take into account the fallback mechanism).
     *
     * @param string $id     The message id
     * @param string $domain The domain name
     *
     * @return Boolean true if the message has a translation, false otherwise
     *
     * @api
     */
    public function defines($id, $domain = 'messages');

    /**
     * Gets a message translation.
     *
     * @param string $id     The message id
     * @param string $domain The domain name
     *
     * @return string The message translation
     *
     * @api
     */
    public function get($id, $domain = 'messages');

    /**
     * Sets translations for a given domain.
     *
     * @param array  $messages An array of translations
     * @param string $domain   The domain name
     *
     * @api
     */
    public function replace($messages, $domain = 'messages');

    /**
     * Adds translations for a given domain.
     *
     * @param array  $messages An array of translations
     * @param string $domain   The domain name
     *
     * @api
     */
    public function add($messages, $domain = 'messages');

    /**
     * Merges translations from the given Catalogue into the current one.
     *
     * The two catalogues must have the same locale.
     *
     * @param MessageCatalogueInterface $catalogue A MessageCatalogueInterface instance
     *
     * @api
     */
    public function addCatalogue(MessageCatalogueInterface $catalogue);

    /**
     * Merges translations from the given Catalogue into the current one
     * only when the translation does not exist.
     *
     * This is used to provide default translations when they do not exist for the current locale.
     *
     * @param MessageCatalogueInterface $catalogue A MessageCatalogueInterface instance
     *
     * @api
     */
    public function addFallbackCatalogue(MessageCatalogueInterface $catalogue);

    /**
     * Gets the fallback catalogue.
     *
     * @return MessageCatalogueInterface|null A MessageCatalogueInterface instance or null when no fallback has been set
     *
     * @api
     */
    public function getFallbackCatalogue();

    /**
     * Returns an array of resources loaded to build this collection.
     *
     * @return ResourceInterface[] An array of resources
     *
     * @api
     */
    public function getResources();

    /**
     * Adds a resource for this collection.
     *
     * @param ResourceInterface $resource A resource instance
     *
     * @api
     */
    public function addResource(ResourceInterface $resource);
}
PK'_�\�y4��7pear/Symfony/Component/Translation/MessageCatalogue.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation;

use Symfony\Component\Config\Resource\ResourceInterface;

/**
 * MessageCatalogue.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterface
{
    private $messages = array();
    private $metadata = array();
    private $resources = array();
    private $locale;
    private $fallbackCatalogue;
    private $parent;

    /**
     * Constructor.
     *
     * @param string $locale   The locale
     * @param array  $messages An array of messages classified by domain
     *
     * @api
     */
    public function __construct($locale, array $messages = array())
    {
        $this->locale = $locale;
        $this->messages = $messages;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getLocale()
    {
        return $this->locale;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getDomains()
    {
        return array_keys($this->messages);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function all($domain = null)
    {
        if (null === $domain) {
            return $this->messages;
        }

        return isset($this->messages[$domain]) ? $this->messages[$domain] : array();
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function set($id, $translation, $domain = 'messages')
    {
        $this->add(array($id => $translation), $domain);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function has($id, $domain = 'messages')
    {
        if (isset($this->messages[$domain][$id])) {
            return true;
        }

        if (null !== $this->fallbackCatalogue) {
            return $this->fallbackCatalogue->has($id, $domain);
        }

        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function defines($id, $domain = 'messages')
    {
        return isset($this->messages[$domain][$id]);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function get($id, $domain = 'messages')
    {
        if (isset($this->messages[$domain][$id])) {
            return $this->messages[$domain][$id];
        }

        if (null !== $this->fallbackCatalogue) {
            return $this->fallbackCatalogue->get($id, $domain);
        }

        return $id;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function replace($messages, $domain = 'messages')
    {
        $this->messages[$domain] = array();

        $this->add($messages, $domain);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function add($messages, $domain = 'messages')
    {
        if (!isset($this->messages[$domain])) {
            $this->messages[$domain] = $messages;
        } else {
            $this->messages[$domain] = array_replace($this->messages[$domain], $messages);
        }
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function addCatalogue(MessageCatalogueInterface $catalogue)
    {
        if ($catalogue->getLocale() !== $this->locale) {
            throw new \LogicException(sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s"', $catalogue->getLocale(), $this->locale));
        }

        foreach ($catalogue->all() as $domain => $messages) {
            $this->add($messages, $domain);
        }

        foreach ($catalogue->getResources() as $resource) {
            $this->addResource($resource);
        }

        if ($catalogue instanceof MetadataAwareInterface) {
            $metadata = $catalogue->getMetadata('', '');
            $this->addMetadata($metadata);
        }
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function addFallbackCatalogue(MessageCatalogueInterface $catalogue)
    {
        // detect circular references
        $c = $this;
        do {
            if ($c->getLocale() === $catalogue->getLocale()) {
                throw new \LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
            }
        } while ($c = $c->parent);

        $catalogue->parent = $this;
        $this->fallbackCatalogue = $catalogue;

        foreach ($catalogue->getResources() as $resource) {
            $this->addResource($resource);
        }
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getFallbackCatalogue()
    {
        return $this->fallbackCatalogue;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getResources()
    {
        return array_values($this->resources);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function addResource(ResourceInterface $resource)
    {
        $this->resources[$resource->__toString()] = $resource;
    }

    /**
     * {@inheritdoc}
     */
    public function getMetadata($key = '', $domain = 'messages')
    {
        if ('' == $domain) {
            return $this->metadata;
        }

        if (isset($this->metadata[$domain])) {
            if ('' == $key) {
                return $this->metadata[$domain];
            }

            if (isset($this->metadata[$domain][$key])) {
                return $this->metadata[$domain][$key];
            }
        }

        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function setMetadata($key, $value, $domain = 'messages')
    {
        $this->metadata[$domain][$key] = $value;
    }

    /**
     * {@inheritdoc}
     */
    public function deleteMetadata($key = '', $domain = 'messages')
    {
        if ('' == $domain) {
            $this->metadata = array();
        } elseif ('' == $key) {
            unset($this->metadata[$domain]);
        } else {
            unset($this->metadata[$domain][$key]);
        }
    }

    /**
     * Adds current values with the new values.
     *
     * @param array $values Values to add
     */
    private function addMetadata(array $values)
    {
        foreach ($values as $domain => $keys) {
            foreach ($keys as $key => $value) {
                $this->setMetadata($key, $value, $domain);
            }
        }
    }
}
PK'_�\�q��UU1pear/Symfony/Component/Translation/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Translation\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK'_�\�:$}}<pear/Symfony/Component/Translation/Dumper/JsonFileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;

if (!defined('JSON_PRETTY_PRINT')) {
    define('JSON_PRETTY_PRINT', 128);
}

/**
 * JsonFileDumper generates an json formatted string representation of a message catalogue.
 *
 * @author singles
 */
class JsonFileDumper extends FileDumper
{
    /**
     * {@inheritDoc}
     */
    public function format(MessageCatalogue $messages, $domain = 'messages')
    {
        return json_encode($messages->all($domain), JSON_PRETTY_PRINT);
    }

    /**
     * {@inheritDoc}
     */
    protected function getExtension()
    {
        return 'json';
    }
}
PK(_�\��<**=pear/Symfony/Component/Translation/Dumper/DumperInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * DumperInterface is the interface implemented by all translation dumpers.
 * There is no common option.
 *
 * @author Michel Salib <michelsalib@hotmail.com>
 */
interface DumperInterface
{
    /**
     * Dumps the message catalogue.
     *
     * @param MessageCatalogue $messages The message catalogue
     * @param array            $options  Options that are used by the dumper
     */
    public function dump(MessageCatalogue $messages, $options = array());
}
PK(_�\�<̧��=pear/Symfony/Component/Translation/Dumper/XliffFileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * XliffFileDumper generates xliff files from a message catalogue.
 *
 * @author Michel Salib <michelsalib@hotmail.com>
 */
class XliffFileDumper extends FileDumper
{
    /**
     * {@inheritDoc}
     */
    protected function format(MessageCatalogue $messages, $domain)
    {
        $dom = new \DOMDocument('1.0', 'utf-8');
        $dom->formatOutput = true;

        $xliff = $dom->appendChild($dom->createElement('xliff'));
        $xliff->setAttribute('version', '1.2');
        $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2');

        $xliffFile = $xliff->appendChild($dom->createElement('file'));
        $xliffFile->setAttribute('source-language', $messages->getLocale());
        $xliffFile->setAttribute('datatype', 'plaintext');
        $xliffFile->setAttribute('original', 'file.ext');

        $xliffBody = $xliffFile->appendChild($dom->createElement('body'));
        foreach ($messages->all($domain) as $source => $target) {
            $translation = $dom->createElement('trans-unit');

            $translation->setAttribute('id', md5($source));
            $translation->setAttribute('resname', $source);

            $s = $translation->appendChild($dom->createElement('source'));
            $s->appendChild($dom->createTextNode($source));

            $t = $translation->appendChild($dom->createElement('target'));
            $t->appendChild($dom->createTextNode($target));

            $xliffBody->appendChild($translation);
        }

        return $dom->saveXML();
    }

    /**
     * {@inheritDoc}
     */
    protected function getExtension()
    {
        return 'xlf';
    }
}
PK)_�\M�
���>pear/Symfony/Component/Translation/Dumper/IcuResFileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * IcuResDumper generates an ICU ResourceBundle formatted string representation of a message catalogue.
 *
 * @author Stealth35
 */
class IcuResFileDumper implements DumperInterface
{
    /**
     * {@inheritDoc}
     */
    public function dump(MessageCatalogue $messages, $options = array())
    {
        if (!array_key_exists('path', $options)) {
            throw new \InvalidArgumentException('The file dumper need a path options.');
        }

        // save a file for each domain
        foreach ($messages->getDomains() as $domain) {
            $file = $messages->getLocale().'.'.$this->getExtension();
            $path = $options['path'].'/'.$domain.'/';

            if (!file_exists($path)) {
                mkdir($path);
            }

            // backup
            if (file_exists($path.$file)) {
                copy($path.$file, $path.$file.'~');
            }

            // save file
            file_put_contents($path.$file, $this->format($messages, $domain));
        }
    }

    /**
     * {@inheritDoc}
     */
    public function format(MessageCatalogue $messages, $domain = 'messages')
    {
        $data = $indexes = $resources = '';

        foreach ($messages->all($domain) as $source => $target) {
            $indexes .= pack('v', strlen($data) + 28);
            $data    .= $source."\0";
        }

        $data .= $this->writePadding($data);

        $keyTop = $this->getPosition($data);

        foreach ($messages->all($domain) as $source => $target) {
            $resources .= pack('V', $this->getPosition($data));

            $data .= pack('V', strlen($target))
                .mb_convert_encoding($target."\0", 'UTF-16LE', 'UTF-8')
                .$this->writePadding($data)
                  ;
        }

        $resOffset = $this->getPosition($data);

        $data .= pack('v', count($messages))
            .$indexes
            .$this->writePadding($data)
            .$resources
              ;

        $bundleTop = $this->getPosition($data);

        $root = pack('V7',
            $resOffset + (2 << 28), // Resource Offset + Resource Type
            6,                      // Index length
            $keyTop,                // Index keys top
            $bundleTop,             // Index resources top
            $bundleTop,             // Index bundle top
            count($messages),       // Index max table length
            0                       // Index attributes
        );

        $header = pack('vC2v4C12@32',
            32,                     // Header size
            0xDA, 0x27,             // Magic number 1 and 2
            20, 0, 0, 2,            // Rest of the header, ..., Size of a char
            0x52, 0x65, 0x73, 0x42, // Data format identifier
            1, 2, 0, 0,             // Data version
            1, 4, 0, 0              // Unicode version
        );

        $output = $header
               .$root
               .$data;

        return $output;
    }

    private function writePadding($data)
    {
        $padding = strlen($data) % 4;

        if ($padding) {
            return str_repeat("\xAA", 4 - $padding);
        }
    }

    private function getPosition($data)
    {
        $position = (strlen($data) + 28) / 4;

        return $position;
    }

    /**
     * {@inheritDoc}
     */
    protected function getExtension()
    {
        return 'res';
    }
}
PK)_�\B^�[[8pear/Symfony/Component/Translation/Dumper/FileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s).
 * Performs backup of already existing files.
 *
 * Options:
 * - path (mandatory): the directory where the files should be saved
 *
 * @author Michel Salib <michelsalib@hotmail.com>
 */
abstract class FileDumper implements DumperInterface
{
    /**
     * {@inheritDoc}
     */
    public function dump(MessageCatalogue $messages, $options = array())
    {
        if (!array_key_exists('path', $options)) {
            throw new \InvalidArgumentException('The file dumper needs a path option.');
        }

        // save a file for each domain
        foreach ($messages->getDomains() as $domain) {
            $file = $domain.'.'.$messages->getLocale().'.'.$this->getExtension();
            // backup
            $fullpath = $options['path'].'/'.$file;
            if (file_exists($fullpath)) {
                copy($fullpath, $fullpath.'~');
            }
            // save file
            file_put_contents($fullpath, $this->format($messages, $domain));
        }
    }

    /**
     * Transforms a domain of a message catalogue to its string representation.
     *
     * @param MessageCatalogue $messages
     * @param string           $domain
     *
     * @return string representation
     */
    abstract protected function format(MessageCatalogue $messages, $domain);

    /**
     * Gets the file extension of the dumper.
     *
     * @return string file extension
     */
    abstract protected function getExtension();
}
PK*_�\oB���;pear/Symfony/Component/Translation/Dumper/CsvFileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * CsvFileDumper generates a csv formatted string representation of a message catalogue.
 *
 * @author Stealth35
 */
class CsvFileDumper extends FileDumper
{
    private $delimiter = ';';
    private $enclosure = '"';

    /**
     * {@inheritDoc}
     */
    public function format(MessageCatalogue $messages, $domain = 'messages')
    {
        $handle = fopen('php://memory', 'rb+');

        foreach ($messages->all($domain) as $source => $target) {
            fputcsv($handle, array($source, $target), $this->delimiter, $this->enclosure);
        }

        rewind($handle);
        $output = stream_get_contents($handle);
        fclose($handle);

        return $output;
    }

    /**
     * Sets the delimiter and escape character for CSV.
     *
     * @param string $delimiter delimiter character
     * @param string $enclosure enclosure character
     */
    public function setCsvControl($delimiter = ';', $enclosure = '"')
    {
        $this->delimiter = $delimiter;
        $this->enclosure = $enclosure;
    }

    /**
     * {@inheritDoc}
     */
    protected function getExtension()
    {
        return 'csv';
    }
}
PK*_�\&X����;pear/Symfony/Component/Translation/Dumper/IniFileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * IniFileDumper generates an ini formatted string representation of a message catalogue.
 *
 * @author Stealth35
 */
class IniFileDumper extends FileDumper
{
    /**
     * {@inheritDoc}
     */
    public function format(MessageCatalogue $messages, $domain = 'messages')
    {
        $output = '';

        foreach ($messages->all($domain) as $source => $target) {
            $escapeTarget = str_replace('"', '\"', $target);
            $output .= $source.'="'.$escapeTarget."\"\n";
        }

        return $output;
    }

    /**
     * {@inheritDoc}
     */
    protected function getExtension()
    {
        return 'ini';
    }
}
PK+_�\����A	A	:pear/Symfony/Component/Translation/Dumper/MoFileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Loader\MoFileLoader;

/**
 * MoFileDumper generates a gettext formatted string representation of a message catalogue.
 *
 * @author Stealth35
 */
class MoFileDumper extends FileDumper
{
    /**
     * {@inheritDoc}
     */
    public function format(MessageCatalogue $messages, $domain = 'messages')
    {
        $output = $sources = $targets = $sourceOffsets = $targetOffsets = '';
        $offsets = array();
        $size = 0;

        foreach ($messages->all($domain) as $source => $target) {
            $offsets[] = array_map('strlen', array($sources, $source, $targets, $target));
            $sources .= "\0".$source;
            $targets .= "\0".$target;
            ++$size;
        }

        $header = array(
            'magicNumber'      => MoFileLoader::MO_LITTLE_ENDIAN_MAGIC,
            'formatRevision'   => 0,
            'count'            => $size,
            'offsetId'         => MoFileLoader::MO_HEADER_SIZE,
            'offsetTranslated' => MoFileLoader::MO_HEADER_SIZE + (8 * $size),
            'sizeHashes'       => 0,
            'offsetHashes'     => MoFileLoader::MO_HEADER_SIZE + (16 * $size),
        );

        $sourcesSize  = strlen($sources);
        $sourcesStart = $header['offsetHashes'] + 1;

        foreach ($offsets as $offset) {
            $sourceOffsets .= $this->writeLong($offset[1])
                          .$this->writeLong($offset[0] + $sourcesStart);
            $targetOffsets .= $this->writeLong($offset[3])
                          .$this->writeLong($offset[2] + $sourcesStart + $sourcesSize);
        }

        $output = implode(array_map(array($this, 'writeLong'), $header))
               .$sourceOffsets
               .$targetOffsets
               .$sources
               .$targets
                ;

        return $output;
    }

    /**
     * {@inheritDoc}
     */
    protected function getExtension()
    {
        return 'mo';
    }

    private function writeLong($str)
    {
        return pack('V*', $str);
    }
}
PK+_�\���%LL;pear/Symfony/Component/Translation/Dumper/PhpFileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * PhpFileDumper generates PHP files from a message catalogue.
 *
 * @author Michel Salib <michelsalib@hotmail.com>
 */
class PhpFileDumper extends FileDumper
{
    /**
     * {@inheritDoc}
     */
    protected function format(MessageCatalogue $messages, $domain)
    {
        $output = "<?php\n\nreturn ".var_export($messages->all($domain), true).";\n";

        return $output;
    }

    /**
     * {@inheritDoc}
     */
    protected function getExtension()
    {
        return 'php';
    }
}
PK,_�\ਪ(:pear/Symfony/Component/Translation/Dumper/PoFileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * PoFileDumper generates a gettext formatted string representation of a message catalogue.
 *
 * @author Stealth35
 */
class PoFileDumper extends FileDumper
{
    /**
     * {@inheritDoc}
     */
    public function format(MessageCatalogue $messages, $domain = 'messages')
    {
        $output = 'msgid ""'."\n";
        $output .= 'msgstr ""'."\n";
        $output .= '"Content-Type: text/plain; charset=UTF-8\n"'."\n";
        $output .= '"Content-Transfer-Encoding: 8bit\n"'."\n";
        $output .= '"Language: '.$messages->getLocale().'\n"'."\n";
        $output .= "\n";

        $newLine = false;
        foreach ($messages->all($domain) as $source => $target) {
            if ($newLine) {
              $output .= "\n";
            } else {
              $newLine = true;
            }
            $output .= sprintf('msgid "%s"'."\n", $this->escape($source));
            $output .= sprintf('msgstr "%s"', $this->escape($target));
        }

        return $output;
    }

    /**
     * {@inheritDoc}
     */
    protected function getExtension()
    {
        return 'po';
    }

    private function escape($str)
    {
        return addcslashes($str, "\0..\37\42\134");
    }
}
PK,_�\���66<pear/Symfony/Component/Translation/Dumper/YamlFileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Yaml\Yaml;

/**
 * YamlFileDumper generates yaml files from a message catalogue.
 *
 * @author Michel Salib <michelsalib@hotmail.com>
 */
class YamlFileDumper extends FileDumper
{
    /**
     * {@inheritDoc}
     */
    protected function format(MessageCatalogue $messages, $domain)
    {
         return Yaml::dump($messages->all($domain));
    }

    /**
     * {@inheritDoc}
     */
    protected function getExtension()
    {
        return 'yml';
    }
}
PK,_�\>{GG:pear/Symfony/Component/Translation/Dumper/QtFileDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Dumper;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * QtFileDumper generates ts files from a message catalogue.
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 */
class QtFileDumper extends FileDumper
{
    /**
     * {@inheritDoc}
     */
    public function format(MessageCatalogue $messages, $domain)
    {
        $dom = new \DOMDocument('1.0', 'utf-8');
        $dom->formatOutput = true;
        $ts = $dom->appendChild($dom->createElement('TS'));
        $context = $ts->appendChild($dom->createElement('context'));
        $context->appendChild($dom->createElement('name', $domain));

        foreach ($messages->all($domain) as $source => $target) {
            $message = $context->appendChild($dom->createElement('message'));
            $message->appendChild($dom->createElement('source', $source));
            $message->appendChild($dom->createElement('translation', $target));
        }

        return $dom->saveXML();
    }

    /**
     * {@inheritDoc}
     */
    protected function getExtension()
    {
        return 'ts';
    }
}
PK-_�\�r��;;;pear/Symfony/Component/Translation/Loader/PhpFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\FileResource;

/**
 * PhpFileLoader loads translations from PHP files returning an array of translations.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class PhpFileLoader extends ArrayLoader implements LoaderInterface
{
    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource)) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!file_exists($resource)) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        $messages = require($resource);

        $catalogue = parent::load($messages, $locale, $domain);
        $catalogue->addResource(new FileResource($resource));

        return $catalogue;
    }
}
PK._�\�i�3"
"
;pear/Symfony/Component/Translation/Loader/CsvFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\FileResource;

/**
 * CsvFileLoader loads translations from CSV files.
 *
 * @author Saša Stamenković <umpirsky@gmail.com>
 *
 * @api
 */
class CsvFileLoader extends ArrayLoader implements LoaderInterface
{
    private $delimiter = ';';
    private $enclosure = '"';
    private $escape    = '\\';

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource)) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!file_exists($resource)) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        $messages = array();

        try {
            $file = new \SplFileObject($resource, 'rb');
        } catch (\RuntimeException $e) {
            throw new NotFoundResourceException(sprintf('Error opening file "%s".', $resource), 0, $e);
        }

        $file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY);
        $file->setCsvControl($this->delimiter, $this->enclosure, $this->escape);

        foreach ($file as $data) {
            if (substr($data[0], 0, 1) === '#') {
                continue;
            }

            if (!isset($data[1])) {
                continue;
            }

            if (count($data) == 2) {
                $messages[$data[0]] = $data[1];
            } else {
                 continue;
            }
        }

        $catalogue = parent::load($messages, $locale, $domain);
        $catalogue->addResource(new FileResource($resource));

        return $catalogue;
    }

    /**
     * Sets the delimiter, enclosure, and escape character for CSV.
     *
     * @param string $delimiter delimiter character
     * @param string $enclosure enclosure character
     * @param string $escape    escape character
     */
    public function setCsvControl($delimiter = ';', $enclosure = '"', $escape = '\\')
    {
        $this->delimiter = $delimiter;
        $this->enclosure = $enclosure;
        $this->escape    = $escape;
    }
}
PK._�\:����<pear/Symfony/Component/Translation/Loader/YamlFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Yaml\Parser as YamlParser;
use Symfony\Component\Yaml\Exception\ParseException;

/**
 * YamlFileLoader loads translations from Yaml files.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class YamlFileLoader extends ArrayLoader implements LoaderInterface
{
    private $yamlParser;

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource)) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!file_exists($resource)) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        if (null === $this->yamlParser) {
            $this->yamlParser = new YamlParser();
        }

        try {
            $messages = $this->yamlParser->parse(file_get_contents($resource));
        } catch (ParseException $e) {
            throw new InvalidResourceException('Error parsing YAML.', 0, $e);
        }

        // empty file
        if (null === $messages) {
            $messages = array();
        }

        // not an array
        if (!is_array($messages)) {
            throw new InvalidResourceException(sprintf('The file "%s" must contain a YAML array.', $resource));
        }

        $catalogue = parent::load($messages, $locale, $domain);
        $catalogue->addResource(new FileResource($resource));

        return $catalogue;
    }
}
PK/_�\�*���:pear/Symfony/Component/Translation/Loader/PoFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\FileResource;

/**
 * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
 * @copyright Copyright (c) 2012, Clemens Tolboom
 */
class PoFileLoader extends ArrayLoader implements LoaderInterface
{
    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource)) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!file_exists($resource)) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        $messages = $this->parse($resource);

        // empty file
        if (null === $messages) {
            $messages = array();
        }

        // not an array
        if (!is_array($messages)) {
            throw new InvalidResourceException(sprintf('The file "%s" must contain a valid po file.', $resource));
        }

        $catalogue = parent::load($messages, $locale, $domain);
        $catalogue->addResource(new FileResource($resource));

        return $catalogue;
    }

    /**
     * Parses portable object (PO) format.
     *
     * From http://www.gnu.org/software/gettext/manual/gettext.html#PO-Files
     * we should be able to parse files having:
     *
     * white-space
     * #  translator-comments
     * #. extracted-comments
     * #: reference...
     * #, flag...
     * #| msgid previous-untranslated-string
     * msgid untranslated-string
     * msgstr translated-string
     *
     * extra or different lines are:
     *
     * #| msgctxt previous-context
     * #| msgid previous-untranslated-string
     * msgctxt context
     *
     * #| msgid previous-untranslated-string-singular
     * #| msgid_plural previous-untranslated-string-plural
     * msgid untranslated-string-singular
     * msgid_plural untranslated-string-plural
     * msgstr[0] translated-string-case-0
     * ...
     * msgstr[N] translated-string-case-n
     *
     * The definition states:
     * - white-space and comments are optional.
     * - msgid "" that an empty singleline defines a header.
     *
     * This parser sacrifices some features of the reference implementation the
     * differences to that implementation are as follows.
     * - No support for comments spanning multiple lines.
     * - Translator and extracted comments are treated as being the same type.
     * - Message IDs are allowed to have other encodings as just US-ASCII.
     *
     * Items with an empty id are ignored.
     *
     * @param resource $resource
     *
     * @return array
     */
    private function parse($resource)
    {
        $stream = fopen($resource, 'r');

        $defaults = array(
            'ids' => array(),
            'translated' => null,
        );

        $messages = array();
        $item = $defaults;

        while ($line = fgets($stream)) {
            $line = trim($line);

            if ($line === '') {
                // Whitespace indicated current item is done
                $this->addMessage($messages, $item);
                $item = $defaults;
            } elseif (substr($line, 0, 7) === 'msgid "') {
                // We start a new msg so save previous
                // TODO: this fails when comments or contexts are added
                $this->addMessage($messages, $item);
                $item = $defaults;
                $item['ids']['singular'] = substr($line, 7, -1);
            } elseif (substr($line, 0, 8) === 'msgstr "') {
                $item['translated'] = substr($line, 8, -1);
            } elseif ($line[0] === '"') {
                $continues = isset($item['translated']) ? 'translated' : 'ids';

                if (is_array($item[$continues])) {
                    end($item[$continues]);
                    $item[$continues][key($item[$continues])] .= substr($line, 1, -1);
                } else {
                    $item[$continues] .= substr($line, 1, -1);
                }
            } elseif (substr($line, 0, 14) === 'msgid_plural "') {
                $item['ids']['plural'] = substr($line, 14, -1);
            } elseif (substr($line, 0, 7) === 'msgstr[') {
                $size = strpos($line, ']');
                $item['translated'][(integer) substr($line, 7, 1)] = substr($line, $size + 3, -1);
            }

        }
        // save last item
        $this->addMessage($messages, $item);
        fclose($stream);

        return $messages;
    }

    /**
     * Save a translation item to the messages.
     *
     * A .po file could contain by error missing plural indexes. We need to
     * fix these before saving them.
     *
     * @param array $messages
     * @param array $item
     */
    private function addMessage(array &$messages, array $item)
    {
        if (is_array($item['translated'])) {
            $messages[$item['ids']['singular']] = stripslashes($item['translated'][0]);
            if (isset($item['ids']['plural'])) {
                $plurals = $item['translated'];
                // PO are by definition indexed so sort by index.
                ksort($plurals);
                // Make sure every index is filled.
                end($plurals);
                $count = key($plurals);
                // Fill missing spots with '-'.
                $empties = array_fill(0, $count+1, '-');
                $plurals += $empties;
                ksort($plurals);
                $messages[$item['ids']['plural']] = stripcslashes(implode('|', $plurals));
            }
        } elseif (!empty($item['ids']['singular'])) {
              $messages[$item['ids']['singular']] = stripslashes($item['translated']);
        }
    }
}
PK/_�\_��BB=pear/Symfony/Component/Translation/Loader/XliffFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Config\Util\XmlUtils;
use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\FileResource;

/**
 * XliffFileLoader loads translations from XLIFF files.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class XliffFileLoader implements LoaderInterface
{
    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource)) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!file_exists($resource)) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        list($xml, $encoding) = $this->parseFile($resource);
        $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:1.2');

        $catalogue = new MessageCatalogue($locale);
        foreach ($xml->xpath('//xliff:trans-unit') as $translation) {
            $attributes = $translation->attributes();

            if (!(isset($attributes['resname']) || isset($translation->source)) || !isset($translation->target)) {
                continue;
            }

            $source = isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source;
            $target = (string) $translation->target;

            // If the xlf file has another encoding specified, try to convert it because
            // simple_xml will always return utf-8 encoded values
            if ('UTF-8' !== $encoding && !empty($encoding)) {
                if (function_exists('mb_convert_encoding')) {
                    $target = mb_convert_encoding($target, $encoding, 'UTF-8');
                } elseif (function_exists('iconv')) {
                    $target = iconv('UTF-8', $encoding, $target);
                } else {
                    throw new \RuntimeException('No suitable convert encoding function (use UTF-8 as your encoding or install the iconv or mbstring extension).');
                }
            }

            $catalogue->set((string) $source, $target, $domain);
        }
        $catalogue->addResource(new FileResource($resource));

        return $catalogue;
    }

    /**
     * Validates and parses the given file into a SimpleXMLElement
     *
     * @param string $file
     *
     * @throws \RuntimeException
     *
     * @return \SimpleXMLElement
     *
     * @throws InvalidResourceException
     */
    private function parseFile($file)
    {
        try {
            $dom = XmlUtils::loadFile($file);
        } catch (\InvalidArgumentException $e) {
            throw new InvalidResourceException(sprintf('Unable to load "%s": %s', $file, $e->getMessage()), $e->getCode(), $e);
        }

        $internalErrors = libxml_use_internal_errors(true);

        $location = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd';
        $parts = explode('/', $location);
        if (0 === stripos($location, 'phar://')) {
            $tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
            if ($tmpfile) {
                copy($location, $tmpfile);
                $parts = explode('/', str_replace('\\', '/', $tmpfile));
            }
        }
        $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
        $location = 'file:///'.$drive.implode('/', array_map('rawurlencode', $parts));

        $source = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-1.2-strict.xsd');
        $source = str_replace('http://www.w3.org/2001/xml.xsd', $location, $source);

        if (!@$dom->schemaValidateSource($source)) {
            throw new InvalidResourceException(implode("\n", $this->getXmlErrors($internalErrors)));
        }

        $dom->normalizeDocument();

        libxml_use_internal_errors($internalErrors);

        return array(simplexml_import_dom($dom), strtoupper($dom->encoding));
    }

    /**
     * Returns the XML errors of the internal XML parser
     *
     * @param Boolean $internalErrors
     *
     * @return array An array of errors
     */
    private function getXmlErrors($internalErrors)
    {
        $errors = array();
        foreach (libxml_get_errors() as $error) {
            $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)',
                LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
                $error->code,
                trim($error->message),
                $error->file ? $error->file : 'n/a',
                $error->line,
                $error->column
            );
        }

        libxml_clear_errors();
        libxml_use_internal_errors($internalErrors);

        return $errors;
    }
}
PK/_�\CS�z
z
>pear/Symfony/Component/Translation/Loader/IcuResFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\DirectoryResource;

/**
 * IcuResFileLoader loads translations from a resource bundle.
 *
 * @author stealth35
 */
class IcuResFileLoader implements LoaderInterface
{
    /**
     * {@inheritdoc}
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource)) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!is_dir($resource)) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        $rb = new \ResourceBundle($locale, $resource);

        if (!$rb) {
            throw new InvalidResourceException(sprintf('Cannot load resource "%s"', $resource));
        } elseif (intl_is_failure($rb->getErrorCode())) {
            throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode());
        }

        $messages = $this->flatten($rb);
        $catalogue = new MessageCatalogue($locale);
        $catalogue->add($messages, $domain);
        $catalogue->addResource(new DirectoryResource($resource));

        return $catalogue;
    }

    /**
     * Flattens an ResourceBundle
     *
     * The scheme used is:
     *   key { key2 { key3 { "value" } } }
     * Becomes:
     *   'key.key2.key3' => 'value'
     *
     * This function takes an array by reference and will modify it
     *
     * @param \ResourceBundle $rb       the ResourceBundle that will be flattened
     * @param array           $messages used internally for recursive calls
     * @param string          $path     current path being parsed, used internally for recursive calls
     *
     * @return array the flattened ResourceBundle
     */
    protected function flatten(\ResourceBundle $rb, array &$messages = array(), $path = null)
    {
        foreach ($rb as $key => $value) {
            $nodePath = $path ? $path.'.'.$key : $key;
            if ($value instanceof \ResourceBundle) {
                $this->flatten($value, $messages, $nodePath);
            } else {
                $messages[$nodePath] = $value;
            }
        }

        return $messages;
    }
}
PK0_�\��v���:pear/Symfony/Component/Translation/Loader/MoFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\FileResource;

/**
 * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
 */
class MoFileLoader extends ArrayLoader implements LoaderInterface
{
    /**
     * Magic used for validating the format of a MO file as well as
     * detecting if the machine used to create that file was little endian.
     *
     * @var float
     */
    const MO_LITTLE_ENDIAN_MAGIC = 0x950412de;

    /**
     * Magic used for validating the format of a MO file as well as
     * detecting if the machine used to create that file was big endian.
     *
     * @var float
     */
    const MO_BIG_ENDIAN_MAGIC = 0xde120495;

    /**
     * The size of the header of a MO file in bytes.
     *
     * @var integer Number of bytes.
     */
    const MO_HEADER_SIZE = 28;

    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource)) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!file_exists($resource)) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        $messages = $this->parse($resource);

        // empty file
        if (null === $messages) {
            $messages = array();
        }

        // not an array
        if (!is_array($messages)) {
            throw new InvalidResourceException(sprintf('The file "%s" must contain a valid mo file.', $resource));
        }

        $catalogue = parent::load($messages, $locale, $domain);
        $catalogue->addResource(new FileResource($resource));

        return $catalogue;
    }

    /**
     * Parses machine object (MO) format, independent of the machine's endian it
     * was created on. Both 32bit and 64bit systems are supported.
     *
     * @param resource $resource
     *
     * @return array
     * @throws InvalidResourceException If stream content has an invalid format.
     */
    private function parse($resource)
    {
        $stream = fopen($resource, 'r');

        $stat = fstat($stream);

        if ($stat['size'] < self::MO_HEADER_SIZE) {
            throw new InvalidResourceException("MO stream content has an invalid format.");
        }
        $magic = unpack('V1', fread($stream, 4));
        $magic = hexdec(substr(dechex(current($magic)), -8));

        if ($magic == self::MO_LITTLE_ENDIAN_MAGIC) {
            $isBigEndian = false;
        } elseif ($magic == self::MO_BIG_ENDIAN_MAGIC) {
            $isBigEndian = true;
        } else {
            throw new InvalidResourceException("MO stream content has an invalid format.");
        }

        // formatRevision
        $this->readLong($stream, $isBigEndian);
        $count = $this->readLong($stream, $isBigEndian);
        $offsetId = $this->readLong($stream, $isBigEndian);
        $offsetTranslated = $this->readLong($stream, $isBigEndian);
        // sizeHashes
        $this->readLong($stream, $isBigEndian);
        // offsetHashes
        $this->readLong($stream, $isBigEndian);

        $messages = array();

        for ($i = 0; $i < $count; $i++) {
            $singularId = $pluralId = null;
            $translated = null;

            fseek($stream, $offsetId + $i * 8);

            $length = $this->readLong($stream, $isBigEndian);
            $offset = $this->readLong($stream, $isBigEndian);

            if ($length < 1) {
                continue;
            }

            fseek($stream, $offset);
            $singularId = fread($stream, $length);

            if (strpos($singularId, "\000") !== false) {
                list($singularId, $pluralId) = explode("\000", $singularId);
            }

            fseek($stream, $offsetTranslated + $i * 8);
            $length = $this->readLong($stream, $isBigEndian);
            $offset = $this->readLong($stream, $isBigEndian);

            fseek($stream, $offset);
            $translated = fread($stream, $length);

            if (strpos($translated, "\000") !== false) {
                $translated = explode("\000", $translated);
            }

            $ids = array('singular' => $singularId, 'plural' => $pluralId);
            $item = compact('ids', 'translated');

            if (is_array($item['translated'])) {
                $messages[$item['ids']['singular']] = stripcslashes($item['translated'][0]);
                if (isset($item['ids']['plural'])) {
                    $plurals = array();
                    foreach ($item['translated'] as $plural => $translated) {
                        $plurals[] = sprintf('{%d} %s', $plural, $translated);
                    }
                    $messages[$item['ids']['plural']] = stripcslashes(implode('|', $plurals));
                }
            } elseif (!empty($item['ids']['singular'])) {
                $messages[$item['ids']['singular']] = stripcslashes($item['translated']);
            }
        }

        fclose($stream);

        return array_filter($messages);
    }

    /**
     * Reads an unsigned long from stream respecting endianess.
     *
     * @param  resource $stream
     * @param  boolean  $isBigEndian
     * @return integer
     */
    private function readLong($stream, $isBigEndian)
    {
        $result = unpack($isBigEndian ? 'N1' : 'V1', fread($stream, 4));
        $result = current($result);

        return (integer) substr($result, -8);
    }
}
PK0_�\l#�tt=pear/Symfony/Component/Translation/Loader/LoaderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;

/**
 * LoaderInterface is the interface implemented by all translation loaders.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface LoaderInterface
{
    /**
     * Loads a locale.
     *
     * @param mixed  $resource A resource
     * @param string $locale   A locale
     * @param string $domain   The domain
     *
     * @return MessageCatalogue A MessageCatalogue instance
     *
     * @api
     *
     * @throws NotFoundResourceException when the resource cannot be found
     * @throws InvalidResourceException  when the resource cannot be loaded
     */
    public function load($resource, $locale, $domain = 'messages');
}
PK1_�\�T�>pear/Symfony/Component/Translation/Loader/IcuDatFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\FileResource;

/**
 * IcuResFileLoader loads translations from a resource bundle.
 *
 * @author stealth35
 */
class IcuDatFileLoader extends IcuResFileLoader
{
    /**
     * {@inheritdoc}
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource.'.dat')) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!file_exists($resource.'.dat')) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        $rb = new \ResourceBundle($locale, $resource);

        if (!$rb) {
            throw new InvalidResourceException(sprintf('Cannot load resource "%s"', $resource));
        } elseif (intl_is_failure($rb->getErrorCode())) {
            throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode());
        }

        $messages = $this->flatten($rb);
        $catalogue = new MessageCatalogue($locale);
        $catalogue->add($messages, $domain);
        $catalogue->addResource(new FileResource($resource.'.dat'));

        return $catalogue;
    }
}
PK1_�\R����9pear/Symfony/Component/Translation/Loader/ArrayLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * ArrayLoader loads translations from a PHP array.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ArrayLoader implements LoaderInterface
{
    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        $this->flatten($resource);
        $catalogue = new MessageCatalogue($locale);
        $catalogue->add($resource, $domain);

        return $catalogue;
    }

    /**
     * Flattens an nested array of translations
     *
     * The scheme used is:
     *   'key' => array('key2' => array('key3' => 'value'))
     * Becomes:
     *   'key.key2.key3' => 'value'
     *
     * This function takes an array by reference and will modify it
     *
     * @param array  &$messages The array that will be flattened
     * @param array  $subnode Current subnode being parsed, used internally for recursive calls
     * @param string $path    Current path being parsed, used internally for recursive calls
     */
    private function flatten(array &$messages, array $subnode = null, $path = null)
    {
        if (null === $subnode) {
            $subnode =& $messages;
        }
        foreach ($subnode as $key => $value) {
            if (is_array($value)) {
                $nodePath = $path ? $path.'.'.$key : $key;
                $this->flatten($messages, $value, $nodePath);
                if (null === $path) {
                    unset($messages[$key]);
                }
            } elseif (null !== $path) {
                $messages[$path.'.'.$key] = $value;
            }
        }
    }
}
PK1_�\N@���;pear/Symfony/Component/Translation/Loader/IniFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\FileResource;

/**
 * IniFileLoader loads translations from an ini file.
 *
 * @author stealth35
 */
class IniFileLoader extends ArrayLoader implements LoaderInterface
{
    /**
     * {@inheritdoc}
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource)) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!file_exists($resource)) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        $messages = parse_ini_file($resource, true);

        $catalogue = parent::load($messages, $locale, $domain);
        $catalogue->addResource(new FileResource($resource));

        return $catalogue;
    }
}
PK2_�\:�	Z�"�"Gpear/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xml.xsdnu�[���<?xml version='1.0'?>
<?xml-stylesheet href="../2008/09/xsd.xsl" type="text/xsl"?>
<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns   ="http://www.w3.org/1999/xhtml"
  xml:lang="en">

 <xs:annotation>
  <xs:documentation>
   <div>
    <h1>About the XML namespace</h1>

    <div class="bodytext">
     <p>

      This schema document describes the XML namespace, in a form
      suitable for import by other schema documents.
     </p>
     <p>
      See <a href="http://www.w3.org/XML/1998/namespace.html">
      http://www.w3.org/XML/1998/namespace.html</a> and
      <a href="http://www.w3.org/TR/REC-xml">
      http://www.w3.org/TR/REC-xml</a> for information 
      about this namespace.
     </p>

     <p>
      Note that local names in this namespace are intended to be
      defined only by the World Wide Web Consortium or its subgroups.
      The names currently defined in this namespace are listed below.
      They should not be used with conflicting semantics by any Working
      Group, specification, or document instance.
     </p>
     <p>   
      See further below in this document for more information about <a
      href="#usage">how to refer to this schema document from your own
      XSD schema documents</a> and about <a href="#nsversioning">the
      namespace-versioning policy governing this schema document</a>.
     </p>
    </div>
   </div>

  </xs:documentation>
 </xs:annotation>

 <xs:attribute name="lang">
  <xs:annotation>
   <xs:documentation>
    <div>
     
      <h3>lang (as an attribute name)</h3>
      <p>

       denotes an attribute whose value
       is a language code for the natural language of the content of
       any element; its value is inherited.  This name is reserved
       by virtue of its definition in the XML specification.</p>
     
    </div>
    <div>
     <h4>Notes</h4>
     <p>
      Attempting to install the relevant ISO 2- and 3-letter
      codes as the enumerated possible values is probably never
      going to be a realistic possibility.  
     </p>
     <p>

      See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
       http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
      and the IANA language subtag registry at
      <a href="http://www.iana.org/assignments/language-subtag-registry">
       http://www.iana.org/assignments/language-subtag-registry</a>
      for further information.
     </p>
     <p>

      The union allows for the 'un-declaration' of xml:lang with
      the empty string.
     </p>
    </div>
   </xs:documentation>
  </xs:annotation>
  <xs:simpleType>
   <xs:union memberTypes="xs:language">
    <xs:simpleType>    
     <xs:restriction base="xs:string">
      <xs:enumeration value=""/>

     </xs:restriction>
    </xs:simpleType>
   </xs:union>
  </xs:simpleType>
 </xs:attribute>

 <xs:attribute name="space">
  <xs:annotation>
   <xs:documentation>

    <div>
     
      <h3>space (as an attribute name)</h3>
      <p>
       denotes an attribute whose
       value is a keyword indicating what whitespace processing
       discipline is intended for the content of the element; its
       value is inherited.  This name is reserved by virtue of its
       definition in the XML specification.</p>
     
    </div>
   </xs:documentation>
  </xs:annotation>
  <xs:simpleType>

   <xs:restriction base="xs:NCName">
    <xs:enumeration value="default"/>
    <xs:enumeration value="preserve"/>
   </xs:restriction>
  </xs:simpleType>
 </xs:attribute>
 
 <xs:attribute name="base" type="xs:anyURI"> <xs:annotation>
   <xs:documentation>

    <div>
     
      <h3>base (as an attribute name)</h3>
      <p>
       denotes an attribute whose value
       provides a URI to be used as the base for interpreting any
       relative URIs in the scope of the element on which it
       appears; its value is inherited.  This name is reserved
       by virtue of its definition in the XML Base specification.</p>
     
     <p>
      See <a
      href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
      for information about this attribute.
     </p>

    </div>
   </xs:documentation>
  </xs:annotation>
 </xs:attribute>
 
 <xs:attribute name="id" type="xs:ID">
  <xs:annotation>
   <xs:documentation>
    <div>
     
      <h3>id (as an attribute name)</h3> 
      <p>

       denotes an attribute whose value
       should be interpreted as if declared to be of type ID.
       This name is reserved by virtue of its definition in the
       xml:id specification.</p>
     
     <p>
      See <a
      href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a>
      for information about this attribute.
     </p>
    </div>
   </xs:documentation>
  </xs:annotation>

 </xs:attribute>

 <xs:attributeGroup name="specialAttrs">
  <xs:attribute ref="xml:base"/>
  <xs:attribute ref="xml:lang"/>
  <xs:attribute ref="xml:space"/>
  <xs:attribute ref="xml:id"/>
 </xs:attributeGroup>

 <xs:annotation>

  <xs:documentation>
   <div>
   
    <h3>Father (in any context at all)</h3> 

    <div class="bodytext">
     <p>
      denotes Jon Bosak, the chair of 
      the original XML Working Group.  This name is reserved by 
      the following decision of the W3C XML Plenary and 
      XML Coordination groups:
     </p>
     <blockquote>
       <p>

	In appreciation for his vision, leadership and
	dedication the W3C XML Plenary on this 10th day of
	February, 2000, reserves for Jon Bosak in perpetuity
	the XML name "xml:Father".
       </p>
     </blockquote>
    </div>
   </div>
  </xs:documentation>
 </xs:annotation>

 <xs:annotation>
  <xs:documentation>

   <div xml:id="usage" id="usage">
    <h2><a name="usage">About this schema document</a></h2>

    <div class="bodytext">
     <p>
      This schema defines attributes and an attribute group suitable
      for use by schemas wishing to allow <code>xml:base</code>,
      <code>xml:lang</code>, <code>xml:space</code> or
      <code>xml:id</code> attributes on elements they define.
     </p>

     <p>
      To enable this, such a schema must import this schema for
      the XML namespace, e.g. as follows:
     </p>
     <pre>
          &lt;schema.. .>
          .. .
           &lt;import namespace="http://www.w3.org/XML/1998/namespace"
                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
     </pre>
     <p>
      or
     </p>
     <pre>

           &lt;import namespace="http://www.w3.org/XML/1998/namespace"
                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
     </pre>
     <p>
      Subsequently, qualified reference to any of the attributes or the
      group defined below will have the desired effect, e.g.
     </p>
     <pre>
          &lt;type.. .>
          .. .
           &lt;attributeGroup ref="xml:specialAttrs"/>
     </pre>
     <p>
      will define a type which will schema-validate an instance element
      with any of those attributes.
     </p>

    </div>
   </div>
  </xs:documentation>
 </xs:annotation>

 <xs:annotation>
  <xs:documentation>
   <div id="nsversioning" xml:id="nsversioning">
    <h2><a name="nsversioning">Versioning policy for this schema document</a></h2>

    <div class="bodytext">
     <p>
      In keeping with the XML Schema WG's standard versioning
      policy, this schema document will persist at
      <a href="http://www.w3.org/2009/01/xml.xsd">
       http://www.w3.org/2009/01/xml.xsd</a>.
     </p>
     <p>
      At the date of issue it can also be found at
      <a href="http://www.w3.org/2001/xml.xsd">
       http://www.w3.org/2001/xml.xsd</a>.
     </p>

     <p>
      The schema document at that URI may however change in the future,
      in order to remain compatible with the latest version of XML
      Schema itself, or with the XML namespace itself.  In other words,
      if the XML Schema or XML namespaces change, the version of this
      document at <a href="http://www.w3.org/2001/xml.xsd">
       http://www.w3.org/2001/xml.xsd 
      </a> 
      will change accordingly; the version at 
      <a href="http://www.w3.org/2009/01/xml.xsd">
       http://www.w3.org/2009/01/xml.xsd 
      </a> 
      will not change.
     </p>
     <p>

      Previous dated (and unchanging) versions of this schema 
      document are at:
     </p>
     <ul>
      <li><a href="http://www.w3.org/2009/01/xml.xsd">
	http://www.w3.org/2009/01/xml.xsd</a></li>
      <li><a href="http://www.w3.org/2007/08/xml.xsd">
	http://www.w3.org/2007/08/xml.xsd</a></li>
      <li><a href="http://www.w3.org/2004/10/xml.xsd">

	http://www.w3.org/2004/10/xml.xsd</a></li>
      <li><a href="http://www.w3.org/2001/03/xml.xsd">
	http://www.w3.org/2001/03/xml.xsd</a></li>
     </ul>
    </div>
   </div>
  </xs:documentation>
 </xs:annotation>

</xs:schema>
PK2_�\�xO��Ypear/Symfony/Component/Translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsdnu�[���<?xml version="1.0" encoding="UTF-8"?>

<!--

May-19-2004:
- Changed the <choice> for ElemType_header, moving minOccurs="0" maxOccurs="unbounded" from its elements 
to <choice> itself.
- Added <choice> for ElemType_trans-unit to allow "any order" for <context-group>, <count-group>, <prop-group>, <note>, and
<alt-trans>.

Oct-2005
- updated version info to 1.2
- equiv-trans attribute to <trans-unit> element 
- merged-trans attribute for <group> element
- Add the <seg-source> element as optional in the <trans-unit> and <alt-trans> content models, at the same level as <source> 
- Create a new value "seg" for the mtype attribute of the <mrk> element
- Add mid as an optional attribute for the <alt-trans> element

Nov-14-2005
- Changed name attribute for <context-group> from required to optional
- Added extension point at <xliff>

Jan-9-2006
- Added alttranstype type attribute to <alt-trans>, and values

Jan-10-2006
- Corrected error with overwritten purposeValueList
- Corrected name="AttrType_Version",  attribute should have been "name"

-->
<xsd:schema xmlns:xlf="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:oasis:names:tc:xliff:document:1.2" xml:lang="en">
  <!-- Import for xml:lang and xml:space -->
  <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
  <!-- Attributes Lists -->
  <xsd:simpleType name="XTend">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="x-[^\s]+"/>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="context-typeValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'context-type'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="database">
        <xsd:annotation>
          <xsd:documentation>Indicates a database content.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="element">
        <xsd:annotation>
          <xsd:documentation>Indicates the content of an element within an XML document.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="elementtitle">
        <xsd:annotation>
          <xsd:documentation>Indicates the name of an element within an XML document.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="linenumber">
        <xsd:annotation>
          <xsd:documentation>Indicates the line number from the sourcefile (see context-type="sourcefile") where the &lt;source&gt; is found.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="numparams">
        <xsd:annotation>
          <xsd:documentation>Indicates a the number of parameters contained within the &lt;source&gt;.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="paramnotes">
        <xsd:annotation>
          <xsd:documentation>Indicates notes pertaining to the parameters in the &lt;source&gt;.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="record">
        <xsd:annotation>
          <xsd:documentation>Indicates the content of a record within a database.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="recordtitle">
        <xsd:annotation>
          <xsd:documentation>Indicates the name of a record within a database.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="sourcefile">
        <xsd:annotation>
          <xsd:documentation>Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original &lt;file&gt; attribute in that this sourcefile is one of many that make up that file.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="count-typeValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'count-type'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="num-usages">
        <xsd:annotation>
          <xsd:documentation>Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="repetition">
        <xsd:annotation>
          <xsd:documentation>Indicates the count units are translation units existing already in the same document.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="total">
        <xsd:annotation>
          <xsd:documentation>Indicates a total count.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="InlineDelimitersValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'ctype' when used other elements than &lt;ph&gt; or &lt;x&gt;.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="bold">
        <xsd:annotation>
          <xsd:documentation>Indicates a run of bolded text.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="italic">
        <xsd:annotation>
          <xsd:documentation>Indicates a run of text in italics.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="underlined">
        <xsd:annotation>
          <xsd:documentation>Indicates a run of underlined text.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="link">
        <xsd:annotation>
          <xsd:documentation>Indicates a run of hyper-text.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="InlinePlaceholdersValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'ctype' when used with &lt;ph&gt; or &lt;x&gt;.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="image">
        <xsd:annotation>
          <xsd:documentation>Indicates a inline image.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="pb">
        <xsd:annotation>
          <xsd:documentation>Indicates a page break.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="lb">
        <xsd:annotation>
          <xsd:documentation>Indicates a line break.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="mime-typeValueList">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="(text|multipart|message|application|image|audio|video|model)(/.+)*"/>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="datatypeValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'datatype'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="asp">
        <xsd:annotation>
          <xsd:documentation>Indicates Active Server Page data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="c">
        <xsd:annotation>
          <xsd:documentation>Indicates C source file data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="cdf">
        <xsd:annotation>
          <xsd:documentation>Indicates Channel Definition Format (CDF) data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="cfm">
        <xsd:annotation>
          <xsd:documentation>Indicates ColdFusion data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="cpp">
        <xsd:annotation>
          <xsd:documentation>Indicates C++ source file data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="csharp">
        <xsd:annotation>
          <xsd:documentation>Indicates C-Sharp data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="cstring">
        <xsd:annotation>
          <xsd:documentation>Indicates strings from C, ASM, and driver files data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="csv">
        <xsd:annotation>
          <xsd:documentation>Indicates comma-separated values data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="database">
        <xsd:annotation>
          <xsd:documentation>Indicates database data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="documentfooter">
        <xsd:annotation>
          <xsd:documentation>Indicates portions of document that follows data and contains metadata.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="documentheader">
        <xsd:annotation>
          <xsd:documentation>Indicates portions of document that precedes data and contains metadata.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="filedialog">
        <xsd:annotation>
          <xsd:documentation>Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="form">
        <xsd:annotation>
          <xsd:documentation>Indicates standard user input screen data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="html">
        <xsd:annotation>
          <xsd:documentation>Indicates HyperText Markup Language (HTML) data - document instance.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="htmlbody">
        <xsd:annotation>
          <xsd:documentation>Indicates content within an HTML document’s &lt;body&gt; element.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="ini">
        <xsd:annotation>
          <xsd:documentation>Indicates Windows INI file data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="interleaf">
        <xsd:annotation>
          <xsd:documentation>Indicates Interleaf data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="javaclass">
        <xsd:annotation>
          <xsd:documentation>Indicates Java source file data (extension '.java').</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="javapropertyresourcebundle">
        <xsd:annotation>
          <xsd:documentation>Indicates Java property resource bundle data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="javalistresourcebundle">
        <xsd:annotation>
          <xsd:documentation>Indicates Java list resource bundle data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="javascript">
        <xsd:annotation>
          <xsd:documentation>Indicates JavaScript source file data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="jscript">
        <xsd:annotation>
          <xsd:documentation>Indicates JScript source file data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="layout">
        <xsd:annotation>
          <xsd:documentation>Indicates information relating to formatting.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="lisp">
        <xsd:annotation>
          <xsd:documentation>Indicates LISP source file data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="margin">
        <xsd:annotation>
          <xsd:documentation>Indicates information relating to margin formats.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="menufile">
        <xsd:annotation>
          <xsd:documentation>Indicates a file containing menu.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="messagefile">
        <xsd:annotation>
          <xsd:documentation>Indicates numerically identified string table.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="mif">
        <xsd:annotation>
          <xsd:documentation>Indicates Maker Interchange Format (MIF) data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="mimetype">
        <xsd:annotation>
          <xsd:documentation>Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="mo">
        <xsd:annotation>
          <xsd:documentation>Indicates GNU Machine Object data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="msglib">
        <xsd:annotation>
          <xsd:documentation>Indicates Message Librarian strings created by Novell's Message Librarian Tool.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="pagefooter">
        <xsd:annotation>
          <xsd:documentation>Indicates information to be displayed at the bottom of each page of a document.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="pageheader">
        <xsd:annotation>
          <xsd:documentation>Indicates information to be displayed at the top of each page of a document.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="parameters">
        <xsd:annotation>
          <xsd:documentation>Indicates a list of property values (e.g., settings within INI files or preferences dialog).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="pascal">
        <xsd:annotation>
          <xsd:documentation>Indicates Pascal source file data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="php">
        <xsd:annotation>
          <xsd:documentation>Indicates Hypertext Preprocessor data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="plaintext">
        <xsd:annotation>
          <xsd:documentation>Indicates plain text file (no formatting other than, possibly, wrapping).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="po">
        <xsd:annotation>
          <xsd:documentation>Indicates GNU Portable Object file.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="report">
        <xsd:annotation>
          <xsd:documentation>Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="resources">
        <xsd:annotation>
          <xsd:documentation>Indicates Windows .NET binary resources.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="resx">
        <xsd:annotation>
          <xsd:documentation>Indicates Windows .NET Resources.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="rtf">
        <xsd:annotation>
          <xsd:documentation>Indicates Rich Text Format (RTF) data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="sgml">
        <xsd:annotation>
          <xsd:documentation>Indicates Standard Generalized Markup Language (SGML) data - document instance.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="sgmldtd">
        <xsd:annotation>
          <xsd:documentation>Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="svg">
        <xsd:annotation>
          <xsd:documentation>Indicates Scalable Vector Graphic (SVG) data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="vbscript">
        <xsd:annotation>
          <xsd:documentation>Indicates VisualBasic Script source file.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="warning">
        <xsd:annotation>
          <xsd:documentation>Indicates warning message.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="winres">
        <xsd:annotation>
          <xsd:documentation>Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="xhtml">
        <xsd:annotation>
          <xsd:documentation>Indicates Extensible HyperText Markup Language (XHTML) data - document instance.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="xml">
        <xsd:annotation>
          <xsd:documentation>Indicates Extensible Markup Language (XML) data - document instance.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="xmldtd">
        <xsd:annotation>
          <xsd:documentation>Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="xsl">
        <xsd:annotation>
          <xsd:documentation>Indicates Extensible Stylesheet Language (XSL) data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="xul">
        <xsd:annotation>
          <xsd:documentation>Indicates XUL elements.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="mtypeValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'mtype'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="abbrev">
        <xsd:annotation>
          <xsd:documentation>Indicates the marked text is an abbreviation.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="abbreviated-form">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="abbreviation">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective').</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="acronym">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging').</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="appellation">
        <xsd:annotation>
          <xsd:documentation>ISO-12620: A proper-name term, such as the name of an agency or other proper entity.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="collocation">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="common-name">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="datetime">
        <xsd:annotation>
          <xsd:documentation>Indicates the marked text is a date and/or time.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="equation">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="expanded-form">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="formula">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="head-term">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="initialism">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy').</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="international-scientific-term">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="internationalism">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="logical-expression">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="materials-management-unit">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.17: A unit to track object.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="name">
        <xsd:annotation>
          <xsd:documentation>Indicates the marked text is a name.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="near-synonym">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="part-number">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="phrase">
        <xsd:annotation>
          <xsd:documentation>Indicates the marked text is a phrase.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="phraseological-unit">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="protected">
        <xsd:annotation>
          <xsd:documentation>Indicates the marked text should not be translated.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="romanized-form">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="seg">
        <xsd:annotation>
          <xsd:documentation>Indicates that the marked text represents a segment.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="set-phrase">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.18.2: A fixed, lexicalized phrase.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="short-form">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs').</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="sku">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="standard-text">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.19: A fixed chunk of recurring text.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="symbol">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="synonym">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="synonymous-phrase">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="term">
        <xsd:annotation>
          <xsd:documentation>Indicates the marked text is a term.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="transcribed-form">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="transliterated-form">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="truncated-term">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza').</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="variant">
        <xsd:annotation>
          <xsd:documentation>ISO-12620 2.1.9: One of the alternate forms of a term.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="restypeValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'restype'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="auto3state">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC AUTO3STATE control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="autocheckbox">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC AUTOCHECKBOX control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="autoradiobutton">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC AUTORADIOBUTTON control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="bedit">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC BEDIT control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="bitmap">
        <xsd:annotation>
          <xsd:documentation>Indicates a bitmap, for example a BITMAP resource in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="button">
        <xsd:annotation>
          <xsd:documentation>Indicates a button object, for example a BUTTON control Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="caption">
        <xsd:annotation>
          <xsd:documentation>Indicates a caption, such as the caption of a dialog box.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="cell">
        <xsd:annotation>
          <xsd:documentation>Indicates the cell in a table, for example the content of the &lt;td&gt; element in HTML.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="checkbox">
        <xsd:annotation>
          <xsd:documentation>Indicates check box object, for example a CHECKBOX control in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="checkboxmenuitem">
        <xsd:annotation>
          <xsd:documentation>Indicates a menu item with an associated checkbox.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="checkedlistbox">
        <xsd:annotation>
          <xsd:documentation>Indicates a list box, but with a check-box for each item.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="colorchooser">
        <xsd:annotation>
          <xsd:documentation>Indicates a color selection dialog.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="combobox">
        <xsd:annotation>
          <xsd:documentation>Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="comboboxexitem">
        <xsd:annotation>
          <xsd:documentation>Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="comboboxitem">
        <xsd:annotation>
          <xsd:documentation>Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="component">
        <xsd:annotation>
          <xsd:documentation>Indicates a UI base class element that cannot be represented by any other element.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="contextmenu">
        <xsd:annotation>
          <xsd:documentation>Indicates a context menu.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="ctext">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC CTEXT control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="cursor">
        <xsd:annotation>
          <xsd:documentation>Indicates a cursor, for example a CURSOR resource in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="datetimepicker">
        <xsd:annotation>
          <xsd:documentation>Indicates a date/time picker.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="defpushbutton">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC DEFPUSHBUTTON control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="dialog">
        <xsd:annotation>
          <xsd:documentation>Indicates a dialog box.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="dlginit">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC DLGINIT resource block.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="edit">
        <xsd:annotation>
          <xsd:documentation>Indicates an edit box object, for example an EDIT control in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="file">
        <xsd:annotation>
          <xsd:documentation>Indicates a filename.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="filechooser">
        <xsd:annotation>
          <xsd:documentation>Indicates a file dialog.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="fn">
        <xsd:annotation>
          <xsd:documentation>Indicates a footnote.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="font">
        <xsd:annotation>
          <xsd:documentation>Indicates a font name.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="footer">
        <xsd:annotation>
          <xsd:documentation>Indicates a footer.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="frame">
        <xsd:annotation>
          <xsd:documentation>Indicates a frame object.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="grid">
        <xsd:annotation>
          <xsd:documentation>Indicates a XUL grid element.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="groupbox">
        <xsd:annotation>
          <xsd:documentation>Indicates a groupbox object, for example a GROUPBOX control in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="header">
        <xsd:annotation>
          <xsd:documentation>Indicates a header item.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="heading">
        <xsd:annotation>
          <xsd:documentation>Indicates a heading, such has the content of &lt;h1&gt;, &lt;h2&gt;, etc. in HTML.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="hedit">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC HEDIT control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="hscrollbar">
        <xsd:annotation>
          <xsd:documentation>Indicates a horizontal scrollbar.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="icon">
        <xsd:annotation>
          <xsd:documentation>Indicates an icon, for example an ICON resource in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="iedit">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC IEDIT control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="keywords">
        <xsd:annotation>
          <xsd:documentation>Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="label">
        <xsd:annotation>
          <xsd:documentation>Indicates a label object.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="linklabel">
        <xsd:annotation>
          <xsd:documentation>Indicates a label that is also a HTML link (not necessarily a URL).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="list">
        <xsd:annotation>
          <xsd:documentation>Indicates a list (a group of list-items, for example an &lt;ol&gt; or &lt;ul&gt; element in HTML).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="listbox">
        <xsd:annotation>
          <xsd:documentation>Indicates a listbox object, for example an LISTBOX control in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="listitem">
        <xsd:annotation>
          <xsd:documentation>Indicates an list item (an entry in a list).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="ltext">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC LTEXT control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="menu">
        <xsd:annotation>
          <xsd:documentation>Indicates a menu (a group of menu-items).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="menubar">
        <xsd:annotation>
          <xsd:documentation>Indicates a toolbar containing one or more tope level menus.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="menuitem">
        <xsd:annotation>
          <xsd:documentation>Indicates a menu item (an entry in a menu).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="menuseparator">
        <xsd:annotation>
          <xsd:documentation>Indicates a XUL menuseparator element.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="message">
        <xsd:annotation>
          <xsd:documentation>Indicates a message, for example an entry in a MESSAGETABLE resource in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="monthcalendar">
        <xsd:annotation>
          <xsd:documentation>Indicates a calendar control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="numericupdown">
        <xsd:annotation>
          <xsd:documentation>Indicates an edit box beside a spin control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="panel">
        <xsd:annotation>
          <xsd:documentation>Indicates a catch all for rectangular areas.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="popupmenu">
        <xsd:annotation>
          <xsd:documentation>Indicates a standalone menu not necessarily associated with a menubar.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="pushbox">
        <xsd:annotation>
          <xsd:documentation>Indicates a pushbox object, for example a PUSHBOX control in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="pushbutton">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC PUSHBUTTON control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="radio">
        <xsd:annotation>
          <xsd:documentation>Indicates a radio button object.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="radiobuttonmenuitem">
        <xsd:annotation>
          <xsd:documentation>Indicates a menuitem with associated radio button.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="rcdata">
        <xsd:annotation>
          <xsd:documentation>Indicates raw data resources for an application.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="row">
        <xsd:annotation>
          <xsd:documentation>Indicates a row in a table.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="rtext">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC RTEXT control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="scrollpane">
        <xsd:annotation>
          <xsd:documentation>Indicates a user navigable container used to show a portion of a document.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="separator">
        <xsd:annotation>
          <xsd:documentation>Indicates a generic divider object (e.g. menu group separator).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="shortcut">
        <xsd:annotation>
          <xsd:documentation>Windows accelerators, shortcuts in resource or property files.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="spinner">
        <xsd:annotation>
          <xsd:documentation>Indicates a UI control to indicate process activity but not progress.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="splitter">
        <xsd:annotation>
          <xsd:documentation>Indicates a splitter bar.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="state3">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC STATE3 control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="statusbar">
        <xsd:annotation>
          <xsd:documentation>Indicates a window for providing feedback to the users, like 'read-only', etc.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="string">
        <xsd:annotation>
          <xsd:documentation>Indicates a string, for example an entry in a STRINGTABLE resource in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="tabcontrol">
        <xsd:annotation>
          <xsd:documentation>Indicates a layers of controls with a tab to select layers.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="table">
        <xsd:annotation>
          <xsd:documentation>Indicates a display and edits regular two-dimensional tables of cells.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="textbox">
        <xsd:annotation>
          <xsd:documentation>Indicates a XUL textbox element.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="togglebutton">
        <xsd:annotation>
          <xsd:documentation>Indicates a UI button that can be toggled to on or off state.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="toolbar">
        <xsd:annotation>
          <xsd:documentation>Indicates an array of controls, usually buttons.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="tooltip">
        <xsd:annotation>
          <xsd:documentation>Indicates a pop up tool tip text.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="trackbar">
        <xsd:annotation>
          <xsd:documentation>Indicates a bar with a pointer indicating a position within a certain range.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="tree">
        <xsd:annotation>
          <xsd:documentation>Indicates a control that displays a set of hierarchical data.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="uri">
        <xsd:annotation>
          <xsd:documentation>Indicates a URI (URN or URL).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="userbutton">
        <xsd:annotation>
          <xsd:documentation>Indicates a Windows RC USERBUTTON control.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="usercontrol">
        <xsd:annotation>
          <xsd:documentation>Indicates a user-defined control like CONTROL control in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="var">
        <xsd:annotation>
          <xsd:documentation>Indicates the text of a variable.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="versioninfo">
        <xsd:annotation>
          <xsd:documentation>Indicates version information about a resource like VERSIONINFO in Windows.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="vscrollbar">
        <xsd:annotation>
          <xsd:documentation>Indicates a vertical scrollbar.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="window">
        <xsd:annotation>
          <xsd:documentation>Indicates a graphical window.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="size-unitValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'size-unit'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="byte">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in 8-bit bytes.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="char">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in Unicode characters.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="col">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in columns. Used for HTML text area.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="cm">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in centimeters.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="dlgunit">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in dialog units, as defined in Windows resources.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="em">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in 'font-size' units (as defined in CSS).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="ex">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in 'x-height' units (as defined in CSS).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="glyph">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster'</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="in">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in inches.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="mm">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in millimeters.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="percent">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in percentage.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="pixel">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in pixels.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="point">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in point.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="row">
        <xsd:annotation>
          <xsd:documentation>Indicates a size in rows. Used for HTML text area.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="stateValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'state'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="final">
        <xsd:annotation>
          <xsd:documentation>Indicates the terminating state.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="needs-adaptation">
        <xsd:annotation>
          <xsd:documentation>Indicates only non-textual information needs adaptation.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="needs-l10n">
        <xsd:annotation>
          <xsd:documentation>Indicates both text and non-textual information needs adaptation.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="needs-review-adaptation">
        <xsd:annotation>
          <xsd:documentation>Indicates only non-textual information needs review.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="needs-review-l10n">
        <xsd:annotation>
          <xsd:documentation>Indicates both text and non-textual information needs review.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="needs-review-translation">
        <xsd:annotation>
          <xsd:documentation>Indicates that only the text of the item needs to be reviewed.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="needs-translation">
        <xsd:annotation>
          <xsd:documentation>Indicates that the item needs to be translated.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="new">
        <xsd:annotation>
          <xsd:documentation>Indicates that the item is new. For example, translation units that were not in a previous version of the document.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="signed-off">
        <xsd:annotation>
          <xsd:documentation>Indicates that changes are reviewed and approved.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="translated">
        <xsd:annotation>
          <xsd:documentation>Indicates that the item has been translated.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="state-qualifierValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'state-qualifier'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="exact-match">
        <xsd:annotation>
          <xsd:documentation>Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="fuzzy-match">
        <xsd:annotation>
          <xsd:documentation>Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="id-match">
        <xsd:annotation>
          <xsd:documentation>Indicates a match based on matching IDs (in addition to matching text).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="leveraged-glossary">
        <xsd:annotation>
          <xsd:documentation>Indicates a translation derived from a glossary.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="leveraged-inherited">
        <xsd:annotation>
          <xsd:documentation>Indicates a translation derived from existing translation.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="leveraged-mt">
        <xsd:annotation>
          <xsd:documentation>Indicates a translation derived from machine translation.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="leveraged-repository">
        <xsd:annotation>
          <xsd:documentation>Indicates a translation derived from a translation repository.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="leveraged-tm">
        <xsd:annotation>
          <xsd:documentation>Indicates a translation derived from a translation memory.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="mt-suggestion">
        <xsd:annotation>
          <xsd:documentation>Indicates the translation is suggested by machine translation.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="rejected-grammar">
        <xsd:annotation>
          <xsd:documentation>Indicates that the item has been rejected because of incorrect grammar.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="rejected-inaccurate">
        <xsd:annotation>
          <xsd:documentation>Indicates that the item has been rejected because it is incorrect.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="rejected-length">
        <xsd:annotation>
          <xsd:documentation>Indicates that the item has been rejected because it is too long or too short.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="rejected-spelling">
        <xsd:annotation>
          <xsd:documentation>Indicates that the item has been rejected because of incorrect spelling.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="tm-suggestion">
        <xsd:annotation>
          <xsd:documentation>Indicates the translation is suggested by translation memory.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="unitValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'unit'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="word">
        <xsd:annotation>
          <xsd:documentation>Refers to words.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="page">
        <xsd:annotation>
          <xsd:documentation>Refers to pages.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="trans-unit">
        <xsd:annotation>
          <xsd:documentation>Refers to &lt;trans-unit&gt; elements.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="bin-unit">
        <xsd:annotation>
          <xsd:documentation>Refers to &lt;bin-unit&gt; elements.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="glyph">
        <xsd:annotation>
          <xsd:documentation>Refers to glyphs.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="item">
        <xsd:annotation>
          <xsd:documentation>Refers to &lt;trans-unit&gt; and/or &lt;bin-unit&gt; elements.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="instance">
        <xsd:annotation>
          <xsd:documentation>Refers to the occurrences of instances defined by the count-type value.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="character">
        <xsd:annotation>
          <xsd:documentation>Refers to characters.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="line">
        <xsd:annotation>
          <xsd:documentation>Refers to lines.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="sentence">
        <xsd:annotation>
          <xsd:documentation>Refers to sentences.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="paragraph">
        <xsd:annotation>
          <xsd:documentation>Refers to paragraphs.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="segment">
        <xsd:annotation>
          <xsd:documentation>Refers to segments.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="placeable">
        <xsd:annotation>
          <xsd:documentation>Refers to placeables (inline elements).</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="priorityValueList">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'priority'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:positiveInteger">
      <xsd:enumeration value="1">
        <xsd:annotation>
          <xsd:documentation>Highest priority.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="2">
        <xsd:annotation>
          <xsd:documentation>High priority.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="3">
        <xsd:annotation>
          <xsd:documentation>High priority, but not as important as 2.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="4">
        <xsd:annotation>
          <xsd:documentation>High priority, but not as important as 3.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="5">
        <xsd:annotation>
          <xsd:documentation>Medium priority, but more important than 6.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="6">
        <xsd:annotation>
          <xsd:documentation>Medium priority, but less important than 5.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="7">
        <xsd:annotation>
          <xsd:documentation>Low priority, but more important than 8.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="8">
        <xsd:annotation>
          <xsd:documentation>Low priority, but more important than 9.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="9">
        <xsd:annotation>
          <xsd:documentation>Low priority.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="10">
        <xsd:annotation>
          <xsd:documentation>Lowest priority.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="reformatValueYesNo">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="yes">
        <xsd:annotation>
          <xsd:documentation>This value indicates that all properties can be reformatted. This value must be used alone.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="no">
        <xsd:annotation>
          <xsd:documentation>This value indicates that no properties should be reformatted. This value must be used alone.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="reformatValueList">
    <xsd:list>
      <xsd:simpleType>
        <xsd:union memberTypes="xlf:XTend">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:enumeration value="coord">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that all information in the coord attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="coord-x">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that the x information in the coord attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="coord-y">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that the y information in the coord attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="coord-cx">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that the cx information in the coord attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="coord-cy">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that the cy information in the coord attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="font">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that all the information in the font attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="font-name">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that the name information in the font attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="font-size">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that the size information in the font attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="font-weight">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that the weight information in the font attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="css-style">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that the information in the css-style attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="style">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that the information in the style attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
              <xsd:enumeration value="ex-style">
                <xsd:annotation>
                  <xsd:documentation>This value indicates that the information in the exstyle attribute can be modified.</xsd:documentation>
                </xsd:annotation>
              </xsd:enumeration>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:union>
      </xsd:simpleType>
    </xsd:list>
  </xsd:simpleType>
  <xsd:simpleType name="purposeValueList">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="information">
        <xsd:annotation>
          <xsd:documentation>Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="location">
        <xsd:annotation>
          <xsd:documentation>Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="match">
        <xsd:annotation>
          <xsd:documentation>Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="alttranstypeValueList">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="proposal">
        <xsd:annotation>
          <xsd:documentation>Represents a translation proposal from a translation memory or other resource.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="previous-version">
        <xsd:annotation>
          <xsd:documentation>Represents a previous version of the target element.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="rejected">
        <xsd:annotation>
          <xsd:documentation>Represents a rejected version of the target element.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="reference">
        <xsd:annotation>
          <xsd:documentation>Represents a translation to be used for reference purposes only, for example from a related product or a different language.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
      <xsd:enumeration value="accepted">
        <xsd:annotation>
          <xsd:documentation>Represents a proposed translation that was used for the translation of the trans-unit, possibly modified.</xsd:documentation>
        </xsd:annotation>
      </xsd:enumeration>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- Other Types -->
  <xsd:complexType name="ElemType_ExternalReference">
    <xsd:choice>
      <xsd:element ref="xlf:internal-file"/>
      <xsd:element ref="xlf:external-file"/>
    </xsd:choice>
  </xsd:complexType>
  <xsd:simpleType name="AttrType_purpose">
    <xsd:list>
      <xsd:simpleType>
        <xsd:union memberTypes="xlf:purposeValueList xlf:XTend"/>
      </xsd:simpleType>
    </xsd:list>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_datatype">
    <xsd:union memberTypes="xlf:datatypeValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_restype">
    <xsd:union memberTypes="xlf:restypeValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_alttranstype">
    <xsd:union memberTypes="xlf:alttranstypeValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_context-type">
    <xsd:union memberTypes="xlf:context-typeValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_state">
    <xsd:union memberTypes="xlf:stateValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_state-qualifier">
    <xsd:union memberTypes="xlf:state-qualifierValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_count-type">
    <xsd:union memberTypes="xlf:restypeValueList xlf:count-typeValueList xlf:datatypeValueList xlf:stateValueList xlf:state-qualifierValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_InlineDelimiters">
    <xsd:union memberTypes="xlf:InlineDelimitersValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_InlinePlaceholders">
    <xsd:union memberTypes="xlf:InlinePlaceholdersValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_size-unit">
    <xsd:union memberTypes="xlf:size-unitValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_mtype">
    <xsd:union memberTypes="xlf:mtypeValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_unit">
    <xsd:union memberTypes="xlf:unitValueList xlf:XTend"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_priority">
    <xsd:union memberTypes="xlf:priorityValueList"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_reformat">
    <xsd:union memberTypes="xlf:reformatValueYesNo xlf:reformatValueList"/>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_YesNo">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="yes"/>
      <xsd:enumeration value="no"/>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_Position">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="open"/>
      <xsd:enumeration value="close"/>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_assoc">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="preceding"/>
      <xsd:enumeration value="following"/>
      <xsd:enumeration value="both"/>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_annotates">
    <xsd:restriction base="xsd:NMTOKEN">
      <xsd:enumeration value="source"/>
      <xsd:enumeration value="target"/>
      <xsd:enumeration value="general"/>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_Coordinates">
    <xsd:annotation>
      <xsd:documentation>Values for the attribute 'coord'.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="(-?\d+|#);(-?\d+|#);(-?\d+|#);(-?\d+|#)"/>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:simpleType name="AttrType_Version">
    <xsd:annotation>
      <xsd:documentation>Version values: 1.0 and 1.1 are allowed for backward compatibility.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="1.2"/>
      <xsd:enumeration value="1.1"/>
      <xsd:enumeration value="1.0"/>
    </xsd:restriction>
  </xsd:simpleType>
  <!-- Groups -->
  <xsd:group name="ElemGroup_TextContent">
    <xsd:choice>
      <xsd:element ref="xlf:g"/>
      <xsd:element ref="xlf:bpt"/>
      <xsd:element ref="xlf:ept"/>
      <xsd:element ref="xlf:ph"/>
      <xsd:element ref="xlf:it"/>
      <xsd:element ref="xlf:mrk"/>
      <xsd:element ref="xlf:x"/>
      <xsd:element ref="xlf:bx"/>
      <xsd:element ref="xlf:ex"/>
    </xsd:choice>
  </xsd:group>
  <xsd:attributeGroup name="AttrGroup_TextContent">
    <xsd:attribute name="id" type="xsd:string" use="required"/>
    <xsd:attribute name="xid" type="xsd:string" use="optional"/>
    <xsd:attribute name="equiv-text" type="xsd:string" use="optional"/>
    <xsd:anyAttribute namespace="##other" processContents="strict"/>
  </xsd:attributeGroup>
  <!-- XLIFF Structure -->
  <xsd:element name="xliff">
    <xsd:complexType>
      <xsd:sequence maxOccurs="unbounded">
        <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
        <xsd:element ref="xlf:file"/>
      </xsd:sequence>
      <xsd:attribute name="version" type="xlf:AttrType_Version" use="required"/>
      <xsd:attribute ref="xml:lang" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="file">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element minOccurs="0" ref="xlf:header"/>
        <xsd:element ref="xlf:body"/>
      </xsd:sequence>
      <xsd:attribute name="original" type="xsd:string" use="required"/>
      <xsd:attribute name="source-language" type="xsd:language" use="required"/>
      <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="required"/>
      <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
      <xsd:attribute name="date" type="xsd:dateTime" use="optional"/>
      <xsd:attribute ref="xml:space" use="optional"/>
      <xsd:attribute name="category" type="xsd:string" use="optional"/>
      <xsd:attribute name="target-language" type="xsd:language" use="optional"/>
      <xsd:attribute name="product-name" type="xsd:string" use="optional"/>
      <xsd:attribute name="product-version" type="xsd:string" use="optional"/>
      <xsd:attribute name="build-num" type="xsd:string" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
    <xsd:unique name="U_group_id">
      <xsd:selector xpath=".//xlf:group"/>
      <xsd:field xpath="@id"/>
    </xsd:unique>
    <xsd:key name="K_unit_id">
      <xsd:selector xpath=".//xlf:trans-unit|.//xlf:bin-unit"/>
      <xsd:field xpath="@id"/>
    </xsd:key>
    <xsd:keyref name="KR_unit_id" refer="xlf:K_unit_id">
      <xsd:selector xpath=".//bpt|.//ept|.//it|.//ph|.//g|.//x|.//bx|.//ex|.//sub"/>
      <xsd:field xpath="@xid"/>
    </xsd:keyref>
    <xsd:key name="K_tool-id">
      <xsd:selector xpath="xlf:header/xlf:tool"/>
      <xsd:field xpath="@tool-id"/>
    </xsd:key>
    <xsd:keyref name="KR_file_tool-id" refer="xlf:K_tool-id">
      <xsd:selector xpath="."/>
      <xsd:field xpath="@tool-id"/>
    </xsd:keyref>
    <xsd:keyref name="KR_phase_tool-id" refer="xlf:K_tool-id">
      <xsd:selector xpath="xlf:header/xlf:phase-group/xlf:phase"/>
      <xsd:field xpath="@tool-id"/>
    </xsd:keyref>
    <xsd:keyref name="KR_alt-trans_tool-id" refer="xlf:K_tool-id">
      <xsd:selector xpath=".//xlf:trans-unit/xlf:alt-trans"/>
      <xsd:field xpath="@tool-id"/>
    </xsd:keyref>
    <xsd:key name="K_count-group_name">
      <xsd:selector xpath=".//xlf:count-group"/>
      <xsd:field xpath="@name"/>
    </xsd:key>
    <xsd:unique name="U_context-group_name">
      <xsd:selector xpath=".//xlf:context-group"/>
      <xsd:field xpath="@name"/>
    </xsd:unique>
    <xsd:key name="K_phase-name">
      <xsd:selector xpath="xlf:header/xlf:phase-group/xlf:phase"/>
      <xsd:field xpath="@phase-name"/>
    </xsd:key>
    <xsd:keyref name="KR_phase-name" refer="xlf:K_phase-name">
      <xsd:selector xpath=".//xlf:count|.//xlf:trans-unit|.//xlf:target|.//bin-unit|.//bin-target"/>
      <xsd:field xpath="@phase-name"/>
    </xsd:keyref>
    <xsd:unique name="U_uid">
      <xsd:selector xpath=".//xlf:external-file"/>
      <xsd:field xpath="@uid"/>
    </xsd:unique>
  </xsd:element>
  <xsd:element name="header">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element minOccurs="0" name="skl" type="xlf:ElemType_ExternalReference"/>
        <xsd:element minOccurs="0" ref="xlf:phase-group"/>
        <xsd:choice maxOccurs="unbounded" minOccurs="0">
          <xsd:element name="glossary" type="xlf:ElemType_ExternalReference"/>
          <xsd:element name="reference" type="xlf:ElemType_ExternalReference"/>
          <xsd:element ref="xlf:count-group"/>
          <xsd:element ref="xlf:note"/>
          <xsd:element ref="xlf:tool"/>
        </xsd:choice>
        <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="internal-file">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attribute name="form" type="xsd:string"/>
          <xsd:attribute name="crc" type="xsd:NMTOKEN"/>
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="external-file">
    <xsd:complexType>
      <xsd:attribute name="href" type="xsd:string" use="required"/>
      <xsd:attribute name="crc" type="xsd:NMTOKEN"/>
      <xsd:attribute name="uid" type="xsd:NMTOKEN"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="note">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attribute ref="xml:lang" use="optional"/>
          <xsd:attribute default="1" name="priority" type="xlf:AttrType_priority" use="optional"/>
          <xsd:attribute name="from" type="xsd:string" use="optional"/>
          <xsd:attribute default="general" name="annotates" type="xlf:AttrType_annotates" use="optional"/>
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="phase-group">
    <xsd:complexType>
      <xsd:sequence maxOccurs="unbounded">
        <xsd:element ref="xlf:phase"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="phase">
    <xsd:complexType>
      <xsd:sequence maxOccurs="unbounded" minOccurs="0">
        <xsd:element ref="xlf:note"/>
      </xsd:sequence>
      <xsd:attribute name="phase-name" type="xsd:string" use="required"/>
      <xsd:attribute name="process-name" type="xsd:string" use="required"/>
      <xsd:attribute name="company-name" type="xsd:string" use="optional"/>
      <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
      <xsd:attribute name="date" type="xsd:dateTime" use="optional"/>
      <xsd:attribute name="job-id" type="xsd:string" use="optional"/>
      <xsd:attribute name="contact-name" type="xsd:string" use="optional"/>
      <xsd:attribute name="contact-email" type="xsd:string" use="optional"/>
      <xsd:attribute name="contact-phone" type="xsd:string" use="optional"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="count-group">
    <xsd:complexType>
      <xsd:sequence maxOccurs="unbounded" minOccurs="0">
        <xsd:element ref="xlf:count"/>
      </xsd:sequence>
      <xsd:attribute name="name" type="xsd:string" use="required"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="count">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attribute name="count-type" type="xlf:AttrType_count-type" use="optional"/>
          <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
          <xsd:attribute default="word" name="unit" type="xlf:AttrType_unit" use="optional"/>
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="context-group">
    <xsd:complexType>
      <xsd:sequence maxOccurs="unbounded">
        <xsd:element ref="xlf:context"/>
      </xsd:sequence>
      <xsd:attribute name="name" type="xsd:string" use="optional"/>
      <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="purpose" type="xlf:AttrType_purpose" use="optional"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="context">
    <xsd:complexType>
      <xsd:simpleContent>
        <xsd:extension base="xsd:string">
          <xsd:attribute name="context-type" type="xlf:AttrType_context-type" use="required"/>
          <xsd:attribute default="no" name="match-mandatory" type="xlf:AttrType_YesNo" use="optional"/>
          <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
        </xsd:extension>
      </xsd:simpleContent>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="tool">
    <xsd:complexType mixed="true">
      <xsd:sequence>
        <xsd:any namespace="##any" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="tool-id" type="xsd:string" use="required"/>
      <xsd:attribute name="tool-name" type="xsd:string" use="required"/>
      <xsd:attribute name="tool-version" type="xsd:string" use="optional"/>
      <xsd:attribute name="tool-company" type="xsd:string" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="body">
    <xsd:complexType>
      <xsd:choice maxOccurs="unbounded" minOccurs="0">
        <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:group"/>
        <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:trans-unit"/>
        <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:bin-unit"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="group">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:sequence>
          <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:context-group"/>
          <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:count-group"/>
          <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:note"/>
          <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
        </xsd:sequence>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:group"/>
          <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:trans-unit"/>
          <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:bin-unit"/>
        </xsd:choice>
      </xsd:sequence>
      <xsd:attribute name="id" type="xsd:string" use="optional"/>
      <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
      <xsd:attribute default="default" ref="xml:space" use="optional"/>
      <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
      <xsd:attribute name="resname" type="xsd:string" use="optional"/>
      <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
      <xsd:attribute name="extype" type="xsd:string" use="optional"/>
      <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="menu" type="xsd:string" use="optional"/>
      <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
      <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
      <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
      <xsd:attribute name="font" type="xsd:string" use="optional"/>
      <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
      <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
      <xsd:attribute default="pixel" name="size-unit" type="xlf:AttrType_size-unit" use="optional"/>
      <xsd:attribute name="maxwidth" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="minwidth" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="maxheight" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="minheight" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="maxbytes" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="minbytes" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="charclass" type="xsd:string" use="optional"/>
      <xsd:attribute default="no" name="merged-trans" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="trans-unit">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="xlf:source"/>
        <xsd:element minOccurs="0" ref="xlf:seg-source"/>
        <xsd:element minOccurs="0" ref="xlf:target"/>
        <xsd:choice maxOccurs="unbounded" minOccurs="0">
          <xsd:element ref="xlf:context-group"/>
          <xsd:element ref="xlf:count-group"/>
          <xsd:element ref="xlf:note"/>
          <xsd:element ref="xlf:alt-trans"/>
        </xsd:choice>
        <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
      </xsd:sequence>
      <xsd:attribute name="id" type="xsd:string" use="required"/>
      <xsd:attribute name="approved" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
      <xsd:attribute default="default" ref="xml:space" use="optional"/>
      <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
      <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
      <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
      <xsd:attribute name="resname" type="xsd:string" use="optional"/>
      <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
      <xsd:attribute name="extype" type="xsd:string" use="optional"/>
      <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="menu" type="xsd:string" use="optional"/>
      <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
      <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
      <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
      <xsd:attribute name="font" type="xsd:string" use="optional"/>
      <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
      <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute default="pixel" name="size-unit" type="xlf:AttrType_size-unit" use="optional"/>
      <xsd:attribute name="maxwidth" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="minwidth" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="maxheight" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="minheight" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="maxbytes" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="minbytes" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="charclass" type="xsd:string" use="optional"/>
      <xsd:attribute default="yes" name="merged-trans" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
    <xsd:unique name="U_tu_segsrc_mid">
      <xsd:selector xpath="./xlf:seg-source/xlf:mrk"/>
      <xsd:field xpath="@mid"/>
    </xsd:unique>
    <xsd:keyref name="KR_tu_segsrc_mid" refer="xlf:U_tu_segsrc_mid">
      <xsd:selector xpath="./xlf:target/xlf:mrk|./xlf:alt-trans"/>
      <xsd:field xpath="@mid"/>
    </xsd:keyref>
  </xsd:element>
  <xsd:element name="source">
    <xsd:complexType mixed="true">
      <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
      <xsd:attribute ref="xml:lang" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
    <xsd:unique name="U_source_bpt_rid">
      <xsd:selector xpath=".//xlf:bpt"/>
      <xsd:field xpath="@rid"/>
    </xsd:unique>
    <xsd:keyref name="KR_source_ept_rid" refer="xlf:U_source_bpt_rid">
      <xsd:selector xpath=".//xlf:ept"/>
      <xsd:field xpath="@rid"/>
    </xsd:keyref>
    <xsd:unique name="U_source_bx_rid">
      <xsd:selector xpath=".//xlf:bx"/>
      <xsd:field xpath="@rid"/>
    </xsd:unique>
    <xsd:keyref name="KR_source_ex_rid" refer="xlf:U_source_bx_rid">
      <xsd:selector xpath=".//xlf:ex"/>
      <xsd:field xpath="@rid"/>
    </xsd:keyref>
  </xsd:element>
  <xsd:element name="seg-source">
    <xsd:complexType mixed="true">
      <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
      <xsd:attribute ref="xml:lang" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
    <xsd:unique name="U_segsrc_bpt_rid">
      <xsd:selector xpath=".//xlf:bpt"/>
      <xsd:field xpath="@rid"/>
    </xsd:unique>
    <xsd:keyref name="KR_segsrc_ept_rid" refer="xlf:U_segsrc_bpt_rid">
      <xsd:selector xpath=".//xlf:ept"/>
      <xsd:field xpath="@rid"/>
    </xsd:keyref>
    <xsd:unique name="U_segsrc_bx_rid">
      <xsd:selector xpath=".//xlf:bx"/>
      <xsd:field xpath="@rid"/>
    </xsd:unique>
    <xsd:keyref name="KR_segsrc_ex_rid" refer="xlf:U_segsrc_bx_rid">
      <xsd:selector xpath=".//xlf:ex"/>
      <xsd:field xpath="@rid"/>
    </xsd:keyref>
  </xsd:element>
  <xsd:element name="target">
    <xsd:complexType mixed="true">
      <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
      <xsd:attribute name="state" type="xlf:AttrType_state" use="optional"/>
      <xsd:attribute name="state-qualifier" type="xlf:AttrType_state-qualifier" use="optional"/>
      <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute ref="xml:lang" use="optional"/>
      <xsd:attribute name="resname" type="xsd:string" use="optional"/>
      <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
      <xsd:attribute name="font" type="xsd:string" use="optional"/>
      <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
      <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute default="yes" name="equiv-trans" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
    <xsd:unique name="U_target_bpt_rid">
      <xsd:selector xpath=".//xlf:bpt"/>
      <xsd:field xpath="@rid"/>
    </xsd:unique>
    <xsd:keyref name="KR_target_ept_rid" refer="xlf:U_target_bpt_rid">
      <xsd:selector xpath=".//xlf:ept"/>
      <xsd:field xpath="@rid"/>
    </xsd:keyref>
    <xsd:unique name="U_target_bx_rid">
      <xsd:selector xpath=".//xlf:bx"/>
      <xsd:field xpath="@rid"/>
    </xsd:unique>
    <xsd:keyref name="KR_target_ex_rid" refer="xlf:U_target_bx_rid">
      <xsd:selector xpath=".//xlf:ex"/>
      <xsd:field xpath="@rid"/>
    </xsd:keyref>
  </xsd:element>
  <xsd:element name="alt-trans">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element minOccurs="0" ref="xlf:source"/>
        <xsd:element minOccurs="0" ref="xlf:seg-source"/>
        <xsd:element maxOccurs="1" ref="xlf:target"/>
        <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:context-group"/>
        <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:note"/>
        <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
      </xsd:sequence>
      <xsd:attribute name="match-quality" type="xsd:string" use="optional"/>
      <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
      <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute ref="xml:lang" use="optional"/>
      <xsd:attribute name="origin" type="xsd:string" use="optional"/>
      <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
      <xsd:attribute default="default" ref="xml:space" use="optional"/>
      <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
      <xsd:attribute name="resname" type="xsd:string" use="optional"/>
      <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
      <xsd:attribute name="extype" type="xsd:string" use="optional"/>
      <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="menu" type="xsd:string" use="optional"/>
      <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
      <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
      <xsd:attribute name="mid" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
      <xsd:attribute name="font" type="xsd:string" use="optional"/>
      <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
      <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute default="proposal" name="alttranstype" type="xlf:AttrType_alttranstype" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
    <xsd:unique name="U_at_segsrc_mid">
      <xsd:selector xpath="./xlf:seg-source/xlf:mrk"/>
      <xsd:field xpath="@mid"/>
    </xsd:unique>
    <xsd:keyref name="KR_at_segsrc_mid" refer="xlf:U_at_segsrc_mid">
      <xsd:selector xpath="./xlf:target/xlf:mrk"/>
      <xsd:field xpath="@mid"/>
    </xsd:keyref>
  </xsd:element>
  <xsd:element name="bin-unit">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="xlf:bin-source"/>
        <xsd:element minOccurs="0" ref="xlf:bin-target"/>
        <xsd:choice maxOccurs="unbounded" minOccurs="0">
          <xsd:element ref="xlf:context-group"/>
          <xsd:element ref="xlf:count-group"/>
          <xsd:element ref="xlf:note"/>
          <xsd:element ref="xlf:trans-unit"/>
        </xsd:choice>
        <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
      </xsd:sequence>
      <xsd:attribute name="id" type="xsd:string" use="required"/>
      <xsd:attribute name="mime-type" type="xlf:mime-typeValueList" use="required"/>
      <xsd:attribute name="approved" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
      <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
      <xsd:attribute name="resname" type="xsd:string" use="optional"/>
      <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="bin-source">
    <xsd:complexType>
      <xsd:choice>
        <xsd:element ref="xlf:internal-file"/>
        <xsd:element ref="xlf:external-file"/>
      </xsd:choice>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="bin-target">
    <xsd:complexType>
      <xsd:choice>
        <xsd:element ref="xlf:internal-file"/>
        <xsd:element ref="xlf:external-file"/>
      </xsd:choice>
      <xsd:attribute name="mime-type" type="xlf:mime-typeValueList" use="optional"/>
      <xsd:attribute name="state" type="xlf:AttrType_state" use="optional"/>
      <xsd:attribute name="state-qualifier" type="xlf:AttrType_state-qualifier" use="optional"/>
      <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
      <xsd:attribute name="resname" type="xsd:string" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
  </xsd:element>
  <!-- Element for inline codes -->
  <xsd:element name="g">
    <xsd:complexType mixed="true">
      <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
      <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
      <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="x">
    <xsd:complexType>
      <xsd:attribute name="ctype" type="xlf:AttrType_InlinePlaceholders" use="optional"/>
      <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="bx">
    <xsd:complexType>
      <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
      <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
      <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="ex">
    <xsd:complexType>
      <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="ph">
    <xsd:complexType mixed="true">
      <xsd:sequence maxOccurs="unbounded" minOccurs="0">
        <xsd:element ref="xlf:sub"/>
      </xsd:sequence>
      <xsd:attribute name="ctype" type="xlf:AttrType_InlinePlaceholders" use="optional"/>
      <xsd:attribute name="crc" type="xsd:string" use="optional"/>
      <xsd:attribute name="assoc" type="xlf:AttrType_assoc" use="optional"/>
      <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="bpt">
    <xsd:complexType mixed="true">
      <xsd:sequence maxOccurs="unbounded" minOccurs="0">
        <xsd:element ref="xlf:sub"/>
      </xsd:sequence>
      <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
      <xsd:attribute name="crc" type="xsd:string" use="optional"/>
      <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="ept">
    <xsd:complexType mixed="true">
      <xsd:sequence maxOccurs="unbounded" minOccurs="0">
        <xsd:element ref="xlf:sub"/>
      </xsd:sequence>
      <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="crc" type="xsd:string" use="optional"/>
      <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="it">
    <xsd:complexType mixed="true">
      <xsd:sequence maxOccurs="unbounded" minOccurs="0">
        <xsd:element ref="xlf:sub"/>
      </xsd:sequence>
      <xsd:attribute name="pos" type="xlf:AttrType_Position" use="required"/>
      <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
      <xsd:attribute name="crc" type="xsd:string" use="optional"/>
      <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="sub">
    <xsd:complexType mixed="true">
      <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
      <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
      <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
      <xsd:attribute name="xid" type="xsd:string" use="optional"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="mrk">
    <xsd:complexType mixed="true">
      <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
      <xsd:attribute name="mtype" type="xlf:AttrType_mtype" use="required"/>
      <xsd:attribute name="mid" type="xsd:NMTOKEN" use="optional"/>
      <xsd:attribute name="comment" type="xsd:string" use="optional"/>
      <xsd:anyAttribute namespace="##other" processContents="strict"/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
PK3_�\�'s�u	u	<pear/Symfony/Component/Translation/Loader/JsonFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\FileResource;

/**
 * JsonFileLoader loads translations from an json file.
 *
 * @author singles
 */
class JsonFileLoader extends ArrayLoader implements LoaderInterface
{
    /**
     * {@inheritdoc}
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource)) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!file_exists($resource)) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        $messages = json_decode(file_get_contents($resource), true);

        if (0 < $errorCode = json_last_error()) {
            throw new InvalidResourceException(sprintf('Error parsing JSON - %s', $this->getJSONErrorMessage($errorCode)));
        }

        if (null === $messages) {
            $messages = array();
        }

        $catalogue = parent::load($messages, $locale, $domain);
        $catalogue->addResource(new FileResource($resource));

        return $catalogue;
    }

    /**
     * Translates JSON_ERROR_* constant into meaningful message.
     *
     * @param  integer $errorCode Error code returned by json_last_error() call
     *
     * @return string  Message string
     */
    private function getJSONErrorMessage($errorCode)
    {
        switch ($errorCode) {
            case JSON_ERROR_DEPTH:
                return 'Maximum stack depth exceeded';
            case JSON_ERROR_STATE_MISMATCH:
                return 'Underflow or the modes mismatch';
            case JSON_ERROR_CTRL_CHAR:
                return 'Unexpected control character found';
            case JSON_ERROR_SYNTAX:
                return 'Syntax error, malformed JSON';
            case JSON_ERROR_UTF8:
                return 'Malformed UTF-8 characters, possibly incorrectly encoded';
            default:
                return 'Unknown error';
        }
    }
}
PK3_�\)-d+�	�	:pear/Symfony/Component/Translation/Loader/QtFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Loader;

use Symfony\Component\Config\Util\XmlUtils;
use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
use Symfony\Component\Config\Resource\FileResource;

/**
 * QtFileLoader loads translations from QT Translations XML files.
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 *
 * @api
 */
class QtFileLoader implements LoaderInterface
{
    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function load($resource, $locale, $domain = 'messages')
    {
        if (!stream_is_local($resource)) {
            throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
        }

        if (!file_exists($resource)) {
            throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
        }

        try {
            $dom = XmlUtils::loadFile($resource);
        } catch (\InvalidArgumentException $e) {
            throw new InvalidResourceException(sprintf('Unable to load "%s".', $resource), $e->getCode(), $e);
        }

        $internalErrors = libxml_use_internal_errors(true);
        libxml_clear_errors();

        $xpath = new \DOMXPath($dom);
        $nodes = $xpath->evaluate('//TS/context/name[text()="'.$domain.'"]');

        $catalogue = new MessageCatalogue($locale);
        if ($nodes->length == 1) {
            $translations = $nodes->item(0)->nextSibling->parentNode->parentNode->getElementsByTagName('message');
            foreach ($translations as $translation) {
                $translationValue = (string) $translation->getElementsByTagName('translation')->item(0)->nodeValue;

                if (!empty($translationValue)) {
                    $catalogue->set(
                        (string) $translation->getElementsByTagName('source')->item(0)->nodeValue,
                        $translationValue,
                        $domain
                    );
                }
                $translation = $translation->nextSibling;
            }
            $catalogue->addResource(new FileResource($resource));
        }

        libxml_use_internal_errors($internalErrors);

        return $catalogue;
    }
}
PK4_�\�<qNN6pear/Symfony/Component/Translation/MessageSelector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation;

/**
 * MessageSelector.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class MessageSelector
{
    /**
     * Given a message with different plural translations separated by a
     * pipe (|), this method returns the correct portion of the message based
     * on the given number, locale and the pluralization rules in the message
     * itself.
     *
     * The message supports two different types of pluralization rules:
     *
     * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples
     * indexed:  There is one apple|There are %count% apples
     *
     * The indexed solution can also contain labels (e.g. one: There is one apple).
     * This is purely for making the translations more clear - it does not
     * affect the functionality.
     *
     * The two methods can also be mixed:
     *     {0} There are no apples|one: There is one apple|more: There are %count% apples
     *
     * @param string  $message The message being translated
     * @param integer $number  The number of items represented for the message
     * @param string  $locale  The locale to use for choosing
     *
     * @return string
     *
     * @throws \InvalidArgumentException
     *
     * @api
     */
    public function choose($message, $number, $locale)
    {
        $parts = explode('|', $message);
        $explicitRules = array();
        $standardRules = array();
        foreach ($parts as $part) {
            $part = trim($part);

            if (preg_match('/^(?P<interval>'.Interval::getIntervalRegexp().')\s*(?P<message>.*?)$/x', $part, $matches)) {
                $explicitRules[$matches['interval']] = $matches['message'];
            } elseif (preg_match('/^\w+\:\s*(.*?)$/', $part, $matches)) {
                $standardRules[] = $matches[1];
            } else {
                $standardRules[] = $part;
            }
        }

        // try to match an explicit rule, then fallback to the standard ones
        foreach ($explicitRules as $interval => $m) {
            if (Interval::test($number, $interval)) {
                return $m;
            }
        }

        $position = PluralizationRules::get($number, $locale);

        if (!isset($standardRules[$position])) {
            // when there's exactly one rule given, and that rule is a standard
            // rule, use this rule
            if (1 === count($parts) && isset($standardRules[0])) {
                return $standardRules[0];
            }

            throw new \InvalidArgumentException(sprintf('Unable to choose a translation for "%s" with locale "%s". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $message, $locale));
        }

        return $standardRules[$position];
    }
}
PK4_�\�6�"��Cpear/Symfony/Component/Translation/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Exception;

/**
 * Exception interface for all exceptions thrown by the component.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface ExceptionInterface
{
}
PK5_�\D���Ipear/Symfony/Component/Translation/Exception/InvalidResourceException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Exception;

/**
 * Thrown when a resource cannot be loaded.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class InvalidResourceException extends \InvalidArgumentException implements ExceptionInterface
{
}
PK5_�\�2B��Jpear/Symfony/Component/Translation/Exception/NotFoundResourceException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Exception;

/**
 * Thrown when a resource does not exist.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class NotFoundResourceException extends \InvalidArgumentException implements ExceptionInterface
{
}
PK6_�\g�?Z�
�
/pear/Symfony/Component/Translation/Interval.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation;

/**
 * Tests if a given number belongs to a given math interval.
 *
 * An interval can represent a finite set of numbers:
 *
 *  {1,2,3,4}
 *
 * An interval can represent numbers between two numbers:
 *
 *  [1, +Inf]
 *  ]-1,2[
 *
 * The left delimiter can be [ (inclusive) or ] (exclusive).
 * The right delimiter can be [ (exclusive) or ] (inclusive).
 * Beside numbers, you can use -Inf and +Inf for the infinite.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @see    http://en.wikipedia.org/wiki/Interval_%28mathematics%29#The_ISO_notation
 */
class Interval
{
    /**
     * Tests if the given number is in the math interval.
     *
     * @param integer $number   A number
     * @param string  $interval An interval
     *
     * @return Boolean
     *
     * @throws \InvalidArgumentException
     */
    public static function test($number, $interval)
    {
        $interval = trim($interval);

        if (!preg_match('/^'.self::getIntervalRegexp().'$/x', $interval, $matches)) {
            throw new \InvalidArgumentException(sprintf('"%s" is not a valid interval.', $interval));
        }

        if ($matches[1]) {
            foreach (explode(',', $matches[2]) as $n) {
                if ($number == $n) {
                    return true;
                }
            }
        } else {
            $leftNumber = self::convertNumber($matches['left']);
            $rightNumber = self::convertNumber($matches['right']);

            return
                ('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber)
                && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber)
            ;
        }

        return false;
    }

    /**
     * Returns a Regexp that matches valid intervals.
     *
     * @return string A Regexp (without the delimiters)
     */
    public static function getIntervalRegexp()
    {
        return <<<EOF
        ({\s*
            (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*)
        \s*})

            |

        (?P<left_delimiter>[\[\]])
            \s*
            (?P<left>-Inf|\-?\d+(\.\d+)?)
            \s*,\s*
            (?P<right>\+?Inf|\-?\d+(\.\d+)?)
            \s*
        (?P<right_delimiter>[\[\]])
EOF;
    }

    private static function convertNumber($number)
    {
        if ('-Inf' === $number) {
            return log(0);
        } elseif ('+Inf' === $number || 'Inf' === $number) {
            return -log(0);
        }

        return (float) $number;
    }
}
PK6_�\b*0�oo9pear/Symfony/Component/Translation/PluralizationRules.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation;

/**
 * Returns the plural rules for a given locale.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class PluralizationRules
{
    // @codeCoverageIgnoreStart
    private static $rules = array();

    /**
     * Returns the plural position to use for the given locale and number.
     *
     * @param integer $number The number
     * @param string  $locale The locale
     *
     * @return integer The plural position
     */
    public static function get($number, $locale)
    {
        if ('pt_BR' === $locale) {
            // temporary set a locale for brazilian
            $locale = 'xbr';
        }

        if (strlen($locale) > 3) {
            $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
        }

        if (isset(self::$rules[$locale])) {
            $return = call_user_func(self::$rules[$locale], $number);

            if (!is_int($return) || $return < 0) {
                return 0;
            }

            return $return;
        }

        /*
         * The plural rules are derived from code of the Zend Framework (2010-09-25),
         * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).
         * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
         */
        switch ($locale) {
            case 'bo':
            case 'dz':
            case 'id':
            case 'ja':
            case 'jv':
            case 'ka':
            case 'km':
            case 'kn':
            case 'ko':
            case 'ms':
            case 'th':
            case 'tr':
            case 'vi':
            case 'zh':
                return 0;
                break;

            case 'af':
            case 'az':
            case 'bn':
            case 'bg':
            case 'ca':
            case 'da':
            case 'de':
            case 'el':
            case 'en':
            case 'eo':
            case 'es':
            case 'et':
            case 'eu':
            case 'fa':
            case 'fi':
            case 'fo':
            case 'fur':
            case 'fy':
            case 'gl':
            case 'gu':
            case 'ha':
            case 'he':
            case 'hu':
            case 'is':
            case 'it':
            case 'ku':
            case 'lb':
            case 'ml':
            case 'mn':
            case 'mr':
            case 'nah':
            case 'nb':
            case 'ne':
            case 'nl':
            case 'nn':
            case 'no':
            case 'om':
            case 'or':
            case 'pa':
            case 'pap':
            case 'ps':
            case 'pt':
            case 'so':
            case 'sq':
            case 'sv':
            case 'sw':
            case 'ta':
            case 'te':
            case 'tk':
            case 'ur':
            case 'zu':
                return ($number == 1) ? 0 : 1;

            case 'am':
            case 'bh':
            case 'fil':
            case 'fr':
            case 'gun':
            case 'hi':
            case 'ln':
            case 'mg':
            case 'nso':
            case 'xbr':
            case 'ti':
            case 'wa':
                return (($number == 0) || ($number == 1)) ? 0 : 1;

            case 'be':
            case 'bs':
            case 'hr':
            case 'ru':
            case 'sr':
            case 'uk':
                return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);

            case 'cs':
            case 'sk':
                return ($number == 1) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2);

            case 'ga':
                return ($number == 1) ? 0 : (($number == 2) ? 1 : 2);

            case 'lt':
                return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);

            case 'sl':
                return ($number % 100 == 1) ? 0 : (($number % 100 == 2) ? 1 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 2 : 3));

            case 'mk':
                return ($number % 10 == 1) ? 0 : 1;

            case 'mt':
                return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3));

            case 'lv':
                return ($number == 0) ? 0 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2);

            case 'pl':
                return ($number == 1) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2);

            case 'cy':
                return ($number == 1) ? 0 : (($number == 2) ? 1 : ((($number == 8) || ($number == 11)) ? 2 : 3));

            case 'ro':
                return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2);

            case 'ar':
                return ($number == 0) ? 0 : (($number == 1) ? 1 : (($number == 2) ? 2 : ((($number >= 3) && ($number <= 10)) ? 3 : ((($number >= 11) && ($number <= 99)) ? 4 : 5))));

            default:
                return 0;
        }
    }

    /**
     * Overrides the default plural rule for a given locale.
     *
     * @param string $rule   A PHP callable
     * @param string $locale The locale
     *
     * @throws \LogicException
     */
    public static function set($rule, $locale)
    {
        if ('pt_BR' === $locale) {
            // temporary set a locale for brazilian
            $locale = 'xbr';
        }

        if (strlen($locale) > 3) {
            $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
        }

        if (!is_callable($rule)) {
            throw new \LogicException('The given rule can not be called');
        }

        self::$rules[$locale] = $rule;
    }

    // @codeCoverageIgnoreEnd
}
PK7_�\�3����:pear/Symfony/Component/Translation/TranslatorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation;

/**
 * TranslatorInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface TranslatorInterface
{
    /**
     * Translates the given message.
     *
     * @param string      $id         The message id (may also be an object that can be cast to string)
     * @param array       $parameters An array of parameters for the message
     * @param string|null $domain     The domain for the message or null to use the default
     * @param string|null $locale     The locale or null to use the default
     *
     * @return string The translated string
     *
     * @api
     */
    public function trans($id, array $parameters = array(), $domain = null, $locale = null);

    /**
     * Translates the given choice message by choosing a translation according to a number.
     *
     * @param string      $id         The message id (may also be an object that can be cast to string)
     * @param integer     $number     The number to use to find the indice of the message
     * @param array       $parameters An array of parameters for the message
     * @param string|null $domain     The domain for the message or null to use the default
     * @param string|null $locale     The locale or null to use the default
     *
     * @return string The translated string
     *
     * @api
     */
    public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null);

    /**
     * Sets the current locale.
     *
     * @param string $locale The locale
     *
     * @api
     */
    public function setLocale($locale);

    /**
     * Returns the current locale.
     *
     * @return string The locale
     *
     * @api
     */
    public function getLocale();
}
PK7_�\%�Mt=pear/Symfony/Component/Translation/MetadataAwareInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation;

/**
 * MetadataAwareInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface MetadataAwareInterface
{
    /**
     * Gets metadata for the given domain and key.
     *
     * Passing an empty domain will return an array with all metadata indexed by
     * domain and then by key. Passing an empty key will return an array with all
     * metadata for the given domain.
     *
     * @param string $domain The domain name
     * @param string $key    The key
     *
     * @return mixed The value that was set or an array with the domains/keys or null
     */
    public function getMetadata($key = '', $domain = 'messages');

    /**
     * Adds metadata to a message domain.
     *
     * @param string $key    The key
     * @param mixed  $value  The value
     * @param string $domain The domain name
     */
    public function setMetadata($key, $value, $domain = 'messages');

    /**
     * Deletes metadata for the given key and domain.
     *
     * Passing an empty domain will delete all metadata. Passing an empty key will
     * delete all metadata for the given domain.
     *
     * @param string $domain The domain name
     * @param string $key    The key
     */
    public function deleteMetadata($key = '', $domain = 'messages');
}
PK8_�\����?pear/Symfony/Component/Translation/Extractor/ChainExtractor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Extractor;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * ChainExtractor extracts translation messages from template files.
 *
 * @author Michel Salib <michelsalib@hotmail.com>
 */
class ChainExtractor implements ExtractorInterface
{
    /**
     * The extractors.
     *
     * @var ExtractorInterface[]
     */
    private $extractors = array();

    /**
     * Adds a loader to the translation extractor.
     *
     * @param string             $format    The format of the loader
     * @param ExtractorInterface $extractor The loader
     */
    public function addExtractor($format, ExtractorInterface $extractor)
    {
        $this->extractors[$format] = $extractor;
    }

    /**
     * {@inheritDoc}
     */
    public function setPrefix($prefix)
    {
        foreach ($this->extractors as $extractor) {
            $extractor->setPrefix($prefix);
        }
    }

    /**
     * {@inheritDoc}
     */
    public function extract($directory, MessageCatalogue $catalogue)
    {
        foreach ($this->extractors as $extractor) {
            $extractor->extract($directory, $catalogue);
        }
    }
}
PK8_�\ArP�Cpear/Symfony/Component/Translation/Extractor/ExtractorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Extractor;

use Symfony\Component\Translation\MessageCatalogue;

/**
 * Extracts translation messages from a template directory to the catalogue.
 * New found messages are injected to the catalogue using the prefix.
 *
 * @author Michel Salib <michelsalib@hotmail.com>
 */
interface ExtractorInterface
{
    /**
     * Extracts translation messages from a template directory to the catalogue.
     *
     * @param string           $directory The path to look into
     * @param MessageCatalogue $catalogue The catalogue
     */
    public function extract($directory, MessageCatalogue $catalogue);

    /**
     * Sets the prefix that should be used for new found messages.
     *
     * @param string $prefix The prefix
     */
    public function setPrefix($prefix);
}
PK9_�\��ӄ�>pear/Symfony/Component/Translation/Catalogue/DiffOperation.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Catalogue;

/**
 * Diff operation between two catalogues.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class DiffOperation extends AbstractOperation
{
    /**
     * {@inheritdoc}
     */
    protected function processDomain($domain)
    {
        $this->messages[$domain] = array(
            'all'      => array(),
            'new'      => array(),
            'obsolete' => array(),
        );

        foreach ($this->source->all($domain) as $id => $message) {
            if ($this->target->has($id, $domain)) {
                $this->messages[$domain]['all'][$id] = $message;
                $this->result->add(array($id => $message), $domain);
            } else {
                $this->messages[$domain]['obsolete'][$id] = $message;
            }
        }

        foreach ($this->target->all($domain) as $id => $message) {
            if (!$this->source->has($id, $domain)) {
                $this->messages[$domain]['all'][$id] = $message;
                $this->messages[$domain]['new'][$id] = $message;
                $this->result->add(array($id => $message), $domain);
            }
        }
    }
}
PK9_�\�س��?pear/Symfony/Component/Translation/Catalogue/MergeOperation.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Catalogue;

/**
 * Merge operation between two catalogues.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class MergeOperation extends AbstractOperation
{
    /**
     * {@inheritdoc}
     */
    protected function processDomain($domain)
    {
        $this->messages[$domain] = array(
            'all'      => array(),
            'new'      => array(),
            'obsolete' => array(),
        );

        foreach ($this->source->all($domain) as $id => $message) {
            $this->messages[$domain]['all'][$id] = $message;
            $this->result->add(array($id => $message), $domain);
        }

        foreach ($this->target->all($domain) as $id => $message) {
            if (!$this->source->has($id, $domain)) {
                $this->messages[$domain]['all'][$id] = $message;
                $this->messages[$domain]['new'][$id] = $message;
                $this->result->add(array($id => $message), $domain);
            }
        }
    }
}
PK9_�\Y[�Cpear/Symfony/Component/Translation/Catalogue/OperationInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Catalogue;

use Symfony\Component\Translation\MessageCatalogueInterface;

/**
 * Represents an operation on catalogue(s).
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
interface OperationInterface
{
    /**
     * Returns domains affected by operation.
     *
     * @return array
     */
    public function getDomains();

    /**
     * Returns all valid messages after operation.
     *
     * @param string $domain
     *
     * @return array
     */
    public function getMessages($domain);

    /**
     * Returns new messages after operation.
     *
     * @param string $domain
     *
     * @return array
     */
    public function getNewMessages($domain);

    /**
     * Returns obsolete messages after operation.
     *
     * @param string $domain
     *
     * @return array
     */
    public function getObsoleteMessages($domain);

    /**
     * Returns resulting catalogue.
     *
     * @return MessageCatalogueInterface
     */
    public function getResult();
}
PK:_�\��fb�
�
Bpear/Symfony/Component/Translation/Catalogue/AbstractOperation.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Catalogue;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\MessageCatalogueInterface;

/**
 * Base catalogues binary operation class.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
abstract class AbstractOperation implements OperationInterface
{
    /**
     * @var MessageCatalogueInterface
     */
    protected $source;

    /**
     * @var MessageCatalogueInterface
     */
    protected $target;

    /**
     * @var MessageCatalogue
     */
    protected $result;

    /**
     * @var null|array
     */
    private $domains;

    /**
     * @var array
     */
    protected $messages;

    /**
     * @param MessageCatalogueInterface $source
     * @param MessageCatalogueInterface $target
     *
     * @throws \LogicException
     */
    public function __construct(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
    {
        if ($source->getLocale() !== $target->getLocale()) {
            throw new \LogicException('Operated catalogues must belong to the same locale.');
        }

        $this->source = $source;
        $this->target = $target;
        $this->result = new MessageCatalogue($source->getLocale());
        $this->domains = null;
        $this->messages = array();
    }

    /**
     * {@inheritdoc}
     */
    public function getDomains()
    {
        if (null === $this->domains) {
            $this->domains = array_values(array_unique(array_merge($this->source->getDomains(), $this->target->getDomains())));
        }

        return $this->domains;
    }

    /**
     * {@inheritdoc}
     */
    public function getMessages($domain)
    {
        if (!in_array($domain, $this->getDomains())) {
            throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
        }

        if (!isset($this->messages[$domain]['all'])) {
            $this->processDomain($domain);
        }

        return $this->messages[$domain]['all'];
    }

    /**
     * {@inheritdoc}
     */
    public function getNewMessages($domain)
    {
        if (!in_array($domain, $this->getDomains())) {
            throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
        }

        if (!isset($this->messages[$domain]['new'])) {
            $this->processDomain($domain);
        }

        return $this->messages[$domain]['new'];
    }

    /**
     * {@inheritdoc}
     */
    public function getObsoleteMessages($domain)
    {
        if (!in_array($domain, $this->getDomains())) {
            throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
        }

        if (!isset($this->messages[$domain]['obsolete'])) {
            $this->processDomain($domain);
        }

        return $this->messages[$domain]['obsolete'];
    }

    /**
     * {@inheritdoc}
     */
    public function getResult()
    {
        foreach ($this->getDomains() as $domain) {
            if (!isset($this->messages[$domain])) {
                $this->processDomain($domain);
            }
        }

        return $this->result;
    }

    /**
     * @param string $domain
     */
    abstract protected function processDomain($domain);
}
PK:_�\q��*((1pear/Symfony/Component/Locale/Stub/StubLocale.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub;

use Symfony\Component\Icu\IcuData;
use Symfony\Component\Intl\Intl;
use Symfony\Component\Intl\Locale\Locale;

/**
 * Alias of {@link \Symfony\Component\Intl\Locale\Locale}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\Locale\Locale} and
 *             {@link \Symfony\Component\Intl\Intl} instead.
 */
class StubLocale extends Locale
{
    /**
     * Caches the currencies
     *
     * @var array
     */
    protected static $currencies;

    /**
     * Caches the currencies names
     *
     * @var array
     */
    protected static $currenciesNames;

    /**
     * Returns the currencies data
     *
     * @param string $locale
     *
     * @return array  The currencies data
     */
    public static function getCurrenciesData($locale)
    {
        if (null === self::$currencies) {
            self::prepareCurrencies($locale);
        }

        return self::$currencies;
    }

    /**
     *  Returns the currencies names for a locale
     *
     * @param string $locale The locale to use for the currencies names
     *
     * @return array                     The currencies names with their codes as keys
     *
     * @throws \InvalidArgumentException  When the locale is different than 'en'
     */
    public static function getDisplayCurrencies($locale)
    {
        if (null === self::$currenciesNames) {
            self::prepareCurrencies($locale);
        }

        return self::$currenciesNames;
    }

    /**
     * Returns all available currencies codes
     *
     * @return array  The currencies codes
     */
    public static function getCurrencies()
    {
        return array_keys(self::getCurrenciesData(self::getDefault()));
    }

    public static function getDataDirectory()
    {
        return IcuData::getResourceDirectory();
    }

    private static function prepareCurrencies($locale)
    {
        self::$currencies = array();
        self::$currenciesNames = array();

        $bundle = Intl::getCurrencyBundle();

        foreach ($bundle->getCurrencyNames($locale) as $currency => $name) {
            self::$currencies[$currency] = array(
                'name' => $name,
                'symbol' => $bundle->getCurrencySymbol($currency, $locale),
                'fractionDigits' => $bundle->getFractionDigits($currency),
                'roundingIncrement' => $bundle->getRoundingIncrement($currency)
            );
            self::$currenciesNames[$currency] = $name;
        }
    }
}
PK;_�\�C��/pear/Symfony/Component/Locale/Stub/StubIntl.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub;

use Symfony\Component\Intl\Globals\IntlGlobals;

/**
 * Alias of {@link \Symfony\Component\Intl\Globals\IntlGlobals}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\Globals\IntlGlobals} instead.
 */
abstract class StubIntl extends IntlGlobals
{
}
PK;_�\&�����:pear/Symfony/Component/Locale/Stub/StubNumberFormatter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub;

use Symfony\Component\Intl\NumberFormatter\NumberFormatter;

/**
 * Alias of {@link \Symfony\Component\Intl\NumberFormatter\NumberFormatter}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\NumberFormatter\NumberFormatter}
 *             instead.
 */
class StubNumberFormatter extends NumberFormatter
{
}
PK<_�\��Epear/Symfony/Component/Locale/Stub/DateFormat/Hour2400Transformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\Hour2400Transformer as BaseHour2400Transformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\Hour2400Transformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\Hour2400Transformer}
 *             instead.
 */
class Hour2400Transformer extends BaseHour2400Transformer
{
}
PK<_�\g[epCpear/Symfony/Component/Locale/Stub/DateFormat/MinuteTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\MinuteTransformer as BaseMinuteTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\MinuteTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\MinuteTransformer}
 *             instead.
 */
class MinuteTransformer extends BaseMinuteTransformer
{
}
PK=_�\9�uEpear/Symfony/Component/Locale/Stub/DateFormat/Hour1200Transformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\Hour1200Transformer as BaseHour1200Transformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\Hour1200Transformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\Hour1200Transformer}
 *             instead.
 */
class Hour1200Transformer extends BaseHour1200Transformer
{
}
PK=_�\�����@pear/Symfony/Component/Locale/Stub/DateFormat/DayTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\DayTransformer as BaseDayTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\DayTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\DayTransformer}
 *             instead.
 */
class DayTransformer extends BaseDayTransformer
{
}
PK@_�\�Ed��=pear/Symfony/Component/Locale/Stub/DateFormat/Transformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\Transformer as BaseTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\Transformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\Transformer}
 *             instead.
 */
abstract class Transformer extends BaseTransformer
{
}
PK@_�\k�HApear/Symfony/Component/Locale/Stub/DateFormat/FullTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\FullTransformer as BaseFullTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\FullTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\FullTransformer}
 *             instead.
 */
class FullTransformer extends BaseFullTransformer
{
}
PKA_�\�3�XCpear/Symfony/Component/Locale/Stub/DateFormat/SecondTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\SecondTransformer as BaseSecondTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\SecondTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\SecondTransformer}
 *             instead.
 */
class SecondTransformer extends BaseSecondTransformer
{
}
PKA_�\t�z

Bpear/Symfony/Component/Locale/Stub/DateFormat/MonthTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\MonthTransformer as BaseMonthTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\MonthTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\MonthTransformer}
 *             instead.
 */
class MonthTransformer extends BaseMonthTransformer
{
}
PKB_�\:6""Fpear/Symfony/Component/Locale/Stub/DateFormat/DayOfWeekTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\DayOfWeekTransformer as BaseDayOfWeekTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\DayOfWeekTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\DayOfWeekTransformer}
 *             instead.
 */
class DayOfWeekTransformer extends BaseDayOfWeekTransformer
{
}
PKB_�\}��""Fpear/Symfony/Component/Locale/Stub/DateFormat/DayOfYearTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\DayOfYearTransformer as BaseDayOfYearTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\DayOfYearTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\DayOfYearTransformer}
 *             instead.
 */
class DayOfYearTransformer extends BaseDayOfYearTransformer
{
}
PKC_�\v/�Epear/Symfony/Component/Locale/Stub/DateFormat/Hour2401Transformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\Hour2401Transformer as BaseHour2401Transformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\Hour2401Transformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\Hour2401Transformer}
 *             instead.
 */
class Hour2401Transformer extends BaseHour2401Transformer
{
}
PKC_�\k&"MEpear/Symfony/Component/Locale/Stub/DateFormat/Hour1201Transformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\Hour1201Transformer as BaseHour1201Transformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\Hour1201Transformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\Hour1201Transformer}
 *             instead.
 */
class Hour1201Transformer extends BaseHour1201Transformer
{
}
PKD_�\��SEpear/Symfony/Component/Locale/Stub/DateFormat/TimeZoneTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\TimeZoneTransformer as BaseTimeZoneTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\TimeZoneTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\TimeZoneTransformer}
 *             instead.
 */
class TimeZoneTransformer extends BaseTimeZoneTransformer
{
}
PKD_�\�
�

Apear/Symfony/Component/Locale/Stub/DateFormat/HourTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\HourTransformer as BaseHourTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\HourTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\HourTransformer}
 *             instead.
 */
abstract class HourTransformer extends BaseHourTransformer
{
}
PKE_�\���Apear/Symfony/Component/Locale/Stub/DateFormat/YearTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\YearTransformer as BaseYearTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\YearTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\YearTransformer}
 *             instead.
 */
class YearTransformer extends BaseYearTransformer
{
}
PKE_�\�X�Apear/Symfony/Component/Locale/Stub/DateFormat/AmPmTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\AmPmTransformer as BaseAmPmTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\AmPmTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\AmPmTransformer}
 *             instead.
 */
class AmPmTransformer extends BaseAmPmTransformer
{
}
PKF_�\mўDpear/Symfony/Component/Locale/Stub/DateFormat/QuarterTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub\DateFormat;

use Symfony\Component\Intl\DateFormatter\DateFormat\QuarterTransformer as BaseQuarterTransformer;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\DateFormat\QuarterTransformer}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\DateFormat\QuarterTransformer}
 *             instead.
 */
class QuarterTransformer extends BaseQuarterTransformer
{
}
PKF_�\���?��3pear/Symfony/Component/Locale/Stub/StubCollator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub;

use Symfony\Component\Intl\Collator\Collator;

/**
 * Alias of {@link \Symfony\Component\Intl\Collator\Collator}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\Collator\Collator} instead.
 */
class StubCollator extends Collator
{
}
PKF_�\� S���<pear/Symfony/Component/Locale/Stub/StubIntlDateFormatter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Stub;

use Symfony\Component\Intl\DateFormatter\IntlDateFormatter;

/**
 * Alias of {@link \Symfony\Component\Intl\DateFormatter\IntlDateFormatter}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\DateFormatter\IntlDateFormatter}
 *             instead.
 */
class StubIntlDateFormatter extends IntlDateFormatter
{
}
PKG_�\FP�PP,pear/Symfony/Component/Locale/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Locale\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PKG_�\���ssVpear/Symfony/Component/Locale/Exception/MethodArgumentValueNotImplementedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Exception;

use Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException as BaseMethodArgumentValueNotImplementedException;

/**
 * Alias of {@link \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException}
 *             instead.
 */
class MethodArgumentValueNotImplementedException extends BaseMethodArgumentValueNotImplementedException
{
}
PKH_�\�Q�UUQpear/Symfony/Component/Locale/Exception/MethodArgumentNotImplementedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Exception;

use Symfony\Component\Intl\Exception\MethodArgumentNotImplementedException as BaseMethodArgumentNotImplementedException;

/**
 * Alias of {@link \Symfony\Component\Intl\Exception\MethodArgumentNotImplementedException}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\Exception\MethodArgumentNotImplementedException}
 *             instead.
 */
class MethodArgumentNotImplementedException extends BaseMethodArgumentNotImplementedException
{
}
PKI_�\��ECpear/Symfony/Component/Locale/Exception/NotImplementedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Exception;

use Symfony\Component\Intl\Exception\NotImplementedException as BaseNotImplementedException;

/**
 * Alias of {@link \Symfony\Component\Intl\Exception\NotImplementedException}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\Exception\NotImplementedException}
 *             instead.
 */
class NotImplementedException extends BaseNotImplementedException
{
}
PKI_�\S�?a%%Ipear/Symfony/Component/Locale/Exception/MethodNotImplementedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Exception;

use Symfony\Component\Intl\Exception\MethodNotImplementedException as BaseMethodNotImplementedException;

/**
 * Alias of {@link \Symfony\Component\Intl\Exception\MethodNotImplementedException}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Intl\Exception\MethodNotImplementedException}
 *             instead.
 */
class MethodNotImplementedException extends BaseMethodNotImplementedException
{
}
PKJ_�\l�l��(pear/Symfony/Component/Locale/Locale.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale;

use Symfony\Component\Icu\IcuData;
use Symfony\Component\Intl\Intl;

/**
 * Helper class for dealing with locale strings.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link \Locale} and {@link \Symfony\Component\Intl\Intl} instead.
 */
class Locale extends \Locale
{
    /**
     * Caches the countries in different locales
     * @var array
     */
    protected static $countries = array();

    /**
     * Caches the languages in different locales
     * @var array
     */
    protected static $languages = array();

    /**
     * Caches the different locales
     * @var array
     */
    protected static $locales = array();

    /**
     * Returns the country names for a locale
     *
     * @param string $locale The locale to use for the country names
     *
     * @return array              The country names with their codes as keys
     *
     * @throws \RuntimeException  When the resource bundles cannot be loaded
     */
    public static function getDisplayCountries($locale)
    {
        if (!isset(self::$countries[$locale])) {
            self::$countries[$locale] = Intl::getRegionBundle()->getCountryNames($locale);
        }

        return self::$countries[$locale];
    }

    /**
     * Returns all available country codes
     *
     * @return array              The country codes
     *
     * @throws \RuntimeException  When the resource bundles cannot be loaded
     */
    public static function getCountries()
    {
        return array_keys(self::getDisplayCountries(self::getDefault()));
    }

    /**
     * Returns the language names for a locale
     *
     * @param string $locale The locale to use for the language names
     *
     * @return array              The language names with their codes as keys
     *
     * @throws \RuntimeException  When the resource bundles cannot be loaded
     */
    public static function getDisplayLanguages($locale)
    {
        if (!isset(self::$languages[$locale])) {
            self::$languages[$locale] = Intl::getLanguageBundle()->getLanguageNames($locale);
        }

        return self::$languages[$locale];
    }

    /**
     * Returns all available language codes
     *
     * @return array              The language codes
     *
     * @throws \RuntimeException  When the resource bundles cannot be loaded
     */
    public static function getLanguages()
    {
        return array_keys(self::getDisplayLanguages(self::getDefault()));
    }

    /**
     * Returns the locale names for a locale
     *
     * @param string $locale The locale to use for the locale names
     *
     * @return array              The locale names with their codes as keys
     *
     * @throws \RuntimeException  When the resource bundles cannot be loaded
     */
    public static function getDisplayLocales($locale)
    {
        if (!isset(self::$locales[$locale])) {
            self::$locales[$locale] = Intl::getLocaleBundle()->getLocaleNames($locale);
        }

        return self::$locales[$locale];
    }

    /**
     * Returns all available locale codes
     *
     * @return array              The locale codes
     *
     * @throws \RuntimeException  When the resource bundles cannot be loaded
     */
    public static function getLocales()
    {
        return array_keys(self::getDisplayLocales(self::getDefault()));
    }

    /**
     * Returns the ICU version as defined by the intl extension
     *
     * @return string|null The ICU version
     */
    public static function getIntlIcuVersion()
    {
        return Intl::getIcuVersion();
    }

    /**
     * Returns the ICU Data version as defined by the intl extension
     *
     * @return string|null The ICU Data version
     */
    public static function getIntlIcuDataVersion()
    {
        return Intl::getIcuDataVersion();
    }

    /**
     * Returns the ICU data version that ships with Symfony. If the environment variable USE_INTL_ICU_DATA_VERSION is
     * defined, it will try use the ICU data version as defined by the intl extension, if available.
     *
     * @return string The ICU data version that ships with Symfony
     */
    public static function getIcuDataVersion()
    {
        return Intl::getIcuDataVersion();
    }

    /**
     * Returns the directory path of the ICU data that ships with Symfony
     *
     * @return string The path to the ICU data directory
     */
    public static function getIcuDataDirectory()
    {
        return IcuData::getResourceDirectory();
    }

    /**
     * Returns the fallback locale for a given locale, if any
     *
     * @param string $locale The locale to find the fallback for.
     *
     * @return string|null The fallback locale, or null if no parent exists
     */
    protected static function getFallbackLocale($locale)
    {
        if (false === $pos = strrpos($locale, '_')) {
            return null;
        }

        return substr($locale, 0, $pos);
    }
}
PKJ_�\lO�ݫ�5pear/Symfony/Component/ClassLoader/ApcClassLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * ApcClassLoader implements a wrapping autoloader cached in APC for PHP 5.3.
 *
 * It expects an object implementing a findFile method to find the file. This
 * allow using it as a wrapper around the other loaders of the component (the
 * ClassLoader and the UniversalClassLoader for instance) but also around any
 * other autoloader following this convention (the Composer one for instance)
 *
 *     $loader = new ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     $cachedLoader = new ApcClassLoader('my_prefix', $loader);
 *
 *     // activate the cached autoloader
 *     $cachedLoader->register();
 *
 *     // eventually deactivate the non-cached loader if it was registered previously
 *     // to be sure to use the cached one.
 *     $loader->unregister();
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Kris Wallsmith <kris@symfony.com>
 *
 * @api
 */
class ApcClassLoader
{
    private $prefix;

    /**
     * The class loader object being decorated.
     *
     * @var \Symfony\Component\ClassLoader\ClassLoader
     *   A class loader object that implements the findFile() method.
     */
    protected $decorated;

    /**
     * Constructor.
     *
     * @param string $prefix      The APC namespace prefix to use.
     * @param object $decorated   A class loader object that implements the findFile() method.
     *
     * @throws \RuntimeException
     * @throws \InvalidArgumentException
     *
     * @api
     */
    public function __construct($prefix, $decorated)
    {
        if (!extension_loaded('apc')) {
            throw new \RuntimeException('Unable to use ApcClassLoader as APC is not enabled.');
        }

        if (!method_exists($decorated, 'findFile')) {
            throw new \InvalidArgumentException('The class finder must implement a "findFile" method.');
        }

        $this->prefix = $prefix;
        $this->decorated = $decorated;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param Boolean $prepend Whether to prepend the autoloader or not
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

    /**
     * Unregisters this instance as an autoloader.
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));
    }

    /**
     * Loads the given class or interface.
     *
     * @param string $class The name of the class
     *
     * @return Boolean|null True, if loaded
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            require $file;

            return true;
        }
    }

    /**
     * Finds a file by class name while caching lookups to APC.
     *
     * @param string $class A class name to resolve to file
     *
     * @return string|null
     */
    public function findFile($class)
    {
        if (false === $file = apc_fetch($this->prefix.$class)) {
            apc_store($this->prefix.$class, $file = $this->decorated->findFile($class));
        }

        return $file;
    }

    /**
     * Passes through all unknown calls onto the decorated object.
     */
    public function __call($method, $args)
    {
        return call_user_func_array(array($this->decorated, $method), $args);
    }

}
PKK_�\�a.e"e";pear/Symfony/Component/ClassLoader/UniversalClassLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * UniversalClassLoader implements a "universal" autoloader for PHP 5.3.
 *
 * It is able to load classes that use either:
 *
 *  * The technical interoperability standards for PHP 5.3 namespaces and
 *    class names (https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md);
 *
 *  * The PEAR naming convention for classes (http://pear.php.net/).
 *
 * Classes from a sub-namespace or a sub-hierarchy of PEAR classes can be
 * looked for in a list of locations to ease the vendoring of a sub-set of
 * classes for large projects.
 *
 * Example usage:
 *
 *     $loader = new UniversalClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->registerNamespaces(array(
 *         'Symfony\Component' => __DIR__.'/component',
 *         'Symfony'           => __DIR__.'/framework',
 *         'Sensio'            => array(__DIR__.'/src', __DIR__.'/vendor'),
 *     ));
 *
 *     // register a library using the PEAR naming convention
 *     $loader->registerPrefixes(array(
 *         'Swift_' => __DIR__.'/Swift',
 *     ));
 *
 *
 *     // to enable searching the include path (e.g. for PEAR packages)
 *     $loader->useIncludePath(true);
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class UniversalClassLoader
{
    private $namespaces = array();
    private $prefixes = array();
    private $namespaceFallbacks = array();
    private $prefixFallbacks = array();
    private $useIncludePath = false;

    /**
     * Turns on searching the include for class files. Allows easy loading
     * of installed PEAR packages
     *
     * @param Boolean $useIncludePath
     */
    public function useIncludePath($useIncludePath)
    {
        $this->useIncludePath = $useIncludePath;
    }

    /**
     * Can be used to check if the autoloader uses the include path to check
     * for classes.
     *
     * @return Boolean
     */
    public function getUseIncludePath()
    {
        return $this->useIncludePath;
    }

    /**
     * Gets the configured namespaces.
     *
     * @return array A hash with namespaces as keys and directories as values
     */
    public function getNamespaces()
    {
        return $this->namespaces;
    }

    /**
     * Gets the configured class prefixes.
     *
     * @return array A hash with class prefixes as keys and directories as values
     */
    public function getPrefixes()
    {
        return $this->prefixes;
    }

    /**
     * Gets the directory(ies) to use as a fallback for namespaces.
     *
     * @return array An array of directories
     */
    public function getNamespaceFallbacks()
    {
        return $this->namespaceFallbacks;
    }

    /**
     * Gets the directory(ies) to use as a fallback for class prefixes.
     *
     * @return array An array of directories
     */
    public function getPrefixFallbacks()
    {
        return $this->prefixFallbacks;
    }

    /**
     * Registers the directory to use as a fallback for namespaces.
     *
     * @param array $dirs An array of directories
     *
     * @api
     */
    public function registerNamespaceFallbacks(array $dirs)
    {
        $this->namespaceFallbacks = $dirs;
    }

    /**
     * Registers a directory to use as a fallback for namespaces.
     *
     * @param string $dir A directory
     */
    public function registerNamespaceFallback($dir)
    {
        $this->namespaceFallbacks[] = $dir;
    }

    /**
     * Registers directories to use as a fallback for class prefixes.
     *
     * @param array $dirs An array of directories
     *
     * @api
     */
    public function registerPrefixFallbacks(array $dirs)
    {
        $this->prefixFallbacks = $dirs;
    }

    /**
     * Registers a directory to use as a fallback for class prefixes.
     *
     * @param string $dir A directory
     */
    public function registerPrefixFallback($dir)
    {
        $this->prefixFallbacks[] = $dir;
    }

    /**
     * Registers an array of namespaces
     *
     * @param array $namespaces An array of namespaces (namespaces as keys and locations as values)
     *
     * @api
     */
    public function registerNamespaces(array $namespaces)
    {
        foreach ($namespaces as $namespace => $locations) {
            $this->namespaces[$namespace] = (array) $locations;
        }
    }

    /**
     * Registers a namespace.
     *
     * @param string       $namespace The namespace
     * @param array|string $paths     The location(s) of the namespace
     *
     * @api
     */
    public function registerNamespace($namespace, $paths)
    {
        $this->namespaces[$namespace] = (array) $paths;
    }

    /**
     * Registers an array of classes using the PEAR naming convention.
     *
     * @param array $classes An array of classes (prefixes as keys and locations as values)
     *
     * @api
     */
    public function registerPrefixes(array $classes)
    {
        foreach ($classes as $prefix => $locations) {
            $this->prefixes[$prefix] = (array) $locations;
        }
    }

    /**
     * Registers a set of classes using the PEAR naming convention.
     *
     * @param string       $prefix The classes prefix
     * @param array|string $paths  The location(s) of the classes
     *
     * @api
     */
    public function registerPrefix($prefix, $paths)
    {
        $this->prefixes[$prefix] = (array) $paths;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param Boolean $prepend Whether to prepend the autoloader or not
     *
     * @api
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

    /**
     * Loads the given class or interface.
     *
     * @param string $class The name of the class
     *
     * @return Boolean|null True, if loaded
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            require $file;

            return true;
        }
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|null The path, if found
     */
    public function findFile($class)
    {
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $namespace = substr($class, 0, $pos);
            $className = substr($class, $pos + 1);
            $normalizedClass = str_replace('\\', DIRECTORY_SEPARATOR, $namespace).DIRECTORY_SEPARATOR.str_replace('_', DIRECTORY_SEPARATOR, $className).'.php';
            foreach ($this->namespaces as $ns => $dirs) {
                if (0 !== strpos($namespace, $ns)) {
                    continue;
                }

                foreach ($dirs as $dir) {
                    $file = $dir.DIRECTORY_SEPARATOR.$normalizedClass;
                    if (is_file($file)) {
                        return $file;
                    }
                }
            }

            foreach ($this->namespaceFallbacks as $dir) {
                $file = $dir.DIRECTORY_SEPARATOR.$normalizedClass;
                if (is_file($file)) {
                    return $file;
                }
            }

        } else {
            // PEAR-like class name
            $normalizedClass = str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';
            foreach ($this->prefixes as $prefix => $dirs) {
                if (0 !== strpos($class, $prefix)) {
                    continue;
                }

                foreach ($dirs as $dir) {
                    $file = $dir.DIRECTORY_SEPARATOR.$normalizedClass;
                    if (is_file($file)) {
                        return $file;
                    }
                }
            }

            foreach ($this->prefixFallbacks as $dir) {
                $file = $dir.DIRECTORY_SEPARATOR.$normalizedClass;
                if (is_file($file)) {
                    return $file;
                }
            }
        }

        if ($this->useIncludePath && $file = stream_resolve_include_path($normalizedClass)) {
            return $file;
        }
    }
}
PKL_�\�?wy�
�
8pear/Symfony/Component/ClassLoader/ClassMapGenerator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * ClassMapGenerator
 *
 * @author Gyula Sallai <salla016@gmail.com>
 */
class ClassMapGenerator
{
    /**
     * Generate a class map file
     *
     * @param array|string $dirs Directories or a single path to search in
     * @param string       $file The name of the class map file
     */
    public static function dump($dirs, $file)
    {
        $dirs = (array) $dirs;
        $maps = array();

        foreach ($dirs as $dir) {
            $maps = array_merge($maps, static::createMap($dir));
        }

        file_put_contents($file, sprintf('<?php return %s;', var_export($maps, true)));
    }

    /**
     * Iterate over all files in the given directory searching for classes
     *
     * @param \Iterator|string $dir The directory to search in or an iterator
     *
     * @return array A class map array
     */
    public static function createMap($dir)
    {
        if (is_string($dir)) {
            $dir = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir));
        }

        $map = array();

        foreach ($dir as $file) {
            if (!$file->isFile()) {
                continue;
            }

            $path = $file->getRealPath();

            if (pathinfo($path, PATHINFO_EXTENSION) !== 'php') {
                continue;
            }

            $classes = self::findClasses($path);

            foreach ($classes as $class) {
                $map[$class] = $path;
            }

        }

        return $map;
    }

    /**
     * Extract the classes in the given file
     *
     * @param string $path The file to check
     *
     * @return array The found classes
     */
    private static function findClasses($path)
    {
        $contents = file_get_contents($path);
        $tokens   = token_get_all($contents);
        $T_TRAIT  = version_compare(PHP_VERSION, '5.4', '<') ? -1 : T_TRAIT;

        $classes = array();

        $namespace = '';
        for ($i = 0, $max = count($tokens); $i < $max; $i++) {
            $token = $tokens[$i];

            if (is_string($token)) {
                continue;
            }

            $class = '';

            switch ($token[0]) {
                case T_NAMESPACE:
                    $namespace = '';
                    // If there is a namespace, extract it
                    while (($t = $tokens[++$i]) && is_array($t)) {
                        if (in_array($t[0], array(T_STRING, T_NS_SEPARATOR))) {
                            $namespace .= $t[1];
                        }
                    }
                    $namespace .= '\\';
                    break;
                case T_CLASS:
                case T_INTERFACE:
                case $T_TRAIT:
                    // Find the classname
                    while (($t = $tokens[++$i]) && is_array($t)) {
                        if (T_STRING === $t[0]) {
                            $class .= $t[1];
                        } elseif ($class !== '' && T_WHITESPACE == $t[0]) {
                            break;
                        }
                    }

                    $classes[] = ltrim($namespace.$class, '\\');
                    break;
                default:
                    break;
            }
        }

        return $classes;
    }
}
PKL_�\��PЩ
�
8pear/Symfony/Component/ClassLoader/XcacheClassLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * XcacheClassLoader implements a wrapping autoloader cached in Xcache for PHP 5.3.
 *
 * It expects an object implementing a findFile method to find the file. This
 * allows using it as a wrapper around the other loaders of the component (the
 * ClassLoader and the UniversalClassLoader for instance) but also around any
 * other autoloader following this convention (the Composer one for instance)
 *
 *     $loader = new ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     $cachedLoader = new XcacheClassLoader('my_prefix', $loader);
 *
 *     // activate the cached autoloader
 *     $cachedLoader->register();
 *
 *     // eventually deactivate the non-cached loader if it was registered previously
 *     // to be sure to use the cached one.
 *     $loader->unregister();
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Kris Wallsmith <kris@symfony.com>
 * @author Kim Hemsø Rasmussen <kimhemsoe@gmail.com>
 *
 * @api
 */
class XcacheClassLoader
{
    private $prefix;
    private $classFinder;

    /**
     * Constructor.
     *
     * @param string $prefix      A prefix to create a namespace in Xcache
     * @param object $classFinder An object that implements findFile() method.
     *
     * @throws \RuntimeException
     * @throws \InvalidArgumentException
     *
     * @api
     */
    public function __construct($prefix, $classFinder)
    {
        if (!extension_loaded('Xcache')) {
            throw new \RuntimeException('Unable to use XcacheClassLoader as Xcache is not enabled.');
        }

        if (!method_exists($classFinder, 'findFile')) {
            throw new \InvalidArgumentException('The class finder must implement a "findFile" method.');
        }

        $this->prefix = $prefix;
        $this->classFinder = $classFinder;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param Boolean $prepend Whether to prepend the autoloader or not
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

    /**
     * Unregisters this instance as an autoloader.
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));
    }

    /**
     * Loads the given class or interface.
     *
     * @param string $class The name of the class
     *
     * @return Boolean|null True, if loaded
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            require $file;

            return true;
        }
    }

    /**
     * Finds a file by class name while caching lookups to Xcache.
     *
     * @param string $class A class name to resolve to file
     *
     * @return string|null
     */
    public function findFile($class)
    {
        if (xcache_isset($this->prefix.$class)) {
            $file = xcache_get($this->prefix.$class);
        } else {
            $file = $this->classFinder->findFile($class);
            xcache_set($this->prefix.$class, $file);
        }

        return $file;
    }
}
PKL_�\��O���:pear/Symfony/Component/ClassLoader/WinCacheClassLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * WinCacheClassLoader implements a wrapping autoloader cached in WinCache.
 *
 * It expects an object implementing a findFile method to find the file. This
 * allow using it as a wrapper around the other loaders of the component (the
 * ClassLoader and the UniversalClassLoader for instance) but also around any
 * other autoloader following this convention (the Composer one for instance)
 *
 *     $loader = new ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->add('Symfony\Component', __DIR__.'/component');
 *     $loader->add('Symfony',           __DIR__.'/framework');
 *
 *     $cachedLoader = new WinCacheClassLoader('my_prefix', $loader);
 *
 *     // activate the cached autoloader
 *     $cachedLoader->register();
 *
 *     // eventually deactivate the non-cached loader if it was registered previously
 *     // to be sure to use the cached one.
 *     $loader->unregister();
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Kris Wallsmith <kris@symfony.com>
 * @author Artem Ryzhkov <artem@smart-core.org>
 */
class WinCacheClassLoader
{
    private $prefix;

    /**
     * The class loader object being decorated.
     *
     * @var \Symfony\Component\ClassLoader\ClassLoader
     *   A class loader object that implements the findFile() method.
     */
    protected $decorated;

    /**
     * Constructor.
     *
     * @param string $prefix      The WinCache namespace prefix to use.
     * @param object $decorated   A class loader object that implements the findFile() method.
     *
     * @throws \RuntimeException
     * @throws \InvalidArgumentException
     */
    public function __construct($prefix, $decorated)
    {
        if (!extension_loaded('wincache')) {
            throw new \RuntimeException('Unable to use WinCacheClassLoader as WinCache is not enabled.');
        }

        if (!method_exists($decorated, 'findFile')) {
            throw new \InvalidArgumentException('The class finder must implement a "findFile" method.');
        }

        $this->prefix = $prefix;
        $this->decorated = $decorated;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param Boolean $prepend Whether to prepend the autoloader or not
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

    /**
     * Unregisters this instance as an autoloader.
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));
    }

    /**
     * Loads the given class or interface.
     *
     * @param string $class The name of the class
     *
     * @return Boolean|null True, if loaded
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            require $file;

            return true;
        }
    }

    /**
     * Finds a file by class name while caching lookups to WinCache.
     *
     * @param string $class A class name to resolve to file
     *
     * @return string|null
     */
    public function findFile($class)
    {
        if (false === $file = wincache_ucache_get($this->prefix.$class)) {
            wincache_ucache_set($this->prefix.$class, $file = $this->decorated->findFile($class), 0);
        }

        return $file;
    }

    /**
     * Passes through all unknown calls onto the decorated object.
     */
    public function __call($method, $args)
    {
        return call_user_func_array(array($this->decorated, $method), $args);
    }
}
PKM_�\v��'��2pear/Symfony/Component/ClassLoader/ClassLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * ClassLoader implements an PSR-0 class loader
 *
 * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
 *
 *     $loader = new ClassLoader();
 *
 *     // register classes with namespaces
 *     $loader->addPrefix('Symfony\Component', __DIR__.'/component');
 *     $loader->addPrefix('Symfony',           __DIR__.'/framework');
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 *     // to enable searching the include path (e.g. for PEAR packages)
 *     $loader->setUseIncludePath(true);
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class ClassLoader
{
    private $prefixes = array();
    private $fallbackDirs = array();
    private $useIncludePath = false;

    /**
     * Returns prefixes.
     *
     * @return array
     */
    public function getPrefixes()
    {
        return $this->prefixes;
    }

    /**
     * Returns fallback directories.
     *
     * @return array
     */
    public function getFallbackDirs()
    {
        return $this->fallbackDirs;
    }

    /**
     * Adds prefixes.
     *
     * @param array $prefixes Prefixes to add
     */
    public function addPrefixes(array $prefixes)
    {
        foreach ($prefixes as $prefix => $path) {
            $this->addPrefix($prefix, $path);
        }
    }

    /**
     * Registers a set of classes
     *
     * @param string       $prefix The classes prefix
     * @param array|string $paths  The location(s) of the classes
     */
    public function addPrefix($prefix, $paths)
    {
        if (!$prefix) {
            foreach ((array) $paths as $path) {
                $this->fallbackDirs[] = $path;
            }

            return;
        }
        if (isset($this->prefixes[$prefix])) {
            $this->prefixes[$prefix] = array_merge(
                $this->prefixes[$prefix],
                (array) $paths
            );
        } else {
            $this->prefixes[$prefix] = (array) $paths;
        }
    }

    /**
     * Turns on searching the include for class files.
     *
     * @param Boolean $useIncludePath
     */
    public function setUseIncludePath($useIncludePath)
    {
        $this->useIncludePath = $useIncludePath;
    }

    /**
     * Can be used to check if the autoloader uses the include path to check
     * for classes.
     *
     * @return Boolean
     */
    public function getUseIncludePath()
    {
        return $this->useIncludePath;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param Boolean $prepend Whether to prepend the autoloader or not
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

    /**
     * Unregisters this instance as an autoloader.
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));
    }

    /**
     * Loads the given class or interface.
     *
     * @param string $class The name of the class
     *
     * @return Boolean|null True, if loaded
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            require $file;

            return true;
        }
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|null The path, if found
     */
    public function findFile($class)
    {
        if (false !== $pos = strrpos($class, '\\')) {
            // namespaced class name
            $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos)).DIRECTORY_SEPARATOR;
            $className = substr($class, $pos + 1);
        } else {
            // PEAR-like class name
            $classPath = null;
            $className = $class;
        }

        $classPath .= str_replace('_', DIRECTORY_SEPARATOR, $className).'.php';

        foreach ($this->prefixes as $prefix => $dirs) {
            if ($class === strstr($class, $prefix)) {
                foreach ($dirs as $dir) {
                    if (file_exists($dir.DIRECTORY_SEPARATOR.$classPath)) {
                        return $dir.DIRECTORY_SEPARATOR.$classPath;
                    }
                }
            }
        }

        foreach ($this->fallbackDirs as $dir) {
            if (file_exists($dir.DIRECTORY_SEPARATOR.$classPath)) {
                return $dir.DIRECTORY_SEPARATOR.$classPath;
            }
        }

        if ($this->useIncludePath && $file = stream_resolve_include_path($classPath)) {
            return $file;
        }
    }
}
PKM_�\"�K�UU1pear/Symfony/Component/ClassLoader/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\ClassLoader\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PKN_�\���a��>pear/Symfony/Component/ClassLoader/ApcUniversalClassLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * ApcUniversalClassLoader implements a "universal" autoloader cached in APC for PHP 5.3.
 *
 * It is able to load classes that use either:
 *
 *  * The technical interoperability standards for PHP 5.3 namespaces and
 *    class names (https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md);
 *
 *  * The PEAR naming convention for classes (http://pear.php.net/).
 *
 * Classes from a sub-namespace or a sub-hierarchy of PEAR classes can be
 * looked for in a list of locations to ease the vendoring of a sub-set of
 * classes for large projects.
 *
 * Example usage:
 *
 *     require 'vendor/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
 *     require 'vendor/symfony/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';
 *
 *     use Symfony\Component\ClassLoader\ApcUniversalClassLoader;
 *
 *     $loader = new ApcUniversalClassLoader('apc.prefix.');
 *
 *     // register classes with namespaces
 *     $loader->registerNamespaces(array(
 *         'Symfony\Component' => __DIR__.'/component',
 *         'Symfony'           => __DIR__.'/framework',
 *         'Sensio'            => array(__DIR__.'/src', __DIR__.'/vendor'),
 *     ));
 *
 *     // register a library using the PEAR naming convention
 *     $loader->registerPrefixes(array(
 *         'Swift_' => __DIR__.'/Swift',
 *     ));
 *
 *     // activate the autoloader
 *     $loader->register();
 *
 * In this example, if you try to use a class in the Symfony\Component
 * namespace or one of its children (Symfony\Component\Console for instance),
 * the autoloader will first look for the class under the component/
 * directory, and it will then fallback to the framework/ directory if not
 * found before giving up.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Kris Wallsmith <kris@symfony.com>
 *
 * @api
 */
class ApcUniversalClassLoader extends UniversalClassLoader
{
    private $prefix;

    /**
     * Constructor.
     *
     * @param string $prefix A prefix to create a namespace in APC
     *
     * @throws \RuntimeException
     *
     * @api
     */
    public function __construct($prefix)
    {
        if (!extension_loaded('apc')) {
            throw new \RuntimeException('Unable to use ApcUniversalClassLoader as APC is not enabled.');
        }

        $this->prefix = $prefix;
    }

    /**
     * Finds a file by class name while caching lookups to APC.
     *
     * @param string $class A class name to resolve to file
     *
     * @return string|null The path, if found
     */
    public function findFile($class)
    {
        if (false === $file = apc_fetch($this->prefix.$class)) {
            apc_store($this->prefix.$class, $file = parent::findFile($class));
        }

        return $file;
    }
}
PKN_�\�v�	.	.<pear/Symfony/Component/ClassLoader/ClassCollectionLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * ClassCollectionLoader.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ClassCollectionLoader
{
    private static $loaded;
    private static $seen;
    private static $useTokenizer = true;

    /**
     * Loads a list of classes and caches them in one big file.
     *
     * @param array   $classes    An array of classes to load
     * @param string  $cacheDir   A cache directory
     * @param string  $name       The cache name prefix
     * @param Boolean $autoReload Whether to flush the cache when the cache is stale or not
     * @param Boolean $adaptive   Whether to remove already declared classes or not
     * @param string  $extension  File extension of the resulting file
     *
     * @throws \InvalidArgumentException When class can't be loaded
     */
    public static function load($classes, $cacheDir, $name, $autoReload, $adaptive = false, $extension = '.php')
    {
        // each $name can only be loaded once per PHP process
        if (isset(self::$loaded[$name])) {
            return;
        }

        self::$loaded[$name] = true;

        $declared = array_merge(get_declared_classes(), get_declared_interfaces());
        if (function_exists('get_declared_traits')) {
            $declared = array_merge($declared, get_declared_traits());
        }

        if ($adaptive) {
            // don't include already declared classes
            $classes = array_diff($classes, $declared);

            // the cache is different depending on which classes are already declared
            $name = $name.'-'.substr(hash('sha256', implode('|', $classes)), 0, 5);
        }

        $classes = array_unique($classes);

        $cache = $cacheDir.'/'.$name.$extension;

        // auto-reload
        $reload = false;
        if ($autoReload) {
            $metadata = $cache.'.meta';
            if (!is_file($metadata) || !is_file($cache)) {
                $reload = true;
            } else {
                $time = filemtime($cache);
                $meta = unserialize(file_get_contents($metadata));

                sort($meta[1]);
                sort($classes);

                if ($meta[1] != $classes) {
                    $reload = true;
                } else {
                    foreach ($meta[0] as $resource) {
                        if (!is_file($resource) || filemtime($resource) > $time) {
                            $reload = true;

                            break;
                        }
                    }
                }
            }
        }

        if (!$reload && is_file($cache)) {
            require_once $cache;

            return;
        }

        $files = array();
        $content = '';
        foreach (self::getOrderedClasses($classes) as $class) {
            if (in_array($class->getName(), $declared)) {
                continue;
            }

            $files[] = $class->getFileName();

            $c = preg_replace(array('/^\s*<\?php/', '/\?>\s*$/'), '', file_get_contents($class->getFileName()));

            // fakes namespace declaration for global code
            if (!$class->inNamespace()) {
                $c = "\nnamespace\n{\n".$c."\n}\n";
            }

            $c = self::fixNamespaceDeclarations('<?php '.$c);
            $c = preg_replace('/^\s*<\?php/', '', $c);

            $content .= $c;
        }

        // cache the core classes
        if (!is_dir(dirname($cache))) {
            mkdir(dirname($cache), 0777, true);
        }
        self::writeCacheFile($cache, '<?php '.$content);

        if ($autoReload) {
            // save the resources
            self::writeCacheFile($metadata, serialize(array($files, $classes)));
        }
    }

    /**
     * Adds brackets around each namespace if it's not already the case.
     *
     * @param string $source Namespace string
     *
     * @return string Namespaces with brackets
     */
    public static function fixNamespaceDeclarations($source)
    {
        if (!function_exists('token_get_all') || !self::$useTokenizer) {
            if (preg_match('/namespace(.*?)\s*;/', $source)) {
                $source = preg_replace('/namespace(.*?)\s*;/', "namespace$1\n{", $source)."}\n";
            }

            return $source;
        }

        $rawChunk = '';
        $output = '';
        $inNamespace = false;
        $tokens = token_get_all($source);

        for (reset($tokens); false !== $token = current($tokens); next($tokens)) {
            if (is_string($token)) {
                $rawChunk .= $token;
            } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) {
                // strip comments
                continue;
            } elseif (T_NAMESPACE === $token[0]) {
                if ($inNamespace) {
                    $rawChunk .= "}\n";
                }
                $rawChunk .= $token[1];

                // namespace name and whitespaces
                while (($t = next($tokens)) && is_array($t) && in_array($t[0], array(T_WHITESPACE, T_NS_SEPARATOR, T_STRING))) {
                    $rawChunk .= $t[1];
                }
                if ('{' === $t) {
                    $inNamespace = false;
                    prev($tokens);
                } else {
                    $rawChunk = rtrim($rawChunk)."\n{";
                    $inNamespace = true;
                }
            } elseif (T_START_HEREDOC === $token[0]) {
                $output .= self::compressCode($rawChunk).$token[1];
                do {
                    $token = next($tokens);
                    $output .= is_string($token) ? $token : $token[1];
                } while ($token[0] !== T_END_HEREDOC);
                $output .= "\n";
                $rawChunk = '';
            } elseif (T_CONSTANT_ENCAPSED_STRING === $token[0]) {
                $output .= self::compressCode($rawChunk).$token[1];
                $rawChunk = '';
            } else {
                $rawChunk .= $token[1];
            }
        }

        if ($inNamespace) {
            $rawChunk .= "}\n";
        }

        return $output.self::compressCode($rawChunk);
    }

    /**
     * This method is only useful for testing.
     */
    public static function enableTokenizer($bool)
    {
        self::$useTokenizer = (Boolean) $bool;
    }

    /**
     * Strips leading & trailing ws, multiple EOL, multiple ws.
     *
     * @param string $code Original PHP code
     *
     * @return string compressed code
     */
    private static function compressCode($code)
    {
        return preg_replace(
            array('/^\s+/m', '/\s+$/m', '/([\n\r]+ *[\n\r]+)+/', '/[ \t]+/'),
            array('', '', "\n", ' '),
            $code
        );
    }

    /**
     * Writes a cache file.
     *
     * @param string $file    Filename
     * @param string $content Temporary file content
     *
     * @throws \RuntimeException when a cache file cannot be written
     */
    private static function writeCacheFile($file, $content)
    {
        $tmpFile = tempnam(dirname($file), basename($file));
        if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $file)) {
            @chmod($file, 0666 & ~umask());

            return;
        }

        throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $file));
    }

    /**
     * Gets an ordered array of passed classes including all their dependencies.
     *
     * @param array $classes
     *
     * @return \ReflectionClass[] An array of sorted \ReflectionClass instances (dependencies added if needed)
     *
     * @throws \InvalidArgumentException When a class can't be loaded
     */
    private static function getOrderedClasses(array $classes)
    {
        $map = array();
        self::$seen = array();
        foreach ($classes as $class) {
            try {
                $reflectionClass = new \ReflectionClass($class);
            } catch (\ReflectionException $e) {
                throw new \InvalidArgumentException(sprintf('Unable to load class "%s"', $class));
            }

            $map = array_merge($map, self::getClassHierarchy($reflectionClass));
        }

        return $map;
    }

    private static function getClassHierarchy(\ReflectionClass $class)
    {
        if (isset(self::$seen[$class->getName()])) {
            return array();
        }

        self::$seen[$class->getName()] = true;

        $classes = array($class);
        $parent = $class;
        while (($parent = $parent->getParentClass()) && $parent->isUserDefined() && !isset(self::$seen[$parent->getName()])) {
            self::$seen[$parent->getName()] = true;

            array_unshift($classes, $parent);
        }

        $traits = array();

        if (function_exists('get_declared_traits')) {
            foreach ($classes as $c) {
                foreach (self::resolveDependencies(self::computeTraitDeps($c), $c) as $trait) {
                    if ($trait !== $c) {
                        $traits[] = $trait;
                    }
                }
            }
        }

        return array_merge(self::getInterfaces($class), $traits, $classes);
    }

    private static function getInterfaces(\ReflectionClass $class)
    {
        $classes = array();

        foreach ($class->getInterfaces() as $interface) {
            $classes = array_merge($classes, self::getInterfaces($interface));
        }

        if ($class->isUserDefined() && $class->isInterface() && !isset(self::$seen[$class->getName()])) {
            self::$seen[$class->getName()] = true;

            $classes[] = $class;
        }

        return $classes;
    }

    private static function computeTraitDeps(\ReflectionClass $class)
    {
        $traits = $class->getTraits();
        $deps = array($class->getName() => $traits);
        while ($trait = array_pop($traits)) {
            if ($trait->isUserDefined() && !isset(self::$seen[$trait->getName()])) {
                self::$seen[$trait->getName()] = true;
                $traitDeps = $trait->getTraits();
                $deps[$trait->getName()] = $traitDeps;
                $traits = array_merge($traits, $traitDeps);
            }
        }

        return $deps;
    }

    /**
     * Dependencies resolution.
     *
     * This function does not check for circular dependencies as it should never
     * occur with PHP traits.
     *
     * @param array             $tree       The dependency tree
     * @param \ReflectionClass  $node       The node
     * @param \ArrayObject      $resolved   An array of already resolved dependencies
     * @param \ArrayObject      $unresolved An array of dependencies to be resolved
     *
     * @return \ArrayObject The dependencies for the given node
     *
     * @throws \RuntimeException if a circular dependency is detected
     */
    private static function resolveDependencies(array $tree, $node, \ArrayObject $resolved = null, \ArrayObject $unresolved = null)
    {
        if (null === $resolved) {
            $resolved = new \ArrayObject();
        }
        if (null === $unresolved) {
            $unresolved = new \ArrayObject();
        }
        $nodeName = $node->getName();
        $unresolved[$nodeName] = $node;
        foreach ($tree[$nodeName] as $dependency) {
            if (!$resolved->offsetExists($dependency->getName())) {
                self::resolveDependencies($tree, $dependency, $resolved, $unresolved);
            }
        }
        $resolved[$nodeName] = $node;
        unset($unresolved[$nodeName]);

        return $resolved;
    }
}
PKO_�\��A���5pear/Symfony/Component/ClassLoader/MapClassLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * A class loader that uses a mapping file to look up paths.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class MapClassLoader
{
    private $map = array();

    /**
     * Constructor.
     *
     * @param array $map A map where keys are classes and values the absolute file path
     */
    public function __construct(array $map)
    {
        $this->map = $map;
    }

    /**
     * Registers this instance as an autoloader.
     *
     * @param Boolean $prepend Whether to prepend the autoloader or not
     */
    public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

    /**
     * Loads the given class or interface.
     *
     * @param string $class The name of the class
     */
    public function loadClass($class)
    {
        if (isset($this->map[$class])) {
            require $this->map[$class];
        }
    }

    /**
     * Finds the path to the file where the class is defined.
     *
     * @param string $class The name of the class
     *
     * @return string|null The path, if found
     */
    public function findFile($class)
    {
        if (isset($this->map[$class])) {
            return $this->map[$class];
        }
    }
}
PKO_�\��S�

7pear/Symfony/Component/ClassLoader/DebugClassLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * Autoloader checking if the class is really defined in the file found.
 *
 * The DebugClassLoader will wrap all registered autoloaders providing a
 * findFile method and will throw an exception if a file is found but does
 * not declare the class.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Christophe Coevoet <stof@notk.org>
 *
 * @api
 *
 * @deprecated Deprecated since version 2.4, to be removed in 3.0. Use the DebugClassLoader provided by the Debug component instead.
 */
class DebugClassLoader
{
    private $classFinder;

    /**
     * Constructor.
     *
     * @param object $classFinder
     *
     * @api
     */
    public function __construct($classFinder)
    {
        $this->classFinder = $classFinder;
    }

    /**
     * Gets the wrapped class loader.
     *
     * @return object a class loader instance
     */
    public function getClassLoader()
    {
        return $this->classFinder;
    }

    /**
     * Replaces all autoloaders implementing a findFile method by a DebugClassLoader wrapper.
     */
    public static function enable()
    {
        if (!is_array($functions = spl_autoload_functions())) {
            return;
        }

        foreach ($functions as $function) {
            spl_autoload_unregister($function);
        }

        foreach ($functions as $function) {
            if (is_array($function) && !$function[0] instanceof self && method_exists($function[0], 'findFile')) {
                $function = array(new static($function[0]), 'loadClass');
            }

            spl_autoload_register($function);
        }
    }

    /**
     * Unregisters this instance as an autoloader.
     */
    public function unregister()
    {
        spl_autoload_unregister(array($this, 'loadClass'));
    }

    /**
     * Finds a file by class name
     *
     * @param string $class A class name to resolve to file
     *
     * @return string|null
     */
    public function findFile($class)
    {
        return $this->classFinder->findFile($class);
    }

    /**
     * Loads the given class or interface.
     *
     * @param string $class The name of the class
     *
     * @return Boolean|null True, if loaded
     *
     * @throws \RuntimeException
     */
    public function loadClass($class)
    {
        if ($file = $this->classFinder->findFile($class)) {
            require $file;

            if (!class_exists($class, false) && !interface_exists($class, false) && (!function_exists('trait_exists') || !trait_exists($class, false))) {
                if (false !== strpos($class, '/')) {
                    throw new \RuntimeException(sprintf('Trying to autoload a class with an invalid name "%s". Be careful that the namespace separator is "\" in PHP, not "/".', $class));
                }

                throw new \RuntimeException(sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file));
            }

            return true;
        }
    }
}
PKP_�\w�!�))@pear/Symfony/Component/ClassLoader/DebugUniversalClassLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader;

/**
 * Checks that the class is actually declared in the included file.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DebugUniversalClassLoader extends UniversalClassLoader
{
    /**
     * Replaces all regular UniversalClassLoader instances by a DebugUniversalClassLoader ones.
     */
    public static function enable()
    {
        if (!is_array($functions = spl_autoload_functions())) {
            return;
        }

        foreach ($functions as $function) {
            spl_autoload_unregister($function);
        }

        foreach ($functions as $function) {
            if (is_array($function) && $function[0] instanceof UniversalClassLoader) {
                $loader = new static();
                $loader->registerNamespaceFallbacks($function[0]->getNamespaceFallbacks());
                $loader->registerPrefixFallbacks($function[0]->getPrefixFallbacks());
                $loader->registerNamespaces($function[0]->getNamespaces());
                $loader->registerPrefixes($function[0]->getPrefixes());
                $loader->useIncludePath($function[0]->getUseIncludePath());

                $function[0] = $loader;
            }

            spl_autoload_register($function);
        }
    }

    /**
     * {@inheritDoc}
     */
    public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            require $file;

            if (!class_exists($class, false) && !interface_exists($class, false) && (!function_exists('trait_exists') || !trait_exists($class, false))) {
                throw new \RuntimeException(sprintf('The autoloader expected class "%s" to be defined in file "%s". The file was found but the class was not in it, the class name or namespace probably has a typo.', $class, $file));
            }
        }
    }
}
PKP_�\C��oMMRpear/Symfony/Component/DependencyInjection/Extension/PrependExtensionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\DependencyInjection\ContainerBuilder;

interface PrependExtensionInterface
{
    /**
     * Allow an extension to prepend the extension configurations.
     *
     * @param ContainerBuilder $container
     */
    public function prepend(ContainerBuilder $container);
}
PKQ_�\DS�Kpear/Symfony/Component/DependencyInjection/Extension/ExtensionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * ExtensionInterface is the interface implemented by container extension classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface ExtensionInterface
{
    /**
     * Loads a specific configuration.
     *
     * @param array            $config    An array of configuration values
     * @param ContainerBuilder $container A ContainerBuilder instance
     *
     * @throws \InvalidArgumentException When provided tag is not defined in this extension
     *
     * @api
     */
    public function load(array $config, ContainerBuilder $container);

    /**
     * Returns the namespace to be used for this extension (XML namespace).
     *
     * @return string The XML namespace
     *
     * @api
     */
    public function getNamespace();

    /**
     * Returns the base path for the XSD files.
     *
     * @return string The XSD base path
     *
     * @api
     */
    public function getXsdValidationBasePath();

    /**
     * Returns the recommended alias to use in XML.
     *
     * This alias is also the mandatory prefix to use when using YAML.
     *
     * @return string The alias
     *
     * @api
     */
    public function getAlias();
}
PKQ_�\��J��Xpear/Symfony/Component/DependencyInjection/Extension/ConfigurationExtensionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

/**
 * ConfigurationExtensionInterface is the interface implemented by container extension classes.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
interface ConfigurationExtensionInterface
{
    /**
     * Returns extension configuration
     *
     * @param array            $config    $config    An array of configuration values
     * @param ContainerBuilder $container A ContainerBuilder instance
     *
     * @return ConfigurationInterface|null The configuration or null
     */
    public function getConfiguration(array $config, ContainerBuilder $container);
}
PKR_�\�o
�Bpear/Symfony/Component/DependencyInjection/Extension/Extension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Extension;

use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\BadMethodCallException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\Config\Definition\ConfigurationInterface;

/**
 * Provides useful features shared by many extensions.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Extension implements ExtensionInterface, ConfigurationExtensionInterface
{
    /**
     * Returns the base path for the XSD files.
     *
     * @return string The XSD base path
     */
    public function getXsdValidationBasePath()
    {
        return false;
    }

    /**
     * Returns the namespace to be used for this extension (XML namespace).
     *
     * @return string The XML namespace
     */
    public function getNamespace()
    {
        return 'http://example.org/schema/dic/'.$this->getAlias();
    }

    /**
     * Returns the recommended alias to use in XML.
     *
     * This alias is also the mandatory prefix to use when using YAML.
     *
     * This convention is to remove the "Extension" postfix from the class
     * name and then lowercase and underscore the result. So:
     *
     *     AcmeHelloExtension
     *
     * becomes
     *
     *     acme_hello
     *
     * This can be overridden in a sub-class to specify the alias manually.
     *
     * @return string The alias
     *
     * @throws BadMethodCallException When the extension name does not follow conventions
     */
    public function getAlias()
    {
        $className = get_class($this);
        if (substr($className, -9) != 'Extension') {
            throw new BadMethodCallException('This extension does not follow the naming convention; you must overwrite the getAlias() method.');
        }
        $classBaseName = substr(strrchr($className, '\\'), 1, -9);

        return Container::underscore($classBaseName);
    }

    /**
     * {@inheritDoc}
     */
    public function getConfiguration(array $config, ContainerBuilder $container)
    {
        $reflected = new \ReflectionClass($this);
        $namespace = $reflected->getNamespaceName();

        $class = $namespace.'\\Configuration';
        if (class_exists($class)) {
            $r = new \ReflectionClass($class);
            $container->addResource(new FileResource($r->getFileName()));

            if (!method_exists($class, '__construct')) {
                $configuration = new $class();

                return $configuration;
            }
        }

        return null;
    }

    final protected function processConfiguration(ConfigurationInterface $configuration, array $configs)
    {
        $processor = new Processor();

        return $processor->processConfiguration($configuration, $configs);
    }

    /**
     * @param ContainerBuilder $container
     * @param array            $config
     *
     * @return Boolean Whether the configuration is enabled
     *
     * @throws InvalidArgumentException When the config is not enableable
     */
    protected function isConfigEnabled(ContainerBuilder $container, array $config)
    {
        if (!array_key_exists('enabled', $config)) {
            throw new InvalidArgumentException("The config array has no 'enabled' key.");
        }

        return (Boolean) $container->getParameterBag()->resolveValue($config['enabled']);
    }
}
PKR_�\l5����4pear/Symfony/Component/DependencyInjection/Alias.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * @api
 */
class Alias
{
    private $id;
    private $public;

    /**
     * Constructor.
     *
     * @param string  $id     Alias identifier
     * @param Boolean $public If this alias is public
     *
     * @api
     */
    public function __construct($id, $public = true)
    {
        $this->id = strtolower($id);
        $this->public = $public;
    }

    /**
     * Checks if this DI Alias should be public or not.
     *
     * @return Boolean
     *
     * @api
     */
    public function isPublic()
    {
        return $this->public;
    }

    /**
     * Sets if this Alias is public.
     *
     * @param Boolean $boolean If this Alias should be public
     *
     * @api
     */
    public function setPublic($boolean)
    {
        $this->public = (Boolean) $boolean;
    }

    /**
     * Returns the Id of this alias.
     *
     * @return string The alias id
     *
     * @api
     */
    public function __toString()
    {
        return $this->id;
    }
}
PKS_�\-&�����?pear/Symfony/Component/DependencyInjection/ContainerBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Compiler\Compiler;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
use Symfony\Component\DependencyInjection\Exception\BadMethodCallException;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Config\Resource\ResourceInterface;
use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\InstantiatorInterface;
use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\RealServiceInstantiator;
use Symfony\Component\ExpressionLanguage\Expression;

/**
 * ContainerBuilder is a DI container that provides an API to easily describe services.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ContainerBuilder extends Container implements TaggedContainerInterface
{
    /**
     * @var ExtensionInterface[]
     */
    private $extensions = array();

    /**
     * @var ExtensionInterface[]
     */
    private $extensionsByNs = array();

    /**
     * @var Definition[]
     */
    private $definitions = array();

    /**
     * @var Definition[]
     */
    private $obsoleteDefinitions = array();

    /**
     * @var Alias[]
     */
    private $aliasDefinitions = array();

    /**
     * @var ResourceInterface[]
     */
    private $resources = array();

    private $extensionConfigs = array();

    /**
     * @var Compiler
     */
    private $compiler;

    private $trackResources = true;

    /**
     * @var InstantiatorInterface|null
     */
    private $proxyInstantiator;

    /**
     * @var ExpressionLanguage|null
     */
    private $expressionLanguage;

    /**
     * Sets the track resources flag.
     *
     * If you are not using the loaders and therefore don't want
     * to depend on the Config component, set this flag to false.
     *
     * @param Boolean $track true if you want to track resources, false otherwise
     */
    public function setResourceTracking($track)
    {
        $this->trackResources = (Boolean) $track;
    }

    /**
     * Checks if resources are tracked.
     *
     * @return Boolean true if resources are tracked, false otherwise
     */
    public function isTrackingResources()
    {
        return $this->trackResources;
    }

    /**
     * Sets the instantiator to be used when fetching proxies.
     *
     * @param InstantiatorInterface $proxyInstantiator
     */
    public function setProxyInstantiator(InstantiatorInterface $proxyInstantiator)
    {
        $this->proxyInstantiator = $proxyInstantiator;
    }

    /**
     * Registers an extension.
     *
     * @param ExtensionInterface $extension An extension instance
     *
     * @api
     */
    public function registerExtension(ExtensionInterface $extension)
    {
        $this->extensions[$extension->getAlias()] = $extension;

        if (false !== $extension->getNamespace()) {
            $this->extensionsByNs[$extension->getNamespace()] = $extension;
        }
    }

    /**
     * Returns an extension by alias or namespace.
     *
     * @param string $name An alias or a namespace
     *
     * @return ExtensionInterface An extension instance
     *
     * @throws LogicException if the extension is not registered
     *
     * @api
     */
    public function getExtension($name)
    {
        if (isset($this->extensions[$name])) {
            return $this->extensions[$name];
        }

        if (isset($this->extensionsByNs[$name])) {
            return $this->extensionsByNs[$name];
        }

        throw new LogicException(sprintf('Container extension "%s" is not registered', $name));
    }

    /**
     * Returns all registered extensions.
     *
     * @return ExtensionInterface[] An array of ExtensionInterface
     *
     * @api
     */
    public function getExtensions()
    {
        return $this->extensions;
    }

    /**
     * Checks if we have an extension.
     *
     * @param string $name The name of the extension
     *
     * @return Boolean If the extension exists
     *
     * @api
     */
    public function hasExtension($name)
    {
        return isset($this->extensions[$name]) || isset($this->extensionsByNs[$name]);
    }

    /**
     * Returns an array of resources loaded to build this configuration.
     *
     * @return ResourceInterface[] An array of resources
     *
     * @api
     */
    public function getResources()
    {
        return array_unique($this->resources);
    }

    /**
     * Adds a resource for this configuration.
     *
     * @param ResourceInterface $resource A resource instance
     *
     * @return ContainerBuilder The current instance
     *
     * @api
     */
    public function addResource(ResourceInterface $resource)
    {
        if (!$this->trackResources) {
            return $this;
        }

        $this->resources[] = $resource;

        return $this;
    }

    /**
     * Sets the resources for this configuration.
     *
     * @param ResourceInterface[] $resources An array of resources
     *
     * @return ContainerBuilder The current instance
     *
     * @api
     */
    public function setResources(array $resources)
    {
        if (!$this->trackResources) {
            return $this;
        }

        $this->resources = $resources;

        return $this;
    }

    /**
     * Adds the object class hierarchy as resources.
     *
     * @param object $object An object instance
     *
     * @return ContainerBuilder The current instance
     *
     * @api
     */
    public function addObjectResource($object)
    {
        if ($this->trackResources) {
            $this->addClassResource(new \ReflectionClass($object));
        }

        return $this;
    }

    /**
     * Adds the given class hierarchy as resources.
     *
     * @param \ReflectionClass $class
     *
     * @return ContainerBuilder The current instance
     */
    public function addClassResource(\ReflectionClass $class)
    {
        if (!$this->trackResources) {
            return $this;
        }

        do {
            $this->addResource(new FileResource($class->getFileName()));
        } while ($class = $class->getParentClass());

        return $this;
    }

    /**
     * Loads the configuration for an extension.
     *
     * @param string $extension The extension alias or namespace
     * @param array  $values    An array of values that customizes the extension
     *
     * @return ContainerBuilder The current instance
     * @throws BadMethodCallException When this ContainerBuilder is frozen
     *
     * @throws \LogicException if the container is frozen
     *
     * @api
     */
    public function loadFromExtension($extension, array $values = array())
    {
        if ($this->isFrozen()) {
            throw new BadMethodCallException('Cannot load from an extension on a frozen container.');
        }

        $namespace = $this->getExtension($extension)->getAlias();

        $this->extensionConfigs[$namespace][] = $values;

        return $this;
    }

    /**
     * Adds a compiler pass.
     *
     * @param CompilerPassInterface $pass A compiler pass
     * @param string                $type The type of compiler pass
     *
     * @return ContainerBuilder The current instance
     *
     * @api
     */
    public function addCompilerPass(CompilerPassInterface $pass, $type = PassConfig::TYPE_BEFORE_OPTIMIZATION)
    {
        $this->getCompiler()->addPass($pass, $type);

        $this->addObjectResource($pass);

        return $this;
    }

    /**
     * Returns the compiler pass config which can then be modified.
     *
     * @return PassConfig The compiler pass config
     *
     * @api
     */
    public function getCompilerPassConfig()
    {
        return $this->getCompiler()->getPassConfig();
    }

    /**
     * Returns the compiler.
     *
     * @return Compiler The compiler
     *
     * @api
     */
    public function getCompiler()
    {
        if (null === $this->compiler) {
            $this->compiler = new Compiler();
        }

        return $this->compiler;
    }

    /**
     * Returns all Scopes.
     *
     * @return array An array of scopes
     *
     * @api
     */
    public function getScopes()
    {
        return $this->scopes;
    }

    /**
     * Returns all Scope children.
     *
     * @return array An array of scope children.
     *
     * @api
     */
    public function getScopeChildren()
    {
        return $this->scopeChildren;
    }

    /**
     * Sets a service.
     *
     * @param string $id      The service identifier
     * @param object $service The service instance
     * @param string $scope   The scope
     *
     * @throws BadMethodCallException When this ContainerBuilder is frozen
     *
     * @api
     */
    public function set($id, $service, $scope = self::SCOPE_CONTAINER)
    {
        $id = strtolower($id);

        if ($this->isFrozen()) {
            // setting a synthetic service on a frozen container is alright
            if (
                (!isset($this->definitions[$id]) && !isset($this->obsoleteDefinitions[$id]))
                    ||
                (isset($this->definitions[$id]) && !$this->definitions[$id]->isSynthetic())
                    ||
                (isset($this->obsoleteDefinitions[$id]) && !$this->obsoleteDefinitions[$id]->isSynthetic())
            ) {
                throw new BadMethodCallException(sprintf('Setting service "%s" on a frozen container is not allowed.', $id));
            }
        }

        if (isset($this->definitions[$id])) {
            $this->obsoleteDefinitions[$id] = $this->definitions[$id];
        }

        unset($this->definitions[$id], $this->aliasDefinitions[$id]);

        parent::set($id, $service, $scope);

        if (isset($this->obsoleteDefinitions[$id]) && $this->obsoleteDefinitions[$id]->isSynchronized()) {
            $this->synchronize($id);
        }
    }

    /**
     * Removes a service definition.
     *
     * @param string $id The service identifier
     *
     * @api
     */
    public function removeDefinition($id)
    {
        unset($this->definitions[strtolower($id)]);
    }

    /**
     * Returns true if the given service is defined.
     *
     * @param string $id The service identifier
     *
     * @return Boolean true if the service is defined, false otherwise
     *
     * @api
     */
    public function has($id)
    {
        $id = strtolower($id);

        return isset($this->definitions[$id]) || isset($this->aliasDefinitions[$id]) || parent::has($id);
    }

    /**
     * Gets a service.
     *
     * @param string  $id              The service identifier
     * @param integer $invalidBehavior The behavior when the service does not exist
     *
     * @return object The associated service
     *
     * @throws InvalidArgumentException when no definitions are available
     * @throws InactiveScopeException   when the current scope is not active
     * @throws LogicException           when a circular dependency is detected
     * @throws \Exception
     *
     * @see Reference
     *
     * @api
     */
    public function get($id, $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE)
    {
        $id = strtolower($id);

        try {
            return parent::get($id, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE);
        } catch (InactiveScopeException $e) {
            if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
                return null;
            }

            throw $e;
        } catch (InvalidArgumentException $e) {
            if (isset($this->loading[$id])) {
                throw new LogicException(sprintf('The service "%s" has a circular reference to itself.', $id), 0, $e);
            }

            if (!$this->hasDefinition($id) && isset($this->aliasDefinitions[$id])) {
                return $this->get($this->aliasDefinitions[$id]);
            }

            try {
                $definition = $this->getDefinition($id);
            } catch (InvalidArgumentException $e) {
                if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
                    return null;
                }

                throw $e;
            }

            $this->loading[$id] = true;

            try {
                $service = $this->createService($definition, $id);
            } catch (\Exception $e) {
                unset($this->loading[$id]);

                if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
                    return null;
                }

                throw $e;
            }

            unset($this->loading[$id]);

            return $service;
        }
    }

    /**
     * Merges a ContainerBuilder with the current ContainerBuilder configuration.
     *
     * Service definitions overrides the current defined ones.
     *
     * But for parameters, they are overridden by the current ones. It allows
     * the parameters passed to the container constructor to have precedence
     * over the loaded ones.
     *
     * $container = new ContainerBuilder(array('foo' => 'bar'));
     * $loader = new LoaderXXX($container);
     * $loader->load('resource_name');
     * $container->register('foo', new stdClass());
     *
     * In the above example, even if the loaded resource defines a foo
     * parameter, the value will still be 'bar' as defined in the ContainerBuilder
     * constructor.
     *
     * @param ContainerBuilder $container The ContainerBuilder instance to merge.
     *
     *
     * @throws BadMethodCallException When this ContainerBuilder is frozen
     *
     * @api
     */
    public function merge(ContainerBuilder $container)
    {
        if ($this->isFrozen()) {
            throw new BadMethodCallException('Cannot merge on a frozen container.');
        }

        $this->addDefinitions($container->getDefinitions());
        $this->addAliases($container->getAliases());
        $this->getParameterBag()->add($container->getParameterBag()->all());

        if ($this->trackResources) {
            foreach ($container->getResources() as $resource) {
                $this->addResource($resource);
            }
        }

        foreach ($this->extensions as $name => $extension) {
            if (!isset($this->extensionConfigs[$name])) {
                $this->extensionConfigs[$name] = array();
            }

            $this->extensionConfigs[$name] = array_merge($this->extensionConfigs[$name], $container->getExtensionConfig($name));
        }
    }

    /**
     * Returns the configuration array for the given extension.
     *
     * @param string $name The name of the extension
     *
     * @return array An array of configuration
     *
     * @api
     */
    public function getExtensionConfig($name)
    {
        if (!isset($this->extensionConfigs[$name])) {
            $this->extensionConfigs[$name] = array();
        }

        return $this->extensionConfigs[$name];
    }

    /**
     * Prepends a config array to the configs of the given extension.
     *
     * @param string $name    The name of the extension
     * @param array  $config  The config to set
     */
    public function prependExtensionConfig($name, array $config)
    {
        if (!isset($this->extensionConfigs[$name])) {
            $this->extensionConfigs[$name] = array();
        }

        array_unshift($this->extensionConfigs[$name], $config);
    }

    /**
     * Compiles the container.
     *
     * This method passes the container to compiler
     * passes whose job is to manipulate and optimize
     * the container.
     *
     * The main compiler passes roughly do four things:
     *
     *  * The extension configurations are merged;
     *  * Parameter values are resolved;
     *  * The parameter bag is frozen;
     *  * Extension loading is disabled.
     *
     * @api
     */
    public function compile()
    {
        $compiler = $this->getCompiler();

        if ($this->trackResources) {
            foreach ($compiler->getPassConfig()->getPasses() as $pass) {
                $this->addObjectResource($pass);
            }
        }

        $compiler->compile($this);

        if ($this->trackResources) {
            foreach ($this->definitions as $definition) {
                if ($definition->isLazy() && ($class = $definition->getClass()) && class_exists($class)) {
                    $this->addClassResource(new \ReflectionClass($class));
                }
            }
        }

        $this->extensionConfigs = array();

        parent::compile();
    }

    /**
     * Gets all service ids.
     *
     * @return array An array of all defined service ids
     */
    public function getServiceIds()
    {
        return array_unique(array_merge(array_keys($this->getDefinitions()), array_keys($this->aliasDefinitions), parent::getServiceIds()));
    }

    /**
     * Adds the service aliases.
     *
     * @param array $aliases An array of aliases
     *
     * @api
     */
    public function addAliases(array $aliases)
    {
        foreach ($aliases as $alias => $id) {
            $this->setAlias($alias, $id);
        }
    }

    /**
     * Sets the service aliases.
     *
     * @param array $aliases An array of aliases
     *
     * @api
     */
    public function setAliases(array $aliases)
    {
        $this->aliasDefinitions = array();
        $this->addAliases($aliases);
    }

    /**
     * Sets an alias for an existing service.
     *
     * @param string        $alias The alias to create
     * @param string|Alias  $id    The service to alias
     *
     * @throws InvalidArgumentException if the id is not a string or an Alias
     * @throws InvalidArgumentException if the alias is for itself
     *
     * @api
     */
    public function setAlias($alias, $id)
    {
        $alias = strtolower($alias);

        if (is_string($id)) {
            $id = new Alias($id);
        } elseif (!$id instanceof Alias) {
            throw new InvalidArgumentException('$id must be a string, or an Alias object.');
        }

        if ($alias === strtolower($id)) {
            throw new InvalidArgumentException(sprintf('An alias can not reference itself, got a circular reference on "%s".', $alias));
        }

        unset($this->definitions[$alias]);

        $this->aliasDefinitions[$alias] = $id;
    }

    /**
     * Removes an alias.
     *
     * @param string $alias The alias to remove
     *
     * @api
     */
    public function removeAlias($alias)
    {
        unset($this->aliasDefinitions[strtolower($alias)]);
    }

    /**
     * Returns true if an alias exists under the given identifier.
     *
     * @param string $id The service identifier
     *
     * @return Boolean true if the alias exists, false otherwise
     *
     * @api
     */
    public function hasAlias($id)
    {
        return isset($this->aliasDefinitions[strtolower($id)]);
    }

    /**
     * Gets all defined aliases.
     *
     * @return Alias[] An array of aliases
     *
     * @api
     */
    public function getAliases()
    {
        return $this->aliasDefinitions;
    }

    /**
     * Gets an alias.
     *
     * @param string $id The service identifier
     *
     * @return Alias An Alias instance
     *
     * @throws InvalidArgumentException if the alias does not exist
     *
     * @api
     */
    public function getAlias($id)
    {
        $id = strtolower($id);

        if (!$this->hasAlias($id)) {
            throw new InvalidArgumentException(sprintf('The service alias "%s" does not exist.', $id));
        }

        return $this->aliasDefinitions[$id];
    }

    /**
     * Registers a service definition.
     *
     * This methods allows for simple registration of service definition
     * with a fluid interface.
     *
     * @param string $id    The service identifier
     * @param string $class The service class
     *
     * @return Definition A Definition instance
     *
     * @api
     */
    public function register($id, $class = null)
    {
        return $this->setDefinition(strtolower($id), new Definition($class));
    }

    /**
     * Adds the service definitions.
     *
     * @param Definition[] $definitions An array of service definitions
     *
     * @api
     */
    public function addDefinitions(array $definitions)
    {
        foreach ($definitions as $id => $definition) {
            $this->setDefinition($id, $definition);
        }
    }

    /**
     * Sets the service definitions.
     *
     * @param Definition[] $definitions An array of service definitions
     *
     * @api
     */
    public function setDefinitions(array $definitions)
    {
        $this->definitions = array();
        $this->addDefinitions($definitions);
    }

    /**
     * Gets all service definitions.
     *
     * @return Definition[] An array of Definition instances
     *
     * @api
     */
    public function getDefinitions()
    {
        return $this->definitions;
    }

    /**
     * Sets a service definition.
     *
     * @param string     $id         The service identifier
     * @param Definition $definition A Definition instance
     *
     * @return Definition the service definition
     *
     * @throws BadMethodCallException When this ContainerBuilder is frozen
     *
     * @api
     */
    public function setDefinition($id, Definition $definition)
    {
        if ($this->isFrozen()) {
            throw new BadMethodCallException('Adding definition to a frozen container is not allowed');
        }

        $id = strtolower($id);

        unset($this->aliasDefinitions[$id]);

        return $this->definitions[$id] = $definition;
    }

    /**
     * Returns true if a service definition exists under the given identifier.
     *
     * @param string $id The service identifier
     *
     * @return Boolean true if the service definition exists, false otherwise
     *
     * @api
     */
    public function hasDefinition($id)
    {
        return array_key_exists(strtolower($id), $this->definitions);
    }

    /**
     * Gets a service definition.
     *
     * @param string $id The service identifier
     *
     * @return Definition A Definition instance
     *
     * @throws InvalidArgumentException if the service definition does not exist
     *
     * @api
     */
    public function getDefinition($id)
    {
        $id = strtolower($id);

        if (!$this->hasDefinition($id)) {
            throw new InvalidArgumentException(sprintf('The service definition "%s" does not exist.', $id));
        }

        return $this->definitions[$id];
    }

    /**
     * Gets a service definition by id or alias.
     *
     * The method "unaliases" recursively to return a Definition instance.
     *
     * @param string $id The service identifier or alias
     *
     * @return Definition A Definition instance
     *
     * @throws InvalidArgumentException if the service definition does not exist
     *
     * @api
     */
    public function findDefinition($id)
    {
        while ($this->hasAlias($id)) {
            $id = (string) $this->getAlias($id);
        }

        return $this->getDefinition($id);
    }

    /**
     * Creates a service for a service definition.
     *
     * @param Definition $definition A service definition instance
     * @param string     $id         The service identifier
     * @param Boolean    $tryProxy   Whether to try proxying the service with a lazy proxy
     *
     * @return object The service described by the service definition
     *
     * @throws RuntimeException When the scope is inactive
     * @throws RuntimeException When the factory definition is incomplete
     * @throws RuntimeException When the service is a synthetic service
     * @throws InvalidArgumentException When configure callable is not callable
     *
     * @internal this method is public because of PHP 5.3 limitations, do not use it explicitly in your code
     */
    public function createService(Definition $definition, $id, $tryProxy = true)
    {
        if ($definition->isSynthetic()) {
            throw new RuntimeException(sprintf('You have requested a synthetic service ("%s"). The DIC does not know how to construct this service.', $id));
        }

        if ($tryProxy && $definition->isLazy()) {
            $container = $this;

            $proxy = $this
                ->getProxyInstantiator()
                ->instantiateProxy(
                    $container,
                    $definition,
                    $id, function () use ($definition, $id, $container) {
                        return $container->createService($definition, $id, false);
                    }
                );
            $this->shareService($definition, $proxy, $id);

            return $proxy;
        }

        $parameterBag = $this->getParameterBag();

        if (null !== $definition->getFile()) {
            require_once $parameterBag->resolveValue($definition->getFile());
        }

        $arguments = $this->resolveServices($parameterBag->unescapeValue($parameterBag->resolveValue($definition->getArguments())));

        if (null !== $definition->getFactoryMethod()) {
            if (null !== $definition->getFactoryClass()) {
                $factory = $parameterBag->resolveValue($definition->getFactoryClass());
            } elseif (null !== $definition->getFactoryService()) {
                $factory = $this->get($parameterBag->resolveValue($definition->getFactoryService()));
            } else {
                throw new RuntimeException(sprintf('Cannot create service "%s" from factory method without a factory service or factory class.', $id));
            }

            $service = call_user_func_array(array($factory, $definition->getFactoryMethod()), $arguments);
        } else {
            $r = new \ReflectionClass($parameterBag->resolveValue($definition->getClass()));

            $service = null === $r->getConstructor() ? $r->newInstance() : $r->newInstanceArgs($arguments);
        }

        if ($tryProxy || !$definition->isLazy()) {
            // share only if proxying failed, or if not a proxy
            $this->shareService($definition, $service, $id);
        }

        foreach ($definition->getMethodCalls() as $call) {
            $this->callMethod($service, $call);
        }

        $properties = $this->resolveServices($parameterBag->resolveValue($definition->getProperties()));
        foreach ($properties as $name => $value) {
            $service->$name = $value;
        }

        if ($callable = $definition->getConfigurator()) {
            if (is_array($callable)) {
                $callable[0] = $callable[0] instanceof Reference ? $this->get((string) $callable[0]) : $parameterBag->resolveValue($callable[0]);
            }

            if (!is_callable($callable)) {
                throw new InvalidArgumentException(sprintf('The configure callable for class "%s" is not a callable.', get_class($service)));
            }

            call_user_func($callable, $service);
        }

        return $service;
    }

    /**
     * Replaces service references by the real service instance and evaluates expressions.
     *
     * @param mixed $value A value
     *
     * @return mixed The same value with all service references replaced by
     *               the real service instances and all expressions evaluated
     */
    public function resolveServices($value)
    {
        if (is_array($value)) {
            foreach ($value as &$v) {
                $v = $this->resolveServices($v);
            }
        } elseif ($value instanceof Reference) {
            $value = $this->get((string) $value, $value->getInvalidBehavior());
        } elseif ($value instanceof Definition) {
            $value = $this->createService($value, null);
        } elseif ($value instanceof Expression) {
            $value = $this->getExpressionLanguage()->evaluate($value, array('container' => $this));
        }

        return $value;
    }

    /**
     * Returns service ids for a given tag.
     *
     * Example:
     *
     * $container->register('foo')->addTag('my.tag', array('hello' => 'world'));
     *
     * $serviceIds = $container->findTaggedServiceIds('my.tag');
     * foreach ($serviceIds as $serviceId => $tags) {
     *     foreach ($tags as $tag) {
     *         echo $tag['hello'];
     *     }
     * }
     *
     * @param string $name The tag name
     *
     * @return array An array of tags with the tagged service as key, holding a list of attribute arrays.
     *
     * @api
     */
    public function findTaggedServiceIds($name)
    {
        $tags = array();
        foreach ($this->getDefinitions() as $id => $definition) {
            if ($definition->hasTag($name)) {
                $tags[$id] = $definition->getTag($name);
            }
        }

        return $tags;
    }

    /**
     * Returns all tags the defined services use.
     *
     * @return array An array of tags
     */
    public function findTags()
    {
        $tags = array();
        foreach ($this->getDefinitions() as $id => $definition) {
            $tags = array_merge(array_keys($definition->getTags()), $tags);
        }

        return array_unique($tags);
    }

    /**
     * Returns the Service Conditionals.
     *
     * @param mixed $value An array of conditionals to return.
     *
     * @return array An array of Service conditionals
     */
    public static function getServiceConditionals($value)
    {
        $services = array();

        if (is_array($value)) {
            foreach ($value as $v) {
                $services = array_unique(array_merge($services, self::getServiceConditionals($v)));
            }
        } elseif ($value instanceof Reference && $value->getInvalidBehavior() === ContainerInterface::IGNORE_ON_INVALID_REFERENCE) {
            $services[] = (string) $value;
        }

        return $services;
    }

    /**
     * Retrieves the currently set proxy instantiator or instantiates one.
     *
     * @return InstantiatorInterface
     */
    private function getProxyInstantiator()
    {
        if (!$this->proxyInstantiator) {
            $this->proxyInstantiator = new RealServiceInstantiator();
        }

        return $this->proxyInstantiator;
    }

    /**
     * Synchronizes a service change.
     *
     * This method updates all services that depend on the given
     * service by calling all methods referencing it.
     *
     * @param string $id A service id
     */
    private function synchronize($id)
    {
        foreach ($this->definitions as $definitionId => $definition) {
            // only check initialized services
            if (!$this->initialized($definitionId)) {
                continue;
            }

            foreach ($definition->getMethodCalls() as $call) {
                foreach ($call[1] as $argument) {
                    if ($argument instanceof Reference && $id == (string) $argument) {
                        $this->callMethod($this->get($definitionId), $call);
                    }
                }
            }
        }
    }

    private function callMethod($service, $call)
    {
        $services = self::getServiceConditionals($call[1]);

        foreach ($services as $s) {
            if (!$this->has($s)) {
                return;
            }
        }

        call_user_func_array(array($service, $call[0]), $this->resolveServices($this->getParameterBag()->resolveValue($call[1])));
    }

    /**
     * Shares a given service in the container
     *
     * @param Definition $definition
     * @param mixed      $service
     * @param string     $id
     *
     * @throws InactiveScopeException
     */
    private function shareService(Definition $definition, $service, $id)
    {
        if (self::SCOPE_PROTOTYPE !== $scope = $definition->getScope()) {
            if (self::SCOPE_CONTAINER !== $scope && !isset($this->scopedServices[$scope])) {
                throw new InactiveScopeException($id, $scope);
            }

            $this->services[$lowerId = strtolower($id)] = $service;

            if (self::SCOPE_CONTAINER !== $scope) {
                $this->scopedServices[$scope][$lowerId] = $service;
            }
        }
    }

    private function getExpressionLanguage()
    {
        if (null === $this->expressionLanguage) {
            if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
                throw new RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
            }
            $this->expressionLanguage = new ExpressionLanguage();
        }

        return $this->expressionLanguage;
    }
}
PKS_�\�H8��Bpear/Symfony/Component/DependencyInjection/ContainerAwareTrait.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * ContainerAware trait.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
trait ContainerAwareTrait
{
    /**
     * @var ContainerInterface
     */
    protected $container;

    /**
     * Sets the Container associated with this Controller.
     *
     * @param ContainerInterface $container A ContainerInterface instance
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }
}
PKT_�\$�777pear/Symfony/Component/DependencyInjection/Variable.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * Represents a variable.
 *
 *     $var = new Variable('a');
 *
 * will be dumped as
 *
 *     $a
 *
 * by the PHP dumper.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class Variable
{
    private $name;

    /**
     * Constructor
     *
     * @param string $name
     */
    public function __construct($name)
    {
        $this->name = $name;
    }

    /**
     * Converts the object to a string
     *
     * @return string
     */
    public function __toString()
    {
        return $this->name;
    }
}
PKT_�\;Yޯ��Apear/Symfony/Component/DependencyInjection/ExpressionLanguage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage;

/**
 * Adds some function to the default ExpressionLanguage.
 *
 * To get a service, use service('request').
 * To get a parameter, use parameter('kernel.debug').
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ExpressionLanguage extends BaseExpressionLanguage
{
    protected function registerFunctions()
    {
        parent::registerFunctions();

        $this->register('service', function ($arg) {
            return sprintf('$this->get(%s)', $arg);
        }, function (array $variables, $value) {
            return $variables['container']->get($value);
        });

        $this->register('parameter', function ($arg) {
            return sprintf('$this->getParameter(%s)', $arg);
        }, function (array $variables, $value) {
            return $variables['container']->getParameter($value);
        });
    }
}
PKU_�\�0є##Dpear/Symfony/Component/DependencyInjection/Compiler/RepeatedPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

/**
 * A pass that might be run repeatedly.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class RepeatedPass implements CompilerPassInterface
{
    /**
     * @var Boolean
     */
    private $repeat = false;

    /**
     * @var RepeatablePassInterface[]
     */
    private $passes;

    /**
     * Constructor.
     *
     * @param RepeatablePassInterface[] $passes An array of RepeatablePassInterface objects
     *
     * @throws InvalidArgumentException when the passes don't implement RepeatablePassInterface
     */
    public function __construct(array $passes)
    {
        foreach ($passes as $pass) {
            if (!$pass instanceof RepeatablePassInterface) {
                throw new InvalidArgumentException('$passes must be an array of RepeatablePassInterface.');
            }

            $pass->setRepeatedPass($this);
        }

        $this->passes = $passes;
    }

    /**
     * Process the repeatable passes that run more than once.
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $this->repeat = false;
        foreach ($this->passes as $pass) {
            $pass->process($container);
        }

        if ($this->repeat) {
            $this->process($container);
        }
    }

    /**
     * Sets if the pass should repeat
     */
    public function setRepeat()
    {
        $this->repeat = true;
    }

    /**
     * Returns the passes
     *
     * @return RepeatablePassInterface[] An array of RepeatablePassInterface objects
     */
    public function getPasses()
    {
        return $this->passes;
    }
}
PKU_�\���nnXpear/Symfony/Component/DependencyInjection/Compiler/ResolveParameterPlaceHoldersPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;

/**
 * Resolves all parameter placeholders "%somevalue%" to their real values.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ResolveParameterPlaceHoldersPass implements CompilerPassInterface
{
    /**
     * Processes the ContainerBuilder to resolve parameter placeholders.
     *
     * @param ContainerBuilder $container
     *
     * @throws ParameterNotFoundException
     */
    public function process(ContainerBuilder $container)
    {
        $parameterBag = $container->getParameterBag();

        foreach ($container->getDefinitions() as $id => $definition) {
            try {
                $definition->setClass($parameterBag->resolveValue($definition->getClass()));
                $definition->setFile($parameterBag->resolveValue($definition->getFile()));
                $definition->setArguments($parameterBag->resolveValue($definition->getArguments()));

                $calls = array();
                foreach ($definition->getMethodCalls() as $name => $arguments) {
                    $calls[$parameterBag->resolveValue($name)] = $parameterBag->resolveValue($arguments);
                }
                $definition->setMethodCalls($calls);

                $definition->setProperties($parameterBag->resolveValue($definition->getProperties()));
            } catch (ParameterNotFoundException $e) {
                $e->setSourceId($id);

                throw $e;
            }
        }

        $aliases = array();
        foreach ($container->getAliases() as $name => $target) {
            $aliases[$parameterBag->resolveValue($name)] = $parameterBag->resolveValue($target);
        }
        $container->setAliases($aliases);

        $parameterBag->resolve();
    }
}
PKV_�\�!�?��Ppear/Symfony/Component/DependencyInjection/Compiler/RemovePrivateAliasesPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Remove private aliases from the container. They were only used to establish
 * dependencies between services, and these dependencies have been resolved in
 * one of the previous passes.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class RemovePrivateAliasesPass implements CompilerPassInterface
{
    /**
     * Removes private aliases from the ContainerBuilder
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $compiler = $container->getCompiler();
        $formatter = $compiler->getLoggingFormatter();

        foreach ($container->getAliases() as $id => $alias) {
            if ($alias->isPublic()) {
                continue;
            }

            $container->removeAlias($id);
            $compiler->addLogMessage($formatter->formatRemoveService($this, $id, 'private alias'));
        }
    }
}
PKV_�\x�7���Qpear/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphEdge.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

/**
 * Represents an edge in your service graph.
 *
 * Value is typically a reference.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ServiceReferenceGraphEdge
{
    private $sourceNode;
    private $destNode;
    private $value;

    /**
     * Constructor.
     *
     * @param ServiceReferenceGraphNode $sourceNode
     * @param ServiceReferenceGraphNode $destNode
     * @param string                    $value
     */
    public function __construct(ServiceReferenceGraphNode $sourceNode, ServiceReferenceGraphNode $destNode, $value = null)
    {
        $this->sourceNode = $sourceNode;
        $this->destNode = $destNode;
        $this->value = $value;
    }

    /**
     * Returns the value of the edge
     *
     * @return ServiceReferenceGraphNode
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * Returns the source node
     *
     * @return ServiceReferenceGraphNode
     */
    public function getSourceNode()
    {
        return $this->sourceNode;
    }

    /**
     * Returns the destination node
     *
     * @return ServiceReferenceGraphNode
     */
    public function getDestNode()
    {
        return $this->destNode;
    }
}
PKW_�\@��q	q	Spear/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Checks your services for circular references
 *
 * References from method calls are ignored since we might be able to resolve
 * these references depending on the order in which services are called.
 *
 * Circular reference from method calls will only be detected at run-time.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class CheckCircularReferencesPass implements CompilerPassInterface
{
    private $currentId;
    private $currentPath;
    private $checkedNodes;

    /**
     * Checks the ContainerBuilder object for circular references.
     *
     * @param ContainerBuilder $container The ContainerBuilder instances
     */
    public function process(ContainerBuilder $container)
    {
        $graph = $container->getCompiler()->getServiceReferenceGraph();

        $this->checkedNodes = array();
        foreach ($graph->getNodes() as $id => $node) {
            $this->currentId = $id;
            $this->currentPath = array($id);

            $this->checkOutEdges($node->getOutEdges());
        }
    }

    /**
     * Checks for circular references.
     *
     * @param ServiceReferenceGraphEdge[] $edges An array of Edges
     *
     * @throws ServiceCircularReferenceException When a circular reference is found.
     */
    private function checkOutEdges(array $edges)
    {
        foreach ($edges as $edge) {
            $node      = $edge->getDestNode();
            $id        = $node->getId();

            if (empty($this->checkedNodes[$id])) {
                $searchKey = array_search($id, $this->currentPath);
                $this->currentPath[] = $id;

                if (false !== $searchKey) {
                    throw new ServiceCircularReferenceException($id, array_slice($this->currentPath, $searchKey));
                }

                $this->checkOutEdges($node->getOutEdges());

                $this->checkedNodes[$id] = true;
                array_pop($this->currentPath);
            }
        }
    }
}
PKW_�\�ۻǠ�Tpear/Symfony/Component/DependencyInjection/Compiler/AnalyzeServiceReferencesPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Run this pass before passes that need to know more about the relation of
 * your services.
 *
 * This class will populate the ServiceReferenceGraph with information. You can
 * retrieve the graph in other passes from the compiler.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AnalyzeServiceReferencesPass implements RepeatablePassInterface
{
    private $graph;
    private $container;
    private $currentId;
    private $currentDefinition;
    private $repeatedPass;
    private $onlyConstructorArguments;

    /**
     * Constructor.
     *
     * @param Boolean $onlyConstructorArguments Sets this Service Reference pass to ignore method calls
     */
    public function __construct($onlyConstructorArguments = false)
    {
        $this->onlyConstructorArguments = (Boolean) $onlyConstructorArguments;
    }

    /**
     * {@inheritDoc}
     */
    public function setRepeatedPass(RepeatedPass $repeatedPass)
    {
        $this->repeatedPass = $repeatedPass;
    }

    /**
     * Processes a ContainerBuilder object to populate the service reference graph.
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $this->container = $container;
        $this->graph     = $container->getCompiler()->getServiceReferenceGraph();
        $this->graph->clear();

        foreach ($container->getDefinitions() as $id => $definition) {
            if ($definition->isSynthetic() || $definition->isAbstract()) {
                continue;
            }

            $this->currentId = $id;
            $this->currentDefinition = $definition;
            $this->processArguments($definition->getArguments());

            if (!$this->onlyConstructorArguments) {
                $this->processArguments($definition->getMethodCalls());
                $this->processArguments($definition->getProperties());
                if ($definition->getConfigurator()) {
                    $this->processArguments(array($definition->getConfigurator()));
                }
            }
        }

        foreach ($container->getAliases() as $id => $alias) {
            $this->graph->connect($id, $alias, (string) $alias, $this->getDefinition((string) $alias), null);
        }
    }

    /**
     * Processes service definitions for arguments to find relationships for the service graph.
     *
     * @param array $arguments An array of Reference or Definition objects relating to service definitions
     */
    private function processArguments(array $arguments)
    {
        foreach ($arguments as $argument) {
            if (is_array($argument)) {
                $this->processArguments($argument);
            } elseif ($argument instanceof Reference) {
                $this->graph->connect(
                    $this->currentId,
                    $this->currentDefinition,
                    $this->getDefinitionId((string) $argument),
                    $this->getDefinition((string) $argument),
                    $argument
                );
            } elseif ($argument instanceof Definition) {
                $this->processArguments($argument->getArguments());
                $this->processArguments($argument->getMethodCalls());
                $this->processArguments($argument->getProperties());
            }
        }
    }

    /**
     * Returns a service definition given the full name or an alias.
     *
     * @param string $id A full id or alias for a service definition.
     *
     * @return Definition|null The definition related to the supplied id
     */
    private function getDefinition($id)
    {
        $id = $this->getDefinitionId($id);

        return null === $id ? null : $this->container->getDefinition($id);
    }

    private function getDefinitionId($id)
    {
        while ($this->container->hasAlias($id)) {
            $id = (string) $this->container->getAlias($id);
        }

        if (!$this->container->hasDefinition($id)) {
            return null;
        }

        return $id;
    }
}
PKX_�\��U*''Upear/Symfony/Component/DependencyInjection/Compiler/RemoveAbstractDefinitionsPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Removes abstract Definitions
 *
 */
class RemoveAbstractDefinitionsPass implements CompilerPassInterface
{
    /**
     * Removes abstract definitions from the ContainerBuilder
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $compiler = $container->getCompiler();
        $formatter = $compiler->getLoggingFormatter();

        foreach ($container->getDefinitions() as $id => $definition) {
            if ($definition->isAbstract()) {
                $container->removeDefinition($id);
                $compiler->addLogMessage($formatter->formatRemoveService($this, $id, 'abstract'));
            }
        }
    }
}
PKY_�\�iJT�
�
Tpear/Symfony/Component/DependencyInjection/Compiler/ResolveInvalidReferencesPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;

/**
 * Emulates the invalid behavior if the reference is not found within the
 * container.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ResolveInvalidReferencesPass implements CompilerPassInterface
{
    private $container;

    /**
     * Process the ContainerBuilder to resolve invalid references.
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $this->container = $container;
        foreach ($container->getDefinitions() as $definition) {
            if ($definition->isSynthetic() || $definition->isAbstract()) {
                continue;
            }

            $definition->setArguments(
                $this->processArguments($definition->getArguments())
            );

            $calls = array();
            foreach ($definition->getMethodCalls() as $call) {
                try {
                    $calls[] = array($call[0], $this->processArguments($call[1], true));
                } catch (RuntimeException $ignore) {
                    // this call is simply removed
                }
            }
            $definition->setMethodCalls($calls);

            $properties = array();
            foreach ($definition->getProperties() as $name => $value) {
                try {
                    $value = $this->processArguments(array($value), true);
                    $properties[$name] = reset($value);
                } catch (RuntimeException $ignore) {
                    // ignore property
                }
            }
            $definition->setProperties($properties);
        }
    }

    /**
     * Processes arguments to determine invalid references.
     *
     * @param array   $arguments    An array of Reference objects
     * @param Boolean $inMethodCall
     *
     * @return array
     *
     * @throws RuntimeException When the config is invalid
     */
    private function processArguments(array $arguments, $inMethodCall = false)
    {
        foreach ($arguments as $k => $argument) {
            if (is_array($argument)) {
                $arguments[$k] = $this->processArguments($argument, $inMethodCall);
            } elseif ($argument instanceof Reference) {
                $id = (string) $argument;

                $invalidBehavior = $argument->getInvalidBehavior();
                $exists = $this->container->has($id);

                // resolve invalid behavior
                if (!$exists && ContainerInterface::NULL_ON_INVALID_REFERENCE === $invalidBehavior) {
                    $arguments[$k] = null;
                } elseif (!$exists && ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $invalidBehavior) {
                    if ($inMethodCall) {
                        throw new RuntimeException('Method shouldn\'t be called.');
                    }

                    $arguments[$k] = null;
                }
            }
        }

        return $arguments;
    }
}
PKY_�\X�\\Wpear/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;

/**
 * Merges extension configs into the container builder
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class MergeExtensionConfigurationPass implements CompilerPassInterface
{
    /**
     * {@inheritDoc}
     */
    public function process(ContainerBuilder $container)
    {
        $parameters = $container->getParameterBag()->all();
        $definitions = $container->getDefinitions();
        $aliases = $container->getAliases();

        foreach ($container->getExtensions() as $extension) {
            if ($extension instanceof PrependExtensionInterface) {
                $extension->prepend($container);
            }
        }

        foreach ($container->getExtensions() as $name => $extension) {
            if (!$config = $container->getExtensionConfig($name)) {
                // this extension was not called
                continue;
            }
            $config = $container->getParameterBag()->resolveValue($config);

            $tmpContainer = new ContainerBuilder($container->getParameterBag());
            $tmpContainer->setResourceTracking($container->isTrackingResources());
            $tmpContainer->addObjectResource($extension);

            $extension->load($config, $tmpContainer);

            $container->merge($tmpContainer);
        }

        $container->addDefinitions($definitions);
        $container->addAliases($aliases);
        $container->getParameterBag()->add($parameters);
    }
}
PKZ_�\V�%))Mpear/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraph.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

/**
 * This is a directed graph of your services.
 *
 * This information can be used by your compiler passes instead of collecting
 * it themselves which improves performance quite a lot.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ServiceReferenceGraph
{
    /**
     * @var ServiceReferenceGraphNode[]
     */
    private $nodes = array();

    /**
     * Checks if the graph has a specific node.
     *
     * @param string $id Id to check
     *
     * @return Boolean
     */
    public function hasNode($id)
    {
        return isset($this->nodes[$id]);
    }

    /**
     * Gets a node by identifier.
     *
     * @param string $id The id to retrieve
     *
     * @return ServiceReferenceGraphNode The node matching the supplied identifier
     *
     * @throws InvalidArgumentException if no node matches the supplied identifier
     */
    public function getNode($id)
    {
        if (!isset($this->nodes[$id])) {
            throw new InvalidArgumentException(sprintf('There is no node with id "%s".', $id));
        }

        return $this->nodes[$id];
    }

    /**
     * Returns all nodes.
     *
     * @return ServiceReferenceGraphNode[] An array of all ServiceReferenceGraphNode objects
     */
    public function getNodes()
    {
        return $this->nodes;
    }

    /**
     * Clears all nodes.
     */
    public function clear()
    {
        $this->nodes = array();
    }

    /**
     * Connects 2 nodes together in the Graph.
     *
     * @param string $sourceId
     * @param string $sourceValue
     * @param string $destId
     * @param string $destValue
     * @param string $reference
     */
    public function connect($sourceId, $sourceValue, $destId, $destValue = null, $reference = null)
    {
        $sourceNode = $this->createNode($sourceId, $sourceValue);
        $destNode = $this->createNode($destId, $destValue);
        $edge = new ServiceReferenceGraphEdge($sourceNode, $destNode, $reference);

        $sourceNode->addOutEdge($edge);
        $destNode->addInEdge($edge);
    }

    /**
     * Creates a graph node.
     *
     * @param string $id
     * @param string $value
     *
     * @return ServiceReferenceGraphNode
     */
    private function createNode($id, $value)
    {
        if (isset($this->nodes[$id]) && $this->nodes[$id]->getValue() === $value) {
            return $this->nodes[$id];
        }

        return $this->nodes[$id] = new ServiceReferenceGraphNode($id, $value);
    }
}
PKZ_�\�� �Rpear/Symfony/Component/DependencyInjection/Compiler/CheckReferenceValidityPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ScopeCrossingInjectionException;
use Symfony\Component\DependencyInjection\Exception\ScopeWideningInjectionException;

/**
 * Checks the validity of references
 *
 * The following checks are performed by this pass:
 * - target definitions are not abstract
 * - target definitions are of equal or wider scope
 * - target definitions are in the same scope hierarchy
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class CheckReferenceValidityPass implements CompilerPassInterface
{
    private $container;
    private $currentId;
    private $currentDefinition;
    private $currentScope;
    private $currentScopeAncestors;
    private $currentScopeChildren;

    /**
     * Processes the ContainerBuilder to validate References.
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $this->container = $container;

        $children = $this->container->getScopeChildren();
        $ancestors = array();

        $scopes = $this->container->getScopes();
        foreach ($scopes as $name => $parent) {
            $ancestors[$name] = array($parent);

            while (isset($scopes[$parent])) {
                $ancestors[$name][] = $parent = $scopes[$parent];
            }
        }

        foreach ($container->getDefinitions() as $id => $definition) {
            if ($definition->isSynthetic() || $definition->isAbstract()) {
                continue;
            }

            $this->currentId = $id;
            $this->currentDefinition = $definition;
            $this->currentScope = $scope = $definition->getScope();

            if (ContainerInterface::SCOPE_CONTAINER === $scope) {
                $this->currentScopeChildren = array_keys($scopes);
                $this->currentScopeAncestors = array();
            } elseif (ContainerInterface::SCOPE_PROTOTYPE !== $scope) {
                $this->currentScopeChildren = isset($children[$scope]) ? $children[$scope] : array();
                $this->currentScopeAncestors = isset($ancestors[$scope]) ? $ancestors[$scope] : array();
            }

            $this->validateReferences($definition->getArguments());
            $this->validateReferences($definition->getMethodCalls());
            $this->validateReferences($definition->getProperties());
        }
    }

    /**
     * Validates an array of References.
     *
     * @param array $arguments An array of Reference objects
     *
     * @throws RuntimeException when there is a reference to an abstract definition.
     */
    private function validateReferences(array $arguments)
    {
        foreach ($arguments as $argument) {
            if (is_array($argument)) {
                $this->validateReferences($argument);
            } elseif ($argument instanceof Reference) {
                $targetDefinition = $this->getDefinition((string) $argument);

                if (null !== $targetDefinition && $targetDefinition->isAbstract()) {
                    throw new RuntimeException(sprintf(
                        'The definition "%s" has a reference to an abstract definition "%s". '
                       .'Abstract definitions cannot be the target of references.',
                       $this->currentId,
                       $argument
                    ));
                }

                $this->validateScope($argument, $targetDefinition);
            }
        }
    }

    /**
     * Validates the scope of a single Reference.
     *
     * @param Reference  $reference
     * @param Definition $definition
     *
     * @throws ScopeWideningInjectionException when the definition references a service of a narrower scope
     * @throws ScopeCrossingInjectionException when the definition references a service of another scope hierarchy
     */
    private function validateScope(Reference $reference, Definition $definition = null)
    {
        if (ContainerInterface::SCOPE_PROTOTYPE === $this->currentScope) {
            return;
        }

        if (!$reference->isStrict()) {
            return;
        }

        if (null === $definition) {
            return;
        }

        if ($this->currentScope === $scope = $definition->getScope()) {
            return;
        }

        $id = (string) $reference;

        if (in_array($scope, $this->currentScopeChildren, true)) {
            throw new ScopeWideningInjectionException($this->currentId, $this->currentScope, $id, $scope);
        }

        if (!in_array($scope, $this->currentScopeAncestors, true)) {
            throw new ScopeCrossingInjectionException($this->currentId, $this->currentScope, $id, $scope);
        }
    }

    /**
     * Returns the Definition given an id.
     *
     * @param string $id Definition identifier
     *
     * @return Definition
     */
    private function getDefinition($id)
    {
        if (!$this->container->hasDefinition($id)) {
            return null;
        }

        return $this->container->getDefinition($id);
    }
}
PK[_�\[���	�	Qpear/Symfony/Component/DependencyInjection/Compiler/ServiceReferenceGraphNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Alias;

/**
 * Represents a node in your service graph.
 *
 * Value is typically a definition, or an alias.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ServiceReferenceGraphNode
{
    private $id;
    private $inEdges = array();
    private $outEdges = array();
    private $value;

    /**
     * Constructor.
     *
     * @param string $id    The node identifier
     * @param mixed  $value The node value
     */
    public function __construct($id, $value)
    {
        $this->id = $id;
        $this->value = $value;
    }

    /**
     * Adds an in edge to this node.
     *
     * @param ServiceReferenceGraphEdge $edge
     */
    public function addInEdge(ServiceReferenceGraphEdge $edge)
    {
        $this->inEdges[] = $edge;
    }

    /**
     * Adds an out edge to this node.
     *
     * @param ServiceReferenceGraphEdge $edge
     */
    public function addOutEdge(ServiceReferenceGraphEdge $edge)
    {
        $this->outEdges[] = $edge;
    }

    /**
     * Checks if the value of this node is an Alias.
     *
     * @return Boolean True if the value is an Alias instance
     */
    public function isAlias()
    {
        return $this->value instanceof Alias;
    }

    /**
     * Checks if the value of this node is a Definition.
     *
     * @return Boolean True if the value is a Definition instance
     */
    public function isDefinition()
    {
        return $this->value instanceof Definition;
    }

    /**
     * Returns the identifier.
     *
     * @return string
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Returns the in edges.
     *
     * @return array The in ServiceReferenceGraphEdge array
     */
    public function getInEdges()
    {
        return $this->inEdges;
    }

    /**
     * Returns the out edges.
     *
     * @return array The out ServiceReferenceGraphEdge array
     */
    public function getOutEdges()
    {
        return $this->outEdges;
    }

    /**
     * Returns the value of this Node
     *
     * @return mixed The value
     */
    public function getValue()
    {
        return $this->value;
    }
}
PK[_�\b[_�66dpear/Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;

use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Checks that all references are pointing to a valid service.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class CheckExceptionOnInvalidReferenceBehaviorPass implements CompilerPassInterface
{
    private $container;
    private $sourceId;

    public function process(ContainerBuilder $container)
    {
        $this->container = $container;

        foreach ($container->getDefinitions() as $id => $definition) {
            $this->sourceId = $id;
            $this->processDefinition($definition);
        }
    }

    private function processDefinition(Definition $definition)
    {
        $this->processReferences($definition->getArguments());
        $this->processReferences($definition->getMethodCalls());
        $this->processReferences($definition->getProperties());
    }

    private function processReferences(array $arguments)
    {
        foreach ($arguments as $argument) {
            if (is_array($argument)) {
                $this->processReferences($argument);
            } elseif ($argument instanceof Definition) {
                $this->processDefinition($argument);
            } elseif ($argument instanceof Reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE === $argument->getInvalidBehavior()) {
                $destId = (string) $argument;

                if (!$this->container->has($destId)) {
                    throw new ServiceNotFoundException($destId, $this->sourceId);
                }
            }
        }
    }
}
PK\_�\��m��Tpear/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Inline service definitions where this is possible.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class InlineServiceDefinitionsPass implements RepeatablePassInterface
{
    private $repeatedPass;
    private $graph;
    private $compiler;
    private $formatter;
    private $currentId;

    /**
     * {@inheritDoc}
     */
    public function setRepeatedPass(RepeatedPass $repeatedPass)
    {
        $this->repeatedPass = $repeatedPass;
    }

    /**
     * Processes the ContainerBuilder for inline service definitions.
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $this->compiler = $container->getCompiler();
        $this->formatter = $this->compiler->getLoggingFormatter();
        $this->graph = $this->compiler->getServiceReferenceGraph();

        foreach ($container->getDefinitions() as $id => $definition) {
            $this->currentId = $id;

            $definition->setArguments(
                $this->inlineArguments($container, $definition->getArguments())
            );

            $definition->setMethodCalls(
                $this->inlineArguments($container, $definition->getMethodCalls())
            );

            $definition->setProperties(
                $this->inlineArguments($container, $definition->getProperties())
            );
        }
    }

    /**
     * Processes inline arguments.
     *
     * @param ContainerBuilder $container The ContainerBuilder
     * @param array            $arguments An array of arguments
     *
     * @return array
     */
    private function inlineArguments(ContainerBuilder $container, array $arguments)
    {
        foreach ($arguments as $k => $argument) {
            if (is_array($argument)) {
                $arguments[$k] = $this->inlineArguments($container, $argument);
            } elseif ($argument instanceof Reference) {
                if (!$container->hasDefinition($id = (string) $argument)) {
                    continue;
                }

                if ($this->isInlineableDefinition($container, $id, $definition = $container->getDefinition($id))) {
                    $this->compiler->addLogMessage($this->formatter->formatInlineService($this, $id, $this->currentId));

                    if (ContainerInterface::SCOPE_PROTOTYPE !== $definition->getScope()) {
                        $arguments[$k] = $definition;
                    } else {
                        $arguments[$k] = clone $definition;
                    }
                }
            } elseif ($argument instanceof Definition) {
                $argument->setArguments($this->inlineArguments($container, $argument->getArguments()));
                $argument->setMethodCalls($this->inlineArguments($container, $argument->getMethodCalls()));
                $argument->setProperties($this->inlineArguments($container, $argument->getProperties()));
            }
        }

        return $arguments;
    }

    /**
     * Checks if the definition is inlineable.
     *
     * @param ContainerBuilder $container
     * @param string           $id
     * @param Definition       $definition
     *
     * @return Boolean If the definition is inlineable
     */
    private function isInlineableDefinition(ContainerBuilder $container, $id, Definition $definition)
    {
        if (ContainerInterface::SCOPE_PROTOTYPE === $definition->getScope()) {
            return true;
        }

        if ($definition->isPublic() || $definition->isLazy()) {
            return false;
        }

        if (!$this->graph->hasNode($id)) {
            return true;
        }

        if ($this->currentId == $id) {
            return false;
        }

        $ids = array();
        foreach ($this->graph->getNode($id)->getInEdges() as $edge) {
            $ids[] = $edge->getSourceNode()->getId();
        }

        if (count(array_unique($ids)) > 1) {
            return false;
        }

        return $container->getDefinition(reset($ids))->getScope() === $definition->getScope();
    }
}
PK\_�\�����Hpear/Symfony/Component/DependencyInjection/Compiler/LoggingFormatter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

/**
 * Used to format logging messages during the compilation.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class LoggingFormatter
{
    public function formatRemoveService(CompilerPassInterface $pass, $id, $reason)
    {
        return $this->format($pass, sprintf('Removed service "%s"; reason: %s', $id, $reason));
    }

    public function formatInlineService(CompilerPassInterface $pass, $id, $target)
    {
        return $this->format($pass, sprintf('Inlined service "%s" to "%s".', $id, $target));
    }

    public function formatUpdateReference(CompilerPassInterface $pass, $serviceId, $oldDestId, $newDestId)
    {
        return $this->format($pass, sprintf('Changed reference of service "%s" previously pointing to "%s" to "%s".', $serviceId, $oldDestId, $newDestId));
    }

    public function formatResolveInheritance(CompilerPassInterface $pass, $childId, $parentId)
    {
        return $this->format($pass, sprintf('Resolving inheritance for "%s" (parent: %s).', $childId, $parentId));
    }

    public function format(CompilerPassInterface $pass, $message)
    {
        return sprintf('%s: %s', get_class($pass), $message);
    }
}
PK\_�\��ϒ��Vpear/Symfony/Component/DependencyInjection/Compiler/ResolveDefinitionTemplatesPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\DefinitionDecorator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;

/**
 * This replaces all DefinitionDecorator instances with their equivalent fully
 * merged Definition instance.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ResolveDefinitionTemplatesPass implements CompilerPassInterface
{
    private $container;
    private $compiler;
    private $formatter;

    /**
     * Process the ContainerBuilder to replace DefinitionDecorator instances with their real Definition instances.
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $this->container = $container;
        $this->compiler = $container->getCompiler();
        $this->formatter = $this->compiler->getLoggingFormatter();

        foreach (array_keys($container->getDefinitions()) as $id) {
            // yes, we are specifically fetching the definition from the
            // container to ensure we are not operating on stale data
            $definition = $container->getDefinition($id);
            if (!$definition instanceof DefinitionDecorator || $definition->isAbstract()) {
                continue;
            }

            $this->resolveDefinition($id, $definition);
        }
    }

    /**
     * Resolves the definition
     *
     * @param string              $id         The definition identifier
     * @param DefinitionDecorator $definition
     *
     * @return Definition
     *
     * @throws \RuntimeException When the definition is invalid
     */
    private function resolveDefinition($id, DefinitionDecorator $definition)
    {
        if (!$this->container->hasDefinition($parent = $definition->getParent())) {
            throw new RuntimeException(sprintf('The parent definition "%s" defined for definition "%s" does not exist.', $parent, $id));
        }

        $parentDef = $this->container->getDefinition($parent);
        if ($parentDef instanceof DefinitionDecorator) {
            $parentDef = $this->resolveDefinition($parent, $parentDef);
        }

        $this->compiler->addLogMessage($this->formatter->formatResolveInheritance($this, $id, $parent));
        $def = new Definition();

        // merge in parent definition
        // purposely ignored attributes: scope, abstract, tags
        $def->setClass($parentDef->getClass());
        $def->setArguments($parentDef->getArguments());
        $def->setMethodCalls($parentDef->getMethodCalls());
        $def->setProperties($parentDef->getProperties());
        $def->setFactoryClass($parentDef->getFactoryClass());
        $def->setFactoryMethod($parentDef->getFactoryMethod());
        $def->setFactoryService($parentDef->getFactoryService());
        $def->setConfigurator($parentDef->getConfigurator());
        $def->setFile($parentDef->getFile());
        $def->setPublic($parentDef->isPublic());
        $def->setLazy($parentDef->isLazy());

        // overwrite with values specified in the decorator
        $changes = $definition->getChanges();
        if (isset($changes['class'])) {
            $def->setClass($definition->getClass());
        }
        if (isset($changes['factory_class'])) {
            $def->setFactoryClass($definition->getFactoryClass());
        }
        if (isset($changes['factory_method'])) {
            $def->setFactoryMethod($definition->getFactoryMethod());
        }
        if (isset($changes['factory_service'])) {
            $def->setFactoryService($definition->getFactoryService());
        }
        if (isset($changes['configurator'])) {
            $def->setConfigurator($definition->getConfigurator());
        }
        if (isset($changes['file'])) {
            $def->setFile($definition->getFile());
        }
        if (isset($changes['public'])) {
            $def->setPublic($definition->isPublic());
        }
        if (isset($changes['lazy'])) {
            $def->setLazy($definition->isLazy());
        }

        // merge arguments
        foreach ($definition->getArguments() as $k => $v) {
            if (is_numeric($k)) {
                $def->addArgument($v);
                continue;
            }

            if (0 !== strpos($k, 'index_')) {
                throw new RuntimeException(sprintf('Invalid argument key "%s" found.', $k));
            }

            $index = (integer) substr($k, strlen('index_'));
            $def->replaceArgument($index, $v);
        }

        // merge properties
        foreach ($definition->getProperties() as $k => $v) {
            $def->setProperty($k, $v);
        }

        // append method calls
        if (count($calls = $definition->getMethodCalls()) > 0) {
            $def->setMethodCalls(array_merge($def->getMethodCalls(), $calls));
        }

        // these attributes are always taken from the child
        $def->setAbstract($definition->isAbstract());
        $def->setScope($definition->getScope());
        $def->setTags($definition->getTags());

        // set new definition on container
        $this->container->setDefinition($id, $def);

        return $def;
    }
}
PK]_�\��ddSpear/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;

/**
 * This pass validates each definition individually only taking the information
 * into account which is contained in the definition itself.
 *
 * Later passes can rely on the following, and specifically do not need to
 * perform these checks themselves:
 *
 * - non synthetic, non abstract services always have a class set
 * - synthetic services are always public
 * - synthetic services are always of non-prototype scope
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class CheckDefinitionValidityPass implements CompilerPassInterface
{
    /**
     * Processes the ContainerBuilder to validate the Definition.
     *
     * @param ContainerBuilder $container
     *
     * @throws RuntimeException When the Definition is invalid
     */
    public function process(ContainerBuilder $container)
    {
        foreach ($container->getDefinitions() as $id => $definition) {
            // synthetic service is public
            if ($definition->isSynthetic() && !$definition->isPublic()) {
                throw new RuntimeException(sprintf(
                    'A synthetic service ("%s") must be public.',
                    $id
                ));
            }

            // synthetic service has non-prototype scope
            if ($definition->isSynthetic() && ContainerInterface::SCOPE_PROTOTYPE === $definition->getScope()) {
                throw new RuntimeException(sprintf(
                    'A synthetic service ("%s") cannot be of scope "prototype".',
                    $id
                ));
            }

            // non-synthetic, non-abstract service has class
            if (!$definition->isAbstract() && !$definition->isSynthetic() && !$definition->getClass()) {
                if ($definition->getFactoryClass() || $definition->getFactoryService()) {
                    throw new RuntimeException(sprintf(
                        'Please add the class to service "%s" even if it is constructed by a factory '
                       .'since we might need to add method calls based on compile-time checks.',
                       $id
                    ));
                }

                throw new RuntimeException(sprintf(
                    'The definition for "%s" has no class. If you intend to inject '
                   .'this service dynamically at runtime, please mark it as synthetic=true. '
                   .'If this is an abstract definition solely used by child definitions, '
                   .'please add abstract=true, otherwise specify a class to get rid of this error.',
                   $id
                ));
            }

            // tag attribute values must be scalars
            foreach ($definition->getTags() as $name => $tags) {
                foreach ($tags as $attributes) {
                    foreach ($attributes as $attribute => $value) {
                        if (!is_scalar($value) && null !== $value) {
                            throw new RuntimeException(sprintf('A "tags" attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s".', $id, $name, $attribute));
                        }
                    }
                }
            }
        }
    }
}
PK]_�\�_9��Mpear/Symfony/Component/DependencyInjection/Compiler/CompilerPassInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Interface that must be implemented by compilation passes
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 *
 * @api
 */
interface CompilerPassInterface
{
    /**
     * You can modify the container here before it is dumped to PHP code.
     *
     * @param ContainerBuilder $container
     *
     * @api
     */
    public function process(ContainerBuilder $container);
}
PK`_�\C�\Z��Bpear/Symfony/Component/DependencyInjection/Compiler/PassConfig.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

/**
 * Compiler Pass Configuration
 *
 * This class has a default configuration embedded.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 *
 * @api
 */
class PassConfig
{
    const TYPE_AFTER_REMOVING = 'afterRemoving';
    const TYPE_BEFORE_OPTIMIZATION = 'beforeOptimization';
    const TYPE_BEFORE_REMOVING = 'beforeRemoving';
    const TYPE_OPTIMIZE = 'optimization';
    const TYPE_REMOVE = 'removing';

    private $mergePass;
    private $afterRemovingPasses = array();
    private $beforeOptimizationPasses = array();
    private $beforeRemovingPasses = array();
    private $optimizationPasses;
    private $removingPasses;

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->mergePass = new MergeExtensionConfigurationPass();

        $this->optimizationPasses = array(
            new ResolveDefinitionTemplatesPass(),
            new ResolveParameterPlaceHoldersPass(),
            new CheckDefinitionValidityPass(),
            new ResolveReferencesToAliasesPass(),
            new ResolveInvalidReferencesPass(),
            new AnalyzeServiceReferencesPass(true),
            new CheckCircularReferencesPass(),
            new CheckReferenceValidityPass(),
        );

        $this->removingPasses = array(
            new RemovePrivateAliasesPass(),
            new RemoveAbstractDefinitionsPass(),
            new ReplaceAliasByActualDefinitionPass(),
            new RepeatedPass(array(
                new AnalyzeServiceReferencesPass(),
                new InlineServiceDefinitionsPass(),
                new AnalyzeServiceReferencesPass(),
                new RemoveUnusedDefinitionsPass(),
            )),
            new CheckExceptionOnInvalidReferenceBehaviorPass(),
        );
    }

    /**
     * Returns all passes in order to be processed.
     *
     * @return array An array of all passes to process
     *
     * @api
     */
    public function getPasses()
    {
        return array_merge(
            array($this->mergePass),
            $this->beforeOptimizationPasses,
            $this->optimizationPasses,
            $this->beforeRemovingPasses,
            $this->removingPasses,
            $this->afterRemovingPasses
        );
    }

    /**
     * Adds a pass.
     *
     * @param CompilerPassInterface $pass A Compiler pass
     * @param string                $type The pass type
     *
     * @throws InvalidArgumentException when a pass type doesn't exist
     *
     * @api
     */
    public function addPass(CompilerPassInterface $pass, $type = self::TYPE_BEFORE_OPTIMIZATION)
    {
        $property = $type.'Passes';
        if (!isset($this->$property)) {
            throw new InvalidArgumentException(sprintf('Invalid type "%s".', $type));
        }

        $passes = &$this->$property;
        $passes[] = $pass;
    }

    /**
     * Gets all passes for the AfterRemoving pass.
     *
     * @return array An array of passes
     *
     * @api
     */
    public function getAfterRemovingPasses()
    {
        return $this->afterRemovingPasses;
    }

    /**
     * Gets all passes for the BeforeOptimization pass.
     *
     * @return array An array of passes
     *
     * @api
     */
    public function getBeforeOptimizationPasses()
    {
        return $this->beforeOptimizationPasses;
    }

    /**
     * Gets all passes for the BeforeRemoving pass.
     *
     * @return array An array of passes
     *
     * @api
     */
    public function getBeforeRemovingPasses()
    {
        return $this->beforeRemovingPasses;
    }

    /**
     * Gets all passes for the Optimization pass.
     *
     * @return array An array of passes
     *
     * @api
     */
    public function getOptimizationPasses()
    {
        return $this->optimizationPasses;
    }

    /**
     * Gets all passes for the Removing pass.
     *
     * @return array An array of passes
     *
     * @api
     */
    public function getRemovingPasses()
    {
        return $this->removingPasses;
    }

    /**
     * Gets all passes for the Merge pass.
     *
     * @return array An array of passes
     *
     * @api
     */
    public function getMergePass()
    {
        return $this->mergePass;
    }

    /**
     * Sets the Merge Pass.
     *
     * @param CompilerPassInterface $pass The merge pass
     *
     * @api
     */
    public function setMergePass(CompilerPassInterface $pass)
    {
        $this->mergePass = $pass;
    }

    /**
     * Sets the AfterRemoving passes.
     *
     * @param array $passes An array of passes
     *
     * @api
     */
    public function setAfterRemovingPasses(array $passes)
    {
        $this->afterRemovingPasses = $passes;
    }

    /**
     * Sets the BeforeOptimization passes.
     *
     * @param array $passes An array of passes
     *
     * @api
     */
    public function setBeforeOptimizationPasses(array $passes)
    {
        $this->beforeOptimizationPasses = $passes;
    }

    /**
     * Sets the BeforeRemoving passes.
     *
     * @param array $passes An array of passes
     *
     * @api
     */
    public function setBeforeRemovingPasses(array $passes)
    {
        $this->beforeRemovingPasses = $passes;
    }

    /**
     * Sets the Optimization passes.
     *
     * @param array $passes An array of passes
     *
     * @api
     */
    public function setOptimizationPasses(array $passes)
    {
        $this->optimizationPasses = $passes;
    }

    /**
     * Sets the Removing passes.
     *
     * @param array $passes An array of passes
     *
     * @api
     */
    public function setRemovingPasses(array $passes)
    {
        $this->removingPasses = $passes;
    }
}
PK`_�\�i�Z�
�
Spear/Symfony/Component/DependencyInjection/Compiler/RemoveUnusedDefinitionsPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Removes unused service definitions from the container.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class RemoveUnusedDefinitionsPass implements RepeatablePassInterface
{
    private $repeatedPass;

    /**
     * {@inheritDoc}
     */
    public function setRepeatedPass(RepeatedPass $repeatedPass)
    {
        $this->repeatedPass = $repeatedPass;
    }

    /**
     * Processes the ContainerBuilder to remove unused definitions.
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $compiler = $container->getCompiler();
        $formatter = $compiler->getLoggingFormatter();
        $graph = $compiler->getServiceReferenceGraph();

        $hasChanged = false;
        foreach ($container->getDefinitions() as $id => $definition) {
            if ($definition->isPublic()) {
                continue;
            }

            if ($graph->hasNode($id)) {
                $edges = $graph->getNode($id)->getInEdges();
                $referencingAliases = array();
                $sourceIds = array();
                foreach ($edges as $edge) {
                    $node = $edge->getSourceNode();
                    $sourceIds[] = $node->getId();

                    if ($node->isAlias()) {
                        $referencingAliases[] = $node->getValue();
                    }
                }
                $isReferenced = (count(array_unique($sourceIds)) - count($referencingAliases)) > 0;
            } else {
                $referencingAliases = array();
                $isReferenced = false;
            }

            if (1 === count($referencingAliases) && false === $isReferenced) {
                $container->setDefinition((string) reset($referencingAliases), $definition);
                $definition->setPublic(true);
                $container->removeDefinition($id);
                $compiler->addLogMessage($formatter->formatRemoveService($this, $id, 'replaces alias '.reset($referencingAliases)));
            } elseif (0 === count($referencingAliases) && false === $isReferenced) {
                $container->removeDefinition($id);
                $compiler->addLogMessage($formatter->formatRemoveService($this, $id, 'unused'));
                $hasChanged = true;
            }
        }

        if ($hasChanged) {
            $this->repeatedPass->setRepeat();
        }
    }
}
PKa_�\��PPVpear/Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Replaces all references to aliases with references to the actual service.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ResolveReferencesToAliasesPass implements CompilerPassInterface
{
    private $container;

    /**
     * Processes the ContainerBuilder to replace references to aliases with actual service references.
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        $this->container = $container;

        foreach ($container->getDefinitions() as $definition) {
            if ($definition->isSynthetic() || $definition->isAbstract()) {
                continue;
            }

            $definition->setArguments($this->processArguments($definition->getArguments()));
            $definition->setMethodCalls($this->processArguments($definition->getMethodCalls()));
            $definition->setProperties($this->processArguments($definition->getProperties()));
        }

        foreach ($container->getAliases() as $id => $alias) {
            $aliasId = (string) $alias;
            if ($aliasId !== $defId = $this->getDefinitionId($aliasId)) {
                $container->setAlias($id, new Alias($defId, $alias->isPublic()));
            }
        }
    }

    /**
     * Processes the arguments to replace aliases.
     *
     * @param array $arguments An array of References
     *
     * @return array An array of References
     */
    private function processArguments(array $arguments)
    {
        foreach ($arguments as $k => $argument) {
            if (is_array($argument)) {
                $arguments[$k] = $this->processArguments($argument);
            } elseif ($argument instanceof Reference) {
                $defId = $this->getDefinitionId($id = (string) $argument);

                if ($defId !== $id) {
                    $arguments[$k] = new Reference($defId, $argument->getInvalidBehavior(), $argument->isStrict());
                }
            }
        }

        return $arguments;
    }

    /**
     * Resolves an alias into a definition id.
     *
     * @param string $id The definition or alias id to resolve
     *
     * @return string The definition id with aliases resolved
     */
    private function getDefinitionId($id)
    {
        while ($this->container->hasAlias($id)) {
            $id = (string) $this->container->getAlias($id);
        }

        return $id;
    }
}
PKa_�\��Eų�Opear/Symfony/Component/DependencyInjection/Compiler/RepeatablePassInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

/**
 * Interface that must be implemented by passes that are run as part of an
 * RepeatedPass.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface RepeatablePassInterface extends CompilerPassInterface
{
    /**
     * Sets the RepeatedPass interface.
     *
     * @param RepeatedPass $repeatedPass
     */
    public function setRepeatedPass(RepeatedPass $repeatedPass);
}
PKb_�\��Gp5
5
@pear/Symfony/Component/DependencyInjection/Compiler/Compiler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * This class is used to remove circular dependencies between individual passes.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 *
 * @api
 */
class Compiler
{
    private $passConfig;
    private $log = array();
    private $loggingFormatter;
    private $serviceReferenceGraph;

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->passConfig = new PassConfig();
        $this->serviceReferenceGraph = new ServiceReferenceGraph();
        $this->loggingFormatter = new LoggingFormatter();
    }

    /**
     * Returns the PassConfig.
     *
     * @return PassConfig The PassConfig instance
     *
     * @api
     */
    public function getPassConfig()
    {
        return $this->passConfig;
    }

    /**
     * Returns the ServiceReferenceGraph.
     *
     * @return ServiceReferenceGraph The ServiceReferenceGraph instance
     *
     * @api
     */
    public function getServiceReferenceGraph()
    {
        return $this->serviceReferenceGraph;
    }

    /**
     * Returns the logging formatter which can be used by compilation passes.
     *
     * @return LoggingFormatter
     */
    public function getLoggingFormatter()
    {
        return $this->loggingFormatter;
    }

    /**
     * Adds a pass to the PassConfig.
     *
     * @param CompilerPassInterface $pass A compiler pass
     * @param string                $type The type of the pass
     *
     * @api
     */
    public function addPass(CompilerPassInterface $pass, $type = PassConfig::TYPE_BEFORE_OPTIMIZATION)
    {
        $this->passConfig->addPass($pass, $type);
    }

    /**
     * Adds a log message.
     *
     * @param string $string The log message
     */
    public function addLogMessage($string)
    {
        $this->log[] = $string;
    }

    /**
     * Returns the log.
     *
     * @return array Log array
     */
    public function getLog()
    {
        return $this->log;
    }

    /**
     * Run the Compiler and process all Passes.
     *
     * @param ContainerBuilder $container
     *
     * @api
     */
    public function compile(ContainerBuilder $container)
    {
        foreach ($this->passConfig->getPasses() as $pass) {
            $pass->process($container);
        }
    }
}
PKb_�\L��FFZpear/Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Reference;

/**
 * Replaces aliases with actual service definitions, effectively removing these
 * aliases.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ReplaceAliasByActualDefinitionPass implements CompilerPassInterface
{
    private $compiler;
    private $formatter;
    private $sourceId;

    /**
     * Process the Container to replace aliases with service definitions.
     *
     * @param ContainerBuilder $container
     *
     * @throws InvalidArgumentException if the service definition does not exist
     */
    public function process(ContainerBuilder $container)
    {
        $this->compiler = $container->getCompiler();
        $this->formatter = $this->compiler->getLoggingFormatter();

        foreach ($container->getAliases() as $id => $alias) {
            $aliasId = (string) $alias;

            try {
                $definition = $container->getDefinition($aliasId);
            } catch (InvalidArgumentException $e) {
                throw new InvalidArgumentException(sprintf('Unable to replace alias "%s" with "%s".', $alias, $id), null, $e);
            }

            if ($definition->isPublic()) {
                continue;
            }

            $definition->setPublic(true);
            $container->setDefinition($id, $definition);
            $container->removeDefinition($aliasId);

            $this->updateReferences($container, $aliasId, $id);

            // we have to restart the process due to concurrent modification of
            // the container
            $this->process($container);

            break;
        }
    }

    /**
     * Updates references to remove aliases.
     *
     * @param ContainerBuilder $container The container
     * @param string           $currentId The alias identifier being replaced
     * @param string           $newId     The id of the service the alias points to
     */
    private function updateReferences($container, $currentId, $newId)
    {
        foreach ($container->getAliases() as $id => $alias) {
            if ($currentId === (string) $alias) {
                $container->setAlias($id, $newId);
            }
        }

        foreach ($container->getDefinitions() as $id => $definition) {
            $this->sourceId = $id;

            $definition->setArguments(
                $this->updateArgumentReferences($definition->getArguments(), $currentId, $newId)
            );

            $definition->setMethodCalls(
                $this->updateArgumentReferences($definition->getMethodCalls(), $currentId, $newId)
            );

            $definition->setProperties(
                $this->updateArgumentReferences($definition->getProperties(), $currentId, $newId)
            );
        }
    }

    /**
     * Updates argument references.
     *
     * @param array  $arguments An array of Arguments
     * @param string $currentId The alias identifier
     * @param string $newId     The identifier the alias points to
     *
     * @return array
     */
    private function updateArgumentReferences(array $arguments, $currentId, $newId)
    {
        foreach ($arguments as $k => $argument) {
            if (is_array($argument)) {
                $arguments[$k] = $this->updateArgumentReferences($argument, $currentId, $newId);
            } elseif ($argument instanceof Reference) {
                if ($currentId === (string) $argument) {
                    $arguments[$k] = new Reference($newId, $argument->getInvalidBehavior());
                    $this->compiler->addLogMessage($this->formatter->formatUpdateReference($this, $this->sourceId, $currentId, $newId));
                }
            }
        }

        return $arguments;
    }
}
PKc_�\q8I���Fpear/Symfony/Component/DependencyInjection/ContainerAwareInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * ContainerAwareInterface should be implemented by classes that depends on a Container.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface ContainerAwareInterface
{
    /**
     * Sets the Container.
     *
     * @param ContainerInterface|null $container A ContainerInterface instance or null
     *
     * @api
     */
    public function setContainer(ContainerInterface $container = null);
}
PKc_�\��F"��8pear/Symfony/Component/DependencyInjection/Parameter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * Parameter represents a parameter reference.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Parameter
{
    private $id;

    /**
     * Constructor.
     *
     * @param string $id The parameter key
     */
    public function __construct($id)
    {
        $this->id = $id;
    }

    /**
     * __toString.
     *
     * @return string The parameter key
     */
    public function __toString()
    {
        return (string) $this->id;
    }
}
PKd_�\-R�],,8pear/Symfony/Component/DependencyInjection/Reference.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * Reference represents a service reference.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Reference
{
    private $id;
    private $invalidBehavior;
    private $strict;

    /**
     * Constructor.
     *
     * @param string  $id              The service identifier
     * @param int     $invalidBehavior The behavior when the service does not exist
     * @param Boolean $strict          Sets how this reference is validated
     *
     * @see Container
     */
    public function __construct($id, $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $strict = true)
    {
        $this->id = strtolower($id);
        $this->invalidBehavior = $invalidBehavior;
        $this->strict = $strict;
    }

    /**
     * __toString.
     *
     * @return string The service identifier
     */
    public function __toString()
    {
        return $this->id;
    }

    /**
     * Returns the behavior to be used when the service does not exist.
     *
     * @return int
     */
    public function getInvalidBehavior()
    {
        return $this->invalidBehavior;
    }

    /**
     * Returns true when this Reference is strict
     *
     * @return Boolean
     */
    public function isStrict()
    {
        return $this->strict;
    }
}
PKd_�\�,x�mm4pear/Symfony/Component/DependencyInjection/Scope.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * Scope class.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 *
 * @api
 */
class Scope implements ScopeInterface
{
    private $name;
    private $parentName;

    /**
     * @api
     */
    public function __construct($name, $parentName = ContainerInterface::SCOPE_CONTAINER)
    {
        $this->name = $name;
        $this->parentName = $parentName;
    }

    /**
     * @api
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @api
     */
    public function getParentName()
    {
        return $this->parentName;
    }
}
PKe_�\��]]9pear/Symfony/Component/DependencyInjection/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\DependencyInjection\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PKe_�\}���Epear/Symfony/Component/DependencyInjection/Dumper/DumperInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Dumper;

/**
 * DumperInterface is the interface implemented by service container dumper classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface DumperInterface
{
    /**
     * Dumps the service container.
     *
     * @param array $options An array of options
     *
     * @return string The representation of the service container
     *
     * @api
     */
    public function dump(array $options = array());
}
PKe_�\N/�++<pear/Symfony/Component/DependencyInjection/Dumper/Dumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Dumper;

use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * Dumper is the abstract class for all built-in dumpers.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
abstract class Dumper implements DumperInterface
{
    protected $container;

    /**
     * Constructor.
     *
     * @param ContainerBuilder $container The service container to dump
     *
     * @api
     */
    public function __construct(ContainerBuilder $container)
    {
        $this->container = $container;
    }
}
PKf_�\"�^� � �?pear/Symfony/Component/DependencyInjection/Dumper/PhpDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Dumper;

use Symfony\Component\DependencyInjection\Variable;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface as ProxyDumper;
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\NullDumper;
use Symfony\Component\DependencyInjection\ExpressionLanguage;
use Symfony\Component\ExpressionLanguage\Expression;

/**
 * PhpDumper dumps a service container as a PHP class.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 *
 * @api
 */
class PhpDumper extends Dumper
{
    /**
     * Characters that might appear in the generated variable name as first character
     * @var string
     */
    const FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz';

    /**
     * Characters that might appear in the generated variable name as any but the first character
     * @var string
     */
    const NON_FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789_';

    private $inlinedDefinitions;
    private $definitionVariables;
    private $referenceVariables;
    private $variableCount;
    private $reservedVariables = array('instance', 'class');
    private $expressionLanguage;

    /**
     * @var \Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\DumperInterface
     */
    private $proxyDumper;

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function __construct(ContainerBuilder $container)
    {
        parent::__construct($container);

        $this->inlinedDefinitions = new \SplObjectStorage();
    }

    /**
     * Sets the dumper to be used when dumping proxies in the generated container.
     *
     * @param ProxyDumper $proxyDumper
     */
    public function setProxyDumper(ProxyDumper $proxyDumper)
    {
        $this->proxyDumper = $proxyDumper;
    }

    /**
     * Dumps the service container as a PHP class.
     *
     * Available options:
     *
     *  * class:      The class name
     *  * base_class: The base class name
     *  * namespace:  The class namespace
     *
     * @param array $options An array of options
     *
     * @return string A PHP class representing of the service container
     *
     * @api
     */
    public function dump(array $options = array())
    {
        $options = array_merge(array(
            'class'      => 'ProjectServiceContainer',
            'base_class' => 'Container',
            'namespace' => '',
        ), $options);

        $code = $this->startClass($options['class'], $options['base_class'], $options['namespace']);

        if ($this->container->isFrozen()) {
            $code .= $this->addFrozenConstructor();
        } else {
            $code .= $this->addConstructor();
        }

        $code .=
            $this->addServices().
            $this->addDefaultParametersMethod().
            $this->endClass().
            $this->addProxyClasses()
        ;

        return $code;
    }

    /**
     * Retrieves the currently set proxy dumper or instantiates one.
     *
     * @return ProxyDumper
     */
    private function getProxyDumper()
    {
        if (!$this->proxyDumper) {
            $this->proxyDumper = new NullDumper();
        }

        return $this->proxyDumper;
    }

    /**
     * Generates Service local temp variables.
     *
     * @param string $cId
     * @param string $definition
     *
     * @return string
     */
    private function addServiceLocalTempVariables($cId, $definition)
    {
        static $template = "        \$%s = %s;\n";

        $localDefinitions = array_merge(
            array($definition),
            $this->getInlinedDefinitions($definition)
        );

        $calls = $behavior = array();
        foreach ($localDefinitions as $iDefinition) {
            $this->getServiceCallsFromArguments($iDefinition->getArguments(), $calls, $behavior);
            $this->getServiceCallsFromArguments($iDefinition->getMethodCalls(), $calls, $behavior);
            $this->getServiceCallsFromArguments($iDefinition->getProperties(), $calls, $behavior);
        }

        $code = '';
        foreach ($calls as $id => $callCount) {
            if ('service_container' === $id || $id === $cId) {
                continue;
            }

            if ($callCount > 1) {
                $name = $this->getNextVariableName();
                $this->referenceVariables[$id] = new Variable($name);

                if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE === $behavior[$id]) {
                    $code .= sprintf($template, $name, $this->getServiceCall($id));
                } else {
                    $code .= sprintf($template, $name, $this->getServiceCall($id, new Reference($id, ContainerInterface::NULL_ON_INVALID_REFERENCE)));
                }
            }
        }

        if ('' !== $code) {
            $code .= "\n";
        }

        return $code;
    }

    /**
     * Generates code for the proxies to be attached after the container class
     *
     * @return string
     */
    private function addProxyClasses()
    {
        /* @var $definitions Definition[] */
        $definitions = array_filter(
            $this->container->getDefinitions(),
            array($this->getProxyDumper(), 'isProxyCandidate')
        );
        $code = '';

        foreach ($definitions as $definition) {
            $code .= "\n" . $this->getProxyDumper()->getProxyCode($definition);
        }

        return $code;
    }

    /**
     * Generates the require_once statement for service includes.
     *
     * @param string     $id         The service id
     * @param Definition $definition
     *
     * @return string
     */
    private function addServiceInclude($id, $definition)
    {
        $template = "        require_once %s;\n";
        $code = '';

        if (null !== $file = $definition->getFile()) {
            $code .= sprintf($template, $this->dumpValue($file));
        }

        foreach ($this->getInlinedDefinitions($definition) as $definition) {
            if (null !== $file = $definition->getFile()) {
                $code .= sprintf($template, $this->dumpValue($file));
            }
        }

        if ('' !== $code) {
            $code .= "\n";
        }

        return $code;
    }

    /**
     * Generates the inline definition of a service.
     *
     * @param string     $id
     * @param Definition $definition
     *
     * @return string
     *
     * @throws RuntimeException When the factory definition is incomplete
     * @throws ServiceCircularReferenceException When a circular reference is detected
     */
    private function addServiceInlinedDefinitions($id, $definition)
    {
        $code = '';
        $variableMap = $this->definitionVariables;
        $nbOccurrences = new \SplObjectStorage();
        $processed = new \SplObjectStorage();
        $inlinedDefinitions = $this->getInlinedDefinitions($definition);

        foreach ($inlinedDefinitions as $definition) {
            if (false === $nbOccurrences->contains($definition)) {
                $nbOccurrences->offsetSet($definition, 1);
            } else {
                $i = $nbOccurrences->offsetGet($definition);
                $nbOccurrences->offsetSet($definition, $i + 1);
            }
        }

        foreach ($inlinedDefinitions as $sDefinition) {
            if ($processed->contains($sDefinition)) {
                continue;
            }
            $processed->offsetSet($sDefinition);

            $class = $this->dumpValue($sDefinition->getClass());
            if ($nbOccurrences->offsetGet($sDefinition) > 1 || $sDefinition->getMethodCalls() || $sDefinition->getProperties() || null !== $sDefinition->getConfigurator() || false !== strpos($class, '$')) {
                $name = $this->getNextVariableName();
                $variableMap->offsetSet($sDefinition, new Variable($name));

                // a construct like:
                // $a = new ServiceA(ServiceB $b); $b = new ServiceB(ServiceA $a);
                // this is an indication for a wrong implementation, you can circumvent this problem
                // by setting up your service structure like this:
                // $b = new ServiceB();
                // $a = new ServiceA(ServiceB $b);
                // $b->setServiceA(ServiceA $a);
                if ($this->hasReference($id, $sDefinition->getArguments())) {
                    throw new ServiceCircularReferenceException($id, array($id));
                }

                $code .= $this->addNewInstance($id, $sDefinition, '$'.$name, ' = ');

                if (!$this->hasReference($id, $sDefinition->getMethodCalls(), true) && !$this->hasReference($id, $sDefinition->getProperties(), true)) {
                    $code .= $this->addServiceMethodCalls(null, $sDefinition, $name);
                    $code .= $this->addServiceProperties(null, $sDefinition, $name);
                    $code .= $this->addServiceConfigurator(null, $sDefinition, $name);
                }

                $code .= "\n";
            }
        }

        return $code;
    }

    /**
     * Adds the service return statement.
     *
     * @param string     $id         Service id
     * @param Definition $definition
     *
     * @return string
     */
    private function addServiceReturn($id, $definition)
    {
        if ($this->isSimpleInstance($id, $definition)) {
            return "    }\n";
        }

        return "\n        return \$instance;\n    }\n";
    }

    /**
     * Generates the service instance.
     *
     * @param string     $id
     * @param Definition $definition
     *
     * @return string
     *
     * @throws InvalidArgumentException
     * @throws RuntimeException
     */
    private function addServiceInstance($id, $definition)
    {
        $class = $this->dumpValue($definition->getClass());

        if (0 === strpos($class, "'") && !preg_match('/^\'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
            throw new InvalidArgumentException(sprintf('"%s" is not a valid class name for the "%s" service.', $class, $id));
        }

        $simple           = $this->isSimpleInstance($id, $definition);
        $isProxyCandidate = $this->getProxyDumper()->isProxyCandidate($definition);
        $instantiation    = '';

        if (!$isProxyCandidate && ContainerInterface::SCOPE_CONTAINER === $definition->getScope()) {
            $instantiation = "\$this->services['$id'] = ".($simple ? '' : '$instance');
        } elseif (!$isProxyCandidate && ContainerInterface::SCOPE_PROTOTYPE !== $scope = $definition->getScope()) {
            $instantiation = "\$this->services['$id'] = \$this->scopedServices['$scope']['$id'] = ".($simple ? '' : '$instance');
        } elseif (!$simple) {
            $instantiation = '$instance';
        }

        $return = '';
        if ($simple) {
            $return = 'return ';
        } else {
            $instantiation .= ' = ';
        }

        $code = $this->addNewInstance($id, $definition, $return, $instantiation);

        if (!$simple) {
            $code .= "\n";
        }

        return $code;
    }

    /**
     * Checks if the definition is a simple instance.
     *
     * @param string     $id
     * @param Definition $definition
     *
     * @return Boolean
     */
    private function isSimpleInstance($id, $definition)
    {
        foreach (array_merge(array($definition), $this->getInlinedDefinitions($definition)) as $sDefinition) {
            if ($definition !== $sDefinition && !$this->hasReference($id, $sDefinition->getMethodCalls())) {
                continue;
            }

            if ($sDefinition->getMethodCalls() || $sDefinition->getProperties() || $sDefinition->getConfigurator()) {
                return false;
            }
        }

        return true;
    }

    /**
     * Adds method calls to a service definition.
     *
     * @param string     $id
     * @param Definition $definition
     * @param string     $variableName
     *
     * @return string
     */
    private function addServiceMethodCalls($id, $definition, $variableName = 'instance')
    {
        $calls = '';
        foreach ($definition->getMethodCalls() as $call) {
            $arguments = array();
            foreach ($call[1] as $value) {
                $arguments[] = $this->dumpValue($value);
            }

            $calls .= $this->wrapServiceConditionals($call[1], sprintf("        \$%s->%s(%s);\n", $variableName, $call[0], implode(', ', $arguments)));
        }

        return $calls;
    }

    private function addServiceProperties($id, $definition, $variableName = 'instance')
    {
        $code = '';
        foreach ($definition->getProperties() as $name => $value) {
            $code .= sprintf("        \$%s->%s = %s;\n", $variableName, $name, $this->dumpValue($value));
        }

        return $code;
    }

    /**
     * Generates the inline definition setup.
     *
     * @param string     $id
     * @param Definition $definition
     * @return string
     */
    private function addServiceInlinedDefinitionsSetup($id, $definition)
    {
        $this->referenceVariables[$id] = new Variable('instance');

        $code = '';
        $processed = new \SplObjectStorage();
        foreach ($this->getInlinedDefinitions($definition) as $iDefinition) {
            if ($processed->contains($iDefinition)) {
                continue;
            }
            $processed->offsetSet($iDefinition);

            if (!$this->hasReference($id, $iDefinition->getMethodCalls(), true) && !$this->hasReference($id, $iDefinition->getProperties(), true)) {
                continue;
            }

            // if the instance is simple, the return statement has already been generated
            // so, the only possible way to get there is because of a circular reference
            if ($this->isSimpleInstance($id, $definition)) {
                throw new ServiceCircularReferenceException($id, array($id));
            }

            $name = (string) $this->definitionVariables->offsetGet($iDefinition);
            $code .= $this->addServiceMethodCalls(null, $iDefinition, $name);
            $code .= $this->addServiceProperties(null, $iDefinition, $name);
            $code .= $this->addServiceConfigurator(null, $iDefinition, $name);
        }

        if ('' !== $code) {
            $code .= "\n";
        }

        return $code;
    }

    /**
     * Adds configurator definition
     *
     * @param string     $id
     * @param Definition $definition
     * @param string     $variableName
     *
     * @return string
     */
    private function addServiceConfigurator($id, $definition, $variableName = 'instance')
    {
        if (!$callable = $definition->getConfigurator()) {
            return '';
        }

        if (is_array($callable)) {
            if ($callable[0] instanceof Reference) {
                return sprintf("        %s->%s(\$%s);\n", $this->getServiceCall((string) $callable[0]), $callable[1], $variableName);
            }

            return sprintf("        call_user_func(array(%s, '%s'), \$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName);
        }

        return sprintf("        %s(\$%s);\n", $callable, $variableName);
    }

    /**
     * Adds a service
     *
     * @param string     $id
     * @param Definition $definition
     *
     * @return string
     */
    private function addService($id, $definition)
    {
        $this->definitionVariables = new \SplObjectStorage();
        $this->referenceVariables = array();
        $this->variableCount = 0;

        $return = array();

        if ($definition->isSynthetic()) {
            $return[] = '@throws RuntimeException always since this service is expected to be injected dynamically';
        } elseif ($class = $definition->getClass()) {
            $return[] = sprintf("@return %s A %s instance.", 0 === strpos($class, '%') ? 'object' : $class, $class);
        } elseif ($definition->getFactoryClass()) {
            $return[] = sprintf('@return object An instance returned by %s::%s().', $definition->getFactoryClass(), $definition->getFactoryMethod());
        } elseif ($definition->getFactoryService()) {
            $return[] = sprintf('@return object An instance returned by %s::%s().', $definition->getFactoryService(), $definition->getFactoryMethod());
        }

        $scope = $definition->getScope();
        if (!in_array($scope, array(ContainerInterface::SCOPE_CONTAINER, ContainerInterface::SCOPE_PROTOTYPE))) {
            if ($return && 0 === strpos($return[count($return) - 1], '@return')) {
                $return[] = '';
            }
            $return[] = sprintf("@throws InactiveScopeException when the '%s' service is requested while the '%s' scope is not active", $id, $scope);
        }

        $return = implode("\n     * ", $return);

        $doc = '';
        if (ContainerInterface::SCOPE_PROTOTYPE !== $scope) {
            $doc .= <<<EOF

     *
     * This service is shared.
     * This method always returns the same instance of the service.
EOF;
        }

        if (!$definition->isPublic()) {
            $doc .= <<<EOF

     *
     * This service is private.
     * If you want to be able to request this service from the container directly,
     * make it public, otherwise you might end up with broken code.
EOF;
        }

        if ($definition->isLazy()) {
            $lazyInitialization    = '$lazyLoad = true';
            $lazyInitializationDoc = "\n     * @param boolean \$lazyLoad whether to try lazy-loading the service with a proxy\n     *";
        } else {
            $lazyInitialization    = '';
            $lazyInitializationDoc = '';
        }

        // with proxies, for 5.3.3 compatibility, the getter must be public to be accessible to the initializer
        $isProxyCandidate = $this->getProxyDumper()->isProxyCandidate($definition);
        $visibility       = $isProxyCandidate ? 'public' : 'protected';
        $code             = <<<EOF

    /**
     * Gets the '$id' service.$doc
     *$lazyInitializationDoc
     * $return
     */
    {$visibility} function get{$this->camelize($id)}Service($lazyInitialization)
    {

EOF;

        $code .= $isProxyCandidate ? $this->getProxyDumper()->getProxyFactoryCode($definition, $id) : '';

        if (!in_array($scope, array(ContainerInterface::SCOPE_CONTAINER, ContainerInterface::SCOPE_PROTOTYPE))) {
            $code .= <<<EOF
        if (!isset(\$this->scopedServices['$scope'])) {
            throw new InactiveScopeException('$id', '$scope');
        }


EOF;
        }

        if ($definition->isSynthetic()) {
            $code .= sprintf("        throw new RuntimeException('You have requested a synthetic service (\"%s\"). The DIC does not know how to construct this service.');\n    }\n", $id);
        } else {
            $code .=
                $this->addServiceInclude($id, $definition).
                $this->addServiceLocalTempVariables($id, $definition).
                $this->addServiceInlinedDefinitions($id, $definition).
                $this->addServiceInstance($id, $definition).
                $this->addServiceInlinedDefinitionsSetup($id, $definition).
                $this->addServiceMethodCalls($id, $definition).
                $this->addServiceProperties($id, $definition).
                $this->addServiceConfigurator($id, $definition).
                $this->addServiceReturn($id, $definition)
            ;
        }

        $this->definitionVariables = null;
        $this->referenceVariables = null;

        return $code;
    }

    /**
     * Adds multiple services
     *
     * @return string
     */
    private function addServices()
    {
        $publicServices = $privateServices = $synchronizers = '';
        $definitions = $this->container->getDefinitions();
        ksort($definitions);
        foreach ($definitions as $id => $definition) {
            if ($definition->isPublic()) {
                $publicServices .= $this->addService($id, $definition);
            } else {
                $privateServices .= $this->addService($id, $definition);
            }

            $synchronizers .= $this->addServiceSynchronizer($id, $definition);
        }

        return $publicServices.$synchronizers.$privateServices;
    }

    /**
     * Adds synchronizer methods.
     *
     * @param string     $id         A service identifier
     * @param Definition $definition A Definition instance
     */
    private function addServiceSynchronizer($id, Definition $definition)
    {
        if (!$definition->isSynchronized()) {
            return;
        }

        $code = '';
        foreach ($this->container->getDefinitions() as $definitionId => $definition) {
            foreach ($definition->getMethodCalls() as $call) {
                foreach ($call[1] as $argument) {
                    if ($argument instanceof Reference && $id == (string) $argument) {
                        $arguments = array();
                        foreach ($call[1] as $value) {
                            $arguments[] = $this->dumpValue($value);
                        }

                        $call = $this->wrapServiceConditionals($call[1], sprintf("\$this->get('%s')->%s(%s);", $definitionId, $call[0], implode(', ', $arguments)));

                        $code .= <<<EOF
        if (\$this->initialized('$definitionId')) {
            $call
        }

EOF;
                    }
                }
            }
        }

        if (!$code) {
            return;
        }

        return <<<EOF

    /**
     * Updates the '$id' service.
     */
    protected function synchronize{$this->camelize($id)}Service()
    {
$code    }

EOF;
    }

    private function addNewInstance($id, Definition $definition, $return, $instantiation)
    {
        $class = $this->dumpValue($definition->getClass());

        $arguments = array();
        foreach ($definition->getArguments() as $value) {
            $arguments[] = $this->dumpValue($value);
        }

        if (null !== $definition->getFactoryMethod()) {
            if (null !== $definition->getFactoryClass()) {
                return sprintf("        $return{$instantiation}call_user_func(array(%s, '%s')%s);\n", $this->dumpValue($definition->getFactoryClass()), $definition->getFactoryMethod(), $arguments ? ', '.implode(', ', $arguments) : '');
            }

            if (null !== $definition->getFactoryService()) {
                return sprintf("        $return{$instantiation}%s->%s(%s);\n", $this->getServiceCall($definition->getFactoryService()), $definition->getFactoryMethod(), implode(', ', $arguments));
            }

            throw new RuntimeException(sprintf('Factory method requires a factory service or factory class in service definition for %s', $id));
        }

        if (false !== strpos($class, '$')) {
            return sprintf("        \$class = %s;\n\n        $return{$instantiation}new \$class(%s);\n", $class, implode(', ', $arguments));
        }

        return sprintf("        $return{$instantiation}new \\%s(%s);\n", substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
    }

    /**
     * Adds the class headers.
     *
     * @param string $class     Class name
     * @param string $baseClass The name of the base class
     * @param string $namespace The class namespace
     *
     * @return string
     */
    private function startClass($class, $baseClass, $namespace)
    {
        $bagClass = $this->container->isFrozen() ? 'use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;' : 'use Symfony\Component\DependencyInjection\ParameterBag\\ParameterBag;';
        $namespaceLine = $namespace ? "namespace $namespace;\n" : '';

        return <<<EOF
<?php
$namespaceLine
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
$bagClass

/**
 * $class
 *
 * This class has been auto-generated
 * by the Symfony Dependency Injection Component.
 */
class $class extends $baseClass
{
EOF;
    }

    /**
     * Adds the constructor.
     *
     * @return string
     */
    private function addConstructor()
    {
        $arguments = $this->container->getParameterBag()->all() ? 'new ParameterBag($this->getDefaultParameters())' : null;

        $code = <<<EOF

    /**
     * Constructor.
     */
    public function __construct()
    {
        parent::__construct($arguments);

EOF;

        if (count($scopes = $this->container->getScopes()) > 0) {
            $code .= "\n";
            $code .= "        \$this->scopes = ".$this->dumpValue($scopes).";\n";
            $code .= "        \$this->scopeChildren = ".$this->dumpValue($this->container->getScopeChildren()).";\n";
        }

        $code .= $this->addMethodMap();
        $code .= $this->addAliases();

        $code .= <<<EOF
    }

EOF;

        return $code;
    }

    /**
     * Adds the constructor for a frozen container.
     *
     * @return string
     */
    private function addFrozenConstructor()
    {
        $code = <<<EOF

    /**
     * Constructor.
     */
    public function __construct()
    {
EOF;

        if ($this->container->getParameterBag()->all()) {
            $code .= "\n        \$this->parameters = \$this->getDefaultParameters();\n";
        }

        $code .= <<<EOF

        \$this->services =
        \$this->scopedServices =
        \$this->scopeStacks = array();

        \$this->set('service_container', \$this);

EOF;

        $code .= "\n";
        if (count($scopes = $this->container->getScopes()) > 0) {
            $code .= "        \$this->scopes = ".$this->dumpValue($scopes).";\n";
            $code .= "        \$this->scopeChildren = ".$this->dumpValue($this->container->getScopeChildren()).";\n";
        } else {
            $code .= "        \$this->scopes = array();\n";
            $code .= "        \$this->scopeChildren = array();\n";
        }

        $code .= $this->addMethodMap();
        $code .= $this->addAliases();

        $code .= <<<EOF
    }

EOF;

        return $code;
    }

    /**
     * Adds the methodMap property definition
     *
     * @return string
     */
    private function addMethodMap()
    {
        if (!$definitions = $this->container->getDefinitions()) {
            return '';
        }

        $code = "        \$this->methodMap = array(\n";
        ksort($definitions);
        foreach ($definitions as $id => $definition) {
            $code .= '            '.var_export($id, true).' => '.var_export('get'.$this->camelize($id).'Service', true).",\n";
        }

        return $code . "        );\n";
    }

    /**
     * Adds the aliases property definition
     *
     * @return string
     */
    private function addAliases()
    {
        if (!$aliases = $this->container->getAliases()) {
            if ($this->container->isFrozen()) {
                return "\n        \$this->aliases = array();\n";
            } else {
                return '';
            }
        }

        $code = "        \$this->aliases = array(\n";
        ksort($aliases);
        foreach ($aliases as $alias => $id) {
            $id = (string) $id;
            while (isset($aliases[$id])) {
                $id = (string) $aliases[$id];
            }
            $code .= '            '.var_export($alias, true).' => '.var_export($id, true).",\n";
        }

        return $code . "        );\n";
    }

    /**
     * Adds default parameters method.
     *
     * @return string
     */
    private function addDefaultParametersMethod()
    {
        if (!$this->container->getParameterBag()->all()) {
            return '';
        }

        $parameters = $this->exportParameters($this->container->getParameterBag()->all());

        $code = '';
        if ($this->container->isFrozen()) {
            $code .= <<<EOF

    /**
     * {@inheritdoc}
     */
    public function getParameter(\$name)
    {
        \$name = strtolower(\$name);

        if (!(isset(\$this->parameters[\$name]) || array_key_exists(\$name, \$this->parameters))) {
            throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', \$name));
        }

        return \$this->parameters[\$name];
    }

    /**
     * {@inheritdoc}
     */
    public function hasParameter(\$name)
    {
        \$name = strtolower(\$name);

        return isset(\$this->parameters[\$name]) || array_key_exists(\$name, \$this->parameters);
    }

    /**
     * {@inheritdoc}
     */
    public function setParameter(\$name, \$value)
    {
        throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
    }

    /**
     * {@inheritDoc}
     */
    public function getParameterBag()
    {
        if (null === \$this->parameterBag) {
            \$this->parameterBag = new FrozenParameterBag(\$this->parameters);
        }

        return \$this->parameterBag;
    }
EOF;
        }

        $code .= <<<EOF

    /**
     * Gets the default parameters.
     *
     * @return array An array of the default parameters
     */
    protected function getDefaultParameters()
    {
        return $parameters;
    }

EOF;

        return $code;
    }

    /**
     * Exports parameters.
     *
     * @param array   $parameters
     * @param string  $path
     * @param integer $indent
     *
     * @return string
     *
     * @throws InvalidArgumentException
     */
    private function exportParameters($parameters, $path = '', $indent = 12)
    {
        $php = array();
        foreach ($parameters as $key => $value) {
            if (is_array($value)) {
                $value = $this->exportParameters($value, $path.'/'.$key, $indent + 4);
            } elseif ($value instanceof Variable) {
                throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain variable references. Variable "%s" found in "%s".', $value, $path.'/'.$key));
            } elseif ($value instanceof Definition) {
                throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain service definitions. Definition for "%s" found in "%s".', $value->getClass(), $path.'/'.$key));
            } elseif ($value instanceof Reference) {
                throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain references to other services (reference to service "%s" found in "%s").', $value, $path.'/'.$key));
            } elseif ($value instanceof Expression) {
                throw new InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain expressions. Expression "%s" found in "%s".', $value, $path.'/'.$key));
            } else {
                $value = var_export($value, true);
            }

            $php[] = sprintf('%s%s => %s,', str_repeat(' ', $indent), var_export($key, true), $value);
        }

        return sprintf("array(\n%s\n%s)", implode("\n", $php), str_repeat(' ', $indent - 4));
    }

    /**
     * Ends the class definition.
     *
     * @return string
     */
    private function endClass()
    {
        return <<<EOF
}

EOF;
    }

    /**
     * Wraps the service conditionals.
     *
     * @param string $value
     * @param string $code
     *
     * @return string
     */
    private function wrapServiceConditionals($value, $code)
    {
        if (!$services = ContainerBuilder::getServiceConditionals($value)) {
            return $code;
        }

        $conditions = array();
        foreach ($services as $service) {
            $conditions[] = sprintf("\$this->has('%s')", $service);
        }

        // re-indent the wrapped code
        $code = implode("\n", array_map(function ($line) { return $line ? '    '.$line : $line; }, explode("\n", $code)));

        return sprintf("        if (%s) {\n%s        }\n", implode(' && ', $conditions), $code);
    }

    /**
     * Builds service calls from arguments.
     *
     * @param array  $arguments
     * @param array  &$calls    By reference
     * @param array  &$behavior By reference
     */
    private function getServiceCallsFromArguments(array $arguments, array &$calls, array &$behavior)
    {
        foreach ($arguments as $argument) {
            if (is_array($argument)) {
                $this->getServiceCallsFromArguments($argument, $calls, $behavior);
            } elseif ($argument instanceof Reference) {
                $id = (string) $argument;

                if (!isset($calls[$id])) {
                    $calls[$id] = 0;
                }
                if (!isset($behavior[$id])) {
                    $behavior[$id] = $argument->getInvalidBehavior();
                } elseif (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $behavior[$id]) {
                    $behavior[$id] = $argument->getInvalidBehavior();
                }

                $calls[$id] += 1;
            }
        }
    }

    /**
     * Returns the inline definition.
     *
     * @param Definition $definition
     *
     * @return array
     */
    private function getInlinedDefinitions(Definition $definition)
    {
        if (false === $this->inlinedDefinitions->contains($definition)) {
            $definitions = array_merge(
                $this->getDefinitionsFromArguments($definition->getArguments()),
                $this->getDefinitionsFromArguments($definition->getMethodCalls()),
                $this->getDefinitionsFromArguments($definition->getProperties())
            );

            $this->inlinedDefinitions->offsetSet($definition, $definitions);

            return $definitions;
        }

        return $this->inlinedDefinitions->offsetGet($definition);
    }

    /**
     * Gets the definition from arguments.
     *
     * @param array $arguments
     *
     * @return array
     */
    private function getDefinitionsFromArguments(array $arguments)
    {
        $definitions = array();
        foreach ($arguments as $argument) {
            if (is_array($argument)) {
                $definitions = array_merge($definitions, $this->getDefinitionsFromArguments($argument));
            } elseif ($argument instanceof Definition) {
                $definitions = array_merge(
                    $definitions,
                    $this->getInlinedDefinitions($argument),
                    array($argument)
                );
            }
        }

        return $definitions;
    }

    /**
     * Checks if a service id has a reference.
     *
     * @param string  $id
     * @param array   $arguments
     * @param Boolean $deep
     * @param array   $visited
     *
     * @return Boolean
     */
    private function hasReference($id, array $arguments, $deep = false, array $visited = array())
    {
        foreach ($arguments as $argument) {
            if (is_array($argument)) {
                if ($this->hasReference($id, $argument, $deep, $visited)) {
                    return true;
                }
            } elseif ($argument instanceof Reference) {
                $argumentId = (string) $argument;
                if ($id === $argumentId) {
                    return true;
                }

                if ($deep && !isset($visited[$argumentId])) {
                    $visited[$argumentId] = true;

                    $service = $this->container->getDefinition($argumentId);
                    $arguments = array_merge($service->getMethodCalls(), $service->getArguments(), $service->getProperties());

                    if ($this->hasReference($id, $arguments, $deep, $visited)) {
                        return true;
                    }
                }
            }
        }

        return false;
    }

    /**
     * Dumps values.
     *
     * @param array   $value
     * @param Boolean $interpolate
     *
     * @return string
     *
     * @throws RuntimeException
     */
    private function dumpValue($value, $interpolate = true)
    {
        if (is_array($value)) {
            $code = array();
            foreach ($value as $k => $v) {
                $code[] = sprintf('%s => %s', $this->dumpValue($k, $interpolate), $this->dumpValue($v, $interpolate));
            }

            return sprintf('array(%s)', implode(', ', $code));
        } elseif ($value instanceof Definition) {
            if (null !== $this->definitionVariables && $this->definitionVariables->contains($value)) {
                return $this->dumpValue($this->definitionVariables->offsetGet($value), $interpolate);
            }
            if (count($value->getMethodCalls()) > 0) {
                throw new RuntimeException('Cannot dump definitions which have method calls.');
            }
            if (null !== $value->getConfigurator()) {
                throw new RuntimeException('Cannot dump definitions which have a configurator.');
            }

            $arguments = array();
            foreach ($value->getArguments() as $argument) {
                $arguments[] = $this->dumpValue($argument);
            }
            $class = $this->dumpValue($value->getClass());

            if (false !== strpos($class, '$')) {
                throw new RuntimeException('Cannot dump definitions which have a variable class name.');
            }

            if (null !== $value->getFactoryMethod()) {
                if (null !== $value->getFactoryClass()) {
                    return sprintf("call_user_func(array(%s, '%s')%s)", $this->dumpValue($value->getFactoryClass()), $value->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
                } elseif (null !== $value->getFactoryService()) {
                    return sprintf("%s->%s(%s)", $this->getServiceCall($value->getFactoryService()), $value->getFactoryMethod(), implode(', ', $arguments));
                } else {
                    throw new RuntimeException('Cannot dump definitions which have factory method without factory service or factory class.');
                }
            }

            return sprintf("new \\%s(%s)", substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
        } elseif ($value instanceof Variable) {
            return '$'.$value;
        } elseif ($value instanceof Reference) {
            if (null !== $this->referenceVariables && isset($this->referenceVariables[$id = (string) $value])) {
                return $this->dumpValue($this->referenceVariables[$id], $interpolate);
            }

            return $this->getServiceCall((string) $value, $value);
        } elseif ($value instanceof Expression) {
            return $this->getExpressionLanguage()->compile((string) $value, array('container'));
        } elseif ($value instanceof Parameter) {
            return $this->dumpParameter($value);
        } elseif (true === $interpolate && is_string($value)) {
            if (preg_match('/^%([^%]+)%$/', $value, $match)) {
                // we do this to deal with non string values (Boolean, integer, ...)
                // the preg_replace_callback converts them to strings
                return $this->dumpParameter(strtolower($match[1]));
            } else {
                $that = $this;
                $replaceParameters = function ($match) use ($that) {
                    return "'.".$that->dumpParameter(strtolower($match[2])).".'";
                };

                $code = str_replace('%%', '%', preg_replace_callback('/(?<!%)(%)([^%]+)\1/', $replaceParameters, var_export($value, true)));

                return $code;
            }
        } elseif (is_object($value) || is_resource($value)) {
            throw new RuntimeException('Unable to dump a service container if a parameter is an object or a resource.');
        } else {
            return var_export($value, true);
        }
    }

    /**
     * Dumps a parameter
     *
     * @param string $name
     *
     * @return string
     */
    public function dumpParameter($name)
    {
        if ($this->container->isFrozen() && $this->container->hasParameter($name)) {
            return $this->dumpValue($this->container->getParameter($name), false);
        }

        return sprintf("\$this->getParameter('%s')", strtolower($name));
    }

    /**
     * Gets a service call
     *
     * @param string    $id
     * @param Reference $reference
     *
     * @return string
     */
    private function getServiceCall($id, Reference $reference = null)
    {
        if ('service_container' === $id) {
            return '$this';
        }

        if (null !== $reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $reference->getInvalidBehavior()) {
            return sprintf('$this->get(\'%s\', ContainerInterface::NULL_ON_INVALID_REFERENCE)', $id);
        } else {
            if ($this->container->hasAlias($id)) {
                $id = (string) $this->container->getAlias($id);
            }

            return sprintf('$this->get(\'%s\')', $id);
        }
    }

    /**
     * Convert a service id to a valid PHP method name.
     *
     * @param string $id
     *
     * @return string
     *
     * @throws InvalidArgumentException
     */
    private function camelize($id)
    {
        $name = Container::camelize($id);

        if (!preg_match('/^[a-zA-Z0-9_\x7f-\xff]+$/', $name)) {
            throw new InvalidArgumentException(sprintf('Service id "%s" cannot be converted to a valid PHP method name.', $id));
        }

        return $name;
    }

    /**
     * Returns the next name to use
     *
     * @return string
     */
    private function getNextVariableName()
    {
        $firstChars = self::FIRST_CHARS;
        $firstCharsLength = strlen($firstChars);
        $nonFirstChars = self::NON_FIRST_CHARS;
        $nonFirstCharsLength = strlen($nonFirstChars);

        while (true) {
            $name = '';
            $i = $this->variableCount;

            if ('' === $name) {
                $name .= $firstChars[$i%$firstCharsLength];
                $i = intval($i/$firstCharsLength);
            }

            while ($i > 0) {
                $i -= 1;
                $name .= $nonFirstChars[$i%$nonFirstCharsLength];
                $i = intval($i/$nonFirstCharsLength);
            }

            $this->variableCount += 1;

            // check that the name is not reserved
            if (in_array($name, $this->reservedVariables, true)) {
                continue;
            }

            return $name;
        }
    }

    private function getExpressionLanguage()
    {
        if (null === $this->expressionLanguage) {
            if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
                throw new RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
            }
            $this->expressionLanguage = new ExpressionLanguage();
        }

        return $this->expressionLanguage;
    }
}
PKg_�\����%�%Dpear/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Dumper;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;

/**
 * GraphvizDumper dumps a service container as a graphviz file.
 *
 * You can convert the generated dot file with the dot utility (http://www.graphviz.org/):
 *
 *   dot -Tpng container.dot > foo.png
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class GraphvizDumper extends Dumper
{
    private $nodes;
    private $edges;
    private $options = array(
            'graph' => array('ratio' => 'compress'),
            'node'  => array('fontsize' => 11, 'fontname' => 'Arial', 'shape' => 'record'),
            'edge'  => array('fontsize' => 9, 'fontname' => 'Arial', 'color' => 'grey', 'arrowhead' => 'open', 'arrowsize' => 0.5),
            'node.instance' => array('fillcolor' => '#9999ff', 'style' => 'filled'),
            'node.definition' => array('fillcolor' => '#eeeeee'),
            'node.missing' => array('fillcolor' => '#ff9999', 'style' => 'filled'),
        );

    /**
     * Dumps the service container as a graphviz graph.
     *
     * Available options:
     *
     *  * graph: The default options for the whole graph
     *  * node: The default options for nodes
     *  * edge: The default options for edges
     *  * node.instance: The default options for services that are defined directly by object instances
     *  * node.definition: The default options for services that are defined via service definition instances
     *  * node.missing: The default options for missing services
     *
     * @param array $options An array of options
     *
     * @return string The dot representation of the service container
     */
    public function dump(array $options = array())
    {
        foreach (array('graph', 'node', 'edge', 'node.instance', 'node.definition', 'node.missing') as $key) {
            if (isset($options[$key])) {
                $this->options[$key] = array_merge($this->options[$key], $options[$key]);
            }
        }

        $this->nodes = $this->findNodes();

        $this->edges = array();
        foreach ($this->container->getDefinitions() as $id => $definition) {
            $this->edges[$id] = array_merge(
                $this->findEdges($id, $definition->getArguments(), true, ''),
                $this->findEdges($id, $definition->getProperties(), false, '')
            );

            foreach ($definition->getMethodCalls() as $call) {
                $this->edges[$id] = array_merge(
                    $this->edges[$id],
                    $this->findEdges($id, $call[1], false, $call[0].'()')
                );
            }
        }

        return $this->startDot().$this->addNodes().$this->addEdges().$this->endDot();
    }

    /**
     * Returns all nodes.
     *
     * @return string A string representation of all nodes
     */
    private function addNodes()
    {
        $code = '';
        foreach ($this->nodes as $id => $node) {
            $aliases = $this->getAliases($id);

            $code .= sprintf("  node_%s [label=\"%s\\n%s\\n\", shape=%s%s];\n", $this->dotize($id), $id.($aliases ? ' ('.implode(', ', $aliases).')' : ''), $node['class'], $this->options['node']['shape'], $this->addAttributes($node['attributes']));
        }

        return $code;
    }

    /**
     * Returns all edges.
     *
     * @return string A string representation of all edges
     */
    private function addEdges()
    {
        $code = '';
        foreach ($this->edges as $id => $edges) {
            foreach ($edges as $edge) {
                $code .= sprintf("  node_%s -> node_%s [label=\"%s\" style=\"%s\"];\n", $this->dotize($id), $this->dotize($edge['to']), $edge['name'], $edge['required'] ? 'filled' : 'dashed');
            }
        }

        return $code;
    }

    /**
     * Finds all edges belonging to a specific service id.
     *
     * @param string  $id        The service id used to find edges
     * @param array   $arguments An array of arguments
     * @param Boolean $required
     * @param string  $name
     *
     * @return array An array of edges
     */
    private function findEdges($id, $arguments, $required, $name)
    {
        $edges = array();
        foreach ($arguments as $argument) {
            if ($argument instanceof Parameter) {
                $argument = $this->container->hasParameter($argument) ? $this->container->getParameter($argument) : null;
            } elseif (is_string($argument) && preg_match('/^%([^%]+)%$/', $argument, $match)) {
                $argument = $this->container->hasParameter($match[1]) ? $this->container->getParameter($match[1]) : null;
            }

            if ($argument instanceof Reference) {
                if (!$this->container->has((string) $argument)) {
                    $this->nodes[(string) $argument] = array('name' => $name, 'required' => $required, 'class' => '', 'attributes' => $this->options['node.missing']);
                }

                $edges[] = array('name' => $name, 'required' => $required, 'to' => $argument);
            } elseif (is_array($argument)) {
                $edges = array_merge($edges, $this->findEdges($id, $argument, $required, $name));
            }
        }

        return $edges;
    }

    /**
     * Finds all nodes.
     *
     * @return array An array of all nodes
     */
    private function findNodes()
    {
        $nodes = array();

        $container = $this->cloneContainer();

        foreach ($container->getDefinitions() as $id => $definition) {
            $nodes[$id] = array('class' => str_replace('\\', '\\\\', $this->container->getParameterBag()->resolveValue($definition->getClass())), 'attributes' => array_merge($this->options['node.definition'], array('style' => ContainerInterface::SCOPE_PROTOTYPE !== $definition->getScope() ? 'filled' : 'dotted')));

            $container->setDefinition($id, new Definition('stdClass'));
        }

        foreach ($container->getServiceIds() as $id) {
            $service = $container->get($id);

            if (in_array($id, array_keys($container->getAliases()))) {
                continue;
            }

            if (!$container->hasDefinition($id)) {
                $class = ('service_container' === $id) ? get_class($this->container) : get_class($service);
                $nodes[$id] = array('class' => str_replace('\\', '\\\\', $class), 'attributes' => $this->options['node.instance']);
            }
        }

        return $nodes;
    }

    private function cloneContainer()
    {
        $parameterBag = new ParameterBag($this->container->getParameterBag()->all());

        $container = new ContainerBuilder($parameterBag);
        $container->setDefinitions($this->container->getDefinitions());
        $container->setAliases($this->container->getAliases());
        $container->setResources($this->container->getResources());
        foreach ($this->container->getScopes() as $scope) {
            $container->addScope($scope);
        }
        foreach ($this->container->getExtensions() as $extension) {
            $container->registerExtension($extension);
        }

        return $container;
    }

    /**
     * Returns the start dot.
     *
     * @return string The string representation of a start dot
     */
    private function startDot()
    {
        return sprintf("digraph sc {\n  %s\n  node [%s];\n  edge [%s];\n\n",
            $this->addOptions($this->options['graph']),
            $this->addOptions($this->options['node']),
            $this->addOptions($this->options['edge'])
        );
    }

    /**
     * Returns the end dot.
     *
     * @return string
     */
    private function endDot()
    {
        return "}\n";
    }

    /**
     * Adds attributes
     *
     * @param array $attributes An array of attributes
     *
     * @return string A comma separated list of attributes
     */
    private function addAttributes($attributes)
    {
        $code = array();
        foreach ($attributes as $k => $v) {
            $code[] = sprintf('%s="%s"', $k, $v);
        }

        return $code ? ', '.implode(', ', $code) : '';
    }

    /**
     * Adds options
     *
     * @param array $options An array of options
     *
     * @return string A space separated list of options
     */
    private function addOptions($options)
    {
        $code = array();
        foreach ($options as $k => $v) {
            $code[] = sprintf('%s="%s"', $k, $v);
        }

        return implode(' ', $code);
    }

    /**
     * Dotizes an identifier.
     *
     * @param string $id The identifier to dotize
     *
     * @return string A dotized string
     */
    private function dotize($id)
    {
        return strtolower(preg_replace('/[^\w]/i', '_', $id));
    }

    /**
     * Compiles an array of aliases for a specified service id.
     *
     * @param string $id A service id
     *
     * @return array An array of aliases
     */
    private function getAliases($id)
    {
        $aliases = array();
        foreach ($this->container->getAliases() as $alias => $origin) {
            if ($id == $origin) {
                $aliases[] = $alias;
            }
        }

        return $aliases;
    }
}
PKg_�\��A�:$:$@pear/Symfony/Component/DependencyInjection/Dumper/YamlDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Dumper;

use Symfony\Component\Yaml\Dumper as YmlDumper;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\ExpressionLanguage\Expression;

/**
 * YamlDumper dumps a service container as a YAML string.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class YamlDumper extends Dumper
{
    private $dumper;

    /**
     * Constructor.
     *
     * @param ContainerBuilder $container The service container to dump
     *
     * @api
     */
    public function __construct(ContainerBuilder $container)
    {
        parent::__construct($container);

        $this->dumper = new YmlDumper();
    }

    /**
     * Dumps the service container as an YAML string.
     *
     * @param array $options An array of options
     *
     * @return string A YAML string representing of the service container
     *
     * @api
     */
    public function dump(array $options = array())
    {
        return $this->addParameters()."\n".$this->addServices();
    }

    /**
     * Adds a service
     *
     * @param string     $id
     * @param Definition $definition
     *
     * @return string
     */
    private function addService($id, $definition)
    {
        $code = "    $id:\n";
        if ($definition->getClass()) {
            $code .= sprintf("        class: %s\n", $definition->getClass());
        }

        if (!$definition->isPublic()) {
            $code .= "        public: false\n";
        }

        $tagsCode = '';
        foreach ($definition->getTags() as $name => $tags) {
            foreach ($tags as $attributes) {
                $att = array();
                foreach ($attributes as $key => $value) {
                    $att[] = sprintf('%s: %s', $this->dumper->dump($key), $this->dumper->dump($value));
                }
                $att = $att ? ', '.implode(' ', $att) : '';

                $tagsCode .= sprintf("            - { name: %s%s }\n", $this->dumper->dump($name), $att);
            }
        }
        if ($tagsCode) {
            $code .= "        tags:\n".$tagsCode;
        }

        if ($definition->getFile()) {
            $code .= sprintf("        file: %s\n", $definition->getFile());
        }

        if ($definition->isSynthetic()) {
            $code .= sprintf("        synthetic: true\n");
        }

        if ($definition->isSynchronized()) {
            $code .= sprintf("        synchronized: true\n");
        }

        if ($definition->getFactoryClass()) {
            $code .= sprintf("        factory_class: %s\n", $definition->getFactoryClass());
        }

        if ($definition->isLazy()) {
            $code .= sprintf("        lazy: true\n");
        }

        if ($definition->getFactoryMethod()) {
            $code .= sprintf("        factory_method: %s\n", $definition->getFactoryMethod());
        }

        if ($definition->getFactoryService()) {
            $code .= sprintf("        factory_service: %s\n", $definition->getFactoryService());
        }

        if ($definition->getArguments()) {
            $code .= sprintf("        arguments: %s\n", $this->dumper->dump($this->dumpValue($definition->getArguments()), 0));
        }

        if ($definition->getProperties()) {
            $code .= sprintf("        properties: %s\n", $this->dumper->dump($this->dumpValue($definition->getProperties()), 0));
        }

        if ($definition->getMethodCalls()) {
            $code .= sprintf("        calls:\n%s\n", $this->dumper->dump($this->dumpValue($definition->getMethodCalls()), 1, 12));
        }

        if (ContainerInterface::SCOPE_CONTAINER !== $scope = $definition->getScope()) {
            $code .= sprintf("        scope: %s\n", $scope);
        }

        if ($callable = $definition->getConfigurator()) {
            if (is_array($callable)) {
                if ($callable[0] instanceof Reference) {
                    $callable = array($this->getServiceCall((string) $callable[0], $callable[0]), $callable[1]);
                } else {
                    $callable = array($callable[0], $callable[1]);
                }
            }

            $code .= sprintf("        configurator: %s\n", $this->dumper->dump($callable, 0));
        }

        return $code;
    }

    /**
     * Adds a service alias
     *
     * @param string $alias
     * @param Alias  $id
     *
     * @return string
     */
    private function addServiceAlias($alias, $id)
    {
        if ($id->isPublic()) {
            return sprintf("    %s: @%s\n", $alias, $id);
        } else {
            return sprintf("    %s:\n        alias: %s\n        public: false", $alias, $id);
        }
    }

    /**
     * Adds services
     *
     * @return string
     */
    private function addServices()
    {
        if (!$this->container->getDefinitions()) {
            return '';
        }

        $code = "services:\n";
        foreach ($this->container->getDefinitions() as $id => $definition) {
            $code .= $this->addService($id, $definition);
        }

        $aliases = $this->container->getAliases();
        foreach ($aliases as $alias => $id) {
            while (isset($aliases[(string) $id])) {
                $id = $aliases[(string) $id];
            }
            $code .= $this->addServiceAlias($alias, $id);
        }

        return $code;
    }

    /**
     * Adds parameters
     *
     * @return string
     */
    private function addParameters()
    {
        if (!$this->container->getParameterBag()->all()) {
            return '';
        }

        $parameters = $this->prepareParameters($this->container->getParameterBag()->all(), $this->container->isFrozen());

        return $this->dumper->dump(array('parameters' => $parameters), 2);
    }

    /**
     * Dumps the value to YAML format
     *
     * @param mixed $value
     *
     * @return mixed
     *
     * @throws RuntimeException When trying to dump object or resource
     */
    private function dumpValue($value)
    {
        if (is_array($value)) {
            $code = array();
            foreach ($value as $k => $v) {
                $code[$k] = $this->dumpValue($v);
            }

            return $code;
        } elseif ($value instanceof Reference) {
            return $this->getServiceCall((string) $value, $value);
        } elseif ($value instanceof Parameter) {
            return $this->getParameterCall((string) $value);
        } elseif ($value instanceof Expression) {
            return $this->getExpressionCall((string) $value);
        } elseif (is_object($value) || is_resource($value)) {
            throw new RuntimeException('Unable to dump a service container if a parameter is an object or a resource.');
        }

        return $value;
    }

    /**
     * Gets the service call.
     *
     * @param string    $id
     * @param Reference $reference
     *
     * @return string
     */
    private function getServiceCall($id, Reference $reference = null)
    {
        if (null !== $reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $reference->getInvalidBehavior()) {
            return sprintf('@?%s', $id);
        }

        return sprintf('@%s', $id);
    }

    /**
     * Gets parameter call.
     *
     * @param string $id
     *
     * @return string
     */
    private function getParameterCall($id)
    {
        return sprintf('%%%s%%', $id);
    }

    private function getExpressionCall($expression)
    {
        return sprintf('@=%s', $expression);
    }

    /**
     * Prepares parameters.
     *
     * @param array   $parameters
     * @param Boolean $escape
     *
     * @return array
     */
    private function prepareParameters($parameters, $escape = true)
    {
        $filtered = array();
        foreach ($parameters as $key => $value) {
            if (is_array($value)) {
                $value = $this->prepareParameters($value, $escape);
            } elseif ($value instanceof Reference || is_string($value) && 0 === strpos($value, '@')) {
                $value = '@'.$value;
            }

            $filtered[$key] = $value;
        }

        return $escape ? $this->escape($filtered) : $filtered;
    }

    /**
     * Escapes arguments
     *
     * @param array $arguments
     *
     * @return array
     */
    private function escape($arguments)
    {
        $args = array();
        foreach ($arguments as $k => $v) {
            if (is_array($v)) {
                $args[$k] = $this->escape($v);
            } elseif (is_string($v)) {
                $args[$k] = str_replace('%', '%%', $v);
            } else {
                $args[$k] = $v;
            }
        }

        return $args;
    }
}
PKh_�\���*�*?pear/Symfony/Component/DependencyInjection/Dumper/XmlDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Dumper;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\ExpressionLanguage\Expression;

/**
 * XmlDumper dumps a service container as an XML string.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Martin Hasoň <martin.hason@gmail.com>
 *
 * @api
 */
class XmlDumper extends Dumper
{
    /**
     * @var \DOMDocument
     */
    private $document;

    /**
     * Dumps the service container as an XML string.
     *
     * @param array $options An array of options
     *
     * @return string An xml string representing of the service container
     *
     * @api
     */
    public function dump(array $options = array())
    {
        $this->document = new \DOMDocument('1.0', 'utf-8');
        $this->document->formatOutput = true;

        $container = $this->document->createElementNS('http://symfony.com/schema/dic/services', 'container');
        $container->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
        $container->setAttribute('xsi:schemaLocation', 'http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd');

        $this->addParameters($container);
        $this->addServices($container);

        $this->document->appendChild($container);
        $xml = $this->document->saveXML();
        $this->document = null;

        return $xml;
    }

    /**
     * Adds parameters.
     *
     * @param \DOMElement $parent
     */
    private function addParameters(\DOMElement $parent)
    {
        $data = $this->container->getParameterBag()->all();
        if (!$data) {
            return;
        }

        if ($this->container->isFrozen()) {
            $data = $this->escape($data);
        }

        $parameters = $this->document->createElement('parameters');
        $parent->appendChild($parameters);
        $this->convertParameters($data, 'parameter', $parameters);
    }

    /**
     * Adds method calls.
     *
     * @param array       $methodcalls
     * @param \DOMElement $parent
     */
    private function addMethodCalls(array $methodcalls, \DOMElement $parent)
    {
        foreach ($methodcalls as $methodcall) {
            $call = $this->document->createElement('call');
            $call->setAttribute('method', $methodcall[0]);
            if (count($methodcall[1])) {
                $this->convertParameters($methodcall[1], 'argument', $call);
            }
            $parent->appendChild($call);
        }
    }

    /**
     * Adds a service.
     *
     * @param Definition  $definition
     * @param string      $id
     * @param \DOMElement $parent
     */
    private function addService($definition, $id, \DOMElement $parent)
    {
        $service = $this->document->createElement('service');
        if (null !== $id) {
            $service->setAttribute('id', $id);
        }
        if ($definition->getClass()) {
            $service->setAttribute('class', $definition->getClass());
        }
        if ($definition->getFactoryMethod()) {
            $service->setAttribute('factory-method', $definition->getFactoryMethod());
        }
        if ($definition->getFactoryService()) {
            $service->setAttribute('factory-service', $definition->getFactoryService());
        }
        if (ContainerInterface::SCOPE_CONTAINER !== $scope = $definition->getScope()) {
            $service->setAttribute('scope', $scope);
        }
        if (!$definition->isPublic()) {
            $service->setAttribute('public', 'false');
        }
        if ($definition->isSynthetic()) {
            $service->setAttribute('synthetic', 'true');
        }
        if ($definition->isSynchronized()) {
            $service->setAttribute('synchronized', 'true');
        }
        if ($definition->isLazy()) {
            $service->setAttribute('lazy', 'true');
        }

        foreach ($definition->getTags() as $name => $tags) {
            foreach ($tags as $attributes) {
                $tag = $this->document->createElement('tag');
                $tag->setAttribute('name', $name);
                foreach ($attributes as $key => $value) {
                    $tag->setAttribute($key, $value);
                }
                $service->appendChild($tag);
            }
        }

        if ($definition->getFile()) {
            $file = $this->document->createElement('file');
            $file->appendChild($this->document->createTextNode($definition->getFile()));
            $service->appendChild($file);
        }

        if ($parameters = $definition->getArguments()) {
            $this->convertParameters($parameters, 'argument', $service);
        }

        if ($parameters = $definition->getProperties()) {
            $this->convertParameters($parameters, 'property', $service, 'name');
        }

        $this->addMethodCalls($definition->getMethodCalls(), $service);

        if ($callable = $definition->getConfigurator()) {
            $configurator = $this->document->createElement('configurator');
            if (is_array($callable)) {
                $configurator->setAttribute($callable[0] instanceof Reference ? 'service' : 'class', $callable[0]);
                $configurator->setAttribute('method', $callable[1]);
            } else {
                $configurator->setAttribute('function', $callable);
            }
            $service->appendChild($configurator);
        }

        $parent->appendChild($service);
    }

    /**
     * Adds a service alias.
     *
     * @param string      $alias
     * @param Alias       $id
     * @param \DOMElement $parent
     */
    private function addServiceAlias($alias, Alias $id, \DOMElement $parent)
    {
        $service = $this->document->createElement('service');
        $service->setAttribute('id', $alias);
        $service->setAttribute('alias', $id);
        if (!$id->isPublic()) {
            $service->setAttribute('public', 'false');
        }
        $parent->appendChild($service);
    }

    /**
     * Adds services.
     *
     * @param \DOMElement $parent
     */
    private function addServices(\DOMElement $parent)
    {
        $definitions = $this->container->getDefinitions();
        if (!$definitions) {
            return;
        }

        $services = $this->document->createElement('services');
        foreach ($definitions as $id => $definition) {
            $this->addService($definition, $id, $services);
        }

        $aliases = $this->container->getAliases();
        foreach ($aliases as $alias => $id) {
            while (isset($aliases[(string) $id])) {
                $id = $aliases[(string) $id];
            }
            $this->addServiceAlias($alias, $id, $services);
        }
        $parent->appendChild($services);
    }

    /**
     * Converts parameters.
     *
     * @param array       $parameters
     * @param string      $type
     * @param \DOMElement $parent
     * @param string      $keyAttribute
     */
    private function convertParameters($parameters, $type, \DOMElement $parent, $keyAttribute = 'key')
    {
        $withKeys = array_keys($parameters) !== range(0, count($parameters) - 1);
        foreach ($parameters as $key => $value) {
            $element = $this->document->createElement($type);
            if ($withKeys) {
                $element->setAttribute($keyAttribute, $key);
            }

            if (is_array($value)) {
                $element->setAttribute('type', 'collection');
                $this->convertParameters($value, $type, $element, 'key');
            } elseif ($value instanceof Reference) {
                $element->setAttribute('type', 'service');
                $element->setAttribute('id', (string) $value);
                $behaviour = $value->getInvalidBehavior();
                if ($behaviour == ContainerInterface::NULL_ON_INVALID_REFERENCE) {
                    $element->setAttribute('on-invalid', 'null');
                } elseif ($behaviour == ContainerInterface::IGNORE_ON_INVALID_REFERENCE) {
                    $element->setAttribute('on-invalid', 'ignore');
                }
                if (!$value->isStrict()) {
                    $element->setAttribute('strict', 'false');
                }
            } elseif ($value instanceof Definition) {
                $element->setAttribute('type', 'service');
                $this->addService($value, null, $element);
            } elseif ($value instanceof Expression) {
                $element->setAttribute('type', 'expression');
                $text = $this->document->createTextNode(self::phpToXml((string) $value));
                $element->appendChild($text);
            } else {
                if (in_array($value, array('null', 'true', 'false'), true)) {
                    $element->setAttribute('type', 'string');
                }
                $text = $this->document->createTextNode(self::phpToXml($value));
                $element->appendChild($text);
            }
            $parent->appendChild($element);
        }
    }

    /**
     * Escapes arguments
     *
     * @param array $arguments
     *
     * @return array
     */
    private function escape($arguments)
    {
        $args = array();
        foreach ($arguments as $k => $v) {
            if (is_array($v)) {
                $args[$k] = $this->escape($v);
            } elseif (is_string($v)) {
                $args[$k] = str_replace('%', '%%', $v);
            } else {
                $args[$k] = $v;
            }
        }

        return $args;
    }

    /**
     * Converts php types to xml types.
     *
     * @param mixed $value Value to convert
     *
     * @return string
     *
     * @throws RuntimeException When trying to dump object or resource
     */
    public static function phpToXml($value)
    {
        switch (true) {
            case null === $value:
                return 'null';
            case true === $value:
                return 'true';
            case false === $value:
                return 'false';
            case $value instanceof Parameter:
                return '%'.$value.'%';
            case is_object($value) || is_resource($value):
                throw new RuntimeException('Unable to dump a service container if a parameter is an object or a resource.');
            default:
                return (string) $value;
        }
    }
}
PKh_�\�u�ii=pear/Symfony/Component/DependencyInjection/ContainerAware.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * A simple implementation of ContainerAwareInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
abstract class ContainerAware implements ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     *
     * @api
     */
    protected $container;

    /**
     * Sets the Container associated with this Controller.
     *
     * @param ContainerInterface $container A ContainerInterface instance
     *
     * @api
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }
}
PKi_�\���((Cpear/Symfony/Component/DependencyInjection/Loader/PhpFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\Config\Resource\FileResource;

/**
 * PhpFileLoader loads service definitions from a PHP file.
 *
 * The PHP file is required and the $container variable can be
 * used within the file to change the container.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class PhpFileLoader extends FileLoader
{
    /**
     * Loads a PHP file.
     *
     * @param mixed  $file The resource
     * @param string $type The resource type
     */
    public function load($file, $type = null)
    {
        // the container and loader variables are exposed to the included file below
        $container = $this->container;
        $loader = $this;

        $path = $this->locator->locate($file);
        $this->setCurrentDir(dirname($path));
        $this->container->addResource(new FileResource($path));

        include $path;
    }

    /**
     * Returns true if this class supports the given resource.
     *
     * @param mixed  $resource A resource
     * @param string $type     The resource type
     *
     * @return Boolean true if this class supports the given resource, false otherwise
     */
    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION);
    }
}
PKi_�\!+���+�+Dpear/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\DependencyInjection\DefinitionDecorator;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Yaml\Parser as YamlParser;
use Symfony\Component\ExpressionLanguage\Expression;

/**
 * YamlFileLoader loads YAML files service definitions.
 *
 * The YAML format does not support anonymous services (cf. the XML loader).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class YamlFileLoader extends FileLoader
{
    private $yamlParser;

    /**
     * Loads a Yaml file.
     *
     * @param mixed  $file The resource
     * @param string $type The resource type
     */
    public function load($file, $type = null)
    {
        $path = $this->locator->locate($file);

        $content = $this->loadFile($path);

        $this->container->addResource(new FileResource($path));

        // empty file
        if (null === $content) {
            return;
        }

        // imports
        $this->parseImports($content, $path);

        // parameters
        if (isset($content['parameters'])) {
            foreach ($content['parameters'] as $key => $value) {
                $this->container->setParameter($key, $this->resolveServices($value));
            }
        }

        // extensions
        $this->loadFromExtensions($content);

        // services
        $this->parseDefinitions($content, $file);
    }

    /**
     * Returns true if this class supports the given resource.
     *
     * @param mixed  $resource A resource
     * @param string $type     The resource type
     *
     * @return Boolean true if this class supports the given resource, false otherwise
     */
    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'yml' === pathinfo($resource, PATHINFO_EXTENSION);
    }

    /**
     * Parses all imports
     *
     * @param array  $content
     * @param string $file
     */
    private function parseImports($content, $file)
    {
        if (!isset($content['imports'])) {
            return;
        }

        foreach ($content['imports'] as $import) {
            $this->setCurrentDir(dirname($file));
            $this->import($import['resource'], null, isset($import['ignore_errors']) ? (Boolean) $import['ignore_errors'] : false, $file);
        }
    }

    /**
     * Parses definitions
     *
     * @param array  $content
     * @param string $file
     */
    private function parseDefinitions($content, $file)
    {
        if (!isset($content['services'])) {
            return;
        }

        foreach ($content['services'] as $id => $service) {
            $this->parseDefinition($id, $service, $file);
        }
    }

    /**
     * Parses a definition.
     *
     * @param string $id
     * @param array  $service
     * @param string $file
     *
     * @throws InvalidArgumentException When tags are invalid
     */
    private function parseDefinition($id, $service, $file)
    {
        if (is_string($service) && 0 === strpos($service, '@')) {
            $this->container->setAlias($id, substr($service, 1));

            return;
        } elseif (isset($service['alias'])) {
            $public = !array_key_exists('public', $service) || (Boolean) $service['public'];
            $this->container->setAlias($id, new Alias($service['alias'], $public));

            return;
        }

        if (isset($service['parent'])) {
            $definition = new DefinitionDecorator($service['parent']);
        } else {
            $definition = new Definition();
        }

        if (isset($service['class'])) {
            $definition->setClass($service['class']);
        }

        if (isset($service['scope'])) {
            $definition->setScope($service['scope']);
        }

        if (isset($service['synthetic'])) {
            $definition->setSynthetic($service['synthetic']);
        }

        if (isset($service['synchronized'])) {
            $definition->setSynchronized($service['synchronized']);
        }

        if (isset($service['lazy'])) {
            $definition->setLazy($service['lazy']);
        }

        if (isset($service['public'])) {
            $definition->setPublic($service['public']);
        }

        if (isset($service['abstract'])) {
            $definition->setAbstract($service['abstract']);
        }

        if (isset($service['factory_class'])) {
            $definition->setFactoryClass($service['factory_class']);
        }

        if (isset($service['factory_method'])) {
            $definition->setFactoryMethod($service['factory_method']);
        }

        if (isset($service['factory_service'])) {
            $definition->setFactoryService($service['factory_service']);
        }

        if (isset($service['file'])) {
            $definition->setFile($service['file']);
        }

        if (isset($service['arguments'])) {
            $definition->setArguments($this->resolveServices($service['arguments']));
        }

        if (isset($service['properties'])) {
            $definition->setProperties($this->resolveServices($service['properties']));
        }

        if (isset($service['configurator'])) {
            if (is_string($service['configurator'])) {
                $definition->setConfigurator($service['configurator']);
            } else {
                $definition->setConfigurator(array($this->resolveServices($service['configurator'][0]), $service['configurator'][1]));
            }
        }

        if (isset($service['calls'])) {
            foreach ($service['calls'] as $call) {
                $args = isset($call[1]) ? $this->resolveServices($call[1]) : array();
                $definition->addMethodCall($call[0], $args);
            }
        }

        if (isset($service['tags'])) {
            if (!is_array($service['tags'])) {
                throw new InvalidArgumentException(sprintf('Parameter "tags" must be an array for service "%s" in %s.', $id, $file));
            }

            foreach ($service['tags'] as $tag) {
                if (!isset($tag['name'])) {
                    throw new InvalidArgumentException(sprintf('A "tags" entry is missing a "name" key for service "%s" in %s.', $id, $file));
                }

                $name = $tag['name'];
                unset($tag['name']);

                foreach ($tag as $attribute => $value) {
                    if (!is_scalar($value) && null !== $value) {
                        throw new InvalidArgumentException(sprintf('A "tags" attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s" in %s.', $id, $name, $attribute, $file));
                    }
                }

                $definition->addTag($name, $tag);
            }
        }

        $this->container->setDefinition($id, $definition);
    }

    /**
     * Loads a YAML file.
     *
     * @param string $file
     *
     * @return array The file content
     */
    protected function loadFile($file)
    {
        if (!stream_is_local($file)) {
            throw new InvalidArgumentException(sprintf('This is not a local file "%s".', $file));
        }

        if (!file_exists($file)) {
            throw new InvalidArgumentException(sprintf('The service file "%s" is not valid.', $file));
        }

        if (null === $this->yamlParser) {
            $this->yamlParser = new YamlParser();
        }

        return $this->validate($this->yamlParser->parse(file_get_contents($file)), $file);
    }

    /**
     * Validates a YAML file.
     *
     * @param mixed  $content
     * @param string $file
     *
     * @return array
     *
     * @throws InvalidArgumentException When service file is not valid
     */
    private function validate($content, $file)
    {
        if (null === $content) {
            return $content;
        }

        if (!is_array($content)) {
            throw new InvalidArgumentException(sprintf('The service file "%s" is not valid.', $file));
        }

        foreach (array_keys($content) as $namespace) {
            if (in_array($namespace, array('imports', 'parameters', 'services'))) {
                continue;
            }

            if (!$this->container->hasExtension($namespace)) {
                $extensionNamespaces = array_filter(array_map(function ($ext) { return $ext->getAlias(); }, $this->container->getExtensions()));
                throw new InvalidArgumentException(sprintf(
                    'There is no extension able to load the configuration for "%s" (in %s). Looked for namespace "%s", found %s',
                    $namespace,
                    $file,
                    $namespace,
                    $extensionNamespaces ? sprintf('"%s"', implode('", "', $extensionNamespaces)) : 'none'
                ));
            }
        }

        return $content;
    }

    /**
     * Resolves services.
     *
     * @param string $value
     *
     * @return Reference
     */
    private function resolveServices($value)
    {
        if (is_array($value)) {
            $value = array_map(array($this, 'resolveServices'), $value);
        } elseif (is_string($value) &&  0 === strpos($value, '@=')) {
            return new Expression(substr($value, 2));
        } elseif (is_string($value) &&  0 === strpos($value, '@')) {
            if (0 === strpos($value, '@@')) {
                $value = substr($value, 1);
                $invalidBehavior = null;
            } elseif (0 === strpos($value, '@?')) {
                $value = substr($value, 2);
                $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
            } else {
                $value = substr($value, 1);
                $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
            }

            if ('=' === substr($value, -1)) {
                $value = substr($value, 0, -1);
                $strict = false;
            } else {
                $strict = true;
            }

            if (null !== $invalidBehavior) {
                $value = new Reference($value, $invalidBehavior, $strict);
            }
        }

        return $value;
    }

    /**
     * Loads from Extensions
     *
     * @param array $content
     */
    private function loadFromExtensions($content)
    {
        foreach ($content as $namespace => $values) {
            if (in_array($namespace, array('imports', 'parameters', 'services'))) {
                continue;
            }

            if (!is_array($values)) {
                $values = array();
            }

            $this->container->loadFromExtension($namespace, $values);
        }
    }
}
PKj_�\ӸBjCpear/Symfony/Component/DependencyInjection/Loader/IniFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;

/**
 * IniFileLoader loads parameters from INI files.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class IniFileLoader extends FileLoader
{
    /**
     * Loads a resource.
     *
     * @param mixed  $file The resource
     * @param string $type The resource type
     *
     * @throws InvalidArgumentException When ini file is not valid
     */
    public function load($file, $type = null)
    {
        $path = $this->locator->locate($file);

        $this->container->addResource(new FileResource($path));

        $result = parse_ini_file($path, true);
        if (false === $result || array() === $result) {
            throw new InvalidArgumentException(sprintf('The "%s" file is not valid.', $file));
        }

        if (isset($result['parameters']) && is_array($result['parameters'])) {
            foreach ($result['parameters'] as $key => $value) {
                $this->container->setParameter($key, $value);
            }
        }
    }

    /**
     * Returns true if this class supports the given resource.
     *
     * @param mixed  $resource A resource
     * @param string $type     The resource type
     *
     * @return Boolean true if this class supports the given resource, false otherwise
     */
    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'ini' === pathinfo($resource, PATHINFO_EXTENSION);
    }
}
PKj_�\�z#aVpear/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsdnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema xmlns="http://symfony.com/schema/dic/services"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     targetNamespace="http://symfony.com/schema/dic/services"
     elementFormDefault="qualified">

  <xsd:annotation>
    <xsd:documentation><![CDATA[
      Symfony XML Services Schema, version 1.0
      Authors: Fabien Potencier

      This defines a way to describe PHP objects (services) and their
      dependencies.
    ]]></xsd:documentation>
  </xsd:annotation>

  <xsd:element name="container" type="container" />

  <xsd:complexType name="container">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        The root element of a service file.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="imports" type="imports" minOccurs="0" maxOccurs="1" />
      <xsd:element name="parameters" type="parameters" minOccurs="0" maxOccurs="1" />
      <xsd:element name="services" type="services" minOccurs="0" maxOccurs="1" />
      <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="services">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Enclosing element for the definition of all services
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="1" maxOccurs="unbounded">
      <xsd:element name="service" type="service" />
    </xsd:choice>
  </xsd:complexType>

  <xsd:complexType name="imports">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Enclosing element for the import elements
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="1" maxOccurs="unbounded">
      <xsd:element name="import" type="import" />
    </xsd:choice>
  </xsd:complexType>

  <xsd:complexType name="import">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Import an external resource defining other services or parameters
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="resource" type="xsd:string" use="required" />
    <xsd:attribute name="ignore-errors" type="boolean" />
  </xsd:complexType>

  <xsd:complexType name="configurator">
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="service" type="xsd:string" />
    <xsd:attribute name="class" type="xsd:string" />
    <xsd:attribute name="method" type="xsd:string" />
    <xsd:attribute name="function" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="service">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="file" type="xsd:string" minOccurs="0" maxOccurs="1" />
      <xsd:element name="argument" type="argument" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="configurator" type="configurator" minOccurs="0" maxOccurs="1" />
      <xsd:element name="call" type="call" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="tag" type="tag" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="class" type="xsd:string" />
    <xsd:attribute name="scope" type="xsd:string" />
    <xsd:attribute name="public" type="boolean" />
    <xsd:attribute name="synthetic" type="boolean" />
    <xsd:attribute name="synchronized" type="boolean" />
    <xsd:attribute name="lazy" type="boolean" />
    <xsd:attribute name="abstract" type="boolean" />
    <xsd:attribute name="factory-class" type="xsd:string" />
    <xsd:attribute name="factory-method" type="xsd:string" />
    <xsd:attribute name="factory-service" type="xsd:string" />
    <xsd:attribute name="alias" type="xsd:string" />
    <xsd:attribute name="parent" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="tag">
    <xsd:attribute name="name" type="xsd:string" />
    <xsd:anyAttribute namespace="##any" processContents="lax" />
  </xsd:complexType>

  <xsd:complexType name="parameters">
    <xsd:choice minOccurs="1" maxOccurs="unbounded">
      <xsd:element name="parameter" type="parameter" />
    </xsd:choice>
    <xsd:attribute name="type" type="parameter_type" />
    <xsd:attribute name="key" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="parameter" mixed="true">
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="parameter" type="parameter" />
    </xsd:choice>
    <xsd:attribute name="type" type="parameter_type" />
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="key" type="xsd:string" />
    <xsd:attribute name="on-invalid" type="invalid_sequence" />
  </xsd:complexType>

  <xsd:complexType name="property" mixed="true">
    <xsd:choice minOccurs="0" maxOccurs="1">
      <xsd:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="service" type="service" />
    </xsd:choice>
    <xsd:attribute name="type" type="argument_type" />
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="key" type="xsd:string" />
    <xsd:attribute name="name" type="xsd:string" />
    <xsd:attribute name="on-invalid" type="xsd:string" />
    <xsd:attribute name="strict" type="boolean" />
  </xsd:complexType>

  <xsd:complexType name="argument" mixed="true">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="argument" type="argument" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="service" type="service" />
    </xsd:choice>
    <xsd:attribute name="type" type="argument_type" />
    <xsd:attribute name="id" type="xsd:string" />
    <xsd:attribute name="key" type="xsd:string" />
    <xsd:attribute name="index" type="xsd:integer" />
    <xsd:attribute name="on-invalid" type="xsd:string" />
    <xsd:attribute name="strict" type="boolean" />
  </xsd:complexType>

  <xsd:complexType name="call" mixed="true">
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="argument" type="argument" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="service" type="service" />
    </xsd:choice>
    <xsd:attribute name="method" type="xsd:string" />
  </xsd:complexType>

  <xsd:simpleType name="parameter_type">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="collection" />
      <xsd:enumeration value="service" />
      <xsd:enumeration value="string" />
      <xsd:enumeration value="constant" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="argument_type">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="collection" />
      <xsd:enumeration value="service" />
      <xsd:enumeration value="expression" />
      <xsd:enumeration value="string" />
      <xsd:enumeration value="constant" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="invalid_sequence">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="null" />
      <xsd:enumeration value="ignore" />
      <xsd:enumeration value="exception" />
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="boolean">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="(%.+%|true|false)" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>
PKk_�\�
���Cpear/Symfony/Component/DependencyInjection/Loader/ClosureLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\Loader\Loader;

/**
 * ClosureLoader loads service definitions from a PHP closure.
 *
 * The Closure has access to the container as its first argument.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ClosureLoader extends Loader
{
    private $container;

    /**
     * Constructor.
     *
     * @param ContainerBuilder $container A ContainerBuilder instance
     */
    public function __construct(ContainerBuilder $container)
    {
        $this->container = $container;
    }

    /**
     * Loads a Closure.
     *
     * @param \Closure $closure The resource
     * @param string   $type    The resource type
     */
    public function load($closure, $type = null)
    {
        call_user_func($closure, $this->container);
    }

    /**
     * Returns true if this class supports the given resource.
     *
     * @param mixed  $resource A resource
     * @param string $type     The resource type
     *
     * @return Boolean true if this class supports the given resource, false otherwise
     */
    public function supports($resource, $type = null)
    {
        return $resource instanceof \Closure;
    }
}
PKk_�\L����8�8Cpear/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Config\Util\XmlUtils;
use Symfony\Component\DependencyInjection\DefinitionDecorator;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\SimpleXMLElement;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;

/**
 * XmlFileLoader loads XML files service definitions.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class XmlFileLoader extends FileLoader
{
    /**
     * Loads an XML file.
     *
     * @param mixed  $file The resource
     * @param string $type The resource type
     */
    public function load($file, $type = null)
    {
        $path = $this->locator->locate($file);

        $xml = $this->parseFile($path);
        $xml->registerXPathNamespace('container', 'http://symfony.com/schema/dic/services');

        $this->container->addResource(new FileResource($path));

        // anonymous services
        $this->processAnonymousServices($xml, $path);

        // imports
        $this->parseImports($xml, $path);

        // parameters
        $this->parseParameters($xml, $path);

        // extensions
        $this->loadFromExtensions($xml);

        // services
        $this->parseDefinitions($xml, $path);
    }

    /**
     * Returns true if this class supports the given resource.
     *
     * @param mixed  $resource A resource
     * @param string $type     The resource type
     *
     * @return Boolean true if this class supports the given resource, false otherwise
     */
    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'xml' === pathinfo($resource, PATHINFO_EXTENSION);
    }

    /**
     * Parses parameters
     *
     * @param SimpleXMLElement $xml
     * @param string           $file
     */
    private function parseParameters(SimpleXMLElement $xml, $file)
    {
        if (!$xml->parameters) {
            return;
        }

        $this->container->getParameterBag()->add($xml->parameters->getArgumentsAsPhp('parameter'));
    }

    /**
     * Parses imports
     *
     * @param SimpleXMLElement $xml
     * @param string           $file
     */
    private function parseImports(SimpleXMLElement $xml, $file)
    {
        if (false === $imports = $xml->xpath('//container:imports/container:import')) {
            return;
        }

        foreach ($imports as $import) {
            $this->setCurrentDir(dirname($file));
            $this->import((string) $import['resource'], null, (Boolean) $import->getAttributeAsPhp('ignore-errors'), $file);
        }
    }

    /**
     * Parses multiple definitions
     *
     * @param SimpleXMLElement $xml
     * @param string           $file
     */
    private function parseDefinitions(SimpleXMLElement $xml, $file)
    {
        if (false === $services = $xml->xpath('//container:services/container:service')) {
            return;
        }

        foreach ($services as $service) {
            $this->parseDefinition((string) $service['id'], $service, $file);
        }
    }

    /**
     * Parses an individual Definition
     *
     * @param string           $id
     * @param SimpleXMLElement $service
     * @param string           $file
     */
    private function parseDefinition($id, $service, $file)
    {
        if ((string) $service['alias']) {
            $public = true;
            if (isset($service['public'])) {
                $public = $service->getAttributeAsPhp('public');
            }
            $this->container->setAlias($id, new Alias((string) $service['alias'], $public));

            return;
        }

        if (isset($service['parent'])) {
            $definition = new DefinitionDecorator((string) $service['parent']);
        } else {
            $definition = new Definition();
        }

        foreach (array('class', 'scope', 'public', 'factory-class', 'factory-method', 'factory-service', 'synthetic', 'synchronized', 'lazy', 'abstract') as $key) {
            if (isset($service[$key])) {
                $method = 'set'.str_replace('-', '', $key);
                $definition->$method((string) $service->getAttributeAsPhp($key));
            }
        }

        if ($service->file) {
            $definition->setFile((string) $service->file);
        }

        $definition->setArguments($service->getArgumentsAsPhp('argument'));
        $definition->setProperties($service->getArgumentsAsPhp('property'));

        if (isset($service->configurator)) {
            if (isset($service->configurator['function'])) {
                $definition->setConfigurator((string) $service->configurator['function']);
            } else {
                if (isset($service->configurator['service'])) {
                    $class = new Reference((string) $service->configurator['service'], ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, false);
                } else {
                    $class = (string) $service->configurator['class'];
                }

                $definition->setConfigurator(array($class, (string) $service->configurator['method']));
            }
        }

        foreach ($service->call as $call) {
            $definition->addMethodCall((string) $call['method'], $call->getArgumentsAsPhp('argument'));
        }

        foreach ($service->tag as $tag) {
            $parameters = array();
            foreach ($tag->attributes() as $name => $value) {
                if ('name' === $name) {
                    continue;
                }

                if (false !== strpos($name, '-') && false === strpos($name, '_') && !array_key_exists($normalizedName = str_replace('-', '_', $name), $parameters)) {
                    $parameters[$normalizedName] = SimpleXMLElement::phpize($value);
                }
                // keep not normalized key for BC too
                $parameters[$name] = SimpleXMLElement::phpize($value);
            }

            $definition->addTag((string) $tag['name'], $parameters);
        }

        $this->container->setDefinition($id, $definition);
    }

    /**
     * Parses a XML file.
     *
     * @param string $file Path to a file
     *
     * @return SimpleXMLElement
     *
     * @throws InvalidArgumentException When loading of XML file returns error
     */
    protected function parseFile($file)
    {
        try {
            $dom = XmlUtils::loadFile($file, array($this, 'validateSchema'));
        } catch (\InvalidArgumentException $e) {
            throw new InvalidArgumentException(sprintf('Unable to parse file "%s".', $file), $e->getCode(), $e);
        }

        $this->validateExtensions($dom, $file);

        return simplexml_import_dom($dom, 'Symfony\\Component\\DependencyInjection\\SimpleXMLElement');
    }

    /**
     * Processes anonymous services
     *
     * @param SimpleXMLElement $xml
     * @param string           $file
     */
    private function processAnonymousServices(SimpleXMLElement $xml, $file)
    {
        $definitions = array();
        $count = 0;

        // anonymous services as arguments/properties
        if (false !== $nodes = $xml->xpath('//container:argument[@type="service"][not(@id)]|//container:property[@type="service"][not(@id)]')) {
            foreach ($nodes as $node) {
                // give it a unique name
                $id = sprintf('%s_%d', hash('sha256', $file), ++$count);
                $node['id'] = $id;

                $definitions[$id] = array($node->service, $file, false);
                $node->service['id'] = $id;
            }
        }

        // anonymous services "in the wild"
        if (false !== $nodes = $xml->xpath('//container:services/container:service[not(@id)]')) {
            foreach ($nodes as $node) {
                // give it a unique name
                $id = sprintf('%s_%d', hash('sha256', $file), ++$count);
                $node['id'] = $id;

                $definitions[$id] = array($node, $file, true);
                $node->service['id'] = $id;
            }
        }

        // resolve definitions
        krsort($definitions);
        foreach ($definitions as $id => $def) {
            // anonymous services are always private
            $def[0]['public'] = false;

            $this->parseDefinition($id, $def[0], $def[1]);

            $oNode = dom_import_simplexml($def[0]);
            if (true === $def[2]) {
                $nNode = new \DOMElement('_services');
                $oNode->parentNode->replaceChild($nNode, $oNode);
                $nNode->setAttribute('id', $id);
            } else {
                $oNode->parentNode->removeChild($oNode);
            }
        }
    }

    /**
     * Validates a documents XML schema.
     *
     * @param \DOMDocument $dom
     *
     * @return Boolean
     *
     * @throws RuntimeException When extension references a non-existent XSD file
     */
    public function validateSchema(\DOMDocument $dom)
    {
        $schemaLocations = array('http://symfony.com/schema/dic/services' => str_replace('\\', '/', __DIR__.'/schema/dic/services/services-1.0.xsd'));

        if ($element = $dom->documentElement->getAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation')) {
            $items = preg_split('/\s+/', $element);
            for ($i = 0, $nb = count($items); $i < $nb; $i += 2) {
                if (!$this->container->hasExtension($items[$i])) {
                    continue;
                }

                if (($extension = $this->container->getExtension($items[$i])) && false !== $extension->getXsdValidationBasePath()) {
                    $path = str_replace($extension->getNamespace(), str_replace('\\', '/', $extension->getXsdValidationBasePath()).'/', $items[$i + 1]);

                    if (!is_file($path)) {
                        throw new RuntimeException(sprintf('Extension "%s" references a non-existent XSD file "%s"', get_class($extension), $path));
                    }

                    $schemaLocations[$items[$i]] = $path;
                }
            }
        }

        $tmpfiles = array();
        $imports = '';
        foreach ($schemaLocations as $namespace => $location) {
            $parts = explode('/', $location);
            if (0 === stripos($location, 'phar://')) {
                $tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
                if ($tmpfile) {
                    copy($location, $tmpfile);
                    $tmpfiles[] = $tmpfile;
                    $parts = explode('/', str_replace('\\', '/', $tmpfile));
                }
            }
            $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
            $location = 'file:///'.$drive.implode('/', array_map('rawurlencode', $parts));

            $imports .= sprintf('  <xsd:import namespace="%s" schemaLocation="%s" />'."\n", $namespace, $location);
        }

        $source = <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema xmlns="http://symfony.com/schema"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://symfony.com/schema"
    elementFormDefault="qualified">

    <xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
$imports
</xsd:schema>
EOF
        ;

        $valid = @$dom->schemaValidateSource($source);

        foreach ($tmpfiles as $tmpfile) {
            @unlink($tmpfile);
        }

        return $valid;
    }

    /**
     * Validates an extension.
     *
     * @param \DOMDocument $dom
     * @param string       $file
     *
     * @throws InvalidArgumentException When no extension is found corresponding to a tag
     */
    private function validateExtensions(\DOMDocument $dom, $file)
    {
        foreach ($dom->documentElement->childNodes as $node) {
            if (!$node instanceof \DOMElement || 'http://symfony.com/schema/dic/services' === $node->namespaceURI) {
                continue;
            }

            // can it be handled by an extension?
            if (!$this->container->hasExtension($node->namespaceURI)) {
                $extensionNamespaces = array_filter(array_map(function ($ext) { return $ext->getNamespace(); }, $this->container->getExtensions()));
                throw new InvalidArgumentException(sprintf(
                    'There is no extension able to load the configuration for "%s" (in %s). Looked for namespace "%s", found %s',
                    $node->tagName,
                    $file,
                    $node->namespaceURI,
                    $extensionNamespaces ? sprintf('"%s"', implode('", "', $extensionNamespaces)) : 'none'
                ));
            }
        }
    }

    /**
     * Loads from an extension.
     *
     * @param SimpleXMLElement $xml
     */
    private function loadFromExtensions(SimpleXMLElement $xml)
    {
        foreach (dom_import_simplexml($xml)->childNodes as $node) {
            if (!$node instanceof \DOMElement || $node->namespaceURI === 'http://symfony.com/schema/dic/services') {
                continue;
            }

            $values = static::convertDomElementToArray($node);
            if (!is_array($values)) {
                $values = array();
            }

            $this->container->loadFromExtension($node->namespaceURI, $values);
        }
    }

    /**
     * Converts a \DomElement object to a PHP array.
     *
     * The following rules applies during the conversion:
     *
     *  * Each tag is converted to a key value or an array
     *    if there is more than one "value"
     *
     *  * The content of a tag is set under a "value" key (<foo>bar</foo>)
     *    if the tag also has some nested tags
     *
     *  * The attributes are converted to keys (<foo foo="bar"/>)
     *
     *  * The nested-tags are converted to keys (<foo><foo>bar</foo></foo>)
     *
     * @param \DomElement $element A \DomElement instance
     *
     * @return array A PHP array
     */
    public static function convertDomElementToArray(\DomElement $element)
    {
        return XmlUtils::convertDomElementToArray($element);
    }
}
PKl_�\U��a--@pear/Symfony/Component/DependencyInjection/Loader/FileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Loader;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\Loader\FileLoader as BaseFileLoader;
use Symfony\Component\Config\FileLocatorInterface;

/**
 * FileLoader is the abstract class used by all built-in loaders that are file based.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class FileLoader extends BaseFileLoader
{
    protected $container;

    /**
     * Constructor.
     *
     * @param ContainerBuilder $container A ContainerBuilder instance
     * @param FileLocatorInterface      $locator   A FileLocator instance
     */
    public function __construct(ContainerBuilder $container, FileLocatorInterface $locator)
    {
        $this->container = $container;

        parent::__construct($locator);
    }
}
PKl_�\= ԥ�Xpear/Symfony/Component/DependencyInjection/Exception/ScopeCrossingInjectionException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * This exception is thrown when the a scope crossing injection is detected.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ScopeCrossingInjectionException extends RuntimeException
{
    private $sourceServiceId;
    private $sourceScope;
    private $destServiceId;
    private $destScope;

    public function __construct($sourceServiceId, $sourceScope, $destServiceId, $destScope, \Exception $previous = null)
    {
        parent::__construct(sprintf(
            'Scope Crossing Injection detected: The definition "%s" references the service "%s" which belongs to another scope hierarchy. '
           .'This service might not be available consistently. Generally, it is safer to either move the definition "%s" to scope "%s", or '
           .'declare "%s" as a child scope of "%s". If you can be sure that the other scope is always active, you can set the reference to strict=false to get rid of this error.',
           $sourceServiceId,
           $destServiceId,
           $sourceServiceId,
           $destScope,
           $sourceScope,
           $destScope
        ), 0, $previous);

        $this->sourceServiceId = $sourceServiceId;
        $this->sourceScope = $sourceScope;
        $this->destServiceId = $destServiceId;
        $this->destScope = $destScope;
    }

    public function getSourceServiceId()
    {
        return $this->sourceServiceId;
    }

    public function getSourceScope()
    {
        return $this->sourceScope;
    }

    public function getDestServiceId()
    {
        return $this->destServiceId;
    }

    public function getDestScope()
    {
        return $this->destScope;
    }
}
PKm_�\�qB��\pear/Symfony/Component/DependencyInjection/Exception/ParameterCircularReferenceException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * This exception is thrown when a circular reference in a parameter is detected.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ParameterCircularReferenceException extends RuntimeException
{
    private $parameters;

    public function __construct($parameters, \Exception $previous = null)
    {
        parent::__construct(sprintf('Circular reference detected for parameter "%s" ("%s" > "%s").', $parameters[0], implode('" > "', $parameters), $parameters[0]), 0, $previous);

        $this->parameters = $parameters;
    }

    public function getParameters()
    {
        return $this->parameters;
    }
}
PKm_�\l.��Gpear/Symfony/Component/DependencyInjection/Exception/LogicException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * Base LogicException for Dependency Injection component.
 */
class LogicException extends \LogicException implements ExceptionInterface
{
}
PKn_�\I_���Opear/Symfony/Component/DependencyInjection/Exception/InactiveScopeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * This exception is thrown when you try to create a service of an inactive scope.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class InactiveScopeException extends RuntimeException
{
    private $serviceId;
    private $scope;

    public function __construct($serviceId, $scope, \Exception $previous = null)
    {
        parent::__construct(sprintf('You cannot create a service ("%s") of an inactive scope ("%s").', $serviceId, $scope), 0, $previous);

        $this->serviceId = $serviceId;
        $this->scope = $scope;
    }

    public function getServiceId()
    {
        return $this->serviceId;
    }

    public function getScope()
    {
        return $this->scope;
    }
}
PKn_�\��\�
�
Spear/Symfony/Component/DependencyInjection/Exception/ParameterNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * This exception is thrown when a non-existent parameter is used.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ParameterNotFoundException extends InvalidArgumentException
{
    private $key;
    private $sourceId;
    private $sourceKey;
    private $alternatives;

    /**
     * Constructor.
     *
     * @param string     $key          The requested parameter key
     * @param string     $sourceId     The service id that references the non-existent parameter
     * @param string     $sourceKey    The parameter key that references the non-existent parameter
     * @param \Exception $previous     The previous exception
     * @param string[]   $alternatives Some parameter name alternatives
     */
    public function __construct($key, $sourceId = null, $sourceKey = null, \Exception $previous = null, array $alternatives = array())
    {
        $this->key = $key;
        $this->sourceId = $sourceId;
        $this->sourceKey = $sourceKey;
        $this->alternatives = $alternatives;

        parent::__construct('', 0, $previous);

        $this->updateRepr();
    }

    public function updateRepr()
    {
        if (null !== $this->sourceId) {
            $this->message = sprintf('The service "%s" has a dependency on a non-existent parameter "%s".', $this->sourceId, $this->key);
        } elseif (null !== $this->sourceKey) {
            $this->message = sprintf('The parameter "%s" has a dependency on a non-existent parameter "%s".', $this->sourceKey, $this->key);
        } else {
            $this->message = sprintf('You have requested a non-existent parameter "%s".', $this->key);
        }

        if ($this->alternatives) {
            if (1 == count($this->alternatives)) {
                $this->message .= ' Did you mean this: "';
            } else {
                $this->message .= ' Did you mean one of these: "';
            }
            $this->message .= implode('", "', $this->alternatives).'"?';
        }
    }

    public function getKey()
    {
        return $this->key;
    }

    public function getSourceId()
    {
        return $this->sourceId;
    }

    public function getSourceKey()
    {
        return $this->sourceKey;
    }

    public function setSourceId($sourceId)
    {
        $this->sourceId = $sourceId;

        $this->updateRepr();
    }

    public function setSourceKey($sourceKey)
    {
        $this->sourceKey = $sourceKey;

        $this->updateRepr();
    }
}
PKo_�\
O�,��Opear/Symfony/Component/DependencyInjection/Exception/BadMethodCallException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * Base BadMethodCallException for Dependency Injection component.
 */
class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface
{
}
PKo_�\�
+��Ipear/Symfony/Component/DependencyInjection/Exception/RuntimeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * Base RuntimeException for Dependency Injection component.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
PKp_�\���z��Xpear/Symfony/Component/DependencyInjection/Exception/ScopeWideningInjectionException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * Thrown when a scope widening injection is detected.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ScopeWideningInjectionException extends RuntimeException
{
    private $sourceServiceId;
    private $sourceScope;
    private $destServiceId;
    private $destScope;

    public function __construct($sourceServiceId, $sourceScope, $destServiceId, $destScope, \Exception $previous = null)
    {
        parent::__construct(sprintf(
            'Scope Widening Injection detected: The definition "%s" references the service "%s" which belongs to a narrower scope. '
           .'Generally, it is safer to either move "%s" to scope "%s" or alternatively rely on the provider pattern by injecting the container itself, and requesting the service "%s" each time it is needed. '
           .'In rare, special cases however that might not be necessary, then you can set the reference to strict=false to get rid of this error.',
           $sourceServiceId,
           $destServiceId,
           $sourceServiceId,
           $destScope,
           $destServiceId
        ), 0, $previous);

        $this->sourceServiceId = $sourceServiceId;
        $this->sourceScope = $sourceScope;
        $this->destServiceId = $destServiceId;
        $this->destScope = $destScope;
    }

    public function getSourceServiceId()
    {
        return $this->sourceServiceId;
    }

    public function getSourceScope()
    {
        return $this->sourceScope;
    }

    public function getDestServiceId()
    {
        return $this->destServiceId;
    }

    public function getDestScope()
    {
        return $this->destScope;
    }
}
PKp_�\��9Kpear/Symfony/Component/DependencyInjection/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * Base ExceptionInterface for Dependency Injection component.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bulat Shakirzyanov <bulat@theopenskyproject.com>
 */
interface ExceptionInterface
{
}
PKp_�\��]���Zpear/Symfony/Component/DependencyInjection/Exception/ServiceCircularReferenceException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * This exception is thrown when a circular reference is detected.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ServiceCircularReferenceException extends RuntimeException
{
    private $serviceId;
    private $path;

    public function __construct($serviceId, array $path, \Exception $previous = null)
    {
        parent::__construct(sprintf('Circular reference detected for service "%s", path: "%s".', $serviceId, implode(' -> ', $path)), 0, $previous);

        $this->serviceId = $serviceId;
        $this->path = $path;
    }

    public function getServiceId()
    {
        return $this->serviceId;
    }

    public function getPath()
    {
        return $this->path;
    }
}
PKq_�\����Qpear/Symfony/Component/DependencyInjection/Exception/ServiceNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * This exception is thrown when a non-existent service is requested.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ServiceNotFoundException extends InvalidArgumentException
{
    private $id;
    private $sourceId;

    public function __construct($id, $sourceId = null, \Exception $previous = null, array $alternatives = array())
    {
        if (null === $sourceId) {
            $msg = sprintf('You have requested a non-existent service "%s".', $id);
        } else {
            $msg = sprintf('The service "%s" has a dependency on a non-existent service "%s".', $sourceId, $id);
        }

        if ($alternatives) {
            if (1 == count($alternatives)) {
                $msg .= ' Did you mean this: "';
            } else {
                $msg .= ' Did you mean one of these: "';
            }
            $msg .= implode('", "', $alternatives).'"?';
        }

        parent::__construct($msg, 0, $previous);

        $this->id = $id;
        $this->sourceId = $sourceId;
    }

    public function getId()
    {
        return $this->id;
    }

    public function getSourceId()
    {
        return $this->sourceId;
    }
}
PKq_�\�{����Mpear/Symfony/Component/DependencyInjection/Exception/OutOfBoundsException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * Base OutOfBoundsException for Dependency Injection component.
 */
class OutOfBoundsException extends \OutOfBoundsException implements ExceptionInterface
{
}
PKr_�\��Qpear/Symfony/Component/DependencyInjection/Exception/InvalidArgumentException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Exception;

/**
 * Base InvalidArgumentException for Dependency Injection component.
 *
 * @author Bulat Shakirzyanov <bulat@theopenskyproject.com>
 */
class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
PKr_�\��]
I
I
?pear/Symfony/Component/DependencyInjection/SimpleXMLElement.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

use Symfony\Component\Config\Util\XmlUtils;
use Symfony\Component\ExpressionLanguage\Expression;

/**
 * SimpleXMLElement class.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SimpleXMLElement extends \SimpleXMLElement
{
    /**
     * Converts an attribute as a PHP type.
     *
     * @param string $name
     *
     * @return mixed
     */
    public function getAttributeAsPhp($name)
    {
        return self::phpize($this[$name]);
    }

    /**
     * Returns arguments as valid PHP types.
     *
     * @param string  $name
     * @param Boolean $lowercase
     *
     * @return mixed
     */
    public function getArgumentsAsPhp($name, $lowercase = true)
    {
        $arguments = array();
        foreach ($this->$name as $arg) {
            if (isset($arg['name'])) {
                $arg['key'] = (string) $arg['name'];
            }
            $key = isset($arg['key']) ? (string) $arg['key'] : (!$arguments ? 0 : max(array_keys($arguments)) + 1);

            // parameter keys are case insensitive
            if ('parameter' == $name && $lowercase) {
                $key = strtolower($key);
            }

            // this is used by DefinitionDecorator to overwrite a specific
            // argument of the parent definition
            if (isset($arg['index'])) {
                $key = 'index_'.$arg['index'];
            }

            switch ($arg['type']) {
                case 'service':
                    $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
                    if (isset($arg['on-invalid']) && 'ignore' == $arg['on-invalid']) {
                        $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
                    } elseif (isset($arg['on-invalid']) && 'null' == $arg['on-invalid']) {
                        $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE;
                    }

                    if (isset($arg['strict'])) {
                        $strict = self::phpize($arg['strict']);
                    } else {
                        $strict = true;
                    }

                    $arguments[$key] = new Reference((string) $arg['id'], $invalidBehavior, $strict);
                    break;
                case 'expression':
                    $arguments[$key] = new Expression((string) $arg);
                    break;
                case 'collection':
                    $arguments[$key] = $arg->getArgumentsAsPhp($name, false);
                    break;
                case 'string':
                    $arguments[$key] = (string) $arg;
                    break;
                case 'constant':
                    $arguments[$key] = constant((string) $arg);
                    break;
                default:
                    $arguments[$key] = self::phpize($arg);
            }
        }

        return $arguments;
    }

    /**
     * Converts an xml value to a PHP type.
     *
     * @param mixed $value
     *
     * @return mixed
     */
    public static function phpize($value)
    {
        return XmlUtils::phpize($value);
    }
}
PKs_�\���Rpear/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/DumperInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\LazyProxy\PhpDumper;

use Symfony\Component\DependencyInjection\Definition;

/**
 * Lazy proxy dumper capable of generating the instantiation logic PHP code for proxied services.
 *
 * @author Marco Pivetta <ocramius@gmail.com>
 */
interface DumperInterface
{
    /**
     * Inspects whether the given definitions should produce proxy instantiation logic in the dumped container.
     *
     * @param Definition $definition
     *
     * @return bool
     */
    public function isProxyCandidate(Definition $definition);

    /**
     * Generates the code to be used to instantiate a proxy in the dumped factory code.
     *
     * @param Definition $definition
     * @param string     $id         service identifier
     *
     * @return string
     */
    public function getProxyFactoryCode(Definition $definition, $id);

    /**
     * Generates the code for the lazy proxy.
     *
     * @param Definition $definition
     *
     * @return string
     */
    public function getProxyCode(Definition $definition);
}
PKs_�\��ҳ��Mpear/Symfony/Component/DependencyInjection/LazyProxy/PhpDumper/NullDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\LazyProxy\PhpDumper;

use Symfony\Component\DependencyInjection\Definition;

/**
 * Null dumper, negates any proxy code generation for any given service definition.
 *
 * @author Marco Pivetta <ocramius@gmail.com>
 */
class NullDumper implements DumperInterface
{
    /**
     * {@inheritDoc}
     */
    public function isProxyCandidate(Definition $definition)
    {
        return false;
    }

    /**
     * {@inheritDoc}
     */
    public function getProxyFactoryCode(Definition $definition, $id)
    {
        return '';
    }

    /**
     * {@inheritDoc}
     */
    public function getProxyCode(Definition $definition)
    {
        return '';
    }
}
PKs_�\�i�nn]pear/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/RealServiceInstantiator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\LazyProxy\Instantiator;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;

/**
 * {@inheritDoc}
 *
 * Noop proxy instantiator - simply produces the real service instead of a proxy instance.
 *
 * @author Marco Pivetta <ocramius@gmail.com>
 */
class RealServiceInstantiator implements InstantiatorInterface
{
    /**
     * {@inheritDoc}
     */
    public function instantiateProxy(ContainerInterface $container, Definition $definition, $id, $realInstantiator)
    {
        return call_user_func($realInstantiator);
    }
}
PKt_�\����JJ[pear/Symfony/Component/DependencyInjection/LazyProxy/Instantiator/InstantiatorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\LazyProxy\Instantiator;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;

/**
 * Lazy proxy instantiator, capable of instantiating a proxy given a container, the
 * service definitions and a callback that produces the real service instance.
 *
 * @author Marco Pivetta <ocramius@gmail.com>
 */
interface InstantiatorInterface
{
    /**
     * Instantiates a proxy object.
     *
     * @param ContainerInterface $container        the container from which the service is being requested
     * @param Definition         $definition       the definition of the requested service
     * @param string             $id               identifier of the requested service
     * @param callable           $realInstantiator zero-argument callback that is capable of producing the real
     *                                             service instance
     *
     * @return object
     */
    public function instantiateProxy(ContainerInterface $container, Definition $definition, $id, $realInstantiator);
}
PKt_�\����Gpear/Symfony/Component/DependencyInjection/TaggedContainerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * TaggedContainerInterface is the interface implemented when a container knows how to deals with tags.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface TaggedContainerInterface extends ContainerInterface
{
    /**
     * Returns service ids for a given tag.
     *
     * @param string $name The tag name
     *
     * @return array An array of tags
     *
     * @api
     */
    public function findTaggedServiceIds($name);
}
PKu_�\�E�?Apear/Symfony/Component/DependencyInjection/ContainerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;

/**
 * ContainerInterface is the interface implemented by service container classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 *
 * @api
 */
interface ContainerInterface
{
    const EXCEPTION_ON_INVALID_REFERENCE = 1;
    const NULL_ON_INVALID_REFERENCE      = 2;
    const IGNORE_ON_INVALID_REFERENCE    = 3;
    const SCOPE_CONTAINER                = 'container';
    const SCOPE_PROTOTYPE                = 'prototype';

    /**
     * Sets a service.
     *
     * @param string $id      The service identifier
     * @param object $service The service instance
     * @param string $scope   The scope of the service
     *
     * @api
     */
    public function set($id, $service, $scope = self::SCOPE_CONTAINER);

    /**
     * Gets a service.
     *
     * @param string $id              The service identifier
     * @param int    $invalidBehavior The behavior when the service does not exist
     *
     * @return object The associated service
     *
     * @throws InvalidArgumentException if the service is not defined
     * @throws ServiceCircularReferenceException When a circular reference is detected
     * @throws ServiceNotFoundException When the service is not defined
     *
     * @see Reference
     *
     * @api
     */
    public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE);

    /**
     * Returns true if the given service is defined.
     *
     * @param string $id The service identifier
     *
     * @return Boolean true if the service is defined, false otherwise
     *
     * @api
     */
    public function has($id);

    /**
     * Gets a parameter.
     *
     * @param string $name The parameter name
     *
     * @return mixed  The parameter value
     *
     * @throws InvalidArgumentException if the parameter is not defined
     *
     * @api
     */
    public function getParameter($name);

    /**
     * Checks if a parameter exists.
     *
     * @param string $name The parameter name
     *
     * @return Boolean The presence of parameter in container
     *
     * @api
     */
    public function hasParameter($name);

    /**
     * Sets a parameter.
     *
     * @param string $name  The parameter name
     * @param mixed  $value The parameter value
     *
     * @api
     */
    public function setParameter($name, $value);

    /**
     * Enters the given scope
     *
     * @param string $name
     *
     * @api
     */
    public function enterScope($name);

    /**
     * Leaves the current scope, and re-enters the parent scope
     *
     * @param string $name
     *
     * @api
     */
    public function leaveScope($name);

    /**
     * Adds a scope to the container
     *
     * @param ScopeInterface $scope
     *
     * @api
     */
    public function addScope(ScopeInterface $scope);

    /**
     * Whether this container has the given scope
     *
     * @param string $name
     *
     * @return Boolean
     *
     * @api
     */
    public function hasScope($name);

    /**
     * Determines whether the given scope is currently active.
     *
     * It does however not check if the scope actually exists.
     *
     * @param string $name
     *
     * @return Boolean
     *
     * @api
     */
    public function isScopeActive($name);
}
PKu_�\����EBEB8pear/Symfony/Component/DependencyInjection/Container.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;

/**
 * Container is a dependency injection container.
 *
 * It gives access to object instances (services).
 *
 * Services and parameters are simple key/pair stores.
 *
 * Parameter and service keys are case insensitive.
 *
 * A service id can contain lowercased letters, digits, underscores, and dots.
 * Underscores are used to separate words, and dots to group services
 * under namespaces:
 *
 * <ul>
 *   <li>request</li>
 *   <li>mysql_session_storage</li>
 *   <li>symfony.mysql_session_storage</li>
 * </ul>
 *
 * A service can also be defined by creating a method named
 * getXXXService(), where XXX is the camelized version of the id:
 *
 * <ul>
 *   <li>request -> getRequestService()</li>
 *   <li>mysql_session_storage -> getMysqlSessionStorageService()</li>
 *   <li>symfony.mysql_session_storage -> getSymfony_MysqlSessionStorageService()</li>
 * </ul>
 *
 * The container can have three possible behaviors when a service does not exist:
 *
 *  * EXCEPTION_ON_INVALID_REFERENCE: Throws an exception (the default)
 *  * NULL_ON_INVALID_REFERENCE:      Returns null
 *  * IGNORE_ON_INVALID_REFERENCE:    Ignores the wrapping command asking for the reference
 *                                    (for instance, ignore a setter if the service does not exist)
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 *
 * @api
 */
class Container implements IntrospectableContainerInterface
{
    /**
     * @var ParameterBagInterface
     */
    protected $parameterBag;

    protected $services = array();
    protected $methodMap = array();
    protected $aliases = array();
    protected $scopes = array();
    protected $scopeChildren = array();
    protected $scopedServices = array();
    protected $scopeStacks = array();
    protected $loading = array();

    /**
     * Constructor.
     *
     * @param ParameterBagInterface $parameterBag A ParameterBagInterface instance
     *
     * @api
     */
    public function __construct(ParameterBagInterface $parameterBag = null)
    {
        $this->parameterBag = $parameterBag ?: new ParameterBag();

        $this->set('service_container', $this);
    }

    /**
     * Compiles the container.
     *
     * This method does two things:
     *
     *  * Parameter values are resolved;
     *  * The parameter bag is frozen.
     *
     * @api
     */
    public function compile()
    {
        $this->parameterBag->resolve();

        $this->parameterBag = new FrozenParameterBag($this->parameterBag->all());
    }

    /**
     * Returns true if the container parameter bag are frozen.
     *
     * @return Boolean true if the container parameter bag are frozen, false otherwise
     *
     * @api
     */
    public function isFrozen()
    {
        return $this->parameterBag instanceof FrozenParameterBag;
    }

    /**
     * Gets the service container parameter bag.
     *
     * @return ParameterBagInterface A ParameterBagInterface instance
     *
     * @api
     */
    public function getParameterBag()
    {
        return $this->parameterBag;
    }

    /**
     * Gets a parameter.
     *
     * @param string $name The parameter name
     *
     * @return mixed  The parameter value
     *
     * @throws InvalidArgumentException if the parameter is not defined
     *
     * @api
     */
    public function getParameter($name)
    {
        return $this->parameterBag->get($name);
    }

    /**
     * Checks if a parameter exists.
     *
     * @param string $name The parameter name
     *
     * @return Boolean The presence of parameter in container
     *
     * @api
     */
    public function hasParameter($name)
    {
        return $this->parameterBag->has($name);
    }

    /**
     * Sets a parameter.
     *
     * @param string $name  The parameter name
     * @param mixed  $value The parameter value
     *
     * @api
     */
    public function setParameter($name, $value)
    {
        $this->parameterBag->set($name, $value);
    }

    /**
     * Sets a service.
     *
     * Setting a service to null resets the service: has() returns false and get()
     * behaves in the same way as if the service was never created.
     *
     * @param string $id      The service identifier
     * @param object $service The service instance
     * @param string $scope   The scope of the service
     *
     * @throws RuntimeException When trying to set a service in an inactive scope
     * @throws InvalidArgumentException When trying to set a service in the prototype scope
     *
     * @api
     */
    public function set($id, $service, $scope = self::SCOPE_CONTAINER)
    {
        if (self::SCOPE_PROTOTYPE === $scope) {
            throw new InvalidArgumentException(sprintf('You cannot set service "%s" of scope "prototype".', $id));
        }

        $id = strtolower($id);

        if (self::SCOPE_CONTAINER !== $scope) {
            if (!isset($this->scopedServices[$scope])) {
                throw new RuntimeException(sprintf('You cannot set service "%s" of inactive scope.', $id));
            }

            $this->scopedServices[$scope][$id] = $service;
        }

        $this->services[$id] = $service;

        if (method_exists($this, $method = 'synchronize'.strtr($id, array('_' => '', '.' => '_', '\\' => '_')).'Service')) {
            $this->$method();
        }

        if (self::SCOPE_CONTAINER !== $scope && null === $service) {
            unset($this->scopedServices[$scope][$id]);
        }

        if (null === $service) {
            unset($this->services[$id]);
        }
    }

    /**
     * Returns true if the given service is defined.
     *
     * @param string $id The service identifier
     *
     * @return Boolean true if the service is defined, false otherwise
     *
     * @api
     */
    public function has($id)
    {
        $id = strtolower($id);

        return isset($this->services[$id])
            || array_key_exists($id, $this->services)
            || isset($this->aliases[$id])
            || method_exists($this, 'get'.strtr($id, array('_' => '', '.' => '_', '\\' => '_')).'Service')
        ;
    }

    /**
     * Gets a service.
     *
     * If a service is defined both through a set() method and
     * with a get{$id}Service() method, the former has always precedence.
     *
     * @param string  $id              The service identifier
     * @param integer $invalidBehavior The behavior when the service does not exist
     *
     * @return object The associated service
     *
     * @throws InvalidArgumentException if the service is not defined
     * @throws ServiceCircularReferenceException When a circular reference is detected
     * @throws ServiceNotFoundException When the service is not defined
     *
     * @see Reference
     *
     * @api
     */
    public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE)
    {
        // Attempt to retrieve the service by checking first aliases then
        // available services. Service IDs are case insensitive, however since
        // this method can be called thousands of times during a request, avoid
        // calling strtolower() unless necessary.
        foreach (array(false, true) as $strtolower) {
            if ($strtolower) {
                $id = strtolower($id);
            }
            if (isset($this->aliases[$id])) {
                $id = $this->aliases[$id];
            }
            // Re-use shared service instance if it exists.
            if (isset($this->services[$id]) || array_key_exists($id, $this->services)) {
                return $this->services[$id];
            }
        }

        if (isset($this->loading[$id])) {
            throw new ServiceCircularReferenceException($id, array_keys($this->loading));
        }

        if (isset($this->methodMap[$id])) {
            $method = $this->methodMap[$id];
        } elseif (method_exists($this, $method = 'get'.strtr($id, array('_' => '', '.' => '_', '\\' => '_')).'Service')) {
            // $method is set to the right value, proceed
        } else {
            if (self::EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior) {
                if (!$id) {
                    throw new ServiceNotFoundException($id);
                }

                $alternatives = array();
                foreach (array_keys($this->services) as $key) {
                    $lev = levenshtein($id, $key);
                    if ($lev <= strlen($id) / 3 || false !== strpos($key, $id)) {
                        $alternatives[] = $key;
                    }
                }

                throw new ServiceNotFoundException($id, null, null, $alternatives);
            }

            return null;
        }

        $this->loading[$id] = true;

        try {
            $service = $this->$method();
        } catch (\Exception $e) {
            unset($this->loading[$id]);

            if (array_key_exists($id, $this->services)) {
                unset($this->services[$id]);
            }

            if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
                return null;
            }

            throw $e;
        }

        unset($this->loading[$id]);

        return $service;
    }

    /**
     * Returns true if the given service has actually been initialized
     *
     * @param string $id The service identifier
     *
     * @return Boolean true if service has already been initialized, false otherwise
     */
    public function initialized($id)
    {
        $id = strtolower($id);

        return isset($this->services[$id]) || array_key_exists($id, $this->services);
    }

    /**
     * Gets all service ids.
     *
     * @return array An array of all defined service ids
     */
    public function getServiceIds()
    {
        $ids = array();
        $r = new \ReflectionClass($this);
        foreach ($r->getMethods() as $method) {
            if (preg_match('/^get(.+)Service$/', $method->name, $match)) {
                $ids[] = self::underscore($match[1]);
            }
        }

        return array_unique(array_merge($ids, array_keys($this->services)));
    }

    /**
     * This is called when you enter a scope
     *
     * @param string $name
     *
     * @throws RuntimeException         When the parent scope is inactive
     * @throws InvalidArgumentException When the scope does not exist
     *
     * @api
     */
    public function enterScope($name)
    {
        if (!isset($this->scopes[$name])) {
            throw new InvalidArgumentException(sprintf('The scope "%s" does not exist.', $name));
        }

        if (self::SCOPE_CONTAINER !== $this->scopes[$name] && !isset($this->scopedServices[$this->scopes[$name]])) {
            throw new RuntimeException(sprintf('The parent scope "%s" must be active when entering this scope.', $this->scopes[$name]));
        }

        // check if a scope of this name is already active, if so we need to
        // remove all services of this scope, and those of any of its child
        // scopes from the global services map
        if (isset($this->scopedServices[$name])) {
            $services = array($this->services, $name => $this->scopedServices[$name]);
            unset($this->scopedServices[$name]);

            foreach ($this->scopeChildren[$name] as $child) {
                if (isset($this->scopedServices[$child])) {
                    $services[$child] = $this->scopedServices[$child];
                    unset($this->scopedServices[$child]);
                }
            }

            // update global map
            $this->services = call_user_func_array('array_diff_key', $services);
            array_shift($services);

            // add stack entry for this scope so we can restore the removed services later
            if (!isset($this->scopeStacks[$name])) {
                $this->scopeStacks[$name] = new \SplStack();
            }
            $this->scopeStacks[$name]->push($services);
        }

        $this->scopedServices[$name] = array();
    }

    /**
     * This is called to leave the current scope, and move back to the parent
     * scope.
     *
     * @param string $name The name of the scope to leave
     *
     * @throws InvalidArgumentException if the scope is not active
     *
     * @api
     */
    public function leaveScope($name)
    {
        if (!isset($this->scopedServices[$name])) {
            throw new InvalidArgumentException(sprintf('The scope "%s" is not active.', $name));
        }

        // remove all services of this scope, or any of its child scopes from
        // the global service map
        $services = array($this->services, $this->scopedServices[$name]);
        unset($this->scopedServices[$name]);
        foreach ($this->scopeChildren[$name] as $child) {
            if (!isset($this->scopedServices[$child])) {
                continue;
            }

            $services[] = $this->scopedServices[$child];
            unset($this->scopedServices[$child]);
        }
        $this->services = call_user_func_array('array_diff_key', $services);

        // check if we need to restore services of a previous scope of this type
        if (isset($this->scopeStacks[$name]) && count($this->scopeStacks[$name]) > 0) {
            $services = $this->scopeStacks[$name]->pop();
            $this->scopedServices += $services;

            foreach ($services as $array) {
                foreach ($array as $id => $service) {
                    $this->set($id, $service, $name);
                }
            }
        }
    }

    /**
     * Adds a scope to the container.
     *
     * @param ScopeInterface $scope
     *
     * @throws InvalidArgumentException
     *
     * @api
     */
    public function addScope(ScopeInterface $scope)
    {
        $name = $scope->getName();
        $parentScope = $scope->getParentName();

        if (self::SCOPE_CONTAINER === $name || self::SCOPE_PROTOTYPE === $name) {
            throw new InvalidArgumentException(sprintf('The scope "%s" is reserved.', $name));
        }
        if (isset($this->scopes[$name])) {
            throw new InvalidArgumentException(sprintf('A scope with name "%s" already exists.', $name));
        }
        if (self::SCOPE_CONTAINER !== $parentScope && !isset($this->scopes[$parentScope])) {
            throw new InvalidArgumentException(sprintf('The parent scope "%s" does not exist, or is invalid.', $parentScope));
        }

        $this->scopes[$name] = $parentScope;
        $this->scopeChildren[$name] = array();

        // normalize the child relations
        while ($parentScope !== self::SCOPE_CONTAINER) {
            $this->scopeChildren[$parentScope][] = $name;
            $parentScope = $this->scopes[$parentScope];
        }
    }

    /**
     * Returns whether this container has a certain scope
     *
     * @param string $name The name of the scope
     *
     * @return Boolean
     *
     * @api
     */
    public function hasScope($name)
    {
        return isset($this->scopes[$name]);
    }

    /**
     * Returns whether this scope is currently active
     *
     * This does not actually check if the passed scope actually exists.
     *
     * @param string $name
     *
     * @return Boolean
     *
     * @api
     */
    public function isScopeActive($name)
    {
        return isset($this->scopedServices[$name]);
    }

    /**
     * Camelizes a string.
     *
     * @param string $id A string to camelize
     *
     * @return string The camelized string
     */
    public static function camelize($id)
    {
        return strtr(ucwords(strtr($id, array('_' => ' ', '.' => '_ ', '\\' => '_ '))), array(' ' => ''));
    }

    /**
     * A string to underscore.
     *
     * @param string $id The string to underscore
     *
     * @return string The underscored string
     */
    public static function underscore($id)
    {
        return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), strtr($id, '_', '.')));
    }
}
PKu_�\ܮP8�	�	Qpear/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\ParameterBag;

use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;

/**
 * ParameterBagInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface ParameterBagInterface
{
    /**
     * Clears all parameters.
     *
     * @api
     */
    public function clear();

    /**
     * Adds parameters to the service container parameters.
     *
     * @param array $parameters An array of parameters
     *
     * @api
     */
    public function add(array $parameters);

    /**
     * Gets the service container parameters.
     *
     * @return array An array of parameters
     *
     * @api
     */
    public function all();

    /**
     * Gets a service container parameter.
     *
     * @param string $name The parameter name
     *
     * @return mixed  The parameter value
     *
     * @throws ParameterNotFoundException if the parameter is not defined
     *
     * @api
     */
    public function get($name);

    /**
     * Sets a service container parameter.
     *
     * @param string $name  The parameter name
     * @param mixed  $value The parameter value
     *
     * @api
     */
    public function set($name, $value);

    /**
     * Returns true if a parameter name is defined.
     *
     * @param string $name The parameter name
     *
     * @return Boolean true if the parameter name is defined, false otherwise
     *
     * @api
     */
    public function has($name);

    /**
     * Replaces parameter placeholders (%name%) by their values for all parameters.
     */
    public function resolve();

    /**
     * Replaces parameter placeholders (%name%) by their values.
     *
     * @param mixed $value A value
     *
     * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
     */
    public function resolveValue($value);

    /**
     * Escape parameter placeholders %
     *
     * @param mixed $value
     *
     * @return mixed
     */
    public function escapeValue($value);

    /**
     * Unescape parameter placeholders %
     *
     * @param mixed $value
     *
     * @return mixed
     */
    public function unescapeValue($value);
}
PKv_�\���U" " Hpear/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\ParameterBag;

use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;

/**
 * Holds parameters.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ParameterBag implements ParameterBagInterface
{
    protected $parameters = array();
    protected $resolved = false;

    /**
     * Constructor.
     *
     * @param array $parameters An array of parameters
     *
     * @api
     */
    public function __construct(array $parameters = array())
    {
        $this->add($parameters);
    }

    /**
     * Clears all parameters.
     *
     * @api
     */
    public function clear()
    {
        $this->parameters = array();
    }

    /**
     * Adds parameters to the service container parameters.
     *
     * @param array $parameters An array of parameters
     *
     * @api
     */
    public function add(array $parameters)
    {
        foreach ($parameters as $key => $value) {
            $this->parameters[strtolower($key)] = $value;
        }
    }

    /**
     * Gets the service container parameters.
     *
     * @return array An array of parameters
     *
     * @api
     */
    public function all()
    {
        return $this->parameters;
    }

    /**
     * Gets a service container parameter.
     *
     * @param string $name The parameter name
     *
     * @return mixed  The parameter value
     *
     * @throws ParameterNotFoundException if the parameter is not defined
     *
     * @api
     */
    public function get($name)
    {
        $name = strtolower($name);

        if (!array_key_exists($name, $this->parameters)) {
            if (!$name) {
                throw new ParameterNotFoundException($name);
            }

            $alternatives = array();
            foreach (array_keys($this->parameters) as $key) {
                $lev = levenshtein($name, $key);
                if ($lev <= strlen($name) / 3 || false !== strpos($key, $name)) {
                    $alternatives[] = $key;
                }
            }

            throw new ParameterNotFoundException($name, null, null, null, $alternatives);
        }

        return $this->parameters[$name];
    }

    /**
     * Sets a service container parameter.
     *
     * @param string $name  The parameter name
     * @param mixed  $value The parameter value
     *
     * @api
     */
    public function set($name, $value)
    {
        $this->parameters[strtolower($name)] = $value;
    }

    /**
     * Returns true if a parameter name is defined.
     *
     * @param string $name The parameter name
     *
     * @return Boolean true if the parameter name is defined, false otherwise
     *
     * @api
     */
    public function has($name)
    {
        return array_key_exists(strtolower($name), $this->parameters);
    }

    /**
     * Removes a parameter.
     *
     * @param string $name The parameter name
     *
     * @api
     */
    public function remove($name)
    {
        unset($this->parameters[strtolower($name)]);
    }

    /**
     * Replaces parameter placeholders (%name%) by their values for all parameters.
     */
    public function resolve()
    {
        if ($this->resolved) {
            return;
        }

        $parameters = array();
        foreach ($this->parameters as $key => $value) {
            try {
                $value = $this->resolveValue($value);
                $parameters[$key] = $this->unescapeValue($value);
            } catch (ParameterNotFoundException $e) {
                $e->setSourceKey($key);

                throw $e;
            }
        }

        $this->parameters = $parameters;
        $this->resolved = true;
    }

    /**
     * Replaces parameter placeholders (%name%) by their values.
     *
     * @param mixed $value     A value
     * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
     *
     * @return mixed The resolved value
     *
     * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
     * @throws ParameterCircularReferenceException if a circular reference if detected
     * @throws RuntimeException when a given parameter has a type problem.
     */
    public function resolveValue($value, array $resolving = array())
    {
        if (is_array($value)) {
            $args = array();
            foreach ($value as $k => $v) {
                $args[$this->resolveValue($k, $resolving)] = $this->resolveValue($v, $resolving);
            }

            return $args;
        }

        if (!is_string($value)) {
            return $value;
        }

        return $this->resolveString($value, $resolving);
    }

    /**
     * Resolves parameters inside a string
     *
     * @param string $value     The string to resolve
     * @param array  $resolving An array of keys that are being resolved (used internally to detect circular references)
     *
     * @return string The resolved string
     *
     * @throws ParameterNotFoundException if a placeholder references a parameter that does not exist
     * @throws ParameterCircularReferenceException if a circular reference if detected
     * @throws RuntimeException when a given parameter has a type problem.
     */
    public function resolveString($value, array $resolving = array())
    {
        // we do this to deal with non string values (Boolean, integer, ...)
        // as the preg_replace_callback throw an exception when trying
        // a non-string in a parameter value
        if (preg_match('/^%([^%\s]+)%$/', $value, $match)) {
            $key = strtolower($match[1]);

            if (isset($resolving[$key])) {
                throw new ParameterCircularReferenceException(array_keys($resolving));
            }

            $resolving[$key] = true;

            return $this->resolved ? $this->get($key) : $this->resolveValue($this->get($key), $resolving);
        }

        $self = $this;

        return preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($self, $resolving, $value) {
            // skip %%
            if (!isset($match[1])) {
                return '%%';
            }

            $key = strtolower($match[1]);
            if (isset($resolving[$key])) {
                throw new ParameterCircularReferenceException(array_keys($resolving));
            }

            $resolved = $self->get($key);

            if (!is_string($resolved) && !is_numeric($resolved)) {
                throw new RuntimeException(sprintf('A string value must be composed of strings and/or numbers, but found parameter "%s" of type %s inside string value "%s".', $key, gettype($resolved), $value));
            }

            $resolved = (string) $resolved;
            $resolving[$key] = true;

            return $self->isResolved() ? $resolved : $self->resolveString($resolved, $resolving);
        }, $value);
    }

    public function isResolved()
    {
        return $this->resolved;
    }

    /**
     * {@inheritDoc}
     */
    public function escapeValue($value)
    {
        if (is_string($value)) {
            return str_replace('%', '%%', $value);
        }

        if (is_array($value)) {
            $result = array();
            foreach ($value as $k => $v) {
                $result[$k] = $this->escapeValue($v);
            }

            return $result;
        }

        return $value;
    }

    public function unescapeValue($value)
    {
        if (is_string($value)) {
            return str_replace('%%', '%', $value);
        }

        if (is_array($value)) {
            $result = array();
            foreach ($value as $k => $v) {
                $result[$k] = $this->unescapeValue($v);
            }

            return $result;
        }

        return $value;
    }
}
PKv_�\ך�Npear/Symfony/Component/DependencyInjection/ParameterBag/FrozenParameterBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\ParameterBag;

use Symfony\Component\DependencyInjection\Exception\LogicException;

/**
 * Holds read-only parameters.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class FrozenParameterBag extends ParameterBag
{
    /**
     * Constructor.
     *
     * For performance reasons, the constructor assumes that
     * all keys are already lowercased.
     *
     * This is always the case when used internally.
     *
     * @param array $parameters An array of parameters
     *
     * @api
     */
    public function __construct(array $parameters = array())
    {
        $this->parameters = $parameters;
        $this->resolved = true;
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function clear()
    {
        throw new LogicException('Impossible to call clear() on a frozen ParameterBag.');
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function add(array $parameters)
    {
        throw new LogicException('Impossible to call add() on a frozen ParameterBag.');
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function set($name, $value)
    {
        throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
    }
}
PKw_�\�BtBBOpear/Symfony/Component/DependencyInjection/IntrospectableContainerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * IntrospectableContainerInterface defines additional introspection functionality
 * for containers, allowing logic to be implemented based on a Container's state.
 *
 * @author Evan Villemez <evillemez@gmail.com>
 *
 */
interface IntrospectableContainerInterface extends ContainerInterface
{
    /**
     * Check for whether or not a service has been initialized.
     *
     * @param string $id
     *
     * @return Boolean true if the service has been initialized, false otherwise
     *
     */
    public function initialized($id);

}
PKw_�\��c!89899pear/Symfony/Component/DependencyInjection/Definition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;

/**
 * Definition represents a service definition.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Definition
{
    private $class;
    private $file;
    private $factoryClass;
    private $factoryMethod;
    private $factoryService;
    private $scope = ContainerInterface::SCOPE_CONTAINER;
    private $properties = array();
    private $calls = array();
    private $configurator;
    private $tags = array();
    private $public = true;
    private $synthetic = false;
    private $abstract = false;
    private $synchronized = false;
    private $lazy = false;

    protected $arguments;

    /**
     * Constructor.
     *
     * @param string|null $class     The service class
     * @param array       $arguments An array of arguments to pass to the service constructor
     *
     * @api
     */
    public function __construct($class = null, array $arguments = array())
    {
        $this->class = $class;
        $this->arguments = $arguments;
    }

    /**
     * Sets the name of the class that acts as a factory using the factory method,
     * which will be invoked statically.
     *
     * @param string $factoryClass The factory class name
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setFactoryClass($factoryClass)
    {
        $this->factoryClass = $factoryClass;

        return $this;
    }

    /**
     * Gets the factory class.
     *
     * @return string|null The factory class name
     *
     * @api
     */
    public function getFactoryClass()
    {
        return $this->factoryClass;
    }

    /**
     * Sets the factory method able to create an instance of this class.
     *
     * @param string $factoryMethod The factory method name
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setFactoryMethod($factoryMethod)
    {
        $this->factoryMethod = $factoryMethod;

        return $this;
    }

    /**
     * Gets the factory method.
     *
     * @return string|null The factory method name
     *
     * @api
     */
    public function getFactoryMethod()
    {
        return $this->factoryMethod;
    }

    /**
     * Sets the name of the service that acts as a factory using the factory method.
     *
     * @param string $factoryService The factory service id
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setFactoryService($factoryService)
    {
        $this->factoryService = $factoryService;

        return $this;
    }

    /**
     * Gets the factory service id.
     *
     * @return string|null The factory service id
     *
     * @api
     */
    public function getFactoryService()
    {
        return $this->factoryService;
    }

    /**
     * Sets the service class.
     *
     * @param string $class The service class
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setClass($class)
    {
        $this->class = $class;

        return $this;
    }

    /**
     * Gets the service class.
     *
     * @return string|null The service class
     *
     * @api
     */
    public function getClass()
    {
        return $this->class;
    }

    /**
     * Sets the arguments to pass to the service constructor/factory method.
     *
     * @param array $arguments An array of arguments
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setArguments(array $arguments)
    {
        $this->arguments = $arguments;

        return $this;
    }

    /**
     * @api
     */
    public function setProperties(array $properties)
    {
        $this->properties = $properties;

        return $this;
    }

    /**
     * @api
     */
    public function getProperties()
    {
        return $this->properties;
    }

    /**
     * @api
     */
    public function setProperty($name, $value)
    {
        $this->properties[$name] = $value;

        return $this;
    }

    /**
     * Adds an argument to pass to the service constructor/factory method.
     *
     * @param mixed $argument An argument
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function addArgument($argument)
    {
        $this->arguments[] = $argument;

        return $this;
    }

    /**
     * Sets a specific argument
     *
     * @param integer $index
     * @param mixed   $argument
     *
     * @return Definition The current instance
     *
     * @throws OutOfBoundsException When the replaced argument does not exist
     *
     * @api
     */
    public function replaceArgument($index, $argument)
    {
        if ($index < 0 || $index > count($this->arguments) - 1) {
            throw new OutOfBoundsException(sprintf('The index "%d" is not in the range [0, %d].', $index, count($this->arguments) - 1));
        }

        $this->arguments[$index] = $argument;

        return $this;
    }

    /**
     * Gets the arguments to pass to the service constructor/factory method.
     *
     * @return array The array of arguments
     *
     * @api
     */
    public function getArguments()
    {
        return $this->arguments;
    }

    /**
     * Gets an argument to pass to the service constructor/factory method.
     *
     * @param integer $index
     *
     * @return mixed The argument value
     *
     * @throws OutOfBoundsException When the argument does not exist
     *
     * @api
     */
    public function getArgument($index)
    {
        if ($index < 0 || $index > count($this->arguments) - 1) {
            throw new OutOfBoundsException(sprintf('The index "%d" is not in the range [0, %d].', $index, count($this->arguments) - 1));
        }

        return $this->arguments[$index];
    }

    /**
     * Sets the methods to call after service initialization.
     *
     * @param array $calls An array of method calls
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setMethodCalls(array $calls = array())
    {
        $this->calls = array();
        foreach ($calls as $call) {
            $this->addMethodCall($call[0], $call[1]);
        }

        return $this;
    }

    /**
     * Adds a method to call after service initialization.
     *
     * @param string $method    The method name to call
     * @param array  $arguments An array of arguments to pass to the method call
     *
     * @return Definition The current instance
     *
     * @throws InvalidArgumentException on empty $method param
     *
     * @api
     */
    public function addMethodCall($method, array $arguments = array())
    {
        if (empty($method)) {
            throw new InvalidArgumentException(sprintf('Method name cannot be empty.'));
        }
        $this->calls[] = array($method, $arguments);

        return $this;
    }

    /**
     * Removes a method to call after service initialization.
     *
     * @param string $method The method name to remove
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function removeMethodCall($method)
    {
        foreach ($this->calls as $i => $call) {
            if ($call[0] === $method) {
                unset($this->calls[$i]);
                break;
            }
        }

        return $this;
    }

    /**
     * Check if the current definition has a given method to call after service initialization.
     *
     * @param string $method The method name to search for
     *
     * @return Boolean
     *
     * @api
     */
    public function hasMethodCall($method)
    {
        foreach ($this->calls as $call) {
            if ($call[0] === $method) {
                return true;
            }
        }

        return false;
    }

    /**
     * Gets the methods to call after service initialization.
     *
     * @return array An array of method calls
     *
     * @api
     */
    public function getMethodCalls()
    {
        return $this->calls;
    }

    /**
     * Sets tags for this definition
     *
     * @param array $tags
     *
     * @return Definition the current instance
     *
     * @api
     */
    public function setTags(array $tags)
    {
        $this->tags = $tags;

        return $this;
    }

    /**
     * Returns all tags.
     *
     * @return array An array of tags
     *
     * @api
     */
    public function getTags()
    {
        return $this->tags;
    }

    /**
     * Gets a tag by name.
     *
     * @param string $name The tag name
     *
     * @return array An array of attributes
     *
     * @api
     */
    public function getTag($name)
    {
        return isset($this->tags[$name]) ? $this->tags[$name] : array();
    }

    /**
     * Adds a tag for this definition.
     *
     * @param string $name       The tag name
     * @param array  $attributes An array of attributes
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function addTag($name, array $attributes = array())
    {
        $this->tags[$name][] = $attributes;

        return $this;
    }

    /**
     * Whether this definition has a tag with the given name
     *
     * @param string $name
     *
     * @return Boolean
     *
     * @api
     */
    public function hasTag($name)
    {
        return isset($this->tags[$name]);
    }

    /**
     * Clears all tags for a given name.
     *
     * @param string $name The tag name
     *
     * @return Definition
     */
    public function clearTag($name)
    {
        if (isset($this->tags[$name])) {
            unset($this->tags[$name]);
        }

        return $this;
    }

    /**
     * Clears the tags for this definition.
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function clearTags()
    {
        $this->tags = array();

        return $this;
    }

    /**
     * Sets a file to require before creating the service.
     *
     * @param string $file A full pathname to include
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setFile($file)
    {
        $this->file = $file;

        return $this;
    }

    /**
     * Gets the file to require before creating the service.
     *
     * @return string|null The full pathname to include
     *
     * @api
     */
    public function getFile()
    {
        return $this->file;
    }

    /**
     * Sets the scope of the service
     *
     * @param string $scope Whether the service must be shared or not
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setScope($scope)
    {
        $this->scope = $scope;

        return $this;
    }

    /**
     * Returns the scope of the service
     *
     * @return string
     *
     * @api
     */
    public function getScope()
    {
        return $this->scope;
    }

    /**
     * Sets the visibility of this service.
     *
     * @param Boolean $boolean
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setPublic($boolean)
    {
        $this->public = (Boolean) $boolean;

        return $this;
    }

    /**
     * Whether this service is public facing
     *
     * @return Boolean
     *
     * @api
     */
    public function isPublic()
    {
        return $this->public;
    }

    /**
     * Sets the synchronized flag of this service.
     *
     * @param Boolean $boolean
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setSynchronized($boolean)
    {
        $this->synchronized = (Boolean) $boolean;

        return $this;
    }

    /**
     * Whether this service is synchronized.
     *
     * @return Boolean
     *
     * @api
     */
    public function isSynchronized()
    {
        return $this->synchronized;
    }

    /**
     * Sets the lazy flag of this service.
     *
     * @param Boolean $lazy
     *
     * @return Definition The current instance
     */
    public function setLazy($lazy)
    {
        $this->lazy = (Boolean) $lazy;

        return $this;
    }

    /**
     * Whether this service is lazy.
     *
     * @return Boolean
     */
    public function isLazy()
    {
        return $this->lazy;
    }

    /**
     * Sets whether this definition is synthetic, that is not constructed by the
     * container, but dynamically injected.
     *
     * @param Boolean $boolean
     *
     * @return Definition the current instance
     *
     * @api
     */
    public function setSynthetic($boolean)
    {
        $this->synthetic = (Boolean) $boolean;

        return $this;
    }

    /**
     * Whether this definition is synthetic, that is not constructed by the
     * container, but dynamically injected.
     *
     * @return Boolean
     *
     * @api
     */
    public function isSynthetic()
    {
        return $this->synthetic;
    }

    /**
     * Whether this definition is abstract, that means it merely serves as a
     * template for other definitions.
     *
     * @param Boolean $boolean
     *
     * @return Definition the current instance
     *
     * @api
     */
    public function setAbstract($boolean)
    {
        $this->abstract = (Boolean) $boolean;

        return $this;
    }

    /**
     * Whether this definition is abstract, that means it merely serves as a
     * template for other definitions.
     *
     * @return Boolean
     *
     * @api
     */
    public function isAbstract()
    {
        return $this->abstract;
    }

    /**
     * Sets a configurator to call after the service is fully initialized.
     *
     * @param callable $callable A PHP callable
     *
     * @return Definition The current instance
     *
     * @api
     */
    public function setConfigurator($callable)
    {
        $this->configurator = $callable;

        return $this;
    }

    /**
     * Gets the configurator to call after the service is fully initialized.
     *
     * @return callable|null The PHP callable to call
     *
     * @api
     */
    public function getConfigurator()
    {
        return $this->configurator;
    }
}
PKw_�\_��J=pear/Symfony/Component/DependencyInjection/ScopeInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

/**
 * Scope Interface.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 *
 * @api
 */
interface ScopeInterface
{
    /**
     * @api
     */
    public function getName();

    /**
     * @api
     */
    public function getParentName();
}
PKx_�\U穌PPBpear/Symfony/Component/DependencyInjection/DefinitionDecorator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection;

use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;

/**
 * This definition decorates another definition.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 *
 * @api
 */
class DefinitionDecorator extends Definition
{
    private $parent;
    private $changes = array();

    /**
     * Constructor.
     *
     * @param string $parent The id of Definition instance to decorate.
     *
     * @api
     */
    public function __construct($parent)
    {
        parent::__construct();

        $this->parent = $parent;
    }

    /**
     * Returns the Definition being decorated.
     *
     * @return string
     *
     * @api
     */
    public function getParent()
    {
        return $this->parent;
    }

    /**
     * Returns all changes tracked for the Definition object.
     *
     * @return array An array of changes for this Definition
     *
     * @api
     */
    public function getChanges()
    {
        return $this->changes;
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function setClass($class)
    {
        $this->changes['class'] = true;

        return parent::setClass($class);
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function setFactoryClass($class)
    {
        $this->changes['factory_class'] = true;

        return parent::setFactoryClass($class);
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function setFactoryMethod($method)
    {
        $this->changes['factory_method'] = true;

        return parent::setFactoryMethod($method);
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function setFactoryService($service)
    {
        $this->changes['factory_service'] = true;

        return parent::setFactoryService($service);
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function setConfigurator($callable)
    {
        $this->changes['configurator'] = true;

        return parent::setConfigurator($callable);
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function setFile($file)
    {
        $this->changes['file'] = true;

        return parent::setFile($file);
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function setPublic($boolean)
    {
        $this->changes['public'] = true;

        return parent::setPublic($boolean);
    }

    /**
     * {@inheritDoc}
     *
     * @api
     */
    public function setLazy($boolean)
    {
        $this->changes['lazy'] = true;

        return parent::setLazy($boolean);
    }

    /**
     * Gets an argument to pass to the service constructor/factory method.
     *
     * If replaceArgument() has been used to replace an argument, this method
     * will return the replacement value.
     *
     * @param integer $index
     *
     * @return mixed The argument value
     *
     * @throws OutOfBoundsException When the argument does not exist
     *
     * @api
     */
    public function getArgument($index)
    {
        if (array_key_exists('index_'.$index, $this->arguments)) {
            return $this->arguments['index_'.$index];
        }

        $lastIndex = count(array_filter(array_keys($this->arguments), 'is_int')) - 1;

        if ($index < 0 || $index > $lastIndex) {
            throw new OutOfBoundsException(sprintf('The index "%d" is not in the range [0, %d].', $index, $lastIndex));
        }

        return $this->arguments[$index];
    }

    /**
     * You should always use this method when overwriting existing arguments
     * of the parent definition.
     *
     * If you directly call setArguments() keep in mind that you must follow
     * certain conventions when you want to overwrite the arguments of the
     * parent definition, otherwise your arguments will only be appended.
     *
     * @param integer $index
     * @param mixed   $value
     *
     * @return DefinitionDecorator the current instance
     * @throws InvalidArgumentException when $index isn't an integer
     *
     * @api
     */
    public function replaceArgument($index, $value)
    {
        if (!is_int($index)) {
            throw new InvalidArgumentException('$index must be an integer.');
        }

        $this->arguments['index_'.$index] = $value;

        return $this;
    }
}
PKx_�\<�4{bb-pear/Symfony/Component/DomCrawler/Crawler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler;

use Symfony\Component\CssSelector\CssSelector;

/**
 * Crawler eases navigation of a list of \DOMNode objects.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Crawler extends \SplObjectStorage
{
    /**
     * @var string The current URI or the base href value
     */
    protected $uri;

    /**
     * @var string The default namespace prefix to be used with XPath and CSS expressions
     */
    private $defaultNamespacePrefix = 'default';

    /**
     * @var array A map of manually registered namespaces
     */
    private $namespaces = array();

    /**
     * Constructor.
     *
     * @param mixed  $node A Node to use as the base for the crawling
     * @param string $uri  The current URI or the base href value
     *
     * @api
     */
    public function __construct($node = null, $uri = null)
    {
        $this->uri = $uri;

        $this->add($node);
    }

    /**
     * Removes all the nodes.
     *
     * @api
     */
    public function clear()
    {
        $this->removeAll($this);
    }

    /**
     * Adds a node to the current list of nodes.
     *
     * This method uses the appropriate specialized add*() method based
     * on the type of the argument.
     *
     * @param \DOMNodeList|\DOMNode|array|string|null $node A node
     *
     * @throws \InvalidArgumentException When node is not the expected type.
     *
     * @api
     */
    public function add($node)
    {
        if ($node instanceof \DOMNodeList) {
            $this->addNodeList($node);
        } elseif ($node instanceof \DOMNode) {
            $this->addNode($node);
        } elseif (is_array($node)) {
            $this->addNodes($node);
        } elseif (is_string($node)) {
            $this->addContent($node);
        } elseif (null !== $node) {
            throw new \InvalidArgumentException(sprintf('Expecting a DOMNodeList or DOMNode instance, an array, a string, or null, but got "%s".', is_object($node) ? get_class($node) : gettype($node)));
        }
    }

    /**
     * Adds HTML/XML content.
     *
     * If the charset is not set via the content type, it is assumed
     * to be ISO-8859-1, which is the default charset defined by the
     * HTTP 1.1 specification.
     *
     * @param string      $content A string to parse as HTML/XML
     * @param null|string $type    The content type of the string
     */
    public function addContent($content, $type = null)
    {
        if (empty($type)) {
            $type = 0 === strpos($content, '<?xml') ? 'application/xml' : 'text/html';
        }

        // DOM only for HTML/XML content
        if (!preg_match('/(x|ht)ml/i', $type, $xmlMatches)) {
            return null;
        }

        $charset = null;
        if (false !== $pos = stripos($type, 'charset=')) {
            $charset = substr($type, $pos + 8);
            if (false !== $pos = strpos($charset, ';')) {
                $charset = substr($charset, 0, $pos);
            }
        }

        if (null === $charset &&
            preg_match('/\<meta[^\>]+charset *= *["\']?([a-zA-Z\-0-9]+)/i', $content, $matches)) {
            $charset = $matches[1];
        }

        if (null === $charset) {
            $charset = 'ISO-8859-1';
        }

        if ('x' === $xmlMatches[1]) {
            $this->addXmlContent($content, $charset);
        } else {
            $this->addHtmlContent($content, $charset);
        }
    }

    /**
     * Adds an HTML content to the list of nodes.
     *
     * The libxml errors are disabled when the content is parsed.
     *
     * If you want to get parsing errors, be sure to enable
     * internal errors via libxml_use_internal_errors(true)
     * and then, get the errors via libxml_get_errors(). Be
     * sure to clear errors with libxml_clear_errors() afterward.
     *
     * @param string $content The HTML content
     * @param string $charset The charset
     *
     * @api
     */
    public function addHtmlContent($content, $charset = 'UTF-8')
    {
        $internalErrors = libxml_use_internal_errors(true);
        $disableEntities = libxml_disable_entity_loader(true);

        $dom = new \DOMDocument('1.0', $charset);
        $dom->validateOnParse = true;

        if (function_exists('mb_convert_encoding')) {
            $hasError = false;
            set_error_handler(function () use (&$hasError) {
                $hasError = true;
            });
            $tmpContent = @mb_convert_encoding($content, 'HTML-ENTITIES', $charset);

            restore_error_handler();

            if (!$hasError) {
                $content = $tmpContent;
            }
        }

        if ('' !== trim($content)) {
            @$dom->loadHTML($content);
        }

        libxml_use_internal_errors($internalErrors);
        libxml_disable_entity_loader($disableEntities);

        $this->addDocument($dom);

        $base = $this->filterXPath('descendant-or-self::base')->extract(array('href'));

        $baseHref = current($base);
        if (count($base) && !empty($baseHref)) {
            if ($this->uri) {
                $linkNode = $dom->createElement('a');
                $linkNode->setAttribute('href', $baseHref);
                $link = new Link($linkNode, $this->uri);
                $this->uri = $link->getUri();
            } else {
                $this->uri = $baseHref;
            }
        }
    }

    /**
     * Adds an XML content to the list of nodes.
     *
     * The libxml errors are disabled when the content is parsed.
     *
     * If you want to get parsing errors, be sure to enable
     * internal errors via libxml_use_internal_errors(true)
     * and then, get the errors via libxml_get_errors(). Be
     * sure to clear errors with libxml_clear_errors() afterward.
     *
     * @param string $content The XML content
     * @param string $charset The charset
     *
     * @api
     */
    public function addXmlContent($content, $charset = 'UTF-8')
    {
        // remove the default namespace if it's the only namespace to make XPath expressions simpler
        if (!preg_match('/xmlns:/', $content)) {
            $content = str_replace('xmlns', 'ns', $content);
        }

        $internalErrors = libxml_use_internal_errors(true);
        $disableEntities = libxml_disable_entity_loader(true);

        $dom = new \DOMDocument('1.0', $charset);
        $dom->validateOnParse = true;

        if ('' !== trim($content)) {
            @$dom->loadXML($content, LIBXML_NONET);
        }

        libxml_use_internal_errors($internalErrors);
        libxml_disable_entity_loader($disableEntities);

        $this->addDocument($dom);
    }

    /**
     * Adds a \DOMDocument to the list of nodes.
     *
     * @param \DOMDocument $dom A \DOMDocument instance
     *
     * @api
     */
    public function addDocument(\DOMDocument $dom)
    {
        if ($dom->documentElement) {
            $this->addNode($dom->documentElement);
        }
    }

    /**
     * Adds a \DOMNodeList to the list of nodes.
     *
     * @param \DOMNodeList $nodes A \DOMNodeList instance
     *
     * @api
     */
    public function addNodeList(\DOMNodeList $nodes)
    {
        foreach ($nodes as $node) {
            $this->addNode($node);
        }
    }

    /**
     * Adds an array of \DOMNode instances to the list of nodes.
     *
     * @param \DOMNode[] $nodes An array of \DOMNode instances
     *
     * @api
     */
    public function addNodes(array $nodes)
    {
        foreach ($nodes as $node) {
            $this->add($node);
        }
    }

    /**
     * Adds a \DOMNode instance to the list of nodes.
     *
     * @param \DOMNode $node A \DOMNode instance
     *
     * @api
     */
    public function addNode(\DOMNode $node)
    {
        if ($node instanceof \DOMDocument) {
            $this->attach($node->documentElement);
        } else {
            $this->attach($node);
        }
    }

    /**
     * Returns a node given its position in the node list.
     *
     * @param integer $position The position
     *
     * @return Crawler A new instance of the Crawler with the selected node, or an empty Crawler if it does not exist.
     *
     * @api
     */
    public function eq($position)
    {
        foreach ($this as $i => $node) {
            if ($i == $position) {
                return new static($node, $this->uri);
            }
        }

        return new static(null, $this->uri);
    }

    /**
     * Calls an anonymous function on each node of the list.
     *
     * The anonymous function receives the position and the node wrapped
     * in a Crawler instance as arguments.
     *
     * Example:
     *
     *     $crawler->filter('h1')->each(function ($node, $i) {
     *         return $node->text();
     *     });
     *
     * @param \Closure $closure An anonymous function
     *
     * @return array An array of values returned by the anonymous function
     *
     * @api
     */
    public function each(\Closure $closure)
    {
        $data = array();
        foreach ($this as $i => $node) {
            $data[] = $closure(new static($node, $this->uri), $i);
        }

        return $data;
    }

    /**
     * Reduces the list of nodes by calling an anonymous function.
     *
     * To remove a node from the list, the anonymous function must return false.
     *
     * @param \Closure $closure An anonymous function
     *
     * @return Crawler A Crawler instance with the selected nodes.
     *
     * @api
     */
    public function reduce(\Closure $closure)
    {
        $nodes = array();
        foreach ($this as $i => $node) {
            if (false !== $closure(new static($node, $this->uri), $i)) {
                $nodes[] = $node;
            }
        }

        return new static($nodes, $this->uri);
    }

    /**
     * Returns the first node of the current selection
     *
     * @return Crawler A Crawler instance with the first selected node
     *
     * @api
     */
    public function first()
    {
        return $this->eq(0);
    }

    /**
     * Returns the last node of the current selection
     *
     * @return Crawler A Crawler instance with the last selected node
     *
     * @api
     */
    public function last()
    {
        return $this->eq(count($this) - 1);
    }

    /**
     * Returns the siblings nodes of the current selection
     *
     * @return Crawler A Crawler instance with the sibling nodes
     *
     * @throws \InvalidArgumentException When current node is empty
     *
     * @api
     */
    public function siblings()
    {
        if (!count($this)) {
            throw new \InvalidArgumentException('The current node list is empty.');
        }

        return new static($this->sibling($this->getNode(0)->parentNode->firstChild), $this->uri);
    }

    /**
     * Returns the next siblings nodes of the current selection
     *
     * @return Crawler A Crawler instance with the next sibling nodes
     *
     * @throws \InvalidArgumentException When current node is empty
     *
     * @api
     */
    public function nextAll()
    {
        if (!count($this)) {
            throw new \InvalidArgumentException('The current node list is empty.');
        }

        return new static($this->sibling($this->getNode(0)), $this->uri);
    }

    /**
     * Returns the previous sibling nodes of the current selection
     *
     * @return Crawler A Crawler instance with the previous sibling nodes
     *
     * @throws \InvalidArgumentException
     *
     * @api
     */
    public function previousAll()
    {
        if (!count($this)) {
            throw new \InvalidArgumentException('The current node list is empty.');
        }

        return new static($this->sibling($this->getNode(0), 'previousSibling'), $this->uri);
    }

    /**
     * Returns the parents nodes of the current selection
     *
     * @return Crawler A Crawler instance with the parents nodes of the current selection
     *
     * @throws \InvalidArgumentException When current node is empty
     *
     * @api
     */
    public function parents()
    {
        if (!count($this)) {
            throw new \InvalidArgumentException('The current node list is empty.');
        }

        $node = $this->getNode(0);
        $nodes = array();

        while ($node = $node->parentNode) {
            if (1 === $node->nodeType && '_root' !== $node->nodeName) {
                $nodes[] = $node;
            }
        }

        return new static($nodes, $this->uri);
    }

    /**
     * Returns the children nodes of the current selection
     *
     * @return Crawler A Crawler instance with the children nodes
     *
     * @throws \InvalidArgumentException When current node is empty
     *
     * @api
     */
    public function children()
    {
        if (!count($this)) {
            throw new \InvalidArgumentException('The current node list is empty.');
        }

        $node = $this->getNode(0)->firstChild;

        return new static($node ? $this->sibling($node) : array(), $this->uri);
    }

    /**
     * Returns the attribute value of the first node of the list.
     *
     * @param string $attribute The attribute name
     *
     * @return string|null The attribute value or null if the attribute does not exist
     *
     * @throws \InvalidArgumentException When current node is empty
     *
     * @api
     */
    public function attr($attribute)
    {
        if (!count($this)) {
            throw new \InvalidArgumentException('The current node list is empty.');
        }

        $node = $this->getNode(0);

        return $node->hasAttribute($attribute) ? $node->getAttribute($attribute) : null;
    }

    /**
     * Returns the node value of the first node of the list.
     *
     * @return string The node value
     *
     * @throws \InvalidArgumentException When current node is empty
     *
     * @api
     */
    public function text()
    {
        if (!count($this)) {
            throw new \InvalidArgumentException('The current node list is empty.');
        }

        return $this->getNode(0)->nodeValue;
    }

    /**
     * Returns the first node of the list as HTML.
     *
     * @return string The node html
     *
     * @throws \InvalidArgumentException When current node is empty
     */
    public function html()
    {
        if (!count($this)) {
            throw new \InvalidArgumentException('The current node list is empty.');
        }

        $html = '';
        foreach ($this->getNode(0)->childNodes as $child) {
            if (version_compare(PHP_VERSION, '5.3.6', '>=')) {
                // node parameter was added to the saveHTML() method in PHP 5.3.6
                // @see http://php.net/manual/en/domdocument.savehtml.php
                $html .= $child->ownerDocument->saveHTML($child);
            } else {
                $document = new \DOMDocument('1.0', 'UTF-8');
                $document->appendChild($document->importNode($child, true));
                $html .= rtrim($document->saveHTML());
            }
        }

        return $html;
    }

    /**
     * Extracts information from the list of nodes.
     *
     * You can extract attributes or/and the node value (_text).
     *
     * Example:
     *
     * $crawler->filter('h1 a')->extract(array('_text', 'href'));
     *
     * @param array $attributes An array of attributes
     *
     * @return array An array of extracted values
     *
     * @api
     */
    public function extract($attributes)
    {
        $attributes = (array) $attributes;
        $count = count($attributes);

        $data = array();
        foreach ($this as $node) {
            $elements = array();
            foreach ($attributes as $attribute) {
                if ('_text' === $attribute) {
                    $elements[] = $node->nodeValue;
                } else {
                    $elements[] = $node->getAttribute($attribute);
                }
            }

            $data[] = $count > 1 ? $elements : $elements[0];
        }

        return $data;
    }

    /**
     * Filters the list of nodes with an XPath expression.
     *
     * @param string $xpath An XPath expression
     *
     * @return Crawler A new instance of Crawler with the filtered list of nodes
     *
     * @api
     */
    public function filterXPath($xpath)
    {
        $document = new \DOMDocument('1.0', 'UTF-8');
        $root = $document->appendChild($document->createElement('_root'));
        foreach ($this as $node) {
            $root->appendChild($document->importNode($node, true));
        }

        $prefixes = $this->findNamespacePrefixes($xpath);
        $domxpath = $this->createDOMXPath($document, $prefixes);

        return new static($domxpath->query($xpath), $this->uri);
    }

    /**
     * Filters the list of nodes with a CSS selector.
     *
     * This method only works if you have installed the CssSelector Symfony Component.
     *
     * @param string $selector A CSS selector
     *
     * @return Crawler A new instance of Crawler with the filtered list of nodes
     *
     * @throws \RuntimeException if the CssSelector Component is not available
     *
     * @api
     */
    public function filter($selector)
    {
        if (!class_exists('Symfony\\Component\\CssSelector\\CssSelector')) {
            // @codeCoverageIgnoreStart
            throw new \RuntimeException('Unable to filter with a CSS selector as the Symfony CssSelector is not installed (you can use filterXPath instead).');
            // @codeCoverageIgnoreEnd
        }

        return $this->filterXPath(CssSelector::toXPath($selector));
    }

    /**
     * Selects links by name or alt value for clickable images.
     *
     * @param string $value The link text
     *
     * @return Crawler A new instance of Crawler with the filtered list of nodes
     *
     * @api
     */
    public function selectLink($value)
    {
        $xpath = sprintf('//a[contains(concat(\' \', normalize-space(string(.)), \' \'), %s)] ', static::xpathLiteral(' '.$value.' ')).
                            sprintf('| //a/img[contains(concat(\' \', normalize-space(string(@alt)), \' \'), %s)]/ancestor::a', static::xpathLiteral(' '.$value.' '));

        return $this->filterXPath($xpath);
    }

    /**
     * Selects a button by name or alt value for images.
     *
     * @param string $value The button text
     *
     * @return Crawler A new instance of Crawler with the filtered list of nodes
     *
     * @api
     */
    public function selectButton($value)
    {
        $xpath = sprintf('//input[((@type="submit" or @type="button") and contains(concat(\' \', normalize-space(string(@value)), \' \'), %s)) ', static::xpathLiteral(' '.$value.' ')).
                         sprintf('or (@type="image" and contains(concat(\' \', normalize-space(string(@alt)), \' \'), %s)) or @id="%s" or @name="%s"] ', static::xpathLiteral(' '.$value.' '), $value, $value).
                         sprintf('| //button[contains(concat(\' \', normalize-space(string(.)), \' \'), %s) or @id="%s" or @name="%s"]', static::xpathLiteral(' '.$value.' '), $value, $value);

        return $this->filterXPath($xpath);
    }

    /**
     * Returns a Link object for the first node in the list.
     *
     * @param string $method The method for the link (get by default)
     *
     * @return Link A Link instance
     *
     * @throws \InvalidArgumentException If the current node list is empty
     *
     * @api
     */
    public function link($method = 'get')
    {
        if (!count($this)) {
            throw new \InvalidArgumentException('The current node list is empty.');
        }

        $node = $this->getNode(0);

        return new Link($node, $this->uri, $method);
    }

    /**
     * Returns an array of Link objects for the nodes in the list.
     *
     * @return Link[] An array of Link instances
     *
     * @api
     */
    public function links()
    {
        $links = array();
        foreach ($this as $node) {
            $links[] = new Link($node, $this->uri, 'get');
        }

        return $links;
    }

    /**
     * Returns a Form object for the first node in the list.
     *
     * @param array  $values An array of values for the form fields
     * @param string $method The method for the form
     *
     * @return Form A Form instance
     *
     * @throws \InvalidArgumentException If the current node list is empty
     *
     * @api
     */
    public function form(array $values = null, $method = null)
    {
        if (!count($this)) {
            throw new \InvalidArgumentException('The current node list is empty.');
        }

        $form = new Form($this->getNode(0), $this->uri, $method);

        if (null !== $values) {
            $form->setValues($values);
        }

        return $form;
    }

    /**
     * Overloads a default namespace prefix to be used with XPath and CSS expressions.
     *
     * @param string $prefix
     */
    public function setDefaultNamespacePrefix($prefix)
    {
        $this->defaultNamespacePrefix = $prefix;
    }

    /**
     * @param string $prefix
     * @param string $namespace
     */
    public function registerNamespace($prefix, $namespace)
    {
        $this->namespaces[$prefix] = $namespace;
    }

    /**
     * Converts string for XPath expressions.
     *
     * Escaped characters are: quotes (") and apostrophe (').
     *
     *  Examples:
     *  <code>
     *     echo Crawler::xpathLiteral('foo " bar');
     *     //prints 'foo " bar'
     *
     *     echo Crawler::xpathLiteral("foo ' bar");
     *     //prints "foo ' bar"
     *
     *     echo Crawler::xpathLiteral('a\'b"c');
     *     //prints concat('a', "'", 'b"c')
     *  </code>
     *
     * @param string $s String to be escaped
     *
     * @return string Converted string
     */
    public static function xpathLiteral($s)
    {
        if (false === strpos($s, "'")) {
            return sprintf("'%s'", $s);
        }

        if (false === strpos($s, '"')) {
            return sprintf('"%s"', $s);
        }

        $string = $s;
        $parts = array();
        while (true) {
            if (false !== $pos = strpos($string, "'")) {
                $parts[] = sprintf("'%s'", substr($string, 0, $pos));
                $parts[] = "\"'\"";
                $string = substr($string, $pos + 1);
            } else {
                $parts[] = "'$string'";
                break;
            }
        }

        return sprintf("concat(%s)", implode($parts, ', '));
    }

    /**
     * @param integer $position
     *
     * @return \DOMElement|null
     */
    public function getNode($position)
    {
        foreach ($this as $i => $node) {
            if ($i == $position) {
                return $node;
            }
        // @codeCoverageIgnoreStart
        }

        return null;
        // @codeCoverageIgnoreEnd
    }

    /**
     * @param \DOMElement $node
     * @param string      $siblingDir
     *
     * @return array
     */
    protected function sibling($node, $siblingDir = 'nextSibling')
    {
        $nodes = array();

        do {
            if ($node !== $this->getNode(0) && $node->nodeType === 1) {
                $nodes[] = $node;
            }
        } while ($node = $node->$siblingDir);

        return $nodes;
    }

    /**
     * @param \DOMDocument $document
     * @param array        $prefixes
     *
     * @return \DOMXPath
     *
     * @throws \InvalidArgumentException
     */
    private function createDOMXPath(\DOMDocument $document, array $prefixes = array())
    {
        $domxpath = new \DOMXPath($document);

        foreach ($prefixes as $prefix) {
            $namespace = $this->discoverNamespace($domxpath, $prefix);
            if (null !== $namespace) {
                $domxpath->registerNamespace($prefix, $namespace);
            }
        }

        return $domxpath;
    }

    /**
     * @param \DOMXPath $domxpath
     * @param string    $prefix
     *
     * @return string
     *
     * @throws \InvalidArgumentException
     */
    private function discoverNamespace(\DOMXPath $domxpath, $prefix)
    {
        if (isset($this->namespaces[$prefix])) {
            return $this->namespaces[$prefix];
        }

        // ask for one namespace, otherwise we'd get a collection with an item for each node
        $namespaces = $domxpath->query(sprintf('(//namespace::*[name()="%s"])[last()]', $this->defaultNamespacePrefix === $prefix ? '' : $prefix));

        if ($node = $namespaces->item(0)) {
            return $node->nodeValue;
        }
    }

    /**
     * @param $xpath
     *
     * @return array
     */
    private function findNamespacePrefixes($xpath)
    {
        if (preg_match_all('/(?P<prefix>[a-z_][a-z_0-9\-\.]*):[^"\/]/i', $xpath, $matches)) {
            return array_unique($matches['prefix']);
        }

        return array();
    }
}
PKx_�\�	Y[$[$;pear/Symfony/Component/DomCrawler/Field/ChoiceFormField.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Field;

/**
 * ChoiceFormField represents a choice form field.
 *
 * It is constructed from a HTML select tag, or a HTML checkbox, or radio inputs.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ChoiceFormField extends FormField
{
    /**
     * @var string
     */
    private $type;
    /**
     * @var Boolean
     */
    private $multiple;
    /**
     * @var array
     */
    private $options;
    /**
     * @var boolean
     */
    private $validationDisabled = false;

    /**
     * Returns true if the field should be included in the submitted values.
     *
     * @return Boolean true if the field should be included in the submitted values, false otherwise
     */
    public function hasValue()
    {
        // don't send a value for unchecked checkboxes
        if (in_array($this->type, array('checkbox', 'radio')) && null === $this->value) {
            return false;
        }

        return true;
    }

    /**
     * Check if the current selected option is disabled
     *
     * @return Boolean
     */
    public function isDisabled()
    {
        foreach ($this->options as $option) {
            if ($option['value'] == $this->value && $option['disabled']) {
                return true;
            }
        }

        return false;
    }

    /**
     * Sets the value of the field.
     *
     * @param string $value The value of the field
     *
     * @api
     */
    public function select($value)
    {
        $this->setValue($value);
    }

    /**
     * Ticks a checkbox.
     *
     * @throws \LogicException When the type provided is not correct
     *
     * @api
     */
    public function tick()
    {
        if ('checkbox' !== $this->type) {
            throw new \LogicException(sprintf('You cannot tick "%s" as it is not a checkbox (%s).', $this->name, $this->type));
        }

        $this->setValue(true);
    }

    /**
     * Ticks a checkbox.
     *
     * @throws \LogicException When the type provided is not correct
     *
     * @api
     */
    public function untick()
    {
        if ('checkbox' !== $this->type) {
            throw new \LogicException(sprintf('You cannot tick "%s" as it is not a checkbox (%s).', $this->name, $this->type));
        }

        $this->setValue(false);
    }

    /**
     * Sets the value of the field.
     *
     * @param string $value The value of the field
     *
     * @throws \InvalidArgumentException When value type provided is not correct
     */
    public function setValue($value)
    {
        if ('checkbox' == $this->type && false === $value) {
            // uncheck
            $this->value = null;
        } elseif ('checkbox' == $this->type && true === $value) {
            // check
            $this->value = $this->options[0]['value'];
        } else {
            if (is_array($value)) {
                if (!$this->multiple) {
                    throw new \InvalidArgumentException(sprintf('The value for "%s" cannot be an array.', $this->name));
                }

                foreach ($value as $v) {
                    if (!$this->containsOption($v, $this->options)) {
                        throw new \InvalidArgumentException(sprintf('Input "%s" cannot take "%s" as a value (possible values: %s).', $this->name, $v, implode(', ', $this->availableOptionValues())));
                    }
                }
            } elseif (!$this->containsOption($value, $this->options)) {
                throw new \InvalidArgumentException(sprintf('Input "%s" cannot take "%s" as a value (possible values: %s).', $this->name, $value, implode(', ', $this->availableOptionValues())));
            }

            if ($this->multiple) {
                $value = (array) $value;
            }

            if (is_array($value)) {
                $this->value = $value;
            } else {
                parent::setValue($value);
            }
        }
    }

    /**
     * Adds a choice to the current ones.
     *
     * This method should only be used internally.
     *
     * @param \DOMNode $node A \DOMNode
     *
     * @throws \LogicException When choice provided is not multiple nor radio
     */
    public function addChoice(\DOMNode $node)
    {
        if (!$this->multiple && 'radio' != $this->type) {
            throw new \LogicException(sprintf('Unable to add a choice for "%s" as it is not multiple or is not a radio button.', $this->name));
        }

        $option = $this->buildOptionValue($node);
        $this->options[] = $option;

        if ($node->getAttribute('checked')) {
            $this->value = $option['value'];
        }
    }

    /**
     * Returns the type of the choice field (radio, select, or checkbox).
     *
     * @return string The type
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * Returns true if the field accepts multiple values.
     *
     * @return Boolean true if the field accepts multiple values, false otherwise
     */
    public function isMultiple()
    {
        return $this->multiple;
    }

    /**
     * Initializes the form field.
     *
     * @throws \LogicException When node type is incorrect
     */
    protected function initialize()
    {
        if ('input' != $this->node->nodeName && 'select' != $this->node->nodeName) {
            throw new \LogicException(sprintf('A ChoiceFormField can only be created from an input or select tag (%s given).', $this->node->nodeName));
        }

        if ('input' == $this->node->nodeName && 'checkbox' != $this->node->getAttribute('type') && 'radio' != $this->node->getAttribute('type')) {
            throw new \LogicException(sprintf('A ChoiceFormField can only be created from an input tag with a type of checkbox or radio (given type is %s).', $this->node->getAttribute('type')));
        }

        $this->value = null;
        $this->options = array();
        $this->multiple = false;

        if ('input' == $this->node->nodeName) {
            $this->type = $this->node->getAttribute('type');
            $optionValue = $this->buildOptionValue($this->node);
            $this->options[] = $optionValue;

            if ($this->node->getAttribute('checked')) {
                $this->value = $optionValue['value'];
            }
        } else {
            $this->type = 'select';
            if ($this->node->hasAttribute('multiple')) {
                $this->multiple = true;
                $this->value = array();
                $this->name = str_replace('[]', '', $this->name);
            }

            $found = false;
            foreach ($this->xpath->query('descendant::option', $this->node) as $option) {
                $this->options[] = $this->buildOptionValue($option);

                if ($option->getAttribute('selected')) {
                    $found = true;
                    if ($this->multiple) {
                        $this->value[] = $option->getAttribute('value');
                    } else {
                        $this->value = $option->getAttribute('value');
                    }
                }
            }

            // if no option is selected and if it is a simple select box, take the first option as the value
            $option = $this->xpath->query('descendant::option', $this->node)->item(0);
            if (!$found && !$this->multiple && $option instanceof \DOMElement) {
                $this->value = $option->getAttribute('value');
            }
        }
    }

    /**
     * Returns option value with associated disabled flag
     *
     * @param \DOMNode $node
     *
     * @return array
     */
    private function buildOptionValue($node)
    {
        $option = array();

        $defaultValue = (isset($node->nodeValue) && !empty($node->nodeValue)) ? $node->nodeValue : '1';
        $option['value'] = $node->hasAttribute('value') ? $node->getAttribute('value') : $defaultValue;
        $option['disabled'] = ($node->hasAttribute('disabled') && $node->getAttribute('disabled') == 'disabled');

        return $option;
    }

    /**
     * Checks whether given vale is in the existing options
     *
     * @param string $optionValue
     * @param array  $options
     *
     * @return bool
     */
    public function containsOption($optionValue, $options)
    {
        if ($this->validationDisabled) {
            return true;
        }

        foreach ($options as $option) {
            if ($option['value'] == $optionValue) {
                return true;
            }
        }

        return false;
    }

    /**
     * Returns list of available field options
     *
     * @return array
     */
    public function availableOptionValues()
    {
        $values = array();

        foreach ($this->options as $option) {
            $values[] = $option['value'];
        }

        return $values;
    }

    /**
     * Disables the internal validation of the field.
     *
     * @return self
     */
    public function disableValidation()
    {
        $this->validationDisabled = true;

        return $this;
    }
}
PKy_�\\Ud��	�	5pear/Symfony/Component/DomCrawler/Field/FormField.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Field;

/**
 * FormField is the abstract class for all form fields.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class FormField
{
    /**
     * @var \DOMNode
     */
    protected $node;
    /**
     * @var string
     */
    protected $name;
    /**
     * @var string
     */
    protected $value;
    /**
     * @var \DOMDocument
     */
    protected $document;
    /**
     * @var \DOMXPath
     */
    protected $xpath;
    /**
     * @var Boolean
     */
    protected $disabled;

    /**
     * Constructor.
     *
     * @param \DOMNode $node The node associated with this field
     */
    public function __construct(\DOMNode $node)
    {
        $this->node = $node;
        $this->name = $node->getAttribute('name');

        $this->document = new \DOMDocument('1.0', 'UTF-8');
        $this->node = $this->document->importNode($this->node, true);

        $root = $this->document->appendChild($this->document->createElement('_root'));
        $root->appendChild($this->node);
        $this->xpath = new \DOMXPath($this->document);

        $this->initialize();
    }

    /**
     * Returns the name of the field.
     *
     * @return string The name of the field
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Gets the value of the field.
     *
     * @return string|array The value of the field
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * Sets the value of the field.
     *
     * @param string $value The value of the field
     *
     * @api
     */
    public function setValue($value)
    {
        $this->value = (string) $value;
    }

    /**
     * Returns true if the field should be included in the submitted values.
     *
     * @return Boolean true if the field should be included in the submitted values, false otherwise
     */
    public function hasValue()
    {
        return true;
    }

    /**
     * Check if the current field is disabled
     *
     * @return Boolean
     */
    public function isDisabled()
    {
        return $this->node->hasAttribute('disabled');
    }

    /**
     * Initializes the form field.
     */
    abstract protected function initialize();
}
PKy_�\�����:pear/Symfony/Component/DomCrawler/Field/InputFormField.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Field;

/**
 * InputFormField represents an input form field (an HTML input tag).
 *
 * For inputs with type of file, checkbox, or radio, there are other more
 * specialized classes (cf. FileFormField and ChoiceFormField).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class InputFormField extends FormField
{
    /**
     * Initializes the form field.
     *
     * @throws \LogicException When node type is incorrect
     */
    protected function initialize()
    {
        if ('input' != $this->node->nodeName && 'button' != $this->node->nodeName) {
            throw new \LogicException(sprintf('An InputFormField can only be created from an input or button tag (%s given).', $this->node->nodeName));
        }

        if ('checkbox' == $this->node->getAttribute('type')) {
            throw new \LogicException('Checkboxes should be instances of ChoiceFormField.');
        }

        if ('file' == $this->node->getAttribute('type')) {
            throw new \LogicException('File inputs should be instances of FileFormField.');
        }

        $this->value = $this->node->getAttribute('value');
    }
}
PKz_�\bڋvB
B
9pear/Symfony/Component/DomCrawler/Field/FileFormField.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Field;

/**
 * FileFormField represents a file form field (an HTML file input tag).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class FileFormField extends FormField
{
    /**
     * Sets the PHP error code associated with the field.
     *
     * @param integer $error The error code (one of UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE, UPLOAD_ERR_PARTIAL, UPLOAD_ERR_NO_FILE, UPLOAD_ERR_NO_TMP_DIR, UPLOAD_ERR_CANT_WRITE, or UPLOAD_ERR_EXTENSION)
     *
     * @throws \InvalidArgumentException When error code doesn't exist
     */
    public function setErrorCode($error)
    {
        $codes = array(UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_FORM_SIZE, UPLOAD_ERR_PARTIAL, UPLOAD_ERR_NO_FILE, UPLOAD_ERR_NO_TMP_DIR, UPLOAD_ERR_CANT_WRITE, UPLOAD_ERR_EXTENSION);
        if (!in_array($error, $codes)) {
            throw new \InvalidArgumentException(sprintf('The error code %s is not valid.', $error));
        }

        $this->value = array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => $error, 'size' => 0);
    }

    /**
     * Sets the value of the field.
     *
     * @param string $value The value of the field
     *
     * @api
     */
    public function upload($value)
    {
        $this->setValue($value);
    }

    /**
     * Sets the value of the field.
     *
     * @param string $value The value of the field
     */
    public function setValue($value)
    {
        if (null !== $value && is_readable($value)) {
            $error = UPLOAD_ERR_OK;
            $size = filesize($value);
            $info = pathinfo($value);
            $name = $info['basename'];

            // copy to a tmp location
            $tmp = sys_get_temp_dir().'/'.sha1(uniqid(mt_rand(), true));
            if (array_key_exists('extension', $info)) {
                $tmp .= '.'.$info['extension'];
            }
            if (is_file($tmp)) {
                unlink($tmp);
            }
            copy($value, $tmp);
            $value = $tmp;
        } else {
            $error = UPLOAD_ERR_NO_FILE;
            $size = 0;
            $name = '';
            $value = '';
        }

        $this->value = array('name' => $name, 'type' => '', 'tmp_name' => $value, 'error' => $error, 'size' => $size);
    }

    /**
     * Sets path to the file as string for simulating HTTP request
     *
     * @param string $path The path to the file
     */
    public function setFilePath($path)
    {
        parent::setValue($path);
    }

    /**
     * Initializes the form field.
     *
     * @throws \LogicException When node type is incorrect
     */
    protected function initialize()
    {
        if ('input' != $this->node->nodeName) {
            throw new \LogicException(sprintf('A FileFormField can only be created from an input tag (%s given).', $this->node->nodeName));
        }

        if ('file' != $this->node->getAttribute('type')) {
            throw new \LogicException(sprintf('A FileFormField can only be created from an input tag with a type of file (given type is %s).', $this->node->getAttribute('type')));
        }

        $this->setValue(null);
    }
}
PKz_�\
ʀ���=pear/Symfony/Component/DomCrawler/Field/TextareaFormField.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Field;

/**
 * TextareaFormField represents a textarea form field (an HTML textarea tag).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class TextareaFormField extends FormField
{
    /**
     * Initializes the form field.
     *
     * @throws \LogicException When node type is incorrect
     */
    protected function initialize()
    {
        if ('textarea' != $this->node->nodeName) {
            throw new \LogicException(sprintf('A TextareaFormField can only be created from a textarea tag (%s given).', $this->node->nodeName));
        }

        $this->value = null;
        foreach ($this->node->childNodes as $node) {
            $this->value .= $node->wholeText;
        }
    }
}
PKz_�\��V<nn7pear/Symfony/Component/DomCrawler/FormFieldRegistry.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler;

use Symfony\Component\DomCrawler\Field\FormField;

/**
 * This is an internal class that must not be used directly.
 */
class FormFieldRegistry
{
    private $fields = array();

    private $base;

    /**
     * Adds a field to the registry.
     *
     * @param FormField $field The field
     *
     * @throws \InvalidArgumentException when the name is malformed
     */
    public function add(FormField $field)
    {
        $segments = $this->getSegments($field->getName());

        $target =& $this->fields;
        while ($segments) {
            if (!is_array($target)) {
                $target = array();
            }
            $path = array_shift($segments);
            if ('' === $path) {
                $target =& $target[];
            } else {
                $target =& $target[$path];
            }
        }
        $target = $field;
    }

    /**
     * Removes a field and its children from the registry.
     *
     * @param string $name The fully qualified name of the base field
     *
     * @throws \InvalidArgumentException when the name is malformed
     */
    public function remove($name)
    {
        $segments = $this->getSegments($name);
        $target =& $this->fields;
        while (count($segments) > 1) {
            $path = array_shift($segments);
            if (!array_key_exists($path, $target)) {
                return;
            }
            $target =& $target[$path];
        }
        unset($target[array_shift($segments)]);
    }

    /**
     * Returns the value of the field and its children.
     *
     * @param string $name The fully qualified name of the field
     *
     * @return mixed The value of the field
     *
     * @throws \InvalidArgumentException when the name is malformed
     * @throws \InvalidArgumentException if the field does not exist
     */
    public function &get($name)
    {
        $segments = $this->getSegments($name);
        $target =& $this->fields;
        while ($segments) {
            $path = array_shift($segments);
            if (!array_key_exists($path, $target)) {
                throw new \InvalidArgumentException(sprintf('Unreachable field "%s"', $path));
            }
            $target =& $target[$path];
        }

        return $target;
    }

    /**
     * Tests whether the form has the given field.
     *
     * @param string $name The fully qualified name of the field
     *
     * @return Boolean Whether the form has the given field
     */
    public function has($name)
    {
        try {
            $this->get($name);

            return true;
        } catch (\InvalidArgumentException $e) {
            return false;
        }
    }

    /**
     * Set the value of a field and its children.
     *
     * @param string $name  The fully qualified name of the field
     * @param mixed  $value The value
     *
     * @throws \InvalidArgumentException when the name is malformed
     * @throws \InvalidArgumentException if the field does not exist
     */
    public function set($name, $value)
    {
        $target =& $this->get($name);
        if (!is_array($value) || $target instanceof Field\ChoiceFormField) {
            $target->setValue($value);
        } else {
            $fields = self::create($name, $value);
            foreach ($fields->all() as $k => $v) {
                $this->set($k, $v);
            }
        }
    }

    /**
     * Returns the list of field with their value.
     *
     * @return array The list of fields as array((string) Fully qualified name => (mixed) value)
     */
    public function all()
    {
        return $this->walk($this->fields, $this->base);
    }

    /**
     * Creates an instance of the class.
     *
     * This function is made private because it allows overriding the $base and
     * the $values properties without any type checking.
     *
     * @param string $base   The fully qualified name of the base field
     * @param array  $values The values of the fields
     *
     * @return FormFieldRegistry
     */
    private static function create($base, array $values)
    {
        $registry = new static();
        $registry->base = $base;
        $registry->fields = $values;

        return $registry;
    }

    /**
     * Transforms a PHP array in a list of fully qualified name / value.
     *
     * @param array  $array  The PHP array
     * @param string $base   The name of the base field
     * @param array  $output The initial values
     *
     * @return array The list of fields as array((string) Fully qualified name => (mixed) value)
     */
    private function walk(array $array, $base = '', array &$output = array())
    {
        foreach ($array as $k => $v) {
            $path = empty($base) ? $k : sprintf("%s[%s]", $base, $k);
            if (is_array($v)) {
                $this->walk($v, $path, $output);
            } else {
                $output[$path] = $v;
            }
        }

        return $output;
    }

    /**
     * Splits a field name into segments as a web browser would do.
     *
     * <code>
     *     getSegments('base[foo][3][]') = array('base', 'foo, '3', '');
     * </code>
     *
     * @param string $name The name of the field
     *
     * @return array The list of segments
     *
     * @throws \InvalidArgumentException when the name is malformed
     */
    private function getSegments($name)
    {
        if (preg_match('/^(?P<base>[^[]+)(?P<extra>(\[.*)|$)/', $name, $m)) {
            $segments = array($m['base']);
            while (!empty($m['extra'])) {
                if (preg_match('/^\[(?P<segment>.*?)\](?P<extra>.*)$/', $m['extra'], $m)) {
                    $segments[] = $m['segment'];
                } else {
                    throw new \InvalidArgumentException(sprintf('Malformed field path "%s"', $name));
                }
            }

            return $segments;
        }

        throw new \InvalidArgumentException(sprintf('Malformed field path "%s"', $name));
    }
}
PK{_�\Lo�TT0pear/Symfony/Component/DomCrawler/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\DomCrawler\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK{_�\�
�H7H7*pear/Symfony/Component/DomCrawler/Form.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler;

use Symfony\Component\DomCrawler\Field\FormField;

/**
 * Form represents an HTML form.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Form extends Link implements \ArrayAccess
{
    /**
     * @var \DOMNode
     */
    private $button;

    /**
     * @var Field\FormField[]
     */
    private $fields;

    /**
     * Constructor.
     *
     * @param \DOMNode $node       A \DOMNode instance
     * @param string   $currentUri The URI of the page where the form is embedded
     * @param string   $method     The method to use for the link (if null, it defaults to the method defined by the form)
     *
     * @throws \LogicException if the node is not a button inside a form tag
     *
     * @api
     */
    public function __construct(\DOMNode $node, $currentUri, $method = null)
    {
        parent::__construct($node, $currentUri, $method);

        $this->initialize();
    }

    /**
     * Gets the form node associated with this form.
     *
     * @return \DOMNode A \DOMNode instance
     */
    public function getFormNode()
    {
        return $this->node;
    }

    /**
     * Sets the value of the fields.
     *
     * @param array $values An array of field values
     *
     * @return Form
     *
     * @api
     */
    public function setValues(array $values)
    {
        foreach ($values as $name => $value) {
            $this->fields->set($name, $value);
        }

        return $this;
    }

    /**
     * Gets the field values.
     *
     * The returned array does not include file fields (@see getFiles).
     *
     * @return array An array of field values.
     *
     * @api
     */
    public function getValues()
    {
        $values = array();
        foreach ($this->fields->all() as $name => $field) {
            if ($field->isDisabled()) {
                continue;
            }

            if (!$field instanceof Field\FileFormField && $field->hasValue()) {
                $values[$name] = $field->getValue();
            }
        }

        return $values;
    }

    /**
     * Gets the file field values.
     *
     * @return array An array of file field values.
     *
     * @api
     */
    public function getFiles()
    {
        if (!in_array($this->getMethod(), array('POST', 'PUT', 'DELETE', 'PATCH'))) {
            return array();
        }

        $files = array();

        foreach ($this->fields->all() as $name => $field) {
            if ($field->isDisabled()) {
                continue;
            }

            if ($field instanceof Field\FileFormField) {
                $files[$name] = $field->getValue();
            }
        }

        return $files;
    }

    /**
     * Gets the field values as PHP.
     *
     * This method converts fields with the array notation
     * (like foo[bar] to arrays) like PHP does.
     *
     * @return array An array of field values.
     *
     * @api
     */
    public function getPhpValues()
    {
        $values = array();
        foreach ($this->getValues() as $name => $value) {
            $qs = http_build_query(array($name => $value), '', '&');
            parse_str($qs, $expandedValue);
            $varName = substr($name, 0, strlen(key($expandedValue)));
            $values = array_replace_recursive($values, array($varName => current($expandedValue)));
        }

        return $values;
    }

    /**
     * Gets the file field values as PHP.
     *
     * This method converts fields with the array notation
     * (like foo[bar] to arrays) like PHP does.
     *
     * @return array An array of field values.
     *
     * @api
     */
    public function getPhpFiles()
    {
        $values = array();
        foreach ($this->getFiles() as $name => $value) {
            $qs = http_build_query(array($name => $value), '', '&');
            parse_str($qs, $expandedValue);
            $varName = substr($name, 0, strlen(key($expandedValue)));
            $values = array_replace_recursive($values, array($varName => current($expandedValue)));
        }

        return $values;
    }

    /**
     * Gets the URI of the form.
     *
     * The returned URI is not the same as the form "action" attribute.
     * This method merges the value if the method is GET to mimics
     * browser behavior.
     *
     * @return string The URI
     *
     * @api
     */
    public function getUri()
    {
        $uri = parent::getUri();

        if (!in_array($this->getMethod(), array('POST', 'PUT', 'DELETE', 'PATCH')) && $queryString = http_build_query($this->getValues(), null, '&')) {
            $sep = false === strpos($uri, '?') ? '?' : '&';
            $uri .= $sep.$queryString;
        }

        return $uri;
    }

    protected function getRawUri()
    {
        return $this->node->getAttribute('action');
    }

    /**
     * Gets the form method.
     *
     * If no method is defined in the form, GET is returned.
     *
     * @return string The method
     *
     * @api
     */
    public function getMethod()
    {
        if (null !== $this->method) {
            return $this->method;
        }

        return $this->node->getAttribute('method') ? strtoupper($this->node->getAttribute('method')) : 'GET';
    }

    /**
     * Returns true if the named field exists.
     *
     * @param string $name The field name
     *
     * @return Boolean true if the field exists, false otherwise
     *
     * @api
     */
    public function has($name)
    {
        return $this->fields->has($name);
    }

    /**
     * Removes a field from the form.
     *
     * @param string $name The field name
     *
     * @throws \InvalidArgumentException when the name is malformed
     *
     * @api
     */
    public function remove($name)
    {
        $this->fields->remove($name);
    }

    /**
     * Gets a named field.
     *
     * @param string $name The field name
     *
     * @return FormField The field instance
     *
     * @throws \InvalidArgumentException When field is not present in this form
     *
     * @api
     */
    public function get($name)
    {
        return $this->fields->get($name);
    }

    /**
     * Sets a named field.
     *
     * @param FormField $field The field
     *
     * @api
     */
    public function set(FormField $field)
    {
        $this->fields->add($field);
    }

    /**
     * Gets all fields.
     *
     * @return FormField[] An array of fields
     *
     * @api
     */
    public function all()
    {
        return $this->fields->all();
    }

    /**
     * Returns true if the named field exists.
     *
     * @param string $name The field name
     *
     * @return Boolean true if the field exists, false otherwise
     */
    public function offsetExists($name)
    {
        return $this->has($name);
    }

    /**
     * Gets the value of a field.
     *
     * @param string $name The field name
     *
     * @return FormField The associated Field instance
     *
     * @throws \InvalidArgumentException if the field does not exist
     */
    public function offsetGet($name)
    {
        return $this->fields->get($name);
    }

    /**
     * Sets the value of a field.
     *
     * @param string       $name  The field name
     * @param string|array $value The value of the field
     *
     * @throws \InvalidArgumentException if the field does not exist
     */
    public function offsetSet($name, $value)
    {
        $this->fields->set($name, $value);
    }

    /**
     * Removes a field from the form.
     *
     * @param string $name The field name
     */
    public function offsetUnset($name)
    {
        $this->fields->remove($name);
    }

    /**
     * Disables validation
     *
     * @return self
     */
    public function disableValidation()
    {
        foreach ($this->fields->all() as $field) {
            if ($field instanceof Field\ChoiceFormField) {
                $field->disableValidation();
            }
        }

        return $this;
    }

    /**
     * Sets the node for the form.
     *
     * Expects a 'submit' button \DOMNode and finds the corresponding form element.
     *
     * @param \DOMNode $node A \DOMNode instance
     *
     * @throws \LogicException If given node is not a button or input or does not have a form ancestor
     */
    protected function setNode(\DOMNode $node)
    {
        $this->button = $node;
        if ('button' == $node->nodeName || ('input' == $node->nodeName && in_array($node->getAttribute('type'), array('submit', 'button', 'image')))) {
            if ($node->hasAttribute('form')) {
                // if the node has the HTML5-compliant 'form' attribute, use it
                $formId = $node->getAttribute('form');
                $form = $node->ownerDocument->getElementById($formId);
                if (null === $form) {
                    throw new \LogicException(sprintf('The selected node has an invalid form attribute (%s).', $formId));
                }
                $this->node = $form;

                return;
            }
            // we loop until we find a form ancestor
            do {
                if (null === $node = $node->parentNode) {
                    throw new \LogicException('The selected node does not have a form ancestor.');
                }
            } while ('form' != $node->nodeName);
        } elseif ('form' != $node->nodeName) {
            throw new \LogicException(sprintf('Unable to submit on a "%s" tag.', $node->nodeName));
        }

        $this->node = $node;
    }

    /**
     * Adds form elements related to this form.
     *
     * Creates an internal copy of the submitted 'button' element and
     * the form node or the entire document depending on whether we need
     * to find non-descendant elements through HTML5 'form' attribute.
     */
    private function initialize()
    {
        $this->fields = new FormFieldRegistry();

        $document = new \DOMDocument('1.0', 'UTF-8');
        $xpath = new \DOMXPath($document);
        $root = $document->appendChild($document->createElement('_root'));

        // add submitted button if it has a valid name
        if ('form' !== $this->button->nodeName && $this->button->hasAttribute('name') && $this->button->getAttribute('name')) {
            if ('input' == $this->button->nodeName && 'image' == $this->button->getAttribute('type')) {
                $name = $this->button->getAttribute('name');
                $this->button->setAttribute('value', '0');

                // temporarily change the name of the input node for the x coordinate
                $this->button->setAttribute('name', $name.'.x');
                $this->set(new Field\InputFormField($document->importNode($this->button, true)));

                // temporarily change the name of the input node for the y coordinate
                $this->button->setAttribute('name', $name.'.y');
                $this->set(new Field\InputFormField($document->importNode($this->button, true)));

                // restore the original name of the input node
                $this->button->setAttribute('name', $name);
            } else {
                $this->set(new Field\InputFormField($document->importNode($this->button, true)));
            }
        }

        // find form elements corresponding to the current form
        if ($this->node->hasAttribute('id')) {
            // traverse through the whole document
            $node = $document->importNode($this->node->ownerDocument->documentElement, true);
            $root->appendChild($node);

            // corresponding elements are either descendants or have a matching HTML5 form attribute
            $formId = Crawler::xpathLiteral($this->node->getAttribute('id'));
            $fieldNodes = $xpath->query(sprintf('descendant::input[@form=%s] | descendant::button[@form=%s] | descendant::textarea[@form=%s] | descendant::select[@form=%s] | //form[@id=%s]//input[not(@form)] | //form[@id=%s]//button[not(@form)] | //form[@id=%s]//textarea[not(@form)] | //form[@id=%s]//select[not(@form)]', $formId, $formId, $formId, $formId, $formId, $formId, $formId, $formId), $root);
            foreach ($fieldNodes as $node) {
                $this->addField($node);
            }
        } else {
            // parent form has no id, add descendant elements only
            $node = $document->importNode($this->node, true);
            $root->appendChild($node);

            // descendant elements with form attribute are not part of this form
            $fieldNodes = $xpath->query('descendant::input[not(@form)] | descendant::button[not(@form)] | descendant::textarea[not(@form)] | descendant::select[not(@form)]', $root);
            foreach ($fieldNodes as $node) {
                $this->addField($node);
            }
        }
    }

    private function addField(\DOMNode $node)
    {
        if (!$node->hasAttribute('name') || !$node->getAttribute('name')) {
            return;
        }

        $nodeName = $node->nodeName;
        if ('select' == $nodeName || 'input' == $nodeName && 'checkbox' == $node->getAttribute('type')) {
            $this->set(new Field\ChoiceFormField($node));
        } elseif ('input' == $nodeName && 'radio' == $node->getAttribute('type')) {
            if ($this->has($node->getAttribute('name'))) {
                $this->get($node->getAttribute('name'))->addChoice($node);
            } else {
                $this->set(new Field\ChoiceFormField($node));
            }
        } elseif ('input' == $nodeName && 'file' == $node->getAttribute('type')) {
            $this->set(new Field\FileFormField($node));
        } elseif ('input' == $nodeName && !in_array($node->getAttribute('type'), array('submit', 'button', 'image'))) {
            $this->set(new Field\InputFormField($node));
        } elseif ('textarea' == $nodeName) {
            $this->set(new Field\TextareaFormField($node));
        }
    }
}
PK|_�\���*pear/Symfony/Component/DomCrawler/Link.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler;

/**
 * Link represents an HTML link (an HTML a or area tag).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Link
{
    /**
     * @var \DOMNode A \DOMNode instance
     */
    protected $node;
    /**
     * @var string The method to use for the link
     */
    protected $method;
    /**
     * @var string The URI of the page where the link is embedded (or the base href)
     */
    protected $currentUri;

    /**
     * Constructor.
     *
     * @param \DOMNode $node       A \DOMNode instance
     * @param string   $currentUri The URI of the page where the link is embedded (or the base href)
     * @param string   $method     The method to use for the link (get by default)
     *
     * @throws \InvalidArgumentException if the node is not a link
     *
     * @api
     */
    public function __construct(\DOMNode $node, $currentUri, $method = 'GET')
    {
        if (!in_array(strtolower(substr($currentUri, 0, 4)), array('http', 'file'))) {
            throw new \InvalidArgumentException(sprintf('Current URI must be an absolute URL ("%s").', $currentUri));
        }

        $this->setNode($node);
        $this->method = $method ? strtoupper($method) : null;
        $this->currentUri = $currentUri;
    }

    /**
     * Gets the node associated with this link.
     *
     * @return \DOMNode A \DOMNode instance
     */
    public function getNode()
    {
        return $this->node;
    }

    /**
     * Gets the method associated with this link.
     *
     * @return string The method
     *
     * @api
     */
    public function getMethod()
    {
        return $this->method;
    }

    /**
     * Gets the URI associated with this link.
     *
     * @return string The URI
     *
     * @api
     */
    public function getUri()
    {
        $uri = trim($this->getRawUri());

        // absolute URL?
        if (null !== parse_url($uri, PHP_URL_SCHEME)) {
            return $uri;
        }

        // empty URI
        if (!$uri) {
            return $this->currentUri;
        }

        // only an anchor
        if ('#' === $uri[0]) {
            $baseUri = $this->currentUri;
            if (false !== $pos = strpos($baseUri, '#')) {
                $baseUri = substr($baseUri, 0, $pos);
            }

            return $baseUri.$uri;
        }

        // only a query string
        if ('?' === $uri[0]) {
            $baseUri = $this->currentUri;

            // remove the query string from the current URI
            if (false !== $pos = strpos($baseUri, '?')) {
                $baseUri = substr($baseUri, 0, $pos);
            }

            return $baseUri.$uri;
        }

        // absolute URL with relative schema
        if (0 === strpos($uri, '//')) {
            return preg_replace('#^([^/]*)//.*$#', '$1', $this->currentUri).$uri;
        }

        $baseUri = preg_replace('#^(.*?//[^/]*)(?:\/.*)?$#', '$1', $this->currentUri);

        // absolute path
        if ('/' === $uri[0]) {
            return $baseUri.$uri;
        }

        // relative path
        $path = parse_url(substr($this->currentUri, strlen($baseUri)), PHP_URL_PATH);
        $path = $this->canonicalizePath(substr($path, 0, strrpos($path, '/')).'/'.$uri);

        return $baseUri.('' === $path || '/' !== $path[0] ? '/' : '').$path;
    }

    /**
     * Returns raw URI data.
     *
     * @return string
     */
    protected function getRawUri()
    {
        return $this->node->getAttribute('href');
    }

    /**
     * Returns the canonicalized URI path (see RFC 3986, section 5.2.4)
     *
     * @param string $path URI path
     *
     * @return string
     */
    protected function canonicalizePath($path)
    {
        if ('' === $path || '/' === $path) {
            return $path;
        }

        if ('.' === substr($path, -1)) {
            $path = $path.'/';
        }

        $output = array();

        foreach (explode('/', $path) as $segment) {
            if ('..' === $segment) {
                array_pop($output);
            } elseif ('.' !== $segment) {
                array_push($output, $segment);
            }
        }

        return implode('/', $output);
    }

    /**
     * Sets current \DOMNode instance.
     *
     * @param \DOMNode $node A \DOMNode instance
     *
     * @throws \LogicException If given node is not an anchor
     */
    protected function setNode(\DOMNode $node)
    {
        if ('a' != $node->nodeName && 'area' != $node->nodeName) {
            throw new \LogicException(sprintf('Unable to click on a "%s" tag.', $node->nodeName));
        }

        $this->node = $node;
    }
}
PK|_�\|,{Ȫ�2pear/Symfony/Component/Routing/RouteCollection.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing;

use Symfony\Component\Config\Resource\ResourceInterface;

/**
 * A RouteCollection represents a set of Route instances.
 *
 * When adding a route at the end of the collection, an existing route
 * with the same name is removed first. So there can only be one route
 * with a given name.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 *
 * @api
 */
class RouteCollection implements \IteratorAggregate, \Countable
{
    /**
     * @var Route[]
     */
    private $routes = array();

    /**
     * @var array
     */
    private $resources = array();

    public function __clone()
    {
        foreach ($this->routes as $name => $route) {
            $this->routes[$name] = clone $route;
        }
    }

    /**
     * Gets the current RouteCollection as an Iterator that includes all routes.
     *
     * It implements \IteratorAggregate.
     *
     * @see all()
     *
     * @return \ArrayIterator An \ArrayIterator object for iterating over routes
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->routes);
    }

    /**
     * Gets the number of Routes in this collection.
     *
     * @return int The number of routes
     */
    public function count()
    {
        return count($this->routes);
    }

    /**
     * Adds a route.
     *
     * @param string $name  The route name
     * @param Route  $route A Route instance
     *
     * @api
     */
    public function add($name, Route $route)
    {
        unset($this->routes[$name]);

        $this->routes[$name] = $route;
    }

    /**
     * Returns all routes in this collection.
     *
     * @return Route[] An array of routes
     */
    public function all()
    {
        return $this->routes;
    }

    /**
     * Gets a route by name.
     *
     * @param string $name The route name
     *
     * @return Route|null A Route instance or null when not found
     */
    public function get($name)
    {
        return isset($this->routes[$name]) ? $this->routes[$name] : null;
    }

    /**
     * Removes a route or an array of routes by name from the collection
     *
     * @param string|array $name The route name or an array of route names
     */
    public function remove($name)
    {
        foreach ((array) $name as $n) {
            unset($this->routes[$n]);
        }
    }

    /**
     * Adds a route collection at the end of the current set by appending all
     * routes of the added collection.
     *
     * @param RouteCollection $collection      A RouteCollection instance
     *
     * @api
     */
    public function addCollection(RouteCollection $collection)
    {
        // we need to remove all routes with the same names first because just replacing them
        // would not place the new route at the end of the merged array
        foreach ($collection->all() as $name => $route) {
            unset($this->routes[$name]);
            $this->routes[$name] = $route;
        }

        $this->resources = array_merge($this->resources, $collection->getResources());
    }

    /**
     * Adds a prefix to the path of all child routes.
     *
     * @param string $prefix       An optional prefix to add before each pattern of the route collection
     * @param array  $defaults     An array of default values
     * @param array  $requirements An array of requirements
     *
     * @api
     */
    public function addPrefix($prefix, array $defaults = array(), array $requirements = array())
    {
        $prefix = trim(trim($prefix), '/');

        if ('' === $prefix) {
            return;
        }

        foreach ($this->routes as $route) {
            $route->setPath('/'.$prefix.$route->getPath());
            $route->addDefaults($defaults);
            $route->addRequirements($requirements);
        }
    }

    /**
     * Sets the host pattern on all routes.
     *
     * @param string $pattern      The pattern
     * @param array  $defaults     An array of default values
     * @param array  $requirements An array of requirements
     */
    public function setHost($pattern, array $defaults = array(), array $requirements = array())
    {
        foreach ($this->routes as $route) {
            $route->setHost($pattern);
            $route->addDefaults($defaults);
            $route->addRequirements($requirements);
        }
    }

    /**
     * Sets a condition on all routes.
     *
     * Existing conditions will be overridden.
     *
     * @param string $condition The condition
     */
    public function setCondition($condition)
    {
        foreach ($this->routes as $route) {
            $route->setCondition($condition);
        }
    }

    /**
     * Adds defaults to all routes.
     *
     * An existing default value under the same name in a route will be overridden.
     *
     * @param array $defaults An array of default values
     */
    public function addDefaults(array $defaults)
    {
        if ($defaults) {
            foreach ($this->routes as $route) {
                $route->addDefaults($defaults);
            }
        }
    }

    /**
     * Adds requirements to all routes.
     *
     * An existing requirement under the same name in a route will be overridden.
     *
     * @param array $requirements An array of requirements
     */
    public function addRequirements(array $requirements)
    {
        if ($requirements) {
            foreach ($this->routes as $route) {
                $route->addRequirements($requirements);
            }
        }
    }

    /**
     * Adds options to all routes.
     *
     * An existing option value under the same name in a route will be overridden.
     *
     * @param array $options An array of options
     */
    public function addOptions(array $options)
    {
        if ($options) {
            foreach ($this->routes as $route) {
                $route->addOptions($options);
            }
        }
    }

    /**
     * Sets the schemes (e.g. 'https') all child routes are restricted to.
     *
     * @param string|array $schemes The scheme or an array of schemes
     */
    public function setSchemes($schemes)
    {
        foreach ($this->routes as $route) {
            $route->setSchemes($schemes);
        }
    }

    /**
     * Sets the HTTP methods (e.g. 'POST') all child routes are restricted to.
     *
     * @param string|array $methods The method or an array of methods
     */
    public function setMethods($methods)
    {
        foreach ($this->routes as $route) {
            $route->setMethods($methods);
        }
    }

    /**
     * Returns an array of resources loaded to build this collection.
     *
     * @return ResourceInterface[] An array of resources
     */
    public function getResources()
    {
        return array_unique($this->resources);
    }

    /**
     * Adds a resource for this collection.
     *
     * @param ResourceInterface $resource A resource instance
     */
    public function addResource(ResourceInterface $resource)
    {
        $this->resources[] = $resource;
    }
}
PK}_�\��%�%)pear/Symfony/Component/Routing/Router.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing;

use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\Config\ConfigCache;
use Psr\Log\LoggerInterface;
use Symfony\Component\Routing\Generator\ConfigurableRequirementsInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\Generator\Dumper\GeneratorDumperInterface;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
use Symfony\Component\Routing\Matcher\Dumper\MatcherDumperInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * The Router class is an example of the integration of all pieces of the
 * routing system for easier use.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Router implements RouterInterface, RequestMatcherInterface
{
    /**
     * @var UrlMatcherInterface|null
     */
    protected $matcher;

    /**
     * @var UrlGeneratorInterface|null
     */
    protected $generator;

    /**
     * @var RequestContext
     */
    protected $context;

    /**
     * @var LoaderInterface
     */
    protected $loader;

    /**
     * @var RouteCollection|null
     */
    protected $collection;

    /**
     * @var mixed
     */
    protected $resource;

    /**
     * @var array
     */
    protected $options = array();

    /**
     * @var LoggerInterface|null
     */
    protected $logger;

    /**
     * Constructor.
     *
     * @param LoaderInterface $loader   A LoaderInterface instance
     * @param mixed           $resource The main resource to load
     * @param array           $options  An array of options
     * @param RequestContext  $context  The context
     * @param LoggerInterface $logger   A logger instance
     */
    public function __construct(LoaderInterface $loader, $resource, array $options = array(), RequestContext $context = null, LoggerInterface $logger = null)
    {
        $this->loader = $loader;
        $this->resource = $resource;
        $this->logger = $logger;
        $this->context = $context ?: new RequestContext();
        $this->setOptions($options);
    }

    /**
     * Sets options.
     *
     * Available options:
     *
     *   * cache_dir:     The cache directory (or null to disable caching)
     *   * debug:         Whether to enable debugging or not (false by default)
     *   * resource_type: Type hint for the main resource (optional)
     *
     * @param array $options An array of options
     *
     * @throws \InvalidArgumentException When unsupported option is provided
     */
    public function setOptions(array $options)
    {
        $this->options = array(
            'cache_dir'              => null,
            'debug'                  => false,
            'generator_class'        => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
            'generator_base_class'   => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
            'generator_dumper_class' => 'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper',
            'generator_cache_class'  => 'ProjectUrlGenerator',
            'matcher_class'          => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
            'matcher_base_class'     => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
            'matcher_dumper_class'   => 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper',
            'matcher_cache_class'    => 'ProjectUrlMatcher',
            'resource_type'          => null,
            'strict_requirements'    => true,
        );

        // check option names and live merge, if errors are encountered Exception will be thrown
        $invalid = array();
        foreach ($options as $key => $value) {
            if (array_key_exists($key, $this->options)) {
                $this->options[$key] = $value;
            } else {
                $invalid[] = $key;
            }
        }

        if ($invalid) {
            throw new \InvalidArgumentException(sprintf('The Router does not support the following options: "%s".', implode('", "', $invalid)));
        }
    }

    /**
     * Sets an option.
     *
     * @param string $key   The key
     * @param mixed  $value The value
     *
     * @throws \InvalidArgumentException
     */
    public function setOption($key, $value)
    {
        if (!array_key_exists($key, $this->options)) {
            throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key));
        }

        $this->options[$key] = $value;
    }

    /**
     * Gets an option value.
     *
     * @param string $key The key
     *
     * @return mixed The value
     *
     * @throws \InvalidArgumentException
     */
    public function getOption($key)
    {
        if (!array_key_exists($key, $this->options)) {
            throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key));
        }

        return $this->options[$key];
    }

    /**
     * {@inheritdoc}
     */
    public function getRouteCollection()
    {
        if (null === $this->collection) {
            $this->collection = $this->loader->load($this->resource, $this->options['resource_type']);
        }

        return $this->collection;
    }

    /**
     * {@inheritdoc}
     */
    public function setContext(RequestContext $context)
    {
        $this->context = $context;

        if (null !== $this->matcher) {
            $this->getMatcher()->setContext($context);
        }
        if (null !== $this->generator) {
            $this->getGenerator()->setContext($context);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getContext()
    {
        return $this->context;
    }

    /**
     * {@inheritdoc}
     */
    public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)
    {
        return $this->getGenerator()->generate($name, $parameters, $referenceType);
    }

    /**
     * {@inheritdoc}
     */
    public function match($pathinfo)
    {
        return $this->getMatcher()->match($pathinfo);
    }

    /**
     * {@inheritdoc}
     */
    public function matchRequest(Request $request)
    {
        $matcher = $this->getMatcher();
        if (!$matcher instanceof RequestMatcherInterface) {
            // fallback to the default UrlMatcherInterface
            return $matcher->match($request->getPathInfo());
        }

        return $matcher->matchRequest($request);
    }

    /**
     * Gets the UrlMatcher instance associated with this Router.
     *
     * @return UrlMatcherInterface A UrlMatcherInterface instance
     */
    public function getMatcher()
    {
        if (null !== $this->matcher) {
            return $this->matcher;
        }

        if (null === $this->options['cache_dir'] || null === $this->options['matcher_cache_class']) {
            return $this->matcher = new $this->options['matcher_class']($this->getRouteCollection(), $this->context);
        }

        $class = $this->options['matcher_cache_class'];
        $cache = new ConfigCache($this->options['cache_dir'].'/'.$class.'.php', $this->options['debug']);
        if (!$cache->isFresh()) {
            $dumper = $this->getMatcherDumperInstance();

            $options = array(
                'class'      => $class,
                'base_class' => $this->options['matcher_base_class'],
            );

            $cache->write($dumper->dump($options), $this->getRouteCollection()->getResources());
        }

        require_once $cache;

        return $this->matcher = new $class($this->context);
    }

    /**
     * Gets the UrlGenerator instance associated with this Router.
     *
     * @return UrlGeneratorInterface A UrlGeneratorInterface instance
     */
    public function getGenerator()
    {
        if (null !== $this->generator) {
            return $this->generator;
        }

        if (null === $this->options['cache_dir'] || null === $this->options['generator_cache_class']) {
            $this->generator = new $this->options['generator_class']($this->getRouteCollection(), $this->context, $this->logger);
        } else {
            $class = $this->options['generator_cache_class'];
            $cache = new ConfigCache($this->options['cache_dir'].'/'.$class.'.php', $this->options['debug']);
            if (!$cache->isFresh()) {
                $dumper = $this->getGeneratorDumperInstance();

                $options = array(
                    'class'      => $class,
                    'base_class' => $this->options['generator_base_class'],
                );

                $cache->write($dumper->dump($options), $this->getRouteCollection()->getResources());
            }

            require_once $cache;

            $this->generator = new $class($this->context, $this->logger);
        }

        if ($this->generator instanceof ConfigurableRequirementsInterface) {
            $this->generator->setStrictRequirements($this->options['strict_requirements']);
        }

        return $this->generator;
    }

    /**
     * @return GeneratorDumperInterface
     */
    protected function getGeneratorDumperInstance()
    {
        return new $this->options['generator_dumper_class']($this->getRouteCollection());
    }

    /**
     * @return MatcherDumperInterface
     */
    protected function getMatcherDumperInstance()
    {
        return new $this->options['matcher_dumper_class']($this->getRouteCollection());
    }
}
PK}_�\U8���2pear/Symfony/Component/Routing/RouterInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing;

use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;

/**
 * RouterInterface is the interface that all Router classes must implement.
 *
 * This interface is the concatenation of UrlMatcherInterface and UrlGeneratorInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface RouterInterface extends UrlMatcherInterface, UrlGeneratorInterface
{
    /**
     * Gets the RouteCollection instance associated with this Router.
     *
     * @return RouteCollection A RouteCollection instance
     */
    public function getRouteCollection();
}
PK`�\[z�ddApear/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher;

use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Route;

/**
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
abstract class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface
{
    /**
     * {@inheritdoc}
     */
    public function match($pathinfo)
    {
        try {
            $parameters = parent::match($pathinfo);
        } catch (ResourceNotFoundException $e) {
            if ('/' === substr($pathinfo, -1) || !in_array($this->context->getMethod(), array('HEAD', 'GET'))) {
                throw $e;
            }

            try {
                parent::match($pathinfo.'/');

                return $this->redirect($pathinfo.'/', null);
            } catch (ResourceNotFoundException $e2) {
                throw $e;
            }
        }

        return $parameters;
    }

    /**
     * {@inheritDoc}
     */
    protected function handleRouteRequirements($pathinfo, $name, Route $route)
    {
        // expression condition
        if ($route->getCondition() && !$this->getExpressionLanguage()->evaluate($route->getCondition(), array('context' => $this->context, 'request' => $this->request))) {
            return array(self::REQUIREMENT_MISMATCH, null);
        }

        // check HTTP scheme requirement
        $scheme = $route->getRequirement('_scheme');
        if ($scheme && $this->context->getScheme() !== $scheme) {
            return array(self::ROUTE_MATCH, $this->redirect($pathinfo, $name, $scheme));
        }

        return array(self::REQUIREMENT_MATCH, null);
    }
}
PK`�\� ��ffJpear/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher;

/**
 * RedirectableUrlMatcherInterface knows how to redirect the user.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface RedirectableUrlMatcherInterface
{
    /**
     * Redirects the user to another URL.
     *
     * @param string      $path   The path info to redirect to.
     * @param string      $route  The route name that matched
     * @param string|null $scheme The URL scheme (null to keep the current one)
     *
     * @return array An array of parameters
     *
     * @api
     */
    public function redirect($path, $route, $scheme = null);
}
PK`�\Gj�C""5pear/Symfony/Component/Routing/Matcher/UrlMatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher;

use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

/**
 * UrlMatcher matches URL based on a set of routes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface
{
    const REQUIREMENT_MATCH     = 0;
    const REQUIREMENT_MISMATCH  = 1;
    const ROUTE_MATCH           = 2;

    /**
     * @var RequestContext
     */
    protected $context;

    /**
     * @var array
     */
    protected $allow = array();

    /**
     * @var RouteCollection
     */
    protected $routes;

    protected $request;
    protected $expressionLanguage;

    /**
     * Constructor.
     *
     * @param RouteCollection $routes  A RouteCollection instance
     * @param RequestContext  $context The context
     *
     * @api
     */
    public function __construct(RouteCollection $routes, RequestContext $context)
    {
        $this->routes = $routes;
        $this->context = $context;
    }

    /**
     * {@inheritdoc}
     */
    public function setContext(RequestContext $context)
    {
        $this->context = $context;
    }

    /**
     * {@inheritdoc}
     */
    public function getContext()
    {
        return $this->context;
    }

    /**
     * {@inheritdoc}
     */
    public function match($pathinfo)
    {
        $this->allow = array();

        if ($ret = $this->matchCollection(rawurldecode($pathinfo), $this->routes)) {
            return $ret;
        }

        throw 0 < count($this->allow)
            ? new MethodNotAllowedException(array_unique(array_map('strtoupper', $this->allow)))
            : new ResourceNotFoundException();
    }

    /**
     * {@inheritdoc}
     */
    public function matchRequest(Request $request)
    {
        $this->request = $request;

        $ret = $this->match($request->getPathInfo());

        $this->request = null;

        return $ret;
    }

    /**
     * Tries to match a URL with a set of routes.
     *
     * @param string          $pathinfo The path info to be parsed
     * @param RouteCollection $routes   The set of routes
     *
     * @return array An array of parameters
     *
     * @throws ResourceNotFoundException If the resource could not be found
     * @throws MethodNotAllowedException If the resource was found but the request method is not allowed
     */
    protected function matchCollection($pathinfo, RouteCollection $routes)
    {
        foreach ($routes as $name => $route) {
            $compiledRoute = $route->compile();

            // check the static prefix of the URL first. Only use the more expensive preg_match when it matches
            if ('' !== $compiledRoute->getStaticPrefix() && 0 !== strpos($pathinfo, $compiledRoute->getStaticPrefix())) {
                continue;
            }

            if (!preg_match($compiledRoute->getRegex(), $pathinfo, $matches)) {
                continue;
            }

            $hostMatches = array();
            if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) {
                continue;
            }

            // check HTTP method requirement
            if ($req = $route->getRequirement('_method')) {
                // HEAD and GET are equivalent as per RFC
                if ('HEAD' === $method = $this->context->getMethod()) {
                    $method = 'GET';
                }

                if (!in_array($method, $req = explode('|', strtoupper($req)))) {
                    $this->allow = array_merge($this->allow, $req);

                    continue;
                }
            }

            $status = $this->handleRouteRequirements($pathinfo, $name, $route);

            if (self::ROUTE_MATCH === $status[0]) {
                return $status[1];
            }

            if (self::REQUIREMENT_MISMATCH === $status[0]) {
                continue;
            }

            return $this->getAttributes($route, $name, array_replace($matches, $hostMatches));
        }
    }

    /**
     * Returns an array of values to use as request attributes.
     *
     * As this method requires the Route object, it is not available
     * in matchers that do not have access to the matched Route instance
     * (like the PHP and Apache matcher dumpers).
     *
     * @param Route  $route      The route we are matching against
     * @param string $name       The name of the route
     * @param array  $attributes An array of attributes from the matcher
     *
     * @return array An array of parameters
     */
    protected function getAttributes(Route $route, $name, array $attributes)
    {
        $attributes['_route'] = $name;

        return $this->mergeDefaults($attributes, $route->getDefaults());
    }

    /**
     * Handles specific route requirements.
     *
     * @param string $pathinfo The path
     * @param string $name     The route name
     * @param Route  $route    The route
     *
     * @return array The first element represents the status, the second contains additional information
     */
    protected function handleRouteRequirements($pathinfo, $name, Route $route)
    {
        // expression condition
        if ($route->getCondition() && !$this->getExpressionLanguage()->evaluate($route->getCondition(), array('context' => $this->context, 'request' => $this->request))) {
            return array(self::REQUIREMENT_MISMATCH, null);
        }

        // check HTTP scheme requirement
        $scheme = $route->getRequirement('_scheme');
        $status = $scheme && $scheme !== $this->context->getScheme() ? self::REQUIREMENT_MISMATCH : self::REQUIREMENT_MATCH;

        return array($status, null);
    }

    /**
     * Get merged default parameters.
     *
     * @param array $params   The parameters
     * @param array $defaults The defaults
     *
     * @return array Merged default parameters
     */
    protected function mergeDefaults($params, $defaults)
    {
        foreach ($params as $key => $value) {
            if (!is_int($key)) {
                $defaults[$key] = $value;
            }
        }

        return $defaults;
    }

    protected function getExpressionLanguage()
    {
        if (null === $this->expressionLanguage) {
            if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
                throw new \RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
            }
            $this->expressionLanguage = new ExpressionLanguage();
        }

        return $this->expressionLanguage;
    }
}
PK`�\`�u���Bpear/Symfony/Component/Routing/Matcher/RequestMatcherInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Exception\MethodNotAllowedException;

/**
 * RequestMatcherInterface is the interface that all request matcher classes must implement.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface RequestMatcherInterface
{
    /**
     * Tries to match a request with a set of routes.
     *
     * If the matcher can not find information, it must throw one of the exceptions documented
     * below.
     *
     * @param Request $request The request to match
     *
     * @return array An array of parameters
     *
     * @throws ResourceNotFoundException If no matching resource could be found
     * @throws MethodNotAllowedException If a matching resource was found but the request method is not allowed
     */
    public function matchRequest(Request $request);
}
PK`�\�'��>pear/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher;

use Symfony\Component\Routing\Exception\ExceptionInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;

/**
 * TraceableUrlMatcher helps debug path info matching by tracing the match.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TraceableUrlMatcher extends UrlMatcher
{
    const ROUTE_DOES_NOT_MATCH = 0;
    const ROUTE_ALMOST_MATCHES = 1;
    const ROUTE_MATCHES        = 2;

    protected $traces;

    public function getTraces($pathinfo)
    {
        $this->traces = array();

        try {
            $this->match($pathinfo);
        } catch (ExceptionInterface $e) {
        }

        return $this->traces;
    }

    protected function matchCollection($pathinfo, RouteCollection $routes)
    {
        foreach ($routes as $name => $route) {
            $compiledRoute = $route->compile();

            if (!preg_match($compiledRoute->getRegex(), $pathinfo, $matches)) {
                // does it match without any requirements?
                $r = new Route($route->getPath(), $route->getDefaults(), array(), $route->getOptions());
                $cr = $r->compile();
                if (!preg_match($cr->getRegex(), $pathinfo)) {
                    $this->addTrace(sprintf('Path "%s" does not match', $route->getPath()), self::ROUTE_DOES_NOT_MATCH, $name, $route);

                    continue;
                }

                foreach ($route->getRequirements() as $n => $regex) {
                    $r = new Route($route->getPath(), $route->getDefaults(), array($n => $regex), $route->getOptions());
                    $cr = $r->compile();

                    if (in_array($n, $cr->getVariables()) && !preg_match($cr->getRegex(), $pathinfo)) {
                        $this->addTrace(sprintf('Requirement for "%s" does not match (%s)', $n, $regex), self::ROUTE_ALMOST_MATCHES, $name, $route);

                        continue 2;
                    }
                }

                continue;
            }

            // check host requirement
            $hostMatches = array();
            if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) {
                $this->addTrace(sprintf('Host "%s" does not match the requirement ("%s")', $this->context->getHost(), $route->getHost()), self::ROUTE_ALMOST_MATCHES, $name, $route);

                continue;
            }

            // check HTTP method requirement
            if ($req = $route->getRequirement('_method')) {
                // HEAD and GET are equivalent as per RFC
                if ('HEAD' === $method = $this->context->getMethod()) {
                    $method = 'GET';
                }

                if (!in_array($method, $req = explode('|', strtoupper($req)))) {
                    $this->allow = array_merge($this->allow, $req);

                    $this->addTrace(sprintf('Method "%s" does not match the requirement ("%s")', $this->context->getMethod(), implode(', ', $req)), self::ROUTE_ALMOST_MATCHES, $name, $route);

                    continue;
                }
            }

            // check condition
            if ($condition = $route->getCondition()) {
                if (!$this->getExpressionLanguage()->evaluate($condition, array('context' => $this->context, 'request' => $this->request))) {
                    $this->addTrace(sprintf('Condition "%s" does not evaluate to "true"', $condition), self::ROUTE_ALMOST_MATCHES, $name, $route);

                    continue;
                }
            }

            // check HTTP scheme requirement
            if ($scheme = $route->getRequirement('_scheme')) {
                if ($this->context->getScheme() !== $scheme) {
                    $this->addTrace(sprintf('Scheme "%s" does not match the requirement ("%s"); the user will be redirected', $this->context->getScheme(), $scheme), self::ROUTE_ALMOST_MATCHES, $name, $route);

                    return true;
                }
            }

            $this->addTrace('Route matches!', self::ROUTE_MATCHES, $name, $route);

            return true;
        }
    }

    private function addTrace($log, $level = self::ROUTE_DOES_NOT_MATCH, $name = null, $route = null)
    {
        $this->traces[] = array(
            'log'   => $log,
            'name'  => $name,
            'level' => $level,
            'path'  => null !== $route ? $route->getPath() : null,
        );
    }
}
PK`�\(� ���Hpear/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher\Dumper;

use Symfony\Component\Routing\RouteCollection;

/**
 * MatcherDumperInterface is the interface that all matcher dumper classes must implement.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface MatcherDumperInterface
{
    /**
     * Dumps a set of routes to a string representation of executable code
     * that can then be used to match a request against these routes.
     *
     * @param array $options An array of options
     *
     * @return string Executable code
     */
    public function dump(array $options = array());

    /**
     * Gets the routes to dump.
     *
     * @return RouteCollection A RouteCollection instance
     */
    public function getRoutes();
}
PK`�\�`Bpear/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher\Dumper;

/**
 * Collection of routes.
 *
 * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
 */
class DumperCollection implements \IteratorAggregate
{
    /**
     * @var DumperCollection|null
     */
    private $parent;

    /**
     * @var (DumperCollection|DumperRoute)[]
     */
    private $children = array();

    /**
     * @var array
     */
    private $attributes = array();

    /**
     * Returns the children routes and collections.
     *
     * @return (DumperCollection|DumperRoute)[] Array of DumperCollection|DumperRoute
     */
    public function all()
    {
        return $this->children;
    }

    /**
     * Adds a route or collection
     *
     * @param DumperRoute|DumperCollection The route or collection
     */
    public function add($child)
    {
        if ($child instanceof DumperCollection) {
            $child->setParent($this);
        }
        $this->children[] = $child;
    }

    /**
     * Sets children.
     *
     * @param array $children The children
     */
    public function setAll(array $children)
    {
        foreach ($children as $child) {
            if ($child instanceof DumperCollection) {
                $child->setParent($this);
            }
        }
        $this->children = $children;
    }

    /**
     * Returns an iterator over the children.
     *
     * @return \Iterator The iterator
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->children);
    }

    /**
     * Returns the root of the collection.
     *
     * @return DumperCollection The root collection
     */
    public function getRoot()
    {
        return (null !== $this->parent) ? $this->parent->getRoot() : $this;
    }

    /**
     * Returns the parent collection.
     *
     * @return DumperCollection|null The parent collection or null if the collection has no parent
     */
    protected function getParent()
    {
        return $this->parent;
    }

    /**
     * Sets the parent collection.
     *
     * @param DumperCollection $parent The parent collection
     */
    protected function setParent(DumperCollection $parent)
    {
        $this->parent = $parent;
    }

    /**
     * Returns true if the attribute is defined.
     *
     * @param string $name The attribute name
     *
     * @return Boolean true if the attribute is defined, false otherwise
     */
    public function hasAttribute($name)
    {
        return array_key_exists($name, $this->attributes);
    }

    /**
     * Returns an attribute by name.
     *
     * @param string $name    The attribute name
     * @param mixed  $default Default value is the attribute doesn't exist
     *
     * @return mixed The attribute value
     */
    public function getAttribute($name, $default = null)
    {
        return $this->hasAttribute($name) ? $this->attributes[$name] : $default;
    }

    /**
     * Sets an attribute by name.
     *
     * @param string $name  The attribute name
     * @param mixed  $value The attribute value
     */
    public function setAttribute($name, $value)
    {
        $this->attributes[$name] = $value;
    }

    /**
     * Sets multiple attributes.
     *
     * @param array $attributes The attributes
     */
    public function setAttributes($attributes)
    {
        $this->attributes = $attributes;
    }
}
PK`�\�bz#z#Epear/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher\Dumper;

use Symfony\Component\Routing\Route;

/**
 * Dumps a set of Apache mod_rewrite rules.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Kris Wallsmith <kris@symfony.com>
 */
class ApacheMatcherDumper extends MatcherDumper
{
    /**
     * Dumps a set of Apache mod_rewrite rules.
     *
     * Available options:
     *
     *  * script_name: The script name (app.php by default)
     *  * base_uri:    The base URI ("" by default)
     *
     * @param array $options An array of options
     *
     * @return string A string to be used as Apache rewrite rules
     *
     * @throws \LogicException When the route regex is invalid
     */
    public function dump(array $options = array())
    {
        $options = array_merge(array(
            'script_name' => 'app.php',
            'base_uri'    => '',
        ), $options);

        $options['script_name'] = self::escape($options['script_name'], ' ', '\\');

        $rules = array("# skip \"real\" requests\nRewriteCond %{REQUEST_FILENAME} -f\nRewriteRule .* - [QSA,L]");
        $methodVars = array();
        $hostRegexUnique = 0;
        $prevHostRegex = '';

        foreach ($this->getRoutes()->all() as $name => $route) {
            if ($route->getCondition()) {
                throw new \LogicException(sprintf('Unable to dump the routes for Apache as route "%s" has a condition.', $name));
            }

            $compiledRoute = $route->compile();
            $hostRegex = $compiledRoute->getHostRegex();

            if (null !== $hostRegex && $prevHostRegex !== $hostRegex) {
                $prevHostRegex = $hostRegex;
                $hostRegexUnique++;

                $rule = array();

                $regex = $this->regexToApacheRegex($hostRegex);
                $regex = self::escape($regex, ' ', '\\');

                $rule[] = sprintf('RewriteCond %%{HTTP:Host} %s', $regex);

                $variables = array();
                $variables[] = sprintf('E=__ROUTING_host_%s:1', $hostRegexUnique);

                foreach ($compiledRoute->getHostVariables() as $i => $variable) {
                    $variables[] = sprintf('E=__ROUTING_host_%s_%s:%%%d', $hostRegexUnique, $variable, $i+1);
                }

                $variables = implode(',', $variables);

                $rule[] = sprintf('RewriteRule .? - [%s]', $variables);

                $rules[] = implode("\n", $rule);
            }

            $rules[] = $this->dumpRoute($name, $route, $options, $hostRegexUnique);

            if ($req = $route->getRequirement('_method')) {
                $methods = explode('|', strtoupper($req));
                $methodVars = array_merge($methodVars, $methods);
            }
        }
        if (0 < count($methodVars)) {
            $rule = array('# 405 Method Not Allowed');
            $methodVars = array_values(array_unique($methodVars));
            if (in_array('GET', $methodVars) && !in_array('HEAD', $methodVars)) {
                $methodVars[] = 'HEAD';
            }
            foreach ($methodVars as $i => $methodVar) {
                $rule[] = sprintf('RewriteCond %%{ENV:_ROUTING__allow_%s} =1%s', $methodVar, isset($methodVars[$i + 1]) ? ' [OR]' : '');
            }
            $rule[] = sprintf('RewriteRule .* %s [QSA,L]', $options['script_name']);

            $rules[] = implode("\n", $rule);
        }

        return implode("\n\n", $rules)."\n";
    }

    /**
     * Dumps a single route
     *
     * @param  string $name Route name
     * @param  Route  $route The route
     * @param  array  $options Options
     * @param  bool   $hostRegexUnique Unique identifier for the host regex
     *
     * @return string The compiled route
     */
    private function dumpRoute($name, $route, array $options, $hostRegexUnique)
    {
        $compiledRoute = $route->compile();

        // prepare the apache regex
        $regex = $this->regexToApacheRegex($compiledRoute->getRegex());
        $regex = '^'.self::escape(preg_quote($options['base_uri']).substr($regex, 1), ' ', '\\');

        $methods = $this->getRouteMethods($route);

        $hasTrailingSlash = (!$methods || in_array('HEAD', $methods)) && '/$' === substr($regex, -2) && '^/$' !== $regex;

        $variables = array('E=_ROUTING_route:'.$name);
        foreach ($compiledRoute->getHostVariables() as $variable) {
            $variables[] = sprintf('E=_ROUTING_param_%s:%%{ENV:__ROUTING_host_%s_%s}', $variable, $hostRegexUnique, $variable);
        }
        foreach ($compiledRoute->getPathVariables() as $i => $variable) {
            $variables[] = 'E=_ROUTING_param_'.$variable.':%'.($i + 1);
        }
        foreach ($this->normalizeValues($route->getDefaults()) as $key => $value) {
            $variables[] = 'E=_ROUTING_default_'.$key.':'.strtr($value, array(
                ':'  => '\\:',
                '='  => '\\=',
                '\\' => '\\\\',
                ' '  => '\\ ',
            ));
        }
        $variables = implode(',', $variables);

        $rule = array("# $name");

        // method mismatch
        if (0 < count($methods)) {
            $allow = array();
            foreach ($methods as $method) {
                $allow[] = 'E=_ROUTING_allow_'.$method.':1';
            }

            if ($compiledRoute->getHostRegex()) {
                $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique);
            }

            $rule[] = "RewriteCond %{REQUEST_URI} $regex";
            $rule[] = sprintf("RewriteCond %%{REQUEST_METHOD} !^(%s)$ [NC]", implode('|', $methods));
            $rule[] = sprintf('RewriteRule .* - [S=%d,%s]', $hasTrailingSlash ? 2 : 1, implode(',', $allow));
        }

        // redirect with trailing slash appended
        if ($hasTrailingSlash) {
            if ($compiledRoute->getHostRegex()) {
                $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique);
            }

            $rule[] = 'RewriteCond %{REQUEST_URI} '.substr($regex, 0, -2).'$';
            $rule[] = 'RewriteRule .* $0/ [QSA,L,R=301]';
        }

        // the main rule

        if ($compiledRoute->getHostRegex()) {
            $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique);
        }

        $rule[] = "RewriteCond %{REQUEST_URI} $regex";
        $rule[] = "RewriteRule .* {$options['script_name']} [QSA,L,$variables]";

        return implode("\n", $rule);
    }

    /**
     * Returns methods allowed for a route
     *
     * @param Route  $route The route
     *
     * @return array The methods
     */
    private function getRouteMethods(Route $route)
    {
        $methods = array();
        if ($req = $route->getRequirement('_method')) {
            $methods = explode('|', strtoupper($req));
            // GET and HEAD are equivalent
            if (in_array('GET', $methods) && !in_array('HEAD', $methods)) {
                $methods[] = 'HEAD';
            }
        }

        return $methods;
    }

    /**
     * Converts a regex to make it suitable for mod_rewrite
     *
     * @param string  $regex The regex
     *
     * @return string The converted regex
     */
    private function regexToApacheRegex($regex)
    {
        $regexPatternEnd = strrpos($regex, $regex[0]);

        return preg_replace('/\?P<.+?>/', '', substr($regex, 1, $regexPatternEnd - 1));
    }

    /**
     * Escapes a string.
     *
     * @param string $string The string to be escaped
     * @param string $char   The character to be escaped
     * @param string $with   The character to be used for escaping
     *
     * @return string The escaped string
     */
    private static function escape($string, $char, $with)
    {
        $escaped = false;
        $output = '';
        foreach (str_split($string) as $symbol) {
            if ($escaped) {
                $output .= $symbol;
                $escaped = false;
                continue;
            }
            if ($symbol === $char) {
                $output .= $with.$char;
                continue;
            }
            if ($symbol === $with) {
                $escaped = true;
            }
            $output .= $symbol;
        }

        return $output;
    }

    /**
     * Normalizes an array of values.
     *
     * @param array $values
     *
     * @return string[]
     */
    private function normalizeValues(array $values)
    {
        $normalizedValues = array();
        foreach ($values as $key => $value) {
            if (is_array($value)) {
                foreach ($value as $index => $bit) {
                    $normalizedValues[sprintf('%s[%s]', $key, $index)] = $bit;
                }
            } else {
                $normalizedValues[$key] = (string) $value;
            }
        }

        return $normalizedValues;
    }
}
PK`�\�N�
�
Hpear/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher\Dumper;

/**
 * Prefix tree of routes preserving routes order.
 *
 * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
 */
class DumperPrefixCollection extends DumperCollection
{
    /**
     * @var string
     */
    private $prefix = '';

    /**
     * Returns the prefix.
     *
     * @return string The prefix
     */
    public function getPrefix()
    {
        return $this->prefix;
    }

    /**
     * Sets the prefix.
     *
     * @param string $prefix The prefix
     */
    public function setPrefix($prefix)
    {
        $this->prefix = $prefix;
    }

    /**
     * Adds a route in the tree.
     *
     * @param DumperRoute $route The route
     *
     * @return DumperPrefixCollection The node the route was added to
     *
     * @throws \LogicException
     */
    public function addPrefixRoute(DumperRoute $route)
    {
        $prefix = $route->getRoute()->compile()->getStaticPrefix();

        for ($collection = $this; null !== $collection; $collection = $collection->getParent()) {

            // Same prefix, add to current leave
            if ($collection->prefix === $prefix) {
                $collection->add($route);

                return $collection;
            }

            // Prefix starts with route's prefix
            if ('' === $collection->prefix || 0 === strpos($prefix, $collection->prefix)) {
                $child = new DumperPrefixCollection();
                $child->setPrefix(substr($prefix, 0, strlen($collection->prefix)+1));
                $collection->add($child);

                return $child->addPrefixRoute($route);
            }
        }

        // Reached only if the root has a non empty prefix
        throw new \LogicException("The collection root must not have a prefix");
    }

    /**
     * Merges nodes whose prefix ends with a slash
     *
     * Children of a node whose prefix ends with a slash are moved to the parent node
     */
    public function mergeSlashNodes()
    {
        $children = array();

        foreach ($this as $child) {
            if ($child instanceof self) {
                $child->mergeSlashNodes();
                if ('/' === substr($child->prefix, -1)) {
                    $children = array_merge($children, $child->all());
                } else {
                    $children[] = $child;
                }
            } else {
                $children[] = $child;
            }
        }

        $this->setAll($children);
    }
}
PK`�\?�|{��?pear/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher\Dumper;

use Symfony\Component\Routing\RouteCollection;

/**
 * MatcherDumper is the abstract class for all built-in matcher dumpers.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class MatcherDumper implements MatcherDumperInterface
{
    /**
     * @var RouteCollection
     */
    private $routes;

    /**
     * Constructor.
     *
     * @param RouteCollection $routes The RouteCollection to dump
     */
    public function __construct(RouteCollection $routes)
    {
        $this->routes = $routes;
    }

    /**
     * {@inheritdoc}
     */
    public function getRoutes()
    {
        return $this->routes;
    }
}
PK`�\�x}�44Bpear/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher\Dumper;

use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

/**
 * PhpMatcherDumper creates a PHP class able to match URLs for a given set of routes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
 */
class PhpMatcherDumper extends MatcherDumper
{
    private $expressionLanguage;

    /**
     * Dumps a set of routes to a PHP class.
     *
     * Available options:
     *
     *  * class:      The class name
     *  * base_class: The base class name
     *
     * @param array $options An array of options
     *
     * @return string A PHP class representing the matcher class
     */
    public function dump(array $options = array())
    {
        $options = array_replace(array(
            'class'      => 'ProjectUrlMatcher',
            'base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
        ), $options);

        // trailing slash support is only enabled if we know how to redirect the user
        $interfaces = class_implements($options['base_class']);
        $supportsRedirections = isset($interfaces['Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface']);

        return <<<EOF
<?php

use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\RequestContext;

/**
 * {$options['class']}
 *
 * This class has been auto-generated
 * by the Symfony Routing Component.
 */
class {$options['class']} extends {$options['base_class']}
{
    /**
     * Constructor.
     */
    public function __construct(RequestContext \$context)
    {
        \$this->context = \$context;
    }

{$this->generateMatchMethod($supportsRedirections)}
}

EOF;
    }

    /**
     * Generates the code for the match method implementing UrlMatcherInterface.
     *
     * @param Boolean $supportsRedirections Whether redirections are supported by the base class
     *
     * @return string Match method as PHP code
     */
    private function generateMatchMethod($supportsRedirections)
    {
        $code = rtrim($this->compileRoutes($this->getRoutes(), $supportsRedirections), "\n");

        return <<<EOF
    public function match(\$pathinfo)
    {
        \$allow = array();
        \$pathinfo = rawurldecode(\$pathinfo);
        \$context = \$this->context;
        \$request = \$this->request;

$code

        throw 0 < count(\$allow) ? new MethodNotAllowedException(array_unique(\$allow)) : new ResourceNotFoundException();
    }
EOF;
    }

    /**
     * Generates PHP code to match a RouteCollection with all its routes.
     *
     * @param RouteCollection $routes               A RouteCollection instance
     * @param Boolean         $supportsRedirections Whether redirections are supported by the base class
     *
     * @return string PHP code
     */
    private function compileRoutes(RouteCollection $routes, $supportsRedirections)
    {
        $fetchedHost = false;

        $groups = $this->groupRoutesByHostRegex($routes);
        $code = '';

        foreach ($groups as $collection) {
            if (null !== $regex = $collection->getAttribute('host_regex')) {
                if (!$fetchedHost) {
                    $code .= "        \$host = \$this->context->getHost();\n\n";
                    $fetchedHost = true;
                }

                $code .= sprintf("        if (preg_match(%s, \$host, \$hostMatches)) {\n", var_export($regex, true));
            }

            $tree = $this->buildPrefixTree($collection);
            $groupCode = $this->compilePrefixRoutes($tree, $supportsRedirections);

            if (null !== $regex) {
                // apply extra indention at each line (except empty ones)
                $groupCode = preg_replace('/^.{2,}$/m', '    $0', $groupCode);
                $code .= $groupCode;
                $code .= "        }\n\n";
            } else {
                $code .= $groupCode;
            }
        }

        return $code;
    }

    /**
     * Generates PHP code recursively to match a tree of routes
     *
     * @param DumperPrefixCollection $collection           A DumperPrefixCollection instance
     * @param Boolean                $supportsRedirections Whether redirections are supported by the base class
     * @param string                 $parentPrefix         Prefix of the parent collection
     *
     * @return string PHP code
     */
    private function compilePrefixRoutes(DumperPrefixCollection $collection, $supportsRedirections, $parentPrefix = '')
    {
        $code = '';
        $prefix = $collection->getPrefix();
        $optimizable = 1 < strlen($prefix) && 1 < count($collection->all());
        $optimizedPrefix = $parentPrefix;

        if ($optimizable) {
            $optimizedPrefix = $prefix;

            $code .= sprintf("    if (0 === strpos(\$pathinfo, %s)) {\n", var_export($prefix, true));
        }

        foreach ($collection as $route) {
            if ($route instanceof DumperCollection) {
                $code .= $this->compilePrefixRoutes($route, $supportsRedirections, $optimizedPrefix);
            } else {
                $code .= $this->compileRoute($route->getRoute(), $route->getName(), $supportsRedirections, $optimizedPrefix)."\n";
            }
        }

        if ($optimizable) {
            $code .= "    }\n\n";
            // apply extra indention at each line (except empty ones)
            $code = preg_replace('/^.{2,}$/m', '    $0', $code);
        }

        return $code;
    }

    /**
     * Compiles a single Route to PHP code used to match it against the path info.
     *
     * @param Route       $route                A Route instance
     * @param string      $name                 The name of the Route
     * @param Boolean     $supportsRedirections Whether redirections are supported by the base class
     * @param string|null $parentPrefix         The prefix of the parent collection used to optimize the code
     *
     * @return string PHP code
     *
     * @throws \LogicException
     */
    private function compileRoute(Route $route, $name, $supportsRedirections, $parentPrefix = null)
    {
        $code = '';
        $compiledRoute = $route->compile();
        $conditions = array();
        $hasTrailingSlash = false;
        $matches = false;
        $hostMatches = false;
        $methods = array();

        if ($req = $route->getRequirement('_method')) {
            $methods = explode('|', strtoupper($req));
            // GET and HEAD are equivalent
            if (in_array('GET', $methods) && !in_array('HEAD', $methods)) {
                $methods[] = 'HEAD';
            }
        }

        $supportsTrailingSlash = $supportsRedirections && (!$methods || in_array('HEAD', $methods));

        if (!count($compiledRoute->getPathVariables()) && false !== preg_match('#^(.)\^(?P<url>.*?)\$\1#', $compiledRoute->getRegex(), $m)) {
            if ($supportsTrailingSlash && substr($m['url'], -1) === '/') {
                $conditions[] = sprintf("rtrim(\$pathinfo, '/') === %s", var_export(rtrim(str_replace('\\', '', $m['url']), '/'), true));
                $hasTrailingSlash = true;
            } else {
                $conditions[] = sprintf("\$pathinfo === %s", var_export(str_replace('\\', '', $m['url']), true));
            }
        } else {
            if ($compiledRoute->getStaticPrefix() && $compiledRoute->getStaticPrefix() !== $parentPrefix) {
                $conditions[] = sprintf("0 === strpos(\$pathinfo, %s)", var_export($compiledRoute->getStaticPrefix(), true));
            }

            $regex = $compiledRoute->getRegex();
            if ($supportsTrailingSlash && $pos = strpos($regex, '/$')) {
                $regex = substr($regex, 0, $pos).'/?$'.substr($regex, $pos + 2);
                $hasTrailingSlash = true;
            }
            $conditions[] = sprintf("preg_match(%s, \$pathinfo, \$matches)", var_export($regex, true));

            $matches = true;
        }

        if ($compiledRoute->getHostVariables()) {
            $hostMatches = true;
        }

        if ($route->getCondition()) {
            $conditions[] = $this->getExpressionLanguage()->compile($route->getCondition(), array('context', 'request'));
        }

        $conditions = implode(' && ', $conditions);

        $code .= <<<EOF
        // $name
        if ($conditions) {

EOF;

        $gotoname = 'not_'.preg_replace('/[^A-Za-z0-9_]/', '', $name);
        if ($methods) {
            if (1 === count($methods)) {
                $code .= <<<EOF
            if (\$this->context->getMethod() != '$methods[0]') {
                \$allow[] = '$methods[0]';
                goto $gotoname;
            }


EOF;
            } else {
                $methods = implode("', '", $methods);
                $code .= <<<EOF
            if (!in_array(\$this->context->getMethod(), array('$methods'))) {
                \$allow = array_merge(\$allow, array('$methods'));
                goto $gotoname;
            }


EOF;
            }
        }

        if ($hasTrailingSlash) {
            $code .= <<<EOF
            if (substr(\$pathinfo, -1) !== '/') {
                return \$this->redirect(\$pathinfo.'/', '$name');
            }


EOF;
        }

        if ($scheme = $route->getRequirement('_scheme')) {
            if (!$supportsRedirections) {
                throw new \LogicException('The "_scheme" requirement is only supported for URL matchers that implement RedirectableUrlMatcherInterface.');
            }

            $code .= <<<EOF
            if (\$this->context->getScheme() !== '$scheme') {
                return \$this->redirect(\$pathinfo, '$name', '$scheme');
            }


EOF;
        }

        // optimize parameters array
        if ($matches || $hostMatches) {
            $vars = array();
            if ($hostMatches) {
                $vars[] = '$hostMatches';
            }
            if ($matches) {
                $vars[] = '$matches';
            }
            $vars[] = "array('_route' => '$name')";

            $code .= sprintf("            return \$this->mergeDefaults(array_replace(%s), %s);\n"
                , implode(', ', $vars), str_replace("\n", '', var_export($route->getDefaults(), true)));

        } elseif ($route->getDefaults()) {
            $code .= sprintf("            return %s;\n", str_replace("\n", '', var_export(array_replace($route->getDefaults(), array('_route' => $name)), true)));
        } else {
            $code .= sprintf("            return array('_route' => '%s');\n", $name);
        }
        $code .= "        }\n";

        if ($methods) {
            $code .= "        $gotoname:\n";
        }

        return $code;
    }

    /**
     * Groups consecutive routes having the same host regex.
     *
     * The result is a collection of collections of routes having the same host regex.
     *
     * @param RouteCollection $routes A flat RouteCollection
     *
     * @return DumperCollection A collection with routes grouped by host regex in sub-collections
     */
    private function groupRoutesByHostRegex(RouteCollection $routes)
    {
        $groups = new DumperCollection();

        $currentGroup = new DumperCollection();
        $currentGroup->setAttribute('host_regex', null);
        $groups->add($currentGroup);

        foreach ($routes as $name => $route) {
            $hostRegex = $route->compile()->getHostRegex();
            if ($currentGroup->getAttribute('host_regex') !== $hostRegex) {
                $currentGroup = new DumperCollection();
                $currentGroup->setAttribute('host_regex', $hostRegex);
                $groups->add($currentGroup);
            }
            $currentGroup->add(new DumperRoute($name, $route));
        }

        return $groups;
    }

    /**
     * Organizes the routes into a prefix tree.
     *
     * Routes order is preserved such that traversing the tree will traverse the
     * routes in the origin order.
     *
     * @param DumperCollection $collection A collection of routes
     *
     * @return DumperPrefixCollection
     */
    private function buildPrefixTree(DumperCollection $collection)
    {
        $tree = new DumperPrefixCollection();
        $current = $tree;

        foreach ($collection as $route) {
            $current = $current->addPrefixRoute($route);
        }

        $tree->mergeSlashNodes();

        return $tree;
    }

    private function getExpressionLanguage()
    {
        if (null === $this->expressionLanguage) {
            if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
                throw new \RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
            }
            $this->expressionLanguage = new ExpressionLanguage();
        }

        return $this->expressionLanguage;
    }
}
PK`�\Y�IWW=pear/Symfony/Component/Routing/Matcher/Dumper/DumperRoute.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher\Dumper;

use Symfony\Component\Routing\Route;

/**
 * Container for a Route.
 *
 * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
 */
class DumperRoute
{
    /**
     * @var string
     */
    private $name;

    /**
     * @var Route
     */
    private $route;

    /**
     * Constructor.
     *
     * @param string $name  The route name
     * @param Route  $route The route
     */
    public function __construct($name, Route $route)
    {
        $this->name = $name;
        $this->route = $route;
    }

    /**
     * Returns the route name.
     *
     * @return string The route name
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Returns the route.
     *
     * @return Route The route
     */
    public function getRoute()
    {
        return $this->route;
    }
}
PK`�\���q
q
;pear/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher;

use Symfony\Component\Routing\Exception\MethodNotAllowedException;

/**
 * ApacheUrlMatcher matches URL based on Apache mod_rewrite matching (see ApacheMatcherDumper).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
 */
class ApacheUrlMatcher extends UrlMatcher
{
    /**
     * Tries to match a URL based on Apache mod_rewrite matching.
     *
     * Returns false if no route matches the URL.
     *
     * @param string $pathinfo The pathinfo to be parsed
     *
     * @return array An array of parameters
     *
     * @throws MethodNotAllowedException If the current method is not allowed
     */
    public function match($pathinfo)
    {
        $parameters = array();
        $defaults = array();
        $allow = array();
        $route = null;

        foreach ($this->denormalizeValues($_SERVER) as $key => $value) {
            $name = $key;

            // skip non-routing variables
            // this improves performance when $_SERVER contains many usual
            // variables like HTTP_*, DOCUMENT_ROOT, REQUEST_URI, ...
            if (false === strpos($name, '_ROUTING_')) {
                continue;
            }

            while (0 === strpos($name, 'REDIRECT_')) {
                $name = substr($name, 9);
            }

            // expect _ROUTING_<type>_<name>
            // or _ROUTING_<type>

            if (0 !== strpos($name, '_ROUTING_')) {
                continue;
            }
            if (false !== $pos = strpos($name, '_', 9)) {
                $type = substr($name, 9, $pos-9);
                $name = substr($name, $pos+1);
            } else {
                $type = substr($name, 9);
            }

            if ('param' === $type) {
                if ('' !== $value) {
                    $parameters[$name] = $value;
                }
            } elseif ('default' === $type) {
                $defaults[$name] = $value;
            } elseif ('route' === $type) {
                $route = $value;
            } elseif ('allow' === $type) {
                $allow[] = $name;
            }

            unset($_SERVER[$key]);
        }

        if (null !== $route) {
            $parameters['_route'] = $route;

            return $this->mergeDefaults($parameters, $defaults);
        } elseif (0 < count($allow)) {
            throw new MethodNotAllowedException($allow);
        } else {
            return parent::match($pathinfo);
        }
    }

    /**
     * Denormalizes an array of values.
     *
     * @param string[] $values
     *
     * @return array
     */
    private function denormalizeValues(array $values)
    {
        $normalizedValues = array();
        foreach ($values as $key => $value) {
            if (preg_match('~^(.*)\[(\d+)\]$~', $key, $matches)) {
                if (!isset($normalizedValues[$matches[1]])) {
                    $normalizedValues[$matches[1]] = array();
                }
                $normalizedValues[$matches[1]][(int) $matches[2]] = $value;
            } else {
                $normalizedValues[$key] = $value;
            }
        }

        return $normalizedValues;
    }
}
PK`�\	�ڗ>pear/Symfony/Component/Routing/Matcher/UrlMatcherInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Matcher;

use Symfony\Component\Routing\RequestContextAwareInterface;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Exception\MethodNotAllowedException;

/**
 * UrlMatcherInterface is the interface that all URL matcher classes must implement.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface UrlMatcherInterface extends RequestContextAwareInterface
{
    /**
     * Tries to match a URL path with a set of routes.
     *
     * If the matcher can not find information, it must throw one of the exceptions documented
     * below.
     *
     * @param string $pathinfo The path info to be parsed (raw format, i.e. not urldecoded)
     *
     * @return array An array of parameters
     *
     * @throws ResourceNotFoundException If the resource could not be found
     * @throws MethodNotAllowedException If the resource was found but the request method is not allowed
     *
     * @api
     */
    public function match($pathinfo);
}
PK`�\r�����?pear/Symfony/Component/Routing/RequestContextAwareInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing;

/**
 * @api
 */
interface RequestContextAwareInterface
{
    /**
     * Sets the request context.
     *
     * @param RequestContext $context The context
     *
     * @api
     */
    public function setContext(RequestContext $context);

    /**
     * Gets the request context.
     *
     * @return RequestContext The context
     *
     * @api
     */
    public function getContext();
}
PK`�\U�cQQ-pear/Symfony/Component/Routing/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Routing\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK	`�\�h�1pear/Symfony/Component/Routing/RequestContext.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing;

use Symfony\Component\HttpFoundation\Request;

/**
 * Holds information about the current request.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class RequestContext
{
    private $baseUrl;
    private $pathInfo;
    private $method;
    private $host;
    private $scheme;
    private $httpPort;
    private $httpsPort;
    private $queryString;

    /**
     * @var array
     */
    private $parameters = array();

    /**
     * Constructor.
     *
     * @param string  $baseUrl      The base URL
     * @param string  $method       The HTTP method
     * @param string  $host         The HTTP host name
     * @param string  $scheme       The HTTP scheme
     * @param integer $httpPort     The HTTP port
     * @param integer $httpsPort    The HTTPS port
     * @param string  $path         The path
     * @param string  $queryString  The query string
     *
     * @api
     */
    public function __construct($baseUrl = '', $method = 'GET', $host = 'localhost', $scheme = 'http', $httpPort = 80, $httpsPort = 443, $path = '/', $queryString = '')
    {
        $this->baseUrl = $baseUrl;
        $this->method = strtoupper($method);
        $this->host = $host;
        $this->scheme = strtolower($scheme);
        $this->httpPort = $httpPort;
        $this->httpsPort = $httpsPort;
        $this->pathInfo = $path;
        $this->queryString = $queryString;
    }

    public function fromRequest(Request $request)
    {
        $this->setBaseUrl($request->getBaseUrl());
        $this->setPathInfo($request->getPathInfo());
        $this->setMethod($request->getMethod());
        $this->setHost($request->getHost());
        $this->setScheme($request->getScheme());
        $this->setHttpPort($request->isSecure() ? $this->httpPort : $request->getPort());
        $this->setHttpsPort($request->isSecure() ? $request->getPort() : $this->httpsPort);
        $this->setQueryString($request->server->get('QUERY_STRING'));
    }

    /**
     * Gets the base URL.
     *
     * @return string The base URL
     */
    public function getBaseUrl()
    {
        return $this->baseUrl;
    }

    /**
     * Sets the base URL.
     *
     * @param string $baseUrl The base URL
     *
     * @api
     */
    public function setBaseUrl($baseUrl)
    {
        $this->baseUrl = $baseUrl;
    }

    /**
     * Gets the path info.
     *
     * @return string The path info
     */
    public function getPathInfo()
    {
        return $this->pathInfo;
    }

    /**
     * Sets the path info.
     *
     * @param string $pathInfo The path info
     */
    public function setPathInfo($pathInfo)
    {
        $this->pathInfo = $pathInfo;
    }

    /**
     * Gets the HTTP method.
     *
     * The method is always an uppercased string.
     *
     * @return string The HTTP method
     */
    public function getMethod()
    {
        return $this->method;
    }

    /**
     * Sets the HTTP method.
     *
     * @param string $method The HTTP method
     *
     * @api
     */
    public function setMethod($method)
    {
        $this->method = strtoupper($method);
    }

    /**
     * Gets the HTTP host.
     *
     * @return string The HTTP host
     */
    public function getHost()
    {
        return $this->host;
    }

    /**
     * Sets the HTTP host.
     *
     * @param string $host The HTTP host
     *
     * @api
     */
    public function setHost($host)
    {
        $this->host = $host;
    }

    /**
     * Gets the HTTP scheme.
     *
     * @return string The HTTP scheme
     */
    public function getScheme()
    {
        return $this->scheme;
    }

    /**
     * Sets the HTTP scheme.
     *
     * @param string $scheme The HTTP scheme
     *
     * @api
     */
    public function setScheme($scheme)
    {
        $this->scheme = strtolower($scheme);
    }

    /**
     * Gets the HTTP port.
     *
     * @return string The HTTP port
     */
    public function getHttpPort()
    {
        return $this->httpPort;
    }

    /**
     * Sets the HTTP port.
     *
     * @param string $httpPort The HTTP port
     *
     * @api
     */
    public function setHttpPort($httpPort)
    {
        $this->httpPort = $httpPort;
    }

    /**
     * Gets the HTTPS port.
     *
     * @return string The HTTPS port
     */
    public function getHttpsPort()
    {
        return $this->httpsPort;
    }

    /**
     * Sets the HTTPS port.
     *
     * @param string $httpsPort The HTTPS port
     *
     * @api
     */
    public function setHttpsPort($httpsPort)
    {
        $this->httpsPort = $httpsPort;
    }

    /**
     * Gets the query string.
     *
     * @return string The query string
     */
    public function getQueryString()
    {
        return $this->queryString;
    }

    /**
     * Sets the query string.
     *
     * @param string $queryString The query string
     *
     * @api
     */
    public function setQueryString($queryString)
    {
        $this->queryString = $queryString;
    }

    /**
     * Returns the parameters.
     *
     * @return array The parameters
     */
    public function getParameters()
    {
        return $this->parameters;
    }

    /**
     * Sets the parameters.
     *
     * This method implements a fluent interface.
     *
     * @param array $parameters The parameters
     *
     * @return Route The current Route instance
     */
    public function setParameters(array $parameters)
    {
        $this->parameters = $parameters;

        return $this;
    }

    /**
     * Gets a parameter value.
     *
     * @param string $name A parameter name
     *
     * @return mixed The parameter value
     */
    public function getParameter($name)
    {
        return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
    }

    /**
     * Checks if a parameter value is set for the given parameter.
     *
     * @param string $name A parameter name
     *
     * @return Boolean true if the parameter value is set, false otherwise
     */
    public function hasParameter($name)
    {
        return array_key_exists($name, $this->parameters);
    }

    /**
     * Sets a parameter value.
     *
     * @param string $name      A parameter name
     * @param mixed  $parameter The parameter value
     *
     * @api
     */
    public function setParameter($name, $parameter)
    {
        $this->parameters[$name] = $parameter;
    }
}
PK	`�\qF��>>9pear/Symfony/Component/Routing/RouteCompilerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing;

/**
 * RouteCompilerInterface is the interface that all RouteCompiler classes must implement.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface RouteCompilerInterface
{
    /**
     * Compiles the current route instance.
     *
     * @param Route $route A Route instance
     *
     * @return CompiledRoute A CompiledRoute instance
     *
     * @throws \LogicException If the Route cannot be compiled because the
     *                         path or host pattern is invalid
     */
    public static function compile(Route $route);
}
PK
`�\P�i{��7pear/Symfony/Component/Routing/Loader/PhpFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Loader;

use Symfony\Component\Config\Loader\FileLoader;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Routing\RouteCollection;

/**
 * PhpFileLoader loads routes from a PHP file.
 *
 * The file must return a RouteCollection instance.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class PhpFileLoader extends FileLoader
{
    /**
     * Loads a PHP file.
     *
     * @param string      $file A PHP file path
     * @param string|null $type The resource type
     *
     * @return RouteCollection A RouteCollection instance
     *
     * @api
     */
    public function load($file, $type = null)
    {
        // the loader variable is exposed to the included file below
        $loader = $this;

        $path = $this->locator->locate($file);
        $this->setCurrentDir(dirname($path));

        $collection = include $path;
        $collection->addResource(new FileResource($path));

        return $collection;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'php' === $type);
    }
}
PK`�\pB�Q Q 8pear/Symfony/Component/Routing/Loader/YamlFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Loader;

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Yaml\Parser as YamlParser;
use Symfony\Component\Config\Loader\FileLoader;

/**
 * YamlFileLoader loads Yaml routing files.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 *
 * @api
 */
class YamlFileLoader extends FileLoader
{
    private static $availableKeys = array(
        'resource', 'type', 'prefix', 'pattern', 'path', 'host', 'schemes', 'methods', 'defaults', 'requirements', 'options', 'condition'
    );
    private $yamlParser;

    /**
     * Loads a Yaml file.
     *
     * @param string      $file A Yaml file path
     * @param string|null $type The resource type
     *
     * @return RouteCollection A RouteCollection instance
     *
     * @throws \InvalidArgumentException When a route can't be parsed because YAML is invalid
     *
     * @api
     */
    public function load($file, $type = null)
    {
        $path = $this->locator->locate($file);

        if (!stream_is_local($path)) {
            throw new \InvalidArgumentException(sprintf('This is not a local file "%s".', $path));
        }

        if (!file_exists($path)) {
            throw new \InvalidArgumentException(sprintf('File "%s" not found.', $path));
        }

        if (null === $this->yamlParser) {
            $this->yamlParser = new YamlParser();
        }

        $config = $this->yamlParser->parse(file_get_contents($path));

        $collection = new RouteCollection();
        $collection->addResource(new FileResource($path));

        // empty file
        if (null === $config) {
            return $collection;
        }

        // not an array
        if (!is_array($config)) {
            throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $path));
        }

        foreach ($config as $name => $config) {
            if (isset($config['pattern'])) {
                if (isset($config['path'])) {
                    throw new \InvalidArgumentException(sprintf('The file "%s" cannot define both a "path" and a "pattern" attribute. Use only "path".', $path));
                }

                $config['path'] = $config['pattern'];
                unset($config['pattern']);
            }

            $this->validate($config, $name, $path);

            if (isset($config['resource'])) {
                $this->parseImport($collection, $config, $path, $file);
            } else {
                $this->parseRoute($collection, $name, $config, $path);
            }
        }

        return $collection;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'yml' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'yaml' === $type);
    }

    /**
     * Parses a route and adds it to the RouteCollection.
     *
     * @param RouteCollection $collection A RouteCollection instance
     * @param string          $name       Route name
     * @param array           $config     Route definition
     * @param string          $path       Full path of the YAML file being processed
     */
    protected function parseRoute(RouteCollection $collection, $name, array $config, $path)
    {
        $defaults = isset($config['defaults']) ? $config['defaults'] : array();
        $requirements = isset($config['requirements']) ? $config['requirements'] : array();
        $options = isset($config['options']) ? $config['options'] : array();
        $host = isset($config['host']) ? $config['host'] : '';
        $schemes = isset($config['schemes']) ? $config['schemes'] : array();
        $methods = isset($config['methods']) ? $config['methods'] : array();
        $condition = isset($config['condition']) ? $config['condition'] : null;

        $route = new Route($config['path'], $defaults, $requirements, $options, $host, $schemes, $methods, $condition);

        $collection->add($name, $route);
    }

    /**
     * Parses an import and adds the routes in the resource to the RouteCollection.
     *
     * @param RouteCollection $collection A RouteCollection instance
     * @param array           $config     Route definition
     * @param string          $path       Full path of the YAML file being processed
     * @param string          $file       Loaded file name
     */
    protected function parseImport(RouteCollection $collection, array $config, $path, $file)
    {
        $type = isset($config['type']) ? $config['type'] : null;
        $prefix = isset($config['prefix']) ? $config['prefix'] : '';
        $defaults = isset($config['defaults']) ? $config['defaults'] : array();
        $requirements = isset($config['requirements']) ? $config['requirements'] : array();
        $options = isset($config['options']) ? $config['options'] : array();
        $host = isset($config['host']) ? $config['host'] : null;
        $condition = isset($config['condition']) ? $config['condition'] : null;
        $schemes = isset($config['schemes']) ? $config['schemes'] : null;
        $methods = isset($config['methods']) ? $config['methods'] : null;

        $this->setCurrentDir(dirname($path));

        $subCollection = $this->import($config['resource'], $type, false, $file);
        /* @var $subCollection RouteCollection */
        $subCollection->addPrefix($prefix);
        if (null !== $host) {
            $subCollection->setHost($host);
        }
        if (null !== $condition) {
            $subCollection->setCondition($condition);
        }
        if (null !== $schemes) {
            $subCollection->setSchemes($schemes);
        }
        if (null !== $methods) {
            $subCollection->setMethods($methods);
        }
        $subCollection->addDefaults($defaults);
        $subCollection->addRequirements($requirements);
        $subCollection->addOptions($options);

        $collection->addCollection($subCollection);
    }

    /**
     * Validates the route configuration.
     *
     * @param array  $config A resource config
     * @param string $name   The config key
     * @param string $path   The loaded file path
     *
     * @throws \InvalidArgumentException If one of the provided config keys is not supported,
     *                                   something is missing or the combination is nonsense
     */
    protected function validate($config, $name, $path)
    {
        if (!is_array($config)) {
            throw new \InvalidArgumentException(sprintf('The definition of "%s" in "%s" must be a YAML array.', $name, $path));
        }
        if ($extraKeys = array_diff(array_keys($config), self::$availableKeys)) {
            throw new \InvalidArgumentException(sprintf(
                'The routing file "%s" contains unsupported keys for "%s": "%s". Expected one of: "%s".',
                $path, $name, implode('", "', $extraKeys), implode('", "', self::$availableKeys)
            ));
        }
        if (isset($config['resource']) && isset($config['path'])) {
            throw new \InvalidArgumentException(sprintf(
                'The routing file "%s" must not specify both the "resource" key and the "path" key for "%s". Choose between an import and a route definition.',
                $path, $name
            ));
        }
        if (!isset($config['resource']) && isset($config['type'])) {
            throw new \InvalidArgumentException(sprintf(
                'The "type" key for the route definition "%s" in "%s" is unsupported. It is only available for imports in combination with the "resource" key.',
                $name, $path
            ));
        }
        if (!isset($config['resource']) && !isset($config['path'])) {
            throw new \InvalidArgumentException(sprintf(
                'You must define a "path" for the route "%s" in file "%s".',
                $name, $path
            ));
        }
    }
}
PK`�\��?�		Cpear/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Loader;

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Config\Resource\DirectoryResource;

/**
 * AnnotationDirectoryLoader loads routing information from annotations set
 * on PHP classes and methods.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class AnnotationDirectoryLoader extends AnnotationFileLoader
{
    /**
     * Loads from annotations from a directory.
     *
     * @param string      $path A directory path
     * @param string|null $type The resource type
     *
     * @return RouteCollection A RouteCollection instance
     *
     * @throws \InvalidArgumentException When the directory does not exist or its routes cannot be parsed
     */
    public function load($path, $type = null)
    {
        $dir = $this->locator->locate($path);

        $collection = new RouteCollection();
        $collection->addResource(new DirectoryResource($dir, '/\.php$/'));
        $files = iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir), \RecursiveIteratorIterator::LEAVES_ONLY));
        usort($files, function (\SplFileInfo $a, \SplFileInfo $b) {
            return (string) $a > (string) $b ? 1 : -1;
        });

        foreach ($files as $file) {
            if (!$file->isFile() || '.php' !== substr($file->getFilename(), -4)) {
                continue;
            }

            if ($class = $this->findClass($file)) {
                $refl = new \ReflectionClass($class);
                if ($refl->isAbstract()) {
                    continue;
                }

                $collection->addCollection($this->loader->load($class, $type));
            }
        }

        return $collection;
    }

    /**
     * {@inheritdoc}
     */
    public function supports($resource, $type = null)
    {
        try {
            $path = $this->locator->locate($resource);
        } catch (\Exception $e) {
            return false;
        }

        return is_string($resource) && is_dir($path) && (!$type || 'annotation' === $type);
    }
}
PK`�\~L�W��?pear/Symfony/Component/Routing/Loader/AnnotationClassLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Loader;

use Doctrine\Common\Annotations\Reader;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\Config\Loader\LoaderResolverInterface;

/**
 * AnnotationClassLoader loads routing information from a PHP class and its methods.
 *
 * You need to define an implementation for the getRouteDefaults() method. Most of the
 * time, this method should define some PHP callable to be called for the route
 * (a controller in MVC speak).
 *
 * The @Route annotation can be set on the class (for global parameters),
 * and on each method.
 *
 * The @Route annotation main value is the route path. The annotation also
 * recognizes several parameters: requirements, options, defaults, schemes,
 * methods, host, and name. The name parameter is mandatory.
 * Here is an example of how you should be able to use it:
 *
 *     /**
 *      * @Route("/Blog")
 *      * /
 *     class Blog
 *     {
 *         /**
 *          * @Route("/", name="blog_index")
 *          * /
 *         public function index()
 *         {
 *         }
 *
 *         /**
 *          * @Route("/{id}", name="blog_post", requirements = {"id" = "\d+"})
 *          * /
 *         public function show()
 *         {
 *         }
 *     }
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class AnnotationClassLoader implements LoaderInterface
{
    /**
     * @var Reader
     */
    protected $reader;

    /**
     * @var string
     */
    protected $routeAnnotationClass = 'Symfony\\Component\\Routing\\Annotation\\Route';

    /**
     * @var integer
     */
    protected $defaultRouteIndex = 0;

    /**
     * Constructor.
     *
     * @param Reader $reader
     */
    public function __construct(Reader $reader)
    {
        $this->reader = $reader;
    }

    /**
     * Sets the annotation class to read route properties from.
     *
     * @param string $class A fully-qualified class name
     */
    public function setRouteAnnotationClass($class)
    {
        $this->routeAnnotationClass = $class;
    }

    /**
     * Loads from annotations from a class.
     *
     * @param string      $class A class name
     * @param string|null $type  The resource type
     *
     * @return RouteCollection A RouteCollection instance
     *
     * @throws \InvalidArgumentException When route can't be parsed
     */
    public function load($class, $type = null)
    {
        if (!class_exists($class)) {
            throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
        }

        $globals = array(
            'path'         => '',
            'requirements' => array(),
            'options'      => array(),
            'defaults'     => array(),
            'schemes'      => array(),
            'methods'      => array(),
            'host'         => '',
            'condition'    => '',
        );

        $class = new \ReflectionClass($class);
        if ($class->isAbstract()) {
            throw new \InvalidArgumentException(sprintf('Annotations from class "%s" cannot be read as it is abstract.', $class));
        }

        if ($annot = $this->reader->getClassAnnotation($class, $this->routeAnnotationClass)) {
            // for BC reasons
            if (null !== $annot->getPath()) {
                $globals['path'] = $annot->getPath();
            } elseif (null !== $annot->getPattern()) {
                $globals['path'] = $annot->getPattern();
            }

            if (null !== $annot->getRequirements()) {
                $globals['requirements'] = $annot->getRequirements();
            }

            if (null !== $annot->getOptions()) {
                $globals['options'] = $annot->getOptions();
            }

            if (null !== $annot->getDefaults()) {
                $globals['defaults'] = $annot->getDefaults();
            }

            if (null !== $annot->getSchemes()) {
                $globals['schemes'] = $annot->getSchemes();
            }

            if (null !== $annot->getMethods()) {
                $globals['methods'] = $annot->getMethods();
            }

            if (null !== $annot->getHost()) {
                $globals['host'] = $annot->getHost();
            }

            if (null !== $annot->getCondition()) {
                $globals['condition'] = $annot->getCondition();
            }
        }

        $collection = new RouteCollection();
        $collection->addResource(new FileResource($class->getFileName()));

        foreach ($class->getMethods() as $method) {
            $this->defaultRouteIndex = 0;
            foreach ($this->reader->getMethodAnnotations($method) as $annot) {
                if ($annot instanceof $this->routeAnnotationClass) {
                    $this->addRoute($collection, $annot, $globals, $class, $method);
                }
            }
        }

        return $collection;
    }

    protected function addRoute(RouteCollection $collection, $annot, $globals, \ReflectionClass $class, \ReflectionMethod $method)
    {
        $name = $annot->getName();
        if (null === $name) {
            $name = $this->getDefaultRouteName($class, $method);
        }

        $defaults = array_replace($globals['defaults'], $annot->getDefaults());
        foreach ($method->getParameters() as $param) {
            if (!isset($defaults[$param->getName()]) && $param->isOptional()) {
                $defaults[$param->getName()] = $param->getDefaultValue();
            }
        }
        $requirements = array_replace($globals['requirements'], $annot->getRequirements());
        $options = array_replace($globals['options'], $annot->getOptions());
        $schemes = array_replace($globals['schemes'], $annot->getSchemes());
        $methods = array_replace($globals['methods'], $annot->getMethods());

        $host = $annot->getHost();
        if (null === $host) {
            $host = $globals['host'];
        }

        $condition = $annot->getCondition();
        if (null === $condition) {
            $condition = $globals['condition'];
        }

        $route = new Route($globals['path'].$annot->getPath(), $defaults, $requirements, $options, $host, $schemes, $methods, $condition);

        $this->configureRoute($route, $class, $method, $annot);

        $collection->add($name, $route);
    }

    /**
     * {@inheritdoc}
     */
    public function supports($resource, $type = null)
    {
        return is_string($resource) && preg_match('/^(?:\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)+$/', $resource) && (!$type || 'annotation' === $type);
    }

    /**
     * {@inheritdoc}
     */
    public function setResolver(LoaderResolverInterface $resolver)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function getResolver()
    {
    }

    /**
     * Gets the default route name for a class method.
     *
     * @param \ReflectionClass  $class
     * @param \ReflectionMethod $method
     *
     * @return string
     */
    protected function getDefaultRouteName(\ReflectionClass $class, \ReflectionMethod $method)
    {
        $name = strtolower(str_replace('\\', '_', $class->name).'_'.$method->name);
        if ($this->defaultRouteIndex > 0) {
            $name .= '_'.$this->defaultRouteIndex;
        }
        $this->defaultRouteIndex++;

        return $name;
    }

    abstract protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot);
}
PK`�\?-[��	�	Dpear/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsdnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema xmlns="http://symfony.com/schema/routing"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://symfony.com/schema/routing"
    elementFormDefault="qualified">

  <xsd:annotation>
    <xsd:documentation><![CDATA[
      Symfony XML Routing Schema, version 1.0
      Authors: Fabien Potencier, Tobias Schultze

      This scheme defines the elements and attributes that can be used to define
      routes. A route maps an HTTP request to a set of configuration variables.
    ]]></xsd:documentation>
  </xsd:annotation>

  <xsd:element name="routes" type="routes" />

  <xsd:complexType name="routes">
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="import" type="import" />
      <xsd:element name="route" type="route" />
    </xsd:choice>
  </xsd:complexType>

  <xsd:group name="configs">
    <xsd:choice>
      <xsd:element name="default" nillable="true" type="element" />
      <xsd:element name="requirement" type="element" />
      <xsd:element name="option" type="element" />
      <xsd:element name="condition" type="condition" />
    </xsd:choice>
  </xsd:group>

  <xsd:complexType name="route">
    <xsd:group ref="configs" minOccurs="0" maxOccurs="unbounded" />

    <xsd:attribute name="id" type="xsd:string" use="required" />
    <xsd:attribute name="path" type="xsd:string" />
    <xsd:attribute name="pattern" type="xsd:string" />
    <xsd:attribute name="host" type="xsd:string" />
    <xsd:attribute name="schemes" type="xsd:string" />
    <xsd:attribute name="methods" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="import">
    <xsd:group ref="configs" minOccurs="0" maxOccurs="unbounded" />

    <xsd:attribute name="resource" type="xsd:string" use="required" />
    <xsd:attribute name="type" type="xsd:string" />
    <xsd:attribute name="prefix" type="xsd:string" />
    <xsd:attribute name="host" type="xsd:string" />
    <xsd:attribute name="schemes" type="xsd:string" />
    <xsd:attribute name="methods" type="xsd:string" />
  </xsd:complexType>

  <xsd:complexType name="element">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute name="key" type="xsd:string" use="required" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>

  <xsd:simpleType name="condition">
    <xsd:restriction base="xsd:string">
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>
PK
`�\n���hh7pear/Symfony/Component/Routing/Loader/ClosureLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Loader;

use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\Routing\RouteCollection;

/**
 * ClosureLoader loads routes from a PHP closure.
 *
 * The Closure must return a RouteCollection instance.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ClosureLoader extends Loader
{
    /**
     * Loads a Closure.
     *
     * @param \Closure    $closure A Closure
     * @param string|null $type    The resource type
     *
     * @return RouteCollection A RouteCollection instance
     *
     * @api
     */
    public function load($closure, $type = null)
    {
        return call_user_func($closure);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function supports($resource, $type = null)
    {
        return $resource instanceof \Closure && (!$type || 'closure' === $type);
    }
}
PK`�\أ2D$D$7pear/Symfony/Component/Routing/Loader/XmlFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Loader;

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Config\Loader\FileLoader;
use Symfony\Component\Config\Util\XmlUtils;

/**
 * XmlFileLoader loads XML routing files.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 *
 * @api
 */
class XmlFileLoader extends FileLoader
{
    const NAMESPACE_URI = 'http://symfony.com/schema/routing';
    const SCHEME_PATH = '/schema/routing/routing-1.0.xsd';

    /**
     * Loads an XML file.
     *
     * @param string      $file An XML file path
     * @param string|null $type The resource type
     *
     * @return RouteCollection A RouteCollection instance
     *
     * @throws \InvalidArgumentException When the file cannot be loaded or when the XML cannot be
     *                                   parsed because it does not validate against the scheme.
     *
     * @api
     */
    public function load($file, $type = null)
    {
        $path = $this->locator->locate($file);

        $xml = $this->loadFile($path);

        $collection = new RouteCollection();
        $collection->addResource(new FileResource($path));

        // process routes and imports
        foreach ($xml->documentElement->childNodes as $node) {
            if (!$node instanceof \DOMElement) {
                continue;
            }

            $this->parseNode($collection, $node, $path, $file);
        }

        return $collection;
    }

    /**
     * Parses a node from a loaded XML file.
     *
     * @param RouteCollection $collection Collection to associate with the node
     * @param \DOMElement     $node       Element to parse
     * @param string          $path       Full path of the XML file being processed
     * @param string          $file       Loaded file name
     *
     * @throws \InvalidArgumentException When the XML is invalid
     */
    protected function parseNode(RouteCollection $collection, \DOMElement $node, $path, $file)
    {
        if (self::NAMESPACE_URI !== $node->namespaceURI) {
            return;
        }

        switch ($node->localName) {
            case 'route':
                $this->parseRoute($collection, $node, $path);
                break;
            case 'import':
                $this->parseImport($collection, $node, $path, $file);
                break;
            default:
                throw new \InvalidArgumentException(sprintf('Unknown tag "%s" used in file "%s". Expected "route" or "import".', $node->localName, $path));
        }
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'xml' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'xml' === $type);
    }

    /**
     * Parses a route and adds it to the RouteCollection.
     *
     * @param RouteCollection $collection RouteCollection instance
     * @param \DOMElement     $node       Element to parse that represents a Route
     * @param string          $path       Full path of the XML file being processed
     *
     * @throws \InvalidArgumentException When the XML is invalid
     */
    protected function parseRoute(RouteCollection $collection, \DOMElement $node, $path)
    {
        if ('' === ($id = $node->getAttribute('id')) || (!$node->hasAttribute('pattern') && !$node->hasAttribute('path'))) {
            throw new \InvalidArgumentException(sprintf('The <route> element in file "%s" must have an "id" and a "path" attribute.', $path));
        }

        if ($node->hasAttribute('pattern')) {
            if ($node->hasAttribute('path')) {
                throw new \InvalidArgumentException(sprintf('The <route> element in file "%s" cannot define both a "path" and a "pattern" attribute. Use only "path".', $path));
            }

            $node->setAttribute('path', $node->getAttribute('pattern'));
            $node->removeAttribute('pattern');
        }

        $schemes = preg_split('/[\s,\|]++/', $node->getAttribute('schemes'), -1, PREG_SPLIT_NO_EMPTY);
        $methods = preg_split('/[\s,\|]++/', $node->getAttribute('methods'), -1, PREG_SPLIT_NO_EMPTY);

        list($defaults, $requirements, $options, $condition) = $this->parseConfigs($node, $path);

        $route = new Route($node->getAttribute('path'), $defaults, $requirements, $options, $node->getAttribute('host'), $schemes, $methods, $condition);
        $collection->add($id, $route);
    }

    /**
     * Parses an import and adds the routes in the resource to the RouteCollection.
     *
     * @param RouteCollection $collection RouteCollection instance
     * @param \DOMElement     $node       Element to parse that represents a Route
     * @param string          $path       Full path of the XML file being processed
     * @param string          $file       Loaded file name
     *
     * @throws \InvalidArgumentException When the XML is invalid
     */
    protected function parseImport(RouteCollection $collection, \DOMElement $node, $path, $file)
    {
        if ('' === $resource = $node->getAttribute('resource')) {
            throw new \InvalidArgumentException(sprintf('The <import> element in file "%s" must have a "resource" attribute.', $path));
        }

        $type = $node->getAttribute('type');
        $prefix = $node->getAttribute('prefix');
        $host = $node->hasAttribute('host') ? $node->getAttribute('host') : null;
        $schemes = $node->hasAttribute('schemes') ? preg_split('/[\s,\|]++/', $node->getAttribute('schemes'), -1, PREG_SPLIT_NO_EMPTY) : null;
        $methods = $node->hasAttribute('methods') ? preg_split('/[\s,\|]++/', $node->getAttribute('methods'), -1, PREG_SPLIT_NO_EMPTY) : null;

        list($defaults, $requirements, $options, $condition) = $this->parseConfigs($node, $path);

        $this->setCurrentDir(dirname($path));

        $subCollection = $this->import($resource, ('' !== $type ? $type : null), false, $file);
        /* @var $subCollection RouteCollection */
        $subCollection->addPrefix($prefix);
        if (null !== $host) {
            $subCollection->setHost($host);
        }
        if (null !== $condition) {
            $subCollection->setCondition($condition);
        }
        if (null !== $schemes) {
            $subCollection->setSchemes($schemes);
        }
        if (null !== $methods) {
            $subCollection->setMethods($methods);
        }
        $subCollection->addDefaults($defaults);
        $subCollection->addRequirements($requirements);
        $subCollection->addOptions($options);

        $collection->addCollection($subCollection);
    }

    /**
     * Loads an XML file.
     *
     * @param string $file An XML file path
     *
     * @return \DOMDocument
     *
     * @throws \InvalidArgumentException When loading of XML file fails because of syntax errors
     *                                   or when the XML structure is not as expected by the scheme -
     *                                   see validate()
     */
    protected function loadFile($file)
    {
        return XmlUtils::loadFile($file, __DIR__.static::SCHEME_PATH);
    }

    /**
     * Parses the config elements (default, requirement, option).
     *
     * @param \DOMElement $node Element to parse that contains the configs
     * @param string      $path Full path of the XML file being processed
     *
     * @return array An array with the defaults as first item, requirements as second and options as third.
     *
     * @throws \InvalidArgumentException When the XML is invalid
     */
    private function parseConfigs(\DOMElement $node, $path)
    {
        $defaults = array();
        $requirements = array();
        $options = array();
        $condition = null;

        foreach ($node->getElementsByTagNameNS(self::NAMESPACE_URI, '*') as $n) {
            switch ($n->localName) {
                case 'default':
                    if ($n->hasAttribute('xsi:nil') && 'true' == $n->getAttribute('xsi:nil')) {
                        $defaults[$n->getAttribute('key')] = null;
                    } else {
                        $defaults[$n->getAttribute('key')] = trim($n->textContent);
                    }

                    break;
                case 'requirement':
                    $requirements[$n->getAttribute('key')] = trim($n->textContent);
                    break;
                case 'option':
                    $options[$n->getAttribute('key')] = trim($n->textContent);
                    break;
                case 'condition':
                    $condition = trim($n->textContent);
                    break;
                default:
                    throw new \InvalidArgumentException(sprintf('Unknown tag "%s" used in file "%s". Expected "default", "requirement" or "option".', $n->localName, $path));
            }
        }

        return array($defaults, $requirements, $options, $condition);
    }
}
PK`�\~ޟ
�
>pear/Symfony/Component/Routing/Loader/AnnotationFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Loader;

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Config\Loader\FileLoader;
use Symfony\Component\Config\FileLocatorInterface;

/**
 * AnnotationFileLoader loads routing information from annotations set
 * on a PHP class and its methods.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class AnnotationFileLoader extends FileLoader
{
    protected $loader;

    /**
     * Constructor.
     *
     * @param FileLocatorInterface  $locator A FileLocator instance
     * @param AnnotationClassLoader $loader  An AnnotationClassLoader instance
     *
     * @throws \RuntimeException
     */
    public function __construct(FileLocatorInterface $locator, AnnotationClassLoader $loader)
    {
        if (!function_exists('token_get_all')) {
            throw new \RuntimeException('The Tokenizer extension is required for the routing annotation loaders.');
        }

        parent::__construct($locator);

        $this->loader = $loader;
    }

    /**
     * Loads from annotations from a file.
     *
     * @param string      $file A PHP file path
     * @param string|null $type The resource type
     *
     * @return RouteCollection A RouteCollection instance
     *
     * @throws \InvalidArgumentException When the file does not exist or its routes cannot be parsed
     */
    public function load($file, $type = null)
    {
        $path = $this->locator->locate($file);

        $collection = new RouteCollection();
        if ($class = $this->findClass($path)) {
            $collection->addResource(new FileResource($path));
            $collection->addCollection($this->loader->load($class, $type));
        }

        return $collection;
    }

    /**
     * {@inheritdoc}
     */
    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'annotation' === $type);
    }

    /**
     * Returns the full class name for the first class in the file.
     *
     * @param string $file A PHP file path
     *
     * @return string|false Full class name if found, false otherwise
     */
    protected function findClass($file)
    {
        $class = false;
        $namespace = false;
        $tokens = token_get_all(file_get_contents($file));
        for ($i = 0, $count = count($tokens); $i < $count; $i++) {
            $token = $tokens[$i];

            if (!is_array($token)) {
                continue;
            }

            if (true === $class && T_STRING === $token[0]) {
                return $namespace.'\\'.$token[1];
            }

            if (true === $namespace && T_STRING === $token[0]) {
                $namespace = '';
                do {
                    $namespace .= $token[1];
                    $token = $tokens[++$i];
                } while ($i < $count && is_array($token) && in_array($token[0], array(T_NS_SEPARATOR, T_STRING)));
            }

            if (T_CLASS === $token[0]) {
                $class = true;
            }

            if (T_NAMESPACE === $token[0]) {
                $namespace = true;
            }
        }

        return false;
    }
}
PK`�\nj�W��Cpear/Symfony/Component/Routing/Exception/RouteNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Exception;

/**
 * Exception thrown when a route does not exist
 *
 * @author Alexandre Salomé <alexandre.salome@gmail.com>
 *
 * @api
 */
class RouteNotFoundException extends \InvalidArgumentException implements ExceptionInterface
{
}
PK`�\?�]�//Fpear/Symfony/Component/Routing/Exception/ResourceNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Exception;

/**
 * The resource was not found.
 *
 * This exception should trigger an HTTP 404 response in your application code.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 *
 * @api
 */
class ResourceNotFoundException extends \RuntimeException implements ExceptionInterface
{
}
PK`�\��)���?pear/Symfony/Component/Routing/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Exception;

/**
 * ExceptionInterface
 *
 * @author Alexandre Salomé <alexandre.salome@gmail.com>
 *
 * @api
 */
interface ExceptionInterface
{
}
PK`�\����JJFpear/Symfony/Component/Routing/Exception/MethodNotAllowedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Exception;

/**
 * The resource was found but the request method is not allowed.
 *
 * This exception should trigger an HTTP 405 response in your application code.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 *
 * @api
 */
class MethodNotAllowedException extends \RuntimeException implements ExceptionInterface
{
    /**
     * @var array
     */
    protected $allowedMethods = array();

    public function __construct(array $allowedMethods, $message = null, $code = 0, \Exception $previous = null)
    {
        $this->allowedMethods = array_map('strtoupper', $allowedMethods);

        parent::__construct($message, $code, $previous);
    }

    /**
     * Gets the allowed HTTP methods.
     *
     * @return array
     */
    public function getAllowedMethods()
    {
        return $this->allowedMethods;
    }
}
PK`�\����==Ppear/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Exception;

/**
 * Exception thrown when a route cannot be generated because of missing
 * mandatory parameters.
 *
 * @author Alexandre Salomé <alexandre.salome@gmail.com>
 *
 * @api
 */
class MissingMandatoryParametersException extends \InvalidArgumentException implements ExceptionInterface
{
}
PK`�\j`j�Fpear/Symfony/Component/Routing/Exception/InvalidParameterException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Exception;

/**
 * Exception thrown when a parameter is not valid
 *
 * @author Alexandre Salomé <alexandre.salome@gmail.com>
 *
 * @api
 */
class InvalidParameterException extends \InvalidArgumentException implements ExceptionInterface
{
}
PK`�\��^�==(pear/Symfony/Component/Routing/Route.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing;

/**
 * A Route describes a route and its parameters.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 *
 * @api
 */
class Route implements \Serializable
{
    /**
     * @var string
     */
    private $path = '/';

    /**
     * @var string
     */
    private $host = '';

    /**
     * @var array
     */
    private $schemes = array();

    /**
     * @var array
     */
    private $methods = array();

    /**
     * @var array
     */
    private $defaults = array();

    /**
     * @var array
     */
    private $requirements = array();

    /**
     * @var array
     */
    private $options = array();

    /**
     * @var null|CompiledRoute
     */
    private $compiled;

    private $condition;

    /**
     * Constructor.
     *
     * Available options:
     *
     *  * compiler_class: A class name able to compile this route instance (RouteCompiler by default)
     *
     * @param string       $path         The path pattern to match
     * @param array        $defaults     An array of default parameter values
     * @param array        $requirements An array of requirements for parameters (regexes)
     * @param array        $options      An array of options
     * @param string       $host         The host pattern to match
     * @param string|array $schemes      A required URI scheme or an array of restricted schemes
     * @param string|array $methods      A required HTTP method or an array of restricted methods
     * @param string       $condition    A condition that should evaluate to true for the route to match
     *
     * @api
     */
    public function __construct($path, array $defaults = array(), array $requirements = array(), array $options = array(), $host = '', $schemes = array(), $methods = array(), $condition = null)
    {
        $this->setPath($path);
        $this->setDefaults($defaults);
        $this->setRequirements($requirements);
        $this->setOptions($options);
        $this->setHost($host);
        // The conditions make sure that an initial empty $schemes/$methods does not override the corresponding requirement.
        // They can be removed when the BC layer is removed.
        if ($schemes) {
            $this->setSchemes($schemes);
        }
        if ($methods) {
            $this->setMethods($methods);
        }
        $this->setCondition($condition);
    }

    public function serialize()
    {
        return serialize(array(
            'path'         => $this->path,
            'host'         => $this->host,
            'defaults'     => $this->defaults,
            'requirements' => $this->requirements,
            'options'      => $this->options,
            'schemes'      => $this->schemes,
            'methods'      => $this->methods,
            'condition'    => $this->condition,
        ));
    }

    public function unserialize($data)
    {
        $data = unserialize($data);
        $this->path = $data['path'];
        $this->host = $data['host'];
        $this->defaults = $data['defaults'];
        $this->requirements = $data['requirements'];
        $this->options = $data['options'];
        $this->schemes = $data['schemes'];
        $this->methods = $data['methods'];
        $this->condition = $data['condition'];
    }

    /**
     * Returns the pattern for the path.
     *
     * @return string The pattern
     *
     * @deprecated Deprecated in 2.2, to be removed in 3.0. Use getPath instead.
     */
    public function getPattern()
    {
        return $this->path;
    }

    /**
     * Sets the pattern for the path.
     *
     * This method implements a fluent interface.
     *
     * @param string $pattern The path pattern
     *
     * @return Route The current Route instance
     *
     * @deprecated Deprecated in 2.2, to be removed in 3.0. Use setPath instead.
     */
    public function setPattern($pattern)
    {
        return $this->setPath($pattern);
    }

    /**
     * Returns the pattern for the path.
     *
     * @return string The path pattern
     */
    public function getPath()
    {
        return $this->path;
    }

    /**
     * Sets the pattern for the path.
     *
     * This method implements a fluent interface.
     *
     * @param string $pattern The path pattern
     *
     * @return Route The current Route instance
     */
    public function setPath($pattern)
    {
        // A pattern must start with a slash and must not have multiple slashes at the beginning because the
        // generated path for this route would be confused with a network path, e.g. '//domain.com/path'.
        $this->path = '/'.ltrim(trim($pattern), '/');
        $this->compiled = null;

        return $this;
    }

    /**
     * Returns the pattern for the host.
     *
     * @return string The host pattern
     */
    public function getHost()
    {
        return $this->host;
    }

    /**
     * Sets the pattern for the host.
     *
     * This method implements a fluent interface.
     *
     * @param string $pattern The host pattern
     *
     * @return Route The current Route instance
     */
    public function setHost($pattern)
    {
        $this->host = (string) $pattern;
        $this->compiled = null;

        return $this;
    }

    /**
     * Returns the lowercased schemes this route is restricted to.
     * So an empty array means that any scheme is allowed.
     *
     * @return array The schemes
     */
    public function getSchemes()
    {
        return $this->schemes;
    }

    /**
     * Sets the schemes (e.g. 'https') this route is restricted to.
     * So an empty array means that any scheme is allowed.
     *
     * This method implements a fluent interface.
     *
     * @param string|array $schemes The scheme or an array of schemes
     *
     * @return Route The current Route instance
     */
    public function setSchemes($schemes)
    {
        $this->schemes = array_map('strtolower', (array) $schemes);

        // this is to keep BC and will be removed in a future version
        if ($this->schemes) {
            $this->requirements['_scheme'] = implode('|', $this->schemes);
        } else {
            unset($this->requirements['_scheme']);
        }

        $this->compiled = null;

        return $this;
    }

    /**
     * Returns the uppercased HTTP methods this route is restricted to.
     * So an empty array means that any method is allowed.
     *
     * @return array The schemes
     */
    public function getMethods()
    {
        return $this->methods;
    }

    /**
     * Sets the HTTP methods (e.g. 'POST') this route is restricted to.
     * So an empty array means that any method is allowed.
     *
     * This method implements a fluent interface.
     *
     * @param string|array $methods The method or an array of methods
     *
     * @return Route The current Route instance
     */
    public function setMethods($methods)
    {
        $this->methods = array_map('strtoupper', (array) $methods);

        // this is to keep BC and will be removed in a future version
        if ($this->methods) {
            $this->requirements['_method'] = implode('|', $this->methods);
        } else {
            unset($this->requirements['_method']);
        }

        $this->compiled = null;

        return $this;
    }

    /**
     * Returns the options.
     *
     * @return array The options
     */
    public function getOptions()
    {
        return $this->options;
    }

    /**
     * Sets the options.
     *
     * This method implements a fluent interface.
     *
     * @param array $options The options
     *
     * @return Route The current Route instance
     */
    public function setOptions(array $options)
    {
        $this->options = array(
            'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler',
        );

        return $this->addOptions($options);
    }

    /**
     * Adds options.
     *
     * This method implements a fluent interface.
     *
     * @param array $options The options
     *
     * @return Route The current Route instance
     */
    public function addOptions(array $options)
    {
        foreach ($options as $name => $option) {
            $this->options[$name] = $option;
        }
        $this->compiled = null;

        return $this;
    }

    /**
     * Sets an option value.
     *
     * This method implements a fluent interface.
     *
     * @param string $name  An option name
     * @param mixed  $value The option value
     *
     * @return Route The current Route instance
     *
     * @api
     */
    public function setOption($name, $value)
    {
        $this->options[$name] = $value;
        $this->compiled = null;

        return $this;
    }

    /**
     * Get an option value.
     *
     * @param string $name An option name
     *
     * @return mixed The option value or null when not given
     */
    public function getOption($name)
    {
        return isset($this->options[$name]) ? $this->options[$name] : null;
    }

    /**
     * Checks if an option has been set
     *
     * @param string $name An option name
     *
     * @return Boolean true if the option is set, false otherwise
     */
    public function hasOption($name)
    {
        return array_key_exists($name, $this->options);
    }

    /**
     * Returns the defaults.
     *
     * @return array The defaults
     */
    public function getDefaults()
    {
        return $this->defaults;
    }

    /**
     * Sets the defaults.
     *
     * This method implements a fluent interface.
     *
     * @param array $defaults The defaults
     *
     * @return Route The current Route instance
     */
    public function setDefaults(array $defaults)
    {
        $this->defaults = array();

        return $this->addDefaults($defaults);
    }

    /**
     * Adds defaults.
     *
     * This method implements a fluent interface.
     *
     * @param array $defaults The defaults
     *
     * @return Route The current Route instance
     */
    public function addDefaults(array $defaults)
    {
        foreach ($defaults as $name => $default) {
            $this->defaults[$name] = $default;
        }
        $this->compiled = null;

        return $this;
    }

    /**
     * Gets a default value.
     *
     * @param string $name A variable name
     *
     * @return mixed The default value or null when not given
     */
    public function getDefault($name)
    {
        return isset($this->defaults[$name]) ? $this->defaults[$name] : null;
    }

    /**
     * Checks if a default value is set for the given variable.
     *
     * @param string $name A variable name
     *
     * @return Boolean true if the default value is set, false otherwise
     */
    public function hasDefault($name)
    {
        return array_key_exists($name, $this->defaults);
    }

    /**
     * Sets a default value.
     *
     * @param string $name    A variable name
     * @param mixed  $default The default value
     *
     * @return Route The current Route instance
     *
     * @api
     */
    public function setDefault($name, $default)
    {
        $this->defaults[$name] = $default;
        $this->compiled = null;

        return $this;
    }

    /**
     * Returns the requirements.
     *
     * @return array The requirements
     */
    public function getRequirements()
    {
        return $this->requirements;
    }

    /**
     * Sets the requirements.
     *
     * This method implements a fluent interface.
     *
     * @param array $requirements The requirements
     *
     * @return Route The current Route instance
     */
    public function setRequirements(array $requirements)
    {
        $this->requirements = array();

        return $this->addRequirements($requirements);
    }

    /**
     * Adds requirements.
     *
     * This method implements a fluent interface.
     *
     * @param array $requirements The requirements
     *
     * @return Route The current Route instance
     */
    public function addRequirements(array $requirements)
    {
        foreach ($requirements as $key => $regex) {
            $this->requirements[$key] = $this->sanitizeRequirement($key, $regex);
        }
        $this->compiled = null;

        return $this;
    }

    /**
     * Returns the requirement for the given key.
     *
     * @param string $key The key
     *
     * @return string|null The regex or null when not given
     */
    public function getRequirement($key)
    {
        return isset($this->requirements[$key]) ? $this->requirements[$key] : null;
    }

    /**
     * Checks if a requirement is set for the given key.
     *
     * @param string $key A variable name
     *
     * @return Boolean true if a requirement is specified, false otherwise
     */
    public function hasRequirement($key)
    {
        return array_key_exists($key, $this->requirements);
    }

    /**
     * Sets a requirement for the given key.
     *
     * @param string $key   The key
     * @param string $regex The regex
     *
     * @return Route The current Route instance
     *
     * @api
     */
    public function setRequirement($key, $regex)
    {
        $this->requirements[$key] = $this->sanitizeRequirement($key, $regex);
        $this->compiled = null;

        return $this;
    }

    /**
     * Returns the condition.
     *
     * @return string The condition
     */
    public function getCondition()
    {
        return $this->condition;
    }

    /**
     * Sets the condition.
     *
     * This method implements a fluent interface.
     *
     * @param string $condition The condition
     *
     * @return Route The current Route instance
     */
    public function setCondition($condition)
    {
        $this->condition = (string) $condition;
        $this->compiled = null;

        return $this;
    }

    /**
     * Compiles the route.
     *
     * @return CompiledRoute A CompiledRoute instance
     *
     * @throws \LogicException If the Route cannot be compiled because the
     *                         path or host pattern is invalid
     *
     * @see RouteCompiler which is responsible for the compilation process
     */
    public function compile()
    {
        if (null !== $this->compiled) {
            return $this->compiled;
        }

        $class = $this->getOption('compiler_class');

        return $this->compiled = $class::compile($this);
    }

    private function sanitizeRequirement($key, $regex)
    {
        if (!is_string($regex)) {
            throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" must be a string.', $key));
        }

        if ('' !== $regex && '^' === $regex[0]) {
            $regex = (string) substr($regex, 1); // returns false for a single character
        }

        if ('$' === substr($regex, -1)) {
            $regex = substr($regex, 0, -1);
        }

        if ('' === $regex) {
            throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" cannot be empty.', $key));
        }

        // this is to keep BC and will be removed in a future version
        if ('_scheme' === $key) {
            $this->setSchemes(explode('|', $regex));
        } elseif ('_method' === $key) {
            $this->setMethods(explode('|', $regex));
        }

        return $regex;
    }
}
PK`�\�<ѹ�0pear/Symfony/Component/Routing/CompiledRoute.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing;

/**
 * CompiledRoutes are returned by the RouteCompiler class.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class CompiledRoute
{
    private $variables;
    private $tokens;
    private $staticPrefix;
    private $regex;
    private $pathVariables;
    private $hostVariables;
    private $hostRegex;
    private $hostTokens;

    /**
     * Constructor.
     *
     * @param string      $staticPrefix       The static prefix of the compiled route
     * @param string      $regex              The regular expression to use to match this route
     * @param array       $tokens             An array of tokens to use to generate URL for this route
     * @param array       $pathVariables      An array of path variables
     * @param string|null $hostRegex          Host regex
     * @param array       $hostTokens         Host tokens
     * @param array       $hostVariables      An array of host variables
     * @param array       $variables          An array of variables (variables defined in the path and in the host patterns)
     */
    public function __construct($staticPrefix, $regex, array $tokens, array $pathVariables, $hostRegex = null, array $hostTokens = array(), array $hostVariables = array(), array $variables = array())
    {
        $this->staticPrefix = (string) $staticPrefix;
        $this->regex = $regex;
        $this->tokens = $tokens;
        $this->pathVariables = $pathVariables;
        $this->hostRegex = $hostRegex;
        $this->hostTokens = $hostTokens;
        $this->hostVariables = $hostVariables;
        $this->variables = $variables;
    }

    /**
     * Returns the static prefix.
     *
     * @return string The static prefix
     */
    public function getStaticPrefix()
    {
        return $this->staticPrefix;
    }

    /**
     * Returns the regex.
     *
     * @return string The regex
     */
    public function getRegex()
    {
        return $this->regex;
    }

    /**
     * Returns the host regex
     *
     * @return string|null The host regex or null
     */
    public function getHostRegex()
    {
        return $this->hostRegex;
    }

    /**
     * Returns the tokens.
     *
     * @return array The tokens
     */
    public function getTokens()
    {
        return $this->tokens;
    }

    /**
     * Returns the host tokens.
     *
     * @return array The tokens
     */
    public function getHostTokens()
    {
        return $this->hostTokens;
    }

    /**
     * Returns the variables.
     *
     * @return array The variables
     */
    public function getVariables()
    {
        return $this->variables;
    }

    /**
     * Returns the path variables.
     *
     * @return array The variables
     */
    public function getPathVariables()
    {
        return $this->pathVariables;
    }

    /**
     * Returns the host variables.
     *
     * @return array The variables
     */
    public function getHostVariables()
    {
        return $this->hostVariables;
    }

}
PK`�\����'�'0pear/Symfony/Component/Routing/RouteCompiler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing;

/**
 * RouteCompiler compiles Route instances to CompiledRoute instances.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 */
class RouteCompiler implements RouteCompilerInterface
{
    const REGEX_DELIMITER = '#';

    /**
     * This string defines the characters that are automatically considered separators in front of
     * optional placeholders (with default and no static text following). Such a single separator
     * can be left out together with the optional placeholder from matching and generating URLs.
     */
    const SEPARATORS = '/,;.:-_~+*=@|';

    /**
     * {@inheritDoc}
     *
     * @throws \LogicException  If a variable is referenced more than once
     * @throws \DomainException If a variable name is numeric because PHP raises an error for such
     *                          subpatterns in PCRE and thus would break matching, e.g. "(?P<123>.+)".
     */
    public static function compile(Route $route)
    {
        $staticPrefix = null;
        $hostVariables = array();
        $pathVariables = array();
        $variables = array();
        $tokens = array();
        $regex = null;
        $hostRegex = null;
        $hostTokens = array();

        if ('' !== $host = $route->getHost()) {
            $result = self::compilePattern($route, $host, true);

            $hostVariables = $result['variables'];
            $variables = array_merge($variables, $hostVariables);

            $hostTokens = $result['tokens'];
            $hostRegex = $result['regex'];
        }

        $path = $route->getPath();

        $result = self::compilePattern($route, $path, false);

        $staticPrefix = $result['staticPrefix'];

        $pathVariables = $result['variables'];
        $variables = array_merge($variables, $pathVariables);

        $tokens = $result['tokens'];
        $regex = $result['regex'];

        return new CompiledRoute(
            $staticPrefix,
            $regex,
            $tokens,
            $pathVariables,
            $hostRegex,
            $hostTokens,
            $hostVariables,
            array_unique($variables)
        );
    }

    private static function compilePattern(Route $route, $pattern, $isHost)
    {
        $tokens = array();
        $variables = array();
        $matches = array();
        $pos = 0;
        $defaultSeparator = $isHost ? '.' : '/';

        // Match all variables enclosed in "{}" and iterate over them. But we only want to match the innermost variable
        // in case of nested "{}", e.g. {foo{bar}}. This in ensured because \w does not match "{" or "}" itself.
        preg_match_all('#\{\w+\}#', $pattern, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
        foreach ($matches as $match) {
            $varName = substr($match[0][0], 1, -1);
            // get all static text preceding the current variable
            $precedingText = substr($pattern, $pos, $match[0][1] - $pos);
            $pos = $match[0][1] + strlen($match[0][0]);
            $precedingChar = strlen($precedingText) > 0 ? substr($precedingText, -1) : '';
            $isSeparator = '' !== $precedingChar && false !== strpos(static::SEPARATORS, $precedingChar);

            if (is_numeric($varName)) {
                throw new \DomainException(sprintf('Variable name "%s" cannot be numeric in route pattern "%s". Please use a different name.', $varName, $pattern));
            }
            if (in_array($varName, $variables)) {
                throw new \LogicException(sprintf('Route pattern "%s" cannot reference variable name "%s" more than once.', $pattern, $varName));
            }

            if ($isSeparator && strlen($precedingText) > 1) {
                $tokens[] = array('text', substr($precedingText, 0, -1));
            } elseif (!$isSeparator && strlen($precedingText) > 0) {
                $tokens[] = array('text', $precedingText);
            }

            $regexp = $route->getRequirement($varName);
            if (null === $regexp) {
                $followingPattern = (string) substr($pattern, $pos);
                // Find the next static character after the variable that functions as a separator. By default, this separator and '/'
                // are disallowed for the variable. This default requirement makes sure that optional variables can be matched at all
                // and that the generating-matching-combination of URLs unambiguous, i.e. the params used for generating the URL are
                // the same that will be matched. Example: new Route('/{page}.{_format}', array('_format' => 'html'))
                // If {page} would also match the separating dot, {_format} would never match as {page} will eagerly consume everything.
                // Also even if {_format} was not optional the requirement prevents that {page} matches something that was originally
                // part of {_format} when generating the URL, e.g. _format = 'mobile.html'.
                $nextSeparator = self::findNextSeparator($followingPattern);
                $regexp = sprintf(
                    '[^%s%s]+',
                    preg_quote($defaultSeparator, self::REGEX_DELIMITER),
                    $defaultSeparator !== $nextSeparator && '' !== $nextSeparator ? preg_quote($nextSeparator, self::REGEX_DELIMITER) : ''
                );
                if (('' !== $nextSeparator && !preg_match('#^\{\w+\}#', $followingPattern)) || '' === $followingPattern) {
                    // When we have a separator, which is disallowed for the variable, we can optimize the regex with a possessive
                    // quantifier. This prevents useless backtracking of PCRE and improves performance by 20% for matching those patterns.
                    // Given the above example, there is no point in backtracking into {page} (that forbids the dot) when a dot must follow
                    // after it. This optimization cannot be applied when the next char is no real separator or when the next variable is
                    // directly adjacent, e.g. '/{x}{y}'.
                    $regexp .= '+';
                }
            }

            $tokens[] = array('variable', $isSeparator ? $precedingChar : '', $regexp, $varName);
            $variables[] = $varName;
        }

        if ($pos < strlen($pattern)) {
            $tokens[] = array('text', substr($pattern, $pos));
        }

        // find the first optional token
        $firstOptional = PHP_INT_MAX;
        if (!$isHost) {
            for ($i = count($tokens) - 1; $i >= 0; $i--) {
                $token = $tokens[$i];
                if ('variable' === $token[0] && $route->hasDefault($token[3])) {
                    $firstOptional = $i;
                } else {
                    break;
                }
            }
        }

        // compute the matching regexp
        $regexp = '';
        for ($i = 0, $nbToken = count($tokens); $i < $nbToken; $i++) {
            $regexp .= self::computeRegexp($tokens, $i, $firstOptional);
        }

        return array(
            'staticPrefix' => 'text' === $tokens[0][0] ? $tokens[0][1] : '',
            'regex' => self::REGEX_DELIMITER.'^'.$regexp.'$'.self::REGEX_DELIMITER.'s',
            'tokens' => array_reverse($tokens),
            'variables' => $variables,
        );
    }

    /**
     * Returns the next static character in the Route pattern that will serve as a separator.
     *
     * @param string $pattern The route pattern
     *
     * @return string The next static character that functions as separator (or empty string when none available)
     */
    private static function findNextSeparator($pattern)
    {
        if ('' == $pattern) {
            // return empty string if pattern is empty or false (false which can be returned by substr)
            return '';
        }
        // first remove all placeholders from the pattern so we can find the next real static character
        $pattern = preg_replace('#\{\w+\}#', '', $pattern);

        return isset($pattern[0]) && false !== strpos(static::SEPARATORS, $pattern[0]) ? $pattern[0] : '';
    }

    /**
     * Computes the regexp used to match a specific token. It can be static text or a subpattern.
     *
     * @param array   $tokens        The route tokens
     * @param integer $index         The index of the current token
     * @param integer $firstOptional The index of the first optional token
     *
     * @return string The regexp pattern for a single token
     */
    private static function computeRegexp(array $tokens, $index, $firstOptional)
    {
        $token = $tokens[$index];
        if ('text' === $token[0]) {
            // Text tokens
            return preg_quote($token[1], self::REGEX_DELIMITER);
        } else {
            // Variable tokens
            if (0 === $index && 0 === $firstOptional) {
                // When the only token is an optional variable token, the separator is required
                return sprintf('%s(?P<%s>%s)?', preg_quote($token[1], self::REGEX_DELIMITER), $token[3], $token[2]);
            } else {
                $regexp = sprintf('%s(?P<%s>%s)', preg_quote($token[1], self::REGEX_DELIMITER), $token[3], $token[2]);
                if ($index >= $firstOptional) {
                    // Enclose each optional token in a subpattern to make it optional.
                    // "?:" means it is non-capturing, i.e. the portion of the subject string that
                    // matched the optional subpattern is not passed back.
                    $regexp = "(?:$regexp";
                    $nbTokens = count($tokens);
                    if ($nbTokens - 1 == $index) {
                        // Close the optional subpatterns
                        $regexp .= str_repeat(")?", $nbTokens - $firstOptional - (0 === $firstOptional ? 1 : 0));
                    }
                }

                return $regexp;
            }
        }
    }
}
PK`�\�V�˽�3pear/Symfony/Component/Routing/Annotation/Route.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Annotation;

/**
 * Annotation class for @Route().
 *
 * @Annotation
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Route
{
    private $path;
    private $name;
    private $requirements = array();
    private $options = array();
    private $defaults = array();
    private $host;
    private $methods = array();
    private $schemes = array();
    private $condition;

    /**
     * Constructor.
     *
     * @param array $data An array of key/value parameters.
     *
     * @throws \BadMethodCallException
     */
    public function __construct(array $data)
    {
        if (isset($data['value'])) {
            $data['path'] = $data['value'];
            unset($data['value']);
        }

        foreach ($data as $key => $value) {
            $method = 'set'.str_replace('_', '', $key);
            if (!method_exists($this, $method)) {
                throw new \BadMethodCallException(sprintf("Unknown property '%s' on annotation '%s'.", $key, get_class($this)));
            }
            $this->$method($value);
        }
    }

    /**
     * @deprecated Deprecated in 2.2, to be removed in 3.0. Use setPath instead.
     */
    public function setPattern($pattern)
    {
        $this->path = $pattern;
    }

    /**
     * @deprecated Deprecated in 2.2, to be removed in 3.0. Use getPath instead.
     */
    public function getPattern()
    {
        return $this->path;
    }

    public function setPath($path)
    {
        $this->path = $path;
    }

    public function getPath()
    {
        return $this->path;
    }

    public function setHost($pattern)
    {
        $this->host = $pattern;
    }

    public function getHost()
    {
        return $this->host;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setRequirements($requirements)
    {
        $this->requirements = $requirements;
    }

    public function getRequirements()
    {
        return $this->requirements;
    }

    public function setOptions($options)
    {
        $this->options = $options;
    }

    public function getOptions()
    {
        return $this->options;
    }

    public function setDefaults($defaults)
    {
        $this->defaults = $defaults;
    }

    public function getDefaults()
    {
        return $this->defaults;
    }

    public function setSchemes($schemes)
    {
        $this->schemes = is_array($schemes) ? $schemes : array($schemes);
    }

    public function getSchemes()
    {
        return $this->schemes;
    }

    public function setMethods($methods)
    {
        $this->methods = is_array($methods) ? $methods : array($methods);
    }

    public function getMethods()
    {
        return $this->methods;
    }

    public function setCondition($condition)
    {
        $this->condition = $condition;
    }

    public function getCondition()
    {
        return $this->condition;
    }
}
PK`�\մ���Npear/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Generator;

/**
 * ConfigurableRequirementsInterface must be implemented by URL generators that
 * can be configured whether an exception should be generated when the parameters
 * do not match the requirements. It is also possible to disable the requirements
 * check for URL generation completely.
 *
 * The possible configurations and use-cases:
 * - setStrictRequirements(true): Throw an exception for mismatching requirements. This
 *   is mostly useful in development environment.
 * - setStrictRequirements(false): Don't throw an exception but return null as URL for
 *   mismatching requirements and log the problem. Useful when you cannot control all
 *   params because they come from third party libs but don't want to have a 404 in
 *   production environment. It should log the mismatch so one can review it.
 * - setStrictRequirements(null): Return the URL with the given parameters without
 *   checking the requirements at all. When generating a URL you should either trust
 *   your params or you validated them beforehand because otherwise it would break your
 *   link anyway. So in production environment you should know that params always pass
 *   the requirements. Thus this option allows to disable the check on URL generation for
 *   performance reasons (saving a preg_match for each requirement every time a URL is
 *   generated).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 */
interface ConfigurableRequirementsInterface
{
    /**
     * Enables or disables the exception on incorrect parameters.
     * Passing null will deactivate the requirements check completely.
     *
     * @param Boolean|null $enabled
     */
    public function setStrictRequirements($enabled);

    /**
     * Returns whether to throw an exception on incorrect parameters.
     * Null means the requirements check is deactivated completely.
     *
     * @return Boolean|null
     */
    public function isStrictRequirements();
}
PK`�\����@@Bpear/Symfony/Component/Routing/Generator/UrlGeneratorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Generator;

use Symfony\Component\Routing\Exception\InvalidParameterException;
use Symfony\Component\Routing\Exception\MissingMandatoryParametersException;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
use Symfony\Component\Routing\RequestContextAwareInterface;

/**
 * UrlGeneratorInterface is the interface that all URL generator classes must implement.
 *
 * The constants in this interface define the different types of resource references that
 * are declared in RFC 3986: http://tools.ietf.org/html/rfc3986
 * We are using the term "URL" instead of "URI" as this is more common in web applications
 * and we do not need to distinguish them as the difference is mostly semantical and
 * less technical. Generating URIs, i.e. representation-independent resource identifiers,
 * is also possible.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 *
 * @api
 */
interface UrlGeneratorInterface extends RequestContextAwareInterface
{
    /**
     * Generates an absolute URL, e.g. "http://example.com/dir/file".
     */
    const ABSOLUTE_URL = true;

    /**
     * Generates an absolute path, e.g. "/dir/file".
     */
    const ABSOLUTE_PATH = false;

    /**
     * Generates a relative path based on the current request path, e.g. "../parent-file".
     * @see UrlGenerator::getRelativePath()
     */
    const RELATIVE_PATH = 'relative';

    /**
     * Generates a network path, e.g. "//example.com/dir/file".
     * Such reference reuses the current scheme but specifies the host.
     */
    const NETWORK_PATH = 'network';

    /**
     * Generates a URL or path for a specific route based on the given parameters.
     *
     * Parameters that reference placeholders in the route pattern will substitute them in the
     * path or host. Extra params are added as query string to the URL.
     *
     * When the passed reference type cannot be generated for the route because it requires a different
     * host or scheme than the current one, the method will return a more comprehensive reference
     * that includes the required params. For example, when you call this method with $referenceType = ABSOLUTE_PATH
     * but the route requires the https scheme whereas the current scheme is http, it will instead return an
     * ABSOLUTE_URL with the https scheme and the current host. This makes sure the generated URL matches
     * the route in any case.
     *
     * If there is no route with the given name, the generator must throw the RouteNotFoundException.
     *
     * @param string         $name          The name of the route
     * @param mixed          $parameters    An array of parameters
     * @param Boolean|string $referenceType The type of reference to be generated (one of the constants)
     *
     * @return string The generated URL
     *
     * @throws RouteNotFoundException              If the named route doesn't exist
     * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route
     * @throws InvalidParameterException           When a parameter value for a placeholder is not correct because
     *                                             it does not match the requirement
     *
     * @api
     */
    public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH);
}
PK`�\�1O�
�
Fpear/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Generator\Dumper;

/**
 * PhpGeneratorDumper creates a PHP class able to generate URLs for a given set of routes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 *
 * @api
 */
class PhpGeneratorDumper extends GeneratorDumper
{
    /**
     * Dumps a set of routes to a PHP class.
     *
     * Available options:
     *
     *  * class:      The class name
     *  * base_class: The base class name
     *
     * @param array $options An array of options
     *
     * @return string A PHP class representing the generator class
     *
     * @api
     */
    public function dump(array $options = array())
    {
        $options = array_merge(array(
            'class'      => 'ProjectUrlGenerator',
            'base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
        ), $options);

        return <<<EOF
<?php

use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
use Psr\Log\LoggerInterface;

/**
 * {$options['class']}
 *
 * This class has been auto-generated
 * by the Symfony Routing Component.
 */
class {$options['class']} extends {$options['base_class']}
{
    private static \$declaredRoutes = {$this->generateDeclaredRoutes()};

    /**
     * Constructor.
     */
    public function __construct(RequestContext \$context, LoggerInterface \$logger = null)
    {
        \$this->context = \$context;
        \$this->logger = \$logger;
    }

{$this->generateGenerateMethod()}
}

EOF;
    }

    /**
     * Generates PHP code representing an array of defined routes
     * together with the routes properties (e.g. requirements).
     *
     * @return string PHP code
     */
    private function generateDeclaredRoutes()
    {
        $routes = "array(\n";
        foreach ($this->getRoutes()->all() as $name => $route) {
            $compiledRoute = $route->compile();

            $properties = array();
            $properties[] = $compiledRoute->getVariables();
            $properties[] = $route->getDefaults();
            $properties[] = $route->getRequirements();
            $properties[] = $compiledRoute->getTokens();
            $properties[] = $compiledRoute->getHostTokens();

            $routes .= sprintf("        '%s' => %s,\n", $name, str_replace("\n", '', var_export($properties, true)));
        }
        $routes .= '    )';

        return $routes;
    }

    /**
     * Generates PHP code representing the `generate` method that implements the UrlGeneratorInterface.
     *
     * @return string PHP code
     */
    private function generateGenerateMethod()
    {
        return <<<EOF
    public function generate(\$name, \$parameters = array(), \$referenceType = self::ABSOLUTE_PATH)
    {
        if (!isset(self::\$declaredRoutes[\$name])) {
            throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', \$name));
        }

        list(\$variables, \$defaults, \$requirements, \$tokens, \$hostTokens) = self::\$declaredRoutes[\$name];

        return \$this->doGenerate(\$variables, \$defaults, \$requirements, \$tokens, \$parameters, \$name, \$referenceType, \$hostTokens);
    }
EOF;
    }
}
PK`�\�4��Lpear/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Generator\Dumper;

use Symfony\Component\Routing\RouteCollection;

/**
 * GeneratorDumperInterface is the interface that all generator dumper classes must implement.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface GeneratorDumperInterface
{
    /**
     * Dumps a set of routes to a string representation of executable code
     * that can then be used to generate a URL of such a route.
     *
     * @param array $options An array of options
     *
     * @return string Executable code
     */
    public function dump(array $options = array());

    /**
     * Gets the routes to dump.
     *
     * @return RouteCollection A RouteCollection instance
     */
    public function getRoutes();
}
PK`�\u�'��Cpear/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Generator\Dumper;

use Symfony\Component\Routing\RouteCollection;

/**
 * GeneratorDumper is the base class for all built-in generator dumpers.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class GeneratorDumper implements GeneratorDumperInterface
{
    /**
     * @var RouteCollection
     */
    private $routes;

    /**
     * Constructor.
     *
     * @param RouteCollection $routes The RouteCollection to dump
     */
    public function __construct(RouteCollection $routes)
    {
        $this->routes = $routes;
    }

    /**
     * {@inheritdoc}
     */
    public function getRoutes()
    {
        return $this->routes;
    }
}
PK`�\�
��1�19pear/Symfony/Component/Routing/Generator/UrlGenerator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Generator;

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Exception\InvalidParameterException;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
use Symfony\Component\Routing\Exception\MissingMandatoryParametersException;
use Psr\Log\LoggerInterface;

/**
 * UrlGenerator can generate a URL or a path for any route in the RouteCollection
 * based on the passed parameters.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 *
 * @api
 */
class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInterface
{
    /**
     * @var RouteCollection
     */
    protected $routes;

    /**
     * @var RequestContext
     */
    protected $context;

    /**
     * @var Boolean|null
     */
    protected $strictRequirements = true;

    /**
     * @var LoggerInterface|null
     */
    protected $logger;

    /**
     * This array defines the characters (besides alphanumeric ones) that will not be percent-encoded in the path segment of the generated URL.
     *
     * PHP's rawurlencode() encodes all chars except "a-zA-Z0-9-._~" according to RFC 3986. But we want to allow some chars
     * to be used in their literal form (reasons below). Other chars inside the path must of course be encoded, e.g.
     * "?" and "#" (would be interpreted wrongly as query and fragment identifier),
     * "'" and """ (are used as delimiters in HTML).
     */
    protected $decodedChars = array(
        // the slash can be used to designate a hierarchical structure and we want allow using it with this meaning
        // some webservers don't allow the slash in encoded form in the path for security reasons anyway
        // see http://stackoverflow.com/questions/4069002/http-400-if-2f-part-of-get-url-in-jboss
        '%2F' => '/',
        // the following chars are general delimiters in the URI specification but have only special meaning in the authority component
        // so they can safely be used in the path in unencoded form
        '%40' => '@',
        '%3A' => ':',
        // these chars are only sub-delimiters that have no predefined meaning and can therefore be used literally
        // so URI producing applications can use these chars to delimit subcomponents in a path segment without being encoded for better readability
        '%3B' => ';',
        '%2C' => ',',
        '%3D' => '=',
        '%2B' => '+',
        '%21' => '!',
        '%2A' => '*',
        '%7C' => '|',
    );

    /**
     * Constructor.
     *
     * @param RouteCollection      $routes  A RouteCollection instance
     * @param RequestContext       $context The context
     * @param LoggerInterface|null $logger  A logger instance
     *
     * @api
     */
    public function __construct(RouteCollection $routes, RequestContext $context, LoggerInterface $logger = null)
    {
        $this->routes = $routes;
        $this->context = $context;
        $this->logger = $logger;
    }

    /**
     * {@inheritdoc}
     */
    public function setContext(RequestContext $context)
    {
        $this->context = $context;
    }

    /**
     * {@inheritdoc}
     */
    public function getContext()
    {
        return $this->context;
    }

    /**
     * {@inheritdoc}
     */
    public function setStrictRequirements($enabled)
    {
        $this->strictRequirements = null === $enabled ? null : (Boolean) $enabled;
    }

    /**
     * {@inheritdoc}
     */
    public function isStrictRequirements()
    {
        return $this->strictRequirements;
    }

    /**
     * {@inheritDoc}
     */
    public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)
    {
        if (null === $route = $this->routes->get($name)) {
            throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name));
        }

        // the Route has a cache of its own and is not recompiled as long as it does not get modified
        $compiledRoute = $route->compile();

        return $this->doGenerate($compiledRoute->getVariables(), $route->getDefaults(), $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $name, $referenceType, $compiledRoute->getHostTokens());
    }

    /**
     * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route
     * @throws InvalidParameterException           When a parameter value for a placeholder is not correct because
     *                                             it does not match the requirement
     */
    protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens)
    {
        $variables = array_flip($variables);
        $mergedParams = array_replace($defaults, $this->context->getParameters(), $parameters);

        // all params must be given
        if ($diff = array_diff_key($variables, $mergedParams)) {
            throw new MissingMandatoryParametersException(sprintf('Some mandatory parameters are missing ("%s") to generate a URL for route "%s".', implode('", "', array_keys($diff)), $name));
        }

        $url = '';
        $optional = true;
        foreach ($tokens as $token) {
            if ('variable' === $token[0]) {
                if (!$optional || !array_key_exists($token[3], $defaults) || null !== $mergedParams[$token[3]] && (string) $mergedParams[$token[3]] !== (string) $defaults[$token[3]]) {
                    // check requirement
                    if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#', $mergedParams[$token[3]])) {
                        $message = sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given) to generate a corresponding URL.', $token[3], $name, $token[2], $mergedParams[$token[3]]);
                        if ($this->strictRequirements) {
                            throw new InvalidParameterException($message);
                        }

                        if ($this->logger) {
                            $this->logger->error($message);
                        }

                        return null;
                    }

                    $url = $token[1].$mergedParams[$token[3]].$url;
                    $optional = false;
                }
            } else {
                // static text
                $url = $token[1].$url;
                $optional = false;
            }
        }

        if ('' === $url) {
            $url = '/';
        }

        // the contexts base URL is already encoded (see Symfony\Component\HttpFoundation\Request)
        $url = strtr(rawurlencode($url), $this->decodedChars);

        // the path segments "." and ".." are interpreted as relative reference when resolving a URI; see http://tools.ietf.org/html/rfc3986#section-3.3
        // so we need to encode them as they are not used for this purpose here
        // otherwise we would generate a URI that, when followed by a user agent (e.g. browser), does not match this route
        $url = strtr($url, array('/../' => '/%2E%2E/', '/./' => '/%2E/'));
        if ('/..' === substr($url, -3)) {
            $url = substr($url, 0, -2).'%2E%2E';
        } elseif ('/.' === substr($url, -2)) {
            $url = substr($url, 0, -1).'%2E';
        }

        $schemeAuthority = '';
        if ($host = $this->context->getHost()) {
            $scheme = $this->context->getScheme();
            if (isset($requirements['_scheme']) && ($req = strtolower($requirements['_scheme'])) && $scheme !== $req) {
                $referenceType = self::ABSOLUTE_URL;
                $scheme = $req;
            }

            if ($hostTokens) {
                $routeHost = '';
                foreach ($hostTokens as $token) {
                    if ('variable' === $token[0]) {
                        if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#', $mergedParams[$token[3]])) {
                            $message = sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given) to generate a corresponding URL.', $token[3], $name, $token[2], $mergedParams[$token[3]]);

                            if ($this->strictRequirements) {
                                throw new InvalidParameterException($message);
                            }

                            if ($this->logger) {
                                $this->logger->error($message);
                            }

                            return null;
                        }

                        $routeHost = $token[1].$mergedParams[$token[3]].$routeHost;
                    } else {
                        $routeHost = $token[1].$routeHost;
                    }
                }

                if ($routeHost !== $host) {
                    $host = $routeHost;
                    if (self::ABSOLUTE_URL !== $referenceType) {
                        $referenceType = self::NETWORK_PATH;
                    }
                }
            }

            if (self::ABSOLUTE_URL === $referenceType || self::NETWORK_PATH === $referenceType) {
                $port = '';
                if ('http' === $scheme && 80 != $this->context->getHttpPort()) {
                    $port = ':'.$this->context->getHttpPort();
                } elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) {
                    $port = ':'.$this->context->getHttpsPort();
                }

                $schemeAuthority = self::NETWORK_PATH === $referenceType ? '//' : "$scheme://";
                $schemeAuthority .= $host.$port;
            }
        }

        if (self::RELATIVE_PATH === $referenceType) {
            $url = self::getRelativePath($this->context->getPathInfo(), $url);
        } else {
            $url = $schemeAuthority.$this->context->getBaseUrl().$url;
        }

        // add a query string if needed
        $extra = array_diff_key($parameters, $variables, $defaults);
        if ($extra && $query = http_build_query($extra, '', '&')) {
            $url .= '?'.$query;
        }

        return $url;
    }

    /**
     * Returns the target path as relative reference from the base path.
     *
     * Only the URIs path component (no schema, host etc.) is relevant and must be given, starting with a slash.
     * Both paths must be absolute and not contain relative parts.
     * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives.
     * Furthermore, they can be used to reduce the link size in documents.
     *
     * Example target paths, given a base path of "/a/b/c/d":
     * - "/a/b/c/d"     -> ""
     * - "/a/b/c/"      -> "./"
     * - "/a/b/"        -> "../"
     * - "/a/b/c/other" -> "other"
     * - "/a/x/y"       -> "../../x/y"
     *
     * @param string $basePath   The base path
     * @param string $targetPath The target path
     *
     * @return string The relative target path
     */
    public static function getRelativePath($basePath, $targetPath)
    {
        if ($basePath === $targetPath) {
            return '';
        }

        $sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath);
        $targetDirs = explode('/', isset($targetPath[0]) && '/' === $targetPath[0] ? substr($targetPath, 1) : $targetPath);
        array_pop($sourceDirs);
        $targetFile = array_pop($targetDirs);

        foreach ($sourceDirs as $i => $dir) {
            if (isset($targetDirs[$i]) && $dir === $targetDirs[$i]) {
                unset($sourceDirs[$i], $targetDirs[$i]);
            } else {
                break;
            }
        }

        $targetDirs[] = $targetFile;
        $path = str_repeat('../', count($sourceDirs)).implode('/', $targetDirs);

        // A reference to the same base directory or an empty subdirectory must be prefixed with "./".
        // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used
        // as the first segment of a relative-path reference, as it would be mistaken for a scheme name
        // (see http://tools.ietf.org/html/rfc3986#section-4.2).
        return '' === $path || '/' === $path[0]
            || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos)
            ? "./$path" : $path;
    }
}
PK`�\(�"w��;pear/Symfony/Component/Templating/Storage/StringStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Storage;

/**
 * StringStorage represents a template stored in a string.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class StringStorage extends Storage
{
    /**
     * Returns the content of the template.
     *
     * @return string The template content
     *
     * @api
     */
    public function getContent()
    {
        return $this->template;
    }
}
PK`�\�'��9pear/Symfony/Component/Templating/Storage/FileStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Storage;

/**
 * FileStorage represents a template stored on the filesystem.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class FileStorage extends Storage
{
    /**
     * Returns the content of the template.
     *
     * @return string The template content
     *
     * @api
     */
    public function getContent()
    {
        return file_get_contents($this->template);
    }
}
PK`�\π\�5pear/Symfony/Component/Templating/Storage/Storage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Storage;

/**
 * Storage is the base class for all storage classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
abstract class Storage
{
    protected $template;

    /**
     * Constructor.
     *
     * @param string $template The template name
     *
     * @api
     */
    public function __construct($template)
    {
        $this->template = $template;
    }

    /**
     * Returns the object string representation.
     *
     * @return string The template name
     */
    public function __toString()
    {
        return (string) $this->template;
    }

    /**
     * Returns the content of the template.
     *
     * @return string The template content
     *
     * @api
     */
    abstract public function getContent();
}
PK`�\�o##3pear/Symfony/Component/Templating/Asset/Package.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Asset;

/**
 * The basic package will add a version to asset URLs.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 */
class Package implements PackageInterface
{
    private $version;
    private $format;

    /**
     * Constructor.
     *
     * @param string $version The package version
     * @param string $format  The format used to apply the version
     */
    public function __construct($version = null, $format = '')
    {
        $this->version = $version;
        $this->format = $format ?: '%s?%s';
    }

    public function getVersion()
    {
        return $this->version;
    }

    public function getUrl($path)
    {
        if (false !== strpos($path, '://') || 0 === strpos($path, '//')) {
            return $path;
        }

        return $this->applyVersion($path);
    }

    /**
     * Applies version to the supplied path.
     *
     * @param string $path A path
     *
     * @return string The versionized path
     */
    protected function applyVersion($path)
    {
        if (null === $this->version) {
            return $path;
        }

        $versionized = sprintf($this->format, ltrim($path, '/'), $this->version);

        if ($path && '/' == $path[0]) {
            $versionized = '/'.$versionized;
        }

        return $versionized;
    }
}
PK`�\���TT6pear/Symfony/Component/Templating/Asset/UrlPackage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Asset;

/**
 * The URL packages adds a version and a base URL to asset URLs.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 */
class UrlPackage extends Package
{
    private $baseUrls;

    /**
     * Constructor.
     *
     * @param string|array $baseUrls Base asset URLs
     * @param string       $version  The package version
     * @param string       $format   The format used to apply the version
     */
    public function __construct($baseUrls = array(), $version = null, $format = null)
    {
        parent::__construct($version, $format);

        if (!is_array($baseUrls)) {
            $baseUrls = (array) $baseUrls;
        }

        $this->baseUrls = array();
        foreach ($baseUrls as $baseUrl) {
            $this->baseUrls[] = rtrim($baseUrl, '/');
        }
    }

    public function getUrl($path)
    {
        if (false !== strpos($path, '://') || 0 === strpos($path, '//')) {
            return $path;
        }

        $url = $this->applyVersion($path);

        if ($url && '/' != $url[0]) {
            $url = '/'.$url;
        }

        return $this->getBaseUrl($path).$url;
    }

    /**
     * Returns the base URL for a path.
     *
     * @param string $path
     *
     * @return string The base URL
     */
    public function getBaseUrl($path)
    {
        switch ($count = count($this->baseUrls)) {
            case 0:
                return '';

            case 1:
                return $this->baseUrls[0];

            default:
                return $this->baseUrls[fmod(hexdec(substr(hash('sha256', $path), 0, 10)), $count)];
        }
    }
}
PK`�\p�vj��<pear/Symfony/Component/Templating/Asset/PackageInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Asset;

/**
 * Asset package interface.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 */
interface PackageInterface
{
    /**
     * Returns the asset package version.
     *
     * @return string The version string
     */
    public function getVersion();

    /**
     * Returns an absolute or root-relative public path.
     *
     * @param string $path A path
     *
     * @return string The public path
     */
    public function getUrl($path);
}
PK`�\��b�NN7pear/Symfony/Component/Templating/Asset/PathPackage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Asset;

/**
 * The path packages adds a version and a base path to asset URLs.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 */
class PathPackage extends Package
{
    private $basePath;

    /**
     * Constructor.
     *
     * @param string $basePath The base path to be prepended to relative paths
     * @param string $version  The package version
     * @param string $format   The format used to apply the version
     */
    public function __construct($basePath = null, $version = null, $format = null)
    {
        parent::__construct($version, $format);

        if (!$basePath) {
            $this->basePath = '/';
        } else {
            if ('/' != $basePath[0]) {
                $basePath = '/'.$basePath;
            }

            $this->basePath = rtrim($basePath, '/').'/';
        }
    }

    public function getUrl($path)
    {
        if (false !== strpos($path, '://') || 0 === strpos($path, '//')) {
            return $path;
        }

        $url = $this->applyVersion($path);

        // apply the base path
        if ('/' !== substr($url, 0, 1)) {
            $url = $this->basePath.$url;
        }

        return $url;
    }

    /**
     * Returns the base path.
     *
     * @return string The base path
     */
    public function getBasePath()
    {
        return $this->basePath;
    }
}
PK`�\J� ���7pear/Symfony/Component/Templating/DebuggerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating;

/**
 * DebuggerInterface is the interface you need to implement
 * to debug template loader instances.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @deprecated Deprecated in 2.4, to be removed in 3.0. Use Psr\Log\LoggerInterface instead.
 */
interface DebuggerInterface
{
    /**
     * Logs a message.
     *
     * @param string $message A message to log
     */
    public function log($message);
}
PK`�\����@pear/Symfony/Component/Templating/TemplateReferenceInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating;

/**
 * Interface to be implemented by all templates.
 *
 * @author Victor Berchet <victor@suumit.com>
 *
 * @api
 */
interface TemplateReferenceInterface
{
    /**
     * Gets the template parameters.
     *
     * @return array An array of parameters
     *
     * @api
     */
    public function all();

    /**
     * Sets a template parameter.
     *
     * @param string $name  The parameter name
     * @param string $value The parameter value
     *
     * @return TemplateReferenceInterface The TemplateReferenceInterface instance
     *
     * @throws  \InvalidArgumentException if the parameter name is not supported
     *
     * @api
     */
    public function set($name, $value);

    /**
     * Gets a template parameter.
     *
     * @param string $name The parameter name
     *
     * @return string The parameter value
     *
     * @throws  \InvalidArgumentException if the parameter name is not supported
     *
     * @api
     */
    public function get($name);

    /**
     * Returns the path to the template.
     *
     * By default, it just returns the template name.
     *
     * @return string A path to the template or a resource
     *
     * @api
     */
    public function getPath();

    /**
     * Returns the "logical" template name.
     *
     * The template name acts as a unique identifier for the template.
     *
     * @return string The template name
     *
     * @api
     */
    public function getLogicalName();

    /**
     * Returns the string representation as shortcut for getLogicalName().
     *
     * Alias of getLogicalName().
     *
     * @return string The template name
     *
     * @api
     */
    public function __toString();
}
PK`�\<,��}}7pear/Symfony/Component/Templating/TemplateReference.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating;

/**
 * Internal representation of a template.
 *
 * @author Victor Berchet <victor@suumit.com>
 *
 * @api
 */
class TemplateReference implements TemplateReferenceInterface
{
    protected $parameters;

    public function __construct($name = null, $engine = null)
    {
        $this->parameters = array(
            'name'   => $name,
            'engine' => $engine,
        );
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        return $this->getLogicalName();
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function set($name, $value)
    {
        if (array_key_exists($name, $this->parameters)) {
            $this->parameters[$name] = $value;
        } else {
            throw new \InvalidArgumentException(sprintf('The template does not support the "%s" parameter.', $name));
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function get($name)
    {
        if (array_key_exists($name, $this->parameters)) {
            return $this->parameters[$name];
        }

        throw new \InvalidArgumentException(sprintf('The template does not support the "%s" parameter.', $name));
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function all()
    {
        return $this->parameters;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getPath()
    {
        return $this->parameters['name'];
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function getLogicalName()
    {
        return $this->parameters['name'];
    }
}
PK`�\�����5pear/Symfony/Component/Templating/EngineInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating;

/**
 * EngineInterface is the interface each engine must implement.
 *
 * All methods relies on a template name. A template name is a
 * "logical" name for the template, and as such it does not refer to
 * a path on the filesystem (in fact, the template can be stored
 * anywhere, like in a database).
 *
 * The methods should accept any name. If the name is not an instance of
 * TemplateReferenceInterface, a TemplateNameParserInterface should be used to
 * convert the name to a TemplateReferenceInterface instance.
 *
 * Each template loader uses the logical template name to look for
 * the template.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface EngineInterface
{
    /**
     * Renders a template.
     *
     * @param string|TemplateReferenceInterface $name       A template name or a TemplateReferenceInterface instance
     * @param array                             $parameters An array of parameters to pass to the template
     *
     * @return string The evaluated template as a string
     *
     * @throws \RuntimeException if the template cannot be rendered
     *
     * @api
     */
    public function render($name, array $parameters = array());

    /**
     * Returns true if the template exists.
     *
     * @param string|TemplateReferenceInterface $name A template name or a TemplateReferenceInterface instance
     *
     * @return Boolean true if the template exists, false otherwise
     *
     * @throws \RuntimeException if the engine cannot handle the template name
     *
     * @api
     */
    public function exists($name);

    /**
     * Returns true if this class is able to render the given template.
     *
     * @param string|TemplateReferenceInterface $name A template name or a TemplateReferenceInterface instance
     *
     * @return Boolean true if this class supports the given template, false otherwise
     *
     * @api
     */
    public function supports($name);
}
PK`�\���8pear/Symfony/Component/Templating/TemplateNameParser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating;

/**
 * TemplateNameParser is the default implementation of TemplateNameParserInterface.
 *
 * This implementation takes everything as the template name
 * and the extension for the engine.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class TemplateNameParser implements TemplateNameParserInterface
{
    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function parse($name)
    {
        if ($name instanceof TemplateReferenceInterface) {
            return $name;
        }

        $engine = null;
        if (false !== $pos = strrpos($name, '.')) {
            $engine = substr($name, $pos + 1);
        }

        return new TemplateReference($name, $engine);
    }
}
PK`�\�m�tTT0pear/Symfony/Component/Templating/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Templating\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK`�\?w
y=y=/pear/Symfony/Component/Templating/PhpEngine.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating;

use Symfony\Component\Templating\Storage\Storage;
use Symfony\Component\Templating\Storage\FileStorage;
use Symfony\Component\Templating\Storage\StringStorage;
use Symfony\Component\Templating\Helper\HelperInterface;
use Symfony\Component\Templating\Loader\LoaderInterface;

if (!defined('ENT_SUBSTITUTE')) {
    define('ENT_SUBSTITUTE', 8);
}

/**
 * PhpEngine is an engine able to render PHP templates.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class PhpEngine implements EngineInterface, \ArrayAccess
{
    protected $loader;
    protected $current;
    protected $helpers = array();
    protected $parents = array();
    protected $stack = array();
    protected $charset = 'UTF-8';
    protected $cache = array();
    protected $escapers = array();
    protected static $escaperCache = array();
    protected $globals = array();
    protected $parser;

    private $evalTemplate;
    private $evalParameters;

    /**
     * Constructor.
     *
     * @param TemplateNameParserInterface $parser  A TemplateNameParserInterface instance
     * @param LoaderInterface             $loader  A loader instance
     * @param HelperInterface[]           $helpers An array of helper instances
     */
    public function __construct(TemplateNameParserInterface $parser, LoaderInterface $loader, array $helpers = array())
    {
        $this->parser  = $parser;
        $this->loader  = $loader;

        $this->addHelpers($helpers);

        $this->initializeEscapers();
        foreach ($this->escapers as $context => $escaper) {
            $this->setEscaper($context, $escaper);
        }
    }

    /**
     * {@inheritdoc}
     *
     * @throws \InvalidArgumentException if the template does not exist
     *
     * @api
     */
    public function render($name, array $parameters = array())
    {
        $storage = $this->load($name);
        $key = hash('sha256', serialize($storage));
        $this->current = $key;
        $this->parents[$key] = null;

        // attach the global variables
        $parameters = array_replace($this->getGlobals(), $parameters);
        // render
        if (false === $content = $this->evaluate($storage, $parameters)) {
            throw new \RuntimeException(sprintf('The template "%s" cannot be rendered.', $this->parser->parse($name)));
        }

        // decorator
        if ($this->parents[$key]) {
            $slots = $this->get('slots');
            $this->stack[] = $slots->get('_content');
            $slots->set('_content', $content);

            $content = $this->render($this->parents[$key], $parameters);

            $slots->set('_content', array_pop($this->stack));
        }

        return $content;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function exists($name)
    {
        try {
            $this->load($name);
        } catch (\InvalidArgumentException $e) {
            return false;
        }

        return true;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function supports($name)
    {
        $template = $this->parser->parse($name);

        return 'php' === $template->get('engine');
    }

    /**
     * Evaluates a template.
     *
     * @param Storage $template   The template to render
     * @param array   $parameters An array of parameters to pass to the template
     *
     * @return string|false The evaluated template, or false if the engine is unable to render the template
     *
     * @throws \InvalidArgumentException
     */
    protected function evaluate(Storage $template, array $parameters = array())
    {
        $this->evalTemplate = $template;
        $this->evalParameters = $parameters;
        unset($template, $parameters);

        if (isset($this->evalParameters['this'])) {
            throw new \InvalidArgumentException('Invalid parameter (this)');
        }
        if (isset($this->evalParameters['view'])) {
            throw new \InvalidArgumentException('Invalid parameter (view)');
        }

        $view = $this;
        if ($this->evalTemplate instanceof FileStorage) {
            extract($this->evalParameters, EXTR_SKIP);
            $this->evalParameters = null;

            ob_start();
            require $this->evalTemplate;

            $this->evalTemplate = null;

            return ob_get_clean();
        } elseif ($this->evalTemplate instanceof StringStorage) {
            extract($this->evalParameters, EXTR_SKIP);
            $this->evalParameters = null;

            ob_start();
            eval('; ?>'.$this->evalTemplate.'<?php ;');

            $this->evalTemplate = null;

            return ob_get_clean();
        }

        return false;
    }

    /**
     * Gets a helper value.
     *
     * @param string $name The helper name
     *
     * @return HelperInterface The helper value
     *
     * @throws \InvalidArgumentException if the helper is not defined
     *
     * @api
     */
    public function offsetGet($name)
    {
        return $this->get($name);
    }

    /**
     * Returns true if the helper is defined.
     *
     * @param string $name The helper name
     *
     * @return Boolean true if the helper is defined, false otherwise
     *
     * @api
     */
    public function offsetExists($name)
    {
        return isset($this->helpers[$name]);
    }

    /**
     * Sets a helper.
     *
     * @param HelperInterface $name  The helper instance
     * @param string          $value An alias
     *
     * @api
     */
    public function offsetSet($name, $value)
    {
        $this->set($name, $value);
    }

    /**
     * Removes a helper.
     *
     * @param string $name The helper name
     *
     * @throws \LogicException
     *
     * @api
     */
    public function offsetUnset($name)
    {
        throw new \LogicException(sprintf('You can\'t unset a helper (%s).', $name));
    }

    /**
     * Adds some helpers.
     *
     * @param HelperInterface[] $helpers An array of helper
     *
     * @api
     */
    public function addHelpers(array $helpers)
    {
        foreach ($helpers as $alias => $helper) {
            $this->set($helper, is_int($alias) ? null : $alias);
        }
    }

    /**
     * Sets the helpers.
     *
     * @param HelperInterface[] $helpers An array of helper
     *
     * @api
     */
    public function setHelpers(array $helpers)
    {
        $this->helpers = array();
        $this->addHelpers($helpers);
    }

    /**
     * Sets a helper.
     *
     * @param HelperInterface $helper The helper instance
     * @param string          $alias  An alias
     *
     * @api
     */
    public function set(HelperInterface $helper, $alias = null)
    {
        $this->helpers[$helper->getName()] = $helper;
        if (null !== $alias) {
            $this->helpers[$alias] = $helper;
        }

        $helper->setCharset($this->charset);
    }

    /**
     * Returns true if the helper if defined.
     *
     * @param string $name The helper name
     *
     * @return Boolean true if the helper is defined, false otherwise
     *
     * @api
     */
    public function has($name)
    {
        return isset($this->helpers[$name]);
    }

    /**
     * Gets a helper value.
     *
     * @param string $name The helper name
     *
     * @return HelperInterface The helper instance
     *
     * @throws \InvalidArgumentException if the helper is not defined
     *
     * @api
     */
    public function get($name)
    {
        if (!isset($this->helpers[$name])) {
            throw new \InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name));
        }

        return $this->helpers[$name];
    }

    /**
     * Decorates the current template with another one.
     *
     * @param string $template The decorator logical name
     *
     * @api
     */
    public function extend($template)
    {
        $this->parents[$this->current] = $template;
    }

    /**
     * Escapes a string by using the current charset.
     *
     * @param mixed  $value   A variable to escape
     * @param string $context The context name
     *
     * @return string The escaped value
     *
     * @api
     */
    public function escape($value, $context = 'html')
    {
        if (is_numeric($value)) {
            return $value;
        }

        // If we deal with a scalar value, we can cache the result to increase
        // the performance when the same value is escaped multiple times (e.g. loops)
        if (is_scalar($value)) {
            if (!isset(self::$escaperCache[$context][$value])) {
                self::$escaperCache[$context][$value] = call_user_func($this->getEscaper($context), $value);
            }

            return self::$escaperCache[$context][$value];
        }

        return call_user_func($this->getEscaper($context), $value);
    }

    /**
     * Sets the charset to use.
     *
     * @param string $charset The charset
     *
     * @api
     */
    public function setCharset($charset)
    {
        $this->charset = $charset;
    }

    /**
     * Gets the current charset.
     *
     * @return string The current charset
     *
     * @api
     */
    public function getCharset()
    {
        return $this->charset;
    }

    /**
     * Adds an escaper for the given context.
     *
     * @param string $context The escaper context (html, js, ...)
     * @param mixed  $escaper A PHP callable
     *
     * @api
     */
    public function setEscaper($context, $escaper)
    {
        $this->escapers[$context] = $escaper;
        self::$escaperCache[$context] = array();
    }

    /**
     * Gets an escaper for a given context.
     *
     * @param string $context The context name
     *
     * @return mixed  $escaper A PHP callable
     *
     * @throws \InvalidArgumentException
     *
     * @api
     */
    public function getEscaper($context)
    {
        if (!isset($this->escapers[$context])) {
            throw new \InvalidArgumentException(sprintf('No registered escaper for context "%s".', $context));
        }

        return $this->escapers[$context];
    }

    /**
     * @param string $name
     * @param mixed  $value
     *
     * @api
     */
    public function addGlobal($name, $value)
    {
        $this->globals[$name] = $value;
    }

    /**
     * Returns the assigned globals.
     *
     * @return array
     *
     * @api
     */
    public function getGlobals()
    {
        return $this->globals;
    }

    /**
     * Initializes the built-in escapers.
     *
     * Each function specifies a way for applying a transformation to a string
     * passed to it. The purpose is for the string to be "escaped" so it is
     * suitable for the format it is being displayed in.
     *
     * For example, the string: "It's required that you enter a username & password.\n"
     * If this were to be displayed as HTML it would be sensible to turn the
     * ampersand into '&amp;' and the apostrophe into '&aps;'. However if it were
     * going to be used as a string in JavaScript to be displayed in an alert box
     * it would be right to leave the string as-is, but c-escape the apostrophe and
     * the new line.
     *
     * For each function there is a define to avoid problems with strings being
     * incorrectly specified.
     */
    protected function initializeEscapers()
    {
        $that = $this;

        $this->escapers = array(
            'html' =>
                /**
                 * Runs the PHP function htmlspecialchars on the value passed.
                 *
                 * @param string $value the value to escape
                 *
                 * @return string the escaped value
                 */
                function ($value) use ($that) {
                    // Numbers and Boolean values get turned into strings which can cause problems
                    // with type comparisons (e.g. === or is_int() etc).
                    return is_string($value) ? htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, $that->getCharset(), false) : $value;
                },

            'js' =>
                /**
                 * A function that escape all non-alphanumeric characters
                 * into their \xHH or \uHHHH representations
                 *
                 * @param string $value the value to escape
                 * @return string the escaped value
                 */
                function ($value) use ($that) {
                    if ('UTF-8' != $that->getCharset()) {
                        $value = $that->convertEncoding($value, 'UTF-8', $that->getCharset());
                    }

                    $callback = function ($matches) use ($that) {
                        $char = $matches[0];

                        // \xHH
                        if (!isset($char[1])) {
                            return '\\x'.substr('00'.bin2hex($char), -2);
                        }

                        // \uHHHH
                        $char = $that->convertEncoding($char, 'UTF-16BE', 'UTF-8');

                        return '\\u'.substr('0000'.bin2hex($char), -4);
                    };

                    if (null === $value = preg_replace_callback('#[^\p{L}\p{N} ]#u', $callback, $value)) {
                        throw new \InvalidArgumentException('The string to escape is not a valid UTF-8 string.');
                    }

                    if ('UTF-8' != $that->getCharset()) {
                        $value = $that->convertEncoding($value, $that->getCharset(), 'UTF-8');
                    }

                    return $value;
                },
        );

        self::$escaperCache = array();
    }

    /**
     * Convert a string from one encoding to another.
     *
     * @param string $string The string to convert
     * @param string $to     The input encoding
     * @param string $from   The output encoding
     *
     * @return string The string with the new encoding
     *
     * @throws \RuntimeException if no suitable encoding function is found (iconv or mbstring)
     */
    public function convertEncoding($string, $to, $from)
    {
        if (function_exists('mb_convert_encoding')) {
            return mb_convert_encoding($string, $to, $from);
        } elseif (function_exists('iconv')) {
            return iconv($from, $to, $string);
        }

        throw new \RuntimeException('No suitable convert encoding function (use UTF-8 as your encoding or install the iconv or mbstring extension).');
    }

    /**
     * Gets the loader associated with this engine.
     *
     * @return LoaderInterface A LoaderInterface instance
     */
    public function getLoader()
    {
        return $this->loader;
    }

    /**
     * Loads the given template.
     *
     * @param string|TemplateReferenceInterface $name A template name or a TemplateReferenceInterface instance
     *
     * @return Storage A Storage instance
     *
     * @throws \InvalidArgumentException if the template cannot be found
     */
    protected function load($name)
    {
        $template = $this->parser->parse($name);

        $key = $template->getLogicalName();
        if (isset($this->cache[$key])) {
            return $this->cache[$key];
        }

        $storage = $this->loader->load($template);

        if (false === $storage) {
            throw new \InvalidArgumentException(sprintf('The template "%s" does not exist.', $template));
        }

        return $this->cache[$key] = $storage;
    }
}
PK `�\y�A�nn8pear/Symfony/Component/Templating/Loader/CacheLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Loader;

use Symfony\Component\Templating\Storage\Storage;
use Symfony\Component\Templating\Storage\FileStorage;
use Symfony\Component\Templating\TemplateReferenceInterface;

/**
 * CacheLoader is a loader that caches other loaders responses
 * on the filesystem.
 *
 * This cache only caches on disk to allow PHP accelerators to cache the opcodes.
 * All other mechanism would imply the use of `eval()`.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class CacheLoader extends Loader
{
    protected $loader;
    protected $dir;

    /**
     * Constructor.
     *
     * @param LoaderInterface $loader A Loader instance
     * @param string          $dir    The directory where to store the cache files
     */
    public function __construct(LoaderInterface $loader, $dir)
    {
        $this->loader = $loader;
        $this->dir = $dir;
    }

    /**
     * Loads a template.
     *
     * @param TemplateReferenceInterface $template A template
     *
     * @return Storage|Boolean false if the template cannot be loaded, a Storage instance otherwise
     */
    public function load(TemplateReferenceInterface $template)
    {
        $key = hash('sha256', $template->getLogicalName());
        $dir = $this->dir.DIRECTORY_SEPARATOR.substr($key, 0, 2);
        $file = substr($key, 2).'.tpl';
        $path = $dir.DIRECTORY_SEPARATOR.$file;

        if (is_file($path)) {
            if (null !== $this->logger) {
                $this->logger->debug(sprintf('Fetching template "%s" from cache', $template->get('name')));
            } elseif (null !== $this->debugger) {
                // just for BC, to be removed in 3.0
                $this->debugger->log(sprintf('Fetching template "%s" from cache', $template->get('name')));
            }

            return new FileStorage($path);
        }

        if (false === $storage = $this->loader->load($template)) {
            return false;
        }

        $content = $storage->getContent();

        if (!is_dir($dir)) {
            mkdir($dir, 0777, true);
        }

        file_put_contents($path, $content);

        if (null !== $this->logger) {
            $this->logger->debug(sprintf('Storing template "%s" in cache', $template->get('name')));
        } elseif (null !== $this->debugger) {
            // just for BC, to be removed in 3.0
            $this->debugger->log(sprintf('Storing template "%s" in cache', $template->get('name')));
        }

        return new FileStorage($path);
    }

    /**
     * Returns true if the template is still fresh.
     *
     * @param TemplateReferenceInterface $template A template
     * @param integer                    $time     The last modification time of the cached template (timestamp)
     *
     * @return Boolean
     */
    public function isFresh(TemplateReferenceInterface $template, $time)
    {
        return $this->loader->isFresh($template, $time);
    }
}
PK `�\�g((3pear/Symfony/Component/Templating/Loader/Loader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Loader;

use Psr\Log\LoggerInterface;
use Symfony\Component\Templating\DebuggerInterface;

/**
 * Loader is the base class for all template loader classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Loader implements LoaderInterface
{
    /**
     * @var LoggerInterface|null
     */
    protected $logger;

    /**
     * @deprecated Deprecated in 2.4, to be removed in 3.0. Use $this->logger instead.
     */
    protected $debugger;

    /**
     * Sets the debug logger to use for this loader.
     *
     * @param LoggerInterface $logger A logger instance
     */
    public function setLogger(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    /**
     * Sets the debugger to use for this loader.
     *
     * @param DebuggerInterface $debugger A debugger instance
     *
     * @deprecated Deprecated in 2.4, to be removed in 3.0. Use $this->setLogger() instead.
     */
    public function setDebugger(DebuggerInterface $debugger)
    {
        $this->debugger = $debugger;
    }
}
PK!`�\��>8pear/Symfony/Component/Templating/Loader/ChainLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Loader;

use Symfony\Component\Templating\Storage\Storage;
use Symfony\Component\Templating\TemplateReferenceInterface;

/**
 * ChainLoader is a loader that calls other loaders to load templates.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ChainLoader extends Loader
{
    protected $loaders = array();

    /**
     * Constructor.
     *
     * @param LoaderInterface[] $loaders An array of loader instances
     */
    public function __construct(array $loaders = array())
    {
        foreach ($loaders as $loader) {
            $this->addLoader($loader);
        }
    }

    /**
     * Adds a loader instance.
     *
     * @param LoaderInterface $loader A Loader instance
     */
    public function addLoader(LoaderInterface $loader)
    {
        $this->loaders[] = $loader;
    }

    /**
     * Loads a template.
     *
     * @param TemplateReferenceInterface $template A template
     *
     * @return Storage|Boolean false if the template cannot be loaded, a Storage instance otherwise
     */
    public function load(TemplateReferenceInterface $template)
    {
        foreach ($this->loaders as $loader) {
            if (false !== $storage = $loader->load($template)) {
                return $storage;
            }
        }

        return false;
    }

    /**
     * Returns true if the template is still fresh.
     *
     * @param TemplateReferenceInterface $template A template
     * @param integer                    $time     The last modification time of the cached template (timestamp)
     *
     * @return Boolean
     */
    public function isFresh(TemplateReferenceInterface $template, $time)
    {
        foreach ($this->loaders as $loader) {
            return $loader->isFresh($template, $time);
        }

        return false;
    }
}
PK!`�\I<�D��<pear/Symfony/Component/Templating/Loader/LoaderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Loader;

use Symfony\Component\Templating\TemplateReferenceInterface;
use Symfony\Component\Templating\Storage\Storage;

/**
 * LoaderInterface is the interface all loaders must implement.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface LoaderInterface
{
    /**
     * Loads a template.
     *
     * @param TemplateReferenceInterface $template A template
     *
     * @return Storage|Boolean false if the template cannot be loaded, a Storage instance otherwise
     *
     * @api
     */
    public function load(TemplateReferenceInterface $template);

    /**
     * Returns true if the template is still fresh.
     *
     * @param TemplateReferenceInterface $template A template
     * @param integer                    $time     The last modification time of the cached template (timestamp)
     *
     * @return Boolean
     *
     * @api
     */
    public function isFresh(TemplateReferenceInterface $template, $time);
}
PK"`�\�b��=pear/Symfony/Component/Templating/Loader/FilesystemLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Loader;

use Symfony\Component\Templating\Storage\Storage;
use Symfony\Component\Templating\Storage\FileStorage;
use Symfony\Component\Templating\TemplateReferenceInterface;

/**
 * FilesystemLoader is a loader that read templates from the filesystem.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class FilesystemLoader extends Loader
{
    protected $templatePathPatterns;

    /**
     * Constructor.
     *
     * @param array $templatePathPatterns An array of path patterns to look for templates
     *
     * @api
     */
    public function __construct($templatePathPatterns)
    {
        $this->templatePathPatterns = (array) $templatePathPatterns;
    }

    /**
     * Loads a template.
     *
     * @param TemplateReferenceInterface $template A template
     *
     * @return Storage|Boolean false if the template cannot be loaded, a Storage instance otherwise
     *
     * @api
     */
    public function load(TemplateReferenceInterface $template)
    {
        $file = $template->get('name');

        if (self::isAbsolutePath($file) && is_file($file)) {
            return new FileStorage($file);
        }

        $replacements = array();
        foreach ($template->all() as $key => $value) {
            $replacements['%'.$key.'%'] = $value;
        }

        $logs = array();
        foreach ($this->templatePathPatterns as $templatePathPattern) {
            if (is_file($file = strtr($templatePathPattern, $replacements)) && is_readable($file)) {
                if (null !== $this->logger) {
                    $this->logger->debug(sprintf('Loaded template file "%s"', $file));
                } elseif (null !== $this->debugger) {
                    // just for BC, to be removed in 3.0
                    $this->debugger->log(sprintf('Loaded template file "%s"', $file));
                }

                return new FileStorage($file);
            }

            if (null !== $this->logger || null !== $this->debugger) {
                $logs[] = sprintf('Failed loading template file "%s"', $file);
            }
        }

        foreach ($logs as $log) {
            if (null !== $this->logger) {
                $this->logger->debug($log);
            } elseif (null !== $this->debugger) {
                $this->debugger->log($log);
            }
        }

        return false;
    }

    /**
     * Returns true if the template is still fresh.
     *
     * @param TemplateReferenceInterface $template A template
     * @param integer                    $time     The last modification time of the cached template (timestamp)
     *
     * @return Boolean true if the template is still fresh, false otherwise
     *
     * @api
     */
    public function isFresh(TemplateReferenceInterface $template, $time)
    {
        if (false === $storage = $this->load($template)) {
            return false;
        }

        return filemtime((string) $storage) < $time;
    }

    /**
     * Returns true if the file is an existing absolute path.
     *
     * @param string $file A path
     *
     * @return Boolean true if the path exists and is absolute, false otherwise
     */
    protected static function isAbsolutePath($file)
    {
        if ($file[0] == '/' || $file[0] == '\\'
            || (strlen($file) > 3 && ctype_alpha($file[0])
                && $file[1] == ':'
                && ($file[2] == '\\' || $file[2] == '/')
            )
            || null !== parse_url($file, PHP_URL_SCHEME)
        ) {
            return true;
        }

        return false;
    }
}
PK"`�\_6H6pear/Symfony/Component/Templating/DelegatingEngine.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating;

/**
 * DelegatingEngine selects an engine for a given template.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class DelegatingEngine implements EngineInterface, StreamingEngineInterface
{
    /**
     * @var EngineInterface[]
     */
    protected $engines = array();

    /**
     * Constructor.
     *
     * @param EngineInterface[] $engines An array of EngineInterface instances to add
     *
     * @api
     */
    public function __construct(array $engines = array())
    {
        foreach ($engines as $engine) {
            $this->addEngine($engine);
        }
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function render($name, array $parameters = array())
    {
        return $this->getEngine($name)->render($name, $parameters);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function stream($name, array $parameters = array())
    {
        $engine = $this->getEngine($name);
        if (!$engine instanceof StreamingEngineInterface) {
            throw new \LogicException(sprintf('Template "%s" cannot be streamed as the engine supporting it does not implement StreamingEngineInterface.', $name));
        }

        $engine->stream($name, $parameters);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function exists($name)
    {
        return $this->getEngine($name)->exists($name);
    }

    /**
     * Adds an engine.
     *
     * @param EngineInterface $engine An EngineInterface instance
     *
     * @api
     */
    public function addEngine(EngineInterface $engine)
    {
        $this->engines[] = $engine;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function supports($name)
    {
        try {
            $this->getEngine($name);
        } catch (\RuntimeException $e) {
            return false;
        }

        return true;
    }

    /**
     * Get an engine able to render the given template.
     *
     * @param string|TemplateReferenceInterface $name A template name or a TemplateReferenceInterface instance
     *
     * @return EngineInterface The engine
     *
     * @throws \RuntimeException if no engine able to work with the template is found
     *
     * @api
     */
    public function getEngine($name)
    {
        foreach ($this->engines as $engine) {
            if ($engine->supports($name)) {
                return $engine;
            }
        }

        throw new \RuntimeException(sprintf('No engine is able to work with the template "%s".', $name));
    }
}
PK"`�\C���>pear/Symfony/Component/Templating/StreamingEngineInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating;

/**
 * StreamingEngineInterface provides a method that knows how to stream a template.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface StreamingEngineInterface
{
    /**
     * Streams a template.
     *
     * The implementation should output the content directly to the client.
     *
     * @param string|TemplateReferenceInterface $name       A template name or a TemplateReferenceInterface instance
     * @param array                             $parameters An array of parameters to pass to the template
     *
     * @throws \RuntimeException if the template cannot be rendered
     * @throws \LogicException   if the template cannot be streamed
     */
    public function stream($name, array $parameters = array());
}
PK"`�\Է����<pear/Symfony/Component/Templating/Helper/HelperInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Helper;

/**
 * HelperInterface is the interface all helpers must implement.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface HelperInterface
{
    /**
     * Returns the canonical name of this helper.
     *
     * @return string The canonical name
     *
     * @api
     */
    public function getName();

    /**
     * Sets the default charset.
     *
     * @param string $charset The charset
     *
     * @api
     */
    public function setCharset($charset);

    /**
     * Gets the default charset.
     *
     * @return string The default charset
     *
     * @api
     */
    public function getCharset();
}
PK#`�\�NO��3pear/Symfony/Component/Templating/Helper/Helper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Helper;

/**
 * Helper is the base class for all helper classes.
 *
 * Most of the time, a Helper is an adapter around an existing
 * class that exposes a read-only interface for templates.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
abstract class Helper implements HelperInterface
{
    protected $charset = 'UTF-8';

    /**
     * Sets the default charset.
     *
     * @param string $charset The charset
     *
     * @api
     */
    public function setCharset($charset)
    {
        $this->charset = $charset;
    }

    /**
     * Gets the default charset.
     *
     * @return string The default charset
     *
     * @api
     */
    public function getCharset()
    {
        return $this->charset;
    }
}
PK#`�\V¤՟�9pear/Symfony/Component/Templating/Helper/AssetsHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Helper;

use Symfony\Component\Templating\Asset\PathPackage;
use Symfony\Component\Templating\Asset\UrlPackage;

/**
 * AssetsHelper helps manage asset URLs.
 *
 * Usage:
 *
 * <code>
 *   <img src="<?php echo $view['assets']->getUrl('foo.png') ?>" />
 * </code>
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Kris Wallsmith <kris@symfony.com>
 */
class AssetsHelper extends CoreAssetsHelper
{
    /**
     * Constructor.
     *
     * @param string       $basePath      The base path
     * @param string|array $baseUrls      Base asset URLs
     * @param string       $version       The asset version
     * @param string       $format        The version format
     * @param array        $namedPackages Additional packages
     */
    public function __construct($basePath = null, $baseUrls = array(), $version = null, $format = null, $namedPackages = array())
    {
        if ($baseUrls) {
            $defaultPackage = new UrlPackage($baseUrls, $version, $format);
        } else {
            $defaultPackage = new PathPackage($basePath, $version, $format);
        }

        parent::__construct($defaultPackage, $namedPackages);
    }
}
PK#`�\+�r�mm8pear/Symfony/Component/Templating/Helper/SlotsHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Helper;

/**
 * SlotsHelper manages template slots.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class SlotsHelper extends Helper
{
    protected $slots = array();
    protected $openSlots = array();

    /**
     * Starts a new slot.
     *
     * This method starts an output buffer that will be
     * closed when the stop() method is called.
     *
     * @param string $name The slot name
     *
     * @throws \InvalidArgumentException if a slot with the same name is already started
     *
     * @api
     */
    public function start($name)
    {
        if (in_array($name, $this->openSlots)) {
            throw new \InvalidArgumentException(sprintf('A slot named "%s" is already started.', $name));
        }

        $this->openSlots[] = $name;
        $this->slots[$name] = '';

        ob_start();
        ob_implicit_flush(0);
    }

    /**
     * Stops a slot.
     *
     * @throws \LogicException if no slot has been started
     *
     * @api
     */
    public function stop()
    {
        if (!$this->openSlots) {
            throw new \LogicException('No slot started.');
        }

        $name = array_pop($this->openSlots);

        $this->slots[$name] = ob_get_clean();
    }

    /**
     * Returns true if the slot exists.
     *
     * @param string $name The slot name
     *
     * @return Boolean
     *
     * @api
     */
    public function has($name)
    {
        return isset($this->slots[$name]);
    }

    /**
     * Gets the slot value.
     *
     * @param string         $name    The slot name
     * @param Boolean|string $default The default slot content
     *
     * @return string The slot content
     *
     * @api
     */
    public function get($name, $default = false)
    {
        return isset($this->slots[$name]) ? $this->slots[$name] : $default;
    }

    /**
     * Sets a slot value.
     *
     * @param string $name    The slot name
     * @param string $content The slot content
     *
     * @api
     */
    public function set($name, $content)
    {
        $this->slots[$name] = $content;
    }

    /**
     * Outputs a slot.
     *
     * @param string         $name    The slot name
     * @param Boolean|string $default The default slot content
     *
     * @return Boolean true if the slot is defined or if a default content has been provided, false otherwise
     *
     * @api
     */
    public function output($name, $default = false)
    {
        if (!isset($this->slots[$name])) {
            if (false !== $default) {
                echo $default;

                return true;
            }

            return false;
        }

        echo $this->slots[$name];

        return true;
    }

    /**
     * Returns the canonical name of this helper.
     *
     * @return string The canonical name
     *
     * @api
     */
    public function getName()
    {
        return 'slots';
    }
}
PK$`�\����



=pear/Symfony/Component/Templating/Helper/CoreAssetsHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Helper;

use Symfony\Component\Templating\Asset\PackageInterface;

/**
 * CoreAssetsHelper helps manage asset URLs.
 *
 * Usage:
 *
 * <code>
 *   <img src="<?php echo $view['assets']->getUrl('foo.png') ?>" />
 * </code>
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Kris Wallsmith <kris@symfony.com>
 */
class CoreAssetsHelper extends Helper implements PackageInterface
{
    protected $defaultPackage;
    protected $namedPackages = array();

    /**
     * Constructor.
     *
     * @param PackageInterface $defaultPackage The default package
     * @param array            $namedPackages  Additional packages indexed by name
     */
    public function __construct(PackageInterface $defaultPackage, array $namedPackages = array())
    {
        $this->defaultPackage = $defaultPackage;

        foreach ($namedPackages as $name => $package) {
            $this->addPackage($name, $package);
        }
    }

    /**
     * Sets the default package.
     *
     * @param PackageInterface $defaultPackage The default package
     */
    public function setDefaultPackage(PackageInterface $defaultPackage)
    {
        $this->defaultPackage = $defaultPackage;
    }

    /**
     * Adds an asset package to the helper.
     *
     * @param string           $name    The package name
     * @param PackageInterface $package The package
     */
    public function addPackage($name, PackageInterface $package)
    {
        $this->namedPackages[$name] = $package;
    }

    /**
     * Returns an asset package.
     *
     * @param string $name The name of the package or null for the default package
     *
     * @return PackageInterface An asset package
     *
     * @throws \InvalidArgumentException If there is no package by that name
     */
    public function getPackage($name = null)
    {
        if (null === $name) {
            return $this->defaultPackage;
        }

        if (!isset($this->namedPackages[$name])) {
            throw new \InvalidArgumentException(sprintf('There is no "%s" asset package.', $name));
        }

        return $this->namedPackages[$name];
    }

    /**
     * Gets the version to add to public URL.
     *
     * @param string $packageName A package name
     *
     * @return string The current version
     */
    public function getVersion($packageName = null)
    {
        return $this->getPackage($packageName)->getVersion();
    }

    /**
     * Returns the public path.
     *
     * Absolute paths (i.e. http://...) are returned unmodified.
     *
     * @param string $path        A public path
     * @param string $packageName The name of the asset package to use
     *
     * @return string A public path which takes into account the base path and URL path
     */
    public function getUrl($path, $packageName = null)
    {
        return $this->getPackage($packageName)->getUrl($path);
    }

    /**
     * Returns the canonical name of this helper.
     *
     * @return string The canonical name
     */
    public function getName()
    {
        return 'assets';
    }
}
PK$`�\DZ�_++Apear/Symfony/Component/Templating/TemplateNameParserInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating;

/**
 * TemplateNameParserInterface converts template names to TemplateReferenceInterface
 * instances.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface TemplateNameParserInterface
{
    /**
     * Convert a template name to a TemplateReferenceInterface instance.
     *
     * @param string|TemplateReferenceInterface $name A template name or a TemplateReferenceInterface instance
     *
     * @return TemplateReferenceInterface A template
     *
     * @api
     */
    public function parse($name);
}
PK%`�\�C����3pear/Symfony/Component/Form/ButtonTypeInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * A type that should be converted into a {@link Button} instance.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ButtonTypeInterface extends FormTypeInterface
{
}
PK%`�\uUS�WWZpear/Symfony/Component/Form/Extension/DependencyInjection/DependencyInjectionExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\DependencyInjection;

use Symfony\Component\Form\FormExtensionInterface;
use Symfony\Component\Form\FormTypeGuesserChain;
use Symfony\Component\Form\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\ContainerInterface;

class DependencyInjectionExtension implements FormExtensionInterface
{
    private $container;
    private $typeServiceIds;
    private $typeExtensionServiceIds;
    private $guesserServiceIds;
    private $guesser;
    private $guesserLoaded = false;

    public function __construct(ContainerInterface $container,
        array $typeServiceIds, array $typeExtensionServiceIds,
        array $guesserServiceIds)
    {
        $this->container = $container;
        $this->typeServiceIds = $typeServiceIds;
        $this->typeExtensionServiceIds = $typeExtensionServiceIds;
        $this->guesserServiceIds = $guesserServiceIds;
    }

    public function getType($name)
    {
        if (!isset($this->typeServiceIds[$name])) {
            throw new InvalidArgumentException(sprintf('The field type "%s" is not registered with the service container.', $name));
        }

        $type = $this->container->get($this->typeServiceIds[$name]);

        if ($type->getName() !== $name) {
            throw new InvalidArgumentException(
                sprintf('The type name specified for the service "%s" does not match the actual name. Expected "%s", given "%s"',
                    $this->typeServiceIds[$name],
                    $name,
                    $type->getName()
                ));
        }

        return $type;
    }

    public function hasType($name)
    {
        return isset($this->typeServiceIds[$name]);
    }

    public function getTypeExtensions($name)
    {
        $extensions = array();

        if (isset($this->typeExtensionServiceIds[$name])) {
            foreach ($this->typeExtensionServiceIds[$name] as $serviceId) {
                $extensions[] = $this->container->get($serviceId);
            }
        }

        return $extensions;
    }

    public function hasTypeExtensions($name)
    {
        return isset($this->typeExtensionServiceIds[$name]);
    }

    public function getTypeGuesser()
    {
        if (!$this->guesserLoaded) {
            $this->guesserLoaded = true;
            $guessers = array();

            foreach ($this->guesserServiceIds as $serviceId) {
                $guessers[] = $this->container->get($serviceId);
            }

            if (count($guessers) > 0) {
                $this->guesser = new FormTypeGuesserChain($guessers);
            }
        }

        return $this->guesser;
    }
}
PK&`�\���,QQHpear/Symfony/Component/Form/Extension/Templating/TemplatingExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Templating;

use Symfony\Component\Form\AbstractExtension;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderAdapter;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\Form\FormRenderer;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Templating\PhpEngine;
use Symfony\Bundle\FrameworkBundle\Templating\Helper\FormHelper;

/**
 * Integrates the Templating component with the Form library.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class TemplatingExtension extends AbstractExtension
{
    public function __construct(PhpEngine $engine, $csrfTokenManager = null, array $defaultThemes = array())
    {
        if ($csrfTokenManager instanceof CsrfProviderInterface) {
            $csrfTokenManager = new CsrfProviderAdapter($csrfTokenManager);
        } elseif (null !== $csrfTokenManager && !$csrfTokenManager instanceof CsrfTokenManagerInterface) {
            throw new UnexpectedTypeException($csrfTokenManager, 'CsrfProviderInterface or CsrfTokenManagerInterface');
        }

        $engine->addHelpers(array(
            new FormHelper(new FormRenderer(new TemplatingRendererEngine($engine, $defaultThemes), $csrfTokenManager))
        ));
    }
}
PK&`�\զ�Y��Mpear/Symfony/Component/Form/Extension/Templating/TemplatingRendererEngine.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Templating;

use Symfony\Component\Form\AbstractRendererEngine;
use Symfony\Component\Form\FormView;
use Symfony\Component\Templating\EngineInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class TemplatingRendererEngine extends AbstractRendererEngine
{
    /**
     * @var EngineInterface
     */
    private $engine;

    public function __construct(EngineInterface $engine, array $defaultThemes = array())
    {
        parent::__construct($defaultThemes);

        $this->engine = $engine;
    }

    /**
     * {@inheritdoc}
     */
    public function renderBlock(FormView $view, $resource, $blockName, array $variables = array())
    {
        return trim($this->engine->render($resource, $variables));
    }

    /**
     * Loads the cache with the resource for a given block name.
     *
     * This implementation tries to load as few blocks as possible, since each block
     * is represented by a template on the file system.
     *
     * @see getResourceForBlock()
     *
     * @param string   $cacheKey  The cache key of the form view.
     * @param FormView $view      The form view for finding the applying themes.
     * @param string   $blockName The name of the block to load.
     *
     * @return Boolean True if the resource could be loaded, false otherwise.
     */
    protected function loadResourceForBlockName($cacheKey, FormView $view, $blockName)
    {
        // Recursively try to find the block in the themes assigned to $view,
        // then of its parent form, then of the parent form of the parent and so on.
        // When the root form is reached in this recursion, also the default
        // themes are taken into account.

        // Check each theme whether it contains the searched block
        if (isset($this->themes[$cacheKey])) {
            for ($i = count($this->themes[$cacheKey]) - 1; $i >= 0; --$i) {
                if ($this->loadResourceFromTheme($cacheKey, $blockName, $this->themes[$cacheKey][$i])) {
                    return true;
                }
            }
        }

        // Check the default themes once we reach the root form without success
        if (!$view->parent) {
            for ($i = count($this->defaultThemes) - 1; $i >= 0; --$i) {
                if ($this->loadResourceFromTheme($cacheKey, $blockName, $this->defaultThemes[$i])) {
                    return true;
                }
            }
        }

        // If we did not find anything in the themes of the current view, proceed
        // with the themes of the parent view
        if ($view->parent) {
            $parentCacheKey = $view->parent->vars[self::CACHE_KEY_VAR];

            if (!isset($this->resources[$parentCacheKey][$blockName])) {
                $this->loadResourceForBlockName($parentCacheKey, $view->parent, $blockName);
            }

            // If a template exists in the parent themes, cache that template
            // for the current theme as well to speed up further accesses
            if ($this->resources[$parentCacheKey][$blockName]) {
                $this->resources[$cacheKey][$blockName] = $this->resources[$parentCacheKey][$blockName];

                return true;
            }
        }

        // Cache that we didn't find anything to speed up further accesses
        $this->resources[$cacheKey][$blockName] = false;

        return false;
    }

    /**
     * Tries to load the resource for a block from a theme.
     *
     * @param string $cacheKey  The cache key for storing the resource.
     * @param string $blockName The name of the block to load a resource for.
     * @param mixed  $theme     The theme to load the block from.
     *
     * @return Boolean True if the resource could be loaded, false otherwise.
     */
    protected function loadResourceFromTheme($cacheKey, $blockName, $theme)
    {
        if ($this->engine->exists($templateName = $theme.':'.$blockName.'.html.php')) {
            $this->resources[$cacheKey][$blockName] = $templateName;

            return true;
        }

        return false;
    }
}
PK&`�\"�q���<pear/Symfony/Component/Form/Extension/Csrf/CsrfExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Csrf;

use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderAdapter;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\Form\AbstractExtension;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Translation\TranslatorInterface;

/**
 * This extension protects forms by using a CSRF token.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class CsrfExtension extends AbstractExtension
{
    /**
     * @var CsrfTokenManagerInterface
     */
    private $tokenManager;

    /**
     * @var TranslatorInterface
     */
    private $translator;

    /**
     * @var null|string
     */
    private $translationDomain;

    /**
     * Constructor.
     *
     * @param CsrfTokenManagerInterface $tokenManager      The CSRF token manager
     * @param TranslatorInterface       $translator        The translator for translating error messages
     * @param null|string               $translationDomain The translation domain for translating
     */
    public function __construct($tokenManager, TranslatorInterface $translator = null, $translationDomain = null)
    {
        if ($tokenManager instanceof CsrfProviderInterface) {
            $tokenManager = new CsrfProviderAdapter($tokenManager);
        } elseif (!$tokenManager instanceof CsrfTokenManagerInterface) {
            throw new UnexpectedTypeException($tokenManager, 'CsrfProviderInterface or CsrfTokenManagerInterface');
        }

        $this->tokenManager = $tokenManager;
        $this->translator = $translator;
        $this->translationDomain = $translationDomain;
    }

    /**
     * {@inheritDoc}
     */
    protected function loadTypeExtensions()
    {
        return array(
            new Type\FormTypeCsrfExtension($this->tokenManager, true, '_token', $this->translator, $this->translationDomain),
        );
    }
}
PK'`�\��
f��Ipear/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Csrf\Type;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderAdapter;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfTokenManagerAdapter;
use Symfony\Component\Form\Extension\Csrf\EventListener\CsrfValidationListener;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Translation\TranslatorInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormTypeCsrfExtension extends AbstractTypeExtension
{
    /**
     * @var CsrfTokenManagerInterface
     */
    private $defaultTokenManager;

    /**
     * @var Boolean
     */
    private $defaultEnabled;

    /**
     * @var string
     */
    private $defaultFieldName;

    /**
     * @var TranslatorInterface
     */
    private $translator;

    /**
     * @var null|string
     */
    private $translationDomain;

    public function __construct($defaultTokenManager, $defaultEnabled = true, $defaultFieldName = '_token', TranslatorInterface $translator = null, $translationDomain = null)
    {
        if ($defaultTokenManager instanceof CsrfProviderInterface) {
            $defaultTokenManager = new CsrfProviderAdapter($defaultTokenManager);
        } elseif (!$defaultTokenManager instanceof CsrfTokenManagerInterface) {
            throw new UnexpectedTypeException($defaultTokenManager, 'CsrfProviderInterface or CsrfTokenManagerInterface');
        }

        $this->defaultTokenManager = $defaultTokenManager;
        $this->defaultEnabled = $defaultEnabled;
        $this->defaultFieldName = $defaultFieldName;
        $this->translator = $translator;
        $this->translationDomain = $translationDomain;
    }

    /**
     * Adds a CSRF field to the form when the CSRF protection is enabled.
     *
     * @param FormBuilderInterface $builder The form builder
     * @param array                $options The options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if (!$options['csrf_protection']) {
            return;
        }

        $builder
            ->addEventSubscriber(new CsrfValidationListener(
                $options['csrf_field_name'],
                $options['csrf_token_manager'],
                $options['csrf_token_id'] ?: ($builder->getName() ?: get_class($builder->getType()->getInnerType())),
                $options['csrf_message'],
                $this->translator,
                $this->translationDomain
            ))
        ;
    }

    /**
     * Adds a CSRF field to the root form view.
     *
     * @param FormView      $view    The form view
     * @param FormInterface $form    The form
     * @param array         $options The options
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        if ($options['csrf_protection'] && !$view->parent && $options['compound']) {
            $factory = $form->getConfig()->getFormFactory();
            $tokenId = $options['csrf_token_id'] ?: ($form->getName() ?: get_class($form->getConfig()->getType()->getInnerType()));
            $data = (string) $options['csrf_token_manager']->getToken($tokenId);

            $csrfForm = $factory->createNamed($options['csrf_field_name'], 'hidden', $data, array(
                'mapped' => false,
            ));

            $view->children[$options['csrf_field_name']] = $csrfForm->createView($view);
        }
    }

    /**
     * {@inheritDoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        // BC clause for the "intention" option
        $csrfTokenId = function (Options $options) {
            return $options['intention'];
        };

        // BC clause for the "csrf_provider" option
        $csrfTokenManager = function (Options $options) {
            return $options['csrf_provider'] instanceof CsrfTokenManagerAdapter
                ? $options['csrf_provider']->getTokenManager()
                : new CsrfProviderAdapter($options['csrf_provider']);
        };

        $resolver->setDefaults(array(
            'csrf_protection'    => $this->defaultEnabled,
            'csrf_field_name'    => $this->defaultFieldName,
            'csrf_message'       => 'The CSRF token is invalid. Please try to resubmit the form.',
            'csrf_token_manager' => $csrfTokenManager,
            'csrf_token_id'      => $csrfTokenId,
            'csrf_provider'      => new CsrfTokenManagerAdapter($this->defaultTokenManager),
            'intention'          => null,
        ));
    }

    /**
     * {@inheritDoc}
     */
    public function getExtendedType()
    {
        return 'form';
    }
}
PK'`�\�?�ooSpear/Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Csrf\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderAdapter;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Translation\TranslatorInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class CsrfValidationListener implements EventSubscriberInterface
{
    /**
     * The name of the CSRF field
     * @var string
     */
    private $fieldName;

    /**
     * The generator for CSRF tokens
     * @var CsrfTokenManagerInterface
     */
    private $tokenManager;

    /**
     * A text mentioning the tokenId of the CSRF token
     *
     * Validation of the token will only succeed if it was generated in the
     * same session and with the same tokenId.
     *
     * @var string
     */
    private $tokenId;

    /**
     * The message displayed in case of an error.
     * @var string
     */
    private $errorMessage;

    /**
     * @var TranslatorInterface
     */
    private $translator;

    /**
     * @var null|string
     */
    private $translationDomain;

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SUBMIT => 'preSubmit',
        );
    }

    public function __construct($fieldName, $tokenManager, $tokenId, $errorMessage, TranslatorInterface $translator = null, $translationDomain = null)
    {
        if ($tokenManager instanceof CsrfProviderInterface) {
            $tokenManager = new CsrfProviderAdapter($tokenManager);
        } elseif (!$tokenManager instanceof CsrfTokenManagerInterface) {
            throw new UnexpectedTypeException($tokenManager, 'CsrfProviderInterface or CsrfTokenManagerInterface');
        }

        $this->fieldName = $fieldName;
        $this->tokenManager = $tokenManager;
        $this->tokenId = $tokenId;
        $this->errorMessage = $errorMessage;
        $this->translator = $translator;
        $this->translationDomain = $translationDomain;
    }

    public function preSubmit(FormEvent $event)
    {
        $form = $event->getForm();
        $data = $event->getData();

        if ($form->isRoot() && $form->getConfig()->getOption('compound')) {
            if (!isset($data[$this->fieldName]) || !$this->tokenManager->isTokenValid(new CsrfToken($this->tokenId, $data[$this->fieldName]))) {
                $errorMessage = $this->errorMessage;

                if (null !== $this->translator) {
                    $errorMessage = $this->translator->trans($errorMessage, array(), $this->translationDomain);
                }

                $form->addError(new FormError($errorMessage));
            }

            if (is_array($data)) {
                unset($data[$this->fieldName]);
            }
        }

        $event->setData($data);
    }

    /**
     * Alias of {@link preSubmit()}.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link preSubmit()} instead.
     */
    public function preBind(FormEvent $event)
    {
        $this->preSubmit($event);
    }
}
PK'`�\R�'WTTSpear/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfTokenManagerAdapter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Csrf\CsrfProvider;

use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;

/**
 * Adapter for using the new token generator with the old interface.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.4, to be removed in Symfony 3.0.
 */
class CsrfTokenManagerAdapter implements CsrfProviderInterface
{
    /**
     * @var CsrfTokenManagerInterface
     */
    private $tokenManager;

    public function __construct(CsrfTokenManagerInterface $tokenManager)
    {
        $this->tokenManager = $tokenManager;
    }

    public function getTokenManager()
    {
        return $this->tokenManager;
    }

    /**
     * {@inheritdoc}
     */
    public function generateCsrfToken($intention)
    {
        return $this->tokenManager->getToken($intention)->getValue();
    }

    /**
     * {@inheritdoc}
     */
    public function isCsrfTokenValid($intention, $token)
    {
        return $this->tokenManager->isTokenValid(new CsrfToken($intention, $token));
    }
}
PK'`�\%�G���Qpear/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Csrf\CsrfProvider;

/**
 * Marks classes able to provide CSRF protection
 *
 * You can generate a CSRF token by using the method generateCsrfToken(). To
 * this method you should pass a value that is unique to the page that should
 * be secured against CSRF attacks. This value doesn't necessarily have to be
 * secret. Implementations of this interface are responsible for adding more
 * secret information.
 *
 * If you want to secure a form submission against CSRF attacks, you could
 * supply an "intention" string. This way you make sure that the form can only
 * be submitted to pages that are designed to handle the form, that is, that use
 * the same intention string to validate the CSRF token with isCsrfTokenValid().
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.4, to be removed in Symfony 3.0. Use
 *             {@link \Symfony\Component\Security\Csrf\CsrfTokenManagerInterface}
 *             instead.
 */
interface CsrfProviderInterface
{
    /**
     * Generates a CSRF token for a page of your application.
     *
     * @param string $intention Some value that identifies the action intention
     *                          (i.e. "authenticate"). Doesn't have to be a secret value.
     *
     * @return string The generated token
     */
    public function generateCsrfToken($intention);

    /**
     * Validates a CSRF token.
     *
     * @param string $intention The intention used when generating the CSRF token
     * @param string $token     The token supplied by the browser
     *
     * @return Boolean Whether the token supplied by the browser is correct
     */
    public function isCsrfTokenValid($intention, $token);
}
PK(`�\�����Opear/Symfony/Component/Form/Extension/Csrf/CsrfProvider/CsrfProviderAdapter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Csrf\CsrfProvider;

use Symfony\Component\Form\Exception\BadMethodCallException;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;

/**
 * Adapter for using old CSRF providers where the new {@link CsrfTokenManagerInterface}
 * is expected.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.4, to be removed in Symfony 3.0.
 */
class CsrfProviderAdapter implements CsrfTokenManagerInterface
{
    /**
     * @var CsrfProviderInterface
     */
    private $csrfProvider;

    public function __construct(CsrfProviderInterface $csrfProvider)
    {
        $this->csrfProvider = $csrfProvider;
    }

    public function getCsrfProvider()
    {
        return $this->csrfProvider;
    }

    /**
     * {@inheritdoc}
     */
    public function getToken($tokenId)
    {
        return new CsrfToken($tokenId, $this->csrfProvider->generateCsrfToken($tokenId));
    }

    /**
     * {@inheritdoc}
     */
    public function refreshToken($tokenId)
    {
        throw new BadMethodCallException('Not supported');
    }

    /**
     * {@inheritdoc}
     */
    public function removeToken($tokenId)
    {
        throw new BadMethodCallException('Not supported');
    }

    /**
     * {@inheritdoc}
     */
    public function isTokenValid(CsrfToken $token)
    {
        return $this->csrfProvider->isCsrfTokenValid($token->getId(), $token->getValue());
    }
}
PK(`�\�C���Opear/Symfony/Component/Form/Extension/Csrf/CsrfProvider/DefaultCsrfProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Csrf\CsrfProvider;

/**
 * Default implementation of CsrfProviderInterface.
 *
 * This provider uses the session ID returned by session_id() as well as a
 * user-defined secret value to secure the CSRF token.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.4, to be removed in Symfony 3.0. Use
 *             {@link \Symfony\Component\Security\Csrf\CsrfTokenManager} in
 *             combination with {@link \Symfony\Component\Security\Csrf\TokenStorage\NativeSessionTokenStorage}
 *             instead.
 */
class DefaultCsrfProvider implements CsrfProviderInterface
{
    /**
     * A secret value used for generating the CSRF token
     * @var string
     */
    protected $secret;

    /**
     * Initializes the provider with a secret value
     *
     * A recommended value for the secret is a generated value with at least
     * 32 characters and mixed letters, digits and special characters.
     *
     * @param string $secret A secret value included in the CSRF token
     */
    public function __construct($secret)
    {
        $this->secret = $secret;
    }

    /**
     * {@inheritDoc}
     */
    public function generateCsrfToken($intention)
    {
        return sha1($this->secret.$intention.$this->getSessionId());
    }

    /**
     * {@inheritDoc}
     */
    public function isCsrfTokenValid($intention, $token)
    {
        return $token === $this->generateCsrfToken($intention);
    }

    /**
     * Returns the ID of the user session.
     *
     * Automatically starts the session if necessary.
     *
     * @return string The session ID
     */
    protected function getSessionId()
    {
        if (version_compare(PHP_VERSION, '5.4', '>=')) {
            if (PHP_SESSION_NONE === session_status()) {
                session_start();
            }
        } elseif (!session_id()) {
            session_start();
        }

        return session_id();
    }
}
PK(`�\[^����Opear/Symfony/Component/Form/Extension/Csrf/CsrfProvider/SessionCsrfProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Csrf\CsrfProvider;

use Symfony\Component\HttpFoundation\Session\Session;

/**
 * This provider uses a Symfony2 Session object to retrieve the user's
 * session ID.
 *
 * @see DefaultCsrfProvider
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.4, to be removed in Symfony 3.0. Use
 *             {@link \Symfony\Component\Security\Csrf\CsrfTokenManager} in
 *             combination with {@link \Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage}
 *             instead.
 */
class SessionCsrfProvider extends DefaultCsrfProvider
{
    /**
     * The user session from which the session ID is returned
     * @var Session
     */
    protected $session;

    /**
     * Initializes the provider with a Session object and a secret value.
     *
     * A recommended value for the secret is a generated value with at least
     * 32 characters and mixed letters, digits and special characters.
     *
     * @param Session $session The user session
     * @param string  $secret  A secret value included in the CSRF token
     */
    public function __construct(Session $session, $secret)
    {
        parent::__construct($secret);

        $this->session = $session;
    }

    /**
     * {@inheritdoc}
     */
    protected function getSessionId()
    {
        $this->session->start();

        return $this->session->getId();
    }
}
PK)`�\�;�ddbpear/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;

/**
 * Transforms between a normalized format (integer or float) and a percentage value.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 */
class PercentToLocalizedStringTransformer implements DataTransformerInterface
{
    const FRACTIONAL = 'fractional';
    const INTEGER = 'integer';

    protected static $types = array(
        self::FRACTIONAL,
        self::INTEGER,
    );

    private $type;

    private $precision;

    /**
     * Constructor.
     *
     * @see self::$types for a list of supported types
     *
     * @param integer $precision The precision
     * @param string  $type      One of the supported types
     *
     * @throws UnexpectedTypeException if the given value of type is unknown
     */
    public function __construct($precision = null, $type = null)
    {
        if (null === $precision) {
            $precision = 0;
        }

        if (null === $type) {
            $type = self::FRACTIONAL;
        }

        if (!in_array($type, self::$types, true)) {
            throw new UnexpectedTypeException($type, implode('", "', self::$types));
        }

        $this->type = $type;
        $this->precision = $precision;
    }

    /**
     * Transforms between a normalized format (integer or float) into a percentage value.
     *
     * @param number $value Normalized value
     *
     * @return number Percentage value
     *
     * @throws TransformationFailedException If the given value is not numeric or
     *                                       if the value could not be transformed.
     */
    public function transform($value)
    {
        if (null === $value) {
            return '';
        }

        if (!is_numeric($value)) {
            throw new TransformationFailedException('Expected a numeric.');
        }

        if (self::FRACTIONAL == $this->type) {
            $value *= 100;
        }

        $formatter = $this->getNumberFormatter();
        $value = $formatter->format($value);

        if (intl_is_failure($formatter->getErrorCode())) {
            throw new TransformationFailedException($formatter->getErrorMessage());
        }

        // replace the UTF-8 non break spaces
        return $value;
    }

    /**
     * Transforms between a percentage value into a normalized format (integer or float).
     *
     * @param number $value Percentage value.
     *
     * @return number Normalized value.
     *
     * @throws TransformationFailedException If the given value is not a string or
     *                                       if the value could not be transformed.
     */
    public function reverseTransform($value)
    {
        if (!is_string($value)) {
            throw new TransformationFailedException('Expected a string.');
        }

        if ('' === $value) {
            return null;
        }

        $formatter = $this->getNumberFormatter();
        // replace normal spaces so that the formatter can read them
        $value = $formatter->parse(str_replace(' ', ' ', $value));

        if (intl_is_failure($formatter->getErrorCode())) {
            throw new TransformationFailedException($formatter->getErrorMessage());
        }

        if (self::FRACTIONAL == $this->type) {
            $value /= 100;
        }

        return $value;
    }

    /**
     * Returns a preconfigured \NumberFormatter instance
     *
     * @return \NumberFormatter
     */
    protected function getNumberFormatter()
    {
        $formatter = new \NumberFormatter(\Locale::getDefault(), \NumberFormatter::DECIMAL);

        $formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, $this->precision);

        return $formatter;
    }
}
PK)`�\����		[pear/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToDuplicatesTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ValueToDuplicatesTransformer implements DataTransformerInterface
{
    private $keys;

    public function __construct(array $keys)
    {
        $this->keys = $keys;
    }

    /**
     * Duplicates the given value through the array.
     *
     * @param mixed $value The value
     *
     * @return array The array
     */
    public function transform($value)
    {
        $result = array();

        foreach ($this->keys as $key) {
            $result[$key] = $value;
        }

        return $result;
    }

    /**
     * Extracts the duplicated value from an array.
     *
     * @param array $array
     *
     * @return mixed The value
     *
     * @throws TransformationFailedException If the given value is not an array or
     *                                       if the given array can not be transformed.
     */
    public function reverseTransform($array)
    {
        if (!is_array($array)) {
            throw new TransformationFailedException('Expected an array.');
        }

        $result = current($array);
        $emptyKeys = array();

        foreach ($this->keys as $key) {
            if (!empty($array[$key])) {
                if ($array[$key] !== $result) {
                    throw new TransformationFailedException(
                        'All values in the array should be the same'
                    );
                }
            } else {
                $emptyKeys[] = $key;
            }
        }

        if (count($emptyKeys) > 0) {
            if (count($emptyKeys) == count($this->keys)) {
                // All keys empty
                return null;
            }

            throw new TransformationFailedException(
                 sprintf('The keys "%s" should not be empty', implode('", "', $emptyKeys)
            ));
        }

        return $result;
    }
}
PK*`�\���ggYpear/Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToValuesTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\Exception\TransformationFailedException;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ChoicesToValuesTransformer implements DataTransformerInterface
{
    private $choiceList;

    /**
     * Constructor.
     *
     * @param ChoiceListInterface $choiceList
     */
    public function __construct(ChoiceListInterface $choiceList)
    {
        $this->choiceList = $choiceList;
    }

    /**
     * @param array $array
     *
     * @return array
     *
     * @throws TransformationFailedException If the given value is not an array.
     */
    public function transform($array)
    {
        if (null === $array) {
            return array();
        }

        if (!is_array($array)) {
            throw new TransformationFailedException('Expected an array.');
        }

        return $this->choiceList->getValuesForChoices($array);
    }

    /**
     * @param array $array
     *
     * @return array
     *
     * @throws TransformationFailedException If the given value is not an array
     *                                       or if no matching choice could be
     *                                       found for some given value.
     */
    public function reverseTransform($array)
    {
        if (null === $array) {
            return array();
        }

        if (!is_array($array)) {
            throw new TransformationFailedException('Expected an array.');
        }

        $choices = $this->choiceList->getChoicesForValues($array);

        if (count($choices) !== count($array)) {
            throw new TransformationFailedException('Could not find all matching choices for the given values');
        }

        return $choices;
    }
}
PK*`�\'tqk55_pear/Symfony/Component/Form/Extension/Core/DataTransformer/ChoicesToBooleanArrayTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ChoicesToBooleanArrayTransformer implements DataTransformerInterface
{
    private $choiceList;

    public function __construct(ChoiceListInterface $choiceList)
    {
        $this->choiceList = $choiceList;
    }

    /**
     * Transforms an array of choices to a format appropriate for the nested
     * checkboxes/radio buttons.
     *
     * The result is an array with the options as keys and true/false as values,
     * depending on whether a given option is selected. If this field is rendered
     * as select tag, the value is not modified.
     *
     * @param mixed $array An array
     *
     * @return mixed An array
     *
     * @throws TransformationFailedException If the given value is not an array
     *                                       or if the choices can not be retrieved.
     */
    public function transform($array)
    {
        if (null === $array) {
            return array();
        }

        if (!is_array($array)) {
            throw new TransformationFailedException('Expected an array.');
        }

        try {
            $values = $this->choiceList->getValues();
        } catch (\Exception $e) {
            throw new TransformationFailedException('Can not get the choice list', $e->getCode(), $e);
        }

        $valueMap = array_flip($this->choiceList->getValuesForChoices($array));

        foreach ($values as $i => $value) {
            $values[$i] = isset($valueMap[$value]);
        }

        return $values;
    }

    /**
     * Transforms a checkbox/radio button array to an array of choices.
     *
     * The input value is an array with the choices as keys and true/false as
     * values, depending on whether a given choice is selected. The output
     * is an array with the selected choices.
     *
     * @param mixed $values An array
     *
     * @return mixed An array
     *
     * @throws TransformationFailedException If the given value is not an array,
     *                                       if the recuperation of the choices
     *                                       fails or if some choice can't be
     *                                       found.
     */
    public function reverseTransform($values)
    {
        if (!is_array($values)) {
            throw new TransformationFailedException('Expected an array.');
        }

        try {
            $choices = $this->choiceList->getChoices();
        } catch (\Exception $e) {
            throw new TransformationFailedException('Can not get the choice list', $e->getCode(), $e);
        }

        $result = array();
        $unknown = array();

        foreach ($values as $i => $selected) {
            if ($selected) {
                if (isset($choices[$i])) {
                    $result[] = $choices[$i];
                } else {
                    $unknown[] = $i;
                }
            }
        }

        if (count($unknown) > 0) {
            throw new TransformationFailedException(sprintf('The choices "%s" were not found', implode('", "', $unknown)));
        }

        return $result;
    }
}
PK*`�\���Þ
�
]pear/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToTimestampTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * Transforms between a timestamp and a DateTime object
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 */
class DateTimeToTimestampTransformer extends BaseDateTimeTransformer
{
    /**
     * Transforms a DateTime object into a timestamp in the configured timezone.
     *
     * @param \DateTime $value A \DateTime object
     *
     * @return integer A timestamp
     *
     * @throws TransformationFailedException If the given value is not an instance
     *                                       of \DateTime or if the output
     *                                       timezone is not supported.
     */
    public function transform($value)
    {
        if (null === $value) {
            return null;
        }

        if (!$value instanceof \DateTime) {
            throw new TransformationFailedException('Expected a \DateTime.');
        }

        $value = clone $value;
        try {
            $value->setTimezone(new \DateTimeZone($this->outputTimezone));
        } catch (\Exception $e) {
            throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
        }

        return (int) $value->format('U');
    }

    /**
     * Transforms a timestamp in the configured timezone into a DateTime object
     *
     * @param string $value A timestamp
     *
     * @return \DateTime A \DateTime object
     *
     * @throws TransformationFailedException If the given value is not a timestamp
     *                                       or if the given timestamp is invalid.
     */
    public function reverseTransform($value)
    {
        if (null === $value) {
            return null;
        }

        if (!is_numeric($value)) {
            throw new TransformationFailedException('Expected a numeric.');
        }

        try {
            $dateTime = new \DateTime();
            $dateTime->setTimezone(new \DateTimeZone($this->outputTimezone));
            $dateTime->setTimestamp($value);

            if ($this->inputTimezone !== $this->outputTimezone) {
                $dateTime->setTimezone(new \DateTimeZone($this->inputTimezone));
            }
        } catch (\Exception $e) {
            throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
        }

        return $dateTime;
    }
}
PK*`�\�Z�eYpear/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToArrayTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;

/**
 * Transforms between a normalized time and a localized time string/array.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 */
class DateTimeToArrayTransformer extends BaseDateTimeTransformer
{
    private $pad;

    private $fields;

    /**
     * Constructor.
     *
     * @param string  $inputTimezone  The input timezone
     * @param string  $outputTimezone The output timezone
     * @param array   $fields         The date fields
     * @param Boolean $pad            Whether to use padding
     *
     * @throws UnexpectedTypeException if a timezone is not a string
     */
    public function __construct($inputTimezone = null, $outputTimezone = null, array $fields = null, $pad = false)
    {
        parent::__construct($inputTimezone, $outputTimezone);

        if (null === $fields) {
            $fields = array('year', 'month', 'day', 'hour', 'minute', 'second');
        }

        $this->fields = $fields;
        $this->pad = (Boolean) $pad;
    }

    /**
     * Transforms a normalized date into a localized date.
     *
     * @param \DateTime $dateTime Normalized date.
     *
     * @return array Localized date.
     *
     * @throws TransformationFailedException If the given value is not an
     *                                       instance of \DateTime or if the
     *                                       output timezone is not supported.
     */
    public function transform($dateTime)
    {
        if (null === $dateTime) {
            return array_intersect_key(array(
                'year'    => '',
                'month'   => '',
                'day'     => '',
                'hour'    => '',
                'minute'  => '',
                'second'  => '',
            ), array_flip($this->fields));
        }

        if (!$dateTime instanceof \DateTime) {
            throw new TransformationFailedException('Expected a \DateTime.');
        }

        $dateTime = clone $dateTime;
        if ($this->inputTimezone !== $this->outputTimezone) {
            try {
                $dateTime->setTimezone(new \DateTimeZone($this->outputTimezone));
            } catch (\Exception $e) {
                throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
            }
        }

        $result = array_intersect_key(array(
            'year'    => $dateTime->format('Y'),
            'month'   => $dateTime->format('m'),
            'day'     => $dateTime->format('d'),
            'hour'    => $dateTime->format('H'),
            'minute'  => $dateTime->format('i'),
            'second'  => $dateTime->format('s'),
        ), array_flip($this->fields));

        if (!$this->pad) {
            foreach ($result as &$entry) {
                // remove leading zeros
                $entry = (string) (int) $entry;
            }
        }

        return $result;
    }

    /**
     * Transforms a localized date into a normalized date.
     *
     * @param array $value Localized date
     *
     * @return \DateTime Normalized date
     *
     * @throws TransformationFailedException If the given value is not an array,
     *                                       if the value could not be transformed
     *                                       or if the input timezone is not
     *                                       supported.
     */
    public function reverseTransform($value)
    {
        if (null === $value) {
            return null;
        }

        if (!is_array($value)) {
            throw new TransformationFailedException('Expected an array.');
        }

        if ('' === implode('', $value)) {
            return null;
        }

        $emptyFields = array();

        foreach ($this->fields as $field) {
            if (!isset($value[$field])) {
                $emptyFields[] = $field;
            }
        }

        if (count($emptyFields) > 0) {
            throw new TransformationFailedException(
                sprintf('The fields "%s" should not be empty', implode('", "', $emptyFields)
            ));
        }

        if (isset($value['month']) && !ctype_digit((string) $value['month'])) {
            throw new TransformationFailedException('This month is invalid');
        }

        if (isset($value['day']) && !ctype_digit((string) $value['day'])) {
            throw new TransformationFailedException('This day is invalid');
        }

        if (isset($value['year']) && !ctype_digit((string) $value['year'])) {
            throw new TransformationFailedException('This year is invalid');
        }

        if (!empty($value['month']) && !empty($value['day']) && !empty($value['year']) && false === checkdate($value['month'], $value['day'], $value['year'])) {
            throw new TransformationFailedException('This is an invalid date');
        }

        if (isset($value['hour']) && !ctype_digit((string) $value['hour'])) {
            throw new TransformationFailedException('This hour is invalid');
        }

        if (isset($value['minute']) && !ctype_digit((string) $value['minute'])) {
            throw new TransformationFailedException('This minute is invalid');
        }

        if (isset($value['second']) && !ctype_digit((string) $value['second'])) {
            throw new TransformationFailedException('This second is invalid');
        }

        try {
            $dateTime = new \DateTime(sprintf(
                '%s-%s-%s %s:%s:%s %s',
                empty($value['year']) ? '1970' : $value['year'],
                empty($value['month']) ? '1' : $value['month'],
                empty($value['day']) ? '1' : $value['day'],
                empty($value['hour']) ? '0' : $value['hour'],
                empty($value['minute']) ? '0' : $value['minute'],
                empty($value['second']) ? '0' : $value['second'],
                $this->outputTimezone
            ));

            if ($this->inputTimezone !== $this->outputTimezone) {
                $dateTime->setTimezone(new \DateTimeZone($this->inputTimezone));
            }
        } catch (\Exception $e) {
            throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
        }

        return $dateTime;
    }
}
PK+`�\���T��Ypear/Symfony/Component/Form/Extension/Core/DataTransformer/BooleanToStringTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * Transforms between a Boolean and a string.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 */
class BooleanToStringTransformer implements DataTransformerInterface
{
    /**
     * The value emitted upon transform if the input is true
     * @var string
     */
    private $trueValue;

    /**
     * Sets the value emitted upon transform if the input is true.
     *
     * @param string $trueValue
     */
    public function __construct($trueValue)
    {
        $this->trueValue = $trueValue;
    }

    /**
     * Transforms a Boolean into a string.
     *
     * @param Boolean $value Boolean value.
     *
     * @return string String value.
     *
     * @throws TransformationFailedException If the given value is not a Boolean.
     */
    public function transform($value)
    {
        if (null === $value) {
            return null;
        }

        if (!is_bool($value)) {
            throw new TransformationFailedException('Expected a Boolean.');
        }

        return $value ? $this->trueValue : null;
    }

    /**
     * Transforms a string into a Boolean.
     *
     * @param string $value String value.
     *
     * @return Boolean Boolean value.
     *
     * @throws TransformationFailedException If the given value is not a string.
     */
    public function reverseTransform($value)
    {
        if (null === $value) {
            return false;
        }

        if (!is_string($value)) {
            throw new TransformationFailedException('Expected a string.');
        }

        return true;
    }

}
PK,`�\c�8V�	�	Spear/Symfony/Component/Form/Extension/Core/DataTransformer/DataTransformerChain.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * Passes a value through multiple value transformers
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class DataTransformerChain implements DataTransformerInterface
{
    /**
     * The value transformers
     * @var DataTransformerInterface[]
     */
    protected $transformers;

    /**
     * Uses the given value transformers to transform values
     *
     * @param array $transformers
     */
    public function __construct(array $transformers)
    {
        $this->transformers = $transformers;
    }

    /**
     * Passes the value through the transform() method of all nested transformers
     *
     * The transformers receive the value in the same order as they were passed
     * to the constructor. Each transformer receives the result of the previous
     * transformer as input. The output of the last transformer is returned
     * by this method.
     *
     * @param mixed $value The original value
     *
     * @return mixed The transformed value
     *
     * @throws TransformationFailedException
     */
    public function transform($value)
    {
        foreach ($this->transformers as $transformer) {
            $value = $transformer->transform($value);
        }

        return $value;
    }

    /**
     * Passes the value through the reverseTransform() method of all nested
     * transformers
     *
     * The transformers receive the value in the reverse order as they were passed
     * to the constructor. Each transformer receives the result of the previous
     * transformer as input. The output of the last transformer is returned
     * by this method.
     *
     * @param mixed $value The transformed value
     *
     * @return mixed The reverse-transformed value
     *
     * @throws TransformationFailedException
     */
    public function reverseTransform($value)
    {
        for ($i = count($this->transformers) - 1; $i >= 0; --$i) {
            $value = $this->transformers[$i]->reverseTransform($value);
        }

        return $value;
    }
}
PK,`�\�H��		Vpear/Symfony/Component/Form/Extension/Core/DataTransformer/ArrayToPartsTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ArrayToPartsTransformer implements DataTransformerInterface
{
    private $partMapping;

    public function __construct(array $partMapping)
    {
        $this->partMapping = $partMapping;
    }

    public function transform($array)
    {
        if (null === $array) {
            $array = array();
        }

        if (!is_array($array) ) {
            throw new TransformationFailedException('Expected an array.');
        }

        $result = array();

        foreach ($this->partMapping as $partKey => $originalKeys) {
            if (empty($array)) {
                $result[$partKey] = null;
            } else {
                $result[$partKey] = array_intersect_key($array, array_flip($originalKeys));
            }
        }

        return $result;
    }

    public function reverseTransform($array)
    {
        if (!is_array($array) ) {
            throw new TransformationFailedException('Expected an array.');
        }

        $result = array();
        $emptyKeys = array();

        foreach ($this->partMapping as $partKey => $originalKeys) {
            if (!empty($array[$partKey])) {
                foreach ($originalKeys as $originalKey) {
                    if (isset($array[$partKey][$originalKey])) {
                        $result[$originalKey] = $array[$partKey][$originalKey];
                    }
                }
            } else {
                $emptyKeys[] = $partKey;
            }
        }

        if (count($emptyKeys) > 0) {
            if (count($emptyKeys) === count($this->partMapping)) {
                // All parts empty
                return null;
            }

            throw new TransformationFailedException(
                sprintf('The keys "%s" should not be empty', implode('", "', $emptyKeys)
            ));
        }

        return $result;
    }
}
PK-`�\O�#�#�#apear/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * Transforms between a number type and a localized number with grouping
 * (each thousand) and comma separators.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 */
class NumberToLocalizedStringTransformer implements DataTransformerInterface
{
    /**
     * Rounds a number towards positive infinity.
     *
     * Rounds 1.4 to 2 and -1.4 to -1.
     */
    const ROUND_CEILING = \NumberFormatter::ROUND_CEILING;

    /**
     * Rounds a number towards negative infinity.
     *
     * Rounds 1.4 to 1 and -1.4 to -2.
     */
    const ROUND_FLOOR = \NumberFormatter::ROUND_FLOOR;

    /**
     * Rounds a number away from zero.
     *
     * Rounds 1.4 to 2 and -1.4 to -2.
     */
    const ROUND_UP = \NumberFormatter::ROUND_UP;

    /**
     * Rounds a number towards zero.
     *
     * Rounds 1.4 to 1 and -1.4 to -1.
     */
    const ROUND_DOWN = \NumberFormatter::ROUND_DOWN;

    /**
     * Rounds to the nearest number and halves to the next even number.
     *
     * Rounds 2.5, 1.6 and 1.5 to 2 and 1.4 to 1.
     */
    const ROUND_HALF_EVEN = \NumberFormatter::ROUND_HALFEVEN;

    /**
     * Rounds to the nearest number and halves away from zero.
     *
     * Rounds 2.5 to 3, 1.6 and 1.5 to 2 and 1.4 to 1.
     */
    const ROUND_HALF_UP = \NumberFormatter::ROUND_HALFUP;

    /**
     * Rounds to the nearest number and halves towards zero.
     *
     * Rounds 2.5 and 1.6 to 2, 1.5 and 1.4 to 1.
     */
    const ROUND_HALF_DOWN = \NumberFormatter::ROUND_HALFDOWN;

    /**
     * Alias for {@link self::ROUND_HALF_EVEN}.
     *
     * @deprecated Deprecated as of Symfony 2.4, to be removed in Symfony 3.0.
     */
    const ROUND_HALFEVEN = self::ROUND_HALF_EVEN;

    /**
     * Alias for {@link self::ROUND_HALF_UP}.
     *
     * @deprecated Deprecated as of Symfony 2.4, to be removed in Symfony 3.0.
     */
    const ROUND_HALFUP = self::ROUND_HALF_UP;

    /**
     * Alias for {@link self::ROUND_HALF_DOWN}.
     *
     * @deprecated Deprecated as of Symfony 2.4, to be removed in Symfony 3.0.
     */
    const ROUND_HALFDOWN = self::ROUND_HALF_DOWN;

    protected $precision;

    protected $grouping;

    protected $roundingMode;

    public function __construct($precision = null, $grouping = false, $roundingMode = self::ROUND_HALF_UP)
    {
        if (null === $grouping) {
            $grouping = false;
        }

        if (null === $roundingMode) {
            $roundingMode = self::ROUND_HALF_UP;
        }

        $this->precision = $precision;
        $this->grouping = $grouping;
        $this->roundingMode = $roundingMode;
    }

    /**
     * Transforms a number type into localized number.
     *
     * @param integer|float $value Number value.
     *
     * @return string Localized value.
     *
     * @throws TransformationFailedException If the given value is not numeric
     *                                       or if the value can not be transformed.
     */
    public function transform($value)
    {
        if (null === $value) {
            return '';
        }

        if (!is_numeric($value)) {
            throw new TransformationFailedException('Expected a numeric.');
        }

        $formatter = $this->getNumberFormatter();
        $value = $formatter->format($value);

        if (intl_is_failure($formatter->getErrorCode())) {
            throw new TransformationFailedException($formatter->getErrorMessage());
        }

        // Convert fixed spaces to normal ones
        $value = str_replace("\xc2\xa0", ' ', $value);

        return $value;
    }

    /**
     * Transforms a localized number into an integer or float
     *
     * @param string $value The localized value
     *
     * @return integer|float The numeric value
     *
     * @throws TransformationFailedException If the given value is not a string
     *                                       or if the value can not be transformed.
     */
    public function reverseTransform($value)
    {
        if (!is_string($value)) {
            throw new TransformationFailedException('Expected a string.');
        }

        if ('' === $value) {
            return null;
        }

        if ('NaN' === $value) {
            throw new TransformationFailedException('"NaN" is not a valid number');
        }

        $position = 0;
        $formatter = $this->getNumberFormatter();
        $groupSep = $formatter->getSymbol(\NumberFormatter::GROUPING_SEPARATOR_SYMBOL);
        $decSep = $formatter->getSymbol(\NumberFormatter::DECIMAL_SEPARATOR_SYMBOL);

        if ('.' !== $decSep && (!$this->grouping || '.' !== $groupSep)) {
            $value = str_replace('.', $decSep, $value);
        }

        if (',' !== $decSep && (!$this->grouping || ',' !== $groupSep)) {
            $value = str_replace(',', $decSep, $value);
        }

        $result = $formatter->parse($value, \NumberFormatter::TYPE_DOUBLE, $position);

        if (intl_is_failure($formatter->getErrorCode())) {
            throw new TransformationFailedException($formatter->getErrorMessage());
        }

        if ($result >= PHP_INT_MAX || $result <= -PHP_INT_MAX) {
            throw new TransformationFailedException('I don\'t have a clear idea what infinity looks like');
        }

        if (function_exists('mb_detect_encoding') && false !== $encoding = mb_detect_encoding($value)) {
            $strlen = function ($string) use ($encoding) {
                return mb_strlen($string, $encoding);
            };
            $substr = function ($string, $offset, $length) use ($encoding) {
                return mb_substr($string, $offset, $length, $encoding);
            };
        } else {
            $strlen = 'strlen';
            $substr = 'substr';
        }

        $length = $strlen($value);

        // After parsing, position holds the index of the character where the
        // parsing stopped
        if ($position < $length) {
            // Check if there are unrecognized characters at the end of the
            // number (excluding whitespace characters)
            $remainder = trim($substr($value, $position, $length), " \t\n\r\0\x0b\xc2\xa0");

            if ('' !== $remainder) {
                throw new TransformationFailedException(
                    sprintf('The number contains unrecognized characters: "%s"', $remainder)
                );
            }
        }

        // NumberFormatter::parse() does not round
        return $this->round($result);
    }

    /**
     * Returns a preconfigured \NumberFormatter instance
     *
     * @return \NumberFormatter
     */
    protected function getNumberFormatter()
    {
        $formatter = new \NumberFormatter(\Locale::getDefault(), \NumberFormatter::DECIMAL);

        if (null !== $this->precision) {
            $formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, $this->precision);
            $formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, $this->roundingMode);
        }

        $formatter->setAttribute(\NumberFormatter::GROUPING_USED, $this->grouping);

        return $formatter;
    }

    /**
     * Rounds a number according to the configured precision and rounding mode.
     *
     * @param integer|float $number A number.
     *
     * @return integer|float The rounded number.
     */
    private function round($number)
    {
        if (null !== $this->precision && null !== $this->roundingMode) {
            // shift number to maintain the correct precision during rounding
            $roundingCoef = pow(10, $this->precision);
            $number *= $roundingCoef;

            switch ($this->roundingMode) {
                case self::ROUND_CEILING:
                    $number = ceil($number);
                    break;
                case self::ROUND_FLOOR:
                    $number = floor($number);
                    break;
                case self::ROUND_UP:
                    $number = $number > 0 ? ceil($number) : floor($number);
                    break;
                case self::ROUND_DOWN:
                    $number = $number > 0 ? floor($number) : ceil($number);
                    break;
                case self::ROUND_HALF_EVEN:
                    $number = round($number, 0, PHP_ROUND_HALF_EVEN);
                    break;
                case self::ROUND_HALF_UP:
                    $number = round($number, 0, PHP_ROUND_HALF_UP);
                    break;
                case self::ROUND_HALF_DOWN:
                    $number = round($number, 0, PHP_ROUND_HALF_DOWN);
                    break;
            }

            $number /= $roundingCoef;
        }

        return $number;
    }
}
PK-`�\)b�""cpear/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;

/**
 * Transforms between a normalized time and a localized time string
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 */
class DateTimeToLocalizedStringTransformer extends BaseDateTimeTransformer
{
    private $dateFormat;
    private $timeFormat;
    private $pattern;
    private $calendar;

    /**
     * Constructor.
     *
     * @see BaseDateTimeTransformer::formats for available format options
     *
     * @param string  $inputTimezone  The name of the input timezone
     * @param string  $outputTimezone The name of the output timezone
     * @param integer $dateFormat     The date format
     * @param integer $timeFormat     The time format
     * @param integer $calendar       One of the \IntlDateFormatter calendar constants
     * @param string  $pattern        A pattern to pass to \IntlDateFormatter
     *
     * @throws UnexpectedTypeException If a format is not supported or if a timezone is not a string
     */
    public function __construct($inputTimezone = null, $outputTimezone = null, $dateFormat = null, $timeFormat = null, $calendar = \IntlDateFormatter::GREGORIAN, $pattern = null)
    {
        parent::__construct($inputTimezone, $outputTimezone);

        if (null === $dateFormat) {
            $dateFormat = \IntlDateFormatter::MEDIUM;
        }

        if (null === $timeFormat) {
            $timeFormat = \IntlDateFormatter::SHORT;
        }

        if (!in_array($dateFormat, self::$formats, true)) {
            throw new UnexpectedTypeException($dateFormat, implode('", "', self::$formats));
        }

        if (!in_array($timeFormat, self::$formats, true)) {
            throw new UnexpectedTypeException($timeFormat, implode('", "', self::$formats));
        }

        $this->dateFormat = $dateFormat;
        $this->timeFormat = $timeFormat;
        $this->calendar = $calendar;
        $this->pattern = $pattern;
    }

    /**
     * Transforms a normalized date into a localized date string/array.
     *
     * @param \DateTime $dateTime Normalized date.
     *
     * @return string|array Localized date string/array.
     *
     * @throws TransformationFailedException If the given value is not an instance
     *                                       of \DateTime or if the date could not
     *                                       be transformed.
     */
    public function transform($dateTime)
    {
        if (null === $dateTime) {
            return '';
        }

        if (!$dateTime instanceof \DateTime) {
            throw new TransformationFailedException('Expected a \DateTime.');
        }

        // convert time to UTC before passing it to the formatter
        $dateTime = clone $dateTime;
        if ('UTC' !== $this->inputTimezone) {
            $dateTime->setTimezone(new \DateTimeZone('UTC'));
        }

        $value = $this->getIntlDateFormatter()->format((int) $dateTime->format('U'));

        if (intl_get_error_code() != 0) {
            throw new TransformationFailedException(intl_get_error_message());
        }

        return $value;
    }

    /**
     * Transforms a localized date string/array into a normalized date.
     *
     * @param string|array $value Localized date string/array
     *
     * @return \DateTime Normalized date
     *
     * @throws TransformationFailedException if the given value is not a string,
     *                                       if the date could not be parsed or
     *                                       if the input timezone is not supported
     */
    public function reverseTransform($value)
    {
        if (!is_string($value)) {
            throw new TransformationFailedException('Expected a string.');
        }

        if ('' === $value) {
            return null;
        }

        $timestamp = $this->getIntlDateFormatter()->parse($value);

        if (intl_get_error_code() != 0) {
            throw new TransformationFailedException(intl_get_error_message());
        }

        try {
            // read timestamp into DateTime object - the formatter delivers in UTC
            $dateTime = new \DateTime(sprintf('@%s UTC', $timestamp));
        } catch (\Exception $e) {
            throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
        }

        if ('UTC' !== $this->inputTimezone) {
            try {
                $dateTime->setTimezone(new \DateTimeZone($this->inputTimezone));
            } catch (\Exception $e) {
                throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
            }
        }

        return $dateTime;
    }

    /**
     * Returns a preconfigured IntlDateFormatter instance
     *
     * @return \IntlDateFormatter
     */
    protected function getIntlDateFormatter()
    {
        $dateFormat = $this->dateFormat;
        $timeFormat = $this->timeFormat;
        $timezone = $this->outputTimezone;
        $calendar = $this->calendar;
        $pattern = $this->pattern;

        $intlDateFormatter = new \IntlDateFormatter(\Locale::getDefault(), $dateFormat, $timeFormat, $timezone, $calendar, $pattern);
        $intlDateFormatter->setLenient(false);

        return $intlDateFormatter;
    }
}
PK-`�\�"h���Wpear/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToValueTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ChoiceToValueTransformer implements DataTransformerInterface
{
    private $choiceList;

    /**
     * Constructor.
     *
     * @param ChoiceListInterface $choiceList
     */
    public function __construct(ChoiceListInterface $choiceList)
    {
        $this->choiceList = $choiceList;
    }

    public function transform($choice)
    {
        return (string) current($this->choiceList->getValuesForChoices(array($choice)));
    }

    public function reverseTransform($value)
    {
        if (null !== $value && !is_scalar($value)) {
            throw new TransformationFailedException('Expected a scalar.');
        }

        // These are now valid ChoiceList values, so we can return null
        // right away
        if ('' === $value || null === $value) {
            return null;
        }

        $choices = $this->choiceList->getChoicesForValues(array($value));

        if (1 !== count($choices)) {
            throw new TransformationFailedException(sprintf('The choice "%s" does not exist or is not unique', $value));
        }

        $choice = current($choices);

        return '' === $choice ? null : $choice;
    }
}
PK-`�\Ud�qbpear/Symfony/Component/Form/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

/**
 * Transforms between an integer and a localized number with grouping
 * (each thousand) and comma separators.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class IntegerToLocalizedStringTransformer extends NumberToLocalizedStringTransformer
{
    /**
     * Constructs a transformer.
     *
     * @param integer $precision    Unused.
     * @param Boolean $grouping     Whether thousands should be grouped.
     * @param integer $roundingMode One of the ROUND_ constants in this class.
     */
    public function __construct($precision = 0, $grouping = false, $roundingMode = self::ROUND_DOWN)
    {
        if (null === $roundingMode) {
            $roundingMode = self::ROUND_DOWN;
        }

        parent::__construct(0, $grouping, $roundingMode);
    }

    /**
     * {@inheritDoc}
     */
    public function reverseTransform($value)
    {
        $result = parent::reverseTransform($value);

        return null !== $result ? (int) $result : null;
    }
}
PK-`�\ΎgW� � Zpear/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;

/**
 * Transforms between a date string and a DateTime object
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 */
class DateTimeToStringTransformer extends BaseDateTimeTransformer
{
    /**
     * Format used for generating strings
     * @var string
     */
    private $generateFormat;

    /**
     * Format used for parsing strings
     *
     * Different than the {@link $generateFormat} because formats for parsing
     * support additional characters in PHP that are not supported for
     * generating strings.
     *
     * @var string
     */
    private $parseFormat;

    /**
     * Whether to parse by appending a pipe "|" to the parse format.
     *
     * This only works as of PHP 5.3.7.
     *
     * @var Boolean
     */
    private $parseUsingPipe;

    /**
     * Transforms a \DateTime instance to a string
     *
     * @see \DateTime::format() for supported formats
     *
     * @param string  $inputTimezone  The name of the input timezone
     * @param string  $outputTimezone The name of the output timezone
     * @param string  $format         The date format
     * @param Boolean $parseUsingPipe Whether to parse by appending a pipe "|" to the parse format
     *
     * @throws UnexpectedTypeException if a timezone is not a string
     */
    public function __construct($inputTimezone = null, $outputTimezone = null, $format = 'Y-m-d H:i:s', $parseUsingPipe = null)
    {
        parent::__construct($inputTimezone, $outputTimezone);

        $this->generateFormat = $this->parseFormat = $format;

        // The pipe in the parser pattern only works as of PHP 5.3.7
        // See http://bugs.php.net/54316
        $this->parseUsingPipe = null === $parseUsingPipe
            ? version_compare(phpversion(), '5.3.7', '>=')
            : $parseUsingPipe;

        // See http://php.net/manual/en/datetime.createfromformat.php
        // The character "|" in the format makes sure that the parts of a date
        // that are *not* specified in the format are reset to the corresponding
        // values from 1970-01-01 00:00:00 instead of the current time.
        // Without "|" and "Y-m-d", "2010-02-03" becomes "2010-02-03 12:32:47",
        // where the time corresponds to the current server time.
        // With "|" and "Y-m-d", "2010-02-03" becomes "2010-02-03 00:00:00",
        // which is at least deterministic and thus used here.
        if ($this->parseUsingPipe && false === strpos($this->parseFormat, '|')) {
            $this->parseFormat .= '|';
        }
    }

    /**
     * Transforms a DateTime object into a date string with the configured format
     * and timezone
     *
     * @param \DateTime $value A DateTime object
     *
     * @return string A value as produced by PHP's date() function
     *
     * @throws TransformationFailedException If the given value is not a \DateTime
     *                                       instance or if the output timezone
     *                                       is not supported.
     */
    public function transform($value)
    {
        if (null === $value) {
            return '';
        }

        if (!$value instanceof \DateTime) {
            throw new TransformationFailedException('Expected a \DateTime.');
        }

        $value = clone $value;
        try {
            $value->setTimezone(new \DateTimeZone($this->outputTimezone));
        } catch (\Exception $e) {
            throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
        }

        return $value->format($this->generateFormat);
    }

    /**
     * Transforms a date string in the configured timezone into a DateTime object.
     *
     * @param string $value A value as produced by PHP's date() function
     *
     * @return \DateTime An instance of \DateTime
     *
     * @throws TransformationFailedException If the given value is not a string,
     *                                       if the date could not be parsed or
     *                                       if the input timezone is not supported.
     */
    public function reverseTransform($value)
    {
        if (empty($value)) {
            return null;
        }

        if (!is_string($value)) {
            throw new TransformationFailedException('Expected a string.');
        }

        try {
            $outputTz = new \DateTimeZone($this->outputTimezone);
            $dateTime = \DateTime::createFromFormat($this->parseFormat, $value, $outputTz);

            $lastErrors = \DateTime::getLastErrors();

            if (0 < $lastErrors['warning_count'] || 0 < $lastErrors['error_count']) {
                throw new TransformationFailedException(
                    implode(', ', array_merge(
                        array_values($lastErrors['warnings']),
                        array_values($lastErrors['errors'])
                    ))
                );
            }

            // On PHP versions < 5.3.7 we need to emulate the pipe operator
            // and reset parts not given in the format to their equivalent
            // of the UNIX base timestamp.
            if (!$this->parseUsingPipe) {
                list($year, $month, $day, $hour, $minute, $second) = explode('-', $dateTime->format('Y-m-d-H-i-s'));

                // Check which of the date parts are present in the pattern
                preg_match(
                    '/(' .
                    '(?P<day>[djDl])|' .
                    '(?P<month>[FMmn])|' .
                    '(?P<year>[Yy])|' .
                    '(?P<hour>[ghGH])|' .
                    '(?P<minute>i)|' .
                    '(?P<second>s)|' .
                    '(?P<dayofyear>z)|' .
                    '(?P<timestamp>U)|' .
                    '[^djDlFMmnYyghGHiszU]' .
                    ')*/',
                    $this->parseFormat,
                    $matches
                );

                // preg_match() does not guarantee to set all indices, so
                // set them unless given
                $matches = array_merge(array(
                    'day' => false,
                    'month' => false,
                    'year' => false,
                    'hour' => false,
                    'minute' => false,
                    'second' => false,
                    'dayofyear' => false,
                    'timestamp' => false,
                ), $matches);

                // Reset all parts that don't exist in the format to the
                // corresponding part of the UNIX base timestamp
                if (!$matches['timestamp']) {
                    if (!$matches['dayofyear']) {
                        if (!$matches['day']) {
                            $day = 1;
                        }
                        if (!$matches['month']) {
                            $month = 1;
                        }
                    }
                    if (!$matches['year']) {
                        $year = 1970;
                    }
                    if (!$matches['hour']) {
                        $hour = 0;
                    }
                    if (!$matches['minute']) {
                        $minute = 0;
                    }
                    if (!$matches['second']) {
                        $second = 0;
                    }
                    $dateTime->setDate($year, $month, $day);
                    $dateTime->setTime($hour, $minute, $second);
                }
            }

            if ($this->inputTimezone !== $this->outputTimezone) {
                $dateTime->setTimeZone(new \DateTimeZone($this->inputTimezone));
            }
        } catch (TransformationFailedException $e) {
            throw $e;
        } catch (\Exception $e) {
            throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
        }

        return $dateTime;
    }
}
PK.`�\e�^�		[pear/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToRfc3339Transformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class DateTimeToRfc3339Transformer extends BaseDateTimeTransformer
{
    /**
     * {@inheritDoc}
     */
    public function transform($dateTime)
    {
        if (null === $dateTime) {
            return '';
        }

        if (!$dateTime instanceof \DateTime) {
            throw new TransformationFailedException('Expected a \DateTime.');
        }

        if ($this->inputTimezone !== $this->outputTimezone) {
            $dateTime = clone $dateTime;
            $dateTime->setTimezone(new \DateTimeZone($this->outputTimezone));
        }

        return preg_replace('/\+00:00$/', 'Z', $dateTime->format('c'));
    }

    /**
     * {@inheritDoc}
     */
    public function reverseTransform($rfc3339)
    {
        if (!is_string($rfc3339)) {
            throw new TransformationFailedException('Expected a string.');
        }

        if ('' === $rfc3339) {
            return null;
        }

        try {
            $dateTime = new \DateTime($rfc3339);
        } catch (\Exception $e) {
            throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
        }

        if ($this->outputTimezone !== $dateTime->getTimezone()->getName()) {
            try {
                $dateTime->setTimezone(new \DateTimeZone($this->inputTimezone));
            } catch (\Exception $e) {
                throw new TransformationFailedException($e->getMessage(), $e->getCode(), $e);
            }
        }

        if (preg_match('/(\d{4})-(\d{2})-(\d{2})/', $rfc3339, $matches)) {
            if (!checkdate($matches[2], $matches[3], $matches[1])) {
                throw new TransformationFailedException(sprintf(
                    'The date "%s-%s-%s" is not a valid date.',
                    $matches[1],
                    $matches[2],
                    $matches[3]
                ));
            }
        }

        return $dateTime;
    }
}
PK.`�\/C���Vpear/Symfony/Component/Form/Extension/Core/DataTransformer/BaseDateTimeTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\InvalidArgumentException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;

abstract class BaseDateTimeTransformer implements DataTransformerInterface
{
    protected static $formats = array(
        \IntlDateFormatter::NONE,
        \IntlDateFormatter::FULL,
        \IntlDateFormatter::LONG,
        \IntlDateFormatter::MEDIUM,
        \IntlDateFormatter::SHORT,
    );

    protected $inputTimezone;

    protected $outputTimezone;

    /**
     * Constructor.
     *
     * @param string $inputTimezone  The name of the input timezone
     * @param string $outputTimezone The name of the output timezone
     *
     * @throws UnexpectedTypeException if a timezone is not a string
     * @throws InvalidArgumentException if a timezone is not valid
     */
    public function __construct($inputTimezone = null, $outputTimezone = null)
    {
        if (!is_string($inputTimezone) && null !== $inputTimezone) {
            throw new UnexpectedTypeException($inputTimezone, 'string');
        }

        if (!is_string($outputTimezone) && null !== $outputTimezone) {
            throw new UnexpectedTypeException($outputTimezone, 'string');
        }

        $this->inputTimezone = $inputTimezone ?: date_default_timezone_get();
        $this->outputTimezone = $outputTimezone ?: date_default_timezone_get();

        // Check if input and output timezones are valid
        try {
            new \DateTimeZone($this->inputTimezone);
        } catch (\Exception $e) {
            throw new InvalidArgumentException(sprintf('Input timezone is invalid: %s.', $this->inputTimezone), $e->getCode(), $e);
        }

        try {
            new \DateTimeZone($this->outputTimezone);
        } catch (\Exception $e) {
            throw new InvalidArgumentException(sprintf('Output timezone is invalid: %s.', $this->outputTimezone), $e->getCode(), $e);
        }
    }
}
PK.`�\]��yD	D	`pear/Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * Transforms between a normalized format and a localized money string.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 */
class MoneyToLocalizedStringTransformer extends NumberToLocalizedStringTransformer
{
    private $divisor;

    public function __construct($precision = 2, $grouping = true, $roundingMode = self::ROUND_HALF_UP, $divisor = 1)
    {
        if (null === $grouping) {
            $grouping = true;
        }

        if (null === $precision) {
            $precision = 2;
        }

        parent::__construct($precision, $grouping, $roundingMode);

        if (null === $divisor) {
            $divisor = 1;
        }

        $this->divisor = $divisor;
    }

    /**
     * Transforms a normalized format into a localized money string.
     *
     * @param number $value Normalized number
     *
     * @return string Localized money string.
     *
     * @throws TransformationFailedException If the given value is not numeric or
     *                                       if the value can not be transformed.
     */
    public function transform($value)
    {
        if (null !== $value) {
            if (!is_numeric($value)) {
                throw new TransformationFailedException('Expected a numeric.');
            }

            $value /= $this->divisor;
        }

        return parent::transform($value);
    }

    /**
     * Transforms a localized money string into a normalized format.
     *
     * @param string $value Localized money string
     *
     * @return number Normalized number
     *
     * @throws TransformationFailedException If the given value is not a string
     *                                       or if the value can not be transformed.
     */
    public function reverseTransform($value)
    {
        $value = parent::reverseTransform($value);

        if (null !== $value) {
            $value *= $this->divisor;
        }

        return $value;
    }

}
PK.`�\L�px&&^pear/Symfony/Component/Form/Extension/Core/DataTransformer/ChoiceToBooleanArrayTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ChoiceToBooleanArrayTransformer implements DataTransformerInterface
{
    private $choiceList;

    private $placeholderPresent;

    /**
     * Constructor.
     *
     * @param ChoiceListInterface $choiceList
     * @param Boolean             $placeholderPresent
     */
    public function __construct(ChoiceListInterface $choiceList, $placeholderPresent)
    {
        $this->choiceList = $choiceList;
        $this->placeholderPresent = $placeholderPresent;
    }

    /**
     * Transforms a single choice to a format appropriate for the nested
     * checkboxes/radio buttons.
     *
     * The result is an array with the options as keys and true/false as values,
     * depending on whether a given option is selected. If this field is rendered
     * as select tag, the value is not modified.
     *
     * @param mixed $choice An array if "multiple" is set to true, a scalar
     *                      value otherwise.
     *
     * @return mixed An array
     *
     * @throws TransformationFailedException If the given value is not scalar or
     *                                       if the choices can not be retrieved.
     */
    public function transform($choice)
    {
        try {
            $values = $this->choiceList->getValues();
        } catch (\Exception $e) {
            throw new TransformationFailedException('Can not get the choice list', $e->getCode(), $e);
        }

        $valueMap = array_flip($this->choiceList->getValuesForChoices(array($choice)));

        foreach ($values as $i => $value) {
            $values[$i] = isset($valueMap[$value]);
        }

        if ($this->placeholderPresent) {
            $values['placeholder'] = 0 === count($valueMap);
        }

        return $values;
    }

    /**
     * Transforms a checkbox/radio button array to a single choice.
     *
     * The input value is an array with the choices as keys and true/false as
     * values, depending on whether a given choice is selected. The output
     * is the selected choice.
     *
     * @param array $values An array of values
     *
     * @return mixed A scalar value
     *
     * @throws TransformationFailedException If the given value is not an array,
     *                                       if the recuperation of the choices
     *                                       fails or if some choice can't be
     *                                       found.
     */
    public function reverseTransform($values)
    {
        if (!is_array($values)) {
            throw new TransformationFailedException('Expected an array.');
        }

        try {
            $choices = $this->choiceList->getChoices();
        } catch (\Exception $e) {
            throw new TransformationFailedException('Can not get the choice list', $e->getCode(), $e);
        }

        foreach ($values as $i => $selected) {
            if ($selected) {
                if (isset($choices[$i])) {
                    return $choices[$i] === '' ? null : $choices[$i];
                } elseif ($this->placeholderPresent && 'placeholder' === $i) {
                    return null;
                } else {
                    throw new TransformationFailedException(sprintf('The choice "%s" does not exist', $i));
                }
            }
        }

        return null;
    }
}
PK/`�\D�U��>pear/Symfony/Component/Form/Extension/Core/Type/SubmitType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\SubmitButtonTypeInterface;

/**
 * A submit button.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class SubmitType extends AbstractType implements SubmitButtonTypeInterface
{
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['clicked'] = $form->isClicked();
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'button';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'submit';
    }
}
PK/`�\ٝ��GG<pear/Symfony/Component/Form/Extension/Core/Type/BaseType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * Encapsulates common logic of {@link FormType} and {@link ButtonType}.
 *
 * This type does not appear in the form's type inheritance chain and as such
 * cannot be extended (via {@link FormTypeExtension}s) nor themed.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class BaseType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->setDisabled($options['disabled']);
        $builder->setAutoInitialize($options['auto_initialize']);
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $name = $form->getName();
        $blockName = $options['block_name'] ?: $form->getName();
        $translationDomain = $options['translation_domain'];

        if ($view->parent) {
            if ('' !== ($parentFullName = $view->parent->vars['full_name'])) {
                $id = sprintf('%s_%s', $view->parent->vars['id'], $name);
                $fullName = sprintf('%s[%s]', $parentFullName, $name);
                $uniqueBlockPrefix = sprintf('%s_%s', $view->parent->vars['unique_block_prefix'], $blockName);
            } else {
                $id = $name;
                $fullName = $name;
                $uniqueBlockPrefix = '_'.$blockName;
            }

            if (!$translationDomain) {
                $translationDomain = $view->parent->vars['translation_domain'];
            }
        } else {
            $id = $name;
            $fullName = $name;
            $uniqueBlockPrefix = '_'.$blockName;

            // Strip leading underscores and digits. These are allowed in
            // form names, but not in HTML4 ID attributes.
            // http://www.w3.org/TR/html401/struct/global.html#adef-id
            $id = ltrim($id, '_0123456789');
        }

        $blockPrefixes = array();
        for ($type = $form->getConfig()->getType(); null !== $type; $type = $type->getParent()) {
            array_unshift($blockPrefixes, $type->getName());
        }
        $blockPrefixes[] = $uniqueBlockPrefix;

        if (!$translationDomain) {
            $translationDomain = 'messages';
        }

        $view->vars = array_replace($view->vars, array(
            'form'                => $view,
            'id'                  => $id,
            'name'                => $name,
            'full_name'           => $fullName,
            'disabled'            => $form->isDisabled(),
            'label'               => $options['label'],
            'multipart'           => false,
            'attr'                => $options['attr'],
            'block_prefixes'      => $blockPrefixes,
            'unique_block_prefix' => $uniqueBlockPrefix,
            'translation_domain'  => $translationDomain,
            // Using the block name here speeds up performance in collection
            // forms, where each entry has the same full block name.
            // Including the type is important too, because if rows of a
            // collection form have different types (dynamically), they should
            // be rendered differently.
            // https://github.com/symfony/symfony/issues/5038
            'cache_key'           => $uniqueBlockPrefix.'_'.$form->getConfig()->getType()->getName(),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'block_name'         => null,
            'disabled'           => false,
            'label'              => null,
            'attr'               => array(),
            'translation_domain' => null,
            'auto_initialize'    => true,
        ));

        $resolver->setAllowedTypes(array(
            'attr'       => 'array',
        ));
    }
}
PK0`�\7pO�LL=pear/Symfony/Component/Form/Extension/Core/Type/RadioType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;

class RadioType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'checkbox';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'radio';
    }
}
PK0`�\���HH=pear/Symfony/Component/Form/Extension/Core/Type/EmailType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;

class EmailType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'text';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'email';
    }
}
PK0`�\��TT@pear/Symfony/Component/Form/Extension/Core/Type/CheckboxType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\BooleanToStringTransformer;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CheckboxType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // Unlike in other types, where the data is NULL by default, it
        // needs to be a Boolean here. setData(null) is not acceptable
        // for checkboxes and radio buttons (unless a custom model
        // transformer handles this case).
        // We cannot solve this case via overriding the "data" option, because
        // doing so also calls setDataLocked(true).
        $builder->setData(isset($options['data']) ? $options['data'] : false);
        $builder->addViewTransformer(new BooleanToStringTransformer($options['value']));
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars = array_replace($view->vars, array(
            'value'   => $options['value'],
            'checked' => null !== $form->getViewData(),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $emptyData = function (FormInterface $form, $viewData) {
            return $viewData;
        };

        $resolver->setDefaults(array(
            'value'      => '1',
            'empty_data' => $emptyData,
            'compound'   => false,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'checkbox';
    }
}
PK0`�\M2\3,3,<pear/Symfony/Component/Form/Extension/Core/Type/DateType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToArrayTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer;
use Symfony\Component\Form\ReversedTransformer;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;

class DateType extends AbstractType
{
    const DEFAULT_FORMAT = \IntlDateFormatter::MEDIUM;

    const HTML5_FORMAT = 'yyyy-MM-dd';

    private static $acceptedFormats = array(
        \IntlDateFormatter::FULL,
        \IntlDateFormatter::LONG,
        \IntlDateFormatter::MEDIUM,
        \IntlDateFormatter::SHORT,
    );

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $dateFormat = is_int($options['format']) ? $options['format'] : self::DEFAULT_FORMAT;
        $timeFormat = \IntlDateFormatter::NONE;
        $calendar = \IntlDateFormatter::GREGORIAN;
        $pattern = is_string($options['format']) ? $options['format'] : null;

        if (!in_array($dateFormat, self::$acceptedFormats, true)) {
            throw new InvalidOptionsException('The "format" option must be one of the IntlDateFormatter constants (FULL, LONG, MEDIUM, SHORT) or a string representing a custom format.');
        }

        if (null !== $pattern && (false === strpos($pattern, 'y') || false === strpos($pattern, 'M') || false === strpos($pattern, 'd'))) {
            throw new InvalidOptionsException(sprintf('The "format" option should contain the letters "y", "M" and "d". Its current value is "%s".', $pattern));
        }

        if ('single_text' === $options['widget']) {
            $builder->addViewTransformer(new DateTimeToLocalizedStringTransformer(
                $options['model_timezone'],
                $options['view_timezone'],
                $dateFormat,
                $timeFormat,
                $calendar,
                $pattern
            ));
        } else {
            $yearOptions = $monthOptions = $dayOptions = array(
                'error_bubbling' => true,
            );

            $formatter = new \IntlDateFormatter(
                \Locale::getDefault(),
                $dateFormat,
                $timeFormat,
                'UTC',
                $calendar,
                $pattern
            );
            $formatter->setLenient(false);

            if ('choice' === $options['widget']) {
                // Only pass a subset of the options to children
                $yearOptions['choices'] = $this->formatTimestamps($formatter, '/y+/', $this->listYears($options['years']));
                $yearOptions['empty_value'] = $options['empty_value']['year'];
                $monthOptions['choices'] = $this->formatTimestamps($formatter, '/[M|L]+/', $this->listMonths($options['months']));
                $monthOptions['empty_value'] = $options['empty_value']['month'];
                $dayOptions['choices'] = $this->formatTimestamps($formatter, '/d+/', $this->listDays($options['days']));
                $dayOptions['empty_value'] = $options['empty_value']['day'];
            }

            // Append generic carry-along options
            foreach (array('required', 'translation_domain') as $passOpt) {
                $yearOptions[$passOpt] = $monthOptions[$passOpt] = $dayOptions[$passOpt] = $options[$passOpt];
            }

            $builder
                ->add('year', $options['widget'], $yearOptions)
                ->add('month', $options['widget'], $monthOptions)
                ->add('day', $options['widget'], $dayOptions)
                ->addViewTransformer(new DateTimeToArrayTransformer(
                    $options['model_timezone'], $options['view_timezone'], array('year', 'month', 'day')
                ))
                ->setAttribute('formatter', $formatter)
            ;
        }

        if ('string' === $options['input']) {
            $builder->addModelTransformer(new ReversedTransformer(
                new DateTimeToStringTransformer($options['model_timezone'], $options['model_timezone'], 'Y-m-d')
            ));
        } elseif ('timestamp' === $options['input']) {
            $builder->addModelTransformer(new ReversedTransformer(
                new DateTimeToTimestampTransformer($options['model_timezone'], $options['model_timezone'])
            ));
        } elseif ('array' === $options['input']) {
            $builder->addModelTransformer(new ReversedTransformer(
                new DateTimeToArrayTransformer($options['model_timezone'], $options['model_timezone'], array('year', 'month', 'day'))
            ));
        }
    }

    /**
     * {@inheritdoc}
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['widget'] = $options['widget'];

        // Change the input to a HTML5 date input if
        //  * the widget is set to "single_text"
        //  * the format matches the one expected by HTML5
        if ('single_text' === $options['widget'] && self::HTML5_FORMAT === $options['format']) {
            $view->vars['type'] = 'date';
        }

        if ($form->getConfig()->hasAttribute('formatter')) {
            $pattern = $form->getConfig()->getAttribute('formatter')->getPattern();

            // remove special characters unless the format was explicitly specified
            if (!is_string($options['format'])) {
                $pattern = preg_replace('/[^yMd]+/', '', $pattern);
            }

            // set right order with respect to locale (e.g.: de_DE=dd.MM.yy; en_US=M/d/yy)
            // lookup various formats at http://userguide.icu-project.org/formatparse/datetime
            if (preg_match('/^([yMd]+)[^yMd]*([yMd]+)[^yMd]*([yMd]+)$/', $pattern)) {
                $pattern = preg_replace(array('/y+/', '/M+/', '/d+/'), array('{{ year }}', '{{ month }}', '{{ day }}'), $pattern);
            } else {
                // default fallback
                $pattern = '{{ year }}{{ month }}{{ day }}';
            }

            $view->vars['date_pattern'] = $pattern;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $compound = function (Options $options) {
            return $options['widget'] !== 'single_text';
        };

        $emptyValue = $emptyValueDefault = function (Options $options) {
            return $options['required'] ? null : '';
        };

        $emptyValueNormalizer = function (Options $options, $emptyValue) use ($emptyValueDefault) {
            if (is_array($emptyValue)) {
                $default = $emptyValueDefault($options);

                return array_merge(
                    array('year' => $default, 'month' => $default, 'day' => $default),
                    $emptyValue
                );
            }

            return array(
                'year' => $emptyValue,
                'month' => $emptyValue,
                'day' => $emptyValue
            );
        };

        $format = function (Options $options) {
            return $options['widget'] === 'single_text' ? DateType::HTML5_FORMAT : DateType::DEFAULT_FORMAT;
        };

        $resolver->setDefaults(array(
            'years'          => range(date('Y') - 5, date('Y') + 5),
            'months'         => range(1, 12),
            'days'           => range(1, 31),
            'widget'         => 'choice',
            'input'          => 'datetime',
            'format'         => $format,
            'model_timezone' => null,
            'view_timezone'  => null,
            'empty_value'    => $emptyValue,
            // Don't modify \DateTime classes by reference, we treat
            // them like immutable value objects
            'by_reference'   => false,
            'error_bubbling' => false,
            // If initialized with a \DateTime object, FormType initializes
            // this option to "\DateTime". Since the internal, normalized
            // representation is not \DateTime, but an array, we need to unset
            // this option.
            'data_class'     => null,
            'compound'       => $compound,
        ));

        $resolver->setNormalizers(array(
            'empty_value' => $emptyValueNormalizer,
        ));

        $resolver->setAllowedValues(array(
            'input'     => array(
                'datetime',
                'string',
                'timestamp',
                'array',
            ),
            'widget'    => array(
                'single_text',
                'text',
                'choice',
            ),
        ));

        $resolver->setAllowedTypes(array(
            'format' => array('int', 'string'),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'date';
    }

    private function formatTimestamps(\IntlDateFormatter $formatter, $regex, array $timestamps)
    {
        $pattern = $formatter->getPattern();
        $timezone = $formatter->getTimezoneId();

        if ($setTimeZone = method_exists($formatter, 'setTimeZone')) {
            $formatter->setTimeZone('UTC');
        } else {
            $formatter->setTimeZoneId('UTC');
        }

        if (preg_match($regex, $pattern, $matches)) {
            $formatter->setPattern($matches[0]);

            foreach ($timestamps as $key => $timestamp) {
                $timestamps[$key] = $formatter->format($timestamp);
            }

            // I'd like to clone the formatter above, but then we get a
            // segmentation fault, so let's restore the old state instead
            $formatter->setPattern($pattern);
        }

        if ($setTimeZone) {
            $formatter->setTimeZone($timezone);
        } else {
            $formatter->setTimeZoneId($timezone);
        }

        return $timestamps;
    }

    private function listYears(array $years)
    {
        $result = array();

        foreach ($years as $year) {
            if (false !== $y = gmmktime(0, 0, 0, 6, 15, $year)) {
                $result[$year] = $y;
            }
        }

        return $result;
    }

    private function listMonths(array $months)
    {
        $result = array();

        foreach ($months as $month) {
            $result[$month] = gmmktime(0, 0, 0, $month, 15);
        }

        return $result;
    }

    private function listDays(array $days)
    {
        $result = array();

        foreach ($days as $day) {
            $result[$day] = gmmktime(0, 0, 0, 5, $day);
        }

        return $result;
    }
}
PK0`�\�Ѝ'��>pear/Symfony/Component/Form/Extension/Core/Type/HiddenType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class HiddenType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            // hidden fields cannot have a required attribute
            'required'       => false,
            // Pass errors to the parent
            'error_bubbling' => true,
            'compound'       => false,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'hidden';
    }
}
PK0`�\uƵ�``?pear/Symfony/Component/Form/Extension/Core/Type/IntegerType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\IntegerToLocalizedStringTransformer;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class IntegerType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addViewTransformer(
            new IntegerToLocalizedStringTransformer(
                $options['precision'],
                $options['grouping'],
                $options['rounding_mode']
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            // default precision is locale specific (usually around 3)
            'precision'     => null,
            'grouping'      => false,
            // Integer cast rounds towards 0, so do the same when displaying fractions
            'rounding_mode' => IntegerToLocalizedStringTransformer::ROUND_DOWN,
            'compound'      => false,
        ));

        $resolver->setAllowedValues(array(
            'rounding_mode' => array(
                IntegerToLocalizedStringTransformer::ROUND_FLOOR,
                IntegerToLocalizedStringTransformer::ROUND_DOWN,
                IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN,
                IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN,
                IntegerToLocalizedStringTransformer::ROUND_HALF_UP,
                IntegerToLocalizedStringTransformer::ROUND_UP,
                IntegerToLocalizedStringTransformer::ROUND_CEILING,
            ),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'integer';
    }
}
PK1`�\옇���@pear/Symfony/Component/Form/Extension/Core/Type/PasswordType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class PasswordType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        if ($options['always_empty'] || !$form->isSubmitted()) {
            $view->vars['value'] = '';
        }
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'always_empty' => true,
            'trim'         => false,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'text';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'password';
    }
}
PK1`�\�� &�'�'@pear/Symfony/Component/Form/Extension/Core/Type/DateTimeType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\ReversedTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\DataTransformerChain;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToArrayTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToRfc3339Transformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\ArrayToPartsTransformer;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class DateTimeType extends AbstractType
{
    const DEFAULT_DATE_FORMAT = \IntlDateFormatter::MEDIUM;

    const DEFAULT_TIME_FORMAT = \IntlDateFormatter::MEDIUM;

    /**
     * This is not quite the HTML5 format yet, because ICU lacks the
     * capability of parsing and generating RFC 3339 dates, which
     * are like the below pattern but with a timezone suffix. The
     * timezone suffix is
     *
     *  * "Z" for UTC
     *  * "(-|+)HH:mm" for other timezones (note the colon!)
     *
     * For more information see:
     *
     * http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax
     * http://www.w3.org/TR/html-markup/input.datetime.html
     * http://tools.ietf.org/html/rfc3339
     *
     * An ICU ticket was created:
     * http://icu-project.org/trac/ticket/9421
     *
     * It was supposedly fixed, but is not available in all PHP installations
     * yet. To temporarily circumvent this issue, DateTimeToRfc3339Transformer
     * is used when the format matches this constant.
     */
    const HTML5_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZZZZZ";

    private static $acceptedFormats = array(
        \IntlDateFormatter::FULL,
        \IntlDateFormatter::LONG,
        \IntlDateFormatter::MEDIUM,
        \IntlDateFormatter::SHORT,
    );

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $parts = array('year', 'month', 'day', 'hour');
        $dateParts = array('year', 'month', 'day');
        $timeParts = array('hour');

        if ($options['with_minutes']) {
            $parts[] = 'minute';
            $timeParts[] = 'minute';
        }

        if ($options['with_seconds']) {
            $parts[] = 'second';
            $timeParts[] = 'second';
        }

        $dateFormat = is_int($options['date_format']) ? $options['date_format'] : self::DEFAULT_DATE_FORMAT;
        $timeFormat = self::DEFAULT_TIME_FORMAT;
        $calendar = \IntlDateFormatter::GREGORIAN;
        $pattern = is_string($options['format']) ? $options['format'] : null;

        if (!in_array($dateFormat, self::$acceptedFormats, true)) {
            throw new InvalidOptionsException('The "date_format" option must be one of the IntlDateFormatter constants (FULL, LONG, MEDIUM, SHORT) or a string representing a custom format.');
        }

        if ('single_text' === $options['widget']) {
            if (self::HTML5_FORMAT === $pattern) {
                $builder->addViewTransformer(new DateTimeToRfc3339Transformer(
                    $options['model_timezone'],
                    $options['view_timezone']
                ));
            } else {
                $builder->addViewTransformer(new DateTimeToLocalizedStringTransformer(
                    $options['model_timezone'],
                    $options['view_timezone'],
                    $dateFormat,
                    $timeFormat,
                    $calendar,
                    $pattern
                ));
            }
        } else {
            // Only pass a subset of the options to children
            $dateOptions = array_intersect_key($options, array_flip(array(
                'years',
                'months',
                'days',
                'empty_value',
                'required',
                'translation_domain',
            )));

            $timeOptions = array_intersect_key($options, array_flip(array(
                'hours',
                'minutes',
                'seconds',
                'with_minutes',
                'with_seconds',
                'empty_value',
                'required',
                'translation_domain',
            )));

            if (null !== $options['date_widget']) {
                $dateOptions['widget'] = $options['date_widget'];
            }

            if (null !== $options['time_widget']) {
                $timeOptions['widget'] = $options['time_widget'];
            }

            if (null !== $options['date_format']) {
                $dateOptions['format'] = $options['date_format'];
            }

            $dateOptions['input'] = $timeOptions['input'] = 'array';
            $dateOptions['error_bubbling'] = $timeOptions['error_bubbling'] = true;

            $builder
                ->addViewTransformer(new DataTransformerChain(array(
                    new DateTimeToArrayTransformer($options['model_timezone'], $options['view_timezone'], $parts),
                    new ArrayToPartsTransformer(array(
                        'date' => $dateParts,
                        'time' => $timeParts,
                    )),
                )))
                ->add('date', 'date', $dateOptions)
                ->add('time', 'time', $timeOptions)
            ;
        }

        if ('string' === $options['input']) {
            $builder->addModelTransformer(new ReversedTransformer(
                new DateTimeToStringTransformer($options['model_timezone'], $options['model_timezone'])
            ));
        } elseif ('timestamp' === $options['input']) {
            $builder->addModelTransformer(new ReversedTransformer(
                new DateTimeToTimestampTransformer($options['model_timezone'], $options['model_timezone'])
            ));
        } elseif ('array' === $options['input']) {
            $builder->addModelTransformer(new ReversedTransformer(
                new DateTimeToArrayTransformer($options['model_timezone'], $options['model_timezone'], $parts)
            ));
        }
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['widget'] = $options['widget'];

        // Change the input to a HTML5 date input if
        //  * the widget is set to "single_text"
        //  * the format matches the one expected by HTML5
        if ('single_text' === $options['widget'] && self::HTML5_FORMAT === $options['format']) {
            $view->vars['type'] = 'datetime';
        }
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $compound = function (Options $options) {
            return $options['widget'] !== 'single_text';
        };

        // Defaults to the value of "widget"
        $dateWidget = function (Options $options) {
            return $options['widget'];
        };

        // Defaults to the value of "widget"
        $timeWidget = function (Options $options) {
            return $options['widget'];
        };

        $resolver->setDefaults(array(
            'input'          => 'datetime',
            'model_timezone' => null,
            'view_timezone'  => null,
            'format'         => self::HTML5_FORMAT,
            'date_format'    => null,
            'widget'         => null,
            'date_widget'    => $dateWidget,
            'time_widget'    => $timeWidget,
            'with_minutes'   => true,
            'with_seconds'   => false,
            // Don't modify \DateTime classes by reference, we treat
            // them like immutable value objects
            'by_reference'   => false,
            'error_bubbling' => false,
            // If initialized with a \DateTime object, FormType initializes
            // this option to "\DateTime". Since the internal, normalized
            // representation is not \DateTime, but an array, we need to unset
            // this option.
            'data_class'     => null,
            'compound'       => $compound,
        ));

        // Don't add some defaults in order to preserve the defaults
        // set in DateType and TimeType
        $resolver->setOptional(array(
            'empty_value',
            'years',
            'months',
            'days',
            'hours',
            'minutes',
            'seconds',
        ));

        $resolver->setAllowedValues(array(
            'input'       => array(
                'datetime',
                'string',
                'timestamp',
                'array',
            ),
            'date_widget' => array(
                null, // inherit default from DateType
                'single_text',
                'text',
                'choice',
            ),
            'time_widget' => array(
                null, // inherit default from TimeType
                'single_text',
                'text',
                'choice',
            ),
            // This option will overwrite "date_widget" and "time_widget" options
            'widget'     => array(
                null, // default, don't overwrite options
                'single_text',
                'text',
                'choice',
            ),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'datetime';
    }
}
PK1`�\���/�+�+>pear/Symfony/Component/Form/Extension/Core/Type/ChoiceType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\View\ChoiceView;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\Exception\LogicException;
use Symfony\Component\Form\Extension\Core\ChoiceList\SimpleChoiceList;
use Symfony\Component\Form\Extension\Core\EventListener\FixRadioInputListener;
use Symfony\Component\Form\Extension\Core\EventListener\FixCheckboxInputListener;
use Symfony\Component\Form\Extension\Core\EventListener\MergeCollectionListener;
use Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToValueTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToBooleanArrayTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\ChoicesToValuesTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\ChoicesToBooleanArrayTransformer;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class ChoiceType extends AbstractType
{
    /**
     * Caches created choice lists.
     * @var array
     */
    private $choiceListCache = array();

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if (!$options['choice_list'] && !is_array($options['choices']) && !$options['choices'] instanceof \Traversable) {
            throw new LogicException('Either the option "choices" or "choice_list" must be set.');
        }

        if ($options['expanded']) {
            // Initialize all choices before doing the index check below.
            // This helps in cases where index checks are optimized for non
            // initialized choice lists. For example, when using an SQL driver,
            // the index check would read in one SQL query and the initialization
            // requires another SQL query. When the initialization is done first,
            // one SQL query is sufficient.
            $preferredViews = $options['choice_list']->getPreferredViews();
            $remainingViews = $options['choice_list']->getRemainingViews();

            // Check if the choices already contain the empty value
            // Only add the empty value option if this is not the case
            if (null !== $options['empty_value'] && 0 === count($options['choice_list']->getChoicesForValues(array('')))) {
                $placeholderView = new ChoiceView(null, '', $options['empty_value']);

                // "placeholder" is a reserved index
                // see also ChoiceListInterface::getIndicesForChoices()
                $this->addSubForms($builder, array('placeholder' => $placeholderView), $options);
            }

            $this->addSubForms($builder, $preferredViews, $options);
            $this->addSubForms($builder, $remainingViews, $options);

            if ($options['multiple']) {
                $builder->addViewTransformer(new ChoicesToBooleanArrayTransformer($options['choice_list']));
                $builder->addEventSubscriber(new FixCheckboxInputListener($options['choice_list']), 10);
            } else {
                $builder->addViewTransformer(new ChoiceToBooleanArrayTransformer($options['choice_list'], $builder->has('placeholder')));
                $builder->addEventSubscriber(new FixRadioInputListener($options['choice_list'], $builder->has('placeholder')), 10);
            }
        } else {
            if ($options['multiple']) {
                $builder->addViewTransformer(new ChoicesToValuesTransformer($options['choice_list']));
            } else {
                $builder->addViewTransformer(new ChoiceToValueTransformer($options['choice_list']));
            }
        }

        if ($options['multiple'] && $options['by_reference']) {
            // Make sure the collection created during the client->norm
            // transformation is merged back into the original collection
            $builder->addEventSubscriber(new MergeCollectionListener(true, true));
        }
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars = array_replace($view->vars, array(
            'multiple'          => $options['multiple'],
            'expanded'          => $options['expanded'],
            'preferred_choices' => $options['choice_list']->getPreferredViews(),
            'choices'           => $options['choice_list']->getRemainingViews(),
            'separator'         => '-------------------',
            'empty_value'       => null,
        ));

        // The decision, whether a choice is selected, is potentially done
        // thousand of times during the rendering of a template. Provide a
        // closure here that is optimized for the value of the form, to
        // avoid making the type check inside the closure.
        if ($options['multiple']) {
            $view->vars['is_selected'] = function ($choice, array $values) {
                return false !== array_search($choice, $values, true);
            };
        } else {
            $view->vars['is_selected'] = function ($choice, $value) {
                return $choice === $value;
            };
        }

        // Check if the choices already contain the empty value
        $view->vars['empty_value_in_choices'] = 0 !== count($options['choice_list']->getChoicesForValues(array('')));

        // Only add the empty value option if this is not the case
        if (null !== $options['empty_value'] && !$view->vars['empty_value_in_choices']) {
            $view->vars['empty_value'] = $options['empty_value'];
        }

        if ($options['multiple'] && !$options['expanded']) {
            // Add "[]" to the name in case a select tag with multiple options is
            // displayed. Otherwise only one of the selected options is sent in the
            // POST request.
            $view->vars['full_name'] = $view->vars['full_name'].'[]';
        }
    }

    /**
     * {@inheritdoc}
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        if ($options['expanded']) {
            // Radio buttons should have the same name as the parent
            $childName = $view->vars['full_name'];

            // Checkboxes should append "[]" to allow multiple selection
            if ($options['multiple']) {
                $childName .= '[]';
            }

            foreach ($view as $childView) {
                $childView->vars['full_name'] = $childName;
            }
        }
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $choiceListCache =& $this->choiceListCache;

        $choiceList = function (Options $options) use (&$choiceListCache) {
            // Harden against NULL values (like in EntityType and ModelType)
            $choices = null !== $options['choices'] ? $options['choices'] : array();

            // Reuse existing choice lists in order to increase performance
            $hash = hash('sha256', json_encode(array($choices, $options['preferred_choices'])));

            if (!isset($choiceListCache[$hash])) {
                $choiceListCache[$hash] = new SimpleChoiceList($choices, $options['preferred_choices']);
            }

            return $choiceListCache[$hash];
        };

        $emptyData = function (Options $options) {
            if ($options['multiple'] || $options['expanded']) {
                return array();
            }

            return '';
        };

        $emptyValue = function (Options $options) {
            return $options['required'] ? null : '';
        };

        $emptyValueNormalizer = function (Options $options, $emptyValue) {
            if ($options['multiple']) {
                // never use an empty value for this case
                return null;
            } elseif (false === $emptyValue) {
                // an empty value should be added but the user decided otherwise
                return null;
            } elseif ($options['expanded'] && '' === $emptyValue) {
                // never use an empty label for radio buttons
                return 'None';
            }

            // empty value has been set explicitly
            return $emptyValue;
        };

        $compound = function (Options $options) {
            return $options['expanded'];
        };

        $resolver->setDefaults(array(
            'multiple'          => false,
            'expanded'          => false,
            'choice_list'       => $choiceList,
            'choices'           => array(),
            'preferred_choices' => array(),
            'empty_data'        => $emptyData,
            'empty_value'       => $emptyValue,
            'error_bubbling'    => false,
            'compound'          => $compound,
            // The view data is always a string, even if the "data" option
            // is manually set to an object.
            // See https://github.com/symfony/symfony/pull/5582
            'data_class'        => null,
        ));

        $resolver->setNormalizers(array(
            'empty_value' => $emptyValueNormalizer,
        ));

        $resolver->setAllowedTypes(array(
            'choice_list' => array('null', 'Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface'),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'choice';
    }

    /**
     * Adds the sub fields for an expanded choice field.
     *
     * @param FormBuilderInterface $builder     The form builder.
     * @param array                $choiceViews The choice view objects.
     * @param array                $options     The build options.
     */
    private function addSubForms(FormBuilderInterface $builder, array $choiceViews, array $options)
    {
        foreach ($choiceViews as $i => $choiceView) {
            if (is_array($choiceView)) {
                // Flatten groups
                $this->addSubForms($builder, $choiceView, $options);
            } else {
                $choiceOpts = array(
                    'value' => $choiceView->value,
                    'label' => $choiceView->label,
                    'translation_domain' => $options['translation_domain'],
                );

                if ($options['multiple']) {
                    $choiceType = 'checkbox';
                    // The user can check 0 or more checkboxes. If required
                    // is true, he is required to check all of them.
                    $choiceOpts['required'] = false;
                } else {
                    $choiceType = 'radio';
                }

                $builder->add($i, $choiceType, $choiceOpts);
            }
        }
    }
}
PK2`�\�_��LL@pear/Symfony/Component/Form/Extension/Core/Type/TimezoneType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TimezoneType extends AbstractType
{
    /**
     * Stores the available timezone choices
     * @var array
     */
    private static $timezones;

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'choices' => self::getTimezones(),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'choice';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'timezone';
    }

    /**
     * Returns the timezone choices.
     *
     * The choices are generated from the ICU function
     * \DateTimeZone::listIdentifiers(). They are cached during a single request,
     * so multiple timezone fields on the same page don't lead to unnecessary
     * overhead.
     *
     * @return array The timezone choices
     */
    public static function getTimezones()
    {
        if (null === static::$timezones) {
            static::$timezones = array();

            foreach (\DateTimeZone::listIdentifiers() as $timezone) {
                $parts = explode('/', $timezone);

                if (count($parts) > 2) {
                    $region = $parts[0];
                    $name = $parts[1].' - '.$parts[2];
                } elseif (count($parts) > 1) {
                    $region = $parts[0];
                    $name = $parts[1];
                } else {
                    $region = 'Other';
                    $name = $parts[0];
                }

                static::$timezones[$region][$timezone] = str_replace('_', ' ', $name);
            }
        }

        return static::$timezones;
    }
}
PK2`�\Z���^^?pear/Symfony/Component/Form/Extension/Core/Type/PercentType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class PercentType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addViewTransformer(new PercentToLocalizedStringTransformer($options['precision'], $options['type']));
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'precision' => 0,
            'type'      => 'fractional',
            'compound'  => false,
        ));

        $resolver->setAllowedValues(array(
            'type' => array(
                'fractional',
                'integer',
            ),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'percent';
    }
}
PK2`�\񍢸��@pear/Symfony/Component/Form/Extension/Core/Type/CurrencyType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Intl\Intl;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CurrencyType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'choices' => Intl::getCurrencyBundle()->getCurrencyNames(),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'choice';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'currency';
    }
}
PK2`�\5�S
��=pear/Symfony/Component/Form/Extension/Core/Type/MoneyType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\MoneyToLocalizedStringTransformer;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class MoneyType extends AbstractType
{
    protected static $patterns = array();

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->addViewTransformer(new MoneyToLocalizedStringTransformer(
                $options['precision'],
                $options['grouping'],
                null,
                $options['divisor']
            ))
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['money_pattern'] = self::getPattern($options['currency']);
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'precision' => 2,
            'grouping'  => false,
            'divisor'   => 1,
            'currency'  => 'EUR',
            'compound'  => false,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'money';
    }

    /**
     * Returns the pattern for this locale
     *
     * The pattern contains the placeholder "{{ widget }}" where the HTML tag should
     * be inserted
     */
    protected static function getPattern($currency)
    {
        if (!$currency) {
            return '{{ widget }}';
        }

        $locale = \Locale::getDefault();

        if (!isset(self::$patterns[$locale])) {
            self::$patterns[$locale] = array();
        }

        if (!isset(self::$patterns[$locale][$currency])) {
            $format = new \NumberFormatter($locale, \NumberFormatter::CURRENCY);
            $pattern = $format->formatCurrency('123', $currency);

            // the spacings between currency symbol and number are ignored, because
            // a single space leads to better readability in combination with input
            // fields

            // the regex also considers non-break spaces (0xC2 or 0xA0 in UTF-8)

            preg_match('/^([^\s\xc2\xa0]*)[\s\xc2\xa0]*123(?:[,.]0+)?[\s\xc2\xa0]*([^\s\xc2\xa0]*)$/u', $pattern, $matches);

            if (!empty($matches[1])) {
                self::$patterns[$locale][$currency] = $matches[1].' {{ widget }}';
            } elseif (!empty($matches[2])) {
                self::$patterns[$locale][$currency] = '{{ widget }} '.$matches[2];
            } else {
                self::$patterns[$locale][$currency] = '{{ widget }}';
            }
        }

        return self::$patterns[$locale][$currency];
    }
}
PK2`�\����@pear/Symfony/Component/Form/Extension/Core/Type/LanguageType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Intl\Intl;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class LanguageType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'choices' => Intl::getLanguageBundle()->getLanguageNames(),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'choice';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'language';
    }
}
PK2`�\�t�II@pear/Symfony/Component/Form/Extension/Core/Type/TextareaType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;

class TextareaType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['pattern'] = null;
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'text';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'textarea';
    }
}
PK2`�\�8��JJ>pear/Symfony/Component/Form/Extension/Core/Type/SearchType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;

class SearchType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'text';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'search';
    }
}
PK3`�\9�@pear/Symfony/Component/Form/Extension/Core/Type/RepeatedType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\ValueToDuplicatesTransformer;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class RepeatedType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // Overwrite required option for child fields
        $options['first_options']['required']  = $options['required'];
        $options['second_options']['required'] = $options['required'];

        if (!isset($options['options']['error_bubbling'])) {
            $options['options']['error_bubbling'] = $options['error_bubbling'];
        }

        $builder
            ->addViewTransformer(new ValueToDuplicatesTransformer(array(
                $options['first_name'],
                $options['second_name'],
            )))
            ->add($options['first_name'], $options['type'], array_merge($options['options'], $options['first_options']))
            ->add($options['second_name'], $options['type'], array_merge($options['options'], $options['second_options']))
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'type'           => 'text',
            'options'        => array(),
            'first_options'  => array(),
            'second_options' => array(),
            'first_name'     => 'first',
            'second_name'    => 'second',
            'error_bubbling' => false,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'repeated';
    }
}
PK3`�\:�y�

<pear/Symfony/Component/Form/Extension/Core/Type/FormType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\Extension\Core\EventListener\TrimListener;
use Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper;
use Symfony\Component\Form\Exception\LogicException;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;

class FormType extends BaseType
{
    /**
     * @var PropertyAccessorInterface
     */
    private $propertyAccessor;

    public function __construct(PropertyAccessorInterface $propertyAccessor = null)
    {
        $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor();
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $isDataOptionSet = array_key_exists('data', $options);

        $builder
            ->setRequired($options['required'])
            ->setErrorBubbling($options['error_bubbling'])
            ->setEmptyData($options['empty_data'])
            ->setPropertyPath($options['property_path'])
            ->setMapped($options['mapped'])
            ->setByReference($options['by_reference'])
            ->setInheritData($options['inherit_data'])
            ->setCompound($options['compound'])
            ->setData($isDataOptionSet ? $options['data'] : null)
            ->setDataLocked($isDataOptionSet)
            ->setDataMapper($options['compound'] ? new PropertyPathMapper($this->propertyAccessor) : null)
            ->setMethod($options['method'])
            ->setAction($options['action'])
        ;

        if ($options['trim']) {
            $builder->addEventSubscriber(new TrimListener());
        }
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        parent::buildView($view, $form, $options);

        $name = $form->getName();
        $readOnly = $options['read_only'];

        if ($view->parent) {
            if ('' === $name) {
                throw new LogicException('Form node with empty name can be used only as root form node.');
            }

            // Complex fields are read-only if they themselves or their parents are.
            if (!$readOnly) {
                $readOnly = $view->parent->vars['read_only'];
            }
        }

        $view->vars = array_replace($view->vars, array(
            'read_only'  => $readOnly,
            'errors'     => $form->getErrors(),
            'valid'      => $form->isSubmitted() ? $form->isValid() : true,
            'value'      => $form->getViewData(),
            'data'       => $form->getNormData(),
            'required'   => $form->isRequired(),
            'max_length' => $options['max_length'],
            'pattern'    => $options['pattern'],
            'size'       => null,
            'label_attr' => $options['label_attr'],
            'compound'   => $form->getConfig()->getCompound(),
            'method'     => $form->getConfig()->getMethod(),
            'action'     => $form->getConfig()->getAction(),
            'submitted'  => $form->isSubmitted(),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        $multipart = false;

        foreach ($view->children as $child) {
            if ($child->vars['multipart']) {
                $multipart = true;
                break;
            }
        }

        $view->vars['multipart'] = $multipart;
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        parent::setDefaultOptions($resolver);

        // Derive "data_class" option from passed "data" object
        $dataClass = function (Options $options) {
            return isset($options['data']) && is_object($options['data']) ? get_class($options['data']) : null;
        };

        // Derive "empty_data" closure from "data_class" option
        $emptyData = function (Options $options) {
            $class = $options['data_class'];

            if (null !== $class) {
                return function (FormInterface $form) use ($class) {
                    return $form->isEmpty() && !$form->isRequired() ? null : new $class();
                };
            }

            return function (FormInterface $form) {
                return $form->getConfig()->getCompound() ? array() : '';
            };
        };

        // For any form that is not represented by a single HTML control,
        // errors should bubble up by default
        $errorBubbling = function (Options $options) {
            return $options['compound'];
        };

        // BC with old "virtual" option
        $inheritData = function (Options $options) {
            if (null !== $options['virtual']) {
                // Uncomment this as soon as the deprecation note should be shown
                // trigger_error('The form option "virtual" is deprecated since version 2.3 and will be removed in 3.0. Use "inherit_data" instead.', E_USER_DEPRECATED);
                return $options['virtual'];
            }

            return false;
        };

        // If data is given, the form is locked to that data
        // (independent of its value)
        $resolver->setOptional(array(
            'data',
        ));

        $resolver->setDefaults(array(
            'data_class'         => $dataClass,
            'empty_data'         => $emptyData,
            'trim'               => true,
            'required'           => true,
            'read_only'          => false,
            'max_length'         => null,
            'pattern'            => null,
            'property_path'      => null,
            'mapped'             => true,
            'by_reference'       => true,
            'error_bubbling'     => $errorBubbling,
            'label_attr'         => array(),
            'virtual'            => null,
            'inherit_data'       => $inheritData,
            'compound'           => true,
            'method'             => 'POST',
            // According to RFC 2396 (http://www.ietf.org/rfc/rfc2396.txt)
            // section 4.2., empty URIs are considered same-document references
            'action'             => '',
        ));

        $resolver->setAllowedTypes(array(
            'label_attr' => 'array',
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'form';
    }
}
PK3`�\[Gԃ��Bpear/Symfony/Component/Form/Extension/Core/Type/CollectionType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Extension\Core\EventListener\ResizeFormListener;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CollectionType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if ($options['allow_add'] && $options['prototype']) {
            $prototype = $builder->create($options['prototype_name'], $options['type'], array_replace(array(
                'label' => $options['prototype_name'].'label__',
            ), $options['options']));
            $builder->setAttribute('prototype', $prototype->getForm());
        }

        $resizeListener = new ResizeFormListener(
            $options['type'],
            $options['options'],
            $options['allow_add'],
            $options['allow_delete']
        );

        $builder->addEventSubscriber($resizeListener);
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars = array_replace($view->vars, array(
            'allow_add'    => $options['allow_add'],
            'allow_delete' => $options['allow_delete'],
        ));

        if ($form->getConfig()->hasAttribute('prototype')) {
            $view->vars['prototype'] = $form->getConfig()->getAttribute('prototype')->createView($view);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        if ($form->getConfig()->hasAttribute('prototype') && $view->vars['prototype']->vars['multipart']) {
            $view->vars['multipart'] = true;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $optionsNormalizer = function (Options $options, $value) {
            $value['block_name'] = 'entry';

            return $value;
        };

        $resolver->setDefaults(array(
            'allow_add'      => false,
            'allow_delete'   => false,
            'prototype'      => true,
            'prototype_name' => '__name__',
            'type'           => 'text',
            'options'        => array(),
        ));

        $resolver->setNormalizers(array(
            'options' => $optionsNormalizer,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'collection';
    }
}
PK3`�\�q���;pear/Symfony/Component/Form/Extension/Core/Type/UrlType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\EventListener\FixUrlProtocolListener;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class UrlType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventSubscriber(new FixUrlProtocolListener($options['default_protocol']));
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'default_protocol' => 'http',
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'text';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'url';
    }
}
PK3`�\T;���<pear/Symfony/Component/Form/Extension/Core/Type/TextType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TextType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'compound' => false,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'text';
    }
}
PK4`�\a�L�?pear/Symfony/Component/Form/Extension/Core/Type/CountryType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Intl\Intl;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CountryType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'choices' => Intl::getRegionBundle()->getCountryNames(),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'choice';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'country';
    }
}
PK4`�\&ߏ�vv@pear/Symfony/Component/Form/Extension/Core/Type/BirthdayType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class BirthdayType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'years' => range(date('Y') - 120, date('Y')),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'date';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'birthday';
    }
}
PK4`�\��h��>pear/Symfony/Component/Form/Extension/Core/Type/ButtonType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\ButtonTypeInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * A form button.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ButtonType extends BaseType implements ButtonTypeInterface
{
    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'button';
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        parent::setDefaultOptions($resolver);

        $resolver->setDefaults(array(
            'auto_initialize' => false,
        ));
    }
}
PK4`�\���D��>pear/Symfony/Component/Form/Extension/Core/Type/LocaleType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Intl\Intl;
use Symfony\Component\Locale\Locale;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class LocaleType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'choices' => Intl::getLocaleBundle()->getLocaleNames(),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'choice';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'locale';
    }
}
PK5`�\C�i���>pear/Symfony/Component/Form/Extension/Core/Type/NumberType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\DataTransformer\NumberToLocalizedStringTransformer;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class NumberType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addViewTransformer(new NumberToLocalizedStringTransformer(
            $options['precision'],
            $options['grouping'],
            $options['rounding_mode']
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            // default precision is locale specific (usually around 3)
            'precision'     => null,
            'grouping'      => false,
            'rounding_mode' => NumberToLocalizedStringTransformer::ROUND_HALF_UP,
            'compound'      => false,
        ));

        $resolver->setAllowedValues(array(
            'rounding_mode' => array(
                NumberToLocalizedStringTransformer::ROUND_FLOOR,
                NumberToLocalizedStringTransformer::ROUND_DOWN,
                NumberToLocalizedStringTransformer::ROUND_HALF_DOWN,
                NumberToLocalizedStringTransformer::ROUND_HALF_EVEN,
                NumberToLocalizedStringTransformer::ROUND_HALF_UP,
                NumberToLocalizedStringTransformer::ROUND_UP,
                NumberToLocalizedStringTransformer::ROUND_CEILING,
            ),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'number';
    }
}
PK5`�\�G�oo<pear/Symfony/Component/Form/Extension/Core/Type/FileType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class FileType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars = array_replace($view->vars, array(
            'type'  => 'file',
            'value' => '',
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        $view
            ->vars['multipart'] = true
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'compound' => false,
            'data_class' => 'Symfony\Component\HttpFoundation\File\File',
            'empty_data' => null,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'file';
    }
}
PK5`�\a����=pear/Symfony/Component/Form/Extension/Core/Type/ResetType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\ButtonTypeInterface;

/**
 * A reset button.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ResetType extends AbstractType implements ButtonTypeInterface
{
    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'button';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'reset';
    }
}
PK5`�\H?!a��<pear/Symfony/Component/Form/Extension/Core/Type/TimeType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\ReversedTransformer;
use Symfony\Component\Form\Exception\InvalidConfigurationException;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToArrayTransformer;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TimeType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $parts  = array('hour');
        $format = 'H';

        if ($options['with_seconds'] && !$options['with_minutes']) {
            throw new InvalidConfigurationException('You can not disable minutes if you have enabled seconds.');
        }

        if ($options['with_minutes']) {
            $format .= ':i';
            $parts[] = 'minute';
        }

        if ($options['with_seconds']) {
            $format .= ':s';
            $parts[] = 'second';
        }

        if ('single_text' === $options['widget']) {
            $builder->addViewTransformer(new DateTimeToStringTransformer($options['model_timezone'], $options['view_timezone'], $format));
        } else {
            $hourOptions = $minuteOptions = $secondOptions = array(
                'error_bubbling' => true,
            );

            if ('choice' === $options['widget']) {
                $hours = $minutes = array();

                foreach ($options['hours'] as $hour) {
                    $hours[$hour] = str_pad($hour, 2, '0', STR_PAD_LEFT);
                }

                // Only pass a subset of the options to children
                $hourOptions['choices'] = $hours;
                $hourOptions['empty_value'] = $options['empty_value']['hour'];

                if ($options['with_minutes']) {
                    foreach ($options['minutes'] as $minute) {
                        $minutes[$minute] = str_pad($minute, 2, '0', STR_PAD_LEFT);
                    }

                    $minuteOptions['choices'] = $minutes;
                    $minuteOptions['empty_value'] = $options['empty_value']['minute'];
                }

                if ($options['with_seconds']) {
                    $seconds = array();

                    foreach ($options['seconds'] as $second) {
                        $seconds[$second] = str_pad($second, 2, '0', STR_PAD_LEFT);
                    }

                    $secondOptions['choices'] = $seconds;
                    $secondOptions['empty_value'] = $options['empty_value']['second'];
                }

                // Append generic carry-along options
                foreach (array('required', 'translation_domain') as $passOpt) {
                    $hourOptions[$passOpt] = $options[$passOpt];

                    if ($options['with_minutes']) {
                        $minuteOptions[$passOpt] = $options[$passOpt];
                    }

                    if ($options['with_seconds']) {
                        $secondOptions[$passOpt] = $options[$passOpt];
                    }
                }
            }

            $builder->add('hour', $options['widget'], $hourOptions);

            if ($options['with_minutes']) {
                $builder->add('minute', $options['widget'], $minuteOptions);
            }

            if ($options['with_seconds']) {
                $builder->add('second', $options['widget'], $secondOptions);
            }

            $builder->addViewTransformer(new DateTimeToArrayTransformer($options['model_timezone'], $options['view_timezone'], $parts, 'text' === $options['widget']));
        }

        if ('string' === $options['input']) {
            $builder->addModelTransformer(new ReversedTransformer(
                new DateTimeToStringTransformer($options['model_timezone'], $options['model_timezone'], 'H:i:s')
            ));
        } elseif ('timestamp' === $options['input']) {
            $builder->addModelTransformer(new ReversedTransformer(
                new DateTimeToTimestampTransformer($options['model_timezone'], $options['model_timezone'])
            ));
        } elseif ('array' === $options['input']) {
            $builder->addModelTransformer(new ReversedTransformer(
                new DateTimeToArrayTransformer($options['model_timezone'], $options['model_timezone'], $parts)
            ));
        }
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars = array_replace($view->vars, array(
            'widget'       => $options['widget'],
            'with_minutes' => $options['with_minutes'],
            'with_seconds' => $options['with_seconds'],
        ));

        if ('single_text' === $options['widget']) {
            $view->vars['type'] = 'time';
        }
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $compound = function (Options $options) {
            return $options['widget'] !== 'single_text';
        };

        $emptyValue = $emptyValueDefault = function (Options $options) {
            return $options['required'] ? null : '';
        };

        $emptyValueNormalizer = function (Options $options, $emptyValue) use ($emptyValueDefault) {
            if (is_array($emptyValue)) {
                $default = $emptyValueDefault($options);

                return array_merge(
                    array('hour' => $default, 'minute' => $default, 'second' => $default),
                    $emptyValue
                );
            }

            return array(
                'hour' => $emptyValue,
                'minute' => $emptyValue,
                'second' => $emptyValue
            );
        };

        $resolver->setDefaults(array(
            'hours'          => range(0, 23),
            'minutes'        => range(0, 59),
            'seconds'        => range(0, 59),
            'widget'         => 'choice',
            'input'          => 'datetime',
            'with_minutes'   => true,
            'with_seconds'   => false,
            'model_timezone' => null,
            'view_timezone'  => null,
            'empty_value'    => $emptyValue,
            // Don't modify \DateTime classes by reference, we treat
            // them like immutable value objects
            'by_reference'   => false,
            'error_bubbling' => false,
            // If initialized with a \DateTime object, FormType initializes
            // this option to "\DateTime". Since the internal, normalized
            // representation is not \DateTime, but an array, we need to unset
            // this option.
            'data_class'     => null,
            'compound'       => $compound,
        ));

        $resolver->setNormalizers(array(
            'empty_value' => $emptyValueNormalizer,
        ));

        $resolver->setAllowedValues(array(
            'input' => array(
                'datetime',
                'string',
                'timestamp',
                'array',
            ),
            'widget' => array(
                'single_text',
                'text',
                'choice',
            ),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'time';
    }
}
PK5`�\�
�##Jpear/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Form\Extension\Core\ChoiceList;

use Symfony\Component\Form\Exception\StringCastException;
use Symfony\Component\Form\Exception\InvalidArgumentException;
use Symfony\Component\PropertyAccess\PropertyPath;
use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;

/**
 * A choice list for object choices.
 *
 * Supports generation of choice labels, choice groups and choice values
 * by calling getters of the object (or associated objects).
 *
 * <code>
 * $choices = array($user1, $user2);
 *
 * // call getName() to determine the choice labels
 * $choiceList = new ObjectChoiceList($choices, 'name');
 * </code>
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ObjectChoiceList extends ChoiceList
{
    /**
     * @var PropertyAccessorInterface
     */
    private $propertyAccessor;

    /**
     * The property path used to obtain the choice label.
     *
     * @var PropertyPath
     */
    private $labelPath;

    /**
     * The property path used for object grouping.
     *
     * @var PropertyPath
     */
    private $groupPath;

    /**
     * The property path used to obtain the choice value.
     *
     * @var PropertyPath
     */
    private $valuePath;

    /**
     * Creates a new object choice list.
     *
     * @param array|\Traversable       $choices           The array of choices. Choices may also be given
     *                                                    as hierarchy of unlimited depth by creating nested
     *                                                    arrays. The title of the sub-hierarchy can be
     *                                                    stored in the array key pointing to the nested
     *                                                    array. The topmost level of the hierarchy may also
     *                                                    be a \Traversable.
     * @param string                   $labelPath         A property path pointing to the property used
     *                                                    for the choice labels. The value is obtained
             *                                            by calling the getter on the object. If the
     *                                                    path is NULL, the object's __toString() method
     *                                                    is used instead.
     * @param array                    $preferredChoices  A flat array of choices that should be
     *                                                    presented to the user with priority.
     * @param string                   $groupPath         A property path pointing to the property used
     *                                                    to group the choices. Only allowed if
     *                                                    the choices are given as flat array.
     * @param string                   $valuePath         A property path pointing to the property used
     *                                                    for the choice values. If not given, integers
     *                                                    are generated instead.
     * @param PropertyAccessorInterface $propertyAccessor The reflection graph for reading property paths.
     */
    public function __construct($choices, $labelPath = null, array $preferredChoices = array(), $groupPath = null, $valuePath = null, PropertyAccessorInterface $propertyAccessor = null)
    {
        $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor();
        $this->labelPath = null !== $labelPath ? new PropertyPath($labelPath) : null;
        $this->groupPath = null !== $groupPath ? new PropertyPath($groupPath) : null;
        $this->valuePath = null !== $valuePath ? new PropertyPath($valuePath) : null;

        parent::__construct($choices, array(), $preferredChoices);
    }

    /**
     * Initializes the list with choices.
     *
     * Safe to be called multiple times. The list is cleared on every call.
     *
     * @param array|\Traversable $choices          The choices to write into the list.
     * @param array              $labels           Ignored.
     * @param array              $preferredChoices The choices to display with priority.
     *
     * @throws InvalidArgumentException When passing a hierarchy of choices and using
     *                                   the "groupPath" option at the same time.
     */
    protected function initialize($choices, array $labels, array $preferredChoices)
    {
        if (null !== $this->groupPath) {
            $groupedChoices = array();

            foreach ($choices as $i => $choice) {
                if (is_array($choice)) {
                    throw new InvalidArgumentException('You should pass a plain object array (without groups) when using the "groupPath" option.');
                }

                try {
                    $group = $this->propertyAccessor->getValue($choice, $this->groupPath);
                } catch (NoSuchPropertyException $e) {
                    // Don't group items whose group property does not exist
                    // see https://github.com/symfony/symfony/commit/d9b7abb7c7a0f28e0ce970afc5e305dce5dccddf
                    $group = null;
                }

                if (null === $group) {
                    $groupedChoices[$i] = $choice;
                } else {
                    $groupName = (string) $group;

                    if (!isset($groupedChoices[$groupName])) {
                        $groupedChoices[$groupName] = array();
                    }

                    $groupedChoices[$groupName][$i] = $choice;
                }
            }

            $choices = $groupedChoices;
        }

        $labels = array();

        $this->extractLabels($choices, $labels);

        parent::initialize($choices, $labels, $preferredChoices);
    }

    /**
     * Creates a new unique value for this choice.
     *
     * If a property path for the value was given at object creation,
     * the getter behind that path is now called to obtain a new value.
     * Otherwise a new integer is generated.
     *
     * @param mixed $choice The choice to create a value for
     *
     * @return integer|string A unique value without character limitations.
     */
    protected function createValue($choice)
    {
        if ($this->valuePath) {
            return (string) $this->propertyAccessor->getValue($choice, $this->valuePath);
        }

        return parent::createValue($choice);
    }

    private function extractLabels($choices, array &$labels)
    {
        foreach ($choices as $i => $choice) {
            if (is_array($choice)) {
                $labels[$i] = array();
                $this->extractLabels($choice, $labels[$i]);
            } elseif ($this->labelPath) {
                $labels[$i] = $this->propertyAccessor->getValue($choice, $this->labelPath);
            } elseif (method_exists($choice, '__toString')) {
                $labels[$i] = (string) $choice;
            } else {
                throw new StringCastException(sprintf('A "__toString()" method was not found on the objects of type "%s" passed to the choice field. To read a custom getter instead, set the argument $labelPath to the desired property path.', get_class($choice)));
            }
        }
    }
}
PK5`�\l_R(Mpear/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceListInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\ChoiceList;

/**
 * Contains choices that can be selected in a form field.
 *
 * Each choice has three different properties:
 *
 *    - Choice: The choice that should be returned to the application by the
 *              choice field. Can be any scalar value or an object, but no
 *              array.
 *    - Label:  A text representing the choice that is displayed to the user.
 *    - Value:  A uniquely identifying value that can contain arbitrary
 *              characters, but no arrays or objects. This value is displayed
 *              in the HTML "value" attribute.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ChoiceListInterface
{
    /**
     * Returns the list of choices
     *
     * @return array The choices with their indices as keys
     */
    public function getChoices();

    /**
     * Returns the values for the choices
     *
     * @return array The values with the corresponding choice indices as keys
     */
    public function getValues();

    /**
     * Returns the choice views of the preferred choices as nested array with
     * the choice groups as top-level keys.
     *
     * Example:
     *
     * <source>
     * array(
     *     'Group 1' => array(
     *         10 => ChoiceView object,
     *         20 => ChoiceView object,
     *     ),
     *     'Group 2' => array(
     *         30 => ChoiceView object,
     *     ),
     * )
     * </source>
     *
     * @return array A nested array containing the views with the corresponding
     *               choice indices as keys on the lowest levels and the choice
     *               group names in the keys of the higher levels
     */
    public function getPreferredViews();

    /**
     * Returns the choice views of the choices that are not preferred as nested
     * array with the choice groups as top-level keys.
     *
     * Example:
     *
     * <source>
     * array(
     *     'Group 1' => array(
     *         10 => ChoiceView object,
     *         20 => ChoiceView object,
     *     ),
     *     'Group 2' => array(
     *         30 => ChoiceView object,
     *     ),
     * )
     * </source>
     *
     * @return array A nested array containing the views with the corresponding
     *               choice indices as keys on the lowest levels and the choice
     *               group names in the keys of the higher levels
     *
     * @see getPreferredValues
     */
    public function getRemainingViews();

    /**
     * Returns the choices corresponding to the given values.
     *
     * The choices can have any data type.
     *
     * The choices must be returned with the same keys and in the same order
     * as the corresponding values in the given array.
     *
     * @param array $values An array of choice values. Not existing values in
     *                      this array are ignored
     *
     * @return array An array of choices with ascending, 0-based numeric keys
     */
    public function getChoicesForValues(array $values);

    /**
     * Returns the values corresponding to the given choices.
     *
     * The values must be strings.
     *
     * The values must be returned with the same keys and in the same order
     * as the corresponding choices in the given array.
     *
     * @param array $choices An array of choices. Not existing choices in this
     *                       array are ignored
     *
     * @return array An array of choice values with ascending, 0-based numeric
     *               keys
     */
    public function getValuesForChoices(array $choices);

    /**
     * Returns the indices corresponding to the given choices.
     *
     * The indices must be positive integers or strings accepted by
     * {@link FormConfigBuilder::validateName()}.
     *
     * The index "placeholder" is internally reserved.
     *
     * The indices must be returned with the same keys and in the same order
     * as the corresponding choices in the given array.
     *
     * @param array $choices An array of choices. Not existing choices in this
     *                       array are ignored
     *
     * @return array An array of indices with ascending, 0-based numeric keys
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function getIndicesForChoices(array $choices);

    /**
     * Returns the indices corresponding to the given values.
     *
     * The indices must be positive integers or strings accepted by
     * {@link FormConfigBuilder::validateName()}.
     *
     * The index "placeholder" is internally reserved.
     *
     * The indices must be returned with the same keys and in the same order
     * as the corresponding values in the given array.
     *
     * @param array $values An array of choice values. Not existing values in
     *                      this array are ignored
     *
     * @return array An array of indices with ascending, 0-based numeric keys
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function getIndicesForValues(array $values);
}
PK5`�\�В4
4
Hpear/Symfony/Component/Form/Extension/Core/ChoiceList/LazyChoiceList.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\ChoiceList;

use Symfony\Component\Form\Exception\InvalidArgumentException;

/**
 * A choice list that is loaded lazily
 *
 * This list loads itself as soon as any of the getters is accessed for the
 * first time. You should implement loadChoiceList() in your child classes,
 * which should return a ChoiceListInterface instance.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class LazyChoiceList implements ChoiceListInterface
{
    /**
     * The loaded choice list
     *
     * @var ChoiceListInterface
     */
    private $choiceList;

    /**
     * {@inheritdoc}
     */
    public function getChoices()
    {
        if (!$this->choiceList) {
            $this->load();
        }

        return $this->choiceList->getChoices();
    }

    /**
     * {@inheritdoc}
     */
    public function getValues()
    {
        if (!$this->choiceList) {
            $this->load();
        }

        return $this->choiceList->getValues();
    }

    /**
     * {@inheritdoc}
     */
    public function getPreferredViews()
    {
        if (!$this->choiceList) {
            $this->load();
        }

        return $this->choiceList->getPreferredViews();
    }

    /**
     * {@inheritdoc}
     */
    public function getRemainingViews()
    {
        if (!$this->choiceList) {
            $this->load();
        }

        return $this->choiceList->getRemainingViews();
    }

    /**
     * {@inheritdoc}
     */
    public function getChoicesForValues(array $values)
    {
        if (!$this->choiceList) {
            $this->load();
        }

        return $this->choiceList->getChoicesForValues($values);
    }

    /**
     * {@inheritdoc}
     */
    public function getValuesForChoices(array $choices)
    {
        if (!$this->choiceList) {
            $this->load();
        }

        return $this->choiceList->getValuesForChoices($choices);
    }

    /**
     * {@inheritdoc}
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function getIndicesForChoices(array $choices)
    {
        if (!$this->choiceList) {
            $this->load();
        }

        return $this->choiceList->getIndicesForChoices($choices);
    }

    /**
     * {@inheritdoc}
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function getIndicesForValues(array $values)
    {
        if (!$this->choiceList) {
            $this->load();
        }

        return $this->choiceList->getIndicesForValues($values);
    }

    /**
     * Loads the choice list
     *
     * Should be implemented by child classes.
     *
     * @return ChoiceListInterface The loaded choice list
     */
    abstract protected function loadChoiceList();

    private function load()
    {
        $choiceList = $this->loadChoiceList();

        if (!$choiceList instanceof ChoiceListInterface) {
            throw new InvalidArgumentException(sprintf('loadChoiceList() should return a ChoiceListInterface instance. Got %s', gettype($choiceList)));
        }

        $this->choiceList = $choiceList;
    }
}
PK6`�\'���?Dpear/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\ChoiceList;

use Symfony\Component\Form\FormConfigBuilder;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Exception\InvalidConfigurationException;
use Symfony\Component\Form\Exception\InvalidArgumentException;
use Symfony\Component\Form\Extension\Core\View\ChoiceView;

/**
 * A choice list for choices of arbitrary data types.
 *
 * Choices and labels are passed in two arrays. The indices of the choices
 * and the labels should match. Choices may also be given as hierarchy of
 * unlimited depth by creating nested arrays. The title of the sub-hierarchy
 * can be stored in the array key pointing to the nested array. The topmost
 * level of the hierarchy may also be a \Traversable.
 *
 * <code>
 * $choices = array(true, false);
 * $labels = array('Agree', 'Disagree');
 * $choiceList = new ChoiceList($choices, $labels);
 * </code>
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ChoiceList implements ChoiceListInterface
{
    /**
     * The choices with their indices as keys.
     *
     * @var array
     */
    private $choices = array();

    /**
     * The choice values with the indices of the matching choices as keys.
     *
     * @var array
     */
    private $values = array();

    /**
     * The preferred view objects as hierarchy containing also the choice groups
     * with the indices of the matching choices as bottom-level keys.
     *
     * @var array
     */
    private $preferredViews = array();

    /**
     * The non-preferred view objects as hierarchy containing also the choice
     * groups with the indices of the matching choices as bottom-level keys.
     *
     * @var array
     */
    private $remainingViews = array();

    /**
     * Creates a new choice list.
     *
     * @param array|\Traversable $choices The array of choices. Choices may also be given
     *                                    as hierarchy of unlimited depth. Hierarchies are
     *                                    created by creating nested arrays. The title of
     *                                    the sub-hierarchy can be stored in the array
     *                                    key pointing to the nested array. The topmost
     *                                    level of the hierarchy may also be a \Traversable.
     * @param array $labels The array of labels. The structure of this array
     *                      should match the structure of $choices.
     * @param array $preferredChoices A flat array of choices that should be
     *                                presented to the user with priority.
     *
     * @throws UnexpectedTypeException If the choices are not an array or \Traversable.
     */
    public function __construct($choices, array $labels, array $preferredChoices = array())
    {
        if (!is_array($choices) && !$choices instanceof \Traversable) {
            throw new UnexpectedTypeException($choices, 'array or \Traversable');
        }

        $this->initialize($choices, $labels, $preferredChoices);
    }

    /**
     * Initializes the list with choices.
     *
     * Safe to be called multiple times. The list is cleared on every call.
     *
     * @param array|\Traversable $choices          The choices to write into the list.
     * @param array              $labels           The labels belonging to the choices.
     * @param array              $preferredChoices The choices to display with priority.
     */
    protected function initialize($choices, array $labels, array $preferredChoices)
    {
        $this->choices = array();
        $this->values = array();
        $this->preferredViews = array();
        $this->remainingViews = array();

        $this->addChoices(
            $this->preferredViews,
            $this->remainingViews,
            $choices,
            $labels,
            $preferredChoices
        );
    }

    /**
     * {@inheritdoc}
     */
    public function getChoices()
    {
        return $this->choices;
    }

    /**
     * {@inheritdoc}
     */
    public function getValues()
    {
        return $this->values;
    }

    /**
     * {@inheritdoc}
     */
    public function getPreferredViews()
    {
        return $this->preferredViews;
    }

    /**
     * {@inheritdoc}
     */
    public function getRemainingViews()
    {
        return $this->remainingViews;
    }

    /**
     * {@inheritdoc}
     */
    public function getChoicesForValues(array $values)
    {
        $values = $this->fixValues($values);
        $choices = array();

        foreach ($values as $i => $givenValue) {
            foreach ($this->values as $j => $value) {
                if ($value === $givenValue) {
                    $choices[$i] = $this->choices[$j];
                    unset($values[$i]);

                    if (0 === count($values)) {
                        break 2;
                    }
                }
            }
        }

        return $choices;
    }

    /**
     * {@inheritdoc}
     */
    public function getValuesForChoices(array $choices)
    {
        $choices = $this->fixChoices($choices);
        $values = array();

        foreach ($choices as $i => $givenChoice) {
            foreach ($this->choices as $j => $choice) {
                if ($choice === $givenChoice) {
                    $values[$i] = $this->values[$j];
                    unset($choices[$i]);

                    if (0 === count($choices)) {
                        break 2;
                    }
                }
            }
        }

        return $values;
    }

    /**
     * {@inheritdoc}
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function getIndicesForChoices(array $choices)
    {
        $choices = $this->fixChoices($choices);
        $indices = array();

        foreach ($choices as $i => $givenChoice) {
            foreach ($this->choices as $j => $choice) {
                if ($choice === $givenChoice) {
                    $indices[$i] = $j;
                    unset($choices[$i]);

                    if (0 === count($choices)) {
                        break 2;
                    }
                }
            }
        }

        return $indices;
    }

    /**
     * {@inheritdoc}
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function getIndicesForValues(array $values)
    {
        $values = $this->fixValues($values);
        $indices = array();

        foreach ($values as $i => $givenValue) {
            foreach ($this->values as $j => $value) {
                if ($value === $givenValue) {
                    $indices[$i] = $j;
                    unset($values[$i]);

                    if (0 === count($values)) {
                        break 2;
                    }
                }
            }
        }

        return $indices;
    }

    /**
     * Recursively adds the given choices to the list.
     *
     * @param array              $bucketForPreferred The bucket where to store the preferred
     *                                               view objects.
     * @param array              $bucketForRemaining The bucket where to store the
     *                                               non-preferred view objects.
     * @param array|\Traversable $choices            The list of choices.
     * @param array              $labels             The labels corresponding to the choices.
     * @param array              $preferredChoices   The preferred choices.
     *
     * @throws InvalidArgumentException     If the structures of the choices and labels array do not match.
     * @throws InvalidConfigurationException If no valid value or index could be created for a choice.
     */
    protected function addChoices(array &$bucketForPreferred, array &$bucketForRemaining, $choices, array $labels, array $preferredChoices)
    {
        // Add choices to the nested buckets
        foreach ($choices as $group => $choice) {
            if (!array_key_exists($group, $labels)) {
                throw new InvalidArgumentException('The structures of the choices and labels array do not match.');
            }

            if (is_array($choice)) {
                // Don't do the work if the array is empty
                if (count($choice) > 0) {
                    $this->addChoiceGroup(
                        $group,
                        $bucketForPreferred,
                        $bucketForRemaining,
                        $choice,
                        $labels[$group],
                        $preferredChoices
                    );
                }
            } else {
                $this->addChoice(
                    $bucketForPreferred,
                    $bucketForRemaining,
                    $choice,
                    $labels[$group],
                    $preferredChoices
                );
            }
        }
    }

    /**
     * Recursively adds a choice group.
     *
     * @param string $group              The name of the group.
     * @param array  $bucketForPreferred The bucket where to store the preferred
     *                                   view objects.
     * @param array  $bucketForRemaining The bucket where to store the
     *                                   non-preferred view objects.
     * @param array  $choices            The list of choices in the group.
     * @param array  $labels             The labels corresponding to the choices in the group.
     * @param array  $preferredChoices   The preferred choices.
     *
     * @throws InvalidConfigurationException If no valid value or index could be created for a choice.
     */
    protected function addChoiceGroup($group, array &$bucketForPreferred, array &$bucketForRemaining, array $choices, array $labels, array $preferredChoices)
    {
        // If this is a choice group, create a new level in the choice
        // key hierarchy
        $bucketForPreferred[$group] = array();
        $bucketForRemaining[$group] = array();

        $this->addChoices(
            $bucketForPreferred[$group],
            $bucketForRemaining[$group],
            $choices,
            $labels,
            $preferredChoices
        );

        // Remove child levels if empty
        if (empty($bucketForPreferred[$group])) {
            unset($bucketForPreferred[$group]);
        }
        if (empty($bucketForRemaining[$group])) {
            unset($bucketForRemaining[$group]);
        }
    }

    /**
     * Adds a new choice.
     *
     * @param array  $bucketForPreferred The bucket where to store the preferred
     *                                   view objects.
     * @param array  $bucketForRemaining The bucket where to store the
     *                                   non-preferred view objects.
     * @param mixed  $choice             The choice to add.
     * @param string $label              The label for the choice.
     * @param array  $preferredChoices   The preferred choices.
     *
     * @throws InvalidConfigurationException If no valid value or index could be created.
     */
    protected function addChoice(array &$bucketForPreferred, array &$bucketForRemaining, $choice, $label, array $preferredChoices)
    {
        $index = $this->createIndex($choice);

        if ('' === $index || null === $index || !FormConfigBuilder::isValidName((string) $index)) {
            throw new InvalidConfigurationException(sprintf('The index "%s" created by the choice list is invalid. It should be a valid, non-empty Form name.', $index));
        }

        $value = $this->createValue($choice);

        if (!is_string($value)) {
            throw new InvalidConfigurationException(sprintf('The value created by the choice list is of type "%s", but should be a string.', gettype($value)));
        }

        $view = new ChoiceView($choice, $value, $label);

        $this->choices[$index] = $this->fixChoice($choice);
        $this->values[$index] = $value;

        if ($this->isPreferred($choice, $preferredChoices)) {
            $bucketForPreferred[$index] = $view;
        } else {
            $bucketForRemaining[$index] = $view;
        }
    }

    /**
     * Returns whether the given choice should be preferred judging by the
     * given array of preferred choices.
     *
     * Extension point to optimize performance by changing the structure of the
     * $preferredChoices array.
     *
     * @param mixed $choice           The choice to test.
     * @param array $preferredChoices An array of preferred choices.
     *
     * @return Boolean Whether the choice is preferred.
     */
    protected function isPreferred($choice, array $preferredChoices)
    {
        return false !== array_search($choice, $preferredChoices, true);
    }

    /**
     * Creates a new unique index for this choice.
     *
     * Extension point to change the indexing strategy.
     *
     * @param mixed $choice The choice to create an index for
     *
     * @return integer|string A unique index containing only ASCII letters,
     *                        digits and underscores.
     */
    protected function createIndex($choice)
    {
        return count($this->choices);
    }

    /**
     * Creates a new unique value for this choice.
     *
     * By default, an integer is generated since it cannot be guaranteed that
     * all values in the list are convertible to (unique) strings. Subclasses
     * can override this behaviour if they can guarantee this property.
     *
     * @param mixed $choice The choice to create a value for
     *
     * @return string A unique string.
     */
    protected function createValue($choice)
    {
        return (string) count($this->values);
    }

    /**
     * Fixes the data type of the given choice value to avoid comparison
     * problems.
     *
     * @param mixed $value The choice value.
     *
     * @return string The value as string.
     */
    protected function fixValue($value)
    {
        return (string) $value;
    }

    /**
     * Fixes the data types of the given choice values to avoid comparison
     * problems.
     *
     * @param array $values The choice values.
     *
     * @return array The values as strings.
     */
    protected function fixValues(array $values)
    {
        foreach ($values as $i => $value) {
            $values[$i] = $this->fixValue($value);
        }

        return $values;
    }

    /**
     * Fixes the data type of the given choice index to avoid comparison
     * problems.
     *
     * @param mixed $index The choice index.
     *
     * @return integer|string The index as PHP array key.
     */
    protected function fixIndex($index)
    {
        if (is_bool($index) || (string) (int) $index === (string) $index) {
            return (int) $index;
        }

        return (string) $index;
    }

    /**
     * Fixes the data types of the given choice indices to avoid comparison
     * problems.
     *
     * @param array $indices The choice indices.
     *
     * @return array The indices as strings.
     */
    protected function fixIndices(array $indices)
    {
        foreach ($indices as $i => $index) {
            $indices[$i] = $this->fixIndex($index);
        }

        return $indices;
    }

    /**
     * Fixes the data type of the given choice to avoid comparison problems.
     *
     * Extension point. In this implementation, choices are guaranteed to
     * always maintain their type and thus can be typesafely compared.
     *
     * @param mixed $choice The choice
     *
     * @return mixed The fixed choice
     */
    protected function fixChoice($choice)
    {
        return $choice;
    }

    /**
     * Fixes the data type of the given choices to avoid comparison problems.
     *
     * @param array $choices The choices.
     *
     * @return array The fixed choices.
     *
     * @see fixChoice
     */
    protected function fixChoices(array $choices)
    {
        return $choices;
    }
}
PK6`�\�jю��Jpear/Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\ChoiceList;

/**
 * A choice list for choices of type string or integer.
 *
 * Choices and their associated labels can be passed in a single array. Since
 * choices are passed as array keys, only strings or integer choices are
 * allowed. Choices may also be given as hierarchy of unlimited depth by
 * creating nested arrays. The title of the sub-hierarchy can be stored in the
 * array key pointing to the nested array.
 *
 * <code>
 * $choiceList = new SimpleChoiceList(array(
 *     'creditcard' => 'Credit card payment',
 *     'cash' => 'Cash payment',
 * ));
 * </code>
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class SimpleChoiceList extends ChoiceList
{
    /**
     * Creates a new simple choice list.
     *
     * @param array $choices The array of choices with the choices as keys and
     *                       the labels as values. Choices may also be given
     *                       as hierarchy of unlimited depth by creating nested
     *                       arrays. The title of the sub-hierarchy is stored
     *                       in the array key pointing to the nested array.
     * @param array $preferredChoices A flat array of choices that should be
     *                                presented to the user with priority.
     */
    public function __construct(array $choices, array $preferredChoices = array())
    {
        // Flip preferred choices to speed up lookup
        parent::__construct($choices, $choices, array_flip($preferredChoices));
    }

    /**
     * {@inheritdoc}
     */
    public function getChoicesForValues(array $values)
    {
        $values = $this->fixValues($values);

        // The values are identical to the choices, so we can just return them
        // to improve performance a little bit
        return $this->fixChoices(array_intersect($values, $this->getValues()));
    }

    /**
     * {@inheritdoc}
     */
    public function getValuesForChoices(array $choices)
    {
        $choices = $this->fixChoices($choices);

        // The choices are identical to the values, so we can just return them
        // to improve performance a little bit
        return $this->fixValues(array_intersect($choices, $this->getValues()));
    }

    /**
     * Recursively adds the given choices to the list.
     *
     * Takes care of splitting the single $choices array passed in the
     * constructor into choices and labels.
     *
     * @param array              $bucketForPreferred The bucket where to store the preferred
     *                                               view objects.
     * @param array              $bucketForRemaining The bucket where to store the
     *                                               non-preferred view objects.
     * @param array|\Traversable $choices            The list of choices.
     * @param array              $labels             Ignored.
     * @param array              $preferredChoices   The preferred choices.
     */
    protected function addChoices(array &$bucketForPreferred, array &$bucketForRemaining, $choices, array $labels, array $preferredChoices)
    {
        // Add choices to the nested buckets
        foreach ($choices as $choice => $label) {
            if (is_array($label)) {
                // Don't do the work if the array is empty
                if (count($label) > 0) {
                    $this->addChoiceGroup(
                        $choice,
                        $bucketForPreferred,
                        $bucketForRemaining,
                        $label,
                        $label,
                        $preferredChoices
                    );
                }
            } else {
                $this->addChoice(
                    $bucketForPreferred,
                    $bucketForRemaining,
                    $choice,
                    $label,
                    $preferredChoices
                );
            }
        }
    }

    /**
     * Returns whether the given choice should be preferred judging by the
     * given array of preferred choices.
     *
     * Optimized for performance by treating the preferred choices as array
     * where choices are stored in the keys.
     *
     * @param mixed $choice           The choice to test.
     * @param array $preferredChoices An array of preferred choices.
     *
     * @return Boolean Whether the choice is preferred.
     */
    protected function isPreferred($choice, array $preferredChoices)
    {
        // Optimize performance over the default implementation
        return isset($preferredChoices[$choice]);
    }

    /**
     * Converts the choice to a valid PHP array key.
     *
     * @param mixed $choice The choice
     *
     * @return string|integer A valid PHP array key
     */
    protected function fixChoice($choice)
    {
        return $this->fixIndex($choice);
    }

    /**
     * {@inheritdoc}
     */
    protected function fixChoices(array $choices)
    {
        return $this->fixIndices($choices);
    }

    /**
     * {@inheritdoc}
     */
    protected function createValue($choice)
    {
        // Choices are guaranteed to be unique and scalar, so we can simply
        // convert them to strings
        return (string) $choice;
    }
}
PK6`�\>Q?��Spear/Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\EventListener;

use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Adds a protocol to a URL if it doesn't already have one.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FixUrlProtocolListener implements EventSubscriberInterface
{
    private $defaultProtocol;

    public function __construct($defaultProtocol = 'http')
    {
        $this->defaultProtocol = $defaultProtocol;
    }

    public function onSubmit(FormEvent $event)
    {
        $data = $event->getData();

        if ($this->defaultProtocol && $data && !preg_match('~^\w+://~', $data)) {
            $event->setData($this->defaultProtocol.'://'.$data);
        }
    }

    /**
     * Alias of {@link onSubmit()}.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link onSubmit()} instead.
     */
    public function onBind(FormEvent $event)
    {
        $this->onSubmit($event);
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::SUBMIT => 'onSubmit');
    }
}
PK6`�\b����Upear/Symfony/Component/Form/Extension/Core/EventListener/FixCheckboxInputListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\EventListener;

use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface;

/**
 * Takes care of converting the input from a list of checkboxes to a correctly
 * indexed array.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FixCheckboxInputListener implements EventSubscriberInterface
{
    private $choiceList;

    /**
     * Constructor.
     *
     * @param ChoiceListInterface $choiceList
     */
    public function __construct(ChoiceListInterface $choiceList)
    {
        $this->choiceList = $choiceList;
    }

    public function preSubmit(FormEvent $event)
    {
        $data = $event->getData();

        if (is_array($data)) {
            // Flip the submitted values for faster lookup
            // It's better to flip this array than $existingValues because
            // $submittedValues is generally smaller.
            $submittedValues = array_flip($data);

            // Since expanded choice fields are completely loaded anyway, we
            // can just as well get the values again without losing performance.
            $existingValues = $this->choiceList->getValues();

            // Clear the data array and fill it with correct indices
            $data = array();

            foreach ($existingValues as $index => $value) {
                if (isset($submittedValues[$value])) {
                    // Value was submitted
                    $data[$index] = $value;
                    unset($submittedValues[$value]);
                }
            }

            if (count($submittedValues) > 0) {
                throw new TransformationFailedException(sprintf(
                    'The following choices were not found: "%s"',
                    implode('", "', array_keys($submittedValues))
                ));
            }
        } elseif ('' === $data || null === $data) {
            // Empty values are always accepted.
            $data = array();
        }

        // Else leave the data unchanged to provoke an error during submission

        $event->setData($data);
    }

    /**
     * Alias of {@link preSubmit()}.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link preSubmit()} instead.
     */
    public function preBind(FormEvent $event)
    {
        $this->preSubmit($event);
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_SUBMIT => 'preSubmit');
    }
}
PK6`�\�:AAIpear/Symfony/Component/Form/Extension/Core/EventListener/TrimListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\EventListener;

use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Trims string data
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class TrimListener implements EventSubscriberInterface
{
    public function preSubmit(FormEvent $event)
    {
        $data = $event->getData();

        if (!is_string($data)) {
            return;
        }

        if (null !== $result = @preg_replace('/^[\pZ\p{Cc}]+|[\pZ\p{Cc}]+$/u', '', $data)) {
            $event->setData($result);
        } else {
            $event->setData(trim($data));
        }
    }

    /**
     * Alias of {@link preSubmit()}.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link preSubmit()} instead.
     */
    public function preBind(FormEvent $event)
    {
        $this->preSubmit($event);
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_SUBMIT => 'preSubmit');
    }
}
PK6`�\?D���Rpear/Symfony/Component/Form/Extension/Core/EventListener/FixRadioInputListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\EventListener;

use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface;

/**
 * Takes care of converting the input from a single radio button
 * to an array.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FixRadioInputListener implements EventSubscriberInterface
{
    private $choiceList;

    private $placeholderPresent;

    /**
     * Constructor.
     *
     * @param ChoiceListInterface $choiceList
     * @param Boolean             $placeholderPresent
     */
    public function __construct(ChoiceListInterface $choiceList, $placeholderPresent)
    {
        $this->choiceList = $choiceList;
        $this->placeholderPresent = $placeholderPresent;
    }

    public function preSubmit(FormEvent $event)
    {
        $data = $event->getData();

        // Since expanded choice fields are completely loaded anyway, we
        // can just as well get the values again without losing performance.
        $existingValues = $this->choiceList->getValues();

        if (false !== ($index = array_search($data, $existingValues, true))) {
            $data = array($index => $data);
        } elseif ('' === $data || null === $data) {
            // Empty values are always accepted.
            $data = $this->placeholderPresent ? array('placeholder' => '') : array();
        }

        // Else leave the data unchanged to provoke an error during submission

        $event->setData($data);
    }

    /**
     * Alias of {@link preSubmit()}.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link preSubmit()} instead.
     */
    public function preBind(FormEvent $event)
    {
        $this->preSubmit($event);
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_SUBMIT => 'preSubmit');
    }
}
PK6`�\\��//Opear/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\EventListener;

use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Resize a collection form element based on the data sent from the client.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ResizeFormListener implements EventSubscriberInterface
{
    /**
     * @var string
     */
    protected $type;

    /**
     * @var array
     */
    protected $options;

    /**
     * Whether children could be added to the group
     * @var Boolean
     */
    protected $allowAdd;

    /**
     * Whether children could be removed from the group
     * @var Boolean
     */
    protected $allowDelete;

    public function __construct($type, array $options = array(), $allowAdd = false, $allowDelete = false)
    {
        $this->type = $type;
        $this->allowAdd = $allowAdd;
        $this->allowDelete = $allowDelete;
        $this->options = $options;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SET_DATA => 'preSetData',
            FormEvents::PRE_SUBMIT => 'preSubmit',
            // (MergeCollectionListener, MergeDoctrineCollectionListener)
            FormEvents::SUBMIT => array('onSubmit', 50),
        );
    }

    public function preSetData(FormEvent $event)
    {
        $form = $event->getForm();
        $data = $event->getData();

        if (null === $data) {
            $data = array();
        }

        if (!is_array($data) && !($data instanceof \Traversable && $data instanceof \ArrayAccess)) {
            throw new UnexpectedTypeException($data, 'array or (\Traversable and \ArrayAccess)');
        }

        // First remove all rows
        foreach ($form as $name => $child) {
            $form->remove($name);
        }

        // Then add all rows again in the correct order
        foreach ($data as $name => $value) {
            $form->add($name, $this->type, array_replace(array(
                'property_path' => '['.$name.']',
            ), $this->options));
        }
    }

    public function preSubmit(FormEvent $event)
    {
        $form = $event->getForm();
        $data = $event->getData();

        if (null === $data || '' === $data) {
            $data = array();
        }

        if (!is_array($data) && !($data instanceof \Traversable && $data instanceof \ArrayAccess)) {
            throw new UnexpectedTypeException($data, 'array or (\Traversable and \ArrayAccess)');
        }

        // Remove all empty rows
        if ($this->allowDelete) {
            foreach ($form as $name => $child) {
                if (!isset($data[$name])) {
                    $form->remove($name);
                }
            }
        }

        // Add all additional rows
        if ($this->allowAdd) {
            foreach ($data as $name => $value) {
                if (!$form->has($name)) {
                    $form->add($name, $this->type, array_replace(array(
                        'property_path' => '['.$name.']',
                    ), $this->options));
                }
            }
        }
    }

    public function onSubmit(FormEvent $event)
    {
        $form = $event->getForm();
        $data = $event->getData();

        if (null === $data) {
            $data = array();
        }

        if (!is_array($data) && !($data instanceof \Traversable && $data instanceof \ArrayAccess)) {
            throw new UnexpectedTypeException($data, 'array or (\Traversable and \ArrayAccess)');
        }

        // The data mapper only adds, but does not remove items, so do this
        // here
        if ($this->allowDelete) {
            $toDelete = array();

            foreach ($data as $name => $child) {
                if (!$form->has($name)) {
                    $toDelete[] = $name;
                }
            }

            foreach ($toDelete as $name) {
                unset($data[$name]);
            }
        }

        $event->setData($data);
    }

    /**
     * Alias of {@link preSubmit()}.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link preSubmit()} instead.
     */
    public function preBind(FormEvent $event)
    {
        $this->preSubmit($event);
    }

    /**
     * Alias of {@link onSubmit()}.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link onSubmit()} instead.
     */
    public function onBind(FormEvent $event)
    {
        $this->onSubmit($event);
    }
}
PK7`�\õe��Tpear/Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Exception\UnexpectedTypeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class MergeCollectionListener implements EventSubscriberInterface
{
    /**
     * Whether elements may be added to the collection
     * @var Boolean
     */
    private $allowAdd;

    /**
     * Whether elements may be removed from the collection
     * @var Boolean
     */
    private $allowDelete;

    /**
     * Creates a new listener.
     *
     * @param Boolean $allowAdd Whether values might be added to the
     *                                collection.
     * @param Boolean $allowDelete Whether values might be removed from the
     *                                collection.
     */
    public function __construct($allowAdd = false, $allowDelete = false)
    {
        $this->allowAdd = $allowAdd;
        $this->allowDelete = $allowDelete;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::SUBMIT => 'onSubmit',
        );
    }

    public function onSubmit(FormEvent $event)
    {
        $dataToMergeInto = $event->getForm()->getNormData();
        $data = $event->getData();

        if (null === $data) {
            $data = array();
        }

        if (!is_array($data) && !($data instanceof \Traversable && $data instanceof \ArrayAccess)) {
            throw new UnexpectedTypeException($data, 'array or (\Traversable and \ArrayAccess)');
        }

        if (null !== $dataToMergeInto && !is_array($dataToMergeInto) && !($dataToMergeInto instanceof \Traversable && $dataToMergeInto instanceof \ArrayAccess)) {
            throw new UnexpectedTypeException($dataToMergeInto, 'array or (\Traversable and \ArrayAccess)');
        }

        // If we are not allowed to change anything, return immediately
        if ((!$this->allowAdd && !$this->allowDelete) || $data === $dataToMergeInto) {
            $event->setData($dataToMergeInto);

            return;
        }

        if (!$dataToMergeInto) {
            // No original data was set. Set it if allowed
            if ($this->allowAdd) {
                $dataToMergeInto = $data;
            }
        } else {
            // Calculate delta
            $itemsToAdd = is_object($data) ? clone $data : $data;
            $itemsToDelete = array();

            foreach ($dataToMergeInto as $beforeKey => $beforeItem) {
                foreach ($data as $afterKey => $afterItem) {
                    if ($afterItem === $beforeItem) {
                        // Item found, next original item
                        unset($itemsToAdd[$afterKey]);
                        continue 2;
                    }
                }

                // Item not found, remember for deletion
                $itemsToDelete[] = $beforeKey;
            }

            // Remove deleted items before adding to free keys that are to be
            // replaced
            if ($this->allowDelete) {
                foreach ($itemsToDelete as $key) {
                    unset($dataToMergeInto[$key]);
                }
            }

            // Add remaining items
            if ($this->allowAdd) {
                foreach ($itemsToAdd as $key => $item) {
                    if (!isset($dataToMergeInto[$key])) {
                        $dataToMergeInto[$key] = $item;
                    } else {
                        $dataToMergeInto[] = $item;
                    }
                }
            }
        }

        $event->setData($dataToMergeInto);
    }

    /**
     * Alias of {@link onSubmit()}.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link onSubmit()} instead.
     */
    public function onBind(FormEvent $event)
    {
        $this->onSubmit($event);
    }
}
PK7`�\��&PP>pear/Symfony/Component/Form/Extension/Core/View/ChoiceView.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\View;

/**
 * Represents a choice in templates.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ChoiceView
{
    /**
     * The original choice value.
     *
     * @var mixed
     */
    public $data;

    /**
     * The view representation of the choice.
     *
     * @var string
     */
    public $value;

    /**
     * The label displayed to humans.
     *
     * @var string
     */
    public $label;

    /**
     * Creates a new ChoiceView.
     *
     * @param mixed  $data  The original choice.
     * @param string $value The view representation of the choice.
     * @param string $label The label displayed to humans.
     */
    public function __construct($data, $value, $label)
    {
        $this->data = $data;
        $this->value = $value;
        $this->label = $label;
    }
}
PK7`�\C�W���<pear/Symfony/Component/Form/Extension/Core/CoreExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core;

use Symfony\Component\Form\AbstractExtension;
use Symfony\Component\PropertyAccess\PropertyAccess;

/**
 * Represents the main form extension, which loads the core functionality.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class CoreExtension extends AbstractExtension
{
    protected function loadTypes()
    {
        return array(
            new Type\FormType(PropertyAccess::createPropertyAccessor()),
            new Type\BirthdayType(),
            new Type\CheckboxType(),
            new Type\ChoiceType(),
            new Type\CollectionType(),
            new Type\CountryType(),
            new Type\DateType(),
            new Type\DateTimeType(),
            new Type\EmailType(),
            new Type\HiddenType(),
            new Type\IntegerType(),
            new Type\LanguageType(),
            new Type\LocaleType(),
            new Type\MoneyType(),
            new Type\NumberType(),
            new Type\PasswordType(),
            new Type\PercentType(),
            new Type\RadioType(),
            new Type\RepeatedType(),
            new Type\SearchType(),
            new Type\TextareaType(),
            new Type\TextType(),
            new Type\TimeType(),
            new Type\TimezoneType(),
            new Type\UrlType(),
            new Type\FileType(),
            new Type\ButtonType(),
            new Type\SubmitType(),
            new Type\ResetType(),
            new Type\CurrencyType(),
        );
    }
}
PK7`�\��

Lpear/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Core\DataMapper;

use Symfony\Component\Form\DataMapperInterface;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;

/**
 * A data mapper using property paths to read/write data.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class PropertyPathMapper implements DataMapperInterface
{
    /**
     * @var PropertyAccessorInterface
     */
    private $propertyAccessor;

    /**
     * Creates a new property path mapper.
     *
     * @param PropertyAccessorInterface $propertyAccessor
     */
    public function __construct(PropertyAccessorInterface $propertyAccessor = null)
    {
        $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor();
    }

    /**
     * {@inheritdoc}
     */
    public function mapDataToForms($data, $forms)
    {
        $empty = null === $data || array() === $data;

        if (!$empty && !is_array($data) && !is_object($data)) {
            throw new UnexpectedTypeException($data, 'object, array or empty');
        }

        foreach ($forms as $form) {
            $propertyPath = $form->getPropertyPath();
            $config = $form->getConfig();

            if (!$empty && null !== $propertyPath && $config->getMapped()) {
                $form->setData($this->propertyAccessor->getValue($data, $propertyPath));
            } else {
                $form->setData($form->getConfig()->getData());
            }
        }
    }

    /**
     * {@inheritdoc}
     */
    public function mapFormsToData($forms, &$data)
    {
        if (null === $data) {
            return;
        }

        if (!is_array($data) && !is_object($data)) {
            throw new UnexpectedTypeException($data, 'object, array or empty');
        }

        foreach ($forms as $form) {
            $propertyPath = $form->getPropertyPath();
            $config = $form->getConfig();

            // Write-back is disabled if the form is not synchronized (transformation failed),
            // if the form was not submitted and if the form is disabled (modification not allowed)
            if (null !== $propertyPath && $config->getMapped() && $form->isSubmitted() && $form->isSynchronized() && !$form->isDisabled()) {

                // If the field is of type DateTime and the data is the same skip the update to
                // keep the original object hash
                if ($form->getData() instanceof \DateTime && $form->getData() == $this->propertyAccessor->getValue($data, $propertyPath)) {
                    continue;
                }

                // If the data is identical to the value in $data, we are
                // dealing with a reference
                if (!is_object($data) || !$config->getByReference() || $form->getData() !== $this->propertyAccessor->getValue($data, $propertyPath)) {
                    $this->propertyAccessor->setValue($data, $propertyPath, $form->getData());
                }
            }
        }
    }
}
PK8`�\6s���Ipear/Symfony/Component/Form/Extension/DataCollector/FormDataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\DataCollector;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\DataCollector\DataCollector;

/**
 * Data collector for {@link \Symfony\Component\Form\FormInterface} instances.
 *
 * @since  2.4
 * @author Robert Schönthal <robert.schoenthal@gmail.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormDataCollector extends DataCollector implements FormDataCollectorInterface
{
    /**
     * @var FormDataExtractor
     */
    private $dataExtractor;

    /**
     * Stores the collected data per {@link FormInterface} instance.
     *
     * Uses the hashes of the forms as keys. This is preferable over using
     * {@link \SplObjectStorage}, because in this way no references are kept
     * to the {@link FormInterface} instances.
     *
     * @var array
     */
    private $dataByForm;

    /**
     * Stores the collected data per {@link FormView} instance.
     *
     * Uses the hashes of the views as keys. This is preferable over using
     * {@link \SplObjectStorage}, because in this way no references are kept
     * to the {@link FormView} instances.
     *
     * @var array
     */
    private $dataByView;

    /**
     * Connects {@link FormView} with {@link FormInterface} instances.
     *
     * Uses the hashes of the views as keys and the hashes of the forms as
     * values. This is preferable over storing the objects directly, because
     * this way they can safely be discarded by the GC.
     *
     * @var array
     */
    private $formsByView;

    public function __construct(FormDataExtractorInterface $dataExtractor)
    {
        $this->dataExtractor = $dataExtractor;
        $this->data = array(
            'forms' => array(),
            'nb_errors' => 0,
        );
    }

    /**
     * Does nothing. The data is collected during the form event listeners.
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function associateFormWithView(FormInterface $form, FormView $view)
    {
        $this->formsByView[spl_object_hash($view)] = spl_object_hash($form);
    }

    /**
     * {@inheritdoc}
     */
    public function collectConfiguration(FormInterface $form)
    {
        $hash = spl_object_hash($form);

        if (!isset($this->dataByForm[$hash])) {
            $this->dataByForm[$hash] = array();
        }

        $this->dataByForm[$hash] = array_replace(
            $this->dataByForm[$hash],
            $this->dataExtractor->extractConfiguration($form)
        );

        foreach ($form as $child) {
            $this->collectConfiguration($child);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function collectDefaultData(FormInterface $form)
    {
        $hash = spl_object_hash($form);

        if (!isset($this->dataByForm[$hash])) {
            $this->dataByForm[$hash] = array();
        }

        $this->dataByForm[$hash] = array_replace(
            $this->dataByForm[$hash],
            $this->dataExtractor->extractDefaultData($form)
        );

        foreach ($form as $child) {
            $this->collectDefaultData($child);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function collectSubmittedData(FormInterface $form)
    {
        $hash = spl_object_hash($form);

        if (!isset($this->dataByForm[$hash])) {
            $this->dataByForm[$hash] = array();
        }

        $this->dataByForm[$hash] = array_replace(
            $this->dataByForm[$hash],
            $this->dataExtractor->extractSubmittedData($form)
        );

        // Count errors
        if (isset($this->dataByForm[$hash]['errors'])) {
            $this->data['nb_errors'] += count($this->dataByForm[$hash]['errors']);
        }

        foreach ($form as $child) {
            $this->collectSubmittedData($child);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function collectViewVariables(FormView $view)
    {
        $hash = spl_object_hash($view);

        if (!isset($this->dataByView[$hash])) {
            $this->dataByView[$hash] = array();
        }

        $this->dataByView[$hash] = array_replace(
            $this->dataByView[$hash],
            $this->dataExtractor->extractViewVariables($view)
        );

        foreach ($view->children as $child) {
            $this->collectViewVariables($child);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function buildPreliminaryFormTree(FormInterface $form)
    {
        $this->data['forms'][$form->getName()] = array();

        $this->recursiveBuildPreliminaryFormTree($form, $this->data['forms'][$form->getName()]);
    }

    /**
     * {@inheritdoc}
     */
    public function buildFinalFormTree(FormInterface $form, FormView $view)
    {
        $this->data['forms'][$form->getName()] = array();

        $this->recursiveBuildFinalFormTree($form, $view, $this->data['forms'][$form->getName()]);
    }

    /**
     * {@inheritDoc}
     */
    public function getName()
    {
        return 'form';
    }

    /**
     * {@inheritdoc}
     */
    public function getData()
    {
        return $this->data;
    }

    private function recursiveBuildPreliminaryFormTree(FormInterface $form, &$output = null)
    {
        $hash = spl_object_hash($form);

        $output = isset($this->dataByForm[$hash])
            ? $this->dataByForm[$hash]
            : array();

        $output['children'] = array();

        foreach ($form as $name => $child) {
            $output['children'][$name] = array();

            $this->recursiveBuildPreliminaryFormTree($child, $output['children'][$name]);
        }
    }

    private function recursiveBuildFinalFormTree(FormInterface $form = null, FormView $view, &$output = null)
    {
        $viewHash = spl_object_hash($view);
        $formHash = null;

        if (null !== $form) {
            $formHash = spl_object_hash($form);
        } elseif (isset($this->formsByView[$viewHash])) {
            // The FormInterface instance of the CSRF token is never contained in
            // the FormInterface tree of the form, so we need to get the
            // corresponding FormInterface instance for its view in a different way
            $formHash = $this->formsByView[$viewHash];
        }

        $output = isset($this->dataByView[$viewHash])
            ? $this->dataByView[$viewHash]
            : array();

        if (null !== $formHash) {
            $output = array_replace(
                $output,
                isset($this->dataByForm[$formHash])
                    ? $this->dataByForm[$formHash]
                    : array()
            );
        }

        $output['children'] = array();

        foreach ($view->children as $name => $childView) {
            // The CSRF token, for example, is never added to the form tree.
            // It is only present in the view.
            $childForm = null !== $form && $form->has($name)
                ? $form->get($name)
                : null;

            $output['children'][$name] = array();

            $this->recursiveBuildFinalFormTree($childForm, $childView, $output['children'][$name]);
        }
    }
}
PK8`�\�((cpear/Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeFactoryDataCollectorProxy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\DataCollector\Proxy;

use Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface;
use Symfony\Component\Form\FormTypeInterface;
use Symfony\Component\Form\ResolvedFormTypeFactoryInterface;
use Symfony\Component\Form\ResolvedFormTypeInterface;

/**
 * Proxy that wraps resolved types into {@link ResolvedTypeDataCollectorProxy}
 * instances.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ResolvedTypeFactoryDataCollectorProxy implements ResolvedFormTypeFactoryInterface
{
    /**
     * @var ResolvedFormTypeFactoryInterface
     */
    private $proxiedFactory;

    /**
     * @var FormDataCollectorInterface
     */
    private $dataCollector;

    public function __construct(ResolvedFormTypeFactoryInterface $proxiedFactory, FormDataCollectorInterface $dataCollector)
    {
        $this->proxiedFactory = $proxiedFactory;
        $this->dataCollector = $dataCollector;
    }

    /**
     * {@inheritdoc}
     */
    public function createResolvedType(FormTypeInterface $type, array $typeExtensions, ResolvedFormTypeInterface $parent = null)
    {
        return new ResolvedTypeDataCollectorProxy(
            $this->proxiedFactory->createResolvedType($type, $typeExtensions, $parent),
            $this->dataCollector
        );
    }
}
PK9`�\|�
]��\pear/Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\DataCollector\Proxy;

use Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\ResolvedFormTypeInterface;

/**
 * Proxy that invokes a data collector when creating a form and its view.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ResolvedTypeDataCollectorProxy implements ResolvedFormTypeInterface
{
    /**
     * @var ResolvedFormTypeInterface
     */
    private $proxiedType;

    /**
     * @var FormDataCollectorInterface
     */
    private $dataCollector;

    public function __construct(ResolvedFormTypeInterface $proxiedType, FormDataCollectorInterface $dataCollector)
    {
        $this->proxiedType = $proxiedType;
        $this->dataCollector = $dataCollector;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->proxiedType->getName();
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return $this->proxiedType->getParent();
    }

    /**
     * {@inheritdoc}
     */
    public function getInnerType()
    {
        return $this->proxiedType->getInnerType();
    }

    /**
     * {@inheritdoc}
     */
    public function getTypeExtensions()
    {
        return $this->proxiedType->getTypeExtensions();
    }

    /**
     * {@inheritdoc}
     */
    public function createBuilder(FormFactoryInterface $factory, $name, array $options = array())
    {
        $builder = $this->proxiedType->createBuilder($factory, $name, $options);

        $builder->setAttribute('data_collector/passed_options', $options);
        $builder->setType($this);

        return $builder;
    }

    /**
     * {@inheritdoc}
     */
    public function createView(FormInterface $form, FormView $parent = null)
    {
        return $this->proxiedType->createView($form, $parent);
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $this->proxiedType->buildForm($builder, $options);
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $this->proxiedType->buildView($view, $form, $options);
    }

    /**
     * {@inheritdoc}
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        $this->proxiedType->finishView($view, $form, $options);

        // Remember which view belongs to which form instance, so that we can
        // get the collected data for a view when its form instance is not
        // available (e.g. CSRF token)
        $this->dataCollector->associateFormWithView($form, $view);

        // Since the CSRF token is only present in the FormView tree, we also
        // need to check the FormView tree instead of calling isRoot() on the
        // FormInterface tree
        if (null === $view->parent) {
            $this->dataCollector->collectViewVariables($view);

            // Re-assemble data, in case FormView instances were added, for
            // which no FormInterface instances were present (e.g. CSRF token).
            // Since finishView() is called after finishing the views of all
            // children, we can safely assume that information has been
            // collected about the complete form tree.
            $this->dataCollector->buildFinalFormTree($form, $view);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getOptionsResolver()
    {
        return $this->proxiedType->getOptionsResolver();
    }
}
PK9`�\��#�11Npear/Symfony/Component/Form/Extension/DataCollector/DataCollectorExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\DataCollector;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\AbstractExtension;

/**
 * Extension for collecting data of the forms on a page.
 *
 * @since  2.4
 * @author Robert Schönthal <robert.schoenthal@gmail.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class DataCollectorExtension extends AbstractExtension
{
    /**
     * @var EventSubscriberInterface
     */
    private $dataCollector;

    public function __construct(FormDataCollectorInterface $dataCollector)
    {
        $this->dataCollector = $dataCollector;
    }

    /**
     * {@inheritDoc}
     */
    protected function loadTypeExtensions()
    {
        return array(
            new Type\DataCollectorTypeExtension($this->dataCollector)
        );
    }
}
PK9`�\����Rpear/Symfony/Component/Form/Extension/DataCollector/FormDataExtractorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\DataCollector;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;

/**
 * Extracts arrays of information out of forms.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormDataExtractorInterface
{
    /**
     * Extracts the configuration data of a form.
     *
     * @param FormInterface $form The form
     *
     * @return array Information about the form's configuration
     */
    public function extractConfiguration(FormInterface $form);

    /**
     * Extracts the default data of a form.
     *
     * @param FormInterface $form The form
     *
     * @return array Information about the form's default data
     */
    public function extractDefaultData(FormInterface $form);

    /**
     * Extracts the submitted data of a form.
     *
     * @param FormInterface $form The form
     *
     * @return array Information about the form's submitted data
     */
    public function extractSubmittedData(FormInterface $form);

    /**
     * Extracts the view variables of a form.
     *
     * @param FormView $view The form view
     *
     * @return array Information about the view's variables
     */
    public function extractViewVariables(FormView $view);
}
PK:`�\%�`��Ipear/Symfony/Component/Form/Extension/DataCollector/FormDataExtractor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\DataCollector;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\HttpKernel\DataCollector\Util\ValueExporter;

/**
 * Default implementation of {@link FormDataExtractorInterface}.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormDataExtractor implements FormDataExtractorInterface
{
    /**
     * @var ValueExporter
     */
    private $valueExporter;

    /**
     * Constructs a new data extractor.
     */
    public function __construct(ValueExporter $valueExporter = null)
    {
        $this->valueExporter = $valueExporter ?: new ValueExporter();
    }

    /**
     * {@inheritdoc}
     */
    public function extractConfiguration(FormInterface $form)
    {
        $data = array(
            'id' => $this->buildId($form),
            'type' => $form->getConfig()->getType()->getName(),
            'type_class' => get_class($form->getConfig()->getType()->getInnerType()),
            'synchronized' => $this->valueExporter->exportValue($form->isSynchronized()),
            'passed_options' => array(),
            'resolved_options' => array(),
        );

        foreach ($form->getConfig()->getAttribute('data_collector/passed_options', array()) as $option => $value) {
            $data['passed_options'][$option] = $this->valueExporter->exportValue($value);
        }

        foreach ($form->getConfig()->getOptions() as $option => $value) {
            $data['resolved_options'][$option] = $this->valueExporter->exportValue($value);
        }

        ksort($data['passed_options']);
        ksort($data['resolved_options']);

        return $data;
    }

    /**
     * {@inheritdoc}
     */
    public function extractDefaultData(FormInterface $form)
    {
        $data = array(
            'default_data' => array(
                'norm' => $this->valueExporter->exportValue($form->getNormData()),
            ),
            'submitted_data' => array(),
        );

        if ($form->getData() !== $form->getNormData()) {
            $data['default_data']['model'] = $this->valueExporter->exportValue($form->getData());
        }

        if ($form->getViewData() !== $form->getNormData()) {
            $data['default_data']['view'] = $this->valueExporter->exportValue($form->getViewData());
        }

        return $data;
    }

    /**
     * {@inheritdoc}
     */
    public function extractSubmittedData(FormInterface $form)
    {
        $data = array(
            'submitted_data' => array(
                'norm' => $this->valueExporter->exportValue($form->getNormData()),
            ),
            'errors' => array(),
        );

        if ($form->getViewData() !== $form->getNormData()) {
            $data['submitted_data']['view'] = $this->valueExporter->exportValue($form->getViewData());
        }

        if ($form->getData() !== $form->getNormData()) {
            $data['submitted_data']['model'] = $this->valueExporter->exportValue($form->getData());
        }

        foreach ($form->getErrors() as $error) {
            $data['errors'][] = array(
                'message' => $error->getMessage(),
            );
        }

        $data['synchronized'] = $this->valueExporter->exportValue($form->isSynchronized());

        return $data;
    }

    /**
     * {@inheritdoc}
     */
    public function extractViewVariables(FormView $view)
    {
        $data = array();

        // Set the ID in case no FormInterface object was collected for this
        // view
        if (isset($view->vars['id'])) {
            $data['id'] = $view->vars['id'];
        }

        foreach ($view->vars as $varName => $value) {
            $data['view_vars'][$varName] = $this->valueExporter->exportValue($value);
        }

        ksort($data['view_vars']);

        return $data;
    }

    /**
     * Recursively builds an HTML ID for a form.
     *
     * @param FormInterface $form The form
     *
     * @return string The HTML ID
     */
    private function buildId(FormInterface $form)
    {
        $id = $form->getName();

        if (null !== $form->getParent()) {
            $id = $this->buildId($form->getParent()).'_'.$id;
        }

        return $id;
    }
}
PK:`�\�T���Rpear/Symfony/Component/Form/Extension/DataCollector/FormDataCollectorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\DataCollector;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface;

/**
 * Collects and structures information about forms.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormDataCollectorInterface extends DataCollectorInterface
{
    /**
     * Stores configuration data of the given form and its children.
     *
     * @param FormInterface $form A root form
     */
    public function collectConfiguration(FormInterface $form);

    /**
     * Stores the default data of the given form and its children.
     *
     * @param FormInterface $form A root form
     */
    public function collectDefaultData(FormInterface $form);

    /**
     * Stores the submitted data of the given form and its children.
     *
     * @param FormInterface $form A root form
     */
    public function collectSubmittedData(FormInterface $form);

    /**
     * Stores the view variables of the given form view and its children.
     *
     * @param FormView $view A root form view
     */
    public function collectViewVariables(FormView $view);

    /**
     * Specifies that the given objects represent the same conceptual form.
     *
     * @param FormInterface $form A form object
     * @param FormView      $view A view object
     */
    public function associateFormWithView(FormInterface $form, FormView $view);

    /**
     * Assembles the data collected about the given form and its children as
     * a tree-like data structure.
     *
     * The result can be queried using {@link getData()}.
     *
     * @param FormInterface $form A root form
     */
    public function buildPreliminaryFormTree(FormInterface $form);

    /**
     * Assembles the data collected about the given form and its children as
     * a tree-like data structure.
     *
     * The result can be queried using {@link getData()}.
     *
     * Contrary to {@link buildPreliminaryFormTree()}, a {@link FormView}
     * object has to be passed. The tree structure of this view object will be
     * used for structuring the resulting data. That means, if a child is
     * present in the view, but not in the form, it will be present in the final
     * data array anyway.
     *
     * When {@link FormView} instances are present in the view tree, for which
     * no corresponding {@link FormInterface} objects can be found in the form
     * tree, only the view data will be included in the result. If a
     * corresponding {@link FormInterface} exists otherwise, call
     * {@link associateFormWithView()} before calling this method.
     *
     * @param FormInterface $form A root form
     * @param FormView      $view A root view
     */
    public function buildFinalFormTree(FormInterface $form, FormView $view);

    /**
     * Returns all collected data.
     *
     * @return array
     */
    public function getData();

}
PK;`�\�1�
uuWpear/Symfony/Component/Form/Extension/DataCollector/Type/DataCollectorTypeExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\DataCollector\Type;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\DataCollector\EventListener\DataCollectorListener;
use Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface;
use Symfony\Component\Form\FormBuilderInterface;

/**
 * Type extension for collecting data of a form with this type.
 *
 * @since  2.4
 * @author Robert Schönthal <robert.schoenthal@gmail.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class DataCollectorTypeExtension extends AbstractTypeExtension
{
    /**
     * @var \Symfony\Component\EventDispatcher\EventSubscriberInterface
     */
    private $listener;

    public function __construct(FormDataCollectorInterface $dataCollector)
    {
        $this->listener = new DataCollectorListener($dataCollector);
    }

    /**
     * {@inheritDoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventSubscriber($this->listener);
    }

    /**
     * {@inheritDoc}
     */
    public function getExtendedType()
    {
        return 'form';
    }
}
PK;`�\I��2

[pear/Symfony/Component/Form/Extension/DataCollector/EventListener/DataCollectorListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\DataCollector\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

/**
 * Listener that invokes a data collector for the {@link FormEvents::POST_SET_DATA}
 * and {@link FormEvents::POST_SUBMIT} events.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class DataCollectorListener implements EventSubscriberInterface
{
    /**
     * @var FormDataCollectorInterface
     */
    private $dataCollector;

    public function __construct(FormDataCollectorInterface $dataCollector)
    {
        $this->dataCollector = $dataCollector;
    }

    /**
     * {@inheritDoc}
     */
    public static function getSubscribedEvents()
    {
        return array(
            // High priority in order to be called as soon as possible
            FormEvents::POST_SET_DATA => array('postSetData', 255),
            // Low priority in order to be called as late as possible
            FormEvents::POST_SUBMIT => array('postSubmit', -255),
        );
    }

    /**
     * Listener for the {@link FormEvents::POST_SET_DATA} event.
     *
     * @param FormEvent $event The event object
     */
    public function postSetData(FormEvent $event)
    {
        if ($event->getForm()->isRoot()) {
            // Collect basic information about each form
            $this->dataCollector->collectConfiguration($event->getForm());

            // Collect the default data
            $this->dataCollector->collectDefaultData($event->getForm());
        }
    }

    /**
     * Listener for the {@link FormEvents::POST_SUBMIT} event.
     *
     * @param FormEvent $event The event object
     */
    public function postSubmit(FormEvent $event)
    {
        if ($event->getForm()->isRoot()) {
            // Collect the submitted data of each form
            $this->dataCollector->collectSubmittedData($event->getForm());

            // Assemble a form tree
            // This is done again in collectViewVariables(), but that method
            // is not guaranteed to be called (i.e. when no view is created)
            $this->dataCollector->buildPreliminaryFormTree($event->getForm());
        }
    }

}
PK<`�\�Pff]pear/Symfony/Component/Form/Extension/HttpFoundation/Type/FormTypeHttpFoundationExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\HttpFoundation\Type;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\HttpFoundation\EventListener\BindRequestListener;
use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationRequestHandler;
use Symfony\Component\Form\FormBuilderInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormTypeHttpFoundationExtension extends AbstractTypeExtension
{
    /**
     * @var BindRequestListener
     */
    private $listener;

    /**
     * @var HttpFoundationRequestHandler
     */
    private $requestHandler;

    public function __construct()
    {
        $this->listener = new BindRequestListener();
        $this->requestHandler = new HttpFoundationRequestHandler();
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventSubscriber($this->listener);
        $builder->setRequestHandler($this->requestHandler);
    }

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return 'form';
    }
}
PK=`�\䋧��Zpear/Symfony/Component/Form/Extension/HttpFoundation/EventListener/BindRequestListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\HttpFoundation\EventListener;

use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Exception\LogicException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Pass the
 *             Request instance to {@link Form::handleRequest()} instead.
 */
class BindRequestListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        // High priority in order to supersede other listeners
        return array(FormEvents::PRE_BIND => array('preBind', 128));
    }

    public function preBind(FormEvent $event)
    {
        $form = $event->getForm();

        /* @var Request $request */
        $request = $event->getData();

        // Only proceed if we actually deal with a Request
        if (!$request instanceof Request) {
            return;
        }

        // Uncomment this as soon as the deprecation note should be shown
        // trigger_error('Passing a Request instance to Form::submit() is deprecated since version 2.3 and will be disabled in 3.0. Call Form::process($request) instead.', E_USER_DEPRECATED);

        $name = $form->getConfig()->getName();
        $default = $form->getConfig()->getCompound() ? array() : null;

        // Store the bound data in case of a post request
        switch ($request->getMethod()) {
            case 'POST':
            case 'PUT':
            case 'DELETE':
            case 'PATCH':
                if ('' === $name) {
                    // Form bound without name
                    $params = $request->request->all();
                    $files = $request->files->all();
                } else {
                    $params = $request->request->get($name, $default);
                    $files = $request->files->get($name, $default);
                }

                if (is_array($params) && is_array($files)) {
                    $data = array_replace_recursive($params, $files);
                } else {
                    $data = $params ?: $files;
                }

                break;

            case 'GET':
                $data = '' === $name
                    ? $request->query->all()
                    : $request->query->get($name, $default);

                break;

            default:
                throw new LogicException(sprintf(
                    'The request method "%s" is not supported',
                    $request->getMethod()
                ));
        }

        $event->setData($data);
    }
}
PK=`�\�j��=
=
Upear/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\HttpFoundation;

use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\RequestHandlerInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * A request processor using the {@link Request} class of the HttpFoundation
 * component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class HttpFoundationRequestHandler implements RequestHandlerInterface
{
    /**
     * {@inheritdoc}
     */
    public function handleRequest(FormInterface $form, $request = null)
    {
        if (!$request instanceof Request) {
            throw new UnexpectedTypeException($request, 'Symfony\Component\HttpFoundation\Request');
        }

        $name = $form->getName();
        $method = $form->getConfig()->getMethod();

        if ($method !== $request->getMethod()) {
            return;
        }

        if ('GET' === $method) {
            if ('' === $name) {
                $data = $request->query->all();
            } else {
                // Don't submit GET requests if the form's name does not exist
                // in the request
                if (!$request->query->has($name)) {
                    return;
                }

                $data = $request->query->get($name);
            }
        } else {
            if ('' === $name) {
                $params = $request->request->all();
                $files = $request->files->all();
            } elseif ($request->request->has($name) || $request->files->has($name)) {
                $default = $form->getConfig()->getCompound() ? array() : null;
                $params = $request->request->get($name, $default);
                $files = $request->files->get($name, $default);
            } else {
                // Don't submit the form if it is not present in the request
                return;
            }

            if (is_array($params) && is_array($files)) {
                $data = array_replace_recursive($params, $files);
            } else {
                $data = $params ?: $files;
            }
        }

        // Don't auto-submit the form unless at least one field is present.
        if ('' === $name && count(array_intersect_key($data, $form->all())) <= 0) {
            return;
        }

        $form->submit($data, 'PATCH' !== $method);
    }
}
PK=`�\��Q��Ppear/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\HttpFoundation;

use Symfony\Component\Form\AbstractExtension;

/**
 * Integrates the HttpFoundation component with the Form library.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class HttpFoundationExtension extends AbstractExtension
{
    protected function loadTypeExtensions()
    {
        return array(
            new Type\FormTypeHttpFoundationExtension(),
        );
    }
}
PK@`�\��Ck��Epear/Symfony/Component/Form/Extension/Validator/Util/ServerParams.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\Util;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ServerParams
{
    /**
     * Returns maximum post size in bytes.
     *
     * @return null|integer The maximum post size in bytes
     */
    public function getPostMaxSize()
    {
        $iniMax = strtolower($this->getNormalizedIniPostMaxSize());

        if ('' === $iniMax) {
            return null;
        }

        $max = ltrim($iniMax, '+');
        if (0 === strpos($max, '0x')) {
            $max = intval($max, 16);
        } elseif (0 === strpos($max, '0')) {
            $max = intval($max, 8);
        } else {
            $max = intval($max);
        }

        switch (substr($iniMax, -1)) {
            case 't': $max *= 1024;
            case 'g': $max *= 1024;
            case 'm': $max *= 1024;
            case 'k': $max *= 1024;
        }

        return $max;
    }

    /**
     * Returns the normalized "post_max_size" ini setting.
     *
     * @return string
     */
    public function getNormalizedIniPostMaxSize()
    {
        return strtoupper(trim(ini_get('post_max_size')));
    }

    /**
     * Returns the content length of the request.
     *
     * @return mixed The request content length.
     */
    public function getContentLength()
    {
        return isset($_SERVER['CONTENT_LENGTH'])
            ? (int) $_SERVER['CONTENT_LENGTH']
            : null;
    }

}
PK@`�\ɥS��Ypear/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPathIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\ViolationMapper;

use Symfony\Component\PropertyAccess\PropertyPathIterator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ViolationPathIterator extends PropertyPathIterator
{
    public function __construct(ViolationPath $violationPath)
    {
        parent::__construct($violationPath);
    }

    public function mapsForm()
    {
        return $this->path->mapsForm($this->key());
    }
}
PK@`�\C_�hU+U+Spear/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\ViolationMapper;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Util\InheritDataAwareIterator;
use Symfony\Component\PropertyAccess\PropertyPathIterator;
use Symfony\Component\PropertyAccess\PropertyPathBuilder;
use Symfony\Component\PropertyAccess\PropertyPathIteratorInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Validator\ConstraintViolation;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ViolationMapper implements ViolationMapperInterface
{
    /**
     * @var Boolean
     */
    private $allowNonSynchronized;

    /**
     * {@inheritdoc}
     */
    public function mapViolation(ConstraintViolation $violation, FormInterface $form, $allowNonSynchronized = false)
    {
        $this->allowNonSynchronized = $allowNonSynchronized;

        // The scope is the currently found most specific form that
        // an error should be mapped to. After setting the scope, the
        // mapper will try to continue to find more specific matches in
        // the children of scope. If it cannot, the error will be
        // mapped to this scope.
        $scope = null;

        $violationPath = null;
        $relativePath = null;
        $match = false;

        // Don't create a ViolationPath instance for empty property paths
        if (strlen($violation->getPropertyPath()) > 0) {
            $violationPath = new ViolationPath($violation->getPropertyPath());
            $relativePath = $this->reconstructPath($violationPath, $form);
        }

        // This case happens if the violation path is empty and thus
        // the violation should be mapped to the root form
        if (null === $violationPath) {
            $scope = $form;
        }

        // In general, mapping happens from the root form to the leaf forms
        // First, the rules of the root form are applied to determine
        // the subsequent descendant. The rules of this descendant are then
        // applied to find the next and so on, until we have found the
        // most specific form that matches the violation.

        // If any of the forms found in this process is not synchronized,
        // mapping is aborted. Non-synchronized forms could not reverse
        // transform the value entered by the user, thus any further violations
        // caused by the (invalid) reverse transformed value should be
        // ignored.

        if (null !== $relativePath) {
            // Set the scope to the root of the relative path
            // This root will usually be $form. If the path contains
            // an unmapped form though, the last unmapped form found
            // will be the root of the path.
            $scope = $relativePath->getRoot();
            $it = new PropertyPathIterator($relativePath);

            while ($this->acceptsErrors($scope) && null !== ($child = $this->matchChild($scope, $it))) {
                $scope = $child;
                $it->next();
                $match = true;
            }
        }

        // This case happens if an error happened in the data under a
        // form inheriting its parent data that does not match any of the
        // children of that form.
        if (null !== $violationPath && !$match) {
            // If we could not map the error to anything more specific
            // than the root element, map it to the innermost directly
            // mapped form of the violation path
            // e.g. "children[foo].children[bar].data.baz"
            // Here the innermost directly mapped child is "bar"

            $scope = $form;
            $it = new ViolationPathIterator($violationPath);

            // Note: acceptsErrors() will always return true for forms inheriting
            // their parent data, because these forms can never be non-synchronized
            // (they don't do any data transformation on their own)
            while ($this->acceptsErrors($scope) && $it->valid() && $it->mapsForm()) {
                if (!$scope->has($it->current())) {
                    // Break if we find a reference to a non-existing child
                    break;
                }

                $scope = $scope->get($it->current());
                $it->next();
            }
        }

        // Follow dot rules until we have the final target
        $mapping = $scope->getConfig()->getOption('error_mapping');

        while ($this->acceptsErrors($scope) && isset($mapping['.'])) {
            $dotRule = new MappingRule($scope, '.', $mapping['.']);
            $scope = $dotRule->getTarget();
            $mapping = $scope->getConfig()->getOption('error_mapping');
        }

        // Only add the error if the form is synchronized
        if ($this->acceptsErrors($scope)) {
            $scope->addError(new FormError(
                $violation->getMessage(),
                $violation->getMessageTemplate(),
                $violation->getMessageParameters(),
                $violation->getMessagePluralization()
            ));
        }
    }

    /**
     * Tries to match the beginning of the property path at the
     * current position against the children of the scope.
     *
     * If a matching child is found, it is returned. Otherwise
     * null is returned.
     *
     * @param FormInterface                 $form The form to search.
     * @param PropertyPathIteratorInterface $it   The iterator at its current position.
     *
     * @return null|FormInterface The found match or null.
     */
    private function matchChild(FormInterface $form, PropertyPathIteratorInterface $it)
    {
        // Remember at what property path underneath "data"
        // we are looking. Check if there is a child with that
        // path, otherwise increase path by one more piece
        $chunk = '';
        $foundChild = null;
        $foundAtIndex = 0;

        // Construct mapping rules for the given form
        $rules = array();

        foreach ($form->getConfig()->getOption('error_mapping') as $propertyPath => $targetPath) {
            // Dot rules are considered at the very end
            if ('.' !== $propertyPath) {
                $rules[] = new MappingRule($form, $propertyPath, $targetPath);
            }
        }

        // Skip forms inheriting their parent data when iterating the children
        $childIterator = new \RecursiveIteratorIterator(
            new InheritDataAwareIterator($form)
        );

        // Make the path longer until we find a matching child
        while (true) {
            if (!$it->valid()) {
                return null;
            }

            if ($it->isIndex()) {
                $chunk .= '['.$it->current().']';
            } else {
                $chunk .= ('' === $chunk ? '' : '.').$it->current();
            }

            // Test mapping rules as long as we have any
            foreach ($rules as $key => $rule) {
                /* @var MappingRule $rule */

                // Mapping rule matches completely, terminate.
                if (null !== ($form = $rule->match($chunk))) {
                    return $form;
                }

                // Keep only rules that have $chunk as prefix
                if (!$rule->isPrefix($chunk)) {
                    unset($rules[$key]);
                }
            }

            // Test children unless we already found one
            if (null === $foundChild) {
                foreach ($childIterator as $child) {
                    /* @var FormInterface $child */
                    $childPath = (string) $child->getPropertyPath();

                    // Child found, mark as return value
                    if ($chunk === $childPath) {
                        $foundChild = $child;
                        $foundAtIndex = $it->key();
                    }
                }
            }

            // Add element to the chunk
            $it->next();

            // If we reached the end of the path or if there are no
            // more matching mapping rules, return the found child
            if (null !== $foundChild && (!$it->valid() || count($rules) === 0)) {
                // Reset index in case we tried to find mapping
                // rules further down the path
                $it->seek($foundAtIndex);

                return $foundChild;
            }
        }

        return null;
    }

    /**
     * Reconstructs a property path from a violation path and a form tree.
     *
     * @param  ViolationPath $violationPath The violation path.
     * @param  FormInterface $origin        The root form of the tree.
     *
     * @return RelativePath The reconstructed path.
     */
    private function reconstructPath(ViolationPath $violationPath, FormInterface $origin)
    {
        $propertyPathBuilder = new PropertyPathBuilder($violationPath);
        $it = $violationPath->getIterator();
        $scope = $origin;

        // Remember the current index in the builder
        $i = 0;

        // Expand elements that map to a form (like "children[address]")
        for ($it->rewind(); $it->valid() && $it->mapsForm(); $it->next()) {
            if (!$scope->has($it->current())) {
                // Scope relates to a form that does not exist
                // Bail out
                break;
            }

            // Process child form
            $scope = $scope->get($it->current());

            if ($scope->getConfig()->getInheritData()) {
                // Form inherits its parent data
                // Cut the piece out of the property path and proceed
                $propertyPathBuilder->remove($i);
            } elseif (!$scope->getConfig()->getMapped()) {
                // Form is not mapped
                // Set the form as new origin and strip everything
                // we have so far in the path
                $origin = $scope;
                $propertyPathBuilder->remove(0, $i + 1);
                $i = 0;
            } else {
                /* @var \Symfony\Component\PropertyAccess\PropertyPathInterface $propertyPath */
                $propertyPath = $scope->getPropertyPath();

                if (null === $propertyPath) {
                    // Property path of a mapped form is null
                    // Should not happen, bail out
                    break;
                }

                $propertyPathBuilder->replace($i, 1, $propertyPath);
                $i += $propertyPath->getLength();
            }
        }

        $finalPath = $propertyPathBuilder->getPropertyPath();

        return null !== $finalPath ? new RelativePath($origin, $finalPath) : null;
    }

    /**
     * @param FormInterface $form
     *
     * @return Boolean
     */
    private function acceptsErrors(FormInterface $form)
    {
        return $this->allowNonSynchronized || $form->isSynchronized();
    }
}
PKA`�\�-��!!Qpear/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationPath.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\ViolationMapper;

use Symfony\Component\Form\Exception\OutOfBoundsException;
use Symfony\Component\PropertyAccess\PropertyPath;
use Symfony\Component\PropertyAccess\PropertyPathInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ViolationPath implements \IteratorAggregate, PropertyPathInterface
{
    /**
     * @var array
     */
    private $elements = array();

    /**
     * @var array
     */
    private $isIndex = array();

    /**
     * @var array
     */
    private $mapsForm = array();

    /**
     * @var string
     */
    private $pathAsString = '';

    /**
     * @var integer
     */
    private $length = 0;

    /**
     * Creates a new violation path from a string.
     *
     * @param string $violationPath The property path of a {@link ConstraintViolation}
     *                              object.
     */
    public function __construct($violationPath)
    {
        $path = new PropertyPath($violationPath);
        $elements = $path->getElements();
        $data = false;

        for ($i = 0, $l = count($elements); $i < $l; ++$i) {
            if (!$data) {
                // The element "data" has not yet been passed
                if ('children' === $elements[$i] && $path->isProperty($i)) {
                    // Skip element "children"
                    ++$i;

                    // Next element must exist and must be an index
                    // Otherwise consider this the end of the path
                    if ($i >= $l || !$path->isIndex($i)) {
                        break;
                    }

                    $this->elements[] = $elements[$i];
                    $this->isIndex[] = true;
                    $this->mapsForm[] = true;
                } elseif ('data' === $elements[$i] && $path->isProperty($i)) {
                    // Skip element "data"
                    ++$i;

                    // End of path
                    if ($i >= $l) {
                        break;
                    }

                    $this->elements[] = $elements[$i];
                    $this->isIndex[] = $path->isIndex($i);
                    $this->mapsForm[] = false;
                    $data = true;
                } else {
                    // Neither "children" nor "data" property found
                    // Consider this the end of the path
                    break;
                }
            } else {
                // Already after the "data" element
                // Pick everything as is
                $this->elements[] = $elements[$i];
                $this->isIndex[] = $path->isIndex($i);
                $this->mapsForm[] = false;
            }
        }

        $this->length = count($this->elements);

        $this->buildString();
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        return $this->pathAsString;
    }

    /**
     * {@inheritdoc}
     */
    public function getLength()
    {
        return $this->length;
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        if ($this->length <= 1) {
            return null;
        }

        $parent = clone $this;

        --$parent->length;
        array_pop($parent->elements);
        array_pop($parent->isIndex);
        array_pop($parent->mapsForm);

        $parent->buildString();

        return $parent;
    }

    /**
     * {@inheritdoc}
     */
    public function getElements()
    {
        return $this->elements;
    }

    /**
     * {@inheritdoc}
     */
    public function getElement($index)
    {
        if (!isset($this->elements[$index])) {
            throw new OutOfBoundsException(sprintf('The index %s is not within the violation path', $index));
        }

        return $this->elements[$index];
    }

    /**
     * {@inheritdoc}
     */
    public function isProperty($index)
    {
        if (!isset($this->isIndex[$index])) {
            throw new OutOfBoundsException(sprintf('The index %s is not within the violation path', $index));
        }

        return !$this->isIndex[$index];
    }

    /**
     * {@inheritdoc}
     */
    public function isIndex($index)
    {
        if (!isset($this->isIndex[$index])) {
            throw new OutOfBoundsException(sprintf('The index %s is not within the violation path', $index));
        }

        return $this->isIndex[$index];
    }

    /**
     * Returns whether an element maps directly to a form.
     *
     * Consider the following violation path:
     *
     * <code>
     * children[address].children[office].data.street
     * </code>
     *
     * In this example, "address" and "office" map to forms, while
     * "street does not.
     *
     * @param  integer $index The element index.
     *
     * @return Boolean Whether the element maps to a form.
     *
     * @throws OutOfBoundsException If the offset is invalid.
     */
    public function mapsForm($index)
    {
        if (!isset($this->mapsForm[$index])) {
            throw new OutOfBoundsException(sprintf('The index %s is not within the violation path', $index));
        }

        return $this->mapsForm[$index];
    }

    /**
     * Returns a new iterator for this path
     *
     * @return ViolationPathIterator
     */
    public function getIterator()
    {
        return new ViolationPathIterator($this);
    }

    /**
     * Builds the string representation from the elements.
     */
    private function buildString()
    {
        $this->pathAsString = '';
        $data = false;

        foreach ($this->elements as $index => $element) {
            if ($this->mapsForm[$index]) {
                $this->pathAsString .= ".children[$element]";
            } elseif (!$data) {
                $this->pathAsString .= '.data'.($this->isIndex[$index] ? "[$element]" : ".$element");
                $data = true;
            } else {
                $this->pathAsString .= $this->isIndex[$index] ? "[$element]" : ".$element";
            }
        }

        if ('' !== $this->pathAsString) {
            // remove leading dot
            $this->pathAsString = substr($this->pathAsString, 1);
        }
    }
}
PKA`�\�k�t==\pear/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapperInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\ViolationMapper;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Validator\ConstraintViolation;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ViolationMapperInterface
{
    /**
     * Maps a constraint violation to a form in the form tree under
     * the given form.
     *
     * @param ConstraintViolation $violation The violation to map.
     * @param FormInterface       $form      The root form of the tree
     *                                       to map it to.
     * @param Boolean             $allowNonSynchronized Whether to allow
     *                                       mapping to non-synchronized forms.
     */
    public function mapViolation(ConstraintViolation $violation, FormInterface $form, $allowNonSynchronized = false);
}
PKB`�\�\T��Ppear/Symfony/Component/Form/Extension/Validator/ViolationMapper/RelativePath.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\ViolationMapper;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\PropertyAccess\PropertyPath;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class RelativePath extends PropertyPath
{
    /**
     * @var FormInterface
     */
    private $root;

    /**
     * @param FormInterface $root
     * @param string        $propertyPath
     */
    public function __construct(FormInterface $root, $propertyPath)
    {
        parent::__construct($propertyPath);

        $this->root = $root;
    }

    /**
     * @return FormInterface
     */
    public function getRoot()
    {
        return $this->root;
    }
}
PKB`�\f����
�
Opear/Symfony/Component/Form/Extension/Validator/ViolationMapper/MappingRule.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\ViolationMapper;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Exception\ErrorMappingException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class MappingRule
{
    /**
     * @var FormInterface
     */
    private $origin;

    /**
     * @var string
     */
    private $propertyPath;

    /**
     * @var string
     */
    private $targetPath;

    public function __construct(FormInterface $origin, $propertyPath, $targetPath)
    {
        $this->origin = $origin;
        $this->propertyPath = $propertyPath;
        $this->targetPath = $targetPath;
    }

    /**
     * @return FormInterface
     */
    public function getOrigin()
    {
        return $this->origin;
    }

    /**
     * Matches a property path against the rule path.
     *
     * If the rule matches, the form mapped by the rule is returned.
     * Otherwise this method returns false.
     *
     * @param  string $propertyPath The property path to match against the rule.
     *
     * @return null|FormInterface The mapped form or null.
     */
    public function match($propertyPath)
    {
        if ($propertyPath === (string) $this->propertyPath) {
            return $this->getTarget();
        }

        return null;
    }

    /**
     * Matches a property path against a prefix of the rule path.
     *
     * @param string $propertyPath The property path to match against the rule.
     *
     * @return Boolean Whether the property path is a prefix of the rule or not.
     */
    public function isPrefix($propertyPath)
    {
        $length = strlen($propertyPath);
        $prefix = substr($this->propertyPath, 0, $length);
        $next = isset($this->propertyPath[$length]) ? $this->propertyPath[$length] : null;

        return $prefix === $propertyPath && ('[' === $next || '.' === $next);
    }

    /**
     * @return FormInterface
     *
     * @throws ErrorMappingException
     */
    public function getTarget()
    {
        $childNames = explode('.', $this->targetPath);
        $target = $this->origin;

        foreach ($childNames as $childName) {
            if (!$target->has($childName)) {
                throw new ErrorMappingException(sprintf('The child "%s" of "%s" mapped by the rule "%s" in "%s" does not exist.', $childName, $target->getName(), $this->targetPath, $this->origin->getName()));
            }
            $target = $target->get($childName);
        }

        return $target;
    }
}
PKC`�\l�Ct*t*Hpear/Symfony/Component/Form/Extension/Validator/ValidatorTypeGuesser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator;

use Symfony\Component\Form\FormTypeGuesserInterface;
use Symfony\Component\Form\Guess\Guess;
use Symfony\Component\Form\Guess\TypeGuess;
use Symfony\Component\Form\Guess\ValueGuess;
use Symfony\Component\Validator\MetadataFactoryInterface;
use Symfony\Component\Validator\Constraint;

class ValidatorTypeGuesser implements FormTypeGuesserInterface
{
    private $metadataFactory;

    public function __construct(MetadataFactoryInterface $metadataFactory)
    {
        $this->metadataFactory = $metadataFactory;
    }

    /**
     * {@inheritDoc}
     */
    public function guessType($class, $property)
    {
        $guesser = $this;

        return $this->guess($class, $property, function (Constraint $constraint) use ($guesser) {
            return $guesser->guessTypeForConstraint($constraint);
        });
    }

    /**
     * {@inheritDoc}
     */
    public function guessRequired($class, $property)
    {
        $guesser = $this;

        return $this->guess($class, $property, function (Constraint $constraint) use ($guesser) {
            return $guesser->guessRequiredForConstraint($constraint);
        // If we don't find any constraint telling otherwise, we can assume
        // that a field is not required (with LOW_CONFIDENCE)
        }, false);
    }

    /**
     * {@inheritDoc}
     */
    public function guessMaxLength($class, $property)
    {
        $guesser = $this;

        return $this->guess($class, $property, function (Constraint $constraint) use ($guesser) {
            return $guesser->guessMaxLengthForConstraint($constraint);
        });
    }

    /**
     * {@inheritDoc}
     */
    public function guessPattern($class, $property)
    {
        $guesser = $this;

        return $this->guess($class, $property, function (Constraint $constraint) use ($guesser) {
            return $guesser->guessPatternForConstraint($constraint);
        });
    }

    /**
     * Guesses a field class name for a given constraint
     *
     * @param Constraint $constraint The constraint to guess for
     *
     * @return TypeGuess|null The guessed field class and options
     */
    public function guessTypeForConstraint(Constraint $constraint)
    {
        switch (get_class($constraint)) {
            case 'Symfony\Component\Validator\Constraints\Type':
                switch ($constraint->type) {
                    case 'array':
                        return new TypeGuess('collection', array(), Guess::MEDIUM_CONFIDENCE);
                    case 'boolean':
                    case 'bool':
                        return new TypeGuess('checkbox', array(), Guess::MEDIUM_CONFIDENCE);

                    case 'double':
                    case 'float':
                    case 'numeric':
                    case 'real':
                        return new TypeGuess('number', array(), Guess::MEDIUM_CONFIDENCE);

                    case 'integer':
                    case 'int':
                    case 'long':
                        return new TypeGuess('integer', array(), Guess::MEDIUM_CONFIDENCE);

                    case '\DateTime':
                        return new TypeGuess('date', array(), Guess::MEDIUM_CONFIDENCE);

                    case 'string':
                        return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
                }
                break;

            case 'Symfony\Component\Validator\Constraints\Country':
                return new TypeGuess('country', array(), Guess::HIGH_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\Date':
                return new TypeGuess('date', array('input' => 'string'), Guess::HIGH_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\DateTime':
                return new TypeGuess('datetime', array('input' => 'string'), Guess::HIGH_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\Email':
                return new TypeGuess('email', array(), Guess::HIGH_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\File':
            case 'Symfony\Component\Validator\Constraints\Image':
                return new TypeGuess('file', array(), Guess::HIGH_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\Language':
                return new TypeGuess('language', array(), Guess::HIGH_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\Locale':
                return new TypeGuess('locale', array(), Guess::HIGH_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\Time':
                return new TypeGuess('time', array('input' => 'string'), Guess::HIGH_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\Url':
                return new TypeGuess('url', array(), Guess::HIGH_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\Ip':
                return new TypeGuess('text', array(), Guess::MEDIUM_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\Length':
            case 'Symfony\Component\Validator\Constraints\Regex':
                return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\Range':
                return new TypeGuess('number', array(), Guess::LOW_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\Count':
                return new TypeGuess('collection', array(), Guess::LOW_CONFIDENCE);

            case 'Symfony\Component\Validator\Constraints\True':
            case 'Symfony\Component\Validator\Constraints\False':
                return new TypeGuess('checkbox', array(), Guess::MEDIUM_CONFIDENCE);
        }

        return null;
    }

    /**
     * Guesses whether a field is required based on the given constraint
     *
     * @param Constraint $constraint The constraint to guess for
     *
     * @return ValueGuess|null The guess whether the field is required
     */
    public function guessRequiredForConstraint(Constraint $constraint)
    {
        switch (get_class($constraint)) {
            case 'Symfony\Component\Validator\Constraints\NotNull':
            case 'Symfony\Component\Validator\Constraints\NotBlank':
            case 'Symfony\Component\Validator\Constraints\True':
                return new ValueGuess(true, Guess::HIGH_CONFIDENCE);
        }

        return null;
    }

    /**
     * Guesses a field's maximum length based on the given constraint
     *
     * @param Constraint $constraint The constraint to guess for
     *
     * @return ValueGuess|null The guess for the maximum length
     */
    public function guessMaxLengthForConstraint(Constraint $constraint)
    {
        switch (get_class($constraint)) {
            case 'Symfony\Component\Validator\Constraints\Length':
                if (is_numeric($constraint->max)) {
                    return new ValueGuess($constraint->max, Guess::HIGH_CONFIDENCE);
                }
                break;

            case 'Symfony\Component\Validator\Constraints\Type':
                if (in_array($constraint->type, array('double', 'float', 'numeric', 'real'))) {
                        return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
                }
                break;

            case 'Symfony\Component\Validator\Constraints\Range':
                if (is_numeric($constraint->max)) {
                    return new ValueGuess(strlen((string) $constraint->max), Guess::LOW_CONFIDENCE);
                }
                break;
        }

        return null;
    }

    /**
     * Guesses a field's pattern based on the given constraint
     *
     * @param Constraint $constraint The constraint to guess for
     *
     * @return ValueGuess|null The guess for the pattern
     */
    public function guessPatternForConstraint(Constraint $constraint)
    {
        switch (get_class($constraint)) {
            case 'Symfony\Component\Validator\Constraints\Length':
                if (is_numeric($constraint->min)) {
                    return new ValueGuess(sprintf('.{%s,}', (string) $constraint->min), Guess::LOW_CONFIDENCE);
                }
                break;

            case 'Symfony\Component\Validator\Constraints\Regex':
                $htmlPattern = $constraint->getHtmlPattern();

                if (null !== $htmlPattern) {
                    return new ValueGuess($htmlPattern, Guess::HIGH_CONFIDENCE);
                }
                break;

            case 'Symfony\Component\Validator\Constraints\Range':
                if (is_numeric($constraint->min)) {
                    return new ValueGuess(sprintf('.{%s,}', strlen((string) $constraint->min)), Guess::LOW_CONFIDENCE);
                }
                break;

            case 'Symfony\Component\Validator\Constraints\Type':
                if (in_array($constraint->type, array('double', 'float', 'numeric', 'real'))) {
                    return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
                }
                break;
        }

        return null;
    }

    /**
     * Iterates over the constraints of a property, executes a constraints on
     * them and returns the best guess
     *
     * @param string   $class        The class to read the constraints from
     * @param string   $property     The property for which to find constraints
     * @param \Closure $closure      The closure that returns a guess
     *                               for a given constraint
     * @param mixed    $defaultValue The default value assumed if no other value
     *                               can be guessed.
     *
     * @return Guess|null The guessed value with the highest confidence
     */
    protected function guess($class, $property, \Closure $closure, $defaultValue = null)
    {
        $guesses = array();
        $classMetadata = $this->metadataFactory->getMetadataFor($class);

        if ($classMetadata->hasMemberMetadatas($property)) {
            $memberMetadatas = $classMetadata->getMemberMetadatas($property);

            foreach ($memberMetadatas as $memberMetadata) {
                $constraints = $memberMetadata->getConstraints();

                foreach ($constraints as $constraint) {
                    if ($guess = $closure($constraint)) {
                        $guesses[] = $guess;
                    }
                }
            }

            if (null !== $defaultValue) {
                $guesses[] = new ValueGuess($defaultValue, Guess::LOW_CONFIDENCE);
            }
        }

        return Guess::getBestGuess($guesses);
    }
}
PKC`�\eBR�	�	Spear/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\Type;

use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationMapper;
use Symfony\Component\Form\Extension\Validator\EventListener\ValidationListener;
use Symfony\Component\Validator\ValidatorInterface;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormTypeValidatorExtension extends BaseValidatorExtension
{
    /**
     * @var ValidatorInterface
     */
    private $validator;

    /**
     * @var ViolationMapper
     */
    private $violationMapper;

    public function __construct(ValidatorInterface $validator)
    {
        $this->validator = $validator;
        $this->violationMapper = new ViolationMapper();
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventSubscriber(new ValidationListener($this->validator, $this->violationMapper));
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        parent::setDefaultOptions($resolver);

        // Constraint should always be converted to an array
        $constraintsNormalizer = function (Options $options, $constraints) {
            return is_object($constraints) ? array($constraints) : (array) $constraints;
        };

        $resolver->setDefaults(array(
            'error_mapping'              => array(),
            'constraints'                => array(),
            'cascade_validation'         => false,
            'invalid_message'            => 'This value is not valid.',
            'invalid_message_parameters' => array(),
            'extra_fields_message'       => 'This form should not contain extra fields.',
            'post_max_size_message'      => 'The uploaded file was too large. Please try to upload a smaller file.',
        ));

        $resolver->setNormalizers(array(
            'constraints'       => $constraintsNormalizer,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return 'form';
    }
}
PKC`�\1���Upear/Symfony/Component/Form/Extension/Validator/Type/SubmitTypeValidatorExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\Type;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class SubmitTypeValidatorExtension extends BaseValidatorExtension
{
    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return 'submit';
    }
}
PKD`�\͚>�@@Wpear/Symfony/Component/Form/Extension/Validator/Type/RepeatedTypeValidatorExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\Type;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class RepeatedTypeValidatorExtension extends AbstractTypeExtension
{
    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        // Map errors to the first field
        $errorMapping = function (Options $options) {
            return array('.' => $options['first_name']);
        };

        $resolver->setDefaults(array(
            'error_mapping' => $errorMapping,
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return 'repeated';
    }
}
PKD`�\�����Opear/Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\Type;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * Encapsulates common logic of {@link FormTypeValidatorExtension} and
 * {@link SubmitTypeValidatorExtension}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class BaseValidatorExtension extends AbstractTypeExtension
{
    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        // Make sure that validation groups end up as null, closure or array
        $validationGroupsNormalizer = function (Options $options, $groups) {
            if (false === $groups) {
                return array();
            }

            if (empty($groups)) {
                return null;
            }

            if (is_callable($groups)) {
                return $groups;
            }

            return (array) $groups;
        };

        $resolver->setDefaults(array(
            'validation_groups' => null,
        ));

        $resolver->setNormalizers(array(
            'validation_groups' => $validationGroupsNormalizer,
        ));
    }
}
PKD`�\�-�P��Mpear/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\Constraints;

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Extension\Validator\Util\ServerParams;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormValidator extends ConstraintValidator
{
    /**
     * @var ServerParams
     */
    private $serverParams;

    /**
     * Creates a validator with the given server parameters.
     *
     * @param ServerParams $params The server parameters. Default
     *                             parameters are created if null.
     */
    public function __construct(ServerParams $params = null)
    {
        $this->serverParams = $params ?: new ServerParams();
    }

    /**
     * {@inheritdoc}
     */
    public function validate($form, Constraint $constraint)
    {
        if (!$form instanceof FormInterface) {
            return;
        }

        /* @var FormInterface $form */
        $config = $form->getConfig();

        if ($form->isSynchronized()) {
            // Validate the form data only if transformation succeeded
            $groups = self::getValidationGroups($form);

            // Validate the data against its own constraints
            if (self::allowDataWalking($form)) {
                foreach ($groups as $group) {
                    $this->context->validate($form->getData(), 'data', $group, true);
                }
            }

            // Validate the data against the constraints defined
            // in the form
            $constraints = $config->getOption('constraints');
            foreach ($constraints as $constraint) {
                foreach ($groups as $group) {
                    if (in_array($group, $constraint->groups)) {
                        $this->context->validateValue($form->getData(), $constraint, 'data', $group);

                        // Prevent duplicate validation
                        continue 2;
                    }
                }
            }
        } else {
            $childrenSynchronized = true;

            foreach ($form as $child) {
                if (!$child->isSynchronized()) {
                    $childrenSynchronized = false;
                    break;
                }
            }

            // Mark the form with an error if it is not synchronized BUT all
            // of its children are synchronized. If any child is not
            // synchronized, an error is displayed there already and showing
            // a second error in its parent form is pointless, or worse, may
            // lead to duplicate errors if error bubbling is enabled on the
            // child.
            // See also https://github.com/symfony/symfony/issues/4359
            if ($childrenSynchronized) {
                $clientDataAsString = is_scalar($form->getViewData())
                    ? (string) $form->getViewData()
                    : gettype($form->getViewData());

                $this->context->addViolation(
                    $config->getOption('invalid_message'),
                    array_replace(array('{{ value }}' => $clientDataAsString), $config->getOption('invalid_message_parameters')),
                    $form->getViewData(),
                    null,
                    Form::ERR_INVALID
                );
            }
        }

        // Mark the form with an error if it contains extra fields
        if (count($form->getExtraData()) > 0) {
            $this->context->addViolation(
                $config->getOption('extra_fields_message'),
                array('{{ extra_fields }}' => implode('", "', array_keys($form->getExtraData()))),
                $form->getExtraData()
            );
        }

        // Mark the form with an error if the uploaded size was too large
        $length = $this->serverParams->getContentLength();

        if ($form->isRoot() && null !== $length) {
            $max = $this->serverParams->getPostMaxSize();

            if (!empty($max) && $length > $max) {
                $this->context->addViolation(
                    $config->getOption('post_max_size_message'),
                    array('{{ max }}' => $this->serverParams->getNormalizedIniPostMaxSize()),
                    $length
                );
            }
        }
    }

    /**
     * Returns whether the data of a form may be walked.
     *
     * @param  FormInterface $form The form to test.
     *
     * @return Boolean Whether the graph walker may walk the data.
     */
    private static function allowDataWalking(FormInterface $form)
    {
        $data = $form->getData();

        // Scalar values cannot have mapped constraints
        if (!is_object($data) && !is_array($data)) {
            return false;
        }

        // Root forms are always validated
        if ($form->isRoot()) {
            return true;
        }

        // Non-root forms are validated if validation cascading
        // is enabled in all ancestor forms
        while (null !== ($form = $form->getParent())) {
            if (!$form->getConfig()->getOption('cascade_validation')) {
                return false;
            }
        }

        return true;
    }

    /**
     * Returns the validation groups of the given form.
     *
     * @param  FormInterface $form The form.
     *
     * @return array The validation groups.
     */
    private static function getValidationGroups(FormInterface $form)
    {
        // Determine the clicked button of the complete form tree
        $clickedButton = null;

        if (method_exists($form, 'getClickedButton')) {
            $clickedButton = $form->getClickedButton();
        }

        if (null !== $clickedButton) {
            $groups = $clickedButton->getConfig()->getOption('validation_groups');

            if (null !== $groups) {
                return self::resolveValidationGroups($groups, $form);
            }
        }

        do {
            $groups = $form->getConfig()->getOption('validation_groups');

            if (null !== $groups) {
                return self::resolveValidationGroups($groups, $form);
            }

            $form = $form->getParent();
        } while (null !== $form);

        return array(Constraint::DEFAULT_GROUP);
    }

    /**
     * Post-processes the validation groups option for a given form.
     *
     * @param array|callable $groups The validation groups.
     * @param FormInterface  $form   The validated form.
     *
     * @return array The validation groups.
     */
    private static function resolveValidationGroups($groups, FormInterface $form)
    {
        if (!is_string($groups) && is_callable($groups)) {
            $groups = call_user_func($groups, $form);
        }

        return (array) $groups;
    }
}
PKE`�\}>�ُ�Dpear/Symfony/Component/Form/Extension/Validator/Constraints/Form.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class Form extends Constraint
{
    /**
     * Violation code marking an invalid form.
     */
    const ERR_INVALID = 1;

    /**
     * {@inheritdoc}
     */
    public function getTargets()
    {
        return self::CLASS_CONSTRAINT;
    }
}
PKE`�\���*��Tpear/Symfony/Component/Form/Extension/Validator/EventListener/ValidationListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationMapperInterface;
use Symfony\Component\Validator\ValidatorInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Validator\Constraints\Form;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ValidationListener implements EventSubscriberInterface
{
    private $validator;

    private $violationMapper;

    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents()
    {
        return array(FormEvents::POST_SUBMIT => 'validateForm');
    }

    public function __construct(ValidatorInterface $validator, ViolationMapperInterface $violationMapper)
    {
        $this->validator = $validator;
        $this->violationMapper = $violationMapper;
    }

    /**
     * Validates the form and its domain object.
     *
     * @param FormEvent $event The event object
     */
    public function validateForm(FormEvent $event)
    {
        $form = $event->getForm();

        if ($form->isRoot()) {
            // Validate the form in group "Default"
            $violations = $this->validator->validate($form);

            foreach ($violations as $violation) {
                // Allow the "invalid" constraint to be put onto
                // non-synchronized forms
                $allowNonSynchronized = Form::ERR_INVALID === $violation->getCode();

                $this->violationMapper->mapViolation($violation, $form, $allowNonSynchronized);
            }
        }
    }
}
PKF`�\2=[<((Fpear/Symfony/Component/Form/Extension/Validator/ValidatorExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Extension\Validator;

use Symfony\Component\Form\Extension\Validator\Constraints\Form;
use Symfony\Component\Form\AbstractExtension;
use Symfony\Component\Validator\ValidatorInterface;
use Symfony\Component\Validator\Constraints\Valid;

/**
 * Extension supporting the Symfony2 Validator component in forms.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ValidatorExtension extends AbstractExtension
{
    private $validator;

    public function __construct(ValidatorInterface $validator)
    {
        $this->validator = $validator;

        // Register the form constraints in the validator programmatically.
        // This functionality is required when using the Form component without
        // the DIC, where the XML file is loaded automatically. Thus the following
        // code must be kept synchronized with validation.xml

        /** @var \Symfony\Component\Validator\Mapping\ClassMetadata $metadata */
        $metadata = $this->validator->getMetadataFactory()->getMetadataFor('Symfony\Component\Form\Form');
        $metadata->addConstraint(new Form());
        $metadata->addPropertyConstraint('children', new Valid());
    }

    public function loadTypeGuesser()
    {
        return new ValidatorTypeGuesser($this->validator->getMetadataFactory());
    }

    protected function loadTypeExtensions()
    {
        return array(
            new Type\FormTypeValidatorExtension($this->validator),
            new Type\RepeatedTypeValidatorExtension(),
            new Type\SubmitTypeValidatorExtension(),
        );
    }
}
PKF`�\4�Nz"z"&pear/Symfony/Component/Form/Button.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\AlreadySubmittedException;
use Symfony\Component\Form\Exception\BadMethodCallException;

/**
 * A form button.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class Button implements \IteratorAggregate, FormInterface
{
    /**
     * @var FormInterface|null
     */
    private $parent;

    /**
     * @var FormConfigInterface
     */
    private $config;

    /**
     * @var Boolean
     */
    private $submitted = false;

    /**
     * Creates a new button from a form configuration.
     *
     * @param FormConfigInterface $config The button's configuration.
     */
    public function __construct(FormConfigInterface $config)
    {
        $this->config = $config;
    }

    /**
     * Unsupported method.
     *
     * @param mixed $offset
     *
     * @return Boolean Always returns false.
     */
    public function offsetExists($offset)
    {
        return false;
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param mixed $offset
     *
     * @throws BadMethodCallException
     */
    public function offsetGet($offset)
    {
        throw new BadMethodCallException('Buttons cannot have children.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param mixed $offset
     * @param mixed $value
     *
     * @throws BadMethodCallException
     */
    public function offsetSet($offset, $value)
    {
        throw new BadMethodCallException('Buttons cannot have children.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param mixed $offset
     *
     * @throws BadMethodCallException
     */
    public function offsetUnset($offset)
    {
        throw new BadMethodCallException('Buttons cannot have children.');
    }

    /**
     * {@inheritdoc}
     */
    public function setParent(FormInterface $parent = null)
    {
        $this->parent = $parent;
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return $this->parent;
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param int|string|FormInterface $child
     * @param null                     $type
     * @param array                    $options
     *
     * @throws BadMethodCallException
     */
    public function add($child, $type = null, array $options = array())
    {
        throw new BadMethodCallException('Buttons cannot have children.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param string $name
     *
     * @throws BadMethodCallException
     */
    public function get($name)
    {
        throw new BadMethodCallException('Buttons cannot have children.');
    }

    /**
     * Unsupported method.
     *
     * @param string $name
     *
     * @return Boolean Always returns false.
     */
    public function has($name)
    {
        return false;
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param string $name
     *
     * @throws BadMethodCallException
     */
    public function remove($name)
    {
        throw new BadMethodCallException('Buttons cannot have children.');
    }

    /**
     * {@inheritdoc}
     */
    public function all()
    {
        return array();
    }

    /**
     * {@inheritdoc}
     */
    public function getErrors()
    {
        return array();
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param string $modelData
     *
     * @throws BadMethodCallException
     */
    public function setData($modelData)
    {
        // called during initialization of the form tree
        // noop
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getData()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getNormData()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getViewData()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return array Always returns an empty array.
     */
    public function getExtraData()
    {
        return array();
    }

    /**
     * Returns the button's configuration.
     *
     * @return FormConfigInterface The configuration.
     */
    public function getConfig()
    {
        return $this->config;
    }

    /**
     * Returns whether the button is submitted.
     *
     * @return Boolean true if the button was submitted.
     */
    public function isSubmitted()
    {
        return $this->submitted;
    }

    /**
     * Returns the name by which the button is identified in forms.
     *
     * @return string The name of the button.
     */
    public function getName()
    {
        return $this->config->getName();
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getPropertyPath()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @param FormError $error
     *
     * @throws BadMethodCallException
     */
    public function addError(FormError $error)
    {
        throw new BadMethodCallException('Buttons cannot have errors.');
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns true.
     */
    public function isValid()
    {
        return true;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns false.
     */
    public function isRequired()
    {
        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function isDisabled()
    {
        return $this->config->getDisabled();
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns true.
     */
    public function isEmpty()
    {
        return true;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns true.
     */
    public function isSynchronized()
    {
        return true;
    }

    /**
     * Unsupported method.
     *
     * @throws BadMethodCallException
     */
    public function initialize()
    {
        throw new BadMethodCallException('Buttons cannot be initialized. Call initialize() on the root form instead.');
    }

    /**
     * Unsupported method.
     *
     * @param mixed $request
     *
     * @throws BadMethodCallException
     */
    public function handleRequest($request = null)
    {
        throw new BadMethodCallException('Buttons cannot handle requests. Call handleRequest() on the root form instead.');
    }

    /**
     * Submits data to the button.
     *
     * @param null|string $submittedData The data.
     * @param Boolean     $clearMissing  Not used.
     *
     * @return Button The button instance
     *
     * @throws Exception\AlreadySubmittedException If the button has already been submitted.
     */
    public function submit($submittedData, $clearMissing = true)
    {
        if ($this->submitted) {
            throw new AlreadySubmittedException('A form can only be submitted once');
        }

        $this->submitted = true;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getRoot()
    {
        return $this->parent ? $this->parent->getRoot() : $this;
    }

    /**
     * {@inheritdoc}
     */
    public function isRoot()
    {
        return null === $this->parent;
    }

    /**
     * {@inheritdoc}
     */
    public function createView(FormView $parent = null)
    {
        if (null === $parent && $this->parent) {
            $parent = $this->parent->createView();
        }

        $type = $this->config->getType();
        $options = $this->config->getOptions();

        $view = $type->createView($this, $parent);

        $type->buildView($view, $this, $options);
        $type->finishView($view, $this, $options);

        return $view;
    }

    /**
     * Unsupported method.
     *
     * @return integer Always returns 0.
     */
    public function count()
    {
        return 0;
    }

    /**
     * Unsupported method.
     *
     * @return \EmptyIterator Always returns an empty iterator.
     */
    public function getIterator()
    {
        return new \EmptyIterator();
    }
}
PKG`�\&�"̰T�T1pear/Symfony/Component/Form/FormConfigBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\BadMethodCallException;
use Symfony\Component\Form\Exception\InvalidArgumentException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\PropertyAccess\PropertyPath;
use Symfony\Component\PropertyAccess\PropertyPathInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\ImmutableEventDispatcher;

/**
 * A basic form configuration.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormConfigBuilder implements FormConfigBuilderInterface
{
    /**
     * Caches a globally unique {@link NativeRequestHandler} instance.
     *
     * @var NativeRequestHandler
     */
    private static $nativeRequestProcessor;

    /**
     * The accepted request methods.
     *
     * @var array
     */
    private static $allowedMethods = array(
        'GET',
        'PUT',
        'POST',
        'DELETE',
        'PATCH'
    );

    /**
     * @var Boolean
     */
    protected $locked = false;

    /**
     * @var EventDispatcherInterface
     */
    private $dispatcher;

    /**
     * @var string
     */
    private $name;

    /**
     * @var PropertyPathInterface
     */
    private $propertyPath;

    /**
     * @var Boolean
     */
    private $mapped = true;

    /**
     * @var Boolean
     */
    private $byReference = true;

    /**
     * @var Boolean
     */
    private $inheritData = false;

    /**
     * @var Boolean
     */
    private $compound = false;

    /**
     * @var ResolvedFormTypeInterface
     */
    private $type;

    /**
     * @var array
     */
    private $viewTransformers = array();

    /**
     * @var array
     */
    private $modelTransformers = array();

    /**
     * @var DataMapperInterface
     */
    private $dataMapper;

    /**
     * @var Boolean
     */
    private $required = true;

    /**
     * @var Boolean
     */
    private $disabled = false;

    /**
     * @var Boolean
     */
    private $errorBubbling = false;

    /**
     * @var mixed
     */
    private $emptyData;

    /**
     * @var array
     */
    private $attributes = array();

    /**
     * @var mixed
     */
    private $data;

    /**
     * @var string
     */
    private $dataClass;

    /**
     * @var Boolean
     */
    private $dataLocked;

    /**
     * @var FormFactoryInterface
     */
    private $formFactory;

    /**
     * @var string
     */
    private $action;

    /**
     * @var string
     */
    private $method = 'POST';

    /**
     * @var RequestHandlerInterface
     */
    private $requestHandler;

    /**
     * @var Boolean
     */
    private $autoInitialize = false;

    /**
     * @var array
     */
    private $options;

    /**
     * Creates an empty form configuration.
     *
     * @param string|integer           $name       The form name
     * @param string                   $dataClass  The class of the form's data
     * @param EventDispatcherInterface $dispatcher The event dispatcher
     * @param array                    $options    The form options
     *
     * @throws InvalidArgumentException If the data class is not a valid class or if
     *                                   the name contains invalid characters.
     */
    public function __construct($name, $dataClass, EventDispatcherInterface $dispatcher, array $options = array())
    {
        self::validateName($name);

        if (null !== $dataClass && !class_exists($dataClass)) {
            throw new InvalidArgumentException(sprintf('The data class "%s" is not a valid class.', $dataClass));
        }

        $this->name = (string) $name;
        $this->dataClass = $dataClass;
        $this->dispatcher = $dispatcher;
        $this->options = $options;
    }

    /**
     * {@inheritdoc}
     */
    public function addEventListener($eventName, $listener, $priority = 0)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->dispatcher->addListener($eventName, $listener, $priority);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addEventSubscriber(EventSubscriberInterface $subscriber)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->dispatcher->addSubscriber($subscriber);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addViewTransformer(DataTransformerInterface $viewTransformer, $forcePrepend = false)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        if ($forcePrepend) {
            array_unshift($this->viewTransformers, $viewTransformer);
        } else {
            $this->viewTransformers[] = $viewTransformer;
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function resetViewTransformers()
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->viewTransformers = array();

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addModelTransformer(DataTransformerInterface $modelTransformer, $forceAppend = false)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        if ($forceAppend) {
            $this->modelTransformers[] = $modelTransformer;
        } else {
            array_unshift($this->modelTransformers, $modelTransformer);
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function resetModelTransformers()
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->modelTransformers = array();

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getEventDispatcher()
    {
        if ($this->locked && !$this->dispatcher instanceof ImmutableEventDispatcher) {
            $this->dispatcher = new ImmutableEventDispatcher($this->dispatcher);
        }

        return $this->dispatcher;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * {@inheritdoc}
     */
    public function getPropertyPath()
    {
        return $this->propertyPath;
    }

    /**
     * {@inheritdoc}
     */
    public function getMapped()
    {
        return $this->mapped;
    }

    /**
     * {@inheritdoc}
     */
    public function getByReference()
    {
        return $this->byReference;
    }

    /**
     * {@inheritdoc}
     */
    public function getInheritData()
    {
        return $this->inheritData;
    }

    /**
     * Alias of {@link getInheritData()}.
     *
     * @return FormConfigBuilder The configuration object.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link getInheritData()} instead.
     */
    public function getVirtual()
    {
        // Uncomment this as soon as the deprecation note should be shown
        // trigger_error('getVirtual() is deprecated since version 2.3 and will be removed in 3.0. Use getInheritData() instead.', E_USER_DEPRECATED);
        return $this->getInheritData();
    }

    /**
     * {@inheritdoc}
     */
    public function getCompound()
    {
        return $this->compound;
    }

    /**
     * {@inheritdoc}
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * {@inheritdoc}
     */
    public function getViewTransformers()
    {
        return $this->viewTransformers;
    }

    /**
     * {@inheritdoc}
     */
    public function getModelTransformers()
    {
        return $this->modelTransformers;
    }

    /**
     * {@inheritdoc}
     */
    public function getDataMapper()
    {
        return $this->dataMapper;
    }

    /**
     * {@inheritdoc}
     */
    public function getRequired()
    {
        return $this->required;
    }

    /**
     * {@inheritdoc}
     */
    public function getDisabled()
    {
        return $this->disabled;
    }

    /**
     * {@inheritdoc}
     */
    public function getErrorBubbling()
    {
        return $this->errorBubbling;
    }

    /**
     * {@inheritdoc}
     */
    public function getEmptyData()
    {
        return $this->emptyData;
    }

    /**
     * {@inheritdoc}
     */
    public function getAttributes()
    {
        return $this->attributes;
    }

    /**
     * {@inheritdoc}
     */
    public function hasAttribute($name)
    {
        return array_key_exists($name, $this->attributes);
    }

    /**
     * {@inheritdoc}
     */
    public function getAttribute($name, $default = null)
    {
        return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default;
    }

    /**
     * {@inheritdoc}
     */
    public function getData()
    {
        return $this->data;
    }

    /**
     * {@inheritdoc}
     */
    public function getDataClass()
    {
        return $this->dataClass;
    }

    /**
     * {@inheritdoc}
     */
    public function getDataLocked()
    {
        return $this->dataLocked;
    }

    /**
     * {@inheritdoc}
     */
    public function getFormFactory()
    {
        return $this->formFactory;
    }

    /**
     * {@inheritdoc}
     */
    public function getAction()
    {
        return $this->action;
    }

    /**
     * {@inheritdoc}
     */
    public function getMethod()
    {
        return $this->method;
    }

    /**
     * {@inheritdoc}
     */
    public function getRequestHandler()
    {
        if (null === $this->requestHandler) {
            if (null === self::$nativeRequestProcessor) {
                self::$nativeRequestProcessor = new NativeRequestHandler();
            }
            $this->requestHandler = self::$nativeRequestProcessor;
        }

        return $this->requestHandler;
    }

    /**
     * {@inheritdoc}
     */
    public function getAutoInitialize()
    {
        return $this->autoInitialize;
    }

    /**
     * {@inheritdoc}
     */
    public function getOptions()
    {
        return $this->options;
    }

    /**
     * {@inheritdoc}
     */
    public function hasOption($name)
    {
        return array_key_exists($name, $this->options);
    }

    /**
     * {@inheritdoc}
     */
    public function getOption($name, $default = null)
    {
        return array_key_exists($name, $this->options) ? $this->options[$name] : $default;
    }

    /**
     * {@inheritdoc}
     */
    public function setAttribute($name, $value)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->attributes[$name] = $value;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setAttributes(array $attributes)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->attributes = $attributes;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setDataMapper(DataMapperInterface $dataMapper = null)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->dataMapper = $dataMapper;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setDisabled($disabled)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->disabled = (Boolean) $disabled;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setEmptyData($emptyData)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->emptyData = $emptyData;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setErrorBubbling($errorBubbling)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->errorBubbling = null === $errorBubbling ? null : (Boolean) $errorBubbling;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setRequired($required)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->required = (Boolean) $required;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setPropertyPath($propertyPath)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        if (null !== $propertyPath && !$propertyPath instanceof PropertyPathInterface) {
            $propertyPath = new PropertyPath($propertyPath);
        }

        $this->propertyPath = $propertyPath;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setMapped($mapped)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->mapped = $mapped;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setByReference($byReference)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->byReference = $byReference;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setInheritData($inheritData)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->inheritData = $inheritData;

        return $this;
    }

    /**
     * Alias of {@link setInheritData()}.
     *
     * @param Boolean $inheritData Whether the form should inherit its parent's data.
     *
     * @return FormConfigBuilder The configuration object.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link setInheritData()} instead.
     */
    public function setVirtual($inheritData)
    {
        // Uncomment this as soon as the deprecation note should be shown
        // trigger_error('setVirtual() is deprecated since version 2.3 and will be removed in 3.0. Use setInheritData() instead.', E_USER_DEPRECATED);

        $this->setInheritData($inheritData);
    }

    /**
     * {@inheritdoc}
     */
    public function setCompound($compound)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->compound = $compound;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setType(ResolvedFormTypeInterface $type)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->type = $type;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setData($data)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->data = $data;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setDataLocked($locked)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->dataLocked = $locked;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setFormFactory(FormFactoryInterface $formFactory)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->formFactory = $formFactory;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setAction($action)
    {
        if ($this->locked) {
            throw new BadMethodCallException('The config builder cannot be modified anymore.');
        }

        $this->action = $action;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setMethod($method)
    {
        if ($this->locked) {
            throw new BadMethodCallException('The config builder cannot be modified anymore.');
        }

        $upperCaseMethod = strtoupper($method);

        if (!in_array($upperCaseMethod, self::$allowedMethods)) {
            throw new InvalidArgumentException(sprintf(
                'The form method is "%s", but should be one of "%s".',
                $method,
                implode('", "', self::$allowedMethods)
            ));
        }

        $this->method = $upperCaseMethod;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setRequestHandler(RequestHandlerInterface $requestHandler)
    {
        if ($this->locked) {
            throw new BadMethodCallException('The config builder cannot be modified anymore.');
        }

        $this->requestHandler = $requestHandler;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setAutoInitialize($initialize)
    {
        $this->autoInitialize = (Boolean) $initialize;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getFormConfig()
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        // This method should be idempotent, so clone the builder
        $config = clone $this;
        $config->locked = true;

        return $config;
    }

    /**
     * Validates whether the given variable is a valid form name.
     *
     * @param string|integer $name The tested form name.
     *
     * @throws UnexpectedTypeException   If the name is not a string or an integer.
     * @throws InvalidArgumentException If the name contains invalid characters.
     */
    public static function validateName($name)
    {
        if (null !== $name && !is_string($name) && !is_int($name)) {
            throw new UnexpectedTypeException($name, 'string, integer or null');
        }

        if (!self::isValidName($name)) {
            throw new InvalidArgumentException(sprintf(
                'The name "%s" contains illegal characters. Names should start with a letter, digit or underscore and only contain letters, digits, numbers, underscores ("_"), hyphens ("-") and colons (":").',
                $name
            ));
        }
    }

    /**
     * Returns whether the given variable contains a valid form name.
     *
     * A name is accepted if it
     *
     *   * is empty
     *   * starts with a letter, digit or underscore
     *   * contains only letters, digits, numbers, underscores ("_"),
     *     hyphens ("-") and colons (":")
     *
     * @param string $name The tested form name.
     *
     * @return Boolean Whether the name is valid.
     */
    public static function isValidName($name)
    {
        return '' === $name || null === $name || preg_match('/^[a-zA-Z0-9_][a-zA-Z0-9_\-:]*$/D', $name);
    }
}
PKG`�\|G����9pear/Symfony/Component/Form/ResolvedFormTypeInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * A wrapper for a form type and its extensions.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ResolvedFormTypeInterface
{
    /**
     * Returns the name of the type.
     *
     * @return string The type name.
     */
    public function getName();

    /**
     * Returns the parent type.
     *
     * @return ResolvedFormTypeInterface|null The parent type or null.
     */
    public function getParent();

    /**
     * Returns the wrapped form type.
     *
     * @return FormTypeInterface The wrapped form type.
     */
    public function getInnerType();

    /**
     * Returns the extensions of the wrapped form type.
     *
     * @return FormTypeExtensionInterface[] An array of {@link FormTypeExtensionInterface} instances.
     */
    public function getTypeExtensions();

    /**
     * Creates a new form builder for this type.
     *
     * @param FormFactoryInterface $factory The form factory.
     * @param string               $name    The name for the builder.
     * @param array                $options The builder options.
     *
     * @return FormBuilderInterface The created form builder.
     */
    public function createBuilder(FormFactoryInterface $factory, $name, array $options = array());

    /**
     * Creates a new form view for a form of this type.
     *
     * @param FormInterface     $form   The form to create a view for.
     * @param FormView $parent The parent view or null.
     *
     * @return FormView The created form view.
     */
    public function createView(FormInterface $form, FormView $parent = null);

    /**
     * Configures a form builder for the type hierarchy.
     *
     * @param FormBuilderInterface $builder The builder to configure.
     * @param array                $options The options used for the configuration.
     */
    public function buildForm(FormBuilderInterface $builder, array $options);

    /**
     * Configures a form view for the type hierarchy.
     *
     * It is called before the children of the view are built.
     *
     * @param FormView      $view    The form view to configure.
     * @param FormInterface $form    The form corresponding to the view.
     * @param array         $options The options used for the configuration.
     */
    public function buildView(FormView $view, FormInterface $form, array $options);

    /**
     * Finishes a form view for the type hierarchy.
     *
     * It is called after the children of the view have been built.
     *
     * @param FormView      $view    The form view to configure.
     * @param FormInterface $form    The form corresponding to the view.
     * @param array         $options The options used for the configuration.
     */
    public function finishView(FormView $view, FormInterface $form, array $options);

    /**
     * Returns the configured options resolver used for this type.
     *
     * @return \Symfony\Component\OptionsResolver\OptionsResolverInterface The options resolver.
     */
    public function getOptionsResolver();
}
PKH`�\)��.�.,pear/Symfony/Component/Form/FormRenderer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\LogicException;
use Symfony\Component\Form\Exception\BadMethodCallException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderAdapter;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;

/**
 * Renders a form into HTML using a rendering engine.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormRenderer implements FormRendererInterface
{
    const CACHE_KEY_VAR = 'unique_block_prefix';

    /**
     * @var FormRendererEngineInterface
     */
    private $engine;

    /**
     * @var CsrfTokenManagerInterface
     */
    private $csrfTokenManager;

    /**
     * @var array
     */
    private $blockNameHierarchyMap = array();

    /**
     * @var array
     */
    private $hierarchyLevelMap = array();

    /**
     * @var array
     */
    private $variableStack = array();

    /**
     * Constructor.
     *
     * @param FormRendererEngineInterface    $engine
     * @param CsrfTokenManagerInterface|null $csrfTokenManager
     *
     * @throws UnexpectedTypeException
     */
    public function __construct(FormRendererEngineInterface $engine, $csrfTokenManager = null)
    {
        if ($csrfTokenManager instanceof CsrfProviderInterface) {
            $csrfTokenManager = new CsrfProviderAdapter($csrfTokenManager);
        } elseif (null !== $csrfTokenManager && !$csrfTokenManager instanceof CsrfTokenManagerInterface) {
            throw new UnexpectedTypeException($csrfTokenManager, 'CsrfProviderInterface or CsrfTokenManagerInterface or null');
        }

        $this->engine = $engine;
        $this->csrfTokenManager = $csrfTokenManager;
    }

    /**
     * {@inheritdoc}
     */
    public function getEngine()
    {
        return $this->engine;
    }

    /**
     * {@inheritdoc}
     */
    public function setTheme(FormView $view, $themes)
    {
        $this->engine->setTheme($view, $themes);
    }

    /**
     * {@inheritdoc}
     */
    public function renderCsrfToken($tokenId)
    {
        if (null === $this->csrfTokenManager) {
            throw new BadMethodCallException('CSRF tokens can only be generated if a CsrfTokenManagerInterface is injected in FormRenderer::__construct().');
        }

        return $this->csrfTokenManager->getToken($tokenId)->getValue();
    }

    /**
     * {@inheritdoc}
     */
    public function renderBlock(FormView $view, $blockName, array $variables = array())
    {
        $resource = $this->engine->getResourceForBlockName($view, $blockName);

        if (!$resource) {
            throw new LogicException(sprintf('No block "%s" found while rendering the form.', $blockName));
        }

        $viewCacheKey = $view->vars[self::CACHE_KEY_VAR];

        // The variables are cached globally for a view (instead of for the
        // current suffix)
        if (!isset($this->variableStack[$viewCacheKey])) {
            $this->variableStack[$viewCacheKey] = array();

            // The default variable scope contains all view variables, merged with
            // the variables passed explicitly to the helper
            $scopeVariables = $view->vars;

            $varInit = true;
        } else {
            // Reuse the current scope and merge it with the explicitly passed variables
            $scopeVariables = end($this->variableStack[$viewCacheKey]);

            $varInit = false;
        }

        // Merge the passed with the existing attributes
        if (isset($variables['attr']) && isset($scopeVariables['attr'])) {
            $variables['attr'] = array_replace($scopeVariables['attr'], $variables['attr']);
        }

        // Merge the passed with the exist *label* attributes
        if (isset($variables['label_attr']) && isset($scopeVariables['label_attr'])) {
            $variables['label_attr'] = array_replace($scopeVariables['label_attr'], $variables['label_attr']);
        }

        // Do not use array_replace_recursive(), otherwise array variables
        // cannot be overwritten
        $variables = array_replace($scopeVariables, $variables);

        $this->variableStack[$viewCacheKey][] = $variables;

        // Do the rendering
        $html = $this->engine->renderBlock($view, $resource, $blockName, $variables);

        // Clear the stack
        array_pop($this->variableStack[$viewCacheKey]);

        if ($varInit) {
            unset($this->variableStack[$viewCacheKey]);
        }

        return $html;
    }

    /**
     * {@inheritdoc}
     */
    public function searchAndRenderBlock(FormView $view, $blockNameSuffix, array $variables = array())
    {
        $renderOnlyOnce = 'row' === $blockNameSuffix || 'widget' === $blockNameSuffix;

        if ($renderOnlyOnce && $view->isRendered()) {
            return '';
        }

        // The cache key for storing the variables and types
        $viewCacheKey = $view->vars[self::CACHE_KEY_VAR];
        $viewAndSuffixCacheKey = $viewCacheKey.$blockNameSuffix;

        // In templates, we have to deal with two kinds of block hierarchies:
        //
        //   +---------+          +---------+
        //   | Theme B | -------> | Theme A |
        //   +---------+          +---------+
        //
        //   form_widget -------> form_widget
        //       ^
        //       |
        //  choice_widget -----> choice_widget
        //
        // The first kind of hierarchy is the theme hierarchy. This allows to
        // override the block "choice_widget" from Theme A in the extending
        // Theme B. This kind of inheritance needs to be supported by the
        // template engine and, for example, offers "parent()" or similar
        // functions to fall back from the custom to the parent implementation.
        //
        // The second kind of hierarchy is the form type hierarchy. This allows
        // to implement a custom "choice_widget" block (no matter in which theme),
        // or to fallback to the block of the parent type, which would be
        // "form_widget" in this example (again, no matter in which theme).
        // If the designer wants to explicitly fallback to "form_widget" in his
        // custom "choice_widget", for example because he only wants to wrap
        // a <div> around the original implementation, he can simply call the
        // widget() function again to render the block for the parent type.
        //
        // The second kind is implemented in the following blocks.
        if (!isset($this->blockNameHierarchyMap[$viewAndSuffixCacheKey])) {
            // INITIAL CALL
            // Calculate the hierarchy of template blocks and start on
            // the bottom level of the hierarchy (= "_<id>_<section>" block)
            $blockNameHierarchy = array();
            foreach ($view->vars['block_prefixes'] as $blockNamePrefix) {
                $blockNameHierarchy[] = $blockNamePrefix.'_'.$blockNameSuffix;
            }
            $hierarchyLevel = count($blockNameHierarchy) - 1;

            $hierarchyInit = true;
        } else {
            // RECURSIVE CALL
            // If a block recursively calls searchAndRenderBlock() again, resume rendering
            // using the parent type in the hierarchy.
            $blockNameHierarchy = $this->blockNameHierarchyMap[$viewAndSuffixCacheKey];
            $hierarchyLevel = $this->hierarchyLevelMap[$viewAndSuffixCacheKey] - 1;

            $hierarchyInit = false;
        }

        // The variables are cached globally for a view (instead of for the
        // current suffix)
        if (!isset($this->variableStack[$viewCacheKey])) {
            $this->variableStack[$viewCacheKey] = array();

            // The default variable scope contains all view variables, merged with
            // the variables passed explicitly to the helper
            $scopeVariables = $view->vars;

            $varInit = true;
        } else {
            // Reuse the current scope and merge it with the explicitly passed variables
            $scopeVariables = end($this->variableStack[$viewCacheKey]);

            $varInit = false;
        }

        // Load the resource where this block can be found
        $resource = $this->engine->getResourceForBlockNameHierarchy($view, $blockNameHierarchy, $hierarchyLevel);

        // Update the current hierarchy level to the one at which the resource was
        // found. For example, if looking for "choice_widget", but only a resource
        // is found for its parent "form_widget", then the level is updated here
        // to the parent level.
        $hierarchyLevel = $this->engine->getResourceHierarchyLevel($view, $blockNameHierarchy, $hierarchyLevel);

        // The actually existing block name in $resource
        $blockName = $blockNameHierarchy[$hierarchyLevel];

        // Escape if no resource exists for this block
        if (!$resource) {
            throw new LogicException(sprintf(
                'Unable to render the form as none of the following blocks exist: "%s".',
                implode('", "', array_reverse($blockNameHierarchy))
            ));
        }

        // Merge the passed with the existing attributes
        if (isset($variables['attr']) && isset($scopeVariables['attr'])) {
            $variables['attr'] = array_replace($scopeVariables['attr'], $variables['attr']);
        }

        // Merge the passed with the exist *label* attributes
        if (isset($variables['label_attr']) && isset($scopeVariables['label_attr'])) {
            $variables['label_attr'] = array_replace($scopeVariables['label_attr'], $variables['label_attr']);
        }

        // Do not use array_replace_recursive(), otherwise array variables
        // cannot be overwritten
        $variables = array_replace($scopeVariables, $variables);

        // In order to make recursive calls possible, we need to store the block hierarchy,
        // the current level of the hierarchy and the variables so that this method can
        // resume rendering one level higher of the hierarchy when it is called recursively.
        //
        // We need to store these values in maps (associative arrays) because within a
        // call to widget() another call to widget() can be made, but for a different view
        // object. These nested calls should not override each other.
        $this->blockNameHierarchyMap[$viewAndSuffixCacheKey] = $blockNameHierarchy;
        $this->hierarchyLevelMap[$viewAndSuffixCacheKey] = $hierarchyLevel;

        // We also need to store the variables for the view so that we can render other
        // blocks for the same view using the same variables as in the outer block.
        $this->variableStack[$viewCacheKey][] = $variables;

        // Do the rendering
        $html = $this->engine->renderBlock($view, $resource, $blockName, $variables);

        // Clear the stack
        array_pop($this->variableStack[$viewCacheKey]);

        // Clear the caches if they were filled for the first time within
        // this function call
        if ($hierarchyInit) {
            unset($this->blockNameHierarchyMap[$viewAndSuffixCacheKey]);
            unset($this->hierarchyLevelMap[$viewAndSuffixCacheKey]);
        }

        if ($varInit) {
            unset($this->variableStack[$viewCacheKey]);
        }

        if ($renderOnlyOnce) {
            $view->setRendered();
        }

        return $html;
    }

    /**
     * {@inheritdoc}
     */
    public function humanize($text)
    {
        return ucfirst(trim(strtolower(preg_replace(array('/([A-Z])/', '/[_\s]+/'), array('_$1', ' '), $text))));
    }
}
PKH`�\�z5���7pear/Symfony/Component/Form/ResolvedFormTypeFactory.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ResolvedFormTypeFactory implements ResolvedFormTypeFactoryInterface
{
    /**
     * {@inheritdoc}
     */
    public function createResolvedType(FormTypeInterface $type, array $typeExtensions, ResolvedFormTypeInterface $parent = null)
    {
        return new ResolvedFormType($type, $typeExtensions, $parent);
    }
}
PKH`�\�h��'';pear/Symfony/Component/Form/Util/OrderedHashMapIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Util;

/**
 * Iterator for {@link OrderedHashMap} objects.
 *
 * This class is internal and should not be used.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @since 2.2.6
 */
class OrderedHashMapIterator implements \Iterator
{
    /**
     * @var array
     */
    private $elements;

    /**
     * @var array
     */
    private $orderedKeys;

    /**
     * @var integer
     */
    private $cursor;

    /**
     * @var integer
     */
    private $cursorId;

    /**
     * @var array
     */
    private $managedCursors;

    /**
     * @var string|integer|null
     */
    private $key;

    /**
     * @var mixed
     */
    private $current;

    /**
     * Creates a new iterator.
     *
     * @param array $elements       The elements of the map, indexed by their
     *                              keys.
     * @param array $orderedKeys    The keys of the map in the order in which
     *                              they should be iterated.
     * @param array $managedCursors An array from which to reference the
     *                              iterator's cursor as long as it is alive.
     *                              This array is managed by the corresponding
     *                              {@link OrderedHashMap} instance to support
     *                              recognizing the deletion of elements.
     *
     * @since 2.2.6
     */
    public function __construct(array &$elements, array &$orderedKeys, array &$managedCursors)
    {
        $this->elements = &$elements;
        $this->orderedKeys = &$orderedKeys;
        $this->managedCursors = &$managedCursors;
        $this->cursorId = count($managedCursors);

        $this->managedCursors[$this->cursorId] = &$this->cursor;
    }

    /**
     * Removes the iterator's cursors from the managed cursors of the
     * corresponding {@link OrderedHashMap} instance.
     *
     * @since 2.2.6
     */
    public function __destruct()
    {
        // Use array_splice() instead of isset() to prevent holes in the
        // array indices, which would break the initialization of $cursorId
        array_splice($this->managedCursors, $this->cursorId, 1);
    }

    /**
     *{@inheritdoc}
     *
     * @since 2.2.6
     */
    public function current()
    {
        return $this->current;
    }

    /**
     * {@inheritdoc}
     *
     * @since 2.2.6
     */
    public function next()
    {
        ++$this->cursor;

        if (isset($this->orderedKeys[$this->cursor])) {
            $this->key = $this->orderedKeys[$this->cursor];
            $this->current = $this->elements[$this->key];
        } else {
            $this->key = null;
            $this->current = null;
        }
    }

    /**
     *{@inheritdoc}
     *
     * @since 2.2.6
     */
    public function key()
    {
        return $this->key;
    }

    /**
     *{@inheritdoc}
     *
     * @since 2.2.6
     */
    public function valid()
    {
        return null !== $this->key;
    }

    /**
     *{@inheritdoc}
     *
     * @since 2.2.6
     */
    public function rewind()
    {
        $this->cursor = 0;

        if (isset($this->orderedKeys[0])) {
            $this->key = $this->orderedKeys[0];
            $this->current = $this->elements[$this->key];
        } else {
            $this->key = null;
            $this->current = null;
        }
    }
}
PKI`�\<����=pear/Symfony/Component/Form/Util/InheritDataAwareIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Util;

/**
 * Iterator that traverses an array of forms.
 *
 * Contrary to \ArrayIterator, this iterator recognizes changes in the original
 * array during iteration.
 *
 * You can wrap the iterator into a {@link \RecursiveIterator} in order to
 * enter any child form that inherits its parent's data and iterate the children
 * of that form as well.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class InheritDataAwareIterator extends VirtualFormAwareIterator
{
}
PKI`�\��F22=pear/Symfony/Component/Form/Util/VirtualFormAwareIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Util;

/**
 * Iterator that traverses an array of forms.
 *
 * You can wrap the iterator into a {@link \RecursiveIterator} in order to
 * enter any child form that inherits its parent's data and iterate the children
 * of that form as well.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link InheritDataAwareIterator} instead.
 */
class VirtualFormAwareIterator extends \IteratorIterator implements \RecursiveIterator
{
    /**
     * {@inheritdoc}
     */
    public function getChildren()
    {
        return new static($this->current());
    }

    /**
     *{@inheritdoc}
     */
    public function hasChildren()
    {
        return (bool) $this->current()->getConfig()->getInheritData();
    }
}
PKJ`�\y���$$-pear/Symfony/Component/Form/Util/FormUtil.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Util;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormUtil
{
    /**
     * This class should not be instantiated
     */
    private function __construct() {}

    /**
     * Returns whether the given data is empty.
     *
     * This logic is reused multiple times throughout the processing of
     * a form and needs to be consistent. PHP's keyword `empty` cannot
     * be used as it also considers 0 and "0" to be empty.
     *
     * @param  mixed $data
     *
     * @return Boolean
     */
    public static function isEmpty($data)
    {
        // Should not do a check for array() === $data!!!
        // This method is used in occurrences where arrays are
        // not considered to be empty, ever.
        return null === $data || '' === $data;
    }
}
PKJ`�\�I	�663pear/Symfony/Component/Form/Util/OrderedHashMap.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Util;

/**
 * A hash map which keeps track of deletions and additions.
 *
 * Like in associative arrays, elements can be mapped to integer or string keys.
 * Unlike associative arrays, the map keeps track of the order in which keys
 * were added and removed. This order is reflected during iteration.
 *
 * The map supports concurrent modification during iteration. That means that
 * you can insert and remove elements from within a foreach loop and the
 * iterator will reflect those changes accordingly.
 *
 * While elements that are added during the loop are recognized by the iterator,
 * changed elements are not. Otherwise the loop could be infinite if each loop
 * changes the current element:
 *
 *     $map = new OrderedHashMap();
 *     $map[1] = 1;
 *     $map[2] = 2;
 *     $map[3] = 3;
 *
 *     foreach ($map as $index => $value) {
 *         echo "$index: $value\n"
 *         if (1 === $index) {
 *             $map[1] = 4;
 *             $map[] = 5;
 *         }
 *     }
 *
 *     print_r(iterator_to_array($map));
 *
 *     // => 1: 1
 *     //    2: 2
 *     //    3: 3
 *     //    4: 5
 *     //    Array
 *     //    (
 *     //        [1] => 4
 *     //        [2] => 2
 *     //        [3] => 3
 *     //        [4] => 5
 *     //    )
 *
 * The map also supports multiple parallel iterators. That means that you can
 * nest foreach loops without affecting each other's iteration:
 *
 *     foreach ($map as $index => $value) {
 *         foreach ($map as $index2 => $value2) {
 *             // ...
 *         }
 *     }
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @since 2.2.6
 */
class OrderedHashMap implements \ArrayAccess, \IteratorAggregate, \Countable
{
    /**
     * The elements of the map, indexed by their keys.
     *
     * @var array
     */
    private $elements = array();

    /**
     * The keys of the map in the order in which they were inserted or changed.
     *
     * @var array
     */
    private $orderedKeys = array();

    /**
     * References to the cursors of all open iterators.
     *
     * @var array
     */
    private $managedCursors = array();

    /**
     * Creates a new map.
     *
     * @param array $elements The elements to insert initially.
     *
     * @since 2.2.6
     */
    public function __construct(array $elements = array())
    {
        $this->elements = $elements;
        $this->orderedKeys = array_keys($elements);
    }

    /**
     * {@inheritdoc}
     *
     * @since 2.2.6
     */
    public function offsetExists($key)
    {
        return isset($this->elements[$key]);
    }

    /**
     * {@inheritdoc}
     *
     * @since 2.2.6
     */
    public function offsetGet($key)
    {
        if (!isset($this->elements[$key])) {
            throw new \OutOfBoundsException('The offset "' . $key . '" does not exist.');
        }

        return $this->elements[$key];
    }

    /**
     * {@inheritdoc}
     *
     * @since 2.2.6
     */
    public function offsetSet($key, $value)
    {
        if (null === $key || !isset($this->elements[$key])) {
            if (null === $key) {
                $key = array() === $this->orderedKeys
                    // If the array is empty, use 0 as key
                    ? 0
                    // Imitate PHP's behavior of generating a key that equals
                    // the highest existing integer key + 1
                    : max($this->orderedKeys) + 1;
            }

            $this->orderedKeys[] = $key;
        }

        $this->elements[$key] = $value;
    }

    /**
     * {@inheritdoc}
     *
     * @since 2.2.6
     */
    public function offsetUnset($key)
    {
        if (false !== ($position = array_search($key, $this->orderedKeys))) {
            array_splice($this->orderedKeys, $position, 1);
            unset($this->elements[$key]);

            foreach ($this->managedCursors as $i => $cursor) {
                if ($cursor >= $position) {
                    --$this->managedCursors[$i];
                }
            }
        }
    }

    /**
     * {@inheritdoc}
     *
     * @since 2.2.6
     */
    public function getIterator()
    {
        return new OrderedHashMapIterator($this->elements, $this->orderedKeys, $this->managedCursors);
    }

    /**
     * {@inheritdoc}
     *
     * @since 2.2.6
     */
    public function count()
    {
        return count($this->elements);
    }
}
PKK`�\�=�MM:pear/Symfony/Component/Form/FormTypeExtensionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormTypeExtensionInterface
{
    /**
     * Builds the form.
     *
     * This method is called after the extended type has built the form to
     * further modify it.
     *
     * @see FormTypeInterface::buildForm()
     *
     * @param FormBuilderInterface $builder The form builder
     * @param array                $options The options
     */
    public function buildForm(FormBuilderInterface $builder, array $options);

    /**
     * Builds the view.
     *
     * This method is called after the extended type has built the view to
     * further modify it.
     *
     * @see FormTypeInterface::buildView()
     *
     * @param FormView $view    The view
     * @param FormInterface     $form    The form
     * @param array             $options The options
     */
    public function buildView(FormView $view, FormInterface $form, array $options);

    /**
     * Finishes the view.
     *
     * This method is called after the extended type has finished the view to
     * further modify it.
     *
     * @see FormTypeInterface::finishView()
     *
     * @param FormView $view    The view
     * @param FormInterface     $form    The form
     * @param array             $options The options
     */
    public function finishView(FormView $view, FormInterface $form, array $options);

    /**
     * Overrides the default options from the extended type.
     *
     * @param OptionsResolverInterface $resolver The resolver for the options.
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver);

    /**
     * Returns the name of the type being extended.
     *
     * @return string The name of the type being extended
     */
    public function getExtendedType();
}
PKK`�\�����1pear/Symfony/Component/Form/FormTypeInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormTypeInterface
{
    /**
     * Builds the form.
     *
     * This method is called for each type in the hierarchy starting form the
     * top most type. Type extensions can further modify the form.
     *
     * @see FormTypeExtensionInterface::buildForm()
     *
     * @param FormBuilderInterface $builder The form builder
     * @param array                $options The options
     */
    public function buildForm(FormBuilderInterface $builder, array $options);

    /**
     * Builds the form view.
     *
     * This method is called for each type in the hierarchy starting form the
     * top most type. Type extensions can further modify the view.
     *
     * A view of a form is built before the views of the child forms are built.
     * This means that you cannot access child views in this method. If you need
     * to do so, move your logic to {@link finishView()} instead.
     *
     * @see FormTypeExtensionInterface::buildView()
     *
     * @param FormView $view    The view
     * @param FormInterface     $form    The form
     * @param array             $options The options
     */
    public function buildView(FormView $view, FormInterface $form, array $options);

    /**
     * Finishes the form view.
     *
     * This method gets called for each type in the hierarchy starting form the
     * top most type. Type extensions can further modify the view.
     *
     * When this method is called, views of the form's children have already
     * been built and finished and can be accessed. You should only implement
     * such logic in this method that actually accesses child views. For everything
     * else you are recommended to implement {@link buildView()} instead.
     *
     * @see FormTypeExtensionInterface::finishView()
     *
     * @param FormView $view    The view
     * @param FormInterface     $form    The form
     * @param array             $options The options
     */
    public function finishView(FormView $view, FormInterface $form, array $options);

    /**
     * Sets the default options for this type.
     *
     * @param OptionsResolverInterface $resolver The resolver for the options.
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver);

    /**
     * Returns the name of the parent type.
     *
     * You can also return a type instance from this method, although doing so
     * is discouraged because it leads to a performance penalty. The support
     * for returning type instances may be dropped from future releases.
     *
     * @return string|null|FormTypeInterface The name of the parent type if any, null otherwise.
     */
    public function getParent();

    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName();
}
PKL`�\�}p�

)pear/Symfony/Component/Form/FormError.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * Wraps errors in forms
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormError
{
    /**
     * @var string
     */
    private $message;

    /**
     * The template for the error message
     * @var string
     */
    protected $messageTemplate;

    /**
     * The parameters that should be substituted in the message template
     * @var array
     */
    protected $messageParameters;

    /**
     * The value for error message pluralization
     * @var integer|null
     */
    protected $messagePluralization;

    /**
     * Constructor
     *
     * Any array key in $messageParameters will be used as a placeholder in
     * $messageTemplate.
     *
     * @param string       $message              The translated error message
     * @param string|null  $messageTemplate      The template for the error message
     * @param array        $messageParameters    The parameters that should be
     *                                           substituted in the message template.
     * @param integer|null $messagePluralization The value for error message pluralization
     *
     * @see \Symfony\Component\Translation\Translator
     */
    public function __construct($message, $messageTemplate = null, array $messageParameters = array(), $messagePluralization = null)
    {
        $this->message = $message;
        $this->messageTemplate = $messageTemplate ?: $message;
        $this->messageParameters = $messageParameters;
        $this->messagePluralization = $messagePluralization;
    }

    /**
     * Returns the error message
     *
     * @return string
     */
    public function getMessage()
    {
        return $this->message;
    }

    /**
     * Returns the error message template
     *
     * @return string
     */
    public function getMessageTemplate()
    {
        return $this->messageTemplate;
    }

    /**
     * Returns the parameters to be inserted in the message template
     *
     * @return array
     */
    public function getMessageParameters()
    {
        return $this->messageParameters;
    }

    /**
     * Returns the value for error message pluralization.
     *
     * @return integer|null
     */
    public function getMessagePluralization()
    {
        return $this->messagePluralization;
    }
}
PKL`�\�r�WW8pear/Symfony/Component/Form/DataTransformerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\TransformationFailedException;

/**
 * Transforms a value between different representations.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface DataTransformerInterface
{
    /**
     * Transforms a value from the original representation to a transformed representation.
     *
     * This method is called on two occasions inside a form field:
     *
     * 1. When the form field is initialized with the data attached from the datasource (object or array).
     * 2. When data from a request is submitted using {@link Form::submit()} to transform the new input data
     *    back into the renderable format. For example if you have a date field and submit '2009-10-10'
     *    you might accept this value because its easily parsed, but the transformer still writes back
     *    "2009/10/10" onto the form field (for further displaying or other purposes).
     *
     * This method must be able to deal with empty values. Usually this will
     * be NULL, but depending on your implementation other empty values are
     * possible as well (such as empty strings). The reasoning behind this is
     * that value transformers must be chainable. If the transform() method
     * of the first value transformer outputs NULL, the second value transformer
     * must be able to process that value.
     *
     * By convention, transform() should return an empty string if NULL is
     * passed.
     *
     * @param mixed $value The value in the original representation
     *
     * @return mixed The value in the transformed representation
     *
     * @throws TransformationFailedException When the transformation fails.
     */
    public function transform($value);

    /**
     * Transforms a value from the transformed representation to its original
     * representation.
     *
     * This method is called when {@link Form::submit()} is called to transform the requests tainted data
     * into an acceptable format for your data processing/model layer.
     *
     * This method must be able to deal with empty values. Usually this will
     * be an empty string, but depending on your implementation other empty
     * values are possible as well (such as empty strings). The reasoning behind
     * this is that value transformers must be chainable. If the
     * reverseTransform() method of the first value transformer outputs an
     * empty string, the second value transformer must be able to process that
     * value.
     *
     * By convention, reverseTransform() should return NULL if an empty string
     * is passed.
     *
     * @param mixed $value The value in the transformed representation
     *
     * @return mixed The value in the original representation
     *
     * @throws TransformationFailedException When the transformation fails.
     */
    public function reverseTransform($value);
}
PKM`�\�p��6pear/Symfony/Component/Form/AbstractRendererEngine.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * Default implementation of {@link FormRendererEngineInterface}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class AbstractRendererEngine implements FormRendererEngineInterface
{
    /**
     * The variable in {@link FormView} used as cache key.
     */
    const CACHE_KEY_VAR = 'cache_key';

    /**
     * @var array
     */
    protected $defaultThemes;

    /**
     * @var array
     */
    protected $themes = array();

    /**
     * @var array
     */
    protected $resources = array();

    /**
     * @var array
     */
    private $resourceHierarchyLevels = array();

    /**
     * Creates a new renderer engine.
     *
     * @param array $defaultThemes The default themes. The type of these
     *                             themes is open to the implementation.
     */
    public function __construct(array $defaultThemes = array())
    {
        $this->defaultThemes = $defaultThemes;
    }

    /**
     * {@inheritdoc}
     */
    public function setTheme(FormView $view, $themes)
    {
        $cacheKey = $view->vars[self::CACHE_KEY_VAR];

        // Do not cast, as casting turns objects into arrays of properties
        $this->themes[$cacheKey] = is_array($themes) ? $themes : array($themes);

        // Unset instead of resetting to an empty array, in order to allow
        // implementations (like TwigRendererEngine) to check whether $cacheKey
        // is set at all.
        unset($this->resources[$cacheKey]);
        unset($this->resourceHierarchyLevels[$cacheKey]);
    }

    /**
     * {@inheritdoc}
     */
    public function getResourceForBlockName(FormView $view, $blockName)
    {
        $cacheKey = $view->vars[self::CACHE_KEY_VAR];

        if (!isset($this->resources[$cacheKey][$blockName])) {
            $this->loadResourceForBlockName($cacheKey, $view, $blockName);
        }

        return $this->resources[$cacheKey][$blockName];
    }

    /**
     * {@inheritdoc}
     */
    public function getResourceForBlockNameHierarchy(FormView $view, array $blockNameHierarchy, $hierarchyLevel)
    {
        $cacheKey = $view->vars[self::CACHE_KEY_VAR];
        $blockName = $blockNameHierarchy[$hierarchyLevel];

        if (!isset($this->resources[$cacheKey][$blockName])) {
            $this->loadResourceForBlockNameHierarchy($cacheKey, $view, $blockNameHierarchy, $hierarchyLevel);
        }

        return $this->resources[$cacheKey][$blockName];
    }

    /**
     * {@inheritdoc}
     */
    public function getResourceHierarchyLevel(FormView $view, array $blockNameHierarchy, $hierarchyLevel)
    {
        $cacheKey = $view->vars[self::CACHE_KEY_VAR];
        $blockName = $blockNameHierarchy[$hierarchyLevel];

        if (!isset($this->resources[$cacheKey][$blockName])) {
            $this->loadResourceForBlockNameHierarchy($cacheKey, $view, $blockNameHierarchy, $hierarchyLevel);
        }

        // If $block was previously rendered loaded with loadTemplateForBlock(), the template
        // is cached but the hierarchy level is not. In this case, we know that the  block
        // exists at this very hierarchy level, so we can just set it.
        if (!isset($this->resourceHierarchyLevels[$cacheKey][$blockName])) {
            $this->resourceHierarchyLevels[$cacheKey][$blockName] = $hierarchyLevel;
        }

        return $this->resourceHierarchyLevels[$cacheKey][$blockName];
    }

    /**
     * Loads the cache with the resource for a given block name.
     *
     * @see getResourceForBlock()
     *
     * @param string   $cacheKey  The cache key of the form view.
     * @param FormView $view      The form view for finding the applying themes.
     * @param string   $blockName The name of the block to load.
     *
     * @return Boolean True if the resource could be loaded, false otherwise.
     */
    abstract protected function loadResourceForBlockName($cacheKey, FormView $view, $blockName);

    /**
     * Loads the cache with the resource for a specific level of a block hierarchy.
     *
     * @see getResourceForBlockHierarchy()
     *
     * @param string   $cacheKey           The cache key used for storing the
     *                                     resource.
     * @param FormView $view               The form view for finding the applying
     *                                     themes.
     * @param array    $blockNameHierarchy The block hierarchy, with the most
     *                                     specific block name at the end.
     * @param integer  $hierarchyLevel     The level in the block hierarchy that
     *                                     should be loaded.
     *
     * @return Boolean True if the resource could be loaded, false otherwise.
     */
    private function loadResourceForBlockNameHierarchy($cacheKey, FormView $view, array $blockNameHierarchy, $hierarchyLevel)
    {
        $blockName = $blockNameHierarchy[$hierarchyLevel];

        // Try to find a template for that block
        if ($this->loadResourceForBlockName($cacheKey, $view, $blockName)) {
            // If loadTemplateForBlock() returns true, it was able to populate the
            // cache. The only missing thing is to set the hierarchy level at which
            // the template was found.
            $this->resourceHierarchyLevels[$cacheKey][$blockName] = $hierarchyLevel;

            return true;
        }

        if ($hierarchyLevel > 0) {
            $parentLevel = $hierarchyLevel - 1;
            $parentBlockName = $blockNameHierarchy[$parentLevel];

            // The next two if statements contain slightly duplicated code. This is by intention
            // and tries to avoid execution of unnecessary checks in order to increase performance.

            if (isset($this->resources[$cacheKey][$parentBlockName])) {
                // It may happen that the parent block is already loaded, but its level is not.
                // In this case, the parent block must have been loaded by loadResourceForBlock(),
                // which does not check the hierarchy of the block. Subsequently the block must have
                // been found directly on the parent level.
                if (!isset($this->resourceHierarchyLevels[$cacheKey][$parentBlockName])) {
                    $this->resourceHierarchyLevels[$cacheKey][$parentBlockName] = $parentLevel;
                }

                // Cache the shortcuts for further accesses
                $this->resources[$cacheKey][$blockName] = $this->resources[$cacheKey][$parentBlockName];
                $this->resourceHierarchyLevels[$cacheKey][$blockName] = $this->resourceHierarchyLevels[$cacheKey][$parentBlockName];

                return true;
            }

            if ($this->loadResourceForBlockNameHierarchy($cacheKey, $view, $blockNameHierarchy, $parentLevel)) {
                // Cache the shortcuts for further accesses
                $this->resources[$cacheKey][$blockName] = $this->resources[$cacheKey][$parentBlockName];
                $this->resourceHierarchyLevels[$cacheKey][$blockName] = $this->resourceHierarchyLevels[$cacheKey][$parentBlockName];

                return true;
            }
        }

        // Cache the result for further accesses
        $this->resources[$cacheKey][$blockName] = false;
        $this->resourceHierarchyLevels[$cacheKey][$blockName] = false;

        return false;
    }
}
PKN`�\��*��0pear/Symfony/Component/Form/ResolvedFormType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\InvalidArgumentException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
 * A wrapper for a form type and its extensions.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ResolvedFormType implements ResolvedFormTypeInterface
{
    /**
     * @var FormTypeInterface
     */
    private $innerType;

    /**
     * @var FormTypeExtensionInterface[]
     */
    private $typeExtensions;

    /**
     * @var ResolvedFormTypeInterface|null
     */
    private $parent;

    /**
     * @var OptionsResolver
     */
    private $optionsResolver;

    public function __construct(FormTypeInterface $innerType, array $typeExtensions = array(), ResolvedFormTypeInterface $parent = null)
    {
        if (!preg_match('/^[a-z0-9_]*$/i', $innerType->getName())) {
            throw new InvalidArgumentException(sprintf(
                'The "%s" form type name ("%s") is not valid. Names must only contain letters, numbers, and "_".',
                get_class($innerType),
                $innerType->getName()
            ));
        }

        foreach ($typeExtensions as $extension) {
            if (!$extension instanceof FormTypeExtensionInterface) {
                throw new UnexpectedTypeException($extension, 'Symfony\Component\Form\FormTypeExtensionInterface');
            }
        }

        $this->innerType = $innerType;
        $this->typeExtensions = $typeExtensions;
        $this->parent = $parent;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->innerType->getName();
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return $this->parent;
    }

    /**
     * {@inheritdoc}
     */
    public function getInnerType()
    {
        return $this->innerType;
    }

    /**
     * {@inheritdoc}
     */
    public function getTypeExtensions()
    {
        // BC
        if ($this->innerType instanceof AbstractType) {
            return $this->innerType->getExtensions();
        }

        return $this->typeExtensions;
    }

    /**
     * {@inheritdoc}
     */
    public function createBuilder(FormFactoryInterface $factory, $name, array $options = array())
    {
        $options = $this->getOptionsResolver()->resolve($options);

        // Should be decoupled from the specific option at some point
        $dataClass = isset($options['data_class']) ? $options['data_class'] : null;

        $builder = $this->newBuilder($name, $dataClass, $factory, $options);
        $builder->setType($this);

        return $builder;
    }

    /**
     * {@inheritdoc}
     */
    public function createView(FormInterface $form, FormView $parent = null)
    {
        return $this->newView($parent);
    }

    /**
     * Configures a form builder for the type hierarchy.
     *
     * @param FormBuilderInterface $builder The builder to configure.
     * @param array                $options The options used for the configuration.
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if (null !== $this->parent) {
            $this->parent->buildForm($builder, $options);
        }

        $this->innerType->buildForm($builder, $options);

        foreach ($this->typeExtensions as $extension) {
            /* @var FormTypeExtensionInterface $extension */
            $extension->buildForm($builder, $options);
        }
    }

    /**
     * Configures a form view for the type hierarchy.
     *
     * This method is called before the children of the view are built.
     *
     * @param FormView      $view    The form view to configure.
     * @param FormInterface $form    The form corresponding to the view.
     * @param array         $options The options used for the configuration.
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        if (null !== $this->parent) {
            $this->parent->buildView($view, $form, $options);
        }

        $this->innerType->buildView($view, $form, $options);

        foreach ($this->typeExtensions as $extension) {
            /* @var FormTypeExtensionInterface $extension */
            $extension->buildView($view, $form, $options);
        }
    }

    /**
     * Finishes a form view for the type hierarchy.
     *
     * This method is called after the children of the view have been built.
     *
     * @param FormView      $view    The form view to configure.
     * @param FormInterface $form    The form corresponding to the view.
     * @param array         $options The options used for the configuration.
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        if (null !== $this->parent) {
            $this->parent->finishView($view, $form, $options);
        }

        $this->innerType->finishView($view, $form, $options);

        foreach ($this->typeExtensions as $extension) {
            /* @var FormTypeExtensionInterface $extension */
            $extension->finishView($view, $form, $options);
        }
    }

    /**
     * Returns the configured options resolver used for this type.
     *
     * @return \Symfony\Component\OptionsResolver\OptionsResolverInterface The options resolver.
     */
    public function getOptionsResolver()
    {
        if (null === $this->optionsResolver) {
            if (null !== $this->parent) {
                $this->optionsResolver = clone $this->parent->getOptionsResolver();
            } else {
                $this->optionsResolver = new OptionsResolver();
            }

            $this->innerType->setDefaultOptions($this->optionsResolver);

            foreach ($this->typeExtensions as $extension) {
                /* @var FormTypeExtensionInterface $extension */
                $extension->setDefaultOptions($this->optionsResolver);
            }
        }

        return $this->optionsResolver;
    }

    /**
     * Creates a new builder instance.
     *
     * Override this method if you want to customize the builder class.
     *
     * @param string               $name      The name of the builder.
     * @param string               $dataClass The data class.
     * @param FormFactoryInterface $factory   The current form factory.
     * @param array                $options   The builder options.
     *
     * @return FormBuilderInterface The new builder instance.
     */
    protected function newBuilder($name, $dataClass, FormFactoryInterface $factory, array $options)
    {
        if ($this->innerType instanceof ButtonTypeInterface) {
            return new ButtonBuilder($name, $options);
        }

        if ($this->innerType instanceof SubmitButtonTypeInterface) {
            return new SubmitButtonBuilder($name, $options);
        }

        return new FormBuilder($name, $dataClass, new EventDispatcher(), $factory, $options);
    }

    /**
     * Creates a new view instance.
     *
     * Override this method if you want to customize the view class.
     *
     * @param FormView|null $parent The parent view, if available.
     *
     * @return FormView A new view instance.
     */
    protected function newView(FormView $parent = null)
    {
        return new FormView($parent);
    }
}
PKN`�\�1��88,pear/Symfony/Component/Form/AbstractType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class AbstractType implements FormTypeInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return 'form';
    }
}
PKO`�\��Z)��4pear/Symfony/Component/Form/FormFactoryInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormFactoryInterface
{
    /**
     * Returns a form.
     *
     * @see createBuilder()
     *
     * @param string|FormTypeInterface $type    The type of the form
     * @param mixed                    $data    The initial data
     * @param array                    $options The options
     *
     * @return FormInterface The form named after the type
     *
     * @throws \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException if any given option is not applicable to the given type
     */
    public function create($type = 'form', $data = null, array $options = array());

    /**
     * Returns a form.
     *
     * @see createNamedBuilder()
     *
     * @param string|integer           $name    The name of the form
     * @param string|FormTypeInterface $type    The type of the form
     * @param mixed                    $data    The initial data
     * @param array                    $options The options
     *
     * @return FormInterface The form
     *
     * @throws \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException if any given option is not applicable to the given type
     */
    public function createNamed($name, $type = 'form', $data = null, array $options = array());

    /**
     * Returns a form for a property of a class.
     *
     * @see createBuilderForProperty()
     *
     * @param string $class    The fully qualified class name
     * @param string $property The name of the property to guess for
     * @param mixed  $data     The initial data
     * @param array  $options  The options for the builder
     *
     * @return FormInterface The form named after the property
     *
     * @throws \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException if any given option is not applicable to the form type
     */
    public function createForProperty($class, $property, $data = null, array $options = array());

    /**
     * Returns a form builder.
     *
     * @param string|FormTypeInterface $type    The type of the form
     * @param mixed                    $data    The initial data
     * @param array                    $options The options
     *
     * @return FormBuilderInterface The form builder
     *
     * @throws \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException if any given option is not applicable to the given type
     */
    public function createBuilder($type = 'form', $data = null, array $options = array());

    /**
     * Returns a form builder.
     *
     * @param string|integer           $name    The name of the form
     * @param string|FormTypeInterface $type    The type of the form
     * @param mixed                    $data    The initial data
     * @param array                    $options The options
     *
     * @return FormBuilderInterface The form builder
     *
     * @throws \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException if any given option is not applicable to the given type
     */
    public function createNamedBuilder($name, $type = 'form', $data = null, array $options = array());

    /**
     * Returns a form builder for a property of a class.
     *
     * If any of the 'max_length', 'required' and type options can be guessed,
     * and are not provided in the options argument, the guessed value is used.
     *
     * @param string $class    The fully qualified class name
     * @param string $property The name of the property to guess for
     * @param mixed  $data     The initial data
     * @param array  $options  The options for the builder
     *
     * @return FormBuilderInterface The form builder named after the property
     *
     * @throws \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException if any given option is not applicable to the form type
     */
    public function createBuilderForProperty($class, $property, $data = null, array $options = array());
}
PKO`�\�	���4pear/Symfony/Component/Form/NativeRequestHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\UnexpectedTypeException;

/**
 * A request handler using PHP's super globals $_GET, $_POST and $_SERVER.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class NativeRequestHandler implements RequestHandlerInterface
{
    /**
     * The allowed keys of the $_FILES array.
     *
     * @var array
     */
    private static $fileKeys = array(
        'error',
        'name',
        'size',
        'tmp_name',
        'type',
    );

    /**
     * {@inheritdoc}
     */
    public function handleRequest(FormInterface $form, $request = null)
    {
        if (null !== $request) {
            throw new UnexpectedTypeException($request, 'null');
        }

        $name = $form->getName();
        $method = $form->getConfig()->getMethod();

        if ($method !== self::getRequestMethod()) {
            return;
        }

        if ('GET' === $method) {
            if ('' === $name) {
                $data = $_GET;
            } else {
                // Don't submit GET requests if the form's name does not exist
                // in the request
                if (!isset($_GET[$name])) {
                    return;
                }

                $data = $_GET[$name];
            }
        } else {
            $fixedFiles = array();
            foreach ($_FILES as $name => $file) {
                $fixedFiles[$name] = self::stripEmptyFiles(self::fixPhpFilesArray($file));
            }

            if ('' === $name) {
                $params = $_POST;
                $files = $fixedFiles;
            } elseif (array_key_exists($name, $_POST) || array_key_exists($name, $fixedFiles)) {
                $default = $form->getConfig()->getCompound() ? array() : null;
                $params = array_key_exists($name, $_POST) ? $_POST[$name] : $default;
                $files = array_key_exists($name, $fixedFiles) ? $fixedFiles[$name] : $default;
            } else {
                // Don't submit the form if it is not present in the request
                return;
            }

            if (is_array($params) && is_array($files)) {
                $data = array_replace_recursive($params, $files);
            } else {
                $data = $params ?: $files;
            }
        }

        // Don't auto-submit the form unless at least one field is present.
        if ('' === $name && count(array_intersect_key($data, $form->all())) <= 0) {
            return;
        }

        $form->submit($data, 'PATCH' !== $method);
    }

    /**
     * Returns the method used to submit the request to the server.
     *
     * @return string The request method.
     */
    private static function getRequestMethod()
    {
        $method = isset($_SERVER['REQUEST_METHOD'])
            ? strtoupper($_SERVER['REQUEST_METHOD'])
            : 'GET';

        if ('POST' === $method && isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
            $method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);
        }

        return $method;
    }

    /**
     * Fixes a malformed PHP $_FILES array.
     *
     * PHP has a bug that the format of the $_FILES array differs, depending on
     * whether the uploaded file fields had normal field names or array-like
     * field names ("normal" vs. "parent[child]").
     *
     * This method fixes the array to look like the "normal" $_FILES array.
     *
     * It's safe to pass an already converted array, in which case this method
     * just returns the original array unmodified.
     *
     * This method is identical to {@link Symfony\Component\HttpFoundation\FileBag::fixPhpFilesArray}
     * and should be kept as such in order to port fixes quickly and easily.
     *
     * @param array $data
     *
     * @return array
     */
    private static function fixPhpFilesArray($data)
    {
        if (!is_array($data)) {
            return $data;
        }

        $keys = array_keys($data);
        sort($keys);

        if (self::$fileKeys !== $keys || !isset($data['name']) || !is_array($data['name'])) {
            return $data;
        }

        $files = $data;
        foreach (self::$fileKeys as $k) {
            unset($files[$k]);
        }

        foreach (array_keys($data['name']) as $key) {
            $files[$key] = self::fixPhpFilesArray(array(
                'error'    => $data['error'][$key],
                'name'     => $data['name'][$key],
                'type'     => $data['type'][$key],
                'tmp_name' => $data['tmp_name'][$key],
                'size'     => $data['size'][$key]
            ));
        }

        return $files;
    }

    /**
     * Sets empty uploaded files to NULL in the given uploaded files array.
     *
     * @param mixed $data The file upload data.
     *
     * @return array|null Returns the stripped upload data.
     */
    private static function stripEmptyFiles($data)
    {
        if (!is_array($data)) {
            return $data;
        }

        $keys = array_keys($data);
        sort($keys);

        if (self::$fileKeys === $keys) {
            if (UPLOAD_ERR_NO_FILE === $data['error']) {
                return null;
            }

            return $data;
        }

        foreach ($data as $key => $value) {
            $data[$key] = self::stripEmptyFiles($value);
        }

        return $data;
    }
}
PKP`�\2��2pear/Symfony/Component/Form/FormFactoryBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * The default implementation of FormFactoryBuilderInterface.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormFactoryBuilder implements FormFactoryBuilderInterface
{
    /**
     * @var ResolvedFormTypeFactoryInterface
     */
    private $resolvedTypeFactory;

    /**
     * @var array
     */
    private $extensions = array();

    /**
     * @var array
     */
    private $types = array();

    /**
     * @var array
     */
    private $typeExtensions = array();

    /**
     * @var array
     */
    private $typeGuessers = array();

    /**
     * {@inheritdoc}
     */
    public function setResolvedTypeFactory(ResolvedFormTypeFactoryInterface $resolvedTypeFactory)
    {
        $this->resolvedTypeFactory = $resolvedTypeFactory;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addExtension(FormExtensionInterface $extension)
    {
        $this->extensions[] = $extension;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addExtensions(array $extensions)
    {
        $this->extensions = array_merge($this->extensions, $extensions);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addType(FormTypeInterface $type)
    {
        $this->types[$type->getName()] = $type;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addTypes(array $types)
    {
        foreach ($types as $type) {
            $this->types[$type->getName()] = $type;
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addTypeExtension(FormTypeExtensionInterface $typeExtension)
    {
        $this->typeExtensions[$typeExtension->getExtendedType()][] = $typeExtension;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addTypeExtensions(array $typeExtensions)
    {
        foreach ($typeExtensions as $typeExtension) {
            $this->typeExtensions[$typeExtension->getExtendedType()][] = $typeExtension;
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addTypeGuesser(FormTypeGuesserInterface $typeGuesser)
    {
        $this->typeGuessers[] = $typeGuesser;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addTypeGuessers(array $typeGuessers)
    {
        $this->typeGuessers = array_merge($this->typeGuessers, $typeGuessers);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getFormFactory()
    {
        $extensions = $this->extensions;

        if (count($this->types) > 0 || count($this->typeExtensions) > 0 || count($this->typeGuessers) > 0) {
            if (count($this->typeGuessers) > 1) {
                $typeGuesser = new FormTypeGuesserChain($this->typeGuessers);
            } else {
                $typeGuesser = isset($this->typeGuessers[0]) ? $this->typeGuessers[0] : null;
            }

            $extensions[] = new PreloadedExtension($this->types, $this->typeExtensions, $typeGuesser);
        }

        $resolvedTypeFactory = $this->resolvedTypeFactory ?: new ResolvedFormTypeFactory();
        $registry = new FormRegistry($extensions, $resolvedTypeFactory);

        return new FormFactory($registry, $resolvedTypeFactory);
    }
}
PKP`�\�YB���3pear/Symfony/Component/Form/ReversedTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * Reverses a transformer
 *
 * When the transform() method is called, the reversed transformer's
 * reverseTransform() method is called and vice versa.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ReversedTransformer implements DataTransformerInterface
{
    /**
     * The reversed transformer
     * @var DataTransformerInterface
     */
    protected $reversedTransformer;

    /**
     * Reverses this transformer
     *
     * @param DataTransformerInterface $reversedTransformer
     */
    public function __construct(DataTransformerInterface $reversedTransformer)
    {
        $this->reversedTransformer = $reversedTransformer;
    }

    /**
     * {@inheritDoc}
     */
    public function transform($value)
    {
        return $this->reversedTransformer->reverseTransform($value);
    }

    /**
     * {@inheritDoc}
     */
    public function reverseTransform($value)
    {
        return $this->reversedTransformer->transform($value);
    }
}
PKP`�\(s
//2pear/Symfony/Component/Form/ClickableInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * A clickable form element.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ClickableInterface
{
    /**
     * Returns whether this element was clicked.
     *
     * @return Boolean Whether this element was clicked.
     */
    public function isClicked();
}
PKQ`�\�/��tt*pear/Symfony/Component/Form/FormEvents.phpnu�[���<?php
/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
final class FormEvents
{
    const PRE_SUBMIT = 'form.pre_bind';

    const SUBMIT = 'form.bind';

    const POST_SUBMIT = 'form.post_bind';

    const PRE_SET_DATA = 'form.pre_set_data';

    const POST_SET_DATA = 'form.post_set_data';

    /**
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link PRE_SUBMIT} instead.
     */
    const PRE_BIND = 'form.pre_bind';

    /**
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link SUBMIT} instead.
     */
    const BIND = 'form.bind';

    /**
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link POST_SUBMIT} instead.
     */
    const POST_BIND = 'form.post_bind';

    private function __construct()
    {
    }
}
PKQ`�\�\�g��7pear/Symfony/Component/Form/RequestHandlerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * Submits forms if they were submitted.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface RequestHandlerInterface
{
    /**
     * Submits a form if it was submitted.
     *
     * @param FormInterface $form    The form to submit.
     * @param mixed         $request The current request.
     */
    public function handleRequest(FormInterface $form, $request = null);
}
PKQ`�\{d���!�!:pear/Symfony/Component/Form/FormConfigBuilderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormConfigBuilderInterface extends FormConfigInterface
{
    /**
     * Adds an event listener to an event on this form.
     *
     * @param string   $eventName The name of the event to listen to.
     * @param callable $listener  The listener to execute.
     * @param integer  $priority  The priority of the listener. Listeners
     *                            with a higher priority are called before
     *                            listeners with a lower priority.
     *
     * @return self The configuration object.
     */
    public function addEventListener($eventName, $listener, $priority = 0);

    /**
     * Adds an event subscriber for events on this form.
     *
     * @param EventSubscriberInterface $subscriber The subscriber to attach.
     *
     * @return self The configuration object.
     */
    public function addEventSubscriber(EventSubscriberInterface $subscriber);

    /**
     * Appends / prepends a transformer to the view transformer chain.
     *
     * The transform method of the transformer is used to convert data from the
     * normalized to the view format.
     * The reverseTransform method of the transformer is used to convert from the
     * view to the normalized format.
     *
     * @param DataTransformerInterface $viewTransformer
     * @param Boolean                  $forcePrepend if set to true, prepend instead of appending
     *
     * @return self The configuration object.
     */
    public function addViewTransformer(DataTransformerInterface $viewTransformer, $forcePrepend = false);

    /**
     * Clears the view transformers.
     *
     * @return self The configuration object.
     */
    public function resetViewTransformers();

    /**
     * Prepends / appends a transformer to the normalization transformer chain.
     *
     * The transform method of the transformer is used to convert data from the
     * model to the normalized format.
     * The reverseTransform method of the transformer is used to convert from the
     * normalized to the model format.
     *
     * @param DataTransformerInterface $modelTransformer
     * @param Boolean                  $forceAppend if set to true, append instead of prepending
     *
     * @return self The configuration object.
     */
    public function addModelTransformer(DataTransformerInterface $modelTransformer, $forceAppend = false);

    /**
     * Clears the normalization transformers.
     *
     * @return self The configuration object.
     */
    public function resetModelTransformers();

    /**
     * Sets the value for an attribute.
     *
     * @param string $name  The name of the attribute
     * @param string $value The value of the attribute
     *
     * @return self The configuration object.
     */
    public function setAttribute($name, $value);

    /**
     * Sets the attributes.
     *
     * @param array $attributes The attributes.
     *
     * @return self The configuration object.
     */
    public function setAttributes(array $attributes);

    /**
     * Sets the data mapper used by the form.
     *
     * @param DataMapperInterface $dataMapper
     *
     * @return self The configuration object.
     */
    public function setDataMapper(DataMapperInterface $dataMapper = null);

    /**
     * Set whether the form is disabled.
     *
     * @param Boolean $disabled Whether the form is disabled
     *
     * @return self The configuration object.
     */
    public function setDisabled($disabled);

    /**
     * Sets the data used for the client data when no value is submitted.
     *
     * @param mixed $emptyData The empty data.
     *
     * @return self The configuration object.
     */
    public function setEmptyData($emptyData);

    /**
     * Sets whether errors bubble up to the parent.
     *
     * @param Boolean $errorBubbling
     *
     * @return self The configuration object.
     */
    public function setErrorBubbling($errorBubbling);

    /**
     * Sets whether this field is required to be filled out when submitted.
     *
     * @param Boolean $required
     *
     * @return self The configuration object.
     */
    public function setRequired($required);

    /**
     * Sets the property path that the form should be mapped to.
     *
     * @param null|string|\Symfony\Component\PropertyAccess\PropertyPathInterface $propertyPath
     *             The property path or null if the path should be set
     *             automatically based on the form's name.
     *
     * @return self The configuration object.
     */
    public function setPropertyPath($propertyPath);

    /**
     * Sets whether the form should be mapped to an element of its
     * parent's data.
     *
     * @param Boolean $mapped Whether the form should be mapped.
     *
     * @return self The configuration object.
     */
    public function setMapped($mapped);

    /**
     * Sets whether the form's data should be modified by reference.
     *
     * @param Boolean $byReference Whether the data should be
     *                              modified by reference.
     *
     * @return self The configuration object.
     */
    public function setByReference($byReference);

    /**
     * Sets whether the form should read and write the data of its parent.
     *
     * @param Boolean $inheritData Whether the form should inherit its parent's data.
     *
     * @return self The configuration object.
     */
    public function setInheritData($inheritData);

    /**
     * Sets whether the form should be compound.
     *
     * @param Boolean $compound Whether the form should be compound.
     *
     * @return self The configuration object.
     *
     * @see FormConfigInterface::getCompound()
     */
    public function setCompound($compound);

    /**
     * Set the types.
     *
     * @param ResolvedFormTypeInterface $type The type of the form.
     *
     * @return self The configuration object.
     */
    public function setType(ResolvedFormTypeInterface $type);

    /**
     * Sets the initial data of the form.
     *
     * @param array $data The data of the form in application format.
     *
     * @return self The configuration object.
     */
    public function setData($data);

    /**
     * Locks the form's data to the data passed in the configuration.
     *
     * A form with locked data is restricted to the data passed in
     * this configuration. The data can only be modified then by
     * submitting the form.
     *
     * @param Boolean $locked Whether to lock the default data.
     *
     * @return self The configuration object.
     */
    public function setDataLocked($locked);

    /**
     * Sets the form factory used for creating new forms.
     *
     * @param FormFactoryInterface $formFactory The form factory.
     */
    public function setFormFactory(FormFactoryInterface $formFactory);

    /**
     * Sets the target URL of the form.
     *
     * @param string $action The target URL of the form.
     *
     * @return self The configuration object.
     */
    public function setAction($action);

    /**
     * Sets the HTTP method used by the form.
     *
     * @param string $method The HTTP method of the form.
     *
     * @return self The configuration object.
     */
    public function setMethod($method);

    /**
     * Sets the request handler used by the form.
     *
     * @param RequestHandlerInterface $requestHandler
     *
     * @return self The configuration object.
     */
    public function setRequestHandler(RequestHandlerInterface $requestHandler);

    /**
     * Sets whether the form should be initialized automatically.
     *
     * Should be set to true only for root forms.
     *
     * @param Boolean $initialize True to initialize the form automatically,
     *                            false to suppress automatic initialization.
     *                            In the second case, you need to call
     *                            {@link FormInterface::initialize()} manually.
     *
     * @return self The configuration object.
     */
    public function setAutoInitialize($initialize);

    /**
     * Builds and returns the form configuration.
     *
     * @return FormConfigInterface
     */
    public function getFormConfig();
}
PKR`�\ObX�qq,pear/Symfony/Component/Form/SubmitButton.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * A button that submits the form.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class SubmitButton extends Button implements ClickableInterface
{
    /**
     * @var Boolean
     */
    private $clicked = false;

    /**
     * {@inheritdoc}
     */
    public function isClicked()
    {
        return $this->clicked;
    }

    /**
     * Submits data to the button.
     *
     * @param null|string $submittedData The data.
     * @param Boolean     $clearMissing  Not used.
     *
     * @return SubmitButton The button instance
     *
     * @throws Exception\AlreadySubmittedException If the form has already been submitted.
     */
    public function submit($submittedData, $clearMissing = true)
    {
        parent::submit($submittedData, $clearMissing);

        $this->clicked = null !== $submittedData;

        return $this;
    }
}
PKR`�\ÊM'%%3pear/Symfony/Component/Form/FormConfigInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * The configuration of a {@link Form} object.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormConfigInterface
{
    /**
     * Returns the event dispatcher used to dispatch form events.
     *
     * @return \Symfony\Component\EventDispatcher\EventDispatcherInterface The dispatcher.
     */
    public function getEventDispatcher();

    /**
     * Returns the name of the form used as HTTP parameter.
     *
     * @return string The form name.
     */
    public function getName();

    /**
     * Returns the property path that the form should be mapped to.
     *
     * @return null|\Symfony\Component\PropertyAccess\PropertyPathInterface The property path.
     */
    public function getPropertyPath();

    /**
     * Returns whether the form should be mapped to an element of its
     * parent's data.
     *
     * @return Boolean Whether the form is mapped.
     */
    public function getMapped();

    /**
     * Returns whether the form's data should be modified by reference.
     *
     * @return Boolean Whether to modify the form's data by reference.
     */
    public function getByReference();

    /**
     * Returns whether the form should read and write the data of its parent.
     *
     * @return Boolean Whether the form should inherit its parent's data.
     */
    public function getInheritData();

    /**
     * Returns whether the form is compound.
     *
     * This property is independent of whether the form actually has
     * children. A form can be compound and have no children at all, like
     * for example an empty collection form.
     *
     * @return Boolean Whether the form is compound.
     */
    public function getCompound();

    /**
     * Returns the form types used to construct the form.
     *
     * @return ResolvedFormTypeInterface The form's type.
     */
    public function getType();

    /**
     * Returns the view transformers of the form.
     *
     * @return DataTransformerInterface[] An array of {@link DataTransformerInterface} instances.
     */
    public function getViewTransformers();

    /**
     * Returns the model transformers of the form.
     *
     * @return DataTransformerInterface[] An array of {@link DataTransformerInterface} instances.
     */
    public function getModelTransformers();

    /**
     * Returns the data mapper of the form.
     *
     * @return DataMapperInterface The data mapper.
     */
    public function getDataMapper();

    /**
     * Returns whether the form is required.
     *
     * @return Boolean Whether the form is required.
     */
    public function getRequired();

    /**
     * Returns whether the form is disabled.
     *
     * @return Boolean Whether the form is disabled.
     */
    public function getDisabled();

    /**
     * Returns whether errors attached to the form will bubble to its parent.
     *
     * @return Boolean Whether errors will bubble up.
     */
    public function getErrorBubbling();

    /**
     * Returns the data that should be returned when the form is empty.
     *
     * @return mixed The data returned if the form is empty.
     */
    public function getEmptyData();

    /**
     * Returns additional attributes of the form.
     *
     * @return array An array of key-value combinations.
     */
    public function getAttributes();

    /**
     * Returns whether the attribute with the given name exists.
     *
     * @param  string $name The attribute name.
     *
     * @return Boolean Whether the attribute exists.
     */
    public function hasAttribute($name);

    /**
     * Returns the value of the given attribute.
     *
     * @param  string $name    The attribute name.
     * @param  mixed  $default The value returned if the attribute does not exist.
     *
     * @return mixed The attribute value.
     */
    public function getAttribute($name, $default = null);

    /**
     * Returns the initial data of the form.
     *
     * @return mixed The initial form data.
     */
    public function getData();

    /**
     * Returns the class of the form data or null if the data is scalar or an array.
     *
     * @return string The data class or null.
     */
    public function getDataClass();

    /**
     * Returns whether the form's data is locked.
     *
     * A form with locked data is restricted to the data passed in
     * this configuration. The data can only be modified then by
     * submitting the form.
     *
     * @return Boolean Whether the data is locked.
     */
    public function getDataLocked();

    /**
     * Returns the form factory used for creating new forms.
     *
     * @return FormFactoryInterface The form factory.
     */
    public function getFormFactory();

    /**
     * Returns the target URL of the form.
     *
     * @return string The target URL of the form.
     */
    public function getAction();

    /**
     * Returns the HTTP method used by the form.
     *
     * @return string The HTTP method of the form.
     */
    public function getMethod();

    /**
     * Returns the request handler used by the form.
     *
     * @return RequestHandlerInterface The request handler.
     */
    public function getRequestHandler();

    /**
     * Returns whether the form should be initialized upon creation.
     *
     * @return Boolean Returns true if the form should be initialized
     *                 when created, false otherwise.
     */
    public function getAutoInitialize();

    /**
     * Returns all options passed during the construction of the form.
     *
     * @return array The passed options.
     */
    public function getOptions();

    /**
     * Returns whether a specific option exists.
     *
     * @param  string $name The option name,
     *
     * @return Boolean Whether the option exists.
     */
    public function hasOption($name);

    /**
     * Returns the value of a specific option.
     *
     * @param  string $name    The option name.
     * @param  mixed  $default The value returned if the option does not exist.
     *
     * @return mixed The option value.
     */
    public function getOption($name, $default = null);
}
PKR`�\��?zz8pear/Symfony/Component/Form/FormTypeGuesserInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormTypeGuesserInterface
{
    /**
     * Returns a field guess for a property name of a class
     *
     * @param string $class    The fully qualified class name
     * @param string $property The name of the property to guess for
     *
     * @return Guess\TypeGuess|null A guess for the field's type and options
     */
    public function guessType($class, $property);

    /**
     * Returns a guess whether a property of a class is required
     *
     * @param string $class    The fully qualified class name
     * @param string $property The name of the property to guess for
     *
     * @return Guess\ValueGuess A guess for the field's required setting
     */
    public function guessRequired($class, $property);

    /**
     * Returns a guess about the field's maximum length
     *
     * @param string $class    The fully qualified class name
     * @param string $property The name of the property to guess for
     *
     * @return Guess\ValueGuess|null A guess for the field's maximum length
     */
    public function guessMaxLength($class, $property);

    /**
     * Returns a guess about the field's pattern
     *
     * - When you have a min value, you guess a min length of this min (LOW_CONFIDENCE) , lines below
     * - If this value is a float type, this is wrong so you guess null with MEDIUM_CONFIDENCE to override the previous guess.
     * Example:
     *  You want a float greater than 5, 4.512313 is not valid but length(4.512314) > length(5)
     * @link https://github.com/symfony/symfony/pull/3927
     *
     * @param string $class    The fully qualified class name
     * @param string $property The name of the property to guess for
     *
     * @return Guess\ValueGuess|null A guess for the field's required pattern
     */
    public function guessPattern($class, $property);
}
PKS`�\>��*ii+pear/Symfony/Component/Form/FormFactory.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\UnexpectedTypeException;

class FormFactory implements FormFactoryInterface
{
    /**
     * @var FormRegistryInterface
     */
    private $registry;

    /**
     * @var ResolvedFormTypeFactoryInterface
     */
    private $resolvedTypeFactory;

    public function __construct(FormRegistryInterface $registry, ResolvedFormTypeFactoryInterface $resolvedTypeFactory)
    {
        $this->registry = $registry;
        $this->resolvedTypeFactory = $resolvedTypeFactory;
    }

    /**
     * {@inheritdoc}
     */
    public function create($type = 'form', $data = null, array $options = array())
    {
        return $this->createBuilder($type, $data, $options)->getForm();
    }

    /**
     * {@inheritdoc}
     */
    public function createNamed($name, $type = 'form', $data = null, array $options = array())
    {
        return $this->createNamedBuilder($name, $type, $data, $options)->getForm();
    }

    /**
     * {@inheritdoc}
     */
    public function createForProperty($class, $property, $data = null, array $options = array())
    {
        return $this->createBuilderForProperty($class, $property, $data, $options)->getForm();
    }

    /**
     * {@inheritdoc}
     */
    public function createBuilder($type = 'form', $data = null, array $options = array())
    {
        $name = $type instanceof FormTypeInterface || $type instanceof ResolvedFormTypeInterface
            ? $type->getName()
            : $type;

        return $this->createNamedBuilder($name, $type, $data, $options);
    }

    /**
     * {@inheritdoc}
     */
    public function createNamedBuilder($name, $type = 'form', $data = null, array $options = array())
    {
        if (null !== $data && !array_key_exists('data', $options)) {
            $options['data'] = $data;
        }

        if ($type instanceof FormTypeInterface) {
            $type = $this->resolveType($type);
        } elseif (is_string($type)) {
            $type = $this->registry->getType($type);
        } elseif (!$type instanceof ResolvedFormTypeInterface) {
            throw new UnexpectedTypeException($type, 'string, Symfony\Component\Form\ResolvedFormTypeInterface or Symfony\Component\Form\FormTypeInterface');
        }

        $builder = $type->createBuilder($this, $name, $options);

        // Explicitly call buildForm() in order to be able to override either
        // createBuilder() or buildForm() in the resolved form type
        $type->buildForm($builder, $builder->getOptions());

        return $builder;
    }

    /**
     * {@inheritdoc}
     */
    public function createBuilderForProperty($class, $property, $data = null, array $options = array())
    {
        if (null === $guesser = $this->registry->getTypeGuesser()) {
            return $this->createNamedBuilder($property, 'text', $data, $options);
        }

        $typeGuess = $guesser->guessType($class, $property);
        $maxLengthGuess = $guesser->guessMaxLength($class, $property);
        $requiredGuess = $guesser->guessRequired($class, $property);
        $patternGuess = $guesser->guessPattern($class, $property);

        $type = $typeGuess ? $typeGuess->getType() : 'text';

        $maxLength = $maxLengthGuess ? $maxLengthGuess->getValue() : null;
        $pattern   = $patternGuess ? $patternGuess->getValue() : null;

        if (null !== $pattern) {
            $options = array_merge(array('pattern' => $pattern), $options);
        }

        if (null !== $maxLength) {
            $options = array_merge(array('max_length' => $maxLength), $options);
        }

        if ($requiredGuess) {
            $options = array_merge(array('required' => $requiredGuess->getValue()), $options);
        }

        // user options may override guessed options
        if ($typeGuess) {
            $options = array_merge($typeGuess->getOptions(), $options);
        }

        return $this->createNamedBuilder($property, $type, $data, $options);
    }

    /**
     * Wraps a type into a ResolvedFormTypeInterface implementation and connects
     * it with its parent type.
     *
     * @param FormTypeInterface $type The type to resolve.
     *
     * @return ResolvedFormTypeInterface The resolved type.
     */
    private function resolveType(FormTypeInterface $type)
    {
        $parentType = $type->getParent();

        if ($parentType instanceof FormTypeInterface) {
            $parentType = $this->resolveType($parentType);
        } elseif (null !== $parentType) {
            $parentType = $this->registry->getType($parentType);
        }

        return $this->resolvedTypeFactory->createResolvedType(
            $type,
            // Type extensions are not supported for unregistered type instances,
            // i.e. type instances that are passed to the FormFactory directly,
            // nor for their parents, if getParent() also returns a type instance.
            array(),
            $parentType
        );
    }
}
PKS`�\+q�DAA<pear/Symfony/Component/Form/Test/FormPerformanceTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Test;

/**
 * Base class for performance tests.
 *
 * Copied from Doctrine 2's OrmPerformanceTestCase.
 *
 * @author robo
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class FormPerformanceTestCase extends FormIntegrationTestCase
{
    /**
     * @var    integer
     */
    protected $maxRunningTime = 0;

    /**
     */
    protected function runTest()
    {
        $s = microtime(true);
        parent::runTest();
        $time = microtime(true) - $s;

        if ($this->maxRunningTime != 0 && $time > $this->maxRunningTime) {
            $this->fail(
                sprintf(
                    'expected running time: <= %s but was: %s',

                    $this->maxRunningTime,
                    $time
                )
            );
        }
    }

    /**
     * @param  integer $maxRunningTime
     * @throws \InvalidArgumentException
     */
    public function setMaxRunningTime($maxRunningTime)
    {
        if (is_integer($maxRunningTime) && $maxRunningTime >= 0) {
            $this->maxRunningTime = $maxRunningTime;
        } else {
            throw new \InvalidArgumentException();
        }
    }

    /**
     * @return integer
     * @since  Method available since Release 2.3.0
     */
    public function getMaxRunningTime()
    {
        return $this->maxRunningTime;
    }
}
PKT`�\B�4I++<pear/Symfony/Component/Form/Test/FormIntegrationTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Test;

use Symfony\Component\Form\Forms;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class FormIntegrationTestCase extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \Symfony\Component\Form\FormFactoryInterface
     */
    protected $factory;

    protected function setUp()
    {
        $this->factory = Forms::createFormFactoryBuilder()
            ->addExtensions($this->getExtensions())
            ->getFormFactory();
    }

    protected function getExtensions()
    {
        return array();
    }
}
PKT`�\�,�7//<pear/Symfony/Component/Form/Test/DeprecationErrorHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Test;

use Symfony\Component\Form\FormEvent;

class DeprecationErrorHandler
{
    public static function handle($errorNumber, $message, $file, $line, $context)
    {
        if ($errorNumber & E_USER_DEPRECATED) {
            return true;
        }

        return \PHPUnit_Util_ErrorHandler::handleError($errorNumber, $message, $file, $line);
    }

    public static function handleBC($errorNumber, $message, $file, $line, $context)
    {
        if ($errorNumber & E_USER_DEPRECATED) {
            return true;
        }

        return false;
    }

    public static function preBind($listener, FormEvent $event)
    {
        set_error_handler(array('Symfony\Component\Form\Test\DeprecationErrorHandler', 'handle'));
        $listener->preBind($event);
        restore_error_handler();
    }
}
PKT`�\��m�yy9pear/Symfony/Component/Form/Test/FormBuilderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Test;

interface FormBuilderInterface extends \Iterator, \Symfony\Component\Form\FormBuilderInterface
{
}
PKU`�\a(0kk2pear/Symfony/Component/Form/Test/FormInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Test;

interface FormInterface extends \Iterator, \Symfony\Component\Form\FormInterface
{
}
PKV`�\s�1pear/Symfony/Component/Form/Test/TypeTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Test;

use Symfony\Component\Form\FormBuilder;
use Symfony\Component\EventDispatcher\EventDispatcher;

abstract class TypeTestCase extends FormIntegrationTestCase
{
    /**
     * @var FormBuilder
     */
    protected $builder;

    /**
     * @var EventDispatcher
     */
    protected $dispatcher;

    protected function setUp()
    {
        parent::setUp();

        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->builder = new FormBuilder(null, null, $this->dispatcher, $this->factory);
    }

    public static function assertDateTimeEquals(\DateTime $expected, \DateTime $actual)
    {
        self::assertEquals($expected->format('c'), $actual->format('c'));
    }
}
PKV`�\-�9NN*pear/Symfony/Component/Form/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Form\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PKW`�\DjN1pear/Symfony/Component/Form/AbstractExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\InvalidArgumentException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class AbstractExtension implements FormExtensionInterface
{
    /**
     * The types provided by this extension
     * @var FormTypeInterface[] An array of FormTypeInterface
     */
    private $types;

    /**
     * The type extensions provided by this extension
     * @var FormTypeExtensionInterface[] An array of FormTypeExtensionInterface
     */
    private $typeExtensions;

    /**
     * The type guesser provided by this extension
     * @var FormTypeGuesserInterface
     */
    private $typeGuesser;

    /**
     * Whether the type guesser has been loaded
     * @var Boolean
     */
    private $typeGuesserLoaded = false;

    /**
     * {@inheritdoc}
     */
    public function getType($name)
    {
        if (null === $this->types) {
            $this->initTypes();
        }

        if (!isset($this->types[$name])) {
            throw new InvalidArgumentException(sprintf('The type "%s" can not be loaded by this extension', $name));
        }

        return $this->types[$name];
    }

    /**
     * {@inheritdoc}
     */
    public function hasType($name)
    {
        if (null === $this->types) {
            $this->initTypes();
        }

        return isset($this->types[$name]);
    }

    /**
     * {@inheritdoc}
     */
    public function getTypeExtensions($name)
    {
        if (null === $this->typeExtensions) {
            $this->initTypeExtensions();
        }

        return isset($this->typeExtensions[$name])
            ? $this->typeExtensions[$name]
            : array();
    }

    /**
     * {@inheritdoc}
     */
    public function hasTypeExtensions($name)
    {
        if (null === $this->typeExtensions) {
            $this->initTypeExtensions();
        }

        return isset($this->typeExtensions[$name]) && count($this->typeExtensions[$name]) > 0;
    }

    /**
     * {@inheritdoc}
     */
    public function getTypeGuesser()
    {
        if (!$this->typeGuesserLoaded) {
            $this->initTypeGuesser();
        }

        return $this->typeGuesser;
    }

    /**
     * Registers the types.
     *
     * @return FormTypeInterface[] An array of FormTypeInterface instances
     */
    protected function loadTypes()
    {
        return array();
    }

    /**
     * Registers the type extensions.
     *
     * @return FormTypeExtensionInterface[] An array of FormTypeExtensionInterface instances
     */
    protected function loadTypeExtensions()
    {
        return array();
    }

    /**
     * Registers the type guesser.
     *
     * @return FormTypeGuesserInterface|null A type guesser
     */
    protected function loadTypeGuesser()
    {
        return null;
    }

    /**
     * Initializes the types.
     *
     * @throws UnexpectedTypeException if any registered type is not an instance of FormTypeInterface
     */
    private function initTypes()
    {
        $this->types = array();

        foreach ($this->loadTypes() as $type) {
            if (!$type instanceof FormTypeInterface) {
                throw new UnexpectedTypeException($type, 'Symfony\Component\Form\FormTypeInterface');
            }

            $this->types[$type->getName()] = $type;
        }
    }

    /**
     * Initializes the type extensions.
     *
     * @throws UnexpectedTypeException if any registered type extension is not
     *                                 an instance of FormTypeExtensionInterface
     */
    private function initTypeExtensions()
    {
        $this->typeExtensions = array();

        foreach ($this->loadTypeExtensions() as $extension) {
            if (!$extension instanceof FormTypeExtensionInterface) {
                throw new UnexpectedTypeException($extension, 'Symfony\Component\Form\FormTypeExtensionInterface');
            }

            $type = $extension->getExtendedType();

            $this->typeExtensions[$type][] = $extension;
        }
    }

    /**
     * Initializes the type guesser.
     *
     * @throws UnexpectedTypeException if the type guesser is not an instance of FormTypeGuesserInterface
     */
    private function initTypeGuesser()
    {
        $this->typeGuesserLoaded = true;

        $this->typeGuesser = $this->loadTypeGuesser();
        if (null !== $this->typeGuesser && !$this->typeGuesser instanceof FormTypeGuesserInterface) {
            throw new UnexpectedTypeException($this->typeGuesser, 'Symfony\Component\Form\FormTypeGuesserInterface');
        }
    }
}
PKW`�\�N̷@pear/Symfony/Component/Form/ResolvedFormTypeFactoryInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * Creates ResolvedFormTypeInterface instances.
 *
 * This interface allows you to use your custom ResolvedFormTypeInterface
 * implementation, within which you can customize the concrete FormBuilderInterface
 * implementations or FormView subclasses that are used by the framework.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ResolvedFormTypeFactoryInterface
{
    /**
     * Resolves a form type.
     *
     * @param FormTypeInterface              $type
     * @param FormTypeExtensionInterface[]   $typeExtensions
     * @param ResolvedFormTypeInterface|null $parent
     *
     * @return ResolvedFormTypeInterface
     *
     * @throws Exception\UnexpectedTypeException  if the types parent {@link FormTypeInterface::getParent()} is not a string
     * @throws Exception\InvalidArgumentException if the types parent can not be retrieved from any extension
     */
    public function createResolvedType(FormTypeInterface $type, array $typeExtensions, ResolvedFormTypeInterface $parent = null);
}
PKX`�\�:		4pear/Symfony/Component/Form/FormBuilderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormBuilderInterface extends \Traversable, \Countable, FormConfigBuilderInterface
{
    /**
     * Adds a new field to this group. A field must have a unique name within
     * the group. Otherwise the existing field is overwritten.
     *
     * If you add a nested group, this group should also be represented in the
     * object hierarchy.
     *
     * @param string|integer|FormBuilderInterface $child
     * @param string|FormTypeInterface            $type
     * @param array                               $options
     *
     * @return FormBuilderInterface The builder object.
     */
    public function add($child, $type = null, array $options = array());

    /**
     * Creates a form builder.
     *
     * @param string                   $name    The name of the form or the name of the property
     * @param string|FormTypeInterface $type    The type of the form or null if name is a property
     * @param array                    $options The options
     *
     * @return FormBuilderInterface The created builder.
     */
    public function create($name, $type = null, array $options = array());

    /**
     * Returns a child by name.
     *
     * @param string $name The name of the child
     *
     * @return FormBuilderInterface The builder for the child
     *
     * @throws Exception\InvalidArgumentException if the given child does not exist
     */
    public function get($name);

    /**
     * Removes the field with the given name.
     *
     * @param string $name
     *
     * @return FormBuilderInterface The builder object.
     */
    public function remove($name);

    /**
     * Returns whether a field with the given name exists.
     *
     * @param string $name
     *
     * @return Boolean
     */
    public function has($name);

    /**
     * Returns the children.
     *
     * @return array
     */
    public function all();

    /**
     * Creates the form.
     *
     * @return Form The form
     */
    public function getForm();
}
PKX`�\�s�� � -pear/Symfony/Component/Form/FormInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * A form group bundling multiple forms in a hierarchical structure.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormInterface extends \ArrayAccess, \Traversable, \Countable
{
    /**
     * Sets the parent form.
     *
     * @param  FormInterface|null $parent The parent form or null if it's the root.
     *
     * @return FormInterface The form instance
     *
     * @throws Exception\AlreadySubmittedException If the form has already been submitted.
     * @throws Exception\LogicException        When trying to set a parent for a form with
     *                                         an empty name.
     */
    public function setParent(FormInterface $parent = null);

    /**
     * Returns the parent form.
     *
     * @return FormInterface|null The parent form or null if there is none.
     */
    public function getParent();

    /**
     * Adds or replaces a child to the form.
     *
     * @param FormInterface|string|integer $child   The FormInterface instance or the name of the child.
     * @param string|null                  $type    The child's type, if a name was passed.
     * @param array                        $options The child's options, if a name was passed.
     *
     * @return FormInterface The form instance
     *
     * @throws Exception\AlreadySubmittedException   If the form has already been submitted.
     * @throws Exception\LogicException          When trying to add a child to a non-compound form.
     * @throws Exception\UnexpectedTypeException If $child or $type has an unexpected type.
     */
    public function add($child, $type = null, array $options = array());

    /**
     * Returns the child with the given name.
     *
     * @param string $name The name of the child
     *
     * @return FormInterface The child form
     *
     * @throws \OutOfBoundsException If the named child does not exist.
     */
    public function get($name);

    /**
     * Returns whether a child with the given name exists.
     *
     * @param string $name The name of the child
     *
     * @return Boolean
     */
    public function has($name);

    /**
     * Removes a child from the form.
     *
     * @param  string $name The name of the child to remove
     *
     * @return FormInterface The form instance
     *
     * @throws Exception\AlreadySubmittedException If the form has already been submitted.
     */
    public function remove($name);

    /**
     * Returns all children in this group.
     *
     * @return FormInterface[] An array of FormInterface instances
     */
    public function all();

    /**
     * Returns all errors.
     *
     * @return FormError[] An array of FormError instances that occurred during validation
     */
    public function getErrors();

    /**
     * Updates the form with default data.
     *
     * @param  mixed $modelData The data formatted as expected for the underlying object
     *
     * @return FormInterface The form instance
     *
     * @throws Exception\AlreadySubmittedException If the form has already been submitted.
     * @throws Exception\LogicException        If listeners try to call setData in a cycle. Or if
     *                                         the view data does not match the expected type
     *                                         according to {@link FormConfigInterface::getDataClass}.
     */
    public function setData($modelData);

    /**
     * Returns the data in the format needed for the underlying object.
     *
     * @return mixed
     */
    public function getData();

    /**
     * Returns the normalized data of the field.
     *
     * @return mixed When the field is not submitted, the default data is returned.
     *               When the field is submitted, the normalized submitted data is
     *               returned if the field is valid, null otherwise.
     */
    public function getNormData();

    /**
     * Returns the data transformed by the value transformer.
     *
     * @return mixed
     */
    public function getViewData();

    /**
     * Returns the extra data.
     *
     * @return array The submitted data which do not belong to a child
     */
    public function getExtraData();

    /**
     * Returns the form's configuration.
     *
     * @return FormConfigInterface The configuration.
     */
    public function getConfig();

    /**
     * Returns whether the form is submitted.
     *
     * @return Boolean true if the form is submitted, false otherwise
     */
    public function isSubmitted();

    /**
     * Returns the name by which the form is identified in forms.
     *
     * @return string The name of the form.
     */
    public function getName();

    /**
     * Returns the property path that the form is mapped to.
     *
     * @return \Symfony\Component\PropertyAccess\PropertyPathInterface The property path.
     */
    public function getPropertyPath();

    /**
     * Adds an error to this form.
     *
     * @param  FormError $error
     *
     * @return FormInterface The form instance
     */
    public function addError(FormError $error);

    /**
     * Returns whether the form and all children are valid.
     *
     * If the form is not submitted, this method always returns false.
     *
     * @return Boolean
     */
    public function isValid();

    /**
     * Returns whether the form is required to be filled out.
     *
     * If the form has a parent and the parent is not required, this method
     * will always return false. Otherwise the value set with setRequired()
     * is returned.
     *
     * @return Boolean
     */
    public function isRequired();

    /**
     * Returns whether this form is disabled.
     *
     * The content of a disabled form is displayed, but not allowed to be
     * modified. The validation of modified disabled forms should fail.
     *
     * Forms whose parents are disabled are considered disabled regardless of
     * their own state.
     *
     * @return Boolean
     */
    public function isDisabled();

    /**
     * Returns whether the form is empty.
     *
     * @return Boolean
     */
    public function isEmpty();

    /**
     * Returns whether the data in the different formats is synchronized.
     *
     * @return Boolean
     */
    public function isSynchronized();

    /**
     * Initializes the form tree.
     *
     * Should be called on the root form after constructing the tree.
     *
     * @return FormInterface The form instance.
     */
    public function initialize();

    /**
     * Inspects the given request and calls {@link submit()} if the form was
     * submitted.
     *
     * Internally, the request is forwarded to the configured
     * {@link RequestHandlerInterface} instance, which determines whether to
     * submit the form or not.
     *
     * @param mixed $request The request to handle.
     *
     * @return FormInterface The form instance.
     */
    public function handleRequest($request = null);

    /**
     * Submits data to the form, transforms and validates it.
     *
     * @param null|string|array $submittedData The submitted data.
     * @param Boolean           $clearMissing  Whether to set fields to NULL
     *                                         when they are missing in the
     *                                         submitted data.
     *
     * @return FormInterface The form instance
     *
     * @throws Exception\AlreadySubmittedException If the form has already been submitted.
     */
    public function submit($submittedData, $clearMissing = true);

    /**
     * Returns the root of the form tree.
     *
     * @return FormInterface The root of the tree
     */
    public function getRoot();

    /**
     * Returns whether the field is the root of the form tree.
     *
     * @return Boolean
     */
    public function isRoot();

    /**
     * Creates a view.
     *
     * @param FormView $parent The parent view
     *
     * @return FormView The view
     */
    public function createView(FormView $parent = null);
}
PKY`�\H��
�
(pear/Symfony/Component/Form/FormView.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\BadMethodCallException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormView implements \ArrayAccess, \IteratorAggregate, \Countable
{
    /**
     * The variables assigned to this view.
     * @var array
     */
    public $vars = array(
        'value' => null,
        'attr'  => array(),
    );

    /**
     * The parent view.
     * @var FormView
     */
    public $parent;

    /**
     * The child views.
     * @var array
     */
    public $children = array();

    /**
     * Is the form attached to this renderer rendered?
     *
     * Rendering happens when either the widget or the row method was called.
     * Row implicitly includes widget, however certain rendering mechanisms
     * have to skip widget rendering when a row is rendered.
     *
     * @var Boolean
     */
    private $rendered = false;

    public function __construct(FormView $parent = null)
    {
        $this->parent = $parent;
    }

    /**
     * Returns whether the view was already rendered.
     *
     * @return Boolean Whether this view's widget is rendered.
     */
    public function isRendered()
    {
        $hasChildren = 0 < count($this->children);

        if (true === $this->rendered || !$hasChildren) {
            return $this->rendered;
        }

        if ($hasChildren) {
            foreach ($this->children as $child) {
                if (!$child->isRendered()) {
                    return false;
                }
            }

            return $this->rendered = true;
        }

        return false;
    }

    /**
     * Marks the view as rendered.
     *
     * @return FormView The view object.
     */
    public function setRendered()
    {
        $this->rendered = true;

        return $this;
    }

    /**
     * Returns a child by name (implements \ArrayAccess).
     *
     * @param string $name The child name
     *
     * @return FormView The child view
     */
    public function offsetGet($name)
    {
        return $this->children[$name];
    }

    /**
     * Returns whether the given child exists (implements \ArrayAccess).
     *
     * @param string $name The child name
     *
     * @return Boolean Whether the child view exists
     */
    public function offsetExists($name)
    {
        return isset($this->children[$name]);
    }

    /**
     * Implements \ArrayAccess.
     *
     * @throws BadMethodCallException always as setting a child by name is not allowed
     */
    public function offsetSet($name, $value)
    {
        throw new BadMethodCallException('Not supported');
    }

    /**
     * Removes a child (implements \ArrayAccess).
     *
     * @param string $name The child name
     */
    public function offsetUnset($name)
    {
        unset($this->children[$name]);
    }

    /**
     * Returns an iterator to iterate over children (implements \IteratorAggregate)
     *
     * @return \ArrayIterator The iterator
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->children);
    }

    /**
     * Implements \Countable.
     *
     * @return integer The number of children views
     */
    public function count()
    {
        return count($this->children);
    }
}
PKY`�\���"��)pear/Symfony/Component/Form/FormEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\EventDispatcher\Event;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormEvent extends Event
{
    private $form;
    protected $data;

    /**
     * Constructs an event.
     *
     * @param FormInterface $form The associated form
     * @param mixed         $data The data
     */
    public function __construct(FormInterface $form, $data)
    {
        $this->form = $form;
        $this->data = $data;
    }

    /**
     * Returns the form at the source of the event.
     *
     * @return FormInterface
     */
    public function getForm()
    {
        return $this->form;
    }

    /**
     * Returns the data associated with this event.
     *
     * @return mixed
     */
    public function getData()
    {
        return $this->data;
    }

    /**
     * Allows updating with some filtered data.
     *
     * @param mixed $data
     */
    public function setData($data)
    {
        $this->data = $data;
    }
}
PKZ`�\Sf��
	
	2pear/Symfony/Component/Form/PreloadedExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\InvalidArgumentException;

/**
 * A form extension with preloaded types, type exceptions and type guessers.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class PreloadedExtension implements FormExtensionInterface
{
    /**
     * @var array
     */
    private $types = array();

    /**
     * @var array
     */
    private $typeExtensions = array();

    /**
     * @var FormTypeGuesserInterface
     */
    private $typeGuesser;

    /**
     * Creates a new preloaded extension.
     *
     * @param FormTypeInterface[]                 $types         The types that the extension should support.
     * @param array[FormTypeExtensionInterface[]] typeExtensions The type extensions that the extension should support.
     * @param FormTypeGuesserInterface|null       $typeGuesser   The guesser that the extension should support.
     */
    public function __construct(array $types, array $typeExtensions, FormTypeGuesserInterface $typeGuesser = null)
    {
        $this->types = $types;
        $this->typeExtensions = $typeExtensions;
        $this->typeGuesser = $typeGuesser;
    }

    /**
     * {@inheritdoc}
     */
    public function getType($name)
    {
        if (!isset($this->types[$name])) {
            throw new InvalidArgumentException(sprintf('The type "%s" can not be loaded by this extension', $name));
        }

        return $this->types[$name];
    }

    /**
     * {@inheritdoc}
     */
    public function hasType($name)
    {
        return isset($this->types[$name]);
    }

    /**
     * {@inheritdoc}
     */
    public function getTypeExtensions($name)
    {
        return isset($this->typeExtensions[$name])
            ? $this->typeExtensions[$name]
            : array();
    }

    /**
     * {@inheritdoc}
     */
    public function hasTypeExtensions($name)
    {
        return !empty($this->typeExtensions[$name]);
    }

    /**
     * {@inheritdoc}
     */
    public function getTypeGuesser()
    {
        return $this->typeGuesser;
    }
}
PK[`�\�d��,pear/Symfony/Component/Form/FormRegistry.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\ExceptionInterface;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Exception\InvalidArgumentException;

/**
 * The central registry of the Form component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormRegistry implements FormRegistryInterface
{
    /**
     * Extensions
     *
     * @var FormExtensionInterface[] An array of FormExtensionInterface
     */
    private $extensions = array();

    /**
     * @var array
     */
    private $types = array();

    /**
     * @var FormTypeGuesserInterface|false|null
     */
    private $guesser = false;

    /**
     * @var ResolvedFormTypeFactoryInterface
     */
    private $resolvedTypeFactory;

    /**
     * Constructor.
     *
     * @param FormExtensionInterface[]         $extensions          An array of FormExtensionInterface
     * @param ResolvedFormTypeFactoryInterface $resolvedTypeFactory The factory for resolved form types.
     *
     * @throws UnexpectedTypeException if any extension does not implement FormExtensionInterface
     */
    public function __construct(array $extensions, ResolvedFormTypeFactoryInterface $resolvedTypeFactory)
    {
        foreach ($extensions as $extension) {
            if (!$extension instanceof FormExtensionInterface) {
                throw new UnexpectedTypeException($extension, 'Symfony\Component\Form\FormExtensionInterface');
            }
        }

        $this->extensions = $extensions;
        $this->resolvedTypeFactory = $resolvedTypeFactory;
    }

    /**
     * {@inheritdoc}
     */
    public function getType($name)
    {
        if (!is_string($name)) {
            throw new UnexpectedTypeException($name, 'string');
        }

        if (!isset($this->types[$name])) {
            /** @var FormTypeInterface $type */
            $type = null;

            foreach ($this->extensions as $extension) {
                /* @var FormExtensionInterface $extension */
                if ($extension->hasType($name)) {
                    $type = $extension->getType($name);
                    break;
                }
            }

            if (!$type) {
                throw new InvalidArgumentException(sprintf('Could not load type "%s"', $name));
            }

            $this->resolveAndAddType($type);
        }

        return $this->types[$name];
    }

    /**
     * Wraps a type into a ResolvedFormTypeInterface implementation and connects
     * it with its parent type.
     *
     * @param FormTypeInterface $type The type to resolve.
     *
     * @return ResolvedFormTypeInterface The resolved type.
     */
    private function resolveAndAddType(FormTypeInterface $type)
    {
        $parentType = $type->getParent();

        if ($parentType instanceof FormTypeInterface) {
            $this->resolveAndAddType($parentType);
            $parentType = $parentType->getName();
        }

        $typeExtensions = array();

        foreach ($this->extensions as $extension) {
            /* @var FormExtensionInterface $extension */
            $typeExtensions = array_merge(
                $typeExtensions,
                $extension->getTypeExtensions($type->getName())
            );
        }

        $this->types[$type->getName()] = $this->resolvedTypeFactory->createResolvedType(
            $type,
            $typeExtensions,
            $parentType ? $this->getType($parentType) : null
        );
    }

    /**
     * {@inheritdoc}
     */
    public function hasType($name)
    {
        if (isset($this->types[$name])) {
            return true;
        }

        try {
            $this->getType($name);
        } catch (ExceptionInterface $e) {
            return false;
        }

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function getTypeGuesser()
    {
        if (false === $this->guesser) {
            $guessers = array();

            foreach ($this->extensions as $extension) {
                /* @var FormExtensionInterface $extension */
                $guesser = $extension->getTypeGuesser();

                if ($guesser) {
                    $guessers[] = $guesser;
                }
            }

            $this->guesser = !empty($guessers) ? new FormTypeGuesserChain($guessers) : null;
        }

        return $this->guesser;
    }

    /**
     * {@inheritdoc}
     */
    public function getExtensions()
    {
        return $this->extensions;
    }
}
PK[`�\K�9���Cpear/Symfony/Component/Form/Exception/AlreadySubmittedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

/**
 * Thrown when an operation is called that is not acceptable after submitting
 * a form.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class AlreadySubmittedException extends AlreadyBoundException
{
}
PK[`�\�_c==Apear/Symfony/Component/Form/Exception/UnexpectedTypeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

class UnexpectedTypeException extends InvalidArgumentException
{
    public function __construct($value, $expectedType)
    {
        parent::__construct(sprintf('Expected argument of type "%s", "%s" given', $expectedType, is_object($value) ? get_class($value) : gettype($value)));
    }
}
PK\`�\��X��8pear/Symfony/Component/Form/Exception/LogicException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

/**
 * Base LogicException for Form component.
 *
 * @author Alexander Kotynia <aleksander.kot@gmail.com>
 */
class LogicException extends \LogicException implements ExceptionInterface
{
}
PK\`�\�S�D��Gpear/Symfony/Component/Form/Exception/TransformationFailedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

/**
 * Indicates a value transformation error.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class TransformationFailedException extends RuntimeException
{
}
PK\`�\(ddGpear/Symfony/Component/Form/Exception/InvalidConfigurationException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

class InvalidConfigurationException extends InvalidArgumentException
{
}
PK]`�\�di���@pear/Symfony/Component/Form/Exception/BadMethodCallException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

/**
 * Base BadMethodCallException for the Form component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface
{
}
PK]`�\N����:pear/Symfony/Component/Form/Exception/RuntimeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

/**
 * Base RuntimeException for the Form component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
PK``�\�y�u��<pear/Symfony/Component/Form/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

/**
 * Base ExceptionInterface for the Form component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ExceptionInterface
{
}
PK``�\1�;TT?pear/Symfony/Component/Form/Exception/ErrorMappingException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

class ErrorMappingException extends RuntimeException
{
}
PKa`�\��>pear/Symfony/Component/Form/Exception/OutOfBoundsException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

/**
 * Base OutOfBoundsException for Form component.
 *
 * @author Alexander Kotynia <aleksander.kot@gmail.com>
 */
class OutOfBoundsException extends \OutOfBoundsException implements ExceptionInterface
{
}
PKa`�\�gBz��Bpear/Symfony/Component/Form/Exception/InvalidArgumentException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

/**
 * Base InvalidArgumentException for the Form component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
PKb`�\�W�

?pear/Symfony/Component/Form/Exception/AlreadyBoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

/**
 * Alias of {@link AlreadySubmittedException}.
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             {@link AlreadySubmittedException} instead.
 */
class AlreadyBoundException extends LogicException
{
}
PKb`�\��+RR=pear/Symfony/Component/Form/Exception/StringCastException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Exception;

class StringCastException extends RuntimeException
{
}
PKc`�\�n����6pear/Symfony/Component/Form/FormExtensionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * Interface for extensions which provide types, type extensions and a guesser.
 */
interface FormExtensionInterface
{
    /**
     * Returns a type by name.
     *
     * @param string $name The name of the type
     *
     * @return FormTypeInterface The type
     *
     * @throws Exception\InvalidArgumentException if the given type is not supported by this extension
     */
    public function getType($name);

    /**
     * Returns whether the given type is supported.
     *
     * @param string $name The name of the type
     *
     * @return Boolean Whether the type is supported by this extension
     */
    public function hasType($name);

    /**
     * Returns the extensions for the given type.
     *
     * @param string $name The name of the type
     *
     * @return FormTypeExtensionInterface[] An array of extensions as FormTypeExtensionInterface instances
     */
    public function getTypeExtensions($name);

    /**
     * Returns whether this extension provides type extensions for the given type.
     *
     * @param string $name The name of the type
     *
     * @return Boolean Whether the given type has extensions
     */
    public function hasTypeExtensions($name);

    /**
     * Returns the type guesser provided by this extension.
     *
     * @return FormTypeGuesserInterface|null The type guesser
     */
    public function getTypeGuesser();
}
PKc`�\�E���5pear/Symfony/Component/Form/FormRendererInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * Renders a form into HTML.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormRendererInterface
{
    /**
     * Returns the engine used by this renderer.
     *
     * @return FormRendererEngineInterface The renderer engine.
     */
    public function getEngine();

    /**
     * Sets the theme(s) to be used for rendering a view and its children.
     *
     * @param FormView $view   The view to assign the theme(s) to.
     * @param mixed             $themes The theme(s). The type of these themes
     *                                  is open to the implementation.
     */
    public function setTheme(FormView $view, $themes);

    /**
     * Renders a named block of the form theme.
     *
     * @param FormView $view      The view for which to render the block.
     * @param string   $blockName The name of the block.
     * @param array    $variables The variables to pass to the template.
     *
     * @return string The HTML markup
     */
    public function renderBlock(FormView $view, $blockName, array $variables = array());

    /**
     * Searches and renders a block for a given name suffix.
     *
     * The block is searched by combining the block names stored in the
     * form view with the given suffix. If a block name is found, that
     * block is rendered.
     *
     * If this method is called recursively, the block search is continued
     * where a block was found before.
     *
     * @param FormView $view            The view for which to render the block.
     * @param string   $blockNameSuffix The suffix of the block name.
     * @param array    $variables       The variables to pass to the template.
     *
     * @return string The HTML markup
     */
    public function searchAndRenderBlock(FormView $view, $blockNameSuffix, array $variables = array());

    /**
     * Renders a CSRF token.
     *
     * Use this helper for CSRF protection without the overhead of creating a
     * form.
     *
     * <code>
     * <input type="hidden" name="token" value="<?php $renderer->renderCsrfToken('rm_user_'.$user->getId()) ?>">
     * </code>
     *
     * Check the token in your action using the same token ID.
     *
     * <code>
     * $csrfProvider = $this->get('security.csrf.token_generator');
     * if (!$csrfProvider->isCsrfTokenValid('rm_user_'.$user->getId(), $token)) {
     *     throw new \RuntimeException('CSRF attack detected.');
     * }
     * </code>
     *
     * @param string $tokenId The ID of the CSRF token
     *
     * @return string A CSRF token
     */
    public function renderCsrfToken($tokenId);

    /**
     * Makes a technical name human readable.
     *
     * Sequences of underscores are replaced by single spaces. The first letter
     * of the resulting string is capitalized, while all other letters are
     * turned to lowercase.
     *
     * @param string $text The text to humanize.
     *
     * @return string The humanized text.
     */
    public function humanize($text);
}
PKd`�\W�b�[H[H-pear/Symfony/Component/Form/ButtonBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Exception\InvalidArgumentException;
use Symfony\Component\Form\Exception\BadMethodCallException;

/**
 * A builder for {@link Button} instances.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface
{
    /**
     * @var Boolean
     */
    protected $locked = false;

    /**
     * @var Boolean
     */
    private $disabled;

    /**
     * @var ResolvedFormTypeInterface
     */
    private $type;

    /**
     * @var string
     */
    private $name;

    /**
     * @var array
     */
    private $attributes = array();

    /**
     * @var array
     */
    private $options;

    /**
     * Creates a new button builder.
     *
     * @param string $name    The name of the button.
     * @param array  $options The button's options.
     *
     * @throws InvalidArgumentException If the name is empty.
     */
    public function __construct($name, array $options = array())
    {
        if (empty($name) && 0 != $name) {
            throw new InvalidArgumentException('Buttons cannot have empty names.');
        }

        $this->name = (string) $name;
        $this->options = $options;
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param string|integer|FormBuilderInterface $child
     * @param string|FormTypeInterface            $type
     * @param array                               $options
     *
     * @throws BadMethodCallException
     */
    public function add($child, $type = null, array $options = array())
    {
        throw new BadMethodCallException('Buttons cannot have children.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param string                   $name
     * @param string|FormTypeInterface $type
     * @param array                    $options
     *
     * @throws BadMethodCallException
     */
    public function create($name, $type = null, array $options = array())
    {
        throw new BadMethodCallException('Buttons cannot have children.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param string $name
     *
     * @throws BadMethodCallException
     */
    public function get($name)
    {
        throw new BadMethodCallException('Buttons cannot have children.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param string $name
     *
     * @throws BadMethodCallException
     */
    public function remove($name)
    {
        throw new BadMethodCallException('Buttons cannot have children.');
    }

    /**
     * Unsupported method.
     *
     * @param string $name
     *
     * @return Boolean Always returns false.
     */
    public function has($name)
    {
        return false;
    }

    /**
     * Returns the children.
     *
     * @return array Always returns an empty array.
     */
    public function all()
    {
        return array();
    }

    /**
     * Creates the button.
     *
     * @return Button The button
     */
    public function getForm()
    {
        return new Button($this->getFormConfig());
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param string   $eventName
     * @param callable $listener
     * @param integer  $priority
     *
     * @throws BadMethodCallException
     */
    public function addEventListener($eventName, $listener, $priority = 0)
    {
        throw new BadMethodCallException('Buttons do not support event listeners.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param EventSubscriberInterface $subscriber
     *
     * @throws BadMethodCallException
     */
    public function addEventSubscriber(EventSubscriberInterface $subscriber)
    {
        throw new BadMethodCallException('Buttons do not support event subscribers.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param DataTransformerInterface $viewTransformer
     * @param Boolean                  $forcePrepend
     *
     * @throws BadMethodCallException
     */
    public function addViewTransformer(DataTransformerInterface $viewTransformer, $forcePrepend = false)
    {
        throw new BadMethodCallException('Buttons do not support data transformers.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @throws BadMethodCallException
     */
    public function resetViewTransformers()
    {
        throw new BadMethodCallException('Buttons do not support data transformers.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param DataTransformerInterface $modelTransformer
     * @param Boolean                  $forceAppend
     *
     * @throws BadMethodCallException
     */
    public function addModelTransformer(DataTransformerInterface $modelTransformer, $forceAppend = false)
    {
        throw new BadMethodCallException('Buttons do not support data transformers.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @throws BadMethodCallException
     */
    public function resetModelTransformers()
    {
        throw new BadMethodCallException('Buttons do not support data transformers.');
    }

    /**
     * {@inheritdoc}
     */
    public function setAttribute($name, $value)
    {
        $this->attributes[$name] = $value;
    }

    /**
     * {@inheritdoc}
     */
    public function setAttributes(array $attributes)
    {
        $this->attributes = $attributes;
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param DataMapperInterface $dataMapper
     *
     * @throws BadMethodCallException
     */
    public function setDataMapper(DataMapperInterface $dataMapper = null)
    {
        throw new BadMethodCallException('Buttons do not support data mappers.');
    }

    /**
     * Set whether the button is disabled.
     *
     * @param Boolean $disabled Whether the button is disabled
     *
     * @return ButtonBuilder The button builder.
     */
    public function setDisabled($disabled)
    {
        $this->disabled = $disabled;
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param mixed $emptyData
     *
     * @throws BadMethodCallException
     */
    public function setEmptyData($emptyData)
    {
        throw new BadMethodCallException('Buttons do not support empty data.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param Boolean $errorBubbling
     *
     * @throws BadMethodCallException
     */
    public function setErrorBubbling($errorBubbling)
    {
        throw new BadMethodCallException('Buttons do not support error bubbling.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param Boolean $required
     *
     * @throws BadMethodCallException
     */
    public function setRequired($required)
    {
        throw new BadMethodCallException('Buttons cannot be required.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param null $propertyPath
     *
     * @throws BadMethodCallException
     */
    public function setPropertyPath($propertyPath)
    {
        throw new BadMethodCallException('Buttons do not support property paths.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param Boolean $mapped
     *
     * @throws BadMethodCallException
     */
    public function setMapped($mapped)
    {
        throw new BadMethodCallException('Buttons do not support data mapping.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param Boolean $byReference
     *
     * @throws BadMethodCallException
     */
    public function setByReference($byReference)
    {
        throw new BadMethodCallException('Buttons do not support data mapping.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param Boolean $virtual
     *
     * @throws BadMethodCallException
     */
    public function setVirtual($virtual)
    {
        throw new BadMethodCallException('Buttons cannot be virtual.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param Boolean $compound
     *
     * @throws BadMethodCallException
     */
    public function setCompound($compound)
    {
        throw new BadMethodCallException('Buttons cannot be compound.');
    }

    /**
     * Sets the type of the button.
     *
     * @param ResolvedFormTypeInterface $type The type of the button.
     *
     * @return ButtonBuilder The button builder.
     */
    public function setType(ResolvedFormTypeInterface $type)
    {
        $this->type = $type;
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param array $data
     *
     * @throws BadMethodCallException
     */
    public function setData($data)
    {
        throw new BadMethodCallException('Buttons do not support data.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param Boolean $locked
     *
     * @throws BadMethodCallException
     */
    public function setDataLocked($locked)
    {
        throw new BadMethodCallException('Buttons do not support data locking.');
    }

    /**
     * Unsupported method.
     *
     * This method should not be invoked.
     *
     * @param FormFactoryInterface $formFactory
     *
     * @return void
     *
     * @throws BadMethodCallException
     */
    public function setFormFactory(FormFactoryInterface $formFactory)
    {
        throw new BadMethodCallException('Buttons do not support form factories.');
    }

    /**
     * Unsupported method.
     *
     * @param string $action
     *
     * @throws BadMethodCallException
     */
    public function setAction($action)
    {
        throw new BadMethodCallException('Buttons do not support actions.');
    }

    /**
     * Unsupported method.
     *
     * @param string $method
     *
     * @throws BadMethodCallException
     */
    public function setMethod($method)
    {
        throw new BadMethodCallException('Buttons do not support methods.');
    }

    /**
     * Unsupported method.
     *
     * @param RequestHandlerInterface $requestHandler
     *
     * @throws BadMethodCallException
     */
    public function setRequestHandler(RequestHandlerInterface $requestHandler)
    {
        throw new BadMethodCallException('Buttons do not support form processors.');
    }

    /**
     * Unsupported method.
     *
     * @param Boolean $initialize
     *
     * @throws BadMethodCallException
     */
    public function setAutoInitialize($initialize)
    {
        if (true === $initialize) {
            throw new BadMethodCallException('Buttons do not support automatic initialization.');
        }

        return $this;
    }

    /**
     * Unsupported method.
     *
     * @param Boolean $inheritData
     *
     * @throws BadMethodCallException
     */
    public function setInheritData($inheritData)
    {
        throw new BadMethodCallException('Buttons do not support data inheritance.');
    }

    /**
     * Builds and returns the button configuration.
     *
     * @return FormConfigInterface
     */
    public function getFormConfig()
    {
        // This method should be idempotent, so clone the builder
        $config = clone $this;
        $config->locked = true;

        return $config;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getEventDispatcher()
    {
        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getPropertyPath()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns false.
     */
    public function getMapped()
    {
        return false;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns false.
     */
    public function getByReference()
    {
        return false;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns false.
     */
    public function getVirtual()
    {
        return false;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns false.
     */
    public function getCompound()
    {
        return false;
    }

    /**
     * Returns the form type used to construct the button.
     *
     * @return ResolvedFormTypeInterface The button's type.
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * Unsupported method.
     *
     * @return array Always returns an empty array.
     */
    public function getViewTransformers()
    {
        return array();
    }

    /**
     * Unsupported method.
     *
     * @return array Always returns an empty array.
     */
    public function getModelTransformers()
    {
        return array();
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getDataMapper()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns false.
     */
    public function getRequired()
    {
        return false;
    }

    /**
     * Returns whether the button is disabled.
     *
     * @return Boolean Whether the button is disabled.
     */
    public function getDisabled()
    {
        return $this->disabled;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns false.
     */
    public function getErrorBubbling()
    {
        return false;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getEmptyData()
    {
        return null;
    }

    /**
     * Returns additional attributes of the button.
     *
     * @return array An array of key-value combinations.
     */
    public function getAttributes()
    {
        return $this->attributes;
    }

    /**
     * Returns whether the attribute with the given name exists.
     *
     * @param string $name The attribute name.
     *
     * @return Boolean Whether the attribute exists.
     */
    public function hasAttribute($name)
    {
        return array_key_exists($name, $this->attributes);
    }

    /**
     * Returns the value of the given attribute.
     *
     * @param string $name    The attribute name.
     * @param mixed  $default The value returned if the attribute does not exist.
     *
     * @return mixed The attribute value.
     */
    public function getAttribute($name, $default = null)
    {
        return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getData()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getDataClass()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns false.
     */
    public function getDataLocked()
    {
        return false;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getFormFactory()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getAction()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getMethod()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return null Always returns null.
     */
    public function getRequestHandler()
    {
        return null;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns false.
     */
    public function getAutoInitialize()
    {
        return false;
    }

    /**
     * Unsupported method.
     *
     * @return Boolean Always returns false.
     */
    public function getInheritData()
    {
        return false;
    }

    /**
     * Returns all options passed during the construction of the button.
     *
     * @return array The passed options.
     */
    public function getOptions()
    {
        return $this->options;
    }

    /**
     * Returns whether a specific option exists.
     *
     * @param string $name The option name,
     *
     * @return Boolean Whether the option exists.
     */
    public function hasOption($name)
    {
        return array_key_exists($name, $this->options);
    }

    /**
     * Returns the value of a specific option.
     *
     * @param string $name    The option name.
     * @param mixed  $default The value returned if the option does not exist.
     *
     * @return mixed The option value.
     */
    public function getOption($name, $default = null)
    {
        return array_key_exists($name, $this->options) ? $this->options[$name] : $default;
    }

    /**
     * Unsupported method.
     *
     * @return integer Always returns 0.
     */
    public function count()
    {
        return 0;
    }

    /**
     * Unsupported method.
     *
     * @return \EmptyIterator Always returns an empty iterator.
     */
    public function getIterator()
    {
        return new \EmptyIterator();
    }
}
PKd`�\R}��jj3pear/Symfony/Component/Form/DataMapperInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface DataMapperInterface
{
    /**
     * Maps properties of some data to a list of forms.
     *
     * @param mixed           $data  Structured data.
     * @param FormInterface[] $forms A list of {@link FormInterface} instances.
     *
     * @throws Exception\UnexpectedTypeException if the type of the data parameter is not supported.
     */
    public function mapDataToForms($data, $forms);

    /**
     * Maps the data of a list of forms into the properties of some data.
     *
     * @param FormInterface[] $forms A list of {@link FormInterface} instances.
     * @param mixed           $data  Structured data.
     *
     * @throws Exception\UnexpectedTypeException if the type of the data parameter is not supported.
     */
    public function mapFormsToData($forms, &$data);
}
PKd`�\�511+pear/Symfony/Component/Form/Guess/Guess.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Guess;

use Symfony\Component\Form\Exception\InvalidArgumentException;

/**
 * Base class for guesses made by TypeGuesserInterface implementation
 *
 * Each instance contains a confidence value about the correctness of the guess.
 * Thus an instance with confidence HIGH_CONFIDENCE is more likely to be
 * correct than an instance with confidence LOW_CONFIDENCE.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class Guess
{
    /**
     * Marks an instance with a value that is extremely likely to be correct
     * @var integer
     */
    const VERY_HIGH_CONFIDENCE = 3;

    /**
     * Marks an instance with a value that is very likely to be correct
     * @var integer
     */
    const HIGH_CONFIDENCE = 2;

    /**
     * Marks an instance with a value that is likely to be correct
     * @var integer
     */
    const MEDIUM_CONFIDENCE = 1;

    /**
     * Marks an instance with a value that may be correct
     * @var integer
     */
    const LOW_CONFIDENCE = 0;

    /**
     * The confidence about the correctness of the value
     *
     * One of VERY_HIGH_CONFIDENCE, HIGH_CONFIDENCE, MEDIUM_CONFIDENCE
     * and LOW_CONFIDENCE.
     *
     * @var integer
     */
    private $confidence;

    /**
     * Returns the guess most likely to be correct from a list of guesses.
     *
     * If there are multiple guesses with the same, highest confidence, the
     * returned guess is any of them.
     *
     * @param Guess[] $guesses An array of guesses
     *
     * @return Guess|null The guess with the highest confidence
     */
    public static function getBestGuess(array $guesses)
    {
        $result = null;
        $maxConfidence = -1;

        foreach ($guesses as $guess) {
            if ($maxConfidence < $confidence = $guess->getConfidence()) {
                $maxConfidence = $confidence;
                $result = $guess;
            }
        }

        return $result;
    }

    /**
     * Constructor.
     *
     * @param integer $confidence The confidence
     *
     * @throws InvalidArgumentException if the given value of confidence is unknown
     */
    public function __construct($confidence)
    {
        if (self::VERY_HIGH_CONFIDENCE !== $confidence && self::HIGH_CONFIDENCE !== $confidence &&
            self::MEDIUM_CONFIDENCE !== $confidence && self::LOW_CONFIDENCE !== $confidence) {
            throw new InvalidArgumentException('The confidence should be one of the constants defined in Guess.');
        }

        $this->confidence = $confidence;
    }

    /**
     * Returns the confidence that the guessed value is correct.
     *
     * @return integer One of the constants VERY_HIGH_CONFIDENCE,
     *                 HIGH_CONFIDENCE, MEDIUM_CONFIDENCE and LOW_CONFIDENCE
     */
    public function getConfidence()
    {
        return $this->confidence;
    }
}
PKe`�\R����0pear/Symfony/Component/Form/Guess/ValueGuess.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Guess;

/**
 * Contains a guessed value
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ValueGuess extends Guess
{
    /**
     * The guessed value
     * @var array
     */
    private $value;

    /**
     * Constructor
     *
     * @param string  $value      The guessed value
     * @param integer $confidence The confidence that the guessed class name
     *                              is correct
     */
    public function __construct($value, $confidence)
    {
        parent::__construct($confidence);

        $this->value = $value;
    }

    /**
     * Returns the guessed value
     *
     * @return mixed
     */
    public function getValue()
    {
        return $this->value;
    }
}
PKe`�\���  /pear/Symfony/Component/Form/Guess/TypeGuess.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Guess;

/**
 * Contains a guessed class name and a list of options for creating an instance
 * of that class
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class TypeGuess extends Guess
{
    /**
     * The guessed field type
     * @var string
     */
    private $type;

    /**
     * The guessed options for creating an instance of the guessed class
     * @var array
     */
    private $options;

    /**
     * Constructor
     *
     * @param string $type    The guessed field type
     * @param array  $options The options for creating instances of the
     *                              guessed class
     * @param integer $confidence The confidence that the guessed class name
     *                              is correct
     */
    public function __construct($type, array $options, $confidence)
    {
        parent::__construct($confidence);

        $this->type = $type;
        $this->options = $options;
    }

    /**
     * Returns the guessed field type
     *
     * @return string
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * Returns the guessed options for creating instances of the guessed type
     *
     * @return array
     */
    public function getOptions()
    {
        return $this->options;
    }
}
PKe`�\
�͋%pear/Symfony/Component/Form/Forms.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Extension\Core\CoreExtension;

/**
 * Entry point of the Form component.
 *
 * Use this class to conveniently create new form factories:
 *
 * <code>
 * use Symfony\Component\Form\Forms;
 *
 * $formFactory = Forms::createFormFactory();
 *
 * $form = $formFactory->createBuilder()
 *     ->add('firstName', 'text')
 *     ->add('lastName', 'text')
 *     ->add('age', 'integer')
 *     ->add('gender', 'choice', array(
 *         'choices' => array('m' => 'Male', 'f' => 'Female'),
 *     ))
 *     ->getForm();
 * </code>
 *
 * You can also add custom extensions to the form factory:
 *
 * <code>
 * $formFactory = Forms::createFormFactoryBuilder()
 *     ->addExtension(new AcmeExtension())
 *     ->getFormFactory();
 * </code>
 *
 * If you create custom form types or type extensions, it is
 * generally recommended to create your own extensions that lazily
 * load these types and type extensions. In projects where performance
 * does not matter that much, you can also pass them directly to the
 * form factory:
 *
 * <code>
 * $formFactory = Forms::createFormFactoryBuilder()
 *     ->addType(new PersonType())
 *     ->addType(new PhoneNumberType())
 *     ->addTypeExtension(new FormTypeHelpTextExtension())
 *     ->getFormFactory();
 * </code>
 *
 * Support for CSRF protection is provided by the CsrfExtension.
 * This extension needs a CSRF provider with a strong secret
 * (e.g. a 20 character long random string). The default
 * implementation for this is DefaultCsrfProvider:
 *
 * <code>
 * use Symfony\Component\Form\Extension\Csrf\CsrfExtension;
 * use Symfony\Component\Form\Extension\Csrf\CsrfProvider\DefaultCsrfProvider;
 *
 * $secret = 'V8a5Z97e...';
 * $formFactory = Forms::createFormFactoryBuilder()
 *     ->addExtension(new CsrfExtension(new DefaultCsrfProvider($secret)))
 *     ->getFormFactory();
 * </code>
 *
 * Support for the HttpFoundation is provided by the
 * HttpFoundationExtension. You are also advised to load the CSRF
 * extension with the driver for HttpFoundation's Session class:
 *
 * <code>
 * use Symfony\Component\HttpFoundation\Session\Session;
 * use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension;
 * use Symfony\Component\Form\Extension\Csrf\CsrfExtension;
 * use Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider;
 *
 * $session = new Session();
 * $secret = 'V8a5Z97e...';
 * $formFactory = Forms::createFormFactoryBuilder()
 *     ->addExtension(new HttpFoundationExtension())
 *     ->addExtension(new CsrfExtension(new SessionCsrfProvider($session, $secret)))
 *     ->getFormFactory();
 * </code>
 *
 * Support for the Validator component is provided by ValidatorExtension.
 * This extension needs a validator object to function properly:
 *
 * <code>
 * use Symfony\Component\Validator\Validation;
 * use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
 *
 * $validator = Validation::createValidator();
 * $formFactory = Forms::createFormFactoryBuilder()
 *     ->addExtension(new ValidatorExtension($validator))
 *     ->getFormFactory();
 * </code>
 *
 * Support for the Templating component is provided by TemplatingExtension.
 * This extension needs a PhpEngine object for rendering forms. As second
 * argument you should pass the names of the default themes. Here is an
 * example for using the default layout with "<div>" tags:
 *
 * <code>
 * use Symfony\Component\Form\Extension\Templating\TemplatingExtension;
 *
 * $formFactory = Forms::createFormFactoryBuilder()
 *     ->addExtension(new TemplatingExtension($engine, null, array(
 *         'FrameworkBundle:Form',
 *     )))
 *     ->getFormFactory();
 * </code>
 *
 * The next example shows how to include the "<table>" layout:
 *
 * <code>
 * use Symfony\Component\Form\Extension\Templating\TemplatingExtension;
 *
 * $formFactory = Forms::createFormFactoryBuilder()
 *     ->addExtension(new TemplatingExtension($engine, null, array(
 *         'FrameworkBundle:Form',
 *         'FrameworkBundle:FormTable',
 *     )))
 *     ->getFormFactory();
 * </code>
 *
 * If you also loaded the CsrfExtension, you should pass the CSRF provider
 * to the extension so that you can render CSRF tokens in your templates
 * more easily:
 *
 * <code>
 * use Symfony\Component\Form\Extension\Csrf\CsrfExtension;
 * use Symfony\Component\Form\Extension\Csrf\CsrfProvider\DefaultCsrfProvider;
 * use Symfony\Component\Form\Extension\Templating\TemplatingExtension;
 *
 *
 * $secret = 'V8a5Z97e...';
 * $csrfProvider = new DefaultCsrfProvider($secret);
 * $formFactory = Forms::createFormFactoryBuilder()
 *     ->addExtension(new CsrfExtension($csrfProvider))
 *     ->addExtension(new TemplatingExtension($engine, $csrfProvider, array(
 *         'FrameworkBundle:Form',
 *     )))
 *     ->getFormFactory();
 * </code>
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
final class Forms
{
    /**
     * Creates a form factory with the default configuration.
     *
     * @return FormFactoryInterface The form factory.
     */
    public static function createFormFactory()
    {
        return self::createFormFactoryBuilder()->getFormFactory();
    }

    /**
     * Creates a form factory builder with the default configuration.
     *
     * @return FormFactoryBuilderInterface The form factory builder.
     */
    public static function createFormFactoryBuilder()
    {
        $builder = new FormFactoryBuilder();
        $builder->addExtension(new CoreExtension());

        return $builder;
    }

    /**
     * This class cannot be instantiated.
     */
    private function __construct()
    {
    }
}
PKe`�\��@@4pear/Symfony/Component/Form/FormTypeGuesserChain.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Guess\Guess;
use Symfony\Component\Form\Exception\UnexpectedTypeException;

class FormTypeGuesserChain implements FormTypeGuesserInterface
{
    private $guessers = array();

    /**
     * Constructor.
     *
     * @param FormTypeGuesserInterface[] $guessers Guessers as instances of FormTypeGuesserInterface
     *
     * @throws UnexpectedTypeException if any guesser does not implement FormTypeGuesserInterface
     */
    public function __construct(array $guessers)
    {
        foreach ($guessers as $guesser) {
            if (!$guesser instanceof FormTypeGuesserInterface) {
                throw new UnexpectedTypeException($guesser, 'Symfony\Component\Form\FormTypeGuesserInterface');
            }

            if ($guesser instanceof self) {
                $this->guessers = array_merge($this->guessers, $guesser->guessers);
            } else {
                $this->guessers[] = $guesser;
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    public function guessType($class, $property)
    {
        return $this->guess(function ($guesser) use ($class, $property) {
            return $guesser->guessType($class, $property);
        });
    }

    /**
     * {@inheritDoc}
     */
    public function guessRequired($class, $property)
    {
        return $this->guess(function ($guesser) use ($class, $property) {
            return $guesser->guessRequired($class, $property);
        });
    }

    /**
     * {@inheritDoc}
     */
    public function guessMaxLength($class, $property)
    {
        return $this->guess(function ($guesser) use ($class, $property) {
            return $guesser->guessMaxLength($class, $property);
        });
    }

    /**
     * {@inheritDoc}
     */
    public function guessPattern($class, $property)
    {
        return $this->guess(function ($guesser) use ($class, $property) {
            return $guesser->guessPattern($class, $property);
        });
    }

    /**
     * Executes a closure for each guesser and returns the best guess from the
     * return values
     *
     * @param \Closure $closure The closure to execute. Accepts a guesser
     *                            as argument and should return a Guess instance
     *
     * @return Guess|null The guess with the highest confidence
     */
    private function guess(\Closure $closure)
    {
        $guesses = array();

        foreach ($this->guessers as $guesser) {
            if ($guess = $closure($guesser)) {
                $guesses[] = $guess;
            }
        }

        return Guess::getBestGuess($guesses);
    }
}
PKf`�\f#jK��;pear/Symfony/Component/Form/FormRendererEngineInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * Adapter for rendering form templates with a specific templating engine.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormRendererEngineInterface
{
    /**
     * Sets the theme(s) to be used for rendering a view and its children.
     *
     * @param FormView $view   The view to assign the theme(s) to.
     * @param mixed    $themes The theme(s). The type of these themes
     *                         is open to the implementation.
     */
    public function setTheme(FormView $view, $themes);

    /**
     * Returns the resource for a block name.
     *
     * The resource is first searched in the themes attached to $view, then
     * in the themes of its parent view and so on, until a resource was found.
     *
     * The type of the resource is decided by the implementation. The resource
     * is later passed to {@link renderBlock()} by the rendering algorithm.
     *
     * @param FormView $view      The view for determining the used themes.
     *                            First the themes attached directly to the
     *                            view with {@link setTheme()} are considered,
     *                            then the ones of its parent etc.
     * @param string   $blockName The name of the block to render.
     *
     * @return mixed The renderer resource or false, if none was found.
     */
    public function getResourceForBlockName(FormView $view, $blockName);

    /**
     * Returns the resource for a block hierarchy.
     *
     * A block hierarchy is an array which starts with the root of the hierarchy
     * and continues with the child of that root, the child of that child etc.
     * The following is an example for a block hierarchy:
     *
     * <code>
     * form_widget
     * text_widget
     * url_widget
     * </code>
     *
     * In this example, "url_widget" is the most specific block, while the other
     * blocks are its ancestors in the hierarchy.
     *
     * The second parameter $hierarchyLevel determines the level of the hierarchy
     * that should be rendered. For example, if $hierarchyLevel is 2 for the
     * above hierarchy, the engine will first look for the block "url_widget",
     * then, if that does not exist, for the block "text_widget" etc.
     *
     * The type of the resource is decided by the implementation. The resource
     * is later passed to {@link renderBlock()} by the rendering algorithm.
     *
     * @param FormView          $view               The view for determining the
     *                                              used themes. First the themes
     *                                              attached directly to the view
     *                                              with {@link setTheme()} are
     *                                              considered, then the ones of
     *                                              its parent etc.
     * @param array             $blockNameHierarchy The block name hierarchy, with
     *                                              the root block at the beginning.
     * @param integer           $hierarchyLevel     The level in the hierarchy at
     *                                              which to start looking. Level 0
     *                                              indicates the root block, i.e.
     *                                              the first element of
     *                                              $blockNameHierarchy.
     *
     * @return mixed The renderer resource or false, if none was found.
     */
    public function getResourceForBlockNameHierarchy(FormView $view, array $blockNameHierarchy, $hierarchyLevel);

    /**
     * Returns the hierarchy level at which a resource can be found.
     *
     * A block hierarchy is an array which starts with the root of the hierarchy
     * and continues with the child of that root, the child of that child etc.
     * The following is an example for a block hierarchy:
     *
     * <code>
     * form_widget
     * text_widget
     * url_widget
     * </code>
     *
     * The second parameter $hierarchyLevel determines the level of the hierarchy
     * that should be rendered.
     *
     * If we call this method with the hierarchy level 2, the engine will first
     * look for a resource for block "url_widget". If such a resource exists,
     * the method returns 2. Otherwise it tries to find a resource for block
     * "text_widget" (at level 1) and, again, returns 1 if a resource was found.
     * The method continues to look for resources until the root level was
     * reached and nothing was found. In this case false is returned.
     *
     * The type of the resource is decided by the implementation. The resource
     * is later passed to {@link renderBlock()} by the rendering algorithm.
     *
     * @param FormView          $view               The view for determining the
     *                                              used themes. First the themes
     *                                              attached directly to the view
     *                                              with {@link setTheme()} are
     *                                              considered, then the ones of
     *                                              its parent etc.
     * @param array             $blockNameHierarchy The block name hierarchy, with
     *                                              the root block at the beginning.
     * @param integer           $hierarchyLevel     The level in the hierarchy at
     *                                              which to start looking. Level 0
     *                                              indicates the root block, i.e.
     *                                              the first element of
     *                                              $blockNameHierarchy.
     *
     * @return integer|Boolean The hierarchy level or false, if no resource was found.
     */
    public function getResourceHierarchyLevel(FormView $view, array $blockNameHierarchy, $hierarchyLevel);

    /**
     * Renders a block in the given renderer resource.
     *
     * The resource can be obtained by calling {@link getResourceForBlock()}
     * or {@link getResourceForBlockHierarchy()}. The type of the resource is
     * decided by the implementation.
     *
     * @param FormView          $view      The view to render.
     * @param mixed             $resource  The renderer resource.
     * @param string            $blockName The name of the block to render.
     * @param array             $variables The variables to pass to the template.
     *
     * @return string The HTML markup.
     */
    public function renderBlock(FormView $view, $resource, $blockName, array $variables = array());
}
PKf`�\���1�1�$pear/Symfony/Component/Form/Form.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\RuntimeException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Exception\AlreadySubmittedException;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Exception\LogicException;
use Symfony\Component\Form\Exception\OutOfBoundsException;
use Symfony\Component\Form\Util\FormUtil;
use Symfony\Component\Form\Util\InheritDataAwareIterator;
use Symfony\Component\Form\Util\OrderedHashMap;
use Symfony\Component\PropertyAccess\PropertyPath;

/**
 * Form represents a form.
 *
 * To implement your own form fields, you need to have a thorough understanding
 * of the data flow within a form. A form stores its data in three different
 * representations:
 *
 *   (1) the "model" format required by the form's object
 *   (2) the "normalized" format for internal processing
 *   (3) the "view" format used for display
 *
 * A date field, for example, may store a date as "Y-m-d" string (1) in the
 * object. To facilitate processing in the field, this value is normalized
 * to a DateTime object (2). In the HTML representation of your form, a
 * localized string (3) is presented to and modified by the user.
 *
 * In most cases, format (1) and format (2) will be the same. For example,
 * a checkbox field uses a Boolean value for both internal processing and
 * storage in the object. In these cases you simply need to set a value
 * transformer to convert between formats (2) and (3). You can do this by
 * calling addViewTransformer().
 *
 * In some cases though it makes sense to make format (1) configurable. To
 * demonstrate this, let's extend our above date field to store the value
 * either as "Y-m-d" string or as timestamp. Internally we still want to
 * use a DateTime object for processing. To convert the data from string/integer
 * to DateTime you can set a normalization transformer by calling
 * addNormTransformer(). The normalized data is then converted to the displayed
 * data as described before.
 *
 * The conversions (1) -> (2) -> (3) use the transform methods of the transformers.
 * The conversions (3) -> (2) -> (1) use the reverseTransform methods of the transformers.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class Form implements \IteratorAggregate, FormInterface
{
    /**
     * The form's configuration
     * @var FormConfigInterface
     */
    private $config;

    /**
     * The parent of this form
     * @var FormInterface
     */
    private $parent;

    /**
     * The children of this form
     * @var FormInterface[] A map of FormInterface instances
     */
    private $children;

    /**
     * The errors of this form
     * @var FormError[] An array of FormError instances
     */
    private $errors = array();

    /**
     * Whether this form was submitted
     * @var Boolean
     */
    private $submitted = false;

    /**
     * The button that was used to submit the form
     * @var Button
     */
    private $clickedButton;

    /**
     * The form data in model format
     * @var mixed
     */
    private $modelData;

    /**
     * The form data in normalized format
     * @var mixed
     */
    private $normData;

    /**
     * The form data in view format
     * @var mixed
     */
    private $viewData;

    /**
     * The submitted values that don't belong to any children
     * @var array
     */
    private $extraData = array();

    /**
     * Whether the data in model, normalized and view format is
     * synchronized. Data may not be synchronized if transformation errors
     * occur.
     * @var Boolean
     */
    private $synchronized = true;

    /**
     * Whether the form's data has been initialized.
     *
     * When the data is initialized with its default value, that default value
     * is passed through the transformer chain in order to synchronize the
     * model, normalized and view format for the first time. This is done
     * lazily in order to save performance when {@link setData()} is called
     * manually, making the initialization with the configured default value
     * superfluous.
     *
     * @var Boolean
     */
    private $defaultDataSet = false;

    /**
     * Whether setData() is currently being called.
     * @var Boolean
     */
    private $lockSetData = false;

    /**
     * Creates a new form based on the given configuration.
     *
     * @param FormConfigInterface $config The form configuration.
     *
     * @throws LogicException if a data mapper is not provided for a compound form
     */
    public function __construct(FormConfigInterface $config)
    {
        // Compound forms always need a data mapper, otherwise calls to
        // `setData` and `add` will not lead to the correct population of
        // the child forms.
        if ($config->getCompound() && !$config->getDataMapper()) {
            throw new LogicException('Compound forms need a data mapper');
        }

        // If the form inherits the data from its parent, it is not necessary
        // to call setData() with the default data.
        if ($config->getInheritData()) {
            $this->defaultDataSet = true;
        }

        $this->config = $config;
        $this->children = new OrderedHashMap();
    }

    public function __clone()
    {
        $this->children = clone $this->children;

        foreach ($this->children as $key => $child) {
            $this->children[$key] = clone $child;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getConfig()
    {
        return $this->config;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->config->getName();
    }

    /**
     * {@inheritdoc}
     */
    public function getPropertyPath()
    {
        if (null !== $this->config->getPropertyPath()) {
            return $this->config->getPropertyPath();
        }

        if (null === $this->getName() || '' === $this->getName()) {
            return null;
        }

        $parent = $this->parent;

        while ($parent && $parent->getConfig()->getInheritData()) {
            $parent = $parent->getParent();
        }

        if ($parent && null === $parent->getConfig()->getDataClass()) {
            return new PropertyPath('['.$this->getName().']');
        }

        return new PropertyPath($this->getName());
    }

    /**
     * {@inheritdoc}
     */
    public function isRequired()
    {
        if (null === $this->parent || $this->parent->isRequired()) {
            return $this->config->getRequired();
        }

        return false;
    }

    /**
     * {@inheritDoc}
     */
    public function isDisabled()
    {
        if (null === $this->parent || !$this->parent->isDisabled()) {
            return $this->config->getDisabled();
        }

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function setParent(FormInterface $parent = null)
    {
        if ($this->submitted) {
            throw new AlreadySubmittedException('You cannot set the parent of a submitted form');
        }

        if (null !== $parent && '' === $this->config->getName()) {
            throw new LogicException('A form with an empty name cannot have a parent form.');
        }

        $this->parent = $parent;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return $this->parent;
    }

    /**
     * {@inheritdoc}
     */
    public function getRoot()
    {
        return $this->parent ? $this->parent->getRoot() : $this;
    }

    /**
     * {@inheritdoc}
     */
    public function isRoot()
    {
        return null === $this->parent;
    }

    /**
     * {@inheritdoc}
     */
    public function setData($modelData)
    {
        // If the form is submitted while disabled, it is set to submitted, but the data is not
        // changed. In such cases (i.e. when the form is not initialized yet) don't
        // abort this method.
        if ($this->submitted && $this->defaultDataSet) {
            throw new AlreadySubmittedException('You cannot change the data of a submitted form.');
        }

        // If the form inherits its parent's data, disallow data setting to
        // prevent merge conflicts
        if ($this->config->getInheritData()) {
            throw new RuntimeException('You cannot change the data of a form inheriting its parent data.');
        }

        // Don't allow modifications of the configured data if the data is locked
        if ($this->config->getDataLocked() && $modelData !== $this->config->getData()) {
            return $this;
        }

        if (is_object($modelData) && !$this->config->getByReference()) {
            $modelData = clone $modelData;
        }

        if ($this->lockSetData) {
            throw new RuntimeException('A cycle was detected. Listeners to the PRE_SET_DATA event must not call setData(). You should call setData() on the FormEvent object instead.');
        }

        $this->lockSetData = true;
        $dispatcher = $this->config->getEventDispatcher();

        // Hook to change content of the data
        if ($dispatcher->hasListeners(FormEvents::PRE_SET_DATA)) {
            $event = new FormEvent($this, $modelData);
            $dispatcher->dispatch(FormEvents::PRE_SET_DATA, $event);
            $modelData = $event->getData();
        }

        // Treat data as strings unless a value transformer exists
        if (!$this->config->getViewTransformers() && !$this->config->getModelTransformers() && is_scalar($modelData)) {
            $modelData = (string) $modelData;
        }

        // Synchronize representations - must not change the content!
        $normData = $this->modelToNorm($modelData);
        $viewData = $this->normToView($normData);

        // Validate if view data matches data class (unless empty)
        if (!FormUtil::isEmpty($viewData)) {
            $dataClass = $this->config->getDataClass();

            $actualType = is_object($viewData) ? 'an instance of class '.get_class($viewData) : ' a(n) '.gettype($viewData);

            if (null === $dataClass && is_object($viewData) && !$viewData instanceof \ArrayAccess) {
                $expectedType = 'scalar, array or an instance of \ArrayAccess';

                throw new LogicException(
                    'The form\'s view data is expected to be of type '.$expectedType.', ' .
                    'but is '.$actualType.'. You ' .
                    'can avoid this error by setting the "data_class" option to ' .
                    '"'.get_class($viewData).'" or by adding a view transformer ' .
                    'that transforms '.$actualType.' to '.$expectedType.'.'
                );
            }

            if (null !== $dataClass && !$viewData instanceof $dataClass) {
                throw new LogicException(
                    'The form\'s view data is expected to be an instance of class ' .
                    $dataClass.', but is '. $actualType.'. You can avoid this error ' .
                    'by setting the "data_class" option to null or by adding a view ' .
                    'transformer that transforms '.$actualType.' to an instance of ' .
                    $dataClass.'.'
                );
            }
        }

        $this->modelData = $modelData;
        $this->normData = $normData;
        $this->viewData = $viewData;
        $this->defaultDataSet = true;
        $this->lockSetData = false;

        // It is not necessary to invoke this method if the form doesn't have children,
        // even if the form is compound.
        if (count($this->children) > 0) {
            // Update child forms from the data
            $iterator = new InheritDataAwareIterator($this->children);
            $iterator = new \RecursiveIteratorIterator($iterator);
            $this->config->getDataMapper()->mapDataToForms($viewData, $iterator);
        }

        if ($dispatcher->hasListeners(FormEvents::POST_SET_DATA)) {
            $event = new FormEvent($this, $modelData);
            $dispatcher->dispatch(FormEvents::POST_SET_DATA, $event);
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getData()
    {
        if ($this->config->getInheritData()) {
            if (!$this->parent) {
                throw new RuntimeException('The form is configured to inherit its parent\'s data, but does not have a parent.');
            }

            return $this->parent->getData();
        }

        if (!$this->defaultDataSet) {
            $this->setData($this->config->getData());
        }

        return $this->modelData;
    }

    /**
     * {@inheritdoc}
     */
    public function getNormData()
    {
        if ($this->config->getInheritData()) {
            if (!$this->parent) {
                throw new RuntimeException('The form is configured to inherit its parent\'s data, but does not have a parent.');
            }

            return $this->parent->getNormData();
        }

        if (!$this->defaultDataSet) {
            $this->setData($this->config->getData());
        }

        return $this->normData;
    }

    /**
     * {@inheritdoc}
     */
    public function getViewData()
    {
        if ($this->config->getInheritData()) {
            if (!$this->parent) {
                throw new RuntimeException('The form is configured to inherit its parent\'s data, but does not have a parent.');
            }

            return $this->parent->getViewData();
        }

        if (!$this->defaultDataSet) {
            $this->setData($this->config->getData());
        }

        return $this->viewData;
    }

    /**
     * {@inheritdoc}
     */
    public function getExtraData()
    {
        return $this->extraData;
    }

    /**
     * {@inheritdoc}
     */
    public function initialize()
    {
        if (null !== $this->parent) {
            throw new RuntimeException('Only root forms should be initialized.');
        }

        // Guarantee that the *_SET_DATA events have been triggered once the
        // form is initialized. This makes sure that dynamically added or
        // removed fields are already visible after initialization.
        if (!$this->defaultDataSet) {
            $this->setData($this->config->getData());
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function handleRequest($request = null)
    {
        $this->config->getRequestHandler()->handleRequest($this, $request);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function submit($submittedData, $clearMissing = true)
    {
        if ($this->submitted) {
            throw new AlreadySubmittedException('A form can only be submitted once');
        }

        // Initialize errors in the very beginning so that we don't lose any
        // errors added during listeners
        $this->errors = array();

        // Obviously, a disabled form should not change its data upon submission.
        if ($this->isDisabled()) {
            $this->submitted = true;

            return $this;
        }

        // The data must be initialized if it was not initialized yet.
        // This is necessary to guarantee that the *_SET_DATA listeners
        // are always invoked before submit() takes place.
        if (!$this->defaultDataSet) {
            $this->setData($this->config->getData());
        }

        // Treat false as NULL to support binding false to checkboxes.
        // Don't convert NULL to a string here in order to determine later
        // whether an empty value has been submitted or whether no value has
        // been submitted at all. This is important for processing checkboxes
        // and radio buttons with empty values.
        if (false === $submittedData) {
            $submittedData = null;
        } elseif (is_scalar($submittedData)) {
            $submittedData = (string) $submittedData;
        }

        $dispatcher = $this->config->getEventDispatcher();

        $modelData = null;
        $normData = null;
        $viewData = null;

        try {
            // Hook to change content of the data submitted by the browser
            if ($dispatcher->hasListeners(FormEvents::PRE_SUBMIT)) {
                $event = new FormEvent($this, $submittedData);
                $dispatcher->dispatch(FormEvents::PRE_SUBMIT, $event);
                $submittedData = $event->getData();
            }

            // Check whether the form is compound.
            // This check is preferable over checking the number of children,
            // since forms without children may also be compound.
            // (think of empty collection forms)
            if ($this->config->getCompound()) {
                if (null === $submittedData) {
                    $submittedData = array();
                }

                if (!is_array($submittedData)) {
                    throw new TransformationFailedException('Compound forms expect an array or NULL on submission.');
                }

                foreach ($this->children as $name => $child) {
                    if (array_key_exists($name, $submittedData) || $clearMissing) {
                        $child->submit(isset($submittedData[$name]) ? $submittedData[$name] : null, $clearMissing);
                        unset($submittedData[$name]);

                        if (null !== $this->clickedButton) {
                            continue;
                        }

                        if ($child instanceof ClickableInterface && $child->isClicked()) {
                            $this->clickedButton = $child;

                            continue;
                        }

                        if (method_exists($child, 'getClickedButton') && null !== $child->getClickedButton()) {
                            $this->clickedButton = $child->getClickedButton();
                        }
                    }
                }

                $this->extraData = $submittedData;
            }

            // Forms that inherit their parents' data also are not processed,
            // because then it would be too difficult to merge the changes in
            // the child and the parent form. Instead, the parent form also takes
            // changes in the grandchildren (i.e. children of the form that inherits
            // its parent's data) into account.
            // (see InheritDataAwareIterator below)
            if (!$this->config->getInheritData()) {
                // If the form is compound, the default data in view format
                // is reused. The data of the children is merged into this
                // default data using the data mapper.
                // If the form is not compound, the submitted data is also the data in view format.
                $viewData = $this->config->getCompound() ? $this->viewData : $submittedData;

                if (FormUtil::isEmpty($viewData)) {
                    $emptyData = $this->config->getEmptyData();

                    if ($emptyData instanceof \Closure) {
                        /* @var \Closure $emptyData */
                        $emptyData = $emptyData($this, $viewData);
                    }

                    $viewData = $emptyData;
                }

                // Merge form data from children into existing view data
                // It is not necessary to invoke this method if the form has no children,
                // even if it is compound.
                if (count($this->children) > 0) {
                    // Use InheritDataAwareIterator to process children of
                    // descendants that inherit this form's data.
                    // These descendants will not be submitted normally (see the check
                    // for $this->config->getInheritData() above)
                    $childrenIterator = new InheritDataAwareIterator($this->children);
                    $childrenIterator = new \RecursiveIteratorIterator($childrenIterator);
                    $this->config->getDataMapper()->mapFormsToData($childrenIterator, $viewData);
                }

                // Normalize data to unified representation
                $normData = $this->viewToNorm($viewData);

                // Hook to change content of the data in the normalized
                // representation
                if ($dispatcher->hasListeners(FormEvents::SUBMIT)) {
                    $event = new FormEvent($this, $normData);
                    $dispatcher->dispatch(FormEvents::SUBMIT, $event);
                    $normData = $event->getData();
                }

                // Synchronize representations - must not change the content!
                $modelData = $this->normToModel($normData);
                $viewData = $this->normToView($normData);
            }
        } catch (TransformationFailedException $e) {
            $this->synchronized = false;

            // If $viewData was not yet set, set it to $submittedData so that
            // the erroneous data is accessible on the form.
            // Forms that inherit data never set any data, because the getters
            // forward to the parent form's getters anyway.
            if (null === $viewData && !$this->config->getInheritData()) {
                $viewData = $submittedData;
            }
        }

        $this->submitted = true;
        $this->modelData = $modelData;
        $this->normData = $normData;
        $this->viewData = $viewData;

        if ($dispatcher->hasListeners(FormEvents::POST_SUBMIT)) {
            $event = new FormEvent($this, $viewData);
            $dispatcher->dispatch(FormEvents::POST_SUBMIT, $event);
        }

        return $this;
    }

    /**
     * Alias of {@link submit()}.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link submit()} instead.
     */
    public function bind($submittedData)
    {
        return $this->submit($submittedData);
    }

    /**
     * {@inheritdoc}
     */
    public function addError(FormError $error)
    {
        if ($this->parent && $this->config->getErrorBubbling()) {
            $this->parent->addError($error);
        } else {
            $this->errors[] = $error;
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function isSubmitted()
    {
        return $this->submitted;
    }

    /**
     * Alias of {@link isSubmitted()}.
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
     *             {@link isSubmitted()} instead.
     */
    public function isBound()
    {
        return $this->submitted;
    }

    /**
     * {@inheritdoc}
     */
    public function isSynchronized()
    {
        return $this->synchronized;
    }

    /**
     * {@inheritdoc}
     */
    public function isEmpty()
    {
        foreach ($this->children as $child) {
            if (!$child->isEmpty()) {
                return false;
            }
        }

        return FormUtil::isEmpty($this->modelData) ||
            // arrays, countables
            0 === count($this->modelData) ||
            // traversables that are not countable
            ($this->modelData instanceof \Traversable && 0 === iterator_count($this->modelData));
    }

    /**
     * {@inheritdoc}
     */
    public function isValid()
    {
        if (!$this->submitted) {
            return false;
        }

        if (count($this->errors) > 0) {
            return false;
        }

        if ($this->isDisabled()) {
            return true;
        }

        foreach ($this->children as $child) {
            if ($child->isSubmitted() && !$child->isValid()) {
                return false;
            }
        }

        return true;
    }

    /**
     * Returns the button that was used to submit the form.
     *
     * @return Button|null The clicked button or NULL if the form was not
     *                     submitted
     */
    public function getClickedButton()
    {
        if ($this->clickedButton) {
            return $this->clickedButton;
        }

        if ($this->parent && method_exists($this->parent, 'getClickedButton')) {
            return $this->parent->getClickedButton();
        }

        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function getErrors()
    {
        return $this->errors;
    }

    /**
     * Returns a string representation of all form errors (including children errors).
     *
     * This method should only be used to help debug a form.
     *
     * @param integer $level The indentation level (used internally)
     *
     * @return string A string representation of all errors
     */
    public function getErrorsAsString($level = 0)
    {
        $errors = '';
        foreach ($this->errors as $error) {
            $errors .= str_repeat(' ', $level).'ERROR: '.$error->getMessage()."\n";
        }

        foreach ($this->children as $key => $child) {
            $errors .= str_repeat(' ', $level).$key.":\n";
            if ($child instanceof self && $err = $child->getErrorsAsString($level + 4)) {
                $errors .= $err;
            } else {
                $errors .= str_repeat(' ', $level + 4)."No errors\n";
            }
        }

        return $errors;
    }

    /**
     * {@inheritdoc}
     */
    public function all()
    {
        return iterator_to_array($this->children);
    }

    /**
     * {@inheritdoc}
     */
    public function add($child, $type = null, array $options = array())
    {
        if ($this->submitted) {
            throw new AlreadySubmittedException('You cannot add children to a submitted form');
        }

        if (!$this->config->getCompound()) {
            throw new LogicException('You cannot add children to a simple form. Maybe you should set the option "compound" to true?');
        }

        // Obtain the view data
        $viewData = null;

        // If setData() is currently being called, there is no need to call
        // mapDataToForms() here, as mapDataToForms() is called at the end
        // of setData() anyway. Not doing this check leads to an endless
        // recursion when initializing the form lazily and an event listener
        // (such as ResizeFormListener) adds fields depending on the data:
        //
        //  * setData() is called, the form is not initialized yet
        //  * add() is called by the listener (setData() is not complete, so
        //    the form is still not initialized)
        //  * getViewData() is called
        //  * setData() is called since the form is not initialized yet
        //  * ... endless recursion ...
        //
        // Also skip data mapping if setData() has not been called yet.
        // setData() will be called upon form initialization and data mapping
        // will take place by then.
        if (!$this->lockSetData && $this->defaultDataSet && !$this->config->getInheritData()) {
            $viewData = $this->getViewData();
        }

        if (!$child instanceof FormInterface) {
            if (!is_string($child) && !is_int($child)) {
                throw new UnexpectedTypeException($child, 'string, integer or Symfony\Component\Form\FormInterface');
            }

            if (null !== $type && !is_string($type) && !$type instanceof FormTypeInterface) {
                throw new UnexpectedTypeException($type, 'string or Symfony\Component\Form\FormTypeInterface');
            }

            // Never initialize child forms automatically
            $options['auto_initialize'] = false;

            if (null === $type) {
                $child = $this->config->getFormFactory()->createForProperty($this->config->getDataClass(), $child, null, $options);
            } else {
                $child = $this->config->getFormFactory()->createNamed($child, $type, null, $options);
            }
        } elseif ($child->getConfig()->getAutoInitialize()) {
            throw new RuntimeException(sprintf(
                'Automatic initialization is only supported on root forms. You '.
                'should set the "auto_initialize" option to false on the field "%s".',
                $child->getName()
            ));
        }

        $this->children[$child->getName()] = $child;

        $child->setParent($this);

        if (!$this->lockSetData && $this->defaultDataSet && !$this->config->getInheritData()) {
            $iterator = new InheritDataAwareIterator(new \ArrayIterator(array($child)));
            $iterator = new \RecursiveIteratorIterator($iterator);
            $this->config->getDataMapper()->mapDataToForms($viewData, $iterator);
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function remove($name)
    {
        if ($this->submitted) {
            throw new AlreadySubmittedException('You cannot remove children from a submitted form');
        }

        if (isset($this->children[$name])) {
            $this->children[$name]->setParent(null);

            unset($this->children[$name]);
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function has($name)
    {
        return isset($this->children[$name]);
    }

    /**
     * {@inheritdoc}
     */
    public function get($name)
    {
        if (isset($this->children[$name])) {
            return $this->children[$name];
        }

        throw new OutOfBoundsException(sprintf('Child "%s" does not exist.', $name));
    }

    /**
     * Returns whether a child with the given name exists (implements the \ArrayAccess interface).
     *
     * @param string $name The name of the child
     *
     * @return Boolean
     */
    public function offsetExists($name)
    {
        return $this->has($name);
    }

    /**
     * Returns the child with the given name (implements the \ArrayAccess interface).
     *
     * @param string $name The name of the child
     *
     * @return FormInterface The child form
     *
     * @throws \OutOfBoundsException If the named child does not exist.
     */
    public function offsetGet($name)
    {
        return $this->get($name);
    }

    /**
     * Adds a child to the form (implements the \ArrayAccess interface).
     *
     * @param string        $name  Ignored. The name of the child is used.
     * @param FormInterface $child The child to be added.
     *
     * @throws AlreadySubmittedException If the form has already been submitted.
     * @throws LogicException            When trying to add a child to a non-compound form.
     *
     * @see self::add()
     */
    public function offsetSet($name, $child)
    {
        $this->add($child);
    }

    /**
     * Removes the child with the given name from the form (implements the \ArrayAccess interface).
     *
     * @param string $name The name of the child to remove
     *
     * @throws AlreadySubmittedException If the form has already been submitted.
     */
    public function offsetUnset($name)
    {
        $this->remove($name);
    }

    /**
     * Returns the iterator for this group.
     *
     * @return \Traversable
     */
    public function getIterator()
    {
        return $this->children;
    }

    /**
     * Returns the number of form children (implements the \Countable interface).
     *
     * @return integer The number of embedded form children
     */
    public function count()
    {
        return count($this->children);
    }

    /**
     * {@inheritdoc}
     */
    public function createView(FormView $parent = null)
    {
        if (null === $parent && $this->parent) {
            $parent = $this->parent->createView();
        }

        $type = $this->config->getType();
        $options = $this->config->getOptions();

        // The methods createView(), buildView() and finishView() are called
        // explicitly here in order to be able to override either of them
        // in a custom resolved form type.
        $view = $type->createView($this, $parent);

        $type->buildView($view, $this, $options);

        foreach ($this->children as $name => $child) {
            $view->children[$name] = $child->createView($view);
        }

        $type->finishView($view, $this, $options);

        return $view;
    }

    /**
     * Normalizes the value if a normalization transformer is set.
     *
     * @param mixed $value The value to transform
     *
     * @return mixed
     */
    private function modelToNorm($value)
    {
        foreach ($this->config->getModelTransformers() as $transformer) {
            $value = $transformer->transform($value);
        }

        return $value;
    }

    /**
     * Reverse transforms a value if a normalization transformer is set.
     *
     * @param string $value The value to reverse transform
     *
     * @return mixed
     */
    private function normToModel($value)
    {
        $transformers = $this->config->getModelTransformers();

        for ($i = count($transformers) - 1; $i >= 0; --$i) {
            $value = $transformers[$i]->reverseTransform($value);
        }

        return $value;
    }

    /**
     * Transforms the value if a value transformer is set.
     *
     * @param mixed $value The value to transform
     *
     * @return mixed
     */
    private function normToView($value)
    {
        // Scalar values should  be converted to strings to
        // facilitate differentiation between empty ("") and zero (0).
        // Only do this for simple forms, as the resulting value in
        // compound forms is passed to the data mapper and thus should
        // not be converted to a string before.
        if (!$this->config->getViewTransformers() && !$this->config->getCompound()) {
            return null === $value || is_scalar($value) ? (string) $value : $value;
        }

        foreach ($this->config->getViewTransformers() as $transformer) {
            $value = $transformer->transform($value);
        }

        return $value;
    }

    /**
     * Reverse transforms a value if a value transformer is set.
     *
     * @param string $value The value to reverse transform
     *
     * @return mixed
     */
    private function viewToNorm($value)
    {
        $transformers = $this->config->getViewTransformers();

        if (!$transformers) {
            return '' === $value ? null : $value;
        }

        for ($i = count($transformers) - 1; $i >= 0; --$i) {
            $value = $transformers[$i]->reverseTransform($value);
        }

        return $value;
    }
}
PKg`�\E1�'��9pear/Symfony/Component/Form/SubmitButtonTypeInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * A type that should be converted into a {@link SubmitButton} instance.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface SubmitButtonTypeInterface extends FormTypeInterface
{
}
PKg`�\ɃT���;pear/Symfony/Component/Form/FormFactoryBuilderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * A builder for FormFactoryInterface objects.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormFactoryBuilderInterface
{
    /**
     * Sets the factory for creating ResolvedFormTypeInterface instances.
     *
     * @param ResolvedFormTypeFactoryInterface $resolvedTypeFactory
     *
     * @return FormFactoryBuilderInterface The builder.
     */
    public function setResolvedTypeFactory(ResolvedFormTypeFactoryInterface $resolvedTypeFactory);

    /**
     * Adds an extension to be loaded by the factory.
     *
     * @param FormExtensionInterface $extension The extension.
     *
     * @return FormFactoryBuilderInterface The builder.
     */
    public function addExtension(FormExtensionInterface $extension);

    /**
     * Adds a list of extensions to be loaded by the factory.
     *
     * @param FormExtensionInterface[] $extensions The extensions.
     *
     * @return FormFactoryBuilderInterface The builder.
     */
    public function addExtensions(array $extensions);

    /**
     * Adds a form type to the factory.
     *
     * @param FormTypeInterface $type The form type.
     *
     * @return FormFactoryBuilderInterface The builder.
     */
    public function addType(FormTypeInterface $type);

    /**
     * Adds a list of form types to the factory.
     *
     * @param FormTypeInterface[] $types The form types.
     *
     * @return FormFactoryBuilderInterface The builder.
     */
    public function addTypes(array $types);

    /**
     * Adds a form type extension to the factory.
     *
     * @param FormTypeExtensionInterface $typeExtension The form type extension.
     *
     * @return FormFactoryBuilderInterface The builder.
     */
    public function addTypeExtension(FormTypeExtensionInterface $typeExtension);

    /**
     * Adds a list of form type extensions to the factory.
     *
     * @param FormTypeExtensionInterface[] $typeExtensions The form type extensions.
     *
     * @return FormFactoryBuilderInterface The builder.
     */
    public function addTypeExtensions(array $typeExtensions);

    /**
     * Adds a type guesser to the factory.
     *
     * @param FormTypeGuesserInterface $typeGuesser The type guesser.
     *
     * @return FormFactoryBuilderInterface The builder.
     */
    public function addTypeGuesser(FormTypeGuesserInterface $typeGuesser);

    /**
     * Adds a list of type guessers to the factory.
     *
     * @param FormTypeGuesserInterface[] $typeGuessers The type guessers.
     *
     * @return FormFactoryBuilderInterface The builder.
     */
    public function addTypeGuessers(array $typeGuessers);

    /**
     * Builds and returns the factory.
     *
     * @return FormFactoryInterface The form factory.
     */
    public function getFormFactory();
}
PKg`�\�0\ZZ3pear/Symfony/Component/Form/CallbackTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Exception\TransformationFailedException;

class CallbackTransformer implements DataTransformerInterface
{
    /**
     * The callback used for forward transform
     * @var \Closure
     */
    private $transform;

    /**
     * The callback used for reverse transform
     * @var \Closure
     */
    private $reverseTransform;

    /**
     * Constructor.
     *
     * @param \Closure $transform        The forward transform callback
     * @param \Closure $reverseTransform The reverse transform callback
     */
    public function __construct(\Closure $transform, \Closure $reverseTransform)
    {
        $this->transform = $transform;
        $this->reverseTransform = $reverseTransform;
    }

    /**
     * Transforms a value from the original representation to a transformed representation.
     *
     * @param mixed $data The value in the original representation
     *
     * @return mixed The value in the transformed representation
     *
     * @throws UnexpectedTypeException   when the argument is not a string
     * @throws TransformationFailedException  when the transformation fails
     */
    public function transform($data)
    {
        return call_user_func($this->transform, $data);
    }

    /**
     * Transforms a value from the transformed representation to its original
     * representation.
     *
     * @param mixed $data The value in the transformed representation
     *
     * @return mixed The value in the original representation
     *
     * @throws UnexpectedTypeException   when the argument is not of the expected type
     * @throws TransformationFailedException  when the transformation fails
     */
    public function reverseTransform($data)
    {
        return call_user_func($this->reverseTransform, $data);
    }
}
PKg`�\�%��Dpear/Symfony/Component/Form/Resources/translations/validators.lv.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Šajā veidlapā nevajadzētu būt papildus ievades laukiem.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Augšupielādētā faila izmērs bija par lielu. Lūdzu mēģiniet augšupielādēt mazāka izmēra failu.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>Dotais CSRF talons nav derīgs. Lūdzu mēģiniet vēlreiz iesniegt veidlapu.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKg`�\
b�8��Dpear/Symfony/Component/Form/Resources/translations/validators.hr.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Ovaj obrazac ne smije sadržavati dodatna polja.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Prenesena datoteka je prevelika. Molim pokušajte prenijeti manju datoteku.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF vrijednost nije ispravna. Pokušajte ponovo poslati obrazac.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKh`�\�V5Dpear/Symfony/Component/Form/Resources/translations/validators.fa.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>این فرم نباید فیلد اضافی داشته باشد.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>فایل بارگذاری شده بسیار بزرگ است. لطفا فایل کوچکتری را بارگزاری کنید.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>مقدار CSRF نامعتبر است. لطفا فرم را مجددا ارسال فرمایید..</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKh`�\y��99Dpear/Symfony/Component/Form/Resources/translations/validators.hy.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Այս ձևը չպետք է պարունակի լրացուցիչ տողեր.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Վերբեռնված ֆայլը չափազանց մեծ է: Խնդրվում է վերբեռնել ավելի փոքր չափսի ֆայլ.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF արժեքը անթույլատրելի է: Փորձեք նորից ուղարկել ձևը.</target>
            </trans-unit>
        </body>
    </file>
</xliff>PKi`�\S�*��Dpear/Symfony/Component/Form/Resources/translations/validators.et.xlfnu�[���<?xml version='1.0'?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Väljade grupp ei tohiks sisalda lisaväljasid.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Üleslaaditud fail oli liiga suur. Palun proovi uuesti väiksema failiga.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF-märgis on vigane. Palun proovi vormi uuesti esitada.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKi`�\��5��Dpear/Symfony/Component/Form/Resources/translations/validators.sl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Ta obrazec ne sme vsebovati dodatnih polj.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Naložena datoteka je prevelika. Prosimo, poizkusite naložiti manjšo.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF vrednost je napačna. Prosimo, ponovno pošljite obrazec.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKi`�\��n��Dpear/Symfony/Component/Form/Resources/translations/validators.en.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>This form should not contain extra fields.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>The uploaded file was too large. Please try to upload a smaller file.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>The CSRF token is invalid. Please try to resubmit the form.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKj`�\ �!���Dpear/Symfony/Component/Form/Resources/translations/validators.ca.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Aquest formulari no hauria de contenir camps addicionals.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>L'arxiu pujat és massa gran. Per favor, pugi un arxiu més petit.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>El token CSRF no és vàlid. Per favor, provi d'enviar novament el formulari.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKj`�\�8,:��Gpear/Symfony/Component/Form/Resources/translations/validators.zh_CN.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>该表单中不可有额外字段.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>上传文件太大, 请重新尝试上传一个较小的文件.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF 验证符无效, 请重新提交.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKj`�\�4@���Gpear/Symfony/Component/Form/Resources/translations/validators.pt_BR.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Este formulário não deve conter campos adicionais.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>O arquivo enviado é muito grande. Por favor, tente enviar um arquivo menor.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>O token CSRF é inválido. Por favor, tente reenviar o formulário.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKj`�\誫���Dpear/Symfony/Component/Form/Resources/translations/validators.sk.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Polia by nemali obsahovať ďalšie prvky.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Odoslaný súbor je príliš veľký. Prosím odošlite súbor s menšou veľkosťou.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF token je neplatný. Prosím skúste znovu odoslať formulár.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKk`�\be�@��Dpear/Symfony/Component/Form/Resources/translations/validators.hu.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Ez a mezőcsoport nem tartalmazhat extra mezőket.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>A feltöltött fájl túl nagy. Kérem próbáljon egy kisebb fájlt feltölteni.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>Érvénytelen CSRF token. Kérem próbálja újra elküldeni az űrlapot.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKk`�\X�����Dpear/Symfony/Component/Form/Resources/translations/validators.da.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Feltgruppen må ikke indeholde ekstra felter.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Den oploadede fil var for stor. Opload venligst en mindre fil.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF nøglen er ugyldig.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKk`�\���Dpear/Symfony/Component/Form/Resources/translations/validators.mn.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Форм нэмэлт талбар багтаах боломжгүй.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Upload хийсэн файл хэтэрхий том байна. Бага хэмжээтэй файл оруулна уу.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF token буруу байна. Формоо дахин илгээнэ үү.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKl`�\_��Dpear/Symfony/Component/Form/Resources/translations/validators.el.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Αυτή η φόρμα δεν πρέπει να περιέχει επιπλέον πεδία.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Το αρχείο είναι πολύ μεγάλο. Παρακαλούμε προσπαθήστε να ανεβάσετε ένα μικρότερο αρχείο.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>Το CSRF token δεν είναι έγκυρο. Παρακαλούμε δοκιμάστε να υποβάλετε τη φόρμα ξανά.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKl`�\�TI��Dpear/Symfony/Component/Form/Resources/translations/validators.de.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Dieses Formular sollte keine zusätzlichen Felder enthalten.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Die hochgeladene Datei ist zu groß. Versuchen Sie bitte eine kleinere Datei hochzuladen.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>Der CSRF-Token ist ungültig. Versuchen Sie bitte das Formular erneut zu senden.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKl`�\����Dpear/Symfony/Component/Form/Resources/translations/validators.fi.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This field group should not contain extra fields.</source>
                <target>Tämä kenttäryhmä ei voi sisältää ylimääräisiä kenttiä.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Ladattu tiedosto on liian iso. Ole hyvä ja lataa pienempi tiedosto.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF tarkiste on virheellinen. Olen hyvä ja yritä lähettää lomake uudestaan.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKm`�\E��d��Dpear/Symfony/Component/Form/Resources/translations/validators.ro.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Aceast formular nu ar trebui să conțină câmpuri suplimentare.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Fișierul încărcat a fost prea mare. Vă rugăm sa încărcați un fișier mai mic.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>Token-ul CSRF este invalid. Vă rugăm să trimiteți formularul incă o dată.</target>
            </trans-unit>
        </body>
    </file>
</xliff>PKm`�\|��CDpear/Symfony/Component/Form/Resources/translations/validators.ar.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>هذا النموذج يجب الا يحتوى على اى حقول اضافية.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>مساحة الملف المرسل كبيرة. من فضلك حاول ارسال ملف اصغر.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>قيمة رمز الموقع غير صحيحة. من فضلك اعد ارسال النموذج.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKm`�\r���Ipear/Symfony/Component/Form/Resources/translations/validators.sr_Latn.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Ovaj formular ne treba da sadrži dodatna polja.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Otpremljena datoteka je bila prevelika. Molim pokušajte otpremanje manje datoteke.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF vrednost je nevalidna. Pokušajte ponovo.</target>
            </trans-unit>
        </body>
    </file>
</xliff>PKm`�\��q��Dpear/Symfony/Component/Form/Resources/translations/validators.id.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Gabungan kolom tidak boleh mengandung kolom tambahan.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Berkas yang di unggah terlalu besar. Silahkan coba unggah berkas yang lebih kecil.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF-Token tidak sah. Silahkan coba kirim ulang formulir.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKn`�\���-��Dpear/Symfony/Component/Form/Resources/translations/validators.ru.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Эта форма не должна содержать дополнительных полей.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Загруженный файл слишком большой. Пожалуйста, попробуйте загрузить файл меньшего размера.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF значение недопустимо. Пожалуйста, попробуйте повторить отправку формы.</target>
            </trans-unit>
        </body>
    </file>
</xliff>PKn`�\NP\��Dpear/Symfony/Component/Form/Resources/translations/validators.he.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>הטופס לא צריך להכיל שדות נוספים.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>הקובץ שהועלה גדול מדי. נסה להעלות קובץ קטן יותר.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid.</source>
                <target>אסימון CSRF אינו חוקי.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKn`�\0h���Dpear/Symfony/Component/Form/Resources/translations/validators.es.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Este formulario no debería contener campos adicionales.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>El archivo subido es demasiado grande. Por favor, suba un archivo más pequeño.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>El token CSRF no es válido. Por favor, pruebe de enviar nuevamente el formulario.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKn`�\�<�yyDpear/Symfony/Component/Form/Resources/translations/validators.uk.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Ця форма не повинна містити додаткових полів.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Завантажений файл занадто великий. Будь-ласка, спробуйте завантажити файл меншого розміру.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF значення недопустиме. Будь-ласка, спробуйте відправити форму знову.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKn`�\�_8��Dpear/Symfony/Component/Form/Resources/translations/validators.fr.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Ce formulaire ne doit pas contenir des champs supplémentaires.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Le fichier téléchargé est trop volumineux. Merci d'essayer d'envoyer un fichier plus petit.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>Le jeton CSRF est invalide. Veuillez renvoyer le formulaire.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKn`�\s>�llDpear/Symfony/Component/Form/Resources/translations/validators.sv.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Formuläret kan inte innehålla extra fält.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Den uppladdade filen var för stor. Försök ladda upp en mindre fil.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid.</source>
                <target>CSRF-symbolen är inte giltig.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKo`�\�A�4��Dpear/Symfony/Component/Form/Resources/translations/validators.gl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Este formulario non debería conter campos adicionais.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>O arquivo subido é demasiado grande. Por favor, suba un arquivo máis pequeno.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>O token CSRF non é válido. Por favor, probe a enviar novamente o formulario.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKo`�\O���Dpear/Symfony/Component/Form/Resources/translations/validators.nl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Dit formulier mag geen extra velden bevatten.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Het geüploade bestand is te groot. Probeer een kleiner bestand te uploaden.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>De CSRF-token is ongeldig. Probeer het formulier opnieuw te versturen.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKo`�\္o33Ipear/Symfony/Component/Form/Resources/translations/validators.sr_Cyrl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Овај формулар не треба да садржи додатна поља.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Отпремљена датотека је била превелика. Молим покушајте отпремање мање датотеке.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF вредност је невалидна. Покушајте поново.</target>
            </trans-unit>
        </body>
    </file>
</xliff>PKo`�\:����Dpear/Symfony/Component/Form/Resources/translations/validators.pl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Ten formularz nie powinien zawierać dodatkowych pól.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Wgrany plik był za duży. Proszę spróbować wgrać mniejszy plik.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>Token CSRF jest nieprawidłowy. Proszę spróbować wysłać formularz ponownie.</target>
            </trans-unit>
        </body>
    </file>
</xliff>PKo`�\�*{���Dpear/Symfony/Component/Form/Resources/translations/validators.lb.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Dës Feldergrupp sollt keng zousätzlech Felder enthalen.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>De geschécktene Fichier ass ze grouss. Versicht wann ech gelift ee méi klenge Fichier eropzelueden.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>Den CSRF-Token ass ongëlteg. Versicht wann ech gelift de Formulaire nach eng Kéier ze schécken.</target>
            </trans-unit>
        </body>
    </file>
</xliff>PKo`�\�3Ե^^Dpear/Symfony/Component/Form/Resources/translations/validators.bg.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Тази форма не трябва да съдържа допълнителни полета.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Каченият файл е твърде голям. Моля, опитайте да качите по-малък файл.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>Невалиден CSRF токен. Моля, опитайте да изпратите формата отново.</target>
            </trans-unit>
        </body>
    </file>
</xliff>PKo`�\���Dpear/Symfony/Component/Form/Resources/translations/validators.ja.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>フィールドグループに追加のフィールドを含んではなりません。</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>アップロードされたファイルが大きすぎます。小さなファイルで再度アップロードしてください。</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid.</source>
                <target>CSRFトークンが無効です。</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKo`�\WgUuggDpear/Symfony/Component/Form/Resources/translations/validators.nb.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Feltgruppen må ikke inneholde ekstra felter.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Den opplastede file var for stor. Vennligst last opp en mindre fil.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid.</source>
                <target>CSRF nøkkelen er ugyldig.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKo`�\�
���Dpear/Symfony/Component/Form/Resources/translations/validators.cs.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Tato skupina polí nesmí obsahovat další pole.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Nahraný soubor je příliš velký. Nahrajte prosím menší soubor.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF token je neplatný. Zkuste prosím znovu odeslat formulář.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKp`�\�H�q��Dpear/Symfony/Component/Form/Resources/translations/validators.lt.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Forma negali turėti papildomų laukų.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Įkelta byla yra per didelė. bandykite įkelti mažesnę.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>CSRF kodas nepriimtinas. Bandykite siųsti formos užklausą dar kartą.</target>
            </trans-unit>
        </body>
    </file>
</xliff>PKp`�\ٻ��||Dpear/Symfony/Component/Form/Resources/translations/validators.eu.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Formulario honek ez luke aparteko eremurik eduki behar.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Igotako fitxategia handiegia da. Mesedez saiatu fitxategi txikiago bat igotzen.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid.</source>
                <target>CSFR tokena ez da egokia.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKp`�\��
���Dpear/Symfony/Component/Form/Resources/translations/validators.pt.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Este formulário não deveria conter campos extra.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>O arquivo enviado é muito grande. Por favor, tente enviar um ficheiro mais pequeno.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>O token CSRF é inválido. Por favor submeta o formulário novamente.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKp`�\!�aZ��Dpear/Symfony/Component/Form/Resources/translations/validators.it.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="28">
                <source>This form should not contain extra fields.</source>
                <target>Questo form non dovrebbe contenere nessun campo extra.</target>
            </trans-unit>
            <trans-unit id="29">
                <source>The uploaded file was too large. Please try to upload a smaller file.</source>
                <target>Il file caricato è troppo grande. Per favore caricare un file più piccolo.</target>
            </trans-unit>
            <trans-unit id="30">
                <source>The CSRF token is invalid. Please try to resubmit the form.</source>
                <target>Il token CSRF non è valido. Provare a reinviare il form.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKp`�\�xfh..;pear/Symfony/Component/Form/Resources/config/validation.xmlnu�[���<?xml version="1.0" ?>

<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">

  <class name="Symfony\Component\Form\Form">
    <constraint name="Symfony\Component\Form\Extension\Validator\Constraints\Form" />
    <property name="children">
        <constraint name="Valid" />
    </property>
  </class>
</constraint-mapping>
PKq`�\K'�$��+pear/Symfony/Component/Form/FormBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\Form\Exception\BadMethodCallException;
use Symfony\Component\Form\Exception\InvalidArgumentException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * A builder for creating {@link Form} instances.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormBuilder extends FormConfigBuilder implements \IteratorAggregate, FormBuilderInterface
{
    /**
     * The children of the form builder.
     *
     * @var FormBuilderInterface[]
     */
    private $children = array();

    /**
     * The data of children who haven't been converted to form builders yet.
     *
     * @var array
     */
    private $unresolvedChildren = array();

    /**
     * Creates a new form builder.
     *
     * @param string                   $name
     * @param string                   $dataClass
     * @param EventDispatcherInterface $dispatcher
     * @param FormFactoryInterface     $factory
     * @param array                    $options
     */
    public function __construct($name, $dataClass, EventDispatcherInterface $dispatcher, FormFactoryInterface $factory, array $options = array())
    {
        parent::__construct($name, $dataClass, $dispatcher, $options);

        $this->setFormFactory($factory);
    }

    /**
     * {@inheritdoc}
     */
    public function add($child, $type = null, array $options = array())
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        if ($child instanceof self) {
            $this->children[$child->getName()] = $child;

            // In case an unresolved child with the same name exists
            unset($this->unresolvedChildren[$child->getName()]);

            return $this;
        }

        if (!is_string($child) && !is_int($child)) {
            throw new UnexpectedTypeException($child, 'string, integer or Symfony\Component\Form\FormBuilder');
        }

        if (null !== $type && !is_string($type) && !$type instanceof FormTypeInterface) {
            throw new UnexpectedTypeException($type, 'string or Symfony\Component\Form\FormTypeInterface');
        }

        // Add to "children" to maintain order
        $this->children[$child] = null;
        $this->unresolvedChildren[$child] = array(
            'type'    => $type,
            'options' => $options,
        );

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function create($name, $type = null, array $options = array())
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        if (null === $type && null === $this->getDataClass()) {
            $type = 'text';
        }

        if (null !== $type) {
            return $this->getFormFactory()->createNamedBuilder($name, $type, null, $options);
        }

        return $this->getFormFactory()->createBuilderForProperty($this->getDataClass(), $name, null, $options);
    }

    /**
     * {@inheritdoc}
     */
    public function get($name)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        if (isset($this->unresolvedChildren[$name])) {
            return $this->resolveChild($name);
        }

        if (isset($this->children[$name])) {
            return $this->children[$name];
        }

        throw new InvalidArgumentException(sprintf('The child with the name "%s" does not exist.', $name));
    }

    /**
     * {@inheritdoc}
     */
    public function remove($name)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        unset($this->unresolvedChildren[$name]);

        if (array_key_exists($name, $this->children)) {
            unset($this->children[$name]);
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function has($name)
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        if (isset($this->unresolvedChildren[$name])) {
            return true;
        }

        if (isset($this->children[$name])) {
            return true;
        }

        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function all()
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->resolveChildren();

        return $this->children;
    }

    /**
     * {@inheritdoc}
     */
    public function count()
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        return count($this->children);
    }

    /**
     * {@inheritdoc}
     */
    public function getFormConfig()
    {
        $config = parent::getFormConfig();

        $config->children = array();
        $config->unresolvedChildren = array();

        return $config;
    }

    /**
     * {@inheritdoc}
     */
    public function getForm()
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        $this->resolveChildren();

        $form = new Form($this->getFormConfig());

        foreach ($this->children as $child) {
            // Automatic initialization is only supported on root forms
            $form->add($child->setAutoInitialize(false)->getForm());
        }

        if ($this->getAutoInitialize()) {
            // Automatically initialize the form if it is configured so
            $form->initialize();
        }

        return $form;
    }

    /**
     * {@inheritdoc}
     */
    public function getIterator()
    {
        if ($this->locked) {
            throw new BadMethodCallException('FormBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance.');
        }

        return new \ArrayIterator($this->children);
    }

    /**
     * Converts an unresolved child into a {@link FormBuilder} instance.
     *
     * @param  string $name The name of the unresolved child.
     *
     * @return FormBuilder The created instance.
     */
    private function resolveChild($name)
    {
        $info = $this->unresolvedChildren[$name];
        $child = $this->create($name, $info['type'], $info['options']);
        $this->children[$name] = $child;
        unset($this->unresolvedChildren[$name]);

        return $child;
    }

    /**
     * Converts all unresolved children into {@link FormBuilder} instances.
     */
    private function resolveChildren()
    {
        foreach ($this->unresolvedChildren as $name => $info) {
            $this->children[$name] = $this->create($name, $info['type'], $info['options']);
        }

        $this->unresolvedChildren = array();
    }
}
PKr`�\�QT�pp3pear/Symfony/Component/Form/SubmitButtonBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * A builder for {@link SubmitButton} instances.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class SubmitButtonBuilder extends ButtonBuilder
{
    /**
     * Creates the button.
     *
     * @return SubmitButton The button
     */
    public function getForm()
    {
        return new SubmitButton($this->getFormConfig());
    }
}
PKr`�\���C��5pear/Symfony/Component/Form/AbstractTypeExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class AbstractTypeExtension implements FormTypeExtensionInterface
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
    }
}
PKr`�\�>���5pear/Symfony/Component/Form/FormRegistryInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form;

/**
 * The central registry of the Form component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface FormRegistryInterface
{
    /**
     * Returns a form type by name.
     *
     * This methods registers the type extensions from the form extensions.
     *
     * @param string $name The name of the type
     *
     * @return ResolvedFormTypeInterface The type
     *
     * @throws Exception\UnexpectedTypeException  if the passed name is not a string
     * @throws Exception\InvalidArgumentException if the type can not be retrieved from any extension
     */
    public function getType($name);

    /**
     * Returns whether the given form type is supported.
     *
     * @param string $name The name of the type
     *
     * @return Boolean Whether the type is supported
     */
    public function hasType($name);

    /**
     * Returns the guesser responsible for guessing types.
     *
     * @return FormTypeGuesserInterface|null
     */
    public function getTypeGuesser();

    /**
     * Returns the extensions loaded by the framework.
     *
     * @return FormExtensionInterface[]
     */
    public function getExtensions();
}
PKr`�\y>�8��6pear/Symfony/Component/Process/PhpExecutableFinder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process;

/**
 * An executable finder specifically designed for the PHP executable.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class PhpExecutableFinder
{
    private $executableFinder;

    public function __construct()
    {
        $this->executableFinder = new ExecutableFinder();
    }

    /**
     * Finds The PHP executable.
     *
     * @return string|false The PHP executable path or false if it cannot be found
     */
    public function find()
    {
        // HHVM support
        if (defined('HHVM_VERSION') && false !== $hhvm = getenv('PHP_BINARY')) {
            return $hhvm;
        }

        // PHP_BINARY return the current sapi executable
        if (defined('PHP_BINARY') && PHP_BINARY && in_array(PHP_SAPI, array('cli', 'cli-server')) && is_file(PHP_BINARY)) {
            return PHP_BINARY;
        }

        if ($php = getenv('PHP_PATH')) {
            if (!is_executable($php)) {
                return false;
            }

            return $php;
        }

        if ($php = getenv('PHP_PEAR_PHP_BIN')) {
            if (is_executable($php)) {
                return $php;
            }
        }

        $dirs = array(PHP_BINDIR);
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $dirs[] = 'C:\xampp\php\\';
        }

        return $this->executableFinder->find('php', false, $dirs);
    }
}
PKs`�\�!,$

3pear/Symfony/Component/Process/ExecutableFinder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process;

/**
 * Generic executable finder.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ExecutableFinder
{
    private $suffixes = array('.exe', '.bat', '.cmd', '.com');

    /**
     * Replaces default suffixes of executable.
     *
     * @param array $suffixes
     */
    public function setSuffixes(array $suffixes)
    {
        $this->suffixes = $suffixes;
    }

    /**
     * Adds new possible suffix to check for executable.
     *
     * @param string $suffix
     */
    public function addSuffix($suffix)
    {
        $this->suffixes[] = $suffix;
    }

    /**
     * Finds an executable by name.
     *
     * @param string $name      The executable name (without the extension)
     * @param string $default   The default to return if no executable is found
     * @param array  $extraDirs Additional dirs to check into
     *
     * @return string The executable path or default value
     */
    public function find($name, $default = null, array $extraDirs = array())
    {
        if (ini_get('open_basedir')) {
            $searchPath = explode(PATH_SEPARATOR, getenv('open_basedir'));
            $dirs = array();
            foreach ($searchPath as $path) {
                if (is_dir($path)) {
                    $dirs[] = $path;
                } else {
                    $file = str_replace(dirname($path), '', $path);
                    if ($file == $name && is_executable($path)) {
                        return $path;
                    }
                }
            }
        } else {
            $dirs = array_merge(
                explode(PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')),
                $extraDirs
            );
        }

        $suffixes = array('');
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $pathExt = getenv('PATHEXT');
            $suffixes = $pathExt ? explode(PATH_SEPARATOR, $pathExt) : $this->suffixes;
        }
        foreach ($suffixes as $suffix) {
            foreach ($dirs as $dir) {
                if (is_file($file = $dir.DIRECTORY_SEPARATOR.$name.$suffix) && (defined('PHP_WINDOWS_VERSION_BUILD') || is_executable($file))) {
                    return $file;
                }
            }
        }

        return $default;
    }
}
PKs`�\@s�-pear/Symfony/Component/Process/PhpProcess.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process;

use Symfony\Component\Process\Exception\RuntimeException;

/**
 * PhpProcess runs a PHP script in an independent process.
 *
 * $p = new PhpProcess('<?php echo "foo"; ?>');
 * $p->run();
 * print $p->getOutput()."\n";
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class PhpProcess extends Process
{
    private $executableFinder;

    /**
     * Constructor.
     *
     * @param string  $script  The PHP script to run (as a string)
     * @param string  $cwd     The working directory
     * @param array   $env     The environment variables
     * @param integer $timeout The timeout in seconds
     * @param array   $options An array of options for proc_open
     *
     * @api
     */
    public function __construct($script, $cwd = null, array $env = array(), $timeout = 60, array $options = array())
    {
        parent::__construct(null, $cwd, $env, $script, $timeout, $options);

        $this->executableFinder = new PhpExecutableFinder();
    }

    /**
     * Sets the path to the PHP binary to use.
     *
     * @api
     */
    public function setPhpBinary($php)
    {
        $this->setCommandLine($php);
    }

    /**
     * {@inheritdoc}
     */
    public function start($callback = null)
    {
        if (null === $this->getCommandLine()) {
            if (false === $php = $this->executableFinder->find()) {
                throw new RuntimeException('Unable to find the PHP executable.');
            }
            $this->setCommandLine($php);
        }

        parent::start($callback);
    }
}
PKs`�\!/���1pear/Symfony/Component/Process/ProcessBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process;

use Symfony\Component\Process\Exception\InvalidArgumentException;
use Symfony\Component\Process\Exception\LogicException;

/**
 * Process builder.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 */
class ProcessBuilder
{
    private $arguments;
    private $cwd;
    private $env = array();
    private $stdin;
    private $timeout = 60;
    private $options = array();
    private $inheritEnv = true;
    private $prefix = array();

    public function __construct(array $arguments = array())
    {
        $this->arguments = $arguments;
    }

    public static function create(array $arguments = array())
    {
        return new static($arguments);
    }

    /**
     * Adds an unescaped argument to the command string.
     *
     * @param string $argument A command argument
     *
     * @return ProcessBuilder
     */
    public function add($argument)
    {
        $this->arguments[] = $argument;

        return $this;
    }

    /**
     * Adds an unescaped prefix to the command string.
     *
     * The prefix is preserved when resetting arguments.
     *
     * @param string|array $prefix A command prefix or an array of command prefixes
     *
     * @return ProcessBuilder
     */
    public function setPrefix($prefix)
    {
        $this->prefix = is_array($prefix) ? $prefix : array($prefix);

        return $this;
    }

    /**
     * @param array $arguments
     *
     * @return ProcessBuilder
     */
    public function setArguments(array $arguments)
    {
        $this->arguments = $arguments;

        return $this;
    }

    public function setWorkingDirectory($cwd)
    {
        $this->cwd = $cwd;

        return $this;
    }

    public function inheritEnvironmentVariables($inheritEnv = true)
    {
        $this->inheritEnv = $inheritEnv;

        return $this;
    }

    public function setEnv($name, $value)
    {
        $this->env[$name] = $value;

        return $this;
    }

    public function addEnvironmentVariables(array $variables)
    {
        $this->env = array_replace($this->env, $variables);

        return $this;
    }

    public function setInput($stdin)
    {
        $this->stdin = $stdin;

        return $this;
    }

    /**
     * Sets the process timeout.
     *
     * To disable the timeout, set this value to null.
     *
     * @param float|null
     *
     * @return ProcessBuilder
     *
     * @throws InvalidArgumentException
     */
    public function setTimeout($timeout)
    {
        if (null === $timeout) {
            $this->timeout = null;

            return $this;
        }

        $timeout = (float) $timeout;

        if ($timeout < 0) {
            throw new InvalidArgumentException('The timeout value must be a valid positive integer or float number.');
        }

        $this->timeout = $timeout;

        return $this;
    }

    public function setOption($name, $value)
    {
        $this->options[$name] = $value;

        return $this;
    }

    public function getProcess()
    {
        if (0 === count($this->prefix) && 0 === count($this->arguments)) {
            throw new LogicException('You must add() command arguments before calling getProcess().');
        }

        $options = $this->options;

        $arguments = array_merge($this->prefix, $this->arguments);
        $script = implode(' ', array_map(array(__NAMESPACE__.'\\ProcessUtils', 'escapeArgument'), $arguments));

        if ($this->inheritEnv) {
            // include $_ENV for BC purposes
            $env = array_replace($_ENV, $_SERVER, $this->env);
        } else {
            $env = $this->env;
        }

        return new Process($script, $this->cwd, $env, $this->stdin, $this->timeout, $options);
    }
}
PKs`�\0���QQ-pear/Symfony/Component/Process/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Process\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PKt`�\��W��;pear/Symfony/Component/Process/Exception/LogicException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Exception;

/**
 * LogicException for the Process Component.
 *
 * @author Romain Neutron <imprec@gmail.com>
 */
class LogicException extends \LogicException implements ExceptionInterface
{
}
PKt`�\>H����=pear/Symfony/Component/Process/Exception/RuntimeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Exception;

/**
 * RuntimeException for the Process Component.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
PKt`�\�<���?pear/Symfony/Component/Process/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Exception;

/**
 * Marker Interface for the Process Component.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface ExceptionInterface
{
}
PKt`�\��_��Cpear/Symfony/Component/Process/Exception/ProcessFailedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Exception;

use Symfony\Component\Process\Process;

/**
 * Exception for failed processes.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ProcessFailedException extends RuntimeException
{
    private $process;

    public function __construct(Process $process)
    {
        if ($process->isSuccessful()) {
            throw new InvalidArgumentException('Expected a failed process, but the given process was successful.');
        }

        parent::__construct(
            sprintf(
                'The command "%s" failed.'."\nExit Code: %s(%s)\n\nOutput:\n================\n%s\n\nError Output:\n================\n%s",
                $process->getCommandLine(),
                $process->getExitCode(),
                $process->getExitCodeText(),
                $process->getOutput(),
                $process->getErrorOutput()
            )
        );

        $this->process = $process;
    }

    public function getProcess()
    {
        return $this->process;
    }
}
PKu`�\˅����Epear/Symfony/Component/Process/Exception/InvalidArgumentException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Exception;

/**
 * InvalidArgumentException for the Process Component.
 *
 * @author Romain Neutron <imprec@gmail.com>
 */
class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
PKu`�\��2�{{Epear/Symfony/Component/Process/Exception/ProcessTimedOutException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Exception;

use Symfony\Component\Process\Process;

/**
 * Exception that is thrown when a process times out.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ProcessTimedOutException extends RuntimeException
{
    const TYPE_GENERAL = 1;
    const TYPE_IDLE = 2;

    private $process;
    private $timeoutType;

    public function __construct(Process $process, $timeoutType)
    {
        $this->process = $process;
        $this->timeoutType = $timeoutType;

        parent::__construct(sprintf(
            'The process "%s" exceeded the timeout of %s seconds.',
            $process->getCommandLine(),
            $this->getExceededTimeout()
        ));
    }

    public function getProcess()
    {
        return $this->process;
    }

    public function isGeneralTimeout()
    {
        return $this->timeoutType === self::TYPE_GENERAL;
    }

    public function isIdleTimeout()
    {
        return $this->timeoutType === self::TYPE_IDLE;
    }

    public function getExceededTimeout()
    {
        switch ($this->timeoutType) {
            case self::TYPE_GENERAL:
                return $this->process->getTimeout();

            case self::TYPE_IDLE:
                return $this->process->getIdleTimeout();

            default:
                throw new \LogicException(sprintf('Unknown timeout type "%d".', $this->timeoutType));
        }
    }
}
PKu`�\g��'�'/pear/Symfony/Component/Process/ProcessPipes.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process;

use Symfony\Component\Process\Exception\RuntimeException;

/**
 * ProcessPipes manages descriptors and pipes for the use of proc_open.
 */
class ProcessPipes
{
    /** @var array */
    public $pipes = array();
    /** @var array */
    private $files = array();
    /** @var array */
    private $fileHandles = array();
    /** @var array */
    private $readBytes = array();
    /** @var Boolean */
    private $useFiles;
    /** @var Boolean */
    private $ttyMode;

    const CHUNK_SIZE = 16384;

    public function __construct($useFiles, $ttyMode)
    {
        $this->useFiles = (Boolean) $useFiles;
        $this->ttyMode = (Boolean) $ttyMode;

        // Fix for PHP bug #51800: reading from STDOUT pipe hangs forever on Windows if the output is too big.
        // Workaround for this problem is to use temporary files instead of pipes on Windows platform.
        //
        // @see https://bugs.php.net/bug.php?id=51800
        if ($this->useFiles) {
            $this->files = array(
                Process::STDOUT => tempnam(sys_get_temp_dir(), 'sf_proc_stdout'),
                Process::STDERR => tempnam(sys_get_temp_dir(), 'sf_proc_stderr'),
            );
            foreach ($this->files as $offset => $file) {
                $this->fileHandles[$offset] = fopen($this->files[$offset], 'rb');
                if (false === $this->fileHandles[$offset]) {
                    throw new RuntimeException('A temporary file could not be opened to write the process output to, verify that your TEMP environment variable is writable');
                }
            }
            $this->readBytes = array(
                Process::STDOUT => 0,
                Process::STDERR => 0,
            );
        }
    }

    public function __destruct()
    {
        $this->close();
        $this->removeFiles();
    }

    /**
     * Sets non-blocking mode on pipes.
     */
    public function unblock()
    {
        foreach ($this->pipes as $pipe) {
            stream_set_blocking($pipe, 0);
        }
    }

    /**
     * Closes file handles and pipes.
     */
    public function close()
    {
        $this->closeUnixPipes();
        foreach ($this->fileHandles as $handle) {
            fclose($handle);
        }
        $this->fileHandles = array();
    }

    /**
     * Closes Unix pipes.
     *
     * Nothing happens in case file handles are used.
     */
    public function closeUnixPipes()
    {
        foreach ($this->pipes as $pipe) {
            fclose($pipe);
        }
        $this->pipes = array();
    }

    /**
     * Returns an array of descriptors for the use of proc_open.
     *
     * @return array
     */
    public function getDescriptors()
    {
        if ($this->useFiles) {
            // We're not using pipe on Windows platform as it hangs (https://bugs.php.net/bug.php?id=51800)
            // We're not using file handles as it can produce corrupted output https://bugs.php.net/bug.php?id=65650
            // So we redirect output within the commandline and pass the nul device to the process
            return array(
                array('pipe', 'r'),
                array('file', 'NUL', 'w'),
                array('file', 'NUL', 'w'),
            );
        }

        if ($this->ttyMode) {
            return array(
                array('file', '/dev/tty', 'r'),
                array('file', '/dev/tty', 'w'),
                array('file', '/dev/tty', 'w'),
            );
        }

        return array(
            array('pipe', 'r'), // stdin
            array('pipe', 'w'), // stdout
            array('pipe', 'w'), // stderr
        );
    }

    /**
     * Returns an array of filenames indexed by their related stream in case these pipes use temporary files.
     *
     * @return array
     */
    public function getFiles()
    {
        if ($this->useFiles) {
            return $this->files;
        }

        return array();
    }

    /**
     * Reads data in file handles and pipes.
     *
     * @param Boolean $blocking Whether to use blocking calls or not.
     *
     * @return array An array of read data indexed by their fd.
     */
    public function read($blocking)
    {
        return array_replace($this->readStreams($blocking), $this->readFileHandles());
    }

    /**
     * Reads data in file handles and pipes, closes them if EOF is reached.
     *
     * @param Boolean $blocking Whether to use blocking calls or not.
     *
     * @return array An array of read data indexed by their fd.
     */
    public function readAndCloseHandles($blocking)
    {
        return array_replace($this->readStreams($blocking, true), $this->readFileHandles(true));
    }

    /**
     * Returns if the current state has open file handles or pipes.
     *
     * @return Boolean
     */
    public function hasOpenHandles()
    {
        if (!$this->useFiles) {
            return (Boolean) $this->pipes;
        }

        return (Boolean) $this->pipes && (Boolean) $this->fileHandles;
    }

    /**
     * Writes stdin data.
     *
     * @param Boolean     $blocking Whether to use blocking calls or not.
     * @param string|null $stdin    The data to write.
     */
    public function write($blocking, $stdin)
    {
        if (null === $stdin) {
            fclose($this->pipes[0]);
            unset($this->pipes[0]);

            return;
        }

        $writePipes = array($this->pipes[0]);
        unset($this->pipes[0]);
        $stdinLen = strlen($stdin);
        $stdinOffset = 0;

        while ($writePipes) {
            $r = null;
            $w = $writePipes;
            $e = null;

            if (false === $n = @stream_select($r, $w, $e, 0, $blocking ? ceil(Process::TIMEOUT_PRECISION * 1E6) : 0)) {
                // if a system call has been interrupted, forget about it, let's try again
                if ($this->hasSystemCallBeenInterrupted()) {
                    continue;
                }
                break;
            }

            // nothing has changed, let's wait until the process is ready
            if (0 === $n) {
                continue;
            }

            if ($w) {
                $written = fwrite($writePipes[0], (binary) substr($stdin, $stdinOffset), 8192);
                if (false !== $written) {
                    $stdinOffset += $written;
                }
                if ($stdinOffset >= $stdinLen) {
                    fclose($writePipes[0]);
                    $writePipes = null;
                }
            }
        }
    }

    /**
     * Reads data in file handles.
     *
     * @param Boolean $close Whether to close file handles or not.
     *
     * @return array An array of read data indexed by their fd.
     */
    private function readFileHandles($close = false)
    {
        $read = array();
        $fh = $this->fileHandles;
        foreach ($fh as $type => $fileHandle) {
            if (0 !== fseek($fileHandle, $this->readBytes[$type])) {
                continue;
            }
            $data = '';
            $dataread = null;
            while (!feof($fileHandle)) {
                if (false !== $dataread = fread($fileHandle, self::CHUNK_SIZE)) {
                    $data .= $dataread;
                }
            }
            if (0 < $length = strlen($data)) {
                $this->readBytes[$type] += $length;
                $read[$type] = $data;
            }

            if (false === $dataread || (true === $close && feof($fileHandle) && '' === $data)) {
                fclose($this->fileHandles[$type]);
                unset($this->fileHandles[$type]);
            }
        }

        return $read;
    }

    /**
     * Reads data in file pipes streams.
     *
     * @param Boolean $blocking Whether to use blocking calls or not.
     * @param Boolean $close    Whether to close file handles or not.
     *
     * @return array An array of read data indexed by their fd.
     */
    private function readStreams($blocking, $close = false)
    {
        if (empty($this->pipes)) {
            return array();
        }

        $read = array();

        $r = $this->pipes;
        $w = null;
        $e = null;

        // let's have a look if something changed in streams
        if (false === $n = @stream_select($r, $w, $e, 0, $blocking ? ceil(Process::TIMEOUT_PRECISION * 1E6) : 0)) {
            // if a system call has been interrupted, forget about it, let's try again
            // otherwise, an error occurred, let's reset pipes
            if (!$this->hasSystemCallBeenInterrupted()) {
                $this->pipes = array();
            }

            return $read;
        }

        // nothing has changed
        if (0 === $n) {
            return $read;
        }

        foreach ($r as $pipe) {
            $type = array_search($pipe, $this->pipes);

            $data = '';
            while ($dataread = fread($pipe, self::CHUNK_SIZE)) {
                $data .= $dataread;
            }

            if ($data) {
                $read[$type] = $data;
            }

            if (false === $data || (true === $close && feof($pipe) && '' === $data)) {
                fclose($this->pipes[$type]);
                unset($this->pipes[$type]);
            }
        }

        return $read;
    }

    /**
     * Returns true if a system call has been interrupted.
     *
     * @return Boolean
     */
    private function hasSystemCallBeenInterrupted()
    {
        $lastError = error_get_last();

        // stream_select returns false when the `select` system call is interrupted by an incoming signal
        return isset($lastError['message']) && false !== stripos($lastError['message'], 'interrupted system call');
    }

    /**
     * Removes temporary files
     */
    private function removeFiles()
    {
        foreach ($this->files as $filename) {
            if (file_exists($filename)) {
                @unlink($filename);
            }
        }
        $this->files = array();
    }
}
PKu`�\�nL	L	/pear/Symfony/Component/Process/ProcessUtils.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process;

/**
 * ProcessUtils is a bunch of utility methods.
 *
 * This class contains static methods only and is not meant to be instantiated.
 *
 * @author Martin Hasoň <martin.hason@gmail.com>
 */
class ProcessUtils
{
    /**
     * This class should not be instantiated
     */
    private function __construct()
    {
    }

    /**
     * Escapes a string to be used as a shell argument.
     *
     * @param string $argument The argument that will be escaped
     *
     * @return string The escaped argument
     */
    public static function escapeArgument($argument)
    {
        //Fix for PHP bug #43784 escapeshellarg removes % from given string
        //Fix for PHP bug #49446 escapeshellarg doesn't work on Windows
        //@see https://bugs.php.net/bug.php?id=43784
        //@see https://bugs.php.net/bug.php?id=49446
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            if ('' === $argument) {
                return escapeshellarg($argument);
            }

            $escapedArgument = '';
            $quote =  false;
            foreach (preg_split('/(")/i', $argument, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) as $part) {
                if ('"' === $part) {
                    $escapedArgument .= '\\"';
                } elseif (self::isSurroundedBy($part, '%')) {
                    // Avoid environment variable expansion
                    $escapedArgument .= '^%"'.substr($part, 1, -1).'"^%';
                } else {
                    // escape trailing backslash
                    if ('\\' === substr($part, -1)) {
                        $part .= '\\';
                    }
                    $quote = true;
                    $escapedArgument .= $part;
                }
            }
            if ($quote) {
                $escapedArgument = '"'.$escapedArgument.'"';
            }

            return $escapedArgument;
        }

        return escapeshellarg($argument);
    }

    private static function isSurroundedBy($arg, $char)
    {
        return 2 < strlen($arg) && $char === $arg[0] && $char === $arg[strlen($arg) - 1];
    }
}
PKu`�\��M��*pear/Symfony/Component/Process/Process.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process;

use Symfony\Component\Process\Exception\InvalidArgumentException;
use Symfony\Component\Process\Exception\LogicException;
use Symfony\Component\Process\Exception\ProcessTimedOutException;
use Symfony\Component\Process\Exception\RuntimeException;

/**
 * Process is a thin wrapper around proc_* functions to easily
 * start independent PHP processes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Process
{
    const ERR = 'err';
    const OUT = 'out';

    const STATUS_READY = 'ready';
    const STATUS_STARTED = 'started';
    const STATUS_TERMINATED = 'terminated';

    const STDIN = 0;
    const STDOUT = 1;
    const STDERR = 2;

    // Timeout Precision in seconds.
    const TIMEOUT_PRECISION = 0.2;

    private $callback;
    private $commandline;
    private $cwd;
    private $env;
    private $stdin;
    private $starttime;
    private $lastOutputTime;
    private $timeout;
    private $idleTimeout;
    private $options;
    private $exitcode;
    private $fallbackExitcode;
    private $processInformation;
    private $stdout;
    private $stderr;
    private $enhanceWindowsCompatibility;
    private $enhanceSigchildCompatibility;
    private $process;
    private $status = self::STATUS_READY;
    private $incrementalOutputOffset = 0;
    private $incrementalErrorOutputOffset = 0;
    private $tty;

    private $useFileHandles = false;
    /** @var ProcessPipes */
    private $processPipes;

    private static $sigchild;

    /**
     * Exit codes translation table.
     *
     * User-defined errors must use exit codes in the 64-113 range.
     *
     * @var array
     */
    public static $exitCodes = array(
        0 => 'OK',
        1 => 'General error',
        2 => 'Misuse of shell builtins',

        126 => 'Invoked command cannot execute',
        127 => 'Command not found',
        128 => 'Invalid exit argument',

        // signals
        129 => 'Hangup',
        130 => 'Interrupt',
        131 => 'Quit and dump core',
        132 => 'Illegal instruction',
        133 => 'Trace/breakpoint trap',
        134 => 'Process aborted',
        135 => 'Bus error: "access to undefined portion of memory object"',
        136 => 'Floating point exception: "erroneous arithmetic operation"',
        137 => 'Kill (terminate immediately)',
        138 => 'User-defined 1',
        139 => 'Segmentation violation',
        140 => 'User-defined 2',
        141 => 'Write to pipe with no one reading',
        142 => 'Signal raised by alarm',
        143 => 'Termination (request to terminate)',
        // 144 - not defined
        145 => 'Child process terminated, stopped (or continued*)',
        146 => 'Continue if stopped',
        147 => 'Stop executing temporarily',
        148 => 'Terminal stop signal',
        149 => 'Background process attempting to read from tty ("in")',
        150 => 'Background process attempting to write to tty ("out")',
        151 => 'Urgent data available on socket',
        152 => 'CPU time limit exceeded',
        153 => 'File size limit exceeded',
        154 => 'Signal raised by timer counting virtual time: "virtual timer expired"',
        155 => 'Profiling timer expired',
        // 156 - not defined
        157 => 'Pollable event',
        // 158 - not defined
        159 => 'Bad syscall',
    );

    /**
     * Constructor.
     *
     * @param string             $commandline The command line to run
     * @param string|null        $cwd         The working directory or null to use the working dir of the current PHP process
     * @param array|null         $env         The environment variables or null to inherit
     * @param string|null        $stdin       The STDIN content
     * @param integer|float|null $timeout     The timeout in seconds or null to disable
     * @param array              $options     An array of options for proc_open
     *
     * @throws RuntimeException When proc_open is not installed
     *
     * @api
     */
    public function __construct($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array())
    {
        if (!function_exists('proc_open')) {
            throw new RuntimeException('The Process class relies on proc_open, which is not available on your PHP installation.');
        }

        $this->commandline = $commandline;
        $this->cwd = $cwd;

        // on Windows, if the cwd changed via chdir(), proc_open defaults to the dir where PHP was started
        // on Gnu/Linux, PHP builds with --enable-maintainer-zts are also affected
        // @see : https://bugs.php.net/bug.php?id=51800
        // @see : https://bugs.php.net/bug.php?id=50524

        if (null === $this->cwd && (defined('ZEND_THREAD_SAFE') || defined('PHP_WINDOWS_VERSION_BUILD'))) {
            $this->cwd = getcwd();
        }
        if (null !== $env) {
            $this->setEnv($env);
        } else {
            $this->env = null;
        }
        $this->stdin = $stdin;
        $this->setTimeout($timeout);
        $this->useFileHandles = defined('PHP_WINDOWS_VERSION_BUILD');
        $this->enhanceWindowsCompatibility = true;
        $this->enhanceSigchildCompatibility = !defined('PHP_WINDOWS_VERSION_BUILD') && $this->isSigchildEnabled();
        $this->options = array_replace(array('suppress_errors' => true, 'binary_pipes' => true), $options);
    }

    public function __destruct()
    {
        // stop() will check if we have a process running.
        $this->stop();
    }

    public function __clone()
    {
        $this->resetProcessData();
    }

    /**
     * Runs the process.
     *
     * The callback receives the type of output (out or err) and
     * some bytes from the output in real-time. It allows to have feedback
     * from the independent process during execution.
     *
     * The STDOUT and STDERR are also available after the process is finished
     * via the getOutput() and getErrorOutput() methods.
     *
     * @param callable|null $callback A PHP callback to run whenever there is some
     *                                output available on STDOUT or STDERR
     *
     * @return integer The exit status code
     *
     * @throws RuntimeException When process can't be launched
     * @throws RuntimeException When process stopped after receiving signal
     *
     * @api
     */
    public function run($callback = null)
    {
        $this->start($callback);

        return $this->wait();
    }

    /**
     * Starts the process and returns after sending the STDIN.
     *
     * This method blocks until all STDIN data is sent to the process then it
     * returns while the process runs in the background.
     *
     * The termination of the process can be awaited with wait().
     *
     * The callback receives the type of output (out or err) and some bytes from
     * the output in real-time while writing the standard input to the process.
     * It allows to have feedback from the independent process during execution.
     * If there is no callback passed, the wait() method can be called
     * with true as a second parameter then the callback will get all data occurred
     * in (and since) the start call.
     *
     * @param callable|null $callback A PHP callback to run whenever there is some
     *                                output available on STDOUT or STDERR
     *
     * @return Process The process itself
     *
     * @throws RuntimeException When process can't be launched
     * @throws RuntimeException When process is already running
     */
    public function start($callback = null)
    {
        if ($this->isRunning()) {
            throw new RuntimeException('Process is already running');
        }

        $this->resetProcessData();
        $this->starttime = $this->lastOutputTime = microtime(true);
        $this->callback = $this->buildCallback($callback);
        $descriptors = $this->getDescriptors();

        $commandline = $this->commandline;

        if (defined('PHP_WINDOWS_VERSION_BUILD') && $this->enhanceWindowsCompatibility) {
            $commandline = 'cmd /V:ON /E:ON /C "('.$commandline.')"';
            foreach ($this->processPipes->getFiles() as $offset => $filename) {
                $commandline .= ' '.$offset.'>'.$filename;
            }

            if (!isset($this->options['bypass_shell'])) {
                $this->options['bypass_shell'] = true;
            }
        }

        $this->process = proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $this->env, $this->options);

        if (!is_resource($this->process)) {
            throw new RuntimeException('Unable to launch a new process.');
        }
        $this->status = self::STATUS_STARTED;

        $this->processPipes->unblock();

        if ($this->tty) {
            return;
        }

        $this->processPipes->write(false, $this->stdin);
        $this->updateStatus(false);
        $this->checkTimeout();
    }

    /**
     * Restarts the process.
     *
     * Be warned that the process is cloned before being started.
     *
     * @param callable|null $callback A PHP callback to run whenever there is some
     *                                output available on STDOUT or STDERR
     *
     * @return Process The new process
     *
     * @throws RuntimeException When process can't be launched
     * @throws RuntimeException When process is already running
     *
     * @see start()
     */
    public function restart($callback = null)
    {
        if ($this->isRunning()) {
            throw new RuntimeException('Process is already running');
        }

        $process = clone $this;
        $process->start($callback);

        return $process;
    }

    /**
     * Waits for the process to terminate.
     *
     * The callback receives the type of output (out or err) and some bytes
     * from the output in real-time while writing the standard input to the process.
     * It allows to have feedback from the independent process during execution.
     *
     * @param callable|null $callback A valid PHP callback
     *
     * @return integer The exitcode of the process
     *
     * @throws RuntimeException When process timed out
     * @throws RuntimeException When process stopped after receiving signal
     * @throws LogicException   When process is not yet started
     */
    public function wait($callback = null)
    {
        $this->requireProcessIsStarted(__FUNCTION__);

        $this->updateStatus(false);
        if (null !== $callback) {
            $this->callback = $this->buildCallback($callback);
        }

        do {
            $this->checkTimeout();
            $running = defined('PHP_WINDOWS_VERSION_BUILD') ? $this->isRunning() : $this->processPipes->hasOpenHandles();
            $close = !defined('PHP_WINDOWS_VERSION_BUILD') || !$running;;
            $this->readPipes(true, $close);
        } while ($running);

        while ($this->isRunning()) {
            usleep(1000);
        }

        if ($this->processInformation['signaled']) {
            throw new RuntimeException(sprintf('The process has been signaled with signal "%s".', $this->processInformation['termsig']));
        }

        return $this->exitcode;
    }

    /**
     * Returns the Pid (process identifier), if applicable.
     *
     * @return integer|null The process id if running, null otherwise
     *
     * @throws RuntimeException In case --enable-sigchild is activated
     */
    public function getPid()
    {
        if ($this->isSigchildEnabled()) {
            throw new RuntimeException('This PHP has been compiled with --enable-sigchild. The process identifier can not be retrieved.');
        }

        $this->updateStatus(false);

        return $this->isRunning() ? $this->processInformation['pid'] : null;
    }

    /**
     * Sends a POSIX signal to the process.
     *
     * @param  integer $signal A valid POSIX signal (see http://www.php.net/manual/en/pcntl.constants.php)
     *
     * @return Process
     *
     * @throws LogicException   In case the process is not running
     * @throws RuntimeException In case --enable-sigchild is activated
     * @throws RuntimeException In case of failure
     */
    public function signal($signal)
    {
        $this->doSignal($signal, true);

        return $this;
    }

    /**
     * Returns the current output of the process (STDOUT).
     *
     * @return string The process output
     *
     * @throws LogicException In case the process is not started
     *
     * @api
     */
    public function getOutput()
    {
        $this->requireProcessIsStarted(__FUNCTION__);

        $this->readPipes(false, defined('PHP_WINDOWS_VERSION_BUILD') ? !$this->processInformation['running'] : true);

        return $this->stdout;
    }

    /**
     * Returns the output incrementally.
     *
     * In comparison with the getOutput method which always return the whole
     * output, this one returns the new output since the last call.
     *
     * @throws LogicException In case the process is not started
     *
     * @return string The process output since the last call
     */
    public function getIncrementalOutput()
    {
        $this->requireProcessIsStarted(__FUNCTION__);

        $data = $this->getOutput();

        $latest = substr($data, $this->incrementalOutputOffset);
        $this->incrementalOutputOffset = strlen($data);

        return $latest;
    }

    /**
     * Clears the process output.
     *
     * @return Process
     */
    public function clearOutput()
    {
        $this->stdout = '';
        $this->incrementalOutputOffset = 0;

        return $this;
    }

    /**
     * Returns the current error output of the process (STDERR).
     *
     * @return string The process error output
     *
     * @throws LogicException In case the process is not started
     *
     * @api
     */
    public function getErrorOutput()
    {
        $this->requireProcessIsStarted(__FUNCTION__);

        $this->readPipes(false, defined('PHP_WINDOWS_VERSION_BUILD') ? !$this->processInformation['running'] : true);

        return $this->stderr;
    }

    /**
     * Returns the errorOutput incrementally.
     *
     * In comparison with the getErrorOutput method which always return the
     * whole error output, this one returns the new error output since the last
     * call.
     *
     * @throws LogicException In case the process is not started
     *
     * @return string The process error output since the last call
     */
    public function getIncrementalErrorOutput()
    {
        $this->requireProcessIsStarted(__FUNCTION__);

        $data = $this->getErrorOutput();

        $latest = substr($data, $this->incrementalErrorOutputOffset);
        $this->incrementalErrorOutputOffset = strlen($data);

        return $latest;
    }

    /**
     * Clears the process output.
     *
     * @return Process
     */
    public function clearErrorOutput()
    {
        $this->stderr = '';
        $this->incrementalErrorOutputOffset = 0;

        return $this;
    }

    /**
     * Returns the exit code returned by the process.
     *
     * @return null|integer The exit status code, null if the Process is not terminated
     *
     * @throws RuntimeException In case --enable-sigchild is activated and the sigchild compatibility mode is disabled
     *
     * @api
     */
    public function getExitCode()
    {
        if ($this->isSigchildEnabled() && !$this->enhanceSigchildCompatibility) {
            throw new RuntimeException('This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.');
        }

        $this->updateStatus(false);

        return $this->exitcode;
    }

    /**
     * Returns a string representation for the exit code returned by the process.
     *
     * This method relies on the Unix exit code status standardization
     * and might not be relevant for other operating systems.
     *
     * @return null|string A string representation for the exit status code, null if the Process is not terminated.
     *
     * @throws RuntimeException In case --enable-sigchild is activated and the sigchild compatibility mode is disabled
     *
     * @see http://tldp.org/LDP/abs/html/exitcodes.html
     * @see http://en.wikipedia.org/wiki/Unix_signal
     */
    public function getExitCodeText()
    {
        if (null === $exitcode = $this->getExitCode()) {
            return;
        }

        return isset(self::$exitCodes[$exitcode]) ? self::$exitCodes[$exitcode] : 'Unknown error';
    }

    /**
     * Checks if the process ended successfully.
     *
     * @return Boolean true if the process ended successfully, false otherwise
     *
     * @api
     */
    public function isSuccessful()
    {
        return 0 === $this->getExitCode();
    }

    /**
     * Returns true if the child process has been terminated by an uncaught signal.
     *
     * It always returns false on Windows.
     *
     * @return Boolean
     *
     * @throws RuntimeException In case --enable-sigchild is activated
     * @throws LogicException   In case the process is not terminated
     *
     * @api
     */
    public function hasBeenSignaled()
    {
        $this->requireProcessIsTerminated(__FUNCTION__);

        if ($this->isSigchildEnabled()) {
            throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.');
        }

        $this->updateStatus(false);

        return $this->processInformation['signaled'];
    }

    /**
     * Returns the number of the signal that caused the child process to terminate its execution.
     *
     * It is only meaningful if hasBeenSignaled() returns true.
     *
     * @return integer
     *
     * @throws RuntimeException In case --enable-sigchild is activated
     * @throws LogicException   In case the process is not terminated
     *
     * @api
     */
    public function getTermSignal()
    {
        $this->requireProcessIsTerminated(__FUNCTION__);

        if ($this->isSigchildEnabled()) {
            throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.');
        }

        $this->updateStatus(false);

        return $this->processInformation['termsig'];
    }

    /**
     * Returns true if the child process has been stopped by a signal.
     *
     * It always returns false on Windows.
     *
     * @return Boolean
     *
     * @throws LogicException In case the process is not terminated
     *
     * @api
     */
    public function hasBeenStopped()
    {
        $this->requireProcessIsTerminated(__FUNCTION__);

        $this->updateStatus(false);

        return $this->processInformation['stopped'];
    }

    /**
     * Returns the number of the signal that caused the child process to stop its execution.
     *
     * It is only meaningful if hasBeenStopped() returns true.
     *
     * @return integer
     *
     * @throws LogicException In case the process is not terminated
     *
     * @api
     */
    public function getStopSignal()
    {
        $this->requireProcessIsTerminated(__FUNCTION__);

        $this->updateStatus(false);

        return $this->processInformation['stopsig'];
    }

    /**
     * Checks if the process is currently running.
     *
     * @return Boolean true if the process is currently running, false otherwise
     */
    public function isRunning()
    {
        if (self::STATUS_STARTED !== $this->status) {
            return false;
        }

        $this->updateStatus(false);

        return $this->processInformation['running'];
    }

    /**
     * Checks if the process has been started with no regard to the current state.
     *
     * @return Boolean true if status is ready, false otherwise
     */
    public function isStarted()
    {
        return $this->status != self::STATUS_READY;
    }

    /**
     * Checks if the process is terminated.
     *
     * @return Boolean true if process is terminated, false otherwise
     */
    public function isTerminated()
    {
        $this->updateStatus(false);

        return $this->status == self::STATUS_TERMINATED;
    }

    /**
     * Gets the process status.
     *
     * The status is one of: ready, started, terminated.
     *
     * @return string The current process status
     */
    public function getStatus()
    {
        $this->updateStatus(false);

        return $this->status;
    }

    /**
     * Stops the process.
     *
     * @param integer|float $timeout The timeout in seconds
     * @param integer       $signal  A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL
     *
     * @return integer The exit-code of the process
     *
     * @throws RuntimeException if the process got signaled
     */
    public function stop($timeout = 10, $signal = null)
    {
        $timeoutMicro = microtime(true) + $timeout;
        if ($this->isRunning()) {
            if (defined('PHP_WINDOWS_VERSION_BUILD') && !$this->isSigchildEnabled()) {
                exec(sprintf("taskkill /F /T /PID %d 2>&1", $this->getPid()), $output, $exitCode);
                if ($exitCode > 0) {
                    throw new RuntimeException('Unable to kill the process');
                }
            }
            proc_terminate($this->process);
            do {
                usleep(1000);
            } while ($this->isRunning() && microtime(true) < $timeoutMicro);

            if ($this->isRunning() && !$this->isSigchildEnabled()) {
                if (null !== $signal || defined('SIGKILL')) {
                    // avoid exception here :
                    // process is supposed to be running, but it might have stop
                    // just after this line.
                    // in any case, let's silently discard the error, we can not do anything
                    $this->doSignal($signal ?: SIGKILL, false);
                }
            }
        }

        $this->updateStatus(false);
        if ($this->processInformation['running']) {
            $this->close();
        }

        return $this->exitcode;
    }

    /**
     * Adds a line to the STDOUT stream.
     *
     * @param string $line The line to append
     */
    public function addOutput($line)
    {
        $this->lastOutputTime = microtime(true);
        $this->stdout .= $line;
    }

    /**
     * Adds a line to the STDERR stream.
     *
     * @param string $line The line to append
     */
    public function addErrorOutput($line)
    {
        $this->lastOutputTime = microtime(true);
        $this->stderr .= $line;
    }

    /**
     * Gets the command line to be executed.
     *
     * @return string The command to execute
     */
    public function getCommandLine()
    {
        return $this->commandline;
    }

    /**
     * Sets the command line to be executed.
     *
     * @param string $commandline The command to execute
     *
     * @return self The current Process instance
     */
    public function setCommandLine($commandline)
    {
        $this->commandline = $commandline;

        return $this;
    }

    /**
     * Gets the process timeout (max. runtime).
     *
     * @return float|null The timeout in seconds or null if it's disabled
     */
    public function getTimeout()
    {
        return $this->timeout;
    }

    /**
     * Gets the process idle timeout (max. time since last output).
     *
     * @return float|null The timeout in seconds or null if it's disabled
     */
    public function getIdleTimeout()
    {
        return $this->idleTimeout;
    }

    /**
     * Sets the process timeout (max. runtime).
     *
     * To disable the timeout, set this value to null.
     *
     * @param integer|float|null $timeout The timeout in seconds
     *
     * @return self The current Process instance
     *
     * @throws InvalidArgumentException if the timeout is negative
     */
    public function setTimeout($timeout)
    {
        $this->timeout = $this->validateTimeout($timeout);

        return $this;
    }

    /**
     * Sets the process idle timeout (max. time since last output).
     *
     * To disable the timeout, set this value to null.
     *
     * @param integer|float|null $timeout The timeout in seconds
     *
     * @return self The current Process instance.
     *
     * @throws InvalidArgumentException if the timeout is negative
     */
    public function setIdleTimeout($timeout)
    {
        $this->idleTimeout = $this->validateTimeout($timeout);

        return $this;
    }

    /**
     * Enables or disables the TTY mode.
     *
     * @param boolean $tty True to enabled and false to disable
     *
     * @return self The current Process instance
     */
    public function setTty($tty)
    {
        $this->tty = (Boolean) $tty;

        return $this;
    }

    /**
     * Checks if the TTY mode is enabled.
     *
     * @return Boolean true if the TTY mode is enabled, false otherwise
     */
    public function isTty()
    {
        return $this->tty;
    }

    /**
     * Gets the working directory.
     *
     * @return string|null The current working directory or null on failure
     */
    public function getWorkingDirectory()
    {
        if (null === $this->cwd) {
            // getcwd() will return false if any one of the parent directories does not have
            // the readable or search mode set, even if the current directory does
            return getcwd() ?: null;
        }

        return $this->cwd;
    }

    /**
     * Sets the current working directory.
     *
     * @param string $cwd The new working directory
     *
     * @return self The current Process instance
     */
    public function setWorkingDirectory($cwd)
    {
        $this->cwd = $cwd;

        return $this;
    }

    /**
     * Gets the environment variables.
     *
     * @return array The current environment variables
     */
    public function getEnv()
    {
        return $this->env;
    }

    /**
     * Sets the environment variables.
     *
     * An environment variable value should be a string.
     * If it is an array, the variable is ignored.
     *
     * That happens in PHP when 'argv' is registered into
     * the $_ENV array for instance.
     *
     * @param array $env The new environment variables
     *
     * @return self The current Process instance
     */
    public function setEnv(array $env)
    {
        // Process can not handle env values that are arrays
        $env = array_filter($env, function ($value) {
            return !is_array($value);
        });

        $this->env = array();
        foreach ($env as $key => $value) {
            $this->env[(binary) $key] = (binary) $value;
        }

        return $this;
    }

    /**
     * Gets the contents of STDIN.
     *
     * @return string|null The current contents
     */
    public function getStdin()
    {
        return $this->stdin;
    }

    /**
     * Sets the contents of STDIN.
     *
     * @param string|null $stdin The new contents
     *
     * @return self The current Process instance
     */
    public function setStdin($stdin)
    {
        $this->stdin = $stdin;

        return $this;
    }

    /**
     * Gets the options for proc_open.
     *
     * @return array The current options
     */
    public function getOptions()
    {
        return $this->options;
    }

    /**
     * Sets the options for proc_open.
     *
     * @param array $options The new options
     *
     * @return self The current Process instance
     */
    public function setOptions(array $options)
    {
        $this->options = $options;

        return $this;
    }

    /**
     * Gets whether or not Windows compatibility is enabled.
     *
     * This is true by default.
     *
     * @return Boolean
     */
    public function getEnhanceWindowsCompatibility()
    {
        return $this->enhanceWindowsCompatibility;
    }

    /**
     * Sets whether or not Windows compatibility is enabled.
     *
     * @param Boolean $enhance
     *
     * @return self The current Process instance
     */
    public function setEnhanceWindowsCompatibility($enhance)
    {
        $this->enhanceWindowsCompatibility = (Boolean) $enhance;

        return $this;
    }

    /**
     * Returns whether sigchild compatibility mode is activated or not.
     *
     * @return Boolean
     */
    public function getEnhanceSigchildCompatibility()
    {
        return $this->enhanceSigchildCompatibility;
    }

    /**
     * Activates sigchild compatibility mode.
     *
     * Sigchild compatibility mode is required to get the exit code and
     * determine the success of a process when PHP has been compiled with
     * the --enable-sigchild option
     *
     * @param Boolean $enhance
     *
     * @return self The current Process instance
     */
    public function setEnhanceSigchildCompatibility($enhance)
    {
        $this->enhanceSigchildCompatibility = (Boolean) $enhance;

        return $this;
    }

    /**
     * Performs a check between the timeout definition and the time the process started.
     *
     * In case you run a background process (with the start method), you should
     * trigger this method regularly to ensure the process timeout
     *
     * @throws ProcessTimedOutException In case the timeout was reached
     */
    public function checkTimeout()
    {
        if ($this->status !== self::STATUS_STARTED) {
            return;
        }

        if (null !== $this->timeout && $this->timeout < microtime(true) - $this->starttime) {
            $this->stop(0);

            throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_GENERAL);
        }

        if (null !== $this->idleTimeout && $this->idleTimeout < microtime(true) - $this->lastOutputTime) {
            $this->stop(0);

            throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_IDLE);
        }
    }

    /**
     * Creates the descriptors needed by the proc_open.
     *
     * @return array
     */
    private function getDescriptors()
    {
        $this->processPipes = new ProcessPipes($this->useFileHandles, $this->tty);
        $descriptors = $this->processPipes->getDescriptors();

        if (!$this->useFileHandles && $this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
            // last exit code is output on the fourth pipe and caught to work around --enable-sigchild
            $descriptors = array_merge($descriptors, array(array('pipe', 'w')));

            $this->commandline = '('.$this->commandline.') 3>/dev/null; code=$?; echo $code >&3; exit $code';
        }

        return $descriptors;
    }

    /**
     * Builds up the callback used by wait().
     *
     * The callbacks adds all occurred output to the specific buffer and calls
     * the user callback (if present) with the received output.
     *
     * @param callable|null $callback The user defined PHP callback
     *
     * @return callable A PHP callable
     */
    protected function buildCallback($callback)
    {
        $that = $this;
        $out = self::OUT;
        $err = self::ERR;
        $callback = function ($type, $data) use ($that, $callback, $out, $err) {
            if ($out == $type) {
                $that->addOutput($data);
            } else {
                $that->addErrorOutput($data);
            }

            if (null !== $callback) {
                call_user_func($callback, $type, $data);
            }
        };

        return $callback;
    }

    /**
     * Updates the status of the process, reads pipes.
     *
     * @param Boolean $blocking Whether to use a blocking read call.
     */
    protected function updateStatus($blocking)
    {
        if (self::STATUS_STARTED !== $this->status) {
            return;
        }

        $this->processInformation = proc_get_status($this->process);
        $this->captureExitCode();

        $this->readPipes($blocking, defined('PHP_WINDOWS_VERSION_BUILD') ? !$this->processInformation['running'] : true);

        if (!$this->processInformation['running']) {
            $this->close();
        }
    }

    /**
     * Returns whether PHP has been compiled with the '--enable-sigchild' option or not.
     *
     * @return Boolean
     */
    protected function isSigchildEnabled()
    {
        if (null !== self::$sigchild) {
            return self::$sigchild;
        }

        if (!function_exists('phpinfo')) {
            return self::$sigchild = false;
        }

        ob_start();
        phpinfo(INFO_GENERAL);

        return self::$sigchild = false !== strpos(ob_get_clean(), '--enable-sigchild');
    }

    /**
     * Validates and returns the filtered timeout.
     *
     * @param integer|float|null $timeout
     *
     * @return float|null
     */
    private function validateTimeout($timeout)
    {
        $timeout = (float) $timeout;

        if (0.0 === $timeout) {
            $timeout = null;
        } elseif ($timeout < 0) {
            throw new InvalidArgumentException('The timeout value must be a valid positive integer or float number.');
        }

        return $timeout;
    }

    /**
     * Reads pipes, executes callback.
     *
     * @param Boolean $blocking Whether to use blocking calls or not.
     * @param Boolean $close    Whether to close file handles or not.
     */
    private function readPipes($blocking, $close)
    {
        if ($close) {
            $result = $this->processPipes->readAndCloseHandles($blocking);
        } else {
            $result = $this->processPipes->read($blocking);
        }

        foreach ($result as $type => $data) {
            if (3 == $type) {
                $this->fallbackExitcode = (int) $data;
            } else {
                call_user_func($this->callback, $type === self::STDOUT ? self::OUT : self::ERR, $data);
            }
        }
    }

    /**
     * Captures the exitcode if mentioned in the process information.
     */
    private function captureExitCode()
    {
        if (isset($this->processInformation['exitcode']) && -1 != $this->processInformation['exitcode']) {
            $this->exitcode = $this->processInformation['exitcode'];
        }
    }

    /**
     * Closes process resource, closes file handles, sets the exitcode.
     *
     * @return Integer The exitcode
     */
    private function close()
    {
        $this->processPipes->close();
        if (is_resource($this->process)) {
            $exitcode = proc_close($this->process);
        } else {
            $exitcode = -1;
        }

        $this->exitcode = -1 !== $exitcode ? $exitcode : (null !== $this->exitcode ? $this->exitcode : -1);
        $this->status = self::STATUS_TERMINATED;

        if (-1 === $this->exitcode && null !== $this->fallbackExitcode) {
            $this->exitcode = $this->fallbackExitcode;
        } elseif (-1 === $this->exitcode && $this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) {
            // if process has been signaled, no exitcode but a valid termsig, apply Unix convention
            $this->exitcode = 128 + $this->processInformation['termsig'];
        }

        return $this->exitcode;
    }

    /**
     * Resets data related to the latest run of the process.
     */
    private function resetProcessData()
    {
        $this->starttime = null;
        $this->callback = null;
        $this->exitcode = null;
        $this->fallbackExitcode = null;
        $this->processInformation = null;
        $this->stdout = null;
        $this->stderr = null;
        $this->process = null;
        $this->status = self::STATUS_READY;
        $this->incrementalOutputOffset = 0;
        $this->incrementalErrorOutputOffset = 0;
    }

    /**
     * Sends a POSIX signal to the process.
     *
     * @param  integer $signal         A valid POSIX signal (see http://www.php.net/manual/en/pcntl.constants.php)
     * @param  Boolean $throwException Whether to throw exception in case signal failed
     *
     * @return Boolean True if the signal was sent successfully, false otherwise
     *
     * @throws LogicException   In case the process is not running
     * @throws RuntimeException In case --enable-sigchild is activated
     * @throws RuntimeException In case of failure
     */
    private function doSignal($signal, $throwException)
    {
        if (!$this->isRunning()) {
            if ($throwException) {
                throw new LogicException('Can not send signal on a non running process.');
            }

            return false;
        }

        if ($this->isSigchildEnabled()) {
            if ($throwException) {
                throw new RuntimeException('This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
            }

            return false;
        }

        if (true !== @proc_terminate($this->process, $signal)) {
            if ($throwException) {
                throw new RuntimeException(sprintf('Error while sending signal `%s`.', $signal));
            }

            return false;
        }

        return true;
    }

    /**
     * Ensures the process is running or terminated, throws a LogicException if the process has a not started.
     *
     * @param $functionName The function name that was called.
     *
     * @throws LogicException If the process has not run.
     */
    private function requireProcessIsStarted($functionName)
    {
        if (!$this->isStarted()) {
            throw new LogicException(sprintf('Process must be started before calling %s.', $functionName));
        }
    }

    /**
     * Ensures the process is terminated, throws a LogicException if the process has a status different than `terminated`.
     *
     * @param $functionName The function name that was called.
     *
     * @throws LogicException If the process is not yet terminated.
     */
    private function requireProcessIsTerminated($functionName)
    {
        if (!$this->isTerminated()) {
            throw new LogicException(sprintf('Process must be terminated before calling %s.', $functionName));
        }
    }
}
PKu`�\㩑eCC,pear/Symfony/Component/BrowserKit/Client.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit;

use Symfony\Component\DomCrawler\Crawler;
use Symfony\Component\DomCrawler\Link;
use Symfony\Component\DomCrawler\Form;
use Symfony\Component\Process\PhpProcess;

/**
 * Client simulates a browser.
 *
 * To make the actual request, you need to implement the doRequest() method.
 *
 * If you want to be able to run requests in their own process (insulated flag),
 * you need to also implement the getScript() method.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
abstract class Client
{
    protected $history;
    protected $cookieJar;
    protected $server = array();
    protected $internalRequest;
    protected $request;
    protected $internalResponse;
    protected $response;
    protected $crawler;
    protected $insulated = false;
    protected $redirect;
    protected $followRedirects = true;

    private $maxRedirects = -1;
    private $redirectCount = 0;
    private $isMainRequest = true;

    /**
     * Constructor.
     *
     * @param array     $server    The server parameters (equivalent of $_SERVER)
     * @param History   $history   A History instance to store the browser history
     * @param CookieJar $cookieJar A CookieJar instance to store the cookies
     *
     * @api
     */
    public function __construct(array $server = array(), History $history = null, CookieJar $cookieJar = null)
    {
        $this->setServerParameters($server);
        $this->history = $history ?: new History();
        $this->cookieJar = $cookieJar ?: new CookieJar();
    }

    /**
     * Sets whether to automatically follow redirects or not.
     *
     * @param Boolean $followRedirect Whether to follow redirects
     *
     * @api
     */
    public function followRedirects($followRedirect = true)
    {
        $this->followRedirects = (Boolean) $followRedirect;
    }

    /**
     * Sets the maximum number of requests that crawler can follow.
     *
     * @param integer $maxRedirects
     */
    public function setMaxRedirects($maxRedirects)
    {
        $this->maxRedirects = $maxRedirects < 0 ? -1 : $maxRedirects;
        $this->followRedirects = -1 != $this->maxRedirects;
    }

    /**
     * Sets the insulated flag.
     *
     * @param Boolean $insulated Whether to insulate the requests or not
     *
     * @throws \RuntimeException When Symfony Process Component is not installed
     *
     * @api
     */
    public function insulate($insulated = true)
    {
        if ($insulated && !class_exists('Symfony\\Component\\Process\\Process')) {
            // @codeCoverageIgnoreStart
            throw new \RuntimeException('Unable to isolate requests as the Symfony Process Component is not installed.');
            // @codeCoverageIgnoreEnd
        }

        $this->insulated = (Boolean) $insulated;
    }

    /**
     * Sets server parameters.
     *
     * @param array $server An array of server parameters
     *
     * @api
     */
    public function setServerParameters(array $server)
    {
        $this->server = array_merge(array(
            'HTTP_HOST'       => 'localhost',
            'HTTP_USER_AGENT' => 'Symfony2 BrowserKit',
        ), $server);
    }

    /**
     * Sets single server parameter.
     *
     * @param string $key   A key of the parameter
     * @param string $value A value of the parameter
     */
    public function setServerParameter($key, $value)
    {
        $this->server[$key] = $value;
    }

    /**
     * Gets single server parameter for specified key.
     *
     * @param string $key     A key of the parameter to get
     * @param string $default A default value when key is undefined
     *
     * @return string A value of the parameter
     */
    public function getServerParameter($key, $default = '')
    {
        return (isset($this->server[$key])) ? $this->server[$key] : $default;
    }

    /**
     * Returns the History instance.
     *
     * @return History A History instance
     *
     * @api
     */
    public function getHistory()
    {
        return $this->history;
    }

    /**
     * Returns the CookieJar instance.
     *
     * @return CookieJar A CookieJar instance
     *
     * @api
     */
    public function getCookieJar()
    {
        return $this->cookieJar;
    }

    /**
     * Returns the current Crawler instance.
     *
     * @return Crawler|null A Crawler instance
     *
     * @api
     */
    public function getCrawler()
    {
        return $this->crawler;
    }

    /**
     * Returns the current BrowserKit Response instance.
     *
     * @return Response|null A BrowserKit Response instance
     *
     * @api
     */
    public function getInternalResponse()
    {
        return $this->internalResponse;
    }

    /**
     * Returns the current origin response instance.
     *
     * The origin response is the response instance that is returned
     * by the code that handles requests.
     *
     * @return object|null A response instance
     *
     * @see doRequest
     *
     * @api
     */
    public function getResponse()
    {
        return $this->response;
    }

    /**
     * Returns the current BrowserKit Request instance.
     *
     * @return Request|null A BrowserKit Request instance
     *
     * @api
     */
    public function getInternalRequest()
    {
        return $this->internalRequest;
    }

    /**
     * Returns the current origin Request instance.
     *
     * The origin request is the request instance that is sent
     * to the code that handles requests.
     *
     * @return object|null A Request instance
     *
     * @see doRequest
     *
     * @api
     */
    public function getRequest()
    {
        return $this->request;
    }

    /**
     * Clicks on a given link.
     *
     * @param Link $link A Link instance
     *
     * @return Crawler
     *
     * @api
     */
    public function click(Link $link)
    {
        if ($link instanceof Form) {
            return $this->submit($link);
        }

        return $this->request($link->getMethod(), $link->getUri());
    }

    /**
     * Submits a form.
     *
     * @param Form  $form   A Form instance
     * @param array $values An array of form field values
     *
     * @return Crawler
     *
     * @api
     */
    public function submit(Form $form, array $values = array())
    {
        $form->setValues($values);

        return $this->request($form->getMethod(), $form->getUri(), $form->getPhpValues(), $form->getPhpFiles());
    }

    /**
     * Calls a URI.
     *
     * @param string  $method        The request method
     * @param string  $uri           The URI to fetch
     * @param array   $parameters    The Request parameters
     * @param array   $files         The files
     * @param array   $server        The server parameters (HTTP headers are referenced with a HTTP_ prefix as PHP does)
     * @param string  $content       The raw body data
     * @param Boolean $changeHistory Whether to update the history or not (only used internally for back(), forward(), and reload())
     *
     * @return Crawler
     *
     * @api
     */
    public function request($method, $uri, array $parameters = array(), array $files = array(), array $server = array(), $content = null, $changeHistory = true)
    {
        if ($this->isMainRequest) {
            $this->redirectCount = 0;
        } else {
            ++$this->redirectCount;
        }

        $uri = $this->getAbsoluteUri($uri);

        if (isset($server['HTTP_HOST'])) {
            $uri = preg_replace('{^(https?\://)'.parse_url($uri, PHP_URL_HOST).'}', '\\1'.$server['HTTP_HOST'], $uri);
        }

        if (isset($server['HTTPS'])) {
            $uri = preg_replace('{^'.parse_url($uri, PHP_URL_SCHEME).'}', $server['HTTPS'] ? 'https' : 'http', $uri);
        }

        $server = array_merge($this->server, $server);

        if (!$this->history->isEmpty()) {
            $server['HTTP_REFERER'] = $this->history->current()->getUri();
        }

        $server['HTTP_HOST'] = parse_url($uri, PHP_URL_HOST);

        if ($port = parse_url($uri, PHP_URL_PORT)) {
            $server['HTTP_HOST'] .= ':'.$port;
        }

        $server['HTTPS'] = 'https' == parse_url($uri, PHP_URL_SCHEME);

        $this->internalRequest = new Request($uri, $method, $parameters, $files, $this->cookieJar->allValues($uri), $server, $content);

        $this->request = $this->filterRequest($this->internalRequest);

        if (true === $changeHistory) {
            $this->history->add($this->internalRequest);
        }

        if ($this->insulated) {
            $this->response = $this->doRequestInProcess($this->request);
        } else {
            $this->response = $this->doRequest($this->request);
        }

        $this->internalResponse = $this->filterResponse($this->response);

        $this->cookieJar->updateFromResponse($this->internalResponse, $uri);

        $status = $this->internalResponse->getStatus();

        if ($status >= 300 && $status < 400) {
            $this->redirect = $this->internalResponse->getHeader('Location');
        } else {
            $this->redirect = null;
        }

        if ($this->followRedirects && $this->redirect) {
            return $this->crawler = $this->followRedirect();
        }

        return $this->crawler = $this->createCrawlerFromContent($this->internalRequest->getUri(), $this->internalResponse->getContent(), $this->internalResponse->getHeader('Content-Type'));
    }

    /**
     * Makes a request in another process.
     *
     * @param object $request An origin request instance
     *
     * @return object An origin response instance
     *
     * @throws \RuntimeException When processing returns exit code
     */
    protected function doRequestInProcess($request)
    {
        // We set the TMPDIR (for Macs) and TEMP (for Windows), because on these platforms the temp directory changes based on the user.
        $process = new PhpProcess($this->getScript($request), null, array('TMPDIR' => sys_get_temp_dir(), 'TEMP' => sys_get_temp_dir()));
        $process->run();

        if (!$process->isSuccessful() || !preg_match('/^O\:\d+\:/', $process->getOutput())) {
            throw new \RuntimeException(sprintf('OUTPUT: %s ERROR OUTPUT: %s', $process->getOutput(), $process->getErrorOutput()));
        }

        return unserialize($process->getOutput());
    }

    /**
     * Makes a request.
     *
     * @param object $request An origin request instance
     *
     * @return object An origin response instance
     */
    abstract protected function doRequest($request);

    /**
     * Returns the script to execute when the request must be insulated.
     *
     * @param object $request An origin request instance
     *
     * @throws \LogicException When this abstract class is not implemented
     */
    protected function getScript($request)
    {
        // @codeCoverageIgnoreStart
        throw new \LogicException('To insulate requests, you need to override the getScript() method.');
        // @codeCoverageIgnoreEnd
    }

    /**
     * Filters the BrowserKit request to the origin one.
     *
     * @param Request $request The BrowserKit Request to filter
     *
     * @return object An origin request instance
     */
    protected function filterRequest(Request $request)
    {
        return $request;
    }

    /**
     * Filters the origin response to the BrowserKit one.
     *
     * @param object $response The origin response to filter
     *
     * @return Response An BrowserKit Response instance
     */
    protected function filterResponse($response)
    {
        return $response;
    }

    /**
     * Creates a crawler.
     *
     * This method returns null if the DomCrawler component is not available.
     *
     * @param string $uri     A URI
     * @param string $content Content for the crawler to use
     * @param string $type    Content type
     *
     * @return Crawler|null
     */
    protected function createCrawlerFromContent($uri, $content, $type)
    {
        if (!class_exists('Symfony\Component\DomCrawler\Crawler')) {
            return null;
        }

        $crawler = new Crawler(null, $uri);
        $crawler->addContent($content, $type);

        return $crawler;
    }

    /**
     * Goes back in the browser history.
     *
     * @return Crawler
     *
     * @api
     */
    public function back()
    {
        return $this->requestFromRequest($this->history->back(), false);
    }

    /**
     * Goes forward in the browser history.
     *
     * @return Crawler
     *
     * @api
     */
    public function forward()
    {
        return $this->requestFromRequest($this->history->forward(), false);
    }

    /**
     * Reloads the current browser.
     *
     * @return Crawler
     *
     * @api
     */
    public function reload()
    {
        return $this->requestFromRequest($this->history->current(), false);
    }

    /**
     * Follow redirects?
     *
     * @return Crawler
     *
     * @throws \LogicException If request was not a redirect
     *
     * @api
     */
    public function followRedirect()
    {
        if (empty($this->redirect)) {
            throw new \LogicException('The request was not redirected.');
        }

        if (-1 !== $this->maxRedirects) {
            if ($this->redirectCount > $this->maxRedirects) {
                throw new \LogicException(sprintf('The maximum number (%d) of redirections was reached.', $this->maxRedirects));
            }
        }

        $request = $this->internalRequest;

        if (in_array($this->internalResponse->getStatus(), array(302, 303))) {
            $method = 'get';
            $files = array();
            $content = null;
        } else {
            $method = $request->getMethod();
            $files = $request->getFiles();
            $content = $request->getContent();
        }

        if ('get' === strtolower($method)) {
            // Don't forward parameters for GET request as it should reach the redirection URI
            $parameters = array();
        } else {
            $parameters = $request->getParameters();
        }

        $server = $request->getServer();
        $server = $this->updateServerFromUri($server, $this->redirect);

        $this->isMainRequest = false;

        $response = $this->request($method, $this->redirect, $parameters, $files, $server, $content);

        $this->isMainRequest = true;

        return $response;
    }

    /**
     * Restarts the client.
     *
     * It flushes history and all cookies.
     *
     * @api
     */
    public function restart()
    {
        $this->cookieJar->clear();
        $this->history->clear();
    }

    /**
     * Takes a URI and converts it to absolute if it is not already absolute.
     *
     * @param string $uri A URI
     *
     * @return string An absolute URI
     */
    protected function getAbsoluteUri($uri)
    {
        // already absolute?
        if (0 === strpos($uri, 'http')) {
            return $uri;
        }

        if (!$this->history->isEmpty()) {
            $currentUri = $this->history->current()->getUri();
        } else {
            $currentUri = sprintf('http%s://%s/',
                isset($this->server['HTTPS']) ? 's' : '',
                isset($this->server['HTTP_HOST']) ? $this->server['HTTP_HOST'] : 'localhost'
            );
        }

        // protocol relative URL
        if (0 === strpos($uri, '//')) {
            return parse_url($currentUri, PHP_URL_SCHEME).':'.$uri;
        }

        // anchor?
        if (!$uri || '#' == $uri[0]) {
            return preg_replace('/#.*?$/', '', $currentUri).$uri;
        }

        if ('/' !== $uri[0]) {
            $path = parse_url($currentUri, PHP_URL_PATH);

            if ('/' !== substr($path, -1)) {
                $path = substr($path, 0, strrpos($path, '/') + 1);
            }

            $uri = $path.$uri;
        }

        return preg_replace('#^(.*?//[^/]+)\/.*$#', '$1', $currentUri).$uri;
    }

    /**
     * Makes a request from a Request object directly.
     *
     * @param Request $request       A Request instance
     * @param Boolean $changeHistory Whether to update the history or not (only used internally for back(), forward(), and reload())
     *
     * @return Crawler
     */
    protected function requestFromRequest(Request $request, $changeHistory = true)
    {
        return $this->request($request->getMethod(), $request->getUri(), $request->getParameters(), $request->getFiles(), $request->getServer(), $request->getContent(), $changeHistory);
    }

    private function updateServerFromUri($server, $uri)
    {
        $server['HTTP_HOST'] = parse_url($uri, PHP_URL_HOST);
        $scheme = parse_url($uri, PHP_URL_SCHEME);
        $server['HTTPS'] = null === $scheme ? $server['HTTPS'] : 'https' == $scheme;
        unset($server['HTTP_IF_NONE_MATCH'], $server['HTTP_IF_MODIFIED_SINCE']);

        return $server;
    }
}
PKv`�\9�;"",pear/Symfony/Component/BrowserKit/Cookie.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit;

/**
 * Cookie represents an HTTP cookie.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Cookie
{
    /**
     * Handles dates as defined by RFC 2616 section 3.3.1, and also some other
     * non-standard, but common formats.
     *
     * @var array
     */
    private static $dateFormats = array(
        'D, d M Y H:i:s T',
        'D, d-M-y H:i:s T',
        'D, d-M-Y H:i:s T',
        'D, d-m-y H:i:s T',
        'D, d-m-Y H:i:s T',
        'D M j G:i:s Y',
        'D M d H:i:s Y T',
    );

    protected $name;
    protected $value;
    protected $expires;
    protected $path;
    protected $domain;
    protected $secure;
    protected $httponly;
    protected $rawValue;

    /**
     * Sets a cookie.
     *
     * @param string  $name         The cookie name
     * @param string  $value        The value of the cookie
     * @param string  $expires      The time the cookie expires
     * @param string  $path         The path on the server in which the cookie will be available on
     * @param string  $domain       The domain that the cookie is available
     * @param Boolean $secure       Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client
     * @param Boolean $httponly     The cookie httponly flag
     * @param Boolean $encodedValue Whether the value is encoded or not
     *
     * @api
     */
    public function __construct($name, $value, $expires = null, $path = null, $domain = '', $secure = false, $httponly = true, $encodedValue = false)
    {
        if ($encodedValue) {
            $this->value    = urldecode($value);
            $this->rawValue = $value;
        } else {
            $this->value    = $value;
            $this->rawValue = urlencode($value);
        }
        $this->name     = $name;
        $this->expires  = null === $expires ? null : (integer) $expires;
        $this->path     = empty($path) ? '/' : $path;
        $this->domain   = $domain;
        $this->secure   = (Boolean) $secure;
        $this->httponly = (Boolean) $httponly;
    }

    /**
     * Returns the HTTP representation of the Cookie.
     *
     * @return string The HTTP representation of the Cookie
     *
     * @throws \UnexpectedValueException
     *
     * @api
     */
    public function __toString()
    {
        $cookie = sprintf('%s=%s', $this->name, $this->rawValue);

        if (null !== $this->expires) {
            $dateTime = \DateTime::createFromFormat('U', $this->expires, new \DateTimeZone('GMT'));

            if ($dateTime === false) {
                throw new \UnexpectedValueException(sprintf('The cookie expiration time "%s" is not valid.'), $this->expires);
            }

            $cookie .= '; expires='.str_replace('+0000', '', $dateTime->format(self::$dateFormats[0]));
        }

        if ('' !== $this->domain) {
            $cookie .= '; domain='.$this->domain;
        }

        if ($this->path) {
            $cookie .= '; path='.$this->path;
        }

        if ($this->secure) {
            $cookie .= '; secure';
        }

        if ($this->httponly) {
            $cookie .= '; httponly';
        }

        return $cookie;
    }

    /**
     * Creates a Cookie instance from a Set-Cookie header value.
     *
     * @param string $cookie A Set-Cookie header value
     * @param string $url    The base URL
     *
     * @return Cookie A Cookie instance
     *
     * @throws \InvalidArgumentException
     *
     * @api
     */
    public static function fromString($cookie, $url = null)
    {
        $parts = explode(';', $cookie);

        if (false === strpos($parts[0], '=')) {
            throw new \InvalidArgumentException(sprintf('The cookie string "%s" is not valid.', $parts[0]));
        }

        list($name, $value) = explode('=', array_shift($parts), 2);

        $values = array(
            'name'     => trim($name),
            'value'    => trim($value),
            'expires'  => null,
            'path'     => '/',
            'domain'   => '',
            'secure'   => false,
            'httponly' => false,
            'passedRawValue' => true,
        );

        if (null !== $url) {
            if ((false === $urlParts = parse_url($url)) || !isset($urlParts['host']) || !isset($urlParts['path'])) {
                throw new \InvalidArgumentException(sprintf('The URL "%s" is not valid.', $url));
            }

            $values['domain'] = $urlParts['host'];
            $values['path'] = substr($urlParts['path'], 0, strrpos($urlParts['path'], '/'));
        }

        foreach ($parts as $part) {
            $part = trim($part);

            if ('secure' === strtolower($part)) {
                // Ignore the secure flag if the original URI is not given or is not HTTPS
                if (!$url || !isset($urlParts['scheme']) || 'https' != $urlParts['scheme']) {
                    continue;
                }

                $values['secure'] = true;

                continue;
            }

            if ('httponly' === strtolower($part)) {
                $values['httponly'] = true;

                continue;
            }

            if (2 === count($elements = explode('=', $part, 2))) {
                if ('expires' === strtolower($elements[0])) {
                    $elements[1] = self::parseDate($elements[1]);
                }

                $values[strtolower($elements[0])] = $elements[1];
            }
        }

        return new static(
            $values['name'],
            $values['value'],
            $values['expires'],
            $values['path'],
            $values['domain'],
            $values['secure'],
            $values['httponly'],
            $values['passedRawValue']
        );
    }

    private static function parseDate($dateValue)
    {
        // trim single quotes around date if present
        if (($length = strlen($dateValue)) > 1 && "'" === $dateValue[0] && "'" === $dateValue[$length-1]) {
            $dateValue = substr($dateValue, 1, -1);
        }

        foreach (self::$dateFormats as $dateFormat) {
            if (false !== $date = \DateTime::createFromFormat($dateFormat, $dateValue, new \DateTimeZone('GMT'))) {
                return $date->getTimestamp();
            }
        }

        // attempt a fallback for unusual formatting
        if (false !== $date = date_create($dateValue, new \DateTimeZone('GMT'))) {
            return $date->getTimestamp();
        }

        throw new \InvalidArgumentException(sprintf('Could not parse date "%s".', $dateValue));
    }

    /**
     * Gets the name of the cookie.
     *
     * @return string The cookie name
     *
     * @api
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Gets the value of the cookie.
     *
     * @return string The cookie value
     *
     * @api
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * Gets the raw value of the cookie.
     *
     * @return string The cookie value
     *
     * @api
     */
    public function getRawValue()
    {
        return $this->rawValue;
    }

    /**
     * Gets the expires time of the cookie.
     *
     * @return string The cookie expires time
     *
     * @api
     */
    public function getExpiresTime()
    {
        return $this->expires;
    }

    /**
     * Gets the path of the cookie.
     *
     * @return string The cookie path
     *
     * @api
     */
    public function getPath()
    {
        return $this->path;
    }

    /**
     * Gets the domain of the cookie.
     *
     * @return string The cookie domain
     *
     * @api
     */
    public function getDomain()
    {
        return $this->domain;
    }

    /**
     * Returns the secure flag of the cookie.
     *
     * @return Boolean The cookie secure flag
     *
     * @api
     */
    public function isSecure()
    {
        return $this->secure;
    }

    /**
     * Returns the httponly flag of the cookie.
     *
     * @return Boolean The cookie httponly flag
     *
     * @api
     */
    public function isHttpOnly()
    {
        return $this->httponly;
    }

    /**
     * Returns true if the cookie has expired.
     *
     * @return Boolean true if the cookie has expired, false otherwise
     *
     * @api
     */
    public function isExpired()
    {
        return null !== $this->expires && 0 !== $this->expires && $this->expires < time();
    }
}
PKv`�\��/		-pear/Symfony/Component/BrowserKit/History.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit;

/**
 * History.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class History
{
    protected $stack = array();
    protected $position = -1;

    /**
     * Clears the history.
     */
    public function clear()
    {
        $this->stack = array();
        $this->position = -1;
    }

    /**
     * Adds a Request to the history.
     *
     * @param Request $request A Request instance
     */
    public function add(Request $request)
    {
        $this->stack = array_slice($this->stack, 0, $this->position + 1);
        $this->stack[] = clone $request;
        $this->position = count($this->stack) - 1;
    }

    /**
     * Returns true if the history is empty.
     *
     * @return Boolean true if the history is empty, false otherwise
     */
    public function isEmpty()
    {
        return count($this->stack) == 0;
    }

    /**
     * Goes back in the history.
     *
     * @return Request A Request instance
     *
     * @throws \LogicException if the stack is already on the first page
     */
    public function back()
    {
        if ($this->position < 1) {
            throw new \LogicException('You are already on the first page.');
        }

        return clone $this->stack[--$this->position];
    }

    /**
     * Goes forward in the history.
     *
     * @return Request A Request instance
     *
     * @throws \LogicException if the stack is already on the last page
     */
    public function forward()
    {
        if ($this->position > count($this->stack) - 2) {
            throw new \LogicException('You are already on the last page.');
        }

        return clone $this->stack[++$this->position];
    }

    /**
     * Returns the current element in the history.
     *
     * @return Request A Request instance
     *
     * @throws \LogicException if the stack is empty
     */
    public function current()
    {
        if (-1 == $this->position) {
            throw new \LogicException('The page history is empty.');
        }

        return clone $this->stack[$this->position];
    }
}
PKv`�\����
�
-pear/Symfony/Component/BrowserKit/Request.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit;

/**
 * Request object.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Request
{
    protected $uri;
    protected $method;
    protected $parameters;
    protected $files;
    protected $cookies;
    protected $server;
    protected $content;

    /**
     * Constructor.
     *
     * @param string $uri        The request URI
     * @param string $method     The HTTP method request
     * @param array  $parameters The request parameters
     * @param array  $files      An array of uploaded files
     * @param array  $cookies    An array of cookies
     * @param array  $server     An array of server parameters
     * @param string $content    The raw body data
     *
     * @api
     */
    public function __construct($uri, $method, array $parameters = array(), array $files = array(), array $cookies = array(), array $server = array(), $content = null)
    {
        $this->uri = $uri;
        $this->method = $method;
        $this->parameters = $parameters;
        $this->files = $files;
        $this->cookies = $cookies;
        $this->server = $server;
        $this->content = $content;
    }

    /**
     * Gets the request URI.
     *
     * @return string The request URI
     *
     * @api
     */
    public function getUri()
    {
        return $this->uri;
    }

    /**
     * Gets the request HTTP method.
     *
     * @return string The request HTTP method
     *
     * @api
     */
    public function getMethod()
    {
        return $this->method;
    }

    /**
     * Gets the request parameters.
     *
     * @return array The request parameters
     *
     * @api
     */
    public function getParameters()
    {
        return $this->parameters;
    }

    /**
     * Gets the request server files.
     *
     * @return array The request files
     *
     * @api
     */
    public function getFiles()
    {
        return $this->files;
    }

    /**
     * Gets the request cookies.
     *
     * @return array The request cookies
     *
     * @api
     */
    public function getCookies()
    {
        return $this->cookies;
    }

    /**
     * Gets the request server parameters.
     *
     * @return array The request server parameters
     *
     * @api
     */
    public function getServer()
    {
        return $this->server;
    }

    /**
     * Gets the request raw body data.
     *
     * @return string The request raw body data.
     *
     * @api
     */
    public function getContent()
    {
        return $this->content;
    }
}
PKw`�\�����/pear/Symfony/Component/BrowserKit/CookieJar.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit;

/**
 * CookieJar.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class CookieJar
{
    protected $cookieJar = array();

    /**
     * Sets a cookie.
     *
     * @param Cookie $cookie A Cookie instance
     *
     * @api
     */
    public function set(Cookie $cookie)
    {
        $this->cookieJar[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie;
    }

    /**
     * Gets a cookie by name.
     *
     * You should never use an empty domain, but if you do so,
     * this method returns the first cookie for the given name/path
     * (this behavior ensures a BC behavior with previous versions of
     * Symfony).
     *
     * @param string $name   The cookie name
     * @param string $path   The cookie path
     * @param string $domain The cookie domain
     *
     * @return Cookie|null A Cookie instance or null if the cookie does not exist
     *
     * @api
     */
    public function get($name, $path = '/', $domain = null)
    {
        $this->flushExpiredCookies();

        if (!empty($domain)) {
            foreach ($this->cookieJar as $cookieDomain => $pathCookies) {
                if ($cookieDomain) {
                    $cookieDomain = '.'.ltrim($cookieDomain, '.');
                    if ($cookieDomain != substr('.'.$domain, -strlen($cookieDomain))) {
                        continue;
                    }
                }

                foreach ($pathCookies as $cookiePath => $namedCookies) {
                    if ($cookiePath != substr($path, 0, strlen($cookiePath))) {
                        continue;
                    }
                    if (isset($namedCookies[$name])) {
                        return $namedCookies[$name];
                    }
                }
            }

            return null;
        }

        // avoid relying on this behavior that is mainly here for BC reasons
        foreach ($this->cookieJar as $cookies) {
            if (isset($cookies[$path][$name])) {
                return $cookies[$path][$name];
            }
        }

        return null;
    }

    /**
     * Removes a cookie by name.
     *
     * You should never use an empty domain, but if you do so,
     * all cookies for the given name/path expire (this behavior
     * ensures a BC behavior with previous versions of Symfony).
     *
     * @param string $name   The cookie name
     * @param string $path   The cookie path
     * @param string $domain The cookie domain
     *
     * @api
     */
    public function expire($name, $path = '/', $domain = null)
    {
        if (null === $path) {
            $path = '/';
        }

        if (empty($domain)) {
            // an empty domain means any domain
            // this should never happen but it allows for a better BC
            $domains = array_keys($this->cookieJar);
        } else {
            $domains = array($domain);
        }

        foreach ($domains as $domain) {
            unset($this->cookieJar[$domain][$path][$name]);

            if (empty($this->cookieJar[$domain][$path])) {
                unset($this->cookieJar[$domain][$path]);

                if (empty($this->cookieJar[$domain])) {
                    unset($this->cookieJar[$domain]);
                }
            }
        }
    }

    /**
     * Removes all the cookies from the jar.
     *
     * @api
     */
    public function clear()
    {
        $this->cookieJar = array();
    }

    /**
     * Updates the cookie jar from a response Set-Cookie headers.
     *
     * @param array  $setCookies Set-Cookie headers from an HTTP response
     * @param string $uri        The base URL
     */
    public function updateFromSetCookie(array $setCookies, $uri = null)
    {
        $cookies = array();

        foreach ($setCookies as $cookie) {
            foreach (explode(',', $cookie) as $i => $part) {
                if (0 === $i || preg_match('/^(?P<token>\s*[0-9A-Za-z!#\$%\&\'\*\+\-\.^_`\|~]+)=/', $part)) {
                    $cookies[] = ltrim($part);
                } else {
                    $cookies[count($cookies) - 1] .= ','.$part;
                }
            }
        }

        foreach ($cookies as $cookie) {
            try {
                $this->set(Cookie::fromString($cookie, $uri));
            } catch (\InvalidArgumentException $e) {
                // invalid cookies are just ignored
            }
        }
    }

    /**
     * Updates the cookie jar from a Response object.
     *
     * @param Response $response A Response object
     * @param string   $uri      The base URL
     */
    public function updateFromResponse(Response $response, $uri = null)
    {
        $this->updateFromSetCookie($response->getHeader('Set-Cookie', false), $uri);
    }

    /**
     * Returns not yet expired cookies.
     *
     * @return Cookie[] An array of cookies
     */
    public function all()
    {
        $this->flushExpiredCookies();

        $flattenedCookies = array();
        foreach ($this->cookieJar as $path) {
            foreach ($path as $cookies) {
                foreach ($cookies as $cookie) {
                    $flattenedCookies[] = $cookie;
                }
            }
        }

        return $flattenedCookies;
    }

    /**
     * Returns not yet expired cookie values for the given URI.
     *
     * @param string  $uri             A URI
     * @param Boolean $returnsRawValue Returns raw value or urldecoded value
     *
     * @return array An array of cookie values
     */
    public function allValues($uri, $returnsRawValue = false)
    {
        $this->flushExpiredCookies();

        $parts = array_replace(array('path' => '/'), parse_url($uri));
        $cookies = array();
        foreach ($this->cookieJar as $domain => $pathCookies) {
            if ($domain) {
                $domain = '.'.ltrim($domain, '.');
                if ($domain != substr('.'.$parts['host'], -strlen($domain))) {
                    continue;
                }
            }

            foreach ($pathCookies as $path => $namedCookies) {
                if ($path != substr($parts['path'], 0, strlen($path))) {
                    continue;
                }

                foreach ($namedCookies as $cookie) {
                    if ($cookie->isSecure() && 'https' != $parts['scheme']) {
                        continue;
                    }

                    $cookies[$cookie->getName()] = $returnsRawValue ? $cookie->getRawValue() : $cookie->getValue();
                }
            }
        }

        return $cookies;
    }

    /**
     * Returns not yet expired raw cookie values for the given URI.
     *
     * @param string $uri A URI
     *
     * @return array An array of cookie values
     */
    public function allRawValues($uri)
    {
        return $this->allValues($uri, true);
    }

    /**
     * Removes all expired cookies.
     */
    public function flushExpiredCookies()
    {
        foreach ($this->cookieJar as $domain => $pathCookies) {
            foreach ($pathCookies as $path => $namedCookies) {
                foreach ($namedCookies as $name => $cookie) {
                    if ($cookie->isExpired()) {
                        unset($this->cookieJar[$domain][$path][$name]);
                    }
                }
            }
        }
    }
}
PKw`�\l�-
-
.pear/Symfony/Component/BrowserKit/Response.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit;

/**
 * Response object.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Response
{
    protected $content;
    protected $status;
    protected $headers;

    /**
     * Constructor.
     *
     * The headers array is a set of key/value pairs. If a header is present multiple times
     * then the value is an array of all the values.
     *
     * @param string  $content The content of the response
     * @param integer $status  The response status code
     * @param array   $headers An array of headers
     *
     * @api
     */
    public function __construct($content = '', $status = 200, array $headers = array())
    {
        $this->content = $content;
        $this->status  = $status;
        $this->headers = $headers;
    }

    /**
     * Converts the response object to string containing all headers and the response content.
     *
     * @return string The response with headers and content
     */
    public function __toString()
    {
        $headers = '';
        foreach ($this->headers as $name => $value) {
            if (is_string($value)) {
                $headers .= $this->buildHeader($name, $value);
            } else {
                foreach ($value as $headerValue) {
                    $headers .= $this->buildHeader($name, $headerValue);
                }
            }
        }

        return $headers."\n".$this->content;
    }

    /**
     * Returns the build header line.
     *
     * @param string $name  The header name
     * @param string $value The header value
     *
     * @return string The built header line
     */
    protected function buildHeader($name, $value)
    {
        return sprintf("%s: %s\n", $name, $value);
    }

    /**
     * Gets the response content.
     *
     * @return string The response content
     *
     * @api
     */
    public function getContent()
    {
        return $this->content;
    }

    /**
     * Gets the response status code.
     *
     * @return integer The response status code
     *
     * @api
     */
    public function getStatus()
    {
        return $this->status;
    }

    /**
     * Gets the response headers.
     *
     * @return array The response headers
     *
     * @api
     */
    public function getHeaders()
    {
        return $this->headers;
    }

    /**
     * Gets a response header.
     *
     * @param string  $header The header name
     * @param Boolean $first  Whether to return the first value or all header values
     *
     * @return string|array The first header value if $first is true, an array of values otherwise
     */
    public function getHeader($header, $first = true)
    {
        foreach ($this->headers as $key => $value) {
            if (str_replace('-', '_', strtolower($key)) == str_replace('-', '_', strtolower($header))) {
                if ($first) {
                    return is_array($value) ? (count($value) ? $value[0] : '') : $value;
                }

                return is_array($value) ? $value : array($value);
            }
        }

        return $first ? null : array();
    }
}
PKw`�\.�TT0pear/Symfony/Component/BrowserKit/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\BrowserKit\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PKw`�\)%�,m
m
'pear/Symfony/Component/Yaml/Escaper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

/**
 * Escaper encapsulates escaping rules for single and double-quoted
 * YAML strings.
 *
 * @author Matthew Lewinski <matthew@lewinski.org>
 */
class Escaper
{
    // Characters that would cause a dumped string to require double quoting.
    const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9";

    // Mapping arrays for escaping a double quoted string. The backslash is
    // first to ensure proper escaping because str_replace operates iteratively
    // on the input arrays. This ordering of the characters avoids the use of strtr,
    // which performs more slowly.
    private static $escapees = array('\\\\', '\\"', '"',
                                     "\x00",  "\x01",  "\x02",  "\x03",  "\x04",  "\x05",  "\x06",  "\x07",
                                     "\x08",  "\x09",  "\x0a",  "\x0b",  "\x0c",  "\x0d",  "\x0e",  "\x0f",
                                     "\x10",  "\x11",  "\x12",  "\x13",  "\x14",  "\x15",  "\x16",  "\x17",
                                     "\x18",  "\x19",  "\x1a",  "\x1b",  "\x1c",  "\x1d",  "\x1e",  "\x1f",
                                     "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9");
    private static $escaped  = array('\\"', '\\\\', '\\"',
                                     "\\0",   "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\a",
                                     "\\b",   "\\t",   "\\n",   "\\v",   "\\f",   "\\r",   "\\x0e", "\\x0f",
                                     "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17",
                                     "\\x18", "\\x19", "\\x1a", "\\e",   "\\x1c", "\\x1d", "\\x1e", "\\x1f",
                                     "\\N", "\\_", "\\L", "\\P");

    /**
     * Determines if a PHP value would require double quoting in YAML.
     *
     * @param string $value A PHP value
     *
     * @return Boolean True if the value would require double quotes.
     */
    public static function requiresDoubleQuoting($value)
    {
        return preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value);
    }

    /**
     * Escapes and surrounds a PHP value with double quotes.
     *
     * @param string $value A PHP value
     *
     * @return string The quoted, escaped string
     */
    public static function escapeWithDoubleQuotes($value)
    {
        return sprintf('"%s"', str_replace(self::$escapees, self::$escaped, $value));
    }

    /**
     * Determines if a PHP value would require single quoting in YAML.
     *
     * @param string $value A PHP value
     *
     * @return Boolean True if the value would require single quotes.
     */
    public static function requiresSingleQuoting($value)
    {
        return preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x', $value);
    }

    /**
     * Escapes and surrounds a PHP value with single quotes.
     *
     * @param string $value A PHP value
     *
     * @return string The quoted, escaped string
     */
    public static function escapeWithSingleQuotes($value)
    {
        return sprintf("'%s'", str_replace('\'', '\'\'', $value));
    }
}
PKw`�\��X��[�[&pear/Symfony/Component/Yaml/Parser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\ParseException;

/**
 * Parser parses YAML strings to convert them to PHP arrays.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Parser
{
    const FOLDED_SCALAR_PATTERN = '(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?';

    private $offset         = 0;
    private $lines          = array();
    private $currentLineNb  = -1;
    private $currentLine    = '';
    private $refs           = array();

    /**
     * Constructor
     *
     * @param integer $offset The offset of YAML document (used for line numbers in error messages)
     */
    public function __construct($offset = 0)
    {
        $this->offset = $offset;
    }

    /**
     * Parses a YAML string to a PHP value.
     *
     * @param string  $value                  A YAML string
     * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
     * @param Boolean $objectSupport          true if object support is enabled, false otherwise
     *
     * @return mixed  A PHP value
     *
     * @throws ParseException If the YAML is not valid
     */
    public function parse($value, $exceptionOnInvalidType = false, $objectSupport = false)
    {
        $this->currentLineNb = -1;
        $this->currentLine = '';
        $this->lines = explode("\n", $this->cleanup($value));

        if (function_exists('mb_detect_encoding') && false === mb_detect_encoding($value, 'UTF-8', true)) {
            throw new ParseException('The YAML value does not appear to be valid UTF-8.');
        }

        if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
            $mbEncoding = mb_internal_encoding();
            mb_internal_encoding('UTF-8');
        }

        $data = array();
        $context = null;
        while ($this->moveToNextLine()) {
            if ($this->isCurrentLineEmpty()) {
                continue;
            }

            // tab?
            if ("\t" === $this->currentLine[0]) {
                throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
            }

            $isRef = $isInPlace = $isProcessed = false;
            if (preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+?))?\s*$#u', $this->currentLine, $values)) {
                if ($context && 'mapping' == $context) {
                    throw new ParseException('You cannot define a sequence item when in a mapping');
                }
                $context = 'sequence';

                if (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
                    $isRef = $matches['ref'];
                    $values['value'] = $matches['value'];
                }

                // array
                if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
                    $c = $this->getRealCurrentLineNb() + 1;
                    $parser = new Parser($c);
                    $parser->refs =& $this->refs;
                    $data[] = $parser->parse($this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport);
                } else {
                    if (isset($values['leadspaces'])
                        && ' ' == $values['leadspaces']
                        && preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $values['value'], $matches)
                    ) {
                        // this is a compact notation element, add to next block and parse
                        $c = $this->getRealCurrentLineNb();
                        $parser = new Parser($c);
                        $parser->refs =& $this->refs;

                        $block = $values['value'];
                        if ($this->isNextLineIndented()) {
                            $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + 2);
                        }

                        $data[] = $parser->parse($block, $exceptionOnInvalidType, $objectSupport);
                    } else {
                        $data[] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport);
                    }
                }
            } elseif (preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->currentLine, $values) && false === strpos($values['key'],' #')) {
                if ($context && 'sequence' == $context) {
                    throw new ParseException('You cannot define a mapping item when in a sequence');
                }
                $context = 'mapping';

                // force correct settings
                Inline::parse(null, $exceptionOnInvalidType, $objectSupport);
                try {
                    $key = Inline::parseScalar($values['key']);
                } catch (ParseException $e) {
                    $e->setParsedLine($this->getRealCurrentLineNb() + 1);
                    $e->setSnippet($this->currentLine);

                    throw $e;
                }

                if ('<<' === $key) {
                    if (isset($values['value']) && 0 === strpos($values['value'], '*')) {
                        $isInPlace = substr($values['value'], 1);
                        if (!array_key_exists($isInPlace, $this->refs)) {
                            throw new ParseException(sprintf('Reference "%s" does not exist.', $isInPlace), $this->getRealCurrentLineNb() + 1, $this->currentLine);
                        }
                    } else {
                        if (isset($values['value']) && $values['value'] !== '') {
                            $value = $values['value'];
                        } else {
                            $value = $this->getNextEmbedBlock();
                        }
                        $c = $this->getRealCurrentLineNb() + 1;
                        $parser = new Parser($c);
                        $parser->refs =& $this->refs;
                        $parsed = $parser->parse($value, $exceptionOnInvalidType, $objectSupport);

                        $merged = array();
                        if (!is_array($parsed)) {
                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
                        } elseif (isset($parsed[0])) {
                            // Numeric array, merge individual elements
                            foreach (array_reverse($parsed) as $parsedItem) {
                                if (!is_array($parsedItem)) {
                                    throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem);
                                }
                                $merged = array_merge($parsedItem, $merged);
                            }
                        } else {
                            // Associative array, merge
                            $merged = array_merge($merged, $parsed);
                        }

                        $isProcessed = $merged;
                    }
                } elseif (isset($values['value']) && preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
                    $isRef = $matches['ref'];
                    $values['value'] = $matches['value'];
                }

                if ($isProcessed) {
                    // Merge keys
                    $data = $isProcessed;
                // hash
                } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
                    // if next line is less indented or equal, then it means that the current value is null
                    if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) {
                        $data[$key] = null;
                    } else {
                        $c = $this->getRealCurrentLineNb() + 1;
                        $parser = new Parser($c);
                        $parser->refs =& $this->refs;
                        $data[$key] = $parser->parse($this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport);
                    }
                } else {
                    if ($isInPlace) {
                        $data = $this->refs[$isInPlace];
                    } else {
                        $data[$key] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport);
                    }
                }
            } else {
                // 1-liner optionally followed by newline
                $lineCount = count($this->lines);
                if (1 === $lineCount || (2 === $lineCount && empty($this->lines[1]))) {
                    try {
                        $value = Inline::parse($this->lines[0], $exceptionOnInvalidType, $objectSupport);
                    } catch (ParseException $e) {
                        $e->setParsedLine($this->getRealCurrentLineNb() + 1);
                        $e->setSnippet($this->currentLine);

                        throw $e;
                    }

                    if (is_array($value)) {
                        $first = reset($value);
                        if (is_string($first) && 0 === strpos($first, '*')) {
                            $data = array();
                            foreach ($value as $alias) {
                                $data[] = $this->refs[substr($alias, 1)];
                            }
                            $value = $data;
                        }
                    }

                    if (isset($mbEncoding)) {
                        mb_internal_encoding($mbEncoding);
                    }

                    return $value;
                }

                switch (preg_last_error()) {
                    case PREG_INTERNAL_ERROR:
                        $error = 'Internal PCRE error.';
                        break;
                    case PREG_BACKTRACK_LIMIT_ERROR:
                        $error = 'pcre.backtrack_limit reached.';
                        break;
                    case PREG_RECURSION_LIMIT_ERROR:
                        $error = 'pcre.recursion_limit reached.';
                        break;
                    case PREG_BAD_UTF8_ERROR:
                        $error = 'Malformed UTF-8 data.';
                        break;
                    case PREG_BAD_UTF8_OFFSET_ERROR:
                        $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.';
                        break;
                    default:
                        $error = 'Unable to parse.';
                }

                throw new ParseException($error, $this->getRealCurrentLineNb() + 1, $this->currentLine);
            }

            if ($isRef) {
                $this->refs[$isRef] = end($data);
            }
        }

        if (isset($mbEncoding)) {
            mb_internal_encoding($mbEncoding);
        }

        return empty($data) ? null : $data;
    }

    /**
     * Returns the current line number (takes the offset into account).
     *
     * @return integer The current line number
     */
    private function getRealCurrentLineNb()
    {
        return $this->currentLineNb + $this->offset;
    }

    /**
     * Returns the current line indentation.
     *
     * @return integer The current line indentation
     */
    private function getCurrentLineIndentation()
    {
        return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' '));
    }

    /**
     * Returns the next embed block of YAML.
     *
     * @param integer $indentation The indent level at which the block is to be read, or null for default
     *
     * @return string A YAML string
     *
     * @throws ParseException When indentation problem are detected
     */
    private function getNextEmbedBlock($indentation = null)
    {
        $this->moveToNextLine();

        if (null === $indentation) {
            $newIndent = $this->getCurrentLineIndentation();

            $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem($this->currentLine);

            if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
            }
        } else {
            $newIndent = $indentation;
        }

        $data = array(substr($this->currentLine, $newIndent));

        $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem($this->currentLine);

        // Comments must not be removed inside a string block (ie. after a line ending with "|")
        $removeCommentsPattern = '~'.self::FOLDED_SCALAR_PATTERN.'$~';
        $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);

        while ($this->moveToNextLine()) {
            $indent = $this->getCurrentLineIndentation();

            if ($indent === $newIndent) {
                $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
            }

            if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem($this->currentLine)) {
                $this->moveToPreviousLine();
                break;
            }

            if ($this->isCurrentLineBlank()) {
                $data[] = substr($this->currentLine, $newIndent);
                continue;
            }

            if ($removeComments && $this->isCurrentLineComment()) {
                continue;
            }

            if ($indent >= $newIndent) {
                $data[] = substr($this->currentLine, $newIndent);
            } elseif (0 == $indent) {
                $this->moveToPreviousLine();

                break;
            } else {
                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
            }
        }

        return implode("\n", $data);
    }

    /**
     * Moves the parser to the next line.
     *
     * @return Boolean
     */
    private function moveToNextLine()
    {
        if ($this->currentLineNb >= count($this->lines) - 1) {
            return false;
        }

        $this->currentLine = $this->lines[++$this->currentLineNb];

        return true;
    }

    /**
     * Moves the parser to the previous line.
     */
    private function moveToPreviousLine()
    {
        $this->currentLine = $this->lines[--$this->currentLineNb];
    }

    /**
     * Parses a YAML value.
     *
     * @param string  $value                  A YAML value
     * @param Boolean $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
     * @param Boolean $objectSupport          True if object support is enabled, false otherwise
     *
     * @return mixed  A PHP value
     *
     * @throws ParseException When reference does not exist
     */
    private function parseValue($value, $exceptionOnInvalidType, $objectSupport)
    {
        if (0 === strpos($value, '*')) {
            if (false !== $pos = strpos($value, '#')) {
                $value = substr($value, 1, $pos - 2);
            } else {
                $value = substr($value, 1);
            }

            if (!array_key_exists($value, $this->refs)) {
                throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLine);
            }

            return $this->refs[$value];
        }

        if (preg_match('/^'.self::FOLDED_SCALAR_PATTERN.'$/', $value, $matches)) {
            $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : '';

            return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), intval(abs($modifiers)));
        }

        try {
            return Inline::parse($value, $exceptionOnInvalidType, $objectSupport);
        } catch (ParseException $e) {
            $e->setParsedLine($this->getRealCurrentLineNb() + 1);
            $e->setSnippet($this->currentLine);

            throw $e;
        }
    }

    /**
     * Parses a folded scalar.
     *
     * @param string  $separator   The separator that was used to begin this folded scalar (| or >)
     * @param string  $indicator   The indicator that was used to begin this folded scalar (+ or -)
     * @param integer $indentation The indentation that was used to begin this folded scalar
     *
     * @return string  The text value
     */
    private function parseFoldedScalar($separator, $indicator = '', $indentation = 0)
    {
        $notEOF = $this->moveToNextLine();
        if (!$notEOF) {
            return '';
        }

        $isCurrentLineBlank = $this->isCurrentLineBlank();
        $text = '';

        // leading blank lines are consumed before determining indentation
        while ($notEOF && $isCurrentLineBlank) {
            // newline only if not EOF
            if ($notEOF = $this->moveToNextLine()) {
                $text .= "\n";
                $isCurrentLineBlank = $this->isCurrentLineBlank();
            }
        }

        // determine indentation if not specified
        if (0 === $indentation) {
            if (preg_match('/^ +/', $this->currentLine, $matches)) {
                $indentation = strlen($matches[0]);
            }
        }

        if ($indentation > 0) {
            $pattern = sprintf('/^ {%d}(.*)$/', $indentation);

            while (
                $notEOF && (
                    $isCurrentLineBlank ||
                    preg_match($pattern, $this->currentLine, $matches)
                )
            ) {
                if ($isCurrentLineBlank) {
                    $text .= substr($this->currentLine, $indentation);
                } else {
                    $text .= $matches[1];
                }

                // newline only if not EOF
                if ($notEOF = $this->moveToNextLine()) {
                    $text .= "\n";
                    $isCurrentLineBlank = $this->isCurrentLineBlank();
                }
            }
        } elseif ($notEOF) {
            $text .= "\n";
        }

        if ($notEOF) {
            $this->moveToPreviousLine();
        }

        // replace all non-trailing single newlines with spaces in folded blocks
        if ('>' === $separator) {
            preg_match('/(\n*)$/', $text, $matches);
            $text = preg_replace('/(?<!\n)\n(?!\n)/', ' ', rtrim($text, "\n"));
            $text .= $matches[1];
        }

        // deal with trailing newlines as indicated
        if ('' === $indicator) {
            $text = preg_replace('/\n+$/s', "\n", $text);
        } elseif ('-' === $indicator) {
            $text = preg_replace('/\n+$/s', '', $text);
        }

        return $text;
    }

    /**
     * Returns true if the next line is indented.
     *
     * @return Boolean Returns true if the next line is indented, false otherwise
     */
    private function isNextLineIndented()
    {
        $currentIndentation = $this->getCurrentLineIndentation();
        $EOF = !$this->moveToNextLine();

        while (!$EOF && $this->isCurrentLineEmpty()) {
            $EOF = !$this->moveToNextLine();
        }

        if ($EOF) {
            return false;
        }

        $ret = false;
        if ($this->getCurrentLineIndentation() > $currentIndentation) {
            $ret = true;
        }

        $this->moveToPreviousLine();

        return $ret;
    }

    /**
     * Returns true if the current line is blank or if it is a comment line.
     *
     * @return Boolean Returns true if the current line is empty or if it is a comment line, false otherwise
     */
    private function isCurrentLineEmpty()
    {
        return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
    }

    /**
     * Returns true if the current line is blank.
     *
     * @return Boolean Returns true if the current line is blank, false otherwise
     */
    private function isCurrentLineBlank()
    {
        return '' == trim($this->currentLine, ' ');
    }

    /**
     * Returns true if the current line is a comment line.
     *
     * @return Boolean Returns true if the current line is a comment line, false otherwise
     */
    private function isCurrentLineComment()
    {
        //checking explicitly the first char of the trim is faster than loops or strpos
        $ltrimmedLine = ltrim($this->currentLine, ' ');

        return $ltrimmedLine[0] === '#';
    }

    /**
     * Cleanups a YAML string to be parsed.
     *
     * @param string $value The input YAML string
     *
     * @return string A cleaned up YAML string
     */
    private function cleanup($value)
    {
        $value = str_replace(array("\r\n", "\r"), "\n", $value);

        // strip YAML header
        $count = 0;
        $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#su', '', $value, -1, $count);
        $this->offset += $count;

        // remove leading comments
        $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count);
        if ($count == 1) {
            // items have been removed, update the offset
            $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
            $value = $trimmedValue;
        }

        // remove start of the document marker (---)
        $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count);
        if ($count == 1) {
            // items have been removed, update the offset
            $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
            $value = $trimmedValue;

            // remove end of the document marker (...)
            $value = preg_replace('#\.\.\.\s*$#s', '', $value);
        }

        return $value;
    }

    /**
     * Returns true if the next line starts unindented collection
     *
     * @return Boolean Returns true if the next line starts unindented collection, false otherwise
     */
    private function isNextLineUnIndentedCollection()
    {
        $currentIndentation = $this->getCurrentLineIndentation();
        $notEOF = $this->moveToNextLine();

        while ($notEOF && $this->isCurrentLineEmpty()) {
            $notEOF = $this->moveToNextLine();
        }

        if (false === $notEOF) {
            return false;
        }

        $ret = false;
        if (
            $this->getCurrentLineIndentation() == $currentIndentation
            &&
            $this->isStringUnIndentedCollectionItem($this->currentLine)
        ) {
            $ret = true;
        }

        $this->moveToPreviousLine();

        return $ret;
    }

    /**
     * Returns true if the string is un-indented collection item
     *
     * @return Boolean Returns true if the string is un-indented collection item, false otherwise
     */
    private function isStringUnIndentedCollectionItem()
    {
        return (0 === strpos($this->currentLine, '- '));
    }

}
PKw`�\6�H	��)pear/Symfony/Component/Yaml/Unescaper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

/**
 * Unescaper encapsulates unescaping rules for single and double-quoted
 * YAML strings.
 *
 * @author Matthew Lewinski <matthew@lewinski.org>
 */
class Unescaper
{
    // Parser and Inline assume UTF-8 encoding, so escaped Unicode characters
    // must be converted to that encoding.
    const ENCODING = 'UTF-8';

    // Regex fragment that matches an escaped character in a double quoted
    // string.
    const REGEX_ESCAPED_CHARACTER = "\\\\([0abt\tnvfre \\\"\\/\\\\N_LP]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})";

    /**
     * Unescapes a single quoted string.
     *
     * @param string $value A single quoted string.
     *
     * @return string The unescaped string.
     */
    public function unescapeSingleQuotedString($value)
    {
        return str_replace('\'\'', '\'', $value);
    }

    /**
     * Unescapes a double quoted string.
     *
     * @param string $value A double quoted string.
     *
     * @return string The unescaped string.
     */
    public function unescapeDoubleQuotedString($value)
    {
        $self = $this;
        $callback = function ($match) use ($self) {
            return $self->unescapeCharacter($match[0]);
        };

        // evaluate the string
        return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value);
    }

    /**
     * Unescapes a character that was found in a double-quoted string
     *
     * @param string $value An escaped character
     *
     * @return string The unescaped character
     */
    public function unescapeCharacter($value)
    {
        switch ($value{1}) {
            case '0':
                return "\x0";
            case 'a':
                return "\x7";
            case 'b':
                return "\x8";
            case 't':
                return "\t";
            case "\t":
                return "\t";
            case 'n':
                return "\n";
            case 'v':
                return "\xb";
            case 'f':
                return "\xc";
            case 'r':
                return "\xd";
            case 'e':
                return "\x1b";
            case ' ':
                return ' ';
            case '"':
                return '"';
            case '/':
                return '/';
            case '\\':
                return '\\';
            case 'N':
                // U+0085 NEXT LINE
                return $this->convertEncoding("\x00\x85", self::ENCODING, 'UCS-2BE');
            case '_':
                // U+00A0 NO-BREAK SPACE
                return $this->convertEncoding("\x00\xA0", self::ENCODING, 'UCS-2BE');
            case 'L':
                // U+2028 LINE SEPARATOR
                return $this->convertEncoding("\x20\x28", self::ENCODING, 'UCS-2BE');
            case 'P':
                // U+2029 PARAGRAPH SEPARATOR
                return $this->convertEncoding("\x20\x29", self::ENCODING, 'UCS-2BE');
            case 'x':
                $char = pack('n', hexdec(substr($value, 2, 2)));

                return $this->convertEncoding($char, self::ENCODING, 'UCS-2BE');
            case 'u':
                $char = pack('n', hexdec(substr($value, 2, 4)));

                return $this->convertEncoding($char, self::ENCODING, 'UCS-2BE');
            case 'U':
                $char = pack('N', hexdec(substr($value, 2, 8)));

                return $this->convertEncoding($char, self::ENCODING, 'UCS-4BE');
        }
    }

    /**
     * Convert a string from one encoding to another.
     *
     * @param string $value The string to convert
     * @param string $to    The input encoding
     * @param string $from  The output encoding
     *
     * @return string The string with the new encoding
     *
     * @throws \RuntimeException if no suitable encoding function is found (iconv or mbstring)
     */
    private function convertEncoding($value, $to, $from)
    {
        if (function_exists('mb_convert_encoding')) {
            return mb_convert_encoding($value, $to, $from);
        } elseif (function_exists('iconv')) {
            return iconv($from, $to, $value);
        }

        throw new \RuntimeException('No suitable convert encoding function (install the iconv or mbstring extension).');
    }
}
PKw`�\�8�n�	�	&pear/Symfony/Component/Yaml/Dumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

/**
 * Dumper dumps PHP variables to YAML strings.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Dumper
{
    /**
     * The amount of spaces to use for indentation of nested nodes.
     *
     * @var integer
     */
    protected $indentation = 4;

    /**
     * Sets the indentation.
     *
     * @param integer $num The amount of spaces to use for indentation of nested nodes.
     */
    public function setIndentation($num)
    {
        $this->indentation = (int) $num;
    }

    /**
     * Dumps a PHP value to YAML.
     *
     * @param mixed   $input                  The PHP value
     * @param integer $inline                 The level where you switch to inline YAML
     * @param integer $indent                 The level of indentation (used internally)
     * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
     * @param Boolean $objectSupport          true if object support is enabled, false otherwise
     *
     * @return string  The YAML representation of the PHP value
     */
    public function dump($input, $inline = 0, $indent = 0, $exceptionOnInvalidType = false, $objectSupport = false)
    {
        $output = '';
        $prefix = $indent ? str_repeat(' ', $indent) : '';

        if ($inline <= 0 || !is_array($input) || empty($input)) {
            $output .= $prefix.Inline::dump($input, $exceptionOnInvalidType, $objectSupport);
        } else {
            $isAHash = array_keys($input) !== range(0, count($input) - 1);

            foreach ($input as $key => $value) {
                $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value);

                $output .= sprintf('%s%s%s%s',
                    $prefix,
                    $isAHash ? Inline::dump($key, $exceptionOnInvalidType, $objectSupport).':' : '-',
                    $willBeInlined ? ' ' : "\n",
                    $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $exceptionOnInvalidType, $objectSupport)
                ).($willBeInlined ? "\n" : '');
            }
        }

        return $output;
    }
}
PKw`�\�bNN*pear/Symfony/Component/Yaml/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Yaml\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PKw`�\q+�3�?�?&pear/Symfony/Component/Yaml/Inline.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Exception\DumpException;

/**
 * Inline implements a YAML parser/dumper for the YAML inline syntax.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Inline
{
    const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')';

    private static $exceptionOnInvalidType = false;
    private static $objectSupport = false;

    /**
     * Converts a YAML string to a PHP array.
     *
     * @param string  $value                  A YAML string
     * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
     * @param Boolean $objectSupport          true if object support is enabled, false otherwise
     *
     * @return array A PHP array representing the YAML string
     *
     * @throws ParseException
     */
    public static function parse($value, $exceptionOnInvalidType = false, $objectSupport = false)
    {
        self::$exceptionOnInvalidType = $exceptionOnInvalidType;
        self::$objectSupport = $objectSupport;

        $value = trim($value);

        if (0 == strlen($value)) {
            return '';
        }

        if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
            $mbEncoding = mb_internal_encoding();
            mb_internal_encoding('ASCII');
        }

        $i = 0;
        switch ($value[0]) {
            case '[':
                $result = self::parseSequence($value, $i);
                ++$i;
                break;
            case '{':
                $result = self::parseMapping($value, $i);
                ++$i;
                break;
            default:
                $result = self::parseScalar($value, null, array('"', "'"), $i);
        }

        // some comments are allowed at the end
        if (preg_replace('/\s+#.*$/A', '', substr($value, $i))) {
            throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)));
        }

        if (isset($mbEncoding)) {
            mb_internal_encoding($mbEncoding);
        }

        return $result;
    }

    /**
     * Dumps a given PHP variable to a YAML string.
     *
     * @param mixed   $value                  The PHP variable to convert
     * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
     * @param Boolean $objectSupport          true if object support is enabled, false otherwise
     *
     * @return string The YAML string representing the PHP array
     *
     * @throws DumpException When trying to dump PHP resource
     */
    public static function dump($value, $exceptionOnInvalidType = false, $objectSupport = false)
    {
        switch (true) {
            case is_resource($value):
                if ($exceptionOnInvalidType) {
                    throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
                }

                return 'null';
            case is_object($value):
                if ($objectSupport) {
                    return '!!php/object:'.serialize($value);
                }

                if ($exceptionOnInvalidType) {
                    throw new DumpException('Object support when dumping a YAML file has been disabled.');
                }

                return 'null';
            case is_array($value):
                return self::dumpArray($value, $exceptionOnInvalidType, $objectSupport);
            case null === $value:
                return 'null';
            case true === $value:
                return 'true';
            case false === $value:
                return 'false';
            case ctype_digit($value):
                return is_string($value) ? "'$value'" : (int) $value;
            case is_numeric($value):
                $locale = setlocale(LC_NUMERIC, 0);
                if (false !== $locale) {
                    setlocale(LC_NUMERIC, 'C');
                }
                $repr = is_string($value) ? "'$value'" : (is_infinite($value) ? str_ireplace('INF', '.Inf', strval($value)) : strval($value));

                if (false !== $locale) {
                    setlocale(LC_NUMERIC, $locale);
                }

                return $repr;
            case Escaper::requiresDoubleQuoting($value):
                return Escaper::escapeWithDoubleQuotes($value);
            case Escaper::requiresSingleQuoting($value):
                return Escaper::escapeWithSingleQuotes($value);
            case '' == $value:
                return "''";
            case preg_match(self::getTimestampRegex(), $value):
            case in_array(strtolower($value), array('null', '~', 'true', 'false')):
                return "'$value'";
            default:
                return $value;
        }
    }

    /**
     * Dumps a PHP array to a YAML string.
     *
     * @param array   $value                  The PHP array to dump
     * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
     * @param Boolean $objectSupport          true if object support is enabled, false otherwise
     *
     * @return string The YAML string representing the PHP array
     */
    private static function dumpArray($value, $exceptionOnInvalidType, $objectSupport)
    {
        // array
        $keys = array_keys($value);
        if ((1 == count($keys) && '0' == $keys[0])
            || (count($keys) > 1 && array_reduce($keys, function ($v, $w) { return (integer) $v + $w; }, 0) == count($keys) * (count($keys) - 1) / 2)
        ) {
            $output = array();
            foreach ($value as $val) {
                $output[] = self::dump($val, $exceptionOnInvalidType, $objectSupport);
            }

            return sprintf('[%s]', implode(', ', $output));
        }

        // mapping
        $output = array();
        foreach ($value as $key => $val) {
            $output[] = sprintf('%s: %s', self::dump($key, $exceptionOnInvalidType, $objectSupport), self::dump($val, $exceptionOnInvalidType, $objectSupport));
        }

        return sprintf('{ %s }', implode(', ', $output));
    }

    /**
     * Parses a scalar to a YAML string.
     *
     * @param scalar $scalar
     * @param string $delimiters
     * @param array  $stringDelimiters
     * @param integer &$i
     * @param Boolean $evaluate
     *
     * @return string A YAML string
     *
     * @throws ParseException When malformed inline YAML string is parsed
     */
    public static function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true)
    {
        if (in_array($scalar[$i], $stringDelimiters)) {
            // quoted scalar
            $output = self::parseQuotedScalar($scalar, $i);

            if (null !== $delimiters) {
                $tmp = ltrim(substr($scalar, $i), ' ');
                if (!in_array($tmp[0], $delimiters)) {
                    throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)));
                }
            }
        } else {
            // "normal" string
            if (!$delimiters) {
                $output = substr($scalar, $i);
                $i += strlen($output);

                // remove comments
                if (false !== $strpos = strpos($output, ' #')) {
                    $output = rtrim(substr($output, 0, $strpos));
                }
            } elseif (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
                $output = $match[1];
                $i += strlen($output);
            } else {
                throw new ParseException(sprintf('Malformed inline YAML string (%s).', $scalar));
            }

            if ($evaluate) {
                $output = self::evaluateScalar($output);
            }
        }

        return $output;
    }

    /**
     * Parses a quoted scalar to YAML.
     *
     * @param string $scalar
     * @param integer &$i
     *
     * @return string A YAML string
     *
     * @throws ParseException When malformed inline YAML string is parsed
     */
    private static function parseQuotedScalar($scalar, &$i)
    {
        if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
            throw new ParseException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i)));
        }

        $output = substr($match[0], 1, strlen($match[0]) - 2);

        $unescaper = new Unescaper();
        if ('"' == $scalar[$i]) {
            $output = $unescaper->unescapeDoubleQuotedString($output);
        } else {
            $output = $unescaper->unescapeSingleQuotedString($output);
        }

        $i += strlen($match[0]);

        return $output;
    }

    /**
     * Parses a sequence to a YAML string.
     *
     * @param string $sequence
     * @param integer &$i
     *
     * @return string A YAML string
     *
     * @throws ParseException When malformed inline YAML string is parsed
     */
    private static function parseSequence($sequence, &$i = 0)
    {
        $output = array();
        $len = strlen($sequence);
        $i += 1;

        // [foo, bar, ...]
        while ($i < $len) {
            switch ($sequence[$i]) {
                case '[':
                    // nested sequence
                    $output[] = self::parseSequence($sequence, $i);
                    break;
                case '{':
                    // nested mapping
                    $output[] = self::parseMapping($sequence, $i);
                    break;
                case ']':
                    return $output;
                case ',':
                case ' ':
                    break;
                default:
                    $isQuoted = in_array($sequence[$i], array('"', "'"));
                    $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i);

                    if (!$isQuoted && false !== strpos($value, ': ')) {
                        // embedded mapping?
                        try {
                            $value = self::parseMapping('{'.$value.'}');
                        } catch (\InvalidArgumentException $e) {
                            // no, it's not
                        }
                    }

                    $output[] = $value;

                    --$i;
            }

            ++$i;
        }

        throw new ParseException(sprintf('Malformed inline YAML string %s', $sequence));
    }

    /**
     * Parses a mapping to a YAML string.
     *
     * @param string $mapping
     * @param integer &$i
     *
     * @return string A YAML string
     *
     * @throws ParseException When malformed inline YAML string is parsed
     */
    private static function parseMapping($mapping, &$i = 0)
    {
        $output = array();
        $len = strlen($mapping);
        $i += 1;

        // {foo: bar, bar:foo, ...}
        while ($i < $len) {
            switch ($mapping[$i]) {
                case ' ':
                case ',':
                    ++$i;
                    continue 2;
                case '}':
                    return $output;
            }

            // key
            $key = self::parseScalar($mapping, array(':', ' '), array('"', "'"), $i, false);

            // value
            $done = false;
            while ($i < $len) {
                switch ($mapping[$i]) {
                    case '[':
                        // nested sequence
                        $output[$key] = self::parseSequence($mapping, $i);
                        $done = true;
                        break;
                    case '{':
                        // nested mapping
                        $output[$key] = self::parseMapping($mapping, $i);
                        $done = true;
                        break;
                    case ':':
                    case ' ':
                        break;
                    default:
                        $output[$key] = self::parseScalar($mapping, array(',', '}'), array('"', "'"), $i);
                        $done = true;
                        --$i;
                }

                ++$i;

                if ($done) {
                    continue 2;
                }
            }
        }

        throw new ParseException(sprintf('Malformed inline YAML string %s', $mapping));
    }

    /**
     * Evaluates scalars and replaces magic values.
     *
     * @param string $scalar
     *
     * @return string A YAML string
     */
    private static function evaluateScalar($scalar)
    {
        $scalar = trim($scalar);
        $scalarLower = strtolower($scalar);
        switch (true) {
            case 'null' === $scalarLower:
            case '' === $scalar:
            case '~' === $scalar:
                return null;
            case 'true' === $scalarLower:
                return true;
            case 'false' === $scalarLower:
                return false;
            // Optimise for returning strings.
            case $scalar[0] === '+' || $scalar[0] === '-' || $scalar[0] === '.' || $scalar[0] === '!' || is_numeric($scalar[0]):
                switch (true) {
                    case 0 === strpos($scalar, '!str'):
                        return (string) substr($scalar, 5);
                    case 0 === strpos($scalar, '! '):
                        return intval(self::parseScalar(substr($scalar, 2)));
                    case 0 === strpos($scalar, '!!php/object:'):
                        if (self::$objectSupport) {
                            return unserialize(substr($scalar, 13));
                        }

                        if (self::$exceptionOnInvalidType) {
                            throw new ParseException('Object support when parsing a YAML file has been disabled.');
                        }

                        return null;
                    case ctype_digit($scalar):
                        $raw = $scalar;
                        $cast = intval($scalar);

                        return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
                    case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)):
                        $raw = $scalar;
                        $cast = intval($scalar);

                        return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw);
                    case is_numeric($scalar):
                        return '0x' == $scalar[0].$scalar[1] ? hexdec($scalar) : floatval($scalar);
                    case '.inf' === $scalarLower:
                    case '.nan' === $scalarLower:
                        return -log(0);
                    case '-.inf' === $scalarLower:
                        return log(0);
                    case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
                        return floatval(str_replace(',', '', $scalar));
                    case preg_match(self::getTimestampRegex(), $scalar):
                        return strtotime($scalar);
                }
            default:
                return (string) $scalar;
        }
    }

    /**
     * Gets a regex that matches a YAML date.
     *
     * @return string The regular expression
     *
     * @see http://www.yaml.org/spec/1.2/spec.html#id2761573
     */
    private static function getTimestampRegex()
    {
        return <<<EOF
        ~^
        (?P<year>[0-9][0-9][0-9][0-9])
        -(?P<month>[0-9][0-9]?)
        -(?P<day>[0-9][0-9]?)
        (?:(?:[Tt]|[ \t]+)
        (?P<hour>[0-9][0-9]?)
        :(?P<minute>[0-9][0-9])
        :(?P<second>[0-9][0-9])
        (?:\.(?P<fraction>[0-9]*))?
        (?:[ \t]*(?P<tz>Z|(?P<tz_sign>[-+])(?P<tz_hour>[0-9][0-9]?)
        (?::(?P<tz_minute>[0-9][0-9]))?))?)?
        $~x
EOF;
    }
}
PKx`�\�����
�
8pear/Symfony/Component/Yaml/Exception/ParseException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Exception;

if (!defined('JSON_UNESCAPED_UNICODE')) {
    define('JSON_UNESCAPED_SLASHES', 64);
    define('JSON_UNESCAPED_UNICODE', 256);
}

/**
 * Exception class thrown when an error occurs during parsing.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ParseException extends RuntimeException
{
    private $parsedFile;
    private $parsedLine;
    private $snippet;
    private $rawMessage;

    /**
     * Constructor.
     *
     * @param string    $message    The error message
     * @param integer   $parsedLine The line where the error occurred
     * @param integer   $snippet    The snippet of code near the problem
     * @param string    $parsedFile The file name where the error occurred
     * @param \Exception $previous   The previous exception
     */
    public function __construct($message, $parsedLine = -1, $snippet = null, $parsedFile = null, \Exception $previous = null)
    {
        $this->parsedFile = $parsedFile;
        $this->parsedLine = $parsedLine;
        $this->snippet = $snippet;
        $this->rawMessage = $message;

        $this->updateRepr();

        parent::__construct($this->message, 0, $previous);
    }

    /**
     * Gets the snippet of code near the error.
     *
     * @return string The snippet of code
     */
    public function getSnippet()
    {
        return $this->snippet;
    }

    /**
     * Sets the snippet of code near the error.
     *
     * @param string $snippet The code snippet
     */
    public function setSnippet($snippet)
    {
        $this->snippet = $snippet;

        $this->updateRepr();
    }

    /**
     * Gets the filename where the error occurred.
     *
     * This method returns null if a string is parsed.
     *
     * @return string The filename
     */
    public function getParsedFile()
    {
        return $this->parsedFile;
    }

    /**
     * Sets the filename where the error occurred.
     *
     * @param string $parsedFile The filename
     */
    public function setParsedFile($parsedFile)
    {
        $this->parsedFile = $parsedFile;

        $this->updateRepr();
    }

    /**
     * Gets the line where the error occurred.
     *
     * @return integer The file line
     */
    public function getParsedLine()
    {
        return $this->parsedLine;
    }

    /**
     * Sets the line where the error occurred.
     *
     * @param integer $parsedLine The file line
     */
    public function setParsedLine($parsedLine)
    {
        $this->parsedLine = $parsedLine;

        $this->updateRepr();
    }

    private function updateRepr()
    {
        $this->message = $this->rawMessage;

        $dot = false;
        if ('.' === substr($this->message, -1)) {
            $this->message = substr($this->message, 0, -1);
            $dot = true;
        }

        if (null !== $this->parsedFile) {
            $this->message .= sprintf(' in %s', json_encode($this->parsedFile, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
        }

        if ($this->parsedLine >= 0) {
            $this->message .= sprintf(' at line %d', $this->parsedLine);
        }

        if ($this->snippet) {
            $this->message .= sprintf(' (near "%s")', $this->snippet);
        }

        if ($dot) {
            $this->message .= '.';
        }
    }
}
PKx`�\�|�-��:pear/Symfony/Component/Yaml/Exception/RuntimeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Exception;

/**
 * Exception class thrown when an error occurs during parsing.
 *
 * @author Romain Neutron <imprec@gmail.com>
 *
 * @api
 */
class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
PKx`�\�+�l��<pear/Symfony/Component/Yaml/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Exception;

/**
 * Exception interface for all exceptions thrown by the component.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface ExceptionInterface
{
}
PKx`�\ؙ՚��7pear/Symfony/Component/Yaml/Exception/DumpException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Exception;

/**
 * Exception class thrown when an error occurs during dumping.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class DumpException extends RuntimeException
{
}
PKx`�\7MӺ

$pear/Symfony/Component/Yaml/Yaml.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml;

use Symfony\Component\Yaml\Exception\ParseException;

/**
 * Yaml offers convenience methods to load and dump YAML.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Yaml
{
    /**
     * Parses YAML into a PHP array.
     *
     * The parse method, when supplied with a YAML stream (string or file),
     * will do its best to convert YAML in a file into a PHP array.
     *
     *  Usage:
     *  <code>
     *   $array = Yaml::parse('config.yml');
     *   print_r($array);
     *  </code>
     *
     * As this method accepts both plain strings and file names as an input,
     * you must validate the input before calling this method. Passing a file
     * as an input is a deprecated feature and will be removed in 3.0.
     *
     * @param string  $input                  Path to a YAML file or a string containing YAML
     * @param Boolean $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
     * @param Boolean $objectSupport          True if object support is enabled, false otherwise
     *
     * @return array The YAML converted to a PHP array
     *
     * @throws ParseException If the YAML is not valid
     *
     * @api
     */
    public static function parse($input, $exceptionOnInvalidType = false, $objectSupport = false)
    {
        // if input is a file, process it
        $file = '';
        if (strpos($input, "\n") === false && is_file($input)) {
            if (false === is_readable($input)) {
                throw new ParseException(sprintf('Unable to parse "%s" as the file is not readable.', $input));
            }

            $file = $input;
            $input = file_get_contents($file);
        }

        $yaml = new Parser();

        try {
            return $yaml->parse($input, $exceptionOnInvalidType, $objectSupport);
        } catch (ParseException $e) {
            if ($file) {
                $e->setParsedFile($file);
            }

            throw $e;
        }
    }

    /**
     * Dumps a PHP array to a YAML string.
     *
     * The dump method, when supplied with an array, will do its best
     * to convert the array into friendly YAML.
     *
     * @param array   $array                  PHP array
     * @param integer $inline                 The level where you switch to inline YAML
     * @param integer $indent                 The amount of spaces to use for indentation of nested nodes.
     * @param Boolean $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise
     * @param Boolean $objectSupport          true if object support is enabled, false otherwise
     *
     * @return string A YAML string representing the original PHP array
     *
     * @api
     */
    public static function dump($array, $inline = 2, $indent = 4, $exceptionOnInvalidType = false, $objectSupport = false)
    {
        $yaml = new Dumper();
        $yaml->setIndentation($indent);

        return $yaml->dump($array, $inline, 0, $exceptionOnInvalidType, $objectSupport);
    }
}
PKx`�\��k��/pear/Symfony/Component/Config/Util/XmlUtils.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Util;

/**
 * XMLUtils is a bunch of utility methods to XML operations.
 *
 * This class contains static methods only and is not meant to be instantiated.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Martin Hasoň <martin.hason@gmail.com>
 */
class XmlUtils
{
    /**
     * This class should not be instantiated
     */
    private function __construct()
    {
    }

    /**
     * Loads an XML file.
     *
     * @param string               $file             An XML file path
     * @param string|callable|null $schemaOrCallable An XSD schema file path, a callable, or null to disable validation
     *
     * @return \DOMDocument
     *
     * @throws \InvalidArgumentException When loading of XML file returns error
     */
    public static function loadFile($file, $schemaOrCallable = null)
    {
        $content = @file_get_contents($file);
        if ('' === trim($content)) {
            throw new \InvalidArgumentException(sprintf('File %s does not contain valid XML, it is empty.', $file));
        }

        $internalErrors = libxml_use_internal_errors(true);
        $disableEntities = libxml_disable_entity_loader(true);
        libxml_clear_errors();

        $dom = new \DOMDocument();
        $dom->validateOnParse = true;
        if (!$dom->loadXML($content, LIBXML_NONET | (defined('LIBXML_COMPACT') ? LIBXML_COMPACT : 0))) {
            libxml_disable_entity_loader($disableEntities);

            throw new \InvalidArgumentException(implode("\n", static::getXmlErrors($internalErrors)));
        }

        $dom->normalizeDocument();

        libxml_use_internal_errors($internalErrors);
        libxml_disable_entity_loader($disableEntities);

        foreach ($dom->childNodes as $child) {
            if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
                throw new \InvalidArgumentException('Document types are not allowed.');
            }
        }

        if (null !== $schemaOrCallable) {
            $internalErrors = libxml_use_internal_errors(true);
            libxml_clear_errors();

            $e = null;
            if (is_callable($schemaOrCallable)) {
                try {
                    $valid = call_user_func($schemaOrCallable, $dom, $internalErrors);
                } catch (\Exception $e) {
                    $valid = false;
                }
            } elseif (!is_array($schemaOrCallable) && is_file((string) $schemaOrCallable)) {
                $valid = @$dom->schemaValidate($schemaOrCallable);
            } else {
                libxml_use_internal_errors($internalErrors);

                throw new \InvalidArgumentException('The schemaOrCallable argument has to be a valid path to XSD file or callable.');
            }

            if (!$valid) {
                $messages = static::getXmlErrors($internalErrors);
                if (empty($messages)) {
                    $messages = array(sprintf('The XML file "%s" is not valid.', $file));
                }
                throw new \InvalidArgumentException(implode("\n", $messages), 0, $e);
            }

            libxml_use_internal_errors($internalErrors);
        }

        return $dom;
    }

    /**
     * Converts a \DomElement object to a PHP array.
     *
     * The following rules applies during the conversion:
     *
     *  * Each tag is converted to a key value or an array
     *    if there is more than one "value"
     *
     *  * The content of a tag is set under a "value" key (<foo>bar</foo>)
     *    if the tag also has some nested tags
     *
     *  * The attributes are converted to keys (<foo foo="bar"/>)
     *
     *  * The nested-tags are converted to keys (<foo><foo>bar</foo></foo>)
     *
     * @param \DomElement $element     A \DomElement instance
     * @param Boolean     $checkPrefix Check prefix in an element or an attribute name
     *
     * @return array A PHP array
     */
    public static function convertDomElementToArray(\DomElement $element, $checkPrefix = true)
    {
        $prefix = (string) $element->prefix;
        $empty = true;
        $config = array();
        foreach ($element->attributes as $name => $node) {
            if ($checkPrefix && !in_array((string) $node->prefix, array('', $prefix), true)) {
                continue;
            }
            $config[$name] = static::phpize($node->value);
            $empty = false;
        }

        $nodeValue = false;
        foreach ($element->childNodes as $node) {
            if ($node instanceof \DOMText) {
                if ('' !== trim($node->nodeValue)) {
                    $nodeValue = trim($node->nodeValue);
                    $empty = false;
                }
            } elseif ($checkPrefix && $prefix != (string) $node->prefix) {
                continue;
            } elseif (!$node instanceof \DOMComment) {
                $value = static::convertDomElementToArray($node, $checkPrefix);

                $key = $node->localName;
                if (isset($config[$key])) {
                    if (!is_array($config[$key]) || !is_int(key($config[$key]))) {
                        $config[$key] = array($config[$key]);
                    }
                    $config[$key][] = $value;
                } else {
                    $config[$key] = $value;
                }

                $empty = false;
            }
        }

        if (false !== $nodeValue) {
            $value = static::phpize($nodeValue);
            if (count($config)) {
                $config['value'] = $value;
            } else {
                $config = $value;
            }
        }

        return !$empty ? $config : null;
    }

    /**
     * Converts an xml value to a PHP type.
     *
     * @param mixed $value
     *
     * @return mixed
     */
    public static function phpize($value)
    {
        $value = (string) $value;
        $lowercaseValue = strtolower($value);

        switch (true) {
            case 'null' === $lowercaseValue:
                return null;
            case ctype_digit($value):
                $raw = $value;
                $cast = intval($value);

                return '0' == $value[0] ? octdec($value) : (((string) $raw == (string) $cast) ? $cast : $raw);
            case isset($value[1]) && '-' === $value[0] && ctype_digit(substr($value, 1)):
                $raw = $value;
                $cast = intval($value);

                return '0' == $value[1] ? octdec($value) : (((string) $raw == (string) $cast) ? $cast : $raw);
            case 'true' === $lowercaseValue:
                return true;
            case 'false' === $lowercaseValue:
                return false;
            case isset($value[1]) && '0b' == $value[0].$value[1]:
                return bindec($value);
            case is_numeric($value):
                return '0x' == $value[0].$value[1] ? hexdec($value) : floatval($value);
            case preg_match('/^(-|\+)?[0-9]+(\.[0-9]+)?$/', $value):
                return floatval($value);
            default:
                return $value;
        }
    }

    protected static function getXmlErrors($internalErrors)
    {
        $errors = array();
        foreach (libxml_get_errors() as $error) {
            $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)',
                LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
                $error->code,
                trim($error->message),
                $error->file ? $error->file : 'n/a',
                $error->line,
                $error->column
            );
        }

        libxml_clear_errors();
        libxml_use_internal_errors($internalErrors);

        return $errors;
    }
}
PKy`�\�
#�
�
<pear/Symfony/Component/Config/Resource/DirectoryResource.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Resource;

/**
 * DirectoryResource represents a resources stored in a subdirectory tree.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DirectoryResource implements ResourceInterface, \Serializable
{
    private $resource;
    private $pattern;

    /**
     * Constructor.
     *
     * @param string $resource The file path to the resource
     * @param string $pattern  A pattern to restrict monitored files
     */
    public function __construct($resource, $pattern = null)
    {
        $this->resource = $resource;
        $this->pattern = $pattern;
    }

    /**
     * Returns a string representation of the Resource.
     *
     * @return string A string representation of the Resource
     */
    public function __toString()
    {
        return (string) $this->resource;
    }

    /**
     * Returns the resource tied to this Resource.
     *
     * @return mixed The resource
     */
    public function getResource()
    {
        return $this->resource;
    }

    public function getPattern()
    {
        return $this->pattern;
    }

    /**
     * Returns true if the resource has not been updated since the given timestamp.
     *
     * @param integer $timestamp The last time the resource was loaded
     *
     * @return Boolean true if the resource has not been updated, false otherwise
     */
    public function isFresh($timestamp)
    {
        if (!is_dir($this->resource)) {
            return false;
        }

        $newestMTime = filemtime($this->resource);
        foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) {
            // if regex filtering is enabled only check matching files
            if ($this->pattern && $file->isFile() && !preg_match($this->pattern, $file->getBasename())) {
                continue;
            }

            // always monitor directories for changes, except the .. entries
            // (otherwise deleted files wouldn't get detected)
            if ($file->isDir() && '/..' === substr($file, -3)) {
                continue;
            }

            $newestMTime = max($file->getMTime(), $newestMTime);
        }

        return $newestMTime < $timestamp;
    }

    public function serialize()
    {
        return serialize(array($this->resource, $this->pattern));
    }

    public function unserialize($serialized)
    {
        list($this->resource, $this->pattern) = unserialize($serialized);
    }
}
PKy`�\fK�EDD<pear/Symfony/Component/Config/Resource/ResourceInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Resource;

/**
 * ResourceInterface is the interface that must be implemented by all Resource classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface ResourceInterface
{
    /**
     * Returns a string representation of the Resource.
     *
     * @return string A string representation of the Resource
     */
    public function __toString();

    /**
     * Returns true if the resource has not been updated since the given timestamp.
     *
     * @param integer $timestamp The last time the resource was loaded
     *
     * @return Boolean true if the resource has not been updated, false otherwise
     */
    public function isFresh($timestamp);

    /**
     * Returns the resource tied to this Resource.
     *
     * @return mixed The resource
     */
    public function getResource();
}
PKy`�\��T!!7pear/Symfony/Component/Config/Resource/FileResource.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Resource;

/**
 * FileResource represents a resource stored on the filesystem.
 *
 * The resource can be a file or a directory.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FileResource implements ResourceInterface, \Serializable
{
    private $resource;

    /**
     * Constructor.
     *
     * @param string $resource The file path to the resource
     */
    public function __construct($resource)
    {
        $this->resource = realpath($resource);
    }

    /**
     * Returns a string representation of the Resource.
     *
     * @return string A string representation of the Resource
     */
    public function __toString()
    {
        return (string) $this->resource;
    }

    /**
     * Returns the resource tied to this Resource.
     *
     * @return mixed The resource
     */
    public function getResource()
    {
        return $this->resource;
    }

    /**
     * Returns true if the resource has not been updated since the given timestamp.
     *
     * @param integer $timestamp The last time the resource was loaded
     *
     * @return Boolean true if the resource has not been updated, false otherwise
     */
    public function isFresh($timestamp)
    {
        if (!file_exists($this->resource)) {
            return false;
        }

        return filemtime($this->resource) < $timestamp;
    }

    public function serialize()
    {
        return serialize($this->resource);
    }

    public function unserialize($serialized)
    {
        $this->resource = unserialize($serialized);
    }
}
PKy`�\U��''6pear/Symfony/Component/Config/Definition/Processor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

/**
 * This class is the entry point for config normalization/merging/finalization.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class Processor
{
    /**
     * Processes an array of configurations.
     *
     * @param NodeInterface $configTree The node tree describing the configuration
     * @param array         $configs    An array of configuration items to process
     *
     * @return array The processed configuration
     */
    public function process(NodeInterface $configTree, array $configs)
    {
        $currentConfig = array();
        foreach ($configs as $config) {
            $config = $configTree->normalize($config);
            $currentConfig = $configTree->merge($currentConfig, $config);
        }

        return $configTree->finalize($currentConfig);
    }

    /**
     * Processes an array of configurations.
     *
     * @param ConfigurationInterface $configuration The configuration class
     * @param array                  $configs       An array of configuration items to process
     *
     * @return array The processed configuration
     */
    public function processConfiguration(ConfigurationInterface $configuration, array $configs)
    {
        return $this->process($configuration->getConfigTreeBuilder()->buildTree(), $configs);
    }

    /**
     * Normalizes a configuration entry.
     *
     * This method returns a normalize configuration array for a given key
     * to remove the differences due to the original format (YAML and XML mainly).
     *
     * Here is an example.
     *
     * The configuration in XML:
     *
     * <twig:extension>twig.extension.foo</twig:extension>
     * <twig:extension>twig.extension.bar</twig:extension>
     *
     * And the same configuration in YAML:
     *
     * extensions: ['twig.extension.foo', 'twig.extension.bar']
     *
     * @param array  $config A config array
     * @param string $key    The key to normalize
     * @param string $plural The plural form of the key if it is irregular
     *
     * @return array
     */
    public static function normalizeConfig($config, $key, $plural = null)
    {
        if (null === $plural) {
            $plural = $key.'s';
        }

        if (isset($config[$plural])) {
            return $config[$plural];
        }

        if (isset($config[$key])) {
            if (is_string($config[$key]) || !is_int(key($config[$key]))) {
                // only one
                return  array($config[$key]);
            }

            return  $config[$key];
        }

        return array();
    }
}
PKy`�\��ewwCpear/Symfony/Component/Config/Definition/PrototypeNodeInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

/**
 * This interface must be implemented by nodes which can be used as prototypes.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface PrototypeNodeInterface extends NodeInterface
{
    /**
     * Sets the name of the node.
     *
     * @param string $name The name of the node
     */
    public function setName($name);
}
PKz`�\��jkk8pear/Symfony/Component/Config/Definition/IntegerNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidTypeException;

/**
 * This node represents an integer value in the config tree.
 *
 * @author Jeanmonod David <david.jeanmonod@gmail.com>
 */
class IntegerNode extends NumericNode
{
    /**
     * {@inheritDoc}
     */
    protected function validateType($value)
    {
        if (!is_int($value)) {
            $ex = new InvalidTypeException(sprintf('Invalid type for path "%s". Expected int, but got %s.', $this->getPath(), gettype($value)));
            $ex->setPath($this->getPath());

            throw $ex;
        }
    }
}
PKz`�\G4�*�*6pear/Symfony/Component/Config/Definition/ArrayNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
use Symfony\Component\Config\Definition\Exception\UnsetKeyException;

/**
 * Represents an Array node in the config tree.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ArrayNode extends BaseNode implements PrototypeNodeInterface
{
    protected $xmlRemappings = array();
    protected $children = array();
    protected $allowFalse = false;
    protected $allowNewKeys = true;
    protected $addIfNotSet = false;
    protected $performDeepMerging = true;
    protected $ignoreExtraKeys = false;
    protected $normalizeKeys = true;

    public function setNormalizeKeys($normalizeKeys)
    {
        $this->normalizeKeys = (Boolean) $normalizeKeys;
    }

    /**
     * Normalizes keys between the different configuration formats.
     *
     * Namely, you mostly have foo_bar in YAML while you have foo-bar in XML.
     * After running this method, all keys are normalized to foo_bar.
     *
     * If you have a mixed key like foo-bar_moo, it will not be altered.
     * The key will also not be altered if the target key already exists.
     *
     * @param mixed $value
     *
     * @return array The value with normalized keys
     */
    protected function preNormalize($value)
    {
        if (!$this->normalizeKeys || !is_array($value)) {
            return $value;
        }

        foreach ($value as $k => $v) {
            if (false !== strpos($k, '-') && false === strpos($k, '_') && !array_key_exists($normalizedKey = str_replace('-', '_', $k), $value)) {
                $value[$normalizedKey] = $v;
                unset($value[$k]);
            }
        }

        return $value;
    }

    /**
     * Retrieves the children of this node.
     *
     * @return array The children
     */
    public function getChildren()
    {
        return $this->children;
    }

    /**
     * Sets the xml remappings that should be performed.
     *
     * @param array $remappings an array of the form array(array(string, string))
     */
    public function setXmlRemappings(array $remappings)
    {
        $this->xmlRemappings = $remappings;
    }

    /**
     * Gets the xml remappings that should be performed.
     *
     * @return array $remappings an array of the form array(array(string, string))
     */
    public function getXmlRemappings()
    {
        return $this->xmlRemappings;
    }

    /**
     * Sets whether to add default values for this array if it has not been
     * defined in any of the configuration files.
     *
     * @param Boolean $boolean
     */
    public function setAddIfNotSet($boolean)
    {
        $this->addIfNotSet = (Boolean) $boolean;
    }

    /**
     * Sets whether false is allowed as value indicating that the array should be unset.
     *
     * @param Boolean $allow
     */
    public function setAllowFalse($allow)
    {
        $this->allowFalse = (Boolean) $allow;
    }

    /**
     * Sets whether new keys can be defined in subsequent configurations.
     *
     * @param Boolean $allow
     */
    public function setAllowNewKeys($allow)
    {
        $this->allowNewKeys = (Boolean) $allow;
    }

    /**
     * Sets if deep merging should occur.
     *
     * @param Boolean $boolean
     */
    public function setPerformDeepMerging($boolean)
    {
        $this->performDeepMerging = (Boolean) $boolean;
    }

    /**
     * Whether extra keys should just be ignore without an exception.
     *
     * @param Boolean $boolean To allow extra keys
     */
    public function setIgnoreExtraKeys($boolean)
    {
        $this->ignoreExtraKeys = (Boolean) $boolean;
    }

    /**
     * Sets the node Name.
     *
     * @param string $name The node's name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Checks if the node has a default value.
     *
     * @return Boolean
     */
    public function hasDefaultValue()
    {
        return $this->addIfNotSet;
    }

    /**
     * Retrieves the default value.
     *
     * @return array The default value
     *
     * @throws \RuntimeException if the node has no default value
     */
    public function getDefaultValue()
    {
        if (!$this->hasDefaultValue()) {
            throw new \RuntimeException(sprintf('The node at path "%s" has no default value.', $this->getPath()));
        }

        $defaults = array();
        foreach ($this->children as $name => $child) {
            if ($child->hasDefaultValue()) {
                $defaults[$name] = $child->getDefaultValue();
            }
        }

        return $defaults;
    }

    /**
     * Adds a child node.
     *
     * @param NodeInterface $node The child node to add
     *
     * @throws \InvalidArgumentException when the child node has no name
     * @throws \InvalidArgumentException when the child node's name is not unique
     */
    public function addChild(NodeInterface $node)
    {
        $name = $node->getName();
        if (!strlen($name)) {
            throw new \InvalidArgumentException('Child nodes must be named.');
        }
        if (isset($this->children[$name])) {
            throw new \InvalidArgumentException(sprintf('A child node named "%s" already exists.', $name));
        }

        $this->children[$name] = $node;
    }

    /**
     * Finalizes the value of this node.
     *
     * @param mixed $value
     *
     * @return mixed The finalised value
     *
     * @throws UnsetKeyException
     * @throws InvalidConfigurationException if the node doesn't have enough children
     */
    protected function finalizeValue($value)
    {
        if (false === $value) {
            $msg = sprintf('Unsetting key for path "%s", value: %s', $this->getPath(), json_encode($value));
            throw new UnsetKeyException($msg);
        }

        foreach ($this->children as $name => $child) {
            if (!array_key_exists($name, $value)) {
                if ($child->isRequired()) {
                    $msg = sprintf('The child node "%s" at path "%s" must be configured.', $name, $this->getPath());
                    $ex = new InvalidConfigurationException($msg);
                    $ex->setPath($this->getPath());

                    throw $ex;
                }

                if ($child->hasDefaultValue()) {
                    $value[$name] = $child->getDefaultValue();
                }

                continue;
            }

            try {
                $value[$name] = $child->finalize($value[$name]);
            } catch (UnsetKeyException $unset) {
                unset($value[$name]);
            }
        }

        return $value;
    }

    /**
     * Validates the type of the value.
     *
     * @param mixed $value
     *
     * @throws InvalidTypeException
     */
    protected function validateType($value)
    {
        if (!is_array($value) && (!$this->allowFalse || false !== $value)) {
            $ex = new InvalidTypeException(sprintf(
                'Invalid type for path "%s". Expected array, but got %s',
                $this->getPath(),
                gettype($value)
            ));
            $ex->setPath($this->getPath());

            throw $ex;
        }
    }

    /**
     * Normalizes the value.
     *
     * @param mixed $value The value to normalize
     *
     * @return mixed The normalized value
     *
     * @throws InvalidConfigurationException
     */
    protected function normalizeValue($value)
    {
        if (false === $value) {
            return $value;
        }

        $value = $this->remapXml($value);

        $normalized = array();
        foreach ($value as $name => $val) {
            if (isset($this->children[$name])) {
                $normalized[$name] = $this->children[$name]->normalize($val);
                unset($value[$name]);
            }
        }

        // if extra fields are present, throw exception
        if (count($value) && !$this->ignoreExtraKeys) {
            $msg = sprintf('Unrecognized options "%s" under "%s"', implode(', ', array_keys($value)), $this->getPath());
            $ex = new InvalidConfigurationException($msg);
            $ex->setPath($this->getPath());

            throw $ex;
        }

        return $normalized;
    }

    /**
     * Remaps multiple singular values to a single plural value.
     *
     * @param array $value The source values
     *
     * @return array The remapped values
     */
    protected function remapXml($value)
    {
        foreach ($this->xmlRemappings as $transformation) {
            list($singular, $plural) = $transformation;

            if (!isset($value[$singular])) {
                continue;
            }

            $value[$plural] = Processor::normalizeConfig($value, $singular, $plural);
            unset($value[$singular]);
        }

        return $value;
    }

    /**
     * Merges values together.
     *
     * @param mixed $leftSide  The left side to merge.
     * @param mixed $rightSide The right side to merge.
     *
     * @return mixed The merged values
     *
     * @throws InvalidConfigurationException
     * @throws \RuntimeException
     */
    protected function mergeValues($leftSide, $rightSide)
    {
        if (false === $rightSide) {
            // if this is still false after the last config has been merged the
            // finalization pass will take care of removing this key entirely
            return false;
        }

        if (false === $leftSide || !$this->performDeepMerging) {
            return $rightSide;
        }

        foreach ($rightSide as $k => $v) {
            // no conflict
            if (!array_key_exists($k, $leftSide)) {
                if (!$this->allowNewKeys) {
                    $ex = new InvalidConfigurationException(sprintf(
                        'You are not allowed to define new elements for path "%s". '
                       .'Please define all elements for this path in one config file. '
                       .'If you are trying to overwrite an element, make sure you redefine it '
                       .'with the same name.',
                        $this->getPath()
                    ));
                    $ex->setPath($this->getPath());

                    throw $ex;
                }

                $leftSide[$k] = $v;
                continue;
            }

            if (!isset($this->children[$k])) {
                throw new \RuntimeException('merge() expects a normalized config array.');
            }

            $leftSide[$k] = $this->children[$k]->merge($leftSide[$k], $v);
        }

        return $leftSide;
    }
}
PKz`�\Un=#'#'@pear/Symfony/Component/Config/Definition/PrototypedArrayNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\Definition\Exception\DuplicateKeyException;
use Symfony\Component\Config\Definition\Exception\UnsetKeyException;
use Symfony\Component\Config\Definition\Exception\Exception;

/**
 * Represents a prototyped Array node in the config tree.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class PrototypedArrayNode extends ArrayNode
{
    protected $prototype;
    protected $keyAttribute;
    protected $removeKeyAttribute = false;
    protected $minNumberOfElements = 0;
    protected $defaultValue = array();
    protected $defaultChildren;

    /**
     * Sets the minimum number of elements that a prototype based node must
     * contain. By default this is zero, meaning no elements.
     *
     * @param integer $number
     */
    public function setMinNumberOfElements($number)
    {
        $this->minNumberOfElements = $number;
    }

    /**
     * Sets the attribute which value is to be used as key.
     *
     * This is useful when you have an indexed array that should be an
     * associative array. You can select an item from within the array
     * to be the key of the particular item. For example, if "id" is the
     * "key", then:
     *
     *     array(
     *         array('id' => 'my_name', 'foo' => 'bar'),
     *     );
     *
     *  becomes
     *
     *      array(
     *          'my_name' => array('foo' => 'bar'),
     *      );
     *
     * If you'd like "'id' => 'my_name'" to still be present in the resulting
     * array, then you can set the second argument of this method to false.
     *
     * @param string  $attribute The name of the attribute which value is to be used as a key
     * @param Boolean $remove    Whether or not to remove the key
     */
    public function setKeyAttribute($attribute, $remove = true)
    {
        $this->keyAttribute = $attribute;
        $this->removeKeyAttribute = $remove;
    }

    /**
     * Retrieves the name of the attribute which value should be used as key.
     *
     * @return string The name of the attribute
     */
    public function getKeyAttribute()
    {
        return $this->keyAttribute;
    }

    /**
     * Sets the default value of this node.
     *
     * @param string $value
     *
     * @throws \InvalidArgumentException if the default value is not an array
     */
    public function setDefaultValue($value)
    {
        if (!is_array($value)) {
            throw new \InvalidArgumentException($this->getPath().': the default value of an array node has to be an array.');
        }

        $this->defaultValue = $value;
    }

    /**
     * Checks if the node has a default value.
     *
     * @return Boolean
     */
    public function hasDefaultValue()
    {
        return true;
    }

    /**
     * Adds default children when none are set.
     *
     * @param integer|string|array|null $children The number of children|The child name|The children names to be added
     */
    public function setAddChildrenIfNoneSet($children = array('defaults'))
    {
        if (null === $children) {
            $this->defaultChildren = array('defaults');
        } else {
            $this->defaultChildren = is_integer($children) && $children > 0 ? range(1, $children) : (array) $children;
        }
    }

    /**
     * Retrieves the default value.
     *
     * The default value could be either explicited or derived from the prototype
     * default value.
     *
     * @return array The default value
     */
    public function getDefaultValue()
    {
        if (null !== $this->defaultChildren) {
            $default = $this->prototype->hasDefaultValue() ? $this->prototype->getDefaultValue() : array();
            $defaults = array();
            foreach (array_values($this->defaultChildren) as $i => $name) {
                $defaults[null === $this->keyAttribute ? $i : $name] = $default;
            }

            return $defaults;
        }

        return $this->defaultValue;
    }

    /**
     * Sets the node prototype.
     *
     * @param PrototypeNodeInterface $node
     */
    public function setPrototype(PrototypeNodeInterface $node)
    {
        $this->prototype = $node;
    }

    /**
     * Retrieves the prototype
     *
     * @return PrototypeNodeInterface The prototype
     */
    public function getPrototype()
    {
        return $this->prototype;
    }

    /**
     * Disable adding concrete children for prototyped nodes.
     *
     * @param NodeInterface $node The child node to add
     *
     * @throws Exception
     */
    public function addChild(NodeInterface $node)
    {
        throw new Exception('A prototyped array node can not have concrete children.');
    }

    /**
     * Finalizes the value of this node.
     *
     * @param mixed $value
     *
     * @return mixed The finalized value
     *
     * @throws UnsetKeyException
     * @throws InvalidConfigurationException if the node doesn't have enough children
     */
    protected function finalizeValue($value)
    {
        if (false === $value) {
            $msg = sprintf('Unsetting key for path "%s", value: %s', $this->getPath(), json_encode($value));
            throw new UnsetKeyException($msg);
        }

        foreach ($value as $k => $v) {
            $this->prototype->setName($k);
            try {
                $value[$k] = $this->prototype->finalize($v);
            } catch (UnsetKeyException $unset) {
                unset($value[$k]);
            }
        }

        if (count($value) < $this->minNumberOfElements) {
            $msg = sprintf('The path "%s" should have at least %d element(s) defined.', $this->getPath(), $this->minNumberOfElements);
            $ex = new InvalidConfigurationException($msg);
            $ex->setPath($this->getPath());

            throw $ex;
        }

        return $value;
    }

    /**
     * Normalizes the value.
     *
     * @param mixed $value The value to normalize
     *
     * @return mixed The normalized value
     *
     * @throws InvalidConfigurationException
     * @throws DuplicateKeyException
     */
    protected function normalizeValue($value)
    {
        if (false === $value) {
            return $value;
        }

        $value = $this->remapXml($value);

        $isAssoc = array_keys($value) !== range(0, count($value) -1);
        $normalized = array();
        foreach ($value as $k => $v) {
            if (null !== $this->keyAttribute && is_array($v)) {
                if (!isset($v[$this->keyAttribute]) && is_int($k) && !$isAssoc) {
                    $msg = sprintf('The attribute "%s" must be set for path "%s".', $this->keyAttribute, $this->getPath());
                    $ex = new InvalidConfigurationException($msg);
                    $ex->setPath($this->getPath());

                    throw $ex;
                } elseif (isset($v[$this->keyAttribute])) {
                    $k = $v[$this->keyAttribute];

                    // remove the key attribute when required
                    if ($this->removeKeyAttribute) {
                        unset($v[$this->keyAttribute]);
                    }

                    // if only "value" is left
                    if (1 == count($v) && isset($v['value'])) {
                        $v = $v['value'];
                    }
                }

                if (array_key_exists($k, $normalized)) {
                    $msg = sprintf('Duplicate key "%s" for path "%s".', $k, $this->getPath());
                    $ex = new DuplicateKeyException($msg);
                    $ex->setPath($this->getPath());

                    throw $ex;
                }
            }

            $this->prototype->setName($k);
            if (null !== $this->keyAttribute || $isAssoc) {
                $normalized[$k] = $this->prototype->normalize($v);
            } else {
                $normalized[] = $this->prototype->normalize($v);
            }
        }

        return $normalized;
    }

    /**
     * Merges values together.
     *
     * @param mixed $leftSide  The left side to merge.
     * @param mixed $rightSide The right side to merge.
     *
     * @return mixed The merged values
     *
     * @throws InvalidConfigurationException
     * @throws \RuntimeException
     */
    protected function mergeValues($leftSide, $rightSide)
    {
        if (false === $rightSide) {
            // if this is still false after the last config has been merged the
            // finalization pass will take care of removing this key entirely
            return false;
        }

        if (false === $leftSide || !$this->performDeepMerging) {
            return $rightSide;
        }

        foreach ($rightSide as $k => $v) {
            // prototype, and key is irrelevant, so simply append the element
            if (null === $this->keyAttribute) {
                $leftSide[] = $v;
                continue;
            }

            // no conflict
            if (!array_key_exists($k, $leftSide)) {
                if (!$this->allowNewKeys) {
                    $ex = new InvalidConfigurationException(sprintf(
                        'You are not allowed to define new elements for path "%s". ' .
                        'Please define all elements for this path in one config file.',
                        $this->getPath()
                    ));
                    $ex->setPath($this->getPath());

                    throw $ex;
                }

                $leftSide[$k] = $v;
                continue;
            }

            $this->prototype->setName($k);
            $leftSide[$k] = $this->prototype->merge($leftSide[$k], $v);
        }

        return $leftSide;
    }
}
PKz`�\i
�>>Gpear/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Dumper;

use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\ScalarNode;
use Symfony\Component\Config\Definition\EnumNode;
use Symfony\Component\Config\Definition\PrototypedArrayNode;
use Symfony\Component\Yaml\Inline;

/**
 * Dumps a Yaml reference configuration for the given configuration/node instance.
 *
 * @author Kevin Bond <kevinbond@gmail.com>
 */
class YamlReferenceDumper
{
    private $reference;

    public function dump(ConfigurationInterface $configuration)
    {
        return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree());
    }

    public function dumpNode(NodeInterface $node)
    {
        $this->reference = '';
        $this->writeNode($node);
        $ref = $this->reference;
        $this->reference = null;

        return $ref;
    }

    /**
     * @param NodeInterface $node
     * @param integer       $depth
     */
    private function writeNode(NodeInterface $node, $depth = 0)
    {
        $comments = array();
        $default = '';
        $defaultArray = null;
        $children = null;
        $example = $node->getExample();

        // defaults
        if ($node instanceof ArrayNode) {
            $children = $node->getChildren();

            if ($node instanceof PrototypedArrayNode) {
                $prototype = $node->getPrototype();

                if ($prototype instanceof ArrayNode) {
                    $children = $prototype->getChildren();
                }

                // check for attribute as key
                if ($key = $node->getKeyAttribute()) {
                    $keyNodeClass = 'Symfony\Component\Config\Definition\\'.($prototype instanceof ArrayNode ? 'ArrayNode' : 'ScalarNode');
                    $keyNode = new $keyNodeClass($key, $node);
                    $keyNode->setInfo('Prototype');

                    // add children
                    foreach ($children as $childNode) {
                        $keyNode->addChild($childNode);
                    }
                    $children = array($key => $keyNode);
                }
            }

            if (!$children) {
                if ($node->hasDefaultValue() && count($defaultArray = $node->getDefaultValue())) {
                    $default = '';
                } elseif (!is_array($example)) {
                    $default = '[]';
                }
            }
        } elseif ($node instanceof EnumNode) {
            $comments[] = 'One of '.implode('; ', array_map('json_encode', $node->getValues()));
            $default = '~';
        } else {
            $default = '~';

            if ($node->hasDefaultValue()) {
                $default = $node->getDefaultValue();

                if (is_array($default)) {
                    if (count($defaultArray = $node->getDefaultValue())) {
                        $default = '';
                    } elseif (!is_array($example)) {
                        $default = '[]';
                    }
                } else {
                    $default = Inline::dump($default);
                }
            }
        }

        // required?
        if ($node->isRequired()) {
            $comments[] = 'Required';
        }

        // example
        if ($example && !is_array($example)) {
            $comments[] = 'Example: '.$example;
        }

        $default = (string) $default != '' ? ' '.$default : '';
        $comments = count($comments) ? '# '.implode(', ', $comments) : '';

        $text = rtrim(sprintf('%-20s %s %s', $node->getName().':', $default, $comments), ' ');

        if ($info = $node->getInfo()) {
            $this->writeLine('');
            // indenting multi-line info
            $info = str_replace("\n", sprintf("\n%".$depth * 4 . "s# ", ' '), $info);
            $this->writeLine('# '.$info, $depth * 4);
        }

        $this->writeLine($text, $depth * 4);

        // output defaults
        if ($defaultArray) {
            $this->writeLine('');

            $message = count($defaultArray) > 1 ? 'Defaults' : 'Default';

            $this->writeLine('# '.$message.':', $depth * 4 + 4);

            $this->writeArray($defaultArray, $depth + 1);
        }

        if (is_array($example)) {
            $this->writeLine('');

            $message = count($example) > 1 ? 'Examples' : 'Example';

            $this->writeLine('# '.$message.':', $depth * 4 + 4);

            $this->writeArray($example, $depth + 1);
        }

        if ($children) {
            foreach ($children as $childNode) {
                $this->writeNode($childNode, $depth + 1);
            }
        }
    }

    /**
     * Outputs a single config reference line
     *
     * @param string $text
     * @param int    $indent
     */
    private function writeLine($text, $indent = 0)
    {
        $indent = strlen($text) + $indent;
        $format = '%'.$indent.'s';

        $this->reference .= sprintf($format, $text)."\n";
    }

    private function writeArray(array $array, $depth)
    {
        $isIndexed = array_values($array) === $array;

        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $val = '';
            } else {
                $val = $value;
            }

            if ($isIndexed) {
                $this->writeLine('- '.$val, $depth * 4);
            } else {
                $this->writeLine(sprintf('%-20s %s', $key.':', $val), $depth * 4);
            }

            if (is_array($value)) {
                $this->writeArray($value, $depth + 1);
            }
        }
    }
}
PKz`�\�2��&�&Fpear/Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Dumper;

use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\EnumNode;
use Symfony\Component\Config\Definition\PrototypedArrayNode;

/**
 * Dumps a XML reference configuration for the given configuration/node instance.
 *
 * @author Wouter J <waldio.webdesign@gmail.com>
 */
class XmlReferenceDumper
{
    private $reference;

    public function dump(ConfigurationInterface $configuration, $namespace = null)
    {
        return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree(), $namespace);
    }

    public function dumpNode(NodeInterface $node, $namespace = null)
    {
        $this->reference = '';
        $this->writeNode($node, 0, true, $namespace);
        $ref = $this->reference;
        $this->reference = null;

        return $ref;
    }

    /**
     * @param NodeInterface $node
     * @param integer       $depth
     * @param Boolean       $root      If the node is the root node
     * @param string        $namespace The namespace of the node
     */
    private function writeNode(NodeInterface $node, $depth = 0, $root = false, $namespace = null)
    {
        $rootName = ($root ? 'config' : $node->getName());
        $rootNamespace = ($namespace ?: ($root ? 'http://example.org/schema/dic/'.$node->getName() : null));

        // xml remapping
        if ($node->getParent()) {
            $remapping = array_filter($node->getParent()->getXmlRemappings(), function ($mapping) use ($rootName) {
                return $rootName === $mapping[1];
            });

            if (count($remapping)) {
                list($singular, $plural) = current($remapping);
                $rootName = $singular;
            }
        }
        $rootName = str_replace('_', '-', $rootName);

        $rootAttributes = array();
        $rootAttributeComments = array();
        $rootChildren = array();
        $rootComments = array();

        if ($node instanceof ArrayNode) {
            $children = $node->getChildren();

            // comments about the root node
            if ($rootInfo = $node->getInfo()) {
                $rootComments[] = $rootInfo;
            }

            if ($rootNamespace) {
                $rootComments[] = 'Namespace: '.$rootNamespace;
            }

            // render prototyped nodes
            if ($node instanceof PrototypedArrayNode) {
                array_unshift($rootComments, 'prototype');

                if ($key = $node->getKeyAttribute()) {
                    $rootAttributes[$key] = str_replace('-', ' ', $rootName).' '.$key;
                }

                $prototype = $node->getPrototype();

                if ($prototype instanceof ArrayNode) {
                    $children = $prototype->getChildren();
                } else {
                    if ($prototype->hasDefaultValue()) {
                        $prototypeValue = $prototype->getDefaultValue();
                    } else {
                        switch (get_class($prototype)) {
                            case 'Symfony\Component\Config\Definition\ScalarNode':
                                $prototypeValue = 'scalar value';
                                break;

                            case 'Symfony\Component\Config\Definition\FloatNode':
                            case 'Symfony\Component\Config\Definition\IntegerNode':
                                $prototypeValue = 'numeric value';
                                break;

                            case 'Symfony\Component\Config\Definition\BooleanNode':
                                $prototypeValue = 'true|false';
                                break;

                            case 'Symfony\Component\Config\Definition\EnumNode':
                                $prototypeValue = implode('|', array_map('json_encode', $prototype->getValues()));
                                break;

                            default:
                                $prototypeValue = 'value';
                        }
                    }
                }
            }

            // get attributes and elements
            foreach ($children as $child) {
                if (!$child instanceof ArrayNode) {
                    // get attributes

                    // metadata
                    $name  = str_replace('_', '-', $child->getName());
                    $value = '%%%%not_defined%%%%'; // use a string which isn't used in the normal world

                    // comments
                    $comments = array();
                    if ($info = $child->getInfo()) {
                        $comments[] = $info;
                    }

                    if ($example = $child->getExample()) {
                        $comments[] = 'Example: '.$example;
                    }

                    if ($child->isRequired()) {
                        $comments[] = 'Required';
                    }

                    if ($child instanceof EnumNode) {
                        $comments[] = 'One of '.implode('; ', array_map('json_encode', $child->getValues()));
                    }

                    if (count($comments)) {
                        $rootAttributeComments[$name] = implode(";\n", $comments);
                    }

                    // default values
                    if ($child->hasDefaultValue()) {
                        $value = $child->getDefaultValue();
                    }

                    // append attribute
                    $rootAttributes[$name] = $value;
                } else {
                    // get elements
                    $rootChildren[] = $child;
                }
            }
        }

        // render comments

        // root node comment
        if (count($rootComments)) {
            foreach ($rootComments as $comment) {
                $this->writeLine('<!-- '.$comment.' -->', $depth);
            }
        }

        // attribute comments
        if (count($rootAttributeComments)) {
            foreach ($rootAttributeComments as $attrName => $comment) {
                $commentDepth = $depth + 4 + strlen($attrName) + 2;
                $commentLines = explode("\n", $comment);
                $multiline = (count($commentLines) > 1);
                $comment = implode(PHP_EOL.str_repeat(' ', $commentDepth), $commentLines);

                if ($multiline) {
                    $this->writeLine('<!--', $depth);
                    $this->writeLine($attrName.': '.$comment, $depth + 4);
                    $this->writeLine('-->', $depth);
                } else {
                    $this->writeLine('<!-- '.$attrName.': '.$comment.' -->', $depth);
                }
            }
        }

        // render start tag + attributes
        $rootIsVariablePrototype = isset($prototypeValue);
        $rootIsEmptyTag = (0 === count($rootChildren) && !$rootIsVariablePrototype);
        $rootOpenTag = '<'.$rootName;
        if (1 >= ($attributesCount = count($rootAttributes))) {
            if (1 === $attributesCount) {
                $rootOpenTag .= sprintf(' %s="%s"', current(array_keys($rootAttributes)), $this->writeValue(current($rootAttributes)));
            }

            $rootOpenTag .= $rootIsEmptyTag ? ' />' : '>';

            if ($rootIsVariablePrototype) {
                $rootOpenTag .= $prototypeValue.'</'.$rootName.'>';
            }

            $this->writeLine($rootOpenTag, $depth);
        } else {
            $this->writeLine($rootOpenTag, $depth);

            $i = 1;

            foreach ($rootAttributes as $attrName => $attrValue) {
                $attr = sprintf('%s="%s"', $attrName, $this->writeValue($attrValue));

                $this->writeLine($attr, $depth + 4);

                if ($attributesCount === $i++) {
                    $this->writeLine($rootIsEmptyTag ? '/>' : '>', $depth);

                    if ($rootIsVariablePrototype) {
                        $rootOpenTag .= $prototypeValue.'</'.$rootName.'>';
                    }
                }
            }
        }

        // render children tags
        foreach ($rootChildren as $child) {
            $this->writeLine('');
            $this->writeNode($child, $depth + 4);
        }

        // render end tag
        if (!$rootIsEmptyTag && !$rootIsVariablePrototype) {
            $this->writeLine('');

            $rootEndTag = '</'.$rootName.'>';
            $this->writeLine($rootEndTag, $depth);
        }
    }

    /**
     * Outputs a single config reference line
     *
     * @param string $text
     * @param int    $indent
     */
    private function writeLine($text, $indent = 0)
    {
        $indent = strlen($text) + $indent;
        $format = '%'.$indent.'s';

        $this->reference .= sprintf($format, $text)."\n";
    }

    /**
     * Renders the string conversion of the value.
     *
     * @param mixed $value
     *
     * @return string
     */
    private function writeValue($value)
    {
        if ('%%%%not_defined%%%%' === $value) {
            return '';
        }

        if (is_string($value) || is_numeric($value)) {
            return $value;
        }

        if (false === $value) {
            return 'false';
        }

        if (true === $value) {
            return 'true';
        }

        if (null === $value) {
            return 'null';
        }

        if (empty($value)) {
            return '';
        }

        if (is_array($value)) {
            return implode(',', $value);
        }
    }
}
PK{`�\-*ҹ--8pear/Symfony/Component/Config/Definition/NumericNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;

/**
 * This node represents a numeric value in the config tree
 *
 * @author David Jeanmonod <david.jeanmonod@gmail.com>
 */
class NumericNode extends ScalarNode
{
    protected $min;
    protected $max;

    public function __construct($name, NodeInterface $parent = null, $min = null, $max = null)
    {
        parent::__construct($name, $parent);
        $this->min = $min;
        $this->max = $max;
    }

    /**
     * {@inheritDoc}
     */
    protected function finalizeValue($value)
    {
        $value = parent::finalizeValue($value);

        $errorMsg = null;
        if (isset($this->min) && $value < $this->min) {
            $errorMsg = sprintf('The value %s is too small for path "%s". Should be greater than or equal to %s', $value, $this->getPath(), $this->min);
        }
        if (isset($this->max) && $value > $this->max) {
            $errorMsg = sprintf('The value %s is too big for path "%s". Should be less than or equal to %s', $value, $this->getPath(), $this->max);
        }
        if (isset($errorMsg)) {
            $ex = new InvalidConfigurationException($errorMsg);
            $ex->setPath($this->getPath());
            throw $ex;
        }

        return $value;
    }
}
PK{`�\�|�EELpear/Symfony/Component/Config/Definition/Exception/DuplicateKeyException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Exception;

/**
 * This exception is thrown whenever the key of an array is not unique. This can
 * only be the case if the configuration is coming from an XML file.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class DuplicateKeyException extends InvalidConfigurationException
{
}
PK{`�\5-���Tpear/Symfony/Component/Config/Definition/Exception/InvalidConfigurationException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Exception;

/**
 * A very general exception which can be thrown whenever non of the more specific
 * exceptions is suitable.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class InvalidConfigurationException extends Exception
{
    private $path;

    public function setPath($path)
    {
        $this->path = $path;
    }

    public function getPath()
    {
        return $this->path;
    }
}
PK{`�\�C����@pear/Symfony/Component/Config/Definition/Exception/Exception.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Exception;

/**
 * Base exception for all configuration exceptions
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class Exception extends \RuntimeException
{
}
PK{`�\]F4���Qpear/Symfony/Component/Config/Definition/Exception/InvalidDefinitionException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Exception;

/**
 * Thrown when an error is detected in a node Definition.
 *
 * @author Victor Berchet <victor.berchet@suumit.com>
 */
class InvalidDefinitionException extends Exception
{
}
PK|`�\��@��Kpear/Symfony/Component/Config/Definition/Exception/InvalidTypeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Exception;

/**
 * This exception is thrown if an invalid type is encountered.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class InvalidTypeException extends InvalidConfigurationException
{
}
PK|`�\����Hpear/Symfony/Component/Config/Definition/Exception/UnsetKeyException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Exception;

/**
 * This exception is usually not encountered by the end-user, but only used
 * internally to signal the parent scope to unset a key.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class UnsetKeyException extends Exception
{
}
PK|`�\�:2&QQRpear/Symfony/Component/Config/Definition/Exception/ForbiddenOverwriteException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Exception;

/**
 * This exception is thrown when a configuration path is overwritten from a
 * subsequent configuration file, but the entry node specifically forbids this.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ForbiddenOverwriteException extends InvalidConfigurationException
{
}
PK|`�\����8pear/Symfony/Component/Config/Definition/BooleanNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidTypeException;

/**
 * This node represents a Boolean value in the config tree.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class BooleanNode extends ScalarNode
{
    /**
     * {@inheritDoc}
     */
    protected function validateType($value)
    {
        if (!is_bool($value)) {
            $ex = new InvalidTypeException(sprintf(
                'Invalid type for path "%s". Expected boolean, but got %s.',
                $this->getPath(),
                gettype($value)
            ));
            $ex->setPath($this->getPath());

            throw $ex;
        }
    }
}
PK|`�\�+;;7pear/Symfony/Component/Config/Definition/ScalarNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidTypeException;

/**
 * This node represents a scalar value in the config tree.
 *
 * The following values are considered scalars:
 *   * booleans
 *   * strings
 *   * null
 *   * integers
 *   * floats
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ScalarNode extends VariableNode
{
    /**
     * {@inheritDoc}
     */
    protected function validateType($value)
    {
        if (!is_scalar($value) && null !== $value) {
            $ex = new InvalidTypeException(sprintf(
                'Invalid type for path "%s". Expected scalar, but got %s.',
                $this->getPath(),
                gettype($value)
            ));
            $ex->setPath($this->getPath());

            throw $ex;
        }
    }
}
PK}`�\~�G�XXJpear/Symfony/Component/Config/Definition/Builder/NumericNodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

/**
 * Abstract class that contain common code of integer and float node definition.
 *
 * @author David Jeanmonod <david.jeanmonod@gmail.com>
 */
abstract class NumericNodeDefinition extends ScalarNodeDefinition
{
    protected $min;
    protected $max;

    /**
     * Ensures that the value is smaller than the given reference.
     *
     * @param mixed $max
     *
     * @return NumericNodeDefinition
     *
     * @throws \InvalidArgumentException when the constraint is inconsistent
     */
    public function max($max)
    {
        if (isset($this->min) && $this->min > $max) {
            throw new \InvalidArgumentException(sprintf('You cannot define a max(%s) as you already have a min(%s)', $max, $this->min));
        }
        $this->max = $max;

        return $this;
    }

    /**
     * Ensures that the value is bigger than the given reference.
     *
     * @param mixed $min
     *
     * @return NumericNodeDefinition
     *
     * @throws \InvalidArgumentException when the constraint is inconsistent
     */
    public function min($min)
    {
        if (isset($this->max) && $this->max < $min) {
            throw new \InvalidArgumentException(sprintf('You cannot define a min(%s) as you already have a max(%s)', $min, $this->max));
        }
        $this->min = $min;

        return $this;
    }
}
PK}`�\t�p��Hpear/Symfony/Component/Config/Definition/Builder/FloatNodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\FloatNode;

/**
 * This class provides a fluent interface for defining a float node.
 *
 * @author Jeanmonod David <david.jeanmonod@gmail.com>
 */
class FloatNodeDefinition extends NumericNodeDefinition
{
    /**
     * Instantiates a Node.
     *
     * @return FloatNode The node
     */
    protected function instantiateNode()
    {
        return new FloatNode($this->name, $this->parent, $this->min, $this->max);
    }
}
PK}`�\��ʍ��Gpear/Symfony/Component/Config/Definition/Builder/EnumNodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\EnumNode;

/**
 * Enum Node Definition.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class EnumNodeDefinition extends ScalarNodeDefinition
{
    private $values;

    public function values(array $values)
    {
        $values = array_unique($values);

        if (count($values) <= 1) {
            throw new \InvalidArgumentException('->values() must be called with at least two distinct values.');
        }

        $this->values = $values;

        return $this;
    }

    /**
     * Instantiate a Node
     *
     * @return EnumNode The node
     *
     * @throws \RuntimeException
     */
    protected function instantiateNode()
    {
        if (null === $this->values) {
            throw new \RuntimeException('You must call ->values() on enum nodes.');
        }

        return new EnumNode($this->name, $this->parent, $this->values);
    }
}
PK}`�\P����Jpear/Symfony/Component/Config/Definition/Builder/BooleanNodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\BooleanNode;

/**
 * This class provides a fluent interface for defining a node.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class BooleanNodeDefinition extends ScalarNodeDefinition
{
    /**
     * {@inheritDoc}
     */
    public function __construct($name, NodeParentInterface $parent = null)
    {
        parent::__construct($name, $parent);

        $this->nullEquivalent = true;
    }

    /**
     * Instantiate a Node
     *
     * @return BooleanNode The node
     */
    protected function instantiateNode()
    {
        return new BooleanNode($this->name, $this->parent);
    }

}
PK}`�\V�hU��@pear/Symfony/Component/Config/Definition/Builder/TreeBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\NodeInterface;

/**
 * This is the entry class for building a config tree.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class TreeBuilder implements NodeParentInterface
{
    protected $tree;
    protected $root;
    protected $builder;

    /**
     * Creates the root node.
     *
     * @param string      $name    The name of the root node
     * @param string      $type    The type of the root node
     * @param NodeBuilder $builder A custom node builder instance
     *
     * @return ArrayNodeDefinition|NodeDefinition The root node (as an ArrayNodeDefinition when the type is 'array')
     *
     * @throws \RuntimeException When the node type is not supported
     */
    public function root($name, $type = 'array', NodeBuilder $builder = null)
    {
        $builder = $builder ?: new NodeBuilder();

        return $this->root = $builder->node($name, $type)->setParent($this);
    }

    /**
     * Builds the tree.
     *
     * @return NodeInterface
     *
     * @throws \RuntimeException
     */
    public function buildTree()
    {
        if (null === $this->root) {
            throw new \RuntimeException('The configuration tree has no root node.');
        }
        if (null !== $this->tree) {
            return $this->tree;
        }

        return $this->tree = $this->root->getNode(true);
    }
}
PK�`�\,��l[[Fpear/Symfony/Component/Config/Definition/Builder/ValidationBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

/**
 * This class builds validation conditions.
 *
 * @author Christophe Coevoet <stof@notk.org>
 */
class ValidationBuilder
{
    protected $node;
    public $rules = array();

    /**
     * Constructor
     *
     * @param NodeDefinition $node The related node
     */
    public function __construct(NodeDefinition $node)
    {
        $this->node = $node;
    }

    /**
     * Registers a closure to run as normalization or an expression builder to build it if null is provided.
     *
     * @param \Closure $closure
     *
     * @return ExprBuilder|ValidationBuilder
     */
    public function rule(\Closure $closure = null)
    {
        if (null !== $closure) {
            $this->rules[] = $closure;

            return $this;
        }

        return $this->rules[] = new ExprBuilder($this->node);
    }
}
PK�`�\ �"�$$@pear/Symfony/Component/Config/Definition/Builder/ExprBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\Exception\UnsetKeyException;

/**
 * This class builds an if expression.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Christophe Coevoet <stof@notk.org>
 */
class ExprBuilder
{
    protected $node;
    public $ifPart;
    public $thenPart;

    /**
     * Constructor
     *
     * @param NodeDefinition $node The related node
     */
    public function __construct(NodeDefinition $node)
    {
        $this->node = $node;
    }

    /**
     * Marks the expression as being always used.
     *
     * @param \Closure $then
     *
     * @return ExprBuilder
     */
    public function always(\Closure $then = null)
    {
        $this->ifPart = function ($v) { return true; };

        if (null !== $then) {
            $this->thenPart = $then;
        }

        return $this;
    }

    /**
     * Sets a closure to use as tests.
     *
     * The default one tests if the value is true.
     *
     * @param \Closure $closure
     *
     * @return ExprBuilder
     */
    public function ifTrue(\Closure $closure = null)
    {
        if (null === $closure) {
            $closure = function ($v) { return true === $v; };
        }

        $this->ifPart = $closure;

        return $this;
    }

    /**
     * Tests if the value is a string.
     *
     * @return ExprBuilder
     */
    public function ifString()
    {
        $this->ifPart = function ($v) { return is_string($v); };

        return $this;
    }

    /**
     * Tests if the value is null.
     *
     * @return ExprBuilder
     */
    public function ifNull()
    {
        $this->ifPart = function ($v) { return null === $v; };

        return $this;
    }

    /**
     * Tests if the value is an array.
     *
     * @return ExprBuilder
     */
    public function ifArray()
    {
        $this->ifPart = function ($v) { return is_array($v); };

        return $this;
    }

    /**
     * Tests if the value is in an array.
     *
     * @param array $array
     *
     * @return ExprBuilder
     */
    public function ifInArray(array $array)
    {
        $this->ifPart = function ($v) use ($array) { return in_array($v, $array, true); };

        return $this;
    }

    /**
     * Tests if the value is not in an array.
     *
     * @param array $array
     *
     * @return ExprBuilder
     */
    public function ifNotInArray(array $array)
    {
        $this->ifPart = function ($v) use ($array) { return !in_array($v, $array, true); };

        return $this;
    }

    /**
     * Sets the closure to run if the test pass.
     *
     * @param \Closure $closure
     *
     * @return ExprBuilder
     */
    public function then(\Closure $closure)
    {
        $this->thenPart = $closure;

        return $this;
    }

    /**
     * Sets a closure returning an empty array.
     *
     * @return ExprBuilder
     */
    public function thenEmptyArray()
    {
        $this->thenPart = function ($v) { return array(); };

        return $this;
    }

    /**
     * Sets a closure marking the value as invalid at validation time.
     *
     * if you want to add the value of the node in your message just use a %s placeholder.
     *
     * @param string $message
     *
     * @return ExprBuilder
     *
     * @throws \InvalidArgumentException
     */
    public function thenInvalid($message)
    {
        $this->thenPart = function ($v) use ($message) {throw new \InvalidArgumentException(sprintf($message, json_encode($v))); };

        return $this;
    }

    /**
     * Sets a closure unsetting this key of the array at validation time.
     *
     * @return ExprBuilder
     *
     * @throws UnsetKeyException
     */
    public function thenUnset()
    {
        $this->thenPart = function ($v) { throw new UnsetKeyException('Unsetting key'); };

        return $this;
    }

    /**
     * Returns the related node
     *
     * @return NodeDefinition
     *
     * @throws \RuntimeException
     */
    public function end()
    {
        if (null === $this->ifPart) {
            throw new \RuntimeException('You must specify an if part.');
        }
        if (null === $this->thenPart) {
            throw new \RuntimeException('You must specify a then part.');
        }

        return $this->node;
    }

    /**
     * Builds the expressions.
     *
     * @param ExprBuilder[] $expressions An array of ExprBuilder instances to build
     *
     * @return array
     */
    public static function buildExpressions(array $expressions)
    {
        foreach ($expressions as $k => $expr) {
            if ($expr instanceof ExprBuilder) {
                $expressions[$k] = function ($v) use ($expr) {
                    return call_user_func($expr->ifPart, $v) ? call_user_func($expr->thenPart, $v) : $v;
                };
            }
        }

        return $expressions;
    }
}
PK�`�\��8�8Hpear/Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\PrototypedArrayNode;
use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;

/**
 * This class provides a fluent interface for defining an array node.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ArrayNodeDefinition extends NodeDefinition implements ParentNodeDefinitionInterface
{
    protected $performDeepMerging = true;
    protected $ignoreExtraKeys = false;
    protected $children = array();
    protected $prototype;
    protected $atLeastOne = false;
    protected $allowNewKeys = true;
    protected $key;
    protected $removeKeyItem;
    protected $addDefaults = false;
    protected $addDefaultChildren = false;
    protected $nodeBuilder;
    protected $normalizeKeys = true;

    /**
     * {@inheritDoc}
     */
    public function __construct($name, NodeParentInterface $parent = null)
    {
        parent::__construct($name, $parent);

        $this->nullEquivalent = array();
        $this->trueEquivalent = array();
    }

    /**
     * Sets a custom children builder.
     *
     * @param NodeBuilder $builder A custom NodeBuilder
     */
    public function setBuilder(NodeBuilder $builder)
    {
        $this->nodeBuilder = $builder;
    }

    /**
     * Returns a builder to add children nodes.
     *
     * @return NodeBuilder
     */
    public function children()
    {
        return $this->getNodeBuilder();
    }

    /**
     * Sets a prototype for child nodes.
     *
     * @param string $type the type of node
     *
     * @return NodeDefinition
     */
    public function prototype($type)
    {
        return $this->prototype = $this->getNodeBuilder()->node(null, $type)->setParent($this);
    }

    /**
     * Adds the default value if the node is not set in the configuration.
     *
     * This method is applicable to concrete nodes only (not to prototype nodes).
     * If this function has been called and the node is not set during the finalization
     * phase, it's default value will be derived from its children default values.
     *
     * @return ArrayNodeDefinition
     */
    public function addDefaultsIfNotSet()
    {
        $this->addDefaults = true;

        return $this;
    }

    /**
     * Adds children with a default value when none are defined.
     *
     * @param integer|string|array|null $children The number of children|The child name|The children names to be added
     *
     * This method is applicable to prototype nodes only.
     *
     * @return ArrayNodeDefinition
     */
    public function addDefaultChildrenIfNoneSet($children = null)
    {
        $this->addDefaultChildren = $children;

        return $this;
    }

    /**
     * Requires the node to have at least one element.
     *
     * This method is applicable to prototype nodes only.
     *
     * @return ArrayNodeDefinition
     */
    public function requiresAtLeastOneElement()
    {
        $this->atLeastOne = true;

        return $this;
    }

    /**
     * Disallows adding news keys in a subsequent configuration.
     *
     * If used all keys have to be defined in the same configuration file.
     *
     * @return ArrayNodeDefinition
     */
    public function disallowNewKeysInSubsequentConfigs()
    {
        $this->allowNewKeys = false;

        return $this;
    }

    /**
     * Sets a normalization rule for XML configurations.
     *
     * @param string $singular The key to remap
     * @param string $plural   The plural of the key for irregular plurals
     *
     * @return ArrayNodeDefinition
     */
    public function fixXmlConfig($singular, $plural = null)
    {
        $this->normalization()->remap($singular, $plural);

        return $this;
    }

    /**
     * Sets the attribute which value is to be used as key.
     *
     * This is useful when you have an indexed array that should be an
     * associative array. You can select an item from within the array
     * to be the key of the particular item. For example, if "id" is the
     * "key", then:
     *
     *     array(
     *         array('id' => 'my_name', 'foo' => 'bar'),
     *     );
     *
     *   becomes
     *
     *     array(
     *         'my_name' => array('foo' => 'bar'),
     *     );
     *
     * If you'd like "'id' => 'my_name'" to still be present in the resulting
     * array, then you can set the second argument of this method to false.
     *
     * This method is applicable to prototype nodes only.
     *
     * @param string  $name          The name of the key
     * @param Boolean $removeKeyItem Whether or not the key item should be removed.
     *
     * @return ArrayNodeDefinition
     */
    public function useAttributeAsKey($name, $removeKeyItem = true)
    {
        $this->key = $name;
        $this->removeKeyItem = $removeKeyItem;

        return $this;
    }

    /**
     * Sets whether the node can be unset.
     *
     * @param Boolean $allow
     *
     * @return ArrayNodeDefinition
     */
    public function canBeUnset($allow = true)
    {
        $this->merge()->allowUnset($allow);

        return $this;
    }

    /**
     * Adds an "enabled" boolean to enable the current section.
     *
     * By default, the section is disabled. If any configuration is specified then
     * the node will be automatically enabled:
     *
     * enableableArrayNode: {enabled: true, ...}   # The config is enabled & default values get overridden
     * enableableArrayNode: ~                      # The config is enabled & use the default values
     * enableableArrayNode: true                   # The config is enabled & use the default values
     * enableableArrayNode: {other: value, ...}    # The config is enabled & default values get overridden
     * enableableArrayNode: {enabled: false, ...}  # The config is disabled
     * enableableArrayNode: false                  # The config is disabled
     *
     * @return ArrayNodeDefinition
     */
    public function canBeEnabled()
    {
        $this
            ->addDefaultsIfNotSet()
            ->treatFalseLike(array('enabled' => false))
            ->treatTrueLike(array('enabled' => true))
            ->treatNullLike(array('enabled' => true))
            ->beforeNormalization()
                ->ifArray()
                ->then(function ($v) {
                    $v['enabled'] = isset($v['enabled']) ? $v['enabled'] : true;

                    return $v;
                })
            ->end()
            ->children()
                ->booleanNode('enabled')
                    ->defaultFalse()
        ;

        return $this;
    }

    /**
     * Adds an "enabled" boolean to enable the current section.
     *
     * By default, the section is enabled.
     *
     * @return ArrayNodeDefinition
     */
    public function canBeDisabled()
    {
        $this
            ->addDefaultsIfNotSet()
            ->treatFalseLike(array('enabled' => false))
            ->treatTrueLike(array('enabled' => true))
            ->treatNullLike(array('enabled' => true))
            ->children()
                ->booleanNode('enabled')
                    ->defaultTrue()
        ;

        return $this;
    }

    /**
     * Disables the deep merging of the node.
     *
     * @return ArrayNodeDefinition
     */
    public function performNoDeepMerging()
    {
        $this->performDeepMerging = false;

        return $this;
    }

    /**
     * Allows extra config keys to be specified under an array without
     * throwing an exception.
     *
     * Those config values are simply ignored. This should be used only
     * in special cases where you want to send an entire configuration
     * array through a special tree that processes only part of the array.
     *
     * @return ArrayNodeDefinition
     */
    public function ignoreExtraKeys()
    {
        $this->ignoreExtraKeys = true;

        return $this;
    }

    /**
     * Sets key normalization.
     *
     * @param Boolean $bool Whether to enable key normalization
     *
     * @return ArrayNodeDefinition
     */
    public function normalizeKeys($bool)
    {
        $this->normalizeKeys = (Boolean) $bool;

        return $this;
    }

    /**
     * Appends a node definition.
     *
     *     $node = new ArrayNodeDefinition()
     *         ->children()
     *             ->scalarNode('foo')->end()
     *             ->scalarNode('baz')->end()
     *         ->end()
     *         ->append($this->getBarNodeDefinition())
     *     ;
     *
     * @param NodeDefinition $node A NodeDefinition instance
     *
     * @return ArrayNodeDefinition This node
     */
    public function append(NodeDefinition $node)
    {
        $this->children[$node->name] = $node->setParent($this);

        return $this;
    }

    /**
     * Returns a node builder to be used to add children and prototype
     *
     * @return NodeBuilder The node builder
     */
    protected function getNodeBuilder()
    {
        if (null === $this->nodeBuilder) {
            $this->nodeBuilder = new NodeBuilder();
        }

        return $this->nodeBuilder->setParent($this);
    }

    /**
     * {@inheritDoc}
     */
    protected function createNode()
    {
        if (null === $this->prototype) {
            $node = new ArrayNode($this->name, $this->parent);

            $this->validateConcreteNode($node);

            $node->setAddIfNotSet($this->addDefaults);

            foreach ($this->children as $child) {
                $child->parent = $node;
                $node->addChild($child->getNode());
            }
        } else {
            $node = new PrototypedArrayNode($this->name, $this->parent);

            $this->validatePrototypeNode($node);

            if (null !== $this->key) {
                $node->setKeyAttribute($this->key, $this->removeKeyItem);
            }

            if (true === $this->atLeastOne) {
                $node->setMinNumberOfElements(1);
            }

            if ($this->default) {
                $node->setDefaultValue($this->defaultValue);
            }

            if (false !== $this->addDefaultChildren) {
                $node->setAddChildrenIfNoneSet($this->addDefaultChildren);
                if ($this->prototype instanceof static && null === $this->prototype->prototype) {
                    $this->prototype->addDefaultsIfNotSet();
                }
            }

            $this->prototype->parent = $node;
            $node->setPrototype($this->prototype->getNode());
        }

        $node->setAllowNewKeys($this->allowNewKeys);
        $node->addEquivalentValue(null, $this->nullEquivalent);
        $node->addEquivalentValue(true, $this->trueEquivalent);
        $node->addEquivalentValue(false, $this->falseEquivalent);
        $node->setPerformDeepMerging($this->performDeepMerging);
        $node->setRequired($this->required);
        $node->setIgnoreExtraKeys($this->ignoreExtraKeys);
        $node->setNormalizeKeys($this->normalizeKeys);

        if (null !== $this->normalization) {
            $node->setNormalizationClosures($this->normalization->before);
            $node->setXmlRemappings($this->normalization->remappings);
        }

        if (null !== $this->merge) {
            $node->setAllowOverwrite($this->merge->allowOverwrite);
            $node->setAllowFalse($this->merge->allowFalse);
        }

        if (null !== $this->validation) {
            $node->setFinalValidationClosures($this->validation->rules);
        }

        return $node;
    }

    /**
     * Validate the configuration of a concrete node.
     *
     * @param ArrayNode $node The related node
     *
     * @throws InvalidDefinitionException
     */
    protected function validateConcreteNode(ArrayNode $node)
    {
        $path = $node->getPath();

        if (null !== $this->key) {
            throw new InvalidDefinitionException(
                sprintf('->useAttributeAsKey() is not applicable to concrete nodes at path "%s"', $path)
            );
        }

        if (true === $this->atLeastOne) {
            throw new InvalidDefinitionException(
                sprintf('->requiresAtLeastOneElement() is not applicable to concrete nodes at path "%s"', $path)
            );
        }

        if ($this->default) {
            throw new InvalidDefinitionException(
                sprintf('->defaultValue() is not applicable to concrete nodes at path "%s"', $path)
            );
        }

        if (false !== $this->addDefaultChildren) {
            throw new InvalidDefinitionException(
                sprintf('->addDefaultChildrenIfNoneSet() is not applicable to concrete nodes at path "%s"', $path)
            );
        }
    }

    /**
     * Validate the configuration of a prototype node.
     *
     * @param PrototypedArrayNode $node The related node
     *
     * @throws InvalidDefinitionException
     */
    protected function validatePrototypeNode(PrototypedArrayNode $node)
    {
        $path = $node->getPath();

        if ($this->addDefaults) {
            throw new InvalidDefinitionException(
                sprintf('->addDefaultsIfNotSet() is not applicable to prototype nodes at path "%s"', $path)
            );
        }

        if (false !== $this->addDefaultChildren) {
            if ($this->default) {
                throw new InvalidDefinitionException(
                    sprintf('A default value and default children might not be used together at path "%s"', $path)
                );
            }

            if (null !== $this->key && (null === $this->addDefaultChildren || is_integer($this->addDefaultChildren) && $this->addDefaultChildren > 0)) {
                throw new InvalidDefinitionException(
                    sprintf('->addDefaultChildrenIfNoneSet() should set default children names as ->useAttributeAsKey() is used at path "%s"', $path)
                );
            }

            if (null === $this->key && (is_string($this->addDefaultChildren) || is_array($this->addDefaultChildren))) {
                throw new InvalidDefinitionException(
                    sprintf('->addDefaultChildrenIfNoneSet() might not set default children names as ->useAttributeAsKey() is not used at path "%s"', $path)
                );
            }
        }
    }
}
PK�`�\�e�@��Kpear/Symfony/Component/Config/Definition/Builder/VariableNodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\VariableNode;

/**
 * This class provides a fluent interface for defining a node.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class VariableNodeDefinition extends NodeDefinition
{
    /**
     * Instantiate a Node
     *
     * @return VariableNode The node
     */
    protected function instantiateNode()
    {
        return new VariableNode($this->name, $this->parent);
    }

    /**
     * {@inheritDoc}
     */
    protected function createNode()
    {
        $node = $this->instantiateNode();

        if (null !== $this->normalization) {
            $node->setNormalizationClosures($this->normalization->before);
        }

        if (null !== $this->merge) {
            $node->setAllowOverwrite($this->merge->allowOverwrite);
        }

        if (true === $this->default) {
            $node->setDefaultValue($this->defaultValue);
        }

        $node->setAllowEmptyValue($this->allowEmptyValue);
        $node->addEquivalentValue(null, $this->nullEquivalent);
        $node->addEquivalentValue(true, $this->trueEquivalent);
        $node->addEquivalentValue(false, $this->falseEquivalent);
        $node->setRequired($this->required);

        if (null !== $this->validation) {
            $node->setFinalValidationClosures($this->validation->rules);
        }

        return $node;
    }

}
PK�`�\�mc��Ipear/Symfony/Component/Config/Definition/Builder/ScalarNodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\ScalarNode;

/**
 * This class provides a fluent interface for defining a node.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ScalarNodeDefinition extends VariableNodeDefinition
{
    /**
     * Instantiate a Node
     *
     * @return ScalarNode The node
     */
    protected function instantiateNode()
    {
        return new ScalarNode($this->name, $this->parent);
    }
}
PK�`�\���{{Apear/Symfony/Component/Config/Definition/Builder/MergeBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

/**
 * This class builds merge conditions.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class MergeBuilder
{
    protected $node;
    public $allowFalse = false;
    public $allowOverwrite = true;

    /**
     * Constructor
     *
     * @param NodeDefinition $node The related node
     */
    public function __construct(NodeDefinition $node)
    {
        $this->node = $node;
    }

    /**
     * Sets whether the node can be unset.
     *
     * @param Boolean $allow
     *
     * @return MergeBuilder
     */
    public function allowUnset($allow = true)
    {
        $this->allowFalse = $allow;

        return $this;
    }

    /**
     * Sets whether the node can be overwritten.
     *
     * @param Boolean $deny Whether the overwriting is forbidden or not
     *
     * @return MergeBuilder
     */
    public function denyOverwrite($deny = true)
    {
        $this->allowOverwrite = !$deny;

        return $this;
    }

    /**
     * Returns the related node.
     *
     * @return NodeDefinition
     */
    public function end()
    {
        return $this->node;
    }
}
PK�`�\��K��Cpear/Symfony/Component/Config/Definition/Builder/NodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;

/**
 * This class provides a fluent interface for defining a node.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
abstract class NodeDefinition implements NodeParentInterface
{
    protected $name;
    protected $normalization;
    protected $validation;
    protected $defaultValue;
    protected $default = false;
    protected $required = false;
    protected $merge;
    protected $allowEmptyValue = true;
    protected $nullEquivalent;
    protected $trueEquivalent = true;
    protected $falseEquivalent = false;

    /**
     * @var NodeParentInterface|null
     */
    protected $parent;
    protected $attributes = array();

    /**
     * Constructor
     *
     * @param string                   $name   The name of the node
     * @param NodeParentInterface|null $parent The parent
     */
    public function __construct($name, NodeParentInterface $parent = null)
    {
        $this->parent = $parent;
        $this->name = $name;
    }

    /**
     * Sets the parent node.
     *
     * @param NodeParentInterface $parent The parent
     *
     * @return NodeDefinition
     */
    public function setParent(NodeParentInterface $parent)
    {
        $this->parent = $parent;

        return $this;
    }

    /**
     * Sets info message.
     *
     * @param string $info The info text
     *
     * @return NodeDefinition
     */
    public function info($info)
    {
        return $this->attribute('info', $info);
    }

    /**
     * Sets example configuration.
     *
     * @param string|array $example
     *
     * @return NodeDefinition
     */
    public function example($example)
    {
        return $this->attribute('example', $example);
    }

    /**
     * Sets an attribute on the node.
     *
     * @param string $key
     * @param mixed $value
     *
     * @return NodeDefinition
     */
    public function attribute($key, $value)
    {
        $this->attributes[$key] = $value;

        return $this;
    }

    /**
     * Returns the parent node.
     *
     * @return NodeParentInterface|null The builder of the parent node
     */
    public function end()
    {
        return $this->parent;
    }

    /**
     * Creates the node.
     *
     * @param Boolean $forceRootNode Whether to force this node as the root node
     *
     * @return NodeInterface
     */
    public function getNode($forceRootNode = false)
    {
        if ($forceRootNode) {
            $this->parent = null;
        }

        if (null !== $this->normalization) {
            $this->normalization->before = ExprBuilder::buildExpressions($this->normalization->before);
        }

        if (null !== $this->validation) {
            $this->validation->rules = ExprBuilder::buildExpressions($this->validation->rules);
        }

        $node = $this->createNode();
        $node->setAttributes($this->attributes);

        return $node;
    }

    /**
     * Sets the default value.
     *
     * @param mixed $value The default value
     *
     * @return NodeDefinition
     */
    public function defaultValue($value)
    {
        $this->default = true;
        $this->defaultValue = $value;

        return $this;
    }

    /**
     * Sets the node as required.
     *
     * @return NodeDefinition
     */
    public function isRequired()
    {
        $this->required = true;

        return $this;
    }

    /**
     * Sets the equivalent value used when the node contains null.
     *
     * @param mixed $value
     *
     * @return NodeDefinition
     */
    public function treatNullLike($value)
    {
        $this->nullEquivalent = $value;

        return $this;
    }

    /**
     * Sets the equivalent value used when the node contains true.
     *
     * @param mixed $value
     *
     * @return NodeDefinition
     */
    public function treatTrueLike($value)
    {
        $this->trueEquivalent = $value;

        return $this;
    }

    /**
     * Sets the equivalent value used when the node contains false.
     *
     * @param mixed $value
     *
     * @return NodeDefinition
     */
    public function treatFalseLike($value)
    {
        $this->falseEquivalent = $value;

        return $this;
    }

    /**
     * Sets null as the default value.
     *
     * @return NodeDefinition
     */
    public function defaultNull()
    {
        return $this->defaultValue(null);
    }

    /**
     * Sets true as the default value.
     *
     * @return NodeDefinition
     */
    public function defaultTrue()
    {
        return $this->defaultValue(true);
    }

    /**
     * Sets false as the default value.
     *
     * @return NodeDefinition
     */
    public function defaultFalse()
    {
        return $this->defaultValue(false);
    }

    /**
     * Sets an expression to run before the normalization.
     *
     * @return ExprBuilder
     */
    public function beforeNormalization()
    {
        return $this->normalization()->before();
    }

    /**
     * Denies the node value being empty.
     *
     * @return NodeDefinition
     */
    public function cannotBeEmpty()
    {
        $this->allowEmptyValue = false;

        return $this;
    }

    /**
     * Sets an expression to run for the validation.
     *
     * The expression receives the value of the node and must return it. It can
     * modify it.
     * An exception should be thrown when the node is not valid.
     *
     * @return ExprBuilder
     */
    public function validate()
    {
        return $this->validation()->rule();
    }

    /**
     * Sets whether the node can be overwritten.
     *
     * @param Boolean $deny Whether the overwriting is forbidden or not
     *
     * @return NodeDefinition
     */
    public function cannotBeOverwritten($deny = true)
    {
        $this->merge()->denyOverwrite($deny);

        return $this;
    }

    /**
     * Gets the builder for validation rules.
     *
     * @return ValidationBuilder
     */
    protected function validation()
    {
        if (null === $this->validation) {
            $this->validation = new ValidationBuilder($this);
        }

        return $this->validation;
    }

    /**
     * Gets the builder for merging rules.
     *
     * @return MergeBuilder
     */
    protected function merge()
    {
        if (null === $this->merge) {
            $this->merge = new MergeBuilder($this);
        }

        return $this->merge;
    }

    /**
     * Gets the builder for normalization rules.
     *
     * @return NormalizationBuilder
     */
    protected function normalization()
    {
        if (null === $this->normalization) {
            $this->normalization = new NormalizationBuilder($this);
        }

        return $this->normalization;
    }

    /**
     * Instantiate and configure the node according to this definition
     *
     * @return NodeInterface $node The node instance
     *
     * @throws InvalidDefinitionException When the definition is invalid
     */
    abstract protected function createNode();

}
PK�`�\'nڭJpear/Symfony/Component/Config/Definition/Builder/IntegerNodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

use Symfony\Component\Config\Definition\IntegerNode;

/**
 * This class provides a fluent interface for defining an integer node.
 *
 * @author Jeanmonod David <david.jeanmonod@gmail.com>
 */
class IntegerNodeDefinition extends NumericNodeDefinition
{
    /**
     * Instantiates a Node.
     *
     * @return IntegerNode The node
     */
    protected function instantiateNode()
    {
        return new IntegerNode($this->name, $this->parent, $this->min, $this->max);
    }
}
PK�`�\#
֕44Ipear/Symfony/Component/Config/Definition/Builder/NormalizationBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

/**
 * This class builds normalization conditions.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class NormalizationBuilder
{
    protected $node;
    public $before = array();
    public $remappings = array();

    /**
     * Constructor
     *
     * @param NodeDefinition $node The related node
     */
    public function __construct(NodeDefinition $node)
    {
        $this->node = $node;
    }

    /**
     * Registers a key to remap to its plural form.
     *
     * @param string $key    The key to remap
     * @param string $plural The plural of the key in case of irregular plural
     *
     * @return NormalizationBuilder
     */
    public function remap($key, $plural = null)
    {
        $this->remappings[] = array($key, null === $plural ? $key.'s' : $plural);

        return $this;
    }

    /**
     * Registers a closure to run before the normalization or an expression builder to build it if null is provided.
     *
     * @param \Closure $closure
     *
     * @return ExprBuilder|NormalizationBuilder
     */
    public function before(\Closure $closure = null)
    {
        if (null !== $closure) {
            $this->before[] = $closure;

            return $this;
        }

        return $this->before[] = new ExprBuilder($this->node);
    }
}
PK�`�\ �}��@pear/Symfony/Component/Config/Definition/Builder/NodeBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

/**
 * This class provides a fluent interface for building a node.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class NodeBuilder implements NodeParentInterface
{
    protected $parent;
    protected $nodeMapping;

    /**
     * Constructor
     *
     */
    public function __construct()
    {
        $this->nodeMapping = array(
            'variable'    => __NAMESPACE__.'\\VariableNodeDefinition',
            'scalar'      => __NAMESPACE__.'\\ScalarNodeDefinition',
            'boolean'     => __NAMESPACE__.'\\BooleanNodeDefinition',
            'integer'     => __NAMESPACE__.'\\IntegerNodeDefinition',
            'float'       => __NAMESPACE__.'\\FloatNodeDefinition',
            'array'       => __NAMESPACE__.'\\ArrayNodeDefinition',
            'enum'        => __NAMESPACE__.'\\EnumNodeDefinition',
        );
    }

    /**
     * Set the parent node.
     *
     * @param ParentNodeDefinitionInterface $parent The parent node
     *
     * @return NodeBuilder This node builder
     */
    public function setParent(ParentNodeDefinitionInterface $parent = null)
    {
        $this->parent = $parent;

        return $this;
    }

    /**
     * Creates a child array node.
     *
     * @param string $name The name of the node
     *
     * @return ArrayNodeDefinition The child node
     */
    public function arrayNode($name)
    {
        return $this->node($name, 'array');
    }

    /**
     * Creates a child scalar node.
     *
     * @param string $name the name of the node
     *
     * @return ScalarNodeDefinition The child node
     */
    public function scalarNode($name)
    {
        return $this->node($name, 'scalar');
    }

    /**
     * Creates a child Boolean node.
     *
     * @param string $name The name of the node
     *
     * @return BooleanNodeDefinition The child node
     */
    public function booleanNode($name)
    {
        return $this->node($name, 'boolean');
    }

    /**
     * Creates a child integer node.
     *
     * @param string $name the name of the node
     *
     * @return IntegerNodeDefinition The child node
     */
    public function integerNode($name)
    {
        return $this->node($name, 'integer');
    }

    /**
     * Creates a child float node.
     *
     * @param string $name the name of the node
     *
     * @return FloatNodeDefinition The child node
     */
    public function floatNode($name)
    {
        return $this->node($name, 'float');
    }

    /**
     * Creates a child EnumNode.
     *
     * @param string $name
     *
     * @return EnumNodeDefinition
     */
    public function enumNode($name)
    {
        return $this->node($name, 'enum');
    }

    /**
     * Creates a child variable node.
     *
     * @param string $name The name of the node
     *
     * @return VariableNodeDefinition The builder of the child node
     */
    public function variableNode($name)
    {
        return $this->node($name, 'variable');
    }

    /**
     * Returns the parent node.
     *
     * @return ParentNodeDefinitionInterface The parent node
     */
    public function end()
    {
        return $this->parent;
    }

    /**
     * Creates a child node.
     *
     * @param string $name The name of the node
     * @param string $type The type of the node
     *
     * @return NodeDefinition The child node
     *
     * @throws \RuntimeException When the node type is not registered
     * @throws \RuntimeException When the node class is not found
     */
    public function node($name, $type)
    {
        $class = $this->getNodeClass($type);

        $node = new $class($name);

        $this->append($node);

        return $node;
    }

    /**
     * Appends a node definition.
     *
     * Usage:
     *
     *     $node = new ArrayNodeDefinition('name')
     *         ->children()
     *             ->scalarNode('foo')->end()
     *             ->scalarNode('baz')->end()
     *             ->append($this->getBarNodeDefinition())
     *         ->end()
     *     ;
     *
     * @param NodeDefinition $node
     *
     * @return NodeBuilder This node builder
     */
    public function append(NodeDefinition $node)
    {
        if ($node instanceof ParentNodeDefinitionInterface) {
            $builder = clone $this;
            $builder->setParent(null);
            $node->setBuilder($builder);
        }

        if (null !== $this->parent) {
            $this->parent->append($node);
            // Make this builder the node parent to allow for a fluid interface
            $node->setParent($this);
        }

        return $this;
    }

    /**
     * Adds or overrides a node Type.
     *
     * @param string $type  The name of the type
     * @param string $class The fully qualified name the node definition class
     *
     * @return NodeBuilder This node builder
     */
    public function setNodeClass($type, $class)
    {
        $this->nodeMapping[strtolower($type)] = $class;

        return $this;
    }

    /**
     * Returns the class name of the node definition.
     *
     * @param string $type The node type
     *
     * @return string The node definition class name
     *
     * @throws \RuntimeException When the node type is not registered
     * @throws \RuntimeException When the node class is not found
     */
    protected function getNodeClass($type)
    {
        $type = strtolower($type);

        if (!isset($this->nodeMapping[$type])) {
            throw new \RuntimeException(sprintf('The node type "%s" is not registered.', $type));
        }

        $class = $this->nodeMapping[$type];

        if (!class_exists($class)) {
            throw new \RuntimeException(sprintf('The node class "%s" does not exist.', $class));
        }

        return $class;
    }

}
PK�`�\�3d�__Rpear/Symfony/Component/Config/Definition/Builder/ParentNodeDefinitionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

/**
 * An interface that must be implemented by nodes which can have children
 *
 * @author Victor Berchet <victor@suumit.com>
 */
interface ParentNodeDefinitionInterface
{
    public function children();

    public function append(NodeDefinition $node);

    public function setBuilder(NodeBuilder $builder);
}
PK�`�\U��=��Hpear/Symfony/Component/Config/Definition/Builder/NodeParentInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition\Builder;

/**
 * An interface that must be implemented by all node parents
 *
 * @author Victor Berchet <victor@suumit.com>
 */
interface NodeParentInterface
{
}
PK�`�\0��00<pear/Symfony/Component/Config/Definition/ReferenceDumper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Dumper\YamlReferenceDumper;

/**
 * @deprecated Deprecated since version 2.4, to be removed in 3.0. Use Symfony\Component\Config\Definition\Dumper\YamlReferenceDumper instead.
 */
class ReferenceDumper extends YamlReferenceDumper
{
}
PK�`�\*���ddCpear/Symfony/Component/Config/Definition/ConfigurationInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

/**
 * Configuration interface
 *
 * @author Victor Berchet <victor@suumit.com>
 */
interface ConfigurationInterface
{
    /**
     * Generates the configuration tree builder.
     *
     * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
     */
    public function getConfigTreeBuilder();
}
PK�`�\��B�""5pear/Symfony/Component/Config/Definition/BaseNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\Exception;
use Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;

/**
 * The base node class
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
abstract class BaseNode implements NodeInterface
{
    protected $name;
    protected $parent;
    protected $normalizationClosures = array();
    protected $finalValidationClosures = array();
    protected $allowOverwrite = true;
    protected $required = false;
    protected $equivalentValues = array();
    protected $attributes = array();

    /**
     * Constructor.
     *
     * @param string        $name   The name of the node
     * @param NodeInterface $parent The parent of this node
     *
     * @throws \InvalidArgumentException if the name contains a period.
     */
    public function __construct($name, NodeInterface $parent = null)
    {
        if (false !== strpos($name, '.')) {
            throw new \InvalidArgumentException('The name must not contain ".".');
        }

        $this->name = $name;
        $this->parent = $parent;
    }

    public function setAttribute($key, $value)
    {
        $this->attributes[$key] = $value;
    }

    public function getAttribute($key, $default = null)
    {
        return isset($this->attributes[$key]) ? $this->attributes[$key] : $default;
    }

    public function hasAttribute($key)
    {
        return isset($this->attributes[$key]);
    }

    public function getAttributes()
    {
        return $this->attributes;
    }

    public function setAttributes(array $attributes)
    {
        $this->attributes = $attributes;
    }

    public function removeAttribute($key)
    {
        unset($this->attributes[$key]);
    }

    /**
     * Sets an info message.
     *
     * @param string $info
     */
    public function setInfo($info)
    {
        $this->setAttribute('info', $info);
    }

    /**
     * Returns info message.
     *
     * @return string The info text
     */
    public function getInfo()
    {
        return $this->getAttribute('info');
    }

    /**
     * Sets the example configuration for this node.
     *
     * @param string|array $example
     */
    public function setExample($example)
    {
        $this->setAttribute('example', $example);
    }

    /**
     * Retrieves the example configuration for this node.
     *
     * @return string|array The example
     */
    public function getExample()
    {
        return $this->getAttribute('example');
    }

    /**
     * Adds an equivalent value.
     *
     * @param mixed $originalValue
     * @param mixed $equivalentValue
     */
    public function addEquivalentValue($originalValue, $equivalentValue)
    {
        $this->equivalentValues[] = array($originalValue, $equivalentValue);
    }

    /**
     * Set this node as required.
     *
     * @param Boolean $boolean Required node
     */
    public function setRequired($boolean)
    {
        $this->required = (Boolean) $boolean;
    }

    /**
     * Sets if this node can be overridden.
     *
     * @param Boolean $allow
     */
    public function setAllowOverwrite($allow)
    {
        $this->allowOverwrite = (Boolean) $allow;
    }

    /**
     * Sets the closures used for normalization.
     *
     * @param \Closure[] $closures An array of Closures used for normalization
     */
    public function setNormalizationClosures(array $closures)
    {
        $this->normalizationClosures = $closures;
    }

    /**
     * Sets the closures used for final validation.
     *
     * @param \Closure[] $closures An array of Closures used for final validation
     */
    public function setFinalValidationClosures(array $closures)
    {
        $this->finalValidationClosures = $closures;
    }

    /**
     * Checks if this node is required.
     *
     * @return Boolean
     */
    public function isRequired()
    {
        return $this->required;
    }

    /**
     * Returns the name of this node
     *
     * @return string The Node's name.
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Retrieves the path of this node.
     *
     * @return string The Node's path
     */
    public function getPath()
    {
        $path = $this->name;

        if (null !== $this->parent) {
            $path = $this->parent->getPath().'.'.$path;
        }

        return $path;
    }

    /**
     * Merges two values together.
     *
     * @param mixed $leftSide
     * @param mixed $rightSide
     *
     * @return mixed The merged value
     *
     * @throws ForbiddenOverwriteException
     */
    final public function merge($leftSide, $rightSide)
    {
        if (!$this->allowOverwrite) {
            throw new ForbiddenOverwriteException(sprintf(
                'Configuration path "%s" cannot be overwritten. You have to '
               .'define all options for this path, and any of its sub-paths in '
               .'one configuration section.',
                $this->getPath()
            ));
        }

        $this->validateType($leftSide);
        $this->validateType($rightSide);

        return $this->mergeValues($leftSide, $rightSide);
    }

    /**
     * Normalizes a value, applying all normalization closures.
     *
     * @param mixed $value Value to normalize.
     *
     * @return mixed The normalized value.
     */
    final public function normalize($value)
    {
        $value = $this->preNormalize($value);

        // run custom normalization closures
        foreach ($this->normalizationClosures as $closure) {
            $value = $closure($value);
        }

        // replace value with their equivalent
        foreach ($this->equivalentValues as $data) {
            if ($data[0] === $value) {
                $value = $data[1];
            }
        }

        // validate type
        $this->validateType($value);

        // normalize value
        return $this->normalizeValue($value);
    }

    /**
     * Normalizes the value before any other normalization is applied.
     *
     * @param $value
     *
     * @return $value The normalized array value
     */
    protected function preNormalize($value)
    {
        return $value;
    }

    /**
     * Returns parent node for this node.
     *
     * @return NodeInterface|null
     */
    public function getParent()
    {
        return $this->parent;
    }

    /**
     * Finalizes a value, applying all finalization closures.
     *
     * @param mixed $value The value to finalize
     *
     * @return mixed The finalized value
     *
     * @throws InvalidConfigurationException
     */
    final public function finalize($value)
    {
        $this->validateType($value);

        $value = $this->finalizeValue($value);

        // Perform validation on the final value if a closure has been set.
        // The closure is also allowed to return another value.
        foreach ($this->finalValidationClosures as $closure) {
            try {
                $value = $closure($value);
            } catch (Exception $correctEx) {
                throw $correctEx;
            } catch (\Exception $invalid) {
                throw new InvalidConfigurationException(sprintf(
                    'Invalid configuration for path "%s": %s',
                    $this->getPath(),
                    $invalid->getMessage()
                ), $invalid->getCode(), $invalid);
            }
        }

        return $value;
    }

    /**
     * Validates the type of a Node.
     *
     * @param mixed $value The value to validate
     *
     * @throws InvalidTypeException when the value is invalid
     */
    abstract protected function validateType($value);

    /**
     * Normalizes the value.
     *
     * @param mixed $value The value to normalize.
     *
     * @return mixed The normalized value
     */
    abstract protected function normalizeValue($value);

    /**
     * Merges two values together.
     *
     * @param mixed $leftSide
     * @param mixed $rightSide
     *
     * @return mixed The merged value
     */
    abstract protected function mergeValues($leftSide, $rightSide);

    /**
     * Finalizes a value.
     *
     * @param mixed $value The value to finalize
     *
     * @return mixed The finalized value
     */
    abstract protected function finalizeValue($value);
}
PK�`�\$�¸	�	9pear/Symfony/Component/Config/Definition/VariableNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;

/**
 * This node represents a value of variable type in the config tree.
 *
 * This node is intended for values of arbitrary type.
 * Any PHP type is accepted as a value.
 *
 * @author Jeremy Mikola <jmikola@gmail.com>
 */
class VariableNode extends BaseNode implements PrototypeNodeInterface
{
    protected $defaultValueSet = false;
    protected $defaultValue;
    protected $allowEmptyValue = true;

    /**
     * {@inheritDoc}
     */
    public function setDefaultValue($value)
    {
        $this->defaultValueSet = true;
        $this->defaultValue = $value;
    }

    /**
     * {@inheritDoc}
     */
    public function hasDefaultValue()
    {
        return $this->defaultValueSet;
    }

    /**
     * {@inheritDoc}
     */
    public function getDefaultValue()
    {
        return $this->defaultValue instanceof \Closure ? call_user_func($this->defaultValue) : $this->defaultValue;
    }

    /**
     * Sets if this node is allowed to have an empty value.
     *
     * @param Boolean $boolean True if this entity will accept empty values.
     */
    public function setAllowEmptyValue($boolean)
    {
        $this->allowEmptyValue = (Boolean) $boolean;
    }

    /**
     * {@inheritDoc}
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * {@inheritDoc}
     */
    protected function validateType($value)
    {
    }

    /**
     * {@inheritDoc}
     */
    protected function finalizeValue($value)
    {
        if (!$this->allowEmptyValue && empty($value)) {
            $ex = new InvalidConfigurationException(sprintf(
                'The path "%s" cannot contain an empty value, but got %s.',
                $this->getPath(),
                json_encode($value)
            ));
            $ex->setPath($this->getPath());

            throw $ex;
        }

        return $value;
    }

    /**
     * {@inheritDoc}
     */
    protected function normalizeValue($value)
    {
        return $value;
    }

    /**
     * {@inheritDoc}
     */
    protected function mergeValues($leftSide, $rightSide)
    {
        return $rightSide;
    }
}
PK�`�\fJ���:pear/Symfony/Component/Config/Definition/NodeInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

/**
 * Common Interface among all nodes.
 *
 * In most cases, it is better to inherit from BaseNode instead of implementing
 * this interface yourself.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface NodeInterface
{
    /**
     * Returns the name of the node.
     *
     * @return string The name of the node
     */
    public function getName();

    /**
     * Returns the path of the node.
     *
     * @return string The node path
     */
    public function getPath();

    /**
     * Returns true when the node is required.
     *
     * @return Boolean If the node is required
     */
    public function isRequired();

    /**
     * Returns true when the node has a default value.
     *
     * @return Boolean If the node has a default value
     */
    public function hasDefaultValue();

    /**
     * Returns the default value of the node.
     *
     * @return mixed The default value
     * @throws \RuntimeException if the node has no default value
     */
    public function getDefaultValue();

    /**
     * Normalizes the supplied value.
     *
     * @param mixed $value The value to normalize
     *
     * @return mixed The normalized value
     */
    public function normalize($value);

    /**
     * Merges two values together.
     *
     * @param mixed $leftSide
     * @param mixed $rightSide
     *
     * @return mixed The merged values
     */
    public function merge($leftSide, $rightSide);

    /**
     * Finalizes a value.
     *
     * @param mixed $value The value to finalize
     *
     * @return mixed The finalized value
     */
    public function finalize($value);
}
PK�`�\m�+��6pear/Symfony/Component/Config/Definition/FloatNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidTypeException;

/**
 * This node represents a float value in the config tree.
 *
 * @author Jeanmonod David <david.jeanmonod@gmail.com>
 */
class FloatNode extends NumericNode
{
    /**
     * {@inheritDoc}
     */
    protected function validateType($value)
    {
        // Integers are also accepted, we just cast them
        if (is_int($value)) {
            $value = (float) $value;
        }

        if (!is_float($value)) {
            $ex = new InvalidTypeException(sprintf('Invalid type for path "%s". Expected float, but got %s.', $this->getPath(), gettype($value)));
            $ex->setPath($this->getPath());

            throw $ex;
        }
    }
}
PK�`�\a�Vp5pear/Symfony/Component/Config/Definition/EnumNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Definition;

use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;

/**
 * Node which only allows a finite set of values.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class EnumNode extends ScalarNode
{
    private $values;

    public function __construct($name, NodeInterface $parent = null, array $values = array())
    {
        $values = array_unique($values);
        if (count($values) <= 1) {
            throw new \InvalidArgumentException('$values must contain at least two distinct elements.');
        }

        parent::__construct($name, $parent);
        $this->values = $values;
    }

    public function getValues()
    {
        return $this->values;
    }

    protected function finalizeValue($value)
    {
        $value = parent::finalizeValue($value);

        if (!in_array($value, $this->values, true)) {
            $ex = new InvalidConfigurationException(sprintf(
                'The value %s is not allowed for path "%s". Permissible values: %s',
                json_encode($value),
                $this->getPath(),
                implode(', ', array_map('json_encode', $this->values))));
            $ex->setPath($this->getPath());

            throw $ex;
        }

        return $value;
    }
}
PK�`�\I��-pear/Symfony/Component/Config/FileLocator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config;

/**
 * FileLocator uses an array of pre-defined paths to find files.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FileLocator implements FileLocatorInterface
{
    protected $paths;

    /**
     * Constructor.
     *
     * @param string|array $paths A path or an array of paths where to look for resources
     */
    public function __construct($paths = array())
    {
        $this->paths = (array) $paths;
    }

    /**
     * Returns a full path for a given file name.
     *
     * @param mixed   $name        The file name to locate
     * @param string  $currentPath The current path
     * @param Boolean $first       Whether to return the first occurrence or an array of filenames
     *
     * @return string|array The full path to the file|An array of file paths
     *
     * @throws \InvalidArgumentException When file is not found
     */
    public function locate($name, $currentPath = null, $first = true)
    {
        if ($this->isAbsolutePath($name)) {
            if (!file_exists($name)) {
                throw new \InvalidArgumentException(sprintf('The file "%s" does not exist.', $name));
            }

            return $name;
        }

        $filepaths = array();
        if (null !== $currentPath && file_exists($file = $currentPath.DIRECTORY_SEPARATOR.$name)) {
            if (true === $first) {
                return $file;
            }
            $filepaths[] = $file;
        }

        foreach ($this->paths as $path) {
            if (file_exists($file = $path.DIRECTORY_SEPARATOR.$name)) {
                if (true === $first) {
                    return $file;
                }
                $filepaths[] = $file;
            }
        }

        if (!$filepaths) {
            throw new \InvalidArgumentException(sprintf('The file "%s" does not exist (in: %s%s).', $name, null !== $currentPath ? $currentPath.', ' : '', implode(', ', $this->paths)));
        }

        return array_values(array_unique($filepaths));
    }

    /**
     * Returns whether the file path is an absolute path.
     *
     * @param string $file A file path
     *
     * @return Boolean
     */
    private function isAbsolutePath($file)
    {
        if ($file[0] == '/' || $file[0] == '\\'
            || (strlen($file) > 3 && ctype_alpha($file[0])
                && $file[1] == ':'
                && ($file[2] == '\\' || $file[2] == '/')
            )
            || null !== parse_url($file, PHP_URL_SCHEME)
        ) {
            return true;
        }

        return false;
    }
}
PK�`�\`�PP,pear/Symfony/Component/Config/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Config\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�`�\�=���/pear/Symfony/Component/Config/Loader/Loader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Loader;

use Symfony\Component\Config\Exception\FileLoaderLoadException;

/**
 * Loader is the abstract class used by all built-in loaders.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Loader implements LoaderInterface
{
    protected $resolver;

    /**
     * Gets the loader resolver.
     *
     * @return LoaderResolverInterface A LoaderResolverInterface instance
     */
    public function getResolver()
    {
        return $this->resolver;
    }

    /**
     * Sets the loader resolver.
     *
     * @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
     */
    public function setResolver(LoaderResolverInterface $resolver)
    {
        $this->resolver = $resolver;
    }

    /**
     * Imports a resource.
     *
     * @param mixed  $resource A Resource
     * @param string $type     The resource type
     *
     * @return mixed
     */
    public function import($resource, $type = null)
    {
        return $this->resolve($resource, $type)->load($resource, $type);
    }

    /**
     * Finds a loader able to load an imported resource.
     *
     * @param mixed  $resource A Resource
     * @param string $type     The resource type
     *
     * @return LoaderInterface A LoaderInterface instance
     *
     * @throws FileLoaderLoadException if no loader is found
     */
    public function resolve($resource, $type = null)
    {
        if ($this->supports($resource, $type)) {
            return $this;
        }

        $loader = null === $this->resolver ? false : $this->resolver->resolve($resource, $type);

        if (false === $loader) {
            throw new FileLoaderLoadException($resource);
        }

        return $loader;
    }
}
PK�`�\���))9pear/Symfony/Component/Config/Loader/DelegatingLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Loader;

use Symfony\Component\Config\Exception\FileLoaderLoadException;

/**
 * DelegatingLoader delegates loading to other loaders using a loader resolver.
 *
 * This loader acts as an array of LoaderInterface objects - each having
 * a chance to load a given resource (handled by the resolver)
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DelegatingLoader extends Loader
{
    /**
     * Constructor.
     *
     * @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
     */
    public function __construct(LoaderResolverInterface $resolver)
    {
        $this->resolver = $resolver;
    }

    /**
     * Loads a resource.
     *
     * @param mixed  $resource A resource
     * @param string $type     The resource type
     *
     * @return mixed
     *
     * @throws FileLoaderLoadException if no loader is found.
     */
    public function load($resource, $type = null)
    {
        if (false === $loader = $this->resolver->resolve($resource, $type)) {
            throw new FileLoaderLoadException($resource);
        }

        return $loader->load($resource, $type);
    }

    /**
     * {@inheritdoc}
     */
    public function supports($resource, $type = null)
    {
        return false !== $this->resolver->resolve($resource, $type);
    }
}
PK�`�\���4998pear/Symfony/Component/Config/Loader/LoaderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Loader;

/**
 * LoaderInterface is the interface implemented by all loader classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface LoaderInterface
{
    /**
     * Loads a resource.
     *
     * @param mixed  $resource The resource
     * @param string $type     The resource type
     */
    public function load($resource, $type = null);

    /**
     * Returns true if this class supports the given resource.
     *
     * @param mixed  $resource A resource
     * @param string $type     The resource type
     *
     * @return Boolean true if this class supports the given resource, false otherwise
     */
    public function supports($resource, $type = null);

    /**
     * Gets the loader resolver.
     *
     * @return LoaderResolverInterface A LoaderResolverInterface instance
     */
    public function getResolver();

    /**
     * Sets the loader resolver.
     *
     * @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
     */
    public function setResolver(LoaderResolverInterface $resolver);

}
PK�`�\������@pear/Symfony/Component/Config/Loader/LoaderResolverInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Loader;

/**
 * LoaderResolverInterface selects a loader for a given resource.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface LoaderResolverInterface
{
    /**
     * Returns a loader able to load the resource.
     *
     * @param mixed  $resource A resource
     * @param string $type     The resource type
     *
     * @return LoaderInterface A LoaderInterface instance
     */
    public function resolve($resource, $type = null);
}
PK�`�\HPʉ�7pear/Symfony/Component/Config/Loader/LoaderResolver.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Loader;

/**
 * LoaderResolver selects a loader for a given resource.
 *
 * A resource can be anything (e.g. a full path to a config file or a Closure).
 * Each loader determines whether it can load a resource and how.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class LoaderResolver implements LoaderResolverInterface
{
    /**
     * @var LoaderInterface[] An array of LoaderInterface objects
     */
    private $loaders = array();

    /**
     * Constructor.
     *
     * @param LoaderInterface[] $loaders An array of loaders
     */
    public function __construct(array $loaders = array())
    {
        foreach ($loaders as $loader) {
            $this->addLoader($loader);
        }
    }

    /**
     * Returns a loader able to load the resource.
     *
     * @param mixed  $resource A resource
     * @param string $type     The resource type
     *
     * @return LoaderInterface|false A LoaderInterface instance
     */
    public function resolve($resource, $type = null)
    {
        foreach ($this->loaders as $loader) {
            if ($loader->supports($resource, $type)) {
                return $loader;
            }
        }

        return false;
    }

    /**
     * Adds a loader.
     *
     * @param LoaderInterface $loader A LoaderInterface instance
     */
    public function addLoader(LoaderInterface $loader)
    {
        $this->loaders[] = $loader;
        $loader->setResolver($this);
    }

    /**
     * Returns the registered loaders.
     *
     * @return LoaderInterface[] An array of LoaderInterface instances
     */
    public function getLoaders()
    {
        return $this->loaders;
    }
}
PK�`�\__wP<
<
3pear/Symfony/Component/Config/Loader/FileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Loader;

use Symfony\Component\Config\FileLocatorInterface;
use Symfony\Component\Config\Exception\FileLoaderLoadException;
use Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceException;

/**
 * FileLoader is the abstract class used by all built-in loaders that are file based.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class FileLoader extends Loader
{
    protected static $loading = array();

    protected $locator;

    private $currentDir;

    /**
     * Constructor.
     *
     * @param FileLocatorInterface $locator A FileLocatorInterface instance
     */
    public function __construct(FileLocatorInterface $locator)
    {
        $this->locator = $locator;
    }

    public function setCurrentDir($dir)
    {
        $this->currentDir = $dir;
    }

    public function getLocator()
    {
        return $this->locator;
    }

    /**
     * Imports a resource.
     *
     * @param mixed   $resource       A Resource
     * @param string  $type           The resource type
     * @param Boolean $ignoreErrors   Whether to ignore import errors or not
     * @param string  $sourceResource The original resource importing the new resource
     *
     * @return mixed
     *
     * @throws FileLoaderLoadException
     * @throws FileLoaderImportCircularReferenceException
     */
    public function import($resource, $type = null, $ignoreErrors = false, $sourceResource = null)
    {
        try {
            $loader = $this->resolve($resource, $type);

            if ($loader instanceof FileLoader && null !== $this->currentDir) {
                // we fallback to the current locator to keep BC
                // as some some loaders do not call the parent __construct()
                // @deprecated should be removed in 3.0
                $locator = $loader->getLocator() ?: $this->locator;
                $resource = $locator->locate($resource, $this->currentDir, false);
            }

            $resources = is_array($resource) ? $resource : array($resource);
            for ($i = 0; $i < $resourcesCount = count($resources); $i++ ) {
                if (isset(self::$loading[$resources[$i]])) {
                    if ($i == $resourcesCount-1) {
                        throw new FileLoaderImportCircularReferenceException(array_keys(self::$loading));
                    }
                } else {
                    $resource = $resources[$i];
                    break;
                }
            }
            self::$loading[$resource] = true;

            $ret = $loader->load($resource, $type);

            unset(self::$loading[$resource]);

            return $ret;
        } catch (FileLoaderImportCircularReferenceException $e) {
            throw $e;
        } catch (\Exception $e) {
            if (!$ignoreErrors) {
                // prevent embedded imports from nesting multiple exceptions
                if ($e instanceof FileLoaderLoadException) {
                    throw $e;
                }

                throw new FileLoaderLoadException($resource, $sourceResource, null, $e);
            }
        }
    }
}
PK�`�\7�TTVpear/Symfony/Component/Config/Exception/FileLoaderImportCircularReferenceException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Exception;

/**
 * Exception class for when a circular reference is detected when importing resources.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FileLoaderImportCircularReferenceException extends FileLoaderLoadException
{
    public function __construct(array $resources, $code = null, $previous = null)
    {
        $message = sprintf('Circular reference detected in "%s" ("%s" > "%s").', $this->varToString($resources[0]), implode('" > "', $resources), $resources[0]);

        call_user_func('Exception::__construct', $message, $code, $previous);
    }
}
PK�`�\��W�	�	Cpear/Symfony/Component/Config/Exception/FileLoaderLoadException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Exception;

/**
 * Exception class for when a resource cannot be loaded or imported.
 *
 * @author Ryan Weaver <ryan@thatsquality.com>
 */
class FileLoaderLoadException extends \Exception
{
    /**
     * @param string     $resource       The resource that could not be imported
     * @param string     $sourceResource The original resource importing the new resource
     * @param integer    $code           The error code
     * @param \Exception $previous       A previous exception
     */
    public function __construct($resource, $sourceResource = null, $code = null, $previous = null)
    {
        if (null === $sourceResource) {
            $message = sprintf('Cannot load resource "%s".', $this->varToString($resource));
        } else {
            $message = sprintf('Cannot import resource "%s" from "%s".', $this->varToString($resource), $this->varToString($sourceResource));
        }

        // Is the resource located inside a bundle?
        if ('@' === $resource[0]) {
            $parts = explode(DIRECTORY_SEPARATOR, $resource);
            $bundle = substr($parts[0], 1);
            $message .= ' '.sprintf('Make sure the "%s" bundle is correctly registered and loaded in the application kernel class.', $bundle);
        } elseif ($previous) {
            // include the previous exception, to help the user see what might be the underlying cause
            $message .= ' '.sprintf('(%s)', $previous->getMessage());
        }

        parent::__construct($message, $code, $previous);
    }

    protected function varToString($var)
    {
        if (is_object($var)) {
            return sprintf('Object(%s)', get_class($var));
        }

        if (is_array($var)) {
            $a = array();
            foreach ($var as $k => $v) {
                $a[] = sprintf('%s => %s', $k, $this->varToString($v));
            }

            return sprintf("Array(%s)", implode(', ', $a));
        }

        if (is_resource($var)) {
            return sprintf('Resource(%s)', get_resource_type($var));
        }

        if (null === $var) {
            return 'null';
        }

        if (false === $var) {
            return 'false';
        }

        if (true === $var) {
            return 'true';
        }

        return (string) $var;
    }
}
PK�`�\��:a�
�
-pear/Symfony/Component/Config/ConfigCache.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config;

use Symfony\Component\Config\Resource\ResourceInterface;
use Symfony\Component\Filesystem\Filesystem;

/**
 * ConfigCache manages PHP cache files.
 *
 * When debug is enabled, it knows when to flush the cache
 * thanks to an array of ResourceInterface instances.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ConfigCache
{
    private $debug;
    private $file;

    /**
     * Constructor.
     *
     * @param string  $file  The absolute cache path
     * @param Boolean $debug Whether debugging is enabled or not
     */
    public function __construct($file, $debug)
    {
        $this->file = $file;
        $this->debug = (Boolean) $debug;
    }

    /**
     * Gets the cache file path.
     *
     * @return string The cache file path
     */
    public function __toString()
    {
        return $this->file;
    }

    /**
     * Checks if the cache is still fresh.
     *
     * This method always returns true when debug is off and the
     * cache file exists.
     *
     * @return Boolean true if the cache is fresh, false otherwise
     */
    public function isFresh()
    {
        if (!is_file($this->file)) {
            return false;
        }

        if (!$this->debug) {
            return true;
        }

        $metadata = $this->getMetaFile();
        if (!is_file($metadata)) {
            return false;
        }

        $time = filemtime($this->file);
        $meta = unserialize(file_get_contents($metadata));
        foreach ($meta as $resource) {
            if (!$resource->isFresh($time)) {
                return false;
            }
        }

        return true;
    }

    /**
     * Writes cache.
     *
     * @param string              $content  The content to write in the cache
     * @param ResourceInterface[] $metadata An array of ResourceInterface instances
     *
     * @throws \RuntimeException When cache file can't be wrote
     */
    public function write($content, array $metadata = null)
    {
        $mode = 0666 & ~umask();
        $filesystem = new Filesystem();
        $filesystem->dumpFile($this->file, $content, null);
        @chmod($this->file, $mode);

        if (null !== $metadata && true === $this->debug) {
            $filesystem->dumpFile($this->getMetaFile(), serialize($metadata), null);
            @chmod($this->getMetaFile(), $mode);
        }
    }

    /**
     * Gets the meta file path.
     *
     * @return string The meta file path
     */
    private function getMetaFile()
    {
        return $this->file.'.meta';
    }

}
PK�`�\�C3kll6pear/Symfony/Component/Config/FileLocatorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config;

/**
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface FileLocatorInterface
{
    /**
     * Returns a full path for a given file name.
     *
     * @param mixed   $name        The file name to locate
     * @param string  $currentPath The current path
     * @param Boolean $first       Whether to return the first occurrence or an array of filenames
     *
     * @return string|array The full path to the file|An array of file paths
     *
     * @throws \InvalidArgumentException When file is not found
     */
    public function locate($name, $currentPath = null, $first = true);
}
PK�`�\��G��Cpear/Symfony/Component/OptionsResolver/OptionsResolverInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\OptionsResolver;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface OptionsResolverInterface
{
    /**
     * Sets default option values.
     *
     * The options can either be values of any types or closures that
     * evaluate the option value lazily. These closures must have one
     * of the following signatures:
     *
     * <code>
     * function (Options $options)
     * function (Options $options, $value)
     * </code>
     *
     * The second parameter passed to the closure is the previously
     * set default value, in case you are overwriting an existing
     * default value.
     *
     * The closures should return the lazily created option value.
     *
     * @param array $defaultValues A list of option names as keys and default
     *                             values or closures as values.
     *
     * @return OptionsResolverInterface The resolver instance.
     */
    public function setDefaults(array $defaultValues);

    /**
     * Replaces default option values.
     *
     * Old defaults are erased, which means that closures passed here cannot
     * access the previous default value. This may be useful to improve
     * performance if the previous default value is calculated by an expensive
     * closure.
     *
     * @param array $defaultValues A list of option names as keys and default
     *                             values or closures as values.
     *
     * @return OptionsResolverInterface The resolver instance.
     */
    public function replaceDefaults(array $defaultValues);

    /**
     * Sets optional options.
     *
     * This method declares valid option names without setting default values for them.
     * If these options are not passed to {@link resolve()} and no default has been set
     * for them, they will be missing in the final options array. This can be helpful
     * if you want to determine whether an option has been set or not because otherwise
     * {@link resolve()} would trigger an exception for unknown options.
     *
     * @param array $optionNames A list of option names.
     *
     * @return OptionsResolverInterface The resolver instance.
     *
     * @throws Exception\OptionDefinitionException When trying to pass default values.
     */
    public function setOptional(array $optionNames);

    /**
     * Sets required options.
     *
     * If these options are not passed to {@link resolve()} and no default has been set for
     * them, an exception will be thrown.
     *
     * @param array $optionNames A list of option names.
     *
     * @return OptionsResolverInterface The resolver instance.
     *
     * @throws Exception\OptionDefinitionException When trying to pass default values.
     */
    public function setRequired(array $optionNames);

    /**
     * Sets allowed values for a list of options.
     *
     * @param array $allowedValues A list of option names as keys and arrays
     *                             with values acceptable for that option as
     *                             values.
     *
     * @return OptionsResolverInterface The resolver instance.
     *
     * @throws Exception\InvalidOptionsException If an option has not been defined
     *                                 (see {@link isKnown()}) for which
     *                                 an allowed value is set.
     */
    public function setAllowedValues(array $allowedValues);

    /**
     * Adds allowed values for a list of options.
     *
     * The values are merged with the allowed values defined previously.
     *
     * @param array $allowedValues A list of option names as keys and arrays
     *                             with values acceptable for that option as
     *                             values.
     *
     * @return OptionsResolverInterface The resolver instance.
     *
     * @throws Exception\InvalidOptionsException If an option has not been defined
     *                                 (see {@link isKnown()}) for which
     *                                 an allowed value is set.
     */
    public function addAllowedValues(array $allowedValues);

    /**
     * Sets allowed types for a list of options.
     *
     * @param array $allowedTypes A list of option names as keys and type
     *                            names passed as string or array as values.
     *
     * @return OptionsResolverInterface The resolver instance.
     *
     * @throws Exception\InvalidOptionsException If an option has not been defined for
     *                                           which an allowed type is set.
     */
    public function setAllowedTypes(array $allowedTypes);

    /**
     * Adds allowed types for a list of options.
     *
     * The types are merged with the allowed types defined previously.
     *
     * @param array $allowedTypes A list of option names as keys and type
     *                            names passed as string or array as values.
     *
     * @return OptionsResolverInterface The resolver instance.
     *
     * @throws Exception\InvalidOptionsException If an option has not been defined for
     *                                           which an allowed type is set.
     */
    public function addAllowedTypes(array $allowedTypes);

    /**
     * Sets normalizers that are applied on resolved options.
     *
     * The normalizers should be closures with the following signature:
     *
     * <code>
     * function (Options $options, $value)
     * </code>
     *
     * The second parameter passed to the closure is the value of
     * the option.
     *
     * The closure should return the normalized value.
     *
     * @param array $normalizers An array of closures.
     *
     * @return OptionsResolverInterface The resolver instance.
     */
    public function setNormalizers(array $normalizers);

    /**
     * Returns whether an option is known.
     *
     * An option is known if it has been passed to either {@link setDefaults()},
     * {@link setRequired()} or {@link setOptional()} before.
     *
     * @param string $option The name of the option.
     *
     * @return Boolean Whether the option is known.
     */
    public function isKnown($option);

    /**
     * Returns whether an option is required.
     *
     * An option is required if it has been passed to {@link setRequired()},
     * but not to {@link setDefaults()}. That is, the option has been declared
     * as required and no default value has been set.
     *
     * @param string $option The name of the option.
     *
     * @return Boolean Whether the option is required.
     */
    public function isRequired($option);

    /**
     * Returns the combination of the default and the passed options.
     *
     * @param array $options The custom option values.
     *
     * @return array A list of options and their values.
     *
     * @throws Exception\InvalidOptionsException   If any of the passed options has not
     *                                             been defined or does not contain an
     *                                             allowed value.
     * @throws Exception\MissingOptionsException   If a required option is missing.
     * @throws Exception\OptionDefinitionException If a cyclic dependency is detected
     *                                             between two lazy options.
     */
    public function resolve(array $options = array());
}
PK�`�\}���8%8%:pear/Symfony/Component/OptionsResolver/OptionsResolver.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\OptionsResolver;

use Symfony\Component\OptionsResolver\Exception\OptionDefinitionException;
use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
use Symfony\Component\OptionsResolver\Exception\MissingOptionsException;

/**
 * Helper for merging default and concrete option values.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Tobias Schultze <http://tobion.de>
 */
class OptionsResolver implements OptionsResolverInterface
{
    /**
     * The default option values.
     * @var Options
     */
    private $defaultOptions;

    /**
     * The options known by the resolver.
     * @var array
     */
    private $knownOptions = array();

    /**
     * The options without defaults that are required to be passed to resolve().
     * @var array
     */
    private $requiredOptions = array();

    /**
     * A list of accepted values for each option.
     * @var array
     */
    private $allowedValues = array();

    /**
     * A list of accepted types for each option.
     * @var array
     */
    private $allowedTypes = array();

    /**
     * Creates a new instance.
     */
    public function __construct()
    {
        $this->defaultOptions = new Options();
    }

    /**
     * Clones the resolver.
     */
    public function __clone()
    {
        $this->defaultOptions = clone $this->defaultOptions;
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaults(array $defaultValues)
    {
        foreach ($defaultValues as $option => $value) {
            $this->defaultOptions->overload($option, $value);
            $this->knownOptions[$option] = true;
            unset($this->requiredOptions[$option]);
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function replaceDefaults(array $defaultValues)
    {
        foreach ($defaultValues as $option => $value) {
            $this->defaultOptions->set($option, $value);
            $this->knownOptions[$option] = true;
            unset($this->requiredOptions[$option]);
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setOptional(array $optionNames)
    {
        foreach ($optionNames as $key => $option) {
            if (!is_int($key)) {
                throw new OptionDefinitionException('You should not pass default values to setOptional()');
            }

            $this->knownOptions[$option] = true;
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setRequired(array $optionNames)
    {
        foreach ($optionNames as $key => $option) {
            if (!is_int($key)) {
                throw new OptionDefinitionException('You should not pass default values to setRequired()');
            }

            $this->knownOptions[$option] = true;
            // set as required if no default has been set already
            if (!isset($this->defaultOptions[$option])) {
                $this->requiredOptions[$option] = true;
            }
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setAllowedValues(array $allowedValues)
    {
        $this->validateOptionsExistence($allowedValues);

        $this->allowedValues = array_replace($this->allowedValues, $allowedValues);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addAllowedValues(array $allowedValues)
    {
        $this->validateOptionsExistence($allowedValues);

        $this->allowedValues = array_merge_recursive($this->allowedValues, $allowedValues);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setAllowedTypes(array $allowedTypes)
    {
        $this->validateOptionsExistence($allowedTypes);

        $this->allowedTypes = array_replace($this->allowedTypes, $allowedTypes);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addAllowedTypes(array $allowedTypes)
    {
        $this->validateOptionsExistence($allowedTypes);

        $this->allowedTypes = array_merge_recursive($this->allowedTypes, $allowedTypes);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setNormalizers(array $normalizers)
    {
        $this->validateOptionsExistence($normalizers);

        foreach ($normalizers as $option => $normalizer) {
            $this->defaultOptions->setNormalizer($option, $normalizer);
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function isKnown($option)
    {
        return isset($this->knownOptions[$option]);
    }

    /**
     * {@inheritdoc}
     */
    public function isRequired($option)
    {
        return isset($this->requiredOptions[$option]);
    }

    /**
     * {@inheritdoc}
     */
    public function resolve(array $options = array())
    {
        $this->validateOptionsExistence($options);
        $this->validateOptionsCompleteness($options);

        // Make sure this method can be called multiple times
        $combinedOptions = clone $this->defaultOptions;

        // Override options set by the user
        foreach ($options as $option => $value) {
            $combinedOptions->set($option, $value);
        }

        // Resolve options
        $resolvedOptions = $combinedOptions->all();

        $this->validateOptionValues($resolvedOptions);
        $this->validateOptionTypes($resolvedOptions);

        return $resolvedOptions;
    }

    /**
     * Validates that the given option names exist and throws an exception
     * otherwise.
     *
     * @param array $options An list of option names as keys.
     *
     * @throws InvalidOptionsException If any of the options has not been defined.
     */
    private function validateOptionsExistence(array $options)
    {
        $diff = array_diff_key($options, $this->knownOptions);

        if (count($diff) > 0) {
            ksort($this->knownOptions);
            ksort($diff);

            throw new InvalidOptionsException(sprintf(
                (count($diff) > 1 ? 'The options "%s" do not exist.' : 'The option "%s" does not exist.').' Known options are: "%s"',
                implode('", "', array_keys($diff)),
                implode('", "', array_keys($this->knownOptions))
            ));
        }
    }

    /**
     * Validates that all required options are given and throws an exception
     * otherwise.
     *
     * @param array $options An list of option names as keys.
     *
     * @throws MissingOptionsException If a required option is missing.
     */
    private function validateOptionsCompleteness(array $options)
    {
        $diff = array_diff_key($this->requiredOptions, $options);

        if (count($diff) > 0) {
            ksort($diff);

            throw new MissingOptionsException(sprintf(
                count($diff) > 1 ? 'The required options "%s" are missing.' : 'The required option "%s" is missing.',
                implode('", "', array_keys($diff))
            ));
        }
    }

    /**
     * Validates that the given option values match the allowed values and
     * throws an exception otherwise.
     *
     * @param array $options A list of option values.
     *
     * @throws InvalidOptionsException If any of the values does not match the
     *                                 allowed values of the option.
     */
    private function validateOptionValues(array $options)
    {
        foreach ($this->allowedValues as $option => $allowedValues) {
            if (isset($options[$option]) && !in_array($options[$option], $allowedValues, true)) {
                throw new InvalidOptionsException(sprintf('The option "%s" has the value "%s", but is expected to be one of "%s"', $option, $options[$option], implode('", "', $allowedValues)));
            }
        }
    }

    /**
     * Validates that the given options match the allowed types and
     * throws an exception otherwise.
     *
     * @param array $options A list of options.
     *
     * @throws InvalidOptionsException If any of the types does not match the
     *                                 allowed types of the option.
     */
    private function validateOptionTypes(array $options)
    {
        foreach ($this->allowedTypes as $option => $allowedTypes) {
            if (!array_key_exists($option, $options)) {
                continue;
            }

            $value = $options[$option];
            $allowedTypes = (array) $allowedTypes;

            foreach ($allowedTypes as $type) {
                $isFunction = 'is_'.$type;

                if (function_exists($isFunction) && $isFunction($value)) {
                    continue 2;
                } elseif ($value instanceof $type) {
                    continue 2;
                }
            }

            $printableValue = is_object($value)
                ? get_class($value)
                : (is_array($value)
                    ? 'Array'
                    : (string) $value);

            throw new InvalidOptionsException(sprintf(
                'The option "%s" with value "%s" is expected to be of type "%s"',
                $option,
                $printableValue,
                implode('", "', $allowedTypes)
            ));
        }
    }
}
PK�`�\^�R��<�<2pear/Symfony/Component/OptionsResolver/Options.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\OptionsResolver;

use Symfony\Component\OptionsResolver\Exception\OptionDefinitionException;

/**
 * Container for resolving inter-dependent options.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class Options implements \ArrayAccess, \Iterator, \Countable
{
    /**
     * A list of option values.
     * @var array
     */
    private $options = array();

    /**
     * A list of normalizer closures.
     * @var array
     */
    private $normalizers = array();

    /**
     * A list of closures for evaluating lazy options.
     * @var array
     */
    private $lazy = array();

    /**
     * A list containing the currently locked options.
     * @var array
     */
    private $lock = array();

    /**
     * Whether at least one option has already been read.
     *
     * Once read, the options cannot be changed anymore. This is
     * necessary in order to avoid inconsistencies during the resolving
     * process. If any option is changed after being read, all evaluated
     * lazy options that depend on this option would become invalid.
     *
     * @var Boolean
     */
    private $reading = false;

    /**
     * Sets the value of a given option.
     *
     * You can set lazy options by passing a closure with the following
     * signature:
     *
     * <code>
     * function (Options $options)
     * </code>
     *
     * This closure will be evaluated once the option is read using
     * {@link get()}. The closure has access to the resolved values of
     * other options through the passed {@link Options} instance.
     *
     * @param string $option The name of the option.
     * @param mixed  $value  The value of the option.
     *
     * @throws OptionDefinitionException If options have already been read.
     *                                   Once options are read, the container
     *                                   becomes immutable.
     */
    public function set($option, $value)
    {
        // Setting is not possible once an option is read, because then lazy
        // options could manipulate the state of the object, leading to
        // inconsistent results.
        if ($this->reading) {
            throw new OptionDefinitionException('Options cannot be set anymore once options have been read.');
        }

        // Setting is equivalent to overloading while discarding the previous
        // option value
        unset($this->options[$option]);
        unset($this->lazy[$option]);

        $this->overload($option, $value);
    }

    /**
     * Sets the normalizer for a given option.
     *
     * Normalizers should be closures with the following signature:
     *
     * <code>
     * function (Options $options, $value)
     * </code>
     *
     * This closure will be evaluated once the option is read using
     * {@link get()}. The closure has access to the resolved values of
     * other options through the passed {@link Options} instance.
     *
     * @param string   $option     The name of the option.
     * @param \Closure $normalizer The normalizer.
     *
     * @throws OptionDefinitionException If options have already been read.
     *                                   Once options are read, the container
     *                                   becomes immutable.
     */
    public function setNormalizer($option, \Closure $normalizer)
    {
        if ($this->reading) {
            throw new OptionDefinitionException('Normalizers cannot be added anymore once options have been read.');
        }

        $this->normalizers[$option] = $normalizer;
    }

    /**
     * Replaces the contents of the container with the given options.
     *
     * This method is a shortcut for {@link clear()} with subsequent
     * calls to {@link set()}.
     *
     * @param array $options The options to set.
     *
     * @throws OptionDefinitionException If options have already been read.
     *                                   Once options are read, the container
     *                                   becomes immutable.
     */
    public function replace(array $options)
    {
        if ($this->reading) {
            throw new OptionDefinitionException('Options cannot be replaced anymore once options have been read.');
        }

        $this->options = array();
        $this->lazy = array();
        $this->normalizers = array();

        foreach ($options as $option => $value) {
            $this->overload($option, $value);
        }
    }

    /**
     * Overloads the value of a given option.
     *
     * Contrary to {@link set()}, this method keeps the previous default
     * value of the option so that you can access it if you pass a closure.
     * Passed closures should have the following signature:
     *
     * <code>
     * function (Options $options, $value)
     * </code>
     *
     * The second parameter passed to the closure is the current default
     * value of the option.
     *
     * @param string $option The option name.
     * @param mixed  $value  The option value.
     *
     * @throws OptionDefinitionException If options have already been read.
     *                                   Once options are read, the container
     *                                   becomes immutable.
     */
    public function overload($option, $value)
    {
        if ($this->reading) {
            throw new OptionDefinitionException('Options cannot be overloaded anymore once options have been read.');
        }

        // If an option is a closure that should be evaluated lazily, store it
        // in the "lazy" property.
        if ($value instanceof \Closure) {
            $reflClosure = new \ReflectionFunction($value);
            $params = $reflClosure->getParameters();

            if (isset($params[0]) && null !== ($class = $params[0]->getClass()) && __CLASS__ === $class->name) {
                // Initialize the option if no previous value exists
                if (!isset($this->options[$option])) {
                    $this->options[$option] = null;
                }

                // Ignore previous lazy options if the closure has no second parameter
                if (!isset($this->lazy[$option]) || !isset($params[1])) {
                    $this->lazy[$option] = array();
                }

                // Store closure for later evaluation
                $this->lazy[$option][] = $value;

                return;
            }
        }

        // Remove lazy options by default
        unset($this->lazy[$option]);

        $this->options[$option] = $value;
    }

    /**
     * Returns the value of the given option.
     *
     * If the option was a lazy option, it is evaluated now.
     *
     * @param string $option The option name.
     *
     * @return mixed The option value.
     *
     * @throws \OutOfBoundsException     If the option does not exist.
     * @throws OptionDefinitionException If a cyclic dependency is detected
     *                                   between two lazy options.
     */
    public function get($option)
    {
        $this->reading = true;

        if (!array_key_exists($option, $this->options)) {
            throw new \OutOfBoundsException(sprintf('The option "%s" does not exist.', $option));
        }

        if (isset($this->lazy[$option])) {
            $this->resolve($option);
        }

        if (isset($this->normalizers[$option])) {
            $this->normalize($option);
        }

        return $this->options[$option];
    }

    /**
     * Returns whether the given option exists.
     *
     * @param string $option The option name.
     *
     * @return Boolean Whether the option exists.
     */
    public function has($option)
    {
        return array_key_exists($option, $this->options);
    }

    /**
     * Removes the option with the given name.
     *
     * @param string $option The option name.
     *
     * @throws OptionDefinitionException If options have already been read.
     *                                   Once options are read, the container
     *                                   becomes immutable.
     */
    public function remove($option)
    {
        if ($this->reading) {
            throw new OptionDefinitionException('Options cannot be removed anymore once options have been read.');
        }

        unset($this->options[$option]);
        unset($this->lazy[$option]);
        unset($this->normalizers[$option]);
    }

    /**
     * Removes all options.
     *
     * @throws OptionDefinitionException If options have already been read.
     *                                   Once options are read, the container
     *                                   becomes immutable.
     */
    public function clear()
    {
        if ($this->reading) {
            throw new OptionDefinitionException('Options cannot be cleared anymore once options have been read.');
        }

        $this->options = array();
        $this->lazy = array();
        $this->normalizers = array();
    }

    /**
     * Returns the values of all options.
     *
     * Lazy options are evaluated at this point.
     *
     * @return array The option values.
     */
    public function all()
    {
        $this->reading = true;

        // Performance-wise this is slightly better than
        // while (null !== $option = key($this->lazy))
        foreach ($this->lazy as $option => $closures) {
            // Double check, in case the option has already been resolved
            // by cascade in the previous cycles
            if (isset($this->lazy[$option])) {
                $this->resolve($option);
            }
        }

        foreach ($this->normalizers as $option => $normalizer) {
            if (isset($this->normalizers[$option])) {
                $this->normalize($option);
            }
        }

        return $this->options;
    }

    /**
     * Equivalent to {@link has()}.
     *
     * @param string $option The option name.
     *
     * @return Boolean Whether the option exists.
     *
     * @see \ArrayAccess::offsetExists()
     */
    public function offsetExists($option)
    {
        return $this->has($option);
    }

    /**
     * Equivalent to {@link get()}.
     *
     * @param string $option The option name.
     *
     * @return mixed The option value.
     *
     * @throws \OutOfBoundsException     If the option does not exist.
     * @throws OptionDefinitionException If a cyclic dependency is detected
     *                                   between two lazy options.
     *
     * @see \ArrayAccess::offsetGet()
     */
    public function offsetGet($option)
    {
        return $this->get($option);
    }

    /**
     * Equivalent to {@link set()}.
     *
     * @param string $option The name of the option.
     * @param mixed  $value  The value of the option. May be a closure with a
     *                       signature as defined in DefaultOptions::add().
     *
     * @throws OptionDefinitionException If options have already been read.
     *                                   Once options are read, the container
     *                                   becomes immutable.
     *
     * @see \ArrayAccess::offsetSet()
     */
    public function offsetSet($option, $value)
    {
        $this->set($option, $value);
    }

    /**
     * Equivalent to {@link remove()}.
     *
     * @param string $option The option name.
     *
     * @throws OptionDefinitionException If options have already been read.
     *                                   Once options are read, the container
     *                                   becomes immutable.
     *
     * @see \ArrayAccess::offsetUnset()
     */
    public function offsetUnset($option)
    {
        $this->remove($option);
    }

    /**
     * {@inheritdoc}
     */
    public function current()
    {
        return $this->get($this->key());
    }

    /**
     * {@inheritdoc}
     */
    public function next()
    {
        next($this->options);
    }

    /**
     * {@inheritdoc}
     */
    public function key()
    {
        return key($this->options);
    }

    /**
     * {@inheritdoc}
     */
    public function valid()
    {
        return null !== $this->key();
    }

    /**
     * {@inheritdoc}
     */
    public function rewind()
    {
        reset($this->options);
    }

    /**
     * {@inheritdoc}
     */
    public function count()
    {
        return count($this->options);
    }

    /**
     * Evaluates the given lazy option.
     *
     * The evaluated value is written into the options array. The closure for
     * evaluating the option is discarded afterwards.
     *
     * @param string $option The option to evaluate.
     *
     * @throws OptionDefinitionException If the option has a cyclic dependency
     *                                   on another option.
     */
    private function resolve($option)
    {
        // The code duplication with normalize() exists for performance
        // reasons, in order to save a method call.
        // Remember that this method is potentially called a couple of thousand
        // times and needs to be as efficient as possible.
        if (isset($this->lock[$option])) {
            $conflicts = array();

            foreach ($this->lock as $option => $locked) {
                if ($locked) {
                    $conflicts[] = $option;
                }
            }

            throw new OptionDefinitionException(sprintf('The options "%s" have a cyclic dependency.', implode('", "', $conflicts)));
        }

        $this->lock[$option] = true;
        foreach ($this->lazy[$option] as $closure) {
            $this->options[$option] = $closure($this, $this->options[$option]);
        }
        unset($this->lock[$option]);

        // The option now isn't lazy anymore
        unset($this->lazy[$option]);
    }

    /**
     * Normalizes the given  option.
     *
     * The evaluated value is written into the options array.
     *
     * @param string $option The option to normalizer.
     *
     * @throws OptionDefinitionException If the option has a cyclic dependency
     *                                   on another option.
     */
    private function normalize($option)
    {
        // The code duplication with resolve() exists for performance
        // reasons, in order to save a method call.
        // Remember that this method is potentially called a couple of thousand
        // times and needs to be as efficient as possible.
        if (isset($this->lock[$option])) {
            $conflicts = array();

            foreach ($this->lock as $option => $locked) {
                if ($locked) {
                    $conflicts[] = $option;
                }
            }

            throw new OptionDefinitionException(sprintf('The options "%s" have a cyclic dependency.', implode('", "', $conflicts)));
        }

        /** @var \Closure $normalizer */
        $normalizer = $this->normalizers[$option];

        $this->lock[$option] = true;
        $this->options[$option] = $normalizer($this, array_key_exists($option, $this->options) ? $this->options[$option] : null);
        unset($this->lock[$option]);

        // The option is now normalized
        unset($this->normalizers[$option]);
    }
}
PK�`�\]�='YY5pear/Symfony/Component/OptionsResolver/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\OptionsResolver\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�`�\E@�^��Gpear/Symfony/Component/OptionsResolver/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\OptionsResolver\Exception;

/**
 * Marker interface for the Options component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ExceptionInterface
{
}
PK�`�\p����Lpear/Symfony/Component/OptionsResolver/Exception/MissingOptionsException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\OptionsResolver\Exception;

/**
 * Exception thrown when a required option is missing.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class MissingOptionsException extends \InvalidArgumentException implements ExceptionInterface
{
}
PK�`�\��sZ��Lpear/Symfony/Component/OptionsResolver/Exception/InvalidOptionsException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\OptionsResolver\Exception;

/**
 * Exception thrown when an invalid option is passed.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class InvalidOptionsException extends \InvalidArgumentException implements ExceptionInterface
{
}
PK�`�\�yPH��Npear/Symfony/Component/OptionsResolver/Exception/OptionDefinitionException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\OptionsResolver\Exception;

/**
 * Thrown when an option definition is invalid.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class OptionDefinitionException extends \RuntimeException implements ExceptionInterface
{
}
PK�`�\���O2pear/Symfony/Component/Security/Csrf/CsrfToken.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf;

/**
 * A CSRF token.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class CsrfToken
{
    /**
     * @var string
     */
    private $id;

    /**
     * @var string
     */
    private $value;

    /**
     * Constructor.
     *
     * @param string $id    The token ID
     * @param string $value The actual token value
     */
    public function __construct($id, $value)
    {
        $this->id = (string) $id;
        $this->value = (string) $value;
    }

    /**
     * Returns the ID of the CSRF token.
     *
     * @return string The token ID
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Returns the value of the CSRF token.
     *
     * @return string The token value
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * Returns the value of the CSRF token.
     *
     * @return string The token value
     */
    public function __toString()
    {
        return $this->value;
    }
}
PK�`�\��VǴ�Bpear/Symfony/Component/Security/Csrf/CsrfTokenManagerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf;

/**
 * Manages CSRF tokens.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface CsrfTokenManagerInterface
{
    /**
     * Returns a CSRF token for the given ID.
     *
     * If previously no token existed for the given ID, a new token is
     * generated. Otherwise the existing token is returned (with the same value,
     * not the same instance).
     *
     * @param string $tokenId The token ID. You may choose an arbitrary value
     *                        for the ID
     *
     * @return CsrfToken The CSRF token
     */
    public function getToken($tokenId);

    /**
     * Generates a new token value for the given ID.
     *
     * This method will generate a new token for the given token ID, independent
     * of whether a token value previously existed or not. It can be used to
     * enforce once-only tokens in environments with high security needs.
     *
     * @param string $tokenId The token ID. You may choose an arbitrary value
     *                        for the ID
     *
     * @return CsrfToken The CSRF token
     */
    public function refreshToken($tokenId);

    /**
     * Invalidates the CSRF token with the given ID, if one exists.
     *
     * @param string $tokenId The token ID
     *
     * @return string|null Returns the removed token value if one existed, NULL
     *                     otherwise
     */
    public function removeToken($tokenId);

    /**
     * Returns whether the given CSRF token is valid.
     *
     * @param CsrfToken $token A CSRF token
     *
     * @return Boolean Returns true if the token is valid, false otherwise
     */
    public function isTokenValid(CsrfToken $token);
}
PK�`�\��]N
N
Ipear/Symfony/Component/Security/Csrf/TokenStorage/SessionTokenStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf\TokenStorage;

use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Csrf\Exception\TokenNotFoundException;

/**
 * Token storage that uses a Symfony2 Session object.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class SessionTokenStorage implements TokenStorageInterface
{
    /**
     * The namespace used to store values in the session.
     * @var string
     */
    const SESSION_NAMESPACE = '_csrf';

    /**
     * The user session from which the session ID is returned
     * @var SessionInterface
     */
    private $session;

    /**
     * @var string
     */
    private $namespace;

    /**
     * Initializes the storage with a Session object and a session namespace.
     *
     * @param SessionInterface $session   The user session
     * @param string           $namespace The namespace under which the token
     *                                    is stored in the session
     */
    public function __construct(SessionInterface $session, $namespace = self::SESSION_NAMESPACE)
    {
        $this->session = $session;
        $this->namespace = $namespace;
    }

    /**
     * {@inheritdoc}
     */
    public function getToken($tokenId)
    {
        if (!$this->session->isStarted()) {
            $this->session->start();
        }

        if (!$this->session->has($this->namespace.'/'.$tokenId)) {
            throw new TokenNotFoundException('The CSRF token with ID '.$tokenId.' does not exist.');
        }

        return (string) $this->session->get($this->namespace.'/'.$tokenId);
    }

    /**
     * {@inheritdoc}
     */
    public function setToken($tokenId, $token)
    {
        if (!$this->session->isStarted()) {
            $this->session->start();
        }

        $this->session->set($this->namespace.'/'.$tokenId, (string) $token);
    }

    /**
     * {@inheritdoc}
     */
    public function hasToken($tokenId)
    {
        if (!$this->session->isStarted()) {
            $this->session->start();
        }

        return $this->session->has($this->namespace.'/'.$tokenId);
    }

    /**
     * {@inheritdoc}
     */
    public function removeToken($tokenId)
    {
        if (!$this->session->isStarted()) {
            $this->session->start();
        }

        return $this->session->remove($this->namespace.'/'.$tokenId);
    }
}
PK�`�\�����
�
Opear/Symfony/Component/Security/Csrf/TokenStorage/NativeSessionTokenStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf\TokenStorage;

use Symfony\Component\Security\Csrf\Exception\TokenNotFoundException;

/**
 * Token storage that uses PHP's native session handling.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class NativeSessionTokenStorage implements TokenStorageInterface
{
    /**
     * The namespace used to store values in the session.
     * @var string
     */
    const SESSION_NAMESPACE = '_csrf';

    /**
     * @var Boolean
     */
    private $sessionStarted = false;

    /**
     * @var string
     */
    private $namespace;

    /**
     * Initializes the storage with a session namespace.
     *
     * @param string  $namespace The namespace under which the token is stored
     *                           in the session
     */
    public function __construct($namespace = self::SESSION_NAMESPACE)
    {
        $this->namespace = $namespace;
    }

    /**
     * {@inheritdoc}
     */
    public function getToken($tokenId)
    {
        if (!$this->sessionStarted) {
            $this->startSession();
        }

        if (!isset($_SESSION[$this->namespace][$tokenId])) {
            throw new TokenNotFoundException('The CSRF token with ID '.$tokenId.' does not exist.');
        }

        return (string) $_SESSION[$this->namespace][$tokenId];
    }

    /**
     * {@inheritdoc}
     */
    public function setToken($tokenId, $token)
    {
        if (!$this->sessionStarted) {
            $this->startSession();
        }

        $_SESSION[$this->namespace][$tokenId] = (string) $token;
    }

    /**
     * {@inheritdoc}
     */
    public function hasToken($tokenId)
    {
        if (!$this->sessionStarted) {
            $this->startSession();
        }

        return isset($_SESSION[$this->namespace][$tokenId]);
    }

    /**
     * {@inheritdoc}
     */
    public function removeToken($tokenId)
    {
        if (!$this->sessionStarted) {
            $this->startSession();
        }

        $token = isset($_SESSION[$this->namespace][$tokenId])
            ? (string) $_SESSION[$this->namespace][$tokenId]
            : null;

        unset($_SESSION[$this->namespace][$tokenId]);

        return $token;
    }

    private function startSession()
    {
        if (version_compare(PHP_VERSION, '5.4', '>=')) {
            if (PHP_SESSION_NONE === session_status()) {
                session_start();
            }
        } elseif (!session_id()) {
            session_start();
        }

        $this->sessionStarted = true;
    }
}
PK�`�\�����Kpear/Symfony/Component/Security/Csrf/TokenStorage/TokenStorageInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf\TokenStorage;

/**
 * Stores CSRF tokens.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface TokenStorageInterface
{
    /**
     * Reads a stored CSRF token.
     *
     * @param string $tokenId The token ID
     *
     * @return string The stored token
     *
     * @throws \Symfony\Component\Security\Csrf\Exception\TokenNotFoundException If the token ID does not exist
     */
    public function getToken($tokenId);

    /**
     * Stores a CSRF token.
     *
     * @param string $tokenId The token ID
     * @param string $token   The CSRF token
     */
    public function setToken($tokenId, $token);

    /**
     * Removes a CSRF token.
     *
     * @param string $tokenId The token ID
     *
     * @return string|null Returns the removed token if one existed, NULL
     *                     otherwise
     */
    public function removeToken($tokenId);

    /**
     * Checks whether a token with the given token ID exists.
     *
     * @param string $tokenId The token ID
     *
     * @return Boolean Whether a token exists with the given ID
     */
    public function hasToken($tokenId);
}
PK�`�\&%�L
L
9pear/Symfony/Component/Security/Csrf/CsrfTokenManager.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf;

use Symfony\Component\Security\Core\Util\StringUtils;
use Symfony\Component\Security\Csrf\TokenGenerator\UriSafeTokenGenerator;
use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;
use Symfony\Component\Security\Csrf\TokenStorage\NativeSessionTokenStorage;
use Symfony\Component\Security\Csrf\TokenStorage\TokenStorageInterface;

/**
 * Default implementation of {@link CsrfTokenManagerInterface}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class CsrfTokenManager implements CsrfTokenManagerInterface
{
    /**
     * @var TokenGeneratorInterface
     */
    private $generator;

    /**
     * @var TokenStorageInterface
     */
    private $storage;

    /**
     * Creates a new CSRF provider using PHP's native session storage.
     *
     * @param TokenGeneratorInterface|null $generator The token generator
     * @param TokenStorageInterface|null   $storage   The storage for storing
     *                                                generated CSRF tokens
     */
    public function __construct(TokenGeneratorInterface $generator = null, TokenStorageInterface $storage = null)
    {
        $this->generator = $generator ?: new UriSafeTokenGenerator();
        $this->storage = $storage ?: new NativeSessionTokenStorage();
    }

    /**
     * {@inheritdoc}
     */
    public function getToken($tokenId)
    {
        if ($this->storage->hasToken($tokenId)) {
            $value = $this->storage->getToken($tokenId);
        } else {
            $value = $this->generator->generateToken();

            $this->storage->setToken($tokenId, $value);
        }

        return new CsrfToken($tokenId, $value);
    }

    /**
     * {@inheritdoc}
     */
    public function refreshToken($tokenId)
    {
        $value = $this->generator->generateToken();

        $this->storage->setToken($tokenId, $value);

        return new CsrfToken($tokenId, $value);
    }

    /**
     * {@inheritdoc}
     */
    public function removeToken($tokenId)
    {
        return $this->storage->removeToken($tokenId);
    }

    /**
     * {@inheritdoc}
     */
    public function isTokenValid(CsrfToken $token)
    {
        if (!$this->storage->hasToken($token->getId())) {
            return false;
        }

        return StringUtils::equals($this->storage->getToken($token->getId()), $token->getValue());
    }
}
PK�`�\eI����Ipear/Symfony/Component/Security/Csrf/Exception/TokenNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf\Exception;

use Symfony\Component\Security\Core\Exception\RuntimeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class TokenNotFoundException extends RuntimeException
{
}
PK�`�\J,p���Opear/Symfony/Component/Security/Csrf/TokenGenerator/TokenGeneratorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf\TokenGenerator;

/**
 * Generates and validates CSRF tokens.
 *
 * You can generate a CSRF token by using the method {@link generateCsrfToken()}.
 * This method expects a unique token ID as argument. The token ID can later be
 * used to validate a token provided by the user.
 *
 * Token IDs do not necessarily have to be secret, but they should NEVER be
 * created from data provided by the client. A good practice is to hard-code the
 * token IDs for the various CSRF tokens used by your application.
 *
 * You should use the method {@link isCsrfTokenValid()} to check a CSRF token
 * submitted by the client. This method will return true if the CSRF token is
 * valid.
 *
 * @since  2.4
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface TokenGeneratorInterface
{
    /**
     * Generates a CSRF token.
     *
     * @return string The generated CSRF token
     */
    public function generateToken();
}
PK�`�\��=Mpear/Symfony/Component/Security/Csrf/TokenGenerator/UriSafeTokenGenerator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf\TokenGenerator;

use Symfony\Component\Security\Core\Util\SecureRandomInterface;
use Symfony\Component\Security\Core\Util\SecureRandom;

/**
 * Generates CSRF tokens.
 *
 * @since  2.4
 * @author Bernhard Schussek <bernhard.schussek@symfony.com>
 */
class UriSafeTokenGenerator implements TokenGeneratorInterface
{
    /**
     * The generator for random values.
     *
     * @var SecureRandomInterface
     */
    private $random;

    /**
     * The amount of entropy collected for each token (in bits).
     *
     * @var integer
     */
    private $entropy;

    /**
     * Generates URI-safe CSRF tokens.
     *
     * @param SecureRandomInterface|null $random  The random value generator used for
     *                                            generating entropy
     * @param integer                    $entropy The amount of entropy collected for
     *                                            each token (in bits)
     */
    public function __construct(SecureRandomInterface $random = null, $entropy = 256)
    {
        $this->random = $random ?: new SecureRandom();
        $this->entropy = $entropy;
    }

    /**
     * {@inheritdoc}
     */
    public function generateToken()
    {
        // Generate an URI safe base64 encoded string that does not contain "+",
        // "/" or "=" which need to be URL encoded and make URLs unnecessarily
        // longer.
        $bytes = $this->random->nextBytes($this->entropy / 8);

        return rtrim(strtr(base64_encode($bytes), '+/', '-_'), '=');
    }
}
PK�`�\/�``;pear/Symfony/Component/Security/Http/AccessMapInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http;

use Symfony\Component\HttpFoundation\Request;

/**
 * AccessMap allows configuration of different access control rules for
 * specific parts of the website.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Kris Wallsmith <kris@symfony.com>
 */
interface AccessMapInterface
{
    /**
     * Returns security attributes and required channel for the supplied request.
     *
     * @param Request $request The current request
     *
     * @return array A tuple of security attributes and the required channel
     */
    public function getPatterns(Request $request);
}
PK�`�\��La[[Npear/Symfony/Component/Security/Http/Session/SessionAuthenticationStrategy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Session;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * The default session strategy implementation.
 *
 * Supports the following strategies:
 * NONE: the session is not changed
 * MIGRATE: the session id is updated, attributes are kept
 * INVALIDATE: the session id is updated, attributes are lost
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class SessionAuthenticationStrategy implements SessionAuthenticationStrategyInterface
{
    const NONE         = 'none';
    const MIGRATE      = 'migrate';
    const INVALIDATE   = 'invalidate';

    private $strategy;

    public function __construct($strategy)
    {
        $this->strategy = $strategy;
    }

    /**
     * {@inheritDoc}
     */
    public function onAuthentication(Request $request, TokenInterface $token)
    {
        switch ($this->strategy) {
            case self::NONE:
                return;

            case self::MIGRATE:
                $request->getSession()->migrate();

                return;

            case self::INVALIDATE:
                $request->getSession()->invalidate();

                return;

            default:
                throw new \RuntimeException(sprintf('Invalid session authentication strategy "%s"', $this->strategy));
        }
    }
}
PK�`�\:�&�GGWpear/Symfony/Component/Security/Http/Session/SessionAuthenticationStrategyInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Session;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * SessionAuthenticationStrategyInterface
 *
 * Implementation are responsible for updating the session after an interactive
 * authentication attempt was successful.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface SessionAuthenticationStrategyInterface
{
    /**
     * This performs any necessary changes to the session.
     *
     * This method is called before the SecurityContext is populated with a
     * Token, and only by classes inheriting from AbstractAuthenticationListener.
     *
     * @param Request        $request
     * @param TokenInterface $token
     */
    public function onAuthentication(Request $request, TokenInterface $token);
}
PK�`�\��\\��=pear/Symfony/Component/Security/Http/FirewallMapInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http;

use Symfony\Component\HttpFoundation\Request;

/**
 * This interface must be implemented by firewall maps.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface FirewallMapInterface
{
    /**
     * Returns the authentication listeners, and the exception listener to use
     * for the given request.
     *
     * If there are no authentication listeners, the first inner array must be
     * empty.
     *
     * If there is no exception listener, the second element of the outer array
     * must be null.
     *
     * @param Request $request
     *
     * @return array of the format array(array(AuthenticationListener), ExceptionListener)
     */
    public function getListeners(Request $request);
}
PK�`�\2j���2pear/Symfony/Component/Security/Http/AccessMap.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http;

use Symfony\Component\HttpFoundation\RequestMatcherInterface;
use Symfony\Component\HttpFoundation\Request;

/**
 * AccessMap allows configuration of different access control rules for
 * specific parts of the website.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class AccessMap implements AccessMapInterface
{
    private $map = array();

    /**
     * Constructor.
     *
     * @param RequestMatcherInterface $requestMatcher A RequestMatcherInterface instance
     * @param array                   $attributes     An array of attributes to pass to the access decision manager (like roles)
     * @param string|null             $channel        The channel to enforce (http, https, or null)
     */
    public function add(RequestMatcherInterface $requestMatcher, array $attributes = array(), $channel = null)
    {
        $this->map[] = array($requestMatcher, $attributes, $channel);
    }

    /**
     * {@inheritDoc}
     */
    public function getPatterns(Request $request)
    {
        foreach ($this->map as $elements) {
            if (null === $elements[0] || $elements[0]->matches($request)) {
                return array($elements[1], $elements[2]);
            }
        }

        return array(null, null);
    }
}
PK�`�\�DXVV1pear/Symfony/Component/Security/Http/Firewall.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http;

use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Firewall uses a FirewallMap to register security listeners for the given
 * request.
 *
 * It allows for different security strategies within the same application
 * (a Basic authentication for the /api, and a web based authentication for
 * everything else for instance).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Firewall implements EventSubscriberInterface
{
    private $map;
    private $dispatcher;
    private $exceptionListeners;

    /**
     * Constructor.
     *
     * @param FirewallMapInterface     $map        A FirewallMapInterface instance
     * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance
     */
    public function __construct(FirewallMapInterface $map, EventDispatcherInterface $dispatcher)
    {
        $this->map = $map;
        $this->dispatcher = $dispatcher;
        $this->exceptionListeners = new \SplObjectStorage();
    }

    /**
     * Handles security.
     *
     * @param GetResponseEvent $event An GetResponseEvent instance
     */
    public function onKernelRequest(GetResponseEvent $event)
    {
        if (!$event->isMasterRequest()) {
            return;
        }

        // register listeners for this firewall
        list($listeners, $exceptionListener) = $this->map->getListeners($event->getRequest());
        if (null !== $exceptionListener) {
            $this->exceptionListeners[$event->getRequest()] = $exceptionListener;
            $exceptionListener->register($this->dispatcher);
        }

        // initiate the listener chain
        foreach ($listeners as $listener) {
            $listener->handle($event);

            if ($event->hasResponse()) {
                break;
            }
        }
    }

    public function onKernelFinishRequest(FinishRequestEvent $event)
    {
        $request = $event->getRequest();

        if (isset($this->exceptionListeners[$request])) {
            $this->exceptionListeners[$request]->unregister($this->dispatcher);
            unset($this->exceptionListeners[$request]);
        }
    }

    /**
     * {@inheritDoc}
     */
    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array('onKernelRequest', 8),
            KernelEvents::FINISH_REQUEST => 'onKernelFinishRequest',
        );
    }
}
PK�`�\"�C��4pear/Symfony/Component/Security/Http/FirewallMap.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http;

use Symfony\Component\HttpFoundation\RequestMatcherInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Firewall\ExceptionListener;

/**
 * FirewallMap allows configuration of different firewalls for specific parts
 * of the website.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FirewallMap implements FirewallMapInterface
{
    private $map = array();

    /**
     * @param RequestMatcherInterface $requestMatcher
     * @param array                   $listeners
     * @param ExceptionListener       $exceptionListener
     */
    public function add(RequestMatcherInterface $requestMatcher = null, array $listeners = array(), ExceptionListener $exceptionListener = null)
    {
        $this->map[] = array($requestMatcher, $listeners, $exceptionListener);
    }

    /**
     * {@inheritDoc}
     */
    public function getListeners(Request $request)
    {
        foreach ($this->map as $elements) {
            if (null === $elements[0] || $elements[0]->matches($request)) {
                return array($elements[1], $elements[2]);
            }
        }

        return array(array(), null);
    }
}
PK�`�\tZ�)K	K	Rpear/Symfony/Component/Security/Http/EntryPoint/DigestAuthenticationEntryPoint.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\EntryPoint;

use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\NonceExpiredException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Psr\Log\LoggerInterface;

/**
 * DigestAuthenticationEntryPoint starts an HTTP Digest authentication.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DigestAuthenticationEntryPoint implements AuthenticationEntryPointInterface
{
    private $key;
    private $realmName;
    private $nonceValiditySeconds;
    private $logger;

    public function __construct($realmName, $key, $nonceValiditySeconds = 300, LoggerInterface $logger = null)
    {
        $this->realmName = $realmName;
        $this->key = $key;
        $this->nonceValiditySeconds = $nonceValiditySeconds;
        $this->logger = $logger;
    }

    /**
     * {@inheritdoc}
     */
    public function start(Request $request, AuthenticationException $authException = null)
    {
        $expiryTime = microtime(true) + $this->nonceValiditySeconds * 1000;
        $signatureValue = md5($expiryTime.':'.$this->key);
        $nonceValue = $expiryTime.':'.$signatureValue;
        $nonceValueBase64 = base64_encode($nonceValue);

        $authenticateHeader = sprintf('Digest realm="%s", qop="auth", nonce="%s"', $this->realmName, $nonceValueBase64);

        if ($authException instanceof NonceExpiredException) {
            $authenticateHeader = $authenticateHeader.', stale="true"';
        }

        if (null !== $this->logger) {
            $this->logger->debug(sprintf('WWW-Authenticate header sent to user agent: "%s"', $authenticateHeader));
        }

        $response = new Response();
        $response->headers->set('WWW-Authenticate', $authenticateHeader);
        $response->setStatusCode(401);

        return $response;
    }

    /**
     * @return string
     */
    public function getKey()
    {
        return $this->key;
    }

    /**
     * @return string
     */
    public function getRealmName()
    {
        return $this->realmName;
    }
}
PK�`�\)'_++Upear/Symfony/Component/Security/Http/EntryPoint/AuthenticationEntryPointInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\EntryPoint;

use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * AuthenticationEntryPointInterface is the interface used to start the
 * authentication scheme.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface AuthenticationEntryPointInterface
{
    /**
     * Starts the authentication scheme.
     *
     * @param Request                 $request       The request that resulted in an AuthenticationException
     * @param AuthenticationException $authException The exception that started the authentication process
     *
     * @return Response
     */
    public function start(Request $request, AuthenticationException $authException = null);
}
PK�`�\�יPpear/Symfony/Component/Security/Http/EntryPoint/FormAuthenticationEntryPoint.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\EntryPoint;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\HttpKernel\HttpKernelInterface;

/**
 * FormAuthenticationEntryPoint starts an authentication via a login form.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FormAuthenticationEntryPoint implements AuthenticationEntryPointInterface
{
    private $loginPath;
    private $useForward;
    private $httpKernel;
    private $httpUtils;

    /**
     * Constructor.
     *
     * @param HttpKernelInterface $kernel
     * @param HttpUtils           $httpUtils  An HttpUtils instance
     * @param string              $loginPath  The path to the login form
     * @param Boolean             $useForward Whether to forward or redirect to the login form
     */
    public function __construct(HttpKernelInterface $kernel, HttpUtils $httpUtils, $loginPath, $useForward = false)
    {
        $this->httpKernel = $kernel;
        $this->httpUtils = $httpUtils;
        $this->loginPath = $loginPath;
        $this->useForward = (Boolean) $useForward;
    }

    /**
     * {@inheritdoc}
     */
    public function start(Request $request, AuthenticationException $authException = null)
    {
        if ($this->useForward) {
            $subRequest = $this->httpUtils->createRequest($request, $this->loginPath);

            $response = $this->httpKernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
            if (200 === $response->getStatusCode()) {
                $response->headers->set('X-Status-Code', 401);
            }

            return $response;
        }

        return $this->httpUtils->createRedirectResponse($request, $this->loginPath);
    }
}
PK�`�\�����Qpear/Symfony/Component/Security/Http/EntryPoint/RetryAuthenticationEntryPoint.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\EntryPoint;

use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;

/**
 * RetryAuthenticationEntryPoint redirects URL based on the configured scheme.
 *
 * This entry point is not intended to work with HTTP post requests.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class RetryAuthenticationEntryPoint implements AuthenticationEntryPointInterface
{
    private $httpPort;
    private $httpsPort;

    public function __construct($httpPort = 80, $httpsPort = 443)
    {
        $this->httpPort = $httpPort;
        $this->httpsPort = $httpsPort;
    }

    /**
     * {@inheritdoc}
     */
    public function start(Request $request, AuthenticationException $authException = null)
    {
        $scheme = $request->isSecure() ? 'http' : 'https';
        if ('http' === $scheme && 80 != $this->httpPort) {
            $port = ':'.$this->httpPort;
        } elseif ('https' === $scheme && 443 != $this->httpsPort) {
            $port = ':'.$this->httpsPort;
        } else {
            $port = '';
        }

        $qs = $request->getQueryString();
        if (null !== $qs) {
            $qs = '?'.$qs;
        }

        $url = $scheme.'://'.$request->getHost().$port.$request->getBaseUrl().$request->getPathInfo().$qs;

        return new RedirectResponse($url, 301);
    }
}
PK�`�\�<ݐppQpear/Symfony/Component/Security/Http/EntryPoint/BasicAuthenticationEntryPoint.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\EntryPoint;

use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;

/**
 * BasicAuthenticationEntryPoint starts an HTTP Basic authentication.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class BasicAuthenticationEntryPoint implements AuthenticationEntryPointInterface
{
    private $realmName;

    public function __construct($realmName)
    {
        $this->realmName = $realmName;
    }

    /**
     * {@inheritdoc}
     */
    public function start(Request $request, AuthenticationException $authException = null)
    {
        $response = new Response();
        $response->headers->set('WWW-Authenticate', sprintf('Basic realm="%s"', $this->realmName));
        $response->setStatusCode(401);

        return $response;
    }
}
PK�`�\�D����>pear/Symfony/Component/Security/Http/Event/SwitchUserEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Event;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\EventDispatcher\Event;

/**
 * SwitchUserEvent
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SwitchUserEvent extends Event
{
    private $request;
    private $targetUser;

    public function __construct(Request $request, UserInterface $targetUser)
    {
        $this->request = $request;
        $this->targetUser = $targetUser;
    }

    /**
     * @return Request
     */
    public function getRequest()
    {
        return $this->request;
    }

    /**
     * @return UserInterface
     */
    public function getTargetUser()
    {
        return $this->targetUser;
    }
}
PK�`�\Z�v}Dpear/Symfony/Component/Security/Http/Event/InteractiveLoginEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Event;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * InteractiveLoginEvent
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class InteractiveLoginEvent extends Event
{
    private $request;
    private $authenticationToken;

    /**
     * Constructor.
     *
     * @param Request        $request             A Request instance
     * @param TokenInterface $authenticationToken A TokenInterface instance
     */
    public function __construct(Request $request, TokenInterface $authenticationToken)
    {
        $this->request = $request;
        $this->authenticationToken = $authenticationToken;
    }

    /**
     * Gets the request.
     *
     * @return Request A Request instance
     */
    public function getRequest()
    {
        return $this->request;
    }

    /**
     * Gets the authentication token.
     *
     * @return TokenInterface A TokenInterface instance
     */
    public function getAuthenticationToken()
    {
        return $this->authenticationToken;
    }
}
PK�`�\AH\ݞ�Spear/Symfony/Component/Security/Http/Authentication/SimpleAuthenticationHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Authentication;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface;

/**
 * Class to proxy authentication success/failure handlers
 *
 * Events are sent to the SimpleAuthenticatorInterface if it implements
 * the right interface, otherwise (or if it fails to return a Response)
 * the default handlers are triggered.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class SimpleAuthenticationHandler implements AuthenticationFailureHandlerInterface, AuthenticationSuccessHandlerInterface
{
    protected $successHandler;
    protected $failureHandler;
    protected $simpleAuthenticator;
    protected $logger;

    /**
     * Constructor.
     *
     * @param SimpleAuthenticatorInterface          $authenticator  SimpleAuthenticatorInterface instance
     * @param AuthenticationSuccessHandlerInterface $successHandler Default success handler
     * @param AuthenticationFailureHandlerInterface $failureHandler Default failure handler
     * @param LoggerInterface                       $logger         Optional logger
     */
    public function __construct(SimpleAuthenticatorInterface $authenticator, AuthenticationSuccessHandlerInterface $successHandler, AuthenticationFailureHandlerInterface $failureHandler, LoggerInterface $logger = null)
    {
        $this->simpleAuthenticator = $authenticator;
        $this->successHandler = $successHandler;
        $this->failureHandler = $failureHandler;
        $this->logger = $logger;
    }

    /**
     * {@inheritDoc}
     */
    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        if ($this->simpleAuthenticator instanceof AuthenticationSuccessHandlerInterface) {
            if ($this->logger) {
                $this->logger->debug(sprintf('Using the %s object as authentication success handler', get_class($this->simpleAuthenticator)));
            }

            $response = $this->simpleAuthenticator->onAuthenticationSuccess($request, $token);
            if ($response instanceof Response) {
                return $response;
            }

            if (null !== $response) {
                throw new \UnexpectedValueException(sprintf('The %s::onAuthenticationSuccess method must return null to use the default success handler, or a Response object', get_class($this->simpleAuthenticator)));
            }
        }

        if ($this->logger) {
            $this->logger->debug('Fallback to the default authentication success handler');
        }

        return $this->successHandler->onAuthenticationSuccess($request, $token);
    }

    /**
     * {@inheritDoc}
     */
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
        if ($this->simpleAuthenticator instanceof AuthenticationFailureHandlerInterface) {
            if ($this->logger) {
                $this->logger->debug(sprintf('Using the %s object as authentication failure handler', get_class($this->simpleAuthenticator)));
            }

            $response = $this->simpleAuthenticator->onAuthenticationFailure($request, $exception);
            if ($response instanceof Response) {
                return $response;
            }

            if (null !== $response) {
                throw new \UnexpectedValueException(sprintf('The %s::onAuthenticationFailure method must return null to use the default failure handler, or a Response object', get_class($this->simpleAuthenticator)));
            }
        }

        if ($this->logger) {
            $this->logger->debug('Fallback to the default authentication failure handler');
        }

        return $this->failureHandler->onAuthenticationFailure($request, $exception);
    }
}
PK�`�\������[pear/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Authentication;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Http\HttpUtils;

/**
 * Class with the default authentication failure handling logic.
 *
 * Can be optionally be extended from by the developer to alter the behaviour
 * while keeping the default behaviour.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class DefaultAuthenticationFailureHandler implements AuthenticationFailureHandlerInterface
{
    protected $httpKernel;
    protected $httpUtils;
    protected $logger;
    protected $options;

    /**
     * Constructor.
     *
     * @param HttpKernelInterface $httpKernel
     * @param HttpUtils           $httpUtils
     * @param array               $options    Options for processing a failed authentication attempt.
     * @param LoggerInterface     $logger     Optional logger
     */
    public function __construct(HttpKernelInterface $httpKernel, HttpUtils $httpUtils, array $options, LoggerInterface $logger = null)
    {
        $this->httpKernel = $httpKernel;
        $this->httpUtils  = $httpUtils;
        $this->logger     = $logger;

        $this->options = array_merge(array(
            'failure_path'           => null,
            'failure_forward'        => false,
            'login_path'             => '/login',
            'failure_path_parameter' => '_failure_path'
        ), $options);
    }

    /**
     * {@inheritDoc}
     */
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
        if ($failureUrl = $request->get($this->options['failure_path_parameter'], null, true)) {
             $this->options['failure_path'] = $failureUrl;
        }

        if (null === $this->options['failure_path']) {
            $this->options['failure_path'] = $this->options['login_path'];
        }

        if ($this->options['failure_forward']) {
            if (null !== $this->logger) {
                $this->logger->debug(sprintf('Forwarding to %s', $this->options['failure_path']));
            }

            $subRequest = $this->httpUtils->createRequest($request, $this->options['failure_path']);
            $subRequest->attributes->set(SecurityContextInterface::AUTHENTICATION_ERROR, $exception);

            return $this->httpKernel->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
        }

        if (null !== $this->logger) {
            $this->logger->debug(sprintf('Redirecting to %s', $this->options['failure_path']));
        }

        $request->getSession()->set(SecurityContextInterface::AUTHENTICATION_ERROR, $exception);

        return $this->httpUtils->createRedirectResponse($request, $this->options['failure_path']);
    }
}
PK�`�\�NA��]pear/Symfony/Component/Security/Http/Authentication/AuthenticationSuccessHandlerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Authentication;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Interface for a custom authentication success handler
 *
 * If you want to customize the success handling process, instead of
 * overwriting the respective listener globally, you can set a custom success
 * handler which implements this interface.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface AuthenticationSuccessHandlerInterface
{
    /**
     * This is called when an interactive authentication attempt succeeds. This
     * is called by authentication listeners inheriting from
     * AbstractAuthenticationListener.
     *
     * @param Request        $request
     * @param TokenInterface $token
     *
     * @return Response never null
     */
    public function onAuthenticationSuccess(Request $request, TokenInterface $token);
}
PK�`�\��H]]pear/Symfony/Component/Security/Http/Authentication/AuthenticationFailureHandlerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Authentication;

use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Interface for custom authentication failure handlers.
 *
 * If you want to customize the failure handling process, instead of
 * overwriting the respective listener globally, you can set a custom failure
 * handler which implements this interface.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface AuthenticationFailureHandlerInterface
{
    /**
     * This is called when an interactive authentication attempt fails. This is
     * called by authentication listeners inheriting from
     * AbstractAuthenticationListener.
     *
     * @param Request                 $request
     * @param AuthenticationException $exception
     *
     * @return Response The response to return, never null
     */
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception);
}
PK�`�\�xGAA[pear/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationSuccessHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Authentication;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\HttpUtils;

/**
 * Class with the default authentication success handling logic.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class DefaultAuthenticationSuccessHandler implements AuthenticationSuccessHandlerInterface
{
    protected $httpUtils;
    protected $options;
    protected $providerKey;

    /**
     * Constructor.
     *
     * @param HttpUtils $httpUtils
     * @param array     $options   Options for processing a successful authentication attempt.
     */
    public function __construct(HttpUtils $httpUtils, array $options)
    {
        $this->httpUtils   = $httpUtils;

        $this->options = array_merge(array(
            'always_use_default_target_path' => false,
            'default_target_path'            => '/',
            'login_path'                     => '/login',
            'target_path_parameter'          => '_target_path',
            'use_referer'                    => false,
        ), $options);
    }

    /**
     * {@inheritDoc}
     */
    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        return $this->httpUtils->createRedirectResponse($request, $this->determineTargetUrl($request));
    }

    /**
     * Get the provider key.
     *
     * @return string
     */
    public function getProviderKey()
    {
        return $this->providerKey;
    }

    /**
     * Set the provider key.
     *
     * @param string $providerKey
     */
    public function setProviderKey($providerKey)
    {
        $this->providerKey = $providerKey;
    }

    /**
     * Builds the target URL according to the defined options.
     *
     * @param Request $request
     *
     * @return string
     */
    protected function determineTargetUrl(Request $request)
    {
        if ($this->options['always_use_default_target_path']) {
            return $this->options['default_target_path'];
        }

        if ($targetUrl = $request->get($this->options['target_path_parameter'], null, true)) {
            return $targetUrl;
        }

        if (null !== $this->providerKey && $targetUrl = $request->getSession()->get('_security.'.$this->providerKey.'.target_path')) {
            $request->getSession()->remove('_security.'.$this->providerKey.'.target_path');

            return $targetUrl;
        }

        if ($this->options['use_referer'] && ($targetUrl = $request->headers->get('Referer')) && $targetUrl !== $this->httpUtils->generateUri($request, $this->options['login_path'])) {
            return $targetUrl;
        }

        return $this->options['default_target_path'];
    }
}
PK�`�\^�V��Spear/Symfony/Component/Security/Http/Authorization/AccessDeniedHandlerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Authorization;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

/**
 * This is used by the ExceptionListener to translate an AccessDeniedException
 * to a Response object.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface AccessDeniedHandlerInterface
{
    /**
     * Handles an access denied failure.
     *
     * @param Request               $request
     * @param AccessDeniedException $accessDeniedException
     *
     * @return Response may return null
     */
    public function handle(Request $request, AccessDeniedException $accessDeniedException);
}
PK�`�\a7�llKpear/Symfony/Component/Security/Http/Logout/DefaultLogoutSuccessHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Logout;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\HttpUtils;

/**
 * Default logout success handler will redirect users to a configured path.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class DefaultLogoutSuccessHandler implements LogoutSuccessHandlerInterface
{
    protected $httpUtils;
    protected $targetUrl;

    /**
     * @param HttpUtils $httpUtils
     * @param string    $targetUrl
     */
    public function __construct(HttpUtils $httpUtils, $targetUrl = '/')
    {
        $this->httpUtils = $httpUtils;

        $this->targetUrl = $targetUrl;
    }

    /**
     * {@inheritDoc}
     */
    public function onLogoutSuccess(Request $request)
    {
        return $this->httpUtils->createRedirectResponse($request, $this->targetUrl);
    }
}
PK�`�\6O����Fpear/Symfony/Component/Security/Http/Logout/LogoutHandlerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Logout;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;

/**
 * Interface that needs to be implemented by LogoutHandlers.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface LogoutHandlerInterface
{
    /**
     * This method is called by the LogoutListener when a user has requested
     * to be logged out. Usually, you would unset session variables, or remove
     * cookies, etc.
     *
     * @param Request        $request
     * @param Response       $response
     * @param TokenInterface $token
     */
    public function logout(Request $request, Response $response, TokenInterface $token);
}
PK�`�\\ü���Dpear/Symfony/Component/Security/Http/Logout/SessionLogoutHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Logout;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;

/**
 * Handler for clearing invalidating the current session.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class SessionLogoutHandler implements LogoutHandlerInterface
{
    /**
     * Invalidate the current session
     *
     * @param Request        $request
     * @param Response       $response
     * @param TokenInterface $token
     */
    public function logout(Request $request, Response $response, TokenInterface $token)
    {
        $request->getSession()->invalidate();
    }
}
PK�`�\�ddKpear/Symfony/Component/Security/Http/Logout/CookieClearingLogoutHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Logout;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;

/**
 * This handler clears the passed cookies when a user logs out.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class CookieClearingLogoutHandler implements LogoutHandlerInterface
{
    private $cookies;

    /**
     * Constructor.
     *
     * @param array $cookies An array of cookie names to unset
     */
    public function __construct(array $cookies)
    {
        $this->cookies = $cookies;
    }

    /**
     * Implementation for the LogoutHandlerInterface. Deletes all requested cookies.
     *
     * @param Request        $request
     * @param Response       $response
     * @param TokenInterface $token
     */
    public function logout(Request $request, Response $response, TokenInterface $token)
    {
        foreach ($this->cookies as $cookieName => $cookieData) {
            $response->headers->clearCookie($cookieName, $cookieData['path'], $cookieData['domain']);
        }
    }
}
PK�`�\1��d��Mpear/Symfony/Component/Security/Http/Logout/LogoutSuccessHandlerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Logout;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * LogoutSuccesshandlerInterface.
 *
 * In contrast to the LogoutHandlerInterface, this interface can return a response
 * which is then used instead of the default behavior.
 *
 * If you want to only perform some logout related clean-up task, use the
 * LogoutHandlerInterface instead.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface LogoutSuccessHandlerInterface
{
    /**
     * Creates a Response object to send upon a successful logout.
     *
     * @param Request $request
     *
     * @return Response never null
     */
    public function onLogoutSuccess(Request $request);
}
PK�`�\/ sG��7pear/Symfony/Component/Security/Http/SecurityEvents.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http;

final class SecurityEvents
{
    /**
     * The INTERACTIVE_LOGIN event occurs after a user is logged in
     * interactively for authentication based on http, cookies or X509.
     *
     * The event listener method receives a
     * Symfony\Component\Security\Http\Event\InteractiveLoginEvent instance.
     *
     * @var string
     */
    const INTERACTIVE_LOGIN = 'security.interactive_login';

    /**
     * The SWITCH_USER event occurs before switch to another user and
     * before exit from an already switched user.
     *
     * The event listener method receives a
     * Symfony\Component\Security\Http\Event\SwitchUserEvent instance.
     *
     * @var string
     */
    const SWITCH_USER = 'security.switch_user';
}
PK�`�\��`C��2pear/Symfony/Component/Security/Http/HttpUtils.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http;

use Symfony\Component\Security\Core\SecurityContextInterface;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;

/**
 * Encapsulates the logic needed to create sub-requests, redirect the user, and match URLs.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class HttpUtils
{
    private $urlGenerator;
    private $urlMatcher;

    /**
     * Constructor.
     *
     * @param UrlGeneratorInterface                       $urlGenerator A UrlGeneratorInterface instance
     * @param UrlMatcherInterface|RequestMatcherInterface $urlMatcher   The URL or Request matcher
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(UrlGeneratorInterface $urlGenerator = null, $urlMatcher = null)
    {
        $this->urlGenerator = $urlGenerator;
        if ($urlMatcher !== null && !$urlMatcher instanceof UrlMatcherInterface && !$urlMatcher instanceof RequestMatcherInterface) {
            throw new \InvalidArgumentException('Matcher must either implement UrlMatcherInterface or RequestMatcherInterface.');
        }
        $this->urlMatcher = $urlMatcher;
    }

    /**
     * Creates a redirect Response.
     *
     * @param Request $request A Request instance
     * @param string  $path    A path (an absolute path (/foo), an absolute URL (http://...), or a route name (foo))
     * @param integer $status  The status code
     *
     * @return RedirectResponse A RedirectResponse instance
     */
    public function createRedirectResponse(Request $request, $path, $status = 302)
    {
        return new RedirectResponse($this->generateUri($request, $path), $status);
    }

    /**
     * Creates a Request.
     *
     * @param Request $request The current Request instance
     * @param string  $path    A path (an absolute path (/foo), an absolute URL (http://...), or a route name (foo))
     *
     * @return Request A Request instance
     */
    public function createRequest(Request $request, $path)
    {
        $newRequest = Request::create($this->generateUri($request, $path), 'get', array(), $request->cookies->all(), array(), $request->server->all());
        if ($request->hasSession()) {
            $newRequest->setSession($request->getSession());
        }

        if ($request->attributes->has(SecurityContextInterface::AUTHENTICATION_ERROR)) {
            $newRequest->attributes->set(SecurityContextInterface::AUTHENTICATION_ERROR, $request->attributes->get(SecurityContextInterface::AUTHENTICATION_ERROR));
        }
        if ($request->attributes->has(SecurityContextInterface::ACCESS_DENIED_ERROR)) {
            $newRequest->attributes->set(SecurityContextInterface::ACCESS_DENIED_ERROR, $request->attributes->get(SecurityContextInterface::ACCESS_DENIED_ERROR));
        }
        if ($request->attributes->has(SecurityContextInterface::LAST_USERNAME)) {
            $newRequest->attributes->set(SecurityContextInterface::LAST_USERNAME, $request->attributes->get(SecurityContextInterface::LAST_USERNAME));
        }

        return $newRequest;
    }

    /**
     * Checks that a given path matches the Request.
     *
     * @param Request $request A Request instance
     * @param string  $path    A path (an absolute path (/foo), an absolute URL (http://...), or a route name (foo))
     *
     * @return Boolean true if the path is the same as the one from the Request, false otherwise
     */
    public function checkRequestPath(Request $request, $path)
    {
        if ('/' !== $path[0]) {
            try {
                // matching a request is more powerful than matching a URL path + context, so try that first
                if ($this->urlMatcher instanceof RequestMatcherInterface) {
                    $parameters = $this->urlMatcher->matchRequest($request);
                } else {
                    $parameters = $this->urlMatcher->match($request->getPathInfo());
                }

                return $path === $parameters['_route'];
            } catch (MethodNotAllowedException $e) {
                return false;
            } catch (ResourceNotFoundException $e) {
                return false;
            }
        }

        return $path === rawurldecode($request->getPathInfo());
    }

    /**
     * Generates a URI, based on the given path or absolute URL.
     *
     * @param Request $request A Request instance
     * @param string  $path    A path (an absolute path (/foo), an absolute URL (http://...), or a route name (foo))
     *
     * @return string An absolute URL
     *
     * @throws \LogicException
     */
    public function generateUri($request, $path)
    {
        if (0 === strpos($path, 'http') || !$path) {
            return $path;
        }

        if ('/' === $path[0]) {
            return $request->getUriForPath($path);
        }

        if (null === $this->urlGenerator) {
            throw new \LogicException('You must provide a UrlGeneratorInterface instance to be able to use routes.');
        }

        $url = $this->urlGenerator->generate($path, $request->attributes->all(), UrlGeneratorInterface::ABSOLUTE_URL);

        // unnecessary query string parameters must be removed from URL
        // (ie. query parameters that are presents in $attributes)
        // fortunately, they all are, so we have to remove entire query string
        $position = strpos($url, '?');
        if (false !== $position) {
            $url = substr($url, 0, $position);
        }

        return $url;
    }
}
PK�`�\׺�=��Lpear/Symfony/Component/Security/Http/Firewall/X509AuthenticationListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * X509 authentication listener.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class X509AuthenticationListener extends AbstractPreAuthenticatedListener
{
    private $userKey;
    private $credentialKey;

    public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, $providerKey, $userKey = 'SSL_CLIENT_S_DN_Email', $credentialKey = 'SSL_CLIENT_S_DN', LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null)
    {
        parent::__construct($securityContext, $authenticationManager, $providerKey, $logger, $dispatcher);

        $this->userKey = $userKey;
        $this->credentialKey = $credentialKey;
    }

    /**
     * {@inheritdoc}
     */
    protected function getPreAuthenticatedData(Request $request)
    {
        if (!$request->server->has($this->userKey)) {
            throw new BadCredentialsException(sprintf('SSL key was not found: %s', $this->userKey));
        }

        return array($request->server->get($this->userKey), $request->server->get($this->credentialKey, ''));
    }
}
PK�`�\�|L@**@pear/Symfony/Component/Security/Http/Firewall/LogoutListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderAdapter;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Exception\InvalidArgumentException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\Exception\LogoutException;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\Security\Http\Logout\LogoutHandlerInterface;
use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface;

/**
 * LogoutListener logout users.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class LogoutListener implements ListenerInterface
{
    private $securityContext;
    private $options;
    private $handlers;
    private $successHandler;
    private $httpUtils;
    private $csrfTokenManager;

    /**
     * Constructor.
     *
     * @param SecurityContextInterface      $securityContext
     * @param HttpUtils                     $httpUtils        An HttpUtilsInterface instance
     * @param LogoutSuccessHandlerInterface $successHandler   A LogoutSuccessHandlerInterface instance
     * @param array                         $options          An array of options to process a logout attempt
     * @param CsrfTokenManagerInterface     $csrfTokenManager A CsrfTokenManagerInterface instance
     */
    public function __construct(SecurityContextInterface $securityContext, HttpUtils $httpUtils, LogoutSuccessHandlerInterface $successHandler, array $options = array(), $csrfTokenManager = null)
    {
        if ($csrfTokenManager instanceof CsrfProviderInterface) {
            $csrfTokenManager = new CsrfProviderAdapter($csrfTokenManager);
        } elseif (null !== $csrfTokenManager && !$csrfTokenManager instanceof CsrfTokenManagerInterface) {
            throw new InvalidArgumentException('The CSRF token manager should be an instance of CsrfProviderInterface or CsrfTokenManagerInterface.');
        }

        $this->securityContext = $securityContext;
        $this->httpUtils = $httpUtils;
        $this->options = array_merge(array(
            'csrf_parameter' => '_csrf_token',
            'intention'      => 'logout',
            'logout_path'    => '/logout',
        ), $options);
        $this->successHandler = $successHandler;
        $this->csrfTokenManager = $csrfTokenManager;
        $this->handlers = array();
    }

    /**
     * Adds a logout handler
     *
     * @param LogoutHandlerInterface $handler
     */
    public function addHandler(LogoutHandlerInterface $handler)
    {
        $this->handlers[] = $handler;
    }

    /**
     * Performs the logout if requested
     *
     * If a CsrfTokenManagerInterface instance is available, it will be used to
     * validate the request.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     *
     * @throws LogoutException if the CSRF token is invalid
     * @throws \RuntimeException if the LogoutSuccessHandlerInterface instance does not return a response
     */
    public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        if (!$this->requiresLogout($request)) {
            return;
        }

        if (null !== $this->csrfTokenManager) {
            $csrfToken = $request->get($this->options['csrf_parameter'], null, true);

            if (false === $this->csrfTokenManager->isTokenValid(new CsrfToken($this->options['intention'], $csrfToken))) {
                throw new LogoutException('Invalid CSRF token.');
            }
        }

        $response = $this->successHandler->onLogoutSuccess($request);
        if (!$response instanceof Response) {
            throw new \RuntimeException('Logout Success Handler did not return a Response.');
        }

        // handle multiple logout attempts gracefully
        if ($token = $this->securityContext->getToken()) {
            foreach ($this->handlers as $handler) {
                $handler->logout($request, $response, $token);
            }
        }

        $this->securityContext->setToken(null);

        $event->setResponse($response);
    }

    /**
     * Whether this request is asking for logout.
     *
     * The default implementation only processed requests to a specific path,
     * but a subclass could change this to logout requests where
     * certain parameters is present.
     *
     * @param Request $request
     *
     * @return Boolean
     */
    protected function requiresLogout(Request $request)
    {
        return $this->httpUtils->checkRequestPath($request, $this->options['logout_path']);
    }
}
PK�`�\~�k��Apear/Symfony/Component/Security/Http/Firewall/ChannelListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Security\Http\AccessMapInterface;
use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

/**
 * ChannelListener switches the HTTP protocol based on the access control
 * configuration.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ChannelListener implements ListenerInterface
{
    private $map;
    private $authenticationEntryPoint;
    private $logger;

    public function __construct(AccessMapInterface $map, AuthenticationEntryPointInterface $authenticationEntryPoint, LoggerInterface $logger = null)
    {
        $this->map = $map;
        $this->authenticationEntryPoint = $authenticationEntryPoint;
        $this->logger = $logger;
    }

    /**
     * Handles channel management.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     */
    public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        list($attributes, $channel) = $this->map->getPatterns($request);

        if ('https' === $channel && !$request->isSecure()) {
            if (null !== $this->logger) {
                $this->logger->info('Redirecting to HTTPS');
            }

            $response = $this->authenticationEntryPoint->start($request);

            $event->setResponse($response);

            return;
        }

        if ('http' === $channel && $request->isSecure()) {
            if (null !== $this->logger) {
                $this->logger->info('Redirecting to HTTP');
            }

            $response = $this->authenticationEntryPoint->start($request);

            $event->setResponse($response);
        }
    }
}
PK�`�\n��Qpear/Symfony/Component/Security/Http/Firewall/SimplePreAuthenticationListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\SimplePreAuthenticatorInterface;
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;

/**
 * SimplePreAuthenticationListener implements simple proxying to an authenticator.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class SimplePreAuthenticationListener implements ListenerInterface
{
    private $securityContext;
    private $authenticationManager;
    private $providerKey;
    private $simpleAuthenticator;
    private $logger;

    /**
     * Constructor.
     *
     * @param SecurityContextInterface         $securityContext       A SecurityContext instance
     * @param AuthenticationManagerInterface   $authenticationManager An AuthenticationManagerInterface instance
     * @param string                           $providerKey
     * @param SimplePreAuthenticatorInterface  $simpleAuthenticator   A SimplePreAuthenticatorInterface instance
     * @param LoggerInterface                  $logger                A LoggerInterface instance
     */
    public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, $providerKey, SimplePreAuthenticatorInterface $simpleAuthenticator, LoggerInterface $logger = null)
    {
        if (empty($providerKey)) {
            throw new \InvalidArgumentException('$providerKey must not be empty.');
        }

        $this->securityContext = $securityContext;
        $this->authenticationManager = $authenticationManager;
        $this->providerKey = $providerKey;
        $this->simpleAuthenticator = $simpleAuthenticator;
        $this->logger = $logger;
    }

    /**
     * Handles basic authentication.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     */
    public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        if (null !== $this->logger) {
            $this->logger->info(sprintf('Attempting simple pre-authorization %s', $this->providerKey));
        }

        if (null !== $this->securityContext->getToken() && !$this->securityContext->getToken() instanceof AnonymousToken) {
            return;
        }

        try {
            $token = $this->simpleAuthenticator->createToken($request, $this->providerKey);
            $token = $this->authenticationManager->authenticate($token);
            $this->securityContext->setToken($token);
        } catch (AuthenticationException $e) {
            $this->securityContext->setToken(null);

            if (null !== $this->logger) {
                $this->logger->info(sprintf('Authentication request failed: %s', $e->getMessage()));
            }

            if ($this->simpleAuthenticator instanceof AuthenticationFailureHandlerInterface) {
                $response = $this->simpleAuthenticator->onAuthenticationFailure($request, $e);
                if ($response instanceof Response) {
                    $event->setResponse($response);
                } elseif (null !== $response) {
                    throw new \UnexpectedValueException(sprintf('The %s::onAuthenticationFailure method must return null or a Response object', get_class($this->simpleAuthenticator)));
                }
            }

            return;
        }

        if ($this->simpleAuthenticator instanceof AuthenticationSuccessHandlerInterface) {
            $response = $this->simpleAuthenticator->onAuthenticationSuccess($request, $token);
            if ($response instanceof Response) {
                $event->setResponse($response);
            } elseif (null !== $response) {
                throw new \UnexpectedValueException(sprintf('The %s::onAuthenticationSuccess method must return null or a Response object', get_class($this->simpleAuthenticator)));
            }
        }
    }
}
PK�`�\�����Cpear/Symfony/Component/Security/Http/Firewall/ListenerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;

/**
 * Interface that must be implemented by firewall listeners
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface ListenerInterface
{
    /**
     * This interface must be implemented by firewall listeners.
     *
     * @param GetResponseEvent $event
     */
    public function handle(GetResponseEvent $event);
}
PK�`�\(�T	b!b!Cpear/Symfony/Component/Security/Http/Firewall/ExceptionListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface;
use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\InsufficientAuthenticationException;
use Symfony\Component\Security\Core\Exception\LogoutException;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\HttpFoundation\Request;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * ExceptionListener catches authentication exception and converts them to
 * Response instances.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ExceptionListener
{
    private $context;
    private $providerKey;
    private $accessDeniedHandler;
    private $authenticationEntryPoint;
    private $authenticationTrustResolver;
    private $errorPage;
    private $logger;
    private $httpUtils;

    public function __construct(SecurityContextInterface $context, AuthenticationTrustResolverInterface $trustResolver, HttpUtils $httpUtils, $providerKey, AuthenticationEntryPointInterface $authenticationEntryPoint = null, $errorPage = null, AccessDeniedHandlerInterface $accessDeniedHandler = null, LoggerInterface $logger = null)
    {
        $this->context = $context;
        $this->accessDeniedHandler = $accessDeniedHandler;
        $this->httpUtils = $httpUtils;
        $this->providerKey = $providerKey;
        $this->authenticationEntryPoint = $authenticationEntryPoint;
        $this->authenticationTrustResolver = $trustResolver;
        $this->errorPage = $errorPage;
        $this->logger = $logger;
    }

    /**
     * Registers a onKernelException listener to take care of security exceptions.
     *
     * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance
     */
    public function register(EventDispatcherInterface $dispatcher)
    {
        $dispatcher->addListener(KernelEvents::EXCEPTION, array($this, 'onKernelException'));
    }

    /**
     * Unregisters the dispatcher.
     *
     * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance
     */
    public function unregister(EventDispatcherInterface $dispatcher)
    {
        $dispatcher->removeListener(KernelEvents::EXCEPTION, array($this, 'onKernelException'));
    }

    /**
     * Handles security related exceptions.
     *
     * @param GetResponseForExceptionEvent $event An GetResponseForExceptionEvent instance
     */
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        $exception = $event->getException();
        do {
            if ($exception instanceof AuthenticationException) {
                return $this->handleAuthenticationException($event, $exception);
            } elseif ($exception instanceof AccessDeniedException) {
                return $this->handleAccessDeniedException($event, $exception);
            } elseif ($exception instanceof LogoutException) {
                return $this->handleLogoutException($event, $exception);
            }
        } while (null !== $exception = $exception->getPrevious());
    }

    private function handleAuthenticationException(GetResponseForExceptionEvent $event, AuthenticationException $exception)
    {
        if (null !== $this->logger) {
            $this->logger->info(sprintf('Authentication exception occurred; redirecting to authentication entry point (%s)', $exception->getMessage()));
        }

        try {
            $event->setResponse($this->startAuthentication($event->getRequest(), $exception));
        } catch (\Exception $e) {
            $event->setException($e);
        }
    }

    private function handleAccessDeniedException(GetResponseForExceptionEvent $event, AccessDeniedException $exception)
    {
        $event->setException(new AccessDeniedHttpException($exception->getMessage(), $exception));

        $token = $this->context->getToken();
        if (!$this->authenticationTrustResolver->isFullFledged($token)) {
            if (null !== $this->logger) {
                $this->logger->debug(sprintf('Access is denied (user is not fully authenticated) by "%s" at line %s; redirecting to authentication entry point', $exception->getFile(), $exception->getLine()));
            }

            try {
                $insufficientAuthenticationException = new InsufficientAuthenticationException('Full authentication is required to access this resource.', 0, $exception);
                $insufficientAuthenticationException->setToken($token);

                $event->setResponse($this->startAuthentication($event->getRequest(), $insufficientAuthenticationException));
            } catch (\Exception $e) {
                $event->setException($e);
            }

            return;
        }

        if (null !== $this->logger) {
            $this->logger->debug(sprintf('Access is denied (and user is neither anonymous, nor remember-me) by "%s" at line %s', $exception->getFile(), $exception->getLine()));
        }

        try {
            if (null !== $this->accessDeniedHandler) {
                $response = $this->accessDeniedHandler->handle($event->getRequest(), $exception);

                if ($response instanceof Response) {
                    $event->setResponse($response);
                }
            } elseif (null !== $this->errorPage) {
                $subRequest = $this->httpUtils->createRequest($event->getRequest(), $this->errorPage);
                $subRequest->attributes->set(SecurityContextInterface::ACCESS_DENIED_ERROR, $exception);

                $event->setResponse($event->getKernel()->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true));
            }
        } catch (\Exception $e) {
            if (null !== $this->logger) {
                $this->logger->error(sprintf('Exception thrown when handling an exception (%s: %s)', get_class($e), $e->getMessage()));
            }

            $event->setException(new \RuntimeException('Exception thrown when handling an exception.', 0, $e));
        }
    }

    private function handleLogoutException(GetResponseForExceptionEvent $event, LogoutException $exception)
    {
        if (null !== $this->logger) {
            $this->logger->info(sprintf('Logout exception occurred; wrapping with AccessDeniedHttpException (%s)', $exception->getMessage()));
        }
    }

    /**
     * @param Request                 $request
     * @param AuthenticationException $authException
     *
     * @return Response
     * @throws AuthenticationException
     */
    private function startAuthentication(Request $request, AuthenticationException $authException)
    {
        if (null === $this->authenticationEntryPoint) {
            throw $authException;
        }

        if (null !== $this->logger) {
            $this->logger->debug('Calling Authentication entry point');
        }

        $this->setTargetPath($request);

        if ($authException instanceof AccountStatusException) {
            // remove the security token to prevent infinite redirect loops
            $this->context->setToken(null);
        }

        return $this->authenticationEntryPoint->start($request, $authException);
    }

    /**
     * @param Request $request
     */
    protected function setTargetPath(Request $request)
    {
        // session isn't required when using HTTP basic authentication mechanism for example
        if ($request->hasSession() && $request->isMethodSafe()) {
            $request->getSession()->set('_security.'.$this->providerKey.'.target_path', $request->getUri());
        }
    }
}
PK�`�\�����Rpear/Symfony/Component/Security/Http/Firewall/SimpleFormAuthenticationListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderAdapter;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\InvalidArgumentException;
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\Security\Http\Session\SessionAuthenticationStrategyInterface;
use Psr\Log\LoggerInterface;

/**
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class SimpleFormAuthenticationListener extends AbstractAuthenticationListener
{
    private $simpleAuthenticator;
    private $csrfTokenManager;

    /**
     * Constructor.
     *
     * @param SecurityContextInterface               $securityContext       A SecurityContext instance
     * @param AuthenticationManagerInterface         $authenticationManager An AuthenticationManagerInterface instance
     * @param SessionAuthenticationStrategyInterface $sessionStrategy
     * @param HttpUtils                              $httpUtils             An HttpUtilsInterface instance
     * @param string                                 $providerKey
     * @param AuthenticationSuccessHandlerInterface  $successHandler
     * @param AuthenticationFailureHandlerInterface  $failureHandler
     * @param array                                  $options               An array of options for the processing of a
     *                                                                      successful, or failed authentication attempt
     * @param LoggerInterface                        $logger                A LoggerInterface instance
     * @param EventDispatcherInterface               $dispatcher            An EventDispatcherInterface instance
     * @param SimpleFormAuthenticatorInterface       $simpleAuthenticator   A SimpleFormAuthenticatorInterface instance
     * @param CsrfTokenManagerInterface              $csrfTokenManager      A CsrfTokenManagerInterface instance
     */
    public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $providerKey, AuthenticationSuccessHandlerInterface $successHandler, AuthenticationFailureHandlerInterface $failureHandler, array $options = array(), LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, CsrfTokenManagerInterface $csrfTokenManager = null, SimpleFormAuthenticatorInterface $simpleAuthenticator = null)
    {
        if (!$simpleAuthenticator) {
            throw new \InvalidArgumentException('Missing simple authenticator');
        }

        if ($csrfTokenManager instanceof CsrfProviderInterface) {
            $csrfTokenManager = new CsrfProviderAdapter($csrfTokenManager);
        } elseif (null !== $csrfTokenManager && !$csrfTokenManager instanceof CsrfTokenManagerInterface) {
            throw new InvalidArgumentException('The CSRF token manager should be an instance of CsrfProviderInterface or CsrfTokenManagerInterface.');
        }

        $this->simpleAuthenticator = $simpleAuthenticator;
        $this->csrfTokenManager = $csrfTokenManager;

        $options = array_merge(array(
            'username_parameter' => '_username',
            'password_parameter' => '_password',
            'csrf_parameter'     => '_csrf_token',
            'intention'          => 'authenticate',
            'post_only'          => true,
        ), $options);
        parent::__construct($securityContext, $authenticationManager, $sessionStrategy, $httpUtils, $providerKey, $successHandler, $failureHandler, $options, $logger, $dispatcher);
    }

    /**
     * {@inheritdoc}
     */
    protected function requiresAuthentication(Request $request)
    {
        if ($this->options['post_only'] && !$request->isMethod('POST')) {
            return false;
        }

        return parent::requiresAuthentication($request);
    }

    /**
     * {@inheritdoc}
     */
    protected function attemptAuthentication(Request $request)
    {
        if (null !== $this->csrfTokenManager) {
            $csrfToken = $request->get($this->options['csrf_parameter'], null, true);

            if (false === $this->csrfTokenManager->isTokenValid(new CsrfToken($this->options['intention'], $csrfToken))) {
                throw new InvalidCsrfTokenException('Invalid CSRF token.');
            }
        }

        if ($this->options['post_only']) {
            $username = trim($request->request->get($this->options['username_parameter'], null, true));
            $password = $request->request->get($this->options['password_parameter'], null, true);
        } else {
            $username = trim($request->get($this->options['username_parameter'], null, true));
            $password = $request->get($this->options['password_parameter'], null, true);
        }

        $request->getSession()->set(SecurityContextInterface::LAST_USERNAME, $username);

        $token = $this->simpleAuthenticator->createToken($request, $username, $password, $this->providerKey);

        return $this->authenticationManager->authenticate($token);
    }
}
PK�`�\+/��Z	Z	@pear/Symfony/Component/Security/Http/Firewall/AccessListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
use Symfony\Component\Security\Http\AccessMapInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

/**
 * AccessListener enforces access control rules.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class AccessListener implements ListenerInterface
{
    private $context;
    private $accessDecisionManager;
    private $map;
    private $authManager;

    public function __construct(SecurityContextInterface $context, AccessDecisionManagerInterface $accessDecisionManager, AccessMapInterface $map, AuthenticationManagerInterface $authManager)
    {
        $this->context = $context;
        $this->accessDecisionManager = $accessDecisionManager;
        $this->map = $map;
        $this->authManager = $authManager;
    }

    /**
     * Handles access authorization.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     *
     * @throws AccessDeniedException
     * @throws AuthenticationCredentialsNotFoundException
     */
    public function handle(GetResponseEvent $event)
    {
        if (null === $token = $this->context->getToken()) {
            throw new AuthenticationCredentialsNotFoundException('A Token was not found in the SecurityContext.');
        }

        $request = $event->getRequest();

        list($attributes, $channel) = $this->map->getPatterns($request);

        if (null === $attributes) {
            return;
        }

        if (!$token->isAuthenticated()) {
            $token = $this->authManager->authenticate($token);
            $this->context->setToken($token);
        }

        if (!$this->accessDecisionManager->decide($token, $attributes, $request)) {
            throw new AccessDeniedException();
        }
    }
}
PK�`�\��̗��\pear/Symfony/Component/Security/Http/Firewall/UsernamePasswordFormAuthenticationListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderAdapter;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\HttpFoundation\Request;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Http\Session\SessionAuthenticationStrategyInterface;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Exception\InvalidArgumentException;
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * UsernamePasswordFormAuthenticationListener is the default implementation of
 * an authentication via a simple form composed of a username and a password.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class UsernamePasswordFormAuthenticationListener extends AbstractAuthenticationListener
{
    private $csrfTokenManager;

    /**
     * {@inheritdoc}
     */
    public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $providerKey, AuthenticationSuccessHandlerInterface $successHandler, AuthenticationFailureHandlerInterface $failureHandler, array $options = array(), LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null, $csrfTokenManager = null)
    {
        if ($csrfTokenManager instanceof CsrfProviderInterface) {
            $csrfTokenManager = new CsrfProviderAdapter($csrfTokenManager);
        } elseif (null !== $csrfTokenManager && !$csrfTokenManager instanceof CsrfTokenManagerInterface) {
            throw new InvalidArgumentException('The CSRF token manager should be an instance of CsrfProviderInterface or CsrfTokenManagerInterface.');
        }

        parent::__construct($securityContext, $authenticationManager, $sessionStrategy, $httpUtils, $providerKey, $successHandler, $failureHandler, array_merge(array(
            'username_parameter' => '_username',
            'password_parameter' => '_password',
            'csrf_parameter'     => '_csrf_token',
            'intention'          => 'authenticate',
            'post_only'          => true,
        ), $options), $logger, $dispatcher);

        $this->csrfTokenManager = $csrfTokenManager;
    }

    /**
     * {@inheritdoc}
     */
    protected function requiresAuthentication(Request $request)
    {
        if ($this->options['post_only'] && !$request->isMethod('POST')) {
            return false;
        }

        return parent::requiresAuthentication($request);
    }

    /**
     * {@inheritdoc}
     */
    protected function attemptAuthentication(Request $request)
    {
        if (null !== $this->csrfTokenManager) {
            $csrfToken = $request->get($this->options['csrf_parameter'], null, true);

            if (false === $this->csrfTokenManager->isTokenValid(new CsrfToken($this->options['intention'], $csrfToken))) {
                throw new InvalidCsrfTokenException('Invalid CSRF token.');
            }
        }

        if ($this->options['post_only']) {
            $username = trim($request->request->get($this->options['username_parameter'], null, true));
            $password = $request->request->get($this->options['password_parameter'], null, true);
        } else {
            $username = trim($request->get($this->options['username_parameter'], null, true));
            $password = $request->get($this->options['password_parameter'], null, true);
        }

        $request->getSession()->set(SecurityContextInterface::LAST_USERNAME, $username);

        return $this->authenticationManager->authenticate(new UsernamePasswordToken($username, $password, $this->providerKey));
    }
}
PK�`�\�&!�
�
Mpear/Symfony/Component/Security/Http/Firewall/BasicAuthenticationListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Exception\AuthenticationException;

/**
 * BasicAuthenticationListener implements Basic HTTP authentication.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class BasicAuthenticationListener implements ListenerInterface
{
    private $securityContext;
    private $authenticationManager;
    private $providerKey;
    private $authenticationEntryPoint;
    private $logger;
    private $ignoreFailure;

    public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, $providerKey, AuthenticationEntryPointInterface $authenticationEntryPoint, LoggerInterface $logger = null)
    {
        if (empty($providerKey)) {
            throw new \InvalidArgumentException('$providerKey must not be empty.');
        }

        $this->securityContext = $securityContext;
        $this->authenticationManager = $authenticationManager;
        $this->providerKey = $providerKey;
        $this->authenticationEntryPoint = $authenticationEntryPoint;
        $this->logger = $logger;
        $this->ignoreFailure = false;
    }

    /**
     * Handles basic authentication.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     */
    public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        if (false === $username = $request->headers->get('PHP_AUTH_USER', false)) {
            return;
        }

        if (null !== $token = $this->securityContext->getToken()) {
            if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() && $token->getUsername() === $username) {
                return;
            }
        }

        if (null !== $this->logger) {
            $this->logger->info(sprintf('Basic Authentication Authorization header found for user "%s"', $username));
        }

        try {
            $token = $this->authenticationManager->authenticate(new UsernamePasswordToken($username, $request->headers->get('PHP_AUTH_PW'), $this->providerKey));
            $this->securityContext->setToken($token);
        } catch (AuthenticationException $failed) {
            $token = $this->securityContext->getToken();
            if ($token instanceof UsernamePasswordToken && $this->providerKey === $token->getProviderKey()) {
                $this->securityContext->setToken(null);
            }

            if (null !== $this->logger) {
                $this->logger->info(sprintf('Authentication request failed for user "%s": %s', $username, $failed->getMessage()));
            }

            if ($this->ignoreFailure) {
                return;
            }

            $event->setResponse($this->authenticationEntryPoint->start($request, $failed));
        }
    }
}
PK�`�\�"?���Apear/Symfony/Component/Security/Http/Firewall/ContextListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * ContextListener manages the SecurityContext persistence through a session.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ContextListener implements ListenerInterface
{
    private $context;
    private $contextKey;
    private $logger;
    private $userProviders;
    private $dispatcher;
    private $registered;

    public function __construct(SecurityContextInterface $context, array $userProviders, $contextKey, LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null)
    {
        if (empty($contextKey)) {
            throw new \InvalidArgumentException('$contextKey must not be empty.');
        }

        foreach ($userProviders as $userProvider) {
            if (!$userProvider instanceof UserProviderInterface) {
                throw new \InvalidArgumentException(sprintf('User provider "%s" must implement "Symfony\Component\Security\Core\User\UserProviderInterface".', get_class($userProvider)));
            }
        }

        $this->context = $context;
        $this->userProviders = $userProviders;
        $this->contextKey = $contextKey;
        $this->logger = $logger;
        $this->dispatcher = $dispatcher;
    }

    /**
     * Reads the SecurityContext from the session.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     */
    public function handle(GetResponseEvent $event)
    {
        if (!$this->registered && null !== $this->dispatcher && $event->isMasterRequest()) {
            $this->dispatcher->addListener(KernelEvents::RESPONSE, array($this, 'onKernelResponse'));
            $this->registered = true;
        }

        $request = $event->getRequest();
        $session = $request->hasPreviousSession() ? $request->getSession() : null;

        if (null === $session || null === $token = $session->get('_security_'.$this->contextKey)) {
            $this->context->setToken(null);

            return;
        }

        $token = unserialize($token);

        if (null !== $this->logger) {
            $this->logger->debug('Read SecurityContext from the session');
        }

        if ($token instanceof TokenInterface) {
            $token = $this->refreshUser($token);
        } elseif (null !== $token) {
            if (null !== $this->logger) {
                $this->logger->warning(sprintf('Session includes a "%s" where a security token is expected', is_object($token) ? get_class($token) : gettype($token)));
            }

            $token = null;
        }

        $this->context->setToken($token);
    }

    /**
     * Writes the SecurityContext to the session.
     *
     * @param FilterResponseEvent $event A FilterResponseEvent instance
     */
    public function onKernelResponse(FilterResponseEvent $event)
    {
        if (!$event->isMasterRequest()) {
            return;
        }

        if (!$event->getRequest()->hasSession()) {
            return;
        }

        if (null !== $this->logger) {
            $this->logger->debug('Write SecurityContext in the session');
        }

        $request = $event->getRequest();
        $session = $request->getSession();

        if (null === $session) {
            return;
        }

        if ((null === $token = $this->context->getToken()) || ($token instanceof AnonymousToken)) {
            if ($request->hasPreviousSession()) {
                $session->remove('_security_'.$this->contextKey);
            }
        } else {
            $session->set('_security_'.$this->contextKey, serialize($token));
        }
    }

    /**
     * Refreshes the user by reloading it from the user provider
     *
     * @param TokenInterface $token
     *
     * @return TokenInterface|null
     *
     * @throws \RuntimeException
     */
    private function refreshUser(TokenInterface $token)
    {
        $user = $token->getUser();
        if (!$user instanceof UserInterface) {
            return $token;
        }

        if (null !== $this->logger) {
            $this->logger->debug(sprintf('Reloading user from user provider.'));
        }

        foreach ($this->userProviders as $provider) {
            try {
                $refreshedUser = $provider->refreshUser($user);
                $token->setUser($refreshedUser);

                if (null !== $this->logger) {
                    $this->logger->debug(sprintf('Username "%s" was reloaded from user provider.', $refreshedUser->getUsername()));
                }

                return $token;
            } catch (UnsupportedUserException $unsupported) {
                // let's try the next user provider
            } catch (UsernameNotFoundException $notFound) {
                if (null !== $this->logger) {
                    $this->logger->warning(sprintf('Username "%s" could not be found.', $notFound->getUsername()));
                }

                return null;
            }
        }

        throw new \RuntimeException(sprintf('There is no user provider for user "%s".', get_class($user)));
    }
}
PK�`�\�Bb

Dpear/Symfony/Component/Security/Http/Firewall/SwitchUserListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Role\SwitchUserRole;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Http\Event\SwitchUserEvent;
use Symfony\Component\Security\Http\SecurityEvents;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * SwitchUserListener allows a user to impersonate another one temporarily
 * (like the Unix su command).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SwitchUserListener implements ListenerInterface
{
    private $securityContext;
    private $provider;
    private $userChecker;
    private $providerKey;
    private $accessDecisionManager;
    private $usernameParameter;
    private $role;
    private $logger;
    private $dispatcher;

    /**
     * Constructor.
     */
    public function __construct(SecurityContextInterface $securityContext, UserProviderInterface $provider, UserCheckerInterface $userChecker, $providerKey, AccessDecisionManagerInterface $accessDecisionManager, LoggerInterface $logger = null, $usernameParameter = '_switch_user', $role = 'ROLE_ALLOWED_TO_SWITCH', EventDispatcherInterface $dispatcher = null)
    {
        if (empty($providerKey)) {
            throw new \InvalidArgumentException('$providerKey must not be empty.');
        }

        $this->securityContext = $securityContext;
        $this->provider = $provider;
        $this->userChecker = $userChecker;
        $this->providerKey = $providerKey;
        $this->accessDecisionManager = $accessDecisionManager;
        $this->usernameParameter = $usernameParameter;
        $this->role = $role;
        $this->logger = $logger;
        $this->dispatcher = $dispatcher;
    }

    /**
     * Handles the switch to another user.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     *
     * @throws \LogicException if switching to a user failed
     */
    public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        if (!$request->get($this->usernameParameter)) {
            return;
        }

        if ('_exit' === $request->get($this->usernameParameter)) {
            $this->securityContext->setToken($this->attemptExitUser($request));
        } else {
            try {
                $this->securityContext->setToken($this->attemptSwitchUser($request));
            } catch (AuthenticationException $e) {
                throw new \LogicException(sprintf('Switch User failed: "%s"', $e->getMessage()));
            }
        }

        $request->query->remove($this->usernameParameter);
        $request->server->set('QUERY_STRING', http_build_query($request->query->all()));

        $response = new RedirectResponse($request->getUri(), 302);

        $event->setResponse($response);
    }

    /**
     * Attempts to switch to another user.
     *
     * @param Request $request A Request instance
     *
     * @return TokenInterface|null The new TokenInterface if successfully switched, null otherwise
     *
     * @throws \LogicException
     * @throws AccessDeniedException
     */
    private function attemptSwitchUser(Request $request)
    {
        $token = $this->securityContext->getToken();
        $originalToken = $this->getOriginalToken($token);

        if (false !== $originalToken) {
            if ($token->getUsername() === $request->get($this->usernameParameter)) {
                return $token;
            } else {
                throw new \LogicException(sprintf('You are already switched to "%s" user.', $token->getUsername()));
            }
        }

        if (false === $this->accessDecisionManager->decide($token, array($this->role))) {
            throw new AccessDeniedException();
        }

        $username = $request->get($this->usernameParameter);

        if (null !== $this->logger) {
            $this->logger->info(sprintf('Attempt to switch to user "%s"', $username));
        }

        $user = $this->provider->loadUserByUsername($username);
        $this->userChecker->checkPostAuth($user);

        $roles = $user->getRoles();
        $roles[] = new SwitchUserRole('ROLE_PREVIOUS_ADMIN', $this->securityContext->getToken());

        $token = new UsernamePasswordToken($user, $user->getPassword(), $this->providerKey, $roles);

        if (null !== $this->dispatcher) {
            $switchEvent = new SwitchUserEvent($request, $token->getUser());
            $this->dispatcher->dispatch(SecurityEvents::SWITCH_USER, $switchEvent);
        }

        return $token;
    }

    /**
     * Attempts to exit from an already switched user.
     *
     * @param Request $request A Request instance
     *
     * @return TokenInterface The original TokenInterface instance
     *
     * @throws AuthenticationCredentialsNotFoundException
     */
    private function attemptExitUser(Request $request)
    {
        if (false === $original = $this->getOriginalToken($this->securityContext->getToken())) {
            throw new AuthenticationCredentialsNotFoundException('Could not find original Token object.');
        }

        if (null !== $this->dispatcher) {
            $switchEvent = new SwitchUserEvent($request, $original->getUser());
            $this->dispatcher->dispatch(SecurityEvents::SWITCH_USER, $switchEvent);
        }

        return $original;
    }

    /**
     * Gets the original Token from a switched one.
     *
     * @param TokenInterface $token A switched TokenInterface instance
     *
     * @return TokenInterface|false The original TokenInterface instance, false if the current TokenInterface is not switched
     */
    private function getOriginalToken(TokenInterface $token)
    {
        foreach ($token->getRoles() as $role) {
            if ($role instanceof SwitchUserRole) {
                return $role->getSource();
            }
        }

        return false;
    }
}
PK�`�\lٯ��Qpear/Symfony/Component/Security/Http/Firewall/AnonymousAuthenticationListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;

/**
 * AnonymousAuthenticationListener automatically adds a Token if none is
 * already present.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class AnonymousAuthenticationListener implements ListenerInterface
{
    private $context;
    private $key;
    private $logger;

    public function __construct(SecurityContextInterface $context, $key, LoggerInterface $logger = null)
    {
        $this->context = $context;
        $this->key     = $key;
        $this->logger  = $logger;
    }

    /**
     * Handles anonymous authentication.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     */
    public function handle(GetResponseEvent $event)
    {
        if (null !== $this->context->getToken()) {
            return;
        }

        $this->context->setToken(new AnonymousToken($this->key, 'anon.', array()));

        if (null !== $this->logger) {
            $this->logger->info('Populated SecurityContext with an anonymous Token');
        }
    }
}
PK�`�\�Z���Rpear/Symfony/Component/Security/Http/Firewall/AbstractPreAuthenticatedListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;

/**
 * AbstractPreAuthenticatedListener is the base class for all listener that
 * authenticates users based on a pre-authenticated request (like a certificate
 * for instance).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class AbstractPreAuthenticatedListener implements ListenerInterface
{
    protected $logger;
    private $securityContext;
    private $authenticationManager;
    private $providerKey;
    private $dispatcher;

    public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, $providerKey, LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null)
    {
        $this->securityContext = $securityContext;
        $this->authenticationManager = $authenticationManager;
        $this->providerKey = $providerKey;
        $this->logger = $logger;
        $this->dispatcher = $dispatcher;
    }

    /**
     * Handles pre-authentication.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     */
    final public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        if (null !== $this->logger) {
            $this->logger->debug(sprintf('Checking secure context token: %s', $this->securityContext->getToken()));
        }

        try {
            list($user, $credentials) = $this->getPreAuthenticatedData($request);
        } catch (BadCredentialsException $exception) {
            $this->clearToken($exception);

            return;
        }

        if (null !== $token = $this->securityContext->getToken()) {
            if ($token instanceof PreAuthenticatedToken && $this->providerKey == $token->getProviderKey() && $token->isAuthenticated() && $token->getUsername() === $user) {
                return;
            }
        }

        if (null !== $this->logger) {
            $this->logger->debug(sprintf('Trying to pre-authenticate user "%s"', $user));
        }

        try {
            $token = $this->authenticationManager->authenticate(new PreAuthenticatedToken($user, $credentials, $this->providerKey));

            if (null !== $this->logger) {
                $this->logger->info(sprintf('Authentication success: %s', $token));
            }
            $this->securityContext->setToken($token);

            if (null !== $this->dispatcher) {
                $loginEvent = new InteractiveLoginEvent($request, $token);
                $this->dispatcher->dispatch(SecurityEvents::INTERACTIVE_LOGIN, $loginEvent);
            }
        } catch (AuthenticationException $failed) {
            $this->clearToken($failed);
        }
    }

    /**
     * Clears a PreAuthenticatedToken for this provider (if present)
     *
     * @param AuthenticationException $exception
     */
    private function clearToken(AuthenticationException $exception)
    {
        $token = $this->securityContext->getToken();
        if ($token instanceof PreAuthenticatedToken && $this->providerKey === $token->getProviderKey()) {
            $this->securityContext->setToken(null);

            if (null !== $this->logger) {
                $this->logger->info(sprintf("Cleared security context due to exception: %s", $exception->getMessage()));
            }
        }
    }

    /**
     * Gets the user and credentials from the Request.
     *
     * @param Request $request A Request instance
     *
     * @return array An array composed of the user and the credentials
     */
    abstract protected function getPreAuthenticatedData(Request $request);
}
PK�`�\��6'6'Ppear/Symfony/Component/Security/Http/Firewall/AbstractAuthenticationListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Security\Http\Session\SessionAuthenticationStrategyInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\SessionUnavailableException;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;
use Symfony\Component\Security\Http\HttpUtils;

/**
 * The AbstractAuthenticationListener is the preferred base class for all
 * browser-/HTTP-based authentication requests.
 *
 * Subclasses likely have to implement the following:
 * - an TokenInterface to hold authentication related data
 * - an AuthenticationProvider to perform the actual authentication of the
 *   token, retrieve the UserInterface implementation from a database, and
 *   perform the specific account checks using the UserChecker
 *
 * By default, this listener only is active for a specific path, e.g.
 * /login_check. If you want to change this behavior, you can overwrite the
 * requiresAuthentication() method.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
abstract class AbstractAuthenticationListener implements ListenerInterface
{
    protected $options;
    protected $logger;
    protected $authenticationManager;
    protected $providerKey;
    protected $httpUtils;

    private $securityContext;
    private $sessionStrategy;
    private $dispatcher;
    private $successHandler;
    private $failureHandler;
    private $rememberMeServices;

    /**
     * Constructor.
     *
     * @param SecurityContextInterface               $securityContext       A SecurityContext instance
     * @param AuthenticationManagerInterface         $authenticationManager An AuthenticationManagerInterface instance
     * @param SessionAuthenticationStrategyInterface $sessionStrategy
     * @param HttpUtils                              $httpUtils             An HttpUtilsInterface instance
     * @param string                                 $providerKey
     * @param AuthenticationSuccessHandlerInterface  $successHandler
     * @param AuthenticationFailureHandlerInterface  $failureHandler
     * @param array                                  $options               An array of options for the processing of a
     *                                                                      successful, or failed authentication attempt
     * @param LoggerInterface                        $logger                A LoggerInterface instance
     * @param EventDispatcherInterface               $dispatcher            An EventDispatcherInterface instance
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager, SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $providerKey, AuthenticationSuccessHandlerInterface $successHandler, AuthenticationFailureHandlerInterface $failureHandler, array $options = array(), LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null)
    {
        if (empty($providerKey)) {
            throw new \InvalidArgumentException('$providerKey must not be empty.');
        }

        $this->securityContext = $securityContext;
        $this->authenticationManager = $authenticationManager;
        $this->sessionStrategy = $sessionStrategy;
        $this->providerKey = $providerKey;
        $this->successHandler = $successHandler;
        $this->failureHandler = $failureHandler;
        $this->options = array_merge(array(
            'check_path'                     => '/login_check',
            'login_path'                     => '/login',
            'always_use_default_target_path' => false,
            'default_target_path'            => '/',
            'target_path_parameter'          => '_target_path',
            'use_referer'                    => false,
            'failure_path'                   => null,
            'failure_forward'                => false,
            'require_previous_session'       => true,
        ), $options);
        $this->logger = $logger;
        $this->dispatcher = $dispatcher;
        $this->httpUtils = $httpUtils;
    }

    /**
     * Sets the RememberMeServices implementation to use
     *
     * @param RememberMeServicesInterface $rememberMeServices
     */
    public function setRememberMeServices(RememberMeServicesInterface $rememberMeServices)
    {
        $this->rememberMeServices = $rememberMeServices;
    }

    /**
     * Handles form based authentication.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     *
     * @throws \RuntimeException
     * @throws SessionUnavailableException
     */
    final public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        if (!$this->requiresAuthentication($request)) {
            return;
        }

        if (!$request->hasSession()) {
            throw new \RuntimeException('This authentication method requires a session.');
        }

        try {
            if ($this->options['require_previous_session'] && !$request->hasPreviousSession()) {
                throw new SessionUnavailableException('Your session has timed out, or you have disabled cookies.');
            }

            if (null === $returnValue = $this->attemptAuthentication($request)) {
                return;
            }

            if ($returnValue instanceof TokenInterface) {
                $this->sessionStrategy->onAuthentication($request, $returnValue);

                $response = $this->onSuccess($event, $request, $returnValue);
            } elseif ($returnValue instanceof Response) {
                $response = $returnValue;
            } else {
                throw new \RuntimeException('attemptAuthentication() must either return a Response, an implementation of TokenInterface, or null.');
            }
        } catch (AuthenticationException $e) {
            $response = $this->onFailure($event, $request, $e);
        }

        $event->setResponse($response);
    }

    /**
     * Whether this request requires authentication.
     *
     * The default implementation only processes requests to a specific path,
     * but a subclass could change this to only authenticate requests where a
     * certain parameters is present.
     *
     * @param Request $request
     *
     * @return Boolean
     */
    protected function requiresAuthentication(Request $request)
    {
        return $this->httpUtils->checkRequestPath($request, $this->options['check_path']);
    }

    /**
     * Performs authentication.
     *
     * @param Request $request A Request instance
     *
     * @return TokenInterface|Response|null The authenticated token, null if full authentication is not possible, or a Response
     *
     * @throws AuthenticationException if the authentication fails
     */
    abstract protected function attemptAuthentication(Request $request);

    private function onFailure(GetResponseEvent $event, Request $request, AuthenticationException $failed)
    {
        if (null !== $this->logger) {
            $this->logger->info(sprintf('Authentication request failed: %s', $failed->getMessage()));
        }

        $token = $this->securityContext->getToken();
        if ($token instanceof UsernamePasswordToken && $this->providerKey === $token->getProviderKey()) {
            $this->securityContext->setToken(null);
        }

        $response = $this->failureHandler->onAuthenticationFailure($request, $failed);

        if (!$response instanceof Response) {
            throw new \RuntimeException('Authentication Failure Handler did not return a Response.');
        }

        return $response;
    }

    private function onSuccess(GetResponseEvent $event, Request $request, TokenInterface $token)
    {
        if (null !== $this->logger) {
            $this->logger->info(sprintf('User "%s" has been authenticated successfully', $token->getUsername()));
        }

        $this->securityContext->setToken($token);

        $session = $request->getSession();
        $session->remove(SecurityContextInterface::AUTHENTICATION_ERROR);
        $session->remove(SecurityContextInterface::LAST_USERNAME);

        if (null !== $this->dispatcher) {
            $loginEvent = new InteractiveLoginEvent($request, $token);
            $this->dispatcher->dispatch(SecurityEvents::INTERACTIVE_LOGIN, $loginEvent);
        }

        $response = $this->successHandler->onAuthenticationSuccess($request, $token);

        if (!$response instanceof Response) {
            throw new \RuntimeException('Authentication Success Handler did not return a Response.');
        }

        if (null !== $this->rememberMeServices) {
            $this->rememberMeServices->loginSuccess($request, $response, $token);
        }

        return $response;
    }
}
PK�`�\׿ͼ� � Npear/Symfony/Component/Security/Http/Firewall/DigestAuthenticationListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Http\EntryPoint\DigestAuthenticationEntryPoint;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
use Symfony\Component\Security\Core\Exception\AuthenticationServiceException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\NonceExpiredException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\AuthenticationException;

/**
 * DigestAuthenticationListener implements Digest HTTP authentication.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DigestAuthenticationListener implements ListenerInterface
{
    private $securityContext;
    private $provider;
    private $providerKey;
    private $authenticationEntryPoint;
    private $logger;

    public function __construct(SecurityContextInterface $securityContext, UserProviderInterface $provider, $providerKey, DigestAuthenticationEntryPoint $authenticationEntryPoint, LoggerInterface $logger = null)
    {
        if (empty($providerKey)) {
            throw new \InvalidArgumentException('$providerKey must not be empty.');
        }

        $this->securityContext = $securityContext;
        $this->provider = $provider;
        $this->providerKey = $providerKey;
        $this->authenticationEntryPoint = $authenticationEntryPoint;
        $this->logger = $logger;
    }

    /**
     * Handles digest authentication.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     *
     * @throws AuthenticationServiceException
     */
    public function handle(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        if (!$header = $request->server->get('PHP_AUTH_DIGEST')) {
            return;
        }

        $digestAuth = new DigestData($header);

        if (null !== $token = $this->securityContext->getToken()) {
            if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() && $token->getUsername() === $digestAuth->getUsername()) {
                return;
            }
        }

        if (null !== $this->logger) {
            $this->logger->debug(sprintf('Digest Authorization header received from user agent: %s', $header));
        }

        try {
            $digestAuth->validateAndDecode($this->authenticationEntryPoint->getKey(), $this->authenticationEntryPoint->getRealmName());
        } catch (BadCredentialsException $e) {
            $this->fail($event, $request, $e);

            return;
        }

        try {
            $user = $this->provider->loadUserByUsername($digestAuth->getUsername());

            if (null === $user) {
                throw new AuthenticationServiceException('AuthenticationDao returned null, which is an interface contract violation');
            }

            $serverDigestMd5 = $digestAuth->calculateServerDigest($user->getPassword(), $request->getMethod());
        } catch (UsernameNotFoundException $notFound) {
            $this->fail($event, $request, new BadCredentialsException(sprintf('Username %s not found.', $digestAuth->getUsername())));

            return;
        }

        if ($serverDigestMd5 !== $digestAuth->getResponse()) {
            if (null !== $this->logger) {
                $this->logger->debug(sprintf("Expected response: '%s' but received: '%s'; is AuthenticationDao returning clear text passwords?", $serverDigestMd5, $digestAuth->getResponse()));
            }

            $this->fail($event, $request, new BadCredentialsException('Incorrect response'));

            return;
        }

        if ($digestAuth->isNonceExpired()) {
            $this->fail($event, $request, new NonceExpiredException('Nonce has expired/timed out.'));

            return;
        }

        if (null !== $this->logger) {
            $this->logger->info(sprintf('Authentication success for user "%s" with response "%s"', $digestAuth->getUsername(), $digestAuth->getResponse()));
        }

        $this->securityContext->setToken(new UsernamePasswordToken($user, $user->getPassword(), $this->providerKey));
    }

    private function fail(GetResponseEvent $event, Request $request, AuthenticationException $authException)
    {
        $token = $this->securityContext->getToken();
        if ($token instanceof UsernamePasswordToken && $this->providerKey === $token->getProviderKey()) {
            $this->securityContext->setToken(null);
        }

        if (null !== $this->logger) {
            $this->logger->info($authException);
        }

        $event->setResponse($this->authenticationEntryPoint->start($request, $authException));
    }
}

class DigestData
{
    private $elements = array();
    private $header;
    private $nonceExpiryTime;

    public function __construct($header)
    {
        $this->header = $header;
        preg_match_all('/(\w+)=("((?:[^"\\\\]|\\\\.)+)"|([^\s,$]+))/', $header, $matches, PREG_SET_ORDER);
        foreach ($matches as $match) {
            if (isset($match[1]) && isset($match[3])) {
                $this->elements[$match[1]] = isset($match[4]) ? $match[4] : $match[3];
            }
        }
    }

    public function getResponse()
    {
        return $this->elements['response'];
    }

    public function getUsername()
    {
        return strtr($this->elements['username'], array("\\\"" => "\"", "\\\\" => "\\"));
    }

    public function validateAndDecode($entryPointKey, $expectedRealm)
    {
        if ($keys = array_diff(array('username', 'realm', 'nonce', 'uri', 'response'), array_keys($this->elements))) {
            throw new BadCredentialsException(sprintf('Missing mandatory digest value; received header "%s" (%s)', $this->header, implode(', ', $keys)));
        }

        if ('auth' === $this->elements['qop']) {
            if (!isset($this->elements['nc']) || !isset($this->elements['cnonce'])) {
                throw new BadCredentialsException(sprintf('Missing mandatory digest value; received header "%s"', $this->header));
            }
        }

        if ($expectedRealm !== $this->elements['realm']) {
            throw new BadCredentialsException(sprintf('Response realm name "%s" does not match system realm name of "%s".', $this->elements['realm'], $expectedRealm));
        }

        if (false === $nonceAsPlainText = base64_decode($this->elements['nonce'])) {
            throw new BadCredentialsException(sprintf('Nonce is not encoded in Base64; received nonce "%s".', $this->elements['nonce']));
        }

        $nonceTokens = explode(':', $nonceAsPlainText);

        if (2 !== count($nonceTokens)) {
            throw new BadCredentialsException(sprintf('Nonce should have yielded two tokens but was "%s".', $nonceAsPlainText));
        }

        $this->nonceExpiryTime = $nonceTokens[0];

        if (md5($this->nonceExpiryTime.':'.$entryPointKey) !== $nonceTokens[1]) {
            throw new BadCredentialsException(sprintf('Nonce token compromised "%s".', $nonceAsPlainText));
        }
    }

    public function calculateServerDigest($password, $httpMethod)
    {
        $a2Md5 = md5(strtoupper($httpMethod).':'.$this->elements['uri']);
        $a1Md5 = md5($this->elements['username'].':'.$this->elements['realm'].':'.$password);

        $digest = $a1Md5.':'.$this->elements['nonce'];
        if (!isset($this->elements['qop'])) {
        } elseif ('auth' === $this->elements['qop']) {
            $digest .= ':'.$this->elements['nc'].':'.$this->elements['cnonce'].':'.$this->elements['qop'];
        } else {
            throw new \InvalidArgumentException('This method does not support a qop: "%s".', $this->elements['qop']);
        }
        $digest .= ':'.$a2Md5;

        return md5($digest);
    }

    public function isNonceExpired()
    {
        return $this->nonceExpiryTime < microtime(true);
    }
}
PK�`�\nz+S�
�
Dpear/Symfony/Component/Security/Http/Firewall/RememberMeListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Firewall;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * RememberMeListener implements authentication capabilities via a cookie
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class RememberMeListener implements ListenerInterface
{
    private $securityContext;
    private $rememberMeServices;
    private $authenticationManager;
    private $logger;
    private $dispatcher;

    /**
     * Constructor.
     *
     * @param SecurityContextInterface       $securityContext
     * @param RememberMeServicesInterface    $rememberMeServices
     * @param AuthenticationManagerInterface $authenticationManager
     * @param LoggerInterface                $logger
     * @param EventDispatcherInterface       $dispatcher
     */
    public function __construct(SecurityContextInterface $securityContext, RememberMeServicesInterface $rememberMeServices, AuthenticationManagerInterface $authenticationManager, LoggerInterface $logger = null, EventDispatcherInterface $dispatcher = null)
    {
        $this->securityContext = $securityContext;
        $this->rememberMeServices = $rememberMeServices;
        $this->authenticationManager = $authenticationManager;
        $this->logger = $logger;
        $this->dispatcher = $dispatcher;
    }

    /**
     * Handles remember-me cookie based authentication.
     *
     * @param GetResponseEvent $event A GetResponseEvent instance
     */
    public function handle(GetResponseEvent $event)
    {
        if (null !== $this->securityContext->getToken()) {
            return;
        }

        $request = $event->getRequest();
        if (null === $token = $this->rememberMeServices->autoLogin($request)) {
            return;
        }

        try {
            $token = $this->authenticationManager->authenticate($token);
            $this->securityContext->setToken($token);

            if (null !== $this->dispatcher) {
                $loginEvent = new InteractiveLoginEvent($request, $token);
                $this->dispatcher->dispatch(SecurityEvents::INTERACTIVE_LOGIN, $loginEvent);
            }

            if (null !== $this->logger) {
                $this->logger->debug('SecurityContext populated with remember-me token.');
            }
        } catch (AuthenticationException $failed) {
            if (null !== $this->logger) {
                $this->logger->warning(
                    'SecurityContext not populated with remember-me token as the'
                   .' AuthenticationManager rejected the AuthenticationToken returned'
                   .' by the RememberMeServices: '.$failed->getMessage()
                );
            }

            $this->rememberMeServices->loginFail($request);
        }
    }
}
PK�`�\�a�$��Ppear/Symfony/Component/Security/Http/RememberMe/TokenBasedRememberMeServices.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\RememberMe;

use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * Concrete implementation of the RememberMeServicesInterface providing
 * remember-me capabilities without requiring a TokenProvider.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class TokenBasedRememberMeServices extends AbstractRememberMeServices
{
    /**
     * {@inheritDoc}
     */
    protected function processAutoLoginCookie(array $cookieParts, Request $request)
    {
        if (count($cookieParts) !== 4) {
            throw new AuthenticationException('The cookie is invalid.');
        }

        list($class, $username, $expires, $hash) = $cookieParts;
        if (false === $username = base64_decode($username, true)) {
            throw new AuthenticationException('$username contains a character from outside the base64 alphabet.');
        }
        try {
            $user = $this->getUserProvider($class)->loadUserByUsername($username);
        } catch (\Exception $ex) {
            if (!$ex instanceof AuthenticationException) {
                $ex = new AuthenticationException($ex->getMessage(), $ex->getCode(), $ex);
            }

            throw $ex;
        }

        if (!$user instanceof UserInterface) {
            throw new \RuntimeException(sprintf('The UserProviderInterface implementation must return an instance of UserInterface, but returned "%s".', get_class($user)));
        }

        if (true !== $this->compareHashes($hash, $this->generateCookieHash($class, $username, $expires, $user->getPassword()))) {
            throw new AuthenticationException('The cookie\'s hash is invalid.');
        }

        if ($expires < time()) {
            throw new AuthenticationException('The cookie has expired.');
        }

        return $user;
    }

    /**
     * Compares two hashes using a constant-time algorithm to avoid (remote)
     * timing attacks.
     *
     * This is the same implementation as used in the BasePasswordEncoder.
     *
     * @param string $hash1 The first hash
     * @param string $hash2 The second hash
     *
     * @return Boolean true if the two hashes are the same, false otherwise
     */
    private function compareHashes($hash1, $hash2)
    {
        if (strlen($hash1) !== $c = strlen($hash2)) {
            return false;
        }

        $result = 0;
        for ($i = 0; $i < $c; $i++) {
            $result |= ord($hash1[$i]) ^ ord($hash2[$i]);
        }

        return 0 === $result;
    }

    /**
     * {@inheritDoc}
     */
    protected function onLoginSuccess(Request $request, Response $response, TokenInterface $token)
    {
        $user = $token->getUser();
        $expires = time() + $this->options['lifetime'];
        $value = $this->generateCookieValue(get_class($user), $user->getUsername(), $expires, $user->getPassword());

        $response->headers->setCookie(
            new Cookie(
                $this->options['name'],
                $value,
                $expires,
                $this->options['path'],
                $this->options['domain'],
                $this->options['secure'],
                $this->options['httponly']
            )
        );
    }

    /**
     * Generates the cookie value.
     *
     * @param string  $class
     * @param string  $username The username
     * @param integer $expires  The Unix timestamp when the cookie expires
     * @param string  $password The encoded password
     *
     * @throws \RuntimeException if username contains invalid chars
     *
     * @return string
     */
    protected function generateCookieValue($class, $username, $expires, $password)
    {
        return $this->encodeCookie(array(
            $class,
            base64_encode($username),
            $expires,
            $this->generateCookieHash($class, $username, $expires, $password)
        ));
    }

    /**
     * Generates a hash for the cookie to ensure it is not being tempered with
     *
     * @param string  $class
     * @param string  $username The username
     * @param integer $expires  The Unix timestamp when the cookie expires
     * @param string  $password The encoded password
     *
     * @throws \RuntimeException when the private key is empty
     *
     * @return string
     */
    protected function generateCookieHash($class, $username, $expires, $password)
    {
        return hash_hmac('sha256', $class.$username.$expires.$password, $this->getKey());
    }
}
PK�`�\P�ڕ��Dpear/Symfony/Component/Security/Http/RememberMe/ResponseListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\RememberMe;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Adds remember-me cookies to the Response.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ResponseListener implements EventSubscriberInterface
{
    /**
     * @param FilterResponseEvent $event
     */
    public function onKernelResponse(FilterResponseEvent $event)
    {
        $request = $event->getRequest();
        $response = $event->getResponse();

        if ($request->attributes->has(RememberMeServicesInterface::COOKIE_ATTR_NAME)) {
            $response->headers->setCookie($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME));
        }
    }

    /**
     * {@inheritDoc}
     */
    public static function getSubscribedEvents()
    {
        return array(KernelEvents::RESPONSE => 'onKernelResponse');
    }
}
PK�`�\�*�b�&�&Npear/Symfony/Component/Security/Http/RememberMe/AbstractRememberMeServices.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\RememberMe;

use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
use Symfony\Component\Security\Http\Logout\LogoutHandlerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\CookieTheftException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Cookie;
use Psr\Log\LoggerInterface;

/**
 * Base class implementing the RememberMeServicesInterface
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
abstract class AbstractRememberMeServices implements RememberMeServicesInterface, LogoutHandlerInterface
{
    const COOKIE_DELIMITER = ':';

    protected $logger;
    protected $options;
    private $providerKey;
    private $key;
    private $userProviders;

    /**
     * Constructor.
     *
     * @param array           $userProviders
     * @param string          $key
     * @param string          $providerKey
     * @param array           $options
     * @param LoggerInterface $logger
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(array $userProviders, $key, $providerKey, array $options = array(), LoggerInterface $logger = null)
    {
        if (empty($key)) {
            throw new \InvalidArgumentException('$key must not be empty.');
        }
        if (empty($providerKey)) {
            throw new \InvalidArgumentException('$providerKey must not be empty.');
        }
        if (0 === count($userProviders)) {
            throw new \InvalidArgumentException('You must provide at least one user provider.');
        }

        $this->userProviders = $userProviders;
        $this->key = $key;
        $this->providerKey = $providerKey;
        $this->options = $options;
        $this->logger = $logger;
    }

    /**
     * Returns the parameter that is used for checking whether remember-me
     * services have been requested.
     *
     * @return string
     */
    public function getRememberMeParameter()
    {
        return $this->options['remember_me_parameter'];
    }

    /**
     * @return string
     */
    public function getKey()
    {
        return $this->key;
    }

    /**
     * Implementation of RememberMeServicesInterface. Detects whether a remember-me
     * cookie was set, decodes it, and hands it to subclasses for further processing.
     *
     * @param Request $request
     *
     * @return TokenInterface|null
     *
     * @throws CookieTheftException
     * @throws \RuntimeException
     */
    final public function autoLogin(Request $request)
    {
        if (null === $cookie = $request->cookies->get($this->options['name'])) {
            return;
        }

        if (null !== $this->logger) {
            $this->logger->debug('Remember-me cookie detected.');
        }

        $cookieParts = $this->decodeCookie($cookie);

        try {
            $user = $this->processAutoLoginCookie($cookieParts, $request);

            if (!$user instanceof UserInterface) {
                throw new \RuntimeException('processAutoLoginCookie() must return a UserInterface implementation.');
            }

            if (null !== $this->logger) {
                $this->logger->info('Remember-me cookie accepted.');
            }

            return new RememberMeToken($user, $this->providerKey, $this->key);
        } catch (CookieTheftException $theft) {
            $this->cancelCookie($request);

            throw $theft;
        } catch (UsernameNotFoundException $notFound) {
            if (null !== $this->logger) {
                $this->logger->info('User for remember-me cookie not found.');
            }
        } catch (UnsupportedUserException $unSupported) {
            if (null !== $this->logger) {
                $this->logger->warning('User class for remember-me cookie not supported.');
            }
        } catch (AuthenticationException $invalid) {
            if (null !== $this->logger) {
                $this->logger->debug('Remember-Me authentication failed: '.$invalid->getMessage());
            }
        }

        $this->cancelCookie($request);

        return null;
    }

    /**
     * Implementation for LogoutHandlerInterface. Deletes the cookie.
     *
     * @param Request        $request
     * @param Response       $response
     * @param TokenInterface $token
     */
    public function logout(Request $request, Response $response, TokenInterface $token)
    {
        $this->cancelCookie($request);
    }

    /**
     * Implementation for RememberMeServicesInterface. Deletes the cookie when
     * an attempted authentication fails.
     *
     * @param Request $request
     */
    final public function loginFail(Request $request)
    {
        $this->cancelCookie($request);
        $this->onLoginFail($request);
    }

    /**
     * Implementation for RememberMeServicesInterface. This is called when an
     * authentication is successful.
     *
     * @param Request        $request
     * @param Response       $response
     * @param TokenInterface $token    The token that resulted in a successful authentication
     */
    final public function loginSuccess(Request $request, Response $response, TokenInterface $token)
    {
        // Make sure any old remember-me cookies are cancelled
        $this->cancelCookie($request);

        if (!$token->getUser() instanceof UserInterface) {
            if (null !== $this->logger) {
                $this->logger->debug('Remember-me ignores token since it does not contain a UserInterface implementation.');
            }

            return;
        }

        if (!$this->isRememberMeRequested($request)) {
            if (null !== $this->logger) {
                $this->logger->debug('Remember-me was not requested.');
            }

            return;
        }

        if (null !== $this->logger) {
            $this->logger->debug('Remember-me was requested; setting cookie.');
        }

        // Remove attribute from request that sets a NULL cookie.
        // It was set by $this->cancelCookie()
        // (cancelCookie does other things too for some RememberMeServices
        // so we should still call it at the start of this method)
        $request->attributes->remove(self::COOKIE_ATTR_NAME);

        $this->onLoginSuccess($request, $response, $token);
    }

    /**
     * Subclasses should validate the cookie and do any additional processing
     * that is required. This is called from autoLogin().
     *
     * @param array   $cookieParts
     * @param Request $request
     *
     * @return TokenInterface
     */
    abstract protected function processAutoLoginCookie(array $cookieParts, Request $request);

    /**
     * @param Request $request
     */
    protected function onLoginFail(Request $request)
    {
    }

    /**
     * This is called after a user has been logged in successfully, and has
     * requested remember-me capabilities. The implementation usually sets a
     * cookie and possibly stores a persistent record of it.
     *
     * @param Request        $request
     * @param Response       $response
     * @param TokenInterface $token
     */
    abstract protected function onLoginSuccess(Request $request, Response $response, TokenInterface $token);

    final protected function getUserProvider($class)
    {
        foreach ($this->userProviders as $provider) {
            if ($provider->supportsClass($class)) {
                return $provider;
            }
        }

        throw new UnsupportedUserException(sprintf('There is no user provider that supports class "%s".', $class));
    }

    /**
     * Decodes the raw cookie value
     *
     * @param string $rawCookie
     *
     * @return array
     */
    protected function decodeCookie($rawCookie)
    {
        return explode(self::COOKIE_DELIMITER, base64_decode($rawCookie));
    }

    /**
     * Encodes the cookie parts
     *
     * @param array $cookieParts
     *
     * @return string
     */
    protected function encodeCookie(array $cookieParts)
    {
        return base64_encode(implode(self::COOKIE_DELIMITER, $cookieParts));
    }

    /**
     * Deletes the remember-me cookie
     *
     * @param Request $request
     */
    protected function cancelCookie(Request $request)
    {
        if (null !== $this->logger) {
            $this->logger->debug(sprintf('Clearing remember-me cookie "%s"', $this->options['name']));
        }

        $request->attributes->set(self::COOKIE_ATTR_NAME, new Cookie($this->options['name'], null, 1, $this->options['path'], $this->options['domain']));
    }

    /**
     * Checks whether remember-me capabilities were requested
     *
     * @param Request $request
     *
     * @return Boolean
     */
    protected function isRememberMeRequested(Request $request)
    {
        if (true === $this->options['always_remember_me']) {
            return true;
        }

        $parameter = $request->get($this->options['remember_me_parameter'], null, true);

        if ($parameter === null && null !== $this->logger) {
            $this->logger->debug(sprintf('Did not send remember-me cookie (remember-me parameter "%s" was not sent).', $this->options['remember_me_parameter']));
        }

        return $parameter === 'true' || $parameter === 'on' || $parameter === '1' || $parameter === 'yes';
    }
}
PK�`�\	z��Opear/Symfony/Component/Security/Http/RememberMe/RememberMeServicesInterface.phpnu�[���<?php
namespace Symfony\Component\Security\Http\RememberMe;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

/**
 * Interface that needs to be implemented by classes which provide remember-me
 * capabilities.
 *
 * We provide two implementations out-of-the-box:
 * - TokenBasedRememberMeServices (does not require a TokenProvider)
 * - PersistentTokenBasedRememberMeServices (requires a TokenProvider)
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface RememberMeServicesInterface
{
    /**
     * This attribute name can be used by the implementation if it needs to set
     * a cookie on the Request when there is no actual Response, yet.
     *
     * @var string
     */
    const COOKIE_ATTR_NAME = '_security_remember_me_cookie';

    /**
     * This method will be called whenever the SecurityContext does not contain
     * an TokenInterface object and the framework wishes to provide an implementation
     * with an opportunity to authenticate the request using remember-me capabilities.
     *
     * No attempt whatsoever is made to determine whether the browser has requested
     * remember-me services or presented a valid cookie. Any and all such determinations
     * are left to the implementation of this method.
     *
     * If a browser has presented an unauthorised cookie for whatever reason,
     * make sure to throw an AuthenticationException as this will consequentially
     * result in a call to loginFail() and therefore an invalidation of the cookie.
     *
     * @param Request $request
     *
     * @return TokenInterface
     */
    public function autoLogin(Request $request);

    /**
     * Called whenever an interactive authentication attempt was made, but the
     * credentials supplied by the user were missing or otherwise invalid.
     *
     * This method needs to take care of invalidating the cookie.
     *
     * @param Request $request
     */
    public function loginFail(Request $request);

    /**
     * Called whenever an interactive authentication attempt is successful
     * (e.g. a form login).
     *
     * An implementation may always set a remember-me cookie in the Response,
     * although this is not recommended.
     *
     * Instead, implementations should typically look for a request parameter
     * (such as a HTTP POST parameter) that indicates the browser has explicitly
     * requested for the authentication to be remembered.
     *
     * @param Request        $request
     * @param Response       $response
     * @param TokenInterface $token
     */
    public function loginSuccess(Request $request, Response $response, TokenInterface $token);
}
PK�`�\���s44Zpear/Symfony/Component/Security/Http/RememberMe/PersistentTokenBasedRememberMeServices.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\RememberMe;

use Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\CookieTheftException;
use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Util\SecureRandomInterface;
use Psr\Log\LoggerInterface;

/**
 * Concrete implementation of the RememberMeServicesInterface which needs
 * an implementation of TokenProviderInterface for providing remember-me
 * capabilities.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class PersistentTokenBasedRememberMeServices extends AbstractRememberMeServices
{
    private $tokenProvider;
    private $secureRandom;

    /**
     * Constructor.
     *
     * @param array                 $userProviders
     * @param string                $key
     * @param string                $providerKey
     * @param array                 $options
     * @param LoggerInterface       $logger
     * @param SecureRandomInterface $secureRandom
     */
    public function __construct(array $userProviders, $key, $providerKey, array $options = array(), LoggerInterface $logger = null, SecureRandomInterface $secureRandom)
    {
        parent::__construct($userProviders, $key, $providerKey, $options, $logger);

        $this->secureRandom = $secureRandom;
    }

    /**
     * Sets the token provider
     *
     * @param TokenProviderInterface $tokenProvider
     */
    public function setTokenProvider(TokenProviderInterface $tokenProvider)
    {
        $this->tokenProvider = $tokenProvider;
    }

    /**
     * {@inheritDoc}
     */
    protected function cancelCookie(Request $request)
    {
        // Delete cookie on the client
        parent::cancelCookie($request);

        // Delete cookie from the tokenProvider
        if (null !== ($cookie = $request->cookies->get($this->options['name']))
            && count($parts = $this->decodeCookie($cookie)) === 2
        ) {
            list($series, $tokenValue) = $parts;
            $this->tokenProvider->deleteTokenBySeries($series);
        }
    }

    /**
     * {@inheritDoc}
     */
    protected function processAutoLoginCookie(array $cookieParts, Request $request)
    {
        if (count($cookieParts) !== 2) {
            throw new AuthenticationException('The cookie is invalid.');
        }

        list($series, $tokenValue) = $cookieParts;
        $persistentToken = $this->tokenProvider->loadTokenBySeries($series);

        if ($persistentToken->getTokenValue() !== $tokenValue) {
            throw new CookieTheftException('This token was already used. The account is possibly compromised.');
        }

        if ($persistentToken->getLastUsed()->getTimestamp() + $this->options['lifetime'] < time()) {
            throw new AuthenticationException('The cookie has expired.');
        }

        $series = $persistentToken->getSeries();
        $tokenValue = base64_encode($this->secureRandom->nextBytes(64));
        $this->tokenProvider->updateToken($series, $tokenValue, new \DateTime());
        $request->attributes->set(self::COOKIE_ATTR_NAME,
            new Cookie(
                $this->options['name'],
                $this->encodeCookie(array($series, $tokenValue)),
                time() + $this->options['lifetime'],
                $this->options['path'],
                $this->options['domain'],
                $this->options['secure'],
                $this->options['httponly']
            )
        );

        return $this->getUserProvider($persistentToken->getClass())->loadUserByUsername($persistentToken->getUsername());
    }

    /**
     * {@inheritDoc}
     */
    protected function onLoginSuccess(Request $request, Response $response, TokenInterface $token)
    {
        $series = base64_encode($this->secureRandom->nextBytes(64));
        $tokenValue = base64_encode($this->secureRandom->nextBytes(64));

        $this->tokenProvider->createNewToken(
            new PersistentToken(
                get_class($user = $token->getUser()),
                $user->getUsername(),
                $series,
                $tokenValue,
                new \DateTime()
            )
        );

        $response->headers->setCookie(
            new Cookie(
                $this->options['name'],
                $this->encodeCookie(array($series, $tokenValue)),
                time() + $this->options['lifetime'],
                $this->options['path'],
                $this->options['domain'],
                $this->options['secure'],
                $this->options['httponly']
            )
        );
    }
}
PK�`�\��W"RR.pear/Symfony/Component/Security/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Security\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�`�\�Õ�

:pear/Symfony/Component/Security/Core/Util/SecureRandom.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Util;

use Psr\Log\LoggerInterface;

/**
 * A secure random number generator implementation.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
final class SecureRandom implements SecureRandomInterface
{
    private $logger;
    private $useOpenSsl;
    private $seed;
    private $seedUpdated;
    private $seedLastUpdatedAt;
    private $seedFile;

    /**
     * Constructor.
     *
     * Be aware that a guessable seed will severely compromise the PRNG
     * algorithm that is employed.
     *
     * @param string          $seedFile
     * @param LoggerInterface $logger
     */
    public function __construct($seedFile = null, LoggerInterface $logger = null)
    {
        $this->seedFile = $seedFile;
        $this->logger = $logger;

        // determine whether to use OpenSSL
        if (defined('PHP_WINDOWS_VERSION_BUILD') && version_compare(PHP_VERSION, '5.3.4', '<')) {
            $this->useOpenSsl = false;
        } elseif (!function_exists('openssl_random_pseudo_bytes')) {
            if (null !== $this->logger) {
                $this->logger->notice('It is recommended that you enable the "openssl" extension for random number generation.');
            }
            $this->useOpenSsl = false;
        } else {
            $this->useOpenSsl = true;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function nextBytes($nbBytes)
    {
        // try OpenSSL
        if ($this->useOpenSsl) {
            $bytes = openssl_random_pseudo_bytes($nbBytes, $strong);

            if (false !== $bytes && true === $strong) {
                return $bytes;
            }

            if (null !== $this->logger) {
                $this->logger->info('OpenSSL did not produce a secure random number.');
            }
        }

        // initialize seed
        if (null === $this->seed) {
            if (null === $this->seedFile) {
                throw new \RuntimeException('You need to specify a file path to store the seed.');
            }

            if (is_file($this->seedFile)) {
                list($this->seed, $this->seedLastUpdatedAt) = $this->readSeed();
            } else {
                $this->seed = uniqid(mt_rand(), true);
                $this->updateSeed();
            }
        }

        $bytes = '';
        while (strlen($bytes) < $nbBytes) {
            static $incr = 1;
            $bytes .= hash('sha512', $incr++.$this->seed.uniqid(mt_rand(), true).$nbBytes, true);
            $this->seed = base64_encode(hash('sha512', $this->seed.$bytes.$nbBytes, true));
            $this->updateSeed();
        }

        return substr($bytes, 0, $nbBytes);
    }

    private function readSeed()
    {
        return json_decode(file_get_contents($this->seedFile));
    }

    private function updateSeed()
    {
        if (!$this->seedUpdated && $this->seedLastUpdatedAt < time() - mt_rand(1, 10)) {
            file_put_contents($this->seedFile, json_encode(array($this->seed, microtime(true))));
        }

        $this->seedUpdated = true;
    }
}
PK�`�\U��a��9pear/Symfony/Component/Security/Core/Util/StringUtils.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Util;

/**
 * String utility functions.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class StringUtils
{
    /**
     * This class should not be instantiated
     */
    private function __construct() {}

    /**
     * Compares two strings.
     *
     * This method implements a constant-time algorithm to compare strings.
     *
     * @param string $knownString The string of known length to compare against
     * @param string $userInput   The string that the user can control
     *
     * @return Boolean true if the two strings are the same, false otherwise
     */
    public static function equals($knownString, $userInput)
    {
        // Prevent issues if string length is 0
        $knownString .= chr(0);
        $userInput .= chr(0);

        $knownLen = strlen($knownString);
        $userLen = strlen($userInput);

        // Set the result to the difference between the lengths
        $result = $knownLen - $userLen;

        // Note that we ALWAYS iterate over the user-supplied length
        // This is to prevent leaking length information
        for ($i = 0; $i < $userLen; $i++) {
            // Using % here is a trick to prevent notices
            // It's safe, since if the lengths are different
            // $result is already non-0
            $result |= (ord($knownString[$i % $knownLen]) ^ ord($userInput[$i]));
        }

        // They are only identical strings if $result is exactly 0...
        return 0 === $result;
    }
}
PK�`�\��T�,,8pear/Symfony/Component/Security/Core/Util/ClassUtils.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Util;

/**
 * Class related functionality for objects that
 * might or might not be proxy objects at the moment.
 *
 * @see Doctrine\Common\Util\ClassUtils
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 * @author Johannes Schmitt <schmittjoh@gmail.com>
 */
class ClassUtils
{
    /**
     * Marker for Proxy class names.
     *
     * @var string
     */
    const MARKER = '__CG__';

    /**
     * Length of the proxy marker
     *
     * @var int
     */
    const MARKER_LENGTH = 6;

    /**
     * This class should not be instantiated
     */
    private function __construct() {}

    /**
     * Gets the real class name of a class name that could be a proxy.
     *
     * @param string|object
     * @return string
     */
    public static function getRealClass($object)
    {
        $class = is_object($object) ? get_class($object) : $object;

        if (false === $pos = strrpos($class, '\\'.self::MARKER.'\\')) {
            return $class;
        }

        return substr($class, $pos + self::MARKER_LENGTH + 2);
    }
}
PK�`�\�	���Cpear/Symfony/Component/Security/Core/Util/SecureRandomInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Util;

/**
 * Interface that needs to be implemented by all secure random number generators.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface SecureRandomInterface
{
    /**
     * Generates the specified number of secure random bytes.
     *
     * @param integer $nbBytes
     *
     * @return string
     */
    public function nextBytes($nbBytes);
}
PK�`�\� �w??;pear/Symfony/Component/Security/Core/Role/RoleHierarchy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Role;

/**
 * RoleHierarchy defines a role hierarchy.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class RoleHierarchy implements RoleHierarchyInterface
{
    private $hierarchy;
    private $map;

    /**
     * Constructor.
     *
     * @param array $hierarchy An array defining the hierarchy
     */
    public function __construct(array $hierarchy)
    {
        $this->hierarchy = $hierarchy;

        $this->buildRoleMap();
    }

    /**
     * {@inheritdoc}
     */
    public function getReachableRoles(array $roles)
    {
        $reachableRoles = $roles;
        foreach ($roles as $role) {
            if (!isset($this->map[$role->getRole()])) {
                continue;
            }

            foreach ($this->map[$role->getRole()] as $r) {
                $reachableRoles[] = new Role($r);
            }
        }

        return $reachableRoles;
    }

    private function buildRoleMap()
    {
        $this->map = array();
        foreach ($this->hierarchy as $main => $roles) {
            $this->map[$main] = $roles;
            $visited = array();
            $additionalRoles = $roles;
            while ($role = array_shift($additionalRoles)) {
                if (!isset($this->hierarchy[$role])) {
                    continue;
                }

                $visited[] = $role;
                $this->map[$main] = array_unique(array_merge($this->map[$main], $this->hierarchy[$role]));
                $additionalRoles = array_merge($additionalRoles, array_diff($this->hierarchy[$role], $visited));
            }
        }
    }
}
PK�`�\�Ħ2pear/Symfony/Component/Security/Core/Role/Role.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Role;

/**
 * Role is a simple implementation of a RoleInterface where the role is a
 * string.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Role implements RoleInterface
{
    private $role;

    /**
     * Constructor.
     *
     * @param string $role The role name
     */
    public function __construct($role)
    {
        $this->role = (string) $role;
    }

    /**
     * {@inheritdoc}
     */
    public function getRole()
    {
        return $this->role;
    }
}
PK�`�\�'c��;pear/Symfony/Component/Security/Core/Role/RoleInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Role;

/**
 * RoleInterface represents a role granted to a user.
 *
 * A role must either have a string representation or it needs to be explicitly
 * supported by at least one AccessDecisionManager.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface RoleInterface
{
    /**
     * Returns the role.
     *
     * This method returns a string representation whenever possible.
     *
     * When the role cannot be represented with sufficient precision by a
     * string, it should return null.
     *
     * @return string|null A string representation of the role, or null
     */
    public function getRole();
}
PK�`�\X�S�00<pear/Symfony/Component/Security/Core/Role/SwitchUserRole.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Role;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * SwitchUserRole is used when the current user temporarily impersonates
 * another one.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SwitchUserRole extends Role
{
    private $source;

    /**
     * Constructor.
     *
     * @param string         $role   The role as a string
     * @param TokenInterface $source The original token
     */
    public function __construct($role, TokenInterface $source)
    {
        parent::__construct($role);

        $this->source = $source;
    }

    /**
     * Returns the original Token.
     *
     * @return TokenInterface The original TokenInterface instance
     */
    public function getSource()
    {
        return $this->source;
    }
}
PK�`�\�}�wwDpear/Symfony/Component/Security/Core/Role/RoleHierarchyInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Role;

/**
 * RoleHierarchyInterface is the interface for a role hierarchy.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface RoleHierarchyInterface
{
    /**
     * Returns an array of all reachable roles by the given ones.
     *
     * Reachable roles are the roles directly assigned but also all roles that
     * are transitively reachable from them in the role hierarchy.
     *
     * @param RoleInterface[] $roles An array of directly assigned roles
     *
     * @return RoleInterface[] An array of all reachable roles
     */
    public function getReachableRoles(array $roles);
}
PK�`�\��S��Apear/Symfony/Component/Security/Core/SecurityContextInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * The SecurityContextInterface.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface SecurityContextInterface
{
    const ACCESS_DENIED_ERROR  = '_security.403_error';
    const AUTHENTICATION_ERROR = '_security.last_error';
    const LAST_USERNAME        = '_security.last_username';

    /**
     * Returns the current security token.
     *
     * @return TokenInterface|null A TokenInterface instance or null if no authentication information is available
     */
    public function getToken();

    /**
     * Sets the authentication token.
     *
     * @param TokenInterface $token A TokenInterface token, or null if no further authentication information should be stored
     */
    public function setToken(TokenInterface $token = null);

    /**
     * Checks if the attributes are granted against the current authentication token and optionally supplied object.
     *
     * @param mixed $attributes
     * @param mixed $object
     *
     * @return Boolean
     */
    public function isGranted($attributes, $object = null);
}
PK�`�\'�za!!8pear/Symfony/Component/Security/Core/SecurityContext.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core;

use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * SecurityContext is the main entry point of the Security component.
 *
 * It gives access to the token representing the current user authentication.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class SecurityContext implements SecurityContextInterface
{
    private $token;
    private $accessDecisionManager;
    private $authenticationManager;
    private $alwaysAuthenticate;

    /**
     * Constructor.
     *
     * @param AuthenticationManagerInterface      $authenticationManager An AuthenticationManager instance
     * @param AccessDecisionManagerInterface|null $accessDecisionManager An AccessDecisionManager instance
     * @param Boolean                             $alwaysAuthenticate
     */
    public function __construct(AuthenticationManagerInterface $authenticationManager, AccessDecisionManagerInterface $accessDecisionManager, $alwaysAuthenticate = false)
    {
        $this->authenticationManager = $authenticationManager;
        $this->accessDecisionManager = $accessDecisionManager;
        $this->alwaysAuthenticate = $alwaysAuthenticate;
    }

    /**
     * {@inheritdoc}
     *
     * @throws AuthenticationCredentialsNotFoundException when the security context has no authentication token.
     */
    final public function isGranted($attributes, $object = null)
    {
        if (null === $this->token) {
            throw new AuthenticationCredentialsNotFoundException('The security context contains no authentication token. One possible reason may be that there is no firewall configured for this URL.');
        }

        if ($this->alwaysAuthenticate || !$this->token->isAuthenticated()) {
            $this->token = $this->authenticationManager->authenticate($this->token);
        }

        if (!is_array($attributes)) {
            $attributes = array($attributes);
        }

        return $this->accessDecisionManager->decide($this->token, $attributes, $object);
    }

    /**
     * {@inheritdoc}
     */
    public function getToken()
    {
        return $this->token;
    }

    /**
     * {@inheritdoc}
     */
    public function setToken(TokenInterface $token = null)
    {
        $this->token = $token;
    }
}
PK�`�\+\�
//Bpear/Symfony/Component/Security/Core/Event/AuthenticationEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Event;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\EventDispatcher\Event;

/**
 * This is a general purpose authentication event.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AuthenticationEvent extends Event
{
    private $authenticationToken;

    public function __construct(TokenInterface $token)
    {
        $this->authenticationToken = $token;
    }

    public function getAuthenticationToken()
    {
        return $this->authenticationToken;
    }
}
PK�`�\��Eh��Ipear/Symfony/Component/Security/Core/Event/AuthenticationFailureEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Event;

use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * This event is dispatched on authentication failure.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AuthenticationFailureEvent extends AuthenticationEvent
{
    private $authenticationException;

    public function __construct(TokenInterface $token, AuthenticationException $ex)
    {
        parent::__construct($token);

        $this->authenticationException = $ex;
    }

    public function getAuthenticationException()
    {
        return $this->authenticationException;
    }
}
PK�`�\��^ 
 
?pear/Symfony/Component/Security/Core/User/ChainUserProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\User;

use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;

/**
 * Chain User Provider.
 *
 * This provider calls several leaf providers in a chain until one is able to
 * handle the request.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ChainUserProvider implements UserProviderInterface
{
    private $providers;

    public function __construct(array $providers)
    {
        $this->providers = $providers;
    }

    /**
     * @return array
     */
    public function getProviders()
    {
        return $this->providers;
    }

    /**
     * {@inheritDoc}
     */
    public function loadUserByUsername($username)
    {
        foreach ($this->providers as $provider) {
            try {
                return $provider->loadUserByUsername($username);
            } catch (UsernameNotFoundException $notFound) {
                // try next one
            }
        }

        $ex = new UsernameNotFoundException(sprintf('There is no user with name "%s".', $username));
        $ex->setUsername($username);
        throw $ex;
    }

    /**
     * {@inheritDoc}
     */
    public function refreshUser(UserInterface $user)
    {
        $supportedUserFound = false;

        foreach ($this->providers as $provider) {
            try {
                return $provider->refreshUser($user);
            } catch (UnsupportedUserException $unsupported) {
                // try next one
            } catch (UsernameNotFoundException $notFound) {
                $supportedUserFound = true;
                // try next one
            }
        }

        if ($supportedUserFound) {
            $ex = new UsernameNotFoundException(sprintf('There is no user with name "%s".', $user->getUsername()));
            $ex->setUsername($user->getUsername());
            throw $ex;
        } else {
            throw new UnsupportedUserException(sprintf('The account "%s" is not supported.', get_class($user)));
        }
    }

    /**
     * {@inheritDoc}
     */
    public function supportsClass($class)
    {
        foreach ($this->providers as $provider) {
            if ($provider->supportsClass($class)) {
                return true;
            }
        }

        return false;
    }
}
PK�`�\D�$..9pear/Symfony/Component/Security/Core/User/UserChecker.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\User;

use Symfony\Component\Security\Core\Exception\CredentialsExpiredException;
use Symfony\Component\Security\Core\Exception\LockedException;
use Symfony\Component\Security\Core\Exception\DisabledException;
use Symfony\Component\Security\Core\Exception\AccountExpiredException;

/**
 * UserChecker checks the user account flags.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class UserChecker implements UserCheckerInterface
{
    /**
     * {@inheritdoc}
     */
    public function checkPreAuth(UserInterface $user)
    {
        if (!$user instanceof AdvancedUserInterface) {
            return;
        }

        if (!$user->isAccountNonLocked()) {
            $ex = new LockedException('User account is locked.');
            $ex->setUser($user);
            throw $ex;
        }

        if (!$user->isEnabled()) {
            $ex = new DisabledException('User account is disabled.');
            $ex->setUser($user);
            throw $ex;
        }

        if (!$user->isAccountNonExpired()) {
            $ex = new AccountExpiredException('User account has expired.');
            $ex->setUser($user);
            throw $ex;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function checkPostAuth(UserInterface $user)
    {
        if (!$user instanceof AdvancedUserInterface) {
            return;
        }

        if (!$user->isCredentialsNonExpired()) {
            $ex = new CredentialsExpiredException('User credentials have expired.');
            $ex->setUser($user);
            throw $ex;
        }
    }
}
PK�`�\����	�	;pear/Symfony/Component/Security/Core/User/UserInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\User;

use Symfony\Component\Security\Core\Role\Role;

/**
 * Represents the interface that all user classes must implement.
 *
 * This interface is useful because the authentication layer can deal with
 * the object through its lifecycle, using the object to get the encoded
 * password (for checking against a submitted password), assigning roles
 * and so on.
 *
 * Regardless of how your user are loaded or where they come from (a database,
 * configuration, web service, etc), you will have a class that implements
 * this interface. Objects that implement this interface are created and
 * loaded by different objects that implement UserProviderInterface
 *
 * @see UserProviderInterface
 * @see AdvancedUserInterface
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface UserInterface
{
    /**
     * Returns the roles granted to the user.
     *
     * <code>
     * public function getRoles()
     * {
     *     return array('ROLE_USER');
     * }
     * </code>
     *
     * Alternatively, the roles might be stored on a ``roles`` property,
     * and populated in any number of different ways when the user object
     * is created.
     *
     * @return Role[] The user roles
     */
    public function getRoles();

    /**
     * Returns the password used to authenticate the user.
     *
     * This should be the encoded password. On authentication, a plain-text
     * password will be salted, encoded, and then compared to this value.
     *
     * @return string The password
     */
    public function getPassword();

    /**
     * Returns the salt that was originally used to encode the password.
     *
     * This can return null if the password was not encoded using a salt.
     *
     * @return string|null The salt
     */
    public function getSalt();

    /**
     * Returns the username used to authenticate the user.
     *
     * @return string The username
     */
    public function getUsername();

    /**
     * Removes sensitive data from the user.
     *
     * This is important if, at any given point, sensitive information like
     * the plain-text password is stored on this object.
     */
    public function eraseCredentials();
}
PK�`�\��6bYYCpear/Symfony/Component/Security/Core/User/AdvancedUserInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\User;

use Symfony\Component\Security\Core\Exception\AccountStatusException;
use Symfony\Component\Security\Core\Exception\AccountExpiredException;
use Symfony\Component\Security\Core\Exception\LockedException;
use Symfony\Component\Security\Core\Exception\CredentialsExpiredException;
use Symfony\Component\Security\Core\Exception\DisabledException;

/**
 * Adds extra features to a user class related to account status flags.
 *
 * This interface can be implemented in place of UserInterface if you'd like
 * the authentication system to consider different account status flags
 * during authentication. If any of the methods in this interface return
 * false, authentication will fail.
 *
 * If you need to perform custom logic for any of these situations, then
 * you will need to register an exception listener and watch for the specific
 * exception instances thrown in each case. All exceptions are a subclass
 * of AccountStatusException
 *
 * @see UserInterface
 * @see AccountStatusException
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface AdvancedUserInterface extends UserInterface
{
    /**
     * Checks whether the user's account has expired.
     *
     * Internally, if this method returns false, the authentication system
     * will throw an AccountExpiredException and prevent login.
     *
     * @return Boolean true if the user's account is non expired, false otherwise
     *
     * @see AccountExpiredException
     */
    public function isAccountNonExpired();

    /**
     * Checks whether the user is locked.
     *
     * Internally, if this method returns false, the authentication system
     * will throw a LockedException and prevent login.
     *
     * @return Boolean true if the user is not locked, false otherwise
     *
     * @see LockedException
     */
    public function isAccountNonLocked();

    /**
     * Checks whether the user's credentials (password) has expired.
     *
     * Internally, if this method returns false, the authentication system
     * will throw a CredentialsExpiredException and prevent login.
     *
     * @return Boolean true if the user's credentials are non expired, false otherwise
     *
     * @see CredentialsExpiredException
     */
    public function isCredentialsNonExpired();

    /**
     * Checks whether the user is enabled.
     *
     * Internally, if this method returns false, the authentication system
     * will throw a DisabledException and prevent login.
     *
     * @return Boolean true if the user is enabled, false otherwise
     *
     * @see DisabledException
     */
    public function isEnabled();
}
PK�`�\/!�Bpear/Symfony/Component/Security/Core/User/InMemoryUserProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\User;

use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;

/**
 * InMemoryUserProvider is a simple non persistent user provider.
 *
 * Useful for testing, demonstration, prototyping, and for simple needs
 * (a backend with a unique admin for instance)
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class InMemoryUserProvider implements UserProviderInterface
{
    private $users;

    /**
     * Constructor.
     *
     * The user array is a hash where the keys are usernames and the values are
     * an array of attributes: 'password', 'enabled', and 'roles'.
     *
     * @param array $users An array of users
     */
    public function __construct(array $users = array())
    {
        foreach ($users as $username => $attributes) {
            $password = isset($attributes['password']) ? $attributes['password'] : null;
            $enabled = isset($attributes['enabled']) ? $attributes['enabled'] : true;
            $roles = isset($attributes['roles']) ? $attributes['roles'] : array();
            $user = new User($username, $password, $roles, $enabled, true, true, true);

            $this->createUser($user);
        }
    }

    /**
     * Adds a new User to the provider.
     *
     * @param UserInterface $user A UserInterface instance
     *
     * @throws \LogicException
     */
    public function createUser(UserInterface $user)
    {
        if (isset($this->users[strtolower($user->getUsername())])) {
            throw new \LogicException('Another user with the same username already exists.');
        }

        $this->users[strtolower($user->getUsername())] = $user;
    }

    /**
     * {@inheritdoc}
     */
    public function loadUserByUsername($username)
    {
        if (!isset($this->users[strtolower($username)])) {
            $ex = new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
            $ex->setUsername($username);

            throw $ex;
        }

        $user = $this->users[strtolower($username)];

        return new User($user->getUsername(), $user->getPassword(), $user->getRoles(), $user->isEnabled(), $user->isAccountNonExpired(),
                $user->isCredentialsNonExpired(), $user->isAccountNonLocked());
    }

    /**
     * {@inheritDoc}
     */
    public function refreshUser(UserInterface $user)
    {
        if (!$user instanceof User) {
            throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
        }

        return $this->loadUserByUsername($user->getUsername());
    }

    /**
     * {@inheritDoc}
     */
    public function supportsClass($class)
    {
        return $class === 'Symfony\Component\Security\Core\User\User';
    }
}
PK�`�\s�v�W	W	Cpear/Symfony/Component/Security/Core/User/UserProviderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\User;

use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;

/**
 * Represents a class that loads UserInterface objects from some source for the authentication system.
 *
 * In a typical authentication configuration, a username (i.e. some unique
 * user identifier) credential enters the system (via form login, or any
 * method). The user provider that is configured with that authentication
 * method is asked to load the UserInterface object for the given username
 * (via loadUserByUsername) so that the rest of the process can continue.
 *
 * Internally, a user provider can load users from any source (databases,
 * configuration, web service). This is totally independent of how the authentication
 * information is submitted or what the UserInterface object looks like.
 *
 * @see UserInterface
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface UserProviderInterface
{
    /**
     * Loads the user for the given username.
     *
     * This method must throw UsernameNotFoundException if the user is not
     * found.
     *
     * @param string $username The username
     *
     * @return UserInterface
     *
     * @see UsernameNotFoundException
     *
     * @throws UsernameNotFoundException if the user is not found
     *
     */
    public function loadUserByUsername($username);

    /**
     * Refreshes the user for the account interface.
     *
     * It is up to the implementation to decide if the user data should be
     * totally reloaded (e.g. from the database), or if the UserInterface
     * object can just be merged into some internal array of users / identity
     * map.
     * @param UserInterface $user
     *
     * @return UserInterface
     *
     * @throws UnsupportedUserException if the account is not supported
     */
    public function refreshUser(UserInterface $user);

    /**
     * Whether this provider supports the given user class
     *
     * @param string $class
     *
     * @return Boolean
     */
    public function supportsClass($class);
}
PK�`�\����Bpear/Symfony/Component/Security/Core/User/UserCheckerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\User;

/**
 * UserCheckerInterface checks user account when authentication occurs.
 *
 * This should not be used to make authentication decisions.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface UserCheckerInterface
{
    /**
     * Checks the user account before authentication.
     *
     * @param UserInterface $user a UserInterface instance
     */
    public function checkPreAuth(UserInterface $user);

    /**
     * Checks the user account after authentication.
     *
     * @param UserInterface $user a UserInterface instance
     */
    public function checkPostAuth(UserInterface $user);
}
PK�`�\��//@pear/Symfony/Component/Security/Core/User/EquatableInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\User;

/**
 * EquatableInterface used to test if two objects are equal in security
 * and re-authentication context.
 *
 * @author Dariusz Górecki <darek.krk@gmail.com>
 */
interface EquatableInterface
{
    /**
     * The equality comparison should neither be done by referential equality
     * nor by comparing identities (i.e. getId() === getId()).
     *
     * However, you do not need to compare every attribute, but only those that
     * are relevant for assessing whether re-authentication is required.
     *
     * Also implementation should consider that $user instance may implement
     * the extended user interface `AdvancedUserInterface`.
     *
     * @param UserInterface $user
     *
     * @return Boolean
     */
    public function isEqualTo(UserInterface $user);
}
PK�`�\��1G	G	2pear/Symfony/Component/Security/Core/User/User.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\User;

/**
 * User is the user implementation used by the in-memory user provider.
 *
 * This should not be used for anything else.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
final class User implements AdvancedUserInterface
{
    private $username;
    private $password;
    private $enabled;
    private $accountNonExpired;
    private $credentialsNonExpired;
    private $accountNonLocked;
    private $roles;

    public function __construct($username, $password, array $roles = array(), $enabled = true, $userNonExpired = true, $credentialsNonExpired = true, $userNonLocked = true)
    {
        if (empty($username)) {
            throw new \InvalidArgumentException('The username cannot be empty.');
        }

        $this->username = $username;
        $this->password = $password;
        $this->enabled = $enabled;
        $this->accountNonExpired = $userNonExpired;
        $this->credentialsNonExpired = $credentialsNonExpired;
        $this->accountNonLocked = $userNonLocked;
        $this->roles = $roles;
    }

    /**
     * {@inheritdoc}
     */
    public function getRoles()
    {
        return $this->roles;
    }

    /**
     * {@inheritdoc}
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * {@inheritdoc}
     */
    public function getSalt()
    {
        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * {@inheritdoc}
     */
    public function isAccountNonExpired()
    {
        return $this->accountNonExpired;
    }

    /**
     * {@inheritdoc}
     */
    public function isAccountNonLocked()
    {
        return $this->accountNonLocked;
    }

    /**
     * {@inheritdoc}
     */
    public function isCredentialsNonExpired()
    {
        return $this->credentialsNonExpired;
    }

    /**
     * {@inheritdoc}
     */
    public function isEnabled()
    {
        return $this->enabled;
    }

    /**
     * {@inheritdoc}
     */
    public function eraseCredentials()
    {
    }
}
PK�`�\�6��`
`
Spear/Symfony/Component/Security/Core/Authentication/Token/UsernamePasswordToken.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Token;

use Symfony\Component\Security\Core\Role\RoleInterface;

/**
 * UsernamePasswordToken implements a username and password token.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class UsernamePasswordToken extends AbstractToken
{
    private $credentials;
    private $providerKey;

    /**
     * Constructor.
     *
     * @param string          $user        The username (like a nickname, email address, etc.), or a UserInterface instance or an object implementing a __toString method.
     * @param string          $credentials This usually is the password of the user
     * @param string          $providerKey The provider key
     * @param RoleInterface[] $roles       An array of roles
     *
     * @throws \InvalidArgumentException
     */
    public function __construct($user, $credentials, $providerKey, array $roles = array())
    {
        parent::__construct($roles);

        if (empty($providerKey)) {
            throw new \InvalidArgumentException('$providerKey must not be empty.');
        }

        $this->setUser($user);
        $this->credentials = $credentials;
        $this->providerKey = $providerKey;

        parent::setAuthenticated(count($roles) > 0);
    }

    /**
     * {@inheritdoc}
     */
    public function setAuthenticated($isAuthenticated)
    {
        if ($isAuthenticated) {
            throw new \LogicException('Cannot set this token to trusted after instantiation.');
        }

        parent::setAuthenticated(false);
    }

    /**
     * {@inheritdoc}
     */
    public function getCredentials()
    {
        return $this->credentials;
    }

    /**
     * Returns the provider key.
     *
     * @return string The provider key
     */
    public function getProviderKey()
    {
        return $this->providerKey;
    }

    /**
     * {@inheritdoc}
     */
    public function eraseCredentials()
    {
        parent::eraseCredentials();

        $this->credentials = null;
    }

    /**
     * {@inheritdoc}
     */
    public function serialize()
    {
        return serialize(array($this->credentials, $this->providerKey, parent::serialize()));
    }

    /**
     * {@inheritdoc}
     */
    public function unserialize($serialized)
    {
        list($this->credentials, $this->providerKey, $parentStr) = unserialize($serialized);
        parent::unserialize($parentStr);
    }
}
PK�`�\�tC��Lpear/Symfony/Component/Security/Core/Authentication/Token/TokenInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Token;

use Symfony\Component\Security\Core\Role\RoleInterface;

/**
 * TokenInterface is the interface for the user authentication information.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface TokenInterface extends \Serializable
{
    /**
     * Returns a string representation of the Token.
     *
     * This is only to be used for debugging purposes.
     *
     * @return string
     */
    public function __toString();

    /**
     * Returns the user roles.
     *
     * @return RoleInterface[] An array of RoleInterface instances.
     */
    public function getRoles();

    /**
     * Returns the user credentials.
     *
     * @return mixed The user credentials
     */
    public function getCredentials();

    /**
     * Returns a user representation.
     *
     * @return mixed either returns an object which implements __toString(), or
     *                  a primitive string is returned.
     */
    public function getUser();

    /**
     * Sets a user.
     *
     * @param mixed $user
     */
    public function setUser($user);

    /**
     * Returns the username.
     *
     * @return string
     */
    public function getUsername();

    /**
     * Returns whether the user is authenticated or not.
     *
     * @return Boolean true if the token has been authenticated, false otherwise
     */
    public function isAuthenticated();

    /**
     * Sets the authenticated flag.
     *
     * @param Boolean $isAuthenticated The authenticated flag
     */
    public function setAuthenticated($isAuthenticated);

    /**
     * Removes sensitive information from the token.
     */
    public function eraseCredentials();

    /**
     * Returns the token attributes.
     *
     * @return array The token attributes
     */
    public function getAttributes();

    /**
     * Sets the token attributes.
     *
     * @param array $attributes The token attributes
     */
    public function setAttributes(array $attributes);

    /**
     * Returns true if the attribute exists.
     *
     * @param string $name The attribute name
     *
     * @return Boolean true if the attribute exists, false otherwise
     */
    public function hasAttribute($name);

    /**
     * Returns an attribute value.
     *
     * @param string $name The attribute name
     *
     * @return mixed The attribute value
     *
     * @throws \InvalidArgumentException When attribute doesn't exist for this token
     */
    public function getAttribute($name);

    /**
     * Sets an attribute.
     *
     * @param string $name  The attribute name
     * @param mixed  $value The attribute value
     */
    public function setAttribute($name, $value);
}
PK�`�\γ�__Spear/Symfony/Component/Security/Core/Authentication/Token/PreAuthenticatedToken.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Token;

/**
 * PreAuthenticatedToken implements a pre-authenticated token.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class PreAuthenticatedToken extends AbstractToken
{
    private $credentials;
    private $providerKey;

    /**
     * Constructor.
     */
    public function __construct($user, $credentials, $providerKey, array $roles = array())
    {
        parent::__construct($roles);

        if (empty($providerKey)) {
            throw new \InvalidArgumentException('$providerKey must not be empty.');
        }

        $this->setUser($user);
        $this->credentials = $credentials;
        $this->providerKey = $providerKey;

        if ($roles) {
            $this->setAuthenticated(true);
        }
    }

    /**
     * Returns the provider key.
     *
     * @return string The provider key
     */
    public function getProviderKey()
    {
        return $this->providerKey;
    }

    /**
     * {@inheritdoc}
     */
    public function getCredentials()
    {
        return $this->credentials;
    }

    /**
     * {@inheritdoc}
     */
    public function eraseCredentials()
    {
        parent::eraseCredentials();

        $this->credentials = null;
    }

    /**
     * {@inheritdoc}
     */
    public function serialize()
    {
        return serialize(array($this->credentials, $this->providerKey, parent::serialize()));
    }

    /**
     * {@inheritdoc}
     */
    public function unserialize($str)
    {
        list($this->credentials, $this->providerKey, $parentStr) = unserialize($str);
        parent::unserialize($parentStr);
    }
}
PK�`�\��w�	�	Mpear/Symfony/Component/Security/Core/Authentication/Token/RememberMeToken.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Token;

use Symfony\Component\Security\Core\User\UserInterface;

/**
 * Authentication Token for "Remember-Me".
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class RememberMeToken extends AbstractToken
{
    private $key;
    private $providerKey;

    /**
     * Constructor.
     *
     * @param UserInterface $user
     * @param string        $providerKey
     * @param string        $key
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(UserInterface $user, $providerKey, $key)
    {
        parent::__construct($user->getRoles());

        if (empty($key)) {
            throw new \InvalidArgumentException('$key must not be empty.');
        }

        if (empty($providerKey)) {
            throw new \InvalidArgumentException('$providerKey must not be empty.');
        }

        $this->providerKey = $providerKey;
        $this->key = $key;

        $this->setUser($user);
        parent::setAuthenticated(true);
    }

    /**
     * {@inheritdoc}
     */
    public function setAuthenticated($authenticated)
    {
        if ($authenticated) {
            throw new \LogicException('You cannot set this token to authenticated after creation.');
        }

        parent::setAuthenticated(false);
    }

    /**
     * Returns the provider key.
     *
     * @return string The provider key
     */
    public function getProviderKey()
    {
        return $this->providerKey;
    }

    /**
     * Returns the key.
     *
     * @return string The Key
     */
    public function getKey()
    {
        return $this->key;
    }

    /**
     * {@inheritdoc}
     */
    public function getCredentials()
    {
        return '';
    }

    /**
     * {@inheritdoc}
     */
    public function serialize()
    {
        return serialize(array(
            $this->key,
            $this->providerKey,
            parent::serialize(),
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function unserialize($serialized)
    {
        list($this->key, $this->providerKey, $parentStr) = unserialize($serialized);
        parent::unserialize($parentStr);
    }
}
PK�`�\��4��Kpear/Symfony/Component/Security/Core/Authentication/Token/AbstractToken.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Token;

use Symfony\Component\Security\Core\Role\RoleInterface;
use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Component\Security\Core\User\EquatableInterface;

/**
 * Base class for Token instances.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
abstract class AbstractToken implements TokenInterface
{
    private $user;
    private $roles = array();
    private $authenticated = false;
    private $attributes = array();

    /**
     * Constructor.
     *
     * @param RoleInterface[] $roles An array of roles
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(array $roles = array())
    {
        foreach ($roles as $role) {
            if (is_string($role)) {
                $role = new Role($role);
            } elseif (!$role instanceof RoleInterface) {
                throw new \InvalidArgumentException(sprintf('$roles must be an array of strings, or RoleInterface instances, but got %s.', gettype($role)));
            }

            $this->roles[] = $role;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getRoles()
    {
        return $this->roles;
    }

    /**
     * {@inheritdoc}
     */
    public function getUsername()
    {
        if ($this->user instanceof UserInterface) {
            return $this->user->getUsername();
        }

        return (string) $this->user;
    }

    /**
     * {@inheritdoc}
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Sets the user in the token.
     *
     * The user can be a UserInterface instance, or an object implementing
     * a __toString method or the username as a regular string.
     *
     * @param mixed $user The user
     * @throws \InvalidArgumentException
     */
    public function setUser($user)
    {
        if (!($user instanceof UserInterface || (is_object($user) && method_exists($user, '__toString')) || is_string($user))) {
            throw new \InvalidArgumentException('$user must be an instanceof UserInterface, an object implementing a __toString method, or a primitive string.');
        }

        if (null === $this->user) {
            $changed = false;
        } elseif ($this->user instanceof UserInterface) {
            if (!$user instanceof UserInterface) {
                $changed = true;
            } else {
                $changed = $this->hasUserChanged($user);
            }
        } elseif ($user instanceof UserInterface) {
            $changed = true;
        } else {
            $changed = (string) $this->user !== (string) $user;
        }

        if ($changed) {
            $this->setAuthenticated(false);
        }

        $this->user = $user;
    }

    /**
     * {@inheritdoc}
     */
    public function isAuthenticated()
    {
        return $this->authenticated;
    }

    /**
     * {@inheritdoc}
     */
    public function setAuthenticated($authenticated)
    {
        $this->authenticated = (Boolean) $authenticated;
    }

    /**
     * {@inheritdoc}
     */
    public function eraseCredentials()
    {
        if ($this->getUser() instanceof UserInterface) {
            $this->getUser()->eraseCredentials();
        }
    }

    /**
     * {@inheritdoc}
     */
    public function serialize()
    {
        return serialize(
            array(
                is_object($this->user) ? clone $this->user : $this->user,
                $this->authenticated,
                $this->roles,
                $this->attributes
            )
        );
    }

    /**
     * {@inheritdoc}
     */
    public function unserialize($serialized)
    {
        list($this->user, $this->authenticated, $this->roles, $this->attributes) = unserialize($serialized);
    }

    /**
     * Returns the token attributes.
     *
     * @return array The token attributes
     */
    public function getAttributes()
    {
        return $this->attributes;
    }

    /**
     * Sets the token attributes.
     *
     * @param array $attributes The token attributes
     */
    public function setAttributes(array $attributes)
    {
        $this->attributes = $attributes;
    }

    /**
     * Returns true if the attribute exists.
     *
     * @param string $name The attribute name
     *
     * @return Boolean true if the attribute exists, false otherwise
     */
    public function hasAttribute($name)
    {
        return array_key_exists($name, $this->attributes);
    }

    /**
     * Returns an attribute value.
     *
     * @param string $name The attribute name
     *
     * @return mixed The attribute value
     *
     * @throws \InvalidArgumentException When attribute doesn't exist for this token
     */
    public function getAttribute($name)
    {
        if (!array_key_exists($name, $this->attributes)) {
            throw new \InvalidArgumentException(sprintf('This token has no "%s" attribute.', $name));
        }

        return $this->attributes[$name];
    }

    /**
     * Sets an attribute.
     *
     * @param string $name  The attribute name
     * @param mixed  $value The attribute value
     */
    public function setAttribute($name, $value)
    {
        $this->attributes[$name] = $value;
    }

    /**
     * {@inheritDoc}
     */
    public function __toString()
    {
        $class = get_class($this);
        $class = substr($class, strrpos($class, '\\')+1);

        $roles = array();
        foreach ($this->roles as $role) {
            $roles[] = $role->getRole();
        }

        return sprintf('%s(user="%s", authenticated=%s, roles="%s")', $class, $this->getUsername(), json_encode($this->authenticated), implode(', ', $roles));
    }

    private function hasUserChanged(UserInterface $user)
    {
        if (!($this->user instanceof UserInterface)) {
            throw new \BadMethodCallException('Method "hasUserChanged" should be called when current user class is instance of "UserInterface".');
        }

        if ($this->user instanceof EquatableInterface) {
            return ! (Boolean) $this->user->isEqualTo($user);
        }

        if ($this->user->getPassword() !== $user->getPassword()) {
            return true;
        }

        if ($this->user->getSalt() !== $user->getSalt()) {
            return true;
        }

        if ($this->user->getUsername() !== $user->getUsername()) {
            return true;
        }

        if ($this->user instanceof AdvancedUserInterface && $user instanceof AdvancedUserInterface) {
            if ($this->user->isAccountNonExpired() !== $user->isAccountNonExpired()) {
                return true;
            }

            if ($this->user->isAccountNonLocked() !== $user->isAccountNonLocked()) {
                return true;
            }

            if ($this->user->isCredentialsNonExpired() !== $user->isCredentialsNonExpired()) {
                return true;
            }

            if ($this->user->isEnabled() !== $user->isEnabled()) {
                return true;
            }
        } elseif ($this->user instanceof AdvancedUserInterface xor $user instanceof AdvancedUserInterface) {
            return true;
        }

        return false;
    }
}
PK�`�\{Z�--Lpear/Symfony/Component/Security/Core/Authentication/Token/AnonymousToken.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Token;

use Symfony\Component\Security\Core\Role\RoleInterface;

/**
 * AnonymousToken represents an anonymous token.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class AnonymousToken extends AbstractToken
{
    private $key;

    /**
     * Constructor.
     *
     * @param string          $key   The key shared with the authentication provider
     * @param string          $user  The user
     * @param RoleInterface[] $roles An array of roles
     */
    public function __construct($key, $user, array $roles = array())
    {
        parent::__construct($roles);

        $this->key = $key;
        $this->setUser($user);
        $this->setAuthenticated(true);
    }

    /**
     * {@inheritdoc}
     */
    public function getCredentials()
    {
        return '';
    }

    /**
     * Returns the key.
     *
     * @return string The Key
     */
    public function getKey()
    {
        return $this->key;
    }

    /**
     * {@inheritDoc}
     */
    public function serialize()
    {
        return serialize(array($this->key, parent::serialize()));
    }

    /**
     * {@inheritDoc}
     */
    public function unserialize($serialized)
    {
        list($this->key, $parentStr) = unserialize($serialized);
        parent::unserialize($parentStr);
    }
}
PK�`�\��r3WW\pear/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * Interface for resolving the authentication status of a given token.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface AuthenticationTrustResolverInterface
{
    /**
     * Resolves whether the passed token implementation is authenticated
     * anonymously.
     *
     * If null is passed, the method must return false.
     *
     * @param TokenInterface $token
     *
     * @return Boolean
     */
    public function isAnonymous(TokenInterface $token = null);

    /**
     * Resolves whether the passed token implementation is authenticated
     * using remember-me capabilities.
     *
     * @param TokenInterface $token
     *
     * @return Boolean
     */
    public function isRememberMe(TokenInterface $token = null);

    /**
     * Resolves whether the passed token implementation is fully authenticated.
     *
     * @param TokenInterface $token
     *
     * @return Boolean
     */
    public function isFullFledged(TokenInterface $token = null);
}
PK�`�\¬>
##Wpear/Symfony/Component/Security/Core/Authentication/SimplePreAuthenticatorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication;

use Symfony\Component\HttpFoundation\Request;

/**
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface SimplePreAuthenticatorInterface extends SimpleAuthenticatorInterface
{
    public function createToken(Request $request, $providerKey);
}
PK�`�\x��$ccUpear/Symfony/Component/Security/Core/Authentication/AuthenticationProviderManager.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication;

use Symfony\Component\Security\Core\Event\AuthenticationFailureEvent;
use Symfony\Component\Security\Core\Event\AuthenticationEvent;
use Symfony\Component\Security\Core\AuthenticationEvents;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\ProviderNotFoundException;
use Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * AuthenticationProviderManager uses a list of AuthenticationProviderInterface
 * instances to authenticate a Token.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AuthenticationProviderManager implements AuthenticationManagerInterface
{
    private $providers;
    private $eraseCredentials;
    private $eventDispatcher;

    /**
     * Constructor.
     *
     * @param AuthenticationProviderInterface[] $providers        An array of AuthenticationProviderInterface instances
     * @param Boolean                           $eraseCredentials Whether to erase credentials after authentication or not
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(array $providers, $eraseCredentials = true)
    {
        if (!$providers) {
            throw new \InvalidArgumentException('You must at least add one authentication provider.');
        }

        $this->providers = $providers;
        $this->eraseCredentials = (Boolean) $eraseCredentials;
    }

    public function setEventDispatcher(EventDispatcherInterface $dispatcher)
    {
        $this->eventDispatcher = $dispatcher;
    }

    /**
     * {@inheritdoc}
     */
    public function authenticate(TokenInterface $token)
    {
        $lastException = null;
        $result = null;

        foreach ($this->providers as $provider) {
            if (!$provider->supports($token)) {
                continue;
            }

            try {
                $result = $provider->authenticate($token);

                if (null !== $result) {
                    break;
                }
            } catch (AccountStatusException $e) {
                $e->setToken($token);

                throw $e;
            } catch (AuthenticationException $e) {
                $lastException = $e;
            }
        }

        if (null !== $result) {
            if (true === $this->eraseCredentials) {
                $result->eraseCredentials();
            }

            if (null !== $this->eventDispatcher) {
                $this->eventDispatcher->dispatch(AuthenticationEvents::AUTHENTICATION_SUCCESS, new AuthenticationEvent($result));
            }

            return $result;
        }

        if (null === $lastException) {
            $lastException = new ProviderNotFoundException(sprintf('No Authentication Provider found for token of class "%s".', get_class($token)));
        }

        if (null !== $this->eventDispatcher) {
            $this->eventDispatcher->dispatch(AuthenticationEvents::AUTHENTICATION_FAILURE, new AuthenticationFailureEvent($token, $lastException));
        }

        $lastException->setToken($token);

        throw $lastException;
    }
}
PK�`�\f�	�Vpear/Symfony/Component/Security/Core/Authentication/AuthenticationManagerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;

/**
 * AuthenticationManagerInterface is the interface for authentication managers,
 * which process Token authentication.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface AuthenticationManagerInterface
{
    /**
     * Attempts to authenticate a TokenInterface object.
     *
     * @param TokenInterface $token The TokenInterface instance to authenticate
     *
     * @return TokenInterface An authenticated TokenInterface instance, never null
     *
     * @throws AuthenticationException if the authentication fails
     */
    public function authenticate(TokenInterface $token);
}
PK�`�\:�6��Spear/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolver.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * The default implementation of the authentication trust resolver.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AuthenticationTrustResolver implements AuthenticationTrustResolverInterface
{
    private $anonymousClass;
    private $rememberMeClass;

    /**
     * Constructor
     *
     * @param string $anonymousClass
     * @param string $rememberMeClass
     */
    public function __construct($anonymousClass, $rememberMeClass)
    {
        $this->anonymousClass = $anonymousClass;
        $this->rememberMeClass = $rememberMeClass;
    }

    /**
     * {@inheritDoc}
     */
    public function isAnonymous(TokenInterface $token = null)
    {
        if (null === $token) {
            return false;
        }

        return $token instanceof $this->anonymousClass;
    }

    /**
     * {@inheritDoc}
     */
    public function isRememberMe(TokenInterface $token = null)
    {
        if (null === $token) {
            return false;
        }

        return $token instanceof $this->rememberMeClass;
    }

    /**
     * {@inheritDoc}
     */
    public function isFullFledged(TokenInterface $token = null)
    {
        if (null === $token) {
            return false;
        }

        return !$this->isAnonymous($token) && !$this->isRememberMe($token);
    }
}
PK�`�\�Zpear/Symfony/Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Provider;

use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\AuthenticationServiceException;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

/**
 * DaoAuthenticationProvider uses a UserProviderInterface to retrieve the user
 * for a UsernamePasswordToken.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DaoAuthenticationProvider extends UserAuthenticationProvider
{
    private $encoderFactory;
    private $userProvider;

    /**
     * Constructor.
     *
     * @param UserProviderInterface   $userProvider               An UserProviderInterface instance
     * @param UserCheckerInterface    $userChecker                An UserCheckerInterface instance
     * @param string                  $providerKey                The provider key
     * @param EncoderFactoryInterface $encoderFactory             An EncoderFactoryInterface instance
     * @param Boolean                 $hideUserNotFoundExceptions Whether to hide user not found exception or not
     */
    public function __construct(UserProviderInterface $userProvider, UserCheckerInterface $userChecker, $providerKey, EncoderFactoryInterface $encoderFactory, $hideUserNotFoundExceptions = true)
    {
        parent::__construct($userChecker, $providerKey, $hideUserNotFoundExceptions);

        $this->encoderFactory = $encoderFactory;
        $this->userProvider = $userProvider;
    }

    /**
     * {@inheritdoc}
     */
    protected function checkAuthentication(UserInterface $user, UsernamePasswordToken $token)
    {
        $currentUser = $token->getUser();
        if ($currentUser instanceof UserInterface) {
            if ($currentUser->getPassword() !== $user->getPassword()) {
                throw new BadCredentialsException('The credentials were changed from another session.');
            }
        } else {
            if ("" === ($presentedPassword = $token->getCredentials())) {
                throw new BadCredentialsException('The presented password cannot be empty.');
            }

            if (!$this->encoderFactory->getEncoder($user)->isPasswordValid($user->getPassword(), $presentedPassword, $user->getSalt())) {
                throw new BadCredentialsException('The presented password is invalid.');
            }
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function retrieveUser($username, UsernamePasswordToken $token)
    {
        $user = $token->getUser();
        if ($user instanceof UserInterface) {
            return $user;
        }

        try {
            $user = $this->userProvider->loadUserByUsername($username);

            if (!$user instanceof UserInterface) {
                throw new AuthenticationServiceException('The user provider must return a UserInterface object.');
            }

            return $user;
        } catch (UsernameNotFoundException $notFound) {
            $notFound->setUsername($username);
            throw $notFound;
        } catch (\Exception $repositoryProblem) {
            $ex = new AuthenticationServiceException($repositoryProblem->getMessage(), 0, $repositoryProblem);
            $ex->setToken($token);
            throw $ex;
        }
    }
}
PK�`�\��a�""`pear/Symfony/Component/Security/Core/Authentication/Provider/AuthenticationProviderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Provider;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;

/**
 * AuthenticationProviderInterface is the interface for all authentication
 * providers.
 *
 * Concrete implementations processes specific Token instances.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface AuthenticationProviderInterface extends AuthenticationManagerInterface
{
    /**
     * Checks whether this provider supports the given token.
     *
     * @param TokenInterface $token A TokenInterface instance
     *
     * @return Boolean true if the implementation supports the Token, false otherwise
     */
     public function supports(TokenInterface $token);
}
PK�`�\>,�vv]pear/Symfony/Component/Security/Core/Authentication/Provider/SimpleAuthenticationProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Provider;

use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;

/**
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class SimpleAuthenticationProvider implements AuthenticationProviderInterface
{
    private $simpleAuthenticator;
    private $userProvider;
    private $providerKey;

    public function __construct(SimpleAuthenticatorInterface $simpleAuthenticator, UserProviderInterface $userProvider, $providerKey)
    {
        $this->simpleAuthenticator = $simpleAuthenticator;
        $this->userProvider = $userProvider;
        $this->providerKey = $providerKey;
    }

    public function authenticate(TokenInterface $token)
    {
        $authToken = $this->simpleAuthenticator->authenticateToken($token, $this->userProvider, $this->providerKey);

        if ($authToken instanceof TokenInterface) {
            return $authToken;
        }

        throw new AuthenticationException('Simple authenticator failed to return an authenticated token.');
    }

    public function supports(TokenInterface $token)
    {
        return $this->simpleAuthenticator->supportsToken($token, $this->providerKey);
    }
}
PK�`�\��X���`pear/Symfony/Component/Security/Core/Authentication/Provider/AnonymousAuthenticationProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Provider;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;

/**
 * AnonymousAuthenticationProvider validates AnonymousToken instances.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class AnonymousAuthenticationProvider implements AuthenticationProviderInterface
{
    private $key;

    /**
     * Constructor.
     *
     * @param string $key The key shared with the authentication token
     */
    public function __construct($key)
    {
        $this->key = $key;
    }

    /**
     * {@inheritdoc}
     */
    public function authenticate(TokenInterface $token)
    {
        if (!$this->supports($token)) {
            return null;
        }

        if ($this->key !== $token->getKey()) {
            throw new BadCredentialsException('The Token does not contain the expected key.');
        }

        return $token;
    }

    /**
     * {@inheritdoc}
     */
    public function supports(TokenInterface $token)
    {
        return $token instanceof AnonymousToken;
    }
}
PK�`�\�J�A��apear/Symfony/Component/Security/Core/Authentication/Provider/RememberMeAuthenticationProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Provider;

use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;

class RememberMeAuthenticationProvider implements AuthenticationProviderInterface
{
    private $userChecker;
    private $key;
    private $providerKey;

    /**
     * Constructor.
     *
     * @param UserCheckerInterface $userChecker An UserCheckerInterface interface
     * @param string               $key         A key
     * @param string               $providerKey A provider key
     */
    public function __construct(UserCheckerInterface $userChecker, $key, $providerKey)
    {
        $this->userChecker = $userChecker;
        $this->key = $key;
        $this->providerKey = $providerKey;
    }

    /**
     * {@inheritdoc}
     */
    public function authenticate(TokenInterface $token)
    {
        if (!$this->supports($token)) {
            return;
        }

        if ($this->key !== $token->getKey()) {
            throw new BadCredentialsException('The presented key does not match.');
        }

        $user = $token->getUser();
        $this->userChecker->checkPostAuth($user);

        $authenticatedToken = new RememberMeToken($user, $this->providerKey, $this->key);
        $authenticatedToken->setAttributes($token->getAttributes());

        return $authenticatedToken;
    }

    /**
     * {@inheritdoc}
     */
    public function supports(TokenInterface $token)
    {
        return $token instanceof RememberMeToken && $token->getProviderKey() === $this->providerKey;
    }
}
PK�`�\un\�
�
gpear/Symfony/Component/Security/Core/Authentication/Provider/PreAuthenticatedAuthenticationProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Provider;

use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
use Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * Processes a pre-authenticated authentication request.
 *
 * This authentication provider will not perform any checks on authentication
 * requests, as they should already be pre-authenticated. However, the
 * UserProviderInterface implementation may still throw a
 * UsernameNotFoundException, for example.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class PreAuthenticatedAuthenticationProvider implements AuthenticationProviderInterface
{
    private $userProvider;
    private $userChecker;
    private $providerKey;

    /**
     * Constructor.
     *
     * @param UserProviderInterface $userProvider An UserProviderInterface instance
     * @param UserCheckerInterface  $userChecker  An UserCheckerInterface instance
     * @param string                $providerKey  The provider key
     */
    public function __construct(UserProviderInterface $userProvider, UserCheckerInterface $userChecker, $providerKey)
    {
        $this->userProvider = $userProvider;
        $this->userChecker = $userChecker;
        $this->providerKey = $providerKey;
    }

     /**
      * {@inheritdoc}
      */
     public function authenticate(TokenInterface $token)
     {
         if (!$this->supports($token)) {
             return null;
         }

        if (!$user = $token->getUser()) {
            throw new BadCredentialsException('No pre-authenticated principal found in request.');
        }
/*
        if (null === $token->getCredentials()) {
            throw new BadCredentialsException('No pre-authenticated credentials found in request.');
        }
*/
        $user = $this->userProvider->loadUserByUsername($user);

        $this->userChecker->checkPostAuth($user);

        $authenticatedToken = new PreAuthenticatedToken($user, $token->getCredentials(), $this->providerKey, $user->getRoles());
        $authenticatedToken->setAttributes($token->getAttributes());

        return $authenticatedToken;
    }

    /**
     * {@inheritdoc}
     */
    public function supports(TokenInterface $token)
    {
        return $token instanceof PreAuthenticatedToken && $this->providerKey === $token->getProviderKey();
    }
}
PK�`�\�b�yy[pear/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\Provider;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
use Symfony\Component\Security\Core\Exception\AuthenticationServiceException;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Role\SwitchUserRole;

/**
 * UserProviderInterface retrieves users for UsernamePasswordToken tokens.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class UserAuthenticationProvider implements AuthenticationProviderInterface
{
    private $hideUserNotFoundExceptions;
    private $userChecker;
    private $providerKey;

    /**
     * Constructor.
     *
     * @param UserCheckerInterface $userChecker                An UserCheckerInterface interface
     * @param string               $providerKey                A provider key
     * @param Boolean              $hideUserNotFoundExceptions Whether to hide user not found exception or not
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(UserCheckerInterface $userChecker, $providerKey, $hideUserNotFoundExceptions = true)
    {
        if (empty($providerKey)) {
            throw new \InvalidArgumentException('$providerKey must not be empty.');
        }

        $this->userChecker = $userChecker;
        $this->providerKey = $providerKey;
        $this->hideUserNotFoundExceptions = $hideUserNotFoundExceptions;
    }

    /**
     * {@inheritdoc}
     */
    public function authenticate(TokenInterface $token)
    {
        if (!$this->supports($token)) {
            return null;
        }

        $username = $token->getUsername();
        if (empty($username)) {
            $username = 'NONE_PROVIDED';
        }

        try {
            $user = $this->retrieveUser($username, $token);
        } catch (UsernameNotFoundException $notFound) {
            if ($this->hideUserNotFoundExceptions) {
                throw new BadCredentialsException('Bad credentials', 0, $notFound);
            }
            $notFound->setUsername($username);

            throw $notFound;
        }

        if (!$user instanceof UserInterface) {
            throw new AuthenticationServiceException('retrieveUser() must return a UserInterface.');
        }

        try {
            $this->userChecker->checkPreAuth($user);
            $this->checkAuthentication($user, $token);
            $this->userChecker->checkPostAuth($user);
        } catch (BadCredentialsException $e) {
            if ($this->hideUserNotFoundExceptions) {
                throw new BadCredentialsException('Bad credentials', 0, $e);
            }

            throw $e;
        }

        $authenticatedToken = new UsernamePasswordToken($user, $token->getCredentials(), $this->providerKey, $this->getRoles($user, $token));
        $authenticatedToken->setAttributes($token->getAttributes());

        return $authenticatedToken;
    }

    /**
     * {@inheritdoc}
     */
    public function supports(TokenInterface $token)
    {
        return $token instanceof UsernamePasswordToken && $this->providerKey === $token->getProviderKey();
    }

    /**
     * Retrieves roles from user and appends SwitchUserRole if original token contained one.
     *
     * @param UserInterface  $user  The user
     * @param TokenInterface $token The token
     *
     * @return Role[] The user roles
     */
    private function getRoles(UserInterface $user, TokenInterface $token)
    {
        $roles = $user->getRoles();

        foreach ($token->getRoles() as $role) {
            if ($role instanceof SwitchUserRole) {
                $roles[] = $role;

                break;
            }
        }

        return $roles;
    }

    /**
     * Retrieves the user from an implementation-specific location.
     *
     * @param string                $username The username to retrieve
     * @param UsernamePasswordToken $token    The Token
     *
     * @return UserInterface The user
     *
     * @throws AuthenticationException if the credentials could not be validated
     */
    abstract protected function retrieveUser($username, UsernamePasswordToken $token);

    /**
     * Does additional checks on the user and token (like validating the
     * credentials).
     *
     * @param UserInterface         $user  The retrieved UserInterface instance
     * @param UsernamePasswordToken $token The UsernamePasswordToken token to be authenticated
     *
     * @throws AuthenticationException if the credentials could not be validated
     */
    abstract protected function checkAuthentication(UserInterface $user, UsernamePasswordToken $token);
}
PK�`�\J-W;::Xpear/Symfony/Component/Security/Core/Authentication/SimpleFormAuthenticatorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication;

use Symfony\Component\HttpFoundation\Request;

/**
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface SimpleFormAuthenticatorInterface extends SimpleAuthenticatorInterface
{
    public function createToken(Request $request, $username, $password, $providerKey);
}
PK�`�\��W��Tpear/Symfony/Component/Security/Core/Authentication/SimpleAuthenticatorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;

/**
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface SimpleAuthenticatorInterface
{
    public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey);

    public function supportsToken(TokenInterface $token, $providerKey);
}
PK�`�\
C�f��Ypear/Symfony/Component/Security/Core/Authentication/RememberMe/TokenProviderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\RememberMe;

use Symfony\Component\Security\Core\Exception\TokenNotFoundException;

/**
 * Interface for TokenProviders
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface TokenProviderInterface
{
    /**
     * Loads the active token for the given series.
     *
     * @param string $series
     *
     * @return PersistentTokenInterface
     *
     * @throws TokenNotFoundException if the token is not found
     */
    public function loadTokenBySeries($series);

    /**
     * Deletes all tokens belonging to series.
     *
     * @param string $series
     */
    public function deleteTokenBySeries($series);

    /**
     * Updates the token according to this data.
     *
     * @param string    $series
     * @param string    $tokenValue
     * @param \DateTime $lastUsed
     * @throws TokenNotFoundException if the token is not found
     */
    public function updateToken($series, $tokenValue, \DateTime $lastUsed);

    /**
     * Creates a new token.
     *
     * @param PersistentTokenInterface $token
     */
    public function createNewToken(PersistentTokenInterface $token);
}
PK�`�\
�TO��Rpear/Symfony/Component/Security/Core/Authentication/RememberMe/PersistentToken.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\RememberMe;

/**
 * This class is only used by PersistentTokenRememberMeServices internally.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
final class PersistentToken implements PersistentTokenInterface
{
    private $class;
    private $username;
    private $series;
    private $tokenValue;
    private $lastUsed;

    /**
     * Constructor
     *
     * @param string    $class
     * @param string    $username
     * @param string    $series
     * @param string    $tokenValue
     * @param \DateTime $lastUsed
     *
     * @throws \InvalidArgumentException
     */
    public function __construct($class, $username, $series, $tokenValue, \DateTime $lastUsed)
    {
        if (empty($class)) {
            throw new \InvalidArgumentException('$class must not be empty.');
        }
        if (empty($username)) {
            throw new \InvalidArgumentException('$username must not be empty.');
        }
        if (empty($series)) {
            throw new \InvalidArgumentException('$series must not be empty.');
        }
        if (empty($tokenValue)) {
            throw new \InvalidArgumentException('$tokenValue must not be empty.');
        }

        $this->class = $class;
        $this->username = $username;
        $this->series = $series;
        $this->tokenValue = $tokenValue;
        $this->lastUsed = $lastUsed;
    }

    /**
     * {@inheritdoc}
     */
    public function getClass()
    {
        return $this->class;
    }

    /**
     * {@inheritdoc}
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * {@inheritdoc}
     */
    public function getSeries()
    {
        return $this->series;
    }

    /**
     * {@inheritdoc}
     */
    public function getTokenValue()
    {
        return $this->tokenValue;
    }

    /**
     * {@inheritdoc}
     */
    public function getLastUsed()
    {
        return $this->lastUsed;
    }
}
PK�`�\���QZZ[pear/Symfony/Component/Security/Core/Authentication/RememberMe/PersistentTokenInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\RememberMe;

/**
 * Interface to be implemented by persistent token classes (such as
 * Doctrine entities representing a remember-me token)
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface PersistentTokenInterface
{
    /**
     * Returns the class of the user.
     *
     * @return string
     */
    public function getClass();

    /**
     * Returns the username.
     *
     * @return string
     */
    public function getUsername();

    /**
     * Returns the series.
     *
     * @return string
     */
    public function getSeries();

    /**
     * Returns the token value.
     *
     * @return string
     */
    public function getTokenValue();

    /**
     * Returns the time the token was last used.
     *
     * @return \DateTime
     */
    public function getLastUsed();
}
PK�`�\�Zvm��Xpear/Symfony/Component/Security/Core/Authentication/RememberMe/InMemoryTokenProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authentication\RememberMe;

use Symfony\Component\Security\Core\Exception\TokenNotFoundException;

/**
 * This class is used for testing purposes, and is not really suited for production.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class InMemoryTokenProvider implements TokenProviderInterface
{
    private $tokens = array();

    /**
     * {@inheritdoc}
     */
    public function loadTokenBySeries($series)
    {
        if (!isset($this->tokens[$series])) {
            throw new TokenNotFoundException('No token found.');
        }

        return $this->tokens[$series];
    }

    /**
     * {@inheritdoc}
     */
    public function updateToken($series, $tokenValue, \DateTime $lastUsed)
    {
        if (!isset($this->tokens[$series])) {
            throw new TokenNotFoundException('No token found.');
        }

        $token = new PersistentToken(
            $this->tokens[$series]->getClass(),
            $this->tokens[$series]->getUsername(),
            $series,
            $tokenValue,
            $lastUsed
        );
        $this->tokens[$series] = $token;
    }

    /**
     * {@inheritdoc}
     */
    public function deleteTokenBySeries($series)
    {
        unset($this->tokens[$series]);
    }

    /**
     * {@inheritdoc}
     */
    public function createNewToken(PersistentTokenInterface $token)
    {
        $this->tokens[$token->getSeries()] = $token;
    }
}
PK�`�\��l�=pear/Symfony/Component/Security/Core/AuthenticationEvents.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core;

final class AuthenticationEvents
{
    /**
     * The AUTHENTICATION_SUCCESS event occurs after a user is authenticated
     * by one provider.
     *
     * The event listener method receives a
     * Symfony\Component\Security\Core\Event\AuthenticationEvent instance.
     *
     * @var string
     */
    const AUTHENTICATION_SUCCESS = 'security.authentication.success';

    /**
     * The AUTHENTICATION_FAILURE event occurs after a user cannot be
     * authenticated by any of the providers.
     *
     * The event listener method receives a
     * Symfony\Component\Security\Core\Event\AuthenticationFailureEvent
     * instance.
     *
     * @var string
     */
    const AUTHENTICATION_FAILURE = 'security.authentication.failure';
}
PK�`�\h�c��Gpear/Symfony/Component/Security/Core/Exception/CookieTheftException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * This exception is thrown when the RememberMeServices implementation
 * detects that a presented cookie has already been used by someone else.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class CookieTheftException extends AuthenticationException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Cookie has already been used by someone else.';
    }
}
PK�`�\�և��Dpear/Symfony/Component/Security/Core/Exception/DisabledException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * DisabledException is thrown when the user account is disabled.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class DisabledException extends AccountStatusException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Account is disabled.';
    }
}
PK�`�\��XssBpear/Symfony/Component/Security/Core/Exception/LogoutException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * LogoutException is thrown when the account cannot be logged out.
 *
 * @author Jeremy Mikola <jmikola@gmail.com>
 */
class LogoutException extends \RuntimeException
{
    public function __construct($message = 'Logout Exception', \Exception $previous = null)
    {
        parent::__construct($message, 403, $previous);
    }
}
PK�`�\D��9��Ipear/Symfony/Component/Security/Core/Exception/TokenNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * TokenNotFoundException is thrown if a Token cannot be found.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class TokenNotFoundException extends AuthenticationException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'No token could be found.';
    }
}
PK�`�\�5]���Npear/Symfony/Component/Security/Core/Exception/SessionUnavailableException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * This exception is thrown when no session is available.
 *
 * Possible reasons for this are:
 *
 *     a) The session timed out because the user waited too long.
 *     b) The user has disabled cookies, and a new session is started on each
 *        request.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class SessionUnavailableException extends AuthenticationException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'No session available, it either timed out or cookies are not enabled.';
    }
}
PK�`�\
�04}}Lpear/Symfony/Component/Security/Core/Exception/UsernameNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * UsernameNotFoundException is thrown if a User cannot be found by its username.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class UsernameNotFoundException extends AuthenticationException
{
    private $username;

    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Username could not be found.';
    }

    /**
     * Get the username.
     *
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * Set the username.
     *
     * @param string $username
     */
    public function setUsername($username)
    {
        $this->username = $username;
    }

    /**
     * {@inheritDoc}
     */
    public function serialize()
    {
        return serialize(array(
            $this->username,
            parent::serialize(),
        ));
    }

    /**
     * {@inheritDoc}
     */
    public function unserialize($str)
    {
        list($this->username, $parentData) = unserialize($str);

        parent::unserialize($parentData);
    }
}
PK�`�\e���Hpear/Symfony/Component/Security/Core/Exception/NonceExpiredException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * NonceExpiredException is thrown when an authentication is rejected because
 * the digest nonce has expired.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class NonceExpiredException extends AuthenticationException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Digest nonce has expired.';
    }
}
PK�`�\@�	���Lpear/Symfony/Component/Security/Core/Exception/ProviderNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * ProviderNotFoundException is thrown when no AuthenticationProviderInterface instance
 * supports an authentication Token.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class ProviderNotFoundException extends AuthenticationException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'No authentication provider found to support the authentication token.';
    }
}
PK�`�\qUSą�Hpear/Symfony/Component/Security/Core/Exception/AccessDeniedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * AccessDeniedException is thrown when the account has not the required role.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class AccessDeniedException extends \RuntimeException
{
    public function __construct($message = 'Access Denied', \Exception $previous = null)
    {
        parent::__construct($message, 403, $previous);
    }
}
PK�`�\�
	��Cpear/Symfony/Component/Security/Core/Exception/RuntimeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * Base RuntimeException for the Security component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
PK�`�\��A���Epear/Symfony/Component/Security/Core/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * Base ExceptionInterface for the Security component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ExceptionInterface
{
}
PK�`�\#��q44Vpear/Symfony/Component/Security/Core/Exception/InsufficientAuthenticationException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * InsufficientAuthenticationException is thrown if the user credentials are not sufficiently trusted.
 *
 * This is the case when a user is anonymous and the resource to be displayed has an access role.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class InsufficientAuthenticationException extends AuthenticationException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Not privileged to request the resource.';
    }
}
PK�`�\�O���Lpear/Symfony/Component/Security/Core/Exception/InvalidCsrfTokenException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * This exception is thrown when the csrf token is invalid.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class InvalidCsrfTokenException extends AuthenticationException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Invalid CSRF token.';
    }
}
PK�`�\:���AAIpear/Symfony/Component/Security/Core/Exception/AccountStatusException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

use Symfony\Component\Security\Core\User\UserInterface;

/**
 * AccountStatusException is the base class for authentication exceptions
 * caused by the user account status.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
abstract class AccountStatusException extends AuthenticationException
{
    private $user;

    /**
     * Get the user.
     *
     * @return UserInterface
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Set the user.
     *
     * @param UserInterface $user
     */
    public function setUser(UserInterface $user)
    {
        $this->user = $user;
    }

    /**
     * {@inheritDoc}
     */
    public function serialize()
    {
        return serialize(array(
            $this->user,
            parent::serialize(),
        ));
    }

    /**
     * {@inheritDoc}
     */
    public function unserialize($str)
    {
        list($this->user, $parentData) = unserialize($str);

        parent::unserialize($parentData);
    }
}
PK�`�\����Jpear/Symfony/Component/Security/Core/Exception/BadCredentialsException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * BadCredentialsException is thrown when the user credentials are invalid.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class BadCredentialsException extends AuthenticationException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Invalid credentials.';
    }
}
PK�`�\ʝ�9Kpear/Symfony/Component/Security/Core/Exception/InvalidArgumentException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * Base InvalidArgumentException for the Security component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
PK�`�\xB��Jpear/Symfony/Component/Security/Core/Exception/AccountExpiredException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * AccountExpiredException is thrown when the user account has expired.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class AccountExpiredException extends AccountStatusException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Account has expired.';
    }
}
PK�`�\7w�-��Qpear/Symfony/Component/Security/Core/Exception/AuthenticationServiceException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * AuthenticationServiceException is thrown when an authentication request could not be processed due to a system problem.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class AuthenticationServiceException extends AuthenticationException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Authentication request could not be processed due to a system problem.';
    }
}
PK�`�\�ĸ���]pear/Symfony/Component/Security/Core/Exception/AuthenticationCredentialsNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * AuthenticationCredentialsNotFoundException is thrown when an authentication is rejected
 * because no Token is available.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class AuthenticationCredentialsNotFoundException extends AuthenticationException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Authentication credentials could not be found.';
    }
}
PK�`�\�z�&��Npear/Symfony/Component/Security/Core/Exception/CredentialsExpiredException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * CredentialsExpiredException is thrown when the user account credentials have expired.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class CredentialsExpiredException extends AccountStatusException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Credentials have expired.';
    }
}
PK�`�\�'��Jpear/Symfony/Component/Security/Core/Exception/AuthenticationException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * AuthenticationException is the base class for all authentication exceptions.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class AuthenticationException extends \RuntimeException implements \Serializable
{
    private $token;

    /**
     * Get the token.
     *
     * @return TokenInterface
     */
    public function getToken()
    {
        return $this->token;
    }

    /**
     * Set the token.
     *
     * @param TokenInterface $token
     */
    public function setToken(TokenInterface $token)
    {
        $this->token = $token;
    }

    public function serialize()
    {
        return serialize(array(
            $this->token,
            $this->code,
            $this->message,
            $this->file,
            $this->line,
        ));
    }

    public function unserialize($str)
    {
        list(
            $this->token,
            $this->code,
            $this->message,
            $this->file,
            $this->line
        ) = unserialize($str);
    }

    /**
     * Message key to be used by the translation component.
     *
     * @return string
     */
    public function getMessageKey()
    {
        return 'An authentication exception occurred.';
    }

    /**
     * Message data to be used by the translation component.
     *
     * @return array
     */
    public function getMessageData()
    {
        return array();
    }
}
PK�`�\b��M<<Kpear/Symfony/Component/Security/Core/Exception/UnsupportedUserException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * This exception is thrown when an account is reloaded from a provider which
 * doesn't support the passed implementation of UserInterface.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class UnsupportedUserException extends AuthenticationServiceException
{
}
PK�`�\���zzBpear/Symfony/Component/Security/Core/Exception/LockedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Exception;

/**
 * LockedException is thrown if the user account is locked.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class LockedException extends AccountStatusException
{
    /**
     * {@inheritDoc}
     */
    public function getMessageKey()
    {
        return 'Account is locked.';
    }
}
PK�`�\�:22Upear/Symfony/Component/Security/Core/Authorization/AccessDecisionManagerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authorization;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * AccessDecisionManagerInterface makes authorization decisions.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface AccessDecisionManagerInterface
{
    /**
     * Decides whether the access is possible or not.
     *
     * @param TokenInterface $token      A TokenInterface instance
     * @param array          $attributes An array of attributes associated with the method being invoked
     * @param object         $object     The object to secure
     *
     * @return Boolean true if the access is granted, false otherwise
     */
    public function decide(TokenInterface $token, array $attributes, $object = null);

    /**
     * Checks if the access decision manager supports the given attribute.
     *
     * @param string $attribute An attribute
     *
     * @return Boolean true if this decision manager supports the attribute, false otherwise
     */
    public function supportsAttribute($attribute);

    /**
     * Checks if the access decision manager supports the given class.
     *
     * @param string $class A class name
     *
     * @return true if this decision manager can process the class
     */
    public function supportsClass($class);
}
PK�`�\ѵ^��Ipear/Symfony/Component/Security/Core/Authorization/ExpressionLanguage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authorization;

use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage;

/**
 * Adds some function to the default ExpressionLanguage.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ExpressionLanguage extends BaseExpressionLanguage
{
    protected function registerFunctions()
    {
        parent::registerFunctions();

        $this->register('is_anonymous', function () {
            return '$trust_resolver->isAnonymous($token)';
        }, function (array $variables) {
            return $variables['trust_resolver']->isAnonymous($variables['token']);
        });

        $this->register('is_authenticated', function () {
            return '$token && !$trust_resolver->isAnonymous($token)';
        }, function (array $variables) {
            return $variables['token'] && !$variables['trust_resolver']->isAnonymous($variables['token']);
        });

        $this->register('is_fully_authenticated', function () {
            return '$trust_resolver->isFullFledged($token)';
        }, function (array $variables) {
            return $variables['trust_resolver']->isFullFledged($variables['token']);
        });

        $this->register('is_remember_me', function () {
            return '$trust_resolver->isRememberMe($token)';
        }, function (array $variables) {
            return $variables['trust_resolver']->isRememberMe($variables['token']);
        });

        $this->register('has_role', function ($role) {
            return sprintf('in_array(%s, $roles)', $role);
        }, function (array $variables, $role) {
            return in_array($role, $variables['roles']);
        });
    }
}
PK�`�\�X,mOpear/Symfony/Component/Security/Core/Authorization/Voter/AuthenticatedVoter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authorization\Voter;

use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * AuthenticatedVoter votes if an attribute like IS_AUTHENTICATED_FULLY,
 * IS_AUTHENTICATED_REMEMBERED, or IS_AUTHENTICATED_ANONYMOUSLY is present.
 *
 * This list is most restrictive to least restrictive checking.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AuthenticatedVoter implements VoterInterface
{
    const IS_AUTHENTICATED_FULLY = 'IS_AUTHENTICATED_FULLY';
    const IS_AUTHENTICATED_REMEMBERED = 'IS_AUTHENTICATED_REMEMBERED';
    const IS_AUTHENTICATED_ANONYMOUSLY = 'IS_AUTHENTICATED_ANONYMOUSLY';

    private $authenticationTrustResolver;

    /**
     * Constructor.
     *
     * @param AuthenticationTrustResolverInterface $authenticationTrustResolver
     */
    public function __construct(AuthenticationTrustResolverInterface $authenticationTrustResolver)
    {
        $this->authenticationTrustResolver = $authenticationTrustResolver;
    }

    /**
     * {@inheritdoc}
     */
    public function supportsAttribute($attribute)
    {
        return null !== $attribute && (self::IS_AUTHENTICATED_FULLY === $attribute || self::IS_AUTHENTICATED_REMEMBERED === $attribute || self::IS_AUTHENTICATED_ANONYMOUSLY === $attribute);
    }

    /**
     * {@inheritdoc}
     */
    public function supportsClass($class)
    {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function vote(TokenInterface $token, $object, array $attributes)
    {
        $result = VoterInterface::ACCESS_ABSTAIN;
        foreach ($attributes as $attribute) {
            if (!$this->supportsAttribute($attribute)) {
                continue;
            }

            $result = VoterInterface::ACCESS_DENIED;

            if (self::IS_AUTHENTICATED_FULLY === $attribute
                && $this->authenticationTrustResolver->isFullFledged($token)) {
                return VoterInterface::ACCESS_GRANTED;
            }

            if (self::IS_AUTHENTICATED_REMEMBERED === $attribute
                && ($this->authenticationTrustResolver->isRememberMe($token)
                    || $this->authenticationTrustResolver->isFullFledged($token))) {
                return VoterInterface::ACCESS_GRANTED;
            }

            if (self::IS_AUTHENTICATED_ANONYMOUSLY === $attribute
                && ($this->authenticationTrustResolver->isAnonymous($token)
                    || $this->authenticationTrustResolver->isRememberMe($token)
                    || $this->authenticationTrustResolver->isFullFledged($token))) {
                return VoterInterface::ACCESS_GRANTED;
            }
        }

        return $result;
    }
}
PK�`�\~f�Opear/Symfony/Component/Security/Core/Authorization/Voter/RoleHierarchyVoter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authorization\Voter;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;

/**
 * RoleHierarchyVoter uses a RoleHierarchy to determine the roles granted to
 * the user before voting.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class RoleHierarchyVoter extends RoleVoter
{
    private $roleHierarchy;

    public function __construct(RoleHierarchyInterface $roleHierarchy, $prefix = 'ROLE_')
    {
        $this->roleHierarchy = $roleHierarchy;

        parent::__construct($prefix);
    }

    /**
     * {@inheritdoc}
     */
    protected function extractRoles(TokenInterface $token)
    {
        return $this->roleHierarchy->getReachableRoles($token->getRoles());
    }
}
PK�`�\�З~��Fpear/Symfony/Component/Security/Core/Authorization/Voter/RoleVoter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authorization\Voter;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * RoleVoter votes if any attribute starts with a given prefix.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class RoleVoter implements VoterInterface
{
    private $prefix;

    /**
     * Constructor.
     *
     * @param string $prefix The role prefix
     */
    public function __construct($prefix = 'ROLE_')
    {
        $this->prefix = $prefix;
    }

    /**
     * {@inheritdoc}
     */
    public function supportsAttribute($attribute)
    {
        return 0 === strpos($attribute, $this->prefix);
    }

    /**
     * {@inheritdoc}
     */
    public function supportsClass($class)
    {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function vote(TokenInterface $token, $object, array $attributes)
    {
        $result = VoterInterface::ACCESS_ABSTAIN;
        $roles = $this->extractRoles($token);

        foreach ($attributes as $attribute) {
            if (!$this->supportsAttribute($attribute)) {
                continue;
            }

            $result = VoterInterface::ACCESS_DENIED;
            foreach ($roles as $role) {
                if ($attribute === $role->getRole()) {
                    return VoterInterface::ACCESS_GRANTED;
                }
            }
        }

        return $result;
    }

    protected function extractRoles(TokenInterface $token)
    {
        return $token->getRoles();
    }
}
PK�`�\��`c��Lpear/Symfony/Component/Security/Core/Authorization/Voter/ExpressionVoter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authorization\Voter;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface;
use Symfony\Component\Security\Core\Authorization\ExpressionLanguage;
use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
use Symfony\Component\ExpressionLanguage\Expression;
use Symfony\Component\HttpFoundation\Request;

/**
 * ExpressionVoter votes based on the evaluation of an expression.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ExpressionVoter implements VoterInterface
{
    private $expressionLanguage;
    private $trustResolver;
    private $roleHierarchy;

    /**
     * Constructor.
     *
     * @param ExpressionLanguage $expressionLanguage
     */
    public function __construct(ExpressionLanguage $expressionLanguage, AuthenticationTrustResolverInterface $trustResolver, RoleHierarchyInterface $roleHierarchy = null)
    {
        $this->expressionLanguage = $expressionLanguage;
        $this->trustResolver = $trustResolver;
        $this->roleHierarchy = $roleHierarchy;
    }

    /**
     * {@inheritdoc}
     */
    public function supportsAttribute($attribute)
    {
        return $attribute instanceof Expression;
    }

    /**
     * {@inheritdoc}
     */
    public function supportsClass($class)
    {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function vote(TokenInterface $token, $object, array $attributes)
    {
        $result = VoterInterface::ACCESS_ABSTAIN;
        $variables = null;
        foreach ($attributes as $attribute) {
            if (!$this->supportsAttribute($attribute)) {
                continue;
            }

            if (null === $variables) {
                $variables = $this->getVariables($token, $object);
            }

            $result = VoterInterface::ACCESS_DENIED;
            if ($this->expressionLanguage->evaluate($attribute, $variables)) {
                return VoterInterface::ACCESS_GRANTED;
            }
        }

        return $result;
    }

    private function getVariables(TokenInterface $token, $object)
    {
        if (null !== $this->roleHierarchy) {
            $roles = $this->roleHierarchy->getReachableRoles($token->getRoles());
        } else {
            $roles = $token->getRoles();
        }

        $variables = array(
            'token' => $token,
            'user' => $token->getUser(),
            'object' => $object,
            'roles' => array_map(function ($role) { return $role->getRole(); }, $roles),
            'trust_resolver' => $this->trustResolver,
        );

        // this is mainly to propose a better experience when the expression is used
        // in an access control rule, as the developer does not know that it's going
        // to be handled by this voter
        if ($object instanceof Request) {
            $variables['request'] = $object;
        }

        return $variables;
    }
}
PK�`�\�>��Kpear/Symfony/Component/Security/Core/Authorization/Voter/VoterInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authorization\Voter;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * VoterInterface is the interface implemented by all voters.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface VoterInterface
{
    const ACCESS_GRANTED = 1;
    const ACCESS_ABSTAIN = 0;
    const ACCESS_DENIED  = -1;

    /**
     * Checks if the voter supports the given attribute.
     *
     * @param string $attribute An attribute
     *
     * @return Boolean true if this Voter supports the attribute, false otherwise
     */
    public function supportsAttribute($attribute);

    /**
     * Checks if the voter supports the given class.
     *
     * @param string $class A class name
     *
     * @return Boolean true if this Voter can process the class
     */
    public function supportsClass($class);

    /**
     * Returns the vote for the given parameters.
     *
     * This method must return one of the following constants:
     * ACCESS_GRANTED, ACCESS_DENIED, or ACCESS_ABSTAIN.
     *
     * @param TokenInterface $token      A TokenInterface instance
     * @param object         $object     The object to secure
     * @param array          $attributes An array of attributes associated with the method being invoked
     *
     * @return integer either ACCESS_GRANTED, ACCESS_ABSTAIN, or ACCESS_DENIED
     */
    public function vote(TokenInterface $token, $object, array $attributes);
}
PK�`�\�m2���Lpear/Symfony/Component/Security/Core/Authorization/AccessDecisionManager.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Authorization;

use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * AccessDecisionManager is the base class for all access decision managers
 * that use decision voters.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class AccessDecisionManager implements AccessDecisionManagerInterface
{
    private $voters;
    private $strategy;
    private $allowIfAllAbstainDecisions;
    private $allowIfEqualGrantedDeniedDecisions;

    /**
     * Constructor.
     *
     * @param VoterInterface[] $voters                             An array of VoterInterface instances
     * @param string           $strategy                           The vote strategy
     * @param Boolean          $allowIfAllAbstainDecisions         Whether to grant access if all voters abstained or not
     * @param Boolean          $allowIfEqualGrantedDeniedDecisions Whether to grant access if result are equals
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(array $voters, $strategy = 'affirmative', $allowIfAllAbstainDecisions = false, $allowIfEqualGrantedDeniedDecisions = true)
    {
        if (!$voters) {
            throw new \InvalidArgumentException('You must at least add one voter.');
        }

        $strategyMethod = 'decide'.ucfirst($strategy);
        if (!is_callable(array($this, $strategyMethod))) {
            throw new \InvalidArgumentException(sprintf('The strategy "%s" is not supported.', $strategy));
        }

        $this->voters = $voters;
        $this->strategy = $strategyMethod;
        $this->allowIfAllAbstainDecisions = (Boolean) $allowIfAllAbstainDecisions;
        $this->allowIfEqualGrantedDeniedDecisions = (Boolean) $allowIfEqualGrantedDeniedDecisions;
    }

    /**
     * {@inheritdoc}
     */
    public function decide(TokenInterface $token, array $attributes, $object = null)
    {
        return $this->{$this->strategy}($token, $attributes, $object);
    }

    /**
     * {@inheritdoc}
     */
    public function supportsAttribute($attribute)
    {
        foreach ($this->voters as $voter) {
            if ($voter->supportsAttribute($attribute)) {
                return true;
            }
        }

        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function supportsClass($class)
    {
        foreach ($this->voters as $voter) {
            if ($voter->supportsClass($class)) {
                return true;
            }
        }

        return false;
    }

    /**
     * Grants access if any voter returns an affirmative response.
     *
     * If all voters abstained from voting, the decision will be based on the
     * allowIfAllAbstainDecisions property value (defaults to false).
     */
    private function decideAffirmative(TokenInterface $token, array $attributes, $object = null)
    {
        $deny = 0;
        foreach ($this->voters as $voter) {
            $result = $voter->vote($token, $object, $attributes);
            switch ($result) {
                case VoterInterface::ACCESS_GRANTED:
                    return true;

                case VoterInterface::ACCESS_DENIED:
                    ++$deny;

                    break;

                default:
                    break;
            }
        }

        if ($deny > 0) {
            return false;
        }

        return $this->allowIfAllAbstainDecisions;
    }

    /**
     * Grants access if there is consensus of granted against denied responses.
     *
     * Consensus means majority-rule (ignoring abstains) rather than unanimous
     * agreement (ignoring abstains). If you require unanimity, see
     * UnanimousBased.
     *
     * If there were an equal number of grant and deny votes, the decision will
     * be based on the allowIfEqualGrantedDeniedDecisions property value
     * (defaults to true).
     *
     * If all voters abstained from voting, the decision will be based on the
     * allowIfAllAbstainDecisions property value (defaults to false).
     */
    private function decideConsensus(TokenInterface $token, array $attributes, $object = null)
    {
        $grant = 0;
        $deny = 0;
        $abstain = 0;
        foreach ($this->voters as $voter) {
            $result = $voter->vote($token, $object, $attributes);

            switch ($result) {
                case VoterInterface::ACCESS_GRANTED:
                    ++$grant;

                    break;

                case VoterInterface::ACCESS_DENIED:
                    ++$deny;

                    break;

                default:
                    ++$abstain;

                    break;
            }
        }

        if ($grant > $deny) {
            return true;
        }

        if ($deny > $grant) {
            return false;
        }

        if ($grant == $deny && $grant != 0) {
            return $this->allowIfEqualGrantedDeniedDecisions;
        }

        return $this->allowIfAllAbstainDecisions;
    }

    /**
     * Grants access if only grant (or abstain) votes were received.
     *
     * If all voters abstained from voting, the decision will be based on the
     * allowIfAllAbstainDecisions property value (defaults to false).
     */
    private function decideUnanimous(TokenInterface $token, array $attributes, $object = null)
    {
        $grant = 0;
        foreach ($attributes as $attribute) {
            foreach ($this->voters as $voter) {
                $result = $voter->vote($token, $object, array($attribute));

                switch ($result) {
                    case VoterInterface::ACCESS_GRANTED:
                        ++$grant;

                        break;

                    case VoterInterface::ACCESS_DENIED:
                        return false;

                    default:
                        break;
                }
            }
        }

        // no deny votes
        if ($grant > 0) {
            return true;
        }

        return $this->allowIfAllAbstainDecisions;
    }
}
PK�`�\(���
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.cs.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Při ověřování došlo k chybě.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Ověřovací údaje nebyly nalezeny.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Požadavek na ověření nemohl být zpracován kvůli systémové chybě.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Neplatné přihlašovací údaje.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie již bylo použité někým jiným.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nemáte oprávnění přistupovat k prostředku.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Neplatný CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Platnost inicializačního vektoru (digest nonce) vypršela.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Poskytovatel pro ověřovací token nebyl nalezen.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Session není k dispozici, vypršela její platnost, nebo jsou zakázané cookies.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Token nebyl nalezen.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Přihlašovací jméno nebylo nalezeno.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Platnost účtu vypršela.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Platnost přihlašovacích údajů vypršela.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Účet je zakázaný.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Účet je zablokovaný.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�y��
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.gl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ocorreu un erro de autenticación.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Non se atoparon as credenciais de autenticación.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>A solicitude de autenticación no puido ser procesada debido a un problema do sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credenciais non válidas.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>A cookie xa foi empregado por outro usuario.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Non ten privilexios para solicitar o recurso.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF non válido.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>O vector de inicialización (digest nonce) expirou.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Non se atopou un provedor de autenticación que soporte o token de autenticación.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Non hai ningunha sesión dispoñible, expirou ou as cookies non están habilitadas.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Non se atopou ningún token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Non se atopou o nome de usuario.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>A conta expirou.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>As credenciais expiraron.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>A conta está deshabilitada.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>A conta está bloqueada.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\UɎd
d
Kpear/Symfony/Component/Security/Core/Resources/translations/security.sl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Prišlo je do izjeme pri preverjanju avtentikacije.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Poverilnic za avtentikacijo ni bilo mogoče najti.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Zahteve za avtentikacijo ni bilo mogoče izvesti zaradi sistemske težave.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Neveljavne pravice.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Piškotek je uporabil že nekdo drug.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nimate privilegijev za zahtevani vir.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Neveljaven CSRF žeton.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Začasni žeton je potekel.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Ponudnika avtentikacije za podporo prijavnega žetona ni bilo mogoče najti.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Seja ni na voljo, ali je potekla ali pa piškotki niso omogočeni.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Žetona ni bilo mogoče najti.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Uporabniškega imena ni bilo mogoče najti.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Račun je potekel.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Poverilnice so potekle.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Račun je onemogočen.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Račun je zaklenjen.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�w=���Kpear/Symfony/Component/Security/Core/Resources/translations/security.ru.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ошибка аутентификации.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Аутентификационные данные не найдены.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Запрос аутентификации не может быть обработан в связи с проблемой в системе.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Недействительные аутентификационные данные.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie уже был использован кем-то другим.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Отсутствуют права на запрос этого ресурса.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Недействительный токен CSRF.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Время действия одноразового ключа дайджеста истекло.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Не найден провайдер аутентификации, поддерживающий токен аутентификации.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Сессия не найдена, ее время истекло, либо cookies не включены.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Токен не найден.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Имя пользователя не найдено.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Время действия учетной записи истекло.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Время действия аутентификационных данных истекло.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Учетная запись отключена.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Учетная запись заблокирована.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\YW��g
g
Ppear/Symfony/Component/Security/Core/Resources/translations/security.sr_Latn.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Izuzetak pri autentifikaciji.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Autentifikacioni podaci nisu pronađeni.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Zahtev za autentifikaciju ne može biti obrađen zbog sistemskih problema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Nevalidni podaci za autentifikaciju.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Kolačić je već iskorišćen od strane nekog drugog.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nemate prava pristupa ovom resursu.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Nevalidan CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Vreme kriptografskog ključa je isteklo.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Autentifikacioni provajder za podršku tokena nije pronađen.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Sesija nije dostupna, istekla je ili su kolačići isključeni.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Token ne može biti pronađen.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Korisničko ime ne može biti pronađeno.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Nalog je istekao.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Podaci za autentifikaciju su istekli.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Nalog je onemogućen.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Nalog je zaključan.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\Tk�f��Kpear/Symfony/Component/Security/Core/Resources/translations/security.ar.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>حدث خطأ اثناء الدخول.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>لم استطع العثور على معلومات الدخول.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>لم يكتمل طلب الدخول نتيجه عطل فى النظام.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>معلومات الدخول خاطئة.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>ملفات تعريف الارتباط(cookies) تم استخدامها من قبل شخص اخر.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>ليست لديك الصلاحيات الكافية لهذا الطلب.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>رمز الموقع غير صحيح.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>انتهت صلاحية(digest nonce).</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>لا يوجد معرف للدخول يدعم الرمز المستخدم للدخول.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>لا يوجد صلة بينك و بين الموقع اما انها انتهت او ان متصفحك لا يدعم خاصية ملفات تعريف الارتباط (cookies).</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>لم استطع العثور على الرمز.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>لم استطع العثور على اسم الدخول.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>انتهت صلاحية الحساب.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>انتهت صلاحية معلومات الدخول.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>الحساب موقوف.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>الحساب مغلق.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�#@�y
y
Npear/Symfony/Component/Security/Core/Resources/translations/security.pt_PT.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ocorreu um excepção durante a autenticação.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>As credenciais de autenticação não foram encontradas.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>O pedido de autenticação não foi concluído devido a um problema no sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credenciais inválidas.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Este cookie já esta em uso.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Não possui privilégios para aceder a este recurso.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF inválido.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce expirado.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nenhum fornecedor de autenticação encontrado para suportar o token de autenticação.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Não existe sessão disponível, esta expirou ou os cookies estão desativados.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>O token não foi encontrado.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Nome de utilizador não encontrado.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>A conta expirou.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>As credenciais expiraram.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Conta desativada.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>A conta esta trancada.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\U����Kpear/Symfony/Component/Security/Core/Resources/translations/security.el.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Συνέβη ένα σφάλμα πιστοποίησης.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Τα στοιχεία πιστοποίησης δε βρέθηκαν.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Το αίτημα πιστοποίησης δε μπορεί να επεξεργαστεί λόγω σφάλματος του συστήματος.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Λανθασμένα στοιχεία σύνδεσης.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Το Cookie έχει ήδη χρησιμοποιηθεί από κάποιον άλλο.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Δεν είστε εξουσιοδοτημένος για πρόσβαση στο συγκεκριμένο περιεχόμενο.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Μη έγκυρο CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Το digest nonce έχει λήξει.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Δε βρέθηκε κάποιος πάροχος πιστοποίησης που να υποστηρίζει το token πιστοποίησης.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Δεν υπάρχει ενεργή σύνοδος (session), είτε έχει λήξει ή τα cookies δεν είναι ενεργοποιημένα.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Δεν ήταν δυνατόν να βρεθεί κάποιο token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Το Username δε βρέθηκε.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Ο λογαριασμός έχει λήξει.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Τα στοιχεία σύνδεσης έχουν λήξει.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Ο λογαριασμός είναι απενεργοποιημένος.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Ο λογαριασμός είναι κλειδωμένος.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\���
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.lb.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" target-language="lb" datatype="plaintext" original="security.en.xlf">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Bei der Authentifikatioun ass e Feeler opgetrueden.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Et konnte keng Zouganksdate fonnt ginn.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>D'Ufro fir eng Authentifikatioun konnt wéinst engem Problem vum System net beaarbecht ginn.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Ongëlteg Zouganksdaten.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>De Cookie gouf scho vun engem anere benotzt.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Keng Rechter fir d'Ressource unzefroen.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Ongëltegen CSRF-Token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Den eemolege Schlëssel ass ofgelaf.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Et gouf keen Authentifizéierungs-Provider fonnt deen den Authentifizéierungs-Token ënnerstëtzt.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Keng Sëtzung disponibel. Entweder ass se ofgelaf oder Cookies sinn net aktivéiert.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Et konnt keen Token fonnt ginn.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>De Benotzernumm konnt net fonnt ginn.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Den Account ass ofgelaf.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>D'Zouganksdate sinn ofgelaf.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>De Konto ass deaktivéiert.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>De Konto ass gespaart.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�=���
�
Npear/Symfony/Component/Security/Core/Resources/translations/security.pt_BR.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Uma exceção ocorreu durante a autenticação.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>As credenciais de autenticação não foram encontradas.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>A autenticação não pôde ser concluída devido a um problema no sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credenciais inválidas.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Este cookie já esta em uso.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Não possui privilégios o bastante para requisitar este recurso.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF inválido.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce expirado.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nenhum provedor de autenticação encontrado para suportar o token de autenticação.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Nenhuma sessão disponível, ela expirou ou cookies estão desativados.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Nenhum token foi encontrado.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Nome de usuário não encontrado.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>A conta esta expirada.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>As credenciais estão expiradas.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Conta desativada.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>A conta esta travada.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\.�X:
:
Kpear/Symfony/Component/Security/Core/Resources/translations/security.en.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>An authentication exception occurred.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Authentication credentials could not be found.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Authentication request could not be processed due to a system problem.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Invalid credentials.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie has already been used by someone else.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Not privileged to request the resource.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Invalid CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce has expired.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>No authentication provider found to support the authentication token.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>No session available, it either timed out or cookies are not enabled.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>No token could be found.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Username could not be found.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Account has expired.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Credentials have expired.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Account is disabled.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Account is locked.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�p�U�
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.nl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Er heeft zich een authenticatieprobleem voorgedaan.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Authenticatiegegevens konden niet worden gevonden.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Authenticatieaanvraag kon niet worden verwerkt door een technisch probleem.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Ongeldige inloggegevens.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie is al door een ander persoon gebruikt.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Onvoldoende rechten om de aanvraag te verwerken.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>CSRF-code is ongeldig.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Serverauthenticatiesleutel (digest nonce) is verlopen.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Geen authenticatieprovider gevonden die de authenticatietoken ondersteunt.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Geen sessie beschikbaar, mogelijk is deze verlopen of cookies zijn uitgeschakeld.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Er kon geen authenticatietoken worden gevonden.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Gebruikersnaam kon niet worden gevonden.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Account is verlopen.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Authenticatiegegevens zijn verlopen.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Account is gedeactiveerd.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Account is geblokkeerd.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\���ţ
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.ca.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ha succeït un error d'autenticació.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>No s'han trobat les credencials d'autenticació.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>La solicitud d'autenticació no s'ha pogut processar per un problema del sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credencials no vàlides.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>La cookie ja ha estat utilitzada per una altra persona.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>No té privilegis per solicitar el recurs.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF no vàlid.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>El vector d'inicialització (digest nonce) ha expirat.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>No s'ha trobat un proveïdor d'autenticació que suporti el token d'autenticació.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>No hi ha sessió disponible, ha expirat o les cookies no estan habilitades.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>No s'ha trobat cap token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>No s'ha trobat el nom d'usuari.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>El compte ha expirat.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Les credencials han expirat.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>El compte està deshabilitat.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>El compte està bloquejat.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\d�e��
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.fr.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Une exception d'authentification s'est produite.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Les droits d'authentification n'ont pas pu être trouvés.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>La requête d'authentification n'a pas pu être executée à cause d'un problème système.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Droits invalides.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Le cookie a déjà été utilisé par quelqu'un d'autre.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Pas de privilèges pour accéder à la ressource.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Jeton CSRF invalide.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Le digest nonce a expiré.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Aucun fournisseur d'authentification n'a été trouvé pour supporter le jeton d'authentification.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Pas de session disponible, celle-ci a expiré ou les cookies ne sont pas activés.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Aucun jeton n'a pu être trouvé.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Le nom d'utilisateur ne peut pas être trouvé.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Le compte a expiré.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Les droits ont expirés.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Le compte est désactivé.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Le compte est bloqué.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�)�
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.ro.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>A apărut o eroare de autentificare.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Informațiile de autentificare nu au fost găsite.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Sistemul nu a putut procesa cererea de autentificare din cauza unei erori.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Date de autentificare invalide.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookieul este folosit deja de altcineva.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Permisiuni insuficiente pentru resursa cerută.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Tokenul CSRF este invalid.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Tokenul temporar a expirat.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nu a fost găsit nici un agent de autentificare pentru tokenul specificat.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Sesiunea nu mai este disponibilă, a expirat sau suportul pentru cookieuri nu este activat.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Tokenul nu a putut fi găsit.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Numele de utilizator nu a fost găsit.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Contul a expirat.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Datele de autentificare au expirat.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Contul este dezactivat.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Contul este blocat.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\O�
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.it.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Si è verificato un errore di autenticazione.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Impossibile trovare le credenziali di autenticazione.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>La richiesta di autenticazione non può essere processata a causa di un errore di sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credenziali non valide.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Il cookie è già stato usato da qualcun altro.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Non hai i privilegi per richiedere questa risorsa.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>CSRF token non valido.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Il numero di autenticazione è scaduto.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Non è stato trovato un valido fornitore di autenticazione per supportare il token.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Nessuna sessione disponibile, può essere scaduta o i cookie non sono abilitati.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Nessun token trovato.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Username non trovato.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Account scaduto.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Credenziali scadute.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>L'account è disabilitato.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>L'account è bloccato.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�d
�
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.pl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Wystąpił błąd uwierzytelniania.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Dane uwierzytelniania nie zostały znalezione.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Żądanie uwierzytelniania nie mogło zostać pomyślnie zakończone z powodu problemu z systemem.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Nieprawidłowe dane.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>To ciasteczko jest używane przez kogoś innego.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Brak uprawnień dla żądania wskazanego zasobu.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Nieprawidłowy token CSRF.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Kod dostępu wygasł.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nie znaleziono mechanizmu uwierzytelniania zdolnego do obsługi przesłanego tokenu.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Brak danych sesji, sesja wygasła lub ciasteczka nie są włączone.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Nie znaleziono tokenu.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Użytkownik o podanej nazwie nie istnieje.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Konto wygasło.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Dane uwierzytelniania wygasły.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Konto jest wyłączone.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Konto jest zablokowane.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\&MЎ�
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.es.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ocurrió un error de autenticación.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>No se encontraron las credenciales de autenticación.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>La solicitud de autenticación no se pudo procesar debido a un problema del sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credenciales no válidas.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>La cookie ya ha sido usada por otra persona.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>No tiene privilegios para solicitar el recurso.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF no válido.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>El vector de inicialización (digest nonce) ha expirado.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>No se encontró un proveedor de autenticación que soporte el token de autenticación.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>No hay ninguna sesión disponible, ha expirado o las cookies no están habilitados.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>No se encontró ningún token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>No se encontró el nombre de usuario.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>La cuenta ha expirado.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Las credenciales han expirado.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>La cuenta está deshabilitada.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>La cuenta está bloqueada.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\m�|JJPpear/Symfony/Component/Security/Core/Resources/translations/security.sr_Cyrl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Изузетак при аутентификацији.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Аутентификациони подаци нису пронађени.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Захтев за аутентификацију не може бити обрађен због системских проблема.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Невалидни подаци за аутентификацију.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Колачић је већ искоришћен од стране неког другог.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Немате права приступа овом ресурсу.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Невалидан CSRF токен.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Време криптографског кључа је истекло.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Аутентификациони провајдер за подршку токена није пронађен.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Сесија није доступна, истекла је или су колачићи искључени.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Токен не може бити пронађен.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Корисничко име не може бити пронађено.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Налог је истекао.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Подаци за аутентификацију су истекли.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Налог је онемогућен.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Налог је закључан.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\'���{
{
Kpear/Symfony/Component/Security/Core/Resources/translations/security.tr.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Bir yetkilendirme istisnası oluştu.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Yetkilendirme girdileri bulunamadı.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Bir sistem hatası nedeniyle yetkilendirme isteği işleme alınamıyor.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Geçersiz girdiler.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Çerez bir başkası tarafından zaten kullanılmıştı.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Kaynak talebi için imtiyaz bulunamadı.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Geçersiz CSRF fişi.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Derleme zaman aşımı gerçekleşti.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Yetkilendirme fişini destekleyecek yetkilendirme sağlayıcısı bulunamadı.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Oturum bulunamadı, zaman aşımına uğradı veya çerezler etkin değil.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Bilet bulunamadı.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Kullanıcı adı bulunamadı.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Hesap zaman aşımına uğradı.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Girdiler zaman aşımına uğradı.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Hesap devre dışı bırakılmış.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Hesap kilitlenmiş.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\5�˙��Kpear/Symfony/Component/Security/Core/Resources/translations/security.ua.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Помилка автентифікації.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Автентифікаційні дані не знайдено.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Запит на автентифікацію не може бути опрацьовано у зв’язку з проблемою в системі.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Невірні автентифікаційні дані.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Хтось інший вже використав цей сookie.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Відсутні права на запит цього ресурсу.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Невірний токен CSRF.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Закінчився термін дії одноразового ключа дайджесту.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Не знайдено провайдера автентифікації, що підтримує токен автентифікаціії.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Сесія недоступна, її час вийшов, або cookies вимкнено.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Токен не знайдено.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Ім’я користувача не знайдено.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Термін дії облікового запису вичерпано.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Термін дії автентифікаційних даних вичерпано.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Обліковий запис відключено.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Обліковий запис заблоковано.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\��u^
^
Kpear/Symfony/Component/Security/Core/Resources/translations/security.sv.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ett autentiseringsfel har inträffat.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Uppgifterna för autentisering kunde inte hittas.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Autentiseringen kunde inte genomföras på grund av systemfel.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Felaktiga uppgifter.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookien har redan använts av någon annan.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Saknar rättigheter för resursen.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Ogiltig CSRF-token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Förfallen digest nonce.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Ingen leverantör för autentisering hittades för angiven autentiseringstoken.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Ingen session finns tillgänglig, antingen har den förfallit eller är cookies inte aktiverat.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Ingen token kunde hittas.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Användarnamnet kunde inte hittas.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Kontot har förfallit.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Uppgifterna har förfallit.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Kontot är inaktiverat.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Kontot är låst.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\.W�
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.no.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="no" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>En autentiserings feil har skjedd.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Påloggingsinformasjonen kunne ikke bli funnet.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Autentiserings forespørselen kunne ikke bli prosessert grunnet en system feil.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Ugyldig påloggingsinformasjonen.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie har allerede blitt brukt av noen andre.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Ingen tilgang til å be om gitt kilde.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Ugyldig CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce er utløpt.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Ingen autentiserings tilbyder funnet som støtter gitt autentiserings token.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Ingen sesjon tilgjengelig, sesjonen er enten utløpt eller cookies ikke skrudd på.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Ingen token kunne bli funnet.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Brukernavn kunne ikke bli funnet.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Brukerkonto har utgått.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Påloggingsinformasjon har utløpt.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Brukerkonto er deaktivert.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Brukerkonto er sperret.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\��|H�
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.hu.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Hitelesítési hiba lépett fel.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Nem találhatók hitelesítési információk.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>A hitelesítési kérést rendszerhiba miatt nem lehet feldolgozni.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Érvénytelen hitelesítési információk.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Ezt a sütit valaki más már felhasználta.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nem rendelkezik az erőforrás eléréséhez szükséges jogosultsággal.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Érvénytelen CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>A kivonat bélyege (nonce) lejárt.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nem található a hitelesítési tokent támogató hitelesítési szolgáltatás.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Munkamenet nem áll rendelkezésre, túllépte az időkeretet vagy a sütik le vannak tiltva.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Nem található token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>A felhasználónév nem található.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>A fiók lejárt.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>A hitelesítési információk lejártak.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Felfüggesztett fiók.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Zárolt fiók.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\o'�N�
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.de.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Es ist ein Fehler bei der Authentifikation aufgetreten.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Es konnten keine Zugangsdaten gefunden werden.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Die Authentifikation konnte wegen eines Systemproblems nicht bearbeitet werden.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Fehlerhafte Zugangsdaten.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie wurde bereits von jemand anderem verwendet.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Keine Rechte, um die Ressource anzufragen.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Ungültiges CSRF-Token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce ist abgelaufen.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Es wurde kein Authentifizierungs-Provider gefunden, der das Authentifizierungs-Token unterstützt.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Keine Session verfügbar, entweder ist diese abgelaufen oder Cookies sind nicht aktiviert.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Es wurde kein Token gefunden.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Der Benutzername wurde nicht gefunden.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Der Account ist abgelaufen.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Die Zugangsdaten sind abgelaufen.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Der Account ist deaktiviert.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Der Account ist gesperrt.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\z��
J
J
Kpear/Symfony/Component/Security/Core/Resources/translations/security.da.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="no" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>En fejl indtraf ved godkendelse.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Loginoplysninger kan findes.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Godkendelsesanmodning kan ikke behandles på grund af et systemfejl.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Ugyldige loginoplysninger.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie er allerede brugt af en anden.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Ingen tilladselese at anvende kilden.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Ugyldigt CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce er udløbet.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Ingen godkendelsesudbyder er fundet til understøttelsen af godkendelsestoken.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Ingen session tilgængelig, sessionen er enten udløbet eller cookies er ikke aktiveret.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Ingen token kan findes.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Brugernavn kan ikke findes.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Brugerkonto er udløbet.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Loginoplysninger er udløbet.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Brugerkonto er deaktiveret.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Brugerkonto er låst.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\M-�@Kpear/Symfony/Component/Security/Core/Resources/translations/security.fa.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>خطایی هنگام تعیین اعتبار اتفاق افتاد.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>شرایط تعیین اعتبار پیدا نشد.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>درخواست تعیین اعتبار به دلیل مشکل سیستم قابل بررسی نیست.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>شرایط نامعتبر.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>کوکی قبلا برای شخص دیگری استفاده شده است.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>دسترسی لازم برای درخواست این منبع را ندارید.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>توکن CSRF معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce منقضی شده است.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>هیچ ارایه کننده تعیین اعتباری برای ساپورت توکن تعیین اعتبار پیدا نشد.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>جلسه‌ای در دسترس نیست. این میتواند یا به دلیل پایان یافتن زمان باشد یا اینکه کوکی ها فعال نیستند.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>هیچ توکنی پیدا نشد.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>نام ‌کاربری پیدا نشد.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>حساب کاربری منقضی شده است.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>پارامترهای تعیین اعتبار منقضی شده‌اند.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>حساب کاربری غیرفعال است.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>حساب کاربری قفل شده است.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\��ق
�
Kpear/Symfony/Component/Security/Core/Resources/translations/security.sk.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Pri overovaní došlo k chybe.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Overovacie údaje neboli nájdené.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Požiadavok na overenie nemohol byť spracovaný kvôli systémovej chybe.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Neplatné prihlasovacie údaje.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie už bolo použité niekým iným.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nemáte oprávnenie pristupovať k prostriedku.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Neplatný CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Platnosť inicializačného vektoru (digest nonce) skončila.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Poskytovateľ pre overovací token nebol nájdený.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Session nie je k dispozíci, vypršala jej platnosť, alebo sú zakázané cookies.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Token nebol nájdený.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Prihlasovacie meno nebolo nájdené.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Platnosť účtu skončila.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Platnosť prihlasovacích údajov skončila.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Účet je zakázaný.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Účet je zablokovaný.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\��	�	Fpear/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Encoder;

use Symfony\Component\Security\Core\Exception\BadCredentialsException;

/**
 * @author Elnur Abdurrakhimov <elnur@elnur.pro>
 * @author Terje Bråten <terje@braten.be>
 */
class BCryptPasswordEncoder extends BasePasswordEncoder
{
    /**
     * @var string
     */
    private $cost;

    /**
     * Constructor.
     *
     * @param integer $cost The algorithmic cost that should be used
     *
     * @throws \RuntimeException When no BCrypt encoder is available
     * @throws \InvalidArgumentException if cost is out of range
     */
    public function __construct($cost)
    {
        if (!function_exists('password_hash')) {
            throw new \RuntimeException('To use the BCrypt encoder, you need to upgrade to PHP 5.5 or install the "ircmaxell/password-compat" via Composer.');
        }

        $cost = (int) $cost;
        if ($cost < 4 || $cost > 31) {
            throw new \InvalidArgumentException('Cost must be in the range of 4-31.');
        }

        $this->cost = $cost;
    }

    /**
     * Encodes the raw password.
     *
     * It doesn't work with PHP versions lower than 5.3.7, since
     * the password compat library uses CRYPT_BLOWFISH hash type with
     * the "$2y$" salt prefix (which is not available in the early PHP versions).
     * @see https://github.com/ircmaxell/password_compat/issues/10#issuecomment-11203833
     *
     * It is almost best to **not** pass a salt and let PHP generate one for you.
     *
     * @param string $raw  The password to encode
     * @param string $salt The salt
     *
     * @return string The encoded password
     *
     * @link http://lxr.php.net/xref/PHP_5_5/ext/standard/password.c#111
     */
    public function encodePassword($raw, $salt)
    {
        if ($this->isPasswordTooLong($raw)) {
            throw new BadCredentialsException('Invalid password.');
        }

        $options = array('cost' => $this->cost);

        if ($salt) {
            $options['salt'] = $salt;
        }

        return password_hash($raw, PASSWORD_BCRYPT, $options);
    }

    /**
     * {@inheritdoc}
     */
    public function isPasswordValid($encoded, $raw, $salt)
    {
        return !$this->isPasswordTooLong($raw) && password_verify($raw, $encoded);
    }
}
PK�`�\��^��Mpear/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Encoder;

use Symfony\Component\Security\Core\Exception\BadCredentialsException;

/**
 * MessageDigestPasswordEncoder uses a message digest algorithm.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class MessageDigestPasswordEncoder extends BasePasswordEncoder
{
    private $algorithm;
    private $encodeHashAsBase64;
    private $iterations;

    /**
     * Constructor.
     *
     * @param string  $algorithm          The digest algorithm to use
     * @param Boolean $encodeHashAsBase64 Whether to base64 encode the password hash
     * @param integer $iterations         The number of iterations to use to stretch the password hash
     */
    public function __construct($algorithm = 'sha512', $encodeHashAsBase64 = true, $iterations = 5000)
    {
        $this->algorithm = $algorithm;
        $this->encodeHashAsBase64 = $encodeHashAsBase64;
        $this->iterations = $iterations;
    }

    /**
     * {@inheritdoc}
     */
    public function encodePassword($raw, $salt)
    {
        if ($this->isPasswordTooLong($raw)) {
            throw new BadCredentialsException('Invalid password.');
        }

        if (!in_array($this->algorithm, hash_algos(), true)) {
            throw new \LogicException(sprintf('The algorithm "%s" is not supported.', $this->algorithm));
        }

        $salted = $this->mergePasswordAndSalt($raw, $salt);
        $digest = hash($this->algorithm, $salted, true);

        // "stretch" hash
        for ($i = 1; $i < $this->iterations; $i++) {
            $digest = hash($this->algorithm, $digest.$salted, true);
        }

        return $this->encodeHashAsBase64 ? base64_encode($digest) : bin2hex($digest);
    }

    /**
     * {@inheritdoc}
     */
    public function isPasswordValid($encoded, $raw, $salt)
    {
        return !$this->isPasswordTooLong($raw) && $this->comparePasswords($encoded, $this->encodePassword($raw, $salt));
    }
}
PK�`�\�;D��?pear/Symfony/Component/Security/Core/Encoder/EncoderFactory.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Encoder;

/**
 * A generic encoder factory implementation
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class EncoderFactory implements EncoderFactoryInterface
{
    private $encoders;

    public function __construct(array $encoders)
    {
        $this->encoders = $encoders;
    }

    /**
     * {@inheritDoc}
     */
    public function getEncoder($user)
    {
        foreach ($this->encoders as $class => $encoder) {
            if ((is_object($user) && !$user instanceof $class) || (!is_object($user) && !is_subclass_of($user, $class) && $user != $class)) {
                continue;
            }

            if (!$encoder instanceof PasswordEncoderInterface) {
                return $this->encoders[$class] = $this->createEncoder($encoder);
            }

            return $this->encoders[$class];
        }

        throw new \RuntimeException(sprintf('No encoder has been configured for account "%s".', is_object($user) ? get_class($user) : $user));
    }

    /**
     * Creates the actual encoder instance
     *
     * @param array $config
     *
     * @return PasswordEncoderInterface
     *
     * @throws \InvalidArgumentException
     */
    private function createEncoder(array $config)
    {
        if (!isset($config['class'])) {
            throw new \InvalidArgumentException(sprintf('"class" must be set in %s.', json_encode($config)));
        }
        if (!isset($config['arguments'])) {
            throw new \InvalidArgumentException(sprintf('"arguments" must be set in %s.', json_encode($config)));
        }

        $reflection = new \ReflectionClass($config['class']);

        return $reflection->newInstanceArgs($config['arguments']);
    }
}
PK�`�\#�MMqqHpear/Symfony/Component/Security/Core/Encoder/EncoderFactoryInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Encoder;

use Symfony\Component\Security\Core\User\UserInterface;

/**
 * EncoderFactoryInterface to support different encoders for different accounts.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface EncoderFactoryInterface
{
    /**
     * Returns the password encoder to use for the given account.
     *
     * @param UserInterface|string $user A UserInterface instance or a class name
     *
     * @return PasswordEncoderInterface
     *
     * @throws \RuntimeException when no password encoder could be found for the user
     */
    public function getEncoder($user);
}
PK�`�\E� �Ipear/Symfony/Component/Security/Core/Encoder/PasswordEncoderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Encoder;

/**
 * PasswordEncoderInterface is the interface for all encoders.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface PasswordEncoderInterface
{
    /**
     * Encodes the raw password.
     *
     * @param string $raw  The password to encode
     * @param string $salt The salt
     *
     * @return string The encoded password
     */
    public function encodePassword($raw, $salt);

    /**
     * Checks a raw password against an encoded password.
     *
     * @param string $encoded An encoded password
     * @param string $raw     A raw password
     * @param string $salt    The salt
     *
     * @return Boolean true if the password is valid, false otherwise
     */
    public function isPasswordValid($encoded, $raw, $salt);
}
PK�`�\,>"�Ipear/Symfony/Component/Security/Core/Encoder/PlaintextPasswordEncoder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Encoder;

use Symfony\Component\Security\Core\Exception\BadCredentialsException;

/**
 * PlaintextPasswordEncoder does not do any encoding.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class PlaintextPasswordEncoder extends BasePasswordEncoder
{
    private $ignorePasswordCase;

    /**
     * Constructor.
     *
     * @param Boolean $ignorePasswordCase Compare password case-insensitive
     */
    public function __construct($ignorePasswordCase = false)
    {
        $this->ignorePasswordCase = $ignorePasswordCase;
    }

    /**
     * {@inheritdoc}
     */
    public function encodePassword($raw, $salt)
    {
        if ($this->isPasswordTooLong($raw)) {
            throw new BadCredentialsException('Invalid password.');
        }

        return $this->mergePasswordAndSalt($raw, $salt);
    }

    /**
     * {@inheritdoc}
     */
    public function isPasswordValid($encoded, $raw, $salt)
    {
        if ($this->isPasswordTooLong($raw)) {
            return false;
        }

        $pass2 = $this->mergePasswordAndSalt($raw, $salt);

        if (!$this->ignorePasswordCase) {
            return $this->comparePasswords($encoded, $pass2);
        }

        return $this->comparePasswords(strtolower($encoded), strtolower($pass2));
    }
}
PK�`�\!�@

Fpear/Symfony/Component/Security/Core/Encoder/Pbkdf2PasswordEncoder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Encoder;

use Symfony\Component\Security\Core\Exception\BadCredentialsException;

/**
 * Pbkdf2PasswordEncoder uses the PBKDF2 (Password-Based Key Derivation Function 2).
 *
 * Providing a high level of Cryptographic security,
 *  PBKDF2 is recommended by the National Institute of Standards and Technology (NIST).
 *
 * But also warrants a warning, using PBKDF2 (with a high number of iterations) slows down the process.
 * PBKDF2 should be used with caution and care.
 *
 * @author Sebastiaan Stok <s.stok@rollerscapes.net>
 * @author Andrew Johnson
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Pbkdf2PasswordEncoder extends BasePasswordEncoder
{
    private $algorithm;
    private $encodeHashAsBase64;
    private $iterations;
    private $length;

    /**
     * Constructor.
     *
     * @param string  $algorithm          The digest algorithm to use
     * @param Boolean $encodeHashAsBase64 Whether to base64 encode the password hash
     * @param integer $iterations         The number of iterations to use to stretch the password hash
     * @param integer $length             Length of derived key to create
     */
    public function __construct($algorithm = 'sha512', $encodeHashAsBase64 = true, $iterations = 1000, $length = 40)
    {
        $this->algorithm = $algorithm;
        $this->encodeHashAsBase64 = $encodeHashAsBase64;
        $this->iterations = $iterations;
        $this->length = $length;
    }

    /**
     * {@inheritdoc}
     *
     * @throws \LogicException when the algorithm is not supported
     */
    public function encodePassword($raw, $salt)
    {
        if ($this->isPasswordTooLong($raw)) {
            throw new BadCredentialsException('Invalid password.');
        }

        if (!in_array($this->algorithm, hash_algos(), true)) {
            throw new \LogicException(sprintf('The algorithm "%s" is not supported.', $this->algorithm));
        }

        if (function_exists('hash_pbkdf2')) {
            $digest = hash_pbkdf2($this->algorithm, $raw, $salt, $this->iterations, $this->length, true);
        } else {
            $digest = $this->hashPbkdf2($this->algorithm, $raw, $salt, $this->iterations, $this->length);
        }

        return $this->encodeHashAsBase64 ? base64_encode($digest) : bin2hex($digest);
    }

    /**
     * {@inheritdoc}
     */
    public function isPasswordValid($encoded, $raw, $salt)
    {
        return !$this->isPasswordTooLong($raw) && $this->comparePasswords($encoded, $this->encodePassword($raw, $salt));
    }

    private function hashPbkdf2($algorithm, $password, $salt, $iterations, $length = 0)
    {
        // Number of blocks needed to create the derived key
        $blocks = ceil($length / strlen(hash($algorithm, null, true)));
        $digest = '';

        for ($i = 1; $i <= $blocks; $i++) {
            $ib = $block = hash_hmac($algorithm, $salt.pack('N', $i), $password, true);

            // Iterations
            for ($j = 1; $j < $iterations; $j++) {
                $ib ^= ($block = hash_hmac($algorithm, $block, $password, true));
            }

            $digest .= $ib;
        }

        return substr($digest, 0, $this->length);
    }
}
PK�`�\�7���
�
Dpear/Symfony/Component/Security/Core/Encoder/BasePasswordEncoder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Encoder;

use Symfony\Component\Security\Core\Util\StringUtils;

/**
 * BasePasswordEncoder is the base class for all password encoders.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class BasePasswordEncoder implements PasswordEncoderInterface
{
    const MAX_PASSWORD_LENGTH = 4096;

    /**
     * Demerges a merge password and salt string.
     *
     * @param string $mergedPasswordSalt The merged password and salt string
     *
     * @return array An array where the first element is the password and the second the salt
     */
    protected function demergePasswordAndSalt($mergedPasswordSalt)
    {
        if (empty($mergedPasswordSalt)) {
            return array('', '');
        }

        $password = $mergedPasswordSalt;
        $salt = '';
        $saltBegins = strrpos($mergedPasswordSalt, '{');

        if (false !== $saltBegins && $saltBegins + 1 < strlen($mergedPasswordSalt)) {
            $salt = substr($mergedPasswordSalt, $saltBegins + 1, -1);
            $password = substr($mergedPasswordSalt, 0, $saltBegins);
        }

        return array($password, $salt);
    }

    /**
     * Merges a password and a salt.
     *
     * @param string $password the password to be used
     * @param string $salt     the salt to be used
     *
     * @return string a merged password and salt
     *
     * @throws \InvalidArgumentException
     */
    protected function mergePasswordAndSalt($password, $salt)
    {
        if (empty($salt)) {
            return $password;
        }

        if (false !== strrpos($salt, '{') || false !== strrpos($salt, '}')) {
            throw new \InvalidArgumentException('Cannot use { or } in salt.');
        }

        return $password.'{'.$salt.'}';
    }

    /**
     * Compares two passwords.
     *
     * This method implements a constant-time algorithm to compare passwords to
     * avoid (remote) timing attacks.
     *
     * @param string $password1 The first password
     * @param string $password2 The second password
     *
     * @return Boolean true if the two passwords are the same, false otherwise
     */
    protected function comparePasswords($password1, $password2)
    {
        return StringUtils::equals($password1, $password2);
    }

    /**
     * Checks if the password is too long.
     *
     * @return Boolean true if the password is too long, false otherwise
     */
    protected function isPasswordTooLong($password)
    {
        return strlen($password) > self::MAX_PASSWORD_LENGTH;
    }
}
PK�`�\��
�77Tpear/Symfony/Component/Security/Core/Validator/Constraints/UserPasswordValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Validator\Constraints;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;

class UserPasswordValidator extends ConstraintValidator
{
    private $securityContext;
    private $encoderFactory;

    public function __construct(SecurityContextInterface $securityContext, EncoderFactoryInterface $encoderFactory)
    {
        $this->securityContext = $securityContext;
        $this->encoderFactory = $encoderFactory;
    }

    /**
     * {@inheritdoc}
     */
    public function validate($password, Constraint $constraint)
    {
        $user = $this->securityContext->getToken()->getUser();

        if (!$user instanceof UserInterface) {
            throw new ConstraintDefinitionException('The User object must implement the UserInterface interface.');
        }

        $encoder = $this->encoderFactory->getEncoder($user);

        if (!$encoder->isPasswordValid($user->getPassword(), $password, $user->getSalt())) {
            $this->context->addViolation($constraint->message);
        }
    }
}
PK�`�\��i��Kpear/Symfony/Component/Security/Core/Validator/Constraints/UserPassword.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class UserPassword extends Constraint
{
    public $message = 'This value should be the user current password.';
    public $service = 'security.validator.user_password';

    /**
     * {@inheritdoc}
     */
    public function validatedBy()
    {
        return $this->service;
    }
}
PK�`�\t��?pear/Symfony/Component/Security/Acl/Dbal/MutableAclProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Dbal;

use Doctrine\Common\PropertyChangedListener;
use Doctrine\DBAL\Driver\Connection;
use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
use Symfony\Component\Security\Acl\Exception\AclAlreadyExistsException;
use Symfony\Component\Security\Acl\Exception\ConcurrentModificationException;
use Symfony\Component\Security\Acl\Model\AclCacheInterface;
use Symfony\Component\Security\Acl\Model\AclInterface;
use Symfony\Component\Security\Acl\Model\EntryInterface;
use Symfony\Component\Security\Acl\Model\MutableAclInterface;
use Symfony\Component\Security\Acl\Model\MutableAclProviderInterface;
use Symfony\Component\Security\Acl\Model\ObjectIdentityInterface;
use Symfony\Component\Security\Acl\Model\PermissionGrantingStrategyInterface;
use Symfony\Component\Security\Acl\Model\SecurityIdentityInterface;

/**
 * An implementation of the MutableAclProviderInterface using Doctrine DBAL.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class MutableAclProvider extends AclProvider implements MutableAclProviderInterface, PropertyChangedListener
{
    private $propertyChanges;

    /**
     * {@inheritDoc}
     */
    public function __construct(Connection $connection, PermissionGrantingStrategyInterface $permissionGrantingStrategy, array $options, AclCacheInterface $cache = null)
    {
        parent::__construct($connection, $permissionGrantingStrategy, $options, $cache);

        $this->propertyChanges = new \SplObjectStorage();
    }

    /**
     * {@inheritDoc}
     */
    public function createAcl(ObjectIdentityInterface $oid)
    {
        if (false !== $this->retrieveObjectIdentityPrimaryKey($oid)) {
            throw new AclAlreadyExistsException(sprintf('%s is already associated with an ACL.', $oid));
        }

        $this->connection->beginTransaction();
        try {
            $this->createObjectIdentity($oid);

            $pk = $this->retrieveObjectIdentityPrimaryKey($oid);
            $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk));

            $this->connection->commit();
        } catch (\Exception $failed) {
            $this->connection->rollBack();

            throw $failed;
        }

        // re-read the ACL from the database to ensure proper caching, etc.
        return $this->findAcl($oid);
    }

    /**
     * {@inheritDoc}
     */
    public function deleteAcl(ObjectIdentityInterface $oid)
    {
        $this->connection->beginTransaction();
        try {
            foreach ($this->findChildren($oid, true) as $childOid) {
                $this->deleteAcl($childOid);
            }

            $oidPK = $this->retrieveObjectIdentityPrimaryKey($oid);

            $this->deleteAccessControlEntries($oidPK);
            $this->deleteObjectIdentityRelations($oidPK);
            $this->deleteObjectIdentity($oidPK);

            $this->connection->commit();
        } catch (\Exception $failed) {
            $this->connection->rollBack();

            throw $failed;
        }

        // evict the ACL from the in-memory identity map
        if (isset($this->loadedAcls[$oid->getType()][$oid->getIdentifier()])) {
            $this->propertyChanges->offsetUnset($this->loadedAcls[$oid->getType()][$oid->getIdentifier()]);
            unset($this->loadedAcls[$oid->getType()][$oid->getIdentifier()]);
        }

        // evict the ACL from any caches
        if (null !== $this->cache) {
            $this->cache->evictFromCacheByIdentity($oid);
        }
    }

    /**
     * {@inheritDoc}
     */
    public function findAcls(array $oids, array $sids = array())
    {
        $result = parent::findAcls($oids, $sids);

        foreach ($result as $oid) {
            $acl = $result->offsetGet($oid);

            if (false === $this->propertyChanges->contains($acl) && $acl instanceof MutableAclInterface) {
                $acl->addPropertyChangedListener($this);
                $this->propertyChanges->attach($acl, array());
            }

            $parentAcl = $acl->getParentAcl();
            while (null !== $parentAcl) {
                if (false === $this->propertyChanges->contains($parentAcl) && $acl instanceof MutableAclInterface) {
                    $parentAcl->addPropertyChangedListener($this);
                    $this->propertyChanges->attach($parentAcl, array());
                }

                $parentAcl = $parentAcl->getParentAcl();
            }
        }

        return $result;
    }

    /**
     * Implementation of PropertyChangedListener
     *
     * This allows us to keep track of which values have been changed, so we don't
     * have to do a full introspection when ->updateAcl() is called.
     *
     * @param mixed  $sender
     * @param string $propertyName
     * @param mixed  $oldValue
     * @param mixed  $newValue
     *
     * @throws \InvalidArgumentException
     */
    public function propertyChanged($sender, $propertyName, $oldValue, $newValue)
    {
        if (!$sender instanceof MutableAclInterface && !$sender instanceof EntryInterface) {
            throw new \InvalidArgumentException('$sender must be an instance of MutableAclInterface, or EntryInterface.');
        }

        if ($sender instanceof EntryInterface) {
            if (null === $sender->getId()) {
                return;
            }

            $ace = $sender;
            $sender = $ace->getAcl();
        } else {
            $ace = null;
        }

        if (false === $this->propertyChanges->contains($sender)) {
            throw new \InvalidArgumentException('$sender is not being tracked by this provider.');
        }

        $propertyChanges = $this->propertyChanges->offsetGet($sender);
        if (null === $ace) {
            if (isset($propertyChanges[$propertyName])) {
                $oldValue = $propertyChanges[$propertyName][0];
                if ($oldValue === $newValue) {
                    unset($propertyChanges[$propertyName]);
                } else {
                    $propertyChanges[$propertyName] = array($oldValue, $newValue);
                }
            } else {
                $propertyChanges[$propertyName] = array($oldValue, $newValue);
            }
        } else {
            if (!isset($propertyChanges['aces'])) {
                $propertyChanges['aces'] = new \SplObjectStorage();
            }

            $acePropertyChanges = $propertyChanges['aces']->contains($ace)? $propertyChanges['aces']->offsetGet($ace) : array();

            if (isset($acePropertyChanges[$propertyName])) {
                $oldValue = $acePropertyChanges[$propertyName][0];
                if ($oldValue === $newValue) {
                    unset($acePropertyChanges[$propertyName]);
                } else {
                    $acePropertyChanges[$propertyName] = array($oldValue, $newValue);
                }
            } else {
                $acePropertyChanges[$propertyName] = array($oldValue, $newValue);
            }

            if (count($acePropertyChanges) > 0) {
                $propertyChanges['aces']->offsetSet($ace, $acePropertyChanges);
            } else {
                $propertyChanges['aces']->offsetUnset($ace);

                if (0 === count($propertyChanges['aces'])) {
                    unset($propertyChanges['aces']);
                }
            }
        }

        $this->propertyChanges->offsetSet($sender, $propertyChanges);
    }

    /**
     * {@inheritDoc}
     */
    public function updateAcl(MutableAclInterface $acl)
    {
        if (!$this->propertyChanges->contains($acl)) {
            throw new \InvalidArgumentException('$acl is not tracked by this provider.');
        }

        $propertyChanges = $this->propertyChanges->offsetGet($acl);
        // check if any changes were made to this ACL
        if (0 === count($propertyChanges)) {
            return;
        }

        $sets = $sharedPropertyChanges = array();

        $this->connection->beginTransaction();
        try {
            if (isset($propertyChanges['entriesInheriting'])) {
                $sets[] = 'entries_inheriting = '.$this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['entriesInheriting'][1]);
            }

            if (isset($propertyChanges['parentAcl'])) {
                if (null === $propertyChanges['parentAcl'][1]) {
                    $sets[] = 'parent_object_identity_id = NULL';
                } else {
                    $sets[] = 'parent_object_identity_id = '.intval($propertyChanges['parentAcl'][1]->getId());
                }

                $this->regenerateAncestorRelations($acl);
                $childAcls = $this->findAcls($this->findChildren($acl->getObjectIdentity(), false));
                foreach ($childAcls as $childOid) {
                    $this->regenerateAncestorRelations($childAcls[$childOid]);
                }
            }

            // check properties for deleted, and created ACEs, and perform deletions
            // we need to perfom deletions before updating existing ACEs, in order to
            // preserve uniqueness of the order field
            if (isset($propertyChanges['classAces'])) {
                $this->updateOldAceProperty('classAces', $propertyChanges['classAces']);
            }
            if (isset($propertyChanges['classFieldAces'])) {
                $this->updateOldFieldAceProperty('classFieldAces', $propertyChanges['classFieldAces']);
            }
            if (isset($propertyChanges['objectAces'])) {
                $this->updateOldAceProperty('objectAces', $propertyChanges['objectAces']);
            }
            if (isset($propertyChanges['objectFieldAces'])) {
                $this->updateOldFieldAceProperty('objectFieldAces', $propertyChanges['objectFieldAces']);
            }

            // this includes only updates of existing ACEs, but neither the creation, nor
            // the deletion of ACEs; these are tracked by changes to the ACL's respective
            // properties (classAces, classFieldAces, objectAces, objectFieldAces)
            if (isset($propertyChanges['aces'])) {
                $this->updateAces($propertyChanges['aces']);
            }

            // check properties for deleted, and created ACEs, and perform creations
            if (isset($propertyChanges['classAces'])) {
                $this->updateNewAceProperty('classAces', $propertyChanges['classAces']);
                $sharedPropertyChanges['classAces'] = $propertyChanges['classAces'];
            }
            if (isset($propertyChanges['classFieldAces'])) {
                $this->updateNewFieldAceProperty('classFieldAces', $propertyChanges['classFieldAces']);
                $sharedPropertyChanges['classFieldAces'] = $propertyChanges['classFieldAces'];
            }
            if (isset($propertyChanges['objectAces'])) {
                $this->updateNewAceProperty('objectAces', $propertyChanges['objectAces']);
            }
            if (isset($propertyChanges['objectFieldAces'])) {
                $this->updateNewFieldAceProperty('objectFieldAces', $propertyChanges['objectFieldAces']);
            }

            // if there have been changes to shared properties, we need to synchronize other
            // ACL instances for object identities of the same type that are already in-memory
            if (count($sharedPropertyChanges) > 0) {
                $classAcesProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Acl', 'classAces');
                $classAcesProperty->setAccessible(true);
                $classFieldAcesProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Acl', 'classFieldAces');
                $classFieldAcesProperty->setAccessible(true);

                foreach ($this->loadedAcls[$acl->getObjectIdentity()->getType()] as $sameTypeAcl) {
                    if (isset($sharedPropertyChanges['classAces'])) {
                        if ($acl !== $sameTypeAcl && $classAcesProperty->getValue($sameTypeAcl) !== $sharedPropertyChanges['classAces'][0]) {
                            throw new ConcurrentModificationException('The "classAces" property has been modified concurrently.');
                        }

                        $classAcesProperty->setValue($sameTypeAcl, $sharedPropertyChanges['classAces'][1]);
                    }

                    if (isset($sharedPropertyChanges['classFieldAces'])) {
                        if ($acl !== $sameTypeAcl && $classFieldAcesProperty->getValue($sameTypeAcl) !== $sharedPropertyChanges['classFieldAces'][0]) {
                            throw new ConcurrentModificationException('The "classFieldAces" property has been modified concurrently.');
                        }

                        $classFieldAcesProperty->setValue($sameTypeAcl, $sharedPropertyChanges['classFieldAces'][1]);
                    }
                }
            }

            // persist any changes to the acl_object_identities table
            if (count($sets) > 0) {
                $this->connection->executeQuery($this->getUpdateObjectIdentitySql($acl->getId(), $sets));
            }

            $this->connection->commit();
        } catch (\Exception $failed) {
            $this->connection->rollBack();

            throw $failed;
        }

        $this->propertyChanges->offsetSet($acl, array());

        if (null !== $this->cache) {
            if (count($sharedPropertyChanges) > 0) {
                // FIXME: Currently, there is no easy way to clear the cache for ACLs
                //        of a certain type. The problem here is that we need to make
                //        sure to clear the cache of all child ACLs as well, and these
                //        child ACLs might be of a different class type.
                $this->cache->clearCache();
            } else {
                // if there are no shared property changes, it's sufficient to just delete
                // the cache for this ACL
                $this->cache->evictFromCacheByIdentity($acl->getObjectIdentity());

                foreach ($this->findChildren($acl->getObjectIdentity()) as $childOid) {
                    $this->cache->evictFromCacheByIdentity($childOid);
                }
            }
        }
    }

    /**
     * Constructs the SQL for deleting access control entries.
     *
     * @param integer $oidPK
     * @return string
     */
    protected function getDeleteAccessControlEntriesSql($oidPK)
    {
        return sprintf(
              'DELETE FROM %s WHERE object_identity_id = %d',
            $this->options['entry_table_name'],
            $oidPK
        );
    }

    /**
     * Constructs the SQL for deleting a specific ACE.
     *
     * @param integer $acePK
     * @return string
     */
    protected function getDeleteAccessControlEntrySql($acePK)
    {
        return sprintf(
            'DELETE FROM %s WHERE id = %d',
            $this->options['entry_table_name'],
            $acePK
        );
    }

    /**
     * Constructs the SQL for deleting an object identity.
     *
     * @param integer $pk
     * @return string
     */
    protected function getDeleteObjectIdentitySql($pk)
    {
        return sprintf(
            'DELETE FROM %s WHERE id = %d',
            $this->options['oid_table_name'],
            $pk
        );
    }

    /**
     * Constructs the SQL for deleting relation entries.
     *
     * @param integer $pk
     * @return string
     */
    protected function getDeleteObjectIdentityRelationsSql($pk)
    {
        return sprintf(
            'DELETE FROM %s WHERE object_identity_id = %d',
            $this->options['oid_ancestors_table_name'],
            $pk
        );
    }

    /**
     * Constructs the SQL for inserting an ACE.
     *
     * @param integer      $classId
     * @param integer|null $objectIdentityId
     * @param string|null  $field
     * @param integer      $aceOrder
     * @param integer      $securityIdentityId
     * @param string       $strategy
     * @param integer      $mask
     * @param Boolean      $granting
     * @param Boolean      $auditSuccess
     * @param Boolean      $auditFailure
     * @return string
     */
    protected function getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $aceOrder, $securityIdentityId, $strategy, $mask, $granting, $auditSuccess, $auditFailure)
    {
        $query = <<<QUERY
            INSERT INTO %s (
                class_id,
                object_identity_id,
                field_name,
                ace_order,
                security_identity_id,
                mask,
                granting,
                granting_strategy,
                audit_success,
                audit_failure
            )
            VALUES (%d, %s, %s, %d, %d, %d, %s, %s, %s, %s)
QUERY;

        return sprintf(
            $query,
            $this->options['entry_table_name'],
            $classId,
            null === $objectIdentityId? 'NULL' : intval($objectIdentityId),
            null === $field? 'NULL' : $this->connection->quote($field),
            $aceOrder,
            $securityIdentityId,
            $mask,
            $this->connection->getDatabasePlatform()->convertBooleans($granting),
            $this->connection->quote($strategy),
            $this->connection->getDatabasePlatform()->convertBooleans($auditSuccess),
            $this->connection->getDatabasePlatform()->convertBooleans($auditFailure)
        );
    }

    /**
     * Constructs the SQL for inserting a new class type.
     *
     * @param string $classType
     * @return string
     */
    protected function getInsertClassSql($classType)
    {
        return sprintf(
            'INSERT INTO %s (class_type) VALUES (%s)',
            $this->options['class_table_name'],
            $this->connection->quote($classType)
        );
    }

    /**
     * Constructs the SQL for inserting a relation entry.
     *
     * @param integer $objectIdentityId
     * @param integer $ancestorId
     * @return string
     */
    protected function getInsertObjectIdentityRelationSql($objectIdentityId, $ancestorId)
    {
        return sprintf(
            'INSERT INTO %s (object_identity_id, ancestor_id) VALUES (%d, %d)',
            $this->options['oid_ancestors_table_name'],
            $objectIdentityId,
            $ancestorId
        );
    }

    /**
     * Constructs the SQL for inserting an object identity.
     *
     * @param string  $identifier
     * @param integer $classId
     * @param Boolean $entriesInheriting
     * @return string
     */
    protected function getInsertObjectIdentitySql($identifier, $classId, $entriesInheriting)
    {
        $query = <<<QUERY
              INSERT INTO %s (class_id, object_identifier, entries_inheriting)
              VALUES (%d, %s, %s)
QUERY;

        return sprintf(
            $query,
            $this->options['oid_table_name'],
            $classId,
            $this->connection->quote($identifier),
            $this->connection->getDatabasePlatform()->convertBooleans($entriesInheriting)
        );
    }

    /**
     * Constructs the SQL for inserting a security identity.
     *
     * @param SecurityIdentityInterface $sid
     * @throws \InvalidArgumentException
     * @return string
     */
    protected function getInsertSecurityIdentitySql(SecurityIdentityInterface $sid)
    {
        if ($sid instanceof UserSecurityIdentity) {
            $identifier = $sid->getClass().'-'.$sid->getUsername();
            $username = true;
        } elseif ($sid instanceof RoleSecurityIdentity) {
            $identifier = $sid->getRole();
            $username = false;
        } else {
            throw new \InvalidArgumentException('$sid must either be an instance of UserSecurityIdentity, or RoleSecurityIdentity.');
        }

        return sprintf(
            'INSERT INTO %s (identifier, username) VALUES (%s, %s)',
            $this->options['sid_table_name'],
            $this->connection->quote($identifier),
            $this->connection->getDatabasePlatform()->convertBooleans($username)
        );
    }

    /**
     * Constructs the SQL for selecting an ACE.
     *
     * @param integer $classId
     * @param integer $oid
     * @param string  $field
     * @param integer $order
     * @return string
     */
    protected function getSelectAccessControlEntryIdSql($classId, $oid, $field, $order)
    {
        return sprintf(
            'SELECT id FROM %s WHERE class_id = %d AND %s AND %s AND ace_order = %d',
            $this->options['entry_table_name'],
            $classId,
            null === $oid ?
                $this->connection->getDatabasePlatform()->getIsNullExpression('object_identity_id')
                : 'object_identity_id = '.intval($oid),
            null === $field ?
                $this->connection->getDatabasePlatform()->getIsNullExpression('field_name')
                : 'field_name = '.$this->connection->quote($field),
            $order
        );
    }

    /**
     * Constructs the SQL for selecting the primary key associated with
     * the passed class type.
     *
     * @param string $classType
     * @return string
     */
    protected function getSelectClassIdSql($classType)
    {
        return sprintf(
            'SELECT id FROM %s WHERE class_type = %s',
            $this->options['class_table_name'],
            $this->connection->quote($classType)
        );
    }

    /**
     * Constructs the SQL for selecting the primary key of a security identity.
     *
     * @param SecurityIdentityInterface $sid
     * @throws \InvalidArgumentException
     * @return string
     */
    protected function getSelectSecurityIdentityIdSql(SecurityIdentityInterface $sid)
    {
        if ($sid instanceof UserSecurityIdentity) {
            $identifier = $sid->getClass().'-'.$sid->getUsername();
            $username = true;
        } elseif ($sid instanceof RoleSecurityIdentity) {
            $identifier = $sid->getRole();
            $username = false;
        } else {
            throw new \InvalidArgumentException('$sid must either be an instance of UserSecurityIdentity, or RoleSecurityIdentity.');
        }

        return sprintf(
            'SELECT id FROM %s WHERE identifier = %s AND username = %s',
            $this->options['sid_table_name'],
            $this->connection->quote($identifier),
            $this->connection->getDatabasePlatform()->convertBooleans($username)
        );
    }

    /**
     * Constructs the SQL for updating an object identity.
     *
     * @param integer $pk
     * @param array   $changes
     * @throws \InvalidArgumentException
     * @return string
     */
    protected function getUpdateObjectIdentitySql($pk, array $changes)
    {
        if (0 === count($changes)) {
            throw new \InvalidArgumentException('There are no changes.');
        }

        return sprintf(
            'UPDATE %s SET %s WHERE id = %d',
            $this->options['oid_table_name'],
            implode(', ', $changes),
            $pk
        );
    }

    /**
     * Constructs the SQL for updating an ACE.
     *
     * @param integer $pk
     * @param array   $sets
     * @throws \InvalidArgumentException
     * @return string
     */
    protected function getUpdateAccessControlEntrySql($pk, array $sets)
    {
        if (0 === count($sets)) {
            throw new \InvalidArgumentException('There are no changes.');
        }

        return sprintf(
            'UPDATE %s SET %s WHERE id = %d',
            $this->options['entry_table_name'],
            implode(', ', $sets),
            $pk
        );
    }

    /**
     * Creates the ACL for the passed object identity
     *
     * @param ObjectIdentityInterface $oid
     */
    private function createObjectIdentity(ObjectIdentityInterface $oid)
    {
        $classId = $this->createOrRetrieveClassId($oid->getType());

        $this->connection->executeQuery($this->getInsertObjectIdentitySql($oid->getIdentifier(), $classId, true));
    }

    /**
     * Returns the primary key for the passed class type.
     *
     * If the type does not yet exist in the database, it will be created.
     *
     * @param string $classType
     * @return integer
     */
    private function createOrRetrieveClassId($classType)
    {
        if (false !== $id = $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn()) {
            return $id;
        }

        $this->connection->executeQuery($this->getInsertClassSql($classType));

        return $this->connection->executeQuery($this->getSelectClassIdSql($classType))->fetchColumn();
    }

    /**
     * Returns the primary key for the passed security identity.
     *
     * If the security identity does not yet exist in the database, it will be
     * created.
     *
     * @param SecurityIdentityInterface $sid
     * @return integer
     */
    private function createOrRetrieveSecurityIdentityId(SecurityIdentityInterface $sid)
    {
        if (false !== $id = $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn()) {
            return $id;
        }

        $this->connection->executeQuery($this->getInsertSecurityIdentitySql($sid));

        return $this->connection->executeQuery($this->getSelectSecurityIdentityIdSql($sid))->fetchColumn();
    }

    /**
     * Deletes all ACEs for the given object identity primary key.
     *
     * @param integer $oidPK
     */
    private function deleteAccessControlEntries($oidPK)
    {
        $this->connection->executeQuery($this->getDeleteAccessControlEntriesSql($oidPK));
    }

    /**
     * Deletes the object identity from the database.
     *
     * @param integer $pk
     */
    private function deleteObjectIdentity($pk)
    {
        $this->connection->executeQuery($this->getDeleteObjectIdentitySql($pk));
    }

    /**
     * Deletes all entries from the relations table from the database.
     *
     * @param integer $pk
     */
    private function deleteObjectIdentityRelations($pk)
    {
        $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk));
    }

    /**
     * This regenerates the ancestor table which is used for fast read access.
     *
     * @param AclInterface $acl
     */
    private function regenerateAncestorRelations(AclInterface $acl)
    {
        $pk = $acl->getId();
        $this->connection->executeQuery($this->getDeleteObjectIdentityRelationsSql($pk));
        $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $pk));

        $parentAcl = $acl->getParentAcl();
        while (null !== $parentAcl) {
            $this->connection->executeQuery($this->getInsertObjectIdentityRelationSql($pk, $parentAcl->getId()));

            $parentAcl = $parentAcl->getParentAcl();
        }
    }

    /**
     * This processes new entries changes on an ACE related property (classFieldAces, or objectFieldAces).
     *
     * @param string $name
     * @param array  $changes
     */
    private function updateNewFieldAceProperty($name, array $changes)
    {
        $sids = new \SplObjectStorage();
        $classIds = new \SplObjectStorage();
        $currentIds = array();
        foreach ($changes[1] as $field => $new) {
            for ($i=0,$c=count($new); $i<$c; $i++) {
                $ace = $new[$i];

                if (null === $ace->getId()) {
                    if ($sids->contains($ace->getSecurityIdentity())) {
                        $sid = $sids->offsetGet($ace->getSecurityIdentity());
                    } else {
                        $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity());
                    }

                    $oid = $ace->getAcl()->getObjectIdentity();
                    if ($classIds->contains($oid)) {
                        $classId = $classIds->offsetGet($oid);
                    } else {
                        $classId = $this->createOrRetrieveClassId($oid->getType());
                    }

                    $objectIdentityId = $name === 'classFieldAces' ? null : $ace->getAcl()->getId();

                    $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, $field, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure()));
                    $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, $field, $i))->fetchColumn();
                    $this->loadedAces[$aceId] = $ace;

                    $aceIdProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id');
                    $aceIdProperty->setAccessible(true);
                    $aceIdProperty->setValue($ace, intval($aceId));
                } else {
                    $currentIds[$ace->getId()] = true;
                }
            }
        }
    }

    /**
     * This process old entries changes on an ACE related property (classFieldAces, or objectFieldAces).
     *
     * @param string $name
     * @param array $changes
     */
    private function updateOldFieldAceProperty($ane, array $changes)
    {
        $currentIds = array();
        foreach ($changes[1] as $field => $new) {
            for ($i = 0, $c = count($new); $i < $c; $i++) {
                $ace = $new[$i];

                if (null !== $ace->getId()) {
                    $currentIds[$ace->getId()] = true;
                }
            }
        }

        foreach ($changes[0] as $old) {
            for ($i = 0, $c = count($old); $i < $c; $i++) {
                $ace = $old[$i];

                if (!isset($currentIds[$ace->getId()])) {
                    $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId()));
                    unset($this->loadedAces[$ace->getId()]);
                }
            }
        }
    }

    /**
     * This processes new entries changes on an ACE related property (classAces, or objectAces).
     *
     * @param string $name
     * @param array  $changes
     */
    private function updateNewAceProperty($name, array $changes)
    {
        list($old, $new) = $changes;

        $sids = new \SplObjectStorage();
        $classIds = new \SplObjectStorage();
        $currentIds = array();
        for ($i=0,$c=count($new); $i<$c; $i++) {
            $ace = $new[$i];

            if (null === $ace->getId()) {
                if ($sids->contains($ace->getSecurityIdentity())) {
                    $sid = $sids->offsetGet($ace->getSecurityIdentity());
                } else {
                    $sid = $this->createOrRetrieveSecurityIdentityId($ace->getSecurityIdentity());
                }

                $oid = $ace->getAcl()->getObjectIdentity();
                if ($classIds->contains($oid)) {
                    $classId = $classIds->offsetGet($oid);
                } else {
                    $classId = $this->createOrRetrieveClassId($oid->getType());
                }

                $objectIdentityId = $name === 'classAces' ? null : $ace->getAcl()->getId();

                $this->connection->executeQuery($this->getInsertAccessControlEntrySql($classId, $objectIdentityId, null, $i, $sid, $ace->getStrategy(), $ace->getMask(), $ace->isGranting(), $ace->isAuditSuccess(), $ace->isAuditFailure()));
                $aceId = $this->connection->executeQuery($this->getSelectAccessControlEntryIdSql($classId, $objectIdentityId, null, $i))->fetchColumn();
                $this->loadedAces[$aceId] = $ace;

                $aceIdProperty = new \ReflectionProperty($ace, 'id');
                $aceIdProperty->setAccessible(true);
                $aceIdProperty->setValue($ace, intval($aceId));
            } else {
                $currentIds[$ace->getId()] = true;
            }
        }
    }

    /**
     * This processes old entries changes on an ACE related property (classAces, or objectAces).
     *
     * @param string $name
     * @param array  $changes
     */
    private function updateOldAceProperty($name, array $changes)
    {
        list($old, $new) = $changes;
        $currentIds = array();

        for ($i=0,$c=count($new); $i<$c; $i++) {
            $ace = $new[$i];

            if (null !== $ace->getId()) {
                $currentIds[$ace->getId()] = true;
            }
        }

        for ($i = 0, $c = count($old); $i < $c; $i++) {
            $ace = $old[$i];

            if (!isset($currentIds[$ace->getId()])) {
                $this->connection->executeQuery($this->getDeleteAccessControlEntrySql($ace->getId()));
                unset($this->loadedAces[$ace->getId()]);
            }
        }
    }

    /**
     * Persists the changes which were made to ACEs to the database.
     *
     * @param \SplObjectStorage $aces
     */
    private function updateAces(\SplObjectStorage $aces)
    {
        foreach ($aces as $ace) {
            $this->updateAce($aces, $ace);
        }
    }

    private function updateAce(\SplObjectStorage $aces, $ace)
    {
        $propertyChanges = $aces->offsetGet($ace);
        $sets = array();

        if (isset($propertyChanges['aceOrder'])
            && $propertyChanges['aceOrder'][1] > $propertyChanges['aceOrder'][0]
            && $propertyChanges == $aces->offsetGet($ace)) {
                $aces->next();
                if ($aces->valid()) {
                    $this->updateAce($aces, $aces->current());
                }
            }

        if (isset($propertyChanges['mask'])) {
            $sets[] = sprintf('mask = %d', $propertyChanges['mask'][1]);
        }
        if (isset($propertyChanges['strategy'])) {
            $sets[] = sprintf('granting_strategy = %s', $this->connection->quote($propertyChanges['strategy']));
        }
        if (isset($propertyChanges['aceOrder'])) {
            $sets[] = sprintf('ace_order = %d', $propertyChanges['aceOrder'][1]);
        }
        if (isset($propertyChanges['auditSuccess'])) {
            $sets[] = sprintf('audit_success = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditSuccess'][1]));
        }
        if (isset($propertyChanges['auditFailure'])) {
            $sets[] = sprintf('audit_failure = %s', $this->connection->getDatabasePlatform()->convertBooleans($propertyChanges['auditFailure'][1]));
        }

        $this->connection->executeQuery($this->getUpdateAccessControlEntrySql($ace->getId(), $sets));
    }

}
PK�`�\�^�+f+f8pear/Symfony/Component/Security/Acl/Dbal/AclProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Dbal;

use Doctrine\DBAL\Driver\Connection;
use Doctrine\DBAL\Driver\Statement;
use Symfony\Component\Security\Acl\Model\AclInterface;
use Symfony\Component\Security\Acl\Domain\Acl;
use Symfony\Component\Security\Acl\Domain\Entry;
use Symfony\Component\Security\Acl\Domain\FieldEntry;
use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
use Symfony\Component\Security\Acl\Exception\AclNotFoundException;
use Symfony\Component\Security\Acl\Exception\NotAllAclsFoundException;
use Symfony\Component\Security\Acl\Model\AclCacheInterface;
use Symfony\Component\Security\Acl\Model\AclProviderInterface;
use Symfony\Component\Security\Acl\Model\ObjectIdentityInterface;
use Symfony\Component\Security\Acl\Model\PermissionGrantingStrategyInterface;

/**
 * An ACL provider implementation.
 *
 * This provider assumes that all ACLs share the same PermissionGrantingStrategy.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AclProvider implements AclProviderInterface
{
    const MAX_BATCH_SIZE = 30;

    protected $cache;
    protected $connection;
    protected $loadedAces = array();
    protected $loadedAcls = array();
    protected $options;
    private $permissionGrantingStrategy;

    /**
     * Constructor.
     *
     * @param Connection                          $connection
     * @param PermissionGrantingStrategyInterface $permissionGrantingStrategy
     * @param array                               $options
     * @param AclCacheInterface                   $cache
     */
    public function __construct(Connection $connection, PermissionGrantingStrategyInterface $permissionGrantingStrategy, array $options, AclCacheInterface $cache = null)
    {
        $this->cache = $cache;
        $this->connection = $connection;
        $this->options = $options;
        $this->permissionGrantingStrategy = $permissionGrantingStrategy;
    }

    /**
     * {@inheritDoc}
     */
    public function findChildren(ObjectIdentityInterface $parentOid, $directChildrenOnly = false)
    {
        $sql = $this->getFindChildrenSql($parentOid, $directChildrenOnly);

        $children = array();
        foreach ($this->connection->executeQuery($sql)->fetchAll() as $data) {
            $children[] = new ObjectIdentity($data['object_identifier'], $data['class_type']);
        }

        return $children;
    }

    /**
     * {@inheritDoc}
     */
    public function findAcl(ObjectIdentityInterface $oid, array $sids = array())
    {
        return $this->findAcls(array($oid), $sids)->offsetGet($oid);
    }

    /**
     * {@inheritDoc}
     */
    public function findAcls(array $oids, array $sids = array())
    {
        $result = new \SplObjectStorage();
        $currentBatch = array();
        $oidLookup = array();

        for ($i=0,$c=count($oids); $i<$c; $i++) {
            $oid = $oids[$i];
            $oidLookupKey = $oid->getIdentifier().$oid->getType();
            $oidLookup[$oidLookupKey] = $oid;
            $aclFound = false;

            // check if result already contains an ACL
            if ($result->contains($oid)) {
                $aclFound = true;
            }

            // check if this ACL has already been hydrated
            if (!$aclFound && isset($this->loadedAcls[$oid->getType()][$oid->getIdentifier()])) {
                $acl = $this->loadedAcls[$oid->getType()][$oid->getIdentifier()];

                if (!$acl->isSidLoaded($sids)) {
                    // FIXME: we need to load ACEs for the missing SIDs. This is never
                    //        reached by the default implementation, since we do not
                    //        filter by SID
                    throw new \RuntimeException('This is not supported by the default implementation.');
                } else {
                    $result->attach($oid, $acl);
                    $aclFound = true;
                }
            }

            // check if we can locate the ACL in the cache
            if (!$aclFound && null !== $this->cache) {
                $acl = $this->cache->getFromCacheByIdentity($oid);

                if (null !== $acl) {
                    if ($acl->isSidLoaded($sids)) {
                        // check if any of the parents has been loaded since we need to
                        // ensure that there is only ever one ACL per object identity
                        $parentAcl = $acl->getParentAcl();
                        while (null !== $parentAcl) {
                            $parentOid = $parentAcl->getObjectIdentity();

                            if (isset($this->loadedAcls[$parentOid->getType()][$parentOid->getIdentifier()])) {
                                $acl->setParentAcl($this->loadedAcls[$parentOid->getType()][$parentOid->getIdentifier()]);
                                break;
                            } else {
                                $this->loadedAcls[$parentOid->getType()][$parentOid->getIdentifier()] = $parentAcl;
                                $this->updateAceIdentityMap($parentAcl);
                            }

                            $parentAcl = $parentAcl->getParentAcl();
                        }

                        $this->loadedAcls[$oid->getType()][$oid->getIdentifier()] = $acl;
                        $this->updateAceIdentityMap($acl);
                        $result->attach($oid, $acl);
                        $aclFound = true;
                    } else {
                        $this->cache->evictFromCacheByIdentity($oid);

                        foreach ($this->findChildren($oid) as $childOid) {
                            $this->cache->evictFromCacheByIdentity($childOid);
                        }
                    }
                }
            }

            // looks like we have to load the ACL from the database
            if (!$aclFound) {
                $currentBatch[] = $oid;
            }

            // Is it time to load the current batch?
            if ((self::MAX_BATCH_SIZE === count($currentBatch) || ($i + 1) === $c) && count($currentBatch) > 0) {
                try {
                    $loadedBatch = $this->lookupObjectIdentities($currentBatch, $sids, $oidLookup);
                } catch (AclNotFoundException $aclNotFoundexception) {
                    if ($result->count()) {
                        $partialResultException = new NotAllAclsFoundException('The provider could not find ACLs for all object identities.');
                        $partialResultException->setPartialResult($result);
                        throw $partialResultException;
                    } else {
                        throw $aclNotFoundexception;
                    }
                }
                foreach ($loadedBatch as $loadedOid) {
                    $loadedAcl = $loadedBatch->offsetGet($loadedOid);

                    if (null !== $this->cache) {
                        $this->cache->putInCache($loadedAcl);
                    }

                    if (isset($oidLookup[$loadedOid->getIdentifier().$loadedOid->getType()])) {
                        $result->attach($loadedOid, $loadedAcl);
                    }
                }

                $currentBatch = array();
            }
        }

        // check that we got ACLs for all the identities
        foreach ($oids as $oid) {
            if (!$result->contains($oid)) {
                if (1 === count($oids)) {
                    throw new AclNotFoundException(sprintf('No ACL found for %s.', $oid));
                }

                $partialResultException = new NotAllAclsFoundException('The provider could not find ACLs for all object identities.');
                $partialResultException->setPartialResult($result);

                throw $partialResultException;
            }
        }

        return $result;
    }

    /**
     * Constructs the query used for looking up object identities and associated
     * ACEs, and security identities.
     *
     * @param array $ancestorIds
     * @return string
     */
    protected function getLookupSql(array $ancestorIds)
    {
        // FIXME: add support for filtering by sids (right now we select all sids)

        $sql = <<<SELECTCLAUSE
            SELECT
                o.id as acl_id,
                o.object_identifier,
                o.parent_object_identity_id,
                o.entries_inheriting,
                c.class_type,
                e.id as ace_id,
                e.object_identity_id,
                e.field_name,
                e.ace_order,
                e.mask,
                e.granting,
                e.granting_strategy,
                e.audit_success,
                e.audit_failure,
                s.username,
                s.identifier as security_identifier
            FROM
                {$this->options['oid_table_name']} o
            INNER JOIN {$this->options['class_table_name']} c ON c.id = o.class_id
            LEFT JOIN {$this->options['entry_table_name']} e ON (
                e.class_id = o.class_id AND (e.object_identity_id = o.id OR {$this->connection->getDatabasePlatform()->getIsNullExpression('e.object_identity_id')})
            )
            LEFT JOIN {$this->options['sid_table_name']} s ON (
                s.id = e.security_identity_id
            )

            WHERE (o.id =
SELECTCLAUSE;

        $sql .= implode(' OR o.id = ', $ancestorIds).')';

        return $sql;
    }

    protected function getAncestorLookupSql(array $batch)
    {
        $sql = <<<SELECTCLAUSE
            SELECT a.ancestor_id
            FROM
                {$this->options['oid_table_name']} o
            INNER JOIN {$this->options['class_table_name']} c ON c.id = o.class_id
            INNER JOIN {$this->options['oid_ancestors_table_name']} a ON a.object_identity_id = o.id
               WHERE (
SELECTCLAUSE;

        $types = array();
        $count = count($batch);
        for ($i = 0; $i < $count; $i++) {
            if (!isset($types[$batch[$i]->getType()])) {
                $types[$batch[$i]->getType()] = true;

                // if there is more than one type we can safely break out of the
                // loop, because it is the differentiator factor on whether to
                // query for only one or more class types
                if (count($types) > 1) {
                    break;
                }
            }
        }

        if (1 === count($types)) {
            $ids = array();
            for ($i = 0; $i < $count; $i++) {
                $ids[] = $this->connection->quote($batch[$i]->getIdentifier());
            }

            $sql .= sprintf(
                '(o.object_identifier IN (%s) AND c.class_type = %s)',
                implode(',', $ids),
                $this->connection->quote($batch[0]->getType())
            );
        } else {
            $where = '(o.object_identifier = %s AND c.class_type = %s)';
            for ($i = 0; $i < $count; $i++) {
                $sql .= sprintf(
                    $where,
                    $this->connection->quote($batch[$i]->getIdentifier()),
                    $this->connection->quote($batch[$i]->getType())
                );

                if ($i+1 < $count) {
                    $sql .= ' OR ';
                }
            }
        }

        $sql .= ')';

        return $sql;
    }

    /**
     * Constructs the SQL for retrieving child object identities for the given
     * object identities.
     *
     * @param ObjectIdentityInterface $oid
     * @param Boolean                 $directChildrenOnly
     * @return string
     */
    protected function getFindChildrenSql(ObjectIdentityInterface $oid, $directChildrenOnly)
    {
        if (false === $directChildrenOnly) {
            $query = <<<FINDCHILDREN
                SELECT o.object_identifier, c.class_type
                FROM
                    {$this->options['oid_table_name']} as o
                INNER JOIN {$this->options['class_table_name']} as c ON c.id = o.class_id
                INNER JOIN {$this->options['oid_ancestors_table_name']} as a ON a.object_identity_id = o.id
                WHERE
                    a.ancestor_id = %d AND a.object_identity_id != a.ancestor_id
FINDCHILDREN;
        } else {
            $query = <<<FINDCHILDREN
                SELECT o.object_identifier, c.class_type
                FROM {$this->options['oid_table_name']} as o
                INNER JOIN {$this->options['class_table_name']} as c ON c.id = o.class_id
                WHERE o.parent_object_identity_id = %d
FINDCHILDREN;
        }

        return sprintf($query, $this->retrieveObjectIdentityPrimaryKey($oid));
    }

    /**
     * Constructs the SQL for retrieving the primary key of the given object
     * identity.
     *
     * @param ObjectIdentityInterface $oid
     * @return string
     */
    protected function getSelectObjectIdentityIdSql(ObjectIdentityInterface $oid)
    {
        $query = <<<QUERY
            SELECT o.id
            FROM %s o
            INNER JOIN %s c ON c.id = o.class_id
            WHERE o.object_identifier = %s AND c.class_type = %s
QUERY;

        return sprintf(
            $query,
            $this->options['oid_table_name'],
            $this->options['class_table_name'],
            $this->connection->quote($oid->getIdentifier()),
            $this->connection->quote($oid->getType())
        );
    }

    /**
     * Returns the primary key of the passed object identity.
     *
     * @param ObjectIdentityInterface $oid
     * @return integer
     */
    final protected function retrieveObjectIdentityPrimaryKey(ObjectIdentityInterface $oid)
    {
        return $this->connection->executeQuery($this->getSelectObjectIdentityIdSql($oid))->fetchColumn();
    }

    /**
     * This method is called when an ACL instance is retrieved from the cache.
     *
     * @param AclInterface $acl
     */
    private function updateAceIdentityMap(AclInterface $acl)
    {
        foreach (array('classAces', 'classFieldAces', 'objectAces', 'objectFieldAces') as $property) {
            $reflection = new \ReflectionProperty($acl, $property);
            $reflection->setAccessible(true);
            $value = $reflection->getValue($acl);

            if ('classAces' === $property || 'objectAces' === $property) {
                $this->doUpdateAceIdentityMap($value);
            } else {
                foreach ($value as $field => $aces) {
                    $this->doUpdateAceIdentityMap($value[$field]);
                }
            }

            $reflection->setValue($acl, $value);
            $reflection->setAccessible(false);
        }
    }

    /**
     * Retrieves all the ids which need to be queried from the database
     * including the ids of parent ACLs.
     *
     * @param array $batch
     *
     * @return array
     */
    private function getAncestorIds(array $batch)
    {
        $sql = $this->getAncestorLookupSql($batch);

        $ancestorIds = array();
        foreach ($this->connection->executeQuery($sql)->fetchAll() as $data) {
            // FIXME: skip ancestors which are cached

            $ancestorIds[] = $data['ancestor_id'];
        }

        return $ancestorIds;
    }

    /**
     * Does either overwrite the passed ACE, or saves it in the global identity
     * map to ensure every ACE only gets instantiated once.
     *
     * @param array &$aces
     */
    private function doUpdateAceIdentityMap(array &$aces)
    {
        foreach ($aces as $index => $ace) {
            if (isset($this->loadedAces[$ace->getId()])) {
                $aces[$index] = $this->loadedAces[$ace->getId()];
            } else {
                $this->loadedAces[$ace->getId()] = $ace;
            }
        }
    }

    /**
     * This method is called for object identities which could not be retrieved
     * from the cache, and for which thus a database query is required.
     *
     * @param array $batch
     * @param array $sids
     * @param array $oidLookup
     *
     * @return \SplObjectStorage mapping object identities to ACL instances
     *
     * @throws AclNotFoundException
     */
    private function lookupObjectIdentities(array $batch, array $sids, array $oidLookup)
    {
        $ancestorIds = $this->getAncestorIds($batch);
        if (!$ancestorIds) {
            throw new AclNotFoundException('There is no ACL for the given object identity.');
        }

        $sql = $this->getLookupSql($ancestorIds);
        $stmt = $this->connection->executeQuery($sql);

        return $this->hydrateObjectIdentities($stmt, $oidLookup, $sids);
    }

    /**
     * This method is called to hydrate ACLs and ACEs.
     *
     * This method was designed for performance; thus, a lot of code has been
     * inlined at the cost of readability, and maintainability.
     *
     * Keep in mind that changes to this method might severely reduce the
     * performance of the entire ACL system.
     *
     * @param Statement $stmt
     * @param array     $oidLookup
     * @param array     $sids
     * @throws \RuntimeException
     * @return \SplObjectStorage
     */
    private function hydrateObjectIdentities(Statement $stmt, array $oidLookup, array $sids)
    {
        $parentIdToFill = new \SplObjectStorage();
        $acls = $aces = $emptyArray = array();
        $oidCache = $oidLookup;
        $result = new \SplObjectStorage();
        $loadedAces =& $this->loadedAces;
        $loadedAcls =& $this->loadedAcls;
        $permissionGrantingStrategy = $this->permissionGrantingStrategy;

        // we need these to set protected properties on hydrated objects
        $aclReflection = new \ReflectionClass('Symfony\Component\Security\Acl\Domain\Acl');
        $aclClassAcesProperty = $aclReflection->getProperty('classAces');
        $aclClassAcesProperty->setAccessible(true);
        $aclClassFieldAcesProperty = $aclReflection->getProperty('classFieldAces');
        $aclClassFieldAcesProperty->setAccessible(true);
        $aclObjectAcesProperty = $aclReflection->getProperty('objectAces');
        $aclObjectAcesProperty->setAccessible(true);
        $aclObjectFieldAcesProperty = $aclReflection->getProperty('objectFieldAces');
        $aclObjectFieldAcesProperty->setAccessible(true);
        $aclParentAclProperty = $aclReflection->getProperty('parentAcl');
        $aclParentAclProperty->setAccessible(true);

        // fetchAll() consumes more memory than consecutive calls to fetch(),
        // but it is faster
        foreach ($stmt->fetchAll(\PDO::FETCH_NUM) as $data) {
            list($aclId,
                 $objectIdentifier,
                 $parentObjectIdentityId,
                 $entriesInheriting,
                 $classType,
                 $aceId,
                 $objectIdentityId,
                 $fieldName,
                 $aceOrder,
                 $mask,
                 $granting,
                 $grantingStrategy,
                 $auditSuccess,
                 $auditFailure,
                 $username,
                 $securityIdentifier) = $data;

            // has the ACL been hydrated during this hydration cycle?
            if (isset($acls[$aclId])) {
                $acl = $acls[$aclId];
            // has the ACL been hydrated during any previous cycle, or was possibly loaded
            // from cache?
            } elseif (isset($loadedAcls[$classType][$objectIdentifier])) {
                $acl = $loadedAcls[$classType][$objectIdentifier];

                // keep reference in local array (saves us some hash calculations)
                $acls[$aclId] = $acl;

                // attach ACL to the result set; even though we do not enforce that every
                // object identity has only one instance, we must make sure to maintain
                // referential equality with the oids passed to findAcls()
                if (!isset($oidCache[$objectIdentifier.$classType])) {
                    $oidCache[$objectIdentifier.$classType] = $acl->getObjectIdentity();
                }
                $result->attach($oidCache[$objectIdentifier.$classType], $acl);
            // so, this hasn't been hydrated yet
            } else {
                // create object identity if we haven't done so yet
                $oidLookupKey = $objectIdentifier.$classType;
                if (!isset($oidCache[$oidLookupKey])) {
                    $oidCache[$oidLookupKey] = new ObjectIdentity($objectIdentifier, $classType);
                }

                $acl = new Acl((integer) $aclId, $oidCache[$oidLookupKey], $permissionGrantingStrategy, $emptyArray, !!$entriesInheriting);

                // keep a local, and global reference to this ACL
                $loadedAcls[$classType][$objectIdentifier] = $acl;
                $acls[$aclId] = $acl;

                // try to fill in parent ACL, or defer until all ACLs have been hydrated
                if (null !== $parentObjectIdentityId) {
                    if (isset($acls[$parentObjectIdentityId])) {
                        $aclParentAclProperty->setValue($acl, $acls[$parentObjectIdentityId]);
                    } else {
                        $parentIdToFill->attach($acl, $parentObjectIdentityId);
                    }
                }

                $result->attach($oidCache[$oidLookupKey], $acl);
            }

            // check if this row contains an ACE record
            if (null !== $aceId) {
                // have we already hydrated ACEs for this ACL?
                if (!isset($aces[$aclId])) {
                    $aces[$aclId] = array($emptyArray, $emptyArray, $emptyArray, $emptyArray);
                }

                // has this ACE already been hydrated during a previous cycle, or
                // possible been loaded from cache?
                // It is important to only ever have one ACE instance per actual row since
                // some ACEs are shared between ACL instances
                if (!isset($loadedAces[$aceId])) {
                    if (!isset($sids[$key = ($username?'1':'0').$securityIdentifier])) {
                        if ($username) {
                            $sids[$key] = new UserSecurityIdentity(
                                substr($securityIdentifier, 1 + $pos = strpos($securityIdentifier, '-')),
                                substr($securityIdentifier, 0, $pos)
                            );
                        } else {
                            $sids[$key] = new RoleSecurityIdentity($securityIdentifier);
                        }
                    }

                    if (null === $fieldName) {
                        $loadedAces[$aceId] = new Entry((integer) $aceId, $acl, $sids[$key], $grantingStrategy, (integer) $mask, !!$granting, !!$auditFailure, !!$auditSuccess);
                    } else {
                        $loadedAces[$aceId] = new FieldEntry((integer) $aceId, $acl, $fieldName, $sids[$key], $grantingStrategy, (integer) $mask, !!$granting, !!$auditFailure, !!$auditSuccess);
                    }
                }
                $ace = $loadedAces[$aceId];

                // assign ACE to the correct property
                if (null === $objectIdentityId) {
                    if (null === $fieldName) {
                        $aces[$aclId][0][$aceOrder] = $ace;
                    } else {
                        $aces[$aclId][1][$fieldName][$aceOrder] = $ace;
                    }
                } else {
                    if (null === $fieldName) {
                        $aces[$aclId][2][$aceOrder] = $ace;
                    } else {
                        $aces[$aclId][3][$fieldName][$aceOrder] = $ace;
                    }
                }
            }
        }

        // We do not sort on database level since we only want certain subsets to be sorted,
        // and we are going to read the entire result set anyway.
        // Sorting on DB level increases query time by an order of magnitude while it is
        // almost negligible when we use PHPs array sort functions.
        foreach ($aces as $aclId => $aceData) {
            $acl = $acls[$aclId];

            ksort($aceData[0]);
            $aclClassAcesProperty->setValue($acl, $aceData[0]);

            foreach (array_keys($aceData[1]) as $fieldName) {
                ksort($aceData[1][$fieldName]);
            }
            $aclClassFieldAcesProperty->setValue($acl, $aceData[1]);

            ksort($aceData[2]);
            $aclObjectAcesProperty->setValue($acl, $aceData[2]);

            foreach (array_keys($aceData[3]) as $fieldName) {
                ksort($aceData[3][$fieldName]);
            }
            $aclObjectFieldAcesProperty->setValue($acl, $aceData[3]);
        }

        // fill-in parent ACLs where this hasn't been done yet cause the parent ACL was not
        // yet available
        $processed = 0;
        foreach ($parentIdToFill as $acl) {
            $parentId = $parentIdToFill->offsetGet($acl);

            // let's see if we have already hydrated this
            if (isset($acls[$parentId])) {
                $aclParentAclProperty->setValue($acl, $acls[$parentId]);
                $processed += 1;

                continue;
            }
        }

        // reset reflection changes
        $aclClassAcesProperty->setAccessible(false);
        $aclClassFieldAcesProperty->setAccessible(false);
        $aclObjectAcesProperty->setAccessible(false);
        $aclObjectFieldAcesProperty->setAccessible(false);
        $aclParentAclProperty->setAccessible(false);

        // this should never be true if the database integrity hasn't been compromised
        if ($processed < count($parentIdToFill)) {
            throw new \RuntimeException('Not all parent ids were populated. This implies an integrity problem.');
        }

        return $result;
    }
}
PK�`�\K� V��3pear/Symfony/Component/Security/Acl/Dbal/Schema.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Dbal;

use Doctrine\DBAL\Schema\Schema as BaseSchema;
use Doctrine\DBAL\Connection;

/**
 * The schema used for the ACL system.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
final class Schema extends BaseSchema
{
    protected $options;

    /**
     * Constructor
     *
     * @param array      $options    the names for tables
     * @param Connection $connection
     */
    public function __construct(array $options, Connection $connection = null)
    {
        $schemaConfig = null === $connection ? null : $connection->getSchemaManager()->createSchemaConfig();

        parent::__construct(array(), array(), $schemaConfig);

        $this->options = $options;

        $this->addClassTable();
        $this->addSecurityIdentitiesTable();
        $this->addObjectIdentitiesTable();
        $this->addObjectIdentityAncestorsTable();
        $this->addEntryTable();
    }

    /**
     * Merges ACL schema with the given schema.
     *
     * @param BaseSchema $schema
     */
    public function addToSchema(BaseSchema $schema)
    {
        foreach ($this->getTables() as $table) {
            $schema->_addTable($table);
        }

        foreach ($this->getSequences() as $sequence) {
            $schema->_addSequence($sequence);
        }
    }

    /**
     * Adds the class table to the schema
     */
    protected function addClassTable()
    {
        $table = $this->createTable($this->options['class_table_name']);
        $table->addColumn('id', 'integer', array('unsigned' => true, 'autoincrement' => 'auto'));
        $table->addColumn('class_type', 'string', array('length' => 200));
        $table->setPrimaryKey(array('id'));
        $table->addUniqueIndex(array('class_type'));
    }

    /**
     * Adds the entry table to the schema
     */
    protected function addEntryTable()
    {
        $table = $this->createTable($this->options['entry_table_name']);

        $table->addColumn('id', 'integer', array('unsigned' => true, 'autoincrement' => 'auto'));
        $table->addColumn('class_id', 'integer', array('unsigned' => true));
        $table->addColumn('object_identity_id', 'integer', array('unsigned' => true, 'notnull' => false));
        $table->addColumn('field_name', 'string', array('length' => 50, 'notnull' => false));
        $table->addColumn('ace_order', 'smallint', array('unsigned' => true));
        $table->addColumn('security_identity_id', 'integer', array('unsigned' => true));
        $table->addColumn('mask', 'integer');
        $table->addColumn('granting', 'boolean');
        $table->addColumn('granting_strategy', 'string', array('length' => 30));
        $table->addColumn('audit_success', 'boolean');
        $table->addColumn('audit_failure', 'boolean');

        $table->setPrimaryKey(array('id'));
        $table->addUniqueIndex(array('class_id', 'object_identity_id', 'field_name', 'ace_order'));
        $table->addIndex(array('class_id', 'object_identity_id', 'security_identity_id'));

        $table->addForeignKeyConstraint($this->getTable($this->options['class_table_name']), array('class_id'), array('id'), array('onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE'));
        $table->addForeignKeyConstraint($this->getTable($this->options['oid_table_name']), array('object_identity_id'), array('id'), array('onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE'));
        $table->addForeignKeyConstraint($this->getTable($this->options['sid_table_name']), array('security_identity_id'), array('id'), array('onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE'));
    }

    /**
     * Adds the object identity table to the schema
     */
    protected function addObjectIdentitiesTable()
    {
        $table = $this->createTable($this->options['oid_table_name']);

        $table->addColumn('id', 'integer', array('unsigned' => true, 'autoincrement' => 'auto'));
        $table->addColumn('class_id', 'integer', array('unsigned' => true));
        $table->addColumn('object_identifier', 'string', array('length' => 100));
        $table->addColumn('parent_object_identity_id', 'integer', array('unsigned' => true, 'notnull' => false));
        $table->addColumn('entries_inheriting', 'boolean');

        $table->setPrimaryKey(array('id'));
        $table->addUniqueIndex(array('object_identifier', 'class_id'));
        $table->addIndex(array('parent_object_identity_id'));

        $table->addForeignKeyConstraint($table, array('parent_object_identity_id'), array('id'));
    }

    /**
     * Adds the object identity relation table to the schema
     */
    protected function addObjectIdentityAncestorsTable()
    {
        $table = $this->createTable($this->options['oid_ancestors_table_name']);

        $table->addColumn('object_identity_id', 'integer', array('unsigned' => true));
        $table->addColumn('ancestor_id', 'integer', array('unsigned' => true));

        $table->setPrimaryKey(array('object_identity_id', 'ancestor_id'));

        $oidTable = $this->getTable($this->options['oid_table_name']);
        $table->addForeignKeyConstraint($oidTable, array('object_identity_id'), array('id'), array('onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE'));
        $table->addForeignKeyConstraint($oidTable, array('ancestor_id'), array('id'), array('onDelete' => 'CASCADE', 'onUpdate' => 'CASCADE'));
    }

    /**
     * Adds the security identity table to the schema
     */
    protected function addSecurityIdentitiesTable()
    {
        $table = $this->createTable($this->options['sid_table_name']);

        $table->addColumn('id', 'integer', array('unsigned' => true, 'autoincrement' => 'auto'));
        $table->addColumn('identifier', 'string', array('length' => 200));
        $table->addColumn('username', 'boolean');

        $table->setPrimaryKey(array('id'));
        $table->addUniqueIndex(array('identifier', 'username'));
    }
}
PK�`�\�𕛼�:pear/Symfony/Component/Security/Acl/Model/AclInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

use Symfony\Component\Security\Acl\Exception\NoAceFoundException;

/**
 * This interface represents an access control list (ACL) for a domain object.
 * Each domain object can have exactly one associated ACL.
 *
 * An ACL contains all access control entries (ACE) for a given domain object.
 * In order to avoid needing references to the domain object itself, implementations
 * use ObjectIdentity implementations as an additional level of indirection.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface AclInterface extends \Serializable
{
    /**
     * Returns all class-based ACEs associated with this ACL
     *
     * @return array
     */
    public function getClassAces();

    /**
     * Returns all class-field-based ACEs associated with this ACL
     *
     * @param string $field
     * @return array
     */
    public function getClassFieldAces($field);

    /**
     * Returns all object-based ACEs associated with this ACL
     *
     * @return array
     */
    public function getObjectAces();

    /**
     * Returns all object-field-based ACEs associated with this ACL
     *
     * @param string $field
     * @return array
     */
    public function getObjectFieldAces($field);

    /**
     * Returns the object identity associated with this ACL
     *
     * @return ObjectIdentityInterface
     */
    public function getObjectIdentity();

    /**
     * Returns the parent ACL, or null if there is none.
     *
     * @return AclInterface|null
     */
    public function getParentAcl();

    /**
     * Whether this ACL is inheriting ACEs from a parent ACL.
     *
     * @return Boolean
     */
    public function isEntriesInheriting();

    /**
     * Determines whether field access is granted
     *
     * @param string  $field
     * @param array   $masks
     * @param array   $securityIdentities
     * @param Boolean $administrativeMode
     * @return Boolean
     */
    public function isFieldGranted($field, array $masks, array $securityIdentities, $administrativeMode = false);

    /**
     * Determines whether access is granted
     *
     * @throws NoAceFoundException when no ACE was applicable for this request
     * @param array   $masks
     * @param array   $securityIdentities
     * @param Boolean $administrativeMode
     * @return Boolean
     */
    public function isGranted(array $masks, array $securityIdentities, $administrativeMode = false);

    /**
     * Whether the ACL has loaded ACEs for all of the passed security identities
     *
     * @param mixed $securityIdentities an implementation of SecurityIdentityInterface, or an array thereof
     * @return Boolean
     */
    public function isSidLoaded($securityIdentities);
}
PK�`�\���77Gpear/Symfony/Component/Security/Acl/Model/SecurityIdentityInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * This interface provides an additional level of indirection, so that
 * we can work with abstracted versions of security objects and do
 * not have to save the entire objects.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface SecurityIdentityInterface
{
    /**
     * This method is used to compare two security identities in order to
     * not rely on referential equality.
     *
     * @param SecurityIdentityInterface $identity
     */
    public function equals(SecurityIdentityInterface $identity);
}
PK�`�\-癥��Qpear/Symfony/Component/Security/Acl/Model/PermissionGrantingStrategyInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * Interface used by permission granting implementations.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface PermissionGrantingStrategyInterface
{
    /**
     * Determines whether access to a domain object is to be granted
     *
     * @param AclInterface $acl
     * @param array        $masks
     * @param array        $sids
     * @param Boolean      $administrativeMode
     * @return Boolean
     */
    public function isGranted(AclInterface $acl, array $masks, array $sids, $administrativeMode = false);

    /**
     * Determines whether access to a domain object's field is to be granted
     *
     * @param AclInterface $acl
     * @param string       $field
     * @param array        $masks
     * @param array        $sids
     * @param Boolean      $administrativeMode
     *
     * @return Boolean
     */
    public function isFieldGranted(AclInterface $acl, $field, array $masks, array $sids, $administrativeMode = false);
}
PK�`�\X	��Cpear/Symfony/Component/Security/Acl/Model/DomainObjectInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * This method can be implemented by domain objects which you want to store
 * ACLs for if they do not have a getId() method, or getId() does not return
 * a unique identifier.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface DomainObjectInterface
{
    /**
     * Returns a unique identifier for this domain object.
     *
     * @return string
     */
    public function getObjectIdentifier();
}
PK�`�\[Ob3Xpear/Symfony/Component/Security/Acl/Model/SecurityIdentityRetrievalStrategyInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * Interface for retrieving security identities from tokens
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface SecurityIdentityRetrievalStrategyInterface
{
    /**
     * Retrieves the available security identities for the given token
     *
     * The order in which the security identities are returned is significant.
     * Typically, security identities should be ordered from most specific to
     * least specific.
     *
     * @param TokenInterface $token
     *
     * @return SecurityIdentityInterface[] An array of SecurityIdentityInterface implementations
     */
    public function getSecurityIdentities(TokenInterface $token);
}
PK�`�\t��Epear/Symfony/Component/Security/Acl/Model/AuditableEntryInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * ACEs can implement this interface if they support auditing capabilities.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface AuditableEntryInterface extends EntryInterface
{
    /**
     * Whether auditing for successful grants is turned on
     *
     * @return Boolean
     */
    public function isAuditFailure();

    /**
     * Whether auditing for successful denies is turned on
     *
     * @return Boolean
     */
    public function isAuditSuccess();
}
PK�`�\6����Apear/Symfony/Component/Security/Acl/Model/MutableAclInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * This interface adds mutators for the AclInterface.
 *
 * All changes to Access Control Entries must go through this interface. Access
 * Control Entries must never be modified directly.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface MutableAclInterface extends AclInterface
{
    /**
     * Deletes a class-based ACE
     *
     * @param integer $index
     */
    public function deleteClassAce($index);

    /**
     * Deletes a class-field-based ACE
     *
     * @param integer $index
     * @param string  $field
     */
    public function deleteClassFieldAce($index, $field);

    /**
     * Deletes an object-based ACE
     *
     * @param integer $index
     */
    public function deleteObjectAce($index);

    /**
     * Deletes an object-field-based ACE
     *
     * @param integer $index
     * @param string  $field
     */
    public function deleteObjectFieldAce($index, $field);

    /**
     * Returns the primary key of this ACL
     *
     * @return integer
     */
    public function getId();

    /**
     * Inserts a class-based ACE
     *
     * @param SecurityIdentityInterface $sid
     * @param integer                   $mask
     * @param integer                   $index
     * @param Boolean                   $granting
     * @param string                    $strategy
     */
    public function insertClassAce(SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null);

    /**
     * Inserts a class-field-based ACE
     *
     * @param string                    $field
     * @param SecurityIdentityInterface $sid
     * @param integer                   $mask
     * @param integer                   $index
     * @param Boolean                   $granting
     * @param string                    $strategy
     */
    public function insertClassFieldAce($field, SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null);

    /**
     * Inserts an object-based ACE
     *
     * @param SecurityIdentityInterface $sid
     * @param integer                   $mask
     * @param integer                   $index
     * @param Boolean                   $granting
     * @param string                    $strategy
     */
    public function insertObjectAce(SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null);

    /**
     * Inserts an object-field-based ACE
     *
     * @param string                    $field
     * @param SecurityIdentityInterface $sid
     * @param integer                   $mask
     * @param integer                   $index
     * @param Boolean                   $granting
     * @param string                    $strategy
     */
    public function insertObjectFieldAce($field, SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null);

    /**
     * Sets whether entries are inherited
     *
     * @param Boolean $boolean
     */
    public function setEntriesInheriting($boolean);

    /**
     * Sets the parent ACL
     *
     * @param AclInterface|null $acl
     */
    public function setParentAcl(AclInterface $acl = null);

    /**
     * Updates a class-based ACE
     *
     * @param integer $index
     * @param integer $mask
     * @param string  $strategy if null the strategy should not be changed
     */
    public function updateClassAce($index, $mask, $strategy = null);

    /**
     * Updates a class-field-based ACE
     *
     * @param integer $index
     * @param string  $field
     * @param integer $mask
     * @param string  $strategy if null the strategy should not be changed
     */
    public function updateClassFieldAce($index, $field, $mask, $strategy = null);

    /**
     * Updates an object-based ACE
     *
     * @param integer $index
     * @param integer $mask
     * @param string  $strategy if null the strategy should not be changed
     */
    public function updateObjectAce($index, $mask, $strategy = null);

    /**
     * Updates an object-field-based ACE
     *
     * @param integer $index
     * @param string  $field
     * @param integer $mask
     * @param string  $strategy if null the strategy should not be changed
     */
    public function updateObjectFieldAce($index, $field, $mask, $strategy = null);
}
PK�`�\�
�8FF<pear/Symfony/Component/Security/Acl/Model/EntryInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * This class represents an individual entry in the ACL list.
 *
 * Instances MUST be immutable, as they are returned by the ACL and should not
 * allow client modification.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface EntryInterface extends \Serializable
{
    /**
     * The ACL this ACE is associated with.
     *
     * @return AclInterface
     */
    public function getAcl();

    /**
     * The primary key of this ACE
     *
     * @return integer
     */
    public function getId();

    /**
     * The permission mask of this ACE
     *
     * @return integer
     */
    public function getMask();

    /**
     * The security identity associated with this ACE
     *
     * @return SecurityIdentityInterface
     */
    public function getSecurityIdentity();

    /**
     * The strategy for comparing masks
     *
     * @return string
     */
    public function getStrategy();

    /**
     * Returns whether this ACE is granting, or denying
     *
     * @return Boolean
     */
    public function isGranting();
}
PK�`�\ӗ&1Cpear/Symfony/Component/Security/Acl/Model/AuditableAclInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * This interface adds auditing capabilities to the ACL.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface AuditableAclInterface extends MutableAclInterface
{
    /**
     * Updates auditing for class-based ACE
     *
     * @param integer $index
     * @param Boolean $auditSuccess
     * @param Boolean $auditFailure
     */
    public function updateClassAuditing($index, $auditSuccess, $auditFailure);

    /**
     * Updates auditing for class-field-based ACE
     *
     * @param integer $index
     * @param string  $field
     * @param Boolean $auditSuccess
     * @param Boolean $auditFailure
     */
    public function updateClassFieldAuditing($index, $field, $auditSuccess, $auditFailure);

    /**
     * Updates auditing for object-based ACE
     *
     * @param integer $index
     * @param Boolean $auditSuccess
     * @param Boolean $auditFailure
     */
    public function updateObjectAuditing($index, $auditSuccess, $auditFailure);

    /**
     * Updates auditing for object-field-based ACE
     *
     * @param integer $index
     * @param string  $field
     * @param Boolean $auditSuccess
     * @param Boolean $auditFailure
     */
    public function updateObjectFieldAuditing($index, $field, $auditSuccess, $auditFailure);
}
PK�`�\�W}��Vpear/Symfony/Component/Security/Acl/Model/ObjectIdentityRetrievalStrategyInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * Retrieves the object identity for a given domain object
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface ObjectIdentityRetrievalStrategyInterface
{
    /**
     * Retrieves the object identity from a domain object
     *
     * @param object $domainObject
     * @return ObjectIdentityInterface
     */
    public function getObjectIdentity($domainObject);
}
PK�`�\�����Bpear/Symfony/Component/Security/Acl/Model/AclProviderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

use Symfony\Component\Security\Acl\Exception\AclNotFoundException;

/**
 * Provides a common interface for retrieving ACLs.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface AclProviderInterface
{
    /**
     * Retrieves all child object identities from the database
     *
     * @param ObjectIdentityInterface $parentOid
     * @param Boolean                 $directChildrenOnly
     *
     * @return array returns an array of child 'ObjectIdentity's
     */
    public function findChildren(ObjectIdentityInterface $parentOid, $directChildrenOnly = false);

    /**
     * Returns the ACL that belongs to the given object identity
     *
     * @param ObjectIdentityInterface     $oid
     * @param SecurityIdentityInterface[] $sids
     *
     * @return AclInterface
     *
     * @throws AclNotFoundException when there is no ACL
     */
    public function findAcl(ObjectIdentityInterface $oid, array $sids = array());

    /**
     * Returns the ACLs that belong to the given object identities
     *
     * @param ObjectIdentityInterface[]   $oids an array of ObjectIdentityInterface implementations
     * @param SecurityIdentityInterface[] $sids an array of SecurityIdentityInterface implementations
     *
     * @return \SplObjectStorage mapping the passed object identities to ACLs
     *
     * @throws AclNotFoundException when we cannot find an ACL for all identities
     */
    public function findAcls(array $oids, array $sids = array());
}
PK�`�\�#���?pear/Symfony/Component/Security/Acl/Model/AclCacheInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * AclCache Interface
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface AclCacheInterface
{
    /**
     * Removes an ACL from the cache
     *
     * @param string $primaryKey a serialized primary key
     */
    public function evictFromCacheById($primaryKey);

    /**
     * Removes an ACL from the cache
     *
     * The ACL which is returned, must reference the passed object identity.
     *
     * @param ObjectIdentityInterface $oid
     */
    public function evictFromCacheByIdentity(ObjectIdentityInterface $oid);

    /**
     * Retrieves an ACL for the given object identity primary key from the cache
     *
     * @param integer $primaryKey
     * @return AclInterface
     */
    public function getFromCacheById($primaryKey);

    /**
     * Retrieves an ACL for the given object identity from the cache
     *
     * @param ObjectIdentityInterface $oid
     * @return AclInterface
     */
    public function getFromCacheByIdentity(ObjectIdentityInterface $oid);

    /**
     * Stores a new ACL in the cache
     *
     * @param AclInterface $acl
     */
    public function putInCache(AclInterface $acl);

    /**
     * Removes all ACLs from the cache
     */
    public function clearCache();
}
PK�`�\j���Ipear/Symfony/Component/Security/Acl/Model/MutableAclProviderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * Provides support for creating and storing ACL instances.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface MutableAclProviderInterface extends AclProviderInterface
{
    /**
     * Creates a new ACL for the given object identity.
     *
     * @throws AclAlreadyExistsException when there already is an ACL for the given
     *                                   object identity
     * @param ObjectIdentityInterface $oid
     * @return MutableAclInterface
     */
    public function createAcl(ObjectIdentityInterface $oid);

    /**
     * Deletes the ACL for a given object identity.
     *
     * This will automatically trigger a delete for any child ACLs. If you don't
     * want child ACLs to be deleted, you will have to set their parent ACL to null.
     *
     * @param ObjectIdentityInterface $oid
     */
    public function deleteAcl(ObjectIdentityInterface $oid);

    /**
     * Persists any changes which were made to the ACL, or any associated
     * access control entries.
     *
     * Changes to parent ACLs are not persisted.
     *
     * @param MutableAclInterface $acl
     */
    public function updateAcl(MutableAclInterface $acl);
}
PK�`�\�ݤUUApear/Symfony/Component/Security/Acl/Model/FieldEntryInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * Interface for entries which are restricted to specific fields
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface FieldEntryInterface extends EntryInterface
{
    /**
     * Returns the field used for this entry.
     *
     * @return string
     */
    public function getField();
}
PK�`�\H<J��Bpear/Symfony/Component/Security/Acl/Model/AuditLoggerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * Interface for audit loggers
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface AuditLoggerInterface
{
    /**
     * This method is called whenever access is granted, or denied, and
     * administrative mode is turned off.
     *
     * @param Boolean        $granted
     * @param EntryInterface $ace
     */
    public function logIfNeeded($granted, EntryInterface $ace);
}
PK�`�\�5AyyEpear/Symfony/Component/Security/Acl/Model/ObjectIdentityInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Model;

/**
 * Represents the identity of an individual domain object instance.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface ObjectIdentityInterface
{
    /**
     * We specifically require this method so we can check for object equality
     * explicitly, and do not have to rely on referencial equality instead.
     *
     * Though in most cases, both checks should result in the same outcome.
     *
     * Referential Equality: $object1 === $object2
     * Example for Object Equality: $object1->getId() === $object2->getId()
     *
     * @param ObjectIdentityInterface $identity
     * @return Boolean
     */
    public function equals(ObjectIdentityInterface $identity);

    /**
     * Obtains a unique identifier for this object. The identifier must not be
     * re-used for other objects with the same type.
     *
     * @return string cannot return null
     */
    public function getIdentifier();

    /**
     * Returns a type for the domain object. Typically, this is the PHP class name.
     *
     * @return string cannot return null
     */
    public function getType();
}
PK�`�\\!�	HH7pear/Symfony/Component/Security/Acl/Voter/FieldVote.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Voter;

/**
 * This class is a lightweight wrapper around field vote requests which does
 * not violate any interface contracts.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class FieldVote
{
    private $domainObject;
    private $field;

    public function __construct($domainObject, $field)
    {
        $this->domainObject = $domainObject;
        $this->field = $field;
    }

    public function getDomainObject()
    {
        return $this->domainObject;
    }

    public function getField()
    {
        return $this->field;
    }
}
PK�`�\\�F6pear/Symfony/Component/Security/Acl/Voter/AclVoter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Voter;

use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Acl\Exception\NoAceFoundException;
use Symfony\Component\Security\Acl\Exception\AclNotFoundException;
use Symfony\Component\Security\Acl\Model\AclProviderInterface;
use Symfony\Component\Security\Acl\Model\ObjectIdentityInterface;
use Symfony\Component\Security\Acl\Permission\PermissionMapInterface;
use Symfony\Component\Security\Acl\Model\SecurityIdentityRetrievalStrategyInterface;
use Symfony\Component\Security\Acl\Model\ObjectIdentityRetrievalStrategyInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;

/**
 * This voter can be used as a base class for implementing your own permissions.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AclVoter implements VoterInterface
{
    private $aclProvider;
    private $permissionMap;
    private $objectIdentityRetrievalStrategy;
    private $securityIdentityRetrievalStrategy;
    private $allowIfObjectIdentityUnavailable;
    private $logger;

    public function __construct(AclProviderInterface $aclProvider, ObjectIdentityRetrievalStrategyInterface $oidRetrievalStrategy, SecurityIdentityRetrievalStrategyInterface $sidRetrievalStrategy, PermissionMapInterface $permissionMap, LoggerInterface $logger = null, $allowIfObjectIdentityUnavailable = true)
    {
        $this->aclProvider = $aclProvider;
        $this->permissionMap = $permissionMap;
        $this->objectIdentityRetrievalStrategy = $oidRetrievalStrategy;
        $this->securityIdentityRetrievalStrategy = $sidRetrievalStrategy;
        $this->logger = $logger;
        $this->allowIfObjectIdentityUnavailable = $allowIfObjectIdentityUnavailable;
    }

    public function supportsAttribute($attribute)
    {
        return $this->permissionMap->contains($attribute);
    }

    public function vote(TokenInterface $token, $object, array $attributes)
    {
        foreach ($attributes as $attribute) {
            if (null === $masks = $this->permissionMap->getMasks($attribute, $object)) {
                continue;
            }

            if (null === $object) {
                if (null !== $this->logger) {
                    $this->logger->debug(sprintf('Object identity unavailable. Voting to %s', $this->allowIfObjectIdentityUnavailable? 'grant access' : 'abstain'));
                }

                return $this->allowIfObjectIdentityUnavailable ? self::ACCESS_GRANTED : self::ACCESS_ABSTAIN;
            } elseif ($object instanceof FieldVote) {
                $field = $object->getField();
                $object = $object->getDomainObject();
            } else {
                $field = null;
            }

            if ($object instanceof ObjectIdentityInterface) {
                $oid = $object;
            } elseif (null === $oid = $this->objectIdentityRetrievalStrategy->getObjectIdentity($object)) {
                if (null !== $this->logger) {
                    $this->logger->debug(sprintf('Object identity unavailable. Voting to %s', $this->allowIfObjectIdentityUnavailable? 'grant access' : 'abstain'));
                }

                return $this->allowIfObjectIdentityUnavailable ? self::ACCESS_GRANTED : self::ACCESS_ABSTAIN;
            }

            if (!$this->supportsClass($oid->getType())) {
                return self::ACCESS_ABSTAIN;
            }

            $sids = $this->securityIdentityRetrievalStrategy->getSecurityIdentities($token);

            try {
                $acl = $this->aclProvider->findAcl($oid, $sids);

                if (null === $field && $acl->isGranted($masks, $sids, false)) {
                    if (null !== $this->logger) {
                        $this->logger->debug('ACL found, permission granted. Voting to grant access');
                    }

                    return self::ACCESS_GRANTED;
                } elseif (null !== $field && $acl->isFieldGranted($field, $masks, $sids, false)) {
                    if (null !== $this->logger) {
                        $this->logger->debug('ACL found, permission granted. Voting to grant access');
                    }

                    return self::ACCESS_GRANTED;
                }

                if (null !== $this->logger) {
                    $this->logger->debug('ACL found, insufficient permissions. Voting to deny access.');
                }

                return self::ACCESS_DENIED;
            } catch (AclNotFoundException $noAcl) {
                if (null !== $this->logger) {
                    $this->logger->debug('No ACL found for the object identity. Voting to deny access.');
                }

                return self::ACCESS_DENIED;
            } catch (NoAceFoundException $noAce) {
                if (null !== $this->logger) {
                    $this->logger->debug('ACL found, no ACE applicable. Voting to deny access.');
                }

                return self::ACCESS_DENIED;
            }
        }

        // no attribute was supported
        return self::ACCESS_ABSTAIN;
    }

    /**
     * You can override this method when writing a voter for a specific domain
     * class.
     *
     * @param string $class The class name
     *
     * @return Boolean
     */
    public function supportsClass($class)
    {
        return true;
    }
}
PK�`�\]��_""Jpear/Symfony/Component/Security/Acl/Exception/NotAllAclsFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Exception;

/**
 * This exception is thrown when you have requested ACLs for multiple object
 * identities, but the AclProvider implementation failed to find ACLs for all
 * identities.
 *
 * This exception contains the partial result.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class NotAllAclsFoundException extends AclNotFoundException
{
    private $partialResult;

    /**
     * Sets the partial result
     *
     * @param \SplObjectStorage $result
     */
    public function setPartialResult(\SplObjectStorage $result)
    {
        $this->partialResult = $result;
    }

    /**
     * Returns the partial result
     *
     * @return \SplObjectStorage
     */
    public function getPartialResult()
    {
        return $this->partialResult;
    }
}
PK�`�\�k�q��;pear/Symfony/Component/Security/Acl/Exception/Exception.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Exception;

/**
 * Base ACL exception
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class Exception extends \Exception
{
}
PK�`�\���ONpear/Symfony/Component/Security/Acl/Exception/InvalidDomainObjectException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Exception;

/**
 * This exception is thrown when ObjectIdentity fails to construct an object
 * identity from the passed domain object.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class InvalidDomainObjectException extends Exception
{
}
PK�`�\P͡��Fpear/Symfony/Component/Security/Acl/Exception/AclNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Exception;

/**
 * This exception is thrown when we cannot locate an ACL for a passed
 * ObjectIdentity implementation.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AclNotFoundException extends Exception
{
}
PK�`�\��5�

Kpear/Symfony/Component/Security/Acl/Exception/AclAlreadyExistsException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Exception;

/**
 * This exception is thrown when someone tries to create an ACL for an object
 * identity that already has one.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AclAlreadyExistsException extends Exception
{
}
PK�`�\�B�l��Epear/Symfony/Component/Security/Acl/Exception/NoAceFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Exception;

/**
 * This exception is thrown when we cannot locate an ACE that matches the
 * combination of permission masks and security identities.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class NoAceFoundException extends Exception
{
    public function __construct()
    {
        parent::__construct('No applicable ACE was found.');
    }
}
PK�`�\[�z�Gpear/Symfony/Component/Security/Acl/Exception/SidNotLoadedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Exception;

/**
 * This exception is thrown when ACEs for an SID are requested which has not
 * been loaded from the database.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class SidNotLoadedException extends Exception
{
}
PK�`�\�W�Qpear/Symfony/Component/Security/Acl/Exception/ConcurrentModificationException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Exception;

/**
 * This exception is thrown whenever you change shared properties of more than
 * one ACL of the same class type concurrently.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ConcurrentModificationException extends Exception
{
}
PK�`�\� c0��Epear/Symfony/Component/Security/Acl/Permission/BasicPermissionMap.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Permission;

/**
 * This is basic permission map complements the masks which have been defined
 * on the standard implementation of the MaskBuilder.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class BasicPermissionMap implements PermissionMapInterface
{
    const PERMISSION_VIEW        = 'VIEW';
    const PERMISSION_EDIT        = 'EDIT';
    const PERMISSION_CREATE      = 'CREATE';
    const PERMISSION_DELETE      = 'DELETE';
    const PERMISSION_UNDELETE    = 'UNDELETE';
    const PERMISSION_OPERATOR    = 'OPERATOR';
    const PERMISSION_MASTER      = 'MASTER';
    const PERMISSION_OWNER       = 'OWNER';

    protected $map;

    public function __construct()
    {
        $this->map = array(
            self::PERMISSION_VIEW => array(
                MaskBuilder::MASK_VIEW,
                MaskBuilder::MASK_EDIT,
                MaskBuilder::MASK_OPERATOR,
                MaskBuilder::MASK_MASTER,
                MaskBuilder::MASK_OWNER,
            ),

            self::PERMISSION_EDIT => array(
                MaskBuilder::MASK_EDIT,
                MaskBuilder::MASK_OPERATOR,
                MaskBuilder::MASK_MASTER,
                MaskBuilder::MASK_OWNER,
            ),

            self::PERMISSION_CREATE => array(
                MaskBuilder::MASK_CREATE,
                MaskBuilder::MASK_OPERATOR,
                MaskBuilder::MASK_MASTER,
                MaskBuilder::MASK_OWNER,
            ),

            self::PERMISSION_DELETE => array(
                MaskBuilder::MASK_DELETE,
                MaskBuilder::MASK_OPERATOR,
                MaskBuilder::MASK_MASTER,
                MaskBuilder::MASK_OWNER,
            ),

            self::PERMISSION_UNDELETE => array(
                MaskBuilder::MASK_UNDELETE,
                MaskBuilder::MASK_OPERATOR,
                MaskBuilder::MASK_MASTER,
                MaskBuilder::MASK_OWNER,
            ),

            self::PERMISSION_OPERATOR => array(
                MaskBuilder::MASK_OPERATOR,
                MaskBuilder::MASK_MASTER,
                MaskBuilder::MASK_OWNER,
            ),

            self::PERMISSION_MASTER => array(
                MaskBuilder::MASK_MASTER,
                MaskBuilder::MASK_OWNER,
            ),

            self::PERMISSION_OWNER => array(
                MaskBuilder::MASK_OWNER,
            ),
        );
    }

    /**
     * {@inheritDoc}
     */
    public function getMasks($permission, $object)
    {
        if (!isset($this->map[$permission])) {
            return null;
        }

        return $this->map[$permission];
    }

    /**
     * {@inheritDoc}
     */
    public function contains($permission)
    {
        return isset($this->map[$permission]);
    }
}
PK�`�\�ep�gg>pear/Symfony/Component/Security/Acl/Permission/MaskBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Permission;

/**
 * This class allows you to build cumulative permissions easily, or convert
 * masks to a human-readable format.
 *
 * <code>
 *       $builder = new MaskBuilder();
 *       $builder
 *           ->add('view')
 *           ->add('create')
 *           ->add('edit')
 *       ;
 *       var_dump($builder->get());        // int(7)
 *       var_dump($builder->getPattern()); // string(32) ".............................ECV"
 * </code>
 *
 * We have defined some commonly used base permissions which you can use:
 * - VIEW: the SID is allowed to view the domain object / field
 * - CREATE: the SID is allowed to create new instances of the domain object / fields
 * - EDIT: the SID is allowed to edit existing instances of the domain object / field
 * - DELETE: the SID is allowed to delete domain objects
 * - UNDELETE: the SID is allowed to recover domain objects from trash
 * - OPERATOR: the SID is allowed to perform any action on the domain object
 *             except for granting others permissions
 * - MASTER: the SID is allowed to perform any action on the domain object,
 *           and is allowed to grant other SIDs any permission except for
 *           MASTER and OWNER permissions
 * - OWNER: the SID is owning the domain object in question and can perform any
 *          action on the domain object as well as grant any permission
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class MaskBuilder
{
    const MASK_VIEW         = 1;          // 1 << 0
    const MASK_CREATE       = 2;          // 1 << 1
    const MASK_EDIT         = 4;          // 1 << 2
    const MASK_DELETE       = 8;          // 1 << 3
    const MASK_UNDELETE     = 16;         // 1 << 4
    const MASK_OPERATOR     = 32;         // 1 << 5
    const MASK_MASTER       = 64;         // 1 << 6
    const MASK_OWNER        = 128;        // 1 << 7
    const MASK_IDDQD        = 1073741823; // 1 << 0 | 1 << 1 | ... | 1 << 30

    const CODE_VIEW         = 'V';
    const CODE_CREATE       = 'C';
    const CODE_EDIT         = 'E';
    const CODE_DELETE       = 'D';
    const CODE_UNDELETE     = 'U';
    const CODE_OPERATOR     = 'O';
    const CODE_MASTER       = 'M';
    const CODE_OWNER        = 'N';

    const ALL_OFF           = '................................';
    const OFF               = '.';
    const ON                = '*';

    private $mask;

    /**
     * Constructor
     *
     * @param integer $mask optional; defaults to 0
     *
     * @throws \InvalidArgumentException
     */
    public function __construct($mask = 0)
    {
        if (!is_int($mask)) {
            throw new \InvalidArgumentException('$mask must be an integer.');
        }

        $this->mask = $mask;
    }

    /**
     * Adds a mask to the permission
     *
     * @param mixed $mask
     *
     * @return MaskBuilder
     *
     * @throws \InvalidArgumentException
     */
    public function add($mask)
    {
        if (is_string($mask) && defined($name = 'static::MASK_'.strtoupper($mask))) {
            $mask = constant($name);
        } elseif (!is_int($mask)) {
            throw new \InvalidArgumentException('$mask must be an integer.');
        }

        $this->mask |= $mask;

        return $this;
    }

    /**
     * Returns the mask of this permission
     *
     * @return integer
     */
    public function get()
    {
        return $this->mask;
    }

    /**
     * Returns a human-readable representation of the permission
     *
     * @return string
     */
    public function getPattern()
    {
        $pattern = self::ALL_OFF;
        $length = strlen($pattern);
        $bitmask = str_pad(decbin($this->mask), $length, '0', STR_PAD_LEFT);

        for ($i=$length-1; $i>=0; $i--) {
            if ('1' === $bitmask[$i]) {
                try {
                    $pattern[$i] = self::getCode(1 << ($length - $i - 1));
                } catch (\Exception $notPredefined) {
                    $pattern[$i] = self::ON;
                }
            }
        }

        return $pattern;
    }

    /**
     * Removes a mask from the permission
     *
     * @param mixed $mask
     *
     * @return MaskBuilder
     *
     * @throws \InvalidArgumentException
     */
    public function remove($mask)
    {
        if (is_string($mask) && defined($name = 'static::MASK_'.strtoupper($mask))) {
            $mask = constant($name);
        } elseif (!is_int($mask)) {
            throw new \InvalidArgumentException('$mask must be an integer.');
        }

        $this->mask &= ~$mask;

        return $this;
    }

    /**
     * Resets the PermissionBuilder
     *
     * @return MaskBuilder
     */
    public function reset()
    {
        $this->mask = 0;

        return $this;
    }

    /**
     * Returns the code for the passed mask
     *
     * @param integer $mask
     * @throws \InvalidArgumentException
     * @throws \RuntimeException
     * @return string
     */
    public static function getCode($mask)
    {
        if (!is_int($mask)) {
            throw new \InvalidArgumentException('$mask must be an integer.');
        }

        $reflection = new \ReflectionClass(get_called_class());
        foreach ($reflection->getConstants() as $name => $cMask) {
            if (0 !== strpos($name, 'MASK_')) {
                continue;
            }

            if ($mask === $cMask) {
                if (!defined($cName = 'static::CODE_'.substr($name, 5))) {
                    throw new \RuntimeException('There was no code defined for this mask.');
                }

                return constant($cName);
            }
        }

        throw new \InvalidArgumentException(sprintf('The mask "%d" is not supported.', $mask));
    }
}
PK�`�\w���Ipear/Symfony/Component/Security/Acl/Permission/PermissionMapInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Permission;

/**
 * This is the interface that must be implemented by permission maps.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface PermissionMapInterface
{
    /**
     * Returns an array of bitmasks.
     *
     * The security identity must have been granted access to at least one of
     * these bitmasks.
     *
     * @param string $permission
     * @param object $object
     * @return array may return null if permission/object combination is not supported
     */
    public function getMasks($permission, $object);

    /**
     * Whether this map contains the given permission
     *
     * @param string $permission
     * @return Boolean
     */
    public function contains($permission);
}
PK�`�\tA)�==Cpear/Symfony/Component/Security/Acl/Domain/RoleSecurityIdentity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Symfony\Component\Security\Acl\Model\SecurityIdentityInterface;
use Symfony\Component\Security\Core\Role\Role;

/**
 * A SecurityIdentity implementation for roles
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
final class RoleSecurityIdentity implements SecurityIdentityInterface
{
    private $role;

    /**
     * Constructor
     *
     * @param mixed $role a Role instance, or its string representation
     */
    public function __construct($role)
    {
        if ($role instanceof Role) {
            $role = $role->getRole();
        }

        $this->role = $role;
    }

    /**
     * Returns the role name
     *
     * @return string
     */
    public function getRole()
    {
        return $this->role;
    }

    /**
     * {@inheritDoc}
     */
    public function equals(SecurityIdentityInterface $sid)
    {
        if (!$sid instanceof RoleSecurityIdentity) {
            return false;
        }

        return $this->role === $sid->getRole();
    }

    /**
     * Returns a textual representation of this security identity.
     *
     * This is solely used for debugging purposes, not to make an equality decision.
     *
     * @return string
     */
    public function __toString()
    {
        return sprintf('RoleSecurityIdentity(%s)', $this->role);
    }
}
PK�`�\(]���Ipear/Symfony/Component/Security/Acl/Domain/PermissionGrantingStrategy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Symfony\Component\Security\Acl\Exception\NoAceFoundException;
use Symfony\Component\Security\Acl\Model\AclInterface;
use Symfony\Component\Security\Acl\Model\AuditLoggerInterface;
use Symfony\Component\Security\Acl\Model\EntryInterface;
use Symfony\Component\Security\Acl\Model\PermissionGrantingStrategyInterface;
use Symfony\Component\Security\Acl\Model\SecurityIdentityInterface;

/**
 * The permission granting strategy to apply to the access control list.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class PermissionGrantingStrategy implements PermissionGrantingStrategyInterface
{
    const EQUAL = 'equal';
    const ALL   = 'all';
    const ANY   = 'any';

    private $auditLogger;

    /**
     * Sets the audit logger
     *
     * @param AuditLoggerInterface $auditLogger
     */
    public function setAuditLogger(AuditLoggerInterface $auditLogger)
    {
        $this->auditLogger = $auditLogger;
    }

    /**
     * {@inheritDoc}
     */
    public function isGranted(AclInterface $acl, array $masks, array $sids, $administrativeMode = false)
    {
        try {
            try {
                $aces = $acl->getObjectAces();

                if (!$aces) {
                    throw new NoAceFoundException();
                }

                return $this->hasSufficientPermissions($acl, $aces, $masks, $sids, $administrativeMode);
            } catch (NoAceFoundException $noObjectAce) {
                $aces = $acl->getClassAces();

                if (!$aces) {
                    throw $noObjectAce;
                }

                return $this->hasSufficientPermissions($acl, $aces, $masks, $sids, $administrativeMode);
            }
        } catch (NoAceFoundException $noClassAce) {
            if ($acl->isEntriesInheriting() && null !== $parentAcl = $acl->getParentAcl()) {
                return $parentAcl->isGranted($masks, $sids, $administrativeMode);
            }

            throw $noClassAce;
        }
    }

    /**
     * {@inheritDoc}
     */
    public function isFieldGranted(AclInterface $acl, $field, array $masks, array $sids, $administrativeMode = false)
    {
        try {
            try {
                $aces = $acl->getObjectFieldAces($field);
                if (!$aces) {
                    throw new NoAceFoundException();
                }

                return $this->hasSufficientPermissions($acl, $aces, $masks, $sids, $administrativeMode);
            } catch (NoAceFoundException $noObjectAces) {
                $aces = $acl->getClassFieldAces($field);
                if (!$aces) {
                    throw $noObjectAces;
                }

                return $this->hasSufficientPermissions($acl, $aces, $masks, $sids, $administrativeMode);
            }
        } catch (NoAceFoundException $noClassAces) {
            if ($acl->isEntriesInheriting() && null !== $parentAcl = $acl->getParentAcl()) {
                return $parentAcl->isFieldGranted($field, $masks, $sids, $administrativeMode);
            }

            throw $noClassAces;
        }
    }

    /**
     * Makes an authorization decision.
     *
     * The order of ACEs, and SIDs is significant; the order of permission masks
     * not so much. It is important to note that the more specific security
     * identities should be at the beginning of the SIDs array in order for this
     * strategy to produce intuitive authorization decisions.
     *
     * First, we will iterate over permissions, then over security identities.
     * For each combination of permission, and identity we will test the
     * available ACEs until we find one which is applicable.
     *
     * The first applicable ACE will make the ultimate decision for the
     * permission/identity combination. If it is granting, this method will return
     * true, if it is denying, the method will continue to check the next
     * permission/identity combination.
     *
     * This process is repeated until either a granting ACE is found, or no
     * permission/identity combinations are left. Finally, we will either throw
     * an NoAceFoundException, or deny access.
     *
     * @param AclInterface                $acl
     * @param EntryInterface[]            $aces               An array of ACE to check against
     * @param array                       $masks              An array of permission masks
     * @param SecurityIdentityInterface[] $sids               An array of SecurityIdentityInterface implementations
     * @param Boolean                     $administrativeMode True turns off audit logging
     *
     * @return Boolean true, or false; either granting, or denying access respectively.
     *
     * @throws NoAceFoundException
     */
    private function hasSufficientPermissions(AclInterface $acl, array $aces, array $masks, array $sids, $administrativeMode)
    {
        $firstRejectedAce  = null;

        foreach ($masks as $requiredMask) {
            foreach ($sids as $sid) {
                foreach ($aces as $ace) {
                    if ($sid->equals($ace->getSecurityIdentity()) && $this->isAceApplicable($requiredMask, $ace)) {
                        if ($ace->isGranting()) {
                            if (!$administrativeMode && null !== $this->auditLogger) {
                                $this->auditLogger->logIfNeeded(true, $ace);
                            }

                            return true;
                        }

                        if (null === $firstRejectedAce) {
                            $firstRejectedAce = $ace;
                        }

                        break 2;
                    }
                }
            }
        }

        if (null !== $firstRejectedAce) {
            if (!$administrativeMode && null !== $this->auditLogger) {
                $this->auditLogger->logIfNeeded(false, $firstRejectedAce);
            }

            return false;
        }

        throw new NoAceFoundException();
    }

    /**
     * Determines whether the ACE is applicable to the given permission/security
     * identity combination.
     *
     * Per default, we support three different comparison strategies.
     *
     * Strategy ALL:
     * The ACE will be considered applicable when all the turned-on bits in the
     * required mask are also turned-on in the ACE mask.
     *
     * Strategy ANY:
     * The ACE will be considered applicable when any of the turned-on bits in
     * the required mask is also turned-on the in the ACE mask.
     *
     * Strategy EQUAL:
     * The ACE will be considered applicable when the bitmasks are equal.
     *
     * @param integer        $requiredMask
     * @param EntryInterface $ace
     *
     * @return Boolean
     *
     * @throws \RuntimeException if the ACE strategy is not supported
     */
    private function isAceApplicable($requiredMask, EntryInterface $ace)
    {
        $strategy = $ace->getStrategy();
        if (self::ALL === $strategy) {
            return $requiredMask === ($ace->getMask() & $requiredMask);
        } elseif (self::ANY === $strategy) {
            return 0 !== ($ace->getMask() & $requiredMask);
        } elseif (self::EQUAL === $strategy) {
            return $requiredMask === $ace->getMask();
        }

        throw new \RuntimeException(sprintf('The strategy "%s" is not supported.', $strategy));
    }
}
PK�`�\^@�.YY=pear/Symfony/Component/Security/Acl/Domain/ObjectIdentity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Symfony\Component\Security\Core\Util\ClassUtils;
use Symfony\Component\Security\Acl\Exception\InvalidDomainObjectException;
use Symfony\Component\Security\Acl\Model\DomainObjectInterface;
use Symfony\Component\Security\Acl\Model\ObjectIdentityInterface;

/**
 * ObjectIdentity implementation
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
final class ObjectIdentity implements ObjectIdentityInterface
{
    private $identifier;
    private $type;

    /**
     * Constructor.
     *
     * @param string $identifier
     * @param string $type
     *
     * @throws \InvalidArgumentException
     */
    public function __construct($identifier, $type)
    {
        if (empty($identifier)) {
            throw new \InvalidArgumentException('$identifier cannot be empty.');
        }
        if (empty($type)) {
            throw new \InvalidArgumentException('$type cannot be empty.');
        }

        $this->identifier = $identifier;
        $this->type = $type;
    }

    /**
     * Constructs an ObjectIdentity for the given domain object
     *
     * @param object $domainObject
     * @throws InvalidDomainObjectException
     * @return ObjectIdentity
     */
    public static function fromDomainObject($domainObject)
    {
        if (!is_object($domainObject)) {
            throw new InvalidDomainObjectException('$domainObject must be an object.');
        }

        try {
            if ($domainObject instanceof DomainObjectInterface) {
                return new self($domainObject->getObjectIdentifier(), ClassUtils::getRealClass($domainObject));
            } elseif (method_exists($domainObject, 'getId')) {
                return new self($domainObject->getId(), ClassUtils::getRealClass($domainObject));
            }
        } catch (\InvalidArgumentException $invalid) {
            throw new InvalidDomainObjectException($invalid->getMessage(), 0, $invalid);
        }

        throw new InvalidDomainObjectException('$domainObject must either implement the DomainObjectInterface, or have a method named "getId".');
    }

    /**
     * {@inheritDoc}
     */
    public function getIdentifier()
    {
        return $this->identifier;
    }

    /**
     * {@inheritDoc}
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * {@inheritDoc}
     */
    public function equals(ObjectIdentityInterface $identity)
    {
        // comparing the identifier with === might lead to problems, so we
        // waive this restriction
        return $this->identifier == $identity->getIdentifier()
               && $this->type === $identity->getType();
    }

    /**
     * Returns a textual representation of this object identity
     *
     * @return string
     */
    public function __toString()
    {
        return sprintf('ObjectIdentity(%s, %s)', $this->identifier, $this->type);
    }
}
PK�`�\%�}`M`M2pear/Symfony/Component/Security/Acl/Domain/Acl.phpnu�[���<?php
/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Doctrine\Common\NotifyPropertyChanged;
use Doctrine\Common\PropertyChangedListener;
use Symfony\Component\Security\Acl\Model\AclInterface;
use Symfony\Component\Security\Acl\Model\AuditableAclInterface;
use Symfony\Component\Security\Acl\Model\EntryInterface;
use Symfony\Component\Security\Acl\Model\ObjectIdentityInterface;
use Symfony\Component\Security\Acl\Model\PermissionGrantingStrategyInterface;
use Symfony\Component\Security\Acl\Model\SecurityIdentityInterface;

/**
 * An ACL implementation.
 *
 * Each object identity has exactly one associated ACL. Each ACL can have four
 * different types of ACEs (class ACEs, object ACEs, class field ACEs, object field
 * ACEs).
 *
 * You should not iterate over the ACEs yourself, but instead use isGranted(),
 * or isFieldGranted(). These will utilize an implementation of PermissionGrantingStrategy
 * internally.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class Acl implements AuditableAclInterface, NotifyPropertyChanged
{
    private $parentAcl;
    private $permissionGrantingStrategy;
    private $objectIdentity;
    private $classAces = array();
    private $classFieldAces = array();
    private $objectAces = array();
    private $objectFieldAces = array();
    private $id;
    private $loadedSids;
    private $entriesInheriting;
    private $listeners = array();

    /**
     * Constructor
     *
     * @param integer                             $id
     * @param ObjectIdentityInterface             $objectIdentity
     * @param PermissionGrantingStrategyInterface $permissionGrantingStrategy
     * @param array                               $loadedSids
     * @param Boolean                             $entriesInheriting
     */
    public function __construct($id, ObjectIdentityInterface $objectIdentity, PermissionGrantingStrategyInterface $permissionGrantingStrategy, array $loadedSids = array(), $entriesInheriting)
    {
        $this->id = $id;
        $this->objectIdentity = $objectIdentity;
        $this->permissionGrantingStrategy = $permissionGrantingStrategy;
        $this->loadedSids = $loadedSids;
        $this->entriesInheriting = $entriesInheriting;
    }

    /**
     * Adds a property changed listener
     *
     * @param PropertyChangedListener $listener
     */
    public function addPropertyChangedListener(PropertyChangedListener $listener)
    {
        $this->listeners[] = $listener;
    }

    /**
     * {@inheritDoc}
     */
    public function deleteClassAce($index)
    {
        $this->deleteAce('classAces', $index);
    }

    /**
     * {@inheritDoc}
     */
    public function deleteClassFieldAce($index, $field)
    {
        $this->deleteFieldAce('classFieldAces', $index, $field);
    }

    /**
     * {@inheritDoc}
     */
    public function deleteObjectAce($index)
    {
        $this->deleteAce('objectAces', $index);
    }

    /**
     * {@inheritDoc}
     */
    public function deleteObjectFieldAce($index, $field)
    {
        $this->deleteFieldAce('objectFieldAces', $index, $field);
    }

    /**
     * {@inheritDoc}
     */
    public function getClassAces()
    {
        return $this->classAces;
    }

    /**
     * {@inheritDoc}
     */
    public function getClassFieldAces($field)
    {
        return isset($this->classFieldAces[$field])? $this->classFieldAces[$field] : array();
    }

    /**
     * {@inheritDoc}
     */
    public function getObjectAces()
    {
        return $this->objectAces;
    }

    /**
     * {@inheritDoc}
     */
    public function getObjectFieldAces($field)
    {
        return isset($this->objectFieldAces[$field]) ? $this->objectFieldAces[$field] : array();
    }

    /**
     * {@inheritDoc}
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * {@inheritDoc}
     */
    public function getObjectIdentity()
    {
        return $this->objectIdentity;
    }

    /**
     * {@inheritDoc}
     */
    public function getParentAcl()
    {
        return $this->parentAcl;
    }

    /**
     * {@inheritDoc}
     */
    public function insertClassAce(SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null)
    {
        $this->insertAce('classAces', $index, $mask, $sid, $granting, $strategy);
    }

    /**
     * {@inheritDoc}
     */
    public function insertClassFieldAce($field, SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null)
    {
        $this->insertFieldAce('classFieldAces', $index, $field, $mask, $sid, $granting, $strategy);
    }

    /**
     * {@inheritDoc}
     */
    public function insertObjectAce(SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null)
    {
        $this->insertAce('objectAces', $index, $mask, $sid, $granting, $strategy);
    }

    /**
     * {@inheritDoc}
     */
    public function insertObjectFieldAce($field, SecurityIdentityInterface $sid, $mask, $index = 0, $granting = true, $strategy = null)
    {
        $this->insertFieldAce('objectFieldAces', $index, $field, $mask, $sid, $granting, $strategy);
    }

    /**
     * {@inheritDoc}
     */
    public function isEntriesInheriting()
    {
        return $this->entriesInheriting;
    }

    /**
     * {@inheritDoc}
     */
    public function isFieldGranted($field, array $masks, array $securityIdentities, $administrativeMode = false)
    {
        return $this->permissionGrantingStrategy->isFieldGranted($this, $field, $masks, $securityIdentities, $administrativeMode);
    }

    /**
     * {@inheritDoc}
     */
    public function isGranted(array $masks, array $securityIdentities, $administrativeMode = false)
    {
        return $this->permissionGrantingStrategy->isGranted($this, $masks, $securityIdentities, $administrativeMode);
    }

    /**
     * {@inheritDoc}
     */
    public function isSidLoaded($sids)
    {
        if (!$this->loadedSids) {
            return true;
        }

        if (!is_array($sids)) {
            $sids = array($sids);
        }

        foreach ($sids as $sid) {
            if (!$sid instanceof SecurityIdentityInterface) {
                throw new \InvalidArgumentException(
                    '$sid must be an instance of SecurityIdentityInterface.');
            }

            foreach ($this->loadedSids as $loadedSid) {
                if ($loadedSid->equals($sid)) {
                    continue 2;
                }
            }

            return false;
        }

        return true;
    }

    /**
     * Implementation for the \Serializable interface
     *
     * @return string
     */
    public function serialize()
    {
        return serialize(array(
            null === $this->parentAcl ? null : $this->parentAcl->getId(),
            $this->objectIdentity,
            $this->classAces,
            $this->classFieldAces,
            $this->objectAces,
            $this->objectFieldAces,
            $this->id,
            $this->loadedSids,
            $this->entriesInheriting,
        ));
    }

    /**
     * Implementation for the \Serializable interface
     *
     * @param string $serialized
     */
    public function unserialize($serialized)
    {
        list($this->parentAcl,
             $this->objectIdentity,
             $this->classAces,
             $this->classFieldAces,
             $this->objectAces,
             $this->objectFieldAces,
             $this->id,
             $this->loadedSids,
             $this->entriesInheriting
        ) = unserialize($serialized);

        $this->listeners = array();
    }

    /**
     * {@inheritDoc}
     */
    public function setEntriesInheriting($boolean)
    {
        if ($this->entriesInheriting !== $boolean) {
            $this->onPropertyChanged('entriesInheriting', $this->entriesInheriting, $boolean);
            $this->entriesInheriting = $boolean;
        }
    }

    /**
     * {@inheritDoc}
     */
    public function setParentAcl(AclInterface $acl = null)
    {
        if (null !== $acl && null === $acl->getId()) {
            throw new \InvalidArgumentException('$acl must have an ID.');
        }

        if ($this->parentAcl !== $acl) {
            $this->onPropertyChanged('parentAcl', $this->parentAcl, $acl);
            $this->parentAcl = $acl;
        }
    }

    /**
     * {@inheritDoc}
     */
    public function updateClassAce($index, $mask, $strategy = null)
    {
        $this->updateAce('classAces', $index, $mask, $strategy);
    }

    /**
     * {@inheritDoc}
     */
    public function updateClassFieldAce($index, $field, $mask, $strategy = null)
    {
        $this->updateFieldAce('classFieldAces', $index, $field, $mask, $strategy);
    }

    /**
     * {@inheritDoc}
     */
    public function updateObjectAce($index, $mask, $strategy = null)
    {
        $this->updateAce('objectAces', $index, $mask, $strategy);
    }

    /**
     * {@inheritDoc}
     */
    public function updateObjectFieldAce($index, $field, $mask, $strategy = null)
    {
        $this->updateFieldAce('objectFieldAces', $index, $field, $mask, $strategy);
    }

    /**
     * {@inheritDoc}
     */
    public function updateClassAuditing($index, $auditSuccess, $auditFailure)
    {
        $this->updateAuditing($this->classAces, $index, $auditSuccess, $auditFailure);
    }

    /**
     * {@inheritDoc}
     */
    public function updateClassFieldAuditing($index, $field, $auditSuccess, $auditFailure)
    {
        if (!isset($this->classFieldAces[$field])) {
            throw new \InvalidArgumentException(sprintf('There are no ACEs for field "%s".', $field));
        }

        $this->updateAuditing($this->classFieldAces[$field], $index, $auditSuccess, $auditFailure);
    }

    /**
     * {@inheritDoc}
     */
    public function updateObjectAuditing($index, $auditSuccess, $auditFailure)
    {
        $this->updateAuditing($this->objectAces, $index, $auditSuccess, $auditFailure);
    }

    /**
     * {@inheritDoc}
     */
    public function updateObjectFieldAuditing($index, $field, $auditSuccess, $auditFailure)
    {
        if (!isset($this->objectFieldAces[$field])) {
            throw new \InvalidArgumentException(sprintf('There are no ACEs for field "%s".', $field));
        }

        $this->updateAuditing($this->objectFieldAces[$field], $index, $auditSuccess, $auditFailure);
    }

    /**
     * Deletes an ACE
     *
     * @param string  $property
     * @param integer $index
     * @throws \OutOfBoundsException
     */
    private function deleteAce($property, $index)
    {
        $aces =& $this->$property;
        if (!isset($aces[$index])) {
            throw new \OutOfBoundsException(sprintf('The index "%d" does not exist.', $index));
        }

        $oldValue = $this->$property;
        unset($aces[$index]);
        $this->$property = array_values($this->$property);
        $this->onPropertyChanged($property, $oldValue, $this->$property);

        for ($i=$index,$c=count($this->$property); $i<$c; $i++) {
            $this->onEntryPropertyChanged($aces[$i], 'aceOrder', $i+1, $i);
        }
    }

    /**
     * Deletes a field-based ACE
     *
     * @param string  $property
     * @param integer $index
     * @param string  $field
     * @throws \OutOfBoundsException
     */
    private function deleteFieldAce($property, $index, $field)
    {
        $aces =& $this->$property;
        if (!isset($aces[$field][$index])) {
            throw new \OutOfBoundsException(sprintf('The index "%d" does not exist.', $index));
        }

        $oldValue = $this->$property;
        unset($aces[$field][$index]);
        $aces[$field] = array_values($aces[$field]);
        $this->onPropertyChanged($property, $oldValue, $this->$property);

        for ($i=$index,$c=count($aces[$field]); $i<$c; $i++) {
            $this->onEntryPropertyChanged($aces[$field][$i], 'aceOrder', $i+1, $i);
        }
    }

    /**
     * Inserts an ACE
     *
     * @param string                    $property
     * @param integer                   $index
     * @param integer                   $mask
     * @param SecurityIdentityInterface $sid
     * @param Boolean                   $granting
     * @param string                    $strategy
     * @throws \OutOfBoundsException
     * @throws \InvalidArgumentException
     */
    private function insertAce($property, $index, $mask, SecurityIdentityInterface $sid, $granting, $strategy = null)
    {
        if ($index < 0 || $index > count($this->$property)) {
            throw new \OutOfBoundsException(sprintf('The index must be in the interval [0, %d].', count($this->$property)));
        }

        if (!is_int($mask)) {
            throw new \InvalidArgumentException('$mask must be an integer.');
        }

        if (null === $strategy) {
            if (true === $granting) {
                $strategy = PermissionGrantingStrategy::ALL;
            } else {
                $strategy = PermissionGrantingStrategy::ANY;
            }
        }

        $aces =& $this->$property;
        $oldValue = $this->$property;
        if (isset($aces[$index])) {
            $this->$property = array_merge(
                array_slice($this->$property, 0, $index),
                array(true),
                array_slice($this->$property, $index)
            );

            for ($i=$index,$c=count($this->$property)-1; $i<$c; $i++) {
                $this->onEntryPropertyChanged($aces[$i+1], 'aceOrder', $i, $i+1);
            }
        }

        $aces[$index] = new Entry(null, $this, $sid, $strategy, $mask, $granting, false, false);
        $this->onPropertyChanged($property, $oldValue, $this->$property);
    }

    /**
     * Inserts a field-based ACE
     *
     * @param string                    $property
     * @param integer                   $index
     * @param string                    $field
     * @param integer                   $mask
     * @param SecurityIdentityInterface $sid
     * @param Boolean                   $granting
     * @param string                    $strategy
     * @throws \InvalidArgumentException
     * @throws \OutOfBoundsException
     */
    private function insertFieldAce($property, $index, $field, $mask, SecurityIdentityInterface $sid, $granting, $strategy = null)
    {
        if (0 === strlen($field)) {
            throw new \InvalidArgumentException('$field cannot be empty.');
        }

        if (!is_int($mask)) {
            throw new \InvalidArgumentException('$mask must be an integer.');
        }

        if (null === $strategy) {
            if (true === $granting) {
                $strategy = PermissionGrantingStrategy::ALL;
            } else {
                $strategy = PermissionGrantingStrategy::ANY;
            }
        }

        $aces =& $this->$property;
        if (!isset($aces[$field])) {
            $aces[$field] = array();
        }

        if ($index < 0 || $index > count($aces[$field])) {
            throw new \OutOfBoundsException(sprintf('The index must be in the interval [0, %d].', count($this->$property)));
        }

        $oldValue = $aces;
        if (isset($aces[$field][$index])) {
            $aces[$field] = array_merge(
                array_slice($aces[$field], 0, $index),
                array(true),
                array_slice($aces[$field], $index)
            );

            for ($i=$index,$c=count($aces[$field])-1; $i<$c; $i++) {
                $this->onEntryPropertyChanged($aces[$field][$i+1], 'aceOrder', $i, $i+1);
            }
        }

        $aces[$field][$index] = new FieldEntry(null, $this, $field, $sid, $strategy, $mask, $granting, false, false);
        $this->onPropertyChanged($property, $oldValue, $this->$property);
    }

    /**
     * Updates an ACE
     *
     * @param string  $property
     * @param integer $index
     * @param integer $mask
     * @param string  $strategy
     * @throws \OutOfBoundsException
     */
    private function updateAce($property, $index, $mask, $strategy = null)
    {
        $aces =& $this->$property;
        if (!isset($aces[$index])) {
            throw new \OutOfBoundsException(sprintf('The index "%d" does not exist.', $index));
        }

        $ace = $aces[$index];
        if ($mask !== $oldMask = $ace->getMask()) {
            $this->onEntryPropertyChanged($ace, 'mask', $oldMask, $mask);
            $ace->setMask($mask);
        }
        if (null !== $strategy && $strategy !== $oldStrategy = $ace->getStrategy()) {
            $this->onEntryPropertyChanged($ace, 'strategy', $oldStrategy, $strategy);
            $ace->setStrategy($strategy);
        }
    }

    /**
     * Updates auditing for an ACE
     *
     * @param array   &$aces
     * @param integer $index
     * @param Boolean $auditSuccess
     * @param Boolean $auditFailure
     * @throws \OutOfBoundsException
     */
    private function updateAuditing(array &$aces, $index, $auditSuccess, $auditFailure)
    {
        if (!isset($aces[$index])) {
            throw new \OutOfBoundsException(sprintf('The index "%d" does not exist.', $index));
        }

        if ($auditSuccess !== $aces[$index]->isAuditSuccess()) {
            $this->onEntryPropertyChanged($aces[$index], 'auditSuccess', !$auditSuccess, $auditSuccess);
            $aces[$index]->setAuditSuccess($auditSuccess);
        }

        if ($auditFailure !== $aces[$index]->isAuditFailure()) {
            $this->onEntryPropertyChanged($aces[$index], 'auditFailure', !$auditFailure, $auditFailure);
            $aces[$index]->setAuditFailure($auditFailure);
        }
    }

    /**
     * Updates a field-based ACE
     *
     * @param string  $property
     * @param integer $index
     * @param string  $field
     * @param integer $mask
     * @param string  $strategy
     * @throws \InvalidArgumentException
     * @throws \OutOfBoundsException
     */
    private function updateFieldAce($property, $index, $field, $mask, $strategy = null)
    {
        if (0 === strlen($field)) {
            throw new \InvalidArgumentException('$field cannot be empty.');
        }

        $aces =& $this->$property;
        if (!isset($aces[$field][$index])) {
            throw new \OutOfBoundsException(sprintf('The index "%d" does not exist.', $index));
        }

        $ace = $aces[$field][$index];
        if ($mask !== $oldMask = $ace->getMask()) {
            $this->onEntryPropertyChanged($ace, 'mask', $oldMask, $mask);
            $ace->setMask($mask);
        }
        if (null !== $strategy && $strategy !== $oldStrategy = $ace->getStrategy()) {
            $this->onEntryPropertyChanged($ace, 'strategy', $oldStrategy, $strategy);
            $ace->setStrategy($strategy);
        }
    }

    /**
     * Called when a property of the ACL changes
     *
     * @param string $name
     * @param mixed  $oldValue
     * @param mixed  $newValue
     */
    private function onPropertyChanged($name, $oldValue, $newValue)
    {
        foreach ($this->listeners as $listener) {
            $listener->propertyChanged($this, $name, $oldValue, $newValue);
        }
    }

    /**
     * Called when a property of an ACE associated with this ACL changes
     *
     * @param EntryInterface $entry
     * @param string         $name
     * @param mixed          $oldValue
     * @param mixed          $newValue
     */
    private function onEntryPropertyChanged(EntryInterface $entry, $name, $oldValue, $newValue)
    {
        foreach ($this->listeners as $listener) {
            $listener->propertyChanged($entry, $name, $oldValue, $newValue);
        }
    }
}
PK�`�\NTA�]]:pear/Symfony/Component/Security/Acl/Domain/AuditLogger.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Symfony\Component\Security\Acl\Model\AuditableEntryInterface;
use Symfony\Component\Security\Acl\Model\EntryInterface;
use Symfony\Component\Security\Acl\Model\AuditLoggerInterface;

/**
 * Base audit logger implementation
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
abstract class AuditLogger implements AuditLoggerInterface
{
    /**
     * Performs some checks if logging was requested
     *
     * @param Boolean        $granted
     * @param EntryInterface $ace
     */
    public function logIfNeeded($granted, EntryInterface $ace)
    {
        if (!$ace instanceof AuditableEntryInterface) {
            return;
        }

        if ($granted && $ace->isAuditSuccess()) {
            $this->doLog($granted, $ace);
        } elseif (!$granted && $ace->isAuditFailure()) {
            $this->doLog($granted, $ace);
        }
    }

    /**
     * This method is only called when logging is needed
     *
     * @param Boolean        $granted
     * @param EntryInterface $ace
     */
    abstract protected function doLog($granted, EntryInterface $ace);
}
PK�`�\5D�[4pear/Symfony/Component/Security/Acl/Domain/Entry.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Symfony\Component\Security\Acl\Model\AclInterface;
use Symfony\Component\Security\Acl\Model\AuditableEntryInterface;
use Symfony\Component\Security\Acl\Model\SecurityIdentityInterface;

/**
 * Auditable ACE implementation
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class Entry implements AuditableEntryInterface
{
    private $acl;
    private $mask;
    private $id;
    private $securityIdentity;
    private $strategy;
    private $auditFailure;
    private $auditSuccess;
    private $granting;

    /**
     * Constructor
     *
     * @param integer                   $id
     * @param AclInterface              $acl
     * @param SecurityIdentityInterface $sid
     * @param string                    $strategy
     * @param integer                   $mask
     * @param Boolean                   $granting
     * @param Boolean                   $auditFailure
     * @param Boolean                   $auditSuccess
     */
    public function __construct($id, AclInterface $acl, SecurityIdentityInterface $sid, $strategy, $mask, $granting, $auditFailure, $auditSuccess)
    {
        $this->id = $id;
        $this->acl = $acl;
        $this->securityIdentity = $sid;
        $this->strategy = $strategy;
        $this->mask = $mask;
        $this->granting = $granting;
        $this->auditFailure = $auditFailure;
        $this->auditSuccess = $auditSuccess;
    }

    /**
     * {@inheritDoc}
     */
    public function getAcl()
    {
        return $this->acl;
    }

    /**
     * {@inheritDoc}
     */
    public function getMask()
    {
        return $this->mask;
    }

    /**
     * {@inheritDoc}
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * {@inheritDoc}
     */
    public function getSecurityIdentity()
    {
        return $this->securityIdentity;
    }

    /**
     * {@inheritDoc}
     */
    public function getStrategy()
    {
        return $this->strategy;
    }

    /**
     * {@inheritDoc}
     */
    public function isAuditFailure()
    {
        return $this->auditFailure;
    }

    /**
     * {@inheritDoc}
     */
    public function isAuditSuccess()
    {
        return $this->auditSuccess;
    }

    /**
     * {@inheritDoc}
     */
    public function isGranting()
    {
        return $this->granting;
    }

    /**
     * Turns on/off auditing on permissions denials.
     *
     * Do never call this method directly. Use the respective methods on the
     * AclInterface instead.
     *
     * @param Boolean $boolean
     */
    public function setAuditFailure($boolean)
    {
        $this->auditFailure = $boolean;
    }

    /**
     * Turns on/off auditing on permission grants.
     *
     * Do never call this method directly. Use the respective methods on the
     * AclInterface instead.
     *
     * @param Boolean $boolean
     */
    public function setAuditSuccess($boolean)
    {
        $this->auditSuccess = $boolean;
    }

    /**
     * Sets the permission mask
     *
     * Do never call this method directly. Use the respective methods on the
     * AclInterface instead.
     *
     * @param integer $mask
     */
    public function setMask($mask)
    {
        $this->mask = $mask;
    }

    /**
     * Sets the mask comparison strategy
     *
     * Do never call this method directly. Use the respective methods on the
     * AclInterface instead.
     *
     * @param string $strategy
     */
    public function setStrategy($strategy)
    {
        $this->strategy = $strategy;
    }

    /**
     * Implementation of \Serializable
     *
     * @return string
     */
    public function serialize()
    {
        return serialize(array(
            $this->mask,
            $this->id,
            $this->securityIdentity,
            $this->strategy,
            $this->auditFailure,
            $this->auditSuccess,
            $this->granting,
        ));
    }

    /**
     * Implementation of \Serializable
     *
     * @param string $serialized
     */
    public function unserialize($serialized)
    {
        list($this->mask,
             $this->id,
             $this->securityIdentity,
             $this->strategy,
             $this->auditFailure,
             $this->auditSuccess,
             $this->granting
        ) = unserialize($serialized);
    }
}
PK�`�\0F���Npear/Symfony/Component/Security/Acl/Domain/ObjectIdentityRetrievalStrategy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Symfony\Component\Security\Acl\Exception\InvalidDomainObjectException;
use Symfony\Component\Security\Acl\Model\ObjectIdentityRetrievalStrategyInterface;

/**
 * Strategy to be used for retrieving object identities from domain objects
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ObjectIdentityRetrievalStrategy implements ObjectIdentityRetrievalStrategyInterface
{
    /**
     * {@inheritDoc}
     */
    public function getObjectIdentity($domainObject)
    {
        try {
            return ObjectIdentity::fromDomainObject($domainObject);
        } catch (InvalidDomainObjectException $failed) {
            return null;
        }
    }
}
PK�`�\����Ppear/Symfony/Component/Security/Acl/Domain/SecurityIdentityRetrievalStrategy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Acl\Model\SecurityIdentityRetrievalStrategyInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver;
use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;

/**
 * Strategy for retrieving security identities
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class SecurityIdentityRetrievalStrategy implements SecurityIdentityRetrievalStrategyInterface
{
    private $roleHierarchy;
    private $authenticationTrustResolver;

    /**
     * Constructor
     *
     * @param RoleHierarchyInterface      $roleHierarchy
     * @param AuthenticationTrustResolver $authenticationTrustResolver
     */
    public function __construct(RoleHierarchyInterface $roleHierarchy, AuthenticationTrustResolver $authenticationTrustResolver)
    {
        $this->roleHierarchy = $roleHierarchy;
        $this->authenticationTrustResolver = $authenticationTrustResolver;
    }

    /**
     * {@inheritDoc}
     */
    public function getSecurityIdentities(TokenInterface $token)
    {
        $sids = array();

        // add user security identity
        if (!$token instanceof AnonymousToken) {
            try {
                $sids[] = UserSecurityIdentity::fromToken($token);
            } catch (\InvalidArgumentException $invalid) {
                // ignore, user has no user security identity
            }
        }

        // add all reachable roles
        foreach ($this->roleHierarchy->getReachableRoles($token->getRoles()) as $role) {
            $sids[] = new RoleSecurityIdentity($role);
        }

        // add built-in special roles
        if ($this->authenticationTrustResolver->isFullFledged($token)) {
            $sids[] = new RoleSecurityIdentity(AuthenticatedVoter::IS_AUTHENTICATED_FULLY);
            $sids[] = new RoleSecurityIdentity(AuthenticatedVoter::IS_AUTHENTICATED_REMEMBERED);
            $sids[] = new RoleSecurityIdentity(AuthenticatedVoter::IS_AUTHENTICATED_ANONYMOUSLY);
        } elseif ($this->authenticationTrustResolver->isRememberMe($token)) {
            $sids[] = new RoleSecurityIdentity(AuthenticatedVoter::IS_AUTHENTICATED_REMEMBERED);
            $sids[] = new RoleSecurityIdentity(AuthenticatedVoter::IS_AUTHENTICATED_ANONYMOUSLY);
        } elseif ($this->authenticationTrustResolver->isAnonymous($token)) {
            $sids[] = new RoleSecurityIdentity(AuthenticatedVoter::IS_AUTHENTICATED_ANONYMOUSLY);
        }

        return $sids;
    }
}
PK�`�\�pU���9pear/Symfony/Component/Security/Acl/Domain/FieldEntry.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Symfony\Component\Security\Acl\Model\AclInterface;
use Symfony\Component\Security\Acl\Model\FieldEntryInterface;
use Symfony\Component\Security\Acl\Model\SecurityIdentityInterface;

/**
 * Field-aware ACE implementation which is auditable
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class FieldEntry extends Entry implements FieldEntryInterface
{
    private $field;

    /**
     * Constructor
     *
     * @param integer                   $id
     * @param AclInterface              $acl
     * @param string                    $field
     * @param SecurityIdentityInterface $sid
     * @param string                    $strategy
     * @param integer                   $mask
     * @param Boolean                   $granting
     * @param Boolean                   $auditFailure
     * @param Boolean                   $auditSuccess
     */
    public function __construct($id, AclInterface $acl, $field, SecurityIdentityInterface $sid, $strategy, $mask, $granting, $auditFailure, $auditSuccess)
    {
        parent::__construct($id, $acl, $sid, $strategy, $mask, $granting, $auditFailure, $auditSuccess);

        $this->field = $field;
    }

    /**
     * {@inheritDoc}
     */
    public function getField()
    {
        return $this->field;
    }

    /**
     * {@inheritDoc}
     */
    public function serialize()
    {
        return serialize(array(
            $this->field,
            parent::serialize(),
        ));
    }

    /**
     * {@inheritDoc}
     */
    public function unserialize($serialized)
    {
        list($this->field, $parentStr) = unserialize($serialized);
        parent::unserialize($parentStr);
    }
}
PK�`�\�X�
/	/	Apear/Symfony/Component/Security/Acl/Domain/AclCollectionCache.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Symfony\Component\Security\Acl\Model\AclProviderInterface;
use Symfony\Component\Security\Acl\Model\ObjectIdentityRetrievalStrategyInterface;
use Symfony\Component\Security\Acl\Model\SecurityIdentityRetrievalStrategyInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

/**
 * This service caches ACLs for an entire collection of objects.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class AclCollectionCache
{
    private $aclProvider;
    private $objectIdentityRetrievalStrategy;
    private $securityIdentityRetrievalStrategy;

    /**
     * Constructor.
     *
     * @param AclProviderInterface                       $aclProvider
     * @param ObjectIdentityRetrievalStrategyInterface   $oidRetrievalStrategy
     * @param SecurityIdentityRetrievalStrategyInterface $sidRetrievalStrategy
     */
    public function __construct(AclProviderInterface $aclProvider, ObjectIdentityRetrievalStrategyInterface $oidRetrievalStrategy, SecurityIdentityRetrievalStrategyInterface $sidRetrievalStrategy)
    {
        $this->aclProvider = $aclProvider;
        $this->objectIdentityRetrievalStrategy = $oidRetrievalStrategy;
        $this->securityIdentityRetrievalStrategy = $sidRetrievalStrategy;
    }

    /**
     * Batch loads ACLs for an entire collection; thus, it reduces the number
     * of required queries considerably.
     *
     * @param mixed            $collection anything that can be passed to foreach()
     * @param TokenInterface[] $tokens     an array of TokenInterface implementations
     */
    public function cache($collection, array $tokens = array())
    {
        $sids = array();
        foreach ($tokens as $token) {
            $sids = array_merge($sids, $this->securityIdentityRetrievalStrategy->getSecurityIdentities($token));
        }

        $oids = array();
        foreach ($collection as $domainObject) {
            $oids[] = $this->objectIdentityRetrievalStrategy->getObjectIdentity($domainObject);
        }

        $this->aclProvider->findAcls($oids, $sids);
    }
}
PK�`�\�.��**Cpear/Symfony/Component/Security/Acl/Domain/UserSecurityIdentity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Util\ClassUtils;
use Symfony\Component\Security\Acl\Model\SecurityIdentityInterface;

/**
 * A SecurityIdentity implementation used for actual users
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
final class UserSecurityIdentity implements SecurityIdentityInterface
{
    private $username;
    private $class;

    /**
     * Constructor
     *
     * @param string $username the username representation
     * @param string $class    the user's fully qualified class name
     *
     * @throws \InvalidArgumentException
     */
    public function __construct($username, $class)
    {
        if (empty($username)) {
            throw new \InvalidArgumentException('$username must not be empty.');
        }
        if (empty($class)) {
            throw new \InvalidArgumentException('$class must not be empty.');
        }

        $this->username = (string) $username;
        $this->class = $class;
    }

    /**
     * Creates a user security identity from a UserInterface
     *
     * @param UserInterface $user
     * @return UserSecurityIdentity
     */
    public static function fromAccount(UserInterface $user)
    {
        return new self($user->getUsername(), ClassUtils::getRealClass($user));
    }

    /**
     * Creates a user security identity from a TokenInterface
     *
     * @param TokenInterface $token
     * @return UserSecurityIdentity
     */
    public static function fromToken(TokenInterface $token)
    {
        $user = $token->getUser();

        if ($user instanceof UserInterface) {
            return self::fromAccount($user);
        }

        return new self((string) $user, is_object($user) ? ClassUtils::getRealClass($user) : ClassUtils::getRealClass($token));
    }

    /**
     * Returns the username
     *
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * Returns the user's class name
     *
     * @return string
     */
    public function getClass()
    {
        return $this->class;
    }

    /**
     * {@inheritDoc}
     */
    public function equals(SecurityIdentityInterface $sid)
    {
        if (!$sid instanceof UserSecurityIdentity) {
            return false;
        }

        return $this->username === $sid->getUsername()
               && $this->class === $sid->getClass();
    }

    /**
     * A textual representation of this security identity.
     *
     * This is not used for equality comparison, but only for debugging.
     *
     * @return string
     */
    public function __toString()
    {
        return sprintf('UserSecurityIdentity(%s, %s)', $this->username, $this->class);
    }
}
PK�`�\��C3��?pear/Symfony/Component/Security/Acl/Domain/DoctrineAclCache.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Domain;

use Doctrine\Common\Cache\Cache;
use Symfony\Component\Security\Acl\Model\AclCacheInterface;
use Symfony\Component\Security\Acl\Model\AclInterface;
use Symfony\Component\Security\Acl\Model\ObjectIdentityInterface;
use Symfony\Component\Security\Acl\Model\PermissionGrantingStrategyInterface;

/**
 * This class is a wrapper around the actual cache implementation.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class DoctrineAclCache implements AclCacheInterface
{
    const PREFIX = 'sf2_acl_';

    private $cache;
    private $prefix;
    private $permissionGrantingStrategy;

    /**
     * Constructor
     *
     * @param Cache                               $cache
     * @param PermissionGrantingStrategyInterface $permissionGrantingStrategy
     * @param string                              $prefix
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(Cache $cache, PermissionGrantingStrategyInterface $permissionGrantingStrategy, $prefix = self::PREFIX)
    {
        if (0 === strlen($prefix)) {
            throw new \InvalidArgumentException('$prefix cannot be empty.');
        }

        $this->cache = $cache;
        $this->permissionGrantingStrategy = $permissionGrantingStrategy;
        $this->prefix = $prefix;
    }

    /**
     * {@inheritDoc}
     */
    public function clearCache()
    {
        $this->cache->deleteByPrefix($this->prefix);
    }

    /**
     * {@inheritDoc}
     */
    public function evictFromCacheById($aclId)
    {
        $lookupKey = $this->getAliasKeyForIdentity($aclId);
        if (!$this->cache->contains($lookupKey)) {
            return;
        }

        $key = $this->cache->fetch($lookupKey);
        if ($this->cache->contains($key)) {
            $this->cache->delete($key);
        }

        $this->cache->delete($lookupKey);
    }

    /**
     * {@inheritDoc}
     */
    public function evictFromCacheByIdentity(ObjectIdentityInterface $oid)
    {
        $key = $this->getDataKeyByIdentity($oid);
        if (!$this->cache->contains($key)) {
            return;
        }

        $this->cache->delete($key);
    }

    /**
     * {@inheritDoc}
     */
    public function getFromCacheById($aclId)
    {
        $lookupKey = $this->getAliasKeyForIdentity($aclId);
        if (!$this->cache->contains($lookupKey)) {
            return null;
        }

        $key = $this->cache->fetch($lookupKey);
        if (!$this->cache->contains($key)) {
            $this->cache->delete($lookupKey);

            return null;
        }

        return $this->unserializeAcl($this->cache->fetch($key));
    }

    /**
     * {@inheritDoc}
     */
    public function getFromCacheByIdentity(ObjectIdentityInterface $oid)
    {
        $key = $this->getDataKeyByIdentity($oid);
        if (!$this->cache->contains($key)) {
            return null;
        }

        return $this->unserializeAcl($this->cache->fetch($key));
    }

    /**
     * {@inheritDoc}
     */
    public function putInCache(AclInterface $acl)
    {
        if (null === $acl->getId()) {
            throw new \InvalidArgumentException('Transient ACLs cannot be cached.');
        }

        if (null !== $parentAcl = $acl->getParentAcl()) {
            $this->putInCache($parentAcl);
        }

        $key = $this->getDataKeyByIdentity($acl->getObjectIdentity());
        $this->cache->save($key, serialize($acl));
        $this->cache->save($this->getAliasKeyForIdentity($acl->getId()), $key);
    }

    /**
     * Unserializes the ACL.
     *
     * @param string $serialized
     * @return AclInterface
     */
    private function unserializeAcl($serialized)
    {
        $acl = unserialize($serialized);

        if (null !== $parentId = $acl->getParentAcl()) {
            $parentAcl = $this->getFromCacheById($parentId);

            if (null === $parentAcl) {
                return null;
            }

            $acl->setParentAcl($parentAcl);
        }

        $reflectionProperty = new \ReflectionProperty($acl, 'permissionGrantingStrategy');
        $reflectionProperty->setAccessible(true);
        $reflectionProperty->setValue($acl, $this->permissionGrantingStrategy);
        $reflectionProperty->setAccessible(false);

        $aceAclProperty = new \ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'acl');
        $aceAclProperty->setAccessible(true);

        foreach ($acl->getObjectAces() as $ace) {
            $aceAclProperty->setValue($ace, $acl);
        }
        foreach ($acl->getClassAces() as $ace) {
            $aceAclProperty->setValue($ace, $acl);
        }

        $aceClassFieldProperty = new \ReflectionProperty($acl, 'classFieldAces');
        $aceClassFieldProperty->setAccessible(true);
        foreach ($aceClassFieldProperty->getValue($acl) as $aces) {
            foreach ($aces as $ace) {
                $aceAclProperty->setValue($ace, $acl);
            }
        }
        $aceClassFieldProperty->setAccessible(false);

        $aceObjectFieldProperty = new \ReflectionProperty($acl, 'objectFieldAces');
        $aceObjectFieldProperty->setAccessible(true);
        foreach ($aceObjectFieldProperty->getValue($acl) as $aces) {
            foreach ($aces as $ace) {
                $aceAclProperty->setValue($ace, $acl);
            }
        }
        $aceObjectFieldProperty->setAccessible(false);

        $aceAclProperty->setAccessible(false);

        return $acl;
    }

    /**
     * Returns the key for the object identity
     *
     * @param ObjectIdentityInterface $oid
     * @return string
     */
    private function getDataKeyByIdentity(ObjectIdentityInterface $oid)
    {
        return $this->prefix.md5($oid->getType()).sha1($oid->getType())
               .'_'.md5($oid->getIdentifier()).sha1($oid->getIdentifier());
    }

    /**
     * Returns the alias key for the object identity key
     *
     * @param string $aclId
     * @return string
     */
    private function getAliasKeyForIdentity($aclId)
    {
        return $this->prefix.$aclId;
    }
}
PK�`�\�#��~~Apear/Symfony/Component/Security/Acl/Resources/bin/generateSql.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

require_once __DIR__.'/../../../../ClassLoader/ClassLoader.php';

use Symfony\Component\ClassLoader\ClassLoader;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Security\Acl\Dbal\Schema;

$loader = new ClassLoader();
$loader->addPrefixes(array(
    'Symfony'                    => __DIR__.'/../../../../../..',
    'Doctrine\\Common'           => __DIR__.'/../../../../../../../vendor/doctrine-common/lib',
    'Doctrine\\DBAL\\Migrations' => __DIR__.'/../../../../../../../vendor/doctrine-migrations/lib',
    'Doctrine\\DBAL'             => __DIR__.'/../../../../../../../vendor/doctrine-dbal/lib',
    'Doctrine'                   => __DIR__.'/../../../../../../../vendor/doctrine/lib',
));
$loader->register();

$schema = new Schema(array(
    'class_table_name'         => 'acl_classes',
    'entry_table_name'         => 'acl_entries',
    'oid_table_name'           => 'acl_object_identities',
    'oid_ancestors_table_name' => 'acl_object_identity_ancestors',
    'sid_table_name'           => 'acl_security_identities',
));

$reflection = new ReflectionClass('Doctrine\\DBAL\\Platforms\\AbstractPlatform');
$finder = new Finder();
$finder->name('*Platform.php')->in(dirname($reflection->getFileName()));
foreach ($finder as $file) {
    require_once $file->getPathName();
    $className = 'Doctrine\\DBAL\\Platforms\\'.$file->getBasename('.php');

    $reflection = new ReflectionClass($className);
    if ($reflection->isAbstract()) {
        continue;
    }

    $platform = $reflection->newInstance();
    $targetFile = sprintf(__DIR__.'/../schema/%s.sql', $platform->name);
    file_put_contents($targetFile, implode("\n\n", $schema->toSql($platform)));
}
PK�`�\fZ��^^>pear/Symfony/Component/Security/Acl/Resources/schema/mysql.sqlnu�[���CREATE TABLE acl_classes (id INT UNSIGNED AUTO_INCREMENT NOT NULL, class_type VARCHAR(200) NOT NULL, UNIQUE INDEX UNIQ_69DD750638A36066 (class_type), PRIMARY KEY(id)) ENGINE = InnoDB

CREATE TABLE acl_security_identities (id INT UNSIGNED AUTO_INCREMENT NOT NULL, identifier VARCHAR(200) NOT NULL, username TINYINT(1) NOT NULL, UNIQUE INDEX UNIQ_8835EE78772E836AF85E0677 (identifier, username), PRIMARY KEY(id)) ENGINE = InnoDB

CREATE TABLE acl_object_identities (id INT UNSIGNED AUTO_INCREMENT NOT NULL, parent_object_identity_id INT UNSIGNED DEFAULT NULL, class_id INT UNSIGNED NOT NULL, object_identifier VARCHAR(100) NOT NULL, entries_inheriting TINYINT(1) NOT NULL, UNIQUE INDEX UNIQ_9407E5494B12AD6EA000B10 (object_identifier, class_id), INDEX IDX_9407E54977FA751A (parent_object_identity_id), PRIMARY KEY(id)) ENGINE = InnoDB

CREATE TABLE acl_object_identity_ancestors (object_identity_id INT UNSIGNED NOT NULL, ancestor_id INT UNSIGNED NOT NULL, INDEX IDX_825DE2993D9AB4A6 (object_identity_id), INDEX IDX_825DE299C671CEA1 (ancestor_id), PRIMARY KEY(object_identity_id, ancestor_id)) ENGINE = InnoDB

CREATE TABLE acl_entries (id INT UNSIGNED AUTO_INCREMENT NOT NULL, class_id INT UNSIGNED NOT NULL, object_identity_id INT UNSIGNED DEFAULT NULL, security_identity_id INT UNSIGNED NOT NULL, field_name VARCHAR(50) DEFAULT NULL, ace_order SMALLINT UNSIGNED NOT NULL, mask INT NOT NULL, granting TINYINT(1) NOT NULL, granting_strategy VARCHAR(30) NOT NULL, audit_success TINYINT(1) NOT NULL, audit_failure TINYINT(1) NOT NULL, UNIQUE INDEX UNIQ_46C8B806EA000B103D9AB4A64DEF17BCE4289BF4 (class_id, object_identity_id, field_name, ace_order), INDEX IDX_46C8B806EA000B103D9AB4A6DF9183C9 (class_id, object_identity_id, security_identity_id), INDEX IDX_46C8B806EA000B10 (class_id), INDEX IDX_46C8B8063D9AB4A6 (object_identity_id), INDEX IDX_46C8B806DF9183C9 (security_identity_id), PRIMARY KEY(id)) ENGINE = InnoDB

ALTER TABLE acl_object_identities ADD CONSTRAINT FK_9407E54977FA751A FOREIGN KEY (parent_object_identity_id) REFERENCES acl_object_identities (id)

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE2993D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE299C671CEA1 FOREIGN KEY (ancestor_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806EA000B10 FOREIGN KEY (class_id) REFERENCES acl_classes (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B8063D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806DF9183C9 FOREIGN KEY (security_identity_id) REFERENCES acl_security_identities (id) ON UPDATE CASCADE ON DELETE CASCADEPK�`�\j~	cFF<pear/Symfony/Component/Security/Acl/Resources/schema/db2.sqlnu�[���CREATE TABLE acl_classes (id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, class_type VARCHAR(200) NOT NULL, PRIMARY KEY(id))

CREATE UNIQUE INDEX UNIQ_69DD750638A36066 ON acl_classes (class_type)

CREATE TABLE acl_security_identities (id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, identifier VARCHAR(200) NOT NULL, username SMALLINT NOT NULL, PRIMARY KEY(id))

CREATE UNIQUE INDEX UNIQ_8835EE78772E836AF85E0677 ON acl_security_identities (identifier, username)

CREATE TABLE acl_object_identities (id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, parent_object_identity_id INTEGER DEFAULT NULL, class_id INTEGER NOT NULL, object_identifier VARCHAR(100) NOT NULL, entries_inheriting SMALLINT NOT NULL, PRIMARY KEY(id))

CREATE UNIQUE INDEX UNIQ_9407E5494B12AD6EA000B10 ON acl_object_identities (object_identifier, class_id)

CREATE INDEX IDX_9407E54977FA751A ON acl_object_identities (parent_object_identity_id)

CREATE TABLE acl_object_identity_ancestors (object_identity_id INTEGER NOT NULL, ancestor_id INTEGER NOT NULL, PRIMARY KEY(object_identity_id, ancestor_id))

CREATE INDEX IDX_825DE2993D9AB4A6 ON acl_object_identity_ancestors (object_identity_id)

CREATE INDEX IDX_825DE299C671CEA1 ON acl_object_identity_ancestors (ancestor_id)

CREATE TABLE acl_entries (id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL, class_id INTEGER NOT NULL, object_identity_id INTEGER DEFAULT NULL, security_identity_id INTEGER NOT NULL, field_name VARCHAR(50) DEFAULT NULL, ace_order SMALLINT NOT NULL, mask INTEGER NOT NULL, granting SMALLINT NOT NULL, granting_strategy VARCHAR(30) NOT NULL, audit_success SMALLINT NOT NULL, audit_failure SMALLINT NOT NULL, PRIMARY KEY(id))

CREATE UNIQUE INDEX UNIQ_46C8B806EA000B103D9AB4A64DEF17BCE4289BF4 ON acl_entries (class_id, object_identity_id, field_name, ace_order)

CREATE INDEX IDX_46C8B806EA000B103D9AB4A6DF9183C9 ON acl_entries (class_id, object_identity_id, security_identity_id)

CREATE INDEX IDX_46C8B806EA000B10 ON acl_entries (class_id)

CREATE INDEX IDX_46C8B8063D9AB4A6 ON acl_entries (object_identity_id)

CREATE INDEX IDX_46C8B806DF9183C9 ON acl_entries (security_identity_id)

ALTER TABLE acl_object_identities ADD CONSTRAINT FK_9407E54977FA751A FOREIGN KEY (parent_object_identity_id) REFERENCES acl_object_identities (id)

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE2993D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE299C671CEA1 FOREIGN KEY (ancestor_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806EA000B10 FOREIGN KEY (class_id) REFERENCES acl_classes (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B8063D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806DF9183C9 FOREIGN KEY (security_identity_id) REFERENCES acl_security_identities (id) ON UPDATE CASCADE ON DELETE CASCADEPK�`�\��d��?pear/Symfony/Component/Security/Acl/Resources/schema/sqlite.sqlnu�[���CREATE TABLE acl_classes (id INTEGER NOT NULL, class_type VARCHAR(200) NOT NULL, PRIMARY KEY("id"))

CREATE UNIQUE INDEX UNIQ_69DD750638A36066 ON acl_classes (class_type)

CREATE TABLE acl_security_identities (id INTEGER NOT NULL, identifier VARCHAR(200) NOT NULL, username BOOLEAN NOT NULL, PRIMARY KEY("id"))

CREATE UNIQUE INDEX UNIQ_8835EE78772E836AF85E0677 ON acl_security_identities (identifier, username)

CREATE TABLE acl_object_identities (id INTEGER NOT NULL, parent_object_identity_id INTEGER DEFAULT NULL, class_id INTEGER NOT NULL, object_identifier VARCHAR(100) NOT NULL, entries_inheriting BOOLEAN NOT NULL, PRIMARY KEY("id"))

CREATE UNIQUE INDEX UNIQ_9407E5494B12AD6EA000B10 ON acl_object_identities (object_identifier, class_id)

CREATE INDEX IDX_9407E54977FA751A ON acl_object_identities (parent_object_identity_id)

CREATE TABLE acl_object_identity_ancestors (object_identity_id INTEGER NOT NULL, ancestor_id INTEGER NOT NULL, PRIMARY KEY("object_identity_id", "ancestor_id"))

CREATE INDEX IDX_825DE2993D9AB4A6 ON acl_object_identity_ancestors (object_identity_id)

CREATE INDEX IDX_825DE299C671CEA1 ON acl_object_identity_ancestors (ancestor_id)

CREATE TABLE acl_entries (id INTEGER NOT NULL, class_id INTEGER NOT NULL, object_identity_id INTEGER DEFAULT NULL, security_identity_id INTEGER NOT NULL, field_name VARCHAR(50) DEFAULT NULL, ace_order INTEGER NOT NULL, mask INTEGER NOT NULL, granting BOOLEAN NOT NULL, granting_strategy VARCHAR(30) NOT NULL, audit_success BOOLEAN NOT NULL, audit_failure BOOLEAN NOT NULL, PRIMARY KEY("id"))

CREATE UNIQUE INDEX UNIQ_46C8B806EA000B103D9AB4A64DEF17BCE4289BF4 ON acl_entries (class_id, object_identity_id, field_name, ace_order)

CREATE INDEX IDX_46C8B806EA000B103D9AB4A6DF9183C9 ON acl_entries (class_id, object_identity_id, security_identity_id)

CREATE INDEX IDX_46C8B806EA000B10 ON acl_entries (class_id)

CREATE INDEX IDX_46C8B8063D9AB4A6 ON acl_entries (object_identity_id)

CREATE INDEX IDX_46C8B806DF9183C9 ON acl_entries (security_identity_id)PK�`�\��c�
�
@pear/Symfony/Component/Security/Acl/Resources/schema/drizzle.sqlnu�[���CREATE TABLE acl_classes (id INT AUTO_INCREMENT NOT NULL, class_type VARCHAR(200) NOT NULL, PRIMARY KEY(id), UNIQUE INDEX UNIQ_69DD750638A36066 (class_type))

CREATE TABLE acl_security_identities (id INT AUTO_INCREMENT NOT NULL, identifier VARCHAR(200) NOT NULL, username BOOLEAN NOT NULL, PRIMARY KEY(id), UNIQUE INDEX UNIQ_8835EE78772E836AF85E0677 (identifier, username))

CREATE TABLE acl_object_identities (id INT AUTO_INCREMENT NOT NULL, parent_object_identity_id INT DEFAULT NULL, class_id INT NOT NULL, object_identifier VARCHAR(100) NOT NULL, entries_inheriting BOOLEAN NOT NULL, PRIMARY KEY(id), UNIQUE INDEX UNIQ_9407E5494B12AD6EA000B10 (object_identifier, class_id), INDEX IDX_9407E54977FA751A (parent_object_identity_id))

CREATE TABLE acl_object_identity_ancestors (object_identity_id INT NOT NULL, ancestor_id INT NOT NULL, PRIMARY KEY(object_identity_id, ancestor_id), INDEX IDX_825DE2993D9AB4A6 (object_identity_id), INDEX IDX_825DE299C671CEA1 (ancestor_id))

CREATE TABLE acl_entries (id INT AUTO_INCREMENT NOT NULL, class_id INT NOT NULL, object_identity_id INT DEFAULT NULL, security_identity_id INT NOT NULL, field_name VARCHAR(50) DEFAULT NULL, ace_order INT NOT NULL, mask INT NOT NULL, granting BOOLEAN NOT NULL, granting_strategy VARCHAR(30) NOT NULL, audit_success BOOLEAN NOT NULL, audit_failure BOOLEAN NOT NULL, PRIMARY KEY(id), UNIQUE INDEX UNIQ_46C8B806EA000B103D9AB4A64DEF17BCE4289BF4 (class_id, object_identity_id, field_name, ace_order), INDEX IDX_46C8B806EA000B103D9AB4A6DF9183C9 (class_id, object_identity_id, security_identity_id), INDEX IDX_46C8B806EA000B10 (class_id), INDEX IDX_46C8B8063D9AB4A6 (object_identity_id), INDEX IDX_46C8B806DF9183C9 (security_identity_id))

ALTER TABLE acl_object_identities ADD CONSTRAINT FK_9407E54977FA751A FOREIGN KEY (parent_object_identity_id) REFERENCES acl_object_identities (id)

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE2993D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE299C671CEA1 FOREIGN KEY (ancestor_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806EA000B10 FOREIGN KEY (class_id) REFERENCES acl_classes (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B8063D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806DF9183C9 FOREIGN KEY (security_identity_id) REFERENCES acl_security_identities (id) ON UPDATE CASCADE ON DELETE CASCADEPK�`�\�C� ;;?pear/Symfony/Component/Security/Acl/Resources/schema/oracle.sqlnu�[���CREATE TABLE acl_classes (id NUMBER(10) NOT NULL, class_type VARCHAR2(200) NOT NULL, PRIMARY KEY(id))

DECLARE
  constraints_Count NUMBER;
BEGIN
  SELECT COUNT(CONSTRAINT_NAME) INTO constraints_Count FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'ACL_CLASSES' AND CONSTRAINT_TYPE = 'P';
  IF constraints_Count = 0 OR constraints_Count = '' THEN
    EXECUTE IMMEDIATE 'ALTER TABLE ACL_CLASSES ADD CONSTRAINT ACL_CLASSES_AI_PK PRIMARY KEY (id)';
  END IF;
END;

CREATE SEQUENCE ACL_CLASSES_SEQ START WITH 1 MINVALUE 1 INCREMENT BY 1

CREATE TRIGGER ACL_CLASSES_AI_PK
   BEFORE INSERT
   ON ACL_CLASSES
   FOR EACH ROW
DECLARE
   last_Sequence NUMBER;
   last_InsertID NUMBER;
BEGIN
   SELECT ACL_CLASSES_SEQ.NEXTVAL INTO :NEW.id FROM DUAL;
   IF (:NEW.id IS NULL OR :NEW.id = 0) THEN
      SELECT ACL_CLASSES_SEQ.NEXTVAL INTO :NEW.id FROM DUAL;
   ELSE
      SELECT NVL(Last_Number, 0) INTO last_Sequence
        FROM User_Sequences
       WHERE Sequence_Name = 'ACL_CLASSES_SEQ';
      SELECT :NEW.id INTO last_InsertID FROM DUAL;
      WHILE (last_InsertID > last_Sequence) LOOP
         SELECT ACL_CLASSES_SEQ.NEXTVAL INTO last_Sequence FROM DUAL;
      END LOOP;
   END IF;
END;

CREATE UNIQUE INDEX UNIQ_69DD750638A36066 ON acl_classes (class_type)

CREATE TABLE acl_security_identities (id NUMBER(10) NOT NULL, identifier VARCHAR2(200) NOT NULL, username NUMBER(1) NOT NULL, PRIMARY KEY(id))

DECLARE
  constraints_Count NUMBER;
BEGIN
  SELECT COUNT(CONSTRAINT_NAME) INTO constraints_Count FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'ACL_SECURITY_IDENTITIES' AND CONSTRAINT_TYPE = 'P';
  IF constraints_Count = 0 OR constraints_Count = '' THEN
    EXECUTE IMMEDIATE 'ALTER TABLE ACL_SECURITY_IDENTITIES ADD CONSTRAINT ACL_SECURITY_IDENTITIES_AI_PK PRIMARY KEY (id)';
  END IF;
END;

CREATE SEQUENCE ACL_SECURITY_IDENTITIES_SEQ START WITH 1 MINVALUE 1 INCREMENT BY 1

CREATE TRIGGER ACL_SECURITY_IDENTITIES_AI_PK
   BEFORE INSERT
   ON ACL_SECURITY_IDENTITIES
   FOR EACH ROW
DECLARE
   last_Sequence NUMBER;
   last_InsertID NUMBER;
BEGIN
   SELECT ACL_SECURITY_IDENTITIES_SEQ.NEXTVAL INTO :NEW.id FROM DUAL;
   IF (:NEW.id IS NULL OR :NEW.id = 0) THEN
      SELECT ACL_SECURITY_IDENTITIES_SEQ.NEXTVAL INTO :NEW.id FROM DUAL;
   ELSE
      SELECT NVL(Last_Number, 0) INTO last_Sequence
        FROM User_Sequences
       WHERE Sequence_Name = 'ACL_SECURITY_IDENTITIES_SEQ';
      SELECT :NEW.id INTO last_InsertID FROM DUAL;
      WHILE (last_InsertID > last_Sequence) LOOP
         SELECT ACL_SECURITY_IDENTITIES_SEQ.NEXTVAL INTO last_Sequence FROM DUAL;
      END LOOP;
   END IF;
END;

CREATE UNIQUE INDEX UNIQ_8835EE78772E836AF85E0677 ON acl_security_identities (identifier, username)

CREATE TABLE acl_object_identities (id NUMBER(10) NOT NULL, parent_object_identity_id NUMBER(10) DEFAULT NULL, class_id NUMBER(10) NOT NULL, object_identifier VARCHAR2(100) NOT NULL, entries_inheriting NUMBER(1) NOT NULL, PRIMARY KEY(id))

DECLARE
  constraints_Count NUMBER;
BEGIN
  SELECT COUNT(CONSTRAINT_NAME) INTO constraints_Count FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'ACL_OBJECT_IDENTITIES' AND CONSTRAINT_TYPE = 'P';
  IF constraints_Count = 0 OR constraints_Count = '' THEN
    EXECUTE IMMEDIATE 'ALTER TABLE ACL_OBJECT_IDENTITIES ADD CONSTRAINT ACL_OBJECT_IDENTITIES_AI_PK PRIMARY KEY (id)';
  END IF;
END;

CREATE SEQUENCE ACL_OBJECT_IDENTITIES_SEQ START WITH 1 MINVALUE 1 INCREMENT BY 1

CREATE TRIGGER ACL_OBJECT_IDENTITIES_AI_PK
   BEFORE INSERT
   ON ACL_OBJECT_IDENTITIES
   FOR EACH ROW
DECLARE
   last_Sequence NUMBER;
   last_InsertID NUMBER;
BEGIN
   SELECT ACL_OBJECT_IDENTITIES_SEQ.NEXTVAL INTO :NEW.id FROM DUAL;
   IF (:NEW.id IS NULL OR :NEW.id = 0) THEN
      SELECT ACL_OBJECT_IDENTITIES_SEQ.NEXTVAL INTO :NEW.id FROM DUAL;
   ELSE
      SELECT NVL(Last_Number, 0) INTO last_Sequence
        FROM User_Sequences
       WHERE Sequence_Name = 'ACL_OBJECT_IDENTITIES_SEQ';
      SELECT :NEW.id INTO last_InsertID FROM DUAL;
      WHILE (last_InsertID > last_Sequence) LOOP
         SELECT ACL_OBJECT_IDENTITIES_SEQ.NEXTVAL INTO last_Sequence FROM DUAL;
      END LOOP;
   END IF;
END;

CREATE UNIQUE INDEX UNIQ_9407E5494B12AD6EA000B10 ON acl_object_identities (object_identifier, class_id)

CREATE INDEX IDX_9407E54977FA751A ON acl_object_identities (parent_object_identity_id)

CREATE TABLE acl_object_identity_ancestors (object_identity_id NUMBER(10) NOT NULL, ancestor_id NUMBER(10) NOT NULL, PRIMARY KEY(object_identity_id, ancestor_id))

CREATE INDEX IDX_825DE2993D9AB4A6 ON acl_object_identity_ancestors (object_identity_id)

CREATE INDEX IDX_825DE299C671CEA1 ON acl_object_identity_ancestors (ancestor_id)

CREATE TABLE acl_entries (id NUMBER(10) NOT NULL, class_id NUMBER(10) NOT NULL, object_identity_id NUMBER(10) DEFAULT NULL, security_identity_id NUMBER(10) NOT NULL, field_name VARCHAR2(50) DEFAULT NULL, ace_order NUMBER(5) NOT NULL, mask NUMBER(10) NOT NULL, granting NUMBER(1) NOT NULL, granting_strategy VARCHAR2(30) NOT NULL, audit_success NUMBER(1) NOT NULL, audit_failure NUMBER(1) NOT NULL, PRIMARY KEY(id))

DECLARE
  constraints_Count NUMBER;
BEGIN
  SELECT COUNT(CONSTRAINT_NAME) INTO constraints_Count FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'ACL_ENTRIES' AND CONSTRAINT_TYPE = 'P';
  IF constraints_Count = 0 OR constraints_Count = '' THEN
    EXECUTE IMMEDIATE 'ALTER TABLE ACL_ENTRIES ADD CONSTRAINT ACL_ENTRIES_AI_PK PRIMARY KEY (id)';
  END IF;
END;

CREATE SEQUENCE ACL_ENTRIES_SEQ START WITH 1 MINVALUE 1 INCREMENT BY 1

CREATE TRIGGER ACL_ENTRIES_AI_PK
   BEFORE INSERT
   ON ACL_ENTRIES
   FOR EACH ROW
DECLARE
   last_Sequence NUMBER;
   last_InsertID NUMBER;
BEGIN
   SELECT ACL_ENTRIES_SEQ.NEXTVAL INTO :NEW.id FROM DUAL;
   IF (:NEW.id IS NULL OR :NEW.id = 0) THEN
      SELECT ACL_ENTRIES_SEQ.NEXTVAL INTO :NEW.id FROM DUAL;
   ELSE
      SELECT NVL(Last_Number, 0) INTO last_Sequence
        FROM User_Sequences
       WHERE Sequence_Name = 'ACL_ENTRIES_SEQ';
      SELECT :NEW.id INTO last_InsertID FROM DUAL;
      WHILE (last_InsertID > last_Sequence) LOOP
         SELECT ACL_ENTRIES_SEQ.NEXTVAL INTO last_Sequence FROM DUAL;
      END LOOP;
   END IF;
END;

CREATE UNIQUE INDEX UNIQ_46C8B806EA000B103D9AB4A64DEF17BCE4289BF4 ON acl_entries (class_id, object_identity_id, field_name, ace_order)

CREATE INDEX IDX_46C8B806EA000B103D9AB4A6DF9183C9 ON acl_entries (class_id, object_identity_id, security_identity_id)

CREATE INDEX IDX_46C8B806EA000B10 ON acl_entries (class_id)

CREATE INDEX IDX_46C8B8063D9AB4A6 ON acl_entries (object_identity_id)

CREATE INDEX IDX_46C8B806DF9183C9 ON acl_entries (security_identity_id)

ALTER TABLE acl_object_identities ADD CONSTRAINT FK_9407E54977FA751A FOREIGN KEY (parent_object_identity_id) REFERENCES acl_object_identities (id)

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE2993D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON DELETE CASCADE

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE299C671CEA1 FOREIGN KEY (ancestor_id) REFERENCES acl_object_identities (id) ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806EA000B10 FOREIGN KEY (class_id) REFERENCES acl_classes (id) ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B8063D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806DF9183C9 FOREIGN KEY (security_identity_id) REFERENCES acl_security_identities (id) ON DELETE CASCADEPK�`�\Jx�.

>pear/Symfony/Component/Security/Acl/Resources/schema/mssql.sqlnu�[���CREATE TABLE acl_classes (id INT UNSIGNED IDENTITY NOT NULL, class_type NVARCHAR(200) NOT NULL, PRIMARY KEY (id))

CREATE UNIQUE INDEX UNIQ_69DD750638A36066 ON acl_classes (class_type) WHERE class_type IS NOT NULL

CREATE TABLE acl_security_identities (id INT UNSIGNED IDENTITY NOT NULL, identifier NVARCHAR(200) NOT NULL, username BIT NOT NULL, PRIMARY KEY (id))

CREATE UNIQUE INDEX UNIQ_8835EE78772E836AF85E0677 ON acl_security_identities (identifier, username) WHERE identifier IS NOT NULL AND username IS NOT NULL

CREATE TABLE acl_object_identities (id INT UNSIGNED IDENTITY NOT NULL, parent_object_identity_id INT UNSIGNED DEFAULT NULL, class_id INT UNSIGNED NOT NULL, object_identifier NVARCHAR(100) NOT NULL, entries_inheriting BIT NOT NULL, PRIMARY KEY (id))

CREATE UNIQUE INDEX UNIQ_9407E5494B12AD6EA000B10 ON acl_object_identities (object_identifier, class_id) WHERE object_identifier IS NOT NULL AND class_id IS NOT NULL

CREATE INDEX IDX_9407E54977FA751A ON acl_object_identities (parent_object_identity_id)

CREATE TABLE acl_object_identity_ancestors (object_identity_id INT UNSIGNED NOT NULL, ancestor_id INT UNSIGNED NOT NULL, PRIMARY KEY (object_identity_id, ancestor_id))

CREATE INDEX IDX_825DE2993D9AB4A6 ON acl_object_identity_ancestors (object_identity_id)

CREATE INDEX IDX_825DE299C671CEA1 ON acl_object_identity_ancestors (ancestor_id)

CREATE TABLE acl_entries (id INT UNSIGNED IDENTITY NOT NULL, class_id INT UNSIGNED NOT NULL, object_identity_id INT UNSIGNED DEFAULT NULL, security_identity_id INT UNSIGNED NOT NULL, field_name NVARCHAR(50) DEFAULT NULL, ace_order SMALLINT UNSIGNED NOT NULL, mask INT NOT NULL, granting BIT NOT NULL, granting_strategy NVARCHAR(30) NOT NULL, audit_success BIT NOT NULL, audit_failure BIT NOT NULL, PRIMARY KEY (id))

CREATE UNIQUE INDEX UNIQ_46C8B806EA000B103D9AB4A64DEF17BCE4289BF4 ON acl_entries (class_id, object_identity_id, field_name, ace_order) WHERE class_id IS NOT NULL AND object_identity_id IS NOT NULL AND field_name IS NOT NULL AND ace_order IS NOT NULL

CREATE INDEX IDX_46C8B806EA000B103D9AB4A6DF9183C9 ON acl_entries (class_id, object_identity_id, security_identity_id)

CREATE INDEX IDX_46C8B806EA000B10 ON acl_entries (class_id)

CREATE INDEX IDX_46C8B8063D9AB4A6 ON acl_entries (object_identity_id)

CREATE INDEX IDX_46C8B806DF9183C9 ON acl_entries (security_identity_id)

ALTER TABLE acl_object_identities ADD CONSTRAINT FK_9407E54977FA751A FOREIGN KEY (parent_object_identity_id) REFERENCES acl_object_identities (id)

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE2993D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE299C671CEA1 FOREIGN KEY (ancestor_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806EA000B10 FOREIGN KEY (class_id) REFERENCES acl_classes (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B8063D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806DF9183C9 FOREIGN KEY (security_identity_id) REFERENCES acl_security_identities (id) ON UPDATE CASCADE ON DELETE CASCADEPK�`�\T��skkCpear/Symfony/Component/Security/Acl/Resources/schema/postgresql.sqlnu�[���CREATE TABLE acl_classes (id SERIAL NOT NULL, class_type VARCHAR(200) NOT NULL, PRIMARY KEY(id))

CREATE UNIQUE INDEX UNIQ_69DD750638A36066 ON acl_classes (class_type)

CREATE TABLE acl_security_identities (id SERIAL NOT NULL, identifier VARCHAR(200) NOT NULL, username BOOLEAN NOT NULL, PRIMARY KEY(id))

CREATE UNIQUE INDEX UNIQ_8835EE78772E836AF85E0677 ON acl_security_identities (identifier, username)

CREATE TABLE acl_object_identities (id SERIAL NOT NULL, parent_object_identity_id INT DEFAULT NULL, class_id INT NOT NULL, object_identifier VARCHAR(100) NOT NULL, entries_inheriting BOOLEAN NOT NULL, PRIMARY KEY(id))

CREATE UNIQUE INDEX UNIQ_9407E5494B12AD6EA000B10 ON acl_object_identities (object_identifier, class_id)

CREATE INDEX IDX_9407E54977FA751A ON acl_object_identities (parent_object_identity_id)

CREATE TABLE acl_object_identity_ancestors (object_identity_id INT NOT NULL, ancestor_id INT NOT NULL, PRIMARY KEY(object_identity_id, ancestor_id))

CREATE INDEX IDX_825DE2993D9AB4A6 ON acl_object_identity_ancestors (object_identity_id)

CREATE INDEX IDX_825DE299C671CEA1 ON acl_object_identity_ancestors (ancestor_id)

CREATE TABLE acl_entries (id SERIAL NOT NULL, class_id INT NOT NULL, object_identity_id INT DEFAULT NULL, security_identity_id INT NOT NULL, field_name VARCHAR(50) DEFAULT NULL, ace_order SMALLINT NOT NULL, mask INT NOT NULL, granting BOOLEAN NOT NULL, granting_strategy VARCHAR(30) NOT NULL, audit_success BOOLEAN NOT NULL, audit_failure BOOLEAN NOT NULL, PRIMARY KEY(id))

CREATE UNIQUE INDEX UNIQ_46C8B806EA000B103D9AB4A64DEF17BCE4289BF4 ON acl_entries (class_id, object_identity_id, field_name, ace_order)

CREATE INDEX IDX_46C8B806EA000B103D9AB4A6DF9183C9 ON acl_entries (class_id, object_identity_id, security_identity_id)

CREATE INDEX IDX_46C8B806EA000B10 ON acl_entries (class_id)

CREATE INDEX IDX_46C8B8063D9AB4A6 ON acl_entries (object_identity_id)

CREATE INDEX IDX_46C8B806DF9183C9 ON acl_entries (security_identity_id)

ALTER TABLE acl_object_identities ADD CONSTRAINT FK_9407E54977FA751A FOREIGN KEY (parent_object_identity_id) REFERENCES acl_object_identities (id) NOT DEFERRABLE INITIALLY IMMEDIATE

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE2993D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE

ALTER TABLE acl_object_identity_ancestors ADD CONSTRAINT FK_825DE299C671CEA1 FOREIGN KEY (ancestor_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806EA000B10 FOREIGN KEY (class_id) REFERENCES acl_classes (id) ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B8063D9AB4A6 FOREIGN KEY (object_identity_id) REFERENCES acl_object_identities (id) ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE

ALTER TABLE acl_entries ADD CONSTRAINT FK_46C8B806DF9183C9 FOREIGN KEY (security_identity_id) REFERENCES acl_security_identities (id) ON UPDATE CASCADE ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATEPK�`�\(���
�
Fpear/Symfony/Component/Security/Resources/translations/security.cs.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Při ověřování došlo k chybě.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Ověřovací údaje nebyly nalezeny.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Požadavek na ověření nemohl být zpracován kvůli systémové chybě.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Neplatné přihlašovací údaje.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie již bylo použité někým jiným.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nemáte oprávnění přistupovat k prostředku.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Neplatný CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Platnost inicializačního vektoru (digest nonce) vypršela.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Poskytovatel pro ověřovací token nebyl nalezen.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Session není k dispozici, vypršela její platnost, nebo jsou zakázané cookies.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Token nebyl nalezen.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Přihlašovací jméno nebylo nalezeno.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Platnost účtu vypršela.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Platnost přihlašovacích údajů vypršela.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Účet je zakázaný.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Účet je zablokovaný.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�y��
�
Fpear/Symfony/Component/Security/Resources/translations/security.gl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ocorreu un erro de autenticación.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Non se atoparon as credenciais de autenticación.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>A solicitude de autenticación no puido ser procesada debido a un problema do sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credenciais non válidas.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>A cookie xa foi empregado por outro usuario.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Non ten privilexios para solicitar o recurso.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF non válido.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>O vector de inicialización (digest nonce) expirou.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Non se atopou un provedor de autenticación que soporte o token de autenticación.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Non hai ningunha sesión dispoñible, expirou ou as cookies non están habilitadas.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Non se atopou ningún token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Non se atopou o nome de usuario.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>A conta expirou.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>As credenciais expiraron.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>A conta está deshabilitada.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>A conta está bloqueada.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\UɎd
d
Fpear/Symfony/Component/Security/Resources/translations/security.sl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Prišlo je do izjeme pri preverjanju avtentikacije.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Poverilnic za avtentikacijo ni bilo mogoče najti.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Zahteve za avtentikacijo ni bilo mogoče izvesti zaradi sistemske težave.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Neveljavne pravice.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Piškotek je uporabil že nekdo drug.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nimate privilegijev za zahtevani vir.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Neveljaven CSRF žeton.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Začasni žeton je potekel.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Ponudnika avtentikacije za podporo prijavnega žetona ni bilo mogoče najti.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Seja ni na voljo, ali je potekla ali pa piškotki niso omogočeni.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Žetona ni bilo mogoče najti.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Uporabniškega imena ni bilo mogoče najti.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Račun je potekel.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Poverilnice so potekle.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Račun je onemogočen.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Račun je zaklenjen.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�w=���Fpear/Symfony/Component/Security/Resources/translations/security.ru.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ошибка аутентификации.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Аутентификационные данные не найдены.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Запрос аутентификации не может быть обработан в связи с проблемой в системе.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Недействительные аутентификационные данные.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie уже был использован кем-то другим.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Отсутствуют права на запрос этого ресурса.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Недействительный токен CSRF.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Время действия одноразового ключа дайджеста истекло.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Не найден провайдер аутентификации, поддерживающий токен аутентификации.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Сессия не найдена, ее время истекло, либо cookies не включены.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Токен не найден.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Имя пользователя не найдено.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Время действия учетной записи истекло.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Время действия аутентификационных данных истекло.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Учетная запись отключена.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Учетная запись заблокирована.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\YW��g
g
Kpear/Symfony/Component/Security/Resources/translations/security.sr_Latn.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Izuzetak pri autentifikaciji.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Autentifikacioni podaci nisu pronađeni.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Zahtev za autentifikaciju ne može biti obrađen zbog sistemskih problema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Nevalidni podaci za autentifikaciju.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Kolačić je već iskorišćen od strane nekog drugog.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nemate prava pristupa ovom resursu.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Nevalidan CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Vreme kriptografskog ključa je isteklo.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Autentifikacioni provajder za podršku tokena nije pronađen.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Sesija nije dostupna, istekla je ili su kolačići isključeni.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Token ne može biti pronađen.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Korisničko ime ne može biti pronađeno.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Nalog je istekao.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Podaci za autentifikaciju su istekli.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Nalog je onemogućen.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Nalog je zaključan.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\���Fpear/Symfony/Component/Security/Resources/translations/security.vi.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Có lỗi trong quá trình xác thực.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Thông tin dùng để xác thực không tìm thấy.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Yêu cầu xác thực không thể thực hiện do lỗi của hệ thống.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Thông tin dùng để xác thực không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie đã được dùng bởi người dùng khác.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Không được phép yêu cầu tài nguyên.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Mã CSRF không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Mã dùng một lần đã hết hạn.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Không tìm thấy nhà cung cấp dịch vụ xác thực nào cho mã xác thực mà bạn sử dụng.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Không tìm thấy phiên làm việc. Phiên làm việc hoặc cookie có thể bị tắt.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Không tìm thấy mã token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Không tìm thấy tên người dùng username.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Tài khoản đã hết hạn.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Thông tin xác thực đã hết hạn.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Tài khoản bị tạm ngừng.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Tài khoản bị khóa.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\Tk�f��Fpear/Symfony/Component/Security/Resources/translations/security.ar.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>حدث خطأ اثناء الدخول.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>لم استطع العثور على معلومات الدخول.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>لم يكتمل طلب الدخول نتيجه عطل فى النظام.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>معلومات الدخول خاطئة.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>ملفات تعريف الارتباط(cookies) تم استخدامها من قبل شخص اخر.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>ليست لديك الصلاحيات الكافية لهذا الطلب.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>رمز الموقع غير صحيح.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>انتهت صلاحية(digest nonce).</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>لا يوجد معرف للدخول يدعم الرمز المستخدم للدخول.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>لا يوجد صلة بينك و بين الموقع اما انها انتهت او ان متصفحك لا يدعم خاصية ملفات تعريف الارتباط (cookies).</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>لم استطع العثور على الرمز.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>لم استطع العثور على اسم الدخول.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>انتهت صلاحية الحساب.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>انتهت صلاحية معلومات الدخول.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>الحساب موقوف.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>الحساب مغلق.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�#@�y
y
Ipear/Symfony/Component/Security/Resources/translations/security.pt_PT.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ocorreu um excepção durante a autenticação.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>As credenciais de autenticação não foram encontradas.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>O pedido de autenticação não foi concluído devido a um problema no sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credenciais inválidas.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Este cookie já esta em uso.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Não possui privilégios para aceder a este recurso.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF inválido.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce expirado.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nenhum fornecedor de autenticação encontrado para suportar o token de autenticação.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Não existe sessão disponível, esta expirou ou os cookies estão desativados.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>O token não foi encontrado.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Nome de utilizador não encontrado.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>A conta expirou.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>As credenciais expiraram.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Conta desativada.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>A conta esta trancada.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\U����Fpear/Symfony/Component/Security/Resources/translations/security.el.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Συνέβη ένα σφάλμα πιστοποίησης.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Τα στοιχεία πιστοποίησης δε βρέθηκαν.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Το αίτημα πιστοποίησης δε μπορεί να επεξεργαστεί λόγω σφάλματος του συστήματος.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Λανθασμένα στοιχεία σύνδεσης.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Το Cookie έχει ήδη χρησιμοποιηθεί από κάποιον άλλο.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Δεν είστε εξουσιοδοτημένος για πρόσβαση στο συγκεκριμένο περιεχόμενο.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Μη έγκυρο CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Το digest nonce έχει λήξει.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Δε βρέθηκε κάποιος πάροχος πιστοποίησης που να υποστηρίζει το token πιστοποίησης.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Δεν υπάρχει ενεργή σύνοδος (session), είτε έχει λήξει ή τα cookies δεν είναι ενεργοποιημένα.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Δεν ήταν δυνατόν να βρεθεί κάποιο token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Το Username δε βρέθηκε.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Ο λογαριασμός έχει λήξει.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Τα στοιχεία σύνδεσης έχουν λήξει.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Ο λογαριασμός είναι απενεργοποιημένος.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Ο λογαριασμός είναι κλειδωμένος.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\���
�
Fpear/Symfony/Component/Security/Resources/translations/security.lb.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" target-language="lb" datatype="plaintext" original="security.en.xlf">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Bei der Authentifikatioun ass e Feeler opgetrueden.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Et konnte keng Zouganksdate fonnt ginn.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>D'Ufro fir eng Authentifikatioun konnt wéinst engem Problem vum System net beaarbecht ginn.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Ongëlteg Zouganksdaten.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>De Cookie gouf scho vun engem anere benotzt.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Keng Rechter fir d'Ressource unzefroen.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Ongëltegen CSRF-Token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Den eemolege Schlëssel ass ofgelaf.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Et gouf keen Authentifizéierungs-Provider fonnt deen den Authentifizéierungs-Token ënnerstëtzt.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Keng Sëtzung disponibel. Entweder ass se ofgelaf oder Cookies sinn net aktivéiert.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Et konnt keen Token fonnt ginn.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>De Benotzernumm konnt net fonnt ginn.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Den Account ass ofgelaf.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>D'Zouganksdate sinn ofgelaf.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>De Konto ass deaktivéiert.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>De Konto ass gespaart.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\���Y�
�
Ipear/Symfony/Component/Security/Resources/translations/security.pt_BR.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Uma exceção ocorreu durante a autenticação.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>As credenciais de autenticação não foram encontradas.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>A autenticação não pôde ser concluída devido a um problema no sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credenciais inválidas.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Este cookie já está em uso.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Não possui privilégios o bastante para requisitar este recurso.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF inválido.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce expirado.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nenhum provedor de autenticação encontrado para suportar o token de autenticação.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Nenhuma sessão disponível, ela expirou ou os cookies estão desativados.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Nenhum token foi encontrado.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Nome de usuário não encontrado.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>A conta está expirada.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>As credenciais estão expiradas.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Conta desativada.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>A conta está travada.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\.�X:
:
Fpear/Symfony/Component/Security/Resources/translations/security.en.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>An authentication exception occurred.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Authentication credentials could not be found.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Authentication request could not be processed due to a system problem.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Invalid credentials.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie has already been used by someone else.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Not privileged to request the resource.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Invalid CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce has expired.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>No authentication provider found to support the authentication token.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>No session available, it either timed out or cookies are not enabled.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>No token could be found.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Username could not be found.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Account has expired.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Credentials have expired.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Account is disabled.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Account is locked.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�p�U�
�
Fpear/Symfony/Component/Security/Resources/translations/security.nl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Er heeft zich een authenticatieprobleem voorgedaan.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Authenticatiegegevens konden niet worden gevonden.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Authenticatieaanvraag kon niet worden verwerkt door een technisch probleem.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Ongeldige inloggegevens.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie is al door een ander persoon gebruikt.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Onvoldoende rechten om de aanvraag te verwerken.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>CSRF-code is ongeldig.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Serverauthenticatiesleutel (digest nonce) is verlopen.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Geen authenticatieprovider gevonden die de authenticatietoken ondersteunt.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Geen sessie beschikbaar, mogelijk is deze verlopen of cookies zijn uitgeschakeld.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Er kon geen authenticatietoken worden gevonden.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Gebruikersnaam kon niet worden gevonden.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Account is verlopen.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Authenticatiegegevens zijn verlopen.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Account is gedeactiveerd.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Account is geblokkeerd.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\���ţ
�
Fpear/Symfony/Component/Security/Resources/translations/security.ca.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ha succeït un error d'autenticació.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>No s'han trobat les credencials d'autenticació.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>La solicitud d'autenticació no s'ha pogut processar per un problema del sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credencials no vàlides.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>La cookie ja ha estat utilitzada per una altra persona.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>No té privilegis per solicitar el recurs.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF no vàlid.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>El vector d'inicialització (digest nonce) ha expirat.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>No s'ha trobat un proveïdor d'autenticació que suporti el token d'autenticació.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>No hi ha sessió disponible, ha expirat o les cookies no estan habilitades.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>No s'ha trobat cap token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>No s'ha trobat el nom d'usuari.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>El compte ha expirat.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Les credencials han expirat.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>El compte està deshabilitat.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>El compte està bloquejat.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\d�e��
�
Fpear/Symfony/Component/Security/Resources/translations/security.fr.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Une exception d'authentification s'est produite.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Les droits d'authentification n'ont pas pu être trouvés.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>La requête d'authentification n'a pas pu être executée à cause d'un problème système.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Droits invalides.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Le cookie a déjà été utilisé par quelqu'un d'autre.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Pas de privilèges pour accéder à la ressource.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Jeton CSRF invalide.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Le digest nonce a expiré.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Aucun fournisseur d'authentification n'a été trouvé pour supporter le jeton d'authentification.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Pas de session disponible, celle-ci a expiré ou les cookies ne sont pas activés.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Aucun jeton n'a pu être trouvé.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Le nom d'utilisateur ne peut pas être trouvé.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Le compte a expiré.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Les droits ont expirés.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Le compte est désactivé.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Le compte est bloqué.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�)�
�
Fpear/Symfony/Component/Security/Resources/translations/security.ro.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>A apărut o eroare de autentificare.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Informațiile de autentificare nu au fost găsite.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Sistemul nu a putut procesa cererea de autentificare din cauza unei erori.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Date de autentificare invalide.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookieul este folosit deja de altcineva.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Permisiuni insuficiente pentru resursa cerută.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Tokenul CSRF este invalid.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Tokenul temporar a expirat.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nu a fost găsit nici un agent de autentificare pentru tokenul specificat.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Sesiunea nu mai este disponibilă, a expirat sau suportul pentru cookieuri nu este activat.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Tokenul nu a putut fi găsit.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Numele de utilizator nu a fost găsit.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Contul a expirat.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Datele de autentificare au expirat.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Contul este dezactivat.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Contul este blocat.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\O�
�
Fpear/Symfony/Component/Security/Resources/translations/security.it.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Si è verificato un errore di autenticazione.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Impossibile trovare le credenziali di autenticazione.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>La richiesta di autenticazione non può essere processata a causa di un errore di sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credenziali non valide.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Il cookie è già stato usato da qualcun altro.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Non hai i privilegi per richiedere questa risorsa.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>CSRF token non valido.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Il numero di autenticazione è scaduto.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Non è stato trovato un valido fornitore di autenticazione per supportare il token.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Nessuna sessione disponibile, può essere scaduta o i cookie non sono abilitati.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Nessun token trovato.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Username non trovato.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Account scaduto.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Credenziali scadute.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>L'account è disabilitato.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>L'account è bloccato.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�f488Fpear/Symfony/Component/Security/Resources/translations/security.ja.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>認証エラーが発生しました。</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>認証資格がありません。</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>システムの問題により認証要求を処理できませんでした。</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>資格が無効です。</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie が別のユーザーで使用されています。</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>リソースをリクエストする権限がありません。</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>CSRF トークンが無効です。</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest の nonce 値が期限切れです。</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>認証トークンをサポートする認証プロバイダーが見つかりません。</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>利用可能なセッションがありません。タイムアウトしたか、Cookie が無効になっています。</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>トークンが見つかりません。</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>ユーザー名が見つかりません。</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>アカウントが有効期限切れです。</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>資格が有効期限切れです。</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>アカウントが無効です。</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>アカウントはロックされています。</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�d
�
�
Fpear/Symfony/Component/Security/Resources/translations/security.pl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Wystąpił błąd uwierzytelniania.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Dane uwierzytelniania nie zostały znalezione.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Żądanie uwierzytelniania nie mogło zostać pomyślnie zakończone z powodu problemu z systemem.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Nieprawidłowe dane.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>To ciasteczko jest używane przez kogoś innego.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Brak uprawnień dla żądania wskazanego zasobu.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Nieprawidłowy token CSRF.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Kod dostępu wygasł.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nie znaleziono mechanizmu uwierzytelniania zdolnego do obsługi przesłanego tokenu.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Brak danych sesji, sesja wygasła lub ciasteczka nie są włączone.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Nie znaleziono tokenu.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Użytkownik o podanej nazwie nie istnieje.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Konto wygasło.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Dane uwierzytelniania wygasły.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Konto jest wyłączone.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Konto jest zablokowane.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\�R�wD
D
Fpear/Symfony/Component/Security/Resources/translations/security.id.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Terjadi sebuah pengecualian otentikasi.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Kredensial otentikasi tidak bisa ditemukan.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Permintaan otentikasi tidak bisa diproses karena masalah sistem.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Kredensial salah.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie sudah digunakan oleh orang lain.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Tidak berhak untuk meminta sumber daya.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF salah.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce telah berakhir.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Tidak ditemukan penyedia otentikasi untuk mendukung token otentikasi.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Tidak ada sesi yang tersedia, mungkin waktu sudah habis atau cookie tidak diaktifkan</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Tidak ada token yang bisa ditemukan.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Username tidak bisa ditemukan.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Akun telah berakhir.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Kredensial telah berakhir.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Akun dinonaktifkan.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Akun terkunci.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\���(SSFpear/Symfony/Component/Security/Resources/translations/security.bg.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Грешка при автентикация.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Удостоверението за автентикация не е открито.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Заявката за автентикация не може да бъде обработената поради системна грешка.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Невалидно удостоверение за автентикация.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Това cookie вече се ползва от някой друг.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Нямате права за достъп до този ресурс.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Невалиден CSRF токен.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce е изтекъл.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Не е открит провайдър, който да поддържа този токен за автентикация.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Сесията не е достъпна, или времето за достъп е изтекло, или кукитата не са разрешени.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Токена не е открит.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Потребителското име не е открито.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Акаунта е изтекъл.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Удостоверението за автентикация е изтекло.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Акаунта е деактивиран.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Акаунта е заключен.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\&MЎ�
�
Fpear/Symfony/Component/Security/Resources/translations/security.es.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ocurrió un error de autenticación.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>No se encontraron las credenciales de autenticación.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>La solicitud de autenticación no se pudo procesar debido a un problema del sistema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Credenciales no válidas.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>La cookie ya ha sido usada por otra persona.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>No tiene privilegios para solicitar el recurso.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Token CSRF no válido.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>El vector de inicialización (digest nonce) ha expirado.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>No se encontró un proveedor de autenticación que soporte el token de autenticación.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>No hay ninguna sesión disponible, ha expirado o las cookies no están habilitados.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>No se encontró ningún token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>No se encontró el nombre de usuario.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>La cuenta ha expirado.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Las credenciales han expirado.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>La cuenta está deshabilitada.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>La cuenta está bloqueada.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\m�|JJKpear/Symfony/Component/Security/Resources/translations/security.sr_Cyrl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Изузетак при аутентификацији.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Аутентификациони подаци нису пронађени.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Захтев за аутентификацију не може бити обрађен због системских проблема.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Невалидни подаци за аутентификацију.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Колачић је већ искоришћен од стране неког другог.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Немате права приступа овом ресурсу.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Невалидан CSRF токен.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Време криптографског кључа је истекло.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Аутентификациони провајдер за подршку токена није пронађен.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Сесија није доступна, истекла је или су колачићи искључени.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Токен не може бити пронађен.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Корисничко име не може бити пронађено.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Налог је истекао.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Подаци за аутентификацију су истекли.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Налог је онемогућен.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Налог је закључан.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\'���{
{
Fpear/Symfony/Component/Security/Resources/translations/security.tr.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Bir yetkilendirme istisnası oluştu.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Yetkilendirme girdileri bulunamadı.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Bir sistem hatası nedeniyle yetkilendirme isteği işleme alınamıyor.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Geçersiz girdiler.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Çerez bir başkası tarafından zaten kullanılmıştı.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Kaynak talebi için imtiyaz bulunamadı.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Geçersiz CSRF fişi.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Derleme zaman aşımı gerçekleşti.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Yetkilendirme fişini destekleyecek yetkilendirme sağlayıcısı bulunamadı.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Oturum bulunamadı, zaman aşımına uğradı veya çerezler etkin değil.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Bilet bulunamadı.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Kullanıcı adı bulunamadı.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Hesap zaman aşımına uğradı.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Girdiler zaman aşımına uğradı.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Hesap devre dışı bırakılmış.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Hesap kilitlenmiş.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\5�˙��Fpear/Symfony/Component/Security/Resources/translations/security.ua.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Помилка автентифікації.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Автентифікаційні дані не знайдено.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Запит на автентифікацію не може бути опрацьовано у зв’язку з проблемою в системі.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Невірні автентифікаційні дані.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Хтось інший вже використав цей сookie.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Відсутні права на запит цього ресурсу.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Невірний токен CSRF.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Закінчився термін дії одноразового ключа дайджесту.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Не знайдено провайдера автентифікації, що підтримує токен автентифікаціії.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Сесія недоступна, її час вийшов, або cookies вимкнено.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Токен не знайдено.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Ім’я користувача не знайдено.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Термін дії облікового запису вичерпано.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Термін дії автентифікаційних даних вичерпано.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Обліковий запис відключено.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Обліковий запис заблоковано.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\��u^
^
Fpear/Symfony/Component/Security/Resources/translations/security.sv.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Ett autentiseringsfel har inträffat.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Uppgifterna för autentisering kunde inte hittas.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Autentiseringen kunde inte genomföras på grund av systemfel.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Felaktiga uppgifter.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookien har redan använts av någon annan.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Saknar rättigheter för resursen.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Ogiltig CSRF-token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Förfallen digest nonce.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Ingen leverantör för autentisering hittades för angiven autentiseringstoken.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Ingen session finns tillgänglig, antingen har den förfallit eller är cookies inte aktiverat.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Ingen token kunde hittas.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Användarnamnet kunde inte hittas.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Kontot har förfallit.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Uppgifterna har förfallit.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Kontot är inaktiverat.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Kontot är låst.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\����
�
Fpear/Symfony/Component/Security/Resources/translations/security.no.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>En autentiserings feil har skjedd.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Påloggingsinformasjonen kunne ikke bli funnet.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Autentiserings forespørselen kunne ikke bli prosessert grunnet en system feil.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Ugyldig påloggingsinformasjonen.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie har allerede blitt brukt av noen andre.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Ingen tilgang til å be om gitt kilde.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Ugyldig CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce er utløpt.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Ingen autentiserings tilbyder funnet som støtter gitt autentiserings token.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Ingen sesjon tilgjengelig, sesjonen er enten utløpt eller cookies ikke skrudd på.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Ingen token kunne bli funnet.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Brukernavn kunne ikke bli funnet.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Brukerkonto har utgått.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Påloggingsinformasjon har utløpt.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Brukerkonto er deaktivert.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Brukerkonto er sperret.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\��|H�
�
Fpear/Symfony/Component/Security/Resources/translations/security.hu.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Hitelesítési hiba lépett fel.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Nem találhatók hitelesítési információk.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>A hitelesítési kérést rendszerhiba miatt nem lehet feldolgozni.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Érvénytelen hitelesítési információk.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Ezt a sütit valaki más már felhasználta.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nem rendelkezik az erőforrás eléréséhez szükséges jogosultsággal.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Érvénytelen CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>A kivonat bélyege (nonce) lejárt.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nem található a hitelesítési tokent támogató hitelesítési szolgáltatás.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Munkamenet nem áll rendelkezésre, túllépte az időkeretet vagy a sütik le vannak tiltva.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Nem található token.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>A felhasználónév nem található.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>A fiók lejárt.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>A hitelesítési információk lejártak.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Felfüggesztett fiók.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Zárolt fiók.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\o'�N�
�
Fpear/Symfony/Component/Security/Resources/translations/security.de.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Es ist ein Fehler bei der Authentifikation aufgetreten.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Es konnten keine Zugangsdaten gefunden werden.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Die Authentifikation konnte wegen eines Systemproblems nicht bearbeitet werden.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Fehlerhafte Zugangsdaten.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie wurde bereits von jemand anderem verwendet.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Keine Rechte, um die Ressource anzufragen.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Ungültiges CSRF-Token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce ist abgelaufen.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Es wurde kein Authentifizierungs-Provider gefunden, der das Authentifizierungs-Token unterstützt.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Keine Session verfügbar, entweder ist diese abgelaufen oder Cookies sind nicht aktiviert.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Es wurde kein Token gefunden.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Der Benutzername wurde nicht gefunden.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Der Account ist abgelaufen.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Die Zugangsdaten sind abgelaufen.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Der Account ist deaktiviert.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Der Account ist gesperrt.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\��Dt��Ipear/Symfony/Component/Security/Resources/translations/security.zh_CN.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>身份验证发生异常。</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>没有找到身份验证的凭证。</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>由于系统故障,身份验证的请求无法被处理。</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>无效的凭证。</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie 已经被其他人使用。</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>没有权限请求此资源。</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>无效的 CSRF token 。</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>摘要随机串(digest nonce)已过期。</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>没有找到支持此 token 的身份验证服务提供方。</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Session 不可用。会话超时或没有启用 cookies 。</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>找不到 token 。</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>找不到用户名。</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>帐号已过期。</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>凭证已过期。</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>帐号已被禁用。</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>帐号已被锁定。</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\��J
J
Fpear/Symfony/Component/Security/Resources/translations/security.da.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>En fejl indtraf ved godkendelse.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Loginoplysninger kan findes.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Godkendelsesanmodning kan ikke behandles på grund af et systemfejl.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Ugyldige loginoplysninger.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie er allerede brugt af en anden.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Ingen tilladselese at anvende kilden.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Ugyldigt CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce er udløbet.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Ingen godkendelsesudbyder er fundet til understøttelsen af godkendelsestoken.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Ingen session tilgængelig, sessionen er enten udløbet eller cookies er ikke aktiveret.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Ingen token kan findes.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Brugernavn kan ikke findes.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Brugerkonto er udløbet.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Loginoplysninger er udløbet.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Brugerkonto er deaktiveret.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Brugerkonto er låst.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\M-�@Fpear/Symfony/Component/Security/Resources/translations/security.fa.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>خطایی هنگام تعیین اعتبار اتفاق افتاد.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>شرایط تعیین اعتبار پیدا نشد.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>درخواست تعیین اعتبار به دلیل مشکل سیستم قابل بررسی نیست.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>شرایط نامعتبر.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>کوکی قبلا برای شخص دیگری استفاده شده است.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>دسترسی لازم برای درخواست این منبع را ندارید.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>توکن CSRF معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce منقضی شده است.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>هیچ ارایه کننده تعیین اعتباری برای ساپورت توکن تعیین اعتبار پیدا نشد.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>جلسه‌ای در دسترس نیست. این میتواند یا به دلیل پایان یافتن زمان باشد یا اینکه کوکی ها فعال نیستند.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>هیچ توکنی پیدا نشد.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>نام ‌کاربری پیدا نشد.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>حساب کاربری منقضی شده است.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>پارامترهای تعیین اعتبار منقضی شده‌اند.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>حساب کاربری غیرفعال است.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>حساب کاربری قفل شده است.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\]��W
W
Fpear/Symfony/Component/Security/Resources/translations/security.hr.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Dogodila se autentifikacijske iznimka.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Autentifikacijski podaci nisu pronađeni.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Autentifikacijski zahtjev nije moguće provesti uslijed sistemskog problema.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Neispravni akreditacijski podaci.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie je već netko drugi iskoristio.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nemate privilegije zahtijevati resurs.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Neispravan CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Digest nonce je isteko.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Nije pronađen autentifikacijski provider koji bi podržao autentifikacijski token.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Sesija nije dostupna, ili je istekla ili cookies nisu omogućeni.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Token nije pronađen.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Korisničko ime nije pronađeno.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Račun je isteko.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Akreditacijski podaci su istekli.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Račun je onemogućen.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Račun je zaključan.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\��ق
�
Fpear/Symfony/Component/Security/Resources/translations/security.sk.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>An authentication exception occurred.</source>
                <target>Pri overovaní došlo k chybe.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>Authentication credentials could not be found.</source>
                <target>Overovacie údaje neboli nájdené.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>Authentication request could not be processed due to a system problem.</source>
                <target>Požiadavok na overenie nemohol byť spracovaný kvôli systémovej chybe.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>Invalid credentials.</source>
                <target>Neplatné prihlasovacie údaje.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>Cookie has already been used by someone else.</source>
                <target>Cookie už bolo použité niekým iným.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>Not privileged to request the resource.</source>
                <target>Nemáte oprávnenie pristupovať k prostriedku.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>Invalid CSRF token.</source>
                <target>Neplatný CSRF token.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>Digest nonce has expired.</source>
                <target>Platnosť inicializačného vektoru (digest nonce) skončila.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>No authentication provider found to support the authentication token.</source>
                <target>Poskytovateľ pre overovací token nebol nájdený.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>No session available, it either timed out or cookies are not enabled.</source>
                <target>Session nie je k dispozíci, vypršala jej platnosť, alebo sú zakázané cookies.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>No token could be found.</source>
                <target>Token nebol nájdený.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>Username could not be found.</source>
                <target>Prihlasovacie meno nebolo nájdené.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>Account has expired.</source>
                <target>Platnosť účtu skončila.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>Credentials have expired.</source>
                <target>Platnosť prihlasovacích údajov skončila.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>Account is disabled.</source>
                <target>Účet je zakázaný.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>Account is locked.</source>
                <target>Účet je zablokovaný.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�`�\5����Jpear/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

/**
 * Formatter style interface for defining styles.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 *
 * @api
 */
interface OutputFormatterStyleInterface
{
    /**
     * Sets style foreground color.
     *
     * @param string $color The color name
     *
     * @api
     */
    public function setForeground($color = null);

    /**
     * Sets style background color.
     *
     * @param string $color The color name
     *
     * @api
     */
    public function setBackground($color = null);

    /**
     * Sets some specific style option.
     *
     * @param string $option The option name
     *
     * @api
     */
    public function setOption($option);

    /**
     * Unsets some specific style option.
     *
     * @param string $option The option name
     */
    public function unsetOption($option);

    /**
     * Sets multiple style options at once.
     *
     * @param array $options
     */
    public function setOptions(array $options);

    /**
     * Applies the style to a given text.
     *
     * @param string $text The text to style
     *
     * @return string
     */
    public function apply($text);
}
PK�`�\Jp����Epear/Symfony/Component/Console/Formatter/OutputFormatterInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

/**
 * Formatter interface for console output.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 *
 * @api
 */
interface OutputFormatterInterface
{
    /**
     * Sets the decorated flag.
     *
     * @param Boolean $decorated Whether to decorate the messages or not
     *
     * @api
     */
    public function setDecorated($decorated);

    /**
     * Gets the decorated flag.
     *
     * @return Boolean true if the output will decorate messages, false otherwise
     *
     * @api
     */
    public function isDecorated();

    /**
     * Sets a new style.
     *
     * @param string                        $name  The style name
     * @param OutputFormatterStyleInterface $style The style instance
     *
     * @api
     */
    public function setStyle($name, OutputFormatterStyleInterface $style);

    /**
     * Checks if output formatter has style with specified name.
     *
     * @param string $name
     *
     * @return Boolean
     *
     * @api
     */
    public function hasStyle($name);

    /**
     * Gets style options from style with specified name.
     *
     * @param string $name
     *
     * @return OutputFormatterStyleInterface
     *
     * @api
     */
    public function getStyle($name);

    /**
     * Formats a message according to the given styles.
     *
     * @param string $message The message to style
     *
     * @return string The styled message
     *
     * @api
     */
    public function format($message);
}
PK�`�\�v��
�
Fpear/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class OutputFormatterStyleStack
{
    /**
     * @var OutputFormatterStyleInterface[]
     */
    private $styles;

    /**
     * @var OutputFormatterStyleInterface
     */
    private $emptyStyle;

    /**
     * Constructor.
     *
     * @param OutputFormatterStyleInterface|null $emptyStyle
     */
    public function __construct(OutputFormatterStyleInterface $emptyStyle = null)
    {
        $this->emptyStyle = $emptyStyle ?: new OutputFormatterStyle();
        $this->reset();
    }

    /**
     * Resets stack (ie. empty internal arrays).
     */
    public function reset()
    {
        $this->styles = array();
    }

    /**
     * Pushes a style in the stack.
     *
     * @param OutputFormatterStyleInterface $style
     */
    public function push(OutputFormatterStyleInterface $style)
    {
        $this->styles[] = $style;
    }

    /**
     * Pops a style from the stack.
     *
     * @param OutputFormatterStyleInterface|null $style
     *
     * @return OutputFormatterStyleInterface
     *
     * @throws \InvalidArgumentException  When style tags incorrectly nested
     */
    public function pop(OutputFormatterStyleInterface $style = null)
    {
        if (empty($this->styles)) {
            return $this->emptyStyle;
        }

        if (null === $style) {
            return array_pop($this->styles);
        }

        foreach (array_reverse($this->styles, true) as $index => $stackedStyle) {
            if ($style->apply('') === $stackedStyle->apply('')) {
                $this->styles = array_slice($this->styles, 0, $index);

                return $stackedStyle;
            }
        }

        throw new \InvalidArgumentException('Incorrectly nested style tag found.');
    }

    /**
     * Computes current style with stacks top codes.
     *
     * @return OutputFormatterStyle
     */
    public function getCurrent()
    {
        if (empty($this->styles)) {
            return $this->emptyStyle;
        }

        return $this->styles[count($this->styles)-1];
    }

    /**
     * @param OutputFormatterStyleInterface $emptyStyle
     *
     * @return OutputFormatterStyleStack
     */
    public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle)
    {
        $this->emptyStyle = $emptyStyle;

        return $this;
    }

    /**
     * @return OutputFormatterStyleInterface
     */
    public function getEmptyStyle()
    {
        return $this->emptyStyle;
    }
}
PK�`�\��l���<pear/Symfony/Component/Console/Formatter/OutputFormatter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

/**
 * Formatter class for console output.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 *
 * @api
 */
class OutputFormatter implements OutputFormatterInterface
{
    private $decorated;
    private $styles = array();
    private $styleStack;

    /**
     * Escapes "<" special char in given text.
     *
     * @param string $text Text to escape
     *
     * @return string Escaped text
     */
    public static function escape($text)
    {
        return preg_replace('/([^\\\\]?)</is', '$1\\<', $text);
    }

    /**
     * Initializes console output formatter.
     *
     * @param Boolean          $decorated Whether this formatter should actually decorate strings
     * @param OutputFormatterStyleInterface[] $styles    Array of "name => FormatterStyle" instances
     *
     * @api
     */
    public function __construct($decorated = false, array $styles = array())
    {
        $this->decorated = (Boolean) $decorated;

        $this->setStyle('error', new OutputFormatterStyle('white', 'red'));
        $this->setStyle('info', new OutputFormatterStyle('green'));
        $this->setStyle('comment', new OutputFormatterStyle('yellow'));
        $this->setStyle('question', new OutputFormatterStyle('black', 'cyan'));

        foreach ($styles as $name => $style) {
            $this->setStyle($name, $style);
        }

        $this->styleStack = new OutputFormatterStyleStack();
    }

    /**
     * Sets the decorated flag.
     *
     * @param Boolean $decorated Whether to decorate the messages or not
     *
     * @api
     */
    public function setDecorated($decorated)
    {
        $this->decorated = (Boolean) $decorated;
    }

    /**
     * Gets the decorated flag.
     *
     * @return Boolean true if the output will decorate messages, false otherwise
     *
     * @api
     */
    public function isDecorated()
    {
        return $this->decorated;
    }

    /**
     * Sets a new style.
     *
     * @param string                        $name  The style name
     * @param OutputFormatterStyleInterface $style The style instance
     *
     * @api
     */
    public function setStyle($name, OutputFormatterStyleInterface $style)
    {
        $this->styles[strtolower($name)] = $style;
    }

    /**
     * Checks if output formatter has style with specified name.
     *
     * @param string $name
     *
     * @return Boolean
     *
     * @api
     */
    public function hasStyle($name)
    {
        return isset($this->styles[strtolower($name)]);
    }

    /**
     * Gets style options from style with specified name.
     *
     * @param string $name
     *
     * @return OutputFormatterStyleInterface
     *
     * @throws \InvalidArgumentException When style isn't defined
     *
     * @api
     */
    public function getStyle($name)
    {
        if (!$this->hasStyle($name)) {
            throw new \InvalidArgumentException(sprintf('Undefined style: %s', $name));
        }

        return $this->styles[strtolower($name)];
    }

    /**
     * Formats a message according to the given styles.
     *
     * @param string $message The message to style
     *
     * @return string The styled message
     *
     * @api
     */
    public function format($message)
    {
        $offset = 0;
        $output = '';
        $tagRegex = '[a-z][a-z0-9_=;-]*';
        preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#isx", $message, $matches, PREG_OFFSET_CAPTURE);
        foreach ($matches[0] as $i => $match) {
            $pos = $match[1];
            $text = $match[0];

            // add the text up to the next tag
            $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset));
            $offset = $pos + strlen($text);

            // opening tag?
            if ($open = '/' != $text[1]) {
                $tag = $matches[1][$i][0];
            } else {
                $tag = isset($matches[3][$i][0]) ? $matches[3][$i][0] : '';
            }

            if (!$open && !$tag) {
                // </>
                $this->styleStack->pop();
            } elseif ($pos && '\\' == $message[$pos - 1]) {
                // escaped tag
                $output .= $this->applyCurrentStyle($text);
            } elseif (false === $style = $this->createStyleFromString(strtolower($tag))) {
                $output .= $this->applyCurrentStyle($text);
            } elseif ($open) {
                $this->styleStack->push($style);
            } else {
                $this->styleStack->pop($style);
            }
        }

        $output .= $this->applyCurrentStyle(substr($message, $offset));

        return str_replace('\\<', '<', $output);
    }

    /**
     * @return OutputFormatterStyleStack
     */
    public function getStyleStack()
    {
        return $this->styleStack;
    }

    /**
     * Tries to create new style instance from string.
     *
     * @param string $string
     *
     * @return OutputFormatterStyle|Boolean false if string is not format string
     */
    private function createStyleFromString($string)
    {
        if (isset($this->styles[$string])) {
            return $this->styles[$string];
        }

        if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', strtolower($string), $matches, PREG_SET_ORDER)) {
            return false;
        }

        $style = new OutputFormatterStyle();
        foreach ($matches as $match) {
            array_shift($match);

            if ('fg' == $match[0]) {
                $style->setForeground($match[1]);
            } elseif ('bg' == $match[0]) {
                $style->setBackground($match[1]);
            } else {
                $style->setOption($match[1]);
            }
        }

        return $style;
    }

    /**
     * Applies current style from stack to text, if must be applied.
     *
     * @param string $text Input text
     *
     * @return string Styled text
     */
    private function applyCurrentStyle($text)
    {
        return $this->isDecorated() && strlen($text) > 0 ? $this->styleStack->getCurrent()->apply($text) : $text;
    }
}
PK�`�\onj�&&Apear/Symfony/Component/Console/Formatter/OutputFormatterStyle.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Formatter;

/**
 * Formatter style class for defining styles.
 *
 * @author Konstantin Kudryashov <ever.zet@gmail.com>
 *
 * @api
 */
class OutputFormatterStyle implements OutputFormatterStyleInterface
{
    private static $availableForegroundColors = array(
        'black'     => 30,
        'red'       => 31,
        'green'     => 32,
        'yellow'    => 33,
        'blue'      => 34,
        'magenta'   => 35,
        'cyan'      => 36,
        'white'     => 37
    );
    private static $availableBackgroundColors = array(
        'black'     => 40,
        'red'       => 41,
        'green'     => 42,
        'yellow'    => 43,
        'blue'      => 44,
        'magenta'   => 45,
        'cyan'      => 46,
        'white'     => 47
    );
    private static $availableOptions = array(
        'bold'          => 1,
        'underscore'    => 4,
        'blink'         => 5,
        'reverse'       => 7,
        'conceal'       => 8
    );

    private $foreground;
    private $background;
    private $options = array();

    /**
     * Initializes output formatter style.
     *
     * @param string|null $foreground The style foreground color name
     * @param string|null $background The style background color name
     * @param array       $options    The style options
     *
     * @api
     */
    public function __construct($foreground = null, $background = null, array $options = array())
    {
        if (null !== $foreground) {
            $this->setForeground($foreground);
        }
        if (null !== $background) {
            $this->setBackground($background);
        }
        if (count($options)) {
            $this->setOptions($options);
        }
    }

    /**
     * Sets style foreground color.
     *
     * @param string|null $color The color name
     *
     * @throws \InvalidArgumentException When the color name isn't defined
     *
     * @api
     */
    public function setForeground($color = null)
    {
        if (null === $color) {
            $this->foreground = null;

            return;
        }

        if (!isset(static::$availableForegroundColors[$color])) {
            throw new \InvalidArgumentException(sprintf(
                'Invalid foreground color specified: "%s". Expected one of (%s)',
                $color,
                implode(', ', array_keys(static::$availableForegroundColors))
            ));
        }

        $this->foreground = static::$availableForegroundColors[$color];
    }

    /**
     * Sets style background color.
     *
     * @param string|null $color The color name
     *
     * @throws \InvalidArgumentException When the color name isn't defined
     *
     * @api
     */
    public function setBackground($color = null)
    {
        if (null === $color) {
            $this->background = null;

            return;
        }

        if (!isset(static::$availableBackgroundColors[$color])) {
            throw new \InvalidArgumentException(sprintf(
                'Invalid background color specified: "%s". Expected one of (%s)',
                $color,
                implode(', ', array_keys(static::$availableBackgroundColors))
            ));
        }

        $this->background = static::$availableBackgroundColors[$color];
    }

    /**
     * Sets some specific style option.
     *
     * @param string $option The option name
     *
     * @throws \InvalidArgumentException When the option name isn't defined
     *
     * @api
     */
    public function setOption($option)
    {
        if (!isset(static::$availableOptions[$option])) {
            throw new \InvalidArgumentException(sprintf(
                'Invalid option specified: "%s". Expected one of (%s)',
                $option,
                implode(', ', array_keys(static::$availableOptions))
            ));
        }

        if (false === array_search(static::$availableOptions[$option], $this->options)) {
            $this->options[] = static::$availableOptions[$option];
        }
    }

    /**
     * Unsets some specific style option.
     *
     * @param string $option The option name
     *
     * @throws \InvalidArgumentException When the option name isn't defined
     *
     */
    public function unsetOption($option)
    {
        if (!isset(static::$availableOptions[$option])) {
            throw new \InvalidArgumentException(sprintf(
                'Invalid option specified: "%s". Expected one of (%s)',
                $option,
                implode(', ', array_keys(static::$availableOptions))
            ));
        }

        $pos = array_search(static::$availableOptions[$option], $this->options);
        if (false !== $pos) {
            unset($this->options[$pos]);
        }
    }

    /**
     * Sets multiple style options at once.
     *
     * @param array $options
     */
    public function setOptions(array $options)
    {
        $this->options = array();

        foreach ($options as $option) {
            $this->setOption($option);
        }
    }

    /**
     * Applies the style to a given text.
     *
     * @param string $text The text to style
     *
     * @return string
     */
    public function apply($text)
    {
        $codes = array();

        if (null !== $this->foreground) {
            $codes[] = $this->foreground;
        }
        if (null !== $this->background) {
            $codes[] = $this->background;
        }
        if (count($this->options)) {
            $codes = array_merge($codes, $this->options);
        }

        if (0 === count($codes)) {
            return $text;
        }

        return sprintf("\033[%sm%s\033[0m", implode(';', $codes), $text);
    }
}
PK�`�\�L�UҊҊ.pear/Symfony/Component/Console/Application.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

use Symfony\Component\Console\Descriptor\TextDescriptor;
use Symfony\Component\Console\Descriptor\XmlDescriptor;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputAwareInterface;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Command\HelpCommand;
use Symfony\Component\Console\Command\ListCommand;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Helper\FormatterHelper;
use Symfony\Component\Console\Helper\DialogHelper;
use Symfony\Component\Console\Helper\ProgressHelper;
use Symfony\Component\Console\Helper\TableHelper;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Event\ConsoleExceptionEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

/**
 * An Application is the container for a collection of commands.
 *
 * It is the main entry point of a Console application.
 *
 * This class is optimized for a standard CLI environment.
 *
 * Usage:
 *
 *     $app = new Application('myapp', '1.0 (stable)');
 *     $app->add(new SimpleCommand());
 *     $app->run();
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Application
{
    private $commands = array();
    private $wantHelps = false;
    private $runningCommand;
    private $name;
    private $version;
    private $catchExceptions = true;
    private $autoExit = true;
    private $definition;
    private $helperSet;
    private $dispatcher;
    private $terminalDimensions;

    /**
     * Constructor.
     *
     * @param string $name    The name of the application
     * @param string $version The version of the application
     *
     * @api
     */
    public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN')
    {
        $this->name = $name;
        $this->version = $version;
        $this->helperSet = $this->getDefaultHelperSet();
        $this->definition = $this->getDefaultInputDefinition();

        foreach ($this->getDefaultCommands() as $command) {
            $this->add($command);
        }
    }

    public function setDispatcher(EventDispatcherInterface $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }

    /**
     * Runs the current application.
     *
     * @param InputInterface  $input  An Input instance
     * @param OutputInterface $output An Output instance
     *
     * @return integer 0 if everything went fine, or an error code
     *
     * @throws \Exception When doRun returns Exception
     *
     * @api
     */
    public function run(InputInterface $input = null, OutputInterface $output = null)
    {
        if (null === $input) {
            $input = new ArgvInput();
        }

        if (null === $output) {
            $output = new ConsoleOutput();
        }

        $this->configureIO($input, $output);

        try {
            $exitCode = $this->doRun($input, $output);
        } catch (\Exception $e) {
            if (!$this->catchExceptions) {
                throw $e;
            }

            if ($output instanceof ConsoleOutputInterface) {
                $this->renderException($e, $output->getErrorOutput());
            } else {
                $this->renderException($e, $output);
            }

            $exitCode = $e->getCode();
            if (is_numeric($exitCode)) {
                $exitCode = (int) $exitCode;
                if (0 === $exitCode) {
                    $exitCode = 1;
                }
            } else {
                $exitCode = 1;
            }
        }

        if ($this->autoExit) {
            if ($exitCode > 255) {
                $exitCode = 255;
            }
            // @codeCoverageIgnoreStart
            exit($exitCode);
            // @codeCoverageIgnoreEnd
        }

        return $exitCode;
    }

    /**
     * Runs the current application.
     *
     * @param InputInterface  $input  An Input instance
     * @param OutputInterface $output An Output instance
     *
     * @return integer 0 if everything went fine, or an error code
     */
    public function doRun(InputInterface $input, OutputInterface $output)
    {
        if (true === $input->hasParameterOption(array('--version', '-V'))) {
            $output->writeln($this->getLongVersion());

            return 0;
        }

        $name = $this->getCommandName($input);
        if (true === $input->hasParameterOption(array('--help', '-h'))) {
            if (!$name) {
                $name = 'help';
                $input = new ArrayInput(array('command' => 'help'));
            } else {
                $this->wantHelps = true;
            }
        }

        if (!$name) {
            $name = 'list';
            $input = new ArrayInput(array('command' => 'list'));
        }

        // the command name MUST be the first element of the input
        $command = $this->find($name);

        $this->runningCommand = $command;
        $exitCode = $this->doRunCommand($command, $input, $output);
        $this->runningCommand = null;

        return $exitCode;
    }

    /**
     * Set a helper set to be used with the command.
     *
     * @param HelperSet $helperSet The helper set
     *
     * @api
     */
    public function setHelperSet(HelperSet $helperSet)
    {
        $this->helperSet = $helperSet;
    }

    /**
     * Get the helper set associated with the command.
     *
     * @return HelperSet The HelperSet instance associated with this command
     *
     * @api
     */
    public function getHelperSet()
    {
        return $this->helperSet;
    }

    /**
     * Set an input definition set to be used with this application
     *
     * @param InputDefinition $definition The input definition
     *
     * @api
     */
    public function setDefinition(InputDefinition $definition)
    {
        $this->definition = $definition;
    }

    /**
     * Gets the InputDefinition related to this Application.
     *
     * @return InputDefinition The InputDefinition instance
     */
    public function getDefinition()
    {
        return $this->definition;
    }

    /**
     * Gets the help message.
     *
     * @return string A help message.
     */
    public function getHelp()
    {
        $messages = array(
            $this->getLongVersion(),
            '',
            '<comment>Usage:</comment>',
            '  [options] command [arguments]',
            '',
            '<comment>Options:</comment>',
        );

        foreach ($this->getDefinition()->getOptions() as $option) {
            $messages[] = sprintf('  %-29s %s %s',
                '<info>--'.$option->getName().'</info>',
                $option->getShortcut() ? '<info>-'.$option->getShortcut().'</info>' : '  ',
                $option->getDescription()
            );
        }

        return implode(PHP_EOL, $messages);
    }

    /**
     * Sets whether to catch exceptions or not during commands execution.
     *
     * @param Boolean $boolean Whether to catch exceptions or not during commands execution
     *
     * @api
     */
    public function setCatchExceptions($boolean)
    {
        $this->catchExceptions = (Boolean) $boolean;
    }

    /**
     * Sets whether to automatically exit after a command execution or not.
     *
     * @param Boolean $boolean Whether to automatically exit after a command execution or not
     *
     * @api
     */
    public function setAutoExit($boolean)
    {
        $this->autoExit = (Boolean) $boolean;
    }

    /**
     * Gets the name of the application.
     *
     * @return string The application name
     *
     * @api
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Sets the application name.
     *
     * @param string $name The application name
     *
     * @api
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Gets the application version.
     *
     * @return string The application version
     *
     * @api
     */
    public function getVersion()
    {
        return $this->version;
    }

    /**
     * Sets the application version.
     *
     * @param string $version The application version
     *
     * @api
     */
    public function setVersion($version)
    {
        $this->version = $version;
    }

    /**
     * Returns the long version of the application.
     *
     * @return string The long application version
     *
     * @api
     */
    public function getLongVersion()
    {
        if ('UNKNOWN' !== $this->getName() && 'UNKNOWN' !== $this->getVersion()) {
            return sprintf('<info>%s</info> version <comment>%s</comment>', $this->getName(), $this->getVersion());
        }

        return '<info>Console Tool</info>';
    }

    /**
     * Registers a new command.
     *
     * @param string $name The command name
     *
     * @return Command The newly created command
     *
     * @api
     */
    public function register($name)
    {
        return $this->add(new Command($name));
    }

    /**
     * Adds an array of command objects.
     *
     * @param Command[] $commands An array of commands
     *
     * @api
     */
    public function addCommands(array $commands)
    {
        foreach ($commands as $command) {
            $this->add($command);
        }
    }

    /**
     * Adds a command object.
     *
     * If a command with the same name already exists, it will be overridden.
     *
     * @param Command $command A Command object
     *
     * @return Command The registered command
     *
     * @api
     */
    public function add(Command $command)
    {
        $command->setApplication($this);

        if (!$command->isEnabled()) {
            $command->setApplication(null);

            return;
        }

        if (null === $command->getDefinition()) {
            throw new \LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', get_class($command)));
        }

        $this->commands[$command->getName()] = $command;

        foreach ($command->getAliases() as $alias) {
            $this->commands[$alias] = $command;
        }

        return $command;
    }

    /**
     * Returns a registered command by name or alias.
     *
     * @param string $name The command name or alias
     *
     * @return Command A Command object
     *
     * @throws \InvalidArgumentException When command name given does not exist
     *
     * @api
     */
    public function get($name)
    {
        if (!isset($this->commands[$name])) {
            throw new \InvalidArgumentException(sprintf('The command "%s" does not exist.', $name));
        }

        $command = $this->commands[$name];

        if ($this->wantHelps) {
            $this->wantHelps = false;

            $helpCommand = $this->get('help');
            $helpCommand->setCommand($command);

            return $helpCommand;
        }

        return $command;
    }

    /**
     * Returns true if the command exists, false otherwise.
     *
     * @param string $name The command name or alias
     *
     * @return Boolean true if the command exists, false otherwise
     *
     * @api
     */
    public function has($name)
    {
        return isset($this->commands[$name]);
    }

    /**
     * Returns an array of all unique namespaces used by currently registered commands.
     *
     * It does not returns the global namespace which always exists.
     *
     * @return array An array of namespaces
     */
    public function getNamespaces()
    {
        $namespaces = array();
        foreach ($this->commands as $command) {
            $namespaces[] = $this->extractNamespace($command->getName());

            foreach ($command->getAliases() as $alias) {
                $namespaces[] = $this->extractNamespace($alias);
            }
        }

        return array_values(array_unique(array_filter($namespaces)));
    }

    /**
     * Finds a registered namespace by a name or an abbreviation.
     *
     * @param string $namespace A namespace or abbreviation to search for
     *
     * @return string A registered namespace
     *
     * @throws \InvalidArgumentException When namespace is incorrect or ambiguous
     */
    public function findNamespace($namespace)
    {
        $allNamespaces = $this->getNamespaces();
        $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $namespace);
        $namespaces = preg_grep('{^'.$expr.'}', $allNamespaces);

        if (empty($namespaces)) {
            $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace);

            if ($alternatives = $this->findAlternatives($namespace, $allNamespaces, array())) {
                if (1 == count($alternatives)) {
                    $message .= "\n\nDid you mean this?\n    ";
                } else {
                    $message .= "\n\nDid you mean one of these?\n    ";
                }

                $message .= implode("\n    ", $alternatives);
            }

            throw new \InvalidArgumentException($message);
        }

        $exact = in_array($namespace, $namespaces, true);
        if (count($namespaces) > 1 && !$exact) {
            throw new \InvalidArgumentException(sprintf('The namespace "%s" is ambiguous (%s).', $namespace, $this->getAbbreviationSuggestions(array_values($namespaces))));
        }

        return $exact ? $namespace : reset($namespaces);
    }

    /**
     * Finds a command by name or alias.
     *
     * Contrary to get, this command tries to find the best
     * match if you give it an abbreviation of a name or alias.
     *
     * @param string $name A command name or a command alias
     *
     * @return Command A Command instance
     *
     * @throws \InvalidArgumentException When command name is incorrect or ambiguous
     *
     * @api
     */
    public function find($name)
    {
        $allCommands = array_keys($this->commands);
        $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $name);
        $commands = preg_grep('{^'.$expr.'}', $allCommands);

        if (empty($commands) || count(preg_grep('{^'.$expr.'$}', $commands)) < 1) {
            if (false !== $pos = strrpos($name, ':')) {
                // check if a namespace exists and contains commands
                $this->findNamespace(substr($name, 0, $pos));
            }

            $message = sprintf('Command "%s" is not defined.', $name);

            if ($alternatives = $this->findAlternatives($name, $allCommands, array())) {
                if (1 == count($alternatives)) {
                    $message .= "\n\nDid you mean this?\n    ";
                } else {
                    $message .= "\n\nDid you mean one of these?\n    ";
                }
                $message .= implode("\n    ", $alternatives);
            }

            throw new \InvalidArgumentException($message);
        }

        // filter out aliases for commands which are already on the list
        if (count($commands) > 1) {
            $commandList = $this->commands;
            $commands = array_filter($commands, function ($nameOrAlias) use ($commandList, $commands) {
                $commandName = $commandList[$nameOrAlias]->getName();

                return $commandName === $nameOrAlias || !in_array($commandName, $commands);
            });
        }

        $exact = in_array($name, $commands, true);
        if (count($commands) > 1 && !$exact) {
            $suggestions = $this->getAbbreviationSuggestions(array_values($commands));

            throw new \InvalidArgumentException(sprintf('Command "%s" is ambiguous (%s).', $name, $suggestions));
        }

        return $this->get($exact ? $name : reset($commands));
    }

    /**
     * Gets the commands (registered in the given namespace if provided).
     *
     * The array keys are the full names and the values the command instances.
     *
     * @param string $namespace A namespace name
     *
     * @return Command[] An array of Command instances
     *
     * @api
     */
    public function all($namespace = null)
    {
        if (null === $namespace) {
            return $this->commands;
        }

        $commands = array();
        foreach ($this->commands as $name => $command) {
            if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) {
                $commands[$name] = $command;
            }
        }

        return $commands;
    }

    /**
     * Returns an array of possible abbreviations given a set of names.
     *
     * @param array $names An array of names
     *
     * @return array An array of abbreviations
     */
    public static function getAbbreviations($names)
    {
        $abbrevs = array();
        foreach ($names as $name) {
            for ($len = strlen($name); $len > 0; --$len) {
                $abbrev = substr($name, 0, $len);
                $abbrevs[$abbrev][] = $name;
            }
        }

        return $abbrevs;
    }

    /**
     * Returns a text representation of the Application.
     *
     * @param string  $namespace An optional namespace name
     * @param boolean $raw       Whether to return raw command list
     *
     * @return string A string representing the Application
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0.
     */
    public function asText($namespace = null, $raw = false)
    {
        $descriptor = new TextDescriptor();
        $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, !$raw);
        $descriptor->describe($output, $this, array('namespace' => $namespace, 'raw_output' => true));

        return $output->fetch();
    }

    /**
     * Returns an XML representation of the Application.
     *
     * @param string  $namespace An optional namespace name
     * @param Boolean $asDom     Whether to return a DOM or an XML string
     *
     * @return string|\DOMDocument An XML string representing the Application
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0.
     */
    public function asXml($namespace = null, $asDom = false)
    {
        $descriptor = new XmlDescriptor();

        if ($asDom) {
            return $descriptor->getApplicationDocument($this, $namespace);
        }

        $output = new BufferedOutput();
        $descriptor->describe($output, $this, array('namespace' => $namespace));

        return $output->fetch();
    }

    /**
     * Renders a caught exception.
     *
     * @param \Exception       $e      An exception instance
     * @param OutputInterface $output An OutputInterface instance
     */
    public function renderException($e, $output)
    {
        $strlen = function ($string) {
            if (!function_exists('mb_strlen')) {
                return strlen($string);
            }

            if (false === $encoding = mb_detect_encoding($string)) {
                return strlen($string);
            }

            return mb_strlen($string, $encoding);
        };

        do {
            $title = sprintf('  [%s]  ', get_class($e));
            $len = $strlen($title);
            // HHVM only accepts 32 bits integer in str_split, even when PHP_INT_MAX is a 64 bit integer: https://github.com/facebook/hhvm/issues/1327
            $width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : (defined('HHVM_VERSION') ? 1 << 31 : PHP_INT_MAX);
            $formatter = $output->getFormatter();
            $lines = array();
            foreach (preg_split('/\r?\n/', $e->getMessage()) as $line) {
                foreach (str_split($line, $width - 4) as $line) {
                    // pre-format lines to get the right string length
                    $lineLength = $strlen(preg_replace('/\[[^m]*m/', '', $formatter->format($line))) + 4;
                    $lines[] = array($line, $lineLength);

                    $len = max($lineLength, $len);
                }
            }

            $messages = array('', '');
            $messages[] = $emptyLine = $formatter->format(sprintf('<error>%s</error>', str_repeat(' ', $len)));
            $messages[] = $formatter->format(sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - $strlen($title)))));
            foreach ($lines as $line) {
                $messages[] = $formatter->format(sprintf('<error>  %s  %s</error>', $line[0], str_repeat(' ', $len - $line[1])));
            }
            $messages[] = $emptyLine;
            $messages[] = '';
            $messages[] = '';

            $output->writeln($messages, OutputInterface::OUTPUT_RAW);

            if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
                $output->writeln('<comment>Exception trace:</comment>');

                // exception related properties
                $trace = $e->getTrace();
                array_unshift($trace, array(
                    'function' => '',
                    'file'     => $e->getFile() != null ? $e->getFile() : 'n/a',
                    'line'     => $e->getLine() != null ? $e->getLine() : 'n/a',
                    'args'     => array(),
                ));

                for ($i = 0, $count = count($trace); $i < $count; $i++) {
                    $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';
                    $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';
                    $function = $trace[$i]['function'];
                    $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a';
                    $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a';

                    $output->writeln(sprintf(' %s%s%s() at <info>%s:%s</info>', $class, $type, $function, $file, $line));
                }

                $output->writeln("");
                $output->writeln("");
            }
        } while ($e = $e->getPrevious());

        if (null !== $this->runningCommand) {
            $output->writeln(sprintf('<info>%s</info>', sprintf($this->runningCommand->getSynopsis(), $this->getName())));
            $output->writeln("");
            $output->writeln("");
        }
    }

    /**
     * Tries to figure out the terminal width in which this application runs
     *
     * @return int|null
     */
    protected function getTerminalWidth()
    {
        $dimensions = $this->getTerminalDimensions();

        return $dimensions[0];
    }

    /**
     * Tries to figure out the terminal height in which this application runs
     *
     * @return int|null
     */
    protected function getTerminalHeight()
    {
        $dimensions = $this->getTerminalDimensions();

        return $dimensions[1];
    }

    /**
     * Tries to figure out the terminal dimensions based on the current environment
     *
     * @return array Array containing width and height
     */
    public function getTerminalDimensions()
    {
        if ($this->terminalDimensions) {
            return $this->terminalDimensions;
        }

        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            // extract [w, H] from "wxh (WxH)"
            if (preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim(getenv('ANSICON')), $matches)) {
                return array((int) $matches[1], (int) $matches[2]);
            }
            // extract [w, h] from "wxh"
            if (preg_match('/^(\d+)x(\d+)$/', $this->getConsoleMode(), $matches)) {
                return array((int) $matches[1], (int) $matches[2]);
            }
        }

        if ($sttyString = $this->getSttyColumns()) {
            // extract [w, h] from "rows h; columns w;"
            if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) {
                return array((int) $matches[2], (int) $matches[1]);
            }
            // extract [w, h] from "; h rows; w columns"
            if (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) {
                return array((int) $matches[2], (int) $matches[1]);
            }
        }

        return array(null, null);
    }

    /**
     * Sets terminal dimensions.
     *
     * Can be useful to force terminal dimensions for functional tests.
     *
     * @param integer $width  The width
     * @param integer $height The height
     *
     * @return Application The current application
     */
    public function setTerminalDimensions($width, $height)
    {
        $this->terminalDimensions = array($width, $height);

        return $this;
    }

    /**
     * Configures the input and output instances based on the user arguments and options.
     *
     * @param InputInterface  $input  An InputInterface instance
     * @param OutputInterface $output An OutputInterface instance
     */
    protected function configureIO(InputInterface $input, OutputInterface $output)
    {
        if (true === $input->hasParameterOption(array('--ansi'))) {
            $output->setDecorated(true);
        } elseif (true === $input->hasParameterOption(array('--no-ansi'))) {
            $output->setDecorated(false);
        }

        if (true === $input->hasParameterOption(array('--no-interaction', '-n'))) {
            $input->setInteractive(false);
        } elseif (function_exists('posix_isatty') && $this->getHelperSet()->has('dialog')) {
            $inputStream = $this->getHelperSet()->get('dialog')->getInputStream();
            if (!@posix_isatty($inputStream)) {
                $input->setInteractive(false);
            }
        }

        if (true === $input->hasParameterOption(array('--quiet', '-q'))) {
            $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
        } else {
            if ($input->hasParameterOption('-vvv') || $input->hasParameterOption('--verbose=3') || $input->getParameterOption('--verbose') === 3) {
                $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG);
            } elseif ($input->hasParameterOption('-vv') || $input->hasParameterOption('--verbose=2') || $input->getParameterOption('--verbose') === 2) {
                $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
            } elseif ($input->hasParameterOption('-v') || $input->hasParameterOption('--verbose=1') || $input->hasParameterOption('--verbose') || $input->getParameterOption('--verbose')) {
                $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE);
            }
        }
    }

    /**
     * Runs the current command.
     *
     * If an event dispatcher has been attached to the application,
     * events are also dispatched during the life-cycle of the command.
     *
     * @param Command         $command A Command instance
     * @param InputInterface  $input   An Input instance
     * @param OutputInterface $output  An Output instance
     *
     * @return integer 0 if everything went fine, or an error code
     */
    protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output)
    {
        foreach ($command->getHelperSet() as $helper) {
            if ($helper instanceof InputAwareInterface) {
                $helper->setInput($input);
            }
        }

        if (null === $this->dispatcher) {
            return $command->run($input, $output);
        }

        $event = new ConsoleCommandEvent($command, $input, $output);
        $this->dispatcher->dispatch(ConsoleEvents::COMMAND, $event);

        try {
            $exitCode = $command->run($input, $output);
        } catch (\Exception $e) {
            $event = new ConsoleTerminateEvent($command, $input, $output, $e->getCode());
            $this->dispatcher->dispatch(ConsoleEvents::TERMINATE, $event);

            $event = new ConsoleExceptionEvent($command, $input, $output, $e, $event->getExitCode());
            $this->dispatcher->dispatch(ConsoleEvents::EXCEPTION, $event);

            throw $event->getException();
        }

        $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode);
        $this->dispatcher->dispatch(ConsoleEvents::TERMINATE, $event);

        return $event->getExitCode();
    }

    /**
     * Gets the name of the command based on input.
     *
     * @param InputInterface $input The input interface
     *
     * @return string The command name
     */
    protected function getCommandName(InputInterface $input)
    {
        return $input->getFirstArgument();
    }

    /**
     * Gets the default input definition.
     *
     * @return InputDefinition An InputDefinition instance
     */
    protected function getDefaultInputDefinition()
    {
        return new InputDefinition(array(
            new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'),

            new InputOption('--help',           '-h', InputOption::VALUE_NONE, 'Display this help message.'),
            new InputOption('--quiet',          '-q', InputOption::VALUE_NONE, 'Do not output any message.'),
            new InputOption('--verbose',        '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'),
            new InputOption('--version',        '-V', InputOption::VALUE_NONE, 'Display this application version.'),
            new InputOption('--ansi',           '',   InputOption::VALUE_NONE, 'Force ANSI output.'),
            new InputOption('--no-ansi',        '',   InputOption::VALUE_NONE, 'Disable ANSI output.'),
            new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question.'),
        ));
    }

    /**
     * Gets the default commands that should always be available.
     *
     * @return Command[] An array of default Command instances
     */
    protected function getDefaultCommands()
    {
        return array(new HelpCommand(), new ListCommand());
    }

    /**
     * Gets the default helper set with the helpers that should always be available.
     *
     * @return HelperSet A HelperSet instance
     */
    protected function getDefaultHelperSet()
    {
        return new HelperSet(array(
            new FormatterHelper(),
            new DialogHelper(),
            new ProgressHelper(),
            new TableHelper(),
        ));
    }

    /**
     * Runs and parses stty -a if it's available, suppressing any error output
     *
     * @return string
     */
    private function getSttyColumns()
    {
        if (!function_exists('proc_open')) {
            return;
        }

        $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w'));
        $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, array('suppress_errors' => true));
        if (is_resource($process)) {
            $info = stream_get_contents($pipes[1]);
            fclose($pipes[1]);
            fclose($pipes[2]);
            proc_close($process);

            return $info;
        }
    }

    /**
     * Runs and parses mode CON if it's available, suppressing any error output
     *
     * @return string <width>x<height> or null if it could not be parsed
     */
    private function getConsoleMode()
    {
        if (!function_exists('proc_open')) {
            return;
        }

        $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w'));
        $process = proc_open('mode CON', $descriptorspec, $pipes, null, null, array('suppress_errors' => true));
        if (is_resource($process)) {
            $info = stream_get_contents($pipes[1]);
            fclose($pipes[1]);
            fclose($pipes[2]);
            proc_close($process);

            if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) {
                return $matches[2].'x'.$matches[1];
            }
        }
    }

    /**
     * Returns abbreviated suggestions in string format.
     *
     * @param array $abbrevs Abbreviated suggestions to convert
     *
     * @return string A formatted string of abbreviated suggestions
     */
    private function getAbbreviationSuggestions($abbrevs)
    {
        return sprintf('%s, %s%s', $abbrevs[0], $abbrevs[1], count($abbrevs) > 2 ? sprintf(' and %d more', count($abbrevs) - 2) : '');
    }

    /**
     * Returns the namespace part of the command name.
     *
     * This method is not part of public API and should not be used directly.
     *
     * @param string $name  The full name of the command
     * @param string $limit The maximum number of parts of the namespace
     *
     * @return string The namespace of the command
     */
    public function extractNamespace($name, $limit = null)
    {
        $parts = explode(':', $name);
        array_pop($parts);

        return implode(':', null === $limit ? $parts : array_slice($parts, 0, $limit));
    }

    /**
     * Finds alternative of $name among $collection,
     * if nothing is found in $collection, try in $abbrevs
     *
     * @param string               $name       The string
     * @param array|\Traversable   $collection The collection
     *
     * @return array A sorted array of similar string
     */
    private function findAlternatives($name, $collection)
    {
        $threshold = 1e3;
        $alternatives = array();

        $collectionParts = array();
        foreach ($collection as $item) {
            $collectionParts[$item] = explode(':', $item);
        }

        foreach (explode(':', $name) as $i => $subname) {
            foreach ($collectionParts as $collectionName => $parts) {
                $exists = isset($alternatives[$collectionName]);
                if (!isset($parts[$i]) && $exists) {
                    $alternatives[$collectionName] += $threshold;
                    continue;
                } elseif (!isset($parts[$i])) {
                    continue;
                }

                $lev = levenshtein($subname, $parts[$i]);
                if ($lev <= strlen($subname) / 3 || false !== strpos($parts[$i], $subname)) {
                    $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev;
                } elseif ($exists) {
                    $alternatives[$collectionName] += $threshold;
                }
            }
        }

        foreach ($collection as $item) {
            $lev = levenshtein($name, $item);
            if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) {
                $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev;
            }
        }

        $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2*$threshold; });
        asort($alternatives);

        return array_keys($alternatives);
    }
}
PK�`�\\0�E��0pear/Symfony/Component/Console/ConsoleEvents.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

/**
 * Contains all events dispatched by an Application.
 *
 * @author Francesco Levorato <git@flevour.net>
 */
final class ConsoleEvents
{
    /**
     * The COMMAND event allows you to attach listeners before any command is
     * executed by the console. It also allows you to modify the command, input and output
     * before they are handled to the command.
     *
     * The event listener method receives a Symfony\Component\Console\Event\ConsoleCommandEvent
     * instance.
     *
     * @var string
     */
    const COMMAND = 'console.command';

    /**
     * The TERMINATE event allows you to attach listeners after a command is
     * executed by the console.
     *
     * The event listener method receives a Symfony\Component\Console\Event\ConsoleTerminateEvent
     * instance.
     *
     * @var string
     */
    const TERMINATE = 'console.terminate';

    /**
     * The EXCEPTION event occurs when an uncaught exception appears.
     *
     * This event allows you to deal with the exception or
     * to modify the thrown exception. The event listener method receives
     * a Symfony\Component\Console\Event\ConsoleExceptionEvent
     * instance.
     *
     * @var string
     */
    const EXCEPTION = 'console.exception';
}
PK�`�\�.�QQ-pear/Symfony/Component/Console/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Console\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�`�\||-&��<pear/Symfony/Component/Console/Event/ConsoleCommandEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Event;

/**
 * Allows to do things before the command is executed.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ConsoleCommandEvent extends ConsoleEvent
{
}
PK�`�\s�KAA>pear/Symfony/Component/Console/Event/ConsoleExceptionEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Allows to handle exception thrown in a command.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ConsoleExceptionEvent extends ConsoleEvent
{
    private $exception;
    private $exitCode;

    public function __construct(Command $command, InputInterface $input, OutputInterface $output, \Exception $exception, $exitCode)
    {
        parent::__construct($command, $input, $output);

        $this->setException($exception);
        $this->exitCode = (int) $exitCode;
    }

    /**
     * Returns the thrown exception.
     *
     * @return \Exception The thrown exception
     */
    public function getException()
    {
        return $this->exception;
    }

    /**
     * Replaces the thrown exception.
     *
     * This exception will be thrown if no response is set in the event.
     *
     * @param \Exception $exception The thrown exception
     */
    public function setException(\Exception $exception)
    {
        $this->exception = $exception;
    }

    /**
     * Gets the exit code.
     *
     * @return integer The command exit code
     */
    public function getExitCode()
    {
        return $this->exitCode;
    }
}
PK�`�\��
���5pear/Symfony/Component/Console/Event/ConsoleEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\EventDispatcher\Event;

/**
 * Allows to inspect input and output of a command.
 *
 * @author Francesco Levorato <git@flevour.net>
 */
class ConsoleEvent extends Event
{
    protected $command;

    private $input;
    private $output;

    public function __construct(Command $command, InputInterface $input, OutputInterface $output)
    {
        $this->command = $command;
        $this->input = $input;
        $this->output = $output;
    }

    /**
     * Gets the command that is executed.
     *
     * @return Command A Command instance
     */
    public function getCommand()
    {
        return $this->command;
    }

    /**
     * Gets the input instance.
     *
     * @return InputInterface An InputInterface instance
     */
    public function getInput()
    {
        return $this->input;
    }

    /**
     * Gets the output instance.
     *
     * @return OutputInterface An OutputInterface instance
     */
    public function getOutput()
    {
        return $this->output;
    }
}
PK�`�\�Z��&&>pear/Symfony/Component/Console/Event/ConsoleTerminateEvent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Event;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Allows to manipulate the exit code of a command after its execution.
 *
 * @author Francesco Levorato <git@flevour.net>
 */
class ConsoleTerminateEvent extends ConsoleEvent
{
    /**
     * The exit code of the command.
     *
     * @var integer
     */
    private $exitCode;

    public function __construct(Command $command, InputInterface $input, OutputInterface $output, $exitCode)
    {
        parent::__construct($command, $input, $output);

        $this->setExitCode($exitCode);
    }

    /**
     * Sets the exit code.
     *
     * @param integer $exitCode The command exit code
     */
    public function setExitCode($exitCode)
    {
        $this->exitCode = (int) $exitCode;
    }

    /**
     * Gets the exit code.
     *
     * @return integer The command exit code
     */
    public function getExitCode()
    {
        return $this->exitCode;
    }
}
PK�`�\2V��(pear/Symfony/Component/Console/Shell.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Process\ProcessBuilder;
use Symfony\Component\Process\PhpExecutableFinder;

/**
 * A Shell wraps an Application to add shell capabilities to it.
 *
 * Support for history and completion only works with a PHP compiled
 * with readline support (either --with-readline or --with-libedit)
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Martin Hasoň <martin.hason@gmail.com>
 */
class Shell
{
    private $application;
    private $history;
    private $output;
    private $hasReadline;
    private $processIsolation = false;

    /**
     * Constructor.
     *
     * If there is no readline support for the current PHP executable
     * a \RuntimeException exception is thrown.
     *
     * @param Application $application An application instance
     */
    public function __construct(Application $application)
    {
        $this->hasReadline = function_exists('readline');
        $this->application = $application;
        $this->history = getenv('HOME').'/.history_'.$application->getName();
        $this->output = new ConsoleOutput();
    }

    /**
     * Runs the shell.
     */
    public function run()
    {
        $this->application->setAutoExit(false);
        $this->application->setCatchExceptions(true);

        if ($this->hasReadline) {
            readline_read_history($this->history);
            readline_completion_function(array($this, 'autocompleter'));
        }

        $this->output->writeln($this->getHeader());
        $php = null;
        if ($this->processIsolation) {
            $finder = new PhpExecutableFinder();
            $php = $finder->find();
            $this->output->writeln(<<<EOF
<info>Running with process isolation, you should consider this:</info>
  * each command is executed as separate process,
  * commands don't support interactivity, all params must be passed explicitly,
  * commands output is not colorized.

EOF
            );
        }

        while (true) {
            $command = $this->readline();

            if (false === $command) {
                $this->output->writeln("\n");

                break;
            }

            if ($this->hasReadline) {
                readline_add_history($command);
                readline_write_history($this->history);
            }

            if ($this->processIsolation) {
                $pb = new ProcessBuilder();

                $process = $pb
                    ->add($php)
                    ->add($_SERVER['argv'][0])
                    ->add($command)
                    ->inheritEnvironmentVariables(true)
                    ->getProcess()
                ;

                $output = $this->output;
                $process->run(function ($type, $data) use ($output) {
                    $output->writeln($data);
                });

                $ret = $process->getExitCode();
            } else {
                $ret = $this->application->run(new StringInput($command), $this->output);
            }

            if (0 !== $ret) {
                $this->output->writeln(sprintf('<error>The command terminated with an error status (%s)</error>', $ret));
            }
        }
    }

    /**
     * Returns the shell header.
     *
     * @return string The header string
     */
    protected function getHeader()
    {
        return <<<EOF

Welcome to the <info>{$this->application->getName()}</info> shell (<comment>{$this->application->getVersion()}</comment>).

At the prompt, type <comment>help</comment> for some help,
or <comment>list</comment> to get a list of available commands.

To exit the shell, type <comment>^D</comment>.

EOF;
    }

    /**
     * Renders a prompt.
     *
     * @return string The prompt
     */
    protected function getPrompt()
    {
        // using the formatter here is required when using readline
        return $this->output->getFormatter()->format($this->application->getName().' > ');
    }

    protected function getOutput()
    {
        return $this->output;
    }

    protected function getApplication()
    {
        return $this->application;
    }

    /**
     * Tries to return autocompletion for the current entered text.
     *
     * @param string $text The last segment of the entered text
     *
     * @return Boolean|array A list of guessed strings or true
     */
    private function autocompleter($text)
    {
        $info = readline_info();
        $text = substr($info['line_buffer'], 0, $info['end']);

        if ($info['point'] !== $info['end']) {
            return true;
        }

        // task name?
        if (false === strpos($text, ' ') || !$text) {
            return array_keys($this->application->all());
        }

        // options and arguments?
        try {
            $command = $this->application->find(substr($text, 0, strpos($text, ' ')));
        } catch (\Exception $e) {
            return true;
        }

        $list = array('--help');
        foreach ($command->getDefinition()->getOptions() as $option) {
            $list[] = '--'.$option->getName();
        }

        return $list;
    }

    /**
     * Reads a single line from standard input.
     *
     * @return string The single line from standard input
     */
    private function readline()
    {
        if ($this->hasReadline) {
            $line = readline($this->getPrompt());
        } else {
            $this->output->write($this->getPrompt());
            $line = fgets(STDIN, 1024);
            $line = (!$line && strlen($line) == 0) ? false : rtrim($line);
        }

        return $line;
    }

    public function getProcessIsolation()
    {
        return $this->processIsolation;
    }

    public function setProcessIsolation($processIsolation)
    {
        $this->processIsolation = (Boolean) $processIsolation;

        if ($this->processIsolation && !class_exists('Symfony\\Component\\Process\\Process')) {
            throw new \RuntimeException('Unable to isolate processes as the Symfony Process Component is not installed.');
        }
    }
}
PK�`�\s� H��:pear/Symfony/Component/Console/Helper/InputAwareHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputAwareInterface;

/**
 * An implementation of InputAwareInterface for Helpers.
 *
 * @author Wouter J <waldio.webdesign@gmail.com>
 */
abstract class InputAwareHelper extends Helper implements InputAwareInterface
{
    protected $input;

    /**
     * {@inheritDoc}
     */
    public function setInput(InputInterface $input)
    {
        $this->input = $input;
    }
}
PK�`�\g�se��9pear/Symfony/Component/Console/Helper/FormatterHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Formatter\OutputFormatter;

/**
 * The Formatter class provides helpers to format messages.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FormatterHelper extends Helper
{
    /**
     * Formats a message within a section.
     *
     * @param string $section The section name
     * @param string $message The message
     * @param string $style   The style to apply to the section
     *
     * @return string The format section
     */
    public function formatSection($section, $message, $style = 'info')
    {
        return sprintf('<%s>[%s]</%s> %s', $style, $section, $style, $message);
    }

    /**
     * Formats a message as a block of text.
     *
     * @param string|array $messages The message to write in the block
     * @param string       $style    The style to apply to the whole block
     * @param Boolean      $large    Whether to return a large block
     *
     * @return string The formatter message
     */
    public function formatBlock($messages, $style, $large = false)
    {
        $messages = (array) $messages;

        $len = 0;
        $lines = array();
        foreach ($messages as $message) {
            $message = OutputFormatter::escape($message);
            $lines[] = sprintf($large ? '  %s  ' : ' %s ', $message);
            $len = max($this->strlen($message) + ($large ? 4 : 2), $len);
        }

        $messages = $large ? array(str_repeat(' ', $len)) : array();
        foreach ($lines as $line) {
            $messages[] = $line.str_repeat(' ', $len - $this->strlen($line));
        }
        if ($large) {
            $messages[] = str_repeat(' ', $len);
        }

        foreach ($messages as &$message) {
            $message = sprintf('<%s>%s</%s>', $style, $message, $style);
        }

        return implode("\n", $messages);
    }

    /**
     * {@inheritDoc}
     */
    public function getName()
    {
        return 'formatter';
    }
}
PK�`�\|po.o.8pear/Symfony/Component/Console/Helper/ProgressHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Output\OutputInterface;

/**
 * The Progress class provides helpers to display progress output.
 *
 * @author Chris Jones <leeked@gmail.com>
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ProgressHelper extends Helper
{
    const FORMAT_QUIET         = ' %percent%%';
    const FORMAT_NORMAL        = ' %current%/%max% [%bar%] %percent%%';
    const FORMAT_VERBOSE       = ' %current%/%max% [%bar%] %percent%% Elapsed: %elapsed%';
    const FORMAT_QUIET_NOMAX   = ' %current%';
    const FORMAT_NORMAL_NOMAX  = ' %current% [%bar%]';
    const FORMAT_VERBOSE_NOMAX = ' %current% [%bar%] Elapsed: %elapsed%';

    // options
    private $barWidth     = 28;
    private $barChar      = '=';
    private $emptyBarChar = '-';
    private $progressChar = '>';
    private $format       = null;
    private $redrawFreq   = 1;

    private $lastMessagesLength;
    private $barCharOriginal;

    /**
     * @var OutputInterface
     */
    private $output;

    /**
     * Current step
     *
     * @var integer
     */
    private $current;

    /**
     * Maximum number of steps
     *
     * @var integer
     */
    private $max;

    /**
     * Start time of the progress bar
     *
     * @var integer
     */
    private $startTime;

    /**
     * List of formatting variables
     *
     * @var array
     */
    private $defaultFormatVars = array(
        'current',
        'max',
        'bar',
        'percent',
        'elapsed',
    );

    /**
     * Available formatting variables
     *
     * @var array
     */
    private $formatVars;

    /**
     * Stored format part widths (used for padding)
     *
     * @var array
     */
    private $widths = array(
        'current' => 4,
        'max'     => 4,
        'percent' => 3,
        'elapsed' => 6,
    );

    /**
     * Various time formats
     *
     * @var array
     */
    private $timeFormats = array(
        array(0, '???'),
        array(2, '1 sec'),
        array(59, 'secs', 1),
        array(60, '1 min'),
        array(3600, 'mins', 60),
        array(5400, '1 hr'),
        array(86400, 'hrs', 3600),
        array(129600, '1 day'),
        array(604800, 'days', 86400),
    );

    /**
     * Sets the progress bar width.
     *
     * @param int $size The progress bar size
     */
    public function setBarWidth($size)
    {
        $this->barWidth = (int) $size;
    }

    /**
     * Sets the bar character.
     *
     * @param string $char A character
     */
    public function setBarCharacter($char)
    {
        $this->barChar = $char;
    }

    /**
     * Sets the empty bar character.
     *
     * @param string $char A character
     */
    public function setEmptyBarCharacter($char)
    {
        $this->emptyBarChar = $char;
    }

    /**
     * Sets the progress bar character.
     *
     * @param string $char A character
     */
    public function setProgressCharacter($char)
    {
        $this->progressChar = $char;
    }

    /**
     * Sets the progress bar format.
     *
     * @param string $format The format
     */
    public function setFormat($format)
    {
        $this->format = $format;
    }

    /**
     * Sets the redraw frequency.
     *
     * @param int $freq The frequency in steps
     */
    public function setRedrawFrequency($freq)
    {
        $this->redrawFreq = (int) $freq;
    }

    /**
     * Starts the progress output.
     *
     * @param OutputInterface $output An Output instance
     * @param integer|null    $max    Maximum steps
     */
    public function start(OutputInterface $output, $max = null)
    {
        $this->startTime = time();
        $this->current   = 0;
        $this->max       = (int) $max;
        $this->output    = $output;
        $this->lastMessagesLength = 0;
        $this->barCharOriginal = '';

        if (null === $this->format) {
            switch ($output->getVerbosity()) {
                case OutputInterface::VERBOSITY_QUIET:
                    $this->format = self::FORMAT_QUIET_NOMAX;
                    if ($this->max > 0) {
                        $this->format = self::FORMAT_QUIET;
                    }
                    break;
                case OutputInterface::VERBOSITY_VERBOSE:
                case OutputInterface::VERBOSITY_VERY_VERBOSE:
                case OutputInterface::VERBOSITY_DEBUG:
                    $this->format = self::FORMAT_VERBOSE_NOMAX;
                    if ($this->max > 0) {
                        $this->format = self::FORMAT_VERBOSE;
                    }
                    break;
                default:
                    $this->format = self::FORMAT_NORMAL_NOMAX;
                    if ($this->max > 0) {
                        $this->format = self::FORMAT_NORMAL;
                    }
                    break;
            }
        }

        $this->initialize();
    }

    /**
     * Advances the progress output X steps.
     *
     * @param integer $step   Number of steps to advance
     * @param Boolean $redraw Whether to redraw or not
     *
     * @throws \LogicException
     */
    public function advance($step = 1, $redraw = false)
    {
        $this->setCurrent($this->current + $step, $redraw);
    }

    /**
     * Sets the current progress.
     *
     * @param integer $current The current progress
     * @param Boolean $redraw  Whether to redraw or not
     *
     * @throws \LogicException
     */
    public function setCurrent($current, $redraw = false)
    {
        if (null === $this->startTime) {
            throw new \LogicException('You must start the progress bar before calling setCurrent().');
        }

        $current = (int) $current;

        if ($current < $this->current) {
            throw new \LogicException('You can\'t regress the progress bar');
        }

        if (0 === $this->current) {
            $redraw = true;
        }

        $prevPeriod = intval($this->current / $this->redrawFreq);

        $this->current = $current;

        $currPeriod = intval($this->current / $this->redrawFreq);
        if ($redraw || $prevPeriod !== $currPeriod || $this->max === $this->current) {
            $this->display();
        }
    }

    /**
     * Outputs the current progress string.
     *
     * @param Boolean $finish Forces the end result
     *
     * @throws \LogicException
     */
    public function display($finish = false)
    {
        if (null === $this->startTime) {
            throw new \LogicException('You must start the progress bar before calling display().');
        }

        $message = $this->format;
        foreach ($this->generate($finish) as $name => $value) {
            $message = str_replace("%{$name}%", $value, $message);
        }
        $this->overwrite($this->output, $message);
    }

    /**
     * Removes the progress bar from the current line.
     *
     * This is useful if you wish to write some output
     * while a progress bar is running.
     * Call display() to show the progress bar again.
     */
    public function clear()
    {
        $this->overwrite($this->output, '');
    }

    /**
     * Finishes the progress output.
     */
    public function finish()
    {
        if (null === $this->startTime) {
            throw new \LogicException('You must start the progress bar before calling finish().');
        }

        if (null !== $this->startTime) {
            if (!$this->max) {
                $this->barChar = $this->barCharOriginal;
                $this->display(true);
            }
            $this->startTime = null;
            $this->output->writeln('');
            $this->output = null;
        }
    }

    /**
     * Initializes the progress helper.
     */
    private function initialize()
    {
        $this->formatVars = array();
        foreach ($this->defaultFormatVars as $var) {
            if (false !== strpos($this->format, "%{$var}%")) {
                $this->formatVars[$var] = true;
            }
        }

        if ($this->max > 0) {
            $this->widths['max']     = $this->strlen($this->max);
            $this->widths['current'] = $this->widths['max'];
        } else {
            $this->barCharOriginal = $this->barChar;
            $this->barChar         = $this->emptyBarChar;
        }
    }

    /**
     * Generates the array map of format variables to values.
     *
     * @param Boolean $finish Forces the end result
     *
     * @return array Array of format vars and values
     */
    private function generate($finish = false)
    {
        $vars    = array();
        $percent = 0;
        if ($this->max > 0) {
            $percent = (float) $this->current / $this->max;
        }

        if (isset($this->formatVars['bar'])) {
            $completeBars = 0;

            if ($this->max > 0) {
                $completeBars = floor($percent * $this->barWidth);
            } else {
                if (!$finish) {
                    $completeBars = floor($this->current % $this->barWidth);
                } else {
                    $completeBars = $this->barWidth;
                }
            }

            $emptyBars = $this->barWidth - $completeBars - $this->strlen($this->progressChar);
            $bar = str_repeat($this->barChar, $completeBars);
            if ($completeBars < $this->barWidth) {
                $bar .= $this->progressChar;
                $bar .= str_repeat($this->emptyBarChar, $emptyBars);
            }

            $vars['bar'] = $bar;
        }

        if (isset($this->formatVars['elapsed'])) {
            $elapsed = time() - $this->startTime;
            $vars['elapsed'] = str_pad($this->humaneTime($elapsed), $this->widths['elapsed'], ' ', STR_PAD_LEFT);
        }

        if (isset($this->formatVars['current'])) {
            $vars['current'] = str_pad($this->current, $this->widths['current'], ' ', STR_PAD_LEFT);
        }

        if (isset($this->formatVars['max'])) {
            $vars['max'] = $this->max;
        }

        if (isset($this->formatVars['percent'])) {
            $vars['percent'] = str_pad(floor($percent * 100), $this->widths['percent'], ' ', STR_PAD_LEFT);
        }

        return $vars;
    }

    /**
     * Converts seconds into human-readable format.
     *
     * @param integer $secs Number of seconds
     *
     * @return string Time in readable format
     */
    private function humaneTime($secs)
    {
        $text = '';
        foreach ($this->timeFormats as $format) {
            if ($secs < $format[0]) {
                if (count($format) == 2) {
                    $text = $format[1];
                    break;
                } else {
                    $text = ceil($secs / $format[2]).' '.$format[1];
                    break;
                }
            }
        }

        return $text;
    }

    /**
     * Overwrites a previous message to the output.
     *
     * @param OutputInterface $output   An Output instance
     * @param string          $message  The message
     */
    private function overwrite(OutputInterface $output, $message)
    {
        $length = $this->strlen($message);

        // append whitespace to match the last line's length
        if (null !== $this->lastMessagesLength && $this->lastMessagesLength > $length) {
            $message = str_pad($message, $this->lastMessagesLength, "\x20", STR_PAD_RIGHT);
        }

        // carriage return
        $output->write("\x0D");
        $output->write($message);

        $this->lastMessagesLength = $this->strlen($message);
    }

    /**
     * {@inheritDoc}
     */
    public function getName()
    {
        return 'progress';
    }
}
PK�`�\�z����9pear/Symfony/Component/Console/Helper/HelperInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

/**
 * HelperInterface is the interface all helpers must implement.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface HelperInterface
{
    /**
     * Sets the helper set associated with this helper.
     *
     * @param HelperSet $helperSet A HelperSet instance
     *
     * @api
     */
    public function setHelperSet(HelperSet $helperSet = null);

    /**
     * Gets the helper set associated with this helper.
     *
     * @return HelperSet A HelperSet instance
     *
     * @api
     */
    public function getHelperSet();

    /**
     * Returns the canonical name of this helper.
     *
     * @return string The canonical name
     *
     * @api
     */
    public function getName();
}
PK�`�\���	�	3pear/Symfony/Component/Console/Helper/HelperSet.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Command\Command;

/**
 * HelperSet represents a set of helpers to be used with a command.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class HelperSet implements \IteratorAggregate
{
    private $helpers = array();
    private $command;

    /**
     * Constructor.
     *
     * @param Helper[] $helpers An array of helper.
     */
    public function __construct(array $helpers = array())
    {
        foreach ($helpers as $alias => $helper) {
            $this->set($helper, is_int($alias) ? null : $alias);
        }
    }

    /**
     * Sets a helper.
     *
     * @param HelperInterface $helper The helper instance
     * @param string          $alias  An alias
     */
    public function set(HelperInterface $helper, $alias = null)
    {
        $this->helpers[$helper->getName()] = $helper;
        if (null !== $alias) {
            $this->helpers[$alias] = $helper;
        }

        $helper->setHelperSet($this);
    }

    /**
     * Returns true if the helper if defined.
     *
     * @param string $name The helper name
     *
     * @return Boolean true if the helper is defined, false otherwise
     */
    public function has($name)
    {
        return isset($this->helpers[$name]);
    }

    /**
     * Gets a helper value.
     *
     * @param string $name The helper name
     *
     * @return HelperInterface The helper instance
     *
     * @throws \InvalidArgumentException if the helper is not defined
     */
    public function get($name)
    {
        if (!$this->has($name)) {
            throw new \InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name));
        }

        return $this->helpers[$name];
    }

    /**
     * Sets the command associated with this helper set.
     *
     * @param Command $command A Command instance
     */
    public function setCommand(Command $command = null)
    {
        $this->command = $command;
    }

    /**
     * Gets the command associated with this helper set.
     *
     * @return Command A Command instance
     */
    public function getCommand()
    {
        return $this->command;
    }

    public function getIterator()
    {
        return new \ArrayIterator($this->helpers);
    }
}
PK�`�\Z\���0pear/Symfony/Component/Console/Helper/Helper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

/**
 * Helper is the base class for all helper classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Helper implements HelperInterface
{
    protected $helperSet = null;

    /**
     * Sets the helper set associated with this helper.
     *
     * @param HelperSet $helperSet A HelperSet instance
     */
    public function setHelperSet(HelperSet $helperSet = null)
    {
        $this->helperSet = $helperSet;
    }

    /**
     * Gets the helper set associated with this helper.
     *
     * @return HelperSet A HelperSet instance
     */
    public function getHelperSet()
    {
        return $this->helperSet;
    }

    /**
     * Returns the length of a string, using mb_strlen if it is available.
     *
     * @param string $string The string to check its length
     *
     * @return integer The length of the string
     */
    protected function strlen($string)
    {
        if (!function_exists('mb_strlen')) {
            return strlen($string);
        }

        if (false === $encoding = mb_detect_encoding($string)) {
            return strlen($string);
        }

        return mb_strlen($string, $encoding);
    }
}
PK�`�\��225pear/Symfony/Component/Console/Helper/TableHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Output\OutputInterface;
use InvalidArgumentException;

/**
 * Provides helpers to display table output.
 *
 * @author Саша Стаменковић <umpirsky@gmail.com>
 */
class TableHelper extends Helper
{
    const LAYOUT_DEFAULT = 0;
    const LAYOUT_BORDERLESS = 1;
    const LAYOUT_COMPACT = 2;

    /**
     * Table headers.
     *
     * @var array
     */
    private $headers = array();

    /**
     * Table rows.
     *
     * @var array
     */
    private $rows = array();

    // Rendering options
    private $paddingChar;
    private $horizontalBorderChar;
    private $verticalBorderChar;
    private $crossingChar;
    private $cellHeaderFormat;
    private $cellRowFormat;
    private $cellRowContentFormat;
    private $borderFormat;
    private $padType;

    /**
     * Column widths cache.
     *
     * @var array
     */
    private $columnWidths = array();

    /**
     * Number of columns cache.
     *
     * @var array
     */
    private $numberOfColumns;

    /**
     * @var OutputInterface
     */
    private $output;

    public function __construct()
    {
        $this->setLayout(self::LAYOUT_DEFAULT);
    }

    /**
     * Sets table layout type.
     *
     * @param int $layout self::LAYOUT_*
     *
     * @return TableHelper
     */
    public function setLayout($layout)
    {
        switch ($layout) {
            case self::LAYOUT_BORDERLESS:
                $this
                    ->setPaddingChar(' ')
                    ->setHorizontalBorderChar('=')
                    ->setVerticalBorderChar(' ')
                    ->setCrossingChar(' ')
                    ->setCellHeaderFormat('<info>%s</info>')
                    ->setCellRowFormat('%s')
                    ->setCellRowContentFormat(' %s ')
                    ->setBorderFormat('%s')
                    ->setPadType(STR_PAD_RIGHT)
                ;
                break;

            case self::LAYOUT_COMPACT:
                $this
                    ->setPaddingChar(' ')
                    ->setHorizontalBorderChar('')
                    ->setVerticalBorderChar(' ')
                    ->setCrossingChar('')
                    ->setCellHeaderFormat('<info>%s</info>')
                    ->setCellRowFormat('%s')
                    ->setCellRowContentFormat('%s')
                    ->setBorderFormat('%s')
                    ->setPadType(STR_PAD_RIGHT)
                ;
                break;

            case self::LAYOUT_DEFAULT:
                $this
                    ->setPaddingChar(' ')
                    ->setHorizontalBorderChar('-')
                    ->setVerticalBorderChar('|')
                    ->setCrossingChar('+')
                    ->setCellHeaderFormat('<info>%s</info>')
                    ->setCellRowFormat('%s')
                    ->setCellRowContentFormat(' %s ')
                    ->setBorderFormat('%s')
                    ->setPadType(STR_PAD_RIGHT)
                ;
                break;

            default:
                throw new InvalidArgumentException(sprintf('Invalid table layout "%s".', $layout));
                break;
        };

        return $this;
    }

    public function setHeaders(array $headers)
    {
        $this->headers = array_values($headers);

        return $this;
    }

    public function setRows(array $rows)
    {
        $this->rows = array();

        return $this->addRows($rows);
    }

    public function addRows(array $rows)
    {
        foreach ($rows as $row) {
            $this->addRow($row);
        }

        return $this;
    }

    public function addRow(array $row)
    {
        $this->rows[] = array_values($row);

        $keys = array_keys($this->rows);
        $rowKey = array_pop($keys);

        foreach ($row as $key => $cellValue) {
            if (!strstr($cellValue, "\n")) {
                continue;
            }

            $lines = explode("\n", $cellValue);
            $this->rows[$rowKey][$key] = $lines[0];
            unset($lines[0]);

            foreach ($lines as $lineKey => $line) {
                $nextRowKey = $rowKey + $lineKey + 1;

                if (isset($this->rows[$nextRowKey])) {
                    $this->rows[$nextRowKey][$key] = $line;
                } else {
                    $this->rows[$nextRowKey] = array($key => $line);
                }
            }
        }

        return $this;
    }

    public function setRow($column, array $row)
    {
        $this->rows[$column] = $row;

        return $this;
    }

    /**
     * Sets padding character, used for cell padding.
     *
     * @param string $paddingChar
     *
     * @return TableHelper
     */
    public function setPaddingChar($paddingChar)
    {
        if (!$paddingChar) {
            throw new \LogicException('The padding char must not be empty');
        }

        $this->paddingChar = $paddingChar;

        return $this;
    }

    /**
     * Sets horizontal border character.
     *
     * @param string $horizontalBorderChar
     *
     * @return TableHelper
     */
    public function setHorizontalBorderChar($horizontalBorderChar)
    {
        $this->horizontalBorderChar = $horizontalBorderChar;

        return $this;
    }

    /**
     * Sets vertical border character.
     *
     * @param string $verticalBorderChar
     *
     * @return TableHelper
     */
    public function setVerticalBorderChar($verticalBorderChar)
    {
        $this->verticalBorderChar = $verticalBorderChar;

        return $this;
    }

    /**
     * Sets crossing character.
     *
     * @param string $crossingChar
     *
     * @return TableHelper
     */
    public function setCrossingChar($crossingChar)
    {
        $this->crossingChar = $crossingChar;

        return $this;
    }

    /**
     * Sets header cell format.
     *
     * @param string $cellHeaderFormat
     *
     * @return TableHelper
     */
    public function setCellHeaderFormat($cellHeaderFormat)
    {
        $this->cellHeaderFormat = $cellHeaderFormat;

        return $this;
    }

    /**
     * Sets row cell format.
     *
     * @param string $cellRowFormat
     *
     * @return TableHelper
     */
    public function setCellRowFormat($cellRowFormat)
    {
        $this->cellRowFormat = $cellRowFormat;

        return $this;
    }

    /**
     * Sets row cell content format.
     *
     * @param string $cellRowContentFormat
     *
     * @return TableHelper
     */
    public function setCellRowContentFormat($cellRowContentFormat)
    {
        $this->cellRowContentFormat = $cellRowContentFormat;

        return $this;
    }

    /**
     * Sets table border format.
     *
     * @param string $borderFormat
     *
     * @return TableHelper
     */
    public function setBorderFormat($borderFormat)
    {
        $this->borderFormat = $borderFormat;

        return $this;
    }

    /**
     * Sets cell padding type.
     *
     * @param integer $padType STR_PAD_*
     *
     * @return TableHelper
     */
    public function setPadType($padType)
    {
        $this->padType = $padType;

        return $this;
    }

    /**
     * Renders table to output.
     *
     * Example:
     * +---------------+-----------------------+------------------+
     * | ISBN          | Title                 | Author           |
     * +---------------+-----------------------+------------------+
     * | 99921-58-10-7 | Divine Comedy         | Dante Alighieri  |
     * | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
     * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
     * +---------------+-----------------------+------------------+
     *
     * @param OutputInterface $output
     */
    public function render(OutputInterface $output)
    {
        $this->output = $output;

        $this->renderRowSeparator();
        $this->renderRow($this->headers, $this->cellHeaderFormat);
        if (!empty($this->headers)) {
            $this->renderRowSeparator();
        }
        foreach ($this->rows as $row) {
            $this->renderRow($row, $this->cellRowFormat);
        }
        if (!empty($this->rows)) {
            $this->renderRowSeparator();
        }

        $this->cleanup();
    }

    /**
     * Renders horizontal header separator.
     *
     * Example: +-----+-----------+-------+
     */
    private function renderRowSeparator()
    {
        if (0 === $count = $this->getNumberOfColumns()) {
            return;
        }

        if (!$this->horizontalBorderChar && !$this->crossingChar) {
            return;
        }

        $markup = $this->crossingChar;
        for ($column = 0; $column < $count; $column++) {
            $markup .= str_repeat($this->horizontalBorderChar, $this->getColumnWidth($column)).$this->crossingChar;
        }

        $this->output->writeln(sprintf($this->borderFormat, $markup));
    }

    /**
     * Renders vertical column separator.
     */
    private function renderColumnSeparator()
    {
        $this->output->write(sprintf($this->borderFormat, $this->verticalBorderChar));
    }

    /**
     * Renders table row.
     *
     * Example: | 9971-5-0210-0 | A Tale of Two Cities  | Charles Dickens  |
     *
     * @param array  $row
     * @param string $cellFormat
     */
    private function renderRow(array $row, $cellFormat)
    {
        if (empty($row)) {
            return;
        }

        $this->renderColumnSeparator();
        for ($column = 0, $count = $this->getNumberOfColumns(); $column < $count; $column++) {
            $this->renderCell($row, $column, $cellFormat);
            $this->renderColumnSeparator();
        }
        $this->output->writeln('');
    }

    /**
     * Renders table cell with padding.
     *
     * @param array   $row
     * @param integer $column
     * @param string  $cellFormat
     */
    private function renderCell(array $row, $column, $cellFormat)
    {
        $cell = isset($row[$column]) ? $row[$column] : '';
        $width = $this->getColumnWidth($column);

        // str_pad won't work properly with multi-byte strings, we need to fix the padding
        if (function_exists('mb_strlen') && false !== $encoding = mb_detect_encoding($cell)) {
            $width += strlen($cell) - mb_strlen($cell, $encoding);
        }

        $width += $this->strlen($cell) - $this->computeLengthWithoutDecoration($cell);

        $content = sprintf($this->cellRowContentFormat, $cell);

        $this->output->write(sprintf($cellFormat, str_pad($content, $width, $this->paddingChar, $this->padType)));
    }

    /**
     * Gets number of columns for this table.
     *
     * @return int
     */
    private function getNumberOfColumns()
    {
        if (null !== $this->numberOfColumns) {
            return $this->numberOfColumns;
        }

        $columns = array(0);
        $columns[] = count($this->headers);
        foreach ($this->rows as $row) {
            $columns[] = count($row);
        }

        return $this->numberOfColumns = max($columns);
    }

    /**
     * Gets column width.
     *
     * @param integer $column
     *
     * @return int
     */
    private function getColumnWidth($column)
    {
        if (isset($this->columnWidths[$column])) {
            return $this->columnWidths[$column];
        }

        $lengths = array(0);
        $lengths[] = $this->getCellWidth($this->headers, $column);
        foreach ($this->rows as $row) {
            $lengths[] = $this->getCellWidth($row, $column);
        }

        return $this->columnWidths[$column] = max($lengths) + strlen($this->cellRowContentFormat) - 2;
    }

    /**
     * Gets cell width.
     *
     * @param array   $row
     * @param integer $column
     *
     * @return int
     */
    private function getCellWidth(array $row, $column)
    {
        return isset($row[$column]) ? $this->computeLengthWithoutDecoration($row[$column]) : 0;
    }

    /**
     * Called after rendering to cleanup cache data.
     */
    private function cleanup()
    {
        $this->columnWidths = array();
        $this->numberOfColumns = null;
    }

    private function computeLengthWithoutDecoration($string)
    {
        $formatter = $this->output->getFormatter();
        $isDecorated = $formatter->isDecorated();
        $formatter->setDecorated(false);

        $string = $formatter->format($string);
        $formatter->setDecorated($isDecorated);

        return $this->strlen($string);
    }

    /**
     * {@inheritDoc}
     */
    public function getName()
    {
        return 'table';
    }
}
PK�`�\&�>@>@6pear/Symfony/Component/Console/Helper/DialogHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;

/**
 * The Dialog class provides helpers to interact with the user.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DialogHelper extends InputAwareHelper
{
    private $inputStream;
    private static $shell;
    private static $stty;

    /**
     * Asks the user to select a value.
     *
     * @param OutputInterface $output       An Output instance
     * @param string|array    $question     The question to ask
     * @param array           $choices      List of choices to pick from
     * @param Boolean|string  $default      The default answer if the user enters nothing
     * @param Boolean|integer $attempts Max number of times to ask before giving up (false by default, which means infinite)
     * @param string          $errorMessage Message which will be shown if invalid value from choice list would be picked
     * @param Boolean         $multiselect  Select more than one value separated by comma
     *
     * @return integer|string|array The selected value or values (the key of the choices array)
     *
     * @throws \InvalidArgumentException
     */
    public function select(OutputInterface $output, $question, $choices, $default = null, $attempts = false, $errorMessage = 'Value "%s" is invalid', $multiselect = false)
    {
        $width = max(array_map('strlen', array_keys($choices)));

        $messages = (array) $question;
        foreach ($choices as $key => $value) {
            $messages[] = sprintf("  [<info>%-${width}s</info>] %s", $key, $value);
        }

        $output->writeln($messages);

        $result = $this->askAndValidate($output, '> ', function ($picked) use ($choices, $errorMessage, $multiselect) {
            // Collapse all spaces.
            $selectedChoices = str_replace(" ", "", $picked);

            if ($multiselect) {
                // Check for a separated comma values
                if (!preg_match('/^[a-zA-Z0-9_-]+(?:,[a-zA-Z0-9_-]+)*$/', $selectedChoices, $matches)) {
                    throw new \InvalidArgumentException(sprintf($errorMessage, $picked));
                }
                $selectedChoices = explode(",", $selectedChoices);
            } else {
                $selectedChoices = array($picked);
            }

            $multiselectChoices = array();

            foreach ($selectedChoices as $value) {
                if (empty($choices[$value])) {
                    throw new \InvalidArgumentException(sprintf($errorMessage, $value));
                }
                array_push($multiselectChoices, $value);
            }

            if ($multiselect) {
                return $multiselectChoices;
            }

            return $picked;
        }, $attempts, $default);

        return $result;
    }

    /**
     * Asks a question to the user.
     *
     * @param OutputInterface $output       An Output instance
     * @param string|array    $question     The question to ask
     * @param string          $default      The default answer if none is given by the user
     * @param array           $autocomplete List of values to autocomplete
     *
     * @return string The user answer
     *
     * @throws \RuntimeException If there is no data to read in the input stream
     */
    public function ask(OutputInterface $output, $question, $default = null, array $autocomplete = null)
    {
        if ($this->input && !$this->input->isInteractive()) {
            return $default;
        }

        $output->write($question);

        $inputStream = $this->inputStream ?: STDIN;

        if (null === $autocomplete || !$this->hasSttyAvailable()) {
            $ret = fgets($inputStream, 4096);
            if (false === $ret) {
                throw new \RuntimeException('Aborted');
            }
            $ret = trim($ret);
        } else {
            $ret = '';

            $i = 0;
            $ofs = -1;
            $matches = $autocomplete;
            $numMatches = count($matches);

            $sttyMode = shell_exec('stty -g');

            // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead)
            shell_exec('stty -icanon -echo');

            // Add highlighted text style
            $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white'));

            // Read a keypress
            while (!feof($inputStream)) {
                $c = fread($inputStream, 1);

                // Backspace Character
                if ("\177" === $c) {
                    if (0 === $numMatches && 0 !== $i) {
                        $i--;
                        // Move cursor backwards
                        $output->write("\033[1D");
                    }

                    if ($i === 0) {
                        $ofs = -1;
                        $matches = $autocomplete;
                        $numMatches = count($matches);
                    } else {
                        $numMatches = 0;
                    }

                    // Pop the last character off the end of our string
                    $ret = substr($ret, 0, $i);
                } elseif ("\033" === $c) { // Did we read an escape sequence?
                    $c .= fread($inputStream, 2);

                    // A = Up Arrow. B = Down Arrow
                    if ('A' === $c[2] || 'B' === $c[2]) {
                        if ('A' === $c[2] && -1 === $ofs) {
                            $ofs = 0;
                        }

                        if (0 === $numMatches) {
                            continue;
                        }

                        $ofs += ('A' === $c[2]) ? -1 : 1;
                        $ofs = ($numMatches + $ofs) % $numMatches;
                    }
                } elseif (ord($c) < 32) {
                    if ("\t" === $c || "\n" === $c) {
                        if ($numMatches > 0 && -1 !== $ofs) {
                            $ret = $matches[$ofs];
                            // Echo out remaining chars for current match
                            $output->write(substr($ret, $i));
                            $i = strlen($ret);
                        }

                        if ("\n" === $c) {
                            $output->write($c);
                            break;
                        }

                        $numMatches = 0;
                    }

                    continue;
                } else {
                    $output->write($c);
                    $ret .= $c;
                    $i++;

                    $numMatches = 0;
                    $ofs = 0;

                    foreach ($autocomplete as $value) {
                        // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle)
                        if (0 === strpos($value, $ret) && $i !== strlen($value)) {
                            $matches[$numMatches++] = $value;
                        }
                    }
                }

                // Erase characters from cursor to end of line
                $output->write("\033[K");

                if ($numMatches > 0 && -1 !== $ofs) {
                    // Save cursor position
                    $output->write("\0337");
                    // Write highlighted text
                    $output->write('<hl>'.substr($matches[$ofs], $i).'</hl>');
                    // Restore cursor position
                    $output->write("\0338");
                }
            }

            // Reset stty so it behaves normally again
            shell_exec(sprintf('stty %s', $sttyMode));
        }

        return strlen($ret) > 0 ? $ret : $default;
    }

    /**
     * Asks a confirmation to the user.
     *
     * The question will be asked until the user answers by nothing, yes, or no.
     *
     * @param OutputInterface $output   An Output instance
     * @param string|array    $question The question to ask
     * @param Boolean         $default  The default answer if the user enters nothing
     *
     * @return Boolean true if the user has confirmed, false otherwise
     */
    public function askConfirmation(OutputInterface $output, $question, $default = true)
    {
        $answer = 'z';
        while ($answer && !in_array(strtolower($answer[0]), array('y', 'n'))) {
            $answer = $this->ask($output, $question);
        }

        if (false === $default) {
            return $answer && 'y' == strtolower($answer[0]);
        }

        return !$answer || 'y' == strtolower($answer[0]);
    }

    /**
     * Asks a question to the user, the response is hidden
     *
     * @param OutputInterface $output   An Output instance
     * @param string|array    $question The question
     * @param Boolean         $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not
     *
     * @return string         The answer
     *
     * @throws \RuntimeException In case the fallback is deactivated and the response can not be hidden
     */
    public function askHiddenResponse(OutputInterface $output, $question, $fallback = true)
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $exe = __DIR__.'/../Resources/bin/hiddeninput.exe';

            // handle code running from a phar
            if ('phar:' === substr(__FILE__, 0, 5)) {
                $tmpExe = sys_get_temp_dir().'/hiddeninput.exe';
                copy($exe, $tmpExe);
                $exe = $tmpExe;
            }

            $output->write($question);
            $value = rtrim(shell_exec($exe));
            $output->writeln('');

            if (isset($tmpExe)) {
                unlink($tmpExe);
            }

            return $value;
        }

        if ($this->hasSttyAvailable()) {
            $output->write($question);

            $sttyMode = shell_exec('stty -g');

            shell_exec('stty -echo');
            $value = fgets($this->inputStream ?: STDIN, 4096);
            shell_exec(sprintf('stty %s', $sttyMode));

            if (false === $value) {
                throw new \RuntimeException('Aborted');
            }

            $value = trim($value);
            $output->writeln('');

            return $value;
        }

        if (false !== $shell = $this->getShell()) {
            $output->write($question);
            $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword';
            $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd);
            $value = rtrim(shell_exec($command));
            $output->writeln('');

            return $value;
        }

        if ($fallback) {
            return $this->ask($output, $question);
        }

        throw new \RuntimeException('Unable to hide the response');
    }

    /**
     * Asks for a value and validates the response.
     *
     * The validator receives the data to validate. It must return the
     * validated data when the data is valid and throw an exception
     * otherwise.
     *
     * @param OutputInterface $output       An Output instance
     * @param string|array    $question     The question to ask
     * @param callable        $validator    A PHP callback
     * @param integer         $attempts     Max number of times to ask before giving up (false by default, which means infinite)
     * @param string          $default      The default answer if none is given by the user
     * @param array           $autocomplete List of values to autocomplete
     *
     * @return mixed
     *
     * @throws \Exception When any of the validators return an error
     */
    public function askAndValidate(OutputInterface $output, $question, $validator, $attempts = false, $default = null, array $autocomplete = null)
    {
        $that = $this;

        $interviewer = function () use ($output, $question, $default, $autocomplete, $that) {
            return $that->ask($output, $question, $default, $autocomplete);
        };

        return $this->validateAttempts($interviewer, $output, $validator, $attempts);
    }

    /**
     * Asks for a value, hide and validates the response.
     *
     * The validator receives the data to validate. It must return the
     * validated data when the data is valid and throw an exception
     * otherwise.
     *
     * @param OutputInterface $output    An Output instance
     * @param string|array    $question  The question to ask
     * @param callable        $validator A PHP callback
     * @param integer         $attempts  Max number of times to ask before giving up (false by default, which means infinite)
     * @param Boolean         $fallback  In case the response can not be hidden, whether to fallback on non-hidden question or not
     *
     * @return string         The response
     *
     * @throws \Exception        When any of the validators return an error
     * @throws \RuntimeException In case the fallback is deactivated and the response can not be hidden
     *
     */
    public function askHiddenResponseAndValidate(OutputInterface $output, $question, $validator, $attempts = false, $fallback = true)
    {
        $that = $this;

        $interviewer = function () use ($output, $question, $fallback, $that) {
            return $that->askHiddenResponse($output, $question, $fallback);
        };

        return $this->validateAttempts($interviewer, $output, $validator, $attempts);
    }

    /**
     * Sets the input stream to read from when interacting with the user.
     *
     * This is mainly useful for testing purpose.
     *
     * @param resource $stream The input stream
     */
    public function setInputStream($stream)
    {
        $this->inputStream = $stream;
    }

    /**
     * Returns the helper's input stream
     *
     * @return string
     */
    public function getInputStream()
    {
        return $this->inputStream;
    }

    /**
     * {@inheritDoc}
     */
    public function getName()
    {
        return 'dialog';
    }

    /**
     * Return a valid Unix shell
     *
     * @return string|Boolean  The valid shell name, false in case no valid shell is found
     */
    private function getShell()
    {
        if (null !== self::$shell) {
            return self::$shell;
        }

        self::$shell = false;

        if (file_exists('/usr/bin/env')) {
            // handle other OSs with bash/zsh/ksh/csh if available to hide the answer
            $test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null";
            foreach (array('bash', 'zsh', 'ksh', 'csh') as $sh) {
                if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) {
                    self::$shell = $sh;
                    break;
                }
            }
        }

        return self::$shell;
    }

    private function hasSttyAvailable()
    {
        if (null !== self::$stty) {
            return self::$stty;
        }

        exec('stty 2>&1', $output, $exitcode);

        return self::$stty = $exitcode === 0;
    }

    /**
     * Validate an attempt
     *
     * @param callable         $interviewer  A callable that will ask for a question and return the result
     * @param OutputInterface  $output       An Output instance
     * @param callable         $validator    A PHP callback
     * @param integer          $attempts     Max number of times to ask before giving up ; false will ask infinitely
     *
     * @return string   The validated response
     *
     * @throws \Exception In case the max number of attempts has been reached and no valid response has been given
     */
    private function validateAttempts($interviewer, OutputInterface $output, $validator, $attempts)
    {
        $error = null;
        while (false === $attempts || $attempts--) {
            if (null !== $error) {
                $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error'));
            }

            try {
                return call_user_func($validator, $interviewer());
            } catch (\Exception $error) {
            }
        }

        throw $error;
    }
}
PK�`�\"U�1

:pear/Symfony/Component/Console/Helper/DescriptorHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Helper;

use Symfony\Component\Console\Descriptor\DescriptorInterface;
use Symfony\Component\Console\Descriptor\JsonDescriptor;
use Symfony\Component\Console\Descriptor\MarkdownDescriptor;
use Symfony\Component\Console\Descriptor\TextDescriptor;
use Symfony\Component\Console\Descriptor\XmlDescriptor;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * This class adds helper method to describe objects in various formats.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class DescriptorHelper extends Helper
{
    /**
     * @var DescriptorInterface[]
     */
    private $descriptors = array();

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this
            ->register('txt',  new TextDescriptor())
            ->register('xml',  new XmlDescriptor())
            ->register('json', new JsonDescriptor())
            ->register('md',   new MarkdownDescriptor())
        ;
    }

    /**
     * Describes an object if supported.
     *
     * Available options are:
     * * format: string, the output format name
     * * raw_text: boolean, sets output type as raw
     *
     * @param OutputInterface $output
     * @param object          $object
     * @param array           $options
     *
     * @throws \InvalidArgumentException
     */
    public function describe(OutputInterface $output, $object, array $options = array())
    {
        $options = array_merge(array(
            'raw_text'  => false,
            'format'    => 'txt',
        ), $options);

        if (!isset($this->descriptors[$options['format']])) {
            throw new \InvalidArgumentException(sprintf('Unsupported format "%s".', $options['format']));
        }

        $descriptor = $this->descriptors[$options['format']];
        $descriptor->describe($output, $object, $options);
    }

    /**
     * Registers a descriptor.
     *
     * @param string              $format
     * @param DescriptorInterface $descriptor
     *
     * @return DescriptorHelper
     */
    public function register($format, DescriptorInterface $descriptor)
    {
        $this->descriptors[$format] = $descriptor;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'descriptor';
    }
}
PK�`�\�hr�f
f
;pear/Symfony/Component/Console/Tester/ApplicationTester.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tester;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\StreamOutput;

/**
 * Eases the testing of console applications.
 *
 * When testing an application, don't forget to disable the auto exit flag:
 *
 *     $application = new Application();
 *     $application->setAutoExit(false);
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ApplicationTester
{
    private $application;
    private $input;
    private $output;
    private $statusCode;

    /**
     * Constructor.
     *
     * @param Application $application An Application instance to test.
     */
    public function __construct(Application $application)
    {
        $this->application = $application;
    }

    /**
     * Executes the application.
     *
     * Available options:
     *
     *  * interactive: Sets the input interactive flag
     *  * decorated:   Sets the output decorated flag
     *  * verbosity:   Sets the output verbosity flag
     *
     * @param array $input   An array of arguments and options
     * @param array $options An array of options
     *
     * @return integer The command exit code
     */
    public function run(array $input, $options = array())
    {
        $this->input = new ArrayInput($input);
        if (isset($options['interactive'])) {
            $this->input->setInteractive($options['interactive']);
        }

        $this->output = new StreamOutput(fopen('php://memory', 'w', false));
        if (isset($options['decorated'])) {
            $this->output->setDecorated($options['decorated']);
        }
        if (isset($options['verbosity'])) {
            $this->output->setVerbosity($options['verbosity']);
        }

        return $this->statusCode = $this->application->run($this->input, $this->output);
    }

    /**
     * Gets the display returned by the last execution of the application.
     *
     * @param Boolean $normalize Whether to normalize end of lines to \n or not
     *
     * @return string The display
     */
    public function getDisplay($normalize = false)
    {
        rewind($this->output->getStream());

        $display = stream_get_contents($this->output->getStream());

        if ($normalize) {
            $display = str_replace(PHP_EOL, "\n", $display);
        }

        return $display;
    }

    /**
     * Gets the input instance used by the last execution of the application.
     *
     * @return InputInterface The current input instance
     */
    public function getInput()
    {
        return $this->input;
    }

    /**
     * Gets the output instance used by the last execution of the application.
     *
     * @return OutputInterface The current output instance
     */
    public function getOutput()
    {
        return $this->output;
    }

    /**
     * Gets the status code returned by the last execution of the application.
     *
     * @return integer The status code
     */
    public function getStatusCode()
    {
        return $this->statusCode;
    }
}
PK�`�\~H(R7pear/Symfony/Component/Console/Tester/CommandTester.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tester;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\StreamOutput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Eases the testing of console commands.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class CommandTester
{
    private $command;
    private $input;
    private $output;
    private $statusCode;

    /**
     * Constructor.
     *
     * @param Command $command A Command instance to test.
     */
    public function __construct(Command $command)
    {
        $this->command = $command;
    }

    /**
     * Executes the command.
     *
     * Available options:
     *
     *  * interactive: Sets the input interactive flag
     *  * decorated:   Sets the output decorated flag
     *  * verbosity:   Sets the output verbosity flag
     *
     * @param array $input   An array of arguments and options
     * @param array $options An array of options
     *
     * @return integer The command exit code
     */
    public function execute(array $input, array $options = array())
    {
        // set the command name automatically if the application requires
        // this argument and no command name was passed
        if (!isset($input['command'])
            && (null !== $application = $this->command->getApplication())
            && $application->getDefinition()->hasArgument('command')
        ) {
            $input['command'] = $this->command->getName();
        }

        $this->input = new ArrayInput($input);
        if (isset($options['interactive'])) {
            $this->input->setInteractive($options['interactive']);
        }

        $this->output = new StreamOutput(fopen('php://memory', 'w', false));
        if (isset($options['decorated'])) {
            $this->output->setDecorated($options['decorated']);
        }
        if (isset($options['verbosity'])) {
            $this->output->setVerbosity($options['verbosity']);
        }

        return $this->statusCode = $this->command->run($this->input, $this->output);
    }

    /**
     * Gets the display returned by the last execution of the command.
     *
     * @param Boolean $normalize Whether to normalize end of lines to \n or not
     *
     * @return string The display
     */
    public function getDisplay($normalize = false)
    {
        rewind($this->output->getStream());

        $display = stream_get_contents($this->output->getStream());

        if ($normalize) {
            $display = str_replace(PHP_EOL, "\n", $display);
        }

        return $display;
    }

    /**
     * Gets the input instance used by the last execution of the command.
     *
     * @return InputInterface The current input instance
     */
    public function getInput()
    {
        return $this->input;
    }

    /**
     * Gets the output instance used by the last execution of the command.
     *
     * @return OutputInterface The current output instance
     */
    public function getOutput()
    {
        return $this->output;
    }

    /**
     * Gets the status code returned by the last execution of the application.
     *
     * @return integer The status code
     */
    public function getStatusCode()
    {
        return $this->statusCode;
    }
}
PK�`�\�΂=�
�
4pear/Symfony/Component/Console/Input/StringInput.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

/**
 * StringInput represents an input provided as a string.
 *
 * Usage:
 *
 *     $input = new StringInput('foo --bar="foobar"');
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class StringInput extends ArgvInput
{
    const REGEX_STRING = '([^\s]+?)(?:\s|(?<!\\\\)"|(?<!\\\\)\'|$)';
    const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\')';

    /**
     * Constructor.
     *
     * @param string          $input      An array of parameters from the CLI (in the argv format)
     * @param InputDefinition $definition A InputDefinition instance
     *
     * @deprecated The second argument is deprecated as it does not work (will be removed in 3.0), use 'bind' method instead
     *
     * @api
     */
    public function __construct($input, InputDefinition $definition = null)
    {
        parent::__construct(array(), null);

        $this->setTokens($this->tokenize($input));

        if (null !== $definition) {
            $this->bind($definition);
        }
    }

    /**
     * Tokenizes a string.
     *
     * @param string $input The input to tokenize
     *
     * @return array An array of tokens
     *
     * @throws \InvalidArgumentException When unable to parse input (should never happen)
     */
    private function tokenize($input)
    {
        $tokens = array();
        $length = strlen($input);
        $cursor = 0;
        while ($cursor < $length) {
            if (preg_match('/\s+/A', $input, $match, null, $cursor)) {
            } elseif (preg_match('/([^="\'\s]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, null, $cursor)) {
                $tokens[] = $match[1].$match[2].stripcslashes(str_replace(array('"\'', '\'"', '\'\'', '""'), '', substr($match[3], 1, strlen($match[3]) - 2)));
            } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, null, $cursor)) {
                $tokens[] = stripcslashes(substr($match[0], 1, strlen($match[0]) - 2));
            } elseif (preg_match('/'.self::REGEX_STRING.'/A', $input, $match, null, $cursor)) {
                $tokens[] = stripcslashes($match[1]);
            } else {
                // should never happen
                // @codeCoverageIgnoreStart
                throw new \InvalidArgumentException(sprintf('Unable to parse input near "... %s ..."', substr($input, $cursor, 10)));
                // @codeCoverageIgnoreEnd
            }

            $cursor += strlen($match[0]);
        }

        return $tokens;
    }
}
PK�`�\�Q�)�)2pear/Symfony/Component/Console/Input/ArgvInput.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

/**
 * ArgvInput represents an input coming from the CLI arguments.
 *
 * Usage:
 *
 *     $input = new ArgvInput();
 *
 * By default, the `$_SERVER['argv']` array is used for the input values.
 *
 * This can be overridden by explicitly passing the input values in the constructor:
 *
 *     $input = new ArgvInput($_SERVER['argv']);
 *
 * If you pass it yourself, don't forget that the first element of the array
 * is the name of the running application.
 *
 * When passing an argument to the constructor, be sure that it respects
 * the same rules as the argv one. It's almost always better to use the
 * `StringInput` when you want to provide your own input.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @see    http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
 * @see    http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
 *
 * @api
 */
class ArgvInput extends Input
{
    private $tokens;
    private $parsed;

    /**
     * Constructor.
     *
     * @param array           $argv       An array of parameters from the CLI (in the argv format)
     * @param InputDefinition $definition A InputDefinition instance
     *
     * @api
     */
    public function __construct(array $argv = null, InputDefinition $definition = null)
    {
        if (null === $argv) {
            $argv = $_SERVER['argv'];
        }

        // strip the application name
        array_shift($argv);

        $this->tokens = $argv;

        parent::__construct($definition);
    }

    protected function setTokens(array $tokens)
    {
        $this->tokens = $tokens;
    }

    /**
     * Processes command line arguments.
     */
    protected function parse()
    {
        $parseOptions = true;
        $this->parsed = $this->tokens;
        while (null !== $token = array_shift($this->parsed)) {
            if ($parseOptions && '' == $token) {
                $this->parseArgument($token);
            } elseif ($parseOptions && '--' == $token) {
                $parseOptions = false;
            } elseif ($parseOptions && 0 === strpos($token, '--')) {
                $this->parseLongOption($token);
            } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) {
                $this->parseShortOption($token);
            } else {
                $this->parseArgument($token);
            }
        }
    }

    /**
     * Parses a short option.
     *
     * @param string $token The current token.
     */
    private function parseShortOption($token)
    {
        $name = substr($token, 1);

        if (strlen($name) > 1) {
            if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) {
                // an option with a value (with no space)
                $this->addShortOption($name[0], substr($name, 1));
            } else {
                $this->parseShortOptionSet($name);
            }
        } else {
            $this->addShortOption($name, null);
        }
    }

    /**
     * Parses a short option set.
     *
     * @param string $name The current token
     *
     * @throws \RuntimeException When option given doesn't exist
     */
    private function parseShortOptionSet($name)
    {
        $len = strlen($name);
        for ($i = 0; $i < $len; $i++) {
            if (!$this->definition->hasShortcut($name[$i])) {
                throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $name[$i]));
            }

            $option = $this->definition->getOptionForShortcut($name[$i]);
            if ($option->acceptValue()) {
                $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1));

                break;
            } else {
                $this->addLongOption($option->getName(), null);
            }
        }
    }

    /**
     * Parses a long option.
     *
     * @param string $token The current token
     */
    private function parseLongOption($token)
    {
        $name = substr($token, 2);

        if (false !== $pos = strpos($name, '=')) {
            $this->addLongOption(substr($name, 0, $pos), substr($name, $pos + 1));
        } else {
            $this->addLongOption($name, null);
        }
    }

    /**
     * Parses an argument.
     *
     * @param string $token The current token
     *
     * @throws \RuntimeException When too many arguments are given
     */
    private function parseArgument($token)
    {
        $c = count($this->arguments);

        // if input is expecting another argument, add it
        if ($this->definition->hasArgument($c)) {
            $arg = $this->definition->getArgument($c);
            $this->arguments[$arg->getName()] = $arg->isArray()? array($token) : $token;

        // if last argument isArray(), append token to last argument
        } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) {
            $arg = $this->definition->getArgument($c - 1);
            $this->arguments[$arg->getName()][] = $token;

        // unexpected argument
        } else {
            throw new \RuntimeException('Too many arguments.');
        }
    }

    /**
     * Adds a short option value.
     *
     * @param string $shortcut The short option key
     * @param mixed  $value    The value for the option
     *
     * @throws \RuntimeException When option given doesn't exist
     */
    private function addShortOption($shortcut, $value)
    {
        if (!$this->definition->hasShortcut($shortcut)) {
            throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut));
        }

        $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
    }

    /**
     * Adds a long option value.
     *
     * @param string $name  The long option key
     * @param mixed  $value The value for the option
     *
     * @throws \RuntimeException When option given doesn't exist
     */
    private function addLongOption($name, $value)
    {
        if (!$this->definition->hasOption($name)) {
            throw new \RuntimeException(sprintf('The "--%s" option does not exist.', $name));
        }

        $option = $this->definition->getOption($name);

        // Convert false values (from a previous call to substr()) to null
        if (false === $value) {
            $value = null;
        }

        if (null !== $value && !$option->acceptValue()) {
            throw new \RuntimeException(sprintf('The "--%s" option does not accept a value.', $name, $value));
        }

        if (null === $value && $option->acceptValue() && count($this->parsed)) {
            // if option accepts an optional or mandatory argument
            // let's see if there is one provided
            $next = array_shift($this->parsed);
            if (isset($next[0]) && '-' !== $next[0]) {
                $value = $next;
            } elseif (empty($next)) {
                $value = '';
            } else {
                array_unshift($this->parsed, $next);
            }
        }

        if (null === $value) {
            if ($option->isValueRequired()) {
                throw new \RuntimeException(sprintf('The "--%s" option requires a value.', $name));
            }

            if (!$option->isArray()) {
                $value = $option->isValueOptional() ? $option->getDefault() : true;
            }
        }

        if ($option->isArray()) {
            $this->options[$name][] = $value;
        } else {
            $this->options[$name] = $value;
        }
    }

    /**
     * Returns the first argument from the raw parameters (not parsed).
     *
     * @return string The value of the first argument or null otherwise
     */
    public function getFirstArgument()
    {
        foreach ($this->tokens as $token) {
            if ($token && '-' === $token[0]) {
                continue;
            }

            return $token;
        }
    }

    /**
     * Returns true if the raw parameters (not parsed) contain a value.
     *
     * This method is to be used to introspect the input parameters
     * before they have been validated. It must be used carefully.
     *
     * @param string|array $values The value(s) to look for in the raw parameters (can be an array)
     *
     * @return Boolean true if the value is contained in the raw parameters
     */
    public function hasParameterOption($values)
    {
        $values = (array) $values;

        foreach ($this->tokens as $token) {
            foreach ($values as $value) {
                if ($token === $value || 0 === strpos($token, $value.'=')) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Returns the value of a raw option (not parsed).
     *
     * This method is to be used to introspect the input parameters
     * before they have been validated. It must be used carefully.
     *
     * @param string|array $values  The value(s) to look for in the raw parameters (can be an array)
     * @param mixed        $default The default value to return if no result is found
     *
     * @return mixed The option value
     */
    public function getParameterOption($values, $default = false)
    {
        $values = (array) $values;

        $tokens = $this->tokens;
        while ($token = array_shift($tokens)) {
            foreach ($values as $value) {
                if ($token === $value || 0 === strpos($token, $value.'=')) {
                    if (false !== $pos = strpos($token, '=')) {
                        return substr($token, $pos + 1);
                    }

                    return array_shift($tokens);
                }
            }
        }

        return $default;
    }

    /**
     * Returns a stringified representation of the args passed to the command
     *
     * @return string
     */
    public function __toString()
    {
        $self = $this;
        $tokens = array_map(function ($token) use ($self) {
            if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) {
                return $match[1] . $self->escapeToken($match[2]);
            }

            if ($token && $token[0] !== '-') {
                return $self->escapeToken($token);
            }

            return $token;
        }, $this->tokens);

        return implode(' ', $tokens);
    }
}
PK�`�\9K�h^^<pear/Symfony/Component/Console/Input/InputAwareInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

/**
 * InputAwareInterface should be implemented by classes that depends on the
 * Console Input.
 *
 * @author Wouter J <waldio.webdesign@gmail.com>
 */
interface InputAwareInterface
{
    /**
     * Sets the Console Input.
     *
     * @param InputInterface
     */
    public function setInput(InputInterface $input);
}
PK�`�\��O�VV4pear/Symfony/Component/Console/Input/InputOption.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

/**
 * Represents a command line option.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class InputOption
{
    const VALUE_NONE     = 1;
    const VALUE_REQUIRED = 2;
    const VALUE_OPTIONAL = 4;
    const VALUE_IS_ARRAY = 8;

    private $name;
    private $shortcut;
    private $mode;
    private $default;
    private $description;

    /**
     * Constructor.
     *
     * @param string       $name        The option name
     * @param string|array $shortcut    The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
     * @param integer      $mode        The option mode: One of the VALUE_* constants
     * @param string       $description A description text
     * @param mixed        $default     The default value (must be null for self::VALUE_REQUIRED or self::VALUE_NONE)
     *
     * @throws \InvalidArgumentException If option mode is invalid or incompatible
     *
     * @api
     */
    public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null)
    {
        if (0 === strpos($name, '--')) {
            $name = substr($name, 2);
        }

        if (empty($name)) {
            throw new \InvalidArgumentException('An option name cannot be empty.');
        }

        if (empty($shortcut)) {
            $shortcut = null;
        }

        if (null !== $shortcut) {
            if (is_array($shortcut)) {
                $shortcut = implode('|', $shortcut);
            }
            $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-'));
            $shortcuts = array_filter($shortcuts);
            $shortcut = implode('|', $shortcuts);

            if (empty($shortcut)) {
                throw new \InvalidArgumentException('An option shortcut cannot be empty.');
            }
        }

        if (null === $mode) {
            $mode = self::VALUE_NONE;
        } elseif (!is_int($mode) || $mode > 15 || $mode < 1) {
            throw new \InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode));
        }

        $this->name        = $name;
        $this->shortcut    = $shortcut;
        $this->mode        = $mode;
        $this->description = $description;

        if ($this->isArray() && !$this->acceptValue()) {
            throw new \InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.');
        }

        $this->setDefault($default);
    }

    /**
     * Returns the option shortcut.
     *
     * @return string The shortcut
     */
    public function getShortcut()
    {
        return $this->shortcut;
    }

    /**
     * Returns the option name.
     *
     * @return string The name
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Returns true if the option accepts a value.
     *
     * @return Boolean true if value mode is not self::VALUE_NONE, false otherwise
     */
    public function acceptValue()
    {
        return $this->isValueRequired() || $this->isValueOptional();
    }

    /**
     * Returns true if the option requires a value.
     *
     * @return Boolean true if value mode is self::VALUE_REQUIRED, false otherwise
     */
    public function isValueRequired()
    {
        return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode);
    }

    /**
     * Returns true if the option takes an optional value.
     *
     * @return Boolean true if value mode is self::VALUE_OPTIONAL, false otherwise
     */
    public function isValueOptional()
    {
        return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode);
    }

    /**
     * Returns true if the option can take multiple values.
     *
     * @return Boolean true if mode is self::VALUE_IS_ARRAY, false otherwise
     */
    public function isArray()
    {
        return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode);
    }

    /**
     * Sets the default value.
     *
     * @param mixed $default The default value
     *
     * @throws \LogicException When incorrect default value is given
     */
    public function setDefault($default = null)
    {
        if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) {
            throw new \LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.');
        }

        if ($this->isArray()) {
            if (null === $default) {
                $default = array();
            } elseif (!is_array($default)) {
                throw new \LogicException('A default value for an array option must be an array.');
            }
        }

        $this->default = $this->acceptValue() ? $default : false;
    }

    /**
     * Returns the default value.
     *
     * @return mixed The default value
     */
    public function getDefault()
    {
        return $this->default;
    }

    /**
     * Returns the description text.
     *
     * @return string The description text
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Checks whether the given option equals this one
     *
     * @param InputOption $option option to compare
     * @return Boolean
     */
    public function equals(InputOption $option)
    {
        return $option->getName() === $this->getName()
            && $option->getShortcut() === $this->getShortcut()
            && $option->getDefault() === $this->getDefault()
            && $option->isArray() === $this->isArray()
            && $option->isValueRequired() === $this->isValueRequired()
            && $option->isValueOptional() === $this->isValueOptional()
        ;
    }
}
PK�`�\p���%%3pear/Symfony/Component/Console/Input/ArrayInput.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

/**
 * ArrayInput represents an input provided as an array.
 *
 * Usage:
 *
 *     $input = new ArrayInput(array('name' => 'foo', '--bar' => 'foobar'));
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ArrayInput extends Input
{
    private $parameters;

    /**
     * Constructor.
     *
     * @param array           $parameters An array of parameters
     * @param InputDefinition $definition A InputDefinition instance
     *
     * @api
     */
    public function __construct(array $parameters, InputDefinition $definition = null)
    {
        $this->parameters = $parameters;

        parent::__construct($definition);
    }

    /**
     * Returns the first argument from the raw parameters (not parsed).
     *
     * @return string The value of the first argument or null otherwise
     */
    public function getFirstArgument()
    {
        foreach ($this->parameters as $key => $value) {
            if ($key && '-' === $key[0]) {
                continue;
            }

            return $value;
        }
    }

    /**
     * Returns true if the raw parameters (not parsed) contain a value.
     *
     * This method is to be used to introspect the input parameters
     * before they have been validated. It must be used carefully.
     *
     * @param string|array $values The values to look for in the raw parameters (can be an array)
     *
     * @return Boolean true if the value is contained in the raw parameters
     */
    public function hasParameterOption($values)
    {
        $values = (array) $values;

        foreach ($this->parameters as $k => $v) {
            if (!is_int($k)) {
                $v = $k;
            }

            if (in_array($v, $values)) {
                return true;
            }
        }

        return false;
    }

    /**
     * Returns the value of a raw option (not parsed).
     *
     * This method is to be used to introspect the input parameters
     * before they have been validated. It must be used carefully.
     *
     * @param string|array $values  The value(s) to look for in the raw parameters (can be an array)
     * @param mixed        $default The default value to return if no result is found
     *
     * @return mixed The option value
     */
    public function getParameterOption($values, $default = false)
    {
        $values = (array) $values;

        foreach ($this->parameters as $k => $v) {
            if (is_int($k) && in_array($v, $values)) {
                return true;
            } elseif (in_array($k, $values)) {
                return $v;
            }
        }

        return $default;
    }

    /**
     * Returns a stringified representation of the args passed to the command
     *
     * @return string
     */
    public function __toString()
    {
        $params = array();
        foreach ($this->parameters as $param => $val) {
            if ($param && '-' === $param[0]) {
                $params[] = $param . ('' != $val ? '='.$this->escapeToken($val) : '');
            } else {
                $params[] = $this->escapeToken($val);
            }
        }

        return implode(' ', $params);
    }

    /**
     * Processes command line arguments.
     */
    protected function parse()
    {
        foreach ($this->parameters as $key => $value) {
            if (0 === strpos($key, '--')) {
                $this->addLongOption(substr($key, 2), $value);
            } elseif ('-' === $key[0]) {
                $this->addShortOption(substr($key, 1), $value);
            } else {
                $this->addArgument($key, $value);
            }
        }
    }

    /**
     * Adds a short option value.
     *
     * @param string $shortcut The short option key
     * @param mixed  $value    The value for the option
     *
     * @throws \InvalidArgumentException When option given doesn't exist
     */
    private function addShortOption($shortcut, $value)
    {
        if (!$this->definition->hasShortcut($shortcut)) {
            throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut));
        }

        $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value);
    }

    /**
     * Adds a long option value.
     *
     * @param string $name  The long option key
     * @param mixed  $value The value for the option
     *
     * @throws \InvalidArgumentException When option given doesn't exist
     * @throws \InvalidArgumentException When a required value is missing
     */
    private function addLongOption($name, $value)
    {
        if (!$this->definition->hasOption($name)) {
            throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name));
        }

        $option = $this->definition->getOption($name);

        if (null === $value) {
            if ($option->isValueRequired()) {
                throw new \InvalidArgumentException(sprintf('The "--%s" option requires a value.', $name));
            }

            $value = $option->isValueOptional() ? $option->getDefault() : true;
        }

        $this->options[$name] = $value;
    }

    /**
     * Adds an argument value.
     *
     * @param string $name  The argument name
     * @param mixed  $value The value for the argument
     *
     * @throws \InvalidArgumentException When argument given doesn't exist
     */
    private function addArgument($name, $value)
    {
        if (!$this->definition->hasArgument($name)) {
            throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
        }

        $this->arguments[$name] = $value;
    }
}
PK�`�\�AM667pear/Symfony/Component/Console/Input/InputInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

/**
 * InputInterface is the interface implemented by all input classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface InputInterface
{
    /**
     * Returns the first argument from the raw parameters (not parsed).
     *
     * @return string The value of the first argument or null otherwise
     */
    public function getFirstArgument();

    /**
     * Returns true if the raw parameters (not parsed) contain a value.
     *
     * This method is to be used to introspect the input parameters
     * before they have been validated. It must be used carefully.
     *
     * @param string|array $values The values to look for in the raw parameters (can be an array)
     *
     * @return Boolean true if the value is contained in the raw parameters
     */
    public function hasParameterOption($values);

    /**
     * Returns the value of a raw option (not parsed).
     *
     * This method is to be used to introspect the input parameters
     * before they have been validated. It must be used carefully.
     *
     * @param string|array $values  The value(s) to look for in the raw parameters (can be an array)
     * @param mixed        $default The default value to return if no result is found
     *
     * @return mixed The option value
     */
    public function getParameterOption($values, $default = false);

    /**
     * Binds the current Input instance with the given arguments and options.
     *
     * @param InputDefinition $definition A InputDefinition instance
     */
    public function bind(InputDefinition $definition);

    /**
     * Validates if arguments given are correct.
     *
     * Throws an exception when not enough arguments are given.
     *
     * @throws \RuntimeException
     */
    public function validate();

    /**
     * Returns all the given arguments merged with the default values.
     *
     * @return array
     */
    public function getArguments();

    /**
     * Gets argument by name.
     *
     * @param string $name The name of the argument
     *
     * @return mixed
     */
    public function getArgument($name);

    /**
     * Sets an argument value by name.
     *
     * @param string $name  The argument name
     * @param string $value The argument value
     *
     * @throws \InvalidArgumentException When argument given doesn't exist
     */
    public function setArgument($name, $value);

    /**
     * Returns true if an InputArgument object exists by name or position.
     *
     * @param string|integer $name The InputArgument name or position
     *
     * @return Boolean true if the InputArgument object exists, false otherwise
     */
    public function hasArgument($name);

    /**
     * Returns all the given options merged with the default values.
     *
     * @return array
     */
    public function getOptions();

    /**
     * Gets an option by name.
     *
     * @param string $name The name of the option
     *
     * @return mixed
     */
    public function getOption($name);

    /**
     * Sets an option value by name.
     *
     * @param string         $name  The option name
     * @param string|boolean $value The option value
     *
     * @throws \InvalidArgumentException When option given doesn't exist
     */
    public function setOption($name, $value);

    /**
     * Returns true if an InputOption object exists by name.
     *
     * @param string $name The InputOption name
     *
     * @return Boolean true if the InputOption object exists, false otherwise
     */
    public function hasOption($name);

    /**
     * Is this input means interactive?
     *
     * @return Boolean
     */
    public function isInteractive();

    /**
     * Sets the input interactivity.
     *
     * @param Boolean $interactive If the input should be interactive
     */
    public function setInteractive($interactive);
}
PK�`�\��'��6pear/Symfony/Component/Console/Input/InputArgument.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

/**
 * Represents a command line argument.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class InputArgument
{
    const REQUIRED = 1;
    const OPTIONAL = 2;
    const IS_ARRAY = 4;

    private $name;
    private $mode;
    private $default;
    private $description;

    /**
     * Constructor.
     *
     * @param string  $name        The argument name
     * @param integer $mode        The argument mode: self::REQUIRED or self::OPTIONAL
     * @param string  $description A description text
     * @param mixed   $default     The default value (for self::OPTIONAL mode only)
     *
     * @throws \InvalidArgumentException When argument mode is not valid
     *
     * @api
     */
    public function __construct($name, $mode = null, $description = '', $default = null)
    {
        if (null === $mode) {
            $mode = self::OPTIONAL;
        } elseif (!is_int($mode) || $mode > 7 || $mode < 1) {
            throw new \InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode));
        }

        $this->name        = $name;
        $this->mode        = $mode;
        $this->description = $description;

        $this->setDefault($default);
    }

    /**
     * Returns the argument name.
     *
     * @return string The argument name
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Returns true if the argument is required.
     *
     * @return Boolean true if parameter mode is self::REQUIRED, false otherwise
     */
    public function isRequired()
    {
        return self::REQUIRED === (self::REQUIRED & $this->mode);
    }

    /**
     * Returns true if the argument can take multiple values.
     *
     * @return Boolean true if mode is self::IS_ARRAY, false otherwise
     */
    public function isArray()
    {
        return self::IS_ARRAY === (self::IS_ARRAY & $this->mode);
    }

    /**
     * Sets the default value.
     *
     * @param mixed $default The default value
     *
     * @throws \LogicException When incorrect default value is given
     */
    public function setDefault($default = null)
    {
        if (self::REQUIRED === $this->mode && null !== $default) {
            throw new \LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.');
        }

        if ($this->isArray()) {
            if (null === $default) {
                $default = array();
            } elseif (!is_array($default)) {
                throw new \LogicException('A default value for an array argument must be an array.');
            }
        }

        $this->default = $default;
    }

    /**
     * Returns the default value.
     *
     * @return mixed The default value
     */
    public function getDefault()
    {
        return $this->default;
    }

    /**
     * Returns the description text.
     *
     * @return string The description text
     */
    public function getDescription()
    {
        return $this->description;
    }
}
PK�`�\gm(.pear/Symfony/Component/Console/Input/Input.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

/**
 * Input is the base class for all concrete Input classes.
 *
 * Three concrete classes are provided by default:
 *
 *  * `ArgvInput`: The input comes from the CLI arguments (argv)
 *  * `StringInput`: The input is provided as a string
 *  * `ArrayInput`: The input is provided as an array
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class Input implements InputInterface
{
    /**
     * @var InputDefinition
     */
    protected $definition;
    protected $options = array();
    protected $arguments = array();
    protected $interactive = true;

    /**
     * Constructor.
     *
     * @param InputDefinition $definition A InputDefinition instance
     */
    public function __construct(InputDefinition $definition = null)
    {
        if (null === $definition) {
            $this->definition = new InputDefinition();
        } else {
            $this->bind($definition);
            $this->validate();
        }
    }

    /**
     * Binds the current Input instance with the given arguments and options.
     *
     * @param InputDefinition $definition A InputDefinition instance
     */
    public function bind(InputDefinition $definition)
    {
        $this->arguments = array();
        $this->options = array();
        $this->definition = $definition;

        $this->parse();
    }

    /**
     * Processes command line arguments.
     */
    abstract protected function parse();

    /**
     * Validates the input.
     *
     * @throws \RuntimeException When not enough arguments are given
     */
    public function validate()
    {
        if (count($this->arguments) < $this->definition->getArgumentRequiredCount()) {
            throw new \RuntimeException('Not enough arguments.');
        }
    }

    /**
     * Checks if the input is interactive.
     *
     * @return Boolean Returns true if the input is interactive
     */
    public function isInteractive()
    {
        return $this->interactive;
    }

    /**
     * Sets the input interactivity.
     *
     * @param Boolean $interactive If the input should be interactive
     */
    public function setInteractive($interactive)
    {
        $this->interactive = (Boolean) $interactive;
    }

    /**
     * Returns the argument values.
     *
     * @return array An array of argument values
     */
    public function getArguments()
    {
        return array_merge($this->definition->getArgumentDefaults(), $this->arguments);
    }

    /**
     * Returns the argument value for a given argument name.
     *
     * @param string $name The argument name
     *
     * @return mixed The argument value
     *
     * @throws \InvalidArgumentException When argument given doesn't exist
     */
    public function getArgument($name)
    {
        if (!$this->definition->hasArgument($name)) {
            throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
        }

        return isset($this->arguments[$name]) ? $this->arguments[$name] : $this->definition->getArgument($name)->getDefault();
    }

    /**
     * Sets an argument value by name.
     *
     * @param string $name  The argument name
     * @param string $value The argument value
     *
     * @throws \InvalidArgumentException When argument given doesn't exist
     */
    public function setArgument($name, $value)
    {
        if (!$this->definition->hasArgument($name)) {
            throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
        }

        $this->arguments[$name] = $value;
    }

    /**
     * Returns true if an InputArgument object exists by name or position.
     *
     * @param string|integer $name The InputArgument name or position
     *
     * @return Boolean true if the InputArgument object exists, false otherwise
     */
    public function hasArgument($name)
    {
        return $this->definition->hasArgument($name);
    }

    /**
     * Returns the options values.
     *
     * @return array An array of option values
     */
    public function getOptions()
    {
        return array_merge($this->definition->getOptionDefaults(), $this->options);
    }

    /**
     * Returns the option value for a given option name.
     *
     * @param string $name The option name
     *
     * @return mixed The option value
     *
     * @throws \InvalidArgumentException When option given doesn't exist
     */
    public function getOption($name)
    {
        if (!$this->definition->hasOption($name)) {
            throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name));
        }

        return isset($this->options[$name]) ? $this->options[$name] : $this->definition->getOption($name)->getDefault();
    }

    /**
     * Sets an option value by name.
     *
     * @param string         $name  The option name
     * @param string|boolean $value The option value
     *
     * @throws \InvalidArgumentException When option given doesn't exist
     */
    public function setOption($name, $value)
    {
        if (!$this->definition->hasOption($name)) {
            throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name));
        }

        $this->options[$name] = $value;
    }

    /**
     * Returns true if an InputOption object exists by name.
     *
     * @param string $name The InputOption name
     *
     * @return Boolean true if the InputOption object exists, false otherwise
     */
    public function hasOption($name)
    {
        return $this->definition->hasOption($name);
    }

    /**
     * Escapes a token through escapeshellarg if it contains unsafe chars
     *
     * @param string $token
     *
     * @return string
     */
    public function escapeToken($token)
    {
        return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token);
    }
}
PK�`�\1�E(0(08pear/Symfony/Component/Console/Input/InputDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Input;

if (!defined('JSON_UNESCAPED_UNICODE')) {
    define('JSON_UNESCAPED_SLASHES', 64);
    define('JSON_UNESCAPED_UNICODE', 256);
}

use Symfony\Component\Console\Descriptor\TextDescriptor;
use Symfony\Component\Console\Descriptor\XmlDescriptor;
use Symfony\Component\Console\Output\BufferedOutput;

/**
 * A InputDefinition represents a set of valid command line arguments and options.
 *
 * Usage:
 *
 *     $definition = new InputDefinition(array(
 *       new InputArgument('name', InputArgument::REQUIRED),
 *       new InputOption('foo', 'f', InputOption::VALUE_REQUIRED),
 *     ));
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class InputDefinition
{
    private $arguments;
    private $requiredCount;
    private $hasAnArrayArgument = false;
    private $hasOptional;
    private $options;
    private $shortcuts;

    /**
     * Constructor.
     *
     * @param array $definition An array of InputArgument and InputOption instance
     *
     * @api
     */
    public function __construct(array $definition = array())
    {
        $this->setDefinition($definition);
    }

    /**
     * Sets the definition of the input.
     *
     * @param array $definition The definition array
     *
     * @api
     */
    public function setDefinition(array $definition)
    {
        $arguments = array();
        $options = array();
        foreach ($definition as $item) {
            if ($item instanceof InputOption) {
                $options[] = $item;
            } else {
                $arguments[] = $item;
            }
        }

        $this->setArguments($arguments);
        $this->setOptions($options);
    }

    /**
     * Sets the InputArgument objects.
     *
     * @param InputArgument[] $arguments An array of InputArgument objects
     *
     * @api
     */
    public function setArguments($arguments = array())
    {
        $this->arguments          = array();
        $this->requiredCount      = 0;
        $this->hasOptional        = false;
        $this->hasAnArrayArgument = false;
        $this->addArguments($arguments);
    }

    /**
     * Adds an array of InputArgument objects.
     *
     * @param InputArgument[] $arguments An array of InputArgument objects
     *
     * @api
     */
    public function addArguments($arguments = array())
    {
        if (null !== $arguments) {
            foreach ($arguments as $argument) {
                $this->addArgument($argument);
            }
        }
    }

    /**
     * Adds an InputArgument object.
     *
     * @param InputArgument $argument An InputArgument object
     *
     * @throws \LogicException When incorrect argument is given
     *
     * @api
     */
    public function addArgument(InputArgument $argument)
    {
        if (isset($this->arguments[$argument->getName()])) {
            throw new \LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName()));
        }

        if ($this->hasAnArrayArgument) {
            throw new \LogicException('Cannot add an argument after an array argument.');
        }

        if ($argument->isRequired() && $this->hasOptional) {
            throw new \LogicException('Cannot add a required argument after an optional one.');
        }

        if ($argument->isArray()) {
            $this->hasAnArrayArgument = true;
        }

        if ($argument->isRequired()) {
            ++$this->requiredCount;
        } else {
            $this->hasOptional = true;
        }

        $this->arguments[$argument->getName()] = $argument;
    }

    /**
     * Returns an InputArgument by name or by position.
     *
     * @param string|integer $name The InputArgument name or position
     *
     * @return InputArgument An InputArgument object
     *
     * @throws \InvalidArgumentException When argument given doesn't exist
     *
     * @api
     */
    public function getArgument($name)
    {
        if (!$this->hasArgument($name)) {
            throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name));
        }

        $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments;

        return $arguments[$name];
    }

    /**
     * Returns true if an InputArgument object exists by name or position.
     *
     * @param string|integer $name The InputArgument name or position
     *
     * @return Boolean true if the InputArgument object exists, false otherwise
     *
     * @api
     */
    public function hasArgument($name)
    {
        $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments;

        return isset($arguments[$name]);
    }

    /**
     * Gets the array of InputArgument objects.
     *
     * @return InputArgument[] An array of InputArgument objects
     *
     * @api
     */
    public function getArguments()
    {
        return $this->arguments;
    }

    /**
     * Returns the number of InputArguments.
     *
     * @return integer The number of InputArguments
     */
    public function getArgumentCount()
    {
        return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments);
    }

    /**
     * Returns the number of required InputArguments.
     *
     * @return integer The number of required InputArguments
     */
    public function getArgumentRequiredCount()
    {
        return $this->requiredCount;
    }

    /**
     * Gets the default values.
     *
     * @return array An array of default values
     */
    public function getArgumentDefaults()
    {
        $values = array();
        foreach ($this->arguments as $argument) {
            $values[$argument->getName()] = $argument->getDefault();
        }

        return $values;
    }

    /**
     * Sets the InputOption objects.
     *
     * @param InputOption[] $options An array of InputOption objects
     *
     * @api
     */
    public function setOptions($options = array())
    {
        $this->options = array();
        $this->shortcuts = array();
        $this->addOptions($options);
    }

    /**
     * Adds an array of InputOption objects.
     *
     * @param InputOption[] $options An array of InputOption objects
     *
     * @api
     */
    public function addOptions($options = array())
    {
        foreach ($options as $option) {
            $this->addOption($option);
        }
    }

    /**
     * Adds an InputOption object.
     *
     * @param InputOption $option An InputOption object
     *
     * @throws \LogicException When option given already exist
     *
     * @api
     */
    public function addOption(InputOption $option)
    {
        if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) {
            throw new \LogicException(sprintf('An option named "%s" already exists.', $option->getName()));
        }

        if ($option->getShortcut()) {
            foreach (explode('|', $option->getShortcut()) as $shortcut) {
                if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) {
                    throw new \LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut));
                }
            }
        }

        $this->options[$option->getName()] = $option;
        if ($option->getShortcut()) {
            foreach (explode('|', $option->getShortcut()) as $shortcut) {
                $this->shortcuts[$shortcut] = $option->getName();
            }
        }
    }

    /**
     * Returns an InputOption by name.
     *
     * @param string $name The InputOption name
     *
     * @return InputOption A InputOption object
     *
     * @throws \InvalidArgumentException When option given doesn't exist
     *
     * @api
     */
    public function getOption($name)
    {
        if (!$this->hasOption($name)) {
            throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name));
        }

        return $this->options[$name];
    }

    /**
     * Returns true if an InputOption object exists by name.
     *
     * @param string $name The InputOption name
     *
     * @return Boolean true if the InputOption object exists, false otherwise
     *
     * @api
     */
    public function hasOption($name)
    {
        return isset($this->options[$name]);
    }

    /**
     * Gets the array of InputOption objects.
     *
     * @return InputOption[] An array of InputOption objects
     *
     * @api
     */
    public function getOptions()
    {
        return $this->options;
    }

    /**
     * Returns true if an InputOption object exists by shortcut.
     *
     * @param string $name The InputOption shortcut
     *
     * @return Boolean true if the InputOption object exists, false otherwise
     */
    public function hasShortcut($name)
    {
        return isset($this->shortcuts[$name]);
    }

    /**
     * Gets an InputOption by shortcut.
     *
     * @param string $shortcut the Shortcut name
     *
     * @return InputOption An InputOption object
     */
    public function getOptionForShortcut($shortcut)
    {
        return $this->getOption($this->shortcutToName($shortcut));
    }

    /**
     * Gets an array of default values.
     *
     * @return array An array of all default values
     */
    public function getOptionDefaults()
    {
        $values = array();
        foreach ($this->options as $option) {
            $values[$option->getName()] = $option->getDefault();
        }

        return $values;
    }

    /**
     * Returns the InputOption name given a shortcut.
     *
     * @param string $shortcut The shortcut
     *
     * @return string The InputOption name
     *
     * @throws \InvalidArgumentException When option given does not exist
     */
    private function shortcutToName($shortcut)
    {
        if (!isset($this->shortcuts[$shortcut])) {
            throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut));
        }

        return $this->shortcuts[$shortcut];
    }

    /**
     * Gets the synopsis.
     *
     * @return string The synopsis
     */
    public function getSynopsis()
    {
        $elements = array();
        foreach ($this->getOptions() as $option) {
            $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : '';
            $elements[] = sprintf('['.($option->isValueRequired() ? '%s--%s="..."' : ($option->isValueOptional() ? '%s--%s[="..."]' : '%s--%s')).']', $shortcut, $option->getName());
        }

        foreach ($this->getArguments() as $argument) {
            $elements[] = sprintf($argument->isRequired() ? '%s' : '[%s]', $argument->getName().($argument->isArray() ? '1' : ''));

            if ($argument->isArray()) {
                $elements[] = sprintf('... [%sN]', $argument->getName());
            }
        }

        return implode(' ', $elements);
    }

    /**
     * Returns a textual representation of the InputDefinition.
     *
     * @return string A string representing the InputDefinition
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0.
     */
    public function asText()
    {
        $descriptor = new TextDescriptor();
        $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true);
        $descriptor->describe($output, $this, array('raw_output' => true));

        return $output->fetch();
    }

    /**
     * Returns an XML representation of the InputDefinition.
     *
     * @param Boolean $asDom Whether to return a DOM or an XML string
     *
     * @return string|\DOMDocument An XML string representing the InputDefinition
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0.
     */
    public function asXml($asDom = false)
    {
        $descriptor = new XmlDescriptor();

        if ($asDom) {
            return $descriptor->getInputDefinitionDocument($this);
        }

        $output = new BufferedOutput();
        $descriptor->describe($output, $this);

        return $output->fetch();
    }
}
PK�`�\�m��
�
8pear/Symfony/Component/Console/Descriptor/Descriptor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
abstract class Descriptor implements DescriptorInterface
{
    /**
     * @var OutputInterface
     */
    private $output;

    /**
     * {@inheritdoc}
     */
    public function describe(OutputInterface $output, $object, array $options = array())
    {
        $this->output = $output;

        switch (true) {
            case $object instanceof InputArgument:
                $this->describeInputArgument($object, $options);
                break;
            case $object instanceof InputOption:
                $this->describeInputOption($object, $options);
                break;
            case $object instanceof InputDefinition:
                $this->describeInputDefinition($object, $options);
                break;
            case $object instanceof Command:
                $this->describeCommand($object, $options);
                break;
            case $object instanceof Application:
                $this->describeApplication($object, $options);
                break;
            default:
                throw new \InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_class($object)));
        }
    }

    /**
     * Writes content to output.
     *
     * @param string  $content
     * @param boolean $decorated
     */
    protected function write($content, $decorated = false)
    {
        $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW);
    }

    /**
     * Describes an InputArgument instance.
     *
     * @param InputArgument $argument
     * @param array         $options
     *
     * @return string|mixed
     */
    abstract protected function describeInputArgument(InputArgument $argument, array $options = array());

    /**
     * Describes an InputOption instance.
     *
     * @param InputOption $option
     * @param array       $options
     *
     * @return string|mixed
     */
    abstract protected function describeInputOption(InputOption $option, array $options = array());

    /**
     * Describes an InputDefinition instance.
     *
     * @param InputDefinition $definition
     * @param array           $options
     *
     * @return string|mixed
     */
    abstract protected function describeInputDefinition(InputDefinition $definition, array $options = array());

    /**
     * Describes a Command instance.
     *
     * @param Command $command
     * @param array   $options
     *
     * @return string|mixed
     */
    abstract protected function describeCommand(Command $command, array $options = array());

    /**
     * Describes an Application instance.
     *
     * @param Application $application
     * @param array       $options
     *
     * @return string|mixed
     */
    abstract protected function describeApplication(Application $application, array $options = array());
}
PK�`�\ﶲ��%�%;pear/Symfony/Component/Console/Descriptor/XmlDescriptor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;

/**
 * XML descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class XmlDescriptor extends Descriptor
{
    /**
     * @param InputDefinition $definition
     *
     * @return \DOMDocument
     */
    public function getInputDefinitionDocument(InputDefinition $definition)
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');
        $dom->appendChild($definitionXML = $dom->createElement('definition'));

        $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments'));
        foreach ($definition->getArguments() as $argument) {
            $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument));
        }

        $definitionXML->appendChild($optionsXML = $dom->createElement('options'));
        foreach ($definition->getOptions() as $option) {
            $this->appendDocument($optionsXML, $this->getInputOptionDocument($option));
        }

        return $dom;
    }

    /**
     * @param Command $command
     *
     * @return \DOMDocument
     */
    public function getCommandDocument(Command $command)
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');
        $dom->appendChild($commandXML = $dom->createElement('command'));

        $command->getSynopsis();
        $command->mergeApplicationDefinition(false);

        $commandXML->setAttribute('id', $command->getName());
        $commandXML->setAttribute('name', $command->getName());

        $commandXML->appendChild($usageXML = $dom->createElement('usage'));
        $usageXML->appendChild($dom->createTextNode(sprintf($command->getSynopsis(), '')));

        $commandXML->appendChild($descriptionXML = $dom->createElement('description'));
        $descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription())));

        $commandXML->appendChild($helpXML = $dom->createElement('help'));
        $helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp())));

        $commandXML->appendChild($aliasesXML = $dom->createElement('aliases'));
        foreach ($command->getAliases() as $alias) {
            $aliasesXML->appendChild($aliasXML = $dom->createElement('alias'));
            $aliasXML->appendChild($dom->createTextNode($alias));
        }

        $definitionXML = $this->getInputDefinitionDocument($command->getNativeDefinition());
        $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0));

        return $dom;
    }

    /**
     * @param Application $application
     * @param string|null $namespace
     *
     * @return \DOMDocument
     */
    public function getApplicationDocument(Application $application, $namespace = null)
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');
        $dom->appendChild($rootXml = $dom->createElement('symfony'));

        if ($application->getName() !== 'UNKNOWN') {
            $rootXml->setAttribute('name', $application->getName());
            if ($application->getVersion() !== 'UNKNOWN') {
                $rootXml->setAttribute('version', $application->getVersion());
            }
        }

        $rootXml->appendChild($commandsXML = $dom->createElement('commands'));

        $description = new ApplicationDescription($application, $namespace);

        if ($namespace) {
            $commandsXML->setAttribute('namespace', $namespace);
        }

        foreach ($description->getCommands() as $command) {
            $this->appendDocument($commandsXML, $this->getCommandDocument($command));
        }

        if (!$namespace) {
            $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces'));

            foreach ($description->getNamespaces() as $namespaceDescription) {
                $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace'));
                $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']);

                foreach ($namespaceDescription['commands'] as $name) {
                    $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command'));
                    $commandXML->appendChild($dom->createTextNode($name));
                }
            }
        }

        return $dom;
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(InputArgument $argument, array $options = array())
    {
        $this->writeDocument($this->getInputArgumentDocument($argument));
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(InputOption $option, array $options = array())
    {
        $this->writeDocument($this->getInputOptionDocument($option));
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(InputDefinition $definition, array $options = array())
    {
        $this->writeDocument($this->getInputDefinitionDocument($definition));
    }

    /**
     * {@inheritdoc}
     */
    protected function describeCommand(Command $command, array $options = array())
    {
        $this->writeDocument($this->getCommandDocument($command));
    }

    /**
     * {@inheritdoc}
     */
    protected function describeApplication(Application $application, array $options = array())
    {
        $this->writeDocument($this->getApplicationDocument($application, isset($options['namespace']) ? $options['namespace'] : null));
    }

    /**
     * Appends document children to parent node.
     *
     * @param \DOMNode $parentNode
     * @param \DOMNode $importedParent
     */
    private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent)
    {
        foreach ($importedParent->childNodes as $childNode) {
            $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true));
        }
    }

    /**
     * Writes DOM document.
     *
     * @param \DOMDocument $dom
     *
     * @return \DOMDocument|string
     */
    private function writeDocument(\DOMDocument $dom)
    {
        $dom->formatOutput = true;
        $this->write($dom->saveXML());
    }

    /**
     * @param InputArgument $argument
     *
     * @return \DOMDocument
     */
    private function getInputArgumentDocument(InputArgument $argument)
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');

        $dom->appendChild($objectXML = $dom->createElement('argument'));
        $objectXML->setAttribute('name', $argument->getName());
        $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0);
        $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0);
        $objectXML->appendChild($descriptionXML = $dom->createElement('description'));
        $descriptionXML->appendChild($dom->createTextNode($argument->getDescription()));

        $objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));
        $defaults = is_array($argument->getDefault()) ? $argument->getDefault() : (is_bool($argument->getDefault()) ? array(var_export($argument->getDefault(), true)) : ($argument->getDefault() ? array($argument->getDefault()) : array()));
        foreach ($defaults as $default) {
            $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
            $defaultXML->appendChild($dom->createTextNode($default));
        }

        return $dom;
    }

    /**
     * @param InputOption $option
     *
     * @return \DOMDocument
     */
    private function getInputOptionDocument(InputOption $option)
    {
        $dom = new \DOMDocument('1.0', 'UTF-8');

        $dom->appendChild($objectXML = $dom->createElement('option'));
        $objectXML->setAttribute('name', '--'.$option->getName());
        $pos = strpos($option->getShortcut(), '|');
        if (false !== $pos) {
            $objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos));
            $objectXML->setAttribute('shortcuts', '-'.implode('|-', explode('|', $option->getShortcut())));
        } else {
            $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : '');
        }
        $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0);
        $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0);
        $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0);
        $objectXML->appendChild($descriptionXML = $dom->createElement('description'));
        $descriptionXML->appendChild($dom->createTextNode($option->getDescription()));

        if ($option->acceptValue()) {
            $defaults = is_array($option->getDefault()) ? $option->getDefault() : (is_bool($option->getDefault()) ? array(var_export($option->getDefault(), true)) : ($option->getDefault() ? array($option->getDefault()) : array()));
            $objectXML->appendChild($defaultsXML = $dom->createElement('defaults'));

            if (!empty($defaults)) {
                foreach ($defaults as $default) {
                    $defaultsXML->appendChild($defaultXML = $dom->createElement('default'));
                    $defaultXML->appendChild($dom->createTextNode($default));
                }
            }
        }

        return $dom;
    }
}
PK�`�\�s�X�
�
Dpear/Symfony/Component/Console/Descriptor/ApplicationDescription.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;

/**
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class ApplicationDescription
{
    const GLOBAL_NAMESPACE = '_global';

    /**
     * @var Application
     */
    private $application;

    /**
     * @var null|string
     */
    private $namespace;

    /**
     * @var array
     */
    private $namespaces;

    /**
     * @var Command[]
     */
    private $commands;

    /**
     * @var Command[]
     */
    private $aliases;

    /**
     * Constructor.
     *
     * @param Application $application
     * @param string|null $namespace
     */
    public function __construct(Application $application, $namespace = null)
    {
        $this->application = $application;
        $this->namespace = $namespace;
    }

    /**
     * @return array
     */
    public function getNamespaces()
    {
        if (null === $this->namespaces) {
            $this->inspectApplication();
        }

        return $this->namespaces;
    }

    /**
     * @return Command[]
     */
    public function getCommands()
    {
        if (null === $this->commands) {
            $this->inspectApplication();
        }

        return $this->commands;
    }

    /**
     * @param string $name
     *
     * @return Command
     *
     * @throws \InvalidArgumentException
     */
    public function getCommand($name)
    {
        if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) {
            throw new \InvalidArgumentException(sprintf('Command %s does not exist.', $name));
        }

        return isset($this->commands[$name]) ? $this->commands[$name] : $this->aliases[$name];
    }

    private function inspectApplication()
    {
        $this->commands = array();
        $this->namespaces = array();

        $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null);
        foreach ($this->sortCommands($all) as $namespace => $commands) {
            $names = array();

            /** @var Command $command */
            foreach ($commands as $name => $command) {
                if (!$command->getName()) {
                    continue;
                }

                if ($command->getName() === $name) {
                    $this->commands[$name] = $command;
                } else {
                    $this->aliases[$name] = $command;
                }

                $names[] = $name;
            }

            $this->namespaces[$namespace] = array('id' => $namespace, 'commands' => $names);
        }
    }

    /**
     * @param array $commands
     *
     * @return array
     */
    private function sortCommands(array $commands)
    {
        $namespacedCommands = array();
        foreach ($commands as $name => $command) {
            $key = $this->application->extractNamespace($name, 1);
            if (!$key) {
                $key = '_global';
            }

            $namespacedCommands[$key][$name] = $command;
        }
        ksort($namespacedCommands);

        foreach ($namespacedCommands as &$commands) {
            ksort($commands);
        }

        return $namespacedCommands;
    }
}
PK�`�\JZ0<��Apear/Symfony/Component/Console/Descriptor/DescriptorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Output\OutputInterface;

/**
 * Descriptor interface.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
interface DescriptorInterface
{
    /**
     * Describes an InputArgument instance.
     *
     * @param OutputInterface $output
     * @param object          $object
     * @param array           $options
     */
    public function describe(OutputInterface $output, $object, array $options = array());
}
PK�`�\D��uu<pear/Symfony/Component/Console/Descriptor/JsonDescriptor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;

/**
 * JSON descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class JsonDescriptor extends Descriptor
{
    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(InputArgument $argument, array $options = array())
    {
        $this->writeData($this->getInputArgumentData($argument), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(InputOption $option, array $options = array())
    {
        $this->writeData($this->getInputOptionData($option), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(InputDefinition $definition, array $options = array())
    {
        $this->writeData($this->getInputDefinitionData($definition), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeCommand(Command $command, array $options = array())
    {
        $this->writeData($this->getCommandData($command), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeApplication(Application $application, array $options = array())
    {
        $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
        $description = new ApplicationDescription($application, $describedNamespace);
        $commands = array();

        foreach ($description->getCommands() as $command) {
            $commands[] = $this->getCommandData($command);
        }

        $data = $describedNamespace
            ? array('commands' => $commands, 'namespace' => $describedNamespace)
            : array('commands' => $commands, 'namespaces' => array_values($description->getNamespaces()));

        $this->writeData($data, $options);
    }

    /**
     * Writes data as json.
     *
     * @param array $data
     * @param array $options
     *
     * @return array|string
     */
    private function writeData(array $data, array $options)
    {
        $this->write(json_encode($data, isset($options['json_encoding']) ? $options['json_encoding'] : 0));
    }

    /**
     * @param InputArgument $argument
     *
     * @return array
     */
    private function getInputArgumentData(InputArgument $argument)
    {
        return array(
            'name'        => $argument->getName(),
            'is_required' => $argument->isRequired(),
            'is_array'    => $argument->isArray(),
            'description' => $argument->getDescription(),
            'default'     => $argument->getDefault(),
        );
    }

    /**
     * @param InputOption $option
     *
     * @return array
     */
    private function getInputOptionData(InputOption $option)
    {
        return array(
            'name'              => '--'.$option->getName(),
            'shortcut'          => $option->getShortcut() ? '-'.implode('|-', explode('|', $option->getShortcut())) : '',
            'accept_value'      => $option->acceptValue(),
            'is_value_required' => $option->isValueRequired(),
            'is_multiple'       => $option->isArray(),
            'description'       => $option->getDescription(),
            'default'           => $option->getDefault(),
        );
    }

    /**
     * @param InputDefinition $definition
     *
     * @return array
     */
    private function getInputDefinitionData(InputDefinition $definition)
    {
        $inputArguments = array();
        foreach ($definition->getArguments() as $name => $argument) {
            $inputArguments[$name] = $this->getInputArgumentData($argument);
        }

        $inputOptions = array();
        foreach ($definition->getOptions() as $name => $option) {
            $inputOptions[$name] = $this->getInputOptionData($option);
        }

        return array('arguments' => $inputArguments, 'options' => $inputOptions);
    }

    /**
     * @param Command $command
     *
     * @return array
     */
    private function getCommandData(Command $command)
    {
        $command->getSynopsis();
        $command->mergeApplicationDefinition(false);

        return array(
            'name'        => $command->getName(),
            'usage'       => $command->getSynopsis(),
            'description' => $command->getDescription(),
            'help'        => $command->getProcessedHelp(),
            'aliases'     => $command->getAliases(),
            'definition'  => $this->getInputDefinitionData($command->getNativeDefinition()),
        );
    }
}
PK�`�\����<pear/Symfony/Component/Console/Descriptor/TextDescriptor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;

/**
 * Text descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class TextDescriptor extends Descriptor
{
    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(InputArgument $argument, array $options = array())
    {
        if (null !== $argument->getDefault() && (!is_array($argument->getDefault()) || count($argument->getDefault()))) {
            $default = sprintf('<comment> (default: %s)</comment>', $this->formatDefaultValue($argument->getDefault()));
        } else {
            $default = '';
        }

        $nameWidth = isset($options['name_width']) ? $options['name_width'] : strlen($argument->getName());

        $this->writeText(sprintf(" <info>%-${nameWidth}s</info> %s%s",
            $argument->getName(),
            str_replace("\n", "\n".str_repeat(' ', $nameWidth + 2), $argument->getDescription()),
            $default
        ), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(InputOption $option, array $options = array())
    {
        if ($option->acceptValue() && null !== $option->getDefault() && (!is_array($option->getDefault()) || count($option->getDefault()))) {
            $default = sprintf('<comment> (default: %s)</comment>', $this->formatDefaultValue($option->getDefault()));
        } else {
            $default = '';
        }

        $nameWidth = isset($options['name_width']) ? $options['name_width'] : strlen($option->getName());
        $nameWithShortcutWidth = $nameWidth - strlen($option->getName()) - 2;

        $this->writeText(sprintf(" <info>%s</info> %-${nameWithShortcutWidth}s%s%s%s",
            '--'.$option->getName(),
            $option->getShortcut() ? sprintf('(-%s) ', $option->getShortcut()) : '',
            str_replace("\n", "\n".str_repeat(' ', $nameWidth + 2), $option->getDescription()),
            $default,
            $option->isArray() ? '<comment> (multiple values allowed)</comment>' : ''
        ), $options);
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(InputDefinition $definition, array $options = array())
    {
        $nameWidth = 0;
        foreach ($definition->getOptions() as $option) {
            $nameLength = strlen($option->getName()) + 2;
            if ($option->getShortcut()) {
                $nameLength += strlen($option->getShortcut()) + 3;
            }
            $nameWidth = max($nameWidth, $nameLength);
        }
        foreach ($definition->getArguments() as $argument) {
            $nameWidth = max($nameWidth, strlen($argument->getName()));
        }
        ++$nameWidth;

        if ($definition->getArguments()) {
            $this->writeText('<comment>Arguments:</comment>', $options);
            $this->writeText("\n");
            foreach ($definition->getArguments() as $argument) {
                $this->describeInputArgument($argument, array_merge($options, array('name_width' => $nameWidth)));
                $this->writeText("\n");
            }
        }

        if ($definition->getArguments() && $definition->getOptions()) {
            $this->writeText("\n");
        }

        if ($definition->getOptions()) {
            $this->writeText('<comment>Options:</comment>', $options);
            $this->writeText("\n");
            foreach ($definition->getOptions() as $option) {
                $this->describeInputOption($option, array_merge($options, array('name_width' => $nameWidth)));
                $this->writeText("\n");
            }
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function describeCommand(Command $command, array $options = array())
    {
        $command->getSynopsis();
        $command->mergeApplicationDefinition(false);

        $this->writeText('<comment>Usage:</comment>', $options);
        $this->writeText("\n");
        $this->writeText(' '.$command->getSynopsis(), $options);
        $this->writeText("\n");

        if (count($command->getAliases()) > 0) {
            $this->writeText("\n");
            $this->writeText('<comment>Aliases:</comment> <info>'.implode(', ', $command->getAliases()).'</info>', $options);
        }

        if ($definition = $command->getNativeDefinition()) {
            $this->writeText("\n");
            $this->describeInputDefinition($definition, $options);
        }

        $this->writeText("\n");

        if ($help = $command->getProcessedHelp()) {
            $this->writeText('<comment>Help:</comment>', $options);
            $this->writeText("\n");
            $this->writeText(' '.str_replace("\n", "\n ", $help), $options);
            $this->writeText("\n");
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function describeApplication(Application $application, array $options = array())
    {
        $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
        $description = new ApplicationDescription($application, $describedNamespace);

        if (isset($options['raw_text']) && $options['raw_text']) {
            $width = $this->getColumnWidth($description->getCommands());

            foreach ($description->getCommands() as $command) {
                $this->writeText(sprintf("%-${width}s %s", $command->getName(), $command->getDescription()), $options);
                $this->writeText("\n");
            }
        } else {
            $width = $this->getColumnWidth($description->getCommands());

            $this->writeText($application->getHelp(), $options);
            $this->writeText("\n\n");

            if ($describedNamespace) {
                $this->writeText(sprintf("<comment>Available commands for the \"%s\" namespace:</comment>", $describedNamespace), $options);
            } else {
                $this->writeText('<comment>Available commands:</comment>', $options);
            }

            // add commands by namespace
            foreach ($description->getNamespaces() as $namespace) {
                if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
                    $this->writeText("\n");
                    $this->writeText('<comment>'.$namespace['id'].'</comment>', $options);
                }

                foreach ($namespace['commands'] as $name) {
                    $this->writeText("\n");
                    $this->writeText(sprintf("  <info>%-${width}s</info> %s", $name, $description->getCommand($name)->getDescription()), $options);
                }
            }

            $this->writeText("\n");
        }
    }

    /**
     * {@inheritdoc}
     */
    private function writeText($content, array $options = array())
    {
        $this->write(
            isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content,
            isset($options['raw_output']) ? !$options['raw_output'] : true
        );
    }

    /**
     * Formats input option/argument default value.
     *
     * @param mixed $default
     *
     * @return string
     */
    private function formatDefaultValue($default)
    {
        if (version_compare(PHP_VERSION, '5.4', '<')) {
            return str_replace('\/', '/', json_encode($default));
        }

        return json_encode($default, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    }

    /**
     * @param Command[] $commands
     *
     * @return int
     */
    private function getColumnWidth(array $commands)
    {
        $width = 0;
        foreach ($commands as $command) {
            $width = strlen($command->getName()) > $width ? strlen($command->getName()) : $width;
        }

        return $width + 2;
    }
}
PK�`�\�lP�..@pear/Symfony/Component/Console/Descriptor/MarkdownDescriptor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Descriptor;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;

/**
 * Markdown descriptor.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class MarkdownDescriptor extends Descriptor
{
    /**
     * {@inheritdoc}
     */
    protected function describeInputArgument(InputArgument $argument, array $options = array())
    {
        $this->write(
            '**'.$argument->getName().':**'."\n\n"
            .'* Name: '.($argument->getName() ?: '<none>')."\n"
            .'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n"
            .'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n"
            .'* Description: '.($argument->getDescription() ?: '<none>')."\n"
            .'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`'
        );
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputOption(InputOption $option, array $options = array())
    {
        $this->write(
            '**'.$option->getName().':**'."\n\n"
            .'* Name: `--'.$option->getName().'`'."\n"
            .'* Shortcut: '.($option->getShortcut() ? '`-'.implode('|-', explode('|', $option->getShortcut())).'`' : '<none>')."\n"
            .'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n"
            .'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n"
            .'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n"
            .'* Description: '.($option->getDescription() ?: '<none>')."\n"
            .'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`'
        );
    }

    /**
     * {@inheritdoc}
     */
    protected function describeInputDefinition(InputDefinition $definition, array $options = array())
    {
        if ($showArguments = count($definition->getArguments()) > 0) {
            $this->write('### Arguments:');
            foreach ($definition->getArguments() as $argument) {
                $this->write("\n\n");
                $this->write($this->describeInputArgument($argument));
            }
        }

        if (count($definition->getOptions()) > 0) {
            if ($showArguments) {
                $this->write("\n\n");
            }

            $this->write('### Options:');
            foreach ($definition->getOptions() as $option) {
                $this->write("\n\n");
                $this->write($this->describeInputOption($option));
            }
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function describeCommand(Command $command, array $options = array())
    {
        $command->getSynopsis();
        $command->mergeApplicationDefinition(false);

        $this->write(
            $command->getName()."\n"
            .str_repeat('-', strlen($command->getName()))."\n\n"
            .'* Description: '.($command->getDescription() ?: '<none>')."\n"
            .'* Usage: `'.$command->getSynopsis().'`'."\n"
            .'* Aliases: '.(count($command->getAliases()) ? '`'.implode('`, `', $command->getAliases()).'`' : '<none>')
        );

        if ($help = $command->getProcessedHelp()) {
            $this->write("\n\n");
            $this->write($help);
        }

        if ($definition = $command->getNativeDefinition()) {
            $this->write("\n\n");
            $this->describeInputDefinition($command->getNativeDefinition());
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function describeApplication(Application $application, array $options = array())
    {
        $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null;
        $description = new ApplicationDescription($application, $describedNamespace);

        $this->write($application->getName()."\n".str_repeat('=', strlen($application->getName())));

        foreach ($description->getNamespaces() as $namespace) {
            if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) {
                $this->write("\n\n");
                $this->write('**'.$namespace['id'].':**');
            }

            $this->write("\n\n");
            $this->write(implode("\n", array_map(function ($commandName) {
                return '* '.$commandName;
            } , $namespace['commands'])));
        }

        foreach ($description->getCommands() as $command) {
            $this->write("\n\n");
            $this->write($this->describeCommand($command));
        }
    }
}
PK�`�\���v$$<pear/Symfony/Component/Console/Resources/bin/hiddeninput.exenu�[���MZ����@���	�!�L�!This program cannot be run in DOS mode.

$�,�;�B�;�B�;�B�2�מ:�B�2��-�B�2�ƞ9�B�2�ў?�B�a9�8�B�;�C��B�2�Ȟ:�B�2�֞:�B�2�Ӟ:�B�Rich;�B�PEL�MoO�	
8 @`?�@��"P@ Pp!8!@ �.text	
 `.rdata�	 
@@.data�0@�.rsrc @@@.reloc�P"@Bj$��@�xj�� @�e���E�PV� @�EЃ�PV� @�M�X @�e��E�P�5H @�L @YY�5\ @�E�P�5` @�D @YY��P @�M���M�T @3��H�;
0@u���h�@��l3@�$40@�5h3@�40@h$0@h(0@h 0@�� @���00@��}j�Y�jh"@�3ۉ]�d��p�]俀3@SVW�0 @;�t;�u3�F�u��h��4 @��3�F�|3@;�u
j�\Y�;�|3@��u,�5|3@h� @h� @�YY��t�E����������5<0@�|3@;�uh� @h� @�lYY�|3@9]�uSW�8 @9�3@th�3@�Y��t
SjS��3@�$0@�
� @��5$0@�5(0@�5 0@�������80@9,0@u7P�� @�E��	�M�PQ�YYËe�E�80@3�9,0@uP�h @9<0@u�� @�E������80@�øMZf9@t3��M�<@��@�8PEu��H��t��uՃ��v�3�9����xtv�3�9������j�,0@�p @j��l @YY��3@��3@�� @�
t3@��� @�
p3@��� @��x3@�V��=0@uh�@�� @Y�g�=0@�u	j��� @Y3���{�����U���(�H1@�
D1@�@1@�<1@�581@�=41@f�`1@f�
T1@f�01@f�,1@f�%(1@f�-$1@��X1@�E�L1@�E�P1@�E�\1@������0@�P1@�L0@�@0@	��D0@�0@������0@������ @��0@j�?Yj�  @h!@�$ @�=�0@uj�Yh	��( @P�, @�Ë�U��E��8csm�u*�xu$�@= �t=!�t="�t=@�u��3�]�hH@�  @3��%� @jh("@�b�5�3@�5� @��Y�E��u�u�� @Y�gj�Y�e��5�3@�։E�5�3@��YY�E�E�P�E�P�u�5l @��YP�U�E�u�֣�3@�u�փ���3@�E������	�E���j�YË�U��u�N��������YH]Ë�V��!@��!@W��;�s���t�Ѓ�;�r�_^Ë�V�"@�"@W��;�s���t�Ѓ�;�r�_^�%� @���̋�U��M�MZf9t3�]ËA<��8PEu�3ҹf9H�‹�]�����������̋�U��E�H<��ASV�q3�W�D��v�}�H;�r	�X�;�r
B��(;�r�3�_^[]������������̋�U��j�hH"@he@d�P��SVW�0@1E�3�P�E�d��e��E�h@�*�������tU�E-@Ph@�P�������t;�@$���Ѓ��E������M�d�
Y_^[��]ËE��3�=��‹�Ëe��E�����3��M�d�
Y_^[��]��%� @�%� @��he@d�5�D$�l$�l$+�SVW�0@1E�3�P�e�u��E��E������E��E�d�ËM�d�
Y__^[��]Q�U��u�u�u�uh�@h0@����]�Vhh3�V������t
VVVVV����^�3��U����0@�e��e�SW�N�@����;�t
��t	�У0@�`V�E�P�< @�u�3u�� @3� @3� @3�E�P� @�E�3E�3�;�u�O�@����u����50@�։50@^_[��%t @�%x @�%| @�%� @�%� @�%� @�%� @�%� @�%� @Pd�5�D$+d$SVW�(��0@3�P�E�u��E������E�d�ËM�d�
Y__^[��]QËM�3���������M�%T @�T$�B�J�3�����J�3�����l"@�s����#�#�#�)r)b)H)4))�(�(�(�(�(�(�)�#�$%�%&d&�&�$('�'�'�'�'(((6(�'H(Z(t(�('''�'�'l'^'R'F'>'>(0'�'�)�@W@�@�MoOl�!�@0@�0@bad allocationH0@�!@RSDSь���J�!���LZc:\users\seld\documents\visual studio 2010\Projects\hiddeninp\Release\hiddeninp.pdbe������������@@�����������:@������������@�@�����@"�d"@�"�# $#�&D H#(h �#�#�#�)r)b)H)4))�(�(�(�(�(�(�)�#�$%�%&d&�&�$('�'�'�'�'(((6(�'H(Z(t(�('''�'�'l'^'R'F'>'>(0'�'�)�GetConsoleMode�SetConsoleMode;GetStdHandleKERNEL32.dll??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z�?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@AJ?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A�??$getline@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@0@AAV10@AAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z_??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ{??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ�?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@ZMSVCP90.dll_amsg_exit�__getmainargs,_cexit|_exitf_XcptFilter�exit�__initenv_initterm_initterm_e<_configthreadlocale�__setusermatherr_adjust_fdiv�__p__commode�__p__fmodej_encode_pointer�__set_app_typeK_crt_debugger_hookC?terminate@@YAXXZMSVCR90.dll�_unlock�__dllonexitv_lock_onexit`_decode_pointers_except_handler4_common_invoke_watson?_controlfp_s�InterlockedExchange!Sleep�InterlockedCompareExchange-TerminateProcess�GetCurrentProcess>UnhandledExceptionFilterSetUnhandledExceptionFilter�IsDebuggerPresentTQueryPerformanceCounterfGetTickCount�GetCurrentThreadId�GetCurrentProcessIdOGetSystemTimeAsFileTimes__CxxFrameHandler3N�@���D������������$!@ �8�P�h�	�	��@(��CV�(4VS_VERSION_INFO���StringFileInfob040904b0�QFileDescriptionReads from stdin without leaking info to the terminal and outputs back to stdout6FileVersion1, 0, 0, 08InternalNamehiddeninputPLegalCopyrightJordi Boggiano - 2012HOriginalFilenamehiddeninput.exe:
ProductNameHidden Input:ProductVersion1, 0, 0, 0DVarFileInfo$Translation	�<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING@00!0/080F0L0T0^0d0n0{0�0�0�0�0�0�0�0�0�0�0�0�0�01#1-1@1J1O1T1v1{1�1�1�1�1�1�1�1�1�1�1�1�1�1�12"2*23292A2M2_2j2p2�2�2�2�2�2�2�2�2�2�2�2333%303N3T3Z3`3f3l3s3z3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�3�34444%4;4B4�4�4�4�4�4�4�4�4�4�45!5^5c5�5�5�5H6M6_6}6�6�677
7*7w7|7�7�7�7�78
88=8E8P8V8\8b8h8n8t8z8�8�8�89 $�0�0�01 1t1x12 2@2\2`2h2t200PK�`�\�Ƙ�7@7@2pear/Symfony/Component/Console/Command/Command.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Descriptor\TextDescriptor;
use Symfony\Component\Console\Descriptor\XmlDescriptor;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Helper\HelperSet;

/**
 * Base class for all commands.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Command
{
    private $application;
    private $name;
    private $aliases = array();
    private $definition;
    private $help;
    private $description;
    private $ignoreValidationErrors = false;
    private $applicationDefinitionMerged = false;
    private $applicationDefinitionMergedWithArgs = false;
    private $code;
    private $synopsis;
    private $helperSet;

    /**
     * Constructor.
     *
     * @param string|null $name The name of the command; passing null means it must be set in configure()
     *
     * @throws \LogicException When the command name is empty
     *
     * @api
     */
    public function __construct($name = null)
    {
        $this->definition = new InputDefinition();

        if (null !== $name) {
            $this->setName($name);
        }

        $this->configure();

        if (!$this->name) {
            throw new \LogicException('The command name cannot be empty.');
        }
    }

    /**
     * Ignores validation errors.
     *
     * This is mainly useful for the help command.
     */
    public function ignoreValidationErrors()
    {
        $this->ignoreValidationErrors = true;
    }

    /**
     * Sets the application instance for this command.
     *
     * @param Application $application An Application instance
     *
     * @api
     */
    public function setApplication(Application $application = null)
    {
        $this->application = $application;
        if ($application) {
            $this->setHelperSet($application->getHelperSet());
        } else {
            $this->helperSet = null;
        }
    }

    /**
     * Sets the helper set.
     *
     * @param HelperSet $helperSet A HelperSet instance
     */
    public function setHelperSet(HelperSet $helperSet)
    {
        $this->helperSet = $helperSet;
    }

    /**
     * Gets the helper set.
     *
     * @return HelperSet A HelperSet instance
     */
    public function getHelperSet()
    {
        return $this->helperSet;
    }

    /**
     * Gets the application instance for this command.
     *
     * @return Application An Application instance
     *
     * @api
     */
    public function getApplication()
    {
        return $this->application;
    }

    /**
     * Checks whether the command is enabled or not in the current environment
     *
     * Override this to check for x or y and return false if the command can not
     * run properly under the current conditions.
     *
     * @return Boolean
     */
    public function isEnabled()
    {
        return true;
    }

    /**
     * Configures the current command.
     */
    protected function configure()
    {
    }

    /**
     * Executes the current command.
     *
     * This method is not abstract because you can use this class
     * as a concrete class. In this case, instead of defining the
     * execute() method, you set the code to execute by passing
     * a Closure to the setCode() method.
     *
     * @param InputInterface  $input  An InputInterface instance
     * @param OutputInterface $output An OutputInterface instance
     *
     * @return null|integer null or 0 if everything went fine, or an error code
     *
     * @throws \LogicException When this abstract method is not implemented
     * @see    setCode()
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        throw new \LogicException('You must override the execute() method in the concrete command class.');
    }

    /**
     * Interacts with the user.
     *
     * @param InputInterface  $input  An InputInterface instance
     * @param OutputInterface $output An OutputInterface instance
     */
    protected function interact(InputInterface $input, OutputInterface $output)
    {
    }

    /**
     * Initializes the command just after the input has been validated.
     *
     * This is mainly useful when a lot of commands extends one main command
     * where some things need to be initialized based on the input arguments and options.
     *
     * @param InputInterface  $input  An InputInterface instance
     * @param OutputInterface $output An OutputInterface instance
     */
    protected function initialize(InputInterface $input, OutputInterface $output)
    {
    }

    /**
     * Runs the command.
     *
     * The code to execute is either defined directly with the
     * setCode() method or by overriding the execute() method
     * in a sub-class.
     *
     * @param InputInterface  $input  An InputInterface instance
     * @param OutputInterface $output An OutputInterface instance
     *
     * @return integer The command exit code
     *
     * @throws \Exception
     *
     * @see setCode()
     * @see execute()
     *
     * @api
     */
    public function run(InputInterface $input, OutputInterface $output)
    {
        // force the creation of the synopsis before the merge with the app definition
        $this->getSynopsis();

        // add the application arguments and options
        $this->mergeApplicationDefinition();

        // bind the input against the command specific arguments/options
        try {
            $input->bind($this->definition);
        } catch (\Exception $e) {
            if (!$this->ignoreValidationErrors) {
                throw $e;
            }
        }

        $this->initialize($input, $output);

        if ($input->isInteractive()) {
            $this->interact($input, $output);
        }

        $input->validate();

        if ($this->code) {
            $statusCode = call_user_func($this->code, $input, $output);
        } else {
            $statusCode = $this->execute($input, $output);
        }

        return is_numeric($statusCode) ? (int) $statusCode : 0;
    }

    /**
     * Sets the code to execute when running this command.
     *
     * If this method is used, it overrides the code defined
     * in the execute() method.
     *
     * @param callable $code A callable(InputInterface $input, OutputInterface $output)
     *
     * @return Command The current instance
     *
     * @throws \InvalidArgumentException
     *
     * @see execute()
     *
     * @api
     */
    public function setCode($code)
    {
        if (!is_callable($code)) {
            throw new \InvalidArgumentException('Invalid callable provided to Command::setCode.');
        }

        $this->code = $code;

        return $this;
    }

    /**
     * Merges the application definition with the command definition.
     *
     * This method is not part of public API and should not be used directly.
     *
     * @param Boolean $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments
     */
    public function mergeApplicationDefinition($mergeArgs = true)
    {
        if (null === $this->application || (true === $this->applicationDefinitionMerged && ($this->applicationDefinitionMergedWithArgs || !$mergeArgs))) {
            return;
        }

        if ($mergeArgs) {
            $currentArguments = $this->definition->getArguments();
            $this->definition->setArguments($this->application->getDefinition()->getArguments());
            $this->definition->addArguments($currentArguments);
        }

        $this->definition->addOptions($this->application->getDefinition()->getOptions());

        $this->applicationDefinitionMerged = true;
        if ($mergeArgs) {
            $this->applicationDefinitionMergedWithArgs = true;
        }
    }

    /**
     * Sets an array of argument and option instances.
     *
     * @param array|InputDefinition $definition An array of argument and option instances or a definition instance
     *
     * @return Command The current instance
     *
     * @api
     */
    public function setDefinition($definition)
    {
        if ($definition instanceof InputDefinition) {
            $this->definition = $definition;
        } else {
            $this->definition->setDefinition($definition);
        }

        $this->applicationDefinitionMerged = false;

        return $this;
    }

    /**
     * Gets the InputDefinition attached to this Command.
     *
     * @return InputDefinition An InputDefinition instance
     *
     * @api
     */
    public function getDefinition()
    {
        return $this->definition;
    }

    /**
     * Gets the InputDefinition to be used to create XML and Text representations of this Command.
     *
     * Can be overridden to provide the original command representation when it would otherwise
     * be changed by merging with the application InputDefinition.
     *
     * This method is not part of public API and should not be used directly.
     *
     * @return InputDefinition An InputDefinition instance
     */
    public function getNativeDefinition()
    {
        return $this->getDefinition();
    }

    /**
     * Adds an argument.
     *
     * @param string  $name        The argument name
     * @param integer $mode        The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
     * @param string  $description A description text
     * @param mixed   $default     The default value (for InputArgument::OPTIONAL mode only)
     *
     * @return Command The current instance
     *
     * @api
     */
    public function addArgument($name, $mode = null, $description = '', $default = null)
    {
        $this->definition->addArgument(new InputArgument($name, $mode, $description, $default));

        return $this;
    }

    /**
     * Adds an option.
     *
     * @param string  $name        The option name
     * @param string  $shortcut    The shortcut (can be null)
     * @param integer $mode        The option mode: One of the InputOption::VALUE_* constants
     * @param string  $description A description text
     * @param mixed   $default     The default value (must be null for InputOption::VALUE_REQUIRED or InputOption::VALUE_NONE)
     *
     * @return Command The current instance
     *
     * @api
     */
    public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
    {
        $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default));

        return $this;
    }

    /**
     * Sets the name of the command.
     *
     * This method can set both the namespace and the name if
     * you separate them by a colon (:)
     *
     *     $command->setName('foo:bar');
     *
     * @param string $name The command name
     *
     * @return Command The current instance
     *
     * @throws \InvalidArgumentException When the name is invalid
     *
     * @api
     */
    public function setName($name)
    {
        $this->validateName($name);

        $this->name = $name;

        return $this;
    }

    /**
     * Returns the command name.
     *
     * @return string The command name
     *
     * @api
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Sets the description for the command.
     *
     * @param string $description The description for the command
     *
     * @return Command The current instance
     *
     * @api
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Returns the description for the command.
     *
     * @return string The description for the command
     *
     * @api
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Sets the help for the command.
     *
     * @param string $help The help for the command
     *
     * @return Command The current instance
     *
     * @api
     */
    public function setHelp($help)
    {
        $this->help = $help;

        return $this;
    }

    /**
     * Returns the help for the command.
     *
     * @return string The help for the command
     *
     * @api
     */
    public function getHelp()
    {
        return $this->help;
    }

    /**
     * Returns the processed help for the command replacing the %command.name% and
     * %command.full_name% patterns with the real values dynamically.
     *
     * @return string  The processed help for the command
     */
    public function getProcessedHelp()
    {
        $name = $this->name;

        $placeholders = array(
            '%command.name%',
            '%command.full_name%'
        );
        $replacements = array(
            $name,
            $_SERVER['PHP_SELF'].' '.$name
        );

        return str_replace($placeholders, $replacements, $this->getHelp());
    }

    /**
     * Sets the aliases for the command.
     *
     * @param array $aliases An array of aliases for the command
     *
     * @return Command The current instance
     *
     * @throws \InvalidArgumentException When an alias is invalid
     *
     * @api
     */
    public function setAliases($aliases)
    {
        foreach ($aliases as $alias) {
            $this->validateName($alias);
        }

        $this->aliases = $aliases;

        return $this;
    }

    /**
     * Returns the aliases for the command.
     *
     * @return array An array of aliases for the command
     *
     * @api
     */
    public function getAliases()
    {
        return $this->aliases;
    }

    /**
     * Returns the synopsis for the command.
     *
     * @return string The synopsis
     */
    public function getSynopsis()
    {
        if (null === $this->synopsis) {
            $this->synopsis = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis()));
        }

        return $this->synopsis;
    }

    /**
     * Gets a helper instance by name.
     *
     * @param string $name The helper name
     *
     * @return mixed The helper value
     *
     * @throws \InvalidArgumentException if the helper is not defined
     *
     * @api
     */
    public function getHelper($name)
    {
        return $this->helperSet->get($name);
    }

    /**
     * Returns a text representation of the command.
     *
     * @return string A string representing the command
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0.
     */
    public function asText()
    {
        $descriptor = new TextDescriptor();
        $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true);
        $descriptor->describe($output, $this, array('raw_output' => true));

        return $output->fetch();
    }

    /**
     * Returns an XML representation of the command.
     *
     * @param Boolean $asDom Whether to return a DOM or an XML string
     *
     * @return string|\DOMDocument An XML string representing the command
     *
     * @deprecated Deprecated since version 2.3, to be removed in 3.0.
     */
    public function asXml($asDom = false)
    {
        $descriptor = new XmlDescriptor();

        if ($asDom) {
            return $descriptor->getCommandDocument($this);
        }

        $output = new BufferedOutput();
        $descriptor->describe($output, $this);

        return $output->fetch();
    }

    /**
     * Validates a command name.
     *
     * It must be non-empty and parts can optionally be separated by ":".
     *
     * @param string $name
     *
     * @throws \InvalidArgumentException When the name is invalid
     */
    private function validateName($name)
    {
        if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) {
            throw new \InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name));
        }
    }
}
PK�`�\ x��
�
6pear/Symfony/Component/Console/Command/ListCommand.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Helper\DescriptorHelper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputDefinition;

/**
 * ListCommand displays the list of all available commands for the application.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ListCommand extends Command
{
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this
            ->setName('list')
            ->setDefinition($this->createDefinition())
            ->setDescription('Lists commands')
            ->setHelp(<<<EOF
The <info>%command.name%</info> command lists all commands:

  <info>php %command.full_name%</info>

You can also display the commands for a specific namespace:

  <info>php %command.full_name% test</info>

You can also output the information in other formats by using the <comment>--format</comment> option:

  <info>php %command.full_name% --format=xml</info>

It's also possible to get raw list of commands (useful for embedding command runner):

  <info>php %command.full_name% --raw</info>
EOF
            )
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function getNativeDefinition()
    {
        return $this->createDefinition();
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if ($input->getOption('xml')) {
            $input->setOption('format', 'xml');
        }

        $helper = new DescriptorHelper();
        $helper->describe($output, $this->getApplication(), array(
            'format'    => $input->getOption('format'),
            'raw_text'  => $input->getOption('raw'),
            'namespace' => $input->getArgument('namespace'),
        ));
    }

    /**
     * {@inheritdoc}
     */
    private function createDefinition()
    {
        return new InputDefinition(array(
            new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'),
            new InputOption('xml', null, InputOption::VALUE_NONE, 'To output list as XML'),
            new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'),
            new InputOption('format', null, InputOption::VALUE_REQUIRED, 'To output list in other formats', 'txt'),
        ));
    }
}
PK�`�\�m_
_
6pear/Symfony/Component/Console/Command/HelpCommand.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Command;

use Symfony\Component\Console\Helper\DescriptorHelper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * HelpCommand displays the help for a given command.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class HelpCommand extends Command
{
    private $command;

    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this->ignoreValidationErrors();

        $this
            ->setName('help')
            ->setDefinition(array(
                new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'),
                new InputOption('xml', null, InputOption::VALUE_NONE, 'To output help as XML'),
                new InputOption('format', null, InputOption::VALUE_REQUIRED, 'To output help in other formats', 'txt'),
                new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'),
            ))
            ->setDescription('Displays help for a command')
            ->setHelp(<<<EOF
The <info>%command.name%</info> command displays help for a given command:

  <info>php %command.full_name% list</info>

You can also output the help in other formats by using the <comment>--format</comment> option:

  <info>php %command.full_name% --format=xml list</info>

To display the list of available commands, please use the <info>list</info> command.
EOF
            )
        ;
    }

    /**
     * Sets the command
     *
     * @param Command $command The command to set
     */
    public function setCommand(Command $command)
    {
        $this->command = $command;
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if (null === $this->command) {
            $this->command = $this->getApplication()->find($input->getArgument('command_name'));
        }

        if ($input->getOption('xml')) {
            $input->setOption('format', 'xml');
        }

        $helper = new DescriptorHelper();
        $helper->describe($output, $this->command, array(
            'format' => $input->getOption('format'),
            'raw'    => $input->getOption('raw'),
        ));

        $this->command = null;
    }
}
PK�`�\��0�KK@pear/Symfony/Component/Console/Output/ConsoleOutputInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

/**
 * ConsoleOutputInterface is the interface implemented by ConsoleOutput class.
 * This adds information about stderr output stream.
 *
 * @author Dariusz Górecki <darek.krk@gmail.com>
 */
interface ConsoleOutputInterface extends OutputInterface
{
    /**
     * Gets the OutputInterface for errors.
     *
     * @return OutputInterface
     */
    public function getErrorOutput();

    /**
     * Sets the OutputInterface used for errors.
     *
     * @param OutputInterface $error
     */
    public function setErrorOutput(OutputInterface $error);
}
PK�`�\F�$_��4pear/Symfony/Component/Console/Output/NullOutput.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Formatter\OutputFormatterInterface;

/**
 * NullOutput suppresses all output.
 *
 *     $output = new NullOutput();
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Tobias Schultze <http://tobion.de>
 *
 * @api
 */
class NullOutput implements OutputInterface
{
    /**
     * {@inheritdoc}
     */
    public function setFormatter(OutputFormatterInterface $formatter)
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function getFormatter()
    {
        // to comply with the interface we must return a OutputFormatterInterface
        return new OutputFormatter();
    }

    /**
     * {@inheritdoc}
     */
    public function setDecorated($decorated)
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function isDecorated()
    {
        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function setVerbosity($level)
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function getVerbosity()
    {
        return self::VERBOSITY_QUIET;
    }

    /**
     * {@inheritdoc}
     */
    public function writeln($messages, $type = self::OUTPUT_NORMAL)
    {
        // do nothing
    }

    /**
     * {@inheritdoc}
     */
    public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL)
    {
        // do nothing
    }
}
PK�`�\��ϱ}}7pear/Symfony/Component/Console/Output/ConsoleOutput.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;

/**
 * ConsoleOutput is the default class for all CLI output. It uses STDOUT.
 *
 * This class is a convenient wrapper around `StreamOutput`.
 *
 *     $output = new ConsoleOutput();
 *
 * This is equivalent to:
 *
 *     $output = new StreamOutput(fopen('php://stdout', 'w'));
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface
{
    private $stderr;

    /**
     * Constructor.
     *
     * @param integer                       $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
     * @param Boolean|null                  $decorated Whether to decorate messages (null for auto-guessing)
     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
     *
     * @api
     */
    public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null)
    {
        $outputStream = 'php://stdout';
        if (!$this->hasStdoutSupport()) {
            $outputStream = 'php://output';
        }

        parent::__construct(fopen($outputStream, 'w'), $verbosity, $decorated, $formatter);

        $this->stderr = new StreamOutput(fopen('php://stderr', 'w'), $verbosity, $decorated, $formatter);
    }

    /**
     * {@inheritdoc}
     */
    public function setDecorated($decorated)
    {
        parent::setDecorated($decorated);
        $this->stderr->setDecorated($decorated);
    }

    /**
     * {@inheritdoc}
     */
    public function setFormatter(OutputFormatterInterface $formatter)
    {
        parent::setFormatter($formatter);
        $this->stderr->setFormatter($formatter);
    }

    /**
     * {@inheritdoc}
     */
    public function setVerbosity($level)
    {
        parent::setVerbosity($level);
        $this->stderr->setVerbosity($level);
    }

    /**
     * {@inheritdoc}
     */
    public function getErrorOutput()
    {
        return $this->stderr;
    }

    /**
     * {@inheritdoc}
     */
    public function setErrorOutput(OutputInterface $error)
    {
        $this->stderr = $error;
    }

    /**
     * Returns true if current environment supports writing console output to
     * STDOUT.
     *
     * IBM iSeries (OS400) exhibits character-encoding issues when writing to
     * STDOUT and doesn't properly convert ASCII to EBCDIC, resulting in garbage
     * output.
     *
     * @return boolean
     */
    protected function hasStdoutSupport()
    {
        return ('OS400' != php_uname('s'));
    }
}
PK�`�\�,Q�MM6pear/Symfony/Component/Console/Output/StreamOutput.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;

/**
 * StreamOutput writes the output to a given stream.
 *
 * Usage:
 *
 * $output = new StreamOutput(fopen('php://stdout', 'w'));
 *
 * As `StreamOutput` can use any stream, you can also use a file:
 *
 * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false));
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class StreamOutput extends Output
{
    private $stream;

    /**
     * Constructor.
     *
     * @param mixed                         $stream    A stream resource
     * @param integer                       $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
     * @param Boolean|null                  $decorated Whether to decorate messages (null for auto-guessing)
     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
     *
     * @throws \InvalidArgumentException When first argument is not a real stream
     *
     * @api
     */
    public function __construct($stream, $verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null)
    {
        if (!is_resource($stream) || 'stream' !== get_resource_type($stream)) {
            throw new \InvalidArgumentException('The StreamOutput class needs a stream as its first argument.');
        }

        $this->stream = $stream;

        if (null === $decorated) {
            $decorated = $this->hasColorSupport();
        }

        parent::__construct($verbosity, $decorated, $formatter);
    }

    /**
     * Gets the stream attached to this StreamOutput instance.
     *
     * @return resource A stream resource
     */
    public function getStream()
    {
        return $this->stream;
    }

    /**
     * {@inheritdoc}
     */
    protected function doWrite($message, $newline)
    {
        if (false === @fwrite($this->stream, $message.($newline ? PHP_EOL : ''))) {
            // @codeCoverageIgnoreStart
            // should never happen
            throw new \RuntimeException('Unable to write output.');
            // @codeCoverageIgnoreEnd
        }

        fflush($this->stream);
    }

    /**
     * Returns true if the stream supports colorization.
     *
     * Colorization is disabled if not supported by the stream:
     *
     *  -  Windows without Ansicon and ConEmu
     *  -  non tty consoles
     *
     * @return Boolean true if the stream supports colorization, false otherwise
     */
    protected function hasColorSupport()
    {
        // @codeCoverageIgnoreStart
        if (DIRECTORY_SEPARATOR == '\\') {
            return false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI');
        }

        return function_exists('posix_isatty') && @posix_isatty($this->stream);
        // @codeCoverageIgnoreEnd
    }
}
PK�`�\s�Q;;0pear/Symfony/Component/Console/Output/Output.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;
use Symfony\Component\Console\Formatter\OutputFormatter;

/**
 * Base class for output classes.
 *
 * There are five levels of verbosity:
 *
 *  * normal: no option passed (normal output)
 *  * verbose: -v (more output)
 *  * very verbose: -vv (highly extended output)
 *  * debug: -vvv (all debug output)
 *  * quiet: -q (no output)
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
abstract class Output implements OutputInterface
{
    private $verbosity;
    private $formatter;

    /**
     * Constructor.
     *
     * @param integer                       $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface)
     * @param Boolean                       $decorated Whether to decorate messages
     * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter)
     *
     * @api
     */
    public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = false, OutputFormatterInterface $formatter = null)
    {
        $this->verbosity = null === $verbosity ? self::VERBOSITY_NORMAL : $verbosity;
        $this->formatter = $formatter ?: new OutputFormatter();
        $this->formatter->setDecorated($decorated);
    }

    /**
     * {@inheritdoc}
     */
    public function setFormatter(OutputFormatterInterface $formatter)
    {
        $this->formatter = $formatter;
    }

    /**
     * {@inheritdoc}
     */
    public function getFormatter()
    {
        return $this->formatter;
    }

    /**
     * {@inheritdoc}
     */
    public function setDecorated($decorated)
    {
        $this->formatter->setDecorated($decorated);
    }

    /**
     * {@inheritdoc}
     */
    public function isDecorated()
    {
        return $this->formatter->isDecorated();
    }

    /**
     * {@inheritdoc}
     */
    public function setVerbosity($level)
    {
        $this->verbosity = (int) $level;
    }

    /**
     * {@inheritdoc}
     */
    public function getVerbosity()
    {
        return $this->verbosity;
    }

    public function isQuiet()
    {
        return self::VERBOSITY_QUIET === $this->verbosity;
    }

    public function isVerbose()
    {
        return self::VERBOSITY_VERBOSE <= $this->verbosity;
    }

    public function isVeryVerbose()
    {
        return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity;
    }

    public function isDebug()
    {
        return self::VERBOSITY_DEBUG <= $this->verbosity;
    }

    /**
     * {@inheritdoc}
     */
    public function writeln($messages, $type = self::OUTPUT_NORMAL)
    {
        $this->write($messages, true, $type);
    }

    /**
     * {@inheritdoc}
     */
    public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL)
    {
        if (self::VERBOSITY_QUIET === $this->verbosity) {
            return;
        }

        $messages = (array) $messages;

        foreach ($messages as $message) {
            switch ($type) {
                case OutputInterface::OUTPUT_NORMAL:
                    $message = $this->formatter->format($message);
                    break;
                case OutputInterface::OUTPUT_RAW:
                    break;
                case OutputInterface::OUTPUT_PLAIN:
                    $message = strip_tags($this->formatter->format($message));
                    break;
                default:
                    throw new \InvalidArgumentException(sprintf('Unknown output type given (%s)', $type));
            }

            $this->doWrite($message, $newline);
        }
    }

    /**
     * Writes a message to the output.
     *
     * @param string  $message A message to write to the output
     * @param Boolean $newline Whether to add a newline or not
     */
    abstract protected function doWrite($message, $newline);
}
PK�`�\��z�MM9pear/Symfony/Component/Console/Output/OutputInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

use Symfony\Component\Console\Formatter\OutputFormatterInterface;

/**
 * OutputInterface is the interface implemented by all Output classes.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface OutputInterface
{
    const VERBOSITY_QUIET        = 0;
    const VERBOSITY_NORMAL       = 1;
    const VERBOSITY_VERBOSE      = 2;
    const VERBOSITY_VERY_VERBOSE = 3;
    const VERBOSITY_DEBUG        = 4;

    const OUTPUT_NORMAL = 0;
    const OUTPUT_RAW    = 1;
    const OUTPUT_PLAIN  = 2;

    /**
     * Writes a message to the output.
     *
     * @param string|array $messages The message as an array of lines or a single string
     * @param Boolean      $newline  Whether to add a newline
     * @param integer      $type     The type of output (one of the OUTPUT constants)
     *
     * @throws \InvalidArgumentException When unknown output type is given
     *
     * @api
     */
    public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL);

    /**
     * Writes a message to the output and adds a newline at the end.
     *
     * @param string|array $messages The message as an array of lines of a single string
     * @param integer      $type     The type of output (one of the OUTPUT constants)
     *
     * @throws \InvalidArgumentException When unknown output type is given
     *
     * @api
     */
    public function writeln($messages, $type = self::OUTPUT_NORMAL);

    /**
     * Sets the verbosity of the output.
     *
     * @param integer $level The level of verbosity (one of the VERBOSITY constants)
     *
     * @api
     */
    public function setVerbosity($level);

    /**
     * Gets the current verbosity of the output.
     *
     * @return integer The current level of verbosity (one of the VERBOSITY constants)
     *
     * @api
     */
    public function getVerbosity();

    /**
     * Sets the decorated flag.
     *
     * @param Boolean $decorated Whether to decorate the messages
     *
     * @api
     */
    public function setDecorated($decorated);

    /**
     * Gets the decorated flag.
     *
     * @return Boolean true if the output will decorate messages, false otherwise
     *
     * @api
     */
    public function isDecorated();

    /**
     * Sets output formatter.
     *
     * @param OutputFormatterInterface $formatter
     *
     * @api
     */
    public function setFormatter(OutputFormatterInterface $formatter);

    /**
     * Returns current output formatter instance.
     *
     * @return  OutputFormatterInterface
     *
     * @api
     */
    public function getFormatter();
}
PK�`�\t|X4hh8pear/Symfony/Component/Console/Output/BufferedOutput.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Output;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class BufferedOutput extends Output
{
    /**
     * @var string
     */
    private $buffer = '';

    /**
     * Empties buffer and returns its content.
     *
     * @return string
     */
    public function fetch()
    {
        $content = $this->buffer;
        $this->buffer = '';

        return $content;
    }

    /**
     * {@inheritdoc}
     */
    protected function doWrite($message, $newline)
    {
        $this->buffer .= $message;

        if ($newline) {
            $this->buffer .= "\n";
        }
    }
}
PK�`�\�2�]��Mpear/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;

/**
 * AbstractProxy.
 *
 * @author Drak <drak@zikula.org>
 */
abstract class AbstractProxy
{
    /**
     * Flag if handler wraps an internal PHP session handler (using \SessionHandler).
     *
     * @var boolean
     */
    protected $wrapper = false;

    /**
     * @var boolean
     */
    protected $active = false;

    /**
     * @var string
     */
    protected $saveHandlerName;

    /**
     * Gets the session.save_handler name.
     *
     * @return string
     */
    public function getSaveHandlerName()
    {
        return $this->saveHandlerName;
    }

    /**
     * Is this proxy handler and instance of \SessionHandlerInterface.
     *
     * @return boolean
     */
    public function isSessionHandlerInterface()
    {
        return ($this instanceof \SessionHandlerInterface);
    }

    /**
     * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler.
     *
     * @return Boolean
     */
    public function isWrapper()
    {
        return $this->wrapper;
    }

    /**
     * Has a session started?
     *
     * @return Boolean
     */
    public function isActive()
    {
        if (version_compare(phpversion(), '5.4.0', '>=')) {
            return $this->active = \PHP_SESSION_ACTIVE === session_status();
        }

        return $this->active;
    }

    /**
     * Sets the active flag.
     *
     * Has no effect under PHP 5.4+ as status is detected
     * automatically in isActive()
     *
     * @internal
     *
     * @param Boolean $flag
     *
     * @throws \LogicException
     */
    public function setActive($flag)
    {
        if (version_compare(phpversion(), '5.4.0', '>=')) {
            throw new \LogicException('This method is disabled in PHP 5.4.0+');
        }

        $this->active = (bool) $flag;
    }

    /**
     * Gets the session ID.
     *
     * @return string
     */
    public function getId()
    {
        return session_id();
    }

    /**
     * Sets the session ID.
     *
     * @param string $id
     *
     * @throws \LogicException
     */
    public function setId($id)
    {
        if ($this->isActive()) {
            throw new \LogicException('Cannot change the ID of an active session');
        }

        session_id($id);
    }

    /**
     * Gets the session name.
     *
     * @return string
     */
    public function getName()
    {
        return session_name();
    }

    /**
     * Sets the session name.
     *
     * @param string $name
     *
     * @throws \LogicException
     */
    public function setName($name)
    {
        if ($this->isActive()) {
            throw new \LogicException('Cannot change the name of an active session');
        }

        session_name($name);
    }
}
PK�`�\mwȡ��Spear/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;

/**
 * SessionHandler proxy.
 *
 * @author Drak <drak@zikula.org>
 */
class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface
{
    /**
     * @var \SessionHandlerInterface
     */
    protected $handler;

    /**
     * Constructor.
     *
     * @param \SessionHandlerInterface $handler
     */
    public function __construct(\SessionHandlerInterface $handler)
    {
        $this->handler = $handler;
        $this->wrapper = ($handler instanceof \SessionHandler);
        $this->saveHandlerName = $this->wrapper ? ini_get('session.save_handler') : 'user';
    }

    // \SessionHandlerInterface

    /**
     * {@inheritdoc}
     */
    public function open($savePath, $sessionName)
    {
        $return = (bool) $this->handler->open($savePath, $sessionName);

        if (true === $return) {
            $this->active = true;
        }

        return $return;
    }

    /**
     * {@inheritdoc}
     */
    public function close()
    {
        $this->active = false;

        return (bool) $this->handler->close();
    }

    /**
     * {@inheritdoc}
     */
    public function read($id)
    {
        return (string) $this->handler->read($id);
    }

    /**
     * {@inheritdoc}
     */
    public function write($id, $data)
    {
        return (bool) $this->handler->write($id, $data);
    }

    /**
     * {@inheritdoc}
     */
    public function destroy($id)
    {
        return (bool) $this->handler->destroy($id);
    }

    /**
     * {@inheritdoc}
     */
    public function gc($maxlifetime)
    {
        return (bool) $this->handler->gc($maxlifetime);
    }
}
PK�`�\�A��Kpear/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;

/**
 * NativeProxy.
 *
 * This proxy is built-in session handlers in PHP 5.3.x
 *
 * @author Drak <drak@zikula.org>
 */
class NativeProxy extends AbstractProxy
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        // this makes an educated guess as to what the handler is since it should already be set.
        $this->saveHandlerName = ini_get('session.save_handler');
    }

    /**
     * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler.
     *
     * @return Boolean False.
     */
    public function isWrapper()
    {
        return false;
    }
}
PK�`�\�zu00Qpear/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;

/**
 * Allows session to be started by PHP and managed by Symfony2
 *
 * @author Drak <drak@zikula.org>
 */
class PhpBridgeSessionStorage extends NativeSessionStorage
{
    /**
     * Constructor.
     *
     * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $handler
     * @param MetadataBag                                                      $metaBag MetadataBag
     */
    public function __construct($handler = null, MetadataBag $metaBag = null)
    {
        $this->setMetadataBag($metaBag);
        $this->setSaveHandler($handler);
    }

    /**
     * {@inheritdoc}
     */
    public function start()
    {
        if ($this->started && !$this->closed) {
            return true;
        }

        $this->loadSession();
        if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) {
            // This condition matches only PHP 5.3 + internal save handlers
            $this->saveHandler->setActive(true);
        }

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function clear()
    {
        // clear out the bags and nothing else that may be set
        // since the purpose of this driver is to share a handler
        foreach ($this->bags as $bag) {
            $bag->clear();
        }

        // reconnect the bags to the session
        $this->loadSession();
    }
}
PK�`�\��g_��Epear/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;

/**
 * Metadata container.
 *
 * Adds metadata to the session.
 *
 * @author Drak <drak@zikula.org>
 */
class MetadataBag implements SessionBagInterface
{
    const CREATED = 'c';
    const UPDATED = 'u';
    const LIFETIME = 'l';

    /**
     * @var string
     */
    private $name = '__metadata';

    /**
     * @var string
     */
    private $storageKey;

    /**
     * @var array
     */
    protected $meta = array(self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0);

    /**
     * Unix timestamp.
     *
     * @var integer
     */
    private $lastUsed;

    /**
     * @var integer
     */
    private $updateThreshold;

    /**
     * Constructor.
     *
     * @param string  $storageKey      The key used to store bag in the session.
     * @param integer $updateThreshold The time to wait between two UPDATED updates
     */
    public function __construct($storageKey = '_sf2_meta', $updateThreshold = 0)
    {
        $this->storageKey = $storageKey;
        $this->updateThreshold = $updateThreshold;
    }

    /**
     * {@inheritdoc}
     */
    public function initialize(array &$array)
    {
        $this->meta = &$array;

        if (isset($array[self::CREATED])) {
            $this->lastUsed = $this->meta[self::UPDATED];

            $timeStamp = time();
            if ($timeStamp - $array[self::UPDATED] >= $this->updateThreshold) {
                $this->meta[self::UPDATED] = $timeStamp;
            }
        } else {
            $this->stampCreated();
        }
    }

    /**
     * Gets the lifetime that the session cookie was set with.
     *
     * @return integer
     */
    public function getLifetime()
    {
        return $this->meta[self::LIFETIME];
    }

    /**
     * Stamps a new session's metadata.
     *
     * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value
     *                          will leave the system settings unchanged, 0 sets the cookie
     *                          to expire with browser session. Time is in seconds, and is
     *                          not a Unix timestamp.
     */
    public function stampNew($lifetime = null)
    {
        $this->stampCreated($lifetime);
    }

    /**
     * {@inheritdoc}
     */
    public function getStorageKey()
    {
        return $this->storageKey;
    }

    /**
     * Gets the created timestamp metadata.
     *
     * @return integer Unix timestamp
     */
    public function getCreated()
    {
        return $this->meta[self::CREATED];
    }

    /**
     * Gets the last used metadata.
     *
     * @return integer Unix timestamp
     */
    public function getLastUsed()
    {
        return $this->lastUsed;
    }

    /**
     * {@inheritdoc}
     */
    public function clear()
    {
        // nothing to do
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Sets name.
     *
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    private function stampCreated($lifetime = null)
    {
        $timeStamp = time();
        $this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp;
        $this->meta[self::LIFETIME] = (null === $lifetime) ? ini_get('session.cookie_lifetime') : $lifetime;
    }
}
PK�`�\�t�3�3Npear/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy;
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;

/**
 * This provides a base class for session attribute storage.
 *
 * @author Drak <drak@zikula.org>
 */
class NativeSessionStorage implements SessionStorageInterface
{
    /**
     * Array of SessionBagInterface
     *
     * @var SessionBagInterface[]
     */
    protected $bags;

    /**
     * @var Boolean
     */
    protected $started = false;

    /**
     * @var Boolean
     */
    protected $closed = false;

    /**
     * @var AbstractProxy
     */
    protected $saveHandler;

    /**
     * @var MetadataBag
     */
    protected $metadataBag;

    /**
     * Constructor.
     *
     * Depending on how you want the storage driver to behave you probably
     * want to override this constructor entirely.
     *
     * List of options for $options array with their defaults.
     * @see http://php.net/session.configuration for options
     * but we omit 'session.' from the beginning of the keys for convenience.
     *
     * ("auto_start", is not supported as it tells PHP to start a session before
     * PHP starts to execute user-land code. Setting during runtime has no effect).
     *
     * cache_limiter, "nocache" (use "0" to prevent headers from being sent entirely).
     * cookie_domain, ""
     * cookie_httponly, ""
     * cookie_lifetime, "0"
     * cookie_path, "/"
     * cookie_secure, ""
     * entropy_file, ""
     * entropy_length, "0"
     * gc_divisor, "100"
     * gc_maxlifetime, "1440"
     * gc_probability, "1"
     * hash_bits_per_character, "4"
     * hash_function, "0"
     * name, "PHPSESSID"
     * referer_check, ""
     * serialize_handler, "php"
     * use_cookies, "1"
     * use_only_cookies, "1"
     * use_trans_sid, "0"
     * upload_progress.enabled, "1"
     * upload_progress.cleanup, "1"
     * upload_progress.prefix, "upload_progress_"
     * upload_progress.name, "PHP_SESSION_UPLOAD_PROGRESS"
     * upload_progress.freq, "1%"
     * upload_progress.min-freq, "1"
     * url_rewriter.tags, "a=href,area=href,frame=src,form=,fieldset="
     *
     * @param array                                                            $options Session configuration options.
     * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $handler
     * @param MetadataBag                                                      $metaBag MetadataBag.
     */
    public function __construct(array $options = array(), $handler = null, MetadataBag $metaBag = null)
    {
        session_cache_limiter(''); // disable by default because it's managed by HeaderBag (if used)
        ini_set('session.use_cookies', 1);

        if (version_compare(phpversion(), '5.4.0', '>=')) {
            session_register_shutdown();
        } else {
            register_shutdown_function('session_write_close');
        }

        $this->setMetadataBag($metaBag);
        $this->setOptions($options);
        $this->setSaveHandler($handler);
    }

    /**
     * Gets the save handler instance.
     *
     * @return AbstractProxy
     */
    public function getSaveHandler()
    {
        return $this->saveHandler;
    }

    /**
     * {@inheritdoc}
     */
    public function start()
    {
        if ($this->started && !$this->closed) {
            return true;
        }

        if (version_compare(phpversion(), '5.4.0', '>=') && \PHP_SESSION_ACTIVE === session_status()) {
            throw new \RuntimeException('Failed to start the session: already started by PHP.');
        }

        if (version_compare(phpversion(), '5.4.0', '<') && isset($_SESSION) && session_id()) {
            // not 100% fool-proof, but is the most reliable way to determine if a session is active in PHP 5.3
            throw new \RuntimeException('Failed to start the session: already started by PHP ($_SESSION is set).');
        }

        if (ini_get('session.use_cookies') && headers_sent($file, $line)) {
            throw new \RuntimeException(sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line));
        }

        // ok to try and start the session
        if (!session_start()) {
            throw new \RuntimeException('Failed to start the session');
        }

        $this->loadSession();
        if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) {
            // This condition matches only PHP 5.3 with internal save handlers
            $this->saveHandler->setActive(true);
        }

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function getId()
    {
        if (!$this->started && !$this->closed) {
            return ''; // returning empty is consistent with session_id() behaviour
        }

        return $this->saveHandler->getId();
    }

    /**
     * {@inheritdoc}
     */
    public function setId($id)
    {
        $this->saveHandler->setId($id);
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->saveHandler->getName();
    }

    /**
     * {@inheritdoc}
     */
    public function setName($name)
    {
        $this->saveHandler->setName($name);
    }

    /**
     * {@inheritdoc}
     */
    public function regenerate($destroy = false, $lifetime = null)
    {
        if (null !== $lifetime) {
            ini_set('session.cookie_lifetime', $lifetime);
        }

        if ($destroy) {
            $this->metadataBag->stampNew();
        }

        $ret = session_regenerate_id($destroy);

        // workaround for https://bugs.php.net/bug.php?id=61470 as suggested by David Grudl
        if ('files' === $this->getSaveHandler()->getSaveHandlerName()) {
            session_write_close();
            if (isset($_SESSION)) {
                $backup = $_SESSION;
                session_start();
                $_SESSION = $backup;
            } else {
                session_start();
            }

            $this->loadSession();
        }

        return $ret;
    }

    /**
     * {@inheritdoc}
     */
    public function save()
    {
        session_write_close();

        if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) {
            // This condition matches only PHP 5.3 with internal save handlers
            $this->saveHandler->setActive(false);
        }

        $this->closed = true;
        $this->started = false;
    }

    /**
     * {@inheritdoc}
     */
    public function clear()
    {
        // clear out the bags
        foreach ($this->bags as $bag) {
            $bag->clear();
        }

        // clear out the session
        $_SESSION = array();

        // reconnect the bags to the session
        $this->loadSession();
    }

    /**
     * {@inheritdoc}
     */
    public function registerBag(SessionBagInterface $bag)
    {
        $this->bags[$bag->getName()] = $bag;
    }

    /**
     * {@inheritdoc}
     */
    public function getBag($name)
    {
        if (!isset($this->bags[$name])) {
            throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name));
        }

        if ($this->saveHandler->isActive() && !$this->started) {
            $this->loadSession();
        } elseif (!$this->started) {
            $this->start();
        }

        return $this->bags[$name];
    }

    /**
     * Sets the MetadataBag.
     *
     * @param MetadataBag $metaBag
     */
    public function setMetadataBag(MetadataBag $metaBag = null)
    {
        if (null === $metaBag) {
            $metaBag = new MetadataBag();
        }

        $this->metadataBag = $metaBag;
    }

    /**
     * Gets the MetadataBag.
     *
     * @return MetadataBag
     */
    public function getMetadataBag()
    {
        return $this->metadataBag;
    }

    /**
     * {@inheritdoc}
     */
    public function isStarted()
    {
        return $this->started;
    }

    /**
     * Sets session.* ini variables.
     *
     * For convenience we omit 'session.' from the beginning of the keys.
     * Explicitly ignores other ini keys.
     *
     * @param array $options Session ini directives array(key => value).
     *
     * @see http://php.net/session.configuration
     */
    public function setOptions(array $options)
    {
        $validOptions = array_flip(array(
            'cache_limiter', 'cookie_domain', 'cookie_httponly',
            'cookie_lifetime', 'cookie_path', 'cookie_secure',
            'entropy_file', 'entropy_length', 'gc_divisor',
            'gc_maxlifetime', 'gc_probability', 'hash_bits_per_character',
            'hash_function', 'name', 'referer_check',
            'serialize_handler', 'use_cookies',
            'use_only_cookies', 'use_trans_sid', 'upload_progress.enabled',
            'upload_progress.cleanup', 'upload_progress.prefix', 'upload_progress.name',
            'upload_progress.freq', 'upload_progress.min-freq', 'url_rewriter.tags',
        ));

        foreach ($options as $key => $value) {
            if (isset($validOptions[$key])) {
                ini_set('session.'.$key, $value);
            }
        }
    }

    /**
     * Registers session save handler as a PHP session handler.
     *
     * To use internal PHP session save handlers, override this method using ini_set with
     * session.save_handler and session.save_path e.g.
     *
     *     ini_set('session.save_handler', 'files');
     *     ini_set('session.save_path', /tmp');
     *
     * or pass in a NativeSessionHandler instance which configures session.save_handler in the
     * constructor, for a template see NativeFileSessionHandler or use handlers in
     * composer package drak/native-session
     *
     * @see http://php.net/session-set-save-handler
     * @see http://php.net/sessionhandlerinterface
     * @see http://php.net/sessionhandler
     * @see http://github.com/drak/NativeSession
     *
     * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $saveHandler
     *
     * @throws \InvalidArgumentException
     */
    public function setSaveHandler($saveHandler = null)
    {
        if (!$saveHandler instanceof AbstractProxy &&
            !$saveHandler instanceof NativeSessionHandler &&
            !$saveHandler instanceof \SessionHandlerInterface &&
            null !== $saveHandler) {
            throw new \InvalidArgumentException('Must be instance of AbstractProxy or NativeSessionHandler; implement \SessionHandlerInterface; or be null.');
        }

        // Wrap $saveHandler in proxy and prevent double wrapping of proxy
        if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) {
            $saveHandler = new SessionHandlerProxy($saveHandler);
        } elseif (!$saveHandler instanceof AbstractProxy) {
            $saveHandler = version_compare(phpversion(), '5.4.0', '>=') ?
                new SessionHandlerProxy(new \SessionHandler()) : new NativeProxy();
        }
        $this->saveHandler = $saveHandler;

        if ($this->saveHandler instanceof \SessionHandlerInterface) {
            if (version_compare(phpversion(), '5.4.0', '>=')) {
                session_set_save_handler($this->saveHandler, false);
            } else {
                session_set_save_handler(
                    array($this->saveHandler, 'open'),
                    array($this->saveHandler, 'close'),
                    array($this->saveHandler, 'read'),
                    array($this->saveHandler, 'write'),
                    array($this->saveHandler, 'destroy'),
                    array($this->saveHandler, 'gc')
                );
            }
        }
    }

    /**
     * Load the session with attributes.
     *
     * After starting the session, PHP retrieves the session from whatever handlers
     * are set to (either PHP's internal, or a custom save handler set with session_set_save_handler()).
     * PHP takes the return value from the read() handler, unserializes it
     * and populates $_SESSION with the result automatically.
     *
     * @param array|null $session
     */
    protected function loadSession(array &$session = null)
    {
        if (null === $session) {
            $session = &$_SESSION;
        }

        $bags = array_merge($this->bags, array($this->metadataBag));

        foreach ($bags as $bag) {
            $key = $bag->getStorageKey();
            $session[$key] = isset($session[$key]) ? $session[$key] : array();
            $bag->initialize($session[$key]);
        }

        $this->started = true;
        $this->closed = false;
    }
}
PK�`�\��?�yyQpear/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;

/**
 * StorageInterface.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Drak <drak@zikula.org>
 *
 * @api
 */
interface SessionStorageInterface
{
    /**
     * Starts the session.
     *
     * @throws \RuntimeException If something goes wrong starting the session.
     *
     * @return boolean True if started.
     *
     * @api
     */
    public function start();

    /**
     * Checks if the session is started.
     *
     * @return boolean True if started, false otherwise.
     */
    public function isStarted();

    /**
     * Returns the session ID
     *
     * @return string The session ID or empty.
     *
     * @api
     */
    public function getId();

    /**
     * Sets the session ID
     *
     * @param string $id
     *
     * @api
     */
    public function setId($id);

    /**
     * Returns the session name
     *
     * @return mixed The session name.
     *
     * @api
     */
    public function getName();

    /**
     * Sets the session name
     *
     * @param string $name
     *
     * @api
     */
    public function setName($name);

    /**
     * Regenerates id that represents this storage.
     *
     * This method must invoke session_regenerate_id($destroy) unless
     * this interface is used for a storage object designed for unit
     * or functional testing where a real PHP session would interfere
     * with testing.
     *
     * Note regenerate+destroy should not clear the session data in memory
     * only delete the session data from persistent storage.
     *
     * @param Boolean $destroy  Destroy session when regenerating?
     * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value
     *                          will leave the system settings unchanged, 0 sets the cookie
     *                          to expire with browser session. Time is in seconds, and is
     *                          not a Unix timestamp.
     *
     * @return Boolean True if session regenerated, false if error
     *
     * @throws \RuntimeException If an error occurs while regenerating this storage
     *
     * @api
     */
    public function regenerate($destroy = false, $lifetime = null);

    /**
     * Force the session to be saved and closed.
     *
     * This method must invoke session_write_close() unless this interface is
     * used for a storage object design for unit or functional testing where
     * a real PHP session would interfere with testing, in which case it
     * it should actually persist the session data if required.
     *
     * @throws \RuntimeException If the session is saved without being started, or if the session
     *                           is already closed.
     */
    public function save();

    /**
     * Clear all session data in memory.
     */
    public function clear();

    /**
     * Gets a SessionBagInterface by name.
     *
     * @param string $name
     *
     * @return SessionBagInterface
     *
     * @throws \InvalidArgumentException If the bag does not exist
     */
    public function getBag($name);

    /**
     * Registers a SessionBagInterface for use.
     *
     * @param SessionBagInterface $bag
     */
    public function registerBag(SessionBagInterface $bag);

    /**
     * @return MetadataBag
     */
    public function getMetadataBag();
}
PK�`�\ڏ۹�
�
Xpear/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

/**
 * MemcacheSessionHandler.
 *
 * @author Drak <drak@zikula.org>
 */
class MemcacheSessionHandler implements \SessionHandlerInterface
{
    /**
     * @var \Memcache Memcache driver.
     */
    private $memcache;

    /**
     * @var integer Time to live in seconds
     */
    private $ttl;

    /**
     * @var string Key prefix for shared environments.
     */
    private $prefix;

    /**
     * Constructor.
     *
     * List of available options:
     *  * prefix: The prefix to use for the memcache keys in order to avoid collision
     *  * expiretime: The time to live in seconds
     *
     * @param \Memcache $memcache A \Memcache instance
     * @param array     $options  An associative array of Memcache options
     *
     * @throws \InvalidArgumentException When unsupported options are passed
     */
    public function __construct(\Memcache $memcache, array $options = array())
    {
        if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) {
            throw new \InvalidArgumentException(sprintf(
                'The following options are not supported "%s"', implode(', ', $diff)
            ));
        }

        $this->memcache = $memcache;
        $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400;
        $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s';
    }

    /**
     * {@inheritDoc}
     */
    public function open($savePath, $sessionName)
    {
        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function close()
    {
        return $this->memcache->close();
    }

    /**
     * {@inheritDoc}
     */
    public function read($sessionId)
    {
        return $this->memcache->get($this->prefix.$sessionId) ?: '';
    }

    /**
     * {@inheritDoc}
     */
    public function write($sessionId, $data)
    {
        return $this->memcache->set($this->prefix.$sessionId, $data, 0, time() + $this->ttl);
    }

    /**
     * {@inheritDoc}
     */
    public function destroy($sessionId)
    {
        return $this->memcache->delete($this->prefix.$sessionId);
    }

    /**
     * {@inheritDoc}
     */
    public function gc($lifetime)
    {
        // not required here because memcache will auto expire the records anyhow.
        return true;
    }

    /**
     * Return a Memcache instance
     *
     * @return \Memcache
     */
    protected function getMemcache()
    {
        return $this->memcache;
    }
}
PK�`�\i����Wpear/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

/**
 * MongoDB session handler
 *
 * @author Markus Bachmann <markus.bachmann@bachi.biz>
 */
class MongoDbSessionHandler implements \SessionHandlerInterface
{
    /**
     * @var \Mongo
     */
    private $mongo;

    /**
     * @var \MongoCollection
     */
    private $collection;

    /**
     * @var array
     */
    private $options;

    /**
     * Constructor.
     *
     * List of available options:
     *  * database: The name of the database [required]
     *  * collection: The name of the collection [required]
     *  * id_field: The field name for storing the session id [default: _id]
     *  * data_field: The field name for storing the session data [default: data]
     *  * time_field: The field name for storing the timestamp [default: time]
     *
     * @param \Mongo|\MongoClient $mongo   A MongoClient or Mongo instance
     * @param array               $options An associative array of field options
     *
     * @throws \InvalidArgumentException When MongoClient or Mongo instance not provided
     * @throws \InvalidArgumentException When "database" or "collection" not provided
     */
    public function __construct($mongo, array $options)
    {
        if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo)) {
            throw new \InvalidArgumentException('MongoClient or Mongo instance required');
        }

        if (!isset($options['database']) || !isset($options['collection'])) {
            throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler');
        }

        $this->mongo = $mongo;

        $this->options = array_merge(array(
            'id_field'   => '_id',
            'data_field' => 'data',
            'time_field' => 'time',
        ), $options);
    }

    /**
     * {@inheritDoc}
     */
    public function open($savePath, $sessionName)
    {
        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function close()
    {
        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function destroy($sessionId)
    {
        $this->getCollection()->remove(array(
            $this->options['id_field'] => $sessionId
        ));

        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function gc($lifetime)
    {
        /* Note: MongoDB 2.2+ supports TTL collections, which may be used in
         * place of this method by indexing the "time_field" field with an
         * "expireAfterSeconds" option. Regardless of whether TTL collections
         * are used, consider indexing this field to make the remove query more
         * efficient.
         *
         * See: http://docs.mongodb.org/manual/tutorial/expire-data/
         */
        $time = new \MongoDate(time() - $lifetime);

        $this->getCollection()->remove(array(
            $this->options['time_field'] => array('$lt' => $time),
        ));

        return true;
    }

    /**
     * {@inheritDoc]
     */
    public function write($sessionId, $data)
    {
        $this->getCollection()->update(
            array($this->options['id_field'] => $sessionId),
            array('$set' => array(
                $this->options['data_field'] => new \MongoBinData($data, \MongoBinData::BYTE_ARRAY),
                $this->options['time_field'] => new \MongoDate(),
            )),
            array('upsert' => true, 'multiple' => false)
        );

        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function read($sessionId)
    {
        $dbData = $this->getCollection()->findOne(array(
            $this->options['id_field'] => $sessionId,
        ));

        return null === $dbData ? '' : $dbData[$this->options['data_field']]->bin;
    }

    /**
     * Return a "MongoCollection" instance
     *
     * @return \MongoCollection
     */
    private function getCollection()
    {
        if (null === $this->collection) {
            $this->collection = $this->mongo->selectCollection($this->options['database'], $this->options['collection']);
        }

        return $this->collection;
    }

    /**
     * Return a Mongo instance
     *
     * @return \Mongo
     */
    protected function getMongo()
    {
        return $this->mongo;
    }
}
PK�`�\k��4{{Ypear/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

/**
 * MemcachedSessionHandler.
 *
 * Memcached based session storage handler based on the Memcached class
 * provided by the PHP memcached extension.
 *
 * @see http://php.net/memcached
 *
 * @author Drak <drak@zikula.org>
 */
class MemcachedSessionHandler implements \SessionHandlerInterface
{
    /**
     * @var \Memcached Memcached driver.
     */
    private $memcached;

    /**
     * @var integer Time to live in seconds
     */
    private $ttl;

    /**
     * @var string Key prefix for shared environments.
     */
    private $prefix;

    /**
     * Constructor.
     *
     * List of available options:
     *  * prefix: The prefix to use for the memcached keys in order to avoid collision
     *  * expiretime: The time to live in seconds
     *
     * @param \Memcached $memcached A \Memcached instance
     * @param array      $options   An associative array of Memcached options
     *
     * @throws \InvalidArgumentException When unsupported options are passed
     */
    public function __construct(\Memcached $memcached, array $options = array())
    {
        $this->memcached = $memcached;

        if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) {
            throw new \InvalidArgumentException(sprintf(
                'The following options are not supported "%s"', implode(', ', $diff)
            ));
        }

        $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400;
        $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s';
    }

    /**
     * {@inheritDoc}
     */
    public function open($savePath, $sessionName)
    {
        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function close()
    {
        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function read($sessionId)
    {
        return $this->memcached->get($this->prefix.$sessionId) ?: '';
    }

    /**
     * {@inheritDoc}
     */
    public function write($sessionId, $data)
    {
        return $this->memcached->set($this->prefix.$sessionId, $data, time() + $this->ttl);
    }

    /**
     * {@inheritDoc}
     */
    public function destroy($sessionId)
    {
        return $this->memcached->delete($this->prefix.$sessionId);
    }

    /**
     * {@inheritDoc}
     */
    public function gc($lifetime)
    {
        // not required here because memcached will auto expire the records anyhow.
        return true;
    }

    /**
     * Return a Memcached instance
     *
     * @return \Memcached
     */
    protected function getMemcached()
    {
        return $this->memcached;
    }
}
PK�`�\����33Vpear/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

/**
 * Adds SessionHandler functionality if available.
 *
 * @see http://php.net/sessionhandler
 */

if (version_compare(phpversion(), '5.4.0', '>=')) {
    class NativeSessionHandler extends \SessionHandler {}
} else {
    class NativeSessionHandler {}
}
PK�`�\OZ�P""Spear/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

/**
 * PdoSessionHandler.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Michael Williams <michael.williams@funsational.com>
 */
class PdoSessionHandler implements \SessionHandlerInterface
{
    /**
     * @var \PDO PDO instance.
     */
    private $pdo;

    /**
     * @var array Database options.
     */
    private $dbOptions;

    /**
     * Constructor.
     *
     * List of available options:
     *  * db_table: The name of the table [required]
     *  * db_id_col: The column where to store the session id [default: sess_id]
     *  * db_data_col: The column where to store the session data [default: sess_data]
     *  * db_time_col: The column where to store the timestamp [default: sess_time]
     *
     * @param \PDO  $pdo       A \PDO instance
     * @param array $dbOptions An associative array of DB options
     *
     * @throws \InvalidArgumentException When "db_table" option is not provided
     */
    public function __construct(\PDO $pdo, array $dbOptions = array())
    {
        if (!array_key_exists('db_table', $dbOptions)) {
            throw new \InvalidArgumentException('You must provide the "db_table" option for a PdoSessionStorage.');
        }
        if (\PDO::ERRMODE_EXCEPTION !== $pdo->getAttribute(\PDO::ATTR_ERRMODE)) {
            throw new \InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION))', __CLASS__));
        }
        $this->pdo = $pdo;
        $this->dbOptions = array_merge(array(
            'db_id_col'   => 'sess_id',
            'db_data_col' => 'sess_data',
            'db_time_col' => 'sess_time',
        ), $dbOptions);
    }

    /**
     * {@inheritDoc}
     */
    public function open($path, $name)
    {
        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function close()
    {
        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function destroy($id)
    {
        // get table/column
        $dbTable = $this->dbOptions['db_table'];
        $dbIdCol = $this->dbOptions['db_id_col'];

        // delete the record associated with this id
        $sql = "DELETE FROM $dbTable WHERE $dbIdCol = :id";

        try {
            $stmt = $this->pdo->prepare($sql);
            $stmt->bindParam(':id', $id, \PDO::PARAM_STR);
            $stmt->execute();
        } catch (\PDOException $e) {
            throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e);
        }

        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function gc($lifetime)
    {
        // get table/column
        $dbTable   = $this->dbOptions['db_table'];
        $dbTimeCol = $this->dbOptions['db_time_col'];

        // delete the session records that have expired
        $sql = "DELETE FROM $dbTable WHERE $dbTimeCol < :time";

        try {
            $stmt = $this->pdo->prepare($sql);
            $stmt->bindValue(':time', time() - $lifetime, \PDO::PARAM_INT);
            $stmt->execute();
        } catch (\PDOException $e) {
            throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e);
        }

        return true;
    }

    /**
     * {@inheritDoc}
     */
    public function read($id)
    {
        // get table/columns
        $dbTable   = $this->dbOptions['db_table'];
        $dbDataCol = $this->dbOptions['db_data_col'];
        $dbIdCol   = $this->dbOptions['db_id_col'];

        try {
            $sql = "SELECT $dbDataCol FROM $dbTable WHERE $dbIdCol = :id";

            $stmt = $this->pdo->prepare($sql);
            $stmt->bindParam(':id', $id, \PDO::PARAM_STR);

            $stmt->execute();
            // it is recommended to use fetchAll so that PDO can close the DB cursor
            // we anyway expect either no rows, or one row with one column. fetchColumn, seems to be buggy #4777
            $sessionRows = $stmt->fetchAll(\PDO::FETCH_NUM);

            if (count($sessionRows) == 1) {
                return base64_decode($sessionRows[0][0]);
            }

            // session does not exist, create it
            $this->createNewSession($id);

            return '';
        } catch (\PDOException $e) {
            throw new \RuntimeException(sprintf('PDOException was thrown when trying to read the session data: %s', $e->getMessage()), 0, $e);
        }
    }

    /**
     * {@inheritDoc}
     */
    public function write($id, $data)
    {
        // get table/column
        $dbTable   = $this->dbOptions['db_table'];
        $dbDataCol = $this->dbOptions['db_data_col'];
        $dbIdCol   = $this->dbOptions['db_id_col'];
        $dbTimeCol = $this->dbOptions['db_time_col'];

        //session data can contain non binary safe characters so we need to encode it
        $encoded = base64_encode($data);

        try {
            $driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME);

            if ('mysql' === $driver) {
                // MySQL would report $stmt->rowCount() = 0 on UPDATE when the data is left unchanged
                // it could result in calling createNewSession() whereas the session already exists in
                // the DB which would fail as the id is unique
                $stmt = $this->pdo->prepare(
                    "INSERT INTO $dbTable ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, :time) " .
                    "ON DUPLICATE KEY UPDATE $dbDataCol = VALUES($dbDataCol), $dbTimeCol = VALUES($dbTimeCol)"
                );
                $stmt->bindParam(':id', $id, \PDO::PARAM_STR);
                $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR);
                $stmt->bindValue(':time', time(), \PDO::PARAM_INT);
                $stmt->execute();
            } elseif ('oci' === $driver) {
                $stmt = $this->pdo->prepare("MERGE INTO $dbTable USING DUAL ON($dbIdCol = :id) ".
                       "WHEN NOT MATCHED THEN INSERT ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, sysdate) " .
                       "WHEN MATCHED THEN UPDATE SET $dbDataCol = :data WHERE $dbIdCol = :id");

                $stmt->bindParam(':id', $id, \PDO::PARAM_STR);
                $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR);
                $stmt->execute();
            } else {
                $stmt = $this->pdo->prepare("UPDATE $dbTable SET $dbDataCol = :data, $dbTimeCol = :time WHERE $dbIdCol = :id");
                $stmt->bindParam(':id', $id, \PDO::PARAM_STR);
                $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR);
                $stmt->bindValue(':time', time(), \PDO::PARAM_INT);
                $stmt->execute();

                if (!$stmt->rowCount()) {
                    // No session exists in the database to update. This happens when we have called
                    // session_regenerate_id()
                    $this->createNewSession($id, $data);
                }
            }
        } catch (\PDOException $e) {
                throw new \RuntimeException(sprintf('PDOException was thrown when trying to write the session data: %s', $e->getMessage()), 0, $e);
        }

        return true;
    }

    /**
     * Creates a new session with the given $id and $data
     *
     * @param string $id
     * @param string $data
     *
     * @return boolean True.
     */
    private function createNewSession($id, $data = '')
    {
        // get table/column
        $dbTable   = $this->dbOptions['db_table'];
        $dbDataCol = $this->dbOptions['db_data_col'];
        $dbIdCol   = $this->dbOptions['db_id_col'];
        $dbTimeCol = $this->dbOptions['db_time_col'];

        $sql = "INSERT INTO $dbTable ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, :time)";

        //session data can contain non binary safe characters so we need to encode it
        $encoded = base64_encode($data);
        $stmt = $this->pdo->prepare($sql);
        $stmt->bindParam(':id', $id, \PDO::PARAM_STR);
        $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR);
        $stmt->bindValue(':time', time(), \PDO::PARAM_INT);
        $stmt->execute();

        return true;
    }

    /**
     * Return a PDO instance
     *
     * @return \PDO
     */
    protected function getConnection()
    {
        return $this->pdo;
    }
}
PK�`�\�����Zpear/Symfony/Component/HttpFoundation/Session/Storage/Handler/WriteCheckSessionHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

/**
 * Wraps another SessionHandlerInterface to only write the session when it has been modified.
 *
 * @author Adrien Brault <adrien.brault@gmail.com>
 */
class WriteCheckSessionHandler implements \SessionHandlerInterface
{
    /**
     * @var \SessionHandlerInterface
     */
    private $wrappedSessionHandler;

    /**
     * @var array sessionId => session
     */
    private $readSessions;

    public function __construct(\SessionHandlerInterface $wrappedSessionHandler)
    {
        $this->wrappedSessionHandler = $wrappedSessionHandler;
    }

    /**
     * {@inheritdoc}
     */
    public function close()
    {
        return $this->wrappedSessionHandler->close();
    }

    /**
     * {@inheritdoc}
     */
    public function destroy($sessionId)
    {
        return $this->wrappedSessionHandler->destroy($sessionId);
    }

    /**
     * {@inheritdoc}
     */
    public function gc($maxLifetime)
    {
        return $this->wrappedSessionHandler->gc($maxLifetime);
    }

    /**
     * {@inheritdoc}
     */
    public function open($savePath, $sessionId)
    {
        return $this->wrappedSessionHandler->open($savePath, $sessionId);
    }

    /**
     * {@inheritdoc}
     */
    public function read($sessionId)
    {
        $session = $this->wrappedSessionHandler->read($sessionId);

        $this->readSessions[$sessionId] = $session;

        return $session;
    }

    /**
     * {@inheritdoc}
     */
    public function write($sessionId, $sessionData)
    {
        if (isset($this->readSessions[$sessionId]) && $sessionData === $this->readSessions[$sessionId]) {
            return true;
        }

        return $this->wrappedSessionHandler->write($sessionId, $sessionData);
    }
}
PK�`�\u�Y0��Zpear/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

/**
 * NativeFileSessionHandler.
 *
 * Native session handler using PHP's built in file storage.
 *
 * @author Drak <drak@zikula.org>
 */
class NativeFileSessionHandler extends NativeSessionHandler
{
    /**
     * Constructor.
     *
     * @param string $savePath Path of directory to save session files.
     *                         Default null will leave setting as defined by PHP.
     *                         '/path', 'N;/path', or 'N;octal-mode;/path
     *
     * @see http://php.net/session.configuration.php#ini.session.save-path for further details.
     *
     * @throws \InvalidArgumentException On invalid $savePath
     */
    public function __construct($savePath = null)
    {
        if (null === $savePath) {
            $savePath = ini_get('session.save_path');
        }

        $baseDir = $savePath;

        if ($count = substr_count($savePath, ';')) {
            if ($count > 2) {
                throw new \InvalidArgumentException(sprintf('Invalid argument $savePath \'%s\'', $savePath));
            }

            // characters after last ';' are the path
            $baseDir = ltrim(strrchr($savePath, ';'), ';');
        }

        if ($baseDir && !is_dir($baseDir)) {
            mkdir($baseDir, 0777, true);
        }

        ini_set('session.save_path', $savePath);
        ini_set('session.save_handler', 'files');
    }
}
PK�`�\�>�q��Tpear/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

/**
 * NullSessionHandler.
 *
 * Can be used in unit testing or in a situations where persisted sessions are not desired.
 *
 * @author Drak <drak@zikula.org>
 *
 * @api
 */
class NullSessionHandler implements \SessionHandlerInterface
{
    /**
     * {@inheritdoc}
     */
    public function open($savePath, $sessionName)
    {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function close()
    {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function read($sessionId)
    {
        return '';
    }

    /**
     * {@inheritdoc}
     */
    public function write($sessionId, $data)
    {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function destroy($sessionId)
    {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function gc($lifetime)
    {
        return true;
    }
}
PK�`�\ގ�!Qpear/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;

/**
 * MockArraySessionStorage mocks the session for unit tests.
 *
 * No PHP session is actually started since a session can be initialized
 * and shutdown only once per PHP execution cycle.
 *
 * When doing functional testing, you should use MockFileSessionStorage instead.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
 * @author Drak <drak@zikula.org>
 */
class MockArraySessionStorage implements SessionStorageInterface
{
    /**
     * @var string
     */
    protected $id = '';

    /**
     * @var string
     */
    protected $name;

    /**
     * @var boolean
     */
    protected $started = false;

    /**
     * @var boolean
     */
    protected $closed = false;

    /**
     * @var array
     */
    protected $data = array();

    /**
     * @var MetadataBag
     */
    protected $metadataBag;

    /**
     * @var array
     */
    protected $bags;

    /**
     * Constructor.
     *
     * @param string      $name    Session name
     * @param MetadataBag $metaBag MetadataBag instance.
     */
    public function __construct($name = 'MOCKSESSID', MetadataBag $metaBag = null)
    {
        $this->name = $name;
        $this->setMetadataBag($metaBag);
    }

    /**
     * Sets the session data.
     *
     * @param array $array
     */
    public function setSessionData(array $array)
    {
        $this->data = $array;
    }

    /**
     * {@inheritdoc}
     */
    public function start()
    {
        if ($this->started && !$this->closed) {
            return true;
        }

        if (empty($this->id)) {
            $this->id = $this->generateId();
        }

        $this->loadSession();

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function regenerate($destroy = false, $lifetime = null)
    {
        if (!$this->started) {
            $this->start();
        }

        $this->metadataBag->stampNew($lifetime);
        $this->id = $this->generateId();

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * {@inheritdoc}
     */
    public function setId($id)
    {
        if ($this->started) {
            throw new \LogicException('Cannot set session ID after the session has started.');
        }

        $this->id = $id;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * {@inheritdoc}
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * {@inheritdoc}
     */
    public function save()
    {
        if (!$this->started || $this->closed) {
            throw new \RuntimeException("Trying to save a session that was not started yet or was already closed");
        }
        // nothing to do since we don't persist the session data
        $this->closed = false;
        $this->started = false;
    }

    /**
     * {@inheritdoc}
     */
    public function clear()
    {
        // clear out the bags
        foreach ($this->bags as $bag) {
            $bag->clear();
        }

        // clear out the session
        $this->data = array();

        // reconnect the bags to the session
        $this->loadSession();
    }

    /**
     * {@inheritdoc}
     */
    public function registerBag(SessionBagInterface $bag)
    {
        $this->bags[$bag->getName()] = $bag;
    }

    /**
     * {@inheritdoc}
     */
    public function getBag($name)
    {
        if (!isset($this->bags[$name])) {
            throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name));
        }

        if (!$this->started) {
            $this->start();
        }

        return $this->bags[$name];
    }

    /**
     * {@inheritdoc}
     */
    public function isStarted()
    {
        return $this->started;
    }

    /**
     * Sets the MetadataBag.
     *
     * @param MetadataBag $bag
     */
    public function setMetadataBag(MetadataBag $bag = null)
    {
        if (null === $bag) {
            $bag = new MetadataBag();
        }

        $this->metadataBag = $bag;
    }

    /**
     * Gets the MetadataBag.
     *
     * @return MetadataBag
     */
    public function getMetadataBag()
    {
        return $this->metadataBag;
    }

    /**
     * Generates a session ID.
     *
     * This doesn't need to be particularly cryptographically secure since this is just
     * a mock.
     *
     * @return string
     */
    protected function generateId()
    {
        return hash('sha256', uniqid(mt_rand()));
    }

    protected function loadSession()
    {
        $bags = array_merge($this->bags, array($this->metadataBag));

        foreach ($bags as $bag) {
            $key = $bag->getStorageKey();
            $this->data[$key] = isset($this->data[$key]) ? $this->data[$key] : array();
            $bag->initialize($this->data[$key]);
        }

        $this->started = true;
        $this->closed = false;
    }
}
PK�`�\��$�

Ppear/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage;

/**
 * MockFileSessionStorage is used to mock sessions for
 * functional testing when done in a single PHP process.
 *
 * No PHP session is actually started since a session can be initialized
 * and shutdown only once per PHP execution cycle and this class does
 * not pollute any session related globals, including session_*() functions
 * or session.* PHP ini directives.
 *
 * @author Drak <drak@zikula.org>
 */
class MockFileSessionStorage extends MockArraySessionStorage
{
    /**
     * @var string
     */
    private $savePath;

    /**
     * Constructor.
     *
     * @param string      $savePath Path of directory to save session files.
     * @param string      $name     Session name.
     * @param MetadataBag $metaBag  MetadataBag instance.
     */
    public function __construct($savePath = null, $name = 'MOCKSESSID', MetadataBag $metaBag = null)
    {
        if (null === $savePath) {
            $savePath = sys_get_temp_dir();
        }

        if (!is_dir($savePath)) {
            mkdir($savePath, 0777, true);
        }

        $this->savePath = $savePath;

        parent::__construct($name, $metaBag);
    }

    /**
     * {@inheritdoc}
     */
    public function start()
    {
        if ($this->started) {
            return true;
        }

        if (!$this->id) {
            $this->id = $this->generateId();
        }

        $this->read();

        $this->started = true;

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function regenerate($destroy = false, $lifetime = null)
    {
        if (!$this->started) {
            $this->start();
        }

        if ($destroy) {
            $this->destroy();
        }

        return parent::regenerate($destroy, $lifetime);
    }

    /**
     * {@inheritdoc}
     */
    public function save()
    {
        if (!$this->started) {
            throw new \RuntimeException("Trying to save a session that was not started yet or was already closed");
        }

        file_put_contents($this->getFilePath(), serialize($this->data));

        // this is needed for Silex, where the session object is re-used across requests
        // in functional tests. In Symfony, the container is rebooted, so we don't have
        // this issue
        $this->started = false;
    }

    /**
     * Deletes a session from persistent storage.
     * Deliberately leaves session data in memory intact.
     */
    private function destroy()
    {
        if (is_file($this->getFilePath())) {
            unlink($this->getFilePath());
        }
    }

    /**
     * Calculate path to file.
     *
     * @return string File path
     */
    private function getFilePath()
    {
        return $this->savePath.'/'.$this->id.'.mocksess';
    }

    /**
     * Reads session from storage and loads session.
     */
    private function read()
    {
        $filePath = $this->getFilePath();
        $this->data = is_readable($filePath) && is_file($filePath) ? unserialize(file_get_contents($filePath)) : array();

        $this->loadSession();
    }
}
PK�`�\�=�\\Bpear/Symfony/Component/HttpFoundation/Session/SessionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session;

use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag;

/**
 * Interface for the session.
 *
 * @author Drak <drak@zikula.org>
 */
interface SessionInterface
{
    /**
     * Starts the session storage.
     *
     * @return Boolean True if session started.
     *
     * @throws \RuntimeException If session fails to start.
     *
     * @api
     */
    public function start();

    /**
     * Returns the session ID.
     *
     * @return string The session ID.
     *
     * @api
     */
    public function getId();

    /**
     * Sets the session ID
     *
     * @param string $id
     *
     * @api
     */
    public function setId($id);

    /**
     * Returns the session name.
     *
     * @return mixed The session name.
     *
     * @api
     */
    public function getName();

    /**
     * Sets the session name.
     *
     * @param string $name
     *
     * @api
     */
    public function setName($name);

    /**
     * Invalidates the current session.
     *
     * Clears all session attributes and flashes and regenerates the
     * session and deletes the old session from persistence.
     *
     * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value
     *                          will leave the system settings unchanged, 0 sets the cookie
     *                          to expire with browser session. Time is in seconds, and is
     *                          not a Unix timestamp.
     *
     * @return Boolean True if session invalidated, false if error.
     *
     * @api
     */
    public function invalidate($lifetime = null);

    /**
     * Migrates the current session to a new session id while maintaining all
     * session attributes.
     *
     * @param Boolean $destroy  Whether to delete the old session or leave it to garbage collection.
     * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value
     *                          will leave the system settings unchanged, 0 sets the cookie
     *                          to expire with browser session. Time is in seconds, and is
     *                          not a Unix timestamp.
     *
     * @return Boolean True if session migrated, false if error.
     *
     * @api
     */
    public function migrate($destroy = false, $lifetime = null);

    /**
     * Force the session to be saved and closed.
     *
     * This method is generally not required for real sessions as
     * the session will be automatically saved at the end of
     * code execution.
     */
    public function save();

    /**
     * Checks if an attribute is defined.
     *
     * @param string $name The attribute name
     *
     * @return Boolean true if the attribute is defined, false otherwise
     *
     * @api
     */
    public function has($name);

    /**
     * Returns an attribute.
     *
     * @param string $name    The attribute name
     * @param mixed  $default The default value if not found.
     *
     * @return mixed
     *
     * @api
     */
    public function get($name, $default = null);

    /**
     * Sets an attribute.
     *
     * @param string $name
     * @param mixed  $value
     *
     * @api
     */
    public function set($name, $value);

    /**
     * Returns attributes.
     *
     * @return array Attributes
     *
     * @api
     */
    public function all();

    /**
     * Sets attributes.
     *
     * @param array $attributes Attributes
     */
    public function replace(array $attributes);

    /**
     * Removes an attribute.
     *
     * @param string $name
     *
     * @return mixed The removed value or null when it does not exist
     *
     * @api
     */
    public function remove($name);

    /**
     * Clears all attributes.
     *
     * @api
     */
    public function clear();

    /**
     * Checks if the session was started.
     *
     * @return Boolean
     */
    public function isStarted();

    /**
     * Registers a SessionBagInterface with the session.
     *
     * @param SessionBagInterface $bag
     */
    public function registerBag(SessionBagInterface $bag);

    /**
     * Gets a bag instance by name.
     *
     * @param string $name
     *
     * @return SessionBagInterface
     */
    public function getBag($name);

    /**
     * Gets session meta.
     *
     * @return MetadataBag
     */
    public function getMetadataBag();
}
PK�`�\�:au779pear/Symfony/Component/HttpFoundation/Session/Session.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session;

use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface;
use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;

/**
 * Session.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Drak <drak@zikula.org>
 *
 * @api
 */
class Session implements SessionInterface, \IteratorAggregate, \Countable
{
    /**
     * Storage driver.
     *
     * @var SessionStorageInterface
     */
    protected $storage;

    /**
     * @var string
     */
    private $flashName;

    /**
     * @var string
     */
    private $attributeName;

    /**
     * Constructor.
     *
     * @param SessionStorageInterface $storage    A SessionStorageInterface instance.
     * @param AttributeBagInterface   $attributes An AttributeBagInterface instance, (defaults null for default AttributeBag)
     * @param FlashBagInterface       $flashes    A FlashBagInterface instance (defaults null for default FlashBag)
     */
    public function __construct(SessionStorageInterface $storage = null, AttributeBagInterface $attributes = null, FlashBagInterface $flashes = null)
    {
        $this->storage = $storage ?: new NativeSessionStorage();

        $attributes = $attributes ?: new AttributeBag();
        $this->attributeName = $attributes->getName();
        $this->registerBag($attributes);

        $flashes = $flashes ?: new FlashBag();
        $this->flashName = $flashes->getName();
        $this->registerBag($flashes);
    }

    /**
     * {@inheritdoc}
     */
    public function start()
    {
        return $this->storage->start();
    }

    /**
     * {@inheritdoc}
     */
    public function has($name)
    {
        return $this->storage->getBag($this->attributeName)->has($name);
    }

    /**
     * {@inheritdoc}
     */
    public function get($name, $default = null)
    {
        return $this->storage->getBag($this->attributeName)->get($name, $default);
    }

    /**
     * {@inheritdoc}
     */
    public function set($name, $value)
    {
        $this->storage->getBag($this->attributeName)->set($name, $value);
    }

    /**
     * {@inheritdoc}
     */
    public function all()
    {
        return $this->storage->getBag($this->attributeName)->all();
    }

    /**
     * {@inheritdoc}
     */
    public function replace(array $attributes)
    {
        $this->storage->getBag($this->attributeName)->replace($attributes);
    }

    /**
     * {@inheritdoc}
     */
    public function remove($name)
    {
        return $this->storage->getBag($this->attributeName)->remove($name);
    }

    /**
     * {@inheritdoc}
     */
    public function clear()
    {
        $this->storage->getBag($this->attributeName)->clear();
    }

    /**
     * {@inheritdoc}
     */
    public function isStarted()
    {
        return $this->storage->isStarted();
    }

    /**
     * Returns an iterator for attributes.
     *
     * @return \ArrayIterator An \ArrayIterator instance
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->storage->getBag($this->attributeName)->all());
    }

    /**
     * Returns the number of attributes.
     *
     * @return int The number of attributes
     */
    public function count()
    {
        return count($this->storage->getBag($this->attributeName)->all());
    }

    /**
     * {@inheritdoc}
     */
    public function invalidate($lifetime = null)
    {
        $this->storage->clear();

        return $this->migrate(true, $lifetime);
    }

    /**
     * {@inheritdoc}
     */
    public function migrate($destroy = false, $lifetime = null)
    {
        return $this->storage->regenerate($destroy, $lifetime);
    }

    /**
     * {@inheritdoc}
     */
    public function save()
    {
        $this->storage->save();
    }

    /**
     * {@inheritdoc}
     */
    public function getId()
    {
        return $this->storage->getId();
    }

    /**
     * {@inheritdoc}
     */
    public function setId($id)
    {
        $this->storage->setId($id);
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->storage->getName();
    }

    /**
     * {@inheritdoc}
     */
    public function setName($name)
    {
        $this->storage->setName($name);
    }

    /**
     * {@inheritdoc}
     */
    public function getMetadataBag()
    {
        return $this->storage->getMetadataBag();
    }

    /**
     * {@inheritdoc}
     */
    public function registerBag(SessionBagInterface $bag)
    {
        $this->storage->registerBag($bag);
    }

    /**
     * {@inheritdoc}
     */
    public function getBag($name)
    {
        return $this->storage->getBag($name);
    }

    /**
     * Gets the flashbag interface.
     *
     * @return FlashBagInterface
     */
    public function getFlashBag()
    {
        return $this->getBag($this->flashName);
    }
}
PK�`�\�0�H66Rpear/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Attribute;

/**
 * This class provides structured storage of session attributes using
 * a name spacing character in the key.
 *
 * @author Drak <drak@zikula.org>
 */
class NamespacedAttributeBag extends AttributeBag
{
    /**
     * Namespace character.
     *
     * @var string
     */
    private $namespaceCharacter;

    /**
     * Constructor.
     *
     * @param string $storageKey         Session storage key.
     * @param string $namespaceCharacter Namespace character to use in keys.
     */
    public function __construct($storageKey = '_sf2_attributes', $namespaceCharacter = '/')
    {
        $this->namespaceCharacter = $namespaceCharacter;
        parent::__construct($storageKey);
    }

    /**
     * {@inheritdoc}
     */
    public function has($name)
    {
        $attributes = $this->resolveAttributePath($name);
        $name = $this->resolveKey($name);

        if (null === $attributes) {
            return false;
        }

        return array_key_exists($name, $attributes);
    }

    /**
     * {@inheritdoc}
     */
    public function get($name, $default = null)
    {
        $attributes = $this->resolveAttributePath($name);
        $name = $this->resolveKey($name);

        if (null === $attributes) {
            return $default;
        }

        return array_key_exists($name, $attributes) ? $attributes[$name] : $default;
    }

    /**
     * {@inheritdoc}
     */
    public function set($name, $value)
    {
        $attributes = & $this->resolveAttributePath($name, true);
        $name = $this->resolveKey($name);
        $attributes[$name] = $value;
    }

    /**
     * {@inheritdoc}
     */
    public function remove($name)
    {
        $retval = null;
        $attributes = & $this->resolveAttributePath($name);
        $name = $this->resolveKey($name);
        if (null !== $attributes && array_key_exists($name, $attributes)) {
            $retval = $attributes[$name];
            unset($attributes[$name]);
        }

        return $retval;
    }

    /**
     * Resolves a path in attributes property and returns it as a reference.
     *
     * This method allows structured namespacing of session attributes.
     *
     * @param string  $name         Key name
     * @param boolean $writeContext Write context, default false
     *
     * @return array
     */
    protected function &resolveAttributePath($name, $writeContext = false)
    {
        $array = & $this->attributes;
        $name = (strpos($name, $this->namespaceCharacter) === 0) ? substr($name, 1) : $name;

        // Check if there is anything to do, else return
        if (!$name) {
            return $array;
        }

        $parts = explode($this->namespaceCharacter, $name);
        if (count($parts) < 2) {
            if (!$writeContext) {
                return $array;
            }

            $array[$parts[0]] = array();

            return $array;
        }

        unset($parts[count($parts)-1]);

        foreach ($parts as $part) {
            if (null !== $array && !array_key_exists($part, $array)) {
                $array[$part] = $writeContext ? array() : null;
            }

            $array = & $array[$part];
        }

        return $array;
    }

    /**
     * Resolves the key from the name.
     *
     * This is the last part in a dot separated string.
     *
     * @param string $name
     *
     * @return string
     */
    protected function resolveKey($name)
    {
        if (false !== $pos = strrpos($name, $this->namespaceCharacter)) {
            $name = substr($name, $pos+1);
        }

        return $name;
    }
}
PK�`�\��eQpear/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Attribute;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;

/**
 * Attributes store.
 *
 * @author Drak <drak@zikula.org>
 */
interface AttributeBagInterface extends SessionBagInterface
{
    /**
     * Checks if an attribute is defined.
     *
     * @param string $name The attribute name
     *
     * @return Boolean true if the attribute is defined, false otherwise
     */
    public function has($name);

    /**
     * Returns an attribute.
     *
     * @param string $name    The attribute name
     * @param mixed  $default The default value if not found
     *
     * @return mixed
     */
    public function get($name, $default = null);

    /**
     * Sets an attribute.
     *
     * @param string $name
     * @param mixed  $value
     */
    public function set($name, $value);

    /**
     * Returns attributes.
     *
     * @return array Attributes
     */
    public function all();

    /**
     * Sets attributes.
     *
     * @param array $attributes Attributes
     */
    public function replace(array $attributes);

    /**
     * Removes an attribute.
     *
     * @param string $name
     *
     * @return mixed The removed value or null when it does not exist
     */
    public function remove($name);
}
PK�`�\��(���Hpear/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Attribute;

/**
 * This class relates to session attribute storage
 */
class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable
{
    private $name = 'attributes';

    /**
     * @var string
     */
    private $storageKey;

    /**
     * @var array
     */
    protected $attributes = array();

    /**
     * Constructor.
     *
     * @param string $storageKey The key used to store attributes in the session
     */
    public function __construct($storageKey = '_sf2_attributes')
    {
        $this->storageKey = $storageKey;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * {@inheritdoc}
     */
    public function initialize(array &$attributes)
    {
        $this->attributes = &$attributes;
    }

    /**
     * {@inheritdoc}
     */
    public function getStorageKey()
    {
        return $this->storageKey;
    }

    /**
     * {@inheritdoc}
     */
    public function has($name)
    {
        return array_key_exists($name, $this->attributes);
    }

    /**
     * {@inheritdoc}
     */
    public function get($name, $default = null)
    {
        return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default;
    }

    /**
     * {@inheritdoc}
     */
    public function set($name, $value)
    {
        $this->attributes[$name] = $value;
    }

    /**
     * {@inheritdoc}
     */
    public function all()
    {
        return $this->attributes;
    }

    /**
     * {@inheritdoc}
     */
    public function replace(array $attributes)
    {
        $this->attributes = array();
        foreach ($attributes as $key => $value) {
            $this->set($key, $value);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function remove($name)
    {
        $retval = null;
        if (array_key_exists($name, $this->attributes)) {
            $retval = $this->attributes[$name];
            unset($this->attributes[$name]);
        }

        return $retval;
    }

    /**
     * {@inheritdoc}
     */
    public function clear()
    {
        $return = $this->attributes;
        $this->attributes = array();

        return $return;
    }

    /**
     * Returns an iterator for attributes.
     *
     * @return \ArrayIterator An \ArrayIterator instance
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->attributes);
    }

    /**
     * Returns the number of attributes.
     *
     * @return integer The number of attributes
     */
    public function count()
    {
        return count($this->attributes);
    }
}
PK�`�\a����Ipear/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Flash;

use Symfony\Component\HttpFoundation\Session\SessionBagInterface;

/**
 * FlashBagInterface.
 *
 * @author Drak <drak@zikula.org>
 */
interface FlashBagInterface extends SessionBagInterface
{
    /**
     * Adds a flash message for type.
     *
     * @param string $type
     * @param string $message
     */
    public function add($type, $message);

    /**
     * Registers a message for a given type.
     *
     * @param string       $type
     * @param string|array $message
     */
    public function set($type, $message);

    /**
     * Gets flash messages for a given type.
     *
     * @param string $type    Message category type.
     * @param array  $default Default value if $type does not exist.
     *
     * @return array
     */
    public function peek($type, array $default = array());

    /**
     * Gets all flash messages.
     *
     * @return array
     */
    public function peekAll();

    /**
     * Gets and clears flash from the stack.
     *
     * @param string $type
     * @param array  $default Default value if $type does not exist.
     *
     * @return array
     */
    public function get($type, array $default = array());

    /**
     * Gets and clears flashes from the stack.
     *
     * @return array
     */
    public function all();

    /**
     * Sets all flash messages.
     */
    public function setAll(array $messages);

    /**
     * Has flash messages for a given type?
     *
     * @param string $type
     *
     * @return boolean
     */
    public function has($type);

    /**
     * Returns a list of all defined types.
     *
     * @return array
     */
    public function keys();
}
PK�`�\�@��WWJpear/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Flash;

/**
 * AutoExpireFlashBag flash message container.
 *
 * @author Drak <drak@zikula.org>
 */
class AutoExpireFlashBag implements FlashBagInterface
{
    private $name = 'flashes';

    /**
     * Flash messages.
     *
     * @var array
     */
    private $flashes = array('display' => array(), 'new' => array());

    /**
     * The storage key for flashes in the session
     *
     * @var string
     */
    private $storageKey;

    /**
     * Constructor.
     *
     * @param string $storageKey The key used to store flashes in the session.
     */
    public function __construct($storageKey = '_sf2_flashes')
    {
        $this->storageKey = $storageKey;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * {@inheritdoc}
     */
    public function initialize(array &$flashes)
    {
        $this->flashes = &$flashes;

        // The logic: messages from the last request will be stored in new, so we move them to previous
        // This request we will show what is in 'display'.  What is placed into 'new' this time round will
        // be moved to display next time round.
        $this->flashes['display'] = array_key_exists('new', $this->flashes) ? $this->flashes['new'] : array();
        $this->flashes['new'] = array();
    }

    /**
     * {@inheritdoc}
     */
    public function add($type, $message)
    {
        $this->flashes['new'][$type][] = $message;
    }

    /**
     * {@inheritdoc}
     */
    public function peek($type, array $default = array())
    {
        return $this->has($type) ? $this->flashes['display'][$type] : $default;
    }

    /**
     * {@inheritdoc}
     */
    public function peekAll()
    {
        return array_key_exists('display', $this->flashes) ? (array) $this->flashes['display'] : array();
    }

    /**
     * {@inheritdoc}
     */
    public function get($type, array $default = array())
    {
        $return = $default;

        if (!$this->has($type)) {
            return $return;
        }

        if (isset($this->flashes['display'][$type])) {
            $return = $this->flashes['display'][$type];
            unset($this->flashes['display'][$type]);
        }

        return $return;
    }

    /**
     * {@inheritdoc}
     */
    public function all()
    {
        $return = $this->flashes['display'];
        $this->flashes = array('new' => array(), 'display' => array());

        return $return;
    }

    /**
     * {@inheritdoc}
     */
    public function setAll(array $messages)
    {
        $this->flashes['new'] = $messages;
    }

    /**
     * {@inheritdoc}
     */
    public function set($type, $messages)
    {
        $this->flashes['new'][$type] = (array) $messages;
    }

    /**
     * {@inheritdoc}
     */
    public function has($type)
    {
        return array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type];
    }

    /**
     * {@inheritdoc}
     */
    public function keys()
    {
        return array_keys($this->flashes['display']);
    }

    /**
     * {@inheritdoc}
     */
    public function getStorageKey()
    {
        return $this->storageKey;
    }

    /**
     * {@inheritdoc}
     */
    public function clear()
    {
        return $this->all();
    }
}
PK�`�\��W���@pear/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Flash;

/**
 * FlashBag flash message container.
 *
 * \IteratorAggregate implementation is deprecated and will be removed in 3.0.
 *
 * @author Drak <drak@zikula.org>
 */
class FlashBag implements FlashBagInterface, \IteratorAggregate
{
    private $name = 'flashes';

    /**
     * Flash messages.
     *
     * @var array
     */
    private $flashes = array();

    /**
     * The storage key for flashes in the session
     *
     * @var string
     */
    private $storageKey;

    /**
     * Constructor.
     *
     * @param string $storageKey The key used to store flashes in the session.
     */
    public function __construct($storageKey = '_sf2_flashes')
    {
        $this->storageKey = $storageKey;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * {@inheritdoc}
     */
    public function initialize(array &$flashes)
    {
        $this->flashes = &$flashes;
    }

    /**
     * {@inheritdoc}
     */
    public function add($type, $message)
    {
        $this->flashes[$type][] = $message;
    }

    /**
     * {@inheritdoc}
     */
    public function peek($type, array $default = array())
    {
        return $this->has($type) ? $this->flashes[$type] : $default;
    }

    /**
     * {@inheritdoc}
     */
    public function peekAll()
    {
        return $this->flashes;
    }

    /**
     * {@inheritdoc}
     */
    public function get($type, array $default = array())
    {
        if (!$this->has($type)) {
            return $default;
        }

        $return = $this->flashes[$type];

        unset($this->flashes[$type]);

        return $return;
    }

    /**
     * {@inheritdoc}
     */
    public function all()
    {
        $return = $this->peekAll();
        $this->flashes = array();

        return $return;
    }

    /**
     * {@inheritdoc}
     */
    public function set($type, $messages)
    {
        $this->flashes[$type] = (array) $messages;
    }

    /**
     * {@inheritdoc}
     */
    public function setAll(array $messages)
    {
        $this->flashes = $messages;
    }

    /**
     * {@inheritdoc}
     */
    public function has($type)
    {
        return array_key_exists($type, $this->flashes) && $this->flashes[$type];
    }

    /**
     * {@inheritdoc}
     */
    public function keys()
    {
        return array_keys($this->flashes);
    }

    /**
     * {@inheritdoc}
     */
    public function getStorageKey()
    {
        return $this->storageKey;
    }

    /**
     * {@inheritdoc}
     */
    public function clear()
    {
        return $this->all();
    }

    /**
     * Returns an iterator for flashes.
     *
     * @deprecated Will be removed in 3.0.
     *
     * @return \ArrayIterator An \ArrayIterator instance
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->all());
    }
}
PK�`�\M&z�rrEpear/Symfony/Component/HttpFoundation/Session/SessionBagInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session;

/**
 * Session Bag store.
 *
 * @author Drak <drak@zikula.org>
 */
interface SessionBagInterface
{
    /**
     * Gets this bag's name
     *
     * @return string
     */
    public function getName();

    /**
     * Initializes the Bag
     *
     * @param array $array
     */
    public function initialize(array &$array);

    /**
     * Gets the storage key for this bag.
     *
     * @return string
     */
    public function getStorageKey();

    /**
     * Clears out data from bag.
     *
     * @return mixed Whatever data was contained.
     */
    public function clear();
}
PK�`�\�ݣ�"�";pear/Symfony/Component/HttpFoundation/ResponseHeaderBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * ResponseHeaderBag is a container for Response HTTP headers.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ResponseHeaderBag extends HeaderBag
{
    const COOKIES_FLAT           = 'flat';
    const COOKIES_ARRAY          = 'array';

    const DISPOSITION_ATTACHMENT = 'attachment';
    const DISPOSITION_INLINE     = 'inline';

    /**
     * @var array
     */
    protected $computedCacheControl = array();

    /**
     * @var array
     */
    protected $cookies              = array();

    /**
     * @var array
     */
    protected $headerNames          = array();

    /**
     * Constructor.
     *
     * @param array $headers An array of HTTP headers
     *
     * @api
     */
    public function __construct(array $headers = array())
    {
        parent::__construct($headers);

        if (!isset($this->headers['cache-control'])) {
            $this->set('Cache-Control', '');
        }
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        $cookies = '';
        foreach ($this->getCookies() as $cookie) {
            $cookies .= 'Set-Cookie: '.$cookie."\r\n";
        }

        ksort($this->headerNames);

        return parent::__toString().$cookies;
    }

    /**
     * Returns the headers, with original capitalizations.
     *
     * @return array An array of headers
     */
    public function allPreserveCase()
    {
        return array_combine($this->headerNames, $this->headers);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function replace(array $headers = array())
    {
        $this->headerNames = array();

        parent::replace($headers);

        if (!isset($this->headers['cache-control'])) {
            $this->set('Cache-Control', '');
        }
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function set($key, $values, $replace = true)
    {
        parent::set($key, $values, $replace);

        $uniqueKey = strtr(strtolower($key), '_', '-');
        $this->headerNames[$uniqueKey] = $key;

        // ensure the cache-control header has sensible defaults
        if (in_array($uniqueKey, array('cache-control', 'etag', 'last-modified', 'expires'))) {
            $computed = $this->computeCacheControlValue();
            $this->headers['cache-control'] = array($computed);
            $this->headerNames['cache-control'] = 'Cache-Control';
            $this->computedCacheControl = $this->parseCacheControl($computed);
        }
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function remove($key)
    {
        parent::remove($key);

        $uniqueKey = strtr(strtolower($key), '_', '-');
        unset($this->headerNames[$uniqueKey]);

        if ('cache-control' === $uniqueKey) {
            $this->computedCacheControl = array();
        }
    }

    /**
     * {@inheritdoc}
     */
    public function hasCacheControlDirective($key)
    {
        return array_key_exists($key, $this->computedCacheControl);
    }

    /**
     * {@inheritdoc}
     */
    public function getCacheControlDirective($key)
    {
        return array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null;
    }

    /**
     * Sets a cookie.
     *
     * @param Cookie $cookie
     *
     * @api
     */
    public function setCookie(Cookie $cookie)
    {
        $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie;
    }

    /**
     * Removes a cookie from the array, but does not unset it in the browser
     *
     * @param string $name
     * @param string $path
     * @param string $domain
     *
     * @api
     */
    public function removeCookie($name, $path = '/', $domain = null)
    {
        if (null === $path) {
            $path = '/';
        }

        unset($this->cookies[$domain][$path][$name]);

        if (empty($this->cookies[$domain][$path])) {
            unset($this->cookies[$domain][$path]);

            if (empty($this->cookies[$domain])) {
                unset($this->cookies[$domain]);
            }
        }
    }

    /**
     * Returns an array with all cookies
     *
     * @param string $format
     *
     * @throws \InvalidArgumentException When the $format is invalid
     *
     * @return array
     *
     * @api
     */
    public function getCookies($format = self::COOKIES_FLAT)
    {
        if (!in_array($format, array(self::COOKIES_FLAT, self::COOKIES_ARRAY))) {
            throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', array(self::COOKIES_FLAT, self::COOKIES_ARRAY))));
        }

        if (self::COOKIES_ARRAY === $format) {
            return $this->cookies;
        }

        $flattenedCookies = array();
        foreach ($this->cookies as $path) {
            foreach ($path as $cookies) {
                foreach ($cookies as $cookie) {
                    $flattenedCookies[] = $cookie;
                }
            }
        }

        return $flattenedCookies;
    }

    /**
     * Clears a cookie in the browser
     *
     * @param string $name
     * @param string $path
     * @param string $domain
     *
     * @api
     */
    public function clearCookie($name, $path = '/', $domain = null)
    {
        $this->setCookie(new Cookie($name, null, 1, $path, $domain));
    }

    /**
     * Generates a HTTP Content-Disposition field-value.
     *
     * @param string $disposition      One of "inline" or "attachment"
     * @param string $filename         A unicode string
     * @param string $filenameFallback A string containing only ASCII characters that
     *                                 is semantically equivalent to $filename. If the filename is already ASCII,
     *                                 it can be omitted, or just copied from $filename
     *
     * @return string A string suitable for use as a Content-Disposition field-value.
     *
     * @throws \InvalidArgumentException
     * @see RFC 6266
     */
    public function makeDisposition($disposition, $filename, $filenameFallback = '')
    {
        if (!in_array($disposition, array(self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE))) {
            throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE));
        }

        if ('' == $filenameFallback) {
            $filenameFallback = $filename;
        }

        // filenameFallback is not ASCII.
        if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) {
            throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.');
        }

        // percent characters aren't safe in fallback.
        if (false !== strpos($filenameFallback, '%')) {
            throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.');
        }

        // path separators aren't allowed in either.
        if (false !== strpos($filename, '/') || false !== strpos($filename, '\\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\\')) {
            throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.');
        }

        $output = sprintf('%s; filename="%s"', $disposition, str_replace('"', '\\"', $filenameFallback));

        if ($filename !== $filenameFallback) {
            $output .= sprintf("; filename*=utf-8''%s", rawurlencode($filename));
        }

        return $output;
    }

    /**
     * Returns the calculated value of the cache-control header.
     *
     * This considers several other headers and calculates or modifies the
     * cache-control header to a sensible, conservative value.
     *
     * @return string
     */
    protected function computeCacheControlValue()
    {
        if (!$this->cacheControl && !$this->has('ETag') && !$this->has('Last-Modified') && !$this->has('Expires')) {
            return 'no-cache';
        }

        if (!$this->cacheControl) {
            // conservative by default
            return 'private, must-revalidate';
        }

        $header = $this->getCacheControlHeader();
        if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) {
            return $header;
        }

        // public if s-maxage is defined, private otherwise
        if (!isset($this->cacheControl['s-maxage'])) {
            return $header.', private';
        }

        return $header;
    }
}
PK�`�\�_DK�
�
:pear/Symfony/Component/HttpFoundation/RedirectResponse.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * RedirectResponse represents an HTTP response doing a redirect.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class RedirectResponse extends Response
{
    protected $targetUrl;

    /**
     * Creates a redirect response so that it conforms to the rules defined for a redirect status code.
     *
     * @param string  $url     The URL to redirect to
     * @param integer $status  The status code (302 by default)
     * @param array   $headers The headers (Location is always set to the given URL)
     *
     * @throws \InvalidArgumentException
     *
     * @see http://tools.ietf.org/html/rfc2616#section-10.3
     *
     * @api
     */
    public function __construct($url, $status = 302, $headers = array())
    {
        if (empty($url)) {
            throw new \InvalidArgumentException('Cannot redirect to an empty URL.');
        }

        parent::__construct('', $status, $headers);

        $this->setTargetUrl($url);

        if (!$this->isRedirect()) {
            throw new \InvalidArgumentException(sprintf('The HTTP status code is not a redirect ("%s" given).', $status));
        }
    }

    /**
     * {@inheritDoc}
     */
    public static function create($url = '', $status = 302, $headers = array())
    {
        return new static($url, $status, $headers);
    }

    /**
     * Returns the target URL.
     *
     * @return string target URL
     */
    public function getTargetUrl()
    {
        return $this->targetUrl;
    }

    /**
     * Sets the redirect target of this response.
     *
     * @param string  $url     The URL to redirect to
     *
     * @return RedirectResponse The current response.
     *
     * @throws \InvalidArgumentException
     */
    public function setTargetUrl($url)
    {
        if (empty($url)) {
            throw new \InvalidArgumentException('Cannot redirect to an empty URL.');
        }

        $this->targetUrl = $url;

        $this->setContent(
            sprintf('<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta http-equiv="refresh" content="1;url=%1$s" />

        <title>Redirecting to %1$s</title>
    </head>
    <body>
        Redirecting to <a href="%1$s">%1$s</a>.
    </body>
</html>', htmlspecialchars($url, ENT_QUOTES, 'UTF-8')));

        $this->headers->set('Location', $url);

        return $this;
    }
}
PK�`�\�	�L��Ppear/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\MimeType;

use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;

/**
 * Guesses the mime type of a file
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface MimeTypeGuesserInterface
{
    /**
     * Guesses the mime type of the file with the given path.
     *
     * @param string $path The path to the file
     *
     * @return string         The mime type or NULL, if none could be guessed
     *
     * @throws FileNotFoundException  If the file does not exist
     * @throws AccessDeniedException  If the file could not be read
     */
    public function guess($path);
}
PK�`�\5p1��Opear/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\MimeType;

use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;

/**
 * Guesses the mime type using the PECL extension FileInfo.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface
{
    private $magicFile;

    /**
     * Constructor.
     *
     * @param string $magicFile A magic file to use with the finfo instance
     *
     * @link http://www.php.net/manual/en/function.finfo-open.php
     */
    public function __construct($magicFile = null)
    {
        $this->magicFile = $magicFile;
    }

    /**
     * Returns whether this guesser is supported on the current OS/PHP setup
     *
     * @return Boolean
     */
    public static function isSupported()
    {
        return function_exists('finfo_open');
    }

    /**
     * {@inheritdoc}
     */
    public function guess($path)
    {
        if (!is_file($path)) {
            throw new FileNotFoundException($path);
        }

        if (!is_readable($path)) {
            throw new AccessDeniedException($path);
        }

        if (!self::isSupported()) {
            return null;
        }

        if (!$finfo = new \finfo(FILEINFO_MIME_TYPE, $this->magicFile)) {
            return null;
        }

        return $finfo->file($path);
    }
}
PK�`�\�qx��Qpear/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\MimeType;

/**
 * Guesses the file extension corresponding to a given mime type
 */
interface ExtensionGuesserInterface
{
    /**
     * Makes a best guess for a file extension, given a mime type
     *
     * @param string $mimeType The mime type
     * @return string          The guessed extension or NULL, if none could be guessed
     */
    public function guess($mimeType);
}
PK�`�\��6��Gpear/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\MimeType;

use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;

/**
 * A singleton mime type guesser.
 *
 * By default, all mime type guessers provided by the framework are installed
 * (if available on the current OS/PHP setup).
 *
 * You can register custom guessers by calling the register() method on the
 * singleton instance. Custom guessers are always called before any default ones.
 *
 *     $guesser = MimeTypeGuesser::getInstance();
 *     $guesser->register(new MyCustomMimeTypeGuesser());
 *
 * If you want to change the order of the default guessers, just re-register your
 * preferred one as a custom one. The last registered guesser is preferred over
 * previously registered ones.
 *
 * Re-registering a built-in guesser also allows you to configure it:
 *
 *     $guesser = MimeTypeGuesser::getInstance();
 *     $guesser->register(new FileinfoMimeTypeGuesser('/path/to/magic/file'));
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class MimeTypeGuesser implements MimeTypeGuesserInterface
{
    /**
     * The singleton instance
     *
     * @var MimeTypeGuesser
     */
    private static $instance = null;

    /**
     * All registered MimeTypeGuesserInterface instances
     *
     * @var array
     */
    protected $guessers = array();

    /**
     * Returns the singleton instance
     *
     * @return MimeTypeGuesser
     */
    public static function getInstance()
    {
        if (null === self::$instance) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    /**
     * Registers all natively provided mime type guessers
     */
    private function __construct()
    {
        if (FileBinaryMimeTypeGuesser::isSupported()) {
            $this->register(new FileBinaryMimeTypeGuesser());
        }

        if (FileinfoMimeTypeGuesser::isSupported()) {
            $this->register(new FileinfoMimeTypeGuesser());
        }
    }

    /**
     * Registers a new mime type guesser
     *
     * When guessing, this guesser is preferred over previously registered ones.
     *
     * @param MimeTypeGuesserInterface $guesser
     */
    public function register(MimeTypeGuesserInterface $guesser)
    {
        array_unshift($this->guessers, $guesser);
    }

    /**
     * Tries to guess the mime type of the given file
     *
     * The file is passed to each registered mime type guesser in reverse order
     * of their registration (last registered is queried first). Once a guesser
     * returns a value that is not NULL, this method terminates and returns the
     * value.
     *
     * @param string $path The path to the file
     *
     * @return string         The mime type or NULL, if none could be guessed
     *
     * @throws \LogicException
     * @throws FileNotFoundException
     * @throws AccessDeniedException
     */
    public function guess($path)
    {
        if (!is_file($path)) {
            throw new FileNotFoundException($path);
        }

        if (!is_readable($path)) {
            throw new AccessDeniedException($path);
        }

        if (!$this->guessers) {
            throw new \LogicException('Unable to guess the mime type as no guessers are available (Did you enable the php_fileinfo extension?)');
        }

        foreach ($this->guessers as $guesser) {
            if (null !== $mimeType = $guesser->guess($path)) {
                return $mimeType;
            }
        }
    }
}
PK�`�\�w�nM�M�Ppear/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\MimeType;

/**
 * Provides a best-guess mapping of mime type to file extension.
 */
class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
{
    /**
     * A map of mime types and their default extensions.
     *
     * This list has been placed under the public domain by the Apache HTTPD project.
     * This list has been updated from upstream on 2013-04-23.
     *
     * @see http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
     *
     * @var array
     */
    protected $defaultExtensions = array(
        'application/andrew-inset' => 'ez',
        'application/applixware' => 'aw',
        'application/atom+xml' => 'atom',
        'application/atomcat+xml' => 'atomcat',
        'application/atomsvc+xml' => 'atomsvc',
        'application/ccxml+xml' => 'ccxml',
        'application/cdmi-capability' => 'cdmia',
        'application/cdmi-container' => 'cdmic',
        'application/cdmi-domain' => 'cdmid',
        'application/cdmi-object' => 'cdmio',
        'application/cdmi-queue' => 'cdmiq',
        'application/cu-seeme' => 'cu',
        'application/davmount+xml' => 'davmount',
        'application/docbook+xml' => 'dbk',
        'application/dssc+der' => 'dssc',
        'application/dssc+xml' => 'xdssc',
        'application/ecmascript' => 'ecma',
        'application/emma+xml' => 'emma',
        'application/epub+zip' => 'epub',
        'application/exi' => 'exi',
        'application/font-tdpfr' => 'pfr',
        'application/gml+xml' => 'gml',
        'application/gpx+xml' => 'gpx',
        'application/gxf' => 'gxf',
        'application/hyperstudio' => 'stk',
        'application/inkml+xml' => 'ink',
        'application/ipfix' => 'ipfix',
        'application/java-archive' => 'jar',
        'application/java-serialized-object' => 'ser',
        'application/java-vm' => 'class',
        'application/javascript' => 'js',
        'application/json' => 'json',
        'application/jsonml+json' => 'jsonml',
        'application/lost+xml' => 'lostxml',
        'application/mac-binhex40' => 'hqx',
        'application/mac-compactpro' => 'cpt',
        'application/mads+xml' => 'mads',
        'application/marc' => 'mrc',
        'application/marcxml+xml' => 'mrcx',
        'application/mathematica' => 'ma',
        'application/mathml+xml' => 'mathml',
        'application/mbox' => 'mbox',
        'application/mediaservercontrol+xml' => 'mscml',
        'application/metalink+xml' => 'metalink',
        'application/metalink4+xml' => 'meta4',
        'application/mets+xml' => 'mets',
        'application/mods+xml' => 'mods',
        'application/mp21' => 'm21',
        'application/mp4' => 'mp4s',
        'application/msword' => 'doc',
        'application/mxf' => 'mxf',
        'application/octet-stream' => 'bin',
        'application/oda' => 'oda',
        'application/oebps-package+xml' => 'opf',
        'application/ogg' => 'ogx',
        'application/omdoc+xml' => 'omdoc',
        'application/onenote' => 'onetoc',
        'application/oxps' => 'oxps',
        'application/patch-ops-error+xml' => 'xer',
        'application/pdf' => 'pdf',
        'application/pgp-encrypted' => 'pgp',
        'application/pgp-signature' => 'asc',
        'application/pics-rules' => 'prf',
        'application/pkcs10' => 'p10',
        'application/pkcs7-mime' => 'p7m',
        'application/pkcs7-signature' => 'p7s',
        'application/pkcs8' => 'p8',
        'application/pkix-attr-cert' => 'ac',
        'application/pkix-cert' => 'cer',
        'application/pkix-crl' => 'crl',
        'application/pkix-pkipath' => 'pkipath',
        'application/pkixcmp' => 'pki',
        'application/pls+xml' => 'pls',
        'application/postscript' => 'ai',
        'application/prs.cww' => 'cww',
        'application/pskc+xml' => 'pskcxml',
        'application/rdf+xml' => 'rdf',
        'application/reginfo+xml' => 'rif',
        'application/relax-ng-compact-syntax' => 'rnc',
        'application/resource-lists+xml' => 'rl',
        'application/resource-lists-diff+xml' => 'rld',
        'application/rls-services+xml' => 'rs',
        'application/rpki-ghostbusters' => 'gbr',
        'application/rpki-manifest' => 'mft',
        'application/rpki-roa' => 'roa',
        'application/rsd+xml' => 'rsd',
        'application/rss+xml' => 'rss',
        'application/rtf' => 'rtf',
        'application/sbml+xml' => 'sbml',
        'application/scvp-cv-request' => 'scq',
        'application/scvp-cv-response' => 'scs',
        'application/scvp-vp-request' => 'spq',
        'application/scvp-vp-response' => 'spp',
        'application/sdp' => 'sdp',
        'application/set-payment-initiation' => 'setpay',
        'application/set-registration-initiation' => 'setreg',
        'application/shf+xml' => 'shf',
        'application/smil+xml' => 'smi',
        'application/sparql-query' => 'rq',
        'application/sparql-results+xml' => 'srx',
        'application/srgs' => 'gram',
        'application/srgs+xml' => 'grxml',
        'application/sru+xml' => 'sru',
        'application/ssdl+xml' => 'ssdl',
        'application/ssml+xml' => 'ssml',
        'application/tei+xml' => 'tei',
        'application/thraud+xml' => 'tfi',
        'application/timestamped-data' => 'tsd',
        'application/vnd.3gpp.pic-bw-large' => 'plb',
        'application/vnd.3gpp.pic-bw-small' => 'psb',
        'application/vnd.3gpp.pic-bw-var' => 'pvb',
        'application/vnd.3gpp2.tcap' => 'tcap',
        'application/vnd.3m.post-it-notes' => 'pwn',
        'application/vnd.accpac.simply.aso' => 'aso',
        'application/vnd.accpac.simply.imp' => 'imp',
        'application/vnd.acucobol' => 'acu',
        'application/vnd.acucorp' => 'atc',
        'application/vnd.adobe.air-application-installer-package+zip' => 'air',
        'application/vnd.adobe.formscentral.fcdt' => 'fcdt',
        'application/vnd.adobe.fxp' => 'fxp',
        'application/vnd.adobe.xdp+xml' => 'xdp',
        'application/vnd.adobe.xfdf' => 'xfdf',
        'application/vnd.ahead.space' => 'ahead',
        'application/vnd.airzip.filesecure.azf' => 'azf',
        'application/vnd.airzip.filesecure.azs' => 'azs',
        'application/vnd.amazon.ebook' => 'azw',
        'application/vnd.americandynamics.acc' => 'acc',
        'application/vnd.amiga.ami' => 'ami',
        'application/vnd.android.package-archive' => 'apk',
        'application/vnd.anser-web-certificate-issue-initiation' => 'cii',
        'application/vnd.anser-web-funds-transfer-initiation' => 'fti',
        'application/vnd.antix.game-component' => 'atx',
        'application/vnd.apple.installer+xml' => 'mpkg',
        'application/vnd.apple.mpegurl' => 'm3u8',
        'application/vnd.aristanetworks.swi' => 'swi',
        'application/vnd.astraea-software.iota' => 'iota',
        'application/vnd.audiograph' => 'aep',
        'application/vnd.blueice.multipass' => 'mpm',
        'application/vnd.bmi' => 'bmi',
        'application/vnd.businessobjects' => 'rep',
        'application/vnd.chemdraw+xml' => 'cdxml',
        'application/vnd.chipnuts.karaoke-mmd' => 'mmd',
        'application/vnd.cinderella' => 'cdy',
        'application/vnd.claymore' => 'cla',
        'application/vnd.cloanto.rp9' => 'rp9',
        'application/vnd.clonk.c4group' => 'c4g',
        'application/vnd.cluetrust.cartomobile-config' => 'c11amc',
        'application/vnd.cluetrust.cartomobile-config-pkg' => 'c11amz',
        'application/vnd.commonspace' => 'csp',
        'application/vnd.contact.cmsg' => 'cdbcmsg',
        'application/vnd.cosmocaller' => 'cmc',
        'application/vnd.crick.clicker' => 'clkx',
        'application/vnd.crick.clicker.keyboard' => 'clkk',
        'application/vnd.crick.clicker.palette' => 'clkp',
        'application/vnd.crick.clicker.template' => 'clkt',
        'application/vnd.crick.clicker.wordbank' => 'clkw',
        'application/vnd.criticaltools.wbs+xml' => 'wbs',
        'application/vnd.ctc-posml' => 'pml',
        'application/vnd.cups-ppd' => 'ppd',
        'application/vnd.curl.car' => 'car',
        'application/vnd.curl.pcurl' => 'pcurl',
        'application/vnd.dart' => 'dart',
        'application/vnd.data-vision.rdz' => 'rdz',
        'application/vnd.dece.data' => 'uvf',
        'application/vnd.dece.ttml+xml' => 'uvt',
        'application/vnd.dece.unspecified' => 'uvx',
        'application/vnd.dece.zip' => 'uvz',
        'application/vnd.denovo.fcselayout-link' => 'fe_launch',
        'application/vnd.dna' => 'dna',
        'application/vnd.dolby.mlp' => 'mlp',
        'application/vnd.dpgraph' => 'dpg',
        'application/vnd.dreamfactory' => 'dfac',
        'application/vnd.ds-keypoint' => 'kpxx',
        'application/vnd.dvb.ait' => 'ait',
        'application/vnd.dvb.service' => 'svc',
        'application/vnd.dynageo' => 'geo',
        'application/vnd.ecowin.chart' => 'mag',
        'application/vnd.enliven' => 'nml',
        'application/vnd.epson.esf' => 'esf',
        'application/vnd.epson.msf' => 'msf',
        'application/vnd.epson.quickanime' => 'qam',
        'application/vnd.epson.salt' => 'slt',
        'application/vnd.epson.ssf' => 'ssf',
        'application/vnd.eszigno3+xml' => 'es3',
        'application/vnd.ezpix-album' => 'ez2',
        'application/vnd.ezpix-package' => 'ez3',
        'application/vnd.fdf' => 'fdf',
        'application/vnd.fdsn.mseed' => 'mseed',
        'application/vnd.fdsn.seed' => 'seed',
        'application/vnd.flographit' => 'gph',
        'application/vnd.fluxtime.clip' => 'ftc',
        'application/vnd.framemaker' => 'fm',
        'application/vnd.frogans.fnc' => 'fnc',
        'application/vnd.frogans.ltf' => 'ltf',
        'application/vnd.fsc.weblaunch' => 'fsc',
        'application/vnd.fujitsu.oasys' => 'oas',
        'application/vnd.fujitsu.oasys2' => 'oa2',
        'application/vnd.fujitsu.oasys3' => 'oa3',
        'application/vnd.fujitsu.oasysgp' => 'fg5',
        'application/vnd.fujitsu.oasysprs' => 'bh2',
        'application/vnd.fujixerox.ddd' => 'ddd',
        'application/vnd.fujixerox.docuworks' => 'xdw',
        'application/vnd.fujixerox.docuworks.binder' => 'xbd',
        'application/vnd.fuzzysheet' => 'fzs',
        'application/vnd.genomatix.tuxedo' => 'txd',
        'application/vnd.geogebra.file' => 'ggb',
        'application/vnd.geogebra.tool' => 'ggt',
        'application/vnd.geometry-explorer' => 'gex',
        'application/vnd.geonext' => 'gxt',
        'application/vnd.geoplan' => 'g2w',
        'application/vnd.geospace' => 'g3w',
        'application/vnd.gmx' => 'gmx',
        'application/vnd.google-earth.kml+xml' => 'kml',
        'application/vnd.google-earth.kmz' => 'kmz',
        'application/vnd.grafeq' => 'gqf',
        'application/vnd.groove-account' => 'gac',
        'application/vnd.groove-help' => 'ghf',
        'application/vnd.groove-identity-message' => 'gim',
        'application/vnd.groove-injector' => 'grv',
        'application/vnd.groove-tool-message' => 'gtm',
        'application/vnd.groove-tool-template' => 'tpl',
        'application/vnd.groove-vcard' => 'vcg',
        'application/vnd.hal+xml' => 'hal',
        'application/vnd.handheld-entertainment+xml' => 'zmm',
        'application/vnd.hbci' => 'hbci',
        'application/vnd.hhe.lesson-player' => 'les',
        'application/vnd.hp-hpgl' => 'hpgl',
        'application/vnd.hp-hpid' => 'hpid',
        'application/vnd.hp-hps' => 'hps',
        'application/vnd.hp-jlyt' => 'jlt',
        'application/vnd.hp-pcl' => 'pcl',
        'application/vnd.hp-pclxl' => 'pclxl',
        'application/vnd.hydrostatix.sof-data' => 'sfd-hdstx',
        'application/vnd.ibm.minipay' => 'mpy',
        'application/vnd.ibm.modcap' => 'afp',
        'application/vnd.ibm.rights-management' => 'irm',
        'application/vnd.ibm.secure-container' => 'sc',
        'application/vnd.iccprofile' => 'icc',
        'application/vnd.igloader' => 'igl',
        'application/vnd.immervision-ivp' => 'ivp',
        'application/vnd.immervision-ivu' => 'ivu',
        'application/vnd.insors.igm' => 'igm',
        'application/vnd.intercon.formnet' => 'xpw',
        'application/vnd.intergeo' => 'i2g',
        'application/vnd.intu.qbo' => 'qbo',
        'application/vnd.intu.qfx' => 'qfx',
        'application/vnd.ipunplugged.rcprofile' => 'rcprofile',
        'application/vnd.irepository.package+xml' => 'irp',
        'application/vnd.is-xpr' => 'xpr',
        'application/vnd.isac.fcs' => 'fcs',
        'application/vnd.jam' => 'jam',
        'application/vnd.jcp.javame.midlet-rms' => 'rms',
        'application/vnd.jisp' => 'jisp',
        'application/vnd.joost.joda-archive' => 'joda',
        'application/vnd.kahootz' => 'ktz',
        'application/vnd.kde.karbon' => 'karbon',
        'application/vnd.kde.kchart' => 'chrt',
        'application/vnd.kde.kformula' => 'kfo',
        'application/vnd.kde.kivio' => 'flw',
        'application/vnd.kde.kontour' => 'kon',
        'application/vnd.kde.kpresenter' => 'kpr',
        'application/vnd.kde.kspread' => 'ksp',
        'application/vnd.kde.kword' => 'kwd',
        'application/vnd.kenameaapp' => 'htke',
        'application/vnd.kidspiration' => 'kia',
        'application/vnd.kinar' => 'kne',
        'application/vnd.koan' => 'skp',
        'application/vnd.kodak-descriptor' => 'sse',
        'application/vnd.las.las+xml' => 'lasxml',
        'application/vnd.llamagraphics.life-balance.desktop' => 'lbd',
        'application/vnd.llamagraphics.life-balance.exchange+xml' => 'lbe',
        'application/vnd.lotus-1-2-3' => '123',
        'application/vnd.lotus-approach' => 'apr',
        'application/vnd.lotus-freelance' => 'pre',
        'application/vnd.lotus-notes' => 'nsf',
        'application/vnd.lotus-organizer' => 'org',
        'application/vnd.lotus-screencam' => 'scm',
        'application/vnd.lotus-wordpro' => 'lwp',
        'application/vnd.macports.portpkg' => 'portpkg',
        'application/vnd.mcd' => 'mcd',
        'application/vnd.medcalcdata' => 'mc1',
        'application/vnd.mediastation.cdkey' => 'cdkey',
        'application/vnd.mfer' => 'mwf',
        'application/vnd.mfmp' => 'mfm',
        'application/vnd.micrografx.flo' => 'flo',
        'application/vnd.micrografx.igx' => 'igx',
        'application/vnd.mif' => 'mif',
        'application/vnd.mobius.daf' => 'daf',
        'application/vnd.mobius.dis' => 'dis',
        'application/vnd.mobius.mbk' => 'mbk',
        'application/vnd.mobius.mqy' => 'mqy',
        'application/vnd.mobius.msl' => 'msl',
        'application/vnd.mobius.plc' => 'plc',
        'application/vnd.mobius.txf' => 'txf',
        'application/vnd.mophun.application' => 'mpn',
        'application/vnd.mophun.certificate' => 'mpc',
        'application/vnd.mozilla.xul+xml' => 'xul',
        'application/vnd.ms-artgalry' => 'cil',
        'application/vnd.ms-cab-compressed' => 'cab',
        'application/vnd.ms-excel' => 'xls',
        'application/vnd.ms-excel.addin.macroenabled.12' => 'xlam',
        'application/vnd.ms-excel.sheet.binary.macroenabled.12' => 'xlsb',
        'application/vnd.ms-excel.sheet.macroenabled.12' => 'xlsm',
        'application/vnd.ms-excel.template.macroenabled.12' => 'xltm',
        'application/vnd.ms-fontobject' => 'eot',
        'application/vnd.ms-htmlhelp' => 'chm',
        'application/vnd.ms-ims' => 'ims',
        'application/vnd.ms-lrm' => 'lrm',
        'application/vnd.ms-officetheme' => 'thmx',
        'application/vnd.ms-pki.seccat' => 'cat',
        'application/vnd.ms-pki.stl' => 'stl',
        'application/vnd.ms-powerpoint' => 'ppt',
        'application/vnd.ms-powerpoint.addin.macroenabled.12' => 'ppam',
        'application/vnd.ms-powerpoint.presentation.macroenabled.12' => 'pptm',
        'application/vnd.ms-powerpoint.slide.macroenabled.12' => 'sldm',
        'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => 'ppsm',
        'application/vnd.ms-powerpoint.template.macroenabled.12' => 'potm',
        'application/vnd.ms-project' => 'mpp',
        'application/vnd.ms-word.document.macroenabled.12' => 'docm',
        'application/vnd.ms-word.template.macroenabled.12' => 'dotm',
        'application/vnd.ms-works' => 'wps',
        'application/vnd.ms-wpl' => 'wpl',
        'application/vnd.ms-xpsdocument' => 'xps',
        'application/vnd.mseq' => 'mseq',
        'application/vnd.musician' => 'mus',
        'application/vnd.muvee.style' => 'msty',
        'application/vnd.mynfc' => 'taglet',
        'application/vnd.neurolanguage.nlu' => 'nlu',
        'application/vnd.nitf' => 'ntf',
        'application/vnd.noblenet-directory' => 'nnd',
        'application/vnd.noblenet-sealer' => 'nns',
        'application/vnd.noblenet-web' => 'nnw',
        'application/vnd.nokia.n-gage.data' => 'ngdat',
        'application/vnd.nokia.n-gage.symbian.install' => 'n-gage',
        'application/vnd.nokia.radio-preset' => 'rpst',
        'application/vnd.nokia.radio-presets' => 'rpss',
        'application/vnd.novadigm.edm' => 'edm',
        'application/vnd.novadigm.edx' => 'edx',
        'application/vnd.novadigm.ext' => 'ext',
        'application/vnd.oasis.opendocument.chart' => 'odc',
        'application/vnd.oasis.opendocument.chart-template' => 'otc',
        'application/vnd.oasis.opendocument.database' => 'odb',
        'application/vnd.oasis.opendocument.formula' => 'odf',
        'application/vnd.oasis.opendocument.formula-template' => 'odft',
        'application/vnd.oasis.opendocument.graphics' => 'odg',
        'application/vnd.oasis.opendocument.graphics-template' => 'otg',
        'application/vnd.oasis.opendocument.image' => 'odi',
        'application/vnd.oasis.opendocument.image-template' => 'oti',
        'application/vnd.oasis.opendocument.presentation' => 'odp',
        'application/vnd.oasis.opendocument.presentation-template' => 'otp',
        'application/vnd.oasis.opendocument.spreadsheet' => 'ods',
        'application/vnd.oasis.opendocument.spreadsheet-template' => 'ots',
        'application/vnd.oasis.opendocument.text' => 'odt',
        'application/vnd.oasis.opendocument.text-master' => 'odm',
        'application/vnd.oasis.opendocument.text-template' => 'ott',
        'application/vnd.oasis.opendocument.text-web' => 'oth',
        'application/vnd.olpc-sugar' => 'xo',
        'application/vnd.oma.dd2+xml' => 'dd2',
        'application/vnd.openofficeorg.extension' => 'oxt',
        'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx',
        'application/vnd.openxmlformats-officedocument.presentationml.slide' => 'sldx',
        'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => 'ppsx',
        'application/vnd.openxmlformats-officedocument.presentationml.template' => 'potx',
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx',
        'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => 'xltx',
        'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx',
        'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => 'dotx',
        'application/vnd.osgeo.mapguide.package' => 'mgp',
        'application/vnd.osgi.dp' => 'dp',
        'application/vnd.osgi.subsystem' => 'esa',
        'application/vnd.palm' => 'pdb',
        'application/vnd.pawaafile' => 'paw',
        'application/vnd.pg.format' => 'str',
        'application/vnd.pg.osasli' => 'ei6',
        'application/vnd.picsel' => 'efif',
        'application/vnd.pmi.widget' => 'wg',
        'application/vnd.pocketlearn' => 'plf',
        'application/vnd.powerbuilder6' => 'pbd',
        'application/vnd.previewsystems.box' => 'box',
        'application/vnd.proteus.magazine' => 'mgz',
        'application/vnd.publishare-delta-tree' => 'qps',
        'application/vnd.pvi.ptid1' => 'ptid',
        'application/vnd.quark.quarkxpress' => 'qxd',
        'application/vnd.realvnc.bed' => 'bed',
        'application/vnd.recordare.musicxml' => 'mxl',
        'application/vnd.recordare.musicxml+xml' => 'musicxml',
        'application/vnd.rig.cryptonote' => 'cryptonote',
        'application/vnd.rim.cod' => 'cod',
        'application/vnd.rn-realmedia' => 'rm',
        'application/vnd.rn-realmedia-vbr' => 'rmvb',
        'application/vnd.route66.link66+xml' => 'link66',
        'application/vnd.sailingtracker.track' => 'st',
        'application/vnd.seemail' => 'see',
        'application/vnd.sema' => 'sema',
        'application/vnd.semd' => 'semd',
        'application/vnd.semf' => 'semf',
        'application/vnd.shana.informed.formdata' => 'ifm',
        'application/vnd.shana.informed.formtemplate' => 'itp',
        'application/vnd.shana.informed.interchange' => 'iif',
        'application/vnd.shana.informed.package' => 'ipk',
        'application/vnd.simtech-mindmapper' => 'twd',
        'application/vnd.smaf' => 'mmf',
        'application/vnd.smart.teacher' => 'teacher',
        'application/vnd.solent.sdkm+xml' => 'sdkm',
        'application/vnd.spotfire.dxp' => 'dxp',
        'application/vnd.spotfire.sfs' => 'sfs',
        'application/vnd.stardivision.calc' => 'sdc',
        'application/vnd.stardivision.draw' => 'sda',
        'application/vnd.stardivision.impress' => 'sdd',
        'application/vnd.stardivision.math' => 'smf',
        'application/vnd.stardivision.writer' => 'sdw',
        'application/vnd.stardivision.writer-global' => 'sgl',
        'application/vnd.stepmania.package' => 'smzip',
        'application/vnd.stepmania.stepchart' => 'sm',
        'application/vnd.sun.xml.calc' => 'sxc',
        'application/vnd.sun.xml.calc.template' => 'stc',
        'application/vnd.sun.xml.draw' => 'sxd',
        'application/vnd.sun.xml.draw.template' => 'std',
        'application/vnd.sun.xml.impress' => 'sxi',
        'application/vnd.sun.xml.impress.template' => 'sti',
        'application/vnd.sun.xml.math' => 'sxm',
        'application/vnd.sun.xml.writer' => 'sxw',
        'application/vnd.sun.xml.writer.global' => 'sxg',
        'application/vnd.sun.xml.writer.template' => 'stw',
        'application/vnd.sus-calendar' => 'sus',
        'application/vnd.svd' => 'svd',
        'application/vnd.symbian.install' => 'sis',
        'application/vnd.syncml+xml' => 'xsm',
        'application/vnd.syncml.dm+wbxml' => 'bdm',
        'application/vnd.syncml.dm+xml' => 'xdm',
        'application/vnd.tao.intent-module-archive' => 'tao',
        'application/vnd.tcpdump.pcap' => 'pcap',
        'application/vnd.tmobile-livetv' => 'tmo',
        'application/vnd.trid.tpt' => 'tpt',
        'application/vnd.triscape.mxs' => 'mxs',
        'application/vnd.trueapp' => 'tra',
        'application/vnd.ufdl' => 'ufd',
        'application/vnd.uiq.theme' => 'utz',
        'application/vnd.umajin' => 'umj',
        'application/vnd.unity' => 'unityweb',
        'application/vnd.uoml+xml' => 'uoml',
        'application/vnd.vcx' => 'vcx',
        'application/vnd.visio' => 'vsd',
        'application/vnd.visionary' => 'vis',
        'application/vnd.vsf' => 'vsf',
        'application/vnd.wap.wbxml' => 'wbxml',
        'application/vnd.wap.wmlc' => 'wmlc',
        'application/vnd.wap.wmlscriptc' => 'wmlsc',
        'application/vnd.webturbo' => 'wtb',
        'application/vnd.wolfram.player' => 'nbp',
        'application/vnd.wordperfect' => 'wpd',
        'application/vnd.wqd' => 'wqd',
        'application/vnd.wt.stf' => 'stf',
        'application/vnd.xara' => 'xar',
        'application/vnd.xfdl' => 'xfdl',
        'application/vnd.yamaha.hv-dic' => 'hvd',
        'application/vnd.yamaha.hv-script' => 'hvs',
        'application/vnd.yamaha.hv-voice' => 'hvp',
        'application/vnd.yamaha.openscoreformat' => 'osf',
        'application/vnd.yamaha.openscoreformat.osfpvg+xml' => 'osfpvg',
        'application/vnd.yamaha.smaf-audio' => 'saf',
        'application/vnd.yamaha.smaf-phrase' => 'spf',
        'application/vnd.yellowriver-custom-menu' => 'cmp',
        'application/vnd.zul' => 'zir',
        'application/vnd.zzazz.deck+xml' => 'zaz',
        'application/voicexml+xml' => 'vxml',
        'application/widget' => 'wgt',
        'application/winhlp' => 'hlp',
        'application/wsdl+xml' => 'wsdl',
        'application/wspolicy+xml' => 'wspolicy',
        'application/x-7z-compressed' => '7z',
        'application/x-abiword' => 'abw',
        'application/x-ace-compressed' => 'ace',
        'application/x-apple-diskimage' => 'dmg',
        'application/x-authorware-bin' => 'aab',
        'application/x-authorware-map' => 'aam',
        'application/x-authorware-seg' => 'aas',
        'application/x-bcpio' => 'bcpio',
        'application/x-bittorrent' => 'torrent',
        'application/x-blorb' => 'blb',
        'application/x-bzip' => 'bz',
        'application/x-bzip2' => 'bz2',
        'application/x-cbr' => 'cbr',
        'application/x-cdlink' => 'vcd',
        'application/x-cfs-compressed' => 'cfs',
        'application/x-chat' => 'chat',
        'application/x-chess-pgn' => 'pgn',
        'application/x-conference' => 'nsc',
        'application/x-cpio' => 'cpio',
        'application/x-csh' => 'csh',
        'application/x-debian-package' => 'deb',
        'application/x-dgc-compressed' => 'dgc',
        'application/x-director' => 'dir',
        'application/x-doom' => 'wad',
        'application/x-dtbncx+xml' => 'ncx',
        'application/x-dtbook+xml' => 'dtb',
        'application/x-dtbresource+xml' => 'res',
        'application/x-dvi' => 'dvi',
        'application/x-envoy' => 'evy',
        'application/x-eva' => 'eva',
        'application/x-font-bdf' => 'bdf',
        'application/x-font-ghostscript' => 'gsf',
        'application/x-font-linux-psf' => 'psf',
        'application/x-font-otf' => 'otf',
        'application/x-font-pcf' => 'pcf',
        'application/x-font-snf' => 'snf',
        'application/x-font-ttf' => 'ttf',
        'application/x-font-type1' => 'pfa',
        'application/x-font-woff' => 'woff',
        'application/x-freearc' => 'arc',
        'application/x-futuresplash' => 'spl',
        'application/x-gca-compressed' => 'gca',
        'application/x-glulx' => 'ulx',
        'application/x-gnumeric' => 'gnumeric',
        'application/x-gramps-xml' => 'gramps',
        'application/x-gtar' => 'gtar',
        'application/x-hdf' => 'hdf',
        'application/x-install-instructions' => 'install',
        'application/x-iso9660-image' => 'iso',
        'application/x-java-jnlp-file' => 'jnlp',
        'application/x-latex' => 'latex',
        'application/x-lzh-compressed' => 'lzh',
        'application/x-mie' => 'mie',
        'application/x-mobipocket-ebook' => 'prc',
        'application/x-ms-application' => 'application',
        'application/x-ms-shortcut' => 'lnk',
        'application/x-ms-wmd' => 'wmd',
        'application/x-ms-wmz' => 'wmz',
        'application/x-ms-xbap' => 'xbap',
        'application/x-msaccess' => 'mdb',
        'application/x-msbinder' => 'obd',
        'application/x-mscardfile' => 'crd',
        'application/x-msclip' => 'clp',
        'application/x-msdownload' => 'exe',
        'application/x-msmediaview' => 'mvb',
        'application/x-msmetafile' => 'wmf',
        'application/x-msmoney' => 'mny',
        'application/x-mspublisher' => 'pub',
        'application/x-msschedule' => 'scd',
        'application/x-msterminal' => 'trm',
        'application/x-mswrite' => 'wri',
        'application/x-netcdf' => 'nc',
        'application/x-nzb' => 'nzb',
        'application/x-pkcs12' => 'p12',
        'application/x-pkcs7-certificates' => 'p7b',
        'application/x-pkcs7-certreqresp' => 'p7r',
        'application/x-rar-compressed' => 'rar',
        'application/x-rar' => 'rar',
        'application/x-research-info-systems' => 'ris',
        'application/x-sh' => 'sh',
        'application/x-shar' => 'shar',
        'application/x-shockwave-flash' => 'swf',
        'application/x-silverlight-app' => 'xap',
        'application/x-sql' => 'sql',
        'application/x-stuffit' => 'sit',
        'application/x-stuffitx' => 'sitx',
        'application/x-subrip' => 'srt',
        'application/x-sv4cpio' => 'sv4cpio',
        'application/x-sv4crc' => 'sv4crc',
        'application/x-t3vm-image' => 't3',
        'application/x-tads' => 'gam',
        'application/x-tar' => 'tar',
        'application/x-tcl' => 'tcl',
        'application/x-tex' => 'tex',
        'application/x-tex-tfm' => 'tfm',
        'application/x-texinfo' => 'texinfo',
        'application/x-tgif' => 'obj',
        'application/x-ustar' => 'ustar',
        'application/x-wais-source' => 'src',
        'application/x-x509-ca-cert' => 'der',
        'application/x-xfig' => 'fig',
        'application/x-xliff+xml' => 'xlf',
        'application/x-xpinstall' => 'xpi',
        'application/x-xz' => 'xz',
        'application/x-zmachine' => 'z1',
        'application/xaml+xml' => 'xaml',
        'application/xcap-diff+xml' => 'xdf',
        'application/xenc+xml' => 'xenc',
        'application/xhtml+xml' => 'xhtml',
        'application/xml' => 'xml',
        'application/xml-dtd' => 'dtd',
        'application/xop+xml' => 'xop',
        'application/xproc+xml' => 'xpl',
        'application/xslt+xml' => 'xslt',
        'application/xspf+xml' => 'xspf',
        'application/xv+xml' => 'mxml',
        'application/yang' => 'yang',
        'application/yin+xml' => 'yin',
        'application/zip' => 'zip',
        'audio/adpcm' => 'adp',
        'audio/basic' => 'au',
        'audio/midi' => 'mid',
        'audio/mp4' => 'mp4a',
        'audio/mpeg' => 'mpga',
        'audio/ogg' => 'oga',
        'audio/s3m' => 's3m',
        'audio/silk' => 'sil',
        'audio/vnd.dece.audio' => 'uva',
        'audio/vnd.digital-winds' => 'eol',
        'audio/vnd.dra' => 'dra',
        'audio/vnd.dts' => 'dts',
        'audio/vnd.dts.hd' => 'dtshd',
        'audio/vnd.lucent.voice' => 'lvp',
        'audio/vnd.ms-playready.media.pya' => 'pya',
        'audio/vnd.nuera.ecelp4800' => 'ecelp4800',
        'audio/vnd.nuera.ecelp7470' => 'ecelp7470',
        'audio/vnd.nuera.ecelp9600' => 'ecelp9600',
        'audio/vnd.rip' => 'rip',
        'audio/webm' => 'weba',
        'audio/x-aac' => 'aac',
        'audio/x-aiff' => 'aif',
        'audio/x-caf' => 'caf',
        'audio/x-flac' => 'flac',
        'audio/x-matroska' => 'mka',
        'audio/x-mpegurl' => 'm3u',
        'audio/x-ms-wax' => 'wax',
        'audio/x-ms-wma' => 'wma',
        'audio/x-pn-realaudio' => 'ram',
        'audio/x-pn-realaudio-plugin' => 'rmp',
        'audio/x-wav' => 'wav',
        'audio/xm' => 'xm',
        'chemical/x-cdx' => 'cdx',
        'chemical/x-cif' => 'cif',
        'chemical/x-cmdf' => 'cmdf',
        'chemical/x-cml' => 'cml',
        'chemical/x-csml' => 'csml',
        'chemical/x-xyz' => 'xyz',
        'image/bmp' => 'bmp',
        'image/cgm' => 'cgm',
        'image/g3fax' => 'g3',
        'image/gif' => 'gif',
        'image/ief' => 'ief',
        'image/jpeg' => 'jpeg',
        'image/ktx' => 'ktx',
        'image/png' => 'png',
        'image/prs.btif' => 'btif',
        'image/sgi' => 'sgi',
        'image/svg+xml' => 'svg',
        'image/tiff' => 'tiff',
        'image/vnd.adobe.photoshop' => 'psd',
        'image/vnd.dece.graphic' => 'uvi',
        'image/vnd.dvb.subtitle' => 'sub',
        'image/vnd.djvu' => 'djvu',
        'image/vnd.dwg' => 'dwg',
        'image/vnd.dxf' => 'dxf',
        'image/vnd.fastbidsheet' => 'fbs',
        'image/vnd.fpx' => 'fpx',
        'image/vnd.fst' => 'fst',
        'image/vnd.fujixerox.edmics-mmr' => 'mmr',
        'image/vnd.fujixerox.edmics-rlc' => 'rlc',
        'image/vnd.ms-modi' => 'mdi',
        'image/vnd.ms-photo' => 'wdp',
        'image/vnd.net-fpx' => 'npx',
        'image/vnd.wap.wbmp' => 'wbmp',
        'image/vnd.xiff' => 'xif',
        'image/webp' => 'webp',
        'image/x-3ds' => '3ds',
        'image/x-cmu-raster' => 'ras',
        'image/x-cmx' => 'cmx',
        'image/x-freehand' => 'fh',
        'image/x-icon' => 'ico',
        'image/x-mrsid-image' => 'sid',
        'image/x-pcx' => 'pcx',
        'image/x-pict' => 'pic',
        'image/x-portable-anymap' => 'pnm',
        'image/x-portable-bitmap' => 'pbm',
        'image/x-portable-graymap' => 'pgm',
        'image/x-portable-pixmap' => 'ppm',
        'image/x-rgb' => 'rgb',
        'image/x-tga' => 'tga',
        'image/x-xbitmap' => 'xbm',
        'image/x-xpixmap' => 'xpm',
        'image/x-xwindowdump' => 'xwd',
        'message/rfc822' => 'eml',
        'model/iges' => 'igs',
        'model/mesh' => 'msh',
        'model/vnd.collada+xml' => 'dae',
        'model/vnd.dwf' => 'dwf',
        'model/vnd.gdl' => 'gdl',
        'model/vnd.gtw' => 'gtw',
        'model/vnd.mts' => 'mts',
        'model/vnd.vtu' => 'vtu',
        'model/vrml' => 'wrl',
        'model/x3d+binary' => 'x3db',
        'model/x3d+vrml' => 'x3dv',
        'model/x3d+xml' => 'x3d',
        'text/cache-manifest' => 'appcache',
        'text/calendar' => 'ics',
        'text/css' => 'css',
        'text/csv' => 'csv',
        'text/html' => 'html',
        'text/n3' => 'n3',
        'text/plain' => 'txt',
        'text/prs.lines.tag' => 'dsc',
        'text/richtext' => 'rtx',
        'text/sgml' => 'sgml',
        'text/tab-separated-values' => 'tsv',
        'text/troff' => 't',
        'text/turtle' => 'ttl',
        'text/uri-list' => 'uri',
        'text/vcard' => 'vcard',
        'text/vnd.curl' => 'curl',
        'text/vnd.curl.dcurl' => 'dcurl',
        'text/vnd.curl.scurl' => 'scurl',
        'text/vnd.curl.mcurl' => 'mcurl',
        'text/vnd.dvb.subtitle' => 'sub',
        'text/vnd.fly' => 'fly',
        'text/vnd.fmi.flexstor' => 'flx',
        'text/vnd.graphviz' => 'gv',
        'text/vnd.in3d.3dml' => '3dml',
        'text/vnd.in3d.spot' => 'spot',
        'text/vnd.sun.j2me.app-descriptor' => 'jad',
        'text/vnd.wap.wml' => 'wml',
        'text/vnd.wap.wmlscript' => 'wmls',
        'text/x-asm' => 's',
        'text/x-c' => 'c',
        'text/x-fortran' => 'f',
        'text/x-pascal' => 'p',
        'text/x-java-source' => 'java',
        'text/x-opml' => 'opml',
        'text/x-nfo' => 'nfo',
        'text/x-setext' => 'etx',
        'text/x-sfv' => 'sfv',
        'text/x-uuencode' => 'uu',
        'text/x-vcalendar' => 'vcs',
        'text/x-vcard' => 'vcf',
        'video/3gpp' => '3gp',
        'video/3gpp2' => '3g2',
        'video/h261' => 'h261',
        'video/h263' => 'h263',
        'video/h264' => 'h264',
        'video/jpeg' => 'jpgv',
        'video/jpm' => 'jpm',
        'video/mj2' => 'mj2',
        'video/mp4' => 'mp4',
        'video/mpeg' => 'mpeg',
        'video/ogg' => 'ogv',
        'video/quicktime' => 'qt',
        'video/vnd.dece.hd' => 'uvh',
        'video/vnd.dece.mobile' => 'uvm',
        'video/vnd.dece.pd' => 'uvp',
        'video/vnd.dece.sd' => 'uvs',
        'video/vnd.dece.video' => 'uvv',
        'video/vnd.dvb.file' => 'dvb',
        'video/vnd.fvt' => 'fvt',
        'video/vnd.mpegurl' => 'mxu',
        'video/vnd.ms-playready.media.pyv' => 'pyv',
        'video/vnd.uvvu.mp4' => 'uvu',
        'video/vnd.vivo' => 'viv',
        'video/webm' => 'webm',
        'video/x-f4v' => 'f4v',
        'video/x-fli' => 'fli',
        'video/x-flv' => 'flv',
        'video/x-m4v' => 'm4v',
        'video/x-matroska' => 'mkv',
        'video/x-mng' => 'mng',
        'video/x-ms-asf' => 'asf',
        'video/x-ms-vob' => 'vob',
        'video/x-ms-wm' => 'wm',
        'video/x-ms-wmv' => 'wmv',
        'video/x-ms-wmx' => 'wmx',
        'video/x-ms-wvx' => 'wvx',
        'video/x-msvideo' => 'avi',
        'video/x-sgi-movie' => 'movie',
        'video/x-smv' => 'smv',
        'x-conference/x-cooltalk' => 'ice',
    );

    /**
     * {@inheritdoc}
     */
    public function guess($mimeType)
    {
        return isset($this->defaultExtensions[$mimeType]) ? $this->defaultExtensions[$mimeType] : null;
    }
}
PK�`�\2�k�	�	Hpear/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\MimeType;

/**
 * A singleton mime type to file extension guesser.
 *
 * A default guesser is provided.
 * You can register custom guessers by calling the register()
 * method on the singleton instance:
 *
 *     $guesser = ExtensionGuesser::getInstance();
 *     $guesser->register(new MyCustomExtensionGuesser());
 *
 * The last registered guesser is preferred over previously registered ones.
 */
class ExtensionGuesser implements ExtensionGuesserInterface
{
    /**
     * The singleton instance
     *
     * @var ExtensionGuesser
     */
    private static $instance = null;

    /**
     * All registered ExtensionGuesserInterface instances
     *
     * @var array
     */
    protected $guessers = array();

    /**
     * Returns the singleton instance
     *
     * @return ExtensionGuesser
     */
    public static function getInstance()
    {
        if (null === self::$instance) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    /**
     * Registers all natively provided extension guessers
     */
    private function __construct()
    {
        $this->register(new MimeTypeExtensionGuesser());
    }

    /**
     * Registers a new extension guesser
     *
     * When guessing, this guesser is preferred over previously registered ones.
     *
     * @param ExtensionGuesserInterface $guesser
     */
    public function register(ExtensionGuesserInterface $guesser)
    {
        array_unshift($this->guessers, $guesser);
    }

    /**
     * Tries to guess the extension
     *
     * The mime type is passed to each registered mime type guesser in reverse order
     * of their registration (last registered is queried first). Once a guesser
     * returns a value that is not NULL, this method terminates and returns the
     * value.
     *
     * @param string $mimeType The mime type
     *
     * @return string          The guessed extension or NULL, if none could be guessed
     */
    public function guess($mimeType)
    {
        foreach ($this->guessers as $guesser) {
            if (null !== $extension = $guesser->guess($mimeType)) {
                return $extension;
            }
        }
    }
}
PK�`�\�J��Qpear/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\MimeType;

use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;

/**
 * Guesses the mime type with the binary "file" (only available on *nix)
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface
{
    private $cmd;

    /**
     * Constructor.
     *
     * The $cmd pattern must contain a "%s" string that will be replaced
     * with the file name to guess.
     *
     * The command output must start with the mime type of the file.
     *
     * @param string $cmd The command to run to get the mime type of a file
     */
    public function __construct($cmd = 'file -b --mime %s 2>/dev/null')
    {
        $this->cmd = $cmd;
    }

    /**
     * Returns whether this guesser is supported on the current OS
     *
     * @return Boolean
     */
    public static function isSupported()
    {
        return !defined('PHP_WINDOWS_VERSION_BUILD') && function_exists('passthru') && function_exists('escapeshellarg');
    }

    /**
     * {@inheritdoc}
     */
    public function guess($path)
    {
        if (!is_file($path)) {
            throw new FileNotFoundException($path);
        }

        if (!is_readable($path)) {
            throw new AccessDeniedException($path);
        }

        if (!self::isSupported()) {
            return null;
        }

        ob_start();

        // need to use --mime instead of -i. see #6641
        passthru(sprintf($this->cmd, escapeshellarg($path)), $return);
        if ($return > 0) {
            ob_end_clean();

            return null;
        }

        $type = trim(ob_get_clean());

        if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\.]+)#i', $type, $match)) {
            // it's not a type, but an error message
            return null;
        }

        return $match[1];
    }
}
PK�`�\��ގ�#�#;pear/Symfony/Component/HttpFoundation/File/UploadedFile.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File;

use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;

/**
 * A file uploaded through a form.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class UploadedFile extends File
{
    /**
     * Whether the test mode is activated.
     *
     * Local files are used in test mode hence the code should not enforce HTTP uploads.
     *
     * @var Boolean
     */
    private $test = false;

    /**
     * The original name of the uploaded file.
     *
     * @var string
     */
    private $originalName;

    /**
     * The mime type provided by the uploader.
     *
     * @var string
     */
    private $mimeType;

    /**
     * The file size provided by the uploader.
     *
     * @var string
     */
    private $size;

    /**
     * The UPLOAD_ERR_XXX constant provided by the uploader.
     *
     * @var integer
     */
    private $error;

    /**
     * Accepts the information of the uploaded file as provided by the PHP global $_FILES.
     *
     * The file object is only created when the uploaded file is valid (i.e. when the
     * isValid() method returns true). Otherwise the only methods that could be called
     * on an UploadedFile instance are:
     *
     *   * getClientOriginalName,
     *   * getClientMimeType,
     *   * isValid,
     *   * getError.
     *
     * Calling any other method on an non-valid instance will cause an unpredictable result.
     *
     * @param string  $path         The full temporary path to the file
     * @param string  $originalName The original file name
     * @param string  $mimeType     The type of the file as provided by PHP
     * @param integer $size         The file size
     * @param integer $error        The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants)
     * @param Boolean $test         Whether the test mode is active
     *
     * @throws FileException         If file_uploads is disabled
     * @throws FileNotFoundException If the file does not exist
     *
     * @api
     */
    public function __construct($path, $originalName, $mimeType = null, $size = null, $error = null, $test = false)
    {
        $this->originalName = $this->getName($originalName);
        $this->mimeType = $mimeType ?: 'application/octet-stream';
        $this->size = $size;
        $this->error = $error ?: UPLOAD_ERR_OK;
        $this->test = (Boolean) $test;

        parent::__construct($path, UPLOAD_ERR_OK === $this->error);
    }

    /**
     * Returns the original file name.
     *
     * It is extracted from the request from which the file has been uploaded.
     * Then it should not be considered as a safe value.
     *
     * @return string|null The original name
     *
     * @api
     */
    public function getClientOriginalName()
    {
        return $this->originalName;
    }

    /**
     * Returns the original file extension
     *
     * It is extracted from the original file name that was uploaded.
     * Then it should not be considered as a safe value.
     *
     * @return string The extension
     */
    public function getClientOriginalExtension()
    {
        return pathinfo($this->originalName, PATHINFO_EXTENSION);
    }

    /**
     * Returns the file mime type.
     *
     * The client mime type is extracted from the request from which the file
     * was uploaded, so it should not be considered as a safe value.
     *
     * For a trusted mime type, use getMimeType() instead (which guesses the mime
     * type based on the file content).
     *
     * @return string|null The mime type
     *
     * @see getMimeType
     *
     * @api
     */
    public function getClientMimeType()
    {
        return $this->mimeType;
    }

    /**
     * Returns the extension based on the client mime type.
     *
     * If the mime type is unknown, returns null.
     *
     * This method uses the mime type as guessed by getClientMimeType()
     * to guess the file extension. As such, the extension returned
     * by this method cannot be trusted.
     *
     * For a trusted extension, use guessExtension() instead (which guesses
     * the extension based on the guessed mime type for the file).
     *
     * @return string|null The guessed extension or null if it cannot be guessed
     *
     * @see guessExtension()
     * @see getClientMimeType()
     */
    public function guessClientExtension()
    {
        $type = $this->getClientMimeType();
        $guesser = ExtensionGuesser::getInstance();

        return $guesser->guess($type);
    }

    /**
     * Returns the file size.
     *
     * It is extracted from the request from which the file has been uploaded.
     * Then it should not be considered as a safe value.
     *
     * @return integer|null The file size
     *
     * @api
     */
    public function getClientSize()
    {
        return $this->size;
    }

    /**
     * Returns the upload error.
     *
     * If the upload was successful, the constant UPLOAD_ERR_OK is returned.
     * Otherwise one of the other UPLOAD_ERR_XXX constants is returned.
     *
     * @return integer The upload error
     *
     * @api
     */
    public function getError()
    {
        return $this->error;
    }

    /**
     * Returns whether the file was uploaded successfully.
     *
     * @return Boolean True if the file has been uploaded with HTTP and no error occurred.
     *
     * @api
     */
    public function isValid()
    {
        $isOk = $this->error === UPLOAD_ERR_OK;

        return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname());
    }

    /**
     * Moves the file to a new location.
     *
     * @param string $directory The destination folder
     * @param string $name      The new file name
     *
     * @return File A File object representing the new file
     *
     * @throws FileException if, for any reason, the file could not have been moved
     *
     * @api
     */
    public function move($directory, $name = null)
    {
        if ($this->isValid()) {
            if ($this->test) {
                return parent::move($directory, $name);
            }

            $target = $this->getTargetFile($directory, $name);

            if (!@move_uploaded_file($this->getPathname(), $target)) {
                $error = error_get_last();
                throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error['message'])));
            }

            @chmod($target, 0666 & ~umask());

            return $target;
        }

        throw new FileException($this->getErrorMessage());
    }

    /**
     * Returns the maximum size of an uploaded file as configured in php.ini
     *
     * @return int The maximum size of an uploaded file in bytes
     */
    public static function getMaxFilesize()
    {
        $iniMax = strtolower(ini_get('upload_max_filesize'));

        if ('' === $iniMax) {
            return PHP_INT_MAX;
        }

        $max = ltrim($iniMax, '+');
        if (0 === strpos($max, '0x')) {
            $max = intval($max, 16);
        } elseif (0 === strpos($max, '0')) {
            $max = intval($max, 8);
        } else {
            $max = intval($max);
        }

        switch (substr($iniMax, -1)) {
            case 't': $max *= 1024;
            case 'g': $max *= 1024;
            case 'm': $max *= 1024;
            case 'k': $max *= 1024;
        }

        return $max;
    }

    /**
     * Returns an informative upload error message.
     *
     * @return string The error message regarding the specified error code
     */
    public function getErrorMessage()
    {
        static $errors = array(
            UPLOAD_ERR_INI_SIZE   => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d kb).',
            UPLOAD_ERR_FORM_SIZE  => 'The file "%s" exceeds the upload limit defined in your form.',
            UPLOAD_ERR_PARTIAL    => 'The file "%s" was only partially uploaded.',
            UPLOAD_ERR_NO_FILE    => 'No file was uploaded.',
            UPLOAD_ERR_CANT_WRITE => 'The file "%s" could not be written on disk.',
            UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.',
            UPLOAD_ERR_EXTENSION  => 'File upload was stopped by a PHP extension.',
        );

        $errorCode = $this->error;
        $maxFilesize = $errorCode === UPLOAD_ERR_INI_SIZE ? self::getMaxFilesize() / 1024 : 0;
        $message = isset($errors[$errorCode]) ? $errors[$errorCode] : 'The file "%s" was not uploaded due to an unknown error.';

        return sprintf($message, $this->getClientOriginalName(), $maxFilesize);
    }
}
PK�`�\�)���3pear/Symfony/Component/HttpFoundation/File/File.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File;

use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;

/**
 * A file in the file system.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class File extends \SplFileInfo
{
    /**
     * Constructs a new file from the given path.
     *
     * @param string  $path      The path to the file
     * @param Boolean $checkPath Whether to check the path or not
     *
     * @throws FileNotFoundException If the given path is not a file
     *
     * @api
     */
    public function __construct($path, $checkPath = true)
    {
        if ($checkPath && !is_file($path)) {
            throw new FileNotFoundException($path);
        }

        parent::__construct($path);
    }

    /**
     * Returns the extension based on the mime type.
     *
     * If the mime type is unknown, returns null.
     *
     * This method uses the mime type as guessed by getMimeType()
     * to guess the file extension.
     *
     * @return string|null The guessed extension or null if it cannot be guessed
     *
     * @api
     *
     * @see ExtensionGuesser
     * @see getMimeType()
     */
    public function guessExtension()
    {
        $type = $this->getMimeType();
        $guesser = ExtensionGuesser::getInstance();

        return $guesser->guess($type);
    }

    /**
     * Returns the mime type of the file.
     *
     * The mime type is guessed using a MimeTypeGuesser instance, which uses finfo(),
     * mime_content_type() and the system binary "file" (in this order), depending on
     * which of those are available.
     *
     * @return string|null The guessed mime type (i.e. "application/pdf")
     *
     * @see MimeTypeGuesser
     *
     * @api
     */
    public function getMimeType()
    {
        $guesser = MimeTypeGuesser::getInstance();

        return $guesser->guess($this->getPathname());
    }

    /**
     * Returns the extension of the file.
     *
     * \SplFileInfo::getExtension() is not available before PHP 5.3.6
     *
     * @return string The extension
     *
     * @api
     */
    public function getExtension()
    {
        return pathinfo($this->getBasename(), PATHINFO_EXTENSION);
    }

    /**
     * Moves the file to a new location.
     *
     * @param string $directory The destination folder
     * @param string $name      The new file name
     *
     * @return File A File object representing the new file
     *
     * @throws FileException if the target file could not be created
     *
     * @api
     */
    public function move($directory, $name = null)
    {
        $target = $this->getTargetFile($directory, $name);

        if (!@rename($this->getPathname(), $target)) {
            $error = error_get_last();
            throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error['message'])));
        }

        @chmod($target, 0666 & ~umask());

        return $target;
    }

    protected function getTargetFile($directory, $name = null)
    {
        if (!is_dir($directory)) {
            if (false === @mkdir($directory, 0777, true)) {
                throw new FileException(sprintf('Unable to create the "%s" directory', $directory));
            }
        } elseif (!is_writable($directory)) {
            throw new FileException(sprintf('Unable to write in the "%s" directory', $directory));
        }

        $target = rtrim($directory, '/\\').DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name));

        return new File($target, false);
    }

    /**
     * Returns locale independent base name of the given path.
     *
     * @param string $name The new file name
     *
     * @return string containing
     */
    protected function getName($name)
    {
        $originalName = str_replace('\\', '/', $name);
        $pos = strrpos($originalName, '/');
        $originalName = false === $pos ? $originalName : substr($originalName, $pos + 1);

        return $originalName;
    }
}
PK�`�\�s�-��Npear/Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\Exception;

/**
 * Thrown when a file was not found
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FileNotFoundException extends FileException
{
    /**
     * Constructor.
     *
     * @param string $path The path to the file that was not found
     */
    public function __construct($path)
    {
        parent::__construct(sprintf('The file "%s" does not exist', $path));
    }
}
PK�`�\�S��==Ppear/Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\Exception;

class UnexpectedTypeException extends FileException
{
    public function __construct($value, $expectedType)
    {
        parent::__construct(sprintf('Expected argument of type %s, %s given', $expectedType, is_object($value) ? get_class($value) : gettype($value)));
    }
}
PK�`�\o�����Fpear/Symfony/Component/HttpFoundation/File/Exception/FileException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\Exception;

/**
 * Thrown when an error occurred in the component File
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FileException extends \RuntimeException
{
}
PK�`�\�1�e��Npear/Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\Exception;

/**
 * Thrown when the access on a file was denied.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class AccessDeniedException extends FileException
{
    /**
     * Constructor.
     *
     * @param string $path The path to the accessed file
     */
    public function __construct($path)
    {
        parent::__construct(sprintf('The file %s could not be accessed', $path));
    }
}
PK�`�\�gr��Hpear/Symfony/Component/HttpFoundation/File/Exception/UploadException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\File\Exception;

/**
 * Thrown when an error occurred during file upload
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class UploadException extends FileException
{
}
PK�`�\��F��0pear/Symfony/Component/HttpFoundation/Cookie.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * Represents a cookie
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 *
 * @api
 */
class Cookie
{
    protected $name;
    protected $value;
    protected $domain;
    protected $expire;
    protected $path;
    protected $secure;
    protected $httpOnly;

    /**
     * Constructor.
     *
     * @param string                   $name     The name of the cookie
     * @param string                   $value    The value of the cookie
     * @param integer|string|\DateTime $expire   The time the cookie expires
     * @param string                   $path     The path on the server in which the cookie will be available on
     * @param string                   $domain   The domain that the cookie is available to
     * @param Boolean                  $secure   Whether the cookie should only be transmitted over a secure HTTPS connection from the client
     * @param Boolean                  $httpOnly Whether the cookie will be made accessible only through the HTTP protocol
     *
     * @throws \InvalidArgumentException
     *
     * @api
     */
    public function __construct($name, $value = null, $expire = 0, $path = '/', $domain = null, $secure = false, $httpOnly = true)
    {
        // from PHP source code
        if (preg_match("/[=,; \t\r\n\013\014]/", $name)) {
            throw new \InvalidArgumentException(sprintf('The cookie name "%s" contains invalid characters.', $name));
        }

        if (empty($name)) {
            throw new \InvalidArgumentException('The cookie name cannot be empty.');
        }

        // convert expiration time to a Unix timestamp
        if ($expire instanceof \DateTime) {
            $expire = $expire->format('U');
        } elseif (!is_numeric($expire)) {
            $expire = strtotime($expire);

            if (false === $expire || -1 === $expire) {
                throw new \InvalidArgumentException('The cookie expiration time is not valid.');
            }
        }

        $this->name = $name;
        $this->value = $value;
        $this->domain = $domain;
        $this->expire = $expire;
        $this->path = empty($path) ? '/' : $path;
        $this->secure = (Boolean) $secure;
        $this->httpOnly = (Boolean) $httpOnly;
    }

    /**
     * Returns the cookie as a string.
     *
     * @return string The cookie
     */
    public function __toString()
    {
        $str = urlencode($this->getName()).'=';

        if ('' === (string) $this->getValue()) {
            $str .= 'deleted; expires='.gmdate("D, d-M-Y H:i:s T", time() - 31536001);
        } else {
            $str .= urlencode($this->getValue());

            if ($this->getExpiresTime() !== 0) {
                $str .= '; expires='.gmdate("D, d-M-Y H:i:s T", $this->getExpiresTime());
            }
        }

        if ($this->path) {
            $str .= '; path='.$this->path;
        }

        if ($this->getDomain()) {
            $str .= '; domain='.$this->getDomain();
        }

        if (true === $this->isSecure()) {
            $str .= '; secure';
        }

        if (true === $this->isHttpOnly()) {
            $str .= '; httponly';
        }

        return $str;
    }

    /**
     * Gets the name of the cookie.
     *
     * @return string
     *
     * @api
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Gets the value of the cookie.
     *
     * @return string
     *
     * @api
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * Gets the domain that the cookie is available to.
     *
     * @return string
     *
     * @api
     */
    public function getDomain()
    {
        return $this->domain;
    }

    /**
     * Gets the time the cookie expires.
     *
     * @return integer
     *
     * @api
     */
    public function getExpiresTime()
    {
        return $this->expire;
    }

    /**
     * Gets the path on the server in which the cookie will be available on.
     *
     * @return string
     *
     * @api
     */
    public function getPath()
    {
        return $this->path;
    }

    /**
     * Checks whether the cookie should only be transmitted over a secure HTTPS connection from the client.
     *
     * @return Boolean
     *
     * @api
     */
    public function isSecure()
    {
        return $this->secure;
    }

    /**
     * Checks whether the cookie will be made accessible only through the HTTP protocol.
     *
     * @return Boolean
     *
     * @api
     */
    public function isHttpOnly()
    {
        return $this->httpOnly;
    }

    /**
     * Whether this cookie is about to be cleared
     *
     * @return Boolean
     *
     * @api
     */
    public function isCleared()
    {
        return $this->expire < time();
    }
}
PK�`�\\�8��6pear/Symfony/Component/HttpFoundation/ParameterBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * ParameterBag is a container for key/value pairs.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class ParameterBag implements \IteratorAggregate, \Countable
{
    /**
     * Parameter storage.
     *
     * @var array
     */
    protected $parameters;

    /**
     * Constructor.
     *
     * @param array $parameters An array of parameters
     *
     * @api
     */
    public function __construct(array $parameters = array())
    {
        $this->parameters = $parameters;
    }

    /**
     * Returns the parameters.
     *
     * @return array An array of parameters
     *
     * @api
     */
    public function all()
    {
        return $this->parameters;
    }

    /**
     * Returns the parameter keys.
     *
     * @return array An array of parameter keys
     *
     * @api
     */
    public function keys()
    {
        return array_keys($this->parameters);
    }

    /**
     * Replaces the current parameters by a new set.
     *
     * @param array $parameters An array of parameters
     *
     * @api
     */
    public function replace(array $parameters = array())
    {
        $this->parameters = $parameters;
    }

    /**
     * Adds parameters.
     *
     * @param array $parameters An array of parameters
     *
     * @api
     */
    public function add(array $parameters = array())
    {
        $this->parameters = array_replace($this->parameters, $parameters);
    }

    /**
     * Returns a parameter by name.
     *
     * @param string  $path    The key
     * @param mixed   $default The default value if the parameter key does not exist
     * @param boolean $deep    If true, a path like foo[bar] will find deeper items
     *
     * @return mixed
     *
     * @throws \InvalidArgumentException
     *
     * @api
     */
    public function get($path, $default = null, $deep = false)
    {
        if (!$deep || false === $pos = strpos($path, '[')) {
            return array_key_exists($path, $this->parameters) ? $this->parameters[$path] : $default;
        }

        $root = substr($path, 0, $pos);
        if (!array_key_exists($root, $this->parameters)) {
            return $default;
        }

        $value = $this->parameters[$root];
        $currentKey = null;
        for ($i = $pos, $c = strlen($path); $i < $c; $i++) {
            $char = $path[$i];

            if ('[' === $char) {
                if (null !== $currentKey) {
                    throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "[" at position %d.', $i));
                }

                $currentKey = '';
            } elseif (']' === $char) {
                if (null === $currentKey) {
                    throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "]" at position %d.', $i));
                }

                if (!is_array($value) || !array_key_exists($currentKey, $value)) {
                    return $default;
                }

                $value = $value[$currentKey];
                $currentKey = null;
            } else {
                if (null === $currentKey) {
                    throw new \InvalidArgumentException(sprintf('Malformed path. Unexpected "%s" at position %d.', $char, $i));
                }

                $currentKey .= $char;
            }
        }

        if (null !== $currentKey) {
            throw new \InvalidArgumentException(sprintf('Malformed path. Path must end with "]".'));
        }

        return $value;
    }

    /**
     * Sets a parameter by name.
     *
     * @param string $key   The key
     * @param mixed  $value The value
     *
     * @api
     */
    public function set($key, $value)
    {
        $this->parameters[$key] = $value;
    }

    /**
     * Returns true if the parameter is defined.
     *
     * @param string $key The key
     *
     * @return Boolean true if the parameter exists, false otherwise
     *
     * @api
     */
    public function has($key)
    {
        return array_key_exists($key, $this->parameters);
    }

    /**
     * Removes a parameter.
     *
     * @param string $key The key
     *
     * @api
     */
    public function remove($key)
    {
        unset($this->parameters[$key]);
    }

    /**
     * Returns the alphabetic characters of the parameter value.
     *
     * @param string  $key     The parameter key
     * @param mixed   $default The default value if the parameter key does not exist
     * @param boolean $deep    If true, a path like foo[bar] will find deeper items
     *
     * @return string The filtered value
     *
     * @api
     */
    public function getAlpha($key, $default = '', $deep = false)
    {
        return preg_replace('/[^[:alpha:]]/', '', $this->get($key, $default, $deep));
    }

    /**
     * Returns the alphabetic characters and digits of the parameter value.
     *
     * @param string  $key     The parameter key
     * @param mixed   $default The default value if the parameter key does not exist
     * @param boolean $deep    If true, a path like foo[bar] will find deeper items
     *
     * @return string The filtered value
     *
     * @api
     */
    public function getAlnum($key, $default = '', $deep = false)
    {
        return preg_replace('/[^[:alnum:]]/', '', $this->get($key, $default, $deep));
    }

    /**
     * Returns the digits of the parameter value.
     *
     * @param string  $key     The parameter key
     * @param mixed   $default The default value if the parameter key does not exist
     * @param boolean $deep    If true, a path like foo[bar] will find deeper items
     *
     * @return string The filtered value
     *
     * @api
     */
    public function getDigits($key, $default = '', $deep = false)
    {
        // we need to remove - and + because they're allowed in the filter
        return str_replace(array('-', '+'), '', $this->filter($key, $default, $deep, FILTER_SANITIZE_NUMBER_INT));
    }

    /**
     * Returns the parameter value converted to integer.
     *
     * @param string  $key     The parameter key
     * @param mixed   $default The default value if the parameter key does not exist
     * @param boolean $deep    If true, a path like foo[bar] will find deeper items
     *
     * @return integer The filtered value
     *
     * @api
     */
    public function getInt($key, $default = 0, $deep = false)
    {
        return (int) $this->get($key, $default, $deep);
    }

    /**
     * Filter key.
     *
     * @param string  $key     Key.
     * @param mixed   $default Default = null.
     * @param boolean $deep    Default = false.
     * @param integer $filter  FILTER_* constant.
     * @param mixed   $options Filter options.
     *
     * @see http://php.net/manual/en/function.filter-var.php
     *
     * @return mixed
     */
    public function filter($key, $default = null, $deep = false, $filter = FILTER_DEFAULT, $options = array())
    {
        $value = $this->get($key, $default, $deep);

        // Always turn $options into an array - this allows filter_var option shortcuts.
        if (!is_array($options) && $options) {
            $options = array('flags' => $options);
        }

        // Add a convenience check for arrays.
        if (is_array($value) && !isset($options['flags'])) {
            $options['flags'] = FILTER_REQUIRE_ARRAY;
        }

        return filter_var($value, $filter, $options);
    }

    /**
     * Returns an iterator for parameters.
     *
     * @return \ArrayIterator An \ArrayIterator instance
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->parameters);
    }

    /**
     * Returns the number of parameters.
     *
     * @return int The number of parameters
     */
    public function count()
    {
        return count($this->parameters);
    }
}
PK�`�\�s
��:pear/Symfony/Component/HttpFoundation/StreamedResponse.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * StreamedResponse represents a streamed HTTP response.
 *
 * A StreamedResponse uses a callback for its content.
 *
 * The callback should use the standard PHP functions like echo
 * to stream the response back to the client. The flush() method
 * can also be used if needed.
 *
 * @see flush()
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class StreamedResponse extends Response
{
    protected $callback;
    protected $streamed;

    /**
     * Constructor.
     *
     * @param callable|null $callback A valid PHP callback or null to set it later
     * @param integer       $status   The response status code
     * @param array         $headers  An array of response headers
     *
     * @api
     */
    public function __construct($callback = null, $status = 200, $headers = array())
    {
        parent::__construct(null, $status, $headers);

        if (null !== $callback) {
            $this->setCallback($callback);
        }
        $this->streamed = false;
    }

    /**
     * Factory method for chainability
     *
     * @param callable|null $callback A valid PHP callback or null to set it later
     * @param integer       $status   The response status code
     * @param array         $headers  An array of response headers
     *
     * @return StreamedResponse
     */
    public static function create($callback = null, $status = 200, $headers = array())
    {
        return new static($callback, $status, $headers);
    }

    /**
     * Sets the PHP callback associated with this Response.
     *
     * @param callable $callback A valid PHP callback
     *
     * @throws \LogicException
     */
    public function setCallback($callback)
    {
        if (!is_callable($callback)) {
            throw new \LogicException('The Response callback must be a valid PHP callable.');
        }
        $this->callback = $callback;
    }

    /**
     * {@inheritdoc}
     */
    public function prepare(Request $request)
    {
        $this->headers->set('Cache-Control', 'no-cache');

        return parent::prepare($request);
    }

    /**
     * {@inheritdoc}
     *
     * This method only sends the content once.
     */
    public function sendContent()
    {
        if ($this->streamed) {
            return;
        }

        $this->streamed = true;

        if (null === $this->callback) {
            throw new \LogicException('The Response callback must not be null.');
        }

        call_user_func($this->callback);
    }

    /**
     * {@inheritdoc}
     *
     * @throws \LogicException when the content is not null
     */
    public function setContent($content)
    {
        if (null !== $content) {
            throw new \LogicException('The content cannot be set on a StreamedResponse instance.');
        }
    }

    /**
     * {@inheritdoc}
     *
     * @return false
     */
    public function getContent()
    {
        return false;
    }
}
PK�`�\q�ugd�d�1pear/Symfony/Component/HttpFoundation/Request.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

use Symfony\Component\HttpFoundation\Session\SessionInterface;

/**
 * Request represents an HTTP request.
 *
 * The methods dealing with URL accept / return a raw path (% encoded):
 *   * getBasePath
 *   * getBaseUrl
 *   * getPathInfo
 *   * getRequestUri
 *   * getUri
 *   * getUriForPath
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Request
{
    const HEADER_CLIENT_IP    = 'client_ip';
    const HEADER_CLIENT_HOST  = 'client_host';
    const HEADER_CLIENT_PROTO = 'client_proto';
    const HEADER_CLIENT_PORT  = 'client_port';

    protected static $trustedProxies = array();

    /**
     * @var string[]
     */
    protected static $trustedHostPatterns = array();

    /**
     * @var string[]
     */
    protected static $trustedHosts = array();

    /**
     * Names for headers that can be trusted when
     * using trusted proxies.
     *
     * The default names are non-standard, but widely used
     * by popular reverse proxies (like Apache mod_proxy or Amazon EC2).
     */
    protected static $trustedHeaders = array(
        self::HEADER_CLIENT_IP    => 'X_FORWARDED_FOR',
        self::HEADER_CLIENT_HOST  => 'X_FORWARDED_HOST',
        self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
        self::HEADER_CLIENT_PORT  => 'X_FORWARDED_PORT',
    );

    protected static $httpMethodParameterOverride = false;

    /**
     * Custom parameters
     *
     * @var \Symfony\Component\HttpFoundation\ParameterBag
     *
     * @api
     */
    public $attributes;

    /**
     * Request body parameters ($_POST)
     *
     * @var \Symfony\Component\HttpFoundation\ParameterBag
     *
     * @api
     */
    public $request;

    /**
     * Query string parameters ($_GET)
     *
     * @var \Symfony\Component\HttpFoundation\ParameterBag
     *
     * @api
     */
    public $query;

    /**
     * Server and execution environment parameters ($_SERVER)
     *
     * @var \Symfony\Component\HttpFoundation\ServerBag
     *
     * @api
     */
    public $server;

    /**
     * Uploaded files ($_FILES)
     *
     * @var \Symfony\Component\HttpFoundation\FileBag
     *
     * @api
     */
    public $files;

    /**
     * Cookies ($_COOKIE)
     *
     * @var \Symfony\Component\HttpFoundation\ParameterBag
     *
     * @api
     */
    public $cookies;

    /**
     * Headers (taken from the $_SERVER)
     *
     * @var \Symfony\Component\HttpFoundation\HeaderBag
     *
     * @api
     */
    public $headers;

    /**
     * @var string
     */
    protected $content;

    /**
     * @var array
     */
    protected $languages;

    /**
     * @var array
     */
    protected $charsets;

    /**
     * @var array
     */
    protected $encodings;

    /**
     * @var array
     */
    protected $acceptableContentTypes;

    /**
     * @var string
     */
    protected $pathInfo;

    /**
     * @var string
     */
    protected $requestUri;

    /**
     * @var string
     */
    protected $baseUrl;

    /**
     * @var string
     */
    protected $basePath;

    /**
     * @var string
     */
    protected $method;

    /**
     * @var string
     */
    protected $format;

    /**
     * @var \Symfony\Component\HttpFoundation\Session\SessionInterface
     */
    protected $session;

    /**
     * @var string
     */
    protected $locale;

    /**
     * @var string
     */
    protected $defaultLocale = 'en';

    /**
     * @var array
     */
    protected static $formats;

    protected static $requestFactory;

    /**
     * Constructor.
     *
     * @param array  $query      The GET parameters
     * @param array  $request    The POST parameters
     * @param array  $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
     * @param array  $cookies    The COOKIE parameters
     * @param array  $files      The FILES parameters
     * @param array  $server     The SERVER parameters
     * @param string $content    The raw body data
     *
     * @api
     */
    public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
    {
        $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content);
    }

    /**
     * Sets the parameters for this request.
     *
     * This method also re-initializes all properties.
     *
     * @param array  $query      The GET parameters
     * @param array  $request    The POST parameters
     * @param array  $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
     * @param array  $cookies    The COOKIE parameters
     * @param array  $files      The FILES parameters
     * @param array  $server     The SERVER parameters
     * @param string $content    The raw body data
     *
     * @api
     */
    public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
    {
        $this->request = new ParameterBag($request);
        $this->query = new ParameterBag($query);
        $this->attributes = new ParameterBag($attributes);
        $this->cookies = new ParameterBag($cookies);
        $this->files = new FileBag($files);
        $this->server = new ServerBag($server);
        $this->headers = new HeaderBag($this->server->getHeaders());

        $this->content = $content;
        $this->languages = null;
        $this->charsets = null;
        $this->encodings = null;
        $this->acceptableContentTypes = null;
        $this->pathInfo = null;
        $this->requestUri = null;
        $this->baseUrl = null;
        $this->basePath = null;
        $this->method = null;
        $this->format = null;
    }

    /**
     * Creates a new request with values from PHP's super globals.
     *
     * @return Request A new request
     *
     * @api
     */
    public static function createFromGlobals()
    {
        $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);

        if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
            && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
        ) {
            parse_str($request->getContent(), $data);
            $request->request = new ParameterBag($data);
        }

        return $request;
    }

    /**
     * Creates a Request based on a given URI and configuration.
     *
     * The information contained in the URI always take precedence
     * over the other information (server and parameters).
     *
     * @param string $uri        The URI
     * @param string $method     The HTTP method
     * @param array  $parameters The query (GET) or request (POST) parameters
     * @param array  $cookies    The request cookies ($_COOKIE)
     * @param array  $files      The request files ($_FILES)
     * @param array  $server     The server parameters ($_SERVER)
     * @param string $content    The raw body data
     *
     * @return Request A Request instance
     *
     * @api
     */
    public static function create($uri, $method = 'GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null)
    {
        $server = array_replace(array(
            'SERVER_NAME'          => 'localhost',
            'SERVER_PORT'          => 80,
            'HTTP_HOST'            => 'localhost',
            'HTTP_USER_AGENT'      => 'Symfony/2.X',
            'HTTP_ACCEPT'          => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
            'HTTP_ACCEPT_CHARSET'  => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
            'REMOTE_ADDR'          => '127.0.0.1',
            'SCRIPT_NAME'          => '',
            'SCRIPT_FILENAME'      => '',
            'SERVER_PROTOCOL'      => 'HTTP/1.1',
            'REQUEST_TIME'         => time(),
        ), $server);

        $server['PATH_INFO'] = '';
        $server['REQUEST_METHOD'] = strtoupper($method);

        $components = parse_url($uri);
        if (isset($components['host'])) {
            $server['SERVER_NAME'] = $components['host'];
            $server['HTTP_HOST'] = $components['host'];
        }

        if (isset($components['scheme'])) {
            if ('https' === $components['scheme']) {
                $server['HTTPS'] = 'on';
                $server['SERVER_PORT'] = 443;
            } else {
                unset($server['HTTPS']);
                $server['SERVER_PORT'] = 80;
            }
        }

        if (isset($components['port'])) {
            $server['SERVER_PORT'] = $components['port'];
            $server['HTTP_HOST'] = $server['HTTP_HOST'].':'.$components['port'];
        }

        if (isset($components['user'])) {
            $server['PHP_AUTH_USER'] = $components['user'];
        }

        if (isset($components['pass'])) {
            $server['PHP_AUTH_PW'] = $components['pass'];
        }

        if (!isset($components['path'])) {
            $components['path'] = '/';
        }

        switch (strtoupper($method)) {
            case 'POST':
            case 'PUT':
            case 'DELETE':
                if (!isset($server['CONTENT_TYPE'])) {
                    $server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded';
                }
            case 'PATCH':
                $request = $parameters;
                $query = array();
                break;
            default:
                $request = array();
                $query = $parameters;
                break;
        }

        $queryString = '';
        if (isset($components['query'])) {
            parse_str(html_entity_decode($components['query']), $qs);

            if ($query) {
                $query = array_replace($qs, $query);
                $queryString = http_build_query($query, '', '&');
            } else {
                $query = $qs;
                $queryString = $components['query'];
            }
        } elseif ($query) {
            $queryString = http_build_query($query, '', '&');
        }

        $server['REQUEST_URI'] = $components['path'].('' !== $queryString ? '?'.$queryString : '');
        $server['QUERY_STRING'] = $queryString;

        return self::createRequestFromFactory($query, $request, array(), $cookies, $files, $server, $content);
    }

    /**
     * Sets a callable able to create a Request instance.
     *
     * This is mainly useful when you need to override the Request class
     * to keep BC with an existing system. It should not be used for any
     * other purpose.
     *
     * @param callable|null $callable A PHP callable
     */
    public static function setFactory($callable)
    {
        self::$requestFactory = $callable;
    }

    /**
     * Clones a request and overrides some of its parameters.
     *
     * @param array $query      The GET parameters
     * @param array $request    The POST parameters
     * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
     * @param array $cookies    The COOKIE parameters
     * @param array $files      The FILES parameters
     * @param array $server     The SERVER parameters
     *
     * @return Request The duplicated request
     *
     * @api
     */
    public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null)
    {
        $dup = clone $this;
        if ($query !== null) {
            $dup->query = new ParameterBag($query);
        }
        if ($request !== null) {
            $dup->request = new ParameterBag($request);
        }
        if ($attributes !== null) {
            $dup->attributes = new ParameterBag($attributes);
        }
        if ($cookies !== null) {
            $dup->cookies = new ParameterBag($cookies);
        }
        if ($files !== null) {
            $dup->files = new FileBag($files);
        }
        if ($server !== null) {
            $dup->server = new ServerBag($server);
            $dup->headers = new HeaderBag($dup->server->getHeaders());
        }
        $dup->languages = null;
        $dup->charsets = null;
        $dup->encodings = null;
        $dup->acceptableContentTypes = null;
        $dup->pathInfo = null;
        $dup->requestUri = null;
        $dup->baseUrl = null;
        $dup->basePath = null;
        $dup->method = null;
        $dup->format = null;

        if (!$dup->get('_format') && $this->get('_format')) {
            $dup->attributes->set('_format', $this->get('_format'));
        }

        if (!$dup->getRequestFormat(null)) {
            $dup->setRequestFormat($format = $this->getRequestFormat(null));
        }

        return $dup;
    }

    /**
     * Clones the current request.
     *
     * Note that the session is not cloned as duplicated requests
     * are most of the time sub-requests of the main one.
     */
    public function __clone()
    {
        $this->query      = clone $this->query;
        $this->request    = clone $this->request;
        $this->attributes = clone $this->attributes;
        $this->cookies    = clone $this->cookies;
        $this->files      = clone $this->files;
        $this->server     = clone $this->server;
        $this->headers    = clone $this->headers;
    }

    /**
     * Returns the request as a string.
     *
     * @return string The request
     */
    public function __toString()
    {
        return
            sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n".
            $this->headers."\r\n".
            $this->getContent();
    }

    /**
     * Overrides the PHP global variables according to this request instance.
     *
     * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE.
     * $_FILES is never override, see rfc1867
     *
     * @api
     */
    public function overrideGlobals()
    {
        $_GET = $this->query->all();
        $_POST = $this->request->all();
        $_SERVER = $this->server->all();
        $_COOKIE = $this->cookies->all();

        foreach ($this->headers->all() as $key => $value) {
            $key = strtoupper(str_replace('-', '_', $key));
            if (in_array($key, array('CONTENT_TYPE', 'CONTENT_LENGTH'))) {
                $_SERVER[$key] = implode(', ', $value);
            } else {
                $_SERVER['HTTP_'.$key] = implode(', ', $value);
            }
        }

        $request = array('g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE);

        $requestOrder = ini_get('request_order') ?: ini_get('variables_order');
        $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp';

        $_REQUEST = array();
        foreach (str_split($requestOrder) as $order) {
            $_REQUEST = array_merge($_REQUEST, $request[$order]);
        }
    }

    /**
     * Sets a list of trusted proxies.
     *
     * You should only list the reverse proxies that you manage directly.
     *
     * @param array $proxies A list of trusted proxies
     *
     * @api
     */
    public static function setTrustedProxies(array $proxies)
    {
        self::$trustedProxies = $proxies;
    }

    /**
     * Gets the list of trusted proxies.
     *
     * @return array An array of trusted proxies.
     */
    public static function getTrustedProxies()
    {
        return self::$trustedProxies;
    }

    /**
     * Sets a list of trusted host patterns.
     *
     * You should only list the hosts you manage using regexs.
     *
     * @param array $hostPatterns A list of trusted host patterns
     */
    public static function setTrustedHosts(array $hostPatterns)
    {
        self::$trustedHostPatterns = array_map(function ($hostPattern) {
            return sprintf('{%s}i', str_replace('}', '\\}', $hostPattern));
        }, $hostPatterns);
        // we need to reset trusted hosts on trusted host patterns change
        self::$trustedHosts = array();
    }

    /**
     * Gets the list of trusted host patterns.
     *
     * @return array An array of trusted host patterns.
     */
    public static function getTrustedHosts()
    {
        return self::$trustedHostPatterns;
    }

    /**
     * Sets the name for trusted headers.
     *
     * The following header keys are supported:
     *
     *  * Request::HEADER_CLIENT_IP:    defaults to X-Forwarded-For   (see getClientIp())
     *  * Request::HEADER_CLIENT_HOST:  defaults to X-Forwarded-Host  (see getClientHost())
     *  * Request::HEADER_CLIENT_PORT:  defaults to X-Forwarded-Port  (see getClientPort())
     *  * Request::HEADER_CLIENT_PROTO: defaults to X-Forwarded-Proto (see getScheme() and isSecure())
     *
     * Setting an empty value allows to disable the trusted header for the given key.
     *
     * @param string $key   The header key
     * @param string $value The header name
     *
     * @throws \InvalidArgumentException
     */
    public static function setTrustedHeaderName($key, $value)
    {
        if (!array_key_exists($key, self::$trustedHeaders)) {
            throw new \InvalidArgumentException(sprintf('Unable to set the trusted header name for key "%s".', $key));
        }

        self::$trustedHeaders[$key] = $value;
    }

    /**
     * Gets the trusted proxy header name.
     *
     * @param string $key The header key
     *
     * @return string The header name
     *
     * @throws \InvalidArgumentException
     */
    public static function getTrustedHeaderName($key)
    {
        if (!array_key_exists($key, self::$trustedHeaders)) {
            throw new \InvalidArgumentException(sprintf('Unable to get the trusted header name for key "%s".', $key));
        }

        return self::$trustedHeaders[$key];
    }

    /**
     * Normalizes a query string.
     *
     * It builds a normalized query string, where keys/value pairs are alphabetized,
     * have consistent escaping and unneeded delimiters are removed.
     *
     * @param string $qs Query string
     *
     * @return string A normalized query string for the Request
     */
    public static function normalizeQueryString($qs)
    {
        if ('' == $qs) {
            return '';
        }

        $parts = array();
        $order = array();

        foreach (explode('&', $qs) as $param) {
            if ('' === $param || '=' === $param[0]) {
                // Ignore useless delimiters, e.g. "x=y&".
                // Also ignore pairs with empty key, even if there was a value, e.g. "=value", as such nameless values cannot be retrieved anyway.
                // PHP also does not include them when building _GET.
                continue;
            }

            $keyValuePair = explode('=', $param, 2);

            // GET parameters, that are submitted from a HTML form, encode spaces as "+" by default (as defined in enctype application/x-www-form-urlencoded).
            // PHP also converts "+" to spaces when filling the global _GET or when using the function parse_str. This is why we use urldecode and then normalize to
            // RFC 3986 with rawurlencode.
            $parts[] = isset($keyValuePair[1]) ?
                rawurlencode(urldecode($keyValuePair[0])).'='.rawurlencode(urldecode($keyValuePair[1])) :
                rawurlencode(urldecode($keyValuePair[0]));
            $order[] = urldecode($keyValuePair[0]);
        }

        array_multisort($order, SORT_ASC, $parts);

        return implode('&', $parts);
    }

    /**
     * Enables support for the _method request parameter to determine the intended HTTP method.
     *
     * Be warned that enabling this feature might lead to CSRF issues in your code.
     * Check that you are using CSRF tokens when required.
     *
     * The HTTP method can only be overridden when the real HTTP method is POST.
     */
    public static function enableHttpMethodParameterOverride()
    {
        self::$httpMethodParameterOverride = true;
    }

    /**
     * Checks whether support for the _method request parameter is enabled.
     *
     * @return Boolean True when the _method request parameter is enabled, false otherwise
     */
    public static function getHttpMethodParameterOverride()
    {
        return self::$httpMethodParameterOverride;
    }

    /**
     * Gets a "parameter" value.
     *
     * This method is mainly useful for libraries that want to provide some flexibility.
     *
     * Order of precedence: GET, PATH, POST
     *
     * Avoid using this method in controllers:
     *
     *  * slow
     *  * prefer to get from a "named" source
     *
     * It is better to explicitly get request parameters from the appropriate
     * public property instead (query, attributes, request).
     *
     * @param string  $key     the key
     * @param mixed   $default the default value
     * @param Boolean $deep    is parameter deep in multidimensional array
     *
     * @return mixed
     */
    public function get($key, $default = null, $deep = false)
    {
        return $this->query->get($key, $this->attributes->get($key, $this->request->get($key, $default, $deep), $deep), $deep);
    }

    /**
     * Gets the Session.
     *
     * @return SessionInterface|null The session
     *
     * @api
     */
    public function getSession()
    {
        return $this->session;
    }

    /**
     * Whether the request contains a Session which was started in one of the
     * previous requests.
     *
     * @return Boolean
     *
     * @api
     */
    public function hasPreviousSession()
    {
        // the check for $this->session avoids malicious users trying to fake a session cookie with proper name
        return $this->hasSession() && $this->cookies->has($this->session->getName());
    }

    /**
     * Whether the request contains a Session object.
     *
     * This method does not give any information about the state of the session object,
     * like whether the session is started or not. It is just a way to check if this Request
     * is associated with a Session instance.
     *
     * @return Boolean true when the Request contains a Session object, false otherwise
     *
     * @api
     */
    public function hasSession()
    {
        return null !== $this->session;
    }

    /**
     * Sets the Session.
     *
     * @param SessionInterface $session The Session
     *
     * @api
     */
    public function setSession(SessionInterface $session)
    {
        $this->session = $session;
    }

    /**
     * Returns the client IP addresses.
     *
     * In the returned array the most trusted IP address is first, and the
     * least trusted one last. The "real" client IP address is the last one,
     * but this is also the least trusted one. Trusted proxies are stripped.
     *
     * Use this method carefully; you should use getClientIp() instead.
     *
     * @return array The client IP addresses
     *
     * @see getClientIp()
     */
    public function getClientIps()
    {
        $ip = $this->server->get('REMOTE_ADDR');

        if (!self::$trustedProxies) {
            return array($ip);
        }

        if (!self::$trustedHeaders[self::HEADER_CLIENT_IP] || !$this->headers->has(self::$trustedHeaders[self::HEADER_CLIENT_IP])) {
            return array($ip);
        }

        $clientIps = array_map('trim', explode(',', $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_IP])));
        $clientIps[] = $ip; // Complete the IP chain with the IP the request actually came from

        $ip = $clientIps[0]; // Fallback to this when the client IP falls into the range of trusted proxies

        // Eliminate all IPs from the forwarded IP chain which are trusted proxies
        foreach ($clientIps as $key => $clientIp) {
            if (IpUtils::checkIp($clientIp, self::$trustedProxies)) {
                unset($clientIps[$key]);
            }
        }

        // Now the IP chain contains only untrusted proxies and the client IP
        return $clientIps ? array_reverse($clientIps) : array($ip);
    }

    /**
     * Returns the client IP address.
     *
     * This method can read the client IP address from the "X-Forwarded-For" header
     * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For"
     * header value is a comma+space separated list of IP addresses, the left-most
     * being the original client, and each successive proxy that passed the request
     * adding the IP address where it received the request from.
     *
     * If your reverse proxy uses a different header name than "X-Forwarded-For",
     * ("Client-Ip" for instance), configure it via "setTrustedHeaderName()" with
     * the "client-ip" key.
     *
     * @return string The client IP address
     *
     * @see getClientIps()
     * @see http://en.wikipedia.org/wiki/X-Forwarded-For
     *
     * @api
     */
    public function getClientIp()
    {
        $ipAddresses = $this->getClientIps();

        return $ipAddresses[0];
    }

    /**
     * Returns current script name.
     *
     * @return string
     *
     * @api
     */
    public function getScriptName()
    {
        return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME', ''));
    }

    /**
     * Returns the path being requested relative to the executed script.
     *
     * The path info always starts with a /.
     *
     * Suppose this request is instantiated from /mysite on localhost:
     *
     *  * http://localhost/mysite              returns an empty string
     *  * http://localhost/mysite/about        returns '/about'
     *  * http://localhost/mysite/enco%20ded   returns '/enco%20ded'
     *  * http://localhost/mysite/about?var=1  returns '/about'
     *
     * @return string The raw path (i.e. not urldecoded)
     *
     * @api
     */
    public function getPathInfo()
    {
        if (null === $this->pathInfo) {
            $this->pathInfo = $this->preparePathInfo();
        }

        return $this->pathInfo;
    }

    /**
     * Returns the root path from which this request is executed.
     *
     * Suppose that an index.php file instantiates this request object:
     *
     *  * http://localhost/index.php         returns an empty string
     *  * http://localhost/index.php/page    returns an empty string
     *  * http://localhost/web/index.php     returns '/web'
     *  * http://localhost/we%20b/index.php  returns '/we%20b'
     *
     * @return string The raw path (i.e. not urldecoded)
     *
     * @api
     */
    public function getBasePath()
    {
        if (null === $this->basePath) {
            $this->basePath = $this->prepareBasePath();
        }

        return $this->basePath;
    }

    /**
     * Returns the root URL from which this request is executed.
     *
     * The base URL never ends with a /.
     *
     * This is similar to getBasePath(), except that it also includes the
     * script filename (e.g. index.php) if one exists.
     *
     * @return string The raw URL (i.e. not urldecoded)
     *
     * @api
     */
    public function getBaseUrl()
    {
        if (null === $this->baseUrl) {
            $this->baseUrl = $this->prepareBaseUrl();
        }

        return $this->baseUrl;
    }

    /**
     * Gets the request's scheme.
     *
     * @return string
     *
     * @api
     */
    public function getScheme()
    {
        return $this->isSecure() ? 'https' : 'http';
    }

    /**
     * Returns the port on which the request is made.
     *
     * This method can read the client port from the "X-Forwarded-Port" header
     * when trusted proxies were set via "setTrustedProxies()".
     *
     * The "X-Forwarded-Port" header must contain the client port.
     *
     * If your reverse proxy uses a different header name than "X-Forwarded-Port",
     * configure it via "setTrustedHeaderName()" with the "client-port" key.
     *
     * @return string
     *
     * @api
     */
    public function getPort()
    {
        if (self::$trustedProxies) {
            if (self::$trustedHeaders[self::HEADER_CLIENT_PORT] && $port = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PORT])) {
                return $port;
            }

            if (self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && 'https' === $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO], 'http')) {
                return 443;
            }
        }

        if ($host = $this->headers->get('HOST')) {
            if (false !== $pos = strrpos($host, ':')) {
                return intval(substr($host, $pos + 1));
            }

            return 'https' === $this->getScheme() ? 443 : 80;
        }

        return $this->server->get('SERVER_PORT');
    }

    /**
     * Returns the user.
     *
     * @return string|null
     */
    public function getUser()
    {
        return $this->server->get('PHP_AUTH_USER');
    }

    /**
     * Returns the password.
     *
     * @return string|null
     */
    public function getPassword()
    {
        return $this->server->get('PHP_AUTH_PW');
    }

    /**
     * Gets the user info.
     *
     * @return string A user name and, optionally, scheme-specific information about how to gain authorization to access the server
     */
    public function getUserInfo()
    {
        $userinfo = $this->getUser();

        $pass = $this->getPassword();
        if ('' != $pass) {
            $userinfo .= ":$pass";
        }

        return $userinfo;
    }

    /**
     * Returns the HTTP host being requested.
     *
     * The port name will be appended to the host if it's non-standard.
     *
     * @return string
     *
     * @api
     */
    public function getHttpHost()
    {
        $scheme = $this->getScheme();
        $port   = $this->getPort();

        if (('http' == $scheme && $port == 80) || ('https' == $scheme && $port == 443)) {
            return $this->getHost();
        }

        return $this->getHost().':'.$port;
    }

    /**
     * Returns the requested URI.
     *
     * @return string The raw URI (i.e. not urldecoded)
     *
     * @api
     */
    public function getRequestUri()
    {
        if (null === $this->requestUri) {
            $this->requestUri = $this->prepareRequestUri();
        }

        return $this->requestUri;
    }

    /**
     * Gets the scheme and HTTP host.
     *
     * If the URL was called with basic authentication, the user
     * and the password are not added to the generated string.
     *
     * @return string The scheme and HTTP host
     */
    public function getSchemeAndHttpHost()
    {
        return $this->getScheme().'://'.$this->getHttpHost();
    }

    /**
     * Generates a normalized URI for the Request.
     *
     * @return string A normalized URI for the Request
     *
     * @see getQueryString()
     *
     * @api
     */
    public function getUri()
    {
        if (null !== $qs = $this->getQueryString()) {
            $qs = '?'.$qs;
        }

        return $this->getSchemeAndHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs;
    }

    /**
     * Generates a normalized URI for the given path.
     *
     * @param string $path A path to use instead of the current one
     *
     * @return string The normalized URI for the path
     *
     * @api
     */
    public function getUriForPath($path)
    {
        return $this->getSchemeAndHttpHost().$this->getBaseUrl().$path;
    }

    /**
     * Generates the normalized query string for the Request.
     *
     * It builds a normalized query string, where keys/value pairs are alphabetized
     * and have consistent escaping.
     *
     * @return string|null A normalized query string for the Request
     *
     * @api
     */
    public function getQueryString()
    {
        $qs = static::normalizeQueryString($this->server->get('QUERY_STRING'));

        return '' === $qs ? null : $qs;
    }

    /**
     * Checks whether the request is secure or not.
     *
     * This method can read the client port from the "X-Forwarded-Proto" header
     * when trusted proxies were set via "setTrustedProxies()".
     *
     * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http".
     *
     * If your reverse proxy uses a different header name than "X-Forwarded-Proto"
     * ("SSL_HTTPS" for instance), configure it via "setTrustedHeaderName()" with
     * the "client-proto" key.
     *
     * @return Boolean
     *
     * @api
     */
    public function isSecure()
    {
        if (self::$trustedProxies && self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && $proto = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO])) {
            return in_array(strtolower(current(explode(',', $proto))), array('https', 'on', 'ssl', '1'));
        }

        return 'on' == strtolower($this->server->get('HTTPS')) || 1 == $this->server->get('HTTPS');
    }

    /**
     * Returns the host name.
     *
     * This method can read the client port from the "X-Forwarded-Host" header
     * when trusted proxies were set via "setTrustedProxies()".
     *
     * The "X-Forwarded-Host" header must contain the client host name.
     *
     * If your reverse proxy uses a different header name than "X-Forwarded-Host",
     * configure it via "setTrustedHeaderName()" with the "client-host" key.
     *
     * @return string
     *
     * @throws \UnexpectedValueException when the host name is invalid
     *
     * @api
     */
    public function getHost()
    {
        if (self::$trustedProxies && self::$trustedHeaders[self::HEADER_CLIENT_HOST] && $host = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_HOST])) {
            $elements = explode(',', $host);

            $host = $elements[count($elements) - 1];
        } elseif (!$host = $this->headers->get('HOST')) {
            if (!$host = $this->server->get('SERVER_NAME')) {
                $host = $this->server->get('SERVER_ADDR', '');
            }
        }

        // trim and remove port number from host
        // host is lowercase as per RFC 952/2181
        $host = strtolower(preg_replace('/:\d+$/', '', trim($host)));

        // as the host can come from the user (HTTP_HOST and depending on the configuration, SERVER_NAME too can come from the user)
        // check that it does not contain forbidden characters (see RFC 952 and RFC 2181)
        if ($host && !preg_match('/^\[?(?:[a-zA-Z0-9-:\]_]+\.?)+$/', $host)) {
            throw new \UnexpectedValueException(sprintf('Invalid Host "%s"', $host));
        }

        if (count(self::$trustedHostPatterns) > 0) {
            // to avoid host header injection attacks, you should provide a list of trusted host patterns

            if (in_array($host, self::$trustedHosts)) {
                return $host;
            }

            foreach (self::$trustedHostPatterns as $pattern) {
                if (preg_match($pattern, $host)) {
                    self::$trustedHosts[] = $host;

                    return $host;
                }
            }

            throw new \UnexpectedValueException(sprintf('Untrusted Host "%s"', $host));
        }

        return $host;
    }

    /**
     * Sets the request method.
     *
     * @param string $method
     *
     * @api
     */
    public function setMethod($method)
    {
        $this->method = null;
        $this->server->set('REQUEST_METHOD', $method);
    }

    /**
     * Gets the request "intended" method.
     *
     * If the X-HTTP-Method-Override header is set, and if the method is a POST,
     * then it is used to determine the "real" intended HTTP method.
     *
     * The _method request parameter can also be used to determine the HTTP method,
     * but only if enableHttpMethodParameterOverride() has been called.
     *
     * The method is always an uppercased string.
     *
     * @return string The request method
     *
     * @api
     *
     * @see getRealMethod
     */
    public function getMethod()
    {
        if (null === $this->method) {
            $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET'));

            if ('POST' === $this->method) {
                if ($method = $this->headers->get('X-HTTP-METHOD-OVERRIDE')) {
                    $this->method = strtoupper($method);
                } elseif (self::$httpMethodParameterOverride) {
                    $this->method = strtoupper($this->request->get('_method', $this->query->get('_method', 'POST')));
                }
            }
        }

        return $this->method;
    }

    /**
     * Gets the "real" request method.
     *
     * @return string The request method
     *
     * @see getMethod
     */
    public function getRealMethod()
    {
        return strtoupper($this->server->get('REQUEST_METHOD', 'GET'));
    }

    /**
     * Gets the mime type associated with the format.
     *
     * @param string $format The format
     *
     * @return string The associated mime type (null if not found)
     *
     * @api
     */
    public function getMimeType($format)
    {
        if (null === static::$formats) {
            static::initializeFormats();
        }

        return isset(static::$formats[$format]) ? static::$formats[$format][0] : null;
    }

    /**
     * Gets the format associated with the mime type.
     *
     * @param string $mimeType The associated mime type
     *
     * @return string|null The format (null if not found)
     *
     * @api
     */
    public function getFormat($mimeType)
    {
        if (false !== $pos = strpos($mimeType, ';')) {
            $mimeType = substr($mimeType, 0, $pos);
        }

        if (null === static::$formats) {
            static::initializeFormats();
        }

        foreach (static::$formats as $format => $mimeTypes) {
            if (in_array($mimeType, (array) $mimeTypes)) {
                return $format;
            }
        }

        return null;
    }

    /**
     * Associates a format with mime types.
     *
     * @param string       $format    The format
     * @param string|array $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type)
     *
     * @api
     */
    public function setFormat($format, $mimeTypes)
    {
        if (null === static::$formats) {
            static::initializeFormats();
        }

        static::$formats[$format] = is_array($mimeTypes) ? $mimeTypes : array($mimeTypes);
    }

    /**
     * Gets the request format.
     *
     * Here is the process to determine the format:
     *
     *  * format defined by the user (with setRequestFormat())
     *  * _format request parameter
     *  * $default
     *
     * @param string $default The default format
     *
     * @return string The request format
     *
     * @api
     */
    public function getRequestFormat($default = 'html')
    {
        if (null === $this->format) {
            $this->format = $this->get('_format', $default);
        }

        return $this->format;
    }

    /**
     * Sets the request format.
     *
     * @param string $format The request format.
     *
     * @api
     */
    public function setRequestFormat($format)
    {
        $this->format = $format;
    }

    /**
     * Gets the format associated with the request.
     *
     * @return string|null The format (null if no content type is present)
     *
     * @api
     */
    public function getContentType()
    {
        return $this->getFormat($this->headers->get('CONTENT_TYPE'));
    }

    /**
     * Sets the default locale.
     *
     * @param string $locale
     *
     * @api
     */
    public function setDefaultLocale($locale)
    {
        $this->defaultLocale = $locale;

        if (null === $this->locale) {
            $this->setPhpDefaultLocale($locale);
        }
    }

    /**
     * Sets the locale.
     *
     * @param string $locale
     *
     * @api
     */
    public function setLocale($locale)
    {
        $this->setPhpDefaultLocale($this->locale = $locale);
    }

    /**
     * Get the locale.
     *
     * @return string
     */
    public function getLocale()
    {
        return null === $this->locale ? $this->defaultLocale : $this->locale;
    }

    /**
     * Checks if the request method is of specified type.
     *
     * @param string $method Uppercase request method (GET, POST etc).
     *
     * @return Boolean
     */
    public function isMethod($method)
    {
        return $this->getMethod() === strtoupper($method);
    }

    /**
     * Checks whether the method is safe or not.
     *
     * @return Boolean
     *
     * @api
     */
    public function isMethodSafe()
    {
        return in_array($this->getMethod(), array('GET', 'HEAD'));
    }

    /**
     * Returns the request body content.
     *
     * @param Boolean $asResource If true, a resource will be returned
     *
     * @return string|resource The request body content or a resource to read the body stream.
     *
     * @throws \LogicException
     */
    public function getContent($asResource = false)
    {
        if (false === $this->content || (true === $asResource && null !== $this->content)) {
            throw new \LogicException('getContent() can only be called once when using the resource return type.');
        }

        if (true === $asResource) {
            $this->content = false;

            return fopen('php://input', 'rb');
        }

        if (null === $this->content) {
            $this->content = file_get_contents('php://input');
        }

        return $this->content;
    }

    /**
     * Gets the Etags.
     *
     * @return array The entity tags
     */
    public function getETags()
    {
        return preg_split('/\s*,\s*/', $this->headers->get('if_none_match'), null, PREG_SPLIT_NO_EMPTY);
    }

    /**
     * @return Boolean
     */
    public function isNoCache()
    {
        return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma');
    }

    /**
     * Returns the preferred language.
     *
     * @param array $locales An array of ordered available locales
     *
     * @return string|null The preferred locale
     *
     * @api
     */
    public function getPreferredLanguage(array $locales = null)
    {
        $preferredLanguages = $this->getLanguages();

        if (empty($locales)) {
            return isset($preferredLanguages[0]) ? $preferredLanguages[0] : null;
        }

        if (!$preferredLanguages) {
            return $locales[0];
        }

        $extendedPreferredLanguages = array();
        foreach ($preferredLanguages as $language) {
            $extendedPreferredLanguages[] = $language;
            if (false !== $position = strpos($language, '_')) {
                $superLanguage = substr($language, 0, $position);
                if (!in_array($superLanguage, $preferredLanguages)) {
                    $extendedPreferredLanguages[] = $superLanguage;
                }
            }
        }

        $preferredLanguages = array_values(array_intersect($extendedPreferredLanguages, $locales));

        return isset($preferredLanguages[0]) ? $preferredLanguages[0] : $locales[0];
    }

    /**
     * Gets a list of languages acceptable by the client browser.
     *
     * @return array Languages ordered in the user browser preferences
     *
     * @api
     */
    public function getLanguages()
    {
        if (null !== $this->languages) {
            return $this->languages;
        }

        $languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all();
        $this->languages = array();
        foreach (array_keys($languages) as $lang) {
            if (strstr($lang, '-')) {
                $codes = explode('-', $lang);
                if ($codes[0] == 'i') {
                    // Language not listed in ISO 639 that are not variants
                    // of any listed language, which can be registered with the
                    // i-prefix, such as i-cherokee
                    if (count($codes) > 1) {
                        $lang = $codes[1];
                    }
                } else {
                    for ($i = 0, $max = count($codes); $i < $max; $i++) {
                        if ($i == 0) {
                            $lang = strtolower($codes[0]);
                        } else {
                            $lang .= '_'.strtoupper($codes[$i]);
                        }
                    }
                }
            }

            $this->languages[] = $lang;
        }

        return $this->languages;
    }

    /**
     * Gets a list of charsets acceptable by the client browser.
     *
     * @return array List of charsets in preferable order
     *
     * @api
     */
    public function getCharsets()
    {
        if (null !== $this->charsets) {
            return $this->charsets;
        }

        return $this->charsets = array_keys(AcceptHeader::fromString($this->headers->get('Accept-Charset'))->all());
    }

    /**
     * Gets a list of encodings acceptable by the client browser.
     *
     * @return array List of encodings in preferable order
     */
    public function getEncodings()
    {
        if (null !== $this->encodings) {
            return $this->encodings;
        }

        return $this->encodings = array_keys(AcceptHeader::fromString($this->headers->get('Accept-Encoding'))->all());
    }

    /**
     * Gets a list of content types acceptable by the client browser
     *
     * @return array List of content types in preferable order
     *
     * @api
     */
    public function getAcceptableContentTypes()
    {
        if (null !== $this->acceptableContentTypes) {
            return $this->acceptableContentTypes;
        }

        return $this->acceptableContentTypes = array_keys(AcceptHeader::fromString($this->headers->get('Accept'))->all());
    }

    /**
     * Returns true if the request is a XMLHttpRequest.
     *
     * It works if your JavaScript library set an X-Requested-With HTTP header.
     * It is known to work with common JavaScript frameworks:
     * @link http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript
     *
     * @return Boolean true if the request is an XMLHttpRequest, false otherwise
     *
     * @api
     */
    public function isXmlHttpRequest()
    {
        return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
    }

    /*
     * The following methods are derived from code of the Zend Framework (1.10dev - 2010-01-24)
     *
     * Code subject to the new BSD license (http://framework.zend.com/license/new-bsd).
     *
     * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
     */

    protected function prepareRequestUri()
    {
        $requestUri = '';

        if ($this->headers->has('X_ORIGINAL_URL')) {
            // IIS with Microsoft Rewrite Module
            $requestUri = $this->headers->get('X_ORIGINAL_URL');
            $this->headers->remove('X_ORIGINAL_URL');
            $this->server->remove('HTTP_X_ORIGINAL_URL');
            $this->server->remove('UNENCODED_URL');
            $this->server->remove('IIS_WasUrlRewritten');
        } elseif ($this->headers->has('X_REWRITE_URL')) {
            // IIS with ISAPI_Rewrite
            $requestUri = $this->headers->get('X_REWRITE_URL');
            $this->headers->remove('X_REWRITE_URL');
        } elseif ($this->server->get('IIS_WasUrlRewritten') == '1' && $this->server->get('UNENCODED_URL') != '') {
            // IIS7 with URL Rewrite: make sure we get the unencoded URL (double slash problem)
            $requestUri = $this->server->get('UNENCODED_URL');
            $this->server->remove('UNENCODED_URL');
            $this->server->remove('IIS_WasUrlRewritten');
        } elseif ($this->server->has('REQUEST_URI')) {
            $requestUri = $this->server->get('REQUEST_URI');
            // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, only use URL path
            $schemeAndHttpHost = $this->getSchemeAndHttpHost();
            if (strpos($requestUri, $schemeAndHttpHost) === 0) {
                $requestUri = substr($requestUri, strlen($schemeAndHttpHost));
            }
        } elseif ($this->server->has('ORIG_PATH_INFO')) {
            // IIS 5.0, PHP as CGI
            $requestUri = $this->server->get('ORIG_PATH_INFO');
            if ('' != $this->server->get('QUERY_STRING')) {
                $requestUri .= '?'.$this->server->get('QUERY_STRING');
            }
            $this->server->remove('ORIG_PATH_INFO');
        }

        // normalize the request URI to ease creating sub-requests from this request
        $this->server->set('REQUEST_URI', $requestUri);

        return $requestUri;
    }

    /**
     * Prepares the base URL.
     *
     * @return string
     */
    protected function prepareBaseUrl()
    {
        $filename = basename($this->server->get('SCRIPT_FILENAME'));

        if (basename($this->server->get('SCRIPT_NAME')) === $filename) {
            $baseUrl = $this->server->get('SCRIPT_NAME');
        } elseif (basename($this->server->get('PHP_SELF')) === $filename) {
            $baseUrl = $this->server->get('PHP_SELF');
        } elseif (basename($this->server->get('ORIG_SCRIPT_NAME')) === $filename) {
            $baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); // 1and1 shared hosting compatibility
        } else {
            // Backtrack up the script_filename to find the portion matching
            // php_self
            $path    = $this->server->get('PHP_SELF', '');
            $file    = $this->server->get('SCRIPT_FILENAME', '');
            $segs    = explode('/', trim($file, '/'));
            $segs    = array_reverse($segs);
            $index   = 0;
            $last    = count($segs);
            $baseUrl = '';
            do {
                $seg     = $segs[$index];
                $baseUrl = '/'.$seg.$baseUrl;
                ++$index;
            } while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos);
        }

        // Does the baseUrl have anything in common with the request_uri?
        $requestUri = $this->getRequestUri();

        if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) {
            // full $baseUrl matches
            return $prefix;
        }

        if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, dirname($baseUrl))) {
            // directory portion of $baseUrl matches
            return rtrim($prefix, '/');
        }

        $truncatedRequestUri = $requestUri;
        if (false !== $pos = strpos($requestUri, '?')) {
            $truncatedRequestUri = substr($requestUri, 0, $pos);
        }

        $basename = basename($baseUrl);
        if (empty($basename) || !strpos(rawurldecode($truncatedRequestUri), $basename)) {
            // no match whatsoever; set it blank
            return '';
        }

        // If using mod_rewrite or ISAPI_Rewrite strip the script filename
        // out of baseUrl. $pos !== 0 makes sure it is not matching a value
        // from PATH_INFO or QUERY_STRING
        if (strlen($requestUri) >= strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && $pos !== 0) {
            $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl));
        }

        return rtrim($baseUrl, '/');
    }

    /**
     * Prepares the base path.
     *
     * @return string base path
     */
    protected function prepareBasePath()
    {
        $filename = basename($this->server->get('SCRIPT_FILENAME'));
        $baseUrl = $this->getBaseUrl();
        if (empty($baseUrl)) {
            return '';
        }

        if (basename($baseUrl) === $filename) {
            $basePath = dirname($baseUrl);
        } else {
            $basePath = $baseUrl;
        }

        if ('\\' === DIRECTORY_SEPARATOR) {
            $basePath = str_replace('\\', '/', $basePath);
        }

        return rtrim($basePath, '/');
    }

    /**
     * Prepares the path info.
     *
     * @return string path info
     */
    protected function preparePathInfo()
    {
        $baseUrl = $this->getBaseUrl();

        if (null === ($requestUri = $this->getRequestUri())) {
            return '/';
        }

        $pathInfo = '/';

        // Remove the query string from REQUEST_URI
        if ($pos = strpos($requestUri, '?')) {
            $requestUri = substr($requestUri, 0, $pos);
        }

        if (null !== $baseUrl && false === $pathInfo = substr($requestUri, strlen($baseUrl))) {
            // If substr() returns false then PATH_INFO is set to an empty string
            return '/';
        } elseif (null === $baseUrl) {
            return $requestUri;
        }

        return (string) $pathInfo;
    }

    /**
     * Initializes HTTP request formats.
     */
    protected static function initializeFormats()
    {
        static::$formats = array(
            'html' => array('text/html', 'application/xhtml+xml'),
            'txt'  => array('text/plain'),
            'js'   => array('application/javascript', 'application/x-javascript', 'text/javascript'),
            'css'  => array('text/css'),
            'json' => array('application/json', 'application/x-json'),
            'xml'  => array('text/xml', 'application/xml', 'application/x-xml'),
            'rdf'  => array('application/rdf+xml'),
            'atom' => array('application/atom+xml'),
            'rss'  => array('application/rss+xml'),
        );
    }

    /**
     * Sets the default PHP locale.
     *
     * @param string $locale
     */
    private function setPhpDefaultLocale($locale)
    {
        // if either the class Locale doesn't exist, or an exception is thrown when
        // setting the default locale, the intl module is not installed, and
        // the call can be ignored:
        try {
            if (class_exists('Locale', false)) {
                \Locale::setDefault($locale);
            }
        } catch (\Exception $e) {
        }
    }

    /*
     * Returns the prefix as encoded in the string when the string starts with
     * the given prefix, false otherwise.
     *
     * @param string $string The urlencoded string
     * @param string $prefix The prefix not encoded
     *
     * @return string|false The prefix as it is encoded in $string, or false
     */
    private function getUrlencodedPrefix($string, $prefix)
    {
        if (0 !== strpos(rawurldecode($string), $prefix)) {
            return false;
        }

        $len = strlen($prefix);

        if (preg_match("#^(%[[:xdigit:]]{2}|.){{$len}}#", $string, $match)) {
            return $match[0];
        }

        return false;
    }

    private static function createRequestFromFactory(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
    {
        if (self::$requestFactory) {
            $request = call_user_func(self::$requestFactory, $query, $request, $attributes, $cookies, $files, $server, $content);

            if (!$request instanceof Request) {
                throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.');
            }

            return $request;
        }

        return new static($query, $request, $attributes, $cookies, $files, $server, $content);
    }
}
PK�`�\�6=��
�
1pear/Symfony/Component/HttpFoundation/IpUtils.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * Http utility functions.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class IpUtils
{
    /**
     * This class should not be instantiated
     */
    private function __construct() {}

    /**
     * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets
     *
     * @param string       $requestIp   IP to check
     * @param string|array $ips         List of IPs or subnets (can be a string if only a single one)
     *
     * @return boolean Whether the IP is valid
     */
    public static function checkIp($requestIp, $ips)
    {
        if (!is_array($ips)) {
            $ips = array($ips);
        }

        $method = false !== strpos($requestIp, ':') ? 'checkIp6': 'checkIp4';

        foreach ($ips as $ip) {
            if (self::$method($requestIp, $ip)) {
                return true;
            }
        }

        return false;
    }

    /**
     * Compares two IPv4 addresses.
     * In case a subnet is given, it checks if it contains the request IP.
     *
     * @param string $requestIp IPv4 address to check
     * @param string $ip        IPv4 address or subnet in CIDR notation
     *
     * @return boolean Whether the IP is valid
     */
    public static function checkIp4($requestIp, $ip)
    {
        if (false !== strpos($ip, '/')) {
            list($address, $netmask) = explode('/', $ip, 2);

            if ($netmask < 1 || $netmask > 32) {
                return false;
            }
        } else {
            $address = $ip;
            $netmask = 32;
        }

        return 0 === substr_compare(sprintf('%032b', ip2long($requestIp)), sprintf('%032b', ip2long($address)), 0, $netmask);
    }

    /**
     * Compares two IPv6 addresses.
     * In case a subnet is given, it checks if it contains the request IP.
     *
     * @author David Soria Parra <dsp at php dot net>
     * @see https://github.com/dsp/v6tools
     *
     * @param string $requestIp IPv6 address to check
     * @param string $ip        IPv6 address or subnet in CIDR notation
     *
     * @return boolean Whether the IP is valid
     *
     * @throws \RuntimeException When IPV6 support is not enabled
     */
    public static function checkIp6($requestIp, $ip)
    {
        if (!((extension_loaded('sockets') && defined('AF_INET6')) || @inet_pton('::1'))) {
            throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".');
        }

        if (false !== strpos($ip, '/')) {
            list($address, $netmask) = explode('/', $ip, 2);

            if ($netmask < 1 || $netmask > 128) {
                return false;
            }
        } else {
            $address = $ip;
            $netmask = 128;
        }

        $bytesAddr = unpack("n*", inet_pton($address));
        $bytesTest = unpack("n*", inet_pton($requestIp));

        for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; $i++) {
            $left = $netmask - 16 * ($i-1);
            $left = ($left <= 16) ? $left : 16;
            $mask = ~(0xffff >> $left) & 0xffff;
            if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) {
                return false;
            }
        }

        return true;
    }
}
PK�`�\1y��Apear/Symfony/Component/HttpFoundation/RequestMatcherInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * RequestMatcherInterface is an interface for strategies to match a Request.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
interface RequestMatcherInterface
{
    /**
     * Decides whether the rule(s) implemented by the strategy matches the supplied request.
     *
     * @param Request $request The request to check for a match
     *
     * @return Boolean true if the request matches, false otherwise
     *
     * @api
     */
    public function matches(Request $request);
}
PK�`�\�7�E	E	6pear/Symfony/Component/HttpFoundation/RequestStack.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * Request stack that controls the lifecycle of requests.
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 */
class RequestStack
{
    /**
     * @var Request[]
     */
    private $requests = array();

    /**
     * Pushes a Request on the stack.
     *
     * This method should generally not be called directly as the stack
     * management should be taken care of by the application itself.
     */
    public function push(Request $request)
    {
        $this->requests[] = $request;
    }

    /**
     * Pops the current request from the stack.
     *
     * This operation lets the current request go out of scope.
     *
     * This method should generally not be called directly as the stack
     * management should be taken care of by the application itself.
     *
     * @return Request|null
     */
    public function pop()
    {
        if (!$this->requests) {
            return null;
        }

        return array_pop($this->requests);
    }

    /**
     * @return Request|null
     */
    public function getCurrentRequest()
    {
        return end($this->requests) ?: null;
    }

    /**
     * Gets the master Request.
     *
     * Be warned that making your code aware of the master request
     * might make it un-compatible with other features of your framework
     * like ESI support.
     *
     * @return Request|null
     */
    public function getMasterRequest()
    {
        if (!$this->requests) {
            return null;
        }

        return $this->requests[0];
    }

    /**
     * Returns the parent request of the current.
     *
     * Be warned that making your code aware of the parent request
     * might make it un-compatible with other features of your framework
     * like ESI support.
     *
     * If current Request is the master request, it returns null.
     *
     * @return Request|null
     */
    public function getParentRequest()
    {
        $pos = count($this->requests) - 2;

        if (!isset($this->requests[$pos])) {
            return null;
        }

        return $this->requests[$pos];
    }
}
PK�`�\���pߋߋ2pear/Symfony/Component/HttpFoundation/Response.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * Response represents an HTTP response.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Response
{
    const HTTP_CONTINUE = 100;
    const HTTP_SWITCHING_PROTOCOLS = 101;
    const HTTP_PROCESSING = 102;            // RFC2518
    const HTTP_OK = 200;
    const HTTP_CREATED = 201;
    const HTTP_ACCEPTED = 202;
    const HTTP_NON_AUTHORITATIVE_INFORMATION = 203;
    const HTTP_NO_CONTENT = 204;
    const HTTP_RESET_CONTENT = 205;
    const HTTP_PARTIAL_CONTENT = 206;
    const HTTP_MULTI_STATUS = 207;          // RFC4918
    const HTTP_ALREADY_REPORTED = 208;      // RFC5842
    const HTTP_IM_USED = 226;               // RFC3229
    const HTTP_MULTIPLE_CHOICES = 300;
    const HTTP_MOVED_PERMANENTLY = 301;
    const HTTP_FOUND = 302;
    const HTTP_SEE_OTHER = 303;
    const HTTP_NOT_MODIFIED = 304;
    const HTTP_USE_PROXY = 305;
    const HTTP_RESERVED = 306;
    const HTTP_TEMPORARY_REDIRECT = 307;
    const HTTP_PERMANENTLY_REDIRECT = 308;  // RFC-reschke-http-status-308-07
    const HTTP_BAD_REQUEST = 400;
    const HTTP_UNAUTHORIZED = 401;
    const HTTP_PAYMENT_REQUIRED = 402;
    const HTTP_FORBIDDEN = 403;
    const HTTP_NOT_FOUND = 404;
    const HTTP_METHOD_NOT_ALLOWED = 405;
    const HTTP_NOT_ACCEPTABLE = 406;
    const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407;
    const HTTP_REQUEST_TIMEOUT = 408;
    const HTTP_CONFLICT = 409;
    const HTTP_GONE = 410;
    const HTTP_LENGTH_REQUIRED = 411;
    const HTTP_PRECONDITION_FAILED = 412;
    const HTTP_REQUEST_ENTITY_TOO_LARGE = 413;
    const HTTP_REQUEST_URI_TOO_LONG = 414;
    const HTTP_UNSUPPORTED_MEDIA_TYPE = 415;
    const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    const HTTP_EXPECTATION_FAILED = 417;
    const HTTP_I_AM_A_TEAPOT = 418;                                               // RFC2324
    const HTTP_UNPROCESSABLE_ENTITY = 422;                                        // RFC4918
    const HTTP_LOCKED = 423;                                                      // RFC4918
    const HTTP_FAILED_DEPENDENCY = 424;                                           // RFC4918
    const HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL = 425;   // RFC2817
    const HTTP_UPGRADE_REQUIRED = 426;                                            // RFC2817
    const HTTP_PRECONDITION_REQUIRED = 428;                                       // RFC6585
    const HTTP_TOO_MANY_REQUESTS = 429;                                           // RFC6585
    const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431;                             // RFC6585
    const HTTP_INTERNAL_SERVER_ERROR = 500;
    const HTTP_NOT_IMPLEMENTED = 501;
    const HTTP_BAD_GATEWAY = 502;
    const HTTP_SERVICE_UNAVAILABLE = 503;
    const HTTP_GATEWAY_TIMEOUT = 504;
    const HTTP_VERSION_NOT_SUPPORTED = 505;
    const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506;                        // RFC2295
    const HTTP_INSUFFICIENT_STORAGE = 507;                                        // RFC4918
    const HTTP_LOOP_DETECTED = 508;                                               // RFC5842
    const HTTP_NOT_EXTENDED = 510;                                                // RFC2774
    const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511;                             // RFC6585

    /**
     * @var \Symfony\Component\HttpFoundation\ResponseHeaderBag
     */
    public $headers;

    /**
     * @var string
     */
    protected $content;

    /**
     * @var string
     */
    protected $version;

    /**
     * @var integer
     */
    protected $statusCode;

    /**
     * @var string
     */
    protected $statusText;

    /**
     * @var string
     */
    protected $charset;

    /**
     * Status codes translation table.
     *
     * The list of codes is complete according to the
     * {@link http://www.iana.org/assignments/http-status-codes/ Hypertext Transfer Protocol (HTTP) Status Code Registry}
     * (last updated 2012-02-13).
     *
     * Unless otherwise noted, the status code is defined in RFC2616.
     *
     * @var array
     */
    public static $statusTexts = array(
        100 => 'Continue',
        101 => 'Switching Protocols',
        102 => 'Processing',            // RFC2518
        200 => 'OK',
        201 => 'Created',
        202 => 'Accepted',
        203 => 'Non-Authoritative Information',
        204 => 'No Content',
        205 => 'Reset Content',
        206 => 'Partial Content',
        207 => 'Multi-Status',          // RFC4918
        208 => 'Already Reported',      // RFC5842
        226 => 'IM Used',               // RFC3229
        300 => 'Multiple Choices',
        301 => 'Moved Permanently',
        302 => 'Found',
        303 => 'See Other',
        304 => 'Not Modified',
        305 => 'Use Proxy',
        306 => 'Reserved',
        307 => 'Temporary Redirect',
        308 => 'Permanent Redirect',    // RFC-reschke-http-status-308-07
        400 => 'Bad Request',
        401 => 'Unauthorized',
        402 => 'Payment Required',
        403 => 'Forbidden',
        404 => 'Not Found',
        405 => 'Method Not Allowed',
        406 => 'Not Acceptable',
        407 => 'Proxy Authentication Required',
        408 => 'Request Timeout',
        409 => 'Conflict',
        410 => 'Gone',
        411 => 'Length Required',
        412 => 'Precondition Failed',
        413 => 'Request Entity Too Large',
        414 => 'Request-URI Too Long',
        415 => 'Unsupported Media Type',
        416 => 'Requested Range Not Satisfiable',
        417 => 'Expectation Failed',
        418 => 'I\'m a teapot',                                               // RFC2324
        422 => 'Unprocessable Entity',                                        // RFC4918
        423 => 'Locked',                                                      // RFC4918
        424 => 'Failed Dependency',                                           // RFC4918
        425 => 'Reserved for WebDAV advanced collections expired proposal',   // RFC2817
        426 => 'Upgrade Required',                                            // RFC2817
        428 => 'Precondition Required',                                       // RFC6585
        429 => 'Too Many Requests',                                           // RFC6585
        431 => 'Request Header Fields Too Large',                             // RFC6585
        500 => 'Internal Server Error',
        501 => 'Not Implemented',
        502 => 'Bad Gateway',
        503 => 'Service Unavailable',
        504 => 'Gateway Timeout',
        505 => 'HTTP Version Not Supported',
        506 => 'Variant Also Negotiates (Experimental)',                      // RFC2295
        507 => 'Insufficient Storage',                                        // RFC4918
        508 => 'Loop Detected',                                               // RFC5842
        510 => 'Not Extended',                                                // RFC2774
        511 => 'Network Authentication Required',                             // RFC6585
    );

    /**
     * Constructor.
     *
     * @param mixed   $content The response content, see setContent()
     * @param integer $status  The response status code
     * @param array   $headers An array of response headers
     *
     * @throws \InvalidArgumentException When the HTTP status code is not valid
     *
     * @api
     */
    public function __construct($content = '', $status = 200, $headers = array())
    {
        $this->headers = new ResponseHeaderBag($headers);
        $this->setContent($content);
        $this->setStatusCode($status);
        $this->setProtocolVersion('1.0');
        if (!$this->headers->has('Date')) {
            $this->setDate(new \DateTime(null, new \DateTimeZone('UTC')));
        }
    }

    /**
     * Factory method for chainability
     *
     * Example:
     *
     *     return Response::create($body, 200)
     *         ->setSharedMaxAge(300);
     *
     * @param mixed   $content The response content, see setContent()
     * @param integer $status  The response status code
     * @param array   $headers An array of response headers
     *
     * @return Response
     */
    public static function create($content = '', $status = 200, $headers = array())
    {
        return new static($content, $status, $headers);
    }

    /**
     * Returns the Response as an HTTP string.
     *
     * The string representation of the Response is the same as the
     * one that will be sent to the client only if the prepare() method
     * has been called before.
     *
     * @return string The Response as an HTTP string
     *
     * @see prepare()
     */
    public function __toString()
    {
        return
            sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n".
            $this->headers."\r\n".
            $this->getContent();
    }

    /**
     * Clones the current Response instance.
     */
    public function __clone()
    {
        $this->headers = clone $this->headers;
    }

    /**
     * Prepares the Response before it is sent to the client.
     *
     * This method tweaks the Response to ensure that it is
     * compliant with RFC 2616. Most of the changes are based on
     * the Request that is "associated" with this Response.
     *
     * @param Request $request A Request instance
     *
     * @return Response The current response.
     */
    public function prepare(Request $request)
    {
        $headers = $this->headers;

        if ($this->isInformational() || in_array($this->statusCode, array(204, 304))) {
            $this->setContent(null);
        }

        // Content-type based on the Request
        if (!$headers->has('Content-Type')) {
            $format = $request->getRequestFormat();
            if (null !== $format && $mimeType = $request->getMimeType($format)) {
                $headers->set('Content-Type', $mimeType);
            }
        }

        // Fix Content-Type
        $charset = $this->charset ?: 'UTF-8';
        if (!$headers->has('Content-Type')) {
            $headers->set('Content-Type', 'text/html; charset='.$charset);
        } elseif (0 === stripos($headers->get('Content-Type'), 'text/') && false === stripos($headers->get('Content-Type'), 'charset')) {
            // add the charset
            $headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset);
        }

        // Fix Content-Length
        if ($headers->has('Transfer-Encoding')) {
            $headers->remove('Content-Length');
        }

        if ($request->isMethod('HEAD')) {
            // cf. RFC2616 14.13
            $length = $headers->get('Content-Length');
            $this->setContent(null);
            if ($length) {
                $headers->set('Content-Length', $length);
            }
        }

        // Fix protocol
        if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) {
            $this->setProtocolVersion('1.1');
        }

        // Check if we need to send extra expire info headers
        if ('1.0' == $this->getProtocolVersion() && 'no-cache' == $this->headers->get('Cache-Control')) {
            $this->headers->set('pragma', 'no-cache');
            $this->headers->set('expires', -1);
        }

        $this->ensureIEOverSSLCompatibility($request);

        return $this;
    }

    /**
     * Sends HTTP headers.
     *
     * @return Response
     */
    public function sendHeaders()
    {
        // headers have already been sent by the developer
        if (headers_sent()) {
            return $this;
        }

        // status
        header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);

        // headers
        foreach ($this->headers->allPreserveCase() as $name => $values) {
            foreach ($values as $value) {
                header($name.': '.$value, false, $this->statusCode);
            }
        }

        // cookies
        foreach ($this->headers->getCookies() as $cookie) {
            setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
        }

        return $this;
    }

    /**
     * Sends content for the current web response.
     *
     * @return Response
     */
    public function sendContent()
    {
        echo $this->content;

        return $this;
    }

    /**
     * Sends HTTP headers and content.
     *
     * @return Response
     *
     * @api
     */
    public function send()
    {
        $this->sendHeaders();
        $this->sendContent();

        if (function_exists('fastcgi_finish_request')) {
            fastcgi_finish_request();
        } elseif ('cli' !== PHP_SAPI) {
            // ob_get_level() never returns 0 on some Windows configurations, so if
            // the level is the same two times in a row, the loop should be stopped.
            $previous = null;
            $obStatus = ob_get_status(1);
            while (($level = ob_get_level()) > 0 && $level !== $previous) {
                $previous = $level;
                if ($obStatus[$level - 1]) {
                    if (version_compare(PHP_VERSION, '5.4', '>=')) {
                        if (isset($obStatus[$level - 1]['flags']) && ($obStatus[$level - 1]['flags'] & PHP_OUTPUT_HANDLER_REMOVABLE)) {
                            ob_end_flush();
                        }
                    } else {
                        if (isset($obStatus[$level - 1]['del']) && $obStatus[$level - 1]['del']) {
                            ob_end_flush();
                        }
                    }
                }
            }
            flush();
        }

        return $this;
    }

    /**
     * Sets the response content.
     *
     * Valid types are strings, numbers, null, and objects that implement a __toString() method.
     *
     * @param mixed $content Content that can be cast to string
     *
     * @return Response
     *
     * @throws \UnexpectedValueException
     *
     * @api
     */
    public function setContent($content)
    {
        if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable(array($content, '__toString'))) {
            throw new \UnexpectedValueException(sprintf('The Response content must be a string or object implementing __toString(), "%s" given.', gettype($content)));
        }

        $this->content = (string) $content;

        return $this;
    }

    /**
     * Gets the current response content.
     *
     * @return string Content
     *
     * @api
     */
    public function getContent()
    {
        return $this->content;
    }

    /**
     * Sets the HTTP protocol version (1.0 or 1.1).
     *
     * @param string $version The HTTP protocol version
     *
     * @return Response
     *
     * @api
     */
    public function setProtocolVersion($version)
    {
        $this->version = $version;

        return $this;
    }

    /**
     * Gets the HTTP protocol version.
     *
     * @return string The HTTP protocol version
     *
     * @api
     */
    public function getProtocolVersion()
    {
        return $this->version;
    }

    /**
     * Sets the response status code.
     *
     * @param integer $code HTTP status code
     * @param mixed   $text HTTP status text
     *
     * If the status text is null it will be automatically populated for the known
     * status codes and left empty otherwise.
     *
     * @return Response
     *
     * @throws \InvalidArgumentException When the HTTP status code is not valid
     *
     * @api
     */
    public function setStatusCode($code, $text = null)
    {
        $this->statusCode = $code = (int) $code;
        if ($this->isInvalid()) {
            throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code));
        }

        if (null === $text) {
            $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : '';

            return $this;
        }

        if (false === $text) {
            $this->statusText = '';

            return $this;
        }

        $this->statusText = $text;

        return $this;
    }

    /**
     * Retrieves the status code for the current web response.
     *
     * @return integer Status code
     *
     * @api
     */
    public function getStatusCode()
    {
        return $this->statusCode;
    }

    /**
     * Sets the response charset.
     *
     * @param string $charset Character set
     *
     * @return Response
     *
     * @api
     */
    public function setCharset($charset)
    {
        $this->charset = $charset;

        return $this;
    }

    /**
     * Retrieves the response charset.
     *
     * @return string Character set
     *
     * @api
     */
    public function getCharset()
    {
        return $this->charset;
    }

    /**
     * Returns true if the response is worth caching under any circumstance.
     *
     * Responses marked "private" with an explicit Cache-Control directive are
     * considered uncacheable.
     *
     * Responses with neither a freshness lifetime (Expires, max-age) nor cache
     * validator (Last-Modified, ETag) are considered uncacheable.
     *
     * @return Boolean true if the response is worth caching, false otherwise
     *
     * @api
     */
    public function isCacheable()
    {
        if (!in_array($this->statusCode, array(200, 203, 300, 301, 302, 404, 410))) {
            return false;
        }

        if ($this->headers->hasCacheControlDirective('no-store') || $this->headers->getCacheControlDirective('private')) {
            return false;
        }

        return $this->isValidateable() || $this->isFresh();
    }

    /**
     * Returns true if the response is "fresh".
     *
     * Fresh responses may be served from cache without any interaction with the
     * origin. A response is considered fresh when it includes a Cache-Control/max-age
     * indicator or Expires header and the calculated age is less than the freshness lifetime.
     *
     * @return Boolean true if the response is fresh, false otherwise
     *
     * @api
     */
    public function isFresh()
    {
        return $this->getTtl() > 0;
    }

    /**
     * Returns true if the response includes headers that can be used to validate
     * the response with the origin server using a conditional GET request.
     *
     * @return Boolean true if the response is validateable, false otherwise
     *
     * @api
     */
    public function isValidateable()
    {
        return $this->headers->has('Last-Modified') || $this->headers->has('ETag');
    }

    /**
     * Marks the response as "private".
     *
     * It makes the response ineligible for serving other clients.
     *
     * @return Response
     *
     * @api
     */
    public function setPrivate()
    {
        $this->headers->removeCacheControlDirective('public');
        $this->headers->addCacheControlDirective('private');

        return $this;
    }

    /**
     * Marks the response as "public".
     *
     * It makes the response eligible for serving other clients.
     *
     * @return Response
     *
     * @api
     */
    public function setPublic()
    {
        $this->headers->addCacheControlDirective('public');
        $this->headers->removeCacheControlDirective('private');

        return $this;
    }

    /**
     * Returns true if the response must be revalidated by caches.
     *
     * This method indicates that the response must not be served stale by a
     * cache in any circumstance without first revalidating with the origin.
     * When present, the TTL of the response should not be overridden to be
     * greater than the value provided by the origin.
     *
     * @return Boolean true if the response must be revalidated by a cache, false otherwise
     *
     * @api
     */
    public function mustRevalidate()
    {
        return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->has('proxy-revalidate');
    }

    /**
     * Returns the Date header as a DateTime instance.
     *
     * @return \DateTime A \DateTime instance
     *
     * @throws \RuntimeException When the header is not parseable
     *
     * @api
     */
    public function getDate()
    {
        return $this->headers->getDate('Date', new \DateTime());
    }

    /**
     * Sets the Date header.
     *
     * @param \DateTime $date A \DateTime instance
     *
     * @return Response
     *
     * @api
     */
    public function setDate(\DateTime $date)
    {
        $date->setTimezone(new \DateTimeZone('UTC'));
        $this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT');

        return $this;
    }

    /**
     * Returns the age of the response.
     *
     * @return integer The age of the response in seconds
     */
    public function getAge()
    {
        if (null !== $age = $this->headers->get('Age')) {
            return (int) $age;
        }

        return max(time() - $this->getDate()->format('U'), 0);
    }

    /**
     * Marks the response stale by setting the Age header to be equal to the maximum age of the response.
     *
     * @return Response
     *
     * @api
     */
    public function expire()
    {
        if ($this->isFresh()) {
            $this->headers->set('Age', $this->getMaxAge());
        }

        return $this;
    }

    /**
     * Returns the value of the Expires header as a DateTime instance.
     *
     * @return \DateTime|null A DateTime instance or null if the header does not exist
     *
     * @api
     */
    public function getExpires()
    {
        try {
            return $this->headers->getDate('Expires');
        } catch (\RuntimeException $e) {
            // according to RFC 2616 invalid date formats (e.g. "0" and "-1") must be treated as in the past
            return \DateTime::createFromFormat(DATE_RFC2822, 'Sat, 01 Jan 00 00:00:00 +0000');
        }
    }

    /**
     * Sets the Expires HTTP header with a DateTime instance.
     *
     * Passing null as value will remove the header.
     *
     * @param \DateTime|null $date A \DateTime instance or null to remove the header
     *
     * @return Response
     *
     * @api
     */
    public function setExpires(\DateTime $date = null)
    {
        if (null === $date) {
            $this->headers->remove('Expires');
        } else {
            $date = clone $date;
            $date->setTimezone(new \DateTimeZone('UTC'));
            $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT');
        }

        return $this;
    }

    /**
     * Returns the number of seconds after the time specified in the response's Date
     * header when the response should no longer be considered fresh.
     *
     * First, it checks for a s-maxage directive, then a max-age directive, and then it falls
     * back on an expires header. It returns null when no maximum age can be established.
     *
     * @return integer|null Number of seconds
     *
     * @api
     */
    public function getMaxAge()
    {
        if ($this->headers->hasCacheControlDirective('s-maxage')) {
            return (int) $this->headers->getCacheControlDirective('s-maxage');
        }

        if ($this->headers->hasCacheControlDirective('max-age')) {
            return (int) $this->headers->getCacheControlDirective('max-age');
        }

        if (null !== $this->getExpires()) {
            return $this->getExpires()->format('U') - $this->getDate()->format('U');
        }

        return null;
    }

    /**
     * Sets the number of seconds after which the response should no longer be considered fresh.
     *
     * This methods sets the Cache-Control max-age directive.
     *
     * @param integer $value Number of seconds
     *
     * @return Response
     *
     * @api
     */
    public function setMaxAge($value)
    {
        $this->headers->addCacheControlDirective('max-age', $value);

        return $this;
    }

    /**
     * Sets the number of seconds after which the response should no longer be considered fresh by shared caches.
     *
     * This methods sets the Cache-Control s-maxage directive.
     *
     * @param integer $value Number of seconds
     *
     * @return Response
     *
     * @api
     */
    public function setSharedMaxAge($value)
    {
        $this->setPublic();
        $this->headers->addCacheControlDirective('s-maxage', $value);

        return $this;
    }

    /**
     * Returns the response's time-to-live in seconds.
     *
     * It returns null when no freshness information is present in the response.
     *
     * When the responses TTL is <= 0, the response may not be served from cache without first
     * revalidating with the origin.
     *
     * @return integer|null The TTL in seconds
     *
     * @api
     */
    public function getTtl()
    {
        if (null !== $maxAge = $this->getMaxAge()) {
            return $maxAge - $this->getAge();
        }

        return null;
    }

    /**
     * Sets the response's time-to-live for shared caches.
     *
     * This method adjusts the Cache-Control/s-maxage directive.
     *
     * @param integer $seconds Number of seconds
     *
     * @return Response
     *
     * @api
     */
    public function setTtl($seconds)
    {
        $this->setSharedMaxAge($this->getAge() + $seconds);

        return $this;
    }

    /**
     * Sets the response's time-to-live for private/client caches.
     *
     * This method adjusts the Cache-Control/max-age directive.
     *
     * @param integer $seconds Number of seconds
     *
     * @return Response
     *
     * @api
     */
    public function setClientTtl($seconds)
    {
        $this->setMaxAge($this->getAge() + $seconds);

        return $this;
    }

    /**
     * Returns the Last-Modified HTTP header as a DateTime instance.
     *
     * @return \DateTime|null A DateTime instance or null if the header does not exist
     *
     * @throws \RuntimeException When the HTTP header is not parseable
     *
     * @api
     */
    public function getLastModified()
    {
        return $this->headers->getDate('Last-Modified');
    }

    /**
     * Sets the Last-Modified HTTP header with a DateTime instance.
     *
     * Passing null as value will remove the header.
     *
     * @param \DateTime|null $date A \DateTime instance or null to remove the header
     *
     * @return Response
     *
     * @api
     */
    public function setLastModified(\DateTime $date = null)
    {
        if (null === $date) {
            $this->headers->remove('Last-Modified');
        } else {
            $date = clone $date;
            $date->setTimezone(new \DateTimeZone('UTC'));
            $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT');
        }

        return $this;
    }

    /**
     * Returns the literal value of the ETag HTTP header.
     *
     * @return string|null The ETag HTTP header or null if it does not exist
     *
     * @api
     */
    public function getEtag()
    {
        return $this->headers->get('ETag');
    }

    /**
     * Sets the ETag value.
     *
     * @param string|null $etag The ETag unique identifier or null to remove the header
     * @param Boolean     $weak Whether you want a weak ETag or not
     *
     * @return Response
     *
     * @api
     */
    public function setEtag($etag = null, $weak = false)
    {
        if (null === $etag) {
            $this->headers->remove('Etag');
        } else {
            if (0 !== strpos($etag, '"')) {
                $etag = '"'.$etag.'"';
            }

            $this->headers->set('ETag', (true === $weak ? 'W/' : '').$etag);
        }

        return $this;
    }

    /**
     * Sets the response's cache headers (validation and/or expiration).
     *
     * Available options are: etag, last_modified, max_age, s_maxage, private, and public.
     *
     * @param array $options An array of cache options
     *
     * @return Response
     *
     * @throws \InvalidArgumentException
     *
     * @api
     */
    public function setCache(array $options)
    {
        if ($diff = array_diff(array_keys($options), array('etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public'))) {
            throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', array_values($diff))));
        }

        if (isset($options['etag'])) {
            $this->setEtag($options['etag']);
        }

        if (isset($options['last_modified'])) {
            $this->setLastModified($options['last_modified']);
        }

        if (isset($options['max_age'])) {
            $this->setMaxAge($options['max_age']);
        }

        if (isset($options['s_maxage'])) {
            $this->setSharedMaxAge($options['s_maxage']);
        }

        if (isset($options['public'])) {
            if ($options['public']) {
                $this->setPublic();
            } else {
                $this->setPrivate();
            }
        }

        if (isset($options['private'])) {
            if ($options['private']) {
                $this->setPrivate();
            } else {
                $this->setPublic();
            }
        }

        return $this;
    }

    /**
     * Modifies the response so that it conforms to the rules defined for a 304 status code.
     *
     * This sets the status, removes the body, and discards any headers
     * that MUST NOT be included in 304 responses.
     *
     * @return Response
     *
     * @see http://tools.ietf.org/html/rfc2616#section-10.3.5
     *
     * @api
     */
    public function setNotModified()
    {
        $this->setStatusCode(304);
        $this->setContent(null);

        // remove headers that MUST NOT be included with 304 Not Modified responses
        foreach (array('Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified') as $header) {
            $this->headers->remove($header);
        }

        return $this;
    }

    /**
     * Returns true if the response includes a Vary header.
     *
     * @return Boolean true if the response includes a Vary header, false otherwise
     *
     * @api
     */
    public function hasVary()
    {
        return null !== $this->headers->get('Vary');
    }

    /**
     * Returns an array of header names given in the Vary header.
     *
     * @return array An array of Vary names
     *
     * @api
     */
    public function getVary()
    {
        if (!$vary = $this->headers->get('Vary', null, false)) {
            return array();
        }

        $ret = array();
        foreach ($vary as $item) {
            $ret = array_merge($ret, preg_split('/[\s,]+/', $item));
        }

        return $ret;
    }

    /**
     * Sets the Vary header.
     *
     * @param string|array $headers
     * @param Boolean      $replace Whether to replace the actual value of not (true by default)
     *
     * @return Response
     *
     * @api
     */
    public function setVary($headers, $replace = true)
    {
        $this->headers->set('Vary', $headers, $replace);

        return $this;
    }

    /**
     * Determines if the Response validators (ETag, Last-Modified) match
     * a conditional value specified in the Request.
     *
     * If the Response is not modified, it sets the status code to 304 and
     * removes the actual content by calling the setNotModified() method.
     *
     * @param Request $request A Request instance
     *
     * @return Boolean true if the Response validators match the Request, false otherwise
     *
     * @api
     */
    public function isNotModified(Request $request)
    {
        if (!$request->isMethodSafe()) {
            return false;
        }

        $lastModified = $request->headers->get('If-Modified-Since');
        $notModified = false;
        if ($etags = $request->getEtags()) {
            $notModified = (in_array($this->getEtag(), $etags) || in_array('*', $etags)) && (!$lastModified || $this->headers->get('Last-Modified') == $lastModified);
        } elseif ($lastModified) {
            $notModified = $lastModified == $this->headers->get('Last-Modified');
        }

        if ($notModified) {
            $this->setNotModified();
        }

        return $notModified;
    }

    // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
    /**
     * Is response invalid?
     *
     * @return Boolean
     *
     * @api
     */
    public function isInvalid()
    {
        return $this->statusCode < 100 || $this->statusCode >= 600;
    }

    /**
     * Is response informative?
     *
     * @return Boolean
     *
     * @api
     */
    public function isInformational()
    {
        return $this->statusCode >= 100 && $this->statusCode < 200;
    }

    /**
     * Is response successful?
     *
     * @return Boolean
     *
     * @api
     */
    public function isSuccessful()
    {
        return $this->statusCode >= 200 && $this->statusCode < 300;
    }

    /**
     * Is the response a redirect?
     *
     * @return Boolean
     *
     * @api
     */
    public function isRedirection()
    {
        return $this->statusCode >= 300 && $this->statusCode < 400;
    }

    /**
     * Is there a client error?
     *
     * @return Boolean
     *
     * @api
     */
    public function isClientError()
    {
        return $this->statusCode >= 400 && $this->statusCode < 500;
    }

    /**
     * Was there a server side error?
     *
     * @return Boolean
     *
     * @api
     */
    public function isServerError()
    {
        return $this->statusCode >= 500 && $this->statusCode < 600;
    }

    /**
     * Is the response OK?
     *
     * @return Boolean
     *
     * @api
     */
    public function isOk()
    {
        return 200 === $this->statusCode;
    }

    /**
     * Is the response forbidden?
     *
     * @return Boolean
     *
     * @api
     */
    public function isForbidden()
    {
        return 403 === $this->statusCode;
    }

    /**
     * Is the response a not found error?
     *
     * @return Boolean
     *
     * @api
     */
    public function isNotFound()
    {
        return 404 === $this->statusCode;
    }

    /**
     * Is the response a redirect of some form?
     *
     * @param string $location
     *
     * @return Boolean
     *
     * @api
     */
    public function isRedirect($location = null)
    {
        return in_array($this->statusCode, array(201, 301, 302, 303, 307, 308)) && (null === $location ?: $location == $this->headers->get('Location'));
    }

    /**
     * Is the response empty?
     *
     * @return Boolean
     *
     * @api
     */
    public function isEmpty()
    {
        return in_array($this->statusCode, array(201, 204, 304));
    }

    /**
     * Check if we need to remove Cache-Control for SSL encrypted downloads when using IE < 9
     *
     * @link http://support.microsoft.com/kb/323308
     */
    protected function ensureIEOverSSLCompatibility(Request $request)
    {
        if (false !== stripos($this->headers->get('Content-Disposition'), 'attachment') && preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT'), $match) == 1 && true === $request->isSecure()) {
            if (intval(preg_replace("/(MSIE )(.*?);/", "$2", $match[0])) < 9) {
                $this->headers->remove('Cache-Control');
            }
        }
    }
}
PK�`�\PE�
XX4pear/Symfony/Component/HttpFoundation/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\HttpFoundation\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�`�\n��OOBpear/Symfony/Component/HttpFoundation/ExpressionRequestMatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

/**
 * ExpressionRequestMatcher uses an expression to match a Request.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ExpressionRequestMatcher extends RequestMatcher
{
    private $language;
    private $expression;

    public function setExpression(ExpressionLanguage $language, $expression)
    {
        $this->language = $language;
        $this->expression = $expression;
    }

    public function matches(Request $request)
    {
        if (!$this->language) {
            throw new \LogicException('Unable to match the request as the expression language is not available.');
        }

        return $this->language->evaluate($this->expression, array(
            'request' => $request,
            'method' => $request->getMethod(),
            'path' => rawurldecode($request->getPathInfo()),
            'host' => $request->getHost(),
            'ip' => $request->getClientIp(),
            'attributes' => $request->attributes->all(),
        )) && parent::matches($request);
    }
}
PK�`�\�K>��7pear/Symfony/Component/HttpFoundation/ApacheRequest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * Request represents an HTTP request from an Apache server.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ApacheRequest extends Request
{
    /**
     * {@inheritdoc}
     */
    protected function prepareRequestUri()
    {
        return $this->server->get('REQUEST_URI');
    }

    /**
     * {@inheritdoc}
     */
    protected function prepareBaseUrl()
    {
        $baseUrl = $this->server->get('SCRIPT_NAME');

        if (false === strpos($this->server->get('REQUEST_URI'), $baseUrl)) {
            // assume mod_rewrite
            return rtrim(dirname($baseUrl), '/\\');
        }

        return $baseUrl;
    }
}
PK�`�\8{?���8pear/Symfony/Component/HttpFoundation/RequestMatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * RequestMatcher compares a pre-defined set of checks against a Request instance.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class RequestMatcher implements RequestMatcherInterface
{
    /**
     * @var string
     */
    private $path;

    /**
     * @var string
     */
    private $host;

    /**
     * @var array
     */
    private $methods = array();

    /**
     * @var string
     */
    private $ips = array();

    /**
     * @var array
     */
    private $attributes = array();

    /**
     * @param string|null          $path
     * @param string|null          $host
     * @param string|string[]|null $methods
     * @param string|string[]|null $ips
     * @param array                $attributes
     */
    public function __construct($path = null, $host = null, $methods = null, $ips = null, array $attributes = array())
    {
        $this->matchPath($path);
        $this->matchHost($host);
        $this->matchMethod($methods);
        $this->matchIps($ips);
        foreach ($attributes as $k => $v) {
            $this->matchAttribute($k, $v);
        }
    }

    /**
     * Adds a check for the URL host name.
     *
     * @param string $regexp A Regexp
     */
    public function matchHost($regexp)
    {
        $this->host = $regexp;
    }

    /**
     * Adds a check for the URL path info.
     *
     * @param string $regexp A Regexp
     */
    public function matchPath($regexp)
    {
        $this->path = $regexp;
    }

    /**
     * Adds a check for the client IP.
     *
     * @param string $ip A specific IP address or a range specified using IP/netmask like 192.168.1.0/24
     */
    public function matchIp($ip)
    {
        $this->matchIps($ip);
    }

    /**
     * Adds a check for the client IP.
     *
     * @param string|string[] $ips A specific IP address or a range specified using IP/netmask like 192.168.1.0/24
     */
    public function matchIps($ips)
    {
        $this->ips = (array) $ips;
    }

    /**
     * Adds a check for the HTTP method.
     *
     * @param string|string[]|null $method An HTTP method or an array of HTTP methods
     */
    public function matchMethod($method)
    {
        $this->methods = array_map('strtoupper', (array) $method);
    }

    /**
     * Adds a check for request attribute.
     *
     * @param string $key    The request attribute name
     * @param string $regexp A Regexp
     */
    public function matchAttribute($key, $regexp)
    {
        $this->attributes[$key] = $regexp;
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function matches(Request $request)
    {
        if ($this->methods && !in_array($request->getMethod(), $this->methods)) {
            return false;
        }

        foreach ($this->attributes as $key => $pattern) {
            if (!preg_match('{'.$pattern.'}', $request->attributes->get($key))) {
                return false;
            }
        }

        if (null !== $this->path && !preg_match('{'.$this->path.'}', rawurldecode($request->getPathInfo()))) {
            return false;
        }

        if (null !== $this->host && !preg_match('{'.$this->host.'}i', $request->getHost())) {
            return false;
        }

        if (IpUtils::checkIp($request->getClientIp(), $this->ips)) {
            return true;
        }

        // Note to future implementors: add additional checks above the
        // foreach above or else your check might not be run!
        return count($this->ips) === 0;
    }
}
PK�`�\EY���3pear/Symfony/Component/HttpFoundation/HeaderBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * HeaderBag is a container for HTTP headers.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class HeaderBag implements \IteratorAggregate, \Countable
{
    protected $headers = array();
    protected $cacheControl = array();

    /**
     * Constructor.
     *
     * @param array $headers An array of HTTP headers
     *
     * @api
     */
    public function __construct(array $headers = array())
    {
        foreach ($headers as $key => $values) {
            $this->set($key, $values);
        }
    }

    /**
     * Returns the headers as a string.
     *
     * @return string The headers
     */
    public function __toString()
    {
        if (!$this->headers) {
            return '';
        }

        $max = max(array_map('strlen', array_keys($this->headers))) + 1;
        $content = '';
        ksort($this->headers);
        foreach ($this->headers as $name => $values) {
            $name = implode('-', array_map('ucfirst', explode('-', $name)));
            foreach ($values as $value) {
                $content .= sprintf("%-{$max}s %s\r\n", $name.':', $value);
            }
        }

        return $content;
    }

    /**
     * Returns the headers.
     *
     * @return array An array of headers
     *
     * @api
     */
    public function all()
    {
        return $this->headers;
    }

    /**
     * Returns the parameter keys.
     *
     * @return array An array of parameter keys
     *
     * @api
     */
    public function keys()
    {
        return array_keys($this->headers);
    }

    /**
     * Replaces the current HTTP headers by a new set.
     *
     * @param array $headers An array of HTTP headers
     *
     * @api
     */
    public function replace(array $headers = array())
    {
        $this->headers = array();
        $this->add($headers);
    }

    /**
     * Adds new headers the current HTTP headers set.
     *
     * @param array $headers An array of HTTP headers
     *
     * @api
     */
    public function add(array $headers)
    {
        foreach ($headers as $key => $values) {
            $this->set($key, $values);
        }
    }

    /**
     * Returns a header value by name.
     *
     * @param string  $key     The header name
     * @param mixed   $default The default value
     * @param Boolean $first   Whether to return the first value or all header values
     *
     * @return string|array The first header value if $first is true, an array of values otherwise
     *
     * @api
     */
    public function get($key, $default = null, $first = true)
    {
        $key = strtr(strtolower($key), '_', '-');

        if (!array_key_exists($key, $this->headers)) {
            if (null === $default) {
                return $first ? null : array();
            }

            return $first ? $default : array($default);
        }

        if ($first) {
            return count($this->headers[$key]) ? $this->headers[$key][0] : $default;
        }

        return $this->headers[$key];
    }

    /**
     * Sets a header by name.
     *
     * @param string       $key     The key
     * @param string|array $values  The value or an array of values
     * @param Boolean      $replace Whether to replace the actual value or not (true by default)
     *
     * @api
     */
    public function set($key, $values, $replace = true)
    {
        $key = strtr(strtolower($key), '_', '-');

        $values = array_values((array) $values);

        if (true === $replace || !isset($this->headers[$key])) {
            $this->headers[$key] = $values;
        } else {
            $this->headers[$key] = array_merge($this->headers[$key], $values);
        }

        if ('cache-control' === $key) {
            $this->cacheControl = $this->parseCacheControl($values[0]);
        }
    }

    /**
     * Returns true if the HTTP header is defined.
     *
     * @param string $key The HTTP header
     *
     * @return Boolean true if the parameter exists, false otherwise
     *
     * @api
     */
    public function has($key)
    {
        return array_key_exists(strtr(strtolower($key), '_', '-'), $this->headers);
    }

    /**
     * Returns true if the given HTTP header contains the given value.
     *
     * @param string $key   The HTTP header name
     * @param string $value The HTTP value
     *
     * @return Boolean true if the value is contained in the header, false otherwise
     *
     * @api
     */
    public function contains($key, $value)
    {
        return in_array($value, $this->get($key, null, false));
    }

    /**
     * Removes a header.
     *
     * @param string $key The HTTP header name
     *
     * @api
     */
    public function remove($key)
    {
        $key = strtr(strtolower($key), '_', '-');

        unset($this->headers[$key]);

        if ('cache-control' === $key) {
            $this->cacheControl = array();
        }
    }

    /**
     * Returns the HTTP header value converted to a date.
     *
     * @param string    $key     The parameter key
     * @param \DateTime $default The default value
     *
     * @return null|\DateTime The parsed DateTime or the default value if the header does not exist
     *
     * @throws \RuntimeException When the HTTP header is not parseable
     *
     * @api
     */
    public function getDate($key, \DateTime $default = null)
    {
        if (null === $value = $this->get($key)) {
            return $default;
        }

        if (false === $date = \DateTime::createFromFormat(DATE_RFC2822, $value)) {
            throw new \RuntimeException(sprintf('The %s HTTP header is not parseable (%s).', $key, $value));
        }

        return $date;
    }

    public function addCacheControlDirective($key, $value = true)
    {
        $this->cacheControl[$key] = $value;

        $this->set('Cache-Control', $this->getCacheControlHeader());
    }

    public function hasCacheControlDirective($key)
    {
        return array_key_exists($key, $this->cacheControl);
    }

    public function getCacheControlDirective($key)
    {
        return array_key_exists($key, $this->cacheControl) ? $this->cacheControl[$key] : null;
    }

    public function removeCacheControlDirective($key)
    {
        unset($this->cacheControl[$key]);

        $this->set('Cache-Control', $this->getCacheControlHeader());
    }

    /**
     * Returns an iterator for headers.
     *
     * @return \ArrayIterator An \ArrayIterator instance
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->headers);
    }

    /**
     * Returns the number of headers.
     *
     * @return int The number of headers
     */
    public function count()
    {
        return count($this->headers);
    }

    protected function getCacheControlHeader()
    {
        $parts = array();
        ksort($this->cacheControl);
        foreach ($this->cacheControl as $key => $value) {
            if (true === $value) {
                $parts[] = $key;
            } else {
                if (preg_match('#[^a-zA-Z0-9._-]#', $value)) {
                    $value = '"'.$value.'"';
                }

                $parts[] = "$key=$value";
            }
        }

        return implode(', ', $parts);
    }

    /**
     * Parses a Cache-Control HTTP header.
     *
     * @param string $header The value of the Cache-Control HTTP header
     *
     * @return array An array representing the attribute values
     */
    protected function parseCacheControl($header)
    {
        $cacheControl = array();
        preg_match_all('#([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?#', $header, $matches, PREG_SET_ORDER);
        foreach ($matches as $match) {
            $cacheControl[strtolower($match[1])] = isset($match[3]) ? $match[3] : (isset($match[2]) ? $match[2] : true);
        }

        return $cacheControl;
    }
}
PK�`�\P�i���1pear/Symfony/Component/HttpFoundation/FileBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * FileBag is a container for uploaded files.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
 *
 * @api
 */
class FileBag extends ParameterBag
{
    private static $fileKeys = array('error', 'name', 'size', 'tmp_name', 'type');

    /**
     * Constructor.
     *
     * @param array $parameters An array of HTTP files
     *
     * @api
     */
    public function __construct(array $parameters = array())
    {
        $this->replace($parameters);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function replace(array $files = array())
    {
        $this->parameters = array();
        $this->add($files);
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function set($key, $value)
    {
        if (!is_array($value) && !$value instanceof UploadedFile) {
            throw new \InvalidArgumentException('An uploaded file must be an array or an instance of UploadedFile.');
        }

        parent::set($key, $this->convertFileInformation($value));
    }

    /**
     * {@inheritdoc}
     *
     * @api
     */
    public function add(array $files = array())
    {
        foreach ($files as $key => $file) {
            $this->set($key, $file);
        }
    }

    /**
     * Converts uploaded files to UploadedFile instances.
     *
     * @param array|UploadedFile $file A (multi-dimensional) array of uploaded file information
     *
     * @return array A (multi-dimensional) array of UploadedFile instances
     */
    protected function convertFileInformation($file)
    {
        if ($file instanceof UploadedFile) {
            return $file;
        }

        $file = $this->fixPhpFilesArray($file);
        if (is_array($file)) {
            $keys = array_keys($file);
            sort($keys);

            if ($keys == self::$fileKeys) {
                if (UPLOAD_ERR_NO_FILE == $file['error']) {
                    $file = null;
                } else {
                    $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['size'], $file['error']);
                }
            } else {
                $file = array_map(array($this, 'convertFileInformation'), $file);
            }
        }

        return $file;
    }

    /**
     * Fixes a malformed PHP $_FILES array.
     *
     * PHP has a bug that the format of the $_FILES array differs, depending on
     * whether the uploaded file fields had normal field names or array-like
     * field names ("normal" vs. "parent[child]").
     *
     * This method fixes the array to look like the "normal" $_FILES array.
     *
     * It's safe to pass an already converted array, in which case this method
     * just returns the original array unmodified.
     *
     * @param array $data
     *
     * @return array
     */
    protected function fixPhpFilesArray($data)
    {
        if (!is_array($data)) {
            return $data;
        }

        $keys = array_keys($data);
        sort($keys);

        if (self::$fileKeys != $keys || !isset($data['name']) || !is_array($data['name'])) {
            return $data;
        }

        $files = $data;
        foreach (self::$fileKeys as $k) {
            unset($files[$k]);
        }

        foreach (array_keys($data['name']) as $key) {
            $files[$key] = $this->fixPhpFilesArray(array(
                'error'    => $data['error'][$key],
                'name'     => $data['name'][$key],
                'type'     => $data['type'][$key],
                'tmp_name' => $data['tmp_name'][$key],
                'size'     => $data['size'][$key]
            ));
        }

        return $files;
    }
}
PK�`�\Vk�b33:pear/Symfony/Component/HttpFoundation/AcceptHeaderItem.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * Represents an Accept-* header item.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class AcceptHeaderItem
{
    /**
     * @var string
     */
    private $value;

    /**
     * @var float
     */
    private $quality = 1.0;

    /**
     * @var int
     */
    private $index = 0;

    /**
     * @var array
     */
    private $attributes = array();

    /**
     * Constructor.
     *
     * @param string $value
     * @param array  $attributes
     */
    public function __construct($value, array $attributes = array())
    {
        $this->value = $value;
        foreach ($attributes as $name => $value) {
            $this->setAttribute($name, $value);
        }
    }

    /**
     * Builds an AcceptHeaderInstance instance from a string.
     *
     * @param string $itemValue
     *
     * @return AcceptHeaderItem
     */
    public static function fromString($itemValue)
    {
        $bits = preg_split('/\s*(?:;*("[^"]+");*|;*(\'[^\']+\');*|;+)\s*/', $itemValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
        $value = array_shift($bits);
        $attributes = array();

        $lastNullAttribute = null;
        foreach ($bits as $bit) {
            if (($start = substr($bit, 0, 1)) === ($end = substr($bit, -1)) && ($start === '"' || $start === '\'')) {
                $attributes[$lastNullAttribute] = substr($bit, 1, -1);
            } elseif ('=' === $end) {
                $lastNullAttribute = $bit = substr($bit, 0, -1);
                $attributes[$bit] = null;
            } else {
                $parts = explode('=', $bit);
                $attributes[$parts[0]] = isset($parts[1]) && strlen($parts[1]) > 0 ? $parts[1] : '';
            }
        }

        return new self(($start = substr($value, 0, 1)) === ($end = substr($value, -1)) && ($start === '"' || $start === '\'') ? substr($value, 1, -1) : $value, $attributes);
    }

    /**
     * Returns header  value's string representation.
     *
     * @return string
     */
    public function __toString()
    {
        $string = $this->value.($this->quality < 1 ? ';q='.$this->quality : '');
        if (count($this->attributes) > 0) {
            $string .= ';'.implode(';', array_map(function ($name, $value) {
                return sprintf(preg_match('/[,;=]/', $value) ? '%s="%s"' : '%s=%s', $name, $value);
            }, array_keys($this->attributes), $this->attributes));
        }

        return $string;
    }

    /**
     * Set the item value.
     *
     * @param string $value
     *
     * @return AcceptHeaderItem
     */
    public function setValue($value)
    {
        $this->value = $value;

        return $this;
    }

    /**
     * Returns the item value.
     *
     * @return string
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * Set the item quality.
     *
     * @param float $quality
     *
     * @return AcceptHeaderItem
     */
    public function setQuality($quality)
    {
        $this->quality = $quality;

        return $this;
    }

    /**
     * Returns the item quality.
     *
     * @return float
     */
    public function getQuality()
    {
        return $this->quality;
    }

    /**
     * Set the item index.
     *
     * @param int $index
     *
     * @return AcceptHeaderItem
     */
    public function setIndex($index)
    {
        $this->index = $index;

        return $this;
    }

    /**
     * Returns the item index.
     *
     * @return int
     */
    public function getIndex()
    {
        return $this->index;
    }

    /**
     * Tests if an attribute exists.
     *
     * @param string $name
     *
     * @return Boolean
     */
    public function hasAttribute($name)
    {
        return isset($this->attributes[$name]);
    }

    /**
     * Returns an attribute by its name.
     *
     * @param string $name
     * @param mixed  $default
     *
     * @return mixed
     */
    public function getAttribute($name, $default = null)
    {
        return isset($this->attributes[$name]) ? $this->attributes[$name] : $default;
    }

    /**
     * Returns all attributes.
     *
     * @return array
     */
    public function getAttributes()
    {
        return $this->attributes;
    }

    /**
     * Set an attribute.
     *
     * @param string $name
     * @param string $value
     *
     * @return AcceptHeaderItem
     */
    public function setAttribute($name, $value)
    {
        if ('q' === $name) {
            $this->quality = (float) $value;
        } else {
            $this->attributes[$name] = (string) $value;
        }

        return $this;
    }
}
PK�`�\�a.6pear/Symfony/Component/HttpFoundation/AcceptHeader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * Represents an Accept-* header.
 *
 * An accept header is compound with a list of items,
 * sorted by descending quality.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class AcceptHeader
{
    /**
     * @var AcceptHeaderItem[]
     */
    private $items = array();

    /**
     * @var bool
     */
    private $sorted = true;

    /**
     * Constructor.
     *
     * @param AcceptHeaderItem[] $items
     */
    public function __construct(array $items)
    {
        foreach ($items as $item) {
            $this->add($item);
        }
    }

    /**
     * Builds an AcceptHeader instance from a string.
     *
     * @param string $headerValue
     *
     * @return AcceptHeader
     */
    public static function fromString($headerValue)
    {
        $index = 0;

        return new self(array_map(function ($itemValue) use (&$index) {
            $item = AcceptHeaderItem::fromString($itemValue);
            $item->setIndex($index++);

            return $item;
        }, preg_split('/\s*(?:,*("[^"]+"),*|,*(\'[^\']+\'),*|,+)\s*/', $headerValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)));
    }

    /**
     * Returns header value's string representation.
     *
     * @return string
     */
    public function __toString()
    {
        return implode(',', $this->items);
    }

    /**
     * Tests if header has given value.
     *
     * @param string $value
     *
     * @return Boolean
     */
    public function has($value)
    {
        return isset($this->items[$value]);
    }

    /**
     * Returns given value's item, if exists.
     *
     * @param string $value
     *
     * @return AcceptHeaderItem|null
     */
    public function get($value)
    {
        return isset($this->items[$value]) ? $this->items[$value] : null;
    }

    /**
     * Adds an item.
     *
     * @param AcceptHeaderItem $item
     *
     * @return AcceptHeader
     */
    public function add(AcceptHeaderItem $item)
    {
        $this->items[$item->getValue()] = $item;
        $this->sorted = false;

        return $this;
    }

    /**
     * Returns all items.
     *
     * @return AcceptHeaderItem[]
     */
    public function all()
    {
        $this->sort();

        return $this->items;
    }

    /**
     * Filters items on their value using given regex.
     *
     * @param string $pattern
     *
     * @return AcceptHeader
     */
    public function filter($pattern)
    {
        return new self(array_filter($this->items, function (AcceptHeaderItem $item) use ($pattern) {
            return preg_match($pattern, $item->getValue());
        }));
    }

    /**
     * Returns first item.
     *
     * @return AcceptHeaderItem|null
     */
    public function first()
    {
        $this->sort();

        return !empty($this->items) ? reset($this->items) : null;
    }

    /**
     * Sorts items by descending quality
     */
    private function sort()
    {
        if (!$this->sorted) {
            uasort($this->items, function ($a, $b) {
                $qA = $a->getQuality();
                $qB = $b->getQuality();

                if ($qA === $qB) {
                    return $a->getIndex() > $b->getIndex() ? 1 : -1;
                }

                return $qA > $qB ? -1 : 1;
            });

            $this->sorted = true;
        }
    }
}
PK�`�\�}��xx3pear/Symfony/Component/HttpFoundation/ServerBag.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * ServerBag is a container for HTTP headers from the $_SERVER variable.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
 * @author Robert Kiss <kepten@gmail.com>
 */
class ServerBag extends ParameterBag
{
    /**
     * Gets the HTTP headers.
     *
     * @return array
     */
    public function getHeaders()
    {
        $headers = array();
        $contentHeaders = array('CONTENT_LENGTH' => true, 'CONTENT_MD5' => true, 'CONTENT_TYPE' => true);
        foreach ($this->parameters as $key => $value) {
            if (0 === strpos($key, 'HTTP_')) {
                $headers[substr($key, 5)] = $value;
            }
            // CONTENT_* are not prefixed with HTTP_
            elseif (isset($contentHeaders[$key])) {
                $headers[$key] = $value;
            }
        }

        if (isset($this->parameters['PHP_AUTH_USER'])) {
            $headers['PHP_AUTH_USER'] = $this->parameters['PHP_AUTH_USER'];
            $headers['PHP_AUTH_PW'] = isset($this->parameters['PHP_AUTH_PW']) ? $this->parameters['PHP_AUTH_PW'] : '';
        } else {
            /*
             * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default
             * For this workaround to work, add these lines to your .htaccess file:
             * RewriteCond %{HTTP:Authorization} ^(.+)$
             * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
             *
             * A sample .htaccess file:
             * RewriteEngine On
             * RewriteCond %{HTTP:Authorization} ^(.+)$
             * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
             * RewriteCond %{REQUEST_FILENAME} !-f
             * RewriteRule ^(.*)$ app.php [QSA,L]
             */

            $authorizationHeader = null;
            if (isset($this->parameters['HTTP_AUTHORIZATION'])) {
                $authorizationHeader = $this->parameters['HTTP_AUTHORIZATION'];
            } elseif (isset($this->parameters['REDIRECT_HTTP_AUTHORIZATION'])) {
                $authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION'];
            }

            if (null !== $authorizationHeader) {
                if (0 === stripos($authorizationHeader, 'basic')) {
                    // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic
                    $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)));
                    if (count($exploded) == 2) {
                        list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded;
                    }
                } elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader, 'digest'))) {
                    // In some circumstances PHP_AUTH_DIGEST needs to be set
                    $headers['PHP_AUTH_DIGEST'] = $authorizationHeader;
                    $this->parameters['PHP_AUTH_DIGEST'] = $authorizationHeader;
                }
            }
        }

        // PHP_AUTH_USER/PHP_AUTH_PW
        if (isset($headers['PHP_AUTH_USER'])) {
            $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.$headers['PHP_AUTH_PW']);
        } elseif (isset($headers['PHP_AUTH_DIGEST'])) {
            $headers['AUTHORIZATION'] = $headers['PHP_AUTH_DIGEST'];
        }

        return $headers;
    }
}
PK�`�\�͢|6pear/Symfony/Component/HttpFoundation/JsonResponse.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

/**
 * Response represents an HTTP response in JSON format.
 *
 * Note that this class does not force the returned JSON content to be an
 * object. It is however recommended that you do return an object as it
 * protects yourself against XSSI and JSON-JavaScript Hijacking.
 *
 * @see https://www.owasp.org/index.php/OWASP_AJAX_Security_Guidelines#Always_return_JSON_with_an_Object_on_the_outside
 *
 * @author Igor Wiedler <igor@wiedler.ch>
 */
class JsonResponse extends Response
{
    protected $data;
    protected $callback;

    /**
     * Constructor.
     *
     * @param mixed   $data    The response data
     * @param integer $status  The response status code
     * @param array   $headers An array of response headers
     */
    public function __construct($data = null, $status = 200, $headers = array())
    {
        parent::__construct('', $status, $headers);

        if (null === $data) {
            $data = new \ArrayObject();
        }
        $this->setData($data);
    }

    /**
     * {@inheritDoc}
     */
    public static function create($data = null, $status = 200, $headers = array())
    {
        return new static($data, $status, $headers);
    }

    /**
     * Sets the JSONP callback.
     *
     * @param string|null $callback The JSONP callback or null to use none
     *
     * @return JsonResponse
     *
     * @throws \InvalidArgumentException When the callback name is not valid
     */
    public function setCallback($callback = null)
    {
        if (null !== $callback) {
            // taken from http://www.geekality.net/2011/08/03/valid-javascript-identifier/
            $pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*+$/u';
            $parts = explode('.', $callback);
            foreach ($parts as $part) {
                if (!preg_match($pattern, $part)) {
                    throw new \InvalidArgumentException('The callback name is not valid.');
                }
            }
        }

        $this->callback = $callback;

        return $this->update();
    }

    /**
     * Sets the data to be sent as json.
     *
     * @param mixed $data
     *
     * @return JsonResponse
     *
     * @throws \InvalidArgumentException
     */
    public function setData($data = array())
    {
        // Encode <, >, ', &, and " for RFC4627-compliant JSON, which may also be embedded into HTML.
        $this->data = json_encode($data, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT);

        if (JSON_ERROR_NONE !== json_last_error()) {
            throw new \InvalidArgumentException($this->transformJsonError());
        }

        return $this->update();
    }

    /**
     * Updates the content and headers according to the json data and callback.
     *
     * @return JsonResponse
     */
    protected function update()
    {
        if (null !== $this->callback) {
            // Not using application/javascript for compatibility reasons with older browsers.
            $this->headers->set('Content-Type', 'text/javascript');

            return $this->setContent(sprintf('%s(%s);', $this->callback, $this->data));
        }

        // Only set the header when there is none or when it equals 'text/javascript' (from a previous update with callback)
        // in order to not overwrite a custom definition.
        if (!$this->headers->has('Content-Type') || 'text/javascript' === $this->headers->get('Content-Type')) {
            $this->headers->set('Content-Type', 'application/json');
        }

        return $this->setContent($this->data);
    }

    private function transformJsonError()
    {
        if (function_exists('json_last_error_msg')) {
            return json_last_error_msg();
        }

        switch (json_last_error()) {
            case JSON_ERROR_DEPTH:
                return 'Maximum stack depth exceeded.';

            case JSON_ERROR_STATE_MISMATCH:
                return 'Underflow or the modes mismatch.';

            case JSON_ERROR_CTRL_CHAR:
                return 'Unexpected control character found.';

            case JSON_ERROR_SYNTAX:
                return 'Syntax error, malformed JSON.';

            case JSON_ERROR_UTF8:
                return 'Malformed UTF-8 characters, possibly incorrectly encoded.';

            default:
                return 'Unknown error.';
        }
    }
}
PK�`�\?`
�y	y	Qpear/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

/**
 * SessionHandlerInterface
 *
 * Provides forward compatibility with PHP 5.4
 *
 * Extensive documentation can be found at php.net, see links:
 *
 * @see http://php.net/sessionhandlerinterface
 * @see http://php.net/session.customhandler
 * @see http://php.net/session-set-save-handler
 *
 * @author Drak <drak@zikula.org>
 */
interface SessionHandlerInterface
{
    /**
     * Open session.
     *
     * @see http://php.net/sessionhandlerinterface.open
     *
     * @param string $savePath    Save path.
     * @param string $sessionName Session Name.
     *
     * @throws \RuntimeException If something goes wrong starting the session.
     *
     * @return boolean
     */
    public function open($savePath, $sessionName);

    /**
     * Close session.
     *
     * @see http://php.net/sessionhandlerinterface.close
     *
     * @return boolean
     */
    public function close();

    /**
     * Read session.
     *
     * @param string $sessionId
     *
     * @see http://php.net/sessionhandlerinterface.read
     *
     * @throws \RuntimeException On fatal error but not "record not found".
     *
     * @return string String as stored in persistent storage or empty string in all other cases.
     */
    public function read($sessionId);

    /**
     * Commit session to storage.
     *
     * @see http://php.net/sessionhandlerinterface.write
     *
     * @param string $sessionId Session ID.
     * @param string $data      Session serialized data to save.
     *
     * @return boolean
     */
    public function write($sessionId, $data);

    /**
     * Destroys this session.
     *
     * @see http://php.net/sessionhandlerinterface.destroy
     *
     * @param string $sessionId Session ID.
     *
     * @throws \RuntimeException On fatal error.
     *
     * @return boolean
     */
    public function destroy($sessionId);

    /**
     * Garbage collection for storage.
     *
     * @see http://php.net/sessionhandlerinterface.gc
     *
     * @param integer $lifetime Max lifetime in seconds to keep sessions stored.
     *
     * @throws \RuntimeException On fatal error.
     *
     * @return boolean
     */
    public function gc($lifetime);
}
PK�`�\d�}޷%�%<pear/Symfony/Component/HttpFoundation/BinaryFileResponse.phpnu�[���<?php

/**
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation;

use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\Exception\FileException;

/**
 * BinaryFileResponse represents an HTTP response delivering a file.
 *
 * @author Niklas Fiekas <niklas.fiekas@tu-clausthal.de>
 * @author stealth35 <stealth35-php@live.fr>
 * @author Igor Wiedler <igor@wiedler.ch>
 * @author Jordan Alliot <jordan.alliot@gmail.com>
 * @author Sergey Linnik <linniksa@gmail.com>
 */
class BinaryFileResponse extends Response
{
    protected static $trustXSendfileTypeHeader = false;

    protected $file;
    protected $offset;
    protected $maxlen;

    /**
     * Constructor.
     *
     * @param \SplFileInfo|string $file               The file to stream
     * @param integer             $status             The response status code
     * @param array               $headers            An array of response headers
     * @param boolean             $public             Files are public by default
     * @param null|string         $contentDisposition The type of Content-Disposition to set automatically with the filename
     * @param boolean             $autoEtag           Whether the ETag header should be automatically set
     * @param boolean             $autoLastModified   Whether the Last-Modified header should be automatically set
     */
    public function __construct($file, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
    {
        parent::__construct(null, $status, $headers);

        $this->setFile($file, $contentDisposition, $autoEtag, $autoLastModified);

        if ($public) {
            $this->setPublic();
        }
    }

    /**
     * @param \SplFileInfo|string $file               The file to stream
     * @param integer             $status             The response status code
     * @param array               $headers            An array of response headers
     * @param boolean             $public             Files are public by default
     * @param null|string         $contentDisposition The type of Content-Disposition to set automatically with the filename
     * @param boolean             $autoEtag           Whether the ETag header should be automatically set
     * @param boolean             $autoLastModified   Whether the Last-Modified header should be automatically set
     */
    public static function create($file = null, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
    {
        return new static($file, $status, $headers, $public, $contentDisposition, $autoEtag, $autoLastModified);
    }

    /**
     * Sets the file to stream.
     *
     * @param \SplFileInfo|string $file The file to stream
     * @param string              $contentDisposition
     * @param Boolean             $autoEtag
     * @param Boolean             $autoLastModified
     *
     * @return BinaryFileResponse
     *
     * @throws FileException
     */
    public function setFile($file, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
    {
        $file = new File((string) $file);

        if (!$file->isReadable()) {
            throw new FileException('File must be readable.');
        }

        $this->file = $file;

        if ($autoEtag) {
            $this->setAutoEtag();
        }

        if ($autoLastModified) {
            $this->setAutoLastModified();
        }

        if ($contentDisposition) {
            $this->setContentDisposition($contentDisposition);
        }

        return $this;
    }

    /**
     * Gets the file.
     *
     * @return File The file to stream
     */
    public function getFile()
    {
        return $this->file;
    }

    /**
     * Automatically sets the Last-Modified header according the file modification date.
     */
    public function setAutoLastModified()
    {
        $this->setLastModified(\DateTime::createFromFormat('U', $this->file->getMTime()));

        return $this;
    }

    /**
     * Automatically sets the ETag header according to the checksum of the file.
     */
    public function setAutoEtag()
    {
        $this->setEtag(sha1_file($this->file->getPathname()));

        return $this;
    }

    /**
     * Sets the Content-Disposition header with the given filename.
     *
     * @param string $disposition      ResponseHeaderBag::DISPOSITION_INLINE or ResponseHeaderBag::DISPOSITION_ATTACHMENT
     * @param string $filename         Optionally use this filename instead of the real name of the file
     * @param string $filenameFallback A fallback filename, containing only ASCII characters. Defaults to an automatically encoded filename
     *
     * @return BinaryFileResponse
     */
    public function setContentDisposition($disposition, $filename = '', $filenameFallback = '')
    {
        if ($filename === '') {
            $filename = $this->file->getFilename();
        }

        $dispositionHeader = $this->headers->makeDisposition($disposition, $filename, $filenameFallback);
        $this->headers->set('Content-Disposition', $dispositionHeader);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function prepare(Request $request)
    {
        $this->headers->set('Content-Length', $this->file->getSize());
        $this->headers->set('Accept-Ranges', 'bytes');
        $this->headers->set('Content-Transfer-Encoding', 'binary');

        if (!$this->headers->has('Content-Type')) {
            $this->headers->set('Content-Type', $this->file->getMimeType() ?: 'application/octet-stream');
        }

        if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) {
            $this->setProtocolVersion('1.1');
        }

        $this->ensureIEOverSSLCompatibility($request);

        $this->offset = 0;
        $this->maxlen = -1;

        if (self::$trustXSendfileTypeHeader && $request->headers->has('X-Sendfile-Type')) {
            // Use X-Sendfile, do not send any content.
            $type = $request->headers->get('X-Sendfile-Type');
            $path = $this->file->getRealPath();
            if (strtolower($type) == 'x-accel-redirect') {
                // Do X-Accel-Mapping substitutions.
                foreach (explode(',', $request->headers->get('X-Accel-Mapping', '')) as $mapping) {
                    $mapping = explode('=', $mapping, 2);

                    if (2 == count($mapping)) {
                        $location = trim($mapping[0]);
                        $pathPrefix = trim($mapping[1]);

                        if (substr($path, 0, strlen($pathPrefix)) == $pathPrefix) {
                            $path = $location.substr($path, strlen($pathPrefix));
                            break;
                        }
                    }
                }
            }
            $this->headers->set($type, $path);
            $this->maxlen = 0;
        } elseif ($request->headers->has('Range')) {
            // Process the range headers.
            if (!$request->headers->has('If-Range') || $this->getEtag() == $request->headers->get('If-Range')) {
                $range = $request->headers->get('Range');
                $fileSize = $this->file->getSize();

                list($start, $end) = explode('-', substr($range, 6), 2) + array(0);

                $end = ('' === $end) ? $fileSize - 1 : (int) $end;

                if ('' === $start) {
                    $start = $fileSize - $end;
                    $end = $fileSize - 1;
                } else {
                    $start = (int) $start;
                }

                if ($start <= $end) {
                    if ($start < 0 || $end > $fileSize - 1) {
                        $this->setStatusCode(416);
                    } elseif ($start !== 0 || $end !== $fileSize - 1) {
                        $this->maxlen = $end < $fileSize ? $end - $start + 1 : -1;
                        $this->offset = $start;

                        $this->setStatusCode(206);
                        $this->headers->set('Content-Range', sprintf('bytes %s-%s/%s', $start, $end, $fileSize));
                        $this->headers->set('Content-Length', $end - $start + 1);
                    }
                }
            }
        }

        return $this;
    }

    /**
     * Sends the file.
     */
    public function sendContent()
    {
        if (!$this->isSuccessful()) {
            parent::sendContent();

            return;
        }

        if (0 === $this->maxlen) {
            return;
        }

        $out = fopen('php://output', 'wb');
        $file = fopen($this->file->getPathname(), 'rb');

        stream_copy_to_stream($file, $out, $this->maxlen, $this->offset);

        fclose($out);
        fclose($file);
    }

    /**
     * {@inheritdoc}
     *
     * @throws \LogicException when the content is not null
     */
    public function setContent($content)
    {
        if (null !== $content) {
            throw new \LogicException('The content cannot be set on a BinaryFileResponse instance.');
        }
    }

    /**
     * {@inheritdoc}
     *
     * @return false
     */
    public function getContent()
    {
        return false;
    }

    /**
     * Trust X-Sendfile-Type header.
     */
    public static function trustXSendfileTypeHeader()
    {
        self::$trustXSendfileTypeHeader = true;
    }
}
PK�`�\����bb8pear/Symfony/Component/CssSelector/Node/NegationNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Represents a "<selector>:not(<identifier>)" node.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class NegationNode extends AbstractNode
{
    /**
     * @var NodeInterface
     */
    private $selector;

    /**
     * @var NodeInterface
     */
    private $subSelector;

    /**
     * @param NodeInterface $selector
     * @param NodeInterface $subSelector
     */
    public function __construct(NodeInterface $selector, NodeInterface $subSelector)
    {
        $this->selector = $selector;
        $this->subSelector = $subSelector;
    }

    /**
     * @return NodeInterface
     */
    public function getSelector()
    {
        return $this->selector;
    }

    /**
     * @return NodeInterface
     */
    public function getSubSelector()
    {
        return $this->subSelector;
    }

    /**
     * {@inheritdoc}
     */
    public function getSpecificity()
    {
        return $this->selector->getSpecificity()->plus($this->subSelector->getSpecificity());
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        return sprintf('%s[%s:not(%s)]', $this->getNodeName(), $this->selector, $this->subSelector);
    }
}
PK�`�\�x�8pear/Symfony/Component/CssSelector/Node/FunctionNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

use Symfony\Component\CssSelector\Parser\Token;

/**
 * Represents a "<selector>:<name>(<arguments>)" node.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class FunctionNode extends AbstractNode
{
    /**
     * @var NodeInterface
     */
    private $selector;

    /**
     * @var string
     */
    private $name;

    /**
     * @var Token[]
     */
    private $arguments;

    /**
     * @param NodeInterface $selector
     * @param string        $name
     * @param Token[]       $arguments
     */
    public function __construct(NodeInterface $selector, $name, array $arguments = array())
    {
        $this->selector = $selector;
        $this->name = strtolower($name);
        $this->arguments = $arguments;
    }

    /**
     * @return NodeInterface
     */
    public function getSelector()
    {
        return $this->selector;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @return Token[]
     */
    public function getArguments()
    {
        return $this->arguments;
    }

    /**
     * {@inheritdoc}
     */
    public function getSpecificity()
    {
        return $this->selector->getSpecificity()->plus(new Specificity(0, 1, 0));
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        $arguments = implode(', ', array_map(function (Token $token) {
            return "'".$token->getValue()."'";
        }, $this->arguments));

        return sprintf('%s[%s:%s(%s)]', $this->getNodeName(), $this->selector, $this->name, $arguments ? '['.$arguments.']' : '');
    }
}
PK�`�\����8pear/Symfony/Component/CssSelector/Node/SelectorNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Represents a "<selector>(::|:)<pseudoElement>" node.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class SelectorNode extends AbstractNode
{
    /**
     * @var NodeInterface
     */
    private $tree;

    /**
     * @var null|string
     */
    private $pseudoElement;

    /**
     * @param NodeInterface $tree
     * @param null|string   $pseudoElement
     */
    public function __construct(NodeInterface $tree, $pseudoElement = null)
    {
        $this->tree = $tree;
        $this->pseudoElement = $pseudoElement ? strtolower($pseudoElement) : null;
    }

    /**
     * @return NodeInterface
     */
    public function getTree()
    {
        return $this->tree;
    }

    /**
     * @return null|string
     */
    public function getPseudoElement()
    {
        return $this->pseudoElement;
    }

    /**
     * {@inheritdoc}
     */
    public function getSpecificity()
    {
        return $this->tree->getSpecificity()->plus(new Specificity(0, 0, $this->pseudoElement ? 1 : 0));
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        return sprintf('%s[%s%s]', $this->getNodeName(), $this->tree, $this->pseudoElement ? '::'.$this->pseudoElement : '');
    }
}
PK�`�\F��K
K
9pear/Symfony/Component/CssSelector/Node/AttributeNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Represents a "<selector>[<namespace>|<attribute> <operator> <value>]" node.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class AttributeNode extends AbstractNode
{
    /**
     * @var NodeInterface
     */
    private $selector;

    /**
     * @var string
     */
    private $namespace;

    /**
     * @var string
     */
    private $attribute;

    /**
     * @var string
     */
    private $operator;

    /**
     * @var string
     */
    private $value;

    /**
     * @param NodeInterface $selector
     * @param string        $namespace
     * @param string        $attribute
     * @param string        $operator
     * @param string        $value
     */
    public function __construct(NodeInterface $selector, $namespace, $attribute, $operator, $value)
    {
        $this->selector = $selector;
        $this->namespace = $namespace;
        $this->attribute = $attribute;
        $this->operator = $operator;
        $this->value = $value;
    }

    /**
     * @return NodeInterface
     */
    public function getSelector()
    {
        return $this->selector;
    }

    /**
     * @return string
     */
    public function getNamespace()
    {
        return $this->namespace;
    }

    /**
     * @return string
     */
    public function getAttribute()
    {
        return $this->attribute;
    }

    /**
     * @return string
     */
    public function getOperator()
    {
        return $this->operator;
    }

    /**
     * @return string
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * {@inheritdoc}
     */
    public function getSpecificity()
    {
        return $this->selector->getSpecificity()->plus(new Specificity(0, 1, 0));
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        $attribute = $this->namespace ? $this->namespace.'|'.$this->attribute : $this->attribute;

        return 'exists' === $this->operator
            ? sprintf('%s[%s[%s]]', $this->getNodeName(), $this->selector, $attribute)
            : sprintf("%s[%s[%s %s '%s']]", $this->getNodeName(), $this->selector, $attribute, $this->operator, $this->value);
    }
}
PK�`�\�.��226pear/Symfony/Component/CssSelector/Node/PseudoNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Represents a "<selector>:<identifier>" node.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class PseudoNode extends AbstractNode
{
    /**
     * @var NodeInterface
     */
    private $selector;

    /**
     * @var string
     */
    private $identifier;

    /**
     * @param NodeInterface $selector
     * @param string        $identifier
     */
    public function __construct(NodeInterface $selector, $identifier)
    {
        $this->selector = $selector;
        $this->identifier = strtolower($identifier);
    }

    /**
     * @return NodeInterface
     */
    public function getSelector()
    {
        return $this->selector;
    }

    /**
     * @return string
     */
    public function getIdentifier()
    {
        return $this->identifier;
    }

    /**
     * {@inheritdoc}
     */
    public function getSpecificity()
    {
        return $this->selector->getSpecificity()->plus(new Specificity(0, 1, 0));
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        return sprintf('%s[%s:%s]', $this->getNodeName(), $this->selector, $this->identifier);
    }
}
PK�`�\�pM2��8pear/Symfony/Component/CssSelector/Node/AbstractNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Abstract base node class.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
abstract class AbstractNode implements NodeInterface
{
    /**
     * @var string
     */
    private $nodeName;

    /**
     * @return string
     */
    public function getNodeName()
    {
        if (null === $this->nodeName) {
            $this->nodeName = preg_replace('~.*\\\\([^\\\\]+)Node$~', '$1', get_called_class());
        }

        return $this->nodeName;
    }
}
PK�`�\,+?��@pear/Symfony/Component/CssSelector/Node/CombinedSelectorNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Represents a combined node.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class CombinedSelectorNode extends AbstractNode
{
    /**
     * @var NodeInterface
     */
    private $selector;

    /**
     * @var string
     */
    private $combinator;

    /**
     * @var NodeInterface
     */
    private $subSelector;

    /**
     * @param NodeInterface $selector
     * @param string        $combinator
     * @param NodeInterface $subSelector
     */
    public function __construct(NodeInterface $selector, $combinator, NodeInterface $subSelector)
    {
        $this->selector = $selector;
        $this->combinator = $combinator;
        $this->subSelector = $subSelector;
    }

    /**
     * @return NodeInterface
     */
    public function getSelector()
    {
        return $this->selector;
    }

    /**
     * @return string
     */
    public function getCombinator()
    {
        return $this->combinator;
    }

    /**
     * @return NodeInterface
     */
    public function getSubSelector()
    {
        return $this->subSelector;
    }

    /**
     * {@inheritdoc}
     */
    public function getSpecificity()
    {
        return $this->selector->getSpecificity()->plus($this->subSelector->getSpecificity());
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        $combinator = ' ' === $this->combinator ? '<followed>' : $this->combinator;

        return sprintf('%s[%s %s %s]', $this->getNodeName(), $this->selector, $combinator, $this->subSelector);
    }
}
PK�`�\	�i���5pear/Symfony/Component/CssSelector/Node/ClassNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Represents a "<selector>.<name>" node.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class ClassNode extends AbstractNode
{
    /**
     * @var NodeInterface
     */
    private $selector;

    /**
     * @var string
     */
    private $name;

    /**
     * @param NodeInterface $selector
     * @param string        $name
     */
    public function __construct(NodeInterface $selector, $name)
    {
        $this->selector = $selector;
        $this->name = $name;
    }

    /**
     * @return NodeInterface
     */
    public function getSelector()
    {
        return $this->selector;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * {@inheritdoc}
     */
    public function getSpecificity()
    {
        return $this->selector->getSpecificity()->plus(new Specificity(0, 1, 0));
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        return sprintf('%s[%s.%s]', $this->getNodeName(), $this->selector, $this->name);
    }
}
PK�`�\�x�7pear/Symfony/Component/CssSelector/Node/Specificity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Represents a node specificity.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @see http://www.w3.org/TR/selectors/#specificity
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class Specificity
{
    const A_FACTOR = 100;
    const B_FACTOR = 10;
    const C_FACTOR = 1;

    /**
     * @var int
     */
    private $a;

    /**
     * @var int
     */
    private $b;

    /**
     * @var int
     */
    private $c;

    /**
     * Constructor.
     *
     * @param int $a
     * @param int $b
     * @param int $c
     */
    public function __construct($a, $b, $c)
    {
        $this->a = $a;
        $this->b = $b;
        $this->c = $c;
    }

    /**
     * @param Specificity $specificity
     *
     * @return Specificity
     */
    public function plus(Specificity $specificity)
    {
        return new self($this->a + $specificity->a, $this->b + $specificity->b, $this->c + $specificity->c);
    }

    /**
     * Returns global specificity value.
     *
     * @return int
     */
    public function getValue()
    {
        return $this->a * self::A_FACTOR + $this->b * self::B_FACTOR + $this->c * self::C_FACTOR;
    }
}
PK�`�\�#^[��4pear/Symfony/Component/CssSelector/Node/HashNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Represents a "<selector>#<id>" node.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class HashNode extends AbstractNode
{
    /**
     * @var NodeInterface
     */
    private $selector;

    /**
     * @var string
     */
    private $id;

    /**
     * @param NodeInterface $selector
     * @param string        $id
     */
    public function __construct(NodeInterface $selector, $id)
    {
        $this->selector = $selector;
        $this->id = $id;
    }

    /**
     * @return NodeInterface
     */
    public function getSelector()
    {
        return $this->selector;
    }

    /**
     * @return string
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * {@inheritdoc}
     */
    public function getSpecificity()
    {
        return $this->selector->getSpecificity()->plus(new Specificity(1, 0, 0));
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        return sprintf('%s[%s#%s]', $this->getNodeName(), $this->selector, $this->id);
    }
}
PK�`�\�r�I��9pear/Symfony/Component/CssSelector/Node/NodeInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Interface for nodes.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
interface NodeInterface
{
    /**
     * Returns node's name.
     *
     * @return string
     */
    public function getNodeName();

    /**
     * Returns node's specificity.
     *
     * @return Specificity
     */
    public function getSpecificity();

    /**
     * Returns node's string representation.
     *
     * @return string
     */
    public function __toString();
}
PK�`�\�Г^FF7pear/Symfony/Component/CssSelector/Node/ElementNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Node;

/**
 * Represents a "<namespace>|<element>" node.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class ElementNode extends AbstractNode
{
    /**
     * @var string|null
     */
    private $namespace;

    /**
     * @var string|null
     */
    private $element;

    /**
     * @param string|null $namespace
     * @param string|null $element
     */
    public function __construct($namespace = null, $element = null)
    {
        $this->namespace = $namespace;
        $this->element = $element;
    }

    /**
     * @return null|string
     */
    public function getNamespace()
    {
        return $this->namespace;
    }

    /**
     * @return null|string
     */
    public function getElement()
    {
        return $this->element;
    }

    /**
     * {@inheritdoc}
     */
    public function getSpecificity()
    {
        return new Specificity(0, 0, $this->element ? 1 : 0);
    }

    /**
     * {@inheritdoc}
     */
    public function __toString()
    {
        $element = $this->element ?: '*';

        return sprintf('%s[%s]', $this->getNodeName(), $this->namespace ? $this->namespace.'|'.$element : $element);
    }
}
PK�`�\��u��Hpear/Symfony/Component/CssSelector/XPath/Extension/FunctionExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath\Extension;

use Symfony\Component\CssSelector\Exception\ExpressionErrorException;
use Symfony\Component\CssSelector\Exception\SyntaxErrorException;
use Symfony\Component\CssSelector\Node\FunctionNode;
use Symfony\Component\CssSelector\Parser\Parser;
use Symfony\Component\CssSelector\XPath\Translator;
use Symfony\Component\CssSelector\XPath\XPathExpr;

/**
 * XPath expression translator function extension.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class FunctionExtension extends AbstractExtension
{
    /**
     * {@inheritdoc}
     */
    public function getFunctionTranslators()
    {
        return array(
            'nth-child'        => array($this, 'translateNthChild'),
            'nth-last-child'   => array($this, 'translateNthLastChild'),
            'nth-of-type'      => array($this, 'translateNthOfType'),
            'nth-last-of-type' => array($this, 'translateNthLastOfType'),
            'contains'         => array($this, 'translateContains'),
            'lang'             => array($this, 'translateLang'),
        );
    }

    /**
     * @param XPathExpr    $xpath
     * @param FunctionNode $function
     * @param boolean      $last
     * @param boolean      $addNameTest
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function translateNthChild(XPathExpr $xpath, FunctionNode $function, $last = false, $addNameTest = true)
    {
        try {
            list($a, $b) = Parser::parseSeries($function->getArguments());
        } catch (SyntaxErrorException $e) {
            throw new ExpressionErrorException(sprintf('Invalid series: %s', implode(', ', $function->getArguments())), 0, $e);
        }

        $xpath->addStarPrefix();
        if ($addNameTest) {
            $xpath->addNameTest();
        }

        if (0 === $a) {
            return $xpath->addCondition('position() = '.($last ? 'last() - '.($b - 1) : $b));
        }

        if ($a < 0) {
            if ($b < 1) {
                return $xpath->addCondition('false()');
            }

            $sign = '<=';
        } else {
            $sign = '>=';
        }

        $expr = 'position()';

        if ($last) {
            $expr = 'last() - '.$expr;
            $b--;
        }

        if (0 !== $b) {
            $expr .= ' - '.$b;
        }

        $conditions = array(sprintf('%s %s 0', $expr, $sign));

        if (1 !== $a && -1 !== $a) {
            $conditions[] = sprintf('(%s) mod %d = 0', $expr, $a);
        }

        return $xpath->addCondition(implode(' and ', $conditions));

        // todo: handle an+b, odd, even
        // an+b means every-a, plus b, e.g., 2n+1 means odd
        // 0n+b means b
        // n+0 means a=1, i.e., all elements
        // an means every a elements, i.e., 2n means even
        // -n means -1n
        // -1n+6 means elements 6 and previous
    }

    /**
     * @param XPathExpr    $xpath
     * @param FunctionNode $function
     *
     * @return XPathExpr
     */
    public function translateNthLastChild(XPathExpr $xpath, FunctionNode $function)
    {
        return $this->translateNthChild($xpath, $function, true);
    }

    /**
     * @param XPathExpr    $xpath
     * @param FunctionNode $function
     *
     * @return XPathExpr
     */
    public function translateNthOfType(XPathExpr $xpath, FunctionNode $function)
    {
        return $this->translateNthChild($xpath, $function, false, false);
    }

    /**
     * @param XPathExpr    $xpath
     * @param FunctionNode $function
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function translateNthLastOfType(XPathExpr $xpath, FunctionNode $function)
    {
        if ('*' === $xpath->getElement()) {
            throw new ExpressionErrorException('"*:nth-of-type()" is not implemented.');
        }

        return $this->translateNthChild($xpath, $function, true, false);
    }

    /**
     * @param XPathExpr    $xpath
     * @param FunctionNode $function
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function translateContains(XPathExpr $xpath, FunctionNode $function)
    {
        $arguments = $function->getArguments();
        foreach ($arguments as $token) {
            if (!($token->isString() || $token->isIdentifier())) {
                throw new ExpressionErrorException(
                    'Expected a single string or identifier for :contains(), got '
                    .implode(', ', $arguments)
                );
            }
        }

        return $xpath->addCondition(sprintf(
            'contains(string(.), %s)',
            Translator::getXpathLiteral($arguments[0]->getValue())
        ));
    }

    /**
     * @param XPathExpr    $xpath
     * @param FunctionNode $function
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function translateLang(XPathExpr $xpath, FunctionNode $function)
    {
        $arguments = $function->getArguments();
        foreach ($arguments as $token) {
            if (!($token->isString() || $token->isIdentifier())) {
                throw new ExpressionErrorException(
                    'Expected a single string or identifier for :lang(), got '
                    .implode(', ', $arguments)
                );
            }
        }

        return $xpath->addCondition(sprintf(
            'lang(%s)',
            Translator::getXpathLiteral($arguments[0]->getValue())
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'function';
    }
}
PK�`�\�Ѽ`PPDpear/Symfony/Component/CssSelector/XPath/Extension/NodeExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath\Extension;

use Symfony\Component\CssSelector\Node;
use Symfony\Component\CssSelector\XPath\Translator;
use Symfony\Component\CssSelector\XPath\XPathExpr;

/**
 * XPath expression translator node extension.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class NodeExtension extends AbstractExtension
{
    const ELEMENT_NAME_IN_LOWER_CASE    = 1;
    const ATTRIBUTE_NAME_IN_LOWER_CASE  = 2;
    const ATTRIBUTE_VALUE_IN_LOWER_CASE = 4;

    /**
     * @var Translator
     */
    private $translator;

    /**
     * @var int
     */
    private $flags;

    /**
     * Constructor.
     *
     * @param Translator $translator
     * @param int        $flags
     */
    public function __construct(Translator $translator, $flags = 0)
    {
        $this->translator = $translator;
        $this->flags = $flags;
    }

    /**
     * @param int     $flag
     * @param boolean $on
     *
     * @return NodeExtension
     */
    public function setFlag($flag, $on)
    {
        if ($on && !$this->hasFlag($flag)) {
            $this->flags += $flag;
        }

        if (!$on && $this->hasFlag($flag)) {
            $this->flags -= $flag;
        }

        return $this;
    }

    /**
     * @param int $flag
     *
     * @return boolean
     */
    public function hasFlag($flag)
    {
        return $this->flags & $flag;
    }

    /**
     * {@inheritdoc}
     */
    public function getNodeTranslators()
    {
        return array(
            'Selector'         => array($this, 'translateSelector'),
            'CombinedSelector' => array($this, 'translateCombinedSelector'),
            'Negation'         => array($this, 'translateNegation'),
            'Function'         => array($this, 'translateFunction'),
            'Pseudo'           => array($this, 'translatePseudo'),
            'Attribute'        => array($this, 'translateAttribute'),
            'Class'            => array($this, 'translateClass'),
            'Hash'             => array($this, 'translateHash'),
            'Element'          => array($this, 'translateElement'),
        );
    }

    /**
     * @param Node\SelectorNode $node
     *
     * @return XPathExpr
     */
    public function translateSelector(Node\SelectorNode $node)
    {
        return $this->translator->nodeToXPath($node->getTree());
    }

    /**
     * @param Node\CombinedSelectorNode $node
     *
     * @return XPathExpr
     */
    public function translateCombinedSelector(Node\CombinedSelectorNode $node)
    {
        return $this->translator->addCombination($node->getCombinator(), $node->getSelector(), $node->getSubSelector());
    }

    /**
     * @param Node\NegationNode $node
     *
     * @return XPathExpr
     */
    public function translateNegation(Node\NegationNode $node)
    {
        $xpath = $this->translator->nodeToXPath($node->getSelector());
        $subXpath = $this->translator->nodeToXPath($node->getSubSelector());
        $subXpath->addNameTest();

        if ($subXpath->getCondition()) {
            return $xpath->addCondition(sprintf('not(%s)', $subXpath->getCondition()));
        }

        return $xpath->addCondition('0');
    }

    /**
     * @param Node\FunctionNode $node
     *
     * @return XPathExpr
     */
    public function translateFunction(Node\FunctionNode $node)
    {
        $xpath = $this->translator->nodeToXPath($node->getSelector());

        return $this->translator->addFunction($xpath, $node);
    }

    /**
     * @param Node\PseudoNode $node
     *
     * @return XPathExpr
     */
    public function translatePseudo(Node\PseudoNode $node)
    {
        $xpath = $this->translator->nodeToXPath($node->getSelector());

        return $this->translator->addPseudoClass($xpath, $node->getIdentifier());
    }

    /**
     * @param Node\AttributeNode $node
     *
     * @return XPathExpr
     */
    public function translateAttribute(Node\AttributeNode $node)
    {
        $name = $node->getAttribute();
        $safe = $this->isSafeName($name);

        if ($this->hasFlag(self::ATTRIBUTE_NAME_IN_LOWER_CASE)) {
            $name = strtolower($name);
        }

        if ($node->getNamespace()) {
            $name = sprintf('%s:%s', $node->getNamespace(), $name);
            $safe = $safe && $this->isSafeName($node->getNamespace());
        }

        $attribute = $safe ? '@'.$name : sprintf('attribute::*[name() = %s]', Translator::getXpathLiteral($name));
        $value = $node->getValue();
        $xpath = $this->translator->nodeToXPath($node->getSelector());

        if ($this->hasFlag(self::ATTRIBUTE_VALUE_IN_LOWER_CASE)) {
            $value = strtolower($value);
        }

        return $this->translator->addAttributeMatching($xpath, $node->getOperator(), $attribute, $value);
    }

    /**
     * @param Node\ClassNode $node
     *
     * @return XPathExpr
     */
    public function translateClass(Node\ClassNode $node)
    {
        $xpath = $this->translator->nodeToXPath($node->getSelector());

        return $this->translator->addAttributeMatching($xpath, '~=', '@class', $node->getName());
    }

    /**
     * @param Node\HashNode $node
     *
     * @return XPathExpr
     */
    public function translateHash(Node\HashNode $node)
    {
        $xpath = $this->translator->nodeToXPath($node->getSelector());

        return $this->translator->addAttributeMatching($xpath, '=', '@id', $node->getId());
    }

    /**
     * @param Node\ElementNode $node
     *
     * @return XPathExpr
     */
    public function translateElement(Node\ElementNode $node)
    {
        $element = $node->getElement();

        if ($this->hasFlag(self::ELEMENT_NAME_IN_LOWER_CASE)) {
            $element = strtolower($element);
        }

        if ($element) {
            $safe = $this->isSafeName($element);
        } else {
            $element = '*';
            $safe = true;
        }

        if ($node->getNamespace()) {
            $element = sprintf('%s:%s', $node->getNamespace(), $element);
            $safe = $safe && $this->isSafeName($node->getNamespace());
        }

        $xpath = new XPathExpr('', $element);

        if (!$safe) {
            $xpath->addNameTest();
        }

        return $xpath;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'node';
    }

    /**
     * Tests if given name is safe.
     *
     * @param string $name
     *
     * @return boolean
     */
    private function isSafeName($name)
    {
        return 0 < preg_match('~^[a-zA-Z_][a-zA-Z0-9_.-]*$~', $name);
    }
}
PK�`�\���||Ipear/Symfony/Component/CssSelector/XPath/Extension/ExtensionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath\Extension;

/**
 * XPath expression translator extension interface.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
interface ExtensionInterface
{
    /**
     * Returns node translators.
     *
     * @return callable[]
     */
    public function getNodeTranslators();

    /**
     * Returns combination translators.
     *
     * @return callable[]
     */
    public function getCombinationTranslators();

    /**
     * Returns function translators.
     *
     * @return callable[]
     */
    public function getFunctionTranslators();

    /**
     * Returns pseudo-class translators.
     *
     * @return callable[]
     */
    public function getPseudoClassTranslators();

    /**
     * Returns attribute operation translators.
     *
     * @return callable[]
     */
    public function getAttributeMatchingTranslators();

    /**
     * Returns extension name.
     *
     * @return string
     */
    public function getName();
}
PK�`�\��x=	=	Kpear/Symfony/Component/CssSelector/XPath/Extension/CombinationExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath\Extension;

use Symfony\Component\CssSelector\XPath\XPathExpr;

/**
 * XPath expression translator combination extension.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class CombinationExtension extends AbstractExtension
{
    /**
     * {@inheritdoc}
     */
    public function getCombinationTranslators()
    {
        return array(
            ' ' => array($this, 'translateDescendant'),
            '>' => array($this, 'translateChild'),
            '+' => array($this, 'translateDirectAdjacent'),
            '~' => array($this, 'translateIndirectAdjacent'),
        );
    }

    /**
     * @param XPathExpr $xpath
     * @param XPathExpr $combinedXpath
     *
     * @return XPathExpr
     */
    public function translateDescendant(XPathExpr $xpath, XPathExpr $combinedXpath)
    {
        return $xpath->join('/descendant-or-self::*/', $combinedXpath);
    }

    /**
     * @param XPathExpr $xpath
     * @param XPathExpr $combinedXpath
     *
     * @return XPathExpr
     */
    public function translateChild(XPathExpr $xpath, XPathExpr $combinedXpath)
    {
        return $xpath->join('/', $combinedXpath);
    }

    /**
     * @param XPathExpr $xpath
     * @param XPathExpr $combinedXpath
     *
     * @return XPathExpr
     */
    public function translateDirectAdjacent(XPathExpr $xpath, XPathExpr $combinedXpath)
    {
        return $xpath
            ->join('/following-sibling::', $combinedXpath)
            ->addNameTest()
            ->addCondition('position() = 1');
    }

    /**
     * @param XPathExpr $xpath
     * @param XPathExpr $combinedXpath
     *
     * @return XPathExpr
     */
    public function translateIndirectAdjacent(XPathExpr $xpath, XPathExpr $combinedXpath)
    {
        return $xpath->join('/following-sibling::', $combinedXpath);
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'combination';
    }
}
PK�`�\ ����Kpear/Symfony/Component/CssSelector/XPath/Extension/PseudoClassExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath\Extension;

use Symfony\Component\CssSelector\Exception\ExpressionErrorException;
use Symfony\Component\CssSelector\XPath\XPathExpr;

/**
 * XPath expression translator pseudo-class extension.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class PseudoClassExtension extends AbstractExtension
{
    /**
     * {@inheritdoc}
     */
    public function getPseudoClassTranslators()
    {
        return array(
            'root'          => array($this, 'translateRoot'),
            'first-child'   => array($this, 'translateFirstChild'),
            'last-child'    => array($this, 'translateLastChild'),
            'first-of-type' => array($this, 'translateFirstOfType'),
            'last-of-type'  => array($this, 'translateLastOfType'),
            'only-child'    => array($this, 'translateOnlyChild'),
            'only-of-type'  => array($this, 'translateOnlyOfType'),
            'empty'         => array($this, 'translateEmpty'),
        );
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateRoot(XPathExpr $xpath)
    {
        return $xpath->addCondition('not(parent::*)');
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateFirstChild(XPathExpr $xpath)
    {
        return $xpath
            ->addStarPrefix()
            ->addNameTest()
            ->addCondition('position() = 1');
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateLastChild(XPathExpr $xpath)
    {
        return $xpath
            ->addStarPrefix()
            ->addNameTest()
            ->addCondition('position() = last()');
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function translateFirstOfType(XPathExpr $xpath)
    {
        if ('*' === $xpath->getElement()) {
            throw new ExpressionErrorException('"*:first-of-type" is not implemented.');
        }

        return $xpath
            ->addStarPrefix()
            ->addCondition('position() = 1');
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function translateLastOfType(XPathExpr $xpath)
    {
        if ('*' === $xpath->getElement()) {
            throw new ExpressionErrorException('"*:last-of-type" is not implemented.');
        }

        return $xpath
            ->addStarPrefix()
            ->addCondition('position() = last()');
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateOnlyChild(XPathExpr $xpath)
    {
        return $xpath
            ->addStarPrefix()
            ->addNameTest()
            ->addCondition('last() = 1');
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function translateOnlyOfType(XPathExpr $xpath)
    {
        if ('*' === $xpath->getElement()) {
            throw new ExpressionErrorException('"*:only-of-type" is not implemented.');
        }

        return $xpath->addCondition('last() = 1');
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateEmpty(XPathExpr $xpath)
    {
        return $xpath->addCondition('not(*) and not(string-length())');
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'pseudo-class';
    }
}
PK�`�\c�-��Hpear/Symfony/Component/CssSelector/XPath/Extension/AbstractExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath\Extension;

/**
 * XPath expression translator abstract extension.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
abstract class AbstractExtension implements ExtensionInterface
{
    /**
     * {@inheritdoc}
     */
    public function getNodeTranslators()
    {
        return array();
    }

    /**
     * {@inheritdoc}
     */
    public function getCombinationTranslators()
    {
        return array();
    }

    /**
     * {@inheritdoc}
     */
    public function getFunctionTranslators()
    {
        return array();
    }

    /**
     * {@inheritdoc}
     */
    public function getPseudoClassTranslators()
    {
        return array();
    }

    /**
     * {@inheritdoc}
     */
    public function getAttributeMatchingTranslators()
    {
        return array();
    }
}
PK�`�\$p��BBDpear/Symfony/Component/CssSelector/XPath/Extension/HtmlExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath\Extension;

use Symfony\Component\CssSelector\Exception\ExpressionErrorException;
use Symfony\Component\CssSelector\Node\FunctionNode;
use Symfony\Component\CssSelector\XPath\Translator;
use Symfony\Component\CssSelector\XPath\XPathExpr;

/**
 * XPath expression translator HTML extension.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class HtmlExtension extends AbstractExtension
{
    /**
     * Constructor.
     *
     * @param Translator $translator
     */
    public function __construct(Translator $translator)
    {
        $translator
            ->getExtension('node')
            ->setFlag(NodeExtension::ELEMENT_NAME_IN_LOWER_CASE, true)
            ->setFlag(NodeExtension::ATTRIBUTE_NAME_IN_LOWER_CASE, true);
    }

    /**
     * {@inheritdoc}
     */
    public function getPseudoClassTranslators()
    {
        return array(
            'checked'  => array($this, 'translateChecked'),
            'link'     => array($this, 'translateLink'),
            'disabled' => array($this, 'translateDisabled'),
            'enabled'  => array($this, 'translateEnabled'),
            'selected' => array($this, 'translateSelected'),
            'invalid'  => array($this, 'translateInvalid'),
            'hover'    => array($this, 'translateHover'),
            'visited'  => array($this, 'translateVisited'),
        );
    }

    /**
     * {@inheritdoc}
     */
    public function getFunctionTranslators()
    {
        return array(
            'lang' => array($this, 'translateLang'),
        );
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateChecked(XPathExpr $xpath)
    {
        return $xpath->addCondition(
            '(@checked '
            ."and (name(.) = 'input' or name(.) = 'command')"
            ."and (@type = 'checkbox' or @type = 'radio'))"
        );
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateLink(XPathExpr $xpath)
    {
        return $xpath->addCondition("@href and (name(.) = 'a' or name(.) = 'link' or name(.) = 'area')");
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateDisabled(XPathExpr $xpath)
    {
        return $xpath->addCondition(
            "("
                ."@disabled and"
                ."("
                    ."(name(.) = 'input' and @type != 'hidden')"
                    ." or name(.) = 'button'"
                    ." or name(.) = 'select'"
                    ." or name(.) = 'textarea'"
                    ." or name(.) = 'command'"
                    ." or name(.) = 'fieldset'"
                    ." or name(.) = 'optgroup'"
                    ." or name(.) = 'option'"
                .")"
            .") or ("
                ."(name(.) = 'input' and @type != 'hidden')"
                ." or name(.) = 'button'"
                ." or name(.) = 'select'"
                ." or name(.) = 'textarea'"
            .")"
            ." and ancestor::fieldset[@disabled]"
        );
        // todo: in the second half, add "and is not a descendant of that fieldset element's first legend element child, if any."
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateEnabled(XPathExpr $xpath)
    {
        return $xpath->addCondition(
            '('
                .'@href and ('
                    ."name(.) = 'a'"
                    ." or name(.) = 'link'"
                    ." or name(.) = 'area'"
                .')'
            .') or ('
                .'('
                    ."name(.) = 'command'"
                    ." or name(.) = 'fieldset'"
                    ." or name(.) = 'optgroup'"
                .')'
                .' and not(@disabled)'
            .') or ('
                .'('
                    ."(name(.) = 'input' and @type != 'hidden')"
                    ." or name(.) = 'button'"
                    ." or name(.) = 'select'"
                    ." or name(.) = 'textarea'"
                    ." or name(.) = 'keygen'"
                .')'
                ." and not (@disabled or ancestor::fieldset[@disabled])"
            .') or ('
                ."name(.) = 'option' and not("
                    ."@disabled or ancestor::optgroup[@disabled]"
                .')'
            .')'
        );
    }

    /**
     * @param XPathExpr    $xpath
     * @param FunctionNode $function
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function translateLang(XPathExpr $xpath, FunctionNode $function)
    {
        $arguments = $function->getArguments();
        foreach ($arguments as $token) {
            if (!($token->isString() || $token->isIdentifier())) {
                throw new ExpressionErrorException(
                    'Expected a single string or identifier for :lang(), got '
                    .implode(', ', $arguments)
                );
            }
        }

        return $xpath->addCondition(sprintf(
            'ancestor-or-self::*[@lang][1][starts-with(concat('
            ."translate(@%s, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '-')"
            .', %s)]',
            'lang',
            Translator::getXpathLiteral(strtolower($arguments[0]->getValue()).'-')
        ));
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateSelected(XPathExpr $xpath)
    {
        return $xpath->addCondition("(@selected and name(.) = 'option')");
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateInvalid(XPathExpr $xpath)
    {
        return $xpath->addCondition('0');
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateHover(XPathExpr $xpath)
    {
        return $xpath->addCondition('0');
    }

    /**
     * @param XPathExpr $xpath
     *
     * @return XPathExpr
     */
    public function translateVisited(XPathExpr $xpath)
    {
        return $xpath->addCondition('0');
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'html';
    }
}
PK�`�\�܍��Qpear/Symfony/Component/CssSelector/XPath/Extension/AttributeMatchingExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath\Extension;

use Symfony\Component\CssSelector\XPath\Translator;
use Symfony\Component\CssSelector\XPath\XPathExpr;

/**
 * XPath expression translator attribute extension.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class AttributeMatchingExtension extends AbstractExtension
{
    /**
     * {@inheritdoc}
     */
    public function getAttributeMatchingTranslators()
    {
        return array(
            'exists' => array($this, 'translateExists'),
            '='      => array($this, 'translateEquals'),
            '~='     => array($this, 'translateIncludes'),
            '|='     => array($this, 'translateDashMatch'),
            '^='     => array($this, 'translatePrefixMatch'),
            '$='     => array($this, 'translateSuffixMatch'),
            '*='     => array($this, 'translateSubstringMatch'),
            '!='     => array($this, 'translateDifferent'),
        );
    }

    /**
     * @param XPathExpr $xpath
     * @param string    $attribute
     * @param string    $value
     *
     * @return XPathExpr
     */
    public function translateExists(XPathExpr $xpath, $attribute, $value)
    {
        return $xpath->addCondition($attribute);
    }

    /**
     * @param XPathExpr $xpath
     * @param string    $attribute
     * @param string    $value
     *
     * @return XPathExpr
     */
    public function translateEquals(XPathExpr $xpath, $attribute, $value)
    {
        return $xpath->addCondition(sprintf('%s = %s', $attribute, Translator::getXpathLiteral($value)));
    }

    /**
     * @param XPathExpr $xpath
     * @param string    $attribute
     * @param string    $value
     *
     * @return XPathExpr
     */
    public function translateIncludes(XPathExpr $xpath, $attribute, $value)
    {
        return $xpath->addCondition($value ? sprintf(
            '%1$s and contains(concat(\' \', normalize-space(%1$s), \' \'), %2$s)',
            $attribute,
            Translator::getXpathLiteral(' '.$value.' ')
        ) : '0');
    }

    /**
     * @param XPathExpr $xpath
     * @param string    $attribute
     * @param string    $value
     *
     * @return XPathExpr
     */
    public function translateDashMatch(XPathExpr $xpath, $attribute, $value)
    {
        return $xpath->addCondition(sprintf(
            '%1$s and (%1$s = %2$s or starts-with(%1$s, %3$s))',
            $attribute,
            Translator::getXpathLiteral($value),
            Translator::getXpathLiteral($value.'-')
        ));
    }

    /**
     * @param XPathExpr $xpath
     * @param string    $attribute
     * @param string    $value
     *
     * @return XPathExpr
     */
    public function translatePrefixMatch(XPathExpr $xpath, $attribute, $value)
    {
        return $xpath->addCondition($value ? sprintf(
            '%1$s and starts-with(%1$s, %2$s)',
            $attribute,
            Translator::getXpathLiteral($value)
        ) : '0');
    }

    /**
     * @param XPathExpr $xpath
     * @param string    $attribute
     * @param string    $value
     *
     * @return XPathExpr
     */
    public function translateSuffixMatch(XPathExpr $xpath, $attribute, $value)
    {
        return $xpath->addCondition($value ? sprintf(
            '%1$s and substring(%1$s, string-length(%1$s)-%2$s) = %3$s',
            $attribute,
            strlen($value) - 1,
            Translator::getXpathLiteral($value)
        ) : '0');
    }

    /**
     * @param XPathExpr $xpath
     * @param string    $attribute
     * @param string    $value
     *
     * @return XPathExpr
     */
    public function translateSubstringMatch(XPathExpr $xpath, $attribute, $value)
    {
        return $xpath->addCondition($value ? sprintf(
            '%1$s and contains(%1$s, %2$s)',
            $attribute,
            Translator::getXpathLiteral($value)
        ) : '0');
    }

    /**
     * @param XPathExpr $xpath
     * @param string    $attribute
     * @param string    $value
     *
     * @return XPathExpr
     */
    public function translateDifferent(XPathExpr $xpath, $attribute, $value)
    {
        return $xpath->addCondition(sprintf(
            $value ? 'not(%1$s) or %1$s != %2$s' : '%s != %s',
            $attribute,
            Translator::getXpathLiteral($value)
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'attribute-matching';
    }
}
PK�`�\�����!�!7pear/Symfony/Component/CssSelector/XPath/Translator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath;

use Symfony\Component\CssSelector\Exception\ExpressionErrorException;
use Symfony\Component\CssSelector\Node\FunctionNode;
use Symfony\Component\CssSelector\Node\NodeInterface;
use Symfony\Component\CssSelector\Node\SelectorNode;
use Symfony\Component\CssSelector\Parser\Parser;
use Symfony\Component\CssSelector\Parser\ParserInterface;

/**
 * XPath expression translator interface.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class Translator implements TranslatorInterface
{
    /**
     * @var ParserInterface
     */
    private $mainParser;

    /**
     * @var ParserInterface[]
     */
    private $shortcutParsers = array();

    /**
     * @var Extension\ExtensionInterface
     */
    private $extensions = array();

    /**
     * @var array
     */
    private $nodeTranslators = array();

    /**
     * @var array
     */
    private $combinationTranslators = array();

    /**
     * @var array
     */
    private $functionTranslators = array();

    /**
     * @var array
     */
    private $pseudoClassTranslators = array();

    /**
     * @var array
     */
    private $attributeMatchingTranslators = array();

    /**
     * Constructor.
     */
    public function __construct(ParserInterface $parser = null)
    {
        $this->mainParser = $parser ?: new Parser();

        $this
            ->registerExtension(new Extension\NodeExtension($this))
            ->registerExtension(new Extension\CombinationExtension())
            ->registerExtension(new Extension\FunctionExtension())
            ->registerExtension(new Extension\PseudoClassExtension())
            ->registerExtension(new Extension\AttributeMatchingExtension())
        ;
    }

    /**
     * @param string $element
     *
     * @return string
     */
    public static function getXpathLiteral($element)
    {
        if (false === strpos($element, "'")) {
            return "'".$element."'";
        }

        if (false === strpos($element, '"')) {
            return '"'.$element.'"';
        }

        $string = $element;
        $parts = array();
        while (true) {
            if (false !== $pos = strpos($string, "'")) {
                $parts[] = sprintf("'%s'", substr($string, 0, $pos));
                $parts[] = "\"'\"";
                $string = substr($string, $pos + 1);
            } else {
                $parts[] = "'$string'";
                break;
            }
        }

        return sprintf('concat(%s)', implode($parts, ', '));
    }

    /**
     * {@inheritdoc}
     */
    public function cssToXPath($cssExpr, $prefix = 'descendant-or-self::')
    {
        $selectors = $this->parseSelectors($cssExpr);

        /** @var SelectorNode $selector */
        foreach ($selectors as $selector) {
            if (null !== $selector->getPseudoElement()) {
                throw new ExpressionErrorException('Pseudo-elements are not supported.');
            }
        }

        $translator = $this;

        return implode(' | ', array_map(function (SelectorNode $selector) use ($translator, $prefix) {
            return $translator->selectorToXPath($selector, $prefix);
        }, $selectors));
    }

    /**
     * {@inheritdoc}
     */
    public function selectorToXPath(SelectorNode $selector, $prefix = 'descendant-or-self::')
    {
        return ($prefix ?: '').$this->nodeToXPath($selector);
    }

    /**
     * Registers an extension.
     *
     * @param Extension\ExtensionInterface $extension
     *
     * @return Translator
     */
    public function registerExtension(Extension\ExtensionInterface $extension)
    {
        $this->extensions[$extension->getName()] = $extension;

        $this->nodeTranslators = array_merge($this->nodeTranslators, $extension->getNodeTranslators());
        $this->combinationTranslators = array_merge($this->combinationTranslators, $extension->getCombinationTranslators());
        $this->functionTranslators = array_merge($this->functionTranslators, $extension->getFunctionTranslators());
        $this->pseudoClassTranslators = array_merge($this->pseudoClassTranslators, $extension->getPseudoClassTranslators());
        $this->attributeMatchingTranslators = array_merge($this->attributeMatchingTranslators, $extension->getAttributeMatchingTranslators());

        return $this;
    }

    /**
     * @param string $name
     *
     * @return Extension\ExtensionInterface
     *
     * @throws ExpressionErrorException
     */
    public function getExtension($name)
    {
        if (!isset($this->extensions[$name])) {
            throw new ExpressionErrorException(sprintf('Extension "%s" not registered.', $name));
        }

        return $this->extensions[$name];
    }

    /**
     * Registers a shortcut parser.
     *
     * @param ParserInterface $shortcut
     *
     * @return Translator
     */
    public function registerParserShortcut(ParserInterface $shortcut)
    {
        $this->shortcutParsers[] = $shortcut;

        return $this;
    }

    /**
     * @param NodeInterface $node
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function nodeToXPath(NodeInterface $node)
    {
        if (!isset($this->nodeTranslators[$node->getNodeName()])) {
            throw new ExpressionErrorException(sprintf('Node "%s" not supported.', $node->getNodeName()));
        }

        return call_user_func($this->nodeTranslators[$node->getNodeName()], $node);
    }

    /**
     * @param string        $combiner
     * @param NodeInterface $xpath
     * @param NodeInterface $combinedXpath
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function addCombination($combiner, NodeInterface $xpath, NodeInterface $combinedXpath)
    {
        if (!isset($this->combinationTranslators[$combiner])) {
            throw new ExpressionErrorException(sprintf('Combiner "%s" not supported.', $combiner));
        }

        return call_user_func($this->combinationTranslators[$combiner], $this->nodeToXPath($xpath), $this->nodeToXPath($combinedXpath));
    }

    /**
     * @param XPathExpr $xpath
     * @param FunctionNode $function
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function addFunction(XPathExpr $xpath, FunctionNode $function)
    {
        if (!isset($this->functionTranslators[$function->getName()])) {
            throw new ExpressionErrorException(sprintf('Function "%s" not supported.', $function->getName()));
        }

        return call_user_func($this->functionTranslators[$function->getName()], $xpath, $function);
    }

    /**
     * @param XPathExpr $xpath
     * @param string    $pseudoClass
     *
     * @return XPathExpr
     *
     * @throws ExpressionErrorException
     */
    public function addPseudoClass(XPathExpr $xpath, $pseudoClass)
    {
        if (!isset($this->pseudoClassTranslators[$pseudoClass])) {
            throw new ExpressionErrorException(sprintf('Pseudo-class "%s" not supported.', $pseudoClass));
        }

        return call_user_func($this->pseudoClassTranslators[$pseudoClass], $xpath);
    }

    /**
     * @param XPathExpr $xpath
     * @param string    $operator
     * @param string    $attribute
     * @param string    $value
     *
     * @throws ExpressionErrorException
     *
     * @return XPathExpr
     */
    public function addAttributeMatching(XPathExpr $xpath, $operator, $attribute, $value)
    {
        if (!isset($this->attributeMatchingTranslators[$operator])) {
            throw new ExpressionErrorException(sprintf('Attribute matcher operator "%s" not supported.', $operator));
        }

        return call_user_func($this->attributeMatchingTranslators[$operator], $xpath, $attribute, $value);
    }

    /**
     * @param string $css
     *
     * @return SelectorNode[]
     */
    private function parseSelectors($css)
    {
        foreach ($this->shortcutParsers as $shortcut) {
            $tokens = $shortcut->parse($css);

            if (!empty($tokens)) {
                return $tokens;
            }
        }

        return $this->mainParser->parse($css);
    }
}
PK�`�\��r776pear/Symfony/Component/CssSelector/XPath/XPathExpr.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath;

/**
 * XPath expression translator interface.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class XPathExpr
{
    /**
     * @var string
     */
    private $path;

    /**
     * @var string
     */
    private $element;

    /**
     * @var string
     */
    private $condition;

    /**
     * @param string  $path
     * @param string  $element
     * @param string  $condition
     * @param boolean $starPrefix
     */
    public function __construct($path = '', $element = '*', $condition = '', $starPrefix = false)
    {
        $this->path = $path;
        $this->element = $element;
        $this->condition = $condition;

        if ($starPrefix) {
            $this->addStarPrefix();
        }
    }

    /**
     * @return string
     */
    public function getElement()
    {
        return $this->element;
    }

    /**
     * @param $condition
     *
     * @return XPathExpr
     */
    public function addCondition($condition)
    {
        $this->condition = $this->condition ? sprintf('%s and (%s)', $this->condition, $condition) : $condition;

        return $this;
    }

    /**
     * @return string
     */
    public function getCondition()
    {
        return $this->condition;
    }

    /**
     * @return XPathExpr
     */
    public function addNameTest()
    {
        if ('*' !== $this->element) {
            $this->addCondition('name() = '.Translator::getXpathLiteral($this->element));
            $this->element = '*';
        }

        return $this;
    }

    /**
     * @return XPathExpr
     */
    public function addStarPrefix()
    {
        $this->path .= '*/';

        return $this;
    }

    /**
     * Joins another XPathExpr with a combiner.
     *
     * @param string    $combiner
     * @param XPathExpr $expr
     *
     * @return XPathExpr
     */
    public function join($combiner, XPathExpr $expr)
    {
        $path = $this->__toString().$combiner;

        if ('*/' !== $expr->path) {
            $path .= $expr->path;
        }

        $this->path = $path;
        $this->element = $expr->element;
        $this->condition = $expr->condition;

        return $this;
    }

    /**
     * @return string
     */
    public function __toString()
    {
        $path = $this->path.$this->element;
        $condition = null === $this->condition || '' === $this->condition ? '' : '['.$this->condition.']';

        return $path.$condition;
    }
}
PK�`�\
���@pear/Symfony/Component/CssSelector/XPath/TranslatorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\XPath;

use Symfony\Component\CssSelector\Node\SelectorNode;

/**
 * XPath expression translator interface.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
interface TranslatorInterface
{
    /**
     * Translates a CSS selector to an XPath expression.
     *
     * @param string $cssExpr
     * @param string $prefix
     *
     * @return XPathExpr
     */
    public function cssToXPath($cssExpr, $prefix = 'descendant-or-self::');

    /**
     * Translates a parsed selector node to an XPath expression
     *
     * @param SelectorNode $selector
     * @param string       $prefix
     *
     * @return XPathExpr
     */
    public function selectorToXPath(SelectorNode $selector, $prefix = 'descendant-or-self::');
}
PK�`�\u�UU1pear/Symfony/Component/CssSelector/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\CssSelector\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�`�\^�}		2pear/Symfony/Component/CssSelector/CssSelector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector;

use Symfony\Component\CssSelector\Parser\Shortcut\ClassParser;
use Symfony\Component\CssSelector\Parser\Shortcut\ElementParser;
use Symfony\Component\CssSelector\Parser\Shortcut\EmptyStringParser;
use Symfony\Component\CssSelector\Parser\Shortcut\HashParser;
use Symfony\Component\CssSelector\XPath\Extension\HtmlExtension;
use Symfony\Component\CssSelector\XPath\Translator;

/**
 * CssSelector is the main entry point of the component and can convert CSS
 * selectors to XPath expressions.
 *
 * $xpath = CssSelector::toXpath('h1.foo');
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class CssSelector
{
    private static $html = true;

    /**
     * Translates a CSS expression to its XPath equivalent.
     * Optionally, a prefix can be added to the resulting XPath
     * expression with the $prefix parameter.
     *
     * @param mixed   $cssExpr The CSS expression.
     * @param string  $prefix  An optional prefix for the XPath expression.
     *
     * @return string
     *
     * @api
     */
    public static function toXPath($cssExpr, $prefix = 'descendant-or-self::')
    {
        $translator = new Translator();

        if (self::$html) {
            $translator->registerExtension(new HtmlExtension($translator));
        }

        $translator
            ->registerParserShortcut(new EmptyStringParser())
            ->registerParserShortcut(new ElementParser())
            ->registerParserShortcut(new ClassParser())
            ->registerParserShortcut(new HashParser())
        ;

        return $translator->cssToXPath($cssExpr, $prefix);
    }

    /**
     * Enables the HTML extension.
     */
    public static function enableHtmlExtension()
    {
        self::$html = true;
    }

    /**
     * Disables the HTML extension.
     */
    public static function disableHtmlExtension()
    {
        self::$html = false;
    }
}
PK�`�\m��c��Gpear/Symfony/Component/CssSelector/Exception/InternalErrorException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Exception;

/**
 * ParseException is thrown when a CSS selector syntax is not valid.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class InternalErrorException extends ParseException implements ExceptionInterface
{
}
PK�`�\'[|ɀ�?pear/Symfony/Component/CssSelector/Exception/ParseException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Exception;

/**
 * ParseException is thrown when a CSS selector syntax is not valid.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ParseException extends \Exception implements ExceptionInterface
{
}
PK�`�\/pT�Ipear/Symfony/Component/CssSelector/Exception/ExpressionErrorException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Exception;

/**
 * ParseException is thrown when a CSS selector syntax is not valid.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class ExpressionErrorException extends ParseException implements ExceptionInterface
{
}
PK�`�\gf�GBBCpear/Symfony/Component/CssSelector/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Exception;

/**
 * Interface for exceptions.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
interface ExceptionInterface
{
}
PK�`�\��מ�Epear/Symfony/Component/CssSelector/Exception/SyntaxErrorException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Exception;

use Symfony\Component\CssSelector\Parser\Token;

/**
 * ParseException is thrown when a CSS selector syntax is not valid.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class SyntaxErrorException extends ParseException implements ExceptionInterface
{
    /**
     * @param string $expectedValue
     * @param Token  $foundToken
     *
     * @return SyntaxErrorException
     */
    public static function unexpectedToken($expectedValue, Token $foundToken)
    {
        return new self(sprintf('Expected %s, but %s found.', $expectedValue, $foundToken));
    }

    /**
     * @param string $pseudoElement
     * @param string $unexpectedLocation
     *
     * @return SyntaxErrorException
     */
    public static function pseudoElementFound($pseudoElement, $unexpectedLocation)
    {
        return new self(sprintf('Unexpected pseudo-element "::%s" found %s.', $pseudoElement, $unexpectedLocation));
    }

    /**
     * @param int $position
     *
     * @return SyntaxErrorException
     */
    public static function unclosedString($position)
    {
        return new self(sprintf('Unclosed/invalid string at %s.', $position));
    }

    /**
     * @return SyntaxErrorException
     */
    public static function nestedNot()
    {
        return new self('Got nested ::not().');
    }

    /**
     * @return SyntaxErrorException
     */
    public static function stringAsFunctionArgument()
    {
        return new self('String not allowed as function argument.');
    }
}
PK�`�\;���		4pear/Symfony/Component/CssSelector/Parser/Reader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser;

/**
 * CSS selector reader.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class Reader
{
    /**
     * @var string
     */
    private $source;

    /**
     * @var int
     */
    private $length;

    /**
     * @var int
     */
    private $position = 0;

    /**
     * @param string $source
     */
    public function __construct($source)
    {
        $this->source = $source;
        $this->length = strlen($source);
    }

    /**
     * @return bool
     */
    public function isEOF()
    {
        return $this->position >= $this->length;
    }

    /**
     * @return int
     */
    public function getPosition()
    {
        return $this->position;
    }

    /**
     * @return int
     */
    public function getRemainingLength()
    {
        return $this->length - $this->position;
    }

    /**
     * @param int $length
     * @param int $offset
     *
     * @return string
     */
    public function getSubstring($length, $offset = 0)
    {
        return substr($this->source, $this->position + $offset, $length);
    }

    /**
     * @param string $string
     *
     * @return int
     */
    public function getOffset($string)
    {
        $position = strpos($this->source, $string, $this->position);

        return false === $position ? false : $position - $this->position;
    }

    /**
     * @param string $pattern
     *
     * @return bool
     */
    public function findPattern($pattern)
    {
        $source = substr($this->source, $this->position);

        if (preg_match($pattern, $source, $matches)) {
            return $matches;
        }

        return false;
    }

    /**
     * @param int $length
     */
    public function moveForward($length)
    {
        $this->position += $length;
    }

    /**
     */
    public function moveToEnd()
    {
        $this->position = $this->length;
    }
}
PK�`�\�AEo11=pear/Symfony/Component/CssSelector/Parser/ParserInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser;

use Symfony\Component\CssSelector\Node\SelectorNode;

/**
 * CSS selector parser interface.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
interface ParserInterface
{
    /**
     * Parses given selector source into an array of tokens.
     *
     * @param string $source
     *
     * @return SelectorNode[]
     */
    public function parse($source);
}
PK�`�\���QQ9pear/Symfony/Component/CssSelector/Parser/TokenStream.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser;

use Symfony\Component\CssSelector\Exception\InternalErrorException;
use Symfony\Component\CssSelector\Exception\SyntaxErrorException;

/**
 * CSS selector token stream.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class TokenStream
{
    /**
     * @var Token[]
     */
    private $tokens = array();

    /**
     * @var boolean
     */
    private $frozen = false;

    /**
     * @var Token[]
     */
    private $used = array();

    /**
     * @var int
     */
    private $cursor = 0;

    /**
     * @var Token|null
     */
    private $peeked = null;

    /**
     * @var boolean
     */
    private $peeking = false;

    /**
     * Pushes a token.
     *
     * @param Token $token
     *
     * @return TokenStream
     */
    public function push(Token $token)
    {
        $this->tokens[] = $token;

        return $this;
    }

    /**
     * Freezes stream.
     *
     * @return TokenStream
     */
    public function freeze()
    {
        $this->frozen = true;

        return $this;
    }

    /**
     * Returns next token.
     *
     * @throws InternalErrorException If there is no more token
     *
     * @return Token
     */
    public function getNext()
    {
        if ($this->peeking) {
            $this->peeking = false;
            $this->used[] = $this->peeked;

            return $this->peeked;
        }

        if (!isset($this->tokens[$this->cursor])) {
            throw new InternalErrorException('Unexpected token stream end.');
        }

        return $this->tokens[$this->cursor ++];
    }

    /**
     * Returns peeked token.
     *
     * @return Token
     */
    public function getPeek()
    {
        if (!$this->peeking) {
            $this->peeked = $this->getNext();
            $this->peeking = true;
        }

        return $this->peeked;
    }

    /**
     * Returns used tokens.
     *
     * @return Token[]
     */
    public function getUsed()
    {
        return $this->used;
    }

    /**
     * Returns nex identifier token.
     *
     * @throws SyntaxErrorException If next token is not an identifier
     *
     * @return string The identifier token value
     */
    public function getNextIdentifier()
    {
        $next = $this->getNext();

        if (!$next->isIdentifier()) {
            throw SyntaxErrorException::unexpectedToken('identifier', $next);
        }

        return $next->getValue();
    }

    /**
     * Returns nex identifier or star delimiter token.
     *
     * @throws SyntaxErrorException If next token is not an identifier or a star delimiter
     *
     * @return null|string The identifier token value or null if star found
     */
    public function getNextIdentifierOrStar()
    {
        $next = $this->getNext();

        if ($next->isIdentifier()) {
            return $next->getValue();
        }

        if ($next->isDelimiter(array('*'))) {
            return null;
        }

        throw SyntaxErrorException::unexpectedToken('identifier or "*"', $next);
    }

    /**
     * Skips next whitespace if any.
     */
    public function skipWhitespace()
    {
        $peek = $this->getPeek();

        if ($peek->isWhitespace()) {
            $this->getNext();
        }
    }
}
PK�`�\6N�D1D14pear/Symfony/Component/CssSelector/Parser/Parser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser;

use Symfony\Component\CssSelector\Exception\SyntaxErrorException;
use Symfony\Component\CssSelector\Node;
use Symfony\Component\CssSelector\Parser\Tokenizer\Tokenizer;

/**
 * CSS selector parser.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class Parser implements ParserInterface
{
    /**
     * @var Tokenizer
     */
    private $tokenizer;

    /**
     * Constructor.
     *
     * @param null|Tokenizer $tokenizer
     */
    public function __construct(Tokenizer $tokenizer = null)
    {
        $this->tokenizer = $tokenizer ?: new Tokenizer();
    }

    /**
     * {@inheritdoc}
     */
    public function parse($source)
    {
        $reader = new Reader($source);
        $stream = $this->tokenizer->tokenize($reader);

        return $this->parseSelectorList($stream);
    }

    /**
     * Parses the arguments for ":nth-child()" and friends.
     *
     * @param Token[] $tokens
     *
     * @throws SyntaxErrorException
     *
     * @return array
     */
    public static function parseSeries(array $tokens)
    {
        foreach ($tokens as $token) {
            if ($token->isString()) {
                throw SyntaxErrorException::stringAsFunctionArgument();
            }
        }

        $joined = trim(implode('', array_map(function (Token $token) {
            return $token->getValue();
        }, $tokens)));

        $int = function ($string) {
            if (!is_numeric($string)) {
                throw SyntaxErrorException::stringAsFunctionArgument();
            }

            return (int) $string;
        };

        switch (true) {
            case 'odd' === $joined:
                return array(2, 1);
            case 'even' === $joined:
                return array(2, 0);
            case 'n' === $joined:
                return array(1, 0);
            case false === strpos($joined, 'n'):
                return array(0, $int($joined));
        }

        $split = explode('n', $joined);
        $first = isset($split[0]) ? $split[0] : null;

        return array(
            $first ? ('-' === $first || '+' === $first ? $int($first.'1') : $int($first)) : 1,
            isset($split[1]) && $split[1] ? $int($split[1]) : 0
        );
    }

    /**
     * Parses selector nodes.
     *
     * @param TokenStream $stream
     *
     * @return array
     */
    private function parseSelectorList(TokenStream $stream)
    {
        $stream->skipWhitespace();
        $selectors = array();

        while (true) {
            $selectors[] = $this->parserSelectorNode($stream);

            if ($stream->getPeek()->isDelimiter(array(','))) {
                $stream->getNext();
                $stream->skipWhitespace();
            } else {
                break;
            }
        }

        return $selectors;
    }

    /**
     * Parses next selector or combined node.
     *
     * @param TokenStream $stream
     *
     * @throws SyntaxErrorException
     *
     * @return Node\SelectorNode
     */
    private function parserSelectorNode(TokenStream $stream)
    {
        list($result, $pseudoElement) = $this->parseSimpleSelector($stream);

        while (true) {
            $stream->skipWhitespace();
            $peek = $stream->getPeek();

            if ($peek->isFileEnd() || $peek->isDelimiter(array(','))) {
                break;
            }

            if (null !== $pseudoElement) {
                throw SyntaxErrorException::pseudoElementFound($pseudoElement, 'not at the end of a selector');
            }

            if ($peek->isDelimiter(array('+', '>', '~'))) {
                $combinator = $stream->getNext()->getValue();
                $stream->skipWhitespace();
            } else {
                $combinator = ' ';
            }

            list($nextSelector, $pseudoElement) = $this->parseSimpleSelector($stream);
            $result = new Node\CombinedSelectorNode($result, $combinator, $nextSelector);
        }

        return new Node\SelectorNode($result, $pseudoElement);
    }

    /**
     * Parses next simple node (hash, class, pseudo, negation).
     *
     * @param TokenStream $stream
     * @param boolean     $insideNegation
     *
     * @throws SyntaxErrorException
     *
     * @return array
     */
    private function parseSimpleSelector(TokenStream $stream, $insideNegation = false)
    {
        $stream->skipWhitespace();

        $selectorStart = count($stream->getUsed());
        $result = $this->parseElementNode($stream);
        $pseudoElement = null;

        while (true) {
            $peek = $stream->getPeek();
            if ($peek->isWhitespace()
                || $peek->isFileEnd()
                || $peek->isDelimiter(array(',', '+', '>', '~'))
                || ($insideNegation && $peek->isDelimiter(array(')')))
            ) {
                break;
            }

            if (null !== $pseudoElement) {
                throw SyntaxErrorException::pseudoElementFound($pseudoElement, 'not at the end of a selector');
            }

            if ($peek->isHash()) {
                $result = new Node\HashNode($result, $stream->getNext()->getValue());
            } elseif ($peek->isDelimiter(array('.'))) {
                $stream->getNext();
                $result = new Node\ClassNode($result, $stream->getNextIdentifier());
            } elseif ($peek->isDelimiter(array('['))) {
                $stream->getNext();
                $result = $this->parseAttributeNode($result, $stream);
            } elseif ($peek->isDelimiter(array(':'))) {
                $stream->getNext();

                if ($stream->getPeek()->isDelimiter(array(':'))) {
                    $stream->getNext();
                    $pseudoElement = $stream->getNextIdentifier();

                    continue;
                }

                $identifier = $stream->getNextIdentifier();
                if (in_array(strtolower($identifier), array('first-line', 'first-letter', 'before', 'after'))) {
                    // Special case: CSS 2.1 pseudo-elements can have a single ':'.
                    // Any new pseudo-element must have two.
                    $pseudoElement = $identifier;

                    continue;
                }

                if (!$stream->getPeek()->isDelimiter(array('('))) {
                    $result = new Node\PseudoNode($result, $identifier);

                    continue;
                }

                $stream->getNext();
                $stream->skipWhitespace();

                if ('not' === strtolower($identifier)) {
                    if ($insideNegation) {
                        throw SyntaxErrorException::nestedNot();
                    }

                    list($argument, $argumentPseudoElement) = $this->parseSimpleSelector($stream, true);
                    $next = $stream->getNext();

                    if (null !== $argumentPseudoElement) {
                        throw SyntaxErrorException::pseudoElementFound($argumentPseudoElement, 'inside ::not()');
                    }

                    if (!$next->isDelimiter(array(')'))) {
                        throw SyntaxErrorException::unexpectedToken('")"', $next);
                    }

                    $result = new Node\NegationNode($result, $argument);
                } else {
                    $arguments = array();
                    $next = null;

                    while (true) {
                        $stream->skipWhitespace();
                        $next = $stream->getNext();

                        if ($next->isIdentifier()
                            || $next->isString()
                            || $next->isNumber()
                            || $next->isDelimiter(array('+', '-'))
                        ) {
                            $arguments[] = $next;
                        } elseif ($next->isDelimiter(array(')'))) {
                            break;
                        } else {
                            throw SyntaxErrorException::unexpectedToken('an argument', $next);
                        }
                    }

                    if (empty($arguments)) {
                        throw SyntaxErrorException::unexpectedToken('at least one argument', $next);
                    }

                    $result = new Node\FunctionNode($result, $identifier, $arguments);
                }
            } else {
                throw SyntaxErrorException::unexpectedToken('selector', $peek);
            }
        }

        if (count($stream->getUsed()) === $selectorStart) {
            throw SyntaxErrorException::unexpectedToken('selector', $stream->getPeek());
        }

        return array($result, $pseudoElement);
    }

    /**
     * Parses next element node.
     *
     * @param TokenStream $stream
     *
     * @return Node\ElementNode
     */
    private function parseElementNode(TokenStream $stream)
    {
        $peek = $stream->getPeek();

        if ($peek->isIdentifier() || $peek->isDelimiter(array('*'))) {
            if ($peek->isIdentifier()) {
                $namespace = $stream->getNext()->getValue();
            } else {
                $stream->getNext();
                $namespace = null;
            }

            if ($stream->getPeek()->isDelimiter(array('|'))) {
                $stream->getNext();
                $element = $stream->getNextIdentifierOrStar();
            } else {
                $element = $namespace;
                $namespace = null;
            }
        } else {
            $element = $namespace = null;
        }

        return new Node\ElementNode($namespace, $element);
    }

    /**
     * Parses next attribute node.
     *
     * @param Node\NodeInterface $selector
     * @param TokenStream        $stream
     *
     * @throws SyntaxErrorException
     *
     * @return Node\AttributeNode
     */
    private function parseAttributeNode(Node\NodeInterface $selector, TokenStream $stream)
    {
        $stream->skipWhitespace();
        $attribute = $stream->getNextIdentifierOrStar();

        if (null === $attribute && !$stream->getPeek()->isDelimiter(array('|'))) {
            throw SyntaxErrorException::unexpectedToken('"|"', $stream->getPeek());
        }

        if ($stream->getPeek()->isDelimiter(array('|'))) {
            $stream->getNext();

            if ($stream->getPeek()->isDelimiter(array('='))) {
                $namespace = null;
                $stream->getNext();
                $operator = '|=';
            } else {
                $namespace = $attribute;
                $attribute = $stream->getNextIdentifier();
                $operator = null;
            }
        } else {
            $namespace = $operator = null;
        }

        if (null === $operator) {
            $stream->skipWhitespace();
            $next = $stream->getNext();

            if ($next->isDelimiter(array(']'))) {
                return new Node\AttributeNode($selector, $namespace, $attribute, 'exists', null);
            } elseif ($next->isDelimiter(array('='))) {
                $operator = '=';
            } elseif ($next->isDelimiter(array('^', '$', '*', '~', '|', '!'))
                && $stream->getPeek()->isDelimiter(array('='))
            ) {
                $operator = $next->getValue().'=';
                $stream->getNext();
            } else {
                throw SyntaxErrorException::unexpectedToken('operator', $next);
            }
        }

        $stream->skipWhitespace();
        $value = $stream->getNext();

        if ($value->isNumber()) {
            // if the value is a number, it's casted into a string
            $value = new Token(Token::TYPE_STRING, (string) $value->getValue(), $value->getPosition());
        }

        if (!($value->isIdentifier() || $value->isString())) {
            throw SyntaxErrorException::unexpectedToken('string or identifier', $value);
        }

        $stream->skipWhitespace();
        $next = $stream->getNext();

        if (!$next->isDelimiter(array(']'))) {
            throw SyntaxErrorException::unexpectedToken('"]"', $next);
        }

        return new Node\AttributeNode($selector, $namespace, $attribute, $operator, $value->getValue());
    }
}
PK�`�\>�<��
�
Ipear/Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerPatterns.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Tokenizer;

/**
 * CSS selector tokenizer patterns builder.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class TokenizerPatterns
{
    /**
     * @var string
     */
    private $unicodeEscapePattern;

    /**
     * @var string
     */
    private $simpleEscapePattern;

    /**
     * @var string
     */
    private $newLineEscapePattern;

    /**
     * @var string
     */
    private $escapePattern;

    /**
     * @var string
     */
    private $stringEscapePattern;

    /**
     * @var string
     */
    private $nonAsciiPattern;

    /**
     * @var string
     */
    private $nmCharPattern;

    /**
     * @var string
     */
    private $nmStartPattern;

    /**
     * @var string
     */
    private $identifierPattern;

    /**
     * @var string
     */
    private $hashPattern;

    /**
     * @var string
     */
    private $numberPattern;

    /**
     * @var string
     */
    private $quotedStringPattern;

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->unicodeEscapePattern = '\\\\([0-9a-f]{1,6})(?:\r\n|[ \n\r\t\f])?';
        $this->simpleEscapePattern = '\\\\(.)';
        $this->newLineEscapePattern = '\\\\(?:\n|\r\n|\r|\f)';
        $this->escapePattern = $this->unicodeEscapePattern.'|\\\\[^\n\r\f0-9a-f]';
        $this->stringEscapePattern = $this->newLineEscapePattern.'|'.$this->escapePattern;
        $this->nonAsciiPattern = '[^\x00-\x7F]';
        $this->nmCharPattern = '[_a-z0-9-]|'.$this->escapePattern.'|'.$this->nonAsciiPattern;
        $this->nmStartPattern = '[_a-z]|'.$this->escapePattern.'|'.$this->nonAsciiPattern;
        $this->identifierPattern = '(?:'.$this->nmStartPattern.')(?:'.$this->nmCharPattern.')*';
        $this->hashPattern = '#((?:'.$this->nmCharPattern.')+)';
        $this->numberPattern = '[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)';
        $this->quotedStringPattern = '([^\n\r\f%s]|'.$this->stringEscapePattern.')*';
    }

    /**
     * @return string
     */
    public function getNewLineEscapePattern()
    {
        return '~^'.$this->newLineEscapePattern.'~';
    }

    /**
     * @return string
     */
    public function getSimpleEscapePattern()
    {
        return '~^'.$this->simpleEscapePattern.'~';
    }

    /**
     * @return string
     */
    public function getUnicodeEscapePattern()
    {
        return '~^'.$this->unicodeEscapePattern.'~i';
    }

    /**
     * @return string
     */
    public function getIdentifierPattern()
    {
        return '~^'.$this->identifierPattern.'~i';
    }

    /**
     * @return string
     */
    public function getHashPattern()
    {
        return '~^'.$this->hashPattern.'~i';
    }

    /**
     * @return string
     */
    public function getNumberPattern()
    {
        return '~^'.$this->numberPattern.'~';
    }

    /**
     * @param string $quote
     *
     * @return string
     */
    public function getQuotedStringPattern($quote)
    {
        return '~^'.sprintf($this->quotedStringPattern, $quote).'~i';
    }
}
PK�`�\ ��W55Ipear/Symfony/Component/CssSelector/Parser/Tokenizer/TokenizerEscaping.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Tokenizer;

/**
 * CSS selector tokenizer escaping applier.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class TokenizerEscaping
{
    /**
     * @var TokenizerPatterns
     */
    private $patterns;

    /**
     * @param TokenizerPatterns $patterns
     */
    public function __construct(TokenizerPatterns $patterns)
    {
        $this->patterns = $patterns;
    }

    /**
     * @param string $value
     *
     * @return string
     */
    public function escapeUnicode($value)
    {
        $value = $this->replaceUnicodeSequences($value);

        return preg_replace($this->patterns->getSimpleEscapePattern(), '$1', $value);
    }

    /**
     * @param string $value
     *
     * @return string
     */
    public function escapeUnicodeAndNewLine($value)
    {
        $value = preg_replace($this->patterns->getNewLineEscapePattern(), '', $value);

        return $this->escapeUnicode($value);
    }

    /**
     * @param string $value
     *
     * @return string
     */
    private function replaceUnicodeSequences($value)
    {
        return preg_replace_callback($this->patterns->getUnicodeEscapePattern(), function (array $match) {
            $code = $match[1];

            if (bin2hex($code) > 0xFFFD) {
                $code = '\\FFFD';
            }

            return mb_convert_encoding(pack('H*', $code), 'UTF-8', 'UCS-2BE');
        }, $value);
    }
}
PK�`�\�S�kFFApear/Symfony/Component/CssSelector/Parser/Tokenizer/Tokenizer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Tokenizer;

use Symfony\Component\CssSelector\Parser\Handler;
use Symfony\Component\CssSelector\Parser\Reader;
use Symfony\Component\CssSelector\Parser\Token;
use Symfony\Component\CssSelector\Parser\TokenStream;

/**
 * CSS selector tokenizer.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class Tokenizer
{
    /**
     * @var Handler\HandlerInterface[]
     */
    private $handlers;

    /**
     * Constructor.
     */
    public function __construct()
    {
        $patterns = new TokenizerPatterns();
        $escaping = new TokenizerEscaping($patterns);

        $this->handlers = array(
            new Handler\WhitespaceHandler(),
            new Handler\IdentifierHandler($patterns, $escaping),
            new Handler\HashHandler($patterns, $escaping),
            new Handler\StringHandler($patterns, $escaping),
            new Handler\NumberHandler($patterns),
            new Handler\CommentHandler(),
        );
    }

    /**
     * Tokenize selector source code.
     *
     * @param Reader $reader
     *
     * @return TokenStream
     */
    public function tokenize(Reader $reader)
    {
        $stream = new TokenStream();

        while (!$reader->isEOF()) {
            foreach ($this->handlers as $handler) {
                if ($handler->handle($reader, $stream)) {
                    continue 2;
                }
            }

            $stream->push(new Token(Token::TYPE_DELIMITER, $reader->getSubstring(1), $reader->getPosition()));
            $reader->moveForward(1);
        }

        return $stream
            ->push(new Token(Token::TYPE_FILE_END, null, $reader->getPosition()))
            ->freeze();
    }
}
PK�`�\ҵܗ��Hpear/Symfony/Component/CssSelector/Parser/Shortcut/EmptyStringParser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Shortcut;

use Symfony\Component\CssSelector\Node\ElementNode;
use Symfony\Component\CssSelector\Node\SelectorNode;
use Symfony\Component\CssSelector\Parser\ParserInterface;

/**
 * CSS selector class parser shortcut.
 *
 * This shortcut ensure compatibility with previous version.
 * - The parser fails to parse an empty string.
 * - In the previous version, an empty string matches each tags.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class EmptyStringParser implements ParserInterface
{
    /**
     * {@inheritdoc}
     */
    public function parse($source)
    {
        // Matches an empty string
        if ($source == '') {
            return array(new SelectorNode(new ElementNode(null, '*')));
        }

        return array();
    }
}
PK�`�\5#� HHApear/Symfony/Component/CssSelector/Parser/Shortcut/HashParser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Shortcut;

use Symfony\Component\CssSelector\Node\ElementNode;
use Symfony\Component\CssSelector\Node\HashNode;
use Symfony\Component\CssSelector\Node\SelectorNode;
use Symfony\Component\CssSelector\Parser\ParserInterface;

/**
 * CSS selector hash parser shortcut.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class HashParser implements ParserInterface
{
    /**
     * {@inheritdoc}
     */
    public function parse($source)
    {
        // Matches an optional namespace, optional element, and required id
        // $source = 'test|input#ab6bd_field';
        // $matches = array (size=5)
        //     0 => string 'test:input#ab6bd_field' (length=22)
        //     1 => string 'test:' (length=5)
        //     2 => string 'test' (length=4)
        //     3 => string 'input' (length=5)
        //     4 => string 'ab6bd_field' (length=11)
        if (preg_match('/^(([a-z]+)\|)?([\w-]+|\*)?#([\w-]+)$/i', trim($source), $matches)) {
            return array(
                new SelectorNode(new HashNode(new ElementNode($matches[2] ?: null, $matches[3] ?: null), $matches[4]))
            );
        }

        return array();
    }
}
PK�`�\�Z�>��Dpear/Symfony/Component/CssSelector/Parser/Shortcut/ElementParser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Shortcut;

use Symfony\Component\CssSelector\Node\ElementNode;
use Symfony\Component\CssSelector\Node\SelectorNode;
use Symfony\Component\CssSelector\Parser\ParserInterface;

/**
 * CSS selector element parser shortcut.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class ElementParser implements ParserInterface
{
    /**
     * {@inheritdoc}
     */
    public function parse($source)
    {
        // Matches an optional namespace, required element or `*`
        // $source = 'testns|testel';
        // $matches = array (size=4)
        //     0 => string 'testns:testel' (length=13)
        //     1 => string 'testns:' (length=7)
        //     2 => string 'testns' (length=6)
        //     3 => string 'testel' (length=6)
        if (preg_match('/^(([a-z]+)\|)?([\w-]+|\*)$/i', trim($source), $matches)) {
            return array(new SelectorNode(new ElementNode($matches[2] ?: null, $matches[3])));
        }

        return array();
    }
}
PK�`�\TR#[PPBpear/Symfony/Component/CssSelector/Parser/Shortcut/ClassParser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Shortcut;

use Symfony\Component\CssSelector\Node\ClassNode;
use Symfony\Component\CssSelector\Node\ElementNode;
use Symfony\Component\CssSelector\Node\SelectorNode;
use Symfony\Component\CssSelector\Parser\ParserInterface;

/**
 * CSS selector class parser shortcut.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class ClassParser implements ParserInterface
{
    /**
     * {@inheritdoc}
     */
    public function parse($source)
    {
        // Matches an optional namespace, optional element, and required class
        // $source = 'test|input.ab6bd_field';
        // $matches = array (size=5)
        //     0 => string 'test:input.ab6bd_field' (length=22)
        //     1 => string 'test:' (length=5)
        //     2 => string 'test' (length=4)
        //     3 => string 'input' (length=5)
        //     4 => string 'ab6bd_field' (length=11)
        if (preg_match('/^(([a-z]+)\|)?([\w-]+|\*)?\.([\w-]+)$/i', trim($source), $matches)) {
            return array(
                new SelectorNode(new ClassNode(new ElementNode($matches[2] ?: null, $matches[3] ?: null), $matches[4]))
            );
        }

        return array();
    }
}
PK�`�\�X{��Apear/Symfony/Component/CssSelector/Parser/Handler/HashHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Handler;

use Symfony\Component\CssSelector\Parser\Reader;
use Symfony\Component\CssSelector\Parser\Token;
use Symfony\Component\CssSelector\Parser\TokenStream;
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerEscaping;
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;

/**
 * CSS selector comment handler.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class HashHandler implements HandlerInterface
{
    /**
     * @var TokenizerPatterns
     */
    private $patterns;

    /**
     * @var TokenizerEscaping
     */
    private $escaping;

    /**
     * @param TokenizerPatterns $patterns
     * @param TokenizerEscaping $escaping
     */
    public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping)
    {
        $this->patterns = $patterns;
        $this->escaping = $escaping;
    }

    /**
     * {@inheritdoc}
     */
    public function handle(Reader $reader, TokenStream $stream)
    {
        $match = $reader->findPattern($this->patterns->getHashPattern());

        if (!$match) {
            return false;
        }

        $value = $this->escaping->escapeUnicode($match[1]);
        $stream->push(new Token(Token::TYPE_HASH, $value, $reader->getPosition()));
        $reader->moveForward(strlen($match[0]));

        return true;
    }
}
PK�`�\��6\5
5
Cpear/Symfony/Component/CssSelector/Parser/Handler/StringHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Handler;

use Symfony\Component\CssSelector\Exception\InternalErrorException;
use Symfony\Component\CssSelector\Exception\SyntaxErrorException;
use Symfony\Component\CssSelector\Parser\Reader;
use Symfony\Component\CssSelector\Parser\Token;
use Symfony\Component\CssSelector\Parser\TokenStream;
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerEscaping;
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;

/**
 * CSS selector comment handler.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class StringHandler implements HandlerInterface
{
    /**
     * @var TokenizerPatterns
     */
    private $patterns;

    /**
     * @var TokenizerEscaping
     */
    private $escaping;

    /**
     * @param TokenizerPatterns $patterns
     * @param TokenizerEscaping $escaping
     */
    public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping)
    {
        $this->patterns = $patterns;
        $this->escaping = $escaping;
    }

    /**
     * {@inheritdoc}
     */
    public function handle(Reader $reader, TokenStream $stream)
    {
        $quote = $reader->getSubstring(1);

        if (!in_array($quote, array("'", '"'))) {
            return false;
        }

        $reader->moveForward(1);
        $match = $reader->findPattern($this->patterns->getQuotedStringPattern($quote));

        if (!$match) {
            throw new InternalErrorException(sprintf('Should have found at least an empty match at %s.', $reader->getPosition()));
        }

        // check unclosed strings
        if (strlen($match[0]) === $reader->getRemainingLength()) {
            throw SyntaxErrorException::unclosedString($reader->getPosition() - 1);
        }

        // check quotes pairs validity
        if ($quote !== $reader->getSubstring(1, strlen($match[0]))) {
            throw SyntaxErrorException::unclosedString($reader->getPosition() - 1);
        }

        $string = $this->escaping->escapeUnicodeAndNewLine($match[0]);
        $stream->push(new Token(Token::TYPE_STRING, $string, $reader->getPosition()));
        $reader->moveForward(strlen($match[0]) + 1);

        return true;
    }
}
PK�`�\h��ffFpear/Symfony/Component/CssSelector/Parser/Handler/HandlerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Handler;

use Symfony\Component\CssSelector\Parser\Reader;
use Symfony\Component\CssSelector\Parser\TokenStream;

/**
 * CSS selector handler interface.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
interface HandlerInterface
{
    /**
     * @param Reader      $reader
     * @param TokenStream $stream
     *
     * @return boolean
     */
    public function handle(Reader $reader, TokenStream $stream);
}
PK�`�\����Gpear/Symfony/Component/CssSelector/Parser/Handler/WhitespaceHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Handler;

use Symfony\Component\CssSelector\Parser\Reader;
use Symfony\Component\CssSelector\Parser\Token;
use Symfony\Component\CssSelector\Parser\TokenStream;

/**
 * CSS selector whitespace handler.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class WhitespaceHandler implements HandlerInterface
{
    /**
     * {@inheritdoc}
     */
    public function handle(Reader $reader, TokenStream $stream)
    {
        $match = $reader->findPattern('~^[ \t\r\n\f]+~');

        if (false === $match) {
            return false;
        }

        $stream->push(new Token(Token::TYPE_WHITESPACE, $match[0], $reader->getPosition()));
        $reader->moveForward(strlen($match[0]));

        return true;
    }
}
PK�`�\e'n��Cpear/Symfony/Component/CssSelector/Parser/Handler/NumberHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Handler;

use Symfony\Component\CssSelector\Parser\Reader;
use Symfony\Component\CssSelector\Parser\Token;
use Symfony\Component\CssSelector\Parser\TokenStream;
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;

/**
 * CSS selector comment handler.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class NumberHandler implements HandlerInterface
{
    /**
     * @var TokenizerPatterns
     */
    private $patterns;

    /**
     * @param TokenizerPatterns $patterns
     */
    public function __construct(TokenizerPatterns $patterns)
    {
        $this->patterns = $patterns;
    }

    /**
     * {@inheritdoc}
     */
    public function handle(Reader $reader, TokenStream $stream)
    {
        $match = $reader->findPattern($this->patterns->getNumberPattern());

        if (!$match) {
            return false;
        }

        $stream->push(new Token(Token::TYPE_NUMBER, $match[0], $reader->getPosition()));
        $reader->moveForward(strlen($match[0]));

        return true;
    }
}
PK�`�\8�D�^^Dpear/Symfony/Component/CssSelector/Parser/Handler/CommentHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Handler;

use Symfony\Component\CssSelector\Parser\Reader;
use Symfony\Component\CssSelector\Parser\TokenStream;

/**
 * CSS selector comment handler.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class CommentHandler implements HandlerInterface
{
    /**
     * {@inheritdoc}
     */
    public function handle(Reader $reader, TokenStream $stream)
    {
        if ('/*' !== $reader->getSubstring(2)) {
            return false;
        }

        $offset = $reader->getOffset('*/');

        if (false === $offset) {
            $reader->moveToEnd();
        } else {
            $reader->moveForward($offset + 2);
        }

        return true;
    }
}
PK�`�\�#Gpear/Symfony/Component/CssSelector/Parser/Handler/IdentifierHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser\Handler;

use Symfony\Component\CssSelector\Parser\Reader;
use Symfony\Component\CssSelector\Parser\Token;
use Symfony\Component\CssSelector\Parser\TokenStream;
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerEscaping;
use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;

/**
 * CSS selector comment handler.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class IdentifierHandler implements HandlerInterface
{
    /**
     * @var TokenizerPatterns
     */
    private $patterns;

    /**
     * @var TokenizerEscaping
     */
    private $escaping;

    /**
     * @param TokenizerPatterns $patterns
     * @param TokenizerEscaping $escaping
     */
    public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping)
    {
        $this->patterns = $patterns;
        $this->escaping = $escaping;
    }

    /**
     * {@inheritdoc}
     */
    public function handle(Reader $reader, TokenStream $stream)
    {
        $match = $reader->findPattern($this->patterns->getIdentifierPattern());

        if (!$match) {
            return false;
        }

        $value = $this->escaping->escapeUnicode($match[0]);
        $stream->push(new Token(Token::TYPE_IDENTIFIER, $value, $reader->getPosition()));
        $reader->moveForward(strlen($match[0]));

        return true;
    }
}
PK�`�\�zZ<��3pear/Symfony/Component/CssSelector/Parser/Token.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\CssSelector\Parser;

/**
 * CSS selector token.
 *
 * This component is a port of the Python cssselector library,
 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
 *
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class Token
{
    const TYPE_FILE_END   = 'eof';
    const TYPE_DELIMITER  = 'delimiter';
    const TYPE_WHITESPACE = 'whitespace';
    const TYPE_IDENTIFIER = 'identifier';
    const TYPE_HASH       = 'hash';
    const TYPE_NUMBER     = 'number';
    const TYPE_STRING     = 'string';

    /**
     * @var int
     */
    private $type;

    /**
     * @var string
     */
    private $value;

    /**
     * @var int
     */
    private $position;

    /**
     * @param int    $type
     * @param string $value
     * @param int    $position
     */
    public function __construct($type, $value, $position)
    {
        $this->type = $type;
        $this->value = $value;
        $this->position = $position;
    }

    /**
     * @return int
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * @return string
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * @return int
     */
    public function getPosition()
    {
        return $this->position;
    }

    /**
     * @return boolean
     */
    public function isFileEnd()
    {
        return self::TYPE_FILE_END === $this->type;
    }

    /**
     * @param array $values
     *
     * @return boolean
     */
    public function isDelimiter(array $values = array())
    {
        if (self::TYPE_DELIMITER !== $this->type) {
            return false;
        }

        if (empty($values)) {
            return true;
        }

        return in_array($this->value, $values);
    }

    /**
     * @return boolean
     */
    public function isWhitespace()
    {
        return self::TYPE_WHITESPACE === $this->type;
    }

    /**
     * @return boolean
     */
    public function isIdentifier()
    {
        return self::TYPE_IDENTIFIER === $this->type;
    }

    /**
     * @return boolean
     */
    public function isHash()
    {
        return self::TYPE_HASH === $this->type;
    }

    /**
     * @return boolean
     */
    public function isNumber()
    {
        return self::TYPE_NUMBER === $this->type;
    }

    /**
     * @return boolean
     */
    public function isString()
    {
        return self::TYPE_STRING === $this->type;
    }

    /**
     * @return string
     */
    public function __toString()
    {
        if ($this->value) {
            return sprintf('<%s "%s" at %s>', $this->type, $this->value, $this->position);
        }

        return sprintf('<%s at %s>', $this->type, $this->position);
    }
}
PK�`�\ʪ2/&/&0pear/Symfony/Component/Serializer/Serializer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer;

use Symfony\Component\Serializer\Encoder\ChainDecoder;
use Symfony\Component\Serializer\Encoder\ChainEncoder;
use Symfony\Component\Serializer\Encoder\EncoderInterface;
use Symfony\Component\Serializer\Encoder\DecoderInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Exception\RuntimeException;
use Symfony\Component\Serializer\Exception\LogicException;
use Symfony\Component\Serializer\Exception\UnexpectedValueException;

/**
 * Serializer serializes and deserializes data
 *
 * objects are turned into arrays by normalizers
 * arrays are turned into various output formats by encoders
 *
 * $serializer->serialize($obj, 'xml')
 * $serializer->decode($data, 'xml')
 * $serializer->denormalize($data, 'Class', 'xml')
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Lukas Kahwe Smith <smith@pooteeweet.org>
 */
class Serializer implements SerializerInterface, NormalizerInterface, DenormalizerInterface, EncoderInterface, DecoderInterface
{
    protected $encoder;
    protected $decoder;
    protected $normalizers       = array();
    protected $normalizerCache   = array();
    protected $denormalizerCache = array();

    public function __construct(array $normalizers = array(), array $encoders = array())
    {
        foreach ($normalizers as $normalizer) {
            if ($normalizer instanceof SerializerAwareInterface) {
                $normalizer->setSerializer($this);
            }
        }
        $this->normalizers = $normalizers;

        $decoders = array();
        $realEncoders = array();
        foreach ($encoders as $encoder) {
            if ($encoder instanceof SerializerAwareInterface) {
                $encoder->setSerializer($this);
            }
            if ($encoder instanceof DecoderInterface) {
                $decoders[] = $encoder;
            }
            if ($encoder instanceof EncoderInterface) {
                $realEncoders[] = $encoder;
            }
        }
        $this->encoder = new ChainEncoder($realEncoders);
        $this->decoder = new ChainDecoder($decoders);
    }

    /**
     * {@inheritdoc}
     */
    final public function serialize($data, $format, array $context = array())
    {
        if (!$this->supportsEncoding($format)) {
            throw new UnexpectedValueException(sprintf('Serialization for the format %s is not supported', $format));
        }

        if ($this->encoder->needsNormalization($format)) {
            $data = $this->normalize($data, $format, $context);
        }

        return $this->encode($data, $format, $context);
    }

    /**
     * {@inheritdoc}
     */
    final public function deserialize($data, $type, $format, array $context = array())
    {
        if (!$this->supportsDecoding($format)) {
            throw new UnexpectedValueException(sprintf('Deserialization for the format %s is not supported', $format));
        }

        $data = $this->decode($data, $format, $context);

        return $this->denormalize($data, $type, $format, $context);
    }

    /**
     * {@inheritdoc}
     */
    public function normalize($data, $format = null, array $context = array())
    {
        if (null === $data || is_scalar($data)) {
            return $data;
        }
        if (is_object($data) && $this->supportsNormalization($data, $format)) {
            return $this->normalizeObject($data, $format, $context);
        }
        if ($data instanceof \Traversable) {
            $normalized = array();
            foreach ($data as $key => $val) {
                $normalized[$key] = $this->normalize($val, $format, $context);
            }

            return $normalized;
        }
        if (is_object($data)) {
            return $this->normalizeObject($data, $format, $context);
        }
        if (is_array($data)) {
            foreach ($data as $key => $val) {
                $data[$key] = $this->normalize($val, $format, $context);
            }

            return $data;
        }
        throw new UnexpectedValueException(sprintf('An unexpected value could not be normalized: %s', var_export($data, true)));
    }

    /**
     * {@inheritdoc}
     */
    public function denormalize($data, $type, $format = null, array $context = array())
    {
        return $this->denormalizeObject($data, $type, $format, $context);
    }

    /**
     * {@inheritdoc}
     */
    public function supportsNormalization($data, $format = null)
    {
        try {
            $this->getNormalizer($data, $format);
        } catch (RuntimeException $e) {
            return false;
        }

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function supportsDenormalization($data, $type, $format = null)
    {
        try {
            $this->getDenormalizer($data, $type, $format = null);
        } catch (RuntimeException $e) {
            return false;
        }

        return true;
    }

    /**
     * {@inheritdoc}
     */
    private function getNormalizer($data, $format = null)
    {
        foreach ($this->normalizers as $normalizer) {
            if ($normalizer instanceof NormalizerInterface && $normalizer->supportsNormalization($data, $format)) {
                return $normalizer;
            }
        }

        throw new RuntimeException(sprintf('No normalizer found for format "%s".', $format));
    }

    /**
     * {@inheritdoc}
     */
    private function getDenormalizer($data, $type, $format = null)
    {
        foreach ($this->normalizers as $normalizer) {
            if ($normalizer instanceof DenormalizerInterface && $normalizer->supportsDenormalization($data, $type, $format)) {
                return $normalizer;
            }
        }

        throw new RuntimeException(sprintf('No denormalizer found for format "%s".', $format));
    }

    /**
     * {@inheritdoc}
     */
    final public function encode($data, $format, array $context = array())
    {
        return $this->encoder->encode($data, $format, $context);
    }

    /**
     * {@inheritdoc}
     */
    final public function decode($data, $format, array $context = array())
    {
        return $this->decoder->decode($data, $format, $context);
    }

    /**
     * Normalizes an object into a set of arrays/scalars
     *
     * @param object $object object to normalize
     * @param string $format format name, present to give the option to normalizers to act differently based on formats
     * @param array $context The context data for this particular normalization
     *
     * @return array|scalar
     *
     * @throws LogicException
     * @throws UnexpectedValueException
     */
    private function normalizeObject($object, $format = null, array $context = array())
    {
        if (!$this->normalizers) {
            throw new LogicException('You must register at least one normalizer to be able to normalize objects.');
        }

        $class = get_class($object);
        if (isset($this->normalizerCache[$class][$format])) {
            return $this->normalizerCache[$class][$format]->normalize($object, $format, $context);
        }

        foreach ($this->normalizers as $normalizer) {
            if ($normalizer instanceof NormalizerInterface
                && $normalizer->supportsNormalization($object, $format)) {
                $this->normalizerCache[$class][$format] = $normalizer;

                return $normalizer->normalize($object, $format, $context);
            }
        }

        throw new UnexpectedValueException(sprintf('Could not normalize object of type %s, no supporting normalizer found.', $class));
    }

    /**
     * Denormalizes data back into an object of the given class
     *
     * @param mixed  $data   data to restore
     * @param string $class  the expected class to instantiate
     * @param string $format format name, present to give the option to normalizers to act differently based on formats
     * @param array $context The context data for this particular denormalization
     *
     * @return object
     *
     * @throws LogicException
     * @throws UnexpectedValueException
     */
    private function denormalizeObject($data, $class, $format = null, array $context = array())
    {
        if (!$this->normalizers) {
            throw new LogicException('You must register at least one normalizer to be able to denormalize objects.');
        }

        if (isset($this->denormalizerCache[$class][$format])) {
            return $this->denormalizerCache[$class][$format]->denormalize($data, $class, $format, $context);
        }

        foreach ($this->normalizers as $normalizer) {
            if ($normalizer instanceof DenormalizerInterface
                && $normalizer->supportsDenormalization($data, $class, $format)) {
                $this->denormalizerCache[$class][$format] = $normalizer;

                return $normalizer->denormalize($data, $class, $format, $context);
            }
        }

        throw new UnexpectedValueException(sprintf('Could not denormalize object of type %s, no supporting normalizer found.', $class));
    }

    /**
     * {@inheritdoc}
     */
    public function supportsEncoding($format)
    {
        return $this->encoder->supportsEncoding($format);
    }

    /**
     * {@inheritdoc}
     */
    public function supportsDecoding($format)
    {
        return $this->decoder->supportsDecoding($format);
    }
}
PK�`�\���OO>pear/Symfony/Component/Serializer/SerializerAwareInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer;

/**
 * Defines the interface of encoders
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface SerializerAwareInterface
{
    /**
     * Sets the owning Serializer object
     *
     * @param SerializerInterface $serializer
     */
    public function setSerializer(SerializerInterface $serializer);
}
PK�`�\���Fpear/Symfony/Component/Serializer/Normalizer/DenormalizerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Normalizer;

/**
 * Defines the interface of denormalizers.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface DenormalizerInterface
{
    /**
     * Denormalizes data back into an object of the given class
     *
     * @param mixed  $data   data to restore
     * @param string $class  the expected class to instantiate
     * @param string $format format the given data was extracted from
     * @param array  $context options available to the denormalizer
     *
     * @return object
     */
    public function denormalize($data, $class, $format = null, array $context = array());

    /**
     * Checks whether the given class is supported for denormalization by this normalizer
     *
     * @param mixed  $data   Data to denormalize from.
     * @param string $type   The class to which the data should be denormalized.
     * @param string $format The format being deserialized from.
     *
     * @return Boolean
     */
    public function supportsDenormalization($data, $type, $format = null);
}
PK�`�\��SVVApear/Symfony/Component/Serializer/Normalizer/CustomNormalizer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Normalizer;

/**
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class CustomNormalizer extends SerializerAwareNormalizer implements NormalizerInterface, DenormalizerInterface
{
    /**
     * {@inheritdoc}
     */
    public function normalize($object, $format = null, array $context = array())
    {
        return $object->normalize($this->serializer, $format, $context);
    }

    /**
     * {@inheritdoc}
     */
    public function denormalize($data, $class, $format = null, array $context = array())
    {
        $object = new $class();
        $object->denormalize($this->serializer, $data, $format, $context);

        return $object;
    }

    /**
     * Checks if the given class implements the NormalizableInterface.
     *
     * @param mixed  $data   Data to normalize.
     * @param string $format The format being (de-)serialized from or into.
     *
     * @return Boolean
     */
    public function supportsNormalization($data, $format = null)
    {
        return $data instanceof NormalizableInterface;
    }

    /**
     * Checks if the given class implements the NormalizableInterface.
     *
     * @param mixed  $data   Data to denormalize from.
     * @param string $type   The class to which the data should be denormalized.
     * @param string $format The format being deserialized from.
     *
     * @return Boolean
     */
    public function supportsDenormalization($data, $type, $format = null)
    {
        $class = new \ReflectionClass($type);

        return $class->isSubclassOf('Symfony\Component\Serializer\Normalizer\DenormalizableInterface');
    }
}
PK�`�\[i55Jpear/Symfony/Component/Serializer/Normalizer/SerializerAwareNormalizer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Normalizer;

use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Serializer\SerializerAwareInterface;

/**
 * SerializerAware Normalizer implementation
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
abstract class SerializerAwareNormalizer implements SerializerAwareInterface
{
    /**
     * @var SerializerInterface
     */
    protected $serializer;

    /**
     * {@inheritdoc}
     */
    public function setSerializer(SerializerInterface $serializer)
    {
        $this->serializer = $serializer;
    }
}
PK�`�\��,,Gpear/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Normalizer;

use Symfony\Component\Serializer\Exception\InvalidArgumentException;
use Symfony\Component\Serializer\Exception\RuntimeException;

/**
 * Converts between objects with getter and setter methods and arrays.
 *
 * The normalization process looks at all public methods and calls the ones
 * which have a name starting with get and take no parameters. The result is a
 * map from property names (method name stripped of the get prefix and converted
 * to lower case) to property values. Property values are normalized through the
 * serializer.
 *
 * The denormalization first looks at the constructor of the given class to see
 * if any of the parameters have the same name as one of the properties. The
 * constructor is then called with all parameters or an exception is thrown if
 * any required parameters were not present as properties. Then the denormalizer
 * walks through the given map of property names to property values to see if a
 * setter method exists for any of the properties. If a setter exists it is
 * called with the property value. No automatic denormalization of the value
 * takes place.
 *
 * @author Nils Adermann <naderman@naderman.de>
 */
class GetSetMethodNormalizer extends SerializerAwareNormalizer implements NormalizerInterface, DenormalizerInterface
{
    protected $callbacks = array();
    protected $ignoredAttributes = array();
    protected $camelizedAttributes = array();

    /**
     * Set normalization callbacks.
     *
     * @param callable[] $callbacks help normalize the result
     *
     * @throws InvalidArgumentException if a non-callable callback is set
     */
    public function setCallbacks(array $callbacks)
    {
        foreach ($callbacks as $attribute => $callback) {
            if (!is_callable($callback)) {
                throw new InvalidArgumentException(sprintf('The given callback for attribute "%s" is not callable.', $attribute));
            }
        }
        $this->callbacks = $callbacks;
    }

    /**
     * Set ignored attributes for normalization
     *
     * @param array $ignoredAttributes
     */
    public function setIgnoredAttributes(array $ignoredAttributes)
    {
        $this->ignoredAttributes = $ignoredAttributes;
    }

    /**
     * Set attributes to be camelized on denormalize
     *
     * @param array $camelizedAttributes
     */
    public function setCamelizedAttributes(array $camelizedAttributes)
    {
        $this->camelizedAttributes = $camelizedAttributes;
    }

    /**
     * {@inheritdoc}
     */
    public function normalize($object, $format = null, array $context = array())
    {
        $reflectionObject = new \ReflectionObject($object);
        $reflectionMethods = $reflectionObject->getMethods(\ReflectionMethod::IS_PUBLIC);

        $attributes = array();
        foreach ($reflectionMethods as $method) {
            if ($this->isGetMethod($method)) {
                $attributeName = lcfirst(substr($method->name, 3));

                if (in_array($attributeName, $this->ignoredAttributes)) {
                    continue;
                }

                $attributeValue = $method->invoke($object);
                if (array_key_exists($attributeName, $this->callbacks)) {
                    $attributeValue = call_user_func($this->callbacks[$attributeName], $attributeValue);
                }
                if (null !== $attributeValue && !is_scalar($attributeValue)) {
                    if (!$this->serializer instanceof NormalizerInterface) {
                        throw new \LogicException(sprintf('Cannot normalize attribute "%s" because injected serializer is not a normalizer', $attributeName));
                    }
                    $attributeValue = $this->serializer->normalize($attributeValue, $format);
                }

                $attributes[$attributeName] = $attributeValue;
            }
        }

        return $attributes;
    }

    /**
     * {@inheritdoc}
     */
    public function denormalize($data, $class, $format = null, array $context = array())
    {
        $reflectionClass = new \ReflectionClass($class);
        $constructor = $reflectionClass->getConstructor();

        if ($constructor) {
            $constructorParameters = $constructor->getParameters();

            $params = array();
            foreach ($constructorParameters as $constructorParameter) {
                $paramName = lcfirst($this->formatAttribute($constructorParameter->name));

                if (isset($data[$paramName])) {
                    $params[] = $data[$paramName];
                    // don't run set for a parameter passed to the constructor
                    unset($data[$paramName]);
                } elseif (!$constructorParameter->isOptional()) {
                    throw new RuntimeException(
                        'Cannot create an instance of '.$class.
                        ' from serialized data because its constructor requires '.
                        'parameter "'.$constructorParameter->name.
                        '" to be present.');
                }
            }

            $object = $reflectionClass->newInstanceArgs($params);
        } else {
            $object = new $class;
        }

        foreach ($data as $attribute => $value) {
            $setter = 'set'.$this->formatAttribute($attribute);

            if (method_exists($object, $setter)) {
                $object->$setter($value);
            }
        }

        return $object;
    }

    /**
     * Format attribute name to access parameters or methods
     * As option, if attribute name is found on camelizedAttributes array
     * returns attribute name in camelcase format
     *
     * @param string $attributeName
     * @return string
     */
    protected function formatAttribute($attributeName)
    {
        if (in_array($attributeName, $this->camelizedAttributes)) {
            return preg_replace_callback(
                '/(^|_|\.)+(.)/', function ($match) {
                    return ('.' === $match[1] ? '_' : '').strtoupper($match[2]);
                }, $attributeName
            );
        }

        return $attributeName;
    }

    /**
     * {@inheritDoc}
     */
    public function supportsNormalization($data, $format = null)
    {
        return is_object($data) && $this->supports(get_class($data));
    }

    /**
     * {@inheritDoc}
     */
    public function supportsDenormalization($data, $type, $format = null)
    {
        return $this->supports($type);
    }

    /**
     * Checks if the given class has any get{Property} method.
     *
     * @param string $class
     *
     * @return Boolean
     */
    private function supports($class)
    {
        $class = new \ReflectionClass($class);
        $methods = $class->getMethods(\ReflectionMethod::IS_PUBLIC);
        foreach ($methods as $method) {
            if ($this->isGetMethod($method)) {
                return true;
            }
        }

        return false;
    }

    /**
     * Checks if a method's name is get.* and can be called without parameters.
     *
     * @param \ReflectionMethod $method the method to check
     *
     * @return Boolean whether the method is a getter.
     */
    private function isGetMethod(\ReflectionMethod $method)
    {
        return (
            0 === strpos($method->name, 'get') &&
            3 < strlen($method->name) &&
            0 === $method->getNumberOfRequiredParameters()
        );
    }
}
PK�`�\�qU���Hpear/Symfony/Component/Serializer/Normalizer/DenormalizableInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Normalizer;

/**
 * Defines the most basic interface a class must implement to be denormalizable
 *
 * If a denormalizer is registered for the class and it doesn't implement
 * the Denormalizable interfaces, the normalizer will be used instead
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface DenormalizableInterface
{
    /**
     * Denormalizes the object back from an array of scalars|arrays.
     *
     * It is important to understand that the denormalize() call should denormalize
     * recursively all child objects of the implementor.
     *
     * @param DenormalizerInterface $denormalizer The denormalizer is given so that you
     *   can use it to denormalize objects contained within this object.
     * @param array|scalar $data   The data from which to re-create the object.
     * @param string|null  $format The format is optionally given to be able to denormalize differently
     *   based on different input formats.
     * @param array        $context options for denormalizing
     */
    public function denormalize(DenormalizerInterface $denormalizer, $data, $format = null, array $context = array());
}
PK�`�\=Vxe::Fpear/Symfony/Component/Serializer/Normalizer/NormalizableInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Normalizer;

/**
 * Defines the most basic interface a class must implement to be normalizable
 *
 * If a normalizer is registered for the class and it doesn't implement
 * the Normalizable interfaces, the normalizer will be used instead
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface NormalizableInterface
{
    /**
     * Normalizes the object into an array of scalars|arrays.
     *
     * It is important to understand that the normalize() call should normalize
     * recursively all child objects of the implementor.
     *
     * @param NormalizerInterface $normalizer The normalizer is given so that you
     *   can use it to normalize objects contained within this object.
     * @param string|null $format The format is optionally given to be able to normalize differently
     *   based on different output formats.
     * @param array $context Options for normalizing this object
     *
     * @return array|scalar
     */
    public function normalize(NormalizerInterface $normalizer, $format = null, array $context = array());
}
PK�`�\"p�yyDpear/Symfony/Component/Serializer/Normalizer/NormalizerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Normalizer;

/**
 * Defines the interface of normalizers.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface NormalizerInterface
{
    /**
     * Normalizes an object into a set of arrays/scalars
     *
     * @param object $object object to normalize
     * @param string $format format the normalization result will be encoded as
     * @param array $context Context options for the normalizer
     *
     * @return array|scalar
     */
    public function normalize($object, $format = null, array $context = array());

    /**
     * Checks whether the given class is supported for normalization by this normalizer
     *
     * @param mixed  $data   Data to normalize.
     * @param string $format The format being (de-)serialized from or into.
     *
     * @return Boolean
     */
    public function supportsNormalization($data, $format = null);
}
PK�`�\x蕰

9pear/Symfony/Component/Serializer/SerializerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer;

/**
 * Defines the interface of the Serializer
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface SerializerInterface
{
    /**
     * Serializes data in the appropriate format
     *
     * @param mixed  $data    any data
     * @param string $format  format name
     * @param array  $context options normalizers/encoders have access to
     *
     * @return string
     */
    public function serialize($data, $format, array $context = array());

    /**
     * Deserializes data into the given type.
     *
     * @param mixed  $data
     * @param string $type
     * @param string $format
     * @param array  $context
     *
     * @return object
     */
    public function deserialize($data, $type, $format, array $context = array());
}
PK�`�\��TT0pear/Symfony/Component/Serializer/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Serializer\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�`�\�^L��Dpear/Symfony/Component/Serializer/Exception/UnsupportedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Exception;

/**
 * UnsupportedException
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class UnsupportedException extends InvalidArgumentException
{
}
PK�`�\J���>pear/Symfony/Component/Serializer/Exception/LogicException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Exception;

/**
 * LogicException
 *
 * @author Lukas Kahwe Smith <smith@pooteeweet.org>
 */
class LogicException extends \LogicException implements Exception
{
}
PK�`�\A�A
��9pear/Symfony/Component/Serializer/Exception/Exception.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Exception;

/**
 * Base exception
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
interface Exception
{
}
PK�`�\[�����Hpear/Symfony/Component/Serializer/Exception/UnexpectedValueException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Exception;

/**
 * UnexpectedValueException
 *
 * @author Lukas Kahwe Smith <smith@pooteeweet.org>
 */
class UnexpectedValueException extends \UnexpectedValueException implements Exception
{
}
PK�`�\�h=��@pear/Symfony/Component/Serializer/Exception/RuntimeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Exception;

/**
 * RuntimeException
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class RuntimeException extends \RuntimeException implements Exception
{
}
PK�`�\T��Y��Hpear/Symfony/Component/Serializer/Exception/InvalidArgumentException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Exception;

/**
 * InvalidArgumentException
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class InvalidArgumentException extends \InvalidArgumentException implements Exception
{
}
PK�`�\,�c��>pear/Symfony/Component/Serializer/Encoder/EncoderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Encoder;

/**
 * Defines the interface of encoders
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface EncoderInterface
{
    /**
     * Encodes data into the given format
     *
     * @param mixed  $data   Data to encode
     * @param string $format Format name
     * @param array  $context options that normalizers/encoders have access to.
     *
     * @return scalar
     */
    public function encode($data, $format, array $context = array());

    /**
     * Checks whether the serializer can encode to given format
     *
     * @param string $format format name
     *
     * @return Boolean
     */
    public function supportsEncoding($format);
}
PK�`�\�=��Dpear/Symfony/Component/Serializer/Encoder/SerializerAwareEncoder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Encoder;

use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Serializer\SerializerAwareInterface;

/**
 * SerializerAware Encoder implementation
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
abstract class SerializerAwareEncoder implements SerializerAwareInterface
{
    protected $serializer;

    /**
     * {@inheritdoc}
     */
    public function setSerializer(SerializerInterface $serializer)
    {
        $this->serializer = $serializer;
    }
}
PK�`�\|ͼ���>pear/Symfony/Component/Serializer/Encoder/DecoderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Encoder;

/**
 * Defines the interface of decoders
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface DecoderInterface
{
    /**
     * Decodes a string into PHP data.
     *
     * @param scalar $data      Data to decode
     * @param string $format    Format name
     * @param array  $context   options that decoders have access to.
     *
     * The format parameter specifies which format the data is in; valid values
     * depend on the specific implementation. Authors implementing this interface
     * are encouraged to document which formats they support in a non-inherited
     * phpdoc comment.
     *
     * @return mixed
     */
    public function decode($data, $format, array $context = array());

    /**
     * Checks whether the deserializer can decode from given format.
     *
     * @param string $format format name
     *
     * @return Boolean
     */
    public function supportsDecoding($format);
}
PK�`�\�<=ggIpear/Symfony/Component/Serializer/Encoder/NormalizationAwareInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Encoder;

/**
 * Defines the interface of encoders that will normalize data themselves
 *
 * Implementing this interface essentially just tells the Serializer that the
 * data should not be pre-normalized before being passed to this Encoder.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
interface NormalizationAwareInterface
{
}
PK�`�\��@���8pear/Symfony/Component/Serializer/Encoder/JsonDecode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Encoder;

/**
 * Decodes JSON data
 *
 * @author Sander Coolen <sander@jibber.nl>
 */
class JsonDecode implements DecoderInterface
{
    /**
     * Specifies if the returned result should be an associative array or a nested stdClass object hierarchy.
     *
     * @var Boolean
     */
    private $associative;

    /**
     * Specifies the recursion depth.
     *
     * @var integer
     */
    private $recursionDepth;

    private $lastError = JSON_ERROR_NONE;
    protected $serializer;

    /**
     * Constructs a new JsonDecode instance.
     *
     * @param Boolean  $associative True to return the result associative array, false for a nested stdClass hierarchy
     * @param integer  $depth       Specifies the recursion depth
     */
    public function __construct($associative = false, $depth = 512)
    {
        $this->associative = $associative;
        $this->recursionDepth = (int) $depth;
    }

    /**
     * Returns the last decoding error (if any).
     *
     * @return integer
     *
     * @see http://php.net/manual/en/function.json-last-error.php json_last_error
     */
    public function getLastError()
    {
        return $this->lastError;
    }

    /**
     * Decodes data.
     *
     * @param string $data    The encoded JSON string to decode
     * @param string $format  Must be set to JsonEncoder::FORMAT
     * @param array  $context An optional set of options for the JSON decoder; see below
     *
     * The $context array is a simple key=>value array, with the following supported keys:
     *
     * json_decode_associative: boolean
     *      If true, returns the object as associative array.
     *      If false, returns the object as nested stdClass
     *      If not specified, this method will use the default set in JsonDecode::__construct
     *
     * json_decode_recursion_depth: integer
     *      Specifies the maximum recursion depth
     *      If not specified, this method will use the default set in JsonDecode::__construct
     *
     * json_decode_options: integer
     *      Specifies additional options as per documentation for json_decode. Only supported with PHP 5.4.0 and higher
     *
     * @return mixed
     *
     * @see http://php.net/json_decode json_decode
     */
    public function decode($data, $format, array $context = array())
    {
        $context = $this->resolveContext($context);

        $associative    = $context['json_decode_associative'];
        $recursionDepth = $context['json_decode_recursion_depth'];
        $options        = $context['json_decode_options'];

        if (version_compare(PHP_VERSION, '5.4.0') >= 0) {
            $decodedData = json_decode($data, $associative, $recursionDepth, $options);
        } else {
            $decodedData = json_decode($data, $associative, $recursionDepth);
        }

        $this->lastError = json_last_error();

        return $decodedData;
    }

    /**
     * {@inheritdoc}
     */
    public function supportsDecoding($format)
    {
        return JsonEncoder::FORMAT === $format;
    }

    /**
     * Merges the default options of the Json Decoder with the passed context.
     *
     * @param array $context
     *
     * @return array
     */
    private function resolveContext(array $context)
    {
        $defaultOptions = array(
            'json_decode_associative' => $this->associative,
            'json_decode_recursion_depth' => $this->recursionDepth,
            'json_decode_options' => 0
        );

        return array_merge($defaultOptions, $context);
    }
}
PK�`�\�o�vv9pear/Symfony/Component/Serializer/Encoder/JsonEncoder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Encoder;

/**
 * Encodes JSON data
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class JsonEncoder implements EncoderInterface, DecoderInterface
{
    const FORMAT = 'json';

    /**
     * @var JsonEncode
     */
    protected $encodingImpl;

    /**
     * @var JsonDecode
     */
    protected $decodingImpl;

    public function __construct(JsonEncode $encodingImpl = null, JsonDecode $decodingImpl = null)
    {
        $this->encodingImpl = $encodingImpl ?: new JsonEncode();
        $this->decodingImpl = $decodingImpl ?: new JsonDecode(true);
    }

    /**
     * Returns the last encoding error (if any)
     *
     * @return integer
     */
    public function getLastEncodingError()
    {
        return $this->encodingImpl->getLastError();
    }

    /**
     * Returns the last decoding error (if any)
     *
     * @return integer
     */
    public function getLastDecodingError()
    {
        return $this->decodingImpl->getLastError();
    }

    /**
     * {@inheritdoc}
     */
    public function encode($data, $format, array $context = array())
    {
        return $this->encodingImpl->encode($data, self::FORMAT, $context);
    }

    /**
     * {@inheritdoc}
     */
    public function decode($data, $format, array $context = array())
    {
        return $this->decodingImpl->decode($data, self::FORMAT, $context);
    }

    /**
     * {@inheritdoc}
     */
    public function supportsEncoding($format)
    {
        return self::FORMAT === $format;
    }

    /**
     * {@inheritdoc}
     */
    public function supportsDecoding($format)
    {
        return self::FORMAT === $format;
    }
}
PK�`�\��[�5�58pear/Symfony/Component/Serializer/Encoder/XmlEncoder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Encoder;

use Symfony\Component\Serializer\Exception\UnexpectedValueException;

/**
 * Encodes XML data
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @author John Wards <jwards@whiteoctober.co.uk>
 * @author Fabian Vogler <fabian@equivalence.ch>
 */
class XmlEncoder extends SerializerAwareEncoder implements EncoderInterface, DecoderInterface, NormalizationAwareInterface
{
    private $dom;
    private $format;
    private $context;
    private $rootNodeName = 'response';

    /**
     * Construct new XmlEncoder and allow to change the root node element name.
     *
     * @param string $rootNodeName
     */
    public function __construct($rootNodeName = 'response')
    {
        $this->rootNodeName = $rootNodeName;
    }

    /**
     * {@inheritdoc}
     */
    public function encode($data, $format, array $context = array())
    {
        if ($data instanceof \DOMDocument) {
            return $data->saveXML();
        }

        $xmlRootNodeName = $this->resolveXmlRootName($context);

        $this->dom = $this->createDomDocument($context);
        $this->format = $format;
        $this->context = $context;

        if (null !== $data && !is_scalar($data)) {
            $root = $this->dom->createElement($xmlRootNodeName);
            $this->dom->appendChild($root);
            $this->buildXml($root, $data, $xmlRootNodeName);
        } else {
            $this->appendNode($this->dom, $data, $xmlRootNodeName);
        }

        return $this->dom->saveXML();
    }

    /**
     * {@inheritdoc}
     */
    public function decode($data, $format, array $context = array())
    {
        if ('' === trim($data)) {
            throw new UnexpectedValueException('Invalid XML data, it can not be empty.');
        }

        $internalErrors = libxml_use_internal_errors(true);
        $disableEntities = libxml_disable_entity_loader(true);
        libxml_clear_errors();

        $dom = new \DOMDocument();
        $dom->loadXML($data, LIBXML_NONET);

        libxml_use_internal_errors($internalErrors);
        libxml_disable_entity_loader($disableEntities);

        if ($error = libxml_get_last_error()) {
            libxml_clear_errors();

            throw new UnexpectedValueException($error->message);
        }

        foreach ($dom->childNodes as $child) {
            if ($child->nodeType === XML_DOCUMENT_TYPE_NODE) {
                throw new UnexpectedValueException('Document types are not allowed.');
            }
        }

        $xml = simplexml_import_dom($dom);

        if ($error = libxml_get_last_error()) {
            throw new UnexpectedValueException($error->message);
        }

        if (!$xml->count()) {
            if (!$xml->attributes()) {
                return (string) $xml;
            }
            $data = array();
            foreach ($xml->attributes() as $attrkey => $attr) {
                $data['@'.$attrkey] = (string) $attr;
            }
            $data['#'] = (string) $xml;

            return $data;
        }

        return $this->parseXml($xml);
    }

    /**
     * {@inheritdoc}
     */
     public function supportsEncoding($format)
     {
         return 'xml' === $format;
     }

     /**
     * {@inheritdoc}
     */
     public function supportsDecoding($format)
     {
         return 'xml' === $format;
     }

    /**
     * Sets the root node name
     *
     * @param string $name root node name
     */
    public function setRootNodeName($name)
    {
        $this->rootNodeName = $name;
    }

    /**
     * Returns the root node name
     * @return string
     */
    public function getRootNodeName()
    {
        return $this->rootNodeName;
    }

    /**
     * @param \DOMNode $node
     * @param string   $val
     *
     * @return Boolean
     */
    final protected function appendXMLString(\DOMNode $node, $val)
    {
        if (strlen($val) > 0) {
            $frag = $this->dom->createDocumentFragment();
            $frag->appendXML($val);
            $node->appendChild($frag);

            return true;
        }

        return false;
    }

    /**
     * @param \DOMNode $node
     * @param string   $val
     *
     * @return Boolean
     */
    final protected function appendText(\DOMNode $node, $val)
    {
        $nodeText = $this->dom->createTextNode($val);
        $node->appendChild($nodeText);

        return true;
    }

    /**
     * @param \DOMNode $node
     * @param string   $val
     *
     * @return Boolean
     */
    final protected function appendCData(\DOMNode $node, $val)
    {
        $nodeText = $this->dom->createCDATASection($val);
        $node->appendChild($nodeText);

        return true;
    }

    /**
     * @param \DOMNode             $node
     * @param \DOMDocumentFragment $fragment
     *
     * @return Boolean
     */
    final protected function appendDocumentFragment(\DOMNode $node, $fragment)
    {
        if ($fragment instanceof \DOMDocumentFragment) {
            $node->appendChild($fragment);

            return true;
        }

        return false;
    }

    /**
     * Checks the name is a valid xml element name
     *
     * @param string $name
     *
     * @return Boolean
     */
    final protected function isElementNameValid($name)
    {
        return $name &&
            false === strpos($name, ' ') &&
            preg_match('#^[\pL_][\pL0-9._-]*$#ui', $name);
    }

    /**
     * Parse the input SimpleXmlElement into an array.
     *
     * @param \SimpleXmlElement $node xml to parse
     *
     * @return array
     */
    private function parseXml(\SimpleXmlElement $node)
    {
        $data = array();
        if ($node->attributes()) {
            foreach ($node->attributes() as $attrkey => $attr) {
                $data['@'.$attrkey] = (string) $attr;
            }
        }
        foreach ($node->children() as $key => $subnode) {
            if ($subnode->count()) {
                $value = $this->parseXml($subnode);
            } elseif ($subnode->attributes()) {
                $value = array();
                foreach ($subnode->attributes() as $attrkey => $attr) {
                    $value['@'.$attrkey] = (string) $attr;
                }
                $value['#'] = (string) $subnode;
            } else {
                $value = (string) $subnode;
            }

            if ($key === 'item') {
                if (isset($value['@key'])) {
                    if (isset($value['#'])) {
                        $data[$value['@key']] = $value['#'];
                    } else {
                        $data[$value['@key']] = $value;
                    }
                } else {
                    $data['item'][] = $value;
                }
            } elseif (array_key_exists($key, $data) || $key == "entry") {
                if ((false === is_array($data[$key]))  || (false === isset($data[$key][0]))) {
                    $data[$key] = array($data[$key]);
                }
                $data[$key][] = $value;
            } else {
                $data[$key] = $value;
            }
        }

        return $data;
    }

    /**
     * Parse the data and convert it to DOMElements
     *
     * @param \DOMNode     $parentNode
     * @param array|object $data
     * @param string|null  $xmlRootNodeName
     *
     * @return Boolean
     *
     * @throws UnexpectedValueException
     */
    private function buildXml(\DOMNode $parentNode, $data, $xmlRootNodeName = null)
    {
        $append = true;

        if (is_array($data) || $data instanceof \Traversable) {
            foreach ($data as $key => $data) {
                //Ah this is the magic @ attribute types.
                if (0 === strpos($key, "@") && is_scalar($data) && $this->isElementNameValid($attributeName = substr($key, 1))) {
                    $parentNode->setAttribute($attributeName, $data);
                } elseif ($key === '#') {
                    $append = $this->selectNodeType($parentNode, $data);
                } elseif (is_array($data) && false === is_numeric($key)) {
                    /**
                     * Is this array fully numeric keys?
                     */
                    if (ctype_digit(implode('', array_keys($data)))) {
                        /**
                         * Create nodes to append to $parentNode based on the $key of this array
                         * Produces <xml><item>0</item><item>1</item></xml>
                         * From array("item" => array(0,1));
                         */
                        foreach ($data as $subData) {
                            $append = $this->appendNode($parentNode, $subData, $key);
                        }
                    } else {
                        $append = $this->appendNode($parentNode, $data, $key);
                    }
                } elseif (is_numeric($key) || !$this->isElementNameValid($key)) {
                    $append = $this->appendNode($parentNode, $data, "item", $key);
                } else {
                    $append = $this->appendNode($parentNode, $data, $key);
                }
            }

            return $append;
        }

        if (is_object($data)) {
            $data = $this->serializer->normalize($data, $this->format, $this->context);
            if (null !== $data && !is_scalar($data)) {
                return $this->buildXml($parentNode, $data, $xmlRootNodeName);
            }

            // top level data object was normalized into a scalar
            if (!$parentNode->parentNode->parentNode) {
                $root = $parentNode->parentNode;
                $root->removeChild($parentNode);

                return $this->appendNode($root, $data, $xmlRootNodeName);
            }

            return $this->appendNode($parentNode, $data, 'data');
        }

        throw new UnexpectedValueException(sprintf('An unexpected value could not be serialized: %s', var_export($data, true)));
    }

    /**
     * Selects the type of node to create and appends it to the parent.
     *
     * @param \DOMNode     $parentNode
     * @param array|object $data
     * @param string       $nodeName
     * @param string       $key
     *
     * @return Boolean
     */
    private function appendNode(\DOMNode $parentNode, $data, $nodeName, $key = null)
    {
        $node = $this->dom->createElement($nodeName);
        if (null !== $key) {
            $node->setAttribute('key', $key);
        }
        $appendNode = $this->selectNodeType($node, $data);
        // we may have decided not to append this node, either in error or if its $nodeName is not valid
        if ($appendNode) {
            $parentNode->appendChild($node);
        }

        return $appendNode;
    }

    /**
     * Checks if a value contains any characters which would require CDATA wrapping.
     *
     * @param string $val
     *
     * @return Boolean
     */
    private function needsCdataWrapping($val)
    {
        return preg_match('/[<>&]/', $val);
    }

    /**
     * Tests the value being passed and decide what sort of element to create
     *
     * @param \DOMNode $node
     * @param mixed    $val
     *
     * @return Boolean
     */
    private function selectNodeType(\DOMNode $node, $val)
    {
        if (is_array($val)) {
            return $this->buildXml($node, $val);
        } elseif ($val instanceof \SimpleXMLElement) {
            $child = $this->dom->importNode(dom_import_simplexml($val), true);
            $node->appendChild($child);
        } elseif ($val instanceof \Traversable) {
            $this->buildXml($node, $val);
        } elseif (is_object($val)) {
            return $this->buildXml($node, $this->serializer->normalize($val, $this->format, $this->context));
        } elseif (is_numeric($val)) {
            return $this->appendText($node, (string) $val);
        } elseif (is_string($val) && $this->needsCdataWrapping($val)) {
            return $this->appendCData($node, $val);
        } elseif (is_string($val)) {
            return $this->appendText($node, $val);
        } elseif (is_bool($val)) {
            return $this->appendText($node, (int) $val);
        } elseif ($val instanceof \DOMNode) {
            $child = $this->dom->importNode($val, true);
            $node->appendChild($child);
        }

        return true;
    }

    /**
     * Get real XML root node name, taking serializer options into account.
     */
    private function resolveXmlRootName(array $context = array())
    {
        return isset($context['xml_root_node_name'])
            ? $context['xml_root_node_name']
            : $this->rootNodeName;
    }

    /**
     * Create a DOM document, taking serializer options into account.
     *
     * @param array $context options that the encoder has access to.
     *
     * @return \DOMDocument
     */
    private function createDomDocument(array $context)
    {
        $document = new \DOMDocument();

        // Set an attribute on the DOM document specifying, as part of the XML declaration,
        $xmlOptions = array(
            // the version number of the document
            'xml_version' => 'xmlVersion',
            // the encoding of the document
            'xml_encoding' => 'encoding',
            // whether the document is standalone
            'xml_standalone' => 'xmlStandalone',
        );
        foreach ($xmlOptions as $xmlOption => $documentProperty) {
            if (isset($context[$xmlOption])) {
                $document->$documentProperty = $context[$xmlOption];
            }
        }

        return $document;
    }
}
PK�`�\v:�hh8pear/Symfony/Component/Serializer/Encoder/JsonEncode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Encoder;

/**
 * Encodes JSON data
 *
 * @author Sander Coolen <sander@jibber.nl>
 */
class JsonEncode implements EncoderInterface
{
    private $options ;
    private $lastError = JSON_ERROR_NONE;

    public function __construct($bitmask = 0)
    {
        $this->options = $bitmask;
    }

    /**
     * Returns the last encoding error (if any)
     *
     * @return integer
     *
     * @see http://php.net/manual/en/function.json-last-error.php json_last_error
     */
    public function getLastError()
    {
        return $this->lastError;
    }

    /**
     * Encodes PHP data to a JSON string
     *
     * {@inheritdoc}
     */
    public function encode($data, $format, array $context = array())
    {
        $context = $this->resolveContext($context);

        $encodedJson = json_encode($data, $context['json_encode_options']);
        $this->lastError = json_last_error();

        return $encodedJson;
    }

    /**
     * {@inheritdoc}
     */
    public function supportsEncoding($format)
    {
        return JsonEncoder::FORMAT === $format;
    }

    /**
     * Merge default json encode options with context.
     *
     * @param array $context
     * @return array
     */
    private function resolveContext(array $context = array())
    {
        return array_merge(array('json_encode_options' => $this->options), $context);
    }
}
PK�`�\V��O��:pear/Symfony/Component/Serializer/Encoder/ChainDecoder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Encoder;

use Symfony\Component\Serializer\Exception\RuntimeException;

/**
 * Decoder delegating the decoding to a chain of decoders.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Lukas Kahwe Smith <smith@pooteeweet.org>
 */
class ChainDecoder implements DecoderInterface
{
    protected $decoders = array();
    protected $decoderByFormat = array();

    public function __construct(array $decoders = array())
    {
        $this->decoders = $decoders;
    }

    /**
     * {@inheritdoc}
     */
    final public function decode($data, $format, array $context = array())
    {
        return $this->getDecoder($format)->decode($data, $format, $context);
    }

    /**
     * {@inheritdoc}
     */
    public function supportsDecoding($format)
    {
        try {
            $this->getDecoder($format);
        } catch (RuntimeException $e) {
            return false;
        }

        return true;
    }

    /**
     * Gets the decoder supporting the format.
     *
     * @param string $format
     *
     * @return DecoderInterface
     * @throws RuntimeException if no decoder is found
     */
    private function getDecoder($format)
    {
        if (isset($this->decoderByFormat[$format])
            && isset($this->decoders[$this->decoderByFormat[$format]])
        ) {
            return $this->decoders[$this->decoderByFormat[$format]];
        }

        foreach ($this->decoders as $i => $decoder) {
            if ($decoder->supportsDecoding($format)) {
                $this->decoderByFormat[$format] = $i;

                return $decoder;
            }
        }

        throw new RuntimeException(sprintf('No decoder found for format "%s".', $format));
    }
}
PK�`�\S R�	�	:pear/Symfony/Component/Serializer/Encoder/ChainEncoder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Serializer\Encoder;

use Symfony\Component\Serializer\Exception\RuntimeException;

/**
 * Encoder delegating the decoding to a chain of encoders.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 * @author Lukas Kahwe Smith <smith@pooteeweet.org>
 */
class ChainEncoder implements EncoderInterface
{
    protected $encoders = array();
    protected $encoderByFormat = array();

    public function __construct(array $encoders = array())
    {
        $this->encoders = $encoders;
    }

    /**
     * {@inheritdoc}
     */
    final public function encode($data, $format, array $context = array())
    {
        return $this->getEncoder($format)->encode($data, $format, $context);
    }

    /**
     * {@inheritdoc}
     */
    public function supportsEncoding($format)
    {
        try {
            $this->getEncoder($format);
        } catch (RuntimeException $e) {
            return false;
        }

        return true;
    }

    /**
     * Checks whether the normalization is needed for the given format.
     *
     * @param string $format
     *
     * @return Boolean
     */
    public function needsNormalization($format)
    {
        $encoder = $this->getEncoder($format);

        if (!$encoder instanceof NormalizationAwareInterface) {
            return true;
        }

        if ($encoder instanceof self) {
            return $encoder->needsNormalization($format);
        }

        return false;
    }

    /**
     * Gets the encoder supporting the format.
     *
     * @param string $format
     *
     * @return EncoderInterface
     * @throws RuntimeException if no encoder is found
     */
    private function getEncoder($format)
    {
        if (isset($this->encoderByFormat[$format])
            && isset($this->encoders[$this->encoderByFormat[$format]])
        ) {
            return $this->encoders[$this->encoderByFormat[$format]];
        }

        foreach ($this->encoders as $i => $encoder) {
            if ($encoder->supportsEncoding($format)) {
                $this->encoderByFormat[$format] = $i;

                return $encoder;
            }
        }

        throw new RuntimeException(sprintf('No encoder found for format "%s".', $format));
    }
}
PK�`�\�g@Mbb&pear/Symfony/Component/Finder/Glob.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder;

/**
 * Glob matches globbing patterns against text.
 *
 *   if match_glob("foo.*", "foo.bar") echo "matched\n";
 *
 * // prints foo.bar and foo.baz
 * $regex = glob_to_regex("foo.*");
 * for (array('foo.bar', 'foo.baz', 'foo', 'bar') as $t)
 * {
 *   if (/$regex/) echo "matched: $car\n";
 * }
 *
 * Glob implements glob(3) style matching that can be used to match
 * against text, rather than fetching names from a filesystem.
 *
 * Based on the Perl Text::Glob module.
 *
 * @author Fabien Potencier <fabien@symfony.com> PHP port
 * @author     Richard Clamp <richardc@unixbeard.net> Perl version
 * @copyright  2004-2005 Fabien Potencier <fabien@symfony.com>
 * @copyright  2002 Richard Clamp <richardc@unixbeard.net>
 */
class Glob
{
    /**
     * Returns a regexp which is the equivalent of the glob pattern.
     *
     * @param string  $glob                The glob pattern
     * @param Boolean $strictLeadingDot
     * @param Boolean $strictWildcardSlash
     *
     * @return string regex The regexp
     */
    public static function toRegex($glob, $strictLeadingDot = true, $strictWildcardSlash = true)
    {
        $firstByte = true;
        $escaping = false;
        $inCurlies = 0;
        $regex = '';
        $sizeGlob = strlen($glob);
        for ($i = 0; $i < $sizeGlob; $i++) {
            $car = $glob[$i];
            if ($firstByte) {
                if ($strictLeadingDot && '.' !== $car) {
                    $regex .= '(?=[^\.])';
                }

                $firstByte = false;
            }

            if ('/' === $car) {
                $firstByte = true;
            }

            if ('.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car) {
                $regex .= "\\$car";
            } elseif ('*' === $car) {
                $regex .= $escaping ? '\\*' : ($strictWildcardSlash ? '[^/]*' : '.*');
            } elseif ('?' === $car) {
                $regex .= $escaping ? '\\?' : ($strictWildcardSlash ? '[^/]' : '.');
            } elseif ('{' === $car) {
                $regex .= $escaping ? '\\{' : '(';
                if (!$escaping) {
                    ++$inCurlies;
                }
            } elseif ('}' === $car && $inCurlies) {
                $regex .= $escaping ? '}' : ')';
                if (!$escaping) {
                    --$inCurlies;
                }
            } elseif (',' === $car && $inCurlies) {
                $regex .= $escaping ? ',' : '|';
            } elseif ('\\' === $car) {
                if ($escaping) {
                    $regex .= '\\\\';
                    $escaping = false;
                } else {
                    $escaping = true;
                }

                continue;
            } else {
                $regex .= $car;
            }
            $escaping = false;
        }

        return '#^'.$regex.'$#';
    }
}
PK�`�\�d�V�V(pear/Symfony/Component/Finder/Finder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder;

use Symfony\Component\Finder\Adapter\AdapterInterface;
use Symfony\Component\Finder\Adapter\GnuFindAdapter;
use Symfony\Component\Finder\Adapter\BsdFindAdapter;
use Symfony\Component\Finder\Adapter\PhpAdapter;
use Symfony\Component\Finder\Exception\ExceptionInterface;

/**
 * Finder allows to build rules to find files and directories.
 *
 * It is a thin wrapper around several specialized iterator classes.
 *
 * All rules may be invoked several times.
 *
 * All methods return the current Finder object to allow easy chaining:
 *
 * $finder = Finder::create()->files()->name('*.php')->in(__DIR__);
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Finder implements \IteratorAggregate, \Countable
{
    const IGNORE_VCS_FILES = 1;
    const IGNORE_DOT_FILES = 2;

    private $mode        = 0;
    private $names       = array();
    private $notNames    = array();
    private $exclude     = array();
    private $filters     = array();
    private $depths      = array();
    private $sizes       = array();
    private $followLinks = false;
    private $sort        = false;
    private $ignore      = 0;
    private $dirs        = array();
    private $dates       = array();
    private $iterators   = array();
    private $contains    = array();
    private $notContains = array();
    private $adapters    = array();
    private $paths       = array();
    private $notPaths    = array();
    private $ignoreUnreadableDirs = false;

    private static $vcsPatterns = array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg');

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->ignore = static::IGNORE_VCS_FILES | static::IGNORE_DOT_FILES;

        $this
            ->addAdapter(new GnuFindAdapter())
            ->addAdapter(new BsdFindAdapter())
            ->addAdapter(new PhpAdapter(), -50)
            ->setAdapter('php')
        ;
    }

    /**
     * Creates a new Finder.
     *
     * @return Finder A new Finder instance
     *
     * @api
     */
    public static function create()
    {
        return new static();
    }

    /**
     * Registers a finder engine implementation.
     *
     * @param AdapterInterface $adapter  An adapter instance
     * @param integer          $priority Highest is selected first
     *
     * @return Finder The current Finder instance
     */
    public function addAdapter(Adapter\AdapterInterface $adapter, $priority = 0)
    {
        $this->adapters[$adapter->getName()] = array(
            'adapter'  => $adapter,
            'priority' => $priority,
            'selected' => false,
        );

        return $this->sortAdapters();
    }

    /**
     * Sets the selected adapter to the best one according to the current platform the code is run on.
     *
     * @return Finder The current Finder instance
     */
    public function useBestAdapter()
    {
        $this->resetAdapterSelection();

        return $this->sortAdapters();
    }

    /**
     * Selects the adapter to use.
     *
     * @param string $name
     *
     * @throws \InvalidArgumentException
     *
     * @return Finder The current Finder instance
     */
    public function setAdapter($name)
    {
        if (!isset($this->adapters[$name])) {
            throw new \InvalidArgumentException(sprintf('Adapter "%s" does not exist.', $name));
        }

        $this->resetAdapterSelection();
        $this->adapters[$name]['selected'] = true;

        return $this->sortAdapters();
    }

    /**
     * Removes all adapters registered in the finder.
     *
     * @return Finder The current Finder instance
     */
    public function removeAdapters()
    {
        $this->adapters = array();

        return $this;
    }

    /**
     * Returns registered adapters ordered by priority without extra information.
     *
     * @return AdapterInterface[]
     */
    public function getAdapters()
    {
        return array_values(array_map(function (array $adapter) {
            return $adapter['adapter'];
        }, $this->adapters));
    }

    /**
     * Restricts the matching to directories only.
     *
     * @return Finder The current Finder instance
     *
     * @api
     */
    public function directories()
    {
        $this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES;

        return $this;
    }

    /**
     * Restricts the matching to files only.
     *
     * @return Finder The current Finder instance
     *
     * @api
     */
    public function files()
    {
        $this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES;

        return $this;
    }

    /**
     * Adds tests for the directory depth.
     *
     * Usage:
     *
     *   $finder->depth('> 1') // the Finder will start matching at level 1.
     *   $finder->depth('< 3') // the Finder will descend at most 3 levels of directories below the starting point.
     *
     * @param int $level The depth level expression
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\DepthRangeFilterIterator
     * @see Symfony\Component\Finder\Comparator\NumberComparator
     *
     * @api
     */
    public function depth($level)
    {
        $this->depths[] = new Comparator\NumberComparator($level);

        return $this;
    }

    /**
     * Adds tests for file dates (last modified).
     *
     * The date must be something that strtotime() is able to parse:
     *
     *   $finder->date('since yesterday');
     *   $finder->date('until 2 days ago');
     *   $finder->date('> now - 2 hours');
     *   $finder->date('>= 2005-10-15');
     *
     * @param string $date A date rage string
     *
     * @return Finder The current Finder instance
     *
     * @see strtotime
     * @see Symfony\Component\Finder\Iterator\DateRangeFilterIterator
     * @see Symfony\Component\Finder\Comparator\DateComparator
     *
     * @api
     */
    public function date($date)
    {
        $this->dates[] = new Comparator\DateComparator($date);

        return $this;
    }

    /**
     * Adds rules that files must match.
     *
     * You can use patterns (delimited with / sign), globs or simple strings.
     *
     * $finder->name('*.php')
     * $finder->name('/\.php$/') // same as above
     * $finder->name('test.php')
     *
     * @param string $pattern A pattern (a regexp, a glob, or a string)
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\FilenameFilterIterator
     *
     * @api
     */
    public function name($pattern)
    {
        $this->names[] = $pattern;

        return $this;
    }

    /**
     * Adds rules that files must not match.
     *
     * @param string $pattern A pattern (a regexp, a glob, or a string)
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\FilenameFilterIterator
     *
     * @api
     */
    public function notName($pattern)
    {
        $this->notNames[] = $pattern;

        return $this;
    }

    /**
     * Adds tests that file contents must match.
     *
     * Strings or PCRE patterns can be used:
     *
     * $finder->contains('Lorem ipsum')
     * $finder->contains('/Lorem ipsum/i')
     *
     * @param string $pattern A pattern (string or regexp)
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\FilecontentFilterIterator
     */
    public function contains($pattern)
    {
        $this->contains[] = $pattern;

        return $this;
    }

    /**
     * Adds tests that file contents must not match.
     *
     * Strings or PCRE patterns can be used:
     *
     * $finder->notContains('Lorem ipsum')
     * $finder->notContains('/Lorem ipsum/i')
     *
     * @param string $pattern A pattern (string or regexp)
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\FilecontentFilterIterator
     */
    public function notContains($pattern)
    {
        $this->notContains[] = $pattern;

        return $this;
    }

    /**
     * Adds rules that filenames must match.
     *
     * You can use patterns (delimited with / sign) or simple strings.
     *
     * $finder->path('some/special/dir')
     * $finder->path('/some\/special\/dir/') // same as above
     *
     * Use only / as dirname separator.
     *
     * @param string $pattern A pattern (a regexp or a string)
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\FilenameFilterIterator
     */
    public function path($pattern)
    {
        $this->paths[] = $pattern;

        return $this;
    }

    /**
     * Adds rules that filenames must not match.
     *
     * You can use patterns (delimited with / sign) or simple strings.
     *
     * $finder->notPath('some/special/dir')
     * $finder->notPath('/some\/special\/dir/') // same as above
     *
     * Use only / as dirname separator.
     *
     * @param string $pattern A pattern (a regexp or a string)
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\FilenameFilterIterator
     */
    public function notPath($pattern)
    {
        $this->notPaths[] = $pattern;

        return $this;
    }

    /**
     * Adds tests for file sizes.
     *
     * $finder->size('> 10K');
     * $finder->size('<= 1Ki');
     * $finder->size(4);
     *
     * @param string $size A size range string
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\SizeRangeFilterIterator
     * @see Symfony\Component\Finder\Comparator\NumberComparator
     *
     * @api
     */
    public function size($size)
    {
        $this->sizes[] = new Comparator\NumberComparator($size);

        return $this;
    }

    /**
     * Excludes directories.
     *
     * @param string|array $dirs A directory path or an array of directories
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator
     *
     * @api
     */
    public function exclude($dirs)
    {
        $this->exclude = array_merge($this->exclude, (array) $dirs);

        return $this;
    }

    /**
     * Excludes "hidden" directories and files (starting with a dot).
     *
     * @param Boolean $ignoreDotFiles Whether to exclude "hidden" files or not
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator
     *
     * @api
     */
    public function ignoreDotFiles($ignoreDotFiles)
    {
        if ($ignoreDotFiles) {
            $this->ignore = $this->ignore | static::IGNORE_DOT_FILES;
        } else {
            $this->ignore = $this->ignore & ~static::IGNORE_DOT_FILES;
        }

        return $this;
    }

    /**
     * Forces the finder to ignore version control directories.
     *
     * @param Boolean $ignoreVCS Whether to exclude VCS files or not
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator
     *
     * @api
     */
    public function ignoreVCS($ignoreVCS)
    {
        if ($ignoreVCS) {
            $this->ignore = $this->ignore | static::IGNORE_VCS_FILES;
        } else {
            $this->ignore = $this->ignore & ~static::IGNORE_VCS_FILES;
        }

        return $this;
    }

    /**
     * Adds VCS patterns.
     *
     * @see ignoreVCS
     *
     * @param string|string[] $pattern VCS patterns to ignore
     */
    public static function addVCSPattern($pattern)
    {
        foreach ((array) $pattern as $p) {
            self::$vcsPatterns[] = $p;
        }

        self::$vcsPatterns = array_unique(self::$vcsPatterns);
    }

    /**
     * Sorts files and directories by an anonymous function.
     *
     * The anonymous function receives two \SplFileInfo instances to compare.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @param \Closure $closure An anonymous function
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\SortableIterator
     *
     * @api
     */
    public function sort(\Closure $closure)
    {
        $this->sort = $closure;

        return $this;
    }

    /**
     * Sorts files and directories by name.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\SortableIterator
     *
     * @api
     */
    public function sortByName()
    {
        $this->sort = Iterator\SortableIterator::SORT_BY_NAME;

        return $this;
    }

    /**
     * Sorts files and directories by type (directories before files), then by name.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\SortableIterator
     *
     * @api
     */
    public function sortByType()
    {
        $this->sort = Iterator\SortableIterator::SORT_BY_TYPE;

        return $this;
    }

    /**
     * Sorts files and directories by the last accessed time.
     *
     * This is the time that the file was last accessed, read or written to.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\SortableIterator
     *
     * @api
     */
    public function sortByAccessedTime()
    {
        $this->sort = Iterator\SortableIterator::SORT_BY_ACCESSED_TIME;

        return $this;
    }

    /**
     * Sorts files and directories by the last inode changed time.
     *
     * This is the time that the inode information was last modified (permissions, owner, group or other metadata).
     *
     * On Windows, since inode is not available, changed time is actually the file creation time.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\SortableIterator
     *
     * @api
     */
    public function sortByChangedTime()
    {
        $this->sort = Iterator\SortableIterator::SORT_BY_CHANGED_TIME;

        return $this;
    }

    /**
     * Sorts files and directories by the last modified time.
     *
     * This is the last time the actual contents of the file were last modified.
     *
     * This can be slow as all the matching files and directories must be retrieved for comparison.
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\SortableIterator
     *
     * @api
     */
    public function sortByModifiedTime()
    {
        $this->sort = Iterator\SortableIterator::SORT_BY_MODIFIED_TIME;

        return $this;
    }

    /**
     * Filters the iterator with an anonymous function.
     *
     * The anonymous function receives a \SplFileInfo and must return false
     * to remove files.
     *
     * @param \Closure $closure An anonymous function
     *
     * @return Finder The current Finder instance
     *
     * @see Symfony\Component\Finder\Iterator\CustomFilterIterator
     *
     * @api
     */
    public function filter(\Closure $closure)
    {
        $this->filters[] = $closure;

        return $this;
    }

    /**
     * Forces the following of symlinks.
     *
     * @return Finder The current Finder instance
     *
     * @api
     */
    public function followLinks()
    {
        $this->followLinks = true;

        return $this;
    }

    /**
     * Tells finder to ignore unreadable directories.
     *
     * By default, scanning unreadable directories content throws an AccessDeniedException.
     *
     * @param boolean $ignore
     *
     * @return Finder The current Finder instance
     */
    public function ignoreUnreadableDirs($ignore = true)
    {
        $this->ignoreUnreadableDirs = (Boolean) $ignore;

        return $this;
    }

    /**
     * Searches files and directories which match defined rules.
     *
     * @param string|array $dirs A directory path or an array of directories
     *
     * @return Finder The current Finder instance
     *
     * @throws \InvalidArgumentException if one of the directories does not exist
     *
     * @api
     */
    public function in($dirs)
    {
        $resolvedDirs = array();

        foreach ((array) $dirs as $dir) {
            if (is_dir($dir)) {
                $resolvedDirs[] = $dir;
            } elseif ($glob = glob($dir, GLOB_ONLYDIR)) {
                $resolvedDirs = array_merge($resolvedDirs, $glob);
            } else {
                throw new \InvalidArgumentException(sprintf('The "%s" directory does not exist.', $dir));
            }
        }

        $this->dirs = array_merge($this->dirs, $resolvedDirs);

        return $this;
    }

    /**
     * Returns an Iterator for the current Finder configuration.
     *
     * This method implements the IteratorAggregate interface.
     *
     * @return \Iterator An iterator
     *
     * @throws \LogicException if the in() method has not been called
     */
    public function getIterator()
    {
        if (0 === count($this->dirs) && 0 === count($this->iterators)) {
            throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.');
        }

        if (1 === count($this->dirs) && 0 === count($this->iterators)) {
            return $this->searchInDirectory($this->dirs[0]);
        }

        $iterator = new \AppendIterator();
        foreach ($this->dirs as $dir) {
            $iterator->append($this->searchInDirectory($dir));
        }

        foreach ($this->iterators as $it) {
            $iterator->append($it);
        }

        return $iterator;
    }

    /**
     * Appends an existing set of files/directories to the finder.
     *
     * The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array.
     *
     * @param mixed $iterator
     *
     * @return Finder The finder
     *
     * @throws \InvalidArgumentException When the given argument is not iterable.
     */
    public function append($iterator)
    {
        if ($iterator instanceof \IteratorAggregate) {
            $this->iterators[] = $iterator->getIterator();
        } elseif ($iterator instanceof \Iterator) {
            $this->iterators[] = $iterator;
        } elseif ($iterator instanceof \Traversable || is_array($iterator)) {
            $it = new \ArrayIterator();
            foreach ($iterator as $file) {
                $it->append($file instanceof \SplFileInfo ? $file : new \SplFileInfo($file));
            }
            $this->iterators[] = $it;
        } else {
            throw new \InvalidArgumentException('Finder::append() method wrong argument type.');
        }

        return $this;
    }

    /**
     * Counts all the results collected by the iterators.
     *
     * @return int
     */
    public function count()
    {
        return iterator_count($this->getIterator());
    }

    /**
     * @return Finder The current Finder instance
     */
    private function sortAdapters()
    {
        uasort($this->adapters, function (array $a, array $b) {
            if ($a['selected'] || $b['selected']) {
                return $a['selected'] ? -1 : 1;
            }

            return $a['priority'] > $b['priority'] ? -1 : 1;
        });

        return $this;
    }

    /**
     * @param $dir
     *
     * @return \Iterator
     *
     * @throws \RuntimeException When none of the adapters are supported
     */
    private function searchInDirectory($dir)
    {
        if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) {
            $this->exclude = array_merge($this->exclude, self::$vcsPatterns);
        }

        if (static::IGNORE_DOT_FILES === (static::IGNORE_DOT_FILES & $this->ignore)) {
            $this->notPaths[] = '#(^|/)\..+(/|$)#';
        }

        foreach ($this->adapters as $adapter) {
            if ($adapter['adapter']->isSupported()) {
                try {
                    return $this
                        ->buildAdapter($adapter['adapter'])
                        ->searchInDirectory($dir);
                } catch (ExceptionInterface $e) {}
            }
        }

        throw new \RuntimeException('No supported adapter found.');
    }

    /**
     * @param AdapterInterface $adapter
     *
     * @return AdapterInterface
     */
    private function buildAdapter(AdapterInterface $adapter)
    {
        return $adapter
            ->setFollowLinks($this->followLinks)
            ->setDepths($this->depths)
            ->setMode($this->mode)
            ->setExclude($this->exclude)
            ->setNames($this->names)
            ->setNotNames($this->notNames)
            ->setContains($this->contains)
            ->setNotContains($this->notContains)
            ->setSizes($this->sizes)
            ->setDates($this->dates)
            ->setFilters($this->filters)
            ->setSort($this->sort)
            ->setPath($this->paths)
            ->setNotPath($this->notPaths)
            ->ignoreUnreadableDirs($this->ignoreUnreadableDirs);
    }

    /**
     * Unselects all adapters.
     */
    private function resetAdapterSelection()
    {
        $this->adapters = array_map(function (array $properties) {
            $properties['selected'] = false;

            return $properties;
        }, $this->adapters);
    }
}
PK�`�\%uM�PP,pear/Symfony/Component/Finder/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Finder\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�`�\P�����Ipear/Symfony/Component/Finder/Exception/OperationNotPermitedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Exception;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class OperationNotPermitedException extends AdapterFailureException
{
}
PK�`�\�cWޫ�Apear/Symfony/Component/Finder/Exception/AccessDeniedException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Exception;

/**
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class AccessDeniedException extends \UnexpectedValueException
{
}
PK�`�\�7��>pear/Symfony/Component/Finder/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Exception;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
interface ExceptionInterface
{
    /**
     * @return \Symfony\Component\Finder\Adapter\AdapterInterface
     */
    public function getAdapter();
}
PK�`�\��99Hpear/Symfony/Component/Finder/Exception/ShellCommandFailureException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Exception;

use Symfony\Component\Finder\Adapter\AdapterInterface;
use Symfony\Component\Finder\Shell\Command;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class ShellCommandFailureException extends AdapterFailureException
{
    /**
     * @var Command
     */
    private $command;

    /**
     * @param AdapterInterface $adapter
     * @param Command          $command
     * @param \Exception|null  $previous
     */
    public function __construct(AdapterInterface $adapter, Command $command, \Exception $previous = null)
    {
        $this->command = $command;
        parent::__construct($adapter, 'Shell command failed: "'.$command->join().'".', $previous);
    }

    /**
     * @return Command
     */
    public function getCommand()
    {
        return $this->command;
    }
}
PK�`�\>�@��Cpear/Symfony/Component/Finder/Exception/AdapterFailureException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Exception;

use Symfony\Component\Finder\Adapter\AdapterInterface;

/**
 * Base exception for all adapter failures.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class AdapterFailureException extends \RuntimeException implements ExceptionInterface
{
    /**
     * @var \Symfony\Component\Finder\Adapter\AdapterInterface
     */
    private $adapter;

    /**
     * @param AdapterInterface $adapter
     * @param string|null      $message
     * @param \Exception|null  $previous
     */
    public function __construct(AdapterInterface $adapter, $message = null, \Exception $previous = null)
    {
        $this->adapter = $adapter;
        parent::__construct($message ?: 'Search failed with "'.$adapter->getName().'" adapter.', $previous);
    }

    /**
     * {@inheritdoc}
     */
    public function getAdapter()
    {
        return $this->adapter;
    }
}
PK�`�\5��K��/pear/Symfony/Component/Finder/Shell/Command.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Shell;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class Command
{
    /**
     * @var Command|null
     */
    private $parent;

    /**
     * @var array
     */
    private $bits = array();

    /**
     * @var array
     */
    private $labels = array();

    /**
     * @var \Closure|null
     */
    private $errorHandler;

    /**
     * Constructor.
     *
     * @param Command|null $parent Parent command
     */
    public function __construct(Command $parent = null)
    {
        $this->parent = $parent;
    }

    /**
     * Returns command as string.
     *
     * @return string
     */
    public function __toString()
    {
        return $this->join();
    }

    /**
     * Creates a new Command instance.
     *
     * @param Command|null $parent Parent command
     *
     * @return Command New Command instance
     */
    public static function create(Command $parent = null)
    {
        return new self($parent);
    }

    /**
     * Escapes special chars from input.
     *
     * @param string $input A string to escape
     *
     * @return string The escaped string
     */
    public static function escape($input)
    {
        return escapeshellcmd($input);
    }

    /**
     * Quotes input.
     *
     * @param string $input An argument string
     *
     * @return string The quoted string
     */
    public static function quote($input)
    {
        return escapeshellarg($input);
    }

    /**
     * Appends a string or a Command instance.
     *
     * @param string|Command $bit
     *
     * @return Command The current Command instance
     */
    public function add($bit)
    {
        $this->bits[] = $bit;

        return $this;
    }

    /**
     * Prepends a string or a command instance.
     *
     * @param string|Command $bit
     *
     * @return Command The current Command instance
     */
    public function top($bit)
    {
        array_unshift($this->bits, $bit);

        foreach ($this->labels as $label => $index) {
            $this->labels[$label] += 1;
        }

        return $this;
    }

    /**
     * Appends an argument, will be quoted.
     *
     * @param string $arg
     *
     * @return Command The current Command instance
     */
    public function arg($arg)
    {
        $this->bits[] = self::quote($arg);

        return $this;
    }

    /**
     * Appends escaped special command chars.
     *
     * @param string $esc
     *
     * @return Command The current Command instance
     */
    public function cmd($esc)
    {
        $this->bits[] = self::escape($esc);

        return $this;
    }

    /**
     * Inserts a labeled command to feed later.
     *
     * @param string $label The unique label
     *
     * @return Command The current Command instance
     *
     * @throws \RuntimeException If label already exists
     */
    public function ins($label)
    {
        if (isset($this->labels[$label])) {
            throw new \RuntimeException(sprintf('Label "%s" already exists.', $label));
        }

        $this->bits[] = self::create($this);
        $this->labels[$label] = count($this->bits)-1;

        return $this->bits[$this->labels[$label]];
    }

    /**
     * Retrieves a previously labeled command.
     *
     * @param string $label
     *
     * @return Command The labeled command
     *
     * @throws \RuntimeException
     */
    public function get($label)
    {
        if (!isset($this->labels[$label])) {
            throw new \RuntimeException(sprintf('Label "%s" does not exist.', $label));
        }

        return $this->bits[$this->labels[$label]];
    }

    /**
     * Returns parent command (if any).
     *
     * @return Command Parent command
     *
     * @throws \RuntimeException If command has no parent
     */
    public function end()
    {
        if (null === $this->parent) {
            throw new \RuntimeException('Calling end on root command doesn\'t make sense.');
        }

        return $this->parent;
    }

    /**
     * Counts bits stored in command.
     *
     * @return int The bits count
     */
    public function length()
    {
        return count($this->bits);
    }

    /**
     * @param \Closure $errorHandler
     *
     * @return Command
     */
    public function setErrorHandler(\Closure $errorHandler)
    {
        $this->errorHandler = $errorHandler;

        return $this;
    }

    /**
     * @return \Closure|null
     */
    public function getErrorHandler()
    {
        return $this->errorHandler;
    }

    /**
     * Executes current command.
     *
     * @return array The command result
     *
     * @throws \RuntimeException
     */
    public function execute()
    {
        if (null === $this->errorHandler) {
            exec($this->join(), $output);
        } else {
            $process = proc_open($this->join(), array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $pipes);
            $output = preg_split('~(\r\n|\r|\n)~', stream_get_contents($pipes[1]), -1, PREG_SPLIT_NO_EMPTY);

            if ($error = stream_get_contents($pipes[2])) {
                call_user_func($this->errorHandler, $error);
            }

            proc_close($process);
        }

        return $output ?: array();
    }

    /**
     * Joins bits.
     *
     * @return string
     */
    public function join()
    {
        return implode(' ', array_filter(
            array_map(function ($bit) {
                return $bit instanceof Command ? $bit->join() : ($bit ?: null);
            }, $this->bits),
            function ($bit) { return null !== $bit; }
        ));
    }

    /**
     * Insert a string or a Command instance before the bit at given position $index (index starts from 0).
     *
     * @param string|Command $bit
     * @param integer        $index
     *
     * @return Command The current Command instance
     */
    public function addAtIndex($bit, $index)
    {
        array_splice($this->bits, $index, 0, $bit);

        return $this;
    }
}
PK�`�\�4˵��-pear/Symfony/Component/Finder/Shell/Shell.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Shell;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class Shell
{
    const TYPE_UNIX    = 1;
    const TYPE_DARWIN  = 2;
    const TYPE_CYGWIN  = 3;
    const TYPE_WINDOWS = 4;
    const TYPE_BSD     = 5;

    /**
     * @var string|null
     */
    private $type;

    /**
     * Returns guessed OS type.
     *
     * @return int
     */
    public function getType()
    {
        if (null === $this->type) {
            $this->type = $this->guessType();
        }

        return $this->type;
    }

    /**
     * Tests if a command is available.
     *
     * @param string $command
     *
     * @return bool
     */
    public function testCommand($command)
    {
        if (self::TYPE_WINDOWS === $this->type) {
            // todo: find a way to test if Windows command exists
            return false;
        }

        if (!function_exists('exec')) {
            return false;
        }

        // todo: find a better way (command could not be available)
        exec('command -v '.$command, $output, $code);

        return 0 === $code && count($output) > 0;
    }

    /**
     * Guesses OS type.
     *
     * @return int
     */
    private function guessType()
    {
        $os = strtolower(PHP_OS);

        if (false !== strpos($os, 'cygwin')) {
            return self::TYPE_CYGWIN;
        }

        if (false !== strpos($os, 'darwin')) {
            return self::TYPE_DARWIN;
        }

        if (false !== strpos($os, 'bsd')) {
            return self::TYPE_BSD;
        }

        if (0 === strpos($os, 'win')) {
            return self::TYPE_WINDOWS;
        }

        return self::TYPE_UNIX;
    }
}
PK�`�\�5�9-pear/Symfony/Component/Finder/SplFileInfo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder;

/**
 * Extends \SplFileInfo to support relative paths
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SplFileInfo extends \SplFileInfo
{
    private $relativePath;
    private $relativePathname;

    /**
     * Constructor
     *
     * @param string $file             The file name
     * @param string $relativePath     The relative path
     * @param string $relativePathname The relative path name
     */
    public function __construct($file, $relativePath, $relativePathname)
    {
        parent::__construct($file);
        $this->relativePath = $relativePath;
        $this->relativePathname = $relativePathname;
    }

    /**
     * Returns the relative path
     *
     * @return string the relative path
     */
    public function getRelativePath()
    {
        return $this->relativePath;
    }

    /**
     * Returns the relative path name
     *
     * @return string the relative path name
     */
    public function getRelativePathname()
    {
        return $this->relativePathname;
    }

    /**
     * Returns the contents of the file
     *
     * @return string the contents of the file
     *
     * @throws \RuntimeException
     */
    public function getContents()
    {
        $level = error_reporting(0);
        $content = file_get_contents($this->getPathname());
        error_reporting($level);
        if (false === $content) {
            $error = error_get_last();
            throw new \RuntimeException($error['message']);
        }

        return $content;
    }
}
PK�`�\�E�1pear/Symfony/Component/Finder/Expression/Glob.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Expression;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class Glob implements ValueInterface
{
    /**
     * @var string
     */
    private $pattern;

    /**
     * @param string $pattern
     */
    public function __construct($pattern)
    {
        $this->pattern = $pattern;
    }

    /**
     * {@inheritdoc}
     */
    public function render()
    {
        return $this->pattern;
    }

    /**
     * {@inheritdoc}
     */
    public function renderPattern()
    {
        return $this->pattern;
    }

    /**
     * {@inheritdoc}
     */
    public function getType()
    {
        return Expression::TYPE_GLOB;
    }

    /**
     * {@inheritdoc}
     */
    public function isCaseSensitive()
    {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function prepend($expr)
    {
        $this->pattern = $expr.$this->pattern;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function append($expr)
    {
        $this->pattern .= $expr;

        return $this;
    }

    /**
     * Tests if glob is expandable ("*.{a,b}" syntax).
     *
     * @return bool
     */
    public function isExpandable()
    {
        return false !== strpos($this->pattern, '{')
            && false !== strpos($this->pattern, '}');
    }

    /**
     * @param bool $strictLeadingDot
     * @param bool $strictWildcardSlash
     *
     * @return Regex
     */
    public function toRegex($strictLeadingDot = true, $strictWildcardSlash = true)
    {
        $firstByte = true;
        $escaping = false;
        $inCurlies = 0;
        $regex = '';
        $sizeGlob = strlen($this->pattern);
        for ($i = 0; $i < $sizeGlob; $i++) {
            $car = $this->pattern[$i];
            if ($firstByte) {
                if ($strictLeadingDot && '.' !== $car) {
                    $regex .= '(?=[^\.])';
                }

                $firstByte = false;
            }

            if ('/' === $car) {
                $firstByte = true;
            }

            if ('.' === $car || '(' === $car || ')' === $car || '|' === $car || '+' === $car || '^' === $car || '$' === $car) {
                $regex .= "\\$car";
            } elseif ('*' === $car) {
                $regex .= $escaping ? '\\*' : ($strictWildcardSlash ? '[^/]*' : '.*');
            } elseif ('?' === $car) {
                $regex .= $escaping ? '\\?' : ($strictWildcardSlash ? '[^/]' : '.');
            } elseif ('{' === $car) {
                $regex .= $escaping ? '\\{' : '(';
                if (!$escaping) {
                    ++$inCurlies;
                }
            } elseif ('}' === $car && $inCurlies) {
                $regex .= $escaping ? '}' : ')';
                if (!$escaping) {
                    --$inCurlies;
                }
            } elseif (',' === $car && $inCurlies) {
                $regex .= $escaping ? ',' : '|';
            } elseif ('\\' === $car) {
                if ($escaping) {
                    $regex .= '\\\\';
                    $escaping = false;
                } else {
                    $escaping = true;
                }

                continue;
            } else {
                $regex .= $car;
            }
            $escaping = false;
        }

        return new Regex('^'.$regex.'$');
    }
}
PK�`�\��(�2pear/Symfony/Component/Finder/Expression/Regex.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Expression;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class Regex implements ValueInterface
{
    const START_FLAG = '^';
    const END_FLAG   = '$';
    const BOUNDARY   = '~';
    const JOKER      = '.*';
    const ESCAPING   = '\\';

    /**
     * @var string
     */
    private $pattern;

    /**
     * @var array
     */
    private $options;

    /**
     * @var bool
     */
    private $startFlag;

    /**
     * @var bool
     */
    private $endFlag;

    /**
     * @var bool
     */
    private $startJoker;

    /**
     * @var bool
     */
    private $endJoker;

    /**
     * @param string $expr
     *
     * @return Regex
     *
     * @throws \InvalidArgumentException
     */
    public static function create($expr)
    {
        if (preg_match('/^(.{3,}?)([imsxuADU]*)$/', $expr, $m)) {
            $start = substr($m[1], 0, 1);
            $end   = substr($m[1], -1);

            if (
                ($start === $end && !preg_match('/[*?[:alnum:] \\\\]/', $start))
                || ($start === '{' && $end === '}')
                || ($start === '(' && $end === ')')
            ) {
                return new self(substr($m[1], 1, -1), $m[2], $end);
            }
        }

        throw new \InvalidArgumentException('Given expression is not a regex.');
    }

    /**
     * @param string $pattern
     * @param string $options
     * @param string $delimiter
     */
    public function __construct($pattern, $options = '', $delimiter = null)
    {
        if (null !== $delimiter) {
            // removes delimiter escaping
            $pattern = str_replace('\\'.$delimiter, $delimiter, $pattern);
        }

        $this->parsePattern($pattern);
        $this->options = $options;
    }

    /**
     * @return string
     */
    public function __toString()
    {
        return $this->render();
    }

    /**
     * {@inheritdoc}
     */
    public function render()
    {
        return self::BOUNDARY
            .$this->renderPattern()
            .self::BOUNDARY
            .$this->options;
    }

    /**
     * {@inheritdoc}
     */
    public function renderPattern()
    {
        return ($this->startFlag ? self::START_FLAG : '')
            .($this->startJoker ? self::JOKER : '')
            .str_replace(self::BOUNDARY, '\\'.self::BOUNDARY, $this->pattern)
            .($this->endJoker ? self::JOKER : '')
            .($this->endFlag ? self::END_FLAG : '');
    }

    /**
     * {@inheritdoc}
     */
    public function isCaseSensitive()
    {
        return !$this->hasOption('i');
    }

    /**
     * {@inheritdoc}
     */
    public function getType()
    {
        return Expression::TYPE_REGEX;
    }

    /**
     * {@inheritdoc}
     */
    public function prepend($expr)
    {
        $this->pattern = $expr.$this->pattern;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function append($expr)
    {
        $this->pattern .= $expr;

        return $this;
    }

    /**
     * @param string $option
     *
     * @return bool
     */
    public function hasOption($option)
    {
        return false !== strpos($this->options, $option);
    }

    /**
     * @param string $option
     *
     * @return Regex
     */
    public function addOption($option)
    {
        if (!$this->hasOption($option)) {
            $this->options.= $option;
        }

        return $this;
    }

    /**
     * @param string $option
     *
     * @return Regex
     */
    public function removeOption($option)
    {
        $this->options = str_replace($option, '', $this->options);

        return $this;
    }

    /**
     * @param bool $startFlag
     *
     * @return Regex
     */
    public function setStartFlag($startFlag)
    {
        $this->startFlag = $startFlag;

        return $this;
    }

    /**
     * @return bool
     */
    public function hasStartFlag()
    {
        return $this->startFlag;
    }

    /**
     * @param bool $endFlag
     *
     * @return Regex
     */
    public function setEndFlag($endFlag)
    {
        $this->endFlag = (bool) $endFlag;

        return $this;
    }

    /**
     * @return bool
     */
    public function hasEndFlag()
    {
        return $this->endFlag;
    }

    /**
     * @param bool $startJoker
     *
     * @return Regex
     */
    public function setStartJoker($startJoker)
    {
        $this->startJoker = $startJoker;

        return $this;
    }

    /**
     * @return bool
     */
    public function hasStartJoker()
    {
        return $this->startJoker;
    }

    /**
     * @param bool $endJoker
     *
     * @return Regex
     */
    public function setEndJoker($endJoker)
    {
        $this->endJoker = (bool) $endJoker;

        return $this;
    }

    /**
     * @return bool
     */
    public function hasEndJoker()
    {
        return $this->endJoker;
    }

    /**
     * @param array $replacement
     *
     * @return Regex
     */
    public function replaceJokers($replacement)
    {
        $replace = function ($subject) use ($replacement) {
            $subject = $subject[0];
            $replace = 0 === substr_count($subject, '\\') % 2;

            return $replace ? str_replace('.', $replacement, $subject) : $subject;
        };

        $this->pattern = preg_replace_callback('~[\\\\]*\\.~', $replace, $this->pattern);

        return $this;
    }

    /**
     * @param string $pattern
     */
    private function parsePattern($pattern)
    {
        if ($this->startFlag = self::START_FLAG === substr($pattern, 0, 1)) {
            $pattern = substr($pattern, 1);
        }

        if ($this->startJoker = self::JOKER === substr($pattern, 0, 2)) {
            $pattern = substr($pattern, 2);
        }

        if ($this->endFlag = (self::END_FLAG === substr($pattern, -1) && self::ESCAPING !== substr($pattern, -2, -1))) {
            $pattern = substr($pattern, 0, -1);
        }

        if ($this->endJoker = (self::JOKER === substr($pattern, -2) && self::ESCAPING !== substr($pattern, -3, -2))) {
            $pattern = substr($pattern, 0, -2);
        }

        $this->pattern = $pattern;
    }
}
PK�`�\�"HH;pear/Symfony/Component/Finder/Expression/ValueInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Expression;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
interface ValueInterface
{
    /**
     * Renders string representation of expression.
     *
     * @return string
     */
    public function render();

    /**
     * Renders string representation of pattern.
     *
     * @return string
     */
    public function renderPattern();

    /**
     * Returns value case sensitivity.
     *
     * @return bool
     */
    public function isCaseSensitive();

    /**
     * Returns expression type.
     *
     * @return int
     */
    public function getType();

    /**
     * @param string $expr
     *
     * @return ValueInterface
     */
    public function prepend($expr);

    /**
     * @param string $expr
     *
     * @return ValueInterface
     */
    public function append($expr);
}
PK�`�\��&
&
7pear/Symfony/Component/Finder/Expression/Expression.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Expression;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class Expression implements ValueInterface
{
    const TYPE_REGEX = 1;
    const TYPE_GLOB  = 2;

    /**
     * @var ValueInterface
     */
    private $value;

    /**
     * @param string $expr
     *
     * @return Expression
     */
    public static function create($expr)
    {
        return new self($expr);
    }

    /**
     * @param string $expr
     */
    public function __construct($expr)
    {
        try {
            $this->value = Regex::create($expr);
        } catch (\InvalidArgumentException $e) {
            $this->value = new Glob($expr);
        }
    }

    /**
     * @return string
     */
    public function __toString()
    {
        return $this->render();
    }

    /**
     * {@inheritdoc}
     */
    public function render()
    {
        return $this->value->render();
    }

    /**
     * {@inheritdoc}
     */
    public function renderPattern()
    {
        return $this->value->renderPattern();
    }

    /**
     * @return bool
     */
    public function isCaseSensitive()
    {
        return $this->value->isCaseSensitive();
    }

    /**
     * @return int
     */
    public function getType()
    {
        return $this->value->getType();
    }

    /**
     * {@inheritdoc}
     */
    public function prepend($expr)
    {
        $this->value->prepend($expr);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function append($expr)
    {
        $this->value->append($expr);

        return $this;
    }

    /**
     * @return bool
     */
    public function isRegex()
    {
        return self::TYPE_REGEX === $this->value->getType();
    }

    /**
     * @return bool
     */
    public function isGlob()
    {
        return self::TYPE_GLOB === $this->value->getType();
    }

    /**
     * @throws \LogicException
     *
     * @return Glob
     */
    public function getGlob()
    {
        if (self::TYPE_GLOB !== $this->value->getType()) {
            throw new \LogicException('Regex can\'t be transformed to glob.');
        }

        return $this->value;
    }

    /**
     * @return Regex
     */
    public function getRegex()
    {
        return self::TYPE_REGEX === $this->value->getType() ? $this->value : $this->value->toRegex();
    }
}
PK�`�\�	9pear/Symfony/Component/Finder/Adapter/AbstractAdapter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Adapter;

/**
 * Interface for finder engine implementations.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
abstract class AbstractAdapter implements AdapterInterface
{
    protected $followLinks = false;
    protected $mode        = 0;
    protected $minDepth    = 0;
    protected $maxDepth    = PHP_INT_MAX;
    protected $exclude     = array();
    protected $names       = array();
    protected $notNames    = array();
    protected $contains    = array();
    protected $notContains = array();
    protected $sizes       = array();
    protected $dates       = array();
    protected $filters     = array();
    protected $sort        = false;
    protected $paths       = array();
    protected $notPaths    = array();
    protected $ignoreUnreadableDirs = false;

    private static $areSupported = array();

    /**
     * {@inheritDoc}
     */
    public function isSupported()
    {
        $name = $this->getName();

        if (!array_key_exists($name, self::$areSupported)) {
            self::$areSupported[$name] = $this->canBeUsed();
        }

        return self::$areSupported[$name];
    }

    /**
     * {@inheritdoc}
     */
    public function setFollowLinks($followLinks)
    {
        $this->followLinks = $followLinks;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setMode($mode)
    {
        $this->mode = $mode;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setDepths(array $depths)
    {
        $this->minDepth = 0;
        $this->maxDepth = PHP_INT_MAX;

        foreach ($depths as $comparator) {
            switch ($comparator->getOperator()) {
                case '>':
                    $this->minDepth = $comparator->getTarget() + 1;
                    break;
                case '>=':
                    $this->minDepth = $comparator->getTarget();
                    break;
                case '<':
                    $this->maxDepth = $comparator->getTarget() - 1;
                    break;
                case '<=':
                    $this->maxDepth = $comparator->getTarget();
                    break;
                default:
                    $this->minDepth = $this->maxDepth = $comparator->getTarget();
            }
        }

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setExclude(array $exclude)
    {
        $this->exclude = $exclude;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setNames(array $names)
    {
        $this->names = $names;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setNotNames(array $notNames)
    {
        $this->notNames = $notNames;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setContains(array $contains)
    {
        $this->contains = $contains;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setNotContains(array $notContains)
    {
        $this->notContains = $notContains;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setSizes(array $sizes)
    {
        $this->sizes = $sizes;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setDates(array $dates)
    {
        $this->dates = $dates;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setFilters(array $filters)
    {
        $this->filters = $filters;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setSort($sort)
    {
        $this->sort = $sort;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setPath(array $paths)
    {
        $this->paths = $paths;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setNotPath(array $notPaths)
    {
        $this->notPaths = $notPaths;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function ignoreUnreadableDirs($ignore = true)
    {
        $this->ignoreUnreadableDirs = (Boolean) $ignore;

        return $this;
    }

    /**
     * Returns whether the adapter is supported in the current environment.
     *
     * This method should be implemented in all adapters. Do not implement
     * isSupported in the adapters as the generic implementation provides a cache
     * layer.
     *
     * @see isSupported
     *
     * @return Boolean Whether the adapter is supported
     */
    abstract protected function canBeUsed();
}
PK�`�\�}]�
�
8pear/Symfony/Component/Finder/Adapter/GnuFindAdapter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Adapter;

use Symfony\Component\Finder\Shell\Shell;
use Symfony\Component\Finder\Shell\Command;
use Symfony\Component\Finder\Iterator\SortableIterator;
use Symfony\Component\Finder\Expression\Expression;

/**
 * Shell engine implementation using GNU find command.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class GnuFindAdapter extends AbstractFindAdapter
{
    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'gnu_find';
    }

    /**
     * {@inheritdoc}
     */
    protected function buildFormatSorting(Command $command, $sort)
    {
        switch ($sort) {
            case SortableIterator::SORT_BY_NAME:
                $command->ins('sort')->add('| sort');

                return;
            case SortableIterator::SORT_BY_TYPE:
                $format = '%y';
                break;
            case SortableIterator::SORT_BY_ACCESSED_TIME:
                $format = '%A@';
                break;
            case SortableIterator::SORT_BY_CHANGED_TIME:
                $format = '%C@';
                break;
            case SortableIterator::SORT_BY_MODIFIED_TIME:
                $format = '%T@';
                break;
            default:
                throw new \InvalidArgumentException(sprintf('Unknown sort options: %s.', $sort));
        }

        $command
            ->get('find')
            ->add('-printf')
            ->arg($format.' %h/%f\\n')
            ->add('| sort | cut')
            ->arg('-d ')
            ->arg('-f2-')
        ;
    }

    /**
     * {@inheritdoc}
     */
    protected function canBeUsed()
    {
        return $this->shell->getType() === Shell::TYPE_UNIX && parent::canBeUsed();
    }

    /**
     * {@inheritdoc}
     */
    protected function buildFindCommand(Command $command, $dir)
    {
      return parent::buildFindCommand($command, $dir)->add('-regextype posix-extended');
    }

    /**
     * {@inheritdoc}
     */
    protected function buildContentFiltering(Command $command, array $contains, $not = false)
    {
        foreach ($contains as $contain) {
            $expr = Expression::create($contain);

            // todo: avoid forking process for each $pattern by using multiple -e options
            $command
                ->add('| xargs -I{} -r grep -I')
                ->add($expr->isCaseSensitive() ? null : '-i')
                ->add($not ? '-L' : '-l')
                ->add('-Ee')->arg($expr->renderPattern())
                ->add('{}')
            ;
        }
    }
}
PK�`�\����:pear/Symfony/Component/Finder/Adapter/AdapterInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Adapter;

/**
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
interface AdapterInterface
{
    /**
     * @param Boolean $followLinks
     *
     * @return AdapterInterface Current instance
     */
    public function setFollowLinks($followLinks);

    /**
     * @param integer $mode
     *
     * @return AdapterInterface Current instance
     */
    public function setMode($mode);

    /**
     * @param array $exclude
     *
     * @return AdapterInterface Current instance
     */
    public function setExclude(array $exclude);

    /**
     * @param array $depths
     *
     * @return AdapterInterface Current instance
     */
    public function setDepths(array $depths);

    /**
     * @param array $names
     *
     * @return AdapterInterface Current instance
     */
    public function setNames(array $names);

    /**
     * @param array $notNames
     *
     * @return AdapterInterface Current instance
     */
    public function setNotNames(array $notNames);

    /**
     * @param array $contains
     *
     * @return AdapterInterface Current instance
     */
    public function setContains(array $contains);

    /**
     * @param array $notContains
     *
     * @return AdapterInterface Current instance
     */
    public function setNotContains(array $notContains);

    /**
     * @param array $sizes
     *
     * @return AdapterInterface Current instance
     */
    public function setSizes(array $sizes);

    /**
     * @param array $dates
     *
     * @return AdapterInterface Current instance
     */
    public function setDates(array $dates);

    /**
     * @param array $filters
     *
     * @return AdapterInterface Current instance
     */
    public function setFilters(array $filters);

    /**
     * @param \Closure|integer $sort
     *
     * @return AdapterInterface Current instance
     */
    public function setSort($sort);

    /**
     * @param array $paths
     *
     * @return AdapterInterface Current instance
     */
    public function setPath(array $paths);

    /**
     * @param array $notPaths
     *
     * @return AdapterInterface Current instance
     */
    public function setNotPath(array $notPaths);

    /**
     * @param boolean $ignore
     *
     * @return AdapterInterface Current instance
     */
    public function ignoreUnreadableDirs($ignore = true);

    /**
     * @param string $dir
     *
     * @return \Iterator Result iterator
     */
    public function searchInDirectory($dir);

    /**
     * Tests adapter support for current platform.
     *
     * @return Boolean
     */
    public function isSupported();

    /**
     * Returns adapter name.
     *
     * @return string
     */
    public function getName();
}
PK�`�\9!�2{
{
4pear/Symfony/Component/Finder/Adapter/PhpAdapter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Adapter;

use Symfony\Component\Finder\Iterator;

/**
 * PHP finder engine implementation.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class PhpAdapter extends AbstractAdapter
{
    /**
     * {@inheritdoc}
     */
    public function searchInDirectory($dir)
    {
        $flags = \RecursiveDirectoryIterator::SKIP_DOTS;

        if ($this->followLinks) {
            $flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS;
        }

        $iterator = new \RecursiveIteratorIterator(
            new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs),
            \RecursiveIteratorIterator::SELF_FIRST
        );

        if ($this->minDepth > 0 || $this->maxDepth < PHP_INT_MAX) {
            $iterator = new Iterator\DepthRangeFilterIterator($iterator, $this->minDepth, $this->maxDepth);
        }

        if ($this->mode) {
            $iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode);
        }

        if ($this->exclude) {
            $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
        }

        if ($this->names || $this->notNames) {
            $iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames);
        }

        if ($this->contains || $this->notContains) {
            $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
        }

        if ($this->sizes) {
            $iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes);
        }

        if ($this->dates) {
            $iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates);
        }

        if ($this->filters) {
            $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
        }

        if ($this->sort) {
            $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort);
            $iterator = $iteratorAggregate->getIterator();
        }

        if ($this->paths || $this->notPaths) {
            $iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $this->notPaths);
        }

        return $iterator;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'php';
    }

    /**
     * {@inheritdoc}
     */
    protected function canBeUsed()
    {
        return true;
    }
}
PK�`�\��kA�
�
8pear/Symfony/Component/Finder/Adapter/BsdFindAdapter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Adapter;

use Symfony\Component\Finder\Shell\Shell;
use Symfony\Component\Finder\Shell\Command;
use Symfony\Component\Finder\Iterator\SortableIterator;
use Symfony\Component\Finder\Expression\Expression;

/**
 * Shell engine implementation using BSD find command.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class BsdFindAdapter extends AbstractFindAdapter
{
    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'bsd_find';
    }

    /**
     * {@inheritdoc}
     */
    protected function canBeUsed()
    {
        return in_array($this->shell->getType(), array(Shell::TYPE_BSD, Shell::TYPE_DARWIN)) && parent::canBeUsed();
    }

    /**
     * {@inheritdoc}
     */
    protected function buildFormatSorting(Command $command, $sort)
    {
        switch ($sort) {
            case SortableIterator::SORT_BY_NAME:
                $command->ins('sort')->add('| sort');

                return;
            case SortableIterator::SORT_BY_TYPE:
                $format = '%HT';
                break;
            case SortableIterator::SORT_BY_ACCESSED_TIME:
                $format = '%a';
                break;
            case SortableIterator::SORT_BY_CHANGED_TIME:
                $format = '%c';
                break;
            case SortableIterator::SORT_BY_MODIFIED_TIME:
                $format = '%m';
                break;
            default:
                throw new \InvalidArgumentException(sprintf('Unknown sort options: %s.', $sort));
        }

        $command
            ->add('-print0 | xargs -0 stat -f')
            ->arg($format.'%t%N')
            ->add('| sort | cut -f 2');
    }

    /**
     * {@inheritdoc}
     */
    protected function buildFindCommand(Command $command, $dir)
    {
        parent::buildFindCommand($command, $dir)->addAtIndex('-E', 1);

        return $command;
    }

    /**
     * {@inheritdoc}
     */
    protected function buildContentFiltering(Command $command, array $contains, $not = false)
    {
        foreach ($contains as $contain) {
            $expr = Expression::create($contain);

            // todo: avoid forking process for each $pattern by using multiple -e options
            $command
                ->add('| grep -v \'^$\'')
                ->add('| xargs -I{} grep -I')
                ->add($expr->isCaseSensitive() ? null : '-i')
                ->add($not ? '-L' : '-l')
                ->add('-Ee')->arg($expr->renderPattern())
                ->add('{}')
            ;
        }
    }
}
PK�`�\QJ)�)=pear/Symfony/Component/Finder/Adapter/AbstractFindAdapter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Adapter;

use Symfony\Component\Finder\Exception\AccessDeniedException;
use Symfony\Component\Finder\Iterator;
use Symfony\Component\Finder\Shell\Shell;
use Symfony\Component\Finder\Expression\Expression;
use Symfony\Component\Finder\Shell\Command;
use Symfony\Component\Finder\Iterator\SortableIterator;
use Symfony\Component\Finder\Comparator\NumberComparator;
use Symfony\Component\Finder\Comparator\DateComparator;

/**
 * Shell engine implementation using GNU find command.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
abstract class AbstractFindAdapter extends AbstractAdapter
{
    /**
     * @var Shell
     */
    protected $shell;

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->shell = new Shell();
    }

    /**
     * {@inheritdoc}
     */
    public function searchInDirectory($dir)
    {
        // having "/../" in path make find fail
        $dir = realpath($dir);

        // searching directories containing or not containing strings leads to no result
        if (Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES === $this->mode && ($this->contains || $this->notContains)) {
            return new Iterator\FilePathsIterator(array(), $dir);
        }

        $command = Command::create();
        $find = $this->buildFindCommand($command, $dir);

        if ($this->followLinks) {
            $find->add('-follow');
        }

        $find->add('-mindepth')->add($this->minDepth + 1);

        if (PHP_INT_MAX !== $this->maxDepth) {
            $find->add('-maxdepth')->add($this->maxDepth + 1);
        }

        if (Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES === $this->mode) {
            $find->add('-type d');
        } elseif (Iterator\FileTypeFilterIterator::ONLY_FILES === $this->mode) {
            $find->add('-type f');
        }

        $this->buildNamesFiltering($find, $this->names);
        $this->buildNamesFiltering($find, $this->notNames, true);
        $this->buildPathsFiltering($find, $dir, $this->paths);
        $this->buildPathsFiltering($find, $dir, $this->notPaths, true);
        $this->buildSizesFiltering($find, $this->sizes);
        $this->buildDatesFiltering($find, $this->dates);

        $useGrep = $this->shell->testCommand('grep') && $this->shell->testCommand('xargs');
        $useSort = is_int($this->sort) && $this->shell->testCommand('sort') && $this->shell->testCommand('cut');

        if ($useGrep && ($this->contains || $this->notContains)) {
            $grep = $command->ins('grep');
            $this->buildContentFiltering($grep, $this->contains);
            $this->buildContentFiltering($grep, $this->notContains, true);
        }

        if ($useSort) {
            $this->buildSorting($command, $this->sort);
        }

        $command->setErrorHandler(
            $this->ignoreUnreadableDirs
                // If directory is unreadable and finder is set to ignore it, `stderr` is ignored.
                ? function ($stderr) { return; }
                : function ($stderr) { throw new AccessDeniedException($stderr); }
        );

        $paths = $this->shell->testCommand('uniq') ? $command->add('| uniq')->execute() : array_unique($command->execute());
        $iterator = new Iterator\FilePathsIterator($paths, $dir);

        if ($this->exclude) {
            $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
        }

        if (!$useGrep && ($this->contains || $this->notContains)) {
            $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
        }

        if ($this->filters) {
            $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
        }

        if (!$useSort && $this->sort) {
            $iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort);
            $iterator = $iteratorAggregate->getIterator();
        }

        return $iterator;
    }

    /**
     * {@inheritdoc}
     */
    protected function canBeUsed()
    {
        return $this->shell->testCommand('find');
    }

    /**
     * @param Command $command
     * @param string  $dir
     *
     * @return Command
     */
    protected function buildFindCommand(Command $command, $dir)
    {
        return $command
            ->ins('find')
            ->add('find ')
            ->arg($dir)
            ->add('-noleaf'); // the -noleaf option is required for filesystems that don't follow the '.' and '..' conventions
    }

    /**
     * @param Command  $command
     * @param string[] $names
     * @param Boolean  $not
     */
    private function buildNamesFiltering(Command $command, array $names, $not = false)
    {
        if (0 === count($names)) {
            return;
        }

        $command->add($not ? '-not' : null)->cmd('(');

        foreach ($names as $i => $name) {
            $expr = Expression::create($name);

            // Find does not support expandable globs ("*.{a,b}" syntax).
            if ($expr->isGlob() && $expr->getGlob()->isExpandable()) {
                $expr = Expression::create($expr->getGlob()->toRegex(false));
            }

            // Fixes 'not search' and 'full path matching' regex problems.
            // - Jokers '.' are replaced by [^/].
            // - We add '[^/]*' before and after regex (if no ^|$ flags are present).
            if ($expr->isRegex()) {
                $regex = $expr->getRegex();
                $regex->prepend($regex->hasStartFlag() ? '/' : '/[^/]*')
                    ->setStartFlag(false)
                    ->setStartJoker(true)
                    ->replaceJokers('[^/]');
                if (!$regex->hasEndFlag() || $regex->hasEndJoker()) {
                    $regex->setEndJoker(false)->append('[^/]*');
                }
            }

            $command
                ->add($i > 0 ? '-or' : null)
                ->add($expr->isRegex()
                    ? ($expr->isCaseSensitive() ? '-regex' : '-iregex')
                    : ($expr->isCaseSensitive() ? '-name' : '-iname')
                )
                ->arg($expr->renderPattern());
        }

        $command->cmd(')');
    }

    /**
     * @param Command  $command
     * @param string   $dir
     * @param string[] $paths
     * @param Boolean  $not
     */
    private function buildPathsFiltering(Command $command, $dir, array $paths, $not = false)
    {
        if (0 === count($paths)) {
            return;
        }

        $command->add($not ? '-not' : null)->cmd('(');

        foreach ($paths as $i => $path) {
            $expr = Expression::create($path);

            // Find does not support expandable globs ("*.{a,b}" syntax).
            if ($expr->isGlob() && $expr->getGlob()->isExpandable()) {
                $expr = Expression::create($expr->getGlob()->toRegex(false));
            }

            // Fixes 'not search' regex problems.
            if ($expr->isRegex()) {
                $regex = $expr->getRegex();
                $regex->prepend($regex->hasStartFlag() ? $dir.DIRECTORY_SEPARATOR : '.*')->setEndJoker(!$regex->hasEndFlag());
            } else {
                $expr->prepend('*')->append('*');
            }

            $command
                ->add($i > 0 ? '-or' : null)
                ->add($expr->isRegex()
                    ? ($expr->isCaseSensitive() ? '-regex' : '-iregex')
                    : ($expr->isCaseSensitive() ? '-path' : '-ipath')
                )
                ->arg($expr->renderPattern());
        }

        $command->cmd(')');
    }

    /**
     * @param Command            $command
     * @param NumberComparator[] $sizes
     */
    private function buildSizesFiltering(Command $command, array $sizes)
    {
        foreach ($sizes as $i => $size) {
            $command->add($i > 0 ? '-and' : null);

            switch ($size->getOperator()) {
                case '<=':
                    $command->add('-size -'.($size->getTarget() + 1).'c');
                    break;
                case '>=':
                    $command->add('-size +'. ($size->getTarget() - 1).'c');
                    break;
                case '>':
                    $command->add('-size +'.$size->getTarget().'c');
                    break;
                case '!=':
                    $command->add('-size -'.$size->getTarget().'c');
                    $command->add('-size +'.$size->getTarget().'c');
                case '<':
                default:
                    $command->add('-size -'.$size->getTarget().'c');
            }
        }
    }

    /**
     * @param Command          $command
     * @param DateComparator[] $dates
     */
    private function buildDatesFiltering(Command $command, array $dates)
    {
        foreach ($dates as $i => $date) {
            $command->add($i > 0 ? '-and' : null);

            $mins = (int) round((time()-$date->getTarget()) / 60);

            if (0 > $mins) {
                // mtime is in the future
                $command->add(' -mmin -0');
                // we will have no result so we don't need to continue
                return;
            }

            switch ($date->getOperator()) {
                case '<=':
                    $command->add('-mmin +'.($mins - 1));
                    break;
                case '>=':
                    $command->add('-mmin -'.($mins + 1));
                    break;
                case '>':
                    $command->add('-mmin -'.$mins);
                    break;
                case '!=':
                    $command->add('-mmin +'.$mins.' -or -mmin -'.$mins);
                    break;
                case '<':
                default:
                    $command->add('-mmin +'.$mins);
            }
        }
    }

    /**
     * @param Command $command
     * @param string  $sort
     *
     * @throws \InvalidArgumentException
     */
    private function buildSorting(Command $command, $sort)
    {
        $this->buildFormatSorting($command, $sort);
    }

    /**
     * @param Command $command
     * @param string  $sort
     */
    abstract protected function buildFormatSorting(Command $command, $sort);

    /**
     * @param Command $command
     * @param array   $contains
     * @param Boolean $not
     */
    abstract protected function buildContentFiltering(Command $command, array $contains, $not = false);
}
PK�`�\��� ��;pear/Symfony/Component/Finder/Comparator/DateComparator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Comparator;

/**
 * DateCompare compiles date comparisons.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DateComparator extends Comparator
{

    /**
     * Constructor.
     *
     * @param string $test A comparison string
     *
     * @throws \InvalidArgumentException If the test is not understood
     */
    public function __construct($test)
    {
        if (!preg_match('#^\s*(==|!=|[<>]=?|after|since|before|until)?\s*(.+?)\s*$#i', $test, $matches)) {
            throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a date test.', $test));
        }

        try {
            $date = new \DateTime($matches[2]);
            $target = $date->format('U');
        } catch (\Exception $e) {
            throw new \InvalidArgumentException(sprintf('"%s" is not a valid date.', $matches[2]));
        }

        $operator = isset($matches[1]) ? $matches[1] : '==';
        if ('since' === $operator || 'after' === $operator) {
            $operator = '>';
        }

        if ('until' === $operator || 'before' === $operator) {
            $operator = '<';
        }

        $this->setOperator($operator);
        $this->setTarget($target);
    }
}
PK�`�\|F�z

7pear/Symfony/Component/Finder/Comparator/Comparator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Comparator;

/**
 * Comparator.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Comparator
{
    private $target;
    private $operator = '==';

    /**
     * Gets the target value.
     *
     * @return string The target value
     */
    public function getTarget()
    {
        return $this->target;
    }

    /**
     * Sets the target value.
     *
     * @param string $target The target value
     */
    public function setTarget($target)
    {
        $this->target = $target;
    }

    /**
     * Gets the comparison operator.
     *
     * @return string The operator
     */
    public function getOperator()
    {
        return $this->operator;
    }

    /**
     * Sets the comparison operator.
     *
     * @param string $operator A valid operator
     *
     * @throws \InvalidArgumentException
     */
    public function setOperator($operator)
    {
        if (!$operator) {
            $operator = '==';
        }

        if (!in_array($operator, array('>', '<', '>=', '<=', '==', '!='))) {
            throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator));
        }

        $this->operator = $operator;
    }

    /**
     * Tests against the target.
     *
     * @param mixed $test A test value
     *
     * @return Boolean
     */
    public function test($test)
    {
        switch ($this->operator) {
            case '>':
                return $test > $this->target;
            case '>=':
                return $test >= $this->target;
            case '<':
                return $test < $this->target;
            case '<=':
                return $test <= $this->target;
            case '!=':
                return $test != $this->target;
        }

        return $test == $this->target;
    }
}
PK�`�\�P�

=pear/Symfony/Component/Finder/Comparator/NumberComparator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Comparator;

/**
 * NumberComparator compiles a simple comparison to an anonymous
 * subroutine, which you can call with a value to be tested again.
 *
 * Now this would be very pointless, if NumberCompare didn't understand
 * magnitudes.
 *
 * The target value may use magnitudes of kilobytes (k, ki),
 * megabytes (m, mi), or gigabytes (g, gi).  Those suffixed
 * with an i use the appropriate 2**n version in accordance with the
 * IEC standard: http://physics.nist.gov/cuu/Units/binary.html
 *
 * Based on the Perl Number::Compare module.
 *
 * @author    Fabien Potencier <fabien@symfony.com> PHP port
 * @author    Richard Clamp <richardc@unixbeard.net> Perl version
 *
 * @copyright 2004-2005 Fabien Potencier <fabien@symfony.com>
 * @copyright 2002 Richard Clamp <richardc@unixbeard.net>
 *
 * @see       http://physics.nist.gov/cuu/Units/binary.html
 */
class NumberComparator extends Comparator
{
    /**
     * Constructor.
     *
     * @param string $test A comparison string
     *
     * @throws \InvalidArgumentException If the test is not understood
     */
    public function __construct($test)
    {
        if (!preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) {
            throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a number test.', $test));
        }

        $target = $matches[2];
        if (!is_numeric($target)) {
            throw new \InvalidArgumentException(sprintf('Invalid number "%s".', $target));
        }
        if (isset($matches[3])) {
            // magnitude
            switch (strtolower($matches[3])) {
                case 'k':
                    $target *= 1000;
                    break;
                case 'ki':
                    $target *= 1024;
                    break;
                case 'm':
                    $target *= 1000000;
                    break;
                case 'mi':
                    $target *= 1024*1024;
                    break;
                case 'g':
                    $target *= 1000000000;
                    break;
                case 'gi':
                    $target *= 1024*1024*1024;
                    break;
            }
        }

        $this->setTarget($target);
        $this->setOperator(isset($matches[1]) ? $matches[1] : '==');
    }
}
PK�`�\�n bbApear/Symfony/Component/Finder/Iterator/FileTypeFilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

/**
 * FileTypeFilterIterator only keeps files, directories, or both.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FileTypeFilterIterator extends FilterIterator
{
    const ONLY_FILES       = 1;
    const ONLY_DIRECTORIES = 2;

    private $mode;

    /**
     * Constructor.
     *
     * @param \Iterator $iterator The Iterator to filter
     * @param integer   $mode     The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES)
     */
    public function __construct(\Iterator $iterator, $mode)
    {
        $this->mode = $mode;

        parent::__construct($iterator);
    }

    /**
     * Filters the iterator values.
     *
     * @return Boolean true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $fileinfo = $this->current();
        if (self::ONLY_DIRECTORIES === (self::ONLY_DIRECTORIES & $this->mode) && $fileinfo->isFile()) {
            return false;
        } elseif (self::ONLY_FILES === (self::ONLY_FILES & $this->mode) && $fileinfo->isDir()) {
            return false;
        }

        return true;
    }
}
PK�`�\��j��	�	;pear/Symfony/Component/Finder/Iterator/SortableIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

/**
 * SortableIterator applies a sort on a given Iterator.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SortableIterator implements \IteratorAggregate
{
    const SORT_BY_NAME = 1;
    const SORT_BY_TYPE = 2;
    const SORT_BY_ACCESSED_TIME = 3;
    const SORT_BY_CHANGED_TIME = 4;
    const SORT_BY_MODIFIED_TIME = 5;

    private $iterator;
    private $sort;

    /**
     * Constructor.
     *
     * @param \Traversable     $iterator The Iterator to filter
     * @param integer|callback $sort     The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback)
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(\Traversable $iterator, $sort)
    {
        $this->iterator = $iterator;

        if (self::SORT_BY_NAME === $sort) {
            $this->sort = function ($a, $b) {
                return strcmp($a->getRealpath(), $b->getRealpath());
            };
        } elseif (self::SORT_BY_TYPE === $sort) {
            $this->sort = function ($a, $b) {
                if ($a->isDir() && $b->isFile()) {
                    return -1;
                } elseif ($a->isFile() && $b->isDir()) {
                    return 1;
                }

                return strcmp($a->getRealpath(), $b->getRealpath());
            };
        } elseif (self::SORT_BY_ACCESSED_TIME === $sort) {
            $this->sort = function ($a, $b) {
                return ($a->getATime() > $b->getATime());
            };
        } elseif (self::SORT_BY_CHANGED_TIME === $sort) {
            $this->sort = function ($a, $b) {
                return ($a->getCTime() > $b->getCTime());
            };
        } elseif (self::SORT_BY_MODIFIED_TIME === $sort) {
            $this->sort = function ($a, $b) {
                return ($a->getMTime() > $b->getMTime());
            };
        } elseif (is_callable($sort)) {
            $this->sort = $sort;
        } else {
            throw new \InvalidArgumentException('The SortableIterator takes a PHP callback or a valid built-in sort algorithm as an argument.');
        }
    }

    public function getIterator()
    {
        $array = iterator_to_array($this->iterator, true);
        uasort($array, $this->sort);

        return new \ArrayIterator($array);
    }
}
PK�`�\{�^ǽ�Apear/Symfony/Component/Finder/Iterator/FilenameFilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\Expression\Expression;

/**
 * FilenameFilterIterator filters files by patterns (a regexp, a glob, or a string).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FilenameFilterIterator extends MultiplePcreFilterIterator
{

    /**
     * Filters the iterator values.
     *
     * @return Boolean true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $filename = $this->current()->getFilename();

        // should at least not match one rule to exclude
        foreach ($this->noMatchRegexps as $regex) {
            if (preg_match($regex, $filename)) {
                return false;
            }
        }

        // should at least match one rule
        $match = true;
        if ($this->matchRegexps) {
            $match = false;
            foreach ($this->matchRegexps as $regex) {
                if (preg_match($regex, $filename)) {
                    return true;
                }
            }
        }

        return $match;
    }

    /**
     * Converts glob to regexp.
     *
     * PCRE patterns are left unchanged.
     * Glob strings are transformed with Glob::toRegex().
     *
     * @param string $str Pattern: glob or regexp
     *
     * @return string regexp corresponding to a given glob or regexp
     */
    protected function toRegex($str)
    {
        return Expression::create($str)->getRegex()->render();
    }
}
PK�`�\ ��U��Bpear/Symfony/Component/Finder/Iterator/DateRangeFilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\Comparator\DateComparator;

/**
 * DateRangeFilterIterator filters out files that are not in the given date range (last modified dates).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DateRangeFilterIterator extends FilterIterator
{
    private $comparators = array();

    /**
     * Constructor.
     *
     * @param \Iterator        $iterator    The Iterator to filter
     * @param DateComparator[] $comparators An array of DateComparator instances
     */
    public function __construct(\Iterator $iterator, array $comparators)
    {
        $this->comparators = $comparators;

        parent::__construct($iterator);
    }

    /**
     * Filters the iterator values.
     *
     * @return Boolean true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $fileinfo = $this->current();

        if (!$fileinfo->isFile()) {
            return true;
        }

        $filedate = $fileinfo->getMTime();
        foreach ($this->comparators as $compare) {
            if (!$compare->test($filedate)) {
                return false;
            }
        }

        return true;
    }
}
PK�`�\�ʽ���Dpear/Symfony/Component/Finder/Iterator/FilecontentFilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

/**
 * FilecontentFilterIterator filters files by their contents using patterns (regexps or strings).
 *
 * @author Fabien Potencier  <fabien@symfony.com>
 * @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
 */
class FilecontentFilterIterator extends MultiplePcreFilterIterator
{
    /**
     * Filters the iterator values.
     *
     * @return Boolean true if the value should be kept, false otherwise
     */
    public function accept()
    {
        if (!$this->matchRegexps && !$this->noMatchRegexps) {
            return true;
        }

        $fileinfo = $this->current();

        if ($fileinfo->isDir() || !$fileinfo->isReadable()) {
            return false;
        }

        $content = $fileinfo->getContents();
        if (!$content) {
            return false;
        }

        // should at least not match one rule to exclude
        foreach ($this->noMatchRegexps as $regex) {
            if (preg_match($regex, $content)) {
                return false;
            }
        }

        // should at least match one rule
        $match = true;
        if ($this->matchRegexps) {
            $match = false;
            foreach ($this->matchRegexps as $regex) {
                if (preg_match($regex, $content)) {
                    return true;
                }
            }
        }

        return $match;
    }

    /**
     * Converts string to regexp if necessary.
     *
     * @param string $str Pattern: string or regexp
     *
     * @return string regexp corresponding to a given string or regexp
     */
    protected function toRegex($str)
    {
        return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
    }
}
PK�`�\�,G��9pear/Symfony/Component/Finder/Iterator/FilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

/**
 * This iterator just overrides the rewind method in order to correct a PHP bug.
 *
 * @see https://bugs.php.net/bug.php?id=49104
 *
 * @author Alex Bogomazov
 */
abstract class FilterIterator extends \FilterIterator
{
    /**
     * This is a workaround for the problem with \FilterIterator leaving inner \FilesystemIterator in wrong state after
     * rewind in some cases.
     *
     * @see FilterIterator::rewind()
     */
    public function rewind()
    {
        $iterator = $this;
        while ($iterator instanceof \OuterIterator) {
            $innerIterator = $iterator->getInnerIterator();

            if ($innerIterator instanceof RecursiveDirectoryIterator) {
                if ($innerIterator->isRewindable()) {
                    $innerIterator->next();
                    $innerIterator->rewind();
                }
            } elseif ($iterator->getInnerIterator() instanceof \FilesystemIterator) {
                $iterator->getInnerIterator()->next();
                $iterator->getInnerIterator()->rewind();
            }
            $iterator = $iterator->getInnerIterator();
        }

        parent::rewind();
    }
}
PK�`�\�

���Epear/Symfony/Component/Finder/Iterator/MultiplePcreFilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\Expression\Expression;

/**
 * MultiplePcreFilterIterator filters files using patterns (regexps, globs or strings).
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
abstract class MultiplePcreFilterIterator extends FilterIterator
{
    protected $matchRegexps = array();
    protected $noMatchRegexps = array();

    /**
     * Constructor.
     *
     * @param \Iterator $iterator        The Iterator to filter
     * @param array     $matchPatterns   An array of patterns that need to match
     * @param array     $noMatchPatterns An array of patterns that need to not match
     */
    public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns)
    {
        foreach ($matchPatterns as $pattern) {
            $this->matchRegexps[] = $this->toRegex($pattern);
        }

        foreach ($noMatchPatterns as $pattern) {
            $this->noMatchRegexps[] = $this->toRegex($pattern);
        }

        parent::__construct($iterator);
    }

    /**
     * Checks whether the string is a regex.
     *
     * @param string $str
     *
     * @return Boolean Whether the given string is a regex
     */
    protected function isRegex($str)
    {
        return Expression::create($str)->isRegex();
    }

    /**
     * Converts string into regexp.
     *
     * @param string $str Pattern
     *
     * @return string regexp corresponding to a given string
     */
    abstract protected function toRegex($str);
}
PK�`�\x�P���Bpear/Symfony/Component/Finder/Iterator/SizeRangeFilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\Comparator\NumberComparator;

/**
 * SizeRangeFilterIterator filters out files that are not in the given size range.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SizeRangeFilterIterator extends FilterIterator
{
    private $comparators = array();

    /**
     * Constructor.
     *
     * @param \Iterator          $iterator    The Iterator to filter
     * @param NumberComparator[] $comparators An array of NumberComparator instances
     */
    public function __construct(\Iterator $iterator, array $comparators)
    {
        $this->comparators = $comparators;

        parent::__construct($iterator);
    }

    /**
     * Filters the iterator values.
     *
     * @return Boolean true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $fileinfo = $this->current();
        if (!$fileinfo->isFile()) {
            return true;
        }

        $filesize = $fileinfo->getSize();
        foreach ($this->comparators as $compare) {
            if (!$compare->test($filesize)) {
                return false;
            }
        }

        return true;
    }
}
PK�`�\�6s��Epear/Symfony/Component/Finder/Iterator/RecursiveDirectoryIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\Exception\AccessDeniedException;
use Symfony\Component\Finder\SplFileInfo;

/**
 * Extends the \RecursiveDirectoryIterator to support relative paths
 *
 * @author Victor Berchet <victor@suumit.com>
 */
class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator
{
    /**
     * @var boolean
     */
    private $ignoreUnreadableDirs;

    /**
     * @var Boolean
     */
    private $rewindable;

    /**
     * Constructor.
     *
     * @param string  $path
     * @param int     $flags
     * @param boolean $ignoreUnreadableDirs
     *
     * @throws \RuntimeException
     */
    public function __construct($path, $flags, $ignoreUnreadableDirs = false)
    {
        if ($flags & (self::CURRENT_AS_PATHNAME | self::CURRENT_AS_SELF)) {
            throw new \RuntimeException('This iterator only support returning current as fileinfo.');
        }

        parent::__construct($path, $flags);
        $this->ignoreUnreadableDirs = $ignoreUnreadableDirs;
    }

    /**
     * Return an instance of SplFileInfo with support for relative paths
     *
     * @return SplFileInfo File information
     */
    public function current()
    {
        return new SplFileInfo(parent::current()->getPathname(), $this->getSubPath(), $this->getSubPathname());
    }

    /**
     * @return \RecursiveIterator
     *
     * @throws AccessDeniedException
     */
    public function getChildren()
    {
        try {
            return parent::getChildren();
        } catch (\UnexpectedValueException $e) {
            if ($this->ignoreUnreadableDirs) {
                // If directory is unreadable and finder is set to ignore it, a fake empty content is returned.
                return new \RecursiveArrayIterator(array());
            } else {
                throw new AccessDeniedException($e->getMessage(), $e->getCode(), $e);
            }
        }
    }

    /**
     * Do nothing for non rewindable stream
     */
    public function rewind()
    {
        if (false === $this->isRewindable()) {
            return;
        }

        // @see https://bugs.php.net/bug.php?id=49104
        parent::next();

        parent::rewind();
    }

    /**
     * Checks if the stream is rewindable.
     *
     * @return Boolean true when the stream is rewindable, false otherwise
     */
    public function isRewindable()
    {
        if (null !== $this->rewindable) {
            return $this->rewindable;
        }

        if (false !== $stream = @opendir($this->getPath())) {
            $infos = stream_get_meta_data($stream);
            closedir($stream);

            if ($infos['seekable']) {
                return $this->rewindable = true;
            }
        }

        return $this->rewindable = false;
    }
}
PK�`�\��z"?pear/Symfony/Component/Finder/Iterator/CustomFilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

/**
 * CustomFilterIterator filters files by applying anonymous functions.
 *
 * The anonymous function receives a \SplFileInfo and must return false
 * to remove files.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class CustomFilterIterator extends FilterIterator
{
    private $filters = array();

    /**
     * Constructor.
     *
     * @param \Iterator $iterator The Iterator to filter
     * @param array     $filters  An array of PHP callbacks
     *
     * @throws \InvalidArgumentException
     */
    public function __construct(\Iterator $iterator, array $filters)
    {
        foreach ($filters as $filter) {
            if (!is_callable($filter)) {
                throw new \InvalidArgumentException('Invalid PHP callback.');
            }
        }
        $this->filters = $filters;

        parent::__construct($iterator);
    }

    /**
     * Filters the iterator values.
     *
     * @return Boolean true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $fileinfo = $this->current();

        foreach ($this->filters as $filter) {
            if (false === call_user_func($filter, $fileinfo)) {
                return false;
            }
        }

        return true;
    }
}
PK�`�\��ɔ�
�
<pear/Symfony/Component/Finder/Iterator/FilePathsIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

use Symfony\Component\Finder\SplFileInfo;

/**
 * Iterate over shell command result.
 *
 * @author Jean-François Simon <contact@jfsimon.fr>
 */
class FilePathsIterator extends \ArrayIterator
{
    /**
     * @var string
     */
    private $baseDir;

    /**
     * @var int
     */
    private $baseDirLength;

    /**
     * @var string
     */
    private $subPath;

    /**
     * @var string
     */
    private $subPathname;

    /**
     * @var SplFileInfo
     */
    private $current;

    /**
     * @param array  $paths   List of paths returned by shell command
     * @param string $baseDir Base dir for relative path building
     */
    public function __construct(array $paths, $baseDir)
    {
        $this->baseDir       = $baseDir;
        $this->baseDirLength = strlen($baseDir);

        parent::__construct($paths);
    }

    /**
     * @param string $name
     * @param array  $arguments
     *
     * @return mixed
     */
    public function __call($name, array $arguments)
    {
        return call_user_func_array(array($this->current(), $name), $arguments);
    }

    /**
     * Return an instance of SplFileInfo with support for relative paths.
     *
     * @return SplFileInfo File information
     */
    public function current()
    {
        return $this->current;
    }

    /**
     * @return string
     */
    public function key()
    {
        return $this->current->getPathname();
    }

    public function next()
    {
        parent::next();
        $this->buildProperties();
    }

    public function rewind()
    {
        parent::rewind();
        $this->buildProperties();
    }

    /**
     * @return string
     */
    public function getSubPath()
    {
        return $this->subPath;
    }

    /**
     * @return string
     */
    public function getSubPathname()
    {
        return $this->subPathname;
    }

    private function buildProperties()
    {
        $absolutePath = parent::current();

        if ($this->baseDir === substr($absolutePath, 0, $this->baseDirLength)) {
            $this->subPathname = ltrim(substr($absolutePath, $this->baseDirLength), '/\\');
            $dir = dirname($this->subPathname);
            $this->subPath = '.' === $dir ? '' : $dir;
        } else {
            $this->subPath = $this->subPathname = '';
        }

        $this->current = new SplFileInfo(parent::current(), $this->subPath, $this->subPathname);
    }
}
PK�`�\ils_��Cpear/Symfony/Component/Finder/Iterator/DepthRangeFilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

/**
 * DepthRangeFilterIterator limits the directory depth.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DepthRangeFilterIterator extends FilterIterator
{
    private $minDepth = 0;

    /**
     * Constructor.
     *
     * @param \RecursiveIteratorIterator $iterator    The Iterator to filter
     * @param int                        $minDepth    The min depth
     * @param int                        $maxDepth    The max depth
     */
    public function __construct(\RecursiveIteratorIterator $iterator, $minDepth = 0, $maxDepth = PHP_INT_MAX)
    {
        $this->minDepth = $minDepth;
        $iterator->setMaxDepth(PHP_INT_MAX === $maxDepth ? -1 : $maxDepth);

        parent::__construct($iterator);
    }

    /**
     * Filters the iterator values.
     *
     * @return Boolean true if the value should be kept, false otherwise
     */
    public function accept()
    {
        return $this->getInnerIterator()->getDepth() >= $this->minDepth;
    }
}
PK�`�\���)��=pear/Symfony/Component/Finder/Iterator/PathFilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

/**
 * PathFilterIterator filters files by path patterns (e.g. some/special/dir).
 *
 * @author Fabien Potencier  <fabien@symfony.com>
 * @author Włodzimierz Gajda <gajdaw@gajdaw.pl>
 */
class PathFilterIterator extends MultiplePcreFilterIterator
{

    /**
     * Filters the iterator values.
     *
     * @return Boolean true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $filename = $this->current()->getRelativePathname();

        if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
            $filename = strtr($filename, '\\', '/');
        }

        // should at least not match one rule to exclude
        foreach ($this->noMatchRegexps as $regex) {
            if (preg_match($regex, $filename)) {
                return false;
            }
        }

        // should at least match one rule
        $match = true;
        if ($this->matchRegexps) {
            $match = false;
            foreach ($this->matchRegexps as $regex) {
                if (preg_match($regex, $filename)) {
                    return true;
                }
            }
        }

        return $match;
    }

    /**
     * Converts strings to regexp.
     *
     * PCRE patterns are left unchanged.
     *
     * Default conversion:
     *     'lorem/ipsum/dolor'  ==>  'lorem\/ipsum\/dolor/'
     *
     * Use only / as directory separator (on Windows also).
     *
     * @param string $str Pattern: regexp or dirname.
     *
     * @return string regexp corresponding to a given string or regexp
     */
    protected function toRegex($str)
    {
        return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/';
    }
}
PK�`�\�d����Ipear/Symfony/Component/Finder/Iterator/ExcludeDirectoryFilterIterator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Finder\Iterator;

/**
 * ExcludeDirectoryFilterIterator filters out directories.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ExcludeDirectoryFilterIterator extends FilterIterator
{
    private $patterns = array();

    /**
     * Constructor.
     *
     * @param \Iterator $iterator    The Iterator to filter
     * @param array     $directories An array of directories to exclude
     */
    public function __construct(\Iterator $iterator, array $directories)
    {
        foreach ($directories as $directory) {
            $this->patterns[] = '#(^|/)'.preg_quote($directory, '#').'(/|$)#';
        }

        parent::__construct($iterator);
    }

    /**
     * Filters the iterator values.
     *
     * @return Boolean true if the value should be kept, false otherwise
     */
    public function accept()
    {
        $path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath();
        $path = strtr($path, '\\', '/');
        foreach ($this->patterns as $pattern) {
            if (preg_match($pattern, $path)) {
                return false;
            }
        }

        return true;
    }
}
PK�`�\�t�TT0pear/Symfony/Component/Filesystem/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Filesystem\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�`�\��dP��Epear/Symfony/Component/Filesystem/Exception/FileNotFoundException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Filesystem\Exception;

/**
 * Exception class thrown when a file couldn't be found
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Christian Gärtner <christiangaertner.film@googlemail.com>
 */
class FileNotFoundException extends IOException
{
    public function __construct($message = null, $code = 0, \Exception $previous = null, $path = null)
    {
        if (null === $message) {
            if (null === $path) {
                $message = 'File could not be found.';
            } else {
                $message = sprintf('File "%s" could not be found.', $path);
            }
        }

        parent::__construct($message, $code, $previous, $path);
    }
}
PK�`�\;�{��;pear/Symfony/Component/Filesystem/Exception/IOException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Filesystem\Exception;

/**
 * Exception class thrown when a filesystem operation failure happens
 *
 * @author Romain Neutron <imprec@gmail.com>
 * @author Christian Gärtner <christiangaertner.film@googlemail.com>
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class IOException extends \RuntimeException implements IOExceptionInterface
{
    private $path;

    public function __construct($message, $code = 0, \Exception $previous = null, $path = null)
    {
        $this->path = $path;

        parent::__construct($message, $code, $previous);
    }

    /**
     * {@inheritdoc}
     */
    public function getPath()
    {
        return $this->path;
    }
}
PK�`�\3{����Bpear/Symfony/Component/Filesystem/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Filesystem\Exception;

/**
 * Exception interface for all exceptions thrown by the component.
 *
 * @author Romain Neutron <imprec@gmail.com>
 *
 * @api
 */
interface ExceptionInterface
{
}
PK�`�\oC�~��Dpear/Symfony/Component/Filesystem/Exception/IOExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Filesystem\Exception;

/**
 * IOException interface for file and input/output stream related exceptions thrown by the component.
 *
 * @author Christian Gärtner <christiangaertner.film@googlemail.com>
 */
interface IOExceptionInterface extends ExceptionInterface
{
    /**
     * Returns the associated path for the exception
     *
     * @return string The path.
     */
    public function getPath();
}
PK�`�\Oظ�GG0pear/Symfony/Component/Filesystem/Filesystem.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Filesystem;

use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Exception\FileNotFoundException;

/**
 * Provides basic utility to manipulate the file system.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Filesystem
{
    /**
     * Copies a file.
     *
     * This method only copies the file if the origin file is newer than the target file.
     *
     * By default, if the target already exists, it is not overridden.
     *
     * @param string  $originFile The original filename
     * @param string  $targetFile The target filename
     * @param boolean $override   Whether to override an existing file or not
     *
     * @throws FileNotFoundException    When originFile doesn't exist
     * @throws IOException              When copy fails
     */
    public function copy($originFile, $targetFile, $override = false)
    {
        if (stream_is_local($originFile) && !is_file($originFile)) {
            throw new FileNotFoundException(sprintf('Failed to copy "%s" because file does not exist.', $originFile), 0, null, $originFile);
        }

        $this->mkdir(dirname($targetFile));

        if (!$override && is_file($targetFile) && null === parse_url($originFile, PHP_URL_HOST)) {
            $doCopy = filemtime($originFile) > filemtime($targetFile);
        } else {
            $doCopy = true;
        }

        if ($doCopy) {
            // https://bugs.php.net/bug.php?id=64634
            $source = fopen($originFile, 'r');
            $target = fopen($targetFile, 'w');
            stream_copy_to_stream($source, $target);
            fclose($source);
            fclose($target);
            unset($source, $target);

            if (!is_file($targetFile)) {
                throw new IOException(sprintf('Failed to copy "%s" to "%s".', $originFile, $targetFile), 0, null, $originFile);
            }
        }
    }

    /**
     * Creates a directory recursively.
     *
     * @param string|array|\Traversable $dirs The directory path
     * @param integer                   $mode The directory mode
     *
     * @throws IOException On any directory creation failure
     */
    public function mkdir($dirs, $mode = 0777)
    {
        foreach ($this->toIterator($dirs) as $dir) {
            if (is_dir($dir)) {
                continue;
            }

            if (true !== @mkdir($dir, $mode, true)) {
                throw new IOException(sprintf('Failed to create "%s".', $dir), 0, null, $dir);
            }
        }
    }

    /**
     * Checks the existence of files or directories.
     *
     * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to check
     *
     * @return Boolean true if the file exists, false otherwise
     */
    public function exists($files)
    {
        foreach ($this->toIterator($files) as $file) {
            if (!file_exists($file)) {
                return false;
            }
        }

        return true;
    }

    /**
     * Sets access and modification time of file.
     *
     * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to create
     * @param integer                   $time  The touch time as a Unix timestamp
     * @param integer                   $atime The access time as a Unix timestamp
     *
     * @throws IOException When touch fails
     */
    public function touch($files, $time = null, $atime = null)
    {
        foreach ($this->toIterator($files) as $file) {
            $touch = $time ? @touch($file, $time, $atime) : @touch($file);
            if (true !== $touch) {
                throw new IOException(sprintf('Failed to touch "%s".', $file), 0, null, $file);
            }
        }
    }

    /**
     * Removes files or directories.
     *
     * @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to remove
     *
     * @throws IOException When removal fails
     */
    public function remove($files)
    {
        $files = iterator_to_array($this->toIterator($files));
        $files = array_reverse($files);
        foreach ($files as $file) {
            if (!file_exists($file) && !is_link($file)) {
                continue;
            }

            if (is_dir($file) && !is_link($file)) {
                $this->remove(new \FilesystemIterator($file));

                if (true !== @rmdir($file)) {
                    throw new IOException(sprintf('Failed to remove directory "%s".', $file), 0, null, $file);
                }
            } else {
                // https://bugs.php.net/bug.php?id=52176
                if (defined('PHP_WINDOWS_VERSION_MAJOR') && is_dir($file)) {
                    if (true !== @rmdir($file)) {
                        throw new IOException(sprintf('Failed to remove file "%s".', $file), 0, null, $file);
                    }
                } else {
                    if (true !== @unlink($file)) {
                        throw new IOException(sprintf('Failed to remove file "%s".', $file), 0, null, $file);
                    }
                }
            }
        }
    }

    /**
     * Change mode for an array of files or directories.
     *
     * @param string|array|\Traversable $files     A filename, an array of files, or a \Traversable instance to change mode
     * @param integer                   $mode      The new mode (octal)
     * @param integer                   $umask     The mode mask (octal)
     * @param Boolean                   $recursive Whether change the mod recursively or not
     *
     * @throws IOException When the change fail
     */
    public function chmod($files, $mode, $umask = 0000, $recursive = false)
    {
        foreach ($this->toIterator($files) as $file) {
            if ($recursive && is_dir($file) && !is_link($file)) {
                $this->chmod(new \FilesystemIterator($file), $mode, $umask, true);
            }
            if (true !== @chmod($file, $mode & ~$umask)) {
                throw new IOException(sprintf('Failed to chmod file "%s".', $file), 0, null, $file);
            }
        }
    }

    /**
     * Change the owner of an array of files or directories
     *
     * @param string|array|\Traversable $files     A filename, an array of files, or a \Traversable instance to change owner
     * @param string                    $user      The new owner user name
     * @param Boolean                   $recursive Whether change the owner recursively or not
     *
     * @throws IOException When the change fail
     */
    public function chown($files, $user, $recursive = false)
    {
        foreach ($this->toIterator($files) as $file) {
            if ($recursive && is_dir($file) && !is_link($file)) {
                $this->chown(new \FilesystemIterator($file), $user, true);
            }
            if (is_link($file) && function_exists('lchown')) {
                if (true !== @lchown($file, $user)) {
                    throw new IOException(sprintf('Failed to chown file "%s".', $file), 0, null, $file);
                }
            } else {
                if (true !== @chown($file, $user)) {
                    throw new IOException(sprintf('Failed to chown file "%s".', $file), 0, null, $file);
                }
            }
        }
    }

    /**
     * Change the group of an array of files or directories
     *
     * @param string|array|\Traversable $files     A filename, an array of files, or a \Traversable instance to change group
     * @param string                    $group     The group name
     * @param Boolean                   $recursive Whether change the group recursively or not
     *
     * @throws IOException When the change fail
     */
    public function chgrp($files, $group, $recursive = false)
    {
        foreach ($this->toIterator($files) as $file) {
            if ($recursive && is_dir($file) && !is_link($file)) {
                $this->chgrp(new \FilesystemIterator($file), $group, true);
            }
            if (is_link($file) && function_exists('lchgrp')) {
                if (true !== @lchgrp($file, $group)) {
                    throw new IOException(sprintf('Failed to chgrp file "%s".', $file), 0, null, $file);
                }
            } else {
                if (true !== @chgrp($file, $group)) {
                    throw new IOException(sprintf('Failed to chgrp file "%s".', $file), 0, null, $file);
                }
            }
        }
    }

    /**
     * Renames a file or a directory.
     *
     * @param string  $origin    The origin filename or directory
     * @param string  $target    The new filename or directory
     * @param Boolean $overwrite Whether to overwrite the target if it already exists
     *
     * @throws IOException When target file or directory already exists
     * @throws IOException When origin cannot be renamed
     */
    public function rename($origin, $target, $overwrite = false)
    {
        // we check that target does not exist
        if (!$overwrite && is_readable($target)) {
            throw new IOException(sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target);
        }

        if (true !== @rename($origin, $target)) {
            throw new IOException(sprintf('Cannot rename "%s" to "%s".', $origin, $target), 0, null, $target);
        }
    }

    /**
     * Creates a symbolic link or copy a directory.
     *
     * @param string  $originDir     The origin directory path
     * @param string  $targetDir     The symbolic link name
     * @param Boolean $copyOnWindows Whether to copy files if on Windows
     *
     * @throws IOException When symlink fails
     */
    public function symlink($originDir, $targetDir, $copyOnWindows = false)
    {
        if (!function_exists('symlink') && $copyOnWindows) {
            $this->mirror($originDir, $targetDir);

            return;
        }

        $this->mkdir(dirname($targetDir));

        $ok = false;
        if (is_link($targetDir)) {
            if (readlink($targetDir) != $originDir) {
                $this->remove($targetDir);
            } else {
                $ok = true;
            }
        }

        if (!$ok) {
            if (true !== @symlink($originDir, $targetDir)) {
                $report = error_get_last();
                if (is_array($report)) {
                    if (defined('PHP_WINDOWS_VERSION_MAJOR') && false !== strpos($report['message'], 'error code(1314)')) {
                        throw new IOException('Unable to create symlink due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?');
                    }
                }

                throw new IOException(sprintf('Failed to create symbolic link from "%s" to "%s".', $originDir, $targetDir), 0, null, $targetDir);
            }
        }
    }

    /**
     * Given an existing path, convert it to a path relative to a given starting path
     *
     * @param string $endPath   Absolute path of target
     * @param string $startPath Absolute path where traversal begins
     *
     * @return string Path of target relative to starting path
     */
    public function makePathRelative($endPath, $startPath)
    {
        // Normalize separators on Windows
        if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
            $endPath = strtr($endPath, '\\', '/');
            $startPath = strtr($startPath, '\\', '/');
        }

        // Split the paths into arrays
        $startPathArr = explode('/', trim($startPath, '/'));
        $endPathArr = explode('/', trim($endPath, '/'));

        // Find for which directory the common path stops
        $index = 0;
        while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) {
            $index++;
        }

        // Determine how deep the start path is relative to the common path (ie, "web/bundles" = 2 levels)
        $depth = count($startPathArr) - $index;

        // Repeated "../" for each level need to reach the common path
        $traverser = str_repeat('../', $depth);

        $endPathRemainder = implode('/', array_slice($endPathArr, $index));

        // Construct $endPath from traversing to the common path, then to the remaining $endPath
        $relativePath = $traverser.(strlen($endPathRemainder) > 0 ? $endPathRemainder.'/' : '');

        return (strlen($relativePath) === 0) ? './' : $relativePath;
    }

    /**
     * Mirrors a directory to another.
     *
     * @param string       $originDir The origin directory
     * @param string       $targetDir The target directory
     * @param \Traversable $iterator  A Traversable instance
     * @param array        $options   An array of boolean options
     *                               Valid options are:
     *                                 - $options['override'] Whether to override an existing file on copy or not (see copy())
     *                                 - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink())
     *                                 - $options['delete'] Whether to delete files that are not in the source directory (defaults to false)
     *
     * @throws IOException When file type is unknown
     */
    public function mirror($originDir, $targetDir, \Traversable $iterator = null, $options = array())
    {
        $targetDir = rtrim($targetDir, '/\\');
        $originDir = rtrim($originDir, '/\\');

        // Iterate in destination folder to remove obsolete entries
        if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) {
            $deleteIterator = $iterator;
            if (null === $deleteIterator) {
                $flags = \FilesystemIterator::SKIP_DOTS;
                $deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST);
            }
            foreach ($deleteIterator as $file) {
                $origin = str_replace($targetDir, $originDir, $file->getPathname());
                if (!$this->exists($origin)) {
                    $this->remove($file);
                }
            }
        }

        $copyOnWindows = false;
        if (isset($options['copy_on_windows']) && !function_exists('symlink')) {
            $copyOnWindows = $options['copy_on_windows'];
        }

        if (null === $iterator) {
            $flags = $copyOnWindows ? \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS : \FilesystemIterator::SKIP_DOTS;
            $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST);
        }

        foreach ($iterator as $file) {
            $target = str_replace($originDir, $targetDir, $file->getPathname());

            if ($copyOnWindows) {
                if (is_link($file) || is_file($file)) {
                    $this->copy($file, $target, isset($options['override']) ? $options['override'] : false);
                } elseif (is_dir($file)) {
                    $this->mkdir($target);
                } else {
                    throw new IOException(sprintf('Unable to guess "%s" file type.', $file), 0, null, $file);
                }
            } else {
                if (is_link($file)) {
                    $this->symlink($file->getLinkTarget(), $target);
                } elseif (is_dir($file)) {
                    $this->mkdir($target);
                } elseif (is_file($file)) {
                    $this->copy($file, $target, isset($options['override']) ? $options['override'] : false);
                } else {
                    throw new IOException(sprintf('Unable to guess "%s" file type.', $file), 0, null, $file);
                }
            }
        }
    }

    /**
     * Returns whether the file path is an absolute path.
     *
     * @param string $file A file path
     *
     * @return Boolean
     */
    public function isAbsolutePath($file)
    {
        if (strspn($file, '/\\', 0, 1)
            || (strlen($file) > 3 && ctype_alpha($file[0])
                && substr($file, 1, 1) === ':'
                && (strspn($file, '/\\', 2, 1))
            )
            || null !== parse_url($file, PHP_URL_SCHEME)
        ) {
            return true;
        }

        return false;
    }

    /**
     * Atomically dumps content into a file.
     *
     * @param  string       $filename The file to be written to.
     * @param  string       $content  The data to write into the file.
     * @param  null|integer $mode     The file mode (octal). If null, file permissions are not modified
     *                                Deprecated since version 2.3.12, to be removed in 3.0.
     * @throws IOException            If the file cannot be written to.
     */
    public function dumpFile($filename, $content, $mode = 0666)
    {
        $dir = dirname($filename);

        if (!is_dir($dir)) {
            $this->mkdir($dir);
        } elseif (!is_writable($dir)) {
            throw new IOException(sprintf('Unable to write to the "%s" directory.', $dir), 0, null, $dir);
        }

        $tmpFile = tempnam($dir, basename($filename));

        if (false === @file_put_contents($tmpFile, $content)) {
            throw new IOException(sprintf('Failed to write file "%s".', $filename), 0, null, $filename);
        }

        $this->rename($tmpFile, $filename, true);
        if (null !== $mode) {
            $this->chmod($filename, $mode);
        }
    }

    /**
     * @param mixed $files
     *
     * @return \Traversable
     */
    private function toIterator($files)
    {
        if (!$files instanceof \Traversable) {
            $files = new \ArrayObject(is_array($files) ? $files : array($files));
        }

        return $files;
    }
}
PK�`�\ƭW��/pear/Symfony/Component/Validator/Constraint.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Exception\InvalidOptionsException;
use Symfony\Component\Validator\Exception\MissingOptionsException;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;

/**
 * Contains the properties of a constraint definition.
 *
 * A constraint can be defined on a class, an option or a getter method.
 * The Constraint class encapsulates all the configuration required for
 * validating this class, option or getter result successfully.
 *
 * Constraint instances are immutable and serializable.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
abstract class Constraint
{
    /**
     * The name of the group given to all constraints with no explicit group
     * @var string
     */
    const DEFAULT_GROUP = 'Default';

    /**
     * Marks a constraint that can be put onto classes
     * @var string
     */
    const CLASS_CONSTRAINT = 'class';

    /**
     * Marks a constraint that can be put onto properties
     * @var string
     */
    const PROPERTY_CONSTRAINT = 'property';

    /**
     * @var array
     */
    public $groups = array(self::DEFAULT_GROUP);

    /**
     * Initializes the constraint with options.
     *
     * You should pass an associative array. The keys should be the names of
     * existing properties in this class. The values should be the value for these
     * properties.
     *
     * Alternatively you can override the method getDefaultOption() to return the
     * name of an existing property. If no associative array is passed, this
     * property is set instead.
     *
     * You can force that certain options are set by overriding
     * getRequiredOptions() to return the names of these options. If any
     * option is not set here, an exception is thrown.
     *
     * @param mixed $options The options (as associative array)
     *                       or the value for the default
     *                       option (any other type)
     *
     * @throws InvalidOptionsException       When you pass the names of non-existing
     *                                       options
     * @throws MissingOptionsException       When you don't pass any of the options
     *                                       returned by getRequiredOptions()
     * @throws ConstraintDefinitionException When you don't pass an associative
     *                                       array, but getDefaultOption() returns
     *                                       null
     *
     * @api
     */
    public function __construct($options = null)
    {
        $invalidOptions = array();
        $missingOptions = array_flip((array) $this->getRequiredOptions());

        if (is_array($options) && count($options) >= 1 && isset($options['value']) && !property_exists($this, 'value')) {
            $options[$this->getDefaultOption()] = $options['value'];
            unset($options['value']);
        }

        if (is_array($options) && count($options) > 0 && is_string(key($options))) {
            foreach ($options as $option => $value) {
                if (property_exists($this, $option)) {
                    $this->$option = $value;
                    unset($missingOptions[$option]);
                } else {
                    $invalidOptions[] = $option;
                }
            }
        } elseif (null !== $options && ! (is_array($options) && count($options) === 0)) {
            $option = $this->getDefaultOption();

            if (null === $option) {
                throw new ConstraintDefinitionException(
                    sprintf('No default option is configured for constraint %s', get_class($this))
                );
            }

            if (property_exists($this, $option)) {
                $this->$option = $options;
                unset($missingOptions[$option]);
            } else {
                $invalidOptions[] = $option;
            }
        }

        if (count($invalidOptions) > 0) {
            throw new InvalidOptionsException(
                sprintf('The options "%s" do not exist in constraint %s', implode('", "', $invalidOptions), get_class($this)),
                $invalidOptions
            );
        }

        if (count($missingOptions) > 0) {
            throw new MissingOptionsException(
                sprintf('The options "%s" must be set for constraint %s', implode('", "', array_keys($missingOptions)), get_class($this)),
                array_keys($missingOptions)
            );
        }

        $this->groups = (array) $this->groups;
    }

    /**
     * Unsupported operation.
     */
    public function __set($option, $value)
    {
        throw new InvalidOptionsException(sprintf('The option "%s" does not exist in constraint %s', $option, get_class($this)), array($option));
    }

    /**
     * Adds the given group if this constraint is in the Default group
     *
     * @param string $group
     *
     * @api
     */
    public function addImplicitGroupName($group)
    {
        if (in_array(Constraint::DEFAULT_GROUP, $this->groups) && !in_array($group, $this->groups)) {
            $this->groups[] = $group;
        }
    }

    /**
     * Returns the name of the default option
     *
     * Override this method to define a default option.
     *
     * @return string
     * @see __construct()
     *
     * @api
     */
    public function getDefaultOption()
    {
        return null;
    }

    /**
     * Returns the name of the required options
     *
     * Override this method if you want to define required options.
     *
     * @return array
     * @see __construct()
     *
     * @api
     */
    public function getRequiredOptions()
    {
        return array();
    }

    /**
     * Returns the name of the class that validates this constraint
     *
     * By default, this is the fully qualified name of the constraint class
     * suffixed with "Validator". You can override this method to change that
     * behaviour.
     *
     * @return string
     *
     * @api
     */
    public function validatedBy()
    {
        return get_class($this).'Validator';
    }

    /**
     * Returns whether the constraint can be put onto classes, properties or
     * both
     *
     * This method should return one or more of the constants
     * Constraint::CLASS_CONSTRAINT and Constraint::PROPERTY_CONSTRAINT.
     *
     * @return string|array  One or more constant values
     *
     * @api
     */
    public function getTargets()
    {
        return self::PROPERTY_CONSTRAINT;
    }
}
PK�`�\}`���>pear/Symfony/Component/Validator/PropertyMetadataInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * A container for validation metadata of a property.
 *
 * What exactly you define as "property" is up to you. The validator expects
 * implementations of {@link MetadataInterface} that contain constraints and
 * optionally a list of named properties that also have constraints (and may
 * have further sub properties). Such properties are mapped by implementations
 * of this interface.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @see MetadataInterface
 */
interface PropertyMetadataInterface extends MetadataInterface
{
    /**
     * Returns the name of the property.
     *
     * @return string The property name.
     */
    public function getPropertyName();

    /**
     * Extracts the value of the property from the given container.
     *
     * @param mixed $containingValue The container to extract the property value from.
     *
     * @return mixed The value of the property.
     */
    public function getPropertyValue($containingValue);
}
PK�`�\xf�JJ/pear/Symfony/Component/Validator/Validation.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Entry point for the Validator component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
final class Validation
{
    /**
     * Creates a new validator.
     *
     * If you want to configure the validator, use
     * {@link createValidatorBuilder()} instead.
     *
     * @return ValidatorInterface The new validator.
     */
    public static function createValidator()
    {
        return self::createValidatorBuilder()->getValidator();
    }

    /**
     * Creates a configurable builder for validator objects.
     *
     * @return ValidatorBuilderInterface The new builder.
     */
    public static function createValidatorBuilder()
    {
        return new ValidatorBuilder();
    }

    /**
     * This class cannot be instantiated.
     */
    private function __construct()
    {
    }
}
PK�`�\K��}}6pear/Symfony/Component/Validator/DefaultTranslator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Exception\BadMethodCallException;
use Symfony\Component\Validator\Exception\InvalidArgumentException;
use Symfony\Component\Translation\TranslatorInterface;

/**
 * Simple translator implementation that simply replaces the parameters in
 * the message IDs.
 *
 * Example usage:
 *
 *     $translator = new DefaultTranslator();
 *
 *     echo $translator->trans(
 *         'This is a {{ var }}.',
 *         array('{{ var }}' => 'donkey')
 *     );
 *
 *     // -> This is a donkey.
 *
 *     echo $translator->transChoice(
 *         'This is {{ count }} donkey.|These are {{ count }} donkeys.',
 *         3,
 *         array('{{ count }}' => 'three')
 *     );
 *
 *     // -> These are three donkeys.
 *
 * This translator does not support message catalogs, translation domains or
 * locales. Instead, it implements a subset of the capabilities of
 * {@link \Symfony\Component\Translation\Translator} and can be used in places
 * where translation is not required by default but should be optional.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class DefaultTranslator implements TranslatorInterface
{
    /**
     * Interpolates the given message.
     *
     * Parameters are replaced in the message in the same manner that
     * {@link strtr()} uses.
     *
     * Example usage:
     *
     *     $translator = new DefaultTranslator();
     *
     *     echo $translator->trans(
     *         'This is a {{ var }}.',
     *         array('{{ var }}' => 'donkey')
     *     );
     *
     *     // -> This is a donkey.
     *
     * @param string $id         The message id
     * @param array  $parameters An array of parameters for the message
     * @param string $domain     Ignored
     * @param string $locale     Ignored
     *
     * @return string The interpolated string
     */
    public function trans($id, array $parameters = array(), $domain = null, $locale = null)
    {
        return strtr($id, $parameters);
    }

    /**
     * Interpolates the given choice message by choosing a variant according to a number.
     *
     * The variants are passed in the message ID using the format
     * "<singular>|<plural>". "<singular>" is chosen if the passed $number is
     * exactly 1. "<plural>" is chosen otherwise.
     *
     * This format is consistent with the format supported by
     * {@link \Symfony\Component\Translation\Translator}, but it does not
     * have the same expressiveness. While Translator supports intervals in
     * message translations, which are needed for languages other than English,
     * this translator does not. You should use Translator or a custom
     * implementation of {@link TranslatorInterface} if you need this or similar
     * functionality.
     *
     * Example usage:
     *
     *     echo $translator->transChoice(
     *         'This is {{ count }} donkey.|These are {{ count }} donkeys.',
     *         0,
     *         array('{{ count }}' => 0)
     *     );
     *
     *     // -> These are 0 donkeys.
     *
     *     echo $translator->transChoice(
     *         'This is {{ count }} donkey.|These are {{ count }} donkeys.',
     *         1,
     *         array('{{ count }}' => 1)
     *     );
     *
     *     // -> This is 1 donkey.
     *
     *     echo $translator->transChoice(
     *         'This is {{ count }} donkey.|These are {{ count }} donkeys.',
     *         3,
     *         array('{{ count }}' => 3)
     *     );
     *
     *     // -> These are 3 donkeys.
     *
     * @param string  $id         The message id
     * @param integer $number     The number to use to find the index of the message
     * @param array   $parameters An array of parameters for the message
     * @param string  $domain     Ignored
     * @param string  $locale     Ignored
     *
     * @return string The translated string
     *
     * @throws InvalidArgumentException If the message id does not have the format
     *                                  "singular|plural".
     */
    public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
    {
        $ids = explode('|', $id);

        if (1 == $number) {
            return strtr($ids[0], $parameters);
        }

        if (!isset($ids[1])) {
            throw new InvalidArgumentException(sprintf('The message "%s" cannot be pluralized, because it is missing a plural (e.g. "There is one apple|There are %%count%% apples").', $id));
        }

        return strtr($ids[1], $parameters);
    }

    /**
     * Not supported.
     *
     * @param string $locale The locale
     *
     * @throws BadMethodCallException
     */
    public function setLocale($locale)
    {
        throw new BadMethodCallException('Unsupported method.');
    }

    /**
     * Returns the locale of the translator.
     *
     * @return string Always returns 'en'
     */
    public function getLocale()
    {
        return 'en';
    }
}
PK�`�\bh��Gpear/Symfony/Component/Validator/PropertyMetadataContainerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * A container for {@link PropertyMetadataInterface} instances.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface PropertyMetadataContainerInterface
{
    /**
     * Check if there's any metadata attached to the given named property.
     *
     * @param string $property The property name.
     *
     * @return Boolean
     */
    public function hasPropertyMetadata($property);

    /**
     * Returns all metadata instances for the given named property.
     *
     * If your implementation does not support properties, simply throw an
     * exception in this method (for example a <tt>BadMethodCallException</tt>).
     *
     * @param string $property The property name.
     *
     * @return PropertyMetadataInterface[] A list of metadata instances. Empty if
     *                                     no metadata exists for the property.
     */
    public function getPropertyMetadata($property);
}
PK�`�\�����8pear/Symfony/Component/Validator/ConstraintViolation.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Default implementation of {@ConstraintViolationInterface}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ConstraintViolation implements ConstraintViolationInterface
{
    /**
     * @var string
     */
    private $message;

    /**
     * @var string
     */
    private $messageTemplate;

    /**
     * @var array
     */
    private $messageParameters;

    /**
     * @var integer|null
     */
    private $messagePluralization;

    /**
     * @var mixed
     */
    private $root;

    /**
     * @var string
     */
    private $propertyPath;

    /**
     * @var mixed
     */
    private $invalidValue;

    /**
     * @var mixed
     */
    private $code;

    /**
     * Creates a new constraint violation.
     *
     * @param string       $message               The violation message.
     * @param string       $messageTemplate       The raw violation message.
     * @param array        $messageParameters     The parameters to substitute
     *                                            in the raw message.
     * @param mixed        $root                  The value originally passed
     *                                            to the validator.
     * @param string       $propertyPath          The property path from the
     *                                            root value to the invalid
     *                                            value.
     * @param mixed        $invalidValue          The invalid value causing the
     *                                            violation.
     * @param integer|null $messagePluralization  The pluralization parameter.
     * @param mixed        $code                  The error code of the
     *                                            violation, if any.
     */
    public function __construct($message, $messageTemplate, array $messageParameters, $root, $propertyPath, $invalidValue, $messagePluralization = null, $code = null)
    {
        $this->message = $message;
        $this->messageTemplate = $messageTemplate;
        $this->messageParameters = $messageParameters;
        $this->messagePluralization = $messagePluralization;
        $this->root = $root;
        $this->propertyPath = $propertyPath;
        $this->invalidValue = $invalidValue;
        $this->code = $code;
    }

    /**
     * Converts the violation into a string for debugging purposes.
     *
     * @return string The violation as string.
     */
    public function __toString()
    {
        if (is_object($this->root)) {
            $class = get_class($this->root);
        } elseif (is_array($this->root)) {
            $class = "Array";
        } else {
            $class = (string) $this->root;
        }

        $propertyPath = (string) $this->propertyPath;
        $code = $this->code;

        if ('' !== $propertyPath && '[' !== $propertyPath[0] && '' !== $class) {
            $class .= '.';
        }

        if (!empty($code)) {
            $code = ' (code '.$code.')';
        }

        return $class.$propertyPath.":\n    ".$this->getMessage().$code;
    }

    /**
     * {@inheritDoc}
     */
    public function getMessageTemplate()
    {
        return $this->messageTemplate;
    }

    /**
     * {@inheritDoc}
     */
    public function getMessageParameters()
    {
        return $this->messageParameters;
    }

    /**
     * {@inheritDoc}
     */
    public function getMessagePluralization()
    {
        return $this->messagePluralization;
    }

    /**
     * {@inheritDoc}
     */
    public function getMessage()
    {
        return $this->message;
    }

    /**
     * {@inheritDoc}
     */
    public function getRoot()
    {
        return $this->root;
    }

    /**
     * {@inheritDoc}
     */
    public function getPropertyPath()
    {
        return $this->propertyPath;
    }

    /**
     * {@inheritDoc}
     */
    public function getInvalidValue()
    {
        return $this->invalidValue;
    }

    /**
     * {@inheritDoc}
     */
    public function getCode()
    {
        return $this->code;
    }
}
PK�`�\�޽/!/!5pear/Symfony/Component/Validator/ExecutionContext.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

use Symfony\Component\Translation\TranslatorInterface;

/**
 * Default implementation of {@link ExecutionContextInterface}.
 *
 * This class is immutable by design.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ExecutionContext implements ExecutionContextInterface
{
    /**
     * @var GlobalExecutionContextInterface
     */
    private $globalContext;

    /**
     * @var TranslatorInterface
     */
    private $translator;

    /**
     * @var null|string
     */
    private $translationDomain;

    /**
     * @var MetadataInterface
     */
    private $metadata;

    /**
     * @var mixed
     */
    private $value;

    /**
     * @var string
     */
    private $group;

    /**
     * @var string
     */
    private $propertyPath;

    /**
     * Creates a new execution context.
     *
     * @param GlobalExecutionContextInterface $globalContext     The global context storing node-independent state.
     * @param TranslatorInterface             $translator        The translator for translating violation messages.
     * @param null|string                     $translationDomain The domain of the validation messages.
     * @param MetadataInterface               $metadata          The metadata of the validated node.
     * @param mixed                           $value             The value of the validated node.
     * @param string                          $group             The current validation group.
     * @param string                          $propertyPath      The property path to the current node.
     */
    public function __construct(GlobalExecutionContextInterface $globalContext, TranslatorInterface $translator, $translationDomain = null, MetadataInterface $metadata = null, $value = null, $group = null, $propertyPath = '')
    {
        if (null === $group) {
            $group = Constraint::DEFAULT_GROUP;
        }

        $this->globalContext = $globalContext;
        $this->translator = $translator;
        $this->translationDomain = $translationDomain;
        $this->metadata = $metadata;
        $this->value = $value;
        $this->propertyPath = $propertyPath;
        $this->group = $group;
    }

    /**
     * {@inheritdoc}
     */
    public function addViolation($message, array $params = array(), $invalidValue = null, $pluralization = null, $code = null)
    {
        if (null === $pluralization) {
            $translatedMessage = $this->translator->trans($message, $params, $this->translationDomain);
        } else {
            try {
                $translatedMessage = $this->translator->transChoice($message, $pluralization, $params, $this->translationDomain);
            } catch (\InvalidArgumentException $e) {
                $translatedMessage = $this->translator->trans($message, $params, $this->translationDomain);
            }
        }

        $this->globalContext->getViolations()->add(new ConstraintViolation(
            $translatedMessage,
            $message,
            $params,
            $this->globalContext->getRoot(),
            $this->propertyPath,
            // check using func_num_args() to allow passing null values
            func_num_args() >= 3 ? $invalidValue : $this->value,
            $pluralization,
            $code
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function addViolationAt($subPath, $message, array $params = array(), $invalidValue = null, $pluralization = null, $code = null)
    {
        $this->globalContext->getViolations()->add(new ConstraintViolation(
            null === $pluralization
                ? $this->translator->trans($message, $params, $this->translationDomain)
                : $this->translator->transChoice($message, $pluralization, $params, $this->translationDomain),
            $message,
            $params,
            $this->globalContext->getRoot(),
            $this->getPropertyPath($subPath),
            // check using func_num_args() to allow passing null values
            func_num_args() >= 4 ? $invalidValue : $this->value,
            $pluralization,
            $code
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getViolations()
    {
        return $this->globalContext->getViolations();
    }

    /**
     * {@inheritdoc}
     */
    public function getRoot()
    {
        return $this->globalContext->getRoot();
    }

    /**
     * {@inheritdoc}
     */
    public function getPropertyPath($subPath = '')
    {
        if ('' != $subPath && '' !== $this->propertyPath && '[' !== $subPath[0]) {
            return $this->propertyPath.'.'.$subPath;
        }

        return $this->propertyPath.$subPath;
    }

    /**
     * {@inheritdoc}
     */
    public function getClassName()
    {
        if ($this->metadata instanceof ClassBasedInterface) {
            return $this->metadata->getClassName();
        }

        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function getPropertyName()
    {
        if ($this->metadata instanceof PropertyMetadataInterface) {
            return $this->metadata->getPropertyName();
        }

        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * {@inheritdoc}
     */
    public function getGroup()
    {
        return $this->group;
    }

    /**
     * {@inheritdoc}
     */
    public function getMetadata()
    {
        return $this->metadata;
    }

    /**
     * {@inheritdoc}
     */
    public function getMetadataFor($value)
    {
        return $this->globalContext->getMetadataFactory()->getMetadataFor($value);
    }

    /**
     * {@inheritdoc}
     */
    public function validate($value, $subPath = '', $groups = null, $traverse = false, $deep = false)
    {
        $propertyPath = $this->getPropertyPath($subPath);

        foreach ($this->resolveGroups($groups) as $group) {
            $this->globalContext->getVisitor()->validate($value, $group, $propertyPath, $traverse, $deep);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function validateValue($value, $constraints, $subPath = '', $groups = null)
    {
        $constraints = is_array($constraints) ? $constraints : array($constraints);

        if (null === $groups && '' === $subPath) {
            $context = clone $this;
            $context->value = $value;
            $context->executeConstraintValidators($value, $constraints);

            return;
        }

        $propertyPath = $this->getPropertyPath($subPath);

        foreach ($this->resolveGroups($groups) as $group) {
            $context = clone $this;
            $context->value = $value;
            $context->group = $group;
            $context->propertyPath = $propertyPath;
            $context->executeConstraintValidators($value, $constraints);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getMetadataFactory()
    {
        return $this->globalContext->getMetadataFactory();
    }

    /**
     * Executes the validators of the given constraints for the given value.
     *
     * @param mixed        $value       The value to validate.
     * @param Constraint[] $constraints The constraints to match against.
     */
    private function executeConstraintValidators($value, array $constraints)
    {
        foreach ($constraints as $constraint) {
            $validator = $this->globalContext->getValidatorFactory()->getInstance($constraint);
            $validator->initialize($this);
            $validator->validate($value, $constraint);
        }
    }

    /**
     * Returns an array of group names.
     *
     * @param null|string|string[] $groups The groups to resolve. If a single string is
     *                                     passed, it is converted to an array. If null
     *                                     is passed, an array containing the current
     *                                     group of the context is returned.
     *
     * @return array An array of validation groups.
     */
    private function resolveGroups($groups)
    {
        return $groups ? (array) $groups : (array) $this->group;
    }
}
PK�`�\�S�UUCpear/Symfony/Component/Validator/GroupSequenceProviderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Defines the interface for a group sequence provider.
 */
interface GroupSequenceProviderInterface
{
    /**
     * Returns which validation groups should be used for a certain state
     * of the object.
     *
     * @return array An array of validation groups
     */
    public function getGroupSequence();
}
PK�`�\����C0C0>pear/Symfony/Component/Validator/ExecutionContextInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Stores the validator's state during validation.
 *
 * For example, let's validate the following object graph:
 *
 * <pre>
 * (Person)---($firstName: string)
 *      \
 *   ($address: Address)---($street: string)
 * </pre>
 *
 * We validate the <tt>Person</tt> instance, which becomes the "root" of the
 * validation run (see {@link getRoot}). The state of the context after the
 * first step will be like this:
 *
 * <pre>
 * (Person)---($firstName: string)
 *    ^ \
 *   ($address: Address)---($street: string)
 * </pre>
 *
 * The validator is stopped at the <tt>Person</tt> node, both the root and the
 * value (see {@link getValue}) of the context point to the <tt>Person</tt>
 * instance. The property path is empty at this point (see {@link getPropertyPath}).
 * The metadata of the context is the metadata of the <tt>Person</tt> node
 * (see {@link getMetadata}).
 *
 * After advancing to the property <tt>$firstName</tt> of the <tt>Person</tt>
 * instance, the state of the context looks like this:
 *
 * <pre>
 * (Person)---($firstName: string)
 *      \              ^
 *   ($address: Address)---($street: string)
 * </pre>
 *
 * The validator is stopped at the property <tt>$firstName</tt>. The root still
 * points to the <tt>Person</tt> instance, because this is where the validation
 * started. The property path is now "firstName" and the current value is the
 * value of that property.
 *
 * After advancing to the <tt>$address</tt> property and then to the
 * <tt>$street</tt> property of the <tt>Address</tt> instance, the context state
 * looks like this:
 *
 * <pre>
 * (Person)---($firstName: string)
 *      \
 *   ($address: Address)---($street: string)
 *                               ^
 * </pre>
 *
 * The validator is stopped at the property <tt>$street</tt>. The root still
 * points to the <tt>Person</tt> instance, but the property path is now
 * "address.street" and the validated value is the value of that property.
 *
 * Apart from the root, the property path and the currently validated value,
 * the execution context also knows the metadata of the current node (see
 * {@link getMetadata}) which for example returns a {@link Mapping\PropertyMetadata}
 * or a {@link Mapping\ClassMetadata} object. he context also contains the
 * validation group that is currently being validated (see {@link getGroup}) and
 * the violations that happened up until now (see {@link getViolations}).
 *
 * Apart from reading the execution context, you can also use
 * {@link addViolation} or {@link addViolationAt} to add new violations and
 * {@link validate} or {@link validateValue} to validate values that the
 * validator otherwise would not reach.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
interface ExecutionContextInterface
{
    /**
     * Adds a violation at the current node of the validation graph.
     *
     * @param string       $message       The error message.
     * @param array        $params        The parameters substituted in the error message.
     * @param mixed        $invalidValue  The invalid, validated value.
     * @param integer|null $pluralization The number to use to pluralize of the message.
     * @param integer|null $code          The violation code.
     *
     * @api
     */
    public function addViolation($message, array $params = array(), $invalidValue = null, $pluralization = null, $code = null);

    /**
     * Adds a violation at the validation graph node with the given property
     * path relative to the current property path.
     *
     * @param string       $subPath       The relative property path for the violation.
     * @param string       $message       The error message.
     * @param array        $params        The parameters substituted in the error message.
     * @param mixed        $invalidValue  The invalid, validated value.
     * @param integer|null $pluralization The number to use to pluralize of the message.
     * @param integer|null $code          The violation code.
     *
     * @api
     */
    public function addViolationAt($subPath, $message, array $params = array(), $invalidValue = null, $pluralization = null, $code = null);

    /**
     * Validates the given value within the scope of the current validation.
     *
     * The value may be any value recognized by the used metadata factory
     * (see {@link MetadataFactoryInterface::getMetadata}), or an array or a
     * traversable object of such values.
     *
     * Usually you validate a value that is not the current node of the
     * execution context. For this case, you can pass the {@link $subPath}
     * argument which is appended to the current property path when a violation
     * is created. For example, take the following object graph:
     *
     * <pre>
     * (Person)---($address: Address)---($phoneNumber: PhoneNumber)
     *                     ^
     * </pre>
     *
     * When the execution context stops at the <tt>Person</tt> instance, the
     * property path is "address". When you validate the <tt>PhoneNumber</tt>
     * instance now, pass "phoneNumber" as sub path to correct the property path
     * to "address.phoneNumber":
     *
     * <pre>
     * $context->validate($address->phoneNumber, 'phoneNumber');
     * </pre>
     *
     * Any violations generated during the validation will be added to the
     * violation list that you can access with {@link getViolations}.
     *
     * @param mixed                $value    The value to validate.
     * @param string               $subPath  The path to append to the context's property path.
     * @param null|string|string[] $groups   The groups to validate in. If you don't pass any
     *                                       groups here, the current group of the context
     *                                       will be used.
     * @param Boolean              $traverse Whether to traverse the value if it is an array
     *                                       or an instance of <tt>\Traversable</tt>.
     * @param Boolean              $deep     Whether to traverse the value recursively if
     *                                       it is a collection of collections.
     */
    public function validate($value, $subPath = '', $groups = null, $traverse = false, $deep = false);

    /**
     * Validates a value against a constraint.
     *
     * Use the parameter <tt>$subPath</tt> to adapt the property path for the
     * validated value. For example, take the following object graph:
     *
     * <pre>
     * (Person)---($address: Address)---($street: string)
     *                     ^
     * </pre>
     *
     * When the validator validates the <tt>Address</tt> instance, the
     * property path stored in the execution context is "address". When you
     * manually validate the property <tt>$street</tt> now, pass the sub path
     * "street" to adapt the full property path to "address.street":
     *
     * <pre>
     * $context->validate($address->street, new NotNull(), 'street');
     * </pre>
     *
     * @param mixed                   $value       The value to validate.
     * @param Constraint|Constraint[] $constraints The constraint(s) to validate against.
     * @param string                  $subPath     The path to append to the context's property path.
     * @param null|string|string[]    $groups      The groups to validate in. If you don't pass any
     *                                             groups here, the current group of the context
     *                                             will be used.
     */
    public function validateValue($value, $constraints, $subPath = '', $groups = null);

    /**
     * Returns the violations generated by the validator so far.
     *
     * @return ConstraintViolationListInterface The constraint violation list.
     *
     * @api
     */
    public function getViolations();

    /**
     * Returns the value at which validation was started in the object graph.
     *
     * The validator, when given an object, traverses the properties and
     * related objects and their properties. The root of the validation is the
     * object from which the traversal started.
     *
     * The current value is returned by {@link getValue}.
     *
     * @return mixed The root value of the validation.
     */
    public function getRoot();

    /**
     * Returns the value that the validator is currently validating.
     *
     * If you want to retrieve the object that was originally passed to the
     * validator, use {@link getRoot}.
     *
     * @return mixed The currently validated value.
     */
    public function getValue();

    /**
     * Returns the metadata for the currently validated value.
     *
     * With the core implementation, this method returns a
     * {@link Mapping\ClassMetadata} instance if the current value is an object,
     * a {@link Mapping\PropertyMetadata} instance if the current value is
     * the value of a property and a {@link Mapping\GetterMetadata} instance if
     * the validated value is the result of a getter method.
     *
     * If the validated value is neither of these, for example if the validator
     * has been called with a plain value and constraint, this method returns
     * null.
     *
     * @return MetadataInterface|null The metadata of the currently validated
     *                                value.
     */
    public function getMetadata();

    /**
     * Returns the used metadata factory.
     *
     * @return MetadataFactoryInterface The metadata factory.
     */
    public function getMetadataFactory();

    /**
     * Returns the validation group that is currently being validated.
     *
     * @return string The current validation group.
     */
    public function getGroup();

    /**
     * Returns the class name of the current node.
     *
     * If the metadata of the current node does not implement
     * {@link ClassBasedInterface} or if no metadata is available for the
     * current node, this method returns null.
     *
     * @return string|null The class name or null, if no class name could be found.
     */
    public function getClassName();

    /**
     * Returns the property name of the current node.
     *
     * If the metadata of the current node does not implement
     * {@link PropertyMetadataInterface} or if no metadata is available for the
     * current node, this method returns null.
     *
     * @return string|null The property name or null, if no property name could be found.
     */
    public function getPropertyName();

    /**
     * Returns the property path to the value that the validator is currently
     * validating.
     *
     * For example, take the following object graph:
     *
     * <pre>
     * (Person)---($address: Address)---($street: string)
     * </pre>
     *
     * When the <tt>Person</tt> instance is passed to the validator, the
     * property path is initially empty. When the <tt>$address</tt> property
     * of that person is validated, the property path is "address". When
     * the <tt>$street</tt> property of the related <tt>Address</tt> instance
     * is validated, the property path is "address.street".
     *
     * Properties of objects are prefixed with a dot in the property path.
     * Indices of arrays or objects implementing the {@link \ArrayAccess}
     * interface are enclosed in brackets. For example, if the property in
     * the previous example is <tt>$addresses</tt> and contains an array
     * of <tt>Address</tt> instance, the property path generated for the
     * <tt>$street</tt> property of one of these addresses is for example
     * "addresses[0].street".
     *
     * @param string $subPath Optional. The suffix appended to the current
     *                        property path.
     *
     * @return string The current property path. The result may be an empty
     *                string if the validator is currently validating the
     *                root value of the validation graph.
     */
    public function getPropertyPath($subPath = '');
}
PK�`�\o��SS/pear/Symfony/Component/Validator/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Component\\Validator\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK�`�\K�OHpear/Symfony/Component/Validator/ConstraintValidatorFactoryInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Specifies an object able to return the correct ConstraintValidatorInterface
 * instance given a Constraint object.
 */
interface ConstraintValidatorFactoryInterface
{
    /**
     * Given a Constraint, this returns the ConstraintValidatorInterface
     * object that should be used to verify its validity.
     *
     * @param Constraint $constraint The source constraint
     *
     * @return ConstraintValidatorInterface
     */
    public function getInstance(Constraint $constraint);
}
PK�`�\AbI̲�6pear/Symfony/Component/Validator/ValidationVisitor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Exception\NoSuchMetadataException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Translation\TranslatorInterface;

/**
 * Default implementation of {@link ValidationVisitorInterface} and
 * {@link GlobalExecutionContextInterface}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ValidationVisitor implements ValidationVisitorInterface, GlobalExecutionContextInterface
{
    /**
     * @var mixed
     */
    private $root;

    /**
     * @var MetadataFactoryInterface
     */
    private $metadataFactory;

    /**
     * @var ConstraintValidatorFactoryInterface
     */
    private $validatorFactory;

    /**
     * @var TranslatorInterface
     */
    private $translator;

    /**
     * @var null|string
     */
    private $translationDomain;

    /**
     * @var array
     */
    private $objectInitializers;

    /**
     * @var ConstraintViolationList
     */
    private $violations;

    /**
     * @var array
     */
    private $validatedObjects = array();

    /**
     * Creates a new validation visitor.
     *
     * @param mixed                               $root               The value passed to the validator.
     * @param MetadataFactoryInterface            $metadataFactory    The factory for obtaining metadata instances.
     * @param ConstraintValidatorFactoryInterface $validatorFactory   The factory for creating constraint validators.
     * @param TranslatorInterface                 $translator         The translator for translating violation messages.
     * @param string|null                         $translationDomain  The domain of the translation messages.
     * @param ObjectInitializerInterface[]        $objectInitializers The initializers for preparing objects before validation.
     *
     * @throws UnexpectedTypeException If any of the object initializers is not an instance of ObjectInitializerInterface
     */
    public function __construct($root, MetadataFactoryInterface $metadataFactory, ConstraintValidatorFactoryInterface $validatorFactory, TranslatorInterface $translator, $translationDomain = null, array $objectInitializers = array())
    {
        foreach ($objectInitializers as $initializer) {
            if (!$initializer instanceof ObjectInitializerInterface) {
                throw new UnexpectedTypeException($initializer, 'Symfony\Component\Validator\ObjectInitializerInterface');
            }
        }

        $this->root = $root;
        $this->metadataFactory = $metadataFactory;
        $this->validatorFactory = $validatorFactory;
        $this->translator = $translator;
        $this->translationDomain = $translationDomain;
        $this->objectInitializers = $objectInitializers;
        $this->violations = new ConstraintViolationList();
    }

    /**
     * {@inheritdoc}
     */
    public function visit(MetadataInterface $metadata, $value, $group, $propertyPath)
    {
        $context = new ExecutionContext(
            $this,
            $this->translator,
            $this->translationDomain,
            $metadata,
            $value,
            $group,
            $propertyPath
        );

        $context->validateValue($value, $metadata->findConstraints($group));
    }

    /**
     * {@inheritdoc}
     */
    public function validate($value, $group, $propertyPath, $traverse = false, $deep = false)
    {
        if (null === $value) {
            return;
        }

        if (is_object($value)) {
            $hash = spl_object_hash($value);

            // Exit, if the object is already validated for the current group
            if (isset($this->validatedObjects[$hash][$group])) {
                return;
            }

            // Remember validating this object before starting and possibly
            // traversing the object graph
            $this->validatedObjects[$hash][$group] = true;

            foreach ($this->objectInitializers as $initializer) {
                if (!$initializer instanceof ObjectInitializerInterface) {
                    throw new \LogicException('Validator initializers must implement ObjectInitializerInterface.');
                }
                $initializer->initialize($value);
            }
        }

        // Validate arrays recursively by default, otherwise every driver needs
        // to implement special handling for arrays.
        // https://github.com/symfony/symfony/issues/6246
        if (is_array($value) || ($traverse && $value instanceof \Traversable)) {
            foreach ($value as $key => $element) {
                // Ignore any scalar values in the collection
                if (is_object($element) || is_array($element)) {
                    // Only repeat the traversal if $deep is set
                    $this->validate($element, $group, $propertyPath.'['.$key.']', $deep, $deep);
                }
            }

            try {
                $this->metadataFactory->getMetadataFor($value)->accept($this, $value, $group, $propertyPath);
            } catch (NoSuchMetadataException $e) {
                // Metadata doesn't necessarily have to exist for
                // traversable objects, because we know how to validate
                // them anyway. Optionally, additional metadata is supported.
            }
        } else {
            $this->metadataFactory->getMetadataFor($value)->accept($this, $value, $group, $propertyPath);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getViolations()
    {
        return $this->violations;
    }

    /**
     * {@inheritdoc}
     */
    public function getRoot()
    {
        return $this->root;
    }

    /**
     * {@inheritdoc}
     */
    public function getVisitor()
    {
        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getValidatorFactory()
    {
        return $this->validatorFactory;
    }

    /**
     * {@inheritdoc}
     */
    public function getMetadataFactory()
    {
        return $this->metadataFactory;
    }
}
PK�`�\z��911?pear/Symfony/Component/Validator/ObjectInitializerInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Prepares an object for validation.
 *
 * Concrete implementations of this interface are used by {@link ValidationVisitorInterface}
 * to initialize objects just before validating them.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
interface ObjectInitializerInterface
{
    /**
     * Initializes an object just before validation.
     *
     * @param object $object The object to validate
     *
     * @api
     */
    public function initialize($object);
}
PK�`�\�L8��
�
?pear/Symfony/Component/Validator/ValidationVisitorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Validates values against constraints defined in {@link MetadataInterface}
 * instances.
 *
 * This interface is an implementation of the Visitor design pattern. A value
 * is validated by first passing it to the {@link validate} method. That method
 * will determine the matching {@link MetadataInterface} for validating the
 * value. It then calls the {@link MetadataInterface::accept} method of that
 * metadata. <tt>accept()</tt> does two things:
 *
 * <ol>
 * <li>It calls {@link visit} to validate the value against the constraints of
 * the metadata.</li>
 * <li>It calls <tt>accept()</tt> on all nested metadata instances with the
 * corresponding values extracted from the current value. For example, if the
 * current metadata represents a class and the current value is an object of
 * that class, the metadata contains nested instances for each property of that
 * class. It forwards the call to these nested metadata with the values of the
 * corresponding properties in the original object.</li>
 * </ol>
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ValidationVisitorInterface
{
    /**
     * Validates a value.
     *
     * If the value is an array or a traversable object, you can set the
     * parameter <tt>$traverse</tt> to <tt>true</tt> in order to run through
     * the collection and validate each element. If these elements can be
     * collections again and you want to traverse them recursively, set the
     * parameter <tt>$deep</tt> to <tt>true</tt> as well.
     *
     * If you set <tt>$traversable</tt> to <tt>true</tt>, the visitor will
     * nevertheless try to find metadata for the collection and validate its
     * constraints. If no such metadata is found, the visitor ignores that and
     * only iterates the collection.
     *
     * If you don't set <tt>$traversable</tt> to <tt>true</tt> and the visitor
     * does not find metadata for the given value, it will fail with an
     * exception.
     *
     * @param mixed   $value        The value to validate.
     * @param string  $group        The validation group to validate.
     * @param string  $propertyPath The current property path in the validation graph.
     * @param Boolean $traverse     Whether to traverse the value if it is traversable.
     * @param Boolean $deep         Whether to traverse nested traversable values recursively.
     *
     * @throws Exception\NoSuchMetadataException If no metadata can be found for
     *                                           the given value.
     */
    public function validate($value, $group, $propertyPath, $traverse = false, $deep = false);

    /**
     * Validates a value against the constraints defined in some metadata.
     *
     * This method implements the Visitor design pattern. See also
     * {@link ValidationVisitorInterface}.
     *
     * @param MetadataInterface $metadata     The metadata holding the constraints.
     * @param mixed             $value        The value to validate.
     * @param string            $group        The validation group to validate.
     * @param string            $propertyPath The current property path in the validation graph.
     */
    public function visit(MetadataInterface $metadata, $value, $group, $propertyPath);
}
PK�`�\O��qqIpear/Symfony/Component/Validator/Constraints/LessThanOrEqualValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * Validates values are less than or equal to the previous (<=).
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class LessThanOrEqualValidator extends AbstractComparisonValidator
{
    /**
     * @inheritDoc
     */
    protected function compareValues($value1, $value2)
    {
        return $value1 <= $value2;
    }
}
PK�`�\�خ
zzDpear/Symfony/Component/Validator/Constraints/Collection/Optional.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints\Collection;

use Symfony\Component\Validator\Constraints\Optional as BaseOptional;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated in 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Validator\Constraints\Optional} instead.
 */
class Optional extends BaseOptional
{
}
PK�`�\\,y�zzDpear/Symfony/Component/Validator/Constraints/Collection/Required.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints\Collection;

use Symfony\Component\Validator\Constraints\Required as BaseRequired;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated in 2.3, to be removed in 3.0. Use
 *             {@link \Symfony\Component\Validator\Constraints\Required} instead.
 */
class Required extends BaseRequired
{
}
PK�`�\0@���>pear/Symfony/Component/Validator/Constraints/NullValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class NullValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null !== $value) {
            if (is_object($value)) {
                $value = get_class($value);
            } elseif (is_array($value)) {
                $value = 'Array';
            }

            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PK�`�\�+����5pear/Symfony/Component/Validator/Constraints/Iban.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class Iban extends Constraint
{
    public $message = 'This is not a valid International Bank Account Number (IBAN).';
}
PK�`�\rs+���9pear/Symfony/Component/Validator/Constraints/Optional.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class Optional extends Existence
{
}
PK�`�\�U�9pear/Symfony/Component/Validator/Constraints/NotBlank.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class NotBlank extends Constraint
{
    public $message = 'This value should not be blank.';
}
PK�`�\�\\Bpear/Symfony/Component/Validator/Constraints/LessThanValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * Validates values are less than the previous (<).
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class LessThanValidator extends AbstractComparisonValidator
{
    /**
     * @inheritDoc
     */
    protected function compareValues($value1, $value2)
    {
        return $value1 < $value2;
    }
}
PK�`�\�o�o��?pear/Symfony/Component/Validator/Constraints/RangeValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class RangeValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value) {
            return;
        }

        if (!is_numeric($value)) {
            $this->context->addViolation($constraint->invalidMessage, array(
                '{{ value }}' => $value,
            ));

            return;
        }

        if (null !== $constraint->max && $value > $constraint->max) {
            $this->context->addViolation($constraint->maxMessage, array(
                '{{ value }}' => $value,
                '{{ limit }}' => $constraint->max,
            ));

            return;
        }

        if (null !== $constraint->min && $value < $constraint->min) {
            $this->context->addViolation($constraint->minMessage, array(
                '{{ value }}' => $value,
                '{{ limit }}' => $constraint->min,
            ));
        }
    }
}
PK�`�\�

9pear/Symfony/Component/Validator/Constraints/Currency.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Miha Vrhovnik <miha.vrhovnik@pagein.si>
 *
 * @api
 */
class Currency extends Constraint
{
    public $message = 'This value is not a valid currency.';
}
PK�`�\@vqq>pear/Symfony/Component/Validator/Constraints/FileValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\HttpFoundation\File\File as FileObject;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class FileValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if ($value instanceof UploadedFile && !$value->isValid()) {
            switch ($value->getError()) {
                case UPLOAD_ERR_INI_SIZE:
                    if ($constraint->maxSize) {
                        if (ctype_digit((string) $constraint->maxSize)) {
                            $maxSize = (int) $constraint->maxSize;
                        } elseif (preg_match('/^\d++k$/', $constraint->maxSize)) {
                            $maxSize = $constraint->maxSize * 1024;
                        } elseif (preg_match('/^\d++M$/', $constraint->maxSize)) {
                            $maxSize = $constraint->maxSize * 1048576;
                        } else {
                            throw new ConstraintDefinitionException(sprintf('"%s" is not a valid maximum size', $constraint->maxSize));
                        }
                        $maxSize = min(UploadedFile::getMaxFilesize(), $maxSize);
                    } else {
                        $maxSize = UploadedFile::getMaxFilesize();
                    }

                    $this->context->addViolation($constraint->uploadIniSizeErrorMessage, array(
                        '{{ limit }}' => $maxSize,
                        '{{ suffix }}' => 'bytes',
                    ));

                    return;
                case UPLOAD_ERR_FORM_SIZE:
                    $this->context->addViolation($constraint->uploadFormSizeErrorMessage);

                    return;
                case UPLOAD_ERR_PARTIAL:
                    $this->context->addViolation($constraint->uploadPartialErrorMessage);

                    return;
                case UPLOAD_ERR_NO_FILE:
                    $this->context->addViolation($constraint->uploadNoFileErrorMessage);

                    return;
                case UPLOAD_ERR_NO_TMP_DIR:
                    $this->context->addViolation($constraint->uploadNoTmpDirErrorMessage);

                    return;
                case UPLOAD_ERR_CANT_WRITE:
                    $this->context->addViolation($constraint->uploadCantWriteErrorMessage);

                    return;
                case UPLOAD_ERR_EXTENSION:
                    $this->context->addViolation($constraint->uploadExtensionErrorMessage);

                    return;
                default:
                    $this->context->addViolation($constraint->uploadErrorMessage);

                    return;
            }
        }

        if (!is_scalar($value) && !$value instanceof FileObject && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $path = $value instanceof FileObject ? $value->getPathname() : (string) $value;

        if (!is_file($path)) {
            $this->context->addViolation($constraint->notFoundMessage, array('{{ file }}' => $path));

            return;
        }

        if (!is_readable($path)) {
            $this->context->addViolation($constraint->notReadableMessage, array('{{ file }}' => $path));

            return;
        }

        if ($constraint->maxSize) {
            if (ctype_digit((string) $constraint->maxSize)) {
                $size = filesize($path);
                $limit = (int) $constraint->maxSize;
                $suffix = 'bytes';
            } elseif (preg_match('/^\d++k$/', $constraint->maxSize)) {
                $size = round(filesize($path) / 1000, 2);
                $limit = (int) $constraint->maxSize;
                $suffix = 'kB';
            } elseif (preg_match('/^\d++M$/', $constraint->maxSize)) {
                $size = round(filesize($path) / 1000000, 2);
                $limit = (int) $constraint->maxSize;
                $suffix = 'MB';
            } else {
                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid maximum size', $constraint->maxSize));
            }

            if ($size > $limit) {
                $this->context->addViolation($constraint->maxSizeMessage, array(
                    '{{ size }}'    => $size,
                    '{{ limit }}'   => $limit,
                    '{{ suffix }}'  => $suffix,
                    '{{ file }}'    => $path,
                ));

                return;
            }
        }

        if ($constraint->mimeTypes) {
            if (!$value instanceof FileObject) {
                $value = new FileObject($value);
            }

            $mimeTypes = (array) $constraint->mimeTypes;
            $mime = $value->getMimeType();
            $valid = false;

            foreach ($mimeTypes as $mimeType) {
                if ($mimeType === $mime) {
                    $valid = true;
                    break;
                }

                if ($discrete = strstr($mimeType, '/*', true)) {
                    if (strstr($mime, '/', true) === $discrete) {
                        $valid = true;
                        break;
                    }
                }
            }

            if (false === $valid) {
                $this->context->addViolation($constraint->mimeTypesMessage, array(
                    '{{ type }}'    => '"'.$mime.'"',
                    '{{ types }}'   => '"'.implode('", "', $mimeTypes) .'"',
                    '{{ file }}'    => $path,
                ));
            }
        }
    }
}
PK�`�\�(.wwLpear/Symfony/Component/Validator/Constraints/GreaterThanOrEqualValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * Validates values are greater than or equal to the previous (>=).
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class GreaterThanOrEqualValidator extends AbstractComparisonValidator
{
    /**
     * @inheritDoc
     */
    protected function compareValues($value1, $value2)
    {
        return $value1 >= $value2;
    }
}
PK�`�\_��6pear/Symfony/Component/Validator/Constraints/Image.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @api
 */
class Image extends File
{
    public $mimeTypes = 'image/*';
    public $minWidth = null;
    public $maxWidth = null;
    public $maxHeight = null;
    public $minHeight = null;
    public $maxRatio = null;
    public $minRatio = null;
    public $allowSquare = true;
    public $allowLandscape = true;
    public $allowPortrait = true;

    public $mimeTypesMessage = 'This file is not a valid image.';
    public $sizeNotDetectedMessage = 'The size of the image could not be detected.';
    public $maxWidthMessage = 'The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.';
    public $minWidthMessage = 'The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.';
    public $maxHeightMessage = 'The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.';
    public $minHeightMessage = 'The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.';
    public $maxRatioMessage = 'The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.';
    public $minRatioMessage = 'The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.';
    public $allowSquareMessage = 'The image is square ({{ width }}x{{ height }}px). Square images are not allowed.';
    public $allowLandscapeMessage = 'The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.';
    public $allowPortraitMessage = 'The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.';
}
PK�`�\�&����5pear/Symfony/Component/Validator/Constraints/Luhn.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * Metadata for the LuhnValidator.
 *
 * @Annotation
 */
class Luhn extends Constraint
{
    public $message = 'Invalid card number.';
}
PK�`�\tUה�9pear/Symfony/Component/Validator/Constraints/Required.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class Required extends Existence
{
}
PK�`�\q;O8pear/Symfony/Component/Validator/Constraints/Country.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Country extends Constraint
{
    public $message = 'This value is not a valid country.';
}
PK�`�\��F;��@pear/Symfony/Component/Validator/Constraints/LengthValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class LengthValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $stringValue = (string) $value;

        if (function_exists('grapheme_strlen') && 'UTF-8' === $constraint->charset) {
            $length = grapheme_strlen($stringValue);
        } elseif (function_exists('mb_strlen')) {
            $length = mb_strlen($stringValue, $constraint->charset);
        } else {
            $length = strlen($stringValue);
        }

        if ($constraint->min == $constraint->max && $length != $constraint->min) {
            $this->context->addViolation($constraint->exactMessage, array(
                '{{ value }}' => $stringValue,
                '{{ limit }}' => $constraint->min,
            ), $value, (int) $constraint->min);

            return;
        }

        if (null !== $constraint->max && $length > $constraint->max) {
            $this->context->addViolation($constraint->maxMessage, array(
                '{{ value }}' => $stringValue,
                '{{ limit }}' => $constraint->max,
            ), $value, (int) $constraint->max);

            return;
        }

        if (null !== $constraint->min && $length < $constraint->min) {
            $this->context->addViolation($constraint->minMessage, array(
                '{{ value }}' => $stringValue,
                '{{ limit }}' => $constraint->min,
            ), $value, (int) $constraint->min);
        }
    }
}
PK�`�\�|4XX=pear/Symfony/Component/Validator/Constraints/UrlValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class UrlValidator extends ConstraintValidator
{
    const PATTERN = '~^
            (%s)://                                 # protocol
            (
                ([\pL\pN\pS-]+\.)+([\pL]|xn\-\-[\pL\pN-]+)+                   # a domain name
                    |                                     #  or
                \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}      # a IP address
                    |                                     #  or
                \[
                    (?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3}(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6}(?:(?:[0-9a-f]{1,4})))?::))))
                \]  # a IPv6 address
            )
            (:[0-9]+)?                              # a port (optional)
            (/?|/\S+)                               # a /, nothing or a / with something
        $~ixu';

    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $value = (string) $value;

        $pattern = sprintf(static::PATTERN, implode('|', $constraint->protocols));

        if (!preg_match($pattern, $value)) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PK�`�\�ଏ�Fpear/Symfony/Component/Validator/Constraints/GroupSequenceProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * Annotation to define a group sequence provider
 *
 * @Annotation
 */
class GroupSequenceProvider
{

}
PK�`�\m�Լ\\Hpear/Symfony/Component/Validator/Constraints/NotIdenticalToValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * Validates values aren't identical (!==).
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class NotIdenticalToValidator extends AbstractComparisonValidator
{
    /**
     * @inheritDoc
     */
    protected function compareValues($value1, $value2)
    {
        return $value1 !== $value2;
    }
}
PK�`�\'㔘<pear/Symfony/Component/Validator/Constraints/IdenticalTo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class IdenticalTo extends AbstractComparison
{
    public $message = 'This value should be identical to {{ compared_value_type }} {{ compared_value }}.';
}
PK�`�\aHβ@pear/Symfony/Component/Validator/Constraints/ChoiceValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * ChoiceValidator validates that the value is one of the expected values.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class ChoiceValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (!$constraint->choices && !$constraint->callback) {
            throw new ConstraintDefinitionException('Either "choices" or "callback" must be specified on constraint Choice');
        }

        if (null === $value) {
            return;
        }

        if ($constraint->multiple && !is_array($value)) {
            throw new UnexpectedTypeException($value, 'array');
        }

        if ($constraint->callback) {
            if (is_callable(array($this->context->getClassName(), $constraint->callback))) {
                $choices = call_user_func(array($this->context->getClassName(), $constraint->callback));
            } elseif (is_callable($constraint->callback)) {
                $choices = call_user_func($constraint->callback);
            } else {
                throw new ConstraintDefinitionException('The Choice constraint expects a valid callback');
            }
        } else {
            $choices = $constraint->choices;
        }

        if ($constraint->multiple) {
            foreach ($value as $_value) {
                if (!in_array($_value, $choices, $constraint->strict)) {
                    $this->context->addViolation($constraint->multipleMessage, array('{{ value }}' => $_value));
                }
            }

            $count = count($value);

            if ($constraint->min !== null && $count < $constraint->min) {
                $this->context->addViolation($constraint->minMessage, array('{{ limit }}' => $constraint->min), null, (int) $constraint->min);

                return;
            }

            if ($constraint->max !== null && $count > $constraint->max) {
                $this->context->addViolation($constraint->maxMessage, array('{{ limit }}' => $constraint->max), null, (int) $constraint->max);

                return;
            }
        } elseif (!in_array($value, $choices, $constraint->strict)) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PK�`�\e��?pear/Symfony/Component/Validator/Constraints/NotIdenticalTo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class NotIdenticalTo extends AbstractComparison
{
    public $message = 'This value should not be identical to {{ compared_value_type }} {{ compared_value }}.';
}
PK�`�\�'����6pear/Symfony/Component/Validator/Constraints/Count.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\MissingOptionsException;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Count extends Constraint
{
    public $minMessage = 'This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.';
    public $maxMessage = 'This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.';
    public $exactMessage = 'This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.';
    public $min;
    public $max;

    public function __construct($options = null)
    {
        if (null !== $options && !is_array($options)) {
            $options = array(
                'min' => $options,
                'max' => $options,
            );
        }

        parent::__construct($options);

        if (null === $this->min && null === $this->max) {
            throw new MissingOptionsException(sprintf('Either option "min" or "max" must be given for constraint %s', __CLASS__), array('min', 'max'));
        }
    }
}
PK�`�\��Lֻ�;pear/Symfony/Component/Validator/Constraints/CardScheme.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * Metadata for the CardSchemeValidator.
 *
 * @Annotation
 */
class CardScheme extends Constraint
{
    public $message = 'Unsupported card type or invalid card number.';
    public $schemes;

    public function getDefaultOption()
    {
        return 'schemes';
    }

    public function getRequiredOptions()
    {
        return array('schemes');
    }
}
PK�`�\m��\\Cpear/Symfony/Component/Validator/Constraints/AbstractComparison.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;

/**
 * Used for the comparison of values.
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
abstract class AbstractComparison extends Constraint
{
    public $message;
    public $value;

    /**
     * {@inheritDoc}
     */
    public function __construct($options = null)
    {
        if (is_array($options) && !isset($options['value'])) {
            throw new ConstraintDefinitionException(sprintf(
                'The %s constraint requires the "value" option to be set.',
                get_class($this)
            ));
        }

        parent::__construct($options);
    }

    /**
     * {@inheritDoc}
     */
    public function getDefaultOption()
    {
        return 'value';
    }
}
PK�`�\N�H���9pear/Symfony/Component/Validator/Constraints/LessThan.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class LessThan extends AbstractComparison
{
    public $message = 'This value should be less than {{ compared_value }}.';
}
PK�`�\��}a��<pear/Symfony/Component/Validator/Constraints/GreaterThan.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class GreaterThan extends AbstractComparison
{
    public $message = 'This value should be greater than {{ compared_value }}.';
}
PK�`�\�b�=nn>pear/Symfony/Component/Validator/Constraints/IsbnValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * Validates whether the value is a valid ISBN-10 or ISBN-13.
 *
 * @author The Whole Life To Learn <thewholelifetolearn@gmail.com>
 *
 * @see https://en.wikipedia.org/wiki/Isbn
 */
class IsbnValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        if (!is_numeric($value)) {
            $value = str_replace('-', '', $value);
        }

        $validation = 0;
        $value = strtoupper($value);
        $valueLength = strlen($value);

        if (10 === $valueLength && null !== $constraint->isbn10) {
            for ($i = 0; $i < 10; $i++) {
                if ($value[$i] == 'X') {
                    $validation += 10 * intval(10 - $i);
                } else {
                    $validation += intval($value[$i]) * intval(10 - $i);
                }
            }

            if ($validation % 11 != 0) {
                if (null !== $constraint->isbn13) {
                    $this->context->addViolation($constraint->bothIsbnMessage);
                } else {
                    $this->context->addViolation($constraint->isbn10Message);
                }
            }
        } elseif (13 === $valueLength && null !== $constraint->isbn13) {
            for ($i = 0; $i < 13; $i += 2) {
                $validation += intval($value[$i]);
            }
            for ($i = 1; $i < 12; $i += 2) {
                $validation += intval($value[$i]) * 3;
            }

            if ($validation % 10 != 0) {
                if (null !== $constraint->isbn10) {
                    $this->context->addViolation($constraint->bothIsbnMessage);
                } else {
                    $this->context->addViolation($constraint->isbn13Message);
                }
            }
        } else {
            if (null !== $constraint->isbn10 && null !== $constraint->isbn13) {
                $this->context->addViolation($constraint->bothIsbnMessage);
            } elseif (null !== $constraint->isbn10) {
                $this->context->addViolation($constraint->isbn10Message);
            } else {
                $this->context->addViolation($constraint->isbn13Message);
            }
        }
    }
}
PK�`�\w���8pear/Symfony/Component/Validator/Constraints/NotNull.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class NotNull extends Constraint
{
    public $message = 'This value should not be null.';
}
PK�`�\S�n���5pear/Symfony/Component/Validator/Constraints/Null.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Null extends Constraint
{
    public $message = 'This value should be null.';
}
PK�`�\Q��Bpear/Symfony/Component/Validator/Constraints/LanguageValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Intl;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * Validates whether a value is a valid language code
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class LanguageValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $value = (string) $value;
        $languages = Intl::getLanguageBundle()->getLanguageNames();

        if (!isset($languages[$value])) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PK�`�\5�ʟ��>pear/Symfony/Component/Validator/Constraints/DateValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class DateValidator extends ConstraintValidator
{
    const PATTERN = '/^(\d{4})-(\d{2})-(\d{2})$/';

    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value || $value instanceof \DateTime) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $value = (string) $value;

        if (!preg_match(static::PATTERN, $value, $matches) || !checkdate($matches[2], $matches[3], $matches[1])) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PK�`�\x�.`ss9pear/Symfony/Component/Validator/Constraints/Callback.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Callback extends Constraint
{
    /**
     * @var string|callable
     *
     * @since 2.4
     */
    public $callback;

    /**
     * @var array
     *
     * @deprecated Deprecated since version 2.4, to be removed in Symfony 3.0.
     */
    public $methods;

    /**
     * {@inheritdoc}
     */
    public function __construct($options = null)
    {
        // Invocation through annotations with an array parameter only
        if (is_array($options) && 1 === count($options) && isset($options['value'])) {
            $options = $options['value'];
        }

        if (is_array($options) && !isset($options['callback']) && !isset($options['methods']) && !isset($options['groups'])) {
            if (is_callable($options)) {
                $options = array('callback' => $options);
            } else {
                // BC with Symfony < 2.4
                $options = array('methods' => $options);
            }
        }

        parent::__construct($options);
    }

    /**
     * {@inheritdoc}
     */
    public function getDefaultOption()
    {
        return 'callback';
    }

    /**
     * {@inheritdoc}
     */
    public function getTargets()
    {
        return self::CLASS_CONSTRAINT;
    }
}
PK�`�\�Fn���=pear/Symfony/Component/Validator/Constraints/AllValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class AllValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value) {
            return;
        }

        if (!is_array($value) && !$value instanceof \Traversable) {
            throw new UnexpectedTypeException($value, 'array or Traversable');
        }

        $group = $this->context->getGroup();

        foreach ($value as $key => $element) {
            foreach ($constraint->constraints as $constr) {
                $this->context->validateValue($element, $constr, '['.$key.']', $group);
            }
        }
    }
}
PK�`�\�V`���>pear/Symfony/Component/Validator/Constraints/IbanValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @author Manuel Reinhard <manu@sprain.ch>
 * @author Michael Schummel
 * @link http://www.michael-schummel.de/2007/10/05/iban-prufung-mit-php/
 */
class IbanValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        // An IBAN without a country code is not an IBAN.
        if (0 === preg_match('/[A-Z]/', $value)) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));

            return;
        }

        $teststring = preg_replace('/\s+/', '', $value);

        if (strlen($teststring) < 4) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));

            return;
        }

        $teststring = substr($teststring, 4)
            .strval(ord($teststring{0}) - 55)
            .strval(ord($teststring{1}) - 55)
            .substr($teststring, 2, 2);

        $teststring = preg_replace_callback('/[A-Z]/', function ($letter) {
            return intval(ord(strtolower($letter[0])) - 87);
        }, $teststring);

        $rest = 0;
        $strlen = strlen($teststring);
        for ($pos = 0; $pos < $strlen; $pos += 7) {
            $part = strval($rest).substr($teststring, $pos, 7);
            $rest = intval($part) % 97;
        }

        if ($rest != 1) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));

            return;
        }
    }
}
PK�`�\!xHH?pear/Symfony/Component/Validator/Constraints/CountValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class CountValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value) {
            return;
        }

        if (!is_array($value) && !$value instanceof \Countable) {
            throw new UnexpectedTypeException($value, 'array or \Countable');
        }

        $count = count($value);

        if ($constraint->min == $constraint->max && $count != $constraint->min) {
            $this->context->addViolation($constraint->exactMessage, array(
                '{{ count }}' => $count,
                '{{ limit }}' => $constraint->min,
            ), $value, (int) $constraint->min);

            return;
        }

        if (null !== $constraint->max && $count > $constraint->max) {
            $this->context->addViolation($constraint->maxMessage, array(
                '{{ count }}' => $count,
                '{{ limit }}' => $constraint->max,
            ), $value, (int) $constraint->max);

            return;
        }

        if (null !== $constraint->min && $count < $constraint->min) {
            $this->context->addViolation($constraint->minMessage, array(
                '{{ count }}' => $count,
                '{{ limit }}' => $constraint->min,
            ), $value, (int) $constraint->min);
        }
    }
}
PK�`�\��BB6pear/Symfony/Component/Validator/Constraints/Range.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\MissingOptionsException;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Range extends Constraint
{
    public $minMessage = 'This value should be {{ limit }} or more.';
    public $maxMessage = 'This value should be {{ limit }} or less.';
    public $invalidMessage = 'This value should be a valid number.';
    public $min;
    public $max;

    public function __construct($options = null)
    {
        parent::__construct($options);

        if (null === $this->min && null === $this->max) {
            throw new MissingOptionsException(sprintf('Either option "min" or "max" must be given for constraint %s', __CLASS__), array('min', 'max'));
        }
    }
}
PK�`�\�qp""5pear/Symfony/Component/Validator/Constraints/File.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class File extends Constraint
{
    public $maxSize = null;
    public $mimeTypes = array();
    public $notFoundMessage = 'The file could not be found.';
    public $notReadableMessage = 'The file is not readable.';
    public $maxSizeMessage = 'The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.';
    public $mimeTypesMessage = 'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.';

    public $uploadIniSizeErrorMessage   = 'The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.';
    public $uploadFormSizeErrorMessage  = 'The file is too large.';
    public $uploadPartialErrorMessage   = 'The file was only partially uploaded.';
    public $uploadNoFileErrorMessage    = 'No file was uploaded.';
    public $uploadNoTmpDirErrorMessage  = 'No temporary folder was configured in php.ini.';
    public $uploadCantWriteErrorMessage = 'Cannot write temporary file to disk.';
    public $uploadExtensionErrorMessage = 'A PHP extension caused the upload to fail.';
    public $uploadErrorMessage          = 'The file could not be uploaded.';
}
PK�`�\�	�004pear/Symfony/Component/Validator/Constraints/Url.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Url extends Constraint
{
    public $message = 'This value is not a valid URL.';
    public $protocols = array('http', 'https');
}
PK�`�\I7U���6pear/Symfony/Component/Validator/Constraints/False.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class False extends Constraint
{
    public $message = 'This value should be false.';
}
PK�`�\D~�SS7pear/Symfony/Component/Validator/Constraints/Choice.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Choice extends Constraint
{
    public $choices;
    public $callback;
    public $multiple = false;
    public $strict = false;
    public $min = null;
    public $max = null;
    public $message = 'The value you selected is not a valid choice.';
    public $multipleMessage = 'One or more of the given values is invalid.';
    public $minMessage = 'You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.';
    public $maxMessage = 'You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.';

    /**
     * {@inheritDoc}
     */
    public function getDefaultOption()
    {
        return 'choices';
    }
}
PK�`�\�̋	�	6pear/Symfony/Component/Validator/Constraints/Regex.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Regex extends Constraint
{
    public $message = 'This value is not valid.';
    public $pattern;
    public $htmlPattern = null;
    public $match = true;

    /**
     * {@inheritDoc}
     */
    public function getDefaultOption()
    {
        return 'pattern';
    }

    /**
     * {@inheritDoc}
     */
    public function getRequiredOptions()
    {
        return array('pattern');
    }

    /**
     * Returns htmlPattern if exists or pattern is convertible.
     *
     * @return string|null
     */
    public function getHtmlPattern()
    {
        // If htmlPattern is specified, use it
        if (null !== $this->htmlPattern) {
            return empty($this->htmlPattern)
                ? null
                : $this->htmlPattern;
        }

        return $this->getNonDelimitedPattern();
    }

    /**
     * Converts the htmlPattern to a suitable format for HTML5 pattern.
     * Example: /^[a-z]+$/ would be converted to [a-z]+
     * However, if options are specified, it cannot be converted
     *
     * Pattern is also ignored if match=false since the pattern should
     * then be reversed before application.
     *
     * @todo reverse pattern in case match=false as per issue #5307
     *
     * @link http://dev.w3.org/html5/spec/single-page.html#the-pattern-attribute
     *
     * @return string|null
     */
    private function getNonDelimitedPattern()
    {
        // If match = false, pattern should not be added to HTML5 validation
        if (!$this->match) {
            return null;
        }

        if (preg_match('/^(.)(\^?)(.*?)(\$?)\1$/', $this->pattern, $matches)) {
            $delimiter = $matches[1];
            $start     = empty($matches[2]) ? '.*' : '';
            $pattern   = $matches[3];
            $end       = empty($matches[4]) ? '.*' : '';

            // Unescape the delimiter in pattern
            $pattern = str_replace('\\'.$delimiter, $delimiter, $pattern);

            return $start.$pattern.$end;
        }

        return null;
    }
}
PK�`�\�CG^LLApear/Symfony/Component/Validator/Constraints/EqualToValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * Validates values are equal (==).
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class EqualToValidator extends AbstractComparisonValidator
{
    /**
     * @inheritDoc
     */
    protected function compareValues($value1, $value2)
    {
        return $value1 == $value2;
    }
}
PK�`�\���,,5pear/Symfony/Component/Validator/Constraints/Isbn.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\MissingOptionsException;

/**
 * @Annotation
 *
 * @author The Whole Life To Learn <thewholelifetolearn@gmail.com>
 */
class Isbn extends Constraint
{
    public $isbn10Message = 'This value is not a valid ISBN-10.';
    public $isbn13Message = 'This value is not a valid ISBN-13.';
    public $bothIsbnMessage = 'This value is neither a valid ISBN-10 nor a valid ISBN-13.';
    public $isbn10;
    public $isbn13;

    public function __construct($options = null)
    {
        if (null !== $options && !is_array($options)) {
            $options = array(
                'isbn10' => $options,
                'isbn13' => $options,
            );
        }

        parent::__construct($options);

        if (null === $this->isbn10 && null === $this->isbn13) {
            throw new MissingOptionsException(sprintf('Either option "isbn10" or "isbn13" must be given for constraint "%s".', __CLASS__), array('isbn10', 'isbn13'));
        }
    }
}
PK�`�\�ٜ?��5pear/Symfony/Component/Validator/Constraints/True.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class True extends Constraint
{
    public $message = 'This value should be true.';
}
PK�`�\?����Lpear/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * Provides a base class for the validation of property comparisons.
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
abstract class AbstractComparisonValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value) {
            return;
        }

        if (!$this->compareValues($value, $constraint->value)) {
            $this->context->addViolation($constraint->message, array(
                '{{ value }}' => $this->valueToString($constraint->value),
                '{{ compared_value }}' => $this->valueToString($constraint->value),
                '{{ compared_value_type }}' => $this->valueToType($constraint->value)
            ));
        }
    }

    /**
     * Returns a string representation of the type of the value.
     *
     * @param  mixed $value
     *
     * @return string
     */
    private function valueToType($value)
    {
        return is_object($value) ? get_class($value) : gettype($value);
    }

    /**
     * Returns a string representation of the value.
     *
     * @param  mixed  $value
     *
     * @return string
     */
    private function valueToString($value)
    {
        if (is_object($value) && method_exists($value, '__toString')) {
            return (string) $value;
        }

        if ($value instanceof \DateTime) {
            return $value->format('Y-m-d H:i:s');
        }

        return var_export($value, true);
    }

    /**
     * Compares the two given values to find if their relationship is valid
     *
     * @param mixed      $value1     The first value to compare
     * @param mixed      $value2     The second value to compare
     *
     * @return Boolean true if the relationship is valid, false otherwise
     */
    abstract protected function compareValues($value1, $value2);
}
PK�`�\�̢�VVEpear/Symfony/Component/Validator/Constraints/IdenticalToValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * Validates values are identical (===).
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class IdenticalToValidator extends AbstractComparisonValidator
{
    /**
     * @inheritDoc
     */
    protected function compareValues($value1, $value2)
    {
        return $value1 === $value2;
    }
}
PK�`�\�Ǧ��8pear/Symfony/Component/Validator/Constraints/EqualTo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class EqualTo extends AbstractComparison
{
    public $message = 'This value should be equal to {{ compared_value }}.';
}
PK�`�\�{HH6pear/Symfony/Component/Validator/Constraints/Email.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Email extends Constraint
{
    public $message = 'This value is not a valid email address.';
    public $checkMX = false;
    public $checkHost = false;
}
PK�`�\[�A���@pear/Symfony/Component/Validator/Constraints/LessThanOrEqual.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class LessThanOrEqual extends AbstractComparison
{
    public $message = 'This value should be less than or equal to {{ compared_value }}.';
}
PK�`�\
��n��Dpear/Symfony/Component/Validator/Constraints/CollectionValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class CollectionValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value) {
            return;
        }

        if (!is_array($value) && !($value instanceof \Traversable && $value instanceof \ArrayAccess)) {
            throw new UnexpectedTypeException($value, 'array or Traversable and ArrayAccess');
        }

        $group = $this->context->getGroup();

        foreach ($constraint->fields as $field => $fieldConstraint) {
            if (
                // bug fix issue #2779
                (is_array($value) && array_key_exists($field, $value)) ||
                ($value instanceof \ArrayAccess && $value->offsetExists($field))
            ) {
                foreach ($fieldConstraint->constraints as $constr) {
                    $this->context->validateValue($value[$field], $constr, '['.$field.']', $group);
                }
            } elseif (!$fieldConstraint instanceof Optional && !$constraint->allowMissingFields) {
                $this->context->addViolationAt('['.$field.']', $constraint->missingFieldsMessage, array(
                    '{{ field }}' => $field
                ), null);
            }
        }

        if (!$constraint->allowExtraFields) {
            foreach ($value as $field => $fieldValue) {
                if (!isset($constraint->fields[$field])) {
                    $this->context->addViolationAt('['.$field.']', $constraint->extraFieldsMessage, array(
                        '{{ field }}' => $field
                    ), $fieldValue);
                }
            }
        }
    }
}
PK�`�\b+��>pear/Symfony/Component/Validator/Constraints/LuhnValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * Validates a PAN using the LUHN Algorithm
 *
 * For a list of example card numbers that are used to test this
 * class, please see the LuhnValidatorTest class.
 *
 * @see    http://en.wikipedia.org/wiki/Luhn_algorithm
 * @author Tim Nagel <t.nagel@infinite.net.au>
 * @author Greg Knapp http://gregk.me/2011/php-implementation-of-bank-card-luhn-algorithm/
 */
class LuhnValidator extends ConstraintValidator
{
    /**
     * Validates a creditcard number with the Luhn algorithm.
     *
     * @param mixed      $value
     * @param Constraint $constraint
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        /**
         * need to work with strings only because long numbers are treated as floats and don't work with strlen
         */
        if (!is_string($value)) {
            throw new UnexpectedTypeException($value, 'string');
        }

        if (!is_numeric($value)) {
            $this->context->addViolation($constraint->message);

            return;
        }

        $length = strlen($value);
        $oddLength = $length % 2;
        for ($sum = 0, $i = $length - 1; $i >= 0; $i--) {
            $digit = (int) $value[$i];
            $sum += (($i % 2) === $oddLength) ? array_sum(str_split($digit * 2)) : $digit;
        }

        if ($sum === 0 || ($sum % 10) !== 0) {
            $this->context->addViolation($constraint->message);
        }
    }
}
PK�`�\N3�5pear/Symfony/Component/Validator/Constraints/Type.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Type extends Constraint
{
    public $message = 'This value should be of type {{ type }}.';
    public $type;

    /**
     * {@inheritDoc}
     */
    public function getDefaultOption()
    {
        return 'type';
    }

    /**
     * {@inheritDoc}
     */
    public function getRequiredOptions()
    {
        return array('type');
    }
}
PK�`�\�<W���?pear/Symfony/Component/Validator/Constraints/RegexValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * Validates whether a value match or not given regexp pattern
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Joseph Bielawski <stloyd@gmail.com>
 *
 * @api
 */
class RegexValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $value = (string) $value;

        if ($constraint->match xor preg_match($constraint->pattern, $value)) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PK�`�\�F���>pear/Symfony/Component/Validator/Constraints/TypeValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class TypeValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value) {
            return;
        }

        $type = strtolower($constraint->type);
        $type = $type == 'boolean' ? 'bool' : $constraint->type;
        $isFunction = 'is_'.$type;
        $ctypeFunction = 'ctype_'.$type;

        if (function_exists($isFunction) && call_user_func($isFunction, $value)) {
            return;
        } elseif (function_exists($ctypeFunction) && call_user_func($ctypeFunction, $value)) {
            return;
        } elseif ($value instanceof $constraint->type) {
            return;
        }

        $this->context->addViolation($constraint->message, array(
            '{{ value }}' => is_object($value) ? get_class($value) : (is_array($value) ? 'Array' : (string) $value),
            '{{ type }}'  => $constraint->type,
        ));
    }
}
PK�`�\��75pear/Symfony/Component/Validator/Constraints/Time.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Time extends Constraint
{
    public $message = 'This value is not a valid time.';
}
PK�`�\��"��Dpear/Symfony/Component/Validator/Constraints/CardSchemeValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * Validates that a card number belongs to a specified scheme.
 *
 * @see http://en.wikipedia.org/wiki/Bank_card_number
 * @see http://www.regular-expressions.info/creditcard.html
 * @author Tim Nagel <t.nagel@infinite.net.au>
 */
class CardSchemeValidator extends ConstraintValidator
{
    protected $schemes = array(
        /**
         * American Express card numbers start with 34 or 37 and have 15 digits.
         */
        'AMEX' => array(
            '/^3[47][0-9]{13}$/'
        ),
        /**
         * China UnionPay cards start with 62 and have between 16 and 19 digits.
         * Please note that these cards do not follow Luhn Algorithm as a checksum.
         */
        'CHINA_UNIONPAY' => array(
            '/^62[0-9]{14,17}$/'
        ),
        /**
         * Diners Club card numbers begin with 300 through 305, 36 or 38. All have 14 digits.
         * There are Diners Club cards that begin with 5 and have 16 digits.
         * These are a joint venture between Diners Club and MasterCard, and should be processed like a MasterCard.
         */
        'DINERS' => array(
            '/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/',
        ),
        /**
         * Discover card numbers begin with 6011, 622126 through 622925, 644 through 649 or 65.
         * All have 16 digits
         */
        'DISCOVER' => array(
            '/^6011[0-9]{12}$/',
            '/^64[4-9][0-9]{13}$/',
            '/^65[0-9]{14}$/',
            '/^622(12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|91[0-9]|92[0-5])[0-9]{10}$/'
        ),
        /**
         * InstaPayment cards begin with 637 through 639 and have 16 digits
         */
        'INSTAPAYMENT' => array(
            '/^63[7-9][0-9]{13}$/'
        ),
        /**
         * JCB cards beginning with 2131 or 1800 have 15 digits.
         * JCB cards beginning with 35 have 16 digits.
         */
        'JCB' => array(
            '/^(?:2131|1800|35[0-9]{3})[0-9]{11}$/'
        ),
        /**
         * Laser cards begin with either 6304, 6706, 6709 or 6771 and have between 16 and 19 digits
         */
        'LASER' => array(
            '/^(6304|670[69]|6771)[0-9]{12,15}$/'
        ),
        /**
         * Maestro cards begin with either 5018, 5020, 5038, 5893, 6304, 6759, 6761, 6762, 6763 or 0604
         * They have between 12 and 19 digits
         */
        'MAESTRO' => array(
            '/^(5018|5020|5038|6304|6759|6761|676[23]|0604)[0-9]{8,15}$/'
        ),
        /**
         * All MasterCard numbers start with the numbers 51 through 55. All have 16 digits.
         */
        'MASTERCARD' => array(
            '/^5[1-5][0-9]{14}$/'
        ),
        /**
         * All Visa card numbers start with a 4. New cards have 16 digits. Old cards have 13.
         */
        'VISA' => array(
            '/^4([0-9]{12}|[0-9]{15})$/'
        ),
    );

    /**
     * Validates a creditcard belongs to a specified scheme.
     *
     * @param mixed $value
     * @param Constraint $constraint
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_numeric($value)) {
            $this->context->addViolation($constraint->message);

            return;
        }

        $schemes = array_flip((array) $constraint->schemes);
        $schemeRegexes = array_intersect_key($this->schemes, $schemes);

        foreach ($schemeRegexes as $regexes) {
            foreach ($regexes as $regex) {
                if (preg_match($regex, $value)) {
                    return;
                }
            }
        }

        $this->context->addViolation($constraint->message);
    }
}
PK�`�\e8�B�
�
;pear/Symfony/Component/Validator/Constraints/Collection.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Collection extends Constraint
{
    public $fields = array();
    public $allowExtraFields = false;
    public $allowMissingFields = false;
    public $extraFieldsMessage = 'This field was not expected.';
    public $missingFieldsMessage = 'This field is missing.';

    /**
     * {@inheritDoc}
     */
    public function __construct($options = null)
    {
        // no known options set? $options is the fields array
        if (is_array($options)
            && !array_intersect(array_keys($options), array('groups', 'fields', 'allowExtraFields', 'allowMissingFields', 'extraFieldsMessage', 'missingFieldsMessage'))) {
            $options = array('fields' => $options);
        }

        parent::__construct($options);

        if (!is_array($this->fields)) {
            throw new ConstraintDefinitionException(sprintf('The option "fields" is expected to be an array in constraint %s', __CLASS__));
        }

        foreach ($this->fields as $fieldName => $field) {
            // the XmlFileLoader and YamlFileLoader pass the field Optional
            // and Required constraint as an array with exactly one element
            if (is_array($field) && count($field) == 1) {
                $this->fields[$fieldName] = $field = $field[0];
            }

            if (!$field instanceof Optional && !$field instanceof Required) {
                $this->fields[$fieldName] = $field = new Required($field);
            }

            if (!is_array($field->constraints)) {
                $field->constraints = array($field->constraints);
            }

            foreach ($field->constraints as $constraint) {
                if (!$constraint instanceof Constraint) {
                    throw new ConstraintDefinitionException(sprintf('The value %s of the field %s is not an instance of Constraint in constraint %s', $constraint, $fieldName, __CLASS__));
                }

                if ($constraint instanceof Valid) {
                    throw new ConstraintDefinitionException(sprintf('The constraint Valid cannot be nested inside constraint %s. You can only declare the Valid constraint directly on a field or method.', __CLASS__));
                }
            }
        }
    }

    public function getRequiredOptions()
    {
        return array('fields');
    }
}
PK�`�\�Q�Cpear/Symfony/Component/Validator/Constraints/GreaterThanOrEqual.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class GreaterThanOrEqual extends AbstractComparison
{
    public $message = 'This value should be greater than or equal to {{ compared_value }}.';
}
PK�`�\��l��6pear/Symfony/Component/Validator/Constraints/Blank.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Blank extends Constraint
{
    public $message = 'This value should be blank.';
}
PK�`�\�EW^��Apear/Symfony/Component/Validator/Constraints/CountryValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Intl;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * Validates whether a value is a valid country code
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class CountryValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $value = (string) $value;
        $countries = Intl::getRegionBundle()->getCountryNames();

        if (!isset($countries[$value])) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PK�`�\S탟5pear/Symfony/Component/Validator/Constraints/Date.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Date extends Constraint
{
    public $message = 'This value is not a valid date.';
}
PK�`�\�c����3pear/Symfony/Component/Validator/Constraints/Ip.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Constraint;

/**
 * Validates that a value is a valid IP address
 *
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Joseph Bielawski <stloyd@gmail.com>
 *
 * @api
 */
class Ip extends Constraint
{
    const V4 = '4';
    const V6 = '6';
    const ALL = 'all';

    // adds FILTER_FLAG_NO_PRIV_RANGE flag (skip private ranges)
    const V4_NO_PRIV = '4_no_priv';
    const V6_NO_PRIV = '6_no_priv';
    const ALL_NO_PRIV = 'all_no_priv';

    // adds FILTER_FLAG_NO_RES_RANGE flag (skip reserved ranges)
    const V4_NO_RES = '4_no_res';
    const V6_NO_RES = '6_no_res';
    const ALL_NO_RES = 'all_no_res';

    // adds FILTER_FLAG_NO_PRIV_RANGE and FILTER_FLAG_NO_RES_RANGE flags (skip both)
    const V4_ONLY_PUBLIC = '4_public';
    const V6_ONLY_PUBLIC = '6_public';
    const ALL_ONLY_PUBLIC = 'all_public';

    protected static $versions = array(
        self::V4,
        self::V6,
        self::ALL,

        self::V4_NO_PRIV,
        self::V6_NO_PRIV,
        self::ALL_NO_PRIV,

        self::V4_NO_RES,
        self::V6_NO_RES,
        self::ALL_NO_RES,

        self::V4_ONLY_PUBLIC,
        self::V6_ONLY_PUBLIC,
        self::ALL_ONLY_PUBLIC,
    );

    public $version = self::V4;

    public $message = 'This is not a valid IP address.';

    /**
     * {@inheritDoc}
     */
    public function __construct($options = null)
    {
        parent::__construct($options);

        if (!in_array($this->version, self::$versions)) {
            throw new ConstraintDefinitionException(sprintf('The option "version" must be one of "%s"', implode('", "', self::$versions)));
        }
    }
}
PK�`�\d�X�BB5pear/Symfony/Component/Validator/Constraints/Issn.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Antonio J. García Lagar <aj@garcialagar.es>
 */
class Issn extends Constraint
{
    public $message = 'This value is not a valid ISSN.';
    public $caseSensitive = false;
    public $requireHyphen = false;
}
PK�`�\��D��Apear/Symfony/Component/Validator/Constraints/NotNullValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class NotNullValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value) {
            $this->context->addViolation($constraint->message);
        }
    }
}
PKa�\���&��Bpear/Symfony/Component/Validator/Constraints/NotBlankValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class NotBlankValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (false === $value || (empty($value) && '0' != $value)) {
            $this->context->addViolation($constraint->message);
        }
    }
}
PKa�\zet�	�	Dpear/Symfony/Component/Validator/Constraints/ExpressionValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
use Symfony\Component\PropertyAccess\PropertyPath;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\Validator\Exception\RuntimeException;

/**
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bernhard Schussek <bschussek@symfony.com>
 */
class ExpressionValidator extends ConstraintValidator
{
    /**
     * @var PropertyAccessorInterface
     */
    private $propertyAccessor;

    /**
     * @var ExpressionLanguage
     */
    private $expressionLanguage;

    public function __construct(PropertyAccessorInterface $propertyAccessor)
    {
        $this->propertyAccessor = $propertyAccessor;
    }

    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        $variables = array();

        if (null === $this->context->getPropertyName()) {
            $variables['this'] = $value;
        } else {
            // Extract the object that the property belongs to from the object
            // graph
            $path = new PropertyPath($this->context->getPropertyPath());
            $parentPath = $path->getParent();
            $root = $this->context->getRoot();

            $variables['value'] = $value;
            $variables['this'] = $parentPath ? $this->propertyAccessor->getValue($root, $parentPath) : $root;
        }

        if (!$this->getExpressionLanguage()->evaluate($constraint->expression, $variables)) {
            $this->context->addViolation($constraint->message);
        }
    }

    private function getExpressionLanguage()
    {
        if (null === $this->expressionLanguage) {
            if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
                throw new RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
            }
            $this->expressionLanguage = new ExpressionLanguage();
        }

        return $this->expressionLanguage;
    }
}
PKa�\�`�v��@pear/Symfony/Component/Validator/Constraints/LocaleValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Intl;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * Validates whether a value is a valid locale code
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class LocaleValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $value = (string) $value;
        $locales = Intl::getLocaleBundle()->getLocaleNames();

        if (!isset($locales[$value])) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PKa�\�>
i//:pear/Symfony/Component/Validator/Constraints/Existence.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class Existence extends Constraint
{
    public $constraints = array();

    public function getDefaultOption()
    {
        return 'constraints';
    }
}
PKa�\����	�	Bpear/Symfony/Component/Validator/Constraints/CallbackValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;

/**
 * Validator for Callback constraint
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class CallbackValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($object, Constraint $constraint)
    {
        if (null === $object) {
            return;
        }

        if (null !== $constraint->callback && null !== $constraint->methods) {
            throw new ConstraintDefinitionException(
                'The Callback constraint supports either the option "callback" ' .
                'or "methods", but not both at the same time.'
            );
        }

        // has to be an array so that we can differentiate between callables
        // and method names
        if (null !== $constraint->methods && !is_array($constraint->methods)) {
            throw new UnexpectedTypeException($constraint->methods, 'array');
        }

        $methods = $constraint->methods ?: array($constraint->callback);

        foreach ($methods as $method) {
            if (is_array($method) || $method instanceof \Closure) {
                if (!is_callable($method)) {
                    throw new ConstraintDefinitionException(sprintf('"%s::%s" targeted by Callback constraint is not a valid callable', $method[0], $method[1]));
                }

                call_user_func($method, $object, $this->context);
            } else {
                if (!method_exists($object, $method)) {
                    throw new ConstraintDefinitionException(sprintf('Method "%s" targeted by Callback constraint does not exist', $method));
                }

                $reflMethod = new \ReflectionMethod($object, $method);

                if ($reflMethod->isStatic()) {
                    $reflMethod->invoke(null, $object, $this->context);
                } else {
                    $reflMethod->invoke($object, $this->context);
                }
            }
        }
    }
}
PKa�\���(��>pear/Symfony/Component/Validator/Constraints/TimeValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class TimeValidator extends ConstraintValidator
{
    const PATTERN = '/^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/';

    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value || $value instanceof \DateTime) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $value = (string) $value;

        if (!preg_match(static::PATTERN, $value)) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PKa�\{���UUDpear/Symfony/Component/Validator/Constraints/NotEqualToValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * Validates values are all unequal (!=).
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class NotEqualToValidator extends AbstractComparisonValidator
{
    /**
     * @inheritDoc
     */
    protected function compareValues($value1, $value2)
    {
        return $value1 != $value2;
    }
}
PKa�\��y?pear/Symfony/Component/Validator/Constraints/BlankValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class BlankValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if ('' !== $value && null !== $value) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PKa�\Ŀ:�KK;pear/Symfony/Component/Validator/Constraints/Expression.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class Expression extends Constraint
{
    public $message = 'This value is not valid.';
    public $expression;

    /**
     * {@inheritDoc}
     */
    public function getDefaultOption()
    {
        return 'expression';
    }

    /**
     * {@inheritDoc}
     */
    public function getRequiredOptions()
    {
        return array('expression');
    }

    /**
     * {@inheritDoc}
     */
    public function getTargets()
    {
        return array(self::CLASS_CONSTRAINT, self::PROPERTY_CONSTRAINT);
    }

    /**
     * {@inheritDoc}
     */
    public function validatedBy()
    {
        return 'validator.expression';
    }
}
PKa�\�Z�Bpear/Symfony/Component/Validator/Constraints/CurrencyValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Intl\Intl;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * Validates whether a value is a valid currency
 *
 * @author Miha Vrhovnik <miha.vrhovnik@pagein.si>
 *
 * @api
 */
class CurrencyValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $value = (string) $value;
        $currencies = Intl::getCurrencyBundle()->getCurrencyNames();

        if (!isset($currencies[$value])) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PKa�\5����?pear/Symfony/Component/Validator/Constraints/EmailValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class EmailValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $value = (string) $value;
        $valid = filter_var($value, FILTER_VALIDATE_EMAIL);

        if ($valid) {
            $host = substr($value, strpos($value, '@') + 1);

            // Check for host DNS resource records
            if ($valid && $constraint->checkMX) {
                $valid = $this->checkMX($host);
            } elseif ($valid && $constraint->checkHost) {
                $valid = $this->checkHost($host);
            }
        }

        if (!$valid) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }

    /**
     * Check DNS Records for MX type.
     *
     * @param string $host Host
     *
     * @return Boolean
     */
    private function checkMX($host)
    {
        return checkdnsrr($host, 'MX');
    }

    /**
     * Check if one of MX, A or AAAA DNS RR exists.
     *
     * @param string $host Host
     *
     * @return Boolean
     */
    private function checkHost($host)
    {
        return $this->checkMX($host) || (checkdnsrr($host, "A") || checkdnsrr($host, "AAAA"));
    }
}
PKa�\�}�&&7pear/Symfony/Component/Validator/Constraints/Length.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\MissingOptionsException;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Length extends Constraint
{
    public $maxMessage = 'This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.';
    public $minMessage = 'This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.';
    public $exactMessage = 'This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.';
    public $max;
    public $min;
    public $charset = 'UTF-8';

    public function __construct($options = null)
    {
        if (null !== $options && !is_array($options)) {
            $options = array(
                'min' => $options,
                'max' => $options,
            );
        }

        parent::__construct($options);

        if (null === $this->min && null === $this->max) {
            throw new MissingOptionsException(sprintf('Either option "min" or "max" must be given for constraint %s', __CLASS__), array('min', 'max'));
        }
    }
}
PKa�\����44>pear/Symfony/Component/Validator/Constraints/IssnValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * Validates whether the value is a valid ISSN.
 *
 * @author Antonio J. García Lagar <aj@garcialagar.es>
 *
 * @see https://en.wikipedia.org/wiki/Issn
 */
class IssnValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        // Compose regex pattern
        $digitsPattern = $constraint->requireHyphen ? '\d{4}-\d{3}' : '\d{4}-?\d{3}';
        $checksumPattern = $constraint->caseSensitive ? '[\d|X]' : '[\d|X|x]';
        $pattern = "/^".$digitsPattern.$checksumPattern."$/";

        if (!preg_match($pattern, $value)) {
            $this->context->addViolation($constraint->message);
        } else {
            $digits = str_split(strtoupper(str_replace('-', '', $value)));

            $sum = 0;
            for ($i = 8; $i > 1; $i--) {
                $sum += $i * (int) array_shift($digits);
            }

            $checksum = 'X' == reset($digits) ? 10 : (int) reset($digits);

            if (0 != ($sum + $checksum) % 11) {
                $this->context->addViolation($constraint->message);
            }
        }
    }
}
PKa�\l˘��
�
<pear/Symfony/Component/Validator/Constraints/IpValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;

/**
 * Validates whether a value is a valid IP address
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Joseph Bielawski <stloyd@gmail.com>
 *
 * @api
 */
class IpValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || '' === $value) {
            return;
        }

        if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) {
            throw new UnexpectedTypeException($value, 'string');
        }

        $value = (string) $value;

        switch ($constraint->version) {
            case Ip::V4:
               $flag = FILTER_FLAG_IPV4;
               break;

            case Ip::V6:
               $flag = FILTER_FLAG_IPV6;
               break;

            case Ip::V4_NO_PRIV:
               $flag = FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE;
               break;

            case Ip::V6_NO_PRIV:
               $flag = FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE;
               break;

            case Ip::ALL_NO_PRIV:
               $flag = FILTER_FLAG_NO_PRIV_RANGE;
               break;

            case Ip::V4_NO_RES:
               $flag = FILTER_FLAG_IPV4 | FILTER_FLAG_NO_RES_RANGE;
               break;

            case Ip::V6_NO_RES:
               $flag = FILTER_FLAG_IPV6 | FILTER_FLAG_NO_RES_RANGE;
               break;

            case Ip::ALL_NO_RES:
               $flag = FILTER_FLAG_NO_RES_RANGE;
               break;

            case Ip::V4_ONLY_PUBLIC:
               $flag = FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
               break;

            case Ip::V6_ONLY_PUBLIC:
               $flag = FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
               break;

            case Ip::ALL_ONLY_PUBLIC:
               $flag = FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
               break;

            default:
                $flag = null;
                break;
        }

        if (!filter_var($value, FILTER_VALIDATE_IP, $flag)) {
            $this->context->addViolation($constraint->message, array('{{ value }}' => $value));
        }
    }
}
PKa�\c��y

9pear/Symfony/Component/Validator/Constraints/DateTime.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class DateTime extends Constraint
{
    public $message = 'This value is not a valid datetime.';
}
PKa�\��vbbEpear/Symfony/Component/Validator/Constraints/GreaterThanValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * Validates values are greater than the previous (>).
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class GreaterThanValidator extends AbstractComparisonValidator
{
    /**
     * @inheritDoc
     */
    protected function compareValues($value1, $value2)
    {
        return $value1 > $value2;
    }
}
PKa�\^r��

9pear/Symfony/Component/Validator/Constraints/Language.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Language extends Constraint
{
    public $message = 'This value is not a valid language.';
}
PKa�\�ɑ55>pear/Symfony/Component/Validator/Constraints/TrueValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class TrueValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value) {
            return;
        }

        if (true !== $value && 1 !== $value && '1' !== $value) {
            $this->context->addViolation($constraint->message);
        }
    }
}
PKa�\Hð�7pear/Symfony/Component/Validator/Constraints/Locale.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Locale extends Constraint
{
    public $message = 'This value is not a valid locale.';
}
PKa�\^�T?pear/Symfony/Component/Validator/Constraints/FalseValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class FalseValidator extends ConstraintValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || false === $value || 0 === $value || '0' === $value) {
            return;
        }

        $this->context->addViolation($constraint->message);
    }
}
PKa�\�~%ɋ�6pear/Symfony/Component/Validator/Constraints/Valid.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class Valid extends Constraint
{
    public $traverse = true;

    public $deep = false;

    public function __construct($options = null)
    {
        if (is_array($options) && array_key_exists('groups', $options)) {
            throw new ConstraintDefinitionException(sprintf('The option "groups" is not supported by the constraint %s', __CLASS__));
        }

        parent::__construct($options);
    }
}
PKa�\<8�S��?pear/Symfony/Component/Validator/Constraints/ImageValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;

/**
 * Validates whether a value is a valid image file and is valid
 * against minWidth, maxWidth, minHeight and maxHeight constraints
 *
 * @author Benjamin Dulau <benjamin.dulau@gmail.com>
 */
class ImageValidator extends FileValidator
{
    /**
     * {@inheritDoc}
     */
    public function validate($value, Constraint $constraint)
    {
        $violations = count($this->context->getViolations());

        parent::validate($value, $constraint);

        $failed = count($this->context->getViolations()) !== $violations;

        if ($failed || null === $value || '' === $value) {
            return;
        }

        if (null === $constraint->minWidth && null === $constraint->maxWidth
            && null === $constraint->minHeight && null === $constraint->maxHeight
            && null === $constraint->minRatio && null === $constraint->maxRatio
            && $constraint->allowSquare && $constraint->allowLandscape && $constraint->allowPortrait) {
            return;
        }

        $size = @getimagesize($value);
        if (empty($size) || ($size[0] === 0) || ($size[1] === 0)) {
            $this->context->addViolation($constraint->sizeNotDetectedMessage);

            return;
        }

        $width  = $size[0];
        $height = $size[1];

        if ($constraint->minWidth) {
            if (!ctype_digit((string) $constraint->minWidth)) {
                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid minimum width', $constraint->minWidth));
            }

            if ($width < $constraint->minWidth) {
                $this->context->addViolation($constraint->minWidthMessage, array(
                    '{{ width }}'    => $width,
                    '{{ min_width }}' => $constraint->minWidth
                ));

                return;
            }
        }

        if ($constraint->maxWidth) {
            if (!ctype_digit((string) $constraint->maxWidth)) {
                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid maximum width', $constraint->maxWidth));
            }

            if ($width > $constraint->maxWidth) {
                $this->context->addViolation($constraint->maxWidthMessage, array(
                    '{{ width }}'    => $width,
                    '{{ max_width }}' => $constraint->maxWidth
                ));

                return;
            }
        }

        if ($constraint->minHeight) {
            if (!ctype_digit((string) $constraint->minHeight)) {
                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid minimum height', $constraint->minHeight));
            }

            if ($height < $constraint->minHeight) {
                $this->context->addViolation($constraint->minHeightMessage, array(
                    '{{ height }}'    => $height,
                    '{{ min_height }}' => $constraint->minHeight
                ));

                return;
            }
        }

        if ($constraint->maxHeight) {
            if (!ctype_digit((string) $constraint->maxHeight)) {
                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid maximum height', $constraint->maxHeight));
            }

            if ($height > $constraint->maxHeight) {
                $this->context->addViolation($constraint->maxHeightMessage, array(
                    '{{ height }}'    => $height,
                    '{{ max_height }}' => $constraint->maxHeight
                ));
            }
        }

        $ratio = $width / $height;

        if (null !== $constraint->minRatio) {
            if (!is_numeric((string) $constraint->minRatio)) {
                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid minimum ratio', $constraint->minRatio));
            }

            if ($ratio < $constraint->minRatio) {
                $this->context->addViolation($constraint->minRatioMessage, array(
                    '{{ ratio }}' => $ratio,
                    '{{ min_ratio }}' => $constraint->minRatio
                ));
            }
        }

        if (null !== $constraint->maxRatio) {
            if (!is_numeric((string) $constraint->maxRatio)) {
                throw new ConstraintDefinitionException(sprintf('"%s" is not a valid maximum ratio', $constraint->maxRatio));
            }

            if ($ratio > $constraint->maxRatio) {
                $this->context->addViolation($constraint->maxRatioMessage, array(
                    '{{ ratio }}' => $ratio,
                    '{{ max_ratio }}' => $constraint->maxRatio
                ));
            }
        }

        if (!$constraint->allowSquare && $width == $height) {
            $this->context->addViolation($constraint->allowSquareMessage, array(
                '{{ width }}' => $width,
                '{{ height }}' => $height
            ));
        }

        if (!$constraint->allowLandscape && $width > $height) {
            $this->context->addViolation($constraint->allowLandscapeMessage, array(
                '{{ width }}' => $width,
                '{{ height }}' => $height
            ));
        }

        if (!$constraint->allowPortrait && $width < $height) {
            $this->context->addViolation($constraint->allowPortraitMessage, array(
                '{{ width }}' => $width,
                '{{ height }}' => $height
            ));
        }

    }
}
PKa�\�+��;pear/Symfony/Component/Validator/Constraints/NotEqualTo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @Annotation
 *
 * @author Daniel Holmes <daniel@danielholmes.org>
 */
class NotEqualTo extends AbstractComparison
{
    public $message = 'This value should not be equal to {{ compared_value }}.';
}
PKa�\��4pear/Symfony/Component/Validator/Constraints/All.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;

/**
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class All extends Constraint
{
    public $constraints = array();

    /**
     * {@inheritDoc}
     */
    public function __construct($options = null)
    {
        parent::__construct($options);

        if (!is_array($this->constraints)) {
            $this->constraints = array($this->constraints);
        }

        foreach ($this->constraints as $constraint) {
            if (!$constraint instanceof Constraint) {
                throw new ConstraintDefinitionException(sprintf('The value %s is not an instance of Constraint in constraint %s', $constraint, __CLASS__));
            }

            if ($constraint instanceof Valid) {
                throw new ConstraintDefinitionException(sprintf('The constraint Valid cannot be nested inside constraint %s. You can only declare the Valid constraint directly on a field or method.', __CLASS__));
            }
        }
    }

    public function getDefaultOption()
    {
        return 'constraints';
    }

    public function getRequiredOptions()
    {
        return array('constraints');
    }
}
PKa�\�����Bpear/Symfony/Component/Validator/Constraints/DateTimeValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class DateTimeValidator extends DateValidator
{
    const PATTERN = '/^(\d{4})-(\d{2})-(\d{2}) (0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/';
}
PKa�\����vv>pear/Symfony/Component/Validator/Constraints/GroupSequence.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Constraints;

/**
 * Annotation for group sequences
 *
 * @Annotation
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
class GroupSequence
{
    /**
     * The members of the sequence
     * @var array
     */
    public $groups;

    public function __construct(array $groups)
    {
        $this->groups = $groups['value'];
    }
}
PKa�\|����;pear/Symfony/Component/Validator/Mapping/GetterMetadata.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\Exception\ValidatorException;

class GetterMetadata extends MemberMetadata
{
    /**
     * Constructor.
     *
     * @param string $class    The class the getter is defined on
     * @param string $property The property which the getter returns
     *
     * @throws ValidatorException
     */
    public function __construct($class, $property)
    {
        $getMethod = 'get'.ucfirst($property);
        $isMethod = 'is'.ucfirst($property);

        if (method_exists($class, $getMethod)) {
            $method = $getMethod;
        } elseif (method_exists($class, $isMethod)) {
            $method = $isMethod;
        } else {
            throw new ValidatorException(sprintf('Neither method %s nor %s exists in class %s', $getMethod, $isMethod, $class));
        }

        parent::__construct($class, $method, $property);
    }

    /**
     * {@inheritDoc}
     */
    public function getPropertyValue($object)
    {
        return $this->newReflectionMember($object)->invoke($object);
    }

    /**
     * {@inheritDoc}
     */
    protected function newReflectionMember($objectOrClassName)
    {
        return new \ReflectionMethod($objectOrClassName, $this->getName());
    }
}
PKa�\�۔��Epear/Symfony/Component/Validator/Mapping/BlackholeMetadataFactory.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\MetadataFactoryInterface;

/**
 * Simple implementation of MetadataFactoryInterface that can be used when using ValidatorInterface::validateValue().
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class BlackholeMetadataFactory implements MetadataFactoryInterface
{
    /**
     * @inheritdoc
     */
    public function getMetadataFor($value)
    {
        throw new \LogicException('BlackholeClassMetadataFactory only works with ValidatorInterface::validateValue().');
    }

    /**
     * @inheritdoc
     */
    public function hasMetadataFor($value)
    {
        return false;
    }
}
PKa�\+�d%%Apear/Symfony/Component/Validator/Mapping/Cache/CacheInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Cache;

use Symfony\Component\Validator\Mapping\ClassMetadata;

/**
 * Persists ClassMetadata instances in a cache
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface CacheInterface
{
    /**
     * Returns whether metadata for the given class exists in the cache
     *
     * @param string $class
     */
    public function has($class);

    /**
     * Returns the metadata for the given class from the cache
     *
     * @param string $class Class Name
     *
     * @return ClassMetadata|false A ClassMetadata instance or false on miss
     */
    public function read($class);

    /**
     * Stores a class metadata in the cache
     *
     * @param ClassMetadata $metadata A Class Metadata
     */
    public function write(ClassMetadata $metadata);
}
PKa�\����;pear/Symfony/Component/Validator/Mapping/Cache/ApcCache.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Cache;

use Symfony\Component\Validator\Mapping\ClassMetadata;

class ApcCache implements CacheInterface
{
    private $prefix;

    public function __construct($prefix)
    {
        if (!extension_loaded('apc')) {
            throw new \RuntimeException('Unable to use ApcCache to cache validator mappings as APC is not enabled.');
        }

        $this->prefix = $prefix;
    }

    public function has($class)
    {
        if (!function_exists('apc_exists')) {
            $exists = false;

            apc_fetch($this->prefix.$class, $exists);

            return $exists;
        }

        return apc_exists($this->prefix.$class);
    }

    public function read($class)
    {
        return apc_fetch($this->prefix.$class);
    }

    public function write(ClassMetadata $metadata)
    {
        apc_store($this->prefix.$metadata->getClassName(), $metadata);
    }
}
PKa�\d#[N��Apear/Symfony/Component/Validator/Mapping/ClassMetadataFactory.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\MetadataFactoryInterface;
use Symfony\Component\Validator\Exception\NoSuchMetadataException;
use Symfony\Component\Validator\Mapping\Loader\LoaderInterface;
use Symfony\Component\Validator\Mapping\Cache\CacheInterface;

/**
 * A factory for creating metadata for PHP classes.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ClassMetadataFactory implements MetadataFactoryInterface
{
    /**
     * The loader for loading the class metadata
     * @var LoaderInterface
     */
    protected $loader;

    /**
     * The cache for caching class metadata
     * @var CacheInterface
     */
    protected $cache;

    protected $loadedClasses = array();

    public function __construct(LoaderInterface $loader = null, CacheInterface $cache = null)
    {
        $this->loader = $loader;
        $this->cache = $cache;
    }

    /**
     * {@inheritdoc}
     */
    public function getMetadataFor($value)
    {
        if (!is_object($value) && !is_string($value)) {
            throw new NoSuchMetadataException(sprintf('Cannot create metadata for non-objects. Got: %s', gettype($value)));
        }

        $class = ltrim(is_object($value) ? get_class($value) : $value, '\\');

        if (isset($this->loadedClasses[$class])) {
            return $this->loadedClasses[$class];
        }

        if (null !== $this->cache && false !== ($this->loadedClasses[$class] = $this->cache->read($class))) {
            return $this->loadedClasses[$class];
        }

        if (!class_exists($class) && !interface_exists($class)) {
            throw new NoSuchMetadataException(sprintf('The class or interface "%s" does not exist.', $class));
        }

        $metadata = new ClassMetadata($class);

        // Include constraints from the parent class
        if ($parent = $metadata->getReflectionClass()->getParentClass()) {
            $metadata->mergeConstraints($this->getMetadataFor($parent->name));
        }

        // Include constraints from all implemented interfaces
        foreach ($metadata->getReflectionClass()->getInterfaces() as $interface) {
            if ('Symfony\Component\Validator\GroupSequenceProviderInterface' === $interface->name) {
                continue;
            }
            $metadata->mergeConstraints($this->getMetadataFor($interface->name));
        }

        if (null !== $this->loader) {
            $this->loader->loadClassMetadata($metadata);
        }

        if (null !== $this->cache) {
            $this->cache->write($metadata);
        }

        return $this->loadedClasses[$class] = $metadata;
    }

    /**
     * {@inheritdoc}
     */
    public function hasMetadataFor($value)
    {
        if (!is_object($value) && !is_string($value)) {
            return false;
        }

        $class = ltrim(is_object($value) ? get_class($value) : $value, '\\');

        if (class_exists($class) || interface_exists($class)) {
            return true;
        }

        return false;
    }
}
PKa�\r
���=pear/Symfony/Component/Validator/Mapping/PropertyMetadata.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\Exception\ValidatorException;

class PropertyMetadata extends MemberMetadata
{
    /**
     * Constructor.
     *
     * @param string $class The class this property is defined on
     * @param string $name  The name of this property
     *
     * @throws ValidatorException
     */
    public function __construct($class, $name)
    {
        if (!property_exists($class, $name)) {
            throw new ValidatorException(sprintf('Property %s does not exist in class %s', $name, $class));
        }

        parent::__construct($class, $name, $name);
    }

    /**
     * {@inheritDoc}
     */
    public function getPropertyValue($object)
    {
        return $this->getReflectionMember($object)->getValue($object);
    }

    /**
     * {@inheritDoc}
     */
    protected function newReflectionMember($objectOrClassName)
    {
        $class = new \ReflectionClass($objectOrClassName);
        while (!$class->hasProperty($this->getName())) {
            $class = $class->getParentClass();
        }

        $member = new \ReflectionProperty($class->getName(), $this->getName());
        $member->setAccessible(true);

        return $member;
    }
}
PKa�\T�b��Fpear/Symfony/Component/Validator/Mapping/Loader/StaticMethodLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Exception\MappingException;
use Symfony\Component\Validator\Mapping\ClassMetadata;

class StaticMethodLoader implements LoaderInterface
{
    protected $methodName;

    public function __construct($methodName = 'loadValidatorMetadata')
    {
        $this->methodName = $methodName;
    }

    /**
     * {@inheritDoc}
     */
    public function loadClassMetadata(ClassMetadata $metadata)
    {
        /** @var \ReflectionClass $reflClass */
        $reflClass = $metadata->getReflectionClass();

        if (!$reflClass->isInterface() && $reflClass->hasMethod($this->methodName)) {
            $reflMethod = $reflClass->getMethod($this->methodName);

            if ($reflMethod->isAbstract()) {
                return false;
            }

            if (!$reflMethod->isStatic()) {
                throw new MappingException(sprintf('The method %s::%s should be static', $reflClass->name, $this->methodName));
            }

            if ($reflMethod->getDeclaringClass()->name != $reflClass->name) {
                return false;
            }

            $reflMethod->invoke(null, $metadata);

            return true;
        }

        return false;
    }
}
PKa�\'��pkkBpear/Symfony/Component/Validator/Mapping/Loader/YamlFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Yaml\Parser as YamlParser;

class YamlFileLoader extends FileLoader
{
    private $yamlParser;

    /**
     * An array of YAML class descriptions
     *
     * @var array
     */
    protected $classes = null;

    /**
     * {@inheritDoc}
     */
    public function loadClassMetadata(ClassMetadata $metadata)
    {
        if (null === $this->classes) {
            if (!stream_is_local($this->file)) {
                throw new \InvalidArgumentException(sprintf('This is not a local file "%s".', $this->file));
            }

            if (!file_exists($this->file)) {
                throw new \InvalidArgumentException(sprintf('File "%s" not found.', $this->file));
            }

            if (null === $this->yamlParser) {
                $this->yamlParser = new YamlParser();
            }

            $this->classes = $this->yamlParser->parse(file_get_contents($this->file));

            // empty file
            if (null === $this->classes) {
                return false;
            }

            // not an array
            if (!is_array($this->classes)) {
                throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $this->file));
            }

            if (isset($this->classes['namespaces'])) {
                foreach ($this->classes['namespaces'] as $alias => $namespace) {
                    $this->addNamespaceAlias($alias, $namespace);
                }

                unset($this->classes['namespaces']);
            }
        }

        // TODO validation

        if (isset($this->classes[$metadata->getClassName()])) {
            $yaml = $this->classes[$metadata->getClassName()];

            if (isset($yaml['group_sequence_provider'])) {
                $metadata->setGroupSequenceProvider((bool) $yaml['group_sequence_provider']);
            }

            if (isset($yaml['group_sequence'])) {
                $metadata->setGroupSequence($yaml['group_sequence']);
            }

            if (isset($yaml['constraints']) && is_array($yaml['constraints'])) {
                foreach ($this->parseNodes($yaml['constraints']) as $constraint) {
                    $metadata->addConstraint($constraint);
                }
            }

            if (isset($yaml['properties']) && is_array($yaml['properties'])) {
                foreach ($yaml['properties'] as $property => $constraints) {
                    if (null !== $constraints) {
                        foreach ($this->parseNodes($constraints) as $constraint) {
                            $metadata->addPropertyConstraint($property, $constraint);
                        }
                    }
                }
            }

            if (isset($yaml['getters']) && is_array($yaml['getters'])) {
                foreach ($yaml['getters'] as $getter => $constraints) {
                    if (null !== $constraints) {
                        foreach ($this->parseNodes($constraints) as $constraint) {
                            $metadata->addGetterConstraint($getter, $constraint);
                        }
                    }
                }
            }

            return true;
        }

        return false;
    }

    /**
     * Parses a collection of YAML nodes
     *
     * @param array $nodes The YAML nodes
     *
     * @return array An array of values or Constraint instances
     */
    protected function parseNodes(array $nodes)
    {
        $values = array();

        foreach ($nodes as $name => $childNodes) {
            if (is_numeric($name) && is_array($childNodes) && count($childNodes) == 1) {
                $options = current($childNodes);

                if (is_array($options)) {
                    $options = $this->parseNodes($options);
                }

                $values[] = $this->newConstraint(key($childNodes), $options);
            } else {
                if (is_array($childNodes)) {
                    $childNodes = $this->parseNodes($childNodes);
                }

                $values[$name] = $childNodes;
            }
        }

        return $values;
    }
}
PKa�\k�G+��Bpear/Symfony/Component/Validator/Mapping/Loader/AbstractLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Exception\MappingException;
use Symfony\Component\Validator\Constraint;

abstract class AbstractLoader implements LoaderInterface
{
    /**
     * Contains all known namespaces indexed by their prefix
     * @var array
     */
    protected $namespaces = array();

    /**
     * Adds a namespace alias.
     *
     * @param string $alias     The alias
     * @param string $namespace The PHP namespace
     */
    protected function addNamespaceAlias($alias, $namespace)
    {
        $this->namespaces[$alias] = $namespace;
    }

    /**
     * Creates a new constraint instance for the given constraint name.
     *
     * @param string $name   The constraint name. Either a constraint relative
     *                       to the default constraint namespace, or a fully
     *                       qualified class name
     * @param mixed $options The constraint options
     *
     * @return Constraint
     *
     * @throws MappingException If the namespace prefix is undefined
     */
    protected function newConstraint($name, $options)
    {
        if (strpos($name, '\\') !== false && class_exists($name)) {
            $className = (string) $name;
        } elseif (strpos($name, ':') !== false) {
            list($prefix, $className) = explode(':', $name, 2);

            if (!isset($this->namespaces[$prefix])) {
                throw new MappingException(sprintf('Undefined namespace prefix "%s"', $prefix));
            }

            $className = $this->namespaces[$prefix].$className;
        } else {
            $className = 'Symfony\\Component\\Validator\\Constraints\\'.$name;
        }

        return new $className($options);
    }
}
PKa�\	lw#QQDpear/Symfony/Component/Validator/Mapping/Loader/AnnotationLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

use Doctrine\Common\Annotations\Reader;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\Validator\Exception\MappingException;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\Constraints\GroupSequenceProvider;
use Symfony\Component\Validator\Constraint;

class AnnotationLoader implements LoaderInterface
{
    protected $reader;

    public function __construct(Reader $reader)
    {
        $this->reader = $reader;
    }

    /**
     * {@inheritDoc}
     */
    public function loadClassMetadata(ClassMetadata $metadata)
    {
        $reflClass = $metadata->getReflectionClass();
        $className = $reflClass->name;
        $loaded = false;

        foreach ($this->reader->getClassAnnotations($reflClass) as $constraint) {
            if ($constraint instanceof GroupSequence) {
                $metadata->setGroupSequence($constraint->groups);
            } elseif ($constraint instanceof GroupSequenceProvider) {
                $metadata->setGroupSequenceProvider(true);
            } elseif ($constraint instanceof Constraint) {
                $metadata->addConstraint($constraint);
            }

            $loaded = true;
        }

        foreach ($reflClass->getProperties() as $property) {
            if ($property->getDeclaringClass()->name == $className) {
                foreach ($this->reader->getPropertyAnnotations($property) as $constraint) {
                    if ($constraint instanceof Constraint) {
                        $metadata->addPropertyConstraint($property->name, $constraint);
                    }

                    $loaded = true;
                }
            }
        }

        foreach ($reflClass->getMethods() as $method) {
            if ($method->getDeclaringClass()->name ==  $className) {
                foreach ($this->reader->getMethodAnnotations($method) as $constraint) {
                    if ($constraint instanceof Callback) {
                        $constraint->callback = $method->getName();
                        $constraint->methods = null;

                        $metadata->addConstraint($constraint);
                    } elseif ($constraint instanceof Constraint) {
                        if (preg_match('/^(get|is)(.+)$/i', $method->name, $matches)) {
                            $metadata->addGetterConstraint(lcfirst($matches[2]), $constraint);
                        } else {
                            throw new MappingException(sprintf('The constraint on "%s::%s" cannot be added. Constraints can only be added on methods beginning with "get" or "is".', $className, $method->name));
                        }
                    }

                    $loaded = true;
                }
            }
        }

        return $loaded;
    }
}
PKa�\�>�??Cpear/Symfony/Component/Validator/Mapping/Loader/LoaderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Mapping\ClassMetadata;

interface LoaderInterface
{
    /**
     * Load a Class Metadata.
     *
     * @param ClassMetadata $metadata A metadata
     *
     * @return Boolean
     */
    public function loadClassMetadata(ClassMetadata $metadata);
}
PKa�\�����?pear/Symfony/Component/Validator/Mapping/Loader/LoaderChain.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Exception\MappingException;
use Symfony\Component\Validator\Mapping\ClassMetadata;

/**
 * Calls multiple LoaderInterface instances in a chain
 *
 * This class accepts multiple instances of LoaderInterface to be passed to the
 * constructor. When loadClassMetadata() is called, the same method is called
 * in <em>all</em> of these loaders, regardless of whether any of them was
 * successful or not.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class LoaderChain implements LoaderInterface
{
    protected $loaders;

    /**
     * Accepts a list of LoaderInterface instances
     *
     * @param LoaderInterface[] $loaders An array of LoaderInterface instances
     *
     * @throws MappingException If any of the loaders does not implement LoaderInterface
     */
    public function __construct(array $loaders)
    {
        foreach ($loaders as $loader) {
            if (!$loader instanceof LoaderInterface) {
                throw new MappingException(sprintf('Class %s is expected to implement LoaderInterface', get_class($loader)));
            }
        }

        $this->loaders = $loaders;
    }

    /**
     * {@inheritDoc}
     */
    public function loadClassMetadata(ClassMetadata $metadata)
    {
        $success = false;

        foreach ($this->loaders as $loader) {
            $success = $loader->loadClassMetadata($metadata) || $success;
        }

        return $success;
    }
}
PKa�\���*��?pear/Symfony/Component/Validator/Mapping/Loader/FilesLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

/**
 * Creates mapping loaders for array of files.
 *
 * Abstract class, used by
 *
 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
 *
 * @see    Symfony\Component\Validator\Mapping\Loader\YamlFileLoader
 * @see    Symfony\Component\Validator\Mapping\Loader\XmlFileLoader
 */
abstract class FilesLoader extends LoaderChain
{
    /**
     * Array of mapping files.
     *
     * @param array $paths Array of file paths
     */
    public function __construct(array $paths)
    {
        parent::__construct($this->getFileLoaders($paths));
    }

    /**
     * Array of mapping files.
     *
     * @param array $paths Array of file paths
     *
     * @return LoaderInterface[] Array of metadata loaders
     */
    protected function getFileLoaders($paths)
    {
        $loaders = array();
        foreach ($paths as $path) {
            $loaders[] = $this->getFileLoaderInstance($path);
        }

        return $loaders;
    }

    /**
     * Takes mapping file path.
     *
     * @param string $file
     *
     * @return LoaderInterface
     */
    abstract protected function getFileLoaderInstance($file);
}
PK	a�\TO��--hpear/Symfony/Component/Validator/Mapping/Loader/schema/dic/constraint-mapping/constraint-mapping-1.0.xsdnu�[���<?xml version="1.0" ?>

<xsd:schema xmlns="http://symfony.com/schema/dic/constraint-mapping"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://symfony.com/schema/dic/constraint-mapping"
    elementFormDefault="qualified">

  <xsd:annotation>
    <xsd:documentation><![CDATA[
      Symfony Validator Constraint Mapping Schema, version 1.0
      Authors: Bernhard Schussek

      A constraint mapping connects classes, properties and getters with
      validation constraints.
    ]]></xsd:documentation>
  </xsd:annotation>
  
  <xsd:element name="constraint-mapping" type="constraint-mapping" />
  
  <xsd:complexType name="constraint-mapping">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        The root element of the constraint mapping definition.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="namespace" type="namespace" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="class" type="class" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>
  
  <xsd:complexType name="namespace">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains the abbreviation for a namespace.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute name="prefix" type="xsd:string" use="required" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
  
  <xsd:complexType name="class">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains constraints for a single class.
        
        Nested elements may be class constraints, property and/or getter 
        definitions.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      <xsd:element name="group-sequence-provider" type="group-sequence-provider" minOccurs="0" maxOccurs="1" />
      <xsd:element name="group-sequence" type="group-sequence" minOccurs="0" maxOccurs="1" />
      <xsd:element name="constraint" type="constraint" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="property" type="property" minOccurs="0" maxOccurs="unbounded" />
      <xsd:element name="getter" type="getter" minOccurs="0" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="name" type="xsd:string" use="required" />
  </xsd:complexType>

  <xsd:complexType name="group-sequence">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains the group sequence of a class. Each group should be written
        into a "value" tag.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
    </xsd:sequence>
  </xsd:complexType>
  
  <xsd:complexType name="group-sequence-provider">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Defines the name of the group sequence provider for a class.
      ]]></xsd:documentation>
    </xsd:annotation>
  </xsd:complexType>
  
  <xsd:complexType name="property">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains constraints for a single property. The name of the property
        should be given in the "name" option.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="constraint" type="constraint" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required" />
  </xsd:complexType>
  
  <xsd:complexType name="getter">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains constraints for a getter method. The name of the corresponding
        property should be given in the "property" option.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="constraint" type="constraint" maxOccurs="unbounded" />
    </xsd:sequence>
    <xsd:attribute name="property" type="xsd:string" use="required" />
  </xsd:complexType>
  
  <xsd:complexType name="constraint" mixed="true">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains a constraint definition. The name of the constraint should be
        given in the "name" option.
        
        May contain a single value, multiple "constraint" elements, 
        multiple "value" elements or multiple "option" elements.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="0">
      <xsd:element name="constraint" type="constraint" minOccurs="1" maxOccurs="unbounded" />
      <xsd:element name="option" type="option" minOccurs="1" maxOccurs="unbounded" />
      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="name" type="xsd:string" use="required" />    
  </xsd:complexType>
  
  <xsd:complexType name="option" mixed="true">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        Contains a constraint option definition. The name of the option
        should be given in the "name" option.
        
        May contain a single value, multiple "value" elements or multiple
        "constraint" elements.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="0">
      <xsd:element name="constraint" type="constraint" minOccurs="1" maxOccurs="unbounded" />
      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="name" type="xsd:string" use="required" />  
  </xsd:complexType>
  
  <xsd:complexType name="value" mixed="true">
    <xsd:annotation>
      <xsd:documentation><![CDATA[
        A value of an element.
        
        May contain a single value, multiple "value" elements or multiple
        "constraint" elements.
      ]]></xsd:documentation>
    </xsd:annotation>
    <xsd:choice minOccurs="0">
      <xsd:element name="constraint" type="constraint" minOccurs="1" maxOccurs="unbounded" />
      <xsd:element name="value" type="value" minOccurs="1" maxOccurs="unbounded" />
    </xsd:choice>
    <xsd:attribute name="key" type="xsd:string" use="optional" /> 
  </xsd:complexType>
</xsd:schema>
PK	a�\;Q�F11Apear/Symfony/Component/Validator/Mapping/Loader/XmlFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Exception\MappingException;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Config\Util\XmlUtils;

class XmlFileLoader extends FileLoader
{
    /**
     * An array of SimpleXMLElement instances.
     *
     * @var \SimpleXMLElement[]
     */
    protected $classes = null;

    /**
     * {@inheritDoc}
     */
    public function loadClassMetadata(ClassMetadata $metadata)
    {
        if (null === $this->classes) {
            $this->classes = array();
            $xml = $this->parseFile($this->file);

            foreach ($xml->namespace as $namespace) {
                $this->addNamespaceAlias((string) $namespace['prefix'], trim((string) $namespace));
            }

            foreach ($xml->class as $class) {
                $this->classes[(string) $class['name']] = $class;
            }
        }

        if (isset($this->classes[$metadata->getClassName()])) {
            $xml = $this->classes[$metadata->getClassName()];

            foreach ($xml->{'group-sequence-provider'} as $provider) {
                $metadata->setGroupSequenceProvider(true);
            }

            foreach ($xml->{'group-sequence'} as $groupSequence) {
                if (count($groupSequence->value) > 0) {
                    $metadata->setGroupSequence($this->parseValues($groupSequence[0]->value));
                }
            }

            foreach ($this->parseConstraints($xml->constraint) as $constraint) {
                $metadata->addConstraint($constraint);
            }

            foreach ($xml->property as $property) {
                foreach ($this->parseConstraints($property->constraint) as $constraint) {
                    $metadata->addPropertyConstraint((string) $property['name'], $constraint);
                }
            }

            foreach ($xml->getter as $getter) {
                foreach ($this->parseConstraints($getter->constraint) as $constraint) {
                    $metadata->addGetterConstraint((string) $getter['property'], $constraint);
                }
            }

            return true;
        }

        return false;
    }

    /**
     * Parses a collection of "constraint" XML nodes.
     *
     * @param \SimpleXMLElement $nodes The XML nodes
     *
     * @return array The Constraint instances
     */
    protected function parseConstraints(\SimpleXMLElement $nodes)
    {
        $constraints = array();

        foreach ($nodes as $node) {
            if (count($node) > 0) {
                if (count($node->value) > 0) {
                    $options = $this->parseValues($node->value);
                } elseif (count($node->constraint) > 0) {
                    $options = $this->parseConstraints($node->constraint);
                } elseif (count($node->option) > 0) {
                    $options = $this->parseOptions($node->option);
                } else {
                    $options = array();
                }
            } elseif (strlen((string) $node) > 0) {
                $options = trim($node);
            } else {
                $options = null;
            }

            $constraints[] = $this->newConstraint((string) $node['name'], $options);
        }

        return $constraints;
    }

    /**
     * Parses a collection of "value" XML nodes.
     *
     * @param \SimpleXMLElement $nodes The XML nodes
     *
     * @return array The values
     */
    protected function parseValues(\SimpleXMLElement $nodes)
    {
        $values = array();

        foreach ($nodes as $node) {
            if (count($node) > 0) {
                if (count($node->value) > 0) {
                    $value = $this->parseValues($node->value);
                } elseif (count($node->constraint) > 0) {
                    $value = $this->parseConstraints($node->constraint);
                } else {
                    $value = array();
                }
            } else {
                $value = trim($node);
            }

            if (isset($node['key'])) {
                $values[(string) $node['key']] = $value;
            } else {
                $values[] = $value;
            }
        }

        return $values;
    }

    /**
     * Parses a collection of "option" XML nodes.
     *
     * @param \SimpleXMLElement $nodes The XML nodes
     *
     * @return array The options
     */
    protected function parseOptions(\SimpleXMLElement $nodes)
    {
        $options = array();

        foreach ($nodes as $node) {
            if (count($node) > 0) {
                if (count($node->value) > 0) {
                    $value = $this->parseValues($node->value);
                } elseif (count($node->constraint) > 0) {
                    $value = $this->parseConstraints($node->constraint);
                } else {
                    $value = array();
                }
            } else {
                $value = XmlUtils::phpize($node);
                if (is_string($value)) {
                    $value = trim($value);
                }
            }

            $options[(string) $node['name']] = $value;
        }

        return $options;
    }

    /**
     * Parse a XML File.
     *
     * @param string $file Path of file
     *
     * @return \SimpleXMLElement
     *
     * @throws MappingException
     */
    protected function parseFile($file)
    {
        try {
            $dom = XmlUtils::loadFile($file, __DIR__.'/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd');
        } catch (\Exception $e) {
            throw new MappingException($e->getMessage(), $e->getCode(), $e);
        }

        return simplexml_import_dom($dom);
    }
}
PK
a�\Rᠯ��Bpear/Symfony/Component/Validator/Mapping/Loader/XmlFilesLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

/**
 * Loads multiple xml mapping files
 *
 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
 *
 * @see    Symfony\Component\Validator\Mapping\Loader\FilesLoader
 */
class XmlFilesLoader extends FilesLoader
{
    /**
     * {@inheritDoc}
     */
    public function getFileLoaderInstance($file)
    {
        return new XmlFileLoader($file);
    }
}
PK
a�\��ʚ��>pear/Symfony/Component/Validator/Mapping/Loader/FileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

use Symfony\Component\Validator\Exception\MappingException;

abstract class FileLoader extends AbstractLoader
{
    protected $file;

    /**
     * Constructor.
     *
     * @param string $file The mapping file to load
     *
     * @throws MappingException if the mapping file does not exist
     * @throws MappingException if the mapping file is not readable
     */
    public function __construct($file)
    {
        if (!is_file($file)) {
            throw new MappingException(sprintf('The mapping file %s does not exist', $file));
        }

        if (!is_readable($file)) {
            throw new MappingException(sprintf('The mapping file %s is not readable', $file));
        }

        $this->file = $file;
    }
}
PK
a�\�?��Cpear/Symfony/Component/Validator/Mapping/Loader/YamlFilesLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping\Loader;

/**
 * Loads multiple yaml mapping files
 *
 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
 *
 * @see    Symfony\Component\Validator\Mapping\Loader\FilesLoader
 */
class YamlFilesLoader extends FilesLoader
{
    /**
     * {@inheritDoc}
     */
    public function getFileLoaderInstance($file)
    {
        return new YamlFileLoader($file);
    }
}
PK
a�\�/�;aa;pear/Symfony/Component/Validator/Mapping/MemberMetadata.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\ValidationVisitorInterface;
use Symfony\Component\Validator\ClassBasedInterface;
use Symfony\Component\Validator\PropertyMetadataInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Valid;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;

abstract class MemberMetadata extends ElementMetadata implements PropertyMetadataInterface, ClassBasedInterface
{
    public $class;
    public $name;
    public $property;
    public $cascaded = false;
    public $collectionCascaded = false;
    public $collectionCascadedDeeply = false;
    private $reflMember = array();

    /**
     * Constructor.
     *
     * @param string $class    The name of the class this member is defined on
     * @param string $name     The name of the member
     * @param string $property The property the member belongs to
     */
    public function __construct($class, $name, $property)
    {
        $this->class = $class;
        $this->name = $name;
        $this->property = $property;
    }

    public function accept(ValidationVisitorInterface $visitor, $value, $group, $propertyPath, $propagatedGroup = null)
    {
        $visitor->visit($this, $value, $group, $propertyPath);

        if ($this->isCascaded()) {
            $visitor->validate($value, $propagatedGroup ?: $group, $propertyPath, $this->isCollectionCascaded(), $this->isCollectionCascadedDeeply());
        }
    }

    /**
     * {@inheritDoc}
     */
    public function addConstraint(Constraint $constraint)
    {
        if (!in_array(Constraint::PROPERTY_CONSTRAINT, (array) $constraint->getTargets())) {
            throw new ConstraintDefinitionException(sprintf(
                'The constraint %s cannot be put on properties or getters',
                get_class($constraint)
            ));
        }

        if ($constraint instanceof Valid) {
            $this->cascaded = true;
            /* @var Valid $constraint */
            $this->collectionCascaded = $constraint->traverse;
            $this->collectionCascadedDeeply = $constraint->deep;
        } else {
            parent::addConstraint($constraint);
        }

        return $this;
    }

    /**
     * Returns the names of the properties that should be serialized
     *
     * @return array
     */
    public function __sleep()
    {
        return array_merge(parent::__sleep(), array(
            'class',
            'name',
            'property',
            'cascaded',
            'collectionCascaded',
            'collectionCascadedDeeply',
        ));
    }

    /**
     * Returns the name of the member
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Returns the class this member is defined on
     *
     * @return string
     */
    public function getClassName()
    {
        return $this->class;
    }

    /**
     * Returns the name of the property this member belongs to
     *
     * @return string The property name
     */
    public function getPropertyName()
    {
        return $this->property;
    }

    /**
     * Returns whether this member is public
     *
     * @param object|string $objectOrClassName The object or the class name
     *
     * @return Boolean
     */
    public function isPublic($objectOrClassName)
    {
        return $this->getReflectionMember($objectOrClassName)->isPublic();
    }

    /**
     * Returns whether this member is protected
     *
     * @param object|string $objectOrClassName The object or the class name
     *
     * @return Boolean
     */
    public function isProtected($objectOrClassName)
    {
        return $this->getReflectionMember($objectOrClassName)->isProtected();
    }

    /**
     * Returns whether this member is private
     *
     * @param object|string $objectOrClassName The object or the class name
     *
     * @return Boolean
     */
    public function isPrivate($objectOrClassName)
    {
        return $this->getReflectionMember($objectOrClassName)->isPrivate();
    }

    /**
     * Returns whether objects stored in this member should be validated
     *
     * @return Boolean
     */
    public function isCascaded()
    {
        return $this->cascaded;
    }

    /**
     * Returns whether arrays or traversable objects stored in this member
     * should be traversed and validated in each entry
     *
     * @return Boolean
     */
    public function isCollectionCascaded()
    {
        return $this->collectionCascaded;
    }

    /**
     * Returns whether arrays or traversable objects stored in this member
     * should be traversed recursively for inner arrays/traversable objects
     *
     * @return Boolean
     */
    public function isCollectionCascadedDeeply()
    {
        return $this->collectionCascadedDeeply;
    }

    /**
     * Returns the Reflection instance of the member
     *
     * @param object|string $objectOrClassName The object or the class name
     *
     * @return object
     */
    public function getReflectionMember($objectOrClassName)
    {
        $className = is_string($objectOrClassName) ? $objectOrClassName : get_class($objectOrClassName);
        if (!isset($this->reflMember[$className])) {
            $this->reflMember[$className] = $this->newReflectionMember($objectOrClassName);
        }

        return $this->reflMember[$className];
    }

    /**
     * Creates a new Reflection instance for the member
     *
     * @param object|string $objectOrClassName The object or the class name
     *
     * @return mixed Reflection class
     */
    abstract protected function newReflectionMember($objectOrClassName);
}
PKa�\�t�././:pear/Symfony/Component/Validator/Mapping/ClassMetadata.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\ValidationVisitorInterface;
use Symfony\Component\Validator\PropertyMetadataContainerInterface;
use Symfony\Component\Validator\ClassBasedInterface;
use Symfony\Component\Validator\MetadataInterface;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\GroupDefinitionException;

/**
 * Represents all the configured constraints on a given class.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ClassMetadata extends ElementMetadata implements MetadataInterface, ClassBasedInterface, PropertyMetadataContainerInterface
{
    /**
     * @var string
     */
    public $name;

    /**
     * @var string
     */
    public $defaultGroup;

    /**
     * @var MemberMetadata[]
     */
    public $members = array();

    /**
     * @var PropertyMetadata[]
     */
    public $properties = array();

    /**
     * @var GetterMetadata[]
     */
    public $getters = array();

    /**
     * @var array
     */
    public $groupSequence = array();

    /**
     * @var Boolean
     */
    public $groupSequenceProvider = false;

    /**
     * @var \ReflectionClass
     */
    private $reflClass;

    /**
     * Constructs a metadata for the given class
     *
     * @param string $class
     */
    public function __construct($class)
    {
        $this->name = $class;
        // class name without namespace
        if (false !== $nsSep = strrpos($class, '\\')) {
            $this->defaultGroup = substr($class, $nsSep + 1);
        } else {
            $this->defaultGroup = $class;
        }
    }

    public function accept(ValidationVisitorInterface $visitor, $value, $group, $propertyPath, $propagatedGroup = null)
    {
        if (null === $propagatedGroup && Constraint::DEFAULT_GROUP === $group
                && ($this->hasGroupSequence() || $this->isGroupSequenceProvider())) {
            if ($this->hasGroupSequence()) {
                $groups = $this->getGroupSequence();
            } else {
                $groups = $value->getGroupSequence();
            }

            foreach ($groups as $group) {
                $this->accept($visitor, $value, $group, $propertyPath, Constraint::DEFAULT_GROUP);

                if (count($visitor->getViolations()) > 0) {
                    break;
                }
            }

            return;
        }

        $visitor->visit($this, $value, $group, $propertyPath);

        if (null !== $value) {
            $pathPrefix = empty($propertyPath) ? '' : $propertyPath.'.';

            foreach ($this->getConstrainedProperties() as $property) {
                foreach ($this->getMemberMetadatas($property) as $member) {
                    $member->accept($visitor, $member->getPropertyValue($value), $group, $pathPrefix.$property, $propagatedGroup);
                }
            }
        }
    }

    /**
     * Returns the properties to be serialized
     *
     * @return array
     */
    public function __sleep()
    {
        return array_merge(parent::__sleep(), array(
            'getters',
            'groupSequence',
            'groupSequenceProvider',
            'members',
            'name',
            'properties',
            'defaultGroup'
        ));
    }

    /**
     * Returns the fully qualified name of the class
     *
     * @return string  The fully qualified class name
     */
    public function getClassName()
    {
        return $this->name;
    }

    /**
     * Returns the name of the default group for this class
     *
     * For each class, the group "Default" is an alias for the group
     * "<ClassName>", where <ClassName> is the non-namespaced name of the
     * class. All constraints implicitly or explicitly assigned to group
     * "Default" belong to both of these groups, unless the class defines
     * a group sequence.
     *
     * If a class defines a group sequence, validating the class in "Default"
     * will validate the group sequence. The constraints assigned to "Default"
     * can still be validated by validating the class in "<ClassName>".
     *
     * @return string  The name of the default group
     */
    public function getDefaultGroup()
    {
        return $this->defaultGroup;
    }

    /**
     * {@inheritDoc}
     */
    public function addConstraint(Constraint $constraint)
    {
        if (!in_array(Constraint::CLASS_CONSTRAINT, (array) $constraint->getTargets())) {
            throw new ConstraintDefinitionException(sprintf(
                'The constraint %s cannot be put on classes',
                get_class($constraint)
            ));
        }

        $constraint->addImplicitGroupName($this->getDefaultGroup());

        parent::addConstraint($constraint);
    }

    /**
     * Adds a constraint to the given property.
     *
     * @param string     $property   The name of the property
     * @param Constraint $constraint The constraint
     *
     * @return ClassMetadata This object
     */
    public function addPropertyConstraint($property, Constraint $constraint)
    {
        if (!isset($this->properties[$property])) {
            $this->properties[$property] = new PropertyMetadata($this->getClassName(), $property);

            $this->addMemberMetadata($this->properties[$property]);
        }

        $constraint->addImplicitGroupName($this->getDefaultGroup());

        $this->properties[$property]->addConstraint($constraint);

        return $this;
    }

    /**
     * Adds a constraint to the getter of the given property.
     *
     * The name of the getter is assumed to be the name of the property with an
     * uppercased first letter and either the prefix "get" or "is".
     *
     * @param string     $property   The name of the property
     * @param Constraint $constraint The constraint
     *
     * @return ClassMetadata This object
     */
    public function addGetterConstraint($property, Constraint $constraint)
    {
        if (!isset($this->getters[$property])) {
            $this->getters[$property] = new GetterMetadata($this->getClassName(), $property);

            $this->addMemberMetadata($this->getters[$property]);
        }

        $constraint->addImplicitGroupName($this->getDefaultGroup());

        $this->getters[$property]->addConstraint($constraint);

        return $this;
    }

    /**
     * Merges the constraints of the given metadata into this object.
     *
     * @param ClassMetadata $source The source metadata
     */
    public function mergeConstraints(ClassMetadata $source)
    {
        foreach ($source->getConstraints() as $constraint) {
            $this->addConstraint(clone $constraint);
        }

        foreach ($source->getConstrainedProperties() as $property) {
            foreach ($source->getMemberMetadatas($property) as $member) {
                $member = clone $member;

                foreach ($member->getConstraints() as $constraint) {
                    $constraint->addImplicitGroupName($this->getDefaultGroup());
                }

                $this->addMemberMetadata($member);

                if (!$member->isPrivate($this->name)) {
                    $property = $member->getPropertyName();

                    if ($member instanceof PropertyMetadata && !isset($this->properties[$property])) {
                        $this->properties[$property] = $member;
                    } elseif ($member instanceof GetterMetadata && !isset($this->getters[$property])) {
                        $this->getters[$property] = $member;
                    }
                }
            }
        }
    }

    /**
     * Adds a member metadata.
     *
     * @param MemberMetadata $metadata
     */
    protected function addMemberMetadata(MemberMetadata $metadata)
    {
        $property = $metadata->getPropertyName();

        $this->members[$property][] = $metadata;
    }

    /**
     * Returns true if metadatas of members is present for the given property.
     *
     * @param string $property The name of the property
     *
     * @return Boolean
     */
    public function hasMemberMetadatas($property)
    {
        return array_key_exists($property, $this->members);
    }

    /**
     * Returns all metadatas of members describing the given property.
     *
     * @param string $property The name of the property
     *
     * @return MemberMetadata[] An array of MemberMetadata
     */
    public function getMemberMetadatas($property)
    {
        return $this->members[$property];
    }

    /**
     * {@inheritdoc}
     */
    public function hasPropertyMetadata($property)
    {
        return array_key_exists($property, $this->members);
    }

    /**
     * {@inheritdoc}
     */
    public function getPropertyMetadata($property)
    {
        return $this->members[$property];
    }

    /**
     * Returns all properties for which constraints are defined.
     *
     * @return array An array of property names
     */
    public function getConstrainedProperties()
    {
        return array_keys($this->members);
    }

    /**
     * Sets the default group sequence for this class.
     *
     * @param array $groups An array of group names
     *
     * @return ClassMetadata
     *
     * @throws GroupDefinitionException
     */
    public function setGroupSequence(array $groups)
    {
        if ($this->isGroupSequenceProvider()) {
            throw new GroupDefinitionException('Defining a static group sequence is not allowed with a group sequence provider');
        }

        if (in_array(Constraint::DEFAULT_GROUP, $groups, true)) {
            throw new GroupDefinitionException(sprintf('The group "%s" is not allowed in group sequences', Constraint::DEFAULT_GROUP));
        }

        if (!in_array($this->getDefaultGroup(), $groups, true)) {
            throw new GroupDefinitionException(sprintf('The group "%s" is missing in the group sequence', $this->getDefaultGroup()));
        }

        $this->groupSequence = $groups;

        return $this;
    }

    /**
     * Returns whether this class has an overridden default group sequence.
     *
     * @return Boolean
     */
    public function hasGroupSequence()
    {
        return count($this->groupSequence) > 0;
    }

    /**
     * Returns the default group sequence for this class.
     *
     * @return array An array of group names
     */
    public function getGroupSequence()
    {
        return $this->groupSequence;
    }

    /**
     * Returns a ReflectionClass instance for this class.
     *
     * @return \ReflectionClass
     */
    public function getReflectionClass()
    {
        if (!$this->reflClass) {
            $this->reflClass = new \ReflectionClass($this->getClassName());
        }

        return $this->reflClass;
    }

    /**
     * Sets whether a group sequence provider should be used.
     *
     * @param Boolean $active
     *
     * @throws GroupDefinitionException
     */
    public function setGroupSequenceProvider($active)
    {
        if ($this->hasGroupSequence()) {
            throw new GroupDefinitionException('Defining a group sequence provider is not allowed with a static group sequence');
        }

        if (!$this->getReflectionClass()->implementsInterface('Symfony\Component\Validator\GroupSequenceProviderInterface')) {
            throw new GroupDefinitionException(sprintf('Class "%s" must implement GroupSequenceProviderInterface', $this->name));
        }

        $this->groupSequenceProvider = $active;
    }

    /**
     * Returns whether the class is a group sequence provider.
     *
     * @return Boolean
     */
    public function isGroupSequenceProvider()
    {
        return $this->groupSequenceProvider;
    }
}
PKa�\��!"	"	<pear/Symfony/Component/Validator/Mapping/ElementMetadata.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Mapping;

use Symfony\Component\Validator\Constraint;

abstract class ElementMetadata
{
    /**
     * @var Constraint[]
     */
    public $constraints = array();

    /**
     * @var array
     */
    public $constraintsByGroup = array();

    /**
     * Returns the names of the properties that should be serialized.
     *
     * @return array
     */
    public function __sleep()
    {
        return array(
            'constraints',
            'constraintsByGroup',
        );
    }

    /**
     * Clones this object.
     */
    public function __clone()
    {
        $constraints = $this->constraints;

        $this->constraints = array();
        $this->constraintsByGroup = array();

        foreach ($constraints as $constraint) {
            $this->addConstraint(clone $constraint);
        }
    }

    /**
     * Adds a constraint to this element.
     *
     * @param Constraint $constraint
     *
     * @return ElementMetadata
     */
    public function addConstraint(Constraint $constraint)
    {
        $this->constraints[] = $constraint;

        foreach ($constraint->groups as $group) {
            $this->constraintsByGroup[$group][] = $constraint;
        }

        return $this;
    }

    /**
     * Returns all constraints of this element.
     *
     * @return Constraint[] An array of Constraint instances
     */
    public function getConstraints()
    {
        return $this->constraints;
    }

    /**
     * Returns whether this element has any constraints.
     *
     * @return Boolean
     */
    public function hasConstraints()
    {
        return count($this->constraints) > 0;
    }

    /**
     * Returns the constraints of the given group and global ones (* group).
     *
     * @param string $group The group name
     *
     * @return array An array with all Constraint instances belonging to the group
     */
    public function findConstraints($group)
    {
        return isset($this->constraintsByGroup[$group])
                ? $this->constraintsByGroup[$group]
                : array();
    }
}
PKa�\�b�<<Fpear/Symfony/Component/Validator/Exception/UnexpectedTypeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

class UnexpectedTypeException extends ValidatorException
{
    public function __construct($value, $expectedType)
    {
        parent::__construct(sprintf('Expected argument of type "%s", "%s" given', $expectedType, is_object($value) ? get_class($value) : gettype($value)));
    }
}
PKa�\k1+WWApear/Symfony/Component/Validator/Exception/ValidatorException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

class ValidatorException extends \RuntimeException
{
}
PKa�\Q���VV?pear/Symfony/Component/Validator/Exception/MappingException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

class MappingException extends ValidatorException
{
}
PKa�\��y��Epear/Symfony/Component/Validator/Exception/BadMethodCallException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

/**
 * Base BadMethodCallException for the Validator component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface
{
}
PK
a�\z����?pear/Symfony/Component/Validator/Exception/RuntimeException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

/**
 * Base RuntimeException for the Validator component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class RuntimeException extends \RuntimeException implements ExceptionInterface
{
}
PK
a�\�T����Apear/Symfony/Component/Validator/Exception/ExceptionInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

/**
 * Base ExceptionInterface for the Validator component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ExceptionInterface
{
}
PK
a�\��x��Fpear/Symfony/Component/Validator/Exception/NoSuchMetadataException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class NoSuchMetadataException extends ValidatorException
{
}
PK
a�\u��RRFpear/Symfony/Component/Validator/Exception/MissingOptionsException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

class MissingOptionsException extends ValidatorException
{
    private $options;

    public function __construct($message, array $options)
    {
        parent::__construct($message);

        $this->options = $options;
    }

    public function getOptions()
    {
        return $this->options;
    }
}
PKa�\�1�"ccLpear/Symfony/Component/Validator/Exception/ConstraintDefinitionException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

class ConstraintDefinitionException extends ValidatorException
{
}
PKa�\L�ЉRRFpear/Symfony/Component/Validator/Exception/InvalidOptionsException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

class InvalidOptionsException extends ValidatorException
{
    private $options;

    public function __construct($message, array $options)
    {
        parent::__construct($message);

        $this->options = $options;
    }

    public function getOptions()
    {
        return $this->options;
    }
}
PKa�\�\��Gpear/Symfony/Component/Validator/Exception/InvalidArgumentException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

/**
 * Base InvalidArgumentException for the Validator component.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
{
}
PKa�\M��#^^Gpear/Symfony/Component/Validator/Exception/GroupDefinitionException.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator\Exception;

class GroupDefinitionException extends ValidatorException
{
}
PKa�\+s���?pear/Symfony/Component/Validator/ConstraintValidatorFactory.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
use Symfony\Component\Validator\Constraints\ExpressionValidator;

/**
 * Default implementation of the ConstraintValidatorFactoryInterface.
 *
 * This enforces the convention that the validatedBy() method on any
 * Constraint will return the class name of the ConstraintValidator that
 * should validate the Constraint.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface
{
    protected $validators = array();

    /**
     * @var PropertyAccessorInterface
     */
    private $propertyAccessor;

    public function __construct(PropertyAccessorInterface $propertyAccessor = null)
    {
        $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor();
    }

    /**
     * {@inheritDoc}
     */
    public function getInstance(Constraint $constraint)
    {
        $className = $constraint->validatedBy();

        // The second condition is a hack that is needed when CollectionValidator
        // calls itself recursively (Collection constraints can be nested).
        // Since the context of the validator is overwritten when initialize()
        // is called for the nested constraint, the outer validator is
        // acting on the wrong context when the nested validation terminates.
        //
        // A better solution - which should be approached in Symfony 3.0 - is to
        // remove the initialize() method and pass the context as last argument
        // to validate() instead.
        if (!isset($this->validators[$className]) || 'Symfony\Component\Validator\Constraints\CollectionValidator' === $className) {
            $this->validators[$className] = 'validator.expression' === $className
                ? new ExpressionValidator($this->propertyAccessor)
                : new $className();
        }

        return $this->validators[$className];
    }
}
PKa�\;5t��<pear/Symfony/Component/Validator/ConstraintViolationList.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Default implementation of {@ConstraintViolationListInterface}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ConstraintViolationList implements \IteratorAggregate, ConstraintViolationListInterface
{
    /**
     * @var ConstraintViolationInterface[]
     */
    private $violations = array();

    /**
     * Creates a new constraint violation list.
     *
     * @param ConstraintViolationInterface[] $violations The constraint violations to add to the list
     */
    public function __construct(array $violations = array())
    {
        foreach ($violations as $violation) {
            $this->add($violation);
        }
    }

    /**
     * Converts the violation into a string for debugging purposes.
     *
     * @return string The violation as string.
     */
    public function __toString()
    {
        $string = '';

        foreach ($this->violations as $violation) {
            $string .= $violation."\n";
        }

        return $string;
    }

    /**
     * {@inheritDoc}
     */
    public function add(ConstraintViolationInterface $violation)
    {
        $this->violations[] = $violation;
    }

    /**
     * {@inheritDoc}
     */
    public function addAll(ConstraintViolationListInterface $otherList)
    {
        foreach ($otherList as $violation) {
            $this->violations[] = $violation;
        }
    }

    /**
     * {@inheritDoc}
     */
    public function get($offset)
    {
        if (!isset($this->violations[$offset])) {
            throw new \OutOfBoundsException(sprintf('The offset "%s" does not exist.', $offset));
        }

        return $this->violations[$offset];
    }

    /**
     * {@inheritDoc}
     */
    public function has($offset)
    {
        return isset($this->violations[$offset]);
    }

    /**
     * {@inheritDoc}
     */
    public function set($offset, ConstraintViolationInterface $violation)
    {
        $this->violations[$offset] = $violation;
    }

    /**
     * {@inheritDoc}
     */
    public function remove($offset)
    {
        unset($this->violations[$offset]);
    }

    /**
     * {@inheritDoc}
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->violations);
    }

    /**
     * {@inheritDoc}
     */
    public function count()
    {
        return count($this->violations);
    }

    /**
     * {@inheritDoc}
     */
    public function offsetExists($offset)
    {
        return $this->has($offset);
    }

    /**
     * {@inheritDoc}
     */
    public function offsetGet($offset)
    {
        return $this->get($offset);
    }

    /**
     * {@inheritDoc}
     */
    public function offsetSet($offset, $violation)
    {
        if (null === $offset) {
            $this->add($violation);
        } else {
            $this->set($offset, $violation);
        }
    }

    /**
     * {@inheritDoc}
     */
    public function offsetUnset($offset)
    {
        $this->remove($offset);
    }
}
PKa�\Y����=pear/Symfony/Component/Validator/MetadataFactoryInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Returns {@link MetadataInterface} instances for values.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface MetadataFactoryInterface
{
    /**
     * Returns the metadata for the given value.
     *
     * @param mixed $value Some value.
     *
     * @return MetadataInterface The metadata for the value.
     *
     * @throws Exception\NoSuchMetadataException If no metadata exists for the value.
     */
    public function getMetadataFor($value);

    /**
     * Returns whether metadata exists for the given value.
     *
     * @param mixed $value Some value.
     *
     * @return Boolean Whether metadata exists for the value.
     */
    public function hasMetadataFor($value);
}
PKa�\��&{{>pear/Symfony/Component/Validator/ValidatorBuilderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
use Symfony\Component\Validator\Mapping\Cache\CacheInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Doctrine\Common\Annotations\Reader;

/**
 * A configurable builder for ValidatorInterface objects.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ValidatorBuilderInterface
{
    /**
     * Adds an object initializer to the validator.
     *
     * @param ObjectInitializerInterface $initializer The initializer.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function addObjectInitializer(ObjectInitializerInterface $initializer);

    /**
     * Adds a list of object initializers to the validator.
     *
     * @param array $initializers The initializer.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function addObjectInitializers(array $initializers);

    /**
     * Adds an XML constraint mapping file to the validator.
     *
     * @param string $path The path to the mapping file.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function addXmlMapping($path);

    /**
     * Adds a list of XML constraint mapping files to the validator.
     *
     * @param array $paths The paths to the mapping files.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function addXmlMappings(array $paths);

    /**
     * Adds a YAML constraint mapping file to the validator.
     *
     * @param string $path The path to the mapping file.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function addYamlMapping($path);

    /**
     * Adds a list of YAML constraint mappings file to the validator.
     *
     * @param array $paths The paths to the mapping files.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function addYamlMappings(array $paths);

    /**
     * Enables constraint mapping using the given static method.
     *
     * @param string $methodName The name of the method.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function addMethodMapping($methodName);

    /**
     * Enables constraint mapping using the given static methods.
     *
     * @param array $methodNames The names of the methods.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function addMethodMappings(array $methodNames);

    /**
     * Enables annotation based constraint mapping.
     *
     * @param Reader $annotationReader The annotation reader to be used.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function enableAnnotationMapping(Reader $annotationReader = null);

    /**
     * Disables annotation based constraint mapping.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function disableAnnotationMapping();

    /**
     * Sets the class metadata factory used by the validator.
     *
     * @param MetadataFactoryInterface $metadataFactory The metadata factory.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function setMetadataFactory(MetadataFactoryInterface $metadataFactory);

    /**
     * Sets the cache for caching class metadata.
     *
     * @param CacheInterface $cache The cache instance.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function setMetadataCache(CacheInterface $cache);

    /**
     * Sets the constraint validator factory used by the validator.
     *
     * @param ConstraintValidatorFactoryInterface $validatorFactory The validator factory.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function setConstraintValidatorFactory(ConstraintValidatorFactoryInterface $validatorFactory);

    /**
     * Sets the translator used for translating violation messages.
     *
     * @param TranslatorInterface $translator The translator instance.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function setTranslator(TranslatorInterface $translator);

    /**
     * Sets the default translation domain of violation messages.
     *
     * The same message can have different translations in different domains.
     * Pass the domain that is used for violation messages by default to this
     * method.
     *
     * @param string $translationDomain The translation domain of the violation messages.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function setTranslationDomain($translationDomain);

    /**
     * Sets the property accessor for resolving property paths.
     *
     * @param PropertyAccessorInterface $propertyAccessor The property accessor.
     *
     * @return ValidatorBuilderInterface The builder object.
     */
    public function setPropertyAccessor(PropertyAccessorInterface $propertyAccessor);

    /**
     * Builds and returns a new validator object.
     *
     * @return ValidatorInterface The built validator.
     */
    public function getValidator();
}
PKa�\�@V��Epear/Symfony/Component/Validator/ConstraintViolationListInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * A list of constraint violations.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
interface ConstraintViolationListInterface extends \Traversable, \Countable, \ArrayAccess
{
    /**
     * Adds a constraint violation to this list.
     *
     * @param ConstraintViolationInterface $violation The violation to add.
     *
     * @api
     */
    public function add(ConstraintViolationInterface $violation);

    /**
     * Merges an existing violation list into this list.
     *
     * @param ConstraintViolationListInterface $otherList The list to merge.
     *
     * @api
     */
    public function addAll(ConstraintViolationListInterface $otherList);

    /**
     * Returns the violation at a given offset.
     *
     * @param  integer $offset The offset of the violation.
     *
     * @return ConstraintViolationInterface The violation.
     *
     * @throws \OutOfBoundsException If the offset does not exist.
     *
     * @api
     */
    public function get($offset);

    /**
     * Returns whether the given offset exists.
     *
     * @param  integer $offset The violation offset.
     *
     * @return Boolean Whether the offset exists.
     *
     * @api
     */
    public function has($offset);

    /**
     * Sets a violation at a given offset.
     *
     * @param integer                      $offset    The violation offset.
     * @param ConstraintViolationInterface $violation The violation.
     *
     * @api
     */
    public function set($offset, ConstraintViolationInterface $violation);

    /**
     * Removes a violation at a given offset.
     *
     * @param integer $offset The offset to remove.
     *
     * @api
     */
    public function remove($offset);
}
PKa�\�8Wc��Dpear/Symfony/Component/Validator/GlobalExecutionContextInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Stores the node-independent state of a validation run.
 *
 * When the validator validates a graph of objects, it uses two classes to
 * store the state during the validation:
 *
 * <ul>
 * <li>For each node in the validation graph (objects, properties, getters) the
 * validator creates an instance of {@link ExecutionContextInterface} that
 * stores the information about that node.</li>
 * <li>One single <tt>GlobalExecutionContextInterface</tt> stores the state
 * that is independent of the current node.</li>
 * </ul>
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface GlobalExecutionContextInterface
{
    /**
     * Returns the violations generated by the validator so far.
     *
     * @return ConstraintViolationListInterface A list of constraint violations.
     */
    public function getViolations();

    /**
     * Returns the value at which validation was started in the object graph.
     *
     * @return mixed The root value.
     *
     * @see ExecutionContextInterface::getRoot
     */
    public function getRoot();

    /**
     * Returns the visitor instance used to validate the object graph nodes.
     *
     * @return ValidationVisitorInterface The validation visitor.
     */
    public function getVisitor();

    /**
     * Returns the factory for constraint validators.
     *
     * @return ConstraintValidatorFactoryInterface The constraint validator factory.
     */
    public function getValidatorFactory();

    /**
     * Returns the factory for validation metadata objects.
     *
     * @return MetadataFactoryInterface The metadata factory.
     */
    public function getMetadataFactory();
}
PKa�\�d�.pear/Symfony/Component/Validator/Validator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

use Symfony\Component\Validator\Constraints\Valid;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Translation\TranslatorInterface;

/**
 * Default implementation of {@link ValidatorInterface}.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class Validator implements ValidatorInterface
{
    /**
     * @var MetadataFactoryInterface
     */
    private $metadataFactory;

    /**
     * @var ConstraintValidatorFactoryInterface
     */
    private $validatorFactory;

    /**
     * @var TranslatorInterface
     */
    private $translator;

    /**
     * @var null|string
     */
    private $translationDomain;

    /**
     * @var array
     */
    private $objectInitializers;

    public function __construct(
        MetadataFactoryInterface $metadataFactory,
        ConstraintValidatorFactoryInterface $validatorFactory,
        TranslatorInterface $translator,
        $translationDomain = 'validators',
        array $objectInitializers = array()
    )
    {
        $this->metadataFactory = $metadataFactory;
        $this->validatorFactory = $validatorFactory;
        $this->translator = $translator;
        $this->translationDomain = $translationDomain;
        $this->objectInitializers = $objectInitializers;
    }

    /**
     * {@inheritdoc}
     */
    public function getMetadataFactory()
    {
        return $this->metadataFactory;
    }

    /**
     * {@inheritDoc}
     */
    public function getMetadataFor($value)
    {
        return $this->metadataFactory->getMetadataFor($value);
    }

    /**
     * {@inheritDoc}
     */
    public function validate($value, $groups = null, $traverse = false, $deep = false)
    {
        $visitor = $this->createVisitor($value);

        foreach ($this->resolveGroups($groups) as $group) {
            $visitor->validate($value, $group, '', $traverse, $deep);
        }

        return $visitor->getViolations();
    }

    /**
     * {@inheritDoc}
     *
     * @throws ValidatorException If the metadata for the value does not support properties.
     */
    public function validateProperty($containingValue, $property, $groups = null)
    {
        $visitor = $this->createVisitor($containingValue);
        $metadata = $this->metadataFactory->getMetadataFor($containingValue);

        if (!$metadata instanceof PropertyMetadataContainerInterface) {
            $valueAsString = is_scalar($containingValue)
                ? '"'.$containingValue.'"'
                : 'the value of type '.gettype($containingValue);

            throw new ValidatorException(sprintf('The metadata for %s does not support properties.', $valueAsString));
        }

        foreach ($this->resolveGroups($groups) as $group) {
            if (!$metadata->hasPropertyMetadata($property)) {
                continue;
            }

            foreach ($metadata->getPropertyMetadata($property) as $propMeta) {
                $propMeta->accept($visitor, $propMeta->getPropertyValue($containingValue), $group, $property);
            }
        }

        return $visitor->getViolations();
    }

    /**
     * {@inheritDoc}
     *
     * @throws ValidatorException If the metadata for the value does not support properties.
     */
    public function validatePropertyValue($containingValue, $property, $value, $groups = null)
    {
        $visitor = $this->createVisitor($containingValue);
        $metadata = $this->metadataFactory->getMetadataFor($containingValue);

        if (!$metadata instanceof PropertyMetadataContainerInterface) {
            $valueAsString = is_scalar($containingValue)
                ? '"'.$containingValue.'"'
                : 'the value of type '.gettype($containingValue);

            throw new ValidatorException(sprintf('The metadata for '.$valueAsString.' does not support properties.'));
        }

        foreach ($this->resolveGroups($groups) as $group) {
            if (!$metadata->hasPropertyMetadata($property)) {
                continue;
            }

            foreach ($metadata->getPropertyMetadata($property) as $propMeta) {
                $propMeta->accept($visitor, $value, $group, $property);
            }
        }

        return $visitor->getViolations();
    }

    /**
     * {@inheritDoc}
     */
    public function validateValue($value, $constraints, $groups = null)
    {
        $context = new ExecutionContext($this->createVisitor($value), $this->translator, $this->translationDomain);

        $constraints = is_array($constraints) ? $constraints : array($constraints);

        foreach ($constraints as $constraint) {
            if ($constraint instanceof Valid) {
                // Why can't the Valid constraint be executed directly?
                //
                // It cannot be executed like regular other constraints, because regular
                // constraints are only executed *if they belong to the validated group*.
                // The Valid constraint, on the other hand, is always executed and propagates
                // the group to the cascaded object. The propagated group depends on
                //
                //  * Whether a group sequence is currently being executed. Then the default
                //    group is propagated.
                //
                //  * Otherwise the validated group is propagated.

                throw new ValidatorException(
                    sprintf(
                        'The constraint %s cannot be validated. Use the method validate() instead.',
                        get_class($constraint)
                    )
                );
            }

            $context->validateValue($value, $constraint, '', $groups);
        }

        return $context->getViolations();
    }

    /**
     * @param mixed $root
     *
     * @return ValidationVisitor
     */
    private function createVisitor($root)
    {
        return new ValidationVisitor(
            $root,
            $this->metadataFactory,
            $this->validatorFactory,
            $this->translator,
            $this->translationDomain,
            $this->objectInitializers
        );
    }

    /**
     * @param null|string|string[] $groups
     *
     * @return string[]
     */
    private function resolveGroups($groups)
    {
        return $groups ? (array) $groups : array(Constraint::DEFAULT_GROUP);
    }
}
PKa�\S�b'b'5pear/Symfony/Component/Validator/ValidatorBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
use Symfony\Component\Validator\Exception\ValidatorException;
use Symfony\Component\Validator\Mapping\Loader\LoaderChain;
use Symfony\Component\Validator\Mapping\Cache\CacheInterface;
use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader;
use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader;
use Symfony\Component\Validator\Mapping\Loader\YamlFilesLoader;
use Symfony\Component\Validator\Mapping\Loader\XmlFileLoader;
use Symfony\Component\Validator\Mapping\Loader\XmlFilesLoader;
use Symfony\Component\Translation\TranslatorInterface;
use Doctrine\Common\Annotations\Reader;
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\CachedReader;
use Doctrine\Common\Cache\ArrayCache;

/**
 * The default implementation of {@link ValidatorBuilderInterface}.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ValidatorBuilder implements ValidatorBuilderInterface
{
    /**
     * @var array
     */
    private $initializers = array();

    /**
     * @var array
     */
    private $xmlMappings = array();

    /**
     * @var array
     */
    private $yamlMappings = array();

    /**
     * @var array
     */
    private $methodMappings = array();

    /**
     * @var Reader
     */
    private $annotationReader = null;

    /**
     * @var MetadataFactoryInterface
     */
    private $metadataFactory;

    /**
     * @var ConstraintValidatorFactoryInterface
     */
    private $validatorFactory;

    /**
     * @var CacheInterface
     */
    private $metadataCache;

    /**
     * @var TranslatorInterface
     */
    private $translator;

    /**
     * @var null|string
     */
    private $translationDomain;

    /**
     * @var PropertyAccessorInterface
     */
    private $propertyAccessor;

    /**
     * {@inheritdoc}
     */
    public function addObjectInitializer(ObjectInitializerInterface $initializer)
    {
        $this->initializers[] = $initializer;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addObjectInitializers(array $initializers)
    {
        $this->initializers = array_merge($this->initializers, $initializers);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addXmlMapping($path)
    {
        if (null !== $this->metadataFactory) {
            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
        }

        $this->xmlMappings[] = $path;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addXmlMappings(array $paths)
    {
        if (null !== $this->metadataFactory) {
            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
        }

        $this->xmlMappings = array_merge($this->xmlMappings, $paths);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addYamlMapping($path)
    {
        if (null !== $this->metadataFactory) {
            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
        }

        $this->yamlMappings[] = $path;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addYamlMappings(array $paths)
    {
        if (null !== $this->metadataFactory) {
            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
        }

        $this->yamlMappings = array_merge($this->yamlMappings, $paths);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addMethodMapping($methodName)
    {
        if (null !== $this->metadataFactory) {
            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
        }

        $this->methodMappings[] = $methodName;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function addMethodMappings(array $methodNames)
    {
        if (null !== $this->metadataFactory) {
            throw new ValidatorException('You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.');
        }

        $this->methodMappings = array_merge($this->methodMappings, $methodNames);

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function enableAnnotationMapping(Reader $annotationReader = null)
    {
        if (null !== $this->metadataFactory) {
            throw new ValidatorException('You cannot enable annotation mapping after setting a custom metadata factory. Configure your metadata factory instead.');
        }

        if (null === $annotationReader) {
            if (!class_exists('Doctrine\Common\Annotations\AnnotationReader') || !class_exists('Doctrine\Common\Cache\ArrayCache')) {
                throw new \RuntimeException('Enabling annotation based constraint mapping requires the packages doctrine/annotations and doctrine/cache to be installed.');
            }

            $annotationReader = new CachedReader(new AnnotationReader(), new ArrayCache());
        }

        $this->annotationReader = $annotationReader;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function disableAnnotationMapping()
    {
        $this->annotationReader = null;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setMetadataFactory(MetadataFactoryInterface $metadataFactory)
    {
        if (count($this->xmlMappings) > 0 || count($this->yamlMappings) > 0 || count($this->methodMappings) > 0 || null !== $this->annotationReader) {
            throw new ValidatorException('You cannot set a custom metadata factory after adding custom mappings. You should do either of both.');
        }

        $this->metadataFactory = $metadataFactory;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setMetadataCache(CacheInterface $cache)
    {
        if (null !== $this->metadataFactory) {
            throw new ValidatorException('You cannot set a custom metadata cache after setting a custom metadata factory. Configure your metadata factory instead.');
        }

        $this->metadataCache = $cache;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setConstraintValidatorFactory(ConstraintValidatorFactoryInterface $validatorFactory)
    {
        if (null !== $this->propertyAccessor) {
            throw new ValidatorException('You cannot set a validator factory after setting a custom property accessor. Remove the call to setPropertyAccessor() if you want to call setConstraintValidatorFactory().');
        }

        $this->validatorFactory = $validatorFactory;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setTranslator(TranslatorInterface $translator)
    {
        $this->translator = $translator;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setTranslationDomain($translationDomain)
    {
        $this->translationDomain = $translationDomain;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function setPropertyAccessor(PropertyAccessorInterface $propertyAccessor)
    {
        if (null !== $this->validatorFactory) {
            throw new ValidatorException('You cannot set a property accessor after setting a custom validator factory. Configure your validator factory instead.');
        }

        $this->propertyAccessor = $propertyAccessor;

        return $this;
    }

    /**
     * {@inheritdoc}
     */
    public function getValidator()
    {
        $metadataFactory = $this->metadataFactory;

        if (!$metadataFactory) {
            $loaders = array();

            if (count($this->xmlMappings) > 1) {
                $loaders[] = new XmlFilesLoader($this->xmlMappings);
            } elseif (1 === count($this->xmlMappings)) {
                $loaders[] = new XmlFileLoader($this->xmlMappings[0]);
            }

            if (count($this->yamlMappings) > 1) {
                $loaders[] = new YamlFilesLoader($this->yamlMappings);
            } elseif (1 === count($this->yamlMappings)) {
                $loaders[] = new YamlFileLoader($this->yamlMappings[0]);
            }

            foreach ($this->methodMappings as $methodName) {
                $loaders[] = new StaticMethodLoader($methodName);
            }

            if ($this->annotationReader) {
                $loaders[] = new AnnotationLoader($this->annotationReader);
            }

            $loader = null;

            if (count($loaders) > 1) {
                $loader = new LoaderChain($loaders);
            } elseif (1 === count($loaders)) {
                $loader = $loaders[0];
            }

            $metadataFactory = new ClassMetadataFactory($loader, $this->metadataCache);
        }

        $propertyAccessor = $this->propertyAccessor ?: PropertyAccess::createPropertyAccessor();
        $validatorFactory = $this->validatorFactory ?: new ConstraintValidatorFactory($propertyAccessor);
        $translator = $this->translator ?: new DefaultTranslator();

        return new Validator($metadataFactory, $validatorFactory, $translator, $this->translationDomain, $this->initializers);
    }
}
PKa�\n�r�
�
7pear/Symfony/Component/Validator/ValidatorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Validates values and graphs of objects and arrays.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
interface ValidatorInterface
{
    /**
     * Validates a value.
     *
     * The accepted values depend on the {@link MetadataFactoryInterface}
     * implementation.
     *
     * @param mixed      $value    The value to validate
     * @param array|null $groups   The validation groups to validate.
     * @param Boolean    $traverse Whether to traverse the value if it is traversable.
     * @param Boolean    $deep     Whether to traverse nested traversable values recursively.
     *
     * @return ConstraintViolationListInterface A list of constraint violations. If the
     *                                          list is empty, validation succeeded.
     *
     * @api
     */
    public function validate($value, $groups = null, $traverse = false, $deep = false);

    /**
     * Validates a property of a value against its current value.
     *
     * The accepted values depend on the {@link MetadataFactoryInterface}
     * implementation.
     *
     * @param mixed      $containingValue The value containing the property.
     * @param string     $property        The name of the property to validate.
     * @param array|null $groups          The validation groups to validate.
     *
     * @return ConstraintViolationListInterface A list of constraint violations. If the
     *                                          list is empty, validation succeeded.
     *
     * @api
     */
    public function validateProperty($containingValue, $property, $groups = null);

    /**
     * Validate a property of a value against a potential value.
     *
     * The accepted values depend on the {@link MetadataFactoryInterface}
     * implementation.
     *
     * @param string     $containingValue The value containing the property.
     * @param string     $property        The name of the property to validate
     * @param string     $value           The value to validate against the
     *                                    constraints of the property.
     * @param array|null $groups          The validation groups to validate.
     *
     * @return ConstraintViolationListInterface A list of constraint violations. If the
     *                                          list is empty, validation succeeded.
     *
     * @api
     */
    public function validatePropertyValue($containingValue, $property, $value, $groups = null);

    /**
     * Validates a value against a constraint or a list of constraints.
     *
     * @param mixed                   $value       The value to validate.
     * @param Constraint|Constraint[] $constraints The constraint(s) to validate against.
     * @param array|null              $groups      The validation groups to validate.
     *
     * @return ConstraintViolationListInterface A list of constraint violations. If the
     *                                          list is empty, validation succeeded.
     *
     * @api
     */
    public function validateValue($value, $constraints, $groups = null);

    /**
     * Returns the factory for metadata instances.
     *
     * @return MetadataFactoryInterface The metadata factory.
     *
     * @api
     */
    public function getMetadataFactory();
}
PKa�\1ar�==Lpear/Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>該變數的值應為 false 。</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>該變數的值應為 true 。</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>該變數的類型應為 {{ type }} 。</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>該變數應為空。</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>選定變數的值不是有效的選項。</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>您至少要選擇 {{ limit }} 個選項。</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>您最多能選擇 {{ limit }} 個選項。</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>一個或者多個給定的值無效。</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>非預期的欄位 {{ fields }} 。</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>缺少的欄位 {{ fields }} 。</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>該值不是一個有效的日期(date)。</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>該值不是一個有效的日期時間(datetime)。</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>該值不是一個有效的郵件地址。</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>找不到檔案。</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>無法讀取檔案。</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>檔案太大 ({{ size }} {{ suffix }})。檔案大小不可以超過 {{ limit }} {{ suffix }} 。</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>無效的檔案類型 ({{ type }}) 。允許的檔案類型有 {{ types }} 。</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>這個變數的值應該小於或等於 {{ limit }}。</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>字串太長,長度不可超過 {{ limit }} 個字元。</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>該變數的值應該大於或等於 {{ limit }}。</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>字串太短,長度不可少於 {{ limit }} 個字元。</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>該變數不應為空白。</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>該值不應為 null 。</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>該值應為 null 。</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>無效的數值 。</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>該值不是一個有效的時間。</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>該值不是一個有效的 URL 。</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>這兩個變數的值應該相等。</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>檔案太大,檔案大小不可以超過 {{ limit }} {{ suffix }}。 </target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>檔案太大。</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>無法上傳此檔案。</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>該值應該為有效的數字。</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This value is not a valid country.</source>
                <target>該值不是有效的國家名。</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This file is not a valid image.</source>
                <target>該檔案不是有效的圖片。</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This is not a valid IP address.</source>
                <target>該值不是有效的IP地址。</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid language.</source>
                <target>該值不是有效的語言名。</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid locale.</source>
                <target>該值不是有效的區域值(locale)。</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>該值已經被使用。</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>不能解析圖片大小。</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>圖片太寬 ({{ width }}px),最大寬度為 {{ max_width }}px 。</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>圖片寬度不夠 ({{ width }}px),最小寬度為 {{ min_width }}px 。</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>圖片太高 ({{ height }}px),最大高度為 {{ max_height }}px 。</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>圖片高度不夠 ({{ height }}px),最小高度為 {{ min_height }}px 。</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>該變數的值應為用戶目前的密碼。</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>該變數應為 {{ limit }} 個字元。</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>該檔案的上傳不完整。</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>沒有上傳任何檔案。</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>php.ini 裡沒有配置臨時目錄。</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>暫存檔寫入磁碟失敗。</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>某個 PHP 擴展造成上傳失敗。</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>該集合最少應包含 {{ limit }} 個元素。</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>該集合最多包含 {{ limit }} 個元素。</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>該集合應包含 {{ limit }} 個元素 element 。</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>無效的信用卡號。</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>不支援的信用卡類型或無效的信用卡號。</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>該值不是有效的國際銀行帳號(IBAN)。</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>該值不是有效的10位國際標準書號(ISBN-10)。</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>該值不是有效的13位國際標準書號(ISBN-13)。</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>該值不是有效的國際標準書號(ISBN-10 或 ISBN-13)。</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>該值不是有效的國際標準期刊號(ISSN)。</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>該值不是有效的貨幣名(currency)。</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>該值應等於 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>該值應大於 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>該值應大於或等於 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>該值應與 {{ compared_value_type }} {{ compared_value }} 相同。</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>該值應小於 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>該值應小於或等於 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>該值應不等於 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>該值不應與 {{ compared_value_type }} {{ compared_value }} 相同。</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\���wX@X@Ipear/Symfony/Component/Validator/Resources/translations/validators.hr.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Ova vrijednost treba biti netočna (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Ova vrijednost treba biti točna (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Ova vrijednost treba biti tipa {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Ova vrijednost treba biti prazna.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Ova vrijednost treba biti jedna od ponuđenih.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Izaberite barem {{ limit }} mogućnosti.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Izaberite najviše {{ limit }} mogućnosti.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Jedna ili više danih vrijednosti nije ispravna.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Polja {{ fields }} nisu bila očekivana.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Polja {{ fields }} nedostaju.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ova vrijednost nije ispravan datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ova vrijednost nije ispravan datum-vrijeme.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ova vrijednost nije ispravna e-mail adresa.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Datoteka ne može biti pronađena.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Datoteka nije čitljiva.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Datoteka je prevelika ({{ size }} {{ suffix }}). Najveća dozvoljena veličina je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mime tip datoteke nije ispravan ({{ type }}). Dozvoljeni mime tipovi su {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Ova vrijednost treba biti {{ limit }} ili manje.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Ova vrijednost je predugačka. Treba imati {{ limit }} znakova ili manje.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Ova vrijednost treba biti {{ limit }} ili više.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Ova vrijednost je prekratka. Treba imati {{ limit }} znakova ili više.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ova vrijednost ne smije biti prazna.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ova vrijednost ne smije biti null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ova vrijednost treba biti null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Ova vrijednost nije ispravna.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ova vrijednost nije ispravno vrijeme.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ova vrijednost nije ispravan URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Obje vrijednosti trebaju biti jednake.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ova datoteka je prevelika. Najveća dozvoljena veličina je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Ova datoteka je prevelika.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Ova datoteka ne može biti prenesena.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ova vrijednost treba biti ispravan broj.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ova datoteka nije ispravna slika.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Ovo nije ispravna IP adresa.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ova vrijednost nije ispravan jezik.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ova vrijednost nije ispravana regionalna oznaka.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ova vrijednost nije ispravna zemlja.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ova vrijednost je već iskorištena.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Veličina slike se ne može odrediti.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Širina slike je prevelika ({{ width }}px). Najveća dozvoljena širina je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Širina slike je premala ({{ width }}px). Najmanja dozvoljena širina je {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Visina slike je prevelika ({{ height }}px). Najveća dozvoljena visina je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Visina slike je premala ({{ height }}px). Najmanja dozvoljena visina je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Ova vrijednost treba biti trenutna korisnička lozinka.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ova vrijednost treba imati točno {{ limit }} znakova.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Datoteka je samo djelomično prenesena.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Niti jedna datoteka nije prenesena.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>U php.ini datoteci nije konfiguriran privremeni folder.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Ne mogu zapisati privremenu datoteku na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Prijenos datoteke nije uspio zbog PHP ekstenzije.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ova kolekcija treba sadržavati {{ limit }} ili više elemenata.|Ova kolekcija treba sadržavati {{ limit }} ili više elemenata.|Ova kolekcija treba sadržavati {{ limit }} ili više elemenata.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ova kolekcija treba sadržavati {{ limit }} ili manje elemenata.|Ova kolekcija treba sadržavati {{ limit }} ili manje elemenata.|Ova kolekcija treba sadržavati {{ limit }} ili manje elemenata.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ova kolekcija treba sadržavati točno {{ limit }} element.|Ova kolekcija treba sadržavati točno {{ limit }} elementa.|Ova kolekcija treba sadržavati točno {{ limit }} elemenata.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Neispravan broj kartice.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Neispravan broj kartice ili tip kartice nije podržan.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Ova vrijednost nije ispravan međunarodni broj bankovnog računa (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ova vrijednost nije ispravan ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ova vrijednost nije ispravan ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ova vrijednost nije ispravan ISBN-10 niti ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ova vrijednost nije ispravan ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ova vrijednost nije ispravna valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebala biti jednaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebala biti veća od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebala biti veća ili jednaka od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebala biti {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebala biti manja od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ova vrijednost bi trebala biti manja ili jednaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ova vrijednost ne bi trebala biti {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ova vrijednost ne bi trebala biti {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\
��GGIpear/Symfony/Component/Validator/Resources/translations/validators.fa.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target state="needs-review-translation">این مقدار باید نادرست(False) باشد.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>این مقدار باید درست(True) باشد.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>این مقدار باید از نوع {{ type }} باشد.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>این فیلد باید خالی باشد.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>گزینه انتخابی معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>باید حداقل {{ limit }} گزینه انتخاب کنید.|باید حداقل {{ limit }} گزینه انتخاب کنید.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>حداکثر {{ limit }} گزینه می توانید انتخاب کنید.|حداکثر {{ limit }} گزینه می توانید انتخاب کنید.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>یک یا چند مقدار نامعتبر وجود دارد.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>فیلدهای {{ fields }} اضافی هستند.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>فیلدهای {{ fields }} کم هستند.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>این مقدار یک تاریخ معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>این مقدار یک تاریخ و زمان معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>این یک رایانامه معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>فایل پیدا نشد.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>فایل قابلیت خواندن ندارد.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>فایل بیش از اندازه بزرگ است({{ size }} {{ suffix }}). حداکثر اندازه مجاز برابر {{ limit }} {{ suffix }} است.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>این نوع فایل مجاز نیست({{ type }}). نوع های مجاز {{ types }} هستند.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>این مقدار باید کوچکتر یا مساوی {{ limit }} باشد.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>بسیار طولانی است.حداکثر تعداد حروف مجاز برابر {{ limit }} است.|بسیار طولانی است.حداکثر تعداد حروف مجاز برابر {{ limit }} است.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>این مقدار باید برابر و یا بیشتر از {{ limit }} باشد.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>بسیار کوتاه است.تعداد حروف باید حداقل {{ limit }} باشد.|بسیار کوتاه است.تعداد حروف باید حداقل {{ limit }} باشد.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>این مقدار نباید تهی باشد.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>باید مقداری داشته باشد..</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>نباید مقداری داشته باشد.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>این مقدار معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>این مقدار یک زمان صحیح نیست.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>این یک URL معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>دو مقدار باید برابر باشند.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>فایل بیش از اندازه بزرگ است. حداکثر اندازه مجاز برابر {{ limit }} {{ suffix }} است.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>فایل بیش از اندازه بزرگ است.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>بارگذاری فایل با شکست مواجه شد.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>این مقدار باید یک عدد معتبر باشد.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>این فایل یک تصویر نیست.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>این مقدار یک IP معتبر نیست.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>این مقدار یک زبان صحیح نیست.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>این مقدار یک محل صحیح نیست.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>این مقدار یک کشور صحیح نیست.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>این مقدار قبلا مورد استفاده قرار گرفته است.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>اندازه تصویر قابل شناسایی نیست.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>طول تصویر بسیار بزرگ است ({{ width }}px). بشینه طول مجاز {{ max_width }}px است.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>طول تصویر بسیار کوچک است ({{ width }}px). کمینه طول موردنظر {{ min_width }}px است.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>ارتفاع تصویر بسیار بزرگ است ({{ height }}px). بشینه ارتفاع مجاز {{ max_height }}px است.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>ارتفاع تصویر بسیار کوچک است ({{ height }}px). کمینه ارتفاع موردنظر {{ min_height }}px است.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>این مقدار می بایست کلمه عبور کنونی کاربر باشد.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>این مقدار می بایست دقیفا {{ limit }} کاراکتر داشته باشد.|این مقدرا می بایشت دقیقا {{ limit }} کاراکتر داشته باشد.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>فایل به صورت جزیی بارگذاری شده است.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>هیچ فایلی بارگذاری نشد.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>فولدر موقت در php.ini پیکربندی نشده است.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>فایل موقت را نمی توان در دیسک نوشت.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>اکستنشن PHP موجب شد که بارگذاری فایل با شکست مواجه شود.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>این مجموعه می بایست دارای {{ limit }} عنصر یا بیشتر باشد.|این مجموعه می بایست دارای {{ limit }} عنصر یا بیشتر باشد.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>این مجموعه می بایست دارای حداقل {{ limit }} عنصر یا کمتر باشد.|این مجموعه می بایست دارای {{ limit }} عنصر یا کمتر باشد.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>این مجموعه می بایست به طور دقیق دارا {{ limit }} عنصر باشد.|این مجموعه می بایست به طور دقیق دارای {{ limit }} قلم باشد.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>شماره کارت نامعتبر است.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>نوع کارت پشتیبانی نمی شود یا شماره کارت نامعتبر است.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>این یک شماره حساب بین المللی بانک (IBAN) درست نیست.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>این مقدار یک ISBN-10 درست نیست.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>این مقدار یک ISBN-13 درست نیست.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>این مقدار یک ISBN-10 درست یا ISBN-13 درست نیست.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>این مقدار یک ISSN درست نیست.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>این مقدار یک یکای پول درست نیست.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>این مقدار باید برابر با {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>این مقدار باید از {{ compared_value }} بیشتر باشد.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>این مقدار باید بزرگتر یا مساوی با {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>این مقدار باید با {{ compared_value_type }} {{ compared_value }} یکی باشد.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>این مقدار باید کمتر از {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>این مقدار باید کمتر یا مساوی با {{ compared_value }} باشد.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>این مقدار نباید با {{ compared_value }} برابر باشد.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>این مقدار نباید {{ compared_value_type }} {{ compared_value }} یکی باشد.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\v_��w,w,Ipear/Symfony/Component/Validator/Resources/translations/validators.hy.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Արժեքը պետք է լինի կեղծ.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Արժեքը պետք է լինի ճշմարիտ.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Արժեքը պետք է լինի {{ type }} տեսակի.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Արժեքը պետք է լինի դատարկ.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Ձեր ընտրած արժեքը անթույլատրելի է.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Դուք պետք է ընտրեք ամենաքիչը {{ limit }} տարբերակներ.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Դուք պետք է ընտրեք ոչ ավելի քան {{ limit }} տարբերակներ.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Մեկ կամ ավելի տրված արժեքները անթույլատրելի են.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>{{ fields }} տողերը չէին սպասվում.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>{{ fields }} տողերը բացակայում են.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Արժեքը սխալ ամսաթիվ է.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ամսաթվի և ժամանակի արժեքը անթույլատրելի է.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Էլ-փոստի արժեքը անթույլատրելի է.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Ֆայլը չի գտնվել.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Ֆայլը անընթեռնելի է.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ֆայլը չափազանց մեծ է ({{ size }} {{ suffix }}): Մաքսիմալ թույլատրելի չափսը՝ {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>MIME-տեսակը անթույլատրելի է({{ type }}): Ֆայլերի թույլատրելի MIME-տեսակներն են: {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Արժեքը պետք է լինի {{ limit }} կամ փոքր.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Արժեքը չափազանց երկար է: Պետք է լինի {{ limit }} կամ ավել սիմվոլներ.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Արժեքը պետ է լինի {{ limit }} կամ շատ.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Արժեքը չափազանց կարճ է: Պետք է լինի {{ limit }} կամ ավելի սիմվոլներ.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Արժեքը չպետք է դատարկ լինի.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Արժեքը չպետք է լինի null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Արժեքը պետք է լինի null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Անթույլատրելի արժեք.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ժամանակի արժեքը անթույլատրելի է.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Արժեքը  URL  չէ.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Երկու արժեքները պետք է նույնը լինեն.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ֆայլը չափազանց մեծ է: Մաքսիմալ թույլատրելի չափսը {{ limit }} {{ suffix }} է.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Ֆայլը չափազանց մեծ է.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Ֆայլը չի կարող բեռնվել.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Արժեքը պետք է լինի թիվ.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This value is not a valid country.</source>
                <target>Արժեքը պետք է լինի երկիր.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This file is not a valid image.</source>
                <target>Ֆայլը նկարի թույլատրելի ֆորմատ չէ.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This is not a valid IP address.</source>
                <target>Արժեքը թույլատրելի IP հասցե չէ.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid language.</source>
                <target>Արժեքը թույլատրելի լեզու չէ.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid locale.</source>
                <target>Արժեքը չի հանդիսանում թույլատրելի տեղայնացում.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Այդ արժեքը արդեն օգտագործվում է.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Նկարի չափսերը չստացվեց որոշել.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Նկարի լայնությունը չափազանց մեծ է({{ width }}px). Մաքսիմալ չափն է {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Նկարի լայնությունը չափազանց փոքր է ({{ width }}px). Մինիմալ չափն է {{ min_ width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Նկարի բարձրությունը չափազանց մեծ է ({{ height }}px). Մաքսիմալ չափն է {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Նկարի բարձրությունը չափազանց փոքր է ({{ height }}px). Մինիմալ չափն է {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Այս արժեքը պետք է լինի օգտագործողի ներկա ծածկագիրը.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Այս արժեքը պետք է ունենա ճիշտ {{ limit }} սիմվոլներ.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\�%�N�=�=Ipear/Symfony/Component/Validator/Resources/translations/validators.et.xlfnu�[���<?xml version='1.0'?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Väärtus peaks olema väär.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Väärtus peaks oleme tõene.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Väärtus peaks olema {{ type }}-tüüpi.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Väärtus peaks olema tühi.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Väärtus peaks olema üks etteantud valikutest.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Valima peaks vähemalt {{ limit }} valikut.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Valima peaks mitte rohkem kui  {{ limit }} valikut.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>One or more of the given values is invalid.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Väljad {{ fields }} olid ootamatud.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Väljad {{ fields }} on puudu.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Väärtus pole korrektne kuupäev.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Väärtus pole korrektne kuupäev ja kellaeg.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Väärtus pole korrektne e-maili aadress.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Faili ei leita.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fail ei ole loetav.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fail on liiga suur ({{ size }} {{ suffix }}). Suurim lubatud suurus on {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Faili sisutüüp on vigane ({{ type }}). Lubatud sisutüübid on {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Väärtus peaks olema {{ limit }} või vähem.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Väärtus on liiga pikk. Pikkus peaks olema {{ limit }} tähemärki või vähem.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Väärtus peaks olema {{ limit }} või rohkem.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Väärtus on liiga lühike. Pikkus peaks  olema {{ limit }} tähemärki või rohkem.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Väärtus ei tohiks olla tühi.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Väärtus ei tohiks olla 'null'.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Väärtus peaks olema 'null'.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Väärtus on vigane.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Väärtus pole korrektne aeg.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Väärtus pole korrektne URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Väärtused peaksid olema võrdsed.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fail on liiga suur. Maksimaalne lubatud suurus on {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fail on liiga suur.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Faili ei saa üles laadida.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Väärtus peaks olema korrektne number.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Fail ei ole korrektne pilt.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>IP aadress pole korrektne.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Väärtus pole korrektne keel.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Väärtus pole korrektne asukohakeel.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Väärtus pole olemasolev riik.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Väärtust on juba kasutatud.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Pildi suurust polnud võimalik tuvastada.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Pilt on liiga lai ({{ width }}px). Suurim lubatud laius on {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Pilt on liiga kitsas ({{ width }}px). Vähim lubatud laius on {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Pilt on liiga pikk ({{ height }}px). Lubatud suurim pikkus on {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Pilt pole piisavalt pikk ({{ height }}px). Lubatud vähim pikkus on {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Väärtus peaks olema kasutaja kehtiv salasõna.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} characters.</source>
                <target>Väärtus peaks olema täpselt {{ limit }} tähemärk pikk.|Väärtus peaks olema täpselt {{ limit }} tähemärki pikk.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fail ei laetud täielikult üles.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ühtegi faili ei laetud üles.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Ühtegi ajutist kausta polnud php.ini-s seadistatud.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Ajutist faili ei saa kettale kirjutada.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP laiendi tõttu ebaõnnestus faili üleslaadimine.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} elements or more.</source>
                <target>Kogumikus peaks olema vähemalt {{ limit }} element.|Kogumikus peaks olema vähemalt {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} elements or less.</source>
                <target>Kogumikus peaks olema ülimalt {{ limit }} element.|Kogumikus peaks olema ülimalt {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} elements.</source>
                <target>Kogumikus peaks olema täpselt {{ limit }} element.|Kogumikus peaks olema täpselt {{ limit }}|elementi.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Vigane kaardi number.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Kaardi tüüpi ei toetata või kaardi number on vigane.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Väärtus pole korrektne IBAN-number.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Väärtus pole korrektne ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Väärtus pole korrektne ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Väärtus pole korrektne ISBN-10 ega ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Väärtus pole korrektne ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Väärtus pole korrektne valuuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Väärtus peaks olema võrdne {{ compared_value }}-ga.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Väärtus peaks olema suurem kui {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Väärtus peaks olema suurem kui või võrduma {{ compared_value }}-ga.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Väärtus peaks olema identne väärtusega {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Väärtus peaks olema väiksem kui {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Väärtus peaks olema väiksem kui või võrduma {{ compared_value }}-ga.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Väärtus ei tohiks võrduda {{ compared_value }}-ga.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Väärtus ei tohiks olla identne väärtusega {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\��n�C�CIpear/Symfony/Component/Validator/Resources/translations/validators.sl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Vrednost bi morala biti nepravilna (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Vrednost bi morala biti pravilna (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Vrednost mora biti naslednjega tipa {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Vrednost mora biti prazna.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Vrednost, ki ste jo izbrali, ni veljavna možnost.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Izbrati morate vsaj {{ limit }} možnost.|Izbrati morate vsaj {{ limit }} možnosti.|Izbrati morate vsaj {{ limit }} možnosti.|Izbrati morate vsaj {{ limit }} možnosti.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Izberete lahko največ {{ limit }} možnost.|Izberete lahko največ {{ limit }} možnosti.|Izberete lahko največ {{ limit }} možnosti.|Izberete lahko največ {{ limit }} možnosti.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Ena ali več podanih vrednosti ni veljavnih.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Polja {{ fields }} niso bila pričakovana.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Polja {{ fields }} manjkajo.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ta vrednost ni veljaven datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ta vrednost ni veljaven datum in čas.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ta vrednost ni veljaven e-poštni naslov.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Datoteke ni mogoče najti.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Datoteke ni mogoče prebrati.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Datoteka je prevelika ({{ size }} {{ suffix }}). Največja dovoljena velikost je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mime tip datoteke je neveljaven ({{ type }}). Dovoljeni mime tipi so {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Ta vrednost bi morala biti {{ limit }} ali manj.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Ta vrednost je predolga. Morala bi imeti {{ limit }} znak ali manj.|Ta vrednost je predolga. Morala bi imeti {{ limit }} znaka ali manj.|Ta vrednost je predolga. Morala bi imeti {{ limit }} znake ali manj.|Ta vrednost je predolga. Morala bi imeti {{ limit }} znakov ali manj.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Ta vrednost bi morala biti {{ limit }} ali več.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Ta vrednost je prekratka. Morala bi imeti {{ limit }} znak ali več.|Ta vrednost je prekratka. Morala bi imeti {{ limit }} znaka ali več.|Ta vrednost je prekratka. Morala bi imeti {{ limit }} znake ali več.|Ta vrednost je prekratka. Morala bi imeti {{ limit }} znakov ali več.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ta vrednost ne bi smela biti prazna.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ta vrednost ne bi smela biti nedefinirana (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ta vrednost bi morala biti nedefinirana (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Ta vrednost ni veljavna.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ta vrednost ni veljaven čas.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ta vrednost ni veljaven URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Ti dve vrednosti bi morali biti enaki.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Datoteka je prevelika. Največja dovoljena velikost je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Datoteka je prevelika.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Datoteke ni bilo mogoče naložiti.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ta vrednost bi morala biti veljavna številka.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ta datoteka ni veljavna slika.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>To ni veljaven IP naslov.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ta vrednost ni veljaven jezik.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ta vrednost ni veljavna lokalnost.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ta vrednost ni veljavna država.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ta vrednost je že uporabljena.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Velikosti slike ni bilo mogoče zaznati.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Širina slike je preširoka ({{ width }}px). Največja dovoljena širina je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Širina slike je premajhna ({{ width }}px). Najmanjša predvidena širina je {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Višina slike je prevelika ({{ height }}px). Največja dovoljena višina je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Višina slike je premajhna ({{ height }}px). Najmanjša predvidena višina je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Ta vrednost bi morala biti trenutno uporabnikovo geslo.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ta vrednost bi morala imeti točno {{ limit }} znak.|Ta vrednost bi morala imeti točno {{ limit }} znaka.|Ta vrednost bi morala imeti točno {{ limit }} znake.|Ta vrednost bi morala imeti točno {{ limit }} znakov.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Datoteka je bila le delno naložena.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nobena datoteka ni bila naložena.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Začasna mapa ni nastavljena v php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Začasne datoteke ni bilo mogoče zapisati na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP razširitev je vzrok, da nalaganje ni uspelo.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ta zbirka bi morala vsebovati {{ limit }} element ali več.|Ta zbirka bi morala vsebovati {{ limit }} elementa ali več.|Ta zbirka bi morala vsebovati {{ limit }} elemente ali več.|Ta zbirka bi morala vsebovati {{ limit }} elementov ali več.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ta zbirka bi morala vsebovati {{ limit }} element ali manj.|Ta zbirka bi morala vsebovati {{ limit }} elementa ali manj.|Ta zbirka bi morala vsebovati {{ limit }} elemente ali manj.|Ta zbirka bi morala vsebovati {{ limit }} elementov ali manj.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ta zbirka bi morala vsebovati točno {{ limit }} element.|Ta zbirka bi morala vsebovati točno {{ limit }} elementa.|Ta zbirka bi morala vsebovati točno {{ limit }} elemente.|Ta zbirka bi morala vsebovati točno {{ limit }} elementov.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Neveljavna številka kartice.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nepodprti tip kartice ali neveljavna številka kartice.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>To ni veljavna mednarodna številka bančnega računa (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Neveljavna vrednost po ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Neveljavna vrednost po ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Neveljavna vrednost po ISBN-10 ali po ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Neveljavna vrednost ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ta vrednost ni veljavna valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti enaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti večja od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti večja ali enaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti identična {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti manjša od {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ta vrednost bi morala biti manjša ali enaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ta vrednost ne bi smela biti enaka {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ta vrednost ne bi smela biti identična {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\D#��?�?Ipear/Symfony/Component/Validator/Resources/translations/validators.en.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>This value should be false.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>This value should be true.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>This value should be of type {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>This value should be blank.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>The value you selected is not a valid choice.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>One or more of the given values is invalid.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>The fields {{ fields }} were not expected.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>The fields {{ fields }} are missing.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>This value is not a valid date.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>This value is not a valid datetime.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>This value is not a valid email address.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>The file could not be found.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>The file is not readable.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>This value should be {{ limit }} or less.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>This value should be {{ limit }} or more.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>This value should not be blank.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>This value should not be null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>This value should be null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>This value is not valid.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>This value is not a valid time.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>This value is not a valid URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>The two values should be equal.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>The file is too large.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>The file could not be uploaded.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>This value should be a valid number.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>This file is not a valid image.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>This is not a valid IP address.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>This value is not a valid language.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>This value is not a valid locale.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>This value is not a valid country.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>This value is already used.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>The size of the image could not be detected.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>This value should be the user current password.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>The file was only partially uploaded.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>No file was uploaded.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>No temporary folder was configured in php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Cannot write temporary file to disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>A PHP extension caused the upload to fail.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Invalid card number.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Unsupported card type or invalid card number.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>This is not a valid International Bank Account Number (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>This value is not a valid ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>This value is not a valid ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>This value is neither a valid ISBN-10 nor a valid ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>This value is not a valid ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>This value is not a valid currency.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>This value should be equal to {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>This value should be greater than {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>This value should be greater than or equal to {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>This value should be less than {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>This value should be less than or equal to {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>This value should not be equal to {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\	���AAIpear/Symfony/Component/Validator/Resources/translations/validators.ca.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Aquest valor hauria de ser fals.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Aquest valor hauria de ser cert.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Aquest valor hauria de ser del tipus {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Aquest valor hauria d'estar buit.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>El valor seleccionat no és una opció vàlida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Ha de seleccionar almenys {{ limit }} opció.|Ha de seleccionar almenys {{ limit }} opcions.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Ha de seleccionar com a màxim {{ limit }} opció.|Ha de seleccionar com a màxim {{ limit }} opcions.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Un o més dels valors facilitats són incorrectes.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>No s'esperaven els camps {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Falten els camps {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Aquest valor no és una data vàlida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Aquest valor no és una data i hora vàlida.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Aquest valor no és una adreça d'email vàlida.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>No s'ha pogut trobar l'arxiu.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>No es pot llegir l'arxiu.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>L'arxiu és massa gran ({{ size }} {{ suffix }}). La grandària màxima permesa és {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>El tipus mime de l'arxiu no és vàlid ({{ type }}). Els tipus mime vàlids són {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Aquest valor hauria de ser {{ limit }} o menys.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Aquest valor és massa llarg. Hauria de tenir {{ limit }} caràcter o menys.|Aquest valor és massa llarg. Hauria de tenir {{ limit }} caràcters o menys.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Aquest valor hauria de ser {{ limit }} o més.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Aquest valor és massa curt. Hauria de tenir {{ limit }} caràcters o més.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Aquest valor no hauria d'estar buit.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Aquest valor no hauria de ser null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Aquest valor hauria de ser null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Aquest valor no és vàlid.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Aquest valor no és una hora vàlida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Aquest valor no és una URL vàlida.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Els dos valors haurien de ser iguals.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>L'arxiu és massa gran. El tamany màxim permés és {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>L'arxiu és massa gran.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>No es pot pujar l'arxiu.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Aquest valor hauria de ser un nombre vàlid.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>L'arxiu no és una imatge vàlida.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Això no és una adreça IP vàlida.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Aquest valor no és un idioma vàlid.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Aquest valor no és una localització vàlida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Aquest valor no és un país vàlid.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Aquest valor ja s'ha utilitzat.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>No s'ha pogut determinar la grandària de la imatge.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>L'amplària de la imatge és massa gran ({{ width }}px). L'amplària màxima permesa són {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>L'amplària de la imatge és massa petita ({{ width }}px). L'amplària mínima requerida són {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>L'altura de la imatge és massa gran ({{ height }}px). L'altura màxima permesa són {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>L'altura de la imatge és massa petita ({{ height }}px). L'altura mínima requerida són {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Aquest valor hauria de ser la contrasenya actual de l'usuari.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Aquest valor hauria de tenir exactament {{ limit }} caràcter.|Aquest valor hauria de tenir exactament {{ limit }} caràcters.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>L'arxiu va ser només pujat parcialment.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Cap arxiu va ser pujat.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Cap carpeta temporal va ser configurada en php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>No es va poder escriure l'arxiu temporal en el disc.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Una extensió de PHP va fer que la pujada fallara.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Aquesta col·lecció ha de contenir {{ limit }} element o més.|Aquesta col·lecció ha de contenir {{ limit }} elements o més.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Aquesta col·lecció ha de contenir {{ limit }} element o menys.|Aquesta col·lecció ha de contenir {{ limit }} elements o menys.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Aquesta col·lecció ha de contenir exactament {{ limit }} element.|Aquesta col·lecció ha de contenir exactament {{ limit }} elements.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Número de targeta invàlid.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipus de targeta no suportada o número de targeta invàlid.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Això no és un nombre de compte bancari internacional (IBAN) vàlid.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Aquest valor no és un ISBN-10 vàlid.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Aquest valor no és un ISBN-13 vàlid.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Aquest valor no és ni un ISBN-10 vàlid ni un ISBN-13 vàlid.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Aquest valor no és un ISSN vàlid.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Aquest valor no és una divisa vàlida.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser més gran a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser major o igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser idèntic a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser menor a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Aquest valor hauria de ser menor o igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Aquest valor no hauria de ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Aquest valor no hauria de idèntic a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\�6��%=%=Lpear/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>该变量的值应为 false 。</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>该变量的值应为 true 。</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>该变量的类型应为 {{ type }} 。</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>该变量值应为空。</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>选定变量的值不是有效的选项。</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>您至少要选择 {{ limit }} 个选项。</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>您最多能选择 {{ limit }} 个选项。</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>一个或者多个给定的值无效。</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>非预期字段 {{ fields }} 。</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>遗漏字段 {{ fields }} 。</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>该值不是一个有效的日期(date)。</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>该值不是一个有效的日期时间(datetime)。</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>该值不是一个有效的邮件地址。</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>文件未找到。</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>文件不可读。</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>文件太大 ({{ size }} {{ suffix }})。文件大小不可以超过 {{ limit }} {{ suffix }} 。</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>无效的文件类型 ({{ type }}) 。允许的文件类型有 {{ types }} 。</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>这个变量的值应该小于或等于 {{ limit }}。</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>字符串太长,长度不可超过 {{ limit }} 个字符。</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>该变量的值应该大于或等于 {{ limit }}。</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>字符串太短,长度不可少于 {{ limit }} 个字符。</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>该变量不应为空。</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>该变量不应为 null 。</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>该变量应为空 null 。</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>该变量值无效 。</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>该值不是一个有效的时间。</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>该值不是一个有效的 URL 。</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>这两个变量的值应该相等。</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>文件太大,文件大小不可以超过 {{ limit }} {{ suffix }}。 </target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>文件太大。</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>无法上传此文件。</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>该值应该为有效的数字。</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This value is not a valid country.</source>
                <target>该值不是有效的国家名。</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This file is not a valid image.</source>
                <target>该文件不是有效的图片。</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This is not a valid IP address.</source>
                <target>该值不是有效的IP地址。</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid language.</source>
                <target>该值不是有效的语言名。</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid locale.</source>
                <target>该值不是有效的区域值(locale)。</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>该值已经被使用。</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>不能解析图片大小。</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>图片太宽 ({{ width }}px),最大宽度为 {{ max_width }}px 。</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>图片宽度不够 ({{ width }}px),最小宽度为 {{ min_width }}px 。</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>图片太高 ({{ height }}px),最大高度为 {{ max_height }}px 。</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>图片高度不够 ({{ height }}px),最小高度为 {{ min_height }}px 。</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>该变量的值应为用户当前的密码。</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>该变量应为 {{ limit }} 个字符。</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>该文件的上传不完整。</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>没有上传任何文件。</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>php.ini 里没有配置临时文件目录。</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>临时文件写入磁盘失败。</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>某个 PHP 扩展造成上传失败。</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>该集合最少应包含 {{ limit }} 个元素。</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>该集合最多包含 {{ limit }} 个元素。</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>该集合应包含 {{ limit }} 个元素 element 。</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>无效的信用卡号。</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>不支持的信用卡类型或无效的信用卡号。</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>该值不是有效的国际银行帐号(IBAN)。</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>该值不是有效的10位国际标准书号(ISBN-10)。</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>该值不是有效的13位国际标准书号(ISBN-13)。</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>该值不是有效的国际标准书号(ISBN-10 或 ISBN-13)。</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>该值不是有效的国际标准期刊号(ISSN)。</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>该值不是有效的货币名(currency)。</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>该值应等于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>该值应大于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>该值应大于或等于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>该值应与 {{ compared_value_type }} {{ compared_value }} 相同。</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>该值应小于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>该值应小于或等于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>该值不应先等于 {{ compared_value }} 。</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>该值不应与 {{ compared_value_type }} {{ compared_value }} 相同。</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\�T�л@�@Lpear/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Este valor deve ser falso.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Este valor deve ser verdadeiro.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Este valor deve ser do tipo {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Este valor deve ser vazio.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>O valor selecionado não é uma opção válida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Você deve selecionar, no mínimo, {{ limit }} opção.|Você deve selecionar, no mínimo, {{ limit }} opções.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Você deve selecionar, no máximo, {{ limit }} opção.|Você deve selecionar, no máximo, {{ limit }} opções.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Um ou mais valores informados são inválidos.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Os campos {{ fields }} não são esperados.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Os campos {{ fields }} estão ausentes.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Este valor não é uma data válida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Este valor não é uma data e hora válida.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Este valor não é um endereço de e-mail válido.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>O arquivo não foi encontrado.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>O arquivo não pode ser lido.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é muito grande ({{ size }} {{ suffix }}). O tamanho máximo permitido é {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>O tipo mime do arquivo é inválido ({{ type }}). Os tipos mime permitidos são {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Este valor deve ser {{ limit }} ou menos.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Este valor é muito longo. Deve ter {{ limit }} caractere ou menos.|Este valor é muito longo. Deve ter {{ limit }} caracteres ou menos.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Este valor deve ser {{ limit }} ou mais.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Este valor é muito curto. Deve ter {{ limit }} caractere ou mais.|Este valor é muito curto. Deve ter {{ limit }} caracteres ou mais.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Este valor não deve ser vazio.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Este valor não deve ser nulo.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Este valor deve ser nulo.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Este valor não é válido.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Este valor não é uma hora válida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Este valor não é uma URL válida.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Os dois valores devem ser iguais.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é muito grande. O tamanho máximo permitido é de {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>O arquivo é muito grande.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>O arquivo não pode ser enviado.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Este valor deve ser um número válido.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Este arquivo não é uma imagem válida.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Este não é um endereço de IP válido.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Este valor não é um idioma válido.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Este valor não é uma localidade válida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Este valor não é um país válido.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Este valor já está sendo usado.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>O tamanho da imagem não pode ser detectado.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>A largura da imagem é muito grande ({{ width }}px). A largura máxima permitida é de {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>A largura da imagem é muito pequena ({{ width }}px). A largura mínima esperada é de {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>A altura da imagem é muito grande ({{ height }}px). A altura máxima permitida é de {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>A altura da imagem é muito pequena ({{ height }}px). A altura mínima esperada é de {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Este valor deve ser a senha atual do usuário.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Este valor deve ter exatamente {{ limit }} caractere.|Este valor deve ter exatamente {{ limit }} caracteres.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>O arquivo foi enviado apenas parcialmente.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nenhum arquivo foi enviado.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Nenhum diretório temporário foi configurado no php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Não foi possível escrever o arquivo temporário no disco.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Uma extensão PHP fez com que o envio falhasse.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Esta coleção deve conter {{ limit }} elemento ou mais.|Esta coleção deve conter {{ limit }} elementos ou mais.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Esta coleção deve conter {{ limit }} elemento ou menos.|Esta coleção deve conter {{ limit }} elementos ou menos.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Esta coleção deve conter exatamente {{ limit }} elemento.|Esta coleção deve conter exatamente {{ limit }} elementos.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Número de cartão inválido.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipo de cartão não suportado ou número de cartão inválido.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Este não é um Número Internacional de Conta Bancária (IBAN) válido.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Este valor não é um ISBN-10 válido.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Este valor não é um ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Este valor não é um ISBN-10 e nem um ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Este valor não é um ISSN válido.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Este não é um valor monetário válido.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Este valor deve ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Este valor deve ser maior que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Este valor deve ser maior ou igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor deve ser idêntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Este valor deve ser menor que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Este valor deve ser menor ou igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Este valor não deve ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor não deve ser idêntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\-���uCuCIpear/Symfony/Component/Validator/Resources/translations/validators.sk.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Táto hodnota by mala byť nastavená na false.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Táto hodnota by mala byť nastavená na true.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Táto hodnota by mala byť typu {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Táto hodnota by mala byť prázdna.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Táto hodnota by mala byť jednou z poskytnutých možností.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Mali by ste vybrať minimálne {{ limit }} možnosť.|Mali by ste vybrať minimálne {{ limit }} možnosti.|Mali by ste vybrať minimálne {{ limit }} možností.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Mali by ste vybrať najviac {{ limit }} možnosť.|Mali by ste vybrať najviac {{ limit }} možnosti.|Mali by ste vybrať najviac {{ limit }} možností.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Niektoré z uvedených hodnôt sú neplatné.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Polia {{ fields }} neboli očakávané.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Chýbajú polia {{ fields }} .</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Tato hodnota nemá platný formát dátumu.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Táto hodnota nemá platný formát dátumu a času.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Táto hodnota nie je platná emailová adresa.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Súbor sa nenašiel.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Súbor nie je čitateľný.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Súbor je príliš veľký ({{ size }} {{ suffix }}). Maximálna povolená veľkosť je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Súbor typu ({{ type }}) nie je podporovaný. Podporované typy sú {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Táto hodnota by mala byť {{ limit }} alebo menej.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Táto hodnota obsahuje viac znakov ako je povolené. Mala by obsahovať najviac {{ limit }} znak.|Táto hodnota obsahuje viac znakov ako je povolené. Mala by obsahovať najviac {{ limit }} znaky.|Táto hodnota obsahuje viac znakov ako je povolené. Mala by obsahovať najviac {{ limit }} znakov.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Táto hodnota by mala byť viac ako {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Táto hodnota je príliš krátka. Musí obsahovať minimálne {{ limit }} znak.|Táto hodnota je príliš krátka. Musí obsahovať minimálne {{ limit }} znaky.|Táto hodnota je príliš krátka. Minimálny počet znakov je {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Táto hodnota by mala byť vyplnená.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Táto hodnota by nemala byť null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Táto hodnota by mala byť null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Táto hodnota nie je platná.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Tato hodnota nemá správny formát času.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Táto hodnota nie je platnou URL adresou.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Tieto dve hodnoty by mali byť rovnaké.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Súbor je príliš veľký. Maximálna povolená veľkosť je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Súbor je príliš veľký.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Súbor sa nepodarilo nahrať.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Táto hodnota by mala byť číslo.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Tento súbor nie je obrázok.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Toto nie je platná IP adresa.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Tento jazyk neexistuje.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Táto lokalizácia neexistuje.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Táto krajina neexistuje.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Táto hodnota sa už používa.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Nepodarilo sa zistiť rozmery obrázku.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Obrázok je príliš široký ({{ width }}px). Maximálna povolená šírka obrázku je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Obrázok je príliš úzky ({{ width }}px). Minimálna šírka obrázku by mala byť {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>>Obrázok je príliš vysoký ({{ height }}px). Maximálna povolená výška obrázku je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Obrázok je príliš nízky ({{ height }}px). Minimálna výška obrázku by mala byť {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Táto hodnota by mala byť aktuálne heslo používateľa.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Táto hodnota by mala mať presne {{ limit }} znak.|Táto hodnota by mala mať presne {{ limit }} znaky.|Táto hodnota by mala mať presne {{ limit }} znakov.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Bola nahraná len časť súboru.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Žiadny súbor nebol nahraný.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>V php.ini nie je nastavená cesta k adresáru pre dočasné súbory.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Dočasný súbor sa nepodarilo zapísať na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Rozšírenie PHP zabránilo nahraniu súboru.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Táto kolekcia by mala obsahovať aspoň {{ limit }} prvok alebo viac.|Táto kolekcia by mala obsahovať aspoň {{ limit }} prvky alebo viac.|Táto kolekcia by mala obsahovať aspoň {{ limit }} prvkov alebo viac.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Táto kolekcia by mala maximálne {{ limit }} prvok.|Táto kolekcia by mala obsahovať maximálne {{ limit }} prvky.|Táto kolekcia by mala obsahovať maximálne {{ limit }} prvkov.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Táto kolekcia by mala obsahovať presne {{ limit }} prvok.|Táto kolekcia by mala obsahovať presne {{ limit }} prvky.|Táto kolekcia by mala obsahovať presne {{ limit }} prvkov.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Neplatné číslo karty.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nepodporovaný typ karty alebo neplatné číslo karty.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Toto je neplatný IBAN.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Táto hodnota je neplatné ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Táto hodnota je neplatné ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Táto hodnota nie je platné ISBN-10 ani ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Táto hodnota nie je platné ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Táto hodnota nie je platná mena.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť väčšia ako {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť väčšia alebo rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť typu {{ compared_value_type }} a zároveň by mala byť rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť menšia ako {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Táto hodnota by mala byť menšia alebo rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Táto hodnota by nemala byť rovná {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Táto hodnota by nemala byť typu {{ compared_value_type }} a zároveň by nemala byť rovná {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\@T�\44Ipear/Symfony/Component/Validator/Resources/translations/validators.af.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Hierdie waarde moet vals wees.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Hierdie waarde moet waar wees.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Hierdie waarde moet van die soort {{type}} wees.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Hierdie waarde moet leeg wees.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Die waarde wat jy gekies het is nie 'n geldige keuse nie.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Jy moet ten minste {{ limit }} kies.|Jy moet ten minste {{ limit }} keuses kies.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Jy moet by die meeste {{ limit }} keuse kies.|Jy moet by die meeste {{ limit }} keuses kies.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Een of meer van die gegewe waardes is ongeldig.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Die velde {{ fields }} is nie verwag nie.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Die velde {{ fields }} ontbreek.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Hierdie waarde is nie 'n geldige datum nie.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Hierdie waarde is nie 'n geldige datum en tyd nie.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Hierdie waarde is nie 'n geldige e-pos adres nie.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Die lêer kon nie gevind word nie.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Die lêer kan nie gelees word nie.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Die lêer is te groot ({{ size }} {{ suffix }}). Toegelaat maksimum grootte is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Die MIME-tipe van die lêer is ongeldig ({{ type }}). Toegelaat MIME-tipes is {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Hierdie waarde moet {{ limit }} of minder wees.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Hierdie waarde is te lank. Dit moet {{ limit }} karakter of minder wees.|Hierdie waarde is te lank. Dit moet {{ limit }} karakters of minder wees.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Hierdie waarde moet {{ limit }} of meer wees.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Hierdie waarde is te kort. Dit moet {{ limit }} karakter of meer wees.|Hierdie waarde is te kort. Dit moet {{ limit }} karakters of meer wees.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Hierdie waarde moet nie leeg wees nie.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Hierdie waarde moet nie nul wees nie.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Hierdie waarde moet nul wees.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Hierdie waarde is nie geldig nie.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Hierdie waarde is nie 'n geldige tyd nie.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Hierdie waarde is nie 'n geldige URL nie.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Die twee waardes moet gelyk wees.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Die lêer is te groot. Toegelaat maksimum grootte is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Die lêer is te groot.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Die lêer kan nie opgelaai word nie.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Hierdie waarde moet 'n geldige nommer wees.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Hierdie lêer is nie 'n geldige beeld nie.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Hierdie is nie 'n geldige IP-adres nie.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Hierdie waarde is nie 'n geldige taal nie.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Hierdie waarde is nie 'n geldige land instelling nie.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Hierdie waarde is nie 'n geldige land nie.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Hierdie waarde word reeds gebruik.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Die grootte van die beeld kon nie opgespoor word nie.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Die beeld breedte is te groot ({{ width }}px). Toegelaat maksimum breedte is {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Die beeld breedte is te klein ({{ width }}px). Minimum breedte verwag is {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Die beeld hoogte is te groot ({{ height }}px). Toegelaat maksimum hoogte is {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Die beeld hoogte is te klein ({{ height }}px). Minimum hoogte verwag is {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Hierdie waarde moet die huidige wagwoord van die gebruiker wees.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Hierdie waarde moet presies {{ limit }} karakter wees.|Hierdie waarde moet presies {{ limit }} karakters wees.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Die lêer is slegs gedeeltelik opgelaai.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Geen lêer is opgelaai nie.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Geen tydelike lêer is ingestel in php.ini nie.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan nie tydelike lêer skryf op skyf nie.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>'n PHP-uitbreiding veroorsaak die oplaai van die lêer om te misluk.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Hierdie versameling moet {{ limit }} element of meer bevat.|Hierdie versameling moet {{ limit }} elemente of meer bevat.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Hierdie versameling moet {{ limit }} element of minder bevat.|Hierdie versameling moet {{ limit }} elemente of meer bevat.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Hierdie versameling moet presies {{ limit }} element bevat.|Hierdie versameling moet presies {{ limit }} elemente bevat.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ongeldige kredietkaart nommer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nie-ondersteunde tipe kaart of ongeldige kredietkaart nommer.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\93XaoAoAIpear/Symfony/Component/Validator/Resources/translations/validators.hu.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Ennek az értéknek hamisnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Ennek az értéknek igaznak kell lennie.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Ennek az értéknek {{ type }} típusúnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Ennek az értéknek üresnek kell lennie.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>A választott érték érvénytelen.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Legalább {{ limit }} értéket kell kiválasztani.|Legalább {{ limit }} értéket kell kiválasztani.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Legfeljebb {{ limit }} értéket lehet kiválasztani.|Legfeljebb {{ limit }} értéket lehet kiválasztani.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>A megadott értékek közül legalább egy érvénytelen.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Váratlan mezők: {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>A következő mezők hiányoznak: {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ez az érték nem egy érvényes dátum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ez az érték nem egy érvényes időpont.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ez az érték nem egy érvényes e-mail cím.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>A fájl nem található.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>A fájl nem olvasható.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>A fájl túl nagy ({{ size }} {{ suffix }}). A legnagyobb megengedett méret {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>A fájl mime típusa érvénytelen ({{ type }}). Az engedélyezett mime típusok: {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Ez az érték legfeljebb {{ limit }} lehet.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Ez az érték túl hosszú. Legfeljebb {{ limit }} karaktert tartalmazhat.|Ez az érték túl hosszú. Legfeljebb {{ limit }} karaktert tartalmazhat.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Ez az érték legalább {{ limit }} kell legyen.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Ez az érték túl rövid. Legalább {{ limit }} karaktert kell tartalmaznia.|Ez az érték túl rövid. Legalább {{ limit }} karaktert kell tartalmaznia.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ez az érték nem lehet üres.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ez az érték nem lehet null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ennek az értéknek nullnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Ez az érték nem érvényes.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ez az érték nem egy érvényes időpont.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ez az érték nem egy érvényes URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>A két értéknek azonosnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>A fájl túl nagy. A megengedett maximális méret: {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>A fájl túl nagy.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>A fájl nem tölthető fel.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ennek az értéknek érvényes számnak kell lennie.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ez a fájl nem egy érvényes kép.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Ez az érték nem egy érvényes IP cím.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ez az érték nem egy érvényes nyelv.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ez az érték nem egy érvényes területi beállítás.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ez az érték nem egy érvényes ország.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ez az érték már használatban van.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>A kép méretét nem lehet megállapítani.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>A kép szélessége túl nagy ({{ width }}px). A megengedett legnagyobb szélesség {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>A kép szélessége túl kicsi ({{ width }}px). Az elvárt legkisebb szélesség {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>A kép magassága túl nagy ({{ height }}px). A megengedett legnagyobb magasság {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>A kép magassága túl kicsi ({{ height }}px). Az elvárt legkisebb magasság {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Ez az érték a felhasználó jelenlegi jelszavával kell megegyezzen.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ennek az értéknek pontosan {{ limit }} karaktert kell tartalmaznia.|Ennek az értéknek pontosan {{ limit }} karaktert kell tartalmaznia.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>A fájl csak részben lett feltöltve.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nem lett fájl feltöltve.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Nincs ideiglenes könyvtár beállítva a php.ini-ben.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Az ideiglenes fájl nem írható a lemezre.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Egy PHP bővítmény miatt a feltöltés nem sikerült.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ennek a gyűjteménynek legalább {{ limit }} elemet kell tartalmaznia.|Ennek a gyűjteménynek legalább {{ limit }} elemet kell tartalmaznia.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ez a gyűjtemény legfeljebb {{ limit }} elemet tartalmazhat.|Ez a gyűjtemény legfeljebb {{ limit }} elemet tartalmazhat.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ennek a gyűjteménynek pontosan {{ limit }} elemet kell tartalmaznia.|Ennek a gyűjteménynek pontosan {{ limit }} elemet kell tartalmaznia.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Érvénytelen kártyaszám.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nem támogatott kártyatípus vagy érvénytelen kártyaszám.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Érvénytelen nemzetközi bankszámlaszám (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ez az érték nem egy érvényes ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ez az érték nem egy érvényes ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ez az érték nem egy érvényes ISBN-10 vagy ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ez az érték nem egy érvényes ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ez az érték nem egy érvényes pénznem.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ez az érték legyen {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ez az érték nagyobb legyen mint {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ez az érték nagyobb vagy egyenlő legyen mint {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ez az érték ugyanolyan legyen mint {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ez az érték kisebb legyen mint {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ez az érték kisebb vagy egyenlő legyen mint {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ez az érték ne legyen {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ez az érték ne legyen ugyanolyan mint {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\��9>�5�5Ipear/Symfony/Component/Validator/Resources/translations/validators.da.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Værdien skal være falsk.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Værdien skal være sand.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Værdien skal være af typen {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Værdien skal være blank.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Værdien skal være en af de givne muligheder.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Du skal vælge mindst {{ limit }} muligheder.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Du kan højest vælge {{ limit }} muligheder.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>En eller flere af de oplyste værdier er ugyldige.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Felterne {{ fields }} var ikke forventet.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Felterne {{ fields }} mangler.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Værdien er ikke en gyldig dato.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Værdien er ikke en gyldig dato og tid.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Værdien er ikke en gyldig e-mail adresse.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Filen kunne ikke findes.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Filen kan ikke læses.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen er for stor ({{ size }} {{ suffix }}). Tilladte maksimale størrelse {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mimetypen af filen er ugyldig ({{ type }}). Tilladte mimetyper er {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Værdien skal være {{ limit }} eller mindre.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Værdien er for lang. Den skal have {{ limit }} bogstaver eller mindre.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Værdien skal være {{ limit }} eller mere.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Værdien er for kort. Den skal have {{ limit }} tegn eller flere.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Værdien må ikke være blank.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Værdien må ikke være tom (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Værdien skal være tom (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Værdien er ikke gyldig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Værdien er ikke en gyldig tid.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Værdien er ikke en gyldig URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>De to værdier skal være ens.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen er for stor. Den maksimale størrelse er {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Filen er for stor.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Filen kunne ikke blive uploadet.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Værdien skal være et gyldigt tal.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Filen er ikke gyldigt billede.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Dette er ikke en gyldig IP adresse.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Værdien er ikke et gyldigt sprog.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Værdien er ikke en gyldig lokalitet.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Værdien er ikke et gyldigt land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Værdien er allerede i brug.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Størrelsen på billedet kunne ikke detekteres.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Billedbredden er for stor ({{ width }}px). Tilladt maksimumsbredde er {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Billedebredden er for lille ({{ width }}px). Forventet minimumshøjde er {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Billedhøjden er for stor ({{ height }}px). Tilladt maksimumshøjde er {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Billedhøjden er for lille ({{ height }}px). Forventet minimumshøjde er {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Værdien skal være brugerens nuværende password.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Værdien skal have præcis {{ limit }} tegn.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Filen var kun delvis uploadet.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ingen fil blev uploadet.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Ingen midlertidig mappe er konfigureret i php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan ikke skrive midlertidig fil til disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>En PHP udvidelse forårsagede fejl i upload.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Denne samling skal indeholde {{ limit }} element eller flere.|Denne samling skal indeholde {{ limit }} elementer eller flere.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Denne samling skal indeholde {{ limit }} element eller mindre.|Denne samling skal indeholde {{ limit }} elementer eller mindre.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Denne samling skal indeholde præcis {{ limit }} element.|Denne samling skal indeholde præcis {{ limit }} elementer.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ugyldigt kortnummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Ikke-understøttet korttype eller ugyldigt kortnummer.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Det er ikke en gyldig International Bank Account Number (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Værdien er ikke en gyldig ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Værdien er ikke en gyldig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Værdien er hverken en gyldig ISBN-10 eller en gyldig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Værdien er ikke en gyldig ISSN.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\D��#"#"Ipear/Symfony/Component/Validator/Resources/translations/validators.mn.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Энэ утга буруу байх ёстой.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Энэ утга үнэн байх ёстой.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Энэ утга  {{ type }} -н төрөл байх ёстой.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Энэ утга хоосон байх ёстой.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Сонгосон утга буруу байна.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Хамгийн багадаа {{ limit }} утга сонгогдсон байх ёстой.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Хамгийн ихдээ {{ limit }} утга сонгогдох боломжтой.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Өгөгдсөн нэг эсвэл нэгээс олон утга буруу байна.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>Талбарууд {{ fields }} зөвшөөрөгдөөгүй байна.</source>
                <target>{{ fields }}.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>{{ fields }} талбарууд дутуу байна.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Энэ утга буруу date төрөл байна .</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Энэ утга буруу цаг төрөл байна.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>И-майл хаяг буруу байна.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Файл олдсонгүй.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Файл уншигдахуйц биш байна.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл хэтэрхий том байна ({{ size }} {{ suffix }}). Зөвшөөрөгдөх дээд хэмжээ  {{ limit }} {{ suffix }} байна.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Файлын MIME-төрөл нь буруу байна ({{ type }}). Зөвшөөрөгдөх MIME-төрлүүд {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Энэ утга  {{ limit }} юмуу эсвэл бага байна.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Энэ утга хэтэрхий урт байна. {{ limit }} тэмдэгтийн урттай юмуу эсвэл бага байна.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Энэ утга {{ limit }} юмуу эсвэл их байна.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Энэ утга хэтэрхий богино байна. {{ limit }} тэмдэгт эсвэл их байна.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Энэ утга хоосон байж болохгүй.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Энэ утга null байж болохгүй.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Энэ утга null байна.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Энэ утга буруу байна.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Энэ утга буруу цаг төрөл байна.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Энэ утга буруу URL байна .</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Хоёр утгууд ижил байх ёстой.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл хэтэрхий том байна. Зөвшөөрөгдөх дээд хэмжээ нь {{ limit }} {{ suffix }} байна.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Файл хэтэрхий том байна.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Файл upload хийгдсэнгүй.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Энэ утга зөвхөн тоо байна.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This value is not a valid country.</source>
                <target>Энэ утга үнэн бодит улс биш байна.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This file is not a valid image.</source>
                <target>Файл зураг биш байна.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This is not a valid IP address.</source>
                <target>IP хаяг зөв биш байна.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid language.</source>
                <target>Энэ утга үнэн зөв хэл биш байна .</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\����M�MIpear/Symfony/Component/Validator/Resources/translations/validators.el.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Αυτή η τιμή πρέπει να είναι ψευδής.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Αυτή η τιμή πρέπει να είναι αληθής.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Αυτή η τιμή πρέπει να είναι τύπου {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Αυτή η τιμή πρέπει να είναι κενή.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Η τιμή που επιλέχθηκε δεν αντιστοιχεί σε έγκυρη επιλογή.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Πρέπει να επιλέξετε τουλάχιστον {{ limit }} επιλογή.|Πρέπει να επιλέξετε τουλάχιστον {{ limit }} επιλογές.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Πρέπει να επιλέξετε το πολύ {{ limit }} επιλογή.|Πρέπει να επιλέξετε το πολύ {{ limit }} επιλογές.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Μια ή περισσότερες τιμές δεν είναι έγκυρες.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Τα πεδία {{ fields }} δεν ήταν αναμενόμενα.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Τα πεδία {{ fields }} απουσιάζουν.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Η τιμή δεν αντιστοιχεί σε έγκυρη ημερομηνία.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Η τιμή δεν αντιστοιχεί σε έγκυρη ημερομηνία και ώρα.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Η τιμή δεν αντιστοιχεί σε έγκυρο email.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Το αρχείο δε μπορεί να βρεθεί.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Το αρχείο δεν είναι αναγνώσιμο.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Το αρχείο είναι πολύ μεγάλο ({{ size }} {{ suffix }}). Το μέγιστο επιτρεπτό μέγεθος είναι {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Ο τύπος mime του αρχείου δεν είναι έγκυρος ({{ type }}). Οι έγκρυοι τύποι mime είναι {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Αυτή η τιμή θα έπρεπε να είναι {{ limit }} ή λιγότερο.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Αυτή η τιμή είναι πολύ μεγάλη. Θα έπρεπε να έχει {{ limit }} χαρακτήρα ή λιγότερο.|Αυτή η τιμή είναι πολύ μεγάλη. Θα έπρεπε να έχει {{ limit }} χαρακτήρες ή λιγότερο.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Αυτή η τιμή θα έπρεπε να είναι {{ limit }} ή περισσότερο.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Αυτή η τιμή είναι πολύ μικρή. Θα έπρεπε να έχει {{ limit }} χαρακτήρα ή περισσότερο.|Αυτή η τιμή είναι πολύ μικρή. Θα έπρεπε να έχει {{ limit }} χαρακτήρες ή περισσότερο.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Αυτή η τιμή δεν πρέπει να είναι κενή.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Αυτή η τιμή δεν πρέπει να είναι μηδενική.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Αυτή η τιμή πρέπει να είναι μηδενική.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Αυτή η τιμή δεν είναι έκγυρη.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Αυτή η τιμή δεν αντιστοιχεί σε έγκυρη ώρα.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Αυτή η τιμή δεν αντιστοιχεί σε έγκυρο URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Οι δύο τιμές θα πρέπει να είναι ίδιες.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Το αρχείο είναι πολύ μεγάλο. Το μέγιστο επιτρεπτό μέγεθος είναι {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Το αρχείο είναι πολύ μεγάλο.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Το αρχείο δε μπορεί να ανέβει.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι ένας έγκυρος αριθμός.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Το αρχείο δεν αποτελεί έγκυρη εικόνα.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Αυτό δεν είναι μια έκγυρη διεύθυνση IP.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Αυτή η τιμή δεν αντιστοιχεί σε μια έκγυρη γλώσσα.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Αυτή η τιμή δεν αντιστοιχεί σε έκγυρο κωδικό τοποθεσίας.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Αυτή η τιμή δεν αντιστοιχεί σε μια έκγυρη χώρα.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Αυτή η τιμή χρησιμοποιείται ήδη.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Το μέγεθος της εικόνας δεν ήταν δυνατό να ανιχνευθεί.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Το πλάτος της εικόνας είναι πολύ μεγάλο ({{ width }}px). Το μέγιστο επιτρεπτό πλάτος είναι {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Το πλάτος της εικόνας είναι πολύ μικρό ({{ width }}px). Το ελάχιστο επιτρεπτό πλάτος είναι {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Το ύψος της εικόνας είναι πολύ μεγάλο ({{ height }}px). Το μέγιστο επιτρεπτό ύψος είναι {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Το ύψος της εικόνας είναι πολύ μικρό ({{ height }}px). Το ελάχιστο επιτρεπτό ύψος είναι {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Αυτή η τιμή θα έπρεπε να είναι ο τρέχων κωδικός.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Αυτή η τιμή θα έπρεπε να έχει ακριβώς {{ limit }} χαρακτήρα.|Αυτή η τιμή θα έπρεπε να έχει ακριβώς {{ limit }} χαρακτήρες.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Το αρχείο δεν ανέβηκε ολόκληρο.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Δεν ανέβηκε κανένα αρχείο.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Κανένας προσωρινός φάκελος δεν έχει ρυθμιστεί στο php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Αδυναμία εγγραφής προσωρινού αρχείου στο δίσκο.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Μια επέκταση PHP προκάλεσε αδυναμία ανεβάσματος.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Αυτή η συλλογή θα πρέπει να περιέχει {{ limit }} στοιχείο ή περισσότερα.|Αυτή η συλλογή θα πρέπει να περιέχει {{ limit }} στοιχεία ή περισσότερα.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Αυτή η συλλογή θα πρέπει να περιέχει {{ limit }} στοιχείo ή λιγότερα.|Αυτή η συλλογή θα πρέπει να περιέχει {{ limit }} στοιχεία ή λιγότερα.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Αυτή η συλλογή θα πρέπει να περιέχει ακριβώς {{ limit }} στοιχείo.|Αυτή η συλλογή θα πρέπει να περιέχει ακριβώς {{ limit }} στοιχεία.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Μη έγκυρος αριθμός κάρτας.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Μη υποστηριζόμενος τύπος κάρτας ή μη έγκυρος αριθμός κάρτας.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Αυτό δεν αντιστοιχεί σε έκγυρο διεθνή αριθμό τραπεζικού λογαριασμού (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Αυτό δεν είναι έγκυρος κωδικός ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Αυτό δεν είναι έγκυρος κωδικός ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Αυτό δεν είναι ούτε έγκυρος κωδικός ISBN-10 ούτε έγκυρος κωδικός ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Αυτό δεν είναι έγκυρος κωδικός ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Αυτό δεν αντιστοιχεί σε έγκυρο νόμισμα.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι ίση με {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι μεγαλύτερη από {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι μεγαλύτερη ή ίση με {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι πανομοιότυπη με {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι μικρότερη από {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Αυτή η τιμή θα πρέπει να είναι μικρότερη ή ίση με {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Αυτή η τιμή δεν θα πρέπει να είναι ίση με {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Αυτή η τιμή δεν πρέπει να είναι πανομοιότυπη με {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\s�E#�A�AIpear/Symfony/Component/Validator/Resources/translations/validators.de.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Dieser Wert sollte false sein.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Dieser Wert sollte true sein.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Dieser Wert sollte vom Typ {{ type }} sein.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Dieser Wert sollte leer sein.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Sie haben einen ungültigen Wert ausgewählt.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Sie müssen mindestens {{ limit }} Möglichkeit wählen.|Sie müssen mindestens {{ limit }} Möglichkeiten wählen.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Sie dürfen höchstens {{ limit }} Möglichkeit wählen.|Sie dürfen höchstens {{ limit }} Möglichkeiten wählen.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Einer oder mehrere der angegebenen Werte sind ungültig.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Die Felder {{ fields }} wurden nicht erwartet.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Die erwarteten Felder {{ fields }} fehlen.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Dieser Wert entspricht keiner gültigen Datumsangabe.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Dieser Wert entspricht keiner gültigen Datums- und Zeitangabe.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Dieser Wert ist keine gültige E-Mail-Adresse.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Die Datei wurde nicht gefunden.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Die Datei ist nicht lesbar.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Die Datei ist zu groß ({{ size }} {{ suffix }}). Die maximal zulässige Größe beträgt {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Der Dateityp ist ungültig ({{ type }}). Erlaubte Dateitypen sind {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Dieser Wert sollte kleiner oder gleich {{ limit }} sein.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Diese Zeichenkette ist zu lang. Sie sollte höchstens {{ limit }} Zeichen haben.|Diese Zeichenkette ist zu lang. Sie sollte höchstens {{ limit }} Zeichen haben.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Dieser Wert sollte größer oder gleich {{ limit }} sein.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Diese Zeichenkette ist zu kurz. Sie sollte mindestens {{ limit }} Zeichen haben.|Diese Zeichenkette ist zu kurz. Sie sollte mindestens {{ limit }} Zeichen haben.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Dieser Wert sollte nicht leer sein.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Dieser Wert sollte nicht null sein.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Dieser Wert sollte null sein.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Dieser Wert ist nicht gültig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Dieser Wert entspricht keiner gültigen Zeitangabe.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Dieser Wert ist keine gültige URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Die beiden Werte sollten identisch sein.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Die Datei ist zu groß. Die maximal zulässige Größe beträgt {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Die Datei ist zu groß.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Die Datei konnte nicht hochgeladen werden.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Dieser Wert sollte eine gültige Zahl sein.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Diese Datei ist kein gültiges Bild.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Dies ist keine gültige IP-Adresse.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Dieser Wert entspricht keiner gültigen Sprache.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Dieser Wert entspricht keinem gültigen Gebietsschema.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Dieser Wert entspricht keinem gültigen Land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Dieser Wert wird bereits verwendet.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Die Größe des Bildes konnte nicht ermittelt werden.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Die Bildbreite ist zu groß ({{ width }}px). Die maximal zulässige Breite beträgt {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Die Bildbreite ist zu gering ({{ width }}px). Die erwartete Mindestbreite beträgt {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Die Bildhöhe ist zu groß ({{ height }}px). Die maximal zulässige Höhe beträgt {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Die Bildhöhe ist zu gering ({{ height }}px). Die erwartete Mindesthöhe beträgt {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Dieser Wert sollte dem aktuellen Benutzerpasswort entsprechen.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Dieser Wert sollte genau {{ limit }} Zeichen lang sein.|Dieser Wert sollte genau {{ limit }} Zeichen lang sein.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Die Datei wurde nur teilweise hochgeladen.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Es wurde keine Datei hochgeladen.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Es wurde kein temporärer Ordner in der php.ini konfiguriert.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kann die temporäre Datei nicht speichern.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Eine PHP-Erweiterung verhinderte den Upload.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Diese Sammlung sollte {{ limit }} oder mehr Elemente beinhalten.|Diese Sammlung sollte {{ limit }} oder mehr Elemente beinhalten.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Diese Sammlung sollte {{ limit }} oder weniger Elemente beinhalten.|Diese Sammlung sollte {{ limit }} oder weniger Elemente beinhalten.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Diese Sammlung sollte genau {{ limit }} Element beinhalten.|Diese Sammlung sollte genau {{ limit }} Elemente beinhalten.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ungültige Kartennummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nicht unterstützer Kartentyp oder ungültige Kartennummer.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Dieser Wert ist keine gültige IBAN-Kontonummer.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Dieser Wert entspricht keiner gültigen ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Dieser Wert entspricht keiner gültigen ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Dieser Wert ist weder eine gültige ISBN-10 noch eine gültige ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Dieser Wert ist keine gültige ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Dieser Wert ist keine gültige Währung.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Dieser Wert sollte gleich {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Dieser Wert sollte größer als {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Dieser Wert sollte größer oder gleich {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Dieser Wert sollte identisch sein mit {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Dieser Wert sollte kleiner als {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Dieser Wert sollte kleiner oder gleich {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Dieser Wert sollte nicht {{ compared_value }} sein.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Dieser Wert sollte nicht identisch sein mit {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\�a�2�2Ipear/Symfony/Component/Validator/Resources/translations/validators.fi.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Arvon tulee olla epätosi.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Arvon tulee olla tosi.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Arvon tulee olla tyyppiä {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Arvon tulee olla tyhjä.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Arvon tulee olla yksi annetuista vaihtoehdoista.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Sinun tulee valita vähintään {{ limit }} vaihtoehtoa.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Sinun tulee valitan enintään {{ limit }} vaihtoehtoa.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Yksi tai useampi annetuista arvoista on virheellinen.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Odottamattomia kenttiä {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Kentät {{ fields }} puuttuvat.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Annettu arvo ei ole kelvollinen päivämäärä.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Annettu arvo ei ole kelvollinen päivämäärä ja kellonaika.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Annettu arvo ei ole kelvollinen sähköpostiosoite.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Tiedostoa ei löydy.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Tiedostoa ei voida lukea.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Tiedostonkoko ({{ size }} {{ suffix }}) on liian iso. Suurin sallittu tiedostonkoko on {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Tiedostotyyppi ({{ type }}) on virheellinen. Sallittuja tiedostotyyppejä ovat {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Arvon tulee olla {{ limit }} tai vähemmän.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Liian pitkä syöte. Syöte saa olla enintään {{ limit }} merkkiä.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Arvon tulee olla {{ limit }} tai enemmän.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Liian lyhyt syöte. Syötteen tulee olla vähintään {{ limit }} merkkiä.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Kenttä ei voi olla tyhjä.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Syöte ei voi olla null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Syötteen tulee olla null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Virheellinen arvo.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Annettu arvo ei ole kelvollinen kellonaika.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Annettu arvo ei ole kelvollinen URL-osoite.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Kahden annetun arvon tulee olla samat.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Annettu tiedosto on liian iso. Suurin sallittu tiedostokoko on {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Tiedosto on liian iso.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Tiedoston siirto epäonnistui.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Tämän arvon tulee olla numero.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Tämä tiedosto ei ole kelvollinen kuva.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Tämä ei ole kelvollinen IP-osoite.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Tämä arvo ei ole kelvollinen kieli.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Tämä arvo ei ole kelvollinen kieli- ja alueasetus (locale).</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Tämä arvo ei ole kelvollinen maa.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Tämä arvo on jo käytetty.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Kuvan kokoa ei voitu tunnistaa.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Kuva on liian leveä ({{ width }}px). Sallittu maksimileveys on {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Kuva on liian kapea ({{ width }}px). Leveyden tulisi olla vähintään {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Kuva on liian korkea ({{ width }}px). Sallittu maksimikorkeus on {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Kuva on liian matala ({{ height }}px). Korkeuden tulisi olla vähintään {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Tämän arvon tulisi olla käyttäjän tämänhetkinen salasana.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Tämän arvon tulisi olla tasan yhden merkin pituinen.|Tämän arvon tulisi olla tasan {{ limit }} merkkiä pitkä.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Tiedosto ladattiin vain osittain.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Tiedostoa ei ladattu.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Väliaikaishakemistoa ei ole asetettu php.ini -tiedostoon.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Väliaikaistiedostoa ei voitu kirjoittaa levylle.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP-laajennoksen vuoksi tiedoston lataus epäonnistui.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Tässä ryhmässä tulisi olla yksi tai useampi elementti.|Tässä ryhmässä tulisi olla vähintään {{ limit }} elementtiä.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Tässä ryhmässä tulisi olla enintään yksi elementti.|Tässä ryhmässä tulisi olla enintään {{ limit }} elementtiä.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Tässä ryhmässä tulisi olla tasan yksi elementti.|Tässä ryhmässä tulisi olla enintään {{ limit }} elementtiä.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Virheellinen korttinumero.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tätä korttityyppiä ei tueta tai korttinumero on virheellinen.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\����A�AIpear/Symfony/Component/Validator/Resources/translations/validators.ro.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Această valoare ar trebui să fie falsă (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Această valoare ar trebui să fie adevărată (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Această valoare ar trebui să fie de tipul {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Această valoare ar trebui sa fie goală.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Valoarea selectată nu este o opțiune validă.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Trebuie să selectați cel puțin {{ limit }} opțiuni.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Trebuie să selectați cel mult {{ limit }} opțiuni.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Una sau mai multe dintre valorile furnizate sunt invalide.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Câmpurile {{ fields }} nu erau așteptate.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Câmpurile {{ fields }} lipsesc.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Această valoare nu reprezintă o dată validă.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Această valoare nu reprezintă o dată și oră validă.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Această valoare nu reprezintă o adresă de e-mail validă.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Fișierul nu a putut fi găsit.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fișierul nu poate fi citit.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fișierul este prea mare ({{ size }} {{ suffix }}). Dimensiunea maximă permisă este {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Tipul fișierului este invalid ({{ type }}). Tipurile permise de fișiere sunt ({{ types }}).</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Această valoare ar trebui să fie cel mult {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caracter.|Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caractere.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Această valoare ar trebui să fie cel puțin {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caracter.|Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caractere.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Această valoare nu ar trebui să fie goală.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Această valoare nu ar trebui să fie nulă (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Această valoare ar trebui să fie nulă (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Această valoare nu este validă.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Această valoare nu reprezintă o oră validă.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Această valoare nu reprezintă un URL (link) valid.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Cele două valori ar trebui să fie egale.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fișierul este prea mare. Mărimea maximă permisă este {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fișierul este prea mare.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Fișierul nu a putut fi încărcat.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Această valoare nu reprezintă un număr valid.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Acest fișier nu este o imagine validă.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Această valoare nu este o adresă IP validă.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Această valoare nu reprezintă o limbă corectă.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Această valoare nu reprezintă un dialect (o limbă) corect.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Această valoare nu este o țară validă.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Această valoare este folosită deja.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Mărimea imaginii nu a putut fi detectată.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Lățimea imaginii este prea mare ({{ width }}px). Lățimea maximă permisă este de {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Lățimea imaginii este prea mică ({{ width }}px). Lățimea minimă permisă este de {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Înălțimea imaginii este prea mare ({{ height }}px). Înălțimea maximă permisă este de {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Înălțimea imaginii este prea mică ({{ height }}px). Înălțimea minimă permisă este de {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Această valoare trebuie să fie parola curentă a utilizatorului.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Această valoare trebuie să conțină exact {{ limit }} caracter.|Această valoare trebuie să conțină exact {{ limit }} caractere.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fișierul a fost încărcat parțial.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nu a fost încărcat nici un fișier.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Nu este configurat nici un director temporar in php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nu a fost posibilă scrierea fișierului temporar pe disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>O extensie PHP a prevenit încărcarea cu succes a fișierului.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Această colecție trebuie să conțină cel puțin {{ limit }} elemente.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Această colecție trebuie să conțină cel mult {{ limit }} elemente.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Această colecție trebuie să conțină {{ limit }} elemente.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Numărul card invalid.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipul sau numărul cardului nu sunt valide.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Acesta nu este un cod IBAN (International Bank Account Number) valid.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Această valoare nu este un cod ISBN-10 valid.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Această valoare nu este un cod ISBN-13 valid.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Această valoare nu este un cod ISBN-10 sau ISBN-13 valid.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Această valoare nu este un cod ISSN valid.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Această valoare nu este o monedă validă.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie egală cu {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie mai mare de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie mai mare sau egală cu {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Această valoare trebuie identică cu {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie mai mică de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Această valoare trebuie să fie mai mică sau egală cu {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Această valoare nu trebuie să fie egală cu {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Această valoare nu trebuie să fie identică cu {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\����O�OIpear/Symfony/Component/Validator/Resources/translations/validators.ar.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>هذه القيمة يجب أن تكون خاطئة.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>هذه القيمة يجب أن تكون حقيقية.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>هذه القيمة يجب ان تكون من نوع {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>هذه القيمة يجب ان تكون فارغة.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>القيمة المختارة ليست خيارا صحيحا.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>يجب ان تختار {{ limit }} اختيار على الاقل.|يجب ان تختار {{ limit }} اختيار على الاقل.|يجب ان تختار {{ limit }} اختيارات على الاقل.|يجب ان تختار {{ limit }} اختيار على الاقل.|يجب ان تختار {{ limit }} اختيار على الاقل.|يجب ان تختار {{ limit }} اختيار على الاقل.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>يجب ان تختار {{ limit }} اختيار على الاكثر.|يجب ان تختار {{ limit }} اختيار على الاكثر.|يجب ان تختار {{ limit }} اختيارات على الاكثر.|يجب ان تختار {{ limit }} اختيار على الاكثر.|يجب ان تختار {{ limit }} اختيار على الاكثر.|يجب ان تختار {{ limit }} اختيار على الاكثر.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>واحد أو أكثر من القيم المعطاه خاطئ.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>القيم {{ fields }} لم تكن متوقعة.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>القيم {{ fields }} مفقودة.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>هذه القيمة ليست تاريخا صالحا.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>هذه القيمة ليست تاريخا و وقتا صالحا.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>هذه القيمة ليست عنوان بريد إلكتروني صحيح.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>لا يمكن العثور على الملف.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>الملف غير قابل للقراءة.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>الملف كبير جدا ({{ size }} {{ suffix }}).اقصى مساحه مسموح بها ({{ limit }} {{ suffix }}).</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>نوع الملف غير صحيح ({{ type }}). الانواع المسموح بها هى {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>هذه القيمة يجب ان تكون {{ limit }} او اقل.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حرف او اقل.|هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حرف او اقل.|هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حروف او اقل.|هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حرف او اقل.|هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حرف او اقل.|هذه القيمة طويلة جدا. يجب ان تكون {{ limit }} حرف او اقل.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>هذه القيمة يجب ان تكون {{ limit }} او اكثر.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حرف او اكثر.|هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حرف او اكثر.|هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حروف او اكثر.|هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حرف او اكثر.|هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حرف او اكثر.|هذه القيمة قصيرة جدا. يجب ان تكون {{ limit }} حرف او اكثر.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>هذه القيمة يجب الا تكون فارغة.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>هذه القيمة يجب الا تكون فارغة.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>هذه القيمة يجب ان تكون فارغة.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>هذه القيمة غير صحيحة.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>هذه القيمة ليست وقت صحيح.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>هذه القيمة ليست رابط الكترونى صحيح.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>القيمتان يجب ان تكونا متساويتان.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>الملف كبير جدا. اقصى مساحه مسموح بها {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>الملف كبير جدا.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>لم استطع استقبال الملف.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>هذه القيمة يجب ان تكون رقم.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>هذا الملف ليس صورة صحيحة.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>هذه القيمة ليست عنوان رقمى صحيح.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>هذه القيمة ليست لغة صحيحة.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>هذه القيمة ليست موقع صحيح.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>هذه القيمة ليست بلدا صالحا.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>هذه القيمة مستخدمة بالفعل.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>لم استطع معرفة حجم الصورة.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>عرض الصورة كبير جدا ({{ width }}px). اقصى عرض مسموح به هو{{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>عرض الصورة صغير جدا ({{ width }}px). اقل عرض مسموح به هو{{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>طول الصورة كبير جدا ({{ height }}px). اقصى طول مسموح به هو{{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>طول الصورة صغير جدا ({{ height }}px). اقل طول مسموح به هو{{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>هذه القيمة يجب ان تكون كلمة سر المستخدم الحالية.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>هذه القيمة يجب ان تحتوى على {{ limit }} حرف فقط.|هذه القيمة يجب ان تحتوى على {{ limit }} حرف فقط.|هذه القيمة يجب ان تحتوى على {{ limit }} حروف فقط.|هذه القيمة يجب ان تحتوى على {{ limit }} حرف فقط.|هذه القيمة يجب ان تحتوى على {{ limit }} حرف فقط.|هذه القيمة يجب ان تحتوى على {{ limit }} حرف فقط.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>تم استقبال جزء من الملف فقط.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>لم يتم ارسال اى ملف.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>لم يتم تهيئة حافظة مؤقتة فى ملف php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>لم استطع كتابة الملف المؤقت.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>احد اضافات PHP تسببت فى فشل استقبال الملف.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اكثر.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اكثر.|هذه المجموعة يجب ان تحتوى على {{ limit }} عناصر او اكثر.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اكثر.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اكثر.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اكثر.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اقل.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اقل.|هذه المجموعة يجب ان تحتوى على {{ limit }} عناصر او اقل.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اقل.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اقل.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر او اقل.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر فقط.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر فقط.|هذه المجموعة يجب ان تحتوى على {{ limit }} عناصر فقط.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر فقط.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر فقط.|هذه المجموعة يجب ان تحتوى على {{ limit }} عنصر فقط.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>رقم البطاقه غير صحيح.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>نوع البطاقه غير مدعوم او الرقم غير صحيح.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>الرقم IBAN (رقم الحساب المصرفي الدولي) الذي تم إدخاله غير صالح.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>هذه القيمة ليست ISBN-10 صالحة.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>هذه القيمة ليست ISBN-13 صالحة.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>هذه القيمة ليست ISBN-10 صالحة ولا ISBN-13 صالحة.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>هذه القيمة ليست ISSN صالحة.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>العُملة غير صحيحة.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>القيمة يجب ان تساوي {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>القيمة يجب ان تكون اعلي من {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>القيمة يجب ان تكون مساوية او اعلي من {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>القيمة يجب ان تطابق {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>القيمة يجب ان تكون اقل من {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>القيمة يجب ان تساوي او تقل عن {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>القيمة يجب ان لا تساوي {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>القيمة يجب ان لا تطابق {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\�1�^�4�4Npear/Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Vrednost treba da bude netačna.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Vrednost treba da bude tačna.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Vrednost treba da bude tipa {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Vrednost treba da bude prazna.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Vrednost treba da bude jedna od ponuđenih.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Izaberite bar {{ limit }} mogućnost.|Izaberite bar {{ limit }} mogućnosti.|Izaberite bar {{ limit }} mogućnosti.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Izaberite najviše {{ limit }} mogućnost.|Izaberite najviše {{ limit }} mogućnosti.|Izaberite najviše {{ limit }} mogućnosti.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Jedna ili više vrednosti je nevalidna.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Polja {{ fields }} nisu bila očekivana.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Polja {{ fields }} nedostaju.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Vrednost nije validan datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Vrednost nije validan datum-vreme.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Vrednost nije validna adresa elektronske pošte.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Datoteka ne može biti pronađena.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Datoteka nije čitljiva.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Datoteka je prevelika ({{ size }} {{ suffix }}). Najveća dozvoljena veličina je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mime tip datoteke nije validan ({{ type }}). Dozvoljeni mime tipovi su {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Vrednost treba da bude {{ limit }} ili manje.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Vrednost je predugačka. Treba da ima {{ limit }} karakter ili manje.|Vrednost je predugačka. Treba da ima {{ limit }} karaktera ili manje.|Vrednost je predugačka. Treba da ima {{ limit }} karaktera ili manje.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Vrednost treba da bude {{ limit }} ili više.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Vrednost je prekratka. Treba da ima {{ limit }} karakter ili više.|Vrednost je prekratka. Treba da ima {{ limit }} karaktera ili više.|Vrednost je prekratka. Treba da ima {{ limit }} karaktera ili više.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Vrednost ne treba da bude prazna.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Vrednost ne treba da bude null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Vrednost treba da bude null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Vrednost je nevalidna.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Vrednost nije validno vreme.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Vrednost nije validan URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Obe vrednosti treba da budu jednake.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Datoteka je prevelika. Najveća dozvoljena veličina je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Datoteka je prevelika.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Datoteka ne može biti otpremljena.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Vrednost treba da bude validan broj.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ova datoteka nije validna slika.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Ovo nije validna IP adresa.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Vrednost nije validan jezik.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Vrednost nije validan lokal.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Vrednost nije validna zemlja.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Vrednost je već iskorišćena.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Veličina slike ne može biti određena.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Širina slike je prevelika ({{ width }}px). Najeća dozvoljena širina je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Širina slike je premala ({{ width }}px). Najmanja dozvoljena širina je {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Visina slike je prevelika ({{ height }}px). Najeća dozvoljena visina je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Visina slike je premala ({{ height }}px). Najmanja dozvoljena visina je {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Vrednost treba da bude trenutna korisnička lozinka.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Vrednost treba da ima tačno {{ limit }} karakter.|Vrednost treba da ima tačno {{ limit }} karaktera.|Vrednost treba da ima tačno {{ limit }} karaktera.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Datoteka je samo parcijalno otpremljena.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Datoteka nije otpremljena.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Privremeni direktorijum nije konfigurisan u php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nemoguće pisanje privremene datoteke na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP ekstenzija je prouzrokovala neuspeh otpremanja datoteke.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ova kolekcija treba da sadrži {{ limit }} ili više elemenata.|Ova kolekcija treba da sadrži {{ limit }} ili više elemenata.|Ova kolekcija treba da sadrži {{ limit }} ili više elemenata.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ova kolekcija treba da sadrži {{ limit }} ili manje elemenata.|Ova kolekcija treba da sadrži {{ limit }} ili manje elemenata.|Ova kolekcija treba da sadrži {{ limit }} ili manje elemenata.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ova kolekcija treba da sadrži tačno {{ limit }} element.|Ova kolekcija treba da sadrži tačno {{ limit }} elementa.|Ova kolekcija treba da sadrži tačno {{ limit }} elemenata.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Nevalidan broj kartice.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nevalidan broj kartice ili tip kartice nije podržan.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\-�L>L>Ipear/Symfony/Component/Validator/Resources/translations/validators.id.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Nilai ini harus bernilai salah.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Nilai ini harus bernilai benar.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Nilai ini harus bertipe {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Nilai ini harus kosong.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Nilai yang dipilih tidak tepat.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Anda harus memilih paling tidak {{ limit }} pilihan.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Anda harus memilih paling banyak {{ limit }} pilihan.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Satu atau lebih nilai yang diberikan tidak sah.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Kolom {{ fields }} tidak seperti yang diharapkan.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Kolom {{ fields }} hilang.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Nilai ini bukan merupakan tanggal yang sah.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Nilai ini bukan merupakan tanggal dan waktu yang sah.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Nilai ini bukan alamat email yang sah.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Berkas tidak ditemukan.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Berkas tidak bisa dibaca.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ukuran berkas terlalu besar ({{ size }} {{ suffix }}). Ukuran maksimum yang diizinkan adalah {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Jenis berkas ({{ type }}) tidak sah. Jenis berkas yang diijinkan adalah {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Nilai ini harus {{ limit }} atau kurang.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Nilai ini terlalu panjang. Seharusnya {{ limit }} karakter atau kurang.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Nilai ini harus {{ limit }} atau lebih.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Nilai ini terlalu pendek. Seharusnya {{ limit }} karakter atau lebih.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Nilai ini tidak boleh kosong.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Nilai ini tidak boleh 'null'.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Nilai ini harus 'null'.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Nilai ini tidak sah.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Nilai ini bukan merupakan waktu yang sah.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Nilai ini bukan URL yang sah.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Isi keduanya harus sama.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ukuran berkas terlalu besar. Ukuran maksimum yang diijinkan adalah {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Ukuran berkas terlalu besar.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Berkas tidak dapat diunggah.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Nilai ini harus angka yang sah.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Berkas ini tidak termasuk gambar.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Ini bukan alamat IP yang sah.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Nilai ini bukan bahasa yang sah.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Nilai ini bukan lokal yang sah.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Nilai ini bukan negara yang sah.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Nilai ini sudah digunakan.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Ukuran dari gambar tidak bisa dideteksi.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Lebar gambar terlalu besar ({{ width }}px). Ukuran lebar maksimum adalah {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Lebar gambar terlalu kecil ({{ width}}px). Ukuran lebar minimum yang diharapkan adalah {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Tinggi gambar terlalu besar ({{ height }}px). Ukuran tinggi maksimum adalah {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Tinggi gambar terlalu kecil ({{ height }}px). Ukuran tinggi minimum yang diharapkan adalah {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Nilai ini harus kata sandi pengguna saat ini.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Nilai ini harus memiliki tepat {{ limit }} karakter.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Berkas hanya terunggah sebagian.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Tidak ada berkas terunggah.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Direktori sementara tidak dikonfiguasi pada php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Tidak dapat menuliskan berkas sementara ke dalam media penyimpanan.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Sebuah ekstensi PHP menyebabkan kegagalan unggah.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Kumpulan ini harus memiliki {{ limit }} elemen atau lebih.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Kumpulan ini harus memiliki kurang dari {{ limit }} elemen.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Kumpulan ini harus memiliki tepat {{ limit }} elemen.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Nomor kartu tidak sah.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Jenis kartu tidak didukung atau nomor kartu tidak sah.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Ini bukan Nomor Rekening Bank Internasional (IBAN) yang sah.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Nilai ini bukan ISBN-10 yang sah.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Nilai ini bukan ISBN-13 yang sah.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Nilai ini bukan ISBN-10 maupun ISBN-13 yang sah.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Nilai ini bukan ISSN yang sah.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Nilai ini bukan mata uang yang sah.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Nilai ini seharusnya sama dengan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Nilai ini seharusnya lebih dari {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Nilai ini seharusnya lebih dari atau sama dengan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Nilai ini seharusnya identik dengan {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Nilai ini seharusnya kurang dari {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Nilai ini seharusnya kurang dari atau sama dengan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Nilai ini seharusnya tidak sama dengan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Nilai ini seharusnya tidak identik dengan {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\˺�Q1Q1Ipear/Symfony/Component/Validator/Resources/translations/validators.tr.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Bu değer olumsuz olmalıdır.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Bu değer olumlu olmalıdır.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Bu değerin tipi {{ type }} olmalıdır.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Bu değer boş olmalıdır.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Seçtiğiniz değer geçerli bir seçenek değil.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>En az {{ limit }} seçenek belirtmelisiniz.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>En çok {{ limit }} seçenek belirtmelisiniz.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Verilen değerlerden bir veya daha fazlası geçersiz.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>{{ fields }} alanları kabul edilmedi.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>{{ fields }} alanları eksik.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Bu değer doğru bir tarih biçimi değildir.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Bu değer doğru bir tarihsaat biçimi değildir.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Bu değer doğru bir e-mail adresi değildir.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Dosya bulunamadı.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Dosya okunabilir değil.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Dosya çok büyük ({{ size }} {{ suffix }}). İzin verilen en büyük dosya boyutu {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Dosyanın mime tipi geçersiz ({{ type }}). İzin verilen mime tipleri {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Bu değer {{ limit }} ve altında olmalıdır.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Bu değer çok uzun. {{ limit }} karakter veya daha az olmalıdır.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Bu değer {{ limit }} veya daha fazla olmalıdır.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Bu değer çok kısa. {{ limit }} karakter veya daha fazla olmaldır.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Bu değer boşluk olamaz.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Bu değer boş bırakılmamalıdır.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Bu değer boş bırakılmalıdır.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Bu değer geçerli değil.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Bu değer doğru bir saat değil.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Bu değer doğru bir URL değil.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>İki değer eşit olmalıdır.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Dosya çok büyük. İzin verilen en büyük dosya boyutu {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Dosya çok büyük.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Dosya yüklenemiyor.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Bu değer geçerli bir rakam olmalıdır.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Bu dosya geçerli bir resim değildir.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Bu geçerli bir IP adresi değildir.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Bu değer geçerli bir lisan değil.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Bu değer geçerli bir yer değildir.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Bu değer geçerli bir ülke değildir.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Bu değer şu anda kullanımda.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Resmin boyutu saptanamıyor.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Resmin genişliği çok büyük ({{ width }}px). İzin verilen en büyük genişlik {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Resmin genişliği çok küçük ({{ width }}px). En az {{ min_width }}px olmalıdır.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Resmin yüksekliği çok büyük ({{ height }}px). İzin verilen en büyük yükseklik {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Resmin yüksekliği çok küçük ({{ height }}px). En az {{ min_height }}px olmalıdır.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Bu değer kullanıcının şu anki şifresi olmalıdır.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Bu değer tam olarak {{ limit }} karakter olmaldır.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Dosya sadece kısmen yüklendi.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Hiçbir dosya yüklenmedi.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>php.ini içerisinde geçici dizin tanımlanmadı.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Geçici dosya diske yazılamıyor.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Bir PHP eklentisi dosyanın yüklemesini başarısız kıldı.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Bu derlem {{ limit }} veya daha çok eleman içermelidir.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Bu derlem {{ limit }} veya daha az eleman içermelidir.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Bu derlem {{ limit }} eleman içermelidir.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Geçersiz kart numarası.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Desteklenmeyen kart tipi veya geçersiz kart numarası.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\��-tZMZMIpear/Symfony/Component/Validator/Resources/translations/validators.ru.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Значение должно быть ложным.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Значение должно быть истинным.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Тип значения должен быть {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Значение должно быть пустым.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Выбранное Вами значение недопустимо.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Вы должны выбрать хотя бы {{ limit }} вариант.|Вы должны выбрать хотя бы {{ limit }} варианта.|Вы должны выбрать хотя бы {{ limit }} вариантов.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Вы должны выбрать не более чем {{ limit }} вариант.|Вы должны выбрать не более чем {{ limit }} варианта.|Вы должны выбрать не более чем {{ limit }} вариантов.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Одно или несколько заданных значений недопустимо.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Поля {{ fields }} не ожидались.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Поля {{ fields }} отсутствуют.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Значение не является правильной датой.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Значение даты и времени недопустимо.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Значение адреса электронной почты недопустимо.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Файл не может быть найден.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Файл не может быть прочитан.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл слишком большой ({{ size }} {{ suffix }}). Максимально допустимый размер {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>MIME-тип файла недопустим ({{ type }}). Допустимы MIME-типы файлов {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Значение должно быть {{ limit }} или меньше.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Значение слишком длинное. Должно быть равно {{ limit }} символу или меньше.|Значение слишком длинное. Должно быть равно {{ limit }} символам или меньше.|Значение слишком длинное. Должно быть равно {{ limit }} символам или меньше.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Значение должно быть {{ limit }} или больше.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Значение слишком короткое. Должно быть равно {{ limit }} символу или больше.|Значение слишком короткое. Должно быть равно {{ limit }} символам или больше.|Значение слишком короткое. Должно быть равно {{ limit }} символам или больше.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Значение не должно быть пустым.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Значение не должно быть null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Значение должно быть null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Значение недопустимо.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Значение времени недопустимо.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Значение не является допустимым URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Оба значения должны быть одинаковыми.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл слишком большой. Максимально допустимый размер {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Файл слишком большой.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Файл не может быть загружен.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Значение должно быть числом.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This value is not a valid country.</source>
                <target>Значение не является допустимой страной.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This file is not a valid image.</source>
                <target>Файл не является допустимым форматом изображения.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This is not a valid IP address.</source>
                <target>Значение не является допустимым IP адресом.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid language.</source>
                <target>Значение не является допустимым языком.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid locale.</source>
                <target>Значение не является допустимой локалью.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Это значение уже используется.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Не удалось определить размер изображения.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Ширина изображения слишком велика ({{ width }}px). Максимально допустимая ширина {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Ширина изображения слишком мала ({{ width }}px). Минимально допустимая ширина {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Высота изображения слишком велика ({{ height }}px). Максимально допустимая высота {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Высота изображения слишком мала ({{ height }}px). Минимально допустимая высота {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Значение должно быть текущим паролем пользователя.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Значение должно быть равно {{ limit }} символу.|Значение должно быть равно {{ limit }} символам.|Значение должно быть равно {{ limit }} символам.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Файл был загружен только частично.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Файл не был загружен.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Не настроена временная директория в php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Невозможно записать временный файл на диск.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Расширение PHP вызвало ошибку при загрузке.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Эта коллекция должна содержать {{ limit }} элемент или больше.|Эта коллекция должна содержать {{ limit }} элемента или больше.|Эта коллекция должна содержать {{ limit }} элементов или больше.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Эта коллекция должна содержать {{ limit }} элемент или меньше.|Эта коллекция должна содержать {{ limit }} элемента или меньше.|Эта коллекция должна содержать {{ limit }} элементов или меньше.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Эта коллекция должна содержать ровно {{ limit }} элемент.|Эта коллекция должна содержать ровно {{ limit }} элемента.|Эта коллекция должна содержать ровно {{ limit }} элементов.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Неверный номер карты.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Неподдерживаемый тип или неверный номер карты.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Значение не является допустимым международным номером банковского счета (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Значение имеет неверный формат ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Значение имеет неверный формат ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Значение не соответствует форматам ISBN-10 и ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Значение не соответствует формату ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Некорректный формат валюты.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Значение должно быть равно {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Значение должно быть больше чем {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Значение должно быть больше или равно {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значение должно быть идентичным {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Значение должно быть меньше чем {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Значение должно быть меньше или равно {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Значение не должно быть равно {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значение не должно быть идентичным {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\��-�1�1Ipear/Symfony/Component/Validator/Resources/translations/validators.cy.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Dylid bod y gwerth hwn yn ffug.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Dylid bod y gwerth hwn yn wir.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Dylid bod y gwerth hwn bod o fath {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Dylid bod y gwerth hwn yn wag.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Nid yw'r gwerth â ddewiswyd yn ddilys.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Rhaid dewis o leiaf {{ limit }} opsiwn.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Rhaid dewis dim mwy na {{ limit }} opsiwn.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Mae un neu fwy o'r gwerthoedd a roddwyd yn annilys.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Roedd y maesydd {{ fields }} yn anisgwyl.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Roedd y maesydd {{ fields }} ar goll.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Nid yw'r gwerth yn ddyddiad dilys.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Nid yw'r gwerth yn datetime dilys.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Nid yw'r gwerth yn gyfeiriad ebost dilys.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Ni ddarganfyddwyd y ffeil.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Ni ellir darllen y ffeil.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Mae'r ffeil yn rhy fawr ({{ size }} {{ suffix }}). Yr uchafswm â ganiateir yw {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Nid yw math mime y ffeil yn ddilys ({{ type }}). Dyma'r mathau â ganiateir {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Dylai'r gwerth hwn fod yn {{ limit }} neu lai.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Mae'r gwerth hwn rhy hir. Dylai gynnwys {{ limit }} nodyn cyfrifiadurol neu lai.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Dylai'r gwerth hwn fod yn {{ limit }} neu fwy.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Mae'r gwerth hwn yn rhy fyr. Dylai gynnwys {{ limit }} nodyn cyfrifiadurol neu fwy.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ni ddylai'r gwerth hwn fod yn wag.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ni ddylai'r gwerth hwn fod yn null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Dylai'r gwerth fod yn null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Nid yw'r gwerth hwn yn ddilys.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Nid yw'r gwerth hwn yn amser dilys.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Nid yw'r gwerth hwn yn URL dilys.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Rhaid i'r ddau werth fod yn gyfystyr a'u gilydd.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Mae'r ffeil yn rhy fawr. Yr uchafswm â ganiateir yw {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Mae'r ffeil yn rhy fawr.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Methwyd ag uwchlwytho'r ffeil.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Dylai'r gwerth hwn fod yn rif dilys.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Nid yw'r ffeil hon yn ddelwedd dilys.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Nid yw hwn yn gyfeiriad IP dilys.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Nid yw'r gwerth hwn yn iaith ddilys.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Nid yw'r gwerth hwn yn locale dilys.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Nid yw'r gwerth hwn yn wlad dilys.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Mae'r gwerth hwn eisoes yn cael ei ddefnyddio.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Methwyd â darganfod maint y ddelwedd.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Mae lled y ddelwedd yn rhy fawr ({{ width }}px). Y lled mwyaf â ganiateir yw {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Mae lled y ddelwedd yn rhy fach ({{ width }}px). Y lled lleiaf â ganiateir yw {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Mae uchder y ddelwedd yn rhy fawr ({{ width }}px). Yr uchder mwyaf â ganiateir yw {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Mae uchder y ddelwedd yn rhy fach ({{ width }}px). Yr uchder lleiaf â ganiateir yw {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Dylaid bod y gwerth hwn yn gyfrinair presenol y defnyddiwr.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Dylai'r gwerth hwn fod yn union {{ limit }} nodyn cyfrifiadurol o hyd.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Dim ond rhan o'r ffeil ag uwchlwythwyd.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ni uwchlwythwyd unrhyw ffeil.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Nid oes ffolder dros-dro wedi'i gosod yn php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Methwyd ag ysgrifennu'r ffeil dros-dro ar ddisg.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Methwyd ag uwchlwytho oherwydd ategyn PHP.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Dylai'r casgliad hwn gynnwys {{ limit }} elfen neu fwy.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Dylai'r casgliad hwn gynnwys {{ limit }} elfen neu lai.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Dylai'r casgliad hwn gynnwys union {{ limit }} elfen.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Nid oedd rhif y cerdyn yn ddilys.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Unai ni dderbynir y math yna o gerdyn, neu nid yw rhif y cerdyn yn ddilys.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\��tý5�5Ipear/Symfony/Component/Validator/Resources/translations/validators.he.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>הערך צריך להיות שקר.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>הערך צריך להיות אמת.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>הערך צריך להיות מסוג {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>הערך צריך להיות ריק.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>הערך שבחרת אינו חוקי.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>אתה צריך לבחור לפחות {{ limit }} אפשרויות.|אתה צריך לבחור לפחות {{ limit }} אפשרויות.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>אתה צריך לבחור לכל היותר {{ limit }} אפשרויות.|אתה צריך לבחור לכל היותר {{ limit }} אפשרויות.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>אחד או יותר מהערכים אינו חוקי.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>השדות {{ fields }} לא היו צפויים.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>השדות {{ fields }} חסרים.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>הערך אינו תאריך חוקי.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>הערך אינו תאריך ושעה חוקיים.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>כתובת המייל אינה תקינה.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>הקובץ לא נמצא.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>לא ניתן לקרוא את הקובץ.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>הקובץ גדול מדי ({{ size }} {{ suffix }}). הגודל המרבי המותר הוא {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>סוג MIME של הקובץ אינו חוקי ({{ type }}). מותרים סוגי MIME {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>הערך צריל להכיל {{ limit }} תווים לכל היותר.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>הערך ארוך מידי. הוא צריך להכיל {{ limit }} תווים לכל היותר.|הערך ארוך מידי. הוא צריך להכיל {{ limit }} תווים לכל היותר.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>הערך צריך להכיל {{ limit }} תווים לפחות.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>הערך קצר מידיץ הוא צריך להכיל {{ limit }} תווים לפחות.|הערך קצר מידיץ הוא צריך להכיל {{ limit }} תווים לפחות.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>הערך לא אמור להיות ריק.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>הערך לא אמור להיות ריק.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>הערך צריך להיות ריק.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>הערך אינו חוקי.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>הערך אינו זמן תקין.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>זאת אינה כתובת אתר תקינה.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>שני הערכים צריכים להיות שווים.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>הקובץ גדול מדי. הגודל המרבי המותר הוא {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>הקובץ גדול מדי.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>לא ניתן לעלות את הקובץ.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>הערך צריך להיות מספר חוקי.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>הקובץ הזה אינו תמונה תקינה.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>זו אינה כתובת IP חוקית.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>הערך אינו שפה חוקית.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>הערך אינו אזור תקף.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>הערך אינו ארץ חוקית.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>הערך כבר בשימוש.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>לא ניתן לקבוע את גודל התמונה.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>רוחב התמונה גדול מדי ({{ width }}px). הרוחב המקסימלי הוא {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>רוחב התמונה קטן מדי ({{ width }}px). הרוחב המינימלי הוא {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>גובה התמונה גדול מדי ({{ height }}px). הגובה המקסימלי הוא {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>גובה התמונה קטן מדי ({{ height }}px). הגובה המינימלי הוא {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>הערך צריך להיות סיסמת המשתמש הנוכחי.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>הערך צריך להיות בדיוק {{ limit }} תווים.|הערך צריך להיות בדיוק {{ limit }} תווים.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>הקובץ הועלה באופן חלקי.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>הקובץ לא הועלה.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>לא הוגדרה תיקייה זמנית ב php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>לא ניתן לכתוב קובץ זמני לדיסק.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>סיומת PHP גרם להעלאה להיכשל.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>האוסף אמור להכיל {{ limit }} אלמנטים או יותר.|האוסף אמור להכיל {{ limit }} אלמנטים או יותר.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>האוסף אמור להכיל {{ limit }} אלמנטים או פחות.|האוסף אמור להכיל {{ limit }} אלמנטים או פחות.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>האוסף צריך להכיל בדיוק {{ limit }} אלמנטים.|האוסף צריך להכיל בדיוק {{ limit }} אלמנטים.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>מספר הכרטיס אינו חוקי.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>סוג הכרטיס אינו נתמך או לא חוקי.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\��"}2A2AIpear/Symfony/Component/Validator/Resources/translations/validators.es.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Este valor debería ser falso.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Este valor debería ser verdadero.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Este valor debería ser de tipo {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Este valor debería estar vacío.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>El valor seleccionado no es una opción válida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Debe seleccionar al menos {{ limit }} opción.|Debe seleccionar al menos {{ limit }} opciones.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Debe seleccionar como máximo {{ limit }} opción.|Debe seleccionar como máximo {{ limit }} opciones.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Uno o más de los valores indicados no son válidos.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>No se esperaban los campos {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Faltan los campos {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Este valor no es una fecha válida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Este valor no es una fecha y hora válidas.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Este valor no es una dirección de email válida.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>No se pudo encontrar el archivo.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>No se puede leer el archivo.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>El archivo es demasiado grande ({{ size }} {{ suffix }}). El tamaño máximo permitido es {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>El tipo mime del archivo no es válido ({{ type }}). Los tipos mime válidos son {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Este valor debería ser {{ limit }} o menos.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Este valor es demasiado largo. Debería tener {{ limit }} carácter o menos.|Este valor es demasiado largo. Debería tener {{ limit }} caracteres o menos.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Este valor debería ser {{ limit }} o más.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Este valor es demasiado corto. Debería tener {{ limit }} carácter o más.|Este valor es demasiado corto. Debería tener {{ limit }} caracteres o más.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Este valor no debería estar vacío.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Este valor no debería ser nulo.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Este valor debería ser nulo.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Este valor no es válido.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Este valor no es una hora válida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Este valor no es una URL válida.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Los dos valores deberían ser iguales.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>El archivo es demasiado grande. El tamaño máximo permitido es {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>El archivo es demasiado grande.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>No se pudo subir el archivo.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Este valor debería ser un número válido.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>El archivo no es una imagen válida.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Esto no es una dirección IP válida.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Este valor no es un idioma válido.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Este valor no es una localización válida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Este valor no es un país válido.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Este valor ya se ha utilizado.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>No se pudo determinar el tamaño de la imagen.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>La anchura de la imagen es demasiado grande ({{ width }}px). La anchura máxima permitida son {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>La anchura de la imagen es demasiado pequeña ({{ width }}px). La anchura mínima requerida son {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>La altura de la imagen es demasiado grande ({{ height }}px). La altura máxima permitida son {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>La altura de la imagen es demasiado pequeña ({{ height }}px). La altura mínima requerida son {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Este valor debería ser la contraseña actual del usuario.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Este valor debería tener exactamente {{ limit }} carácter.|Este valor debería tener exactamente {{ limit }} caracteres.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>El archivo fue sólo subido parcialmente.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ningún archivo fue subido.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Ninguna carpeta temporal fue configurada en php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>No se pudo escribir el archivo temporal en el disco.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Una extensión de PHP hizo que la subida fallara.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Esta colección debe contener {{ limit }} elemento o más.|Esta colección debe contener {{ limit }} elementos o más.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Esta colección debe contener {{ limit }} elemento o menos.|Esta colección debe contener {{ limit }} elementos o menos.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Esta colección debe contener exactamente {{ limit }} elemento.|Esta colección debe contener exactamente {{ limit }} elementos.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Número de tarjeta inválido.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipo de tarjeta no soportado o número de tarjeta inválido.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Esto no es un International Bank Account Number (IBAN) válido.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Este valor no es un ISBN-10 válido.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Este valor no es un ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Este valor no es ni un ISBN-10 válido ni un ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Este valor no es un ISSN válido.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Este valor no es una divisa válida.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Este valor debería ser igual que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Este valor debería ser mayor que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Este valor debería ser mayor o igual que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor debería ser idéntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Este valor debería ser menor que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Este valor debería ser menor o igual que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Este valor debería ser distinto de {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor no debería ser idéntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\�τ}K}KIpear/Symfony/Component/Validator/Resources/translations/validators.uk.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Значення повинно бути Ні.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Значення повинно бути Так.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Тип значення повинен бути {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Значення повинно бути пустим.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Обране вами значення недопустиме.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Ви повинні обрати хоча б {{ limit }} варіант.|Ви повинні обрати хоча б {{ limit }} варіанти.|Ви повинні обрати хоча б {{ limit }} варіантів.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Ви повинні обрати не більше ніж {{ limit }} варіантів.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Одне або кілька заданих значень є недопустимі.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Поля {{ fields }} не очікувалися.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Поля {{ fields }} відсутні.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Дане значення не є вірною датою.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Дане значення дати та часу недопустиме.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Значення адреси электронної пошти недопустиме.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Файл не знайдено.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Файл не читається.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл занадто великий ({{ size }} {{ suffix }}). Дозволений максимальний розмір {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>MIME-тип файлу недопустимий ({{ type }}). Допустимі MIME-типи файлів {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Значення повинно бути {{ limit }} або менше.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Значення занадто довге. Повинно бути рівне {{ limit }} символу або менше.|Значення занадто довге. Повинно бути рівне {{ limit }} символам або менше.|Значення занадто довге. Повинно бути рівне {{ limit }} символам або менше.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Значення повинно бути {{ limit }} або більше.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Значення занадто коротке. Повинно бути рівне {{ limit }} символу або більше.|Значення занадто коротке. Повинно бути рівне {{ limit }} символам або більше.|Значення занадто коротке. Повинно бути рівне {{ limit }} символам або більше.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Значення не повинно бути пустим.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Значення не повинно бути null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Значення повинно бути null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Значення недопустиме.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Значення часу недопустиме.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Значення URL недопустиме.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Обидва занчення повинні бути одинаковими.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файл занадто великий. Максимальний допустимий розмір {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Файл занадто великий.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Файл не можливо завантажити.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Значення має бути допустимим числом.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Цей файл не є допустимим форматом зображення.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Це некоректна IP адреса.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Це некоректна мова.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Це некоректна локалізація.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Це некоректна країна.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Це значення вже використовується.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Не вдалося визначити розмір зображення.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Ширина зображення занадто велика ({{ width }}px). Максимально допустима ширина {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Ширина зображення занадто мала ({{ width }}px). Мінімально допустима ширина {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Висота зображення занадто велика ({{ height }}px). Максимально допустима висота {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Висота зображення занадто мала ({{ height }}px). Мінімально допустима висота {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Значення має бути поточним паролем користувача.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Значення повиино бути рівним {{ limit }} символу.|Значення повиино бути рівним {{ limit }} символам.|Значення повиино бути рівним {{ limit }} символам.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Файл був завантажений лише частково.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Файл не був завантажений.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Не налаштована тимчасова директорія в php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Неможливо записати тимчасовий файл на диск.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Розширення PHP викликало помилку при завантаженні.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ця колекція повинна містити {{ limit }} елемент чи більше.|Ця колекція повинна містити {{ limit }} елемента чи більше.|Ця колекція повинна містити {{ limit }} елементів чи більше.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ця колекція повинна містити {{ limit }} елемент чи менше.|Ця колекція повинна містити {{ limit }} елемента чи менше.|Ця колекція повинна містити {{ limit }} елементов чи менше.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ця колекція повинна містити рівно {{ limit }} елемент.|Ця колекція повинна містити рівно {{ limit }} елемента.|Ця колекція повинна містити рівно {{ limit }} елементів.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Невірний номер карти.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Непідтримуваний тип карти або невірний номер карти.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Це не дійсний міжнародний номер банківського рахунку (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Значення не у форматі ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Значення не у форматі ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Значення не відповідає форматам ISBN-10 та ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Значення має невірний формат ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Значення має невірний формат валюти.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Значення повинно дорівнювати {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Значення має бути більше ніж {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Значення має бути більше або дорівнювати {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значення має бути ідентичним {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Значення повинно бути менше ніж {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Значення повинно бути менше або дорівнювати {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Значення не повинно дорівнювати  {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Значення не повинно бути ідентичним {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\���+BBIpear/Symfony/Component/Validator/Resources/translations/validators.fr.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Cette valeur doit être fausse.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Cette valeur doit être vraie.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Cette valeur doit être de type {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Cette valeur doit être vide.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Cette valeur doit être l'un des choix proposés.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Vous devez sélectionner au moins {{ limit }} choix.|Vous devez sélectionner au moins {{ limit }} choix.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Vous devez sélectionner au maximum {{ limit }} choix.|Vous devez sélectionner au maximum {{ limit }} choix.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Une ou plusieurs des valeurs soumises sont invalides.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Les champs {{ fields }} n'ont pas été prévus.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Les champs {{ fields }} sont manquants.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Cette valeur n'est pas une date valide.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Cette valeur n'est pas une date valide.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Cette valeur n'est pas une adresse email valide.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Le fichier n'a pas été trouvé.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Le fichier n'est pas lisible.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Le fichier est trop volumineux ({{ size }} {{ suffix }}). Sa taille ne doit pas dépasser {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Le type du fichier est invalide ({{ type }}). Les types autorisés sont {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Cette valeur doit être inférieure ou égale à {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Cette chaine est trop longue. Elle doit avoir au maximum {{ limit }} caractère.|Cette chaine est trop longue. Elle doit avoir au maximum {{ limit }} caractères.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Cette valeur doit être supérieure ou égale à {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Cette chaine est trop courte. Elle doit avoir au minimum {{ limit }} caractère.|Cette chaine est trop courte. Elle doit avoir au minimum {{ limit }} caractères.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Cette valeur ne doit pas être vide.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Cette valeur ne doit pas être nulle.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Cette valeur doit être nulle.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Cette valeur n'est pas valide.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Cette valeur n'est pas une heure valide.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Cette valeur n'est pas une URL valide.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Les deux valeurs doivent être identiques.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Le fichier est trop volumineux. Sa taille ne doit pas dépasser {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Le fichier est trop volumineux.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Le téléchargement de ce fichier est impossible.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Cette valeur doit être un nombre.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ce fichier n'est pas une image valide.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Cette adresse IP n'est pas valide.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Cette langue n'est pas valide.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ce paramètre régional n'est pas valide.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ce pays n'est pas valide.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Cette valeur est déjà utilisée.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>La taille de l'image n'a pas pu être détectée.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>La largeur de l'image est trop grande ({{ width }}px). La largeur maximale autorisée est de {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>La largeur de l'image est trop petite ({{ width }}px). La largeur minimale attendue est de {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>La hauteur de l'image est trop grande ({{ height }}px). La hauteur maximale autorisée est de {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>La hauteur de l'image est trop petite ({{ height }}px). La hauteur minimale attendue est de {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Cette valeur doit être le mot de passe actuel de l'utilisateur.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Cette chaine doit avoir exactement {{ limit }} caractère.|Cette chaine doit avoir exactement {{ limit }} caractères.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Le fichier a été partiellement transféré.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Aucun fichier n'a été transféré.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Aucun répertoire temporaire n'a été configuré dans le php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Impossible d'écrire le fichier temporaire sur le disque.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Une extension PHP a empêché le transfert du fichier.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Cette collection doit contenir {{ limit }} élément ou plus.|Cette collection doit contenir {{ limit }} éléments ou plus.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Cette collection doit contenir {{ limit }} élément ou moins.|Cette collection doit contenir {{ limit }} éléments ou moins.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Cette collection doit contenir exactement {{ limit }} élément.|Cette collection doit contenir exactement {{ limit }} éléments.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Numéro de carte invalide.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Type de carte non supporté ou numéro invalide.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Le numéro IBAN (International Bank Account Number) saisi n'est pas valide.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Cette valeur n'est pas un code ISBN-10 valide.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Cette valeur n'est pas un code ISBN-13 valide.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Cette valeur n'est ni un code ISBN-10, ni un code ISBN-13 valide.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Cette valeur n'est pas un code ISSN valide.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Cette valeur n'est pas une devise valide.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Cette valeur doit être égale à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Cette valeur doit être supérieure à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Cette valeur doit être supérieure ou égale à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Cette valeur doit être identique à {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Cette valeur doit être inférieure à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Cette valeur doit être inférieure ou égale à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Cette valeur ne doit pas être égale à {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Cette valeur ne doit pas être identique à {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\���1�1Ipear/Symfony/Component/Validator/Resources/translations/validators.no.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Verdien skulle ha vore tom/nei.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Verdien skulla ha vore satt/ja.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Verdien må vere av typen {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Verdien skal vere blank.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Verdien du valgte er ikkje gyldig.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Du må velge minst {{ limit }} valg.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Du kan maksimalt gjere {{ limit }} valg.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Ein eller fleire av dei opplyste verdiane er ugyldige.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Felta {{ fields }} var ikkje forventa.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Felta {{ fields }} manglar.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Verdien er ikkje ein gyldig dato.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Verdien er ikkje ein gyldig dato og tid.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Verdien er ikkje ei gyldig e-postadresse.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Fila kunne ikkje finnes.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fila kan ikkje lesast.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fila er for stor ({{ size }} {{ suffix }}). Tillatt maksimal størrelse er {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mime-typen av fila er ugyldig ({{ type }}). Tillatte mime-typar er {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Verdien må vere {{ limit }} eller mindre.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Verdien er for lang. Den må vere {{ limit }} bokstavar eller mindre.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Verdien må vere {{ limit }} eller meir.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Verdien er for kort. Den må ha {{ limit }} teikn eller fleire.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Verdien må ikkje vere blank.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Verdien må ikkje vere tom (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Verdien må vere tom (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Verdien er ikkje gyldig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Verdien er ikkje gyldig tidseining.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Verdien er ikkje ein gyldig URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Dei to verdiane må vere like.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fila er for stor. Den maksimale storleik er {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fila er for stor.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Fila kunne ikkje bli lasta opp.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Verdien må vere eit gyldig tal.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Fila er ikkje eit gyldig bilete.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Dette er ikkje ei gyldig IP-adresse.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Verdien er ikkje eit gyldig språk.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Verdien er ikkje ein gyldig lokalitet (språk/region).</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Verdien er ikkje eit gyldig land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Verdien er allereie i bruk.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Storleiken på biletet kunne ikkje oppdagast.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Biletbreidda er for stor, ({{ width }} pikslar). Tillatt maksimumsbreidde er {{ max_width }} pikslar.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Biletbreidda er for liten, ({{ width }} pikslar). Forventa minimumsbreidde er {{ min_width }} pikslar.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Bilethøgda er for stor, ({{ height }} pikslar). Tillatt maksimumshøgde er {{ max_height }} pikslar.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Billethøgda er for låg, ({{ height }} pikslar). Forventa minimumshøgde er {{ min_height }} pikslar.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Verdien må vere brukaren sitt noverande passord.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Verdien må vere nøyaktig {{ limit }} teikn.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fila vart kun delvis opplasta.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Inga fil vart lasta opp.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Førebels mappe (tmp) er ikkje konfigurert i php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan ikkje skrive førebels fil til disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Ei PHP-udviding forårsaka feil under opplasting.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Denne samlinga må innehalde {{ limit }} element eller meir.|Denne samlinga må innehalde {{ limit }} element eller meir.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Denne samlinga må innehalde {{ limit }} element eller færre.|Denne samlinga må innehalde {{ limit }} element eller færre.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Denne samlinga må innehalde nøyaktig {{ limit }} element.|Denne samlinga må innehalde nøyaktig {{ limit }} element.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ugyldig kortnummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Korttypen er ikkje støtta eller ugyldig kortnummer.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PKa�\�Q>�?�?Ipear/Symfony/Component/Validator/Resources/translations/validators.sv.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Värdet ska vara falskt.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Värdet ska vara sant.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Värdet ska vara av typen {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Värdet ska vara tomt.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Värdet ska vara ett av de givna valen.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Du måste välja minst {{ limit }} val.|Du måste välja minst {{ limit }} val.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Du kan som mest välja {{ limit }} val.|Du kan som mest välja {{ limit }} val.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Ett eller fler av de angivna värdena är ogiltigt.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Fälten {{ fields }} var oväntade.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Fälten {{ fields }} saknas.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Värdet är inte ett giltigt datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Värdet är inte ett giltigt datum med tid.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Värdet är inte en giltig epost-adress.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Filen kunde inte hittas.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Filen är inte läsbar.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen är för stor ({{ size }} {{ suffix }}). Största tillåtna storlek är {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Filens MIME-typ ({{ type }}) är ogiltig. De tillåtna typerna är {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Värdet ska vara {{ limit }} eller mindre.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Värdet är för långt. Det ska ha {{ limit }} tecken eller färre.|Värdet är för långt. Det ska ha {{ limit }} tecken eller färre.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Värdet ska vara {{ limit }} eller mer.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Värdet är för kort. Det ska ha {{ limit }} tecken eller mer.|Värdet är för kort. Det ska ha {{ limit }} tecken eller mer.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Värdet kan inte vara tomt.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Värdet kan inte vara null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Värdet ska vara null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Värdet är inte giltigt.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Värdet är inte en giltig tid.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Värdet är inte en giltig URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>De två värdena måste vara lika.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen är för stor. Tillåten maximal storlek är {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Filen är för stor.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Filen kunde inte laddas upp.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Värdet ska vara ett giltigt nummer.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Filen är ingen giltig bild.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Det här är inte en giltig IP-adress.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Värdet är inte ett giltigt språk.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Värdet är inte en giltig plats.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Värdet är inte ett giltigt land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Värdet används redan.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Det gick inte att fastställa storleken på bilden.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Bildens bredd är för stor ({{ width }}px). Tillåten maximal bredd är {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Bildens bredd är för liten ({{ width }}px). Minsta förväntade bredd är {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Bildens höjd är för stor ({{ height }}px). Tillåten maximal bredd är {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Bildens höjd är för liten ({{ height }}px). Minsta förväntade höjd är {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Värdet ska vara användarens nuvarande lösenord.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Värdet ska ha exakt {{ limit }} tecken.|Värdet ska ha exakt {{ limit }} tecken.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Filen laddades bara upp delvis.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ingen fil laddades upp.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Det finns ingen temporär mapp konfigurerad i php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan inte skriva temporär fil till disken.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>En PHP extension gjorde att uppladdningen misslyckades.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Den här samlingen ska innehålla {{ limit }} element eller mer.|Den här samlingen ska innehålla {{ limit }} element eller mer.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Den här samlingen ska innehålla {{ limit }} element eller mindre.|Den här samlingen ska innehålla {{ limit }} element eller mindre.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Den här samlingen ska innehålla exakt {{ limit }} element.|Den här samlingen ska innehålla exakt {{ limit }} element.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ogiltigt kortnummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Okänd korttyp eller ogiltigt kortnummer.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Det här är inte en giltig International Bank Account Number (IBANK).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Värdet är inte en giltig ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Värdet är inte en giltig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Värdet är varken en giltig ISBN-10 eller en giltig ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Värdet är inte en giltig ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Värdet är inte en giltig valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Värdet ska vara detsamma som {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Värdet ska vara större än {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Värdet ska bara större än eller detsamma som {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Värdet ska vara identiskt till {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Värdet ska vara mindre än {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Värdet ska vara mindre än eller detsamma som {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Värdet ska inte vara detsamma som {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Värdet ska inte vara identiskt med {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK a�\(��=A=AIpear/Symfony/Component/Validator/Resources/translations/validators.gl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Este valor debería ser falso.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Este valor debería ser verdadeiro.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Este valor debería ser de tipo {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Este valor debería estar baleiro.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>O valor seleccionado non é unha opción válida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Debe seleccionar polo menos {{ limit }} opción.|Debe seleccionar polo menos {{ limit }} opcions.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Debe seleccionar como máximo {{ limit }} opción.|Debe seleccionar como máximo {{ limit }} opcions.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Un ou máis dos valores indicados non son válidos.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Non se esperaban os campos {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Faltan os campos {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Este valor non é unha data válida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Este valor non é unha data e hora válidas.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Este valor non é unha dirección de correo electrónico válida.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Non se puido atopar o arquivo.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>O arquivo non se pode ler.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é demasiado grande ({{ size }} {{ suffix }}). O tamaño máximo permitido é {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>O tipo mime do arquivo non é válido ({{ type }}). Os tipos mime válidos son {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Este valor debería ser {{ limit }} ou menos.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Este valor é demasiado longo. Debería ter {{ limit }} carácter ou menos.|Este valor é demasiado longo. Debería ter {{ limit }} caracteres ou menos.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Este valor debería ser {{ limit }} ou máis.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Este valor é demasiado curto. Debería ter {{ limit }} carácter ou máis.|Este valor é demasiado corto. Debería ter {{ limit }} caracteres ou máis.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Este valor non debería estar baleiro.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Este valor non debería ser null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Este valor debería ser null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Este valor non é válido.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Este valor non é unha hora válida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Este valor non é unha URL válida.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Os dous valores deberían ser iguais.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é demasiado grande. O tamaño máximo permitido é {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>O arquivo é demasiado grande.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>No se puido cargar o arquivo.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Este valor debería ser un número válido.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>O arquivo non é unha imaxe válida.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Isto non é unha dirección IP válida.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Este valor non é un idioma válido.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Este valor non é unha localización válida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Este valor non é un país válido.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Este valor xa está a ser empregado.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Non se puido determinar o tamaño da imaxe.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>A largura da imaxe é demasiado grande ({{ width }}px). A largura máxima permitida son {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>A largura da imaxe é demasiado pequena ({{ width }}px). A largura mínima requerida son {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>A altura da imaxe é demasiado grande ({{ height }}px). A altura máxima permitida son {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>A altura da imaxe é demasiado pequena ({{ height }}px). A altura mínima requerida son {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Este valor debería ser a contrasinal actual do usuario.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Este valor debería ter exactamente {{ limit }} carácter.|Este valor debería ter exactamente {{ limit }} caracteres.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>O arquivo foi só subido parcialmente.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Non se subiu ningún arquivo.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Ningunha carpeta temporal foi configurada en php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Non se puido escribir o arquivo temporal no disco.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Unha extensión de PHP provocou que a subida fallara.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Esta colección debe conter {{ limit }} elemento ou máis.|Esta colección debe conter {{ limit }} elementos ou máis.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Esta colección debe conter {{ limit }} elemento ou menos.|Esta colección debe conter {{ limit }} elementos ou menos.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Esta colección debe conter exactamente {{ limit }} elemento.|Esta colección debe conter exactamente {{ limit }} elementos.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Número de tarxeta non válido.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipo de tarxeta non soportado ou número de tarxeta non válido.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Este valor non é un International Bank Account Number (IBAN) válido.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Este valor non é un ISBN-10 válido.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Este valor non é un ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Este valor non é nin un ISBN-10 válido nin un ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Este valor non é un ISSN válido.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Este valor non é unha moeda válida.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Este valor debería ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Este valor debería ser maior que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Este valor debería ser maior ou igual que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor debería ser identico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Este valor debería ser menor que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Este valor debería ser menor ou igual que {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Este valor non debería ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor non debería ser identico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK a�\�ժN@@Ipear/Symfony/Component/Validator/Resources/translations/validators.nl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Deze waarde mag niet waar zijn.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Deze waarde moet waar zijn.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Deze waarde moet van het type {{ type }} zijn.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Deze waarde moet leeg zijn.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>De geselecteerde waarde is geen geldige optie.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Selecteer ten minste {{ limit }} optie.|Selecteer ten minste {{ limit }} opties.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Selecteer maximaal {{ limit }} optie.|Selecteer maximaal {{ limit }} opties.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Eén of meer van de ingegeven waarden zijn ongeldig.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>De velden {{ fields }} werden niet verwacht.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>De velden {{ fields }} ontbreken.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Deze waarde is geen geldige datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Deze waarde is geen geldige datum en tijd.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Deze waarde is geen geldig e-mailadres.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Het bestand is niet gevonden.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Het bestand is niet leesbaar.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Het bestand is te groot ({{ size }} {{ suffix }}). Toegestane maximum grootte is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Het mime type van het bestand is ongeldig ({{ type }}). Toegestane mime types zijn {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Deze waarde moet {{ limit }} of minder zijn.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Deze waarde is te lang. Hij mag maximaal {{ limit }} teken bevatten.|Deze waarde is te lang. Hij mag maximaal {{ limit }} tekens bevatten.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Deze waarde moet {{ limit }} of meer zijn.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Deze waarde is te kort. Hij moet tenminste {{ limit }} teken bevatten.|Deze waarde is te kort. Hij moet tenminste {{ limit }} tekens bevatten.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Deze waarde mag niet leeg zijn.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Deze waarde mag niet null zijn.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Deze waarde moet null zijn.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Deze waarde is ongeldig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Deze waarde is geen geldige tijd.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Deze waarde is geen geldige URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>De twee waarden moeten gelijk zijn.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Het bestand is te groot. Toegestane maximum grootte is {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Het bestand is te groot.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Het bestand kon niet geüpload worden.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Deze waarde moet een geldig getal zijn.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Dit bestand is geen geldige afbeelding.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Dit is geen geldig IP-adres.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Deze waarde representeert geen geldige taal.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Deze waarde representeert geen geldige lokalisering.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Deze waarde representeert geen geldig land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Deze waarde wordt al gebruikt.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>De grootte van de afbeelding kon niet bepaald worden.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>De afbeelding is te breed ({{ width }}px). De maximaal toegestane breedte is {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>De afbeelding is niet breed genoeg ({{ width }}px). De minimaal verwachte breedte is {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>De afbeelding is te hoog ({{ height }}px). De maximaal toegestane hoogte is {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>De afbeelding is niet hoog genoeg ({{ height }}px). De minimaal verwachte hoogte is {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Deze waarde moet het huidige wachtwoord van de gebruiker zijn.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Deze waarde moet exact {{ limit }} tekens lang zijn.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Het bestand is niet geheel geüpload.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Er is geen bestand geüpload.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Er is geen tijdelijke map geconfigureerd in php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Kan het tijdelijke bestand niet wegschrijven op disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>De upload is mislukt vanwege een PHP-extensie.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Deze collectie moet {{ limit }} element of meer bevatten.|Deze collectie moet {{ limit }} elementen of meer bevatten.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Deze collectie moet {{ limit }} element of minder bevatten.|Deze collectie moet {{ limit }} elementen of minder bevatten.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Deze collectie moet exact {{ limit }} element bevatten.|Deze collectie moet exact {{ limit }} elementen bevatten.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ongeldig creditcardnummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Niet-ondersteund type creditcard of ongeldig nummer.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Dit is geen geldig internationaal bankrekeningnummer (IBAN).</target>
            </trans-unit>
             <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Deze waarde is geen geldige ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Deze waarde is geen geldige ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Deze waarde is geen geldige ISBN-10 of ISBN-13 waarde.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Deze waarde is geen geldige ISSN waarde.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Deze waarde is geen geldige valuta.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Deze waarde moet gelijk zijn aan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Deze waarde moet groter zijn dan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Deze waarde moet groter dan of gelijk aan {{ compared_value }} zijn.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical  to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Deze waarde moet identiek zijn aan {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Deze waarde moet minder zijn dan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Deze waarde moet minder dan of gelijk aan {{ compared_value }} zijn.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Deze waarde mag niet gelijk zijn aan {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value }}.</source>
                <target>Deze waarde mag niet identiek zijn aan {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK a�\e]߭A�ANpear/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Вредност треба да буде нетачна.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Вредност треба да буде тачна.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Вредност треба да буде типа {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Вредност треба да буде празна.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Вредност треба да буде једна од понуђених.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Изаберите бар {{ limit }} могућност.|Изаберите бар {{ limit }} могућности.|Изаберите бар {{ limit }} могућности.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Изаберите највише {{ limit }} могућност.|Изаберите највише {{ limit }} могућности.|Изаберите највише {{ limit }} могућности.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Једна или више вредности је невалидна.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Поља {{ fields }} нису била очекивана.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Поља {{ fields }} недостају.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Вредност није валидан датум.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Вредност није валидан датум-време.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Вредност није валидна адреса електронске поште.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Датотека не може бити пронађена.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Датотека није читљива.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Датотека је превелика ({{ size }} {{ suffix }}). Највећа дозвољена величина је {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Миме тип датотеке није валидан ({{ type }}). Дозвољени миме типови су {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Вредност треба да буде {{ limit }} или мање.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Вредност је предугачка. Треба да има {{ limit }} карактер или мање.|Вредност је предугачка. Треба да има {{ limit }} карактера или мање.|Вредност је предугачка. Треба да има {{ limit }} карактера или мање.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Вредност треба да буде {{ limit }} или више.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Вредност је прекратка. Треба да има {{ limit }} карактер или више.|Вредност је прекратка. Треба да има {{ limit }} карактера или више.|Вредност је прекратка. Треба да има {{ limit }} карактера или више.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Вредност не треба да буде празна.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Вредност не треба да буде null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Вредност треба да буде null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Вредност је невалидна.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Вредност није валидно време.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Вредност није валидан URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Обе вредности треба да буду једнаке.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Датотека је превелика. Највећа дозвољена величина је {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Датотека је превелика.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Датотека не може бити отпремљена.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Вредност треба да буде валидан број.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ова датотека није валидна слика.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Ово није валидна ИП адреса.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Вредност није валидан језик.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Вредност није валидан локал.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Вредност није валидна земља.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Вредност је већ искоришћена.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Величина слике не може бити одређена.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Ширина слике је превелика ({{ width }}px). Најећа дозвољена ширина је {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Ширина слике је премала ({{ width }}px). Најмања дозвољена ширина је {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Висина слике је превелика ({{ height }}px). Најећа дозвољена висина је {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Висина слике је премала ({{ height }}px). Најмања дозвољена висина је {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Вредност треба да буде тренутна корисничка лозинка.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Вредност треба да има тачно {{ limit }} карактер.|Вредност треба да има тачно {{ limit }} карактера.|Вредност треба да има тачно {{ limit }} карактера.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Датотека је само парцијално отпремљена.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Датотека није отпремљена.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Привремени директоријум није конфигурисан у php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Немогуће писање привремене датотеке на диск.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP екстензија је проузроковала неуспех отпремања датотеке.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ова колекција треба да садржи {{ limit }} или више елемената.|Ова колекција треба да садржи {{ limit }} или више елемената.|Ова колекција треба да садржи {{ limit }} или више елемената.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ова колекција треба да садржи {{ limit }} или мање елемената.|Ова колекција треба да садржи {{ limit }} или мање елемената.|Ова колекција треба да садржи {{ limit }} или мање елемената.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ова колекција треба да садржи тачно {{ limit }} елемент.|Ова колекција треба да садржи тачно {{ limit }} елемента.|Ова колекција треба да садржи тачно {{ limit }} елемената.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Невалидан број картице.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Невалидан број картице или тип картице није подржан.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Ово није валидан међународни број банковног рачуна (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ово није валидан ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ово није валидан ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ово није валидан ISBN-10 или ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ово није валидан ISSN.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK!a�\�m�w�B�BIpear/Symfony/Component/Validator/Resources/translations/validators.pl.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Ta wartość powinna być fałszem.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Ta wartość powinna być prawdą.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Ta wartość powinna być typu {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Ta wartość powinna być pusta.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Ta wartość powinna być jedną z podanych opcji.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Powinieneś wybrać co najmniej {{ limit }} opcję.|Powinieneś wybrać co najmniej {{ limit }} opcje.|Powinieneś wybrać co najmniej {{ limit }} opcji.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Powinieneś wybrać maksymalnie {{ limit }} opcję.|Powinieneś wybrać maksymalnie {{ limit }} opcje.|Powinieneś wybrać maksymalnie {{ limit }} opcji.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Jedna lub więcej z podanych wartości jest nieprawidłowa.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Pola {{ fields }} nie były oczekiwane.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Brakuje pól {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ta wartość nie jest prawidłową datą.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ta wartość nie jest prawidłową datą i czasem.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ta wartość nie jest prawidłowym adresem email.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Plik nie mógł zostać odnaleziony.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Nie można odczytać pliku.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Plik jest za duży ({{ size }} {{ suffix }}). Maksymalny dozwolony rozmiar to {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Nieprawidłowy typ mime pliku ({{ type }}). Dozwolone typy mime to {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Ta wartość powinna wynosić {{ limit }} lub mniej.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Ta wartość jest zbyt długa. Powinna mieć {{ limit }} lub mniej znaków.|Ta wartość jest zbyt długa. Powinna mieć {{ limit }} lub mniej znaków.|Ta wartość jest zbyt długa. Powinna mieć {{ limit }} lub mniej znaków.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Ta wartość powinna wynosić {{ limit }} lub więcej.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Ta wartość jest zbyt krótka. Powinna mieć {{ limit }} lub więcej znaków.|Ta wartość jest zbyt krótka. Powinna mieć {{ limit }} lub więcej znaków.|Ta wartość jest zbyt krótka. Powinna mieć {{ limit }} lub więcej znaków.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ta wartość nie powinna być pusta.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ta wartość nie powinna być nullem.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ta wartość powinna być nullem.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Ta wartość jest nieprawidłowa.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ta wartość nie jest prawidłowym czasem.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ta wartość nie jest prawidłowym adresem URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Obie wartości powinny być równe.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Plik jest za duży. Maksymalny dozwolony rozmiar to {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Plik jest za duży.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Plik nie mógł być wgrany.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ta wartość powinna być prawidłową liczbą.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ten plik nie jest obrazem.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>To nie jest prawidłowy adres IP.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Ta wartość nie jest prawidłowym językiem.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Ta wartość nie jest prawidłową lokalizacją.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Ta wartość nie jest prawidłową nazwą kraju.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ta wartość jest już wykorzystywana.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Nie można wykryć rozmiaru obrazka.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Szerokość obrazka jest zbyt duża ({{ width }}px). Maksymalna dopuszczalna szerokość to {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Szerokość obrazka jest zbyt mała ({{ width }}px). Oczekiwana minimalna szerokość to {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Wysokość obrazka jest zbyt duża ({{ height }}px). Maksymalna dopuszczalna wysokość to {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Wysokość obrazka jest zbyt mała ({{ height }}px). Oczekiwana minimalna wysokość to {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Ta wartość powinna być aktualnym hasłem użytkownika.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ta wartość powinna mieć dokładnie {{ limit }} znak.|Ta wartość powinna mieć dokładnie {{ limit }} znaki.|Ta wartość powinna mieć dokładnie {{ limit }} znaków.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Plik został wgrany tylko częściowo.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Żaden plik nie został wgrany.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Nie skonfigurowano folderu tymczasowego w php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nie można zapisać pliku tymczasowego na dysku.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Rozszerzenie PHP spowodowało błąd podczas wgrywania.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ten zbiór powinien zawierać {{ limit }} lub więcej elementów.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ten zbiór powinien zawierać {{ limit }} lub mniej elementów.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ten zbiór powinien zawierać dokładnie {{ limit }} element.|Ten zbiór powinien zawierać dokładnie {{ limit }} elementy.|Ten zbiór powinien zawierać dokładnie {{ limit }} elementów.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Nieprawidłowy numer karty.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nieobsługiwany rodzaj karty lub nieprawidłowy numer karty.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Nieprawidłowy międzynarodowy numer rachunku bankowego (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ta wartość nie jest prawidłowym numerem ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ta wartość nie jest prawidłowym numerem ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ta wartość nie jest prawidłowym numerem ISBN-10 ani ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ta wartość nie jest prawidłowym numerem ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Ta wartość nie jest prawidłową walutą.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ta wartość powinna być równa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ta wartość powinna być większa niż {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ta wartość powinna być większa bądź równa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ta wartość powinna być identycznego typu {{ compared_value_type }} oraz wartości {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ta wartość powinna być mniejsza niż {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ta wartość powinna być mniejsza bądź równa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ta wartość nie powinna być równa {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ta wartość nie powinna być identycznego typu {{ compared_value_type }} oraz wartości {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK!a�\q�b�?�?Ipear/Symfony/Component/Validator/Resources/translations/validators.lb.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Dëse Wäert sollt falsch sinn.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Dëse Wäert sollt wouer sinn.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Dëse Wäert sollt vum Typ {{ type }} sinn.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Dëse Wäert sollt eidel sinn.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Dëse Wäert sollt enger vun de Wielméiglechkeeten entspriechen.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Dir sollt mindestens {{ limit }} Méiglechkeete wielen.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Dir sollt héchstens {{ limit }} Méiglechkeete wielen.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Een oder méi vun de Wäerter ass ongëlteg.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>D'Felder {{ fields }} goufen net erwaart.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>D'Felder {{ fields }} feelen.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Dëse Wäert entsprécht kenger gëlteger Datumsangab.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Dëse Wäert entsprécht kenger gëlteger Datums- an Zäitangab.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Dëse Wäert ass keng gëlteg Email-Adress.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>De Fichier gouf net fonnt.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>De Fichier ass net liesbar.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>De Fichier ass ze grouss ({{ size }} {{ suffix }}). Déi zougeloosse Maximalgréisst bedréit {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Den Typ vum Fichier ass ongëlteg ({{ type }}). Erlaabten Type sinn {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Dëse Wäert soll méi kleng oder gläich {{ limit }} sinn.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Dës Zeecheketten ass ze laang. Se sollt héchstens {{ limit }} Zeechen hunn.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Dëse Wäert sollt méi grouss oder gläich {{ limit }} sinn.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Dës Zeecheketten ass ze kuerz. Se sollt mindestens {{ limit }} Zeechen hunn.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Dëse Wäert sollt net eidel sinn.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Dëst sollt keen Null-Wäert sinn.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Dëst sollt keen Null-Wäert sinn.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Dëse Wäert ass net gëlteg.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Dëse Wäert entsprécht kenger gëlteger Zäitangab.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Dëse Wäert ass keng gëlteg URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Béid Wäerter sollten identesch sinn.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>De fichier ass ze grouss. Déi maximal Gréisst dierf {{ limit }} {{ suffix }} net depasséieren.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>De Fichier ass ze grouss.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>De Fichier konnt net eropgeluede ginn.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Dëse Wäert sollt eng gëlteg Zuel sinn.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Dëse Fichier ass kee gëltegt Bild.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Dëst ass keng gëlteg IP-Adress.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Dëse Wäert aentsprécht kenger gëlteger Sprooch.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Dëse Wäert entsprécht kengem gëltege Gebittsschema.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Dëse Wäert entsprécht kengem gëltege Land.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Dëse Wäert gëtt scho benotzt.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>D'Gréisst vum Bild konnt net detektéiert ginn.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>D'Breet vum Bild ass ze grouss ({{ width }}px). Déi erlaabte maximal Breet ass {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>D'Breet vum Bild ass ze kleng ({{ width }}px). Déi minimal Breet ass {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>D'Héicht vum Bild ass ze grouss ({{ height }}px). Déi erlaabte maximal Héicht ass {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>D'Héicht vum Bild ass ze kleng ({{ height }}px). Déi minimal Héicht ass {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Dëse Wäert sollt dem aktuelle Benotzerpasswuert entspriechen.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Dëse Wäert sollt exactly {{ limit }} Buschtaf hunn.|Dëse Wäert sollt exakt {{ limit }} Buschtawen hunn.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>De Fichier gouf just deelweis eropgelueden.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Et gouf kee Fichier eropgelueden.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Et gouf keen temporären Dossier an der php.ini konfiguréiert.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Den temporäre Fichier kann net gespäichert ginn.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Eng PHP-Erweiderung huet den Upload verhënnert.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Dës Sammlung sollt {{ limit }} oder méi Elementer hunn.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Dës Sammlung sollt {{ limit }} oder manner Elementer hunn.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Dës Sammlung sollt exakt {{ limit }} Element hunn.|Dës Sammlung sollt exakt {{ limit }} Elementer hunn.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Ongëlteg Kaartennummer.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Net ënnerstëtzte Kaartentyp oder ongëlteg Kaartennummer.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Dëst ass keng gëlteg IBAN-Kontonummer.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Dëse Wäert ass keng gëlteg ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Dëse Wäert ass keng gëlteg ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Dëse Wäert ass weder eng gëlteg ISBN-10 nach eng gëlteg ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Dëse Wäert ass keng gëlteg ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Dëse Wäert ass keng gëlteg Währung.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Dëse Wäert sollt {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Dëse Wäert sollt méi grouss wéi {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Dëse Wäert sollt méi grouss wéi oder gläich {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Dëse Wäert sollt identesch si mat {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Dëse Wäert sollt méi kleng wéi {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Dëse Wäert sollt méi kleng wéi oder gläich {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Dëse Wäert sollt net {{ compared_value }} sinn.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Dëse Wäert sollt net identesch si mat {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK"a�\<��bKKIpear/Symfony/Component/Validator/Resources/translations/validators.bg.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Стойността трябва да бъде лъжа (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Стойността трябва да бъде истина (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Стойността трябва да бъде от тип {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Стойността трябва да бъде празна.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Избраната стойност е невалидна.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Трябва да изберете поне {{ limit }} опция.|Трябва да изберете поне {{ limit }} опции.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Трябва да изберете най-много {{ limit }} опция.|Трябва да изберете най-много {{ limit }} опции.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Една или повече от зададените стойности е невалидна.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Полетата {{ fields }} не бяха очаквани.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Полетата {{ fields }} липсват.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Стойността не е валидна дата (date).</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Стойността не е валидна дата (datetime).</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Стойността не е валиден email адрес.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Файлът не беше открит.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Файлът не може да бъде прочетен.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файлът е твърде голям ({{ size }} {{ suffix }}). Максималният размер е {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Майм типа на файла е невалиден ({{ type }}). Разрешени майм типове са {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Стойността трябва да бъде {{ limit }} или по-малко.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Стойността е твърде дълга. Трябва да съдържа най-много {{ limit }} символ.|Стойността е твърде дълга. Трябва да съдържа най-много {{ limit }} символа.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Стойността трябва да бъде {{ limit }} или повече.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Стойността е твърде кратка. Трябва да съдържа поне {{ limit }} символ.|Стойността е твърде кратка. Трябва да съдържа поне {{ limit }} символа.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Стойността не трябва да бъде празна.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Стойността не трябва да бъде null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Стойността трябва да бъде null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Стойността не е валидна.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Стойността не е валидно време (time).</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Стойността не е валиден URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Двете стойности трябва да бъдат равни.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Файлът е твърде голям. Разрешеният максимален размер е {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Файлът е твърде голям.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Файлът не може да бъде качен.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Стойността трябва да бъде валиден номер.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Файлът не е валидно изображение.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Това не е валиден IP адрес.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Стойността не е валиден език.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Стойността не е валидна локализация.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Стойността не е валидна държава.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Стойността вече е в употреба.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Размера на изображението не може да бъде определен.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Изображението е твърде широко ({{ width }}px). Широчината трябва да бъде максимум {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Изображението е с твърде малка широчина ({{ width }}px). Широчината трябва да бъде минимум {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Изображението е с твърде голяма височина ({{ height }}px). Височината трябва да бъде максимум {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Изображението е с твърде малка височина ({{ height }}px). Височина трябва да бъде минимум {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Стойността трябва да бъде текущата потребителска парола.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Стойността трябва да бъде точно {{ limit }} символ.|Стойността трябва да бъде точно {{ limit }} символа.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Файлът е качен частично.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Файлът не беше качен.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Не е посочена директория за временни файлове в php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Не може да запише временен файл на диска.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP разширение предизвика прекъсване на качването.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Колекцията трябва да съдържа поне {{ limit }} елемент.|Колекцията трябва да съдържа поне {{ limit }} елемента.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Колекцията трябва да съдържа най-много {{ limit }} елемент.|Колекцията трябва да съдържа най-много {{ limit }} елемента.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Колекцията трябва да съдържа точно {{ limit }} елемент.|Колекцията трябва да съдържа точно {{ limit }} елемента.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Невалиден номер на картата.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Неподдържан тип карта или невалиден номер на картата.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Невалиден Международен номер на банкова сметка (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Невалиден ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Невалиден ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Невалидна стойност както за ISBN-10, така и за ISBN-13 .</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Невалиден Международен стандартен сериен номер (ISSN).</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Невалидна валута.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Стойността трябва да бъде равна на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Стойността трябва да бъде по-голяма от {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Стойността трябва да бъде по-голяма или равна на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Стойността трябва да бъде идентична с {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Стойността трябва да бъде по-малка {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Стойността трябва да бъде по-малка или равна на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Стойността не трябва да бъде равна на {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Стойността не трябва да бъде идентична с {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK#a�\���AAIpear/Symfony/Component/Validator/Resources/translations/validators.ja.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>falseでなければなりません。</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>trueでなければなりません。</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>型は{{ type }}でなければなりません。</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>空でなければなりません。</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>有効な選択肢ではありません。</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>{{ limit }}個以上選択してください。</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>{{ limit }}個以内で選択してください。</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>無効な選択肢が含まれています。</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>フィールド{{ fields }}は無効です。</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>フィールド{{ fields }}は必須です。</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>有効な日付ではありません。</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>有効な日時ではありません。</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>有効なメールアドレスではありません。</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>ファイルが見つかりません。</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>ファイルを読み込めません。</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>ファイルのサイズが大きすぎます({{ size }} {{ suffix }})。有効な最大サイズは{{ limit }} {{ suffix }}です。</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>ファイルのMIMEタイプが無効です({{ type }})。有効なMIMEタイプは{{ types }}です。</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>{{ limit }}以下でなければなりません。</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>値が長すぎます。{{ limit }}文字以内でなければなりません。</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>{{ limit }}以上でなければなりません。</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>値が短すぎます。{{ limit }}文字以上でなければなりません。</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>空であってはなりません。</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>nullであってはなりません。</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>nullでなければなりません。</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>有効な値ではありません。</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>有効な時刻ではありません。</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>有効なURLではありません。</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>2つの値が同じでなければなりません。</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>ファイルのサイズが大きすぎます。有効な最大サイズは{{ limit }} {{ suffix }}です。</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>ファイルのサイズが大きすぎます。</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>ファイルをアップロードできませんでした。</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>有効な数字ではありません。</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>ファイルが画像ではありません。</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>有効なIPアドレスではありません。</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>有効な言語名ではありません。</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>有効なロケールではありません。</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>有効な国名ではありません。</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>既に使用されています。</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>画像のサイズが検出できません。</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>画像の幅が大きすぎます({{ width }}ピクセル)。{{ max_width }}ピクセルまでにしてください。</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>画像の幅が小さすぎます({{ width }}ピクセル)。{{ min_width }}ピクセル以上にしてください。</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>画像の高さが大きすぎます({{ height }}ピクセル)。{{ max_height }}ピクセルまでにしてください。</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>画像の高さが小さすぎます({{ height }}ピクセル)。{{ min_height }}ピクセル以上にしてください。</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>ユーザーの現在のパスワードでなければなりません。</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>ちょうど{{ limit }}文字でなければなりません。</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>ファイルのアップロードは完全ではありません。</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>ファイルがアップロードされていません。</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>php.iniで一時フォルダが設定されていません。</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>一時ファイルをディスクに書き込むことができません。</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP拡張によってアップロードに失敗しました。</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>{{ limit }}個以上の要素を含んでなければいけません。</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>要素は{{ limit }}個までです。</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>要素はちょうど{{ limit }}個でなければなりません。</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>無効なカード番号です。</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>未対応のカード種類又は無効なカード番号です。</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>有効なIBANコードではありません。</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>有効なISBN-10コードではありません。</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>有効なISBN-13コードではありません。</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>有効なISBN-10コード又はISBN-13コードではありません。</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>有効なISSNコードではありません。</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>有効な貨幣ではありません。</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>{{ compared_value }}と等しくなければなりません。</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>{{ compared_value }}より大きくなければなりません。</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>{{ compared_value }}以上でなければなりません。</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>{{ compared_value_type }}としての{{ compared_value }}と等しくなければなりません。</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>{{ compared_value }}未満でなければなりません。</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>{{ compared_value }}以下でなければなりません。</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>{{ compared_value }}と等しくてはいけません。</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>{{ compared_value_type }}としての{{ compared_value }}と等しくてはいけません。</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK#a�\Y�.3�5�5Ipear/Symfony/Component/Validator/Resources/translations/validators.sq.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Kjo vlerë duhet të jetë e pavërtetë (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Kjo vlerë duhet të jetë e vërtetë (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Kjo vlerë duhet të jetë e llojit {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Kjo vlerë duhet të jetë e zbrazët.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Vlera që keni zgjedhur nuk është alternativë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Duhet të zgjedhni së paku {{ limit }} alternativa.|Duhet të zgjedhni së paku {{ limit }} alternativa.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Duhet të zgjedhni më së shumti {{ limit }} alternativa.|Duhet të zgjedhni më së shumti {{ limit }} alternativa.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Një apo më shumë nga vlerat e dhëna nuk janë të sakta.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Fushat {{ fields }} nuk ishin të pritura.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Fushat {{ fields }} mungojnë.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Kjo vlerë nuk është datë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Kjo vlerë nuk është datë-kohë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Kjo vlerë nuk është e-mail adresë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>File nuk mund të gjindej.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>File nuk është i lexueshëm.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>File është shumë i madh ({{ size }} {{ suffix }}). Madhësia më e madhe e lejuar është {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Lloji mime i files nuk është i vlefshëm ({{ type }}). Llojet mime të lejuara janë {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Kjo vlerë duhet të jetë {{ limit }} ose më pak.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Kjo vlerë është shumë e gjatë. Duhet t'i ketë {{ limit }} ose më pak karaktere.|Kjo vlerë është shumë e gjatë. Duhet t'i ketë {{ limit }} ose më pak karaktere.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Kjo vlerë duhet të jetë {{ limit }} ose më shumë.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Kjo vlerë është shumë e shkurtër. Duhet t'i ketë {{ limit }} ose më shumë karaktere.|Kjo vlerë është shumë e shkurtër. Duhet t'i ketë {{ limit }} ose më shumë karaktere.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Kjo vlerë nuk duhet të jetë e zbrazët.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Kjo vlerë nuk duhet të jetë null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Kjo vlerë duhet të jetë null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Kjo vlerë nuk është e vlefshme.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Kjo vlerë nuk është kohë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Kjo vlerë nuk është URL e vlefshme.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Këto dy vlera duhet të jenë të barabarta.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Ky file është shumë i madh. Madhësia maksimale e lejuar është {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Ky file është shumë i madh.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Ky file nuk mund të ngarkohet.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Kjo vlerë duhet të jetë numër i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Ky file nuk është imazh i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Kjo vlerë nuk është IP adresë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Kjo vlerë nuk është gjuhë e vlefshme.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Kjo vlerë nuk është përcaktim rajonal i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Kjo vlerë nuk është shtet i vlefshëm.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Kjo vlerë është tashmë në përdorim.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Madhësia e këtij imazhi nuk mund të zbulohet.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Gjerësia e imazhit është shumë e madhe ({{ width }}px). Gjerësia maksimale e lejuar është {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Gjerësia e imazhit është shumë e vogël ({{ width }}px). Gjerësia minimale e pritur është {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Gjatësia e imazhit është shumë e madhe ({{ height }}px). Gjatësia maksimale e lejuar është {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Gjatësia e imazhit është shumë e vogël ({{ height }}px). Gjatësia minimale e pritur është {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Kjo vlerë duhet të jetë fjalëkalimi aktual i përdoruesit.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Kjo vlerë duhet të ketë saktësisht {{ limit }} karaktere.|Kjo vlerë duhet të ketë saktësisht {{ limit }} karaktere.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Ky file është ngarkuar pjesërisht.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nuk është ngarkuar ndonjë file.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Asnjë folder i përkohshëm nuk është konfiguruar në php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nuk mund të shkruhet file i përkohshëm në disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Një ekstenzion i PHP-së bëri të dështojë ngarkimi i files.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Ky kolekcion duhet të përmbajë {{ limit }} ose më shumë elemente.|Ky kolekcion duhet të përmbajë {{ limit }} ose më shumë elemente.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Ky kolekcion duhet të përmbajë {{ limit }} ose më shumë elemente.|Ky kolekcion duhet të përmbajë {{ limit }} ose më shumë elemente.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Ky kolekcion duhet të përmbajë saktësisht {{ limit }} elemente.|Ky kolekcion duhet të përmbajë saktësisht {{ limit }} elemente.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Numër kartele i pavlefshëm.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Lloj kartele i pambështetur ose numër kartele i pavlefshëm.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK$a�\(�eeIpear/Symfony/Component/Validator/Resources/translations/validators.nb.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Verdien skal være falsk.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Verdien skal være sann.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Verdien skal være av typen {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Verdien skal være blank.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Verdien skal være en av de gitte valg.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Du skal velge minst {{ limit }} valg.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Du kan maks velge {{ limit }} valg.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>En eller flere av de oppgitte verdier er ugyldige.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Feltene {{ fields }} var ikke forventet.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Feltene {{ fields }} mangler.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Verdien er ikke en gyldig dato.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Verdien er ikke en gyldig dato og tid.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Verdien er ikke en gyldig e-mail adresse.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Filen kunne ikke finnes.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Filen kan ikke leses.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen er for stor ({{ size }} {{ suffix }}). Tilatte maksimale størrelse {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Mimetypen av filen er ugyldig ({{ type }}). Tilatte mimetyper er {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Verdien skal være {{ limit }} eller mindre.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Verdien er for lang. Den skal ha {{ limit }} bokstaver eller mindre.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Verdien skal være {{ limit }} eller mer.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Verdien er for kort. Den skal ha {{ limit }} tegn eller flere.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Verdien må ikke være blank.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Verdien må ikke være tom (null).</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Verdien skal være tom (null).</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Verdien er ikke gyldig.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Verdien er ikke en gyldig tid.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Verdien er ikke en gyldig URL.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>De to verdier skal være ens.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Filen er for stor. Den maksimale størrelse er {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Filen er for stor.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Filen kunne ikke lastes opp.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Denne verdi skal være et gyldig tall.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Denne filen er ikke et gyldig bilde.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Dette er ikke en gyldig IP adresse.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Denne verdi er ikke et gyldig språk.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Denne verdi er ikke en gyldig lokalitet.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Denne verdi er ikke et gyldig land.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK$a�\	�)�B�BIpear/Symfony/Component/Validator/Resources/translations/validators.cs.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Tato hodnota musí být nepravdivá (false).</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Tato hodnota musí být pravdivá (true).</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Tato hodnota musí být typu {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Tato hodnota musí být prázdná.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Vybraná hodnota není platnou možností.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Musí být vybrána nejméně {{ limit }} možnost.|Musí být vybrány nejméně {{ limit }} možnosti.|Musí být vybráno nejméně {{ limit }} možností.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Musí být vybrána maximálně {{ limit }} možnost.|Musí být vybrány maximálně {{ limit }} možnosti.|Musí být vybráno maximálně {{ limit }} možností.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Některé z uvedených hodnot jsou neplatné.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Neočekávaná pole {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Chybí následující pole {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Tato hodnota není platné datum.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Tato hodnota není platné datum s časovým údajem.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Tato hodnota není platná e-mailová adresa.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Soubor nebyl nalezen.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Soubor je nečitelný.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Soubor je příliš velký ({{ size }} {{ suffix }}). Maximální povolená velikost souboru je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Neplatný mime typ souboru ({{ type }}). Povolené mime typy souborů jsou {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Tato hodnota musí být {{ limit }} nebo méně.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Tato hodnota je příliš dlouhá. Musí obsahovat maximálně {{ limit }} znak.|Tato hodnota je příliš dlouhá. Musí obsahovat maximálně {{ limit }} znaky.|Tato hodnota je příliš dlouhá. Musí obsahovat maximálně {{ limit }} znaků.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Tato hodnota musí být {{ limit }} nebo více.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Tato hodnota je příliš krátká. Musí obsahovat minimálně {{ limit }} znak.|Tato hodnota je příliš krátká. Musí obsahovat minimálně {{ limit }} znaky.|Tato hodnota je příliš krátká. Musí obsahovat minimálně {{ limit }} znaků.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Tato hodnota nesmí být prázdná.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Tato hodnota nesmí být prázdná.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Tato hodnota musí být prázdná.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Tato hodnota není platná.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Tato hodnota není platný časový údaj.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Tato hodnota není platná URL adresa.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Tyto dvě hodnoty musí být stejné.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Soubor je příliš velký. Maximální povolená velikost souboru je {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Soubor je příliš velký.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Soubor se nepodařilo nahrát.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Tato hodnota musí být číslo.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Tento soubor není obrázek.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Toto není platná IP adresa.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Tento jazyk neexistuje.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Tato lokalizace neexistuje.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Tato země neexistuje.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Tato hodnota je již používána.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Nepodařily se zjistit rozměry obrázku.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Obrázek je příliš široký ({{ width }}px). Maximální povolená šířka obrázku je {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Obrázek je příliš úzký ({{ width }}px). Minimální šířka musí být {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Obrázek je příliš vysoký ({{ height }}px). Maximální povolená výška obrázku je {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Obrázek je příliš nízký ({{ height }}px). Minimální výška obrázku musí být {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Tato hodnota musí být aktuální heslo uživatele.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Tato hodnota musí mít přesně {{ limit }} znak.|Tato hodnota musí mít přesně {{ limit }} znaky.|Tato hodnota musí mít přesně {{ limit }} znaků.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Byla nahrána jen část souboru.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Žádný soubor nebyl nahrán.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>V php.ini není nastavena cesta k adresáři pro dočasné soubory.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Dočasný soubor se nepodařilo zapsat na disk.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Rozšíření PHP zabránilo nahrání souboru.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Tato kolekce musí obsahovat minimálně {{ limit }} prvek.|Tato kolekce musí obsahovat minimálně {{ limit }} prvky.|Tato kolekce musí obsahovat minimálně {{ limit }} prvků.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Tato kolekce musí obsahovat maximálně {{ limit }} prvek.|Tato kolekce musí obsahovat maximálně {{ limit }} prvky.|Tato kolekce musí obsahovat maximálně {{ limit }} prvků.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Tato kolekce musí obsahovat přesně {{ limit }} prvek.|Tato kolekce musí obsahovat přesně {{ limit }} prvky.|Tato kolekce musí obsahovat přesně {{ limit }} prvků.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Neplatné číslo karty.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Nepodporovaný typ karty nebo neplatné číslo karty.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Toto je neplatný IBAN.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Tato hodnota není platné ISBN-10.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Tato hodnota není platné ISBN-13.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Tato hodnota není platné ISBN-10 ani ISBN-13.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Tato hodnota není platné ISSN.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Tato měna neexistuje.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Tato hodnota musí být rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Tato hodnota musí být větší než {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Tato hodnota musí být větší nebo rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Tato hodnota musí být typu {{ compared_value_type }} a zároveň musí být rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Tato hodnota musí být menší než {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Tato hodnota musí být menší nebo rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Tato hodnota nesmí být rovna {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Tato hodnota nesmí být typu {{ compared_value_type }} a zároveň nesmí být rovna {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK%a�\�PhBhBIpear/Symfony/Component/Validator/Resources/translations/validators.lt.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Reikšmė turi būti neigiama.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Reikšmė turi būti teigiama.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Šios reikšmės tipas turi būti {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Ši reikšmė turi būti tuščia.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Neteisingas pasirinkimas.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Turite pasirinkti bent {{ limit }} variantą.|Turite pasirinkti bent {{ limit }} variantus.|Turite pasirinkti bent {{ limit }} variantų.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Turite pasirinkti ne daugiau kaip {{ limit }} variantą.|Turite pasirinkti ne daugiau kaip {{ limit }} variantus.|Turite pasirinkti ne daugiau kaip {{ limit }} variantų.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Viena ar daugiau įvestų reikšmių yra netinkamos.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Laukai {{ fields }} yra nenumatyti.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Trūkstami laukai {{ fields }}.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Ši reikšmė nėra data.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Ši reikšmė nera data ir laikas.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Ši reikšmė nėra tinkamas el. pašto adresas.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Byla nerasta.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Negalima nuskaityti bylos.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Byla yra per didelė ({{ size }} {{ suffix }}). Maksimalus dydis {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Netinkamas bylos tipas (mime type) ({{ type }}). Galimi bylų tipai {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Reikšmė turi būti {{ limit }} arba mažiau.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Per didelis simbolių skaičius. Turi susidaryti iš {{ limit }} arba mažiau simbolių.|Per didelis simbolių skaičius. Turi susidaryti iš {{ limit }} arba mažiau simbolių.|Per didelis simbolių skaičius. Turi susidaryti iš {{ limit }} arba mažiau simbolių.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Reikšmė turi būti {{ limit }} arba daugiau.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Per mažas simbolių skaičius. Turi susidaryti iš {{ limit }} arba daugiau simbolių.|Per mažas simbolių skaičius. Turi susidaryti iš {{ limit }} arba daugiau simbolių.|Per mažas simbolių skaičius. Turi susidaryti iš {{ limit }} arba daugiau simbolių.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Ši reikšmė negali būti tuščia.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Ši reikšmė negali būti null.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Ši reikšmė turi būti null.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Netinkama reikšmė.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Ši reikšmė nėra laikas.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Ši reikšmė nėra tinkamas interneto adresas.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Abi reikšmės turi būti identiškos.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Byla yra per didelė. Maksimalus dydis yra {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Byla per didelė.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Byla negali būti įkelta.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Ši reikšmė turi būti skaičius.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This value is not a valid country.</source>
                <target>Ši reikšmė nėra tinkama šalis.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This file is not a valid image.</source>
                <target>Byla nėra paveikslėlis.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This is not a valid IP address.</source>
                <target>Ši reikšmė nėra tinkamas IP adresas.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid language.</source>
                <target>Ši reikšmė nėra tinkama kalba.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid locale.</source>
                <target>Ši reikšmė nėra tinkama lokalė.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Ši reikšmė jau yra naudojama.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Nepavyko nustatyti nuotraukos dydžio.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Nuotraukos plotis per didelis ({{ width }}px). Maksimalus leidžiamas plotis yra {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Nuotraukos plotis per mažas ({{ width }}px). Minimalus leidžiamas plotis yra {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Nuotraukos aukštis per didelis ({{ height }}px). Maksimalus leidžiamas aukštis yra {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Nuotraukos aukštis per mažas ({{ height }}px). Minimalus leidžiamas aukštis yra {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Ši reikšmė turi sutapti su dabartiniu naudotojo slaptažodžiu.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Ši reikšmė turi turėti lygiai {{ limit }} simbolį.|Ši reikšmė turi turėti lygiai {{ limit }} simbolius.|Ši reikšmė turi turėti lygiai {{ limit }} simbolių.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Failas buvo tik dalinai įkeltas.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nebuvo įkelta jokių failų.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Nėra sukonfiguruoto jokio laikino katalogo php.ini faile.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Nepavyko išsaugoti laikino failo.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP plėtinys sutrukdė failo įkėlimą ir jis nepavyko.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Sąraše turi būti {{ limit }} arba daugiau įrašų.|Sąraše turi būti {{ limit }} arba daugiau įrašų.|Sąraše turi būti {{ limit }} arba daugiau įrašų.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Sąraše turi būti {{ limit }} arba mažiau įrašų.|Sąraše turi būti {{ limit }} arba mažiau įrašų.|Sąraše turi būti {{ limit }} arba mažiau įrašų.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Sąraše turi būti lygiai {{ limit }} įrašas.|Sąraše turi būti lygiai {{ limit }} įrašai.|Sąraše turi būti lygiai {{ limit }} įrašų.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Klaidingas kortelės numeris.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Kortelės tipas nepalaikomas arba klaidingas kortelės numeris.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Ši reišmė neatitinka tarptautinio banko sąskaitos numerio formato (IBAN).</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Ši reikšmė neatitinka ISBN-10 formato.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Ši reikšmė neatitinka ISBN-13 formato.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Ši reikšmė neatitinka nei ISBN-10, nei ISBN-13 formato.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Ši reišmė neatitinka ISSN formato.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Netinkamas valiutos formatas.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti lygi {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti didesnė už {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti didesnė už arba lygi {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti identiška {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti mažesnė už {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Ši reikšmė turi būti mažesnė už arba lygi {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Ši reikšmė neturi būti lygi {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Ši reikšmė neturi būti identiška {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK&a�\���t�A�AIpear/Symfony/Component/Validator/Resources/translations/validators.eu.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Balio hau faltsua izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Balio hau egia izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Balio hau {{ type }} motakoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Balio hau hutsik egon beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Hautatu duzun balioa ez da aukera egoki bat.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Gutxienez aukera {{ limit }} hautatu behar duzu.|Gutxienez {{ limit }} aukera hautatu behar dituzu.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Gehienez aukera {{ limit }} hautatu behar duzu.|Gehienez {{ limit }} aukera hautatu behar dituzu.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Emandako balioetatik gutxienez bat ez da egokia.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>{{ fields }} eremuak ez ziren espero.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>{{ fields }} eremuak falta dira.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Balio hau ez da data egoki bat.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Balio hau ez da data-ordu egoki bat.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Balio hau ez da posta elektroniko egoki bat.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Ezin izan da fitxategia aurkitu.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Fitxategia ez da irakurgarria.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fitxategia handiegia da ({{ size }} {{ suffix }}). Baimendutako tamaina handiena {{ limit }} {{ suffix }} da.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Fitxategiaren mime mota ez da egokia ({{ type }}). Hauek dira baimendutako mime motak: {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Balio hau gehienez {{ limit }} izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Balio hau luzeegia da. Gehienez karaktere {{ limit }} eduki beharko luke.|Balio hau luzeegia da. Gehienez {{ limit }} karaktere eduki beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Balio hau gutxienez {{ limit }} izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Balio hau motzegia da. Karaktere {{ limit }} gutxienez eduki beharko luke.|Balio hau motzegia da. Gutxienez {{ limit }} karaktere eduki beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Balio hau ez litzateke hutsik egon behar.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Balio hau ez litzateke nulua izan behar.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Balio hau nulua izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Balio hau ez da egokia.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Balio hau ez da ordu egoki bat.</target>
           </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Balio hau ez da baliabideen kokatzaile uniforme (URL) egoki bat.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Bi balioak berdinak izan beharko lirateke.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Fitxategia handiegia da. Baimendutako tamaina handiena {{ limit }} {{ suffix }} da.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Fitxategia handiegia da.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Ezin izan da fitxategia igo.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Balio hau zenbaki egoki bat izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Fitxategi hau ez da irudi egoki bat.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Honako hau ez da IP helbide egoki bat.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Balio hau ez da hizkuntza egoki bat.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Balio hau ez da kokapen egoki bat.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Balio hau ez da herrialde egoki bat.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Balio hau jadanik erabilia izan da.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Ezin izan da irudiaren tamaina detektatu.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Irudiaren zabalera handiegia da ({{ width }}px). Onartutako gehienezko zabalera {{ max_width }}px dira.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Irudiaren zabalera txikiegia da ({{ width }}px). Onartutako gutxieneko zabalera {{ min_width }}px dira.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Irudiaren altuera handiegia da ({{ height }}px). Onartutako gehienezko altuera {{ max_height }}px dira.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Irudiaren altuera txikiegia da ({{ height }}px). Onartutako gutxieneko altuera {{ min_height }}px dira.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Balio hau uneko erabiltzailearen pasahitza izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Balio honek zehazki karaktere {{ limit }} izan beharko luke.|Balio honek zehazki {{ limit }} karaktere izan beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Fitxategiaren zati bat bakarrik igo da.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Ez da fitxategirik igo.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Ez da aldi baterako karpetarik konfiguratu php.ini fitxategian.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Ezin izan da aldi baterako fitxategia diskoan idatzi.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>PHP luzapen batek igoeraren hutsa eragin du.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Bilduma honek gutxienez elementu {{ limit }} eduki beharko luke.|Bilduma honek gutxienez {{ limit }} elementu eduki beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Bilduma honek gehienez elementu {{ limit }} eduki beharko luke.|Bilduma honek gehienez {{ limit }} elementu eduki beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Bilduma honek zehazki elementu {{ limit }} eduki beharko luke.|Bilduma honek zehazki {{ limit }} elementu eduki beharko lituzke.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Txartel zenbaki baliogabea.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Txartel mota onartezina edo txartel zenbaki baliogabea.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Hau ez da baliozko banku internazionaleko kontu zenbaki (IBAN) bat.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Balio hau ez da onartutako ISBN-10 bat.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Balio hau ez da onartutako ISBN-13 bat.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Balio hau ez da onartutako ISBN-10 edo ISBN-13 bat.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Balio hau ez da onartutako ISSN bat.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Balio hau ez da baliozko moneta bat.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value }}-(r)en berbera izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value }} baino handiagoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value }}-(r)en berdina edota handiagoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value_type }} {{ compared_value }}-(r)en berbera izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value }} baino txikiagoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Balio hau {{ compared_value }}-(r)en berdina edota txikiagoa izan beharko litzateke.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Balio hau ez litzateke {{ compared_value }}-(r)en berdina izan behar.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Balio hau ez litzateke {{ compared_value_type }} {{ compared_value }}-(r)en berbera izan behar.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK&a�\�b�@�@Ipear/Symfony/Component/Validator/Resources/translations/validators.pt.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Este valor deveria ser falso.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Este valor deveria ser verdadeiro.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Este valor deveria ser do tipo {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Este valor deveria ser vazio.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>O valor selecionado não é uma opção válida.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Você deveria selecionar {{ limit }} opção no mínimo.|Você deveria selecionar {{ limit }} opções no mínimo.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Você deve selecionar, no máximo {{ limit }} opção.|Você deve selecionar, no máximo {{ limit }} opções.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Um ou mais dos valores introduzidos não são válidos.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Os campos {{ fields }} não eram esperados.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Os campos {{ fields }} estão ausentes.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Este valor não é uma data válida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Este valor não é uma data-hora válida.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Este valor não é um endereço de e-mail válido.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>O arquivo não pôde ser encontrado.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>O arquivo não pôde ser lido.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é muito grande ({{ size }} {{ suffix }}). O tamanho máximo permitido é de {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>O tipo mime do arquivo é inválido ({{ type }}). Os tipos mime permitidos são {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Este valor deveria ser {{ limit }} ou menor.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>O valor é muito longo. Deveria ter {{ limit }} caracteres ou menos.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Este valor deveria ser {{ limit }} ou mais.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>O valor é muito curto. Deveria de ter {{ limit }} caractere ou mais.|O valor é muito curto. Deveria de ter {{ limit }} caracteres ou mais.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Este valor não deveria ser branco/vazio.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Este valor não deveria ser nulo.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Este valor deveria ser nulo.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Este valor não é válido.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Este valor não é uma hora válida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Este valor não é um URL válido.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Os dois valores deveriam ser iguais.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>O arquivo é muito grande. O tamanho máximo permitido é de {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>O ficheiro é muito grande.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Não foi possível carregar o ficheiro.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Este valor deveria de ser um número válido.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Este ficheiro não é uma imagem.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Este endereço de IP não é válido.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Este valor não é uma linguagem válida.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Este valor não é um 'locale' válido.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Este valor não é um País válido.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Este valor já está a ser usado.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>O tamanho da imagem não foi detetado.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>A largura da imagem ({{ width }}px) é muito grande. A largura máxima da imagem é: {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>A largura da imagem ({{ width }}px) é muito pequena. A largura miníma da imagem é de: {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>A altura da imagem ({{ height }}px) é muito grande. A altura máxima da imagem é de: {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>A altura da imagem ({{ height }}px) é muito pequena. A altura miníma da imagem é de: {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Este valor deveria de ser a password atual do utilizador.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Este valor tem de ter exatamente {{ limit }} carateres.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Só foi enviado parte do ficheiro.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nenhum ficheiro foi enviado.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Não existe nenhum directório temporária configurado no ficheiro php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Não foi possível escrever ficheiros temporários no disco.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Uma extensão PHP causou a falha no envio.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Esta coleção deve conter {{ limit }} elemento ou mais.|Esta coleção deve conter {{ limit }} elementos ou mais.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Esta coleção deve conter {{ limit }} elemento ou menos.|Esta coleção deve conter {{ limit }} elementos ou menos.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Esta coleção deve conter exatamente {{ limit }} elemento.|Esta coleção deve conter exatamente {{ limit }} elementos.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Número de cartão inválido.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipo de cartão não suportado ou número de cartão inválido.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Este não é um Número Internacional de Conta Bancária (IBAN) válido.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Este valor não é um ISBN-10 válido.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Este valor não é um ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Este valor não é um ISBN-10 ou ISBN-13 válido.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Este valor não é um ISSN válido.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Este não é um valor monetário válido.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Este valor deve ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Este valor deve ser superior a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Este valor deve ser igual ou superior a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor deve ser idêntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Este valor deve ser inferior a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Este valor deve ser igual ou inferior a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Este valor não deve ser igual a {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Este valor não deve ser idêntico a {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK'a�\=^��::Ipear/Symfony/Component/Validator/Resources/translations/validators.it.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Questo valore dovrebbe essere falso.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Questo valore dovrebbe essere vero.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Questo valore dovrebbe essere di tipo {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Questo valore dovrebbe essere vuoto.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Questo valore dovrebbe essere una delle opzioni disponibili.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Si dovrebbe selezionare almeno {{ limit }} opzione.|Si dovrebbero selezionare almeno {{ limit }} opzioni.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Si dovrebbe selezionare al massimo {{ limit }} opzione.|Si dovrebbero selezionare al massimo {{ limit }} opzioni.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Uno o più valori inseriti non sono validi.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>I campi {{ fields }} non sono validi.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>I campi {{ fields }} sono mancanti.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Questo valore non è una data valida.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Questo valore non è una data e ora valida.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Questo valore non è un indirizzo email valido.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Non è stato possibile trovare il file.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Il file non è leggibile.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Il file è troppo grande ({{ size }} {{ suffix }}). La dimensione massima consentita è {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Il mime type del file non è valido ({{ type }}). I tipi permessi sono {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Questo valore dovrebbe essere {{ limit }} o inferiore.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Questo valore è troppo lungo. Dovrebbe essere al massimo di {{ limit }} carattere.|Questo valore è troppo lungo. Dovrebbe essere al massimo di {{ limit }} caratteri.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Questo valore dovrebbe essere {{ limit }} o superiore.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Questo valore è troppo corto. Dovrebbe essere almeno di {{ limit }} carattere.|Questo valore è troppo corto. Dovrebbe essere almeno di {{ limit }} caratteri.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Questo valore non dovrebbe essere vuoto.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Questo valore non dovrebbe essere nullo.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Questo valore dovrebbe essere nullo.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Questo valore non è valido.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Questo valore non è un'ora valida.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Questo valore non è un URL valido.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>I due valori dovrebbero essere uguali.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Il file è troppo grande. La dimensione massima è {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Il file è troppo grande.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Il file non può essere caricato.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Questo valore dovrebbe essere un numero.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Questo file non è una immagine valida.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Questo valore non è un indirizzo IP valido.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Questo valore non è una lingua valida.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Questo valore non è una impostazione regionale valida.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Questo valore non è una nazione valida.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Questo valore è già stato utilizzato.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>La dimensione dell'immagine non può essere determinata.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>La larghezza dell'immagine è troppo grande ({{ width }}px). La larghezza massima è di {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>La larghezza dell'immagine è troppo piccola ({{ width }}px). La larghezza minima è di {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>L'altezza dell'immagine è troppo grande ({{ height }}px). L'altezza massima è di {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>L'altezza dell'immagine è troppo piccola ({{ height }}px). L'altezza minima è di {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Questo valore dovrebbe essere la password attuale dell'utente.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Questo valore dovrebbe contenere esattamente {{ limit }} carattere.|Questo valore dovrebbe contenere esattamente {{ limit }} caratteri.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Il file è stato caricato solo parzialmente.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Nessun file è stato caricato.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Nessuna cartella temporanea è stata configurata nel php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Impossibile scrivere il file temporaneo sul disco.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Un'estensione PHP ha causato il fallimento del caricamento.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Questa collezione dovrebbe contenere almeno {{ limit }} elemento.|Questa collezione dovrebbe contenere almeno {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Questa collezione dovrebbe contenere massimo {{ limit }} elemento.|Questa collezione dovrebbe contenere massimo {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Questa collezione dovrebbe contenere esattamente {{ limit }} elemento.|Questa collezione dovrebbe contenere esattamente {{ limit }} elementi.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Numero di carta non valido.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Tipo di carta non supportato o numero non valido.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Questo valore non è un IBAN (International Bank Account Number) valido.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Questo valore non è un codice ISBN-10 valido.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Questo valore non è un codice ISBN-13 valido.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Questo valore non è un codice ISBN-10 o ISBN-13 valido.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Questo valore non è un codice ISSN valido.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Questo valore non è una valuta valida.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK'a�\@T'%�B�BIpear/Symfony/Component/Validator/Resources/translations/validators.vi.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>This value should be false.</source>
                <target>Giá trị này phải là sai.</target>
            </trans-unit>
            <trans-unit id="2">
                <source>This value should be true.</source>
                <target>Giá trị này phải là đúng.</target>
            </trans-unit>
            <trans-unit id="3">
                <source>This value should be of type {{ type }}.</source>
                <target>Giá trị này phải là kiểu  {{ type }}.</target>
            </trans-unit>
            <trans-unit id="4">
                <source>This value should be blank.</source>
                <target>Giá trị này phải rỗng.</target>
            </trans-unit>
            <trans-unit id="5">
                <source>The value you selected is not a valid choice.</source>
                <target>Giá trị bạn vừa chọn không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="6">
                <source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
                <target>Bạn phải chọn ít nhất {{ limit }} lựa chọn.|Bạn phải chọn ít nhất {{ limit }} lựa chọn.</target>
            </trans-unit>
            <trans-unit id="7">
                <source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
                <target>Bạn phải chọn nhiều nhất {{ limit }} lựa chọn.|Bạn phải chọn nhiều  nhất {{ limit }} lựa chọn.</target>
            </trans-unit>
            <trans-unit id="8">
                <source>One or more of the given values is invalid.</source>
                <target>Một hoặc nhiều giá trị được chọn không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="9">
                <source>The fields {{ fields }} were not expected.</source>
                <target>Trường có tên {{ fields }} không được chấp nhận.</target>
            </trans-unit>
            <trans-unit id="10">
                <source>The fields {{ fields }} are missing.</source>
                <target>Trường có tên {{ fields }} không tìm thấy.</target>
            </trans-unit>
            <trans-unit id="11">
                <source>This value is not a valid date.</source>
                <target>Giá trị không phải là ngày hợp lệ.</target>
            </trans-unit>
            <trans-unit id="12">
                <source>This value is not a valid datetime.</source>
                <target>Giá trị không phải là ngày tháng hợp lệ.</target>
            </trans-unit>
            <trans-unit id="13">
                <source>This value is not a valid email address.</source>
                <target>Giá trị này không phải là email hợp lệ.</target>
            </trans-unit>
            <trans-unit id="14">
                <source>The file could not be found.</source>
                <target>Tập tin không tìm thấy.</target>
            </trans-unit>
            <trans-unit id="15">
                <source>The file is not readable.</source>
                <target>Tập tin không thể đọc được.</target>
            </trans-unit>
            <trans-unit id="16">
                <source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Tập tin quá lớn ({{ size }} {{ suffix }}). Kích thước tối đa cho phép {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="17">
                <source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
                <target>Kiểu mime của tập tin không hợp lệ ({{ type }}). Kiểu hợp lệ là {{ types }}.</target>
            </trans-unit>
            <trans-unit id="18">
                <source>This value should be {{ limit }} or less.</source>
                <target>Giá trị phải bằng hoặc nhỏ hơn {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="19">
                <source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
                <target>Giá trị quá dài. Phải bằng hoặc ít hơn {{ limit }} kí tự.|Giá trị quá dài. Phải bằng hoặc ít hơn {{ limit }} kí tự.</target>
            </trans-unit>
            <trans-unit id="20">
                <source>This value should be {{ limit }} or more.</source>
                <target>Giá trị phải lớn hơn hoặc bằng {{ limit }}.</target>
            </trans-unit>
            <trans-unit id="21">
                <source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
                <target>Giá trị quá ngắn. Phải hơn hoặc bằng {{ limit }} kí tự.|Giá trị quá ngắn. Phải hơn hoặc bằng {{ limit }} kí tự.</target>
            </trans-unit>
            <trans-unit id="22">
                <source>This value should not be blank.</source>
                <target>Giá trị không được phép để trống.</target>
            </trans-unit>
            <trans-unit id="23">
                <source>This value should not be null.</source>
                <target>Giá trị không được phép rỗng.</target>
            </trans-unit>
            <trans-unit id="24">
                <source>This value should be null.</source>
                <target>Giá trị phải rỗng.</target>
            </trans-unit>
            <trans-unit id="25">
                <source>This value is not valid.</source>
                <target>Giá trị không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="26">
                <source>This value is not a valid time.</source>
                <target>Giá trị không phải là thời gian hợp lệ.</target>
            </trans-unit>
            <trans-unit id="27">
                <source>This value is not a valid URL.</source>
                <target>Giá trị không phải là địa chỉ URL hợp lệ.</target>
            </trans-unit>
            <trans-unit id="31">
                <source>The two values should be equal.</source>
                <target>Hai giá trị phải bằng nhau.</target>
            </trans-unit>
            <trans-unit id="32">
                <source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
                <target>Tập tin quá lớn. Kích thước tối đa cho phép là {{ limit }} {{ suffix }}.</target>
            </trans-unit>
            <trans-unit id="33">
                <source>The file is too large.</source>
                <target>Tập tin quá lớn.</target>
            </trans-unit>
            <trans-unit id="34">
                <source>The file could not be uploaded.</source>
                <target>Tập tin không thể tải lên.</target>
            </trans-unit>
            <trans-unit id="35">
                <source>This value should be a valid number.</source>
                <target>Giá trị phải là con số.</target>
            </trans-unit>
            <trans-unit id="36">
                <source>This file is not a valid image.</source>
                <target>Tập tin không phải là hình ảnh.</target>
            </trans-unit>
            <trans-unit id="37">
                <source>This is not a valid IP address.</source>
                <target>Địa chỉ IP không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="38">
                <source>This value is not a valid language.</source>
                <target>Giá trị không phải là ngôn ngữ hợp lệ.</target>
            </trans-unit>
            <trans-unit id="39">
                <source>This value is not a valid locale.</source>
                <target>Giá trị không phải là một bản địa địa phương hợp lệ.</target>
            </trans-unit>
            <trans-unit id="40">
                <source>This value is not a valid country.</source>
                <target>Giá trị không phải là nước hợp lệ.</target>
            </trans-unit>
            <trans-unit id="41">
                <source>This value is already used.</source>
                <target>Giá trị đã được sử dụng.</target>
            </trans-unit>
            <trans-unit id="42">
                <source>The size of the image could not be detected.</source>
                <target>Kích thước của hình ảnh không thể xác định.</target>
            </trans-unit>
            <trans-unit id="43">
                <source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
                <target>Chiều rộng của hình quá lớn ({{ width }}px). Chiều rộng tối đa phải là {{ max_width }}px.</target>
            </trans-unit>
            <trans-unit id="44">
                <source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
                <target>Chiều rộng của hình quá thấp ({{ width }}px). Chiều rộng tối thiểu phải là {{ min_width }}px.</target>
            </trans-unit>
            <trans-unit id="45">
                <source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
                <target>Chiều cao của hình quá cao ({{ height }}px). Chiều cao tối đa phải là {{ max_height }}px.</target>
            </trans-unit>
            <trans-unit id="46">
                <source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
                <target>Chiều cao của hình quá thấp ({{ height }}px). Chiều cao tối thiểu phải là {{ min_height }}px.</target>
            </trans-unit>
            <trans-unit id="47">
                <source>This value should be the user current password.</source>
                <target>Giá trị này phải là mật khẩu hiện tại của người dùng.</target>
            </trans-unit>
            <trans-unit id="48">
                <source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
                <target>Giá trị phải có chính xác {{ limit }} kí tự.|Giá trị phải có chính xác {{ limit }} kí tự.</target>
            </trans-unit>
            <trans-unit id="49">
                <source>The file was only partially uploaded.</source>
                <target>Tập tin chỉ được tải lên một phần.</target>
            </trans-unit>
            <trans-unit id="50">
                <source>No file was uploaded.</source>
                <target>Tập tin không được tải lên.</target>
            </trans-unit>
            <trans-unit id="51">
                <source>No temporary folder was configured in php.ini.</source>
                <target>Thư mục tạm không được định nghĩa trong php.ini.</target>
            </trans-unit>
            <trans-unit id="52">
                <source>Cannot write temporary file to disk.</source>
                <target>Không thể ghi tập tin tạm ra đĩa.</target>
            </trans-unit>
            <trans-unit id="53">
                <source>A PHP extension caused the upload to fail.</source>
                <target>Một PHP extension đã phá hỏng quá trình tải lên của tập tin.</target>
            </trans-unit>
            <trans-unit id="54">
                <source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
                <target>Danh sách phải chứa {{ limit }} hoặc nhiều hơn thành phần.|Danh sách phải chứa {{ limit }} hoặc nhiều hơn thành phần.</target>
            </trans-unit>
            <trans-unit id="55">
                <source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
                <target>Danh sách phải chứa {{ limit }} hoặc ít hơn thành phần.|Danh sách phải chứa {{ limit }} hoặc ít hơn thành phần.</target>
            </trans-unit>
            <trans-unit id="56">
                <source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
                <target>Danh sách phải chứa chính xác {{ limit }} thành phần.|Danh sách phải chứa chính xác {{ limit }} thành phần.</target>
            </trans-unit>
            <trans-unit id="57">
                <source>Invalid card number.</source>
                <target>Số thẻ không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="58">
                <source>Unsupported card type or invalid card number.</source>
                <target>Thẻ không được hỗ trợ hoặc số thẻ không hợp lệ.</target>
            </trans-unit>
            <trans-unit id="59">
                <source>This is not a valid International Bank Account Number (IBAN).</source>
                <target>Giá trị không phải là International Bank Account Number (IBAN) hợp lệ.</target>
            </trans-unit>
            <trans-unit id="60">
                <source>This value is not a valid ISBN-10.</source>
                <target>Giá trị không phải là ISBN-10 hợp lệ.</target>
            </trans-unit>
            <trans-unit id="61">
                <source>This value is not a valid ISBN-13.</source>
                <target>Giá trị không phải là ISBN-13 hợp lệ.</target>
            </trans-unit>
            <trans-unit id="62">
                <source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
                <target>Giá trị không phải là ISBN-10 hoặc ISBN-13 hợp lệ.</target>
            </trans-unit>
            <trans-unit id="63">
                <source>This value is not a valid ISSN.</source>
                <target>Giá trị không là ISSN hợp lệ.</target>
            </trans-unit>
            <trans-unit id="64">
                <source>This value is not a valid currency.</source>
                <target>Giá trị không phải là đơn vi tiền tệ hợp lệ.</target>
            </trans-unit>
            <trans-unit id="65">
                <source>This value should be equal to {{ compared_value }}.</source>
                <target>Giá trị phải bằng {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="66">
                <source>This value should be greater than {{ compared_value }}.</source>
                <target>Giá trị phải lớn hơn {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="67">
                <source>This value should be greater than or equal to {{ compared_value }}.</source>
                <target>Giá trị phải lớn hơn hoặc bằng {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="68">
                <source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Giá trị phải giống  {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="69">
                <source>This value should be less than {{ compared_value }}.</source>
                <target>Giá trị phải bé hơn {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="70">
                <source>This value should be less than or equal to {{ compared_value }}.</source>
                <target>Giá trị không được phép nhỏ hơn hoặc bằng {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="71">
                <source>This value should not be equal to {{ compared_value }}.</source>
                <target>Giá trị không được phép bằng {{ compared_value }}.</target>
            </trans-unit>
            <trans-unit id="72">
                <source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
                <target>Giá trị không được phép giống như {{ compared_value_type }} {{ compared_value }}.</target>
            </trans-unit>
        </body>
    </file>
</xliff>PK(a�\Gk	��8pear/Symfony/Component/Validator/ConstraintValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * Base class for constraint validators
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
abstract class ConstraintValidator implements ConstraintValidatorInterface
{
    /**
     * @var ExecutionContextInterface
     */
    protected $context;

    /**
     * {@inheritDoc}
     */
    public function initialize(ExecutionContextInterface $context)
    {
        $this->context = $context;
    }
}
PK(a�\�U�<<8pear/Symfony/Component/Validator/ClassBasedInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * An object backed by a PHP class.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface ClassBasedInterface
{
    /**
     * Returns the name of the backing PHP class.
     *
     * @return string The name of the backing class.
     */
    public function getClassName();
}
PK)a�\�R'Apear/Symfony/Component/Validator/ConstraintViolationInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * A violation of a constraint that happened during validation.
 *
 * For each constraint that fails during validation one or more violations are
 * created. The violations store the violation message, the path to the failing
 * element in the validation graph and the root element that was originally
 * passed to the validator. For example, take the following graph:
 *
 * <pre>
 * (Person)---(firstName: string)
 *      \
 *   (address: Address)---(street: string)
 * </pre>
 *
 * If the <tt>Person</tt> object is validated and validation fails for the
 * "firstName" property, the generated violation has the <tt>Person</tt>
 * instance as root and the property path "firstName". If validation fails
 * for the "street" property of the related <tt>Address</tt> instance, the root
 * element is still the person, but the property path is "address.street".
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
interface ConstraintViolationInterface
{
    /**
     * Returns the violation message.
     *
     * @return string The violation message.
     *
     * @api
     */
    public function getMessage();

    /**
     * Returns the raw violation message.
     *
     * The raw violation message contains placeholders for the parameters
     * returned by {@link getMessageParameters}. Typically you'll pass the
     * message template and parameters to a translation engine.
     *
     * @return string The raw violation message.
     *
     * @api
     */
    public function getMessageTemplate();

    /**
     * Returns the parameters to be inserted into the raw violation message.
     *
     * @return array A possibly empty list of parameters indexed by the names
     *               that appear in the message template.
     *
     * @see getMessageTemplate
     *
     * @api
     */
    public function getMessageParameters();

    /**
     * Returns a number for pluralizing the violation message.
     *
     * For example, the message template could have different translation based
     * on a parameter "choices":
     *
     * <ul>
     * <li>Please select exactly one entry. (choices=1)</li>
     * <li>Please select two entries. (choices=2)</li>
     * </ul>
     *
     * This method returns the value of the parameter for choosing the right
     * pluralization form (in this case "choices").
     *
     * @return integer|null The number to use to pluralize of the message.
     */
    public function getMessagePluralization();

    /**
     * Returns the root element of the validation.
     *
     * @return mixed The value that was passed originally to the validator when
     *               the validation was started. Because the validator traverses
     *               the object graph, the value at which the violation occurs
     *               is not necessarily the value that was originally validated.
     *
     * @api
     */
    public function getRoot();

    /**
     * Returns the property path from the root element to the violation.
     *
     * @return string The property path indicates how the validator reached
     *                the invalid value from the root element. If the root
     *                element is a <tt>Person</tt> instance with a property
     *                "address" that contains an <tt>Address</tt> instance
     *                with an invalid property "street", the generated property
     *                path is "address.street". Property access is denoted by
     *                dots, while array access is denoted by square brackets,
     *                for example "addresses[1].street".
     *
     * @api
     */
    public function getPropertyPath();

    /**
     * Returns the value that caused the violation.
     *
     * @return mixed The invalid value that caused the validated constraint to
     *               fail.
     *
     * @api
     */
    public function getInvalidValue();

    /**
     * Returns a machine-digestible error code for the violation.
     *
     * @return mixed The error code.
     */
    public function getCode();
}
PK*a�\,�'��Apear/Symfony/Component/Validator/ConstraintValidatorInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @api
 */
interface ConstraintValidatorInterface
{
    /**
     * Initializes the constraint validator.
     *
     * @param ExecutionContextInterface $context The current validation context
     */
    public function initialize(ExecutionContextInterface $context);

    /**
     * Checks if the passed value is valid.
     *
     * @param mixed      $value      The value that should be validated
     * @param Constraint $constraint The constraint for the validation
     *
     * @api
     */
    public function validate($value, Constraint $constraint);
}
PK*a�\�Sq�KK6pear/Symfony/Component/Validator/MetadataInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Validator;

/**
 * A container for validation metadata.
 *
 * The container contains constraints that may belong to different validation
 * groups. Constraints for a specific group can be fetched by calling
 * {@link findConstraints}.
 *
 * Implement this interface to add validation metadata to your own metadata
 * layer. Each metadata may have named properties. Each property can be
 * represented by one or more {@link PropertyMetadataInterface} instances that
 * are returned by {@link getPropertyMetadata}. Since
 * <tt>PropertyMetadataInterface</tt> inherits from <tt>MetadataInterface</tt>,
 * each property may be divided into further properties.
 *
 * The {@link accept} method of each metadata implements the Visitor pattern.
 * The method should forward the call to the visitor's
 * {@link ValidationVisitorInterface::visit} method and additionally call
 * <tt>accept()</tt> on all structurally related metadata instances.
 *
 * For example, to store constraints for PHP classes and their properties,
 * create a class <tt>ClassMetadata</tt> (implementing <tt>MetadataInterface</tt>)
 * and a class <tt>PropertyMetadata</tt> (implementing <tt>PropertyMetadataInterface</tt>).
 * <tt>ClassMetadata::getPropertyMetadata($property)</tt> returns all
 * <tt>PropertyMetadata</tt> instances for a property of that class. Its
 * <tt>accept()</tt>-method simply forwards to <tt>ValidationVisitorInterface::visit()</tt>
 * and calls <tt>accept()</tt> on all contained <tt>PropertyMetadata</tt>
 * instances, which themselves call <tt>ValidationVisitorInterface::visit()</tt>
 * again.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface MetadataInterface
{
    /**
     * Implementation of the Visitor design pattern.
     *
     * Calls {@link ValidationVisitorInterface::visit} and then forwards the
     * <tt>accept()</tt>-call to all property metadata instances.
     *
     * @param ValidationVisitorInterface $visitor      The visitor implementing the validation logic.
     * @param mixed                      $value        The value to validate.
     * @param string|string[]            $group        The validation group to validate in.
     * @param string                     $propertyPath The current property path in the validation graph.
     */
    public function accept(ValidationVisitorInterface $visitor, $value, $group, $propertyPath);

    /**
     * Returns all constraints for a given validation group.
     *
     * @param string $group The validation group.
     *
     * @return Constraint[] A list of constraint instances.
     */
    public function findConstraints($group);
}
PK+a�\��b11:pear/Symfony/Bridge/Monolog/Formatter/ConsoleFormatter.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Monolog\Formatter;

use Monolog\Formatter\LineFormatter;
use Monolog\Logger;

/**
 * Formats incoming records for console output by coloring them depending on log level.
 *
 * @author Tobias Schultze <http://tobion.de>
 */
class ConsoleFormatter extends LineFormatter
{
    const SIMPLE_FORMAT = "%start_tag%[%datetime%] %channel%.%level_name%:%end_tag% %message% %context% %extra%\n";

    /**
     * {@inheritdoc}
     */
    public function format(array $record)
    {
        if ($record['level'] >= Logger::ERROR) {
            $record['start_tag'] = '<error>';
            $record['end_tag']   = '</error>';
        } elseif ($record['level'] >= Logger::NOTICE) {
            $record['start_tag'] = '<comment>';
            $record['end_tag']   = '</comment>';
        } elseif ($record['level'] >= Logger::INFO) {
            $record['start_tag'] = '<info>';
            $record['end_tag']   = '</info>';
        } else {
            $record['start_tag'] = '';
            $record['end_tag']   = '';
        }

        return parent::format($record);
    }
}
PK+a�\��4NN*pear/Symfony/Bridge/Monolog/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Bridge\\Monolog\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK,a�\��;��	�	&pear/Symfony/Bridge/Monolog/Logger.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Monolog;

use Monolog\Logger as BaseLogger;
use Symfony\Component\HttpKernel\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;

/**
 * Logger.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Logger extends BaseLogger implements LoggerInterface, DebugLoggerInterface
{
    /**
     * @deprecated since 2.2, to be removed in 3.0. Use emergency() which is PSR-3 compatible.
     */
    public function emerg($message, array $context = array())
    {
        return parent::addRecord(BaseLogger::EMERGENCY, $message, $context);
    }

    /**
     * @deprecated since 2.2, to be removed in 3.0. Use critical() which is PSR-3 compatible.
     */
    public function crit($message, array $context = array())
    {
        return parent::addRecord(BaseLogger::CRITICAL, $message, $context);
    }

    /**
     * @deprecated since 2.2, to be removed in 3.0. Use error() which is PSR-3 compatible.
     */
    public function err($message, array $context = array())
    {
        return parent::addRecord(BaseLogger::ERROR, $message, $context);
    }

    /**
     * @deprecated since 2.2, to be removed in 3.0. Use warning() which is PSR-3 compatible.
     */
    public function warn($message, array $context = array())
    {
        return parent::addRecord(BaseLogger::WARNING, $message, $context);
    }

    /**
     * @see Symfony\Component\HttpKernel\Log\DebugLoggerInterface
     */
    public function getLogs()
    {
        if ($logger = $this->getDebugLogger()) {
            return $logger->getLogs();
        }

        return array();
    }

    /**
     * @see Symfony\Component\HttpKernel\Log\DebugLoggerInterface
     */
    public function countErrors()
    {
        if ($logger = $this->getDebugLogger()) {
            return $logger->countErrors();
        }

        return 0;
    }

    /**
     * Returns a DebugLoggerInterface instance if one is registered with this logger.
     *
     * @return DebugLoggerInterface|null A DebugLoggerInterface instance or null if none is registered
     */
    private function getDebugLogger()
    {
        foreach ($this->handlers as $handler) {
            if ($handler instanceof DebugLoggerInterface) {
                return $handler;
            }
        }
    }
}
PK-a�\�,��6pear/Symfony/Bridge/Monolog/Processor/WebProcessor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Monolog\Processor;

use Monolog\Processor\WebProcessor as BaseWebProcessor;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

/**
 * WebProcessor override to read from the HttpFoundation's Request
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class WebProcessor extends BaseWebProcessor
{
    public function __construct()
    {
        // Pass an empty array as the default null value would access $_SERVER
        parent::__construct(array());
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if ($event->isMasterRequest()) {
            $this->serverData = $event->getRequest()->server->all();
        }
    }
}
PK-a�\��Zv��4pear/Symfony/Bridge/Monolog/Handler/DebugHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Monolog\Handler;

use Monolog\Logger;
use Monolog\Handler\TestHandler;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;

/**
 * DebugLogger.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class DebugHandler extends TestHandler implements DebugLoggerInterface
{
    /**
     * {@inheritdoc}
     */
    public function getLogs()
    {
        $records = array();
        foreach ($this->records as $record) {
            $records[] = array(
                'timestamp'    => $record['datetime']->getTimestamp(),
                'message'      => $record['message'],
                'priority'     => $record['level'],
                'priorityName' => $record['level_name'],
                'context'      => $record['context'],
            );
        }

        return $records;
    }

    /**
     * {@inheritdoc}
     */
    public function countErrors()
    {
        $cnt = 0;
        $levels = array(Logger::ERROR, Logger::CRITICAL, Logger::ALERT, Logger::EMERGENCY);
        foreach ($levels as $level) {
            if (isset($this->recordsByLevel[$level])) {
                $cnt += count($this->recordsByLevel[$level]);
            }
        }

        return $cnt;
    }
}
PK.a�\��մ��6pear/Symfony/Bridge/Monolog/Handler/FirePHPHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Monolog\Handler;

use Monolog\Handler\FirePHPHandler as BaseFirePHPHandler;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpFoundation\Response;

/**
 * FirePHPHandler.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class FirePHPHandler extends BaseFirePHPHandler
{
    /**
     * @var array
     */
    private $headers = array();

    /**
     * @var Response
     */
    private $response;

    /**
     * Adds the headers to the response once it's created
     */
    public function onKernelResponse(FilterResponseEvent $event)
    {
        if (!$event->isMasterRequest()) {
            return;
        }

        if (!preg_match('{\bFirePHP/\d+\.\d+\b}', $event->getRequest()->headers->get('User-Agent'))
            && !$event->getRequest()->headers->has('X-FirePHP-Version')) {

            $this->sendHeaders = false;
            $this->headers = array();

            return;
        }

        $this->response = $event->getResponse();
        foreach ($this->headers as $header => $content) {
            $this->response->headers->set($header, $content);
        }
        $this->headers = array();
    }

    /**
     * {@inheritDoc}
     */
    protected function sendHeader($header, $content)
    {
        if (!$this->sendHeaders) {
            return;
        }

        if ($this->response) {
            $this->response->headers->set($header, $content);
        } else {
            $this->headers[$header] = $content;
        }
    }

    /**
     * Override default behavior since we check the user agent in onKernelResponse
     */
    protected function headersAccepted()
    {
        return true;
    }
}
PK.a�\��*vv:pear/Symfony/Bridge/Monolog/Handler/SwiftMailerHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Monolog\Handler;

use Monolog\Handler\SwiftMailerHandler as BaseSwiftMailerHandler;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;

/**
 * Extended SwiftMailerHandler that flushes mail queue if necessary
 *
 * @author Philipp Kräutli <pkraeutli@astina.ch>
 */
class SwiftMailerHandler extends BaseSwiftMailerHandler
{
    protected $transport;

    protected $instantFlush = false;

    /**
     * @param \Swift_Transport $transport
     */
    public function setTransport(\Swift_Transport $transport)
    {
        $this->transport = $transport;
    }

    /**
     * After the kernel has been terminated we will always flush messages
     *
     * @param PostResponseEvent $event
     */
    public function onKernelTerminate(PostResponseEvent $event)
    {
        $this->instantFlush = true;
    }

    /**
     * {@inheritdoc}
     */
    protected function send($content, array $records)
    {
        parent::send($content, $records);

        if ($this->instantFlush) {
            $this->flushMemorySpool();
        }
    }

    /**
     * Flushes the mail queue if a memory spool is used
     */
    private function flushMemorySpool()
    {
        $mailerTransport = $this->mailer->getTransport();
        if (!$mailerTransport instanceof \Swift_Transport_SpoolTransport) {
            return;
        }

        $spool = $mailerTransport->getSpool();
        if (!$spool instanceof \Swift_MemorySpool) {
            return;
        }

        if (null === $this->transport) {
            throw new \Exception('No transport available to flush mail queue');
        }

        $spool->flushQueue($this->transport);
    }
}
PK.a�\�y���6pear/Symfony/Bridge/Monolog/Handler/ConsoleHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Monolog\Handler;

use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Logger;
use Symfony\Bridge\Monolog\Formatter\ConsoleFormatter;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Writes logs to the console output depending on its verbosity setting.
 *
 * It is disabled by default and gets activated as soon as a command is executed.
 * Instead of listening to the console events, the output can also be set manually.
 *
 * The minimum logging level at which this handler will be triggered depends on the
 * verbosity setting of the console output. The default mapping is:
 * - OutputInterface::VERBOSITY_NORMAL will show all WARNING and higher logs
 * - OutputInterface::VERBOSITY_VERBOSE (-v) will show all NOTICE and higher logs
 * - OutputInterface::VERBOSITY_VERY_VERBOSE (-vv) will show all INFO and higher logs
 * - OutputInterface::VERBOSITY_DEBUG (-vvv) will show all DEBUG and higher logs, i.e. all logs
 *
 * This mapping can be customized with the $verbosityLevelMap constructor parameter.
 *
 * @author Tobias Schultze <http://tobion.de>
 */
class ConsoleHandler extends AbstractProcessingHandler implements EventSubscriberInterface
{
    /**
     * @var OutputInterface|null
     */
    private $output;

    /**
     * @var array
     */
    private $verbosityLevelMap = array(
        OutputInterface::VERBOSITY_NORMAL => Logger::WARNING,
        OutputInterface::VERBOSITY_VERBOSE => Logger::NOTICE,
        OutputInterface::VERBOSITY_VERY_VERBOSE => Logger::INFO,
        OutputInterface::VERBOSITY_DEBUG => Logger::DEBUG
    );

    /**
     * Constructor.
     *
     * @param OutputInterface|null $output            The console output to use (the handler remains disabled when passing null
     *                                                until the output is set, e.g. by using console events)
     * @param Boolean              $bubble            Whether the messages that are handled can bubble up the stack
     * @param array                $verbosityLevelMap Array that maps the OutputInterface verbosity to a minimum logging
     *                                                level (leave empty to use the default mapping)
     */
    public function __construct(OutputInterface $output = null, $bubble = true, array $verbosityLevelMap = array())
    {
        parent::__construct(Logger::DEBUG, $bubble);
        $this->output = $output;

        if ($verbosityLevelMap) {
            $this->verbosityLevelMap = $verbosityLevelMap;
        }
    }

    /**
     * {@inheritdoc}
     */
    public function isHandling(array $record)
    {
        return $this->updateLevel() && parent::isHandling($record);
    }

    /**
     * {@inheritdoc}
     */
    public function handle(array $record)
    {
        // we have to update the logging level each time because the verbosity of the
        // console output might have changed in the meantime (it is not immutable)
        return $this->updateLevel() && parent::handle($record);
    }

    /**
     * Sets the console output to use for printing logs.
     *
     * @param OutputInterface $output The console output to use
     */
    public function setOutput(OutputInterface $output)
    {
        $this->output = $output;
    }

    /**
     * Disables the output.
     */
    public function close()
    {
        $this->output = null;

        parent::close();
    }

    /**
     * Before a command is executed, the handler gets activated and the console output
     * is set in order to know where to write the logs.
     *
     * @param ConsoleCommandEvent $event
     */
    public function onCommand(ConsoleCommandEvent $event)
    {
        $this->setOutput($event->getOutput());
    }

    /**
     * After a command has been executed, it disables the output.
     *
     * @param ConsoleTerminateEvent $event
     */
    public function onTerminate(ConsoleTerminateEvent $event)
    {
        $this->close();
    }

    /**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents()
    {
        return array(
            ConsoleEvents::COMMAND => 'onCommand',
            ConsoleEvents::TERMINATE => 'onTerminate'
        );
    }

    /**
     * {@inheritdoc}
     */
    protected function write(array $record)
    {
        if ($record['level'] >= Logger::ERROR && $this->output instanceof ConsoleOutputInterface) {
            $this->output->getErrorOutput()->write((string) $record['formatted']);
        } else {
            $this->output->write((string) $record['formatted']);
        }
    }

    /**
     * {@inheritdoc}
     */
    protected function getDefaultFormatter()
    {
        return new ConsoleFormatter();
    }

    /**
     * Updates the logging level based on the verbosity setting of the console output.
     *
     * @return Boolean Whether the handler is enabled and verbosity is not set to quiet.
     */
    private function updateLevel()
    {
        if (null === $this->output || OutputInterface::VERBOSITY_QUIET === $verbosity = $this->output->getVerbosity()) {
            return false;
        }

        if (isset($this->verbosityLevelMap[$verbosity])) {
            $this->setLevel($this->verbosityLevelMap[$verbosity]);
        } else {
            $this->setLevel(Logger::DEBUG);
        }

        return true;
    }
}
PK/a�\���"II8pear/Symfony/Bridge/Monolog/Handler/ChromePhpHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Monolog\Handler;

use Monolog\Handler\ChromePHPHandler as BaseChromePhpHandler;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

/**
 * ChromePhpHandler.
 *
 * @author Christophe Coevoet <stof@notk.org>
 */
class ChromePhpHandler extends BaseChromePhpHandler
{
    /**
     * @var array
     */
    private $headers = array();

    /**
     * @var Response
     */
    private $response;

    /**
     * Adds the headers to the response once it's created
     */
    public function onKernelResponse(FilterResponseEvent $event)
    {
        if (!$event->isMasterRequest()) {
            return;
        }

        if (!preg_match('{\bChrome/\d+[\.\d+]*\b}', $event->getRequest()->headers->get('User-Agent'))) {

            $this->sendHeaders = false;
            $this->headers = array();

            return;
        }

        $this->response = $event->getResponse();
        foreach ($this->headers as $header => $content) {
            $this->response->headers->set($header, $content);
        }
        $this->headers = array();
    }

    /**
     * {@inheritDoc}
     */
    protected function sendHeader($header, $content)
    {
        if (!$this->sendHeaders) {
            return;
        }

        if ($this->response) {
            $this->response->headers->set($header, $content);
        } else {
            $this->headers[$header] = $content;
        }
    }

    /**
     * Override default behavior since we check it in onKernelResponse
     */
    protected function headersAccepted()
    {
        return true;
    }
}
PK/a�\ʦ\�G
G
+pear/Symfony/Bridge/Twig/Node/TransNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Node;

/**
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TransNode extends \Twig_Node
{
    public function __construct(\Twig_NodeInterface $body, \Twig_NodeInterface $domain = null, \Twig_Node_Expression $count = null, \Twig_Node_Expression $vars = null, \Twig_Node_Expression $locale = null, $lineno = 0, $tag = null)
    {
        parent::__construct(array('count' => $count, 'body' => $body, 'domain' => $domain, 'vars' => $vars, 'locale' => $locale), array(), $lineno, $tag);
    }

    /**
     * Compiles the node to PHP.
     *
     * @param \Twig_Compiler $compiler A Twig_Compiler instance
     */
    public function compile(\Twig_Compiler $compiler)
    {
        $compiler->addDebugInfo($this);

        $vars = $this->getNode('vars');
        $defaults = new \Twig_Node_Expression_Array(array(), -1);
        if ($vars instanceof \Twig_Node_Expression_Array) {
            $defaults = $this->getNode('vars');
            $vars = null;
        }
        list($msg, $defaults) = $this->compileString($this->getNode('body'), $defaults);

        $method = null === $this->getNode('count') ? 'trans' : 'transChoice';

        $compiler
            ->write('echo $this->env->getExtension(\'translator\')->getTranslator()->'.$method.'(')
            ->subcompile($msg)
        ;

        $compiler->raw(', ');

        if (null !== $this->getNode('count')) {
            $compiler
                ->subcompile($this->getNode('count'))
                ->raw(', ')
            ;
        }

        if (null !== $vars) {
            $compiler
                ->raw('array_merge(')
                ->subcompile($defaults)
                ->raw(', ')
                ->subcompile($this->getNode('vars'))
                ->raw(')')
            ;
        } else {
            $compiler->subcompile($defaults);
        }

        $compiler->raw(', ');

        if (null === $this->getNode('domain')) {
            $compiler->repr('messages');
        } else {
            $compiler->subcompile($this->getNode('domain'));
        }

        if (null !== $this->getNode('locale')) {
            $compiler
                ->raw(', ')
                ->subcompile($this->getNode('locale'))
            ;
        }
        $compiler->raw(");\n");
    }

    protected function compileString(\Twig_NodeInterface $body, \Twig_Node_Expression_Array $vars)
    {
        if ($body instanceof \Twig_Node_Expression_Constant) {
            $msg = $body->getAttribute('value');
        } elseif ($body instanceof \Twig_Node_Text) {
            $msg = $body->getAttribute('data');
        } else {
            return array($body, $vars);
        }

        preg_match_all('/(?<!%)%([^%]+)%/', $msg, $matches);

        foreach ($matches[1] as $var) {
            $key = new \Twig_Node_Expression_Constant('%'.$var.'%', $body->getLine());
            if (!$vars->hasElement($key)) {
                $vars->addElement(new \Twig_Node_Expression_Name($var, $body->getLine()), $key);
            }
        }

        return array(new \Twig_Node_Expression_Constant(str_replace('%%', '%', trim($msg)), $body->getLine()), $vars);
    }
}
PK/a�\6DZ77/pear/Symfony/Bridge/Twig/Node/StopwatchNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Node;

/**
 * Represents a stopwatch node.
 *
 * @author Wouter J <wouter@wouterj.nl>
 */
class StopwatchNode extends \Twig_Node
{
    public function __construct(\Twig_NodeInterface $name, $body, \Twig_Node_Expression_AssignName $var, $lineno = 0, $tag = null)
    {
        parent::__construct(array('body' => $body, 'name' => $name, 'var' => $var), array(), $lineno, $tag);
    }

    public function compile(\Twig_Compiler $compiler)
    {
        $compiler
            ->addDebugInfo($this)
            ->write('')
            ->subcompile($this->getNode('var'))
            ->raw(' = ')
            ->subcompile($this->getNode('name'))
            ->write(";\n")
            ->write("\$this->env->getExtension('stopwatch')->getStopwatch()->start(")
            ->subcompile($this->getNode('var'))
            ->raw(", 'template');\n")
            ->subcompile($this->getNode('body'))
            ->write("\$this->env->getExtension('stopwatch')->getStopwatch()->stop(")
            ->subcompile($this->getNode('var'))
            ->raw(");\n")
        ;
    }
}
PK0a�\���^��1pear/Symfony/Bridge/Twig/Node/RenderBlockNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Node;

/**
 * Compiles a call to {@link FormRendererInterface::renderBlock()}.
 *
 * The function name is used as block name. For example, if the function name
 * is "foo", the block "foo" will be rendered.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class RenderBlockNode extends \Twig_Node_Expression_Function
{
    public function compile(\Twig_Compiler $compiler)
    {
        $compiler->addDebugInfo($this);
        $arguments = iterator_to_array($this->getNode('arguments'));
        $compiler->write('$this->env->getExtension(\'form\')->renderer->renderBlock(');

        if (isset($arguments[0])) {
            $compiler->subcompile($arguments[0]);
            $compiler->raw(', \'' . $this->getAttribute('name') . '\'');

            if (isset($arguments[1])) {
                $compiler->raw(', ');
                $compiler->subcompile($arguments[1]);
            }
        }

        $compiler->raw(')');
    }
}
PK0a�\�
�s>>/pear/Symfony/Bridge/Twig/Node/FormThemeNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Node;

/**
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FormThemeNode extends \Twig_Node
{
    public function __construct(\Twig_NodeInterface $form, \Twig_NodeInterface $resources, $lineno, $tag = null)
    {
        parent::__construct(array('form' => $form, 'resources' => $resources), array(), $lineno, $tag);
    }

    /**
     * Compiles the node to PHP.
     *
     * @param \Twig_Compiler $compiler A Twig_Compiler instance
     */
    public function compile(\Twig_Compiler $compiler)
    {
        $compiler
            ->addDebugInfo($this)
            ->write('$this->env->getExtension(\'form\')->renderer->setTheme(')
            ->subcompile($this->getNode('form'))
            ->raw(', ')
            ->subcompile($this->getNode('resources'))
            ->raw(");\n");
        ;
    }
}
PK1a�\�U,tt1pear/Symfony/Bridge/Twig/Node/FormEnctypeNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Node;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use
 *             the helper "form_start()" instead.
 */
class FormEnctypeNode extends SearchAndRenderBlockNode
{
    public function compile(\Twig_Compiler $compiler)
    {
        parent::compile($compiler);

        // Uncomment this as soon as the deprecation note should be shown
        // $compiler->write('trigger_error(\'The helper form_enctype(form) is deprecated since version 2.3 and will be removed in 3.0. Use form_start(form) instead.\', E_USER_DEPRECATED)');
    }
}
PK1a�\P�IAA8pear/Symfony/Bridge/Twig/Node/TransDefaultDomainNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Node;

/**
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TransDefaultDomainNode extends \Twig_Node
{
    public function __construct(\Twig_Node_Expression $expr, $lineno = 0, $tag = null)
    {
        parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
    }

    /**
     * Compiles the node to PHP.
     *
     * @param \Twig_Compiler $compiler A Twig_Compiler instance
     */
    public function compile(\Twig_Compiler $compiler)
    {
        // noop as this node is just a marker for TranslationDefaultDomainNodeVisitor
    }
}
PK2a�\,
�@��:pear/Symfony/Bridge/Twig/Node/SearchAndRenderBlockNode.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Node;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class SearchAndRenderBlockNode extends \Twig_Node_Expression_Function
{
    public function compile(\Twig_Compiler $compiler)
    {
        $compiler->addDebugInfo($this);
        $compiler->raw('$this->env->getExtension(\'form\')->renderer->searchAndRenderBlock(');

        preg_match('/_([^_]+)$/', $this->getAttribute('name'), $matches);

        $label = null;
        $arguments = iterator_to_array($this->getNode('arguments'));
        $blockNameSuffix = $matches[1];

        if (isset($arguments[0])) {
            $compiler->subcompile($arguments[0]);
            $compiler->raw(', \''.$blockNameSuffix.'\'');

            if (isset($arguments[1])) {
                if ('label' === $blockNameSuffix) {
                    // The "label" function expects the label in the second and
                    // the variables in the third argument
                    $label = $arguments[1];
                    $variables = isset($arguments[2]) ? $arguments[2] : null;
                    $lineno = $label->getLine();

                    if ($label instanceof \Twig_Node_Expression_Constant) {
                        // If the label argument is given as a constant, we can either
                        // strip it away if it is empty, or integrate it into the array
                        // of variables at compile time.
                        $labelIsExpression = false;

                        // Only insert the label into the array if it is not empty
                        if (!twig_test_empty($label->getAttribute('value'))) {
                            $originalVariables = $variables;
                            $variables = new \Twig_Node_Expression_Array(array(), $lineno);
                            $labelKey = new \Twig_Node_Expression_Constant('label', $lineno);

                            if (null !== $originalVariables) {
                                foreach ($originalVariables->getKeyValuePairs() as $pair) {
                                    // Don't copy the original label attribute over if it exists
                                    if ((string) $labelKey !== (string) $pair['key']) {
                                        $variables->addElement($pair['value'], $pair['key']);
                                    }
                                }
                            }

                            // Insert the label argument into the array
                            $variables->addElement($label, $labelKey);
                        }
                    } else {
                        // The label argument is not a constant, but some kind of
                        // expression. This expression needs to be evaluated at runtime.
                        // Depending on the result (whether it is null or not), the
                        // label in the arguments should take precedence over the label
                        // in the attributes or not.
                        $labelIsExpression = true;
                    }
                } else {
                    // All other functions than "label" expect the variables
                    // in the second argument
                    $label = null;
                    $variables = $arguments[1];
                    $labelIsExpression = false;
                }

                if (null !== $variables || $labelIsExpression) {
                    $compiler->raw(', ');

                    if (null !== $variables) {
                        $compiler->subcompile($variables);
                    }

                    if ($labelIsExpression) {
                        if (null !== $variables) {
                            $compiler->raw(' + ');
                        }

                        // Check at runtime whether the label is empty.
                        // If not, add it to the array at runtime.
                        $compiler->raw('(twig_test_empty($_label_ = ');
                        $compiler->subcompile($label);
                        $compiler->raw(') ? array() : array("label" => $_label_))');
                    }
                }
            }
        }

        $compiler->raw(")");
    }
}
PK2a�\��|4pear/Symfony/Bridge/Twig/Extension/YamlExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Extension;

use Symfony\Component\Yaml\Dumper as YamlDumper;

/**
 * Provides integration of the Yaml component with Twig.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class YamlExtension extends \Twig_Extension
{
    /**
     * {@inheritdoc}
     */
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('yaml_encode', array($this, 'encode')),
            new \Twig_SimpleFilter('yaml_dump', array($this, 'dump')),
        );
    }

    public function encode($input, $inline = 0, $dumpObjects = false)
    {
        static $dumper;

        if (null === $dumper) {
            $dumper = new YamlDumper();
        }

        return $dumper->dump($input, $inline, false, $dumpObjects);
    }

    public function dump($value, $inline = 0, $dumpObjects = false)
    {
        if (is_resource($value)) {
            return '%Resource%';
        }

        if (is_array($value) || is_object($value)) {
            return '%'.gettype($value).'% '.$this->encode($value, $inline, $dumpObjects);
        }

        return $this->encode($value, $inline, $dumpObjects);
    }

    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'yaml';
    }
}
PK3a�\d���oo8pear/Symfony/Bridge/Twig/Extension/SecurityExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Extension;

use Symfony\Component\Security\Acl\Voter\FieldVote;
use Symfony\Component\Security\Core\SecurityContextInterface;

/**
 * SecurityExtension exposes security context features.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class SecurityExtension extends \Twig_Extension
{
    private $context;

    public function __construct(SecurityContextInterface $context = null)
    {
        $this->context = $context;
    }

    public function isGranted($role, $object = null, $field = null)
    {
        if (null === $this->context) {
            return false;
        }

        if (null !== $field) {
            $object = new FieldVote($object, $field);
        }

        return $this->context->isGranted($role, $object);
    }

    /**
     * {@inheritdoc}
     */
    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('is_granted', array($this, 'isGranted')),
        );
    }

    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'security';
    }
}
PK3a�\�9�=KK4pear/Symfony/Bridge/Twig/Extension/FormExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Extension;

use Symfony\Bridge\Twig\TokenParser\FormThemeTokenParser;
use Symfony\Bridge\Twig\Form\TwigRendererInterface;
use Symfony\Component\Form\Extension\Core\View\ChoiceView;

/**
 * FormExtension extends Twig with form capabilities.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormExtension extends \Twig_Extension
{
    /**
     * This property is public so that it can be accessed directly from compiled
     * templates without having to call a getter, which slightly decreases performance.
     *
     * @var TwigRendererInterface
     */
    public $renderer;

    public function __construct(TwigRendererInterface $renderer)
    {
        $this->renderer = $renderer;
    }

    /**
     * {@inheritdoc}
     */
    public function initRuntime(\Twig_Environment $environment)
    {
        $this->renderer->setEnvironment($environment);
    }

    /**
     * {@inheritdoc}
     */
    public function getTokenParsers()
    {
        return array(
            // {% form_theme form "SomeBundle::widgets.twig" %}
            new FormThemeTokenParser(),
        );
    }

    /**
     * {@inheritdoc}
     */
    public function getFunctions()
    {
        return array(
            'form_enctype' => new \Twig_Function_Node('Symfony\Bridge\Twig\Node\FormEnctypeNode', array('is_safe' => array('html'))),
            'form_widget'  => new \Twig_Function_Node('Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', array('is_safe' => array('html'))),
            'form_errors'  => new \Twig_Function_Node('Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', array('is_safe' => array('html'))),
            'form_label'   => new \Twig_Function_Node('Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', array('is_safe' => array('html'))),
            'form_row'     => new \Twig_Function_Node('Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', array('is_safe' => array('html'))),
            'form_rest'    => new \Twig_Function_Node('Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', array('is_safe' => array('html'))),
            'form'         => new \Twig_Function_Node('Symfony\Bridge\Twig\Node\RenderBlockNode', array('is_safe' => array('html'))),
            'form_start'   => new \Twig_Function_Node('Symfony\Bridge\Twig\Node\RenderBlockNode', array('is_safe' => array('html'))),
            'form_end'     => new \Twig_Function_Node('Symfony\Bridge\Twig\Node\RenderBlockNode', array('is_safe' => array('html'))),
            'csrf_token'   => new \Twig_Function_Method($this, 'renderer->renderCsrfToken'),
        );
    }

    /**
     * {@inheritdoc}
     */
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('humanize', array($this->renderer, 'humanize')),
        );
    }

    /**
     * {@inheritdoc}
     */
    public function getTests()
    {
        return array(
            new \Twig_SimpleTest('selectedchoice', array($this, 'isSelectedChoice')),
        );
    }

    /**
     * Returns whether a choice is selected for a given form value.
     *
     * Unfortunately Twig does not support an efficient way to execute the
     * "is_selected" closure passed to the template by ChoiceType. It is faster
     * to implement the logic here (around 65ms for a specific form).
     *
     * Directly implementing the logic here is also faster than doing so in
     * ChoiceView (around 30ms).
     *
     * The worst option tested so far is to implement the logic in ChoiceView
     * and access the ChoiceView method directly in the template. Doing so is
     * around 220ms slower than doing the method call here in the filter. Twig
     * seems to be much more efficient at executing filters than at executing
     * methods of an object.
     *
     * @param ChoiceView   $choice        The choice to check.
     * @param string|array $selectedValue The selected value to compare.
     *
     * @return Boolean Whether the choice is selected.
     *
     * @see ChoiceView::isSelected()
     */
    public function isSelectedChoice(ChoiceView $choice, $selectedValue)
    {
        if (is_array($selectedValue)) {
            return false !== array_search($choice->value, $selectedValue, true);
        }

        return $choice->value === $selectedValue;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'form';
    }
}
PK3a�\�����4pear/Symfony/Bridge/Twig/Extension/CodeExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Extension;

if (!defined('ENT_SUBSTITUTE')) {
    define('ENT_SUBSTITUTE', 8);
}

/**
 * Twig extension relate to PHP code and used by the profiler and the default exception templates.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class CodeExtension extends \Twig_Extension
{
    private $fileLinkFormat;
    private $rootDir;
    private $charset;

    /**
     * Constructor.
     *
     * @param string $fileLinkFormat The format for links to source files
     * @param string $rootDir        The project root directory
     * @param string $charset        The charset
     */
    public function __construct($fileLinkFormat, $rootDir, $charset)
    {
        $this->fileLinkFormat = empty($fileLinkFormat) ? ini_get('xdebug.file_link_format') : $fileLinkFormat;
        $this->rootDir = str_replace('\\', '/', $rootDir).'/';
        $this->charset = $charset;
    }

    /**
     * {@inheritdoc}
     */
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('abbr_class', array($this, 'abbrClass'), array('is_safe' => array('html'))),
            new \Twig_SimpleFilter('abbr_method', array($this, 'abbrMethod'), array('is_safe' => array('html'))),
            new \Twig_SimpleFilter('format_args', array($this, 'formatArgs'), array('is_safe' => array('html'))),
            new \Twig_SimpleFilter('format_args_as_text', array($this, 'formatArgsAsText')),
            new \Twig_SimpleFilter('file_excerpt', array($this, 'fileExcerpt'), array('is_safe' => array('html'))),
            new \Twig_SimpleFilter('format_file', array($this, 'formatFile'), array('is_safe' => array('html'))),
            new \Twig_SimpleFilter('format_file_from_text', array($this, 'formatFileFromText'), array('is_safe' => array('html'))),
            new \Twig_SimpleFilter('file_link', array($this, 'getFileLink'), array('is_safe' => array('html'))),
        );
    }

    public function abbrClass($class)
    {
        $parts = explode('\\', $class);
        $short = array_pop($parts);

        return sprintf("<abbr title=\"%s\">%s</abbr>", $class, $short);
    }

    public function abbrMethod($method)
    {
        if (false !== strpos($method, '::')) {
            list($class, $method) = explode('::', $method, 2);
            $result = sprintf("%s::%s()", $this->abbrClass($class), $method);
        } elseif ('Closure' === $method) {
            $result = sprintf("<abbr title=\"%s\">%s</abbr>", $method, $method);
        } else {
            $result = sprintf("<abbr title=\"%s\">%s</abbr>()", $method, $method);
        }

        return $result;
    }

    /**
     * Formats an array as a string.
     *
     * @param array $args The argument array
     *
     * @return string
     */
    public function formatArgs($args)
    {
        $result = array();
        foreach ($args as $key => $item) {
            if ('object' === $item[0]) {
                $parts = explode('\\', $item[1]);
                $short = array_pop($parts);
                $formattedValue = sprintf("<em>object</em>(<abbr title=\"%s\">%s</abbr>)", $item[1], $short);
            } elseif ('array' === $item[0]) {
                $formattedValue = sprintf("<em>array</em>(%s)", is_array($item[1]) ? $this->formatArgs($item[1]) : $item[1]);
            } elseif ('string'  === $item[0]) {
                $formattedValue = sprintf("'%s'", htmlspecialchars($item[1], ENT_QUOTES, $this->charset));
            } elseif ('null' === $item[0]) {
                $formattedValue = '<em>null</em>';
            } elseif ('boolean' === $item[0]) {
                $formattedValue = '<em>'.strtolower(var_export($item[1], true)).'</em>';
            } elseif ('resource' === $item[0]) {
                $formattedValue = '<em>resource</em>';
            } else {
                $formattedValue = str_replace("\n", '', var_export(htmlspecialchars((string) $item[1], ENT_QUOTES, $this->charset), true));
            }

            $result[] = is_int($key) ? $formattedValue : sprintf("'%s' => %s", $key, $formattedValue);
        }

        return implode(', ', $result);
    }

    /**
     * Formats an array as a string.
     *
     * @param array $args The argument array
     *
     * @return string
     */
    public function formatArgsAsText($args)
    {
        return strip_tags($this->formatArgs($args));
    }

    /**
     * Returns an excerpt of a code file around the given line number.
     *
     * @param string $file A file path
     * @param int    $line The selected line number
     *
     * @return string An HTML string
     */
    public function fileExcerpt($file, $line)
    {
        if (is_readable($file)) {
            // highlight_file could throw warnings
            // see https://bugs.php.net/bug.php?id=25725
            $code = @highlight_file($file, true);
            // remove main code/span tags
            $code = preg_replace('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s', '\\1', $code);
            $content = preg_split('#<br />#', $code);

            $lines = array();
            for ($i = max($line - 3, 1), $max = min($line + 3, count($content)); $i <= $max; $i++) {
                $lines[] = '<li'.($i == $line ? ' class="selected"' : '').'><code>'.self::fixCodeMarkup($content[$i - 1]).'</code></li>';
            }

            return '<ol start="'.max($line - 3, 1).'">'.implode("\n", $lines).'</ol>';
        }
    }

    /**
     * Formats a file path.
     *
     * @param string  $file An absolute file path
     * @param integer $line The line number
     * @param string  $text Use this text for the link rather than the file path
     *
     * @return string
     */
    public function formatFile($file, $line, $text = null)
    {
        if (null === $text) {
            $file = trim($file);
            $text = $file;
            if (0 === strpos($text, $this->rootDir)) {
                $text = str_replace($this->rootDir, '', str_replace('\\', '/', $text));
                $text = sprintf('<abbr title="%s">kernel.root_dir</abbr>/%s', $this->rootDir, $text);
            }
        }

        $text = "$text at line $line";

        if (false !== $link = $this->getFileLink($file, $line)) {
            return sprintf('<a href="%s" title="Click to open this file" class="file_link">%s</a>', htmlspecialchars($link, ENT_QUOTES | ENT_SUBSTITUTE, $this->charset), $text);
        }

        return $text;
    }

    /**
     * Returns the link for a given file/line pair.
     *
     * @param string  $file An absolute file path
     * @param integer $line The line number
     *
     * @return string A link of false
     */
    public function getFileLink($file, $line)
    {
        if ($this->fileLinkFormat && is_file($file)) {
            return strtr($this->fileLinkFormat, array('%f' => $file, '%l' => $line));
        }

        return false;
    }

    public function formatFileFromText($text)
    {
        $that = $this;

        return preg_replace_callback('/in ("|&quot;)?(.+?)\1(?: +(?:on|at))? +line (\d+)/s', function ($match) use ($that) {
            return 'in '.$that->formatFile($match[2], $match[3]);
        }, $text);
    }

    public function getName()
    {
        return 'code';
    }

    protected static function fixCodeMarkup($line)
    {
        // </span> ending tag from previous line
        $opening = strpos($line, '<span');
        $closing = strpos($line, '</span>');
        if (false !== $closing && (false === $opening || $closing < $opening)) {
            $line = substr_replace($line, '', $closing, 7);
        }

        // missing </span> tag at the end of line
        $opening = strpos($line, '<span');
        $closing = strpos($line, '</span>');
        if (false !== $opening && (false === $closing || $closing > $opening)) {
            $line .= '</span>';
        }

        return $line;
    }
}
PK3a�\��&�a
a
:pear/Symfony/Bridge/Twig/Extension/HttpKernelExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Extension;

use Symfony\Component\HttpKernel\Fragment\FragmentHandler;
use Symfony\Component\HttpKernel\Controller\ControllerReference;

/**
 * Provides integration with the HttpKernel component.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class HttpKernelExtension extends \Twig_Extension
{
    private $handler;

    /**
     * Constructor.
     *
     * @param FragmentHandler $handler A FragmentHandler instance
     */
    public function __construct(FragmentHandler $handler)
    {
        $this->handler = $handler;
    }

    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('render',array($this, 'renderFragment'), array('is_safe' => array('html'))),
            new \Twig_SimpleFunction('render_*', array($this, 'renderFragmentStrategy'), array('is_safe' => array('html'))),
            new \Twig_SimpleFunction('controller', array($this, 'controller')),
        );
    }

    /**
     * Renders a fragment.
     *
     * @param string|ControllerReference $uri      A URI as a string or a ControllerReference instance
     * @param array                      $options  An array of options
     *
     * @return string The fragment content
     *
     * @see Symfony\Component\HttpKernel\Fragment\FragmentHandler::render()
     */
    public function renderFragment($uri, $options = array())
    {
        $strategy = isset($options['strategy']) ? $options['strategy'] : 'inline';
        unset($options['strategy']);

        return $this->handler->render($uri, $strategy, $options);
    }

    /**
     * Renders a fragment.
     *
     * @param string                     $strategy A strategy name
     * @param string|ControllerReference $uri      A URI as a string or a ControllerReference instance
     * @param array                      $options  An array of options
     *
     * @return string The fragment content
     *
     * @see Symfony\Component\HttpKernel\Fragment\FragmentHandler::render()
     */
    public function renderFragmentStrategy($strategy, $uri, $options = array())
    {
        return $this->handler->render($uri, $strategy, $options);
    }

    public function controller($controller, $attributes = array(), $query = array())
    {
        return new ControllerReference($controller, $attributes, $query);
    }

    public function getName()
    {
        return 'http_kernel';
    }
}
PK4a�\`�fS..7pear/Symfony/Bridge/Twig/Extension/RoutingExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Extension;

use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

/**
 * Provides integration of the Routing component with Twig.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class RoutingExtension extends \Twig_Extension
{
    private $generator;

    public function __construct(UrlGeneratorInterface $generator)
    {
        $this->generator = $generator;
    }

    /**
     * Returns a list of functions to add to the existing list.
     *
     * @return array An array of functions
     */
    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('url', array($this, 'getUrl'), array('is_safe_callback' => array($this, 'isUrlGenerationSafe'))),
            new \Twig_SimpleFunction('path', array($this, 'getPath'), array('is_safe_callback' => array($this, 'isUrlGenerationSafe'))),
        );
    }

    public function getPath($name, $parameters = array(), $relative = false)
    {
        return $this->generator->generate($name, $parameters, $relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH);
    }

    public function getUrl($name, $parameters = array(), $schemeRelative = false)
    {
        return $this->generator->generate($name, $parameters, $schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL);
    }

    /**
     * Determines at compile time whether the generated URL will be safe and thus
     * saving the unneeded automatic escaping for performance reasons.
     *
     * The URL generation process percent encodes non-alphanumeric characters. So there is no risk
     * that malicious/invalid characters are part of the URL. The only character within an URL that
     * must be escaped in html is the ampersand ("&") which separates query params. So we cannot mark
     * the URL generation as always safe, but only when we are sure there won't be multiple query
     * params. This is the case when there are none or only one constant parameter given.
     * E.g. we know beforehand this will be safe:
     * - path('route')
     * - path('route', {'param': 'value'})
     * But the following may not:
     * - path('route', var)
     * - path('route', {'param': ['val1', 'val2'] }) // a sub-array
     * - path('route', {'param1': 'value1', 'param2': 'value2'})
     * If param1 and param2 reference placeholder in the route, it would still be safe. But we don't know.
     *
     * @param \Twig_Node $argsNode The arguments of the path/url function
     *
     * @return array An array with the contexts the URL is safe
     */
    public function isUrlGenerationSafe(\Twig_Node $argsNode)
    {
        // support named arguments
        $paramsNode = $argsNode->hasNode('parameters') ? $argsNode->getNode('parameters') : (
            $argsNode->hasNode(1) ? $argsNode->getNode(1) : null
        );

        if (null === $paramsNode || $paramsNode instanceof \Twig_Node_Expression_Array && count($paramsNode) <= 2 &&
            (!$paramsNode->hasNode(1) || $paramsNode->getNode(1) instanceof \Twig_Node_Expression_Constant)
        ) {
            return array('html');
        }

        return array();
    }

    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'routing';
    }
}
PK4a�\�5��mm9pear/Symfony/Bridge/Twig/Extension/StopwatchExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Extension;

use Symfony\Component\Stopwatch\Stopwatch;
use Symfony\Bridge\Twig\TokenParser\StopwatchTokenParser;

/**
 * Twig extension for the stopwatch helper.
 *
 * @author Wouter J <wouter@wouterj.nl>
 */
class StopwatchExtension extends \Twig_Extension
{
    private $stopwatch;

    public function __construct(Stopwatch $stopwatch = null)
    {
        $this->stopwatch = $stopwatch;
    }

    public function getStopwatch()
    {
        return $this->stopwatch;
    }

    public function getTokenParsers()
    {
        return array(
            /*
             * {% stopwatch foo %}
             * Some stuff which will be recorded on the timeline
             * {% endstopwatch %}
             */
            new StopwatchTokenParser($this->stopwatch !== null),
        );
    }

    public function getName()
    {
        return 'stopwatch';
    }
}
PK4a�\�?���;pear/Symfony/Bridge/Twig/Extension/TranslationExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Extension;

use Symfony\Bridge\Twig\TokenParser\TransTokenParser;
use Symfony\Bridge\Twig\TokenParser\TransChoiceTokenParser;
use Symfony\Bridge\Twig\TokenParser\TransDefaultDomainTokenParser;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Bridge\Twig\NodeVisitor\TranslationNodeVisitor;
use Symfony\Bridge\Twig\NodeVisitor\TranslationDefaultDomainNodeVisitor;

/**
 * Provides integration of the Translation component with Twig.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TranslationExtension extends \Twig_Extension
{
    private $translator;
    private $translationNodeVisitor;

    public function __construct(TranslatorInterface $translator, \Twig_NodeVisitorInterface $translationNodeVisitor = null)
    {
        if (!$translationNodeVisitor) {
            $translationNodeVisitor = new TranslationNodeVisitor();
        }

        $this->translator = $translator;
        $this->translationNodeVisitor = $translationNodeVisitor;
    }

    public function getTranslator()
    {
        return $this->translator;
    }

    /**
     * {@inheritdoc}
     */
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('trans', array($this, 'trans')),
            new \Twig_SimpleFilter('transchoice', array($this, 'transchoice')),
        );
    }

    /**
     * Returns the token parser instance to add to the existing list.
     *
     * @return array An array of Twig_TokenParser instances
     */
    public function getTokenParsers()
    {
        return array(
            // {% trans %}Symfony is great!{% endtrans %}
            new TransTokenParser(),

            // {% transchoice count %}
            //     {0} There is no apples|{1} There is one apple|]1,Inf] There is {{ count }} apples
            // {% endtranschoice %}
            new TransChoiceTokenParser(),

            // {% trans_default_domain "foobar" %}
            new TransDefaultDomainTokenParser(),
        );
    }

    /**
     * {@inheritdoc}
     */
    public function getNodeVisitors()
    {
        return array($this->translationNodeVisitor, new TranslationDefaultDomainNodeVisitor());
    }

    public function getTranslationNodeVisitor()
    {
        return $this->translationNodeVisitor;
    }

    public function trans($message, array $arguments = array(), $domain = null, $locale = null)
    {
        if (null === $domain) {
            $domain = 'messages';
        }

        return $this->translator->trans($message, $arguments, $domain, $locale);
    }

    public function transchoice($message, $count, array $arguments = array(), $domain = null, $locale = null)
    {
        if (null === $domain) {
            $domain = 'messages';
        }

        return $this->translator->transChoice($message, $count, array_merge(array('%count%' => $count), $arguments), $domain, $locale);
    }

    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'translator';
    }
}
PK4a�\K���:pear/Symfony/Bridge/Twig/Extension/ExpressionExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Extension;

use Symfony\Component\ExpressionLanguage\Expression;

/**
 * ExpressionExtension gives a way to create Expressions from a template.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ExpressionExtension extends \Twig_Extension
{
    /**
     * {@inheritdoc}
     */
    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('expression', array($this, 'createExpression')),
        );
    }

    public function createExpression($expression)
    {
        return new Expression($expression);
    }

    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'expression';
    }
}
PK4a�\�)�UU6pear/Symfony/Bridge/Twig/Translation/TwigExtractor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Translation;

use Symfony\Component\Finder\Finder;
use Symfony\Component\Translation\Extractor\ExtractorInterface;
use Symfony\Component\Translation\MessageCatalogue;

/**
 * TwigExtractor extracts translation messages from a twig template.
 *
 * @author Michel Salib <michelsalib@hotmail.com>
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TwigExtractor implements ExtractorInterface
{
    /**
     * Default domain for found messages.
     *
     * @var string
     */
    private $defaultDomain = 'messages';

    /**
     * Prefix for found message.
     *
     * @var string
     */
    private $prefix = '';

    /**
     * The twig environment.
     *
     * @var \Twig_Environment
     */
    private $twig;

    public function __construct(\Twig_Environment $twig)
    {
        $this->twig = $twig;
    }

    /**
     * {@inheritDoc}
     */
    public function extract($directory, MessageCatalogue $catalogue)
    {
        // load any existing translation files
        $finder = new Finder();
        $files = $finder->files()->name('*.twig')->sortByName()->in($directory);
        foreach ($files as $file) {
            $this->extractTemplate(file_get_contents($file->getPathname()), $catalogue);
        }
    }

    /**
     * {@inheritDoc}
     */
    public function setPrefix($prefix)
    {
        $this->prefix = $prefix;
    }

    protected function extractTemplate($template, MessageCatalogue $catalogue)
    {
        $visitor = $this->twig->getExtension('translator')->getTranslationNodeVisitor();
        $visitor->enable();

        $this->twig->parse($this->twig->tokenize($template));

        foreach ($visitor->getMessages() as $message) {
            $catalogue->set(trim($message[0]), $this->prefix.trim($message[0]), $message[1] ? $message[1] : $this->defaultDomain);
        }

        $visitor->disable();
    }
}
PK4a�\ʶ�̭�Fpear/Symfony/Bridge/Twig/TokenParser/TransDefaultDomainTokenParser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\TokenParser;

use Symfony\Bridge\Twig\Node\TransDefaultDomainNode;

/**
 * Token Parser for the 'trans_default_domain' tag.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TransDefaultDomainTokenParser extends \Twig_TokenParser
{
    /**
     * Parses a token and returns a node.
     *
     * @param \Twig_Token $token A Twig_Token instance
     *
     * @return \Twig_NodeInterface A Twig_NodeInterface instance
     */
    public function parse(\Twig_Token $token)
    {
        $expr = $this->parser->getExpressionParser()->parseExpression();

        $this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);

        return new TransDefaultDomainNode($expr, $token->getLine(), $this->getTag());
    }

    /**
     * Gets the tag name associated with this token parser.
     *
     * @return string The tag name
     */
    public function getTag()
    {
        return 'trans_default_domain';
    }
}
PK5a�\�/�	�	?pear/Symfony/Bridge/Twig/TokenParser/TransChoiceTokenParser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\TokenParser;

use Symfony\Bridge\Twig\Node\TransNode;

/**
 * Token Parser for the 'transchoice' tag.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TransChoiceTokenParser extends TransTokenParser
{
    /**
     * Parses a token and returns a node.
     *
     * @param \Twig_Token $token A Twig_Token instance
     *
     * @return \Twig_NodeInterface A Twig_NodeInterface instance
     *
     * @throws \Twig_Error_Syntax
     */
    public function parse(\Twig_Token $token)
    {
        $lineno = $token->getLine();
        $stream = $this->parser->getStream();

        $vars = new \Twig_Node_Expression_Array(array(), $lineno);

        $count = $this->parser->getExpressionParser()->parseExpression();

        $domain = null;
        $locale = null;

        if ($stream->test('with')) {
            // {% transchoice count with vars %}
            $stream->next();
            $vars = $this->parser->getExpressionParser()->parseExpression();
        }

        if ($stream->test('from')) {
            // {% transchoice count from "messages" %}
            $stream->next();
            $domain = $this->parser->getExpressionParser()->parseExpression();
        }

        if ($stream->test('into')) {
            // {% transchoice count into "fr" %}
            $stream->next();
            $locale =  $this->parser->getExpressionParser()->parseExpression();
        }

        $stream->expect(\Twig_Token::BLOCK_END_TYPE);

        $body = $this->parser->subparse(array($this, 'decideTransChoiceFork'), true);

        if (!$body instanceof \Twig_Node_Text && !$body instanceof \Twig_Node_Expression) {
            throw new \Twig_Error_Syntax('A message inside a transchoice tag must be a simple text.', $body->getLine(), $stream->getFilename());
        }

        $stream->expect(\Twig_Token::BLOCK_END_TYPE);

        return new TransNode($body, $domain, $count, $vars, $locale, $lineno, $this->getTag());
    }

    public function decideTransChoiceFork($token)
    {
        return $token->test(array('endtranschoice'));
    }

    /**
     * Gets the tag name associated with this token parser.
     *
     * @return string The tag name
     */
    public function getTag()
    {
        return 'transchoice';
    }
}
PK5a�\>����=pear/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\TokenParser;

use Symfony\Bridge\Twig\Node\FormThemeNode;

/**
 * Token Parser for the 'form_theme' tag.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class FormThemeTokenParser extends \Twig_TokenParser
{
    /**
     * Parses a token and returns a node.
     *
     * @param \Twig_Token $token A Twig_Token instance
     *
     * @return \Twig_NodeInterface A Twig_NodeInterface instance
     */
    public function parse(\Twig_Token $token)
    {
        $lineno = $token->getLine();
        $stream = $this->parser->getStream();

        $form = $this->parser->getExpressionParser()->parseExpression();

        if ($this->parser->getStream()->test(\Twig_Token::NAME_TYPE, 'with')) {
            $this->parser->getStream()->next();
            $resources = $this->parser->getExpressionParser()->parseExpression();
        } else {
            $resources = new \Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine());
            do {
                $resources->addElement($this->parser->getExpressionParser()->parseExpression());
            } while (!$stream->test(\Twig_Token::BLOCK_END_TYPE));
        }

        $stream->expect(\Twig_Token::BLOCK_END_TYPE);

        return new FormThemeNode($form, $resources, $lineno, $this->getTag());
    }

    /**
     * Gets the tag name associated with this token parser.
     *
     * @return string The tag name
     */
    public function getTag()
    {
        return 'form_theme';
    }
}
PK5a�\.��=pear/Symfony/Bridge/Twig/TokenParser/StopwatchTokenParser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\TokenParser;

use Symfony\Bridge\Twig\Node\StopwatchNode;

/**
 * Token Parser for the stopwatch tag.
 *
 * @author Wouter J <wouter@wouterj.nl>
 */
class StopwatchTokenParser extends \Twig_TokenParser
{
    protected $stopwatchIsAvailable;

    public function __construct($stopwatchIsAvailable)
    {
        $this->stopwatchIsAvailable = $stopwatchIsAvailable;
    }

    public function parse(\Twig_Token $token)
    {
        $lineno = $token->getLine();
        $stream = $this->parser->getStream();

        // {% stopwatch 'bar' %}
        $name = $this->parser->getExpressionParser()->parseExpression();

        $stream->expect(\Twig_Token::BLOCK_END_TYPE);

        // {% endstopwatch %}
        $body = $this->parser->subparse(array($this, 'decideStopwatchEnd'), true);
        $stream->expect(\Twig_Token::BLOCK_END_TYPE);

        if ($this->stopwatchIsAvailable) {
            return new StopwatchNode($name, $body, new \Twig_Node_Expression_AssignName($this->parser->getVarName(), $token->getLine()), $lineno, $this->getTag());
        }

        return $body;
    }

    public function decideStopwatchEnd(\Twig_Token $token)
    {
        return $token->test('endstopwatch');
    }

    public function getTag()
    {
        return 'stopwatch';
    }
}
PK5a�\�%]�
�
9pear/Symfony/Bridge/Twig/TokenParser/TransTokenParser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\TokenParser;

use Symfony\Bridge\Twig\Node\TransNode;

/**
 * Token Parser for the 'trans' tag.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TransTokenParser extends \Twig_TokenParser
{
    /**
     * Parses a token and returns a node.
     *
     * @param \Twig_Token $token A Twig_Token instance
     *
     * @return \Twig_NodeInterface A Twig_NodeInterface instance
     *
     * @throws \Twig_Error_Syntax
     */
    public function parse(\Twig_Token $token)
    {
        $lineno = $token->getLine();
        $stream = $this->parser->getStream();

        $vars = new \Twig_Node_Expression_Array(array(), $lineno);
        $domain = null;
        $locale = null;
        if (!$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
            if ($stream->test('with')) {
                // {% trans with vars %}
                $stream->next();
                $vars = $this->parser->getExpressionParser()->parseExpression();
            }

            if ($stream->test('from')) {
                // {% trans from "messages" %}
                $stream->next();
                $domain = $this->parser->getExpressionParser()->parseExpression();
            }

            if ($stream->test('into')) {
                // {% trans into "fr" %}
                $stream->next();
                $locale =  $this->parser->getExpressionParser()->parseExpression();
            } elseif (!$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
                throw new \Twig_Error_Syntax('Unexpected token. Twig was looking for the "with", "from", or "into" keyword.', $stream->getCurrent()->getLine(), $stream->getFilename());
            }
        }

        // {% trans %}message{% endtrans %}
        $stream->expect(\Twig_Token::BLOCK_END_TYPE);
        $body = $this->parser->subparse(array($this, 'decideTransFork'), true);

        if (!$body instanceof \Twig_Node_Text && !$body instanceof \Twig_Node_Expression) {
            throw new \Twig_Error_Syntax('A message inside a trans tag must be a simple text.', $body->getLine(), $stream->getFilename());
        }

        $stream->expect(\Twig_Token::BLOCK_END_TYPE);

        return new TransNode($body, $domain, null, $vars, $locale, $lineno, $this->getTag());
    }

    public function decideTransFork($token)
    {
        return $token->test(array('endtrans'));
    }

    /**
     * Gets the tag name associated with this token parser.
     *
     * @return string The tag name
     */
    public function getTag()
    {
        return 'trans';
    }
}
PK5a�\�Lpear/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\NodeVisitor;

use Symfony\Bridge\Twig\Node\TransNode;
use Symfony\Bridge\Twig\Node\TransDefaultDomainNode;

/**
 * TranslationDefaultDomainNodeVisitor.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TranslationDefaultDomainNodeVisitor implements \Twig_NodeVisitorInterface
{
    /**
     * @var Scope
     */
    private $scope;

    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->scope = new Scope();
    }

    /**
     * {@inheritdoc}
     */
    public function enterNode(\Twig_NodeInterface $node, \Twig_Environment $env)
    {
        if ($node instanceof \Twig_Node_Block || $node instanceof \Twig_Node_Module) {
            $this->scope = $this->scope->enter();
        }

        if ($node instanceof TransDefaultDomainNode) {
            if ($node->getNode('expr') instanceof \Twig_Node_Expression_Constant) {
                $this->scope->set('domain', $node->getNode('expr'));

                return $node;
            } else {
                $var = $env->getParser()->getVarName();
                $name = new \Twig_Node_Expression_AssignName($var, $node->getLine());
                $this->scope->set('domain', new \Twig_Node_Expression_Name($var, $node->getLine()));

                return new \Twig_Node_Set(false, new \Twig_Node(array($name)), new \Twig_Node(array($node->getNode('expr'))), $node->getLine());
            }
        }

        if (!$this->scope->has('domain')) {
            return $node;
        }

        if ($node instanceof \Twig_Node_Expression_Filter && in_array($node->getNode('filter')->getAttribute('value'), array('trans', 'transchoice'))) {
            $ind = 'trans' === $node->getNode('filter')->getAttribute('value') ? 1 : 2;
            $arguments = $node->getNode('arguments');
            if (!$arguments->hasNode($ind)) {
                if (!$arguments->hasNode($ind - 1)) {
                    $arguments->setNode($ind - 1, new \Twig_Node_Expression_Array(array(), $node->getLine()));
                }

                $arguments->setNode($ind, $this->scope->get('domain'));
            }
        } elseif ($node instanceof TransNode) {
            if (null === $node->getNode('domain')) {
                $node->setNode('domain', $this->scope->get('domain'));
            }
        }

        return $node;
    }

    /**
     * {@inheritdoc}
     */
    public function leaveNode(\Twig_NodeInterface $node, \Twig_Environment $env)
    {
        if ($node instanceof TransDefaultDomainNode) {
            return false;
        }

        if ($node instanceof \Twig_Node_Block || $node instanceof \Twig_Node_Module) {
            $this->scope = $this->scope->leave();
        }

        return $node;
    }

    /**
     * {@inheritdoc}
     */
    public function getPriority()
    {
        return -10;
    }
}
PK6a�\�tA�?pear/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\NodeVisitor;

use Symfony\Bridge\Twig\Node\TransNode;

/**
 * TranslationNodeVisitor extracts translation messages.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TranslationNodeVisitor implements \Twig_NodeVisitorInterface
{
    const UNDEFINED_DOMAIN = '_undefined';

    private $enabled = false;
    private $messages = array();

    public function enable()
    {
        $this->enabled = true;
        $this->messages = array();
    }

    public function disable()
    {
        $this->enabled = false;
        $this->messages = array();
    }

    public function getMessages()
    {
        return $this->messages;
    }

    /**
     * {@inheritdoc}
     */
    public function enterNode(\Twig_NodeInterface $node, \Twig_Environment $env)
    {
        if (!$this->enabled) {
            return $node;
        }

        if (
            $node instanceof \Twig_Node_Expression_Filter &&
            'trans' === $node->getNode('filter')->getAttribute('value') &&
            $node->getNode('node') instanceof \Twig_Node_Expression_Constant
        ) {
            // extract constant nodes with a trans filter
            $this->messages[] = array(
                $node->getNode('node')->getAttribute('value'),
                $this->getReadDomainFromArguments($node->getNode('arguments'), 1),
            );
        } elseif (
            $node instanceof \Twig_Node_Expression_Filter &&
            'transchoice' === $node->getNode('filter')->getAttribute('value') &&
            $node->getNode('node') instanceof \Twig_Node_Expression_Constant
        ) {
            // extract constant nodes with a trans filter
            $this->messages[] = array(
                $node->getNode('node')->getAttribute('value'),
                $this->getReadDomainFromArguments($node->getNode('arguments'), 2),
            );
        } elseif ($node instanceof TransNode) {
            // extract trans nodes
            $this->messages[] = array(
                $node->getNode('body')->getAttribute('data'),
                $this->getReadDomainFromNode($node->getNode('domain')),
            );
        }

        return $node;
    }

    /**
     * {@inheritdoc}
     */
    public function leaveNode(\Twig_NodeInterface $node, \Twig_Environment $env)
    {
        return $node;
    }

    /**
     * {@inheritdoc}
     */
    public function getPriority()
    {
        return 0;
    }

    /**
     * @param \Twig_Node $arguments
     * @param int        $index
     *
     * @return string|null
     */
    private function getReadDomainFromArguments(\Twig_Node $arguments, $index)
    {
        if ($arguments->hasNode('domain')) {
            $argument = $arguments->getNode('domain');
        } elseif ($arguments->hasNode($index)) {
            $argument = $arguments->getNode($index);
        } else {
            return null;
        }

        return $this->getReadDomainFromNode($argument);
    }

    /**
     * @param \Twig_Node $node
     *
     * @return string|null
     */
    private function getReadDomainFromNode(\Twig_Node $node = null)
    {
        if (null === $node) {
            return null;
        }

        if ($node instanceof \Twig_Node_Expression_Constant) {
            return $node->getAttribute('value');
        }

        return self::UNDEFINED_DOMAIN;
    }
}
PK6a�\�)�[n	n	.pear/Symfony/Bridge/Twig/NodeVisitor/Scope.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\NodeVisitor;

/**
 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
 */
class Scope
{
    /**
     * @var Scope|null
     */
    private $parent;

    /**
     * @var Scope[]
     */
    private $children;

    /**
     * @var array
     */
    private $data = array();

    /**
     * @var boolean
     */
    private $left = false;

    /**
     * @param Scope $parent
     */
    public function __construct(Scope $parent = null)
    {
        $this->parent = $parent;
    }

    /**
     * Opens a new child scope.
     *
     * @return Scope
     */
    public function enter()
    {
        $child = new self($this);
        $this->children[] = $child;

        return $child;
    }

    /**
     * Closes current scope and returns parent one.
     *
     * @return Scope|null
     */
    public function leave()
    {
        $this->left = true;

        return $this->parent;
    }

    /**
     * Stores data into current scope.
     *
     * @param string $key
     * @param mixed  $value
     *
     * @throws \LogicException
     *
     * @return Scope Current scope
     */
    public function set($key, $value)
    {
        if ($this->left) {
            throw new \LogicException('Left scope is not mutable.');
        }

        $this->data[$key] = $value;

        return $this;
    }

    /**
     * Tests if a data is visible from current scope.
     *
     * @param string $key
     *
     * @return boolean
     */
    public function has($key)
    {
        if (array_key_exists($key, $this->data)) {
            return true;
        }

        if (null === $this->parent) {
            return false;
        }

        return $this->parent->has($key);
    }

    /**
     * Returns data visible from current scope.
     *
     * @param string $key
     * @param mixed  $default
     *
     * @return mixed
     */
    public function get($key, $default = null)
    {
        if (array_key_exists($key, $this->data)) {
            return $this->data[$key];
        }

        if (null === $this->parent) {
            return $default;
        }

        return $this->parent->get($key, $default);
    }
}
PK6a�\�vq�.pear/Symfony/Bridge/Twig/Form/TwigRenderer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Form;

use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderAdapter;
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\CsrfProviderInterface;
use Symfony\Component\Form\FormRenderer;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class TwigRenderer extends FormRenderer implements TwigRendererInterface
{
    /**
     * @var TwigRendererEngineInterface
     */
    private $engine;

    public function __construct(TwigRendererEngineInterface $engine, $csrfTokenManager = null)
    {
        if ($csrfTokenManager instanceof CsrfProviderInterface) {
            $csrfTokenManager = new CsrfProviderAdapter($csrfTokenManager);
        } elseif (null !== $csrfTokenManager && !$csrfTokenManager instanceof CsrfTokenManagerInterface) {
            throw new UnexpectedTypeException($csrfTokenManager, 'CsrfProviderInterface or CsrfTokenManagerInterface');
        }

        parent::__construct($engine, $csrfTokenManager);

        $this->engine = $engine;
    }

    /**
     * {@inheritdoc}
     */
    public function setEnvironment(\Twig_Environment $environment)
    {
        $this->engine->setEnvironment($environment);
    }
}
PK7a�\��<��4pear/Symfony/Bridge/Twig/Form/TwigRendererEngine.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Form;

use Symfony\Component\Form\AbstractRendererEngine;
use Symfony\Component\Form\FormView;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class TwigRendererEngine extends AbstractRendererEngine implements TwigRendererEngineInterface
{
    /**
     * @var \Twig_Environment
     */
    private $environment;

    /**
     * @var \Twig_Template
     */
    private $template;

    /**
     * {@inheritdoc}
     */
    public function setEnvironment(\Twig_Environment $environment)
    {
        $this->environment = $environment;
    }

    /**
     * {@inheritdoc}
     */
    public function renderBlock(FormView $view, $resource, $blockName, array $variables = array())
    {
        $cacheKey = $view->vars[self::CACHE_KEY_VAR];

        $context = $this->environment->mergeGlobals($variables);

        ob_start();

        // By contract,This method can only be called after getting the resource
        // (which is passed to the method). Getting a resource for the first time
        // (with an empty cache) is guaranteed to invoke loadResourcesFromTheme(),
        // where the property $template is initialized.

        // We do not call renderBlock here to avoid too many nested level calls
        // (XDebug limits the level to 100 by default)
        $this->template->displayBlock($blockName, $context, $this->resources[$cacheKey]);

        return ob_get_clean();
    }

    /**
     * Loads the cache with the resource for a given block name.
     *
     * This implementation eagerly loads all blocks of the themes assigned to the given view
     * and all of its ancestors views. This is necessary, because Twig receives the
     * list of blocks later. At that point, all blocks must already be loaded, for the
     * case that the function "block()" is used in the Twig template.
     *
     * @see getResourceForBlock()
     *
     * @param string   $cacheKey  The cache key of the form view.
     * @param FormView $view      The form view for finding the applying themes.
     * @param string   $blockName The name of the block to load.
     *
     * @return Boolean True if the resource could be loaded, false otherwise.
     */
    protected function loadResourceForBlockName($cacheKey, FormView $view, $blockName)
    {
        // The caller guarantees that $this->resources[$cacheKey][$block] is
        // not set, but it doesn't have to check whether $this->resources[$cacheKey]
        // is set. If $this->resources[$cacheKey] is set, all themes for this
        // $cacheKey are already loaded (due to the eager population, see doc comment).
        if (isset($this->resources[$cacheKey])) {
            // As said in the previous, the caller guarantees that
            // $this->resources[$cacheKey][$block] is not set. Since the themes are
            // already loaded, it can only be a non-existing block.
            $this->resources[$cacheKey][$blockName] = false;

            return false;
        }

        // Recursively try to find the block in the themes assigned to $view,
        // then of its parent view, then of the parent view of the parent and so on.
        // When the root view is reached in this recursion, also the default
        // themes are taken into account.

        // Check each theme whether it contains the searched block
        if (isset($this->themes[$cacheKey])) {
            for ($i = count($this->themes[$cacheKey]) - 1; $i >= 0; --$i) {
                $this->loadResourcesFromTheme($cacheKey, $this->themes[$cacheKey][$i]);
                // CONTINUE LOADING (see doc comment)
            }
        }

        // Check the default themes once we reach the root view without success
        if (!$view->parent) {
            for ($i = count($this->defaultThemes) - 1; $i >= 0; --$i) {
                $this->loadResourcesFromTheme($cacheKey, $this->defaultThemes[$i]);
                // CONTINUE LOADING (see doc comment)
            }
        }

        // Proceed with the themes of the parent view
        if ($view->parent) {
            $parentCacheKey = $view->parent->vars[self::CACHE_KEY_VAR];

            if (!isset($this->resources[$parentCacheKey])) {
                $this->loadResourceForBlockName($parentCacheKey, $view->parent, $blockName);
            }

            // EAGER CACHE POPULATION (see doc comment)
            foreach ($this->resources[$parentCacheKey] as $nestedBlockName => $resource) {
                if (!isset($this->resources[$cacheKey][$nestedBlockName])) {
                    $this->resources[$cacheKey][$nestedBlockName] = $resource;
                }
            }
        }

        // Even though we loaded the themes, it can happen that none of them
        // contains the searched block
        if (!isset($this->resources[$cacheKey][$blockName])) {
            // Cache that we didn't find anything to speed up further accesses
            $this->resources[$cacheKey][$blockName] = false;
        }

        return false !== $this->resources[$cacheKey][$blockName];
    }

    /**
     * Loads the resources for all blocks in a theme.
     *
     * @param string $cacheKey The cache key for storing the resource.
     * @param mixed  $theme    The theme to load the block from. This parameter
     *                         is passed by reference, because it might be necessary
     *                         to initialize the theme first. Any changes made to
     *                         this variable will be kept and be available upon
     *                         further calls to this method using the same theme.
     */
    protected function loadResourcesFromTheme($cacheKey, &$theme)
    {
        if (!$theme instanceof \Twig_Template) {
            /* @var \Twig_Template $theme */
            $theme = $this->environment->loadTemplate($theme);
        }

        if (null === $this->template) {
            // Store the first \Twig_Template instance that we find so that
            // we can call displayBlock() later on. It doesn't matter *which*
            // template we use for that, since we pass the used blocks manually
            // anyway.
            $this->template = $theme;
        }

        // Use a separate variable for the inheritance traversal, because
        // theme is a reference and we don't want to change it.
        $currentTheme = $theme;

        $context = $this->environment->mergeGlobals(array());

        // The do loop takes care of template inheritance.
        // Add blocks from all templates in the inheritance tree, but avoid
        // overriding blocks already set.
        do {
            foreach ($currentTheme->getBlocks() as $block => $blockData) {
                if (!isset($this->resources[$cacheKey][$block])) {
                    // The resource given back is the key to the bucket that
                    // contains this block.
                    $this->resources[$cacheKey][$block] = $blockData;
                }
            }
        } while (false !== $currentTheme = $currentTheme->getParent($context));
    }
}
PK7a�\b�3�}}=pear/Symfony/Bridge/Twig/Form/TwigRendererEngineInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Form;

use Symfony\Component\Form\FormRendererEngineInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface TwigRendererEngineInterface extends FormRendererEngineInterface
{
    /**
     * Sets Twig's environment.
     *
     * @param \Twig_Environment $environment
     */
    public function setEnvironment(\Twig_Environment $environment);
}
PK7a�\��Qkk7pear/Symfony/Bridge/Twig/Form/TwigRendererInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig\Form;

use Symfony\Component\Form\FormRendererInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
interface TwigRendererInterface extends FormRendererInterface
{
    /**
     * Sets Twig's environment.
     *
     * @param \Twig_Environment $environment
     */
    public function setEnvironment(\Twig_Environment $environment);
}
PK7a�\^D��dd'pear/Symfony/Bridge/Twig/TwigEngine.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Twig;

use Symfony\Component\Templating\EngineInterface;
use Symfony\Component\Templating\StreamingEngineInterface;
use Symfony\Component\Templating\TemplateNameParserInterface;
use Symfony\Component\Templating\TemplateReferenceInterface;

/**
 * This engine knows how to render Twig templates.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class TwigEngine implements EngineInterface, StreamingEngineInterface
{
    protected $environment;
    protected $parser;

    /**
     * Constructor.
     *
     * @param \Twig_Environment           $environment A \Twig_Environment instance
     * @param TemplateNameParserInterface $parser      A TemplateNameParserInterface instance
     */
    public function __construct(\Twig_Environment $environment, TemplateNameParserInterface $parser)
    {
        $this->environment = $environment;
        $this->parser = $parser;
    }

    /**
     * {@inheritdoc}
     *
     * It also supports \Twig_Template as name parameter.
     *
     * @throws \Twig_Error if something went wrong like a thrown exception while rendering the template
     */
    public function render($name, array $parameters = array())
    {
        return $this->load($name)->render($parameters);
    }

    /**
     * {@inheritdoc}
     *
     * It also supports \Twig_Template as name parameter.
     *
     * @throws \Twig_Error if something went wrong like a thrown exception while rendering the template
     */
    public function stream($name, array $parameters = array())
    {
        $this->load($name)->display($parameters);
    }

    /**
     * {@inheritdoc}
     *
     * It also supports \Twig_Template as name parameter.
     */
    public function exists($name)
    {
        if ($name instanceof \Twig_Template) {
            return true;
        }

        $loader = $this->environment->getLoader();

        if ($loader instanceof \Twig_ExistsLoaderInterface) {
            return $loader->exists((string) $name);
        }

        try {
            // cast possible TemplateReferenceInterface to string because the
            // EngineInterface supports them but Twig_LoaderInterface does not
            $loader->getSource((string) $name);
        } catch (\Twig_Error_Loader $e) {
            return false;
        }

        return true;
    }

    /**
     * {@inheritdoc}
     *
     * It also supports \Twig_Template as name parameter.
     */
    public function supports($name)
    {
        if ($name instanceof \Twig_Template) {
            return true;
        }

        $template = $this->parser->parse($name);

        return 'twig' === $template->get('engine');
    }

    /**
     * Loads the given template.
     *
     * @param string|TemplateReferenceInterface|\Twig_Template $name A template name or an instance of
     *                                                               TemplateReferenceInterface or \Twig_Template
     *
     * @return \Twig_TemplateInterface A \Twig_TemplateInterface instance
     *
     * @throws \InvalidArgumentException if the template does not exist
     */
    protected function load($name)
    {
        if ($name instanceof \Twig_Template) {
            return $name;
        }

        try {
            return $this->environment->loadTemplate((string) $name);
        } catch (\Twig_Error_Loader $e) {
            throw new \InvalidArgumentException($e->getMessage(), $e->getCode(), $e);
        }
    }
}
PK7a�\�$�KK'pear/Symfony/Bridge/Twig/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Bridge\\Twig\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK7a�\��9292Gpear/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twignu�[���{# Widgets #}

{% block form_widget %}
{% spaceless %}
    {% if compound %}
        {{ block('form_widget_compound') }}
    {% else %}
        {{ block('form_widget_simple') }}
    {% endif %}
{% endspaceless %}
{% endblock form_widget %}

{% block form_widget_simple %}
{% spaceless %}
    {% set type = type|default('text') %}
    <input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
{% endspaceless %}
{% endblock form_widget_simple %}

{% block form_widget_compound %}
{% spaceless %}
    <div {{ block('widget_container_attributes') }}>
        {% if form.parent is empty %}
            {{ form_errors(form) }}
        {% endif %}
        {{ block('form_rows') }}
        {{ form_rest(form) }}
    </div>
{% endspaceless %}
{% endblock form_widget_compound %}

{% block collection_widget %}
{% spaceless %}
    {% if prototype is defined %}
        {% set attr = attr|merge({'data-prototype': form_row(prototype) }) %}
    {% endif %}
    {{ block('form_widget') }}
{% endspaceless %}
{% endblock collection_widget %}

{% block textarea_widget %}
{% spaceless %}
    <textarea {{ block('widget_attributes') }}>{{ value }}</textarea>
{% endspaceless %}
{% endblock textarea_widget %}

{% block choice_widget %}
{% spaceless %}
    {% if expanded %}
        {{ block('choice_widget_expanded') }}
    {% else %}
        {{ block('choice_widget_collapsed') }}
    {% endif %}
{% endspaceless %}
{% endblock choice_widget %}

{% block choice_widget_expanded %}
{% spaceless %}
    <div {{ block('widget_container_attributes') }}>
    {% for child in form %}
        {{ form_widget(child) }}
        {{ form_label(child) }}
    {% endfor %}
    </div>
{% endspaceless %}
{% endblock choice_widget_expanded %}

{% block choice_widget_collapsed %}
{% spaceless %}
    {% if required and empty_value is none and not empty_value_in_choices and not multiple %}
        {% set required = false %}
    {% endif %}
    <select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
        {% if empty_value is not none %}
            <option value=""{% if required and value is empty %} selected="selected"{% endif %}>{{ empty_value|trans({}, translation_domain) }}</option>
        {% endif %}
        {% if preferred_choices|length > 0 %}
            {% set options = preferred_choices %}
            {{ block('choice_widget_options') }}
            {% if choices|length > 0 and separator is not none %}
                <option disabled="disabled">{{ separator }}</option>
            {% endif %}
        {% endif %}
        {% set options = choices %}
        {{ block('choice_widget_options') }}
    </select>
{% endspaceless %}
{% endblock choice_widget_collapsed %}

{% block choice_widget_options %}
{% spaceless %}
    {% for group_label, choice in options %}
        {% if choice is iterable %}
            <optgroup label="{{ group_label|trans({}, translation_domain) }}">
                {% set options = choice %}
                {{ block('choice_widget_options') }}
            </optgroup>
        {% else %}
            <option value="{{ choice.value }}"{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice.label|trans({}, translation_domain) }}</option>
        {% endif %}
    {% endfor %}
{% endspaceless %}
{% endblock choice_widget_options %}

{% block checkbox_widget %}
{% spaceless %}
    <input type="checkbox" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
{% endspaceless %}
{% endblock checkbox_widget %}

{% block radio_widget %}
{% spaceless %}
    <input type="radio" {{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
{% endspaceless %}
{% endblock radio_widget %}

{% block datetime_widget %}
{% spaceless %}
    {% if widget == 'single_text' %}
        {{ block('form_widget_simple') }}
    {% else %}
        <div {{ block('widget_container_attributes') }}>
            {{ form_errors(form.date) }}
            {{ form_errors(form.time) }}
            {{ form_widget(form.date) }}
            {{ form_widget(form.time) }}
        </div>
    {% endif %}
{% endspaceless %}
{% endblock datetime_widget %}

{% block date_widget %}
{% spaceless %}
    {% if widget == 'single_text' %}
        {{ block('form_widget_simple') }}
    {% else %}
        <div {{ block('widget_container_attributes') }}>
            {{ date_pattern|replace({
                '{{ year }}':  form_widget(form.year),
                '{{ month }}': form_widget(form.month),
                '{{ day }}':   form_widget(form.day),
            })|raw }}
        </div>
    {% endif %}
{% endspaceless %}
{% endblock date_widget %}

{% block time_widget %}
{% spaceless %}
    {% if widget == 'single_text' %}
        {{ block('form_widget_simple') }}
    {% else %}
        {% set vars = widget == 'text' ? { 'attr': { 'size': 1 }} : {} %}
        <div {{ block('widget_container_attributes') }}>
            {{ form_widget(form.hour, vars) }}{% if with_minutes %}:{{ form_widget(form.minute, vars) }}{% endif %}{% if with_seconds %}:{{ form_widget(form.second, vars) }}{% endif %}
        </div>
    {% endif %}
{% endspaceless %}
{% endblock time_widget %}

{% block number_widget %}
{% spaceless %}
    {# type="number" doesn't work with floats #}
    {% set type = type|default('text') %}
    {{ block('form_widget_simple') }}
{% endspaceless %}
{% endblock number_widget %}

{% block integer_widget %}
{% spaceless %}
    {% set type = type|default('number') %}
    {{ block('form_widget_simple') }}
{% endspaceless %}
{% endblock integer_widget %}

{% block money_widget %}
{% spaceless %}
    {{ money_pattern|replace({ '{{ widget }}': block('form_widget_simple') })|raw }}
{% endspaceless %}
{% endblock money_widget %}

{% block url_widget %}
{% spaceless %}
    {% set type = type|default('url') %}
    {{ block('form_widget_simple') }}
{% endspaceless %}
{% endblock url_widget %}

{% block search_widget %}
{% spaceless %}
    {% set type = type|default('search') %}
    {{ block('form_widget_simple') }}
{% endspaceless %}
{% endblock search_widget %}

{% block percent_widget %}
{% spaceless %}
    {% set type = type|default('text') %}
    {{ block('form_widget_simple') }} %
{% endspaceless %}
{% endblock percent_widget %}

{% block password_widget %}
{% spaceless %}
    {% set type = type|default('password') %}
    {{ block('form_widget_simple') }}
{% endspaceless %}
{% endblock password_widget %}

{% block hidden_widget %}
{% spaceless %}
    {% set type = type|default('hidden') %}
    {{ block('form_widget_simple') }}
{% endspaceless %}
{% endblock hidden_widget %}

{% block email_widget %}
{% spaceless %}
    {% set type = type|default('email') %}
    {{ block('form_widget_simple') }}
{% endspaceless %}
{% endblock email_widget %}

{% block button_widget %}
{% spaceless %}
    {% if label is empty %}
        {% set label = name|humanize %}
    {% endif %}
    <button type="{{ type|default('button') }}" {{ block('button_attributes') }}>{{ label|trans({}, translation_domain) }}</button>
{% endspaceless %}
{% endblock button_widget %}

{% block submit_widget %}
{% spaceless %}
    {% set type = type|default('submit') %}
    {{ block('button_widget') }}
{% endspaceless %}
{% endblock submit_widget %}

{% block reset_widget %}
{% spaceless %}
    {% set type = type|default('reset') %}
    {{ block('button_widget') }}
{% endspaceless %}
{% endblock reset_widget %}

{# Labels #}

{% block form_label %}
{% spaceless %}
    {% if label is not sameas(false) %}
        {% if not compound %}
            {% set label_attr = label_attr|merge({'for': id}) %}
        {% endif %}
        {% if required %}
            {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
        {% endif %}
        {% if label is empty %}
            {% set label = name|humanize %}
        {% endif %}
        <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ label|trans({}, translation_domain) }}</label>
    {% endif %}
{% endspaceless %}
{% endblock form_label %}

{% block button_label %}{% endblock %}

{# Rows #}

{% block repeated_row %}
{% spaceless %}
    {#
    No need to render the errors here, as all errors are mapped
    to the first child (see RepeatedTypeValidatorExtension).
    #}
    {{ block('form_rows') }}
{% endspaceless %}
{% endblock repeated_row %}

{% block form_row %}
{% spaceless %}
    <div>
        {{ form_label(form) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
{% endspaceless %}
{% endblock form_row %}

{% block button_row %}
{% spaceless %}
    <div>
        {{ form_widget(form) }}
    </div>
{% endspaceless %}
{% endblock button_row %}

{% block hidden_row %}
    {{ form_widget(form) }}
{% endblock hidden_row %}

{# Misc #}

{% block form %}
{% spaceless %}
    {{ form_start(form) }}
        {{ form_widget(form) }}
    {{ form_end(form) }}
{% endspaceless %}
{% endblock form %}

{% block form_start %}
{% spaceless %}
    {% set method = method|upper %}
    {% if method in ["GET", "POST"] %}
        {% set form_method = method %}
    {% else %}
        {% set form_method = "POST" %}
    {% endif %}
    <form name="{{ form.vars.name }}" method="{{ form_method|lower }}" action="{{ action }}"{% for attrname, attrvalue in attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}{% if multipart %} enctype="multipart/form-data"{% endif %}>
    {% if form_method != method %}
        <input type="hidden" name="_method" value="{{ method }}" />
    {% endif %}
{% endspaceless %}
{% endblock form_start %}

{% block form_end %}
{% spaceless %}
    {% if not render_rest is defined or render_rest %}
        {{ form_rest(form) }}
    {% endif %}
    </form>
{% endspaceless %}
{% endblock form_end %}

{% block form_enctype %}
{% spaceless %}
    {% if multipart %}enctype="multipart/form-data"{% endif %}
{% endspaceless %}
{% endblock form_enctype %}

{% block form_errors %}
{% spaceless %}
    {% if errors|length > 0 %}
    <ul>
        {% for error in errors %}
            <li>{{ error.message }}</li>
        {% endfor %}
    </ul>
    {% endif %}
{% endspaceless %}
{% endblock form_errors %}

{% block form_rest %}
{% spaceless %}
    {% for child in form %}
        {% if not child.rendered %}
            {{ form_row(child) }}
        {% endif %}
    {% endfor %}
{% endspaceless %}
{% endblock form_rest %}

{# Support #}

{% block form_rows %}
{% spaceless %}
    {% for child in form %}
        {{ form_row(child) }}
    {% endfor %}
{% endspaceless %}
{% endblock form_rows %}

{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ full_name }}"
    {%- if read_only %} readonly="readonly"{% endif -%}
    {%- if disabled %} disabled="disabled"{% endif -%}
    {%- if required %} required="required"{% endif -%}
    {%- if max_length %} maxlength="{{ max_length }}"{% endif -%}
    {%- if pattern %} pattern="{{ pattern }}"{% endif -%}
    {%- for attrname, attrvalue in attr -%}
        {{- " " -}}
        {%- if attrname in ['placeholder', 'title'] -%}
            {{- attrname }}="{{ attrvalue|trans({}, translation_domain) }}"
        {%- elseif attrvalue is sameas(true) -%}
            {{- attrname }}="{{ attrname }}"
        {%- elseif attrvalue is not sameas(false) -%}
            {{- attrname }}="{{ attrvalue }}"
        {%- endif -%}
    {%- endfor -%}
{% endspaceless %}
{% endblock widget_attributes %}

{% block widget_container_attributes %}
{% spaceless %}
    {%- if id is not empty %}id="{{ id }}"{% endif -%}
    {%- for attrname, attrvalue in attr -%}
        {{- " " -}}
        {%- if attrname in ['placeholder', 'title'] -%}
            {{- attrname }}="{{ attrvalue|trans({}, translation_domain) }}"
        {%- elseif attrvalue is sameas(true) -%}
            {{- attrname }}="{{ attrname }}"
        {%- elseif attrvalue is not sameas(false) -%}
            {{- attrname }}="{{ attrvalue }}"
        {%- endif -%}
    {%- endfor -%}
{% endspaceless %}
{% endblock widget_container_attributes %}

{% block button_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ full_name }}"{% if disabled %} disabled="disabled"{% endif -%}
    {%- for attrname, attrvalue in attr -%}
        {{- " " -}}
        {%- if attrname in ['placeholder', 'title'] -%}
            {{- attrname }}="{{ attrvalue|trans({}, translation_domain) }}"
        {%- elseif attrvalue is sameas(true) -%}
            {{- attrname }}="{{ attrname }}"
        {%- elseif attrvalue is not sameas(false) -%}
            {{- attrname }}="{{ attrvalue }}"
        {%- endif -%}
    {%- endfor -%}
{% endspaceless %}
{% endblock button_attributes %}
PK8a�\��[[Ipear/Symfony/Bridge/Twig/Resources/views/Form/form_table_layout.html.twignu�[���{% use "form_div_layout.html.twig" %}

{% block form_row %}
{% spaceless %}
    <tr>
        <td>
            {{ form_label(form) }}
        </td>
        <td>
            {{ form_errors(form) }}
            {{ form_widget(form) }}
        </td>
    </tr>
{% endspaceless %}
{% endblock form_row %}

{% block button_row %}
{% spaceless %}
    <tr>
        <td></td>
        <td>
            {{ form_widget(form) }}
        </td>
    </tr>
{% endspaceless %}
{% endblock button_row %}

{% block hidden_row %}
{% spaceless %}
    <tr style="display: none">
        <td colspan="2">
            {{ form_widget(form) }}
        </td>
    </tr>
{% endspaceless %}
{% endblock hidden_row %}

{% block form_widget_compound %}
{% spaceless %}
    <table {{ block('widget_container_attributes') }}>
        {% if form.parent is empty and errors|length > 0 %}
        <tr>
            <td colspan="2">
                {{ form_errors(form) }}
            </td>
        </tr>
        {% endif %}
        {{ block('form_rows') }}
        {{ form_rest(form) }}
    </table>
{% endspaceless %}
{% endblock form_widget_compound %}
PK8a�\��X+��=pear/Symfony/Bridge/Doctrine/CacheWarmer/ProxyCacheWarmer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\CacheWarmer;

use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;

/**
 * The proxy generator cache warmer generates all entity proxies.
 *
 * In the process of generating proxies the cache for all the metadata is primed also,
 * since this information is necessary to build the proxies in the first place.
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 */
class ProxyCacheWarmer implements CacheWarmerInterface
{
    private $registry;

    /**
     * Constructor.
     *
     * @param ManagerRegistry $registry A ManagerRegistry instance
     */
    public function __construct(ManagerRegistry $registry)
    {
        $this->registry = $registry;
    }

    /**
     * This cache warmer is not optional, without proxies fatal error occurs!
     *
     * @return false
     */
    public function isOptional()
    {
        return false;
    }

    /**
     * {@inheritdoc}
     */
    public function warmUp($cacheDir)
    {
        foreach ($this->registry->getManagers() as $em) {
            // we need the directory no matter the proxy cache generation strategy
            if (!is_dir($proxyCacheDir = $em->getConfiguration()->getProxyDir())) {
                if (false === @mkdir($proxyCacheDir, 0777, true)) {
                    throw new \RuntimeException(sprintf('Unable to create the Doctrine Proxy directory "%s".', $proxyCacheDir));
                }
            } elseif (!is_writable($proxyCacheDir)) {
                throw new \RuntimeException(sprintf('The Doctrine Proxy directory "%s" is not writeable for the current system user.', $proxyCacheDir));
            }

            // if proxies are autogenerated we don't need to generate them in the cache warmer
            if ($em->getConfiguration()->getAutoGenerateProxyClasses()) {
                continue;
            }

            $classes = $em->getMetadataFactory()->getAllMetadata();

            $em->getProxyFactory()->generateProxyClasses($classes);
        }
    }
}
PK8a�\Xxo��2pear/Symfony/Bridge/Doctrine/Logger/DbalLogger.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Logger;

use Psr\Log\LoggerInterface;
use Symfony\Component\Stopwatch\Stopwatch;
use Doctrine\DBAL\Logging\SQLLogger;

/**
 * DbalLogger.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DbalLogger implements SQLLogger
{
    const MAX_STRING_LENGTH = 32;
    const BINARY_DATA_VALUE = '(binary value)';

    protected $logger;
    protected $stopwatch;

    /**
     * Constructor.
     *
     * @param LoggerInterface $logger    A LoggerInterface instance
     * @param Stopwatch       $stopwatch A Stopwatch instance
     */
    public function __construct(LoggerInterface $logger = null, Stopwatch $stopwatch = null)
    {
        $this->logger = $logger;
        $this->stopwatch = $stopwatch;
    }

    /**
     * {@inheritdoc}
     */
    public function startQuery($sql, array $params = null, array $types = null)
    {
        if (null !== $this->stopwatch) {
            $this->stopwatch->start('doctrine', 'doctrine');
        }

        if (is_array($params)) {
            foreach ($params as $index => $param) {
                if (!is_string($params[$index])) {
                    continue;
                }

                // non utf-8 strings break json encoding
                if (!preg_match('#[\p{L}\p{N} ]#u', $params[$index])) {
                    $params[$index] = self::BINARY_DATA_VALUE;
                    continue;
                }

                // detect if the too long string must be shorten
                if (function_exists('mb_detect_encoding') && false !== $encoding = mb_detect_encoding($params[$index])) {
                    if (self::MAX_STRING_LENGTH < mb_strlen($params[$index], $encoding)) {
                        $params[$index] = mb_substr($params[$index], 0, self::MAX_STRING_LENGTH - 6, $encoding).' [...]';
                        continue;
                    }
                } else {
                    if (self::MAX_STRING_LENGTH < strlen($params[$index])) {
                        $params[$index] = substr($params[$index], 0, self::MAX_STRING_LENGTH - 6).' [...]';
                        continue;
                    }
                }
            }
        }

        if (null !== $this->logger) {
            $this->log($sql, null === $params ? array() : $params);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function stopQuery()
    {
        if (null !== $this->stopwatch) {
            $this->stopwatch->stop('doctrine');
        }
    }

    /**
     * Logs a message.
     *
     * @param string $message A message to log
     * @param array  $params  The context
     */
    protected function log($message, array $params)
    {
        $this->logger->debug($message, $params);
    }
}
PK9a�\��㛕�Vpear/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterMappingsPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass;

use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;

/**
 * Base class for the doctrine bundles to provide a compiler pass class that
 * helps to register doctrine mappings.
 *
 * The compiler pass is meant to register the mappings with the metadata
 * chain driver corresponding to one of the object managers.
 *
 * For concrete implementations that are easy to use, see the
 * RegisterXyMappingsPass classes in the DoctrineBundle resp.
 * DoctrineMongodbBundle, DoctrineCouchdbBundle and DoctrinePhpcrBundle.
 *
 * @author David Buchmann <david@liip.ch>
 */
abstract class RegisterMappingsPass implements CompilerPassInterface
{
    /**
     * DI object for the driver to use, either a service definition for a
     * private service or a reference for a public service.
     * @var Definition|Reference
     */
    protected $driver;

    /**
     * List of namespaces handled by the driver
     * @var string[]
     */
    protected $namespaces;

    /**
     * List of potential container parameters that hold the object manager name
     * to register the mappings with the correct metadata driver, for example
     * array('acme.manager', 'doctrine.default_entity_manager')
     * @var string[]
     */
    protected $managerParameters;

    /**
     * Naming pattern of the metadata chain driver service ids, for example
     * 'doctrine.orm.%s_metadata_driver'
     * @var string
     */
    protected $driverPattern;

    /**
     * A name for a parameter in the container. If set, this compiler pass will
     * only do anything if the parameter is present. (But regardless of the
     * value of that parameter.
     * @var string
     */
    protected $enabledParameter;

    /**
     * @param Definition|Reference $driver            driver DI definition or reference
     * @param string[]             $namespaces        list of namespaces handled by $driver
     * @param string[]             $managerParameters list of container parameters
     *                                                that could hold the manager name
     * @param string               $driverPattern     pattern to get the metadata driver service names
     * @param string               $enabledParameter  service container parameter that must be
     *                                                present to enable the mapping. Set to false
     *                                                to not do any check, optional.
     */
    public function __construct($driver, array $namespaces, array $managerParameters, $driverPattern, $enabledParameter = false)
    {
        $this->driver = $driver;
        $this->namespaces = $namespaces;
        $this->managerParameters = $managerParameters;
        $this->driverPattern = $driverPattern;
        $this->enabledParameter = $enabledParameter;
    }

    /**
     * Register mappings with the metadata drivers.
     *
     * @param ContainerBuilder $container
     */
    public function process(ContainerBuilder $container)
    {
        if (!$this->enabled($container)) {
            return;
        }

        $mappingDriverDef = $this->getDriver($container);

        $chainDriverDefService = $this->getChainDriverServiceName($container);
        $chainDriverDef = $container->getDefinition($chainDriverDefService);
        foreach ($this->namespaces as $namespace) {
            $chainDriverDef->addMethodCall('addDriver', array($mappingDriverDef, $namespace));
        }
    }

    /**
     * Get the service name of the metadata chain driver that the mappings
     * should be registered with. The default implementation loops over the
     * managerParameters and applies the first non-empty parameter it finds to
     * the driverPattern.
     *
     * @param ContainerBuilder $container
     *
     * @return string a service definition name
     *
     * @throws ParameterNotFoundException if non of the managerParameters has a
     *      non-empty value.
     */
    protected function getChainDriverServiceName(ContainerBuilder $container)
    {
        foreach ($this->managerParameters as $param) {
            if ($container->hasParameter($param)) {
                $name = $container->getParameter($param);
                if ($name) {
                    return sprintf($this->driverPattern, $name);
                }
            }
        }

        throw new ParameterNotFoundException('None of the managerParameters resulted in a valid name');
    }

    /**
     * Create the service definition for the metadata driver.
     *
     * @param ContainerBuilder $container passed on in case an extending class
     *      needs access to the container.
     *
     * @return Definition|Reference the metadata driver to add to all chain drivers
     */
    protected function getDriver(ContainerBuilder $container)
    {
        return $this->driver;
    }

    /**
     * Determine whether this mapping should be activated or not. This allows
     * to take this decision with the container builder available.
     *
     * This default implementation checks if the class has the enabledParameter
     * configured and if so if that parameter is present in the container.
     *
     * @param ContainerBuilder $container
     *
     * @return boolean whether this compiler pass really should register the mappings
     */
    protected function enabled(ContainerBuilder $container)
    {
        return !$this->enabledParameter || $container->hasParameter($this->enabledParameter);
    }
}
PK9a�\��,���Xpear/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/DoctrineValidationPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\Config\Resource\FileResource;

/**
 * Registers additional validators
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 */
class DoctrineValidationPass implements CompilerPassInterface
{
    /**
     * @var string
     */
    private $managerType;

    public function __construct($managerType)
    {
        $this->managerType = $managerType;
    }

    /**
     * {@inheritDoc}
     */
    public function process(ContainerBuilder $container)
    {
        $this->updateValidatorMappingFiles($container, 'xml', 'xml');
        $this->updateValidatorMappingFiles($container, 'yaml', 'yml');
    }

    /**
     * Gets the validation mapping files for the format and extends them with
     * files matching a doctrine search pattern (Resources/config/validation.orm.xml)
     *
     * @param ContainerBuilder $container
     * @param string           $mapping
     * @param string           $extension
     */
    private function updateValidatorMappingFiles(ContainerBuilder $container, $mapping, $extension)
    {
        if (!$container->hasParameter('validator.mapping.loader.'.$mapping.'_files_loader.mapping_files')) {
            return;
        }

        $files = $container->getParameter('validator.mapping.loader.'.$mapping.'_files_loader.mapping_files');
        $validationPath = 'Resources/config/validation.'.$this->managerType.'.'.$extension;

        foreach ($container->getParameter('kernel.bundles') as $bundle) {
            $reflection = new \ReflectionClass($bundle);
            if (is_file($file = dirname($reflection->getFilename()).'/'.$validationPath)) {
                $files[] = realpath($file);
                $container->addResource(new FileResource($file));
            }
        }

        $container->setParameter('validator.mapping.loader.'.$mapping.'_files_loader.mapping_files', $files);
    }
}
PK9a�\~�YAAjpear/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;

/**
 * Registers event listeners and subscribers to the available doctrine connections.
 *
 * @author Jeremy Mikola <jmikola@gmail.com>
 * @author Alexander <iam.asm89@gmail.com>
 */
class RegisterEventListenersAndSubscribersPass implements CompilerPassInterface
{
    private $connections;
    private $container;
    private $eventManagers;
    private $managerTemplate;
    private $tagPrefix;

    /**
     * Constructor.
     *
     * @param string $connections     Parameter ID for connections
     * @param string $managerTemplate sprintf() template for generating the event
     *                                manager's service ID for a connection name
     * @param string $tagPrefix Tag prefix for listeners and subscribers
     */
    public function __construct($connections, $managerTemplate, $tagPrefix)
    {
        $this->connections = $connections;
        $this->managerTemplate = $managerTemplate;
        $this->tagPrefix = $tagPrefix;
    }

    /**
     * {@inheritDoc}
     */
    public function process(ContainerBuilder $container)
    {
        if (!$container->hasParameter($this->connections)) {
            return;
        }

        $taggedSubscribers = $container->findTaggedServiceIds($this->tagPrefix.'.event_subscriber');
        $taggedListeners = $container->findTaggedServiceIds($this->tagPrefix.'.event_listener');

        if (empty($taggedSubscribers) && empty($taggedListeners)) {
            return;
        }

        $this->container = $container;
        $this->connections = $container->getParameter($this->connections);
        $sortFunc = function ($a, $b) {
            $a = isset($a['priority']) ? $a['priority'] : 0;
            $b = isset($b['priority']) ? $b['priority'] : 0;

            return $a > $b ? -1 : 1;
        };


        if (!empty($taggedSubscribers)) {
            $subscribersPerCon = $this->groupByConnection($taggedSubscribers);
            foreach ($subscribersPerCon as $con => $subscribers) {
                $em = $this->getEventManager($con);

                uasort($subscribers, $sortFunc);
                foreach ($subscribers as $id => $instance) {
                    $em->addMethodCall('addEventSubscriber', array(new Reference($id)));
                }
            }
        }

        if (!empty($taggedListeners)) {
            $listenersPerCon = $this->groupByConnection($taggedListeners, true);
            foreach ($listenersPerCon as $con => $listeners) {
                $em = $this->getEventManager($con);

                uasort($listeners, $sortFunc);
                foreach ($listeners as $id => $instance) {
                    $em->addMethodCall('addEventListener', array(
                        array_unique($instance['event']),
                        isset($instance['lazy']) && $instance['lazy'] ? $id : new Reference($id),
                    ));
                }
            }
        }
    }

    private function groupByConnection(array $services, $isListener = false)
    {
        $grouped = array();
        foreach ($allCons = array_keys($this->connections) as $con) {
            $grouped[$con] = array();
        }

        foreach ($services as $id => $instances) {
            foreach ($instances as $instance) {
                if ($isListener) {
                    if (!isset($instance['event'])) {
                        throw new \InvalidArgumentException(sprintf('Doctrine event listener "%s" must specify the "event" attribute.', $id));
                    }
                    $instance['event'] = array($instance['event']);

                    if (isset($instance['lazy']) && $instance['lazy']) {
                        $this->container->getDefinition($id)->setPublic(true);
                    }
                }

                $cons = isset($instance['connection']) ? array($instance['connection']) : $allCons;
                foreach ($cons as $con) {
                    if (!isset($grouped[$con])) {
                        throw new \RuntimeException(sprintf('The Doctrine connection "%s" referenced in service "%s" does not exist. Available connections names: %s', $con, $id, implode(', ', array_keys($this->connections))));
                    }

                    if ($isListener && isset($grouped[$con][$id])) {
                        $grouped[$con][$id]['event'] = array_merge($grouped[$con][$id]['event'], $instance['event']);
                    } else {
                        $grouped[$con][$id] = $instance;
                    }
                }
            }
        }

        return $grouped;
    }

    private function getEventManager($name)
    {
        if (null === $this->eventManagers) {
            $this->eventManagers = array();
            foreach ($this->connections as $n => $id) {
                $this->eventManagers[$n] = $this->container->getDefinition(sprintf($this->managerTemplate, $n));
            }
        }

        return $this->eventManagers[$name];
    }
}
PK9a�\*�+��J�JNpear/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\DependencyInjection;

use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\Config\Resource\FileResource;

/**
 * This abstract classes groups common code that Doctrine Object Manager extensions (ORM, MongoDB, CouchDB) need.
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 */
abstract class AbstractDoctrineExtension extends Extension
{
    /**
     * Used inside metadata driver method to simplify aggregation of data.
     *
     * @var array
     */
    protected $aliasMap = array();

    /**
     * Used inside metadata driver method to simplify aggregation of data.
     *
     * @var array
     */
    protected $drivers = array();

    /**
     * @param array            $objectManager A configured object manager.
     * @param ContainerBuilder $container     A ContainerBuilder instance
     *
     * @throws \InvalidArgumentException
     */
    protected function loadMappingInformation(array $objectManager, ContainerBuilder $container)
    {
        if ($objectManager['auto_mapping']) {
            // automatically register bundle mappings
            foreach (array_keys($container->getParameter('kernel.bundles')) as $bundle) {
                if (!isset($objectManager['mappings'][$bundle])) {
                    $objectManager['mappings'][$bundle] = array(
                        'mapping'   => true,
                        'is_bundle' => true,
                    );
                }
            }
        }

        foreach ($objectManager['mappings'] as $mappingName => $mappingConfig) {
            if (null !== $mappingConfig && false === $mappingConfig['mapping']) {
                continue;
            }

            $mappingConfig = array_replace(array(
                'dir'    => false,
                'type'   => false,
                'prefix' => false,
            ), (array) $mappingConfig);

            $mappingConfig['dir'] = $container->getParameterBag()->resolveValue($mappingConfig['dir']);
            // a bundle configuration is detected by realizing that the specified dir is not absolute and existing
            if (!isset($mappingConfig['is_bundle'])) {
                $mappingConfig['is_bundle'] = !is_dir($mappingConfig['dir']);
            }

            if ($mappingConfig['is_bundle']) {
                $bundle = null;
                foreach ($container->getParameter('kernel.bundles') as $name => $class) {
                    if ($mappingName === $name) {
                        $bundle = new \ReflectionClass($class);

                        break;
                    }
                }

                if (null === $bundle) {
                    throw new \InvalidArgumentException(sprintf('Bundle "%s" does not exist or it is not enabled.', $mappingName));
                }

                $mappingConfig = $this->getMappingDriverBundleConfigDefaults($mappingConfig, $bundle, $container);
                if (!$mappingConfig) {
                    continue;
                }
            }

            $this->assertValidMappingConfiguration($mappingConfig, $objectManager['name']);
            $this->setMappingDriverConfig($mappingConfig, $mappingName);
            $this->setMappingDriverAlias($mappingConfig, $mappingName);
        }
    }

    /**
     * Register the alias for this mapping driver.
     *
     * Aliases can be used in the Query languages of all the Doctrine object managers to simplify writing tasks.
     *
     * @param array  $mappingConfig
     * @param string $mappingName
     */
    protected function setMappingDriverAlias($mappingConfig, $mappingName)
    {
        if (isset($mappingConfig['alias'])) {
            $this->aliasMap[$mappingConfig['alias']] = $mappingConfig['prefix'];
        } else {
            $this->aliasMap[$mappingName] = $mappingConfig['prefix'];
        }
    }

    /**
     * Register the mapping driver configuration for later use with the object managers metadata driver chain.
     *
     * @param array  $mappingConfig
     * @param string $mappingName
     *
     * @throws \InvalidArgumentException
     */
    protected function setMappingDriverConfig(array $mappingConfig, $mappingName)
    {
        if (is_dir($mappingConfig['dir'])) {
            $this->drivers[$mappingConfig['type']][$mappingConfig['prefix']] = realpath($mappingConfig['dir']);
        } else {
            throw new \InvalidArgumentException(sprintf('Invalid Doctrine mapping path given. Cannot load Doctrine mapping/bundle named "%s".', $mappingName));
        }
    }

    /**
     * If this is a bundle controlled mapping all the missing information can be autodetected by this method.
     *
     * Returns false when autodetection failed, an array of the completed information otherwise.
     *
     * @param array            $bundleConfig
     * @param \ReflectionClass $bundle
     * @param ContainerBuilder $container    A ContainerBuilder instance
     *
     * @return array|false
     */
    protected function getMappingDriverBundleConfigDefaults(array $bundleConfig, \ReflectionClass $bundle, ContainerBuilder $container)
    {
        $bundleDir = dirname($bundle->getFilename());

        if (!$bundleConfig['type']) {
            $bundleConfig['type'] = $this->detectMetadataDriver($bundleDir, $container);
        }

        if (!$bundleConfig['type']) {
            // skip this bundle, no mapping information was found.
            return false;
        }

        if (!$bundleConfig['dir']) {
            if (in_array($bundleConfig['type'], array('annotation', 'staticphp'))) {
                $bundleConfig['dir'] = $bundleDir.'/'.$this->getMappingObjectDefaultName();
            } else {
                $bundleConfig['dir'] = $bundleDir.'/'.$this->getMappingResourceConfigDirectory();
            }
        } else {
            $bundleConfig['dir'] = $bundleDir.'/'.$bundleConfig['dir'];
        }

        if (!$bundleConfig['prefix']) {
            $bundleConfig['prefix'] = $bundle->getNamespaceName().'\\'.$this->getMappingObjectDefaultName();
        }

        return $bundleConfig;
    }

    /**
     * Register all the collected mapping information with the object manager by registering the appropriate mapping drivers.
     *
     * @param array            $objectManager
     * @param ContainerBuilder $container     A ContainerBuilder instance
     */
    protected function registerMappingDrivers($objectManager, ContainerBuilder $container)
    {
        // configure metadata driver for each bundle based on the type of mapping files found
        if ($container->hasDefinition($this->getObjectManagerElementName($objectManager['name'].'_metadata_driver'))) {
            $chainDriverDef = $container->getDefinition($this->getObjectManagerElementName($objectManager['name'].'_metadata_driver'));
        } else {
            $chainDriverDef = new Definition('%'.$this->getObjectManagerElementName('metadata.driver_chain.class%'));
            $chainDriverDef->setPublic(false);
        }

        foreach ($this->drivers as $driverType => $driverPaths) {
            $mappingService = $this->getObjectManagerElementName($objectManager['name'].'_'.$driverType.'_metadata_driver');
            if ($container->hasDefinition($mappingService)) {
                $mappingDriverDef = $container->getDefinition($mappingService);
                $args = $mappingDriverDef->getArguments();
                if ($driverType == 'annotation') {
                    $args[1] = array_merge(array_values($driverPaths), $args[1]);
                } else {
                    $args[0] = array_merge(array_values($driverPaths), $args[0]);
                }
                $mappingDriverDef->setArguments($args);
            } elseif ($driverType == 'annotation') {
                $mappingDriverDef = new Definition('%'.$this->getObjectManagerElementName('metadata.'.$driverType.'.class%'), array(
                    new Reference($this->getObjectManagerElementName('metadata.annotation_reader')),
                    array_values($driverPaths)
                ));
            } else {
                $mappingDriverDef = new Definition('%'.$this->getObjectManagerElementName('metadata.'.$driverType.'.class%'), array(
                    array_values($driverPaths)
                ));
            }
            $mappingDriverDef->setPublic(false);
            if (false !== strpos($mappingDriverDef->getClass(), 'yml') || false !== strpos($mappingDriverDef->getClass(), 'xml')) {
                $mappingDriverDef->setArguments(array(array_flip($driverPaths)));
                $mappingDriverDef->addMethodCall('setGlobalBasename', array('mapping'));
            }

            $container->setDefinition($mappingService, $mappingDriverDef);

            foreach ($driverPaths as $prefix => $driverPath) {
                $chainDriverDef->addMethodCall('addDriver', array(new Reference($mappingService), $prefix));
            }
        }

        $container->setDefinition($this->getObjectManagerElementName($objectManager['name'].'_metadata_driver'), $chainDriverDef);
    }

    /**
     * Assertion if the specified mapping information is valid.
     *
     * @param array  $mappingConfig
     * @param string $objectManagerName
     *
     * @throws \InvalidArgumentException
     */
    protected function assertValidMappingConfiguration(array $mappingConfig, $objectManagerName)
    {
        if (!$mappingConfig['type'] || !$mappingConfig['dir'] || !$mappingConfig['prefix']) {
            throw new \InvalidArgumentException(sprintf('Mapping definitions for Doctrine manager "%s" require at least the "type", "dir" and "prefix" options.', $objectManagerName));
        }

        if (!is_dir($mappingConfig['dir'])) {
            throw new \InvalidArgumentException(sprintf('Specified non-existing directory "%s" as Doctrine mapping source.', $mappingConfig['dir']));
        }

        if (!in_array($mappingConfig['type'], array('xml', 'yml', 'annotation', 'php', 'staticphp'))) {
            throw new \InvalidArgumentException(sprintf('Can only configure "xml", "yml", "annotation", "php" or '.
                '"staticphp" through the DoctrineBundle. Use your own bundle to configure other metadata drivers. '.
                'You can register them by adding a new driver to the '.
                '"%s" service definition.', $this->getObjectManagerElementName($objectManagerName.'.metadata_driver')
            ));
        }
    }

    /**
     * Detects what metadata driver to use for the supplied directory.
     *
     * @param string           $dir       A directory path
     * @param ContainerBuilder $container A ContainerBuilder instance
     *
     * @return string|null A metadata driver short name, if one can be detected
     */
    protected function detectMetadataDriver($dir, ContainerBuilder $container)
    {
        // add the closest existing directory as a resource
        $configPath = $this->getMappingResourceConfigDirectory();
        $resource = $dir.'/'.$configPath;
        while (!is_dir($resource)) {
            $resource = dirname($resource);
        }

        $container->addResource(new FileResource($resource));

        $extension = $this->getMappingResourceExtension();
        if (($files = glob($dir.'/'.$configPath.'/*.'.$extension.'.xml')) && count($files)) {
            return 'xml';
        } elseif (($files = glob($dir.'/'.$configPath.'/*.'.$extension.'.yml')) && count($files)) {
            return 'yml';
        } elseif (($files = glob($dir.'/'.$configPath.'/*.'.$extension.'.php')) && count($files)) {
            return 'php';
        }

        // add the directory itself as a resource
        $container->addResource(new FileResource($dir));

        if (is_dir($dir.'/'.$this->getMappingObjectDefaultName())) {
            return 'annotation';
        }

        return null;
    }

    /**
     * Loads a configured object manager metadata, query or result cache driver.
     *
     * @param array            $objectManager A configured object manager.
     * @param ContainerBuilder $container     A ContainerBuilder instance.
     * @param string           $cacheName
     *
     * @throws \InvalidArgumentException In case of unknown driver type.
     */
    protected function loadObjectManagerCacheDriver(array $objectManager, ContainerBuilder $container, $cacheName)
    {
        $cacheDriver = $objectManager[$cacheName.'_driver'];
        $cacheDriverService = $this->getObjectManagerElementName($objectManager['name'].'_'.$cacheName);

        switch ($cacheDriver['type']) {
            case 'service':
                $container->setAlias($cacheDriverService, new Alias($cacheDriver['id'], false));

                return;
            case 'memcache':
                $memcacheClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.memcache.class').'%';
                $memcacheInstanceClass = !empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%'.$this->getObjectManagerElementName('cache.memcache_instance.class').'%';
                $memcacheHost = !empty($cacheDriver['host']) ? $cacheDriver['host'] : '%'.$this->getObjectManagerElementName('cache.memcache_host').'%';
                $memcachePort = !empty($cacheDriver['port']) || (isset($cacheDriver['port']) && $cacheDriver['port'] === 0)  ? $cacheDriver['port'] : '%'.$this->getObjectManagerElementName('cache.memcache_port').'%';
                $cacheDef = new Definition($memcacheClass);
                $memcacheInstance = new Definition($memcacheInstanceClass);
                $memcacheInstance->addMethodCall('connect', array(
                    $memcacheHost, $memcachePort
                ));
                $container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcache_instance', $objectManager['name'])), $memcacheInstance);
                $cacheDef->addMethodCall('setMemcache', array(new Reference($this->getObjectManagerElementName(sprintf('%s_memcache_instance', $objectManager['name'])))));
                break;
            case 'memcached':
                $memcachedClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.memcached.class').'%';
                $memcachedInstanceClass = !empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%'.$this->getObjectManagerElementName('cache.memcached_instance.class').'%';
                $memcachedHost = !empty($cacheDriver['host']) ? $cacheDriver['host'] : '%'.$this->getObjectManagerElementName('cache.memcached_host').'%';
                $memcachedPort = !empty($cacheDriver['port']) ? $cacheDriver['port'] : '%'.$this->getObjectManagerElementName('cache.memcached_port').'%';
                $cacheDef = new Definition($memcachedClass);
                $memcachedInstance = new Definition($memcachedInstanceClass);
                $memcachedInstance->addMethodCall('addServer', array(
                    $memcachedHost, $memcachedPort
                ));
                $container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcached_instance', $objectManager['name'])), $memcachedInstance);
                $cacheDef->addMethodCall('setMemcached', array(new Reference($this->getObjectManagerElementName(sprintf('%s_memcached_instance', $objectManager['name'])))));
                break;
             case 'redis':
                $redisClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.redis.class').'%';
                $redisInstanceClass = !empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%'.$this->getObjectManagerElementName('cache.redis_instance.class').'%';
                $redisHost = !empty($cacheDriver['host']) ? $cacheDriver['host'] : '%'.$this->getObjectManagerElementName('cache.redis_host').'%';
                $redisPort = !empty($cacheDriver['port']) ? $cacheDriver['port'] : '%'.$this->getObjectManagerElementName('cache.redis_port').'%';
                $cacheDef = new Definition($redisClass);
                $redisInstance = new Definition($redisInstanceClass);
                $redisInstance->addMethodCall('connect', array(
                    $redisHost, $redisPort
                ));
                $container->setDefinition($this->getObjectManagerElementName(sprintf('%s_redis_instance', $objectManager['name'])), $redisInstance);
                $cacheDef->addMethodCall('setRedis', array(new Reference($this->getObjectManagerElementName(sprintf('%s_redis_instance', $objectManager['name'])))));
                break;
            case 'apc':
            case 'array':
            case 'xcache':
            case 'wincache':
            case 'zenddata':
                $cacheDef = new Definition('%'.$this->getObjectManagerElementName(sprintf('cache.%s.class', $cacheDriver['type'])).'%');
                break;
            default:
                throw new \InvalidArgumentException(sprintf('"%s" is an unrecognized Doctrine cache driver.', $cacheDriver['type']));
        }

        $cacheDef->setPublic(false);

        if (!isset($cacheDriver['namespace'])) {
            // generate a unique namespace for the given application
            $cacheDriver['namespace'] = 'sf2'.$this->getMappingResourceExtension().'_'.$objectManager['name'].'_'.hash('sha256',($container->getParameter('kernel.root_dir').$container->getParameter('kernel.environment')));
        }

        $cacheDef->addMethodCall('setNamespace', array($cacheDriver['namespace']));

        $container->setDefinition($cacheDriverService, $cacheDef);
    }

    /**
     * Prefixes the relative dependency injection container path with the object manager prefix.
     *
     * @example $name is 'entity_manager' then the result would be 'doctrine.orm.entity_manager'
     *
     * @param string $name
     *
     * @return string
     */
    abstract protected function getObjectManagerElementName($name);

    /**
     * Noun that describes the mapped objects such as Entity or Document.
     *
     * Will be used for autodetection of persistent objects directory.
     *
     * @return string
     */
    abstract protected function getMappingObjectDefaultName();

    /**
     * Relative path from the bundle root to the directory where mapping files reside.
     *
     * @return string
     */
    abstract protected function getMappingResourceConfigDirectory();

    /**
     * Extension used by the mapping files.
     *
     * @return string
     */
    abstract protected function getMappingResourceExtension();
}
PK:a�\���*��Xpear/Symfony/Bridge/Doctrine/DependencyInjection/Security/UserProvider/EntityFactory.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\DependencyInjection\Security\UserProvider;

use Symfony\Component\Config\Definition\Builder\NodeDefinition;

use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\UserProvider\UserProviderFactoryInterface;
use Symfony\Component\DependencyInjection\DefinitionDecorator;
use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * EntityFactory creates services for Doctrine user provider.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Christophe Coevoet <stof@notk.org>
 */
class EntityFactory implements UserProviderFactoryInterface
{
    private $key;
    private $providerId;

    public function __construct($key, $providerId)
    {
        $this->key = $key;
        $this->providerId = $providerId;
    }

    public function create(ContainerBuilder $container, $id, $config)
    {
        $container
            ->setDefinition($id, new DefinitionDecorator($this->providerId))
            ->addArgument($config['class'])
            ->addArgument($config['property'])
            ->addArgument($config['manager_name'])
        ;
    }

    public function getKey()
    {
        return $this->key;
    }

    public function addConfiguration(NodeDefinition $node)
    {
        $node
            ->children()
                ->scalarNode('class')->isRequired()->cannotBeEmpty()->end()
                ->scalarNode('property')->defaultNull()->end()
                ->scalarNode('manager_name')->defaultNull()->end()
            ->end()
        ;
    }
}
PK:a�\lf/�qqBpear/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\DataFixtures;

use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\DataFixtures\Loader;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Doctrine data fixtures loader that injects the service container into
 * fixture objects that implement ContainerAwareInterface.
 *
 * Note: Use of this class requires the Doctrine data fixtures extension, which
 * is a suggested dependency for Symfony.
 */
class ContainerAwareLoader extends Loader
{
    /**
     * @var ContainerInterface
     */
    private $container;

    /**
     * Constructor.
     *
     * @param ContainerInterface $container A ContainerInterface instance
     */
    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    /**
     * {@inheritdoc}
     */
    public function addFixture(FixtureInterface $fixture)
    {
        if ($fixture instanceof ContainerAwareInterface) {
            $fixture->setContainer($this->container);
        }

        parent::addFixture($fixture);
    }
}
PK:a�\	�9,��:pear/Symfony/Bridge/Doctrine/Form/DoctrineOrmExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Form;

use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Component\Form\AbstractExtension;
use Symfony\Component\PropertyAccess\PropertyAccess;

class DoctrineOrmExtension extends AbstractExtension
{
    protected $registry;

    public function __construct(ManagerRegistry $registry)
    {
        $this->registry = $registry;
    }

    protected function loadTypes()
    {
        return array(
            new Type\EntityType($this->registry, PropertyAccess::createPropertyAccessor()),
        );
    }

    protected function loadTypeGuesser()
    {
        return new DoctrineOrmTypeGuesser($this->registry);
    }
}
PK:a�\`.
qpp<pear/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Form;

use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\Mapping\ClassMetadataInfo;
use Doctrine\Common\Persistence\Mapping\MappingException;
use Doctrine\ORM\Mapping\MappingException as LegacyMappingException;
use Symfony\Component\Form\FormTypeGuesserInterface;
use Symfony\Component\Form\Guess\Guess;
use Symfony\Component\Form\Guess\TypeGuess;
use Symfony\Component\Form\Guess\ValueGuess;
use Doctrine\Common\Util\ClassUtils;

class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface
{
    protected $registry;

    private $cache = array();

    public function __construct(ManagerRegistry $registry)
    {
        $this->registry = $registry;
    }

    /**
     * {@inheritDoc}
     */
    public function guessType($class, $property)
    {
        if (!$ret = $this->getMetadata($class)) {
            return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
        }

        list($metadata, $name) = $ret;

        if ($metadata->hasAssociation($property)) {
            $multiple = $metadata->isCollectionValuedAssociation($property);
            $mapping = $metadata->getAssociationMapping($property);

            return new TypeGuess('entity', array('em' => $name, 'class' => $mapping['targetEntity'], 'multiple' => $multiple), Guess::HIGH_CONFIDENCE);
        }

        switch ($metadata->getTypeOfField($property)) {
            case 'array':
                return new TypeGuess('collection', array(), Guess::MEDIUM_CONFIDENCE);
            case 'boolean':
                return new TypeGuess('checkbox', array(), Guess::HIGH_CONFIDENCE);
            case 'datetime':
            case 'vardatetime':
            case 'datetimetz':
                return new TypeGuess('datetime', array(), Guess::HIGH_CONFIDENCE);
            case 'date':
                return new TypeGuess('date', array(), Guess::HIGH_CONFIDENCE);
            case 'time':
                return new TypeGuess('time', array(), Guess::HIGH_CONFIDENCE);
            case 'decimal':
            case 'float':
                return new TypeGuess('number', array(), Guess::MEDIUM_CONFIDENCE);
            case 'integer':
            case 'bigint':
            case 'smallint':
                return new TypeGuess('integer', array(), Guess::MEDIUM_CONFIDENCE);
            case 'string':
                return new TypeGuess('text', array(), Guess::MEDIUM_CONFIDENCE);
            case 'text':
                return new TypeGuess('textarea', array(), Guess::MEDIUM_CONFIDENCE);
            default:
                return new TypeGuess('text', array(), Guess::LOW_CONFIDENCE);
        }
    }

    /**
     * {@inheritDoc}
     */
    public function guessRequired($class, $property)
    {
        $classMetadatas = $this->getMetadata($class);

        if (!$classMetadatas) {
            return null;
        }

        /** @var ClassMetadataInfo $classMetadata */
        $classMetadata = $classMetadatas[0];

        // Check whether the field exists and is nullable or not
        if ($classMetadata->hasField($property)) {
            if (!$classMetadata->isNullable($property)) {
                return new ValueGuess(true, Guess::HIGH_CONFIDENCE);
            }

            return new ValueGuess(false, Guess::MEDIUM_CONFIDENCE);
        }

        // Check whether the association exists, is a to-one association and its
        // join column is nullable or not
        if ($classMetadata->isAssociationWithSingleJoinColumn($property)) {
            $mapping = $classMetadata->getAssociationMapping($property);

            if (!isset($mapping['joinColumns'][0]['nullable'])) {
                // The "nullable" option defaults to true, in that case the
                // field should not be required.
                return new ValueGuess(false, Guess::HIGH_CONFIDENCE);
            }

            return new ValueGuess(!$mapping['joinColumns'][0]['nullable'], Guess::HIGH_CONFIDENCE);
        }

        return null;
    }

    /**
     * {@inheritDoc}
     */
    public function guessMaxLength($class, $property)
    {
        $ret = $this->getMetadata($class);
        if ($ret && $ret[0]->hasField($property) && !$ret[0]->hasAssociation($property)) {
            $mapping = $ret[0]->getFieldMapping($property);

            if (isset($mapping['length'])) {
                return new ValueGuess($mapping['length'], Guess::HIGH_CONFIDENCE);
            }

            if (in_array($ret[0]->getTypeOfField($property), array('decimal', 'float'))) {
                return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    public function guessPattern($class, $property)
    {
        $ret = $this->getMetadata($class);
        if ($ret && $ret[0]->hasField($property) && !$ret[0]->hasAssociation($property)) {
            if (in_array($ret[0]->getTypeOfField($property), array('decimal', 'float'))) {
                return new ValueGuess(null, Guess::MEDIUM_CONFIDENCE);
            }
        }
    }

    protected function getMetadata($class)
    {
        // normalize class name
        $class = ClassUtils::getRealClass(ltrim($class, '\\'));

        if (array_key_exists($class, $this->cache)) {
            return $this->cache[$class];
        }

        $this->cache[$class] = null;
        foreach ($this->registry->getManagers() as $name => $em) {
            try {
                return $this->cache[$class] = array($em->getClassMetadata($class), $name);
            } catch (MappingException $e) {
                // not an entity or mapped super class
            } catch (LegacyMappingException $e) {
                // not an entity or mapped super class, using Doctrine ORM 2.2
            }
        }
    }
}
PK;a�\Ci�PPRpear/Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Form\DataTransformer;

use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\DataTransformerInterface;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class CollectionToArrayTransformer implements DataTransformerInterface
{
    /**
     * Transforms a collection into an array.
     *
     * @param Collection $collection A collection of entities
     *
     * @return mixed An array of entities
     *
     * @throws TransformationFailedException
     */
    public function transform($collection)
    {
        if (null === $collection) {
            return array();
        }

        // For cases when the collection getter returns $collection->toArray()
        // in order to prevent modifications of the returned collection
        if (is_array($collection)) {
            return $collection;
        }

        if (!$collection instanceof Collection) {
            throw new TransformationFailedException('Expected a Doctrine\Common\Collections\Collection object.');
        }

        return $collection->toArray();
    }

    /**
     * Transforms choice keys into entities.
     *
     * @param mixed $array An array of entities
     *
     * @return Collection   A collection of entities
     */
    public function reverseTransform($array)
    {
        if ('' === $array || null === $array) {
            $array = array();
        } else {
            $array = (array) $array;
        }

        return new ArrayCollection($array);
    }
}
PK;a�\S;,:��7pear/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Form\Type;

use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Component\Form\Exception\RuntimeException;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList;
use Symfony\Bridge\Doctrine\Form\ChoiceList\EntityLoaderInterface;
use Symfony\Bridge\Doctrine\Form\EventListener\MergeDoctrineCollectionListener;
use Symfony\Bridge\Doctrine\Form\DataTransformer\CollectionToArrayTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;

abstract class DoctrineType extends AbstractType
{
    /**
     * @var ManagerRegistry
     */
    protected $registry;

    /**
     * @var array
     */
    private $choiceListCache = array();

    /**
     * @var PropertyAccessorInterface
     */
    private $propertyAccessor;

    public function __construct(ManagerRegistry $registry, PropertyAccessorInterface $propertyAccessor = null)
    {
        $this->registry = $registry;
        $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor();
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if ($options['multiple']) {
            $builder
                ->addEventSubscriber(new MergeDoctrineCollectionListener())
                ->addViewTransformer(new CollectionToArrayTransformer(), true)
            ;
        }
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $choiceListCache =& $this->choiceListCache;
        $registry = $this->registry;
        $propertyAccessor = $this->propertyAccessor;
        $type = $this;

        $loader = function (Options $options) use ($type) {
            if (null !== $options['query_builder']) {
                return $type->getLoader($options['em'], $options['query_builder'], $options['class']);
            }

            return null;
        };

        $choiceList = function (Options $options) use (&$choiceListCache, $propertyAccessor) {
            // Support for closures
            $propertyHash = is_object($options['property'])
                ? spl_object_hash($options['property'])
                : $options['property'];

            $choiceHashes = $options['choices'];

            // Support for recursive arrays
            if (is_array($choiceHashes)) {
                // A second parameter ($key) is passed, so we cannot use
                // spl_object_hash() directly (which strictly requires
                // one parameter)
                array_walk_recursive($choiceHashes, function (&$value) {
                    $value = spl_object_hash($value);
                });
            } elseif ($choiceHashes instanceof \Traversable) {
                $hashes = array();
                foreach ($choiceHashes as $value) {
                    $hashes[] = spl_object_hash($value);
                }

                $choiceHashes = $hashes;
            }

            $preferredChoiceHashes = $options['preferred_choices'];

            if (is_array($preferredChoiceHashes)) {
                array_walk_recursive($preferredChoiceHashes, function (&$value) {
                    $value = spl_object_hash($value);
                });
            }

            // Support for custom loaders (with query builders)
            $loaderHash = is_object($options['loader'])
                ? spl_object_hash($options['loader'])
                : $options['loader'];

            // Support for closures
            $groupByHash = is_object($options['group_by'])
                ? spl_object_hash($options['group_by'])
                : $options['group_by'];

            $hash = hash('sha256', json_encode(array(
                spl_object_hash($options['em']),
                $options['class'],
                $propertyHash,
                $loaderHash,
                $choiceHashes,
                $preferredChoiceHashes,
                $groupByHash
            )));

            if (!isset($choiceListCache[$hash])) {
                $choiceListCache[$hash] = new EntityChoiceList(
                    $options['em'],
                    $options['class'],
                    $options['property'],
                    $options['loader'],
                    $options['choices'],
                    $options['preferred_choices'],
                    $options['group_by'],
                    $propertyAccessor
                );
            }

            return $choiceListCache[$hash];
        };

        $emNormalizer = function (Options $options, $em) use ($registry) {
            /* @var ManagerRegistry $registry */
            if (null !== $em) {
                return $registry->getManager($em);
            }

            $em = $registry->getManagerForClass($options['class']);

            if (null === $em) {
                throw new RuntimeException(sprintf(
                    'Class "%s" seems not to be a managed Doctrine entity. ' .
                    'Did you forget to map it?',
                    $options['class']
                ));
            }

            return $em;
        };

        $resolver->setDefaults(array(
            'em'                => null,
            'property'          => null,
            'query_builder'     => null,
            'loader'            => $loader,
            'choices'           => null,
            'choice_list'       => $choiceList,
            'group_by'          => null,
        ));

        $resolver->setRequired(array('class'));

        $resolver->setNormalizers(array(
            'em' => $emNormalizer,
        ));

        $resolver->setAllowedTypes(array(
            'loader' => array('null', 'Symfony\Bridge\Doctrine\Form\ChoiceList\EntityLoaderInterface'),
        ));
    }

    /**
     * Return the default loader object.
     *
     * @param ObjectManager $manager
     * @param mixed         $queryBuilder
     * @param string        $class
     *
     * @return EntityLoaderInterface
     */
    abstract public function getLoader(ObjectManager $manager, $queryBuilder, $class);

    public function getParent()
    {
        return 'choice';
    }
}
PK;a�\憝��5pear/Symfony/Bridge/Doctrine/Form/Type/EntityType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Form\Type;

use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;

class EntityType extends DoctrineType
{
    /**
     * Return the default loader object.
     *
     * @param ObjectManager $manager
     * @param mixed         $queryBuilder
     * @param string        $class
     * @return ORMQueryBuilderLoader
     */
    public function getLoader(ObjectManager $manager, $queryBuilder, $class)
    {
        return new ORMQueryBuilderLoader(
            $queryBuilder,
            $manager,
            $class
        );
    }

    public function getName()
    {
        return 'entity';
    }
}
PK<a�\GC�t��Fpear/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Form\ChoiceList;

use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Doctrine\ORM\QueryBuilder;
use Doctrine\DBAL\Connection;
use Doctrine\ORM\EntityManager;

/**
 * Getting Entities through the ORM QueryBuilder
 */
class ORMQueryBuilderLoader implements EntityLoaderInterface
{
    /**
     * Contains the query builder that builds the query for fetching the
     * entities
     *
     * This property should only be accessed through queryBuilder.
     *
     * @var QueryBuilder
     */
    private $queryBuilder;

    /**
     * Construct an ORM Query Builder Loader
     *
     * @param QueryBuilder|\Closure $queryBuilder
     * @param EntityManager         $manager
     * @param string                $class
     *
     * @throws UnexpectedTypeException
     */
    public function __construct($queryBuilder, $manager = null, $class = null)
    {
        // If a query builder was passed, it must be a closure or QueryBuilder
        // instance
        if (!($queryBuilder instanceof QueryBuilder || $queryBuilder instanceof \Closure)) {
            throw new UnexpectedTypeException($queryBuilder, 'Doctrine\ORM\QueryBuilder or \Closure');
        }

        if ($queryBuilder instanceof \Closure) {
            if (!$manager instanceof EntityManager) {
                throw new UnexpectedTypeException($manager, 'Doctrine\ORM\EntityManager');
            }

            $queryBuilder = $queryBuilder($manager->getRepository($class));

            if (!$queryBuilder instanceof QueryBuilder) {
                throw new UnexpectedTypeException($queryBuilder, 'Doctrine\ORM\QueryBuilder');
            }
        }

        $this->queryBuilder = $queryBuilder;
    }

    /**
     * {@inheritDoc}
     */
    public function getEntities()
    {
        return $this->queryBuilder->getQuery()->execute();
    }

    /**
     * {@inheritDoc}
     */
    public function getEntitiesByIds($identifier, array $values)
    {
        $qb = clone ($this->queryBuilder);
        $alias = current($qb->getRootAliases());
        $parameter = 'ORMQueryBuilderLoader_getEntitiesByIds_'.$identifier;
        $where = $qb->expr()->in($alias.'.'.$identifier, ':'.$parameter);

        // Guess type
        $entity = current($qb->getRootEntities());
        $metadata = $qb->getEntityManager()->getClassMetadata($entity);
        if (in_array($metadata->getTypeOfField($identifier), array('integer', 'bigint', 'smallint'))) {
            $parameterType = Connection::PARAM_INT_ARRAY;
        } else {
            $parameterType = Connection::PARAM_STR_ARRAY;
        }

        return $qb->andWhere($where)
                  ->getQuery()
                  ->setParameter($parameter, $values, $parameterType)
                  ->getResult();
    }
}
PK<a�\!%d==Fpear/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityLoaderInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Form\ChoiceList;

/**
 * Custom loader for entities in the choice list.
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 */
interface EntityLoaderInterface
{
    /**
     * Returns an array of entities that are valid choices in the corresponding choice list.
     *
     * @return array The entities.
     */
    public function getEntities();

    /**
     * Returns an array of entities matching the given identifiers.
     *
     * @param string $identifier The identifier field of the object. This method
     *                           is not applicable for fields with multiple
     *                           identifiers.
     * @param array $values The values of the identifiers.
     *
     * @return array The entities.
     */
    public function getEntitiesByIds($identifier, array $values);
}
PK<a�\�	?x�7�7Apear/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Form\ChoiceList;

use Symfony\Component\Form\Exception\RuntimeException;
use Symfony\Component\Form\Exception\StringCastException;
use Symfony\Component\Form\Extension\Core\ChoiceList\ObjectChoiceList;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;

/**
 * A choice list presenting a list of Doctrine entities as choices
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class EntityChoiceList extends ObjectChoiceList
{
    /**
     * @var ObjectManager
     */
    private $em;

    /**
     * @var string
     */
    private $class;

    /**
     * @var \Doctrine\Common\Persistence\Mapping\ClassMetadata
     */
    private $classMetadata;

    /**
     * Contains the query builder that builds the query for fetching the
     * entities
     *
     * This property should only be accessed through queryBuilder.
     *
     * @var EntityLoaderInterface
     */
    private $entityLoader;

    /**
     * The identifier field, if the identifier is not composite
     *
     * @var array
     */
    private $idField = null;

    /**
     * Whether to use the identifier for index generation
     *
     * @var Boolean
     */
    private $idAsIndex = false;

    /**
     * Whether to use the identifier for value generation
     *
     * @var Boolean
     */
    private $idAsValue = false;

    /**
     * Whether the entities have already been loaded.
     *
     * @var Boolean
     */
    private $loaded = false;

    /**
     * The preferred entities.
     *
     * @var array
     */
    private $preferredEntities = array();

    /**
     * Creates a new entity choice list.
     *
     * @param ObjectManager             $manager           An EntityManager instance
     * @param string                    $class             The class name
     * @param string                    $labelPath         The property path used for the label
     * @param EntityLoaderInterface     $entityLoader      An optional query builder
     * @param array                     $entities          An array of choices
     * @param array                     $preferredEntities An array of preferred choices
     * @param string                    $groupPath         A property path pointing to the property used
     *                                                     to group the choices. Only allowed if
     *                                                     the choices are given as flat array.
     * @param PropertyAccessorInterface $propertyAccessor  The reflection graph for reading property paths.
     */
    public function __construct(ObjectManager $manager, $class, $labelPath = null, EntityLoaderInterface $entityLoader = null, $entities = null,  array $preferredEntities = array(), $groupPath = null, PropertyAccessorInterface $propertyAccessor = null)
    {
        $this->em = $manager;
        $this->entityLoader = $entityLoader;
        $this->classMetadata = $manager->getClassMetadata($class);
        $this->class = $this->classMetadata->getName();
        $this->loaded = is_array($entities) || $entities instanceof \Traversable;
        $this->preferredEntities = $preferredEntities;

        $identifier = $this->classMetadata->getIdentifierFieldNames();

        if (1 === count($identifier)) {
            $this->idField = $identifier[0];
            $this->idAsValue = true;

            if (in_array($this->classMetadata->getTypeOfField($this->idField), array('integer', 'smallint', 'bigint'))) {
                $this->idAsIndex = true;
            }
        }

        if (!$this->loaded) {
            // Make sure the constraints of the parent constructor are
            // fulfilled
            $entities = array();
        }

        parent::__construct($entities, $labelPath, $preferredEntities, $groupPath, null, $propertyAccessor);
    }

    /**
     * Returns the list of entities
     *
     * @return array
     *
     * @see Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    public function getChoices()
    {
        if (!$this->loaded) {
            $this->load();
        }

        return parent::getChoices();
    }

    /**
     * Returns the values for the entities
     *
     * @return array
     *
     * @see Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    public function getValues()
    {
        if (!$this->loaded) {
            $this->load();
        }

        return parent::getValues();
    }

    /**
     * Returns the choice views of the preferred choices as nested array with
     * the choice groups as top-level keys.
     *
     * @return array
     *
     * @see Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    public function getPreferredViews()
    {
        if (!$this->loaded) {
            $this->load();
        }

        return parent::getPreferredViews();
    }

    /**
     * Returns the choice views of the choices that are not preferred as nested
     * array with the choice groups as top-level keys.
     *
     * @return array
     *
     * @see Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    public function getRemainingViews()
    {
        if (!$this->loaded) {
            $this->load();
        }

        return parent::getRemainingViews();
    }

    /**
     * Returns the entities corresponding to the given values.
     *
     * @param array $values
     *
     * @return array
     *
     * @see Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    public function getChoicesForValues(array $values)
    {
        // Performance optimization
        // Also prevents the generation of "WHERE id IN ()" queries through the
        // entity loader. At least with MySQL and on the development machine
        // this was tested on, no exception was thrown for such invalid
        // statements, consequently no test fails when this code is removed.
        // https://github.com/symfony/symfony/pull/8981#issuecomment-24230557
        if (empty($values)) {
            return array();
        }

        if (!$this->loaded) {
            // Optimize performance in case we have an entity loader and
            // a single-field identifier
            if ($this->idAsValue && $this->entityLoader) {
                $unorderedEntities = $this->entityLoader->getEntitiesByIds($this->idField, $values);
                $entitiesByValue = array();
                $entities = array();

                // Maintain order and indices from the given $values
                // An alternative approach to the following loop is to add the
                // "INDEX BY" clause to the Doctrine query in the loader,
                // but I'm not sure whether that's doable in a generic fashion.
                foreach ($unorderedEntities as $entity) {
                    $value = $this->fixValue(current($this->getIdentifierValues($entity)));
                    $entitiesByValue[$value] = $entity;
                }

                foreach ($values as $i => $value) {
                    if (isset($entitiesByValue[$value])) {
                        $entities[$i] = $entitiesByValue[$value];
                    }
                }

                return $entities;
            }

            $this->load();
        }

        return parent::getChoicesForValues($values);
    }

    /**
     * Returns the values corresponding to the given entities.
     *
     * @param array $entities
     *
     * @return array
     *
     * @see Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    public function getValuesForChoices(array $entities)
    {
        // Performance optimization
        if (empty($entities)) {
            return array();
        }

        if (!$this->loaded) {
            // Optimize performance for single-field identifiers. We already
            // know that the IDs are used as values

            // Attention: This optimization does not check choices for existence
            if ($this->idAsValue) {
                $values = array();

                foreach ($entities as $i => $entity) {
                    if ($entity instanceof $this->class) {
                        // Make sure to convert to the right format
                        $values[$i] = $this->fixValue(current($this->getIdentifierValues($entity)));
                    }
                }

                return $values;
            }

            $this->load();
        }

        return parent::getValuesForChoices($entities);
    }

    /**
     * Returns the indices corresponding to the given entities.
     *
     * @param array $entities
     *
     * @return array
     *
     * @see Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function getIndicesForChoices(array $entities)
    {
        // Performance optimization
        if (empty($entities)) {
            return array();
        }

        if (!$this->loaded) {
            // Optimize performance for single-field identifiers. We already
            // know that the IDs are used as indices

            // Attention: This optimization does not check choices for existence
            if ($this->idAsIndex) {
                $indices = array();

                foreach ($entities as $i => $entity) {
                    if ($entity instanceof $this->class) {
                        // Make sure to convert to the right format
                        $indices[$i] = $this->fixIndex(current($this->getIdentifierValues($entity)));
                    }
                }

                return $indices;
            }

            $this->load();
        }

        return parent::getIndicesForChoices($entities);
    }

    /**
     * Returns the entities corresponding to the given values.
     *
     * @param array $values
     *
     * @return array
     *
     * @see Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function getIndicesForValues(array $values)
    {
        // Performance optimization
        if (empty($values)) {
            return array();
        }

        if (!$this->loaded) {
            // Optimize performance for single-field identifiers.

            // Attention: This optimization does not check values for existence
            if ($this->idAsIndex && $this->idAsValue) {
                return $this->fixIndices($values);
            }

            $this->load();
        }

        return parent::getIndicesForValues($values);
    }

    /**
     * Creates a new unique index for this entity.
     *
     * If the entity has a single-field identifier, this identifier is used.
     *
     * Otherwise a new integer is generated.
     *
     * @param mixed $entity The choice to create an index for
     *
     * @return integer|string A unique index containing only ASCII letters,
     *                        digits and underscores.
     */
    protected function createIndex($entity)
    {
        if ($this->idAsIndex) {
            return $this->fixIndex(current($this->getIdentifierValues($entity)));
        }

        return parent::createIndex($entity);
    }

    /**
     * Creates a new unique value for this entity.
     *
     * If the entity has a single-field identifier, this identifier is used.
     *
     * Otherwise a new integer is generated.
     *
     * @param mixed $entity The choice to create a value for
     *
     * @return integer|string A unique value without character limitations.
     */
    protected function createValue($entity)
    {
        if ($this->idAsValue) {
            return (string) current($this->getIdentifierValues($entity));
        }

        return parent::createValue($entity);
    }

    /**
     * {@inheritdoc}
     */
    protected function fixIndex($index)
    {
        $index = parent::fixIndex($index);

        // If the ID is a single-field integer identifier, it is used as
        // index. Replace any leading minus by underscore to make it a valid
        // form name.
        if ($this->idAsIndex && $index < 0) {
            $index = strtr($index, '-', '_');
        }

        return $index;
    }

    /**
     * Loads the list with entities.
     */
    private function load()
    {
        if ($this->entityLoader) {
            $entities = $this->entityLoader->getEntities();
        } else {
            $entities = $this->em->getRepository($this->class)->findAll();
        }

        try {
            // The second parameter $labels is ignored by ObjectChoiceList
            parent::initialize($entities, array(), $this->preferredEntities);
        } catch (StringCastException $e) {
            throw new StringCastException(str_replace('argument $labelPath', 'option "property"', $e->getMessage()), null, $e);
        }

        $this->loaded = true;
    }

    /**
     * Returns the values of the identifier fields of an entity.
     *
     * Doctrine must know about this entity, that is, the entity must already
     * be persisted or added to the identity map before. Otherwise an
     * exception is thrown.
     *
     * @param object $entity The entity for which to get the identifier
     *
     * @return array          The identifier values
     *
     * @throws RuntimeException If the entity does not exist in Doctrine's identity map
     */
    private function getIdentifierValues($entity)
    {
        if (!$this->em->contains($entity)) {
            throw new RuntimeException(
                'Entities passed to the choice field must be managed. Maybe ' .
                'persist them in the entity manager?'
            );
        }

        $this->em->initializeObject($entity);

        return $this->classMetadata->getIdentifierValues($entity);
    }
}
PK=a�\�0���Spear/Symfony/Bridge/Doctrine/Form/EventListener/MergeDoctrineCollectionListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Form\EventListener;

use Doctrine\Common\Collections\Collection;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Merge changes from the request to a Doctrine\Common\Collections\Collection instance.
 *
 * This works with ORM, MongoDB and CouchDB instances of the collection interface.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @see    Doctrine\Common\Collections\Collection
 */
class MergeDoctrineCollectionListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        // Higher priority than core MergeCollectionListener so that this one
        // is called before
        return array(FormEvents::SUBMIT => array('onBind', 10));
    }

    public function onBind(FormEvent $event)
    {
        $collection = $event->getForm()->getData();
        $data = $event->getData();

        // If all items were removed, call clear which has a higher
        // performance on persistent collections
        if ($collection instanceof Collection && count($data) === 0) {
            $collection->clear();
        }
    }
}
PK=a�\��qm
m
2pear/Symfony/Bridge/Doctrine/RegistryInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine;

use Doctrine\Common\Persistence\ManagerRegistry as ManagerRegistryInterface;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManager;

/**
 * References Doctrine connections and entity managers.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
interface RegistryInterface extends ManagerRegistryInterface
{
    /**
     * Gets the default entity manager name.
     *
     * @return string The default entity manager name
     */
    public function getDefaultEntityManagerName();

    /**
     * Gets a named entity manager.
     *
     * @param string $name The entity manager name (null for the default one)
     *
     * @return EntityManager
     */
    public function getEntityManager($name = null);

    /**
     * Gets an array of all registered entity managers
     *
     * @return array An array of EntityManager instances
     */
    public function getEntityManagers();

    /**
     * Resets a named entity manager.
     *
     * This method is useful when an entity manager has been closed
     * because of a rollbacked transaction AND when you think that
     * it makes sense to get a new one to replace the closed one.
     *
     * Be warned that you will get a brand new entity manager as
     * the existing one is not useable anymore. This means that any
     * other object with a dependency on this entity manager will
     * hold an obsolete reference. You can inject the registry instead
     * to avoid this problem.
     *
     * @param string $name The entity manager name (null for the default one)
     *
     * @return EntityManager
     */
    public function resetEntityManager($name = null);

    /**
     * Resolves a registered namespace alias to the full namespace.
     *
     * This method looks for the alias in all registered entity managers.
     *
     * @param string $alias The alias
     *
     * @return string The full namespace
     *
     * @see Configuration::getEntityNamespace
     */
    public function getEntityNamespace($alias);

    /**
     * Gets all connection names.
     *
     * @return array An array of connection names
     */
    public function getEntityManagerNames();

    /**
     * Gets the entity manager associated with a given class.
     *
     * @param string $class A Doctrine Entity class name
     *
     * @return EntityManager|null
     */
    public function getEntityManagerForClass($class);
}
PK=a�\̳֨�0pear/Symfony/Bridge/Doctrine/ManagerRegistry.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine;

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\Common\Persistence\AbstractManagerRegistry;

/**
 * References Doctrine connections and entity/document managers.
 *
 * @author  Lukas Kahwe Smith <smith@pooteeweet.org>
 */
abstract class ManagerRegistry extends AbstractManagerRegistry implements ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    protected $container;

    /**
     * @inheritdoc
     */
    protected function getService($name)
    {
        return $this->container->get($name);
    }

    /**
     * @inheritdoc
     */
    protected function resetService($name)
    {
        $this->container->set($name, null);
    }

    /**
     * @inheritdoc
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }
}
PK@a�\؈����8pear/Symfony/Bridge/Doctrine/Test/DoctrineTestHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Test;

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
use Doctrine\ORM\EntityManager;

/**
 * Provides utility functions needed in tests.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class DoctrineTestHelper
{
    /**
     * Returns an entity manager for testing.
     *
     * @return EntityManager
     */
    public static function createTestEntityManager()
    {
        if (!class_exists('PDO') || !in_array('sqlite', \PDO::getAvailableDrivers())) {
            \PHPUnit_Framework_TestCase::markTestSkipped('This test requires SQLite support in your environment');
        }

        $config = new \Doctrine\ORM\Configuration();
        $config->setEntityNamespaces(array('SymfonyTestsDoctrine' => 'Symfony\Bridge\Doctrine\Tests\Fixtures'));
        $config->setAutoGenerateProxyClasses(true);
        $config->setProxyDir(\sys_get_temp_dir());
        $config->setProxyNamespace('SymfonyTests\Doctrine');
        $config->setMetadataDriverImpl(new AnnotationDriver(new AnnotationReader()));
        $config->setQueryCacheImpl(new \Doctrine\Common\Cache\ArrayCache());
        $config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache());

        $params = array(
            'driver' => 'pdo_sqlite',
            'memory' => true,
        );

        return EntityManager::create($params, $config);
    }

    /**
     * This class cannot be instantiated.
     */
    private function __construct()
    {
    }
}
PK@a�\e�OO+pear/Symfony/Bridge/Doctrine/autoloader.phpnu�[���<?php

spl_autoload_register(function ($class) {
    if ('\\' == $class[0]) {
        $class = substr($class, 1);
    }

    if (
        0 === strpos($class, 'Symfony\\Bridge\\Doctrine\\')
        &&
        file_exists($file = __DIR__.'/../../../'.str_replace('\\', '/', $class).'.php')
    ) {
        require_once $file;
    }
});
PK@a�\W&v��Apear/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Security\User;

use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * Wrapper around a Doctrine ObjectManager.
 *
 * Provides easy to use provisioning for Doctrine entity users.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class EntityUserProvider implements UserProviderInterface
{
    private $class;
    private $repository;
    private $property;
    private $metadata;

    public function __construct(ManagerRegistry $registry, $class, $property = null, $managerName = null)
    {
        $em = $registry->getManager($managerName);
        $this->class = $class;
        $this->metadata = $em->getClassMetadata($class);

        if (false !== strpos($this->class, ':')) {
            $this->class = $this->metadata->getName();
        }

        $this->repository = $em->getRepository($class);
        $this->property = $property;
    }

    /**
     * {@inheritdoc}
     */
    public function loadUserByUsername($username)
    {
        if (null !== $this->property) {
            $user = $this->repository->findOneBy(array($this->property => $username));
        } else {
            if (!$this->repository instanceof UserProviderInterface) {
                throw new \InvalidArgumentException(sprintf('The Doctrine repository "%s" must implement UserProviderInterface.', get_class($this->repository)));
            }

            $user = $this->repository->loadUserByUsername($username);
        }

        if (null === $user) {
            throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username));
        }

        return $user;
    }

    /**
     * {@inheritDoc}
     */
    public function refreshUser(UserInterface $user)
    {
        if (!$user instanceof $this->class) {
            throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
        }

        if ($this->repository instanceof UserProviderInterface) {
            $refreshedUser = $this->repository->refreshUser($user);
        } else {
            // The user must be reloaded via the primary key as all other data
            // might have changed without proper persistence in the database.
            // That's the case when the user has been changed by a form with
            // validation errors.
            if (!$id = $this->metadata->getIdentifierValues($user)) {
                throw new \InvalidArgumentException("You cannot refresh a user ".
                    "from the EntityUserProvider that does not contain an identifier. ".
                    "The user object has to be serialized with its own identifier " .
                    "mapped by Doctrine."
                );
            }

            $refreshedUser = $this->repository->find($id);
            if (null === $refreshedUser) {
                throw new UsernameNotFoundException(sprintf('User with id %s not found', json_encode($id)));
            }
        }

        return $refreshedUser;
    }

    /**
     * {@inheritDoc}
     */
    public function supportsClass($class)
    {
        return $class === $this->class || is_subclass_of($class, $this->class);
    }
}
PKAa�\�����Jpear/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Security\RememberMe;

use Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface;
use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentTokenInterface;
use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken;
use Symfony\Component\Security\Core\Exception\TokenNotFoundException;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Types\Type as DoctrineType;
use PDO, DateTime;

/**
 * This class provides storage for the tokens that is set in "remember me"
 * cookies. This way no password secrets will be stored in the cookies on
 * the client machine, and thus the security is improved.
 *
 * This depends only on doctrine in order to get a database connection
 * and to do the conversion of the datetime column.
 *
 * In order to use this class, you need the following table in your database:
 * CREATE TABLE `rememberme_token` (
 *  `series`   char(88)     UNIQUE PRIMARY KEY NOT NULL,
 *  `value`    char(88)     NOT NULL,
 *  `lastUsed` datetime     NOT NULL,
 *  `class`    varchar(100) NOT NULL,
 *  `username` varchar(200) NOT NULL
 * );
 */
class DoctrineTokenProvider implements TokenProviderInterface
{
    /**
     * Doctrine DBAL database connection
     * F.ex. service id: doctrine.dbal.default_connection
     *
     * @var \Doctrine\DBAL\Connection
     */
    private $conn;

    /**
     * new DoctrineTokenProvider for the RememberMe authentication service
     *
     * @param \Doctrine\DBAL\Connection $conn
     */
    public function __construct(Connection $conn)
    {
        $this->conn = $conn;
    }

    /**
     * {@inheritdoc}
     */
    public function loadTokenBySeries($series)
    {
        $sql = 'SELECT class, username, value, lastUsed'
            . ' FROM rememberme_token WHERE series=:series';
        $paramValues = array('series' => $series);
        $paramTypes  = array('series' => PDO::PARAM_STR);
        $stmt = $this->conn->executeQuery($sql, $paramValues, $paramTypes);
        $row =  $stmt->fetch(PDO::FETCH_ASSOC);
        if ($row) {
            return new PersistentToken($row['class'],
                                       $row['username'],
                                       $series,
                                       $row['value'],
                                       new DateTime($row['lastUsed'])
                                       );
        }

        throw new TokenNotFoundException('No token found.');
    }

    /**
     * {@inheritdoc}
     */
    public function deleteTokenBySeries($series)
    {
        $sql = 'DELETE FROM rememberme_token WHERE series=:series';
        $paramValues = array('series' => $series);
        $paramTypes  = array('series' => PDO::PARAM_STR);
        $this->conn->executeUpdate($sql, $paramValues, $paramTypes);
    }

    /**
     * {@inheritdoc}
     */
    public function updateToken($series, $tokenValue, DateTime $lastUsed)
    {
        $sql = 'UPDATE rememberme_token SET value=:value, lastUsed=:lastUsed'
            . ' WHERE series=:series';
        $paramValues = array('value'    => $tokenValue,
                             'lastUsed' => $lastUsed,
                             'series'   => $series);
        $paramTypes =  array('value'    => PDO::PARAM_STR,
                             'lastUsed' => DoctrineType::DATETIME,
                             'series'   => PDO::PARAM_STR);
        $updated = $this->conn->executeUpdate($sql, $paramValues, $paramTypes);
        if ($updated < 1) {
            throw new TokenNotFoundException('No token found.');
        }
    }

    /**
     * {@inheritdoc}
     */
    public function createNewToken(PersistentTokenInterface $token)
    {
        $sql = 'INSERT INTO rememberme_token'
            .        ' (class, username, series, value, lastUsed)'
            . ' VALUES (:class, :username, :series, :value, :lastUsed)';
        $paramValues = array('class'    => $token->getClass(),
                             'username' => $token->getUsername(),
                             'series'   => $token->getSeries(),
                             'value'    => $token->getTokenValue(),
                             'lastUsed' => $token->getLastUsed());
        $paramTypes  = array('class'    => PDO::PARAM_STR,
                             'username' => PDO::PARAM_STR,
                             'series'   => PDO::PARAM_STR,
                             'value'    => PDO::PARAM_STR,
                             'lastUsed' => DoctrineType::DATETIME);
        $this->conn->executeUpdate($sql, $paramValues, $paramTypes);
    }
}
PKAa�\+çxAADpear/Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\DataCollector;

use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\DBAL\Logging\DebugStack;
use Doctrine\DBAL\Types\Type;
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * DoctrineDataCollector.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DoctrineDataCollector extends DataCollector
{
    private $registry;
    private $connections;
    private $managers;
    private $loggers = array();

    public function __construct(ManagerRegistry $registry)
    {
        $this->registry = $registry;
        $this->connections = $registry->getConnectionNames();
        $this->managers = $registry->getManagerNames();
    }

    /**
     * Adds the stack logger for a connection.
     *
     * @param string     $name
     * @param DebugStack $logger
     */
    public function addLogger($name, DebugStack $logger)
    {
        $this->loggers[$name] = $logger;
    }

    /**
     * {@inheritdoc}
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        $queries = array();
        foreach ($this->loggers as $name => $logger) {
            $queries[$name] = $this->sanitizeQueries($name, $logger->queries);
        }

        $this->data = array(
            'queries'     => $queries,
            'connections' => $this->connections,
            'managers'    => $this->managers,
        );
    }

    public function getManagers()
    {
        return $this->data['managers'];
    }

    public function getConnections()
    {
        return $this->data['connections'];
    }

    public function getQueryCount()
    {
        return array_sum(array_map('count', $this->data['queries']));
    }

    public function getQueries()
    {
        return $this->data['queries'];
    }

    public function getTime()
    {
        $time = 0;
        foreach ($this->data['queries'] as $queries) {
            foreach ($queries as $query) {
                $time += $query['executionMS'];
            }
        }

        return $time;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'db';
    }

    private function sanitizeQueries($connectionName, $queries)
    {
        foreach ($queries as $i => $query) {
            $queries[$i] = $this->sanitizeQuery($connectionName, $query);
        }

        return $queries;
    }

    private function sanitizeQuery($connectionName, $query)
    {
        $query['explainable'] = true;
        $query['params'] = (array) $query['params'];
        foreach ($query['params'] as $j => &$param) {
            if (isset($query['types'][$j])) {
                // Transform the param according to the type
                $type = $query['types'][$j];
                if (is_string($type)) {
                    $type = Type::getType($type);
                }
                if ($type instanceof Type) {
                    $query['types'][$j] = $type->getBindingType();
                    $param = $type->convertToDatabaseValue($param, $this->registry->getConnection($connectionName)->getDatabasePlatform());
                }
            }

            list($param, $explainable) = $this->sanitizeParam($param);
            if (!$explainable) {
                $query['explainable'] = false;
            }
        }

        return $query;
    }

    /**
     * Sanitizes a param.
     *
     * The return value is an array with the sanitized value and a boolean
     * indicating if the original value was kept (allowing to use the sanitized
     * value to explain the query).
     *
     * @param mixed $var
     *
     * @return array
     */
    private function sanitizeParam($var)
    {
        if (is_object($var)) {
            return array(sprintf('Object(%s)', get_class($var)), false);
        }

        if (is_array($var)) {
            $a = array();
            $original = true;
            foreach ($var as $k => $v) {
                list($value, $orig) = $this->sanitizeParam($v);
                $original = $original && $orig;
                $a[$k] = $value;
            }

            return array($a, $original);
        }

        if (is_resource($var)) {
            return array(sprintf('Resource(%s)', get_resource_type($var)), false);
        }

        return array($var, true);
    }
}
PKBa�\�����Hpear/Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandlerSchema.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\HttpFoundation;

use Doctrine\DBAL\Schema\Schema;

/**
 * DBAL Session Storage Schema.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
final class DbalSessionHandlerSchema extends Schema
{
    private $tableName;

    public function __construct($tableName = 'sessions')
    {
        parent::__construct();

        $this->tableName = $tableName;
        $this->addSessionTable();
    }

    public function addToSchema(Schema $schema)
    {
        foreach ($this->getTables() as $table) {
            $schema->_addTable($table);
        }
    }

    private function addSessionTable()
    {
        $table = $this->createTable($this->tableName);
        $table->addColumn('sess_id', 'string');
        $table->addColumn('sess_data', 'text')->setNotNull(true);
        $table->addColumn('sess_time', 'integer')->setNotNull(true)->setUnsigned(true);
        $table->setPrimaryKey(array('sess_id'));
    }
}
PKBa�\����Bpear/Symfony/Bridge/Doctrine/HttpFoundation/DbalSessionHandler.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\HttpFoundation;

use Doctrine\DBAL\Platforms\MySqlPlatform;
use Doctrine\DBAL\Driver\Connection;

/**
 * DBAL based session storage.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class DbalSessionHandler implements \SessionHandlerInterface
{
    /**
     * @var Connection
     */
    private $con;

    /**
     * @var string
     */
    private $tableName;

    /**
     * Constructor.
     *
     * @param Connection $con       An instance of Connection.
     * @param string     $tableName Table name.
     */
    public function __construct(Connection $con, $tableName = 'sessions')
    {
        $this->con = $con;
        $this->tableName = $tableName;
    }

    /**
     * {@inheritdoc}
     */
    public function open($path = null, $name = null)
    {
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function close()
    {
        // do nothing
        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function destroy($id)
    {
        try {
            $this->con->executeQuery("DELETE FROM {$this->tableName} WHERE sess_id = :id", array(
                'id' => $id,
            ));
        } catch (\PDOException $e) {
            throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e);
        }

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function gc($lifetime)
    {
        try {
            $this->con->executeQuery("DELETE FROM {$this->tableName} WHERE sess_time < :time", array(
                'time' => time() - $lifetime,
            ));
        } catch (\PDOException $e) {
            throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e);
        }

        return true;
    }

    /**
     * {@inheritdoc}
     */
    public function read($id)
    {
        try {
            $data = $this->con->executeQuery("SELECT sess_data FROM {$this->tableName} WHERE sess_id = :id", array(
                'id' => $id,
            ))->fetchColumn();

            if (false !== $data) {
                return base64_decode($data);
            }

            // session does not exist, create it
            $this->createNewSession($id);

            return '';
        } catch (\PDOException $e) {
            throw new \RuntimeException(sprintf('PDOException was thrown when trying to read the session data: %s', $e->getMessage()), 0, $e);
        }
    }

    /**
     * {@inheritdoc}
     */
    public function write($id, $data)
    {
        $platform = $this->con->getDatabasePlatform();

        // this should maybe be abstracted in Doctrine DBAL
        if ($platform instanceof MySqlPlatform) {
            $sql = "INSERT INTO {$this->tableName} (sess_id, sess_data, sess_time) VALUES (%1\$s, %2\$s, %3\$d) "
                  ."ON DUPLICATE KEY UPDATE sess_data = VALUES(sess_data), sess_time = CASE WHEN sess_time = %3\$d THEN (VALUES(sess_time) + 1) ELSE VALUES(sess_time) END";
        } else {
            $sql = "UPDATE {$this->tableName} SET sess_data = %2\$s, sess_time = %3\$d WHERE sess_id = %1\$s";
        }

        try {
            $rowCount = $this->con->exec(sprintf(
                $sql,
                $this->con->quote($id),
                //session data can contain non binary safe characters so we need to encode it
                $this->con->quote(base64_encode($data)),
                time()
            ));

            if (!$rowCount) {
                // No session exists in the database to update. This happens when we have called
                // session_regenerate_id()
                $this->createNewSession($id, $data);
            }
        } catch (\PDOException $e) {
            throw new \RuntimeException(sprintf('PDOException was thrown when trying to write the session data: %s', $e->getMessage()), 0, $e);
        }

        return true;
    }

   /**
    * Creates a new session with the given $id and $data
    *
    * @param string $id
    * @param string $data
    *
    * @return Boolean
    */
    private function createNewSession($id, $data = '')
    {
        $this->con->exec(sprintf("INSERT INTO {$this->tableName} (sess_id, sess_data, sess_time) VALUES (%s, %s, %d)",
            $this->con->quote($id),
            //session data can contain non binary safe characters so we need to encode it
            $this->con->quote(base64_encode($data)),
            time()
        ));

        return true;
    }
}
PKCa�\�Ta�==Gpear/Symfony/Bridge/Doctrine/ExpressionLanguage/DoctrineParserCache.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\ExpressionLanguage;

use Doctrine\Common\Cache\Cache;
use Symfony\Component\ExpressionLanguage\ParsedExpression;
use Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface;

/**
 * @author Adrien Brault <adrien.brault@gmail.com>
 */
class DoctrineParserCache implements ParserCacheInterface
{
    /**
     * @var Cache
     */
    private $cache;

    public function __construct(Cache $cache)
    {
        $this->cache = $cache;
    }

    /**
     * {@inheritdoc}
     */
    public function fetch($key)
    {
        if (false === $value = $this->cache->fetch($key)) {
            return null;
        }

        return $value;
    }

    /**
     * {@inheritdoc}
     */
    public function save($key, ParsedExpression $expression)
    {
        $this->cache->save($key, $expression);
    }
}
PKCa�\OlQ�99;pear/Symfony/Bridge/Doctrine/ContainerAwareEventManager.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine;

use Doctrine\Common\EventArgs;
use Doctrine\Common\EventManager;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Allows lazy loading of listener services.
 *
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
 */
class ContainerAwareEventManager extends EventManager
{
    /**
     * Map of registered listeners.
     * <event> => <listeners>
     *
     * @var array
     */
    private $listeners = array();
    private $initialized = array();
    private $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    /**
     * Dispatches an event to all registered listeners.
     *
     * @param string $eventName The name of the event to dispatch. The name of the event is
     *                          the name of the method that is invoked on listeners.
     * @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners.
     *                             If not supplied, the single empty EventArgs instance is used.
     * @return boolean
     */
    public function dispatchEvent($eventName, EventArgs $eventArgs = null)
    {
        if (isset($this->listeners[$eventName])) {
            $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs;

            $initialized = isset($this->initialized[$eventName]);

            foreach ($this->listeners[$eventName] as $hash => $listener) {
                if (!$initialized && is_string($listener)) {
                    $this->listeners[$eventName][$hash] = $listener = $this->container->get($listener);
                }

                $listener->$eventName($eventArgs);
            }
            $this->initialized[$eventName] = true;
        }
    }

    /**
     * Gets the listeners of a specific event or all listeners.
     *
     * @param string $event The name of the event.
     *
     * @return array The event listeners for the specified event, or all event listeners.
     */
    public function getListeners($event = null)
    {
        return $event ? $this->listeners[$event] : $this->listeners;
    }

    /**
     * Checks whether an event has any registered listeners.
     *
     * @param string $event
     *
     * @return boolean TRUE if the specified event has any listeners, FALSE otherwise.
     */
    public function hasListeners($event)
    {
        return isset($this->listeners[$event]) && $this->listeners[$event];
    }

    /**
     * Adds an event listener that listens on the specified events.
     *
     * @param string|array  $events   The event(s) to listen on.
     * @param object|string $listener The listener object.
     *
     * @throws \RuntimeException
     */
    public function addEventListener($events, $listener)
    {
        if (is_string($listener)) {
            if ($this->initialized) {
                throw new \RuntimeException('Adding lazy-loading listeners after construction is not supported.');
            }

            $hash = '_service_'.$listener;
        } else {
            // Picks the hash code related to that listener
            $hash = spl_object_hash($listener);
        }

        foreach ((array) $events as $event) {
            // Overrides listener if a previous one was associated already
            // Prevents duplicate listeners on same event (same instance only)
            $this->listeners[$event][$hash] = $listener;
        }
    }

    /**
     * Removes an event listener from the specified events.
     *
     * @param string|array  $events
     * @param object|string $listener
     */
    public function removeEventListener($events, $listener)
    {
        if (is_string($listener)) {
            $hash = '_service_'.$listener;
        } else {
            // Picks the hash code related to that listener
            $hash = spl_object_hash($listener);
        }

        foreach ((array) $events as $event) {
            // Check if actually have this listener associated
            if (isset($this->listeners[$event][$hash])) {
                unset($this->listeners[$event][$hash]);
            }
        }
    }
}
PKCa�\:�d�Lpear/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Validator\Constraints;

use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * Unique Entity Validator checks if one or a set of fields contain unique values.
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 */
class UniqueEntityValidator extends ConstraintValidator
{
    /**
     * @var ManagerRegistry
     */
    private $registry;

    /**
     * @param ManagerRegistry $registry
     */
    public function __construct(ManagerRegistry $registry)
    {
        $this->registry = $registry;
    }

    /**
     * @param object     $entity
     * @param Constraint $constraint
     *
     * @throws UnexpectedTypeException
     * @throws ConstraintDefinitionException
     */
    public function validate($entity, Constraint $constraint)
    {
        if (!is_array($constraint->fields) && !is_string($constraint->fields)) {
            throw new UnexpectedTypeException($constraint->fields, 'array');
        }

        if (null !== $constraint->errorPath && !is_string($constraint->errorPath)) {
            throw new UnexpectedTypeException($constraint->errorPath, 'string or null');
        }

        $fields = (array) $constraint->fields;

        if (0 === count($fields)) {
            throw new ConstraintDefinitionException('At least one field has to be specified.');
        }

        if ($constraint->em) {
            $em = $this->registry->getManager($constraint->em);

            if (!$em) {
               throw new ConstraintDefinitionException(sprintf('Object manager "%s" does not exist.', $constraint->em));
            }
        } else {
            $em = $this->registry->getManagerForClass(get_class($entity));

            if (!$em) {
                throw new ConstraintDefinitionException(sprintf('Unable to find the object manager associated with an entity of class "%s".', get_class($entity)));
            }
        }

        $class = $em->getClassMetadata(get_class($entity));
        /* @var $class \Doctrine\Common\Persistence\Mapping\ClassMetadata */

        $criteria = array();
        foreach ($fields as $fieldName) {
            if (!$class->hasField($fieldName) && !$class->hasAssociation($fieldName)) {
                throw new ConstraintDefinitionException(sprintf("The field '%s' is not mapped by Doctrine, so it cannot be validated for uniqueness.", $fieldName));
            }

            $criteria[$fieldName] = $class->reflFields[$fieldName]->getValue($entity);

            if ($constraint->ignoreNull && null === $criteria[$fieldName]) {
                return;
            }

            if (null !== $criteria[$fieldName] && $class->hasAssociation($fieldName)) {
                /* Ensure the Proxy is initialized before using reflection to
                 * read its identifiers. This is necessary because the wrapped
                 * getter methods in the Proxy are being bypassed.
                 */
                $em->initializeObject($criteria[$fieldName]);

                $relatedClass = $em->getClassMetadata($class->getAssociationTargetClass($fieldName));
                $relatedId = $relatedClass->getIdentifierValues($criteria[$fieldName]);

                if (count($relatedId) > 1) {
                    throw new ConstraintDefinitionException(
                        "Associated entities are not allowed to have more than one identifier field to be " .
                        "part of a unique constraint in: ".$class->getName()."#".$fieldName
                    );
                }
                $criteria[$fieldName] = array_pop($relatedId);
            }
        }

        $repository = $em->getRepository(get_class($entity));
        $result = $repository->{$constraint->repositoryMethod}($criteria);

        /* If the result is a MongoCursor, it must be advanced to the first
         * element. Rewinding should have no ill effect if $result is another
         * iterator implementation.
         */
        if ($result instanceof \Iterator) {
            $result->rewind();
        } elseif (is_array($result)) {
            reset($result);
        }

        /* If no entity matched the query criteria or a single entity matched,
         * which is the same as the entity being validated, the criteria is
         * unique.
         */
        if (0 === count($result) || (1 === count($result) && $entity === ($result instanceof \Iterator ? $result->current() : current($result)))) {
            return;
        }

        $errorPath = null !== $constraint->errorPath ? $constraint->errorPath : $fields[0];

        $this->context->addViolationAt($errorPath, $constraint->message, array(), $criteria[$fields[0]]);
    }
}
PKCa�\Q��Cpear/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * Constraint for the Unique Entity validator
 *
 * @Annotation
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 */
class UniqueEntity extends Constraint
{
    public $message = 'This value is already used.';
    public $service = 'doctrine.orm.validator.unique';
    public $em = null;
    public $repositoryMethod = 'findBy';
    public $fields = array();
    public $errorPath = null;
    public $ignoreNull = true;

    public function getRequiredOptions()
    {
        return array('fields');
    }

    /**
     * The validator must be defined as a service with this name.
     *
     * @return string
     */
    public function validatedBy()
    {
        return $this->service;
    }

    /**
     * {@inheritDoc}
     */
    public function getTargets()
    {
        return self::CLASS_CONSTRAINT;
    }

    public function getDefaultOption()
    {
        return 'fields';
    }
}
PKDa�\(��y��>pear/Symfony/Bridge/Doctrine/Validator/DoctrineInitializer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Validator;

use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Component\Validator\ObjectInitializerInterface;

/**
 * Automatically loads proxy object before validation.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class DoctrineInitializer implements ObjectInitializerInterface
{
    protected $registry;

    public function __construct(ManagerRegistry $registry)
    {
        $this->registry = $registry;
    }

    public function initialize($object)
    {
        $manager = $this->registry->getManagerForClass(get_class($object));
        if (null !== $manager) {
            $manager->initializeObject($object);
        }
    }
}
PKDa�\��0AC5C5pear/Console/Getopt.phpnu�[���<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
/**
 * PHP Version 5
 *
 * Copyright (c) 2001-2015, The PEAR developers
 *
 * This source file is subject to the BSD-2-Clause license,
 * that is bundled with this package in the file LICENSE, and is
 * available through the world-wide-web at the following url:
 * http://opensource.org/licenses/bsd-license.php.
 *
 * @category Console
 * @package  Console_Getopt
 * @author   Andrei Zmievski <andrei@php.net>
 * @license  http://opensource.org/licenses/bsd-license.php BSD-2-Clause
 * @version  CVS: $Id$
 * @link     http://pear.php.net/package/Console_Getopt
 */

require_once 'PEAR.php';

/**
 * Command-line options parsing class.
 *
 * @category Console
 * @package  Console_Getopt
 * @author   Andrei Zmievski <andrei@php.net>
 * @license  http://opensource.org/licenses/bsd-license.php BSD-2-Clause
 * @link     http://pear.php.net/package/Console_Getopt
 */
class Console_Getopt
{

    /**
     * Parses the command-line options.
     *
     * The first parameter to this function should be the list of command-line
     * arguments without the leading reference to the running program.
     *
     * The second parameter is a string of allowed short options. Each of the
     * option letters can be followed by a colon ':' to specify that the option
     * requires an argument, or a double colon '::' to specify that the option
     * takes an optional argument.
     *
     * The third argument is an optional array of allowed long options. The
     * leading '--' should not be included in the option name. Options that
     * require an argument should be followed by '=', and options that take an
     * option argument should be followed by '=='.
     *
     * The return value is an array of two elements: the list of parsed
     * options and the list of non-option command-line arguments. Each entry in
     * the list of parsed options is a pair of elements - the first one
     * specifies the option, and the second one specifies the option argument,
     * if there was one.
     *
     * Long and short options can be mixed.
     *
     * Most of the semantics of this function are based on GNU getopt_long().
     *
     * @param array  $args          an array of command-line arguments
     * @param string $short_options specifies the list of allowed short options
     * @param array  $long_options  specifies the list of allowed long options
     * @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option
     *
     * @return array two-element array containing the list of parsed options and
     * the non-option arguments
     */
    public static function getopt2($args, $short_options, $long_options = null, $skip_unknown = false)
    {
        return Console_Getopt::doGetopt(2, $args, $short_options, $long_options, $skip_unknown);
    }

    /**
     * This function expects $args to start with the script name (POSIX-style).
     * Preserved for backwards compatibility.
     *
     * @param array  $args          an array of command-line arguments
     * @param string $short_options specifies the list of allowed short options
     * @param array  $long_options  specifies the list of allowed long options
     *
     * @see getopt2()
     * @return array two-element array containing the list of parsed options and
     * the non-option arguments
     */
    public static function getopt($args, $short_options, $long_options = null, $skip_unknown = false)
    {
        return Console_Getopt::doGetopt(1, $args, $short_options, $long_options, $skip_unknown);
    }

    /**
     * The actual implementation of the argument parsing code.
     *
     * @param int    $version       Version to use
     * @param array  $args          an array of command-line arguments
     * @param string $short_options specifies the list of allowed short options
     * @param array  $long_options  specifies the list of allowed long options
     * @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option
     *
     * @return array
     */
    public static function doGetopt($version, $args, $short_options, $long_options = null, $skip_unknown = false)
    {
        // in case you pass directly readPHPArgv() as the first arg
        if (PEAR::isError($args)) {
            return $args;
        }

        if (empty($args)) {
            return array(array(), array());
        }

        $non_opts = $opts = array();

        settype($args, 'array');

        if ($long_options) {
            sort($long_options);
        }

        /*
         * Preserve backwards compatibility with callers that relied on
         * erroneous POSIX fix.
         */
        if ($version < 2) {
            if (isset($args[0][0]) && $args[0][0] != '-') {
                array_shift($args);
            }
        }

        for ($i = 0; $i < count($args); $i++) {
            $arg = $args[$i];
            /* The special element '--' means explicit end of
               options. Treat the rest of the arguments as non-options
               and end the loop. */
            if ($arg == '--') {
                $non_opts = array_merge($non_opts, array_slice($args, $i + 1));
                break;
            }

            if ($arg[0] != '-' || (strlen($arg) > 1 && $arg[1] == '-' && !$long_options)) {
                $non_opts = array_merge($non_opts, array_slice($args, $i));
                break;
            } elseif (strlen($arg) > 1 && $arg[1] == '-') {
                $error = Console_Getopt::_parseLongOption(substr($arg, 2),
                                                          $long_options,
                                                          $opts,
                                                          $i,
                                                          $args,
                                                          $skip_unknown);
                if (PEAR::isError($error)) {
                    return $error;
                }
            } elseif ($arg == '-') {
                // - is stdin
                $non_opts = array_merge($non_opts, array_slice($args, $i));
                break;
            } else {
                $error = Console_Getopt::_parseShortOption(substr($arg, 1),
                                                           $short_options,
                                                           $opts,
                                                           $i,
                                                           $args,
                                                           $skip_unknown);
                if (PEAR::isError($error)) {
                    return $error;
                }
            }
        }

        return array($opts, $non_opts);
    }

    /**
     * Parse short option
     *
     * @param string     $arg           Argument
     * @param string[]   $short_options Available short options
     * @param string[][] &$opts
     * @param int        &$argIdx
     * @param string[]   $args
     * @param boolean    $skip_unknown suppresses Console_Getopt: unrecognized option
     *
     * @return void
     */
    protected static function _parseShortOption($arg, $short_options, &$opts, &$argIdx, $args, $skip_unknown)
    {
        for ($i = 0; $i < strlen($arg); $i++) {
            $opt     = $arg[$i];
            $opt_arg = null;

            /* Try to find the short option in the specifier string. */
            if (($spec = strstr($short_options, $opt)) === false || $arg[$i] == ':') {
                if ($skip_unknown === true) {
                    break;
                }

                $msg = "Console_Getopt: unrecognized option -- $opt";
                return PEAR::raiseError($msg);
            }

            if (strlen($spec) > 1 && $spec[1] == ':') {
                if (strlen($spec) > 2 && $spec[2] == ':') {
                    if ($i + 1 < strlen($arg)) {
                        /* Option takes an optional argument. Use the remainder of
                           the arg string if there is anything left. */
                        $opts[] = array($opt, substr($arg, $i + 1));
                        break;
                    }
                } else {
                    /* Option requires an argument. Use the remainder of the arg
                       string if there is anything left. */
                    if ($i + 1 < strlen($arg)) {
                        $opts[] = array($opt,  substr($arg, $i + 1));
                        break;
                    } else if (isset($args[++$argIdx])) {
                        $opt_arg = $args[$argIdx];
                        /* Else use the next argument. */;
                        if (Console_Getopt::_isShortOpt($opt_arg)
                            || Console_Getopt::_isLongOpt($opt_arg)) {
                            $msg = "option requires an argument --$opt";
                            return PEAR::raiseError("Console_Getopt: " . $msg);
                        }
                    } else {
                        $msg = "option requires an argument --$opt";
                        return PEAR::raiseError("Console_Getopt: " . $msg);
                    }
                }
            }

            $opts[] = array($opt, $opt_arg);
        }
    }

    /**
     * Checks if an argument is a short option
     *
     * @param string $arg Argument to check
     *
     * @return bool
     */
    protected static function _isShortOpt($arg)
    {
        return strlen($arg) == 2 && $arg[0] == '-'
               && preg_match('/[a-zA-Z]/', $arg[1]);
    }

    /**
     * Checks if an argument is a long option
     *
     * @param string $arg Argument to check
     *
     * @return bool
     */
    protected static function _isLongOpt($arg)
    {
        return strlen($arg) > 2 && $arg[0] == '-' && $arg[1] == '-' &&
               preg_match('/[a-zA-Z]+$/', substr($arg, 2));
    }

    /**
     * Parse long option
     *
     * @param string     $arg          Argument
     * @param string[]   $long_options Available long options
     * @param string[][] &$opts
     * @param int        &$argIdx
     * @param string[]   $args
     *
     * @return void|PEAR_Error
     */
    protected static function _parseLongOption($arg, $long_options, &$opts, &$argIdx, $args, $skip_unknown)
    {
        @list($opt, $opt_arg) = explode('=', $arg, 2);

        $opt_len = strlen($opt);

        for ($i = 0; $i < count($long_options); $i++) {
            $long_opt  = $long_options[$i];
            $opt_start = substr($long_opt, 0, $opt_len);

            $long_opt_name = str_replace('=', '', $long_opt);

            /* Option doesn't match. Go on to the next one. */
            if ($long_opt_name != $opt) {
                continue;
            }

            $opt_rest = substr($long_opt, $opt_len);

            /* Check that the options uniquely matches one of the allowed
               options. */
            if ($i + 1 < count($long_options)) {
                $next_option_rest = substr($long_options[$i + 1], $opt_len);
            } else {
                $next_option_rest = '';
            }

            if ($opt_rest != '' && $opt[0] != '=' &&
                $i + 1 < count($long_options) &&
                $opt == substr($long_options[$i+1], 0, $opt_len) &&
                $next_option_rest != '' &&
                $next_option_rest[0] != '=') {

                $msg = "Console_Getopt: option --$opt is ambiguous";
                return PEAR::raiseError($msg);
            }

            if (substr($long_opt, -1) == '=') {
                if (substr($long_opt, -2) != '==') {
                    /* Long option requires an argument.
                       Take the next argument if one wasn't specified. */;
                    if (!strlen($opt_arg)) {
                        if (!isset($args[++$argIdx])) {
                            $msg = "Console_Getopt: option requires an argument --$opt";
                            return PEAR::raiseError($msg);
                        }
                        $opt_arg = $args[$argIdx];
                    }

                    if (Console_Getopt::_isShortOpt($opt_arg)
                        || Console_Getopt::_isLongOpt($opt_arg)) {
                        $msg = "Console_Getopt: option requires an argument --$opt";
                        return PEAR::raiseError($msg);
                    }
                }
            } else if ($opt_arg) {
                $msg = "Console_Getopt: option --$opt doesn't allow an argument";
                return PEAR::raiseError($msg);
            }

            $opts[] = array('--' . $opt, $opt_arg);
            return;
        }

        if ($skip_unknown === true) {
            return;
        }

        return PEAR::raiseError("Console_Getopt: unrecognized option --$opt");
    }

    /**
     * Safely read the $argv PHP array across different PHP configurations.
     * Will take care on register_globals and register_argc_argv ini directives
     *
     * @return mixed the $argv PHP array or PEAR error if not registered
     */
    public static function readPHPArgv()
    {
        global $argv;
        if (!is_array($argv)) {
            if (!@is_array($_SERVER['argv'])) {
                if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {
                    $msg = "Could not read cmd args (register_argc_argv=Off?)";
                    return PEAR::raiseError("Console_Getopt: " . $msg);
                }
                return $GLOBALS['HTTP_SERVER_VARS']['argv'];
            }
            return $_SERVER['argv'];
        }
        return $argv;
    }

}
PKEa�\�kmw�:�:pear/pearcmd.phpnu�[���<?php
/**
 * PEAR, the PHP Extension and Application Repository
 *
 * Command line interface
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Stig Bakken <ssb@php.net>
 * @author    Tomas V.V.Cox <cox@idecnet.com>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 */

@ob_end_clean();
if (!defined('PEAR_RUNTYPE')) {
    // this is defined in peclcmd.php as 'pecl'
    define('PEAR_RUNTYPE', 'pear');
}
define('PEAR_IGNORE_BACKTRACE', 1);
/**
 * @nodep Gtk
 */
//the space is needed for windows include paths with trailing backslash
// http://pear.php.net/bugs/bug.php?id=19482
if ('/opt/alt/php54/usr/share/pear ' != '@'.'include_path'.'@ ') {
    ini_set('include_path', trim('/opt/alt/php54/usr/share/pear '). PATH_SEPARATOR .  get_include_path());
    $raw = false;
} else {
    // this is a raw, uninstalled pear, either a cvs checkout, or php distro
    ini_set('include_path', dirname(__DIR__) . PATH_SEPARATOR . get_include_path());
    $raw = true;
}
@ini_set('allow_url_fopen', true);
@set_time_limit(0);
ob_implicit_flush(true);
@ini_set('track_errors', true);
@ini_set('html_errors', false);
$_PEAR_PHPDIR = '#$%^&*';
set_error_handler('error_handler');

$pear_package_version = "1.10.16";

require_once 'PEAR.php';
require_once 'PEAR/Frontend.php';
require_once 'PEAR/Config.php';
require_once 'PEAR/Command.php';
require_once 'Console/Getopt.php';


PEAR_Command::setFrontendType('CLI');
$all_commands = PEAR_Command::getCommands();

$argv = Console_Getopt::readPHPArgv();
// fix CGI sapi oddity - the -- in pear.bat/pear is not removed
if (php_sapi_name() != 'cli' && isset($argv[1]) && $argv[1] == '--') {
    unset($argv[1]);
    $argv = array_values($argv);
}
$progname = PEAR_RUNTYPE;
array_shift($argv);
$options = Console_Getopt::getopt2($argv, "c:C:d:D:Gh?sSqu:vV");
if (PEAR::isError($options)) {
    usage($options);
}

$opts = $options[0];

$fetype = 'CLI';
if ($progname == 'gpear' || $progname == 'pear-gtk') {
    $fetype = 'Gtk2';
} else {
    foreach ($opts as $opt) {
        if ($opt[0] == 'G') {
            $fetype = 'Gtk2';
        }
    }
}

$pear_user_config = '';
$pear_system_config = '';
$store_user_config = false;
$store_system_config = false;
$verbose = 1;

foreach ($opts as $opt) {
    switch ($opt[0]) {
    case 'c':
        $pear_user_config = $opt[1];
        break;
    case 'C':
        $pear_system_config = $opt[1];
        break;
    }
}

PEAR_Command::setFrontendType($fetype);
$ui = &PEAR_Command::getFrontendObject();
$config = &PEAR_Config::singleton($pear_user_config, $pear_system_config);

if (PEAR::isError($config)) {
    $_file = '';
    if ($pear_user_config !== false) {
        $_file .= $pear_user_config;
    }
    if ($pear_system_config !== false) {
        $_file .= '/' . $pear_system_config;
    }
    if ($_file == '/') {
        $_file = 'The default config file';
    }
    $config->getMessage();
    $ui->outputData("ERROR: $_file is not a valid config file or is corrupted.");
    // We stop, we have no idea where we are :)
    exit(1);
}

// this is used in the error handler to retrieve a relative path
$_PEAR_PHPDIR = $config->get('php_dir');
$ui->setConfig($config);
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($ui, "displayFatalError"));

$verbose = $config->get("verbose");
$cmdopts = array();

if ($raw) {
    if (!$config->isDefinedLayer('user') && !$config->isDefinedLayer('system')) {
        $found = false;
        foreach ($opts as $opt) {
            if ($opt[0] == 'd' || $opt[0] == 'D') {
                // the user knows what they are doing, and are setting config values
                $found = true;
            }
        }
        if (!$found) {
            // no prior runs, try to install PEAR
            $parent = dirname(__FILE__);
            if (strpos($parent, 'scripts')) {
                $grandparent = dirname($parent);
                $packagexml = $grandparent . DIRECTORY_SEPARATOR . 'package2.xml';
                $pearbase = $grandparent;
            } else {
                $packagexml = $parent . DIRECTORY_SEPARATOR . 'package2.xml';
                $pearbase = $parent;
            }
            if (file_exists($packagexml)) {
                $options[1] = array(
                    'install',
                    $packagexml
                );
                $config->set('php_dir', $pearbase . DIRECTORY_SEPARATOR . 'php');
                $config->set('data_dir', $pearbase . DIRECTORY_SEPARATOR . 'data');
                $config->set('doc_dir', $pearbase . DIRECTORY_SEPARATOR . 'docs');
                $config->set('test_dir', $pearbase . DIRECTORY_SEPARATOR . 'tests');
                $config->set(
                    'ext_dir',
                    $pearbase . DIRECTORY_SEPARATOR . 'extensions'
                );
                $config->set('bin_dir', $pearbase);
                $config->mergeConfigFile($pearbase . 'pear.ini', false);
                $config->store();
                $config->set('auto_discover', 1);
            }
        }
    }
}
foreach ($opts as $opt) {
    $param = !empty($opt[1]) ? $opt[1] : true;
    switch ($opt[0]) {
    case 'd':
        if ($param === true) {
            die(
                'Invalid usage of "-d" option, expected -d config_value=value, ' .
                'received "-d"' . "\n"
            );
        }
        $possible = explode('=', $param);
        if (count($possible) != 2) {
            die(
                'Invalid usage of "-d" option, expected ' .
                '-d config_value=value, received "' . $param . '"' . "\n"
            );
        }
        list($key, $value) = explode('=', $param);
        $config->set($key, $value, 'user');
        break;
    case 'D':
        if ($param === true) {
            die(
                'Invalid usage of "-d" option, expected ' .
                '-d config_value=value, received "-d"' . "\n"
            );
        }
        $possible = explode('=', $param);
        if (count($possible) != 2) {
            die(
                'Invalid usage of "-d" option, expected ' .
                '-d config_value=value, received "' . $param . '"' . "\n"
            );
        }
        list($key, $value) = explode('=', $param);
        $config->set($key, $value, 'system');
        break;
    case 's':
        $store_user_config = true;
        break;
    case 'S':
        $store_system_config = true;
        break;
    case 'u':
        $config->remove($param, 'user');
        break;
    case 'v':
        $config->set('verbose', $config->get('verbose') + 1);
        break;
    case 'q':
        $config->set('verbose', $config->get('verbose') - 1);
        break;
    case 'V':
        usage(null, 'version');
    case 'c':
    case 'C':
        break;
    default:
        // all non pear params goes to the command
        $cmdopts[$opt[0]] = $param;
        break;
    }
}

if ($store_system_config) {
    $config->store('system');
}

if ($store_user_config) {
    $config->store('user');
}

$command = (isset($options[1][0])) ? $options[1][0] : null;
if (empty($command) && ($store_user_config || $store_system_config)) {
    exit;
}

if ($fetype == 'Gtk2') {
    if (!$config->validConfiguration()) {
        PEAR::raiseError(
            "CRITICAL ERROR: no existing valid configuration files found in " .
            "files '$pear_user_config' or '$pear_system_config', " .
            "please copy an existing configuration file to one of these " .
            "locations, or use the -c and -s options to create one"
        );
    }
    Gtk::main();
} else {
    do {
        if ($command == 'help') {
            usage(null, isset($options[1][1]) ? $options[1][1] : null);
        }

        if (!$config->validConfiguration()) {
            PEAR::raiseError(
                "CRITICAL ERROR: no existing valid configuration files found " .
                "in files '$pear_user_config' or '$pear_system_config', " .
                "please copy an existing configuration file to one of " .
                "these locations, or use the -c and -s options to create one"
            );
        }

        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $cmd = PEAR_Command::factory($command, $config);
        PEAR::popErrorHandling();
        if (PEAR::isError($cmd)) {
            usage(null, isset($options[1][0]) ? $options[1][0] : null);
        }

        $short_args = $long_args = null;
        PEAR_Command::getGetoptArgs($command, $short_args, $long_args);
        array_shift($options[1]);
        $tmp = Console_Getopt::getopt2($options[1], $short_args, $long_args);

        if (PEAR::isError($tmp)) {
            break;
        }

        list($tmpopt, $params) = $tmp;
        $opts = array();
        foreach ($tmpopt as $foo => $tmp2) {
            list($opt, $value) = $tmp2;
            if ($value === null) {
                $value = true; // options without args
            }

            if (strlen($opt) == 1) {
                $cmdoptions = $cmd->getOptions($command);
                foreach ($cmdoptions as $o => $d) {
                    if (isset($d['shortopt']) && $d['shortopt'] == $opt) {
                        $opts[$o] = $value;
                    }
                }
            } else {
                if (substr($opt, 0, 2) == '--') {
                    $opts[substr($opt, 2)] = $value;
                }
            }
        }

        $ok = $cmd->run($command, $opts, $params);
        if ($ok === false) {
            PEAR::raiseError("unknown command `$command'");
        }

        if (PEAR::isError($ok)) {
            PEAR::setErrorHandling(
                PEAR_ERROR_CALLBACK, array($ui, "displayFatalError")
            );
            PEAR::raiseError($ok);
        }
    } while (false);
}

// {{{ usage()

/**
 * Display usage information
 *
 * @param mixed $error       Optional error message
 * @param mixed $helpsubject Optional subject/command to display help for
 *
 * @return void
 */
function usage($error = null, $helpsubject = null)
{
    global $progname, $all_commands;
    $stdout = fopen('php://stdout', 'w');
    if (PEAR::isError($error)) {
        fputs($stdout, $error->getMessage() . "\n");
    } elseif ($error !== null) {
        fputs($stdout, "$error\n");
    }

    if ($helpsubject != null) {
        $put = cmdHelp($helpsubject);
    } else {
        $put = "Commands:\n";
        $maxlen = max(array_map("strlen", $all_commands));
        $formatstr = "%-{$maxlen}s  %s\n";
        ksort($all_commands);
        foreach ($all_commands as $cmd => $class) {
            $put .= sprintf($formatstr, $cmd, PEAR_Command::getDescription($cmd));
        }
        $put .=
            "Usage: $progname [options] command [command-options] <parameters>\n".
            "Type \"$progname help options\" to list all options.\n".
            "Type \"$progname help shortcuts\" to list all command shortcuts.\n".
            "Type \"$progname help version\" or ".
            "\"$progname version\" to list version information.\n".
            "Type \"$progname help <command>\" to get the help ".
            "for the specified command.";
    }
    fputs($stdout, "$put\n");
    fclose($stdout);

    if ($error === null) {
        exit(0);
    }
    exit(1);
}

/**
 * Return help string for specified command
 *
 * @param string $command Command to return help for
 *
 * @return void
 */
function cmdHelp($command)
{
    global $progname, $all_commands, $config;
    if ($command == "options") {
        return
        "Options:\n".
        "     -v         increase verbosity level (default 1)\n".
        "     -q         be quiet, decrease verbosity level\n".
        "     -c file    find user configuration in `file'\n".
        "     -C file    find system configuration in `file'\n".
        "     -d foo=bar set user config variable `foo' to `bar'\n".
        "     -D foo=bar set system config variable `foo' to `bar'\n".
        "     -G         start in graphical (Gtk) mode\n".
        "     -s         store user configuration\n".
        "     -S         store system configuration\n".
        "     -u foo     unset `foo' in the user configuration\n".
        "     -h, -?     display help/usage (this message)\n".
        "     -V         version information\n";
    } elseif ($command == "shortcuts") {
        $sc = PEAR_Command::getShortcuts();
        $ret = "Shortcuts:\n";
        foreach ($sc as $s => $c) {
            $ret .= sprintf("     %-8s %s\n", $s, $c);
        }
        return $ret;

    } elseif ($command == "version") {
        return "PEAR Version: ".$GLOBALS['pear_package_version'].
               "\nPHP Version: ".phpversion().
               "\nZend Engine Version: ".zend_version().
               "\nRunning on: ".php_uname();

    } elseif ($help = PEAR_Command::getHelp($command)) {
        if (is_string($help)) {
            return "$progname $command [options] $help\n";
        }

        if ($help[1] === null) {
            return "$progname $command $help[0]";
        }

        return "$progname $command [options] $help[0]\n$help[1]";
    }

    return "Command '$command' is not valid, try '$progname help'";
}

// }}}

/**
 * error_handler
 *
 * @param mixed $errno  Error number
 * @param mixed $errmsg Message
 * @param mixed $file   Filename
 * @param mixed $line   Line number
 *
 * @access public
 * @return boolean
 */
function error_handler($errno, $errmsg, $file, $line)
{
    if ((!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 80400) && ($errno & E_STRICT)) {
        return; // E_STRICT
    }
    if ($errno & E_DEPRECATED) {
        return; // E_DEPRECATED
    }
    if (!(error_reporting() & $errno) &&
        isset($GLOBALS['config']) &&
        $GLOBALS['config']->get('verbose') < 4
    ) {
        return false; // @silenced error, show all if debug is high enough
    }
    $errortype = array (
        E_DEPRECATED  => 'Deprecated Warning',
        E_ERROR   =>  "Error",
        E_WARNING   =>  "Warning",
        E_PARSE   =>  "Parsing Error",
        E_NOTICE   =>  "Notice",
        E_CORE_ERROR  =>  "Core Error",
        E_CORE_WARNING  =>  "Core Warning",
        E_COMPILE_ERROR  =>  "Compile Error",
        E_COMPILE_WARNING =>  "Compile Warning",
        E_USER_ERROR =>  "User Error",
        E_USER_WARNING =>  "User Warning",
        E_USER_NOTICE =>  "User Notice"
    );
    if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 80400) {
        $errortype[E_STRICT] = 'Strict Warning';
    }
    $prefix = $errortype[$errno];
    global $_PEAR_PHPDIR;
    if (stristr($file, $_PEAR_PHPDIR)) {
        $file = substr($file, strlen($_PEAR_PHPDIR) + 1);
    } else {
        $file = basename($file);
    }
    print "\n$prefix: $errmsg in $file on line $line\n";
    return false;
}


/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * indent-tabs-mode: nil
 * mode: php
 * End:
 */
// vim600:syn=php
PKEa�\�.U�ccpear/peclcmd.phpnu�[���<?php
/**
 * PEAR, the PHP Extension and Application Repository
 *
 * Command line interface
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 */

/**
 * @nodep Gtk
 */
//the space is needed for windows include paths with trailing backslash
// http://pear.php.net/bugs/bug.php?id=19482
if ('/opt/alt/php54/usr/share/pear ' != '@'.'include_path'.'@ ') {
    ini_set('include_path', trim('/opt/alt/php54/usr/share/pear '). PATH_SEPARATOR .  get_include_path());
    $raw = false;
} else {
    // this is a raw, uninstalled pear, either a cvs checkout, or php distro
    ini_set('include_path', __DIR__ . PATH_SEPARATOR . get_include_path());
    $raw = true;
}
define('PEAR_RUNTYPE', 'pecl');
require_once 'pearcmd.php';
/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * indent-tabs-mode: nil
 * mode: php
 * End:
 */
// vim600:syn=php

?>
PKFa�\����p:p:%pear/Structures/LinkedList/Single.phpnu�[���<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker textwidth=80: */

/**
 * Linked list structure
 * 
 * This package implements a singly linked list structure. Each node
 * (Structures_LinkedList_SingleNode object) in the list
 * (Structures_LinkedList_Single) knows the the next node in the list.
 * Unlike an array, you can insert or delete nodes at arbitrary points
 * in the list.
 *
 * If your application normally traverses the linked list in a forward-only
 * direction, use the singly-linked list implemented by
 * {@link Structures_LinkedList_Single}. If, however, your application
 * needs to traverse the list backwards, or insert nodes into the list before
 * other nodes in the list, use the double-linked list implemented by
 * {@link Structures_LinkedList_Double} to give your application better
 * performance at the cost of a slightly larger memory footprint.
 *
 * Structures_LinkedList_Single implements the Iterator interface so control
 * structures like foreach($list as $node) and while($list->next()) work
 * as expected.
 *
 * To use this package, derive a child class from
 * Structures_LinkedList_SingleNode and add data to the object. Then use the
 * Structures_LinkedList_Single class to access the nodes.
 *
 * PHP version 5
 *
 * LICENSE:  Copyright 2006 Dan Scott
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @category  Structures
 * @package   Structures_LinkedList_Single
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2006 Dan Scott
 * @license   http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @version   CVS: $Id: Single.php -1   $
 * @link      http://pear.php.net/package/Structures_LinkedList_Single
 * @example   single_link_example.php
 *
 * @todo Add some actual error conditions
 **/

require_once 'PEAR/Exception.php';

// {{{ class Structures_LinkedList_Single
/**
 * The Structures_LinkedList_Single class represents a linked list structure
 * composed of {@link Structures_LinkedList_SingleNode} objects.
 *
 * @category Structures
 * @package  Structures_LinkedList_Single
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @link     http://pear.php.net/package/Structures_LinkedList_Single
 */
class Structures_LinkedList_Single implements Iterator
{
    // {{{ properties
    /**
     * Current node in the linked list
     * @var Structures_LinkedList_SingleNode
     */
    protected $current;

    /**
     * Root node of the linked list
     * @var Structures_LinkedList_SingleNode
     */
    protected $root_node;

    /**
     * The linked list contains no nodes
     */
    const ERROR_EMPTY = -1;

    public static $messages = array(
        self::ERROR_EMPTY => 'No nodes in this linked list' 
    );
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Structures_LinkedList_Single constructor
     *
     * @param Structures_LinkedList_SingleNode $root root node for the
     * linked list
     */
    function __construct(Structures_LinkedList_SingleNode $root = null)
    {
        if ($root) {
            $this->root_node = $root;
            $this->current = $root;
        } else {
            $this->root_node = null;
            $this->current = null;
        }
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Structures_LinkedList_Single destructor
     *
     * If we do not destroy all of the references in the linked list,
     * we will quickly run out of memory for large / complex structures.
     *
     */
    function __destruct()
    {
        /*
         * Starting with root node, set last node = root_node
         *   get next node
         *   if next node exists, delete last node reference to next node
         */
        if (!$last_node = $this->root_node) {
            return;
        }
        while (($next_node = $last_node->next()) !== false) {
            $last_node->setNext(null);
            $temp_node = $last_node;
            $last_node = $next_node;
            unset($temp_node);
        }
        $this->current = null;
        $this->root_node = null;
        $last_node = null;
        $next_node = null;
    }
    // }}}

    // {{{ function current()
    /**
     * Returns the current node in the linked list
     *
     * @return Structures_LinkedList_SingleNode current node in the linked list
     */
    public function current()
    {
        return $this->current;
    }
    // }}}

    // {{{ function rewind()
    /**
     * Sets the pointer for the linked list to the root node
     *
     * @return Structures_LinkedList_SingleNode root node in the linked list
     */
    public function rewind()
    {
        if ($this->root_node) {
            $this->current = $this->root_node;
        } else {
            $this->current = null;
        }
        return $this->current;
    }
    // }}}

    // {{{ function end()
    /**
     * Sets the pointer for the linked list to the root node
     *
     * @return Structures_LinkedList_SingleNode root node in the linked list
     */
    public function end()
    {
        $this->current = $this->getTailNode();
        return $this->current;
    }
    // }}}

    // {{{ function key()
    /**
     * Stub for Iterator interface that simply returns the current node
     *
     * @return Structures_LinkedList_SingleNode current node in the linked list
     */
    public function key()
    {
        return $this->current;
    }
    // }}}

    // {{{ function valid()
    /**
     * Stub for Iterator interface that simply returns the current node
     *
     * @return Structures_LinkedList_SingleNode current node in the linked list
     */
    public function valid()
    {
        return $this->current();
    }
    // }}}

    // {{{ function next()
    /**
     * Sets the pointer for the linked list to the next node and
     * returns that node
     *
     * @return Structures_LinkedList_SingleNode next node in the linked list
     */
    public function next()
    {
        if (!$this->current) {
            return false;
        }
        $this->current = $this->current()->next();
        return $this->current;
    }
    // }}}

    // {{{ function previous()
    /**
     * Sets the pointer for the linked list to the previous node and
     * returns that node
     *
     * @return Structures_LinkedList_SingleNode previous node in the linked list
     */
    public function previous()
    {
        if (!$this->current) {
            return false;
        }
        $this->current = $this->_getPreviousNode();
        return $this->current;
    }
    // }}}

    // {{{ protected function getTailNode()
    /**
     * Returns the tail node of the linked list.
     *
     * This is an expensive operation!
     *
     * @return bool Success or failure
     **/
    protected function getTailNode()
    {
        $tail_node = $this->root_node;
        while (($y = $tail_node->next()) !== false) {
            $tail_node = $y;
        }
        return $tail_node;
    }
    // }}}

    // {{{ private function _getPreviousNode()
    /**
     * Returns the node prior to the current node in the linked list.
     *
     * This is an expensive operation for a singly linked list!
     *
     * @param Structures_LinkedList_SingleNode $node (Optional) Specific node 
     * for which we want to find the previous node
     *
     * @return Structures_LinkedList_SingleNode Previous node
     **/
    private function _getPreviousNode($node = null)
    {
        if (!$node) {
            $node = $this->current;
        }
        $prior_node = $this->root_node;
        while (($y = $prior_node->next()) !== false) {
            if ($y == $node) {
                return $prior_node;
            }
            $prior_node = $y;
        }
        return null;
    }
    // }}}

    // {{{ function appendNode()
    /**
     * Adds a {@link Structures_LinkedList_SingleNode} object to the end of
     * the linked list.
     *
     * @param Structures_LinkedList_SingleNode $new_node New node to append
     *
     * @return bool Success or failure
     **/
    public function appendNode(Structures_LinkedList_SingleNode $new_node)
    {
        if (!$this->root_node) {
            $this->__construct($new_node);
            return true;
        }

        // This is just a special case of insertNode()
        $this->insertNode($new_node, $this->getTailNode());

        return true;
    }
    // }}}

    // {{{ function insertNode()
    /**
     * Inserts a {@link Structures_LinkedList_SingleNode} object into the linked
     * list, based on a reference node that already exists in the list.
     *
     * @param Structures_LinkedList_SingleNode $new_node      New node to add to
     * the list
     * @param Structures_LinkedList_SingleNode $existing_node Reference
     * position node
     * @param bool                             $before        Insert new node
     * before or after the existing node
     *
     * @return bool Success or failure
     **/
    public function insertNode($new_node, $existing_node, $before = false)
    {
        if (!$this->root_node) {
            $this->__construct($new_node);
            return true;
        }

        // Now add the node according to the requested mode
        switch ($before) {

        case true:
            if ($existing_node === $this->root_node) {
                $this->root_node = $new_node;
            }
            $previous_node = $this->_getPreviousNode($existing_node);
            if ($previous_node) {
                $previous_node->setNext($new_node);
            }
            $new_node->setNext($existing_node);

            break;

        case false:
            $next_node = $existing_node->next();
            if ($next_node) {
                $new_node->setNext($next_node);
            }
            $existing_node->setNext($new_node);

            break;

        }

        return true;
    }
    // }}}

    // {{{ function prependNode()
    /**
     * Adds a {@link Structures_LinkedList_SingleNode} object to the start
     * of the linked list.
     *
     * @param Structures_LinkedList_SingleNode $new_node Node to prepend
     * to the list
     *
     * @return bool Success or failure
     **/
    public function prependNode(Structures_LinkedList_SingleNode $new_node)
    {
        if (!$this->root_node) {
            $this->__construct($new_node);
            return true;
        }

        // This is just a special case of insertNode()
        $this->insertNode($new_node, $this->root_node, true);

        return true;
    }
    // }}}

    // {{{ function deleteNode()
    /**
     * Deletes a {@link Structures_LinkedList_SingleNode} from the list.
     *
     * @param Structures_LinkedList_SingleNode $node Node to delete.
     *
     * @return null
     */
    public function deleteNode($node)
    {
        /* If this is the root node, and there are more nodes in the list,
         * make the next node the new root node before deleting this node.
         */
        if ($node === $this->root_node) {
            $this->root_node = $node->next();
        }
        
        /* If this is the current node, make the next node the current node.
         *
         * If that fails, null isn't such a bad place to be.
         */
        if ($node === $this->current) {
            if ($node->next()) {
                $this->current = $node->next();
            } else {
                $this->current = null;
            }
        }
        $node->__destruct();
    }
    // }}}

}
// }}}

// {{{ class Structures_LinkedList_SingleNode
/**
 * The Structures_LinkedList_SingleNode class represents a node in a
 * {@link Structures_LinkedList_Single} linked list structure.
 *
 * @category Structures
 * @package  Structures_LinkedList_Single
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @link     http://pear.php.net/package/Structures_LinkedList_Single
 */
class Structures_LinkedList_SingleNode
{
    // {{{ properties
    /**
     * Next node in the linked list
     * @var Structures_LinkedList_SingleNode
     */
    protected $next;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Structures_LinkedList_SingleNode constructor
     */
    public function __construct()
    {
        $this->next = null;
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Removes node from the list, adjusting the related nodes accordingly.
     *
     * This is a problem if the node is the root node for the list.
     * At this point, however, we do not have access to the list itself. Hmm.
     */
    public function __destruct()
    {
    }
    // }}}

    // {{{ function next()
    /**
     * Return the next node in the linked list
     *
     * @return Structures_LinkedList_SingleNode next node in the linked list
     */
    public function next()
    {
        if ($this->next) {
            return $this->next;
        } else {
            return false;
        }
    }
    // }}}

    // {{{ function previous()
    /**
     * Return the previous node in the linked list
     *
     * Stub method for Structures_LinkedList_DoubleNode to override.
     *
     * @return Structures_LinkedList_SingleNode previous node in the linked list
     */
    public function previous()
    {
        return false;
    }
    // }}}

    // {{{ function setNext()
    /**
     * Sets the pointer for the next node in the linked list to the
     * specified node
     *
     * @param Structures_LinkedList_SingleNode $node new next node in
     * the linked list
     *
     * @return Structures_LinkedList_SingleNode new next node in the linked list
     */
    public function setNext($node = null)
    {
        $this->next = $node;
        return $this->next;
    }
    // }}}

    // {{{ function setPrevious()
    /**
     * Sets the pointer for the next node in the linked list to the
     * specified node
     *
     * Stub method for Structures_LinkedList_DoubleNode to override.
     *
     * @param Structures_LinkedList_SingleNode $node new next node in
     * the linked list
     *
     * @return Structures_LinkedList_SingleNode new next node in the linked list
     */
    public function setPrevious($node = null)
    {
        return false;
    }
    // }}}
}

// }}}

?>
PKFa�\�*�z%-%-%pear/Structures/LinkedList/Double.phpnu�[���<?php

/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker textwidth=80: */

/**
 * Linked list structure
 * 
 * This package implements a doubly linked list structure. Each node
 * (Structures_LinkedList_DoubleNode object) in the list
 * (Structures_LinkedList_Double) knows the previous node and the next
 * node in the list. Unlike an array, you can insert or delete nodes at
 * arbitrary points in the list.
 *
 * If your application normally traverses the linked list in a forward-only
 * direction, use the singly-linked list implemented by
 * {@link Structures_LinkedList_Single}. If, however, your application
 * needs to traverse the list backwards, or insert nodes into the list before
 * other nodes in the list, use the double-linked list implemented by
 * {@link Structures_LinkedList_Double} to give your application better
 * performance at the cost of a slightly larger memory footprint.
 *
 * Structures_LinkedList_Double implements the Iterator interface so control
 * structures like foreach($list as $node) and while($list->next()) work
 * as expected.
 *
 * To use this package, derive a child class from
 * Structures_LinkedList_DoubleNode  and add data to the object. Then use the
 * Structures_LinkedList_Double class to access the nodes.
 *
 * PHP version 5
 *
 * LICENSE:  Copyright 2006 Dan Scott
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may
 * not use this file except in compliance with the License. You may obtain
 * a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @category  Structures
 * @package   Structures_LinkedList_Double
 * @author    Dan Scott <dscott@laurentian.ca>
 * @copyright 2006 Dan Scott
 * @license   http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @version   CVS: $Id: Double.php -1   $
 * @link      http://pear.php.net/package/Structures_LinkedList
 * @example   double_link_example.php
 *
 * @todo Add some actual error conditions
 **/

require_once 'PEAR/Exception.php';
require_once 'Single.php';

// {{{ class Structures_LinkedList_Double
/**
 * The Structures_LinkedList_Double class represents a linked list structure
 * composed of {@link Structures_LinkedList_DoubleNode} objects.
 *
 * @category Structures
 * @package  Structures_LinkedList_Double
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @link     http://pear.php.net/package/Structures_LinkedList
 */
class Structures_LinkedList_Double extends Structures_LinkedList_Single implements Iterator
{
    // {{{ properties
    /**
     * Tail node of the linked list
     * @var Structures_LinkedList_DoubleNode
     */
    protected $tail_node;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Structures_LinkedList_Double constructor
     *
     * @param Structures_LinkedList_DoubleNode $root root node for the
     * linked list
     */
    function __construct(Structures_LinkedList_DoubleNode $root = null)
    {
        if ($root) {
            $this->tail_node = $root;
        } else {
            $this->tail_node = null;
        }
        parent::__construct($root);
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Structures_LinkedList_Double destructor
     *
     * If we do not destroy all of the references in the linked list,
     * we will quickly run out of memory for large / complex structures.
     *
     */
    function __destruct()
    {
        /*
         * Starting with root node, set last node = root_node
         *   get next node
         *   if next node exists:
         *     delete last node's references to next node and previous node
         *     make the old next node the new last node
         */
        if (!$last_node = $this->root_node) {
            return;
        }
        while (($next_node = $last_node->next()) !== false) {
            $last_node->setNext(null);
            $last_node->setPrevious(null);
            $last_node = $next_node;
        }
        $this->current = null;
        $this->root_node = null;
        $this->tail_node = null;
        $last_node = null;
        $next_node = null;
    }
    // }}}

    // {{{ function end()
    /**
     * Sets the pointer for the linked list to its last node
     *
     * @return Structures_LinkedList_DoubleNode last node in the linked list
     */
    public function end()
    {
        if ($this->tail_node) {
            $this->current = $this->tail_node;
        } else {
            $this->current = null;
        }
        return $this->current;
    }
    // }}}

    // {{{ function previous()
    /**
     * Sets the pointer for the linked list to the previous node and
     * returns that node
     *
     * @return Structures_LinkedList_DoubleNode previous node in the linked list
     */
    public function previous()
    {
        if (!$this->current()->previous()) {
            return false;
        }
        $this->current = $this->current()->previous();
        return $this->current();
    }
    // }}}

    // {{{ function insertNode()
    /**
     * Inserts a {@link Structures_LinkedList_DoubleNode} object into the linked
     * list, based on a reference node that already exists in the list.
     *
     * @param Structures_LinkedList_DoubleNode $new_node      New node to add to the list
     * @param Structures_LinkedList_DoubleNode $existing_node Reference position node
     * @param bool                             $before        Insert new node before or after the existing node
     *
     * @return bool Success or failure
     **/
    public function insertNode($new_node, $existing_node, $before = false)
    {
        if (!$this->root_node) {
            $this->__construct($new_node);
        }

        // Now add the node according to the requested mode
        switch ($before) {

        case true:
            $previous_node = $existing_node->previous();
            if ($previous_node) {
                $previous_node->setNext($new_node);
                $new_node->setPrevious($previous_node);
            } else {
                // The existing node must be root node; make new node root
                $this->root_node = $new_node;
                $new_node->setPrevious();
            }
            $new_node->setNext($existing_node);
            $existing_node->setPrevious($new_node);

            break;

        case false:
            $new_node->setPrevious($existing_node);
            $next_node = $existing_node->next();
            if ($next_node) {
                $new_node->setNext($next_node);
                $next_node->setPrevious($new_node);
            } else {
                // The existing node must have been the tail node
                $this->tail_node = $new_node;
            }
            $existing_node->setNext($new_node);

            break;

        }

        return true;
    }
    // }}}

    // {{{ protected function getTailNode()
    /**
     * Returns the tail node of the linked list.
     *
     * This is a cheap operation for a doubly-linked list.
     *
     * @return bool Success or failure
     **/
    protected function getTailNode()
    {
        return $this->tail_node;
    }
    // }}}

    // {{{ function deleteNode()
    /**
     * Deletes a {@link Structures_LinkedList_DoubleNode} from the list.
     *
     * @param Structures_LinkedList_DoubleNode $node Node to delete.
     *
     * @return null
     */
    public function deleteNode($node)
    {
        /* If this is the root node, and there are more nodes in the list,
         * make the next node the new root node before deleting this node.
         */
        if ($node === $this->root_node) {
            $this->root_node = $node->next();
        }
        
        /* If this is the tail node, and there are more nodes in the list,
         * make the previous node the tail node before deleting this node
         */
        if ($node === $this->tail_node) {
            $this->tail_node = $node->previous();
        }

        /* If this is the current node, and there are other nodes in the list,
         * try making the previous node the current node so that next() works
         * as expected.
         *
         * If that fails, make the next node the current node.
         *
         * If that fails, null isn't such a bad place to be.
         */
        if ($node === $this->current) {
            if ($node->previous()) {
                $this->current = $node->previous();
            } elseif ($node->next()) {
                $this->current = $node->next();
            } else {
                $this->current = null;
            }
        }
        $node->__destruct();
    }
    // }}}

}
// }}}

// {{{ class Structures_LinkedList_DoubleNode
/**
 * The Structures_LinkedList_DoubleNode class represents a node in a
 * {@link Structures_LinkedList_Double} linked list structure.
 *
 * @category Structures
 * @package  Structures_LinkedList_Double
 * @author   Dan Scott <dscott@laurentian.ca>
 * @license  http://www.apache.org/licenses/LICENSE-2.0  Apache License, Version 2.0
 * @link     http://pear.php.net/package/Structures_LinkedList
 */
class Structures_LinkedList_DoubleNode extends Structures_LinkedList_SingleNode
{
    // {{{ properties
    /**
     * Previous node in the linked list
     * @var Structures_LinkedList_DoubleNode
     */
    protected $previous;
    // }}}

    // {{{ Constructor: function __construct()
    /**
     * Structures_LinkedList_DoubleNode constructor
     */
    public function __construct()
    {
        $this->next = null;
        $this->previous = null;
    }
    // }}}

    // {{{ Destructor: function __destruct()
    /**
     * Removes node from the list, adjusting the related nodes accordingly.
     *
     * This is a problem if the node is the root node for the list.
     * At this point, however, we do not have access to the list itself. Hmm.
     */
    public function __destruct()
    {
        $next = $this->next();
        $previous = $this->previous();
        if ($previous && $next) {
            $previous->setNext($next);
            $next->setPrevious($previous);
        } elseif ($previous) {
            $previous->setNext();
        } elseif ($next) {
            $next->setPrevious();
        }
    }
    // }}}

    // {{{ function previous()
    /**
     * Return the previous node in the linked list
     *
     * @return Structures_LinkedList_DoubleNode previous node in the linked list
     */
    public function previous()
    {
        if ($this->previous) {
            return $this->previous;
        } else {
            return false;
        }
    }
    // }}}

    // {{{ function setPrevious()
    /**
     * Sets the pointer for the previous node in the linked list
     * to the specified node
     *
     * @param Structures_LinkedList_DoubleNode $node new previous node
     * in the linked list
     *
     * @return Structures_LinkedList_DoubleNode new previous node in
     * the linked list
     */
    public function setPrevious($node = null)
    {
        $this->previous = $node;
        return $this->previous;
    }
    // }}}

}
// }}}

?>
PKFa�\~(�htt7pear/Structures/Graph/Manipulator/TopologicalSorter.phpnu�[���<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +-----------------------------------------------------------------------------+
// | Copyright (c) 2003 S�rgio Gon�alves Carvalho                                |
// +-----------------------------------------------------------------------------+
// | This file is part of Structures_Graph.                                      |
// |                                                                             |
// | Structures_Graph is free software; you can redistribute it and/or modify    |
// | it under the terms of the GNU Lesser General Public License as published by |
// | the Free Software Foundation; either version 2.1 of the License, or         |
// | (at your option) any later version.                                         |
// |                                                                             |
// | Structures_Graph 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 Lesser General Public License for more details.                         |
// |                                                                             |
// | You should have received a copy of the GNU Lesser General Public License    |
// | along with Structures_Graph; if not, write to the Free Software             |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                    |
// | 02111-1307 USA                                                              |
// +-----------------------------------------------------------------------------+
// | Author: S�rgio Carvalho <sergio.carvalho@portugalmail.com>                  |
// +-----------------------------------------------------------------------------+
//
/**
 * This file contains the definition of the Structures_Graph_Manipulator_TopologicalSorter class.
 * 
 * @package Structures_Graph
 */

require_once 'PEAR.php';
require_once 'Structures/Graph.php';
require_once 'Structures/Graph/Node.php';
require_once 'Structures/Graph/Manipulator/AcyclicTest.php';

/**
 * The Structures_Graph_Manipulator_TopologicalSorter is a manipulator 
 * which is able to return the set of nodes in a graph, sorted by topological 
 * order.
 *
 * A graph may only be sorted topologically iff it's a DAG. You can test it
 * with the Structures_Graph_Manipulator_AcyclicTest.
 * 
 * @author    S�rgio Carvalho <sergio.carvalho@portugalmail.com> 
 * @copyright (c) 2004 by S�rgio Carvalho
 * @see       Structures_Graph_Manipulator_AcyclicTest
 * @package   Structures_Graph
 */
class Structures_Graph_Manipulator_TopologicalSorter
{
    /**
     * This is a variant of Structures_Graph::inDegree which does 
     * not count nodes marked as visited.
     *
     * @param object $node Node to check
     *
     * @return integer Number of non-visited nodes that link to this one
     */
    protected static function _nonVisitedInDegree(&$node)
    {
        $result = 0;
        $graphNodes =& $node->_graph->getNodes();
        foreach (array_keys($graphNodes) as $key) {
            if ((!$graphNodes[$key]->getMetadata('topological-sort-visited'))
                && $graphNodes[$key]->connectsTo($node)
            ) {
                $result++;
            }
        }
        return $result;
        
    }

    /**
     * Sort implementation
     *
     * @param object $graph Graph to sort
     *
     * @return void
     */
    protected static function _sort(&$graph)
    {
        // Mark every node as not visited
        $nodes =& $graph->getNodes();
        $nodeKeys = array_keys($nodes);
        $refGenerator = array();
        foreach ($nodeKeys as $key) {
            $refGenerator[] = false;
            $nodes[$key]->setMetadata(
                'topological-sort-visited',
                $refGenerator[sizeof($refGenerator) - 1]
            );
        }

        // Iteratively peel off leaf nodes
        $topologicalLevel = 0;
        do {
            // Find out which nodes are leafs (excluding visited nodes)
            $leafNodes = array();
            foreach ($nodeKeys as $key) {
                if ((!$nodes[$key]->getMetadata('topological-sort-visited'))
                    && static::_nonVisitedInDegree($nodes[$key]) == 0
                ) {
                    $leafNodes[] =& $nodes[$key];
                }
            }
            // Mark leafs as visited
            $refGenerator[] = $topologicalLevel;
            for ($i = sizeof($leafNodes) - 1; $i>=0; $i--) {
                $visited =& $leafNodes[$i]->getMetadata('topological-sort-visited');
                $visited = true;
                $leafNodes[$i]->setMetadata('topological-sort-visited', $visited);
                $leafNodes[$i]->setMetadata(
                    'topological-sort-level',
                    $refGenerator[sizeof($refGenerator) - 1]
                );
            }
            $topologicalLevel++;
        } while (sizeof($leafNodes) > 0);

        // Cleanup visited marks
        foreach ($nodeKeys as $key) {
            $nodes[$key]->unsetMetadata('topological-sort-visited');
        }
    }

    /**
     * Sort returns the graph's nodes, sorted by topological order. 
     * 
     * The result is an array with as many entries as topological levels.
     * Each entry in this array is an array of nodes within
     * the given topological level.
     *
     * @param object $graph Graph to sort
     *
     * @return array The graph's nodes, sorted by topological order.
     */
    public static function sort(&$graph)
    {
        // We only sort graphs
        if (!is_a($graph, 'Structures_Graph')) {
            return Pear::raiseError(
                'Structures_Graph_Manipulator_TopologicalSorter::sort received'
                . ' an object that is not a Structures_Graph',
                STRUCTURES_GRAPH_ERROR_GENERIC
            );
        }
        if (!Structures_Graph_Manipulator_AcyclicTest::isAcyclic($graph)) {
            return Pear::raiseError(
                'Structures_Graph_Manipulator_TopologicalSorter::sort'
                . ' received an graph that has cycles',
                STRUCTURES_GRAPH_ERROR_GENERIC
            );
        }

        Structures_Graph_Manipulator_TopologicalSorter::_sort($graph);
        $result = array();

        // Fill out result array
        $nodes =& $graph->getNodes();
        $nodeKeys = array_keys($nodes);
        foreach ($nodeKeys as $key) {
            if (!array_key_exists($nodes[$key]->getMetadata('topological-sort-level'), $result)) {
                $result[$nodes[$key]->getMetadata('topological-sort-level')]
                    = array();
            }
            $result[$nodes[$key]->getMetadata('topological-sort-level')][]
                =& $nodes[$key];
            $nodes[$key]->unsetMetadata('topological-sort-level');
        }

        return $result;
    }
}
?>
PKGa�\9����1pear/Structures/Graph/Manipulator/AcyclicTest.phpnu�[���<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +-----------------------------------------------------------------------------+
// | Copyright (c) 2003 S�rgio Gon�alves Carvalho                                |
// +-----------------------------------------------------------------------------+
// | This file is part of Structures_Graph.                                      |
// |                                                                             |
// | Structures_Graph is free software; you can redistribute it and/or modify    |
// | it under the terms of the GNU Lesser General Public License as published by |
// | the Free Software Foundation; either version 2.1 of the License, or         |
// | (at your option) any later version.                                         |
// |                                                                             |
// | Structures_Graph 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 Lesser General Public License for more details.                         |
// |                                                                             |
// | You should have received a copy of the GNU Lesser General Public License    |
// | along with Structures_Graph; if not, write to the Free Software             |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                    |
// | 02111-1307 USA                                                              |
// +-----------------------------------------------------------------------------+
// | Author: S�rgio Carvalho <sergio.carvalho@portugalmail.com>                  |
// +-----------------------------------------------------------------------------+
//
/**
 * This file contains the definition of the Structures_Graph_Manipulator_AcyclicTest graph manipulator.
 * 
 * @see Structures_Graph_Manipulator_AcyclicTest
 * @package Structures_Graph
 */

/* dependencies {{{ */
/** */
require_once 'PEAR.php';
/** */
require_once 'Structures/Graph.php';
/** */
require_once 'Structures/Graph/Node.php';
/* }}} */

/* class Structures_Graph_Manipulator_AcyclicTest {{{ */
/**
 * The Structures_Graph_Manipulator_AcyclicTest is a graph manipulator
 * which tests whether a graph contains a cycle. 
 * 
 * The definition of an acyclic graph used in this manipulator is that of a 
 * DAG. The graph must be directed, or else it is considered cyclic, even when 
 * there are no arcs.
 *
 * @author		S�rgio Carvalho <sergio.carvalho@portugalmail.com> 
 * @copyright	(c) 2004 by S�rgio Carvalho
 * @package Structures_Graph
 */
class Structures_Graph_Manipulator_AcyclicTest {
    /* _nonVisitedInDegree {{{ */
    /**
    *
    * This is a variant of Structures_Graph::inDegree which does 
    * not count nodes marked as visited.
    *
    * @return	integer	 Number of non-visited nodes that link to this one
    */
    protected static function _nonVisitedInDegree(&$node) {
        $result = 0;
        $graphNodes =& $node->_graph->getNodes();
        foreach (array_keys($graphNodes) as $key) {
            if ((!$graphNodes[$key]->getMetadata('acyclic-test-visited')) && $graphNodes[$key]->connectsTo($node)) $result++;
        }
        return $result;
        
    }
    /* }}} */

    /* _isAcyclic {{{ */
    /**
     * Check if the graph is acyclic
     */
    protected static function _isAcyclic(&$graph) {
        // Mark every node as not visited
        $nodes =& $graph->getNodes();
        $nodeKeys = array_keys($nodes);
        $refGenerator = array();
        foreach($nodeKeys as $key) {
            $refGenerator[] = false;
            $nodes[$key]->setMetadata('acyclic-test-visited', $refGenerator[sizeof($refGenerator) - 1]);
        }

        // Iteratively peel off leaf nodes
        do {
            // Find out which nodes are leafs (excluding visited nodes)
            $leafNodes = array();
            foreach($nodeKeys as $key) {
                if ((!$nodes[$key]->getMetadata('acyclic-test-visited')) && Structures_Graph_Manipulator_AcyclicTest::_nonVisitedInDegree($nodes[$key]) == 0) {
                    $leafNodes[] =& $nodes[$key];
                }
            }
            // Mark leafs as visited
            for ($i=sizeof($leafNodes) - 1; $i>=0; $i--) {
                $visited =& $leafNodes[$i]->getMetadata('acyclic-test-visited');
                $visited = true;
                $leafNodes[$i]->setMetadata('acyclic-test-visited', $visited);
            }
        } while (sizeof($leafNodes) > 0);

        // If graph is a DAG, there should be no non-visited nodes. Let's try to prove otherwise
        $result = true;
        foreach($nodeKeys as $key) if (!$nodes[$key]->getMetadata('acyclic-test-visited')) $result = false;
        
        // Cleanup visited marks
        foreach($nodeKeys as $key) $nodes[$key]->unsetMetadata('acyclic-test-visited');

        return $result;
    }
    /* }}} */

    /* isAcyclic {{{ */
    /**
    *
    * isAcyclic returns true if a graph contains no cycles, false otherwise.
    *
    * @return	boolean	 true iff graph is acyclic
    */
    public static function isAcyclic(&$graph) {
        // We only test graphs
        if (!is_a($graph, 'Structures_Graph')) return Pear::raiseError('Structures_Graph_Manipulator_AcyclicTest::isAcyclic received an object that is not a Structures_Graph', STRUCTURES_GRAPH_ERROR_GENERIC);
        if (!$graph->isDirected()) return false; // Only directed graphs may be acyclic

        return Structures_Graph_Manipulator_AcyclicTest::_isAcyclic($graph);
    }
    /* }}} */
}
/* }}} */
?>
PKGa�\�C� + +pear/Structures/Graph/Node.phpnu�[���<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +-----------------------------------------------------------------------------+
// | Copyright (c) 2003 S�rgio Gon�alves Carvalho                                |
// +-----------------------------------------------------------------------------+
// | This file is part of Structures_Graph.                                      |
// |                                                                             |
// | Structures_Graph is free software; you can redistribute it and/or modify    |
// | it under the terms of the GNU Lesser General Public License as published by |
// | the Free Software Foundation; either version 2.1 of the License, or         |
// | (at your option) any later version.                                         |
// |                                                                             |
// | Structures_Graph 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 Lesser General Public License for more details.                         |
// |                                                                             |
// | You should have received a copy of the GNU Lesser General Public License    |
// | along with Structures_Graph; if not, write to the Free Software             |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                    |
// | 02111-1307 USA                                                              |
// +-----------------------------------------------------------------------------+
// | Author: S�rgio Carvalho <sergio.carvalho@portugalmail.com>                  |
// +-----------------------------------------------------------------------------+
//
/**
 * This file contains the definition of the Structures_Graph_Node class
 * 
 * @see Structures_Graph_Node
 * @package Structures_Graph
 */

/* dependencies {{{ */
/** */
require_once 'PEAR.php';
/** */
require_once 'Structures/Graph.php';
/* }}} */

/* class Structures_Graph_Node {{{ */
/**
 * The Structures_Graph_Node class represents a Node that can be member of a 
 * graph node set.
 *
 * A graph node can contain data. Under this API, the node contains default data, 
 * and key index data. It behaves, thus, both as a regular data node, and as a 
 * dictionary (or associative array) node.
 * 
 * Regular data is accessed via getData and setData. Key indexed data is accessed
 * via getMetadata and setMetadata.
 *
 * @author		S�rgio Carvalho <sergio.carvalho@portugalmail.com> 
 * @copyright	(c) 2004 by S�rgio Carvalho
 * @package Structures_Graph
 */
/* }}} */
class Structures_Graph_Node {
    /* fields {{{ */
    /** 
     * @access private 
     */
    var $_data = null;
    /** @access private */
    var $_metadata = array();
    /** @access private */
    var $_arcs = array();
    /** @access private */
    var $_graph = null;
    /* }}} */

    /* Constructor {{{ */
    /**
    *
    * Constructor
    *
    * @access	public
    */
    function __construct() {
    }
    /* }}} */

    /* getGraph {{{ */
    /**
    *
    * Node graph getter
    *
    * @return	Structures_Graph	Graph where node is stored
    * @access	public
    */
    function &getGraph() {
        return $this->_graph;
    }
    /* }}} */

    /* setGraph {{{ */
    /**
    *
    * Node graph setter. This method should not be called directly. Use Graph::addNode instead.
    *
    * @param    Structures_Graph   Set the graph for this node. 
    * @see      Structures_Graph::addNode()
    * @access	public
    */
    function setGraph(&$graph) {
        $this->_graph =& $graph;
    }
    /* }}} */

    /* getData {{{ */
    /**
    *
    * Node data getter.
    * 
    * Each graph node can contain a reference to one variable. This is the getter for that reference.
    *
    * @return	mixed	Data stored in node
    * @access	public
    */
    function &getData() {
        return $this->_data;
    }
    /* }}} */

    /* setData {{{ */
    /**
    *
    * Node data setter
    *
    * Each graph node can contain a reference to one variable. This is the setter for that reference.
    *
    * @return	mixed	Data to store in node
    * @access	public
    */
    function setData(&$data) {
        $this->_data =& $data;
    }
    /* }}} */

    /* metadataKeyExists {{{ */
    /**
    *
    * Test for existence of metadata under a given key.
    *
    * Each graph node can contain multiple 'metadata' entries, each stored under a different key, as in an 
    * associative array or in a dictionary. This method tests whether a given metadata key exists for this node.
    *
    * @param    string    Key to test
    * @return	boolean	 
    * @access	public
    */
    function metadataKeyExists($key) {
        return array_key_exists($key, $this->_metadata);
    }
    /* }}} */

    /* getMetadata {{{ */
    /**
    *
    * Node metadata getter
    *
    * Each graph node can contain multiple 'metadata' entries, each stored under a different key, as in an 
    * associative array or in a dictionary. This method gets the data under the given key. If the key does
    * not exist, an error will be thrown, so testing using metadataKeyExists might be needed.
    *
    * @param    string  Key
    * @param    boolean nullIfNonexistent (defaults to false).
    * @return	mixed	Metadata Data stored in node under given key
    * @see      metadataKeyExists
    * @access	public
    */
    function &getMetadata($key, $nullIfNonexistent = false) {
        if (array_key_exists($key, $this->_metadata)) {
            return $this->_metadata[$key];
        } else {
            if ($nullIfNonexistent) {
                $a = null;
                return $a;
            } else {
                $a = Pear::raiseError('Structures_Graph_Node::getMetadata: Requested key does not exist', STRUCTURES_GRAPH_ERROR_GENERIC);
                return $a;
            }
        }
    }
    /* }}} */

    /* unsetMetadata {{{ */
    /**
    *
    * Delete metadata by key
    *
    * Each graph node can contain multiple 'metadata' entries, each stored under a different key, as in an 
    * associative array or in a dictionary. This method removes any data that might be stored under the provided key.
    * If the key does not exist, no error is thrown, so it is safe using this method without testing for key existence.
    *
    * @param    string  Key
    * @access	public
    */
    function unsetMetadata($key) {
        if (array_key_exists($key, $this->_metadata)) unset($this->_metadata[$key]);
    }
    /* }}} */

    /* setMetadata {{{ */
    /**
    *
    * Node metadata setter
    *
    * Each graph node can contain multiple 'metadata' entries, each stored under a different key, as in an 
    * associative array or in a dictionary. This method stores data under the given key. If the key already exists,
    * previously stored data is discarded.
    *
    * @param    string  Key
    * @param    mixed   Data 
    * @access	public
    */
    function setMetadata($key, &$data) {
        $this->_metadata[$key] =& $data;
    }
    /* }}} */

    /* _connectTo {{{ */
    /** @access private */
    function _connectTo(&$destinationNode) {
        $this->_arcs[] =& $destinationNode;
    }
    /* }}} */

    /* connectTo {{{ */
    /**
    *
    * Connect this node to another one.
    * 
    * If the graph is not directed, the reverse arc, connecting $destinationNode to $this is also created.
    *
    * @param    Structures_Graph_Node Node to connect to
    * @access	public
    */
    function connectTo(&$destinationNode) {
        // We only connect to nodes
        if (!is_a($destinationNode, 'Structures_Graph_Node')) return Pear::raiseError('Structures_Graph_Node::connectTo received an object that is not a Structures_Graph_Node', STRUCTURES_GRAPH_ERROR_GENERIC);
        // Nodes must already be in graphs to be connected
        if ($this->_graph == null) return Pear::raiseError('Structures_Graph_Node::connectTo Tried to connect a node that is not in a graph', STRUCTURES_GRAPH_ERROR_GENERIC);
        if ($destinationNode->getGraph() == null) return Pear::raiseError('Structures_Graph_Node::connectTo Tried to connect to a node that is not in a graph', STRUCTURES_GRAPH_ERROR_GENERIC);
        // Connect here
        $this->_connectTo($destinationNode);
        // If graph is undirected, connect back
        if (!$this->_graph->isDirected()) {
            $destinationNode->_connectTo($this);
        }
    }
    /* }}} */

    /* getNeighbours {{{ */
    /**
    *
    * Return nodes connected to this one.
    * 
    * @return   array   Array of nodes
    * @access	public
    */
    function getNeighbours() {
        return $this->_arcs;
    }
    /* }}} */

    /* connectsTo {{{ */
    /**
    *
    * Test wether this node has an arc to the target node
    *
    * @return	boolean   True if the two nodes are connected
    * @access	public
    */
    function connectsTo(&$target) {
        if (version_compare(PHP_VERSION, '5.0.0') >= 0) {
            return in_array($target, $this->getNeighbours(), true);
        }

        $copy = $target;
        $arcKeys = array_keys($this->_arcs);
        foreach($arcKeys as $key) {
            /* ZE1 chokes on this expression:
                if ($target === $arc) return true;
              so, we'll use more convoluted stuff
            */
            $arc =& $this->_arcs[$key];
            $target = true;
            if ($arc === true) {
                $target = false;
                if ($arc === false) {
                    $target = $copy;
                    return true;
                }
            }
        }
        $target = $copy;
        return false;
    }
    /* }}} */

    /* inDegree {{{ */
    /**
    *
    * Calculate the in degree of the node.
    * 
    * The indegree for a node is the number of arcs entering the node. For non directed graphs, 
    * the indegree is equal to the outdegree.
    *
    * @return	integer	 In degree of the node
    * @access	public
    */
    function inDegree() {
        if ($this->_graph == null) return 0;
        if (!$this->_graph->isDirected()) return $this->outDegree();
        $result = 0;
        $graphNodes =& $this->_graph->getNodes();
        foreach (array_keys($graphNodes) as $key) {
            if ($graphNodes[$key]->connectsTo($this)) $result++;
        }
        return $result;
        
    }
    /* }}} */

    /* outDegree {{{ */
    /**
    *
    * Calculate the out degree of the node.
    *
    * The outdegree for a node is the number of arcs exiting the node. For non directed graphs,
    * the outdegree is always equal to the indegree.
    * 
    * @return	integer	 Out degree of the node
    * @access	public
    */
    function outDegree() {
        if ($this->_graph == null) return 0;
        return sizeof($this->_arcs);
    }
    /* }}} */
}
?>
PKHa�\Uyv�pear/Structures/Graph.phpnu�[���<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +-----------------------------------------------------------------------------+
// | Copyright (c) 2003 S�rgio Gon�alves Carvalho                                |
// +-----------------------------------------------------------------------------+
// | This file is part of Structures_Graph.                                      |
// |                                                                             |
// | Structures_Graph is free software; you can redistribute it and/or modify    |
// | it under the terms of the GNU Lesser General Public License as published by |
// | the Free Software Foundation; either version 2.1 of the License, or         |
// | (at your option) any later version.                                         |
// |                                                                             |
// | Structures_Graph 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 Lesser General Public License for more details.                         |
// |                                                                             |
// | You should have received a copy of the GNU Lesser General Public License    |
// | along with Structures_Graph; if not, write to the Free Software             |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                    |
// | 02111-1307 USA                                                              |
// +-----------------------------------------------------------------------------+
// | Author: S�rgio Carvalho <sergio.carvalho@portugalmail.com>                  |
// +-----------------------------------------------------------------------------+
//
/**
 * The Graph.php file contains the definition of the Structures_Graph class 
 *
 * @package Structures_Graph
 */

/* dependencies {{{ */
require_once 'PEAR.php';
require_once 'Structures/Graph/Node.php';
/* }}} */

define('STRUCTURES_GRAPH_ERROR_GENERIC', 100);

/* class Structures_Graph {{{ */
/**
 * The Structures_Graph class represents a graph data structure. 
 *
 * A Graph is a data structure composed by a set of nodes, connected by arcs.
 * Graphs may either be directed or undirected. In a directed graph, arcs are 
 * directional, and can be traveled only one way. In an undirected graph, arcs
 * are bidirectional, and can be traveled both ways.
 *
 * @author    S�rgio Carvalho <sergio.carvalho@portugalmail.com> 
 * @copyright (c) 2004 by S�rgio Carvalho
 * @package   Structures_Graph
 */
/* }}} */
class Structures_Graph
{
    /**
     * List of node objects in this graph
     * @access private
     */
    var $_nodes = array();

    /**
     * If the graph is directed or not
     * @access private
     */
    var $_directed = false;


    /**
     * Constructor
     *
     * @param boolean $directed Set to true if the graph is directed.
     *                          Set to false if it is not directed.
     */
    public function __construct($directed = true)
    {
        $this->_directed = $directed;
    }

    /**
     * Old constructor (PHP4-style; kept for BC with extending classes)
     *
     * @param boolean $directed Set to true if the graph is directed.
     *                          Set to false if it is not directed.
     *
     * @return void
     */
    public function Structures_Graph($directed = true)
    {
        $this->__construct($directed);
    }

    /**
     * Return true if a graph is directed
     *
     * @return boolean true if the graph is directed
     */
    public function isDirected()
    {
        return (boolean) $this->_directed;
    }

    /**
     * Add a Node to the Graph
     *
     * @param Structures_Graph_Node $newNode The node to be added.
     *
     * @return void
     */
    public function addNode(&$newNode)
    {
        // We only add nodes
        if (!is_a($newNode, 'Structures_Graph_Node')) {
            return Pear::raiseError(
                'Structures_Graph::addNode received an object that is not'
                . ' a Structures_Graph_Node',
                STRUCTURES_GRAPH_ERROR_GENERIC
            );
        }

        //Graphs are node *sets*, so duplicates are forbidden.
        // We allow nodes that are exactly equal, but disallow equal references.
        foreach ($this->_nodes as $key => $node) {
            /*
             ZE1 equality operators choke on the recursive cycle introduced
             by the _graph field in the Node object.
             So, we'll check references the hard way
             (change $this->_nodes[$key] and check if the change reflects in
             $node)
            */
            $savedData = $this->_nodes[$key];
            $referenceIsEqualFlag = false;
            $this->_nodes[$key] = true;
            if ($node === true) {
                $this->_nodes[$key] = false;
                if ($node === false) {
                    $referenceIsEqualFlag = true;
                }
            }
            $this->_nodes[$key] = $savedData;
            if ($referenceIsEqualFlag) {
                return Pear::raiseError(
                    'Structures_Graph::addNode received an object that is'
                    . ' a duplicate for this dataset',
                    STRUCTURES_GRAPH_ERROR_GENERIC
                );
            }
        }
        $this->_nodes[] =& $newNode;
        $newNode->setGraph($this);
    }

    /**
     * Remove a Node from the Graph
     *
     * @param Structures_Graph_Node $node The node to be removed from the graph
     *
     * @return void
     * @todo   This is unimplemented
     */
    public function removeNode(&$node)
    {
    }

    /**
     * Return the node set, in no particular order.
     * For ordered node sets, use a Graph Manipulator insted.
     *
     * @return array The set of nodes in this graph
     * @see    Structures_Graph_Manipulator_TopologicalSorter
     */
    public function &getNodes()
    {
        return $this->_nodes;
    }
}
?>
PKHa�\f� S	S	!pear/ezc/Archive/structs/file.phpnu�[���<?php
/**
 * File contains the ezcArchiveFileStructure class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveFileStructure class represents a data structure which contains file information.
 *
 * This class is used as an structure in order to prevent using an hash (or array).
 * {@link ezcArchiveEntry} encapsulates this class and has convenient methods to retrieve the information.
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveFileStructure extends ezcBaseStruct
{
    /**
     * The file path.
     *
     * @var string
     */
    public $path;

    /**
     * The permissions of the entry.
     *
     * @var int
     */
    public $mode;

    /**
     * The user ID.
     *
     * @var int
     */
    public $uid;

    /**
     * The group ID.
     *
     * @var int
     */
    public $gid;

    /**
     * The user name (only for some supported formats).
     *
     * @var string
     */
    public $userName = null;

    /**
     * The group name (only for some supported formats).
     *
     * @var string
     */
    public $groupName = null;

    /**
     * Last modification time timestamp.
     *
     * @var int
     */
    public $mtime;

    /**
     * Last access time timestamp.
     *
     * @var int
     */
    public $atime = false;

    /**
     * Specifies the type of the entry.
     *
     * @var int  Possible values: {@link ezcArchiveEntry::IS_LINK}, {@link ezcArchiveEntry::IS_SYMBOLIC_LINK},
     *           {@link ezcArchiveEntry::IS_CHARACTER_DEVICE}, {@link ezcArchiveEntry::IS_BLOCK_DEVICE},
     *           {@link ezcArchiveEntry::IS_DIRECTORY}, or {@link ezcArchiveEntry::IS_FIFO}.
     */
    public $type;

    /**
     * The link target.
     *
     * This value is only valid when the {@link $type} indicates an actual link.
     *
     * @var string
     */
    public $link;

    /**
     * The file size in bytes.
     *
     * $var int
     */
    public $size;

    /**
     * Inode number of the file.
     *
     * $var int
     */
    public $ino;

    /**
     * Major device number.
     *
     * $var int
     */
    public $major;

    /**
     * Minor device number.
     *
     * $var int
     */
    public $minor;
}
?>
PKIa�\K���`c`c+pear/ezc/Archive/zip/headers/local_file.phpnu�[���<?php
/**
 * File containing the ezcArchiveLocalFileHeader class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveLocalFileHeader class represents the Zip local header.
 *
 * ezcArchiveLocalFileHeader can read the header from an ezcArchiveCharacterFile or ezcArchiveEntry.
 *
 * The values from the headers are directly accessible via the class properties, and allows
 * reading and writing to specific header values.
 *
 * The entire header can be appended to an ezcArchiveCharacterFile again or written to an ezcArchiveFileStructure.
 * Information may get lost, though.
 *
 * The overall .ZIP file format[1] :
 *
 * <pre>
 *   [local file header 1]
 *   [file data 1]
 *   [data descriptor 1]
 *   .
 *   .
 *   [local file header n]
 *   [file data n]
 *   [data descriptor n]
 *   [central directory]
 *   [end of central directory record]
 * </pre>
 *
 * The Local File Header has the following structure:
 *
 * <pre>
 * + ---+--------+------------+-------------------+-------------------------------+
 * | ID | Offset | Field size | Property          |  Description                  |
 * +----+--------+------------+-------------------+-------------------------------+
 * |    |  0     | 4          | -                 | Local file header signature   |
 * |    |  4     | 2          | version           | Version needed to extract     |
 * |    |  6     | 2          | bitFlag           | General purpose bit flag      |
 * |    |  8     | 2          | compressionMethod | Compression method            |
 * |    |  10    | 2          | lastModFileTime   | Last modification file time   |
 * |    |  12    | 2          | lastModFileDate   | Last modification file date   |
 * |    |  14    | 4          | crc               | crc-32                        |
 * |    |  18    | 4          | compressedSize    | compressed size               |
 * |    |  22    | 4          | uncompressedSize  | uncompressed size             |
 * | X  |  26    | 2          | fileNameLength    | file name length              |
 * | Y  |  28    | 2          | extraFieldLength  | extra field length            |
 * |    |  30    | X          | fileName          | file name                     |
 * |    |  30+X  | Y          | -                 | extra field                   |
 * +----+--------+------------+-------------------+-------------------------------+
 * </pre>
 *
 * The columns of the table are:
 * - ID gives a label to a specific field or row in the table.
 * - Offset describes the start position of a header field.
 * - Field size describes the size of the field in bytes.
 * - Property is the name of the property that will be set by the header field.
 * - Description explains what this field describes.
 *
 * The local file signature cannot be changed and is set in the constant {@link self::magic}.
 *
 * The extra fields that are implemented are:
 * - Info-Zip Unix field (old).
 * - Info-Zip Unix field (new).
 * - Universal timestamp.
 *
 * Info-Zip Unix field (old):
 * <pre>
 * +--------+------------+------------------------------------+
 * | Offset | Field size |  Description                       |
 * +--------+------------+------------------------------------+
 * |  0     | 2          | Header ID (0x5855)                 |
 * |  2     | 2          | Data size: Full size = 12          |
 * |  4     | 4          | Last Access Time                   |
 * |  8     | 4          | Last Modification Time             |
 * |  12    | 2          | User ID  (Optional if size < 12 )  |
 * |  14    | 2          | Group ID (Optional if size < 12 )  |
 * +--------+------------+------------------------------------+
 * </pre>
 *
 * Info-Zip Unix field (new):
 * <pre>
 * +--------+------------+--------------------+
 * | Offset | Field size |  Description       |
 * +--------+------------+--------------------+
 * |  0     | 2          | Header ID (0x7855) |
 * |  2     | 2          | Data size.         |
 * |  4     | 2          | User ID            |
 * |  6     | 2          | Group ID           |
 * +--------+------------+--------------------+
 * </pre>
 *
 * Universal timestamp:
 * <pre>
 * +--------+------------+-------------------------+
 * | Offset | Field size |  Description            |
 * +--------+------------+-------------------------+
 * |  0     | 2          | Header ID (0x5455)      |
 * |  2     | 2          | Data size.              |
 * |  4     | 1          | Info bits (flags)       |
 * |  5     | 4          | Last Modification Time  |
 * |  9     | 4          | Last Access Time        |
 * |  13    | 4          | Creation Time           |
 * +--------+------------+-------------------------+
 * </pre>
 *
 * Info bits indicate which fields are set:
 * - bit 0, if set then the modification time is present.
 * - bit 1, if set then the access time is present.
 * - bit 2, if set then the creation time is present.
 *
 * These info bits are ONLY valid for the local file header. The
 * central header has the same Universal Timestamp, but reflects
 * the bits from the local file header!
 *
 *
 * See PKWare documentation and InfoZip extra field documentation for more information.
 *
 *
 * [1] PKWARE .ZIP file format specification:
 * <pre>
 * File:    APPNOTE.TXT - .ZIP File Format Specification
 * Version: 4.5
 * Revised: 11/01/2001
 * Copyright (c) 1989 - 2001 PKWARE Inc., All Rights Reserved.
 * </pre>
 *
 * [2] InfoZip distribution contains the file: proginfo/extra.fld
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveLocalFileHeader
{
    /**
     * Defines the signature of this header.
     */
    const magic = 0x04034b50;

    /**
     * Extra field definition.
     *
     * UNIX Extra Field ID ("UX").
     */
    const EF_IZUNIX  = 0x5855;

    /**
     * Extra field definition.
     *
     * Info-ZIP's new Unix( "Ux" ).
     */
    const EF_IZUNIX2 = 0x7855;

    /**
     * Extra field definition.
     *
     * Universal timestamp( "UT" ).
     */
    const EF_TIME    = 0x5455;

    /**
     * Minimal UT field contains Flags byte
     */
    const EB_UT_MINLEN = 1;

    /**
     * Byte offset of Flags field
     */
    const EB_UT_FLAGS  = 0;

    /**
     * Byte offset of 1st time value
     */
    const EB_UT_TIME1  = 1;

    /**
     * mtime present
     */
    const EB_UT_FL_MTIME = 1;

    /**
     * atime present
     */
    const EB_UT_FL_ATIME = 2;

    /**
     * ctime present
     */
    const EB_UT_FL_CTIME = 4;

    /**
     * UT field length.
     */
    const EB_UT_FL_LEN = 4;

    /**
     * Minimal "UX" field contains atime, mtime
     */
    const EB_UX_MINLEN = 8;

    /**
     * Offset of atime in "UX" extra field data
     */
    const EB_UX_ATIME  = 0;

    /**
     * Offset of mtime in "UX" extra field data
     */
    const EB_UX_MTIME  = 4;

    /**
     * Full "UX" field ( atime, mtime, uid, gid )
     */
    const EB_UX_FULLSIZE = 12;

    /**
     * Byte offset of UID in "UX" field data
     */
    const EB_UX_UID = 8;

    /**
     * Byte offset of GID in "UX" field data
     */
    const EB_UX_GID = 10;

    /**
     * Minimal Ux field contains UID/GID
     */
    const EB_UX2_MINLEN = 4;

    /**
     * Byte offset of UID in "Ux" field data
     */
    const EB_UX2_UID = 0;

    /**
     * Byte offset of GID in "Ux" field data
     */
    const EB_UX2_GID = 2;

    /**
     * Byte offset of valid in "Ux" field data
     */
    const EB_UX2_VALID =  256;

    /**
     * Holds the properties of this class.
     *
     * @var array(string=>mixed)
     */
    protected $properties = array();

    /**
     * Holds the user ID and is false if not set.
     *
     * @var int
     */
    protected $userId = false;

    /**
     * Holds the group ID and is false if not set.
     *
     * @var int
     */
    protected $groupId = false;

    /**
     * Holds the modification time as a timestamp and is false if not set.
     *
     * @var int
     */
    protected $mtime = false;

    /**
     * Holds the modification time as a timestamp and is false if not set.
     *
     * @var int
     */
    protected $atime = false;

    /**
     * Holds the creation time as a timestamp and is false if not set.
     *
     * @var int
     */
    protected $ctime = false;

    /**
     * Creates and initializes a new header.
     *
     * If the ezcArchiveCharacterFile $file is null then the header will be empty.
     * When an ezcArchiveCharacterFile is given, the file position should be directly after the
     * signature of the header. This header will be read from the file and initialized in this class.
     *
     * @param ezcArchiveCharacterFile $file
     */
    public function __construct( ezcArchiveCharacterFile $file = null, ezcArchiveCentralDirectoryHeader $centralHeader = null )
    {
        // Offset | Field size |  Description
        // ----------------------------------
        //  0     | 4          | Local file header signature ( 0x04034b50 ).
        //  4     | 2          | Version needed to extract.
        //  6     | 2          | General purpose bit flag.
        //  8     | 2          | Compression method.
        //  10    | 2          | Last mod file time.
        //  12    | 2          | Last mod file date.
        //  14    | 4          | Crc-32.
        //  18    | 4          | Compressed size.
        //  22    | 4          | Uncompressed size.
        //  26    | 2          | File name length.
        //  28    | 2          | Extra field length.

        if ( !is_null( $file ) )
        {
            $this->properties = unpack (
                "vversion/".
                "vbitFlag/".
                "vcompressionMethod/".
                "vlastModFileTime/".
                "vlastModFileDate/".
                "Vcrc/".
                "VcompressedSize/".
                "VuncompressedSize/".
                "vfileNameLength/".
                "vextraFieldLength",
                $file->read( 26 ) );

            $this->properties["fileName"] = $file->read( $this->properties["fileNameLength"] );
            $extraField = $file->read( $this->properties["extraFieldLength"] );

            // Append extra field information.
            $this->setExtraFieldData( $extraField );

            // Fix the local file headers from the central header, in case crc,
            // compressed size and original size are not set. This is needed
            // for Open Office documents at least.
            if ( $centralHeader && $this->properties['compressedSize'] === 0 && $this->properties['uncompressedSize'] === 0 )
            {
                $this->properties['compressedSize'] = $centralHeader->compressedSize;
                $this->properties['uncompressedSize'] = $centralHeader->uncompressedSize;
                $this->properties['crc'] = $centralHeader->crc;
            }

            // Skip the file.
            $file->seek( $this->compressedSize, SEEK_CUR );
        }
    }

    /**
     * Serializes this header and appends it to the given ezcArchiveCharacterFile $archiveFile.
     *
     * @param ezcArchiveCharacterFile $archiveFile
     * @return void
     */
    public function writeEncodedHeader( $archiveFile )
    {
        $this->properties["extraFieldLength" ] = 21; // FIXME.

        $enc = pack( "VvvvvvVVVvv",
            self::magic,
            $this->properties["version"],
            $this->properties["bitFlag"],
            $this->properties["compressionMethod"],
            $this->properties["lastModFileTime"],
            $this->properties["lastModFileDate"],
            $this->properties["crc"],
            $this->properties["compressedSize"],
            $this->properties["uncompressedSize"],
            $this->properties["fileNameLength"],
            $this->properties["extraFieldLength"] );

        $time = pack( "vvcVV", self::EF_TIME, 9, 3, $this->mtime, $this->atime ); // set accesss time to modification time.
        $unix2 = pack( "vvvv", self::EF_IZUNIX2, 4, $this->userId, $this->groupId );

        $archiveFile->write( $enc . $this->fileName . $time . $unix2 );
    }

    /**
     * Sets the property $name to $value.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist
     * @throws ezcBasePropertyReadOnlyException if the property is read-only
     * @param string $name
     * @param mixed $value
     * @return void
     * @ignore
     */
    public function __set( $name, $value )
    {
        switch ( $name )
        {
             case "version":
             case "bitFlag":
             case "compressionMethod":
             case "crc":
             case "compressedSize":
             case "uncompressedSize":
             case "extraFieldLength":
                $this->properties[$name] = $value;
                break;

             case "lastModFileTime":
             case "lastModFileDate":
             case "fileNameLength":
                throw new ezcBasePropertyReadOnlyException( $name );

             default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }

    /**
     * Returns the value of the property $name.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @return mixed
     * @ignore
     */
    public function __get( $name )
    {
        switch ( $name )
        {
            case "version":
            case "bitFlag":
            case "compressionMethod":
            case "lastModFileTime":
            case "lastModFileDate":
            case "crc":
            case "compressedSize":
            case "uncompressedSize":
            case "extraFieldLength":
            case "fileNameLength":
            case "fileName":
                return $this->properties[ $name ];

            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }

    /**
     * Returns the modification timestamp.
     *
     * The timestamp from the extra fields is returned if it is available.
     * If it cannot be found, the ZIP time is converted to a timestamp.
     *
     * @return int
     */
    public function getModificationTime()
    {
        return ( $this->mtime ? $this->mtime : self::dosFormatToTimestamp( array( $this->lastModFileTime, $this->lastModFileDate ) ) );
    }

    /**
     * Sets the modification time to the int $timestamp.
     *
     * The properties lastModFileTime and lastModFileDate properties will be set.
     *
     * @param int $timestamp
     * @return void
     */
    public function setModificationTime( $timestamp )
    {
        $this->mtime = $timestamp;
        list( $this->properties["lastModFileTime"], $this->properties["lastModFileDate"] ) = self::timestampToDosFormat( $timestamp );
    }

    /**
     * Returns an two element array with, respectively, the dos time and dos date, which are converted from
     * the given int $timestamp.
     *
     * The DOS time and date format are described here: {@link http://www.vsft.com/hal/dostime.htm}.
     *
     * @see http://www.vsft.com/hal/dostime.htm
     *
     * @param int $timestamp
     * @return array(int)
     */
    public static function timestampToDosFormat( $timestamp )
    {
        $time = getdate( $timestamp );

        $dosTime = ( $time["hours"]  & 31 ); // Hours. Bit: 11 .. 15
        $dosTime <<= 6;
        $dosTime |= ( $time["minutes"] & 63 ); // Minutes.
        $dosTime <<= 5;
        $dosTime |= ( ( int ) ( $time["seconds"] / 2 ) & 31 );  // seconds.

        $dosDate = ( $time["year"] - 1980 ) & 127;  // Year.
        $dosDate <<= 4;
        $dosDate |= ( $time["mon"] & 15 ); // month.
        $dosDate <<= 5;
        $dosDate |= ( $time["mday"] & 31 ); // day.

        return array( $dosTime, $dosDate );
    }

    /**
     * Returns the timestamp which is converted from an array with, respectively, the dos time and dos date.
     *
     * Expects an array with two elements.
     *
     * The DOS time and date format are described here: {@link http://www.vsft.com/hal/dostime.htm}.
     *
     * @see http://www.vsft.com/hal/dostime.htm
     *
     * @param array(int) $array
     * @return int
     */
    public static function dosFormatToTimestamp( array $array )
    {
        $dosTime = $array[0];

        $seconds = ( ($dosTime ) & 31 ) * 2 ;  // Bit  0 .. 4
        $minutes = ( $dosTime >>  5 ) & 63 ;          // Bit  5 .. 10
        $hours = ( $dosTime >> 11 ) & 31;               // Bit 11 .. 15

        $dosDate = $array[1];
        $day =  ( ( $dosDate ) & 31 );          // Bit  0 .. 4
        $month = ( $dosDate >>  5 ) & 15 ;            // Bit  5 .. 8
        $year = ( ( $dosDate >> 9 ) & 127 ) + 1980;     // Bit  9 .. 15

        return mktime( $hours, $minutes, $seconds, $month, $day, $year );
    }

    /**
     * Sets the filename in the header.
     *
     * The properties fileName and file length are changed.
     *
     * @param string $name
     */
    public function setFileName( $name )
    {
        $this->properties["fileName"] = $name;
        $this->properties["fileNameLength"] = strlen( $name );
    }

    /**
     * Sets the compression.
     *
     * @param int $compressionMethod
     * @param int $compressedSize
     * @return void
     */
    public function setCompression( $compressionMethod, $compressedSize )
    {
        // Fixme, for now only decompressed.
        $this->compressionMethod = $compressionMethod;
        $this->compressedSize = $compressedSize;

    }

    /**
     * Updates the given ezcArchiveFileStructure $struct with the values from this header.
     *
     * If bool $override is false, this method will not overwrite the values from the ezcArchiveFileStructure $struct.
     * The values that can be set in the archiveFileStructure are: path, gid, uid, mtime, and size.
     *
     * @param ezcArchiveFileStructure &$struct
     * @param bool $override
     * @return void
     */
    public function setArchiveFileStructure( ezcArchiveFileStructure &$struct, $override = false )
    {
        if ( !isset( $struct->path ) || $override )
        {
            $struct->path = $this->fileName;
        }

        if ( !isset( $struct->size ) || $override )
        {
            $struct->size = $this->uncompressedSize;
        }

        if ( $this->groupId && ( !isset( $struct->size )  || $override ) )
        {
            $struct->gid   = $this->groupId;
        }

        if ( $this->userId &&  ( !isset( $struct->size )  || $override ) )
        {
            $struct->uid   = $this->userId;
        }

        if ( $this->mtime &&   ( !isset( $struct->mtime ) || $override ) )
        {
            $struct->mtime = $this->mtime;
        }

        if ( $this->atime &&   ( !isset( $struct->atime ) || $override ) )
        {
            $struct->atime = $this->atime;
        }
    }

    /**
     * Sets this header with the values from the ezcArchiveEntry $entry.
     *
     * The values that are possible to set from the ezcArchiveEntry $entry are set in this header.
     *
     * @param ezcArchiveEntry $entry
     * @return void
     */
    public function setHeaderFromArchiveEntry( ezcArchiveEntry $entry )
    {
        $this->version = 10; // FIXME
        $this->bitFlag = 0; // FIXME

        $this->atime = $entry->getAccessTime();

        $this->groupId = $entry->getGroupId();
        $this->userId = $entry->getUserId();

        $this->setModificationTime( $entry->getModificationTime() );

        if ( $entry->isSymLink() )
        {
            $this->uncompressedSize = strlen( $entry->getLink() );
            $this->crc = ezcArchiveChecksums::getCrc32FromString( $entry->getLink() );
        }
        else
        {
            $this->uncompressedSize = $entry->getSize();
            $this->crc = ezcArchiveChecksums::getCrc32FromFile( $entry->getPath() );
        }

        $this->setFileName( $entry->getPath( false ) );
    }

    /**
     * Returns the total size of this header.
     *
     * @return int
     */
    public function getHeaderSize()
    {
        return 30 + $this->properties["fileNameLength"] + $this->properties["extraFieldLength"];
    }

    /**
     * Decodes and sets the extra header properties from the string $data.
     *
     * @param string $data
     * @return void
     */
    protected function setExtraFieldData( $data )
    {
        $raw = array();

        $offset = 0;
        $dataLength = strlen( $data );

        while ( $offset < $dataLength )
        {
            // Read header.
            $dec = unpack( "vid/vlength", substr( $data, $offset, 4 ) );
            $offset += 4;

            switch ( $dec["id"] )
            {
                case self::EF_IZUNIX2:
                    $raw[ "EF_IZUNIX2" ] = $this->getNewInfoZipExtraField( substr( $data, $offset, $dec["length"] ), $dec["length"] );
                    break;

                case self::EF_IZUNIX:
                    $raw[ "EF_IZUNIX" ] = $this->getOldInfoZipExtraField( substr( $data, $offset, $dec["length"] ), $dec["length"] );
                    break;

                case self::EF_TIME:
                    $raw[ "EF_TIME" ] = $this->getUniversalTimestampField( substr( $data, $offset, $dec["length"] ), $dec["length"] );
                    break;
            }

            $offset += $dec["length"];
        }

        $result = array();

        // The order is important.
        if ( isset( $raw["EF_TIME"]["mtime"] ) )
        {
            $this->mtime = $raw["EF_TIME"]["mtime"];
        }

        if ( isset( $raw["EF_TIME"]["atime"] ) )
        {
            $this->atime = $raw["EF_TIME"]["atime"];
        }

        if ( isset( $raw["EF_TIME"]["ctime"] ) )
        {
            $this->ctime = $raw["EF_TIME"]["ctime"];
        }

        if ( isset( $raw["EF_IZUNIX"]["mtime"] ) )
        {
            $this->mtime = $raw["EF_IZUNIX"]["mtime"];
        }

        if ( isset( $raw["EF_IZUNIX"]["atime"] ) )
        {
            $this->atime = $raw["EF_IZUNIX"]["atime"];
        }

        if ( isset( $raw["EF_IZUNIX"]["gid"] ) )
        {
            $this->groupId = $raw["EF_IZUNIX"]["gid"];
        }

        if ( isset( $raw["EF_IZUNIX"]["uid"] ) )
        {
            $this->userId = $raw["EF_IZUNIX"]["uid"];
        }

        if ( isset( $raw["EF_IZUNIX2"]["gid"] ) )
        {
            $this->groupId = $raw["EF_IZUNIX2"]["gid"];
        }

        if ( isset( $raw["EF_IZUNIX2"]["uid"] ) )
        {
            $this->userId = $raw["EF_IZUNIX2"]["uid"];
        }

        return $result;
    }

    /**
     * Returns an array with the decoded 'new Info-Zip' data.
     *
     * @param string $field
     * @param int $length
     * @return array(string)
     */
    protected function getNewInfoZipExtraField( $field, $length )
    {
        $localOffset = 0;

        if ( $length >= self::EB_UX2_MINLEN )
        {
            return unpack( "vuid/vgid", substr( $field, 0, self::EB_UX2_MINLEN ) );
        }

        return array();
    }

    /**
     * Returns an array with the decoded 'old Info-Zip' data.
     *
     * @param string $field
     * @param int $length
     * @return array(string)
     */
    protected function getOldInfoZipExtraField( $field, $length )
    {
        if ( $length >= self::EB_UX_FULLSIZE )
        {
            return unpack( "Vatime/Vmtime/vuid/vgid", substr( $field, 0, self::EB_UX_FULLSIZE ) );
        }
        else if ( $length >= self::EB_UX_MINLEN )
        {
            return unpack( "Vatime/Vmtime", substr( $field, 0, self::EB_UX_MINLEN ) );
        }

        return array();
    }

    /**
     * Returns an array with the decoded 'universal timestamp' data.
     *
     * @param string $field
     * @param int $length
     * @return array(string)
     */
    protected function getUniversalTimestampField( $field, $length )
    {
        $localOffset = 0;
        $result = array();

        if ( $length >= self::EB_UT_MINLEN )
        {
            $f = unpack( "cflags", substr( $field, $localOffset, 1 ) );
            $length--; // Flag takes one byte.

            if ( ( $f["flags"] & self::EB_UT_FL_MTIME ) && $length >= 4 )
            {
                $result = array_merge( $result, unpack( "Vmtime", substr( $field, $localOffset + self::EB_UT_MINLEN + ( self::EB_UT_FL_LEN * 0 ), self::EB_UT_FL_LEN ) ) );
                $length -= 4;
            }

            if ( $f["flags"] & self::EB_UT_FL_ATIME  && $length >= 4 )
            {
                $result = array_merge( $result, unpack( "Vatime", substr( $field, $localOffset + self::EB_UT_MINLEN + ( self::EB_UT_FL_LEN * 1 ), self::EB_UT_FL_LEN ) ) );
                $length -= 4;
            }

            if ( $f["flags"] & self::EB_UT_FL_CTIME && $length >= 4 )
            {
                $result = array_merge( $result, unpack( "Vctime", substr( $field, $localOffset + self::EB_UT_MINLEN + ( self::EB_UT_FL_LEN * 2 ), self::EB_UT_FL_LEN ) ) );
                $length -= 4;
            }
        }

        return $result;
    }

    /**
     * Returns true if the given string $string matches with the current signature.
     *
     * @param string $string
     * @return bool
     */
    public static function isSignature( $string )
    {
        return $string == pack( "V", self::magic );
    }
}
?>
PKIa�\�
�,�#�#6pear/ezc/Archive/zip/headers/central_directory_end.phpnu�[���<?php
/**
 * File containing the ezcArchiveCentralDirectoryHeader class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveCentralDirectoryEndHeader class represents the Zip central directory end header.
 *
 * ezcArchiveCentralDirectoryEndHeader can read the header from an ezcArchiveCharacterFile.
 *
 * The values from the headers are directly accessible via the class properties, and allows
 * reading and writing to specific header values.
 *
 * The entire header can be appended to an ezcArchiveCharacterFile again.
 *
 * The central directory end header is the last header of the ZIP archive. Some algorithms
 * search back to this header in order to find the other headers. The variable comment length
 * makes it tricky.
 *
 * The Central Directory End Header has the following structure:
 *
 * <pre>
 * + ---+---------+------------+------------------------------------+-------------------------------------------------------------------------------+
 * | ID | Offset  | Field size | Property                           |  Description                                                                  |
 * +----+---------+------------+------------------------------------+-------------------------------------------------------------------------------+
 * |    |  0      | 4          | -                                  | Central directory header signature                                            |
 * |    |  4      | 2          | diskNumber                         | nr of this disk                                                               |
 * |    |  6      | 2          | centralDirectoryDisk               | number of the disk with the start of the central directory                    |
 * |    |  8      | 2          | totalCentralDirectoryEntriesOnDisk | total number of entries in the central directory on this disk                 |
 * |    |  10     | 2          | totalCentralDirectoryEntries       | total number of entries in the central directory                              |
 * |    |  12     | 4          | centralDirectorySize               | size of the central directory                                                 |
 * |    |  16     | 4          | centralDirectoryStart              | offset of start of central directory with respect to the starting disk number |
 * | X: |  20     | 2          | commentLength                      | .ZIP file comment length                                                      |
 * |    |  22     | X          | comment                            | .ZIP file comment                                                             |
 * +----+---------+------------+------------------------------------+-------------------------------------------------------------------------------+
 * </pre>
 *
 *
 * The columns of the table are:
 * - ID gives a label to a specific field or row in the table.
 * - Offset describes the start position of a header field.
 * - Field size describes the size of the field in bytes.
 * - Property is the name of the property that will be set by the header field.
 * - Description explains what this field describes.
 *
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveCentralDirectoryEndHeader
{
    /**
     * Defines the signature of this header.
     */
    const magic = 0x06054b50;

    /**
     * Holds the properties of this class.
     *
     * @var array(string=>mixed)
     */
    private $properties = array();

    /**
     * Creates and initializes a new header.
     *
     * If the ezcArchiveCharacterFile $file is null then the header will be empty.
     * When an ezcArchiveCharacterFile is given, the file position should be directly after the
     * signature of the header. This header will be read from the file and initialized in this class.
     *
     * @param ezcArchiveCharacterFile $file
     */
    public function __construct( ezcArchiveCharacterFile $file = null )
    {
        if ( !is_null( $file ) )
        {
            $this->properties = unpack (
                "vdiskNumber/".
                "vcentralDirectoryDisk/".
                "vtotalCentralDirectoryEntriesOnDisk/".
                "vtotalCentralDirectoryEntries/".
                "VcentralDirectorySize/".
                "VcentralDirectoryStart/".
                "vcommentLength",
                $file->read( 18 ) );

                $this->properties["comment"] = $file->read( $this->properties["commentLength"] );
        }
        else
        {
            $this->properties["diskNumber"] = 0;
            $this->properties["centralDirectoryDisk"] = 0;
            $this->properties["totalCentralDirectoryEntries"] = 0;
            $this->properties["totalCentralDirectoryEntriesOnDisk"] = 0;
            $this->properties["totalCentralDirectorySize"] = 0;
            $this->properties["totalCentralDirectoryStart"] = 0;

            $this->setComment( "" );
        }
    }

    /**
     * Sets the property $name to $value.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @throws ezcBasePropertyReadOnlyException if the property is read-only
     * @param string $name
     * @param mixed $value
     * @return void
     * @ignore
     */
    public function __set( $name, $value )
    {
        switch ( $name )
        {
            case "diskNumber":
            case "centralDirectoryDisk":
            case "totalCentralDirectoryEntriesOnDisk":
                throw new ezcBasePropertyReadOnlyException( $name );

            case "totalCentralDirectoryEntries":
                $this->setTotalDirectoryEntries( $value );
                break;

            case "centralDirectorySize":
            case "centralDirectoryStart":
                $this->properties[$name] = $value;
                break;

            case "commentLength":
                throw new ezcBasePropertyReadOnlyException( $name );

            case "comment":
                $this->setComment( $value );
                break;

            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }

    /**
     * Returns the value of the property $name.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @return mixed
     * @ignore
     */
    public function __get( $name )
    {
        switch ( $name )
        {
            case "diskNumber":
            case "centralDirectoryDisk":
            case "totalCentralDirectoryEntriesOnDisk":
            case "totalCentralDirectoryEntries":
            case "centralDirectorySize":
            case "centralDirectoryStart":
            case "commentLength":
            case "comment":
                return $this->properties[$name];

            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }

    /**
     * Sets the comment and comment length in the header from the string $comment.
     *
     * @param string $comment
     * @return void
     */
    public function setComment( $comment )
    {
        $this->properties["comment"] = $comment;
        $this->properties["commentLength"] = strlen( $comment );
    }

    /**
     * Sets the total directory entries to the int $numberOfEntries.
     *
     * The properties: diskNumber and centralDirectory will be set to 0.
     * The properties: totalCentralDirectoryEntriesOnDisk and totalCentralDirectoryEntries are set to the $numberOfEntries.
     *
     * @param int $numberOfEntries
     * @return void
     */
    public function setTotalDirectoryEntries( $numberOfEntries )
    {
        $this->properties["diskNumber"] = 0;
        $this->properties["centralDirectoryDisk"] = 0;
        $this->properties["totalCentralDirectoryEntriesOnDisk"] = $numberOfEntries;
        $this->properties["totalCentralDirectoryEntries"] = $numberOfEntries;
    }

    /**
     * Serializes this header and appends it to the given ezcArchiveCharacterFile $archiveFile.
     *
     * @param ezcArchiveCharacterFile $archiveFile
     * @return void
     */
    public function writeEncodedHeader( $archiveFile )
    {
        $enc = pack ( "VvvvvVVv",
            self::magic,
            $this->properties["diskNumber"],
            $this->properties["centralDirectoryDisk"],
            $this->properties["totalCentralDirectoryEntriesOnDisk"],
            $this->properties["totalCentralDirectoryEntries"],
            $this->properties["centralDirectorySize"],
            $this->properties["centralDirectoryStart"],
            $this->properties["commentLength"] );

        $archiveFile->write( $enc . $this->properties["comment"] );
    }

    /**
     * Returns true if the given string $string matches with the current signature.
     *
     * @param string $string
     * @return void
     */
    public static function isSignature( $string )
    {
        return $string == pack( "V", self::magic );
    }
}
?>
PKIa�\�\�^G^G2pear/ezc/Archive/zip/headers/central_directory.phpnu�[���<?php
/**
 * File containing the ezcArchiveCentralDirectoryHeader class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveCentralDirectoryHeader class represents the Zip central directory header.
 *
 * ezcArchiveCentralDirectoryHeader can read the header from an ezcArchiveCharacterFile or ezcArchiveEntry.
 *
 * The values from the headers are directly accessible via the class properties, and allows
 * reading and writing to specific header values.
 *
 * The entire header can be appended to an ezcArchiveCharacterFile again or written to an ezcArchiveFileStructure.
 * Information may get lost, though.
 *
 * The central directory format[1]:
 *
 * <pre>
 *  [file header 1]
 *  .
 *  .
 *  .
 *  [file header n]
 *  [digital signature] <-- Optional, TODO: check if implemented.
 * </pre>
 *
 * The Central Directory Header has the following structure:
 *
 * <pre>
 * + ---+---------+------------+------------------------+------------------------------------+
 * | ID | Offset  | Field size | Property               |  Description                       |
 * +----+---------+------------+------------------------+------------------------------------+
 * |    |  0      | 4          | -                      | Central directory header signature |
 * |    |  4      | 2          | versionMadeBy          | Version made by                    |
 * |    |  6      | 2          | versionNeededToExtract | Version needed to extract          |
 * |    |  8      | 2          | bitFlag                | General purpose bit flag           |
 * |    |  10     | 2          | compressionMethod      | Compression method                 |
 * |    |  12     | 2          | lastModFileTime        | Last modification file time        |
 * |    |  14     | 2          | lastModFileDate        | Last modification file date        |
 * |    |  16     | 4          | crc                    | crc-32                             |
 * |    |  20     | 4          | compressedSize         | compressed size                    |
 * |    |  24     | 4          | uncompressedSize       | uncompressed size                  |
 * | X: |  26     | 2          | fileNameLength         | file name length                   |
 * | Y: |  28     | 2          | extraFieldLength       | extra field length                 |
 * | Z: |  30     | 2          | fileCommentLength      | file comment length                |
 * |    |  32     | 2          | diskNumberStart        | disk number start                  |
 * |    |  34     | 2          | internalFileAttributes | internal file attributes           |
 * |    |  38     | 4          | externalFileAttributes | external file attributes           |
 * |    |  42     | 4          | relativeHeaderOffset   | relative offset of local header    |
 * |    |  46     | X          | fileName               | file name                          |
 * |    |  46+X   | Y          | -                      | extra field                        |
 * |    |  46+X+Y | Z          | comment                | file comment                       |
 * +----+---------+------------+------------------------+------------------------------------+
 * </pre>
 *
 * The columns of the table are:
 * - ID gives a label to a specific field or row in the table.
 * - Offset describes the start position of a header field.
 * - Field size describes the size of the field in bytes.
 * - Property is the name of the property that will be set by the header field.
 * - Description explains what this field describes.
 *
 * The central directory signature cannot be changed and is set in the constant {@link self::magic}.
 *
 * The extra fields that are implemented and references to extra documentation can be found in
 * the {@link ezcArchivelocalFileHeader}.
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveCentralDirectoryHeader extends ezcArchiveLocalFileHeader
{
    /**
     * Defines the signature of this header.
     */
    const magic = 0x02014b50;

    /**
     * Creates and initializes a new header.
     *
     * If the ezcArchiveCharacterFile $file is null then the header will be empty.
     * When an ezcArchiveCharacterFile is given, the file position should be directly after the
     * signature of the header. This header will be read from the file and initialized in this class.
     *
     * @param ezcArchiveCharacterFile $file
     */
    public function __construct( ezcArchiveCharacterFile $file = null )
    {
        if ( !is_null( $file ) )
        {
            $this->properties = unpack (
                "vversionMadeBy/".
                "vversionNeededToExtract/".
                "vbitFlag/".
                "vcompressionMethod/".
                "vlastModFileTime/".
                "vlastModFileDate/".
                "Vcrc/".
                "VcompressedSize/".
                "VuncompressedSize/".
                "vfileNameLength/".
                "vextraFieldLength/".
                "vfileCommentLength/".
                "vdiskNumberStart/".
                "vinternalFileAttributes/".
                "VexternalFileAttributes/".
                "VrelativeHeaderOffset",
                $file->read( 42 ) );

                $this->properties["fileName"] = $file->read( $this->properties["fileNameLength"] );
                $extraField = $file->read( $this->properties["extraFieldLength"] ); // FIXME, extra fields.
                $this->properties["comment"] = $file->read( $this->properties["fileCommentLength"] );

                // Append extra field information.
                $this->setExtraFieldData( $extraField );
        }
        else
        {
            // Some default values:
            $this->properties["versionMadeBy"] = 791;
            $this->properties["versionNeededToExtract"] = 10;
            $this->properties["diskNumberStart"] = 0;
            $this->setComment( "" );
        }
    }

    /**
     * Sets the property $name to $value.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist
     * @throws ezcBasePropertyReadOnlyException if the property is read-only
     * @param string $name
     * @param mixed $value
     * @return void
     * @ignore
     */
    public function __set( $name, $value )
    {
        switch ( $name )
        {
            case "versionMadeBy":
            case "versionNeededToExtract":
            case "bitFlag":
            case "compressionMethod":
            case "lastModFileTime":
            case "lastModFileDate":
            case "crc":
            case "compressedSize":
            case "uncompressedSize":
            case "diskNumberStart":
            case "internalFileAttributes":
            case "externalFileAttributes":
            case "fileName":
            case "relativeHeaderOffset":
                $this->properties[$name] = $value;
                break;

            case "comment":
                $this->setComment( $value );
                break;

            case "fileNameLength":
            case "extraFieldLength":
            case "fileCommentLength":
                throw new ezcBasePropertyReadOnlyException( $name );

            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }

    /**
     * Returns the value of the property $name.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @return mixed
     * @ignore
     */
    public function __get( $name )
    {
        switch ( $name )
        {
            case "versionMadeBy":
            case "versionNeededToExtract":
            case "bitFlag":
            case "compressionMethod":
            case "lastModFileTime":
            case "lastModFileDate":
            case "crc":
            case "compressedSize":
            case "uncompressedSize":
            case "diskNumberStart":
            case "internalFileAttributes":
            case "externalFileAttributes":
            case "relativeHeaderOffset":
            case "fileNameLength":
            case "extraFieldLength":
            case "fileCommentLength":
            case "fileName":
            case "comment":
                return $this->properties[$name];

            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }

    /**
     * Sets the comment to string $comment and updates the comment length.
     *
     * @param string $comment
     * @return void
     */
    public function setComment( $comment )
    {
        $this->properties["comment"] = $comment;
        $this->properties["fileCommentLength"] = strlen( $comment );
    }

    /**
     * Sets the type to int $type.
     *
     * The type is a constant from the {@link ezcArchiveEntry}. For example:
     * ezcArchiveEntry::IS_FIFO.
     * The property externalFileAttributes will be changed to reflect the $type.
     *
     * @throws ezcArchiveException
     *         if $type is unknown
     * @param int $type
     * @return void
     */
    public function setType( $type )
    {
        $ext = 0;
        switch ( $type )
        {
            case ezcArchiveEntry::IS_FIFO:
                $ext = ezcArchiveStatMode::S_IFIFO;
                break;

            case ezcArchiveEntry::IS_CHARACTER_DEVICE:
                $ext = ezcArchiveStatMode::S_IFCHR;
                break;

            case ezcArchiveEntry::IS_DIRECTORY:
                $ext = ezcArchiveStatMode::S_IFDIR;
                break;

            case ezcArchiveEntry::IS_BLOCK_DEVICE:
                $ext = ezcArchiveStatMode::S_IFBLK;
                break;

            case ezcArchiveEntry::IS_FILE:
                $ext = ezcArchiveStatMode::S_IFREG;
                break;

            case ezcArchiveEntry::IS_SYMBOLIC_LINK:
                $ext = ezcArchiveStatMode::S_IFLNK;
                break;

            default:
                throw new ezcArchiveException( "Unknown type" );
        }

        if ( !isset( $this->properties["externalFileAttributes"] ) )
        {
            $this->properties["externalFileAttributes"] = 0;
        }

        $ext <<= 16;
        $clear = ( $this->properties["externalFileAttributes"] & ezcArchiveStatMode::S_IFMT << 16 );

        $this->properties["externalFileAttributes"] ^= $clear; // Remove the bits from S_IFMT, because we XOR with self.
        $this->properties["externalFileAttributes"] |= $ext; // And add the ext bits.
    }

    /**
     * Returns the type of the file.
     *
     * The type is read and translated from the externalFileAttributes property.
     *
     * @return int  An ezcArchiveEntry constant.
     */
    public function getType()
    {
        $extAttrib = ( $this->properties["externalFileAttributes"] >> 16 );

        switch ( $extAttrib & ezcArchiveStatMode::S_IFMT )
        {
            case ezcArchiveStatMode::S_IFIFO:
                return ezcArchiveEntry::IS_FIFO;

            case ezcArchiveStatMode::S_IFCHR:
                return ezcArchiveEntry::IS_CHARACTER_DEVICE;

            case ezcArchiveStatMode::S_IFDIR:
                return ezcArchiveEntry::IS_DIRECTORY;

            case ezcArchiveStatMode::S_IFBLK:
                return ezcArchiveEntry::IS_BLOCK_DEVICE;

            case ezcArchiveStatMode::S_IFREG:
                return ezcArchiveEntry::IS_FILE;

            case ezcArchiveStatMode::S_IFLNK:
                return ezcArchiveEntry::IS_SYMBOLIC_LINK;

            default:
                if ( substr( $this->properties["fileName"], -1 ) == "/" )
                {
                    return ezcArchiveEntry::IS_DIRECTORY;
                }
                else
                {
                    return ezcArchiveEntry::IS_FILE;
                }
        }
    }

    /**
     * Returns the permissions (as a decimal number) of the file.
     *
     * The type is read and translated from the externalFileAttributes property.
     *
     * @return int
     */
    public function getPermissions()
    {
        $extAttrib = ( $this->properties["externalFileAttributes"] >> 16 );

        return decoct( $extAttrib & ezcArchiveStatMode::S_PERM_MASK );
    }

    /**
     * Sets the permissions (as a decimal number) of the file to int $permissions.
     *
     * The $permissions expects an decimal number.
     *
     * The externalFileAttributes property will be changed.
     *
     * @param int $permissions
     */
    public function setPermissions( $permissions )
    {
        $perm = octdec( $permissions );
        $perm <<= 16;

        if ( !isset( $this->properties["externalFileAttributes"] ) )
        {
            $this->properties["externalFileAttributes"] = 0;
        }

        $clear = ( $this->properties["externalFileAttributes"] & ezcArchiveStatMode::S_PERM_MASK << 16 );
        $this->properties["externalFileAttributes"] ^= $clear; // Remove the bits from S_PERM_MASK, because we XOR with self.
        $this->properties["externalFileAttributes"] |= $perm; // And add the perm bits.
    }

    /**
     * Updates the given ezcArchiveFileStructure $struct with the values from this header.
     *
     * If bool $override is false, this method will not overwrite the values from the ezcArchiveFileStructure $struct.
     * The values that can be set in the archiveFileStructure are: path, mode, type, size.
     *
     * @param ezcArchiveFileStructure &$struct
     * @param bool $override
     * @return void
     */
    public function setArchiveFileStructure( ezcArchiveFileStructure &$struct, $override = false )
    {
        if ( !isset( $struct->path ) || $override )
        {
            $struct->path = $this->fileName;
        }

        if ( !isset( $struct->mode ) || $override )
        {
            $struct->mode = ( $this->getPermissions() == 0 ? false : $this->getPermissions() );
        }

        if ( !isset( $struct->type ) || $override )
        {
            $struct->type = $this->getType();
        }

        if ( !isset( $struct->size ) || $override )
        {
            $struct->size = $this->uncompressedSize;
        }
    }

    /**
     * Returns the total size of this header.
     *
     * @return int
     */
    public function getHeaderSize()
    {
        return 46 + $this->properties["fileNameLength"] + $this->properties["extraFieldLength"] + $this->properties["fileCommentLength"];
    }

    /**
     * Sets this header with the values from the {@link ezcArchiveLocalFileHeader}.
     *
     * The properties that are set: versionNeededToExtract, bitFlag, compressionMethod,
     * lastModFileTime, lastModFileDate, crc, compressedSize, uncompressedSize, fileNameLength,
     * and fileName.
     *
     * @param ezcArchiveLocalFileHeader $localFileHeader
     * @return void
     */
    public function setHeaderFromLocalFileHeader( ezcArchiveLocalFileHeader $localFileHeader )
    {
        $this->properties["versionNeededToExtract"] = $localFileHeader->version;
        $this->properties["bitFlag"] = $localFileHeader->bitFlag;
        $this->properties["compressionMethod"] = $localFileHeader->compressionMethod;
        $this->properties["lastModFileTime"] = $localFileHeader->lastModFileTime;
        $this->properties["lastModFileDate"] = $localFileHeader->lastModFileDate;
        $this->properties["crc"] = $localFileHeader->crc;
        $this->properties["compressedSize"] = $localFileHeader->compressedSize;
        $this->properties["uncompressedSize"] = $localFileHeader->uncompressedSize;
        $this->properties["fileNameLength"] = $localFileHeader->fileNameLength;
        $this->properties["fileName"] = $localFileHeader->fileName;
    }

    /**
     * Sets this header with the values from the ezcArchiveEntry $entry.
     *
     * The values that are possible to set from the ezcArchiveEntry $entry are set in this header.
     * The properties that change are: internalFileAttributes, relativeHeaderOffset, type, and mtime.
     *
     * @param ezcArchiveEntry $entry
     * @return void
     */
    public function setHeaderFromArchiveEntry( ezcArchiveEntry $entry )
    {
        $this->properties["internalFileAttributes"] = 0;

        $this->setType( $entry->getType() );
        $this->setPermissions( $entry->getPermissions() );

        $this->properties["relativeHeaderOffset"] = 0;
        $this->properties["mtime"] = $entry->getModificationTime();
    }

    /**
     * Serializes this header and appends it to the given ezcArchiveCharacterFile $archiveFile.
     *
     * @param ezcArchiveCharacterFile $archiveFile
     * @return void
     */
    public function writeEncodedHeader( $archiveFile )
    {
        $this->properties["extraFieldLength" ] = 13; // 9 + 4.

        $enc = pack( "VvvvvvvVVVvvvvvVV",
            self::magic,           // V magic number
            $this->versionMadeBy,  // v
            $this->versionNeededToExtract,  // v
            $this->bitFlag, // v
            $this->compressionMethod, // v
            $this->lastModFileTime, // v
            $this->lastModFileDate, // v
            $this->crc, // V
            $this->compressedSize, // V
            $this->uncompressedSize, // V
            $this->fileNameLength, // v
            $this->extraFieldLength, // v extra data.
            $this->fileCommentLength , // v Comment
            $this->diskNumberStart ,  // v disknumber start
            $this->internalFileAttributes,  // v Internal attribute
            $this->externalFileAttributes,  // V external attributes
            $this->relativeHeaderOffset       // V relative header offset?
         );

         $time = pack( "vvcV", self::EF_TIME, 5, 1, $this->mtime ); // fixme atime?
         $unix2 = pack( "vv", self::EF_IZUNIX2, 0 ); // Add empty unix2 stamp.

         $archiveFile->write( $enc . $this->fileName . $time . $unix2 . $this->comment );
    }

    /**
     * Returns true if the given string $string matches with the current signature.
     *
     * @param string $string
     * @return bool
     */
    public static function isSignature( $string )
    {
        return $string == pack( "V", self::magic );
    }
}
?>
PKJa�\XA�V�Vpear/ezc/Archive/zip/zip.phpnu�[���<?php
/**
 * File containing the ezcArchiveZip class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * The ezcArchiveZip class implements the Zip archive format.
 *
 * ezcArchiveZip is a subclass from {@link ezcArchive} that provides the common interface.
 * Zip algorithm specific methods are implemented in this class.
 *
 * ezcArchiveZip tries on creation to read the entire archive. Every {@link ezcArchiveEntry}
 * will be appended to the {@link ezcArchive::$entries} array. ({@link ezcArchiveTarV7} archive format
 * reads only an entry when needed the first time.)
 *
 * All the archive entries are read, because we need to find the {@link ezcArchiveCentralDirectoryHeader central directory}
 * that contains extra file information. Some other Zip implementations search back from the end of the archive, but:
 * - Not all of them take the comment section at the end of the archive into account.
 * - The file pointer can only forward, so they seek over the entire archive anyway.
 *
 * The current implementation can handle Non-Zip64 archives. The following extra Zip information can be read:
 * - The Unix Extra field.
 * - The Unix Extra field 2.
 * - The Universal Timestamp field.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveZip extends ezcArchive implements Iterator
{
    /**
     * Stores the byte number where the local file header starts for each entry.
     *
     * @var array(int)
     */
    protected $localHeaderPositions;

    /**
     * Stores the {@link ezcArchiveLocalFileHeader} for each entry.
     *
     * @var array(ezcArchiveLocalFileHeader)
     */
    protected $localHeaders;

    /**
     * Stores the byte number where the central directory header starts
     * (fileNumber is the index of the array).
     *
     * @var array(int)
     */
    protected $centralHeaderPositions;

    /**
     * Stores the {@link ezcArchiveCentralDirectoryHeader} for each entry.
     *
     * @var array(ezcArchiveCentralDirectoryHeader)
     */
    protected $centralHeaders;

    /**
     * Stores the {@link ezcArchiveCentralDirectoryEndHeader}.
     *
     * @var ezcArchiveCentralDirectoryEndHeader
     */
    protected $endRecord;

    /**
     * Initializes the Zip archive and reads the entire archive.
     *
     * The constructor opens the archive as a {@link ezcArchiveCharacterFile character file}.
     *
     * @param ezcArchiveCharacterFile $file
     */
    public function __construct( ezcArchiveCharacterFile $file )
    {
        $this->localHeaderPositions = array();
        $this->file = $file;

        $this->fileNumber = 0;
        $this->entriesRead = 0;

        if ( !$this->file->isEmpty() )
        {
            $this->readCentralHeaders();
        }

        $this->completed = true;
    }

    /**
     * Returns the value which specifies a ZIP algorithm.
     *
     * @return int
     */
    public function getAlgorithm()
    {
        return self::ZIP;
    }

    /**
     * Returns true because the ZIP algorithm can write.
     *
     * @see isWritable()
     *
     * @return bool
     */
    public function algorithmCanWrite()
    {
        return true;
    }

    /**
     * Reads the entire archive and creates all the entries.
     *
     * To find the central directory structure we need to read all the headers.
     * Some algorithms search backwards, but these don't expect comments at the end
     * of the archive.
     *
     * The central directory structure gives us extra information about the
     * stored file like: symlinks and permissions.
     *
     * @throws ezcArchiveException
     *         if the comment length is different than 0
     *         or if the signature from the file is invalid
     *         or if the directory central header or size are missing
     * @return void
     */
    protected function readCentralHeaders()
    {
        $this->localHeaders = array();
        $this->centralHeaders = array();

        // read the central end headers

        $this->file->seek( -22, SEEK_END );
        $filesize = $this->file->key() + 22;
        $endRecordPosition = $filesize - 22;

        $sig = $this->file->read( 4 );
        if ( ezcArchiveCentralDirectoryEndHeader::isSignature( $sig ) )
        {
            $this->endRecord = new ezcArchiveCentralDirectoryEndHeader( $this->file );

            if ( $this->endRecord->commentLength != 0 )
            {
                throw new ezcArchiveException( "Comment length invalid." );
            }
        }
        else
        {
            $signatureString = "PK\005\006";

            $startPosition = max( $filesize - ( 5 * 1024 ), 0 );

            // Maybe there is a comment at the end of the archive.
            $this->file->seek( $startPosition );
            $data = $this->file->read( $filesize - $startPosition );

            $pos = strpos( $data, $signatureString );

            if ( $pos === false )
            {
                throw new ezcArchiveException( "Could not find the central-directory header" );
            }

            $endRecordPosition = $startPosition + $pos;

            $this->file->seek( $endRecordPosition );
            $sig = $this->file->read( 4 );

            if ( ezcArchiveCentralDirectoryEndHeader::isSignature( $sig ) )
            {
                $this->endRecord = new ezcArchiveCentralDirectoryEndHeader( $this->file );
            }
            else
            {
                throw new ezcArchiveException( "Zip file corrupt" );
            }

            if ( $this->endRecord->commentLength !=  $filesize - $endRecordPosition - 22 )
            {
                throw new ezcArchiveException( "Comment length invalid." );
            }
        }

        if ( $endRecordPosition - $this->endRecord->centralDirectorySize !== $this->endRecord->centralDirectoryStart )
        {
            throw new ezcArchiveException( "Unable to determine the central directory start." );
        }

        $this->file->seek( $endRecordPosition - $this->endRecord->centralDirectorySize );
        $sig = $this->file->read( 4 );

        $i = 0;
        while ( ezcArchiveCentralDirectoryHeader::isSignature( $sig ) )
        {
            $this->centralHeaderPositions[$i] = $this->file->key() - 4;
            $this->centralHeaders[$i] = new ezcArchiveCentralDirectoryHeader( $this->file );

            $sig = $this->file->read( 4 );

            $this->localHeaderPositions[$i] = $this->centralHeaders[$i]->relativeHeaderOffset;

            $i++;
        }

        // Create the entries and check for symlinks.
        $this->entriesRead = $i;

        for ( $i = 0; $i < $this->entriesRead; $i++ )
        {
            $struct = new ezcArchiveFileStructure();

            // $this->localHeaders[$i]->setArchiveFileStructure( $struct );
            $this->centralHeaders[$i]->setArchiveFileStructure( $struct );


            // Set the symbolic links, 'cause these are written in the file data.
            if ( $this->centralHeaders[$i]->getType() == ezcArchiveEntry::IS_SYMBOLIC_LINK )
            {
                $struct->link = $this->getFileData( $i );
            }
            else
            {
                $struct->link = "";
            }

            $this->entries[$i] = new ezcArchiveEntry( $struct );
        }
    }


    /**
     * Writes the file data from the current entry to the given file.
     *
     * @param string $targetPath  The absolute or relative path of the target file.
     * @return bool
     */
    protected function writeCurrentDataToFile( $targetPath )
    {
        if ( !$this->valid() )
        {
            return false;
        }

        $this->writeFile( $this->key(), $targetPath );

        return true;
    }

    /**
     * Returns the file data of the given fileNumber.
     *
     * This method doesn't handle compression and reads the whole file in memory.
     * This method is used to get the symbolic links, since these are stored in files.
     *
     * For larger or compressed files, use the {@link writeFile()} method.
     *
     * @param int $fileNumber
     * @return string
     */
    public function getFileData( $fileNumber )
    {
        $pos = $this->localHeaderPositions[ $fileNumber ];
        $header = $this->getLocalHeader( $fileNumber );

        $newPos = $pos + $header->getHeaderSize();
        $this->file->seek( $newPos );

        // Read all the data.
        return $this->file->read( $header->compressedSize );
    }

    /**
     * Returns the local header of the specified file number.
     *
     * @throws ezcArchiveException
     *         if the signature from the file is invalid
     * @param int $fileNumber
     */
    public function getLocalHeader( $fileNumber )
    {
        if ( !isset( $this->localHeaders[$fileNumber] ) )
        {
            // Read the local header
            $this->file->seek( $this->localHeaderPositions[$fileNumber] );

            $sig = $this->file->read( 4 );

            if ( !ezcArchiveLocalFileHeader::isSignature( $sig ) )
            {
                throw new ezcArchiveException( "Zip file corrupt?" );
            }

            $this->localHeaders[$fileNumber] = new ezcArchiveLocalFileHeader( $this->file, $this->centralHeaders[$fileNumber] );
        }

        return $this->localHeaders[$fileNumber];
    }

    /**
     * Reads the file data from the archive and writes it the the $writeTo file.
     *
     * The data from the entry with $fileNumber is read from the archive.
     * If the data is compressed or deflated it will be, respectively, decompressed or inflated.
     *
     * @throws ezcArchiveChecksumException if the checksum is invalid from the created file.
     *
     * @param   int     $fileNumber
     * @param   string  $writeTo
     * @return  void
     */
    public function writeFile( $fileNumber,  $writeTo )
    {
        $header = $this->getLocalHeader( $fileNumber );
        $pos = $this->localHeaderPositions[ $fileNumber ] + $header->getHeaderSize();

        // FIXME.. don't write the entire stuff to memory.
        $this->file->seek( $pos );

        /*
        Part: 1
        - Append the stream filter.
        switch ( $header->compressionMethod )
        {
            case 8:  $this->file->appendStreamFilter( "zlib.inflate" ); break;
            case 12: $this->file->appendStreamFilter( "bzip2.decompress" ); break;
        }
        */

        $data = $this->file->read( $header->compressedSize );

        /*
        Part: 2
        - And remove the stream filter.
        - Then we can write the file directly from the archive without copying it entirely to memory.
        - Unfortunately, this method segfaults for me.

        if ( $header->compressionMethod == 8  || $header->compressionMethod == 12 )
        {
            $this->file->removeStreamFilter();
        }
        */

        if ( $data )
        {
            switch ( $header->compressionMethod )
            {
                case 8:
                    $data = gzinflate( $data );
                    break;    // Evil, memory consuming.

                case 12:
                    $data = bzdecompress( $data );
                    break;
            }
        }

        if ( strcmp( sprintf( "%u", crc32( $data ) ), sprintf( "%u", $header->crc & 0xffffffff ) ) == 0 )
        {
            $newFile = new ezcArchiveCharacterFile( $writeTo, true );
            $newFile->write( $data );
            unset( $newFile );
        }
        else
        {
            throw new ezcArchiveChecksumException( $writeTo );
        }
    }

    /**
     * Appends a file to the archive after the current entry.
     *
     * One or multiple files can be added directly after the current file.
     * The remaining entries after the current are removed from the archive!
     *
     * The $files can either be a string or an array of strings. Which, respectively, represents a
     * single file or multiple files.
     *
     * $prefix specifies the begin part of the $files path that should not be included in the archive.
     * The files in the archive are always stored relatively.
     *
     * Example:
     * <code>
     * $tar = ezcArchive( "/tmp/my_archive.tar", ezcArchive::TAR );
     *
     * // Append two files to the end of the archive.
     * $tar->seek( 0, SEEK_END );
     * $tar->appendToCurrent( array( "/home/rb/file1.txt", "/home/rb/file2.txt" ), "/home/rb/" );
     * </code>
     *
     * When multiple files are added to the archive at the same time, thus using an array, does not
     * necessarily produce the same archive as repeatively adding one file to the archive.
     * For example, the Tar archive format, can detect that files hardlink to each other and will store
     * it in a more efficient way.
     *
     * @throws ezcArchiveException            if the archive is closed or read-only
     * @throws ezcBaseFileNotFoundException   if one of the specified files is missing
     * @throws ezcBaseFilePermissionException if the archive is not writable
     *
     * @param string|array(string) $files  Array or a single path to a file.
     * @param string $prefix               First part of the path used in $files.
     * @return bool
     */
    public function appendToCurrent( $files, $prefix )
    {
        if ( !$this->isWritable() )
        {
            throw new ezcBaseFilePermissionException( $this->file->getFileName(), ezcBaseFilePermissionException::WRITE, "Archive is read-only" );
        }

        // Current position valid?
        if ( !$this->isEmpty() && !$this->valid() )
        {
            return false;
        }

        if ( !is_array( $files ) )
        {
            $files = array( $files );
        }

        // Check whether the files are correct.
        foreach ( $files as $file )
        {
            if ( !file_exists( $file ) && !is_link( $file ) )
            {
                throw new ezcBaseFileNotFoundException( $file );
            }
        }

        // Search for all the entries, because otherwise hardlinked files show up as an ordinary file.
        $entries = ezcArchiveEntry::getEntryFromFile( $files, $prefix );

        if ( $this->isEmpty() )
        {
            $this->file->truncate();
            $this->file->rewind();
            $cur = -1;
        }
        else
        {
            // Create the new headers.
            $cur = $this->key(); // Current Header.

            $lh = $this->getLocalHeader( $cur );
            $pos = $this->localHeaderPositions[ $cur ] + $lh->getHeaderSize() + $lh->compressedSize;
            $this->file->truncate( $pos );
            $this->file->seek( $pos );
        }

        foreach ( $entries as $entry )
        {
            $cur++;
           // Set local header position
            $this->localHeaderPositions[$cur ] = $this->file->getPosition();

            // Set local header
            $this->localHeaders[ $cur ] =  new ezcArchiveLocalFileHeader();
            $this->localHeaders[ $cur ]->setHeaderFromArchiveEntry( $entry );

            if ( $entry->isSymLink() )
            {
                $fileData = $entry->getLink();
                $this->localHeaders[ $cur ]->setCompression( 0, $this->localHeaders[$cur]->uncompressedSize ); // Compression is 0, for now.
            }
            else if ( $entry->isDirectory() )
            {
                // Added for issue #13517: Not possible to add directories to an archive on Windows
                $fileData = gzdeflate( '' ); // empty string for directories
                $this->localHeaders[ $cur ]->setCompression( 8, strlen( $fileData ) );
            }
            else
            {
                // FIXME, File in memory, compression level always 8, add constants.
                $fileData = gzdeflate( file_get_contents( $entry->getPath() ) );
                $this->localHeaders[ $cur ]->setCompression( 8, strlen( $fileData)  );
            }

            $this->localHeaders[ $cur ]->writeEncodedHeader( $this->file );

            // Write link or file.
            $this->file->write( $fileData );
            unset( $fileData );

            // Create also the central headers.
            $this->centralHeaders[ $cur ] = new ezcArchiveCentralDirectoryHeader();
            $this->centralHeaders[ $cur ]->setHeaderFromLocalFileHeader( $this->localHeaders[ $cur ] );
            $this->centralHeaders[ $cur ]->setHeaderFromArchiveEntry( $entry );
            $this->centralHeaders[ $cur ]->relativeHeaderOffset = $this->localHeaderPositions[ $cur ];

            // Set the entry.
            $entry->removePrefixFromPath();
            $this->entries[ $cur ] = $entry;
        }

        for ( $i = 0; $i <= $cur; $i++ )
        {
            // Write the headers.
            $this->centralHeaderPositions[ $i ] = $this->file->getPosition();
            $this->centralHeaders[ $i ]->writeEncodedHeader( $this->file );
        }

        // Remove the rest of the localHeaders and centralHeaders.
        for ( $i = ( $cur + 1 ); $i < $this->entriesRead; $i++ )
        {
            unset( $this->localHeaders[ $i ] );
            unset( $this->localHeaderPositions[ $i ] );
            unset( $this->centralHeaders[ $i ] );
            unset( $this->centralHeaderPositions[ $i ] );
        }

        $this->entriesRead = $cur + 1;

        // Write the end record.
        $this->endRecord = new ezcArchiveCentralDirectoryEndHeader();
        $this->endRecord->centralDirectoryStart = $this->centralHeaderPositions[0];
        $this->endRecord->centralDirectorySize = $this->file->getPosition() - $this->centralHeaderPositions[0];

        $this->endRecord->totalCentralDirectoryEntries = $cur + 1;
        $this->endRecord->writeEncodedHeader( $this->file );
    }

    /**
     * Appends a file or directory to the end of the archive. Multiple files or directory can
     * be added to the archive when an array is used as input parameter.
     *
     * @see appendToCurrent()
     *
     * @throws ezcArchiveException  if one of the files cannot be written to the archive.
     *
     * @param string|array(string) $files  Array or a single path to a file.
     * @param string $prefix               First part of the path used in $files.
     *
     * @return bool
     */
    public function append( $files, $prefix )
    {
        if ( !$this->isWritable() )
        {
            throw new ezcArchiveException( "Archive is read-only", ezcArchiveException::ARCHIVE_NOT_WRITABLE );
        }

        $this->seek( 0, SEEK_END );
        $this->appendToCurrent( $files, $prefix );
     }

    /**
     * Truncates the archive to $fileNumber of files.
     *
     * The $fileNumber parameter specifies the amount of files that should remain.
     * If the default value, zero, is used then the entire archive file is cleared.
     *
     * @throws ezcBaseFilePermissionException
     *         if the file is read-only
     *         or if the current algorithm cannot write
     * @param int $fileNumber
     * @return bool
     */
    public function truncate( $fileNumber = 0 )
    {
        if ( !$this->isWritable() )
        {
            throw new ezcBaseFilePermissionException( $this->file->getFileName(), ezcBaseFilePermissionException::WRITE );
        }

        $originalFileNumber = $this->fileNumber;

        // Entirely empty the file.
        if ( $fileNumber == 0 )
        {
            $this->file->truncate();
            $this->entriesRead = 0;

            $this->localHeaders = array();
            $this->localHeaderPositions = array();
            $this->centralHeaders = array();
            $this->centralHeaderPositions = array();
            $this->endRecord = null;
        }
        else
        {
            $this->fileNumber = $fileNumber;
            if ( !$this->valid() )
            {
                return false;
            }

            // Truncate the file.
            $pos = $this->localHeaderPositions[ $fileNumber - 1 ];
            $this->file->truncate( $pos );
            $this->file->seek( $pos );

            for ( $i = 0; $i < $fileNumber; $i++ )
            {
                // Write the headers.
                $this->centralHeaders[$i]->writeEncodedHeader( $this->file );
            }

            // Clean up some headers.
            for ( $i = $fileNumber; $i < $this->entriesRead; $i++ )
            {
                unset( $this->localHeaderPositions[$i] );
                unset( $this->centralHeaderPositions[$i] );
                unset( $this->localHeaders[$i] );
                unset( $this->centralHeaders[$i] );
            }

            $this->entriesRead = $fileNumber;

            $this->setEndRecord();
            $this->endRecord->writeEncodedHeader( $this->file );

            $this->fileNumber = $originalFileNumber;
            return $this->valid();
        }
    }

    /**
     * Returns true if it is possible to write to the archive, otherwise false.
     *
     * This method returns false if the archive is read-only, the algorithm
     * didn't implement any write methods, or both.
     *
     * @see algorithmCanWrite()
     *
     * @throws ezcArchiveException
     *         if the archive is closed
     * @return bool
     */
    public function isWritable()
    {
        if ( $this->file === null )
        {
            throw new ezcArchiveException( "The archive is closed" );
        }

        return ( !$this->file->isReadOnly() && $this->algorithmCanWrite() );
    }

    /**
     * Creates and sets a new {@link ezcArchiveCentralDirectoryEndHeader}.
     *
     * The new {@link ezcArchiveCentralDirectoryEndHeader} is based on the current file position,
     * the centralHeaderPositions, and the number of entries read.
     *
     * @return void
     */
    protected function setEndRecord()
    {
        $this->endRecord = new ezcArchiveCentralDirectoryEndHeader();
        $this->endRecord->centralDirectoryStart = $this->centralHeaderPositions[0];
        $this->endRecord->centralDirectorySize = $this->file->getPosition() - $this->centralHeaderPositions[0];

        $this->endRecord->totalCentralDirectoryEntries = $this->entriesRead;
    }
}
?>
PKJa�\unš�w�wpear/ezc/Archive/archive.phpnu�[���<?php
/**
 * File containing the abstract ezcArchive class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * The ezcArchive class provides the common interface for reading and writing
 * the archive formats Tar and Zip.
 *
 * ezcArchive provides the main API for reading and writing to an archive. The
 * archive itself can be compressed with GZip or BZip2 and will be handled
 * transparently.
 *
 * The {@link open()} method creates a new archive instance. For
 * existing archives, ezcArchive determines the correct archive format by the
 * mime-type and returns an instance of a subclass handling this format.
 * New archives should force a format type via a parameter in the open()
 * method.
 *
 * The instance of an ezcArchive class is also an iterator, which
 * points to the first file in the archive by default. Moving this pointer can
 * be done via the iterator methods: {@link rewind()}, {@link next()},
 * {@link valid()}, {@link key()}, and {@link current()}. This iterator is
 * defined as an object iterator and allows, for example, the {@link
 * http://www.php.net/foreach foreach} statement to iterate through the files.
 *
 * Extra methods that operate on the current iterator are: {@link
 * extractCurrent()} and {@link appendToCurrent()}. Which can be used,
 * respectively, to extract the files and to append a new file to the archive.
 * To append a directory to an archive you need to add a slash '/' at the end
 * of the directory name.
 *
 * The following example will open an existing tar.gz file and will append each
 * file to a zip archive:
 * <code>
 * $tar = ezcArchive::open( "/tmp/archive.tar.gz" );
 * $newZip = ezcArchive::open( "/tmp/new_archive.zip", ezcArchive::ZIP );
 *
 * foreach ( $tar as $entry )
 * {
 *    // $entry contains the information of the current entry in the archive.
 *    $tar->extractCurrent( "/tmp/" );
 *    $newZip->appendToCurrent( $entry->getPath(), "/tmp/" );
 *    $newZip->next();
 * }
 * </code>
 *
 * In order to extract an entire archive at once, use the {@link extract()}
 * method.
 *
 * @package Archive
 * @version 1.4.1
 * @mainclass
 */
abstract class ezcArchive implements Iterator
{
    /**
     * Normal tar archive.
     */
    const TAR        = 0;

    /**
     * Tar version 7 archive.
     */
    const TAR_V7     = 1;

    /**
     * USTAR tar archive.
     */
    const TAR_USTAR  = 2;

    /**
     * PAX tar archive.
     */
    const TAR_PAX    = 3;

    /**
     * GNU tar archive.
     */
    const TAR_GNU    = 4;

    /**
     * ZIP archive.
     */
    const ZIP        = 10;

    /**
     * Gnu ZIP compression format.
     */
    const GZIP       = 20;

    /**
     * BZIP2 compression format.
     */
    const BZIP2      = 30;

    /**
     * The entry or file number to which the iterator points.
     *
     * The first $fileNumber starts with 0.
     *
     * @var int
     */
    protected $fileNumber = 0;

    /**
     * The number of entries currently read from the archive.
     *
     * @var int
     */
    protected $entriesRead = 0;

    /**
     * Is true when the archive is read until the end, otherwise false.
     *
     * @var bool
     */
    protected $completed = false;

    /**
     * Stores the entries read from the archive.
     *
     * The array is not complete when the {@link $completed} variable is set to
     * false.  The array may be over-complete, so the {@link $entriesRead}
     * should be checked if the {@link $completed} variable is set to true.
     *
     * @var array(ezcArchiveEntry)
     */
    protected $entries;

    /**
     * Direct access to the archive file.
     *
     * @var ezcArchiveFile
     */
    protected $file = null;

    /**
     * Holds the options if passed to the open method.
     *
     * @var ezcArchiveOptions
     */
    protected $options;

    /**
     * Use the {@link open()} method to get an instance of this class.
     */
    private function __construct()
    {
    }

    /**
     * Returns a new ezcArchive instance.
     *
     * This method returns a new instance according to the mime-type or
     * the given $forceType.
     *
     * - If $forceType is set to null, this method will try to determine the
     *   archive format via the file data. Therefore the $forceType can only be
     *   null when the archive contains data.
     * - If $forceType is set, it will use the specified algorithm. Even when
     *   the given archive is from another type than specified.
     *
     * @throws ezcArchiveUnknownTypeException if the type of the archive cannot be determined.
     *
     * @param string  $archiveName  Absolute or relative path to the archive.
     * @param int     $forceType    Open the archive with the $forceType
     *        algorithm. Possible values are: {@link ezcArchive::ZIP},
     *        {@link ezcArchive::TAR}, {@link ezcArchive::TAR_V7}, {@link ezcArchive::TAR_USTAR},
     *        {@link ezcArchive::TAR_PAX}, {@link ezcArchive::TAR_GNU}.
     *        TAR will use the TAR_USTAR algorithm by default.
     * @param ezcArchiveOptions $options
     *
     * @return ezcArchive
     */
    public static function open( $archiveName, $forceType = null, ezcArchiveOptions $options = null )
    {
        $options = self::initOptions( $options );

        if ( !ezcArchiveFile::fileExists( $archiveName ) && $forceType === null )
        {
            throw new ezcArchiveUnknownTypeException( $archiveName );
        }

        if ( $forceType !== null )
        {
            return self::createInstance( $archiveName, $forceType, $options );
        }

        $h = ezcArchiveFileType::detect( $archiveName );

        while ( $h == ezcArchive::GZIP || $h == ezcArchive::BZIP2 )
        {
            if ( $h == ezcArchive::GZIP )
            {
                $archiveName = "compress.zlib://$archiveName";
                $h = ezcArchiveFileType::detect( $archiveName );
            }

            if ( $h == ezcArchive::BZIP2 )
            {
                $archiveName = "compress.bzip2://$archiveName";
                $h = ezcArchiveFileType::detect( $archiveName );
            }
        }

        return self::createInstance( $archiveName, $h, $options );
    }

    /**
     * Close the current archive.
     */
    public function close()
    {
    }

    /**
     * Sets the property $name to $value.
     *
     * Because there are no properties available, this method will always
     * throw an {@link ezcBasePropertyNotFoundException}.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @param mixed $value
     * @ignore
     */
    public function __set( $name, $value )
    {
        throw new ezcBasePropertyNotFoundException( $name );
    }

    /**
     * Returns the property $name.
     *
     * Because there are no properties available, this method will always
     * throw an {@link ezcBasePropertyNotFoundException}.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @ignore
     */
    public function __get( $name )
    {
        throw new ezcBasePropertyNotFoundException( $name );
    }

    /**
     * Returns the algorithm that is used currently.
     *
     * @return int   Possible values are: {@link ezcArchive::ZIP}, {@link ezcArchive::TAR}, {@link ezcArchive::TAR_V7},
     *               {@link ezcArchive::TAR_USTAR}, {@link ezcArchive::TAR_PAX}, or {@link ezcArchive::TAR_GNU}.
     */
    public abstract function getAlgorithm();

    /**
     * Returns true if writing to the archive is implemented, otherwise false.
     *
     * @see isWritable()
     *
     * @return bool
     */
    public abstract function algorithmCanWrite();

    /**
     * Returns an instance of the archive with the given type.
     *
     * Similar to {@link open()}, but the type is required.
     *
     * @param string $archiveName  The path of the archive.
     * @param int    $type        Open the archive with the $forceType
     *        algorithm. Possible values are: {@link ezcArchive::ZIP},
     *        {@link ezcArchive::TAR}, {@link ezcArchive::TAR_V7}, {@link ezcArchive::TAR_USTAR},
     *        {@link ezcArchive::TAR_PAX}, {@link ezcArchive::TAR_GNU}.
     *        TAR will use the TAR_USTAR algorithm by default.
     *
     * @return ezcArchive  Subclass of ezcArchive: {@link ezcArchiveZip},
     *                     {@link ezcArchiveV7Tar}, {@link ezcArchivePax},
     *                     {@link ezcArchiveGnuTar}, or {@link ezcArchiveUstar}.
     */
    protected static function createInstance( $archiveName, $type, ezcArchiveOptions $options = null )
    {
        $options = self::initOptions( $options );

        if ( $type == self::ZIP )
        {
            $af = new ezcArchiveCharacterFile( $archiveName, true, $options->readOnly );
            return self::getZipInstance( $af );
        }

        $af = new ezcArchiveBlockFile( $archiveName, true, 512, $options->readOnly );
        $instance = self::getTarInstance( $af, $type );
        $instance->options = $options;
        return $instance;
    }

    /**
     * This methods initializes the options by generating an options object if $options is null.
     *
     * @param null|ezcArchiveOptions $options
     *
     * @return ezcArchiveOptions
     */
    private static function initOptions( $options )
    {
        if ( $options === null )
        {
            $options = new ezcArchiveOptions;
        }
        return $options;
    }

    /**
     * This method associates a new $options object with this archive.
     *
     * @param ezcArchiveOptions $options
     */
    public function setOptions( ezcArchiveOptions $options )
    {
        $this->options = $options;
    }

    /**
     * Open a tar instance.
     *
     * This method is made public for testing purposes, and should not be used.
     *
     * @param ezcArchiveBlockFile $blockFile
     * @param int    $type
     *        The algorithm type. Possible values are:
     *        {@link ezcArchive::TAR}, {@link ezcArchive::TAR_V7}, {@link ezcArchive::TAR_USTAR},
     *        {@link ezcArchive::TAR_PAX}, {@link ezcArchive::TAR_GNU}.
     *        TAR will use the TAR_USTAR algorithm by default.
     *
     * @return ezcArchive  Subclass of ezcArchive:
     *                     {@link ezcArchiveV7Tar}, {@link ezcArchivePax},
     *                     {@link ezcArchiveGnuTar}, or {@link ezcArchiveUstar}.
     * @access private
     */
    public static function getTarInstance( ezcArchiveBlockFile $blockFile, $type )
    {
        switch ( $type )
        {
            case self::TAR_V7:
                return new ezcArchiveV7Tar( $blockFile );

            case self::TAR_USTAR:
                return new ezcArchiveUstarTar( $blockFile );

            case self::TAR_PAX:
                return new ezcArchivePaxTar( $blockFile );

            case self::TAR_GNU:
                return new ezcArchiveGnuTar( $blockFile );

            case self::TAR:
                return new ezcArchiveUstarTar( $blockFile ); // Default type.
        }

        return null;
    }

    /**
     * Open a zip instance. This method is made public for testing purposes, and
     * should not be used.
     *
     * @param ezcArchiveCharacterFile $charFile  The character file which
     *                                           contains the archive.
     * @return ezcArchive  Subclass of ezcArchive: {@link ezcArchiveZip}.
     * @access private
     */
    public static function getZipInstance( ezcArchiveCharacterFile $charFile )
    {
        return new ezcArchiveZip( $charFile );
    }

    /**
     * Returns true if the iterator points to a valid entry, otherwise false.
     *
     * @return bool
     */
    public function valid()
    {
        return ( $this->fileNumber >= 0 && $this->fileNumber < $this->entriesRead );
    }

    /**
     * Rewinds the iterator to the first entry.
     *
     * @return void
     */
    public function rewind()
    {
        $this->fileNumber = 0;
    }

    /**
     * Returns the current ezcArchiveEntry if it is valid, otherwise false is returned.
     *
     * @return ezcArchiveEntry
     */
    public function current()
    {
        return ( $this->valid() ? $this->entries[$this->fileNumber] : false );
    }

    /**
     * Returns the current key, entry number, if it is valid, otherwise false is returned.
     *
     * @return int
     */
    public function key()
    {
        return ( $this->valid() ? $this->fileNumber : false );
    }

    /**
     * Forwards the iterator to the next entry.
     *
     * If there is no next entry all iterator methods except for {@link
     * rewind()} will return false.
     *
     * @see rewind()
     *
     * @return ezcArchiveEntry  The next entry if it exists, otherwise false.
     */
    public function next()
    {
        if ( $this->valid() )
        {
            $this->fileNumber++;
            if ( $this->valid() )
            {
                return $this->current();
            }

            if ( !$this->completed )
            {
                if ( $this->readCurrentFromArchive() )
                {
                    return $this->current();
                }
            }
        }

        return false;
    }

    /**
     * Extract the current entry to which the iterator points.
     *
     * Extract the current entry to which the iterator points, and return true if the current entry is extracted.
     * If the iterator doesn't point to a valid entry, this method returns false.
     *
     * True if the file is extracted correctly, otherwise false.
     *
     * @param string $target
     *        The full path to which the target should be extracted.
     * @param bool $keepExisting
     *        True if the file shouldn't be overwritten if they already exist.
     *        For the opposite behaviour, false should be given.
     *
     * @throws ezcArchiveValueException     if the archive contains invalid values.
     * @throws ezcBaseFileNotFoundException if the link cannot be found.
     *
     * @return bool
     */
    public function extractCurrent( $target, $keepExisting = false )
    {
        if ( $this->file === null )
        {
            throw new ezcArchiveException( "The archive is closed" );
        }

        if ( !$this->valid() )
        {
            return false;
        }

        $isWindows = ( substr( php_uname( 's' ), 0, 7 ) == 'Windows' ) ? true : false;
        $entry = $this->current();
        $type = $entry->getType();
        $fileName = $target . DIRECTORY_SEPARATOR. $entry->getPath();

        if ( $type == ezcArchiveEntry::IS_LINK )
        {
            $linkName = $target . DIRECTORY_SEPARATOR . $entry->getLink();
            if ( !file_exists( $linkName ) )
            {
                throw new ezcBaseFileNotFoundException( $linkName, "link", "Hard link could not be created." );
            }
        }

        $this->createDefaultDirectory( $fileName );

        if ( !$keepExisting || ( !is_link( $fileName ) && !file_exists( $fileName ) ) )
        {
            if ( ( file_exists( $fileName ) || is_link( $fileName ) ) && !is_dir( $fileName ) )
            {
                unlink ( $fileName );
            }

            if ( !file_exists( $fileName ) ) // For example, directories are not removed.
            {
                switch ( $type )
                {
                    case ezcArchiveEntry::IS_CHARACTER_DEVICE:
                        if ( ezcBaseFeatures::hasFunction( 'posix_mknod' ) )
                        {
                            posix_mknod( $fileName, POSIX_S_IFCHR, $entry->getMajor(), $entry->getMinor() );
                        }
                        else
                        {
                            throw new ezcArchiveValueException( $type );
                        }
                        break;

                    case ezcArchiveEntry::IS_BLOCK_DEVICE:
                        if ( ezcBaseFeatures::hasFunction( 'posix_mknod' ) )
                        {
                            posix_mknod( $fileName, POSIX_S_IFBLK, $entry->getMajor(), $entry->getMinor() );
                        }
                        else
                        {
                            throw new ezcArchiveValueException( $type );
                        }
                        break;

                    case ezcArchiveEntry::IS_FIFO:
                        if ( ezcBaseFeatures::hasFunction( 'posix_mknod' ) )
                        {
                            posix_mknod( $fileName, POSIX_S_IFIFO );
                        }
                        else
                        {
                            throw new ezcArchiveValueException( $type );
                        }
                        break;

                    case ezcArchiveEntry::IS_SYMBOLIC_LINK:
                        if ( $isWindows )
                        {
                            // FIXME.. need to be sure that target file
                            // already extracted before copying it to link destination.
                            $sourcePath = dirname( $fileName ) . '/' . $entry->getLink();
                            $fileName = str_replace( '/', '\\', $fileName );
                            copy( $sourcePath, $fileName );
                        }
                        else
                        {
                            symlink( $entry->getLink(), $fileName );
                        }
                        break;

                    case ezcArchiveEntry::IS_LINK:
                        if ( $isWindows )
                        {
                            copy( $target . DIRECTORY_SEPARATOR . $entry->getLink(), $fileName );
                        }
                        else
                        {
                            link( $target . DIRECTORY_SEPARATOR . $entry->getLink(), $fileName );
                        }
                        break;

                    case ezcArchiveEntry::IS_DIRECTORY:
                        $permissions = $entry->getPermissions();

                        if ( $permissions === null || $permissions === false )
                        {
                            $permissions = '0777';
                        }
                        mkdir( $fileName, octdec( $permissions ), true );
                        break;

                    case ezcArchiveEntry::IS_FILE:
                        $this->writeCurrentDataToFile( $fileName );
                        break;

                    default:
                        throw new ezcArchiveValueException( $type );
                }

                if ( $type == ezcArchiveEntry::IS_SYMBOLIC_LINK &&
                     ezcBaseFeatures::hasFunction( 'posix_geteuid' ) &&
                     posix_geteuid() == 0 )
                {
                    $user = $entry->getUserId();
                    $group = $entry->getGroupId();
                    @lchown( $fileName, $user );
                    @lchgrp( $fileName, $group );
                }

                // Change the username and group if the filename exists and if
                // the intention is to keep it as a file. A zip archive
                // stores the symlinks in a file; thus don't change these.
                if ( file_exists( $fileName ) && ( $type == ezcArchiveEntry::IS_FILE || $type == ezcArchiveEntry::IS_DIRECTORY ) )
                {
                    $group = $entry->getGroupId();
                    $user  = $entry->getUserId();
                    $time  = $entry->getModificationTime();
                    $perms = octdec( $entry->getPermissions() );

                    if ( $this->options && $this->options->extractCallback )
                    {
                        $this->options->extractCallback->{$type == ezcArchiveEntry::IS_DIRECTORY ? 'createDirectoryCallback' : 'createFileCallback'}( $fileName, $perms, $user, $group );
                    }

                    if ( ezcBaseFeatures::hasFunction( 'posix_geteuid' ) &&
                         posix_geteuid() === 0 )
                    {
                        @chgrp( $fileName, $group );
                        @chown( $fileName, $user );
                    }

                    if ( $perms != false )
                    {
                        chmod( $fileName, $perms );
                    }

                    touch( $fileName, $time );
                }
            }

            return true;
        }

        return false;
    }

    /**
     * Search for the entry number.
     *
     * The two parameters here are the same as the PHP {@link http://www.php.net/fseek fseek()} method.
     * The internal iterator position will be set by $offset added to $whence iterations forward.
     * Where $whence is:
     * - SEEK_SET, Set the position equal to $offset.
     * - SEEK_CUR, Set the current position plus $offset.
     * - SEEK_END, Set the last file in archive position plus $offset.
     *
     * This method returns true if the new position is valid, otherwise false.
     *
     * @throws ezcArchiveException
     *         if the archive is closed
     * @param int    $offset
     * @param int    $whence
     * @return bool
     */
    public function seek( $offset, $whence = SEEK_SET )
    {
        if ( $this->file === null )
        {
            throw new ezcArchiveException( "The archive is closed" );
        }

        // Cannot trust the current position if the current position is invalid.
        if ( $whence == SEEK_CUR && $this->valid() == false )
        {
            return false;
        }

        if ( $whence == SEEK_END && !$this->completed )
        {
            // read the entire archive.
             $this->fileNumber = $this->entriesRead;
             while ( $this->readCurrentFromArchive() )
             {
                 $this->fileNumber++;
             }
        }

        switch ( $whence )
        {
            case SEEK_SET:
                $requestedFileNumber = $offset;
                break;

            case SEEK_CUR:
                $requestedFileNumber = $offset + $this->fileNumber;
                break;

            case SEEK_END:
                $requestedFileNumber = $offset + $this->entriesRead - 1;
                break;

            default:
                return false; // Invalid whence.
        }

        $this->fileNumber = $requestedFileNumber;
        if ( $this->valid() )
        {
            return true;
        }

        if ( !$this->completed )
        {
            $this->fileNumber = $this->entriesRead - 1;

            while ( $this->fileNumber != $requestedFileNumber )
            {
                $this->fileNumber++;
                if ( !$this->readCurrentFromArchive() )
                {
                    break;
                }
            }

            return $this->valid();
        }

        return false;
    }

    /**
     * Creates all the directories needed to create the file $file.
     *
     * @param string $file  Path to a file, where all the base directory names will be created.
     */
    protected function createDefaultDirectory( $file )
    {
        // Does the directory exist?
        $dirName = dirname( $file );

        if ( !file_exists( $dirName ) )
        {
            // Try to create the directory.
            if ( substr( php_uname( 's' ), 0, 7 ) == 'Windows' )
            {
                // make all slashes to be '/'
                $dirName = str_replace( '/', '\\', $dirName );
            }

            // Call the callback, to see whether we need to change permissions
            $permissions = 0777;
            $dummy = null;
            if ( $this->options && $this->options->extractCallback )
            {
                $this->options->extractCallback->createDirectoryCallback( $dirName, $permissions, $dummy, $dummy );
            }

            mkdir( $dirName, $permissions, true );
        }
    }

    /**
     * Appends a file to the archive after the current entry.
     *
     * One or multiple files can be added directly after the current file.
     * The remaining entries after the current are removed from the archive!
     *
     * The $files can either be a string or an array of strings. Which, respectively, represents a
     * single file or multiple files.
     *
     * $prefix specifies the begin part of the $files path that should not be included in the archive.
     * The files in the archive are always stored relatively.
     *
     * Example:
     * <code>
     * $tar = ezcArchive( "/tmp/my_archive.tar", ezcArchive::TAR );
     *
     * // Append two files to the end of the archive.
     * $tar->seek( 0, SEEK_END );
     * $tar->appendToCurrent( array( "/home/rb/file1.txt", "/home/rb/file2.txt" ), "/home/rb/" );
     * </code>
     *
     * When multiple files are added to the archive at the same time, thus using an array, does not
     * necessarily produce the same archive as repeatively adding one file to the archive.
     * For example, the Tar archive format, can detect that files hardlink to each other and will store
     * it in a more efficient way.
     *
     * @throws ezcArchiveWriteException  if one of the files cannot be written to the archive.
     * @throws ezcFileReadException      if one of the files cannot be read from the local filesystem.
     *
     * @param string|array(string) $files  Array or a single path to a file.
     * @param string $prefix               First part of the path used in $files.
     * @return bool
     */
    public abstract function appendToCurrent( $files, $prefix );

    /**
     * Appends a file or directory to the end of the archive. Multiple files or directory can
     * be added to the archive when an array is used as input parameter.
     *
     * @see appendToCurrent()
     *
     * @throws ezcArchiveWriteException  if one of the files cannot be written to the archive.
     * @throws ezcFileReadException      if one of the files cannot be read from the local filesystem.
     *
     * @param string|array(string) $files  Array or a single path to a file.
     * @param string $prefix               First part of the path used in $files.
     * @return bool
     */
    public abstract function append( $files, $prefix );

    /**
     * Truncates the archive to $fileNumber of files.
     *
     * The $fileNumber parameter specifies the amount of files that should remain.
     * If the default value, zero, is used then the entire archive file is cleared.
     *
     * @param int $fileNumber
     * @return bool
     */
    public abstract function truncate( $fileNumber = 0 );

    /**
     * Writes the file data from the current entry to the given file.
     *
     * @param string $targetPath  The absolute or relative path of the target file.
     * @return void
     */
    protected abstract function writeCurrentDataToFile( $targetPath );

    /**
     * Returns an array that lists the content of the archive.
     *
     * Use the getArchiveEntry method to get more information about an entry.
     *
     * @see __toString()
     *
     * @throws ezcArchiveException
     *         if the archive is closed
     * @return array(string)
     */
    public function getListing()
    {
        if ( $this->file === null )
        {
            throw new ezcArchiveException( "The archive is closed" );
        }

        $result = array();
        $this->rewind();

        do
        {
            $entry = $this->current();
            $result[] = rtrim( $entry->__toString(), "\n" ); // remove newline.
        } while ( $this->next() );

        return $result;
    }

    /**
     * Returns a string which represents all the entries from the archive.
     *
     * @throws ezcArchiveException
     *         if the archive is closed
     * @return string
     */
    public function __toString()
    {
        if ( $this->file === null )
        {
            throw new ezcArchiveException( "The archive is closed" );
        }

        $result = "";
        $this->rewind();

        while ( $this->valid() )
        {
            $result .= $this->current()->__toString() . "\n";
            $this->next();
        }

        return $result;
    }

    /**
     * Extract entries from the archive to the target directory.
     *
     * All entries from the archive are extracted to the target directory.
     * By default the files in the target directory are overwritten.
     * If the $keepExisting is set to true, the files from the archive will not overwrite existing files.
     *
     * @see extractCurrent()
     *
     * @throws ezcArchiveException
     *         if the archive is closed
     * @throws ezcArchiveEmptyException
     *         if the archive is invalid
     * @param string $target     Absolute or relative path of the directory.
     * @param bool $keepExisting If set to true then the file will be overwritten, otherwise not.
     * @return void
     */
    public function extract( $target, $keepExisting = false )
    {
        if ( $this->file === null )
        {
            throw new ezcArchiveException( "The archive is closed" );
        }

        $this->rewind();
        if ( !$this->valid() )
        {
            throw new ezcArchiveEmptyException( );
        }

        while ( $this->valid() )
        {
            $this->extractCurrent( $target, $keepExisting );
            $this->next();
        }
    }

    /**
     * Returns true if the current archive is empty, otherwise false.
     *
     * @return bool
     */
    public function isEmpty()
    {
        return ( $this->entriesRead == 0 );
    }

    /**
     * Get the file entries from the archive.
     *
     * @param string|array(string) $files  Array or a single path to a file.
     * @param string $prefix               First part of the path used in $files.
     *
     * @return ezcArchiveEntry
     */
    protected function getEntries( $files, $prefix )
    {
        if ( !is_array( $files ) )
        {
            $files = array( $files );
        }

        // Check whether the files are correct.
        foreach ( $files as $file )
        {
            if ( !file_exists( $file ) && !is_link( $file ) )
            {
                throw new ezcBaseFileNotFoundException( $file );
            }
        }

        // Search for all the entries, because otherwise hardlinked files show up as an ordinary file.
        return ezcArchiveEntry::getEntryFromFile( $files, $prefix );
    }
}
?>
PKJa�\U��+77$pear/ezc/Archive/utils/stat_mode.phpnu�[���<?php
/**
 * File containing the ezcArchiveStatMode class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveStatMode class stores the stat-mode constant values.
 *
 * Compare the bits from the "mode" array element from {@link http://www.php.net/stat}.
 * For example to get the file permissions in an octal number:
 * <code>
 * $stat = stat( "/tmp/myfile.txt" );
 * $perm = decoct( $stat["mode"] & ezcArchiveStatMode::S_PERM_MASK );
 * </code>
 *
 * To see if the file is a directory, the following code can be used:
 * <code>
 * $stat = stat( "/tmp/myfile.txt" );
 * $isDirectory = ( ( $stat["mode"] & S_FMT ) == ezcArchiveStatMode::S_IFDIR );
 * </code>
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveStatMode
{
    /**
     * Type of the file.
     */
    const S_IFMT = 0170000;

    /**
     * Named pipe (fifo).
     */
    const S_IFIFO = 0010000;

    /**
     * character special.
     */
    const S_IFCHR = 0020000;

    /**
     * Directory
     */
    const S_IFDIR = 0040000;

    /**
     * block special
     */
    const S_IFBLK = 0060000;

    /**
     * regular file
     */
    const S_IFREG = 0100000;

    /**
     * Symbolic link
     */
    const S_IFLNK = 0120000;

    /**
     * Socket
     */
    const S_IFSOCK = 0140000;

    /**
     * Whiteout
     */
    const S_IFWHT = 0160000;

    /**
     * Permission mask
     */
    const S_PERM_MASK = 07777;
}
?>
PKKa�\	�z��$pear/ezc/Archive/utils/file_type.phpnu�[���<?php
/**
 * File containing the abstract ezcArchiveFileType class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * This class provides methods to detect various archive or compression types.
 *
 * The archive formats that can be detected are:
 * - tar ( v7, ustar, pax, gnu )
 * - zip
 *
 * The compression types that can be detected are:
 * - gzip
 * - bzip2
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveFileType
{
    /**
     * Returns the archive type of the given file.
     *
     * @param string $fileName  Absolute or relative path to the file.
     *
     * @return int    Possible values are: {@link ezcArchive::ZIP},
     *               {@link ezcArchive::TAR}, {@link ezcArchive::TAR_V7}, {@link ezcArchive::TAR_USTAR},
     *               {@link ezcArchive::TAR_PAX}, {@link ezcArchive::TAR_GNU}.
     */
    public static function detect( $fileName )
    {
        $fp = fopen( $fileName, "r" );
        if ( $fp === false )
        {
            return false;
        }

        $data = fread( $fp, 512 );
        fclose( $fp );

        if ( self::isGzip( $data ) )
        {
            return ezcArchive::GZIP;
        }

        if ( self::isBzip2( $data ) )
        {
            return ezcArchive::BZIP2;
        }

        if ( self::isZip( $data ) )
        {
            return ezcArchive::ZIP;
        }

        // Order is important.
        if ( self::isPaxTar( $data ) )
        {
            return ezcArchive::TAR_PAX;
        }

        if ( self::isV7Tar( $data ) )
        {
            return ezcArchive::TAR_V7;
        }

        if ( self::isUstarTar( $data ) )
        {
            return ezcArchive::TAR_USTAR;
        }

        if ( self::isGnuTar( $data ) )
        {
            return ezcArchive::TAR_GNU;
        }

        return false;
    }

    /**
     * Checks if the provided $data matches the known signature of a Bzip2 archive.
     *
     * The $data string parameter must contain the first block of data from a file. It will be
     *                     matched against the known signature for this archive type.
     *
     * @param string $data
     * @return bool
     */
    public static function isBzip2( $data )
    {
        if ( ord( $data[0] ) == 0x42 && ord( $data[1] ) == 0x5a )
        {
            return true;
        }
        return false;
    }

    /**
     * Checks if the provided $data matches the known signature of a Gzip archive.
     *
     * The $data string parameter must contain the first block of data from a file. It will be
     *                     matched against the known signature for this archive type.
     *
     * @param string $data
     * @return bool
     */
    public static function isGzip( $data )
    {
        $h = unpack( "Cid1/Cid2", $data[0] . $data[1] );
        if ( $h["id1"] == 0x1f && $h["id2"] == 0x8b )
        {
            return true;
        }

        return false;
    }

    /**
     * Checks if the provided $data matches the known signature of a Zip archive.
     *
     * The $data string parameter must contain the first block of data from a file. It will be
     *                     matched against the known signature for this archive type.
     *
     * @param string $data
     * @return bool
     */
    public static function isZip( $data )
    {
        if ( $data[0] . $data[1] == pack( "v",  0x4b50 ) )
        {
            return true;
        }

        return false;
    }

    /**
     * Checks if the provided $data matches the known signature of a V7 tar archive.
     *
     * The $data string parameter must contain the first block of data from a file. It will be
     *                     matched against the known signature for this archive type.
     *
     * @param string $data
     * @return bool
     */
     public static function isV7Tar( $data )
     {
        if ( strcmp( substr( $data, 257, 5 ), "\0\0\0\0\0" ) == 0 && strcmp( substr( $data, 263, 2 ), "\0\0" ) == 0 )
        {
            if ( self::tarContainsFileName( $data ) )
            {
                return true;
            }
        }

        return false;
     }

    /**
     * Checks if the provided $data matches the known signature of a USTar archive.
     *
     * The $data string parameter must contain the first block of data from a file. It will be
     *                     matched against the known signature for this archive type.
     *
     * @param string $data
     * @return bool
     */
    public static function isUstarTar( $data )
    {
        if ( strcmp( substr( $data, 257, 5 ), "ustar" ) == 0 && strcmp( substr( $data, 263, 2 ), "00" ) == 0 )
        {
            if ( self::tarContainsFileName( $data ) )
            {
                return true;
            }
        }

        return false;
    }

    /**
     * Checks if the provided $data matches the known signature of a PAX tar archive.
     *
     * The $data string parameter must contain the first block of data from a file. It will be
     *                     matched against the known signature for this archive type.
     *
     * @param string $data
     * @return bool
     */
    public static function isPaxTar( $data )
    {
        if ( strcmp( substr( $data, 257, 5 ), "ustar" ) == 0 && strcmp( substr( $data, 263, 2 ), "00" ) == 0 )
        {
            $type = substr( $data, 156, 1 );
            if ( $type == "x" || $type == "g" )
            {
                if ( self::tarContainsFileName( $data ) )
                {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Checks if the provided $data matches the known signature of a GNU tar archive.
     *
     * The $data string parameter must contain the first block of data from a file. It will be
     *                     matched against the known signature for this archive type.
     *
     * @param string $data
     * @return bool
     */
    public static function isGnuTar( $data )
    {
        if ( strcmp( substr( $data, 257, 5 ), "ustar" ) == 0 && strcmp( substr( $data, 263, 2 ), " \0" ) == 0 )
        {
            if ( self::tarContainsFileName( $data ) )
            {
                return true;
            }
        }

        return false;
    }

    /**
     * Checks if the provided $data contains a file name.
     *
     * The $data string parameter must contain the first block of data from a file. It will be
     *                     matched against the known signature for this archive type.
     *
     * @param string $data
     * @return bool
     */
    public static function tarContainsFileName( $data )
    {
        return $data[0] != "\0";
    }
}
?>
PKKa�\��0���$pear/ezc/Archive/utils/checksums.phpnu�[���<?php
/**
 * File containing the ezcArchiveChecksums class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveChecksums is a collection of checksum algorithms. The
 * total-byte-value checksum and CRC32 checksum are currently available.
 *
 * For each different checksum are two methods available:
 * - Calculate the checksum from a string.
 * - Calculate the checksum from a file.
 *
 * The latter will consume less memory since a part of the file is read in
 * memory at the time, and will be freed after use. The consequence might be
 * that the checksum from a string is a bit faster.
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveChecksums
{
    /**
     * The CRC-32 lookup table.
     *
     * @var array(int)
     */
    private static $crc32Table = false;

    /**
     * Calculates the total-byte-value checksum from a string.
     *
     * Returns the total ASCII value from all characters in the data string.
     * Example 1: For example:
     *
     * <code>
     * $crc = ezcArchiveChecksums::getTotalByteValueFromFile( "abc" );
     * // $crc contains the value: 141 + 142 + 143 = 426
     * </code>
     *
     * @param string $data  Character string.
     * @return int The total byte value.
     *
     * @see getTotalByteValueFromFile()
     */
    public static function getTotalByteValueFromString( $data )
    {
        $total = 0;
        $length = strlen( $data );
        for ( $i = 0; $i < $length; $i++ )
        {
            $total += ord( $data[$i] );
        }

        return $total;
    }

    /**
     * Calculates the total-byte-value checksum from a file.
     *
     * Returns the total ASCII value from all characters in the data string.
     * For example:
     *
     * <code>
     * $crc = ezcArchiveChecksums::getTotalByteValueFromFile( "abc" );
     * // $crc contains the value: 141 + 142 + 143 = 426
     * </code>
     *
     * @param string $fileName The file to use
     * @return int Value which contains the total byte value.
     */
    public static function getTotalByteValueFromFile( $fileName )
    {
        if ( ( $fp = fopen( $fileName, 'rb' ) ) === false )
        {
            return false;
        }

        // Perform the algorithm on each character in file
        $total = 0;
        while ( true )
        {
            $i = fread( $fp, 1 );
            if ( strlen( $i ) == 0 )
            {
                break;
            }

            $total += ord( $i );
        }

        fclose( $fp );

        return $total;
    }

   /**
    * Calculates the (official) CRC-32 polynomial from a $data string as input.
    *
    * @param string $data
    * @return int The calculated CRC-32.
    */
    public static function getCrc32FromString( $data )
    {
        return crc32( $data );
    }

    /**
     * Calculates the (official) CRC-32 polynomial from a file.
     *
     * This method is taken from the PHP user comments
     * (http://no.php.net/manual/en/function.crc32.php).
     *
     * @param string $fileName Absolute or relative path to the file.
     * @return int The calculated CRC-32.
     */
    public static function getCrc32FromFile( $fileName )
    {
        if ( self::$crc32Table === false )
        {
            self::crc32InitTable();
        }

        // Once the lookup table has been filled in by the two functions above,
        // this function creates all CRCs using only the lookup table.

        // You need unsigned variables because negative values
        // introduce high bits where zero bits are required.
        // PHP doesn't have unsigned integers:
        // I've solved this problem by doing a '&' after a '>>'.

        // Start out with all bits set high.
        $crc = 0xffffffff;

        // Added for issue #13517: Not possible to add directories to an archive on Windows
        if ( is_dir( $fileName ) )
        {
            return false;
        }

        if ( ( $fp = fopen( $fileName ,'rb' ) ) === false )
        {
            return false;
        }

        // Perform the algorithm on each character in file
        while ( true )
        {
            $i = fread( $fp, 1 );
            if ( strlen( $i ) == 0 )
            {
                break;
            }
            $crc = ( ( $crc >> 8 ) & 0x00ffffff ) ^ self::$crc32Table[( $crc & 0xFF ) ^ ord( $i )];
        }

        fclose( $fp );

        // Exclusive OR the result with the beginning value.
        return $crc ^ 0xffffffff;
    }

    /**
     * Initializes the CRC-32 table.
     *
     * Builds the lookup table array. This is the official polynomial used by
     * CRC-32 in PKZip, WinZip and Ethernet.
     *
     * This method is taken from the PHP user comments
     * (http://no.php.net/manual/en/function.crc32.php).
     */
    protected static function crc32InitTable()
    {
        // Builds lookup table array
        // This is the official polynomial used by
        // CRC-32 in PKZip, WinZip and Ethernet.
        $polynomial = 0x04c11db7;

        // 256 values representing ASCII character codes.
        for ( $i = 0; $i <= 0xFF; ++$i )
        {
            self::$crc32Table[$i] = ( self::crc32Reflect( $i, 8 ) << 24 );

            for ( $j = 0; $j < 8; ++$j )
            {
                self::$crc32Table[$i] = ( ( self::$crc32Table[$i] << 1 ) ^ ( ( self::$crc32Table[$i] & ( 1 << 31 ) ) ? $polynomial : 0 ) );
            }

            self::$crc32Table[$i] = self::crc32Reflect( self::$crc32Table[$i], 32 );
        }
    }

    /**
     * Reflects CRC bits in the lookup table
     *
     * This method is taken from the PHP user comments
     * (http://no.php.net/manual/en/function.crc32.php).
     *
     * @param int $ref
     * @param int $ch
     * @return int
     */
    protected static function crc32Reflect( $ref, $ch )
    {
        $value = 0;

        // Swap bit 0 for bit 7, bit 1 for bit 6, etc.
        for ( $i = 1; $i < ( $ch + 1 ); ++$i )
        {
            if ( $ref & 1 )
            {
                $value |= ( 1 << ( $ch - $i ) );
            }

            $ref = ( ( $ref >> 1 ) & 0x7fffffff );
        }

        return $value;
    }
}
?>
PKKa�\}�sb�	�	$pear/ezc/Archive/options/archive.phpnu�[���<?php
/**
 * File containing the ezcArchiveOptions class
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Class containing the basic options for ezcBase' autoload.
 *
 * @property bool $readOnly
 *           Whether the archive should be opened in read only mode.
 * @property ezcArchiveCallback $extractCallback
 *           Callback object to be used for every directory and file creation
 *           action, so that permissions, user and group may be changed
 *           depending on user preferences. See {@link ezcArchiveCallback}.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveOptions extends ezcBaseOptions
{
    /**
     * Constructs an object with the specified values.
     *
     * @throws ezcBasePropertyNotFoundException
     *         if $options contains a property not defined
     * @throws ezcBaseValueException
     *         if $options contains a property with a value not allowed
     * @param array(string=>mixed) $options
     */
    public function __construct( array $options = array() )
    {
        $this->readOnly = false;
        $this->extractCallback = null;

        parent::__construct( $options );
    }

    /**
     * Sets the option $name to $value.
     *
     * @throws ezcBasePropertyNotFoundException
     *         if the property $name is not defined
     * @throws ezcBaseValueException
     *         if $value is not correct for the property $name
     * @param string $name
     * @param mixed $value
     * @ignore
     */
    public function __set( $name, $value )
    {
        switch ( $name )
        {
            case 'readOnly':
                if ( !is_bool( $value ) )
                {
                    throw new ezcBaseValueException( $name, $value, 'bool' );
                }
                $this->properties[$name] = $value;
                break;

            case 'extractCallback':
                if ( !is_null( $value ) && !( is_object( $value ) && in_array( 'ezcArchiveCallback', class_parents( $value ) ) ) )
                {
                    throw new ezcBaseValueException( $name, $value, 'instance of ezcArchiveCallback' );
                }
                $this->properties[$name] = $value;
                break;

            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }
}
?>
PKLa�\�M��9�9&pear/ezc/Archive/tar/headers/ustar.phpnu�[���<?php
/**
 * File containing the ezcArchiveUstarHeader class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveUstarHeader class represents the Tar Ustar header.
 *
 * ezcArchiveUstarHeader can read the header from an ezcArchiveBlockFile or ezcArchiveEntry.
 *
 * The values from the headers are directly accessible via the class properties, and allows
 * reading and writing to specific header values.
 *
 * The entire header can be appended to an ezcArchiveBlockFile again or written to an ezcArchiveFileStructure.
 * Information may get lost, though.
 *
 * The Ustar Header has the following structure:
 *
 * <pre>
 * +--------+------------+-------------------+---------------------------+
 * | Offset | Field size | Property          |  Description              |
 * +--------+------------+-------------------+---------------------------+
 * |  0     | 100        | fileName          | Name of the file          |
 * |  100   | 8          | fileMode          | File mode                 |
 * |  108   | 8          | userId            | Owner user ID             |
 * |  116   | 8          | groupId           | Owner group ID            |
 * |  124   | 12         | fileSize          | Length of file in bytes   |
 * |  136   | 12         | modificationTime  | Modify time of file       |
 * |  148   | 8          | checksum          | Checksum for header       |
 * |  156   | 1          | type              | Indicator for links       |
 * |  157   | 100        | linkName          | Name of linked file       |
 * |  257   | 6          | magic             | USTAR indicator           |
 * |  263   | 2          | version           | USTAR version             |
 * |  265   | 32         | userName          | Owner user name           |
 * |  297   | 32         | groupName         | Owner group name          |
 * |  329   | 8          | deviceMajorNumber | Major device number       |
 * |  337   | 8          | deviceMinorNumber | Minor device number       |
 * |  345   | 155        | filePrefix        | Filename prefix           |
 * |  500   | 12         | -                 | NUL                       |
 * +--------+------------+-------------------+---------------------------+
 * </pre>
 *
 * The columns of the table are:
 * - Offset describes the start position of a header field.
 * - Field size describes the size of the field.
 * - Property is the name of the property that will be set by the header field.
 * - Description explains what this field describes.
 *
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveUstarHeader extends ezcArchiveV7Header
{
    /**
     * Sets the property $name to $value.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @param mixed $value
     * @return void
     * @ignore
     */
    public function __set( $name, $value )
    {
        switch ( $name )
        {
            case "magic":
            case "version":
            case "userName":
            case "groupName":
            case "deviceMajorNumber":
            case "deviceMinorNumber":
            case "filePrefix":
                $this->properties[$name] = $value;
                return;
        }

        return parent::__set( $name, $value );
    }

    /**
     * Returns the value of the property $name.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @return mixed
     * @ignore
     */
    public function __get( $name )
    {
        switch ( $name )
        {
            case "magic":
            case "version":
            case "userName":
            case "groupName":
            case "deviceMajorNumber":
            case "deviceMinorNumber":
            case "filePrefix":
                return $this->properties[ $name ];
        }

        return parent::__get( $name );
    }

    /**
     * Creates and initializes a new header.
     *
     * If the ezcArchiveBlockFile $file is null then the header will be empty.
     * When an ezcArchiveBlockFile is given, the block position should point to the header block.
     * This header block will be read from the file and initialized in this class.
     *
     * @param ezcArchiveBlockFile $file
     */
    public function __construct( ezcArchiveBlockFile $file = null )
    {
       // Offset | Field size |  Description
        // ----------------------------------
        //  0     | 100        | Name of file
        //  100   | 8          | File mode
        //  108   | 8          | Owner user ID
        //  116   | 8          | Owner group ID
        //  124   | 12         | Length of file in bytes
        //  136   | 12         | Modify time of file
        //  148   | 8          | Checksum for header
        //  156   | 1          | Type flag.
        //  157   | 100        | Name of linked file
        //  257   | 6          | USTAR indicator.
        //  263   | 2          | USTAR version.
        //  265   | 32         | Owner user name.
        //  297   | 32         | Owner group name.
        //  329   | 8          | Major device number.
        //  337   | 8          | Minor device number.
        //  345   | 155        | Filename prefix.
        //  500   | 12         | NUL.

        if ( !is_null( $file ) )
        {
            parent::__construct( $file );

            // Decode the rest.
            $decoded = unpack( "@257/a6magic/a2version/a32userName/a32groupName/a8deviceMajorNumber/a8deviceMinorNumber/a155filePrefix", $file->current() );

            // Append the decoded array to the header.
            $this->properties = array_merge( $this->properties, $decoded );

            $this->handleOwner();
         }
    }

    /**
     * This method sets the correct owner in the headers.
     *
     * This only works if PHP has the posix extension compiled in and
     * when the effective user ID is 0 (root).
     */
    protected function handleOwner()
    {
        if ( !ezcBaseFeatures::hasFunction( 'posix_getpwuid' ) )
        {
            return;
        }

        $t =& $this->properties;

        if ( posix_geteuid() === 0 && isset( $t['userName'] ) && $t['userName'] !== '' )
        {
            if ( ( $userName = posix_getpwnam( $t['userName'] ) ) !== false )
            {
                $t['userId'] = $userName['uid'];
            }
            if ( ( $groupName = posix_getgrnam( $t['groupName'] ) ) !== false )
            {
                $t['groupId'] = $groupName['gid'];
            }
        }
    }

    /**
     * Sets this header with the values from the ezcArchiveEntry $entry.
     *
     * The values that are possible to set from the ezcArchiveEntry $entry are set in this header.
     * The properties that may change are: fileName, fileMode, userId, groupId, fileSize, modificationTime,
     * linkName, and type.
     *
     * @param ezcArchiveEntry $entry
     * @return void
     */
    public function setHeaderFromArchiveEntry( ezcArchiveEntry $entry )
    {
        $this->splitFilePrefix( $entry->getPath( false ), $file,  $filePrefix );
        $this->fileName = $file;
        $this->filePrefix = $filePrefix;

        $this->fileMode = $entry->getPermissions();
        $this->userId = $entry->getUserId();
        $this->groupId = $entry->getGroupId();
        $this->fileSize = $entry->getSize();
        $this->modificationTime = $entry->getModificationTime();
        $this->linkName = $entry->getLink( false );

        switch ( $entry->getType() )
        {
            case ezcArchiveEntry::IS_FILE:
                $this->type = 0;
                break;

            case ezcArchiveEntry::IS_LINK:
                $this->type = 1;
                break;

            case ezcArchiveEntry::IS_SYMBOLIC_LINK:
                $this->type = 2;
                break;

            case ezcArchiveEntry::IS_CHARACTER_DEVICE:
                $this->type = 3;
                break;

            case ezcArchiveEntry::IS_BLOCK_DEVICE:
                $this->type = 4;
                break;

            case ezcArchiveEntry::IS_DIRECTORY:
                $this->type = 5;
                break;

            case ezcArchiveEntry::IS_FIFO:
                $this->type = 6;
                break;

            // Devices, etc are set to \0.
            default:
                $this->type = "";
                break; // ends up as a \0 character.
        }

        $this->deviceMajorNumber = $entry->getMajor();
        $this->deviceMinorNumber = $entry->getMinor();

        $length = strlen( $this->fileName );

        if ( $entry->getType() == ezcArchiveEntry::IS_DIRECTORY )
        {
           // Make sure that the filename ends with a slash.
           if ( $this->fileName[ $length - 1] != "/" )
           {
               $this->fileName .= "/";
           }
        }
        else
        {
           if ( $this->fileName[ $length - 1] == "/" )
           {
               $this->fileName = substr( $this->fileName, 0, -1 ); // Remove last character.
           }
        }
    }

    /**
     * Splits the path $path, if it exceeds 100 tokens, into two parts: $file and $filePrefix.
     *
     * If the path contains more than 100 tokens, it will put the directory name in the $filePrefix and
     * the fileName into $file.
     * This is the same method as Gnu Tar splits the file and file prefix.
     *
     * @throws ezcArchiveIoException if the file name cannot be written to the archive.
     * @param string $path
     * @param string &$file
     * @param string &$filePrefix
     * @return void
     */
    protected function splitFilePrefix( $path, &$file, &$filePrefix )
    {
        if ( strlen( $path ) > 100 )
        {
            $filePrefix = dirname( $path );
            $file = basename( $path );

            if ( strlen( $filePrefix )  > 155 || strlen( $file ) > 100 )
            {
                throw new ezcArchiveIoException( "Filename too long: $path" );
            }
        }
        else
        {
            $filePrefix = "";
            $file = $path;
        }
    }

    /**
     * Serializes this header and appends it to the given ezcArchiveBlockFile $archiveFile.
     *
     * @param ezcArchiveBlockFile $archiveFile
     * @return void
     */
    public function writeEncodedHeader( ezcArchiveBlockFile $archiveFile )
    {
        // Offset | Field size |  Description
        // ----------------------------------
        //  0     | 100        | Name of file
        //  100   | 8          | File mode
        //  108   | 8          | Owner user ID
        //  116   | 8          | Owner group ID
        //  124   | 12         | Length of file in bytes
        //  136   | 12         | Modify time of file
        //  148   | 8          | Checksum for header
        //  156   | 1          | Type flag.
        //  157   | 100        | Name of linked file
        //  257   | 6          | USTAR indicator.
        //  263   | 2          | USTAR version.
        //  265   | 32         | Owner user name.
        //  297   | 32         | Owner group name.
        //  329   | 8          | Major device number.
        //  337   | 8          | Minor device number.
        //  345   | 155        | Filename prefix.
        //  500   | 12         | NUL.
        if ( ezcBaseFeatures::hasFunction( 'posix_getpwuid' ) )
        {
            $posixName = ( posix_getpwuid( $this->userId ) );
            $posixGroup = ( posix_getgrgid( $this->groupId ) );
        }
        else
        {
            $posixName['name']= 'nobody';
            $posixGroup['name']= 'nogroup';
        }

        $enc = pack( "a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155a12",
            $this->fileName,
            str_pad( $this->fileMode, 7, "0", STR_PAD_LEFT),
            str_pad( decoct( $this->userId ), 7, "0", STR_PAD_LEFT),
            str_pad( decoct( $this->groupId ), 7, "0", STR_PAD_LEFT),
            str_pad( decoct( $this->fileSize ), 11, "0", STR_PAD_LEFT),
            str_pad( decoct( $this->modificationTime ), 11, "0", STR_PAD_LEFT),
            "        ",
            $this->type,
            $this->linkName,
            "ustar",
            "00",
            $posixName["name"],
            $posixGroup["name"],
            sprintf( "%07s", decoct( $this->deviceMajorNumber ) ),
            sprintf( "%07s", decoct( $this->deviceMinorNumber ) ),
            $this->filePrefix,
            "" );

        $enc = $this->setChecksum( $enc );

        $archiveFile->append( $enc );
    }

    /**
     * Updates the given ezcArchiveFileStructure $struct with the values from this header.
     *
     * The values that can be set in the archiveFileStructure are: path, gid, uid, type, link, mtime, mode, and size.
     *
     * @throws ezcArchiveValueException
     *         if trying to set the structure type to the reserved type
     * @param ezcArchiveFileStructure &$struct
     * @return void
     */
    public function setArchiveFileStructure( ezcArchiveFileStructure &$struct )
    {
        parent::setArchiveFileStructure( $struct );

        if ( $this->filePrefix != '' )
        {
            $struct->path = $this->filePrefix . DIRECTORY_SEPARATOR . $this->fileName;
        }
        else
        {
            $struct->path = $this->fileName;
        }
        $struct->major = $this->deviceMajorNumber;
        $struct->minor = $this->deviceMinorNumber;
        $struct->userName = $this->userName;
        $struct->groupName = $this->groupName;

        // Override the link type.
        switch ( $this->type )
        {
            case "\0":
            case 0:
                $struct->type = ezcArchiveEntry::IS_FILE;
                break;

            case 1:
                $struct->type = ezcArchiveEntry::IS_LINK;
                break;

            case 2:
                $struct->type = ezcArchiveEntry::IS_SYMBOLIC_LINK;
                break;

            case 3:
                $struct->type = ezcArchiveEntry::IS_CHARACTER_DEVICE;
                break;

            case 4:
                $struct->type = ezcArchiveEntry::IS_BLOCK_DEVICE;
                break;

            case 5:
                $struct->type = ezcArchiveEntry::IS_DIRECTORY;
                break;

            case 6:
                $struct->type = ezcArchiveEntry::IS_FIFO;
                break;

            case 7:
                $struct->type = ezcArchiveEntry::IS_RESERVED;
                break;
        }

        if ( $struct->type == ezcArchiveEntry::IS_RESERVED )
        {
            throw new ezcArchiveValueException( $struct->type, " < " . ezcArchiveEntry::IS_RESERVED );
        }
    }
}
?>
PKLa�\Nv�nn$pear/ezc/Archive/tar/headers/gnu.phpnu�[���<?php
/**
 * File contains the ezcArchiveGnuHeader class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveGnuHeader class represents the Tar Gnu header.
 *
 * ezcArchiveGnuHeader can read the header from an ezcArchiveBlockFile or ezcArchiveEntry.
 *
 * The values from the headers are directly accessible via the class properties, and allows
 * reading and writing to specific header values.
 *
 * The entire header can be appended to an ezcArchiveBlockFile again or written to an ezcArchiveFileStructure.
 * Information may get lost, though.
 *
 * The header is the {@link ezcArchiveUstarHeader} with the extension that the type can be set to "L" or "K".
 * Respectively, long filename and long link. If the type is set to either "L" or "K", the next block contains the
 * filename or link. The block thereafter repeats the original header but the type is then set to a digit.
 * (No long filename or link).
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveGnuHeader extends ezcArchiveUstarHeader
{
    /**
     * Creates and initializes a new header.
     *
     * If the ezcArchiveBlockFile $file is null then the header will be empty.
     * When an ezcArchiveBlockFile is given, the block position should point to the header block.
     * This header block will be read from the file and initialized in this class.
     *
     * @param ezcArchiveBlockFile $file
     */
    public function __construct( ezcArchiveBlockFile $file = null )
    {
        if ( !is_null( $file ) )
        {
            // FIXME  Assumed a while.. check the gnu tar source file.
            // FIXME  Check long links, really large files, etc.
            $extensions = array();

            do
            {
                parent::__construct( $file );

                switch ( $this->type )
                {
                    case "L":
                        $extensions["fileName"] = $this->readExtension( $file );
                        break;

                    case "K":
                        $extensions["linkName"] = $this->readExtension( $file );
                        break;

                }
            } while ( $this->type < '0' || $this->type > '9' );

            parent::__construct( $file );

            foreach ( $extensions as $key => $value )
            {
                switch ( $key )
                {
                    case "fileName":
                        $this->fileName = $extensions["fileName"];
                        $this->filePrefix = "";
                        break;

                    case "linkName":
                        $this->linkName = $extensions["linkName"];
                        break;
                }
            }
        }
    }

    /**
     * Reads an extended set of data from the Block file and returns it as a string.
     *
     * Some filenames or link names do not fit in the Ustar header, and are therefor placed in a new block.
     * This method read the block(s) and returns the data as a string.
     *
     * @param ezcArchiveBlockFile $file
     * @return string
     */
    protected function readExtension( ezcArchiveBlockFile $file )
    {
        $completeBlocks = ( int ) ( $this->fileSize / self::BLOCK_SIZE );
        $rest = ( $this->fileSize % self::BLOCK_SIZE );

        $data  = "";
        for ( $i = 0; $i < $completeBlocks; $i++ )
        {
            $data .=  $file->next();
        }

        $data .= substr( $file->next(), 0, $rest );

        $file->next();
        return $data;
    }
}
?>
PKLa�\�$����$pear/ezc/Archive/tar/headers/pax.phpnu�[���<?php
/**
 * File contains the ezcArchivePaxHeader class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchivePaxHeader class represents the Tar Pax header.
 *
 * ezcArchivePaxHeader can read the header from an ezcArchiveBlockFile or ezcArchiveEntry.
 *
 * The values from the headers are directly accessible via the class properties, and allows
 * reading and writing to specific header values.
 *
 * The entire header can be appended to an ezcArchiveBlockFile again or written to an ezcArchiveFileStructure.
 * Information may get lost, though.
 *
 * The header is the {@link ezcArchiveUstarHeader} with extra header information described on the following webpage:
 * {@link http://www.opengroup.org/onlinepubs/009695399/utilities/pax.html}
 *
 * Currently, only the extended header is supported.
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchivePaxHeader extends ezcArchiveUstarHeader
{
    /**
     * Sets the property $name to $value.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @param mixed $value
     * @return void
     * @ignore
     */
    public function __set( $name, $value )
    {
        return parent::__set( $name, $value );
    }

    /**
     * Returns the value of the property $name.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @return mixed
     * @ignore
     */
    public function __get( $name )
    {
        return parent::__get( $name );
    }

    /**
     * Returns an array with pax header information.
     *
     * This method reads an extended set of data from the ezcArchiveBlockFile
     * $file and returns the values in an array.
     *
     * @param ezcArchiveBlockFile $file
     * @return array(string=>string)
     */
    protected function getPaxDecodedHeader( ezcArchiveBlockFile $file )
    {
        $result = array();

        // next block has the info.
        $file->next();

        $data = $file->current();

        $offset = 0;

        while ( strcmp( $data[$offset], "\0" ) != 0 )
        {
            $space = strpos( $data, " ", $offset );

            $length = substr( $data, $offset, $space - $offset );
            $equalSign = strpos( $data, "=",  $space );

            $keyword = substr( $data, $space + 1, $equalSign - $space - 1 );

            $value = rtrim( substr( $data, $equalSign + 1, $length - $equalSign - 1 ), "\n" );

            $result[ $keyword ] = $value;

            $offset += $length;
        }

        return $result;
    }

    /**
     * Creates and initializes a new header.
     *
     * If the ezcArchiveBlockFile $file is null then the header will be empty.
     * When an ezcArchiveBlockFile is given, the block position should point to the header block.
     * This header block will be read from the file and initialized in this class.
     *
     * @param ezcArchiveBlockFile $file
     */
    public function __construct( ezcArchiveBlockFile $file = null )
    {
        if ( !is_null( $file ) )
        {
            parent::__construct( $file );

            if ( $this->type == "x" )
            {
                $paxArray = $this->getPaxDecodedHeader( $file );
                $file->next();
            }

            parent::__construct( $file );

            // Override some fields.
            foreach ( $paxArray as $key => $value )
            {
                switch ( $key )
                {
                    case "gid":
                        $this->groupId = $value;
                        break;  // For group IDs larger than 2097151.

                    case "linkpath":
                        $this->linkName = $value;
                        break;  // Long link names?

                    case "path":
                        $this->fileName = $value;
                        $this->filePrefix = "";
                        break; // Really long file names.

                    case "size":
                        $this->size = $value;
                        break;  // For files with a size greater than 8589934591 bytes.

                    case "uid":
                        $this->userId = $value;
                        break;  // For user IDs larger than 2097151.
                }
            }
        }
    }
}
?>
PKLa�\^���8�8#pear/ezc/Archive/tar/headers/v7.phpnu�[���<?php
/**
 * File contains the ezcArchiveV7Header class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveV7Header class represents the Tar V7 header.
 *
 * ezcArchiveV7Header can read the header from an ezcArchiveBlockFile or ezcArchiveEntry.
 *
 * The values from the headers are directly accessible via the class properties, and allows
 * reading and writing to specific header values.
 *
 * The entire header can be appended to an ezcArchiveBlockFile again or written to an ezcArchiveFileStructure.
 * Information may get lost, though.
 *
 * The V7 Header has the following structure:
 *
 * <pre>
 * +--------+------------+------------------+-----------------------------------------------------------+
 * | Offset | Field size | Property         |  Description                                              |
 * +--------+------------+------------------+-----------------------------------------------------------+
 * |  0     | 100        | fileName         | Name of file                                              |
 * |  100   | 8          | fileMode         | File mode                                                 |
 * |  108   | 8          | userId           | Owner user ID                                             |
 * |  116   | 8          | groupId          | Owner group ID                                            |
 * |  124   | 12         | fileSize         | Length of file in bytes                                   |
 * |  136   | 12         | modificationTime | Modify time of file                                       |
 * |  148   | 8          | checksum         | Checksum for header                                       |
 * |  156   | 1          | type             | Indicator for links                                       |
 * |  157   | 100        | linkName         | Name of linked file                                       |
 * |  257   | 72         | -                | NUL.                                                      |
 * |  329   | 8          | -                | Compatibility with GNU tar: Major device set to: 00000000.|
 * |  337   | 8          | -                | Compatibility with GNU tar: Minor device set to: 00000000.|
 * |  345   | 167        | -                | NUL.                                                      |
 * +--------+------------+------------------+-----------------------------------------------------------+
 * </pre>
 *
 * The columns of the table are:
 * - Offset describes the start position of a header field.
 * - Field size describes the size of the field.
 * - Property is the name of the property that will be set by the header field.
 * - Description explains what this field describes.
 *
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveV7Header
{
    /**
     * Relative byte position that the header starts.
     */
    const START_HEADER    = 0;

    /**
     * Relative byte position that the checksum starts.
     */
    const CHECKSUM_OFFSET = 148;

    /**
     * Number of bytes that the checksum occupies.
     */
    const CHECKSUM_SIZE   = 8;

    /**
     * Relative byte position that the checksum ends.
     */
    const END_HEADER      = 512;

    /**
     * Number of bytes that a block occupies.
     */
    const BLOCK_SIZE      = 512;

    /**
     * Holds the properties of this class.
     *
     * @var array(string=>mixed)
     */
    protected $properties = array();

    /**
     * Sets the property $name to $value.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @param mixed $value
     * @return void
     * @ignore
     */
    public function __set( $name, $value )
    {
        switch ( $name )
        {
            case "fileName":
            case "fileMode":
            case "userId":
            case "groupId":
            case "fileSize":
            case "modificationTime":
            case "checksum":
            case "type":
            case "linkName":
                $this->properties[$name] = $value;
                break;

            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }

    /**
     * Returns the value of the property $name.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @return mixed
     * @ignore
     */
    public function __get( $name )
    {
        switch ( $name )
        {
            case "fileName":
            case "fileMode":
            case "userId":
            case "groupId":
            case "fileSize":
            case "modificationTime":
            case "checksum":
            case "type":
            case "linkName":
                return $this->properties[ $name ];

            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }

    /**
     * Creates and initializes a new header.
     *
     * If the ezcArchiveBlockFile $file is null then the header will be empty.
     * When an ezcArchiveBlockFile is given, the block position should point to the header block.
     * This header block will be read from the file and initialized in this class.
     *
     * @throws ezcArchiveChecksumException
     *         if the checksum from the file did not match the calculated one
     * @param ezcArchiveBlockFile $file
     */
    public function __construct( ezcArchiveBlockFile $file = null )
    {
        // Offset | Field size |  Description
        // ----------------------------------
        //  0     | 100        | Name of file
        //  100   | 8          | File mode
        //  108   | 8          | Owner user ID
        //  116   | 8          | Owner group ID
        //  124   | 12         | Length of file in bytes
        //  136   | 12         | Modify time of file
        //  148   | 8          | Checksum for header
        //  156   | 1          | Indicator for links
        //  157   | 100        | Name of linked file
        // ------------------------------------------
        //  257   | 72         | NUL.
        //  329   | 8          | Compatibility with GNU tar: Major device set to: 00000000.
        //  337   | 8          | Compatibility with GNU tar: Minor device set to: 00000000.
        //  345   | 167        | NUL.

        if ( !is_null( $file ) )
        {
            $this->properties = unpack ( "a100fileName/".
                                         "a8fileMode/".
                                         "a8userId/".
                                         "a8groupId/".
                                         "a12fileSize/".
                                         "a12modificationTime/".
                                         "a8checksum/".
                                         "a1type/".
                                         "a100linkName", $file->current() );

            $this->properties["userId"]   = octdec( $this->properties["userId"] );
            $this->properties["groupId"]  = octdec( $this->properties["groupId"] );
            $this->properties["fileSize"]  = octdec( $this->properties["fileSize"] );
            $this->properties["modificationTime"]  = octdec( $this->properties["modificationTime"] );
            $this->properties["checksum"]  = octdec( $this->properties["checksum"] );

            if ( !$this->checksum( $this->checksum, $file->current() ) )
            {
                throw new ezcArchiveChecksumException( $file->getFileName() );
            }
        }
    }

    /**
     * Returns true when the checksum $checksum matches with the header data $rawHeader; otherwise returns false.
     *
     * The checksum is calculated by the {@link ezcArchiveChecksums::getTotalByteValueFromString()}.
     *
     * @param  int    $checksum
     * @param  string $rawHeader
     * @return bool
     */
    protected function checksum( $checksum, $rawHeader )
    {
        $total = ezcArchiveChecksums::getTotalByteValueFromString( substr( $rawHeader, self::START_HEADER, self::END_HEADER - self::START_HEADER ) );

        // assume blanks for the checksum itself.
        $total -= ezcArchiveChecksums::getTotalByteValueFromString( substr( $rawHeader, self::CHECKSUM_OFFSET, self::CHECKSUM_SIZE ) );
        $total += ezcArchiveChecksums::getTotalByteValueFromString( str_repeat( " ", self::CHECKSUM_SIZE ) );

        return ( strcmp( sprintf( "%08x", $checksum ), sprintf( "%08x", $total ) ) == 0 );
    }

    /**
     * Returns the encoded header as given as the parameter $encodedHeader but includes the
     * checksum of the header.
     *
     * The encoded header $encodedHeader should have spaces at the place where the checksum should be stored.
     *
     * @param string $encodedHeader
     * @return string
     */
    protected function setChecksum( $encodedHeader )
    {
        $total = ezcArchiveChecksums::getTotalByteValueFromString( $encodedHeader );

        $checksum = pack( "a7", str_pad( decoct( $total ), 6, "0", STR_PAD_LEFT ) );
        $checksum .= " ";

        $begin = substr( $encodedHeader, 0, 148 );
        $end = substr( $encodedHeader, 156 );

        return $begin.$checksum.$end;
    }

    /**
     * Sets this header with the values from the ezcArchiveEntry $entry.
     *
     * The values that are possible to set from the ezcArchiveEntry $entry are set in this header.
     * The properties that may change are: fileName, fileMode, userId, groupId, fileSize, modificationTime,
     * linkName, and type.
     *
     * @param ezcArchiveEntry $entry
     * @return void
     */
    public function setHeaderFromArchiveEntry( ezcArchiveEntry $entry )
    {
        $this->fileName = $entry->getPath( false );
        $this->fileMode = $entry->getPermissions();
        $this->userId = $entry->getUserId();
        $this->groupId = $entry->getGroupId();
        $this->fileSize = $entry->getSize();
        $this->modificationTime = $entry->getModificationTime();
        $this->linkName = $entry->getLink( false );

        switch ( $entry->getType() )
        {
            case ezcArchiveEntry::IS_FILE:
                $this->type = "";
                break; // ends up as a \0 character.

            case ezcArchiveEntry::IS_LINK:
                $this->type = 1;
                break;

            case ezcArchiveEntry::IS_SYMBOLIC_LINK:
                $this->type = 2;
                break;

            case ezcArchiveEntry::IS_DIRECTORY:
                $this->type = 5;
                break;

            // Devices, etc are set to \0.
            default:
                $this->type = "";
                break; // ends up as a \0 character.
        }

        $length = strlen( $this->fileName );

        if ( $entry->getType() == ezcArchiveEntry::IS_DIRECTORY )
        {
           // Make sure that the filename ends with a slash.
           if ( $this->fileName[ $length - 1] != "/" )
           {
               $this->fileName .= "/";
           }
        }
        else
        {
           if ( $this->fileName[ $length - 1] == "/" )
           {
               $this->fileName = substr( $header->fileName, 0, -1 ); // Remove last character.
           }
        }
    }

    /**
     * Serializes this header and appends it to the given ezcArchiveBlockFile $archiveFile.
     *
     * @param ezcArchiveBlockFile $archiveFile
     * @return void
     */
    public function writeEncodedHeader( ezcArchiveBlockFile $archiveFile )
    {
        // Offset | Field size |  Description
        // ----------------------------------
        //  0     | 100        | Name of file
        //  100   | 8          | File mode
        //  108   | 8          | Owner user ID
        //  116   | 8          | Owner group ID
        //  124   | 12         | Length of file in bytes
        //  136   | 12         | Modify time of file
        //  148   | 8          | Checksum for header
        //  156   | 1          | Indicator for links
        //  157   | 100        | Name of linked file
        // ------------------------------------------
        //  257   | 72         | NUL.
        //  329   | 8          | Compatibility with GNU tar: Major device set to: 00000000.
        //  337   | 8          | Compatibility with GNU tar: Minor device set to: 00000000.
        //  345   | 167        | NUL.
        //

        $enc = pack( "a100a8a8a8a12a12a8a1a100a72a8a8a167",
            $this->fileName,
            str_pad( $this->fileMode, 7, "0", STR_PAD_LEFT ),
            str_pad( decoct( $this->userId ), 7, "0", STR_PAD_LEFT ),
            str_pad( decoct( $this->groupId ), 7, "0", STR_PAD_LEFT ),
            str_pad( decoct( $this->fileSize ), 11, "0", STR_PAD_LEFT ),
            str_pad( decoct( $this->modificationTime ), 11, "0", STR_PAD_LEFT ),
            "        ",
            $this->type,
            $this->linkName,
            "",
            "0000000",
            "0000000",
            "" );

        $enc = $this->setChecksum( $enc );
        $archiveFile->append( $enc );
    }

    /**
     * Updates the given ezcArchiveFileStructure $struct with the values from
     * this header.
     *
     * The values that can be set in the archiveFileStructure are: path, gid,
     * uid, type, link, mtime, mode, and size.
     *
     * @param ezcArchiveFileStructure &$struct
     * @return void
     */
    public function setArchiveFileStructure( ezcArchiveFileStructure &$struct )
    {
        $struct->path = $this->fileName;
        $struct->gid = $this->groupId;
        $struct->uid = $this->userId;

        switch ( $this->type )
        {
            case "\0":
            case 0:
                $struct->type = ezcArchiveEntry::IS_FILE;
                break;

            case 1:
                $struct->type = ezcArchiveEntry::IS_LINK;
                break;

            case 2:
                $struct->type = ezcArchiveEntry::IS_SYMBOLIC_LINK;
                break;
        }

        // trailing slash means directory
        if ( $this->fileName[ strlen( $this->fileName ) - 1 ] == '/' )
        {
            $struct->type = ezcArchiveEntry::IS_DIRECTORY;
        }

        $struct->link = $this->linkName;
        $struct->mtime = $this->modificationTime;
        $struct->mode = $this->fileMode;
        $struct->size = $this->fileSize;
    }
}
?>
PKMa�\�31��	�	pear/ezc/Archive/tar/ustar.phpnu�[���<?php
/**
 * File containing the ezcArchiveUstarTar class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * The ezcArchiveUstarTar class implements the Tar ustar archive format.
 *
 * ezcArchiveUstarTar is a subclass from {@link ezcArchive} that provides the common interface,
 * and {@link ezcArchiveV7Tar} that provides the basic Tar implementation.
 *
 * ezcArchiveUstarTar reads on creation only the first {@link ezcArchiveEntry entry} from the archive.
 * When needed next entries are read.
 *
 * The Ustar Tar algorithm is an extension of V7 Tar. Ustar has the following extended features:
 * - Filenames up to 255 characters.
 * - Stores the owner and group by ID and Name.
 * - Can archive: regular files, symbolic links, hard links, fifo's, and devices.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveUstarTar extends ezcArchiveV7Tar implements Iterator
{
    /**
     * Initializes the Tar and tries to read the first entry from the archive.
     *
     * At initialization it sets the blockFactor to $blockFactor. Each tar archive
     * has always $blockFactor of blocks ( 0, $blockFactor, 2 * $blockFactor, etc ).
     *
     * The Tar archive works with blocks, so therefore the first parameter expects
     * the archive as a blockFile.
     *
     * @param ezcArchiveBlockFile $blockFile
     * @param int $blockFactor
     */
    public function __construct( ezcArchiveBlockFile $blockFile, $blockFactor = 20 )
    {
        parent::__construct( $blockFile, $blockFactor );
    }

    /**
     * Returns the value which specifies a TAR_USTAR algorithm.
     *
     * @return int
     */
    public function getAlgorithm()
    {
        return self::TAR_USTAR;
    }

    /**
     * Returns true because the TAR_USTAR algorithm can write.
     *
     * @see isWritable()
     *
     * @return bool
     */
    public function algorithmCanWrite()
    {
        return true;
    }

    /**
     * Creates the a new ustar tar header for this class.
     *
     * This method expects an {@link ezcArchiveBlockFile} that points to the header that should be
     * read (and created). If null is given as  block file, an empty header will be created.
     *
     * @param string|null $file
     * @return ezcArchiveUstarHeader
     */
    protected function createTarHeader( $file = null)
    {
        return new ezcArchiveUstarHeader( $file );
    }
}
?>
PKNa�\=��

pear/ezc/Archive/tar/gnu.phpnu�[���<?php
/**
 * File contains the ezcArchiveGnuTar class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * The ezcArchiveGnuTar class implements the GNU Tar archive format.
 *
 * ezcArchiveGnuTar is a subclass from {@link ezcArchive} that provides the common interface,
 * and {@link ezcArchiveUstarTar} that provides the basic Tar implementation.
 *
 * ezcArchiveGnuTar reads on creation only the first {@link ezcArchiveEntry entry} from the archive.
 * When needed next entries are read.
 *
 * The Gnu Tar algorithm is an extension of Ustar Tar. Gnu has the following extended features compared to Ustar:
 * - Filenames of unlimited size.
 * - File size is unlimited.
 *
 * The current implementation allows only reading from a Gnu archive.
 *
 * The features of Gnu Tar and Pax Tar are quite similar, although their approach is different.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveGnuTar extends ezcArchiveUstarTar
{
    /**
     * Initializes the Tar and tries to read the first entry from the archive.
     *
     * At initialization it sets the blockFactor to $blockFactor. Each tar archive
     * has always $blockFactor of blocks ( 0, $blockFactor, 2 * $blockFactor, etc ).
     *
     * The Tar archive works with blocks, so therefore the first parameter expects
     * the archive as a blockFile.
     *
     * @param ezcArchiveBlockFile $blockFile
     * @param int $blockFactor
     */
    public function __construct( ezcArchiveBlockFile $blockFile, $blockFactor = 20 )
    {
        parent::__construct( $blockFile, $blockFactor );
    }

    /**
     * Returns the value which specifies a TAR_GNU algorithm.
     *
     * @return int
     */
    public function getAlgorithm()
    {
        return self::TAR_GNU;
    }

    /**
     * Returns false because the TAR_PAX algorithm cannot write (yet).
     *
     * @see isWritable()
     *
     * @return bool
     */
    public function algorithmCanWrite()
    {
        return false;
    }

    /**
     * Creates the a new pax tar header for this class.
     *
     * This method expects an {@link ezcArchiveBlockFile} that points to the header that should be
     * read (and created). If null is given as  block file, an empty header will be created.
     *
     * @param string|null $file
     * @return ezcArchiveGnuHeader
     */
    protected function createTarHeader( $file = null)
    {
        return new ezcArchiveGnuHeader( $file );
    }
}
?>
PKNa�\�靽�	�	pear/ezc/Archive/tar/pax.phpnu�[���<?php
/**
 * File containing the ezcArchivePaxTar class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * The ezcArchivePaxTar class implements the Tar pax or posix archive format.
 *
 * ezcArchivePaxTar is a subclass from {@link ezcArchive} that provides the common interface,
 * and {@link ezcArchiveUstarTar} that provides the basic Tar implementation.
 *
 * ezcArchivePaxTar reads on creation only the first {@link ezcArchiveEntry entry} from the archive.
 * When needed next entries are read.
 *
 * The Pax Tar algorithm is an extension of Ustar Tar. Pax has the following extended features compared to Ustar:
 * - Filenames of unlimited size.
 * - File size is unlimited.
 *
 * The current implementation allows only reading from a Pax archive.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchivePaxTar extends ezcArchiveUstarTar
{
    /**
     * Initializes the Tar and tries to read the first entry from the archive.
     *
     * At initialization it sets the blockFactor to $blockFactor. Each tar archive
     * has always $blockFactor of blocks ( 0, $blockFactor, 2 * $blockFactor, etc ).
     *
     * The Tar archive works with blocks, so therefore the first parameter expects
     * the archive as a blockFile.
     *
     * @param ezcArchiveBlockFile $blockFile
     * @param int $blockFactor
     */
    public function __construct( ezcArchiveBlockFile $blockFile, $blockFactor = 20 )
    {
        parent::__construct( $blockFile, $blockFactor );
    }

    /**
     * Returns the value which specifies a TAR_PAX algorithm.
     *
     * @return int
     */
    public function getAlgorithm()
    {
        return self::TAR_PAX;
    }

    /**
     * Returns false because the TAR_PAX algorithm cannot write (yet).
     *
     * @see isWritable()
     *
     * @return bool
     */
    public function algorithmCanWrite()
    {
        return false;
    }

    /**
     * Creates the a new pax tar header for this class.
     *
     * This method expects an {@link ezcArchiveBlockFile} that points to the header that should be
     * read (and created). If null is given as  block file, an empty header will be created.
     *
     * @param string|null $file
     * @return ezcArchivePaxHeader
     */
    protected function createTarHeader( $file = null )
    {
        return new ezcArchivePaxHeader( $file );
    }
}
?>
PKOa�\���BLBLpear/ezc/Archive/tar/v7.phpnu�[���<?php
/**
 * File contains the ezcArchiveV7Tar class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * The ezcArchiveV7Tar class implements the Tar v7 archive format.
 *
 * ezcArchiveV7Tar is a subclass from {@link ezcArchive} that provides the common interface.
 * Tar v7 algorithm specific methods are implemented in this class.
 *
 * ezcArchiveV7Tar reads on creation only the first {@link ezcArchiveEntry} from the archive.
 * When needed next entries are read.
 *
 * The V7 Tar algorithm is most basic implementation of Tar. This format has the following characteristics:
 * - Filenames up to 100 characters.
 * - Stores the file permissions.
 * - Stores the owner and group by ID.
 * - Stores the last modification time.
 * - Can archive: regular files and symbolic links.
 * - Maximum file size: 8 Gygabyte.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveV7Tar extends ezcArchive
{
    /**
     * Amount of bytes in a block.
     */
    const BLOCK_SIZE = 512;

    /**
     * Tar archives have always $blockFactor of blocks.
     *
     * @var int
     */
    protected $blockFactor = 20;

    /**
     * Stores all the headers from the archive.
     *
     * The first header of the archive has index zero. The ezcArchiveV7Header or a subclass from this header
     * is stored in the array. {@link createTarHeader()} will create the correct header.
     *
     * @var array(ezcArchiveV7Header)
     */
    protected $headers;

    /**
     * Stores the block number where the header starts.
     *
     * The fileNumber is the index of the array.
     *
     * @var array(int)
     */
    protected $headerPositions;

    /**
     * Specifies if the archive contains null blocks.
     *
     * @var bool
     */
    protected $hasNullBlocks;

    /**
     * Stores the number of added blocks.
     *
     * @var int
     */
    protected $addedBlocks = 0;

    /**
     * Specifies if unreliable blocks were added.
     *
     * @var bool
     */
    protected $addedBlocksNotReliable = false;

    /**
     * Initializes the Tar and tries to read the first entry from the archive.
     *
     * At initialization it sets the blockFactor to $blockFactor. Each tar archive
     * has always $blockFactor of blocks ( 0, $blockFactor, 2 * $blockFactor, etc ).
     *
     * The Tar archive works with blocks, so therefore the first parameter expects
     * the archive as a blockFile.
     *
     * @param ezcArchiveBlockFile $file
     * @param int $blockFactor
     */
    public function __construct( ezcArchiveBlockFile $file, $blockFactor = 20 )
    {
        $this->blockFactor = $blockFactor;
        $this->file = $file;

        $this->headers = array();
        $this->headerPositions = array();

        $this->entriesRead = 0;
        $this->fileNumber = 0;

        $this->hasNullBlocks = $this->file->isNew() ? false : true;
        $this->addedBlocks = 0;

        if ( $this->file->getFileAccess() !== ezcArchiveFile::WRITE_ONLY )
        {
            $this->readCurrentFromArchive();
        }
    }

    /**
     * Closes the archive.
     */
    public function __destruct()
    {
        $this->close();
    }

    /**
     * Returns the value which specifies a TAR_V7 algorithm.
     *
     * @return int
     */
    public function getAlgorithm()
    {
        return self::TAR_V7;
    }

    /**
     * Returns true because the TAR_V7 algorithm can write.
     *
     * @see isWritable()
     *
     * @return bool
     */
    public function algorithmCanWrite()
    {
        return true;
    }

    /**
     * Creates the a new tar header for this class.
     *
     * Usually this class is reimplemented by other Tar algorithms, and therefore it returns another Tar
     * header.
     *
     * This method expects an {@link ezcArchiveBlockFile} that points to the header that should be
     * read (and created). If null is given as  block file, an empty header will be created.
     *
     * @param string|null $file
     * @return ezcArchiveV7Header  The ezcArchiveV7Header or a subclass is returned.
     */
    protected function createTarHeader( $file = null )
    {
        return new ezcArchiveV7Header( $file );
    }

    /**
     * Read the current entry from the archive.
     *
     * The current entry from the archive is read, if possible. This method will set the {@link $completed}
     * to true, if the end of the archive is reached. The {@link $entriesRead} will be increased, if the
     * entry is correctly read.
     *
     * @throws ezcArchiveBlockSizeException
     *         if the file is empty
     *         or if the file is not valid
     * @return bool
     */
    protected function readCurrentFromArchive()
    {
        // Not cached, read the next block.
        if ( $this->entriesRead == 0 )
        {
            $this->file->rewind();
            if ( !$this->file->isEmpty() && !$this->file->valid() )
            {
                throw new ezcArchiveBlockSizeException( $this->file->getFileName(),  "At least one block expected in tar archive" );
            }
        }
        else
        {
            // Search the new block.
            $newBlock = $this->headerPositions[ $this->fileNumber - 1 ] +  $this->file->getBlocksFromBytes( $this->headers[ $this->fileNumber - 1 ]->fileSize );

            // Search for that block.
            if ( $newBlock != $this->file->key() )
            {
                $this->file->seek( $newBlock );
            }

            // Read the new block.
            $this->file->next();
        }

        // This might be a null block.
        if ( !$this->file->valid() || $this->file->isNullBlock() )
        {
            $this->completed = true;
            return false;
        }

        $this->headers[ $this->fileNumber ] = $this->createTarHeader( $this->file );
        $this->headerPositions[ $this->fileNumber ] = $this->file->key();

        // Set the currentEntry information.
        $struct = new ezcArchiveFileStructure();
        $this->headers[ $this->fileNumber ]->setArchiveFileStructure( $struct );
        $this->entries[ $this->fileNumber ] = new ezcArchiveEntry( $struct );

        $this->entriesRead++;

        return true;
    }

    /**
     * Writes the file data from the current entry to the given file.
     *
     * @param string $targetPath  The absolute or relative path of the target file.
     * @return bool
     */
    protected function writeCurrentDataToFile( $targetPath )
    {
        if ( !$this->valid() )
        {
            return false;
        }

        $requestedBlock = $this->headerPositions[$this->fileNumber];
        $currentBlock = $this->file->key();
        if ( $currentBlock != $requestedBlock )
        {
            $this->file->seek( $requestedBlock );
        }

        $header = $this->headers[ $this->fileNumber ];

        if ( $header->fileSize > 0 )
        {
            $completeBlocks = ( int ) ( $header->fileSize / self::BLOCK_SIZE );
            $rest = ( $header->fileSize % self::BLOCK_SIZE );

            //  Write to file
            $fp = fopen( $targetPath, "w" );

            for ( $i = 0; $i < $completeBlocks; $i++ )
            {
                fwrite( $fp, $this->file->next() );
            }

            fwrite( $fp, $this->file->next(), $rest );
            fclose( $fp );
         }
         else
         {
             touch( $targetPath );
         }

         return true;
    }

    /**
     * Truncates the archive to $fileNumber of files.
     *
     * The $fileNumber parameter specifies the amount of files that should remain.
     * If the default value, zero, is used then the entire archive file is cleared.
     *
     * @throws ezcArchiveException
     *         if the archive is closed
     * @throws ezcBaseFilePermissionException
     *         if the file is read-only
     *         or if the current algorithm cannot write
     * @param int $fileNumber
     * @return bool
     */
    public function truncate( $fileNumber = 0 )
    {
        if ( $this->file === null )
        {
            throw new ezcArchiveException( "The archive is closed" );
        }

        if ( $this->file->getFileAccess() === ezcArchiveFile::READ_ONLY || !$this->algorithmCanWrite() )
        {
            throw new ezcBaseFilePermissionException( $this->file->getFileName(), ezcBaseFilePermissionException::WRITE, "Archive is read-only" );
        }

        $originalFileNumber = $this->fileNumber;
        $this->hasNullBlocks = false;
        $this->addedBlocksNotReliable = true;

        // Entirely empty the file.
        if ( $fileNumber == 0 )
        {
            $this->file->truncate();

            $this->entriesRead = 0;
            $this->fileNumber = 0;
            $this->completed = true;
        }
        else
        {
            $this->seek( $fileNumber ); // read the headers.
            $endBlockNumber = $this->headerPositions[ $fileNumber - 1 ] +  $this->file->getBlocksFromBytes( $this->headers[ $fileNumber - 1 ]->fileSize );

            if ( $endBlockNumber === false )
            {
                return false;
            }

            if ( !$this->file->truncate ( $endBlockNumber + 1 ) )
            {
                throw new ezcArchiveException( "The archive cannot be truncated to " . ( $endBlockNumber + 1 ) . " block(s). " .
                                               "This happens with write-only files or stream (e.g. compress.zlib) " );
            }

            $this->entriesRead = $fileNumber;
            $this->completed = true;
            $this->fileNumber = $originalFileNumber;

            return $this->valid();
        }
    }

    /**
     * Appends a file to the archive after the current entry.
     *
     * One or multiple files can be added directly after the current file.
     * The remaining entries after the current are removed from the archive!
     *
     * The $files can either be a string or an array of strings. Which, respectively, represents a
     * single file or multiple files.
     *
     * $prefix specifies the begin part of the $files path that should not be included in the archive.
     * The files in the archive are always stored relatively.
     *
     * Example:
     * <code>
     * $tar = ezcArchive( "/tmp/my_archive.tar", ezcArchive::TAR );
     *
     * // Append two files to the end of the archive.
     * $tar->seek( 0, SEEK_END );
     * $tar->appendToCurrent( array( "/home/rb/file1.txt", "/home/rb/file2.txt" ), "/home/rb/" );
     * </code>
     *
     * When multiple files are added to the archive at the same time, thus using an array, does not
     * necessarily produce the same archive as repeatively adding one file to the archive.
     * For example, the Tar archive format, can detect that files hardlink to each other and will store
     * it in a more efficient way.
     *
     * @throws ezcArchiveWriteException  if one of the files cannot be written to the archive.
     * @throws ezcFileReadException      if one of the files cannot be read from the local filesystem.
     * @throws ezcArchiveException       if the archive is closed.
     *
     * @param string|array(string) $files  Array or a single path to a file.
     * @param string $prefix               First part of the path used in $files.
     * @return bool
     */
    public function appendToCurrent( $files, $prefix )
    {
        if ( $this->file === null )
        {
            throw new ezcArchiveException( "The archive is closed" );
        }

        if ( $this->file->getFileAccess() !== ezcArchiveFile::READ_WRITE )
        {
            throw new ezcArchiveException( "Cannot appendToCurrent when writing to a read-only, write-only stream (e.g. compress.zlib)." );
        }

        if ( $this->file->getFileAccess() === ezcArchiveFile::READ_ONLY || !$this->algorithmCanWrite() )
        {
            throw new ezcBaseFilePermissionException( $this->file->getFileName(),  ezcBaseFilePermissionException::WRITE );
        }

        $entries = $this->getEntries( $files, $prefix );
        $originalFileNumber = $this->fileNumber;

        for ( $i = 0; $i < sizeof( $files ); $i++ )
        {
            // Changes the fileNumber
            $this->appendHeaderAndFileToCurrent( $entries[$i] );
        }

        $this->fileNumber = $originalFileNumber;
        return $this->valid();
    }

    /**
     * Append a file or directory to the end of the archive. Multiple files or directory can
     * be added to the archive when an array is used as input parameter.
     *
     * @see appendToCurrent()
     *
     * @throws ezcArchiveWriteException  if one of the files cannot be written to the archive.
     * @throws ezcFileReadException      if one of the files cannot be read from the local filesystem.
     * @throws ezcArchiveException       if the archive is closed.
     *
     * @param string|array(string) $files  Add the files and or directories to the archive.
     * @param string $prefix               First part of the path used in $files.
     * @return bool
     */
    public function append( $files, $prefix )
    {
        if ( $this->file === null )
        {
            throw new ezcArchiveException( "The archive is closed" );
        }

        if ( $this->file->getFileAccess() === ezcArchiveFile::READ_ONLY || !$this->algorithmCanWrite() )
        {
            throw new ezcArchiveException( "Archive is read-only" );
        }

        // Appending to an existing archive with a compressed stream does not work because we have to remove the NULL-blocks.
        if ( $this->hasNullBlocks && $this->file->getFileAccess() !== ezcArchiveFile::READ_WRITE )
        {
            throw new ezcArchiveException( "Cannot append to this archive" );
        }

        // Existing files need to be read, because we don't know if it contains NULL-blocks at the end of the archive.
        if ( $this->file->getFileAccess() !== ezcArchiveFile::WRITE_ONLY )
        {
            $this->seek( 0, SEEK_END );
        }

        // Do the same as in appendToCurrent(). But we know that it's possible.
        $entries = $this->getEntries( $files, $prefix );
        $originalFileNumber = $this->fileNumber;

        for ( $i = 0; $i < sizeof( $files ); $i++ )
        {
            // Changes the fileNumber
            $this->appendHeaderAndFileToCurrent( $entries[$i] );
        }

        $this->fileNumber = $originalFileNumber;
        return $this->valid();
     }

    /**
     * Closes the archive correctly.
     */
    public function close()
    {
        if ( $this->file !== null )
        {
            $this->writeEnd();

            $this->file->close();
            $this->file = null;
        }
    }

    /**
     * Writes the end of the archive.
     *
     * @throws ezcArchiveException
     *         if the archive is closed
     */
    public function writeEnd()
    {
        if ( $this->file === null )
        {
            throw new ezcArchiveException( "The archive is closed" );
        }

        if ( $this->file->isModified() )
        {
            if ( !$this->hasNullBlocks )
            {
                if ( $this->addedBlocksNotReliable )
                {
                    $this->appendNullBlocks();
                }
                else
                {
                    // Added Blocks  -  Added null blocks (Block factor 20)
                    // 0             -  0
                    // 1             - 19
                    // 19            - 1
                    // 20            - 0
                    // 21            - 19
                    $nullBlocks = ( $this->blockFactor - ( $this->addedBlocks % $this->blockFactor ) ) % $this->blockFactor;
                    $this->file->appendNullBlock( $nullBlocks );
                }

                $this->hasNullBlocks = true;
                $this->addedBlocksNotReliable = false;
                $this->addedBlocks = 0;
            }
        }
    }

    /**
     * Appends the given {@link ezcArchiveBlockFile} $file and {@link ezcArchiveEntry} $entry
     * to the archive file.
     *
     * The $entry will be used to create the correct header, whereas the $file contains the raw data
     * that should be append to the archive.
     *
     * @param ezcArchiveEntry $entry
     * @return bool
     */
    protected function appendHeaderAndFileToCurrent( $entry )
    {
        // Are we at a valid entry?
        if ( !$this->isEmpty() && !$this->valid() )
        {
            return false;
        }

        if ( !$this->isEmpty() && $this->file->getFileAccess() !== ezcArchiveFile::WRITE_ONLY )
        {
            // Truncate the next file and don't add the null blocks.
            $this->truncate( $this->fileNumber + 1, false );
        }

        if ( $this->entriesRead == 0 )
        {
            $this->fileNumber = 0;
        }
        else
        {
            $this->fileNumber++;
        }

        // Add the new header to the file map.
        $this->headers[ $this->fileNumber ] = $this->createTarHeader();
        $this->headers[ $this->fileNumber ]->setHeaderFromArchiveEntry( $entry );

        // Search the end of the block file, append encoded header, and search for the end-again.
        $this->file->seek( 0, SEEK_END );
        $this->headers[$this->fileNumber]->writeEncodedHeader( $this->file );

        // Add the new blocknumber to the map.
        $this->headerPositions[$this->fileNumber] = $this->file->key();

        // Append the file, if needed.
        $this->addedBlocks += 1;
        if ( $entry->getSize() > 0 )
        {
            $this->addedBlocks += $this->file->appendFile( $entry->getPath() );
        }

        if ( !( $this->file->isNew() && $this->file->getFileAccess() === ezcArchiveFile::WRITE_ONLY ) )
        {
            $this->addedBlocksNotReliable = true;
        }

        $this->hasNullBlocks = false;
        $this->completed = true;
        $this->entriesRead++;

        $this->entries[$this->fileNumber] = $entry;
        return true;
    }

    /**
     * Appends zero or more null blocks to the end of the archive, so that it matches the $blockFactor.
     *
     * If the archive has already the correct size, no null blocks will be appended. Otherwise as many
     * null blocks are appended (up to $blockFactor - 1) so that it matches the $blockFactor.
     *
     * @return void
     */
    protected function appendNullBlocks()
    {
        $last = 0;
        if ( $this->file->getLastBlockNumber() == -1 )
        {
            if ( !$this->file->valid() )
            {
                $this->file->rewind();
            }

            while ( $this->file->valid() )
            {
                $last = $this->file->key();
                $this->file->next();
            }
        }
        else
        {
            $last = $this->file->getLastBlockNumber();
        }

        $this->file->seek( $last );

        // Go to the end.
        /*
         */

        // echo ("Last block: " . $this->file->getLastBlockNumber() );

        // Need a ftell in the seek.
        // $this->file->seek( 0, SEEK_END );

        $blockNumber =  $last;

        // 0  .. 19 => first block.
        // 20 .. 39 => second block.
        // e.g: 20 - ( 35 % 20 ) - 1 = 19 - 15 = 4
        $append = $this->blockFactor - ( $blockNumber % $this->blockFactor ) - 1;
        $this->file->appendNullBlock( $append );
    }
}
?>
PKOa�\��5�
�
%pear/ezc/Archive/archive_autoload.phpnu�[���<?php
/**
 * Autoloader definition for the Archive component.
 *
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.4.1
 * @filesource
 * @package Archive
 */

return array(
    'ezcArchiveException'                 => 'Archive/exceptions/exception.php',
    'ezcArchiveBlockSizeException'        => 'Archive/exceptions/block_size.php',
    'ezcArchiveChecksumException'         => 'Archive/exceptions/checksum.php',
    'ezcArchiveEmptyException'            => 'Archive/exceptions/empty.php',
    'ezcArchiveEntryPrefixException'      => 'Archive/exceptions/entry_prefix.php',
    'ezcArchiveInternalException'         => 'Archive/exceptions/internal_exception.php',
    'ezcArchiveIoException'               => 'Archive/exceptions/io.php',
    'ezcArchiveUnknownTypeException'      => 'Archive/exceptions/unknown_type.php',
    'ezcArchiveValueException'            => 'Archive/exceptions/value.php',
    'ezcArchive'                          => 'Archive/archive.php',
    'ezcArchiveV7Header'                  => 'Archive/tar/headers/v7.php',
    'ezcArchiveV7Tar'                     => 'Archive/tar/v7.php',
    'ezcArchiveFile'                      => 'Archive/file/file.php',
    'ezcArchiveLocalFileHeader'           => 'Archive/zip/headers/local_file.php',
    'ezcArchiveUstarHeader'               => 'Archive/tar/headers/ustar.php',
    'ezcArchiveUstarTar'                  => 'Archive/tar/ustar.php',
    'ezcArchiveBlockFile'                 => 'Archive/file/block_file.php',
    'ezcArchiveCallback'                  => 'Archive/interfaces/callback.php',
    'ezcArchiveCentralDirectoryEndHeader' => 'Archive/zip/headers/central_directory_end.php',
    'ezcArchiveCentralDirectoryHeader'    => 'Archive/zip/headers/central_directory.php',
    'ezcArchiveCharacterFile'             => 'Archive/file/character_file.php',
    'ezcArchiveChecksums'                 => 'Archive/utils/checksums.php',
    'ezcArchiveEntry'                     => 'Archive/entry.php',
    'ezcArchiveFileStructure'             => 'Archive/structs/file.php',
    'ezcArchiveFileType'                  => 'Archive/utils/file_type.php',
    'ezcArchiveGnuHeader'                 => 'Archive/tar/headers/gnu.php',
    'ezcArchiveGnuTar'                    => 'Archive/tar/gnu.php',
    'ezcArchiveOptions'                   => 'Archive/options/archive.php',
    'ezcArchivePaxHeader'                 => 'Archive/tar/headers/pax.php',
    'ezcArchivePaxTar'                    => 'Archive/tar/pax.php',
    'ezcArchiveStatMode'                  => 'Archive/utils/stat_mode.php',
    'ezcArchiveZip'                       => 'Archive/zip/zip.php',
);
?>
PKPa�\�h��A�Apear/ezc/Archive/entry.phpnu�[���<?php
/**
 * File contains the ezcArchiveEntry class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * The ezcArchiveEntry class provides system-independent file information.
 *
 * ezcArchiveEntry provides file information about the file path, it's access rights and whether the file is an
 * directory, symbolic link, hard link, block-file, etc. The owner name, the group name, the last access time
 * are also available. ezcArchiveEntry can be used to get the file information directly from the file-system or
 * from an archive.
 *
 * The main purpose of ezcArchiveEntry is to provide information about:
 * - Files on the file-system that should be appended to the archive.
 * - Files currently in the archive that can be extracted to the file-system.
 *
 * Use the {@link getEntryFromFile()} to create an ezcArchiveEntry from a file in the filesystem.
 * Important is that the prefix is set.
 * This specifies which part of the path should be stripped, before the entry is appended to the archive.
 * See also {@link ezcArchive::append()} or {@link ezcArchive::appendToCurrent()}.
 *
 * When the ezcArchiveEntry is an entry in the archive, the {@link getPath()} method contains always an
 * relative path, and the prefix is not set.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveEntry
{
    /**
     * Is a regular file.
     */
    const IS_FILE = 0;

    /**
     * Is a hard link.
     */
    const IS_LINK = 1;

    /**
     * Is a symbolic link.
     */
    const IS_SYMBOLIC_LINK = 2;

    /**
     * Is a character device.
     */
    const IS_CHARACTER_DEVICE = 3;

    /**
     * Is a block device.
     */
    const IS_BLOCK_DEVICE = 4;

    /**
     * Is a directory.
     */
    const IS_DIRECTORY = 5;

    /**
     * Is a FIFO.
     */
    const IS_FIFO = 6;

    /**
     * Not used, is Tar specific?
     */
    const IS_RESERVED = 7;

    /**
     * Contains the file information.
     *
     * @var ezcArchiveFileStructure
     */
    protected $fileStructure;

    /**
     * The prefix of the file that may be removed from the path.
     *
     * @var string
     */
    protected $prefix;

    /**
     * Constructs an archiveEntry from the {@link ezcArchiveFileStructure}.
     *
     * The $struct parameter contains the raw file information.
     * This class encapsulates the file information structure and provides convenient methods to retrieve
     * the information.
     *
     * @param ezcArchiveFileStructure $struct
     */
    public function __construct( ezcArchiveFileStructure $struct )
    {
        $this->fileStructure =  $struct;
    }

    /**
     * Returns true when this entry represents a directory.
     *
     * @return bool
     */
    public function isDirectory()
    {
        return ( $this->fileStructure->type == self::IS_DIRECTORY );
    }

    /**
     * Returns true when this entry represents a file.
     *
     * @return bool
     */
    public function isFile()
    {
        return ( $this->fileStructure->type == self::IS_FILE );
    }

    /**
     * Returns true when this entry represents a hard link.
     *
     * @return bool
     */
    public function isHardLink()
    {
        return ( $this->fileStructure->type == self::IS_LINK );
    }

    /**
     * Returns true when this entry represents a symbolic link.
     *
     * @return bool
     */
    public function isSymLink()
    {
        return ( $this->fileStructure->type == self::IS_SYMBOLIC_LINK );
    }

    /**
     * Returns true when this entry represents a symbolic or a hard link.
     *
     * @return bool
     */
    public function isLink()
    {
        return ( $this->isHardLink() || $this->isSymLink() );
    }

    /**
     * Returns type of the entry.
     *
     * @return int   Possible values are: {@link IS_LINK}, {@link IS_SYMBOLIC_LINK}, {@link IS_CHARACTER_DEVICE}, {@link IS_BLOCK_DEVICE},
     * {@link IS_DIRECTORY}, or {@link IS_FIFO}.
     */
    public function getType()
    {
        return $this->fileStructure->type;
    }

    /**
     * Returns the user ID of the entry.
     *
     * @return int
     */
    public function getUserId()
    {
        return $this->fileStructure->uid;
    }

    /**
     * Returns the group ID of the entry.
     *
     * @return int
     */
    public function getGroupId()
    {
        return $this->fileStructure->gid;
    }

    /**
     * Returns the complete path or path without the prefix.
     *
     * By default the full path is returned, unless the $withPrefix is set
     * to true.
     *
     * @param bool $withPrefix
     *
     * @return string
     */
    public function getPath( $withPrefix = true )
    {
        if ( $withPrefix )
        {
            return $this->fileStructure->path;
        }
        else
        {
            return $this->getPathWithoutPrefix( $this->fileStructure->path, $this->prefix );
        }
    }

    /**
     * Returns the path without the prefix.
     *
     * The path without the prefix is returned.
     * If the prefix doesn't match with the complete path, the whole path is returned.
     *
     * @param string $completePath
     * @param string $prefix
     * @return string
     */
    private function getPathWithoutPrefix( $completePath, $prefix )
    {
        $prefixLength = strlen( $prefix );

        if ( strcmp( substr( $completePath, 0,  $prefixLength ), $prefix ) == 0 )
        {
            $i = 0;
            // Check next character
            while ( $completePath[$i + $prefixLength] == "/" )
            {
                $i++;
            }

            $result = substr( $completePath, $prefixLength + $i );
            return $result;
        }
        else
        {
            // No match.
            return $completePath;
        }
    }

    /**
     * Removes the prefix from the path and clears the prefix.
     *
     * This method is useful when it comes to adding a entry to an archive
     * and the complete path to the file is no longer needed.
     */
    public function removePrefixFromPath()
    {
        $this->fileStructure->path = $this->getPathWithoutPrefix( $this->fileStructure->path, $this->prefix );
        $this->prefix = "";
    }


    /**
     * Returns the link with or without prefix.
     *
     * This method is similar to {@link getPath()}, but returns the link instead of the path.
     * If the current does not represents a link, an empty string is returned.
     * Use the {@link isLink()} method to see if the current entry is a link.
     *
     * @param bool $withPrefix
     */
    public function getLink( $withPrefix = true )
    {
        if ( $withPrefix )
        {
            return $this->fileStructure->link;
        }
        else
        {
            return $this->getPathWithoutPrefix( $this->fileStructure->link, $this->prefix );
        }
    }

    /**
     * Returns a bit mask representing the permissions of this entry.
     *
     * It returns the permissions in octal numbers as a string, for example:
     * "0000755"
     *
     * @return string
     */
    public function getPermissions()
    {
        return $this->fileStructure->mode;
    }

    /**
     * Returns the file size.
     *
     * @return int
     */
    public function getSize()
    {
        return $this->fileStructure->size;
    }

    /**
     * Returns the modification time as a timestamp.
     *
     * @return int
     */
    public function getModificationTime()
    {
        return $this->fileStructure->mtime;
    }

    /**
     * Returns the last access time as a timestamp.
     *
     * @return int
     */
    public function getAccessTime()
    {
        return $this->fileStructure->atime;
    }

    /**
     * Returns the inode.
     *
     * @return int
     */
    public function getInode()
    {
        return $this->fileStructure->ino;
    }

    /**
     * Returns the major device number.
     *
     * @return int
     */
    public function getMajor()
    {
        return $this->fileStructure->major;
    }

    /**
     * Returns the minor device number.
     *
     * @return int
     */
    public function getMinor()
    {
        return $this->fileStructure->minor;
    }

    /**
     * Returns the device.
     *
     * FIXME DEPRECATED?
     *
     * @return int
     */
    public function getDevice()
    {
        return $this->fileStructure->device;
    }

    /**
     * Returns the permissions as a string.
     *
     * If the entry has all the permissions, it will return: "rwxrwx" Where the first three letters
     * represent the group permissions and the last three letters the user permissions.
     *
     * @return string
     */
    public function getPermissionsString()
    {
        $out = "";

        $perm = octdec( $this->getPermissions() );

        for ( $i = 6; $i >= 0; $i -= 3 )
        {
            $part = ( $perm >> $i );

            if ( $part & 4 )
            {
                $out .= "r";
            }
            else
            {
                $out .= "-";
            }

            if ( $part & 2 )
            {
                $out .= "w";
            }
            else
            {
                $out .= "-";
            }

            if ( $part & 1 )
            {
                $out .= "x";
            }
            else
            {
                $out .= "-";
            }
        }
        return $out;
    }

    /**
     * Returns the type string for the current type of the entry.
     *
     * Returns a type string for the current entry. If the entry is a:
     * - directory: "d".
     * - file: "-".
     * - symbolic link: "l".
     * - hard link: "h".
     *
     * @return string
     */
    public function getTypeString()
    {
        switch ( $this->fileStructure->type )
        {
            case self::IS_DIRECTORY:
                return "d";

            case self::IS_FILE:
                return "-";

            case self::IS_SYMBOLIC_LINK:
                return "l";

            case self::IS_LINK:
                return "h";

            default:
                return "Z";
        }
    }

    /**
     * Sets the prefix.
     *
     * @param string $prefix
     */
    public function setPrefix( $prefix )
    {
        $this->prefix = $prefix;
    }

    /**
     * Returns the prefix.
     *
     * @return string
     */
    public function getPrefix( )
    {
        return $this->prefix;
    }

    /**
     * Returns a string representing the current entry.
     *
     * @return string
     */
    public function __toString()
    {
        $out = $this->getTypeString();
        $out .= $this->getPermissionsString();

        $out .= " ";
        $out .= $this->getUserId() . " ";
        $out .= $this->getGroupId() . " ";
        $out .= str_pad( $this->getSize(), 7, " ", STR_PAD_LEFT ) . " ";
        $out .= date( "Y-m-d H:i:s ", $this->getModificationTime() );
        $out .= $this->getPath();

        $out .= ( $this->isLink() ? " -> " . $this->getLink() : "" );

        return $out;
    }

    /**
     * Create a file structure from a $file in the file system.
     *
     * @param string $file
     * @return ezcArchiveFileStructure
     */
    protected static function getFileStructureFromFile( $file )
    {
        clearstatcache();
        $stat = ( is_link( $file ) ? lstat( $file ) : stat( $file ) );
        $lstat = lstat( $file );

        // Set the file information.
        $struct = new ezcArchiveFileStructure();

        $struct->path = $file;
        $struct->gid =  $stat["gid"];
        $struct->uid =  $stat["uid"];
        $struct->mtime = $stat["mtime"];
        $struct->atime = $stat["atime"];
        $struct->mode = decoct( $stat["mode"] & ezcArchiveStatMode::S_PERM_MASK ); // First bits describe the type.
        $struct->ino = $stat["ino"];

        $struct->type = self::getLinkType( $stat );

        if ( $struct->type == ezcArchiveEntry::IS_FILE )
        {
            $struct->size = $stat["size"];
        }
        else
        {
            $struct->size = 0;
        }

        if ( $struct->type == ezcArchiveEntry::IS_SYMBOLIC_LINK )
        {
            $struct->link = readlink( $file );
        }

        $rdev = $stat["rdev"];
        if ( $rdev == -1 )
        {
            if ( $struct->type == ezcArchiveEntry::IS_BLOCK_DEVICE || $struct->type == ezcArchiveEntry::IS_CHARACTER_DEVICE)
            {
                throw new ezcArchiveException( "Cannot add a device to the TAR because the device type cannot be determined. Your system / PHP version does not support 'st_blksize'." );
            }

            $rdev = 0;
        }

        $struct->major = ( int ) ( $rdev / 256 );
        $struct->minor = ( int ) ( $rdev % 256 );

        return $struct;
    }

    /**
     * Returns one or an array of ezcArchiveEntry's from one or multiple files in the file system.
     *
     * One or multiple ezcArchiveEntry's are created upon the given files.
     * The prefix will directly set for the ezcArchiveEntry with $prefix.
     *
     * If $files contains a path to a file, then one ezcArchiveEntry will be created and returned.
     * If $files is an array of paths, then all those ezcArchiveEntry's will be created and returned in an array.
     *
     * When multiple files are given in an array, this method will search for hard links among other files in the array.
     *
     * @throws ezcArchiveEntryPrefixException if the prefix is invalid.
     *
     * @param string|array(string)  $files
     * @param string                $prefix
     * @return ezcArchiveEntry
     */
    public static function getEntryFromFile( $files, $prefix )
    {
        $isArray = true;
        if ( !is_array( $files ) )
        {
            $isArray = false;
            $files = array( $files );
        }

        $inodes = array();
        $i = 0;
        foreach ( $files as $file )
        {
            if ( !file_exists( $file ) && !is_link( $file ) )
                return false;

            $struct = self::getFileStructureFromFile( $file );

            // Check if it's a hardlink if the OS supports it, and handle it.
            if ( ezcBaseFeatures::supportsLink() )
            {
                if ( isset( $inodes[ $struct->ino ] ) )
                {
                    // Yes, it's a hardlink.
                    $struct->type = ezcArchiveEntry::IS_LINK;
                    $struct->size = 0;
                    $struct->link = $inodes[ $struct->ino ];
                }
                else
                {
                    $inodes[ $struct->ino ] = $struct->path;
                }
            }

            $entry[$i] = new ezcArchiveEntry( $struct );
            $entry[$i]->setPrefix( $prefix );

            if ( isset( $prefix ) && strlen( $prefix ) > 0 )
            {
                if ( strlen( $entry[$i]->getPath() ) == strlen( $entry[$i]->getPath( false ) ) )
                {
                    throw new ezcArchiveEntryPrefixException( $prefix, $file );
                }
            }

            $i++;
        }

        return ( $isArray ? $entry : $entry[0] );
    }

    /**
     * Returns an ezcArchiveEntry-type that corresponds to the ezcArchiveStatMode-type
     *
     * @param ezcArchiveStatMode $stat Possible values are: {@link ezcArchiveStatMode::S_IFIFO}, {@link ezcArchiveStatMode::S_IFCHR},
     *                                 {@link ezcArchiveStatMode::S_IFDIR}, {@link ezcArchiveStatMode::S_IFBLK},
     *                                 {@link ezcArchiveStatMode::S_IFREG}, or {@link ezcArchiveStatMode::S_IFLNK}.
     *
     * @return int                    Possible values are: {@link IS_LINK}, {@link IS_SYMBOLIC_LINK}, {@link IS_CHARACTER_DEVICE},
     *                                 {@link IS_BLOCK_DEVICE}, {@link IS_DIRECTORY}, or {@link IS_FIFO}.
     */
    protected static function getLinkType( $stat )
    {
        switch ( $stat["mode"] & ezcArchiveStatMode::S_IFMT )
        {
            case ezcArchiveStatMode::S_IFIFO:
                return ezcArchiveEntry::IS_FIFO;

            case ezcArchiveStatMode::S_IFCHR:
                return ezcArchiveEntry::IS_CHARACTER_DEVICE;

            case ezcArchiveStatMode::S_IFDIR:
                return ezcArchiveEntry::IS_DIRECTORY;

            case ezcArchiveStatMode::S_IFBLK:
                return ezcArchiveEntry::IS_BLOCK_DEVICE;

            case ezcArchiveStatMode::S_IFREG:
                return ezcArchiveEntry::IS_FILE;

            case ezcArchiveStatMode::S_IFLNK:
                return ezcArchiveEntry::IS_SYMBOLIC_LINK;

            // Hardlinks are not resolved here. FIXME?
        }

        return false;
    }
}
?>
PKPa�\�<��(pear/ezc/Archive/interfaces/callback.phpnu�[���<?php
/**
 * File containing the ezcArchiveCallback class
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Class containing a basic implementation of the callback class to be called
 * through extract.
 *
 * @package Archive
 * @version 1.4.1
 */
abstract class ezcArchiveCallback
{
    /**
     * Callback that's called for every file creation.
     *
     * The callback implementation is allowed to modify the $permissions,
     * $userId and $groupId. The latter two however might not have any
     * effect depending on which user and group the code runs at.
     *
     * @param string $fileName
     * @param int    $permissions
     * @param string $userId
     * @param string $groupId
     */
    function createFileCallback( $fileName, &$permissions, &$userId, &$groupId )
    {
    }

    /**
     * Callback that's called for every directory creation.
     *
     * The callback implementation is allowed to modify the $permissions,
     * $userId and $groupId. The latter two however might not have any
     * effect depending on which user and group the code runs at. You also need
     * to be aware that subsequent files might be put into this directory, and
     * bad things might happen when they can not be created there due to
     * operating system level restrictions.
     *
     * @param string $dirName
     * @param int    $permissions
     * @param string $userId
     * @param string $groupId
     */
    function createDirectoryCallback( $dirName, &$permissions, &$userId, &$groupId )
    {
    }
}
?>
PKQa�\Ԣ"$fIfI$pear/ezc/Archive/file/block_file.phpnu�[���<?php
/**
 * File contains the ezcArchiveBlockFile class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveBlockFile class provides an interface for reading from and writing to a block file.
 *
 * A block file is a file that consist of zero or more blocks. Each block has a predefined amount
 * of bytes known as the block-size. The block file implements the Iterator interface. Via the methods
 *
 * - key()
 * - valid()
 * - current()
 * - rewind()
 *
 * can single blocks be accessed. The append(), appendToCurrent() method, appends and possibly removes
 * blocks from and to the file.
 *
 * The block-file takes the necessary measurements to read and write to a compressed stream.
 *
 * The following example stores 16 bytes in 4 blocks. The current() points to the second block: 1.
 * <code>
 *  ---- ---- ---- ----
 * |0 1 | 5 6| 9 0| 3 4|
 * |2 4 | 7 8| 1 2| 5 6|
 *  ---- ---- ---- ----
 *   0    1    2    3
 *
 *        ^         ^
 *        |         \ LastBlock
 *
 *     Current
 * </code>
 *
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveBlockFile extends ezcArchiveFile
{
    /**
     * The block size.
     *
     * @var int
     */
    private $blockSize;

    /**
     * The current number of the block.
     *
     * The first block starts with zero.
     *
     * @var int
     */
    private $blockNumber = -1;

    /**
     * The current block data.
     *
     * @var string
     */
    private $blockData;

    /**
     * Holds the last block number.
     *
     * @var int
     */
    private $lastBlock = -1;

    /**
     * Sets the property $name to $value.
     *
     * Because there are no properties available, this method will always
     * throw an {@link ezcBasePropertyNotFoundException}.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @param mixed $value
     * @return void
     * @ignore
     */
    public function __set( $name, $value )
    {
        throw new ezcBasePropertyNotFoundException( $name );
    }

    /**
     * Returns the property $name.
     *
     * Available read-only property: blockSize
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @return mixed
     * @ignore
     */
    public function __get( $name )
    {
        switch ( $name )
        {
            case "blockSize":
                return $this->blockSize;
        }

        throw new ezcBasePropertyNotFoundException( $name );
    }

    /**
     * Constructs a new ezcArchiveBlockFile.
     *
     * The given file name is tried to be opened in read / write mode. If that fails, the file will be opened
     * in read-only mode.
     *
     * If the bool $createIfNotExist is set to true, it will create the file if it doesn't exist.
     *
     * @throws ezcBaseFileNotFoundException if the file cannot be found.
     * @throws ezcBaseFilePermissionException if the file permissions are wrong.
     *
     * @param string $fileName
     * @param bool $createIfNotExist
     * @param int $blockSize
     * @param bool $readOnly
     */
    public function __construct( $fileName, $createIfNotExist = false, $blockSize = 512, $readOnly = false )
    {
        $this->blockSize = $blockSize;

        $this->openFile( $fileName, $createIfNotExist, $readOnly );
    }


    /**
     * The destructor will close all open files.
     */
    public function __destruct()
    {
        if ( $this->fp )
        {
            fclose( $this->fp );
        }
    }

    /**
     * Rewind the current file.
     *
     * @return void
     */
    public function rewind()
    {
        $this->blockNumber = -1;

        parent::rewind();
    }

    /**
     * Return the data from the current block if the block is valid.
     *
     * If the block is not valid, the value false is returned.
     *
     * @return string
     */
    public function current()
    {
        return ( $this->isValid ? $this->blockData : false );
    }

    /**
     * Iterate to the next block.
     *
     * Returns the data of the next block if it exists; otherwise returns false.
     *
     * @return string
     */
    public function next()
    {
        if ( $this->isValid  )
        {
            // XXX move the calc to readmode?
            // $this->switchReadMode( ( $this->blockNumber + 1 ) * $this->blockSize );

            // Read one block.
            $this->blockData = fread( $this->fp, $this->blockSize );

            if ( strlen( $this->blockData ) < $this->blockSize )
            {
                if ( $this->lastBlock != -1 )
                {
                    if ( $this->blockNumber != $this->lastBlock )
                    {
                        throw new ezcArchiveInternalException( "Something weird happened with the blockNumber. Lastblock number registered at " . $this->lastBlock . " but changed into " . $this->blockNumber );
                    }
                }
                $this->lastBlock = $this->blockNumber;
                $this->isValid = false;
                return false;
            }
            $this->blockNumber++;

            return $this->blockData;
        }

        return false;
    }

    /**
     * Returns the key, the current block number of the current element.
     *
     * The first block has the number zero.
     *
     * @return int
     */
    public function key()
    {
        return ( $this->isValid ? $this->blockNumber : false );
    }

    /**
     * Returns true if the current block is valid, otherwise false.
     *
     * @return bool
     */
    public function valid()
    {
        return $this->isValid;
    }

    /**
     * Returns true if the current block is a null block, otherwise false.
     *
     * A null block is a block consisting of only NUL characters.
     * If the current block is invalid, this method will return false.
     *
     * @return bool
     */
    public function isNullBlock()
    {
        if ( $this->isValid )
        {
            for ( $i = 0; $i < $this->blockSize; $i++ )
            {
                if ( ord( $this->blockData[$i] ) != 0 )
                {
                    return false;
                }
            }
            return true;
        }

        return false;
    }

    /**
     * Appends with truncate.
     */
    private function appendTruncate()
    {
        if ( $this->fileAccess == self::READ_ONLY )
        {
            throw new ezcBaseFilePermissionException( $this->fileName, ezcBaseFilePermissionException::WRITE, "The archive is opened in a read-only mode." );
        }

        if ( !$this->isEmpty && $this->isValid )
        {
            $needToTruncate = true;
            $currentBlock = $this->blockNumber;
            // Do we need to truncate the file?

            // Check if we already read the entire file. This way is quicker to check.
            if ( $this->lastBlock != -1 )
            {
                // Last block is known.
                if ( $this->lastBlock == $this->blockNumber )
                {
                    // We are at the last block.
                    $needToTruncate = false;
                }
            }
            else
            {
                // The slower method. Check if we can read the next block.
                if ( !$this->next() )
                {
                    // We got a next block.
                    $needToTruncate = false;
                }
            }

            if ( $needToTruncate )
            {
                if ( $this->fileAccess == self::READ_APPEND )
                {
                    // Sorry, don't know how to truncate this file (except copying everything).
                    throw new ezcArchiveException( "Cannot truncate the file" );
                }

                if ( $this->blockNumber < $this->lastBlock )
                {
                    throw new ezcArchiveInternalException( "Expected to be at the last block." );
                }
                $pos = $currentBlock * $this->blockSize;
                ftruncate( $this->fp, $pos );

                $this->lastBlock = $currentBlock;
                $this->blockNumber = $currentBlock;
            }
        }
        else
        {
            if ( !$this->isEmpty && !$this->isValid )
            {
                throw new ezcArchiveInternalException( "Not at a valid block position to append" );
            }
        }
    }

    /**
     * Appends the string $data after the current block.
     *
     * The blocks after the current block are removed and the $data will be
     * appended. The data will always be appended after the current block.
     * To replace the data from the first block, the truncate() method should
     * be called first.
     *
     * Multiple blocks will be written when the length of the $data exceeds
     * the block size. If the data doesn't fill an entire block, the rest
     * of the block will be filled with NUL characters.
     *
     * @param   string  $data  Data that should be appended.
     * @return int        The total amount of blocks added.
     *
     * @throws  ezcBaseFilePermissionException when the file is opened in read-only mode.
     */
    public function append( $data )
    {
        $this->appendTruncate();

        // We are at the end of the file. Let's append the data.
        // Switch write mode, if needed.
        $this->switchWriteMode();

        $dataLength = sizeof( $data );
        $length = $this->writeBytes( $data );

        if ( ( $mod = ( $length % $this->blockSize ) ) > 0 )
        {
            $this->writeBytes( pack( "a". ( $this->blockSize  - $mod ), "" ) );
        }

        $addedBlocks = ( (int) (($length - 1) / $this->blockSize ) ) + 1;

        // Added the blocks.
        $this->isModified = true;
        $this->isEmpty = false;

        $this->blockNumber += $addedBlocks;
        $this->lastBlock += $addedBlocks;
        $this->blockData = $data;
        $this->isValid = true;

        $this->switchReadMode();

        return $addedBlocks;
    }

    /**
     * Appends the data from the given file $fileName to the current block file.
     *
     * The blocks after the current block are removed and the data will be
     * appended. The data will always be appended after the current block.
     * To replace the data from the first block, the truncate() method should
     * be called first.
     *
     * Multiple blocks will be written when the length of the data exceeds
     * the block size. If the data doesn't fill an entire block, the rest
     * of the block will be filled with NUL characters.
     *
     * @param   string  $fileName  The filename that contains the data.
     * @return int                 The total amount of blocks added.
     *
     * @throws  ezcBaseFilePermissionException when the file is opened in read-only mode.
     */
    public function appendFile( $fileName )
    {
        $this->appendTruncate();

        $this->switchWriteMode();

        $localFile = @fopen( $fileName, "rb" );
        if ( !$localFile )
        {
            throw new ezcArchiveException( "Cannot open the file '{$fileName}' for reading." );
        }

        $addedBlocks = 0;
        $length = 0;
        while ( !feof( $localFile ) && ( $data = fread( $localFile, $this->blockSize ) ) !== false )
        {
            $addedBlocks++;
            $length = $this->writeBytes( $data );
        }

        if ( ( $mod = ( $length % $this->blockSize ) ) > 0 )
        {
            $this->writeBytes( pack( "a". ( $this->blockSize  - $mod ), "" ) );
        }

        fclose( $localFile );

        // Added the blocks.
        $this->isModified = true;
        $this->isEmpty = false;

        $this->blockNumber += $addedBlocks;
        $this->lastBlock += $addedBlocks;
        $this->blockData = $data;
        $this->isValid = true;

        $this->switchReadMode();

        return $addedBlocks;
    }

    /**
     * Write the given string $data to the current file.
     *
     * This method tries to write the $data to the file. Upon failure, this method
     * will retry, until no progress is made anymore. And eventually it will throw
     * an exception. Sometimes an (invalid) interrupt may stop the writing process.
     *
     * @throws ezcBaseFileIoException if it is not possible to write to the file.
     *
     * @param string $data
     * @return void
     */
    protected function writeBytes( $data )
    {
        $dl = strlen( $data );
        if ( $dl == 0 )
        {
            return; // No bytes to write.
        }

        $wl = fwrite( $this->fp, $data );

        // Partly written? For example an interrupt can occur when writing a remote file.
        while ( $dl > $wl && $wl != 0 )
        {
            // retry, until no progress is made.
            $data = substr( $data, $wl );

            $dl = strlen( $data );
            $wl = fwrite( $this->fp, $data );
        }

        if ( $wl == 0 )
        {
            throw new ezcBaseFileIoException ( $this->fileName, ezcBaseFileIoException::WRITE, "Retried to write, but no progress was made. Disk full?" );
        }

        return $wl;
    }

    /**
     * Appends one block with only NUL characters to the file.
     *
     * @throws ezcBaseFilePermissionException if the file is opened in read-only mode.
     * @apichange Rename to appendNullBlocks
     *
     * @param int $amount
     * @return void
     */
    public function appendNullBlock( $amount = 1 )
    {
        $this->append( pack( "a". ( $amount * $this->blockSize ), "" ) );
    }

    /**
     * Truncate the current block file to $block blocks.
     *
     * If $blocks is zero, the entire block file will be truncated. After the file is truncated,
     * make sure the current block position is valid. So, do a rewind() after
     * truncating the entire block file.
     *
     * @param int $blocks
     * @return void
     */
    public function truncate( $blocks = 0 )
    {
        // Empty files don't need to be truncated.
        if ( $this->isEmpty() )
        {
            return true;
        }

        if ( $this->fileAccess !== self::READ_APPEND )
        {
            // We can read-write in the file. Easy.
            $pos = $blocks * $this->blockSize;
            ftruncate( $this->fp, $pos );
            $this->isModified = true;
            if ( $pos == 0 )
            {
                $this->isEmpty = true;
            }

            if ( $this->blockNumber >= $blocks )
            {
                $this->isValid = false;
            }

            $this->lastBlock = $blocks - 1;

            return true;
        }

        // Truncate at the end?
        if ( !$this->isValid )
        {
            $this->rewind();
        }

        while ( $this->isValid && $blocks > $this->blockNumber )
        {
            $this->next();
        }

        if ( $this->isValid )
        {
            throw new ezcArchiveInternalException( "Failed to truncate the file" );
        }

        return true;
    }

    /**
     * Sets the current block position.
     *
     * The new position is obtained by adding the $blockOffset amount of blocks to
     * the position specified by $whence.
     *
     * These values are:
     *  SEEK_SET: The first block,
     *  SEEK_CUR: The current block position,
     *  SEEK_END: The last block.
     *
     * The blockOffset can be negative.
     *
     * @param int $blockOffset
     * @param int $whence
     * @return void
     */
    public function seek( $blockOffset, $whence = SEEK_SET )
    {
        if ( $this->fileAccess == self::WRITE_ONLY && $blockOffset == 0 && $whence == SEEK_END )
        {
            return true;
        }

        if ( ftell( $this->fp ) === false || $this->fileAccess == self::READ_APPEND )
        {
            // Okay, cannot tell the current file position.
            // This happens with some compression streams.

            if ( !$this->isValid )
            {
                if ( $whence == SEEK_CUR )
                {
                    throw new ezcArchiveException( "Cannot seek SEEK_CUR with an invalid block position" );
                }

                $this->rewind();
            }

            if ( $whence == SEEK_END && $this->lastBlock == -1 )
            {
                // Go to the end.
                while ( $this->next() );
            }

            switch ( $whence )
            {
                case SEEK_CUR:
                    $searchBlock = $this->blockNumber += $blockOffset;
                    break;

                case SEEK_END:
                    $searchBlock = $this->lastBlock += $blockOffset;
                    break;

                case SEEK_SET:
                    $searchBlock = $blockOffset;
                    break;
            }

            if ( $searchBlock < $this->blockNumber )
            {
                $this->rewind();
            }

            while ( $this->isValid && $this->blockNumber < $searchBlock )
            {
                $this->next();
            }

            return ( $this->blockNumber == $searchBlock );
        }
        else
        {
            $this->isValid = true;

            $pos = $this->blockSize * $blockOffset;
            if ( $whence == SEEK_END || $whence == SEEK_CUR )
            {
                if ( !$this->isEmpty() )
                {
                    $pos -= $this->blockSize;
                }
            }

            if ( !( $whence == SEEK_SET && $pos == ftell( $this->fp ) ) )
            {
                $this->positionSeek( $pos, $whence );
            }

            if ( ftell( $this->fp ) === false )
            {
                throw new ezcArchiveException( "Cannot tell the current position, but this is after the position seek. " );
            }

            $this->blockNumber = $this->getBlocksFromBytes( ftell( $this->fp ) ) - 1;
            $this->next(); // Will set isValid to false, if blockfile is empty.
        }
    }

    /**
     * Calculates the blocks for the given $bytes.
     *
     * @param  int $bytes
     * @return int
     */
    public function getBlocksFromBytes( $bytes )
    {
        return (int) ceil ($bytes  / $this->blockSize );
    }

    /**
     * Returns true if the blockfile is empty, otherwise false.
     *
     * @return bool
     */
    public function isEmpty()
    {
        return $this->isEmpty;
    }

    /**
     * Returns the last block number.
     *
     * @return int
     */
    public function getLastBlockNumber()
    {
        return $this->lastBlock;
    }
}
?>
PKQa�\$�^�3�3pear/ezc/Archive/file/file.phpnu�[���<?php
/**
 * File containing the ezcArchiveFile class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveFile should implement the common interface between the
 * ezcArchiveBlockFile and ezcArchiveCharacterFile.
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
abstract class ezcArchiveFile implements Iterator
{
    /**
     * The file is read-only.
     * The file permissions can be set to read-only or file is compressed with a
     * stream that can only be read. E.g. bzip2.
     */
    const READ_ONLY   = 1;

    /**
     * The file is write-only.
     * The file permissions can be set to write-only or file should be compressed with a
     * stream that can only write. E.g. bzip2.
     */
    const WRITE_ONLY  = 2;

    /**
     * The file is either read or append mode.
     * Some compressed streams (zlib) do not support reading and writing. But seperate reading
     * and appending does work.
     */
    const READ_APPEND = 3;

    /**
     * The file is opened in a read and write mode.
     */
    const READ_WRITE  = 4;

    /**
     * The mode the file is opened in. It has one of the following constant values:
     * READ_ONLY, WRITE_ONLY, READ_APPEND, or READ_WRITE.
     *
     * @var int
     */
    protected $fileAccess = null;

    /**
     * The current resource of the opened file.
     * If the file is closed, this resource should point to NULL.
     *
     * @var resource
     */
    protected $fp = null;

    /**
     * The name of the file.
     *
     * @var string
     */
    protected $fileName;

    /**
     * True when the current file does not have any blocks, otherwise false.
     *
     * @var boolean
     */
    protected $isEmpty;

    /**
     * True if the file-pointer supports seeking, otherwise false.
     * For example, files that use the bzip2 stream cannot seek.
     *
     * @var boolean
     */
    protected $fileMetaData;

    /**
     * True when the current block is valid, otherwise false.
     *
     * @var boolean
     */
    protected $isValid = false;

    /**
     * Read-mode for the archive file.
     */
    const SWITCH_READ = 0;

    /**
     * Append-mode for the archive file.
     */
    const SWITCH_APPEND = 1;

    /**
     * Switch for read-mode and append-mode.
     *
     * @var int
     */
    protected $readAppendSwitch;

    /**
     * Is the file new.
     *
     * @var bool
     */
    protected $isNew;

    /**
     * Is the file modified.
     *
     * @var bool
     */
    protected $isModified;

    /**
     * Opens the specified archive.
     *
     * If $createIfNotExist is true, then the file will be created if it does
     * not exist.
     *
     * @param string $fileName
     * @param bool $createIfNotExist
     * @param bool $readOnly
     * @return bool
     */
    protected function openFile( $fileName, $createIfNotExist, $readOnly = false )
    {
        if ( !$readOnly && $createIfNotExist && !self::fileExists( $fileName ) )
        {
            $this->isNew = true;
            $this->isEmpty = true;
            if ( !self::touch( $fileName ) )
            {
                throw new ezcBaseFilePermissionException( self::getPureFileName( $fileName ), ezcBaseFilePermissionException::WRITE );
            }
        }
        else
        {
            $this->isNew = false;
        }

        // Try to open it in read and write mode.
        $opened = false;
        if ( !$readOnly ) 
        {
            $this->fp = @fopen( $fileName, "r+b" );
            if ( $this->fp )
            {
                $this->fileAccess = self::READ_WRITE;
                $opened = true;
            }
        }

        if ( !$opened )
        {
            // Try to open it in read-only mode.
            $this->fp = @fopen( $fileName, "rb" );
            $this->fileAccess = self::READ_ONLY;

            // Check if we opened the file.
            if ( !$this->fp )
            {
                if ( !self::fileExists( $fileName ) )
                {
                    throw new ezcBaseFileNotFoundException( $fileName );
                }

                // Cannot read the file.
                throw new ezcBaseFilePermissionException( $fileName, ezcBaseFilePermissionException::READ );
            }
        }

        $this->fileMetaData = stream_get_meta_data( $this->fp );

        // Hardcode BZip2 to read-only.
        // For some reason we can open the file in read-write mode, but we cannot rewind the fp. Strange..
        if ( $this->fileMetaData["wrapper_type"] == "BZip2" )
        {
            $this->fileAccess = self::READ_ONLY;
        }

        // Why is it read only?
        if ( !$readOnly && $this->fileAccess == self::READ_ONLY )
        {
            if ( $this->fileMetaData["wrapper_type"] == "ZLIB" || $this->fileMetaData["wrapper_type"] == "BZip2" )
            {
                // Append mode available?
                $b = @fopen( $fileName, "ab" );
                if ( $b !== false )
                {
                    // We have also a write-only mode.
                    fclose( $b );

                    // The file is either read-only or write-only.
                    $this->fileAccess = self::READ_APPEND;
                    $this->readAppendSwitch = self::SWITCH_READ;
                }
                else
                {
                    // Maybe we should write only to the archive.
                    // Test this only, when the archive is new.

                    if ( $this->isNew )
                    {
                        $b = @fopen( $fileName, "wb" );
                        if ( $b !== false )
                        {
                            // XXX Clean up.
                            $this->fp = $b;

                            $this->isEmpty = true;
                            $this->fileAccess = self::WRITE_ONLY;

                            $this->fileName = $fileName;
                            $this->isModified = false;

                            return true;
                        }
                    }
                }
            }
        }

        // Check if the archive is empty.
        if ( fgetc( $this->fp ) === false )
        {
            $this->isEmpty = true;
        }
        else
        {
            $this->rewind();
            $this->isEmpty = false;
        }

        $this->fileName = $fileName;
        $this->isModified = false;
    }

    /**
     * Returns the file name or file path.
     *
     * @return string
     */
    public function getFileName()
    {
        return $this->fileName;
    }

    /**
     * Switch to write mode.
     */
    public function switchWriteMode()
    {
        // Switch only when we are in read (only) mode.
        if ( $this->fileAccess == self::READ_APPEND && $this->readAppendSwitch == self::SWITCH_READ )
        {
            fclose( $this->fp );
            $this->fp = @fopen( $this->fileName, "ab" );
            if ( $this->fp === false )
            {
                throw new ezcBaseFilePermissionException( self::getPureFileName( $this->fileName ), ezcBaseFilePermissionException::WRITE, "Cannot switch to write mode" );
            }
            $this->readAppendSwitch = self::SWITCH_APPEND;
        }
    }

    /**
     * Switch to read mode.
     *
     * @param int $pos Position to seek to; not used
     */
    public function switchReadMode( $pos = 0 )
    {
        // Switch only when we are in write (only) mode.
        if ( $this->fileAccess == self::READ_APPEND && $this->readAppendSwitch == self::SWITCH_APPEND )
        {
            fclose( $this->fp );

            $this->fp = fopen( $this->fileName, "rb" );

            if ( $this->fp === false )
            {
                throw new ezcBaseFilePermissionException( self::getPureFileName( $this->fileName ), ezcBaseFilePermissionException::READ, "Cannot switch back to read mode" );
            }
            $this->readAppendSwitch = self::SWITCH_READ;

            $this->positionSeek( 0, SEEK_END );

            // Doesn't Make sense, Seek-end should be at the end!
            while ( fgetc( $this->fp ) !== false );
        }
    }

    /**
     * Returns if the file access is in append mode.
     *
     * @return bool
     */
    public function isReadOnlyWriteOnlyStream()
    {
        return $this->fileAccess == self::READ_APPEND;
    }



    /**
     * Touches the specified file (sets the access and modification time).
     *
     * PHP system touch doesn't work correctly with the compress.zlib file.
     *
     * @param string $fileName
     * @return bool
     */
    public static function touch( $fileName )
    {
        return touch( self::getPureFileName( $fileName ) );
    }

    /**
     * Returns if the specified file exists.
     *
     * @param string $fileName
     * @return bool
     */
    public static function fileExists( $fileName )
    {
        return file_exists( self::getPureFileName( $fileName ) );
    }

    /**
     * Returns the specified file name without any filters or compression stream.
     *
     * @param string $fileName
     * @return string
     */
    private static function getPureFileName( $fileName )
    {
        // TODO: Multistream goes wrong.
        if ( strncmp( $fileName, "compress.zlib://", 16 ) == 0 )
        {
            return substr( $fileName, 16 );
        }

        if ( strncmp( $fileName, "compress.bzip2://", 17 ) == 0 )
        {
            return substr( $fileName, 17 );
        }

        return $fileName;
    }

    /**
     * Rewind the current file, and the current() method will return the
     * data from the first block, if available.
     */
    public function rewind()
    {
        if ( !is_null( $this->fp ) )
        {
            $this->isValid = true;

            if ( !$this->fileMetaData["seekable"] )
            {
                fclose( $this->fp );
                $this->fp = fopen( $this->fileMetaData["uri"], $this->fileMetaData["mode"] );
            }
            else
            {
                rewind( $this->fp );
            }

            $this->next();
        }
        else
        {
            $this->isValid = false;
        }
    }

    /**
     * Seeks in the file to/by the specified position.
     *
     * Ways of seeking ($whence):
     * - SEEK_SET - $pos is absolute, seek to that position in the file
     * - SEEK_CUR - $pos is relative, seek by $pos bytes from the current position
     *
     * @throws ezcArchiveException
     *         if trying to use SEEK_END for $whence
     * @param int $pos
     * @param int $whence
     * @return int If seek was successful or not
     */
    protected function positionSeek( $pos, $whence = SEEK_SET )
    {
        // Seek the end of the file in a write only file always succeeds.
        if ( $this->fileAccess == self::WRITE_ONLY && $pos == 0 && $whence == SEEK_END )
        {
            return true;
        }

        if ( $this->fileMetaData["seekable"] )
        {
            /**
             * Ugh, for some reason fseek starts throwing warnings for
             * zlib streams with SEEK_END. And there is no way to know this
             * upfront, so we need to use @ here. #fail.
             */
            return @fseek( $this->fp, $pos, $whence );
        }
        else
        {
            switch ( $whence )
            {
                case SEEK_SET:
                    $transPos = $pos;
                    break;

                case SEEK_CUR:
                    $transPos = $pos + ftell( $this->fp );
                    break;

                case SEEK_END:
                    throw new ezcArchiveException( "SEEK_END in a non-seekable file is not supported (yet)." );
            }

            $cur = ftell( $this->fp );
            if ( $transPos <  $cur )
            {
                fclose( $this->fp );
                $this->fp = fopen( $this->fileMetaData["uri"], $this->fileMetaData["mode"] );

                $cur = 0;
            }

            for ( $i = $cur; $i < $transPos; $i++ )
            {
                $c = fgetc( $this->fp );
                if ( $c === false )
                {
                    return -1;
                }
            }

            return 0;
        }
    }

    /**
     * Returns the current file access mode.
     *
     * @var int
     */
    public function getFileAccess()
    {
        return $this->fileAccess;
    }

    /**
     * Returns if the file is in read-only mode.
     *
     * @var bool
     */
    public function isReadOnly()
    {
        return $this->fileAccess == self::READ_ONLY;
    }

    /**
     * Returns if the file is new.
     *
     * @var bool
     */
    public function isNew()
    {
        return $this->isNew;
    }

    /**
     * Returns if the file is modified.
     *
     * @var bool
     */
    public function isModified()
    {
        return $this->isModified;
    }

    /**
     * Closes the file.
     */
    public function close()
    {
        if ( is_resource( $this->fp ) )
        {
            fclose( $this->fp );
            $this->fp = null;
        }
    }
}
?>
PKRa�\�cp'
(
((pear/ezc/Archive/file/character_file.phpnu�[���<?php
/**
 * File contains the ezcArchiveCharacterFile class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @access private
 */

/**
 * The ezcArchiveCharacterFile class provides an interface for reading from and writing to a file.
 *
 * The file is opened via in constructor and closed via the destructor.
 *
 * The iterator functionality can be used to read characters from and append characters to the file,
 * so it has the same behaviour as the {@link ezcArchiveBlockFile}.
 *
 * @package Archive
 * @version 1.4.1
 * @access private
 */
class ezcArchiveCharacterFile extends ezcArchiveFile
{
    /**
     * The current character.
     *
     * @todo FIXME
     *
     * @var string
     */
    private $character;

    /**
     * The current character position.
     *
     * @var int
     */
    private $position;

    /**
     * Sets the property $name to $value.
     *
     * Because there are no properties available, this method will always
     * throw an {@link ezcBasePropertyNotFoundException}.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @param mixed $value
     * @return void
     * @ignore
     */
    public function __set( $name, $value )
    {
        throw new ezcBasePropertyNotFoundException( $name );
    }

    /**
     * Returns the property $name.
     *
     * Because there are no properties available, this method will always
     * throw an {@link ezcBasePropertyNotFoundException}.
     *
     * @throws ezcBasePropertyNotFoundException if the property does not exist.
     * @param string $name
     * @return mixed
     * @ignore
     */
    public function __get( $name )
    {
        throw new ezcBasePropertyNotFoundException( $name );
    }

    /**
     * Constructs a new ezcArchiveBlockFile.
     *
     * The given file name is tried to be opened in read / write mode.
     * If that fails, the file will be opened in read-only mode.
     *
     * If the bool $createIfNotExist is set to true, it will create the file if
     * it doesn't exist.
     *
     * @throws ezcArchiveException if the file cannot be found or opened for any reason.
     *
     * @param string $fileName
     * @param bool $createIfNotExist
     * @param bool $readOnly
     */
    public function __construct( $fileName, $createIfNotExist = false, $readOnly = false )
    {
        $this->openFile( $fileName, $createIfNotExist, $readOnly );
        $this->rewind();
    }

    /**
     * The destructor will close all open files.
     */
    public function __destruct()
    {
        if ( $this->fp )
        {
            fclose( $this->fp );
        }
    }

    /**
     * Rewinds the current file.
     *
     * @return void
     */
    public function rewind()
    {
        parent::rewind();

        $this->position = -1;
    }

    /**
     * Returns the current character if available.
     *
     * If the character is not available, the value false is returned.
     *
     * @return string
     */
    public function current()
    {
        return ( $this->isValid ? $this->character : false );
    }

    /**
     * Iterates to the next character.
     *
     * Returns the next character if it exists; otherwise returns false.
     *
     * @return string
     */
    public function next()
    {
        if ( $this->isValid  )
        {
            $this->character = fgetc( $this->fp );

            if ( $this->character === false )
            {
                $this->isValid = false;
                return false;
            }

            $this->position++;
            return $this->character;
        }

        return false;
    }

    /**
     * Returns the current position.
     *
     * The first position has the value zero.
     *
     * @return int
     */
    public function key()
    {
        return ( $this->isValid ? ftell( $this->fp ) - 1 : false );
    }

    /**
     * Returns the file-pointer position.
     *
     * @todo FIXME Is this or the key() function needed?
     *
     * return int
     */
    public function getPosition()
    {
        return ftell( $this->fp );
    }

    /**
     * Returns true if the current character is valid, otherwise false.
     *
     * @return bool
     */
    public function valid()
    {
        return $this->isValid;
    }

    /**
     * Appends the string $data after the current position.
     *
     * The character(s) after the current position are removed and the $data will be
     * appended.
     * To start from the beginning of the file, call first the truncate() method.
     *
     * @throws  ezcBaseFilePermissionException if the file is opened in read-only mode.
     *
     * @param  string $data
     * @return int
     */
    public function append( $data )
    {
        if ( $this->fileAccess == self::READ_ONLY )
        {
            throw new ezcBaseFilePermissionException( $this->fileName, ezcBaseFilePermissionException::WRITE, "The archive is opened in a read-only mode." );
        }

        $pos = ftell( $this->fp );
        ftruncate( $this->fp, $pos );
        $length = $this->writeBytes( $data );

        $this->isValid = true;
        if ( $this->isEmpty )
        {
            rewind( $this->fp );
            $this->next();
        }
        else
        {
            $this->positionSeek( $pos, SEEK_SET );
        }

        $this->isEmpty = false;

        return $length;
    }

    /**
     * Writes the given string $data to the current file.
     *
     * This method tries to write the $data to the file. Upon failure, this method
     * will retry, until no progress is made anymore. And eventually it will throw
     * an exception.
     *
     * @throws ezcBaseFileIoException if it is not possible to write to the file.
     *
     * @param string $data
     * @return void
     */
    protected function writeBytes( $data )
    {
        $dl = strlen( $data );
        if ( $dl == 0 )
        {
            return; // No bytes to write.
        }

        $wl = fwrite( $this->fp, $data );

        // Partly written? For example an interrupt can occur when writing a remote file.
        while ( $dl > $wl && $wl != 0 )
        {
            // retry, until no progress is made.
            $data = substr( $data, $wl );

            $dl = strlen( $data );
            $wl = fwrite( $this->fp, $data );
        }

        if ( $wl == 0 )
        {
            throw new ezcBaseFileIoException ( $this->fileName, ezcBaseFileIoException::WRITE, "Retried to write, but no progress was made. Disk full?" );
        }

        return $wl;
    }

    /**
     * Truncates the current file to the number of characters $position.
     *
     * If $position is zero, the entire block file will be truncated. After the file is truncated,
     * make sure the current block position is valid. So, do a rewind() after
     * truncating the entire block file.
     *
     * @param int $position
     * @return void
     */
    public function truncate( $position = 0 )
    {
        ftruncate( $this->fp, $position );

        if ( $position == 0 )
        {
            $this->isEmpty = true;
        }

        if ( $this->position > $position )
        {
            $this->isValid = false;
        }
    }

    /**
     * Sets the current character position.
     *
     * Sets the current character position. The new position is obtained by adding
     * the $offset amount of characters to the position specified by $whence.
     *
     * These values are:
     *  SEEK_SET: The first character,
     *  SEEK_CUR: The current character position,
     *  SEEK_END: The last character.
     *
     * The blockOffset can be negative.
     *
     * @param int $offset
     * @param int $whence
     * @return void
     */
    public function seek( $offset, $whence = SEEK_SET )
    {
        $this->isValid = true;

        $pos = $offset;
        /*
        if ( $whence == SEEK_END || $whence == SEEK_CUR )
        {
            if ( !$this->isEmpty() )
            {
                $pos -= 1;
            }
        }
         */


        if ( $this->positionSeek( $pos, $whence ) == -1 )
        {
            $this->isValid = false;
        }

        $this->position = $pos - 1;
        $this->next(); // Will set isValid to false, if blockfile is empty.
    }

    /**
     * Returns true if the file is empty, otherwise false.
     *
     * @return bool
     */
    public function isEmpty()
    {
        return $this->isEmpty;
    }

    /**
     * Reads current character plus extra. Forward the current pointer.
     *
     * @param int $bytes
     * @return string
     */
    public function read( $bytes )
    {
        if ( $bytes < 1 )
        {
            return false;
        }

        $data = $this->character;
        if ( $bytes == 1 )
        {
            $this->next();
            return $data;
        }

        $data .= fread( $this->fp, $bytes - 1 );

        $this->position += $bytes - 1;

        if ( $data === false )
        {
           $this->isValid = false;
           return false;
        }
        else
        {
            $this->next();
        }
        return $data;
    }

    /**
     * Writes the specified data and returns the length of the written data.
     *
     * FIXME, maybe valid() when at the eof.
     * FIXME. Write current character plus extra.
     * FIXME.. slow.
     *
     * @throws ezcBaseFilePermissionException
     *         if the file access is read-only
     * @param string $data
     * @return int
     */
    public function write( $data )
    {
        if ( $this->fileAccess == self::READ_ONLY )
        {
            throw new ezcBaseFilePermissionException( $this->fileName, ezcBaseFilePermissionException::WRITE, "The archive is opened in a read-only mode." );
        }

        $pos = ftell( $this->fp );
        if ( $this->valid() )
        {
            $pos--;
        }

        fseek( $this->fp, $pos );
        ftruncate( $this->fp, $pos );
        $length = $this->writeBytes( $data );

        $this->isValid = false;
        $this->isEmpty = false;

        return $length;
    }
}
?>
PKRa�\�����,pear/ezc/Archive/exceptions/unknown_type.phpnu�[���<?php
/**
 * File containing the ezcArchiveUnknownTypeException class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Exception thrown when encountering an archive of an unknow type.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveUnknownTypeException extends ezcArchiveException
{
    /**
     * Constructs a new unknown type exception for the specified archive.
     *
     * @param string $archiveName
     */
    public function __construct( $archiveName )
    {
        parent::__construct( "The type of the archive '{$archiveName}' cannot be determined." );
    }
}
?>
PKRa�\}�H���2pear/ezc/Archive/exceptions/internal_exception.phpnu�[���<?php
/**
 * File containing the ezcArchiveInternalException class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Exception used when an internal errors occurs in the Archive component.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveInternalException extends ezcArchiveException
{
    /**
     * Construct an internal archive exception.
     *
     * @param string $message
     */
    public function __construct( $message )
    {
        parent::__construct( "Internal error: " . $message );
    }
}
?>
PKRa�\�L��<<%pear/ezc/Archive/exceptions/empty.phpnu�[���<?php
/**
 * File containing the ezcArchiveEmptyException class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Exception for when an archive is empty.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveEmptyException extends ezcArchiveException
{
    /**
     * Constructs a new exception for empty archive.
     */
    public function __construct()
    {
        parent::__construct( "The archive is empty." );
    }
}
?>
PKSa�\�0dii*pear/ezc/Archive/exceptions/block_size.phpnu�[���<?php
/**
 * File containing the ezcArchiveBlockSizeException class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Exception will be thrown when the block-size of an archive is invalid.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveBlockSizeException extends ezcArchiveException
{
    /**
     * Constructs a new block-size exception for the specified archive.
     *
     * @param string $archiveName
     * @param string $msg
     */
    public function __construct( $archiveName, $msg = null )
    {
        $default = "The archive '{$archiveName}' has an invalid block size.";

        if ( $msg !== null )
        {
            $default .= " {$msg}";
        }

        parent::__construct( $default );
    }
}
?>
PKSa�\�9+II"pear/ezc/Archive/exceptions/io.phpnu�[���<?php
/**
 * File containing the ezcArchiveIoException class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Exception thrown when an IO error occurs.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveIoException extends ezcArchiveException
{
    /**
     * Constructs a new IO exception.
     *
     * @param string $message
     */
    public function __construct( $message )
    {
        parent::__construct( $message );
    }
}
?>
PKTa�\&Y���(pear/ezc/Archive/exceptions/checksum.phpnu�[���<?php
/**
 * File containing the ezcArchiveChecksumException class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Exception will be thrown when the checksum of the file is invalid.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveChecksumException extends ezcArchiveException
{
    /**
     * Constructs a new checksum exception for the specified file.
     *
     * @param string $file
     */
    public function __construct( $file )
    {
        parent::__construct( "The checksum of the file '{$file}' is invalid." );
    }
}
?>
PKTa�\ �����,pear/ezc/Archive/exceptions/entry_prefix.phpnu�[���<?php
/**
 * File containing the ezcArchiveEntryPrefixException class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * An exception for an invalid prefix of a file entry.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveEntryPrefixException extends ezcArchiveException
{
    /**
     * Constructs a new entry prefix exception for the specified file entry.
     *
     * @param string $prefix
     * @param string $fileName
     */
    public function __construct( $prefix, $fileName )
    {
        parent::__construct( "The prefix '{$prefix}' from the file entry '{$fileName}' is invalid." );
    }
}
?>
PKUa�\�N�8TT%pear/ezc/Archive/exceptions/value.phpnu�[���<?php
/**
 * File containing the ezcArchiveValueException class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Exception thrown when encountering a wrong archive value.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveValueException extends ezcArchiveException
{
    /**
     * Construct an archive exception.
     *
     * If $expectedValue is provided then it will be included in the exception
     * message thrown.
     *
     * @param mixed $value
     * @param mixed $expectedValue
     */
    public function __construct( $value, $expectedValue = null )
    {
        $type = gettype( $value );
        if ( in_array( $type, array( 'array', 'object', 'resource' ) ) )
        {
            $value = serialize( $value );
        }

        $msg = "The value '{$value}' is incorrect.";
        if ( $expectedValue )
        {
            $msg .= " Allowed values are: " . $expectedValue . '.';
        }
        parent::__construct( $msg );
    }
}
?>
PKUa�\�G��MM)pear/ezc/Archive/exceptions/exception.phpnu�[���<?php
/**
 * File containing the ezcArchiveException class.
 *
 * @package Archive
 * @version 1.4.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * General exception class for the Archive package.
 *
 * @package Archive
 * @version 1.4.1
 */
class ezcArchiveException extends ezcBaseException
{
    /**
     * Construct a new archive exception.
     *
     * @param string $message
     */
    public function __construct( $message )
    {
        parent::__construct( $message );
    }
}
?>
PKVa�\|R��.pear/ezc/Base/structs/repository_directory.phpnu�[���<?php
/**
 * File containing the ezcBaseRepositoryDirectory.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Struct which defines a repository directory.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseRepositoryDirectory extends ezcBaseStruct
{
    /**
     * Specifies that the entry is for the eZ Components repository.
     */
    const TYPE_INTERNAL = 0;

    /**
     * Specifies that the entry is for an external (user defined) repository.
     */
    const TYPE_EXTERNAL = 1;

    /**
     * The $type is one of the two TYPE_* constants defined in this class.
     *
     * @var string
     */
    public $type;

    /**
     * The path to the configured repository.
     *
     * @var string
     */
    public $basePath;

    /**
     * The path to the autoload files.
     *
     * @var string
     */
    public $autoloadPath;

    /**
     * Constructs a new ezcBaseRepositoryDirectory of type $type with base path
     * $basePath and autoload path $autoloadPath.
     *
     * @param string $type
     * @param string $basePath
     * @param string $autoloadPath
     */
    public function __construct( $type, $basePath, $autoloadPath )
    {
        $this->type = $type;
        $this->basePath = $basePath;
        $this->autoloadPath = $autoloadPath;
    }

    /**
     * Returns a new instance of this class with the data specified by $array.
     *
     * $array contains all the data members of this class in the form:
     * array('member_name'=>value).
     *
     * __set_state makes this class exportable with var_export.
     * var_export() generates code, that calls this method when it
     * is parsed with PHP.
     *
     * @param array(string=>mixed) $array
     * @return ezcBaseRepositoryDirectory
     */
    static public function __set_state( array $array )
    {
        return new ezcBaseRepositoryDirectory( $array['type'], $array['basePath'], $array['autoloadPath'] );
    }
}
?>
PKVa�\S�،��+pear/ezc/Base/structs/file_find_context.phpnu�[���<?php
/**
 * File containing the ezcBaseFileFindContext class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Struct which defines the information collected by the file walker for locating files.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseFileFindContext extends ezcBaseStruct
{
    /**
     * The list of files
     *
     * @var array(string)
     */
    public $elements;

    /**
     * The number of files
     *
     * @var int
     */
    public $count;

    /**
     * The total file size of all files found
     *
     * @var int
     */
    public $size;

    /**
     * Constructs a new ezcBaseFileFindContext with initial values.
     *
     * @param array(string) $elements
     * @param int $count
     * @param int $size
     */
    public function __construct( $elements = array(), $count = 0, $size = 0 )
    {
        $this->elements = $elements;
        $this->count = $count;
        $this->size = $size;
    }

    /**
     * Returns a new instance of this class with the data specified by $array.
     *
     * $array contains all the data members of this class in the form:
     * array('member_name'=>value).
     *
     * __set_state makes this class exportable with var_export.
     * var_export() generates code, that calls this method when it
     * is parsed with PHP.
     *
     * @param array(string=>mixed) $array
     * @return ezcBaseFileFindContext
     */
    static public function __set_state( array $array )
    {
        return new ezcBaseFileFindContext( $array['elements'], $array['count'], $array['size'] );
    }
}
?>
PKVa�\�����"pear/ezc/Base/options/autoload.phpnu�[���<?php
/**
 * File containing the ezcBaseAutoloadOptions class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Class containing the basic options for ezcBase' autoload.
 *
 * @property bool $preload
 *           If component preloading is enabled then as soon as one of the
 *           classes of a component is request, all other classes in the
 *           component are loaded as well (except for Exception classes).
 * @property bool $debug
 *           If debug is enabled then the autoload method will show exceptions
 *           when a class can not be found. Because exceptions are ignored by
 *           PHP in the autoload handler, you have to catch them in autoload()
 *           yourself and do something with the exception message.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseAutoloadOptions extends ezcBaseOptions
{
    /**
     * Constructs an object with the specified values.
     *
     * @throws ezcBasePropertyNotFoundException
     *         if $options contains a property not defined
     * @throws ezcBaseValueException
     *         if $options contains a property with a value not allowed
     * @param array(string=>mixed) $options
     */
    public function __construct( array $options = array() )
    {
        $this->preload = false;
        $this->debug = false;

        parent::__construct( $options );
    }

    /**
     * Sets the option $name to $value.
     *
     * @throws ezcBasePropertyNotFoundException
     *         if the property $name is not defined
     * @throws ezcBaseValueException
     *         if $value is not correct for the property $name
     * @param string $name
     * @param mixed $value
     * @ignore
     */
    public function __set( $name, $value )
    {
        switch ( $name )
        {
            case 'debug':
            case 'preload':
                if ( !is_bool( $value ) )
                {
                    throw new ezcBaseValueException( $name, $value, 'bool' );
                }
                $this->properties[$name] = $value;
                break;

            default:
                throw new ezcBasePropertyNotFoundException( $name );
        }
    }
}
?>
PKWa�\UJX��pear/ezc/Base/options.phpnu�[���<?php
/**
 * File containing the ezcBaseOptions class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Base options class for all eZ components.
 *
 * @package Base
 * @version 1.8
 */
abstract class ezcBaseOptions implements ArrayAccess
{
    /**
     * Container to hold the properties
     *
     * @var array(string=>mixed)
     */
    protected $properties;

    /**
     * Construct a new options object.
     * Options are constructed from an option array by default. The constructor
     * automatically passes the given options to the __set() method to set them
     * in the class.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If trying to access a non existent property.
     * @throws ezcBaseValueException
     *         If the value for a property is out of range.
     * @param array(string=>mixed) $options The initial options to set.
     */
    public function __construct( array $options = array() )
    {
        foreach ( $options as $option => $value )
        {
            $this->__set( $option, $value );
        }
    }

    /**
     * Merge an array into the actual options object.
     * This method merges an array of new options into the actual options object.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If trying to access a non existent property.
     * @throws ezcBaseValueException
     *         If the value for a property is out of range.
     * @param array(string=>mixed) $newOptions The new options.
     */
    public function merge( array $newOptions )
    {
        foreach ( $newOptions as $key => $value )
        {
            $this->__set( $key, $value );
        }
    }

    /**
     * Property get access.
     * Simply returns a given option.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If a the value for the property options is not an instance of
     * @param string $propertyName The name of the option to get.
     * @return mixed The option value.
     * @ignore
     *
     * @throws ezcBasePropertyNotFoundException
     *         if the given property does not exist.
     * @throws ezcBasePropertyPermissionException
     *         if the property to be set is a write-only property.
     */
    public function __get( $propertyName )
    {
        if ( $this->__isset( $propertyName ) === true )
        {
            return $this->properties[$propertyName];
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }

    /**
     * Sets an option.
     * This method is called when an option is set.
     *
     * @param string $propertyName  The name of the option to set.
     * @param mixed $propertyValue The option value.
     * @ignore
     *
     * @throws ezcBasePropertyNotFoundException
     *         if the given property does not exist.
     * @throws ezcBaseValueException
     *         if the value to be assigned to a property is invalid.
     * @throws ezcBasePropertyPermissionException
     *         if the property to be set is a read-only property.
     */
    abstract public function __set( $propertyName, $propertyValue );

    /**
     * Returns if a option exists.
     *
     * @param string $propertyName Option name to check for.
     * @return bool Whether the option exists.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        return array_key_exists( $propertyName, $this->properties );
    }

    /**
     * Returns if an option exists.
     * Allows isset() using ArrayAccess.
     *
     * @param string $propertyName The name of the option to get.
     * @return bool Whether the option exists.
     */
    public function offsetExists( $propertyName )
    {
        return $this->__isset( $propertyName );
    }

    /**
     * Returns an option value.
     * Get an option value by ArrayAccess.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If $propertyName is not a key in the $properties array.
     * @param string $propertyName The name of the option to get.
     * @return mixed The option value.
     */
    public function offsetGet( $propertyName )
    {
        return $this->__get( $propertyName );
    }

    /**
     * Set an option.
     * Sets an option using ArrayAccess.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If $propertyName is not a key in the $properties array.
     * @throws ezcBaseValueException
     *         If the value for a property is out of range.
     * @param string $propertyName The name of the option to set.
     * @param mixed $propertyValue The value for the option.
     */
    public function offsetSet( $propertyName, $propertyValue )
    {
        $this->__set( $propertyName, $propertyValue );
    }

    /**
     * Unset an option.
     * Unsets an option using ArrayAccess.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If $propertyName is not a key in the $properties array.
     * @throws ezcBaseValueException
     *         If a the value for a property is out of range.
     * @param string $propertyName The name of the option to unset.
     */
    public function offsetUnset( $propertyName )
    {
        $this->__set( $propertyName, null );
    }
}
?>
PKWa�\PBs|��6pear/ezc/Base/interfaces/configuration_initializer.phpnu�[���<?php
/**
 * File containing the ezcBaseConfigurationInitializer class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * This class provides the interface that classes need to implement to act as
 * an callback initializer class to work with the delayed initialization
 * mechanism.
 *
 * @package Base
 * @version 1.8
 */
interface ezcBaseConfigurationInitializer
{
    /**
     * Configures the given object, or returns the proper object depending on
     * the given identifier.
     *
     * In case a string identifier was given, it should return the associated
     * object, in case an object was given the method should return null.
     *
     * @param string|object $object
     * @return mixed
     */
    static public function configureObject( $object );
}
?>
PKWa�\��/��(pear/ezc/Base/interfaces/persistable.phpnu�[���<?php
/**
 * File containing the ezcBasePersistable interface
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * This class provides the interface that classes need to implement to be able
 * to be used by the PersistentObject and Search components.
 *
 * @package Base
 * @version 1.8
 */
interface ezcBasePersistable
{
    /**
     * The constructor for the object needs to be able to accept no arguments.
     *
     * The data is later set through the setState() method.
     */
    public function __construct();

    /**
     * Returns all the object's properties so that they can be stored or indexed.
     *
     * @return array(string=>mixed)
     */
    public function getState();

    /**
     * Accepts an array containing data for one or more of the class' properties.
     *
     * @param array $properties
     */
    public function setState( array $properties );
}
?>
PKXa�\4�ei��'pear/ezc/Base/interfaces/exportable.phpnu�[���<?php
/**
 * File containing the ezcBaseExportable interface.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * Interface for class of which instances can be exported using var_export().
 *
 * In some components, objects can be stored (e.g. to disc) using the var_export() 
 * function. To ensure that an object supports proper importing again, this 
 * interface should be implemented.
 *
 * @see var_export()
 */
interface ezcBaseExportable
{
    /**
     * Returns an instance of the desired object, initialized from $state.
     *
     * This method must return a new instance of the class it is implemented 
     * in, which has its properties set from the given $state array.
     *
     * @param array $state 
     * @return object
     */
    public static function __set_state( array $state );
}

?>
PKXa�\��4QEQEpear/ezc/Base/file.phpnu�[���<?php
/**
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.8
 * @filesource
 * @package Base
 */

/**
 * Provides a selection of static independent methods to provide functionality
 * for file and file system handling.
 *
 * This example shows how to use the findRecursive method:
 * <code>
 * <?php
 * // lists all the files under /etc (including subdirectories) that end in
 * // .conf
 * $confFiles = ezcBaseFile::findRecursive( "/etc", array( '@\.conf$@' ) );
 *
 * // lists all autoload files in the components source tree and excludes the
 * // ones in the autoload subdirectory. Statistics are returned in the $stats
 * // variable which is passed by reference.
 * $files = ezcBaseFile::findRecursive(
 *     "/dat/dev/ezcomponents",
 *     array( '@src/.*_autoload.php$@' ),
 *     array( '@/autoload/@' ),
 *     $stats
 * );
 *
 * // lists all binaries in /bin except the ones starting with a "g"
 * $data = ezcBaseFile::findRecursive( "/bin", array(), array( '@^/bin/g@' ) );
 * ?>
 * </code>
 *
 * @package Base
 * @version 1.8
 * @mainclass
 */
class ezcBaseFile
{
    /**
     * This is the callback used by findRecursive to collect data.
     *
     * This callback method works together with walkRecursive() and is called
     * for every file/and or directory. The $context is a callback specific
     * container in which data can be stored and shared between the different
     * calls to the callback function. The walkRecursive() function also passes
     * in the full absolute directory in $sourceDir, the filename in $fileName
     * and file information (such as size, modes, types) as an array as
     * returned by PHP's stat() in the $fileInfo parameter.
     *
     * @param ezcBaseFileFindContext $context
     * @param string $sourceDir
     * @param string $fileName
     * @param array(stat) $fileInfo
     */
    static protected function findRecursiveCallback( ezcBaseFileFindContext $context, $sourceDir, $fileName, $fileInfo )
    {
        // ignore if we have a directory
        if ( $fileInfo['mode'] & 0x4000 )
        {
            return;
        }

        // update the statistics
        $context->elements[] = $sourceDir . DIRECTORY_SEPARATOR . $fileName;
        $context->count++;
        $context->size += $fileInfo['size'];
    }

    /**
     * Walks files and directories recursively on a file system
     *
     * This method walks over a directory and calls a callback from every file
     * and directory it finds. You can use $includeFilters to include only
     * specific files, and $excludeFilters to exclude certain files from being
     * returned. The function will always go into subdirectories even if the
     * entry would not have passed the filters.
     *
     * The callback is passed in the $callback parameter, and the
     * $callbackContext will be send to the callback function/method as
     * parameter so that you can store data in there that persists with all the
     * calls and recursive calls to this method. It's up to the callback method
     * to do something useful with this. The callback function's parameters are
     * in order:
     *
     * <ul>
     * <li>ezcBaseFileFindContext $context</li>
     * <li>string $sourceDir</li>
     * <li>string $fileName</li>
     * <li>array(stat) $fileInfo</li>
     * </ul>
     *
     * See {@see findRecursiveCallback()} for an example of a callback function.
     *
     * Filters are regular expressions and are therefore required to have
     * starting and ending delimiters. The Perl Compatible syntax is used as
     * regular expression language.
     *
     * @param string         $sourceDir
     * @param array(string)  $includeFilters
     * @param array(string)  $excludeFilters
     * @param callback       $callback
     * @param mixed          $callbackContext
     *
     * @throws ezcBaseFileNotFoundException if the $sourceDir directory is not
     *         a directory or does not exist.
     * @throws ezcBaseFilePermissionException if the $sourceDir directory could
     *         not be opened for reading.
     * @return array
     */
    static public function walkRecursive( $sourceDir, array $includeFilters = array(), array $excludeFilters = array(), $callback, &$callbackContext )
    {
        if ( !is_dir( $sourceDir ) )
        {
            throw new ezcBaseFileNotFoundException( $sourceDir, 'directory' );
        }
        $elements = array();
        $d = @dir( $sourceDir );
        if ( !$d )
        {
            throw new ezcBaseFilePermissionException( $sourceDir, ezcBaseFileException::READ );
        }

        while ( ( $entry = $d->read() ) !== false )
        {
            if ( $entry == '.' || $entry == '..' )
            {
                continue;
            }

            $fileInfo = @stat( $sourceDir . DIRECTORY_SEPARATOR . $entry );
            if ( !$fileInfo )
            {
                $fileInfo = array( 'size' => 0, 'mode' => 0 );
            }

            if ( $fileInfo['mode'] & 0x4000 )
            {
                // We need to ignore the Permission exceptions here as it can
                // be normal that a directory can not be accessed. We only need
                // the exception if the top directory could not be read.
                try
                {
                    call_user_func_array( $callback, array( $callbackContext, $sourceDir, $entry, $fileInfo ) );
                    $subList = self::walkRecursive( $sourceDir . DIRECTORY_SEPARATOR . $entry, $includeFilters, $excludeFilters, $callback, $callbackContext );
                    $elements = array_merge( $elements, $subList );
                }
                catch ( ezcBaseFilePermissionException $e )
                {
                }
            }
            else
            {
                // By default a file is included in the return list
                $ok = true;
                // Iterate over the $includeFilters and prohibit the file from
                // being returned when atleast one of them does not match
                foreach ( $includeFilters as $filter )
                {
                    if ( !preg_match( $filter, $sourceDir . DIRECTORY_SEPARATOR . $entry ) )
                    {
                        $ok = false;
                        break;
                    }
                }
                // Iterate over the $excludeFilters and prohibit the file from
                // being returns when atleast one of them matches
                foreach ( $excludeFilters as $filter )
                {
                    if ( preg_match( $filter, $sourceDir . DIRECTORY_SEPARATOR . $entry ) )
                    {
                        $ok = false;
                        break;
                    }
                }

                // If everything's allright, call the callback and add the
                // entry to the elements array
                if ( $ok )
                {
                    call_user_func( $callback, $callbackContext, $sourceDir, $entry, $fileInfo );
                    $elements[] = $sourceDir . DIRECTORY_SEPARATOR . $entry;
                }
            }
        }
        sort( $elements );
        return $elements;
    }

    /**
     * Finds files recursively on a file system
     *
     * With this method you can scan the file system for files. You can use
     * $includeFilters to include only specific files, and $excludeFilters to
     * exclude certain files from being returned. The function will always go
     * into subdirectories even if the entry would not have passed the filters.
     * It uses the {@see walkRecursive()} method to do the actually recursion.
     *
     * Filters are regular expressions and are therefore required to have
     * starting and ending delimiters. The Perl Compatible syntax is used as
     * regular expression language.
     *
     * If you pass an empty array to the $statistics argument, the function
     * will in details about the number of files found into the 'count' array
     * element, and the total filesize in the 'size' array element. Because this
     * argument is passed by reference, you *have* to pass a variable and you
     * can not pass a constant value such as "array()".
     *
     * @param string         $sourceDir
     * @param array(string)  $includeFilters
     * @param array(string)  $excludeFilters
     * @param array()        $statistics
     *
     * @throws ezcBaseFileNotFoundException if the $sourceDir directory is not
     *         a directory or does not exist.
     * @throws ezcBaseFilePermissionException if the $sourceDir directory could
     *         not be opened for reading.
     * @return array
     */
    static public function findRecursive( $sourceDir, array $includeFilters = array(), array $excludeFilters = array(), &$statistics = null )
    {
        // init statistics array
        if ( !is_array( $statistics ) || !array_key_exists( 'size', $statistics ) || !array_key_exists( 'count', $statistics ) )
        {
            $statistics['size']  = 0;
            $statistics['count'] = 0;
        }

        // create the context, and then start walking over the array
        $context = new ezcBaseFileFindContext;
        self::walkRecursive( $sourceDir, $includeFilters, $excludeFilters, array( 'ezcBaseFile', 'findRecursiveCallback' ), $context );

        // collect the statistics
        $statistics['size'] = $context->size;
        $statistics['count'] = $context->count;

        // return the found and pattern-matched files
        sort( $context->elements );
        return $context->elements;
    }


    /**
     * Removes files and directories recursively from a file system
     *
     * This method recursively removes the $directory and all its contents.
     * You should be <b>extremely</b> careful with this method as it has the
     * potential to erase everything that the current user has access to.
     *
     * @param string $directory
     */
    static public function removeRecursive( $directory )
    {
        $sourceDir = realpath( $directory );
        if ( !$sourceDir )
        {
            throw new ezcBaseFileNotFoundException( $directory, 'directory' );
        }
        $d = @dir( $sourceDir );
        if ( !$d )
        {
            throw new ezcBaseFilePermissionException( $directory, ezcBaseFileException::READ );
        }
        // check if we can remove the dir
        $parentDir = realpath( $directory . DIRECTORY_SEPARATOR . '..' );
        if ( !is_writable( $parentDir ) )
        {
            throw new ezcBaseFilePermissionException( $parentDir, ezcBaseFileException::WRITE );
        }
        // loop over contents
        while ( ( $entry = $d->read() ) !== false )
        {
            if ( $entry == '.' || $entry == '..' )
            {
                continue;
            }

            if ( is_dir( $sourceDir . DIRECTORY_SEPARATOR . $entry ) )
            {
                self::removeRecursive( $sourceDir . DIRECTORY_SEPARATOR . $entry );
            }
            else
            {
                if ( @unlink( $sourceDir . DIRECTORY_SEPARATOR . $entry ) === false )
                {
                    throw new ezcBaseFilePermissionException( $directory . DIRECTORY_SEPARATOR . $entry, ezcBaseFileException::REMOVE );
                }
            }
        }
        $d->close();
        rmdir( $sourceDir );
    }

    /**
    * Recursively copy a file or directory.
    *
    * Recursively copy a file or directory in $source to the given
    * destination. If a depth is given, the operation will stop, if the given
    * recursion depth is reached. A depth of -1 means no limit, while a depth
    * of 0 means, that only the current file or directory will be copied,
    * without any recursion.
    *
    * You may optionally define modes used to create files and directories.
    *
    * @throws ezcBaseFileNotFoundException
    *      If the $sourceDir directory is not a directory or does not exist.
    * @throws ezcBaseFilePermissionException
    *      If the $sourceDir directory could not be opened for reading, or the
    *      destination is not writeable.
    *
    * @param string $source
    * @param string $destination
    * @param int $depth
    * @param int $dirMode
    * @param int $fileMode
    * @return void
    */
    static public function copyRecursive( $source, $destination, $depth = -1, $dirMode = 0775, $fileMode = 0664 )
    {
        // Check if source file exists at all.
        if ( !is_file( $source ) && !is_dir( $source ) )
        {
            throw new ezcBaseFileNotFoundException( $source );
        }

        // Destination file should NOT exist
        if ( is_file( $destination ) || is_dir( $destination ) )
        {
            throw new ezcBaseFilePermissionException( $destination, ezcBaseFileException::WRITE );
        }

        // Skip non readable files in source directory
        if ( !is_readable( $source ) )
        {
            return;
        }

        // Copy
        if ( is_dir( $source ) )
        {
            mkdir( $destination );
            // To ignore umask, umask() should not be changed with
            // multithreaded servers...
            chmod( $destination, $dirMode );
        }
        elseif ( is_file( $source ) )
        {
            copy( $source, $destination );
            chmod( $destination, $fileMode );
        }

        if ( ( $depth === 0 ) ||
            ( !is_dir( $source ) ) )
        {
            // Do not recurse (any more)
            return;
        }

        // Recurse
        $dh = opendir( $source );
        while ( ( $file = readdir( $dh ) ) !== false )
        {
            if ( ( $file === '.' ) ||
                ( $file === '..' ) )
            {
                continue;
            }

            self::copyRecursive(
                $source . '/' . $file,
                $destination . '/' . $file,
                $depth - 1, $dirMode, $fileMode
            );
        }
    }

    /**
     * Calculates the relative path of the file/directory '$path' to a given
     * $base path.
     *
     * $path and $base should be fully absolute paths. This function returns the
     * answer of "How do I go from $base to $path". If the $path and $base are
     * the same path, the function returns '.'. This method does not touch the
     * filesystem.
     *
     * @param string $path
     * @param string $base
     * @return string
     */
    static public function calculateRelativePath( $path, $base )
    {
        // Sanitize the paths to use the correct directory separator for the platform
        $path = strtr( $path, '\\/', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR );
        $base = strtr( $base, '\\/', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR );

        $base = explode( DIRECTORY_SEPARATOR, $base );
        $path = explode( DIRECTORY_SEPARATOR, $path );

        // If the paths are the same we return
        if ( $base === $path )
        {
            return '.';
        }

        $result = '';

        $pathPart = array_shift( $path );
        $basePart = array_shift( $base );
        while ( $pathPart == $basePart )
        {
            $pathPart = array_shift( $path );
            $basePart = array_shift( $base );
        }

        if ( $pathPart != null )
        {
            array_unshift( $path, $pathPart );
        }
        if ( $basePart != null )
        {
            array_unshift( $base, $basePart );
        }

        $result = str_repeat( '..' . DIRECTORY_SEPARATOR, count( $base ) );
        // prevent a trailing DIRECTORY_SEPARATOR in case there is only a ..
        if ( count( $path ) == 0 )
        {
            $result = substr( $result, 0, -strlen( DIRECTORY_SEPARATOR ) );
        }
        $result .= join( DIRECTORY_SEPARATOR, $path );

        return $result;
    }

    /**
     * Returns whether the passed $path is an absolute path, giving the current $os.
     *
     * With the $os parameter you can tell this function to use the semantics
     * for a different operating system to determine whether a path is
     * absolute. The $os argument defaults to the OS that the script is running
     * on.
     *
     * @param string $path
     * @param string $os
     * @return bool
     */
    public static function isAbsolutePath( $path, $os = null )
    {
        if ( $os === null )
        {
            $os = ezcBaseFeatures::os();
        }

        // Stream wrapper like phar can also be considered absolute paths
        if ( preg_match( '(^[a-z]{3,}://)S', $path ) )
        {
            return true;
        }

        switch ( $os )
        {
            case 'Windows':
                // Sanitize the paths to use the correct directory separator for the platform
                $path = strtr( $path, '\\/', '\\\\' );

                // Absolute paths with drive letter: X:\
                if ( preg_match( '@^[A-Z]:\\\\@i', $path ) )
                {
                    return true;
                }

                // Absolute paths with network paths: \\server\share\
                if ( preg_match( '@^\\\\\\\\[A-Z]+\\\\[^\\\\]@i', $path ) )
                {
                    return true;
                }
                break;
            case 'Mac':
            case 'Linux':
            case 'FreeBSD':
            default:
                // Sanitize the paths to use the correct directory separator for the platform
                $path = strtr( $path, '\\/', '//' );

                if ( $path[0] == '/' )
                {
                    return true;
                }
        }
        return false;
    }
}
?>
PKXa�\��<�V�Vpear/ezc/Base/base.phpnu�[���<?php
/**
 * File containing the ezcBase class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * Base class implements the methods needed to use the eZ components.
 *
 * @package Base
 * @version 1.8
 * @mainclass
 */
class ezcBase
{
    /**
     * Used for dependency checking, to check for a PHP extension.
     */
    const DEP_PHP_EXTENSION = "extension";

    /**
     * Used for dependency checking, to check for a PHP version.
     */
    const DEP_PHP_VERSION = "version";

    /**
     * Denotes the production mode
     */
    const MODE_PRODUCTION = 0;

    /**
     * Denotes the development mode
     */
    const MODE_DEVELOPMENT = 1;

    /**
     * Indirectly it determines the path where the autoloads are stored.
     *
     * @var string
     */
    private static $libraryMode = "pear";

    /**
     * Contains the current working directory, which is used when the
     * $libraryMode is set to "custom".
     *
     * @var string
     */
    private static $currentWorkingDirectory = null;

    /**
     * The full path to the autoload directory.
     *
     * @var string
     */
    protected static $packageDir = null;

    /**
     * Contains which development mode is used. It's "development" by default,
     * because of backwards compatibility reasons.
     */
    private static $runMode = self::MODE_DEVELOPMENT;

    /**
     * Stores info with additional paths where autoload files and classes for
     * autoloading could be found. Each item of $repositoryDirs looks like
     * array( autoloadFileDir, baseDir ). The array key is the prefix belonging
     * to classes within that repository - if provided when calling
     * addClassRepository(), or an autoincrement integer otherwise.
     *
     * @var array(string=>array)
     */
    protected static $repositoryDirs = array();

    /**
     * This variable stores all the elements from the autoload arrays. When a
     * new autoload file is loaded, their files are added to this array.
     *
     * @var array(string=>string)
     */
    protected static $autoloadArray = array();

    /**
     * This variable stores all the elements from the autoload arrays for
     * external repositories. When a new autoload file is loaded, their files
     * are added to this array.
     *
     * @var array(string=>string)
     */
    protected static $externalAutoloadArray = array();

    /**
     * Options for the ezcBase class.
     *
     * @var ezcBaseOptions
     */
    static private $options;

    /**
     * Associates an option object with this static class.
     *
     * @param ezcBaseAutoloadOptions $options
     */
    static public function setOptions( ezcBaseAutoloadOptions $options )
    {
        self::$options = $options;
    }

    /**
     * Tries to autoload the given className. If the className could be found
     * this method returns true, otherwise false.
     *
     * This class caches the requested class names (including the ones who
     * failed to load).
     *
     * @param string $className  The name of the class that should be loaded.
     *
     * @return bool
     */
    public static function autoload( $className )
    {
        ezcBase::setPackageDir();

        // Check whether the classname is already in the cached autoloadArray.
        if ( array_key_exists( $className, ezcBase::$autoloadArray ) )
        {
            // Is it registered as 'unloadable'?
            if ( ezcBase::$autoloadArray[$className] == false )
            {
                return false;
            }
            ezcBase::loadFile( ezcBase::$autoloadArray[$className] );

            return true;
        }

        // Check whether the classname is already in the cached autoloadArray
        // for external repositories.
        if ( array_key_exists( $className, ezcBase::$externalAutoloadArray ) )
        {
            // Is it registered as 'unloadable'?
            if ( ezcBase::$externalAutoloadArray[$className] == false )
            {
                return false;
            }
            ezcBase::loadExternalFile( ezcBase::$externalAutoloadArray[$className] );

            return true;
        }

        // Not cached, so load the autoload from the package.
        // Matches the first and optionally the second 'word' from the classname.
        $fileNames = array();
        if ( preg_match( "/^([a-z0-9]*)([A-Z][a-z0-9]*)?([A-Z][a-z0-9]*)?/", $className, $matches ) !== false )
        {
            $autoloadFile = "";
            // Try to match with both names, if available.
            switch ( sizeof( $matches ) )
            {
                case 4:
                    // check for x_y_autoload.php
                    $autoloadFile = strtolower( "{$matches[2]}_{$matches[3]}_autoload.php" );
                    $fileNames[] = $autoloadFile;
                    if ( ezcBase::requireFile( $autoloadFile, $className, $matches[1] ) )
                    {
                        return true;
                    }
                    // break intentionally missing.

                case 3:
                    // check for x_autoload.php
                    $autoloadFile = strtolower( "{$matches[2]}_autoload.php" );
                    $fileNames[] = $autoloadFile;
                    if ( ezcBase::requireFile( $autoloadFile, $className, $matches[1] ) )
                    {
                        return true;
                    }
                    // break intentionally missing.

                case 2:
                    // check for autoload.php
                    $autoloadFile = 'autoload.php';
                    $fileNames[] = $autoloadFile;
                    if ( ezcBase::requireFile( $autoloadFile, $className, $matches[1] ) )
                    {
                        return true;
                    }
                    break;
            }

            // Maybe there is another autoload available.
            // Register this classname as false.
            ezcBase::$autoloadArray[$className] = false;
        }

        $path = ezcBase::$packageDir . 'autoload/';
        $realPath = realpath( $path );

        if ( $realPath == '' )
        {
            // Can not be tested, because if this happens, then the autoload
            // environment has not been set-up correctly.
            trigger_error( "Couldn't find autoload directory '$path'", E_USER_ERROR );
        }

        $dirs = self::getRepositoryDirectories();
        if ( ezcBase::$options && ezcBase::$options->debug )
        {
            throw new ezcBaseAutoloadException( $className, $fileNames, $dirs );
        }

        return false;
    }

    /**
     * Sets the current working directory to $directory.
     *
     * @param string $directory
     */
    public static function setWorkingDirectory( $directory )
    {
        self::$libraryMode = 'custom';
        self::$currentWorkingDirectory = $directory;
    }

    /**
     * Figures out the base path of the eZ Components installation.
     *
     * It stores the path that it finds in a static member variable. The path
     * depends on the installation method of the eZ Components. The SVN version
     * has a different path than the PEAR installed version.
     */
    protected static function setPackageDir()
    {
        if ( ezcBase::$packageDir !== null )
        {
            return;
        }

        // Get the path to the components.
        $baseDir = dirname( __FILE__ );

        switch ( ezcBase::$libraryMode )
        {
            case "custom":
                ezcBase::$packageDir = self::$currentWorkingDirectory . '/';
                break;
            case "devel":
            case "tarball":
                ezcBase::$packageDir = $baseDir. "/../../";
                break;
            case "pear";
                ezcBase::$packageDir = $baseDir. "/../";
                break;
        }
    }

    /**
     * Tries to load the autoload array and, if loaded correctly, includes the class.
     *
     * @param string $fileName    Name of the autoload file.
     * @param string $className   Name of the class that should be autoloaded.
     * @param string $prefix      The prefix of the class repository.
     *
     * @return bool  True is returned when the file is correctly loaded.
     *                   Otherwise false is returned.
     */
    protected static function requireFile( $fileName, $className, $prefix )
    {
        $autoloadDir = ezcBase::$packageDir . "autoload/";

        // We need the full path to the fileName. The method file_exists() doesn't
        // automatically check the (php.ini) library paths. Therefore:
        // file_exists( "ezc/autoload/$fileName" ) doesn't work.
        if ( $prefix === 'ezc' && file_exists( "$autoloadDir$fileName" ) )
        {
            $array = require( "$autoloadDir$fileName" );

            if ( is_array( $array) && array_key_exists( $className, $array ) )
            {
                // Add the array to the cache, and include the requested file.
                ezcBase::$autoloadArray = array_merge( ezcBase::$autoloadArray, $array );
                if ( ezcBase::$options !== null && ezcBase::$options->preload && !preg_match( '/Exception$/', $className ) )
                {
                    foreach ( $array as $loadClassName => $file )
                    {
                        if ( $loadClassName !== 'ezcBase' && !class_exists( $loadClassName, false ) && !interface_exists( $loadClassName, false ) && !preg_match( '/Exception$/', $loadClassName ) /*&& !class_exists( $loadClassName, false ) && !interface_exists( $loadClassName, false )*/ )
                        {
                            ezcBase::loadFile( ezcBase::$autoloadArray[$loadClassName] );
                        }
                    }
                }
                else
                {
                    ezcBase::loadFile( ezcBase::$autoloadArray[$className] );
                }
                return true;
            }
        }

        // It is not in components autoload/ dir.
        // try to search in additional dirs.
        foreach ( ezcBase::$repositoryDirs as $repositoryPrefix => $extraDir )
        {
            if ( gettype( $repositoryPrefix ) === 'string' && $repositoryPrefix !== $prefix )
            {
                continue;
            }

            if ( file_exists( $extraDir['autoloadDirPath'] . '/' . $fileName ) )
            {
                $array = array();
                $originalArray = require( $extraDir['autoloadDirPath'] . '/' . $fileName );

                // Building paths.
                // Resulting path to class definition file consists of:
                // path to extra directory with autoload file +
                // basePath provided for current extra directory +
                // path to class definition file stored in autoload file.
                foreach ( $originalArray as $class => $classPath )
                {
                    $array[$class] = $extraDir['basePath'] . '/' . $classPath;
                }

                if ( is_array( $array ) && array_key_exists( $className, $array ) )
                {
                    // Add the array to the cache, and include the requested file.
                    ezcBase::$externalAutoloadArray = array_merge( ezcBase::$externalAutoloadArray, $array );
                    ezcBase::loadExternalFile( ezcBase::$externalAutoloadArray[$className] );
                    return true;
                }
            }
        }

        // Nothing found :-(.
        return false;
    }

    /**
     * Loads, require(), the given file name. If we are in development mode,
     * "/src/" is inserted into the path.
     *
     * @param string $file  The name of the file that should be loaded.
     */
    protected static function loadFile( $file )
    {
        switch ( ezcBase::$libraryMode )
        {
            case "devel":
            case "tarball":
                list( $first, $second ) = explode( '/', $file, 2 );
                $file = $first . "/src/" . $second;
                break;

            case "custom":
                list( $first, $second ) = explode( '/', $file, 2 );
                // Add the "src/" after the package name.
                if ( $first == 'Base' || $first == 'UnitTest' )
                {
                    list( $first, $second ) = explode( '/', $file, 2 );
                    $file = $first . "/src/" . $second;
                }
                else
                {
                    list( $first, $second, $third ) = explode( '/', $file, 3 );
                    $file = $first . '/' . $second . "/src/" . $third;
                }
                break;

            case "pear":
                /* do nothing, it's already correct */
                break;
        }

        if ( file_exists( ezcBase::$packageDir . $file ) )
        {
            require( ezcBase::$packageDir . $file );
        }
        else
        {
            // Can not be tested, because if this happens, then one of the
            // components has a broken autoload file.
            throw new ezcBaseFileNotFoundException( ezcBase::$packageDir.$file );
        }
    }

    /**
     * Loads, require(), the given file name from an external package.
     *
     * @param string $file  The name of the file that should be loaded.
     */
    protected static function loadExternalFile( $file )
    {
        if ( file_exists( $file ) )
        {
            require( $file );
        }
        else
        {
            throw new ezcBaseFileNotFoundException( $file );
        }
    }

    /**
     * Checks for dependencies on PHP versions or extensions
     *
     * The function as called by the $component component checks for the $type
     * dependency. The dependency $type is compared against the $value. The
     * function aborts the script if the dependency is not matched.
     *
     * @param string $component
     * @param int $type
     * @param mixed $value
     */
    public static function checkDependency( $component, $type, $value )
    {
        switch ( $type )
        {
            case self::DEP_PHP_EXTENSION:
                if ( extension_loaded( $value ) )
                {
                    return;
                }
                else
                {
                    // Can not be tested as it would abort the PHP script.
                    die( "\nThe {$component} component depends on the default PHP extension '{$value}', which is not loaded.\n" );
                }
                break;

            case self::DEP_PHP_VERSION:
                $phpVersion = phpversion();
                if ( version_compare( $phpVersion, $value, '>=' ) )
                {
                    return;
                }
                else
                {
                    // Can not be tested as it would abort the PHP script.
                    die( "\nThe {$component} component depends on the PHP version '{$value}', but the current version is '{$phpVersion}'.\n" );
                }
                break;
        }
    }

    /**
     * Return the list of directories that contain class repositories.
     *
     * The path to the eZ components directory is always included in the result
     * array. Each element in the returned array has the format of:
     * packageDirectory => ezcBaseRepositoryDirectory
     *
     * @return array(string=>ezcBaseRepositoryDirectory)
     */
    public static function getRepositoryDirectories()
    {
        $autoloadDirs = array();
        ezcBase::setPackageDir();
        $repositoryDir = self::$currentWorkingDirectory ? self::$currentWorkingDirectory : ( realpath( dirname( __FILE__ ) . '/../../' ) );
        $autoloadDirs['ezc'] = new ezcBaseRepositoryDirectory( ezcBaseRepositoryDirectory::TYPE_INTERNAL, $repositoryDir, $repositoryDir . "/autoload" );

        foreach ( ezcBase::$repositoryDirs as $extraDirKey => $extraDirArray )
        {
            $repositoryDirectory = new ezcBaseRepositoryDirectory( ezcBaseRepositoryDirectory::TYPE_EXTERNAL, realpath( $extraDirArray['basePath'] ), realpath( $extraDirArray['autoloadDirPath'] ) );
            $autoloadDirs[$extraDirKey] = $repositoryDirectory;
        }

        return $autoloadDirs;
    }

    /**
     * Adds an additional class repository.
     *
     * Used for adding class repositoryies outside the eZ components to be
     * loaded by the autoload system.
     *
     * This function takes two arguments: $basePath is the base path for the
     * whole class repository and $autoloadDirPath the path where autoload
     * files for this repository are found. The paths in the autoload files are
     * relative to the package directory as specified by the $basePath
     * argument. I.e. class definition file will be searched at location
     * $basePath + path to the class definition file as stored in the autoload
     * file.
     *
     * addClassRepository() should be called somewhere in code before external classes
     * are used.
     *
     * Example:
     * Take the following facts:
     * <ul>
     * <li>there is a class repository stored in the directory "./repos"</li>
     * <li>autoload files for that repository are stored in "./repos/autoloads"</li>
     * <li>there are two components in this repository: "Me" and "You"</li>
     * <li>the "Me" component has the classes "erMyClass1" and "erMyClass2"</li>
     * <li>the "You" component has the classes "erYourClass1" and "erYourClass2"</li>
     * </ul>
     *
     * In this case you would need to create the following files in
     * "./repos/autoloads". Please note that the part before _autoload.php in
     * the filename is the first part of the <b>classname</b>, not considering
     * the all lower-case letter prefix.
     *
     * "my_autoload.php":
     * <code>
     * <?php
     *     return array (
     *       'erMyClass1' => 'Me/myclass1.php',
     *       'erMyClass2' => 'Me/myclass2.php',
     *     );
     * ?>
     * </code>
     *
     * "your_autoload.php":
     * <code>
     * <?php
     *     return array (
     *       'erYourClass1' => 'You/yourclass1.php',
     *       'erYourClass2' => 'You/yourclass2.php',
     *     );
     * ?>
     * </code>
     *
     * The directory structure for the external repository is then:
     * <code>
     * ./repos/autoloads/my_autoload.php
     * ./repos/autoloads/you_autoload.php
     * ./repos/Me/myclass1.php
     * ./repos/Me/myclass2.php
     * ./repos/You/yourclass1.php
     * ./repos/You/yourclass2.php
     * </code>
     *
     * To use this repository with the autoload mechanism you have to use the
     * following code:
     * <code>
     * <?php
     * ezcBase::addClassRepository( './repos', './repos/autoloads' );
     * $myVar = new erMyClass2();
     * ?>
     * </code>
     *
     * @throws ezcBaseFileNotFoundException if $autoloadDirPath or $basePath do not exist.
     * @param string $basePath
     * @param string $autoloadDirPath
     * @param string $prefix
     */
    public static function addClassRepository( $basePath, $autoloadDirPath = null, $prefix = null )
    {
        // check if base path exists
        if ( !is_dir( $basePath ) )
        {
            throw new ezcBaseFileNotFoundException( $basePath, 'base directory' );
        }

        // calculate autoload path if it wasn't given
        if ( is_null( $autoloadDirPath ) )
        {
            $autoloadDirPath = $basePath . '/autoload';
        }

        // check if autoload dir exists
        if ( !is_dir( $autoloadDirPath ) )
        {
            throw new ezcBaseFileNotFoundException( $autoloadDirPath, 'autoload directory' );
        }

        // add info to $repositoryDirs
        if ( $prefix === null )
        {
            $array = array( 'basePath' => $basePath, 'autoloadDirPath' => $autoloadDirPath );

            // add info to the list of extra dirs
            ezcBase::$repositoryDirs[] = $array;
        }
        else
        {
            if ( array_key_exists( $prefix, ezcBase::$repositoryDirs ) )
            {
                throw new ezcBaseDoubleClassRepositoryPrefixException( $prefix, $basePath, $autoloadDirPath );
            }

            // add info to the list of extra dirs, and use the prefix to identify the new repository.
            ezcBase::$repositoryDirs[$prefix] = array( 'basePath' => $basePath, 'autoloadDirPath' => $autoloadDirPath );
        }
    }

    /**
     * Returns the base path of the eZ Components installation
     *
     * This method returns the base path, including a trailing directory
     * separator.
     *
     * @return string
     */
    public static function getInstallationPath()
    {
        self::setPackageDir();

        $path = realpath( self::$packageDir );
        if ( substr( $path, -1 ) !== DIRECTORY_SEPARATOR )
        {
            $path .= DIRECTORY_SEPARATOR;
        }
        return $path;
    }

    /**
     * Sets the development mode to the one specified.
     *
     * @param int $runMode
     */
    public static function setRunMode( $runMode )
    {
        if ( !in_array( $runMode, array( ezcBase::MODE_PRODUCTION, ezcBase::MODE_DEVELOPMENT ) ) )
        {
            throw new ezcBaseValueException( 'runMode', $runMode, 'ezcBase::MODE_PRODUCTION or ezcBase::MODE_DEVELOPMENT' );
        }

        self::$runMode = $runMode;
    }

    /**
     * Returns the current development mode.
     *
     * @return int
     */
    public static function getRunMode()
    {
        return self::$runMode;
    }

    /**
     * Returns true when we are in development mode.
     *
     * @return bool
     */
    public static function inDevMode()
    {
        return self::$runMode == ezcBase::MODE_DEVELOPMENT;
    }

    /**
     * Returns the installation method
     *
     * Possible return values are 'custom', 'devel', 'tarball' and 'pear'. Only
     * 'tarball' and 'pear' are returned for user-installed versions.
     *
     * @return string
     */
    public static function getInstallMethod()
    {
        return self::$libraryMode;
    }
}
?>
PKXa�\'P���
�
pear/ezc/Base/metadata.phpnu�[���<?php
/**
 * File containing the ezcBaseMetaData class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * Base class implements ways of fetching information about the installed
 * eZ Components. It knows whether to use the PEAR registry or the bundled XML
 * file, depending on how eZ Components is installed.
 *
 * @package Base
 * @version 1.8
 * @mainclass
 */
class ezcBaseMetaData
{
    /**
     * Creates a ezcBaseMetaData object
     *
     * The sole parameter $installMethod should only be used if you are really
     * sure that you need to use it. It is mostly there to make testing at
     * least slightly possible. Again, do not set it unless instructed.
     *
     * @param string $installMethod
     */
    public function __construct( $installMethod = NULL )
    {
        $installMethod = $installMethod !== NULL ? $installMethod : ezcBase::getInstallMethod();

        // figure out which reader to use
        switch ( $installMethod )
        {
            case 'tarball':
                $this->reader = new ezcBaseMetaDataTarballReader;
                break;
            case 'pear':
                $this->reader = new ezcBaseMetaDataPearReader;
                break;
            default:
                throw new ezcBaseMetaDataReaderException( "Unknown install method '$installMethod'." );
                break;
        }
    }

    /**
     * Returns the version string for the installed eZ Components bundle.
     *
     * A version string such as "2008.2.2" is returned.
     *
     * @return string
     */
    public function getBundleVersion()
    {
        return $this->reader->getBundleVersion();
    }

    /**
     * Returns a PHP version string that describes the required PHP version for
     * this installed eZ Components bundle.
     *
     * @return string
     */
    public function getRequiredPhpVersion()
    {
        return $this->reader->getRequiredPhpVersion();
    }

    /**
     * Returns whether $componentName is installed
     *
     * If installed with PEAR, it checks the PEAR registry whether the
     * component is there. In case the tarball installation method is used, it
     * will return true for every component that exists (because all of them
     * are then available).
     *
     * @return bool
     */
    public function isComponentInstalled( $componentName )
    {
        return $this->reader->isComponentInstalled( $componentName );
    }

    /**
     * Returns the version string of the available $componentName or false when
     * the component is not installed.
     *
     * @return string
     */
    public function getComponentVersion( $componentName )
    {
        return $this->reader->getComponentVersion( $componentName );
    }

    /**
     * Returns a list of components that $componentName depends on.
     *
     * If $componentName is left empty, all installed components are returned.
     *
     * The returned array has as keys the component names, and as values the
     * version of the components.
     *
     * @return array(string=>string).
     */
    public function getComponentDependencies( $componentName = null )
    {
        if ( $componentName === null )
        {
            return $this->reader->getComponentDependencies();
        }
        else
        {
            return $this->reader->getComponentDependencies( $componentName );
        }
    }
}
?>
PKYa�\�B�X�+�+pear/ezc/Base/features.phpnu�[���<?php
/**
 * File containing the ezcBaseFeatures class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Provides methods needed to check for features.
 *
 * Example:
 * <code>
 * <?php
 * echo "supports uid: " . ezcBaseFeatures::supportsUserId() . "\n";
 * echo "supports symlink: " . ezcBaseFeatures::supportsSymLink() . "\n";
 * echo "supports hardlink: " . ezcBaseFeatures::supportsLink() . "\n";
 * echo "has imagemagick identify: " . ezcBaseFeatures::hasImageIdentify() . "\n";
 * echo " identify path: " . ezcBaseFeatures::getImageIdentifyExecutable() . "\n";
 * echo "has imagemagick convert: " . ezcBaseFeatures::hasImageConvert() . "\n";
 * echo " convert path: " . ezcBaseFeatures::getImageConvertExecutable() . "\n";
 * echo "has gzip extension: " . ezcBaseFeatures::hasExtensionSupport( 'zlib' ) . "\n";
 * echo "has pdo_mysql 1.0.2: " . ezcBaseFeatures::hasExtensionSupport( 'pdo_mysql', '1.0.2' ) . "\n"
 * ?>
 * </code>
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseFeatures
{
    /**
      * Used to store the path of the ImageMagick convert utility.
      *
      * It is initialized in the {@link getImageConvertExecutable()} function.
      *
      * @var string
      */
    private static $imageConvert = null;

    /**
      * Used to store the path of the ImageMagick identify utility.
      *
      * It is initialized in the {@link getImageIdentifyExecutable()} function.
      *
      * @var string
      */
    private static $imageIdentify = null;

    /**
      * Used to store the operating system.
      *
      * It is initialized in the {@link os()} function.
      *
      * @var string
      */
    private static $os = null;

    /**
     * Determines if hardlinks are supported.
     *
     * @return bool
     */
    public static function supportsLink()
    {
        return function_exists( 'link' );
    }

    /**
     * Determines if symlinks are supported.
     *
     * @return bool
     */
    public static function supportsSymLink()
    {
        return function_exists( 'symlink' );
    }

    /**
     * Determines if posix uids are supported.
     *
     * @return bool
     */
    public static function supportsUserId()
    {
        return function_exists( 'posix_getpwuid' );
    }

    /**
     * Determines if the ImageMagick convert utility is installed.
     *
     * @return bool
     */
    public static function hasImageConvert()
    {
        return !is_null( self::getImageConvertExecutable() );
    }

    /**
     * Returns the path to the ImageMagick convert utility.
     *
     * On Linux, Unix,... it will return something like: /usr/bin/convert
     * On Windows it will return something like: C:\Windows\System32\convert.exe
     *
     * @return string
     */
    public static function getImageConvertExecutable()
    {
        if ( !is_null( self::$imageConvert ) )
        {
            return self::$imageConvert;
        }
        return ( self::$imageConvert = self::findExecutableInPath( 'convert' ) );
    }

    /**
     * Determines if the ImageMagick identify utility is installed.
     *
     * @return bool
     */
    public static function hasImageIdentify()
    {
        return !is_null( self::getImageIdentifyExecutable() );
    }

    /**
     * Returns the path to the ImageMagick identify utility.
     *
     * On Linux, Unix,... it will return something like: /usr/bin/identify
     * On Windows it will return something like: C:\Windows\System32\identify.exe
     *
     * @return string
     */
    public static function getImageIdentifyExecutable()
    {
        if ( !is_null( self::$imageIdentify ) )
        {
            return self::$imageIdentify;
        }
        return ( self::$imageIdentify = self::findExecutableInPath( 'identify' ) );
    }

    /**
     * Determines if the specified extension is loaded.
     *
     * If $version is specified, the specified extension will be tested also
     * against the version of the loaded extension.
     *
     * Examples:
     * <code>
     * hasExtensionSupport( 'gzip' );
     * </code>
     * will return true if gzip extension is loaded.
     *
     * <code>
     * hasExtensionSupport( 'pdo_mysql', '1.0.2' );
     * </code>
     * will return true if pdo_mysql extension is loaded and its version is at least 1.0.2.
     *
     * @param string $extension
     * @param string $version
     * @return bool
     */
    public static function hasExtensionSupport( $extension, $version = null )
    {
        if ( is_null( $version ) )
        {
            return extension_loaded( $extension );
        }
        return extension_loaded( $extension ) && version_compare( phpversion( $extension ), $version, ">=" ) ;
    }

    /**
     * Determines if the specified function is available.
     *
     * Examples:
     * <code>
     * ezcBaseFeatures::hasFunction( 'imagepstext' );
     * </code>
     * will return true if support for Type 1 fonts is available with your GD
     * extension.
     *
     * @param string $functionName
     * @return bool
     */
    public static function hasFunction( $functionName )
    {
        return function_exists( $functionName );
    }

    /**
     * Returns if a given class exists.
     * Checks for a given class name and returns if this class exists or not.
     * Catches the ezcBaseAutoloadException and returns false, if it was thrown.
     *
     * @param string $className The class to check for.
     * @param bool $autoload True to use __autoload(), otherwise false.
     * @return bool True if the class exists. Otherwise false.
     */
    public static function classExists( $className, $autoload = true )
    {
        try
        {
            if ( class_exists( $className, $autoload ) )
            {
                return true;
            }
            return false;
        }
        catch ( ezcBaseAutoloadException $e )
        {
            return false;
        }
    }

    /**
     * Returns the operating system on which PHP is running.
     *
     * This method returns a sanitized form of the OS name, example
     * return values are "Windows", "Mac", "Linux" and "FreeBSD". In
     * all other cases it returns the value of the internal PHP constant
     * PHP_OS.
     *
     * @return string
     */
    public static function os()
    {
        if ( is_null( self::$os ) )
        {
            $uname = php_uname( 's' );
            if ( substr( $uname, 0, 7 ) == 'Windows' )
            {
                self::$os = 'Windows';
            }
            elseif ( substr( $uname, 0, 3 ) == 'Mac' )
            {
                self::$os = 'Mac';
            }
            elseif ( strtolower( $uname ) == 'linux' )
            {
                self::$os = 'Linux';
            }
            elseif ( strtolower( substr( $uname, 0, 7 ) ) == 'freebsd' )
            {
                self::$os = 'FreeBSD';
            }
            else
            {
                self::$os = PHP_OS;
            }
        }
        return self::$os;
    }

    /**
     * Returns the path of the specified executable, if it can be found in the system's path.
     *
     * It scans the PATH enviroment variable based on the OS to find the
     * $fileName. For Windows, the path is with \, not /.  If $fileName is not
     * found, it returns null.
     *
     * @todo consider using getenv( 'PATH' ) instead of $_ENV['PATH']
     *       (but that won't work under IIS)
     *
     * @param string $fileName
     * @return string
     */
    public static function findExecutableInPath( $fileName )
    {
        if ( array_key_exists( 'PATH', $_ENV ) )
        {
            $envPath = trim( $_ENV['PATH'] );
        }
        else if ( ( $envPath = getenv( 'PATH' ) ) !== false )
        {
            $envPath = trim( $envPath );
        }
        if ( is_string( $envPath ) && strlen( trim( $envPath ) ) == 0 )
        {
            $envPath = false;
        }

        switch ( self::os() )
        {
            case 'Unix':
            case 'FreeBSD':
            case 'Mac':
            case 'MacOS':
            case 'Darwin':
            case 'Linux':
            case 'SunOS':
                if ( $envPath )
                {
                    $dirs = explode( ':', $envPath );
                    foreach ( $dirs as $dir )
                    {
                        // The @-operator is used here mainly to avoid
                        // open_basedir warnings. If open_basedir (or any other
                        // circumstance) prevents the desired file from being
                        // accessed, it is fine for file_exists() to return
                        // false, since it is useless for use then, anyway.
                        if ( file_exists( "{$dir}/{$fileName}" ) )
                        {
                            return "{$dir}/{$fileName}";
                        }
                    }
                }
                // The @-operator is used here mainly to avoid open_basedir
                // warnings. If open_basedir (or any other circumstance)
                // prevents the desired file from being accessed, it is fine
                // for file_exists() to return false, since it is useless for
                // use then, anyway.
                elseif ( @file_exists( "./{$fileName}" ) )
                {
                    return $fileName;
                }
                break;
            case 'Windows':
                if ( $envPath )
                {
                    $dirs = explode( ';', $envPath );
                    foreach ( $dirs as $dir )
                    {
                        // The @-operator is used here mainly to avoid
                        // open_basedir warnings. If open_basedir (or any other
                        // circumstance) prevents the desired file from being
                        // accessed, it is fine for file_exists() to return
                        // false, since it is useless for use then, anyway.
                        if ( @file_exists( "{$dir}\\{$fileName}.exe" ) )
                        {
                            return "{$dir}\\{$fileName}.exe";
                        }
                    }
                }
                // The @-operator is used here mainly to avoid open_basedir
                // warnings. If open_basedir (or any other circumstance)
                // prevents the desired file from being accessed, it is fine
                // for file_exists() to return false, since it is useless for
                // use then, anyway.
                elseif ( @file_exists( "{$fileName}.exe" ) )
                {
                    return "{$fileName}.exe";
                }
                break;
        }
        return null;
    }

    /**
     * Reset the cached information. 
     * 
     * @return void
     * @access private
     * @ignore
     */
    public static function reset()
    {
        self::$imageIdentify = null;
        self::$imageConvert  = null;
        self::$os            = null;
    }
}
?>
PKYa�\�xr44pear/ezc/Base/struct.phpnu�[���<?php
/**
 * File containing the ezcBaseStruct.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Base class for all struct classes.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseStruct
{
    /**
     * Throws a BasePropertyNotFound exception.
     *
     * @param string $name
     * @param mixed $value
     * @ignore
     */
    final public function __set( $name, $value )
    {
        throw new ezcBasePropertyNotFoundException( $name );
    }

    /**
     * Throws a BasePropertyNotFound exception.
     *
     * @param string $name
     * @ignore
     */
    final public function __get( $name )
    {
        throw new ezcBasePropertyNotFoundException( $name );
    }
}
?>
PKYa�\S]�KKpear/ezc/Base/init.phpnu�[���<?php
/**
 * File containing the ezcBaseInit class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * Provides a method to implement delayed initialization of objects.
 *
 * With the methods in this class you can implement callbacks to configure
 * singleton classes. In order to do so you will have to change the
 * getInstance() method of your singleton class to include a call to
 * ezcBaseInit::fetchConfig() as in the following example:
 *
 * <code>
 * <?php
 * public static function getInstance()
 * {
 *     if ( is_null( self::$instance ) )
 *     {
 *         self::$instance = new ezcConfigurationmanager();
 *         ezcBaseInit::fetchConfig( 'ezcInitConfigurationManager', self::$instance );
 *     }
 *     return self::$instance;
 * }
 * ?>
 * </code>
 *
 * You will also need to configure which callback class to call. This you do
 * with the ezcBaseInit::setCallback() method. The following examples sets the
 * callback classname for the configuration identifier
 * 'ezcInitConfigurationManager' to 'cfgConfigurationManager':
 *
 * <code>
 * <?php
 * ezcBaseInit::setCallback( 'ezcInitConfigurationManager', 'cfgConfigurationManager' );
 * ?>
 * </code>
 *
 * The class 'cfgConfigurationManager' is required to implement the
 * ezcBaseConfigurationInitializer interface, which defines only one method:
 * configureObject(). An example on how to implement such a class could be:
 *
 * <code>
 * <?php
 * class cfgConfigurationManager implements ezcBaseConfigurationInitializer
 * {
 *     static public function configureObject( ezcConfigurationManager $cfgManagerObject )
 *     {
 *         $cfgManagerObject->init( 'ezcConfigurationIniReader', 'settings', array( 'useComments' => true ) );
 *     }
 * }
 * ?>
 * </code>
 *
 * Of course the implementation of this callback class is up to the application
 * developer that uses the component (in this example the Configuration
 * component's class ezcConfigurationManager).
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseInit
{
    /**
     * Contains the callback where the identifier is the key of the array, and the classname to callback to the value.
     *
     * @var array(string=>string)
     */
    static private $callbackMap = array();

    /**
     * Adds the classname $callbackClassname as callback for the identifier $identifier.
     *
     * @param string $identifier
     * @param string $callbackClassname
     */
    public static function setCallback( $identifier, $callbackClassname )
    {
        if ( array_key_exists( $identifier, self::$callbackMap ) )
        {
            throw new ezcBaseInitCallbackConfiguredException( $identifier, self::$callbackMap[$identifier] );
        }
        else
        {
            // Check if the passed classname actually exists
            if ( !ezcBaseFeatures::classExists( $callbackClassname, true ) )
            {
                throw new ezcBaseInitInvalidCallbackClassException( $callbackClassname );
            }

            // Check if the passed classname actually implements the interface.
            if ( !in_array( 'ezcBaseConfigurationInitializer', class_implements( $callbackClassname ) ) )
            {
                throw new ezcBaseInitInvalidCallbackClassException( $callbackClassname );
            }

            self::$callbackMap[$identifier] = $callbackClassname;
        }
    }

    /**
     * Uses the configured callback belonging to $identifier to configure the $object.
     *
     * The method will return the return value of the callback method, or null
     * in case there was no callback set for the specified $identifier.
     *
     * @param string $identifier
     * @param object $object
     * @return mixed
     */
    public static function fetchConfig( $identifier, $object )
    {
        if ( isset( self::$callbackMap[$identifier] ) )
        {
            $callbackClassname = self::$callbackMap[$identifier];
            return call_user_func( array( $callbackClassname, 'configureObject' ), $object );
        }
        return null;
    }
}
?>
PKZa�\�%�NNpear/ezc/Base/base_autoload.phpnu�[���<?php
/**
 * Autoloader definition for the Base component.
 *
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.8
 * @filesource
 * @package Base
 */

return array(
    'ezcBaseException'                            => 'Base/exceptions/exception.php',
    'ezcBaseFileException'                        => 'Base/exceptions/file_exception.php',
    'ezcBaseAutoloadException'                    => 'Base/exceptions/autoload.php',
    'ezcBaseDoubleClassRepositoryPrefixException' => 'Base/exceptions/double_class_repository_prefix.php',
    'ezcBaseExtensionNotFoundException'           => 'Base/exceptions/extension_not_found.php',
    'ezcBaseFileIoException'                      => 'Base/exceptions/file_io.php',
    'ezcBaseFileNotFoundException'                => 'Base/exceptions/file_not_found.php',
    'ezcBaseFilePermissionException'              => 'Base/exceptions/file_permission.php',
    'ezcBaseFunctionalityNotSupportedException'   => 'Base/exceptions/functionality_not_supported.php',
    'ezcBaseInitCallbackConfiguredException'      => 'Base/exceptions/init_callback_configured.php',
    'ezcBaseInitInvalidCallbackClassException'    => 'Base/exceptions/invalid_callback_class.php',
    'ezcBaseInvalidParentClassException'          => 'Base/exceptions/invalid_parent_class.php',
    'ezcBasePropertyNotFoundException'            => 'Base/exceptions/property_not_found.php',
    'ezcBasePropertyPermissionException'          => 'Base/exceptions/property_permission.php',
    'ezcBaseSettingNotFoundException'             => 'Base/exceptions/setting_not_found.php',
    'ezcBaseSettingValueException'                => 'Base/exceptions/setting_value.php',
    'ezcBaseValueException'                       => 'Base/exceptions/value.php',
    'ezcBaseWhateverException'                    => 'Base/exceptions/whatever.php',
    'ezcBaseOptions'                              => 'Base/options.php',
    'ezcBaseStruct'                               => 'Base/struct.php',
    'ezcBase'                                     => 'Base/base.php',
    'ezcBaseAutoloadOptions'                      => 'Base/options/autoload.php',
    'ezcBaseConfigurationInitializer'             => 'Base/interfaces/configuration_initializer.php',
    'ezcBaseExportable'                           => 'Base/interfaces/exportable.php',
    'ezcBaseFeatures'                             => 'Base/features.php',
    'ezcBaseFile'                                 => 'Base/file.php',
    'ezcBaseFileFindContext'                      => 'Base/structs/file_find_context.php',
    'ezcBaseInit'                                 => 'Base/init.php',
    'ezcBaseMetaData'                             => 'Base/metadata.php',
    'ezcBaseMetaDataPearReader'                   => 'Base/metadata/pear.php',
    'ezcBaseMetaDataTarballReader'                => 'Base/metadata/tarball.php',
    'ezcBasePersistable'                          => 'Base/interfaces/persistable.php',
    'ezcBaseRepositoryDirectory'                  => 'Base/structs/repository_directory.php',
);
?>
PKZa�\HDfPEE+pear/ezc/Base/exceptions/file_not_found.phpnu�[���<?php
/**
 * File containing the ezcBaseFileNotFoundException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseFileNotFoundException is thrown when a file or directory was tried to
 * be opened, but did not exist.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseFileNotFoundException extends ezcBaseFileException
{
    /**
     * Constructs a new ezcBaseFileNotFoundException.
     *
     * @param string $path The name of the file.
     * @param string $type The type of the file.
     * @param string $message A string with extra information.
     */
    function __construct( $path, $type = null, $message = null )
    {
        $typePart = '';
        if ( $type )
        {
            $typePart = "$type ";
        }

        $messagePart = '';
        if ( $message )
        {
            $messagePart = " ($message)";
        }

        parent::__construct( "The {$typePart}file '{$path}' could not be found.$messagePart" );
    }
}
?>
PK[a�\��!���$pear/ezc/Base/exceptions/file_io.phpnu�[���<?php
/**
 * File containing the ezcBaseFileIoException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseFileIoException is thrown when a problem occurs while writing
 * and reading to/from an open file.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseFileIoException extends ezcBaseFileException
{
    /**
     * Constructs a new ezcBaseFileIoException for the file $path.
     *
     * @param string $path The name of the file.
     * @param int    $mode The mode of the property that is allowed
     *               (ezcBaseFileException::READ, ezcBaseFileException::WRITE,
     *               ezcBaseFileException::EXECUTE or
     *               ezcBaseFileException::CHANGE).
     * @param string $message A string with extra information.
     */
    function __construct( $path, $mode, $message = null )
    {
        switch ( $mode )
        {
            case ezcBaseFileException::READ:
                $operation = "An error occurred while reading from '{$path}'";
                break;
            case ezcBaseFileException::WRITE:
                $operation = "An error occurred while writing to '{$path}'";
                break;
        }

        $messagePart = '';
        if ( $message )
        {
            $messagePart = " ($message)";
        }

        parent::__construct( "$operation.$messagePart" );
    }
}
?>
PK[a�\�R�~110pear/ezc/Base/exceptions/extension_not_found.phpnu�[���<?php
/**
 * File containing the ezcBaseExtensionNotFoundException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * ezcBaseExtensionNotFoundException is thrown when a requested PHP extension was not found.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseExtensionNotFoundException extends ezcBaseException
{
    /**
     * Constructs a new ezcBaseExtensionNotFoundException.
     *
     * @param string $name The name of the extension
     * @param string $version The version of the extension
     * @param string $message Additional text
     */
    function __construct( $name, $version = null, $message = null )
    {
        if ( $version === null )
        {
            parent::__construct( "The extension '{$name}' could not be found. {$message}" );
        }
        else
        {
            parent::__construct( "The extension '{$name}' with version '{$version}' could not be found. {$message}" );
        }
    }
}
?>
PK\a�\�ם�OO.pear/ezc/Base/exceptions/setting_not_found.phpnu�[���<?php
/**
 * File containing the ezcBaseSettingNotFoundException class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseSettingNotFoundException is thrown whenever there is a name passed as
 * part as the options array to setOptions() for an option that doesn't exist.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseSettingNotFoundException extends ezcBaseException
{
    /**
     * Constructs a new ezcBaseSettingNotFoundException for $settingName.
     *
     * @param string $settingName The name of the setting that does not exist.
     */
    function __construct( $settingName )
    {
        parent::__construct( "The setting '{$settingName}' is not a valid configuration setting." );
    }
}
?>
PK\a�\��ll3pear/ezc/Base/exceptions/invalid_callback_class.phpnu�[���<?php
/**
 * File containing the ezcBaseInitInvalidCallbackClassException class
 *
 * @package Configuration
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Exception that is thrown if an invalid class is passed as callback class for
 * delayed object configuration.
 *
 * @package Configuration
 * @version 1.8
 */
class ezcBaseInitInvalidCallbackClassException extends ezcBaseException
{
    /**
     * Constructs a new ezcBaseInitInvalidCallbackClassException for the $callbackClass.
     *
     * @param string $callbackClass
     * @return void
     */
    function __construct( $callbackClass )
    {
        parent::__construct( "Class '{$callbackClass}' does not exist, or does not implement the 'ezcBaseConfigurationInitializer' interface." );
    }
}
?>
PK]a�\�@c��/pear/ezc/Base/exceptions/property_not_found.phpnu�[���<?php
/**
 * File containing the ezcBasePropertyNotFoundException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBasePropertyNotFoundException is thrown whenever a non existent property
 * is accessed in the Components library.
 *
 * @package Base
 * @version 1.8
 */
class ezcBasePropertyNotFoundException extends ezcBaseException
{
    /**
     * Constructs a new ezcBasePropertyNotFoundException for the property
     * $name.
     *
     * @param string $name The name of the property
     */
    function __construct( $name )
    {
        parent::__construct( "No such property name '{$name}'." );
    }
}
?>
PK]a�\��rr%pear/ezc/Base/exceptions/autoload.phpnu�[���<?php
/**
 * File containing the ezcBaseAutoloadException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseAutoloadException is thrown whenever a class can not be found with
 * the autoload mechanism.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseAutoloadException extends ezcBaseException
{
    /**
     * Constructs a new ezcBaseAutoloadException for the $className that was
     * searched for in the autoload files $fileNames from the directories
     * specified in $dirs.
     *
     * @param string $className
     * @param array(string) $files
     * @param array(ezcBaseRepositoryDirectory) $dirs
     */
    function __construct( $className, $files, $dirs )
    {
        $paths = array();
        foreach ( $dirs as $dir )
        {
            $paths[] = realpath( $dir->autoloadPath );
        }
        parent::__construct( "Could not find a class to file mapping for '{$className}'. Searched for ". implode( ', ', $files ) . " in: " . implode( ', ', $paths ) );
    }
}
?>
PK`a�\�aa0pear/ezc/Base/exceptions/property_permission.phpnu�[���<?php
/**
 * File containing the ezcPropertyReadOnlyException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBasePropertyPermissionException is thrown whenever a read-only property
 * is tried to be changed, or when a write-only property was accessed for reading.
 *
 * @package Base
 * @version 1.8
 */
class ezcBasePropertyPermissionException extends ezcBaseException
{
    /**
     * Used when the property is read-only.
     */
    const READ  = 1;

    /**
     * Used when the property is write-only.
     */
    const WRITE = 2;

    /**
     * Constructs a new ezcPropertyPermissionException for the property $name.
     *
     * @param string $name The name of the property.
     * @param int    $mode The mode of the property that is allowed (::READ or ::WRITE).
     */
    function __construct( $name, $mode )
    {
        parent::__construct( "The property '{$name}' is " .
            ( $mode == self::READ ? "read" : "write" ) .
            "-only." );
    }
}
?>
PK`a�\�ӥ�,pear/ezc/Base/exceptions/file_permission.phpnu�[���<?php
/**
 * File containing the ezcBaseFilePermissionException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseFilePermissionException is thrown whenever a permission problem with
 * a file, directory or stream occurred.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseFilePermissionException extends ezcBaseFileException
{
    /**
     * Constructs a new ezcPropertyPermissionException for the property $name.
     *
     * @param string $path The name of the file.
     * @param int    $mode The mode of the property that is allowed
     *               (ezcBaseFileException::READ, ezcBaseFileException::WRITE,
     *               ezcBaseFileException::EXECUTE,
     *               ezcBaseFileException::CHANGE or
     *               ezcBaseFileException::REMOVE).
     * @param string $message A string with extra information.
     */
    function __construct( $path, $mode, $message = null )
    {
        switch ( $mode )
        {
            case ezcBaseFileException::READ:
                $operation = "The file '{$path}' can not be opened for reading";
                break;
            case ezcBaseFileException::WRITE:
                $operation = "The file '{$path}' can not be opened for writing";
                break;
            case ezcBaseFileException::EXECUTE:
                $operation = "The file '{$path}' can not be executed";
                break;
            case ezcBaseFileException::CHANGE:
                $operation = "The permissions for '{$path}' can not be changed";
                break;
            case ezcBaseFileException::REMOVE:
                $operation = "The file '{$path}' can not be removed";
                break;
            case ( ezcBaseFileException::READ || ezcBaseFileException::WRITE ):
                $operation = "The file '{$path}' can not be opened for reading and writing";
                break;
        }

        $messagePart = '';
        if ( $message )
        {
            $messagePart = " ($message)";
        }

        parent::__construct( "$operation.$messagePart" );
    }
}
?>
PKaa�\u�3�%pear/ezc/Base/exceptions/whatever.phpnu�[���<?php
/**
 * File containing the ezcBaseWhateverException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseWhateverException is thrown whenever something is so seriously wrong.
 *
 * If this happens it is not possible to repair anything gracefully. An
 * example for this could be, that your eZ components installation has thrown
 * far to many exceptions. Whenever you receive an ezcBaseWhateverException, do
 * not even try to catch it, but forget your project completely and immediately
 * stop coding! ;)
 *
 * @access private
 * @package Base
 * @version 1.8
 */
class ezcBaseWhateverException extends ezcBaseException
{
    /**
     * Constructs a new ezcBaseWhateverException.
     *
     * @param string $what  What happened?
     * @param string $where Where did it happen?
     * @param string $who   Who is responsible?
     * @param string $why   Why did is happen?
     * @access protected
     * @return void
     */
    function __construct( $what, $where, $who, $why )
    {
        parent::__construct( "Thanks for using eZ components. Hope you like it! Greetings from Amos, Derick, El Frederico, Ray and Toby." );
    }
}
?>
PKaa�\����5pear/ezc/Base/exceptions/init_callback_configured.phpnu�[���<?php
/**
 * File containing the ezcBaseInitCallbackConfiguredException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseInitCallbackConfiguredException is thrown when you try to assign a
 * callback clasname to an identifier, while there is already a callback class
 * configured for this identifier.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseInitCallbackConfiguredException extends ezcBaseException
{
    /**
     * Constructs a new ezcBaseInitCallbackConfiguredException.
     *
     * @param string $identifier
     * @param string $originalCallbackClassName
     */
    function __construct( $identifier, $originalCallbackClassName )
    {
        parent::__construct( "The '{$identifier}' is already configured with callback class '{$originalCallbackClassName}'." );
    }
}
?>
PKaa�\�b�998pear/ezc/Base/exceptions/functionality_not_supported.phpnu�[���<?php
/**
 * File containing the ezcBaseFunctionalityNotSupportedException class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * The ezcBaseFunctionalityNotSupportedException is thrown when a requested
 * PHP function was not found.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseFunctionalityNotSupportedException extends ezcBaseException
{
    /**
     * Constructs a new ezcBaseFunctionalityNotSupportedException.
     *
     * @param string $message The message to throw
     * @param string $reason The reason for the exception
     */
    function __construct( $message, $reason )
    {
        parent::__construct( "{$message} is not supported. Reason: {$reason}." );
    }
}
?>
PKba�\�{��QQ;pear/ezc/Base/exceptions/double_class_repository_prefix.phpnu�[���<?php
/**
 * File containing the ezcBaseDoubleClassRepositoryPrefixException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseDoubleClassRepositoryPrefixException is thrown whenever you try to
 * register a class repository with a prefix that has already been added
 * before.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseDoubleClassRepositoryPrefixException extends ezcBaseException
{
    /**
     * Constructs a new ezcBaseDoubleClassRepositoryPrefixException for the
     * $prefix that points to $basePath with autoload directory
     * $autoloadDirPath.
     *
     * @param string $prefix
     * @param string $basePath
     * @param string $autoloadDirPath
     */
    function __construct( $prefix, $basePath, $autoloadDirPath )
    {
        parent::__construct( "The class repository in '{$basePath}' (with autoload dir '{$autoloadDirPath}') can not be added because another class repository already uses the prefix '{$prefix}'." );
    }
}
?>
PKba�\²Gi��"pear/ezc/Base/exceptions/value.phpnu�[���<?php
/**
 * File containing the ezcBaseValueException class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseValueException is thrown whenever the type or value of the given
 * variable is not as expected.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseValueException extends ezcBaseException
{
    /**
     * Constructs a new ezcBaseValueException on the $name variable.
     *
     * @param string  $settingName The name of the setting where something was
     *                wrong with.
     * @param mixed   $value The value that the option was tried to be set too.
     * @param string  $expectedValue A string explaining the allowed type and value range.
     * @param string  $variableType  What type of variable was tried to be set (setting, argument).
     */
    function __construct( $settingName, $value, $expectedValue = null, $variableType = 'setting' )
    {
        $type = gettype( $value );
        if ( in_array( $type, array( 'array', 'object', 'resource' ) ) )
        {
            $value = serialize( $value );
        }
        $msg = "The value '{$value}' that you were trying to assign to $variableType '{$settingName}' is invalid.";
        if ( $expectedValue )
        {
            $msg .= " Allowed values are: " . $expectedValue . '.';
        }
        parent::__construct( $msg );
    }
}
?>
PKba�\Ն��((+pear/ezc/Base/exceptions/file_exception.phpnu�[���<?php
/**
 * File containing the ezcBaseFileException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseFileException is the exception from which all file related exceptions
 * inherit.
 *
 * @package Base
 * @version 1.8
 */
abstract class ezcBaseFileException extends ezcBaseException
{
    const READ    = 1;
    const WRITE   = 2;
    const EXECUTE = 4;
    const CHANGE  = 8;
    const REMOVE  = 16;
}
?>
PKba�\����&pear/ezc/Base/exceptions/exception.phpnu�[���<?php
/**
 * File containing the ezcBaseException class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseException is a container from which all other exceptions in the
 * components library descent.
 *
 * @package Base
 * @version 1.8
 */
abstract class ezcBaseException extends Exception
{
    /**
     * Original message, before escaping
     */
    public $originalMessage;

    /**
     * Constructs a new ezcBaseException with $message
     *
     * @param string $message
     */
    public function __construct( $message )
    {
        $this->originalMessage = $message;

        if ( php_sapi_name() == 'cli' )
        {
            parent::__construct( $message );
        }
        else
        {
            parent::__construct( htmlspecialchars( $message ) );
        }
    }
}
?>
PKca�\l��VV*pear/ezc/Base/exceptions/setting_value.phpnu�[���<?php
/**
 * File containing the ezcBaseSettingValueException class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * ezcBaseSettingValueExeception is thrown whenever a value to a class'
 * configuration option is either of the wrong type, or has a wrong value.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseSettingValueException extends ezcBaseException
{
    /**
     * Constructs a new ezcBaseConfigException
     *
     * @param string  $settingName The name of the setting where something was
     *                wrong with.
     * @param mixed   $value The value that the option was tried to be set too.
     * @param string  $expectedValue A string explaining the allowed type and value range.
     */
    function __construct( $settingName, $value, $expectedValue = null )
    {
        $type = gettype( $value );
        if ( in_array( $type, array( 'array', 'object', 'resource' ) ) )
        {
            $value = serialize( $value );
        }
        $msg = "The value '{$value}' that you were trying to assign to setting '{$settingName}' is invalid.";
        if ( $expectedValue )
        {
            $msg .= " Allowed values are: " . $expectedValue;
        }
        parent::__construct( $msg );
    }
}
?>
PKca�\^M�@@1pear/ezc/Base/exceptions/invalid_parent_class.phpnu�[���<?php
/**
 * File containing the ezcBaseInvalidParentClassException class
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * Exception that is thrown if an invalid class is passed as custom class.
 *
 * @package Base
 * @version 1.8
 */
class ezcBaseInvalidParentClassException extends ezcBaseException
{
    /**
     * Constructs an ezcBaseInvalidParentClassException for custom class $customClass
     *
     * @param string $expectedParentClass
     * @param string $customClass
     */
    function __construct( $expectedParentClass, $customClass )
    {
        parent::__construct( "Class '{$customClass}' does not exist, or does not inherit from the '{$expectedParentClass}' class." );
    }
}
?>
PKca�\j��"pear/ezc/Base/metadata/tarball.phpnu�[���<?php
/**
 * File containing the ezcBaseMetaDataTarballReader class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */
/**
 * Base class implements ways of fetching information about the installed
 * eZ Components when installed as tarball.
 *
 * @package Base
 * @version 1.8
 * @mainclass
 */
class ezcBaseMetaDataTarballReader
{
    /**
     * Contains the handler to the XML file containing the release information.
     * @var SimpleXmlElement
     */
    private $xml;

    /**
     * Creates the reader object and opens the release-info file.
     */
    public function __construct()
    {
        $filename = dirname( __FILE__ ) . '/../../../release-info.xml';
        $this->xml = simplexml_load_file( $filename );
    }

    /**
     * Returns the version string for the installed eZ Components bundle.
     *
     * A version string such as "2008.2.2" is returned.
     *
     * @return string
     */
    public function getBundleVersion()
    {
        return (string) $this->xml->version;
    }

    /**
     * Returns a PHP version string that describes the required PHP version for
     * this installed eZ Components bundle.
     *
     * @return string
     */
    public function getRequiredPhpVersion()
    {
        return (string) $this->xml->deps->php;
    }

    /**
     * Returns whether $componentName is installed
     *
     * Returns true for every component that exists (because all of them are
     * then available).
     *
     * @return bool
     */
    public function isComponentInstalled( $componentName )
    {
        $root = $this->xml->deps->packages->package;

        foreach ( $root as $package )
        {
            if ( (string) $package['name'] == $componentName )
            {
                return true;
            }
        }
        return false;
    }

    /**
     * Returns the version string of the available $componentName or false when
     * the component is not installed.
     *
     * @return string
     */
    public function getComponentVersion( $componentName )
    {
        $root = $this->xml->deps->packages->package;

        foreach ( $root as $package )
        {
            if ( (string) $package['name'] == $componentName )
            {
                return (string) $package['version'];
            }
        }
        return false;
    }

    /**
     * Returns a list of components that $componentName depends on.
     *
     * If $componentName is left empty, all installed components are returned.
     *
     * The returned array has as keys the component names, and as values the
     * version of the components. It returns null of the $componentName
     * is not found.
     *
     * @return array(string=>string).
     */
    public function getComponentDependencies( $componentName = null )
    {
        $baseVersion = false;
        $root = $this->xml->deps->packages;
        $found = $componentName === null ? true : false;

        // in case $componentName != null, we loop through all the components
        // in the file, and figure out the new root that we can list dependency
        // packages from.
        foreach ( $root->package as $package )
        {
            if ( (string) $package['name'] == 'Base' )
            {
                $baseVersion = $package['version'];
            }
            if ( !$found && (string) $package['name'] == $componentName )
            {
                $root = $package->deps;
                $found = true;
            }
        }

        if ( !$found )
        {
            return null;
        }

        // We always add the Base dependency even though it's not in the dependency file.
        $deps = array();
        $deps['Base'] = (string) $baseVersion;

        if ( !isset( $root->package ) )
        {
            return $deps;
        }
        foreach ( $root->package as $package )
        {
            $deps[(string) $package['name']] = (string) $package['version'];
        }
        return $deps;
    }
}
?>
PKca�\myv		pear/ezc/Base/metadata/pear.phpnu�[���<?php
/**
 * File containing the ezcBaseMetaDataPearReader class.
 *
 * @package Base
 * @version 1.8
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

@require 'PEAR/Registry.php';

/**
 * Base class implements ways of fetching information about the installed
 * eZ Components when installed as tarball.
 *
 * Note: there are lots of @ used here, because PEAR still lives in the stone
 * age with their PHP 3 code and general liberal use of throwing warnings and
 * notices.
 *
 * @package Base
 * @version 1.8
 * @mainclass
 */
class ezcBaseMetaDataPearReader
{
    /**
     * Stores the PEAR_Registry to query for information
     *
     * @var PEAR_Registry
     */
    private $registry;

    /**
     * Creates the reader object and initialized the registry for querying
     */
    public function __construct()
    {
        @$this->registry = new PEAR_Registry;
    }

    /**
     * Returns the version string for the installed eZ Components bundle.
     *
     * A version string such as "2008.2.2" is returned.
     *
     * @return string
     */
    public function getBundleVersion()
    {
        @$packageInfo = $this->registry->packageInfo( 'ezcomponents', null, 'components.ez.no' );
        return $packageInfo['version']['release'];
    }

    /**
     * Returns a PHP version string that describes the required PHP version for
     * this installed eZ Components bundle.
     *
     * @return string
     */
    public function getRequiredPhpVersion()
    {
        @$packageInfo = $this->registry->packageInfo( 'ezcomponents', null, 'components.ez.no' );
        if ( array_key_exists( 'required', $packageInfo['dependencies'] ) )
        {
            return $packageInfo['dependencies']['required']['php']['min'];
        }
        return $packageInfo['dependencies']['php']['min'];
    }

    /**
     * Returns whether $componentName is installed
     *
     * Checks the PEAR registry whether the component is there.
     *
     * @return bool
     */
    public function isComponentInstalled( $componentName )
    {
        @$packageInfo = $this->registry->packageInfo( $componentName, null, 'components.ez.no' );
        return is_array( $packageInfo );
    }

    /**
     * Returns the version string of the available $componentName or false when
     * the component is not installed.
     *
     * @return string
     */
    public function getComponentVersion( $componentName )
    {
        @$packageInfo = $this->registry->packageInfo( $componentName, null, 'components.ez.no' );
        $release = $packageInfo['version']['release'];
        return $release === null ? false : $release;
    }

    /**
     * Returns a list of components that $componentName depends on.
     *
     * If $componentName is left empty, all installed components are returned.
     *
     * The returned array has as keys the component names, and as values the
     * version of the components.
     *
     * @return array(string=>string).
     */
    public function getComponentDependencies( $componentName = 'ezcomponents' )
    {
        @$packageInfo = $this->registry->packageInfo( $componentName, 'dependencies', 'components.ez.no' );
        if ( isset( $packageInfo['required']['package'] ) )
        {
            $deps = array();
            if ( isset( $packageInfo['required']['package']['name'] ) )
            {
                $deps[$packageInfo['required']['package']['name']] = $packageInfo['required']['package']['min'];
            }
            else
            {
                foreach ( $packageInfo['required']['package'] as $package )
                {
                    $deps[$package['name']] = $package['min'];
                }
            }
            return $deps;
        }
        return array();
    }
}
?>
PKda�\:��||pear/ezc/Base/ezc_bootstrap.phpnu�[���<?php
/**
 * Include file that can be used for a quick setup of the eZ Components.
 *
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.8
 * @filesource
 * @package Base
 * @access private
 */
$dir = dirname( __FILE__ );
$dirParts = explode( DIRECTORY_SEPARATOR, $dir );

if ( $dirParts[count( $dirParts ) - 1] === 'src' )
{
    $baseDir = join( DIRECTORY_SEPARATOR, array_slice( $dirParts, 0, -2 ) );
    require $baseDir . '/Base/src/base.php'; // svn, bundle
}
else if ( $dirParts[count( $dirParts ) - 2] === 'ezc' )
{
    $baseDir = join( DIRECTORY_SEPARATOR, array_slice( $dirParts, 0, -2 ) );
    require $baseDir . '/ezc/Base/base.php'; // pear
}
else
{
    die( "Your environment isn't properly set-up. Please refer to the eZ components documentation at http://components.ez.no/doc ." );
}

/**
 * Implements the __autoload mechanism for PHP - which can only be done once
 * per request.
 *
 * @param string $className  The name of the class that should be loaded.
 */
function __autoload( $className )
{
	ezcBase::autoload( $className );
}
?>
PKda�\��K��pear/ezc/File/file.phpnu�[���<?php
/**
 * @copyright Copyright (C) 2005-2007 eZ systems as. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.2
 * @filesource
 * @package File
 */

/**
 * Provides a selection of static independent methods to provide functionality
 * for file and file system handling. This class is deprecated, please use
 * ezcBaseFile instead.
 *
 * @package File
 * @version 1.2
 * @apichange Has been deprecated by ezcBaseFile
 */
class ezcFile extends ezcBaseFile
{
}
?>
PKda�\��
--pear/ezc/File/file_autoload.phpnu�[���<?php
/**
 * Autoloader definition for the File component.
 *
 * @copyright Copyright (C) 2005-2007 eZ systems as. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.2
 * @filesource
 * @package File
 */

return array(
    'ezcFile' => 'File/file.php',
);
?>
PKea�\�Jq�VV)pear/ezc/ConsoleTools/progressmonitor.phpnu�[���<?php
/**
 * File containing the ezcConsoleProgressMonitor class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Printing structured status information on the console. 
 *
 * <code>
 * // Construction
 * $status = new ezcConsoleProgressMonitor( new ezcConsoleOutput(), 42 );
 *
 * // Run statusbar
 * foreach ( $files as $file )
 * {
 *      $res = $file->upload();
 *      // Add a status-entry to be printed.
 *      $status->addEntry( 'UPLOAD', $file->path );
 *      // Result like "    2.5% UPLOAD /var/upload/test.png"
 * }
 * </code>
 *  
 * @property ezcConsoleProgressMonitorOptions $options
 *           Contains the options for this class.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @mainclass
 */
class ezcConsoleProgressMonitor
{
    /**
     * Options
     *
     * @var ezcConsoleProgressMonitorOptions
     */
    protected $options;

    /**
     * The ezcConsoleOutput object to use.
     *
     * @var ezcConsoleOutput
     */
    protected $outputHandler;

    /**
     * Counter for the items already printed. 
     * 
     * @var int
     */
    protected $counter = 0;

    /**
     * The number of entries to expect. 
     * 
     * @var int
     */
    protected $max;

    /**
     * Creates a new progress monitor.
     * The $outputHandler parameter will be used to display the progress
     * monitor. $max is the number of monitor items to expect. $options can be
     * used to define the behaviour of the monitor
     * {@link ezcConsoleProgressMonitorOptions}.
     *
     * @param ezcConsoleOutput $outHandler   Handler to utilize for output
     * @param int $max                       Number of items to expect
     * @param array(string=>string) $options Options.
     *
     * @see ezcConsoleProgressMonitor::$options
     */
    public function __construct( ezcConsoleOutput $outHandler, $max, array $options = array() )
    {
        $this->outputHandler = $outHandler;
        $this->max = $max;
        $this->options = new ezcConsoleProgressMonitorOptions( $options );
    }

    /**
     * Property read access.
     * 
     * @param string $key Name of the property.
     * @return mixed Value of the property or null.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the the desired property is not found.
     */
    public function __get( $key )
    {
        switch ( $key )
        {
            case 'options':
                return $this->options;
                break;
        }
        throw new ezcBasePropertyNotFoundException( $key );
    }
    
    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $val  The value for the property.
     *
     * @throws ezcBaseValueException 
     *         If a the value for the property options is not an instance of 
     *         ezcConsoleProgressMonitorOptions. 
     * @return void
     */
    public function __set( $propertyName, $val )
    {
        switch ( $propertyName ) 
        {
            case 'options':
                if ( !( $val instanceof ezcConsoleProgressMonitorOptions ) )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'instance of ezcConsoleProgressMonitorOptions' );
                }
                $this->options = $val;
                return;
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }
    
    
    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property.
     * @return bool True is the property is set, otherwise false.
     */
    public function __isset( $propertyName )
    {
        switch ( $propertyName )
        {
            case 'options':
                return true;
        }
        return false;
    }

    /**
     * Set new options.
     * This method allows you to change the options of an progress monitor.
     *  
     * @param ezcConsoleProgressMonitorOptions $options The options to set.
     *
     * @throws ezcBaseSettingNotFoundException
     *         If you tried to set a non-existent option value. 
     * @throws ezcBaseSettingValueException
     *         If the value is not valid for the desired option.
     * @throws ezcBaseValueException
     *         If you submit neither an array nor an instance of 
     *         ezcConsoleProgressMonitorOptions.
     */
    public function setOptions( $options ) 
    {
        if ( is_array( $options ) ) 
        {
            $this->options->merge( $options );
        } 
        else if ( $options instanceof ezcConsoleProgressMonitorOptions ) 
        {
            $this->options = $options;
        }
        else
        {
            throw new ezcBaseValueException( "options", $options, "instance of ezcConsoleProgressMonitorOptions" );
        }
    }

    /**
     * Returns the currently set options.
     * Returns the currently set option array.
     * 
     * @return ezcConsoleProgressMonitorOptions The options.
     */
    public function getOptions()
    {
        return $this->options;
    }
 
    /**
     * Print a status entry.
     * Prints a new status entry to the console and updates the internal counter.
     *
     * @param string $tag  The tag to print (second argument in the 
     *                     formatString).
     * @param string $data The data to be printed in the status entry (third 
     *                     argument in the format string).
     * @return void
     */
    public function addEntry( $tag, $data )
    {
        $this->counter++;
        $percentage = $this->counter / $this->max * 100;

        $this->outputHandler->outputLine(
            sprintf(
                $this->options['formatString'],
                $percentage,
                $tag,
                $data
            )
        );
    }
}
?>
PKea�\��c�gg/pear/ezc/ConsoleTools/structs/output_format.phpnu�[���<?php
/**
 * File containing the ezcConsoleOutputFormat class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Struct class to store formating entities used by ezcConsoleOutput.
 *
 * Struct class to store formating entities used by ezcConsoleOutput.
 *
 * Possible values of {@link ezcConsoleOutputFormat::$color} are:
 * - gray
 * - red
 * - green
 * - yellow
 * - blue
 * - magenta
 * - cyan
 * - white
 * - default (representing the consoles default color)
 *
 * For {@link ezcConsoleOutputFormat::$bgcolor} the following values are valid:
 * - black
 * - red
 * - green
 * - yellow
 * - blue
 * - magenta
 * - cyan
 * - white
 * - default (representing the consoles default background color)
 *
 * The {@link ezcConsoleOutputFormat::$style} attribute takes an array of 
 * (possibly) multiple attributes. Choose from the lists below:
 *
 * - default (resets all attributes to default)
 *
 * - bold
 * - faint
 * - normal
 *
 * - italic
 * - notitalic
 *
 * - underlined
 * - doubleunderlined
 * - notunderlined
 *
 * - blink
 * - blinkfast
 * - noblink
 *
 * - negative
 * - positive
 *
 * @property string $color
 *           Contains the color for this format.
 * @property array(string) $style
 *           Contains the lists of styles that are associated with
 *           this format.
 * @property string $bgcolor
 *           Contains the background color for this format.
 * @property string $target
 *           Contains the output target to use. Pick one of
 *           ezcConsoleOutput::TARGET_OUTPUT, ezcConsoleOutput::TARGET_STDOUT
 *           or ezcConsoleOutput::TARGET_STDERR.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOutputFormat
{
    /**
     * Container to hold the properties
     *
     * @var array(string=>mixed)
     */
    protected $properties = array( 
        'color'     => 'default',
        'style'     => array( 'default' ),
        'bgcolor'   => 'default',
        'target'    => ezcConsoleOutput::TARGET_OUTPUT,
    );

    /**
     * Create a new ezcConsoleOutputFormat object.
     * Creates a new object of this class.
     * 
     * @param string $color             Name of a color value.
     * @param array(string) $style Names of style values.
     * @param string $bgcolor           Name of a bgcolor value.
     * @param string $target            Target output stream.
     */
    public function __construct( $color = 'default', array $style = null, $bgcolor = 'default', $target = ezcConsoleOutput::TARGET_OUTPUT )
    {
        $this->__set( 'color', $color );
        $this->__set( 'style', isset( $style ) ? $style : array( 'default' ) );
        $this->__set( 'bgcolor', $bgcolor );
        $this->__set( 'target', $target );
    }
    
    /**
     * Overloaded __get() method to gain read-only access to some attributes.
     * 
     * @param string $propertyName Name of the property to read.
     * @return mixed Desired value if exists, otherwise null.
     * @ignore
     */
    public function __get( $propertyName )
    {
        switch ( $propertyName )
        {
            case 'style':
                return (array) $this->properties[$propertyName];
            case 'color':
            case 'bgcolor':
            case 'target':
                return $this->properties[$propertyName];
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
    }

    /**
     * Overloaded __set() method to gain read-only access to properties.
     * It also performs checks on setting others.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the setting you try to access does not exists
     * @throws ezcBaseValueException
     *         If trying to set an invalid value for a setting.
     * 
     * @param string $propertyName Name of the attrinbute to access.
     * @param string $val The value to set.
     * @ignore
     */
    public function __set( $propertyName, $val )
    {
        if ( !isset( $this->properties[$propertyName] ) )
        {
            throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        // Extry handling of multi styles
        if ( $propertyName === 'style' )
        {
            if ( !is_array( $val ) ) $val = array( $val );
            foreach ( $val as $style )
            {
                if ( !ezcConsoleOutput::isValidFormatCode( $propertyName, $style ) )
                {
                    throw new ezcBaseValueException( $propertyName, $style, 'valid ezcConsoleOutput format code' );
                }
            }
            $this->properties['style'] = $val;
            return;
        }
        // Continue normal handling
        if ( ( $propertyName === "color" || $propertyName === "bgcolor" )
             && !ezcConsoleOutput::isValidFormatCode( $propertyName, $val ) )
        {
            throw new ezcBaseValueException( $propertyName, $val, 'valid ezcConsoleOutput format code' );
        }
        $this->properties[$propertyName] = $val;
    }
 
    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        return isset( $this->properties[$propertyName] );
    }
    
}

?>
PKea�\�!{D��-pear/ezc/ConsoleTools/structs/option_rule.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionRule class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Struct class to store a parameter rule.
 *
 * This struct stores relation rules between parameters. A relation consists of
 * a parameter that the relation refers to and optionally the value(s) the 
 * referred parameter may have assigned. Rules may be used for dependencies and 
 * exclusions between parameters.
 *
 * The ezcConsoleOptionRule class has the following properties:
 * - <b>option</b> <i>ezcConsoleOption</i>, contains the parameter that this rule refers to.
 * - <b>values</b> <i>array(string)</i>, contains a list of values that are accepted.
 *
 * @see ezcConsoleOption
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionRule
{
    /**
     * Properties.
     *
     * @var array
     */
    protected $properties = array( 
        'option' => null,
        'values' => array(),
        'ifSet'  => true
    );

    /**
     * Creates a new option rule.
     *
     * Creates a new option rule. Per default the $values parameter
     * is an empty array, which determines that the option may accept any
     * value. To indicate that a option may only have certain values,
     * place them inside tha $values array. For example to indicate an option
     * may have the values 'a', 'b' and 'c' use:
     *
     * <code>
     * $rule = new ezcConsoleOptionRule( $option, array( 'a', 'b', 'c' ) );
     * </code>
     *
     * If you want to allow only 1 specific value for an option, you do not
     * need to wrap this into an array, when creating the rule. Simply use
     *
     * <code>
     * $rule = new ezcConsoleOptionRule( $option, 'a' );
     * </code>
     *
     * to create a rule, that allows the desired option only to accept the
     * value 'a'.
     *
     * The $ifSet parameter determines, if the rule is validated when its option
     * is set or left out. If $ifSet is true, the rule is validated when the 
     * option is set. Otherwise the rule is validated if the option was not set 
     * by the user.
     *
     * @param ezcConsoleOption $option The option to refer to.
     * @param mixed $values            The affected values.
     * @param bool $ifSet
     */
    public function __construct( ezcConsoleOption $option, array $values = array(), $ifSet = true )
    {
        $this->__set( 'option', $option );
        $this->__set( 'values', $values );
        $this->__set( 'ifSet', $ifSet );
    }
    
    /**
     * Property read access.
     *
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * 
     * @param string $propertyName Name of the property.
     * @return mixed Value of the property or null.
     * @ignore
     */
    public function __get( $propertyName ) 
    {
        switch ( $propertyName )
        {
            case 'option':
                return $this->properties['option'];
            case 'values':
                return $this->properties['values'];
            case 'ifSet':
                return $this->properties['ifSet'];
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }
    
    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyPermissionException
     *         If the property you try to access is read-only.
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue ) 
    {
        switch ( $propertyName )
        {
            case 'option':
                if ( !( $propertyValue instanceof ezcConsoleOption ) )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, 'ezcConsoleOption' );
                }
                $this->properties['option'] = $propertyValue;
                return;
            case 'values':
                if ( !is_array( $propertyValue ) )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, 'array' );
                }
                $this->properties['values'] = $propertyValue;
                return;
            case 'ifSet':
                if ( !is_bool( $propertyValue ) )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, 'bool' );
                }
                $this->properties['ifSet'] = $propertyValue;
                return;
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }
 
    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property to check.
     * @return bool If the property exists or not.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        switch ( $propertyName )
        {
            case 'option':
            case 'values':
            case 'ifSet':
                return true;
        }
        return false;
    }

}

?>
PKea�\#�j�''0pear/ezc/ConsoleTools/structs/output_formats.phpnu�[���<?php
/**
 * File containing the ezcConsoleOutputFormats class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Class to store the collection for formating classes.
 *
 * This class stores objects of {@link ezcConsoleOutputFormat}, which
 * represents a format option set for {@link ezcConsoleOutput}.
 *
 * <code>
 * // New ezcConsoleOutput 
 * // $output->format is instance of ezcConsoleOutputFormats.
 * $output = new ezcConsoleOutput();
 * 
 * // Default format - color = blue
 * $output->formats->default->color = 'blue';
 * // Default format - weight = bold
 * $output->formats->default->style = array( 'bold' );
 *
 * // New format "important" - color = red
 * $output->formats->important->color = 'red';
 * // Format "important" - background color = black
 * $output->formats->important->bgcolor = 'black';
 * </code>
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOutputFormats implements Iterator, Countable
{
    /**
     * Array of ezcConsoleOutputFormat.
     * 
     * @var array(ezcConsoleOutputFormat)
     */
    protected $formats = array();

    /**
     * Create a new ezcConsoleOutputFormats object.
     *
     * Creates a new, empty object of this class. It also adds a default
     * format.
     */
    public function __construct()
    {
        $this->formats['default'] = new ezcConsoleOutputFormat();
        $this->formats['success'] = new ezcConsoleOutputFormat();
        $this->formats['success']->color = 'green';
        $this->formats['success']->style = array( 'bold' );
        $this->formats['failure'] = new ezcConsoleOutputFormat();
        $this->formats['failure']->color = 'red';
        $this->formats['failure']->style = array( 'bold' );
    }

    /**
     * Returns the current Iterator value.
     *
     * Implementation of {@link Iterator::current()}.
     * 
     * @return ezcConsoleOutputFormat
     */
    public function current()
    {
        return current( $this->formats );
    }

    /**
     * Advances the Iterator to the next element. 
     *
     * Implementation of {@link Iterator::next()}.
     * 
     * @return ezcConsoleOutputFormat|bool
     */
    public function next()
    {
        return next( $this->formats );
    }

    /**
     * Returns the current Iterator key. 
     *
     * Implementation of {@link Iterator::key()}.
     * 
     * @return string
     */
    public function key()
    {
        return key( $this->formats );
    }

    /**
     * Resets the Iterator to the first element.
     *
     * Implementation of {@link Iterator::rewind()}.
     * 
     * @return ezcConsoleOutputFormat
     */
    public function rewind()
    {
        return reset( $this->formats );
    }

    /**
     * Checks if the current Iterator position is still valid.
     *
     * Implementation of {@link Iterator::valid()}.
     * 
     * @return bool
     */
    public function valid()
    {
        return ( current( $this->formats ) !== false );
    }

    /**
     * Returns the number of registered formats.
     *
     * Implementation of {@link Countable::count()}.
     * 
     * @return void
     */
    public function count()
    {
        return count( $this->formats );
    }

    /**
     * Read access to the formats.
     *
     * Formats are accessed directly like properties of this object. If a
     * format does not exist, it is created on the fly (using default values),
     * 
     * @param string $formatName
     * @return ezcConsoleOutputFormat The format.
     */
    public function __get( $formatName )
    {
        if ( !isset( $this->formats[$formatName] ) )
        {
            $this->formats[$formatName] = new ezcConsoleOutputFormat();
        }
        return $this->formats[$formatName];
    }

    /**
     * Write access to the formats.
     *
     * Formats are accessed directly like properties of this object. If a
     * format does not exist, it is created on the fly (using default values),
     * 
     * @param string $formatName
     * @param ezcConsoleOutputFormat $val The format defintion.
     * @return void
     */
    public function __set( $formatName, ezcConsoleOutputFormat $val )
    {
        $this->formats[$formatName] = $val;
    }
 
    /**
     * Property isset access.
     * 
     * @param string $formatName Name of the property.
     * @return bool True is the property is set, otherwise false.
     */
    public function __isset( $formatName )
    {
        return isset( $this->formats[$formatName] );
    }

}

?>
PKea�\5���tt*pear/ezc/ConsoleTools/console_autoload.phpnu�[���<?php
/**
 * Autoloader definition for the ConsoleTools component.
 *
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.6.1
 * @filesource
 * @package ConsoleTools
 */

return array(
    'ezcConsoleException'                           => 'ConsoleTools/exceptions/exception.php',
    'ezcConsoleArgumentException'                   => 'ConsoleTools/exceptions/argument.php',
    'ezcConsoleOptionException'                     => 'ConsoleTools/exceptions/option.php',
    'ezcConsoleArgumentAlreadyRegisteredException'  => 'ConsoleTools/exceptions/argument_already_registered.php',
    'ezcConsoleArgumentMandatoryViolationException' => 'ConsoleTools/exceptions/argument_mandatory_violation.php',
    'ezcConsoleArgumentTypeViolationException'      => 'ConsoleTools/exceptions/argument_type_violation.php',
    'ezcConsoleDialogAbortException'                => 'ConsoleTools/exceptions/dialog_abort.php',
    'ezcConsoleInvalidOptionNameException'          => 'ConsoleTools/exceptions/invalid_option_name.php',
    'ezcConsoleInvalidOutputTargetException'        => 'ConsoleTools/exceptions/invalid_output_target.php',
    'ezcConsoleNoPositionStoredException'           => 'ConsoleTools/exceptions/no_position_stored.php',
    'ezcConsoleNoValidDialogResultException'        => 'ConsoleTools/exceptions/no_valid_dialog_result.php',
    'ezcConsoleOptionAlreadyRegisteredException'    => 'ConsoleTools/exceptions/option_already_registered.php',
    'ezcConsoleOptionArgumentsViolationException'   => 'ConsoleTools/exceptions/option_arguments_violation.php',
    'ezcConsoleOptionDependencyViolationException'  => 'ConsoleTools/exceptions/option_dependency_violation.php',
    'ezcConsoleOptionExclusionViolationException'   => 'ConsoleTools/exceptions/option_exclusion_violation.php',
    'ezcConsoleOptionMandatoryViolationException'   => 'ConsoleTools/exceptions/option_mandatory_violation.php',
    'ezcConsoleOptionMissingValueException'         => 'ConsoleTools/exceptions/option_missing_value.php',
    'ezcConsoleOptionNoAliasException'              => 'ConsoleTools/exceptions/option_no_alias.php',
    'ezcConsoleOptionNotExistsException'            => 'ConsoleTools/exceptions/option_not_exists.php',
    'ezcConsoleOptionStringNotWellformedException'  => 'ConsoleTools/exceptions/option_string_not_wellformed.php',
    'ezcConsoleOptionTooManyValuesException'        => 'ConsoleTools/exceptions/option_too_many_values.php',
    'ezcConsoleOptionTypeViolationException'        => 'ConsoleTools/exceptions/option_type_violation.php',
    'ezcConsoleTooManyArgumentsException'           => 'ConsoleTools/exceptions/argument_too_many.php',
    'ezcConsoleDialogValidator'                     => 'ConsoleTools/interfaces/dialog_validator.php',
    'ezcConsoleQuestionDialogValidator'             => 'ConsoleTools/interfaces/question_dialog_validator.php',
    'ezcConsoleDialog'                              => 'ConsoleTools/interfaces/dialog.php',
    'ezcConsoleDialogOptions'                       => 'ConsoleTools/options/dialog.php',
    'ezcConsoleInputHelpGenerator'                  => 'ConsoleTools/interfaces/input_help_generator.php',
    'ezcConsoleInputValidator'                      => 'ConsoleTools/interfaces/input_validator.php',
    'ezcConsoleMenuDialogValidator'                 => 'ConsoleTools/interfaces/menu_dialog_validator.php',
    'ezcConsoleQuestionDialogCollectionValidator'   => 'ConsoleTools/dialog/validators/question_dialog_collection.php',
    'ezcConsoleArgument'                            => 'ConsoleTools/input/argument.php',
    'ezcConsoleArguments'                           => 'ConsoleTools/input/arguments.php',
    'ezcConsoleDialogViewer'                        => 'ConsoleTools/dialog_viewer.php',
    'ezcConsoleInput'                               => 'ConsoleTools/input.php',
    'ezcConsoleInputStandardHelpGenerator'          => 'ConsoleTools/input/help_generators/standard.php',
    'ezcConsoleMenuDialog'                          => 'ConsoleTools/dialog/menu_dialog.php',
    'ezcConsoleMenuDialogDefaultValidator'          => 'ConsoleTools/dialog/validators/menu_dialog_default.php',
    'ezcConsoleMenuDialogOptions'                   => 'ConsoleTools/options/menu_dialog.php',
    'ezcConsoleOption'                              => 'ConsoleTools/input/option.php',
    'ezcConsoleOptionRule'                          => 'ConsoleTools/structs/option_rule.php',
    'ezcConsoleOutput'                              => 'ConsoleTools/output.php',
    'ezcConsoleOutputFormat'                        => 'ConsoleTools/structs/output_format.php',
    'ezcConsoleOutputFormats'                       => 'ConsoleTools/structs/output_formats.php',
    'ezcConsoleOutputOptions'                       => 'ConsoleTools/options/output.php',
    'ezcConsoleProgressMonitor'                     => 'ConsoleTools/progressmonitor.php',
    'ezcConsoleProgressMonitorOptions'              => 'ConsoleTools/options/progressmonitor.php',
    'ezcConsoleProgressbar'                         => 'ConsoleTools/progressbar.php',
    'ezcConsoleProgressbarOptions'                  => 'ConsoleTools/options/progressbar.php',
    'ezcConsoleQuestionDialog'                      => 'ConsoleTools/dialog/question_dialog.php',
    'ezcConsoleQuestionDialogMappingValidator'      => 'ConsoleTools/dialog/validators/question_dialog_mapping.php',
    'ezcConsoleQuestionDialogOptions'               => 'ConsoleTools/options/question_dialog.php',
    'ezcConsoleQuestionDialogRegexValidator'        => 'ConsoleTools/dialog/validators/question_dialog_regex.php',
    'ezcConsoleQuestionDialogTypeValidator'         => 'ConsoleTools/dialog/validators/question_dialog_type.php',
    'ezcConsoleStandardInputValidator'              => 'ConsoleTools/input/validators/standard.php',
    'ezcConsoleStatusbar'                           => 'ConsoleTools/statusbar.php',
    'ezcConsoleStatusbarOptions'                    => 'ConsoleTools/options/statusbar.php',
    'ezcConsoleStringTool'                          => 'ConsoleTools/tools/string.php',
    'ezcConsoleTable'                               => 'ConsoleTools/table.php',
    'ezcConsoleTableCell'                           => 'ConsoleTools/table/cell.php',
    'ezcConsoleTableOptions'                        => 'ConsoleTools/options/table.php',
    'ezcConsoleTableRow'                            => 'ConsoleTools/table/row.php',
);
?>
PKea�\kx2���,pear/ezc/ConsoleTools/dialog/menu_dialog.phpnu�[���<?php
/**
 * File containing the ezcConsoleMenuDialog class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Dialog class to make the user choose from a menu.
 * This dialog implementation displays a menu structure to the user and
 * receives a valid menu selection.
 *
 * The behaviour of this dialog is defined by an instance of
 * {@link ezcConsoleMenuDialogOptions}.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleMenuDialog implements ezcConsoleDialog
{

    /**
     * Dialog result 
     * 
     * @var mixed
     */
    protected $result;

    /**
     * Properties 
     * 
     * @var array
     */
    protected $properties = array(
        "options"   => null,
        "output"    => null,
    );

    /**
     * Creates a new menu dialog.
     * Creates a new question dialog to be displayed to the user. All behaviour is
     * defined through the $options parameter. The $output parameter is used to
     * display the dialog in the {@link display()} method.
     * 
     * @param ezcConsoleOutput $output             Output object.
     * @param ezcConsoleMenuDialogOptions $options The options.
     * @return void
     */
    public function __construct( ezcConsoleOutput $output, ezcConsoleMenuDialogOptions $options = null )
    {
        $this->output  = $output;
        $this->options = $options === null ? new ezcConsoleMenuDialogOptions() : $options;
    }

    /**
     * Returns if the dialog retrieved a valid result.
     * If a valid result has already been received, this method returns true,
     * otherwise false.
     * 
     * @return bool If a valid result was retrieved.
     */
    public function hasValidResult()
    {
        return ( $this->result !== null );
    }

    /**
     * Returns the result retrieved.
     * If no valid result was retreived, yet, this method throws an
     * ezcConsoleNoValidDialogResultException. Use {@link hasValidResult()} to
     * avoid this.
     * 
     * @return mixed The retreived result.
     *
     * @throws ezcDialogNoValidResultException
     *         if this method is called without a valid result being retrieved
     *         by the object. Use {@link hasValidResult()} to avoid this
     *         exception.
     */
    public function getResult()
    {
        if ( $this->result === null )
        {
            throw new ezcConsoleNoValidDialogResultException();
        }
        return $this->result;
    }

    /**
     * Displays the dialog and retreives a value from the user.
     * Displays the dialog and retreives the desired answer from the user. If
     * the a valid result is retrieved, it can be obtained using {@link
     * getResult()}. The method {@link hasValidResult()} can be used to check
     * if a valid result is available.
     * 
     * @return void
     * @throws ezcConsoleDialogAbortException
     *         if the user closes STDIN using <CTRL>-D.
     */
    public function display()
    {
        $this->reset();

        $text = "{$this->options->text}\n";
        foreach ( $this->options->validator->getElements() as $key => $entry )
        {
            $text .= sprintf(
                $this->options->formatString,
                $key,
                $entry
            );
        }
        $text .= "\n{$this->options->selectText}{$this->options->validator->getResultString()} ";

        $this->output->outputText( $text, $this->options->format );

        $result = $this->options->validator->fixup(
            ezcConsoleDialogViewer::readLine()
        );
        if ( $this->options->validator->validate( $result ) )
        {
            $this->result = $result;
        }
    }

    /**
     * Reset the dialog.
     * Resets a possibly received result and all changes made to the dialog
     * during {@link display()}. After that, the dialog can be re-used. All
     * option values are kept.
     * 
     * @return void
     */
    public function reset()
    {
        $this->result = null;
    }

    /**
     * Property read access.
     *
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * 
     * @param string $propertyName Name of the property.
     * @return mixed Value of the property or null.
     * @ignore
     */
    public function __get( $propertyName )
    {
        if ( array_key_exists( $propertyName, $this->properties ) )
        {
            return $this->properties[$propertyName];
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }

    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyPermissionException
     *         If the property you try to access is read-only.
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "options":
                if ( ( $propertyValue instanceof ezcConsoleMenuDialogOptions ) === false )
                {
                    throw new ezcBaseValueException(
                        $propertyName,
                        ( is_object( $propertyValue ) ? get_class( $propertyValue ) : gettype( $propertyValue ) ),
                        "instance of ezcConsoleMenuDialogOptions"
                    );
                }
                break;
            case "output":
                if ( ( $propertyValue instanceof ezcConsoleOutput ) === false )
                {
                    throw new ezcBaseValueException(
                        $propertyName,
                        ( is_object( $propertyValue ) ? get_class( $propertyValue ) : gettype( $propertyValue ) ),
                        "instance of ezcConsoleOutput"
                    );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $propertyValue;
    }

    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property to check.
     * @return bool If the property exists or not.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        return array_key_exists( $propertyName, $this->properties );
    }
}

?>
PKfa�\�����?pear/ezc/ConsoleTools/dialog/validators/menu_dialog_default.phpnu�[���<?php
/**
 * File containing the ezcConsoleMenuDialogDefaultValidator class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Default validator for ezcConsoleMenuDialog.
 * This dialog contains a set of menu entries, defined in the $elements
 * property. The result, provided by the user, is checked against the keys of
 * this array. A conversion can be specified to relax the rules for validation
 * (like coverting the result to lower case first). For possibly conversions
 * see the CONVERT_* constants in this class If the user does not provide an
 * answer, a possibly set default value is used.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @property array $elements The elements of the menu.
 * @property string $default The default value.
 * @property int $conversion
 *           ezcConsoleDialogValidator::CONVERT_NONE (default) or
 *           ezcConsoleDialogValidator::CONVERT_LOWER or
 *           ezcConsoleDialogValidator::CONVERT_UPPER.
 */
class ezcConsoleMenuDialogDefaultValidator implements ezcConsoleMenuDialogValidator
{
    /**
     * Properties 
     * 
     * @var array
     */
    protected $properties = array(
        "elements"      => array(),
        "default"       => null,
        "conversion"    => self::CONVERT_NONE,
    );

    /**
     * Creates a new menu default validator. 
     * Creates a validator specified by the given parameters. The $elements
     * array specifies the possible menu items to select from. The item
     * identifier (the key of the array) is used to validate the result. The
     * assigned text is displayed as the menu item text. If no result is
     * provided and an optionally provided default value is used. The
     * $conversion parameter can be used to get a conversion applied to the
     * result before validating it.
     * 
     * @param array $elements The elements of the menu.
     * @param mixed $default  The default value.
     * @param int $conversion The conversion to apply.
     * @return void
     */
    public function __construct( array $elements = array(), $default = null, $conversion = self::CONVERT_NONE )
    {
        $this->elements     = $elements;
        $this->default      = $default;
        $this->conversion   = $conversion;
    }

    /**
     * Returns if the given result is valid. 
     * Checks if the given result is a valid key in the $elements property.
     * 
     * @param mixed $result The received result.
     * @return bool If the result is valid.
     */
    public function validate( $result )
    {
        return isset( $this->elements[$result] );
    }

    /**
     * Returns a fixed version of the result, if possible.
     * Converts the given result according to the conversion defined in the
     * $conversion property.
     * 
     * @param mixed $result The received result.
     * @return mixed The manipulated result.
     */
    public function fixup( $result )
    {
        if ( $result === "" && $this->default !== null )
        {
            return $this->default;

        }
        switch ( $this->conversion )
        {
            case self::CONVERT_LOWER:
                return strtolower( $result );
            case self::CONVERT_UPPER:
                return strtoupper( $result );
            case self::CONVERT_NONE:
            default:
                return $result;
        }
    }

    /**
     * Returns a string representing the default value.
     * For example "[y]" to indicate that "y" is the preselected result and
     * will be chosen if no result is provided.
     *
     * @return string The result string.
     */
    public function getResultString()
    {
        return $this->default === null ? "" : "[{$this->default}]";
   }

    /**
     * Returns an array of the elements to display. 
     * 
     * @return array(string=>string) Elements to display.
     */
    public function getElements()
    {
        return $this->elements;
    }

    /**
     * Property read access.
     * 
     * @param string $propertyName Name of the property.
     * @return mixed Value of the property or null.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the the desired property is not found.
     * @ignore
     */
    public function __get( $propertyName )
    {
        if ( isset( $this->$propertyName ) )
        {
            return $this->properties[$propertyName];
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }

    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If a the value for the property options is not an instance of
     * @throws ezcBaseValueException
     *         If a the value for a property is out of range.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "elements":
                if ( is_array( $propertyValue ) === false )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "array" );
                }
                break;
            case "default":
                if ( is_scalar( $propertyValue ) === false && $propertyValue !== null )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "scalar" );
                }
                break;
            case "conversion":
                if ( $propertyValue !== self::CONVERT_NONE && $propertyValue !== self::CONVERT_UPPER && $propertyValue !== self::CONVERT_LOWER )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "ezcConsoleMenuDialogDefaultValidator::CONVERT_*" );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $propertyValue;
    }

    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        return array_key_exists( $propertyName, $this->properties );
    }
}

?>
PKfa�\��-�Cpear/ezc/ConsoleTools/dialog/validators/question_dialog_mapping.phpnu�[���<?php
/**
 * File containing the ezcConsoleQuestionDialogMappingValidator class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Validator class to map certain results to others.
 * This validator class, for {@link ezcConsoleQuestionDialog} objects,
 * validates a given result against a set of predefined values, exactly like
 * {@link ezcConsoleQuestionDialogCollectionValidator} does, but allows in
 * addition to map certain results to other results. The $map property contains
 * an array of mappings that are checked before a received result is validated.
 * If a mapping matches, the received result is converted to the mapping target
 * before being validated.
 *
 * A valid $map looks like this:
 * <code>
 *      array(
 *          'yes' => 'y',
 *          'no'  => 'n',
 *          '1'   => 'y',
 *          '0'   => 'n'
 *      )
 * </code>
 * While the corresponding collection of valid answers would look like
 * this:
 * <code>
 *      array(
 *          'y', 'n'
 *      )
 * </code>
 * If the answer 'yes' is received by the validator, it is mapped to 'y',
 * therefore considered valid and 'y' is returned as the received value.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @property array(string) $collection
 *           The collection of valid answers.
 * @property mixed $default
 *           Default value.
 * @property int $conversion
 *           ezcConsoleDialogValidator::CONVERT_NONE (default) or
 *           ezcConsoleDialogValidator::CONVERT_LOWER or
 *           ezcConsoleDialogValidator::CONVERT_UPPER.
 * @property array(string=>string) $map
 *           Mapping of answers to valid answers (e.g. array('yes' => 'y') to
 *           map 'yes' to 'y' while 'y' must be in $collection).
 */
class ezcConsoleQuestionDialogMappingValidator extends ezcConsoleQuestionDialogCollectionValidator
{
    /**
     * Creates a new question dialog mapping validator. 
     * Creates a new question dialog mapping validator, which validates the
     * result specified by the user against an array of valid results
     * ($collection). If not value is provided by the user a possibly set
     * $default value is used instead. The $conversion parameter can optionally
     * define a conversion to be performed on the result before validating it.
     * Valid conversions are defined by the CONVERT_* constants in this class.
     *
     * While this functionality is already provided by {@link
     * ezcConsoleQuestionDialogCollectionValidator}, the additional $map
     * paramater allows the sepcification of a map of result values. These
     * mapping is then checked for matches, before a received answer is
     * validated against the collection.
     *
     * @param array(string) $collection The collection of valid results.
     * @param mixed $default    Optional default value.
     * @param int $conversion   CONVERT_* constant.
     * @param array(string=>string) $map
     * @return void
     */
    public function __construct( array $collection, $default = null, $conversion = self::CONVERT_NONE, array $map = array() )
    {
        // Initialize additional property
        $this->properties['map'] = $map;

        parent::__construct( $collection, $default, $conversion );
    }

    /**
     * Returns a fixed version of the result, if possible.
     * Converts the given result according to the conversion defined in the
     * $conversion property.
     * 
     * @param mixed $result The received result.
     * @return mixed The manipulated result.
     */
    public function fixup( $result )
    {
        if ( $result === "" && $this->default !== null )
        {
            return $this->default;
        }
        switch ( $this->conversion )
        {
            case self::CONVERT_UPPER:
                $result = strtoupper( $result );
                break;
            case self::CONVERT_LOWER:
                $result = strtolower( $result );
                break;
        }
        return ( isset( $this->map[$result] ) ? $this->map[$result] : $result );
    }
    
    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If a the value for the property options is not an instance of
     * @throws ezcBaseValueException
     *         If a the value for a property is out of range.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "map":
                if ( is_array( $propertyValue ) === false )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "array" );
                }
                break;
            default:
                return parent::__set( $propertyName, $propertyValue );
        }
        $this->properties[$propertyName] = $propertyValue;
    }
}

?>
PKfa�\��,M??@pear/ezc/ConsoleTools/dialog/validators/question_dialog_type.phpnu�[���<?php
/**
 * File containing the ezcConsoleQuestionDialogTypeValidator class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Validator class to validate a certain data type.
 * Validator class for ezcConsoleQuestionDialog objects that validates a
 * certain datatype.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @property int $type
 *           One of ezcConsoleQuestionDialogTypeValidator::TYPE_*. The type to
 *           check against and convert results to.
 * @property mixed $default
 *           A default value if no result given.
 */
class ezcConsoleQuestionDialogTypeValidator implements ezcConsoleQuestionDialogValidator
{
    /**
     * Data type string. 
     */
    const TYPE_STRING = 0;
    /**
     * Data type int. 
     */
    const TYPE_INT    = 1;
    /**
     * Data type float. 
     */
    const TYPE_FLOAT  = 2;
    /**
     * Data type bool. 
     * The results 1 and "true" will be cased to true, 0 and "false" to false.
     */
    const TYPE_BOOL   = 3;

    /**
     * Properties.
     * 
     * @var array
     */
    protected $properties = array(
        "type"      => self::TYPE_STRING,
        "default"   => null,
    );

    /**
     * Creates a new question dialog type validator.
     * Creates a new question dialog type validator, which validates the result
     * specified to be of a certaon type. The $type must be one of the TYPE_*
     * constants in this class. If no value is provided by the user a possibly
     * set $default value is used instead.
     * 
     * @param int $type      One of ezcConsoleQuestionDialogTypeValidator::TYPE_*.
     * @param mixed $default Default value according to $type.
     * @return void
     */
    public function __construct( $type = self::TYPE_STRING, $default = null )
    {
        $this->type = $type;
        $this->default = $default;
    }

    /**
     * Returns if the given result is valid. 
     * Returns if the result is of the given type.
     * 
     * @param mixed $result The result to check.
     * @return bool True if the result is valid. Otherwise false.
     */
    public function validate( $result )
    {
        if ( $result === "" )
        {
            return $this->default !== null;
        }
        switch ( $this->type )
        {
            case self::TYPE_INT:
                return is_int( $result );
            case self::TYPE_FLOAT:
                return is_float( $result );
            case self::TYPE_BOOL:
                return is_bool( $result );
            case self::TYPE_STRING:
            default:
                return is_string( $result );
        }
    }

    /**
     * Returns a fixed version of the result, if possible.
     * Returns the value casted into the correct type or the default value, if
     * it exists and the result is empty.
     * 
     * @param mixed $result The result received.
     * @return mixed The manipulated result.
     */
    public function fixup( $result )
    {
        if ( $result === "" && $this->default !== null )
        {
            return $this->default;
        }
        switch ( $this->type )
        {
            case self::TYPE_INT:
                return ( preg_match( "/^[0-9\-]+$/", $result ) !== 0 ) ? (int) $result : $result;
            case self::TYPE_FLOAT:
                return ( preg_match( "/^[0-9.E\-]+$/i", $result ) !== 0 ) ? (float) $result : $result;
            case self::TYPE_BOOL:
                switch ( $result )
                {
                    case "1":
                    case "true":
                        return true;
                    case "0":
                    case "false":
                        return false;
                }
            case self::TYPE_STRING:
            default:
                return $result;
        }
    }

    /**
     * Returns a string representing valid results.
     * Returns the string that can will be displayed with the question to
     * indicate valid results to the user and a possibly set default, if
     * available.
     * 
     * @return string
     */
    public function getResultString()
    {
        $res = "(<%s>)" . ( $this->default !== null ? " [{$this->default}]" : "" );
        switch ( $this->type )
        {
            case self::TYPE_INT:
                return sprintf( $res, "int" );
            case self::TYPE_FLOAT:
                return sprintf( $res, "float" );
            case self::TYPE_BOOL:
                return sprintf( $res, "bool" );
            case self::TYPE_STRING:
            default:
                return sprintf( $res, "string" );
        }
    }
    
    /**
     * Property read access.
     * 
     * @param string $propertyName Name of the property.
     * @return mixed Value of the property or null.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the the desired property is not found.
     * @ignore
     */
    public function __get( $propertyName )
    {
        if ( isset( $this->$propertyName ) )
        {
            return $this->properties[$propertyName];
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }

    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If a the value for the property options is not an instance of
     * @throws ezcBaseValueException
     *         If a the value for a property is out of range.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "type":
                if ( $propertyValue !== self::TYPE_STRING && $propertyValue !== self::TYPE_INT && $propertyValue !== self::TYPE_FLOAT && $propertyValue !== self::TYPE_BOOL )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "ezcConsoleQuestionDialogTypeValidator::TYPE_*" );
                }
                break;
            case "default":
                if ( is_scalar( $propertyValue ) === false && $propertyValue !== null )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "scalar" );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $propertyValue;
    }

    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        return array_key_exists( $propertyName, $this->properties );
    }
}

?>
PKfa�\H�!���Fpear/ezc/ConsoleTools/dialog/validators/question_dialog_collection.phpnu�[���<?php
/**
 * File containing the ezcConsoleQuestionDialogCollectionValidator class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Validator class to validate against a set of valid results.
 * This validator class, for {@link ezcConsoleQuestionDialog} objects,
 * validates a given result against a set of predefined values.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @property array $collection
 *           The collection of valid answers.
 * @property mixed $default
 *           Default value.
 * @property int $conversion
 *           ezcConsoleDialogValidator::CONVERT_NONE (default) or
 *           ezcConsoleDialogValidator::CONVERT_LOWER or
 *           ezcConsoleDialogValidator::CONVERT_UPPER.
 */
class ezcConsoleQuestionDialogCollectionValidator implements ezcConsoleQuestionDialogValidator
{

    /**
     * Properties.
     * 
     * @var array
     */
    protected $properties  = array(
        "collection"    => array(),
        "default"       => null,
        "conversion"    => self::CONVERT_NONE,
    );

    /**
     * Creates a new question dialog collection validator. 
     * Creates a new question dialog collection validator, which validates the
     * result specified by the user against an array of valid results
     * ($collection). If not value is provided by the user a possibly set
     * $default value is used instead. The $conversion parameter can optionally
     * define a conversion to be performed on the result before validating it.
     * Valid conversions are defined by the CONVERT_* constants in this class.
     * 
     * @param array $collection The collection of valid results.
     * @param mixed $default    Optional default value.
     * @param int $conversion   CONVERT_* constant.
     * @return void
     */
    public function __construct( array $collection, $default = null, $conversion = self::CONVERT_NONE )
    {
        $this->collection = $collection;
        $this->default = $default;
        $this->conversion = $conversion;
    }

    /**
     * Returns if the given result is valid. 
     * Returns if the result is in the $collection array.
     * 
     * @param mixed $result The received result.
     * @return bool If the result is valid.
     */
    public function validate( $result )
    {
        return in_array( $result, $this->collection );
    }

    /**
     * Returns a fixed version of the result, if possible.
     * Converts the given result according to the conversion defined in the
     * $conversion property.
     * 
     * @param mixed $result The received result.
     * @return mixed The manipulated result.
     */
    public function fixup( $result )
    {
        if ( $result === "" && $this->default !== null )
        {
            return $this->default;
        }
        switch ( $this->conversion )
        {
            case self::CONVERT_UPPER:
                return strtoupper( $result );
            case self::CONVERT_LOWER:
                return strtolower( $result );
            default:
                return $result;
        }
    }

    /**
     * Returns a string representing valid results.
     * Returns the string that will be displayed with the question to
     * indicate valid results to the user and a possibly set default, if
     * available.
     * 
     * @return string
     */
    public function getResultString()
    {
        return "(" . implode( "/", $this->collection ) . ")" . ( $this->default !== null ? " [{$this->default}]" : "" );
    }
    
    /**
     * Property read access.
     * 
     * @param string $propertyName Name of the property.
     * @return mixed Value of the property or null.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the the desired property is not found.
     * @ignore
     */
    public function __get( $propertyName )
    {
        if ( isset( $this->$propertyName ) )
        {
            return $this->properties[$propertyName];
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }

    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If a the value for the property options is not an instance of
     * @throws ezcBaseValueException
     *         If a the value for a property is out of range.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "collection":
                if ( is_array( $propertyValue ) === false )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "array" );
                }
                break;
            case "default":
                if ( is_scalar( $propertyValue ) === false && $propertyValue !== null )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "scalar" );
                }
                break;
            case "conversion":
                if ( $propertyValue !== self::CONVERT_NONE && $propertyValue !== self::CONVERT_UPPER && $propertyValue !== self::CONVERT_LOWER )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "ezcConsoleQuestionDialogCollectionValidator::CONVERT_*" );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $propertyValue;
    }

    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        return array_key_exists( $propertyName, $this->properties );
    }
}

?>
PKga�\egO���Apear/ezc/ConsoleTools/dialog/validators/question_dialog_regex.phpnu�[���<?php
/**
 * File containing the ezcConsoleQuestionDialogRegexValidator class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Regex validator for ezcConsoleQuestionDialog
 * Validator class for ezcConsoleQuestionDialog objects that validates by
 * matching a certain regular expression.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @property string $pattern
 *           The pattern to use for validation. Delimiters and modifiers
 *           included.
 * @property mixed $default
 *           A default value if no (an empty string) result given.
 */
class ezcConsoleQuestionDialogRegexValidator implements ezcConsoleQuestionDialogValidator
{

    /**
     * Properties
     * 
     * @var array(string=>mixed)
     */
    protected $properties = array(
        "pattern" => null,
        "default" => null,
    );

    /**
     * Create a new question dialog regex validator.
     * Create a new question dialog regex validator, which validates the result
     * specified against a given regular expression. The delimiters and
     * eventual modifiers must be included in the pattern. If not value is
     * provided by the user a possibly set $default value is used instead.
     *
     * 
     * @param string $pattern Pattern to validate against.
     * @param mixed $default  Default value.
     * @return void
     */
    public function __construct( $pattern, $default = null )
    {
        $this->pattern = $pattern;
        $this->default = $default;
    }

    /**
     * Returns if the given result is valid. 
     * Returns if the result matches the regular expression.
     * 
     * @param mixed $result The received result.
     * @return bool If the result is valid.
     */
    public function validate( $result )
    {
        if ( $result === "" )
        {
            return $this->default !== null;
        }
        return preg_match( $this->pattern, $result ) > 0;
    }

    /**
     * Returns a fixed version of the result, if possible.
     * If no result was provided by the user, the default value will be
     * returned, if set.
     * 
     * @param mixed $result The received result.
     * @return mixed The manipulated result.
     */
    public function fixup( $result )
    {
        if ( $result === "" && $this->default !== null )
        {
            return $this->default;
        }
        return $result;
    }

    /**
     * Returns a string representing valid results.
     * Returns the string that will be displayed with the question to
     * indicate valid results to the user and a possibly set default, if
     * available.
     * 
     * @return string
     */
    public function getResultString()
    {
        return "(match {$this->pattern})" . ( $this->default !== null ? " [{$this->default}]" : "" );
    }
    
    /**
     * Property read access.
     * 
     * @param string $propertyName Name of the property.
     * @return mixed Value of the property or null.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the the desired property is not found.
     * @ignore
     */
    public function __get( $propertyName )
    {
        if ( $this->__isset( $propertyName ) )
        {
            return $this->properties[$propertyName];
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }

    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If a the value for the property options is not an instance of
     * @throws ezcBaseValueException
     *         If a the value for a property is out of range.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "pattern":
                if ( is_string( $propertyValue ) === false || strlen( $propertyValue ) < 2 )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "string, length > 1" );
                }
                break;
            case "default":
                if ( is_scalar( $propertyValue ) === false && $propertyValue !== null )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "scalar" );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $propertyValue;
    }

    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        return array_key_exists( $propertyName, $this->properties );
    }
}

?>
PKga�\����0pear/ezc/ConsoleTools/dialog/question_dialog.phpnu�[���<?php
/**
 * File containing the ezcConsoleQuestionDialog class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Dialog class to ask a simple question.
 * This dialog outputs a certain string to the user and requests a line of
 * input. This is commonly used to ask questions like "Do you want to proceed?"
 * and retrieve an answer like "y" for yes or "n" for no.
 *
 * The behaviour of this dialog is defined by an instance of
 * {@link ezcConsoleQuestionDialogOptions}.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @property ezcConsoleQuestionDialogOptions $options
 *           Options for the dialog.
 * @property ezcConsoleOutput $output
 *           Output object for displaying the dialog.
 */
class ezcConsoleQuestionDialog implements ezcConsoleDialog
{

    /**
     * Dialog result 
     * 
     * @var mixed
     */
    protected $result;

    /**
     * Properties 
     * 
     * @var array
     */
    protected $properties = array(
        "options"   => null,
        "output"    => null,
    );

    /**
     * Creates a new question dialog.
     * Creates a new menu dialog to be displayed to the user. All behaviour is
     * defined through the $options parameter. The $output parameter is used to
     * display the dialog in the {@link display()} method.
     * 
     * @param ezcConsoleOutput $output                 Output object.
     * @param ezcConsoleQuestionDialogOptions $options Options.
     * @return void
     */
    public function __construct( ezcConsoleOutput $output, ezcConsoleQuestionDialogOptions $options = null )
    {
        $this->output  = $output;
        $this->options = $options === null ? new ezcConsoleQuestionDialogOptions() : $options;
    }

    /**
     * Returns if the dialog retrieved a valid result.
     * If a valid result has already been received, this method returns true,
     * otherwise false.
     * 
     * @return bool If a valid result was retrieved.
     */
    public function hasValidResult()
    {
        return $this->result !== null;
    }

    /**
     * Returns the result retrieved.
     * If no valid result was retreived, yet, this method should throw an
     * ezcConsoleNoValidDialogResultException.
     * 
     * If no valid result was retreived, yet, this method throws an
     * ezcConsoleNoValidDialogResultException. Use {@link hasValidResult()} to
     * avoid this.
     * 
     * @return mixed The retreived result.
     *
     * @throws ezcDialogNoValidResultException
     *         if this method is called without a valid result being retrieved
     *         by the object. Use {@link hasValidResult()} to avoid this
     *         exception.
     */
    public function getResult()
    {
        if ( $this->result === null )
        {
            throw new ezcConsoleNoValidDialogResultException();
        }
        return $this->result;
    }

    /**
     * Displays the dialog and retreives a value from the user.
     * Displays the dialog and retreives the desired answer from the user. If
     * the a valid result is retrieved, it can be obtained using {@link
     * getResult()}. The method {@link hasValidResult()} can be used to check
     * if a valid result is available.
     * 
     * @return void
     * @throws ezcConsoleDialogAbortException
     *         if the user closes STDIN using <CTRL>-D.
     */
    public function display()
    {
        $this->reset();

        $this->output->outputText(
            $this->options->text . ( $this->options->showResults === true ? " " . $this->options->validator->getResultString() : "" ) . " ",
            $this->options->format
        );
        $result = $this->options->validator->fixup( ezcConsoleDialogViewer::readLine() );
        if ( $this->options->validator->validate( $result ) )
        {
            $this->result = $result;
        }
    }

    /**
     * Reset the dialog.
     * Resets a possibly received result and all changes made to the dialog
     * during {@link display()}. After that, the dialog can be re-used. All
     * option values are kept.
     * 
     * @return void
     */
    public function reset()
    {
        $this->result = null;
    }

    /**
     * Returns a ready to use yes/no question dialog.
     * Returns a question dialog, which requests the answers "y" for "yes" or
     * "n" for "no" from the user. The answer is converted to lower-case.
     *
     * <code>
     * // Would you like to proceed? (y/n) 
     * $dialog = ezcConsoleDialog( $out, "Would you like to proceed?" );
     *
     * // Would you like to proceed? (y/n) [n] 
     * $dialog = ezcConsoleDialog( $out, "Would you like to proceed?", "n" );
     * </code>
     * 
     * @param ezcConsoleOutput $out  Output object.
     * @param string $questionString Question string.
     * @param string $default        "y" or "n", if default value is desired.
     * @return ezcConsoleQuestionDialog The created dialog.
     */
    public static function YesNoQuestion( ezcConsoleOutput $out, $questionString, $default = null )
    {
        $opts = new ezcConsoleQuestionDialogOptions();
        $opts->text = $questionString;
        $opts->showResults = true;
        $opts->validator = new ezcConsoleQuestionDialogMappingValidator(
            array( "y", "n" ),
            $default,
            ezcConsoleQuestionDialogCollectionValidator::CONVERT_LOWER,
            array(
                'yes' => 'y',
                'no'  => 'n',
            )
        );

        return new ezcConsoleQuestionDialog( $out, $opts );
    }

    /**
     * Property read access.
     *
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * 
     * @param string $propertyName Name of the property.
     * @return mixed Value of the property or null.
     * @ignore
     */
    public function __get( $propertyName )
    {
        if ( array_key_exists( $propertyName, $this->properties ) )
        {
            return $this->properties[$propertyName];
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }

    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyPermissionException
     *         If the property you try to access is read-only.
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "options":
                if ( ( $propertyValue instanceof ezcConsoleQuestionDialogOptions ) === false )
                {
                    throw new ezcBaseValueException(
                        $propertyName,
                        ( is_object( $propertyValue ) ? get_class( $propertyValue ) : gettype( $propertyValue ) ),
                        "instance of ezcConsoleQuestionDialogOptions"
                    );
                }
                break;
            case "output":
                if ( ( $propertyValue instanceof ezcConsoleOutput ) === false )
                {
                    throw new ezcBaseValueException(
                        $propertyName,
                        ( is_object( $propertyValue ) ? get_class( $propertyValue ) : gettype( $propertyValue ) ),
                        "instance of ezcConsoleOutput"
                    );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $propertyValue;
    }

    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property to check.
     * @return bool If the property exists or not.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        return array_key_exists( $propertyName, $this->properties );
    }
}

?>
PKga�\	L�^#pear/ezc/ConsoleTools/statusbar.phpnu�[���<?php
/**
 * File containing the ezcConsoleStatusbar class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Creating  and maintaining status-bars to be printed to the console. 
 *
 * <code>
 * // Construction
 * $status = new ezcConsoleStatusbar( new ezcConsoleOutput() );
 *
 * // Set option
 * $status->options['successChar'] = '*';
 *
 * // Run statusbar
 * foreach ( $files as $file )
 * {
 *      $res = $file->upload();
 *      // Add status if form of bool true/false to statusbar.
 *      $status->add( $res ); // $res is true or false
 * }
 *
 * // Retreive and display final statusbar results
 * $msg = $status->getSuccess() . ' succeeded, ' . $status->getFailure() . ' failed.';
 * $out->outputText( "Finished uploading files: $msg\n" );
 * </code>
 *  
 * @property ezcConsoleStatusbarOptions $options
 *           Contains the options for this class.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @mainclass
 */
class ezcConsoleStatusbar
{
    /**
     * Container to hold the properties
     *
     * @var array(string=>mixed)
     */
    protected $properties;

    /**
     * The ezcConsoleOutput object to use.
     *
     * @var ezcConsoleOutput
     */
    protected $outputHandler;

    /**
     * Counter for success and failure outputs. 
     * 
     * @var array(bool=>int)
     */
    protected $counter = array( 
        true  => 0,
        false => 0,
    );

    /**
     * Creates a new status bar.
     *
     * @param ezcConsoleOutput $outHandler Handler to utilize for output
     * @param array(string=>string) $options       Options
     *
     * @see ezcConsoleStatusbar::$options
     */
    public function __construct( ezcConsoleOutput $outHandler, array $options = array() )
    {
        $this->outputHandler = $outHandler;
        $this->properties['options'] = new ezcConsoleStatusbarOptions( $options );
    }

    /**
     * Property read access.
     * 
     * @param string $key Name of the property.
     * @return mixed Value of the property or null.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the the desired property is not found.
     * @ignore
     */
    public function __get( $key )
    {
        switch ( $key )
        {
            case 'options':
                return $this->properties['options'];
                break;
        }
        if ( isset( $this->properties['options']->$key ) )
        {
            return $this->properties['options']->$key;
        }
        throw new ezcBasePropertyNotFoundException( $key );
    }

    /**
     * Set new options.
     * This method allows you to change the options of a statusbar.
     *  
     * @param array(string=>string)|ezcConsoleOutputOptions $options The options to set.
     *
     * @throws ezcBaseSettingNotFoundException
     *         If you tried to set a non-existent option value.
     * @throws ezcBaseSettingValueException
     *         If the value is not valid for the desired option.
     * @throws ezcBaseValueException
     *         If you submit neither an array nor an instance of 
     *         ezcConsoleOutputOptions.
     */
    public function setOptions( $options ) 
    {
        if ( is_array( $options ) ) 
        {
            $this->properties['options']->merge( $options );
        } 
        else if ( $options instanceof ezcConsoleStatusbarOptions ) 
        {
            $this->properties['options'] = $options;
        }
        else
        {
            throw new ezcBaseValueException( "options", $options, "instance of ezcConsoleStatusbarOptions" );
        }
    }

    /**
     * Property write access.
     * 
     * @param string $key Name of the property.
     * @param mixed $val  The value for the property.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If a desired property could not be found.
     * @throws ezcBaseValueException
     *         If a desired property value is out of range.
     * @ignore
     */
    public function __set( $key, $val )
    {
        switch ( $key )
        {
            // Those two are here for BC reasons only, it is proper to
            // use $statusbar->options->successChar instead of just
            // $statusbar->successChar.
            case 'successChar':
            case 'failureChar':
                // No checks necessary here, already performed in
                // ezcConsoleStatusbarOptions
                break;
            case "options":
                if ( ( $val instanceof ezcConsoleStatusbarOptions ) === false )
                {
                    throw new ezcBaseValueException( $key, $val, 'ezcConsoleStatusbarOptions' );
                }
                $this->properties[$key] = $val;
                return;
            default:
                throw new ezcBasePropertyNotFoundException( $key );
        }
        $this->properties['options'][$key] = $val;
    }
 
    /**
     * Property isset access.
     * 
     * @param string $key Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $key )
    {
        return isset( $this->properties['options'][$key] ) || isset( $this->properties[$key] );
    }
    
    /**
     * Returns the current options.
     * Returns the options currently set for this progressbar.
     * 
     * @return ezcConsoleStatusbarOptions The current options.
     */
    public function getOptions()
    {
        return $this->properties['options'];
    }

    /**
     * Add a status to the status bar.
     * Adds a new status to the bar which is printed immediately. If the
     * cursor is currently not at the beginning of a line, it will move to
     * the next line.
     *
     * @param bool $status Print successChar on true, failureChar on false.
     * @return void
     */
    public function add( $status )
    {
        if ( is_bool( $status ) === false )
        {
            trigger_error( 'Unknown status '.var_export( $status, true ).'.', E_USER_WARNING );
            $status = (bool) $status;
        }
        switch ( $status )
        {
            case true:
                $this->outputHandler->outputText( $this->properties['options']['successChar'], 'success' );
                break;

            case false:
                $this->outputHandler->outputText( $this->properties['options']['failureChar'], 'failure' );
                break;
        }
        $this->counter[$status]++;
    }

    /**
     * Reset the state of the status-bar object to its initial one. 
     * 
     * @return void
     */
    public function reset()
    {
        foreach ( $this->counter as $status => $count )
        {
            $this->counter[$status] = 0;
        }
    }

    /**
     * Returns number of successes during the run.
     * Returns the number of success characters printed from this status bar.
     * 
     * @return int Number of successes.
     */
    public function getSuccessCount()
    {
        return $this->counter[true];
    }

    /**
     * Returns number of failures during the run.
     * Returns the number of failure characters printed from this status bar.
     * 
     * @return int Number of failures.
     */
    public function getFailureCount()
    {
        return $this->counter[false];
    }
}
?>
PKga�\���O��&pear/ezc/ConsoleTools/tools/string.phpnu�[���<?php
/**
 * File containing the ezcConsoleStringTool class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */
/**
 * String tool class.
 *
 * Tool class for the ConsoleTools package. Contains multi-byte encoding save
 * string methods.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @access private
 */
class ezcConsoleStringTool
{
    /**
     * Binary safe wordwrap() replacement.
     *
     * This method is a multi-byte encoding safe replacement for the PHP
     * function wordwrap(). It mimics exactly the behavior of wordwrap(), but
     * uses iconv_* functions with UTF-8 encoding. The parameters received by
     * this method equal the parameters of {@link http://php.net/wordwrap
     * wordwrap()}. Note: Make sure to only hand UTF-8 encoded content to this
     * method.
     * 
     * @param string $str 
     * @param int $width 
     * @param string $break 
     * @param bool $cut 
     * @return string|false
     */
    public function wordWrap( $str, $width = 75, $break = "\n", $cut = false )
    {
        $strlen   = iconv_strlen( $str, 'UTF-8' );
        $breaklen = iconv_strlen( $break, 'UTF-8' );
        $newtext  = '';

        if ( $strlen === 0 )
        {
            return '';
        }
    
        if ( $breaklen === 0 )
        {
            return false;
        }

        if ( $width === 0 && $cut )
        {
            return false;
        }

        $laststart  = $lastspace = 0;
        $breakstart = iconv_substr( $break, 0, 1, 'UTF-8' );

        for ( $current = 0; $current < $strlen; $current++ )
        {
            $char = iconv_substr( $str, $current, 1, 'UTF-8' );

            // Existing line break, copy line and  start a new one
            if ( $char === $breakstart
                 && $current + $breaklen < $strlen
                 && iconv_substr( $str, $current, $breaklen, 'UTF-8' ) === $break
               )
            {
                $newtext .= iconv_substr( $str, $laststart, $current - $laststart + $breaklen, 'UTF-8' );
                $current += $breaklen - 1;
                $laststart = $lastspace = $current + 1;
            }

            // Keep track of spaces, if line break is necessary, do it
            else if ( $char === ' ' )
            {
                if ( $current - $laststart >= $width )
                {
                    $newtext .= iconv_substr( $str, $laststart, $current - $laststart, 'UTF-8' )
                        . $break;
                    $laststart = $current + 1;
                }
                $lastspace = $current;
            }

            // Special cut case, if no space has been seen
            else if ( $current - $laststart >= $width
                      && $cut && $laststart >= $lastspace
                    )
            {
                $newtext .= iconv_substr( $str, $laststart, $current - $laststart, 'UTF-8' )
                    . $break;
                $laststart = $lastspace = $current;
            }


            // Usual case that line got longer than expected
            else if ( $current - $laststart >= $width
                      && $laststart < $lastspace
                    )
            {
                $newtext .= iconv_substr( $str, $laststart, $lastspace - $laststart, 'UTF-8' )
                    . $break;
                // $laststart = $lastspace = $lastspace + 1;
                $laststart = ++$lastspace;
            }
        }

		// Rest of the string
        if ( $laststart !== $current )
        {
            $newtext .= iconv_substr( $str, $laststart, $current - $laststart, 'UTF-8' );
        }

        return $newtext;
    }

    /**
     * Binary safe str_pad() replacement.
     *
     * This method is a multi-byte encoding safe replacement for the PHP
     * function str_pad().  It mimics exactly the behavior of str_pad(), but
     * uses iconv_* functions with UTF-8 encoding. The parameters received by
     * this method equal the parameters of {@link http://php.net/str_pad
     * str_pad()}. Note: Make sure to hand only UTF-8 encoded content to this
     * method.
     * 
     * @param string $input 
     * @param int $padLength 
     * @param string $padString 
     * @param int $padType 
     * @return string
     */
    public function strPad( $input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT )
    {
        $input     = (string) $input;

        $strLen    = iconv_strlen( $input, 'UTF-8' );
        $padStrLen = iconv_strlen( $padString, 'UTF-8' );

        if ( $strLen >= $padLength )
        {
            return $input;
        }

        if ( $padType === STR_PAD_BOTH )
        {
            return $this->strPad(
                $this->strPad(
                    $input,
                    $strLen + ceil( ( $padLength - $strLen ) / 2 ),
                    $padString
                ),
                $padLength,
                $padString,
                STR_PAD_LEFT
            );
        }

        $fullStrRepeats = (int) ( ( $padLength - $strLen ) / $padStrLen );
        $partlyPad = iconv_substr(
            $padString,
            0,
            ( ( $padLength - $strLen ) % $padStrLen )
        );

        $padding = str_repeat( $padString, $fullStrRepeats ) . $partlyPad;

        switch ( $padType )
        {
            case STR_PAD_LEFT:
                return $padding . $input;
            case STR_PAD_RIGHT:
            default:
                return $input . $padding;
        }
    }
}

?>
PKha�\���Q��-pear/ezc/ConsoleTools/options/menu_dialog.phpnu�[���<?php
/**
 * File containing the ezcConsoleMenuDialogOptions class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Basic options class for ezcConsoleDialog implementations.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @property string $text
 *           The text to display before the menu.
 * @property string $formatString
 *           The format string for each menu element.
 * @property string $selectText
 *           The test to display after the menu to indicate the user that he
 *           should select an item.
 * @property ezcConsoleMenuDialogValidator $validator
 *           The validator to use with this menu.
 * @property string $format
 *           The output format for the dialog.
 */
class ezcConsoleMenuDialogOptions extends ezcConsoleDialogOptions
{

    /**
     * Construct a new options object.
     * Options are constructed from an option array by default. The constructor
     * automatically passes the given options to the __set() method to set them 
     * in the class.
     * 
     * @throws ezcBasePropertyNotFoundException
     *         If trying to access a non existent property.
     * @throws ezcBaseValueException
     *         If the value for a property is out of range.
     * @param array(string=>mixed) $options The initial options to set.
     */
    public function __construct( array $options = array() )
    {
        $this->properties["text"]           = "Please choose an item.";
        $this->properties["formatString"]   = "%3s) %s\n";
        $this->properties["selectText"]     = "Select: ";
        $this->properties["validator"]      = new ezcConsoleMenuDialogDefaultValidator();
        parent::__construct( $options );
    }

    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyPermissionException
     *         If the property you try to access is read-only.
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "text":
                if ( is_string( $propertyValue ) === false || strlen( $propertyValue ) < 1 )
                {
                    throw new ezcBaseValueException(
                        $propertyName,
                        $propertyValue,
                        "string, length > 0"
                    );
                }
                break;
            case "selectText":
                if ( is_string( $propertyValue ) === false )
                {
                    throw new ezcBaseValueException(
                        $propertyName,
                        $propertyValue,
                        "string"
                    );
                }
                break;
            case "formatString":
                if ( is_string( $propertyValue ) === false )
                {
                    throw new ezcBaseValueException(
                        $propertyName,
                        $propertyValue,
                        "string"
                    );
                }
                break;
            case "validator":
                if ( ( $propertyValue instanceof ezcConsoleMenuDialogValidator ) === false )
                {
                    throw new ezcBaseValueException(
                        $propertyName,
                        $propertyValue,
                        "ezcConsoleMenuDialogValidator"
                    );
                }
            default:
                parent::__set( $propertyName, $propertyValue );
        }
        $this->properties[$propertyName] = $propertyValue;
    }
}

?>
PKha�\��BB1pear/ezc/ConsoleTools/options/progressmonitor.phpnu�[���<?php
/**
 * File containing the ezcConsoleProgressMonitorOptions class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Struct class to store the options of the ezcConsoleOutput class.
 * This class stores the options for the {@link ezcConsoleOutput} class.
 *
 * @property string $formatString
 *           The format string to describe the complete progress monitor.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleProgressMonitorOptions extends ezcBaseOptions
{
    protected $properties = array(
        'formatString' => '%8.1f%% %s %s',
    );

    /**
     * Option write access.
     * 
     * @throws ezcBasePropertyNotFoundException
     *         If a desired property could not be found.
     * @throws ezcBaseValueException
     *         If a desired property value is out of range.
     *
     * @param string $key Name of the property.
     * @param mixed $value  The value for the property.
     * @ignore
     */
    public function __set( $key, $value )
    {
        switch ( $key )
        {
            case "formatString":
                if ( is_string( $value ) === false || strlen( $value ) < 1 )
                {
                    throw new ezcBaseValueException( $key, $value, 'string, not empty' );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $key );
        }
        $this->properties[$key] = $value;
    }
}

?>
PKha�\��y��+pear/ezc/ConsoleTools/options/statusbar.phpnu�[���<?php
/**
 * File containing the ezcConsoleStatusbarOptions class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Struct class to store the options of the ezcConsoleOutput class.
 * This class stores the options for the {@link ezcConsoleOutput} class.
 *
 * @property string $successChar
 *           The char shown for a succeeded status.
 * @property string $failureChar
 *           The char shown for a failed status.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleStatusbarOptions extends ezcBaseOptions
{
    protected $properties = array(
        'successChar' => "+",
        'failureChar' => "-",
    );

    /**
     * Option write access.
     * 
     * @throws ezcBasePropertyNotFoundException
     *         If a desired property could not be found.
     * @throws ezcBaseValueException
     *         If a desired property value is out of range.
     *
     * @param string $key Name of the property.
     * @param mixed $value  The value for the property.
     * @ignore
     */
    public function __set( $key, $value )
    {
        switch ( $key )
        {
            case "successChar":
            case "failureChar":
                if ( is_string( $value ) === false || strlen( $value ) < 1 )
                {
                    throw new ezcBaseValueException( $key, $value, 'string, not empty' );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $key );
        }
        $this->properties[$key] = $value;
    }
}

?>
PKha�\��88HH'pear/ezc/ConsoleTools/options/table.phpnu�[���<?php
/**
 * File containing the ezcConsoleTableOptions class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Struct class to store the options of the ezcConsoleTable class.
 * This class stores the options for the {@link ezcConsoleTable} class.
 *
 * @property mixed $colWidth
 *           Either 'auto' for automatic selection of column widths, or an
 *           array of column widths like array( 10, 30, 10 ).
 * @property int $colWrap
 *           Wrap style of text contained in strings. See {@link
 *           ezcConsoleTable::WRAP_AUTO}, {@link ezcConsoleTable::WRAP_NONE}
 *           and {@link ezcConsoleTable::WRAP_CUT}.
 * @property int $defaultAlign
 *           Standard column alignment, applied to cells that have to explicit
 *           alignment assigned. See {@link ezcConsoleTable::ALIGN_LEFT},
 *           {@link ezcConsoleTable::ALIGN_RIGHT}, {@link
 *           ezcConsoleTable::ALIGN_CENTER} and {@link
 *           ezcConsoleTable::ALIGN_DEFAULT}.
 * @property string $colPadding
 *           Padding characters for side padding between data and lines.
 * @property int $widthType
 *           Type of the given table width (fixed or maximal value).
 * @property string $lineVertical
 *           Character to use for drawing vertical lines. Null to switch off.
 * @property string $lineHorizontal
 *           Character to use for drawing horizontal lines. Null to switch off.
 * @property string $corner
 *           Character to use for drawing line corners. Null to switch off.
 * @property string $defaultFormat
 *           Standard column content format, applied to cells that have
 *           "default" as the content format.
 * @property string $defaultBorderFormat
 *           Standard border format, applied to rows that have 'default' as the
 *           border format.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleTableOptions extends ezcBaseOptions
{
    protected $properties = array(
        'colWidth'            => 'auto',
        'colWrap'             => ezcConsoleTable::WRAP_AUTO,
        'defaultAlign'        => ezcConsoleTable::ALIGN_LEFT,
        'colPadding'          => ' ',
        'widthType'           => ezcConsoleTable::WIDTH_MAX,
        'lineVertical'        => '-',
        'lineHorizontal'      => '|',
        'corner'              => '+',
        'defaultFormat'       => 'default',
        'defaultBorderFormat' => 'default',
    );

    /**
     * Construct a new options object.
     *
     * NOTE: For backwards compatibility reasons the old method of instantiating this class is kept,
     * but the usage of the new version (providing an option array) is highly encouraged.
     * 
     * @param array(string=>mixed) $options The initial options to set.
     * @return void
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the value for the property options is not an instance of
     * @throws ezcBaseValueException
     *         If the value for a property is out of range.
     */
    public function __construct()
    {
        $args = func_get_args();
        if ( func_num_args() === 1 && is_array( $args[0] ) && !is_int( key( $args[0] ) ) )
        {
            parent::__construct( $args[0] );
        }
        else
        {
            foreach ( $args as $id => $val )
            {
                switch ( $id )
                {
                    case 0:
                        $this->__set( 'colWidth', $val );
                        break;
                    case 1:
                        $this->__set( 'colWrap', $val );
                        break;
                    case 2:
                        $this->__set( 'defaultAlign', $val );
                        break;
                    case 3:
                        $this->__set( 'colPadding', $val );
                        break;
                    case 4:
                        $this->__set( 'widthType', $val );
                        break;
                    case 5:
                        $this->__set( 'lineVertical', $val );
                        break;
                    case 6:
                        $this->__set( 'lineHorizontal', $val );
                        break;
                    case 7:
                        $this->__set( 'corner', $val );
                        break;
                    case 8:
                        $this->__set( 'defaultFormat', $val );
                        break;
                    case 9:
                        $this->__set( 'defaultBorderFormat', $val );
                        break;
                }
            }
        }
    }

    /**
     * Property write access.
     * 
     * @throws ezcBasePropertyNotFoundException
     *         If a desired property could not be found.
     * @throws ezcBaseValueException
     *         If a desired property value is out of range.
     *
     * @param string $propertyName Name of the property.
     * @param mixed $val  The value for the property.
     * @ignore
     */
    public function __set( $propertyName, $val )
    {
        switch ( $propertyName )
        {
            case 'colWidth':
                if ( is_array( $val ) === false && ( is_string( $val ) && $val !== 'auto' ) )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'array(int) or "auto"' );
                }
                break;
            case 'colWrap':
                if ( $val !== ezcConsoleTable::WRAP_AUTO && $val !== ezcConsoleTable::WRAP_NONE && $val !== ezcConsoleTable::WRAP_CUT )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'ezcConsoleTable::WRAP_AUTO, ezcConsoleTable::WRAP_NONE, ezcConsoleTable::WRAP_CUT' );
                }
                break;
            case 'defaultAlign':
                if ( $val !== ezcConsoleTable::ALIGN_DEFAULT && $val !== ezcConsoleTable::ALIGN_LEFT && $val !== ezcConsoleTable::ALIGN_CENTER && $val !== ezcConsoleTable::ALIGN_RIGHT )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'ezcConsoleTable::ALIGN_DEFAULT, ezcConsoleTable::ALIGN_LEFT, ezcConsoleTable::ALIGN_CENTER, ezcConsoleTable::ALIGN_RIGHT' );
                }
                break;
            case 'colPadding':
                if ( !is_string( $val ) )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'string' );
                }
                break;
            case 'widthType':
                if ( $val !== ezcConsoleTable::WIDTH_MAX && $val !== ezcConsoleTable::WIDTH_FIXED )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'ezcConsoleTable::WIDTH_MAX, ezcConsoleTable::WIDTH_FIXED' );
                }
                break;
            case 'lineVertical':
            case 'lineHorizontal':
            case 'corner':
                if ( ( is_string( $val ) === false || strlen( $val ) !== 1 ) && $val !== null )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'string, length = 1, or null' );
                }
                break;
            case 'defaultFormat':
                if ( is_string( $val ) === false || strlen( $val ) < 1 )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'string, length = 1' );
                }
                break;
            case 'defaultBorderFormat':
                if ( is_string( $val ) === false || strlen( $val ) < 1 )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'string, length = 1' );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $val;
    }
}

?>
PKha�\'��J

(pear/ezc/ConsoleTools/options/output.phpnu�[���<?php
/**
 * File containing the ezcConsoleOutputOptions class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Struct class to store the options of the ezcConsoleOutput class.
 *
 * This class stores the options for the {@link ezcConsoleOutput} class.
 *
 * @property int $verbosityLevel
 *           Determines the level of verbosity.
 * @property int $autobreak
 *           Determines, whether text is automatically wrapped after a
 *           specific amount of characters in a line. If set to 0
 *           (default), lines will not be wrapped automatically.
 * @property bool $useFormats
 *           Whether to use formatting or not.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOutputOptions extends ezcBaseOptions
{
    /**
     * Construct a new options object.
     *
     * NOTE: For BC reasons the old method of instanciating this class is kept,
     * but the usage of the new version is highly encouraged.
     * 
     * @param array(string=>mixed) $options The initial options to set.
     * @return void
     *
     * @throws ezcBasePropertyNotFoundException
     *         If a the value for the property options is not an instance of
     * @throws ezcBaseValueException
     *         If a the value for a property is out of range.
     */
    public function __construct()
    {
        $this->properties['verbosityLevel'] = 1;
        $this->properties['autobreak'] = 0;
        $this->properties['useFormats'] = true;
        $args = func_get_args();
        if ( func_num_args() === 1 && is_array( $args[0] ) )
        {
            parent::__construct( $args[0] );
        }
        else
        {
            foreach ( $args as $id => $val )
            {
                switch ( $id )
                {
                    case 0:
                        $this->__set( "verbosityLevel", $val );
                        break;
                    case 1:
                        $this->__set( "autobreak", $val );
                        break;
                    case 2:
                        $this->__set( "useFormats", $val );
                        break;
                }
            }
        }
    }

    /**
     * Property write access.
     * 
     * @throws ezcBasePropertyNotFoundException
     *         If a desired property could not be found.
     * @throws ezcBaseValueException
     *         If a desired property value is out of range.
     *
     * @param string $propertyName Name of the property.
     * @param mixed $val  The value for the property.
     * @ignore
     */
    public function __set( $propertyName, $val )
    {
        switch ( $propertyName )
        {
            case 'verbosityLevel':
            case 'autobreak':
                if ( !is_int( $val ) || $val < 0 )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'int >= 0' );
                }
                break;
            case 'useFormats':
                if ( !is_bool( $val ) )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'bool' );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $val;
    }
}

?>
PKha�\*��..(pear/ezc/ConsoleTools/options/dialog.phpnu�[���<?php
/**
 * This file contains the ezcConsoleDialogOptions class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 * @access public
 */

/**
 * Basic options class for ezcConsoleDialog implementations.
 * 
 * @property ezcConsoleDialogValidator $validator
 *           The validator to use with this dialog.
 * @property string $format
 *           The output format for the dialog.
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleDialogOptions extends ezcBaseOptions
{
    /**
     * Properties.
     * 
     * @var array(string=>mixed)
     */
    protected $properties = array(
        "format"    => "default",
        "validator" => null
    );

    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyPermissionException
     *         If the property you try to access is read-only.
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "format":
                if ( is_string( $propertyValue ) === false || strlen( $propertyValue ) < 1 )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "string, length > 0" );
                }
                break;
            case "validator":
                if ( ( $propertyValue instanceof ezcConsoleDialogValidator ) === false )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "ezcConsoleDialogValidator" );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $propertyValue;
    }
}

?>
PKha�\�,���1pear/ezc/ConsoleTools/options/question_dialog.phpnu�[���<?php
/**
 * File containing the ezcConsoleQuestionDialogOptions class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Basic options class for ezcConsoleDialog implementations.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @property string $text
 *           The question itself.
 * @property ezcConsoleQuestionDialogValidator $validator
 *           The validator to use with this dialog.
 * @property bool $showResults
 *           Wether to display the possible results and the default selection.
 * @property string $format
 *           The output format for the dialog.
 */
class ezcConsoleQuestionDialogOptions extends ezcConsoleDialogOptions
{

    /**
     * Construct a new options object.
     * Options are constructed from an option array by default. The constructor
     * automatically passes the given options to the __set() method to set them 
     * in the class.
     * 
     * @throws ezcBasePropertyNotFoundException
     *         If trying to access a non existent property.
     * @throws ezcBaseValueException
     *         If the value for a property is out of range.
     * @param array(string=>mixed) $options The initial options to set.
     */
    public function __construct( array $options = array() )
    {
        $this->properties["text"]           = "Please enter a value: ";
        $this->properties["validator"]      = new ezcConsoleQuestionDialogTypeValidator();
        $this->properties["showResults"] = false;
        parent::__construct( $options );
    }

    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $propertyValue The value for the property.
     *
     * @throws ezcBasePropertyPermissionException
     *         If the property you try to access is read-only.
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "text":
                if ( is_string( $propertyValue ) === false || strlen( $propertyValue ) < 1 )
                {
                    throw new ezcBaseValueException(
                        $propertyName,
                        $propertyValue,
                        "string, length > 0"
                    );
                }
                break;
            case "showResults":
                if ( is_bool( $propertyValue ) === false )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "bool" );
                }
                break;
            case "validator":
                if ( ( $propertyValue instanceof ezcConsoleQuestionDialogValidator ) === false )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "ezcConsoleQuestionDialogValidator" );
                }
                break;
            default:
                parent::__set( $propertyName, $propertyValue );
                return;
        }
        $this->properties[$propertyName] = $propertyValue;
    }
}

?>
PKia�\ͅ���-pear/ezc/ConsoleTools/options/progressbar.phpnu�[���<?php
/**
 * File containing the ezcConsoleProgressbarOptions class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Struct class to store the options of the ezcConsoleOutput class.
 * This class stores the options for the {@link ezcConsoleOutput} class.
 *
 * @property string $barChar
 *           The character to fill the bar with, during progress indication.
 * @property string $emptyChar
 *           The character to pre-fill the bar, before indicating progress.
 * @property string $formatString
 *           The format string to describe the complete progressbar.
 * @property string $fractionFormat
 *           Format to display the fraction value.
 * @property string $processChar
 *           The character for the end of the progress area (the arrow!).
 * @property int $redrawFrequency
 *           How often to redraw the progressbar (on every Xth call to advance()).
 * @property int $step
 *           How many steps to advance the progressbar on each call to advance().
 * @property int $width
 *           The width of the bar itself.
 * @property string $actFormat
 *           The format to display the actual value with.
 * @property string $maxFormat
 *           The format to display the actual value with.
 * @property int $minVerbosity
 *           Defines the minimum {ezcConsoleOutputOptions->$verbosityLevel}
 *           that is needed by the progress bar to be rendered. If
 *           $verbosityLevel is lower, the bar is skipped. Default is 0 to
 *           render always.
 * @property int $maxVerbosity
 *           Defines the maximum {ezcConsoleOutputOptions->$verbosityLevel} on
 *           which the progress bar is rendered. If $verbosityLevel is higher,
 *           the bar is skipped. Default is false, to render always.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleProgressbarOptions extends ezcBaseOptions
{

    protected $properties = array(
        'barChar'         => "+",
        'emptyChar'       => "-",
        'formatString'    => "%act% / %max% [%bar%] %fraction%%",
        'fractionFormat'  => "%01.2f",
        'progressChar'    => ">",
        'redrawFrequency' => 1,
        'step'            => 1,
        'width'           => 78,
        'actFormat'       => '%.0f',
        'maxFormat'       => '%.0f',
        'minVerbosity'    => 1,
        'maxVerbosity'    => false,
    );

    /**
     * Option write access.
     * 
     * @throws ezcBasePropertyNotFoundException
     *         If a desired property could not be found.
     * @throws ezcBaseValueException
     *         If a desired property value is out of range.
     *
     * @param string $key Name of the property.
     * @param mixed $value  The value for the property.
     * @ignore
     */
    public function __set( $key, $value )
    {
        switch ( $key )
        {
            case "barChar":
            case "emptyChar":
            case "progressChar":
            case "formatString":
            case "fractionFormat":
            case "actFormat":
            case "maxFormat":
                if ( is_string( $value ) === false || strlen( $value ) < 1 )
                {
                    throw new ezcBaseValueException( $key, $value, 'string, not empty' );
                }
                break;
            case "width":
                if ( !is_int( $value ) || $value < 5 )
                {
                    throw new ezcBaseValueException( $key, $value, 'int >= 5' );
                }
                break;
            case "redrawFrequency":
            case "step":
                if ( ( !is_int( $value ) && !is_float( $value ) ) || $value < 1 )
                {
                    throw new ezcBaseValueException( $key, $value, 'int > 0' );
                }
                break;
            case 'minVerbosity':
                if ( !is_int( $value ) || $value < 0 )
                {
                    throw new ezcBaseValueException( $key, $value, 'int >= 0' );
                }
                break;
            case 'maxVerbosity':
                if ( ( !is_int( $value ) || $value < 0 ) && $value !== false )
                {
                    throw new ezcBaseValueException( $key, $value, 'int >= 0 or false' );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $key );
        }
        $this->properties[$key] = $value;
    }
}

?>
PKia�\�p���(pear/ezc/ConsoleTools/input/argument.phpnu�[���<?php
/**
 * File containing the ezcConsoleArgument class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * The ezcConsoleArgument class represents an argument on the console.
 * This class is the container to store information about an argument submitted
 * to a shell application. It is used to define the appearance of an argument
 * before parsing the parameter string and contains the received value
 * afterwards. Argument objects are stored in an instance of the set class
 * {@link ezcConsoleArguments} which is stored in
 * {ezcConsoleInput::$argumentDefinition}.
 * 
 * @property string $name      The name for the argument. Must be unique.
 * @property int $type         The value type. 
 * @property string $shorthelp A short help text. 
 * @property string $longhelp  A long help text-
 * @property bool $mandatory   Whether the argument is mandatory.
 * @property mixed $default    A default value, if not mandatory.
 * @property bool $multiple    Whether the argument accepts multiple values.
 * @property-read mixed $value The value parsed from the parameter string, using
 *                             {@link ezcConsoleInput::process()}.
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleArgument
{
    /**
     * Properties 
     * 
     * @var array
     */
    protected $properties = array(
        "name"      => null,
        "type"      => ezcConsoleInput::TYPE_STRING,
        "shorthelp" => "No help available.",
        "longhelp"  => "There is no help for this argument available.",
        "mandatory" => true,
        "multiple"  => false,
        "default"   => null,
        "value"     => null,
    );

    /**
     * Creates a new console argument object.
     * Creates a new console argument object, which represents a single
     * argument on the shell. Arguments are stored insiede 
     * {@link ezcConsoleArguments} which is used with {@link ezcConsoleInput}.
     *
     * For the type property see {@link ezcConsoleInput::TYPE_STRING} and
     * {@link ezcConsoleInput::TYPE_INT}. If 1 argument is defined as optional
     * ($mandatory = false), all following arguments are autolamtically
     * considered optional, too.
     * 
     * @param string $name      The name for the argument. Must be unique.
     * @param int $type         The value type. 
     * @param string $shorthelp A short help text. 
     * @param string $longhelp  A long help text-
     * @param bool $mandatory   Whether the argument is mandatory.
     * @param bool $multiple    Whether the argument accepts multiple values.
     * @param mixed $default    A default value, if not mandatory.
     * @return void
     */
    public function __construct(
        $name      = null,
        $type      = ezcConsoleInput::TYPE_STRING,
        $shorthelp = "No help available.",
        $longhelp  = "There is no help for this argument available.",
        $mandatory = true,
        $multiple  = false,
        $default   = null
    )
    {
        if ( !is_string( $name ) || strlen( $name ) < 1 )
        {
            throw new ezcBaseValueException( "name", $name, "string, length > 0" );
        }
        $this->properties["name"] = $name;

        $this->type               = $type;
        $this->shorthelp          = $shorthelp;
        $this->longhelp           = $longhelp;
        $this->mandatory          = $mandatory;
        $this->multiple           = $multiple;
        $this->default            = $default;
    }

    /**
     * Property set access.
     * 
     * @param string $propertyName  Name of the property.
     * @param string $propertyValue Valze for the property.
     * @return void
     * @ignore
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "name":
                throw new ezcBasePropertyPermissionException( $propertyName, ezcBasePropertyPermissionException::READ );
                break;
            case "type":
                if ( $propertyValue !== ezcConsoleInput::TYPE_INT && $propertyValue !== ezcConsoleInput::TYPE_STRING )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "string, length > 0" );
                }
                break;
            case "shorthelp":
            case "longhelp":
                if ( is_string( $propertyValue ) === false )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "string" );
                }
                break;
            case "mandatory":
            case "multiple":
                if ( is_bool( $propertyValue ) === false )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "bool" );
                }
                break;
            case "default":
                if ( is_scalar( $propertyValue ) === false && is_array( $propertyValue ) === false && $propertyValue !== null )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "array, scalar or null" );
                }
                break;
            case "value":
                if ( is_scalar( $propertyValue ) === false && is_array( $propertyValue ) === false && $propertyValue !== null )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "string or null" );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $propertyValue;
    }

    /**
     * Property read access.
     *
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * 
     * @param string $propertyName Name of the property.
     * @return mixed Value of the property or null.
     * @ignore
     */
    public function __get( $propertyName )
    {
        if ( isset( $this->$propertyName ) )
        {
            return $this->properties[$propertyName];
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }

    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        return array_key_exists( $propertyName, $this->properties );
    }
}

?>
PKja�\�&�T��3pear/ezc/ConsoleTools/input/validators/standard.phpnu�[���<?php
/**
 * File containing the ezcConsoleStandardInputValidator class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */
/**
 * Validates ezcConsoleOption in terms of dependencies/exclusion and more.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @access private
 */
class ezcConsoleStandardInputValidator implements ezcConsoleInputValidator
{
    /**
     * Validates the given $options and $arguments.
     *
     * Validates the given $options against their registered rules. Throws an 
     * exception, if any condition is not met. $hasArguments indicates if 
     * arguments have been submitted in addition.
     *
     * @param array(ezcConsoleOption) $options
     * @param bool $hasArguments
     *
     * @throws ezcConsoleOptionDependencyViolationException
     *         If a dependency was violated. 
     * @throws ezcConsoleOptionExclusionViolationException 
     *         If an exclusion rule was violated.
     * @throws ezcConsoleOptionArgumentsViolationException 
     *         If arguments are passed although a parameter dissallowed them.
     * @throws ezcConsoleOptionMandatoryViolationException
     *         If an option that was marked mandatory was not submitted.
     * @throws ezcConsoleOptionMissingValueException
     *         If an option that expects a value was submitted without one.
     */
    public function validateOptions( array $options, $hasArguments )
    {
        foreach ( $options as $id => $option )
        {
            if ( $option->mandatory === true && $option->value === false )
            {
                throw new ezcConsoleOptionMandatoryViolationException( $option );
            }

            $this->validateDependencies( $option );
            $this->validateExclusions( $option );

            if ( $option->arguments === false && $option->value !== false && $hasArguments )
            {
                throw new ezcConsoleOptionArgumentsViolationException( $option );
            }
        }
    }

    /**
     * Validated option dependencies.
     *
     * Validates dependencies by $option.
     *
     * @param ezcConsoleOption $option.
     */
    private function validateDependencies( ezcConsoleOption $option )
    {
        $optSet = ( $option->value !== false
            && ( !is_array( $option->value ) || $option->value !== array() ) );

        foreach ( $option->getDependencies() as $dep )
        {
            if ( $dep->ifSet === $optSet )
            {
                $this->validateDependency( $option, $dep );
            }
        }
    }

    /**
     * Validates a single dependency.
     *
     * Validates the dependency $dep, which is set in the $srcOpt.
     *
     * @param ezcConsoleOption $srcOpt
     * @param ezcConsoleOptionRule $dep
     */
    private function validateDependency( ezcConsoleOption $srcOpt, ezcConsoleOptionRule $dep )
    {
        $optValue = $dep->option->value;

        if ( $optValue === false || $optValue === array() )
        {
            throw new ezcConsoleOptionDependencyViolationException(
                $srcOpt,
                $dep->option
            );
        }

        if ( $dep->values !== array() )
        {
            $optVals = ( is_array( $optValue ) ? $optValue : array( $optValue) );
            $unrecognizedVals = array_diff( $optVals, $dep->values );
            if ( $unrecognizedVals !== array() )
            {
                throw new ezcConsoleOptionDependencyViolationException(
                    $srcOpt,
                    $dep->option,
                    implode( ', ', $dep->values )
                );
            }
        }
    }

    /**
     * Validated option exclusions.
     *
     * Validates exclusions by $option.
     *
     * @param ezcConsoleOption $option.
     */
    private function validateExclusions( ezcConsoleOption $option )
    {
        $optSet = ( $option->value !== false
            && ( !is_array( $option->value ) || $option->value !== array() ) );

        foreach ( $option->getExclusions() as $excl )
        {
            if ( $excl->ifSet === $optSet )
            {
                $this->validateExclusion( $option, $excl );
            }
        }
    }

    /**
     * Validates a single exclusion.
     *
     * Validates the exclusion $excl, which is set in the $srcOpt.
     *
     * @param ezcConsoleOption $srcOpt
     * @param ezcConsoleOptionRule $excl
     */
    private function validateExclusion( ezcConsoleOption $srcOpt, ezcConsoleOptionRule $excl )
    {
        $optValue = $excl->option->value;

        if ( $optValue !== false && $optValue !== array() && $excl->values === array() )
        {
            throw new ezcConsoleOptionExclusionViolationException(
                $srcOpt,
                $excl->option
            );
        }

        $optVals = ( is_array( $optValue ) ? $optValue : array( $optValue ) );
        $forbiddenVals = array_intersect( $optVals, $excl->values );
        if ( $forbiddenVals !== array() )
        {
            throw new ezcConsoleOptionExclusionViolationException(
                $srcOpt,
                $excl->option,
                implode( ', ', $excl->values )
            );
        }
    }
}

?>
PKja�\
t�^^)pear/ezc/ConsoleTools/input/arguments.phpnu�[���<?php
/**
 * File containing the ezcConsoleArguments collection class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Collection class for ezcConsoleArgument objects. Used in {@link ezcConsoleInput}.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleArguments implements ArrayAccess, Iterator, Countable
{
    /**
     * Ordered list of arguments. 
     * 
     * @var array(ezcConsoleArgument)
     */
    protected $ordered = array();

    /**
     * Named list of arguments. 
     * 
     * @var array(string=>ezcConsoleArgument)
     */
    protected $named = array();

    /**
     * Returns if the given offset exists.
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array. Valid offsets are integers or
     * strings. If an integer is used, it refers to the position in the command
     * line. A string refers to the arguments name property.
     * 
     * @param mixed $offset The offset to check.
     * @return bool True when the offset exists, otherwise false.
     * 
     * @throws ezcBaseValueException
     *         If the provided offset is neither an integer, nor a string.
     */
    public function offsetExists( $offset )
    {
        switch ( gettype( $offset ) )
        {
            case "string":
                return array_key_exists( $offset, $this->named );
            case "integer":
                return array_key_exists( $offset, $this->ordered );
            default:
                throw new ezcBaseValueException( "offset", $offset, "string or int" );
        }
    }

    /**
     * Returns the element with the given offset. 
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array. Valid offsets are integers or
     * strings. If an integer is used, it refers to the position in the command
     * line. A string refers to the arguments name property.
     * 
     * @param string|integer $offset The offset to check.
     * @return ezcConsoleArgument
     *
     * @throws ezcBaseValueException
     *         If the provided offset is neither an integer, nor a string.
     */
    public function offsetGet( $offset )
    {
        switch ( gettype( $offset ) )
        {
            case "string":
                if ( isset( $this[$offset] ) )
                {
                    return $this->named[$offset];
                }
                break;
            case "integer":
                if ( isset( $this[$offset] ) )
                {
                    return $this->ordered[$offset];
                }
                break;
            default:
                throw new ezcBaseValueException( "offset", $offset, "string or int" );
        }
        throw new ezcBasePropertyNotFoundException( $offset );
    }

    /**
     * Set the element with the given offset. 
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array. In contrast to the other
     * ArrayAccess implementations of this class, this method allows only integer
     * keys.
     * 
     * @param int $offset               The offset to assign an item to.
     * @param ezcConsoleArgument $value The argument object to register.
     * @return void
     *
     * @throws ezcBaseValueException
     *         If a non integer offset is provided.
     * @throws ezcBaseValueException
     *         If the provided value is not of type {@ling ezcConsoleTableRow}.
     * @throws ezcConsoleArgumentAlreadyRegisteredException
     *         If an argument with the given offset or name is already registered.
     */
    public function offsetSet( $offset, $value )
    {
        // Determine key if not set (using $obj[] = ...)
        if ( $offset === null )
        {
            $offset = count( $this->ordered ) === 0 ? 0 : max( array_keys( $this->ordered ) ) + 1;
        }

        // Set access only allowed with integer values
        if ( !is_int( $offset ) )
        {
            throw new ezcBaseValueException( "offset", $offset, "int" );
        }
        
        switch ( true )
        {
            case ( $value instanceof ezcConsoleArgument ):
                if ( isset( $this->ordered[$offset] ) )
                {
                    throw new ezcConsoleArgumentAlreadyRegisteredException( $offset, ezcConsoleArgumentAlreadyRegisteredException::ORDERED );
                }
                if ( isset( $this->named[$value->name] ) )
                {
                    throw new ezcConsoleArgumentAlreadyRegisteredException( $value->name, ezcConsoleArgumentAlreadyRegisteredException::NAMED );
                }

                $this->named[$value->name] = $value;
                $this->ordered[$offset]    = $value;
                break;
            case ( $value === null ):
                // Aliasing unset() with assignement to null
                unset( $this->named[$this->ordered[$offset]->name] );
                unset( $this->ordered[$offset] );
                break;
            default:
                throw new ezcBaseValueException( "value", $value, "ezcConsoleArgument or null" );
        }
    }

    /**
     * Unset the element with the given offset. 
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array. In contrast to the other
     * ArrayAccess implementations of this class, this method allows only integer
     * keys.
     * 
     * @param int $offset The offset to unset the value for.
     * @return void
     *
     * @throws ezcBaseValueException
     *         If a non numeric row offset is used.
     */
    public function offsetUnset( $offset )
    {
        // Set access only allowed with integer values
        if ( is_int( $offset ) === false )
        {
            throw new ezcBaseValueException( "offset", $offset, "int" );
        }

        unset( $this->named[$this->ordered[$offset]->name] );
        unset( $this->ordered[$offset] );
    }

    /**
     * Returns the currently selected argument from the list.
     * Used by foreach-Loops.
     * 
     * @return ezcConsoleArgument
     */
    public function current()
    {
        return current( $this->ordered );
    }

    /**
     * Returns the key of the currently selected argument from the list.
     * Used by foreach-Loops. In contrast to the iteration direction, which is
     * defined by the ordered list of arguments, this is the name of the
     * argument.
     * 
     * @return string
     */
    public function key()
    {
        return key( $this->ordered );
    }

    /**
     * Advances the internal pointer to the next argument and returns it. 
     * Used by foreach-Loops.
     * 
     * @return ezcConsoleArgument
     */
    public function next()
    {
        return next( $this->ordered );
    }

    /**
     * Rewinds the internal pointer to the first argument and returns it.
     * Used by foreach-Loops.
     * 
     * @return ezcConsoleArgument
     */
    public function rewind()
    {
        // Called before foreach
        ksort( $this->ordered );
        return reset( $this->ordered );
    }

    /**
     * Checks if the current position is valid.
     * Used by foreach-Loops.
     * 
     * @return bool
     */
    public function valid()
    {
        return ( current( $this->ordered ) !== false );
    }

    /**
     * Returns the number of registered arguments.
     * 
     * @return int
     */
    public function count()
    {
        return count( $this->ordered );
    }
}
?>
PKja�\�%�668pear/ezc/ConsoleTools/input/help_generators/standard.phpnu�[���<?php
/**
 * File containing the ezcConsoleInputStandardHelpGenerator class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */
/**
 * Standard help generator for {@link ezcConsoleInput}.
 *
 * Standard help generation as {@link ezcConsoleInput} did from the start.
 *
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @access private
 * @TODO Verify interface and make it public to replace the validation in 
 *       {@link ezcConsoleInput}.
 */
class ezcConsoleInputStandardHelpGenerator implements ezcConsoleInputHelpGenerator
{
    /**
     * Input object. 
     * 
     * @var ezcConsoleInput
     */
    private $input;

    /**
     * Creates a new help generator.
     *
     * Creates a new help generator for the given $input.
     * 
     * @param ezcConsoleInput $input
     */
    public function __construct( ezcConsoleInput $input )
    {
        $this->input = $input;
    }

    /**
     * Generates help information as a multidimensional array.
     *
     * This method generates a tabular view on the help information of a 
     * program. The returned array has the following structure:
     *
     * <code>
     * <?php
     * array(
     *  0 => array(
     *      0 => '<option short/long name>',
     *      1 => '<option help, depending on the $long parameter>'
     *  ),
     *  1 => array(
     *      0 => '<option short name> / <option long name>',
     *      1 => '<option help, depending on the $long parameter>'
     *  ),
     *  // ...
     * );
     * ?>
     * </code>
     *
     * Each row of the array represents the help information for a single option.
     * The first cell of a row contains the option name (maybe short, long or 
     * both), the second cell contains the help text of the option.
     *
     * The returned array is used by {@link ezcConsoleInput} for different 
     * purposes.
     * For example, the user can retrieve it raw through the
     * {@link ezcConsoleInput::getHelp()} method, he can generate a help
     * {@link ezcConsoleTable} through {@link ezcConsoleInput::getHelpTable()} 
     * are can generate a printable help text through {@link 
     * ezcConsoleInput::getHelpText()}.
     *
     * The parameter $long defines if the long or short help text of the 
     * options should be used in the second cell of the returned array. The
     * $optionsFilter parameter is used to restrict the generated help to a certain 
     * sub-set of options. It consists of an array of short or long names of 
     * the options to include.
     * 
     * @param bool $long 
     * @param array(string) $optionsFilter
     * @return array(array(string))
     */
    public function generateUngroupedOptionHelp( $long = false, array $optionsFilter = null )
    {
        $help = array();
        foreach ( $this->input->getOptions() as $id => $param )
        {
            if ( $optionsFilter === null || in_array( $param->short, $optionsFilter ) || in_array( $param->long, $optionsFilter ) )
            {
                $help[] = $this->getOptionHelpRow( $long, $param );
            }
        }
        return $help;
    }

    /**
     * Generates help information as a multidimensional array, grouped in categories.
     *
     * This method behaves similar to {@link generateUngroupedOptionHelp()}. In 
     * contrast to the latter one, this method returns an array with 1 
     * dimension more, grouping options into categories. The $groups parameter 
     * defines the categories to generate. Each category may contain an 
     * arbitrary number of options, options might occur in different 
     * categories.
     *
     * The returned array has the follorwing format:
     *
     * <code>
     * <?php
     * array(
     *  '<category name>' => array(
     *      0 => array(
     *          0 => '<option short/long name>',
     *          1 => '<option help, depending on the $long parameter>'
     *      ),
     *      1 => array(
     *          0 => '<option short name> / <option long name>',
     *          1 => '<option help, depending on the $long parameter>'
     *      ),
     *      // ...
     *  ),
     *  '<category name>' => array(
     *      // ...
     *  ),
     *  // ...
     * );
     * ?>
     * </code>
     *
     * The $long parameter, as in {@link generateUngroupedOptionHelp()} 
     * determines if the options short or long help is to be used. The
     * $params array can in addition be used to determine if a parameter
     * is displayed at all. If $optionsFilter is submitted and is not null, 
     * only options listed in it will be shown in the help at all.
     * 
     * @param array(string=>array(string)) $groups
     * @param bool $long 
     * @param array(string) $params 
     * @return array(string=>array(array(string)))
     */
    public function generateGroupedOptionHelp( array $groups, $long = false, array $optionsFilter = null )
    {
        $help = array();
        foreach ( $groups as $groupName => $groupOptions )
        {
            foreach ( $groupOptions as $optionName )
            {
                $option = $this->input->getOption( $optionName );
                if ( $optionsFilter === null || in_array( $option->short, $optionsFilter ) || in_array( $option->long, $optionsFilter ) )
                {
                    $help[$groupName][] = $this->getOptionHelpRow(
                        $long,
                        $option
                    );
                }
            }
        }
        return $help;
    }

    /**
     * Generates help information as a multi-dimensonal array for the given $argumentDefinition.
     *
     * This method generates a tabular help information for the given 
     * $argumentDefinition in the following format:
     *
     * <code>
     * <?php
     * array(
     *  0 => array(
     *      0 => '<argument synopsis>',
     *      1 => '<argument help text>'
     *  ),
     *  1 => array(
     *      0 => '<argument synopsis>',
     *      1 => '<argument help text>'
     *  ),
     *  // ...
     * )
     * ?>
     * </code>
     * 
     * The $long parameter defines if the long of short help text should be 
     * used.
     *
     * @param bool $long
     * @return array(array(string))
     */
    public function generateArgumentHelp( $long = false )
    {
        $help = array();
        if ( $this->input->argumentDefinition !== null )
        {
            foreach ( $this->input->argumentDefinition as $arg )
            {
                $argSynopsis = "<%s:%s>";
                switch ( $arg->type )
                {
                    case ezcConsoleInput::TYPE_INT:
                        $type = "int";
                        break;
                    case ezcConsoleInput::TYPE_STRING:
                        $type = "string";
                        break;
                }
                $argSynopsis = sprintf( $argSynopsis, $type, $arg->name );
                $help[] = ( $long === true )
                        ? array( 
                            $argSynopsis,
                            $arg->longhelp . ( $arg->mandatory === false 
                                               ? ' (optional' . ( $arg->default !== null 
                                                                  ? ', default = ' . ( is_array( $arg->default ) 
                                                                                       ? "'" . implode( "' '", $arg->default ) . "'" 
                                                                                       : "'$arg->default'" 
                                                                                     )
                                                                  : '' 
                                                                ) . ')'
                                               : ''
                                             )
                          )
                        : array( $argSynopsis, $arg->shorthelp );
            }
        }
        return $help;
    }

    /**
     * Creates 1 text row for displaying options help. 
     *
     * Returns a single array entry for the {@link getOptionHelpRow()} method.
     *
     * @param bool $long 
     * @param ezcConsoleOption $param
     * @return string
     */
    private function getOptionHelpRow( $long, ezcConsoleOption $param )
    {
        return array( 
            ( $param->short !== "" ? '-' . $param->short . ' / ' : "" ) . '--' . $param->long,
            $long == false ? $param->shorthelp : $param->longhelp,
        );
    }

    /**
     * Generates a command line synopsis for the options and arguments.
     *
     * This method generates a synopsis string that lists the options and 
     * parameters available, indicating their usage. If $optionsFilter is
     * submitted, only the options named in this array (short or long variant) 
     * will be included in the synopsis.
     *
     * @param array(string) $optionsFilter
     * @return string
     */
    public function generateSynopsis( array $optionFilter = null )
    {
        $usedOptions = array( 'short' => array(), 'long' => array() );
        $allowsArgs = true;
        $synopsis = '$ ' . ( isset( $argv ) && sizeof( $argv ) > 0 ? $argv[0] : $_SERVER['argv'][0] ) . ' ';
        foreach ( $this->input->getOptions() as $option )
        {
            if ( $optionFilter === null || in_array( $option->short, $optionFilter ) ||  in_array( $option->long, $optionFilter ) )
            {
                $synopsis .= $this->createOptionSynopsis( $option, $usedOptions, $allowsArgs );
            }
        }
        if ( $this->input->argumentDefinition === null )
        {
            // Old handling
            $synopsis .= " [[--] <args>]";
        }
        else
        {
            $synopsis .= "[--] " . $this->createArgumentsSynopsis();
        }
        return $synopsis;
    }

    /**
     * Returns the synopsis string for a single option and its dependencies.
     *
     * This method returns a part of the program synopsis, specifically for a
     * certain parameter. The method recursively adds depending parameters up
     * to the 2nd depth level to the synopsis. The second parameter is used
     * to store the short names of all options that have already been used in 
     * the synopsis (to avoid adding an option twice). The 3rd parameter 
     * determines the actual deps in the option dependency recursion to 
     * terminate that after 2 recursions.
     * 
     * @param ezcConsoleOption $option        The option to include.
     * @param array(string) $usedOptions Array of used option short names.
     * @param int $depth                      Current recursion depth.
     * @return string The synopsis for this parameter.
     */
    private function createOptionSynopsis( ezcConsoleOption $option, &$usedOptions, $depth = 0 )
    {
        $synopsis = '';

        // Break after a nesting level of 2
        if ( $depth++ > 2 || ( in_array( $option->short, $usedOptions['short'] ) && in_array( $option->long, $usedOptions['long'] ) ) ) return $synopsis;
        
        $usedOptions['short'][] = $option->short;
        $usedOptions['long'][]  = $option->long;
        
        $synopsis .= $option->short !== "" ? "-{$option->short}" : "--{$option->long}";

        if ( isset( $option->default ) )
        {
            $synopsis .= " " . ( $option->type === ezcConsoleInput::TYPE_STRING ? '"' : '' ) . $option->default . ( $option->type === ezcConsoleInput::TYPE_STRING ? '"' : '' );
        }
        else if ( $option->type !== ezcConsoleInput::TYPE_NONE )
        {
            $synopsis .= " ";
            switch ( $option->type )
            {
                case ezcConsoleInput::TYPE_STRING:
                    $synopsis .= "<string>";
                    break;
                case ezcConsoleInput::TYPE_INT:
                    $synopsis .= "<int>";
                    break;
            }
        }

        foreach ( $option->getDependencies() as $rule )
        {
            $deeperSynopsis = $this->createOptionSynopsis( $rule->option, $usedOptions, $depth );
            $synopsis .= ( iconv_strlen( trim( $deeperSynopsis ), 'UTF-8' ) > 0 
                ? ' ' . $deeperSynopsis
                : ''
            );
        }
        
        if ( $option->arguments === false )
        {
            $allowsArgs = false;
        }
        
        // Make the whole thing optional?
        if ( $option->mandatory === false )
        {
            $synopsis = "[$synopsis]";
        }

        return $synopsis . ' ';
    }

    /**
     * Generate synopsis for arguments. 
     * 
     * @return string The synopsis string.
     */
    private function createArgumentsSynopsis()
    {
        $mandatory = true;
        $synopsises = array();
        foreach ( $this->input->argumentDefinition as $arg )
        {
            $argSynopsis = "";
            if ( $arg->mandatory === false )
            {
                $mandatory = false;
            }
            $argSynopsis .= "<%s:%s>";
            switch ( $arg->type )
            {
                case ezcConsoleInput::TYPE_INT:
                    $type = "int";
                    break;
                case ezcConsoleInput::TYPE_STRING:
                    $type = "string";
                    break;
            }
            $argSynopsis = sprintf( $argSynopsis, $type, $arg->name );
            $synopsises[] = $mandatory === false ? "[$argSynopsis]" : $argSynopsis;
            if ( $arg->multiple === true )
            {
                $synopsises[] = "[$argSynopsis ...]";
                break;
            }
        }
        return implode( " ", $synopsises );
    }
}

?>
PKka�\=	�R�L�L&pear/ezc/ConsoleTools/input/option.phpnu�[���<?php
/**
 * File containing the ezcConsoleOption class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Objects of this class store data about a single option for ezcConsoleInput.
 *
 * This class represents a single command line option, which can be handled by 
 * the ezcConsoleInput class. This classes only purpose is the storage of
 * the parameter data, the handling of options and arguments is done by the
 * class {@link ezcConsoleInput}.
 * 
 * @property-read string $short
 *                Short name of the parameter without '-' (eg. 'f').
 * @property-read string $long
 *                Long name of the parameter without '--' (eg. 'file').
 * @property int $type
 *           Value type of this parameter, default is ezcConsoleInput::TYPE_NONE.
 *           See {@link ezcConsoleInput::TYPE_NONE},
 *           {@link ezcConsoleInput::TYPE_INT} and
 *           {@link ezcConsoleInput::TYPE_STRING}.
 * @property mixed $default
 *           Default value if the parameter is submitted without value.  If a
 *           parameter is eg. of type ezcConsoleInput::TYPE_STRING and
 *           therefore expects a value when being submitted, it may be
 *           submitted without a value and automatically get the default value
 *           specified here.
 * @property bool $multiple
 *           Is the submission of multiple instances of this parameters
 *           allowed? 
 * @property string $shorthelp
 *           Short help text. Usually displayed when showing parameter help
 *           overview.
 * @property string $longhelp
 *           Long help text. Usually displayed when showing parameter detailed
 *           help.
 * @property bool $arguments
 *           Whether arguments to the program are allowed, when this parameter
 *           is submitted. 
 * @property bool $mandatory
 *           Whether a parameter is mandatory to be set.  If this flag is true,
 *           the parameter must be submitted whenever the program is run.
 * @property bool $isHelpOption
 *           Whether a parameter is a help option.  If this flag is true, and
 *           the parameter is set, all options marked as mandatory may be
 *           skipped.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOption
{
    /**
     * Container to hold the properties
     *
     * @var array(string=>mixed)
     */
    protected $properties;

    /**
     * Dependency rules of this parameter.
     * 
     * @see ezcConsoleOption::addDependency()
     * @see ezcConsoleOption::removeDependency()
     * @see ezcConsoleOption::hasDependency()
     * @see ezcConsoleOption::getDependencies()
     * @see ezcConsoleOption::resetDependencies()
     * 
     * @var array(string=>ezcConsoleParamemterRule)
     */
    protected $dependencies = array();

    /**
     * Exclusion rules of this parameter.
     * 
     * @see ezcConsoleOption::addExclusion()
     * @see ezcConsoleOption::removeExclusion()
     * @see ezcConsoleOption::hasExclusion()
     * @see ezcConsoleOption::getExclusions()
     * @see ezcConsoleOption::resetExclusions()
     * 
     * @var array(string=>ezcConsoleParamemterRule)
     */
    protected $exclusions = array();

    /**
     * The value the parameter was assigned to when being submitted.
     * Boolean false indicates the parameter was not submitted, boolean
     * true means the parameter was submitted, but did not have a value.
     * In any other case, this caries the submitted value.
     * 
     * @var mixed
     */
    public $value = false;

    /**
     * Create a new parameter struct.
     * Creates a new basic parameter struct with the base information "$short"
     * (the short name of the parameter) and "$long" (the long version). You
     * simply apply these parameters as strings (without '-' or '--'). So
     *
     * <code>
     * $param = new ezcConsoleOption( 'f', 'file' );
     * </code>
     *
     * will result in a parameter that can be accessed using
     * 
     * <code>
     * $ mytool -f
     * </code>
     *
     * or
     * 
     * <code>
     * $ mytool --file
     * </code>
     * .
     *
     * The newly created parameter contains only it's 2 names and each other 
     * attribute is set to it's default value. You can simply manipulate
     * those attributes by accessing them directly.
     * 
     * @param string $short      Short name of the parameter without '-' (eg. 'f').
     * @param string $long       Long name of the parameter without '--' (eg. 'file').
     * @param int $type          Value type of the parameter. One of ezcConsoleInput::TYPE_*.
     * @param mixed $default     Default value the parameter holds if not submitted.
     * @param bool $multiple     If the parameter may be submitted multiple times.
     * @param string $shorthelp  Short help text.
     * @param string $longhelp   Long help text.
     * @param array(ezcConsoleOptionRule) $dependencies Dependency rules.
     * @param array(ezcConsoleOptionRule) $exclusions   Exclusion rules.
     * @param bool $arguments    Whether supplying arguments is allowed when this parameter is set.
     * @param bool $mandatory    Whether the parameter must be always submitted.
     * @param bool $isHelpOption Indicates that the given parameter is a help 
     *                           option. If a help option is set, all rule 
     *                           checking is skipped (dependency/exclusion/
     *                           mandatory).
     *
     * @throws ezcConsoleInvalidOptionNameException If the option names start with a "-" 
     *                                              sign or contain whitespaces.
     */
    public function __construct( 
        $short = '', 
        $long, 
        $type = ezcConsoleInput::TYPE_NONE, 
        $default = null, 
        $multiple = false,
        $shorthelp = 'No help available.',
        $longhelp = 'Sorry, there is no help text available for this parameter.', 
        array $dependencies = array(),
        array $exclusions = array(), 
        $arguments = true,
        $mandatory = false,
        $isHelpOption = false
    )
    {
        $this->properties['short'] = '';
        $this->properties['long'] = '';
        $this->properties['arguments'] = $arguments;

        if ( !self::validateOptionName( $short ) )
        {
            throw new ezcConsoleInvalidOptionNameException( $short );
        }
        $this->properties['short'] = $short;
        
        if ( !self::validateOptionName( $long ) )
        {
            throw new ezcConsoleInvalidOptionNameException( $long );
        }
        $this->properties['long'] = $long;
        
        $this->__set( "type",      $type         !== null ? $type      : ezcConsoleInput::TYPE_NONE  );
        $this->__set( "multiple",  $multiple     !== null ? $multiple  : false  );
        $this->__set( "default",   $default      !== null ? $default   : null );
        $this->__set( "shorthelp", $shorthelp    !== null ? $shorthelp : 'No help available.' );
        $this->__set( "longhelp",  $longhelp     !== null ? $longhelp  : 'Sorry, there is no help text available for this parameter.' );
        
        $dependencies    = $dependencies !== null && is_array( $dependencies ) ? $dependencies : array();
        foreach ( $dependencies as $dep )
        {
            $this->addDependency( $dep );
        }
        
        $exclusions = $exclusions !== null && is_array( $exclusions ) ? $exclusions : array();
        foreach ( $exclusions as $exc )
        {
            $this->addExclusion( $exc );
        }

        $this->__set( "mandatory",    $mandatory !== null ? $mandatory : false );
        $this->__set( "isHelpOption", $isHelpOption !== null ? $isHelpOption : false );
    }

    /**
     * Add a new dependency for a parameter.
     * This registeres a new dependency rule with the parameter. If you try
     * to add an already registered rule it will simply be ignored. Else,
     * the submitted rule will be added to the parameter as a dependency.
     *
     * @param ezcConsoleOptionRule $rule The rule to add.
     * @return void
     */
    public function addDependency( ezcConsoleOptionRule $rule )
    {
        foreach ( $this->dependencies as $existRule )
        {
            if ( $rule == $existRule )
            {
                return;
            }
        }
        $this->dependencies[] = $rule;
    }
    
    /**
     * Remove a dependency rule from a parameter.
     * This removes a given rule from a parameter, if it exists. If the rule is
     * not registered with the parameter, the method call will simply be ignored.
     * 
     * @param ezcConsoleOptionRule $rule The rule to be removed.
     * @return void
     */
    public function removeDependency( ezcConsoleOptionRule $rule )
    {
        foreach ( $this->dependencies as $id => $existRule )
        {
            if ( $rule == $existRule )
            {
                unset( $this->dependencies[$id] );
            }
        }
    }
    
    /**
     * Remove all dependency rule referring to a parameter.
     * This removes all dependency rules from a parameter, that refer to as specific 
     * parameter. If no rule is registered with this parameter as reference, the 
     * method call will simply be ignored.
     * 
     * @param ezcConsoleOption $param The param to be check for rules.
     * @return void
     */
    public function removeAllDependencies( ezcConsoleOption $param )
    {
        foreach ( $this->dependencies as $id => $rule )
        {
            if ( $rule->option == $param )
            {
                unset( $this->dependencies[$id] );
            }
        }
    }
    
    /**
     * Returns if a dependency to the given option exists.
     * Returns true if a dependency rule to the given option is registered,
     * otherwise false.
     * 
     * @param ezcConsoleOption $param The param to check if a dependency exists to.
     * @return bool True if rule is registered, otherwise false.
     */
    public function hasDependency( ezcConsoleOption $param )
    {
        foreach ( $this->dependencies as $id => $rule )
        {
            if ( $rule->option == $param )
            {
                return true;
            }
        }
        return false;
    }
    
    /**
     * Returns the dependency rules registered with this parameter.
     * Returns an array of registered dependencies.
     *
     * For example:
     * <code>
     * array(
     *      0 => ezcConsoleOptionRule,
     *      1 => ezcConsoleOptionRule,
     *      2 => ezcConsoleOptionRule,
     * );
     * </code>
     * 
     * @return array(ezcConsoleOptionRule) Dependency definition.
     */
    public function getDependencies()
    {
        return $this->dependencies;
    }

    /**
     * Reset existing dependency rules.
     * Deletes all registered dependency rules from the option definition.
     * 
     * @return void
     */
    public function resetDependencies() 
    {
        $this->dependencies = array();
    }

    /**
     * Add a new exclusion for an option.
     * This registeres a new exclusion rule with the option. If you try
     * to add an already registered rule it will simply be ignored. Else,
     * the submitted rule will be added to the option as a exclusion.
     *
     * @param ezcConsoleOptionRule $rule The rule to add.
     * @return void
     */
    public function addExclusion( ezcConsoleOptionRule $rule )
    {
        foreach ( $this->exclusions as $existRule )
        {
            if ( $rule == $existRule )
            {
                return;
            }
        }
        $this->exclusions[] = $rule;
    }
    
    /**
     * Remove a exclusion rule from a option.
     * This removes a given rule from a option, if it exists. If the rule is
     * not registered with the option, the method call will simply be ignored.
     * 
     * @param ezcConsoleOptionRule $rule The rule to be removed.
     * @return void
     */
    public function removeExclusion( ezcConsoleOptionRule $rule )
    {
        foreach ( $this->exclusions as $id => $existRule )
        {
            if ( $rule == $existRule )
            {
                unset( $this->exclusions[$id] );
            }
        }
    }
    
    /**
     * Remove all exclusion rule referring to a option.
     * This removes all exclusion rules from a option, that refer to as specific 
     * option. If no rule is registered with this option as reference, the 
     * method call will simply be ignored.
     * 
     * @param ezcConsoleOption $param The option to remove rule for.
     * @return void
     */
    public function removeAllExclusions( ezcConsoleOption $param )
    {
        foreach ( $this->exclusions as $id => $rule )
        {
            if ( $rule->option == $param )
            {
                unset( $this->exclusions[$id] );
            }
        }
    }
    
    /**
     * Returns if a given exclusion rule is registered with the option.
     * Returns true if a exclusion rule to the given option is registered,
     * otherwise false.
     * 
     * @param ezcConsoleOption $param The param to check if exclusions exist for.
     * @return bool True if rule is registered, otherwise false.
     */
    public function hasExclusion( ezcConsoleOption $param )
    {
        foreach ( $this->exclusions as $id => $rule )
        {
            if ( $rule->option == $param )
            {
                return true;
            }
        }
        return false;
    }
    
    /**
     * Returns the exclusion rules registered with this parameter.
     * Returns an array of registered exclusions.
     *
     * For example:
     * <code>
     * array(
     *      0 => ezcConsoleOptionRule,
     *      1 => ezcConsoleOptionRule,
     *      2 => ezcConsoleOptionRule,
     * );
     * </code>
     * 
     * @return array(ezcConsoleOptionRule) Exclusions definition.
     */
    public function getExclusions()
    {
        return $this->exclusions;
    }

    /**
     * Reset existing exclusion rules.
     * Deletes all registered exclusion rules from the option definition.
     *
     * @return void
     */
    public function resetExclusions() 
    {
        $this->exclusions = array();
    }
    
    /**
     * Property read access.
     * Provides read access to the properties of the object.
     * 
     * @param string $key The name of the property.
     * @return mixed The value if property exists and isset, otherwise null.
     * @ignore
     */
    public function __get( $key )
    {
        switch ( $key  )
        {
            case 'short':
            case 'long':
            case 'type':
            case 'default':
            case 'multiple':
            case 'shorthelp':
            case 'longhelp':
            case 'arguments':
            case 'isHelpOption':
            case 'mandatory':
                return $this->properties[$key];
            case 'dependencies':
            default:
                throw new ezcBasePropertyNotFoundException( $key );
        }
    }

    /**
     * Property write access.
     * 
     * @param string $key Name of the property.
     * @param mixed $val  The value for the property.
     *
     * @throws ezcBasePropertyPermissionException
     *         If the property you try to access is read-only.
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * @ignore
     */
    public function __set( $key, $val )
    {
        switch ( $key )
        {
            case 'type':
                if ( $val !== ezcConsoleInput::TYPE_NONE 
                     && $val !== ezcConsoleInput::TYPE_INT 
                     && $val !== ezcConsoleInput::TYPE_STRING )
                {
                    throw new ezcBaseValueException( 
                        $key,  
                        $val, 
                        'ezcConsoleInput::TYPE_STRING, ezcConsoleInput::TYPE_INT or ezcConsoleInput::TYPE_NONE' 
                    );
                }
                break;
            case 'default':
                if ( ( is_scalar( $val ) === false && $val !== null ) )
                {
                    // Newly allow arrays, if multiple is true
                    if ( $this->multiple === true && is_array( $val ) === true )
                    {
                        break;
                    }
                    throw new ezcBaseValueException( $key, $val, 'a string or a number, if multiple == true also an array' );
                }
                break;
            case 'multiple':
                if ( !is_bool( $val ) )
                {
                    throw new ezcBaseValueException( $key, $val, 'bool' );
                }
                break;
            case 'shorthelp':
                if ( !is_string( $val ) )
                {
                    throw new ezcBaseValueException( $key, $val, 'string' );
                }
                break;
            case 'longhelp':
                if ( !is_string( $val ) )
                {
                    throw new ezcBaseValueException( $key, $val, 'string' );
                }
                break;
            case 'arguments':
                if ( !is_bool( $val ) )
                {
                    throw new ezcBaseValueException( $key, $val, 'bool' );
                }
                break;
            case 'mandatory':
                if ( !is_bool( $val ) )
                {
                    throw new ezcBaseValueException( $key, $val, 'bool' );
                }
                break;
            case 'isHelpOption':
                if ( !is_bool( $val ) )
                {
                    throw new ezcBaseValueException( $key, $val, 'bool' );
                }
                break;
            case 'long':
            case 'short':
                throw new ezcBasePropertyPermissionException( $key, ezcBasePropertyPermissionException::READ );
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $key );
                break;
        }
        $this->properties[$key] = $val;
    }
 
    /**
     * Property isset access.
     * 
     * @param string $key Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $key )
    {
        switch ( $key  )
        {
            case 'short':
            case 'long':
            case 'type':
            case 'default':
            case 'multiple':
            case 'shorthelp':
            case 'longhelp':
            case 'arguments':
            case 'isHelpOption':
            case 'mandatory':
                return ( $this->properties[$key] !== null );
        }
        return false;
    }

    /**
     * Returns if a given name if valid for use as a parameter name a parameter. 
     * Checks if a given parameter name is generally valid for use. It checks a)
     * that the name does not start with '-' or '--' and b) if it contains
     * whitespaces. Note, that this method does not check any conflicts with already
     * used parameter names.
     * 
     * @param string $name The name to check.
     * @return bool True if the name is valid, otherwise false.
     */
    public static function validateOptionName( $name )
    {
        if ( substr( $name, 0, 1 ) === '-' || strpos( $name, ' ' ) !== false )
        {
            return false;
        }
        return true;
    }
}

?>
PKka�\'�rw��$pear/ezc/ConsoleTools/table/cell.phpnu�[���<?php
/**
 * File containing the ezcConsoleTableCell class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Representation of a table cell.
 * An object of this class represents a table cell. A cell has a certain content,
 * may apply a format to this data, align the data in the cell and so on.
 *
 * This class stores the cells for the {@link ezcConsoleTable} class.
 *
 * @see ezcConsoleTableRow
 * 
 * @property string $content
 *           Text displayed in the cell.
 * @property string $format
 *           Format applied to the displayed text.
 * @property int $align
 *           Alignment of the text inside the cell.  Must be one of
 *           ezcConsoleTable::ALIGN_ constants. See
 *           {@link ezcConsoleTable::ALIGN_LEFT},
 *           {@link ezcConsoleTable::ALIGN_RIGHT} and
 *           {@link ezcConsoleTable::ALIGN_CENTER}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleTableCell
{
    /**
     * Container to hold the properties
     *
     * @var array(string=>mixed)
     */
    protected $properties;

    /**
     * Create a new ezcConsoleProgressbarCell. 
     * Creates a new ezcConsoleProgressbarCell. You can either submit the cell
     * data through the constructor or set them as properties.
     * 
     * @param string $content Content of the cell.
     * @param string $format  Format to display the cell with.
     * @param mixed $align    Alignment of the content in the cell.
     * @return void
     */
    public function __construct( $content = '', $format = 'default', $align = ezcConsoleTable::ALIGN_DEFAULT )
    {
        $this->__set( 'content', $content );
        $this->__set( 'format', $format );
        $this->__set( 'align', $align );
    }

    /**
     * Property read access.
     * 
     * @param string $key Name of the property.
     * @return mixed Value of the property or null.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the the desired property is not found.
     * @ignore
     */
    public function __get( $key )
    {
        if ( isset( $this->properties[$key] ) )
        {
            return $this->properties[$key];
        }
        throw new ezcBasePropertyNotFoundException( $key );
    }

    /**
     * Property write access.
     * 
     * @param string $key Name of the property.
     * @param mixed $val  The value for the property.
     *
     * @throws ezcBaseValueException
     *         If a the value submitted for the align is not in the range of
     *         {@link ezcConsoleTable::ALIGN_LEFT},
     *         {@link ezcConsoleTable::ALIGN_CENTER},
     *         {@link ezcConsoleTable::ALIGN_RIGHT},
     *         {@link ezcConsoleTable::ALIGN_DEFAULT}
     *
     * @ignore
     */
    public function __set( $key, $val )
    {
            
        switch ( $key )
        {
            case 'content':
                if ( is_string( $val ) === false )
                {
                    throw new ezcBaseValueException( $key, $val, "string" );
                }
                break;
            case 'format':
                if ( is_string( $val ) === false || strlen( $val ) < 1 )
                {
                    throw new ezcBaseValueException( $key, $val, "string, length > 0" );
                }
                break;
            case 'align':
                if ( $val !== ezcConsoleTable::ALIGN_LEFT 
                  && $val !== ezcConsoleTable::ALIGN_CENTER 
                  && $val !== ezcConsoleTable::ALIGN_RIGHT 
                  && $val !== ezcConsoleTable::ALIGN_DEFAULT 
                )
                {
                    throw new ezcBaseValueException( $key,  $val, 'ezcConsoleTable::ALIGN_DEFAULT, ezcConsoleTable::ALIGN_LEFT, ezcConsoleTable::ALIGN_CENTER, ezcConsoleTable::ALIGN_RIGHT' );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $key );
        }
        $this->properties[$key] = $val;
        return;
    }
 
    /**
     * Property isset access.
     * 
     * @param string $key Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $key )
    {
        switch ( $key )
        {
            case 'content':
            case 'format':
            case 'align':
                return true;
            default:
                break;
        }
        return false;
    }

}

?>
PKka�\�B!)s,s,#pear/ezc/ConsoleTools/table/row.phpnu�[���<?php
/**
 * File containing the ezcConsoleTableRow class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Structure representing a table row in ezcConsoleTable.
 * This class represents a row in a table object. You can access
 * the properties of the row directly, but also access the cells of 
 * the row directly, as if the object was an array (index 0..).
 *
 * <code>
 * // Create new table row
 * $row = new ezcConsoleTableRow();
 * 
 * // Set default format of the row's cells
 * $row->format = 'headline';
 * 
 * // On the fly create the cell no 0
 * $row[0]->content = 'Name';
 * // On the fly create the cell no 1
 * $row[1]->content = 'Cellphone';
 *
 * // Change a setting on cell 0
 * $row[0]->align = ezcConsoleTable::ALIGN_CENTER;
 * 
 * // Iterate through the row's cells.
 * foreach ( $row as $cell )
 * {
 *     var_dump( $cell );
 * }
 *
 * // Set the default align property for all cells in the row
 * $row->align = ezcConsoleTable::ALIGN_CENTER;
 * 
 * </code>
 *
 * This class stores the rows for the {@link ezcConsoleTable} class.
 *
 * @property string $borderFormat
 *           Set the format applied to the borders of this row.  See
 *           {@link ezcConsoleOutput}
 * @property string $format
 *           Format applied to cell contents of cells marked with
 *           format "default" in this row.
 * @property mixed $align
 *           Alignment applied to cells marked with
 *           ezcConsoleTable::ALIGN_DEFAULT.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleTableRow implements Countable, Iterator, ArrayAccess
{
    /**
     * Container to hold the properties
     *
     * @var array(string=>mixed)
     */
    protected $properties;

    /**
     * The cells of the row. 
     * 
     * @var array(ezcConsoleTableCell)
     */
    protected $cells = array();

    /**
     * Create a new ezcConsoleProgressbarRow. 
     * Creates a new ezcConsoleProgressbarRow. 
     *
     * This method takes any number of {@link ezcConsoleTableCell} objects as
     * parameter, which will be added as table cells to the row in their 
     * specified order.
     * 
     * @throws ezcBaseValueException
     *         If a parameter is not of type {@link ezcConsoleTableCell}.
     */
    public function __construct()
    {
        $this->properties['borderFormat'] = 'default';
        $this->properties['format'] = 'default';
        $this->properties['align'] = ezcConsoleTable::ALIGN_DEFAULT;

        if ( func_num_args() > 0 )
        {
            foreach ( func_get_args() as $id => $arg )
            {
                if ( !( $arg instanceof ezcConsoleTableCell ) )
                {
                    throw new ezcBaseValueException( 'Parameter'.$id, $arg, 'ezcConsoleTableCell' );
                }
                $this->cells[] = $arg;
            }
        }
    }

    /**
     * Returns if the given offset exists.
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array.
     * 
     * @param int $offset The offset to check.
     * @return bool True when the offset exists, otherwise false.
     * 
     * @throws ezcBaseValueException
     *         If a non numeric cell ID is requested.
     */
    public function offsetExists( $offset )
    {
        if ( !is_int( $offset ) || $offset < 0 )
        {
            throw new ezcBaseValueException( 'offset', $offset, 'int >= 0' );
        }
        return isset( $this->cells[$offset] );
    }

    /**
     * Returns the element with the given offset. 
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array. In case of the
     * ezcConsoleTableRow class this method always returns a valid cell object
     * since it creates them on the fly, if a given item does not exist.
     * 
     * @param int $offset The offset to check.
     * @return ezcConsoleTableCell
     *
     * @throws ezcBaseValueException
     *         If a non numeric cell ID is requested.
     */
    public function offsetGet( $offset )
    {
        if ( !isset( $offset ) )
        {
            $offset = count( $this );
            $this->cells[$offset] = new ezcConsoleTableCell();
        }
        if ( !is_int( $offset ) || $offset < 0 )
        {
            throw new ezcBaseValueException( 'offset', $offset, 'int >= 0' );
        }
        if ( !isset( $this->cells[$offset] ) )
        {
            $this->cells[$offset] = new ezcConsoleTableCell();
        }
        return $this->cells[$offset];
    }

    /**
     * Set the element with the given offset. 
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array. 
     * 
     * @param int $offset                The offset to assign an item to.
     * @param ezcConsoleTableCell $value The cell to assign.
     * @return void
     *
     * @throws ezcBaseValueException
     *         If a non numeric cell ID is requested.
     * @throws ezcBaseValueException
     *         If the provided value is not of type {@ling ezcConsoleTableCell}.
     */
    public function offsetSet( $offset, $value )
    {
        if ( !( $value instanceof ezcConsoleTableCell ) )
        {
            throw new ezcBaseValueException( 'value', $value, 'ezcConsoleTableCell' );
        }
        if ( !isset( $offset ) )
        {
            $offset = count( $this );
        }
        if ( !is_int( $offset ) || $offset < 0 )
        {
            throw new ezcBaseValueException( 'offset', $offset, 'int >= 0' );
        }
        $this->cells[$offset] = $value;
    }

    /**
     * Unset the element with the given offset. 
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array. 
     * 
     * @param int $offset The offset to unset the value for.
     * @return void
     * 
     * @throws ezcBaseValueException
     *         If a non numeric cell ID is requested.
     */
    public function offsetUnset( $offset )
    {
        if ( !is_int( $offset ) || $offset < 0 )
        {
            throw new ezcBaseValueException( 'offset', $offset, 'int >= 0' );
        }
        if ( isset( $this->cells[$offset] ) )
        {
            unset( $this->cells[$offset] );
        }
    }

    /**
     * Returns the number of cells in the row.
     * This method is part of the Countable interface to allow the usage of
     * PHP's count() function to check how many cells this row has.
     *
     * @return int Number of cells in this row.
     */
    public function count()
    {
        $keys = array_keys( $this->cells );
        return count( $keys ) > 0 ? ( end( $keys ) + 1 ) : 0;
    }

    /**
     * Returns the currently selected cell.
     * This method is part of the Iterator interface to allow acces to the 
     * cells of this row by iterating over it like an array (e.g. using
     * foreach).
     * 
     * @return ezcConsoleTableCell The currently selected cell.
     */
    public function current()
    {
        return current( $this->cells );
    }

    /**
     * Returns the key of the currently selected cell.
     * This method is part of the Iterator interface to allow acces to the 
     * cells of this row by iterating over it like an array (e.g. using
     * foreach).
     * 
     * @return int The key of the currently selected cell.
     */
    public function key()
    {
        return key( $this->cells );
    }

    /**
     * Returns the next cell and selects it or false on the last cell.
     * This method is part of the Iterator interface to allow acces to the 
     * cells of this row by iterating over it like an array (e.g. using
     * foreach).
     *
     * @return mixed ezcConsoleTableCell if the next cell exists, or false.
     */
    public function next()
    {
        return next( $this->cells );
    }

    /**
     * Selects the very first cell and returns it.
     * This method is part of the Iterator interface to allow acces to the 
     * cells of this row by iterating over it like an array (e.g. using
     * foreach).
     *
     * @return ezcConsoleTableCell The very first cell of this row.
     */
    public function rewind()
    {
        return reset( $this->cells );
    }

    /**
     * Returns if the current cell is valid.
     * This method is part of the Iterator interface to allow acces to the 
     * cells of this row by iterating over it like an array (e.g. using
     * foreach).
     *
     * @return ezcConsoleTableCell The very first cell of this row.
     */
    public function valid()
    {
        return current( $this->cells ) !== false;
    }

    /**
     * Property read access.
     * 
     * @param string $key Name of the property.
     * @return mixed Value of the property or null.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the the desired property is not found.
     * @ignore
     */
    public function __get( $key )
    {
        if ( isset( $this->properties[$key] ) )
        {
            return $this->properties[$key];
        }
        throw new ezcBasePropertyNotFoundException( $key );
    }

    /**
     * Property write access.
     * 
     * @param string $key Name of the property.
     * @param mixed $val  The value for the property.
     *
     * @throws ezcBaseValueException
     *         If a the value submitted for the align is not in the range of
     *         {@link ezcConsoleTable::ALIGN_LEFT},
     *         {@link ezcConsoleTable::ALIGN_CENTER},
     *         {@link ezcConsoleTable::ALIGN_RIGHT},
     *         {@link ezcConsoleTable::ALIGN_DEFAULT}
     *
     * @ignore
     */
    public function __set( $key, $val )
    {
            
        switch ( $key )
        {
            case 'format':
            case 'borderFormat':
                if ( is_string( $val ) === false || strlen( $val ) < 1 )
                {
                    throw new ezcBaseValueException( $key, $val, "string, length > 0" );
                }
                break;
            case 'align':
                if ( $val !== ezcConsoleTable::ALIGN_LEFT 
                  && $val !== ezcConsoleTable::ALIGN_CENTER 
                  && $val !== ezcConsoleTable::ALIGN_RIGHT 
                  && $val !== ezcConsoleTable::ALIGN_DEFAULT 
                )
                {
                    throw new ezcBaseValueException( $key, $val, 'ezcConsoleTable::ALIGN_DEFAULT, ezcConsoleTable::ALIGN_LEFT, ezcConsoleTable::ALIGN_CENTER, ezcConsoleTable::ALIGN_RIGHT' );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $key );
        }
        $this->properties[$key] = $val;
    }
 
    /**
     * Property isset access.
     * 
     * @param string $key Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $key )
    {
        switch ( $key )
        {
            case 'format':
            case 'borderFormat':
            case 'align':
                return true;
            default:
                return false;
        }
    }

}

?>
PKka�\�+���:pear/ezc/ConsoleTools/interfaces/menu_dialog_validator.phpnu�[���<?php
/**
 * File containing the ezcConsoleMenuDialogValidator interface.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Interface that every console menu dialog validator class must implement.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
interface ezcConsoleMenuDialogValidator extends ezcConsoleQuestionDialogValidator
{

    /**
     * Returns an array of the elements to display. 
     * 
     * @return array(string=>string) Elements to display.
     */
    public function getElements();

}

?>
PKla�\e��ެ�5pear/ezc/ConsoleTools/interfaces/dialog_validator.phpnu�[���<?php
/**
 * File containing the ezcConsoleDialogValidator interface.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Interface that every console dialog validator class must implement.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
interface ezcConsoleDialogValidator
{
    /**
     * Perform no conversion on the result. 
     */
    const CONVERT_NONE  = 0;

    /**
     * Convert result to lower-case. 
     */
    const CONVERT_LOWER = 1;

    /**
     * Convert result to upper-case. 
     */
    const CONVERT_UPPER = 2;

    /**
     * Returns if the given result is valid. 
     * 
     * @param mixed $result The received result.
     * @return bool If the result is valid.
     */
    public function validate( $result );

    /**
     * Returns a fixed version of the result, if possible.
     * This method tries to repair the submitted result, if it is not valid,
     * yet. Fixing can be done in different ways, like casting into a certain
     * datatype, string manipulation, creating an object. A result returned
     * by fixup must not necessarily be valid, so a dialog should call validate
     * after trying to fix the result.
     * 
     * @param mixed $result The received result.
     * @return mixed The manipulated result.
     */
    public function fixup( $result );

}

?>
PKla�\�9c">pear/ezc/ConsoleTools/interfaces/question_dialog_validator.phpnu�[���<?php
/**
 * File containing the ezcConsoleQuestionDialogValidator interface.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Interface that every console question dialog validator class must implement.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
interface ezcConsoleQuestionDialogValidator extends ezcConsoleDialogValidator
{

    /**
     * Returns a string of possible results to be displayed with the question. 
     * For example "(y/n) [y]" to indicate "y" and "n" are valid values and "y" is
     * preselected.
     *
     * @return string The result string.
     */
    public function getResultString();
}

?>
PKla�\A�
NS
S
+pear/ezc/ConsoleTools/interfaces/dialog.phpnu�[���<?php
/**
 * File containing the ezcConsoleDialog interface.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Interface that every console dialog class must implement.
 *
 * Console dialogs can either be used on their own or using the
 * {@link ezcConsoleDialogViewer} (recommended). In the dialog viewer, a dialog
 * is instanciated and displayed in a loop, until it receives a valid result
 * value.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
interface ezcConsoleDialog
{

    /**
     * Create a new dialog object.
     * This method retrieves an ezcConsoleOutput object for printing its
     * content. Additionally an instance of ezcConsoleDialogOptions or a derived
     * class is received to configure the behaviour of the dialog. Dialog
     * implementations may extend ezcConsoleDialogOptions and require an
     * instance of their extended class as options.
     * 
     * @param ezcConsoleOutput $output         Output object.
     * @param ezcConsoleDialogOptions $options Options.
     * @return void
     */
    // public function __construct( ezcConsoleOutput $output, ezcConsoleDialogOptions $options = null );

    /**
     * Returns if the dialog retrieved a valid result.
     * Typically a dialog is displayed in a loop until he received a valid
     * result. What a valid result is, is determined by the dialog itself.
     * 
     * @return bool If a valid result was retrieved.
     */
    public function hasValidResult();

    /**
     * Returns the result retrieved.
     * If no valid result was retreived, yet, this method should throw an
     * {@link ezcDialogNoValidResultException}. Otherwise this method returns
     * the result.
     * 
     * @return mixed The retreived result.
     *
     * @throws ezcDialogNoValidResultException
     *         if this method is called without a valid result being retrieved
     *         by the object. Use {@link hasValidResult()} to avoid this
     *         exception.
     */
    public function getResult();

    /**
     * Displays the dialog.
     * Displays the dialog. Dialogs will most propably block the application until
     * the user took some interaction.
     * 
     * @return void
     */
    public function display();

    /**
     * Resets the dialog to its initial state. 
     * Resets the dialog to its orginal state in respect to its internal
     * changes. Note: Any changes you made to the options are kept in tact.
     * 
     * @return void
     */
    public function reset();
}

?>
PKla�\%uu4pear/ezc/ConsoleTools/interfaces/input_validator.phpnu�[���<?php
/**
 * File containing the ezcConsoleInputValidator interface.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */
/**
 * Interface for input validators used in ezcConsoleInput.
 *
 * An instance of this interface is used in {@link ezcConsoleInput} to validate 
 * options and arguments.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @access private
 * @TODO Verify interface and make it public to replace the validation in 
 *       {@link ezcConsoleInput}.
 */
interface ezcConsoleInputValidator
{
    /**
     * Validates the given options.
     *
     * May throw an exception that derives from {@link ezcConsoleException}.  
     * Receives the array of $options defined for validation and $hasArguments 
     * to indicates if arguments have been submitted in addition.
     *
     * @param array(ezcConsoleOption) $options
     * @param bool $hasArguments
     */
    public function validateOptions( array $options, $hasArguments );

    // @TODO: validateArguments();
}

?>
PKma�\wQO~9pear/ezc/ConsoleTools/interfaces/input_help_generator.phpnu�[���<?php
/**
 * File containing the ezcConsoleInputHelpGenerator interface.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Interface for help generators used in ezcConsoleInput.
 *
 * An instance of a class implementing this interface is used in {@link 
 * ezcConsoleInput} to generate the help information.
 *
 * @package ConsoleTools
 * @version 1.6.1
 *
 * @access private
 * @TODO Verify interface and make it public to replace the validation in 
 *       {@link ezcConsoleInput}.
 */
interface ezcConsoleInputHelpGenerator
{
    /**
     * Creates a new help generator.
     *
     * Creates a new help generator for the given $input.
     * 
     * @param ezcConsoleInput $input
     */
    public function __construct( ezcConsoleInput $input );

    /**
     * Generates help information as a multidimensional array.
     *
     * This method generates a tabular view on the help information of a 
     * program. The returned array has the following structure:
     *
     * <code>
     * <?php
     * array(
     *  0 => array(
     *      0 => '<option short/long name>',
     *      1 => '<option help, depending on the $long parameter>'
     *  ),
     *  1 => array(
     *      0 => '<option short name> / <option long name>',
     *      1 => '<option help, depending on the $long parameter>'
     *  ),
     *  // ...
     * );
     * ?>
     * </code>
     *
     * Each row of the array represents the help information for a single option.
     * The first cell of a row contains the option name (maybe short, long or 
     * both), the second cell contains the help text of the option.
     *
     * The returned array is used by {@link ezcConsoleInput} for different 
     * purposes.
     * For example, the user can retrieve it raw through the
     * {@link ezcConsoleInput::getHelp()} method, he can generate a help
     * {@link ezcConsoleTable} through {@link ezcConsoleInput::getHelpTable()} 
     * are can generate a printable help text through {@link 
     * ezcConsoleInput::getHelpText()}.
     *
     * The parameter $long defines if the long or short help text of the 
     * options should be used in the second cell of the returned array. The
     * $optionsFilter parameter is used to restrict the generated help to a certain 
     * sub-set of options. It consists of an array of short or long names of 
     * the options to include.
     * 
     * @param bool $long 
     * @param array(string) $optionsFilter
     * @return array(array(string))
     */
    public function generateUngroupedOptionHelp( $long = false, array $optionsFilter = null );

    /**
     * Generates help information as a multidimensional array, grouped in categories.
     *
     * This method behaves similar to {@link generateUngroupedOptionHelp()}. In 
     * contrast to the latter one, this method returns an array with 1 
     * dimension more, grouping options into categories. The $groups parameter 
     * defines the categories to generate. Each category may contain an 
     * arbitrary number of options, options might occur in different 
     * categories.
     *
     * The returned array has the follorwing format:
     *
     * <code>
     * <?php
     * array(
     *  '<category name>' => array(
     *      0 => array(
     *          0 => '<option short/long name>',
     *          1 => '<option help, depending on the $long parameter>'
     *      ),
     *      1 => array(
     *          0 => '<option short name> / <option long name>',
     *          1 => '<option help, depending on the $long parameter>'
     *      ),
     *      // ...
     *  ),
     *  '<category name>' => array(
     *      // ...
     *  ),
     *  // ...
     * );
     * ?>
     * </code>
     *
     * The $long parameter, as in {@link generateUngroupedOptionHelp()} 
     * determines if the options short or long help is to be used. The
     * $params array can in addition be used to determine if a parameter
     * is displayed at all. If $optionsFilter is submitted and is not null, 
     * only options listed in it will be shown in the help at all.
     * 
     * @param array(string=>array(string)) $groups
     * @param bool $long 
     * @param array(string) $params 
     * @return array(string=>array(array(string)))
     */
    public function generateGroupedOptionHelp( array $groups, $long = false, array $optionsFilter = null );

    /**
     * Generates help information as a multi-dimensonal array for the given $argumentDefinition.
     *
     * This method generates a tabular help information for the given 
     * $argumentDefinition in the following format:
     *
     * <code>
     * <?php
     * array(
     *  0 => array(
     *      0 => '<argument synopsis>',
     *      1 => '<argument help text>'
     *  ),
     *  1 => array(
     *      0 => '<argument synopsis>',
     *      1 => '<argument help text>'
     *  ),
     *  // ...
     * )
     * ?>
     * </code>
     *
     * The $long parameter defines if the long of short help text should be 
     * used.
     * 
     * @param bool $long
     * @return array(array(string))
     */
    public function generateArgumentHelp( $long = false );

    /**
     * Generates a command line synopsis for the options and arguments.
     *
     * This method generates a synopsis string that lists the options and 
     * parameters available, indicating their usage.
     *
     * @return string
     */
    public function generateSynopsis( array $optionFilter = null );
}

?>
PKma�\��%p%ppear/ezc/ConsoleTools/table.phpnu�[���<?php
/**
 * File containing the ezcConsoleTable class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Creating tables to be printed to the console. 
 *
 * Every ezcConsoleTable object can be accessed as if it was a multidimensional,
 * numerically indexed array. The first dimension represents the rows of the 
 * table, so $table[0] gives you access to the first row of the table, which is 
 * represented by a {@link ezcConsoleTableRow} object. You can access its 
 * properties directly, using e.g. $table[0]->format. The second dimension gives 
 * you direct access to the cells of your table, like $table[0][0] accesses the 
 * first cell in the first row of your table. You can access its properties 
 * diretly here, too. This works like e.g. $table[0][0]->format. Table row and
 * cell objects are created on the fly, when you access them for the first time.
 * You can also create them as if you simply create new array elements. E.g.
 * $table[] creates a new row in the table.
 *
 * <code>
 * // Initialize the console output handler
 * $out = new ezcConsoleOutput();
 * // Define a new format "headline"
 * $out->formats->headline->color = 'red';
 * $out->formats->headline->style = array( 'bold' );
 * // Define a new format "sum"
 * $out->formats->sum->color = 'blue';
 * $out->formats->sum->style = array( 'negative' );
 * 
 * // Create a new table
 * $table = new ezcConsoleTable( $out, 60 );
 * 
 * // Create first row and in it the first cell
 * $table[0][0]->content = 'Headline 1';
 * 
 * // Create 3 more cells in row 0
 * for ( $i = 2; $i < 5; $i++ )
 * {
 *      $table[0][]->content = "Headline $i";
 * }
 * 
 * $data = array( 1, 2, 3, 4 );
 * 
 * // Create some more data in the table...
 * foreach ( $data as $value )
 * {
 *      // Create a new row each time and set it's contents to the actual value
 *      $table[][0]->content = $value;
 * }
 * 
 * // Set another border format for our headline row
 * $table[0]->borderFormat = 'headline';
 * 
 * // Set the content format for all cells of the 3rd row to "sum"
 * $table[2]->format = 'sum';
 * 
 * $table->outputTable();
 * </code>
 * 
 * @property ezcConsoleTableOptions $options
 *           Contains the options for this class.
 * @property int $width
 *           Width of the table.
 *
 * @see ezcConsoleOutput
 * @package ConsoleTools
 * @version 1.6.1
 * @mainclass
 */
class ezcConsoleTable implements Countable, Iterator, ArrayAccess
{
    /**
     * Automatically wrap text to fit into a column.
     * @see ezcConsoleTable::$options
     */
    const WRAP_AUTO = 1;

    /**
     * Do not wrap text. Columns will be extended to fit the largest text.
     * ATTENTION: This is risky!
     * @see ezcConsoleTable::$options
     */
    const WRAP_NONE = 2;

    /**
     * Text will be cut to fit into a column.
     * @see ezcConsoleTable::$options
     */
    const WRAP_CUT  = 3;
    
    /**
     * Align text in the default direction. 
     */
    const ALIGN_DEFAULT = -1;
    /**
     * Align text in cells to the right.
     */
    const ALIGN_LEFT   = STR_PAD_RIGHT;
    /**
     * Align text in cells to the left.
     */
    const ALIGN_RIGHT  = STR_PAD_LEFT;
    /**
     * Align text in cells to the center.
     */
    const ALIGN_CENTER = STR_PAD_BOTH;

    /**
     * The width given by settings must be used even if the data allows it smaller. 
     */
    const WIDTH_FIXED = 1;
    /**
     * The width given by settings is a maximum value, if data allows it, the table gets smaller.
     */
    const WIDTH_MAX = 2;

    /**
     * Container to hold the properties
     *
     * @var array(string=>mixed)
     */
    protected $properties;

    /**
     * The ezcConsoleOutput object to use.
     *
     * @var ezcConsoleOutput
     */
    protected $outputHandler;

    /**
     * Collection of the rows that are contained in the table. 
     * 
     * @var array(ezcConsoleTableRow)
     */
    protected $rows;

    /**
     * Tool object for multi-byte encoding safe string operations.
     * 
     * @var ezcConsoleStringTool
     */
    private $stringTool;

    /**
     * Creates a new table.
     *
     * @param ezcConsoleOutput $outHandler Output handler to utilize
     * @param int $width                   Overall width of the table (chars).
     * @param array $options               Options
     *
     * @see ezcConsoleTable::$options
     *
     * @throws ezcBaseValueException On an invalid setting.
     */
    public function __construct( ezcConsoleOutput $outHandler, $width, $options = array() ) 
    {
        $this->rows = array();
        $this->outputHandler = $outHandler;
        $this->stringTool = new ezcConsoleStringTool();

        $this->__set( 'width', $width );
        if ( $options instanceof ezcConsoleTableOptions )
        {
            $this->properties['options'] = $options;
        }
        else if ( is_array( $options ) )
        {
            $this->properties['options'] = new ezcConsoleTableOptions( $options );
        }
        else
        {
            throw new ezcBaseValueException( "options", $options, "array" );
        }
    }

    /**
     * Set new options.
     * This method allows you to change the options of the table.
     *
     * @param ezcConsoleTableOptions $options The options to set.
     *
     * @throws ezcBaseSettingNotFoundException
     *         If you tried to set a non-existent option value.
     * @throws ezcBaseSettingValueException
     *         If the value is not valid for the desired option.
     * @throws ezcBaseValueException
     *         If you submit neither an array nor an instance of 
     *         ezcConsoleTableOptions.
     */
    public function setOptions( $options = array() ) 
    {
        if ( is_array( $options ) ) 
        {
            $this->properties['options']->merge( $options );
        } 
        else if ( $options instanceof ezcConsoleTableOptions ) 
        {
            $this->properties['options'] = $options;
        }
        else
        {
            throw new ezcBaseValueException( "options", $options, "instance of ezcConsoleTableOptions" );
        }
    }

    /**
     * Returns the current options.
     * Returns the options currently set for this table.
     * 
     * @return ezcConsoleTableOptions The current options.
     */
    public function getOptions()
    {
        return $this->properties['options'];
    }

    /**
     * Returns the table in an array.
     *
     * Returns the entire table as an array of printable lines. Each element of
     * the array represents a physical line of the drawn table, including all
     * borders and stuff, so you can simply print the table using
     * <code>
     * echo implode( "\n" , $table->getTable() ):
     * </code>
     * which is basically what {@link ezcConsoleTable::outputTable()} does.
     *
     * @return array An array representation of the table.
     */
    public function getTable()
    {
        return $this->generateTable();
    }

    /**
     * Output the table.
     * Prints the complete table to the console.
     *
     * @return void
     */
    public function outputTable() 
    {
        echo implode( PHP_EOL, $this->generateTable() );
    }

    /**
     * Returns the table in a string.
     *
     * @return string
     */
    public function __toString()
    {
        return implode( PHP_EOL, $this->generateTable() );
    }

    /**
     * Returns if the given offset exists.
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array.
     * 
     * @param int $offset The offset to check.
     * @return bool True when the offset exists, otherwise false.
     * 
     * @throws ezcBaseValueException
     *         If a non numeric row ID is requested.
     */
    public function offsetExists( $offset )
    {
        if ( !is_int( $offset ) || $offset < 0 )
        {
            throw new ezcBaseValueException( 'offset', $offset, 'int >= 0' );
        }
        return isset( $this->rows[$offset] );
    }

    // From here only interface method implementations follow, which are not intended for direct usage

    /**
     * Returns the element with the given offset. 
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array. In case of the
     * ezcConsoleTable class this method always returns a valid row object
     * since it creates them on the fly, if a given item does not exist.
     * 
     * @param int $offset The offset to check.
     * @return ezcConsoleTableCell
     *
     * @throws ezcBaseValueException
     *         If a non numeric row ID is requested.
     */
    public function offsetGet( $offset )
    {
        $offset = ( $offset === null ) ? count( $this->rows ) : $offset;
        if ( !is_int( $offset ) || $offset < 0  )
        {
            throw new ezcBaseValueException( 'offset', $offset, 'int >= 0 or null' );
        }
        if ( !isset( $this->rows[$offset] ) )
        {
            $this->rows[$offset] = new ezcConsoleTableRow();
        }
        return $this->rows[$offset];
    }

    /**
     * Set the element with the given offset. 
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array. 
     * 
     * @param int $offset               The offset to assign an item to.
     * @param ezcConsoleTableRow $value The row to assign.
     * @return void
     *
     * @throws ezcBaseValueException
     *         If a non numeric row ID is requested.
     * @throws ezcBaseValueException
     *         If the provided value is not of type {@link ezcConsoleTableRow}.
     */
    public function offsetSet( $offset, $value )
    {
        if ( !( $value instanceof ezcConsoleTableRow ) )
        {
            throw new ezcBaseValueException( 'value', $value, 'ezcConsoleTableRow' );
        }
        if ( !isset( $offset ) )
        {
            $offset = count( $this );
        }
        if ( !is_int( $offset ) || $offset < 0 )
        {
            throw new ezcBaseValueException( 'offset', $offset, 'int >= 0' );
        }
        $this->rows[$offset] = $value;
    }

    /**
     * Unset the element with the given offset. 
     * This method is part of the ArrayAccess interface to allow access to the
     * data of this object as if it was an array. 
     * 
     * @param int $offset The offset to unset the value for.
     * @return void
     *
     * @throws ezcBaseValueException
     *         If a non numeric row ID is requested.
     */
    public function offsetUnset( $offset )
    {
        if ( !is_int( $offset ) || $offset < 0 )
        {
            throw new ezcBaseValueException( 'offset', $offset, 'int >= 0' );
        }
        if ( isset( $this->rows[$offset] ) )
        {
            unset( $this->rows[$offset] );
        }
    }

    /**
     * Returns the number of cells in the row.
     * This method is part of the Countable interface to allow the usage of
     * PHP's count() function to check how many cells this row has.
     *
     * @return int Number of cells in this row.
     */
    public function count()
    {
        $keys = array_keys( $this->rows );
        return count( $keys ) > 0 ? ( end( $keys ) + 1 ) : 0;
    }

    /**
     * Returns the currently selected cell.
     * This method is part of the Iterator interface to allow access to the 
     * cells of this row by iterating over it like an array (e.g. using
     * foreach).
     * 
     * @return ezcConsoleTableCell The currently selected cell.
     */
    public function current()
    {
        return current( $this->rows );
    }

    /**
     * Returns the key of the currently selected cell.
     * This method is part of the Iterator interface to allow access to the 
     * cells of this row by iterating over it like an array (e.g. using
     * foreach).
     * 
     * @return int The key of the currently selected cell.
     */
    public function key()
    {
        return key( $this->rows );
    }

    /**
     * Returns the next cell and selects it or false on the last cell.
     * This method is part of the Iterator interface to allow access to the 
     * cells of this row by iterating over it like an array (e.g. using
     * foreach).
     *
     * @return mixed ezcConsoleTableCell if the next cell exists, or false.
     */
    public function next()
    {
        return next( $this->rows );
    }

    /**
     * Selects the very first cell and returns it.
     * This method is part of the Iterator interface to allow access to the 
     * cells of this row by iterating over it like an array (e.g. using
     * foreach).
     *
     * @return ezcConsoleTableCell The very first cell of this row.
     */
    public function rewind()
    {
        return reset( $this->rows );
    }

    /**
     * Returns if the current cell is valid.
     * This method is part of the Iterator interface to allow access to the 
     * cells of this row by iterating over it like an array (e.g. using
     * foreach).
     *
     * @return ezcConsoleTableCell The very first cell of this row.
     */
    public function valid()
    {
        return current( $this->rows ) !== false;
    }

    /**
     * Property read access.
     * 
     * @param string $key Name of the property.
     * @return mixed Value of the property or null.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the the desired property is not found.
     * @ignore
     */
    public function __get( $key )
    {
        switch ( $key )
        {
            case 'options':
            case 'width':
                return $this->properties[$key];
            default:
                break;
        }
        throw new ezcBasePropertyNotFoundException( $key );
    }

    /**
     * Property write access.
     * 
     * @param string $key Name of the property.
     * @param mixed $val  The value for the property.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If a the value for the property options is not an instance of
     * @throws ezcBaseValueException
     *         If a the value for a property is out of range.
     * @ignore
     */
    public function __set( $key, $val )
    {
        switch ( $key )
        {
            case 'options':
                if ( !( $val instanceof ezcConsoleTableOptions ) )
                {
                    throw new ezcBaseValueException( $key, $val, 'ezcConsoleTableOptions' );
                }
                $this->properties['options'] = $val;
                return;
            case 'width':
                if ( $val < 1 )
                {
                    throw new ezcBaseValueException( $key, $val, 'int > 0' );
                }
                $this->properties[$key] = $val; 
                return;
            default:
                break;
        }
        throw new ezcBasePropertyNotFoundException( $key );
    }
 
    /**
     * Property isset access.
     * 
     * @param string $key Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $key )
    {
        switch ( $key )
        {
            case 'options':
            case 'width':
            case 'cols':
                return true;
        }
        return false;
    }

    /**
     * Generate the complete table as an array. 
     * 
     * @return array(string) The table.
     */
    private function generateTable()
    {
        $colWidth = $this->getColWidths();
        $table = array();
        
        if ( $this->options->lineVertical !== null )
        {
            $table[] = $this->generateBorder(
                $colWidth,
                ( isset( $this[0] ) ? $this[0]->borderFormat : 'default' )
            );
        }

        // Rows submitted by the user
        for ( $i = 0;  $i < count( $this->rows ); $i++ )
        {
            // Auto broken rows
            foreach ( $this->breakRows( $this->rows[$i], $colWidth ) as $brkRow => $brkCells )
            {
                $table[] = $this->generateRow( $brkCells, $colWidth, $this->rows[$i] );
            }
            $afterBorderFormat = isset( $this->rows[$i + 1] ) && $this->rows[$i + 1]->borderFormat != 'default' ? $this->rows[$i + 1]->borderFormat : $this->rows[$i]->borderFormat;
            if ( $this->options->lineVertical !== null )
            {
                $table[] = $this->generateBorder( $colWidth, $afterBorderFormat );
            }
        }

        // Empty tables need closing border
        if ( $this->options->lineVertical !== null && count( $this->rows ) == null )
        {
            $table[] = $this->generateBorder( $colWidth, 'default' );
        }

        return $table; 
    }

    /**
     * Generate top/bottom borders of rows. 
     * 
     * @param array(int) $colWidth Array of column width.
     * @param string $format            Format name.
     * @return string The Border string.
     */
    private function generateBorder( $colWidth, $format )
    {
        $border = '';
        foreach ( $colWidth as $col => $width )
        {
            $border .= ( $this->options->lineHorizontal !== null ? $this->properties['options']->corner : '' )
                    . str_repeat(
                        $this->properties['options']->lineVertical,
                        $width + (
                            2 * iconv_strlen( $this->properties['options']->colPadding, 'UTF-8' )
                        )
            );
        }
        $border .= ( $this->options->lineHorizontal !== null ? $this->properties['options']->corner : '' );

        return $this->formatText( $border, $format );
    }

    /**
     * Generate a single physical row.
     * This method generates the string for a single physical table row.
     * 
     * @param array(string) $cells Cells of the row.
     * @param array(int) $colWidth Calculated columns widths.
     * @param ezcConsoleTableRow $row   The row to generate.
     * @return string The row.
     */
    private function generateRow( $cells, $colWidth, $row )
    {
        $rowData = '';
        for ( $cell = 0; $cell < count( $colWidth ); $cell++ )
        {
            $align = $this->determineAlign( $row, $cell );
            $format = $this->determineFormat( $row, $cell );
            $borderFormat = $this->determineBorderFormat( $row );
            
            $data = isset( $cells[$cell] ) ? $cells[$cell] : '';
            $rowData .= $this->formatText( 
                            $this->properties['options']->lineHorizontal, 
                            $borderFormat
                        );
            $rowData .= $this->properties['options']->colPadding;
            $rowData .= $this->formatText(
                            $this->stringTool->strPad( $data, $colWidth[$cell], ' ', $align ),
                            $format
                        );
            $rowData .= $this->properties['options']->colPadding;
        }
        $rowData .= $this->formatText( $this->properties['options']->lineHorizontal, $row->borderFormat );
        return $rowData;
    }

    /**
     * Determine the alignment of a cell.
     * Walks the inheritance path upwards to determine the alignment of a 
     * cell. Checks first, if the cell has it's own alignment (apart from 
     * ezcConsoleTable::ALIGN_DEFAULT). If not, checks the row for an 
     * alignment setting and uses the default alignment if not found.
     * 
     * @param ezcConsoleTableRow $row The row this cell belongs to.
     * @param int $cellId             Index of the desired cell.
     * @return int An alignement constant (ezcConsoleTable::ALIGN_*).
     */
    private function determineAlign( $row, $cellId = 0 )
    {
        return ( $row[$cellId]->align !== ezcConsoleTable::ALIGN_DEFAULT 
            ? $row[$cellId]->align
            : ( $row->align !== ezcConsoleTable::ALIGN_DEFAULT
                ? $row->align
                : ( $this->properties['options']->defaultAlign !== ezcConsoleTable::ALIGN_DEFAULT
                    ? $this->properties['options']->defaultAlign
                    : ezcConsoleTable::ALIGN_LEFT ) ) );
    }

    /**
     * Determine the format of a cells content.
     * Walks the inheritance path upwards to determine the format of a 
     * cells content. Checks first, if the cell has it's own format (apart 
     * from 'default'). If not, checks the row for a format setting and 
     * uses the default format if not found.
     * 
     * @param ezcConsoleTableRow $row The row this cell belongs to.
     * @param int $cellId             Index of the desired cell.
     * @return string A format name.
     */
    private function determineFormat( $row, $cellId )
    {
        return ( $row[$cellId]->format != 'default'
            ? $row[$cellId]->format
            : ( $row->format !== 'default'
                ? $row->format
                : $this->properties['options']->defaultFormat ) );
    }

    /**
     * Determine the format of a rows border.
     * Walks the inheritance path upwards to determine the format of a 
     * rows border. Checks first, if the row has it's own format (apart 
     * from 'default'). If not, uses the default format.
     * 
     * @param ezcConsoleTableRow $row   The row this cell belongs to.
     * @return string A format name.
     */
    private function determineBorderFormat( $row )
    {
        return $row->borderFormat !== 'default'
            ? $row->borderFormat
            : $this->properties['options']->defaultBorderFormat;
    }

    /**
     * Returns auto broken rows from an array of cells.
     * The data provided by a user may not fit into a cell calculated by the 
     * class. In this case, the data can be automatically wrapped. The table 
     * row then spans over multiple physical console lines.
     * 
     * @param array(string) $cells Array of cells in one row.
     * @param array(int) $colWidth Columns widths array.
     * @return array(string) Physical rows generated out of this row.
     */
    private function breakRows( $cells, $colWidth ) 
    {
        $rows = array();
        // Iterate through cells of the row
        foreach ( $colWidth as $cell => $width ) 
        {
            $data = $cells[$cell]->content;
            // Physical row id, start with 0 for each row
            $row = 0;
            // Split into multiple physical rows if manual breaks exist
            $dataLines = explode( "\n", $data );
            foreach ( $dataLines as $dataLine ) 
            {
                // Does the physical row fit?
                if ( iconv_strlen( $dataLine, 'UTF-8' ) > ( $colWidth[$cell] ) )
                {
                    switch ( $this->properties['options']->colWrap )
                    {
                        case ezcConsoleTable::WRAP_AUTO:
                            $subLines = explode(
                                "\n",
                                $this->stringTool->wordwrap( $dataLine, $colWidth[$cell], "\n", true )
                            );
                            foreach ( $subLines as $lineNo => $line )
                            {
                                $rows[$row++][$cell] = $line;
                            }
                            break;
                        case ezcConsoleTable::WRAP_CUT:
                            $rows[$row++][$cell] = iconv_substr( $dataLine, 0, $colWidth[$cell], 'UTF-8' );
                            break;
                        case ezcConsoleTable::WRAP_NONE:
                        default:
                            $rows[$row++][$cell] = $dataLine;
                            break;
                    }
                }
                else
                {
                    $rows[$row++][$cell] = $dataLine;
                }
            }
        }
        return $rows;
    }

    /**
     * Determine width of each single column. 
     *
     * @return void
     */
    private function getColWidths()
    {
        if ( is_array( $this->properties['options']->colWidth ) )
        {
            return $this->properties['options']->colWidth;
        }

        // Determine number of columns:
        $colCount = 0;
        foreach ( $this->rows as $row )
        {
            $colCount = max( sizeof( $row ), $colCount );
        }

        if ( $colCount === 0 )
        {
            return array( $this->width );
        }

        $borderWidth = iconv_strlen(
            $this->properties['options']->lineHorizontal,
            'UTF-8'
        );

        // Subtract border and padding chars from global width
        $globalWidth = $this->width
            - ( 
                // Per column: 2 * border padding + 1 border
                $colCount * (
                    2 * iconv_strlen( $this->properties['options']->colPadding, 'UTF-8' )
                    + $borderWidth 
                ) 
              // 1 Additional border
              ) - $borderWidth;
        
        // Width of a column if each is made equal
        $colNormWidth = round( $globalWidth / $colCount );
        $colMaxWidth = array();
        
        // Determine the longest data for each column
        foreach ( $this->rows as $row => $cells )
        {
            foreach ( $cells as $col => $cell )
            {
                $contentLength = 0;
                foreach ( explode( PHP_EOL, $cell->content ) as $contentRow )
                {
                    $contentLength = max(
                        $contentLength,
                        iconv_strlen( $contentRow, 'UTF-8' )
                    );
                }
                $colMaxWidth[$col] = isset( $colMaxWidth[$col] ) ? max( $colMaxWidth[$col], $contentLength ) : $contentLength;
            }
        }
        $colWidth = array();
        $colWidthOverflow = array();
        $spareWidth = 0;
        
        // Make columns best fit
        foreach ( $colMaxWidth as $col => $maxWidth )
        {
            // Does the largest data of the column fit into the average size 
            // + what we have in spare from earlier columns?
            if ( $maxWidth <= ( $colNormWidth + $spareWidth ) ) 
            {
                // We fit in, make the column as large as necessary
                $colWidth[$col] = $maxWidth;
                $spareWidth += ( $colNormWidth - $maxWidth );
            }
            else
            {
                // Does not fit, use maximal possible width
                $colWidth[$col]  = $colNormWidth + $spareWidth;
                $spareWidth = 0;
                // Store overflow for second processing step
                $colWidthOverflow[$col] = $maxWidth - $colWidth[$col];
            }
        }
        
        // Do we have spare to give to the columns again?
        if ( $spareWidth > 0 )
        {
            // Second processing step
            if ( count( $colWidthOverflow ) > 0  )
            {
                $overflowSum = array_sum( $colWidthOverflow );
                foreach ( $colWidthOverflow as $col => $overflow );
                {
                    $colWidth[$col] += floor( $overflow / $overflowSum * $spareWidth );
                }
            }
            elseif ( $this->properties['options']->widthType === ezcConsoleTable::WIDTH_FIXED )
            {
                $widthSum = array_sum( $colWidth );
                foreach ( $colWidth as $col => $width )
                {
                    $colWidth[$col] += floor( $width / $widthSum * $spareWidth );
                }
            }
        }
        
        // Finally sanitize values from rounding issues, if necessary
        if ( ( $colSum = array_sum( $colWidth ) ) != $globalWidth && $this->properties['options']->widthType === ezcConsoleTable::WIDTH_FIXED )
        {
            $colWidth[count( $colWidth ) - 1] -= $colSum - $globalWidth;
        }
        return $colWidth;
    }

    /**
     * Returns the given $text formatted with $format.
     *
     * In case $useFormats is set to false in the output handler, the text is 
     * returned as given, without any formatting.
     * 
     * @param string $text 
     * @param string $format 
     * @return string
     */
    private function formatText( $text, $format )
    {
        if ( $this->outputHandler->options->useFormats )
        {
            return $this->outputHandler->formatText( $text, $format );
        }
        else
        {
            return $text;
        }
    }
}
?>
PKma�\���4�J�J pear/ezc/ConsoleTools/output.phpnu�[���<?php
/**
 * File containing the ezcConsoleOutput class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Class for handling console output.
 *
 * The ezcConsoleOutput class provides an interface to output text to the console. It deals with formating 
 * text in different ways and offers some comfortable options to deal
 * with console text output.
 *
 * <code>
 * // Create the output handler
 * $out = new ezcConsoleOutput();
 * 
 * // Set the verbosity to level 10
 * $out->options->verbosityLevel = 10;
 * // Enable auto wrapping of lines after 40 characters
 * $out->options->autobreak    = 40;
 * 
 * // Set the color of the default output format to green
 * $out->formats->default->color   = 'green';
 * 
 * // Set the color of the output format named 'success' to white
 * $out->formats->success->color   = 'white';
 * // Set the style of the output format named 'success' to bold
 * $out->formats->success->style   = array( 'bold' );
 * 
 * // Set the color of the output format named 'failure' to red
 * $out->formats->failure->color   = 'red';
 * // Set the style of the output format named 'failure' to bold
 * $out->formats->failure->style   = array( 'bold' );
 * // Set the background color of the output format named 'failure' to blue
 * $out->formats->failure->bgcolor = 'blue';
 * 
 * // Output text with default format
 * $out->outputText( 'This is default text ' );
 * // Output text with format 'success'
 * $out->outputText( 'including success message', 'success' );
 * // Some more output with default output.
 * $out->outputText( "and a manual linebreak.\n" );
 * 
 * // Manipulate the later output
 * $out->formats->success->color = 'green';
 * $out->formats->default->color = 'blue';
 * 
 * // This is visible, since we set verbosityLevel to 10, and printed in default format (now blue)
 * $out->outputText( "Some verbose output.\n", null, 10 );
 * // This is not visible, since we set verbosityLevel to 10
 * $out->outputText( "Some more verbose output.\n", null, 20 );
 * // This is visible, since we set verbosityLevel to 10, and printed in format 'failure'
 * $out->outputText( "And some not so verbose, failure output.\n", 'failure', 5 );
 * </code>
 *
 * For a list of valid colors, style attributes and background colors, please 
 * refer to {@link ezcConsoleOutputFormat}.
 *
 * ATTENTION: Windows operating systems do not support styling of text on the
 * console. Therefore no styling sequences are generated on any version of
 * this operating system.
 * 
 * @property ezcConsoleOutputOptions $options
 *           Contains the options for this class.
 * @property ezcConsoleOutputFormats $formats
 *           Contains the output formats.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @mainclass
 */
class ezcConsoleOutput
{

    /**
     * Target to print to standard out, with output buffering possibility.
     */
    const TARGET_OUTPUT = "php://output";

    /**
     * Target to print to standard out. 
     */
    const TARGET_STDOUT = "php://stdout";

    /**
     * Target to print to standard error. 
     */
    const TARGET_STDERR = "php://stderr";

    /**
     * Container to hold the properties
     *
     * @var array(string=>mixed)
     */
    protected $properties;

    /**
     * Whether a position has been stored before, using the storePos() method.
     *
     * @see ezcConsoleOutput::storePos()
     * @var bool
     */
    protected $positionStored = false;

    /**
     * Stores the mapping of color names to their escape
     * sequence values.
     *
     * @var array(string=>int)
     */
    protected static $color = array(
        'gray'          => 30,
        'black'         => 30,      // Alias black to gray (Bug #8478)
        'red'           => 31,
        'green'         => 32,
        'yellow'        => 33,
        'blue'          => 34,
        'magenta'       => 35,
        'cyan'          => 36,
        'white'         => 37,
        'default'       => 39
    );

    /**
     * Stores the mapping of bgcolor names to their escape
     * sequence values.
     * 
     * @var array(string=>int)
     */
    protected static $bgcolor = array(
        'gray'       => 40,      // Alias gray to black (Bug #8478)
        'black'      => 40,
        'red'        => 41,
        'green'      => 42,
        'yellow'     => 43,
        'blue'       => 44,
        'magenta'    => 45,
        'cyan'       => 46,
        'white'      => 47,
        'default'    => 49,
    );

    /**
     * Stores the mapping of styles names to their escape
     * sequence values.
     * 
     * @var array(string=>int)
     */
    protected static $style = array( 
        'default'           => '0',
    
        'bold'              => 1,
        'faint'             => 2,
        'normal'            => 22,
        
        'italic'            => 3,
        'notitalic'         => 23,
        
        'underlined'        => 4,
        'doubleunderlined'  => 21,
        'notunderlined'     => 24,
        
        'blink'             => 5,
        'blinkfast'         => 6,
        'noblink'           => 25,
        
        'negative'          => 7,
        'positive'          => 27,
    );

    /**
     * Basic escape sequence string. Use sprintf() to insert escape codes.
     * 
     * @var string
     */
    private $escapeSequence = "\033[%sm";

    /**
     * Collection of targets to print to. 
     * 
     * @var array
     */
    private $targets = array();

    /**
     * Create a new console output handler.
     *
     * @see ezcConsoleOutput::$options
     * @see ezcConsoleOutputOptions
     * @see ezcConsoleOutput::$formats
     * @see ezcConsoleOutputFormats
     *
     * @param ezcConsoleOutputFormats $formats Formats to be used for output.
     * @param array(string=>string) $options   Options to set.
     */
    public function __construct( ezcConsoleOutputFormats $formats = null, array $options = array() )
    {
        $options = isset( $options ) ? $options : new ezcConsoleOutputOptions();
        $formats = isset( $formats ) ? $formats : new ezcConsoleOutputFormats();
        $this->properties['options'] = new ezcConsoleOutputOptions( $options );
        $this->properties['formats'] = $formats;
    }
    
    /**
     * Set new options.
     * This method allows you to change the options of an output handler.
     *  
     * @param ezcConsoleOutputOptions $options The options to set.
     *
     * @throws ezcBaseSettingNotFoundException
     *         If you tried to set a non-existent option value. 
     * @throws ezcBaseSettingValueException
     *         If the value is not valid for the desired option.
     * @throws ezcBaseValueException
     *         If you submit neither an array nor an instance of 
     *         ezcConsoleOutputOptions.
     */
    public function setOptions( $options ) 
    {
        if ( is_array( $options ) ) 
        {
            $this->properties['options']->merge( $options );
        } 
        else if ( $options instanceof ezcConsoleOutputOptions ) 
        {
            $this->properties['options'] = $options;
        }
        else
        {
            throw new ezcBaseValueException( "options", $options, "instance of ezcConsoleOutputOptions" );
        }
    }

    /**
     * Returns the current options.
     * Returns the options currently set for this output handler.
     * 
     * @return ezcConsoleOutputOptions The current options.
     */
    public function getOptions()
    {
        return $this->properties['options'];
    }

    /**
     * Property read access.
     *
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * 
     * @param string $propertyName Name of the property.
     * @return mixed Value of the property or null.
     * @ignore
     */
    public function __get( $propertyName )
    {
        switch ( $propertyName ) 
        {
            case 'options':
            case 'formats':
                return $this->properties[$propertyName];
            default:
                break;
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }

    /**
     * Property write access.
     * 
     * @param string $propertyName Name of the property.
     * @param mixed $val  The value for the property.
     *
     * @throws ezcBaseValueException 
     *         If a the value for the property options is not an instance of 
     *         ezcConsoleOutputOptions. 
     * @throws ezcBaseValueException 
     *         If a the value for the property formats is not an instance of 
     *         ezcConsoleOutputFormats. 
     * @ignore
     */
    public function __set( $propertyName, $val )
    {
        switch ( $propertyName ) 
        {
            case 'options':
                if ( !( $val instanceof ezcConsoleOutputOptions ) )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'ezcConsoleOutputOptions' );
                }
                $this->properties['options'] = $val;
                return;
            case 'formats':
                if ( !( $val instanceof ezcConsoleOutputFormats ) )
                {
                    throw new ezcBaseValueException( $propertyName, $val, 'ezcConsoleOutputFormats' );
                }
                $this->properties['formats'] = $val;
                return;
            default:
                break;
        }
        throw new ezcBasePropertyNotFoundException( $propertyName );
    }
 
    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        switch ( $propertyName )
        {
            case 'options':
            case 'formats':
                return true;
        }
        return false;
    }

    /**
     * Print text to the console.
     *
     * Output a string to the console. If $format parameter is omitted, the
     * default style is chosen. Style can either be a special style {@link
     * ezcConsoleOutput::$options}, a style name {@link
     * ezcConsoleOutput::$formats} or 'default' to print with the default
     * styling.
     *
     * The $format parameter defines the name of a format. Formats are defined
     * through the $formats proprty, which contains format definitions in form
     * of {@link ezcConsoleOutputFormat} objects. The format influences the
     * outer appearance of a message (e.g. color) as well as the target the
     * message is printed to (e.g. STDERR).
     *
     * @throws ezcConsoleInvalidOutputTargetException
     *         If the given target ({@link ezcConsoleOutputFormat}) could not 
     *         be opened for writing or writing failed.
     *
     * @param string $text        The text to print.
     * @param string $format      Format chosen for printing.
     * @param int $verbosityLevel On which verbose level to output this message.
     * @return void
     */
    public function outputText( $text, $format = 'default', $verbosityLevel = 1 ) 
    {
        if ( $this->properties['options']->verbosityLevel >= $verbosityLevel ) 
        {
            if ( is_int( $this->properties['options']->autobreak ) && $this->properties['options']->autobreak > 0 )
            {
                $textLines = preg_split( "(\r\n|\n|\r)", $text );
                foreach ( $textLines as $id => $textLine )
                {
                    $textLines[$id] = wordwrap( $textLine, $this->properties['options']->autobreak, PHP_EOL, true );
                }
                $text = implode( PHP_EOL, $textLines );
            }
            // Initialize target, if not happened before
            if ( !isset( $this->targets[$this->formats->$format->target] ) )
            {
                // @ to suppress the warning. We handle error cases with an
                // exception here.
                if ( ( $this->targets[$this->formats->$format->target] = @fopen( $this->formats->$format->target, "w" ) ) === false )
                {
                    throw new ezcConsoleInvalidOutputTargetException( $this->formats->$format->target );
                }
            }
            // Print using formats or without. Note: Since the target is a part
            // of the format, it will also be ignored, if you switch formats off!
            if ( $this->properties['options']->useFormats === true )
            {
                if ( fwrite( $this->targets[$this->formats->$format->target], $this->formatText( $text, $format ) ) === false )
                {
                    throw new ezcConsoleInvalidOutputTargetException( $this->formats->$format->target );
                }
            }
            else
            {
               echo $text;
            }
        }
    }

    /**
     * Print text to the console and automatically append a line break.
     *
     * This method acts similar to {@link ezcConsoleOutput::outputText()}, in
     * fact it even uses it. The difference is, that outputLine()
     * automatically appends a manual line break to the printed text. Besides
     * that, you can leave out the $text parameter of outputLine() to only
     * print a line break.
     *
     * The $format parameter defines the name of a format. Formats are defined
     * through the $formats proprty, which contains format definitions in form
     * of {@link ezcConsoleOutputFormat} objects. The format influences the
     * outer appearance of a message (e.g. color) as well as the target the
     * message is printed to (e.g. STDERR).
     * 
     * @param string $text        The text to print.
     * @param string $format      Format chosen for printing.
     * @param int $verbosityLevel On which verbose level to output this message.
     * @return void
     */
    public function outputLine( $text = '', $format = 'default', $verbosityLevel = 1 )
    {
        $this->outputText( $text . PHP_EOL, $format, $verbosityLevel );
    }

    /**
     * Returns a formated version of the text.
     *
     * If $format parameter is omitted, the default style is chosen. The format
     * must be a valid registered format definition.  For information on the
     * formats, see {@link ezcConsoleOutput::$formats}.
     *
     * @param string $text   Text to apply style to.
     * @param string $format Format chosen to be applied.
     * @return string
     */
    public function formatText( $text, $format = 'default' ) 
    {
        switch ( ezcBaseFeatures::os() )
        {
            case "Windows":
                return $text;
            default:
                return $this->buildSequence( $format ) . $text . $this->buildSequence( 'default' );
        }
    }

    /**
     * Stores the current cursor position.
     *
     * Saves the current cursor position to return to it using 
     * {@link ezcConsoleOutput::restorePos()}. Multiple calls
     * to this method will override each other. Only the last
     * position is saved.
     *
     * @return void
     */
    public function storePos() 
    {
        if ( ezcBaseFeatures::os() !== "Windows" )
        {
            echo "\0337";
            $this->positionStored = true;
        }
    }

    /**
     * Restores a cursor position.
     *
     * Restores the cursor position last saved using {@link
     * ezcConsoleOutput::storePos()}.
     *
     * @throws ezcConsoleNoPositionStoredException 
     *         If no position is saved.
     * @return void
     */
    public function restorePos() 
    {
        if ( ezcBaseFeatures::os() !== "Windows" )
        {
            if ( $this->positionStored === false )
            {
                throw new ezcConsoleNoPositionStoredException();
            }
            echo "\0338";
        }
    }

    /**
     * Move the cursor to a specific column of the current line.
     *
     * Moves the cursor to a specific column index of the current line (default
     * is 1).
     * 
     * @param int $column Column to jump to.
     * @return void
     */
    public function toPos( $column = 1 ) 
    {
        if ( ezcBaseFeatures::os() !== "Windows" )
        {
            echo "\033[{$column}G";
        }
    }

    /**
     * Returns if a format code is valid for the specific formating option.
     *
     * This method determines if a given code is valid for a specific
     * formatting option ('color', 'bgcolor' or 'style').
     * 
     * @see ezcConsoleOutput::getFormatCode();
     *
     * @param string $type Formating type.
     * @param string $key  Format option name.
     * @return bool True if the code is valid.
     */
    public static function isValidFormatCode( $type, $key )
    {
        return isset( self::${$type}[$key] );
    }

    /**
     * Returns the escape sequence for a specific format.
     *
     * Returns the default format escape sequence, if the requested format does
     * not exist.
     * 
     * @param string $format Name of the format.
     * @return string The escape sequence.
     */
    protected function buildSequence( $format = 'default' )
    {
        if ( $format === 'default' )
        {
            return sprintf( $this->escapeSequence, 0 );
        }
        $modifiers = array();
        $formats = array( 'color', 'style', 'bgcolor' );
        foreach ( $formats as $formatType ) 
        {
            // Get modifiers
            if ( is_array( $this->formats->$format->$formatType ) )
            {
                if ( !in_array( 'default', $this->formats->$format->$formatType ) )
                {
                    foreach ( $this->formats->$format->$formatType as $singleVal ) 
                    {
                        $modifiers[] = $this->getFormatCode( $formatType, $singleVal );
                    }
                }
            }
            else
            {
                if ( $this->formats->$format->$formatType !== 'default' )
                {
                    $modifiers[] = $this->getFormatCode( $formatType, $this->formats->$format->$formatType );
                }
            }
        }
        // Merge modifiers
        return sprintf( $this->escapeSequence, implode( ';', $modifiers ) );
    }

    /**
     * Returns the code for a given formating option of a given type.
     *
     * $type is the type of formating ('color', 'bgcolor' or 'style'), $key the
     * name of the format to lookup. Returns the numeric code for the requested
     * format or 0 if format or type do not exist.
     * 
     * @see ezcConsoleOutput::isValidFormatCode()
     * 
     * @param string $type Formatting type.
     * @param string $key  Format option name.
     * @return int The code representation.
     */
    protected function getFormatCode( $type, $key )
    {
        if ( !ezcConsoleOutput::isValidFormatCode( $type, $key ) ) 
        {
            return 0;
        }
        return ezcConsoleOutput::${$type}[$key];
    }

}
?>
PKna�\T\�G�G�pear/ezc/ConsoleTools/input.phpnu�[���<?php
/**
 * File containing the ezcConsoleInput class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * The ezcConsoleInput class handles the given options and arguments on the console.
 * 
 * This class allows the complete handling of options and arguments submitted
 * to a console based application.
 *
 * The next example demonstrate how to capture the console options: 
 * 
 * <code>
 * $optionHandler = new ezcConsoleInput();
 * 
 * // Register simple parameter -h/--help
 * $optionHandler->registerOption( new ezcConsoleOption( 'h', 'help' ) );
 * 
 * // Register complex parameter -f/--file
 * $file = new ezcConsoleOption(
 *  'f',
 *  'file',
 *  ezcConsoleInput::TYPE_STRING,
 *  null,
 *  false,
 *  'Process a file.',
 *  'Processes a single file.'
 * );
 * $optionHandler->registerOption( $file );
 * 
 * // Manipulate parameter -f/--file after registration
 * $file->multiple = true;
 * 
 * // Register another complex parameter that depends on -f and excludes -h
 * $dir = new ezcConsoleOption(
 *  'd',
 *  'dir',
 *  ezcConsoleInput::TYPE_STRING,
 *  null,
 *  true,
 *  'Process a directory.',
 *  'Processes a complete directory.',
 *  array( new ezcConsoleOptionRule( $optionHandler->getOption( 'f' ) ) ),
 *  array( new ezcConsoleOptionRule( $optionHandler->getOption( 'h' ) ) )
 * );
 * $optionHandler->registerOption( $dir );
 * 
 * // Register an alias for this parameter
 * $optionHandler->registerAlias( 'e', 'extended-dir', $dir );
 * 
 * // Process registered parameters and handle errors
 * try
 * {
 *      $optionHandler->process( array( 'example_input.php', '-h' ) );
 * }
 * catch ( ezcConsoleOptionException $e )
 * {
 *      echo $e->getMessage();
 *      exit( 1 );
 * }
 * 
 * // Process a single parameter
 * $file = $optionHandler->getOption( 'f' );
 * if ( $file->value === false )
 * {
 *      echo "Parameter -{$file->short}/--{$file->long} was not submitted.\n";
 * }
 * elseif ( $file->value === true )
 * {
 *      echo "Parameter -{$file->short}/--{$file->long} was submitted without value.\n";
 * }
 * else
 * {
 *      echo "Parameter -{$file->short}/--{$file->long} was submitted with value '".var_export($file->value, true)."'.\n";
 * }
 * 
 * // Process all parameters at once:
 * foreach ( $optionHandler->getOptionValues() as $paramShort => $val )
 * {
 *      switch ( true )
 *      {
 *          case $val === false:
 *              echo "Parameter $paramShort was not submitted.\n";
 *              break;
 *          case $val === true:
 *              echo "Parameter $paramShort was submitted without a value.\n";
 *              break;
 *          case is_array( $val ):
 *              echo "Parameter $paramShort was submitted multiple times with value: '".implode(', ', $val)."'.\n";
 *              break;
 *          default:
 *              echo "Parameter $paramShort was submitted with value: '$val'.\n";
 *              break;
 *      }
 * }
 * </code>
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @mainclass
 *
 * @property ezcConsoleArguments $argumentDefinition Optional argument definition.
 */
class ezcConsoleInput
{
    /**
     * Option does not carry a value.
     */
    const TYPE_NONE     = 1;

    /**
     * Option takes an integer value.
     */
    const TYPE_INT      = 2;

    /**
     * Option takes a string value. 
     */
    const TYPE_STRING   = 3;

    /**
     * Array of option definitions, indexed by number.
     *
     * This array stores the ezcConsoleOption objects representing
     * the options.
     *
     * For lookup of an option after its short or long values the attributes
     * {@link ezcConsoleInput::$optionShort}
     * {@link ezcConsoleInput::$optionLong}
     * are used.
     * 
     * @var array(array)
     */
    private $options = array();

    /**
     * Short option names. 
     *
     * Each references a key in {@link ezcConsoleInput::$options}.
     * 
     * @var array(string=>int)
     */
    private $optionShort = array();

    /**
     * Long option names. 
     * 
     * Each references a key in {@link ezcConsoleInput::$options}.
     * 
     * @var array(string=>int)
     */
    private $optionLong = array();

    /**
     * Arguments, if submitted, are stored here. 
     * 
     * @var array(string)
     */
    private $arguments = array();

    /**
     * Wether the process() method has already been called.
     * 
     * @var bool
     */
    private $processed = false;

    /**
     * Indicates if an option was submitted, that has the isHelpOption flag set.
     * 
     * @var bool
     */
    private $helpOptionSet = false;

    /**
     * Tool object for multi-byte encoding safe string operations. 
     * 
     * @var ezcConsoleStringTool
     */
    private $stringTool;

    /**
     * Input validator.
     *
     * @var ezcConsoleInputValidator
     */
    private $validator;

    /**
     * Help generator. 
     * 
     * @var ezcConsoleInputHelpGenerator
     */
    private $helpGenerator;

    /**
     * Collection of properties. 
     * 
     * @var array(string=>mixed)
     */
    protected $properties = array();

    /**
     * Creates an input handler.
     */
    public function __construct()
    {
        $this->argumentDefinition = null;
        $this->stringTool         = new ezcConsoleStringTool();

        // @TODO Verify interface and make plugable
        $this->validator     = new ezcConsoleStandardInputValidator();
        $this->helpGenerator = new ezcConsoleInputStandardHelpGenerator( $this );
    }

    /**
     * Registers the new option $option.
     *
     * This method adds the new option $option to your option collection. If
     * already an option with the assigned short or long value exists, an
     * exception will be thrown.
     *
     * @see ezcConsoleInput::unregisterOption()
     *
     * @param ezcConsoleOption $option
     *
     * @return ezcConsoleOption The recently registered option.
     */
    public function registerOption( ezcConsoleOption $option )
    {
        foreach ( $this->optionShort as $short => $ref )
        {
            if ( $short === $option->short ) 
            {
                throw new ezcConsoleOptionAlreadyRegisteredException( $short );
            }
        }
        foreach ( $this->optionLong as $long => $ref )
        {
            if ( $long === $option->long ) 
            {
                throw new ezcConsoleOptionAlreadyRegisteredException( $long );
            }
        }
        $this->options[] = $option;
        $this->optionLong[$option->long] = $option;
        if ( $option->short !== "" )
        {
            $this->optionShort[$option->short] = $option;
        }
        return $option;
    }

    /**
     * Registers an alias for an option.
     *
     * Registers a new alias for an existing option. Aliases can
     * be used as if they were a normal option.
     *
     * The alias is registered with the short option name $short and the
     * long option name $long. The alias references to the existing 
     * option $option.
     *
     * @see ezcConsoleInput::unregisterAlias()
     *
     * @param string $short
     * @param string $long
     * @param ezcConsoleOption $option
     *
     *
     * @throws ezcConsoleOptionNotExistsException
     *         If the referenced option is not registered.
     * @throws ezcConsoleOptionAlreadyRegisteredException
     *         If another option/alias has taken the provided short or long name.
     * @return void
     */
    public function registerAlias( $short, $long, ezcConsoleOption $option )
    {
        if ( !isset( $this->optionShort[$option->short] ) || !isset( $this->optionLong[$option->long] ) )
        {
            throw new ezcConsoleOptionNotExistsException( $option->long );
        }
        if ( isset( $this->optionShort[$short] ) || isset( $this->optionLong[$long] ) )
        {
            throw new ezcConsoleOptionAlreadyRegisteredException( isset( $this->optionShort[$short] ) ? "-$short" : "--$long" );
        }
        $this->optionShort[$short] = $option;
        $this->optionLong[$long]   = $option;
    }

    /**
     * Registers options according to a string specification.
     *
     * Accepts a string to define parameters and registers all parameters as
     * options accordingly. String definition, specified in $optionDef, looks
     * like this:
     *
     * <code>
     * [s:|size:][u:|user:][a:|all:]
     * </code>
     *
     * This string registers 3 parameters:
     * -s / --size
     * -u / --user
     * -a / --all
     *
     * @param string $optionDef
     * @return void
     * 
     * @throws ezcConsoleOptionStringNotWellformedException 
     *         If provided string does not have the correct format.
     */
    public function registerOptionString( $optionDef ) 
    {
        $regex = '\[([a-z0-9-]+)([:?*+])?([^|]*)\|([a-z0-9-]+)([:?*+])?\]';
        // Check string for wellformedness
        if ( preg_match( "/^($regex)+$/", $optionDef ) == 0 )
        {
            throw new ezcConsoleOptionStringNotWellformedException( "Option definition not wellformed: \"$optionDef\"" );
        }
        if ( preg_match_all( "/$regex/", $optionDef, $matches ) )
        {
            foreach ( $matches[1] as $id => $short )
            {
                $option = null;
                $option = new ezcConsoleOption( $short, $matches[4][$id] );
                if ( !empty( $matches[2][$id] ) || !empty( $matches[5][$id] ) )
                {
                    switch ( !empty( $matches[2][$id] ) ? $matches[2][$id] : $matches[5][$id] )
                    {
                        case '*':
                            // Allows 0 or more occurances
                            $option->multiple = true;
                            break;
                        case '+':
                            // Allows 1 or more occurances
                            $option->multiple = true;
                            $option->type = self::TYPE_STRING;
                            break;
                        case '?':
                            $option->type = self::TYPE_STRING;
                            $option->default = '';
                            break;
                        default:
                            break;
                    }
                }
                if ( !empty( $matches[3][$id] ) )
                {
                    $option->default = $matches[3][$id];
                }
                $this->registerOption( $option );
            }
        }
    }

    /**
     * Removes an option.
     *
     * This function removes an option. All dependencies to that 
     * specific option are removed completely from every other registered 
     * option.
     *
     * @see ezcConsoleInput::registerOption()
     *
     * @param ezcConsoleOption $option The option object to unregister.
     *
     * @throws ezcConsoleOptionNotExistsException
     *         If requesting a not registered option.
     * @return void
     */
    public function unregisterOption( ezcConsoleOption $option )
    {
        $found = false;
        foreach ( $this->options as $id => $existParam )
        {
            if ( $existParam === $option )
            {
                $found = true;
                unset( $this->options[$id] );
                continue;
            }
            $existParam->removeAllExclusions( $option );
            $existParam->removeAllDependencies( $option );
        }
        if ( $found === false )
        {
            throw new ezcConsoleOptionNotExistsException( $option->long );
        }
        foreach ( $this->optionLong as $name => $existParam )
        {
            if ( $existParam === $option )
            {
                unset( $this->optionLong[$name] );
            }
        }
        foreach ( $this->optionShort as $name => $existParam )
        {
            if ( $existParam === $option )
            {
                unset( $this->optionShort[$name] );
            }
        }
    }
    
    /**
     * Removes an alias to an option.
     *
     * This function removes an alias with the short name $short and long
     * name $long.
     *
     * @see ezcConsoleInput::registerAlias()
     * 
     * @throws ezcConsoleOptionNoAliasException
     *      If the requested short/long name belongs to a real parameter instead.
     *
     * @param string $short
     * @param string $long
     * @return void
     *
     * @todo Check if $short and $long refer to the same option!
     */
    public function unregisterAlias( $short, $long )
    {
        foreach ( $this->options as $id => $option )
        {
            if ( $option->short === $short )
            {
                throw new ezcConsoleOptionNoAliasException( $short );
            }
            if ( $option->long === $long )
            {
                throw new ezcConsoleOptionNoAliasException( $long );
            }
        }
        if ( isset( $this->optionShort[$short] ) )
        {
            unset( $this->optionShort[$short] );
        }
        if ( isset( $this->optionLong[$long] ) )
        {
            unset( $this->optionLong[$long] );
        }
    }

    /**
     * Returns the definition object for the option with the name $name.
     *
     * This method receives the long or short name of an option and
     * returns the ezcConsoleOption object.
     * 
     * @param string $name  Short or long name of the option (without - or --).
     * @return ezcConsoleOption
     *
     * @throws ezcConsoleOptionNotExistsException 
     *         If requesting a not registered parameter.
     */
    public function getOption( $name )
    {
        $name = $name;
        if ( isset( $this->optionShort[$name] ) )
        {
            return $this->optionShort[$name];
        }
        if ( isset( $this->optionLong[$name] ) )
        {
            return $this->optionLong[$name];
        }
        throw new ezcConsoleOptionNotExistsException( $name );
    }

    /**
     * Process the input parameters.
     *
     * Actually process the input options and arguments according to the actual 
     * settings.
     * 
     * Per default this method uses $argc and $argv for processing. You can 
     * override this setting with your own input, if necessary, using the
     * parameters of this method. (Attention, first argument is always the pro
     * gram name itself!)
     *
     * All exceptions thrown by this method contain an additional attribute "option"
     * which specifies the parameter on which the error occurred.
     * 
     * @param array(string) $args The arguments
     * @return void
     *
     * @throws ezcConsoleOptionNotExistsException 
     *         If an option that was submitted does not exist.
     * @throws ezcConsoleOptionDependencyViolationException
     *         If a dependency rule was violated. 
     * @throws ezcConsoleOptionExclusionViolationException 
     *         If an exclusion rule was violated.
     * @throws ezcConsoleOptionTypeViolationException 
     *         If the type of a submitted value violates the options type rule.
     * @throws ezcConsoleOptionArgumentsViolationException 
     *         If arguments are passed although a parameter disallowed them.
     *
     * @see ezcConsoleOptionException
     */ 
    public function process( array $args = null )
    {
        if ( $this->processed )
        {
            $this->reset();
        }
        $this->processed = true;

        if ( !isset( $args ) )
        {
            $args = isset( $argv ) ? $argv : isset( $_SERVER['argv'] ) ? $_SERVER['argv'] : array();
        }

        $nextIndex = $this->processOptions( $args );

        if ( $this->helpOptionSet() )
        {
            // No need to parse arguments
            return;
        }

        $this->processArguments( $args, $nextIndex );

        $this->checkRules();

        $this->setOptionDefaults();
    }

    /**
     * Sets defaults for options that have not been submitted.
     *
     * Checks all options if they have been submited. If not and a default 
     * values is present, this is set as the options value.
     */
    private function setOptionDefaults()
    {
        foreach ( $this->options as $option )
        {
            if ( $option->value === false || $option->value === array() )
            {
                // Default value to set?
                if ( $option->default !== null )
                {
                    $option->value = $option->default;
                }
            }
        }
    }

    /**
     * Reads the submitted options from $args array.
     *
     * Returns the next index to check for arguments.
     * 
     * @param array(string) $args 
     * @returns int
     *
     * @throws ezcConsoleOptionNotExistsException
     *         if a submitted option does not exist.
     * @throws ezcConsoleOptionTooManyValuesException
     *         if an option that expects only a single value was submitted 
     *         with multiple values.
     * @throws ezcConsoleOptionTypeViolationException
     *         if an option was submitted with a value of the wrong type.
     * @throws ezcConsoleOptionMissingValueException
     *         if an option thats expects a value was submitted without.
     */
    private function processOptions( array $args )
    {
        $numArgs = count( $args );
        $i = 1;

        while ( $i < $numArgs )
        {
            if ( $args[$i] === '--' )
            {
                break;
            }

            // Equalize parameter handling (long params with =)
            if ( iconv_substr( $args[$i], 0, 2, 'UTF-8' ) == '--' )
            {
                $this->preprocessLongOption( $args, $i );
                // Update number of args, changed by preprocessLongOption()
                $numArgs = count( $args );
            }

            // Check for parameter
            if ( iconv_substr( $args[$i], 0, 1, 'UTF-8' ) === '-' )
            {
                if ( !$this->hasOption( preg_replace( '/^-*/', '', $args[$i] ) ) )
                {
                    throw new ezcConsoleOptionNotExistsException( $args[$i] );
                }
                $this->processOption( $args, $i );
            }
            // Must be the arguments
            else
            {
                break;
            }
        }

        // Move pointer over argument sign
        isset( $args[$i] ) && $args[$i] == '--' ? ++$i : $i;

        return $i;
    }

    /**
     * Resets all option and argument values.
     *
     * This method is called automatically by {@link process()}, if this method
     * is called twice or more, and may also be used to manually reset the
     * values of all registered {@ezcConsoleOption} and {@link
     * ezcConsoleArgument} objects.
     */
    public function reset()
    {
        foreach ( $this->options as $option )
        {
            $option->value = false;
        }
        if ( $this->argumentDefinition !== null )
        {
            foreach ( $this->argumentDefinition as $argument )
            {
                $argument->value = null;
            }
        }
        $this->arguments = array();
    }

    /**
     * Returns true if an option with the given name exists, otherwise false.
     *
     * Checks if an option with the given name is registered.
     * 
     * @param string $name Short or long name of the option.
     * @return bool True if option exists, otherwise false.
     */
    public function hasOption( $name )
    {
        try
        {
            $param = $this->getOption( $name );
        }
        catch ( ezcConsoleOptionNotExistsException $e )
        {
            return false;
        }
        return true;
    }

    /**
     * Returns an array of all registered options.
     *
     * Returns an array of all registered options in the following format:
     * <code>
     * array( 
     *      0 => ezcConsoleOption,
     *      1 => ezcConsoleOption,
     *      2 => ezcConsoleOption,
     *      ...
     * );
     * </code>
     *
     * @return array(string=>ezcConsoleOption) Registered options.
     */
    public function getOptions()
    {
        return $this->options;
    }

    /**
     * Returns the values of all submitted options.
     *
     * Returns an array of all values submitted to the options. The array is 
     * indexed by the parameters short name (excluding the '-' prefix). The array
     * does not contain any parameter, which value is 'false' (meaning: the
     * parameter was not submitted).
     * 
     * @param bool $longnames Wheather to use longnames for indexing.
     * @return array(string=>mixed)
     */
    public function getOptionValues( $longnames = false )
    {
        $res = array();
        foreach ( $this->options as $param )
        {
            if ( $param->value !== false ) 
            {
                $res[( $longnames === true ) ? $param->long : $param->short] = $param->value;
            }
        }
        return $res;
    }

    /**
     * Returns arguments provided to the program.
     *
     * This method returns all arguments provided to a program in an
     * int indexed array. Arguments are sorted in the way
     * they are submitted to the program. You can disable arguments
     * through the 'arguments' flag of a parameter, if you want
     * to disallow arguments.
     *
     * Arguments are either the last part of the program call (if the
     * last parameter is not a 'multiple' one) or divided via the '--'
     * method which is commonly used on Unix (if the last parameter
     * accepts multiple values this is required).
     *
     * @return array(string) Arguments.
     */
    public function getArguments()
    {
        return $this->arguments;
    }

    /**
     * Get help information for your options.
     *
     * This method returns an array of help information for your options,
     * indexed by int. Each help info has 2 fields:
     *
     * 0 => The options names ("<short> / <long>")
     * 1 => The help text (depending on the $long parameter)
     *
     * The $long options determines if you want to get the short or long help
     * texts. The array returned can be used by {@link ezcConsoleTable}.
     *
     * If using the second options, you can filter the options shown in the
     * help output (e.g. to show short help for related options). Provide
     * as simple number indexed array of short and/or long values to set a filter.
     *
     * The $paramGrouping option can be used to group options in the help
     * output. The structure of this array parameter is as follows:
     *
     * <code>
     *  array(
     *      'First section' => array(
     *          'input',
     *          'output'
     *          'overwrite',
     *      ),
     *      'Second section' => array(
     *          'v',
     *          'h',
     *      ),
     *  )
     * </code>
     *
     * As can be seen, short option names are possible as well as long ones.
     * The key of the first array level is the name of the section, which is
     * assigned to an array of options to group under this section. The $params
     * parameter still influences if an option is displayed at all.
     * 
     * @param bool $long
     * @param array(string) $params
     * @param array(string=>array(string)) $paramGrouping
     * @return array(array(string)) Table structure as explained.
     * 
     * @apichange In future versions, the default values of $params will change 
     *            to null instead of an empty array. Giving an empty array for 
     *            these will then be taken literally.
     */
    public function getHelp( $long = false, array $params = array(), array $paramGrouping = null )
    {
        // New handling
        $params = ( $params === array() || $params === null ? null : $params );

        $help = array();
        if ( $paramGrouping === null )
        {
            // Original handling
            $help = $this->getOptionHelpWithoutGrouping( $long, $params );
        }
        else
        {
            $help = $this->getOptionHelpWithGrouping( $long, $params, $paramGrouping );
        }

        if ( $this->argumentDefinition !== null )
        {
            $help[] = array( "Arguments:", '' );

            $argumentsHelp = $this->helpGenerator->generateArgumentHelp( $long );
            if ( $argumentsHelp === array() )
            {
                $help[] = array( '', "No arguments available." );
            }
            else
            {
                $help = array_merge( $help, $argumentsHelp );
            }
        }

        return $help;
    }

    /**
     * Creates the option help array in the original, ungrouped way.
     *
     * Creates the original help array generated by {@link getHelp()}. The
     * $long and $params options are the same as they are for this method.
     * 
     * @param bool $long 
     * @param array $params 
     * @return array
     */
    private function getOptionHelpWithoutGrouping( $long, $params )
    {
        return $this->helpGenerator->generateUngroupedOptionHelp(
            $long,
            $params
        );
    }

    /**
     * Generates options helo array with ordering and grouping.
     * 
     * @param mixed $long 
     * @param mixed $params 
     * @param mixed $paramGrouping 
     * @return array()
     */
    private function getOptionHelpWithGrouping( $long, $params, $paramGrouping )
    {
        $rawHelp = $this->helpGenerator->generateGroupedOptionHelp(
            $paramGrouping,
            $long,
            $params
        );

        $help  = array();
        $first = true;
        foreach ( $rawHelp as $category => $optionsHelp )
        {
            if ( !$first )
            {
                $help[] = array( '', '' );
            }
            else
            {
                $first = false;
            }

            $help[] = array( $category, '' );
            $help = array_merge( $help, $optionsHelp );
        }
        return $help;
    }

    
    /**
     * Get help information for your options as a table.
     *
     * This method provides the information returned by 
     * {@link ezcConsoleInput::getHelp()} in a table.
     *
     * The $paramGrouping option can be used to group options in the help
     * output. The structure of this array parameter is as follows:
     *
     * <code>
     *  array(
     *      'First section' => array(
     *          'input',
     *          'output'
     *          'overwrite',
     *      ),
     *      'Second section' => array(
     *          'v',
     *          'h',
     *      ),
     *  )
     * </code>
     *
     * As can be seen, short option names are possible as well as long ones.
     * The key of the first array level is the name of the section, which is
     * assigned to an array of options to group under this section. The $params
     * parameter still influences if an option as displayed at all.
     * 
     * @param ezcConsoleTable $table     The table object to fill.
     * @param bool $long                 Set this to true for getting the 
     *                                   long help version.
     * @param array(string) $params Set of option names to generate help 
     *                                   for, default is all.
     * @param array(string=>array(string)) $paramGrouping
     * @return ezcConsoleTable           The filled table.
     */
    public function getHelpTable( ezcConsoleTable $table, $long = false, array $params = array(), $paramGrouping = null )
    {
        $help = $this->getHelp( $long, $params, $paramGrouping );
        $i = 0;
        foreach ( $help as $row )
        {
            $table[$i][0]->content = $row[0];
            $table[$i++][1]->content = $row[1];
        }
        return $table;
    }

    /**
     * Returns a standard help output for your program.
     *
     * This method generates a help text as it's commonly known from Unix
     * command line programs. The output will contain the synopsis, your 
     * provided program description and the selected parameter help
     * as also provided by {@link ezcConsoleInput::getHelp()}. The returned
     * string can directly be printed to the console.
     *
     * The $paramGrouping option can be used to group options in the help
     * output. The structure of this array parameter is as follows:
     *
     * <code>
     *  array(
     *      'First section' => array(
     *          'input',
     *          'output'
     *          'overwrite',
     *      ),
     *      'Second section' => array(
     *          'v',
     *          'h',
     *      ),
     *  )
     * </code>
     *
     * As can be seen, short option names are possible as well as long ones.
     * The key of the first array level is the name of the section, which is
     * assigned to an array of options to group under this section. The $params
     * parameter still influences if an option as displayed at all.
     * 
     * @param string $programDesc        The description of your program.
     * @param int $width                 The width to adjust the output text to.
     * @param bool $long                 Set this to true for getting the long 
     *                                   help version.
     * @param array(string) $params Set of option names to generate help 
     *                                   for, default is all.
     * @param array(string=>array(string)) $paramGrouping
     * @return string The generated help text.
     */
    public function getHelpText( $programDesc, $width = 80, $long = false, array $params = null, $paramGrouping = null )
    {
        $help = $this->getHelp( $long, ( $params == null ? array() : $params ), $paramGrouping );

        // Determine max length of first column text.
        $maxLength = 0;
        foreach ( $help as $row )
        {
            $maxLength = max( $maxLength, iconv_strlen( $row[0], 'UTF-8' ) );
        }

        // Width of left column
        $leftColWidth = $maxLength + 2;
        // Width of righ column
        $rightColWidth = $width - $leftColWidth;

        $res = 'Usage: ' . $this->getSynopsis( $params ) . PHP_EOL;
        $res .= $this->stringTool->wordwrap( $programDesc, $width, PHP_EOL );
        $res .= PHP_EOL . PHP_EOL;
        foreach ( $help as $row )
        {
            $rowParts = explode(
                "\n",
                $this->stringTool->wordwrap( $row[1], $rightColWidth )
            );

            $res .= $this->stringTool->strPad( $row[0], $leftColWidth, ' ' );
            $res .= $rowParts[0] . PHP_EOL;
            // @TODO: Fix function call in loop header
            for ( $i = 1; $i < sizeof( $rowParts ); $i++ )
            {
                $res .= str_repeat( ' ', $leftColWidth ) . $rowParts[$i] . PHP_EOL;
            }
        }
        return $res;
    }

    /**
     * Returns the synopsis string for the program.
     *
     * This gives you a synopsis definition for the options and arguments 
     * defined with this instance of ezcConsoleInput. You can filter the 
     * options named in the synopsis by submitting their short names in an
     * array as the parameter of this method. If the parameter $optionNames
     * is set, only those options are listed in the synopsis. 
     * 
     * @param array(string) $optionNames
     * @return string
     */
    public function getSynopsis( array $optionNames = null )
    {
        return $this->helpGenerator->generateSynopsis( $optionNames );
    }

    /**
     * Returns if a help option was set.
     * This method returns if an option was submitted, which was defined to be
     * a help option, using the isHelpOption flag.
     * 
     * @return bool If a help option was set.
     */
    public function helpOptionSet()
    {
        return $this->helpOptionSet;
    }

    /**
     * Property read access.
     *
     * @throws ezcBasePropertyNotFoundException 
     *         If the the desired property is not found.
     * 
     * @param string $propertyName Name of the property.
     * @return mixed Value of the property or null.
     * @ignore
     */
    public function __get( $propertyName )
    {
        if ( !isset( $this->$propertyName ) )
        {
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        return $this->properties[$propertyName];
    }

    /**
     * Property set access.
     * 
     * @param string $propertyName 
     * @param string $propertyValue 
     * @ignore
     * @return void
     */
    public function __set( $propertyName, $propertyValue )
    {
        switch ( $propertyName )
        {
            case "argumentDefinition":
                if ( ( $propertyValue instanceof ezcConsoleArguments ) === false && $propertyValue !== null )
                {
                    throw new ezcBaseValueException( $propertyName, $propertyValue, "ezcConsoleArguments" );
                }
                break;
            default:
                throw new ezcBasePropertyNotFoundException( $propertyName );
        }
        $this->properties[$propertyName] = $propertyValue;
    }
    
    /**
     * Property isset access.
     * 
     * @param string $propertyName Name of the property.
     * @return bool True if the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $propertyName )
    {
        return array_key_exists( $propertyName, $this->properties );
    }

    /**
     * Returns the synopsis string for a single option and its dependencies.
     *
     * This method returns a part of the program synopsis, specifically for a
     * certain parameter. The method recursively adds depending parameters up
     * to the 2nd depth level to the synopsis. The second parameter is used
     * to store the short names of all options that have already been used in 
     * the synopsis (to avoid adding an option twice). The 3rd parameter 
     * determines the actual deps in the option dependency recursion to 
     * terminate that after 2 recursions.
     * 
     * @param ezcConsoleOption $option        The option to include.
     * @param array(string) $usedOptions Array of used option short names.
     * @param int $depth                      Current recursion depth.
     * @return string The synopsis for this parameter.
     *
     * @apichange This method is deprecates. Implement your own {@link 
     *            ezcConsoleInputHelpGenerator} instead, as soon as the 
     *            interface is made public.
     */
    protected function createOptionSynopsis( ezcConsoleOption $option, &$usedOptions, $depth = 0 )
    {
        $synopsis = '';

        // Break after a nesting level of 2
        if ( $depth++ > 2 || ( in_array( $option->short, $usedOptions['short'] ) && in_array( $option->long, $usedOptions['long'] ) ) ) return $synopsis;
        
        $usedOptions['short'][] = $option->short;
        $usedOptions['long'][]  = $option->long;
        
        $synopsis .= $option->short !== "" ? "-{$option->short}" : "--{$option->long}";

        if ( isset( $option->default ) )
        {
            $synopsis .= " " . ( $option->type === ezcConsoleInput::TYPE_STRING ? '"' : '' ) . $option->default . ( $option->type === ezcConsoleInput::TYPE_STRING ? '"' : '' );
        }
        else if ( $option->type !== ezcConsoleInput::TYPE_NONE )
        {
            $synopsis .= " ";
            switch ( $option->type )
            {
                case ezcConsoleInput::TYPE_STRING:
                    $synopsis .= "<string>";
                    break;
                case ezcConsoleInput::TYPE_INT:
                    $synopsis .= "<int>";
                    break;
            }
        }

        foreach ( $option->getDependencies() as $rule )
        {
            $deeperSynopsis = $this->createOptionSynopsis( $rule->option, $usedOptions, $depth );
            $synopsis .= ( iconv_strlen( trim( $deeperSynopsis ), 'UTF-8' ) > 0 
                ? ' ' . $deeperSynopsis
                : ''
            );
        }
        
        if ( $option->arguments === false )
        {
            $allowsArgs = false;
        }
        
        // Make the whole thing optional?
        if ( $option->mandatory === false )
        {
            $synopsis = "[$synopsis]";
        }

        return $synopsis . ' ';
    }

    /**
     * Process an option.
     *
     * This method does the processing of a single option. 
     * 
     * @param array(string) $args The arguments array.
     * @param int $i                   The current position in the arguments array.
     * @return void
     *
     * @throws ezcConsoleOptionTooManyValuesException
     *         If an option that expects only a single value was submitted 
     *         with multiple values.
     * @throws ezcConsoleOptionTypeViolationException
     *         If an option was submitted with a value of the wrong type.
     * @throws ezcConsoleOptionMissingValueException
     *         If an option thats expects a value was submitted without.
     */
    private function processOption( array $args, &$i )
    {
        $option = $this->getOption( preg_replace( '/^-+/', '', $args[$i++] ) );

        // Is the actual option a help option?
        if ( $option->isHelpOption === true )
        {
            $this->helpOptionSet = true;
        }
        // No value expected
        if ( $option->type === ezcConsoleInput::TYPE_NONE )
        {
            // No value expected
            if ( isset( $args[$i] ) && iconv_substr( $args[$i], 0, 1, 'UTF-8' ) !== '-' && sizeof( $args ) > ( $i + 1 ) )
            {
                // But one found
                throw new ezcConsoleOptionTypeViolationException( $option, $args[$i] );
            }
            // Multiple occurance possible
            if ( $option->multiple === true )
            {
                $option->value[] = true;
            }
            else
            {
                $option->value = true;
            }
            // Everything fine, nothing to do
            return $i;
        }
        // Value expected, check for it
        if ( isset( $args[$i] ) && iconv_substr( $args[$i], 0, 1, 'UTF-8' ) !== '-' )
        {
            // Type check
            if ( $this->isCorrectType( $option->type, $args[$i] ) === false )
            {
                throw new ezcConsoleOptionTypeViolationException( $option, $args[$i] );
            }
            // Multiple values possible
            if ( $option->multiple === true )
            {
                $option->value[] = $args[$i];
            }
            // Only single value expected, check for multiple
            elseif ( isset( $option->value ) && $option->value !== false )
            {
                throw new ezcConsoleOptionTooManyValuesException( $option );
            }
            else
            {
                $option->value = $args[$i];
            }
            $i++;
        }
        // Value found? If not, use default, if available
        if ( !isset( $option->value ) || $option->value === false || ( is_array( $option->value ) && count( $option->value ) === 0) ) 
        {
            throw new ezcConsoleOptionMissingValueException( $option );
        }
    }

    /**
     * Process arguments given to the program. 
     * 
     * @param array(string) $args The arguments array.
     * @param int $i                   Current index in arguments array.
     * @return void
     */
    private function processArguments( array $args, &$i )
    {
        $numArgs = count( $args );
        if ( $this->argumentDefinition === null || $this->argumentsAllowed() === false )
        {
            // Old argument handling, also used of a set option sets disallowing arguments
            while ( $i < $numArgs )
            {
                $this->arguments[] = $args[$i++];
            }
        }
        else
        {
            $mandatory = true;
            foreach ( $this->argumentDefinition as $arg )
            {
                // Check if all followinga arguments are optional
                if ( $arg->mandatory === false )
                {
                    $mandatory = false;
                }

                // Check if the current argument is present and mandatory
                if ( $mandatory === true )
                {
                    if ( !isset( $args[$i] ) )
                    {
                        throw new ezcConsoleArgumentMandatoryViolationException( $arg );
                    }
                }
                else
                {
                    // Arguments are optional, if no more left: return.
                    if ( !isset( $args[$i] ) )
                    {
                        // Optional and no more arguments left, assign default
                        $arg->value = $arg->default;
                        continue;
                    }
                }

                if ( $arg->multiple === true )
                {
                    $arg->value = array();
                    for ( $i = $i; $i < $numArgs; ++$i )
                    {
                        if ( $this->isCorrectType( $arg->type, $args[$i] ) === false )
                        {
                            throw new ezcConsoleArgumentTypeViolationException( $arg, $args[$i] );
                        }
                        $arg->value = array_merge( $arg->value, array( $args[$i] ) );
                        // Keep old handling, too
                        $this->arguments[] = $args[$i];
                    }
                    return;
                }
                else
                {
                    if ( $this->isCorrectType( $arg->type, $args[$i] ) === false )
                    {
                        throw new ezcConsoleArgumentTypeViolationException( $arg, $args[$i] );
                    }
                    $arg->value = $args[$i];
                    // Keep old handling, too
                    $this->arguments[] = $args[$i];
                }
                ++$i;
            }

            if ( $i < $numArgs )
            {
                throw new ezcConsoleTooManyArgumentsException( $args, $i );
            }
        }
    }

    /**
     * Returns if arguments are allowed with the current option submition.
     * 
     * @return bool If arguments allowed.
     */
    protected function argumentsAllowed()
    {
        foreach ( $this->options as $id => $option )
        {
            if ( $option->value !== false && $option->arguments === false )
            {
                return false;
            }
        }
        return true;
    }

    /**
     * Check the rules that may be associated with an option.
     *
     * Options are allowed to have rules associated for dependencies to other
     * options and exclusion of other options or arguments. This method
     * processes the checks.
     *
     * @throws ezcConsoleException
     *         in case validation fails.
     */
    private function checkRules()
    {
        // If a help option is set, skip rule checking
        if ( $this->helpOptionSet === true )
        {
            return;
        }
        $this->validator->validateOptions(
            $this->options,
            ( $this->arguments !== array() )
        );
    }

    /**
     * Checks if a value is of a given type. Converts the value to the
     * correct PHP type on success.
     *  
     * @param int $type   The type to check for. One of self::TYPE_*.
     * @param string $val The value to check. Will possibly altered!
     * @return bool True on succesful check, otherwise false.
     */
    private function isCorrectType( $type, &$val )
    {
        $res = false;
        switch ( $type )
        {
            case ezcConsoleInput::TYPE_STRING:
                $res = true;
                $val = preg_replace( '/^(["\'])(.*)\1$/', '\2', $val );
                break;
            case ezcConsoleInput::TYPE_INT:
                $res = preg_match( '/^[0-9]+$/', $val ) ? true : false;
                if ( $res )
                {
                    $val = ( int ) $val;
                }
                break;
        }
        return $res;
    }

    /**
     * Split parameter and value for long option names. 
     * 
     * This method checks for long options, if the value is passed using =. If
     * this is the case parameter and value get split and replaced in the
     * arguments array.
     * 
     * @param array(string) $args The arguments array
     * @param int $i                   Current arguments array position
     * @return void
     */
    private function preprocessLongOption( array &$args, $i )
    {
        // Value given?
        if ( preg_match( '/^--\w+\=[^ ]/i', $args[$i] ) )
        {
            // Split param and value and replace current param
            $parts = explode( '=', $args[$i], 2 );
            array_splice( $args, $i, 1, $parts );
        }
    }
}
?>
PKna�\;o�!'pear/ezc/ConsoleTools/dialog_viewer.phpnu�[���<?php
/**
 * File containing the ezcConsoleDialogViewer class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Utility class for ezcConsoleDialog implementations.
 * This class contains utility methods for working with {@link
 * ezcConsoleDialog} implementations.
 *
 * To display a dialog in a loop until a valid result is received do:
 * <code>
 * // Instatiate dialog in $dialog ...
 * ezcConsoleDialogViewer::displayDialog( $dialog );
 * </code>
 *
 * For implementing a custom dialog, the method {@link readLine()} method can be
 * used to read a line of input from the user.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleDialogViewer
{
    /**
     * Displays a dialog and returns a valid result from it.
     * This methods displays a dialog in a loop, until it received a valid
     * result from it and returns this result.
     * 
     * @param ezcConsoleDialog $dialog The dialog to display.
     * @return mixed The result from this dialog.
     */
    public static function displayDialog( ezcConsoleDialog $dialog )
    {
        do
        {
            $dialog->display();
        }
        while ( $dialog->hasValidResult() === false );
        return $dialog->getResult();
    }

    /**
     * Returns a line from STDIN.
     * The returned line is fully trimmed.
     * 
     * @return string
     * @throws ezcConsoleDialogAbortException
     *         if the user closes STDIN using <CTRL>-D.
     */
    public static function readLine()
    {
        $res = trim( fgets( STDIN ) );
        if ( feof( STDIN ) )
        {
            throw new ezcConsoleDialogAbortException();
        }
        return $res;
    }
}

?>
PKna�\�����Apear/ezc/ConsoleTools/exceptions/argument_mandatory_violation.phpnu�[���<?php
/**
 * File containing the ezcConsoleArgumentMandatoryViolationException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * An argument was marked to be mandatory but was not submitted.
 * This exception can be caught using {@link ezcConsoleArgumentException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleArgumentMandatoryViolationException extends ezcConsoleArgumentException
{

    /**
     * Creates a new exception object. 
     * 
     * @param ezcConsoleArgument $arg The argument object, the violation occured for.
     * @return void
     */
    public function __construct( ezcConsoleArgument $arg )
    {
        parent::__construct( "Argument with name '{$arg->name}' is mandatory but was not submitted." );
    }
}

?>
PKna�\ a�8pear/ezc/ConsoleTools/exceptions/invalid_option_name.phpnu�[���<?php
/**
 * File containing the ezcConsoleInvalidOptionNameException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Thrown if an invalid option name (containing whitespaces or starting with 
 * a "-") was received by {@link ezcConsoleOption::__construct}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleInvalidOptionNameException extends ezcConsoleException
{
    /**
     * Creates a new exception object. 
     * 
     * @param string $name The affected option name.
     * @return void
     */
    public function __construct( $name )
    {
        parent::__construct( "The option name '{$name}' is invalid." );
    }
}

?>
PKoa�\��H��;pear/ezc/ConsoleTools/exceptions/no_valid_dialog_result.phpnu�[���<?php
/**
 * File containing the ezcConsoleNoValidDialogResultException.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Thrown if {@link ezcConsoleDialog::getResult()} is called before a valid
 * result was received.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleNoValidDialogResultException extends ezcConsoleException
{
    
    /**
     * Creates a new exception object.
     * 
     * @return void
     */
    public function __construct()
    {
        parent::__construct( "The dialog did not receive a valid result, yet." );
    }

}
?>
PKoa�\�ř��9pear/ezc/ConsoleTools/exceptions/option_missing_value.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionMissingValueException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * An option which expects a value was submitted without.
 * This exception can be caught using {@link ezcConsoleOptionException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionMissingValueException extends ezcConsoleOptionException
{
    /**
     * Creates a new exception object. 
     * 
     * @param ezcConsoleOption $option The option the value is missing for The option the value is missing for.. 
     * @return void
     */
    public function __construct( ezcConsoleOption $option )
    {
        parent::__construct( "The option '{$option->long}' expects a value, but none was submitted." );
    }
}

?>
PKoa�\] 5��-pear/ezc/ConsoleTools/exceptions/argument.phpnu�[���<?php
/**
 * File containing the ezcConsoleArgumentException class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * General exception container for the ConsoleTools component referring to argument handling.
 * This base container allows you to catch all exceptions which are related to 
 * errors produced by invalid user submitted arguments {@link ezcConsoleInput::process()}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
abstract class ezcConsoleArgumentException extends ezcConsoleException
{
}

?>
PKpa�\\)�|��6pear/ezc/ConsoleTools/exceptions/argument_too_many.phpnu�[���<?php
/**
 * File containing the ezcConsoleTooManyArgumentsException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Thrown if only a certain number of arguments were expected, but more were submitted.
 * This exception can be caught using {@link ezcConsoleOptionException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleTooManyArgumentsException extends ezcConsoleArgumentException
{
    /**
     * Creates a new exception object. 
     * 
     * @param array(string) $args Arguments array.
     * @param int $i                   Index in the arguments array.
     * @return void
     */
    public function __construct( $args, $i )
    {
        parent::__construct( "Only " . ( $i - 1 ) . " arguments are expected, but " . ( count( $args ) - 1 ) . " were submitted." );
    }
}

?>
PKpa�\��ī�7pear/ezc/ConsoleTools/exceptions/no_position_stored.phpnu�[���<?php
/**
 * File containing the ezcConsoleNoPositionStoredException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * 'Cannot restore position, if no position has been stored before.'.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleNoPositionStoredException extends ezcConsoleException
{
    /**
     * Creates a new exception object.
     * 
     * @return void
     */
    public function __construct()
    {
        parent::__construct( 'Cannot restore position, if no position has been stored before.' );
    }
}

?>
PKqa�\�:�Apear/ezc/ConsoleTools/exceptions/option_string_not_wellformed.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionStringNotWellformedException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * The option definition string supplied is not wellformed.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionStringNotWellformedException extends ezcConsoleException
{
    /**
     * Creates a new exception object. 
     * 
     * @param string $reason The reason for that the string was invalid.
     * @return void
     */
    public function __construct( $reason )
    {
        parent::__construct( "The provided option defintion string was not well formed. " . $reason );
    }
}

?>
PKqa�\����:pear/ezc/ConsoleTools/exceptions/option_type_violation.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionTypeViolationException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * An option was submitted with an illigal type.
 * This exception can be caught using {@link ezcConsoleOptionException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionTypeViolationException extends ezcConsoleOptionException
{
    /**
     * Creates a new exception object. 
     * 
     * @param ezcConsoleOption $option The option affected by the violation.
     * @param mixed $value             The violating value            The violating value..
     * @return void
     */
    public function __construct( ezcConsoleOption $option, $value )
    {
        $typeName = 'unknown';
        switch ( $option->type )
        {
            case ezcConsoleInput::TYPE_NONE:
                $typeName = 'none';
                break;
            case ezcConsoleInput::TYPE_INT:
                $typeName = 'int';
                break;
        }
        parent::__construct( "The option '{$option->long}' expects a value of type '{$typeName}', but received the value '{$value}'." );
    }
}
?>
PKqa�\a��rr<pear/ezc/ConsoleTools/exceptions/argument_type_violation.phpnu�[���<?php
/**
 * File containing the ezcConsoleArgumentTypeViolationException class.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * An argument was submitted with an illigal type.
 * This exception can be caught using {@link ezcConsoleArgumentException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleArgumentTypeViolationException extends ezcConsoleArgumentException
{
    /**
     * Creates a new exception object. 
     * 
     * @param ezcConsoleArgument $arg The violated argument.
     * @param mixed $value            The incorrect value.
     * @return void
     */
    public function __construct( ezcConsoleArgument $arg, $value )
    {
        $typeName = 'unknown';
        switch ( $arg->type )
        {
            case ezcConsoleInput::TYPE_INT:
                $typeName = 'int';
                break;
        }
        parent::__construct( "The argument '{$arg->name}' expects a value of type '{$typeName}', but received the value '{$value}'." );
    }
}

?>
PKra�\�%�agg?pear/ezc/ConsoleTools/exceptions/option_mandatory_violation.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionMandatoryViolationException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * An option was marked to be mandatory but was not submitted.
 * This exception can be caught using {@link ezcConsoleOptionException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionMandatoryViolationException extends ezcConsoleOptionException
{
    /**
     * Creates a new exception object. 
     * 
     * @param ezcConsoleOption $option The violating option.
     * @return void
     */
    public function __construct( ezcConsoleOption $option )
    {
        parent::__construct( "Option with long name '{$option->long}' is mandatory but was not submitted." );
    }
}

?>
PKra�\|�����>pear/ezc/ConsoleTools/exceptions/option_already_registered.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionAlreadyRegisteredException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * The option name you tried to register is already in use.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionAlreadyRegisteredException extends ezcConsoleException
{
    /**
     * Creates a new exception object. 
     * 
     * @param string $name Name of the affected option.
     * @return void
     */
    public function __construct( $name )
    {
        parent::__construct( "An option with the name '{$name}' is already registered." );
    }
}

?>
PKsa�\�J���?pear/ezc/ConsoleTools/exceptions/option_arguments_violation.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionArgumentsViolationException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * An option excludes the usage of arguments, but there were arguments submitted.
 * This exception can be caught using {@link ezcConsoleOptionException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionArgumentsViolationException extends ezcConsoleOptionException
{
    /**
     * Creates a new exception object.
     * 
     * @param ezcConsoleOption $option The violating option. 
     * @return void
     */
    public function __construct( ezcConsoleOption $option )
    {
        parent::__construct( "The option with long name '{$option->long}' excludes the usage of arguments, but arguments have been submitted." );
    }
}

?>
PKsa�\��vv;pear/ezc/ConsoleTools/exceptions/option_too_many_values.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionTooManyValuesException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * An option that expects only a single value was submitted with multiple values.
 * This exception can be caught using {@link ezcConsoleOptionException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionTooManyValuesException extends ezcConsoleOptionException
{
    /**
     * Creates a new exception object. 
     * 
     * @param ezcConsoleOption $option The affected option. 
     * @return void
     */
    public function __construct( ezcConsoleOption $option )
    {
        parent::__construct( "The option '{$option->long}' expects a single value, but multiple were submitted." );
    }
}

?>
PKsa�\e�8##6pear/ezc/ConsoleTools/exceptions/option_not_exists.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionNotExistsException
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Occurs if the requested option is not registered.
 * This exception can be caught using {@link ezcConsoleOptionException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionNotExistsException extends ezcConsoleOptionException
{
    /**
     * Creates a new exception object. 
     * 
     * @param string $name Name of the already existing option.
     * @return void
     */
    public function __construct( $name )
    {
        parent::__construct( "The referenced parameter '{$name}' is not registered." );
    }
}
?>
PKsa�\=��?��1pear/ezc/ConsoleTools/exceptions/dialog_abort.phpnu�[���<?php
/**
 * File containing the ezcConsoleDialogAbortException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Occurs if the user sends <CTRL>-D to a dialog instead of a valid answer.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleDialogAbortException extends ezcConsoleException
{
    /**
     * Creates a new exception object. 
     * 
     * @param string $name Name of the already existing option.
     * @return void
     */
    public function __construct()
    {
        parent::__construct( "User send EOF." );
    }
}
?>
PKsa�\��?pear/ezc/ConsoleTools/exceptions/option_exclusion_violation.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionExclusionViolationException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * An exclusion rule for a parameter was violated.
 * This exception can be caught using {@link ezcConsoleOptionException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionExclusionViolationException extends ezcConsoleOptionException
{
    /**
     * Creates a new exception object. 
     * 
     * @param ezcConsoleOption $excludingOption The excluding option.
     * @param ezcConsoleOption $excludedOption  The excluded option.
     * @param mixed $valueRange                 The excluded value range.
     * @return void
     */
    public function __construct( ezcConsoleOption $excludingOption, ezcConsoleOption $excludedOption, $valueRange = null )
    {
        $message = "The option '{$excludingOption->long}' excludes the option '{$excludedOption->long}'";
        if ( $valueRange !== null )
        {
            $message .= " to have a value in '{$valueRange}'";
        }
        $message .= " but this one was submitted.";
        parent::__construct( $message );
    }
}
?>
PKta�\��@pear/ezc/ConsoleTools/exceptions/option_dependency_violation.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionDependencyViolationException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * A dependency rule for a parameter was violated.
 * This exception can be caught using {@link ezcConsoleOptionException}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionDependencyViolationException extends ezcConsoleOptionException
{
    /**
     * Creates a new exception object. 
     * 
     * @param ezcConsoleOption $dependingOption The depending option.
     * @param ezcConsoleOption $dependantOption The option depended on.
     * @param mixed $valueRange                 The dependend value range.
     * @return void
     */
    public function __construct( ezcConsoleOption $dependingOption, ezcConsoleOption $dependantOption, $valueRange = null )
    {
        $message  = "The option '{$dependingOption->long}' depends on the option '{$dependantOption->long}' ";
        if ( $valueRange !== null )
        {
            $message .= "to have a value in '{$valueRange}' ";
        }
        $message .= "but this one was not submitted.";
        parent::__construct( $message );
    }
}
?>
PKta�\s��

4pear/ezc/ConsoleTools/exceptions/option_no_alias.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionNoAliasException.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Occurs if the alias you tried to unregister is not an alias, but a real option.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleOptionNoAliasException extends ezcConsoleException
{
    /**
     * Creates a new exception object. 
     * 
     * @param string $name The name of the option which is not an alias.
     * @return void
     */
    public function __construct( $name )
    {
        parent::__construct( "The option name '{$name}' refers to a real parameter, not to an alias." );
    }
}

?>
PKta�\�BW9��:pear/ezc/ConsoleTools/exceptions/invalid_output_target.phpnu�[���<?php
/**
 * File containing the ezcConsoleInvalidOutputTargetException.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * Thrown if a given target {@link ezcConsoleOutputFormat} could not be opened.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleInvalidOutputTargetException extends ezcConsoleException
{
    
    /**
     * Creates a new exception object.
     * 
     * @param string $target Affected target.
     * @return void
     */
    public function __construct( $target )
    {
        parent::__construct( "The target '{$target}' could not be opened for writing." );
    }

}
?>
PKta�\7���.pear/ezc/ConsoleTools/exceptions/exception.phpnu�[���<?php
/**
 * File containing the ezcConsoleException class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * General exception container for the ConsoleTools component.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
abstract class ezcConsoleException extends ezcBaseException
{
}
?>
PKua�\J�8��+pear/ezc/ConsoleTools/exceptions/option.phpnu�[���<?php
/**
 * File containing the ezcConsoleOptionException class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * General exception container for the ConsoleTools component referring to option handling.
 * This base container allows you to catch all exceptions which are related to 
 * errors produced by invalid user submitted options {@link ezcConsoleInput::process()}.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
abstract class ezcConsoleOptionException extends ezcConsoleException
{
}
?>
PKua�\X�XDD@pear/ezc/ConsoleTools/exceptions/argument_already_registered.phpnu�[���<?php
/**
 * File containing the ezcConsoleArgumentAlreadyRegisteredException class.
 * 
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 */

/**
 * There is already an argument registered with the given name or at the given place.
 *
 * @package ConsoleTools
 * @version 1.6.1
 */
class ezcConsoleArgumentAlreadyRegisteredException extends ezcConsoleException
{
    /**
     * The name of the argument is already in use.
     */
    const NAMED = 1;
    
    /**
     * The position of the argument is already in use. Unset the position first and the re-register.
     */
    const ORDERED = 2;

    /**
     * Creates a new exception object.
     * The $type parameter can either be
     * {@link ezcConsoleArgumentAlreadyRegisteredException::NAMED} or
     * {@link ezcConsoleArgumentAlreadyRegisteredException::ORDERED}, indicating
     * if the name of the parameter or its place are already taken.
     * 
     * @param int $offset Offset of the already reagistered argument.
     * @param int $type   Type of the offset.
     * @return void
     */
    public function __construct( $offset, $type )
    {
        switch ( $type )
        {
            case self::NAMED:
                $message = "Argument with name '$offset' already registered.";
                break;
            case self::ORDERED:
                $message = "Argument at position '$offset' already registered.";
                break;
        }
        parent::__construct( $message );
    }
}
?>
PKua�\��\Ѫ7�7%pear/ezc/ConsoleTools/progressbar.phpnu�[���<?php
/**
 * File containing the ezcConsoleProgressbar class.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @filesource
 */

/**
 * Creating and maintaining progress-bars to be printed to the console. 
 *
 * <code>
 * $out = new ezcConsoleOutput();
 * 
 * // Create progress bar itself
 * $progress = new ezcConsoleProgressbar( $out, 100, array( 'step' => 5 ) );
 * 
 * $progress->options->emptyChar = '-';
 * $progress->options->progressChar = '#';
 * $progress->options->formatString = "Uploading file </tmp/foobar.tar.bz2>: %act%/%max% kb [%bar%]";
 * 
 * // Perform actions
 * $i = 0;
 * while ( $i++ < 20 ) 
 * {
 *     // Do whatever you want to indicate progress for
 *     usleep( mt_rand( 20000, 2000000 ) );
 *     // Advance the progressbar by one step ( uploading 5k per run )
 *     $progress->advance();
 * }
 * 
 * // Finish progress bar and jump to next line.
 * $progress->finish();
 * 
 * $out->outputText( "Successfully uploaded </tmp/foobar.tar.bz2>.\n", 'success' );
 * </code>
 * 
 * @property ezcConsoleProgressbarOptions $options
 *           Contains the options for this class.
 * @property int $max
 *           The maximum progress value to reach.
 *
 * @package ConsoleTools
 * @version 1.6.1
 * @mainclass
 */
class ezcConsoleProgressbar
{
    /**
     * Container to hold the properties
     *
     * @var array(string=>mixed)
     */
    protected $properties;

    /**
     * Storage for actual values to be replaced in the format string.
     * Actual values are stored here and will be inserted into the bar
     * before printing it.
     * 
     * @var array(string=>string)
     */
    protected $valueMap = array( 
        'bar'       => '',
        'fraction'  => '',
        'act'       => '',
        'max'       => '',
    );

    /**
     * Stores the bar utilization.
     *
     * This array saves how much space a specific part of the bar utilizes to not
     * recalculate those on every step.
     * 
     * @var array(string=>int)
     */
    protected $measures = array( 
        'barSpace'          => 0,
        'fractionSpace'     => 0,
        'actSpace'          => 0,
        'maxSpace'          => 0,
        'fixedCharSpace'    => 0,
    );

    /**
     * The current step the progress bar should show. 
     * 
     * @var int
     */
    protected $currentStep = 0;

    /**
     * The maximum number of steps to go.
     * Calculated once from the settings.
     *
     * @var int
     */
    protected $numSteps = 0;

    /**
     * The ezcConsoleOutput object to use.
     *
     * @var ezcConsoleOutput
     */
    protected $output;

    /**
     * Indicates if the starting point for the bar has been stored.
     * Per default this is false to indicate that no start position has been
     * stored, yet.
     * 
     * @var bool
     */
    protected $started = false;

    /**
     * Tool object to perform multi-byte encoding safe string operations. 
     * 
     * @var ezcConsoleStringTool
     */
    private $stringTool;

    /**
     * Creates a new progress bar.
     *
     * @param ezcConsoleOutput $outHandler   Handler to utilize for output
     * @param int $max                       Maximum value, where progressbar 
     *                                       reaches 100%.
     * @param array(string=>string) $options Options
     *
     * @see ezcConsoleProgressbar::$options
     */
    public function __construct( ezcConsoleOutput $outHandler, $max, array $options = array() )
    {
        $this->output     = $outHandler;
        $this->stringTool = new ezcConsoleStringTool();
        $this->__set( 'max', $max );
        $this->properties['options'] = new ezcConsoleProgressbarOptions( $options );
    }
    
    /**
     * Set new options.
     * This method allows you to change the options of progressbar.
     *  
     * @param ezcConsoleProgresbarOptions $options The options to set.
     *
     * @throws ezcBaseSettingNotFoundException
     *         If you tried to set a non-existent option value.
     * @throws ezcBaseSettingValueException
     *         If the value is not valid for the desired option.
     * @throws ezcBaseValueException
     *         If you submit neither an array nor an instance of 
     *         ezcConsoleProgresbarOptions.
     */
    public function setOptions( $options ) 
    {
        if ( is_array( $options ) ) 
        {
            $this->properties['options']->merge( $options );
        } 
        else if ( $options instanceof ezcConsoleProgressbarOptions ) 
        {
            $this->properties['options'] = $options;
        }
        else
        {
            throw new ezcBaseValueException( "options", $options, "instance of ezcConsoleProgressbarOptions" );
        }
    }

    /**
     * Returns the current options.
     * Returns the options currently set for this progressbar.
     * 
     * @return ezcConsoleProgressbarOptions The current options.
     */
    public function getOptions()
    {
        return $this->properties['options'];
    }

    /**
     * Property read access.
     * 
     * @param string $key Name of the property.
     * @return mixed Value of the property or null.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If the the desired property is not found.
     * @ignore
     */
    public function __get( $key )
    {
        switch ( $key )
        {
            case 'options':
                return $this->properties['options'];
            case 'step':
                // Step is now an option
                return $this->properties['options']->step;
            case 'max':
                return $this->properties[$key];
            default:
                break;
        }
        throw new ezcBasePropertyNotFoundException( $key );
    }

    /**
     * Property write access.
     * 
     * @param string $key Name of the property.
     * @param mixed $val  The value for the property.
     *
     * @throws ezcBasePropertyNotFoundException
     *         If a desired property could not be found.
     * @throws ezcBaseValueException
     *         If a desired property value is out of range.
     * @ignore
     */
    public function __set( $key, $val )
    {
        switch ( $key )
        {
            case 'options':
                if ( !( $val instanceof ezcConsoleProgressbarOptions ) )
                {
                    throw new ezcBaseValueException( 'options',  $val, 'instance of ezcConsoleProgressbarOptions' );
                };
                break;
            case 'max':
                if ( ( !is_int( $val ) && !is_float( $val ) ) || $val < 0 )
                {
                    throw new ezcBaseValueException( $key, $val, 'number >= 0' );
                }
                break;
            case 'step':
                if ( ( !is_int( $val ) && !is_float( $val ) ) || $val < 0 )
                {
                    throw new ezcBaseValueException( $key, $val, 'number >= 0' );
                }
                // Step is now an option.
                $this->properties['options']->step = $val;
                return;
            default:
                throw new ezcBasePropertyNotFoundException( $key );
                break;
        }
        // Changes settings or options, need for recalculating measures
        $this->started = false;
        $this->properties[$key] = $val;
    }
 
    /**
     * Property isset access.
     * 
     * @param string $key Name of the property.
     * @return bool True is the property is set, otherwise false.
     * @ignore
     */
    public function __isset( $key )
    {
        switch ( $key )
        {
            case 'options':
            case 'max':
            case 'step':
                return true;
        }
        return false;
    }

    /**
     * Start the progress bar
     * Starts the progress bar and sticks it to the current line.
     * No output will be done yet. Call {@link ezcConsoleProgressbar::output()}
     * to print the bar.
     * 
     * @return void
     */
    public function start() 
    {
        $this->calculateMeasures();
        $this->output->storePos();
        $this->started = true;
    }

    /**
     * Draw the progress bar.
     * Prints the progress-bar to the screen. If start() has not been called 
     * yet, the current line is used for {@link ezcConsolProgressbar::start()}.
     *
     * @return void
     */
    public function output()
    {
        if ( $this->options->minVerbosity > $this->output->options->verbosityLevel
             || ( $this->options->maxVerbosity !== false 
                  && $this->options->maxVerbosity < $this->output->options->verbosityLevel
                )
           )
        {
            // Do not print progress bar if verbosity level is lower than it's
            // output objects value.
            return;
        }

        if ( $this->started === false )
        {
            $this->start();
        }

        $this->output->restorePos();
        if ( ezcBaseFeatures::os() === "Windows" )
        {
            echo str_repeat( "\x8", $this->options->width );
        }

        $this->generateValues();
        echo $this->insertValues();
    }

    /**
     * Advance the progress bar.
     * Advances the progress bar by $step steps. Redraws the bar by default,
     * using the {@link ezcConsoleProgressbar::output()} method.
     *
     * @param bool  $redraw Whether to redraw the bar immediately.
     * @param int $step     How many steps to advance.
     * @return void
     */
    public function advance( $redraw = true, $step = 1 ) 
    {
        $this->currentStep += $step;
        if ( $redraw === true && $this->currentStep % $this->properties['options']->redrawFrequency === 0 )
        {
            $this->output();
        }
    }

    /**
     * Finish the progress bar.
     * Finishes the bar (jump to 100% if not happened yet,...) and jumps
     * to the next line to allow new output. Also resets the values of the
     * output handler used, if changed.
     *
     * @return void
     */
    public function finish()
    {
        $this->currentStep = $this->numSteps;
        $this->output();
    }

    /**
     * Generate all values to be replaced in the format string. 
     * 
     * @return void
     */
    protected function generateValues()
    {
        // Bar
        $barFilledSpace = ceil( $this->measures['barSpace'] / $this->numSteps * $this->currentStep );
        // Sanitize value if it gets to large by rounding
        $barFilledSpace = $barFilledSpace > $this->measures['barSpace'] ? $this->measures['barSpace'] : $barFilledSpace;
        $bar = $this->stringTool->strPad( 
            $this->stringTool->strPad( 
                $this->properties['options']->progressChar, 
                $barFilledSpace, 
                $this->properties['options']->barChar, 
                STR_PAD_LEFT
            ), 
            $this->measures['barSpace'], 
            $this->properties['options']->emptyChar, 
            STR_PAD_RIGHT 
        );
        $this->valueMap['bar'] = $bar;

        // Fraction
        $fractionVal = sprintf( 
            $this->properties['options']->fractionFormat,
            ( $fractionVal = ( $this->properties['options']->step * $this->currentStep ) / $this->max * 100 ) > 100 ? 100 : $fractionVal
        );
        $this->valueMap['fraction'] = $this->stringTool->strPad( 
            $fractionVal, 
            iconv_strlen( sprintf( $this->properties['options']->fractionFormat, 100 ), 'UTF-8' ),
            ' ',
            STR_PAD_LEFT
        );

        // Act / max
        $actVal = sprintf(
            $this->properties['options']->actFormat,
            ( $actVal = $this->currentStep * $this->properties['options']->step ) > $this->max ? $this->max : $actVal
        );
        $this->valueMap['act'] = $this->stringTool->strPad( 
            $actVal, 
            iconv_strlen( sprintf( $this->properties['options']->actFormat, $this->max ), 'UTF-8' ),
            ' ',
            STR_PAD_LEFT
        );
        $this->valueMap['max'] = sprintf( $this->properties['options']->maxFormat, $this->max );
    }

    /**
     * Insert values into bar format string. 
     * 
     * @return void
     */
    protected function insertValues()
    {
        $bar = $this->properties['options']->formatString;
        foreach ( $this->valueMap as $name => $val )
        {
            $bar = str_replace( "%{$name}%", $val, $bar );
        }
        return $bar;
    }

    /**
     * Calculate several measures necessary to generate a bar. 
     * 
     * @return void
     */
    protected function calculateMeasures()
    {
        // Calc number of steps bar goes through
        $this->numSteps = ( int ) round( $this->max / $this->properties['options']->step );
        // Calculate measures
        $this->measures['fixedCharSpace'] = iconv_strlen( $this->stripEscapeSequences( $this->insertValues() ), 'UTF-8' );
        if ( iconv_strpos( $this->properties['options']->formatString, '%max%', 0, 'UTF-8' ) !== false )
        {
            $this->measures['maxSpace'] = iconv_strlen( sprintf( $this->properties['options']->maxFormat, $this->max ), 'UTF-8' );

        }
        if ( iconv_strpos( $this->properties['options']->formatString, '%act%', 0, 'UTF-8' ) !== false )
        {
            $this->measures['actSpace'] = iconv_strlen( sprintf( $this->properties['options']->actFormat, $this->max ), 'UTF-8' );
        }
        if ( iconv_strpos( $this->properties['options']->formatString, '%fraction%', 0, 'UTF-8' ) !== false )
        {
            $this->measures['fractionSpace'] = iconv_strlen( sprintf( $this->properties['options']->fractionFormat, 100 ), 'UTF-8' );
        }
        $this->measures['barSpace'] = $this->properties['options']->width - array_sum( $this->measures );
    }

    /**
     * Strip all escape sequences from a string to measure it's size correctly. 
     * 
     * @param mixed $str 
     * @return void
     */
    protected function stripEscapeSequences( $str )
    {
        return preg_replace( '/\033\[[0-9a-f;]*m/i', '', $str  );
    }
}
?>
PKva�\5���tt&pear/ezc/autoload/console_autoload.phpnu�[���<?php
/**
 * Autoloader definition for the ConsoleTools component.
 *
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.6.1
 * @filesource
 * @package ConsoleTools
 */

return array(
    'ezcConsoleException'                           => 'ConsoleTools/exceptions/exception.php',
    'ezcConsoleArgumentException'                   => 'ConsoleTools/exceptions/argument.php',
    'ezcConsoleOptionException'                     => 'ConsoleTools/exceptions/option.php',
    'ezcConsoleArgumentAlreadyRegisteredException'  => 'ConsoleTools/exceptions/argument_already_registered.php',
    'ezcConsoleArgumentMandatoryViolationException' => 'ConsoleTools/exceptions/argument_mandatory_violation.php',
    'ezcConsoleArgumentTypeViolationException'      => 'ConsoleTools/exceptions/argument_type_violation.php',
    'ezcConsoleDialogAbortException'                => 'ConsoleTools/exceptions/dialog_abort.php',
    'ezcConsoleInvalidOptionNameException'          => 'ConsoleTools/exceptions/invalid_option_name.php',
    'ezcConsoleInvalidOutputTargetException'        => 'ConsoleTools/exceptions/invalid_output_target.php',
    'ezcConsoleNoPositionStoredException'           => 'ConsoleTools/exceptions/no_position_stored.php',
    'ezcConsoleNoValidDialogResultException'        => 'ConsoleTools/exceptions/no_valid_dialog_result.php',
    'ezcConsoleOptionAlreadyRegisteredException'    => 'ConsoleTools/exceptions/option_already_registered.php',
    'ezcConsoleOptionArgumentsViolationException'   => 'ConsoleTools/exceptions/option_arguments_violation.php',
    'ezcConsoleOptionDependencyViolationException'  => 'ConsoleTools/exceptions/option_dependency_violation.php',
    'ezcConsoleOptionExclusionViolationException'   => 'ConsoleTools/exceptions/option_exclusion_violation.php',
    'ezcConsoleOptionMandatoryViolationException'   => 'ConsoleTools/exceptions/option_mandatory_violation.php',
    'ezcConsoleOptionMissingValueException'         => 'ConsoleTools/exceptions/option_missing_value.php',
    'ezcConsoleOptionNoAliasException'              => 'ConsoleTools/exceptions/option_no_alias.php',
    'ezcConsoleOptionNotExistsException'            => 'ConsoleTools/exceptions/option_not_exists.php',
    'ezcConsoleOptionStringNotWellformedException'  => 'ConsoleTools/exceptions/option_string_not_wellformed.php',
    'ezcConsoleOptionTooManyValuesException'        => 'ConsoleTools/exceptions/option_too_many_values.php',
    'ezcConsoleOptionTypeViolationException'        => 'ConsoleTools/exceptions/option_type_violation.php',
    'ezcConsoleTooManyArgumentsException'           => 'ConsoleTools/exceptions/argument_too_many.php',
    'ezcConsoleDialogValidator'                     => 'ConsoleTools/interfaces/dialog_validator.php',
    'ezcConsoleQuestionDialogValidator'             => 'ConsoleTools/interfaces/question_dialog_validator.php',
    'ezcConsoleDialog'                              => 'ConsoleTools/interfaces/dialog.php',
    'ezcConsoleDialogOptions'                       => 'ConsoleTools/options/dialog.php',
    'ezcConsoleInputHelpGenerator'                  => 'ConsoleTools/interfaces/input_help_generator.php',
    'ezcConsoleInputValidator'                      => 'ConsoleTools/interfaces/input_validator.php',
    'ezcConsoleMenuDialogValidator'                 => 'ConsoleTools/interfaces/menu_dialog_validator.php',
    'ezcConsoleQuestionDialogCollectionValidator'   => 'ConsoleTools/dialog/validators/question_dialog_collection.php',
    'ezcConsoleArgument'                            => 'ConsoleTools/input/argument.php',
    'ezcConsoleArguments'                           => 'ConsoleTools/input/arguments.php',
    'ezcConsoleDialogViewer'                        => 'ConsoleTools/dialog_viewer.php',
    'ezcConsoleInput'                               => 'ConsoleTools/input.php',
    'ezcConsoleInputStandardHelpGenerator'          => 'ConsoleTools/input/help_generators/standard.php',
    'ezcConsoleMenuDialog'                          => 'ConsoleTools/dialog/menu_dialog.php',
    'ezcConsoleMenuDialogDefaultValidator'          => 'ConsoleTools/dialog/validators/menu_dialog_default.php',
    'ezcConsoleMenuDialogOptions'                   => 'ConsoleTools/options/menu_dialog.php',
    'ezcConsoleOption'                              => 'ConsoleTools/input/option.php',
    'ezcConsoleOptionRule'                          => 'ConsoleTools/structs/option_rule.php',
    'ezcConsoleOutput'                              => 'ConsoleTools/output.php',
    'ezcConsoleOutputFormat'                        => 'ConsoleTools/structs/output_format.php',
    'ezcConsoleOutputFormats'                       => 'ConsoleTools/structs/output_formats.php',
    'ezcConsoleOutputOptions'                       => 'ConsoleTools/options/output.php',
    'ezcConsoleProgressMonitor'                     => 'ConsoleTools/progressmonitor.php',
    'ezcConsoleProgressMonitorOptions'              => 'ConsoleTools/options/progressmonitor.php',
    'ezcConsoleProgressbar'                         => 'ConsoleTools/progressbar.php',
    'ezcConsoleProgressbarOptions'                  => 'ConsoleTools/options/progressbar.php',
    'ezcConsoleQuestionDialog'                      => 'ConsoleTools/dialog/question_dialog.php',
    'ezcConsoleQuestionDialogMappingValidator'      => 'ConsoleTools/dialog/validators/question_dialog_mapping.php',
    'ezcConsoleQuestionDialogOptions'               => 'ConsoleTools/options/question_dialog.php',
    'ezcConsoleQuestionDialogRegexValidator'        => 'ConsoleTools/dialog/validators/question_dialog_regex.php',
    'ezcConsoleQuestionDialogTypeValidator'         => 'ConsoleTools/dialog/validators/question_dialog_type.php',
    'ezcConsoleStandardInputValidator'              => 'ConsoleTools/input/validators/standard.php',
    'ezcConsoleStatusbar'                           => 'ConsoleTools/statusbar.php',
    'ezcConsoleStatusbarOptions'                    => 'ConsoleTools/options/statusbar.php',
    'ezcConsoleStringTool'                          => 'ConsoleTools/tools/string.php',
    'ezcConsoleTable'                               => 'ConsoleTools/table.php',
    'ezcConsoleTableCell'                           => 'ConsoleTools/table/cell.php',
    'ezcConsoleTableOptions'                        => 'ConsoleTools/options/table.php',
    'ezcConsoleTableRow'                            => 'ConsoleTools/table/row.php',
);
?>
PKva�\��5�
�
&pear/ezc/autoload/archive_autoload.phpnu�[���<?php
/**
 * Autoloader definition for the Archive component.
 *
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.4.1
 * @filesource
 * @package Archive
 */

return array(
    'ezcArchiveException'                 => 'Archive/exceptions/exception.php',
    'ezcArchiveBlockSizeException'        => 'Archive/exceptions/block_size.php',
    'ezcArchiveChecksumException'         => 'Archive/exceptions/checksum.php',
    'ezcArchiveEmptyException'            => 'Archive/exceptions/empty.php',
    'ezcArchiveEntryPrefixException'      => 'Archive/exceptions/entry_prefix.php',
    'ezcArchiveInternalException'         => 'Archive/exceptions/internal_exception.php',
    'ezcArchiveIoException'               => 'Archive/exceptions/io.php',
    'ezcArchiveUnknownTypeException'      => 'Archive/exceptions/unknown_type.php',
    'ezcArchiveValueException'            => 'Archive/exceptions/value.php',
    'ezcArchive'                          => 'Archive/archive.php',
    'ezcArchiveV7Header'                  => 'Archive/tar/headers/v7.php',
    'ezcArchiveV7Tar'                     => 'Archive/tar/v7.php',
    'ezcArchiveFile'                      => 'Archive/file/file.php',
    'ezcArchiveLocalFileHeader'           => 'Archive/zip/headers/local_file.php',
    'ezcArchiveUstarHeader'               => 'Archive/tar/headers/ustar.php',
    'ezcArchiveUstarTar'                  => 'Archive/tar/ustar.php',
    'ezcArchiveBlockFile'                 => 'Archive/file/block_file.php',
    'ezcArchiveCallback'                  => 'Archive/interfaces/callback.php',
    'ezcArchiveCentralDirectoryEndHeader' => 'Archive/zip/headers/central_directory_end.php',
    'ezcArchiveCentralDirectoryHeader'    => 'Archive/zip/headers/central_directory.php',
    'ezcArchiveCharacterFile'             => 'Archive/file/character_file.php',
    'ezcArchiveChecksums'                 => 'Archive/utils/checksums.php',
    'ezcArchiveEntry'                     => 'Archive/entry.php',
    'ezcArchiveFileStructure'             => 'Archive/structs/file.php',
    'ezcArchiveFileType'                  => 'Archive/utils/file_type.php',
    'ezcArchiveGnuHeader'                 => 'Archive/tar/headers/gnu.php',
    'ezcArchiveGnuTar'                    => 'Archive/tar/gnu.php',
    'ezcArchiveOptions'                   => 'Archive/options/archive.php',
    'ezcArchivePaxHeader'                 => 'Archive/tar/headers/pax.php',
    'ezcArchivePaxTar'                    => 'Archive/tar/pax.php',
    'ezcArchiveStatMode'                  => 'Archive/utils/stat_mode.php',
    'ezcArchiveZip'                       => 'Archive/zip/zip.php',
);
?>
PKwa�\�%�NN#pear/ezc/autoload/base_autoload.phpnu�[���<?php
/**
 * Autoloader definition for the Base component.
 *
 * @copyright Copyright (C) 2005-2009 eZ Systems AS. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.8
 * @filesource
 * @package Base
 */

return array(
    'ezcBaseException'                            => 'Base/exceptions/exception.php',
    'ezcBaseFileException'                        => 'Base/exceptions/file_exception.php',
    'ezcBaseAutoloadException'                    => 'Base/exceptions/autoload.php',
    'ezcBaseDoubleClassRepositoryPrefixException' => 'Base/exceptions/double_class_repository_prefix.php',
    'ezcBaseExtensionNotFoundException'           => 'Base/exceptions/extension_not_found.php',
    'ezcBaseFileIoException'                      => 'Base/exceptions/file_io.php',
    'ezcBaseFileNotFoundException'                => 'Base/exceptions/file_not_found.php',
    'ezcBaseFilePermissionException'              => 'Base/exceptions/file_permission.php',
    'ezcBaseFunctionalityNotSupportedException'   => 'Base/exceptions/functionality_not_supported.php',
    'ezcBaseInitCallbackConfiguredException'      => 'Base/exceptions/init_callback_configured.php',
    'ezcBaseInitInvalidCallbackClassException'    => 'Base/exceptions/invalid_callback_class.php',
    'ezcBaseInvalidParentClassException'          => 'Base/exceptions/invalid_parent_class.php',
    'ezcBasePropertyNotFoundException'            => 'Base/exceptions/property_not_found.php',
    'ezcBasePropertyPermissionException'          => 'Base/exceptions/property_permission.php',
    'ezcBaseSettingNotFoundException'             => 'Base/exceptions/setting_not_found.php',
    'ezcBaseSettingValueException'                => 'Base/exceptions/setting_value.php',
    'ezcBaseValueException'                       => 'Base/exceptions/value.php',
    'ezcBaseWhateverException'                    => 'Base/exceptions/whatever.php',
    'ezcBaseOptions'                              => 'Base/options.php',
    'ezcBaseStruct'                               => 'Base/struct.php',
    'ezcBase'                                     => 'Base/base.php',
    'ezcBaseAutoloadOptions'                      => 'Base/options/autoload.php',
    'ezcBaseConfigurationInitializer'             => 'Base/interfaces/configuration_initializer.php',
    'ezcBaseExportable'                           => 'Base/interfaces/exportable.php',
    'ezcBaseFeatures'                             => 'Base/features.php',
    'ezcBaseFile'                                 => 'Base/file.php',
    'ezcBaseFileFindContext'                      => 'Base/structs/file_find_context.php',
    'ezcBaseInit'                                 => 'Base/init.php',
    'ezcBaseMetaData'                             => 'Base/metadata.php',
    'ezcBaseMetaDataPearReader'                   => 'Base/metadata/pear.php',
    'ezcBaseMetaDataTarballReader'                => 'Base/metadata/tarball.php',
    'ezcBasePersistable'                          => 'Base/interfaces/persistable.php',
    'ezcBaseRepositoryDirectory'                  => 'Base/structs/repository_directory.php',
);
?>
PKwa�\��
--#pear/ezc/autoload/file_autoload.phpnu�[���<?php
/**
 * Autoloader definition for the File component.
 *
 * @copyright Copyright (C) 2005-2007 eZ systems as. All rights reserved.
 * @license http://ez.no/licenses/new_bsd New BSD License
 * @version 1.2
 * @filesource
 * @package File
 */

return array(
    'ezcFile' => 'File/file.php',
);
?>
PKwa�\ǖ�o((pear/.channels/pear.php.net.regnu�[���a:5:{s:14:"suggestedalias";s:4:"pear";s:4:"name";s:12:"pear.php.net";s:7:"summary";s:40:"PHP Extension and Application Repository";s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:3:{i:0;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:25:"http://pear.php.net/rest/";}i:1;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.1";}s:8:"_content";s:25:"http://pear.php.net/rest/";}i:2;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.3";}s:8:"_content";s:25:"http://pear.php.net/rest/";}}}}}s:13:"_lastmodified";i:1747067530;}PKxa�\����++pear/.channels/pecl.php.net.regnu�[���a:6:{s:14:"suggestedalias";s:4:"pecl";s:4:"name";s:12:"pecl.php.net";s:7:"summary";s:31:"PHP Extension Community Library";s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:2:{i:0;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:25:"http://pecl.php.net/rest/";}i:1;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.1";}s:8:"_content";s:25:"http://pecl.php.net/rest/";}}}}}s:15:"validatepackage";a:2:{s:8:"_content";s:19:"PEAR_Validator_PECL";s:7:"attribs";a:1:{s:7:"version";s:3:"1.0";}}s:13:"_lastmodified";i:1747067530;}PKxa�\��oi��#pear/.channels/components.ez.no.regnu�[���a:7:{s:7:"attribs";a:4:{s:7:"version";s:3:"1.0";s:5:"xmlns";s:31:"http://pear.php.net/channel-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:75:"http://pear.php.net/dtd/channel-1.0 http://pear.php.net/dtd/channel-1.0.xsd";}s:4:"name";s:16:"components.ez.no";s:7:"summary";s:24:"eZ Enterprise components";s:14:"suggestedalias";s:3:"ezc";s:15:"validatepackage";a:2:{s:7:"attribs";a:1:{s:7:"version";s:3:"1.0";}s:8:"_content";s:19:"PEAR_Validator_PECL";}s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:24:"http://components.ez.no/";}}}}s:13:"_lastmodified";i:1709505579;}PKxa�\�$��pear/.channels/doc.php.net.regnu�[���a:5:{s:14:"suggestedalias";s:7:"phpdocs";s:4:"name";s:11:"doc.php.net";s:7:"summary";s:22:"PHP Documentation Team";s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:3:{i:0;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:24:"http://doc.php.net/rest/";}i:1;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.1";}s:8:"_content";s:24:"http://doc.php.net/rest/";}i:2;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.3";}s:8:"_content";s:24:"http://doc.php.net/rest/";}}}}}s:13:"_lastmodified";i:1747067530;}PKxa�\
~%��"pear/.channels/pear.phpunit.de.regnu�[���a:6:{s:7:"attribs";a:4:{s:7:"version";s:3:"1.0";s:5:"xmlns";s:31:"http://pear.php.net/channel-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:71:"http://pear.php.net/channel-1.0 http://pear.php.net/dtd/channel-1.0.xsd";}s:4:"name";s:15:"pear.phpunit.de";s:7:"summary";s:20:"PHPUnit PEAR Channel";s:14:"suggestedalias";s:7:"phpunit";s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:4:{i:0;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:28:"http://pear.phpunit.de/rest/";}i:1;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.1";}s:8:"_content";s:28:"http://pear.phpunit.de/rest/";}i:2;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.2";}s:8:"_content";s:28:"http://pear.phpunit.de/rest/";}i:3;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.3";}s:8:"_content";s:28:"http://pear.phpunit.de/rest/";}}}}}s:13:"_lastmodified";i:1709505579;}PKxa�\T�Y!pear/.channels/.alias/phpunit.txtnu�[���pear.phpunit.dePKya�\ui<�pear/.channels/.alias/pecl.txtnu�[���pecl.php.netPKya�\� ��pear/.channels/.alias/pear.txtnu�[���pear.php.netPKya�\�t�pear/.channels/.alias/ezc.txtnu�[���components.ez.noPKya�\\���"pear/.channels/.alias/symfony2.txtnu�[���pear.symfony.comPKya�\�o/�!pear/.channels/.alias/phpdocs.txtnu�[���doc.php.netPKya�\�A�4pear/.channels/__uri.regnu�[���a:4:{s:4:"name";s:5:"__uri";s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:4:"****";}}}}s:7:"summary";s:34:"Pseudo-channel for static packages";s:13:"_lastmodified";i:1747067530;}PKza�\�2�"��#pear/.channels/pear.symfony.com.regnu�[���a:6:{s:7:"attribs";a:4:{s:7:"version";s:3:"1.0";s:5:"xmlns";s:31:"http://pear.php.net/channel-1.0";s:9:"xmlns:xsi";s:41:"http://www.w3.org/2001/XMLSchema-instance";s:18:"xsi:schemaLocation";s:71:"http://pear.php.net/channel-1.0 http://pear.php.net/dtd/channel-1.0.xsd";}s:4:"name";s:16:"pear.symfony.com";s:7:"summary";s:21:"Symfony2 PEAR channel";s:14:"suggestedalias";s:8:"symfony2";s:7:"servers";a:1:{s:7:"primary";a:1:{s:4:"rest";a:1:{s:7:"baseurl";a:4:{i:0;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.0";}s:8:"_content";s:29:"http://pear.symfony.com/rest/";}i:1;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.1";}s:8:"_content";s:29:"http://pear.symfony.com/rest/";}i:2;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.2";}s:8:"_content";s:29:"http://pear.symfony.com/rest/";}i:3;a:2:{s:7:"attribs";a:1:{s:4:"type";s:7:"REST1.3";}s:8:"_content";s:29:"http://pear.symfony.com/rest/";}}}}}s:13:"_lastmodified";i:1709505579;}PKza�\��_�0�0pear/PEAR/Command.phpnu�[���<?php
/**
 * PEAR_Command, command pattern class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * Needed for error handling
 */
require_once 'PEAR.php';
require_once 'PEAR/Frontend.php';
require_once 'PEAR/XMLParser.php';

/**
 * List of commands and what classes they are implemented in.
 * @var array command => implementing class
 */
$GLOBALS['_PEAR_Command_commandlist'] = array();

/**
 * List of commands and their descriptions
 * @var array command => description
 */
$GLOBALS['_PEAR_Command_commanddesc'] = array();

/**
 * List of shortcuts to common commands.
 * @var array shortcut => command
 */
$GLOBALS['_PEAR_Command_shortcuts'] = array();

/**
 * Array of command objects
 * @var array class => object
 */
$GLOBALS['_PEAR_Command_objects'] = array();

/**
 * PEAR command class, a simple factory class for administrative
 * commands.
 *
 * How to implement command classes:
 *
 * - The class must be called PEAR_Command_Nnn, installed in the
 *   "PEAR/Common" subdir, with a method called getCommands() that
 *   returns an array of the commands implemented by the class (see
 *   PEAR/Command/Install.php for an example).
 *
 * - The class must implement a run() function that is called with three
 *   params:
 *
 *    (string) command name
 *    (array)  assoc array with options, freely defined by each
 *             command, for example:
 *             array('force' => true)
 *    (array)  list of the other parameters
 *
 *   The run() function returns a PEAR_CommandResponse object.  Use
 *   these methods to get information:
 *
 *    int getStatus()   Returns PEAR_COMMAND_(SUCCESS|FAILURE|PARTIAL)
 *                      *_PARTIAL means that you need to issue at least
 *                      one more command to complete the operation
 *                      (used for example for validation steps).
 *
 *    string getMessage()  Returns a message for the user.  Remember,
 *                         no HTML or other interface-specific markup.
 *
 *   If something unexpected happens, run() returns a PEAR error.
 *
 * - DON'T OUTPUT ANYTHING! Return text for output instead.
 *
 * - DON'T USE HTML! The text you return will be used from both Gtk,
 *   web and command-line interfaces, so for now, keep everything to
 *   plain text.
 *
 * - DON'T USE EXIT OR DIE! Always use pear errors.  From static
 *   classes do PEAR::raiseError(), from other classes do
 *   $this->raiseError().
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command
{
    // {{{ factory()

    /**
     * Get the right object for executing a command.
     *
     * @param string $command The name of the command
     * @param object $config  Instance of PEAR_Config object
     *
     * @return object the command object or a PEAR error
     */
    public static function &factory($command, &$config)
    {
        if (empty($GLOBALS['_PEAR_Command_commandlist'])) {
            PEAR_Command::registerCommands();
        }
        if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) {
            $command = $GLOBALS['_PEAR_Command_shortcuts'][$command];
        }
        if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) {
            $a = PEAR::raiseError("unknown command `$command'");
            return $a;
        }
        $class = $GLOBALS['_PEAR_Command_commandlist'][$command];
        if (!class_exists($class)) {
            require_once $GLOBALS['_PEAR_Command_objects'][$class];
        }
        if (!class_exists($class)) {
            $a = PEAR::raiseError("unknown command `$command'");
            return $a;
        }
        $ui =& PEAR_Command::getFrontendObject();
        $obj = new $class($ui, $config);
        return $obj;
    }

    // }}}
    // {{{ & getObject()
    public static function &getObject($command)
    {
        $class = $GLOBALS['_PEAR_Command_commandlist'][$command];
        if (!class_exists($class)) {
            require_once $GLOBALS['_PEAR_Command_objects'][$class];
        }
        if (!class_exists($class)) {
            return PEAR::raiseError("unknown command `$command'");
        }
        $ui =& PEAR_Command::getFrontendObject();
        $config = &PEAR_Config::singleton();
        $obj = new $class($ui, $config);
        return $obj;
    }

    // }}}
    // {{{ & getFrontendObject()

    /**
     * Get instance of frontend object.
     *
     * @return object|PEAR_Error
     */
    public static function &getFrontendObject()
    {
        $a = &PEAR_Frontend::singleton();
        return $a;
    }

    // }}}
    // {{{ & setFrontendClass()

    /**
     * Load current frontend class.
     *
     * @param string $uiclass Name of class implementing the frontend
     *
     * @return object the frontend object, or a PEAR error
     */
    public static function &setFrontendClass($uiclass)
    {
        $a = &PEAR_Frontend::setFrontendClass($uiclass);
        return $a;
    }

    // }}}
    // {{{ setFrontendType()

    /**
     * Set current frontend.
     *
     * @param string $uitype Name of the frontend type (for example "CLI")
     *
     * @return object the frontend object, or a PEAR error
     */
    public static function setFrontendType($uitype)
    {
        $uiclass = 'PEAR_Frontend_' . $uitype;
        return PEAR_Command::setFrontendClass($uiclass);
    }

    // }}}
    // {{{ registerCommands()

    /**
     * Scan through the Command directory looking for classes
     * and see what commands they implement.
     *
     * @param bool   (optional) if FALSE (default), the new list of
     *               commands should replace the current one.  If TRUE,
     *               new entries will be merged with old.
     *
     * @param string (optional) where (what directory) to look for
     *               classes, defaults to the Command subdirectory of
     *               the directory from where this file (__FILE__) is
     *               included.
     *
     * @return bool TRUE on success, a PEAR error on failure
     */
    public static function registerCommands($merge = false, $dir = null)
    {
        $parser = new PEAR_XMLParser;
        if ($dir === null) {
            $dir = dirname(__FILE__) . '/Command';
        }
        if (!is_dir($dir)) {
            return PEAR::raiseError("registerCommands: opendir($dir) '$dir' does not exist or is not a directory");
        }
        $dp = @opendir($dir);
        if (empty($dp)) {
            return PEAR::raiseError("registerCommands: opendir($dir) failed");
        }
        if (!$merge) {
            $GLOBALS['_PEAR_Command_commandlist'] = array();
        }

        while ($file = readdir($dp)) {
            if ($file[0] == '.' || substr($file, -4) != '.xml') {
                continue;
            }

            $f = substr($file, 0, -4);
            $class = "PEAR_Command_" . $f;
            // List of commands
            if (empty($GLOBALS['_PEAR_Command_objects'][$class])) {
                $GLOBALS['_PEAR_Command_objects'][$class] = "$dir/" . $f . '.php';
            }

            $parser->parse(file_get_contents("$dir/$file"));
            $implements = $parser->getData();
            foreach ($implements as $command => $desc) {
                if ($command == 'attribs') {
                    continue;
                }

                if (isset($GLOBALS['_PEAR_Command_commandlist'][$command])) {
                    return PEAR::raiseError('Command "' . $command . '" already registered in ' .
                        'class "' . $GLOBALS['_PEAR_Command_commandlist'][$command] . '"');
                }

                $GLOBALS['_PEAR_Command_commandlist'][$command] = $class;
                $GLOBALS['_PEAR_Command_commanddesc'][$command] = $desc['summary'];
                if (isset($desc['shortcut'])) {
                    $shortcut = $desc['shortcut'];
                    if (isset($GLOBALS['_PEAR_Command_shortcuts'][$shortcut])) {
                        return PEAR::raiseError('Command shortcut "' . $shortcut . '" already ' .
                            'registered to command "' . $command . '" in class "' .
                            $GLOBALS['_PEAR_Command_commandlist'][$command] . '"');
                    }
                    $GLOBALS['_PEAR_Command_shortcuts'][$shortcut] = $command;
                }

                if (isset($desc['options']) && $desc['options']) {
                    foreach ($desc['options'] as $oname => $option) {
                        if (isset($option['shortopt']) && strlen($option['shortopt']) > 1) {
                            return PEAR::raiseError('Option "' . $oname . '" short option "' .
                                $option['shortopt'] . '" must be ' .
                                'only 1 character in Command "' . $command . '" in class "' .
                                $class . '"');
                        }
                    }
                }
            }
        }

        ksort($GLOBALS['_PEAR_Command_shortcuts']);
        ksort($GLOBALS['_PEAR_Command_commandlist']);
        @closedir($dp);
        return true;
    }

    // }}}
    // {{{ getCommands()

    /**
     * Get the list of currently supported commands, and what
     * classes implement them.
     *
     * @return array command => implementing class
     */
    public static function getCommands()
    {
        if (empty($GLOBALS['_PEAR_Command_commandlist'])) {
            PEAR_Command::registerCommands();
        }
        return $GLOBALS['_PEAR_Command_commandlist'];
    }

    // }}}
    // {{{ getShortcuts()

    /**
     * Get the list of command shortcuts.
     *
     * @return array shortcut => command
     */
    public static function getShortcuts()
    {
        if (empty($GLOBALS['_PEAR_Command_shortcuts'])) {
            PEAR_Command::registerCommands();
        }
        return $GLOBALS['_PEAR_Command_shortcuts'];
    }

    // }}}
    // {{{ getGetoptArgs()

    /**
     * Compiles arguments for getopt.
     *
     * @param string $command     command to get optstring for
     * @param string $short_args  (reference) short getopt format
     * @param array  $long_args   (reference) long getopt format
     *
     * @return void
     */
    public static function getGetoptArgs($command, &$short_args, &$long_args)
    {
        if (empty($GLOBALS['_PEAR_Command_commandlist'])) {
            PEAR_Command::registerCommands();
        }
        if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) {
            $command = $GLOBALS['_PEAR_Command_shortcuts'][$command];
        }
        if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) {
            return null;
        }
        $obj = &PEAR_Command::getObject($command);
        return $obj->getGetoptArgs($command, $short_args, $long_args);
    }

    // }}}
    // {{{ getDescription()

    /**
     * Get description for a command.
     *
     * @param  string $command Name of the command
     *
     * @return string command description
     */
    public static function getDescription($command)
    {
        if (!isset($GLOBALS['_PEAR_Command_commanddesc'][$command])) {
            return null;
        }
        return $GLOBALS['_PEAR_Command_commanddesc'][$command];
    }

    // }}}
    // {{{ getHelp()

    /**
     * Get help for command.
     *
     * @param string $command Name of the command to return help for
     */
    public static function getHelp($command)
    {
        $cmds = PEAR_Command::getCommands();
        if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) {
            $command = $GLOBALS['_PEAR_Command_shortcuts'][$command];
        }
        if (isset($cmds[$command])) {
            $obj = &PEAR_Command::getObject($command);
            return $obj->getHelp($command);
        }
        return false;
    }
    // }}}
}PKza�\�`�eEAEApear/PEAR/REST.phpnu�[���<?php
/**
 * PEAR_REST
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * For downloading xml files
 */
require_once 'PEAR.php';
require_once 'PEAR/XMLParser.php';
require_once 'PEAR/Proxy.php';

/**
 * Intelligently retrieve data, following hyperlinks if necessary, and re-directing
 * as well
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_REST
{
    var $config;
    var $_options;

    function __construct(&$config, $options = array())
    {
        $this->config   = &$config;
        $this->_options = $options;
    }

    /**
     * Retrieve REST data, but always retrieve the local cache if it is available.
     *
     * This is useful for elements that should never change, such as information on a particular
     * release
     * @param string full URL to this resource
     * @param array|false contents of the accept-encoding header
     * @param boolean     if true, xml will be returned as a string, otherwise, xml will be
     *                    parsed using PEAR_XMLParser
     * @return string|array
     */
    function retrieveCacheFirst($url, $accept = false, $forcestring = false, $channel = false)
    {
        $cachefile = $this->config->get('cache_dir') . DIRECTORY_SEPARATOR .
            md5($url) . 'rest.cachefile';

        if (file_exists($cachefile)) {
            return unserialize(implode('', file($cachefile)));
        }

        return $this->retrieveData($url, $accept, $forcestring, $channel);
    }

    /**
     * Retrieve a remote REST resource
     * @param string full URL to this resource
     * @param array|false contents of the accept-encoding header
     * @param boolean     if true, xml will be returned as a string, otherwise, xml will be
     *                    parsed using PEAR_XMLParser
     * @return string|array
     */
    function retrieveData($url, $accept = false, $forcestring = false, $channel = false)
    {
        $cacheId = $this->getCacheId($url);
        if ($ret = $this->useLocalCache($url, $cacheId)) {
            return $ret;
        }

        $file = $trieddownload = false;
        if (!isset($this->_options['offline'])) {
            $trieddownload = true;
            $file = $this->downloadHttp($url, $cacheId ? $cacheId['lastChange'] : false, $accept, $channel);
        }

        if (PEAR::isError($file)) {
            if ($file->getCode() !== -9276) {
                return $file;
            }

            $trieddownload = false;
            $file = false; // use local copy if available on socket connect error
        }

        if (!$file) {
            $ret = $this->getCache($url);
            if (!PEAR::isError($ret) && $trieddownload) {
                // reset the age of the cache if the server says it was unmodified
                $result = $this->saveCache($url, $ret, null, true, $cacheId);
                if (PEAR::isError($result)) {
                    return PEAR::raiseError($result->getMessage());
                }
            }

            return $ret;
        }

        if (is_array($file)) {
            $headers      = $file[2];
            $lastmodified = $file[1];
            $content      = $file[0];
        } else {
            $headers      = array();
            $lastmodified = false;
            $content      = $file;
        }

        if ($forcestring) {
            $result = $this->saveCache($url, $content, $lastmodified, false, $cacheId);
            if (PEAR::isError($result)) {
                return PEAR::raiseError($result->getMessage());
            }

            return $content;
        }

        if (isset($headers['content-type'])) {
            $content_type = explode(";", $headers['content-type']);
            $content_type = $content_type[0];
            switch ($content_type) {
                case 'text/xml' :
                case 'application/xml' :
                case 'text/plain' :
                    if ($content_type === 'text/plain') {
                        $check = substr($content, 0, 5);
                        if ($check !== '<?xml') {
                            break;
                        }
                    }

                    $parser = new PEAR_XMLParser;
                    PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                    $err = $parser->parse($content);
                    PEAR::popErrorHandling();
                    if (PEAR::isError($err)) {
                        return PEAR::raiseError('Invalid xml downloaded from "' . $url . '": ' .
                            $err->getMessage());
                    }
                    $content = $parser->getData();
                case 'text/html' :
                default :
                    // use it as a string
            }
        } else {
            // assume XML
            $parser = new PEAR_XMLParser;
            $parser->parse($content);
            $content = $parser->getData();
        }

        $result = $this->saveCache($url, $content, $lastmodified, false, $cacheId);
        if (PEAR::isError($result)) {
            return PEAR::raiseError($result->getMessage());
        }

        return $content;
    }

    function useLocalCache($url, $cacheid = null)
    {
        if (!is_array($cacheid)) {
            $cacheid = $this->getCacheId($url);
        }

        $cachettl = $this->config->get('cache_ttl');
        // If cache is newer than $cachettl seconds, we use the cache!
        if (is_array($cacheid) && time() - $cacheid['age'] < $cachettl) {
            return $this->getCache($url);
        }

        return false;
    }

    /**
     * @param string $url
     *
     * @return bool|mixed
     */
    function getCacheId($url)
    {
        $cacheidfile = $this->config->get('cache_dir') . DIRECTORY_SEPARATOR .
            md5($url) . 'rest.cacheid';

        if (!file_exists($cacheidfile)) {
            return false;
        }

        $ret = unserialize(implode('', file($cacheidfile)));
        return $ret;
    }

    function getCache($url)
    {
        $cachefile = $this->config->get('cache_dir') . DIRECTORY_SEPARATOR .
            md5($url) . 'rest.cachefile';

        if (!file_exists($cachefile)) {
            return PEAR::raiseError('No cached content available for "' . $url . '"');
        }

        return unserialize(implode('', file($cachefile)));
    }

    /**
     * @param string full URL to REST resource
     * @param string original contents of the REST resource
     * @param array  HTTP Last-Modified and ETag headers
     * @param bool   if true, then the cache id file should be regenerated to
     *               trigger a new time-to-live value
     */
    function saveCache($url, $contents, $lastmodified, $nochange = false, $cacheid = null)
    {
        $cache_dir   = $this->config->get('cache_dir');
        $d           = $cache_dir . DIRECTORY_SEPARATOR . md5($url);
        $cacheidfile = $d . 'rest.cacheid';
        $cachefile   = $d . 'rest.cachefile';

        if (!is_dir($cache_dir)) {
            if (System::mkdir(array('-p', $cache_dir)) === false) {
              return PEAR::raiseError("The value of config option cache_dir ($cache_dir) is not a directory and attempts to create the directory failed.");
            }
        }

        if (!is_writeable($cache_dir)) {
            // If writing to the cache dir is not going to work, silently do nothing.
            // An ugly hack, but retains compat with PEAR 1.9.1 where many commands
            // work fine as non-root user (w/out write access to default cache dir).
            return true;
        }

        if ($cacheid === null && $nochange) {
            $cacheid = unserialize(implode('', file($cacheidfile)));
        }

        $idData = serialize(array(
            'age'        => time(),
            'lastChange' => ($nochange ? $cacheid['lastChange'] : $lastmodified),
        ));

        $result = $this->saveCacheFile($cacheidfile, $idData);
        if (PEAR::isError($result)) {
            return $result;
        } elseif ($nochange) {
            return true;
        }

        $result = $this->saveCacheFile($cachefile, serialize($contents));
        if (PEAR::isError($result)) {
            if (file_exists($cacheidfile)) {
              @unlink($cacheidfile);
            }

            return $result;
        }

        return true;
    }

    function saveCacheFile($file, $contents)
    {
        $len = strlen($contents);

        $cachefile_fp = @fopen($file, 'xb'); // x is the O_CREAT|O_EXCL mode
        if ($cachefile_fp !== false) { // create file
            if (fwrite($cachefile_fp, $contents, $len) < $len) {
                fclose($cachefile_fp);
                return PEAR::raiseError("Could not write $file.");
            }
        } else { // update file
            $cachefile_fp = @fopen($file, 'r+b'); // do not truncate file
            if (!$cachefile_fp) {
                return PEAR::raiseError("Could not open $file for writing.");
            }

            if (OS_WINDOWS) {
                $not_symlink     = !is_link($file); // see bug #18834
            } else {
                $cachefile_lstat = lstat($file);
                $cachefile_fstat = fstat($cachefile_fp);
                $not_symlink     = $cachefile_lstat['mode'] == $cachefile_fstat['mode']
                                   && $cachefile_lstat['ino']  == $cachefile_fstat['ino']
                                   && $cachefile_lstat['dev']  == $cachefile_fstat['dev']
                                   && $cachefile_fstat['nlink'] === 1;
            }

            if ($not_symlink) {
                ftruncate($cachefile_fp, 0); // NOW truncate
                if (fwrite($cachefile_fp, $contents, $len) < $len) {
                    fclose($cachefile_fp);
                    return PEAR::raiseError("Could not write $file.");
                }
            } else {
                fclose($cachefile_fp);
                $link = function_exists('readlink') ? readlink($file) : $file;
                return PEAR::raiseError('SECURITY ERROR: Will not write to ' . $file . ' as it is symlinked to ' . $link . ' - Possible symlink attack');
            }
        }

        fclose($cachefile_fp);
        return true;
    }

    /**
     * Efficiently Download a file through HTTP.  Returns downloaded file as a string in-memory
     * This is best used for small files
     *
     * If an HTTP proxy has been configured (http_proxy PEAR_Config
     * setting), the proxy will be used.
     *
     * @param string  $url       the URL to download
     * @param string  $save_dir  directory to save file in
     * @param false|string|array $lastmodified header values to check against for caching
     *                           use false to return the header values from this download
     * @param false|array $accept Accept headers to send
     * @return string|array  Returns the contents of the downloaded file or a PEAR
     *                       error on failure.  If the error is caused by
     *                       socket-related errors, the error object will
     *                       have the fsockopen error code available through
     *                       getCode().  If caching is requested, then return the header
     *                       values.
     *
     * @access public
     */
    function downloadHttp($url, $lastmodified = null, $accept = false, $channel = false)
    {
        static $redirect = 0;
        // always reset , so we are clean case of error
        $wasredirect = $redirect;
        $redirect = 0;

        $info = parse_url($url);
        if (!isset($info['scheme']) || !in_array($info['scheme'], array('http', 'https'))) {
            return PEAR::raiseError('Cannot download non-http URL "' . $url . '"');
        }

        if (!isset($info['host'])) {
            return PEAR::raiseError('Cannot download from non-URL "' . $url . '"');
        }

        $host   = isset($info['host']) ? $info['host'] : null;
        $port   = isset($info['port']) ? $info['port'] : null;
        $path   = isset($info['path']) ? $info['path'] : null;
        $schema = (isset($info['scheme']) && $info['scheme'] == 'https') ? 'https' : 'http';

        $proxy = new PEAR_Proxy($this->config);

        if (empty($port)) {
            $port = (isset($info['scheme']) && $info['scheme'] == 'https')  ? 443 : 80;
        }

        if ($proxy->isProxyConfigured() && $schema === 'http') {
            $request = "GET $url HTTP/1.1\r\n";
        } else {
            $request = "GET $path HTTP/1.1\r\n";
        }

        $request .= "Host: $host\r\n";
        $ifmodifiedsince = '';
        if (is_array($lastmodified)) {
            if (isset($lastmodified['Last-Modified'])) {
                $ifmodifiedsince = 'If-Modified-Since: ' . $lastmodified['Last-Modified'] . "\r\n";
            }

            if (isset($lastmodified['ETag'])) {
                $ifmodifiedsince .= "If-None-Match: $lastmodified[ETag]\r\n";
            }
        } else {
            $ifmodifiedsince = ($lastmodified ? "If-Modified-Since: $lastmodified\r\n" : '');
        }

        $request .= $ifmodifiedsince .
            "User-Agent: PEAR/1.10.16/PHP/" . PHP_VERSION . "\r\n";

        $username = $this->config->get('username', null, $channel);
        $password = $this->config->get('password', null, $channel);

        if ($username && $password) {
            $tmp = base64_encode("$username:$password");
            $request .= "Authorization: Basic $tmp\r\n";
        }

        $proxyAuth = $proxy->getProxyAuth();
        if ($proxyAuth) {
            $request .= 'Proxy-Authorization: Basic ' .
                $proxyAuth . "\r\n";
        }

        if ($accept) {
            $request .= 'Accept: ' . implode(', ', $accept) . "\r\n";
        }

        $request .= "Accept-Encoding:\r\n";
        $request .= "Connection: close\r\n";
        $request .= "\r\n";

        $secure = ($schema == 'https');
        $fp = $proxy->openSocket($host, $port, $secure);
        if (PEAR::isError($fp)) {
            return $fp;
        }

        fwrite($fp, $request);

        $headers = array();
        $reply   = 0;
        while ($line = trim(fgets($fp, 1024))) {
            if (preg_match('/^([^:]+):\s+(.*)\s*\\z/', $line, $matches)) {
                $headers[strtolower($matches[1])] = trim($matches[2]);
            } elseif (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) {
                $reply = (int)$matches[1];
                if ($reply == 304 && ($lastmodified || ($lastmodified === false))) {
                    return false;
                }

                if (!in_array($reply, array(200, 301, 302, 303, 305, 307))) {
                    return PEAR::raiseError("File $schema://$host:$port$path not valid (received: $line)");
                }
            }
        }

        if ($reply != 200) {
            if (!isset($headers['location'])) {
                return PEAR::raiseError("File $schema://$host:$port$path not valid (redirected but no location)");
            }

            if ($wasredirect > 4) {
                return PEAR::raiseError("File $schema://$host:$port$path not valid (redirection looped more than 5 times)");
            }

            $redirect = $wasredirect + 1;
            return $this->downloadHttp($headers['location'], $lastmodified, $accept, $channel);
        }

        $length = isset($headers['content-length']) ? $headers['content-length'] : -1;

        $data = '';
        while ($chunk = @fread($fp, 8192)) {
            $data .= $chunk;
        }
        fclose($fp);

        if ($lastmodified === false || $lastmodified) {
            if (isset($headers['etag'])) {
                $lastmodified = array('ETag' => $headers['etag']);
            }

            if (isset($headers['last-modified'])) {
                if (is_array($lastmodified)) {
                    $lastmodified['Last-Modified'] = $headers['last-modified'];
                } else {
                    $lastmodified = $headers['last-modified'];
                }
            }

            return array($data, $lastmodified, $headers);
        }

        return $data;
    }
}
PK{a�\(Pz���pear/PEAR/Proxy.phpnu�[���<?php
/**
 * PEAR_Proxy
 *
 * HTTP Proxy handling 
 *
 * @category   pear
 * @package    PEAR
 * @author     Nico Boehr 
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 */

class PEAR_Proxy
{
    var $config = null;

    /**
     * @access private
     */
    var $proxy_host;
    /**
     * @access private
     */
    var $proxy_port;
    /**
     * @access private
     */
    var $proxy_user;
    /**
     * @access private
     */
    var $proxy_pass;
    /**
     * @access private
     */
    var $proxy_schema;

    function __construct($config = null)
    {
        $this->config = $config;
        $this->_parseProxyInfo();
    }

    /**
     * @access private
     */
    function _parseProxyInfo()
    {
        $this->proxy_host = $this->proxy_port = $this->proxy_user = $this->proxy_pass = '';
        if ($this->config->get('http_proxy')&&
              $proxy = parse_url($this->config->get('http_proxy'))
        ) {
            $this->proxy_host = isset($proxy['host']) ? $proxy['host'] : null;

            $this->proxy_port   = isset($proxy['port']) ? $proxy['port'] : 8080;
            $this->proxy_user   = isset($proxy['user']) ? urldecode($proxy['user']) : null;
            $this->proxy_pass   = isset($proxy['pass']) ? urldecode($proxy['pass']) : null;
            $this->proxy_schema = (isset($proxy['scheme']) && $proxy['scheme'] == 'https') ? 'https' : 'http';
        }
    }

    /**
     * @access private
     */
    function _httpConnect($fp, $host, $port)
    {
        fwrite($fp, "CONNECT $host:$port HTTP/1.1\r\n");
        fwrite($fp, "Host: $host:$port\r\n");
        if ($this->getProxyAuth()) {
            fwrite($fp, 'Proxy-Authorization: Basic ' . $this->getProxyAuth() . "\r\n");
        }
        fwrite($fp, "\r\n");

        while ($line = trim(fgets($fp, 1024))) {
            if (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) {
                $code = (int)$matches[1];

                /* as per RFC 2817 */
                if ($code < 200 || $code >= 300) {
                    return PEAR::raiseError("Establishing a CONNECT tunnel through proxy failed with response code $code");
                }
            }
        }

        // connection was successful -- establish SSL through
        // the tunnel
        $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;

        if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
        }

        // set the correct hostname for working hostname
        // verification
        stream_context_set_option($fp, 'ssl', 'peer_name', $host);

        // blocking socket needed for
        // stream_socket_enable_crypto()
        // see
        // <http://php.net/manual/en/function.stream-socket-enable-crypto.php>
        stream_set_blocking ($fp, true);
        $crypto_res = stream_socket_enable_crypto($fp, true, $crypto_method);
        if (!$crypto_res) {
            return PEAR::raiseError("Could not establish SSL connection through proxy: $crypto_res");
        }

        return true;
    }

    /**
     * get the authorization information for the proxy, encoded to be
     * passed in the Proxy-Authentication HTTP header.
     * @return null|string the encoded authentication information if a
     *                     proxy and authentication is configured, null 
     *                     otherwise.
     */
    function getProxyAuth()
    {
        if ($this->isProxyConfigured() && $this->proxy_user != '') {
            return base64_encode($this->proxy_user . ':' . $this->proxy_pass);
        }
        return null;
    }

    function getProxyUser()
    {
        return $this->proxy_user;
    }

    /**
     * Check if we are configured to use a proxy.
     *
     * @return boolean true if we are configured to use a proxy, false
     *                 otherwise.
     * @access public
     */
    function isProxyConfigured()
    {
        return $this->proxy_host != '';
    }

    /**
     * Open a socket to a remote server, possibly involving a HTTP
     * proxy.
     *
     * If an HTTP proxy has been configured (http_proxy PEAR_Config
     * setting), the proxy will be used.
     *
     * @param string $host    the host to connect to
     * @param string $port    the port to connect to
     * @param boolean $secure if true, establish a secure connection
     *                        using TLS.
     * @access public
     */
    function openSocket($host, $port, $secure = false)
    {
        if ($this->isProxyConfigured()) {
            $fp = @fsockopen(
                $this->proxy_host, $this->proxy_port, 
                $errno, $errstr, 15
            );

            if (!$fp) {
                return PEAR::raiseError("Connection to the proxy failed: $errstr", -9276);
            }

            /* HTTPS is to be used and we have a proxy, use CONNECT verb */
            if ($secure) {
                $res = $this->_httpConnect($fp, $host, $port);

                if (PEAR::isError($res)) {
                    return $res;
                }
            }
        } else {
            if ($secure) {
                $host = 'ssl://' . $host;
            }

            $fp = @fsockopen($host, $port, $errno, $errstr);
            if (!$fp) {
                return PEAR::raiseError("Connection to `$host:$port' failed: $errstr", $errno);
            }
        }

        return $fp;
    }
}
PK{a�\�{�	�)�) pear/PEAR/Downloader/Package.phpnu�[���<?php
/**
 * PEAR_Downloader_Package
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Error code when parameter initialization fails because no releases
 * exist within preferred_state, but releases do exist
 */
define('PEAR_DOWNLOADER_PACKAGE_STATE', -1003);
/**
 * Error code when parameter initialization fails because no releases
 * exist that will work with the existing PHP version
 */
define('PEAR_DOWNLOADER_PACKAGE_PHPVERSION', -1004);

/**
 * Coordinates download parameters and manages their dependencies
 * prior to downloading them.
 *
 * Input can come from three sources:
 *
 * - local files (archives or package.xml)
 * - remote files (downloadable urls)
 * - abstract package names
 *
 * The first two elements are handled cleanly by PEAR_PackageFile, but the third requires
 * accessing pearweb's xml-rpc interface to determine necessary dependencies, and the
 * format returned of dependencies is slightly different from that used in package.xml.
 *
 * This class hides the differences between these elements, and makes automatic
 * dependency resolution a piece of cake.  It also manages conflicts when
 * two classes depend on incompatible dependencies, or differing versions of the same
 * package dependency.  In addition, download will not be attempted if the php version is
 * not supported, PEAR installer version is not supported, or non-PECL extensions are not
 * installed.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Downloader_Package
{
    /**
     * @var PEAR_Downloader
     */
    var $_downloader;
    /**
     * @var PEAR_Config
     */
    var $_config;
    /**
     * @var PEAR_Registry
     */
    var $_registry;
    /**
     * Used to implement packagingroot properly
     * @var PEAR_Registry
     */
    var $_installRegistry;
    /**
     * @var PEAR_PackageFile_v1|PEAR_PackageFile|v2
     */
    var $_packagefile;
    /**
     * @var array
     */
    var $_parsedname;
    /**
     * @var array
     */
    var $_downloadURL;
    /**
     * @var array
     */
    var $_downloadDeps = array();
    /**
     * @var boolean
     */
    var $_valid = false;
    /**
     * @var boolean
     */
    var $_analyzed = false;
    /**
     * if this or a parent package was invoked with Package-state, this is set to the
     * state variable.
     *
     * This allows temporary reassignment of preferred_state for a parent package and all of
     * its dependencies.
     * @var string|false
     */
    var $_explicitState = false;
    /**
     * If this package is invoked with Package#group, this variable will be true
     */
    var $_explicitGroup = false;
    /**
     * Package type local|url
     * @var string
     */
    var $_type;
    /**
     * Contents of package.xml, if downloaded from a remote channel
     * @var string|false
     * @access private
     */
    var $_rawpackagefile;
    /**
     * @var boolean
     * @access private
     */
    var $_validated = false;

    /**
     * @param PEAR_Downloader
     */
    function __construct(&$downloader)
    {
        $this->_downloader = &$downloader;
        $this->_config = &$this->_downloader->config;
        $this->_registry = &$this->_config->getRegistry();
        $options = $downloader->getOptions();
        if (isset($options['packagingroot'])) {
            $this->_config->setInstallRoot($options['packagingroot']);
            $this->_installRegistry = &$this->_config->getRegistry();
            $this->_config->setInstallRoot(false);
        } else {
            $this->_installRegistry = &$this->_registry;
        }
        $this->_valid = $this->_analyzed = false;
    }

    /**
     * Parse the input and determine whether this is a local file, a remote uri, or an
     * abstract package name.
     *
     * This is the heart of the PEAR_Downloader_Package(), and is used in
     * {@link PEAR_Downloader::download()}
     * @param string
     * @return bool|PEAR_Error
     */
    function initialize($param)
    {
        $origErr = $this->_fromFile($param);
        if ($this->_valid) {
            return true;
        }

        $options = $this->_downloader->getOptions();
        if (isset($options['offline'])) {
            if (PEAR::isError($origErr) && !isset($options['soft'])) {
                foreach ($origErr->getUserInfo() as $userInfo) {
                    if (isset($userInfo['message'])) {
                        $this->_downloader->log(0, $userInfo['message']);
                    }
                }

                $this->_downloader->log(0, $origErr->getMessage());
            }

            return PEAR::raiseError('Cannot download non-local package "' . $param . '"');
        }

        $err = $this->_fromUrl($param);
        if (PEAR::isError($err) || !$this->_valid) {
            if ($this->_type == 'url') {
                if (PEAR::isError($err) && !isset($options['soft'])) {
                    $this->_downloader->log(0, $err->getMessage());
                }

                return PEAR::raiseError("Invalid or missing remote package file");
            }

            $err = $this->_fromString($param);
            if (PEAR::isError($err) || !$this->_valid) {
                if (PEAR::isError($err) && $err->getCode() == PEAR_DOWNLOADER_PACKAGE_STATE) {
                    return false; // instruct the downloader to silently skip
                }

                if (isset($this->_type) && $this->_type == 'local' && PEAR::isError($origErr)) {
                    if (is_array($origErr->getUserInfo())) {
                        foreach ($origErr->getUserInfo() as $err) {
                            if (is_array($err)) {
                                $err = $err['message'];
                            }

                            if (!isset($options['soft'])) {
                                $this->_downloader->log(0, $err);
                            }
                        }
                    }

                    if (!isset($options['soft'])) {
                        $this->_downloader->log(0, $origErr->getMessage());
                    }

                    if (is_array($param)) {
                        $param = $this->_registry->parsedPackageNameToString($param, true);
                    }

                    if (!isset($options['soft'])) {
                        $this->_downloader->log(2, "Cannot initialize '$param', invalid or missing package file");
                    }

                    // Passing no message back - already logged above
                    return PEAR::raiseError();
                }

                if (PEAR::isError($err) && !isset($options['soft'])) {
                    $this->_downloader->log(0, $err->getMessage());
                }

                if (is_array($param)) {
                    $param = $this->_registry->parsedPackageNameToString($param, true);
                }

                if (!isset($options['soft'])) {
                    $this->_downloader->log(2, "Cannot initialize '$param', invalid or missing package file");
                }

                // Passing no message back - already logged above
                return PEAR::raiseError();
            }
        }

        return true;
    }

    /**
     * Retrieve any non-local packages
     * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2|PEAR_Error
     */
    function &download()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile;
        }

        if (isset($this->_downloadURL['url'])) {
            $this->_isvalid = false;
            $info = $this->getParsedPackage();
            foreach ($info as $i => $p) {
                $info[$i] = strtolower($p);
            }

            $err = $this->_fromUrl($this->_downloadURL['url'],
                $this->_registry->parsedPackageNameToString($this->_parsedname, true));
            $newinfo = $this->getParsedPackage();
            foreach ($newinfo as $i => $p) {
                $newinfo[$i] = strtolower($p);
            }

            if ($info != $newinfo) {
                do {
                    if ($info['channel'] == 'pecl.php.net' && $newinfo['channel'] == 'pear.php.net') {
                        $info['channel'] = 'pear.php.net';
                        if ($info == $newinfo) {
                            // skip the channel check if a pecl package says it's a PEAR package
                            break;
                        }
                    }
                    if ($info['channel'] == 'pear.php.net' && $newinfo['channel'] == 'pecl.php.net') {
                        $info['channel'] = 'pecl.php.net';
                        if ($info == $newinfo) {
                            // skip the channel check if a pecl package says it's a PEAR package
                            break;
                        }
                    }

                    return PEAR::raiseError('CRITICAL ERROR: We are ' .
                        $this->_registry->parsedPackageNameToString($info) . ', but the file ' .
                        'downloaded claims to be ' .
                        $this->_registry->parsedPackageNameToString($this->getParsedPackage()));
                } while (false);
            }

            if (PEAR::isError($err) || !$this->_valid) {
                return $err;
            }
        }

        $this->_type = 'local';
        return $this->_packagefile;
    }

    function &getPackageFile()
    {
        return $this->_packagefile;
    }

    function &getDownloader()
    {
        return $this->_downloader;
    }

    function getType()
    {
        return $this->_type;
    }

    /**
     * Like {@link initialize()}, but operates on a dependency
     */
    function fromDepURL($dep)
    {
        $this->_downloadURL = $dep;
        if (isset($dep['uri'])) {
            $options = $this->_downloader->getOptions();
            if (!extension_loaded("zlib") || isset($options['nocompress'])) {
                $ext = '.tar';
            } else {
                $ext = '.tgz';
            }

            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $err = $this->_fromUrl($dep['uri'] . $ext);
            PEAR::popErrorHandling();
            if (PEAR::isError($err)) {
                if (!isset($options['soft'])) {
                    $this->_downloader->log(0, $err->getMessage());
                }

                return PEAR::raiseError('Invalid uri dependency "' . $dep['uri'] . $ext . '", ' .
                    'cannot download');
            }
        } else {
            $this->_parsedname =
                array(
                    'package' => $dep['info']->getPackage(),
                    'channel' => $dep['info']->getChannel(),
                    'version' => $dep['version']
                );
            if (!isset($dep['nodefault'])) {
                $this->_parsedname['group'] = 'default'; // download the default dependency group
                $this->_explicitGroup = false;
            }

            $this->_rawpackagefile = $dep['raw'];
        }
    }

    function detectDependencies($params)
    {
        $options = $this->_downloader->getOptions();
        if (isset($options['downloadonly'])) {
            return;
        }

        if (isset($options['offline'])) {
            $this->_downloader->log(3, 'Skipping dependency download check, --offline specified');
            return;
        }

        $pname = $this->getParsedPackage();
        if (!$pname) {
            return;
        }

        $deps = $this->getDeps();
        if (!$deps) {
            return;
        }

        if (isset($deps['required'])) { // package.xml 2.0
            return $this->_detect2($deps, $pname, $options, $params);
        }

        return $this->_detect1($deps, $pname, $options, $params);
    }

    function setValidated()
    {
        $this->_validated = true;
    }

    function alreadyValidated()
    {
        return $this->_validated;
    }

    /**
     * Remove packages to be downloaded that are already installed
     * @param array of PEAR_Downloader_Package objects
     */
    public static function removeInstalled(&$params)
    {
        if (!isset($params[0])) {
            return;
        }

        $options = $params[0]->_downloader->getOptions();
        if (!isset($options['downloadonly'])) {
            foreach ($params as $i => $param) {
                $package = $param->getPackage();
                $channel = $param->getChannel();
                // remove self if already installed with this version
                // this does not need any pecl magic - we only remove exact matches
                if ($param->_installRegistry->packageExists($package, $channel)) {
                    $packageVersion = $param->_installRegistry->packageInfo($package, 'version', $channel);
                    if (version_compare($packageVersion, $param->getVersion(), '==')) {
                        if (!isset($options['force']) && !isset($options['packagingroot'])) {
                            $info = $param->getParsedPackage();
                            unset($info['version']);
                            unset($info['state']);
                            if (!isset($options['soft'])) {
                                $param->_downloader->log(1, 'Skipping package "' .
                                    $param->getShortName() .
                                    '", already installed as version ' . $packageVersion);
                            }
                            $params[$i] = false;
                        }
                    } elseif (!isset($options['force']) && !isset($options['upgrade']) &&
                          !isset($options['soft']) && !isset($options['packagingroot'])) {
                        $info = $param->getParsedPackage();
                        $param->_downloader->log(1, 'Skipping package "' .
                            $param->getShortName() .
                            '", already installed as version ' . $packageVersion);
                        $params[$i] = false;
                    }
                }
            }
        }

        PEAR_Downloader_Package::removeDuplicates($params);
    }

    function _detect2($deps, $pname, $options, $params)
    {
        $this->_downloadDeps = array();
        $groupnotfound = false;
        foreach (array('package', 'subpackage') as $packagetype) {
            // get required dependency group
            if (isset($deps['required'][$packagetype])) {
                if (isset($deps['required'][$packagetype][0])) {
                    foreach ($deps['required'][$packagetype] as $dep) {
                        if (isset($dep['conflicts'])) {
                            // skip any package that this package conflicts with
                            continue;
                        }
                        $ret = $this->_detect2Dep($dep, $pname, 'required', $params);
                        if (is_array($ret)) {
                            $this->_downloadDeps[] = $ret;
                        } elseif (PEAR::isError($ret) && !isset($options['soft'])) {
                            $this->_downloader->log(0, $ret->getMessage());
                        }
                    }
                } else {
                    $dep = $deps['required'][$packagetype];
                    if (!isset($dep['conflicts'])) {
                        // skip any package that this package conflicts with
                        $ret = $this->_detect2Dep($dep, $pname, 'required', $params);
                        if (is_array($ret)) {
                            $this->_downloadDeps[] = $ret;
                        } elseif (PEAR::isError($ret) && !isset($options['soft'])) {
                            $this->_downloader->log(0, $ret->getMessage());
                        }
                    }
                }
            }

            // get optional dependency group, if any
            if (isset($deps['optional'][$packagetype])) {
                $skipnames = array();
                if (!isset($deps['optional'][$packagetype][0])) {
                    $deps['optional'][$packagetype] = array($deps['optional'][$packagetype]);
                }

                foreach ($deps['optional'][$packagetype] as $dep) {
                    $skip = false;
                    if (!isset($options['alldeps'])) {
                        $dep['package'] = $dep['name'];
                        if (!isset($options['soft'])) {
                            $this->_downloader->log(3, 'Notice: package "' .
                              $this->_registry->parsedPackageNameToString($this->getParsedPackage(),
                                    true) . '" optional dependency "' .
                                $this->_registry->parsedPackageNameToString(array('package' =>
                                    $dep['name'], 'channel' => 'pear.php.net'), true) .
                                '" will not be automatically downloaded');
                        }
                        $skipnames[] = $this->_registry->parsedPackageNameToString($dep, true);
                        $skip = true;
                        unset($dep['package']);
                    }

                    $ret = $this->_detect2Dep($dep, $pname, 'optional', $params);
                    if (PEAR::isError($ret) && !isset($options['soft'])) {
                        $this->_downloader->log(0, $ret->getMessage());
                    }

                    if (!$ret) {
                        $dep['package'] = $dep['name'];
                        $skip = count($skipnames) ?
                            $skipnames[count($skipnames) - 1] : '';
                        if ($skip ==
                              $this->_registry->parsedPackageNameToString($dep, true)) {
                            array_pop($skipnames);
                        }
                    }

                    if (!$skip && is_array($ret)) {
                        $this->_downloadDeps[] = $ret;
                    }
                }

                if (count($skipnames)) {
                    if (!isset($options['soft'])) {
                        $this->_downloader->log(1, 'Did not download optional dependencies: ' .
                            implode(', ', $skipnames) .
                            ', use --alldeps to download automatically');
                    }
                }
            }

            // get requested dependency group, if any
            $groupname = $this->getGroup();
            $explicit  = $this->_explicitGroup;
            if (!$groupname) {
                if (!$this->canDefault()) {
                    continue;
                }

                $groupname = 'default'; // try the default dependency group
            }

            if ($groupnotfound) {
                continue;
            }

            if (isset($deps['group'])) {
                if (isset($deps['group']['attribs'])) {
                    if (strtolower($deps['group']['attribs']['name']) == strtolower($groupname)) {
                        $group = $deps['group'];
                    } elseif ($explicit) {
                        if (!isset($options['soft'])) {
                            $this->_downloader->log(0, 'Warning: package "' .
                                $this->_registry->parsedPackageNameToString($pname, true) .
                                '" has no dependency ' . 'group named "' . $groupname . '"');
                        }

                        $groupnotfound = true;
                        continue;
                    }
                } else {
                    $found = false;
                    foreach ($deps['group'] as $group) {
                        if (strtolower($group['attribs']['name']) == strtolower($groupname)) {
                            $found = true;
                            break;
                        }
                    }

                    if (!$found) {
                        if ($explicit) {
                            if (!isset($options['soft'])) {
                                $this->_downloader->log(0, 'Warning: package "' .
                                    $this->_registry->parsedPackageNameToString($pname, true) .
                                    '" has no dependency ' . 'group named "' . $groupname . '"');
                            }
                        }

                        $groupnotfound = true;
                        continue;
                    }
                }
            }

            if (isset($group) && isset($group[$packagetype])) {
                if (isset($group[$packagetype][0])) {
                    foreach ($group[$packagetype] as $dep) {
                        $ret = $this->_detect2Dep($dep, $pname, 'dependency group "' .
                            $group['attribs']['name'] . '"', $params);
                        if (is_array($ret)) {
                            $this->_downloadDeps[] = $ret;
                        } elseif (PEAR::isError($ret) && !isset($options['soft'])) {
                            $this->_downloader->log(0, $ret->getMessage());
                        }
                    }
                } else {
                    $ret = $this->_detect2Dep($group[$packagetype], $pname,
                        'dependency group "' .
                        $group['attribs']['name'] . '"', $params);
                    if (is_array($ret)) {
                        $this->_downloadDeps[] = $ret;
                    } elseif (PEAR::isError($ret) && !isset($options['soft'])) {
                        $this->_downloader->log(0, $ret->getMessage());
                    }
                }
            }
        }
    }

    function _detect2Dep($dep, $pname, $group, $params)
    {
        if (isset($dep['conflicts'])) {
            return true;
        }

        $options = $this->_downloader->getOptions();
        if (isset($dep['uri'])) {
            return array('uri' => $dep['uri'], 'dep' => $dep);;
        }

        $testdep = $dep;
        $testdep['package'] = $dep['name'];
        if (PEAR_Downloader_Package::willDownload($testdep, $params)) {
            $dep['package'] = $dep['name'];
            if (!isset($options['soft'])) {
                $this->_downloader->log(2, $this->getShortName() . ': Skipping ' . $group .
                    ' dependency "' .
                    $this->_registry->parsedPackageNameToString($dep, true) .
                    '", will be installed');
            }
            return false;
        }

        $options = $this->_downloader->getOptions();
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        if ($this->_explicitState) {
            $pname['state'] = $this->_explicitState;
        }

        $url = $this->_downloader->_getDepPackageDownloadUrl($dep, $pname);
        if (PEAR::isError($url)) {
            PEAR::popErrorHandling();
            return $url;
        }

        $dep['package'] = $dep['name'];
        $ret = $this->_analyzeDownloadURL($url, 'dependency', $dep, $params, $group == 'optional' &&
            !isset($options['alldeps']), true);
        PEAR::popErrorHandling();
        if (PEAR::isError($ret)) {
            if (!isset($options['soft'])) {
                $this->_downloader->log(0, $ret->getMessage());
            }

            return false;
        }

        // check to see if a dep is already installed and is the same or newer
        if (!isset($dep['min']) && !isset($dep['max']) && !isset($dep['recommended'])) {
            $oper = 'has';
        } else {
            $oper = 'gt';
        }

        // do not try to move this before getDepPackageDownloadURL
        // we can't determine whether upgrade is necessary until we know what
        // version would be downloaded
        if (!isset($options['force']) && $this->isInstalled($ret, $oper)) {
            $version = $this->_installRegistry->packageInfo($dep['name'], 'version', $dep['channel']);
            $dep['package'] = $dep['name'];
            if (!isset($options['soft'])) {
                $this->_downloader->log(3, $this->getShortName() . ': Skipping ' . $group .
                    ' dependency "' .
                $this->_registry->parsedPackageNameToString($dep, true) .
                    '" version ' . $url['version'] . ', already installed as version ' .
                    $version);
            }

            return false;
        }

        if (isset($dep['nodefault'])) {
            $ret['nodefault'] = true;
        }

        return $ret;
    }

    function _detect1($deps, $pname, $options, $params)
    {
        $this->_downloadDeps = array();
        $skipnames = array();
        foreach ($deps as $dep) {
            $nodownload = false;
            if (isset ($dep['type']) && $dep['type'] === 'pkg') {
                $dep['channel'] = 'pear.php.net';
                $dep['package'] = $dep['name'];
                switch ($dep['rel']) {
                    case 'not' :
                        continue 2;
                    case 'ge' :
                    case 'eq' :
                    case 'gt' :
                    case 'has' :
                        $group = (!isset($dep['optional']) || $dep['optional'] == 'no') ?
                            'required' :
                            'optional';
                        if (PEAR_Downloader_Package::willDownload($dep, $params)) {
                            $this->_downloader->log(2, $this->getShortName() . ': Skipping ' . $group
                                . ' dependency "' .
                                $this->_registry->parsedPackageNameToString($dep, true) .
                                '", will be installed');
                            continue 2;
                        }
                        $fakedp = new PEAR_PackageFile_v1;
                        $fakedp->setPackage($dep['name']);
                        // skip internet check if we are not upgrading (bug #5810)
                        if (!isset($options['upgrade']) && $this->isInstalled(
                              $fakedp, $dep['rel'])) {
                            $this->_downloader->log(2, $this->getShortName() . ': Skipping ' . $group
                                . ' dependency "' .
                                $this->_registry->parsedPackageNameToString($dep, true) .
                                '", is already installed');
                            continue 2;
                        }
                }

                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                if ($this->_explicitState) {
                    $pname['state'] = $this->_explicitState;
                }

                $url = $this->_downloader->_getDepPackageDownloadUrl($dep, $pname);
                $chan = 'pear.php.net';
                if (PEAR::isError($url)) {
                    // check to see if this is a pecl package that has jumped
                    // from pear.php.net to pecl.php.net channel
                    if (!class_exists('PEAR_Dependency2')) {
                        require_once 'PEAR/Dependency2.php';
                    }

                    $newdep = PEAR_Dependency2::normalizeDep($dep);
                    $newdep = $newdep[0];
                    $newdep['channel'] = 'pecl.php.net';
                    $chan = 'pecl.php.net';
                    $url = $this->_downloader->_getDepPackageDownloadUrl($newdep, $pname);
                    $obj = &$this->_installRegistry->getPackage($dep['name']);
                    if (PEAR::isError($url)) {
                        PEAR::popErrorHandling();
                        if ($obj !== null && $this->isInstalled($obj, $dep['rel'])) {
                            $group = (!isset($dep['optional']) || $dep['optional'] == 'no') ?
                                'required' :
                                'optional';
                            $dep['package'] = $dep['name'];
                            if (!isset($options['soft'])) {
                                $this->_downloader->log(3, $this->getShortName() .
                                    ': Skipping ' . $group . ' dependency "' .
                                    $this->_registry->parsedPackageNameToString($dep, true) .
                                    '", already installed as version ' . $obj->getVersion());
                            }
                            $skip = count($skipnames) ?
                                $skipnames[count($skipnames) - 1] : '';
                            if ($skip ==
                                  $this->_registry->parsedPackageNameToString($dep, true)) {
                                array_pop($skipnames);
                            }
                            continue;
                        } else {
                            if (isset($dep['optional']) && $dep['optional'] == 'yes') {
                                $this->_downloader->log(2, $this->getShortName() .
                                    ': Skipping optional dependency "' .
                                    $this->_registry->parsedPackageNameToString($dep, true) .
                                    '", no releases exist');
                                continue;
                            } else {
                                return $url;
                            }
                        }
                    }
                }

                PEAR::popErrorHandling();
                if (!isset($options['alldeps'])) {
                    if (isset($dep['optional']) && $dep['optional'] == 'yes') {
                        if (!isset($options['soft'])) {
                            $this->_downloader->log(3, 'Notice: package "' .
                                $this->getShortName() .
                                '" optional dependency "' .
                                $this->_registry->parsedPackageNameToString(
                                    array('channel' => $chan, 'package' =>
                                    $dep['name']), true) .
                                '" will not be automatically downloaded');
                        }
                        $skipnames[] = $this->_registry->parsedPackageNameToString(
                                array('channel' => $chan, 'package' =>
                                $dep['name']), true);
                        $nodownload = true;
                    }
                }

                if (!isset($options['alldeps']) && !isset($options['onlyreqdeps'])) {
                    if (!isset($dep['optional']) || $dep['optional'] == 'no') {
                        if (!isset($options['soft'])) {
                            $this->_downloader->log(3, 'Notice: package "' .
                                $this->getShortName() .
                                '" required dependency "' .
                                $this->_registry->parsedPackageNameToString(
                                    array('channel' => $chan, 'package' =>
                                    $dep['name']), true) .
                                '" will not be automatically downloaded');
                        }
                        $skipnames[] = $this->_registry->parsedPackageNameToString(
                                array('channel' => $chan, 'package' =>
                                $dep['name']), true);
                        $nodownload = true;
                    }
                }

                // check to see if a dep is already installed
                // do not try to move this before getDepPackageDownloadURL
                // we can't determine whether upgrade is necessary until we know what
                // version would be downloaded
                if (!isset($options['force']) && $this->isInstalled(
                        $url, $dep['rel'])) {
                    $group = (!isset($dep['optional']) || $dep['optional'] == 'no') ?
                        'required' :
                        'optional';
                    $dep['package'] = $dep['name'];
                    if (isset($newdep)) {
                        $version = $this->_installRegistry->packageInfo($newdep['name'], 'version', $newdep['channel']);
                    } else {
                        $version = $this->_installRegistry->packageInfo($dep['name'], 'version');
                    }

                    $dep['version'] = $url['version'];
                    if (!isset($options['soft'])) {
                        $this->_downloader->log(3, $this->getShortName() . ': Skipping ' . $group .
                            ' dependency "' .
                            $this->_registry->parsedPackageNameToString($dep, true) .
                            '", already installed as version ' . $version);
                    }

                    $skip = count($skipnames) ?
                        $skipnames[count($skipnames) - 1] : '';
                    if ($skip ==
                          $this->_registry->parsedPackageNameToString($dep, true)) {
                        array_pop($skipnames);
                    }

                    continue;
                }

                if ($nodownload) {
                    continue;
                }

                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                if (isset($newdep)) {
                    $dep = $newdep;
                }

                $dep['package'] = $dep['name'];
                $ret = $this->_analyzeDownloadURL($url, 'dependency', $dep, $params,
                    isset($dep['optional']) && $dep['optional'] == 'yes' &&
                    !isset($options['alldeps']), true);
                PEAR::popErrorHandling();
                if (PEAR::isError($ret)) {
                    if (!isset($options['soft'])) {
                        $this->_downloader->log(0, $ret->getMessage());
                    }
                    continue;
                }

                $this->_downloadDeps[] = $ret;
            }
        }

        if (count($skipnames)) {
            if (!isset($options['soft'])) {
                $this->_downloader->log(1, 'Did not download dependencies: ' .
                    implode(', ', $skipnames) .
                    ', use --alldeps or --onlyreqdeps to download automatically');
            }
        }
    }

    function setDownloadURL($pkg)
    {
        $this->_downloadURL = $pkg;
    }

    /**
     * Set the package.xml object for this downloaded package
     *
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2 $pkg
     */
    function setPackageFile(&$pkg)
    {
        $this->_packagefile = &$pkg;
    }

    function getShortName()
    {
        return $this->_registry->parsedPackageNameToString(array('channel' => $this->getChannel(),
            'package' => $this->getPackage()), true);
    }

    function getParsedPackage()
    {
        if (isset($this->_packagefile) || isset($this->_parsedname)) {
            return array('channel' => $this->getChannel(),
                'package' => $this->getPackage(),
                'version' => $this->getVersion());
        }

        return false;
    }

    function getDownloadURL()
    {
        return $this->_downloadURL;
    }

    function canDefault()
    {
        if (isset($this->_downloadURL) && isset($this->_downloadURL['nodefault'])) {
            return false;
        }

        return true;
    }

    function getPackage()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getPackage();
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->getPackage();
        }

        return false;
    }

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     */
    function isSubpackage(&$pf)
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->isSubpackage($pf);
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->isSubpackage($pf);
        }

        return false;
    }

    function getPackageType()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getPackageType();
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->getPackageType();
        }

        return false;
    }

    function isBundle()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getPackageType() == 'bundle';
        }

        return false;
    }

    function getPackageXmlVersion()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getPackagexmlVersion();
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->getPackagexmlVersion();
        }

        return '1.0';
    }

    function getChannel()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getChannel();
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->getChannel();
        }

        return false;
    }

    function getURI()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getURI();
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->getURI();
        }

        return false;
    }

    function getVersion()
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->getVersion();
        } elseif (isset($this->_downloadURL['version'])) {
            return $this->_downloadURL['version'];
        }

        return false;
    }

    function isCompatible($pf)
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->isCompatible($pf);
        } elseif (isset($this->_downloadURL['info'])) {
            return $this->_downloadURL['info']->isCompatible($pf);
        }

        return true;
    }

    function setGroup($group)
    {
        $this->_parsedname['group'] = $group;
    }

    function getGroup()
    {
        if (isset($this->_parsedname['group'])) {
            return $this->_parsedname['group'];
        }

        return '';
    }

    function isExtension($name)
    {
        if (isset($this->_packagefile)) {
            return $this->_packagefile->isExtension($name);
        } elseif (isset($this->_downloadURL['info'])) {
            if ($this->_downloadURL['info']->getPackagexmlVersion() == '2.0') {
                return $this->_downloadURL['info']->getProvidesExtension() == $name;
            }

            return false;
        }

        return false;
    }

    function getDeps()
    {
        if (isset($this->_packagefile)) {
            $ver = $this->_packagefile->getPackagexmlVersion();
            if (version_compare($ver, '2.0', '>=')) {
                return $this->_packagefile->getDeps(true);
            }

            return $this->_packagefile->getDeps();
        } elseif (isset($this->_downloadURL['info'])) {
            $ver = $this->_downloadURL['info']->getPackagexmlVersion();
            if (version_compare($ver, '2.0', '>=')) {
                return $this->_downloadURL['info']->getDeps(true);
            }

            return $this->_downloadURL['info']->getDeps();
        }

        return array();
    }

    /**
     * @param array Parsed array from {@link PEAR_Registry::parsePackageName()} or a dependency
     *                     returned from getDepDownloadURL()
     */
    function isEqual($param)
    {
        if (is_object($param)) {
            $channel = $param->getChannel();
            $package = $param->getPackage();
            if ($param->getURI()) {
                $param = array(
                    'channel' => $param->getChannel(),
                    'package' => $param->getPackage(),
                    'version' => $param->getVersion(),
                    'uri' => $param->getURI(),
                );
            } else {
                $param = array(
                    'channel' => $param->getChannel(),
                    'package' => $param->getPackage(),
                    'version' => $param->getVersion(),
                );
            }
        } else {
            if (isset($param['uri'])) {
                if ($this->getChannel() != '__uri') {
                    return false;
                }
                return $param['uri'] == $this->getURI();
            }

            $package = isset($param['package']) ? $param['package'] : $param['info']->getPackage();
            $channel = isset($param['channel']) ? $param['channel'] : $param['info']->getChannel();
            if (isset($param['rel'])) {
                if (!class_exists('PEAR_Dependency2')) {
                    require_once 'PEAR/Dependency2.php';
                }

                $newdep = PEAR_Dependency2::normalizeDep($param);
                $newdep = $newdep[0];
            } elseif (isset($param['min'])) {
                $newdep = $param;
            }
        }

        if (isset($newdep)) {
            if (!isset($newdep['min'])) {
                $newdep['min'] = '0';
            }

            if (!isset($newdep['max'])) {
                $newdep['max'] = '100000000000000000000';
            }

            // use magic to support pecl packages suddenly jumping to the pecl channel
            // we need to support both dependency possibilities
            if ($channel == 'pear.php.net' && $this->getChannel() == 'pecl.php.net') {
                if ($package == $this->getPackage()) {
                    $channel = 'pecl.php.net';
                }
            }
            if ($channel == 'pecl.php.net' && $this->getChannel() == 'pear.php.net') {
                if ($package == $this->getPackage()) {
                    $channel = 'pear.php.net';
                }
            }

            return (strtolower($package) == strtolower($this->getPackage()) &&
                $channel == $this->getChannel() &&
                version_compare($newdep['min'], $this->getVersion(), '<=') &&
                version_compare($newdep['max'], $this->getVersion(), '>='));
        }

        // use magic to support pecl packages suddenly jumping to the pecl channel
        if ($channel == 'pecl.php.net' && $this->getChannel() == 'pear.php.net') {
            if (strtolower($package) == strtolower($this->getPackage())) {
                $channel = 'pear.php.net';
            }
        }

        if (isset($param['version'])) {
            return (strtolower($package) == strtolower($this->getPackage()) &&
                $channel == $this->getChannel() &&
                $param['version'] == $this->getVersion());
        }

        return strtolower($package) == strtolower($this->getPackage()) &&
            $channel == $this->getChannel();
    }

    function isInstalled($dep, $oper = '==')
    {
        if (!$dep) {
            return false;
        }

        if ($oper != 'ge' && $oper != 'gt' && $oper != 'has' && $oper != '==') {
            return false;
        }

        if (is_object($dep)) {
            $package = $dep->getPackage();
            $channel = $dep->getChannel();
            if ($dep->getURI()) {
                $dep = array(
                    'uri' => $dep->getURI(),
                    'version' => $dep->getVersion(),
                );
            } else {
                $dep = array(
                    'version' => $dep->getVersion(),
                );
            }
        } else {
            if (isset($dep['uri'])) {
                $channel = '__uri';
                $package = $dep['dep']['name'];
            } else {
                $channel = $dep['info']->getChannel();
                $package = $dep['info']->getPackage();
            }
        }

        $options = $this->_downloader->getOptions();
        $test    = $this->_installRegistry->packageExists($package, $channel);
        if (!$test && $channel == 'pecl.php.net') {
            // do magic to allow upgrading from old pecl packages to new ones
            $test = $this->_installRegistry->packageExists($package, 'pear.php.net');
            $channel = 'pear.php.net';
        }

        if ($test) {
            if (isset($dep['uri'])) {
                if ($this->_installRegistry->packageInfo($package, 'uri', '__uri') == $dep['uri']) {
                    return true;
                }
            }

            if (isset($options['upgrade'])) {
                $packageVersion = $this->_installRegistry->packageInfo($package, 'version', $channel);
                if (version_compare($packageVersion, $dep['version'], '>=')) {
                    return true;
                }

                return false;
            }

            return true;
        }

        return false;
    }

    /**
     * Detect duplicate package names with differing versions
     *
     * If a user requests to install Date 1.4.6 and Date 1.4.7,
     * for instance, this is a logic error.  This method
     * detects this situation.
     *
     * @param array $params array of PEAR_Downloader_Package objects
     * @param array $errorparams empty array
     * @return array array of stupid duplicated packages in PEAR_Downloader_Package obejcts
     */
    public static function detectStupidDuplicates($params, &$errorparams)
    {
        $existing = array();
        foreach ($params as $i => $param) {
            $package = $param->getPackage();
            $channel = $param->getChannel();
            $group   = $param->getGroup();
            if (!isset($existing[$channel . '/' . $package])) {
                $existing[$channel . '/' . $package] = array();
            }

            if (!isset($existing[$channel . '/' . $package][$group])) {
                $existing[$channel . '/' . $package][$group] = array();
            }

            $existing[$channel . '/' . $package][$group][] = $i;
        }

        $indices = array();
        foreach ($existing as $package => $groups) {
            foreach ($groups as $group => $dupes) {
                if (count($dupes) > 1) {
                    $indices = $indices + $dupes;
                }
            }
        }

        $indices = array_unique($indices);
        foreach ($indices as $index) {
            $errorparams[] = $params[$index];
        }

        return count($errorparams);
    }

    /**
     * @param array
     * @param bool ignore install groups - for final removal of dupe packages
     */
    public static function removeDuplicates(&$params, $ignoreGroups = false)
    {
        $pnames = array();
        foreach ($params as $i => $param) {
            if (!$param) {
                continue;
            }

            if ($param->getPackage()) {
                $group = $ignoreGroups ? '' : $param->getGroup();
                $pnames[$i] = $param->getChannel() . '/' .
                    $param->getPackage() . '-' . $param->getVersion() . '#' . $group;
            }
        }

        $pnames = array_unique($pnames);
        $unset  = array_diff(array_keys($params), array_keys($pnames));
        $testp  = array_flip($pnames);
        foreach ($params as $i => $param) {
            if (!$param) {
                $unset[] = $i;
                continue;
            }

            if (!is_a($param, 'PEAR_Downloader_Package')) {
                $unset[] = $i;
                continue;
            }

            $group = $ignoreGroups ? '' : $param->getGroup();
            if (!isset($testp[$param->getChannel() . '/' . $param->getPackage() . '-' .
                  $param->getVersion() . '#' . $group])) {
                $unset[] = $i;
            }
        }

        foreach ($unset as $i) {
            unset($params[$i]);
        }

        $ret = array();
        foreach ($params as $i => $param) {
            $ret[] = &$params[$i];
        }

        $params = array();
        foreach ($ret as $i => $param) {
            $params[] = &$ret[$i];
        }
    }

    function explicitState()
    {
        return $this->_explicitState;
    }

    function setExplicitState($s)
    {
        $this->_explicitState = $s;
    }

    /**
     */
    public static function mergeDependencies(&$params)
    {
        $bundles = $newparams = array();
        foreach ($params as $i => $param) {
            if (!$param->isBundle()) {
                continue;
            }

            $bundles[] = $i;
            $pf = &$param->getPackageFile();
            $newdeps = array();
            $contents = $pf->getBundledPackages();
            if (!is_array($contents)) {
                $contents = array($contents);
            }

            foreach ($contents as $file) {
                $filecontents = $pf->getFileContents($file);
                $dl = &$param->getDownloader();
                $options = $dl->getOptions();
                if (PEAR::isError($dir = $dl->getDownloadDir())) {
                    return $dir;
                }

                $fp = @fopen($dir . DIRECTORY_SEPARATOR . $file, 'wb');
                if (!$fp) {
                    continue;
                }

                // FIXME do symlink check

                fwrite($fp, $filecontents, strlen($filecontents));
                fclose($fp);
                if ($s = $params[$i]->explicitState()) {
                    $obj->setExplicitState($s);
                }

                $obj = new PEAR_Downloader_Package($params[$i]->getDownloader());
                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                if (PEAR::isError($dir = $dl->getDownloadDir())) {
                    PEAR::popErrorHandling();
                    return $dir;
                }
                $a = $dir . DIRECTORY_SEPARATOR . $file;
                $e = $obj->_fromFile($a);
                PEAR::popErrorHandling();
                if (PEAR::isError($e)) {
                    if (!isset($options['soft'])) {
                        $dl->log(0, $e->getMessage());
                    }
                    continue;
                }

                if (!PEAR_Downloader_Package::willDownload($obj,
                      array_merge($params, $newparams)) && !$param->isInstalled($obj)) {
                    $newparams[] = $obj;
                }
            }
        }

        foreach ($bundles as $i) {
            unset($params[$i]); // remove bundles - only their contents matter for installation
        }

        PEAR_Downloader_Package::removeDuplicates($params); // strip any unset indices
        if (count($newparams)) { // add in bundled packages for install
            foreach ($newparams as $i => $unused) {
                $params[] = &$newparams[$i];
            }
            $newparams = array();
        }

        foreach ($params as $i => $param) {
            $newdeps = array();
            foreach ($param->_downloadDeps as $dep) {
                $merge = array_merge($params, $newparams);
                if (!PEAR_Downloader_Package::willDownload($dep, $merge)
                    && !$param->isInstalled($dep)
                ) {
                    $newdeps[] = $dep;
                } else {
                    //var_dump($dep);
                    // detect versioning conflicts here
                }
            }

            // convert the dependencies into PEAR_Downloader_Package objects for the next time around
            $params[$i]->_downloadDeps = array();
            foreach ($newdeps as $dep) {
                $obj = new PEAR_Downloader_Package($params[$i]->getDownloader());
                if ($s = $params[$i]->explicitState()) {
                    $obj->setExplicitState($s);
                }

                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                $e = $obj->fromDepURL($dep);
                PEAR::popErrorHandling();
                if (PEAR::isError($e)) {
                    if (!isset($options['soft'])) {
                        $obj->_downloader->log(0, $e->getMessage());
                    }
                    continue;
                }

                $e = $obj->detectDependencies($params);
                if (PEAR::isError($e)) {
                    if (!isset($options['soft'])) {
                        $obj->_downloader->log(0, $e->getMessage());
                    }
                }

                $newparams[] = $obj;
            }
        }

        if (count($newparams)) {
            foreach ($newparams as $i => $unused) {
                $params[] = &$newparams[$i];
            }
            return true;
        }

        return false;
    }


    /**
     */
    public static function willDownload($param, $params)
    {
        if (!is_array($params)) {
            return false;
        }

        foreach ($params as $obj) {
            if ($obj->isEqual($param)) {
                return true;
            }
        }

        return false;
    }

    /**
     * For simpler unit-testing
     * @param PEAR_Config
     * @param int
     * @param string
     */
    function &getPackagefileObject(&$c, $d)
    {
        $a = new PEAR_PackageFile($c, $d);
        return $a;
    }

    /**
     * This will retrieve from a local file if possible, and parse out
     * a group name as well.  The original parameter will be modified to reflect this.
     * @param string|array can be a parsed package name as well
     * @access private
     */
    function _fromFile(&$param)
    {
        $saveparam = $param;
        if (is_string($param) && substr($param, 0, 10) !== 'channel://') {
            if (!@file_exists($param)) {
                $test = explode('#', $param);
                $group = array_pop($test);
                if (@file_exists(implode('#', $test))) {
                    $this->setGroup($group);
                    $param = implode('#', $test);
                    $this->_explicitGroup = true;
                }
            }

            if (@is_file($param)) {
                $this->_type = 'local';
                $options = $this->_downloader->getOptions();
                $pkg = &$this->getPackagefileObject($this->_config, $this->_downloader->_debug);
                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                $pf = &$pkg->fromAnyFile($param, PEAR_VALIDATE_INSTALLING);
                PEAR::popErrorHandling();
                if (PEAR::isError($pf)) {
                    $this->_valid = false;
                    $param = $saveparam;
                    return $pf;
                }
                $this->_packagefile = &$pf;
                if (!$this->getGroup()) {
                    $this->setGroup('default'); // install the default dependency group
                }
                return $this->_valid = true;
            }
        }
        $param = $saveparam;
        return $this->_valid = false;
    }

    function _fromUrl($param, $saveparam = '')
    {
        if (!is_array($param) && (preg_match('#^(http|https|ftp)://#', $param))) {
            $options = $this->_downloader->getOptions();
            $this->_type = 'url';
            $callback = $this->_downloader->ui ?
                array(&$this->_downloader, '_downloadCallback') : null;
            $this->_downloader->pushErrorHandling(PEAR_ERROR_RETURN);
            if (PEAR::isError($dir = $this->_downloader->getDownloadDir())) {
                $this->_downloader->popErrorHandling();
                return $dir;
            }

            $this->_downloader->log(3, 'Downloading "' . $param . '"');
            $file = $this->_downloader->downloadHttp($param, $this->_downloader->ui,
                $dir, $callback, null, false, $this->getChannel());
            $this->_downloader->popErrorHandling();
            if (PEAR::isError($file)) {
                if (!empty($saveparam)) {
                    $saveparam = ", cannot download \"$saveparam\"";
                }
                $err = PEAR::raiseError('Could not download from "' . $param .
                    '"' . $saveparam . ' (' . $file->getMessage() . ')');
                    return $err;
            }

            if ($this->_rawpackagefile) {
                require_once 'Archive/Tar.php';
                $tar = new Archive_Tar($file);
                $packagexml = $tar->extractInString('package2.xml');
                if (!$packagexml) {
                    $packagexml = $tar->extractInString('package.xml');
                }

                if (str_replace(array("\n", "\r"), array('',''), $packagexml) !=
                      str_replace(array("\n", "\r"), array('',''), $this->_rawpackagefile)) {
                    if ($this->getChannel() != 'pear.php.net') {
                        return PEAR::raiseError('CRITICAL ERROR: package.xml downloaded does ' .
                            'not match value returned from xml-rpc');
                    }

                    // be more lax for the existing PEAR packages that have not-ok
                    // characters in their package.xml
                    $this->_downloader->log(0, 'CRITICAL WARNING: The "' .
                        $this->getPackage() . '" package has invalid characters in its ' .
                        'package.xml.  The next version of PEAR may not be able to install ' .
                        'this package for security reasons.  Please open a bug report at ' .
                        'http://pear.php.net/package/' . $this->getPackage() . '/bugs');
                }
            }

            // whew, download worked!
            $pkg = &$this->getPackagefileObject($this->_config, $this->_downloader->debug);

            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $pf = &$pkg->fromAnyFile($file, PEAR_VALIDATE_INSTALLING);
            PEAR::popErrorHandling();
            if (PEAR::isError($pf)) {
                if (is_array($pf->getUserInfo())) {
                    foreach ($pf->getUserInfo() as $err) {
                        if (is_array($err)) {
                            $err = $err['message'];
                        }

                        if (!isset($options['soft'])) {
                            $this->_downloader->log(0, "Validation Error: $err");
                        }
                    }
                }

                if (!isset($options['soft'])) {
                    $this->_downloader->log(0, $pf->getMessage());
                }

                ///FIXME need to pass back some error code that we can use to match with to cancel all further operations
                /// At least stop all deps of this package from being installed
                $out = $saveparam ? $saveparam : $param;
                $err = PEAR::raiseError('Download of "' . $out . '" succeeded, but it is not a valid package archive');
                $this->_valid = false;
                return $err;
            }

            $this->_packagefile = &$pf;
            $this->setGroup('default'); // install the default dependency group
            return $this->_valid = true;
        }

        return $this->_valid = false;
    }

    /**
     *
     * @param string|array pass in an array of format
     *                     array(
     *                      'package' => 'pname',
     *                     ['channel' => 'channame',]
     *                     ['version' => 'version',]
     *                     ['state' => 'state',])
     *                     or a string of format [channame/]pname[-version|-state]
     */
    function _fromString($param)
    {
        $options = $this->_downloader->getOptions();
        $channel = $this->_config->get('default_channel');
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $pname = $this->_registry->parsePackageName($param, $channel);
        PEAR::popErrorHandling();
        if (PEAR::isError($pname)) {
            if ($pname->getCode() == 'invalid') {
                $this->_valid = false;
                return false;
            }

            if ($pname->getCode() == 'channel') {
                $parsed = $pname->getUserInfo();
                if ($this->_downloader->discover($parsed['channel'])) {
                    if ($this->_config->get('auto_discover')) {
                        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                        $pname = $this->_registry->parsePackageName($param, $channel);
                        PEAR::popErrorHandling();
                    } else {
                        if (!isset($options['soft'])) {
                            $this->_downloader->log(0, 'Channel "' . $parsed['channel'] .
                                '" is not initialized, use ' .
                                '"pear channel-discover ' . $parsed['channel'] . '" to initialize' .
                                'or pear config-set auto_discover 1');
                        }
                    }
                }

                if (PEAR::isError($pname)) {
                    if (!isset($options['soft'])) {
                        $this->_downloader->log(0, $pname->getMessage());
                    }

                    if (is_array($param)) {
                        $param = $this->_registry->parsedPackageNameToString($param);
                    }

                    $err = PEAR::raiseError('invalid package name/package file "' . $param . '"');
                    $this->_valid = false;
                    return $err;
                }
            } else {
                if (!isset($options['soft'])) {
                    $this->_downloader->log(0, $pname->getMessage());
                }

                $err = PEAR::raiseError('invalid package name/package file "' . $param . '"');
                $this->_valid = false;
                return $err;
            }
        }

        if (!isset($this->_type)) {
            $this->_type = 'rest';
        }

        $this->_parsedname    = $pname;
        $this->_explicitState = isset($pname['state']) ? $pname['state'] : false;
        $this->_explicitGroup = isset($pname['group']) ? true : false;

        $info = $this->_downloader->_getPackageDownloadUrl($pname);
        if (PEAR::isError($info)) {
            if ($info->getCode() != -976 && $pname['channel'] == 'pear.php.net') {
                // try pecl
                $pname['channel'] = 'pecl.php.net';
                if ($test = $this->_downloader->_getPackageDownloadUrl($pname)) {
                    if (!PEAR::isError($test)) {
                        $info = PEAR::raiseError($info->getMessage() . ' - package ' .
                            $this->_registry->parsedPackageNameToString($pname, true) .
                            ' can be installed with "pecl install ' . $pname['package'] .
                            '"');
                    } else {
                        $pname['channel'] = 'pear.php.net';
                    }
                } else {
                    $pname['channel'] = 'pear.php.net';
                }
            }

            return $info;
        }

        $this->_rawpackagefile = $info['raw'];
        $ret = $this->_analyzeDownloadURL($info, $param, $pname);
        if (PEAR::isError($ret)) {
            return $ret;
        }

        if ($ret) {
            $this->_downloadURL = $ret;
            return $this->_valid = (bool) $ret;
        }
    }

    /**
     * @param array output of package.getDownloadURL
     * @param string|array|object information for detecting packages to be downloaded, and
     *                            for errors
     * @param array name information of the package
     * @param array|null packages to be downloaded
     * @param bool is this an optional dependency?
     * @param bool is this any kind of dependency?
     * @access private
     */
    function _analyzeDownloadURL($info, $param, $pname, $params = null, $optional = false,
                                 $isdependency = false)
    {
        if (!is_string($param) && PEAR_Downloader_Package::willDownload($param, $params)) {
            return false;
        }

        if ($info === false) {
            $saveparam = !is_string($param) ? ", cannot download \"$param\"" : '';

            // no releases exist
            return PEAR::raiseError('No releases for package "' .
                $this->_registry->parsedPackageNameToString($pname, true) . '" exist' . $saveparam);
        }

        if (strtolower($info['info']->getChannel()) != strtolower($pname['channel'])) {
            $err = false;
            if ($pname['channel'] == 'pecl.php.net') {
                if ($info['info']->getChannel() != 'pear.php.net') {
                    $err = true;
                }
            } elseif ($info['info']->getChannel() == 'pecl.php.net') {
                if ($pname['channel'] != 'pear.php.net') {
                    $err = true;
                }
            } else {
                $err = true;
            }

            if ($err) {
                return PEAR::raiseError('SECURITY ERROR: package in channel "' . $pname['channel'] .
                    '" retrieved another channel\'s name for download! ("' .
                    $info['info']->getChannel() . '")');
            }
        }

        $preferred_state = $this->_config->get('preferred_state');
        if (!isset($info['url'])) {
            $package_version = $this->_registry->packageInfo($info['info']->getPackage(),
            'version', $info['info']->getChannel());
            if ($this->isInstalled($info)) {
                if ($isdependency && version_compare($info['version'], $package_version, '<=')) {
                    // ignore bogus errors of "failed to download dependency"
                    // if it is already installed and the one that would be
                    // downloaded is older or the same version (Bug #7219)
                    return false;
                }
            }

            if ($info['version'] === $package_version) {
                if (!isset($options['soft'])) {
                    $this->_downloader->log(1, 'WARNING: failed to download ' . $pname['channel'] .
                        '/' . $pname['package'] . '-' . $package_version. ', additionally the suggested version' .
                        ' (' . $package_version . ') is the same as the locally installed one.');
                }

                return false;
            }

            if (version_compare($info['version'], $package_version, '<=')) {
                if (!isset($options['soft'])) {
                    $this->_downloader->log(1, 'WARNING: failed to download ' . $pname['channel'] .
                        '/' . $pname['package'] . '-' . $package_version . ', additionally the suggested version' .
                        ' (' . $info['version'] . ') is a lower version than the locally installed one (' . $package_version . ').');
                }

                return false;
            }

            $instead =  ', will instead download version ' . $info['version'] .
                        ', stability "' . $info['info']->getState() . '"';
            // releases exist, but we failed to get any
            if (isset($this->_downloader->_options['force'])) {
                if (isset($pname['version'])) {
                    $vs = ', version "' . $pname['version'] . '"';
                } elseif (isset($pname['state'])) {
                    $vs = ', stability "' . $pname['state'] . '"';
                } elseif ($param == 'dependency') {
                    if (!class_exists('PEAR_Common')) {
                        require_once 'PEAR/Common.php';
                    }

                    if (!in_array($info['info']->getState(),
                          PEAR_Common::betterStates($preferred_state, true))) {
                        if ($optional) {
                            // don't spit out confusing error message
                            return $this->_downloader->_getPackageDownloadUrl(
                                array('package' => $pname['package'],
                                      'channel' => $pname['channel'],
                                      'version' => $info['version']));
                        }
                        $vs = ' within preferred state "' . $preferred_state .
                            '"';
                    } else {
                        if (!class_exists('PEAR_Dependency2')) {
                            require_once 'PEAR/Dependency2.php';
                        }

                        if ($optional) {
                            // don't spit out confusing error message
                            return $this->_downloader->_getPackageDownloadUrl(
                                array('package' => $pname['package'],
                                      'channel' => $pname['channel'],
                                      'version' => $info['version']));
                        }
                        $vs = PEAR_Dependency2::_getExtraString($pname);
                        $instead = '';
                    }
                } else {
                    $vs = ' within preferred state "' . $preferred_state . '"';
                }

                if (!isset($options['soft'])) {
                    $this->_downloader->log(1, 'WARNING: failed to download ' . $pname['channel'] .
                        '/' . $pname['package'] . $vs . $instead);
                }

                // download the latest release
                return $this->_downloader->_getPackageDownloadUrl(
                    array('package' => $pname['package'],
                          'channel' => $pname['channel'],
                          'version' => $info['version']));
            } else {
                if (isset($info['php']) && $info['php']) {
                    $err = PEAR::raiseError('Failed to download ' .
                        $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'],
                                  'package' => $pname['package']),
                                true) .
                        ', latest release is version ' . $info['php']['v'] .
                        ', but it requires PHP version "' .
                        $info['php']['m'] . '", use "' .
                        $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'], 'package' => $pname['package'],
                            'version' => $info['php']['v'])) . '" to install',
                            PEAR_DOWNLOADER_PACKAGE_PHPVERSION);
                    return $err;
                }

                // construct helpful error message
                if (isset($pname['version'])) {
                    $vs = ', version "' . $pname['version'] . '"';
                } elseif (isset($pname['state'])) {
                    $vs = ', stability "' . $pname['state'] . '"';
                } elseif ($param == 'dependency') {
                    if (!class_exists('PEAR_Common')) {
                        require_once 'PEAR/Common.php';
                    }

                    if (!in_array($info['info']->getState(),
                          PEAR_Common::betterStates($preferred_state, true))) {
                        if ($optional) {
                            // don't spit out confusing error message, and don't die on
                            // optional dep failure!
                            return $this->_downloader->_getPackageDownloadUrl(
                                array('package' => $pname['package'],
                                      'channel' => $pname['channel'],
                                      'version' => $info['version']));
                        }
                        $vs = ' within preferred state "' . $preferred_state . '"';
                    } else {
                        if (!class_exists('PEAR_Dependency2')) {
                            require_once 'PEAR/Dependency2.php';
                        }

                        if ($optional) {
                            // don't spit out confusing error message, and don't die on
                            // optional dep failure!
                            return $this->_downloader->_getPackageDownloadUrl(
                                array('package' => $pname['package'],
                                      'channel' => $pname['channel'],
                                      'version' => $info['version']));
                        }
                        $vs = PEAR_Dependency2::_getExtraString($pname);
                    }
                } else {
                    $vs = ' within preferred state "' . $this->_downloader->config->get('preferred_state') . '"';
                }

                $options = $this->_downloader->getOptions();
                // this is only set by the "download-all" command
                if (isset($options['ignorepreferred_state'])) {
                    $err = PEAR::raiseError(
                        'Failed to download ' . $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'], 'package' => $pname['package']),
                                true)
                         . $vs .
                        ', latest release is version ' . $info['version'] .
                        ', stability "' . $info['info']->getState() . '", use "' .
                        $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'], 'package' => $pname['package'],
                            'version' => $info['version'])) . '" to install',
                            PEAR_DOWNLOADER_PACKAGE_STATE);
                    return $err;
                }

                // Checks if the user has a package installed already and checks the release against
                // the state against the installed package, this allows upgrades for packages
                // with lower stability than the preferred_state
                $stability = $this->_registry->packageInfo($pname['package'], 'stability', $pname['channel']);
                if (!$this->isInstalled($info)
                    || !in_array($info['info']->getState(), PEAR_Common::betterStates($stability['release'], true))
                ) {
                    $err = PEAR::raiseError(
                        'Failed to download ' . $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'], 'package' => $pname['package']),
                                true)
                         . $vs .
                        ', latest release is version ' . $info['version'] .
                        ', stability "' . $info['info']->getState() . '", use "' .
                        $this->_registry->parsedPackageNameToString(
                            array('channel' => $pname['channel'], 'package' => $pname['package'],
                            'version' => $info['version'])) . '" to install');
                    return $err;
                }
            }
        }

        if (isset($info['deprecated']) && $info['deprecated']) {
            $this->_downloader->log(0,
                'WARNING: "' .
                    $this->_registry->parsedPackageNameToString(
                            array('channel' => $info['info']->getChannel(),
                                  'package' => $info['info']->getPackage()), true) .
                '" is deprecated in favor of "' .
                    $this->_registry->parsedPackageNameToString($info['deprecated'], true) .
                '"');
        }

        return $info;
    }
}
PK{a�\��gk�U�Upear/PEAR/Validate.phpnu�[���<?php
/**
 * PEAR_Validate
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**#@+
 * Constants for install stage
 */
define('PEAR_VALIDATE_INSTALLING', 1);
define('PEAR_VALIDATE_UNINSTALLING', 2); // this is not bit-mapped like the others
define('PEAR_VALIDATE_NORMAL', 3);
define('PEAR_VALIDATE_DOWNLOADING', 4); // this is not bit-mapped like the others
define('PEAR_VALIDATE_PACKAGING', 7);
/**#@-*/
require_once 'PEAR/Common.php';
require_once 'PEAR/Validator/PECL.php';

/**
 * Validation class for package.xml - channel-level advanced validation
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Validate
{
    var $packageregex = _PEAR_COMMON_PACKAGE_NAME_PREG;
    /**
     * @var PEAR_PackageFile_v1|PEAR_PackageFile_v2
     */
    var $_packagexml;
    /**
     * @var int one of the PEAR_VALIDATE_* constants
     */
    var $_state = PEAR_VALIDATE_NORMAL;
    /**
     * Format: ('error' => array('field' => name, 'reason' => reason), 'warning' => same)
     * @var array
     * @access private
     */
    var $_failures = array('error' => array(), 'warning' => array());

    /**
     * Override this method to handle validation of normal package names
     * @param string
     * @return bool
     * @access protected
     */
    function _validPackageName($name)
    {
        return (bool) preg_match('/^' . $this->packageregex . '\\z/', $name);
    }

    /**
     * @param string package name to validate
     * @param string name of channel-specific validation package
     * @final
     */
    function validPackageName($name, $validatepackagename = false)
    {
        if ($validatepackagename) {
            if (strtolower($name) == strtolower($validatepackagename)) {
                return (bool) preg_match('/^[a-zA-Z0-9_]+(?:\.[a-zA-Z0-9_]+)*\\z/', $name);
            }
        }
        return $this->_validPackageName($name);
    }

    /**
     * This validates a bundle name, and bundle names must conform
     * to the PEAR naming convention, so the method is final and static.
     * @param string
     * @final
     */
    public static function validGroupName($name)
    {
        return (bool) preg_match('/^' . _PEAR_COMMON_PACKAGE_NAME_PREG . '\\z/', $name);
    }

    /**
     * Determine whether $state represents a valid stability level
     * @param string
     * @return bool
     * @final
     */
    public static function validState($state)
    {
        return in_array($state, array('snapshot', 'devel', 'alpha', 'beta', 'stable'));
    }

    /**
     * Get a list of valid stability levels
     * @return array
     * @final
     */
    public static function getValidStates()
    {
        return array('snapshot', 'devel', 'alpha', 'beta', 'stable');
    }

    /**
     * Determine whether a version is a properly formatted version number that can be used
     * by version_compare
     * @param string
     * @return bool
     * @final
     */
    public static function validVersion($ver)
    {
        return (bool) preg_match(PEAR_COMMON_PACKAGE_VERSION_PREG, $ver);
    }

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     */
    function setPackageFile(&$pf)
    {
        $this->_packagexml = &$pf;
    }

    /**
     * @access private
     */
    function _addFailure($field, $reason)
    {
        $this->_failures['errors'][] = array('field' => $field, 'reason' => $reason);
    }

    /**
     * @access private
     */
    function _addWarning($field, $reason)
    {
        $this->_failures['warnings'][] = array('field' => $field, 'reason' => $reason);
    }

    function getFailures()
    {
        $failures = $this->_failures;
        $this->_failures = array('warnings' => array(), 'errors' => array());
        return $failures;
    }

    /**
     * @param int one of the PEAR_VALIDATE_* constants
     */
    function validate($state = null)
    {
        if (!isset($this->_packagexml)) {
            return false;
        }
        if ($state !== null) {
            $this->_state = $state;
        }
        $this->_failures = array('warnings' => array(), 'errors' => array());
        $this->validatePackageName();
        $this->validateVersion();
        $this->validateMaintainers();
        $this->validateDate();
        $this->validateSummary();
        $this->validateDescription();
        $this->validateLicense();
        $this->validateNotes();
        if ($this->_packagexml->getPackagexmlVersion() == '1.0') {
            $this->validateState();
            $this->validateFilelist();
        } elseif ($this->_packagexml->getPackagexmlVersion() == '2.0' ||
                  $this->_packagexml->getPackagexmlVersion() == '2.1') {
            $this->validateTime();
            $this->validateStability();
            $this->validateDeps();
            $this->validateMainFilelist();
            $this->validateReleaseFilelist();
            //$this->validateGlobalTasks();
            $this->validateChangelog();
        }
        return !((bool) count($this->_failures['errors']));
    }

    /**
     * @access protected
     */
    function validatePackageName()
    {
        if ($this->_state == PEAR_VALIDATE_PACKAGING ||
              $this->_state == PEAR_VALIDATE_NORMAL) {
            if (($this->_packagexml->getPackagexmlVersion() == '2.0' ||
                 $this->_packagexml->getPackagexmlVersion() == '2.1') &&
                  $this->_packagexml->getExtends()) {
                $version = $this->_packagexml->getVersion() . '';
                $name = $this->_packagexml->getPackage();
                $a = explode('.', $version);
                $test = array_shift($a);
                if ($test == '0') {
                    return true;
                }
                $vlen = strlen($test);
                $majver = substr($name, strlen($name) - $vlen);
                while ($majver && !is_numeric($majver[0])) {
                    $majver = substr($majver, 1);
                }
                if ($majver != $test) {
                    $this->_addWarning('package', "package $name extends package " .
                        $this->_packagexml->getExtends() . ' and so the name should ' .
                        'have a postfix equal to the major version like "' .
                        $this->_packagexml->getExtends() . $test . '"');
                    return true;
                } elseif (substr($name, 0, strlen($name) - $vlen) !=
                            $this->_packagexml->getExtends()) {
                    $this->_addWarning('package', "package $name extends package " .
                        $this->_packagexml->getExtends() . ' and so the name must ' .
                        'be an extension like "' . $this->_packagexml->getExtends() .
                        $test . '"');
                    return true;
                }
            }
        }
        if (!$this->validPackageName($this->_packagexml->getPackage())) {
            $this->_addFailure('name', 'package name "' .
                $this->_packagexml->getPackage() . '" is invalid');
            return false;
        }
    }

    /**
     * @access protected
     */
    function validateVersion()
    {
        if ($this->_state != PEAR_VALIDATE_PACKAGING) {
            if (!$this->validVersion($this->_packagexml->getVersion())) {
                $this->_addFailure('version',
                    'Invalid version number "' . $this->_packagexml->getVersion() . '"');
            }
            return false;
        }
        $version = $this->_packagexml->getVersion();
        $versioncomponents = explode('.', $version);
        if (count($versioncomponents) != 3) {
            $this->_addWarning('version',
                'A version number should have 3 decimals (x.y.z)');
            return true;
        }
        $name = $this->_packagexml->getPackage();
        // version must be based upon state
        switch ($this->_packagexml->getState()) {
            case 'snapshot' :
                return true;
            case 'devel' :
                if ($versioncomponents[0] . 'a' == '0a') {
                    return true;
                }
                if ($versioncomponents[0] == 0) {
                    $versioncomponents[0] = '0';
                    $this->_addWarning('version',
                        'version "' . $version . '" should be "' .
                        implode('.' ,$versioncomponents) . '"');
                } else {
                    $this->_addWarning('version',
                        'packages with devel stability must be < version 1.0.0');
                }
                return true;
            break;
            case 'alpha' :
            case 'beta' :
                // check for a package that extends a package,
                // like Foo and Foo2
                if ($this->_state == PEAR_VALIDATE_PACKAGING) {
                    if (substr($versioncomponents[2], 1, 2) == 'rc') {
                        $this->_addFailure('version', 'Release Candidate versions ' .
                            'must have capital RC, not lower-case rc');
                        return false;
                    }
                }
                if (!$this->_packagexml->getExtends()) {
                    if ($versioncomponents[0] == '1') {
                        if ($versioncomponents[2][0] == '0') {
                            if ($versioncomponents[2] == '0') {
                                // version 1.*.0000
                                $this->_addWarning('version',
                                    'version 1.' . $versioncomponents[1] .
                                        '.0 probably should not be alpha or beta');
                                return true;
                            } elseif (strlen($versioncomponents[2]) > 1) {
                                // version 1.*.0RC1 or 1.*.0beta24 etc.
                                return true;
                            } else {
                                // version 1.*.0
                                $this->_addWarning('version',
                                    'version 1.' . $versioncomponents[1] .
                                        '.0 probably should not be alpha or beta');
                                return true;
                            }
                        } else {
                            $this->_addWarning('version',
                                'bugfix versions (1.3.x where x > 0) probably should ' .
                                'not be alpha or beta');
                            return true;
                        }
                    } elseif ($versioncomponents[0] != '0') {
                        $this->_addWarning('version',
                            'major versions greater than 1 are not allowed for packages ' .
                            'without an <extends> tag or an identical postfix (foo2 v2.0.0)');
                        return true;
                    }
                    if ($versioncomponents[0] . 'a' == '0a') {
                        return true;
                    }
                    if ($versioncomponents[0] == 0) {
                        $versioncomponents[0] = '0';
                        $this->_addWarning('version',
                            'version "' . $version . '" should be "' .
                            implode('.' ,$versioncomponents) . '"');
                    }
                } else {
                    $vlen = strlen($versioncomponents[0] . '');
                    $majver = substr($name, strlen($name) - $vlen);
                    while ($majver && !is_numeric($majver[0])) {
                        $majver = substr($majver, 1);
                    }
                    if (($versioncomponents[0] != 0) && $majver != $versioncomponents[0]) {
                        $this->_addWarning('version', 'first version number "' .
                            $versioncomponents[0] . '" must match the postfix of ' .
                            'package name "' . $name . '" (' .
                            $majver . ')');
                        return true;
                    }
                    if ($versioncomponents[0] == $majver) {
                        if ($versioncomponents[2][0] == '0') {
                            if ($versioncomponents[2] == '0') {
                                // version 2.*.0000
                                $this->_addWarning('version',
                                    "version $majver." . $versioncomponents[1] .
                                        '.0 probably should not be alpha or beta');
                                return false;
                            } elseif (strlen($versioncomponents[2]) > 1) {
                                // version 2.*.0RC1 or 2.*.0beta24 etc.
                                return true;
                            } else {
                                // version 2.*.0
                                $this->_addWarning('version',
                                    "version $majver." . $versioncomponents[1] .
                                        '.0 cannot be alpha or beta');
                                return true;
                            }
                        } else {
                            $this->_addWarning('version',
                                "bugfix versions ($majver.x.y where y > 0) should " .
                                'not be alpha or beta');
                            return true;
                        }
                    } elseif ($versioncomponents[0] != '0') {
                        $this->_addWarning('version',
                            "only versions 0.x.y and $majver.x.y are allowed for alpha/beta releases");
                        return true;
                    }
                    if ($versioncomponents[0] . 'a' == '0a') {
                        return true;
                    }
                    if ($versioncomponents[0] == 0) {
                        $versioncomponents[0] = '0';
                        $this->_addWarning('version',
                            'version "' . $version . '" should be "' .
                            implode('.' ,$versioncomponents) . '"');
                    }
                }
                return true;
            break;
            case 'stable' :
                if ($versioncomponents[0] == '0') {
                    $this->_addWarning('version', 'versions less than 1.0.0 cannot ' .
                    'be stable');
                    return true;
                }
                if (!is_numeric($versioncomponents[2])) {
                    if (preg_match('/\d+(rc|a|alpha|b|beta)\d*/i',
                          $versioncomponents[2])) {
                        $this->_addWarning('version', 'version "' . $version . '" or any ' .
                            'RC/beta/alpha version cannot be stable');
                        return true;
                    }
                }
                // check for a package that extends a package,
                // like Foo and Foo2
                if ($this->_packagexml->getExtends()) {
                    $vlen = strlen($versioncomponents[0] . '');
                    $majver = substr($name, strlen($name) - $vlen);
                    while ($majver && !is_numeric($majver[0])) {
                        $majver = substr($majver, 1);
                    }
                    if (($versioncomponents[0] != 0) && $majver != $versioncomponents[0]) {
                        $this->_addWarning('version', 'first version number "' .
                            $versioncomponents[0] . '" must match the postfix of ' .
                            'package name "' . $name . '" (' .
                            $majver . ')');
                        return true;
                    }
                } elseif ($versioncomponents[0] > 1) {
                    $this->_addWarning('version', 'major version x in x.y.z may not be greater than ' .
                        '1 for any package that does not have an <extends> tag');
                }
                return true;
            break;
            default :
                return false;
            break;
        }
    }

    /**
     * @access protected
     */
    function validateMaintainers()
    {
        // maintainers can only be truly validated server-side for most channels
        // but allow this customization for those who wish it
        return true;
    }

    /**
     * @access protected
     */
    function validateDate()
    {
        if ($this->_state == PEAR_VALIDATE_NORMAL ||
              $this->_state == PEAR_VALIDATE_PACKAGING) {

            if (!preg_match('/(\d\d\d\d)\-(\d\d)\-(\d\d)/',
                  $this->_packagexml->getDate(), $res) ||
                  count($res) < 4
                  || !checkdate($res[2], $res[3], $res[1])
                ) {
                $this->_addFailure('date', 'invalid release date "' .
                    $this->_packagexml->getDate() . '"');
                return false;
            }

            if ($this->_state == PEAR_VALIDATE_PACKAGING &&
                  $this->_packagexml->getDate() != date('Y-m-d')) {
                $this->_addWarning('date', 'Release Date "' .
                    $this->_packagexml->getDate() . '" is not today');
            }
        }
        return true;
    }

    /**
     * @access protected
     */
    function validateTime()
    {
        if (!$this->_packagexml->getTime()) {
            // default of no time value set
            return true;
        }

        // packager automatically sets time, so only validate if pear validate is called
        if ($this->_state = PEAR_VALIDATE_NORMAL) {
            if (!preg_match('/\d\d:\d\d:\d\d/',
                  $this->_packagexml->getTime())) {
                $this->_addFailure('time', 'invalid release time "' .
                    $this->_packagexml->getTime() . '"');
                return false;
            }

            $result = preg_match('|\d{2}\:\d{2}\:\d{2}|', $this->_packagexml->getTime(), $matches);
            if ($result === false || empty($matches)) {
                $this->_addFailure('time', 'invalid release time "' .
                    $this->_packagexml->getTime() . '"');
                return false;
            }
        }

        return true;
    }

    /**
     * @access protected
     */
    function validateState()
    {
        // this is the closest to "final" php4 can get
        if (!PEAR_Validate::validState($this->_packagexml->getState())) {
            if (strtolower($this->_packagexml->getState() == 'rc')) {
                $this->_addFailure('state', 'RC is not a state, it is a version ' .
                    'postfix, use ' . $this->_packagexml->getVersion() . 'RC1, state beta');
            }
            $this->_addFailure('state', 'invalid release state "' .
                $this->_packagexml->getState() . '", must be one of: ' .
                implode(', ', PEAR_Validate::getValidStates()));
            return false;
        }
        return true;
    }

    /**
     * @access protected
     */
    function validateStability()
    {
        $ret = true;
        $packagestability = $this->_packagexml->getState();
        $apistability = $this->_packagexml->getState('api');
        if (!PEAR_Validate::validState($packagestability)) {
            $this->_addFailure('state', 'invalid release stability "' .
                $this->_packagexml->getState() . '", must be one of: ' .
                implode(', ', PEAR_Validate::getValidStates()));
            $ret = false;
        }
        $apistates = PEAR_Validate::getValidStates();
        array_shift($apistates); // snapshot is not allowed
        if (!in_array($apistability, $apistates)) {
            $this->_addFailure('state', 'invalid API stability "' .
                $this->_packagexml->getState('api') . '", must be one of: ' .
                implode(', ', $apistates));
            $ret = false;
        }
        return $ret;
    }

    /**
     * @access protected
     */
    function validateSummary()
    {
        return true;
    }

    /**
     * @access protected
     */
    function validateDescription()
    {
        return true;
    }

    /**
     * @access protected
     */
    function validateLicense()
    {
        return true;
    }

    /**
     * @access protected
     */
    function validateNotes()
    {
        return true;
    }

    /**
     * for package.xml 2.0 only - channels can't use package.xml 1.0
     * @access protected
     */
    function validateDependencies()
    {
        return true;
    }

    /**
     * for package.xml 1.0 only
     * @access private
     */
    function _validateFilelist()
    {
        return true; // placeholder for now
    }

    /**
     * for package.xml 2.0 only
     * @access protected
     */
    function validateMainFilelist()
    {
        return true; // placeholder for now
    }

    /**
     * for package.xml 2.0 only
     * @access protected
     */
    function validateReleaseFilelist()
    {
        return true; // placeholder for now
    }

    /**
     * @access protected
     */
    function validateChangelog()
    {
        return true;
    }

    /**
     * @access protected
     */
    function validateFilelist()
    {
        return true;
    }

    /**
     * @access protected
     */
    function validateDeps()
    {
        return true;
    }
}PK{a�\B] ��!pear/PEAR/Installer/Role/Test.xmlnu�[���<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>test_dir</locationconfig>
 <honorsbaseinstall />
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>PK|a�\��K

 pear/PEAR/Installer/Role/Ext.phpnu�[���<?php
/**
 * PEAR_Installer_Role_Ext
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Ext extends PEAR_Installer_Role_Common {}
?>PK|a�\�Ƥ pear/PEAR/Installer/Role/Cfg.phpnu�[���<?php
/**
 * PEAR_Installer_Role_Cfg
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2007-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.7.0
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2007-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.7.0
 */
class PEAR_Installer_Role_Cfg extends PEAR_Installer_Role_Common
{
    /**
     * @var PEAR_Installer
     */
    var $installer;

    /**
     * the md5 of the original file
     *
     * @var unknown_type
     */
    var $md5 = null;

    /**
     * Do any unusual setup here
     * @param PEAR_Installer
     * @param PEAR_PackageFile_v2
     * @param array file attributes
     * @param string file name
     */
    function setup(&$installer, $pkg, $atts, $file)
    {
        $this->installer = &$installer;
        $reg = &$this->installer->config->getRegistry();
        $package = $reg->getPackage($pkg->getPackage(), $pkg->getChannel());
        if ($package) {
            $filelist = $package->getFilelist();
            if (isset($filelist[$file]) && isset($filelist[$file]['md5sum'])) {
                $this->md5 = $filelist[$file]['md5sum'];
            }
        }
    }

    function processInstallation($pkg, $atts, $file, $tmp_path, $layer = null)
    {
        $test = parent::processInstallation($pkg, $atts, $file, $tmp_path, $layer);
        if (@file_exists($test[2]) && @file_exists($test[3])) {
            $md5 = md5_file($test[2]);
            // configuration has already been installed, check for mods
            if ($md5 !== $this->md5 && $md5 !== md5_file($test[3])) {
                // configuration has been modified, so save our version as
                // configfile-version
                $old = $test[2];
                $test[2] .= '.new-' . $pkg->getVersion();
                // backup original and re-install it
                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                $tmpcfg = $this->config->get('temp_dir');
                $newloc = System::mkdir(array('-p', $tmpcfg));
                if (!$newloc) {
                    // try temp_dir
                    $newloc = System::mktemp(array('-d'));
                    if (!$newloc || PEAR::isError($newloc)) {
                        PEAR::popErrorHandling();
                        return PEAR::raiseError('Could not save existing configuration file '.
                            $old . ', unable to install.  Please set temp_dir ' .
                            'configuration variable to a writeable location and try again');
                    }
                } else {
                    $newloc = $tmpcfg;
                }

                $temp_file = $newloc . DIRECTORY_SEPARATOR . uniqid('savefile');
                if (!@copy($old, $temp_file)) {
                    PEAR::popErrorHandling();
                    return PEAR::raiseError('Could not save existing configuration file '.
                        $old . ', unable to install.  Please set temp_dir ' .
                        'configuration variable to a writeable location and try again');
                }

                PEAR::popErrorHandling();
                $this->installer->log(0, "WARNING: configuration file $old is being installed as $test[2], you should manually merge in changes to the existing configuration file");
                $this->installer->addFileOperation('rename', array($temp_file, $old, false));
                $this->installer->addFileOperation('delete', array($temp_file));
            }
        }

        return $test;
    }
}PK|a�\�^D{		 pear/PEAR/Installer/Role/Www.phpnu�[���<?php
/**
 * PEAR_Installer_Role_Www
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2007-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.7.0
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2007-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.7.0
 */
class PEAR_Installer_Role_Www extends PEAR_Installer_Role_Common {}
?>PK|a�\���BB pear/PEAR/Installer/Role/Ext.xmlnu�[���<role version="1.0">
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>ext_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension>1</phpextension>
 <config_vars />
</role>PK|a�\Y���!pear/PEAR/Installer/Role/Test.phpnu�[���<?php
/**
 * PEAR_Installer_Role_Test
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Test extends PEAR_Installer_Role_Common {}
?>PK|a�\�?m

 pear/PEAR/Installer/Role/Php.phpnu�[���<?php
/**
 * PEAR_Installer_Role_Php
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Php extends PEAR_Installer_Role_Common {}
?>PK|a�\h&P*�� pear/PEAR/Installer/Role/Doc.xmlnu�[���<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>doc_dir</locationconfig>
 <honorsbaseinstall />
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>PK|a�\*Y|	%% pear/PEAR/Installer/Role/Man.phpnu�[���<?php
/**
 * PEAR_Installer_Role_Man
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Hannes Magnusson <bjori@php.net>
 * @copyright  2011 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    SVN: $Id: $
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.10.0
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Hannes Magnusson <bjori@php.net>
 * @copyright  2011 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.10.0
 */
class PEAR_Installer_Role_Man extends PEAR_Installer_Role_Common {}
?>
PK}a�\	��
!pear/PEAR/Installer/Role/Data.phpnu�[���<?php
/**
 * PEAR_Installer_Role_Data
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Data extends PEAR_Installer_Role_Common {}
?>PK}a�\f�sz��!pear/PEAR/Installer/Role/Data.xmlnu�[���<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>data_dir</locationconfig>
 <honorsbaseinstall />
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>PK�a�\?���GG#pear/PEAR/Installer/Role/Common.phpnu�[���<?php
/**
 * Base class for all installation roles.
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2006 The PHP Group
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * Base class for all installation roles.
 *
 * This class allows extensibility of file roles.  Packages with complex
 * customization can now provide custom file roles along with the possibility of
 * adding configuration values to match.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2006 The PHP Group
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Common
{
    /**
     * @var PEAR_Config
     * @access protected
     */
    var $config;

    /**
     * @param PEAR_Config
     */
    function __construct(&$config)
    {
        $this->config = $config;
    }

    /**
     * Retrieve configuration information about a file role from its XML info
     *
     * @param string $role Role Classname, as in "PEAR_Installer_Role_Data"
     * @return array
     */
    function getInfo($role)
    {
        if (empty($GLOBALS['_PEAR_INSTALLER_ROLES'][$role])) {
            return PEAR::raiseError('Unknown Role class: "' . $role . '"');
        }
        return $GLOBALS['_PEAR_INSTALLER_ROLES'][$role];
    }

    /**
     * This is called for each file to set up the directories and files
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param array attributes from the <file> tag
     * @param string file name
     * @return array an array consisting of:
     *
     *    1 the original, pre-baseinstalldir installation directory
     *    2 the final installation directory
     *    3 the full path to the final location of the file
     *    4 the location of the pre-installation file
     */
    function processInstallation($pkg, $atts, $file, $tmp_path, $layer = null)
    {
        $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . 
            ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
        if (PEAR::isError($roleInfo)) {
            return $roleInfo;
        }
        if (!$roleInfo['locationconfig']) {
            return false;
        }
        if ($roleInfo['honorsbaseinstall']) {
            $dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'], $layer,
                $pkg->getChannel());
            if (!empty($atts['baseinstalldir'])) {
                $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir'];
            }
        } elseif ($roleInfo['unusualbaseinstall']) {
            $dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'],
                    $layer, $pkg->getChannel()) . DIRECTORY_SEPARATOR . $pkg->getPackage();
            if (!empty($atts['baseinstalldir'])) {
                $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir'];
            }
        } else {
            $dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'],
                    $layer, $pkg->getChannel()) . DIRECTORY_SEPARATOR . $pkg->getPackage();
        }
        if (dirname($file) != '.' && empty($atts['install-as'])) {
            $dest_dir .= DIRECTORY_SEPARATOR . dirname($file);
        }
        if (empty($atts['install-as'])) {
            $dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file);
        } else {
            $dest_file = $dest_dir . DIRECTORY_SEPARATOR . $atts['install-as'];
        }
        $orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file;

        // Clean up the DIRECTORY_SEPARATOR mess
        $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR;
        
        list($dest_dir, $dest_file, $orig_file) = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"),
                                                    array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR,
                                                          DIRECTORY_SEPARATOR),
                                                    array($dest_dir, $dest_file, $orig_file));
        return array($save_destdir, $dest_dir, $dest_file, $orig_file);
    }

    /**
     * Get the name of the configuration variable that specifies the location of this file
     * @return string|false
     */
    function getLocationConfig()
    {
        $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . 
            ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
        if (PEAR::isError($roleInfo)) {
            return $roleInfo;
        }
        return $roleInfo['locationconfig'];
    }

    /**
     * Do any unusual setup here
     * @param PEAR_Installer
     * @param PEAR_PackageFile_v2
     * @param array file attributes
     * @param string file name
     */
    function setup(&$installer, $pkg, $atts, $file)
    {
    }

    function isExecutable()
    {
        $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . 
            ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
        if (PEAR::isError($roleInfo)) {
            return $roleInfo;
        }
        return $roleInfo['executable'];
    }

    function isInstallable()
    {
        $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . 
            ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
        if (PEAR::isError($roleInfo)) {
            return $roleInfo;
        }
        return $roleInfo['installable'];
    }

    function isExtension()
    {
        $roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' . 
            ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
        if (PEAR::isError($roleInfo)) {
            return $roleInfo;
        }
        return $roleInfo['phpextension'];
    }
}
?>
PK�a�\��

 pear/PEAR/Installer/Role/Doc.phpnu�[���<?php
/**
 * PEAR_Installer_Role_Doc
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Doc extends PEAR_Installer_Role_Common {}
?>PK�a�\z�q��� pear/PEAR/Installer/Role/Php.xmlnu�[���<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>php_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile>1</phpfile>
 <executable />
 <phpextension />
 <config_vars />
</role>PK�a�\p��"" pear/PEAR/Installer/Role/Src.xmlnu�[���<role version="1.0">
 <releasetypes>extsrc</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <installable>1</installable>
 <locationconfig>temp_dir</locationconfig>
 <honorsbaseinstall />
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>PK�a�\��srr pear/PEAR/Installer/Role/Src.phpnu�[���<?php
/**
 * PEAR_Installer_Role_Src
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Src extends PEAR_Installer_Role_Common
{
    function setup(&$installer, $pkg, $atts, $file)
    {
        $installer->source_files++;
    }
}
?>PK�a�\��[�#pear/PEAR/Installer/Role/Script.phpnu�[���<?php
/**
 * PEAR_Installer_Role_Script
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role_Script extends PEAR_Installer_Role_Common {}
?>PK�a�\>1H��� pear/PEAR/Installer/Role/Www.xmlnu�[���<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>www_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>PK�a�\��/�� pear/PEAR/Installer/Role/Cfg.xmlnu�[���<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>cfg_dir</locationconfig>
 <honorsbaseinstall />
 <unusualbaseinstall>1</unusualbaseinstall>
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>PK�a�\�0�c�� pear/PEAR/Installer/Role/Man.xmlnu�[���<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>man_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile />
 <executable />
 <phpextension />
 <config_vars />
</role>
PK�a�\@v�а�#pear/PEAR/Installer/Role/Script.xmlnu�[���<role version="1.0">
 <releasetypes>php</releasetypes>
 <releasetypes>extsrc</releasetypes>
 <releasetypes>extbin</releasetypes>
 <releasetypes>zendextsrc</releasetypes>
 <releasetypes>zendextbin</releasetypes>
 <installable>1</installable>
 <locationconfig>bin_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile />
 <executable>1</executable>
 <phpextension />
 <config_vars />
</role>PK�a�\V�Z���pear/PEAR/Installer/Role.phpnu�[���<?php
/**
 * PEAR_Installer_Role
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * base class for installer roles
 */
require_once 'PEAR/Installer/Role/Common.php';
require_once 'PEAR/XMLParser.php';
/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Installer_Role
{
    /**
     * Set up any additional configuration variables that file roles require
     *
     * Never call this directly, it is called by the PEAR_Config constructor
     * @param PEAR_Config
     */
    public static function initializeConfig(&$config)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $class => $info) {
            if (!$info['config_vars']) {
                continue;
            }

            $config->_addConfigVars($class, $info['config_vars']);
        }
    }

    /**
     * @param PEAR_PackageFile_v2
     * @param string role name
     * @param PEAR_Config
     * @return PEAR_Installer_Role_Common
     */
    public static function &factory($pkg, $role, &$config)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        if (!in_array($role, PEAR_Installer_Role::getValidRoles($pkg->getPackageType()))) {
            $a = false;
            return $a;
        }

        $a = 'PEAR_Installer_Role_' . ucfirst($role);
        if (!class_exists($a)) {
            require_once str_replace('_', '/', $a) . '.php';
        }

        $b = new $a($config);
        return $b;
    }

    /**
     * Get a list of file roles that are valid for the particular release type.
     *
     * For instance, src files serve no purpose in regular php releases.
     * @param string
     * @param bool clear cache
     * @return array
     */
    public static function getValidRoles($release, $clear = false)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        static $ret = array();
        if ($clear) {
            $ret = array();
        }

        if (isset($ret[$release])) {
            return $ret[$release];
        }

        $ret[$release] = array();
        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
            if (in_array($release, $okreleases['releasetypes'])) {
                $ret[$release][] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
            }
        }

        return $ret[$release];
    }

    /**
     * Get a list of roles that require their files to be installed
     *
     * Most roles must be installed, but src and package roles, for instance
     * are pseudo-roles.  src files are compiled into a new extension.  Package
     * roles are actually fully bundled releases of a package
     * @param bool clear cache
     * @return array
     */
    public static function getInstallableRoles($clear = false)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        static $ret;
        if ($clear) {
            unset($ret);
        }

        if (isset($ret)) {
            return $ret;
        }

        $ret = array();
        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
            if ($okreleases['installable']) {
                $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
            }
        }

        return $ret;
    }

    /**
     * Return an array of roles that are affected by the baseinstalldir attribute
     *
     * Most roles ignore this attribute, and instead install directly into:
     * PackageName/filepath
     * so a tests file tests/file.phpt is installed into PackageName/tests/filepath.php
     * @param bool clear cache
     * @return array
     */
    public static function getBaseinstallRoles($clear = false)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        static $ret;
        if ($clear) {
            unset($ret);
        }

        if (isset($ret)) {
            return $ret;
        }

        $ret = array();
        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
            if ($okreleases['honorsbaseinstall']) {
                $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
            }
        }

        return $ret;
    }

    /**
     * Return an array of file roles that should be analyzed for PHP content at package time,
     * like the "php" role.
     * @param bool clear cache
     * @return array
     */
    public static function getPhpRoles($clear = false)
    {
        if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
            PEAR_Installer_Role::registerRoles();
        }

        static $ret;
        if ($clear) {
            unset($ret);
        }

        if (isset($ret)) {
            return $ret;
        }

        $ret = array();
        foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
            if ($okreleases['phpfile']) {
                $ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
            }
        }

        return $ret;
    }

    /**
     * Scan through the Command directory looking for classes
     * and see what commands they implement.
     * @param string which directory to look for classes, defaults to
     *               the Installer/Roles subdirectory of
     *               the directory from where this file (__FILE__) is
     *               included.
     *
     * @return bool TRUE on success, a PEAR error on failure
     */
    public static function registerRoles($dir = null)
    {
        $GLOBALS['_PEAR_INSTALLER_ROLES'] = array();
        $parser = new PEAR_XMLParser;
        if ($dir === null) {
            $dir = dirname(__FILE__) . '/Role';
        }

        if (!file_exists($dir) || !is_dir($dir)) {
            return PEAR::raiseError("registerRoles: opendir($dir) failed: does not exist/is not directory");
        }

        $dp = @opendir($dir);
        if (empty($dp)) {
            return PEAR::raiseError("registerRoles: opendir($dir) failed: $php_errmsg");
        }

        while ($entry = readdir($dp)) {
            if ($entry[0] == '.' || substr($entry, -4) != '.xml') {
                continue;
            }

            $class = "PEAR_Installer_Role_".substr($entry, 0, -4);
            // List of roles
            if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'][$class])) {
                $file = "$dir/$entry";
                $parser->parse(file_get_contents($file));
                $data = $parser->getData();
                if (!is_array($data['releasetypes'])) {
                    $data['releasetypes'] = array($data['releasetypes']);
                }

                $GLOBALS['_PEAR_INSTALLER_ROLES'][$class] = $data;
            }
        }

        closedir($dp);
        ksort($GLOBALS['_PEAR_INSTALLER_ROLES']);
        PEAR_Installer_Role::getBaseinstallRoles(true);
        PEAR_Installer_Role::getInstallableRoles(true);
        PEAR_Installer_Role::getPhpRoles(true);
        PEAR_Installer_Role::getValidRoles('****', true);
        return true;
    }
}PK�a�\l(e���pear/PEAR/Downloader.phpnu�[���<?php
/**
 * PEAR_Downloader, the PEAR Installer's download utility class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Martin Jansen <mj@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.3.0
 */

/**
 * Needed for constants, extending
 */
require_once 'PEAR/Common.php';
require_once 'PEAR/Proxy.php';

define('PEAR_INSTALLER_OK',       1);
define('PEAR_INSTALLER_FAILED',   0);
define('PEAR_INSTALLER_SKIPPED', -1);
define('PEAR_INSTALLER_ERROR_NO_PREF_STATE', 2);

/**
 * Administration class used to download anything from the internet (PEAR Packages,
 * static URLs, xml files)
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Martin Jansen <mj@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.3.0
 */
class PEAR_Downloader extends PEAR_Common
{
    /**
     * @var PEAR_Registry
     * @access private
     */
    var $_registry;

    /**
     * Preferred Installation State (snapshot, devel, alpha, beta, stable)
     * @var string|null
     * @access private
     */
    var $_preferredState;

    /**
     * Options from command-line passed to Install.
     *
     * Recognized options:<br />
     *  - onlyreqdeps      : install all required dependencies as well
     *  - alldeps          : install all dependencies, including optional
     *  - installroot      : base relative path to install files in
     *  - force            : force a download even if warnings would prevent it
     *  - nocompress       : download uncompressed tarballs
     *  - configureoptions : additional configure options
     * @see PEAR_Command_Install
     * @access private
     * @var array
     */
    var $_options;

    /**
     * Downloaded Packages after a call to download().
     *
     * Format of each entry:
     *
     * <code>
     * array('pkg' => 'package_name', 'file' => '/path/to/local/file',
     *    'info' => array() // parsed package.xml
     * );
     * </code>
     * @access private
     * @var array
     */
    var $_downloadedPackages = array();

    /**
     * Packages slated for download.
     *
     * This is used to prevent downloading a package more than once should it be a dependency
     * for two packages to be installed.
     * Format of each entry:
     *
     * <pre>
     * array('package_name1' => parsed package.xml, 'package_name2' => parsed package.xml,
     * );
     * </pre>
     * @access private
     * @var array
     */
    var $_toDownload = array();

    /**
     * Array of every package installed, with names lower-cased.
     *
     * Format:
     * <code>
     * array('package1' => 0, 'package2' => 1, );
     * </code>
     * @var array
     */
    var $_installed = array();

    /**
     * @var array
     * @access private
     */
    var $_errorStack = array();

    /**
     * @var boolean
     * @access private
     */
    var $_internalDownload = false;

    /**
     * Temporary variable used in sorting packages by dependency in {@link sortPkgDeps()}
     * @var array
     * @access private
     */
    var $_packageSortTree;

    /**
     * Temporary directory, or configuration value where downloads will occur
     * @var string
     */
    var $_downloadDir;

    /**
     * List of methods that can be called both statically and non-statically.
     * @var array
     */
    protected static $bivalentMethods = array(
        'setErrorHandling' => true,
        'raiseError' => true,
        'throwError' => true,
        'pushErrorHandling' => true,
        'popErrorHandling' => true,
        'downloadHttp' => true,
    );

    /**
     * @param PEAR_Frontend_*
     * @param array
     * @param PEAR_Config
     */
    function __construct($ui = null, $options = array(), $config = null)
    {
        parent::__construct();
        $this->_options = $options;
        if ($config !== null) {
            $this->config = &$config;
            $this->_preferredState = $this->config->get('preferred_state');
        }
        $this->ui = &$ui;
        if (!$this->_preferredState) {
            // don't inadvertently use a non-set preferred_state
            $this->_preferredState = null;
        }

        if ($config !== null) {
            if (isset($this->_options['installroot'])) {
                $this->config->setInstallRoot($this->_options['installroot']);
            }
            $this->_registry = &$config->getRegistry();
        }

        if (isset($this->_options['alldeps']) || isset($this->_options['onlyreqdeps'])) {
            $this->_installed = $this->_registry->listAllPackages();
            foreach ($this->_installed as $key => $unused) {
                if (!count($unused)) {
                    continue;
                }
                $strtolower = function($a) { return strtolower($a); };
                array_walk($this->_installed[$key], $strtolower);
            }
        }
    }

    /**
     * Attempt to discover a channel's remote capabilities from
     * its server name
     * @param string
     * @return boolean
     */
    function discover($channel)
    {
        $this->log(1, 'Attempting to discover channel "' . $channel . '"...');
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $callback = $this->ui ? array(&$this, '_downloadCallback') : null;
        if (!class_exists('System')) {
            require_once 'System.php';
        }

        $tmpdir = $this->config->get('temp_dir');
        $tmp = System::mktemp('-d -t "' . $tmpdir . '"');
        $a   = $this->downloadHttp('http://' . $channel . '/channel.xml', $this->ui, $tmp, $callback, false);
        PEAR::popErrorHandling();
        if (PEAR::isError($a)) {
            // Attempt to fallback to https automatically.
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $this->log(1, 'Attempting fallback to https instead of http on channel "' . $channel . '"...');
            $a = $this->downloadHttp('https://' . $channel . '/channel.xml', $this->ui, $tmp, $callback, false);
            PEAR::popErrorHandling();
            if (PEAR::isError($a)) {
                return false;
            }
        }

        list($a, $lastmodified) = $a;
        if (!class_exists('PEAR_ChannelFile')) {
            require_once 'PEAR/ChannelFile.php';
        }

        $b = new PEAR_ChannelFile;
        if ($b->fromXmlFile($a)) {
            unlink($a);
            if ($this->config->get('auto_discover')) {
                $this->_registry->addChannel($b, $lastmodified);
                $alias = $b->getName();
                if ($b->getName() == $this->_registry->channelName($b->getAlias())) {
                    $alias = $b->getAlias();
                }

                $this->log(1, 'Auto-discovered channel "' . $channel .
                    '", alias "' . $alias . '", adding to registry');
            }

            return true;
        }

        unlink($a);
        return false;
    }

    /**
     * For simpler unit-testing
     * @param PEAR_Downloader
     * @return PEAR_Downloader_Package
     */
    function newDownloaderPackage(&$t)
    {
        if (!class_exists('PEAR_Downloader_Package')) {
            require_once 'PEAR/Downloader/Package.php';
        }
        $a = new PEAR_Downloader_Package($t);
        return $a;
    }

    /**
     * For simpler unit-testing
     * @param PEAR_Config
     * @param array
     * @param array
     * @param int
     */
    function &getDependency2Object(&$c, $i, $p, $s)
    {
        if (!class_exists('PEAR_Dependency2')) {
            require_once 'PEAR/Dependency2.php';
        }
        $z = new PEAR_Dependency2($c, $i, $p, $s);
        return $z;
    }

    function &download($params)
    {
        if (!count($params)) {
            $a = array();
            return $a;
        }

        if (!isset($this->_registry)) {
            $this->_registry = &$this->config->getRegistry();
        }

        $channelschecked = array();
        // convert all parameters into PEAR_Downloader_Package objects
        foreach ($params as $i => $param) {
            $params[$i] = $this->newDownloaderPackage($this);
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $err = $params[$i]->initialize($param);
            PEAR::staticPopErrorHandling();
            if (!$err) {
                // skip parameters that were missed by preferred_state
                continue;
            }

            if (PEAR::isError($err)) {
                if (!isset($this->_options['soft']) && $err->getMessage() !== '') {
                    $this->log(0, $err->getMessage());
                }

                $params[$i] = false;
                if (is_object($param)) {
                    $param = $param->getChannel() . '/' . $param->getPackage();
                }

                if (!isset($this->_options['soft'])) {
                    $this->log(2, 'Package "' . $param . '" is not valid');
                }

                // Message logged above in a specific verbose mode, passing null to not show up on CLI
                $this->pushError(null, PEAR_INSTALLER_SKIPPED);
            } else {
                do {
                    if ($params[$i] && $params[$i]->getType() == 'local') {
                        // bug #7090 skip channel.xml check for local packages
                        break;
                    }

                    if ($params[$i] && !isset($channelschecked[$params[$i]->getChannel()]) &&
                          !isset($this->_options['offline'])
                    ) {
                        $channelschecked[$params[$i]->getChannel()] = true;
                        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                        if (!class_exists('System')) {
                            require_once 'System.php';
                        }

                        $curchannel = $this->_registry->getChannel($params[$i]->getChannel());
                        if (PEAR::isError($curchannel)) {
                            PEAR::staticPopErrorHandling();
                            return $this->raiseError($curchannel);
                        }

                        if (PEAR::isError($dir = $this->getDownloadDir())) {
                            PEAR::staticPopErrorHandling();
                            break;
                        }

                        $mirror = $this->config->get('preferred_mirror', null, $params[$i]->getChannel());
                        $url    = 'http://' . $mirror . '/channel.xml';
                        $a = $this->downloadHttp($url, $this->ui, $dir, null, $curchannel->lastModified());

                        PEAR::staticPopErrorHandling();
                        if ($a === false) {
                            //channel.xml not modified
                            break;
                        } else if (PEAR::isError($a)) {
                            // Attempt fallback to https automatically
                            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                            $a = $this->downloadHttp('https://' . $mirror .
                                '/channel.xml', $this->ui, $dir, null, $curchannel->lastModified());

                            PEAR::staticPopErrorHandling();
                            if (PEAR::isError($a) || !$a) {
                                break;
                            }
                        }
                        $this->log(0, 'WARNING: channel "' . $params[$i]->getChannel() . '" has ' .
                            'updated its protocols, use "' . PEAR_RUNTYPE . ' channel-update ' . $params[$i]->getChannel() .
                            '" to update');
                    }
                } while (false);

                if ($params[$i] && !isset($this->_options['downloadonly'])) {
                    if (isset($this->_options['packagingroot'])) {
                        $checkdir = $this->_prependPath(
                            $this->config->get('php_dir', null, $params[$i]->getChannel()),
                            $this->_options['packagingroot']);
                    } else {
                        $checkdir = $this->config->get('php_dir',
                            null, $params[$i]->getChannel());
                    }

                    while ($checkdir && $checkdir != '/' && !file_exists($checkdir)) {
                        $checkdir = dirname($checkdir);
                    }

                    if ($checkdir == '.') {
                        $checkdir = '/';
                    }

                    if (!is_writeable($checkdir)) {
                        return PEAR::raiseError('Cannot install, php_dir for channel "' .
                            $params[$i]->getChannel() . '" is not writeable by the current user');
                    }
                }
            }
        }

        unset($channelschecked);
        PEAR_Downloader_Package::removeDuplicates($params);
        if (!count($params)) {
            $a = array();
            return $a;
        }

        if (!isset($this->_options['nodeps']) && !isset($this->_options['offline'])) {
            $reverify = true;
            while ($reverify) {
                $reverify = false;
                foreach ($params as $i => $param) {
                    //PHP Bug 40768 / PEAR Bug #10944
                    //Nested foreaches fail in PHP 5.2.1
                    key($params);
                    $ret = $params[$i]->detectDependencies($params);
                    if (PEAR::isError($ret)) {
                        $reverify = true;
                        $params[$i] = false;
                        PEAR_Downloader_Package::removeDuplicates($params);
                        if (!isset($this->_options['soft'])) {
                            $this->log(0, $ret->getMessage());
                        }
                        continue 2;
                    }
                }
            }
        }

        if (isset($this->_options['offline'])) {
            $this->log(3, 'Skipping dependency download check, --offline specified');
        }

        if (!count($params)) {
            $a = array();
            return $a;
        }

        while (PEAR_Downloader_Package::mergeDependencies($params));
        PEAR_Downloader_Package::removeDuplicates($params, true);
        $errorparams = array();
        if (PEAR_Downloader_Package::detectStupidDuplicates($params, $errorparams)) {
            if (count($errorparams)) {
                foreach ($errorparams as $param) {
                    $name = $this->_registry->parsedPackageNameToString($param->getParsedPackage());
                    $this->pushError('Duplicate package ' . $name . ' found', PEAR_INSTALLER_FAILED);
                }
                $a = array();
                return $a;
            }
        }

        PEAR_Downloader_Package::removeInstalled($params);
        if (!count($params)) {
            $this->pushError('No valid packages found', PEAR_INSTALLER_FAILED);
            $a = array();
            return $a;
        }

        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $err = $this->analyzeDependencies($params);
        PEAR::popErrorHandling();
        if (!count($params)) {
            $this->pushError('No valid packages found', PEAR_INSTALLER_FAILED);
            $a = array();
            return $a;
        }

        $ret = array();
        $newparams = array();
        if (isset($this->_options['pretend'])) {
            return $params;
        }

        $somefailed = false;
        foreach ($params as $i => $package) {
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $pf = &$params[$i]->download();
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($pf)) {
                if (!isset($this->_options['soft'])) {
                    $this->log(1, $pf->getMessage());
                    $this->log(0, 'Error: cannot download "' .
                        $this->_registry->parsedPackageNameToString($package->getParsedPackage(),
                            true) .
                        '"');
                }
                $somefailed = true;
                continue;
            }

            $newparams[] = &$params[$i];
            $ret[] = array(
                'file' => $pf->getArchiveFile(),
                'info' => &$pf,
                'pkg'  => $pf->getPackage()
            );
        }

        if ($somefailed) {
            // remove params that did not download successfully
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $err = $this->analyzeDependencies($newparams, true);
            PEAR::popErrorHandling();
            if (!count($newparams)) {
                $this->pushError('Download failed', PEAR_INSTALLER_FAILED);
                $a = array();
                return $a;
            }
        }

        $this->_downloadedPackages = $ret;
        return $newparams;
    }

    /**
     * @param array all packages to be installed
     */
    function analyzeDependencies(&$params, $force = false)
    {
        if (isset($this->_options['downloadonly'])) {
            return;
        }

        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $redo  = true;
        $reset = $hasfailed = $failed = false;
        while ($redo) {
            $redo = false;
            foreach ($params as $i => $param) {
                $deps = $param->getDeps();
                if (!$deps) {
                    $depchecker = &$this->getDependency2Object($this->config, $this->getOptions(),
                        $param->getParsedPackage(), PEAR_VALIDATE_DOWNLOADING);
                    $send = $param->getPackageFile();

                    $installcheck = $depchecker->validatePackage($send, $this, $params);
                    if (PEAR::isError($installcheck)) {
                        if (!isset($this->_options['soft'])) {
                            $this->log(0, $installcheck->getMessage());
                        }
                        $hasfailed  = true;
                        $params[$i] = false;
                        $reset      = true;
                        $redo       = true;
                        $failed     = false;
                        PEAR_Downloader_Package::removeDuplicates($params);
                        continue 2;
                    }
                    continue;
                }

                if (!$reset && $param->alreadyValidated() && !$force) {
                    continue;
                }

                if (count($deps)) {
                    $depchecker = &$this->getDependency2Object($this->config, $this->getOptions(),
                        $param->getParsedPackage(), PEAR_VALIDATE_DOWNLOADING);
                    $send = $param->getPackageFile();
                    if ($send === null) {
                        $send = $param->getDownloadURL();
                    }

                    $installcheck = $depchecker->validatePackage($send, $this, $params);
                    if (PEAR::isError($installcheck)) {
                        if (!isset($this->_options['soft'])) {
                            $this->log(0, $installcheck->getMessage());
                        }
                        $hasfailed  = true;
                        $params[$i] = false;
                        $reset      = true;
                        $redo       = true;
                        $failed     = false;
                        PEAR_Downloader_Package::removeDuplicates($params);
                        continue 2;
                    }

                    $failed = false;
                    if (isset($deps['required']) && is_array($deps['required'])) {
                        foreach ($deps['required'] as $type => $dep) {
                            // note: Dependency2 will never return a PEAR_Error if ignore-errors
                            // is specified, so soft is needed to turn off logging
                            if (!isset($dep[0])) {
                                if (PEAR::isError($e = $depchecker->{"validate{$type}Dependency"}($dep,
                                      true, $params))) {
                                    $failed = true;
                                    if (!isset($this->_options['soft'])) {
                                        $this->log(0, $e->getMessage());
                                    }
                                } elseif (is_array($e) && !$param->alreadyValidated()) {
                                    if (!isset($this->_options['soft'])) {
                                        $this->log(0, $e[0]);
                                    }
                                }
                            } else {
                                foreach ($dep as $d) {
                                    if (PEAR::isError($e =
                                          $depchecker->{"validate{$type}Dependency"}($d,
                                          true, $params))) {
                                        $failed = true;
                                        if (!isset($this->_options['soft'])) {
                                            $this->log(0, $e->getMessage());
                                        }
                                    } elseif (is_array($e) && !$param->alreadyValidated()) {
                                        if (!isset($this->_options['soft'])) {
                                            $this->log(0, $e[0]);
                                        }
                                    }
                                }
                            }
                        }

                        if (isset($deps['optional']) && is_array($deps['optional'])) {
                            foreach ($deps['optional'] as $type => $dep) {
                                if (!isset($dep[0])) {
                                    if (PEAR::isError($e =
                                          $depchecker->{"validate{$type}Dependency"}($dep,
                                          false, $params))) {
                                        $failed = true;
                                        if (!isset($this->_options['soft'])) {
                                            $this->log(0, $e->getMessage());
                                        }
                                    } elseif (is_array($e) && !$param->alreadyValidated()) {
                                        if (!isset($this->_options['soft'])) {
                                            $this->log(0, $e[0]);
                                        }
                                    }
                                } else {
                                    foreach ($dep as $d) {
                                        if (PEAR::isError($e =
                                              $depchecker->{"validate{$type}Dependency"}($d,
                                              false, $params))) {
                                            $failed = true;
                                            if (!isset($this->_options['soft'])) {
                                                $this->log(0, $e->getMessage());
                                            }
                                        } elseif (is_array($e) && !$param->alreadyValidated()) {
                                            if (!isset($this->_options['soft'])) {
                                                $this->log(0, $e[0]);
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        $groupname = $param->getGroup();
                        if (isset($deps['group']) && $groupname) {
                            if (!isset($deps['group'][0])) {
                                $deps['group'] = array($deps['group']);
                            }

                            $found = false;
                            foreach ($deps['group'] as $group) {
                                if ($group['attribs']['name'] == $groupname) {
                                    $found = true;
                                    break;
                                }
                            }

                            if ($found) {
                                unset($group['attribs']);
                                foreach ($group as $type => $dep) {
                                    if (!isset($dep[0])) {
                                        if (PEAR::isError($e =
                                              $depchecker->{"validate{$type}Dependency"}($dep,
                                              false, $params))) {
                                            $failed = true;
                                            if (!isset($this->_options['soft'])) {
                                                $this->log(0, $e->getMessage());
                                            }
                                        } elseif (is_array($e) && !$param->alreadyValidated()) {
                                            if (!isset($this->_options['soft'])) {
                                                $this->log(0, $e[0]);
                                            }
                                        }
                                    } else {
                                        foreach ($dep as $d) {
                                            if (PEAR::isError($e =
                                                  $depchecker->{"validate{$type}Dependency"}($d,
                                                  false, $params))) {
                                                $failed = true;
                                                if (!isset($this->_options['soft'])) {
                                                    $this->log(0, $e->getMessage());
                                                }
                                            } elseif (is_array($e) && !$param->alreadyValidated()) {
                                                if (!isset($this->_options['soft'])) {
                                                    $this->log(0, $e[0]);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    } else {
                        foreach ($deps as $dep) {
                            if (PEAR::isError($e = $depchecker->validateDependency1($dep, $params))) {
                                $failed = true;
                                if (!isset($this->_options['soft'])) {
                                    $this->log(0, $e->getMessage());
                                }
                            } elseif (is_array($e) && !$param->alreadyValidated()) {
                                if (!isset($this->_options['soft'])) {
                                    $this->log(0, $e[0]);
                                }
                            }
                        }
                    }
                    $params[$i]->setValidated();
                }

                if ($failed) {
                    $hasfailed  = true;
                    $params[$i] = false;
                    $reset      = true;
                    $redo       = true;
                    $failed     = false;
                    PEAR_Downloader_Package::removeDuplicates($params);
                    continue 2;
                }
            }
        }

        PEAR::staticPopErrorHandling();
        if ($hasfailed && (isset($this->_options['ignore-errors']) ||
              isset($this->_options['nodeps']))) {
            // this is probably not needed, but just in case
            if (!isset($this->_options['soft'])) {
                $this->log(0, 'WARNING: dependencies failed');
            }
        }
    }

    /**
     * Retrieve the directory that downloads will happen in
     * @access private
     * @return string
     */
    function getDownloadDir()
    {
        if (isset($this->_downloadDir)) {
            return $this->_downloadDir;
        }

        $downloaddir = $this->config->get('download_dir');
        if (empty($downloaddir) || (is_dir($downloaddir) && !is_writable($downloaddir))) {
            if  (is_dir($downloaddir) && !is_writable($downloaddir)) {
                $this->log(0, 'WARNING: configuration download directory "' . $downloaddir .
                    '" is not writeable.  Change download_dir config variable to ' .
                    'a writeable dir to avoid this warning');
            }

            if (!class_exists('System')) {
                require_once 'System.php';
            }

            if (PEAR::isError($downloaddir = System::mktemp('-d'))) {
                return $downloaddir;
            }
            $this->log(3, '+ tmp dir created at ' . $downloaddir);
        }

        if (!is_writable($downloaddir)) {
            if (PEAR::isError(System::mkdir(array('-p', $downloaddir))) ||
                  !is_writable($downloaddir)) {
                return PEAR::raiseError('download directory "' . $downloaddir .
                    '" is not writeable.  Change download_dir config variable to ' .
                    'a writeable dir');
            }
        }

        return $this->_downloadDir = $downloaddir;
    }

    function setDownloadDir($dir)
    {
        if (!@is_writable($dir)) {
            if (PEAR::isError(System::mkdir(array('-p', $dir)))) {
                return PEAR::raiseError('download directory "' . $dir .
                    '" is not writeable.  Change download_dir config variable to ' .
                    'a writeable dir');
            }
        }
        $this->_downloadDir = $dir;
    }

    function configSet($key, $value, $layer = 'user', $channel = false)
    {
        $this->config->set($key, $value, $layer, $channel);
        $this->_preferredState = $this->config->get('preferred_state', null, $channel);
        if (!$this->_preferredState) {
            // don't inadvertently use a non-set preferred_state
            $this->_preferredState = null;
        }
    }

    function setOptions($options)
    {
        $this->_options = $options;
    }

    function getOptions()
    {
        return $this->_options;
    }


    /**
     * @param array output of {@link parsePackageName()}
     * @access private
     */
    function _getPackageDownloadUrl($parr)
    {
        $curchannel = $this->config->get('default_channel');
        $this->configSet('default_channel', $parr['channel']);
        // getDownloadURL returns an array.  On error, it only contains information
        // on the latest release as array(version, info).  On success it contains
        // array(version, info, download url string)
        $state = isset($parr['state']) ? $parr['state'] : $this->config->get('preferred_state');
        if (!$this->_registry->channelExists($parr['channel'])) {
            do {
                if ($this->config->get('auto_discover') && $this->discover($parr['channel'])) {
                    break;
                }

                $this->configSet('default_channel', $curchannel);
                return PEAR::raiseError('Unknown remote channel: ' . $parr['channel']);
            } while (false);
        }

        $chan = $this->_registry->getChannel($parr['channel']);
        if (PEAR::isError($chan)) {
            return $chan;
        }

        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $version   = $this->_registry->packageInfo($parr['package'], 'version', $parr['channel']);
        $stability = $this->_registry->packageInfo($parr['package'], 'stability', $parr['channel']);
        // package is installed - use the installed release stability level
        if (!isset($parr['state']) && $stability !== null) {
            $state = $stability['release'];
        }
        PEAR::staticPopErrorHandling();
        $base2 = false;

        $preferred_mirror = $this->config->get('preferred_mirror');
        if (!$chan->supportsREST($preferred_mirror) ||
              (
               !($base2 = $chan->getBaseURL('REST1.3', $preferred_mirror))
               &&
               !($base = $chan->getBaseURL('REST1.0', $preferred_mirror))
              )
        ) {
            return $this->raiseError($parr['channel'] . ' is using an unsupported protocol - This should never happen. Use --force to continue');
        }

        if ($base2) {
            $rest = &$this->config->getREST('1.3', $this->_options);
            $base = $base2;
        } else {
            $rest = &$this->config->getREST('1.0', $this->_options);
        }

        $downloadVersion = false;
        if (!isset($parr['version']) && !isset($parr['state']) && $version
              && !PEAR::isError($version)
              && !isset($this->_options['downloadonly'])
        ) {
            $downloadVersion = $version;
        }

        $url = $rest->getDownloadURL($base, $parr, $state, $downloadVersion, $chan->getName());
        if (PEAR::isError($url)) {
            $this->configSet('default_channel', $curchannel);
            return $url;
        }

        if ($parr['channel'] != $curchannel) {
            $this->configSet('default_channel', $curchannel);
        }

        if (!is_array($url)) {
            return $url;
        }

        $url['raw'] = false; // no checking is necessary for REST
        if (!is_array($url['info'])) {
            return PEAR::raiseError('Invalid remote dependencies retrieved from REST - ' .
                'this should never happen');
        }

        if (!isset($this->_options['force']) &&
              !isset($this->_options['downloadonly']) &&
              $version &&
              !PEAR::isError($version) &&
              !isset($parr['group'])
        ) {
            if (version_compare($version, $url['version'], '=')) {
                return PEAR::raiseError($this->_registry->parsedPackageNameToString(
                    $parr, true) . ' is already installed and is the same as the ' .
                    'released version ' . $url['version'], -976);
            }

            if (version_compare($version, $url['version'], '>')) {
                return PEAR::raiseError($this->_registry->parsedPackageNameToString(
                    $parr, true) . ' is already installed and is newer than detected ' .
                    'released version ' . $url['version'], -976);
            }
        }

        if (isset($url['info']['required']) || $url['compatible']) {
            require_once 'PEAR/PackageFile/v2.php';
            $pf = new PEAR_PackageFile_v2;
            $pf->setRawChannel($parr['channel']);
            if ($url['compatible']) {
                $pf->setRawCompatible($url['compatible']);
            }
        } else {
            require_once 'PEAR/PackageFile/v1.php';
            $pf = new PEAR_PackageFile_v1;
        }

        $pf->setRawPackage($url['package']);
        $pf->setDeps($url['info']);
        if ($url['compatible']) {
            $pf->setCompatible($url['compatible']);
        }

        $pf->setRawState($url['stability']);
        $url['info'] = &$pf;
        if (!extension_loaded("zlib") || isset($this->_options['nocompress'])) {
            $ext = '.tar';
        } else {
            $ext = '.tgz';
        }

        if (is_array($url) && isset($url['url'])) {
            $url['url'] .= $ext;
        }

        return $url;
    }

    /**
     * @param array dependency array
     * @access private
     */
    function _getDepPackageDownloadUrl($dep, $parr)
    {
        $xsdversion = isset($dep['rel']) ? '1.0' : '2.0';
        $curchannel = $this->config->get('default_channel');
        if (isset($dep['uri'])) {
            $xsdversion = '2.0';
            $chan = $this->_registry->getChannel('__uri');
            if (PEAR::isError($chan)) {
                return $chan;
            }

            $version = $this->_registry->packageInfo($dep['name'], 'version', '__uri');
            $this->configSet('default_channel', '__uri');
        } else {
            if (isset($dep['channel'])) {
                $remotechannel = $dep['channel'];
            } else {
                $remotechannel = 'pear.php.net';
            }

            if (!$this->_registry->channelExists($remotechannel)) {
                do {
                    if ($this->config->get('auto_discover')) {
                        if ($this->discover($remotechannel)) {
                            break;
                        }
                    }
                    return PEAR::raiseError('Unknown remote channel: ' . $remotechannel);
                } while (false);
            }

            $chan = $this->_registry->getChannel($remotechannel);
            if (PEAR::isError($chan)) {
                return $chan;
            }

            $version = $this->_registry->packageInfo($dep['name'], 'version', $remotechannel);
            $this->configSet('default_channel', $remotechannel);
        }

        $state = isset($parr['state']) ? $parr['state'] : $this->config->get('preferred_state');
        if (isset($parr['state']) && isset($parr['version'])) {
            unset($parr['state']);
        }

        if (isset($dep['uri'])) {
            $info = $this->newDownloaderPackage($this);
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $err = $info->initialize($dep);
            PEAR::staticPopErrorHandling();
            if (!$err) {
                // skip parameters that were missed by preferred_state
                return PEAR::raiseError('Cannot initialize dependency');
            }

            if (PEAR::isError($err)) {
                if (!isset($this->_options['soft'])) {
                    $this->log(0, $err->getMessage());
                }

                if (is_object($info)) {
                    $param = $info->getChannel() . '/' . $info->getPackage();
                }
                return PEAR::raiseError('Package "' . $param . '" is not valid');
            }
            return $info;
        } elseif ($chan->supportsREST($this->config->get('preferred_mirror'))
              &&
                (
                  ($base2 = $chan->getBaseURL('REST1.3', $this->config->get('preferred_mirror')))
                    ||
                  ($base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror')))
                )
        ) {
            if ($base2) {
                $base = $base2;
                $rest = &$this->config->getREST('1.3', $this->_options);
            } else {
                $rest = &$this->config->getREST('1.0', $this->_options);
            }

            $url = $rest->getDepDownloadURL($base, $xsdversion, $dep, $parr,
                    $state, $version, $chan->getName());
            if (PEAR::isError($url)) {
                return $url;
            }

            if ($parr['channel'] != $curchannel) {
                $this->configSet('default_channel', $curchannel);
            }

            if (!is_array($url)) {
                return $url;
            }

            $url['raw'] = false; // no checking is necessary for REST
            if (!is_array($url['info'])) {
                return PEAR::raiseError('Invalid remote dependencies retrieved from REST - ' .
                    'this should never happen');
            }

            if (isset($url['info']['required'])) {
                if (!class_exists('PEAR_PackageFile_v2')) {
                    require_once 'PEAR/PackageFile/v2.php';
                }
                $pf = new PEAR_PackageFile_v2;
                $pf->setRawChannel($remotechannel);
            } else {
                if (!class_exists('PEAR_PackageFile_v1')) {
                    require_once 'PEAR/PackageFile/v1.php';
                }
                $pf = new PEAR_PackageFile_v1;

            }
            $pf->setRawPackage($url['package']);
            $pf->setDeps($url['info']);
            if ($url['compatible']) {
                $pf->setCompatible($url['compatible']);
            }

            $pf->setRawState($url['stability']);
            $url['info'] = &$pf;
            if (!extension_loaded("zlib") || isset($this->_options['nocompress'])) {
                $ext = '.tar';
            } else {
                $ext = '.tgz';
            }

            if (is_array($url) && isset($url['url'])) {
                $url['url'] .= $ext;
            }

            return $url;
        }

        return $this->raiseError($parr['channel'] . ' is using a unsupported protocol - This should never happen.');
    }

    /**
     * @deprecated in favor of _getPackageDownloadUrl
     */
    function getPackageDownloadUrl($package, $version = null, $channel = false)
    {
        if ($version) {
            $package .= "-$version";
        }
        if ($this === null || $this->_registry === null) {
            $package = "http://pear.php.net/get/$package";
        } else {
            $chan = $this->_registry->getChannel($channel);
            if (PEAR::isError($chan)) {
                return '';
            }
            $package = "http://" . $chan->getServer() . "/get/$package";
        }
        if (!extension_loaded("zlib")) {
            $package .= '?uncompress=yes';
        }
        return $package;
    }

    /**
     * Retrieve a list of downloaded packages after a call to {@link download()}.
     *
     * Also resets the list of downloaded packages.
     * @return array
     */
    function getDownloadedPackages()
    {
        $ret = $this->_downloadedPackages;
        $this->_downloadedPackages = array();
        $this->_toDownload = array();
        return $ret;
    }

    function _downloadCallback($msg, $params = null)
    {
        switch ($msg) {
            case 'saveas':
                $this->log(1, "downloading $params ...");
                break;
            case 'done':
                $this->log(1, '...done: ' . number_format($params, 0, '', ',') . ' bytes');
                break;
            case 'bytesread':
                static $bytes;
                if (empty($bytes)) {
                    $bytes = 0;
                }
                if (!($bytes % 10240)) {
                    $this->log(1, '.', false);
                }
                $bytes += $params;
                break;
            case 'start':
                if($params[1] == -1) {
                    $length = "Unknown size";
                } else {
                    $length = number_format($params[1], 0, '', ',')." bytes";
                }
                $this->log(1, "Starting to download {$params[0]} ($length)");
                break;
        }
        if (method_exists($this->ui, '_downloadCallback'))
            $this->ui->_downloadCallback($msg, $params);
    }

    function _prependPath($path, $prepend)
    {
        if (strlen($prepend) > 0) {
            if (OS_WINDOWS && preg_match('/^[a-z]:/i', $path)) {
                if (preg_match('/^[a-z]:/i', $prepend)) {
                    $prepend = substr($prepend, 2);
                } elseif ($prepend[0] != '\\') {
                    $prepend = "\\$prepend";
                }
                $path = substr($path, 0, 2) . $prepend . substr($path, 2);
            } else {
                $path = $prepend . $path;
            }
        }
        return $path;
    }

    /**
     * @param string
     * @param integer
     */
    function pushError($errmsg, $code = -1)
    {
        array_push($this->_errorStack, array($errmsg, $code));
    }

    function getErrorMsgs()
    {
        $msgs = array();
        $errs = $this->_errorStack;
        foreach ($errs as $err) {
            $msgs[] = $err[0];
        }
        $this->_errorStack = array();
        return $msgs;
    }

    /**
     * for BC
     *
     * @deprecated
     */
    function sortPkgDeps(&$packages, $uninstall = false)
    {
        $uninstall ?
            $this->sortPackagesForUninstall($packages) :
            $this->sortPackagesForInstall($packages);
    }

    /**
     * Sort a list of arrays of array(downloaded packagefilename) by dependency.
     *
     * This uses the topological sort method from graph theory, and the
     * Structures_Graph package to properly sort dependencies for installation.
     * @param array an array of downloaded PEAR_Downloader_Packages
     * @return array array of array(packagefilename, package.xml contents)
     */
    function sortPackagesForInstall(&$packages)
    {
        require_once 'Structures/Graph.php';
        require_once 'Structures/Graph/Node.php';
        require_once 'Structures/Graph/Manipulator/TopologicalSorter.php';
        $depgraph = new Structures_Graph(true);
        $nodes = array();
        $reg = &$this->config->getRegistry();
        foreach ($packages as $i => $package) {
            $pname = $reg->parsedPackageNameToString(
                array(
                    'channel' => $package->getChannel(),
                    'package' => strtolower($package->getPackage()),
                ));
            $nodes[$pname] = new Structures_Graph_Node;
            $nodes[$pname]->setData($packages[$i]);
            $depgraph->addNode($nodes[$pname]);
        }

        $deplinks = array();
        foreach ($nodes as $package => $node) {
            $pf = &$node->getData();
            $pdeps = $pf->getDeps(true);
            if (!$pdeps) {
                continue;
            }

            if ($pf->getPackagexmlVersion() == '1.0') {
                foreach ($pdeps as $dep) {
                    if ($dep['type'] != 'pkg' ||
                          (isset($dep['optional']) && $dep['optional'] == 'yes')) {
                        continue;
                    }

                    $dname = $reg->parsedPackageNameToString(
                          array(
                              'channel' => 'pear.php.net',
                              'package' => strtolower($dep['name']),
                          ));

                    if (isset($nodes[$dname])) {
                        if (!isset($deplinks[$dname])) {
                            $deplinks[$dname] = array();
                        }

                        $deplinks[$dname][$package] = 1;
                        // dependency is in installed packages
                        continue;
                    }

                    $dname = $reg->parsedPackageNameToString(
                          array(
                              'channel' => 'pecl.php.net',
                              'package' => strtolower($dep['name']),
                          ));

                    if (isset($nodes[$dname])) {
                        if (!isset($deplinks[$dname])) {
                            $deplinks[$dname] = array();
                        }

                        $deplinks[$dname][$package] = 1;
                        // dependency is in installed packages
                        continue;
                    }
                }
            } else {
                // the only ordering we care about is:
                // 1) subpackages must be installed before packages that depend on them
                // 2) required deps must be installed before packages that depend on them
                if (isset($pdeps['required']['subpackage'])) {
                    $t = $pdeps['required']['subpackage'];
                    if (!isset($t[0])) {
                        $t = array($t);
                    }

                    $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);
                }

                if (isset($pdeps['group'])) {
                    if (!isset($pdeps['group'][0])) {
                        $pdeps['group'] = array($pdeps['group']);
                    }

                    foreach ($pdeps['group'] as $group) {
                        if (isset($group['subpackage'])) {
                            $t = $group['subpackage'];
                            if (!isset($t[0])) {
                                $t = array($t);
                            }

                            $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);
                        }
                    }
                }

                if (isset($pdeps['optional']['subpackage'])) {
                    $t = $pdeps['optional']['subpackage'];
                    if (!isset($t[0])) {
                        $t = array($t);
                    }

                    $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);
                }

                if (isset($pdeps['required']['package'])) {
                    $t = $pdeps['required']['package'];
                    if (!isset($t[0])) {
                        $t = array($t);
                    }

                    $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);
                }

                if (isset($pdeps['group'])) {
                    if (!isset($pdeps['group'][0])) {
                        $pdeps['group'] = array($pdeps['group']);
                    }

                    foreach ($pdeps['group'] as $group) {
                        if (isset($group['package'])) {
                            $t = $group['package'];
                            if (!isset($t[0])) {
                                $t = array($t);
                            }

                            $this->_setupGraph($t, $reg, $deplinks, $nodes, $package);
                        }
                    }
                }
            }
        }

        $this->_detectDepCycle($deplinks);
        foreach ($deplinks as $dependent => $parents) {
            foreach ($parents as $parent => $unused) {
                $nodes[$dependent]->connectTo($nodes[$parent]);
            }
        }

        $installOrder = Structures_Graph_Manipulator_TopologicalSorter::sort($depgraph);
        $ret = array();
        for ($i = 0, $count = count($installOrder); $i < $count; $i++) {
            foreach ($installOrder[$i] as $index => $sortedpackage) {
                $data = &$installOrder[$i][$index]->getData();
                $ret[] = &$nodes[$reg->parsedPackageNameToString(
                          array(
                              'channel' => $data->getChannel(),
                              'package' => strtolower($data->getPackage()),
                          ))]->getData();
            }
        }

        $packages = $ret;
        return;
    }

    /**
     * Detect recursive links between dependencies and break the cycles
     *
     * @param array
     * @access private
     */
    function _detectDepCycle(&$deplinks)
    {
        do {
            $keepgoing = false;
            foreach ($deplinks as $dep => $parents) {
                foreach ($parents as $parent => $unused) {
                    // reset the parent cycle detector
                    $this->_testCycle(null, null, null);
                    if ($this->_testCycle($dep, $deplinks, $parent)) {
                        $keepgoing = true;
                        unset($deplinks[$dep][$parent]);
                        if (count($deplinks[$dep]) == 0) {
                            unset($deplinks[$dep]);
                        }

                        continue 3;
                    }
                }
            }
        } while ($keepgoing);
    }

    function _testCycle($test, $deplinks, $dep)
    {
        static $visited = array();
        if ($test === null) {
            $visited = array();
            return;
        }

        // this happens when a parent has a dep cycle on another dependency
        // but the child is not part of the cycle
        if (isset($visited[$dep])) {
            return false;
        }

        $visited[$dep] = 1;
        if ($test == $dep) {
            return true;
        }

        if (isset($deplinks[$dep])) {
            if (in_array($test, array_keys($deplinks[$dep]), true)) {
                return true;
            }

            foreach ($deplinks[$dep] as $parent => $unused) {
                if ($this->_testCycle($test, $deplinks, $parent)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Set up the dependency for installation parsing
     *
     * @param array $t dependency information
     * @param PEAR_Registry $reg
     * @param array $deplinks list of dependency links already established
     * @param array $nodes all existing package nodes
     * @param string $package parent package name
     * @access private
     */
    function _setupGraph($t, $reg, &$deplinks, &$nodes, $package)
    {
        foreach ($t as $dep) {
            $depchannel = !isset($dep['channel']) ? '__uri': $dep['channel'];
            $dname = $reg->parsedPackageNameToString(
                  array(
                      'channel' => $depchannel,
                      'package' => strtolower($dep['name']),
                  ));

            if (isset($nodes[$dname])) {
                if (!isset($deplinks[$dname])) {
                    $deplinks[$dname] = array();
                }
                $deplinks[$dname][$package] = 1;
            }
        }
    }

    function _dependsOn($a, $b)
    {
        return $this->_checkDepTree(strtolower($a->getChannel()), strtolower($a->getPackage()), $b);
    }

    function _checkDepTree($channel, $package, $b, $checked = array())
    {
        $checked[$channel][$package] = true;
        if (!isset($this->_depTree[$channel][$package])) {
            return false;
        }

        if (isset($this->_depTree[$channel][$package][strtolower($b->getChannel())]
              [strtolower($b->getPackage())])) {
            return true;
        }

        foreach ($this->_depTree[$channel][$package] as $ch => $packages) {
            foreach ($packages as $pa => $true) {
                if ($this->_checkDepTree($ch, $pa, $b, $checked)) {
                    return true;
                }
            }
        }

        return false;
    }

    function _sortInstall($a, $b)
    {
        if (!$a->getDeps() && !$b->getDeps()) {
            return 0; // neither package has dependencies, order is insignificant
        }
        if ($a->getDeps() && !$b->getDeps()) {
            return 1; // $a must be installed after $b because $a has dependencies
        }
        if (!$a->getDeps() && $b->getDeps()) {
            return -1; // $b must be installed after $a because $b has dependencies
        }
        // both packages have dependencies
        if ($this->_dependsOn($a, $b)) {
            return 1;
        }
        if ($this->_dependsOn($b, $a)) {
            return -1;
        }
        return 0;
    }

    /**
     * Download a file through HTTP.  Considers suggested file name in
     * Content-disposition: header and can run a callback function for
     * different events.  The callback will be called with two
     * parameters: the callback type, and parameters.  The implemented
     * callback types are:
     *
     *  'setup'       called at the very beginning, parameter is a UI object
     *                that should be used for all output
     *  'message'     the parameter is a string with an informational message
     *  'saveas'      may be used to save with a different file name, the
     *                parameter is the filename that is about to be used.
     *                If a 'saveas' callback returns a non-empty string,
     *                that file name will be used as the filename instead.
     *                Note that $save_dir will not be affected by this, only
     *                the basename of the file.
     *  'start'       download is starting, parameter is number of bytes
     *                that are expected, or -1 if unknown
     *  'bytesread'   parameter is the number of bytes read so far
     *  'done'        download is complete, parameter is the total number
     *                of bytes read
     *  'connfailed'  if the TCP/SSL connection fails, this callback is called
     *                with array(host,port,errno,errmsg)
     *  'writefailed' if writing to disk fails, this callback is called
     *                with array(destfile,errmsg)
     *
     * If an HTTP proxy has been configured (http_proxy PEAR_Config
     * setting), the proxy will be used.
     *
     * @param string  $url       the URL to download
     * @param object  $ui        PEAR_Frontend_* instance
     * @param object  $config    PEAR_Config instance
     * @param string  $save_dir  directory to save file in
     * @param mixed   $callback  function/method to call for status
     *                           updates
     * @param false|string|array $lastmodified header values to check against for caching
     *                           use false to return the header values from this download
     * @param false|array $accept Accept headers to send
     * @param false|string $channel Channel to use for retrieving authentication
     * @return mixed  Returns the full path of the downloaded file or a PEAR
     *                error on failure.  If the error is caused by
     *                socket-related errors, the error object will
     *                have the fsockopen error code available through
     *                getCode().  If caching is requested, then return the header
     *                values.
     *                If $lastmodified was given and the there are no changes,
     *                boolean false is returned.
     *
     * @access public
     */
    public static function _downloadHttp(
        $object, $url, &$ui, $save_dir = '.', $callback = null, $lastmodified = null,
        $accept = false, $channel = false
    ) {
        static $redirect = 0;
        // always reset , so we are clean case of error
        $wasredirect = $redirect;
        $redirect = 0;
        if ($callback) {
            call_user_func($callback, 'setup', array(&$ui));
        }

        $info = parse_url($url);
        if (!isset($info['scheme']) || !in_array($info['scheme'], array('http', 'https'))) {
            return PEAR::raiseError('Cannot download non-http URL "' . $url . '"');
        }

        if (!isset($info['host'])) {
            return PEAR::raiseError('Cannot download from non-URL "' . $url . '"');
        }

        $host = isset($info['host']) ? $info['host'] : null;
        $port = isset($info['port']) ? $info['port'] : null;
        $path = isset($info['path']) ? $info['path'] : null;

        if ($object !== null) {
            $config = $object->config;
        } else {
            $config = &PEAR_Config::singleton();
        }

        $proxy = new PEAR_Proxy($config);

        if ($proxy->isProxyConfigured() && $callback) {
            call_user_func($callback, 'message', "Using HTTP proxy $host:$port");
        }

        if (empty($port)) {
            $port = (isset($info['scheme']) && $info['scheme'] == 'https') ? 443 : 80;
        }

        $scheme = (isset($info['scheme']) && $info['scheme'] == 'https') ? 'https' : 'http';
        $secure = ($scheme == 'https');

        $fp = $proxy->openSocket($host, $port, $secure);
        if (PEAR::isError($fp)) {
            if ($callback) {
                $errno = $fp->getCode();
                $errstr = $fp->getMessage();
                call_user_func($callback, 'connfailed', array($host, $port,
                                                              $errno, $errstr));
            }
            return $fp;
        }

        $requestPath = $path;
        if ($proxy->isProxyConfigured()) {
            $requestPath = $url;
        }

        if ($lastmodified === false || $lastmodified) {
            $request  = "GET $requestPath HTTP/1.1\r\n";
        } else {
            $request  = "GET $requestPath HTTP/1.0\r\n";
        }
        $request .= "Host: $host\r\n";

        $ifmodifiedsince = '';
        if (is_array($lastmodified)) {
            if (isset($lastmodified['Last-Modified'])) {
                $ifmodifiedsince = 'If-Modified-Since: ' . $lastmodified['Last-Modified'] . "\r\n";
            }

            if (isset($lastmodified['ETag'])) {
                $ifmodifiedsince .= "If-None-Match: $lastmodified[ETag]\r\n";
            }
        } else {
            $ifmodifiedsince = ($lastmodified ? "If-Modified-Since: $lastmodified\r\n" : '');
        }

        $request .= $ifmodifiedsince .
            "User-Agent: PEAR/1.10.16/PHP/" . PHP_VERSION . "\r\n";

        if ($object !== null) { // only pass in authentication for non-static calls
            $username = $config->get('username', null, $channel);
            $password = $config->get('password', null, $channel);
            if ($username && $password) {
                $tmp = base64_encode("$username:$password");
                $request .= "Authorization: Basic $tmp\r\n";
            }
        }

        $proxyAuth = $proxy->getProxyAuth();
        if ($proxyAuth) {
            $request .= 'Proxy-Authorization: Basic ' .
                $proxyAuth . "\r\n";
        }

        if ($accept) {
            $request .= 'Accept: ' . implode(', ', $accept) . "\r\n";
        }

        $request .= "Connection: close\r\n";
        $request .= "\r\n";
        fwrite($fp, $request);
        $headers = array();
        $reply = 0;
        while (trim($line = fgets($fp, 1024))) {
            if (preg_match('/^([^:]+):\s+(.*)\s*\\z/', $line, $matches)) {
                $headers[strtolower($matches[1])] = trim($matches[2]);
            } elseif (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) {
                $reply = (int)$matches[1];
                if ($reply == 304 && ($lastmodified || ($lastmodified === false))) {
                    return false;
                }

                if (!in_array($reply, array(200, 301, 302, 303, 305, 307))) {
                    return PEAR::raiseError("File $scheme://$host:$port$path not valid (received: $line)");
                }
            }
        }

        if ($reply != 200) {
            if (!isset($headers['location'])) {
                return PEAR::raiseError("File $scheme://$host:$port$path not valid (redirected but no location)");
            }

            if ($wasredirect > 4) {
                return PEAR::raiseError("File $scheme://$host:$port$path not valid (redirection looped more than 5 times)");
            }

            $redirect = $wasredirect + 1;
            return static::_downloadHttp($object, $headers['location'],
                    $ui, $save_dir, $callback, $lastmodified, $accept);
        }

        if (isset($headers['content-disposition']) &&
            preg_match('/\sfilename=\"([^;]*\S)\"\s*(;|\\z)/', $headers['content-disposition'], $matches)) {
            $save_as = basename($matches[1]);
        } else {
            $save_as = basename($url);
        }

        if ($callback) {
            $tmp = call_user_func($callback, 'saveas', $save_as);
            if ($tmp) {
                $save_as = $tmp;
            }
        }

        $dest_file = $save_dir . DIRECTORY_SEPARATOR . $save_as;
        if (is_link($dest_file)) {
            return PEAR::raiseError('SECURITY ERROR: Will not write to ' . $dest_file . ' as it is symlinked to ' . readlink($dest_file) . ' - Possible symlink attack');
        }

        if (!$wp = @fopen($dest_file, 'wb')) {
            fclose($fp);
            if ($callback) {
                call_user_func($callback, 'writefailed',
                    array($dest_file, error_get_last()["message"]));
            }
            return PEAR::raiseError("could not open $dest_file for writing");
        }

        $length = isset($headers['content-length']) ? $headers['content-length'] : -1;

        $bytes = 0;
        if ($callback) {
            call_user_func($callback, 'start', array(basename($dest_file), $length));
        }

        while ($data = fread($fp, 1024)) {
            $bytes += strlen($data);
            if ($callback) {
                call_user_func($callback, 'bytesread', $bytes);
            }
            if (!@fwrite($wp, $data)) {
                fclose($fp);
                if ($callback) {
                    call_user_func($callback, 'writefailed',
                        array($dest_file, error_get_last()["message"]));
                }
                return PEAR::raiseError(
                    "$dest_file: write failed (" . error_get_last()["message"] . ")");
            }
        }

        fclose($fp);
        fclose($wp);
        if ($callback) {
            call_user_func($callback, 'done', $bytes);
        }

        if ($lastmodified === false || $lastmodified) {
            if (isset($headers['etag'])) {
                $lastmodified = array('ETag' => $headers['etag']);
            }

            if (isset($headers['last-modified'])) {
                if (is_array($lastmodified)) {
                    $lastmodified['Last-Modified'] = $headers['last-modified'];
                } else {
                    $lastmodified = $headers['last-modified'];
                }
            }
            return array($dest_file, $lastmodified, $headers);
        }
        return $dest_file;
    }
}
PK�a�\.�4���pear/PEAR/Frontend.phpnu�[���<?php
/**
 * PEAR_Frontend, the singleton-based frontend for user input/output
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Include error handling
 */
//require_once 'PEAR.php';

/**
 * Which user interface class is being used.
 * @var string class name
 */
$GLOBALS['_PEAR_FRONTEND_CLASS'] = 'PEAR_Frontend_CLI';

/**
 * Instance of $_PEAR_Command_uiclass.
 * @var object
 */
$GLOBALS['_PEAR_FRONTEND_SINGLETON'] = null;

/**
 * Singleton-based frontend for PEAR user input/output
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Frontend extends PEAR
{
    /**
     * Retrieve the frontend object
     * @return PEAR_Frontend_CLI|PEAR_Frontend_Web|PEAR_Frontend_Gtk
     */
    public static function &singleton($type = null)
    {
        if ($type === null) {
            if (!isset($GLOBALS['_PEAR_FRONTEND_SINGLETON'])) {
                $a = false;
                return $a;
            }
            return $GLOBALS['_PEAR_FRONTEND_SINGLETON'];
        }

        $a = PEAR_Frontend::setFrontendClass($type);
        return $a;
    }

    /**
     * Set the frontend class that will be used by calls to {@link singleton()}
     *
     * Frontends are expected to conform to the PEAR naming standard of
     * _ => DIRECTORY_SEPARATOR (PEAR_Frontend_CLI is in PEAR/Frontend/CLI.php)
     * @param string $uiclass full class name
     * @return PEAR_Frontend
     */
    public static function &setFrontendClass($uiclass)
    {
        if (is_object($GLOBALS['_PEAR_FRONTEND_SINGLETON']) &&
              is_a($GLOBALS['_PEAR_FRONTEND_SINGLETON'], $uiclass)) {
            return $GLOBALS['_PEAR_FRONTEND_SINGLETON'];
        }

        if (!class_exists($uiclass)) {
            $file = str_replace('_', '/', $uiclass) . '.php';
            if (PEAR_Frontend::isIncludeable($file)) {
                include_once $file;
            }
        }

        if (class_exists($uiclass)) {
            $obj = new $uiclass;
            // quick test to see if this class implements a few of the most
            // important frontend methods
            if (is_a($obj, 'PEAR_Frontend')) {
                $GLOBALS['_PEAR_FRONTEND_SINGLETON'] = &$obj;
                $GLOBALS['_PEAR_FRONTEND_CLASS'] = $uiclass;
                return $obj;
            }

            $err = PEAR::raiseError("not a frontend class: $uiclass");
            return $err;
        }

        $err = PEAR::raiseError("no such class: $uiclass");
        return $err;
    }

    /**
     * Set the frontend class that will be used by calls to {@link singleton()}
     *
     * Frontends are expected to be a descendant of PEAR_Frontend
     * @param PEAR_Frontend
     * @return PEAR_Frontend
     */
    public static function &setFrontendObject($uiobject)
    {
        if (is_object($GLOBALS['_PEAR_FRONTEND_SINGLETON']) &&
              is_a($GLOBALS['_PEAR_FRONTEND_SINGLETON'], get_class($uiobject))) {
            return $GLOBALS['_PEAR_FRONTEND_SINGLETON'];
        }

        if (!is_a($uiobject, 'PEAR_Frontend')) {
            $err = PEAR::raiseError('not a valid frontend class: (' .
                get_class($uiobject) . ')');
            return $err;
        }

        $GLOBALS['_PEAR_FRONTEND_SINGLETON'] = &$uiobject;
        $GLOBALS['_PEAR_FRONTEND_CLASS'] = get_class($uiobject);
        return $uiobject;
    }

    /**
     * @param string $path relative or absolute include path
     * @return boolean
     */
    public static function isIncludeable($path)
    {
        if (file_exists($path) && is_readable($path)) {
            return true;
        }

        $fp = @fopen($path, 'r', true);
        if ($fp) {
            fclose($fp);
            return true;
        }

        return false;
    }

    /**
     * @param PEAR_Config
     */
    function setConfig(&$config)
    {
    }

    /**
     * This can be overridden to allow session-based temporary file management
     *
     * By default, all files are deleted at the end of a session.  The web installer
     * needs to be able to sustain a list over many sessions in order to support
     * user interaction with install scripts
     */
    static function addTempFile($file)
    {
        $GLOBALS['_PEAR_Common_tempfiles'][] = $file;
    }

    /**
     * Log an action
     *
     * @param string $msg the message to log
     * @param boolean $append_crlf
     * @return boolean true
     * @abstract
     */
    function log($msg, $append_crlf = true)
    {
    }

    /**
     * Run a post-installation script
     *
     * @param array $scripts array of post-install scripts
     * @abstract
     */
    function runPostinstallScripts(&$scripts)
    {
    }

    /**
     * Display human-friendly output formatted depending on the
     * $command parameter.
     *
     * This should be able to handle basic output data with no command
     * @param mixed  $data    data structure containing the information to display
     * @param string $command command from which this method was called
     * @abstract
     */
    function outputData($data, $command = '_default')
    {
    }

    /**
     * Display a modal form dialog and return the given input
     *
     * A frontend that requires multiple requests to retrieve and process
     * data must take these needs into account, and implement the request
     * handling code.
     * @param string $command  command from which this method was called
     * @param array  $prompts  associative array. keys are the input field names
     *                         and values are the description
     * @param array  $types    array of input field types (text, password,
     *                         etc.) keys have to be the same like in $prompts
     * @param array  $defaults array of default values. again keys have
     *                         to be the same like in $prompts.  Do not depend
     *                         on a default value being set.
     * @return array input sent by the user
     * @abstract
     */
    function userDialog($command, $prompts, $types = array(), $defaults = array())
    {
    }
}
PK�a�\��	MdMdpear/PEAR/Frontend/CLI.phpnu�[���<?php
/**
 * PEAR_Frontend_CLI
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */
/**
 * base class
 */
require_once 'PEAR/Frontend.php';

/**
 * Command-line Frontend for the PEAR Installer
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Frontend_CLI extends PEAR_Frontend
{
    /**
     * What type of user interface this frontend is for.
     * @var string
     * @access public
     */
    var $type = 'CLI';
    var $lp = ''; // line prefix

    var $params = array();
    var $term = array(
        'bold'   => '',
        'normal' => '',
    );

    function __construct()
    {
        parent::__construct();
        $term = getenv('TERM'); //(cox) $_ENV is empty for me in 4.1.1
        if (function_exists('posix_isatty') && !posix_isatty(1)) {
            // output is being redirected to a file or through a pipe
        } elseif ($term) {
            if (preg_match('/^(xterm|vt220|linux)/', $term)) {
                $this->term['bold']   = sprintf("%c%c%c%c", 27, 91, 49, 109);
                $this->term['normal'] = sprintf("%c%c%c", 27, 91, 109);
            } elseif (preg_match('/^vt100/', $term)) {
                $this->term['bold']   = sprintf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0);
                $this->term['normal'] = sprintf("%c%c%c%c%c", 27, 91, 109, 0, 0);
            }
        } elseif (OS_WINDOWS) {
            // XXX add ANSI codes here
        }
    }

    /**
     * @param object PEAR_Error object
     */
    function displayError($e)
    {
        return $this->_displayLine($e->getMessage());
    }

    /**
     * @param object PEAR_Error object
     */
    function displayFatalError($eobj)
    {
        $this->displayError($eobj);
        if (class_exists('PEAR_Config')) {
            $config = &PEAR_Config::singleton();
            if ($config->get('verbose') > 5) {
                if (function_exists('debug_print_backtrace')) {
                    debug_print_backtrace();
                    exit(1);
                }

                $raised = false;
                foreach (debug_backtrace() as $i => $frame) {
                    if (!$raised) {
                        if (isset($frame['class'])
                            && strtolower($frame['class']) == 'pear'
                            && strtolower($frame['function']) == 'raiseerror'
                        ) {
                            $raised = true;
                        } else {
                            continue;
                        }
                    }

                    $frame['class']    = !isset($frame['class'])    ? '' : $frame['class'];
                    $frame['type']     = !isset($frame['type'])     ? '' : $frame['type'];
                    $frame['function'] = !isset($frame['function']) ? '' : $frame['function'];
                    $frame['line']     = !isset($frame['line'])     ? '' : $frame['line'];
                    $this->_displayLine("#$i: $frame[class]$frame[type]$frame[function] $frame[line]");
                }
            }
        }

        exit(1);
    }

    /**
     * Instruct the runInstallScript method to skip a paramgroup that matches the
     * id value passed in.
     *
     * This method is useful for dynamically configuring which sections of a post-install script
     * will be run based on the user's setup, which is very useful for making flexible
     * post-install scripts without losing the cross-Frontend ability to retrieve user input
     * @param string
     */
    function skipParamgroup($id)
    {
        $this->_skipSections[$id] = true;
    }

    function runPostinstallScripts(&$scripts)
    {
        foreach ($scripts as $i => $script) {
            $this->runInstallScript($scripts[$i]->_params, $scripts[$i]->_obj);
        }
    }

    /**
     * @param array $xml contents of postinstallscript tag
     * @param object $script post-installation script
     * @param string install|upgrade
     */
    function runInstallScript($xml, &$script)
    {
        $this->_skipSections = array();
        if (!is_array($xml) || !isset($xml['paramgroup'])) {
            $script->run(array(), '_default');
            return;
        }

        $completedPhases = array();
        if (!isset($xml['paramgroup'][0])) {
            $xml['paramgroup'] = array($xml['paramgroup']);
        }

        foreach ($xml['paramgroup'] as $group) {
            if (isset($this->_skipSections[$group['id']])) {
                // the post-install script chose to skip this section dynamically
                continue;
            }

            if (isset($group['name'])) {
                $paramname = explode('::', $group['name']);
                if ($lastgroup['id'] != $paramname[0]) {
                    continue;
                }

                $group['name'] = $paramname[1];
                if (!isset($answers)) {
                    return;
                }

                if (isset($answers[$group['name']])) {
                    switch ($group['conditiontype']) {
                        case '=' :
                            if ($answers[$group['name']] != $group['value']) {
                                continue 2;
                            }
                        break;
                        case '!=' :
                            if ($answers[$group['name']] == $group['value']) {
                                continue 2;
                            }
                        break;
                        case 'preg_match' :
                            if (!@preg_match('/' . $group['value'] . '/',
                                  $answers[$group['name']])) {
                                continue 2;
                            }
                        break;
                        default :
                        return;
                    }
                }
            }

            $lastgroup = $group;
            if (isset($group['instructions'])) {
                $this->_display($group['instructions']);
            }

            if (!isset($group['param'][0])) {
                $group['param'] = array($group['param']);
            }

            if (isset($group['param'])) {
                if (method_exists($script, 'postProcessPrompts')) {
                    $prompts = $script->postProcessPrompts($group['param'], $group['id']);
                    if (!is_array($prompts) || count($prompts) != count($group['param'])) {
                        $this->outputData('postinstall', 'Error: post-install script did not ' .
                            'return proper post-processed prompts');
                        $prompts = $group['param'];
                    } else {
                        foreach ($prompts as $i => $var) {
                            if (!is_array($var) || !isset($var['prompt']) ||
                                  !isset($var['name']) ||
                                  ($var['name'] != $group['param'][$i]['name']) ||
                                  ($var['type'] != $group['param'][$i]['type'])
                            ) {
                                $this->outputData('postinstall', 'Error: post-install script ' .
                                    'modified the variables or prompts, severe security risk. ' .
                                    'Will instead use the defaults from the package.xml');
                                $prompts = $group['param'];
                            }
                        }
                    }

                    $answers = $this->confirmDialog($prompts);
                } else {
                    $answers = $this->confirmDialog($group['param']);
                }
            }

            if ((isset($answers) && $answers) || !isset($group['param'])) {
                if (!isset($answers)) {
                    $answers = array();
                }

                array_unshift($completedPhases, $group['id']);
                if (!$script->run($answers, $group['id'])) {
                    $script->run($completedPhases, '_undoOnError');
                    return;
                }
            } else {
                $script->run($completedPhases, '_undoOnError');
                return;
            }
        }
    }

    /**
     * Ask for user input, confirm the answers and continue until the user is satisfied
     * @param array an array of arrays, format array('name' => 'paramname', 'prompt' =>
     *              'text to display', 'type' => 'string'[, default => 'default value'])
     * @return array
     */
    function confirmDialog($params)
    {
        $answers = $prompts = $types = array();
        foreach ($params as $param) {
            $prompts[$param['name']] = $param['prompt'];
            $types[$param['name']]   = $param['type'];
            $answers[$param['name']] = isset($param['default']) ? $param['default'] : '';
        }

        $tried = false;
        do {
            if ($tried) {
                $i = 1;
                foreach ($answers as $var => $value) {
                    if (!strlen($value)) {
                        echo $this->bold("* Enter an answer for #" . $i . ": ({$prompts[$var]})\n");
                    }
                    $i++;
                }
            }

            $answers = $this->userDialog('', $prompts, $types, $answers);
            $tried   = true;
        } while (is_array($answers) && count(array_filter($answers)) != count($prompts));

        return $answers;
    }

    function userDialog($command, $prompts, $types = array(), $defaults = array(), $screensize = 20)
    {
        if (!is_array($prompts)) {
            return array();
        }

        $testprompts = array_keys($prompts);
        $result      = $defaults;

        reset($prompts);
        if (count($prompts) === 1) {
            foreach ($prompts as $key => $prompt) {
                $type    = $types[$key];
                $default = @$defaults[$key];
                print "$prompt ";
                if ($default) {
                    print "[$default] ";
                }
                print ": ";

                $line         = fgets(STDIN, 2048);
                $result[$key] =  ($default && trim($line) == '') ? $default : trim($line);
            }

            return $result;
        }

        $first_run = true;
        while (true) {
            $descLength = max(array_map('strlen', $prompts));
            $descFormat = "%-{$descLength}s";
            $last       = count($prompts);

            $i = 0;
            foreach ($prompts as $n => $var) {
                $res = isset($result[$n]) ? $result[$n] : null;
                printf("%2d. $descFormat : %s\n", ++$i, $prompts[$n], $res);
            }
            print "\n1-$last, 'all', 'abort', or Enter to continue: ";

            $tmp = trim(fgets(STDIN, 1024));
            if (empty($tmp)) {
                break;
            }

            if ($tmp == 'abort') {
                return false;
            }

            if (isset($testprompts[(int)$tmp - 1])) {
                $var     = $testprompts[(int)$tmp - 1];
                $desc    = $prompts[$var];
                $current = @$result[$var];
                print "$desc [$current] : ";
                $tmp = trim(fgets(STDIN, 1024));
                if ($tmp !== '') {
                    $result[$var] = $tmp;
                }
            } elseif ($tmp == 'all') {
                foreach ($prompts as $var => $desc) {
                    $current = $result[$var];
                    print "$desc [$current] : ";
                    $tmp = trim(fgets(STDIN, 1024));
                    if (trim($tmp) !== '') {
                        $result[$var] = trim($tmp);
                    }
                }
            }

            $first_run = false;
        }

        return $result;
    }

    function userConfirm($prompt, $default = 'yes')
    {
        trigger_error("PEAR_Frontend_CLI::userConfirm not yet converted", E_USER_ERROR);
        static $positives = array('y', 'yes', 'on', '1');
        static $negatives = array('n', 'no', 'off', '0');
        print "$this->lp$prompt [$default] : ";
        $fp = fopen("php://stdin", "r");
        $line = fgets($fp, 2048);
        fclose($fp);
        $answer = strtolower(trim($line));
        if (empty($answer)) {
            $answer = $default;
        }
        if (in_array($answer, $positives)) {
            return true;
        }
        if (in_array($answer, $negatives)) {
            return false;
        }
        if (in_array($default, $positives)) {
            return true;
        }
        return false;
    }

    function outputData($data, $command = '_default')
    {
        switch ($command) {
            case 'channel-info':
                foreach ($data as $type => $section) {
                    if ($type == 'main') {
                        $section['data'] = array_values($section['data']);
                    }

                    $this->outputData($section);
                }
                break;
            case 'install':
            case 'upgrade':
            case 'upgrade-all':
                if (is_array($data) && isset($data['release_warnings'])) {
                    $this->_displayLine('');
                    $this->_startTable(array(
                        'border' => false,
                        'caption' => 'Release Warnings'
                    ));
                    $this->_tableRow(array($data['release_warnings']), null, array(1 => array('wrap' => 55)));
                    $this->_endTable();
                    $this->_displayLine('');
                }

                $this->_displayLine(is_array($data) ? $data['data'] : $data);
                break;
            case 'search':
                $this->_startTable($data);
                if (isset($data['headline']) && is_array($data['headline'])) {
                    $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55)));
                }

                $packages = array();
                foreach($data['data'] as $category) {
                    foreach($category as $name => $pkg) {
                        $packages[$pkg[0]] = $pkg;
                    }
                }

                $p = array_keys($packages);
                natcasesort($p);
                foreach ($p as $name) {
                    $this->_tableRow($packages[$name], null, array(1 => array('wrap' => 55)));
                }

                $this->_endTable();
                break;
            case 'list-all':
                if (!isset($data['data'])) {
                      $this->_displayLine('No packages in channel');
                      break;
                }

                $this->_startTable($data);
                if (isset($data['headline']) && is_array($data['headline'])) {
                    $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55)));
                }

                $packages = array();
                foreach($data['data'] as $category) {
                    foreach($category as $name => $pkg) {
                        $packages[$pkg[0]] = $pkg;
                    }
                }

                $p = array_keys($packages);
                natcasesort($p);
                foreach ($p as $name) {
                    $pkg = $packages[$name];
                    unset($pkg[4], $pkg[5]);
                    $this->_tableRow($pkg, null, array(1 => array('wrap' => 55)));
                }

                $this->_endTable();
                break;
            case 'config-show':
                $data['border'] = false;
                $opts = array(
                    0 => array('wrap' => 30),
                    1 => array('wrap' => 20),
                    2 => array('wrap' => 35)
                );

                $this->_startTable($data);
                if (isset($data['headline']) && is_array($data['headline'])) {
                    $this->_tableRow($data['headline'], array('bold' => true), $opts);
                }

                foreach ($data['data'] as $group) {
                    foreach ($group as $value) {
                        if ($value[2] == '') {
                            $value[2] = "<not set>";
                        }

                        $this->_tableRow($value, null, $opts);
                    }
                }

                $this->_endTable();
                break;
            case 'remote-info':
                $d = $data;
                $data = array(
                    'caption' => 'Package details:',
                    'border'  => false,
                    'data'    => array(
                        array("Latest",      $data['stable']),
                        array("Installed",   $data['installed']),
                        array("Package",     $data['name']),
                        array("License",     $data['license']),
                        array("Category",    $data['category']),
                        array("Summary",     $data['summary']),
                        array("Description", $data['description']),
                    ),
                );

                if (isset($d['deprecated']) && $d['deprecated']) {
                    $conf = &PEAR_Config::singleton();
                    $reg = $conf->getRegistry();
                    $name = $reg->parsedPackageNameToString($d['deprecated'], true);
                    $data['data'][] = array('Deprecated! use', $name);
                }
            default: {
                if (is_array($data)) {
                    $this->_startTable($data);
                    $count = count($data['data'][0]);
                    if ($count == 2) {
                        $opts = array(0 => array('wrap' => 25),
                                      1 => array('wrap' => 48)
                        );
                    } elseif ($count == 3) {
                        $opts = array(0 => array('wrap' => 30),
                                      1 => array('wrap' => 20),
                                      2 => array('wrap' => 35)
                        );
                    } else {
                        $opts = null;
                    }
                    if (isset($data['headline']) && is_array($data['headline'])) {
                        $this->_tableRow($data['headline'],
                                         array('bold' => true),
                                         $opts);
                    }

                    if (is_array($data['data'])) {
                        foreach($data['data'] as $row) {
                            $this->_tableRow($row, null, $opts);
                        }
                    } else {
                        $this->_tableRow(array($data['data']), null, $opts);
                     }
                    $this->_endTable();
                } else {
                    $this->_displayLine($data);
                }
            }
        }
    }

    function log($text, $append_crlf = true)
    {
        if ($append_crlf) {
            return $this->_displayLine($text);
        }

        return $this->_display($text);
    }

    function bold($text)
    {
        if (empty($this->term['bold'])) {
            return strtoupper($text);
        }

        return $this->term['bold'] . $text . $this->term['normal'];
    }

    function _displayHeading($title)
    {
        print $this->lp.$this->bold($title)."\n";
        print $this->lp.str_repeat("=", strlen($title))."\n";
    }

    function _startTable($params = array())
    {
        $params['table_data'] = array();
        $params['widest']     = array();  // indexed by column
        $params['highest']    = array(); // indexed by row
        $params['ncols']      = 0;
        $this->params         = $params;
    }

    function _tableRow($columns, $rowparams = array(), $colparams = array())
    {
        $highest = 1;
        for ($i = 0; $i < count($columns); $i++) {
            $col = &$columns[$i];
            if (isset($colparams[$i]) && !empty($colparams[$i]['wrap'])) {
                $col = wordwrap($col, $colparams[$i]['wrap']);
            }

            if (strpos($col, "\n") !== false) {
                $multiline = explode("\n", $col);
                $w = 0;
                foreach ($multiline as $n => $line) {
                    $len = strlen($line);
                    if ($len > $w) {
                        $w = $len;
                    }
                }
                $lines = count($multiline);
            } else {
                $w = strlen($col);
            }

            if (isset($this->params['widest'][$i])) {
                if ($w > $this->params['widest'][$i]) {
                    $this->params['widest'][$i] = $w;
                }
            } else {
                $this->params['widest'][$i] = $w;
            }

            $tmp = count_chars($columns[$i], 1);
            // handle unix, mac and windows formats
            $lines = (isset($tmp[10]) ? $tmp[10] : (isset($tmp[13]) ? $tmp[13] : 0)) + 1;
            if ($lines > $highest) {
                $highest = $lines;
            }
        }

        if (count($columns) > $this->params['ncols']) {
            $this->params['ncols'] = count($columns);
        }

        $new_row = array(
            'data'      => $columns,
            'height'    => $highest,
            'rowparams' => $rowparams,
            'colparams' => $colparams,
        );
        $this->params['table_data'][] = $new_row;
    }

    function _endTable()
    {
        extract($this->params);
        if (!empty($caption)) {
            $this->_displayHeading($caption);
        }

        if (count($table_data) === 0) {
            return;
        }

        if (!isset($width)) {
            $width = $widest;
        } else {
            for ($i = 0; $i < $ncols; $i++) {
                if (!isset($width[$i])) {
                    $width[$i] = $widest[$i];
                }
            }
        }

        $border = false;
        if (empty($border)) {
            $cellstart  = '';
            $cellend    = ' ';
            $rowend     = '';
            $padrowend  = false;
            $borderline = '';
        } else {
            $cellstart  = '| ';
            $cellend    = ' ';
            $rowend     = '|';
            $padrowend  = true;
            $borderline = '+';
            foreach ($width as $w) {
                $borderline .= str_repeat('-', $w + strlen($cellstart) + strlen($cellend) - 1);
                $borderline .= '+';
            }
        }

        if ($borderline) {
            $this->_displayLine($borderline);
        }

        for ($i = 0; $i < count($table_data); $i++) {
            extract($table_data[$i]);
            if (!is_array($rowparams)) {
                $rowparams = array();
            }

            if (!is_array($colparams)) {
                $colparams = array();
            }

            $rowlines = array();
            if ($height > 1) {
                for ($c = 0; $c < count($data); $c++) {
                    $rowlines[$c] = preg_split('/(\r?\n|\r)/', $data[$c]);
                    if (count($rowlines[$c]) < $height) {
                        $rowlines[$c] = array_pad($rowlines[$c], $height, '');
                    }
                }
            } else {
                for ($c = 0; $c < count($data); $c++) {
                    $rowlines[$c] = array($data[$c]);
                }
            }

            for ($r = 0; $r < $height; $r++) {
                $rowtext = '';
                for ($c = 0; $c < count($data); $c++) {
                    if (isset($colparams[$c])) {
                        $attribs = array_merge($rowparams, $colparams);
                    } else {
                        $attribs = $rowparams;
                    }

                    $w = isset($width[$c]) ? $width[$c] : 0;
                    //$cell = $data[$c];
                    $cell = $rowlines[$c][$r];
                    $l = strlen($cell);
                    if ($l > $w) {
                        $cell = substr($cell, 0, $w);
                    }

                    if (isset($attribs['bold'])) {
                        $cell = $this->bold($cell);
                    }

                    if ($l < $w) {
                        // not using str_pad here because we may
                        // add bold escape characters to $cell
                        $cell .= str_repeat(' ', $w - $l);
                    }

                    $rowtext .= $cellstart . $cell . $cellend;
                }

                if (!$border) {
                    $rowtext = rtrim($rowtext);
                }

                $rowtext .= $rowend;
                $this->_displayLine($rowtext);
            }
        }

        if ($borderline) {
            $this->_displayLine($borderline);
        }
    }

    function _displayLine($text)
    {
        print "$this->lp$text\n";
    }

    function _display($text)
    {
        print $text;
    }
}
PK�a�\Z�E�x9x9$pear/PEAR/Task/Postinstallscript.phpnu�[���<?php
/**
 * <tasks:postinstallscript>
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a1
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Common.php';
/**
 * Implements the postinstallscript file task.
 *
 * Note that post-install scripts are handled separately from installation, by the
 * "pear run-scripts" command
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 1.4.0a1
 */
class PEAR_Task_Postinstallscript extends PEAR_Task_Common
{
    public $type = 'script';
    public $_class;
    public $_params;
    public $_obj;
    /**
     *
     * @var PEAR_PackageFile_v2
     */
    public $_pkg;
    public $_contents;
    public $phase = PEAR_TASK_INSTALL;

    /**
     * Validate the raw xml at parsing-time.
     *
     * This also attempts to validate the script to make sure it meets the criteria
     * for a post-install script
     *
     * @param  PEAR_PackageFile_v2
     * @param  array The XML contents of the <postinstallscript> tag
     * @param  PEAR_Config
     * @param  array the entire parsed <file> tag
     */
    public static function validateXml($pkg, $xml, $config, $fileXml)
    {
        if ($fileXml['role'] != 'php') {
            return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
            $fileXml['name'].'" must be role="php"', );
        }
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $file = $pkg->getFileContents($fileXml['name']);
        if (PEAR::isError($file)) {
            PEAR::popErrorHandling();

            return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                $fileXml['name'].'" is not valid: '.
                $file->getMessage(), );
        } elseif ($file === null) {
            return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                $fileXml['name'].'" could not be retrieved for processing!', );
        } else {
            $analysis = $pkg->analyzeSourceCode($file, true);
            if (!$analysis) {
                PEAR::popErrorHandling();
                $warnings = '';
                foreach ($pkg->getValidationWarnings() as $warn) {
                    $warnings .= $warn['message']."\n";
                }

                return array(PEAR_TASK_ERROR_INVALID, 'Analysis of post-install script "'.
                    $fileXml['name'].'" failed: '.$warnings, );
            }
            if (count($analysis['declared_classes']) != 1) {
                PEAR::popErrorHandling();

                return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                    $fileXml['name'].'" must declare exactly 1 class', );
            }
            $class = $analysis['declared_classes'][0];
            if ($class != str_replace(
                array('/', '.php'), array('_', ''),
                $fileXml['name']
            ).'_postinstall') {
                PEAR::popErrorHandling();

                return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                    $fileXml['name'].'" class "'.$class.'" must be named "'.
                    str_replace(
                        array('/', '.php'), array('_', ''),
                        $fileXml['name']
                    ).'_postinstall"', );
            }
            if (!isset($analysis['declared_methods'][$class])) {
                PEAR::popErrorHandling();

                return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                    $fileXml['name'].'" must declare methods init() and run()', );
            }
            $methods = array('init' => 0, 'run' => 1);
            foreach ($analysis['declared_methods'][$class] as $method) {
                if (isset($methods[$method])) {
                    unset($methods[$method]);
                }
            }
            if (count($methods)) {
                PEAR::popErrorHandling();

                return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                    $fileXml['name'].'" must declare methods init() and run()', );
            }
        }
        PEAR::popErrorHandling();
        $definedparams = array();
        $tasksNamespace = $pkg->getTasksNs().':';
        if (!isset($xml[$tasksNamespace.'paramgroup']) && isset($xml['paramgroup'])) {
            // in order to support the older betas, which did not expect internal tags
            // to also use the namespace
            $tasksNamespace = '';
        }
        if (isset($xml[$tasksNamespace.'paramgroup'])) {
            $params = $xml[$tasksNamespace.'paramgroup'];
            if (!is_array($params) || !isset($params[0])) {
                $params = array($params);
            }
            foreach ($params as $param) {
                if (!isset($param[$tasksNamespace.'id'])) {
                    return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                        $fileXml['name'].'" <paramgroup> must have '.
                        'an '.$tasksNamespace.'id> tag', );
                }
                if (isset($param[$tasksNamespace.'name'])) {
                    if (!in_array($param[$tasksNamespace.'name'], $definedparams)) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" '.$tasksNamespace.
                            'paramgroup> id "'.$param[$tasksNamespace.'id'].
                            '" parameter "'.$param[$tasksNamespace.'name'].
                            '" has not been previously defined', );
                    }
                    if (!isset($param[$tasksNamespace.'conditiontype'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" '.$tasksNamespace.
                            'paramgroup> id "'.$param[$tasksNamespace.'id'].
                            '" must have a '.$tasksNamespace.
                            'conditiontype> tag containing either "=", '.
                            '"!=", or "preg_match"', );
                    }
                    if (!in_array(
                        $param[$tasksNamespace.'conditiontype'],
                        array('=', '!=', 'preg_match')
                    )) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" '.$tasksNamespace.
                            'paramgroup> id "'.$param[$tasksNamespace.'id'].
                            '" must have a '.$tasksNamespace.
                            'conditiontype> tag containing either "=", '.
                            '"!=", or "preg_match"', );
                    }
                    if (!isset($param[$tasksNamespace.'value'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" '.$tasksNamespace.
                            'paramgroup> id "'.$param[$tasksNamespace.'id'].
                            '" must have a '.$tasksNamespace.
                            'value> tag containing expected parameter value', );
                    }
                }
                if (isset($param[$tasksNamespace.'instructions'])) {
                    if (!is_string($param[$tasksNamespace.'instructions'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" '.$tasksNamespace.
                            'paramgroup> id "'.$param[$tasksNamespace.'id'].
                            '" '.$tasksNamespace.'instructions> must be simple text', );
                    }
                }
                if (!isset($param[$tasksNamespace.'param'])) {
                    continue; // <param> is no longer required
                }
                $subparams = $param[$tasksNamespace.'param'];
                if (!is_array($subparams) || !isset($subparams[0])) {
                    $subparams = array($subparams);
                }
                foreach ($subparams as $subparam) {
                    if (!isset($subparam[$tasksNamespace.'name'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" parameter for '.
                            $tasksNamespace.'paramgroup> id "'.
                            $param[$tasksNamespace.'id'].'" must have '.
                            'a '.$tasksNamespace.'name> tag', );
                    }
                    if (!preg_match(
                        '/[a-zA-Z0-9]+/',
                        $subparam[$tasksNamespace.'name']
                    )) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" parameter "'.
                            $subparam[$tasksNamespace.'name'].
                            '" for '.$tasksNamespace.'paramgroup> id "'.
                            $param[$tasksNamespace.'id'].
                            '" is not a valid name.  Must contain only alphanumeric characters', );
                    }
                    if (!isset($subparam[$tasksNamespace.'prompt'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" parameter "'.
                            $subparam[$tasksNamespace.'name'].
                            '" for '.$tasksNamespace.'paramgroup> id "'.
                            $param[$tasksNamespace.'id'].
                            '" must have a '.$tasksNamespace.'prompt> tag', );
                    }
                    if (!isset($subparam[$tasksNamespace.'type'])) {
                        return array(PEAR_TASK_ERROR_INVALID, 'Post-install script "'.
                            $fileXml['name'].'" parameter "'.
                            $subparam[$tasksNamespace.'name'].
                            '" for '.$tasksNamespace.'paramgroup> id "'.
                            $param[$tasksNamespace.'id'].
                            '" must have a '.$tasksNamespace.'type> tag', );
                    }
                    $definedparams[] = $param[$tasksNamespace.'id'].'::'.
                    $subparam[$tasksNamespace.'name'];
                }
            }
        }

        return true;
    }

    /**
     * Initialize a task instance with the parameters
     * @param array       $xml         raw, parsed xml
     * @param array       $fileattribs attributes from the <file> tag containing
     *                                 this task
     * @param string|null $lastversion last installed version of this package,
     *                                 if any (useful for upgrades)
     */
    public function init($xml, $fileattribs, $lastversion)
    {
        $this->_class = str_replace('/', '_', $fileattribs['name']);
        $this->_filename = $fileattribs['name'];
        $this->_class = str_replace('.php', '', $this->_class).'_postinstall';
        $this->_params = $xml;
        $this->_lastversion = $lastversion;
    }

    /**
     * Strip the tasks: namespace from internal params
     *
     * @access private
     */
    public function _stripNamespace($params = null)
    {
        if ($params === null) {
            $params = array();
            if (!is_array($this->_params)) {
                return;
            }
            foreach ($this->_params as $i => $param) {
                if (is_array($param)) {
                    $param = $this->_stripNamespace($param);
                }
                $params[str_replace($this->_pkg->getTasksNs().':', '', $i)] = $param;
            }
            $this->_params = $params;
        } else {
            $newparams = array();
            foreach ($params as $i => $param) {
                if (is_array($param)) {
                    $param = $this->_stripNamespace($param);
                }
                $newparams[str_replace($this->_pkg->getTasksNs().':', '', $i)] = $param;
            }

            return $newparams;
        }
    }

    /**
     * Unlike other tasks, the installed file name is passed in instead of the
     * file contents, because this task is handled post-installation
     *
     * @param mixed  $pkg      PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param string $contents file name
     * @param string $dest     the eventual final file location (informational only)
     *
     * @return bool|PEAR_Error false to skip this file, PEAR_Error to fail
     *                         (use $this->throwError)
     */
    public function startSession($pkg, $contents, $dest)
    {
        if ($this->installphase != PEAR_TASK_INSTALL) {
            return false;
        }
        // remove the tasks: namespace if present
        $this->_pkg = $pkg;
        $this->_stripNamespace();
        $this->logger->log(
            0, 'Including external post-installation script "'.
            $contents.'" - any errors are in this script'
        );
        include_once $contents;
        if (class_exists($this->_class)) {
            $this->logger->log(0, 'Inclusion succeeded');
        } else {
            return $this->throwError(
                'init of post-install script class "'.$this->_class
                .'" failed'
            );
        }
        $this->_obj = new $this->_class();
        $this->logger->log(1, 'running post-install script "'.$this->_class.'->init()"');
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $res = $this->_obj->init($this->config, $pkg, $this->_lastversion);
        PEAR::popErrorHandling();
        if ($res) {
            $this->logger->log(0, 'init succeeded');
        } else {
            return $this->throwError(
                'init of post-install script "'.$this->_class.
                '->init()" failed'
            );
        }
        $this->_contents = $contents;

        return true;
    }

    /**
     * No longer used
     *
     * @see    PEAR_PackageFile_v2::runPostinstallScripts()
     * @param  array an array of tasks
     * @param  string install or upgrade
     * @access protected
     */
    public static function run($tasks)
    {
    }
}
PK�a�\�3}pear/PEAR/Task/Replace/rw.phpnu�[���<?php
/**
 * <tasks:replace> - read/write version
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a10
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Replace.php';
/**
 * Abstracts the replace task xml.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a10
 */
class PEAR_Task_Replace_rw extends PEAR_Task_Replace
{
    public function __construct(&$pkg, &$config, &$logger, $fileXml)
    {
        parent::__construct($config, $logger, PEAR_TASK_PACKAGE);
        $this->_contents = $fileXml;
        $this->_pkg = &$pkg;
        $this->_params = array();
    }

    public function validate()
    {
        return $this->validateXml($this->_pkg, $this->_params, $this->config, $this->_contents);
    }

    public function setInfo($from, $to, $type)
    {
        $this->_params = array('attribs' => array('from' => $from, 'to' => $to, 'type' => $type));
    }

    public function getName()
    {
        return 'replace';
    }

    public function getXml()
    {
        return $this->_params;
    }
}
PK�a�\&
i.'pear/PEAR/Task/Postinstallscript/rw.phpnu�[���<?php
/**
 * <tasks:postinstallscript> - read/write version
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a10
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Postinstallscript.php';
/**
 * Abstracts the postinstallscript file task xml.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a10
 */
class PEAR_Task_Postinstallscript_rw extends PEAR_Task_Postinstallscript
{
    /**
     * parent package file object
     *
     * @var PEAR_PackageFile_v2_rw
     */
    public $_pkg;
    /**
     * Enter description here...
     *
     * @param PEAR_PackageFile_v2_rw $pkg     Package
     * @param PEAR_Config            $config  Config
     * @param PEAR_Frontend          $logger  Logger
     * @param array                  $fileXml XML
     *
     * @return PEAR_Task_Postinstallscript_rw
     */
    function __construct(&$pkg, &$config, &$logger, $fileXml)
    {
        parent::__construct($config, $logger, PEAR_TASK_PACKAGE);
        $this->_contents = $fileXml;
        $this->_pkg = &$pkg;
        $this->_params = array();
    }

    public function validate()
    {
        return $this->validateXml($this->_pkg, $this->_params, $this->config, $this->_contents);
    }

    public function getName()
    {
        return 'postinstallscript';
    }

    /**
     * add a simple <paramgroup> to the post-install script
     *
     * Order is significant, so call this method in the same
     * sequence the users should see the paramgroups.  The $params
     * parameter should either be the result of a call to {@link getParam()}
     * or an array of calls to getParam().
     *
     * Use {@link addConditionTypeGroup()} to add a <paramgroup> containing
     * a <conditiontype> tag
     *
     * @param string       $id           <paramgroup> id as seen by the script
     * @param array|false  $params       array of getParam() calls, or false for no params
     * @param string|false $instructions
     */
    public function addParamGroup($id, $params = false, $instructions = false)
    {
        if ($params && isset($params[0]) && !isset($params[1])) {
            $params = $params[0];
        }
        $stuff =
            array(
                $this->_pkg->getTasksNs().':id' => $id,
            );
        if ($instructions) {
            $stuff[$this->_pkg->getTasksNs().':instructions'] = $instructions;
        }
        if ($params) {
            $stuff[$this->_pkg->getTasksNs().':param'] = $params;
        }
        $this->_params[$this->_pkg->getTasksNs().':paramgroup'][] = $stuff;
    }

    /**
     * Add a complex <paramgroup> to the post-install script with conditions
     *
     * This inserts a <paramgroup> with
     *
     * Order is significant, so call this method in the same
     * sequence the users should see the paramgroups.  The $params
     * parameter should either be the result of a call to {@link getParam()}
     * or an array of calls to getParam().
     *
     * Use {@link addParamGroup()} to add a simple <paramgroup>
     *
     * @param string       $id            <paramgroup> id as seen by the script
     * @param string       $oldgroup      <paramgroup> id of the section referenced by
     *                                    <conditiontype>
     * @param string       $param         name of the <param> from the older section referenced
     *                                    by <contitiontype>
     * @param string       $value         value to match of the parameter
     * @param string       $conditiontype one of '=', '!=', 'preg_match'
     * @param array|false  $params        array of getParam() calls, or false for no params
     * @param string|false $instructions
     */
    public function addConditionTypeGroup($id,
        $oldgroup,
        $param,
        $value,
        $conditiontype = '=',
        $params = false,
        $instructions = false
    ) {
        if ($params && isset($params[0]) && !isset($params[1])) {
            $params = $params[0];
        }
        $stuff = array(
            $this->_pkg->getTasksNs().':id' => $id,
        );
        if ($instructions) {
            $stuff[$this->_pkg->getTasksNs().':instructions'] = $instructions;
        }
        $stuff[$this->_pkg->getTasksNs().':name'] = $oldgroup.'::'.$param;
        $stuff[$this->_pkg->getTasksNs().':conditiontype'] = $conditiontype;
        $stuff[$this->_pkg->getTasksNs().':value'] = $value;
        if ($params) {
            $stuff[$this->_pkg->getTasksNs().':param'] = $params;
        }
        $this->_params[$this->_pkg->getTasksNs().':paramgroup'][] = $stuff;
    }

    public function getXml()
    {
        return $this->_params;
    }

    /**
     * Use to set up a param tag for use in creating a paramgroup
     *
     * @param mixed  $name    Name of parameter
     * @param mixed  $prompt  Prompt
     * @param string $type    Type, defaults to 'string'
     * @param mixed  $default Default value
     *
     * @return array
     */
    public function getParam(
        $name, $prompt, $type = 'string', $default = null
    ) {
        if ($default !== null) {
            return
            array(
                $this->_pkg->getTasksNs().':name' => $name,
                $this->_pkg->getTasksNs().':prompt' => $prompt,
                $this->_pkg->getTasksNs().':type' => $type,
                $this->_pkg->getTasksNs().':default' => $default,
            );
        }

        return
            array(
                $this->_pkg->getTasksNs().':name' => $name,
                $this->_pkg->getTasksNs().':prompt' => $prompt,
                $this->_pkg->getTasksNs().':type' => $type,
            );
    }
}
PK�a�\�-!pear/PEAR/Task/Common.phpnu�[���<?php
/**
 * PEAR_Task_Common, base class for installer tasks
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a1
 */
/**#@+
 * Error codes for task validation routines
 */
define('PEAR_TASK_ERROR_NOATTRIBS', 1);
define('PEAR_TASK_ERROR_MISSING_ATTRIB', 2);
define('PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE', 3);
define('PEAR_TASK_ERROR_INVALID', 4);
/**#@-*/
define('PEAR_TASK_PACKAGE', 1);
define('PEAR_TASK_INSTALL', 2);
define('PEAR_TASK_PACKAGEANDINSTALL', 3);
/**
 * A task is an operation that manipulates the contents of a file.
 *
 * Simple tasks operate on 1 file.  Multiple tasks are executed after all files have been
 * processed and installed, and are designed to operate on all files containing the task.
 * The Post-install script task simply takes advantage of the fact that it will be run
 * after installation, replace is a simple task.
 *
 * Combining tasks is possible, but ordering is significant.
 *
 * <file name="test.php" role="php">
 *  <tasks:replace from="@data-dir@" to="data_dir" type="pear-config"/>
 *  <tasks:postinstallscript/>
 * </file>
 *
 * This will first replace any instance of @data-dir@ in the test.php file
 * with the path to the current data directory.  Then, it will include the
 * test.php file and run the script it contains to configure the package post-installation.
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 1.4.0a1
 * @abstract
 */
class PEAR_Task_Common
{
    /**
     * Valid types for this version are 'simple' and 'multiple'
     *
     * - simple tasks operate on the contents of a file and write out changes to disk
     * - multiple tasks operate on the contents of many files and write out the
     *   changes directly to disk
     *
     * Child task classes must override this property.
     *
     * @access protected
     */
    protected $type = 'simple';
    /**
     * Determines which install phase this task is executed under
     */
    public $phase = PEAR_TASK_INSTALL;
    /**
     * @access protected
     */
    protected $config;
    /**
     * @access protected
     */
    protected $registry;
    /**
     * @access protected
     */
    public $logger;
    /**
     * @access protected
     */
    protected $installphase;
    /**
     * @param PEAR_Config
     * @param PEAR_Common
     */
    function __construct(&$config, &$logger, $phase)
    {
        $this->config = &$config;
        $this->registry = &$config->getRegistry();
        $this->logger = &$logger;
        $this->installphase = $phase;
        if ($this->type == 'multiple') {
            $GLOBALS['_PEAR_TASK_POSTINSTANCES'][get_class($this)][] = &$this;
        }
    }

    /**
     * Validate the basic contents of a task tag.
     *
     * @param PEAR_PackageFile_v2
     * @param array
     * @param PEAR_Config
     * @param array the entire parsed <file> tag
     *
     * @return true|array On error, return an array in format:
     *                    array(PEAR_TASK_ERROR_???[, param1][, param2][, ...])
     *
     * For PEAR_TASK_ERROR_MISSING_ATTRIB, pass the attribute name in
     * For PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, pass the attribute name and
     * an array of legal values in
     *
     * @abstract
     */
    public static function validateXml($pkg, $xml, $config, $fileXml)
    {
    }

    /**
     * Initialize a task instance with the parameters
     *
     * @param    array raw, parsed xml
     * @param    array attributes from the <file> tag containing this task
     * @param    string|null last installed version of this package
     * @abstract
     */
    public function init($xml, $fileAttributes, $lastVersion)
    {
    }

    /**
     * Begin a task processing session.  All multiple tasks will be processed
     * after each file has been successfully installed, all simple tasks should
     * perform their task here and return any errors using the custom
     * throwError() method to allow forward compatibility
     *
     * This method MUST NOT write out any changes to disk
     *
     * @param    PEAR_PackageFile_v2
     * @param    string file contents
     * @param    string the eventual final file location (informational only)
     * @return   string|false|PEAR_Error false to skip this file, PEAR_Error to fail
     *           (use $this->throwError), otherwise return the new contents
     * @abstract
     */
    public function startSession($pkg, $contents, $dest)
    {
    }

    /**
     * This method is used to process each of the tasks for a particular
     * multiple class type.  Simple tasks need not implement this method.
     *
     * @param    array an array of tasks
     * @access   protected
     */
    public static function run($tasks)
    {
    }

    /**
     * @final
     */
    public static function hasPostinstallTasks()
    {
        return isset($GLOBALS['_PEAR_TASK_POSTINSTANCES']);
    }

     /**
      * @final
      */
    public static function runPostinstallTasks()
    {
        foreach ($GLOBALS['_PEAR_TASK_POSTINSTANCES'] as $class => $tasks) {
            $err = call_user_func(
                array($class, 'run'),
                $GLOBALS['_PEAR_TASK_POSTINSTANCES'][$class]
            );
            if ($err) {
                return PEAR_Task_Common::throwError($err);
            }
        }
        unset($GLOBALS['_PEAR_TASK_POSTINSTANCES']);
    }

    /**
     * Determines whether a role is a script
     * @return bool
     */
    public function isScript()
    {
            return $this->type == 'script';
    }

    public function throwError($msg, $code = -1)
    {
        include_once 'PEAR.php';

        return PEAR::raiseError($msg, $code);
    }
}
PK�a�\�����pear/PEAR/Task/Unixeol.phpnu�[���<?php
/**
 * <tasks:unixeol>
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a1
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Common.php';
/**
 * Implements the unix line endings file task.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Task_Unixeol extends PEAR_Task_Common
{
    public $type = 'simple';
    public $phase = PEAR_TASK_PACKAGE;
    public $_replacements;

    /**
     * Validate the raw xml at parsing-time.
     *
     * @param  PEAR_PackageFile_v2
     * @param  array raw, parsed xml
     * @param  PEAR_Config
     */
    public static function validateXml($pkg, $xml, $config, $fileXml)
    {
        if ($xml != '') {
            return array(PEAR_TASK_ERROR_INVALID, 'no attributes allowed');
        }

        return true;
    }

    /**
     * Initialize a task instance with the parameters
     * @param array raw, parsed xml
     * @param unused
     * @param unused
     */
    public function init($xml, $attribs, $lastVersion = null)
    {
    }

    /**
     * Replace all line endings with line endings customized for the current OS
     *
     * See validateXml() source for the complete list of allowed fields
     *
     * @param  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param  string file contents
     * @param  string the eventual final file location (informational only)
     * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail
     *                                 (use $this->throwError), otherwise return the new contents
     */
    public function startSession($pkg, $contents, $dest)
    {
        $this->logger->log(3, "replacing all line endings with \\n in $dest");

        return preg_replace("/\r\n|\n\r|\r|\n/", "\n", $contents);
    }
}
PK�a�\\k��pear/PEAR/Task/Unixeol/rw.phpnu�[���<?php
/**
 * <tasks:unixeol> - read/write version
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a10
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Unixeol.php';
/**
 * Abstracts the unixeol task xml.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a10
 */
class PEAR_Task_Unixeol_rw extends PEAR_Task_Unixeol
{
    function __construct(&$pkg, &$config, &$logger, $fileXml)
    {
        parent::__construct($config, $logger, PEAR_TASK_PACKAGE);
        $this->_contents = $fileXml;
        $this->_pkg = &$pkg;
        $this->_params = array();
    }

    public function validate()
    {
        return true;
    }

    public function getName()
    {
        return 'unixeol';
    }

    public function getXml()
    {
        return '';
    }
}
?>
PK�a�\D$���pear/PEAR/Task/Windowseol.phpnu�[���<?php
/**
 * <tasks:windowseol>
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a1
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Common.php';
/**
 * Implements the windows line endsings file task.
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 1.4.0a1
 */
class PEAR_Task_Windowseol extends PEAR_Task_Common
{
    public $type = 'simple';
    public $phase = PEAR_TASK_PACKAGE;
    public $_replacements;

    /**
     * Validate the raw xml at parsing-time.
     *
     * @param  PEAR_PackageFile_v2
     * @param  array raw, parsed xml
     * @param  PEAR_Config
     */
    public static function validateXml($pkg, $xml, $config, $fileXml)
    {
        if ($xml != '') {
            return array(PEAR_TASK_ERROR_INVALID, 'no attributes allowed');
        }

        return true;
    }

    /**
     * Initialize a task instance with the parameters
     * @param array raw, parsed xml
     * @param unused
     * @param unused
     */
    public function init($xml, $attribs, $lastVersion = null)
    {
    }

    /**
     * Replace all line endings with windows line endings
     *
     * See validateXml() source for the complete list of allowed fields
     *
     * @param  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param  string file contents
     * @param  string the eventual final file location (informational only)
     * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail
     *                                 (use $this->throwError), otherwise return the new contents
     */
    public function startSession($pkg, $contents, $dest)
    {
        $this->logger->log(3, "replacing all line endings with \\r\\n in $dest");

        return preg_replace("/\r\n|\n\r|\r|\n/", "\r\n", $contents);
    }
}
PK�a�\�JD��pear/PEAR/Task/Replace.phpnu�[���<?php
/**
 * <tasks:replace>
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a1
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Common.php';
/**
 * Implements the replace file task.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Task_Replace extends PEAR_Task_Common
{
    public $type = 'simple';
    public $phase = PEAR_TASK_PACKAGEANDINSTALL;
    public $_replacements;

    /**
     * Validate the raw xml at parsing-time.
     *
     * @param  PEAR_PackageFile_v2
     * @param  array raw, parsed xml
     * @param  PEAR_Config
     */
    public static function validateXml($pkg, $xml, $config, $fileXml)
    {
        if (!isset($xml['attribs'])) {
            return array(PEAR_TASK_ERROR_NOATTRIBS);
        }
        if (!isset($xml['attribs']['type'])) {
            return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'type');
        }
        if (!isset($xml['attribs']['to'])) {
            return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'to');
        }
        if (!isset($xml['attribs']['from'])) {
            return array(PEAR_TASK_ERROR_MISSING_ATTRIB, 'from');
        }
        if ($xml['attribs']['type'] == 'pear-config') {
            if (!in_array($xml['attribs']['to'], $config->getKeys())) {
                return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'],
                    $config->getKeys(), );
            }
        } elseif ($xml['attribs']['type'] == 'php-const') {
            if (defined($xml['attribs']['to'])) {
                return true;
            } else {
                return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'],
                    array('valid PHP constant'), );
            }
        } elseif ($xml['attribs']['type'] == 'package-info') {
            if (in_array(
                $xml['attribs']['to'],
                array('name', 'summary', 'channel', 'notes', 'extends', 'description',
                    'release_notes', 'license', 'release-license', 'license-uri',
                    'version', 'api-version', 'state', 'api-state', 'release_date',
                    'date', 'time', )
            )) {
                return true;
            } else {
                return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'to', $xml['attribs']['to'],
                    array('name', 'summary', 'channel', 'notes', 'extends', 'description',
                    'release_notes', 'license', 'release-license', 'license-uri',
                    'version', 'api-version', 'state', 'api-state', 'release_date',
                    'date', 'time', ), );
            }
        } else {
            return array(PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE, 'type', $xml['attribs']['type'],
                array('pear-config', 'package-info', 'php-const'), );
        }

        return true;
    }

    /**
     * Initialize a task instance with the parameters
     * @param array raw, parsed xml
     * @param unused
     * @param unused
     */
    public function init($xml, $attribs, $lastVersion = null)
    {
        $this->_replacements = isset($xml['attribs']) ? array($xml) : $xml;
    }

    /**
     * Do a package.xml 1.0 replacement, with additional package-info fields available
     *
     * See validateXml() source for the complete list of allowed fields
     *
     * @param  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param  string file contents
     * @param  string the eventual final file location (informational only)
     * @return string|false|PEAR_Error false to skip this file, PEAR_Error to fail
     *                                 (use $this->throwError), otherwise return the new contents
     */
    public function startSession($pkg, $contents, $dest)
    {
        $subst_from = $subst_to = array();
        foreach ($this->_replacements as $a) {
            $a = $a['attribs'];
            $to = '';
            if ($a['type'] == 'pear-config') {
                if ($this->installphase == PEAR_TASK_PACKAGE) {
                    return false;
                }
                if ($a['to'] == 'master_server') {
                    $chan = $this->registry->getChannel($pkg->getChannel());
                    if (!PEAR::isError($chan)) {
                        $to = $chan->getServer();
                    } else {
                        $this->logger->log(0, "$dest: invalid pear-config replacement: $a[to]");

                        return false;
                    }
                } else {
                    if ($this->config->isDefinedLayer('ftp')) {
                        // try the remote config file first
                        $to = $this->config->get($a['to'], 'ftp', $pkg->getChannel());
                        if (is_null($to)) {
                            // then default to local
                            $to = $this->config->get($a['to'], null, $pkg->getChannel());
                        }
                    } else {
                        $to = $this->config->get($a['to'], null, $pkg->getChannel());
                    }
                }
                if (is_null($to)) {
                    $this->logger->log(0, "$dest: invalid pear-config replacement: $a[to]");

                    return false;
                }
            } elseif ($a['type'] == 'php-const') {
                if ($this->installphase == PEAR_TASK_PACKAGE) {
                    return false;
                }
                if (defined($a['to'])) {
                    $to = constant($a['to']);
                } else {
                    $this->logger->log(0, "$dest: invalid php-const replacement: $a[to]");

                    return false;
                }
            } else {
                if ($t = $pkg->packageInfo($a['to'])) {
                    $to = $t;
                } else {
                    $this->logger->log(0, "$dest: invalid package-info replacement: $a[to]");

                    return false;
                }
            }
            if (!is_null($to)) {
                $subst_from[] = $a['from'];
                $subst_to[] = $to;
            }
        }
        $this->logger->log(
            3, "doing ".sizeof($subst_from).
            " substitution(s) for $dest"
        );
        if (sizeof($subst_from)) {
            $contents = str_replace($subst_from, $subst_to, $contents);
        }

        return $contents;
    }
}
PK�a�\&%75)) pear/PEAR/Task/Windowseol/rw.phpnu�[���<?php
/**
 * <tasks:windowseol> - read/write version
 *
 * PHP versions 4 and 5
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @link      http://pear.php.net/package/PEAR
 * @since     File available since Release 1.4.0a10
 */
/**
 * Base class
 */
require_once 'PEAR/Task/Windowseol.php';
/**
 * Abstracts the windowseol task xml.
 *
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license.php New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 1.4.0a10
 */
class PEAR_Task_Windowseol_rw extends PEAR_Task_Windowseol
{
    function __construct(&$pkg, &$config, &$logger, $fileXml)
    {
        parent::__construct($config, $logger, PEAR_TASK_PACKAGE);
        $this->_contents = $fileXml;
        $this->_pkg = &$pkg;
        $this->_params = array();
    }

    public function validate()
    {
        return true;
    }

    public function getName()
    {
        return 'windowseol';
    }

    public function getXml()
    {
        return '';
    }
}
?>
PK�a�\��ym6m6pear/PEAR/Exception.phpnu�[���<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
/**
 * PEAR_Exception
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Hans Lellelid <hans@velum.net>
 * @author     Bertrand Mansion <bmansion@mamasam.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.3.3
 */


/**
 * Base PEAR_Exception Class
 *
 * 1) Features:
 *
 * - Nestable exceptions (throw new PEAR_Exception($msg, $prev_exception))
 * - Definable triggers, shot when exceptions occur
 * - Pretty and informative error messages
 * - Added more context info available (like class, method or cause)
 * - cause can be a PEAR_Exception or an array of mixed
 *   PEAR_Exceptions/PEAR_ErrorStack warnings
 * - callbacks for specific exception classes and their children
 *
 * 2) Ideas:
 *
 * - Maybe a way to define a 'template' for the output
 *
 * 3) Inherited properties from PHP Exception Class:
 *
 * protected $message
 * protected $code
 * protected $line
 * protected $file
 * private   $trace
 *
 * 4) Inherited methods from PHP Exception Class:
 *
 * __clone
 * __construct
 * getMessage
 * getCode
 * getFile
 * getLine
 * getTraceSafe
 * getTraceSafeAsString
 * __toString
 *
 * 5) Usage example
 *
 * <code>
 *  require_once 'PEAR/Exception.php';
 *
 *  class Test {
 *     function foo() {
 *         throw new PEAR_Exception('Error Message', ERROR_CODE);
 *     }
 *  }
 *
 *  function myLogger($pear_exception) {
 *     echo $pear_exception->getMessage();
 *  }
 *  // each time a exception is thrown the 'myLogger' will be called
 *  // (its use is completely optional)
 *  PEAR_Exception::addObserver('myLogger');
 *  $test = new Test;
 *  try {
 *     $test->foo();
 *  } catch (PEAR_Exception $e) {
 *     print $e;
 *  }
 * </code>
 *
 * @category   pear
 * @package    PEAR
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Hans Lellelid <hans@velum.net>
 * @author     Bertrand Mansion <bmansion@mamasam.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.3.3
 *
 */
class PEAR_Exception extends Exception
{
    const OBSERVER_PRINT = -2;
    const OBSERVER_TRIGGER = -4;
    const OBSERVER_DIE = -8;
    protected $cause;
    private static $_observers = array();
    private static $_uniqueid = 0;
    private $_trace;

    /**
     * Supported signatures:
     *  - PEAR_Exception(string $message);
     *  - PEAR_Exception(string $message, int $code);
     *  - PEAR_Exception(string $message, Exception $cause);
     *  - PEAR_Exception(string $message, Exception $cause, int $code);
     *  - PEAR_Exception(string $message, PEAR_Error $cause);
     *  - PEAR_Exception(string $message, PEAR_Error $cause, int $code);
     *  - PEAR_Exception(string $message, array $causes);
     *  - PEAR_Exception(string $message, array $causes, int $code);
     * @param string exception message
     * @param int|Exception|PEAR_Error|array|null exception cause
     * @param int|null exception code or null
     */
    public function __construct($message, $p2 = null, $p3 = null)
    {
        if (is_int($p2)) {
            $code = $p2;
            $this->cause = null;
        } elseif (is_object($p2) || is_array($p2)) {
            // using is_object allows both Exception and PEAR_Error
            if (is_object($p2) && !($p2 instanceof Exception)) {
                if (!class_exists('PEAR_Error') || !($p2 instanceof PEAR_Error)) {
                    throw new PEAR_Exception('exception cause must be Exception, ' .
                        'array, or PEAR_Error');
                }
            }
            $code = $p3;
            if (is_array($p2) && isset($p2['message'])) {
                // fix potential problem of passing in a single warning
                $p2 = array($p2);
            }
            $this->cause = $p2;
        } else {
            $code = null;
            $this->cause = null;
        }
        parent::__construct($message, $code);
        $this->signal();
    }

    /**
     * @param mixed $callback  - A valid php callback, see php func is_callable()
     *                         - A PEAR_Exception::OBSERVER_* constant
     *                         - An array(const PEAR_Exception::OBSERVER_*,
     *                           mixed $options)
     * @param string $label    The name of the observer. Use this if you want
     *                         to remove it later with removeObserver()
     */
    public static function addObserver($callback, $label = 'default')
    {
        self::$_observers[$label] = $callback;
    }

    public static function removeObserver($label = 'default')
    {
        unset(self::$_observers[$label]);
    }

    /**
     * @return int unique identifier for an observer
     */
    public static function getUniqueId()
    {
        return self::$_uniqueid++;
    }

    private function signal()
    {
        foreach (self::$_observers as $func) {
            if (is_callable($func)) {
                call_user_func($func, $this);
                continue;
            }
            settype($func, 'array');
            switch ($func[0]) {
                case self::OBSERVER_PRINT :
                    $f = (isset($func[1])) ? $func[1] : '%s';
                    printf($f, $this->getMessage());
                    break;
                case self::OBSERVER_TRIGGER :
                    $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE;
                    trigger_error($this->getMessage(), $f);
                    break;
                case self::OBSERVER_DIE :
                    $f = (isset($func[1])) ? $func[1] : '%s';
                    die(printf($f, $this->getMessage()));
                    break;
                default:
                    trigger_error('invalid observer type', E_USER_WARNING);
            }
        }
    }

    /**
     * Return specific error information that can be used for more detailed
     * error messages or translation.
     *
     * This method may be overridden in child exception classes in order
     * to add functionality not present in PEAR_Exception and is a placeholder
     * to define API
     *
     * The returned array must be an associative array of parameter => value like so:
     * <pre>
     * array('name' => $name, 'context' => array(...))
     * </pre>
     * @return array
     */
    public function getErrorData()
    {
        return array();
    }

    /**
     * Returns the exception that caused this exception to be thrown
     * @access public
     * @return Exception|array The context of the exception
     */
    public function getCause()
    {
        return $this->cause;
    }

    /**
     * Function must be public to call on caused exceptions
     * @param array
     */
    public function getCauseMessage(&$causes)
    {
        $trace = $this->getTraceSafe();
        $cause = array('class'   => get_class($this),
                       'message' => $this->message,
                       'file' => 'unknown',
                       'line' => 'unknown');
        if (isset($trace[0])) {
            if (isset($trace[0]['file'])) {
                $cause['file'] = $trace[0]['file'];
                $cause['line'] = $trace[0]['line'];
            }
        }
        $causes[] = $cause;
        if ($this->cause instanceof PEAR_Exception) {
            $this->cause->getCauseMessage($causes);
        } elseif ($this->cause instanceof Exception) {
            $causes[] = array('class'   => get_class($this->cause),
                              'message' => $this->cause->getMessage(),
                              'file' => $this->cause->getFile(),
                              'line' => $this->cause->getLine());
        } elseif (class_exists('PEAR_Error') && $this->cause instanceof PEAR_Error) {
            $causes[] = array('class' => get_class($this->cause),
                              'message' => $this->cause->getMessage(),
                              'file' => 'unknown',
                              'line' => 'unknown');
        } elseif (is_array($this->cause)) {
            foreach ($this->cause as $cause) {
                if ($cause instanceof PEAR_Exception) {
                    $cause->getCauseMessage($causes);
                } elseif ($cause instanceof Exception) {
                    $causes[] = array('class'   => get_class($cause),
                                   'message' => $cause->getMessage(),
                                   'file' => $cause->getFile(),
                                   'line' => $cause->getLine());
                } elseif (class_exists('PEAR_Error') && $cause instanceof PEAR_Error) {
                    $causes[] = array('class' => get_class($cause),
                                      'message' => $cause->getMessage(),
                                      'file' => 'unknown',
                                      'line' => 'unknown');
                } elseif (is_array($cause) && isset($cause['message'])) {
                    // PEAR_ErrorStack warning
                    $causes[] = array(
                        'class' => $cause['package'],
                        'message' => $cause['message'],
                        'file' => isset($cause['context']['file']) ?
                                            $cause['context']['file'] :
                                            'unknown',
                        'line' => isset($cause['context']['line']) ?
                                            $cause['context']['line'] :
                                            'unknown',
                    );
                }
            }
        }
    }

    public function getTraceSafe()
    {
        if (!isset($this->_trace)) {
            $this->_trace = $this->getTrace();
            if (empty($this->_trace)) {
                $backtrace = debug_backtrace();
                $this->_trace = array($backtrace[count($backtrace)-1]);
            }
        }
        return $this->_trace;
    }

    public function getErrorClass()
    {
        $trace = $this->getTraceSafe();
        return $trace[0]['class'];
    }

    public function getErrorMethod()
    {
        $trace = $this->getTraceSafe();
        return $trace[0]['function'];
    }

    public function __toString()
    {
        if (isset($_SERVER['REQUEST_URI'])) {
            return $this->toHtml();
        }
        return $this->toText();
    }

    public function toHtml()
    {
        $trace = $this->getTraceSafe();
        $causes = array();
        $this->getCauseMessage($causes);
        $html =  '<table style="border: 1px" cellspacing="0">' . "\n";
        foreach ($causes as $i => $cause) {
            $html .= '<tr><td colspan="3" style="background: #ff9999">'
               . str_repeat('-', $i) . ' <b>' . $cause['class'] . '</b>: '
               . htmlspecialchars($cause['message']) . ' in <b>' . $cause['file'] . '</b> '
               . 'on line <b>' . $cause['line'] . '</b>'
               . "</td></tr>\n";
        }
        $html .= '<tr><td colspan="3" style="background-color: #aaaaaa; text-align: center; font-weight: bold;">Exception trace</td></tr>' . "\n"
               . '<tr><td style="text-align: center; background: #cccccc; width:20px; font-weight: bold;">#</td>'
               . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Function</td>'
               . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Location</td></tr>' . "\n";

        foreach ($trace as $k => $v) {
            $html .= '<tr><td style="text-align: center;">' . $k . '</td>'
                   . '<td>';
            if (!empty($v['class'])) {
                $html .= $v['class'] . $v['type'];
            }
            $html .= $v['function'];
            $args = array();
            if (!empty($v['args'])) {
                foreach ($v['args'] as $arg) {
                    if (is_null($arg)) $args[] = 'null';
                    elseif (is_array($arg)) $args[] = 'Array';
                    elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')';
                    elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false';
                    elseif (is_int($arg) || is_double($arg)) $args[] = $arg;
                    else {
                        $arg = (string)$arg;
                        $str = htmlspecialchars(substr($arg, 0, 16));
                        if (strlen($arg) > 16) $str .= '&hellip;';
                        $args[] = "'" . $str . "'";
                    }
                }
            }
            $html .= '(' . implode(', ',$args) . ')'
                   . '</td>'
                   . '<td>' . (isset($v['file']) ? $v['file'] : 'unknown')
                   . ':' . (isset($v['line']) ? $v['line'] : 'unknown')
                   . '</td></tr>' . "\n";
        }
        $html .= '<tr><td style="text-align: center;">' . ($k+1) . '</td>'
               . '<td>{main}</td>'
               . '<td>&nbsp;</td></tr>' . "\n"
               . '</table>';
        return $html;
    }

    public function toText()
    {
        $causes = array();
        $this->getCauseMessage($causes);
        $causeMsg = '';
        foreach ($causes as $i => $cause) {
            $causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': '
                   . $cause['message'] . ' in ' . $cause['file']
                   . ' on line ' . $cause['line'] . "\n";
        }
        return $causeMsg . $this->getTraceAsString();
    }
}PK�a�\�b����pear/PEAR/ErrorStack.phpnu�[���<?php
/**
 * Error Stack Implementation
 * 
 * This is an incredibly simple implementation of a very complex error handling
 * facility.  It contains the ability
 * to track multiple errors from multiple packages simultaneously.  In addition,
 * it can track errors of many levels, save data along with the error, context
 * information such as the exact file, line number, class and function that
 * generated the error, and if necessary, it can raise a traditional PEAR_Error.
 * It has built-in support for PEAR::Log, to log errors as they occur
 * 
 * Since version 0.2alpha, it is also possible to selectively ignore errors,
 * through the use of an error callback, see {@link pushCallback()}
 * 
 * Since version 0.3alpha, it is possible to specify the exception class
 * returned from {@link push()}
 *
 * Since version PEAR1.3.2, ErrorStack no longer instantiates an exception class.  This can
 * still be done quite handily in an error callback or by manipulating the returned array
 * @category   Debugging
 * @package    PEAR_ErrorStack
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2004-2008 Greg Beaver
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR_ErrorStack
 */

/**
 * Singleton storage
 * 
 * Format:
 * <pre>
 * array(
 *  'package1' => PEAR_ErrorStack object,
 *  'package2' => PEAR_ErrorStack object,
 *  ...
 * )
 * </pre>
 * @access private
 * @global array $GLOBALS['_PEAR_ERRORSTACK_SINGLETON']
 */
$GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] = array();

/**
 * Global error callback (default)
 * 
 * This is only used if set to non-false.  * is the default callback for
 * all packages, whereas specific packages may set a default callback
 * for all instances, regardless of whether they are a singleton or not.
 *
 * To exclude non-singletons, only set the local callback for the singleton
 * @see PEAR_ErrorStack::setDefaultCallback()
 * @access private
 * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']
 */
$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] = array(
    '*' => false,
);

/**
 * Global Log object (default)
 * 
 * This is only used if set to non-false.  Use to set a default log object for
 * all stacks, regardless of instantiation order or location
 * @see PEAR_ErrorStack::setDefaultLogger()
 * @access private
 * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']
 */
$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = false;

/**
 * Global Overriding Callback
 * 
 * This callback will override any error callbacks that specific loggers have set.
 * Use with EXTREME caution
 * @see PEAR_ErrorStack::staticPushCallback()
 * @access private
 * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']
 */
$GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array();

/**#@+
 * One of four possible return values from the error Callback
 * @see PEAR_ErrorStack::_errorCallback()
 */
/**
 * If this is returned, then the error will be both pushed onto the stack
 * and logged.
 */
define('PEAR_ERRORSTACK_PUSHANDLOG', 1);
/**
 * If this is returned, then the error will only be pushed onto the stack,
 * and not logged.
 */
define('PEAR_ERRORSTACK_PUSH', 2);
/**
 * If this is returned, then the error will only be logged, but not pushed
 * onto the error stack.
 */
define('PEAR_ERRORSTACK_LOG', 3);
/**
 * If this is returned, then the error is completely ignored.
 */
define('PEAR_ERRORSTACK_IGNORE', 4);
/**
 * If this is returned, then the error is logged and die() is called.
 */
define('PEAR_ERRORSTACK_DIE', 5);
/**#@-*/

/**
 * Error code for an attempt to instantiate a non-class as a PEAR_ErrorStack in
 * the singleton method.
 */
define('PEAR_ERRORSTACK_ERR_NONCLASS', 1);

/**
 * Error code for an attempt to pass an object into {@link PEAR_ErrorStack::getMessage()}
 * that has no __toString() method
 */
define('PEAR_ERRORSTACK_ERR_OBJTOSTRING', 2);
/**
 * Error Stack Implementation
 *
 * Usage:
 * <code>
 * // global error stack
 * $global_stack = &PEAR_ErrorStack::singleton('MyPackage');
 * // local error stack
 * $local_stack = new PEAR_ErrorStack('MyPackage');
 * </code>
 * @author     Greg Beaver <cellog@php.net>
 * @version    1.10.16
 * @package    PEAR_ErrorStack
 * @category   Debugging
 * @copyright  2004-2008 Greg Beaver
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR_ErrorStack
 */
class PEAR_ErrorStack {
    /**
     * Errors are stored in the order that they are pushed on the stack.
     * @since 0.4alpha Errors are no longer organized by error level.
     * This renders pop() nearly unusable, and levels could be more easily
     * handled in a callback anyway
     * @var array
     * @access private
     */
    var $_errors = array();

    /**
     * Storage of errors by level.
     *
     * Allows easy retrieval and deletion of only errors from a particular level
     * @since PEAR 1.4.0dev
     * @var array
     * @access private
     */
    var $_errorsByLevel = array();

    /**
     * Package name this error stack represents
     * @var string
     * @access protected
     */
    var $_package;
    
    /**
     * Determines whether a PEAR_Error is thrown upon every error addition
     * @var boolean
     * @access private
     */
    var $_compat = false;
    
    /**
     * If set to a valid callback, this will be used to generate the error
     * message from the error code, otherwise the message passed in will be
     * used
     * @var false|string|array
     * @access private
     */
    var $_msgCallback = false;
    
    /**
     * If set to a valid callback, this will be used to generate the error
     * context for an error.  For PHP-related errors, this will be a file
     * and line number as retrieved from debug_backtrace(), but can be
     * customized for other purposes.  The error might actually be in a separate
     * configuration file, or in a database query.
     * @var false|string|array
     * @access protected
     */
    var $_contextCallback = false;

    /**
     * If set to a valid callback, this will be called every time an error
     * is pushed onto the stack.  The return value will be used to determine
     * whether to allow an error to be pushed or logged.
     *
     * The return value must be one an PEAR_ERRORSTACK_* constant
     * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
     * @var false|string|array
     * @access protected
     */
    var $_errorCallback = array();

    /**
     * PEAR::Log object for logging errors
     * @var false|Log
     * @access protected
     */
    var $_logger = false;

    /**
     * Error messages - designed to be overridden
     * @var array
     * @abstract
     */
    var $_errorMsgs = array();

    /**
     * Set up a new error stack
     *
     * @param string   $package name of the package this error stack represents
     * @param callback $msgCallback callback used for error message generation
     * @param callback $contextCallback callback used for context generation,
     *                 defaults to {@link getFileLine()}
     * @param boolean  $throwPEAR_Error
     */
    function __construct($package, $msgCallback = false, $contextCallback = false,
                         $throwPEAR_Error = false)
    {
        $this->_package = $package;
        $this->setMessageCallback($msgCallback);
        $this->setContextCallback($contextCallback);
        $this->_compat = $throwPEAR_Error;
    }
    
    /**
     * Return a single error stack for this package.
     * 
     * Note that all parameters are ignored if the stack for package $package
     * has already been instantiated
     * @param string   $package name of the package this error stack represents
     * @param callback $msgCallback callback used for error message generation
     * @param callback $contextCallback callback used for context generation,
     *                 defaults to {@link getFileLine()}
     * @param boolean  $throwPEAR_Error
     * @param string   $stackClass class to instantiate
     *
     * @return PEAR_ErrorStack
     */
    public static function &singleton(
        $package, $msgCallback = false, $contextCallback = false,
        $throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack'
    ) {
        if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
            return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
        }
        if (!class_exists($stackClass)) {
            if (function_exists('debug_backtrace')) {
                $trace = debug_backtrace();
            }
            PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_NONCLASS,
                'exception', array('stackclass' => $stackClass),
                'stack class "%stackclass%" is not a valid class name (should be like PEAR_ErrorStack)',
                false, $trace);
        }
        $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] =
            new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error);

        return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
    }

    /**
     * Internal error handler for PEAR_ErrorStack class
     * 
     * Dies if the error is an exception (and would have died anyway)
     * @access private
     */
    function _handleError($err)
    {
        if ($err['level'] == 'exception') {
            $message = $err['message'];
            if (isset($_SERVER['REQUEST_URI'])) {
                echo '<br />';
            } else {
                echo "\n";
            }
            var_dump($err['context']);
            die($message);
        }
    }
    
    /**
     * Set up a PEAR::Log object for all error stacks that don't have one
     * @param Log $log 
     */
    public static function setDefaultLogger(&$log)
    {
        if (is_object($log) && method_exists($log, 'log') ) {
            $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
        } elseif (is_callable($log)) {
            $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
        }
    }
    
    /**
     * Set up a PEAR::Log object for this error stack
     * @param Log $log 
     */
    function setLogger(&$log)
    {
        if (is_object($log) && method_exists($log, 'log') ) {
            $this->_logger = &$log;
        } elseif (is_callable($log)) {
            $this->_logger = &$log;
        }
    }
    
    /**
     * Set an error code => error message mapping callback
     * 
     * This method sets the callback that can be used to generate error
     * messages for any instance
     * @param array|string Callback function/method
     */
    function setMessageCallback($msgCallback)
    {
        if (!$msgCallback) {
            $this->_msgCallback = array(&$this, 'getErrorMessage');
        } else {
            if (is_callable($msgCallback)) {
                $this->_msgCallback = $msgCallback;
            }
        }
    }
    
    /**
     * Get an error code => error message mapping callback
     * 
     * This method returns the current callback that can be used to generate error
     * messages
     * @return array|string|false Callback function/method or false if none
     */
    function getMessageCallback()
    {
        return $this->_msgCallback;
    }
    
    /**
     * Sets a default callback to be used by all error stacks
     * 
     * This method sets the callback that can be used to generate error
     * messages for a singleton
     * @param array|string Callback function/method
     * @param string Package name, or false for all packages
     */
    public static function setDefaultCallback($callback = false, $package = false)
    {
        if (!is_callable($callback)) {
            $callback = false;
        }
        $package = $package ? $package : '*';
        $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$package] = $callback;
    }
    
    /**
     * Set a callback that generates context information (location of error) for an error stack
     * 
     * This method sets the callback that can be used to generate context
     * information for an error.  Passing in NULL will disable context generation
     * and remove the expensive call to debug_backtrace()
     * @param array|string|null Callback function/method
     */
    function setContextCallback($contextCallback)
    {
        if ($contextCallback === null) {
            return $this->_contextCallback = false;
        }
        if (!$contextCallback) {
            $this->_contextCallback = array(&$this, 'getFileLine');
        } else {
            if (is_callable($contextCallback)) {
                $this->_contextCallback = $contextCallback;
            }
        }
    }
    
    /**
     * Set an error Callback
     * If set to a valid callback, this will be called every time an error
     * is pushed onto the stack.  The return value will be used to determine
     * whether to allow an error to be pushed or logged.
     * 
     * The return value must be one of the ERRORSTACK_* constants.
     * 
     * This functionality can be used to emulate PEAR's pushErrorHandling, and
     * the PEAR_ERROR_CALLBACK mode, without affecting the integrity of
     * the error stack or logging
     * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
     * @see popCallback()
     * @param string|array $cb
     */
    function pushCallback($cb)
    {
        array_push($this->_errorCallback, $cb);
    }
    
    /**
     * Remove a callback from the error callback stack
     * @see pushCallback()
     * @return array|string|false
     */
    function popCallback()
    {
        if (!count($this->_errorCallback)) {
            return false;
        }
        return array_pop($this->_errorCallback);
    }
    
    /**
     * Set a temporary overriding error callback for every package error stack
     *
     * Use this to temporarily disable all existing callbacks (can be used
     * to emulate the @ operator, for instance)
     * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
     * @see staticPopCallback(), pushCallback()
     * @param string|array $cb
     */
    public static function staticPushCallback($cb)
    {
        array_push($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'], $cb);
    }
    
    /**
     * Remove a temporary overriding error callback
     * @see staticPushCallback()
     * @return array|string|false
     */
    public static function staticPopCallback()
    {
        $ret = array_pop($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK']);
        if (!is_array($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'])) {
            $GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array();
        }
        return $ret;
    }
    
    /**
     * Add an error to the stack
     * 
     * If the message generator exists, it is called with 2 parameters.
     *  - the current Error Stack object
     *  - an array that is in the same format as an error.  Available indices
     *    are 'code', 'package', 'time', 'params', 'level', and 'context'
     * 
     * Next, if the error should contain context information, this is
     * handled by the context grabbing method.
     * Finally, the error is pushed onto the proper error stack
     * @param int    $code      Package-specific error code
     * @param string $level     Error level.  This is NOT spell-checked
     * @param array  $params    associative array of error parameters
     * @param string $msg       Error message, or a portion of it if the message
     *                          is to be generated
     * @param array  $repackage If this error re-packages an error pushed by
     *                          another package, place the array returned from
     *                          {@link pop()} in this parameter
     * @param array  $backtrace Protected parameter: use this to pass in the
     *                          {@link debug_backtrace()} that should be used
     *                          to find error context
     * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
     * thrown.  If a PEAR_Error is returned, the userinfo
     * property is set to the following array:
     * 
     * <code>
     * array(
     *    'code' => $code,
     *    'params' => $params,
     *    'package' => $this->_package,
     *    'level' => $level,
     *    'time' => time(),
     *    'context' => $context,
     *    'message' => $msg,
     * //['repackage' => $err] repackaged error array/Exception class
     * );
     * </code>
     * 
     * Normally, the previous array is returned.
     */
    function push($code, $level = 'error', $params = array(), $msg = false,
                  $repackage = false, $backtrace = false)
    {
        $context = false;
        // grab error context
        if ($this->_contextCallback) {
            if (!$backtrace) {
                $backtrace = debug_backtrace();
            }
            $context = call_user_func($this->_contextCallback, $code, $params, $backtrace);
        }
        
        // save error
        $time = explode(' ', microtime());
        $time = $time[1] + $time[0];
        $err = array(
                'code' => $code,
                'params' => $params,
                'package' => $this->_package,
                'level' => $level,
                'time' => $time,
                'context' => $context,
                'message' => $msg,
               );

        if ($repackage) {
            $err['repackage'] = $repackage;
        }

        // set up the error message, if necessary
        if ($this->_msgCallback) {
            $msg = call_user_func_array($this->_msgCallback,
                                        array(&$this, $err));
            $err['message'] = $msg;
        }        
        $push = $log = true;
        $die = false;
        // try the overriding callback first
        $callback = $this->staticPopCallback();
        if ($callback) {
            $this->staticPushCallback($callback);
        }
        if (!is_callable($callback)) {
            // try the local callback next
            $callback = $this->popCallback();
            if (is_callable($callback)) {
                $this->pushCallback($callback);
            } else {
                // try the default callback
                $callback = isset($GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package]) ?
                    $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package] :
                    $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']['*'];
            }
        }
        if (is_callable($callback)) {
            switch(call_user_func($callback, $err)){
            	case PEAR_ERRORSTACK_IGNORE: 
            		return $err;
        		break;
            	case PEAR_ERRORSTACK_PUSH: 
            		$log = false;
        		break;
            	case PEAR_ERRORSTACK_LOG: 
            		$push = false;
        		break;
            	case PEAR_ERRORSTACK_DIE: 
            		$die = true;
        		break;
                // anything else returned has the same effect as pushandlog
            }
        }
        if ($push) {
            array_unshift($this->_errors, $err);
            if (!isset($this->_errorsByLevel[$err['level']])) {
                $this->_errorsByLevel[$err['level']] = array();
            }
            $this->_errorsByLevel[$err['level']][] = &$this->_errors[0];
        }
        if ($log) {
            if ($this->_logger || $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']) {
                $this->_log($err);
            }
        }
        if ($die) {
            die();
        }
        if ($this->_compat && $push) {
            return $this->raiseError($msg, $code, null, null, $err);
        }
        return $err;
    }
    
    /**
     * Static version of {@link push()}
     * 
     * @param string $package   Package name this error belongs to
     * @param int    $code      Package-specific error code
     * @param string $level     Error level.  This is NOT spell-checked
     * @param array  $params    associative array of error parameters
     * @param string $msg       Error message, or a portion of it if the message
     *                          is to be generated
     * @param array  $repackage If this error re-packages an error pushed by
     *                          another package, place the array returned from
     *                          {@link pop()} in this parameter
     * @param array  $backtrace Protected parameter: use this to pass in the
     *                          {@link debug_backtrace()} that should be used
     *                          to find error context
     * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
     *                          thrown.  see docs for {@link push()}
     */
    public static function staticPush(
        $package, $code, $level = 'error', $params = array(),
        $msg = false, $repackage = false, $backtrace = false
    ) {
        $s = &PEAR_ErrorStack::singleton($package);
        if ($s->_contextCallback) {
            if (!$backtrace) {
                if (function_exists('debug_backtrace')) {
                    $backtrace = debug_backtrace();
                }
            }
        }
        return $s->push($code, $level, $params, $msg, $repackage, $backtrace);
    }
    
    /**
     * Log an error using PEAR::Log
     * @param array $err Error array
     * @param array $levels Error level => Log constant map
     * @access protected
     */
    function _log($err)
    {
        if ($this->_logger) {
            $logger = &$this->_logger;
        } else {
            $logger = &$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'];
        }
        if (is_a($logger, 'Log')) {
            $levels = array(
                'exception' => PEAR_LOG_CRIT,
                'alert' => PEAR_LOG_ALERT,
                'critical' => PEAR_LOG_CRIT,
                'error' => PEAR_LOG_ERR,
                'warning' => PEAR_LOG_WARNING,
                'notice' => PEAR_LOG_NOTICE,
                'info' => PEAR_LOG_INFO,
                'debug' => PEAR_LOG_DEBUG);
            if (isset($levels[$err['level']])) {
                $level = $levels[$err['level']];
            } else {
                $level = PEAR_LOG_INFO;
            }
            $logger->log($err['message'], $level, $err);
        } else { // support non-standard logs
            call_user_func($logger, $err);
        }
    }

    
    /**
     * Pop an error off of the error stack
     * 
     * @return false|array
     * @since 0.4alpha it is no longer possible to specify a specific error
     * level to return - the last error pushed will be returned, instead
     */
    function pop()
    {
        $err = @array_shift($this->_errors);
        if (!is_null($err)) {
            @array_pop($this->_errorsByLevel[$err['level']]);
            if (!count($this->_errorsByLevel[$err['level']])) {
                unset($this->_errorsByLevel[$err['level']]);
            }
        }
        return $err;
    }

    /**
     * Pop an error off of the error stack, static method
     *
     * @param string package name
     * @return boolean
     * @since PEAR1.5.0a1
     */
    static function staticPop($package)
    {
        if ($package) {
            if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
                return false;
            }
            return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->pop();
        }
    }

    /**
     * Determine whether there are any errors on the stack
     * @param string|array Level name.  Use to determine if any errors
     * of level (string), or levels (array) have been pushed
     * @return boolean
     */
    function hasErrors($level = false)
    {
        if ($level) {
            return isset($this->_errorsByLevel[$level]);
        }
        return count($this->_errors);
    }
    
    /**
     * Retrieve all errors since last purge
     * 
     * @param boolean set in order to empty the error stack
     * @param string level name, to return only errors of a particular severity
     * @return array
     */
    function getErrors($purge = false, $level = false)
    {
        if (!$purge) {
            if ($level) {
                if (!isset($this->_errorsByLevel[$level])) {
                    return array();
                } else {
                    return $this->_errorsByLevel[$level];
                }
            } else {
                return $this->_errors;
            }
        }
        if ($level) {
            $ret = $this->_errorsByLevel[$level];
            foreach ($this->_errorsByLevel[$level] as $i => $unused) {
                // entries are references to the $_errors array
                $this->_errorsByLevel[$level][$i] = false;
            }
            // array_filter removes all entries === false
            $this->_errors = array_filter($this->_errors);
            unset($this->_errorsByLevel[$level]);
            return $ret;
        }
        $ret = $this->_errors;
        $this->_errors = array();
        $this->_errorsByLevel = array();
        return $ret;
    }
    
    /**
     * Determine whether there are any errors on a single error stack, or on any error stack
     *
     * The optional parameter can be used to test the existence of any errors without the need of
     * singleton instantiation
     * @param string|false Package name to check for errors
     * @param string Level name to check for a particular severity
     * @return boolean
     */
    public static function staticHasErrors($package = false, $level = false)
    {
        if ($package) {
            if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
                return false;
            }
            return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->hasErrors($level);
        }
        foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) {
            if ($obj->hasErrors($level)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * Get a list of all errors since last purge, organized by package
     * @since PEAR 1.4.0dev BC break! $level is now in the place $merge used to be
     * @param boolean $purge Set to purge the error stack of existing errors
     * @param string  $level Set to a level name in order to retrieve only errors of a particular level
     * @param boolean $merge Set to return a flat array, not organized by package
     * @param array   $sortfunc Function used to sort a merged array - default
     *        sorts by time, and should be good for most cases
     *
     * @return array 
     */
    public static function staticGetErrors(
        $purge = false, $level = false, $merge = false,
        $sortfunc = array('PEAR_ErrorStack', '_sortErrors')
    ) {
        $ret = array();
        if (!is_callable($sortfunc)) {
            $sortfunc = array('PEAR_ErrorStack', '_sortErrors');
        }
        foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) {
            $test = $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->getErrors($purge, $level);
            if ($test) {
                if ($merge) {
                    $ret = array_merge($ret, $test);
                } else {
                    $ret[$package] = $test;
                }
            }
        }
        if ($merge) {
            usort($ret, $sortfunc);
        }
        return $ret;
    }
    
    /**
     * Error sorting function, sorts by time
     * @access private
     */
    public static function _sortErrors($a, $b)
    {
        if ($a['time'] == $b['time']) {
            return 0;
        }
        if ($a['time'] < $b['time']) {
            return 1;
        }
        return -1;
    }

    /**
     * Standard file/line number/function/class context callback
     *
     * This function uses a backtrace generated from {@link debug_backtrace()}
     * and so will not work at all in PHP < 4.3.0.  The frame should
     * reference the frame that contains the source of the error.
     * @return array|false either array('file' => file, 'line' => line,
     *         'function' => function name, 'class' => class name) or
     *         if this doesn't work, then false
     * @param unused
     * @param integer backtrace frame.
     * @param array Results of debug_backtrace()
     */
    public static function getFileLine($code, $params, $backtrace = null)
    {
        if ($backtrace === null) {
            return false;
        }
        $frame = 0;
        $functionframe = 1;
        if (!isset($backtrace[1])) {
            $functionframe = 0;
        } else {
            while (isset($backtrace[$functionframe]['function']) &&
                  $backtrace[$functionframe]['function'] == 'eval' &&
                  isset($backtrace[$functionframe + 1])) {
                $functionframe++;
            }
        }
        if (isset($backtrace[$frame])) {
            if (!isset($backtrace[$frame]['file'])) {
                $frame++;
            }
            $funcbacktrace = $backtrace[$functionframe];
            $filebacktrace = $backtrace[$frame];
            $ret = array('file' => $filebacktrace['file'],
                         'line' => $filebacktrace['line']);
            // rearrange for eval'd code or create function errors
            if (strpos($filebacktrace['file'], '(') && 
            	  preg_match(';^(.*?)\((\d+)\) : (.*?)\\z;', $filebacktrace['file'],
                  $matches)) {
                $ret['file'] = $matches[1];
                $ret['line'] = $matches[2] + 0;
            }
            if (isset($funcbacktrace['function']) && isset($backtrace[1])) {
                if ($funcbacktrace['function'] != 'eval') {
                    if ($funcbacktrace['function'] == '__lambda_func') {
                        $ret['function'] = 'create_function() code';
                    } else {
                        $ret['function'] = $funcbacktrace['function'];
                    }
                }
            }
            if (isset($funcbacktrace['class']) && isset($backtrace[1])) {
                $ret['class'] = $funcbacktrace['class'];
            }
            return $ret;
        }
        return false;
    }
    
    /**
     * Standard error message generation callback
     * 
     * This method may also be called by a custom error message generator
     * to fill in template values from the params array, simply
     * set the third parameter to the error message template string to use
     * 
     * The special variable %__msg% is reserved: use it only to specify
     * where a message passed in by the user should be placed in the template,
     * like so:
     * 
     * Error message: %msg% - internal error
     * 
     * If the message passed like so:
     * 
     * <code>
     * $stack->push(ERROR_CODE, 'error', array(), 'server error 500');
     * </code>
     * 
     * The returned error message will be "Error message: server error 500 -
     * internal error"
     * @param PEAR_ErrorStack
     * @param array
     * @param string|false Pre-generated error message template
     *
     * @return string
     */
    public static function getErrorMessage(&$stack, $err, $template = false)
    {
        if ($template) {
            $mainmsg = $template;
        } else {
            $mainmsg = $stack->getErrorMessageTemplate($err['code']);
        }
        $mainmsg = str_replace('%__msg%', $err['message'], $mainmsg);
        if (is_array($err['params']) && count($err['params'])) {
            foreach ($err['params'] as $name => $val) {
                if (is_array($val)) {
                    // @ is needed in case $val is a multi-dimensional array
                    $val = @implode(', ', $val);
                }
                if (is_object($val)) {
                    if (method_exists($val, '__toString')) {
                        $val = $val->__toString();
                    } else {
                        PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_OBJTOSTRING,
                            'warning', array('obj' => get_class($val)),
                            'object %obj% passed into getErrorMessage, but has no __toString() method');
                        $val = 'Object';
                    }
                }
                $mainmsg = str_replace('%' . $name . '%', $val, $mainmsg);
            }
        }
        return $mainmsg;
    }
    
    /**
     * Standard Error Message Template generator from code
     * @return string
     */
    function getErrorMessageTemplate($code)
    {
        if (!isset($this->_errorMsgs[$code])) {
            return '%__msg%';
        }
        return $this->_errorMsgs[$code];
    }
    
    /**
     * Set the Error Message Template array
     * 
     * The array format must be:
     * <pre>
     * array(error code => 'message template',...)
     * </pre>
     * 
     * Error message parameters passed into {@link push()} will be used as input
     * for the error message.  If the template is 'message %foo% was %bar%', and the
     * parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will
     * be 'message one was six'
     * @return string
     */
    function setErrorMessageTemplate($template)
    {
        $this->_errorMsgs = $template;
    }
    
    
    /**
     * emulate PEAR::raiseError()
     * 
     * @return PEAR_Error
     */
    function raiseError()
    {
        require_once 'PEAR.php';
        $args = func_get_args();
        return call_user_func_array(array('PEAR', 'raiseError'), $args);
    }
}
$stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack');
$stack->pushCallback(array('PEAR_ErrorStack', '_handleError'));
?>
PK�a�\p�����pear/PEAR/Dependency2.phpnu�[���<?php
/**
 * PEAR_Dependency2, advanced dependency validation
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Required for the PEAR_VALIDATE_* constants
 */
require_once 'PEAR/Validate.php';

/**
 * Dependency check for PEAR packages
 *
 * This class handles both version 1.0 and 2.0 dependencies
 * WARNING: *any* changes to this class must be duplicated in the
 * test_PEAR_Dependency2 class found in tests/PEAR_Dependency2/setup.php.inc,
 * or unit tests will not actually validate the changes
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Dependency2
{
    /**
     * One of the PEAR_VALIDATE_* states
     * @see PEAR_VALIDATE_NORMAL
     * @var integer
     */
    var $_state;

    /**
     * Command-line options to install/upgrade/uninstall commands
     * @param array
     */
    var $_options;

    /**
     * @var OS_Guess
     */
    var $_os;

    /**
     * @var PEAR_Registry
     */
    var $_registry;

    /**
     * @var PEAR_Config
     */
    var $_config;

    /**
     * @var PEAR_DependencyDB
     */
    var $_dependencydb;

    /**
     * Output of PEAR_Registry::parsedPackageName()
     * @var array
     */
    var $_currentPackage;

    /**
     * @param PEAR_Config
     * @param array installation options
     * @param array format of PEAR_Registry::parsedPackageName()
     * @param int installation state (one of PEAR_VALIDATE_*)
     */
    function __construct(&$config, $installoptions, $package,
                              $state = PEAR_VALIDATE_INSTALLING)
    {
        $this->_config = &$config;
        if (!class_exists('PEAR_DependencyDB')) {
            require_once 'PEAR/DependencyDB.php';
        }

        if (isset($installoptions['packagingroot'])) {
            // make sure depdb is in the right location
            $config->setInstallRoot($installoptions['packagingroot']);
        }

        $this->_registry = &$config->getRegistry();
        $this->_dependencydb = &PEAR_DependencyDB::singleton($config);
        if (isset($installoptions['packagingroot'])) {
            $config->setInstallRoot(false);
        }

        $this->_options = $installoptions;
        $this->_state = $state;
        if (!class_exists('OS_Guess')) {
            require_once 'OS/Guess.php';
        }

        $this->_os = new OS_Guess;
        $this->_currentPackage = $package;
    }

    static function _getExtraString($dep)
    {
        $extra = ' (';
        if (isset($dep['uri'])) {
            return '';
        }

        if (isset($dep['recommended'])) {
            $extra .= 'recommended version ' . $dep['recommended'];
        } else {
            if (isset($dep['min'])) {
                $extra .= 'version >= ' . $dep['min'];
            }

            if (isset($dep['max'])) {
                if ($extra != ' (') {
                    $extra .= ', ';
                }
                $extra .= 'version <= ' . $dep['max'];
            }

            if (isset($dep['exclude'])) {
                if (!is_array($dep['exclude'])) {
                    $dep['exclude'] = array($dep['exclude']);
                }

                if ($extra != ' (') {
                    $extra .= ', ';
                }

                $extra .= 'excluded versions: ';
                foreach ($dep['exclude'] as $i => $exclude) {
                    if ($i) {
                        $extra .= ', ';
                    }
                    $extra .= $exclude;
                }
            }
        }

        $extra .= ')';
        if ($extra == ' ()') {
            $extra = '';
        }

        return $extra;
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function getPHP_OS()
    {
        return PHP_OS;
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function getsysname()
    {
        return $this->_os->getSysname();
    }

    /**
     * Specify a dependency on an OS.  Use arch for detailed os/processor information
     *
     * There are two generic OS dependencies that will be the most common, unix and windows.
     * Other options are linux, freebsd, darwin (OS X), sunos, irix, hpux, aix
     */
    function validateOsDependency($dep)
    {
        if ($this->_state != PEAR_VALIDATE_INSTALLING && $this->_state != PEAR_VALIDATE_DOWNLOADING) {
            return true;
        }

        if ($dep['name'] == '*') {
            return true;
        }

        $not = isset($dep['conflicts']) ? true : false;
        switch (strtolower($dep['name'])) {
            case 'windows' :
                if ($not) {
                    if (strtolower(substr($this->getPHP_OS(), 0, 3)) == 'win') {
                        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                            return $this->raiseError("Cannot install %s on Windows");
                        }

                        return $this->warning("warning: Cannot install %s on Windows");
                    }
                } else {
                    if (strtolower(substr($this->getPHP_OS(), 0, 3)) != 'win') {
                        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                            return $this->raiseError("Can only install %s on Windows");
                        }

                        return $this->warning("warning: Can only install %s on Windows");
                    }
                }
            break;
            case 'unix' :
                $unices = array('linux', 'freebsd', 'darwin', 'sunos', 'irix', 'hpux', 'aix');
                if ($not) {
                    if (in_array($this->getSysname(), $unices)) {
                        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                            return $this->raiseError("Cannot install %s on any Unix system");
                        }

                        return $this->warning( "warning: Cannot install %s on any Unix system");
                    }
                } else {
                    if (!in_array($this->getSysname(), $unices)) {
                        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                            return $this->raiseError("Can only install %s on a Unix system");
                        }

                        return $this->warning("warning: Can only install %s on a Unix system");
                    }
                }
            break;
            default :
                if ($not) {
                    if (strtolower($dep['name']) == strtolower($this->getSysname())) {
                        if (!isset($this->_options['nodeps']) &&
                              !isset($this->_options['force'])) {
                            return $this->raiseError('Cannot install %s on ' . $dep['name'] .
                                ' operating system');
                        }

                        return $this->warning('warning: Cannot install %s on ' .
                            $dep['name'] . ' operating system');
                    }
                } else {
                    if (strtolower($dep['name']) != strtolower($this->getSysname())) {
                        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                            return $this->raiseError('Cannot install %s on ' .
                                $this->getSysname() .
                                ' operating system, can only install on ' . $dep['name']);
                        }

                        return $this->warning('warning: Cannot install %s on ' .
                            $this->getSysname() .
                            ' operating system, can only install on ' . $dep['name']);
                    }
                }
        }
        return true;
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function matchSignature($pattern)
    {
        return $this->_os->matchSignature($pattern);
    }

    /**
     * Specify a complex dependency on an OS/processor/kernel version,
     * Use OS for simple operating system dependency.
     *
     * This is the only dependency that accepts an eregable pattern.  The pattern
     * will be matched against the php_uname() output parsed by OS_Guess
     */
    function validateArchDependency($dep)
    {
        if ($this->_state != PEAR_VALIDATE_INSTALLING) {
            return true;
        }

        $not = isset($dep['conflicts']) ? true : false;
        if (!$this->matchSignature($dep['pattern'])) {
            if (!$not) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s Architecture dependency failed, does not ' .
                        'match "' . $dep['pattern'] . '"');
                }

                return $this->warning('warning: %s Architecture dependency failed, does ' .
                    'not match "' . $dep['pattern'] . '"');
            }

            return true;
        }

        if ($not) {
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s Architecture dependency failed, required "' .
                    $dep['pattern'] . '"');
            }

            return $this->warning('warning: %s Architecture dependency failed, ' .
                'required "' . $dep['pattern'] . '"');
        }

        return true;
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function extension_loaded($name)
    {
        return extension_loaded($name);
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function phpversion($name = null)
    {
        if ($name !== null) {
            return phpversion($name);
        }

        return phpversion();
    }

    function validateExtensionDependency($dep, $required = true)
    {
        if ($this->_state != PEAR_VALIDATE_INSTALLING &&
              $this->_state != PEAR_VALIDATE_DOWNLOADING) {
            return true;
        }

        $loaded = $this->extension_loaded($dep['name']);
        $extra  = self::_getExtraString($dep);
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
        }

        if (!isset($dep['min']) && !isset($dep['max']) &&
            !isset($dep['recommended']) && !isset($dep['exclude'])
        ) {
            if ($loaded) {
                if (isset($dep['conflicts'])) {
                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s conflicts with PHP extension "' .
                            $dep['name'] . '"' . $extra);
                    }

                    return $this->warning('warning: %s conflicts with PHP extension "' .
                        $dep['name'] . '"' . $extra);
                }

                return true;
            }

            if (isset($dep['conflicts'])) {
                return true;
            }

            if ($required) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires PHP extension "' .
                        $dep['name'] . '"' . $extra);
                }

                return $this->warning('warning: %s requires PHP extension "' .
                    $dep['name'] . '"' . $extra);
            }

            return $this->warning('%s can optionally use PHP extension "' .
                $dep['name'] . '"' . $extra);
        }

        if (!$loaded) {
            if (isset($dep['conflicts'])) {
                return true;
            }

            if (!$required) {
                return $this->warning('%s can optionally use PHP extension "' .
                    $dep['name'] . '"' . $extra);
            }

            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s requires PHP extension "' . $dep['name'] .
                    '"' . $extra);
            }

            return $this->warning('warning: %s requires PHP extension "' . $dep['name'] .
                    '"' . $extra);
        }

        $version = (string) $this->phpversion($dep['name']);
        if (empty($version)) {
            $version = '0';
        }

        $fail = false;
        if (isset($dep['min']) && !version_compare($version, $dep['min'], '>=')) {
            $fail = true;
        }

        if (isset($dep['max']) && !version_compare($version, $dep['max'], '<=')) {
            $fail = true;
        }

        if ($fail && !isset($dep['conflicts'])) {
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s requires PHP extension "' . $dep['name'] .
                    '"' . $extra . ', installed version is ' . $version);
            }

            return $this->warning('warning: %s requires PHP extension "' . $dep['name'] .
                '"' . $extra . ', installed version is ' . $version);
        } elseif ((isset($dep['min']) || isset($dep['max'])) && !$fail && isset($dep['conflicts'])) {
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s conflicts with PHP extension "' .
                    $dep['name'] . '"' . $extra . ', installed version is ' . $version);
            }

            return $this->warning('warning: %s conflicts with PHP extension "' .
                $dep['name'] . '"' . $extra . ', installed version is ' . $version);
        }

        if (isset($dep['exclude'])) {
            foreach ($dep['exclude'] as $exclude) {
                if (version_compare($version, $exclude, '==')) {
                    if (isset($dep['conflicts'])) {
                        continue;
                    }

                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s is not compatible with PHP extension "' .
                            $dep['name'] . '" version ' .
                            $exclude);
                    }

                    return $this->warning('warning: %s is not compatible with PHP extension "' .
                        $dep['name'] . '" version ' .
                        $exclude);
                } elseif (version_compare($version, $exclude, '!=') && isset($dep['conflicts'])) {
                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s conflicts with PHP extension "' .
                            $dep['name'] . '"' . $extra . ', installed version is ' . $version);
                    }

                    return $this->warning('warning: %s conflicts with PHP extension "' .
                        $dep['name'] . '"' . $extra . ', installed version is ' . $version);
                }
            }
        }

        if (isset($dep['recommended'])) {
            if (version_compare($version, $dep['recommended'], '==')) {
                return true;
            }

            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s dependency: PHP extension ' . $dep['name'] .
                    ' version "' . $version . '"' .
                    ' is not the recommended version "' . $dep['recommended'] .
                    '", but may be compatible, use --force to install');
            }

            return $this->warning('warning: %s dependency: PHP extension ' .
                $dep['name'] . ' version "' . $version . '"' .
                ' is not the recommended version "' . $dep['recommended'].'"');
        }

        return true;
    }

    function validatePhpDependency($dep)
    {
        if ($this->_state != PEAR_VALIDATE_INSTALLING &&
              $this->_state != PEAR_VALIDATE_DOWNLOADING) {
            return true;
        }

        $version = $this->phpversion();
        $extra   = self::_getExtraString($dep);
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
        }

        if (isset($dep['min'])) {
            if (!version_compare($version, $dep['min'], '>=')) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires PHP' .
                        $extra . ', installed version is ' . $version);
                }

                return $this->warning('warning: %s requires PHP' .
                    $extra . ', installed version is ' . $version);
            }
        }

        if (isset($dep['max'])) {
            if (!version_compare($version, $dep['max'], '<=')) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires PHP' .
                        $extra . ', installed version is ' . $version);
                }

                return $this->warning('warning: %s requires PHP' .
                    $extra . ', installed version is ' . $version);
            }
        }

        if (isset($dep['exclude'])) {
            foreach ($dep['exclude'] as $exclude) {
                if (version_compare($version, $exclude, '==')) {
                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s is not compatible with PHP version ' .
                            $exclude);
                    }

                    return $this->warning(
                        'warning: %s is not compatible with PHP version ' .
                        $exclude);
                }
            }
        }

        return true;
    }

    /**
     * This makes unit-testing a heck of a lot easier
     */
    function getPEARVersion()
    {
        return '1.10.16';
    }

    function validatePearinstallerDependency($dep)
    {
        $pearversion = $this->getPEARVersion();
        $extra = self::_getExtraString($dep);
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
        }

        if (version_compare($pearversion, $dep['min'], '<')) {
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s requires PEAR Installer' . $extra .
                    ', installed version is ' . $pearversion);
            }

            return $this->warning('warning: %s requires PEAR Installer' . $extra .
                ', installed version is ' . $pearversion);
        }

        if (isset($dep['max'])) {
            if (version_compare($pearversion, $dep['max'], '>')) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires PEAR Installer' . $extra .
                        ', installed version is ' . $pearversion);
                }

                return $this->warning('warning: %s requires PEAR Installer' . $extra .
                    ', installed version is ' . $pearversion);
            }
        }

        if (isset($dep['exclude'])) {
            if (!isset($dep['exclude'][0])) {
                $dep['exclude'] = array($dep['exclude']);
            }

            foreach ($dep['exclude'] as $exclude) {
                if (version_compare($exclude, $pearversion, '==')) {
                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s is not compatible with PEAR Installer ' .
                            'version ' . $exclude);
                    }

                    return $this->warning('warning: %s is not compatible with PEAR ' .
                        'Installer version ' . $exclude);
                }
            }
        }

        return true;
    }

    function validateSubpackageDependency($dep, $required, $params)
    {
        return $this->validatePackageDependency($dep, $required, $params);
    }

    /**
     * @param array dependency information (2.0 format)
     * @param boolean whether this is a required dependency
     * @param array a list of downloaded packages to be installed, if any
     * @param boolean if true, then deps on pear.php.net that fail will also check
     *                against pecl.php.net packages to accommodate extensions that have
     *                moved to pecl.php.net from pear.php.net
     */
    function validatePackageDependency($dep, $required, $params, $depv1 = false)
    {
        if ($this->_state != PEAR_VALIDATE_INSTALLING &&
              $this->_state != PEAR_VALIDATE_DOWNLOADING) {
            return true;
        }

        if (isset($dep['providesextension'])) {
            if ($this->extension_loaded($dep['providesextension'])) {
                $save = $dep;
                $subdep = $dep;
                $subdep['name'] = $subdep['providesextension'];
                PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                $ret = $this->validateExtensionDependency($subdep, $required);
                PEAR::popErrorHandling();
                if (!PEAR::isError($ret)) {
                    return true;
                }
            }
        }

        if ($this->_state == PEAR_VALIDATE_INSTALLING) {
            return $this->_validatePackageInstall($dep, $required, $depv1);
        }

        if ($this->_state == PEAR_VALIDATE_DOWNLOADING) {
            return $this->_validatePackageDownload($dep, $required, $params, $depv1);
        }
    }

    function _validatePackageDownload($dep, $required, $params, $depv1 = false)
    {
        $dep['package'] = $dep['name'];
        if (isset($dep['uri'])) {
            $dep['channel'] = '__uri';
        }

        $depname = $this->_registry->parsedPackageNameToString($dep, true);
        $found = false;
        foreach ($params as $param) {
            if ($param->isEqual(
                  array('package' => $dep['name'],
                        'channel' => $dep['channel']))) {
                $found = true;
                break;
            }

            if ($depv1 && $dep['channel'] == 'pear.php.net') {
                if ($param->isEqual(
                  array('package' => $dep['name'],
                        'channel' => 'pecl.php.net'))) {
                    $found = true;
                    break;
                }
            }
        }

        if (!$found && isset($dep['providesextension'])) {
            foreach ($params as $param) {
                if ($param->isExtension($dep['providesextension'])) {
                    $found = true;
                    break;
                }
            }
        }

        if ($found) {
            $version = $param->getVersion();
            $installed = false;
            $downloaded = true;
        } else {
            if ($this->_registry->packageExists($dep['name'], $dep['channel'])) {
                $installed = true;
                $downloaded = false;
                $version = $this->_registry->packageinfo($dep['name'], 'version',
                    $dep['channel']);
            } else {
                if ($dep['channel'] == 'pecl.php.net' && $this->_registry->packageExists($dep['name'],
                      'pear.php.net')) {
                    $installed = true;
                    $downloaded = false;
                    $version = $this->_registry->packageinfo($dep['name'], 'version',
                        'pear.php.net');
                } else {
                    $version = 'not installed or downloaded';
                    $installed = false;
                    $downloaded = false;
                }
            }
        }

        $extra = self::_getExtraString($dep);
        if (isset($dep['exclude']) && !is_array($dep['exclude'])) {
            $dep['exclude'] = array($dep['exclude']);
        }

        if (!isset($dep['min']) && !isset($dep['max']) &&
              !isset($dep['recommended']) && !isset($dep['exclude'])
        ) {
            if ($installed || $downloaded) {
                $installed = $installed ? 'installed' : 'downloaded';
                if (isset($dep['conflicts'])) {
                    $rest = '';
                    if ($version) {
                        $rest = ", $installed version is " . $version;
                    }

                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s conflicts with package "' . $depname . '"' . $extra . $rest);
                    }

                    return $this->warning('warning: %s conflicts with package "' . $depname . '"' . $extra . $rest);
                }

                return true;
            }

            if (isset($dep['conflicts'])) {
                return true;
            }

            if ($required) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires package "' . $depname . '"' . $extra);
                }

                return $this->warning('warning: %s requires package "' . $depname . '"' . $extra);
            }

            return $this->warning('%s can optionally use package "' . $depname . '"' . $extra);
        }

        if (!$installed && !$downloaded) {
            if (isset($dep['conflicts'])) {
                return true;
            }

            if ($required) {
                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                    return $this->raiseError('%s requires package "' . $depname . '"' . $extra);
                }

                return $this->warning('warning: %s requires package "' . $depname . '"' . $extra);
            }

            return $this->warning('%s can optionally use package "' . $depname . '"' . $extra);
        }

        $fail = false;
        if (isset($dep['min']) && version_compare($version, $dep['min'], '<')) {
            $fail = true;
        }

        if (isset($dep['max']) && version_compare($version, $dep['max'], '>')) {
            $fail = true;
        }

        if ($fail && !isset($dep['conflicts'])) {
            $installed = $installed ? 'installed' : 'downloaded';
            $dep['package'] = $dep['name'];
            $dep = $this->_registry->parsedPackageNameToString($dep, true);
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s requires package "' . $depname . '"' .
                    $extra . ", $installed version is " . $version);
            }

            return $this->warning('warning: %s requires package "' . $depname . '"' .
                $extra . ", $installed version is " . $version);
        } elseif ((isset($dep['min']) || isset($dep['max'])) && !$fail &&
              isset($dep['conflicts']) && !isset($dep['exclude'])) {
            $installed = $installed ? 'installed' : 'downloaded';
            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('%s conflicts with package "' . $depname . '"' . $extra .
                    ", $installed version is " . $version);
            }

            return $this->warning('warning: %s conflicts with package "' . $depname . '"' .
                $extra . ", $installed version is " . $version);
        }

        if (isset($dep['exclude'])) {
            $installed = $installed ? 'installed' : 'downloaded';
            foreach ($dep['exclude'] as $exclude) {
                if (version_compare($version, $exclude, '==') && !isset($dep['conflicts'])) {
                    if (!isset($this->_options['nodeps']) &&
                          !isset($this->_options['force'])
                    ) {
                        return $this->raiseError('%s is not compatible with ' .
                            $installed . ' package "' .
                            $depname . '" version ' .
                            $exclude);
                    }

                    return $this->warning('warning: %s is not compatible with ' .
                        $installed . ' package "' .
                        $depname . '" version ' .
                        $exclude);
                } elseif (version_compare($version, $exclude, '!=') && isset($dep['conflicts'])) {
                    $installed = $installed ? 'installed' : 'downloaded';
                    if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                        return $this->raiseError('%s conflicts with package "' . $depname . '"' .
                            $extra . ", $installed version is " . $version);
                    }

                    return $this->warning('warning: %s conflicts with package "' . $depname . '"' .
                        $extra . ", $installed version is " . $version);
                }
            }
        }

        if (isset($dep['recommended'])) {
            $installed = $installed ? 'installed' : 'downloaded';
            if (version_compare($version, $dep['recommended'], '==')) {
                return true;
            }

            if (!$found && $installed) {
                $param = $this->_registry->getPackage($dep['name'], $dep['channel']);
            }

            if ($param) {
                $found = false;
                foreach ($params as $parent) {
                    if ($parent->isEqual($this->_currentPackage)) {
                        $found = true;
                        break;
                    }
                }

                if ($found) {
                    if ($param->isCompatible($parent)) {
                        return true;
                    }
                } else { // this is for validPackage() calls
                    $parent = $this->_registry->getPackage($this->_currentPackage['package'],
                        $this->_currentPackage['channel']);
                    if ($parent !== null && $param->isCompatible($parent)) {
                        return true;
                    }
                }
            }

            if (!isset($this->_options['nodeps']) && !isset($this->_options['force']) &&
                  !isset($this->_options['loose'])
            ) {
                return $this->raiseError('%s dependency package "' . $depname .
                    '" ' . $installed . ' version ' . $version .
                    ' is not the recommended version ' . $dep['recommended'] .
                    ', but may be compatible, use --force to install');
            }

            return $this->warning('warning: %s dependency package "' . $depname .
                '" ' . $installed . ' version ' . $version .
                ' is not the recommended version ' . $dep['recommended']);
        }

        return true;
    }

    function _validatePackageInstall($dep, $required, $depv1 = false)
    {
        return $this->_validatePackageDownload($dep, $required, array(), $depv1);
    }

    /**
     * Verify that uninstalling packages passed in to command line is OK.
     *
     * @param PEAR_Installer $dl
     * @return PEAR_Error|true
     */
    function validatePackageUninstall(&$dl)
    {
        if (PEAR::isError($this->_dependencydb)) {
            return $this->_dependencydb;
        }

        $params = array();
        // construct an array of "downloaded" packages to fool the package dependency checker
        // into using these to validate uninstalls of circular dependencies
        $downloaded = &$dl->getUninstallPackages();
        foreach ($downloaded as $i => $pf) {
            if (!class_exists('PEAR_Downloader_Package')) {
                require_once 'PEAR/Downloader/Package.php';
            }
            $dp = new PEAR_Downloader_Package($dl);
            $dp->setPackageFile($downloaded[$i]);
            $params[$i] = $dp;
        }

        // check cache
        $memyselfandI = strtolower($this->_currentPackage['channel']) . '/' .
            strtolower($this->_currentPackage['package']);
        if (isset($dl->___uninstall_package_cache)) {
            $badpackages = $dl->___uninstall_package_cache;
            if (isset($badpackages[$memyselfandI]['warnings'])) {
                foreach ($badpackages[$memyselfandI]['warnings'] as $warning) {
                    $dl->log(0, $warning[0]);
                }
            }

            if (isset($badpackages[$memyselfandI]['errors'])) {
                foreach ($badpackages[$memyselfandI]['errors'] as $error) {
                    if (is_array($error)) {
                        $dl->log(0, $error[0]);
                    } else {
                        $dl->log(0, $error->getMessage());
                    }
                }

                if (isset($this->_options['nodeps']) || isset($this->_options['force'])) {
                    return $this->warning(
                        'warning: %s should not be uninstalled, other installed packages depend ' .
                        'on this package');
                }

                return $this->raiseError(
                    '%s cannot be uninstalled, other installed packages depend on this package');
            }

            return true;
        }

        // first, list the immediate parents of each package to be uninstalled
        $perpackagelist = array();
        $allparents = array();
        foreach ($params as $i => $param) {
            $a = array(
                'channel' => strtolower($param->getChannel()),
                'package' => strtolower($param->getPackage())
            );

            $deps = $this->_dependencydb->getDependentPackages($a);
            if ($deps) {
                foreach ($deps as $d) {
                    $pardeps = $this->_dependencydb->getDependencies($d);
                    foreach ($pardeps as $dep) {
                        if (strtolower($dep['dep']['channel']) == $a['channel'] &&
                              strtolower($dep['dep']['name']) == $a['package']) {
                            if (!isset($perpackagelist[$a['channel'] . '/' . $a['package']])) {
                                $perpackagelist[$a['channel'] . '/' . $a['package']] = array();
                            }
                            $perpackagelist[$a['channel'] . '/' . $a['package']][]
                                = array($d['channel'] . '/' . $d['package'], $dep);
                            if (!isset($allparents[$d['channel'] . '/' . $d['package']])) {
                                $allparents[$d['channel'] . '/' . $d['package']] = array();
                            }
                            if (!isset($allparents[$d['channel'] . '/' . $d['package']][$a['channel'] . '/' . $a['package']])) {
                                $allparents[$d['channel'] . '/' . $d['package']][$a['channel'] . '/' . $a['package']] = array();
                            }
                            $allparents[$d['channel'] . '/' . $d['package']]
                                       [$a['channel'] . '/' . $a['package']][]
                                = array($d, $dep);
                        }
                    }
                }
            }
        }

        // next, remove any packages from the parents list that are not installed
        $remove = array();
        foreach ($allparents as $parent => $d1) {
            foreach ($d1 as $d) {
                if ($this->_registry->packageExists($d[0][0]['package'], $d[0][0]['channel'])) {
                    continue;
                }
                $remove[$parent] = true;
            }
        }

        // next remove any packages from the parents list that are not passed in for
        // uninstallation
        foreach ($allparents as $parent => $d1) {
            foreach ($d1 as $d) {
                foreach ($params as $param) {
                    if (strtolower($param->getChannel()) == $d[0][0]['channel'] &&
                          strtolower($param->getPackage()) == $d[0][0]['package']) {
                        // found it
                        continue 3;
                    }
                }
                $remove[$parent] = true;
            }
        }

        // remove all packages whose dependencies fail
        // save which ones failed for error reporting
        $badchildren = array();
        do {
            $fail = false;
            foreach ($remove as $package => $unused) {
                if (!isset($allparents[$package])) {
                    continue;
                }

                foreach ($allparents[$package] as $kid => $d1) {
                    foreach ($d1 as $depinfo) {
                        if ($depinfo[1]['type'] != 'optional') {
                            if (isset($badchildren[$kid])) {
                                continue;
                            }
                            $badchildren[$kid] = true;
                            $remove[$kid] = true;
                            $fail = true;
                            continue 2;
                        }
                    }
                }
                if ($fail) {
                    // start over, we removed some children
                    continue 2;
                }
            }
        } while ($fail);

        // next, construct the list of packages that can't be uninstalled
        $badpackages = array();
        $save = $this->_currentPackage;
        foreach ($perpackagelist as $package => $packagedeps) {
            foreach ($packagedeps as $parent) {
                if (!isset($remove[$parent[0]])) {
                    continue;
                }

                $packagename = $this->_registry->parsePackageName($parent[0]);
                $packagename['channel'] = $this->_registry->channelAlias($packagename['channel']);
                $pa = $this->_registry->getPackage($packagename['package'], $packagename['channel']);
                $packagename['package'] = $pa->getPackage();
                $this->_currentPackage = $packagename;
                // parent is not present in uninstall list, make sure we can actually
                // uninstall it (parent dep is optional)
                $parentname['channel'] = $this->_registry->channelAlias($parent[1]['dep']['channel']);
                $pa = $this->_registry->getPackage($parent[1]['dep']['name'], $parent[1]['dep']['channel']);
                $parentname['package'] = $pa->getPackage();
                $parent[1]['dep']['package'] = $parentname['package'];
                $parent[1]['dep']['channel'] = $parentname['channel'];
                if ($parent[1]['type'] == 'optional') {
                    $test = $this->_validatePackageUninstall($parent[1]['dep'], false, $dl);
                    if ($test !== true) {
                        $badpackages[$package]['warnings'][] = $test;
                    }
                } else {
                    $test = $this->_validatePackageUninstall($parent[1]['dep'], true, $dl);
                    if ($test !== true) {
                        $badpackages[$package]['errors'][] = $test;
                    }
                }
            }
        }

        $this->_currentPackage          = $save;
        $dl->___uninstall_package_cache = $badpackages;
        if (isset($badpackages[$memyselfandI])) {
            if (isset($badpackages[$memyselfandI]['warnings'])) {
                foreach ($badpackages[$memyselfandI]['warnings'] as $warning) {
                    $dl->log(0, $warning[0]);
                }
            }

            if (isset($badpackages[$memyselfandI]['errors'])) {
                foreach ($badpackages[$memyselfandI]['errors'] as $error) {
                    if (is_array($error)) {
                        $dl->log(0, $error[0]);
                    } else {
                        $dl->log(0, $error->getMessage());
                    }
                }

                if (isset($this->_options['nodeps']) || isset($this->_options['force'])) {
                    return $this->warning(
                        'warning: %s should not be uninstalled, other installed packages depend ' .
                        'on this package');
                }

                return $this->raiseError(
                    '%s cannot be uninstalled, other installed packages depend on this package');
            }
        }

        return true;
    }

    function _validatePackageUninstall($dep, $required, $dl)
    {
        $depname = $this->_registry->parsedPackageNameToString($dep, true);
        $version = $this->_registry->packageinfo($dep['package'], 'version', $dep['channel']);
        if (!$version) {
            return true;
        }

        $extra = self::_getExtraString($dep);
        if (isset($dep['exclude']) && !is_array($dep['exclude'])) {
            $dep['exclude'] = array($dep['exclude']);
        }

        if (isset($dep['conflicts'])) {
            return true; // uninstall OK - these packages conflict (probably installed with --force)
        }

        if (!isset($dep['min']) && !isset($dep['max'])) {
            if (!$required) {
                return $this->warning('"' . $depname . '" can be optionally used by ' .
                        'installed package %s' . $extra);
            }

            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
                return $this->raiseError('"' . $depname . '" is required by ' .
                    'installed package %s' . $extra);
            }

            return $this->warning('warning: "' . $depname . '" is required by ' .
                'installed package %s' . $extra);
        }

        $fail = false;
        if (isset($dep['min']) && version_compare($version, $dep['min'], '>=')) {
            $fail = true;
        }

        if (isset($dep['max']) && version_compare($version, $dep['max'], '<=')) {
            $fail = true;
        }

        // we re-use this variable, preserve the original value
        $saverequired = $required;
        if (!$required) {
            return $this->warning($depname . $extra . ' can be optionally used by installed package' .
                    ' "%s"');
        }

        if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {
            return $this->raiseError($depname . $extra . ' is required by installed package' .
                ' "%s"');
        }

        return $this->raiseError('warning: ' . $depname . $extra .
            ' is required by installed package "%s"');
    }

    /**
     * validate a downloaded package against installed packages
     *
     * As of PEAR 1.4.3, this will only validate
     *
     * @param array|PEAR_Downloader_Package|PEAR_PackageFile_v1|PEAR_PackageFile_v2
     *              $pkg package identifier (either
     *                   array('package' => blah, 'channel' => blah) or an array with
     *                   index 'info' referencing an object)
     * @param PEAR_Downloader $dl
     * @param array $params full list of packages to install
     * @return true|PEAR_Error
     */
    function validatePackage($pkg, &$dl, $params = array())
    {
        if (is_array($pkg) && isset($pkg['info'])) {
            $deps = $this->_dependencydb->getDependentPackageDependencies($pkg['info']);
        } else {
            $deps = $this->_dependencydb->getDependentPackageDependencies($pkg);
        }

        $fail = false;
        if ($deps) {
            if (!class_exists('PEAR_Downloader_Package')) {
                require_once 'PEAR/Downloader/Package.php';
            }

            $dp = new PEAR_Downloader_Package($dl);
            if (is_object($pkg)) {
                $dp->setPackageFile($pkg);
            } else {
                $dp->setDownloadURL($pkg);
            }

            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            foreach ($deps as $channel => $info) {
                foreach ($info as $package => $ds) {
                    foreach ($params as $packd) {
                        if (strtolower($packd->getPackage()) == strtolower($package) &&
                              $packd->getChannel() == $channel) {
                            $dl->log(3, 'skipping installed package check of "' .
                                        $this->_registry->parsedPackageNameToString(
                                            array('channel' => $channel, 'package' => $package),
                                            true) .
                                        '", version "' . $packd->getVersion() . '" will be ' .
                                        'downloaded and installed');
                            continue 2; // jump to next package
                        }
                    }

                    foreach ($ds as $d) {
                        $checker = new PEAR_Dependency2($this->_config, $this->_options,
                            array('channel' => $channel, 'package' => $package), $this->_state);
                        $dep = $d['dep'];
                        $required = $d['type'] == 'required';
                        $ret = $checker->_validatePackageDownload($dep, $required, array(&$dp));
                        if (is_array($ret)) {
                            $dl->log(0, $ret[0]);
                        } elseif (PEAR::isError($ret)) {
                            $dl->log(0, $ret->getMessage());
                            $fail = true;
                        }
                    }
                }
            }
            PEAR::popErrorHandling();
        }

        if ($fail) {
            return $this->raiseError(
                '%s cannot be installed, conflicts with installed packages');
        }

        return true;
    }

    /**
     * validate a package.xml 1.0 dependency
     */
    function validateDependency1($dep, $params = array())
    {
        if (!isset($dep['optional'])) {
            $dep['optional'] = 'no';
        }

        list($newdep, $type) = self::normalizeDep($dep);
        if (!$newdep) {
            return $this->raiseError("Invalid Dependency");
        }

        if (method_exists($this, "validate{$type}Dependency")) {
            return $this->{"validate{$type}Dependency"}($newdep, $dep['optional'] == 'no',
                $params, true);
        }
    }

    /**
     * Convert a 1.0 dep into a 2.0 dep
     */
    static function normalizeDep($dep)
    {
        $types = array(
            'pkg' => 'Package',
            'ext' => 'Extension',
            'os' => 'Os',
            'php' => 'Php'
        );

        if (!isset($types[$dep['type']])) {
            return array(false, false);
        }

        $type = $types[$dep['type']];

        $newdep = array();
        switch ($type) {
            case 'Package' :
                $newdep['channel'] = 'pear.php.net';
            case 'Extension' :
            case 'Os' :
                $newdep['name'] = $dep['name'];
            break;
        }

        $dep['rel'] = PEAR_Dependency2::signOperator($dep['rel']);
        switch ($dep['rel']) {
            case 'has' :
                return array($newdep, $type);
            break;
            case 'not' :
                $newdep['conflicts'] = true;
            break;
            case '>=' :
            case '>' :
                $newdep['min'] = $dep['version'];
                if ($dep['rel'] == '>') {
                    $newdep['exclude'] = $dep['version'];
                }
            break;
            case '<=' :
            case '<' :
                $newdep['max'] = $dep['version'];
                if ($dep['rel'] == '<') {
                    $newdep['exclude'] = $dep['version'];
                }
            break;
            case 'ne' :
            case '!=' :
                $newdep['min'] = '0';
                $newdep['max'] = '100000';
                $newdep['exclude'] = $dep['version'];
            break;
            case '==' :
                $newdep['min'] = $dep['version'];
                $newdep['max'] = $dep['version'];
            break;
        }
        if ($type == 'Php') {
            if (!isset($newdep['min'])) {
                $newdep['min'] = '4.4.0';
            }

            if (!isset($newdep['max'])) {
                $newdep['max'] = '6.0.0';
            }
        }
        return array($newdep, $type);
    }

    /**
     * Converts text comparing operators to them sign equivalents
     *
     * Example: 'ge' to '>='
     *
     * @access public
     * @param  string Operator
     * @return string Sign equivalent
     */
    static function signOperator($operator)
    {
        switch($operator) {
            case 'lt': return '<';
            case 'le': return '<=';
            case 'gt': return '>';
            case 'ge': return '>=';
            case 'eq': return '==';
            case 'ne': return '!=';
            default:
                return $operator;
        }
    }

    function raiseError($msg)
    {
        if (isset($this->_options['ignore-errors'])) {
            return $this->warning($msg);
        }

        return PEAR::raiseError(sprintf($msg, $this->_registry->parsedPackageNameToString(
            $this->_currentPackage, true)));
    }

    function warning($msg)
    {
        return array(sprintf($msg, $this->_registry->parsedPackageNameToString(
            $this->_currentPackage, true)));
    }
}
PK�a�\r"����pear/PEAR/ChannelFile.phpnu�[���<?php
/**
 * PEAR_ChannelFile, the channel handling class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Needed for error handling
 */
require_once 'PEAR/ErrorStack.php';
require_once 'PEAR/XMLParser.php';
require_once 'PEAR/Common.php';

/**
 * Error code if the channel.xml <channel> tag does not contain a valid version
 */
define('PEAR_CHANNELFILE_ERROR_NO_VERSION', 1);
/**
 * Error code if the channel.xml <channel> tag version is not supported (version 1.0 is the only supported version,
 * currently
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_VERSION', 2);

/**
 * Error code if parsing is attempted with no xml extension
 */
define('PEAR_CHANNELFILE_ERROR_NO_XML_EXT', 3);

/**
 * Error code if creating the xml parser resource fails
 */
define('PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER', 4);

/**
 * Error code used for all sax xml parsing errors
 */
define('PEAR_CHANNELFILE_ERROR_PARSER_ERROR', 5);

/**#@+
 * Validation errors
 */
/**
 * Error code when channel name is missing
 */
define('PEAR_CHANNELFILE_ERROR_NO_NAME', 6);
/**
 * Error code when channel name is invalid
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_NAME', 7);
/**
 * Error code when channel summary is missing
 */
define('PEAR_CHANNELFILE_ERROR_NO_SUMMARY', 8);
/**
 * Error code when channel summary is multi-line
 */
define('PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY', 9);
/**
 * Error code when channel server is missing for protocol
 */
define('PEAR_CHANNELFILE_ERROR_NO_HOST', 10);
/**
 * Error code when channel server is invalid for protocol
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_HOST', 11);
/**
 * Error code when a mirror name is invalid
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_MIRROR', 21);
/**
 * Error code when a mirror type is invalid
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_MIRRORTYPE', 22);
/**
 * Error code when an attempt is made to generate xml, but the parsed content is invalid
 */
define('PEAR_CHANNELFILE_ERROR_INVALID', 23);
/**
 * Error code when an empty package name validate regex is passed in
 */
define('PEAR_CHANNELFILE_ERROR_EMPTY_REGEX', 24);
/**
 * Error code when a <function> tag has no version
 */
define('PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION', 25);
/**
 * Error code when a <function> tag has no name
 */
define('PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME', 26);
/**
 * Error code when a <validatepackage> tag has no name
 */
define('PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME', 27);
/**
 * Error code when a <validatepackage> tag has no version attribute
 */
define('PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION', 28);
/**
 * Error code when a mirror does not exist but is called for in one of the set*
 * methods.
 */
define('PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND', 32);
/**
 * Error code when a server port is not numeric
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_PORT', 33);
/**
 * Error code when <static> contains no version attribute
 */
define('PEAR_CHANNELFILE_ERROR_NO_STATICVERSION', 34);
/**
 * Error code when <baseurl> contains no type attribute in a <rest> protocol definition
 */
define('PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE', 35);
/**
 * Error code when a mirror is defined and the channel.xml represents the __uri pseudo-channel
 */
define('PEAR_CHANNELFILE_URI_CANT_MIRROR', 36);
/**
 * Error code when ssl attribute is present and is not "yes"
 */
define('PEAR_CHANNELFILE_ERROR_INVALID_SSL', 37);
/**#@-*/

/**
 * Mirror types allowed.  Currently only internet servers are recognized.
 */
$GLOBALS['_PEAR_CHANNELS_MIRROR_TYPES'] =  array('server');


/**
 * The Channel handling class
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_ChannelFile
{
    /**
     * @access private
     * @var PEAR_ErrorStack
     * @access private
     */
    var $_stack;

    /**
     * Supported channel.xml versions, for parsing
     * @var array
     * @access private
     */
    var $_supportedVersions = array('1.0');

    /**
     * Parsed channel information
     * @var array
     * @access private
     */
    var $_channelInfo;

    /**
     * index into the subchannels array, used for parsing xml
     * @var int
     * @access private
     */
    var $_subchannelIndex;

    /**
     * index into the mirrors array, used for parsing xml
     * @var int
     * @access private
     */
    var $_mirrorIndex;

    /**
     * Flag used to determine the validity of parsed content
     * @var boolean
     * @access private
     */
    var $_isValid = false;

    function __construct()
    {
        $this->_stack = new PEAR_ErrorStack('PEAR_ChannelFile');
        $this->_stack->setErrorMessageTemplate($this->_getErrorMessage());
        $this->_isValid = false;
    }

    /**
     * @return array
     * @access protected
     */
    function _getErrorMessage()
    {
        return
            array(
                PEAR_CHANNELFILE_ERROR_INVALID_VERSION =>
                    'While parsing channel.xml, an invalid version number "%version% was passed in, expecting one of %versions%',
                PEAR_CHANNELFILE_ERROR_NO_VERSION =>
                    'No version number found in <channel> tag',
                PEAR_CHANNELFILE_ERROR_NO_XML_EXT =>
                    '%error%',
                PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER =>
                    'Unable to create XML parser',
                PEAR_CHANNELFILE_ERROR_PARSER_ERROR =>
                    '%error%',
                PEAR_CHANNELFILE_ERROR_NO_NAME =>
                    'Missing channel name',
                PEAR_CHANNELFILE_ERROR_INVALID_NAME =>
                    'Invalid channel %tag% "%name%"',
                PEAR_CHANNELFILE_ERROR_NO_SUMMARY =>
                    'Missing channel summary',
                PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY =>
                    'Channel summary should be on one line, but is multi-line',
                PEAR_CHANNELFILE_ERROR_NO_HOST =>
                    'Missing channel server for %type% server',
                PEAR_CHANNELFILE_ERROR_INVALID_HOST =>
                    'Server name "%server%" is invalid for %type% server',
                PEAR_CHANNELFILE_ERROR_INVALID_MIRROR =>
                    'Invalid mirror name "%name%", mirror type %type%',
                PEAR_CHANNELFILE_ERROR_INVALID_MIRRORTYPE =>
                    'Invalid mirror type "%type%"',
                PEAR_CHANNELFILE_ERROR_INVALID =>
                    'Cannot generate xml, contents are invalid',
                PEAR_CHANNELFILE_ERROR_EMPTY_REGEX =>
                    'packagenameregex cannot be empty',
                PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION =>
                    '%parent% %protocol% function has no version',
                PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME =>
                    '%parent% %protocol% function has no name',
                PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE =>
                    '%parent% rest baseurl has no type',
                PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME =>
                    'Validation package has no name in <validatepackage> tag',
                PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION =>
                    'Validation package "%package%" has no version',
                PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND =>
                    'Mirror "%mirror%" does not exist',
                PEAR_CHANNELFILE_ERROR_INVALID_PORT =>
                    'Port "%port%" must be numeric',
                PEAR_CHANNELFILE_ERROR_NO_STATICVERSION =>
                    '<static> tag must contain version attribute',
                PEAR_CHANNELFILE_URI_CANT_MIRROR =>
                    'The __uri pseudo-channel cannot have mirrors',
                PEAR_CHANNELFILE_ERROR_INVALID_SSL =>
                    '%server% has invalid ssl attribute "%ssl%" can only be yes or not present',
            );
    }

    /**
     * @param string contents of package.xml file
     * @return bool success of parsing
     */
    function fromXmlString($data)
    {
        if (preg_match('/<channel\s+version="([0-9]+\.[0-9]+)"/', $data, $channelversion)) {
            if (!in_array($channelversion[1], $this->_supportedVersions)) {
                $this->_stack->push(PEAR_CHANNELFILE_ERROR_INVALID_VERSION, 'error',
                    array('version' => $channelversion[1]));
                return false;
            }
            $parser = new PEAR_XMLParser;
            $result = $parser->parse($data);
            if ($result !== true) {
                if ($result->getCode() == 1) {
                    $this->_stack->push(PEAR_CHANNELFILE_ERROR_NO_XML_EXT, 'error',
                        array('error' => $result->getMessage()));
                } else {
                    $this->_stack->push(PEAR_CHANNELFILE_ERROR_CANT_MAKE_PARSER, 'error');
                }
                return false;
            }
            $this->_channelInfo = $parser->getData();
            return true;
        } else {
            $this->_stack->push(PEAR_CHANNELFILE_ERROR_NO_VERSION, 'error', array('xml' => $data));
            return false;
        }
    }

    /**
     * @return array
     */
    function toArray()
    {
        if (!$this->_isValid && !$this->validate()) {
            return false;
        }
        return $this->_channelInfo;
    }

    /**
     * @param array
     *
     * @return PEAR_ChannelFile|false false if invalid
     */
    public static function &fromArray(
        $data, $compatibility = false, $stackClass = 'PEAR_ErrorStack'
    ) {
        $a = new PEAR_ChannelFile($compatibility, $stackClass);
        $a->_fromArray($data);
        if (!$a->validate()) {
            $a = false;
            return $a;
        }
        return $a;
    }

    /**
     * Unlike {@link fromArray()} this does not do any validation
     *
     * @param array
     *
     * @return PEAR_ChannelFile
     */
    public static function &fromArrayWithErrors(
        $data, $compatibility = false, $stackClass = 'PEAR_ErrorStack'
    ) {
        $a = new PEAR_ChannelFile($compatibility, $stackClass);
        $a->_fromArray($data);
        return $a;
    }

    /**
     * @param array
     * @access private
     */
    function _fromArray($data)
    {
        $this->_channelInfo = $data;
    }

    /**
     * Wrapper to {@link PEAR_ErrorStack::getErrors()}
     * @param boolean determines whether to purge the error stack after retrieving
     * @return array
     */
    function getErrors($purge = false)
    {
        return $this->_stack->getErrors($purge);
    }

    /**
     * Unindent given string (?)
     *
     * @param string $str The string that has to be unindented.
     * @return string
     * @access private
     */
    function _unIndent($str)
    {
        // remove leading newlines
        $str = preg_replace('/^[\r\n]+/', '', $str);
        // find whitespace at the beginning of the first line
        $indent_len = strspn($str, " \t");
        $indent = substr($str, 0, $indent_len);
        $data = '';
        // remove the same amount of whitespace from following lines
        foreach (explode("\n", $str) as $line) {
            if (substr($line, 0, $indent_len) == $indent) {
                $data .= substr($line, $indent_len) . "\n";
            }
        }
        return $data;
    }

    /**
     * Parse a channel.xml file.  Expects the name of
     * a channel xml file as input.
     *
     * @param string  $descfile  name of channel xml file
     * @return bool success of parsing
     */
    function fromXmlFile($descfile)
    {
        if (!file_exists($descfile) || !is_file($descfile) || !is_readable($descfile) ||
             (!$fp = fopen($descfile, 'r'))) {
            require_once 'PEAR.php';
            return PEAR::raiseError("Unable to open $descfile");
        }

        // read the whole thing so we only get one cdata callback
        // for each block of cdata
        fclose($fp);
        $data = file_get_contents($descfile);
        return $this->fromXmlString($data);
    }

    /**
     * Parse channel information from different sources
     *
     * This method is able to extract information about a channel
     * from an .xml file or a string
     *
     * @access public
     * @param  string Filename of the source or the source itself
     * @return bool
     */
    function fromAny($info)
    {
        if (is_string($info) && file_exists($info) && strlen($info) < 255) {
            $tmp = substr($info, -4);
            if ($tmp == '.xml') {
                $info = $this->fromXmlFile($info);
            } else {
                $fp = fopen($info, "r");
                $test = fread($fp, 5);
                fclose($fp);
                if ($test == "<?xml") {
                    $info = $this->fromXmlFile($info);
                }
            }
            if (PEAR::isError($info)) {
                require_once 'PEAR.php';
                return PEAR::raiseError($info);
            }
        }
        if (is_string($info)) {
            $info = $this->fromXmlString($info);
        }
        return $info;
    }

    /**
     * Return an XML document based on previous parsing and modifications
     *
     * @return string XML data
     *
     * @access public
     */
    function toXml()
    {
        if (!$this->_isValid && !$this->validate()) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID);
            return false;
        }
        if (!isset($this->_channelInfo['attribs']['version'])) {
            $this->_channelInfo['attribs']['version'] = '1.0';
        }
        $channelInfo = $this->_channelInfo;
        $ret = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
        $ret .= "<channel version=\"" .
            $channelInfo['attribs']['version'] . "\" xmlns=\"http://pear.php.net/channel-1.0\"
  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
  xsi:schemaLocation=\"http://pear.php.net/dtd/channel-"
            . $channelInfo['attribs']['version'] . " http://pear.php.net/dtd/channel-" .
            $channelInfo['attribs']['version'] . ".xsd\">
 <name>$channelInfo[name]</name>
 <summary>" . htmlspecialchars($channelInfo['summary'])."</summary>
";
        if (isset($channelInfo['suggestedalias'])) {
            $ret .= ' <suggestedalias>' . $channelInfo['suggestedalias'] . "</suggestedalias>\n";
        }
        if (isset($channelInfo['validatepackage'])) {
            $ret .= ' <validatepackage version="' .
                $channelInfo['validatepackage']['attribs']['version']. '">' .
                htmlspecialchars($channelInfo['validatepackage']['_content']) .
                "</validatepackage>\n";
        }
        $ret .= " <servers>\n";
        $ret .= '  <primary';
        if (isset($channelInfo['servers']['primary']['attribs']['ssl'])) {
            $ret .= ' ssl="' . $channelInfo['servers']['primary']['attribs']['ssl'] . '"';
        }
        if (isset($channelInfo['servers']['primary']['attribs']['port'])) {
            $ret .= ' port="' . $channelInfo['servers']['primary']['attribs']['port'] . '"';
        }
        $ret .= ">\n";
        if (isset($channelInfo['servers']['primary']['rest'])) {
            $ret .= $this->_makeRestXml($channelInfo['servers']['primary']['rest'], '   ');
        }
        $ret .= "  </primary>\n";
        if (isset($channelInfo['servers']['mirror'])) {
            $ret .= $this->_makeMirrorsXml($channelInfo);
        }
        $ret .= " </servers>\n";
        $ret .= "</channel>";
        return str_replace("\r", "\n", str_replace("\r\n", "\n", $ret));
    }

    /**
     * Generate the <rest> tag
     * @access private
     */
    function _makeRestXml($info, $indent)
    {
        $ret = $indent . "<rest>\n";
        if (isset($info['baseurl']) && !isset($info['baseurl'][0])) {
            $info['baseurl'] = array($info['baseurl']);
        }

        if (isset($info['baseurl'])) {
            foreach ($info['baseurl'] as $url) {
                $ret .= "$indent <baseurl type=\"" . $url['attribs']['type'] . "\"";
                $ret .= ">" . $url['_content'] . "</baseurl>\n";
            }
        }
        $ret .= $indent . "</rest>\n";
        return $ret;
    }

    /**
     * Generate the <mirrors> tag
     * @access private
     */
    function _makeMirrorsXml($channelInfo)
    {
        $ret = "";
        if (!isset($channelInfo['servers']['mirror'][0])) {
            $channelInfo['servers']['mirror'] = array($channelInfo['servers']['mirror']);
        }
        foreach ($channelInfo['servers']['mirror'] as $mirror) {
            $ret .= '  <mirror host="' . $mirror['attribs']['host'] . '"';
            if (isset($mirror['attribs']['port'])) {
                $ret .= ' port="' . $mirror['attribs']['port'] . '"';
            }
            if (isset($mirror['attribs']['ssl'])) {
                $ret .= ' ssl="' . $mirror['attribs']['ssl'] . '"';
            }
            $ret .= ">\n";
            if (isset($mirror['rest'])) {
                if (isset($mirror['rest'])) {
                    $ret .= $this->_makeRestXml($mirror['rest'], '   ');
                }
                $ret .= "  </mirror>\n";
            } else {
                $ret .= "/>\n";
            }
        }
        return $ret;
    }

    /**
     * Generate the <functions> tag
     * @access private
     */
    function _makeFunctionsXml($functions, $indent, $rest = false)
    {
        $ret = '';
        if (!isset($functions[0])) {
            $functions = array($functions);
        }
        foreach ($functions as $function) {
            $ret .= "$indent<function version=\"" . $function['attribs']['version'] . "\"";
            if ($rest) {
                $ret .= ' uri="' . $function['attribs']['uri'] . '"';
            }
            $ret .= ">" . $function['_content'] . "</function>\n";
        }
        return $ret;
    }

    /**
     * Validation error.  Also marks the object contents as invalid
     * @param error code
     * @param array error information
     * @access private
     */
    function _validateError($code, $params = array())
    {
        $this->_stack->push($code, 'error', $params);
        $this->_isValid = false;
    }

    /**
     * Validation warning.  Does not mark the object contents invalid.
     * @param error code
     * @param array error information
     * @access private
     */
    function _validateWarning($code, $params = array())
    {
        $this->_stack->push($code, 'warning', $params);
    }

    /**
     * Validate parsed file.
     *
     * @access public
     * @return boolean
     */
    function validate()
    {
        $this->_isValid = true;
        $info = $this->_channelInfo;
        if (empty($info['name'])) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_NAME);
        } elseif (!$this->validChannelServer($info['name'])) {
            if ($info['name'] != '__uri') {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME, array('tag' => 'name',
                    'name' => $info['name']));
            }
        }
        if (empty($info['summary'])) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SUMMARY);
        } elseif (strpos(trim($info['summary']), "\n") !== false) {
            $this->_validateWarning(PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY,
                array('summary' => $info['summary']));
        }
        if (isset($info['suggestedalias'])) {
            if (!$this->validChannelServer($info['suggestedalias'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
                    array('tag' => 'suggestedalias', 'name' =>$info['suggestedalias']));
            }
        }
        if (isset($info['localalias'])) {
            if (!$this->validChannelServer($info['localalias'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
                    array('tag' => 'localalias', 'name' =>$info['localalias']));
            }
        }
        if (isset($info['validatepackage'])) {
            if (!isset($info['validatepackage']['_content'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_NOVALIDATE_NAME);
            }
            if (!isset($info['validatepackage']['attribs']['version'])) {
                $content = isset($info['validatepackage']['_content']) ?
                    $info['validatepackage']['_content'] :
                    null;
                $this->_validateError(PEAR_CHANNELFILE_ERROR_NOVALIDATE_VERSION,
                    array('package' => $content));
            }
        }

        if (isset($info['servers']['primary']['attribs'], $info['servers']['primary']['attribs']['port']) &&
              !is_numeric($info['servers']['primary']['attribs']['port'])) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_PORT,
                array('port' => $info['servers']['primary']['attribs']['port']));
        }

        if (isset($info['servers']['primary']['attribs'], $info['servers']['primary']['attribs']['ssl']) &&
              $info['servers']['primary']['attribs']['ssl'] != 'yes') {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_SSL,
                array('ssl' => $info['servers']['primary']['attribs']['ssl'],
                    'server' => $info['name']));
        }

        if (isset($info['servers']['primary']['rest']) &&
              isset($info['servers']['primary']['rest']['baseurl'])) {
            $this->_validateFunctions('rest', $info['servers']['primary']['rest']['baseurl']);
        }
        if (isset($info['servers']['mirror'])) {
            if ($this->_channelInfo['name'] == '__uri') {
                $this->_validateError(PEAR_CHANNELFILE_URI_CANT_MIRROR);
            }
            if (!isset($info['servers']['mirror'][0])) {
                $info['servers']['mirror'] = array($info['servers']['mirror']);
            }
            foreach ($info['servers']['mirror'] as $mirror) {
                if (!isset($mirror['attribs']['host'])) {
                    $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_HOST,
                      array('type' => 'mirror'));
                } elseif (!$this->validChannelServer($mirror['attribs']['host'])) {
                    $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_HOST,
                        array('server' => $mirror['attribs']['host'], 'type' => 'mirror'));
                }
                if (isset($mirror['attribs']['ssl']) && $mirror['attribs']['ssl'] != 'yes') {
                    $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_SSL,
                        array('ssl' => $info['ssl'], 'server' => $mirror['attribs']['host']));
                }
                if (isset($mirror['rest'])) {
                    $this->_validateFunctions('rest', $mirror['rest']['baseurl'],
                        $mirror['attribs']['host']);
                }
            }
        }
        return $this->_isValid;
    }

    /**
     * @param string  rest - protocol name this function applies to
     * @param array the functions
     * @param string the name of the parent element (mirror name, for instance)
     */
    function _validateFunctions($protocol, $functions, $parent = '')
    {
        if (!isset($functions[0])) {
            $functions = array($functions);
        }

        foreach ($functions as $function) {
            if (!isset($function['_content']) || empty($function['_content'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_FUNCTIONNAME,
                    array('parent' => $parent, 'protocol' => $protocol));
            }

            if ($protocol == 'rest') {
                if (!isset($function['attribs']['type']) ||
                      empty($function['attribs']['type'])) {
                    $this->_validateError(PEAR_CHANNELFILE_ERROR_NOBASEURLTYPE,
                        array('parent' => $parent, 'protocol' => $protocol));
                }
            } else {
                if (!isset($function['attribs']['version']) ||
                      empty($function['attribs']['version'])) {
                    $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_FUNCTIONVERSION,
                        array('parent' => $parent, 'protocol' => $protocol));
                }
            }
        }
    }

    /**
     * Test whether a string contains a valid channel server.
     * @param string $ver the package version to test
     * @return bool
     */
    function validChannelServer($server)
    {
        if ($server == '__uri') {
            return true;
        }
        return (bool) preg_match(PEAR_CHANNELS_SERVER_PREG, $server);
    }

    /**
     * @return string|false
     */
    function getName()
    {
        if (isset($this->_channelInfo['name'])) {
            return $this->_channelInfo['name'];
        }

        return false;
    }

    /**
     * @return string|false
     */
    function getServer()
    {
        if (isset($this->_channelInfo['name'])) {
            return $this->_channelInfo['name'];
        }

        return false;
    }

    /**
     * @return int|80 port number to connect to
     */
    function getPort($mirror = false)
    {
        if ($mirror) {
            if ($mir = $this->getMirror($mirror)) {
                if (isset($mir['attribs']['port'])) {
                    return $mir['attribs']['port'];
                }

                if ($this->getSSL($mirror)) {
                    return 443;
                }

                return 80;
            }

            return false;
        }

        if (isset($this->_channelInfo['servers']['primary']['attribs']['port'])) {
            return $this->_channelInfo['servers']['primary']['attribs']['port'];
        }

        if ($this->getSSL()) {
            return 443;
        }

        return 80;
    }

    /**
     * @return bool Determines whether secure sockets layer (SSL) is used to connect to this channel
     */
    function getSSL($mirror = false)
    {
        if ($mirror) {
            if ($mir = $this->getMirror($mirror)) {
                if (isset($mir['attribs']['ssl'])) {
                    return true;
                }

                return false;
            }

            return false;
        }

        if (isset($this->_channelInfo['servers']['primary']['attribs']['ssl'])) {
            return true;
        }

        return false;
    }

    /**
     * @return string|false
     */
    function getSummary()
    {
        if (isset($this->_channelInfo['summary'])) {
            return $this->_channelInfo['summary'];
        }

        return false;
    }

    /**
     * @param string protocol type
     * @param string Mirror name
     * @return array|false
     */
    function getFunctions($protocol, $mirror = false)
    {
        if ($this->getName() == '__uri') {
            return false;
        }

        $function = $protocol == 'rest' ? 'baseurl' : 'function';
        if ($mirror) {
            if ($mir = $this->getMirror($mirror)) {
                if (isset($mir[$protocol][$function])) {
                    return $mir[$protocol][$function];
                }
            }

            return false;
        }

        if (isset($this->_channelInfo['servers']['primary'][$protocol][$function])) {
            return $this->_channelInfo['servers']['primary'][$protocol][$function];
        }

        return false;
    }

    /**
     * @param string Protocol type
     * @param string Function name (null to return the
     *               first protocol of the type requested)
     * @param string Mirror name, if any
     * @return array
     */
     function getFunction($type, $name = null, $mirror = false)
     {
        $protocols = $this->getFunctions($type, $mirror);
        if (!$protocols) {
            return false;
        }

        foreach ($protocols as $protocol) {
            if ($name === null) {
                return $protocol;
            }

            if ($protocol['_content'] != $name) {
                continue;
            }

            return $protocol;
        }

        return false;
     }

    /**
     * @param string protocol type
     * @param string protocol name
     * @param string version
     * @param string mirror name
     * @return boolean
     */
    function supports($type, $name = null, $mirror = false, $version = '1.0')
    {
        $protocols = $this->getFunctions($type, $mirror);
        if (!$protocols) {
            return false;
        }

        foreach ($protocols as $protocol) {
            if ($protocol['attribs']['version'] != $version) {
                continue;
            }

            if ($name === null) {
                return true;
            }

            if ($protocol['_content'] != $name) {
                continue;
            }

            return true;
        }

        return false;
    }

    /**
     * Determines whether a channel supports Representational State Transfer (REST) protocols
     * for retrieving channel information
     * @param string
     * @return bool
     */
    function supportsREST($mirror = false)
    {
        if ($mirror == $this->_channelInfo['name']) {
            $mirror = false;
        }

        if ($mirror) {
            if ($mir = $this->getMirror($mirror)) {
                return isset($mir['rest']);
            }

            return false;
        }

        return isset($this->_channelInfo['servers']['primary']['rest']);
    }

    /**
     * Get the URL to access a base resource.
     *
     * Hyperlinks in the returned xml will be used to retrieve the proper information
     * needed.  This allows extreme extensibility and flexibility in implementation
     * @param string Resource Type to retrieve
     */
    function getBaseURL($resourceType, $mirror = false)
    {
        if ($mirror == $this->_channelInfo['name']) {
            $mirror = false;
        }

        if ($mirror) {
            $mir = $this->getMirror($mirror);
            if (!$mir) {
                return false;
            }

            $rest = $mir['rest'];
        } else {
            $rest = $this->_channelInfo['servers']['primary']['rest'];
        }

        if (!isset($rest['baseurl'][0])) {
            $rest['baseurl'] = array($rest['baseurl']);
        }

        foreach ($rest['baseurl'] as $baseurl) {
            if (strtolower($baseurl['attribs']['type']) == strtolower($resourceType)) {
                return $baseurl['_content'];
            }
        }

        return false;
    }

    /**
     * Since REST does not implement RPC, provide this as a logical wrapper around
     * resetFunctions for REST
     * @param string|false mirror name, if any
     */
    function resetREST($mirror = false)
    {
        return $this->resetFunctions('rest', $mirror);
    }

    /**
     * Empty all protocol definitions
     * @param string protocol type
     * @param string|false mirror name, if any
     */
    function resetFunctions($type, $mirror = false)
    {
        if ($mirror) {
            if (isset($this->_channelInfo['servers']['mirror'])) {
                $mirrors = $this->_channelInfo['servers']['mirror'];
                if (!isset($mirrors[0])) {
                    $mirrors = array($mirrors);
                }

                foreach ($mirrors as $i => $mir) {
                    if ($mir['attribs']['host'] == $mirror) {
                        if (isset($this->_channelInfo['servers']['mirror'][$i][$type])) {
                            unset($this->_channelInfo['servers']['mirror'][$i][$type]);
                        }

                        return true;
                    }
                }

                return false;
            }

            return false;
        }

        if (isset($this->_channelInfo['servers']['primary'][$type])) {
            unset($this->_channelInfo['servers']['primary'][$type]);
        }

        return true;
    }

    /**
     * Set a channel's protocols to the protocols supported by pearweb
     */
    function setDefaultPEARProtocols($version = '1.0', $mirror = false)
    {
        switch ($version) {
            case '1.0' :
                $this->resetREST($mirror);

                if (!isset($this->_channelInfo['servers'])) {
                    $this->_channelInfo['servers'] = array('primary' =>
                        array('rest' => array()));
                } elseif (!isset($this->_channelInfo['servers']['primary'])) {
                    $this->_channelInfo['servers']['primary'] = array('rest' => array());
                }

                return true;
            break;
            default :
                return false;
            break;
        }
    }

    /**
     * @return array
     */
    function getMirrors()
    {
        if (isset($this->_channelInfo['servers']['mirror'])) {
            $mirrors = $this->_channelInfo['servers']['mirror'];
            if (!isset($mirrors[0])) {
                $mirrors = array($mirrors);
            }

            return $mirrors;
        }

        return array();
    }

    /**
     * Get the unserialized XML representing a mirror
     * @return array|false
     */
    function getMirror($server)
    {
        foreach ($this->getMirrors() as $mirror) {
            if ($mirror['attribs']['host'] == $server) {
                return $mirror;
            }
        }

        return false;
    }

    /**
     * @param string
     * @return string|false
     * @error PEAR_CHANNELFILE_ERROR_NO_NAME
     * @error PEAR_CHANNELFILE_ERROR_INVALID_NAME
     */
    function setName($name)
    {
        return $this->setServer($name);
    }

    /**
     * Set the socket number (port) that is used to connect to this channel
     * @param integer
     * @param string|false name of the mirror server, or false for the primary
     */
    function setPort($port, $mirror = false)
    {
        if ($mirror) {
            if (!isset($this->_channelInfo['servers']['mirror'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                    array('mirror' => $mirror));
                return false;
            }

            if (isset($this->_channelInfo['servers']['mirror'][0])) {
                foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
                    if ($mirror == $mir['attribs']['host']) {
                        $this->_channelInfo['servers']['mirror'][$i]['attribs']['port'] = $port;
                        return true;
                    }
                }

                return false;
            } elseif ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
                $this->_channelInfo['servers']['mirror']['attribs']['port'] = $port;
                $this->_isValid = false;
                return true;
            }
        }

        $this->_channelInfo['servers']['primary']['attribs']['port'] = $port;
        $this->_isValid = false;
        return true;
    }

    /**
     * Set the socket number (port) that is used to connect to this channel
     * @param bool Determines whether to turn on SSL support or turn it off
     * @param string|false name of the mirror server, or false for the primary
     */
    function setSSL($ssl = true, $mirror = false)
    {
        if ($mirror) {
            if (!isset($this->_channelInfo['servers']['mirror'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                    array('mirror' => $mirror));
                return false;
            }

            if (isset($this->_channelInfo['servers']['mirror'][0])) {
                foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
                    if ($mirror == $mir['attribs']['host']) {
                        if (!$ssl) {
                            if (isset($this->_channelInfo['servers']['mirror'][$i]
                                  ['attribs']['ssl'])) {
                                unset($this->_channelInfo['servers']['mirror'][$i]['attribs']['ssl']);
                            }
                        } else {
                            $this->_channelInfo['servers']['mirror'][$i]['attribs']['ssl'] = 'yes';
                        }

                        return true;
                    }
                }

                return false;
            } elseif ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
                if (!$ssl) {
                    if (isset($this->_channelInfo['servers']['mirror']['attribs']['ssl'])) {
                        unset($this->_channelInfo['servers']['mirror']['attribs']['ssl']);
                    }
                } else {
                    $this->_channelInfo['servers']['mirror']['attribs']['ssl'] = 'yes';
                }

                $this->_isValid = false;
                return true;
            }
        }

        if ($ssl) {
            $this->_channelInfo['servers']['primary']['attribs']['ssl'] = 'yes';
        } else {
            if (isset($this->_channelInfo['servers']['primary']['attribs']['ssl'])) {
                unset($this->_channelInfo['servers']['primary']['attribs']['ssl']);
            }
        }

        $this->_isValid = false;
        return true;
    }

    /**
     * @param string
     * @return string|false
     * @error PEAR_CHANNELFILE_ERROR_NO_SERVER
     * @error PEAR_CHANNELFILE_ERROR_INVALID_SERVER
     */
    function setServer($server, $mirror = false)
    {
        if (empty($server)) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SERVER);
            return false;
        } elseif (!$this->validChannelServer($server)) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
                array('tag' => 'name', 'name' => $server));
            return false;
        }

        if ($mirror) {
            $found = false;
            foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
                if ($mirror == $mir['attribs']['host']) {
                    $found = true;
                    break;
                }
            }

            if (!$found) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                    array('mirror' => $mirror));
                return false;
            }

            $this->_channelInfo['mirror'][$i]['attribs']['host'] = $server;
            return true;
        }

        $this->_channelInfo['name'] = $server;
        return true;
    }

    /**
     * @param string
     * @return boolean success
     * @error PEAR_CHANNELFILE_ERROR_NO_SUMMARY
     * @warning PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY
     */
    function setSummary($summary)
    {
        if (empty($summary)) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_NO_SUMMARY);
            return false;
        } elseif (strpos(trim($summary), "\n") !== false) {
            $this->_validateWarning(PEAR_CHANNELFILE_ERROR_MULTILINE_SUMMARY,
                array('summary' => $summary));
        }

        $this->_channelInfo['summary'] = $summary;
        return true;
    }

    /**
     * @param string
     * @param boolean determines whether the alias is in channel.xml or local
     * @return boolean success
     */
    function setAlias($alias, $local = false)
    {
        if (!$this->validChannelServer($alias)) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_INVALID_NAME,
                array('tag' => 'suggestedalias', 'name' => $alias));
            return false;
        }

        if ($local) {
            $this->_channelInfo['localalias'] = $alias;
        } else {
            $this->_channelInfo['suggestedalias'] = $alias;
        }

        return true;
    }

    /**
     * @return string
     */
    function getAlias()
    {
        if (isset($this->_channelInfo['localalias'])) {
            return $this->_channelInfo['localalias'];
        }
        if (isset($this->_channelInfo['suggestedalias'])) {
            return $this->_channelInfo['suggestedalias'];
        }
        if (isset($this->_channelInfo['name'])) {
            return $this->_channelInfo['name'];
        }
        return '';
    }

    /**
     * Set the package validation object if it differs from PEAR's default
     * The class must be includeable via changing _ in the classname to path separator,
     * but no checking of this is made.
     * @param string|false pass in false to reset to the default packagename regex
     * @return boolean success
     */
    function setValidationPackage($validateclass, $version)
    {
        if (empty($validateclass)) {
            unset($this->_channelInfo['validatepackage']);
        }
        $this->_channelInfo['validatepackage'] = array('_content' => $validateclass);
        $this->_channelInfo['validatepackage']['attribs'] = array('version' => $version);
    }

    /**
     * Add a protocol to the provides section
     * @param string protocol type
     * @param string protocol version
     * @param string protocol name, if any
     * @param string mirror name, if this is a mirror's protocol
     * @return bool
     */
    function addFunction($type, $version, $name = '', $mirror = false)
    {
        if ($mirror) {
            return $this->addMirrorFunction($mirror, $type, $version, $name);
        }

        $set = array('attribs' => array('version' => $version), '_content' => $name);
        if (!isset($this->_channelInfo['servers']['primary'][$type]['function'])) {
            if (!isset($this->_channelInfo['servers'])) {
                $this->_channelInfo['servers'] = array('primary' =>
                    array($type => array()));
            } elseif (!isset($this->_channelInfo['servers']['primary'])) {
                $this->_channelInfo['servers']['primary'] = array($type => array());
            }

            $this->_channelInfo['servers']['primary'][$type]['function'] = $set;
            $this->_isValid = false;
            return true;
        } elseif (!isset($this->_channelInfo['servers']['primary'][$type]['function'][0])) {
            $this->_channelInfo['servers']['primary'][$type]['function'] = array(
                $this->_channelInfo['servers']['primary'][$type]['function']);
        }

        $this->_channelInfo['servers']['primary'][$type]['function'][] = $set;
        return true;
    }
    /**
     * Add a protocol to a mirror's provides section
     * @param string mirror name (server)
     * @param string protocol type
     * @param string protocol version
     * @param string protocol name, if any
     */
    function addMirrorFunction($mirror, $type, $version, $name = '')
    {
        if (!isset($this->_channelInfo['servers']['mirror'])) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                array('mirror' => $mirror));
            return false;
        }

        $setmirror = false;
        if (isset($this->_channelInfo['servers']['mirror'][0])) {
            foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
                if ($mirror == $mir['attribs']['host']) {
                    $setmirror = &$this->_channelInfo['servers']['mirror'][$i];
                    break;
                }
            }
        } else {
            if ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
                $setmirror = &$this->_channelInfo['servers']['mirror'];
            }
        }

        if (!$setmirror) {
            $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                array('mirror' => $mirror));
            return false;
        }

        $set = array('attribs' => array('version' => $version), '_content' => $name);
        if (!isset($setmirror[$type]['function'])) {
            $setmirror[$type]['function'] = $set;
            $this->_isValid = false;
            return true;
        } elseif (!isset($setmirror[$type]['function'][0])) {
            $setmirror[$type]['function'] = array($setmirror[$type]['function']);
        }

        $setmirror[$type]['function'][] = $set;
        $this->_isValid = false;
        return true;
    }

    /**
     * @param string Resource Type this url links to
     * @param string URL
     * @param string|false mirror name, if this is not a primary server REST base URL
     */
    function setBaseURL($resourceType, $url, $mirror = false)
    {
        if ($mirror) {
            if (!isset($this->_channelInfo['servers']['mirror'])) {
                $this->_validateError(PEAR_CHANNELFILE_ERROR_MIRROR_NOT_FOUND,
                    array('mirror' => $mirror));
                return false;
            }

            $setmirror = false;
            if (isset($this->_channelInfo['servers']['mirror'][0])) {
                foreach ($this->_channelInfo['servers']['mirror'] as $i => $mir) {
                    if ($mirror == $mir['attribs']['host']) {
                        $setmirror = &$this->_channelInfo['servers']['mirror'][$i];
                        break;
                    }
                }
            } else {
                if ($this->_channelInfo['servers']['mirror']['attribs']['host'] == $mirror) {
                    $setmirror = &$this->_channelInfo['servers']['mirror'];
                }
            }
        } else {
            $setmirror = &$this->_channelInfo['servers']['primary'];
        }

        $set = array('attribs' => array('type' => $resourceType), '_content' => $url);
        if (!isset($setmirror['rest'])) {
            $setmirror['rest'] = array();
        }

        if (!isset($setmirror['rest']['baseurl'])) {
            $setmirror['rest']['baseurl'] = $set;
            $this->_isValid = false;
            return true;
        } elseif (!isset($setmirror['rest']['baseurl'][0])) {
            $setmirror['rest']['baseurl'] = array($setmirror['rest']['baseurl']);
        }

        foreach ($setmirror['rest']['baseurl'] as $i => $url) {
            if ($url['attribs']['type'] == $resourceType) {
                $this->_isValid = false;
                $setmirror['rest']['baseurl'][$i] = $set;
                return true;
            }
        }

        $setmirror['rest']['baseurl'][] = $set;
        $this->_isValid = false;
        return true;
    }

    /**
     * @param string mirror server
     * @param int mirror http port
     * @return boolean
     */
    function addMirror($server, $port = null)
    {
        if ($this->_channelInfo['name'] == '__uri') {
            return false; // the __uri channel cannot have mirrors by definition
        }

        $set = array('attribs' => array('host' => $server));
        if (is_numeric($port)) {
            $set['attribs']['port'] = $port;
        }

        if (!isset($this->_channelInfo['servers']['mirror'])) {
            $this->_channelInfo['servers']['mirror'] = $set;
            return true;
        }

        if (!isset($this->_channelInfo['servers']['mirror'][0])) {
            $this->_channelInfo['servers']['mirror'] =
                array($this->_channelInfo['servers']['mirror']);
        }

        $this->_channelInfo['servers']['mirror'][] = $set;
        return true;
    }

    /**
     * Retrieve the name of the validation package for this channel
     * @return string|false
     */
    function getValidationPackage()
    {
        if (!$this->_isValid && !$this->validate()) {
            return false;
        }

        if (!isset($this->_channelInfo['validatepackage'])) {
            return array('attribs' => array('version' => 'default'),
                '_content' => 'PEAR_Validate');
        }

        return $this->_channelInfo['validatepackage'];
    }

    /**
     * Retrieve the object that can be used for custom validation
     * @param string|false the name of the package to validate.  If the package is
     *                     the channel validation package, PEAR_Validate is returned
     * @return PEAR_Validate|false false is returned if the validation package
     *         cannot be located
     */
    function &getValidationObject($package = false)
    {
        if (!class_exists('PEAR_Validate')) {
            require_once 'PEAR/Validate.php';
        }

        if (!$this->_isValid) {
            if (!$this->validate()) {
                $a = false;
                return $a;
            }
        }

        if (isset($this->_channelInfo['validatepackage'])) {
            if ($package == $this->_channelInfo['validatepackage']) {
                // channel validation packages are always validated by PEAR_Validate
                $val = new PEAR_Validate;
                return $val;
            }

            if (!class_exists(str_replace('.', '_',
                  $this->_channelInfo['validatepackage']['_content']))) {
                if ($this->isIncludeable(str_replace('_', '/',
                      $this->_channelInfo['validatepackage']['_content']) . '.php')) {
                    include_once str_replace('_', '/',
                        $this->_channelInfo['validatepackage']['_content']) . '.php';
                    $vclass = str_replace('.', '_',
                        $this->_channelInfo['validatepackage']['_content']);
                    $val = new $vclass;
                } else {
                    $a = false;
                    return $a;
                }
            } else {
                $vclass = str_replace('.', '_',
                    $this->_channelInfo['validatepackage']['_content']);
                $val = new $vclass;
            }
        } else {
            $val = new PEAR_Validate;
        }

        return $val;
    }

    function isIncludeable($path)
    {
        $possibilities = explode(PATH_SEPARATOR, ini_get('include_path'));
        foreach ($possibilities as $dir) {
            if (file_exists($dir . DIRECTORY_SEPARATOR . $path)
                  && is_readable($dir . DIRECTORY_SEPARATOR . $path)) {
                return true;
            }
        }

        return false;
    }

    /**
     * This function is used by the channel updater and retrieves a value set by
     * the registry, or the current time if it has not been set
     * @return string
     */
    function lastModified()
    {
        if (isset($this->_channelInfo['_lastmodified'])) {
            return $this->_channelInfo['_lastmodified'];
        }

        return time();
    }
}
PK�a�\�@P�� pear/PEAR/ChannelFile/Parser.phpnu�[���<?php
/**
 * PEAR_ChannelFile_Parser for parsing channel.xml
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * base xml parser class
 */
require_once 'PEAR/XMLParser.php';
require_once 'PEAR/ChannelFile.php';
/**
 * Parser for channel.xml
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_ChannelFile_Parser extends PEAR_XMLParser
{
    var $_config;
    var $_logger;
    var $_registry;

    function setConfig(&$c)
    {
        $this->_config = &$c;
        $this->_registry = &$c->getRegistry();
    }

    function setLogger(&$l)
    {
        $this->_logger = &$l;
    }

    function parse($data, $file)
    {
        if (PEAR::isError($err = parent::parse($data, $file))) {
            return $err;
        }

        $ret = new PEAR_ChannelFile;
        $ret->setConfig($this->_config);
        if (isset($this->_logger)) {
            $ret->setLogger($this->_logger);
        }

        $ret->fromArray($this->_unserializedData);
        // make sure the filelist is in the easy to read format needed
        $ret->flattenFilelist();
        $ret->setPackagefile($file, $archive);
        return $ret;
    }
}PK�a�\Z�bgbgpear/PEAR/Common.phpnu�[���<?php
/**
 * PEAR_Common, the base class for the PEAR Installer
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1.0
 * @deprecated File deprecated since Release 1.4.0a1
 */

/**
 * Include error handling
 */
require_once 'PEAR.php';

/**
 * PEAR_Common error when an invalid PHP file is passed to PEAR_Common::analyzeSourceCode()
 */
define('PEAR_COMMON_ERROR_INVALIDPHP', 1);
define('_PEAR_COMMON_PACKAGE_NAME_PREG', '[A-Za-z][a-zA-Z0-9_]+');
define('PEAR_COMMON_PACKAGE_NAME_PREG', '/^' . _PEAR_COMMON_PACKAGE_NAME_PREG . '\\z/');

// this should allow: 1, 1.0, 1.0RC1, 1.0dev, 1.0dev123234234234, 1.0a1, 1.0b1, 1.0pl1
define('_PEAR_COMMON_PACKAGE_VERSION_PREG', '\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?');
define('PEAR_COMMON_PACKAGE_VERSION_PREG', '/^' . _PEAR_COMMON_PACKAGE_VERSION_PREG . '\\z/i');

// XXX far from perfect :-)
define('_PEAR_COMMON_PACKAGE_DOWNLOAD_PREG', '(' . _PEAR_COMMON_PACKAGE_NAME_PREG .
    ')(-([.0-9a-zA-Z]+))?');
define('PEAR_COMMON_PACKAGE_DOWNLOAD_PREG', '/^' . _PEAR_COMMON_PACKAGE_DOWNLOAD_PREG .
    '\\z/');

define('_PEAR_CHANNELS_NAME_PREG', '[A-Za-z][a-zA-Z0-9\.]+');
define('PEAR_CHANNELS_NAME_PREG', '/^' . _PEAR_CHANNELS_NAME_PREG . '\\z/');

// this should allow any dns or IP address, plus a path - NO UNDERSCORES ALLOWED
define('_PEAR_CHANNELS_SERVER_PREG', '[a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*(\/[a-zA-Z0-9\-]+)*');
define('PEAR_CHANNELS_SERVER_PREG', '/^' . _PEAR_CHANNELS_SERVER_PREG . '\\z/i');

define('_PEAR_CHANNELS_PACKAGE_PREG',  '(' ._PEAR_CHANNELS_SERVER_PREG . ')\/('
         . _PEAR_COMMON_PACKAGE_NAME_PREG . ')');
define('PEAR_CHANNELS_PACKAGE_PREG', '/^' . _PEAR_CHANNELS_PACKAGE_PREG . '\\z/i');

define('_PEAR_COMMON_CHANNEL_DOWNLOAD_PREG', '(' . _PEAR_CHANNELS_NAME_PREG . ')::('
    . _PEAR_COMMON_PACKAGE_NAME_PREG . ')(-([.0-9a-zA-Z]+))?');
define('PEAR_COMMON_CHANNEL_DOWNLOAD_PREG', '/^' . _PEAR_COMMON_CHANNEL_DOWNLOAD_PREG . '\\z/');

/**
 * List of temporary files and directories registered by
 * PEAR_Common::addTempFile().
 * @var array
 */
$GLOBALS['_PEAR_Common_tempfiles'] = array();

/**
 * Valid maintainer roles
 * @var array
 */
$GLOBALS['_PEAR_Common_maintainer_roles'] = array('lead','developer','contributor','helper');

/**
 * Valid release states
 * @var array
 */
$GLOBALS['_PEAR_Common_release_states'] = array('alpha','beta','stable','snapshot','devel');

/**
 * Valid dependency types
 * @var array
 */
$GLOBALS['_PEAR_Common_dependency_types'] = array('pkg','ext','php','prog','ldlib','rtlib','os','websrv','sapi');

/**
 * Valid dependency relations
 * @var array
 */
$GLOBALS['_PEAR_Common_dependency_relations'] = array('has','eq','lt','le','gt','ge','not', 'ne');

/**
 * Valid file roles
 * @var array
 */
$GLOBALS['_PEAR_Common_file_roles'] = array('php','ext','test','doc','data','src','script');

/**
 * Valid replacement types
 * @var array
 */
$GLOBALS['_PEAR_Common_replacement_types'] = array('php-const', 'pear-config', 'package-info');

/**
 * Valid "provide" types
 * @var array
 */
$GLOBALS['_PEAR_Common_provide_types'] = array('ext', 'prog', 'class', 'function', 'feature', 'api');

/**
 * Valid "provide" types
 * @var array
 */
$GLOBALS['_PEAR_Common_script_phases'] = array('pre-install', 'post-install', 'pre-uninstall', 'post-uninstall', 'pre-build', 'post-build', 'pre-configure', 'post-configure', 'pre-setup', 'post-setup');

/**
 * Class providing common functionality for PEAR administration classes.
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 * @deprecated This class will disappear, and its components will be spread
 *             into smaller classes, like the AT&T breakup, as of Release 1.4.0a1
 */
class PEAR_Common extends PEAR
{
    /**
     * User Interface object (PEAR_Frontend_* class).  If null,
     * the log() method uses print.
     * @var object
     */
    var $ui = null;

    /**
     * Configuration object (PEAR_Config).
     * @var PEAR_Config
     */
    var $config = null;

    /** stack of elements, gives some sort of XML context */
    var $element_stack = array();

    /** name of currently parsed XML element */
    var $current_element;

    /** array of attributes of the currently parsed XML element */
    var $current_attributes = array();

    /** assoc with information about a package */
    var $pkginfo = array();

    var $current_path = null;

    /**
     * Flag variable used to mark a valid package file
     * @var boolean
     * @access private
     */
    var $_validPackageFile;

    /**
     * PEAR_Common constructor
     *
     * @access public
     */
    function __construct()
    {
        parent::__construct();
        $this->config = &PEAR_Config::singleton();
        $this->debug = $this->config->get('verbose');
    }

    /**
     * PEAR_Common destructor
     *
     * @access private
     */
    function _PEAR_Common()
    {
        // doesn't work due to bug #14744
        //$tempfiles = $this->_tempfiles;
        $tempfiles =& $GLOBALS['_PEAR_Common_tempfiles'];
        while ($file = array_shift($tempfiles)) {
            if (@is_dir($file)) {
                if (!class_exists('System')) {
                    require_once 'System.php';
                }

                System::rm(array('-rf', $file));
            } elseif (file_exists($file)) {
                unlink($file);
            }
        }
    }

    /**
     * Register a temporary file or directory.  When the destructor is
     * executed, all registered temporary files and directories are
     * removed.
     *
     * @param string  $file  name of file or directory
     *
     * @return void
     *
     * @access public
     */
    static function addTempFile($file)
    {
        if (!class_exists('PEAR_Frontend')) {
            require_once 'PEAR/Frontend.php';
        }
        PEAR_Frontend::addTempFile($file);
    }

    /**
     * Wrapper to System::mkDir(), creates a directory as well as
     * any necessary parent directories.
     *
     * @param string  $dir  directory name
     *
     * @return bool TRUE on success, or a PEAR error
     *
     * @access public
     */
    function mkDirHier($dir)
    {
        // Only used in Installer - move it there ?
        $this->log(2, "+ create dir $dir");
        if (!class_exists('System')) {
            require_once 'System.php';
        }
        return System::mkDir(array('-p', $dir));
    }

    /**
     * Logging method.
     *
     * @param int    $level  log level (0 is quiet, higher is noisier)
     * @param string $msg    message to write to the log
     *
     * @return void
     */
    public function log($level, $msg, $append_crlf = true)
    {
        if ($this->debug >= $level) {
            if (!class_exists('PEAR_Frontend')) {
                require_once 'PEAR/Frontend.php';
            }

            $ui = &PEAR_Frontend::singleton();
            if (is_a($ui, 'PEAR_Frontend')) {
                $ui->log($msg, $append_crlf);
            } else {
                print "$msg\n";
            }
        }
    }

    /**
     * Create and register a temporary directory.
     *
     * @param string $tmpdir (optional) Directory to use as tmpdir.
     *                       Will use system defaults (for example
     *                       /tmp or c:\windows\temp) if not specified
     *
     * @return string name of created directory
     *
     * @access public
     */
    function mkTempDir($tmpdir = '')
    {
        $topt = $tmpdir ? array('-t', $tmpdir) : array();
        $topt = array_merge($topt, array('-d', 'pear'));
        if (!class_exists('System')) {
            require_once 'System.php';
        }

        if (!$tmpdir = System::mktemp($topt)) {
            return false;
        }

        self::addTempFile($tmpdir);
        return $tmpdir;
    }

    /**
     * Set object that represents the frontend to be used.
     *
     * @param  object Reference of the frontend object
     * @return void
     * @access public
     */
    function setFrontendObject(&$ui)
    {
        $this->ui = &$ui;
    }

    /**
     * Return an array containing all of the states that are more stable than
     * or equal to the passed in state
     *
     * @param string Release state
     * @param boolean Determines whether to include $state in the list
     * @return false|array False if $state is not a valid release state
     */
    static function betterStates($state, $include = false)
    {
        static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
        $i = array_search($state, $states);
        if ($i === false) {
            return false;
        }
        if ($include) {
            $i--;
        }
        return array_slice($states, $i + 1);
    }

    /**
     * Get the valid roles for a PEAR package maintainer
     *
     * @return array
     */
    public static function getUserRoles()
    {
        return $GLOBALS['_PEAR_Common_maintainer_roles'];
    }

    /**
     * Get the valid package release states of packages
     *
     * @return array
     */
    public static function getReleaseStates()
    {
        return $GLOBALS['_PEAR_Common_release_states'];
    }

    /**
     * Get the implemented dependency types (php, ext, pkg etc.)
     *
     * @return array
     */
    public static function getDependencyTypes()
    {
        return $GLOBALS['_PEAR_Common_dependency_types'];
    }

    /**
     * Get the implemented dependency relations (has, lt, ge etc.)
     *
     * @return array
     */
    public static function getDependencyRelations()
    {
        return $GLOBALS['_PEAR_Common_dependency_relations'];
    }

    /**
     * Get the implemented file roles
     *
     * @return array
     */
    public static function getFileRoles()
    {
        return $GLOBALS['_PEAR_Common_file_roles'];
    }

    /**
     * Get the implemented file replacement types in
     *
     * @return array
     */
    public static function getReplacementTypes()
    {
        return $GLOBALS['_PEAR_Common_replacement_types'];
    }

    /**
     * Get the implemented file replacement types in
     *
     * @return array
     */
    public static function getProvideTypes()
    {
        return $GLOBALS['_PEAR_Common_provide_types'];
    }

    /**
     * Get the implemented file replacement types in
     *
     * @return array
     */
    public static function getScriptPhases()
    {
        return $GLOBALS['_PEAR_Common_script_phases'];
    }

    /**
     * Test whether a string contains a valid package name.
     *
     * @param string $name the package name to test
     *
     * @return bool
     *
     * @access public
     */
    function validPackageName($name)
    {
        return (bool)preg_match(PEAR_COMMON_PACKAGE_NAME_PREG, $name);
    }

    /**
     * Test whether a string contains a valid package version.
     *
     * @param string $ver the package version to test
     *
     * @return bool
     *
     * @access public
     */
    function validPackageVersion($ver)
    {
        return (bool)preg_match(PEAR_COMMON_PACKAGE_VERSION_PREG, $ver);
    }

    /**
     * @param string $path relative or absolute include path
     * @return boolean
     */
    public static function isIncludeable($path)
    {
        if (file_exists($path) && is_readable($path)) {
            return true;
        }

        $ipath = explode(PATH_SEPARATOR, ini_get('include_path'));
        foreach ($ipath as $include) {
            $test = realpath($include . DIRECTORY_SEPARATOR . $path);
            if (file_exists($test) && is_readable($test)) {
                return true;
            }
        }

        return false;
    }

    function _postProcessChecks($pf)
    {
        if (!PEAR::isError($pf)) {
            return $this->_postProcessValidPackagexml($pf);
        }

        $errs = $pf->getUserinfo();
        if (is_array($errs)) {
            foreach ($errs as $error) {
                $e = $this->raiseError($error['message'], $error['code'], null, null, $error);
            }
        }

        return $pf;
    }

    /**
     * Returns information about a package file.  Expects the name of
     * a gzipped tar file as input.
     *
     * @param string  $file  name of .tgz file
     *
     * @return array  array with package information
     *
     * @access public
     * @deprecated use PEAR_PackageFile->fromTgzFile() instead
     *
     */
    function infoFromTgzFile($file)
    {
        $packagefile = new PEAR_PackageFile($this->config);
        $pf = &$packagefile->fromTgzFile($file, PEAR_VALIDATE_NORMAL);
        return $this->_postProcessChecks($pf);
    }

    /**
     * Returns information about a package file.  Expects the name of
     * a package xml file as input.
     *
     * @param string  $descfile  name of package xml file
     *
     * @return array  array with package information
     *
     * @access public
     * @deprecated use PEAR_PackageFile->fromPackageFile() instead
     *
     */
    function infoFromDescriptionFile($descfile)
    {
        $packagefile = new PEAR_PackageFile($this->config);
        $pf = &$packagefile->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL);
        return $this->_postProcessChecks($pf);
    }

    /**
     * Returns information about a package file.  Expects the contents
     * of a package xml file as input.
     *
     * @param string  $data  contents of package.xml file
     *
     * @return array   array with package information
     *
     * @access public
     * @deprecated use PEAR_PackageFile->fromXmlstring() instead
     *
     */
    function infoFromString($data)
    {
        $packagefile = new PEAR_PackageFile($this->config);
        $pf = &$packagefile->fromXmlString($data, PEAR_VALIDATE_NORMAL, false);
        return $this->_postProcessChecks($pf);
    }

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @return array
     */
    function _postProcessValidPackagexml(&$pf)
    {
        if (!is_a($pf, 'PEAR_PackageFile_v2')) {
            $this->pkginfo = $pf->toArray();
            return $this->pkginfo;
        }

        // sort of make this into a package.xml 1.0-style array
        // changelog is not converted to old format.
        $arr = $pf->toArray(true);
        $arr = array_merge($arr, $arr['old']);
        unset($arr['old'], $arr['xsdversion'], $arr['contents'], $arr['compatible'],
              $arr['channel'], $arr['uri'], $arr['dependencies'], $arr['phprelease'],
              $arr['extsrcrelease'], $arr['zendextsrcrelease'], $arr['extbinrelease'],
              $arr['zendextbinrelease'], $arr['bundle'], $arr['lead'], $arr['developer'],
              $arr['helper'], $arr['contributor']);
        $arr['filelist'] = $pf->getFilelist();
        $this->pkginfo = $arr;
        return $arr;
    }

    /**
     * Returns package information from different sources
     *
     * This method is able to extract information about a package
     * from a .tgz archive or from a XML package definition file.
     *
     * @access public
     * @param  string Filename of the source ('package.xml', '<package>.tgz')
     * @return string
     * @deprecated use PEAR_PackageFile->fromAnyFile() instead
     */
    function infoFromAny($info)
    {
        if (is_string($info) && file_exists($info)) {
            $packagefile = new PEAR_PackageFile($this->config);
            $pf = &$packagefile->fromAnyFile($info, PEAR_VALIDATE_NORMAL);
            if (PEAR::isError($pf)) {
                $errs = $pf->getUserinfo();
                if (is_array($errs)) {
                    foreach ($errs as $error) {
                        $e = $this->raiseError($error['message'], $error['code'], null, null, $error);
                    }
                }

                return $pf;
            }

            return $this->_postProcessValidPackagexml($pf);
        }

        return $info;
    }

    /**
     * Return an XML document based on the package info (as returned
     * by the PEAR_Common::infoFrom* methods).
     *
     * @param array  $pkginfo  package info
     *
     * @return string XML data
     *
     * @access public
     * @deprecated use a PEAR_PackageFile_v* object's generator instead
     */
    function xmlFromInfo($pkginfo)
    {
        $config      = &PEAR_Config::singleton();
        $packagefile = new PEAR_PackageFile($config);
        $pf = &$packagefile->fromArray($pkginfo);
        $gen = &$pf->getDefaultGenerator();
        return $gen->toXml(PEAR_VALIDATE_PACKAGING);
    }

    /**
     * Validate XML package definition file.
     *
     * @param  string $info Filename of the package archive or of the
     *                package definition file
     * @param  array $errors Array that will contain the errors
     * @param  array $warnings Array that will contain the warnings
     * @param  string $dir_prefix (optional) directory where source files
     *                may be found, or empty if they are not available
     * @access public
     * @return boolean
     * @deprecated use the validation of PEAR_PackageFile objects
     */
    function validatePackageInfo($info, &$errors, &$warnings, $dir_prefix = '')
    {
        $config      = &PEAR_Config::singleton();
        $packagefile = new PEAR_PackageFile($config);
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        if (strpos($info, '<?xml') !== false) {
            $pf = &$packagefile->fromXmlString($info, PEAR_VALIDATE_NORMAL, '');
        } else {
            $pf = &$packagefile->fromAnyFile($info, PEAR_VALIDATE_NORMAL);
        }

        PEAR::staticPopErrorHandling();
        if (PEAR::isError($pf)) {
            $errs = $pf->getUserinfo();
            if (is_array($errs)) {
                foreach ($errs as $error) {
                    if ($error['level'] == 'error') {
                        $errors[] = $error['message'];
                    } else {
                        $warnings[] = $error['message'];
                    }
                }
            }

            return false;
        }

        return true;
    }

    /**
     * Build a "provides" array from data returned by
     * analyzeSourceCode().  The format of the built array is like
     * this:
     *
     *  array(
     *    'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'),
     *    ...
     *  )
     *
     *
     * @param array $srcinfo array with information about a source file
     * as returned by the analyzeSourceCode() method.
     *
     * @return void
     *
     * @access public
     *
     */
    function buildProvidesArray($srcinfo)
    {
        $file = basename($srcinfo['source_file']);
        $pn = '';
        if (isset($this->_packageName)) {
            $pn = $this->_packageName;
        }

        $pnl = strlen($pn);
        foreach ($srcinfo['declared_classes'] as $class) {
            $key = "class;$class";
            if (isset($this->pkginfo['provides'][$key])) {
                continue;
            }

            $this->pkginfo['provides'][$key] =
                array('file'=> $file, 'type' => 'class', 'name' => $class);
            if (isset($srcinfo['inheritance'][$class])) {
                $this->pkginfo['provides'][$key]['extends'] =
                    $srcinfo['inheritance'][$class];
            }
        }

        foreach ($srcinfo['declared_methods'] as $class => $methods) {
            foreach ($methods as $method) {
                $function = "$class::$method";
                $key = "function;$function";
                if ($method[0] == '_' || !strcasecmp($method, $class) ||
                    isset($this->pkginfo['provides'][$key])) {
                    continue;
                }

                $this->pkginfo['provides'][$key] =
                    array('file'=> $file, 'type' => 'function', 'name' => $function);
            }
        }

        foreach ($srcinfo['declared_functions'] as $function) {
            $key = "function;$function";
            if ($function[0] == '_' || isset($this->pkginfo['provides'][$key])) {
                continue;
            }

            if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) {
                $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\"";
            }

            $this->pkginfo['provides'][$key] =
                array('file'=> $file, 'type' => 'function', 'name' => $function);
        }
    }

    /**
     * Analyze the source code of the given PHP file
     *
     * @param  string Filename of the PHP file
     * @return mixed
     * @access public
     */
    static function analyzeSourceCode($file)
    {
        if (!class_exists('PEAR_PackageFile_v2_Validator')) {
            require_once 'PEAR/PackageFile/v2/Validator.php';
        }

        $a = new PEAR_PackageFile_v2_Validator;
        return $a->analyzeSourceCode($file);
    }

    function detectDependencies($any, $status_callback = null)
    {
        if (!function_exists("token_get_all")) {
            return false;
        }

        if (PEAR::isError($info = $this->infoFromAny($any))) {
            return $this->raiseError($info);
        }

        if (!is_array($info)) {
            return false;
        }

        $deps = array();
        $used_c = $decl_c = $decl_f = $decl_m = array();
        foreach ($info['filelist'] as $file => $fa) {
            $tmp = $this->analyzeSourceCode($file);
            $used_c = @array_merge($used_c, $tmp['used_classes']);
            $decl_c = @array_merge($decl_c, $tmp['declared_classes']);
            $decl_f = @array_merge($decl_f, $tmp['declared_functions']);
            $decl_m = @array_merge($decl_m, $tmp['declared_methods']);
            $inheri = @array_merge($inheri, $tmp['inheritance']);
        }

        $used_c = array_unique($used_c);
        $decl_c = array_unique($decl_c);
        $undecl_c = array_diff($used_c, $decl_c);

        return array('used_classes' => $used_c,
                     'declared_classes' => $decl_c,
                     'declared_methods' => $decl_m,
                     'declared_functions' => $decl_f,
                     'undeclared_classes' => $undecl_c,
                     'inheritance' => $inheri,
                     );
    }

    /**
     * Download a file through HTTP.  Considers suggested file name in
     * Content-disposition: header and can run a callback function for
     * different events.  The callback will be called with two
     * parameters: the callback type, and parameters.  The implemented
     * callback types are:
     *
     *  'setup'       called at the very beginning, parameter is a UI object
     *                that should be used for all output
     *  'message'     the parameter is a string with an informational message
     *  'saveas'      may be used to save with a different file name, the
     *                parameter is the filename that is about to be used.
     *                If a 'saveas' callback returns a non-empty string,
     *                that file name will be used as the filename instead.
     *                Note that $save_dir will not be affected by this, only
     *                the basename of the file.
     *  'start'       download is starting, parameter is number of bytes
     *                that are expected, or -1 if unknown
     *  'bytesread'   parameter is the number of bytes read so far
     *  'done'        download is complete, parameter is the total number
     *                of bytes read
     *  'connfailed'  if the TCP connection fails, this callback is called
     *                with array(host,port,errno,errmsg)
     *  'writefailed' if writing to disk fails, this callback is called
     *                with array(destfile,errmsg)
     *
     * If an HTTP proxy has been configured (http_proxy PEAR_Config
     * setting), the proxy will be used.
     *
     * @param string  $url       the URL to download
     * @param object  $ui        PEAR_Frontend_* instance
     * @param object  $config    PEAR_Config instance
     * @param string  $save_dir  (optional) directory to save file in
     * @param mixed   $callback  (optional) function/method to call for status
     *                           updates
     * @param false|string|array $lastmodified header values to check against
     *                                         for caching
     *                                         use false to return the header
     *                                         values from this download
     * @param false|array        $accept       Accept headers to send
     * @param false|string       $channel      Channel to use for retrieving
     *                                         authentication
     *
     * @return mixed  Returns the full path of the downloaded file or a PEAR
     *                error on failure.  If the error is caused by
     *                socket-related errors, the error object will
     *                have the fsockopen error code available through
     *                getCode().  If caching is requested, then return the header
     *                values.
     *                If $lastmodified was given and the there are no changes,
     *                boolean false is returned.
     *
     * @access public
     */
    function downloadHttp(
        $url, &$ui, $save_dir = '.', $callback = null, $lastmodified = null,
        $accept = false, $channel = false
    ) {
        if (!class_exists('PEAR_Downloader')) {
            require_once 'PEAR/Downloader.php';
        }
        return PEAR_Downloader::_downloadHttp(
            $this, $url, $ui, $save_dir, $callback, $lastmodified,
            $accept, $channel
        );
    }
}

require_once 'PEAR/Config.php';
require_once 'PEAR/PackageFile.php';
PK�a�\��'����pear/PEAR/RunTest.phpnu�[���<?php
/**
 * PEAR_RunTest
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.3.3
 */

/**
 * for error handling
 */
require_once 'PEAR.php';
require_once 'PEAR/Config.php';

define('DETAILED', 1);
putenv("PHP_PEAR_RUNTESTS=1");

/**
 * Simplified version of PHP's test suite
 *
 * Try it with:
 *
 * $ php -r 'include "../PEAR/RunTest.php"; $t=new PEAR_RunTest; $o=$t->run("./pear_system.phpt");print_r($o);'
 *
 *
 * @category   pear
 * @package    PEAR
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.3.3
 */
class PEAR_RunTest
{
    var $_headers = array();
    var $_logger;
    var $_options;
    var $_php;
    var $tests_count;
    var $xdebug_loaded;
    /**
     * Saved value of php executable, used to reset $_php when we
     * have a test that uses cgi
     *
     * @var unknown_type
     */
    var $_savephp;
    var $ini_overwrites = array(
        'output_handler=',
        'open_basedir=',
        'disable_functions=',
        'output_buffering=Off',
        'display_errors=1',
        'log_errors=0',
        'html_errors=0',
        'report_memleaks=0',
        'report_zend_debug=0',
        'docref_root=',
        'docref_ext=.html',
        'error_prepend_string=',
        'error_append_string=',
        'auto_prepend_file=',
        'auto_append_file=',
        'xdebug.default_enable=0',
        'allow_url_fopen=1',
    );

    /**
     * An object that supports the PEAR_Common->log() signature, or null
     * @param PEAR_Common|null
     */
    function __construct($logger = null, $options = array())
    {
        if (!defined('E_DEPRECATED')) {
            define('E_DEPRECATED', 0);
        }
        if (!defined('E_STRICT')) {
            define('E_STRICT', 0);
        }
        $excluded_error_reporting = E_DEPRECATED;
        if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 80400) {
            $excluded_error_reporting |= E_STRICT;
        }
        $this->ini_overwrites[] = 'error_reporting=' . (E_ALL & ~$excluded_error_reporting);
        if (is_null($logger)) {
            require_once 'PEAR/Common.php';
            $logger = new PEAR_Common;
        }
        $this->_logger  = $logger;
        $this->_options = $options;

        $conf = &PEAR_Config::singleton();
        $this->_php = $conf->get('php_bin');
    }

    /**
     * Taken from php-src/run-tests.php
     *
     * @param string $commandline command name
     * @param array $env
     * @param string $stdin standard input to pass to the command
     * @return unknown
     */
    function system_with_timeout($commandline, $env = null, $stdin = null)
    {
        $data = '';
        $proc = proc_open($commandline, array(
            0 => array('pipe', 'r'),
            1 => array('pipe', 'w'),
            2 => array('pipe', 'w')
        ), $pipes, null, $env, array('suppress_errors' => true));

        if (!$proc) {
            return false;
        }

        if (is_string($stdin)) {
            fwrite($pipes[0], $stdin);
        }
        fclose($pipes[0]);

        while (true) {
            /* hide errors from interrupted syscalls */
            $r = $pipes;
            unset($r[0]);
            $e = $w = [];
            $n = @stream_select($r, $w, $e, 60);

            if ($n === 0) {
                /* timed out */
                $data .= "\n ** ERROR: process timed out **\n";
                proc_terminate($proc);
                return array(1234567890, $data);
            } else if ($n > 0) {
                $line = fread($pipes[1], 8192);
                if (strlen($line) == 0) {
                    /* EOF */
                    break;
                }
                $data .= $line;
            }
        }
        if (function_exists('proc_get_status')) {
            $stat = proc_get_status($proc);
            if ($stat['signaled']) {
                $data .= "\nTermsig=".$stat['stopsig'];
            }
        }
        $code = proc_close($proc);
        if (function_exists('proc_get_status')) {
            $code = $stat['exitcode'];
        }
        return array($code, $data);
    }

    /**
     * Turns a PHP INI string into an array
     *
     * Turns -d "include_path=/foo/bar" into this:
     * array(
     *   'include_path' => array(
     *          'operator' => '-d',
     *          'value'    => '/foo/bar',
     *   )
     * )
     * Works both with quotes and without
     *
     * @param string an PHP INI string, -d "include_path=/foo/bar"
     * @return array
     */
    function iniString2array($ini_string)
    {
        if (!$ini_string) {
            return array();
        }
        $split = preg_split('/[\s]|=/', $ini_string, -1, PREG_SPLIT_NO_EMPTY);
        $key   = $split[1][0] == '"'                     ? substr($split[1], 1)     : $split[1];
        $value = $split[2][strlen($split[2]) - 1] == '"' ? substr($split[2], 0, -1) : $split[2];
        // FIXME review if this is really the struct to go with
        $array = array($key => array('operator' => $split[0], 'value' => $value));
        return $array;
    }

    function settings2array($settings, $ini_settings)
    {
        foreach ($settings as $setting) {
            if (strpos($setting, '=') !== false) {
                $setting = explode('=', $setting, 2);
                $name  = trim(strtolower($setting[0]));
                $value = trim($setting[1]);
                $ini_settings[$name] = $value;
            }
        }
        return $ini_settings;
    }

    function settings2params($ini_settings)
    {
        $settings = '';
        foreach ($ini_settings as $name => $value) {
            if (is_array($value)) {
                $operator = $value['operator'];
                $value    = $value['value'];
            } else {
                $operator = '-d';
            }
            $value = addslashes($value);
            $settings .= " $operator \"$name=$value\"";
        }
        return $settings;
    }

    function _preparePhpBin($php, $file, $ini_settings)
    {
        $file = escapeshellarg($file);
        $cmd = $php . $ini_settings . ' -f ' . $file;

        return $cmd;
    }

    function runPHPUnit($file, $ini_settings = '')
    {
        if (!file_exists($file) && file_exists(getcwd() . DIRECTORY_SEPARATOR . $file)) {
            $file = realpath(getcwd() . DIRECTORY_SEPARATOR . $file);
        } elseif (file_exists($file)) {
            $file = realpath($file);
        }

        $cmd = $this->_preparePhpBin($this->_php, $file, $ini_settings);
        if (isset($this->_logger)) {
            $this->_logger->log(2, 'Running command "' . $cmd . '"');
        }

        $savedir = getcwd(); // in case the test moves us around
        chdir(dirname($file));
        echo `$cmd`;
        chdir($savedir);
        return 'PASSED'; // we have no way of knowing this information so assume passing
    }

    /**
     * Runs an individual test case.
     *
     * @param string       The filename of the test
     * @param array|string INI settings to be applied to the test run
     * @param integer      Number what the current running test is of the
     *                     whole test suite being runned.
     *
     * @return string|object Returns PASSED, WARNED, FAILED depending on how the
     *                       test came out.
     *                       PEAR Error when the tester it self fails
     */
    function run($file, $ini_settings = array(), $test_number = 1)
    {
        $this->_restorePHPBinary();

        if (empty($this->_options['cgi'])) {
            // try to see if php-cgi is in the path
            $res = $this->system_with_timeout('php-cgi -v');
            if (false !== $res && !(is_array($res) && in_array($res[0], array(-1, 127)))) {
                $this->_options['cgi'] = 'php-cgi';
            }
        }
        if (1 < $len = strlen($this->tests_count)) {
            $test_number = str_pad($test_number, $len, ' ', STR_PAD_LEFT);
            $test_nr = "[$test_number/$this->tests_count] ";
        } else {
            $test_nr = '';
        }

        $file = realpath($file);
        $section_text = $this->_readFile($file);
        if (PEAR::isError($section_text)) {
            return $section_text;
        }

        if (isset($section_text['POST_RAW']) && isset($section_text['UPLOAD'])) {
            return PEAR::raiseError("Cannot contain both POST_RAW and UPLOAD in test file: $file");
        }

        $cwd = getcwd();

        $pass_options = '';
        if (!empty($this->_options['ini'])) {
            $pass_options = $this->_options['ini'];
        }

        if (is_string($ini_settings)) {
            $ini_settings = $this->iniString2array($ini_settings);
        }

        $ini_settings = $this->settings2array($this->ini_overwrites, $ini_settings);
        if ($section_text['INI']) {
            if (strpos($section_text['INI'], '{PWD}') !== false) {
                $section_text['INI'] = str_replace('{PWD}', dirname($file), $section_text['INI']);
            }
            $ini = preg_split( "/[\n\r]+/", $section_text['INI']);
            $ini_settings = $this->settings2array($ini, $ini_settings);
        }
        $ini_settings = $this->settings2params($ini_settings);
        $shortname = str_replace($cwd . DIRECTORY_SEPARATOR, '', $file);

        $tested = trim($section_text['TEST']);
        $tested.= !isset($this->_options['simple']) ? "[$shortname]" : ' ';

        if (!empty($section_text['POST']) || !empty($section_text['POST_RAW']) ||
              !empty($section_text['UPLOAD']) || !empty($section_text['GET']) ||
              !empty($section_text['COOKIE']) || !empty($section_text['EXPECTHEADERS'])) {
            if (empty($this->_options['cgi'])) {
                if (!isset($this->_options['quiet'])) {
                    $this->_logger->log(0, "SKIP $test_nr$tested (reason: --cgi option needed for this test, type 'pear help run-tests')");
                }
                if (isset($this->_options['tapoutput'])) {
                    return array('ok', ' # skip --cgi option needed for this test, "pear help run-tests" for info');
                }
                return 'SKIPPED';
            }
            $this->_savePHPBinary();
            $this->_php = $this->_options['cgi'];
        }

        $temp_dir = realpath(dirname($file));
        $main_file_name = basename($file, 'phpt');
        $diff_filename     = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'diff';
        $log_filename      = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'log';
        $exp_filename      = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'exp';
        $output_filename   = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'out';
        $memcheck_filename = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'mem';
        $temp_file         = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'php';
        $temp_skipif       = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'skip.php';
        $temp_clean        = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name.'clean.php';
        $tmp_post          = $temp_dir . DIRECTORY_SEPARATOR . uniqid('phpt.');

        // unlink old test results
        $this->_cleanupOldFiles($file);

        // Check if test should be skipped.
        $res  = $this->_runSkipIf($section_text, $temp_skipif, $tested, $ini_settings);
        if ($res == 'SKIPPED' || count($res) != 2) {
            return $res;
        }
        $info = $res['info'];
        $warn = $res['warn'];

        // We've satisfied the preconditions - run the test!
        if (isset($this->_options['coverage']) && $this->xdebug_loaded) {
            $xdebug_file = $temp_dir . DIRECTORY_SEPARATOR . $main_file_name . 'xdebug';
            $text = "\n" . 'function coverage_shutdown() {' .
                    "\n" . '    $xdebug = var_export(xdebug_get_code_coverage(), true);';
            if (!function_exists('file_put_contents')) {
                $text .= "\n" . '    $fh = fopen(\'' . $xdebug_file . '\', "wb");' .
                        "\n" . '    if ($fh !== false) {' .
                        "\n" . '        fwrite($fh, $xdebug);' .
                        "\n" . '        fclose($fh);' .
                        "\n" . '    }';
            } else {
                $text .= "\n" . '    file_put_contents(\'' . $xdebug_file . '\', $xdebug);';
            }

            // Workaround for http://pear.php.net/bugs/bug.php?id=17292
            $lines             = explode("\n", $section_text['FILE']);
            $numLines          = count($lines);
            $namespace         = '';
            $coverage_shutdown = 'coverage_shutdown';

            if (
                substr($lines[0], 0, 2) == '<?' ||
                substr($lines[0], 0, 5) == '<?php'
            ) {
                unset($lines[0]);
            }


            for ($i = 0; $i < $numLines; $i++) {
                if (isset($lines[$i]) && substr($lines[$i], 0, 9) == 'namespace') {
                    $namespace         = substr($lines[$i], 10, -1);
                    $coverage_shutdown = $namespace . '\\coverage_shutdown';
                    $namespace         = "namespace " . $namespace . ";\n";

                    unset($lines[$i]);
                    break;
                }
            }

            $text .= "\n    xdebug_stop_code_coverage();" .
                "\n" . '} // end coverage_shutdown()' .
                "\n\n" . 'register_shutdown_function("' . $coverage_shutdown . '");';
            $text .= "\n" . 'xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);' . "\n";

            $this->save_text($temp_file, "<?php\n" . $namespace . $text  . "\n" . implode("\n", $lines));
        } else {
            $this->save_text($temp_file, $section_text['FILE']);
        }

        $args = $section_text['ARGS'] ? ' -- '.$section_text['ARGS'] : '';
        $cmd = $this->_preparePhpBin($this->_php, $temp_file, $ini_settings);
        $cmd.= "$args 2>&1";
        if (isset($this->_logger)) {
            $this->_logger->log(2, 'Running command "' . $cmd . '"');
        }

        // Reset environment from any previous test.
        $env = $this->_resetEnv($section_text, $temp_file);

        $section_text = $this->_processUpload($section_text, $file);
        if (PEAR::isError($section_text)) {
            return $section_text;
        }

        if (array_key_exists('POST_RAW', $section_text) && !empty($section_text['POST_RAW'])) {
            $post = trim($section_text['POST_RAW']);
            $raw_lines = explode("\n", $post);

            $request = '';
            $started = false;
            foreach ($raw_lines as $i => $line) {
                if (empty($env['CONTENT_TYPE']) &&
                    preg_match('/^Content-Type:(.*)/i', $line, $res)) {
                    $env['CONTENT_TYPE'] = trim(str_replace("\r", '', $res[1]));
                    continue;
                }
                if ($started) {
                    $request .= "\n";
                }
                $started = true;
                $request .= $line;
            }

            $env['CONTENT_LENGTH'] = strlen($request);
            $env['REQUEST_METHOD'] = 'POST';

            $this->save_text($tmp_post, $request);
            $cmd = "$this->_php$pass_options$ini_settings \"$temp_file\" 2>&1 < $tmp_post";
        } elseif (array_key_exists('POST', $section_text) && !empty($section_text['POST'])) {
            $post = trim($section_text['POST']);
            $this->save_text($tmp_post, $post);
            $content_length = strlen($post);

            $env['REQUEST_METHOD'] = 'POST';
            $env['CONTENT_TYPE']   = 'application/x-www-form-urlencoded';
            $env['CONTENT_LENGTH'] = $content_length;

            $cmd = "$this->_php$pass_options$ini_settings \"$temp_file\" 2>&1 < $tmp_post";
        } else {
            $env['REQUEST_METHOD'] = 'GET';
            $env['CONTENT_TYPE']   = '';
            $env['CONTENT_LENGTH'] = '';
        }

        if (OS_WINDOWS && isset($section_text['RETURNS'])) {
            ob_start();
            system($cmd, $return_value);
            $out = ob_get_contents();
            ob_end_clean();
            $section_text['RETURNS'] = (int) trim($section_text['RETURNS']);
            $returnfail = ($return_value != $section_text['RETURNS']);
        } else {
            $returnfail = false;
            $stdin = isset($section_text['STDIN']) ? $section_text['STDIN'] : null;
            $out = $this->system_with_timeout($cmd, $env, $stdin);
            $return_value = $out[0];
            $out = $out[1];
        }

        $output = preg_replace('/\r\n/', "\n", trim($out));

        if (isset($tmp_post) && realpath($tmp_post) && file_exists($tmp_post)) {
            @unlink(realpath($tmp_post));
        }
        chdir($cwd); // in case the test moves us around

        /* when using CGI, strip the headers from the output */
        $output = $this->_stripHeadersCGI($output);

        if (isset($section_text['EXPECTHEADERS'])) {
            $testheaders = $this->_processHeaders($section_text['EXPECTHEADERS']);
            $missing = array_diff_assoc($testheaders, $this->_headers);
            $changed = '';
            foreach ($missing as $header => $value) {
                if (isset($this->_headers[$header])) {
                    $changed .= "-$header: $value\n+$header: ";
                    $changed .= $this->_headers[$header];
                } else {
                    $changed .= "-$header: $value\n";
                }
            }
            if ($missing) {
                // tack on failed headers to output:
                $output .= "\n====EXPECTHEADERS FAILURE====:\n$changed";
            }
        }

        $this->_testCleanup($section_text, $temp_clean);

        // Does the output match what is expected?
        do {
            if (isset($section_text['EXPECTF']) || isset($section_text['EXPECTREGEX'])) {
                if (isset($section_text['EXPECTF'])) {
                    $wanted = trim($section_text['EXPECTF']);
                } else {
                    $wanted = trim($section_text['EXPECTREGEX']);
                }
                $wanted_re = preg_replace('/\r\n/', "\n", $wanted);
                if (isset($section_text['EXPECTF'])) {
                    $wanted_re = preg_quote($wanted_re, '/');
                    // Stick to basics
                    $wanted_re = str_replace("%s", ".+?", $wanted_re); //not greedy
                    $wanted_re = str_replace("%S", ".*?", $wanted_re); //not greedy
                    $wanted_re = str_replace("%i", "[+\-]?[0-9]+", $wanted_re);
                    $wanted_re = str_replace("%d", "[0-9]+", $wanted_re);
                    $wanted_re = str_replace("%x", "[0-9a-fA-F]+", $wanted_re);
                    $wanted_re = str_replace("%f", "[+\-]?\.?[0-9]+\.?[0-9]*(E-?[0-9]+)?", $wanted_re);
                    $wanted_re = str_replace("%c", ".", $wanted_re);
                    // %f allows two points "-.0.0" but that is the best *simple* expression
                }

    /* DEBUG YOUR REGEX HERE
            var_dump($wanted_re);
            print(str_repeat('=', 80) . "\n");
            var_dump($output);
    */
                if (!$returnfail && preg_match("/^$wanted_re\$/s", $output)) {
                    if (file_exists($temp_file)) {
                        unlink($temp_file);
                    }
                    if (array_key_exists('FAIL', $section_text)) {
                        break;
                    }
                    if (!isset($this->_options['quiet'])) {
                        $this->_logger->log(0, "PASS $test_nr$tested$info");
                    }
                    if (isset($this->_options['tapoutput'])) {
                        return array('ok', ' - ' . $tested);
                    }
                    return 'PASSED';
                }
            } else {
                if (isset($section_text['EXPECTFILE'])) {
                    $f = $temp_dir . '/' . trim($section_text['EXPECTFILE']);
                    if (!($fp = @fopen($f, 'rb'))) {
                        return PEAR::raiseError('--EXPECTFILE-- section file ' .
                            $f . ' not found');
                    }
                    fclose($fp);
                    $section_text['EXPECT'] = file_get_contents($f);
                }

                if (isset($section_text['EXPECT'])) {
                    $wanted = preg_replace('/\r\n/', "\n", trim($section_text['EXPECT']));
                } else {
                    $wanted = '';
                }

                // compare and leave on success
                if (!$returnfail && 0 == strcmp($output, $wanted)) {
                    if (file_exists($temp_file)) {
                        unlink($temp_file);
                    }
                    if (array_key_exists('FAIL', $section_text)) {
                        break;
                    }
                    if (!isset($this->_options['quiet'])) {
                        $this->_logger->log(0, "PASS $test_nr$tested$info");
                    }
                    if (isset($this->_options['tapoutput'])) {
                        return array('ok', ' - ' . $tested);
                    }
                    return 'PASSED';
                }
            }
        } while (false);

        if (array_key_exists('FAIL', $section_text)) {
            // we expect a particular failure
            // this is only used for testing PEAR_RunTest
            $expectf  = isset($section_text['EXPECTF']) ? $wanted_re : null;
            $faildiff = $this->generate_diff($wanted, $output, null, $expectf);
            $faildiff = preg_replace('/\r/', '', $faildiff);
            $wanted   = preg_replace('/\r/', '', trim($section_text['FAIL']));
            if ($faildiff == $wanted) {
                if (!isset($this->_options['quiet'])) {
                    $this->_logger->log(0, "PASS $test_nr$tested$info");
                }
                if (isset($this->_options['tapoutput'])) {
                    return array('ok', ' - ' . $tested);
                }
                return 'PASSED';
            }
            unset($section_text['EXPECTF']);
            $output = $faildiff;
            if (isset($section_text['RETURNS'])) {
                return PEAR::raiseError('Cannot have both RETURNS and FAIL in the same test: ' .
                    $file);
            }
        }

        // Test failed so we need to report details.
        $txt = $warn ? 'WARN ' : 'FAIL ';
        $this->_logger->log(0, $txt . $test_nr . $tested . $info);

        // write .exp
        $res = $this->_writeLog($exp_filename, $wanted);
        if (PEAR::isError($res)) {
            return $res;
        }

        // write .out
        $res = $this->_writeLog($output_filename, $output);
        if (PEAR::isError($res)) {
            return $res;
        }

        // write .diff
        $returns = isset($section_text['RETURNS']) ?
                        array(trim($section_text['RETURNS']), $return_value) : null;
        $expectf = isset($section_text['EXPECTF']) ? $wanted_re : null;
        $data = $this->generate_diff($wanted, $output, $returns, $expectf);
        $res  = $this->_writeLog($diff_filename, $data);
        if (isset($this->_options['showdiff'])) {
            $this->_logger->log(0, "========DIFF========");
            $this->_logger->log(0, $data);
            $this->_logger->log(0, "========DONE========");
        }
        if (PEAR::isError($res)) {
            return $res;
        }

        // write .log
        $data = "
---- EXPECTED OUTPUT
$wanted
---- ACTUAL OUTPUT
$output
---- FAILED
";

        if ($returnfail) {
            $data .= "
---- EXPECTED RETURN
$section_text[RETURNS]
---- ACTUAL RETURN
$return_value
";
        }

        $res = $this->_writeLog($log_filename, $data);
        if (PEAR::isError($res)) {
            return $res;
        }

        if (isset($this->_options['tapoutput'])) {
            $wanted = explode("\n", $wanted);
            $wanted = "# Expected output:\n#\n#" . implode("\n#", $wanted);
            $output = explode("\n", $output);
            $output = "#\n#\n# Actual output:\n#\n#" . implode("\n#", $output);
            return array($wanted . $output . 'not ok', ' - ' . $tested);
        }
        return $warn ? 'WARNED' : 'FAILED';
    }

    function generate_diff($wanted, $output, $rvalue, $wanted_re)
    {
        $w  = explode("\n", $wanted);
        $o  = explode("\n", $output);
        $wr = explode("\n", $wanted_re);
        $w1 = array_diff_assoc($w, $o);
        $o1 = array_diff_assoc($o, $w);
        $o2 = $w2 = array();
        foreach ($w1 as $idx => $val) {
            if (!$wanted_re || !isset($wr[$idx]) || !isset($o1[$idx]) ||
                  !preg_match('/^' . $wr[$idx] . '\\z/', $o1[$idx])) {
                $w2[sprintf("%03d<", $idx)] = sprintf("%03d- ", $idx + 1) . $val;
            }
        }
        foreach ($o1 as $idx => $val) {
            if (!$wanted_re || !isset($wr[$idx]) ||
                  !preg_match('/^' . $wr[$idx] . '\\z/', $val)) {
                $o2[sprintf("%03d>", $idx)] = sprintf("%03d+ ", $idx + 1) . $val;
            }
        }
        $diff = array_merge($w2, $o2);
        ksort($diff);
        $extra = $rvalue ? "##EXPECTED: $rvalue[0]\r\n##RETURNED: $rvalue[1]" : '';
        return implode("\r\n", $diff) . $extra;
    }

    //  Write the given text to a temporary file, and return the filename.
    function save_text($filename, $text)
    {
        if (!$fp = fopen($filename, 'w')) {
            return PEAR::raiseError("Cannot open file '" . $filename . "' (save_text)");
        }
        fwrite($fp, $text);
        fclose($fp);
    if (1 < DETAILED) echo "
FILE $filename {{{
$text
}}}
";
    }

    function _cleanupOldFiles($file)
    {
        $temp_dir = realpath(dirname($file));
        $mainFileName = basename($file, 'phpt');
        $diff_filename     = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'diff';
        $log_filename      = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'log';
        $exp_filename      = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'exp';
        $output_filename   = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'out';
        $memcheck_filename = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'mem';
        $temp_file         = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'php';
        $temp_skipif       = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'skip.php';
        $temp_clean        = $temp_dir . DIRECTORY_SEPARATOR . $mainFileName.'clean.php';
        $tmp_post          = $temp_dir . DIRECTORY_SEPARATOR . uniqid('phpt.');

        // unlink old test results
        @unlink($diff_filename);
        @unlink($log_filename);
        @unlink($exp_filename);
        @unlink($output_filename);
        @unlink($memcheck_filename);
        @unlink($temp_file);
        @unlink($temp_skipif);
        @unlink($tmp_post);
        @unlink($temp_clean);
    }

    function _runSkipIf($section_text, $temp_skipif, $tested, $ini_settings)
    {
        $info = '';
        $warn = false;
        if (array_key_exists('SKIPIF', $section_text) && trim($section_text['SKIPIF'])) {
            $this->save_text($temp_skipif, $section_text['SKIPIF']);
            $output = $this->system_with_timeout("$this->_php$ini_settings -f \"$temp_skipif\"");
            $output = $output[1];
            $loutput = ltrim($output);
            unlink($temp_skipif);
            if (!strncasecmp('skip', $loutput, 4)) {
                $skipreason = "SKIP $tested";
                if (preg_match('/^\s*skip\s*(.+)\s*/i', $output, $m)) {
                    $skipreason .= '(reason: ' . $m[1] . ')';
                }
                if (!isset($this->_options['quiet'])) {
                    $this->_logger->log(0, $skipreason);
                }
                if (isset($this->_options['tapoutput'])) {
                    return array('ok', ' # skip ' . $reason);
                }
                return 'SKIPPED';
            }

            if (!strncasecmp('info', $loutput, 4)
                && preg_match('/^\s*info\s*(.+)\s*/i', $output, $m)) {
                $info = " (info: $m[1])";
            }

            if (!strncasecmp('warn', $loutput, 4)
                && preg_match('/^\s*warn\s*(.+)\s*/i', $output, $m)) {
                $warn = true; /* only if there is a reason */
                $info = " (warn: $m[1])";
            }
        }

        return array('warn' => $warn, 'info' => $info);
    }

    function _stripHeadersCGI($output)
    {
        $this->headers = array();
        if (!empty($this->_options['cgi']) &&
              $this->_php == $this->_options['cgi'] &&
              preg_match("/^(.*?)(?:\n\n(.*)|\\z)/s", $output, $match)) {
            $output = isset($match[2]) ? trim($match[2]) : '';
            $this->_headers = $this->_processHeaders($match[1]);
        }

        return $output;
    }

    /**
     * Return an array that can be used with array_diff() to compare headers
     *
     * @param string $text
     */
    function _processHeaders($text)
    {
        $headers = array();
        $rh = preg_split("/[\n\r]+/", $text);
        foreach ($rh as $line) {
            if (strpos($line, ':')!== false) {
                $line = explode(':', $line, 2);
                $headers[trim($line[0])] = trim($line[1]);
            }
        }
        return $headers;
    }

    function _readFile($file)
    {
        // Load the sections of the test file.
        $section_text = array(
            'TEST'   => '(unnamed test)',
            'SKIPIF' => '',
            'GET'    => '',
            'COOKIE' => '',
            'POST'   => '',
            'ARGS'   => '',
            'INI'    => '',
            'CLEAN'  => '',
        );

        if (!is_file($file) || !$fp = fopen($file, "r")) {
            return PEAR::raiseError("Cannot open test file: $file");
        }

        $section = '';
        while (!feof($fp)) {
            $line = fgets($fp);

            // Match the beginning of a section.
            if (preg_match('/^--([_A-Z]+)--/', $line, $r)) {
                $section = $r[1];
                $section_text[$section] = '';
                continue;
            } elseif (empty($section)) {
                fclose($fp);
                return PEAR::raiseError("Invalid sections formats in test file: $file");
            }

            // Add to the section text.
            $section_text[$section] .= $line;
        }
        fclose($fp);

        return $section_text;
    }

    function _writeLog($logname, $data)
    {
        if (!$log = fopen($logname, 'w')) {
            return PEAR::raiseError("Cannot create test log - $logname");
        }
        fwrite($log, $data);
        fclose($log);
    }

    function _resetEnv($section_text, $temp_file)
    {
        $env = $_ENV;
        $env['REDIRECT_STATUS'] = '';
        $env['QUERY_STRING']    = '';
        $env['PATH_TRANSLATED'] = '';
        $env['SCRIPT_FILENAME'] = '';
        $env['REQUEST_METHOD']  = '';
        $env['CONTENT_TYPE']    = '';
        $env['CONTENT_LENGTH']  = '';
        if (!empty($section_text['ENV'])) {
            if (strpos($section_text['ENV'], '{PWD}') !== false) {
                $section_text['ENV'] = str_replace('{PWD}', dirname($temp_file), $section_text['ENV']);
            }
            foreach (explode("\n", trim($section_text['ENV'])) as $e) {
                $e = explode('=', trim($e), 2);
                if (!empty($e[0]) && isset($e[1])) {
                    $env[$e[0]] = $e[1];
                }
            }
        }
        if (array_key_exists('GET', $section_text)) {
            $env['QUERY_STRING'] = trim($section_text['GET']);
        } else {
            $env['QUERY_STRING'] = '';
        }
        if (array_key_exists('COOKIE', $section_text)) {
            $env['HTTP_COOKIE'] = trim($section_text['COOKIE']);
        } else {
            $env['HTTP_COOKIE'] = '';
        }
        $env['REDIRECT_STATUS'] = '1';
        $env['PATH_TRANSLATED'] = $temp_file;
        $env['SCRIPT_FILENAME'] = $temp_file;

        return $env;
    }

    function _processUpload($section_text, $file)
    {
        if (array_key_exists('UPLOAD', $section_text) && !empty($section_text['UPLOAD'])) {
            $upload_files = trim($section_text['UPLOAD']);
            $upload_files = explode("\n", $upload_files);

            $request = "Content-Type: multipart/form-data; boundary=---------------------------20896060251896012921717172737\n" .
                       "-----------------------------20896060251896012921717172737\n";
            foreach ($upload_files as $fileinfo) {
                $fileinfo = explode('=', $fileinfo);
                if (count($fileinfo) != 2) {
                    return PEAR::raiseError("Invalid UPLOAD section in test file: $file");
                }
                if (!realpath(dirname($file) . '/' . $fileinfo[1])) {
                    return PEAR::raiseError("File for upload does not exist: $fileinfo[1] " .
                        "in test file: $file");
                }
                $file_contents = file_get_contents(dirname($file) . '/' . $fileinfo[1]);
                $fileinfo[1] = basename($fileinfo[1]);
                $request .= "Content-Disposition: form-data; name=\"$fileinfo[0]\"; filename=\"$fileinfo[1]\"\n";
                $request .= "Content-Type: text/plain\n\n";
                $request .= $file_contents . "\n" .
                    "-----------------------------20896060251896012921717172737\n";
            }

            if (array_key_exists('POST', $section_text) && !empty($section_text['POST'])) {
                // encode POST raw
                $post = trim($section_text['POST']);
                $post = explode('&', $post);
                foreach ($post as $i => $post_info) {
                    $post_info = explode('=', $post_info);
                    if (count($post_info) != 2) {
                        return PEAR::raiseError("Invalid POST data in test file: $file");
                    }
                    $post_info[0] = rawurldecode($post_info[0]);
                    $post_info[1] = rawurldecode($post_info[1]);
                    $post[$i] = $post_info;
                }
                foreach ($post as $post_info) {
                    $request .= "Content-Disposition: form-data; name=\"$post_info[0]\"\n\n";
                    $request .= $post_info[1] . "\n" .
                        "-----------------------------20896060251896012921717172737\n";
                }
                unset($section_text['POST']);
            }
            $section_text['POST_RAW'] = $request;
        }

        return $section_text;
    }

    function _testCleanup($section_text, $temp_clean)
    {
        if ($section_text['CLEAN']) {
            $this->_restorePHPBinary();

            // perform test cleanup
            $this->save_text($temp_clean, $section_text['CLEAN']);
            $output = $this->system_with_timeout("$this->_php $temp_clean  2>&1");
            if (strlen($output[1])) {
                echo "BORKED --CLEAN-- section! output:\n", $output[1];
            }
            if (file_exists($temp_clean)) {
                unlink($temp_clean);
            }
        }
    }

    function _savePHPBinary()
    {
        $this->_savephp = $this->_php;
    }

    function _restorePHPBinary()
    {
        if (isset($this->_savephp))
        {
            $this->_php = $this->_savephp;
            unset($this->_savephp);
        }
    }
}
PK�a�\��U  pear/PEAR/Packager.phpnu�[���<?php
/**
 * PEAR_Packager for generating releases
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Common.php';
require_once 'PEAR/PackageFile.php';
require_once 'System.php';

/**
 * Administration class used to make a PEAR release tarball.
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Packager extends PEAR_Common
{
    /**
     * @var PEAR_Registry
     */
    var $_registry;

    function package($pkgfile = null, $compress = true, $pkg2 = null)
    {
        // {{{ validate supplied package.xml file
        if (empty($pkgfile)) {
            $pkgfile = 'package.xml';
        }

        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $pkg  = new PEAR_PackageFile($this->config, $this->debug);
        $pf   = &$pkg->fromPackageFile($pkgfile, PEAR_VALIDATE_NORMAL);
        $main = &$pf;
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($pf)) {
            if (is_array($pf->getUserInfo())) {
                foreach ($pf->getUserInfo() as $error) {
                    $this->log(0, 'Error: ' . $error['message']);
                }
            }

            $this->log(0, $pf->getMessage());
            return $this->raiseError("Cannot package, errors in package file");
        }

        foreach ($pf->getValidationWarnings() as $warning) {
            $this->log(1, 'Warning: ' . $warning['message']);
        }

        // }}}
        if ($pkg2) {
            $this->log(0, 'Attempting to process the second package file');
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $pf2 = &$pkg->fromPackageFile($pkg2, PEAR_VALIDATE_NORMAL);
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($pf2)) {
                if (is_array($pf2->getUserInfo())) {
                    foreach ($pf2->getUserInfo() as $error) {
                        $this->log(0, 'Error: ' . $error['message']);
                    }
                }
                $this->log(0, $pf2->getMessage());
                return $this->raiseError("Cannot package, errors in second package file");
            }

            foreach ($pf2->getValidationWarnings() as $warning) {
                $this->log(1, 'Warning: ' . $warning['message']);
            }

            if ($pf2->getPackagexmlVersion() == '2.0' ||
                  $pf2->getPackagexmlVersion() == '2.1'
            ) {
                $main  = &$pf2;
                $other = &$pf;
            } else {
                $main  = &$pf;
                $other = &$pf2;
            }

            if ($main->getPackagexmlVersion() != '2.0' &&
                  $main->getPackagexmlVersion() != '2.1') {
                return PEAR::raiseError('Error: cannot package two package.xml version 1.0, can ' .
                    'only package together a package.xml 1.0 and package.xml 2.0');
            }

            if ($other->getPackagexmlVersion() != '1.0') {
                return PEAR::raiseError('Error: cannot package two package.xml version 2.0, can ' .
                    'only package together a package.xml 1.0 and package.xml 2.0');
            }
        }

        $main->setLogger($this);
        if (!$main->validate(PEAR_VALIDATE_PACKAGING)) {
            foreach ($main->getValidationWarnings() as $warning) {
                $this->log(0, 'Error: ' . $warning['message']);
            }
            return $this->raiseError("Cannot package, errors in package");
        }

        foreach ($main->getValidationWarnings() as $warning) {
            $this->log(1, 'Warning: ' . $warning['message']);
        }

        if ($pkg2) {
            $other->setLogger($this);
            $a = false;
            if (!$other->validate(PEAR_VALIDATE_NORMAL) || $a = !$main->isEquivalent($other)) {
                foreach ($other->getValidationWarnings() as $warning) {
                    $this->log(0, 'Error: ' . $warning['message']);
                }

                foreach ($main->getValidationWarnings() as $warning) {
                    $this->log(0, 'Error: ' . $warning['message']);
                }

                if ($a) {
                    return $this->raiseError('The two package.xml files are not equivalent!');
                }

                return $this->raiseError("Cannot package, errors in package");
            }

            foreach ($other->getValidationWarnings() as $warning) {
                $this->log(1, 'Warning: ' . $warning['message']);
            }

            $gen = &$main->getDefaultGenerator();
            $tgzfile = $gen->toTgz2($this, $other, $compress);
            if (PEAR::isError($tgzfile)) {
                return $tgzfile;
            }

            $dest_package = basename($tgzfile);
            $pkgdir       = dirname($pkgfile);

            // TAR the Package -------------------------------------------
            $this->log(1, "Package $dest_package done");
            if (file_exists("$pkgdir/CVS/Root")) {
                $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $pf->getVersion());
                $cvstag = "RELEASE_$cvsversion";
                $this->log(1, 'Tag the released code with "pear cvstag ' .
                    $main->getPackageFile() . '"');
                $this->log(1, "(or set the CVS tag $cvstag by hand)");
            } elseif (file_exists("$pkgdir/.svn")) {
                $svnversion = preg_replace('/[^a-z0-9]/i', '.', $pf->getVersion());
                $svntag = $pf->getName() . "-$svnversion";
                $this->log(1, 'Tag the released code with "pear svntag ' .
                    $main->getPackageFile() . '"');
                $this->log(1, "(or set the SVN tag $svntag by hand)");
            }
        } else { // this branch is executed for single packagefile packaging
            $gen = &$pf->getDefaultGenerator();
            $tgzfile = $gen->toTgz($this, $compress);
            if (PEAR::isError($tgzfile)) {
                $this->log(0, $tgzfile->getMessage());
                return $this->raiseError("Cannot package, errors in package");
            }

            $dest_package = basename($tgzfile);
            $pkgdir       = dirname($pkgfile);

            // TAR the Package -------------------------------------------
            $this->log(1, "Package $dest_package done");
            if (file_exists("$pkgdir/CVS/Root")) {
                $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $pf->getVersion());
                $cvstag = "RELEASE_$cvsversion";
                $this->log(1, "Tag the released code with `pear cvstag $pkgfile'");
                $this->log(1, "(or set the CVS tag $cvstag by hand)");
            } elseif (file_exists("$pkgdir/.svn")) {
                $svnversion = preg_replace('/[^a-z0-9]/i', '.', $pf->getVersion());
                $svntag = $pf->getName() . "-$svnversion";
                $this->log(1, "Tag the released code with `pear svntag $pkgfile'");
                $this->log(1, "(or set the SVN tag $svntag by hand)");
            }
        }

        return $dest_package;
    }
}PK�a�\[
�W��pear/PEAR/XMLParser.phpnu�[���<?php
/**
 * PEAR_XMLParser
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Stephan Schmidt (original XML_Unserializer code)
 * @copyright  1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Parser for any xml file
 * @category  pear
 * @package   PEAR
 * @author    Greg Beaver <cellog@php.net>
 * @author    Stephan Schmidt (original XML_Unserializer code)
 * @copyright 1997-2009 The Authors
 * @license   http://opensource.org/licenses/bsd-license New BSD License
 * @version   Release: 1.10.16
 * @link      http://pear.php.net/package/PEAR
 * @since     Class available since Release 1.4.0a1
 */
class PEAR_XMLParser
{
    /**
     * unserilialized data
     * @var string $_serializedData
     */
    var $_unserializedData = null;

    /**
     * name of the root tag
     * @var string $_root
     */
    var $_root = null;

    /**
     * stack for all data that is found
     * @var array    $_dataStack
     */
    var $_dataStack = array();

    /**
     * stack for all values that are generated
     * @var array    $_valStack
     */
    var $_valStack = array();

    /**
     * current tag depth
     * @var int    $_depth
     */
    var $_depth = 0;

    /**
     * The XML encoding to use
     * @var string $encoding
     */
    var $encoding = 'ISO-8859-1';

    /**
     * @return array
     */
    function getData()
    {
        return $this->_unserializedData;
    }

    /**
     * @param string xml content
     * @return true|PEAR_Error
     */
    function parse($data)
    {
        if (!extension_loaded('xml')) {
            include_once 'PEAR.php';
            return PEAR::raiseError("XML Extension not found", 1);
        }
        $this->_dataStack =  $this->_valStack = array();
        $this->_depth = 0;

        if (
            strpos($data, 'encoding="UTF-8"')
            || strpos($data, 'encoding="utf-8"')
            || strpos($data, "encoding='UTF-8'")
            || strpos($data, "encoding='utf-8'")
        ) {
            $this->encoding = 'UTF-8';
        }

        $xp = xml_parser_create($this->encoding);
        xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, 0);
        xml_set_object($xp, $this);
        xml_set_element_handler($xp, 'startHandler', 'endHandler');
        xml_set_character_data_handler($xp, 'cdataHandler');
        if (!xml_parse($xp, $data)) {
            $msg = xml_error_string(xml_get_error_code($xp));
            $line = xml_get_current_line_number($xp);
            xml_parser_free($xp);
            include_once 'PEAR.php';
            return PEAR::raiseError("XML Error: '$msg' on line '$line'", 2);
        }
        xml_parser_free($xp);
        return true;
    }

    /**
     * Start element handler for XML parser
     *
     * @access private
     * @param  object $parser  XML parser object
     * @param  string $element XML element
     * @param  array  $attribs attributes of XML tag
     * @return void
     */
    function startHandler($parser, $element, $attribs)
    {
        $this->_depth++;
        $this->_dataStack[$this->_depth] = null;

        $val = array(
            'name'         => $element,
            'value'        => null,
            'type'         => 'string',
            'childrenKeys' => array(),
            'aggregKeys'   => array()
       );

        if (count($attribs) > 0) {
            $val['children'] = array();
            $val['type'] = 'array';
            $val['children']['attribs'] = $attribs;
        }

        array_push($this->_valStack, $val);
    }

    /**
     * post-process data
     *
     * @param string $data
     * @param string $element element name
     */
    function postProcess($data, $element)
    {
        return trim($data);
    }

    /**
     * End element handler for XML parser
     *
     * @access private
     * @param  object XML parser object
     * @param  string
     * @return void
     */
    function endHandler($parser, $element)
    {
        $value = array_pop($this->_valStack);
        $data  = $this->postProcess($this->_dataStack[$this->_depth], $element);

        // adjust type of the value
        switch (strtolower($value['type'])) {
            // unserialize an array
            case 'array':
                if ($data !== '') {
                    $value['children']['_content'] = $data;
                }

                $value['value'] = isset($value['children']) ? $value['children'] : array();
                break;

            /*
             * unserialize a null value
             */
            case 'null':
                $data = null;
                break;

            /*
             * unserialize any scalar value
             */
            default:
                settype($data, $value['type']);
                $value['value'] = $data;
                break;
        }

        $parent = array_pop($this->_valStack);
        if ($parent === null) {
            $this->_unserializedData = &$value['value'];
            $this->_root = &$value['name'];
            return true;
        }

        // parent has to be an array
        if (!isset($parent['children']) || !is_array($parent['children'])) {
            $parent['children'] = array();
            if ($parent['type'] != 'array') {
                $parent['type'] = 'array';
            }
        }

        if (!empty($value['name'])) {
            // there already has been a tag with this name
            if (in_array($value['name'], $parent['childrenKeys'])) {
                // no aggregate has been created for this tag
                if (!in_array($value['name'], $parent['aggregKeys'])) {
                    if (isset($parent['children'][$value['name']])) {
                        $parent['children'][$value['name']] = array($parent['children'][$value['name']]);
                    } else {
                        $parent['children'][$value['name']] = array();
                    }
                    array_push($parent['aggregKeys'], $value['name']);
                }
                array_push($parent['children'][$value['name']], $value['value']);
            } else {
                $parent['children'][$value['name']] = &$value['value'];
                array_push($parent['childrenKeys'], $value['name']);
            }
        } else {
            array_push($parent['children'],$value['value']);
        }
        array_push($this->_valStack, $parent);

        $this->_depth--;
    }

    /**
     * Handler for character data
     *
     * @access private
     * @param  object XML parser object
     * @param  string CDATA
     * @return void
     */
    function cdataHandler($parser, $cdata)
    {
        $this->_dataStack[$this->_depth] .= $cdata;
    }
}PK�a�\c��__pear/PEAR/DependencyDB.phpnu�[���<?php
/**
 * PEAR_DependencyDB, advanced installed packages dependency database
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * Needed for error handling
 */
require_once 'PEAR.php';
require_once 'PEAR/Config.php';

$GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'] = array();
/**
 * Track dependency relationships between installed packages
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Tomas V.V.Cox <cox@idec.net.com>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_DependencyDB
{
    // {{{ properties

    /**
     * This is initialized by {@link setConfig()}
     * @var PEAR_Config
     * @access private
     */
    var $_config;
    /**
     * This is initialized by {@link setConfig()}
     * @var PEAR_Registry
     * @access private
     */
    var $_registry;
    /**
     * Filename of the dependency DB (usually .depdb)
     * @var string
     * @access private
     */
    var $_depdb = false;
    /**
     * File name of the lockfile (usually .depdblock)
     * @var string
     * @access private
     */
    var $_lockfile = false;
    /**
     * Open file resource for locking the lockfile
     * @var resource|false
     * @access private
     */
    var $_lockFp = false;
    /**
     * API version of this class, used to validate a file on-disk
     * @var string
     * @access private
     */
    var $_version = '1.0';
    /**
     * Cached dependency database file
     * @var array|null
     * @access private
     */
    var $_cache;

    // }}}
    // {{{ & singleton()

    /**
     * Get a raw dependency database.  Calls setConfig() and assertDepsDB()
     * @param PEAR_Config
     * @param string|false full path to the dependency database, or false to use default
     * @return PEAR_DependencyDB|PEAR_Error
     */
    public static function &singleton(&$config, $depdb = false)
    {
        $phpdir = $config->get('php_dir', null, 'pear.php.net');
        if (!isset($GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir])) {
            $a = new PEAR_DependencyDB;
            $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir] = &$a;
            $a->setConfig($config, $depdb);
            $e = $a->assertDepsDB();
            if (PEAR::isError($e)) {
                return $e;
            }
        }

        return $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir];
    }

    /**
     * Set up the registry/location of dependency DB
     * @param PEAR_Config|false
     * @param string|false full path to the dependency database, or false to use default
     */
    function setConfig(&$config, $depdb = false)
    {
        if (!$config) {
            $this->_config = &PEAR_Config::singleton();
        } else {
            $this->_config = &$config;
        }

        $this->_registry = &$this->_config->getRegistry();
        if (!$depdb) {
            $dir = $this->_config->get('metadata_dir', null, 'pear.php.net');
            if (!$dir) {
                $dir = $this->_config->get('php_dir', null, 'pear.php.net');
            }
            $this->_depdb =  $dir . DIRECTORY_SEPARATOR . '.depdb';
        } else {
            $this->_depdb = $depdb;
        }

        $this->_lockfile = dirname($this->_depdb) . DIRECTORY_SEPARATOR . '.depdblock';
    }
    // }}}

    function hasWriteAccess()
    {
        if (!file_exists($this->_depdb)) {
            $dir = $this->_depdb;
            while ($dir && $dir != '.') {
                $dir = dirname($dir); // cd ..
                if ($dir != '.' && file_exists($dir)) {
                    if (is_writeable($dir)) {
                        return true;
                    }

                    return false;
                }
            }

            return false;
        }

        return is_writeable($this->_depdb);
    }

    // {{{ assertDepsDB()

    /**
     * Create the dependency database, if it doesn't exist.  Error if the database is
     * newer than the code reading it.
     * @return void|PEAR_Error
     */
    function assertDepsDB()
    {
        if (!is_file($this->_depdb)) {
            $this->rebuildDB();
            return;
        }

        $depdb = $this->_getDepDB();
        // Datatype format has been changed, rebuild the Deps DB
        if ($depdb['_version'] < $this->_version) {
            $this->rebuildDB();
        }

        if ($depdb['_version'][0] > $this->_version[0]) {
            return PEAR::raiseError('Dependency database is version ' .
                $depdb['_version'] . ', and we are version ' .
                $this->_version . ', cannot continue');
        }
    }

    /**
     * Get a list of installed packages that depend on this package
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array
     * @return array|false
     */
    function getDependentPackages(&$pkg)
    {
        $data = $this->_getDepDB();
        if (is_object($pkg)) {
            $channel = strtolower($pkg->getChannel());
            $package = strtolower($pkg->getPackage());
        } else {
            $channel = strtolower($pkg['channel']);
            $package = strtolower($pkg['package']);
        }

        if (isset($data['packages'][$channel][$package])) {
            return $data['packages'][$channel][$package];
        }

        return false;
    }

    /**
     * Get a list of the actual dependencies of installed packages that depend on
     * a package.
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array
     * @return array|false
     */
    function getDependentPackageDependencies(&$pkg)
    {
        $data = $this->_getDepDB();
        if (is_object($pkg)) {
            $channel = strtolower($pkg->getChannel());
            $package = strtolower($pkg->getPackage());
        } else if (is_array($pkg)) {
            $channel = strtolower($pkg['channel']);
            $package = strtolower($pkg['package']);
        } else {
            return false;
        }

        $depend = $this->getDependentPackages($pkg);
        if (!$depend) {
            return false;
        }

        $dependencies = array();
        foreach ($depend as $info) {
            $temp = $this->getDependencies($info);
            foreach ($temp as $dep) {
                if (
                    isset($dep['dep'], $dep['dep']['channel'], $dep['dep']['name']) &&
                    strtolower($dep['dep']['channel']) == $channel &&
                    strtolower($dep['dep']['name']) == $package
                ) {
                    if (!isset($dependencies[$info['channel']])) {
                        $dependencies[$info['channel']] = array();
                    }

                    if (!isset($dependencies[$info['channel']][$info['package']])) {
                        $dependencies[$info['channel']][$info['package']] = array();
                    }
                    $dependencies[$info['channel']][$info['package']][] = $dep;
                }
            }
        }

        return $dependencies;
    }

    /**
     * Get a list of dependencies of this installed package
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array
     * @return array|false
     */
    function getDependencies(&$pkg)
    {
        if (is_object($pkg)) {
            $channel = strtolower($pkg->getChannel());
            $package = strtolower($pkg->getPackage());
        } else {
            $channel = strtolower($pkg['channel']);
            $package = strtolower($pkg['package']);
        }

        $data = $this->_getDepDB();
        if (isset($data['dependencies'][$channel][$package])) {
            return $data['dependencies'][$channel][$package];
        }

        return false;
    }

    /**
     * Determine whether $parent depends on $child, near or deep
     * @param array|PEAR_PackageFile_v2|PEAR_PackageFile_v2
     * @param array|PEAR_PackageFile_v2|PEAR_PackageFile_v2
     */
    function dependsOn($parent, $child)
    {
        $c = array();
        $this->_getDepDB();
        return $this->_dependsOn($parent, $child, $c);
    }

    function _dependsOn($parent, $child, &$checked)
    {
        if (is_object($parent)) {
            $channel = strtolower($parent->getChannel());
            $package = strtolower($parent->getPackage());
        } else {
            $channel = strtolower($parent['channel']);
            $package = strtolower($parent['package']);
        }

        if (is_object($child)) {
            $depchannel = strtolower($child->getChannel());
            $deppackage = strtolower($child->getPackage());
        } else {
            $depchannel = strtolower($child['channel']);
            $deppackage = strtolower($child['package']);
        }

        if (isset($checked[$channel][$package][$depchannel][$deppackage])) {
            return false; // avoid endless recursion
        }

        $checked[$channel][$package][$depchannel][$deppackage] = true;
        if (!isset($this->_cache['dependencies'][$channel][$package])) {
            return false;
        }

        foreach ($this->_cache['dependencies'][$channel][$package] as $info) {
            if (isset($info['dep']['uri'])) {
                if (is_object($child)) {
                    if ($info['dep']['uri'] == $child->getURI()) {
                        return true;
                    }
                } elseif (isset($child['uri'])) {
                    if ($info['dep']['uri'] == $child['uri']) {
                        return true;
                    }
                }
                return false;
            }

            if (strtolower($info['dep']['channel']) == $depchannel &&
                  strtolower($info['dep']['name']) == $deppackage) {
                return true;
            }
        }

        foreach ($this->_cache['dependencies'][$channel][$package] as $info) {
            if (isset($info['dep']['uri'])) {
                if ($this->_dependsOn(array(
                        'uri' => $info['dep']['uri'],
                        'package' => $info['dep']['name']), $child, $checked)) {
                    return true;
                }
            } else {
                if ($this->_dependsOn(array(
                        'channel' => $info['dep']['channel'],
                        'package' => $info['dep']['name']), $child, $checked)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Register dependencies of a package that is being installed or upgraded
     * @param PEAR_PackageFile_v2|PEAR_PackageFile_v2
     */
    function installPackage(&$package)
    {
        $data = $this->_getDepDB();
        unset($this->_cache);
        $this->_setPackageDeps($data, $package);
        $this->_writeDepDB($data);
    }

    /**
     * Remove dependencies of a package that is being uninstalled, or upgraded.
     *
     * Upgraded packages first uninstall, then install
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array If an array, then it must have
     *        indices 'channel' and 'package'
     */
    function uninstallPackage(&$pkg)
    {
        $data = $this->_getDepDB();
        unset($this->_cache);
        if (is_object($pkg)) {
            $channel = strtolower($pkg->getChannel());
            $package = strtolower($pkg->getPackage());
        } else {
            $channel = strtolower($pkg['channel']);
            $package = strtolower($pkg['package']);
        }

        if (!isset($data['dependencies'][$channel][$package])) {
            return true;
        }

        foreach ($data['dependencies'][$channel][$package] as $dep) {
            $found      = false;
            $depchannel = isset($dep['dep']['uri']) ? '__uri' : strtolower($dep['dep']['channel']);
            $depname    = strtolower($dep['dep']['name']);
            if (isset($data['packages'][$depchannel][$depname])) {
                foreach ($data['packages'][$depchannel][$depname] as $i => $info) {
                    if ($info['channel'] == $channel && $info['package'] == $package) {
                        $found = true;
                        break;
                    }
                }
            }

            if ($found) {
                unset($data['packages'][$depchannel][$depname][$i]);
                if (!count($data['packages'][$depchannel][$depname])) {
                    unset($data['packages'][$depchannel][$depname]);
                    if (!count($data['packages'][$depchannel])) {
                        unset($data['packages'][$depchannel]);
                    }
                } else {
                    $data['packages'][$depchannel][$depname] =
                        array_values($data['packages'][$depchannel][$depname]);
                }
            }
        }

        unset($data['dependencies'][$channel][$package]);
        if (!count($data['dependencies'][$channel])) {
            unset($data['dependencies'][$channel]);
        }

        if (!count($data['dependencies'])) {
            unset($data['dependencies']);
        }

        if (!count($data['packages'])) {
            unset($data['packages']);
        }

        $this->_writeDepDB($data);
    }

    /**
     * Rebuild the dependency DB by reading registry entries.
     * @return true|PEAR_Error
     */
    function rebuildDB()
    {
        $depdb = array('_version' => $this->_version);
        if (!$this->hasWriteAccess()) {
            // allow startup for read-only with older Registry
            return $depdb;
        }

        $packages = $this->_registry->listAllPackages();
        if (PEAR::isError($packages)) {
            return $packages;
        }

        foreach ($packages as $channel => $ps) {
            foreach ($ps as $package) {
                $package = $this->_registry->getPackage($package, $channel);
                if (PEAR::isError($package)) {
                    return $package;
                }
                $this->_setPackageDeps($depdb, $package);
            }
        }

        $error = $this->_writeDepDB($depdb);
        if (PEAR::isError($error)) {
            return $error;
        }

        $this->_cache = $depdb;
        return true;
    }

    /**
     * Register usage of the dependency DB to prevent race conditions
     * @param int one of the LOCK_* constants
     * @return true|PEAR_Error
     * @access private
     */
    function _lock($mode = LOCK_EX)
    {
        if (stristr(php_uname(), 'Windows 9')) {
            return true;
        }

        if ($mode != LOCK_UN && is_resource($this->_lockFp)) {
            // XXX does not check type of lock (LOCK_SH/LOCK_EX)
            return true;
        }

        $open_mode = 'w';
        // XXX People reported problems with LOCK_SH and 'w'
        if ($mode === LOCK_SH) {
            if (!file_exists($this->_lockfile)) {
                touch($this->_lockfile);
            } elseif (!is_file($this->_lockfile)) {
                return PEAR::raiseError('could not create Dependency lock file, ' .
                    'it exists and is not a regular file');
            }
            $open_mode = 'r';
        }

        if (!is_resource($this->_lockFp)) {
            $this->_lockFp = @fopen($this->_lockfile, $open_mode);
        }

        if (!is_resource($this->_lockFp)) {
            $last_errormsg = '';
            $last_error = error_get_last();
            if (!empty($last_error['message'])) {
                $last_errormsg = $last_error['message'];
            }
            return PEAR::raiseError("could not create Dependency lock file" .
                                     (isset($last_errormsg) ? ": " . $last_errormsg : ""));
        }

        if (!(int)flock($this->_lockFp, $mode)) {
            switch ($mode) {
                case LOCK_SH: $str = 'shared';    break;
                case LOCK_EX: $str = 'exclusive'; break;
                case LOCK_UN: $str = 'unlock';    break;
                default:      $str = 'unknown';   break;
            }

            return PEAR::raiseError("could not acquire $str lock ($this->_lockfile)");
        }

        return true;
    }

    /**
     * Release usage of dependency DB
     * @return true|PEAR_Error
     * @access private
     */
    function _unlock()
    {
        $ret = $this->_lock(LOCK_UN);
        if (is_resource($this->_lockFp)) {
            fclose($this->_lockFp);
        }
        $this->_lockFp = null;
        return $ret;
    }

    /**
     * Load the dependency database from disk, or return the cache
     * @return array|PEAR_Error
     */
    function _getDepDB()
    {
        if (!$this->hasWriteAccess()) {
            return array('_version' => $this->_version);
        }

        if (isset($this->_cache)) {
            return $this->_cache;
        }

        if (!$fp = fopen($this->_depdb, 'r')) {
            $err = PEAR::raiseError("Could not open dependencies file `".$this->_depdb."'");
            return $err;
        }

        clearstatcache();
        fclose($fp);
        $data = @unserialize(file_get_contents($this->_depdb));
        $this->_cache = $data;
        return $data;
    }

    /**
     * Write out the dependency database to disk
     * @param array the database
     * @return true|PEAR_Error
     * @access private
     */
    function _writeDepDB(&$deps)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }

        if (!$fp = fopen($this->_depdb, 'wb')) {
            $this->_unlock();
            return PEAR::raiseError("Could not open dependencies file `".$this->_depdb."' for writing");
        }

        fwrite($fp, serialize($deps));
        fclose($fp);
        $this->_unlock();
        $this->_cache = $deps;
        return true;
    }

    /**
     * Register all dependencies from a package in the dependencies database, in essence
     * "installing" the package's dependency information
     * @param array the database
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @access private
     */
    function _setPackageDeps(&$data, &$pkg)
    {
        $pkg->setConfig($this->_config);
        if ($pkg->getPackagexmlVersion() == '1.0') {
            $gen = &$pkg->getDefaultGenerator();
            $deps = $gen->dependenciesToV2();
        } else {
            $deps = $pkg->getDeps(true);
        }

        if (!$deps) {
            return;
        }

        if (!is_array($data)) {
            $data = array();
        }

        if (!isset($data['dependencies'])) {
            $data['dependencies'] = array();
        }

        $channel = strtolower($pkg->getChannel());
        $package = strtolower($pkg->getPackage());

        if (!isset($data['dependencies'][$channel])) {
            $data['dependencies'][$channel] = array();
        }

        $data['dependencies'][$channel][$package] = array();
        if (isset($deps['required']['package'])) {
            if (!isset($deps['required']['package'][0])) {
                $deps['required']['package'] = array($deps['required']['package']);
            }

            foreach ($deps['required']['package'] as $dep) {
                $this->_registerDep($data, $pkg, $dep, 'required');
            }
        }

        if (isset($deps['optional']['package'])) {
            if (!isset($deps['optional']['package'][0])) {
                $deps['optional']['package'] = array($deps['optional']['package']);
            }

            foreach ($deps['optional']['package'] as $dep) {
                $this->_registerDep($data, $pkg, $dep, 'optional');
            }
        }

        if (isset($deps['required']['subpackage'])) {
            if (!isset($deps['required']['subpackage'][0])) {
                $deps['required']['subpackage'] = array($deps['required']['subpackage']);
            }

            foreach ($deps['required']['subpackage'] as $dep) {
                $this->_registerDep($data, $pkg, $dep, 'required');
            }
        }

        if (isset($deps['optional']['subpackage'])) {
            if (!isset($deps['optional']['subpackage'][0])) {
                $deps['optional']['subpackage'] = array($deps['optional']['subpackage']);
            }

            foreach ($deps['optional']['subpackage'] as $dep) {
                $this->_registerDep($data, $pkg, $dep, 'optional');
            }
        }

        if (isset($deps['group'])) {
            if (!isset($deps['group'][0])) {
                $deps['group'] = array($deps['group']);
            }

            foreach ($deps['group'] as $group) {
                if (isset($group['package'])) {
                    if (!isset($group['package'][0])) {
                        $group['package'] = array($group['package']);
                    }

                    foreach ($group['package'] as $dep) {
                        $this->_registerDep($data, $pkg, $dep, 'optional',
                            $group['attribs']['name']);
                    }
                }

                if (isset($group['subpackage'])) {
                    if (!isset($group['subpackage'][0])) {
                        $group['subpackage'] = array($group['subpackage']);
                    }

                    foreach ($group['subpackage'] as $dep) {
                        $this->_registerDep($data, $pkg, $dep, 'optional',
                            $group['attribs']['name']);
                    }
                }
            }
        }

        if ($data['dependencies'][$channel][$package] == array()) {
            unset($data['dependencies'][$channel][$package]);
            if (!count($data['dependencies'][$channel])) {
                unset($data['dependencies'][$channel]);
            }
        }
    }

    /**
     * @param array the database
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param array the specific dependency
     * @param required|optional whether this is a required or an optional dep
     * @param string|false dependency group this dependency is from, or false for ordinary dep
     */
    function _registerDep(&$data, &$pkg, $dep, $type, $group = false)
    {
        $info = array(
            'dep'   => $dep,
            'type'  => $type,
            'group' => $group
        );

        $dep  = array_map('strtolower', $dep);
        $depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri';
        if (!isset($data['dependencies'])) {
            $data['dependencies'] = array();
        }

        $channel = strtolower($pkg->getChannel());
        $package = strtolower($pkg->getPackage());

        if (!isset($data['dependencies'][$channel])) {
            $data['dependencies'][$channel] = array();
        }

        if (!isset($data['dependencies'][$channel][$package])) {
            $data['dependencies'][$channel][$package] = array();
        }

        $data['dependencies'][$channel][$package][] = $info;
        if (isset($data['packages'][$depchannel][$dep['name']])) {
            $found = false;
            foreach ($data['packages'][$depchannel][$dep['name']] as $i => $p) {
                if ($p['channel'] == $channel && $p['package'] == $package) {
                    $found = true;
                    break;
                }
            }
        } else {
            if (!isset($data['packages'])) {
                $data['packages'] = array();
            }

            if (!isset($data['packages'][$depchannel])) {
                $data['packages'][$depchannel] = array();
            }

            if (!isset($data['packages'][$depchannel][$dep['name']])) {
                $data['packages'][$depchannel][$dep['name']] = array();
            }

            $found = false;
        }

        if (!$found) {
            $data['packages'][$depchannel][$dep['name']][] = array(
                'channel' => $channel,
                'package' => $package
            );
        }
    }
}
PK�a�\���=_�_�pear/PEAR/PackageFile/v2/rw.phpnu�[���<?php
/**
 * PEAR_PackageFile_v2, package.xml version 2.0, read/write version
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a8
 */
/**
 * For base class
 */
require_once 'PEAR/PackageFile/v2.php';
/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a8
 */
class PEAR_PackageFile_v2_rw extends PEAR_PackageFile_v2
{
    /**
     * @param string Extension name
     * @return bool success of operation
     */
    function setProvidesExtension($extension)
    {
        if (in_array($this->getPackageType(),
              array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) {
            if (!isset($this->_packageInfo['providesextension'])) {
                // ensure that the channel tag is set up in the right location
                $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                    array('usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease',
                    'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                    'bundle', 'changelog'),
                    $extension, 'providesextension');
            }
            $this->_packageInfo['providesextension'] = $extension;
            return true;
        }
        return false;
    }

    function setPackage($package)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['attribs'])) {
            $this->_packageInfo = array_merge(array('attribs' => array(
                                 'version' => '2.0',
                                 'xmlns' => 'http://pear.php.net/dtd/package-2.0',
                                 'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0',
                                 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
                                 'xsi:schemaLocation' => 'http://pear.php.net/dtd/tasks-1.0
    http://pear.php.net/dtd/tasks-1.0.xsd
    http://pear.php.net/dtd/package-2.0
    http://pear.php.net/dtd/package-2.0.xsd',
                             )), $this->_packageInfo);
        }
        if (!isset($this->_packageInfo['name'])) {
            return $this->_packageInfo = array_merge(array('name' => $package),
                $this->_packageInfo);
        }
        $this->_packageInfo['name'] = $package;
    }

    /**
     * set this as a package.xml version 2.1
     * @access private
     */
    function _setPackageVersion2_1()
    {
        $info = array(
                                 'version' => '2.1',
                                 'xmlns' => 'http://pear.php.net/dtd/package-2.1',
                                 'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0',
                                 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
                                 'xsi:schemaLocation' => 'http://pear.php.net/dtd/tasks-1.0
    http://pear.php.net/dtd/tasks-1.0.xsd
    http://pear.php.net/dtd/package-2.1
    http://pear.php.net/dtd/package-2.1.xsd',
                             );
        if (!isset($this->_packageInfo['attribs'])) {
            $this->_packageInfo = array_merge(array('attribs' => $info), $this->_packageInfo);
        } else {
            $this->_packageInfo['attribs'] = $info;
        }
    }

    function setUri($uri)
    {
        unset($this->_packageInfo['channel']);
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['uri'])) {
            // ensure that the uri tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('extends', 'summary', 'description', 'lead',
                'developer', 'contributor', 'helper', 'date', 'time', 'version',
                'stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $uri, 'uri');
        }
        $this->_packageInfo['uri'] = $uri;
    }

    function setChannel($channel)
    {
        unset($this->_packageInfo['uri']);
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['channel'])) {
            // ensure that the channel tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('extends', 'summary', 'description', 'lead',
                'developer', 'contributor', 'helper', 'date', 'time', 'version',
                'stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $channel, 'channel');
        }
        $this->_packageInfo['channel'] = $channel;
    }

    function setExtends($extends)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['extends'])) {
            // ensure that the extends tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('summary', 'description', 'lead',
                'developer', 'contributor', 'helper', 'date', 'time', 'version',
                'stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $extends, 'extends');
        }
        $this->_packageInfo['extends'] = $extends;
    }

    function setSummary($summary)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['summary'])) {
            // ensure that the summary tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('description', 'lead',
                'developer', 'contributor', 'helper', 'date', 'time', 'version',
                'stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $summary, 'summary');
        }
        $this->_packageInfo['summary'] = $summary;
    }

    function setDescription($desc)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['description'])) {
            // ensure that the description tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('lead',
                'developer', 'contributor', 'helper', 'date', 'time', 'version',
                'stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $desc, 'description');
        }
        $this->_packageInfo['description'] = $desc;
    }

    /**
     * Adds a new maintainer - no checking of duplicates is performed, use
     * updatemaintainer for that purpose.
     */
    function addMaintainer($role, $handle, $name, $email, $active = 'yes')
    {
        if (!in_array($role, array('lead', 'developer', 'contributor', 'helper'))) {
            return false;
        }
        if (isset($this->_packageInfo[$role])) {
            if (!isset($this->_packageInfo[$role][0])) {
                $this->_packageInfo[$role] = array($this->_packageInfo[$role]);
            }
            $this->_packageInfo[$role][] =
                array(
                    'name' => $name,
                    'user' => $handle,
                    'email' => $email,
                    'active' => $active,
                );
        } else {
            $testarr = array('lead',
                    'developer', 'contributor', 'helper', 'date', 'time', 'version',
                    'stability', 'license', 'notes', 'contents', 'compatible',
                    'dependencies', 'providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease',
                    'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog');
            foreach (array('lead', 'developer', 'contributor', 'helper') as $testrole) {
                array_shift($testarr);
                if ($role == $testrole) {
                    break;
                }
            }
            if (!isset($this->_packageInfo[$role])) {
                // ensure that the extends tag is set up in the right location
                $this->_packageInfo = $this->_insertBefore($this->_packageInfo, $testarr,
                    array(), $role);
            }
            $this->_packageInfo[$role] =
                array(
                    'name' => $name,
                    'user' => $handle,
                    'email' => $email,
                    'active' => $active,
                );
        }
        $this->_isValid = 0;
    }

    function updateMaintainer($newrole, $handle, $name, $email, $active = 'yes')
    {
        $found = false;
        foreach (array('lead', 'developer', 'contributor', 'helper') as $role) {
            if (!isset($this->_packageInfo[$role])) {
                continue;
            }
            $info = $this->_packageInfo[$role];
            if (!isset($info[0])) {
                if ($info['user'] == $handle) {
                    $found = true;
                    break;
                }
            }
            foreach ($info as $i => $maintainer) {
                if (is_array($maintainer) && $maintainer['user'] == $handle) {
                    $found = $i;
                    break 2;
                }
            }
        }
        if ($found === false) {
            return $this->addMaintainer($newrole, $handle, $name, $email, $active);
        }
        if ($found !== false) {
            if ($found === true) {
                unset($this->_packageInfo[$role]);
            } else {
                unset($this->_packageInfo[$role][$found]);
                $this->_packageInfo[$role] = array_values($this->_packageInfo[$role]);
            }
        }
        $this->addMaintainer($newrole, $handle, $name, $email, $active);
        $this->_isValid = 0;
    }

    function deleteMaintainer($handle)
    {
        $found = false;
        foreach (array('lead', 'developer', 'contributor', 'helper') as $role) {
            if (!isset($this->_packageInfo[$role])) {
                continue;
            }
            if (!isset($this->_packageInfo[$role][0])) {
                $this->_packageInfo[$role] = array($this->_packageInfo[$role]);
            }
            foreach ($this->_packageInfo[$role] as $i => $maintainer) {
                if ($maintainer['user'] == $handle) {
                    $found = $i;
                    break;
                }
            }
            if ($found !== false) {
                unset($this->_packageInfo[$role][$found]);
                if (!count($this->_packageInfo[$role]) && $role == 'lead') {
                    $this->_isValid = 0;
                }
                if (!count($this->_packageInfo[$role])) {
                    unset($this->_packageInfo[$role]);
                    return true;
                }
                $this->_packageInfo[$role] =
                    array_values($this->_packageInfo[$role]);
                if (count($this->_packageInfo[$role]) == 1) {
                    $this->_packageInfo[$role] = $this->_packageInfo[$role][0];
                }
                return true;
            }
            if (count($this->_packageInfo[$role]) == 1) {
                $this->_packageInfo[$role] = $this->_packageInfo[$role][0];
            }
        }
        return false;
    }

    function setReleaseVersion($version)
    {
        if (isset($this->_packageInfo['version']) &&
              isset($this->_packageInfo['version']['release'])) {
            unset($this->_packageInfo['version']['release']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $version, array(
            'version' => array('stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'),
            'release' => array('api')));
        $this->_isValid = 0;
    }

    function setAPIVersion($version)
    {
        if (isset($this->_packageInfo['version']) &&
              isset($this->_packageInfo['version']['api'])) {
            unset($this->_packageInfo['version']['api']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $version, array(
            'version' => array('stability', 'license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'),
            'api' => array()));
        $this->_isValid = 0;
    }

    /**
     * snapshot|devel|alpha|beta|stable
     */
    function setReleaseStability($state)
    {
        if (isset($this->_packageInfo['stability']) &&
              isset($this->_packageInfo['stability']['release'])) {
            unset($this->_packageInfo['stability']['release']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $state, array(
            'stability' => array('license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'),
            'release' => array('api')));
        $this->_isValid = 0;
    }

    /**
     * @param devel|alpha|beta|stable
     */
    function setAPIStability($state)
    {
        if (isset($this->_packageInfo['stability']) &&
              isset($this->_packageInfo['stability']['api'])) {
            unset($this->_packageInfo['stability']['api']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $state, array(
            'stability' => array('license', 'notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'),
            'api' => array()));
        $this->_isValid = 0;
    }

    function setLicense($license, $uri = false, $filesource = false)
    {
        if (!isset($this->_packageInfo['license'])) {
            // ensure that the license tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('notes', 'contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), 0, 'license');
        }
        if ($uri || $filesource) {
            $attribs = array();
            if ($uri) {
                $attribs['uri'] = $uri;
            }
            $uri = true; // for test below
            if ($filesource) {
                $attribs['filesource'] = $filesource;
            }
        }
        $license = $uri ? array('attribs' => $attribs, '_content' => $license) : $license;
        $this->_packageInfo['license'] = $license;
        $this->_isValid = 0;
    }

    function setNotes($notes)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['notes'])) {
            // ensure that the notes tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('contents', 'compatible',
                'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri',
                'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'extbinrelease', 'bundle', 'changelog'), $notes, 'notes');
        }
        $this->_packageInfo['notes'] = $notes;
    }

    /**
     * This is only used at install-time, after all serialization
     * is over.
     * @param string file name
     * @param string installed path
     */
    function setInstalledAs($file, $path)
    {
        if ($path) {
            return $this->_packageInfo['filelist'][$file]['installed_as'] = $path;
        }
        unset($this->_packageInfo['filelist'][$file]['installed_as']);
    }

    /**
     * This is only used at install-time, after all serialization
     * is over.
     */
    function installedFile($file, $atts)
    {
        if (isset($this->_packageInfo['filelist'][$file])) {
            $this->_packageInfo['filelist'][$file] =
                array_merge($this->_packageInfo['filelist'][$file], $atts['attribs']);
        } else {
            $this->_packageInfo['filelist'][$file] = $atts['attribs'];
        }
    }

    /**
     * Reset the listing of package contents
     * @param string base installation dir for the whole package, if any
     */
    function clearContents($baseinstall = false)
    {
        $this->_filesValid = false;
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['contents'])) {
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('compatible',
                    'dependencies', 'providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease',
                    'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                    'bundle', 'changelog'), array(), 'contents');
        }
        if ($this->getPackageType() != 'bundle') {
            $this->_packageInfo['contents'] =
                array('dir' => array('attribs' => array('name' => '/')));
            if ($baseinstall) {
                $this->_packageInfo['contents']['dir']['attribs']['baseinstalldir'] = $baseinstall;
            }
        } else {
            $this->_packageInfo['contents'] = array('bundledpackage' => array());
        }
    }

    /**
     * @param string relative path of the bundled package.
     */
    function addBundledPackage($path)
    {
        if ($this->getPackageType() != 'bundle') {
            return false;
        }
        $this->_filesValid = false;
        $this->_isValid = 0;
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $path, array(
                'contents' => array('compatible', 'dependencies', 'providesextension',
                'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease',
                'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'bundle', 'changelog'),
                'bundledpackage' => array()));
    }

    /**
     * @param string file name
     * @param PEAR_Task_Common a read/write task
     */
    function addTaskToFile($filename, $task)
    {
        if (!method_exists($task, 'getXml')) {
            return false;
        }
        if (!method_exists($task, 'getName')) {
            return false;
        }
        if (!method_exists($task, 'validate')) {
            return false;
        }
        if (!$task->validate()) {
            return false;
        }
        if (!isset($this->_packageInfo['contents']['dir']['file'])) {
            return false;
        }
        $this->getTasksNs(); // discover the tasks namespace if not done already
        $files = $this->_packageInfo['contents']['dir']['file'];
        if (!isset($files[0])) {
            $files = array($files);
            $ind = false;
        } else {
            $ind = true;
        }
        foreach ($files as $i => $file) {
            if (isset($file['attribs'])) {
                if ($file['attribs']['name'] == $filename) {
                    if ($ind) {
                        $t = isset($this->_packageInfo['contents']['dir']['file'][$i]
                              ['attribs'][$this->_tasksNs .
                              ':' . $task->getName()]) ?
                              $this->_packageInfo['contents']['dir']['file'][$i]
                              ['attribs'][$this->_tasksNs .
                              ':' . $task->getName()] : false;
                        if ($t && !isset($t[0])) {
                            $this->_packageInfo['contents']['dir']['file'][$i]
                                [$this->_tasksNs . ':' . $task->getName()] = array($t);
                        }
                        $this->_packageInfo['contents']['dir']['file'][$i][$this->_tasksNs .
                            ':' . $task->getName()][] = $task->getXml();
                    } else {
                        $t = isset($this->_packageInfo['contents']['dir']['file']
                              ['attribs'][$this->_tasksNs .
                              ':' . $task->getName()]) ? $this->_packageInfo['contents']['dir']['file']
                              ['attribs'][$this->_tasksNs .
                              ':' . $task->getName()] : false;
                        if ($t && !isset($t[0])) {
                            $this->_packageInfo['contents']['dir']['file']
                                [$this->_tasksNs . ':' . $task->getName()] = array($t);
                        }
                        $this->_packageInfo['contents']['dir']['file'][$this->_tasksNs .
                            ':' . $task->getName()][] = $task->getXml();
                    }
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * @param string path to the file
     * @param string filename
     * @param array extra attributes
     */
    function addFile($dir, $file, $attrs)
    {
        if ($this->getPackageType() == 'bundle') {
            return false;
        }
        $this->_filesValid = false;
        $this->_isValid = 0;
        $dir = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'), $dir);
        if ($dir == '/' || $dir == '') {
            $dir = '';
        } else {
            $dir .= '/';
        }
        $attrs['name'] = $dir . $file;
        if (!isset($this->_packageInfo['contents'])) {
            // ensure that the contents tag is set up
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask',
                'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease',
                'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'bundle', 'changelog'), array(), 'contents');
        }
        if (isset($this->_packageInfo['contents']['dir']['file'])) {
            if (!isset($this->_packageInfo['contents']['dir']['file'][0])) {
                $this->_packageInfo['contents']['dir']['file'] =
                    array($this->_packageInfo['contents']['dir']['file']);
            }
            $this->_packageInfo['contents']['dir']['file'][]['attribs'] = $attrs;
        } else {
            $this->_packageInfo['contents']['dir']['file']['attribs'] = $attrs;
        }
    }

    /**
     * @param string Dependent package name
     * @param string Dependent package's channel name
     * @param string minimum version of specified package that this release is guaranteed to be
     *               compatible with
     * @param string maximum version of specified package that this release is guaranteed to be
     *               compatible with
     * @param string versions of specified package that this release is not compatible with
     */
    function addCompatiblePackage($name, $channel, $min, $max, $exclude = false)
    {
        $this->_isValid = 0;
        $set = array(
            'name' => $name,
            'channel' => $channel,
            'min' => $min,
            'max' => $max,
        );
        if ($exclude) {
            $set['exclude'] = $exclude;
        }
        $this->_isValid = 0;
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array(
                'compatible' => array('dependencies', 'providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog')
            ));
    }

    /**
     * Removes the <usesrole> tag entirely
     */
    function resetUsesrole()
    {
        if (isset($this->_packageInfo['usesrole'])) {
            unset($this->_packageInfo['usesrole']);
        }
    }

    /**
     * @param string
     * @param string package name or uri
     * @param string channel name if non-uri
     */
    function addUsesrole($role, $packageOrUri, $channel = false) {
        $set = array('role' => $role);
        if ($channel) {
            $set['package'] = $packageOrUri;
            $set['channel'] = $channel;
        } else {
            $set['uri'] = $packageOrUri;
        }
        $this->_isValid = 0;
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array(
                'usesrole' => array('usestask', 'srcpackage', 'srcuri',
                    'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog')
            ));
    }

    /**
     * Removes the <usestask> tag entirely
     */
    function resetUsestask()
    {
        if (isset($this->_packageInfo['usestask'])) {
            unset($this->_packageInfo['usestask']);
        }
    }


    /**
     * @param string
     * @param string package name or uri
     * @param string channel name if non-uri
     */
    function addUsestask($task, $packageOrUri, $channel = false) {
        $set = array('task' => $task);
        if ($channel) {
            $set['package'] = $packageOrUri;
            $set['channel'] = $channel;
        } else {
            $set['uri'] = $packageOrUri;
        }
        $this->_isValid = 0;
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array(
                'usestask' => array('srcpackage', 'srcuri',
                    'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog')
            ));
    }

    /**
     * Remove all compatible tags
     */
    function clearCompatible()
    {
        unset($this->_packageInfo['compatible']);
    }

    /**
     * Reset dependencies prior to adding new ones
     */
    function clearDeps()
    {
        if (!isset($this->_packageInfo['dependencies'])) {
            $this->_packageInfo = $this->_mergeTag($this->_packageInfo, array(),
                array(
                    'dependencies' => array('providesextension', 'usesrole', 'usestask',
                        'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                        'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog')));
        }
        $this->_packageInfo['dependencies'] = array();
    }

    /**
     * @param string minimum PHP version allowed
     * @param string maximum PHP version allowed
     * @param array $exclude incompatible PHP versions
     */
    function setPhpDep($min, $max = false, $exclude = false)
    {
        $this->_isValid = 0;
        $dep =
            array(
                'min' => $min,
            );
        if ($max) {
            $dep['max'] = $max;
        }
        if ($exclude) {
            if (count($exclude) == 1) {
                $exclude = $exclude[0];
            }
            $dep['exclude'] = $exclude;
        }
        if (isset($this->_packageInfo['dependencies']['required']['php'])) {
            $this->_stack->push(__FUNCTION__, 'warning', array('dep' =>
            $this->_packageInfo['dependencies']['required']['php']),
                'warning: PHP dependency already exists, overwriting');
            unset($this->_packageInfo['dependencies']['required']['php']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'php' => array('pearinstaller', 'package', 'subpackage', 'extension', 'os', 'arch')
            ));
        return true;
    }

    /**
     * @param string minimum allowed PEAR installer version
     * @param string maximum allowed PEAR installer version
     * @param string recommended PEAR installer version
     * @param array incompatible version of the PEAR installer
     */
    function setPearinstallerDep($min, $max = false, $recommended = false, $exclude = false)
    {
        $this->_isValid = 0;
        $dep =
            array(
                'min' => $min,
            );
        if ($max) {
            $dep['max'] = $max;
        }
        if ($recommended) {
            $dep['recommended'] = $recommended;
        }
        if ($exclude) {
            if (count($exclude) == 1) {
                $exclude = $exclude[0];
            }
            $dep['exclude'] = $exclude;
        }
        if (isset($this->_packageInfo['dependencies']['required']['pearinstaller'])) {
            $this->_stack->push(__FUNCTION__, 'warning', array('dep' =>
            $this->_packageInfo['dependencies']['required']['pearinstaller']),
                'warning: PEAR Installer dependency already exists, overwriting');
            unset($this->_packageInfo['dependencies']['required']['pearinstaller']);
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'pearinstaller' => array('package', 'subpackage', 'extension', 'os', 'arch')
            ));
    }

    /**
     * Mark a package as conflicting with this package
     * @param string package name
     * @param string package channel
     * @param string extension this package provides, if any
     * @param string|false minimum version required
     * @param string|false maximum version allowed
     * @param array|false versions to exclude from installation
     */
    function addConflictingPackageDepWithChannel($name, $channel,
                $providesextension = false, $min = false, $max = false, $exclude = false)
    {
        $this->_isValid = 0;
        $dep = $this->_constructDep($name, $channel, false, $min, $max, false,
            $exclude, $providesextension, false, true);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'package' => array('subpackage', 'extension', 'os', 'arch')
            ));
    }

    /**
     * Mark a package as conflicting with this package
     * @param string package name
     * @param string package channel
     * @param string extension this package provides, if any
     */
    function addConflictingPackageDepWithUri($name, $uri, $providesextension = false)
    {
        $this->_isValid = 0;
        $dep =
            array(
                'name' => $name,
                'uri' => $uri,
                'conflicts' => '',
            );
        if ($providesextension) {
            $dep['providesextension'] = $providesextension;
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'package' => array('subpackage', 'extension', 'os', 'arch')
            ));
    }

    function addDependencyGroup($name, $hint)
    {
        $this->_isValid = 0;
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo,
            array('attribs' => array('name' => $name, 'hint' => $hint)),
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'group' => array(),
            ));
    }

    /**
     * @param string package name
     * @param string|false channel name, false if this is a uri
     * @param string|false uri name, false if this is a channel
     * @param string|false minimum version required
     * @param string|false maximum version allowed
     * @param string|false recommended installation version
     * @param array|false versions to exclude from installation
     * @param string extension this package provides, if any
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     * @param bool if true, tells the installer to negate this dependency (conflicts)
     * @return array
     * @access private
     */
    function _constructDep($name, $channel, $uri, $min, $max, $recommended, $exclude,
                           $providesextension = false, $nodefault = false,
                           $conflicts = false)
    {
        $dep =
            array(
                'name' => $name,
            );
        if ($channel) {
            $dep['channel'] = $channel;
        } elseif ($uri) {
            $dep['uri'] = $uri;
        }
        if ($min) {
            $dep['min'] = $min;
        }
        if ($max) {
            $dep['max'] = $max;
        }
        if ($recommended) {
            $dep['recommended'] = $recommended;
        }
        if ($exclude) {
            if (is_array($exclude) && count($exclude) == 1) {
                $exclude = $exclude[0];
            }
            $dep['exclude'] = $exclude;
        }
        if ($conflicts) {
            $dep['conflicts'] = '';
        }
        if ($nodefault) {
            $dep['nodefault'] = '';
        }
        if ($providesextension) {
            $dep['providesextension'] = $providesextension;
        }
        return $dep;
    }

    /**
     * @param package|subpackage
     * @param string group name
     * @param string package name
     * @param string package channel
     * @param string minimum version
     * @param string maximum version
     * @param string recommended version
     * @param array|false optional excluded versions
     * @param string extension this package provides, if any
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     * @return bool false if the dependency group has not been initialized with
     *              {@link addDependencyGroup()}, or a subpackage is added with
     *              a providesextension
     */
    function addGroupPackageDepWithChannel($type, $groupname, $name, $channel, $min = false,
                                      $max = false, $recommended = false, $exclude = false,
                                      $providesextension = false, $nodefault = false)
    {
        if ($type == 'subpackage' && $providesextension) {
            return false; // subpackages must be php packages
        }
        $dep = $this->_constructDep($name, $channel, false, $min, $max, $recommended, $exclude,
            $providesextension, $nodefault);
        return $this->_addGroupDependency($type, $dep, $groupname);
    }

    /**
     * @param package|subpackage
     * @param string group name
     * @param string package name
     * @param string package uri
     * @param string extension this package provides, if any
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     * @return bool false if the dependency group has not been initialized with
     *              {@link addDependencyGroup()}
     */
    function addGroupPackageDepWithURI($type, $groupname, $name, $uri, $providesextension = false,
                                       $nodefault = false)
    {
        if ($type == 'subpackage' && $providesextension) {
            return false; // subpackages must be php packages
        }
        $dep = $this->_constructDep($name, false, $uri, false, false, false, false,
            $providesextension, $nodefault);
        return $this->_addGroupDependency($type, $dep, $groupname);
    }

    /**
     * @param string group name (must be pre-existing)
     * @param string extension name
     * @param string minimum version allowed
     * @param string maximum version allowed
     * @param string recommended version
     * @param array incompatible versions
     */
    function addGroupExtensionDep($groupname, $name, $min = false, $max = false,
                                         $recommended = false, $exclude = false)
    {
        $this->_isValid = 0;
        $dep = $this->_constructDep($name, false, false, $min, $max, $recommended, $exclude);
        return $this->_addGroupDependency('extension', $dep, $groupname);
    }

    /**
     * @param package|subpackage|extension
     * @param array dependency contents
     * @param string name of the dependency group to add this to
     * @return boolean
     * @access private
     */
    function _addGroupDependency($type, $dep, $groupname)
    {
        $arr = array('subpackage', 'extension');
        if ($type != 'package') {
            array_shift($arr);
        }
        if ($type == 'extension') {
            array_shift($arr);
        }
        if (!isset($this->_packageInfo['dependencies']['group'])) {
            return false;
        } else {
            if (!isset($this->_packageInfo['dependencies']['group'][0])) {
                if ($this->_packageInfo['dependencies']['group']['attribs']['name'] == $groupname) {
                    $this->_packageInfo['dependencies']['group'] = $this->_mergeTag(
                        $this->_packageInfo['dependencies']['group'], $dep,
                        array(
                            $type => $arr
                        ));
                    $this->_isValid = 0;
                    return true;
                } else {
                    return false;
                }
            } else {
                foreach ($this->_packageInfo['dependencies']['group'] as $i => $group) {
                    if ($group['attribs']['name'] == $groupname) {
                    $this->_packageInfo['dependencies']['group'][$i] = $this->_mergeTag(
                        $this->_packageInfo['dependencies']['group'][$i], $dep,
                        array(
                            $type => $arr
                        ));
                        $this->_isValid = 0;
                        return true;
                    }
                }
                return false;
            }
        }
    }

    /**
     * @param optional|required
     * @param string package name
     * @param string package channel
     * @param string minimum version
     * @param string maximum version
     * @param string recommended version
     * @param string extension this package provides, if any
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     * @param array|false optional excluded versions
     */
    function addPackageDepWithChannel($type, $name, $channel, $min = false, $max = false,
                                      $recommended = false, $exclude = false,
                                      $providesextension = false, $nodefault = false)
    {
        if (!in_array($type, array('optional', 'required'), true)) {
            $type = 'required';
        }
        $this->_isValid = 0;
        $arr = array('optional', 'group');
        if ($type != 'required') {
            array_shift($arr);
        }
        $dep = $this->_constructDep($name, $channel, false, $min, $max, $recommended, $exclude,
            $providesextension, $nodefault);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                $type => $arr,
                'package' => array('subpackage', 'extension', 'os', 'arch')
            ));
    }

    /**
     * @param optional|required
     * @param string name of the package
     * @param string uri of the package
     * @param string extension this package provides, if any
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     */
    function addPackageDepWithUri($type, $name, $uri, $providesextension = false,
                                  $nodefault = false)
    {
        $this->_isValid = 0;
        $arr = array('optional', 'group');
        if ($type != 'required') {
            array_shift($arr);
        }
        $dep = $this->_constructDep($name, false, $uri, false, false, false, false,
            $providesextension, $nodefault);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                $type => $arr,
                'package' => array('subpackage', 'extension', 'os', 'arch')
            ));
    }

    /**
     * @param optional|required optional, required
     * @param string package name
     * @param string package channel
     * @param string minimum version
     * @param string maximum version
     * @param string recommended version
     * @param array incompatible versions
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     */
    function addSubpackageDepWithChannel($type, $name, $channel, $min = false, $max = false,
                                         $recommended = false, $exclude = false,
                                         $nodefault = false)
    {
        $this->_isValid = 0;
        $arr = array('optional', 'group');
        if ($type != 'required') {
            array_shift($arr);
        }
        $dep = $this->_constructDep($name, $channel, false, $min, $max, $recommended, $exclude,
            $nodefault);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                $type => $arr,
                'subpackage' => array('extension', 'os', 'arch')
            ));
    }

    /**
     * @param optional|required optional, required
     * @param string package name
     * @param string package uri for download
     * @param bool if true, tells the installer to ignore the default optional dependency group
     *             when installing this package
     */
    function addSubpackageDepWithUri($type, $name, $uri, $nodefault = false)
    {
        $this->_isValid = 0;
        $arr = array('optional', 'group');
        if ($type != 'required') {
            array_shift($arr);
        }
        $dep = $this->_constructDep($name, false, $uri, false, false, false, false, $nodefault);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                $type => $arr,
                'subpackage' => array('extension', 'os', 'arch')
            ));
    }

    /**
     * @param optional|required optional, required
     * @param string extension name
     * @param string minimum version
     * @param string maximum version
     * @param string recommended version
     * @param array incompatible versions
     */
    function addExtensionDep($type, $name, $min = false, $max = false, $recommended = false,
                             $exclude = false)
    {
        $this->_isValid = 0;
        $arr = array('optional', 'group');
        if ($type != 'required') {
            array_shift($arr);
        }
        $dep = $this->_constructDep($name, false, false, $min, $max, $recommended, $exclude);
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                $type => $arr,
                'extension' => array('os', 'arch')
            ));
    }

    /**
     * @param string Operating system name
     * @param boolean true if this package cannot be installed on this OS
     */
    function addOsDep($name, $conflicts = false)
    {
        $this->_isValid = 0;
        $dep = array('name' => $name);
        if ($conflicts) {
            $dep['conflicts'] = '';
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'os' => array('arch')
            ));
    }

    /**
     * @param string Architecture matching pattern
     * @param boolean true if this package cannot be installed on this architecture
     */
    function addArchDep($pattern, $conflicts = false)
    {
        $this->_isValid = 0;
        $dep = array('pattern' => $pattern);
        if ($conflicts) {
            $dep['conflicts'] = '';
        }
        $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $dep,
            array(
                'dependencies' => array('providesextension', 'usesrole', 'usestask',
                    'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease',
                    'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'),
                'required' => array('optional', 'group'),
                'arch' => array()
            ));
    }

    /**
     * Set the kind of package, and erase all release tags
     *
     * - a php package is a PEAR-style package
     * - an extbin package is a PECL-style extension binary
     * - an extsrc package is a PECL-style source for a binary
     * - an zendextbin package is a PECL-style zend extension binary
     * - an zendextsrc package is a PECL-style source for a zend extension binary
     * - a bundle package is a collection of other pre-packaged packages
     * @param php|extbin|extsrc|zendextsrc|zendextbin|bundle
     * @return bool success
     */
    function setPackageType($type)
    {
        $this->_isValid = 0;
        if (!in_array($type, array('php', 'extbin', 'extsrc', 'zendextsrc',
                                   'zendextbin', 'bundle'))) {
            return false;
        }

        if (in_array($type, array('zendextsrc', 'zendextbin'))) {
            $this->_setPackageVersion2_1();
        }

        if ($type != 'bundle') {
            $type .= 'release';
        }

        foreach (array('phprelease', 'extbinrelease', 'extsrcrelease',
                       'zendextsrcrelease', 'zendextbinrelease', 'bundle') as $test) {
            unset($this->_packageInfo[$test]);
        }

        if (!isset($this->_packageInfo[$type])) {
            // ensure that the release tag is set up
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('changelog'),
                array(), $type);
        }

        $this->_packageInfo[$type] = array();
        return true;
    }

    /**
     * @return bool true if package type is set up
     */
    function addRelease()
    {
        if ($type = $this->getPackageType()) {
            if ($type != 'bundle') {
                $type .= 'release';
            }
            $this->_packageInfo = $this->_mergeTag($this->_packageInfo, array(),
                array($type => array('changelog')));
            return true;
        }
        return false;
    }

    /**
     * Get the current release tag in order to add to it
     * @param bool returns only releases that have installcondition if true
     * @return array|null
     */
    function &_getCurrentRelease($strict = true)
    {
        if ($p = $this->getPackageType()) {
            if ($strict) {
                if ($p == 'extsrc' || $p == 'zendextsrc') {
                    $a = null;
                    return $a;
                }
            }
            if ($p != 'bundle') {
                $p .= 'release';
            }
            if (isset($this->_packageInfo[$p][0])) {
                return $this->_packageInfo[$p][count($this->_packageInfo[$p]) - 1];
            } else {
                return $this->_packageInfo[$p];
            }
        } else {
            $a = null;
            return $a;
        }
    }

    /**
     * Add a file to the current release that should be installed under a different name
     * @param string <contents> path to file
     * @param string name the file should be installed as
     */
    function addInstallAs($path, $as)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        $r = $this->_mergeTag($r, array('attribs' => array('name' => $path, 'as' => $as)),
            array(
                'filelist' => array(),
                'install' => array('ignore')
            ));
    }

    /**
     * Add a file to the current release that should be ignored
     * @param string <contents> path to file
     * @return bool success of operation
     */
    function addIgnore($path)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        $r = $this->_mergeTag($r, array('attribs' => array('name' => $path)),
            array(
                'filelist' => array(),
                'ignore' => array()
            ));
    }

    /**
     * Add an extension binary package for this extension source code release
     *
     * Note that the package must be from the same channel as the extension source package
     * @param string
     */
    function addBinarypackage($package)
    {
        if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') {
            return false;
        }
        $r = &$this->_getCurrentRelease(false);
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        $r = $this->_mergeTag($r, $package,
            array(
                'binarypackage' => array('filelist'),
            ));
    }

    /**
     * Add a configureoption to an extension source package
     * @param string
     * @param string
     * @param string
     */
    function addConfigureOption($name, $prompt, $default = null)
    {
        if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') {
            return false;
        }

        $r = &$this->_getCurrentRelease(false);
        if ($r === null) {
            return false;
        }

        $opt = array('attribs' => array('name' => $name, 'prompt' => $prompt));
        if ($default !== null) {
            $opt['attribs']['default'] = $default;
        }

        $this->_isValid = 0;
        $r = $this->_mergeTag($r, $opt,
            array(
                'configureoption' => array('binarypackage', 'filelist'),
            ));
    }

    /**
     * Set an installation condition based on php version for the current release set
     * @param string minimum version
     * @param string maximum version
     * @param false|array incompatible versions of PHP
     */
    function setPhpInstallCondition($min, $max, $exclude = false)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        if (isset($r['installconditions']['php'])) {
            unset($r['installconditions']['php']);
        }
        $dep = array('min' => $min, 'max' => $max);
        if ($exclude) {
            if (is_array($exclude) && count($exclude) == 1) {
                $exclude = $exclude[0];
            }
            $dep['exclude'] = $exclude;
        }
        if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('configureoption', 'binarypackage',
                        'filelist'),
                    'php' => array('extension', 'os', 'arch')
                ));
        } else {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('filelist'),
                    'php' => array('extension', 'os', 'arch')
                ));
        }
    }

    /**
     * @param optional|required optional, required
     * @param string extension name
     * @param string minimum version
     * @param string maximum version
     * @param string recommended version
     * @param array incompatible versions
     */
    function addExtensionInstallCondition($name, $min = false, $max = false, $recommended = false,
                                          $exclude = false)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        $dep = $this->_constructDep($name, false, false, $min, $max, $recommended, $exclude);
        if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('configureoption', 'binarypackage',
                        'filelist'),
                    'extension' => array('os', 'arch')
                ));
        } else {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('filelist'),
                    'extension' => array('os', 'arch')
                ));
        }
    }

    /**
     * Set an installation condition based on operating system for the current release set
     * @param string OS name
     * @param bool whether this OS is incompatible with the current release
     */
    function setOsInstallCondition($name, $conflicts = false)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        if (isset($r['installconditions']['os'])) {
            unset($r['installconditions']['os']);
        }
        $dep = array('name' => $name);
        if ($conflicts) {
            $dep['conflicts'] = '';
        }
        if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('configureoption', 'binarypackage',
                        'filelist'),
                    'os' => array('arch')
                ));
        } else {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('filelist'),
                    'os' => array('arch')
                ));
        }
    }

    /**
     * Set an installation condition based on architecture for the current release set
     * @param string architecture pattern
     * @param bool whether this arch is incompatible with the current release
     */
    function setArchInstallCondition($pattern, $conflicts = false)
    {
        $r = &$this->_getCurrentRelease();
        if ($r === null) {
            return false;
        }
        $this->_isValid = 0;
        if (isset($r['installconditions']['arch'])) {
            unset($r['installconditions']['arch']);
        }
        $dep = array('pattern' => $pattern);
        if ($conflicts) {
            $dep['conflicts'] = '';
        }
        if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('configureoption', 'binarypackage',
                        'filelist'),
                    'arch' => array()
                ));
        } else {
            $r = $this->_mergeTag($r, $dep,
                array(
                    'installconditions' => array('filelist'),
                    'arch' => array()
                ));
        }
    }

    /**
     * For extension binary releases, this is used to specify either the
     * static URI to a source package, or the package name and channel of the extsrc/zendextsrc
     * package it is based on.
     * @param string Package name, or full URI to source package (extsrc/zendextsrc type)
     */
    function setSourcePackage($packageOrUri)
    {
        $this->_isValid = 0;
        if (isset($this->_packageInfo['channel'])) {
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('phprelease',
                'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'bundle', 'changelog'),
                $packageOrUri, 'srcpackage');
        } else {
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('phprelease',
                'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease',
                'bundle', 'changelog'), $packageOrUri, 'srcuri');
        }
    }

    /**
     * Generate a valid change log entry from the current package.xml
     * @param string|false
     */
    function generateChangeLogEntry($notes = false)
    {
        return array(
            'version' =>
                array(
                    'release' => $this->getVersion('release'),
                    'api' => $this->getVersion('api'),
                    ),
            'stability' =>
                $this->getStability(),
            'date' => $this->getDate(),
            'license' => $this->getLicense(true),
            'notes' => $notes ? $notes : $this->getNotes()
            );
    }

    /**
     * @param string release version to set change log notes for
     * @param array output of {@link generateChangeLogEntry()}
     */
    function setChangelogEntry($releaseversion, $contents)
    {
        if (!isset($this->_packageInfo['changelog'])) {
            $this->_packageInfo['changelog']['release'] = $contents;
            return;
        }
        if (!isset($this->_packageInfo['changelog']['release'][0])) {
            if ($this->_packageInfo['changelog']['release']['version']['release'] == $releaseversion) {
                $this->_packageInfo['changelog']['release'] = array(
                    $this->_packageInfo['changelog']['release']);
            } else {
                $this->_packageInfo['changelog']['release'] = array(
                    $this->_packageInfo['changelog']['release']);
                return $this->_packageInfo['changelog']['release'][] = $contents;
            }
        }
        foreach($this->_packageInfo['changelog']['release'] as $index => $changelog) {
            if (isset($changelog['version']) &&
                  strnatcasecmp($changelog['version']['release'], $releaseversion) == 0) {
                $curlog = $index;
            }
        }
        if (isset($curlog)) {
            $this->_packageInfo['changelog']['release'][$curlog] = $contents;
        } else {
            $this->_packageInfo['changelog']['release'][] = $contents;
        }
    }

    /**
     * Remove the changelog entirely
     */
    function clearChangeLog()
    {
        unset($this->_packageInfo['changelog']);
    }
}PK�a�\C�8�L�L&pear/PEAR/PackageFile/v2/Validator.phpnu�[���<?php
/**
 * PEAR_PackageFile_v2, package.xml version 2.0, read/write version
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a8
 */
/**
 * Private validation class used by PEAR_PackageFile_v2 - do not use directly, its
 * sole purpose is to split up the PEAR/PackageFile/v2.php file to make it smaller
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a8
 * @access private
 */
class PEAR_PackageFile_v2_Validator
{
    /**
     * @var array
     */
    var $_packageInfo;
    /**
     * @var PEAR_PackageFile_v2
     */
    var $_pf;
    /**
     * @var PEAR_ErrorStack
     */
    var $_stack;
    /**
     * @var int
     */
    var $_isValid = 0;
    /**
     * @var int
     */
    var $_filesValid = 0;
    /**
     * @var int
     */
    var $_curState = 0;
    /**
     * @param PEAR_PackageFile_v2
     * @param int
     */
    function validate(&$pf, $state = PEAR_VALIDATE_NORMAL)
    {
        $this->_pf = &$pf;
        $this->_curState = $state;
        $this->_packageInfo = $this->_pf->getArray();
        $this->_isValid = $this->_pf->_isValid;
        $this->_filesValid = $this->_pf->_filesValid;
        $this->_stack = &$pf->_stack;
        $this->_stack->getErrors(true);
        if (($this->_isValid & $state) == $state) {
            return true;
        }
        if (!isset($this->_packageInfo) || !is_array($this->_packageInfo)) {
            return false;
        }
        if (!isset($this->_packageInfo['attribs']['version']) ||
              ($this->_packageInfo['attribs']['version'] != '2.0' &&
               $this->_packageInfo['attribs']['version'] != '2.1')
        ) {
            $this->_noPackageVersion();
        }
        $structure =
        array(
            'name',
            'channel|uri',
            '*extends', // can't be multiple, but this works fine
            'summary',
            'description',
            '+lead', // these all need content checks
            '*developer',
            '*contributor',
            '*helper',
            'date',
            '*time',
            'version',
            'stability',
            'license->?uri->?filesource',
            'notes',
            'contents', //special validation needed
            '*compatible',
            'dependencies', //special validation needed
            '*usesrole',
            '*usestask', // reserve these for 1.4.0a1 to implement
                         // this will allow a package.xml to gracefully say it
                         // needs a certain package installed in order to implement a role or task
            '*providesextension',
            '*srcpackage|*srcuri',
            '+phprelease|+extsrcrelease|+extbinrelease|' .
                '+zendextsrcrelease|+zendextbinrelease|bundle', //special validation needed
            '*changelog',
        );
        $test = $this->_packageInfo;
        if (isset($test['dependencies']) &&
              isset($test['dependencies']['required']) &&
              isset($test['dependencies']['required']['pearinstaller']) &&
              isset($test['dependencies']['required']['pearinstaller']['min']) &&
              '1.10.16' != '@package' . '_version@' &&
              version_compare('1.10.16',
                $test['dependencies']['required']['pearinstaller']['min'], '<')
        ) {
            $this->_pearVersionTooLow($test['dependencies']['required']['pearinstaller']['min']);
            return false;
        }
        // ignore post-installation array fields
        if (array_key_exists('filelist', $test)) {
            unset($test['filelist']);
        }
        if (array_key_exists('_lastmodified', $test)) {
            unset($test['_lastmodified']);
        }
        if (array_key_exists('#binarypackage', $test)) {
            unset($test['#binarypackage']);
        }
        if (array_key_exists('old', $test)) {
            unset($test['old']);
        }
        if (array_key_exists('_lastversion', $test)) {
            unset($test['_lastversion']);
        }
        if (!$this->_stupidSchemaValidate($structure, $test, '<package>')) {
            return false;
        }
        if (empty($this->_packageInfo['name'])) {
            $this->_tagCannotBeEmpty('name');
        }
        $test = isset($this->_packageInfo['uri']) ? 'uri' :'channel';
        if (empty($this->_packageInfo[$test])) {
            $this->_tagCannotBeEmpty($test);
        }
        if (is_array($this->_packageInfo['license']) &&
              (!isset($this->_packageInfo['license']['_content']) ||
              empty($this->_packageInfo['license']['_content']))) {
            $this->_tagCannotBeEmpty('license');
        } elseif (empty($this->_packageInfo['license'])) {
            $this->_tagCannotBeEmpty('license');
        }
        if (empty($this->_packageInfo['summary'])) {
            $this->_tagCannotBeEmpty('summary');
        }
        if (empty($this->_packageInfo['description'])) {
            $this->_tagCannotBeEmpty('description');
        }
        if (empty($this->_packageInfo['date'])) {
            $this->_tagCannotBeEmpty('date');
        }
        if (empty($this->_packageInfo['notes'])) {
            $this->_tagCannotBeEmpty('notes');
        }
        if (isset($this->_packageInfo['time']) && empty($this->_packageInfo['time'])) {
            $this->_tagCannotBeEmpty('time');
        }
        if (isset($this->_packageInfo['dependencies'])) {
            $this->_validateDependencies();
        }
        if (isset($this->_packageInfo['compatible'])) {
            $this->_validateCompatible();
        }
        if (!isset($this->_packageInfo['bundle'])) {
            if (empty($this->_packageInfo['contents'])) {
                $this->_tagCannotBeEmpty('contents');
            }
            if (!isset($this->_packageInfo['contents']['dir'])) {
                $this->_filelistMustContainDir('contents');
                return false;
            }
            if (isset($this->_packageInfo['contents']['file'])) {
                $this->_filelistCannotContainFile('contents');
                return false;
            }
        }
        $this->_validateMaintainers();
        $this->_validateStabilityVersion();
        $fail = false;
        if (array_key_exists('usesrole', $this->_packageInfo)) {
            $roles = $this->_packageInfo['usesrole'];
            if (!is_array($roles) || !isset($roles[0])) {
                $roles = array($roles);
            }
            foreach ($roles as $role) {
                if (!isset($role['role'])) {
                    $this->_usesroletaskMustHaveRoleTask('usesrole', 'role');
                    $fail = true;
                } else {
                    if (!isset($role['channel'])) {
                        if (!isset($role['uri'])) {
                            $this->_usesroletaskMustHaveChannelOrUri($role['role'], 'usesrole');
                            $fail = true;
                        }
                    } elseif (!isset($role['package'])) {
                        $this->_usesroletaskMustHavePackage($role['role'], 'usesrole');
                        $fail = true;
                    }
                }
            }
        }
        if (array_key_exists('usestask', $this->_packageInfo)) {
            $roles = $this->_packageInfo['usestask'];
            if (!is_array($roles) || !isset($roles[0])) {
                $roles = array($roles);
            }
            foreach ($roles as $role) {
                if (!isset($role['task'])) {
                    $this->_usesroletaskMustHaveRoleTask('usestask', 'task');
                    $fail = true;
                } else {
                    if (!isset($role['channel'])) {
                        if (!isset($role['uri'])) {
                            $this->_usesroletaskMustHaveChannelOrUri($role['task'], 'usestask');
                            $fail = true;
                        }
                    } elseif (!isset($role['package'])) {
                        $this->_usesroletaskMustHavePackage($role['task'], 'usestask');
                        $fail = true;
                    }
                }
            }
        }

        if ($fail) {
            return false;
        }

        $list = $this->_packageInfo['contents'];
        if (isset($list['dir']) && is_array($list['dir']) && isset($list['dir'][0])) {
            $this->_multipleToplevelDirNotAllowed();
            return $this->_isValid = 0;
        }

        $this->_validateFilelist();
        $this->_validateRelease();
        if (!$this->_stack->hasErrors()) {
            $chan = $this->_pf->_registry->getChannel($this->_pf->getChannel(), true);
            if (PEAR::isError($chan)) {
                $this->_unknownChannel($this->_pf->getChannel());
            } else {
                $valpack = $chan->getValidationPackage();
                // for channel validator packages, always use the default PEAR validator.
                // otherwise, they can't be installed or packaged
                $validator = $chan->getValidationObject($this->_pf->getPackage());
                if (!$validator) {
                    $this->_stack->push(__FUNCTION__, 'error',
                        array('channel' => $chan->getName(),
                              'package' => $this->_pf->getPackage(),
                              'name'    => $valpack['_content'],
                              'version' => $valpack['attribs']['version']),
                        'package "%channel%/%package%" cannot be properly validated without ' .
                        'validation package "%channel%/%name%-%version%"');
                    return $this->_isValid = 0;
                }
                $validator->setPackageFile($this->_pf);
                $validator->validate($state);
                $failures = $validator->getFailures();
                foreach ($failures['errors'] as $error) {
                    $this->_stack->push(__FUNCTION__, 'error', $error,
                        'Channel validator error: field "%field%" - %reason%');
                }
                foreach ($failures['warnings'] as $warning) {
                    $this->_stack->push(__FUNCTION__, 'warning', $warning,
                        'Channel validator warning: field "%field%" - %reason%');
                }
            }
        }

        $this->_pf->_isValid = $this->_isValid = !$this->_stack->hasErrors('error');
        if ($this->_isValid && $state == PEAR_VALIDATE_PACKAGING && !$this->_filesValid) {
            if ($this->_pf->getPackageType() == 'bundle') {
                if ($this->_analyzeBundledPackages()) {
                    $this->_filesValid = $this->_pf->_filesValid = true;
                } else {
                    $this->_pf->_isValid = $this->_isValid = 0;
                }
            } else {
                if (!$this->_analyzePhpFiles()) {
                    $this->_pf->_isValid = $this->_isValid = 0;
                } else {
                    $this->_filesValid = $this->_pf->_filesValid = true;
                }
            }
        }

        if ($this->_isValid) {
            return $this->_pf->_isValid = $this->_isValid = $state;
        }

        return $this->_pf->_isValid = $this->_isValid = 0;
    }

    function _stupidSchemaValidate($structure, $xml, $root)
    {
        if (!is_array($xml)) {
            $xml = array();
        }
        $keys = array_keys($xml);
        reset($keys);
        $key = current($keys);
        while ($key == 'attribs' || $key == '_contents') {
            $key = next($keys);
        }
        $unfoundtags = $optionaltags = array();
        $ret = true;
        $mismatch = false;
        foreach ($structure as $struc) {
            if ($key) {
                $tag = $xml[$key];
            }
            $test = $this->_processStructure($struc);
            if (isset($test['choices'])) {
                $loose = true;
                foreach ($test['choices'] as $choice) {
                    if ($key == $choice['tag']) {
                        $key = next($keys);
                        while ($key == 'attribs' || $key == '_contents') {
                            $key = next($keys);
                        }
                        $unfoundtags = $optionaltags = array();
                        $mismatch = false;
                        if ($key && $key != $choice['tag'] && isset($choice['multiple'])) {
                            $unfoundtags[] = $choice['tag'];
                            $optionaltags[] = $choice['tag'];
                            if ($key) {
                                $mismatch = true;
                            }
                        }
                        $ret &= $this->_processAttribs($choice, $tag, $root);
                        continue 2;
                    } else {
                        $unfoundtags[] = $choice['tag'];
                        $mismatch = true;
                    }
                    if (!isset($choice['multiple']) || $choice['multiple'] != '*') {
                        $loose = false;
                    } else {
                        $optionaltags[] = $choice['tag'];
                    }
                }
                if (!$loose) {
                    $this->_invalidTagOrder($unfoundtags, $key, $root);
                    return false;
                }
            } else {
                if ($key != $test['tag']) {
                    if (isset($test['multiple']) && $test['multiple'] != '*') {
                        $unfoundtags[] = $test['tag'];
                        $this->_invalidTagOrder($unfoundtags, $key, $root);
                        return false;
                    } else {
                        if ($key) {
                            $mismatch = true;
                        }
                        $unfoundtags[] = $test['tag'];
                        $optionaltags[] = $test['tag'];
                    }
                    if (!isset($test['multiple'])) {
                        $this->_invalidTagOrder($unfoundtags, $key, $root);
                        return false;
                    }
                    continue;
                } else {
                    $unfoundtags = $optionaltags = array();
                    $mismatch = false;
                }
                $key = next($keys);
                while ($key == 'attribs' || $key == '_contents') {
                    $key = next($keys);
                }
                if ($key && $key != $test['tag'] && isset($test['multiple'])) {
                    $unfoundtags[] = $test['tag'];
                    $optionaltags[] = $test['tag'];
                    $mismatch = true;
                }
                $ret &= $this->_processAttribs($test, $tag, $root);
                continue;
            }
        }
        if (!$mismatch && count($optionaltags)) {
            // don't error out on any optional tags
            $unfoundtags = array_diff($unfoundtags, $optionaltags);
        }
        if (count($unfoundtags)) {
            $this->_invalidTagOrder($unfoundtags, $key, $root);
        } elseif ($key) {
            // unknown tags
            $this->_invalidTagOrder('*no tags allowed here*', $key, $root);
            while ($key = next($keys)) {
                $this->_invalidTagOrder('*no tags allowed here*', $key, $root);
            }
        }
        return $ret;
    }

    function _processAttribs($choice, $tag, $context)
    {
        if (isset($choice['attribs'])) {
            if (!is_array($tag)) {
                $tag = array($tag);
            }
            $tags = $tag;
            if (!isset($tags[0])) {
                $tags = array($tags);
            }
            $ret = true;
            foreach ($tags as $i => $tag) {
                if (!is_array($tag) || !isset($tag['attribs'])) {
                    foreach ($choice['attribs'] as $attrib) {
                        if ($attrib[0] != '?') {
                            $ret &= $this->_tagHasNoAttribs($choice['tag'],
                                $context);
                            continue 2;
                        }
                    }
                }
                foreach ($choice['attribs'] as $attrib) {
                    if ($attrib[0] != '?') {
                        if (!isset($tag['attribs'][$attrib])) {
                            $ret &= $this->_tagMissingAttribute($choice['tag'],
                                $attrib, $context);
                        }
                    }
                }
            }
            return $ret;
        }
        return true;
    }

    function _processStructure($key)
    {
        $ret = array();
        if (count($pieces = explode('|', $key)) > 1) {
            $ret['choices'] = array();
            foreach ($pieces as $piece) {
                $ret['choices'][] = $this->_processStructure($piece);
            }
            return $ret;
        }
        $multi = $key[0];
        if ($multi == '+' || $multi == '*') {
            $ret['multiple'] = $key[0];
            $key = substr($key, 1);
        }
        if (count($attrs = explode('->', $key)) > 1) {
            $ret['tag'] = array_shift($attrs);
            $ret['attribs'] = $attrs;
        } else {
            $ret['tag'] = $key;
        }
        return $ret;
    }

    function _validateStabilityVersion()
    {
        $structure = array('release', 'api');
        $a = $this->_stupidSchemaValidate($structure, $this->_packageInfo['version'], '<version>');
        $a &= $this->_stupidSchemaValidate($structure, $this->_packageInfo['stability'], '<stability>');
        if ($a) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $this->_packageInfo['version']['release'])) {
                $this->_invalidVersion('release', $this->_packageInfo['version']['release']);
            }
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $this->_packageInfo['version']['api'])) {
                $this->_invalidVersion('api', $this->_packageInfo['version']['api']);
            }
            if (!in_array($this->_packageInfo['stability']['release'],
                  array('snapshot', 'devel', 'alpha', 'beta', 'stable'))) {
                $this->_invalidState('release', $this->_packageInfo['stability']['release']);
            }
            if (!in_array($this->_packageInfo['stability']['api'],
                  array('devel', 'alpha', 'beta', 'stable'))) {
                $this->_invalidState('api', $this->_packageInfo['stability']['api']);
            }
        }
    }

    function _validateMaintainers()
    {
        $structure =
            array(
                'name',
                'user',
                'email',
                'active',
            );
        foreach (array('lead', 'developer', 'contributor', 'helper') as $type) {
            if (!isset($this->_packageInfo[$type])) {
                continue;
            }
            if (isset($this->_packageInfo[$type][0])) {
                foreach ($this->_packageInfo[$type] as $lead) {
                    $this->_stupidSchemaValidate($structure, $lead, '<' . $type . '>');
                }
            } else {
                $this->_stupidSchemaValidate($structure, $this->_packageInfo[$type],
                    '<' . $type . '>');
            }
        }
    }

    function _validatePhpDep($dep, $installcondition = false)
    {
        $structure = array(
            'min',
            '*max',
            '*exclude',
        );
        $type = $installcondition ? '<installcondition><php>' : '<dependencies><required><php>';
        $this->_stupidSchemaValidate($structure, $dep, $type);
        if (isset($dep['min'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?(?:-[a-zA-Z0-9]+)?\\z/',
                  $dep['min'])) {
                $this->_invalidVersion($type . '<min>', $dep['min']);
            }
        }
        if (isset($dep['max'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?(?:-[a-zA-Z0-9]+)?\\z/',
                  $dep['max'])) {
                $this->_invalidVersion($type . '<max>', $dep['max']);
            }
        }
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
            foreach ($dep['exclude'] as $exclude) {
                if (!preg_match(
                     '/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?(?:-[a-zA-Z0-9]+)?\\z/',
                     $exclude)) {
                    $this->_invalidVersion($type . '<exclude>', $exclude);
                }
            }
        }
    }

    function _validatePearinstallerDep($dep)
    {
        $structure = array(
            'min',
            '*max',
            '*recommended',
            '*exclude',
        );
        $this->_stupidSchemaValidate($structure, $dep, '<dependencies><required><pearinstaller>');
        if (isset($dep['min'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['min'])) {
                $this->_invalidVersion('<dependencies><required><pearinstaller><min>',
                    $dep['min']);
            }
        }
        if (isset($dep['max'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['max'])) {
                $this->_invalidVersion('<dependencies><required><pearinstaller><max>',
                    $dep['max']);
            }
        }
        if (isset($dep['recommended'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['recommended'])) {
                $this->_invalidVersion('<dependencies><required><pearinstaller><recommended>',
                    $dep['recommended']);
            }
        }
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
            foreach ($dep['exclude'] as $exclude) {
                if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                      $exclude)) {
                    $this->_invalidVersion('<dependencies><required><pearinstaller><exclude>',
                        $exclude);
                }
            }
        }
    }

    function _validatePackageDep($dep, $group, $type = '<package>')
    {
        if (isset($dep['uri'])) {
            if (isset($dep['conflicts'])) {
                $structure = array(
                    'name',
                    'uri',
                    'conflicts',
                    '*providesextension',
                );
            } else {
                $structure = array(
                    'name',
                    'uri',
                    '*providesextension',
                );
            }
        } else {
            if (isset($dep['conflicts'])) {
                $structure = array(
                    'name',
                    'channel',
                    '*min',
                    '*max',
                    '*exclude',
                    'conflicts',
                    '*providesextension',
                );
            } else {
                $structure = array(
                    'name',
                    'channel',
                    '*min',
                    '*max',
                    '*recommended',
                    '*exclude',
                    '*nodefault',
                    '*providesextension',
                );
            }
        }
        if (isset($dep['name'])) {
            $type .= '<name>' . $dep['name'] . '</name>';
        }
        $this->_stupidSchemaValidate($structure, $dep, '<dependencies>' . $group . $type);
        if (isset($dep['uri']) && (isset($dep['min']) || isset($dep['max']) ||
              isset($dep['recommended']) || isset($dep['exclude']))) {
            $this->_uriDepsCannotHaveVersioning('<dependencies>' . $group . $type);
        }
        if (isset($dep['channel']) && strtolower($dep['channel']) == '__uri') {
            $this->_DepchannelCannotBeUri('<dependencies>' . $group . $type);
        }
        if (isset($dep['min'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['min'])) {
                $this->_invalidVersion('<dependencies>' . $group . $type . '<min>', $dep['min']);
            }
        }
        if (isset($dep['max'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['max'])) {
                $this->_invalidVersion('<dependencies>' . $group . $type . '<max>', $dep['max']);
            }
        }
        if (isset($dep['recommended'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['recommended'])) {
                $this->_invalidVersion('<dependencies>' . $group . $type . '<recommended>',
                    $dep['recommended']);
            }
        }
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
            foreach ($dep['exclude'] as $exclude) {
                if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                      $exclude)) {
                    $this->_invalidVersion('<dependencies>' . $group . $type . '<exclude>',
                        $exclude);
                }
            }
        }
    }

    function _validateSubpackageDep($dep, $group)
    {
        $this->_validatePackageDep($dep, $group, '<subpackage>');
        if (isset($dep['providesextension'])) {
            $this->_subpackageCannotProvideExtension(isset($dep['name']) ? $dep['name'] : '');
        }
        if (isset($dep['conflicts'])) {
            $this->_subpackagesCannotConflict(isset($dep['name']) ? $dep['name'] : '');
        }
    }

    function _validateExtensionDep($dep, $group = false, $installcondition = false)
    {
        if (isset($dep['conflicts'])) {
            $structure = array(
                'name',
                '*min',
                '*max',
                '*exclude',
                'conflicts',
            );
        } else {
            $structure = array(
                'name',
                '*min',
                '*max',
                '*recommended',
                '*exclude',
            );
        }
        if ($installcondition) {
            $type = '<installcondition><extension>';
        } else {
            $type = '<dependencies>' . $group . '<extension>';
        }
        if (isset($dep['name'])) {
            $type .= '<name>' . $dep['name'] . '</name>';
        }
        $this->_stupidSchemaValidate($structure, $dep, $type);
        if (isset($dep['min'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['min'])) {
                $this->_invalidVersion(substr($type, 1) . '<min', $dep['min']);
            }
        }
        if (isset($dep['max'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['max'])) {
                $this->_invalidVersion(substr($type, 1) . '<max', $dep['max']);
            }
        }
        if (isset($dep['recommended'])) {
            if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                  $dep['recommended'])) {
                $this->_invalidVersion(substr($type, 1) . '<recommended', $dep['recommended']);
            }
        }
        if (isset($dep['exclude'])) {
            if (!is_array($dep['exclude'])) {
                $dep['exclude'] = array($dep['exclude']);
            }
            foreach ($dep['exclude'] as $exclude) {
                if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                      $exclude)) {
                    $this->_invalidVersion(substr($type, 1) . '<exclude', $exclude);
                }
            }
        }
    }

    function _validateOsDep($dep, $installcondition = false)
    {
        $structure = array(
            'name',
            '*conflicts',
        );
        $type = $installcondition ? '<installcondition><os>' : '<dependencies><required><os>';
        if ($this->_stupidSchemaValidate($structure, $dep, $type)) {
            if ($dep['name'] == '*') {
                if (array_key_exists('conflicts', $dep)) {
                    $this->_cannotConflictWithAllOs($type);
                }
            }
        }
    }

    function _validateArchDep($dep, $installcondition = false)
    {
        $structure = array(
            'pattern',
            '*conflicts',
        );
        $type = $installcondition ? '<installcondition><arch>' : '<dependencies><required><arch>';
        $this->_stupidSchemaValidate($structure, $dep, $type);
    }

    function _validateInstallConditions($cond, $release)
    {
        $structure = array(
            '*php',
            '*extension',
            '*os',
            '*arch',
        );
        if (!$this->_stupidSchemaValidate($structure,
              $cond, $release)) {
            return false;
        }
        foreach (array('php', 'extension', 'os', 'arch') as $type) {
            if (isset($cond[$type])) {
                $iter = $cond[$type];
                if (!is_array($iter) || !isset($iter[0])) {
                    $iter = array($iter);
                }
                foreach ($iter as $package) {
                    if ($type == 'extension') {
                        $this->{"_validate{$type}Dep"}($package, false, true);
                    } else {
                        $this->{"_validate{$type}Dep"}($package, true);
                    }
                }
            }
        }
    }

    function _validateDependencies()
    {
        $structure = array(
            'required',
            '*optional',
            '*group->name->hint'
        );
        if (!$this->_stupidSchemaValidate($structure,
              $this->_packageInfo['dependencies'], '<dependencies>')) {
            return false;
        }
        foreach (array('required', 'optional') as $simpledep) {
            if (isset($this->_packageInfo['dependencies'][$simpledep])) {
                if ($simpledep == 'optional') {
                    $structure = array(
                        '*package',
                        '*subpackage',
                        '*extension',
                    );
                } else {
                    $structure = array(
                        'php',
                        'pearinstaller',
                        '*package',
                        '*subpackage',
                        '*extension',
                        '*os',
                        '*arch',
                    );
                }
                if ($this->_stupidSchemaValidate($structure,
                      $this->_packageInfo['dependencies'][$simpledep],
                      "<dependencies><$simpledep>")) {
                    foreach (array('package', 'subpackage', 'extension') as $type) {
                        if (isset($this->_packageInfo['dependencies'][$simpledep][$type])) {
                            $iter = $this->_packageInfo['dependencies'][$simpledep][$type];
                            if (!isset($iter[0])) {
                                $iter = array($iter);
                            }
                            foreach ($iter as $package) {
                                if ($type != 'extension') {
                                    if (isset($package['uri'])) {
                                        if (isset($package['channel'])) {
                                            $this->_UrlOrChannel($type,
                                                $package['name']);
                                        }
                                    } else {
                                        if (!isset($package['channel'])) {
                                            $this->_NoChannel($type, $package['name']);
                                        }
                                    }
                                }
                                $this->{"_validate{$type}Dep"}($package, "<$simpledep>");
                            }
                        }
                    }
                    if ($simpledep == 'optional') {
                        continue;
                    }
                    foreach (array('php', 'pearinstaller', 'os', 'arch') as $type) {
                        if (isset($this->_packageInfo['dependencies'][$simpledep][$type])) {
                            $iter = $this->_packageInfo['dependencies'][$simpledep][$type];
                            if (!isset($iter[0])) {
                                $iter = array($iter);
                            }
                            foreach ($iter as $package) {
                                $this->{"_validate{$type}Dep"}($package);
                            }
                        }
                    }
                }
            }
        }
        if (isset($this->_packageInfo['dependencies']['group'])) {
            $groups = $this->_packageInfo['dependencies']['group'];
            if (!isset($groups[0])) {
                $groups = array($groups);
            }
            $structure = array(
                '*package',
                '*subpackage',
                '*extension',
            );
            foreach ($groups as $group) {
                if ($this->_stupidSchemaValidate($structure, $group, '<group>')) {
                    if (!PEAR_Validate::validGroupName($group['attribs']['name'])) {
                        $this->_invalidDepGroupName($group['attribs']['name']);
                    }
                    foreach (array('package', 'subpackage', 'extension') as $type) {
                        if (isset($group[$type])) {
                            $iter = $group[$type];
                            if (!isset($iter[0])) {
                                $iter = array($iter);
                            }
                            foreach ($iter as $package) {
                                if ($type != 'extension') {
                                    if (isset($package['uri'])) {
                                        if (isset($package['channel'])) {
                                            $this->_UrlOrChannelGroup($type,
                                                $package['name'],
                                                $group['name']);
                                        }
                                    } else {
                                        if (!isset($package['channel'])) {
                                            $this->_NoChannelGroup($type,
                                                $package['name'],
                                                $group['name']);
                                        }
                                    }
                                }
                                $this->{"_validate{$type}Dep"}($package, '<group name="' .
                                    $group['attribs']['name'] . '">');
                            }
                        }
                    }
                }
            }
        }
    }

    function _validateCompatible()
    {
        $compat = $this->_packageInfo['compatible'];
        if (!isset($compat[0])) {
            $compat = array($compat);
        }
        $required = array('name', 'channel', 'min', 'max', '*exclude');
        foreach ($compat as $package) {
            $type = '<compatible>';
            if (is_array($package) && array_key_exists('name', $package)) {
                $type .= '<name>' . $package['name'] . '</name>';
            }
            $this->_stupidSchemaValidate($required, $package, $type);
            if (is_array($package) && array_key_exists('min', $package)) {
                if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                      $package['min'])) {
                    $this->_invalidVersion(substr($type, 1) . '<min', $package['min']);
                }
            }
            if (is_array($package) && array_key_exists('max', $package)) {
                if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                      $package['max'])) {
                    $this->_invalidVersion(substr($type, 1) . '<max', $package['max']);
                }
            }
            if (is_array($package) && array_key_exists('exclude', $package)) {
                if (!is_array($package['exclude'])) {
                    $package['exclude'] = array($package['exclude']);
                }
                foreach ($package['exclude'] as $exclude) {
                    if (!preg_match('/^\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?\\z/',
                          $exclude)) {
                        $this->_invalidVersion(substr($type, 1) . '<exclude', $exclude);
                    }
                }
            }
        }
    }

    function _validateBundle($list)
    {
        if (!is_array($list) || !isset($list['bundledpackage'])) {
            return $this->_NoBundledPackages();
        }
        if (!is_array($list['bundledpackage']) || !isset($list['bundledpackage'][0])) {
            return $this->_AtLeast2BundledPackages();
        }
        foreach ($list['bundledpackage'] as $package) {
            if (!is_string($package)) {
                $this->_bundledPackagesMustBeFilename();
            }
        }
    }

    function _validateFilelist($list = false, $allowignore = false, $dirs = '')
    {
        $iscontents = false;
        if (!$list) {
            $iscontents = true;
            $list = $this->_packageInfo['contents'];
            if (isset($this->_packageInfo['bundle'])) {
                return $this->_validateBundle($list);
            }
        }
        if ($allowignore) {
            $struc = array(
                '*install->name->as',
                '*ignore->name'
            );
        } else {
            $struc = array(
                '*dir->name->?baseinstalldir',
                '*file->name->role->?baseinstalldir->?md5sum'
            );
            if (isset($list['dir']) && isset($list['file'])) {
                // stave off validation errors without requiring a set order.
                $_old = $list;
                if (isset($list['attribs'])) {
                    $list = array('attribs' => $_old['attribs']);
                }
                $list['dir'] = $_old['dir'];
                $list['file'] = $_old['file'];
            }
        }
        if (!isset($list['attribs']) || !isset($list['attribs']['name'])) {
            $unknown = $allowignore ? '<filelist>' : '<dir name="*unknown*">';
            $dirname = $iscontents ? '<contents>' : $unknown;
        } else {
            $dirname = '<dir name="' . $list['attribs']['name'] . '">';
            if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~',
                          str_replace('\\', '/', $list['attribs']['name']))) {
                // file contains .. parent directory or . cur directory
                $this->_invalidDirName($list['attribs']['name']);
            }
        }
        $res = $this->_stupidSchemaValidate($struc, $list, $dirname);
        if ($allowignore && $res) {
            $ignored_or_installed = array();
            $this->_pf->getFilelist();
            $fcontents = $this->_pf->getContents();
            $filelist = array();
            if (!isset($fcontents['dir']['file'][0])) {
                $fcontents['dir']['file'] = array($fcontents['dir']['file']);
            }
            foreach ($fcontents['dir']['file'] as $file) {
                $filelist[$file['attribs']['name']] = true;
            }
            if (isset($list['install'])) {
                if (!isset($list['install'][0])) {
                    $list['install'] = array($list['install']);
                }
                foreach ($list['install'] as $file) {
                    if (!isset($filelist[$file['attribs']['name']])) {
                        $this->_notInContents($file['attribs']['name'], 'install');
                        continue;
                    }
                    if (array_key_exists($file['attribs']['name'], $ignored_or_installed)) {
                        $this->_multipleInstallAs($file['attribs']['name']);
                    }
                    if (!isset($ignored_or_installed[$file['attribs']['name']])) {
                        $ignored_or_installed[$file['attribs']['name']] = array();
                    }
                    $ignored_or_installed[$file['attribs']['name']][] = 1;
                    if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~',
                                  str_replace('\\', '/', $file['attribs']['as']))) {
                        // file contains .. parent directory or . cur directory references
                        $this->_invalidFileInstallAs($file['attribs']['name'],
                            $file['attribs']['as']);
                    }
                }
            }
            if (isset($list['ignore'])) {
                if (!isset($list['ignore'][0])) {
                    $list['ignore'] = array($list['ignore']);
                }
                foreach ($list['ignore'] as $file) {
                    if (!isset($filelist[$file['attribs']['name']])) {
                        $this->_notInContents($file['attribs']['name'], 'ignore');
                        continue;
                    }
                    if (array_key_exists($file['attribs']['name'], $ignored_or_installed)) {
                        $this->_ignoreAndInstallAs($file['attribs']['name']);
                    }
                }
            }
        }
        if (!$allowignore && isset($list['file'])) {
            if (is_string($list['file'])) {
                $this->_oldStyleFileNotAllowed();
                return false;
            }
            if (!isset($list['file'][0])) {
                // single file
                $list['file'] = array($list['file']);
            }
            foreach ($list['file'] as $i => $file)
            {
                if (isset($file['attribs']) && isset($file['attribs']['name'])) {
                    if ($file['attribs']['name'][0] == '.' &&
                          $file['attribs']['name'][1] == '/') {
                        // name is something like "./doc/whatever.txt"
                        $this->_invalidFileName($file['attribs']['name'], $dirname);
                    }
                    if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~',
                                  str_replace('\\', '/', $file['attribs']['name']))) {
                        // file contains .. parent directory or . cur directory
                        $this->_invalidFileName($file['attribs']['name'], $dirname);
                    }
                }
                if (isset($file['attribs']) && isset($file['attribs']['role'])) {
                    if (!$this->_validateRole($file['attribs']['role'])) {
                        if (isset($this->_packageInfo['usesrole'])) {
                            $roles = $this->_packageInfo['usesrole'];
                            if (!isset($roles[0])) {
                                $roles = array($roles);
                            }
                            foreach ($roles as $role) {
                                if ($role['role'] = $file['attribs']['role']) {
                                    $msg = 'This package contains role "%role%" and requires ' .
                                        'package "%package%" to be used';
                                    if (isset($role['uri'])) {
                                        $params = array('role' => $role['role'],
                                            'package' => $role['uri']);
                                    } else {
                                        $params = array('role' => $role['role'],
                                            'package' => $this->_pf->_registry->
                                            parsedPackageNameToString(array('package' =>
                                                $role['package'], 'channel' => $role['channel']),
                                                true));
                                    }
                                    $this->_stack->push('_mustInstallRole', 'error', $params, $msg);
                                }
                            }
                        }
                        $this->_invalidFileRole($file['attribs']['name'],
                            $dirname, $file['attribs']['role']);
                    }
                }
                if (!isset($file['attribs'])) {
                    continue;
                }
                $save = $file['attribs'];
                if ($dirs) {
                    $save['name'] = $dirs . '/' . $save['name'];
                }
                unset($file['attribs']);
                if (count($file) && $this->_curState != PEAR_VALIDATE_DOWNLOADING) { // has tasks
                    foreach ($file as $task => $value) {
                        if ($tagClass = $this->_pf->getTask($task)) {
                            if (!is_array($value) || !isset($value[0])) {
                                $value = array($value);
                            }
                            foreach ($value as $v) {
                                $ret = call_user_func(array($tagClass, 'validateXml'),
                                    $this->_pf, $v, $this->_pf->_config, $save);
                                if (is_array($ret)) {
                                    $this->_invalidTask($task, $ret, isset($save['name']) ?
                                        $save['name'] : '');
                                }
                            }
                        } else {
                            if (isset($this->_packageInfo['usestask'])) {
                                $roles = $this->_packageInfo['usestask'];
                                if (!isset($roles[0])) {
                                    $roles = array($roles);
                                }
                                foreach ($roles as $role) {
                                    if ($role['task'] = $task) {
                                        $msg = 'This package contains task "%task%" and requires ' .
                                            'package "%package%" to be used';
                                        if (isset($role['uri'])) {
                                            $params = array('task' => $role['task'],
                                                'package' => $role['uri']);
                                        } else {
                                            $params = array('task' => $role['task'],
                                                'package' => $this->_pf->_registry->
                                                parsedPackageNameToString(array('package' =>
                                                    $role['package'], 'channel' => $role['channel']),
                                                    true));
                                        }
                                        $this->_stack->push('_mustInstallTask', 'error',
                                            $params, $msg);
                                    }
                                }
                            }
                            $this->_unknownTask($task, $save['name']);
                        }
                    }
                }
            }
        }
        if (isset($list['ignore'])) {
            if (!$allowignore) {
                $this->_ignoreNotAllowed('ignore');
            }
        }
        if (isset($list['install'])) {
            if (!$allowignore) {
                $this->_ignoreNotAllowed('install');
            }
        }
        if (isset($list['file'])) {
            if ($allowignore) {
                $this->_fileNotAllowed('file');
            }
        }
        if (isset($list['dir'])) {
            if ($allowignore) {
                $this->_fileNotAllowed('dir');
            } else {
                if (!isset($list['dir'][0])) {
                    $list['dir'] = array($list['dir']);
                }
                foreach ($list['dir'] as $dir) {
                    if (isset($dir['attribs']) && isset($dir['attribs']['name'])) {
                        if ($dir['attribs']['name'] == '/' ||
                              !isset($this->_packageInfo['contents']['dir']['dir'])) {
                            // always use nothing if the filelist has already been flattened
                            $newdirs = '';
                        } elseif ($dirs == '') {
                            $newdirs = $dir['attribs']['name'];
                        } else {
                            $newdirs = $dirs . '/' . $dir['attribs']['name'];
                        }
                    } else {
                        $newdirs = $dirs;
                    }
                    $this->_validateFilelist($dir, $allowignore, $newdirs);
                }
            }
        }
    }

    function _validateRelease()
    {
        if (isset($this->_packageInfo['phprelease'])) {
            $release = 'phprelease';
            if (isset($this->_packageInfo['providesextension'])) {
                $this->_cannotProvideExtension($release);
            }
            if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) {
                $this->_cannotHaveSrcpackage($release);
            }
            $releases = $this->_packageInfo['phprelease'];
            if (!is_array($releases)) {
                return true;
            }
            if (!isset($releases[0])) {
                $releases = array($releases);
            }
            foreach ($releases as $rel) {
                $this->_stupidSchemaValidate(array(
                    '*installconditions',
                    '*filelist',
                ), $rel, '<phprelease>');
            }
        }
        foreach (array('', 'zend') as $prefix) {
            $releasetype = $prefix . 'extsrcrelease';
            if (isset($this->_packageInfo[$releasetype])) {
                $release = $releasetype;
                if (!isset($this->_packageInfo['providesextension'])) {
                    $this->_mustProvideExtension($release);
                }
                if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) {
                    $this->_cannotHaveSrcpackage($release);
                }
                $releases = $this->_packageInfo[$releasetype];
                if (!is_array($releases)) {
                    return true;
                }
                if (!isset($releases[0])) {
                    $releases = array($releases);
                }
                foreach ($releases as $rel) {
                    $this->_stupidSchemaValidate(array(
                        '*installconditions',
                        '*configureoption->name->prompt->?default',
                        '*binarypackage',
                        '*filelist',
                    ), $rel, '<' . $releasetype . '>');
                    if (isset($rel['binarypackage'])) {
                        if (!is_array($rel['binarypackage']) || !isset($rel['binarypackage'][0])) {
                            $rel['binarypackage'] = array($rel['binarypackage']);
                        }
                        foreach ($rel['binarypackage'] as $bin) {
                            if (!is_string($bin)) {
                                $this->_binaryPackageMustBePackagename();
                            }
                        }
                    }
                }
            }
            $releasetype = 'extbinrelease';
            if (isset($this->_packageInfo[$releasetype])) {
                $release = $releasetype;
                if (!isset($this->_packageInfo['providesextension'])) {
                    $this->_mustProvideExtension($release);
                }
                if (isset($this->_packageInfo['channel']) &&
                      !isset($this->_packageInfo['srcpackage'])) {
                    $this->_mustSrcPackage($release);
                }
                if (isset($this->_packageInfo['uri']) && !isset($this->_packageInfo['srcuri'])) {
                    $this->_mustSrcuri($release);
                }
                $releases = $this->_packageInfo[$releasetype];
                if (!is_array($releases)) {
                    return true;
                }
                if (!isset($releases[0])) {
                    $releases = array($releases);
                }
                foreach ($releases as $rel) {
                    $this->_stupidSchemaValidate(array(
                        '*installconditions',
                        '*filelist',
                    ), $rel, '<' . $releasetype . '>');
                }
            }
        }
        if (isset($this->_packageInfo['bundle'])) {
            $release = 'bundle';
            if (isset($this->_packageInfo['providesextension'])) {
                $this->_cannotProvideExtension($release);
            }
            if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) {
                $this->_cannotHaveSrcpackage($release);
            }
            $releases = $this->_packageInfo['bundle'];
            if (!is_array($releases) || !isset($releases[0])) {
                $releases = array($releases);
            }
            foreach ($releases as $rel) {
                $this->_stupidSchemaValidate(array(
                    '*installconditions',
                    '*filelist',
                ), $rel, '<bundle>');
            }
        }
        foreach ($releases as $rel) {
            if (is_array($rel) && array_key_exists('installconditions', $rel)) {
                $this->_validateInstallConditions($rel['installconditions'],
                    "<$release><installconditions>");
            }
            if (is_array($rel) && array_key_exists('filelist', $rel)) {
                if ($rel['filelist']) {

                    $this->_validateFilelist($rel['filelist'], true);
                }
            }
        }
    }

    /**
     * This is here to allow role extension through plugins
     * @param string
     */
    function _validateRole($role)
    {
        return in_array($role, PEAR_Installer_Role::getValidRoles($this->_pf->getPackageType()));
    }

    function _pearVersionTooLow($version)
    {
        $this->_stack->push(__FUNCTION__, 'error',
            array('version' => $version),
            'This package.xml requires PEAR version %version% to parse properly, we are ' .
            'version 1.10.16');
    }

    function _invalidTagOrder($oktags, $actual, $root)
    {
        $this->_stack->push(__FUNCTION__, 'error',
            array('oktags' => $oktags, 'actual' => $actual, 'root' => $root),
            'Invalid tag order in %root%, found <%actual%> expected one of "%oktags%"');
    }

    function _ignoreNotAllowed($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type),
            '<%type%> is not allowed inside global <contents>, only inside ' .
            '<phprelease>/<extbinrelease>/<zendextbinrelease>, use <dir> and <file> only');
    }

    function _fileNotAllowed($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type),
            '<%type%> is not allowed inside release <filelist>, only inside ' .
            '<contents>, use <ignore> and <install> only');
    }

    function _oldStyleFileNotAllowed()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'Old-style <file>name</file> is not allowed.  Use' .
            '<file name="name" role="role"/>');
    }

    function _tagMissingAttribute($tag, $attr, $context)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag,
            'attribute' => $attr, 'context' => $context),
            'tag <%tag%> in context "%context%" has no attribute "%attribute%"');
    }

    function _tagHasNoAttribs($tag, $context)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag,
            'context' => $context),
            'tag <%tag%> has no attributes in context "%context%"');
    }

    function _invalidInternalStructure()
    {
        $this->_stack->push(__FUNCTION__, 'exception', array(),
            'internal array was not generated by compatible parser, or extreme parser error, cannot continue');
    }

    function _invalidFileRole($file, $dir, $role)
    {
        $this->_stack->push(__FUNCTION__, 'error', array(
            'file' => $file, 'dir' => $dir, 'role' => $role,
            'roles' => PEAR_Installer_Role::getValidRoles($this->_pf->getPackageType())),
            'File "%file%" in directory "%dir%" has invalid role "%role%", should be one of %roles%');
    }

    function _invalidFileName($file, $dir)
    {
        $this->_stack->push(__FUNCTION__, 'error', array(
            'file' => $file),
            'File "%file%" in directory "%dir%" cannot begin with "./" or contain ".."');
    }

    function _invalidFileInstallAs($file, $as)
    {
        $this->_stack->push(__FUNCTION__, 'error', array(
            'file' => $file, 'as' => $as),
            'File "%file%" <install as="%as%"/> cannot contain "./" or contain ".."');
    }

    function _invalidDirName($dir)
    {
        $this->_stack->push(__FUNCTION__, 'error', array(
            'dir' => $file),
            'Directory "%dir%" cannot begin with "./" or contain ".."');
    }

    function _filelistCannotContainFile($filelist)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $filelist),
            '<%tag%> can only contain <dir>, contains <file>.  Use ' .
            '<dir name="/"> as the first dir element');
    }

    function _filelistMustContainDir($filelist)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $filelist),
            '<%tag%> must contain <dir>.  Use <dir name="/"> as the ' .
            'first dir element');
    }

    function _tagCannotBeEmpty($tag)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag),
            '<%tag%> cannot be empty (<%tag%/>)');
    }

    function _UrlOrChannel($type, $name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type,
            'name' => $name),
            'Required dependency <%type%> "%name%" can have either url OR ' .
            'channel attributes, and not both');
    }

    function _NoChannel($type, $name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type,
            'name' => $name),
            'Required dependency <%type%> "%name%" must have either url OR ' .
            'channel attributes');
    }

    function _UrlOrChannelGroup($type, $name, $group)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type,
            'name' => $name, 'group' => $group),
            'Group "%group%" dependency <%type%> "%name%" can have either url OR ' .
            'channel attributes, and not both');
    }

    function _NoChannelGroup($type, $name, $group)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type,
            'name' => $name, 'group' => $group),
            'Group "%group%" dependency <%type%> "%name%" must have either url OR ' .
            'channel attributes');
    }

    function _unknownChannel($channel)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('channel' => $channel),
            'Unknown channel "%channel%"');
    }

    function _noPackageVersion()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'package.xml <package> tag has no version attribute, or version is not 2.0');
    }

    function _NoBundledPackages()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'No <bundledpackage> tag was found in <contents>, required for bundle packages');
    }

    function _AtLeast2BundledPackages()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'At least 2 packages must be bundled in a bundle package');
    }

    function _ChannelOrUri($name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('name' => $name),
            'Bundled package "%name%" can have either a uri or a channel, not both');
    }

    function _noChildTag($child, $tag)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('child' => $child, 'tag' => $tag),
            'Tag <%tag%> is missing child tag <%child%>');
    }

    function _invalidVersion($type, $value)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type, 'value' => $value),
            'Version type <%type%> is not a valid version (%value%)');
    }

    function _invalidState($type, $value)
    {
        $states = array('stable', 'beta', 'alpha', 'devel');
        if ($type != 'api') {
            $states[] = 'snapshot';
        }
        if (strtolower($value) == 'rc') {
            $this->_stack->push(__FUNCTION__, 'error',
                array('version' => $this->_packageInfo['version']['release']),
                'RC is not a state, it is a version postfix, try %version%RC1, stability beta');
        }
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type, 'value' => $value,
            'types' => $states),
            'Stability type <%type%> is not a valid stability (%value%), must be one of ' .
            '%types%');
    }

    function _invalidTask($task, $ret, $file)
    {
        switch ($ret[0]) {
            case PEAR_TASK_ERROR_MISSING_ATTRIB :
                $info = array('attrib' => $ret[1], 'task' => $task, 'file' => $file);
                $msg = 'task <%task%> is missing attribute "%attrib%" in file %file%';
            break;
            case PEAR_TASK_ERROR_NOATTRIBS :
                $info = array('task' => $task, 'file' => $file);
                $msg = 'task <%task%> has no attributes in file %file%';
            break;
            case PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE :
                $info = array('attrib' => $ret[1], 'values' => $ret[3],
                    'was' => $ret[2], 'task' => $task, 'file' => $file);
                $msg = 'task <%task%> attribute "%attrib%" has the wrong value "%was%" '.
                    'in file %file%, expecting one of "%values%"';
            break;
            case PEAR_TASK_ERROR_INVALID :
                $info = array('reason' => $ret[1], 'task' => $task, 'file' => $file);
                $msg = 'task <%task%> in file %file% is invalid because of "%reason%"';
            break;
        }
        $this->_stack->push(__FUNCTION__, 'error', $info, $msg);
    }

    function _unknownTask($task, $file)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('task' => $task, 'file' => $file),
            'Unknown task "%task%" passed in file <file name="%file%">');
    }

    function _subpackageCannotProvideExtension($name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('name' => $name),
            'Subpackage dependency "%name%" cannot use <providesextension>, ' .
            'only package dependencies can use this tag');
    }

    function _subpackagesCannotConflict($name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('name' => $name),
            'Subpackage dependency "%name%" cannot use <conflicts/>, ' .
            'only package dependencies can use this tag');
    }

    function _cannotProvideExtension($release)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('release' => $release),
            '<%release%> packages cannot use <providesextension>, only extbinrelease, extsrcrelease, zendextsrcrelease, and zendextbinrelease can provide a PHP extension');
    }

    function _mustProvideExtension($release)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('release' => $release),
            '<%release%> packages must use <providesextension> to indicate which PHP extension is provided');
    }

    function _cannotHaveSrcpackage($release)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('release' => $release),
            '<%release%> packages cannot specify a source code package, only extension binaries may use the <srcpackage> tag');
    }

    function _mustSrcPackage($release)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('release' => $release),
            '<extbinrelease>/<zendextbinrelease> packages must specify a source code package with <srcpackage>');
    }

    function _mustSrcuri($release)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('release' => $release),
            '<extbinrelease>/<zendextbinrelease> packages must specify a source code package with <srcuri>');
    }

    function _uriDepsCannotHaveVersioning($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type),
            '%type%: dependencies with a <uri> tag cannot have any versioning information');
    }

    function _conflictingDepsCannotHaveVersioning($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type),
            '%type%: conflicting dependencies cannot have versioning info, use <exclude> to ' .
            'exclude specific versions of a dependency');
    }

    function _DepchannelCannotBeUri($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('type' => $type),
            '%type%: channel cannot be __uri, this is a pseudo-channel reserved for uri ' .
            'dependencies only');
    }

    function _bundledPackagesMustBeFilename()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            '<bundledpackage> tags must contain only the filename of a package release ' .
            'in the bundle');
    }

    function _binaryPackageMustBePackagename()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            '<binarypackage> tags must contain the name of a package that is ' .
            'a compiled version of this extsrc/zendextsrc package');
    }

    function _fileNotFound($file)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
            'File "%file%" in package.xml does not exist');
    }

    function _notInContents($file, $tag)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('file' => $file, 'tag' => $tag),
            '<%tag% name="%file%"> is invalid, file is not in <contents>');
    }

    function _cannotValidateNoPathSet()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'Cannot validate files, no path to package file is set (use setPackageFile())');
    }

    function _usesroletaskMustHaveChannelOrUri($role, $tag)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('role' => $role, 'tag' => $tag),
            '<%tag%> for role "%role%" must contain either <uri>, or <channel> and <package>');
    }

    function _usesroletaskMustHavePackage($role, $tag)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('role' => $role, 'tag' => $tag),
            '<%tag%> for role "%role%" must contain <package>');
    }

    function _usesroletaskMustHaveRoleTask($tag, $type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag, 'type' => $type),
            '<%tag%> must contain <%type%> defining the %type% to be used');
    }

    function _cannotConflictWithAllOs($type)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('tag' => $tag),
            '%tag% cannot conflict with all OSes');
    }

    function _invalidDepGroupName($name)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('name' => $name),
            'Invalid dependency group name "%name%"');
    }

    function _multipleToplevelDirNotAllowed()
    {
        $this->_stack->push(__FUNCTION__, 'error', array(),
            'Multiple top-level <dir> tags are not allowed.  Enclose them ' .
                'in a <dir name="/">');
    }

    function _multipleInstallAs($file)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
            'Only one <install> tag is allowed for file "%file%"');
    }

    function _ignoreAndInstallAs($file)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
            'Cannot have both <ignore> and <install> tags for file "%file%"');
    }

    function _analyzeBundledPackages()
    {
        if (!$this->_isValid) {
            return false;
        }
        if (!$this->_pf->getPackageType() == 'bundle') {
            return false;
        }
        if (!isset($this->_pf->_packageFile)) {
            return false;
        }
        $dir_prefix = dirname($this->_pf->_packageFile);
        $common = new PEAR_Common;
        $log = isset($this->_pf->_logger) ? array(&$this->_pf->_logger, 'log') :
            array($common, 'log');
        $info = $this->_pf->getContents();
        $info = $info['bundledpackage'];
        if (!is_array($info)) {
            $info = array($info);
        }
        $pkg = new PEAR_PackageFile($this->_pf->_config);
        foreach ($info as $package) {
            if (!file_exists($dir_prefix . DIRECTORY_SEPARATOR . $package)) {
                $this->_fileNotFound($dir_prefix . DIRECTORY_SEPARATOR . $package);
                $this->_isValid = 0;
                continue;
            }
            call_user_func_array($log, array(1, "Analyzing bundled package $package"));
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $ret = $pkg->fromAnyFile($dir_prefix . DIRECTORY_SEPARATOR . $package,
                PEAR_VALIDATE_NORMAL);
            PEAR::popErrorHandling();
            if (PEAR::isError($ret)) {
                call_user_func_array($log, array(0, "ERROR: package $package is not a valid " .
                    'package'));
                $inf = $ret->getUserInfo();
                if (is_array($inf)) {
                    foreach ($inf as $err) {
                        call_user_func_array($log, array(1, $err['message']));
                    }
                }
                return false;
            }
        }
        return true;
    }

    function _analyzePhpFiles()
    {
        if (!$this->_isValid) {
            return false;
        }
        if (!isset($this->_pf->_packageFile)) {
            $this->_cannotValidateNoPathSet();
            return false;
        }
        $dir_prefix = dirname($this->_pf->_packageFile);
        $common = new PEAR_Common;
        $log = isset($this->_pf->_logger) ? array(&$this->_pf->_logger, 'log') :
            array(&$common, 'log');
        $info = $this->_pf->getContents();
        if (!$info || !isset($info['dir']['file'])) {
            $this->_tagCannotBeEmpty('contents><dir');
            return false;
        }
        $info = $info['dir']['file'];
        if (isset($info['attribs'])) {
            $info = array($info);
        }
        $provides = array();
        foreach ($info as $fa) {
            $fa = $fa['attribs'];
            $file = $fa['name'];
            if (!file_exists($dir_prefix . DIRECTORY_SEPARATOR . $file)) {
                $this->_fileNotFound($dir_prefix . DIRECTORY_SEPARATOR . $file);
                $this->_isValid = 0;
                continue;
            }
            if (in_array($fa['role'], PEAR_Installer_Role::getPhpRoles()) && $dir_prefix) {
                call_user_func_array($log, array(1, "Analyzing $file"));
                $srcinfo = $this->analyzeSourceCode($dir_prefix . DIRECTORY_SEPARATOR . $file);
                if ($srcinfo) {
                    $provides = array_merge($provides, $this->_buildProvidesArray($srcinfo));
                }
            }
        }
        $this->_packageName = $pn = $this->_pf->getPackage();
        $pnl = strlen($pn);
        foreach ($provides as $key => $what) {
            if (isset($what['explicit']) || !$what) {
                // skip conformance checks if the provides entry is
                // specified in the package.xml file
                continue;
            }
            extract($what);
            if ($type == 'class') {
                if (!strncasecmp($name, $pn, $pnl)) {
                    continue;
                }
                $this->_stack->push(__FUNCTION__, 'warning',
                    array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn),
                    'in %file%: %type% "%name%" not prefixed with package name "%package%"');
            } elseif ($type == 'function') {
                if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) {
                    continue;
                }
                $this->_stack->push(__FUNCTION__, 'warning',
                    array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn),
                    'in %file%: %type% "%name%" not prefixed with package name "%package%"');
            }
        }
        return $this->_isValid;
    }

    /**
     * Analyze the source code of the given PHP file
     *
     * @param  string Filename of the PHP file
     * @param  boolean whether to analyze $file as the file contents
     * @return mixed
     */
    function analyzeSourceCode($file, $string = false)
    {
        if (!function_exists("token_get_all")) {
            $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
                'Parser error: token_get_all() function must exist to analyze source code, PHP may have been compiled with --disable-tokenizer');
            return false;
        }

        if (!defined('T_DOC_COMMENT')) {
            define('T_DOC_COMMENT', T_COMMENT);
        }

        if (!defined('T_INTERFACE')) {
            define('T_INTERFACE', -1);
        }

        if (!defined('T_IMPLEMENTS')) {
            define('T_IMPLEMENTS', -1);
        }

        if ($string) {
            $contents = $file;
        } else {
            if (!$fp = @fopen($file, "r")) {
                return false;
            }
            fclose($fp);
            $contents = file_get_contents($file);
        }

        // Silence this function so we can catch PHP Warnings and show our own custom message
        $tokens = @token_get_all($contents);
        if (isset($php_errormsg)) {
            if (isset($this->_stack)) {
                $pn = $this->_pf->getPackage();
                $this->_stack->push(__FUNCTION__, 'warning',
                        array('file' => $file, 'package' => $pn),
                        'in %file%: Could not process file for unknown reasons,' .
                        ' possibly a PHP parse error in %file% from %package%');
            }
        }
/*
        for ($i = 0; $i < sizeof($tokens); $i++) {
            @list($token, $data) = $tokens[$i];
            if (is_string($token)) {
                var_dump($token);
            } else {
                print token_name($token) . ' ';
                var_dump(rtrim($data));
            }
        }
*/
        $look_for = 0;
        $paren_level = 0;
        $bracket_level = 0;
        $brace_level = 0;
        $lastphpdoc = '';
        $current_class = '';
        $current_interface = '';
        $current_class_level = -1;
        $current_function = '';
        $current_function_level = -1;
        $declared_classes = array();
        $declared_interfaces = array();
        $declared_functions = array();
        $declared_methods = array();
        $used_classes = array();
        $used_functions = array();
        $extends = array();
        $implements = array();
        $nodeps = array();
        $inquote = false;
        $interface = false;
        for ($i = 0; $i < sizeof($tokens); $i++) {
            if (is_array($tokens[$i])) {
                list($token, $data) = $tokens[$i];
            } else {
                $token = $tokens[$i];
                $data = '';
            }

            if ($inquote) {
                if ($token != '"' && $token != T_END_HEREDOC) {
                    continue;
                } else {
                    $inquote = false;
                    continue;
                }
            }

            switch ($token) {
                case T_WHITESPACE :
                    continue 2;
                case ';':
                    if ($interface) {
                        $current_function = '';
                        $current_function_level = -1;
                    }
                    break;
                case '"':
                case T_START_HEREDOC:
                    $inquote = true;
                    break;
                case T_CURLY_OPEN:
                case T_DOLLAR_OPEN_CURLY_BRACES:
                case '{': $brace_level++; continue 2;
                case '}':
                    $brace_level--;
                    if ($current_class_level == $brace_level) {
                        $current_class = '';
                        $current_class_level = -1;
                    }
                    if ($current_function_level == $brace_level) {
                        $current_function = '';
                        $current_function_level = -1;
                    }
                    continue 2;
                case '[': $bracket_level++; continue 2;
                case ']': $bracket_level--; continue 2;
                case '(': $paren_level++;   continue 2;
                case ')': $paren_level--;   continue 2;
                case T_INTERFACE:
                    $interface = true;
                case T_CLASS:
                    if (($current_class_level != -1) || ($current_function_level != -1)) {
                        if (isset($this->_stack)) {
                            $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
                            'Parser error: invalid PHP found in file "%file%"');
                        } else {
                            PEAR::raiseError("Parser error: invalid PHP found in file \"$file\"",
                                PEAR_COMMON_ERROR_INVALIDPHP);
                        }

                        return false;
                    }
                case T_FUNCTION:
                case T_NEW:
                case T_EXTENDS:
                case T_IMPLEMENTS:
                    $look_for = $token;
                    continue 2;
                case T_STRING:
                    if ($look_for == T_CLASS) {
                        $current_class = $data;
                        $current_class_level = $brace_level;
                        $declared_classes[] = $current_class;
                    } elseif ($look_for == T_INTERFACE) {
                        $current_interface = $data;
                        $current_class_level = $brace_level;
                        $declared_interfaces[] = $current_interface;
                    } elseif ($look_for == T_IMPLEMENTS) {
                        $implements[$current_class] = $data;
                    } elseif ($look_for == T_EXTENDS) {
                        $extends[$current_class] = $data;
                    } elseif ($look_for == T_FUNCTION) {
                        if ($current_class) {
                            $current_function = "$current_class::$data";
                            $declared_methods[$current_class][] = $data;
                        } elseif ($current_interface) {
                            $current_function = "$current_interface::$data";
                            $declared_methods[$current_interface][] = $data;
                        } else {
                            $current_function = $data;
                            $declared_functions[] = $current_function;
                        }

                        $current_function_level = $brace_level;
                        $m = array();
                    } elseif ($look_for == T_NEW) {
                        $used_classes[$data] = true;
                    }

                    $look_for = 0;
                    continue 2;
                case T_VARIABLE:
                    $look_for = 0;
                    continue 2;
                case T_DOC_COMMENT:
                case T_COMMENT:
                    if (preg_match('!^/\*\*\s!', $data)) {
                        $lastphpdoc = $data;
                        if (preg_match_all('/@nodep\s+(\S+)/', $lastphpdoc, $m)) {
                            $nodeps = array_merge($nodeps, $m[1]);
                        }
                    }
                    continue 2;
                case T_DOUBLE_COLON:
                    $token = $tokens[$i - 1][0];
                    if (!($token == T_WHITESPACE || $token == T_STRING || $token == T_STATIC || $token == T_VARIABLE)) {
                        if (isset($this->_stack)) {
                            $this->_stack->push(__FUNCTION__, 'warning', array('file' => $file),
                                'Parser error: invalid PHP found in file "%file%"');
                        } else {
                            PEAR::raiseError("Parser error: invalid PHP found in file \"$file\"",
                                PEAR_COMMON_ERROR_INVALIDPHP);
                        }

                        return false;
                    }

                    $class = $tokens[$i - 1][1];
                    if (strtolower($class) != 'parent') {
                        $used_classes[$class] = true;
                    }

                    continue 2;
            }
        }

        return array(
            "source_file" => $file,
            "declared_classes" => $declared_classes,
            "declared_interfaces" => $declared_interfaces,
            "declared_methods" => $declared_methods,
            "declared_functions" => $declared_functions,
            "used_classes" => array_diff(array_keys($used_classes), $nodeps),
            "inheritance" => $extends,
            "implements" => $implements,
        );
    }

    /**
     * Build a "provides" array from data returned by
     * analyzeSourceCode().  The format of the built array is like
     * this:
     *
     *  array(
     *    'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'),
     *    ...
     *  )
     *
     *
     * @param array $srcinfo array with information about a source file
     * as returned by the analyzeSourceCode() method.
     *
     * @return void
     *
     * @access private
     *
     */
    function _buildProvidesArray($srcinfo)
    {
        if (!$this->_isValid) {
            return array();
        }

        $providesret = array();
        $file        = basename($srcinfo['source_file']);
        $pn          = isset($this->_pf) ? $this->_pf->getPackage() : '';
        $pnl         = strlen($pn);
        foreach ($srcinfo['declared_classes'] as $class) {
            $key = "class;$class";
            if (isset($providesret[$key])) {
                continue;
            }

            $providesret[$key] =
                array('file'=> $file, 'type' => 'class', 'name' => $class);
            if (isset($srcinfo['inheritance'][$class])) {
                $providesret[$key]['extends'] =
                    $srcinfo['inheritance'][$class];
            }
        }

        foreach ($srcinfo['declared_methods'] as $class => $methods) {
            foreach ($methods as $method) {
                $function = "$class::$method";
                $key = "function;$function";
                if ($method[0] == '_' || !strcasecmp($method, $class) ||
                    isset($providesret[$key])) {
                    continue;
                }

                $providesret[$key] =
                    array('file'=> $file, 'type' => 'function', 'name' => $function);
            }
        }

        foreach ($srcinfo['declared_functions'] as $function) {
            $key = "function;$function";
            if ($function[0] == '_' || isset($providesret[$key])) {
                continue;
            }

            if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) {
                $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\"";
            }

            $providesret[$key] =
                array('file'=> $file, 'type' => 'function', 'name' => $function);
        }

        return $providesret;
    }
}
PK�a�\�5������pear/PEAR/PackageFile/v1.phpnu�[���<?php
/**
 * PEAR_PackageFile_v1, package.xml version 1.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * For error handling
 */
require_once 'PEAR/ErrorStack.php';

/**
 * Error code if parsing is attempted with no xml extension
 */
define('PEAR_PACKAGEFILE_ERROR_NO_XML_EXT', 3);

/**
 * Error code if creating the xml parser resource fails
 */
define('PEAR_PACKAGEFILE_ERROR_CANT_MAKE_PARSER', 4);

/**
 * Error code used for all sax xml parsing errors
 */
define('PEAR_PACKAGEFILE_ERROR_PARSER_ERROR', 5);

/**
 * Error code used when there is no name
 */
define('PEAR_PACKAGEFILE_ERROR_NO_NAME', 6);

/**
 * Error code when a package name is not valid
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_NAME', 7);

/**
 * Error code used when no summary is parsed
 */
define('PEAR_PACKAGEFILE_ERROR_NO_SUMMARY', 8);

/**
 * Error code for summaries that are more than 1 line
 */
define('PEAR_PACKAGEFILE_ERROR_MULTILINE_SUMMARY', 9);

/**
 * Error code used when no description is present
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DESCRIPTION', 10);

/**
 * Error code used when no license is present
 */
define('PEAR_PACKAGEFILE_ERROR_NO_LICENSE', 11);

/**
 * Error code used when a <version> version number is not present
 */
define('PEAR_PACKAGEFILE_ERROR_NO_VERSION', 12);

/**
 * Error code used when a <version> version number is invalid
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_VERSION', 13);

/**
 * Error code when release state is missing
 */
define('PEAR_PACKAGEFILE_ERROR_NO_STATE', 14);

/**
 * Error code when release state is invalid
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_STATE', 15);

/**
 * Error code when release state is missing
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DATE', 16);

/**
 * Error code when release state is invalid
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_DATE', 17);

/**
 * Error code when no release notes are found
 */
define('PEAR_PACKAGEFILE_ERROR_NO_NOTES', 18);

/**
 * Error code when no maintainers are found
 */
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTAINERS', 19);

/**
 * Error code when a maintainer has no handle
 */
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTHANDLE', 20);

/**
 * Error code when a maintainer has no handle
 */
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTROLE', 21);

/**
 * Error code when a maintainer has no name
 */
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTNAME', 22);

/**
 * Error code when a maintainer has no email
 */
define('PEAR_PACKAGEFILE_ERROR_NO_MAINTEMAIL', 23);

/**
 * Error code when a maintainer has no handle
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_MAINTROLE', 24);

/**
 * Error code when a dependency is not a PHP dependency, but has no name
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DEPNAME', 25);

/**
 * Error code when a dependency has no type (pkg, php, etc.)
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DEPTYPE', 26);

/**
 * Error code when a dependency has no relation (lt, ge, has, etc.)
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DEPREL', 27);

/**
 * Error code when a dependency is not a 'has' relation, but has no version
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DEPVERSION', 28);

/**
 * Error code when a dependency has an invalid relation
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPREL', 29);

/**
 * Error code when a dependency has an invalid type
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPTYPE', 30);

/**
 * Error code when a dependency has an invalid optional option
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPOPTIONAL', 31);

/**
 * Error code when a dependency is a pkg dependency, and has an invalid package name
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_DEPNAME', 32);

/**
 * Error code when a dependency has a channel="foo" attribute, and foo is not a registered channel
 */
define('PEAR_PACKAGEFILE_ERROR_UNKNOWN_DEPCHANNEL', 33);

/**
 * Error code when rel="has" and version attribute is present.
 */
define('PEAR_PACKAGEFILE_ERROR_DEPVERSION_IGNORED', 34);

/**
 * Error code when type="php" and dependency name is present
 */
define('PEAR_PACKAGEFILE_ERROR_DEPNAME_IGNORED', 35);

/**
 * Error code when a configure option has no name
 */
define('PEAR_PACKAGEFILE_ERROR_NO_CONFNAME', 36);

/**
 * Error code when a configure option has no name
 */
define('PEAR_PACKAGEFILE_ERROR_NO_CONFPROMPT', 37);

/**
 * Error code when a file in the filelist has an invalid role
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_FILEROLE', 38);

/**
 * Error code when a file in the filelist has no role
 */
define('PEAR_PACKAGEFILE_ERROR_NO_FILEROLE', 39);

/**
 * Error code when analyzing a php source file that has parse errors
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE', 40);

/**
 * Error code when analyzing a php source file reveals a source element
 * without a package name prefix
 */
define('PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX', 41);

/**
 * Error code when an unknown channel is specified
 */
define('PEAR_PACKAGEFILE_ERROR_UNKNOWN_CHANNEL', 42);

/**
 * Error code when no files are found in the filelist
 */
define('PEAR_PACKAGEFILE_ERROR_NO_FILES', 43);

/**
 * Error code when a file is not valid php according to _analyzeSourceCode()
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_FILE', 44);

/**
 * Error code when the channel validator returns an error or warning
 */
define('PEAR_PACKAGEFILE_ERROR_CHANNELVAL', 45);

/**
 * Error code when a php5 package is packaged in php4 (analysis doesn't work)
 */
define('PEAR_PACKAGEFILE_ERROR_PHP5', 46);

/**
 * Error code when a file is listed in package.xml but does not exist
 */
define('PEAR_PACKAGEFILE_ERROR_FILE_NOTFOUND', 47);

/**
 * Error code when a <dep type="php" rel="not"... is encountered (use rel="ne")
 */
define('PEAR_PACKAGEFILE_PHP_NO_NOT', 48);

/**
 * Error code when a package.xml contains non-ISO-8859-1 characters
 */
define('PEAR_PACKAGEFILE_ERROR_NON_ISO_CHARS', 49);

/**
 * Error code when a dependency is not a 'has' relation, but has no version
 */
define('PEAR_PACKAGEFILE_ERROR_NO_DEPPHPVERSION', 50);

/**
 * Error code when a package has no lead developer
 */
define('PEAR_PACKAGEFILE_ERROR_NO_LEAD', 51);

/**
 * Error code when a filename begins with "."
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME', 52);
/**
 * package.xml encapsulator
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_v1
{
    /**
     * @access private
     * @var PEAR_ErrorStack
     * @access private
     */
    var $_stack;

    /**
     * A registry object, used to access the package name validation regex for non-standard channels
     * @var PEAR_Registry
     * @access private
     */
    var $_registry;

    /**
     * An object that contains a log method that matches PEAR_Common::log's signature
     * @var object
     * @access private
     */
    var $_logger;

    /**
     * Parsed package information
     * @var array
     * @access private
     */
    var $_packageInfo;

    /**
     * path to package.xml
     * @var string
     * @access private
     */
    var $_packageFile;

    /**
     * path to package .tgz or false if this is a local/extracted package.xml
     * @var string
     * @access private
     */
    var $_archiveFile;

    /**
     * @var int
     * @access private
     */
    var $_isValid = 0;

    /**
     * Determines whether this packagefile was initialized only with partial package info
     *
     * If this package file was constructed via parsing REST, it will only contain
     *
     * - package name
     * - channel name
     * - dependencies 
     * @var boolean
     * @access private
     */
    var $_incomplete = true;

    /**
     * @param bool determines whether to return a PEAR_Error object, or use the PEAR_ErrorStack
     * @param string Name of Error Stack class to use.
     */
    function __construct()
    {
        $this->_stack = new PEAR_ErrorStack('PEAR_PackageFile_v1');
        $this->_stack->setErrorMessageTemplate($this->_getErrorMessage());
        $this->_isValid = 0;
    }

    function installBinary($installer)
    {
        return false;
    }

    function isExtension($name)
    {
        return false;
    }

    function setConfig(&$config)
    {
        $this->_config = &$config;
        $this->_registry = &$config->getRegistry();
    }

    function setRequestedGroup()
    {
        // placeholder
    }

    /**
     * For saving in the registry.
     *
     * Set the last version that was installed
     * @param string
     */
    function setLastInstalledVersion($version)
    {
        $this->_packageInfo['_lastversion'] = $version;
    }

    /**
     * @return string|false
     */
    function getLastInstalledVersion()
    {
        if (isset($this->_packageInfo['_lastversion'])) {
            return $this->_packageInfo['_lastversion'];
        }
        return false;
    }

    function getInstalledBinary()
    {
        return false;
    }

    function listPostinstallScripts()
    {
        return false;
    }

    function initPostinstallScripts()
    {
        return false;
    }

    function setLogger(&$logger)
    {
        if ($logger && (!is_object($logger) || !method_exists($logger, 'log'))) {
            return PEAR::raiseError('Logger must be compatible with PEAR_Common::log');
        }
        $this->_logger = &$logger;
    }

    function setPackagefile($file, $archive = false)
    {
        $this->_packageFile = $file;
        $this->_archiveFile = $archive ? $archive : $file;
    }

    function getPackageFile()
    {
        return isset($this->_packageFile) ? $this->_packageFile : false;
    }

    function getPackageType()
    {
        return 'php';
    }

    function getArchiveFile()
    {
        return $this->_archiveFile;
    }

    function packageInfo($field)
    {
        if (!is_string($field) || empty($field) ||
            !isset($this->_packageInfo[$field])) {
            return false;
        }
        return $this->_packageInfo[$field];
    }

    function setDirtree($path)
    {
        if (!isset($this->_packageInfo['dirtree'])) {
            $this->_packageInfo['dirtree'] = array();
        }
        $this->_packageInfo['dirtree'][$path] = true;
    }

    function getDirtree()
    {
        if (isset($this->_packageInfo['dirtree']) && count($this->_packageInfo['dirtree'])) {
            return $this->_packageInfo['dirtree'];
        }
        return false;
    }

    function resetDirtree()
    {
        unset($this->_packageInfo['dirtree']);
    }

    function fromArray($pinfo)
    {
        $this->_incomplete = false;
        $this->_packageInfo = $pinfo;
    }

    function isIncomplete()
    {
        return $this->_incomplete;
    }

    function getChannel()
    {
        return 'pear.php.net';
    }

    function getUri()
    {
        return false;
    }

    function getTime()
    {
        return false;
    }

    function getExtends()
    {
        if (isset($this->_packageInfo['extends'])) {
            return $this->_packageInfo['extends'];
        }
        return false;
    }

    /**
     * @return array
     */
    function toArray()
    {
        if (!$this->validate(PEAR_VALIDATE_NORMAL)) {
            return false;
        }
        return $this->getArray();
    }

    function getArray()
    {
        return $this->_packageInfo;
    }

    function getName()
    {
        return $this->getPackage();
    }

    function getPackage()
    {
        if (isset($this->_packageInfo['package'])) {
            return $this->_packageInfo['package'];
        }
        return false;
    }

    /**
     * WARNING - don't use this unless you know what you are doing
     */
    function setRawPackage($package)
    {
        $this->_packageInfo['package'] = $package;
    }

    function setPackage($package)
    {
        $this->_packageInfo['package'] = $package;
        $this->_isValid = false;
    }

    function getVersion()
    {
        if (isset($this->_packageInfo['version'])) {
            return $this->_packageInfo['version'];
        }
        return false;
    }

    function setVersion($version)
    {
        $this->_packageInfo['version'] = $version;
        $this->_isValid = false;
    }

    function clearMaintainers()
    {
        unset($this->_packageInfo['maintainers']);
    }

    function getMaintainers()
    {
        if (isset($this->_packageInfo['maintainers'])) {
            return $this->_packageInfo['maintainers'];
        }
        return false;
    }

    /**
     * Adds a new maintainer - no checking of duplicates is performed, use
     * updatemaintainer for that purpose.
     */
    function addMaintainer($role, $handle, $name, $email)
    {
        $this->_packageInfo['maintainers'][] =
            array('handle' => $handle, 'role' => $role, 'email' => $email, 'name' => $name);
        $this->_isValid = false;
    }

    function updateMaintainer($role, $handle, $name, $email)
    {
        $found = false;
        if (!isset($this->_packageInfo['maintainers']) ||
              !is_array($this->_packageInfo['maintainers'])) {
            return $this->addMaintainer($role, $handle, $name, $email);
        }
        foreach ($this->_packageInfo['maintainers'] as $i => $maintainer) {
            if ($maintainer['handle'] == $handle) {
                $found = $i;
                break;
            }
        }
        if ($found !== false) {
            unset($this->_packageInfo['maintainers'][$found]);
            $this->_packageInfo['maintainers'] =
                array_values($this->_packageInfo['maintainers']);
        }
        $this->addMaintainer($role, $handle, $name, $email);
    }

    function deleteMaintainer($handle)
    {
        $found = false;
        foreach ($this->_packageInfo['maintainers'] as $i => $maintainer) {
            if ($maintainer['handle'] == $handle) {
                $found = $i;
                break;
            }
        }
        if ($found !== false) {
            unset($this->_packageInfo['maintainers'][$found]);
            $this->_packageInfo['maintainers'] =
                array_values($this->_packageInfo['maintainers']);
            return true;
        }
        return false;
    }

    function getState()
    {
        if (isset($this->_packageInfo['release_state'])) {
            return $this->_packageInfo['release_state'];
        }
        return false;
    }

    function setRawState($state)
    {
        $this->_packageInfo['release_state'] = $state;
    }

    function setState($state)
    {
        $this->_packageInfo['release_state'] = $state;
        $this->_isValid = false;
    }

    function getDate()
    {
        if (isset($this->_packageInfo['release_date'])) {
            return $this->_packageInfo['release_date'];
        }
        return false;
    }

    function setDate($date)
    {
        $this->_packageInfo['release_date'] = $date;
        $this->_isValid = false;
    }

    function getLicense()
    {
        if (isset($this->_packageInfo['release_license'])) {
            return $this->_packageInfo['release_license'];
        }
        return false;
    }

    function setLicense($date)
    {
        $this->_packageInfo['release_license'] = $date;
        $this->_isValid = false;
    }

    function getSummary()
    {
        if (isset($this->_packageInfo['summary'])) {
            return $this->_packageInfo['summary'];
        }
        return false;
    }

    function setSummary($summary)
    {
        $this->_packageInfo['summary'] = $summary;
        $this->_isValid = false;
    }

    function getDescription()
    {
        if (isset($this->_packageInfo['description'])) {
            return $this->_packageInfo['description'];
        }
        return false;
    }

    function setDescription($desc)
    {
        $this->_packageInfo['description'] = $desc;
        $this->_isValid = false;
    }

    function getNotes()
    {
        if (isset($this->_packageInfo['release_notes'])) {
            return $this->_packageInfo['release_notes'];
        }
        return false;
    }

    function setNotes($notes)
    {
        $this->_packageInfo['release_notes'] = $notes;
        $this->_isValid = false;
    }

    function getDeps()
    {
        if (isset($this->_packageInfo['release_deps'])) {
            return $this->_packageInfo['release_deps'];
        }
        return false;
    }

    /**
     * Reset dependencies prior to adding new ones
     */
    function clearDeps()
    {
        unset($this->_packageInfo['release_deps']);
    }

    function addPhpDep($version, $rel)
    {
        $this->_isValid = false;
        $this->_packageInfo['release_deps'][] =
            array('type' => 'php',
                  'rel' => $rel,
                  'version' => $version);
    }

    function addPackageDep($name, $version, $rel, $optional = 'no')
    {
        $this->_isValid = false;
        $dep =
            array('type' => 'pkg',
                  'name' => $name,
                  'rel' => $rel,
                  'optional' => $optional);
        if ($rel != 'has' && $rel != 'not') {
            $dep['version'] = $version;
        }
        $this->_packageInfo['release_deps'][] = $dep;
    }

    function addExtensionDep($name, $version, $rel, $optional = 'no')
    {
        $this->_isValid = false;
        $this->_packageInfo['release_deps'][] =
            array('type' => 'ext',
                  'name' => $name,
                  'rel' => $rel,
                  'version' => $version,
                  'optional' => $optional);
    }

    /**
     * WARNING - do not use this function directly unless you know what you're doing
     */
    function setDeps($deps)
    {
        $this->_packageInfo['release_deps'] = $deps;
    }

    function hasDeps()
    {
        return isset($this->_packageInfo['release_deps']) &&
            count($this->_packageInfo['release_deps']);
    }

    function getDependencyGroup($group)
    {
        return false;
    }

    function isCompatible($pf)
    {
        return false;
    }

    function isSubpackageOf($p)
    {
        return $p->isSubpackage($this);
    }

    function isSubpackage($p)
    {
        return false;
    }

    function dependsOn($package, $channel)
    {
        if (strtolower($channel) != 'pear.php.net') {
            return false;
        }
        if (!($deps = $this->getDeps())) {
            return false;
        }
        foreach ($deps as $dep) {
            if ($dep['type'] != 'pkg') {
                continue;
            }
            if (strtolower($dep['name']) == strtolower($package)) {
                return true;
            }
        }
        return false;
    }

    function getConfigureOptions()
    {
        if (isset($this->_packageInfo['configure_options'])) {
            return $this->_packageInfo['configure_options'];
        }
        return false;
    }

    function hasConfigureOptions()
    {
        return isset($this->_packageInfo['configure_options']) &&
            count($this->_packageInfo['configure_options']);
    }

    function addConfigureOption($name, $prompt, $default = false)
    {
        $o = array('name' => $name, 'prompt' => $prompt);
        if ($default !== false) {
            $o['default'] = $default;
        }
        if (!isset($this->_packageInfo['configure_options'])) {
            $this->_packageInfo['configure_options'] = array();
        }
        $this->_packageInfo['configure_options'][] = $o;
    }

    function clearConfigureOptions()
    {
        unset($this->_packageInfo['configure_options']);
    }

    function getProvides()
    {
        if (isset($this->_packageInfo['provides'])) {
            return $this->_packageInfo['provides'];
        }
        return false;
    }

    function getProvidesExtension()
    {
        return false;
    }

    function addFile($dir, $file, $attrs)
    {
        $dir = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'), $dir);
        if ($dir == '/' || $dir == '') {
            $dir = '';
        } else {
            $dir .= '/';
        }
        $file = $dir . $file;
        $file = preg_replace('![\\/]+!', '/', $file);
        $this->_packageInfo['filelist'][$file] = $attrs;
    }

    function getInstallationFilelist()
    {
        return $this->getFilelist();
    }

    function getFilelist()
    {
        if (isset($this->_packageInfo['filelist'])) {
            return $this->_packageInfo['filelist'];
        }
        return false;
    }

    function setFileAttribute($file, $attr, $value)
    {
        $this->_packageInfo['filelist'][$file][$attr] = $value;
    }

    function resetFilelist()
    {
        $this->_packageInfo['filelist'] = array();
    }

    function setInstalledAs($file, $path)
    {
        if ($path) {
            return $this->_packageInfo['filelist'][$file]['installed_as'] = $path;
        }
        unset($this->_packageInfo['filelist'][$file]['installed_as']);
    }

    function installedFile($file, $atts)
    {
        if (isset($this->_packageInfo['filelist'][$file])) {
            $this->_packageInfo['filelist'][$file] =
                array_merge($this->_packageInfo['filelist'][$file], $atts);
        } else {
            $this->_packageInfo['filelist'][$file] = $atts;
        }
    }

    function getChangelog()
    {
        if (isset($this->_packageInfo['changelog'])) {
            return $this->_packageInfo['changelog'];
        }
        return false;
    }

    function getPackagexmlVersion()
    {
        return '1.0';
    }

    /**
     * Wrapper to {@link PEAR_ErrorStack::getErrors()}
     * @param boolean determines whether to purge the error stack after retrieving
     * @return array
     */
    function getValidationWarnings($purge = true)
    {
        return $this->_stack->getErrors($purge);
    }

    // }}}
    /**
     * Validation error.  Also marks the object contents as invalid
     * @param error code
     * @param array error information
     * @access private
     */
    function _validateError($code, $params = array())
    {
        $this->_stack->push($code, 'error', $params, false, false, debug_backtrace());
        $this->_isValid = false;
    }

    /**
     * Validation warning.  Does not mark the object contents invalid.
     * @param error code
     * @param array error information
     * @access private
     */
    function _validateWarning($code, $params = array())
    {
        $this->_stack->push($code, 'warning', $params, false, false, debug_backtrace());
    }

    /**
     * @param integer error code
     * @access protected
     */
    function _getErrorMessage()
    {
        return array(
                PEAR_PACKAGEFILE_ERROR_NO_NAME =>
                    'Missing Package Name',
                PEAR_PACKAGEFILE_ERROR_NO_SUMMARY =>
                    'No summary found',
                PEAR_PACKAGEFILE_ERROR_MULTILINE_SUMMARY =>
                    'Summary should be on one line',
                PEAR_PACKAGEFILE_ERROR_NO_DESCRIPTION =>
                    'Missing description',
                PEAR_PACKAGEFILE_ERROR_NO_LICENSE =>
                    'Missing license',
                PEAR_PACKAGEFILE_ERROR_NO_VERSION =>
                    'No release version found',
                PEAR_PACKAGEFILE_ERROR_NO_STATE =>
                    'No release state found',
                PEAR_PACKAGEFILE_ERROR_NO_DATE =>
                    'No release date found',
                PEAR_PACKAGEFILE_ERROR_NO_NOTES =>
                    'No release notes found',
                PEAR_PACKAGEFILE_ERROR_NO_LEAD =>
                    'Package must have at least one lead maintainer',
                PEAR_PACKAGEFILE_ERROR_NO_MAINTAINERS =>
                    'No maintainers found, at least one must be defined',
                PEAR_PACKAGEFILE_ERROR_NO_MAINTHANDLE =>
                    'Maintainer %index% has no handle (user ID at channel server)',
                PEAR_PACKAGEFILE_ERROR_NO_MAINTROLE =>
                    'Maintainer %index% has no role',
                PEAR_PACKAGEFILE_ERROR_NO_MAINTNAME =>
                    'Maintainer %index% has no name',
                PEAR_PACKAGEFILE_ERROR_NO_MAINTEMAIL =>
                    'Maintainer %index% has no email',
                PEAR_PACKAGEFILE_ERROR_NO_DEPNAME =>
                    'Dependency %index% is not a php dependency, and has no name',
                PEAR_PACKAGEFILE_ERROR_NO_DEPREL =>
                    'Dependency %index% has no relation (rel)',
                PEAR_PACKAGEFILE_ERROR_NO_DEPTYPE =>
                    'Dependency %index% has no type',
                PEAR_PACKAGEFILE_ERROR_DEPNAME_IGNORED =>
                    'PHP Dependency %index% has a name attribute of "%name%" which will be' .
                        ' ignored!',
                PEAR_PACKAGEFILE_ERROR_NO_DEPVERSION =>
                    'Dependency %index% is not a rel="has" or rel="not" dependency, ' .
                        'and has no version',
                PEAR_PACKAGEFILE_ERROR_NO_DEPPHPVERSION =>
                    'Dependency %index% is a type="php" dependency, ' .
                        'and has no version',
                PEAR_PACKAGEFILE_ERROR_DEPVERSION_IGNORED =>
                    'Dependency %index% is a rel="%rel%" dependency, versioning is ignored',
                PEAR_PACKAGEFILE_ERROR_INVALID_DEPOPTIONAL =>
                    'Dependency %index% has invalid optional value "%opt%", should be yes or no',
                PEAR_PACKAGEFILE_PHP_NO_NOT =>
                    'Dependency %index%: php dependencies cannot use "not" rel, use "ne"' .
                        ' to exclude specific versions',
                PEAR_PACKAGEFILE_ERROR_NO_CONFNAME =>
                    'Configure Option %index% has no name',
                PEAR_PACKAGEFILE_ERROR_NO_CONFPROMPT =>
                    'Configure Option %index% has no prompt',
                PEAR_PACKAGEFILE_ERROR_NO_FILES =>
                    'No files in <filelist> section of package.xml',
                PEAR_PACKAGEFILE_ERROR_NO_FILEROLE =>
                    'File "%file%" has no role, expecting one of "%roles%"',
                PEAR_PACKAGEFILE_ERROR_INVALID_FILEROLE =>
                    'File "%file%" has invalid role "%role%", expecting one of "%roles%"',
                PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME =>
                    'File "%file%" cannot start with ".", cannot package or install',
                PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE =>
                    'Parser error: invalid PHP found in file "%file%"',
                PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX =>
                    'in %file%: %type% "%name%" not prefixed with package name "%package%"',
                PEAR_PACKAGEFILE_ERROR_INVALID_FILE =>
                    'Parser error: invalid PHP file "%file%"',
                PEAR_PACKAGEFILE_ERROR_CHANNELVAL =>
                    'Channel validator error: field "%field%" - %reason%',
                PEAR_PACKAGEFILE_ERROR_PHP5 =>
                    'Error, PHP5 token encountered in %file%, analysis should be in PHP5',
                PEAR_PACKAGEFILE_ERROR_FILE_NOTFOUND =>
                    'File "%file%" in package.xml does not exist',
                PEAR_PACKAGEFILE_ERROR_NON_ISO_CHARS =>
                    'Package.xml contains non-ISO-8859-1 characters, and may not validate',
            );
    }

    /**
     * Validate XML package definition file.
     *
     * @access public
     * @return boolean
     */
    function validate($state = PEAR_VALIDATE_NORMAL, $nofilechecking = false)
    {
        if (($this->_isValid & $state) == $state) {
            return true;
        }
        $this->_isValid = true;
        $info = $this->_packageInfo;
        if (empty($info['package'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_NAME);
            $this->_packageName = $pn = 'unknown';
        } else {
            $this->_packageName = $pn = $info['package'];
        }

        if (empty($info['summary'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_SUMMARY);
        } elseif (strpos(trim($info['summary']), "\n") !== false) {
            $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_MULTILINE_SUMMARY,
                array('summary' => $info['summary']));
        }
        if (empty($info['description'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DESCRIPTION);
        }
        if (empty($info['release_license'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_LICENSE);
        }
        if (empty($info['version'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_VERSION);
        }
        if (empty($info['release_state'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_STATE);
        }
        if (empty($info['release_date'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DATE);
        }
        if (empty($info['release_notes'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_NOTES);
        }
        if (empty($info['maintainers'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTAINERS);
        } else {
            $haslead = false;
            $i = 1;
            foreach ($info['maintainers'] as $m) {
                if (empty($m['handle'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTHANDLE,
                        array('index' => $i));
                }
                if (empty($m['role'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTROLE,
                        array('index' => $i, 'roles' => PEAR_Common::getUserRoles()));
                } elseif ($m['role'] == 'lead') {
                    $haslead = true;
                }
                if (empty($m['name'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTNAME,
                        array('index' => $i));
                }
                if (empty($m['email'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_MAINTEMAIL,
                        array('index' => $i));
                }
                $i++;
            }
            if (!$haslead) {
                $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_LEAD);
            }
        }
        if (!empty($info['release_deps'])) {
            $i = 1;
            foreach ($info['release_deps'] as $d) {
                if (!isset($d['type']) || empty($d['type'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPTYPE,
                        array('index' => $i, 'types' => PEAR_Common::getDependencyTypes()));
                    continue;
                }
                if (!isset($d['rel']) || empty($d['rel'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPREL,
                        array('index' => $i, 'rels' => PEAR_Common::getDependencyRelations()));
                    continue;
                }
                if (!empty($d['optional'])) {
                    if (!in_array($d['optional'], array('yes', 'no'))) {
                        $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_DEPOPTIONAL,
                            array('index' => $i, 'opt' => $d['optional']));
                    }
                }
                if ($d['rel'] != 'has' && $d['rel'] != 'not' && empty($d['version'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPVERSION,
                        array('index' => $i));
                } elseif (($d['rel'] == 'has' || $d['rel'] == 'not') && !empty($d['version'])) {
                    $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_DEPVERSION_IGNORED,
                        array('index' => $i, 'rel' => $d['rel']));
                }
                if ($d['type'] == 'php' && !empty($d['name'])) {
                    $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_DEPNAME_IGNORED,
                        array('index' => $i, 'name' => $d['name']));
                } elseif ($d['type'] != 'php' && empty($d['name'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPNAME,
                        array('index' => $i));
                }
                if ($d['type'] == 'php' && empty($d['version'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_DEPPHPVERSION,
                        array('index' => $i));
                }
                if (($d['rel'] == 'not') && ($d['type'] == 'php')) {
                    $this->_validateError(PEAR_PACKAGEFILE_PHP_NO_NOT,
                        array('index' => $i));
                }
                $i++;
            }
        }
        if (!empty($info['configure_options'])) {
            $i = 1;
            foreach ($info['configure_options'] as $c) {
                if (empty($c['name'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_CONFNAME,
                        array('index' => $i));
                }
                if (empty($c['prompt'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_CONFPROMPT,
                        array('index' => $i));
                }
                $i++;
            }
        }
        if (empty($info['filelist'])) {
            $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_FILES);
            $errors[] = 'no files';
        } else {
            foreach ($info['filelist'] as $file => $fa) {
                if (empty($fa['role'])) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_NO_FILEROLE,
                        array('file' => $file, 'roles' => PEAR_Common::getFileRoles()));
                    continue;
                } elseif (!in_array($fa['role'], PEAR_Common::getFileRoles())) {
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILEROLE,
                        array('file' => $file, 'role' => $fa['role'], 'roles' => PEAR_Common::getFileRoles()));
                }
                if (preg_match('~/\.\.?(/|\\z)|^\.\.?/~', str_replace('\\', '/', $file))) {
                    // file contains .. parent directory or . cur directory references
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME,
                        array('file' => $file));
                }
                if (isset($fa['install-as']) &&
                      preg_match('~/\.\.?(/|\\z)|^\.\.?/~', 
                                 str_replace('\\', '/', $fa['install-as']))) {
                    // install-as contains .. parent directory or . cur directory references
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME,
                        array('file' => $file . ' [installed as ' . $fa['install-as'] . ']'));
                }
                if (isset($fa['baseinstalldir']) &&
                      preg_match('~/\.\.?(/|\\z)|^\.\.?/~', 
                                 str_replace('\\', '/', $fa['baseinstalldir']))) {
                    // install-as contains .. parent directory or . cur directory references
                    $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_FILENAME,
                        array('file' => $file . ' [baseinstalldir ' . $fa['baseinstalldir'] . ']'));
                }
            }
        }
        if (isset($this->_registry) && $this->_isValid) {
            $chan = $this->_registry->getChannel('pear.php.net');
            if (PEAR::isError($chan)) {
                $this->_validateError(PEAR_PACKAGEFILE_ERROR_CHANNELVAL, $chan->getMessage());
                return $this->_isValid = 0;
            }
            $validator = $chan->getValidationObject();
            $validator->setPackageFile($this);
            $validator->validate($state);
            $failures = $validator->getFailures();
            foreach ($failures['errors'] as $error) {
                $this->_validateError(PEAR_PACKAGEFILE_ERROR_CHANNELVAL, $error);
            }
            foreach ($failures['warnings'] as $warning) {
                $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_CHANNELVAL, $warning);
            }
        }
        if ($this->_isValid && $state == PEAR_VALIDATE_PACKAGING && !$nofilechecking) {
            if ($this->_analyzePhpFiles()) {
                $this->_isValid = true;
            }
        }
        if ($this->_isValid) {
            return $this->_isValid = $state;
        }
        return $this->_isValid = 0;
    }

    function _analyzePhpFiles()
    {
        if (!$this->_isValid) {
            return false;
        }
        if (!isset($this->_packageFile)) {
            return false;
        }
        $dir_prefix = dirname($this->_packageFile);
        $common = new PEAR_Common;
        $log = isset($this->_logger) ? array(&$this->_logger, 'log') :
            array($common, 'log');
        $info = $this->getFilelist();
        foreach ($info as $file => $fa) {
            if (!file_exists($dir_prefix . DIRECTORY_SEPARATOR . $file)) {
                $this->_validateError(PEAR_PACKAGEFILE_ERROR_FILE_NOTFOUND,
                    array('file' => realpath($dir_prefix) . DIRECTORY_SEPARATOR . $file));
                continue;
            }
            if ($fa['role'] == 'php' && $dir_prefix) {
                call_user_func_array($log, array(1, "Analyzing $file"));
                $srcinfo = $this->_analyzeSourceCode($dir_prefix . DIRECTORY_SEPARATOR . $file);
                if ($srcinfo) {
                    $this->_buildProvidesArray($srcinfo);
                }
            }
        }
        $this->_packageName = $pn = $this->getPackage();
        $pnl = strlen($pn);
        if (isset($this->_packageInfo['provides'])) {
            foreach ((array) $this->_packageInfo['provides'] as $key => $what) {
                if (isset($what['explicit'])) {
                    // skip conformance checks if the provides entry is
                    // specified in the package.xml file
                    continue;
                }
                extract($what);
                if ($type == 'class') {
                    if (!strncasecmp($name, $pn, $pnl)) {
                        continue;
                    }
                    $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX,
                        array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn));
                } elseif ($type == 'function') {
                    if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) {
                        continue;
                    }
                    $this->_validateWarning(PEAR_PACKAGEFILE_ERROR_NO_PNAME_PREFIX,
                        array('file' => $file, 'type' => $type, 'name' => $name, 'package' => $pn));
                }
            }
        }
        return $this->_isValid;
    }

    /**
     * Get the default xml generator object
     *
     * @return PEAR_PackageFile_Generator_v1
     */
    function &getDefaultGenerator()
    {
        if (!class_exists('PEAR_PackageFile_Generator_v1')) {
            require_once 'PEAR/PackageFile/Generator/v1.php';
        }
        $a = new PEAR_PackageFile_Generator_v1($this);
        return $a;
    }

    /**
     * Get the contents of a file listed within the package.xml
     * @param string
     * @return string
     */
    function getFileContents($file)
    {
        if ($this->_archiveFile == $this->_packageFile) { // unpacked
            $dir = dirname($this->_packageFile);
            $file = $dir . DIRECTORY_SEPARATOR . $file;
            $file = str_replace(array('/', '\\'),
                array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR), $file);
            if (file_exists($file) && is_readable($file)) {
                return implode('', file($file));
            }
        } else { // tgz
            if (!class_exists('Archive_Tar')) {
                require_once 'Archive/Tar.php';
            }
            $tar = new Archive_Tar($this->_archiveFile);
            $tar->pushErrorHandling(PEAR_ERROR_RETURN);
            if ($file != 'package.xml' && $file != 'package2.xml') {
                $file = $this->getPackage() . '-' . $this->getVersion() . '/' . $file;
            }
            $file = $tar->extractInString($file);
            $tar->popErrorHandling();
            if (PEAR::isError($file)) {
                return PEAR::raiseError("Cannot locate file '$file' in archive");
            }
            return $file;
        }
    }

    // {{{ analyzeSourceCode()
    /**
     * Analyze the source code of the given PHP file
     *
     * @param  string Filename of the PHP file
     * @return mixed
     * @access private
     */
    function _analyzeSourceCode($file)
    {
        if (!function_exists("token_get_all")) {
            return false;
        }
        if (!defined('T_DOC_COMMENT')) {
            define('T_DOC_COMMENT', T_COMMENT);
        }
        if (!defined('T_INTERFACE')) {
            define('T_INTERFACE', -1);
        }
        if (!defined('T_IMPLEMENTS')) {
            define('T_IMPLEMENTS', -1);
        }
        if (!$fp = @fopen($file, "r")) {
            return false;
        }
        fclose($fp);
        $contents = file_get_contents($file);
        $tokens = token_get_all($contents);
/*
        for ($i = 0; $i < sizeof($tokens); $i++) {
            @list($token, $data) = $tokens[$i];
            if (is_string($token)) {
                var_dump($token);
            } else {
                print token_name($token) . ' ';
                var_dump(rtrim($data));
            }
        }
*/
        $look_for = 0;
        $paren_level = 0;
        $bracket_level = 0;
        $brace_level = 0;
        $lastphpdoc = '';
        $current_class = '';
        $current_interface = '';
        $current_class_level = -1;
        $current_function = '';
        $current_function_level = -1;
        $declared_classes = array();
        $declared_interfaces = array();
        $declared_functions = array();
        $declared_methods = array();
        $used_classes = array();
        $used_functions = array();
        $extends = array();
        $implements = array();
        $nodeps = array();
        $inquote = false;
        $interface = false;
        for ($i = 0; $i < sizeof($tokens); $i++) {
            if (is_array($tokens[$i])) {
                list($token, $data) = $tokens[$i];
            } else {
                $token = $tokens[$i];
                $data = '';
            }
            if ($inquote) {
                if ($token != '"' && $token != T_END_HEREDOC) {
                    continue;
                } else {
                    $inquote = false;
                    continue;
                }
            }
            switch ($token) {
                case T_WHITESPACE:
                    break;
                case ';':
                    if ($interface) {
                        $current_function = '';
                        $current_function_level = -1;
                    }
                    break;
                case '"':
                case T_START_HEREDOC:
                    $inquote = true;
                    break;
                case T_CURLY_OPEN:
                case T_DOLLAR_OPEN_CURLY_BRACES:
                case '{': $brace_level++; continue 2;
                case '}':
                    $brace_level--;
                    if ($current_class_level == $brace_level) {
                        $current_class = '';
                        $current_class_level = -1;
                    }
                    if ($current_function_level == $brace_level) {
                        $current_function = '';
                        $current_function_level = -1;
                    }
                    continue 2;
                case '[': $bracket_level++; continue 2;
                case ']': $bracket_level--; continue 2;
                case '(': $paren_level++;   continue 2;
                case ')': $paren_level--;   continue 2;
                case T_INTERFACE:
                    $interface = true;
                case T_CLASS:
                    if (($current_class_level != -1) || ($current_function_level != -1)) {
                        $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE,
                            array('file' => $file));
                        return false;
                    }
                case T_FUNCTION:
                case T_NEW:
                case T_EXTENDS:
                case T_IMPLEMENTS:
                    $look_for = $token;
                    continue 2;
                case T_STRING:
                    if ($look_for == T_CLASS) {
                        $current_class = $data;
                        $current_class_level = $brace_level;
                        $declared_classes[] = $current_class;
                    } elseif ($look_for == T_INTERFACE) {
                        $current_interface = $data;
                        $current_class_level = $brace_level;
                        $declared_interfaces[] = $current_interface;
                    } elseif ($look_for == T_IMPLEMENTS) {
                        $implements[$current_class] = $data;
                    } elseif ($look_for == T_EXTENDS) {
                        $extends[$current_class] = $data;
                    } elseif ($look_for == T_FUNCTION) {
                        if ($current_class) {
                            $current_function = "$current_class::$data";
                            $declared_methods[$current_class][] = $data;
                        } elseif ($current_interface) {
                            $current_function = "$current_interface::$data";
                            $declared_methods[$current_interface][] = $data;
                        } else {
                            $current_function = $data;
                            $declared_functions[] = $current_function;
                        }
                        $current_function_level = $brace_level;
                        $m = array();
                    } elseif ($look_for == T_NEW) {
                        $used_classes[$data] = true;
                    }
                    $look_for = 0;
                    continue 2;
                case T_VARIABLE:
                    $look_for = 0;
                    continue 2;
                case T_DOC_COMMENT:
                case T_COMMENT:
                    if (preg_match('!^/\*\*\s!', $data)) {
                        $lastphpdoc = $data;
                        if (preg_match_all('/@nodep\s+(\S+)/', $lastphpdoc, $m)) {
                            $nodeps = array_merge($nodeps, $m[1]);
                        }
                    }
                    continue 2;
                case T_DOUBLE_COLON:
                    if (!($tokens[$i - 1][0] == T_WHITESPACE || $tokens[$i - 1][0] == T_STRING)) {
                        $this->_validateError(PEAR_PACKAGEFILE_ERROR_INVALID_PHPFILE,
                            array('file' => $file));
                        return false;
                    }
                    $class = $tokens[$i - 1][1];
                    if (strtolower($class) != 'parent') {
                        $used_classes[$class] = true;
                    }
                    continue 2;
            }
        }
        return array(
            "source_file" => $file,
            "declared_classes" => $declared_classes,
            "declared_interfaces" => $declared_interfaces,
            "declared_methods" => $declared_methods,
            "declared_functions" => $declared_functions,
            "used_classes" => array_diff(array_keys($used_classes), $nodeps),
            "inheritance" => $extends,
            "implements" => $implements,
            );
    }

    /**
     * Build a "provides" array from data returned by
     * analyzeSourceCode().  The format of the built array is like
     * this:
     *
     *  array(
     *    'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'),
     *    ...
     *  )
     *
     *
     * @param array $srcinfo array with information about a source file
     * as returned by the analyzeSourceCode() method.
     *
     * @return void
     *
     * @access private
     *
     */
    function _buildProvidesArray($srcinfo)
    {
        if (!$this->_isValid) {
            return false;
        }
        $file = basename($srcinfo['source_file']);
        $pn = $this->getPackage();
        $pnl = strlen($pn);
        foreach ($srcinfo['declared_classes'] as $class) {
            $key = "class;$class";
            if (isset($this->_packageInfo['provides'][$key])) {
                continue;
            }
            $this->_packageInfo['provides'][$key] =
                array('file'=> $file, 'type' => 'class', 'name' => $class);
            if (isset($srcinfo['inheritance'][$class])) {
                $this->_packageInfo['provides'][$key]['extends'] =
                    $srcinfo['inheritance'][$class];
            }
        }
        foreach ($srcinfo['declared_methods'] as $class => $methods) {
            foreach ($methods as $method) {
                $function = "$class::$method";
                $key = "function;$function";
                if ($method[0] == '_' || !strcasecmp($method, $class) ||
                    isset($this->_packageInfo['provides'][$key])) {
                    continue;
                }
                $this->_packageInfo['provides'][$key] =
                    array('file'=> $file, 'type' => 'function', 'name' => $function);
            }
        }

        foreach ($srcinfo['declared_functions'] as $function) {
            $key = "function;$function";
            if ($function[0] == '_' || isset($this->_packageInfo['provides'][$key])) {
                continue;
            }
            if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) {
                $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\"";
            }
            $this->_packageInfo['provides'][$key] =
                array('file'=> $file, 'type' => 'function', 'name' => $function);
        }
    }

    // }}}
}
?>
PK�a�\�_=�@�@#pear/PEAR/PackageFile/Parser/v1.phpnu�[���<?php
/**
 * package.xml parsing class, package.xml version 1.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * package.xml abstraction class
 */
require_once 'PEAR/PackageFile/v1.php';
/**
 * Parser for package.xml version 1.0
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: @PEAR-VER@
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_Parser_v1
{
    var $_registry;
    var $_config;
    var $_logger;
    /**
     * BC hack to allow PEAR_Common::infoFromString() to sort of
     * work with the version 2.0 format - there's no filelist though
     * @param PEAR_PackageFile_v2
     */
    function fromV2($packagefile)
    {
        $info = $packagefile->getArray(true);
        $ret = new PEAR_PackageFile_v1;
        $ret->fromArray($info['old']);
    }

    function setConfig(&$c)
    {
        $this->_config = &$c;
        $this->_registry = &$c->getRegistry();
    }

    function setLogger(&$l)
    {
        $this->_logger = &$l;
    }

    /**
     * @param string contents of package.xml file, version 1.0
     * @return bool success of parsing
     */
    function &parse($data, $file, $archive = false)
    {
        if (!extension_loaded('xml')) {
            return PEAR::raiseError('Cannot create xml parser for parsing package.xml, no xml extension');
        }
        $xp = xml_parser_create();
        if (!$xp) {
            $a = &PEAR::raiseError('Cannot create xml parser for parsing package.xml');
            return $a;
        }
        xml_set_object($xp, $this);
        xml_set_element_handler($xp, '_element_start_1_0', '_element_end_1_0');
        xml_set_character_data_handler($xp, '_pkginfo_cdata_1_0');
        xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false);

        $this->element_stack = array();
        $this->_packageInfo = array('provides' => array());
        $this->current_element = false;
        unset($this->dir_install);
        $this->_packageInfo['filelist'] = array();
        $this->filelist =& $this->_packageInfo['filelist'];
        $this->dir_names = array();
        $this->in_changelog = false;
        $this->d_i = 0;
        $this->cdata = '';
        $this->_isValid = true;

        if (!xml_parse($xp, $data, 1)) {
            $code = xml_get_error_code($xp);
            $line = xml_get_current_line_number($xp);
            xml_parser_free($xp);
            $a = PEAR::raiseError(sprintf("XML error: %s at line %d",
                           $str = xml_error_string($code), $line), 2);
            return $a;
        }

        xml_parser_free($xp);

        $pf = new PEAR_PackageFile_v1;
        $pf->setConfig($this->_config);
        if (isset($this->_logger)) {
            $pf->setLogger($this->_logger);
        }
        $pf->setPackagefile($file, $archive);
        $pf->fromArray($this->_packageInfo);
        return $pf;
    }
    // {{{ _unIndent()

    /**
     * Unindent given string
     *
     * @param string $str The string that has to be unindented.
     * @return string
     * @access private
     */
    function _unIndent($str)
    {
        // remove leading newlines
        $str = preg_replace('/^[\r\n]+/', '', $str);
        // find whitespace at the beginning of the first line
        $indent_len = strspn($str, " \t");
        $indent = substr($str, 0, $indent_len);
        $data = '';
        // remove the same amount of whitespace from following lines
        foreach (explode("\n", $str) as $line) {
            if (substr($line, 0, $indent_len) == $indent) {
                $data .= substr($line, $indent_len) . "\n";
            } elseif (trim(substr($line, 0, $indent_len))) {
                $data .= ltrim($line);
            }
        }
        return $data;
    }

    // Support for package DTD v1.0:
    // {{{ _element_start_1_0()

    /**
     * XML parser callback for ending elements.  Used for version 1.0
     * packages.
     *
     * @param resource  $xp    XML parser resource
     * @param string    $name  name of ending element
     *
     * @return void
     *
     * @access private
     */
    function _element_start_1_0($xp, $name, $attribs)
    {
        array_push($this->element_stack, $name);
        $this->current_element = $name;
        $spos = sizeof($this->element_stack) - 2;
        $this->prev_element = ($spos >= 0) ? $this->element_stack[$spos] : '';
        $this->current_attributes = $attribs;
        $this->cdata = '';
        switch ($name) {
            case 'dir':
                if ($this->in_changelog) {
                    break;
                }
                if (array_key_exists('name', $attribs) && $attribs['name'] != '/') {
                    $attribs['name'] = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'),
                        $attribs['name']);
                    if (strrpos($attribs['name'], '/') === strlen($attribs['name']) - 1) {
                        $attribs['name'] = substr($attribs['name'], 0,
                            strlen($attribs['name']) - 1);
                    }
                    if (strpos($attribs['name'], '/') === 0) {
                        $attribs['name'] = substr($attribs['name'], 1);
                    }
                    $this->dir_names[] = $attribs['name'];
                }
                if (isset($attribs['baseinstalldir'])) {
                    $this->dir_install = $attribs['baseinstalldir'];
                }
                if (isset($attribs['role'])) {
                    $this->dir_role = $attribs['role'];
                }
                break;
            case 'file':
                if ($this->in_changelog) {
                    break;
                }
                if (isset($attribs['name'])) {
                    $path = '';
                    if (count($this->dir_names)) {
                        foreach ($this->dir_names as $dir) {
                            $path .= $dir . '/';
                        }
                    }
                    $path .= preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'),
                        $attribs['name']);
                    unset($attribs['name']);
                    $this->current_path = $path;
                    $this->filelist[$path] = $attribs;
                    // Set the baseinstalldir only if the file don't have this attrib
                    if (!isset($this->filelist[$path]['baseinstalldir']) &&
                        isset($this->dir_install))
                    {
                        $this->filelist[$path]['baseinstalldir'] = $this->dir_install;
                    }
                    // Set the Role
                    if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) {
                        $this->filelist[$path]['role'] = $this->dir_role;
                    }
                }
                break;
            case 'replace':
                if (!$this->in_changelog) {
                    $this->filelist[$this->current_path]['replacements'][] = $attribs;
                }
                break;
            case 'maintainers':
                $this->_packageInfo['maintainers'] = array();
                $this->m_i = 0; // maintainers array index
                break;
            case 'maintainer':
                // compatibility check
                if (!isset($this->_packageInfo['maintainers'])) {
                    $this->_packageInfo['maintainers'] = array();
                    $this->m_i = 0;
                }
                $this->_packageInfo['maintainers'][$this->m_i] = array();
                $this->current_maintainer =& $this->_packageInfo['maintainers'][$this->m_i];
                break;
            case 'changelog':
                $this->_packageInfo['changelog'] = array();
                $this->c_i = 0; // changelog array index
                $this->in_changelog = true;
                break;
            case 'release':
                if ($this->in_changelog) {
                    $this->_packageInfo['changelog'][$this->c_i] = array();
                    $this->current_release = &$this->_packageInfo['changelog'][$this->c_i];
                } else {
                    $this->current_release = &$this->_packageInfo;
                }
                break;
            case 'deps':
                if (!$this->in_changelog) {
                    $this->_packageInfo['release_deps'] = array();
                }
                break;
            case 'dep':
                // dependencies array index
                if (!$this->in_changelog) {
                    $this->d_i++;
                    isset($attribs['type']) ? ($attribs['type'] = strtolower($attribs['type'])) : false;
                    $this->_packageInfo['release_deps'][$this->d_i] = $attribs;
                }
                break;
            case 'configureoptions':
                if (!$this->in_changelog) {
                    $this->_packageInfo['configure_options'] = array();
                }
                break;
            case 'configureoption':
                if (!$this->in_changelog) {
                    $this->_packageInfo['configure_options'][] = $attribs;
                }
                break;
            case 'provides':
                if (empty($attribs['type']) || empty($attribs['name'])) {
                    break;
                }
                $attribs['explicit'] = true;
                $this->_packageInfo['provides']["$attribs[type];$attribs[name]"] = $attribs;
                break;
            case 'package' :
                if (isset($attribs['version'])) {
                    $this->_packageInfo['xsdversion'] = trim($attribs['version']);
                } else {
                    $this->_packageInfo['xsdversion'] = '1.0';
                }
                if (isset($attribs['packagerversion'])) {
                    $this->_packageInfo['packagerversion'] = $attribs['packagerversion'];
                }
                break;
        }
    }

    // }}}
    // {{{ _element_end_1_0()

    /**
     * XML parser callback for ending elements.  Used for version 1.0
     * packages.
     *
     * @param resource  $xp    XML parser resource
     * @param string    $name  name of ending element
     *
     * @return void
     *
     * @access private
     */
    function _element_end_1_0($xp, $name)
    {
        $data = trim($this->cdata);
        switch ($name) {
            case 'name':
                switch ($this->prev_element) {
                    case 'package':
                        $this->_packageInfo['package'] = $data;
                        break;
                    case 'maintainer':
                        $this->current_maintainer['name'] = $data;
                        break;
                }
                break;
            case 'extends' :
                $this->_packageInfo['extends'] = $data;
                break;
            case 'summary':
                $this->_packageInfo['summary'] = $data;
                break;
            case 'description':
                $data = $this->_unIndent($this->cdata);
                $this->_packageInfo['description'] = $data;
                break;
            case 'user':
                $this->current_maintainer['handle'] = $data;
                break;
            case 'email':
                $this->current_maintainer['email'] = $data;
                break;
            case 'role':
                $this->current_maintainer['role'] = $data;
                break;
            case 'version':
                if ($this->in_changelog) {
                    $this->current_release['version'] = $data;
                } else {
                    $this->_packageInfo['version'] = $data;
                }
                break;
            case 'date':
                if ($this->in_changelog) {
                    $this->current_release['release_date'] = $data;
                } else {
                    $this->_packageInfo['release_date'] = $data;
                }
                break;
            case 'notes':
                // try to "de-indent" release notes in case someone
                // has been over-indenting their xml ;-)
                // Trim only on the right side
                $data = rtrim($this->_unIndent($this->cdata));
                if ($this->in_changelog) {
                    $this->current_release['release_notes'] = $data;
                } else {
                    $this->_packageInfo['release_notes'] = $data;
                }
                break;
            case 'warnings':
                if ($this->in_changelog) {
                    $this->current_release['release_warnings'] = $data;
                } else {
                    $this->_packageInfo['release_warnings'] = $data;
                }
                break;
            case 'state':
                if ($this->in_changelog) {
                    $this->current_release['release_state'] = $data;
                } else {
                    $this->_packageInfo['release_state'] = $data;
                }
                break;
            case 'license':
                if ($this->in_changelog) {
                    $this->current_release['release_license'] = $data;
                } else {
                    $this->_packageInfo['release_license'] = $data;
                }
                break;
            case 'dep':
                if ($data && !$this->in_changelog) {
                    $this->_packageInfo['release_deps'][$this->d_i]['name'] = $data;
                }
                break;
            case 'dir':
                if ($this->in_changelog) {
                    break;
                }
                array_pop($this->dir_names);
                break;
            case 'file':
                if ($this->in_changelog) {
                    break;
                }
                if ($data) {
                    $path = '';
                    if (count($this->dir_names)) {
                        foreach ($this->dir_names as $dir) {
                            $path .= $dir . '/';
                        }
                    }
                    $path .= $data;
                    $this->filelist[$path] = $this->current_attributes;
                    // Set the baseinstalldir only if the file don't have this attrib
                    if (!isset($this->filelist[$path]['baseinstalldir']) &&
                        isset($this->dir_install))
                    {
                        $this->filelist[$path]['baseinstalldir'] = $this->dir_install;
                    }
                    // Set the Role
                    if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) {
                        $this->filelist[$path]['role'] = $this->dir_role;
                    }
                }
                break;
            case 'maintainer':
                if (empty($this->_packageInfo['maintainers'][$this->m_i]['role'])) {
                    $this->_packageInfo['maintainers'][$this->m_i]['role'] = 'lead';
                }
                $this->m_i++;
                break;
            case 'release':
                if ($this->in_changelog) {
                    $this->c_i++;
                }
                break;
            case 'changelog':
                $this->in_changelog = false;
                break;
        }
        array_pop($this->element_stack);
        $spos = sizeof($this->element_stack) - 1;
        $this->current_element = ($spos > 0) ? $this->element_stack[$spos] : '';
        $this->cdata = '';
    }

    // }}}
    // {{{ _pkginfo_cdata_1_0()

    /**
     * XML parser callback for character data.  Used for version 1.0
     * packages.
     *
     * @param resource  $xp    XML parser resource
     * @param string    $name  character data
     *
     * @return void
     *
     * @access private
     */
    function _pkginfo_cdata_1_0($xp, $data)
    {
        if (isset($this->cdata)) {
            $this->cdata .= $data;
        }
    }

    // }}}
}
?>PK�a�\��OWHH#pear/PEAR/PackageFile/Parser/v2.phpnu�[���<?php
/**
 * package.xml parsing class, package.xml version 2.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * base xml parser class
 */
require_once 'PEAR/XMLParser.php';
require_once 'PEAR/PackageFile/v2.php';
/**
 * Parser for package.xml version 2.0
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: @PEAR-VER@
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_Parser_v2 extends PEAR_XMLParser
{
    var $_config;
    var $_logger;
    var $_registry;

    function setConfig(&$c)
    {
        $this->_config = &$c;
        $this->_registry = &$c->getRegistry();
    }

    function setLogger(&$l)
    {
        $this->_logger = &$l;
    }
    /**
     * Unindent given string
     *
     * @param string $str The string that has to be unindented.
     * @return string
     * @access private
     */
    function _unIndent($str)
    {
        // remove leading newlines
        $str = preg_replace('/^[\r\n]+/', '', $str);
        // find whitespace at the beginning of the first line
        $indent_len = strspn($str, " \t");
        $indent = substr($str, 0, $indent_len);
        $data = '';
        // remove the same amount of whitespace from following lines
        foreach (explode("\n", $str) as $line) {
            if (substr($line, 0, $indent_len) == $indent) {
                $data .= substr($line, $indent_len) . "\n";
            } else {
                $data .= $line . "\n";
            }
        }
        return $data;
    }

    /**
     * post-process data
     *
     * @param string $data
     * @param string $element element name
     */
    function postProcess($data, $element)
    {
        if ($element == 'notes') {
            return trim($this->_unIndent($data));
        }
        return trim($data);
    }

    /**
     * @param string
     * @param string file name of the package.xml
     * @param string|false name of the archive this package.xml came from, if any
     * @param string class name to instantiate and return.  This must be PEAR_PackageFile_v2 or
     *               a subclass
     * @return PEAR_PackageFile_v2
     */
    function parse($data, $file = null, $archive = false, $class = 'PEAR_PackageFile_v2')
    {
        if (PEAR::isError($err = parent::parse($data))) {
            return $err;
        }

        $ret = new $class;
        $ret->encoding = $this->encoding;
        $ret->setConfig($this->_config);
        if (isset($this->_logger)) {
            $ret->setLogger($this->_logger);
        }

        $ret->fromArray($this->_unserializedData);
        $ret->setPackagefile($file, $archive);
        return $ret;
    }
}PK�a�\`�=����&pear/PEAR/PackageFile/Generator/v1.phpnu�[���<?php
/**
 * package.xml generation class, package.xml version 1.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * needed for PEAR_VALIDATE_* constants
 */
require_once 'PEAR/Validate.php';
require_once 'System.php';
require_once 'PEAR/PackageFile/v2.php';
/**
 * This class converts a PEAR_PackageFile_v1 object into any output format.
 *
 * Supported output formats include array, XML string, and a PEAR_PackageFile_v2
 * object, for converting package.xml 1.0 into package.xml 2.0 with no sweat.
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_Generator_v1
{
    /**
     * @var PEAR_PackageFile_v1
     */
    var $_packagefile;
    function __construct(&$packagefile)
    {
        $this->_packagefile = &$packagefile;
    }

    function getPackagerVersion()
    {
        return '1.10.16';
    }

    /**
     * @param PEAR_Packager
     * @param bool if true, a .tgz is written, otherwise a .tar is written
     * @param string|null directory in which to save the .tgz
     * @return string|PEAR_Error location of package or error object
     */
    function toTgz(&$packager, $compress = true, $where = null)
    {
        require_once 'Archive/Tar.php';
        if ($where === null) {
            if (!($where = System::mktemp(array('-d')))) {
                return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: mktemp failed');
            }
        } elseif (!@System::mkDir(array('-p', $where))) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: "' . $where . '" could' .
                ' not be created');
        }
        if (file_exists($where . DIRECTORY_SEPARATOR . 'package.xml') &&
              !is_file($where . DIRECTORY_SEPARATOR . 'package.xml')) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: unable to save package.xml as' .
                ' "' . $where . DIRECTORY_SEPARATOR . 'package.xml"');
        }
        if (!$this->_packagefile->validate(PEAR_VALIDATE_PACKAGING)) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: invalid package file');
        }
        $pkginfo = $this->_packagefile->getArray();
        $ext = $compress ? '.tgz' : '.tar';
        $pkgver = $pkginfo['package'] . '-' . $pkginfo['version'];
        $dest_package = getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext;
        if (file_exists(getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext) &&
              !is_file(getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext)) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: cannot create tgz file "' .
                getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext . '"');
        }
        if ($pkgfile = $this->_packagefile->getPackageFile()) {
            $pkgdir = dirname(realpath($pkgfile));
            $pkgfile = basename($pkgfile);
        } else {
            return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: package file object must ' .
                'be created from a real file');
        }
        // {{{ Create the package file list
        $filelist = array();
        $i = 0;

        foreach ($this->_packagefile->getFilelist() as $fname => $atts) {
            $file = $pkgdir . DIRECTORY_SEPARATOR . $fname;
            if (!file_exists($file)) {
                return PEAR::raiseError("File does not exist: $fname");
            } else {
                $filelist[$i++] = $file;
                if (!isset($atts['md5sum'])) {
                    $this->_packagefile->setFileAttribute($fname, 'md5sum', md5_file($file));
                }
                $packager->log(2, "Adding file $fname");
            }
        }
        // }}}
        $packagexml = $this->toPackageFile($where, PEAR_VALIDATE_PACKAGING, 'package.xml', true);
        if ($packagexml) {
            $tar = new Archive_Tar($dest_package, $compress);
            $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors
            // ----- Creates with the package.xml file
            $ok = $tar->createModify(array($packagexml), '', $where);
            if (PEAR::isError($ok)) {
                return $ok;
            } elseif (!$ok) {
                return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: tarball creation failed');
            }
            // ----- Add the content of the package
            if (!$tar->addModify($filelist, $pkgver, $pkgdir)) {
                return PEAR::raiseError('PEAR_Packagefile_v1::toTgz: tarball creation failed');
            }
            return $dest_package;
        }
    }

    /**
     * @param string|null directory to place the package.xml in, or null for a temporary dir
     * @param int one of the PEAR_VALIDATE_* constants
     * @param string name of the generated file
     * @param bool if true, then no analysis will be performed on role="php" files
     * @return string|PEAR_Error path to the created file on success
     */
    function toPackageFile($where = null, $state = PEAR_VALIDATE_NORMAL, $name = 'package.xml',
                           $nofilechecking = false)
    {
        if (!$this->_packagefile->validate($state, $nofilechecking)) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: invalid package.xml',
                null, null, null, $this->_packagefile->getValidationWarnings());
        }
        if ($where === null) {
            if (!($where = System::mktemp(array('-d')))) {
                return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: mktemp failed');
            }
        } elseif (!@System::mkDir(array('-p', $where))) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: "' . $where . '" could' .
                ' not be created');
        }
        $newpkgfile = $where . DIRECTORY_SEPARATOR . $name;
        $np = @fopen($newpkgfile, 'wb');
        if (!$np) {
            return PEAR::raiseError('PEAR_Packagefile_v1::toPackageFile: unable to save ' .
               "$name as $newpkgfile");
        }
        fwrite($np, $this->toXml($state, true));
        fclose($np);
        return $newpkgfile;
    }

    /**
     * fix both XML encoding to be UTF8, and replace standard XML entities < > " & '
     *
     * @param string $string
     * @return string
     * @access private
     */
    function _fixXmlEncoding($string)
    {
        return strtr($string, array(
                                          '&'  => '&amp;',
                                          '>'  => '&gt;',
                                          '<'  => '&lt;',
                                          '"'  => '&quot;',
                                          '\'' => '&apos;' ));
    }

    /**
     * Return an XML document based on the package info (as returned
     * by the PEAR_Common::infoFrom* methods).
     *
     * @return string XML data
     */
    function toXml($state = PEAR_VALIDATE_NORMAL, $nofilevalidation = false)
    {
        $this->_packagefile->setDate(date('Y-m-d'));
        if (!$this->_packagefile->validate($state, $nofilevalidation)) {
            return false;
        }
        $pkginfo = $this->_packagefile->getArray();
        static $maint_map = array(
            "handle" => "user",
            "name" => "name",
            "email" => "email",
            "role" => "role",
            );
        $ret = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
        $ret .= "<!DOCTYPE package SYSTEM \"http://pear.php.net/dtd/package-1.0\">\n";
        $ret .= "<package version=\"1.0\" packagerversion=\"1.10.16\">\n" .
" <name>$pkginfo[package]</name>";
        if (isset($pkginfo['extends'])) {
            $ret .= "\n<extends>$pkginfo[extends]</extends>";
        }
        $ret .=
 "\n <summary>".$this->_fixXmlEncoding($pkginfo['summary'])."</summary>\n" .
" <description>".trim($this->_fixXmlEncoding($pkginfo['description']))."\n </description>\n" .
" <maintainers>\n";
        foreach ($pkginfo['maintainers'] as $maint) {
            $ret .= "  <maintainer>\n";
            foreach ($maint_map as $idx => $elm) {
                $ret .= "   <$elm>";
                $ret .= $this->_fixXmlEncoding($maint[$idx]);
                $ret .= "</$elm>\n";
            }
            $ret .= "  </maintainer>\n";
        }
        $ret .= "  </maintainers>\n";
        $ret .= $this->_makeReleaseXml($pkginfo, false, $state);
        if (isset($pkginfo['changelog']) && count($pkginfo['changelog']) > 0) {
            $ret .= " <changelog>\n";
            foreach ($pkginfo['changelog'] as $oldrelease) {
                $ret .= $this->_makeReleaseXml($oldrelease, true);
            }
            $ret .= " </changelog>\n";
        }
        $ret .= "</package>\n";
        return $ret;
    }

    // }}}
    // {{{ _makeReleaseXml()

    /**
     * Generate part of an XML description with release information.
     *
     * @param array  $pkginfo    array with release information
     * @param bool   $changelog  whether the result will be in a changelog element
     *
     * @return string XML data
     *
     * @access private
     */
    function _makeReleaseXml($pkginfo, $changelog = false, $state = PEAR_VALIDATE_NORMAL)
    {
        // XXX QUOTE ENTITIES IN PCDATA, OR EMBED IN CDATA BLOCKS!!
        $indent = $changelog ? "  " : "";
        $ret = "$indent <release>\n";
        if (!empty($pkginfo['version'])) {
            $ret .= "$indent  <version>$pkginfo[version]</version>\n";
        }
        if (!empty($pkginfo['release_date'])) {
            $ret .= "$indent  <date>$pkginfo[release_date]</date>\n";
        }
        if (!empty($pkginfo['release_license'])) {
            $ret .= "$indent  <license>$pkginfo[release_license]</license>\n";
        }
        if (!empty($pkginfo['release_state'])) {
            $ret .= "$indent  <state>$pkginfo[release_state]</state>\n";
        }
        if (!empty($pkginfo['release_notes'])) {
            $ret .= "$indent  <notes>".trim($this->_fixXmlEncoding($pkginfo['release_notes']))
            ."\n$indent  </notes>\n";
        }
        if (!empty($pkginfo['release_warnings'])) {
            $ret .= "$indent  <warnings>".$this->_fixXmlEncoding($pkginfo['release_warnings'])."</warnings>\n";
        }
        if (isset($pkginfo['release_deps']) && sizeof($pkginfo['release_deps']) > 0) {
            $ret .= "$indent  <deps>\n";
            foreach ($pkginfo['release_deps'] as $dep) {
                $ret .= "$indent   <dep type=\"$dep[type]\" rel=\"$dep[rel]\"";
                if (isset($dep['version'])) {
                    $ret .= " version=\"$dep[version]\"";
                }
                if (isset($dep['optional'])) {
                    $ret .= " optional=\"$dep[optional]\"";
                }
                if (isset($dep['name'])) {
                    $ret .= ">$dep[name]</dep>\n";
                } else {
                    $ret .= "/>\n";
                }
            }
            $ret .= "$indent  </deps>\n";
        }
        if (isset($pkginfo['configure_options'])) {
            $ret .= "$indent  <configureoptions>\n";
            foreach ($pkginfo['configure_options'] as $c) {
                $ret .= "$indent   <configureoption name=\"".
                    $this->_fixXmlEncoding($c['name']) . "\"";
                if (isset($c['default'])) {
                    $ret .= " default=\"" . $this->_fixXmlEncoding($c['default']) . "\"";
                }
                $ret .= " prompt=\"" . $this->_fixXmlEncoding($c['prompt']) . "\"";
                $ret .= "/>\n";
            }
            $ret .= "$indent  </configureoptions>\n";
        }
        if (isset($pkginfo['provides'])) {
            foreach ($pkginfo['provides'] as $key => $what) {
                $ret .= "$indent  <provides type=\"$what[type]\" ";
                $ret .= "name=\"$what[name]\" ";
                if (isset($what['extends'])) {
                    $ret .= "extends=\"$what[extends]\" ";
                }
                $ret .= "/>\n";
            }
        }
        if (isset($pkginfo['filelist'])) {
            $ret .= "$indent  <filelist>\n";
            if ($state ^ PEAR_VALIDATE_PACKAGING) {
                $ret .= $this->recursiveXmlFilelist($pkginfo['filelist']);
            } else {
                foreach ($pkginfo['filelist'] as $file => $fa) {
                    if (!isset($fa['role'])) {
                        $fa['role'] = '';
                    }
                    $ret .= "$indent   <file role=\"$fa[role]\"";
                    if (isset($fa['baseinstalldir'])) {
                        $ret .= ' baseinstalldir="' .
                            $this->_fixXmlEncoding($fa['baseinstalldir']) . '"';
                    }
                    if (isset($fa['md5sum'])) {
                        $ret .= " md5sum=\"$fa[md5sum]\"";
                    }
                    if (isset($fa['platform'])) {
                        $ret .= " platform=\"$fa[platform]\"";
                    }
                    if (!empty($fa['install-as'])) {
                        $ret .= ' install-as="' .
                            $this->_fixXmlEncoding($fa['install-as']) . '"';
                    }
                    $ret .= ' name="' . $this->_fixXmlEncoding($file) . '"';
                    if (empty($fa['replacements'])) {
                        $ret .= "/>\n";
                    } else {
                        $ret .= ">\n";
                        foreach ($fa['replacements'] as $r) {
                            $ret .= "$indent    <replace";
                            foreach ($r as $k => $v) {
                                $ret .= " $k=\"" . $this->_fixXmlEncoding($v) .'"';
                            }
                            $ret .= "/>\n";
                        }
                        $ret .= "$indent   </file>\n";
                    }
                }
            }
            $ret .= "$indent  </filelist>\n";
        }
        $ret .= "$indent </release>\n";
        return $ret;
    }

    /**
     * @param array
     * @access protected
     */
    function recursiveXmlFilelist($list)
    {
        $this->_dirs = array();
        foreach ($list as $file => $attributes) {
            $this->_addDir($this->_dirs, explode('/', dirname($file)), $file, $attributes);
        }
        return $this->_formatDir($this->_dirs);
    }

    /**
     * @param array
     * @param array
     * @param string|null
     * @param array|null
     * @access private
     */
    function _addDir(&$dirs, $dir, $file = null, $attributes = null)
    {
        if ($dir == array() || $dir == array('.')) {
            $dirs['files'][basename($file)] = $attributes;
            return;
        }
        $curdir = array_shift($dir);
        if (!isset($dirs['dirs'][$curdir])) {
            $dirs['dirs'][$curdir] = array();
        }
        $this->_addDir($dirs['dirs'][$curdir], $dir, $file, $attributes);
    }

    /**
     * @param array
     * @param string
     * @param string
     * @access private
     */
    function _formatDir($dirs, $indent = '', $curdir = '')
    {
        $ret = '';
        if (!count($dirs)) {
            return '';
        }
        if (isset($dirs['dirs'])) {
            uksort($dirs['dirs'], 'strnatcasecmp');
            foreach ($dirs['dirs'] as $dir => $contents) {
                $usedir = "$curdir/$dir";
                $ret .= "$indent   <dir name=\"$dir\">\n";
                $ret .= $this->_formatDir($contents, "$indent ", $usedir);
                $ret .= "$indent   </dir> <!-- $usedir -->\n";
            }
        }
        if (isset($dirs['files'])) {
            uksort($dirs['files'], 'strnatcasecmp');
            foreach ($dirs['files'] as $file => $attribs) {
                $ret .= $this->_formatFile($file, $attribs, $indent);
            }
        }
        return $ret;
    }

    /**
     * @param string
     * @param array
     * @param string
     * @access private
     */
    function _formatFile($file, $attributes, $indent)
    {
        $ret = "$indent   <file role=\"$attributes[role]\"";
        if (isset($attributes['baseinstalldir'])) {
            $ret .= ' baseinstalldir="' .
                $this->_fixXmlEncoding($attributes['baseinstalldir']) . '"';
        }
        if (isset($attributes['md5sum'])) {
            $ret .= " md5sum=\"$attributes[md5sum]\"";
        }
        if (isset($attributes['platform'])) {
            $ret .= " platform=\"$attributes[platform]\"";
        }
        if (!empty($attributes['install-as'])) {
            $ret .= ' install-as="' .
                $this->_fixXmlEncoding($attributes['install-as']) . '"';
        }
        $ret .= ' name="' . $this->_fixXmlEncoding($file) . '"';
        if (empty($attributes['replacements'])) {
            $ret .= "/>\n";
        } else {
            $ret .= ">\n";
            foreach ($attributes['replacements'] as $r) {
                $ret .= "$indent    <replace";
                foreach ($r as $k => $v) {
                    $ret .= " $k=\"" . $this->_fixXmlEncoding($v) .'"';
                }
                $ret .= "/>\n";
            }
            $ret .= "$indent   </file>\n";
        }
        return $ret;
    }

    // {{{ _unIndent()

    /**
     * Unindent given string (?)
     *
     * @param string $str The string that has to be unindented.
     * @return string
     * @access private
     */
    function _unIndent($str)
    {
        // remove leading newlines
        $str = preg_replace('/^[\r\n]+/', '', $str);
        // find whitespace at the beginning of the first line
        $indent_len = strspn($str, " \t");
        $indent = substr($str, 0, $indent_len);
        $data = '';
        // remove the same amount of whitespace from following lines
        foreach (explode("\n", $str) as $line) {
            if (substr($line, 0, $indent_len) == $indent) {
                $data .= substr($line, $indent_len) . "\n";
            }
        }
        return $data;
    }

    /**
     * @return array
     */
    function dependenciesToV2()
    {
        $arr = array();
        $this->_convertDependencies2_0($arr);
        return $arr['dependencies'];
    }

    /**
     * Convert a package.xml version 1.0 into version 2.0
     *
     * Note that this does a basic conversion, to allow more advanced
     * features like bundles and multiple releases
     * @param string the classname to instantiate and return.  This must be
     *               PEAR_PackageFile_v2 or a descendant
     * @param boolean if true, only valid, deterministic package.xml 1.0 as defined by the
     *                strictest parameters will be converted
     * @return PEAR_PackageFile_v2|PEAR_Error
     */
    function &toV2($class = 'PEAR_PackageFile_v2', $strict = false)
    {
        if ($strict) {
            if (!$this->_packagefile->validate()) {
                $a = PEAR::raiseError('invalid package.xml version 1.0 cannot be converted' .
                    ' to version 2.0', null, null, null,
                    $this->_packagefile->getValidationWarnings(true));
                return $a;
            }
        }

        $arr = array(
            'attribs' => array(
                             'version' => '2.0',
                             'xmlns' => 'http://pear.php.net/dtd/package-2.0',
                             'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0',
                             'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
                             'xsi:schemaLocation' => "http://pear.php.net/dtd/tasks-1.0\n" .
"http://pear.php.net/dtd/tasks-1.0.xsd\n" .
"http://pear.php.net/dtd/package-2.0\n" .
'http://pear.php.net/dtd/package-2.0.xsd',
                         ),
            'name' => $this->_packagefile->getPackage(),
            'channel' => 'pear.php.net',
        );
        $arr['summary'] = $this->_packagefile->getSummary();
        $arr['description'] = $this->_packagefile->getDescription();
        $maintainers = $this->_packagefile->getMaintainers();
        foreach ($maintainers as $maintainer) {
            if ($maintainer['role'] != 'lead') {
                continue;
            }
            $new = array(
                'name' => $maintainer['name'],
                'user' => $maintainer['handle'],
                'email' => $maintainer['email'],
                'active' => 'yes',
            );
            $arr['lead'][] = $new;
        }

        if (!isset($arr['lead'])) { // some people... you know?
            $arr['lead'] = array(
                'name' => 'unknown',
                'user' => 'unknown',
                'email' => 'noleadmaintainer@example.com',
                'active' => 'no',
            );
        }

        if (count($arr['lead']) == 1) {
            $arr['lead'] = $arr['lead'][0];
        }

        foreach ($maintainers as $maintainer) {
            if ($maintainer['role'] == 'lead') {
                continue;
            }
            $new = array(
                'name' => $maintainer['name'],
                'user' => $maintainer['handle'],
                'email' => $maintainer['email'],
                'active' => 'yes',
            );
            $arr[$maintainer['role']][] = $new;
        }

        if (isset($arr['developer']) && count($arr['developer']) == 1) {
            $arr['developer'] = $arr['developer'][0];
        }

        if (isset($arr['contributor']) && count($arr['contributor']) == 1) {
            $arr['contributor'] = $arr['contributor'][0];
        }

        if (isset($arr['helper']) && count($arr['helper']) == 1) {
            $arr['helper'] = $arr['helper'][0];
        }

        $arr['date'] = $this->_packagefile->getDate();
        $arr['version'] =
            array(
                'release' => $this->_packagefile->getVersion(),
                'api' => $this->_packagefile->getVersion(),
            );
        $arr['stability'] =
            array(
                'release' => $this->_packagefile->getState(),
                'api' => $this->_packagefile->getState(),
            );
        $licensemap =
            array(
                'php' => 'http://www.php.net/license',
                'php license' => 'http://www.php.net/license',
                'lgpl' => 'http://www.gnu.org/copyleft/lesser.html',
                'bsd' => 'http://www.opensource.org/licenses/bsd-license.php',
                'bsd style' => 'http://www.opensource.org/licenses/bsd-license.php',
                'bsd-style' => 'http://www.opensource.org/licenses/bsd-license.php',
                'mit' => 'http://www.opensource.org/licenses/mit-license.php',
                'gpl' => 'http://www.gnu.org/copyleft/gpl.html',
                'apache' => 'http://www.opensource.org/licenses/apache2.0.php'
            );

        if (isset($licensemap[strtolower($this->_packagefile->getLicense())])) {
            $arr['license'] = array(
                'attribs' => array('uri' =>
                    $licensemap[strtolower($this->_packagefile->getLicense())]),
                '_content' => $this->_packagefile->getLicense()
                );
        } else {
            // don't use bogus uri
            $arr['license'] = $this->_packagefile->getLicense();
        }

        $arr['notes'] = $this->_packagefile->getNotes();
        $temp = array();
        $arr['contents'] = $this->_convertFilelist2_0($temp);
        $this->_convertDependencies2_0($arr);
        $release = ($this->_packagefile->getConfigureOptions() || $this->_isExtension) ?
            'extsrcrelease' : 'phprelease';
        if ($release == 'extsrcrelease') {
            $arr['channel'] = 'pecl.php.net';
            $arr['providesextension'] = $arr['name']; // assumption
        }

        $arr[$release] = array();
        if ($this->_packagefile->getConfigureOptions()) {
            $arr[$release]['configureoption'] = $this->_packagefile->getConfigureOptions();
            foreach ($arr[$release]['configureoption'] as $i => $opt) {
                $arr[$release]['configureoption'][$i] = array('attribs' => $opt);
            }
            if (count($arr[$release]['configureoption']) == 1) {
                $arr[$release]['configureoption'] = $arr[$release]['configureoption'][0];
            }
        }

        $this->_convertRelease2_0($arr[$release], $temp);
        if ($release == 'extsrcrelease' && count($arr[$release]) > 1) {
            // multiple extsrcrelease tags added in PEAR 1.4.1
            $arr['dependencies']['required']['pearinstaller']['min'] = '1.4.1';
        }

        if ($cl = $this->_packagefile->getChangelog()) {
            foreach ($cl as $release) {
                $rel = array();
                $rel['version'] =
                    array(
                        'release' => $release['version'],
                        'api' => $release['version'],
                    );
                if (!isset($release['release_state'])) {
                    $release['release_state'] = 'stable';
                }

                $rel['stability'] =
                    array(
                        'release' => $release['release_state'],
                        'api' => $release['release_state'],
                    );
                if (isset($release['release_date'])) {
                    $rel['date'] = $release['release_date'];
                } else {
                    $rel['date'] = date('Y-m-d');
                }

                if (isset($release['release_license'])) {
                    if (isset($licensemap[strtolower($release['release_license'])])) {
                        $uri = $licensemap[strtolower($release['release_license'])];
                    } else {
                        $uri = 'http://www.example.com';
                    }
                    $rel['license'] = array(
                            'attribs' => array('uri' => $uri),
                            '_content' => $release['release_license']
                        );
                } else {
                    $rel['license'] = $arr['license'];
                }

                if (!isset($release['release_notes'])) {
                    $release['release_notes'] = 'no release notes';
                }

                $rel['notes'] = $release['release_notes'];
                $arr['changelog']['release'][] = $rel;
            }
        }

        $ret = new $class;
        $ret->setConfig($this->_packagefile->_config);
        if (isset($this->_packagefile->_logger) && is_object($this->_packagefile->_logger)) {
            $ret->setLogger($this->_packagefile->_logger);
        }

        $ret->fromArray($arr);
        return $ret;
    }

    /**
     * @param array
     * @param bool
     * @access private
     */
    function _convertDependencies2_0(&$release, $internal = false)
    {
        $peardep = array('pearinstaller' =>
            array('min' => '1.4.0b1')); // this is a lot safer
        $required = $optional = array();
        $release['dependencies'] = array('required' => array());
        if ($this->_packagefile->hasDeps()) {
            foreach ($this->_packagefile->getDeps() as $dep) {
                if (!isset($dep['optional']) || $dep['optional'] == 'no') {
                    $required[] = $dep;
                } else {
                    $optional[] = $dep;
                }
            }
            foreach (array('required', 'optional') as $arr) {
                $deps = array();
                foreach ($$arr as $dep) {
                    // organize deps by dependency type and name
                    if (!isset($deps[$dep['type']])) {
                        $deps[$dep['type']] = array();
                    }
                    if (isset($dep['name'])) {
                        $deps[$dep['type']][$dep['name']][] = $dep;
                    } else {
                        $deps[$dep['type']][] = $dep;
                    }
                }
                do {
                    if (isset($deps['php'])) {
                        $php = array();
                        if (count($deps['php']) > 1) {
                            $php = $this->_processPhpDeps($deps['php']);
                        } else {
                            if (!isset($deps['php'][0])) {
                                // Buggy versions
                                $key = key($deps['php']);
                                $info = current($deps['php']);
                                $deps['php'] = array($info[0]);
                            }
                            $php = $this->_processDep($deps['php'][0]);
                            if (!$php) {
                                break; // poor mans throw
                            }
                        }
                        $release['dependencies'][$arr]['php'] = $php;
                    }
                } while (false);
                do {
                    if (isset($deps['pkg'])) {
                        $pkg = array();
                        $pkg = $this->_processMultipleDepsName($deps['pkg']);
                        if (!$pkg) {
                            break; // poor mans throw
                        }
                        $release['dependencies'][$arr]['package'] = $pkg;
                    }
                } while (false);
                do {
                    if (isset($deps['ext'])) {
                        $pkg = array();
                        $pkg = $this->_processMultipleDepsName($deps['ext']);
                        $release['dependencies'][$arr]['extension'] = $pkg;
                    }
                } while (false);
                // skip sapi - it's not supported so nobody will have used it
                // skip os - it's not supported in 1.0
            }
        }
        if (isset($release['dependencies']['required'])) {
            $release['dependencies']['required'] =
                array_merge($peardep, $release['dependencies']['required']);
        } else {
            $release['dependencies']['required'] = $peardep;
        }
        if (!isset($release['dependencies']['required']['php'])) {
            $release['dependencies']['required']['php'] =
                array('min' => '4.0.0');
        }
        $order = array();
        $bewm = $release['dependencies']['required'];
        $order['php'] = $bewm['php'];
        $order['pearinstaller'] = $bewm['pearinstaller'];
        isset($bewm['package']) ? $order['package'] = $bewm['package'] :0;
        isset($bewm['extension']) ? $order['extension'] = $bewm['extension'] :0;
        $release['dependencies']['required'] = $order;
    }

    /**
     * @param array
     * @access private
     */
    function _convertFilelist2_0(&$package)
    {
        $ret = array('dir' =>
                    array(
                        'attribs' => array('name' => '/'),
                        'file' => array()
                        )
                    );
        $package['platform'] =
        $package['install-as'] = array();
        $this->_isExtension = false;
        foreach ($this->_packagefile->getFilelist() as $name => $file) {
            $file['name'] = $name;
            if (isset($file['role']) && $file['role'] == 'src') {
                $this->_isExtension = true;
            }
            if (isset($file['replacements'])) {
                $repl = $file['replacements'];
                unset($file['replacements']);
            } else {
                unset($repl);
            }
            if (isset($file['install-as'])) {
                $package['install-as'][$name] = $file['install-as'];
                unset($file['install-as']);
            }
            if (isset($file['platform'])) {
                $package['platform'][$name] = $file['platform'];
                unset($file['platform']);
            }
            $file = array('attribs' => $file);
            if (isset($repl)) {
                foreach ($repl as $replace ) {
                    $file['tasks:replace'][] = array('attribs' => $replace);
                }
                if (count($repl) == 1) {
                    $file['tasks:replace'] = $file['tasks:replace'][0];
                }
            }
            $ret['dir']['file'][] = $file;
        }
        return $ret;
    }

    /**
     * Post-process special files with install-as/platform attributes and
     * make the release tag.
     *
     * This complex method follows this work-flow to create the release tags:
     *
     * <pre>
     * - if any install-as/platform exist, create a generic release and fill it with
     *   o <install as=..> tags for <file name=... install-as=...>
     *   o <install as=..> tags for <file name=... platform=!... install-as=..>
     *   o <ignore> tags for <file name=... platform=...>
     *   o <ignore> tags for <file name=... platform=... install-as=..>
     * - create a release for each platform encountered and fill with
     *   o <install as..> tags for <file name=... install-as=...>
     *   o <install as..> tags for <file name=... platform=this platform install-as=..>
     *   o <install as..> tags for <file name=... platform=!other platform install-as=..>
     *   o <ignore> tags for <file name=... platform=!this platform>
     *   o <ignore> tags for <file name=... platform=other platform>
     *   o <ignore> tags for <file name=... platform=other platform install-as=..>
     *   o <ignore> tags for <file name=... platform=!this platform install-as=..>
     * </pre>
     *
     * It does this by accessing the $package parameter, which contains an array with
     * indices:
     *
     *  - platform: mapping of file => OS the file should be installed on
     *  - install-as: mapping of file => installed name
     *  - osmap: mapping of OS => list of files that should be installed
     *    on that OS
     *  - notosmap: mapping of OS => list of files that should not be
     *    installed on that OS
     *
     * @param array
     * @param array
     * @access private
     */
    function _convertRelease2_0(&$release, $package)
    {
        //- if any install-as/platform exist, create a generic release and fill it with
        if (count($package['platform']) || count($package['install-as'])) {
            $generic = array();
            $genericIgnore = array();
            foreach ($package['install-as'] as $file => $as) {
                //o <install as=..> tags for <file name=... install-as=...>
                if (!isset($package['platform'][$file])) {
                    $generic[] = $file;
                    continue;
                }
                //o <install as=..> tags for <file name=... platform=!... install-as=..>
                if (isset($package['platform'][$file]) &&
                      $package['platform'][$file][0] == '!') {
                    $generic[] = $file;
                    continue;
                }
                //o <ignore> tags for <file name=... platform=... install-as=..>
                if (isset($package['platform'][$file]) &&
                      $package['platform'][$file][0] != '!') {
                    $genericIgnore[] = $file;
                    continue;
                }
            }
            foreach ($package['platform'] as $file => $platform) {
                if (isset($package['install-as'][$file])) {
                    continue;
                }
                if ($platform[0] != '!') {
                    //o <ignore> tags for <file name=... platform=...>
                    $genericIgnore[] = $file;
                }
            }
            if (count($package['platform'])) {
                $oses = $notplatform = $platform = array();
                foreach ($package['platform'] as $file => $os) {
                    // get a list of oses
                    if ($os[0] == '!') {
                        if (isset($oses[substr($os, 1)])) {
                            continue;
                        }
                        $oses[substr($os, 1)] = count($oses);
                    } else {
                        if (isset($oses[$os])) {
                            continue;
                        }
                        $oses[$os] = count($oses);
                    }
                }
                //- create a release for each platform encountered and fill with
                foreach ($oses as $os => $releaseNum) {
                    $release[$releaseNum]['installconditions']['os']['name'] = $os;
                    $release[$releaseNum]['filelist'] = array('install' => array(),
                        'ignore' => array());
                    foreach ($package['install-as'] as $file => $as) {
                        //o <install as=..> tags for <file name=... install-as=...>
                        if (!isset($package['platform'][$file])) {
                            $release[$releaseNum]['filelist']['install'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                        'as' => $as,
                                    ),
                                );
                            continue;
                        }
                        //o <install as..> tags for
                        //  <file name=... platform=this platform install-as=..>
                        if (isset($package['platform'][$file]) &&
                              $package['platform'][$file] == $os) {
                            $release[$releaseNum]['filelist']['install'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                        'as' => $as,
                                    ),
                                );
                            continue;
                        }
                        //o <install as..> tags for
                        //  <file name=... platform=!other platform install-as=..>
                        if (isset($package['platform'][$file]) &&
                              $package['platform'][$file] != "!$os" &&
                              $package['platform'][$file][0] == '!') {
                            $release[$releaseNum]['filelist']['install'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                        'as' => $as,
                                    ),
                                );
                            continue;
                        }
                        //o <ignore> tags for
                        //  <file name=... platform=!this platform install-as=..>
                        if (isset($package['platform'][$file]) &&
                              $package['platform'][$file] == "!$os") {
                            $release[$releaseNum]['filelist']['ignore'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                    ),
                                );
                            continue;
                        }
                        //o <ignore> tags for
                        //  <file name=... platform=other platform install-as=..>
                        if (isset($package['platform'][$file]) &&
                              $package['platform'][$file][0] != '!' &&
                              $package['platform'][$file] != $os) {
                            $release[$releaseNum]['filelist']['ignore'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                    ),
                                );
                            continue;
                        }
                    }
                    foreach ($package['platform'] as $file => $platform) {
                        if (isset($package['install-as'][$file])) {
                            continue;
                        }
                        //o <ignore> tags for <file name=... platform=!this platform>
                        if ($platform == "!$os") {
                            $release[$releaseNum]['filelist']['ignore'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                    ),
                                );
                            continue;
                        }
                        //o <ignore> tags for <file name=... platform=other platform>
                        if ($platform[0] != '!' && $platform != $os) {
                            $release[$releaseNum]['filelist']['ignore'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                    ),
                                );
                        }
                    }
                    if (!count($release[$releaseNum]['filelist']['install'])) {
                        unset($release[$releaseNum]['filelist']['install']);
                    }
                    if (!count($release[$releaseNum]['filelist']['ignore'])) {
                        unset($release[$releaseNum]['filelist']['ignore']);
                    }
                }
                if (count($generic) || count($genericIgnore)) {
                    $release[count($oses)] = array();
                    if (count($generic)) {
                        foreach ($generic as $file) {
                            if (isset($package['install-as'][$file])) {
                                $installas = $package['install-as'][$file];
                            } else {
                                $installas = $file;
                            }
                            $release[count($oses)]['filelist']['install'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                        'as' => $installas,
                                    )
                                );
                        }
                    }
                    if (count($genericIgnore)) {
                        foreach ($genericIgnore as $file) {
                            $release[count($oses)]['filelist']['ignore'][] =
                                array(
                                    'attribs' => array(
                                        'name' => $file,
                                    )
                                );
                        }
                    }
                }
                // cleanup
                foreach ($release as $i => $rel) {
                    if (isset($rel['filelist']['install']) &&
                          count($rel['filelist']['install']) == 1) {
                        $release[$i]['filelist']['install'] =
                            $release[$i]['filelist']['install'][0];
                    }
                    if (isset($rel['filelist']['ignore']) &&
                          count($rel['filelist']['ignore']) == 1) {
                        $release[$i]['filelist']['ignore'] =
                            $release[$i]['filelist']['ignore'][0];
                    }
                }
                if (count($release) == 1) {
                    $release = $release[0];
                }
            } else {
                // no platform atts, but some install-as atts
                foreach ($package['install-as'] as $file => $value) {
                    $release['filelist']['install'][] =
                        array(
                            'attribs' => array(
                                'name' => $file,
                                'as' => $value
                            )
                        );
                }
                if (count($release['filelist']['install']) == 1) {
                    $release['filelist']['install'] = $release['filelist']['install'][0];
                }
            }
        }
    }

    /**
     * @param array
     * @return array
     * @access private
     */
    function _processDep($dep)
    {
        if ($dep['type'] == 'php') {
            if ($dep['rel'] == 'has') {
                // come on - everyone has php!
                return false;
            }
        }
        $php = array();
        if ($dep['type'] != 'php') {
            $php['name'] = $dep['name'];
            if ($dep['type'] == 'pkg') {
                $php['channel'] = 'pear.php.net';
            }
        }
        switch ($dep['rel']) {
            case 'gt' :
                $php['min'] = $dep['version'];
                $php['exclude'] = $dep['version'];
            break;
            case 'ge' :
                if (!isset($dep['version'])) {
                    if ($dep['type'] == 'php') {
                        if (isset($dep['name'])) {
                            $dep['version'] = $dep['name'];
                        }
                    }
                }
                $php['min'] = $dep['version'];
            break;
            case 'lt' :
                $php['max'] = $dep['version'];
                $php['exclude'] = $dep['version'];
            break;
            case 'le' :
                $php['max'] = $dep['version'];
            break;
            case 'eq' :
                $php['min'] = $dep['version'];
                $php['max'] = $dep['version'];
            break;
            case 'ne' :
                $php['exclude'] = $dep['version'];
            break;
            case 'not' :
                $php['conflicts'] = 'yes';
            break;
        }
        return $php;
    }

    /**
     * @param array
     * @return array
     */
    function _processPhpDeps($deps)
    {
        $test = array();
        foreach ($deps as $dep) {
            $test[] = $this->_processDep($dep);
        }
        $min = array();
        $max = array();
        foreach ($test as $dep) {
            if (!$dep) {
                continue;
            }
            if (isset($dep['min'])) {
                $min[$dep['min']] = count($min);
            }
            if (isset($dep['max'])) {
                $max[$dep['max']] = count($max);
            }
        }
        if (count($min) > 0) {
            uksort($min, 'version_compare');
        }
        if (count($max) > 0) {
            uksort($max, 'version_compare');
        }
        if (count($min)) {
            // get the highest minimum
            $a = array_flip($min);
            $min = array_pop($a);
        } else {
            $min = false;
        }
        if (count($max)) {
            // get the lowest maximum
            $a = array_flip($max);
            $max = array_shift($a);
        } else {
            $max = false;
        }
        if ($min) {
            $php['min'] = $min;
        }
        if ($max) {
            $php['max'] = $max;
        }
        $exclude = array();
        foreach ($test as $dep) {
            if (!isset($dep['exclude'])) {
                continue;
            }
            $exclude[] = $dep['exclude'];
        }
        if (count($exclude)) {
            $php['exclude'] = $exclude;
        }
        return $php;
    }

    /**
     * process multiple dependencies that have a name, like package deps
     * @param array
     * @return array
     * @access private
     */
    function _processMultipleDepsName($deps)
    {
        $ret = $tests = array();
        foreach ($deps as $name => $dep) {
            foreach ($dep as $d) {
                $tests[$name][] = $this->_processDep($d);
            }
        }

        foreach ($tests as $name => $test) {
            $max = $min = $php = array();
            $php['name'] = $name;
            foreach ($test as $dep) {
                if (!$dep) {
                    continue;
                }
                if (isset($dep['channel'])) {
                    $php['channel'] = 'pear.php.net';
                }
                if (isset($dep['conflicts']) && $dep['conflicts'] == 'yes') {
                    $php['conflicts'] = 'yes';
                }
                if (isset($dep['min'])) {
                    $min[$dep['min']] = count($min);
                }
                if (isset($dep['max'])) {
                    $max[$dep['max']] = count($max);
                }
            }
            if (count($min) > 0) {
                uksort($min, 'version_compare');
            }
            if (count($max) > 0) {
                uksort($max, 'version_compare');
            }
            if (count($min)) {
                // get the highest minimum
                $a = array_flip($min);
                $min = array_pop($a);
            } else {
                $min = false;
            }
            if (count($max)) {
                // get the lowest maximum
                $a = array_flip($max);
                $max = array_shift($a);
            } else {
                $max = false;
            }
            if ($min) {
                $php['min'] = $min;
            }
            if ($max) {
                $php['max'] = $max;
            }
            $exclude = array();
            foreach ($test as $dep) {
                if (!isset($dep['exclude'])) {
                    continue;
                }
                $exclude[] = $dep['exclude'];
            }
            if (count($exclude)) {
                $php['exclude'] = $exclude;
            }
            $ret[] = $php;
        }
        return $ret;
    }
}
?>
PK�a�\�ɁɁ&pear/PEAR/PackageFile/Generator/v2.phpnu�[���<?php
/**
 * package.xml generation class, package.xml version 2.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Stephan Schmidt (original XML_Serializer code)
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * file/dir manipulation routines
 */
require_once 'System.php';
require_once 'XML/Util.php';

/**
 * This class converts a PEAR_PackageFile_v2 object into any output format.
 *
 * Supported output formats include array, XML string (using S. Schmidt's
 * XML_Serializer, slightly customized)
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @author     Stephan Schmidt (original XML_Serializer code)
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_Generator_v2
{
   /**
    * default options for the serialization
    * @access private
    * @var array $_defaultOptions
    */
    var $_defaultOptions = array(
        'indent'             => ' ',                    // string used for indentation
        'linebreak'          => "\n",                  // string used for newlines
        'typeHints'          => false,                 // automatically add type hin attributes
        'addDecl'            => true,                 // add an XML declaration
        'defaultTagName'     => 'XML_Serializer_Tag',  // tag used for indexed arrays or invalid names
        'classAsTagName'     => false,                 // use classname for objects in indexed arrays
        'keyAttribute'       => '_originalKey',        // attribute where original key is stored
        'typeAttribute'      => '_type',               // attribute for type (only if typeHints => true)
        'classAttribute'     => '_class',              // attribute for class of objects (only if typeHints => true)
        'scalarAsAttributes' => false,                 // scalar values (strings, ints,..) will be serialized as attribute
        'prependAttributes'  => '',                    // prepend string for attributes
        'indentAttributes'   => false,                 // indent the attributes, if set to '_auto', it will indent attributes so they all start at the same column
        'mode'               => 'simplexml',             // use 'simplexml' to use parent name as tagname if transforming an indexed array
        'addDoctype'         => false,                 // add a doctype declaration
        'doctype'            => null,                  // supply a string or an array with id and uri ({@see XML_Util::getDoctypeDeclaration()}
        'rootName'           => 'package',                  // name of the root tag
        'rootAttributes'     => array(
            'version' => '2.0',
            'xmlns' => 'http://pear.php.net/dtd/package-2.0',
            'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0',
            'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
            'xsi:schemaLocation' => 'http://pear.php.net/dtd/tasks-1.0
http://pear.php.net/dtd/tasks-1.0.xsd
http://pear.php.net/dtd/package-2.0
http://pear.php.net/dtd/package-2.0.xsd',
        ),               // attributes of the root tag
        'attributesArray'    => 'attribs',                  // all values in this key will be treated as attributes
        'contentName'        => '_content',                   // this value will be used directly as content, instead of creating a new tag, may only be used in conjunction with attributesArray
        'beautifyFilelist'   => false,
        'encoding' => 'UTF-8',
    );

   /**
    * options for the serialization
    * @access private
    * @var array $options
    */
    var $options = array();

   /**
    * current tag depth
    * @var integer $_tagDepth
    */
    var $_tagDepth = 0;

   /**
    * serilialized representation of the data
    * @var string $_serializedData
    */
    var $_serializedData = null;
    /**
     * @var PEAR_PackageFile_v2
     */
    var $_packagefile;
    /**
     * @param PEAR_PackageFile_v2
     */
    function __construct(&$packagefile)
    {
        $this->_packagefile = &$packagefile;
        if (isset($this->_packagefile->encoding)) {
            $this->_defaultOptions['encoding'] = $this->_packagefile->encoding;
        }
    }

    /**
     * @return string
     */
    function getPackagerVersion()
    {
        return '1.10.16';
    }

    /**
     * @param PEAR_Packager
     * @param bool generate a .tgz or a .tar
     * @param string|null temporary directory to package in
     */
    function toTgz(&$packager, $compress = true, $where = null)
    {
        $a = null;
        return $this->toTgz2($packager, $a, $compress, $where);
    }

    /**
     * Package up both a package.xml and package2.xml for the same release
     * @param PEAR_Packager
     * @param PEAR_PackageFile_v1
     * @param bool generate a .tgz or a .tar
     * @param string|null temporary directory to package in
     */
    function toTgz2(&$packager, &$pf1, $compress = true, $where = null)
    {
        require_once 'Archive/Tar.php';
        if (!$this->_packagefile->isEquivalent($pf1)) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: "' .
                basename($pf1->getPackageFile()) .
                '" is not equivalent to "' . basename($this->_packagefile->getPackageFile())
                . '"');
        }

        if ($where === null) {
            if (!($where = System::mktemp(array('-d')))) {
                return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: mktemp failed');
            }
        } elseif (!@System::mkDir(array('-p', $where))) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: "' . $where . '" could' .
                ' not be created');
        }

        $file = $where . DIRECTORY_SEPARATOR . 'package.xml';
        if (file_exists($file) && !is_file($file)) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: unable to save package.xml as' .
                ' "' . $file  .'"');
        }

        if (!$this->_packagefile->validate(PEAR_VALIDATE_PACKAGING)) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: invalid package.xml');
        }

        $ext = $compress ? '.tgz' : '.tar';
        $pkgver = $this->_packagefile->getPackage() . '-' . $this->_packagefile->getVersion();
        $dest_package = getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext;
        if (file_exists($dest_package) && !is_file($dest_package)) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: cannot create tgz file "' .
                $dest_package . '"');
        }

        $pkgfile = $this->_packagefile->getPackageFile();
        if (!$pkgfile) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: package file object must ' .
                'be created from a real file');
        }

        $pkgdir  = dirname(realpath($pkgfile));
        $pkgfile = basename($pkgfile);

        // {{{ Create the package file list
        $filelist = array();
        $i = 0;
        $this->_packagefile->flattenFilelist();
        $contents = $this->_packagefile->getContents();
        if (isset($contents['bundledpackage'])) { // bundles of packages
            $contents = $contents['bundledpackage'];
            if (!isset($contents[0])) {
                $contents = array($contents);
            }

            $packageDir = $where;
            foreach ($contents as $i => $package) {
                $fname = $package;
                $file = $pkgdir . DIRECTORY_SEPARATOR . $fname;
                if (!file_exists($file)) {
                    return $packager->raiseError("File does not exist: $fname");
                }

                $tfile = $packageDir . DIRECTORY_SEPARATOR . $fname;
                System::mkdir(array('-p', dirname($tfile)));
                copy($file, $tfile);
                $filelist[$i++] = $tfile;
                $packager->log(2, "Adding package $fname");
            }
        } else { // normal packages
            $contents = $contents['dir']['file'];
            if (!isset($contents[0])) {
                $contents = array($contents);
            }

            $packageDir = $where;
            foreach ($contents as $i => $file) {
                $fname = $file['attribs']['name'];
                $atts = $file['attribs'];
                $orig = $file;
                $file = $pkgdir . DIRECTORY_SEPARATOR . $fname;
                if (!file_exists($file)) {
                    return $packager->raiseError("File does not exist: $fname");
                }

                $origperms = fileperms($file);
                $tfile = $packageDir . DIRECTORY_SEPARATOR . $fname;
                unset($orig['attribs']);
                if (count($orig)) { // file with tasks
                    // run any package-time tasks
                    $contents = file_get_contents($file);
                    foreach ($orig as $tag => $raw) {
                        $tag = str_replace(
                            array($this->_packagefile->getTasksNs() . ':', '-'),
                            array('', '_'), $tag);
                        $task = "PEAR_Task_$tag";
                        $task = new $task($this->_packagefile->_config,
                            $this->_packagefile->_logger,
                            PEAR_TASK_PACKAGE);
                        $task->init($raw, $atts, null);
                        $res = $task->startSession($this->_packagefile, $contents, $tfile);
                        if (!$res) {
                            continue; // skip this task
                        }

                        if (PEAR::isError($res)) {
                            return $res;
                        }

                        $contents = $res; // save changes
                        System::mkdir(array('-p', dirname($tfile)));
                        $wp = fopen($tfile, "wb");
                        fwrite($wp, $contents);
                        fclose($wp);
                    }
                }

                if (!file_exists($tfile)) {
                    System::mkdir(array('-p', dirname($tfile)));
                    copy($file, $tfile);
                }

                chmod($tfile, $origperms);
                $filelist[$i++] = $tfile;
                $this->_packagefile->setFileAttribute($fname, 'md5sum', md5_file($tfile), $i - 1);
                $packager->log(2, "Adding file $fname");
            }
        }
            // }}}

        $name       = $pf1 !== null ? 'package2.xml' : 'package.xml';
        $packagexml = $this->toPackageFile($where, PEAR_VALIDATE_PACKAGING, $name);
        if ($packagexml) {
            $tar = new Archive_Tar($dest_package, $compress);
            $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors
            // ----- Creates with the package.xml file
            $ok = $tar->createModify(array($packagexml), '', $where);
            if (PEAR::isError($ok)) {
                return $packager->raiseError($ok);
            } elseif (!$ok) {
                return $packager->raiseError('PEAR_Packagefile_v2::toTgz(): adding ' . $name .
                    ' failed');
            }

            // ----- Add the content of the package
            if (!$tar->addModify($filelist, $pkgver, $where)) {
                return $packager->raiseError(
                    'PEAR_Packagefile_v2::toTgz(): tarball creation failed');
            }

            // add the package.xml version 1.0
            if ($pf1 !== null) {
                $pfgen = &$pf1->getDefaultGenerator();
                $packagexml1 = $pfgen->toPackageFile($where, PEAR_VALIDATE_PACKAGING, 'package.xml', true);
                if (!$tar->addModify(array($packagexml1), '', $where)) {
                    return $packager->raiseError(
                        'PEAR_Packagefile_v2::toTgz(): adding package.xml failed');
                }
            }

            return $dest_package;
        }
    }

    function toPackageFile($where = null, $state = PEAR_VALIDATE_NORMAL, $name = 'package.xml')
    {
        if (!$this->_packagefile->validate($state)) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: invalid package.xml',
                null, null, null, $this->_packagefile->getValidationWarnings());
        }

        if ($where === null) {
            if (!($where = System::mktemp(array('-d')))) {
                return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: mktemp failed');
            }
        } elseif (!@System::mkDir(array('-p', $where))) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: "' . $where . '" could' .
                ' not be created');
        }

        $newpkgfile = $where . DIRECTORY_SEPARATOR . $name;
        $np = @fopen($newpkgfile, 'wb');
        if (!$np) {
            return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: unable to save ' .
               "$name as $newpkgfile");
        }
        fwrite($np, $this->toXml($state));
        fclose($np);
        return $newpkgfile;
    }

    function &toV2()
    {
        return $this->_packagefile;
    }

    /**
     * Return an XML document based on the package info (as returned
     * by the PEAR_Common::infoFrom* methods).
     *
     * @return string XML data
     */
    function toXml($state = PEAR_VALIDATE_NORMAL, $options = array())
    {
        $this->_packagefile->setDate(date('Y-m-d'));
        $this->_packagefile->setTime(date('H:i:s'));
        if (!$this->_packagefile->validate($state)) {
            return false;
        }

        if (is_array($options)) {
            $this->options = array_merge($this->_defaultOptions, $options);
        } else {
            $this->options = $this->_defaultOptions;
        }

        $arr = $this->_packagefile->getArray();
        if (isset($arr['filelist'])) {
            unset($arr['filelist']);
        }

        if (isset($arr['_lastversion'])) {
            unset($arr['_lastversion']);
        }

        // Fix the notes a little bit
        if (isset($arr['notes'])) {
            // This trims out the indenting, needs fixing
            $arr['notes'] = "\n" . trim($arr['notes']) . "\n";
        }

        if (isset($arr['changelog']) && !empty($arr['changelog'])) {
            // Fix for inconsistency how the array is filled depending on the changelog release amount
            if (!isset($arr['changelog']['release'][0])) {
                $release = $arr['changelog']['release'];
                unset($arr['changelog']['release']);

                $arr['changelog']['release']    = array();
                $arr['changelog']['release'][0] = $release;
            }

            foreach (array_keys($arr['changelog']['release']) as $key) {
                $c =& $arr['changelog']['release'][$key];
                if (isset($c['notes'])) {
                    // This trims out the indenting, needs fixing
                    $c['notes'] = "\n" . trim($c['notes']) . "\n";
                }
            }
        }

        if ($state ^ PEAR_VALIDATE_PACKAGING && !isset($arr['bundle'])) {
            $use = $this->_recursiveXmlFilelist($arr['contents']['dir']['file']);
            unset($arr['contents']['dir']['file']);
            if (isset($use['dir'])) {
                $arr['contents']['dir']['dir'] = $use['dir'];
            }
            if (isset($use['file'])) {
                $arr['contents']['dir']['file'] = $use['file'];
            }
            $this->options['beautifyFilelist'] = true;
        }

        $arr['attribs']['packagerversion'] = '1.10.16';
        if ($this->serialize($arr, $options)) {
            return $this->_serializedData . "\n";
        }

        return false;
    }


    function _recursiveXmlFilelist($list)
    {
        $dirs = array();
        if (isset($list['attribs'])) {
            $file = $list['attribs']['name'];
            unset($list['attribs']['name']);
            $attributes = $list['attribs'];
            $this->_addDir($dirs, explode('/', dirname($file)), $file, $attributes);
        } else {
            foreach ($list as $a) {
                $file = $a['attribs']['name'];
                $attributes = $a['attribs'];
                unset($a['attribs']);
                $this->_addDir($dirs, explode('/', dirname($file)), $file, $attributes, $a);
            }
        }
        $this->_formatDir($dirs);
        $this->_deFormat($dirs);
        return $dirs;
    }

    function _addDir(&$dirs, $dir, $file = null, $attributes = null, $tasks = null)
    {
        if (!$tasks) {
            $tasks = array();
        }
        if ($dir == array() || $dir == array('.')) {
            $dirs['file'][basename($file)] = $tasks;
            $attributes['name'] = basename($file);
            $dirs['file'][basename($file)]['attribs'] = $attributes;
            return;
        }
        $curdir = array_shift($dir);
        if (!isset($dirs['dir'][$curdir])) {
            $dirs['dir'][$curdir] = array();
        }
        $this->_addDir($dirs['dir'][$curdir], $dir, $file, $attributes, $tasks);
    }

    function _formatDir(&$dirs)
    {
        if (!count($dirs)) {
            return array();
        }
        $newdirs = array();
        if (isset($dirs['dir'])) {
            $newdirs['dir'] = $dirs['dir'];
        }
        if (isset($dirs['file'])) {
            $newdirs['file'] = $dirs['file'];
        }
        $dirs = $newdirs;
        if (isset($dirs['dir'])) {
            uksort($dirs['dir'], 'strnatcasecmp');
            foreach ($dirs['dir'] as $dir => $contents) {
                $this->_formatDir($dirs['dir'][$dir]);
            }
        }
        if (isset($dirs['file'])) {
            uksort($dirs['file'], 'strnatcasecmp');
        };
    }

    function _deFormat(&$dirs)
    {
        if (!count($dirs)) {
            return array();
        }
        $newdirs = array();
        if (isset($dirs['dir'])) {
            foreach ($dirs['dir'] as $dir => $contents) {
                $newdir = array();
                $newdir['attribs']['name'] = $dir;
                $this->_deFormat($contents);
                foreach ($contents as $tag => $val) {
                    $newdir[$tag] = $val;
                }
                $newdirs['dir'][] = $newdir;
            }
            if (count($newdirs['dir']) == 1) {
                $newdirs['dir'] = $newdirs['dir'][0];
            }
        }
        if (isset($dirs['file'])) {
            foreach ($dirs['file'] as $name => $file) {
                $newdirs['file'][] = $file;
            }
            if (count($newdirs['file']) == 1) {
                $newdirs['file'] = $newdirs['file'][0];
            }
        }
        $dirs = $newdirs;
    }

    /**
    * reset all options to default options
    *
    * @access   public
    * @see      setOption(), XML_Unserializer()
    */
    function resetOptions()
    {
        $this->options = $this->_defaultOptions;
    }

   /**
    * set an option
    *
    * You can use this method if you do not want to set all options in the constructor
    *
    * @access   public
    * @see      resetOption(), XML_Serializer()
    */
    function setOption($name, $value)
    {
        $this->options[$name] = $value;
    }

   /**
    * sets several options at once
    *
    * You can use this method if you do not want to set all options in the constructor
    *
    * @access   public
    * @see      resetOption(), XML_Unserializer(), setOption()
    */
    function setOptions($options)
    {
        $this->options = array_merge($this->options, $options);
    }

   /**
    * serialize data
    *
    * @access   public
    * @param    mixed    $data data to serialize
    * @return   boolean  true on success, pear error on failure
    */
    function serialize($data, $options = null)
    {
        // if options have been specified, use them instead
        // of the previously defined ones
        if (is_array($options)) {
            $optionsBak = $this->options;
            if (isset($options['overrideOptions']) && $options['overrideOptions'] == true) {
                $this->options = array_merge($this->_defaultOptions, $options);
            } else {
                $this->options = array_merge($this->options, $options);
            }
        } else {
            $optionsBak = null;
        }

        //  start depth is zero
        $this->_tagDepth = 0;
        $this->_serializedData = '';
        // serialize an array
        if (is_array($data)) {
            $tagName = isset($this->options['rootName']) ? $this->options['rootName'] : 'array';
            $this->_serializedData .= $this->_serializeArray($data, $tagName, $this->options['rootAttributes']);
        }

        // add doctype declaration
        if ($this->options['addDoctype'] === true) {
            $this->_serializedData = XML_Util::getDoctypeDeclaration($tagName, $this->options['doctype'])
                                   . $this->options['linebreak']
                                   . $this->_serializedData;
        }

        //  build xml declaration
        if ($this->options['addDecl']) {
            $atts = array();
            $encoding = isset($this->options['encoding']) ? $this->options['encoding'] : null;
            $this->_serializedData = XML_Util::getXMLDeclaration('1.0', $encoding)
                                   . $this->options['linebreak']
                                   . $this->_serializedData;
        }


        if ($optionsBak !== null) {
            $this->options = $optionsBak;
        }

        return  true;
    }

   /**
    * get the result of the serialization
    *
    * @access public
    * @return string serialized XML
    */
    function getSerializedData()
    {
        if ($this->_serializedData === null) {
            return  $this->raiseError('No serialized data available. Use XML_Serializer::serialize() first.', XML_SERIALIZER_ERROR_NO_SERIALIZATION);
        }
        return $this->_serializedData;
    }

   /**
    * serialize any value
    *
    * This method checks for the type of the value and calls the appropriate method
    *
    * @access private
    * @param  mixed     $value
    * @param  string    $tagName
    * @param  array     $attributes
    * @return string
    */
    function _serializeValue($value, $tagName = null, $attributes = array())
    {
        if (is_array($value)) {
            $xml = $this->_serializeArray($value, $tagName, $attributes);
        } elseif (is_object($value)) {
            $xml = $this->_serializeObject($value, $tagName);
        } else {
            $tag = array(
                          'qname'      => $tagName,
                          'attributes' => $attributes,
                          'content'    => $value
                        );
            $xml = $this->_createXMLTag($tag);
        }
        return $xml;
    }

   /**
    * serialize an array
    *
    * @access   private
    * @param    array   $array       array to serialize
    * @param    string  $tagName     name of the root tag
    * @param    array   $attributes  attributes for the root tag
    * @return   string  $string      serialized data
    * @uses     XML_Util::isValidName() to check, whether key has to be substituted
    */
    function _serializeArray(&$array, $tagName = null, $attributes = array())
    {
        $_content = null;

        /**
         * check for special attributes
         */
        if ($this->options['attributesArray'] !== null) {
            if (isset($array[$this->options['attributesArray']])) {
                $attributes = $array[$this->options['attributesArray']];
                unset($array[$this->options['attributesArray']]);
            }
            /**
             * check for special content
             */
            if ($this->options['contentName'] !== null) {
                if (isset($array[$this->options['contentName']])) {
                    $_content = $array[$this->options['contentName']];
                    unset($array[$this->options['contentName']]);
                }
            }
        }

        /*
        * if mode is set to simpleXML, check whether
        * the array is associative or indexed
        */
        if (is_array($array) && $this->options['mode'] == 'simplexml') {
            $indexed = true;
            if (!count($array)) {
                $indexed = false;
            }
            foreach ($array as $key => $val) {
                if (!is_int($key)) {
                    $indexed = false;
                    break;
                }
            }

            if ($indexed && $this->options['mode'] == 'simplexml') {
                $string = '';
                foreach ($array as $key => $val) {
                    if ($this->options['beautifyFilelist'] && $tagName == 'dir') {
                        if (!isset($this->_curdir)) {
                            $this->_curdir = '';
                        }
                        $savedir = $this->_curdir;
                        if (isset($val['attribs'])) {
                            if ($val['attribs']['name'] == '/') {
                                $this->_curdir = '/';
                            } else {
                                if ($this->_curdir == '/') {
                                    $this->_curdir = '';
                                }
                                $this->_curdir .= '/' . $val['attribs']['name'];
                            }
                        }
                    }
                    $string .= $this->_serializeValue( $val, $tagName, $attributes);
                    if ($this->options['beautifyFilelist'] && $tagName == 'dir') {
                        $string .= ' <!-- ' . $this->_curdir . ' -->';
                        if (empty($savedir)) {
                            unset($this->_curdir);
                        } else {
                            $this->_curdir = $savedir;
                        }
                    }

                    $string .= $this->options['linebreak'];
                    // do indentation
                    if ($this->options['indent'] !== null && $this->_tagDepth > 0) {
                        $string .= str_repeat($this->options['indent'], $this->_tagDepth);
                    }
                }
                return rtrim($string);
            }
        }

        if ($this->options['scalarAsAttributes'] === true) {
            foreach ($array as $key => $value) {
                if (is_scalar($value) && (XML_Util::isValidName($key) === true)) {
                    unset($array[$key]);
                    $attributes[$this->options['prependAttributes'].$key] = $value;
                }
            }
        }

        // check for empty array => create empty tag
        if (empty($array)) {
            $tag = array(
                            'qname'      => $tagName,
                            'content'    => $_content,
                            'attributes' => $attributes
                        );

        } else {
            $this->_tagDepth++;
            $tmp = $this->options['linebreak'];
            foreach ($array as $key => $value) {
                // do indentation
                if ($this->options['indent'] !== null && $this->_tagDepth > 0) {
                    $tmp .= str_repeat($this->options['indent'], $this->_tagDepth);
                }

                // copy key
                $origKey = $key;
                // key cannot be used as tagname => use default tag
                $valid = XML_Util::isValidName($key);
                if (PEAR::isError($valid)) {
                    if ($this->options['classAsTagName'] && is_object($value)) {
                        $key = get_class($value);
                    } else {
                        $key = $this->options['defaultTagName'];
                    }
                }
                $atts = array();
                if ($this->options['typeHints'] === true) {
                    $atts[$this->options['typeAttribute']] = gettype($value);
                    if ($key !== $origKey) {
                        $atts[$this->options['keyAttribute']] = (string)$origKey;
                    }

                }
                if ($this->options['beautifyFilelist'] && $key == 'dir') {
                    if (!isset($this->_curdir)) {
                        $this->_curdir = '';
                    }
                    $savedir = $this->_curdir;
                    if (isset($value['attribs'])) {
                        if ($value['attribs']['name'] == '/') {
                            $this->_curdir = '/';
                        } else {
                            $this->_curdir .= '/' . $value['attribs']['name'];
                        }
                    }
                }

                if (is_string($value) && $value && ($value[strlen($value) - 1] == "\n")) {
                    $value .= str_repeat($this->options['indent'], $this->_tagDepth);
                }
                $tmp .= $this->_createXMLTag(array(
                                                    'qname'      => $key,
                                                    'attributes' => $atts,
                                                    'content'    => $value )
                                            );
                if ($this->options['beautifyFilelist'] && $key == 'dir') {
                    if (isset($value['attribs'])) {
                        $tmp .= ' <!-- ' . $this->_curdir . ' -->';
                        if (empty($savedir)) {
                            unset($this->_curdir);
                        } else {
                            $this->_curdir = $savedir;
                        }
                    }
                }
                $tmp .= $this->options['linebreak'];
            }

            $this->_tagDepth--;
            if ($this->options['indent']!==null && $this->_tagDepth>0) {
                $tmp .= str_repeat($this->options['indent'], $this->_tagDepth);
            }

            if (trim($tmp) === '') {
                $tmp = null;
            }

            $tag = array(
                'qname'      => $tagName,
                'content'    => $tmp,
                'attributes' => $attributes
            );
        }
        if ($this->options['typeHints'] === true) {
            if (!isset($tag['attributes'][$this->options['typeAttribute']])) {
                $tag['attributes'][$this->options['typeAttribute']] = 'array';
            }
        }

        $string = $this->_createXMLTag($tag, false);
        return $string;
    }

   /**
    * create a tag from an array
    * this method awaits an array in the following format
    * array(
    *       'qname'        => $tagName,
    *       'attributes'   => array(),
    *       'content'      => $content,      // optional
    *       'namespace'    => $namespace     // optional
    *       'namespaceUri' => $namespaceUri  // optional
    *   )
    *
    * @access   private
    * @param    array   $tag tag definition
    * @param    boolean $replaceEntities whether to replace XML entities in content or not
    * @return   string  $string XML tag
    */
    function _createXMLTag($tag, $replaceEntities = true)
    {
        if ($this->options['indentAttributes'] !== false) {
            $multiline = true;
            $indent    = str_repeat($this->options['indent'], $this->_tagDepth);

            if ($this->options['indentAttributes'] == '_auto') {
                $indent .= str_repeat(' ', (strlen($tag['qname'])+2));

            } else {
                $indent .= $this->options['indentAttributes'];
            }
        } else {
            $indent = $multiline = false;
        }

        if (is_array($tag['content'])) {
            if (empty($tag['content'])) {
                $tag['content'] = '';
            }
        } elseif(is_scalar($tag['content']) && (string)$tag['content'] == '') {
            $tag['content'] = '';
        }

        if (is_scalar($tag['content']) || is_null($tag['content'])) {
            if ($replaceEntities === true) {
                $replaceEntities = XML_UTIL_ENTITIES_XML;
            }

            $tag = XML_Util::createTagFromArray($tag, $replaceEntities, $multiline, $indent, $this->options['linebreak']);
        } elseif (is_array($tag['content'])) {
            $tag = $this->_serializeArray($tag['content'], $tag['qname'], $tag['attributes']);
        } elseif (is_object($tag['content'])) {
            $tag = $this->_serializeObject($tag['content'], $tag['qname'], $tag['attributes']);
        } elseif (is_resource($tag['content'])) {
            settype($tag['content'], 'string');
            $tag = XML_Util::createTagFromArray($tag, $replaceEntities);
        }
        return  $tag;
    }
}
PK�a�\��wv@@pear/PEAR/PackageFile/v2.phpnu�[���<?php
/**
 * PEAR_PackageFile_v2, package.xml version 2.0
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */
/**
 * For error handling
 */
require_once 'PEAR/ErrorStack.php';
/**
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile_v2
{

    /**
     * Parsed package information
     * @var array
     * @access private
     */
    var $_packageInfo = array();

    /**
     * path to package .tgz or false if this is a local/extracted package.xml
     * @var string|false
     * @access private
     */
    var $_archiveFile;

    /**
     * path to package .xml or false if this is an abstract parsed-from-string xml
     * @var string|false
     * @access private
     */
    var $_packageFile;

    /**
     * This is used by file analysis routines to log progress information
     * @var PEAR_Common
     * @access protected
     */
    var $_logger;

    /**
     * This is set to the highest validation level that has been validated
     *
     * If the package.xml is invalid or unknown, this is set to 0.  If
     * normal validation has occurred, this is set to PEAR_VALIDATE_NORMAL.  If
     * downloading/installation validation has occurred it is set to PEAR_VALIDATE_DOWNLOADING
     * or INSTALLING, and so on up to PEAR_VALIDATE_PACKAGING.  This allows validation
     * "caching" to occur, which is particularly important for package validation, so
     * that PHP files are not validated twice
     * @var int
     * @access private
     */
    var $_isValid = 0;

    /**
     * True if the filelist has been validated
     * @param bool
     */
    var $_filesValid = false;

    /**
     * @var PEAR_Registry
     * @access protected
     */
    var $_registry;

    /**
     * @var PEAR_Config
     * @access protected
     */
    var $_config;

    /**
     * Optional Dependency group requested for installation
     * @var string
     * @access private
     */
    var $_requestedGroup = false;

    /**
     * @var PEAR_ErrorStack
     * @access protected
     */
    var $_stack;

    /**
     * Namespace prefix used for tasks in this package.xml - use tasks: whenever possible
     */
    var $_tasksNs;

    /**
     * Determines whether this packagefile was initialized only with partial package info
     *
     * If this package file was constructed via parsing REST, it will only contain
     *
     * - package name
     * - channel name
     * - dependencies
     * @var boolean
     * @access private
     */
    var $_incomplete = true;

    /**
     * @var PEAR_PackageFile_v2_Validator
     */
    var $_v2Validator;

    /**
     * The constructor merely sets up the private error stack
     */
    function __construct()
    {
        $this->_stack = new PEAR_ErrorStack('PEAR_PackageFile_v2', false, null);
        $this->_isValid = false;
    }

    /**
     * PHP 4 style constructor for backwards compatibility.
     * Used by PEAR_PackageFileManager2
     */
    public function PEAR_PackageFile_v2()
    {
        $this->__construct();
    }

    /**
     * To make unit-testing easier
     * @param PEAR_Frontend_*
     * @param array options
     * @param PEAR_Config
     * @return PEAR_Downloader
     * @access protected
     */
    function &getPEARDownloader(&$i, $o, &$c)
    {
        $z = new PEAR_Downloader($i, $o, $c);
        return $z;
    }

    /**
     * To make unit-testing easier
     * @param PEAR_Config
     * @param array options
     * @param array package name as returned from {@link PEAR_Registry::parsePackageName()}
     * @param int PEAR_VALIDATE_* constant
     * @return PEAR_Dependency2
     * @access protected
     */
    function &getPEARDependency2(&$c, $o, $p, $s = PEAR_VALIDATE_INSTALLING)
    {
        if (!class_exists('PEAR_Dependency2')) {
            require_once 'PEAR/Dependency2.php';
        }
        $z = new PEAR_Dependency2($c, $o, $p, $s);
        return $z;
    }

    function getInstalledBinary()
    {
        return isset($this->_packageInfo['#binarypackage']) ? $this->_packageInfo['#binarypackage'] :
            false;
    }

    /**
     * Installation of source package has failed, attempt to download and install the
     * binary version of this package.
     * @param PEAR_Installer
     * @return array|false
     */
    function installBinary(&$installer)
    {
        if (!OS_WINDOWS) {
            $a = false;
            return $a;
        }
        if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') {
            $releasetype = $this->getPackageType() . 'release';
            if (!is_array($installer->getInstallPackages())) {
                $a = false;
                return $a;
            }
            foreach ($installer->getInstallPackages() as $p) {
                if ($p->isExtension($this->_packageInfo['providesextension'])) {
                    if ($p->getPackageType() != 'extsrc' && $p->getPackageType() != 'zendextsrc') {
                        $a = false;
                        return $a; // the user probably downloaded it separately
                    }
                }
            }
            if (isset($this->_packageInfo[$releasetype]['binarypackage'])) {
                $installer->log(0, 'Attempting to download binary version of extension "' .
                    $this->_packageInfo['providesextension'] . '"');
                $params = $this->_packageInfo[$releasetype]['binarypackage'];
                if (!is_array($params) || !isset($params[0])) {
                    $params = array($params);
                }
                if (isset($this->_packageInfo['channel'])) {
                    foreach ($params as $i => $param) {
                        $params[$i] = array('channel' => $this->_packageInfo['channel'],
                            'package' => $param, 'version' => $this->getVersion());
                    }
                }
                $dl = &$this->getPEARDownloader($installer->ui, $installer->getOptions(),
                    $installer->config);
                $verbose = $dl->config->get('verbose');
                $dl->config->set('verbose', -1);
                foreach ($params as $param) {
                    PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                    $ret = $dl->download(array($param));
                    PEAR::popErrorHandling();
                    if (is_array($ret) && count($ret)) {
                        break;
                    }
                }
                $dl->config->set('verbose', $verbose);
                if (is_array($ret)) {
                    if (count($ret) == 1) {
                        $pf = $ret[0]->getPackageFile();
                        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                        $err = $installer->install($ret[0]);
                        PEAR::popErrorHandling();
                        if (is_array($err)) {
                            $this->_packageInfo['#binarypackage'] = $ret[0]->getPackage();
                            // "install" self, so all dependencies will work transparently
                            $this->_registry->addPackage2($this);
                            $installer->log(0, 'Download and install of binary extension "' .
                                $this->_registry->parsedPackageNameToString(
                                    array('channel' => $pf->getChannel(),
                                          'package' => $pf->getPackage()), true) . '" successful');
                            $a = array($ret[0], $err);
                            return $a;
                        }
                        $installer->log(0, 'Download and install of binary extension "' .
                            $this->_registry->parsedPackageNameToString(
                                    array('channel' => $pf->getChannel(),
                                          'package' => $pf->getPackage()), true) . '" failed');
                    }
                }
            }
        }
        $a = false;
        return $a;
    }

    /**
     * @return string|false Extension name
     */
    function getProvidesExtension()
    {
        if (in_array($this->getPackageType(),
              array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) {
            if (isset($this->_packageInfo['providesextension'])) {
                return $this->_packageInfo['providesextension'];
            }
        }
        return false;
    }

    /**
     * @param string Extension name
     * @return bool
     */
    function isExtension($extension)
    {
        if (in_array($this->getPackageType(),
              array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) {
            return $this->_packageInfo['providesextension'] == $extension;
        }
        return false;
    }

    /**
     * Tests whether every part of the package.xml 1.0 is represented in
     * this package.xml 2.0
     * @param PEAR_PackageFile_v1
     * @return bool
     */
    function isEquivalent($pf1)
    {
        if (!$pf1) {
            return true;
        }
        if ($this->getPackageType() == 'bundle') {
            return false;
        }
        $this->_stack->getErrors(true);
        if (!$pf1->validate(PEAR_VALIDATE_NORMAL)) {
            return false;
        }
        $pass = true;
        if ($pf1->getPackage() != $this->getPackage()) {
            $this->_differentPackage($pf1->getPackage());
            $pass = false;
        }
        if ($pf1->getVersion() != $this->getVersion()) {
            $this->_differentVersion($pf1->getVersion());
            $pass = false;
        }
        if (trim($pf1->getSummary()) != $this->getSummary()) {
            $this->_differentSummary($pf1->getSummary());
            $pass = false;
        }
        if (preg_replace('/\s+/', '', $pf1->getDescription()) !=
              preg_replace('/\s+/', '', $this->getDescription())) {
            $this->_differentDescription($pf1->getDescription());
            $pass = false;
        }
        if ($pf1->getState() != $this->getState()) {
            $this->_differentState($pf1->getState());
            $pass = false;
        }
        if (!strstr(preg_replace('/\s+/', '', $this->getNotes()),
              preg_replace('/\s+/', '', $pf1->getNotes()))) {
            $this->_differentNotes($pf1->getNotes());
            $pass = false;
        }
        $mymaintainers = $this->getMaintainers();
        $yourmaintainers = $pf1->getMaintainers();
        for ($i1 = 0; $i1 < count($yourmaintainers); $i1++) {
            $reset = false;
            for ($i2 = 0; $i2 < count($mymaintainers); $i2++) {
                if ($mymaintainers[$i2]['handle'] == $yourmaintainers[$i1]['handle']) {
                    if ($mymaintainers[$i2]['role'] != $yourmaintainers[$i1]['role']) {
                        $this->_differentRole($mymaintainers[$i2]['handle'],
                            $yourmaintainers[$i1]['role'], $mymaintainers[$i2]['role']);
                        $pass = false;
                    }
                    if ($mymaintainers[$i2]['email'] != $yourmaintainers[$i1]['email']) {
                        $this->_differentEmail($mymaintainers[$i2]['handle'],
                            $yourmaintainers[$i1]['email'], $mymaintainers[$i2]['email']);
                        $pass = false;
                    }
                    if ($mymaintainers[$i2]['name'] != $yourmaintainers[$i1]['name']) {
                        $this->_differentName($mymaintainers[$i2]['handle'],
                            $yourmaintainers[$i1]['name'], $mymaintainers[$i2]['name']);
                        $pass = false;
                    }
                    unset($mymaintainers[$i2]);
                    $mymaintainers = array_values($mymaintainers);
                    unset($yourmaintainers[$i1]);
                    $yourmaintainers = array_values($yourmaintainers);
                    $reset = true;
                    break;
                }
            }
            if ($reset) {
                $i1 = -1;
            }
        }
        $this->_unmatchedMaintainers($mymaintainers, $yourmaintainers);
        $filelist = $this->getFilelist();
        foreach ($pf1->getFilelist() as $file => $atts) {
            if (!isset($filelist[$file])) {
                $this->_missingFile($file);
                $pass = false;
            }
        }
        return $pass;
    }

    function _differentPackage($package)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('package' => $package,
            'self' => $this->getPackage()),
            'package.xml 1.0 package "%package%" does not match "%self%"');
    }

    function _differentVersion($version)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('version' => $version,
            'self' => $this->getVersion()),
            'package.xml 1.0 version "%version%" does not match "%self%"');
    }

    function _differentState($state)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('state' => $state,
            'self' => $this->getState()),
            'package.xml 1.0 state "%state%" does not match "%self%"');
    }

    function _differentRole($handle, $role, $selfrole)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('handle' => $handle,
            'role' => $role, 'self' => $selfrole),
            'package.xml 1.0 maintainer "%handle%" role "%role%" does not match "%self%"');
    }

    function _differentEmail($handle, $email, $selfemail)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('handle' => $handle,
            'email' => $email, 'self' => $selfemail),
            'package.xml 1.0 maintainer "%handle%" email "%email%" does not match "%self%"');
    }

    function _differentName($handle, $name, $selfname)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('handle' => $handle,
            'name' => $name, 'self' => $selfname),
            'package.xml 1.0 maintainer "%handle%" name "%name%" does not match "%self%"');
    }

    function _unmatchedMaintainers($my, $yours)
    {
        if ($my) {
            array_walk($my, function(&$i, $k) { $i = $i["handle"]; });
            $this->_stack->push(__FUNCTION__, 'error', array('handles' => $my),
                'package.xml 2.0 has unmatched extra maintainers "%handles%"');
        }
        if ($yours) {
            array_walk($yours, function(&$i, $k) { $i = $i["handle"]; });
            $this->_stack->push(__FUNCTION__, 'error', array('handles' => $yours),
                'package.xml 1.0 has unmatched extra maintainers "%handles%"');
        }
    }

    function _differentNotes($notes)
    {
        $truncnotes = strlen($notes) < 25 ? $notes : substr($notes, 0, 24) . '...';
        $truncmynotes = strlen($this->getNotes()) < 25 ? $this->getNotes() :
            substr($this->getNotes(), 0, 24) . '...';
        $this->_stack->push(__FUNCTION__, 'error', array('notes' => $truncnotes,
            'self' => $truncmynotes),
            'package.xml 1.0 release notes "%notes%" do not match "%self%"');
    }

    function _differentSummary($summary)
    {
        $truncsummary = strlen($summary) < 25 ? $summary : substr($summary, 0, 24) . '...';
        $truncmysummary = strlen($this->getsummary()) < 25 ? $this->getSummary() :
            substr($this->getsummary(), 0, 24) . '...';
        $this->_stack->push(__FUNCTION__, 'error', array('summary' => $truncsummary,
            'self' => $truncmysummary),
            'package.xml 1.0 summary "%summary%" does not match "%self%"');
    }

    function _differentDescription($description)
    {
        $truncdescription = trim(strlen($description) < 25 ? $description : substr($description, 0, 24) . '...');
        $truncmydescription = trim(strlen($this->getDescription()) < 25 ? $this->getDescription() :
            substr($this->getdescription(), 0, 24) . '...');
        $this->_stack->push(__FUNCTION__, 'error', array('description' => $truncdescription,
            'self' => $truncmydescription),
            'package.xml 1.0 description "%description%" does not match "%self%"');
    }

    function _missingFile($file)
    {
        $this->_stack->push(__FUNCTION__, 'error', array('file' => $file),
            'package.xml 1.0 file "%file%" is not present in <contents>');
    }

    /**
     * WARNING - do not use this function unless you know what you're doing
     */
    function setRawState($state)
    {
        if (!isset($this->_packageInfo['stability'])) {
            $this->_packageInfo['stability'] = array();
        }
        $this->_packageInfo['stability']['release'] = $state;
    }

    /**
     * WARNING - do not use this function unless you know what you're doing
     */
    function setRawCompatible($compatible)
    {
        $this->_packageInfo['compatible'] = $compatible;
    }

    /**
     * WARNING - do not use this function unless you know what you're doing
     */
    function setRawPackage($package)
    {
        $this->_packageInfo['name'] = $package;
    }

    /**
     * WARNING - do not use this function unless you know what you're doing
     */
    function setRawChannel($channel)
    {
        $this->_packageInfo['channel'] = $channel;
    }

    function setRequestedGroup($group)
    {
        $this->_requestedGroup = $group;
    }

    function getRequestedGroup()
    {
        if (isset($this->_requestedGroup)) {
            return $this->_requestedGroup;
        }
        return false;
    }

    /**
     * For saving in the registry.
     *
     * Set the last version that was installed
     * @param string
     */
    function setLastInstalledVersion($version)
    {
        $this->_packageInfo['_lastversion'] = $version;
    }

    /**
     * @return string|false
     */
    function getLastInstalledVersion()
    {
        if (isset($this->_packageInfo['_lastversion'])) {
            return $this->_packageInfo['_lastversion'];
        }
        return false;
    }

    /**
     * Determines whether this package.xml has post-install scripts or not
     * @return array|false
     */
    function listPostinstallScripts()
    {
        $filelist = $this->getFilelist();
        $contents = $this->getContents();
        $contents = $contents['dir']['file'];
        if (!is_array($contents) || !isset($contents[0])) {
            $contents = array($contents);
        }
        $taskfiles = array();
        foreach ($contents as $file) {
            $atts = $file['attribs'];
            unset($file['attribs']);
            if (count($file)) {
                $taskfiles[$atts['name']] = $file;
            }
        }
        $common = new PEAR_Common;
        $common->debug = $this->_config->get('verbose');
        $this->_scripts = array();
        $ret = array();
        foreach ($taskfiles as $name => $tasks) {
            if (!isset($filelist[$name])) {
                // ignored files will not be in the filelist
                continue;
            }
            $atts = $filelist[$name];
            foreach ($tasks as $tag => $raw) {
                $task = $this->getTask($tag);
                $task = new $task($this->_config, $common, PEAR_TASK_INSTALL);
                if ($task->isScript()) {
                    $ret[] = $filelist[$name]['installed_as'];
                }
            }
        }
        if (count($ret)) {
            return $ret;
        }
        return false;
    }

    /**
     * Initialize post-install scripts for running
     *
     * This method can be used to detect post-install scripts, as the return value
     * indicates whether any exist
     * @return bool
     */
    function initPostinstallScripts()
    {
        $filelist = $this->getFilelist();
        $contents = $this->getContents();
        $contents = $contents['dir']['file'];
        if (!is_array($contents) || !isset($contents[0])) {
            $contents = array($contents);
        }
        $taskfiles = array();
        foreach ($contents as $file) {
            $atts = $file['attribs'];
            unset($file['attribs']);
            if (count($file)) {
                $taskfiles[$atts['name']] = $file;
            }
        }
        $common = new PEAR_Common;
        $common->debug = $this->_config->get('verbose');
        $this->_scripts = array();
        foreach ($taskfiles as $name => $tasks) {
            if (!isset($filelist[$name])) {
                // file was not installed due to installconditions
                continue;
            }
            $atts = $filelist[$name];
            foreach ($tasks as $tag => $raw) {
                $taskname = $this->getTask($tag);
                $task = new $taskname($this->_config, $common, PEAR_TASK_INSTALL);
                if (!$task->isScript()) {
                    continue; // scripts are only handled after installation
                }
                $lastversion = isset($this->_packageInfo['_lastversion']) ?
                    $this->_packageInfo['_lastversion'] : null;
                $task->init($raw, $atts, $lastversion);
                $res = $task->startSession($this, $atts['installed_as'], null);
                if (!$res) {
                    continue; // skip this file
                }
                if (PEAR::isError($res)) {
                    return $res;
                }
                $this->_scripts[] = $task;
            }
        }
        if (count($this->_scripts)) {
            return true;
        }
        return false;
    }

    function runPostinstallScripts()
    {
        if ($this->initPostinstallScripts()) {
            $ui = &PEAR_Frontend::singleton();
            if ($ui) {
                $ui->runPostinstallScripts($this->_scripts, $this);
            }
        }
    }


    /**
     * Convert a recursive set of <dir> and <file> tags into a single <dir> tag with
     * <file> tags.
     */
    function flattenFilelist()
    {
        if (isset($this->_packageInfo['bundle'])) {
            return;
        }
        $filelist = array();
        if (isset($this->_packageInfo['contents']['dir']['dir'])) {
            $this->_getFlattenedFilelist($filelist, $this->_packageInfo['contents']['dir']);
            if (!isset($filelist[1])) {
                $filelist = $filelist[0];
            }
            $this->_packageInfo['contents']['dir']['file'] = $filelist;
            unset($this->_packageInfo['contents']['dir']['dir']);
        } else {
            // else already flattened but check for baseinstalldir propagation
            if (isset($this->_packageInfo['contents']['dir']['attribs']['baseinstalldir'])) {
                if (isset($this->_packageInfo['contents']['dir']['file'][0])) {
                    foreach ($this->_packageInfo['contents']['dir']['file'] as $i => $file) {
                        if (isset($file['attribs']['baseinstalldir'])) {
                            continue;
                        }
                        $this->_packageInfo['contents']['dir']['file'][$i]['attribs']['baseinstalldir']
                            = $this->_packageInfo['contents']['dir']['attribs']['baseinstalldir'];
                    }
                } else {
                    if (!isset($this->_packageInfo['contents']['dir']['file']['attribs']['baseinstalldir'])) {
                       $this->_packageInfo['contents']['dir']['file']['attribs']['baseinstalldir']
                            = $this->_packageInfo['contents']['dir']['attribs']['baseinstalldir'];
                    }
                }
            }
        }
    }

    /**
     * @param array the final flattened file list
     * @param array the current directory being processed
     * @param string|false any recursively inherited baeinstalldir attribute
     * @param string private recursion variable
     * @return array
     * @access protected
     */
    function _getFlattenedFilelist(&$files, $dir, $baseinstall = false, $path = '')
    {
        if (isset($dir['attribs']) && isset($dir['attribs']['baseinstalldir'])) {
            $baseinstall = $dir['attribs']['baseinstalldir'];
        }
        if (isset($dir['dir'])) {
            if (!isset($dir['dir'][0])) {
                $dir['dir'] = array($dir['dir']);
            }
            foreach ($dir['dir'] as $subdir) {
                if (!isset($subdir['attribs']) || !isset($subdir['attribs']['name'])) {
                    $name = '*unknown*';
                } else {
                    $name = $subdir['attribs']['name'];
                }
                $newpath = empty($path) ? $name :
                    $path . '/' . $name;
                $this->_getFlattenedFilelist($files, $subdir,
                    $baseinstall, $newpath);
            }
        }
        if (isset($dir['file'])) {
            if (!isset($dir['file'][0])) {
                $dir['file'] = array($dir['file']);
            }
            foreach ($dir['file'] as $file) {
                $attrs = $file['attribs'];
                $name = $attrs['name'];
                if ($baseinstall && !isset($attrs['baseinstalldir'])) {
                    $attrs['baseinstalldir'] = $baseinstall;
                }
                $attrs['name'] = empty($path) ? $name : $path . '/' . $name;
                $attrs['name'] = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'),
                    $attrs['name']);
                $file['attribs'] = $attrs;
                $files[] = $file;
            }
        }
    }

    function setConfig(&$config)
    {
        $this->_config = &$config;
        $this->_registry = &$config->getRegistry();
    }

    function setLogger(&$logger)
    {
        if (!is_object($logger) || !method_exists($logger, 'log')) {
            return PEAR::raiseError('Logger must be compatible with PEAR_Common::log');
        }
        $this->_logger = &$logger;
    }

    /**
     * WARNING - do not use this function directly unless you know what you're doing
     */
    function setDeps($deps)
    {
        $this->_packageInfo['dependencies'] = $deps;
    }

    /**
     * WARNING - do not use this function directly unless you know what you're doing
     */
    function setCompatible($compat)
    {
        $this->_packageInfo['compatible'] = $compat;
    }

    function setPackagefile($file, $archive = false)
    {
        $this->_packageFile = $file;
        $this->_archiveFile = $archive ? $archive : $file;
    }

    /**
     * Wrapper to {@link PEAR_ErrorStack::getErrors()}
     * @param boolean determines whether to purge the error stack after retrieving
     * @return array
     */
    function getValidationWarnings($purge = true)
    {
        return $this->_stack->getErrors($purge);
    }

    function getPackageFile()
    {
        return $this->_packageFile;
    }

    function getArchiveFile()
    {
        return $this->_archiveFile;
    }


    /**
     * Directly set the array that defines this packagefile
     *
     * WARNING: no validation.  This should only be performed by internal methods
     * inside PEAR or by inputting an array saved from an existing PEAR_PackageFile_v2
     * @param array
     */
    function fromArray($pinfo)
    {
        unset($pinfo['old']);
        unset($pinfo['xsdversion']);
        // If the changelog isn't an array then it was passed in as an empty tag
        if (isset($pinfo['changelog']) && !is_array($pinfo['changelog'])) {
          unset($pinfo['changelog']);
        }
        $this->_incomplete = false;
        $this->_packageInfo = $pinfo;
    }

    function isIncomplete()
    {
        return $this->_incomplete;
    }

    /**
     * @return array
     */
    function toArray($forreg = false)
    {
        if (!$this->validate(PEAR_VALIDATE_NORMAL)) {
            return false;
        }
        return $this->getArray($forreg);
    }

    function getArray($forReg = false)
    {
        if ($forReg) {
            $arr = $this->_packageInfo;
            $arr['old'] = array();
            $arr['old']['version'] = $this->getVersion();
            $arr['old']['release_date'] = $this->getDate();
            $arr['old']['release_state'] = $this->getState();
            $arr['old']['release_license'] = $this->getLicense();
            $arr['old']['release_notes'] = $this->getNotes();
            $arr['old']['release_deps'] = $this->getDeps();
            $arr['old']['maintainers'] = $this->getMaintainers();
            $arr['xsdversion'] = '2.0';
            return $arr;
        } else {
            $info = $this->_packageInfo;
            unset($info['dirtree']);
            if (isset($info['_lastversion'])) {
                unset($info['_lastversion']);
            }
            if (isset($info['#binarypackage'])) {
                unset($info['#binarypackage']);
            }
            return $info;
        }
    }

    function packageInfo($field)
    {
        $arr = $this->getArray(true);
        if ($field == 'state') {
            return $arr['stability']['release'];
        }
        if ($field == 'api-version') {
            return $arr['version']['api'];
        }
        if ($field == 'api-state') {
            return $arr['stability']['api'];
        }
        if (isset($arr['old'][$field])) {
            if (!is_string($arr['old'][$field])) {
                return null;
            }
            return $arr['old'][$field];
        }
        if (isset($arr[$field])) {
            if (!is_string($arr[$field])) {
                return null;
            }
            return $arr[$field];
        }
        return null;
    }

    function getName()
    {
        return $this->getPackage();
    }

    function getPackage()
    {
        if (isset($this->_packageInfo['name'])) {
            return $this->_packageInfo['name'];
        }
        return false;
    }

    function getChannel()
    {
        if (isset($this->_packageInfo['uri'])) {
            return '__uri';
        }
        if (isset($this->_packageInfo['channel'])) {
            return strtolower($this->_packageInfo['channel']);
        }
        return false;
    }

    function getUri()
    {
        if (isset($this->_packageInfo['uri'])) {
            return $this->_packageInfo['uri'];
        }
        return false;
    }

    function getExtends()
    {
        if (isset($this->_packageInfo['extends'])) {
            return $this->_packageInfo['extends'];
        }
        return false;
    }

    function getSummary()
    {
        if (isset($this->_packageInfo['summary'])) {
            return $this->_packageInfo['summary'];
        }
        return false;
    }

    function getDescription()
    {
        if (isset($this->_packageInfo['description'])) {
            return $this->_packageInfo['description'];
        }
        return false;
    }

    function getMaintainers($raw = false)
    {
        if (!isset($this->_packageInfo['lead'])) {
            return false;
        }
        if ($raw) {
            $ret = array('lead' => $this->_packageInfo['lead']);
            (isset($this->_packageInfo['developer'])) ?
                $ret['developer'] = $this->_packageInfo['developer'] :null;
            (isset($this->_packageInfo['contributor'])) ?
                $ret['contributor'] = $this->_packageInfo['contributor'] :null;
            (isset($this->_packageInfo['helper'])) ?
                $ret['helper'] = $this->_packageInfo['helper'] :null;
            return $ret;
        } else {
            $ret = array();
            $leads = isset($this->_packageInfo['lead'][0]) ? $this->_packageInfo['lead'] :
                array($this->_packageInfo['lead']);
            foreach ($leads as $lead) {
                $s = $lead;
                $s['handle'] = $s['user'];
                unset($s['user']);
                $s['role'] = 'lead';
                $ret[] = $s;
            }
            if (isset($this->_packageInfo['developer'])) {
                $leads = isset($this->_packageInfo['developer'][0]) ?
                    $this->_packageInfo['developer'] :
                    array($this->_packageInfo['developer']);
                foreach ($leads as $maintainer) {
                    $s = $maintainer;
                    $s['handle'] = $s['user'];
                    unset($s['user']);
                    $s['role'] = 'developer';
                    $ret[] = $s;
                }
            }
            if (isset($this->_packageInfo['contributor'])) {
                $leads = isset($this->_packageInfo['contributor'][0]) ?
                    $this->_packageInfo['contributor'] :
                    array($this->_packageInfo['contributor']);
                foreach ($leads as $maintainer) {
                    $s = $maintainer;
                    $s['handle'] = $s['user'];
                    unset($s['user']);
                    $s['role'] = 'contributor';
                    $ret[] = $s;
                }
            }
            if (isset($this->_packageInfo['helper'])) {
                $leads = isset($this->_packageInfo['helper'][0]) ?
                    $this->_packageInfo['helper'] :
                    array($this->_packageInfo['helper']);
                foreach ($leads as $maintainer) {
                    $s = $maintainer;
                    $s['handle'] = $s['user'];
                    unset($s['user']);
                    $s['role'] = 'helper';
                    $ret[] = $s;
                }
            }
            return $ret;
        }
        return false;
    }

    function getLeads()
    {
        if (isset($this->_packageInfo['lead'])) {
            return $this->_packageInfo['lead'];
        }
        return false;
    }

    function getDevelopers()
    {
        if (isset($this->_packageInfo['developer'])) {
            return $this->_packageInfo['developer'];
        }
        return false;
    }

    function getContributors()
    {
        if (isset($this->_packageInfo['contributor'])) {
            return $this->_packageInfo['contributor'];
        }
        return false;
    }

    function getHelpers()
    {
        if (isset($this->_packageInfo['helper'])) {
            return $this->_packageInfo['helper'];
        }
        return false;
    }

    function setDate($date)
    {
        if (!isset($this->_packageInfo['date'])) {
            // ensure that the extends tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                array('time', 'version',
                    'stability', 'license', 'notes', 'contents', 'compatible',
                    'dependencies', 'providesextension', 'srcpackage', 'srcuri',
                    'phprelease', 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease',
                    'zendextbinrelease', 'bundle', 'changelog'), array(), 'date');
        }
        $this->_packageInfo['date'] = $date;
        $this->_isValid = 0;
    }

    function setTime($time)
    {
        $this->_isValid = 0;
        if (!isset($this->_packageInfo['time'])) {
            // ensure that the time tag is set up in the right location
            $this->_packageInfo = $this->_insertBefore($this->_packageInfo,
                    array('version',
                    'stability', 'license', 'notes', 'contents', 'compatible',
                    'dependencies', 'providesextension', 'srcpackage', 'srcuri',
                    'phprelease', 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease',
                    'zendextbinrelease', 'bundle', 'changelog'), $time, 'time');
        }
        $this->_packageInfo['time'] = $time;
    }

    function getDate()
    {
        if (isset($this->_packageInfo['date'])) {
            return $this->_packageInfo['date'];
        }
        return false;
    }

    function getTime()
    {
        if (isset($this->_packageInfo['time'])) {
            return $this->_packageInfo['time'];
        }
        return false;
    }

    /**
     * @param package|api version category to return
     */
    function getVersion($key = 'release')
    {
        if (isset($this->_packageInfo['version'][$key])) {
            return $this->_packageInfo['version'][$key];
        }
        return false;
    }

    function getStability()
    {
        if (isset($this->_packageInfo['stability'])) {
            return $this->_packageInfo['stability'];
        }
        return false;
    }

    function getState($key = 'release')
    {
        if (isset($this->_packageInfo['stability'][$key])) {
            return $this->_packageInfo['stability'][$key];
        }
        return false;
    }

    function getLicense($raw = false)
    {
        if (isset($this->_packageInfo['license'])) {
            if ($raw) {
                return $this->_packageInfo['license'];
            }
            if (is_array($this->_packageInfo['license'])) {
                return $this->_packageInfo['license']['_content'];
            } else {
                return $this->_packageInfo['license'];
            }
        }
        return false;
    }

    function getLicenseLocation()
    {
        if (!isset($this->_packageInfo['license']) || !is_array($this->_packageInfo['license'])) {
            return false;
        }
        return $this->_packageInfo['license']['attribs'];
    }

    function getNotes()
    {
        if (isset($this->_packageInfo['notes'])) {
            return $this->_packageInfo['notes'];
        }
        return false;
    }

    /**
     * Return the <usesrole> tag contents, if any
     * @return array|false
     */
    function getUsesrole()
    {
        if (isset($this->_packageInfo['usesrole'])) {
            return $this->_packageInfo['usesrole'];
        }
        return false;
    }

    /**
     * Return the <usestask> tag contents, if any
     * @return array|false
     */
    function getUsestask()
    {
        if (isset($this->_packageInfo['usestask'])) {
            return $this->_packageInfo['usestask'];
        }
        return false;
    }

    /**
     * This should only be used to retrieve filenames and install attributes
     */
    function getFilelist($preserve = false)
    {
        if (isset($this->_packageInfo['filelist']) && !$preserve) {
            return $this->_packageInfo['filelist'];
        }
        $this->flattenFilelist();
        if ($contents = $this->getContents()) {
            $ret = array();
            if (!isset($contents['dir'])) {
                return false;
            }
            if (!isset($contents['dir']['file'][0])) {
                $contents['dir']['file'] = array($contents['dir']['file']);
            }
            foreach ($contents['dir']['file'] as $file) {
                if (!isset($file['attribs']['name'])) {
                    continue;
                }
                $name = $file['attribs']['name'];
                if (!$preserve) {
                    $file = $file['attribs'];
                }
                $ret[$name] = $file;
            }
            if (!$preserve) {
                $this->_packageInfo['filelist'] = $ret;
            }
            return $ret;
        }
        return false;
    }

    /**
     * Return configure options array, if any
     *
     * @return array|false
     */
    function getConfigureOptions()
    {
        if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') {
            return false;
        }

        $releases = $this->getReleases();
        if (isset($releases[0])) {
            $releases = $releases[0];
        }

        if (isset($releases['configureoption'])) {
            if (!isset($releases['configureoption'][0])) {
                $releases['configureoption'] = array($releases['configureoption']);
            }

            for ($i = 0; $i < count($releases['configureoption']); $i++) {
                $releases['configureoption'][$i] = $releases['configureoption'][$i]['attribs'];
            }

            return $releases['configureoption'];
        }

        return false;
    }

    /**
     * This is only used at install-time, after all serialization
     * is over.
     */
    function resetFilelist()
    {
        $this->_packageInfo['filelist'] = array();
    }

    /**
     * Retrieve a list of files that should be installed on this computer
     * @return array
     */
    function getInstallationFilelist($forfilecheck = false)
    {
        $contents = $this->getFilelist(true);
        if (isset($contents['dir']['attribs']['baseinstalldir'])) {
            $base = $contents['dir']['attribs']['baseinstalldir'];
        }
        if (isset($this->_packageInfo['bundle'])) {
            return PEAR::raiseError(
                'Exception: bundles should be handled in download code only');
        }
        $release = $this->getReleases();
        if ($release) {
            if (!isset($release[0])) {
                if (!isset($release['installconditions']) && !isset($release['filelist'])) {
                    if ($forfilecheck) {
                        return $this->getFilelist();
                    }
                    return $contents;
                }
                $release = array($release);
            }
            $depchecker = &$this->getPEARDependency2($this->_config, array(),
                array('channel' => $this->getChannel(), 'package' => $this->getPackage()),
                PEAR_VALIDATE_INSTALLING);
            foreach ($release as $instance) {
                if (isset($instance['installconditions'])) {
                    $installconditions = $instance['installconditions'];
                    if (is_array($installconditions)) {
                        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
                        foreach ($installconditions as $type => $conditions) {
                            if (!isset($conditions[0])) {
                                $conditions = array($conditions);
                            }
                            foreach ($conditions as $condition) {
                                $ret = $depchecker->{"validate{$type}Dependency"}($condition);
                                if (PEAR::isError($ret)) {
                                    PEAR::popErrorHandling();
                                    continue 3; // skip this release
                                }
                            }
                        }
                        PEAR::popErrorHandling();
                    }
                }
                // this is the release to use
                if (isset($instance['filelist'])) {
                    // ignore files
                    if (isset($instance['filelist']['ignore'])) {
                        $ignore = isset($instance['filelist']['ignore'][0]) ?
                            $instance['filelist']['ignore'] :
                            array($instance['filelist']['ignore']);
                        foreach ($ignore as $ig) {
                            unset ($contents[$ig['attribs']['name']]);
                        }
                    }
                    // install files as this name
                    if (isset($instance['filelist']['install'])) {
                        $installas = isset($instance['filelist']['install'][0]) ?
                            $instance['filelist']['install'] :
                            array($instance['filelist']['install']);
                        foreach ($installas as $as) {
                            $contents[$as['attribs']['name']]['attribs']['install-as'] =
                                $as['attribs']['as'];
                        }
                    }
                }
                if ($forfilecheck) {
                    foreach ($contents as $file => $attrs) {
                        $contents[$file] = $attrs['attribs'];
                    }
                }
                return $contents;
            }
        } else { // simple release - no installconditions or install-as
            if ($forfilecheck) {
                return $this->getFilelist();
            }
            return $contents;
        }
        // no releases matched
        return PEAR::raiseError('No releases in package.xml matched the existing operating ' .
            'system, extensions installed, or architecture, cannot install');
    }

    /**
     * This is only used at install-time, after all serialization
     * is over.
     * @param string file name
     * @param string installed path
     */
    function setInstalledAs($file, $path)
    {
        if ($path) {
            return $this->_packageInfo['filelist'][$file]['installed_as'] = $path;
        }
        unset($this->_packageInfo['filelist'][$file]['installed_as']);
    }

    function getInstalledLocation($file)
    {
        if (isset($this->_packageInfo['filelist'][$file]['installed_as'])) {
            return $this->_packageInfo['filelist'][$file]['installed_as'];
        }
        return false;
    }

    /**
     * This is only used at install-time, after all serialization
     * is over.
     */
    function installedFile($file, $atts)
    {
        if (isset($this->_packageInfo['filelist'][$file])) {
            $this->_packageInfo['filelist'][$file] =
                array_merge($this->_packageInfo['filelist'][$file], $atts['attribs']);
        } else {
            $this->_packageInfo['filelist'][$file] = $atts['attribs'];
        }
    }

    /**
     * Retrieve the contents tag
     */
    function getContents()
    {
        if (isset($this->_packageInfo['contents'])) {
            return $this->_packageInfo['contents'];
        }
        return false;
    }

    /**
     * @param string full path to file
     * @param string attribute name
     * @param string attribute value
     * @param int risky but fast - use this to choose a file based on its position in the list
     *            of files.  Index is zero-based like PHP arrays.
     * @return bool success of operation
     */
    function setFileAttribute($filename, $attr, $value, $index = false)
    {
        $this->_isValid = 0;
        if (in_array($attr, array('role', 'name', 'baseinstalldir'))) {
            $this->_filesValid = false;
        }
        if ($index !== false &&
              isset($this->_packageInfo['contents']['dir']['file'][$index]['attribs'])) {
            $this->_packageInfo['contents']['dir']['file'][$index]['attribs'][$attr] = $value;
            return true;
        }
        if (!isset($this->_packageInfo['contents']['dir']['file'])) {
            return false;
        }
        $files = $this->_packageInfo['contents']['dir']['file'];
        if (!isset($files[0])) {
            $files = array($files);
            $ind = false;
        } else {
            $ind = true;
        }
        foreach ($files as $i => $file) {
            if (isset($file['attribs'])) {
                if ($file['attribs']['name'] == $filename) {
                    if ($ind) {
                        $this->_packageInfo['contents']['dir']['file'][$i]['attribs'][$attr] = $value;
                    } else {
                        $this->_packageInfo['contents']['dir']['file']['attribs'][$attr] = $value;
                    }
                    return true;
                }
            }
        }
        return false;
    }

    function setDirtree($path)
    {
        if (!isset($this->_packageInfo['dirtree'])) {
            $this->_packageInfo['dirtree'] = array();
        }
        $this->_packageInfo['dirtree'][$path] = true;
    }

    function getDirtree()
    {
        if (isset($this->_packageInfo['dirtree']) && count($this->_packageInfo['dirtree'])) {
            return $this->_packageInfo['dirtree'];
        }
        return false;
    }

    function resetDirtree()
    {
        unset($this->_packageInfo['dirtree']);
    }

    /**
     * Determines whether this package claims it is compatible with the version of
     * the package that has a recommended version dependency
     * @param PEAR_PackageFile_v2|PEAR_PackageFile_v1|PEAR_Downloader_Package
     * @return boolean
     */
    function isCompatible($pf)
    {
        if (!isset($this->_packageInfo['compatible'])) {
            return false;
        }
        if (!isset($this->_packageInfo['channel'])) {
            return false;
        }
        $me = $pf->getVersion();
        $compatible = $this->_packageInfo['compatible'];
        if (!isset($compatible[0])) {
            $compatible = array($compatible);
        }
        $found = false;
        foreach ($compatible as $info) {
            if (strtolower($info['name']) == strtolower($pf->getPackage())) {
                if (strtolower($info['channel']) == strtolower($pf->getChannel())) {
                    $found = true;
                    break;
                }
            }
        }
        if (!$found) {
            return false;
        }
        if (isset($info['exclude'])) {
            if (!isset($info['exclude'][0])) {
                $info['exclude'] = array($info['exclude']);
            }
            foreach ($info['exclude'] as $exclude) {
                if (version_compare($me, $exclude, '==')) {
                    return false;
                }
            }
        }
        if (version_compare($me, $info['min'], '>=') && version_compare($me, $info['max'], '<=')) {
            return true;
        }
        return false;
    }

    /**
     * @return array|false
     */
    function getCompatible()
    {
        if (isset($this->_packageInfo['compatible'])) {
            return $this->_packageInfo['compatible'];
        }
        return false;
    }

    function getDependencies()
    {
        if (isset($this->_packageInfo['dependencies'])) {
            return $this->_packageInfo['dependencies'];
        }
        return false;
    }

    function isSubpackageOf($p)
    {
        return $p->isSubpackage($this);
    }

    /**
     * Determines whether the passed in package is a subpackage of this package.
     *
     * No version checking is done, only name verification.
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @return bool
     */
    function isSubpackage($p)
    {
        $sub = array();
        if (isset($this->_packageInfo['dependencies']['required']['subpackage'])) {
            $sub = $this->_packageInfo['dependencies']['required']['subpackage'];
            if (!isset($sub[0])) {
                $sub = array($sub);
            }
        }
        if (isset($this->_packageInfo['dependencies']['optional']['subpackage'])) {
            $sub1 = $this->_packageInfo['dependencies']['optional']['subpackage'];
            if (!isset($sub1[0])) {
                $sub1 = array($sub1);
            }
            $sub = array_merge($sub, $sub1);
        }
        if (isset($this->_packageInfo['dependencies']['group'])) {
            $group = $this->_packageInfo['dependencies']['group'];
            if (!isset($group[0])) {
                $group = array($group);
            }
            foreach ($group as $deps) {
                if (isset($deps['subpackage'])) {
                    $sub2 = $deps['subpackage'];
                    if (!isset($sub2[0])) {
                        $sub2 = array($sub2);
                    }
                    $sub = array_merge($sub, $sub2);
                }
            }
        }
        foreach ($sub as $dep) {
            if (strtolower($dep['name']) == strtolower($p->getPackage())) {
                if (isset($dep['channel'])) {
                    if (strtolower($dep['channel']) == strtolower($p->getChannel())) {
                        return true;
                    }
                } else {
                    if ($dep['uri'] == $p->getURI()) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    function dependsOn($package, $channel)
    {
        if (!($deps = $this->getDependencies())) {
            return false;
        }
        foreach (array('package', 'subpackage') as $type) {
            foreach (array('required', 'optional') as $needed) {
                if (isset($deps[$needed][$type])) {
                    if (!isset($deps[$needed][$type][0])) {
                        $deps[$needed][$type] = array($deps[$needed][$type]);
                    }
                    foreach ($deps[$needed][$type] as $dep) {
                        $depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri';
                        if (strtolower($dep['name']) == strtolower($package) &&
                              $depchannel == $channel) {
                            return true;
                        }
                    }
                }
            }
            if (isset($deps['group'])) {
                if (!isset($deps['group'][0])) {
                    $dep['group'] = array($deps['group']);
                }
                foreach ($deps['group'] as $group) {
                    if (isset($group[$type])) {
                        if (!is_array($group[$type])) {
                            $group[$type] = array($group[$type]);
                        }
                        foreach ($group[$type] as $dep) {
                            $depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri';
                            if (strtolower($dep['name']) == strtolower($package) &&
                                  $depchannel == $channel) {
                                return true;
                            }
                        }
                    }
                }
            }
        }
        return false;
    }

    /**
     * Get the contents of a dependency group
     * @param string
     * @return array|false
     */
    function getDependencyGroup($name)
    {
        $name = strtolower($name);
        if (!isset($this->_packageInfo['dependencies']['group'])) {
            return false;
        }
        $groups = $this->_packageInfo['dependencies']['group'];
        if (!isset($groups[0])) {
            $groups = array($groups);
        }
        foreach ($groups as $group) {
            if (strtolower($group['attribs']['name']) == $name) {
                return $group;
            }
        }
        return false;
    }

    /**
     * Retrieve a partial package.xml 1.0 representation of dependencies
     *
     * a very limited representation of dependencies is returned by this method.
     * The <exclude> tag for excluding certain versions of a dependency is
     * completely ignored.  In addition, dependency groups are ignored, with the
     * assumption that all dependencies in dependency groups are also listed in
     * the optional group that work with all dependency groups
     * @param boolean return package.xml 2.0 <dependencies> tag
     * @return array|false
     */
    function getDeps($raw = false, $nopearinstaller = false)
    {
        if (isset($this->_packageInfo['dependencies'])) {
            if ($raw) {
                return $this->_packageInfo['dependencies'];
            }
            $ret = array();
            $map = array(
                'php' => 'php',
                'package' => 'pkg',
                'subpackage' => 'pkg',
                'extension' => 'ext',
                'os' => 'os',
                'pearinstaller' => 'pkg',
                );
            foreach (array('required', 'optional') as $type) {
                $optional = ($type == 'optional') ? 'yes' : 'no';
                if (!isset($this->_packageInfo['dependencies'][$type])
                    || empty($this->_packageInfo['dependencies'][$type])) {
                    continue;
                }
                foreach ($this->_packageInfo['dependencies'][$type] as $dtype => $deps) {
                    if ($dtype == 'pearinstaller' && $nopearinstaller) {
                        continue;
                    }
                    if ((is_array($deps) && !isset($deps[0])) || !is_array($deps)) {
                        $deps = array($deps);
                    }
                    foreach ($deps as $dep) {
                        if (!isset($map[$dtype])) {
                            // no support for arch type
                            continue;
                        }
                        if ($dtype == 'pearinstaller') {
                            $dep['name'] = 'PEAR';
                            $dep['channel'] = 'pear.php.net';
                        }
                        $s = array('type' => $map[$dtype]);
                        if (isset($dep['channel'])) {
                            $s['channel'] = $dep['channel'];
                        }
                        if (isset($dep['uri'])) {
                            $s['uri'] = $dep['uri'];
                        }
                        if (isset($dep['name'])) {
                            $s['name'] = $dep['name'];
                        }
                        if (isset($dep['conflicts'])) {
                            $s['rel'] = 'not';
                        } else {
                            if (!isset($dep['min']) &&
                                  !isset($dep['max'])) {
                                $s['rel'] = 'has';
                                $s['optional'] = $optional;
                            } elseif (isset($dep['min']) &&
                                  isset($dep['max'])) {
                                $s['rel'] = 'ge';
                                $s1 = $s;
                                $s1['rel'] = 'le';
                                $s['version'] = $dep['min'];
                                $s1['version'] = $dep['max'];
                                if (isset($dep['channel'])) {
                                    $s1['channel'] = $dep['channel'];
                                }
                                if ($dtype != 'php') {
                                    $s['name'] = $dep['name'];
                                    $s1['name'] = $dep['name'];
                                }
                                $s['optional'] = $optional;
                                $s1['optional'] = $optional;
                                $ret[] = $s1;
                            } elseif (isset($dep['min'])) {
                                if (isset($dep['exclude']) &&
                                      $dep['exclude'] == $dep['min']) {
                                    $s['rel'] = 'gt';
                                } else {
                                    $s['rel'] = 'ge';
                                }
                                $s['version'] = $dep['min'];
                                $s['optional'] = $optional;
                                if ($dtype != 'php') {
                                    $s['name'] = $dep['name'];
                                }
                            } elseif (isset($dep['max'])) {
                                if (isset($dep['exclude']) &&
                                      $dep['exclude'] == $dep['max']) {
                                    $s['rel'] = 'lt';
                                } else {
                                    $s['rel'] = 'le';
                                }
                                $s['version'] = $dep['max'];
                                $s['optional'] = $optional;
                                if ($dtype != 'php') {
                                    $s['name'] = $dep['name'];
                                }
                            }
                        }
                        $ret[] = $s;
                    }
                }
            }
            if (count($ret)) {
                return $ret;
            }
        }
        return false;
    }

    /**
     * @return php|extsrc|extbin|zendextsrc|zendextbin|bundle|false
     */
    function getPackageType()
    {
        if (isset($this->_packageInfo['phprelease'])) {
            return 'php';
        }
        if (isset($this->_packageInfo['extsrcrelease'])) {
            return 'extsrc';
        }
        if (isset($this->_packageInfo['extbinrelease'])) {
            return 'extbin';
        }
        if (isset($this->_packageInfo['zendextsrcrelease'])) {
            return 'zendextsrc';
        }
        if (isset($this->_packageInfo['zendextbinrelease'])) {
            return 'zendextbin';
        }
        if (isset($this->_packageInfo['bundle'])) {
            return 'bundle';
        }
        return false;
    }

    /**
     * @return array|false
     */
    function getReleases()
    {
        $type = $this->getPackageType();
        if ($type != 'bundle') {
            $type .= 'release';
        }
        if ($this->getPackageType() && isset($this->_packageInfo[$type])) {
            return $this->_packageInfo[$type];
        }
        return false;
    }

    /**
     * @return array
     */
    function getChangelog()
    {
        if (isset($this->_packageInfo['changelog'])) {
            return $this->_packageInfo['changelog'];
        }
        return false;
    }

    function hasDeps()
    {
        return isset($this->_packageInfo['dependencies']);
    }

    function getPackagexmlVersion()
    {
        if (isset($this->_packageInfo['zendextsrcrelease'])) {
            return '2.1';
        }
        if (isset($this->_packageInfo['zendextbinrelease'])) {
            return '2.1';
        }
        return '2.0';
    }

    /**
     * @return array|false
     */
    function getSourcePackage()
    {
        if (isset($this->_packageInfo['extbinrelease']) ||
              isset($this->_packageInfo['zendextbinrelease'])) {
            return array('channel' => $this->_packageInfo['srcchannel'],
                         'package' => $this->_packageInfo['srcpackage']);
        }
        return false;
    }

    function getBundledPackages()
    {
        if (isset($this->_packageInfo['bundle'])) {
            return $this->_packageInfo['contents']['bundledpackage'];
        }
        return false;
    }

    function getLastModified()
    {
        if (isset($this->_packageInfo['_lastmodified'])) {
            return $this->_packageInfo['_lastmodified'];
        }
        return false;
    }

    /**
     * Get the contents of a file listed within the package.xml
     * @param string
     * @return string
     */
    function getFileContents($file)
    {
        if ($this->_archiveFile == $this->_packageFile) { // unpacked
            $dir = dirname($this->_packageFile);
            $file = $dir . DIRECTORY_SEPARATOR . $file;
            $file = str_replace(array('/', '\\'),
                array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR), $file);
            if (file_exists($file) && is_readable($file)) {
                return implode('', file($file));
            }
        } else { // tgz
            $tar = new Archive_Tar($this->_archiveFile);
            $tar->pushErrorHandling(PEAR_ERROR_RETURN);
            if ($file != 'package.xml' && $file != 'package2.xml') {
                $file = $this->getPackage() . '-' . $this->getVersion() . '/' . $file;
            }
            $file = $tar->extractInString($file);
            $tar->popErrorHandling();
            if (PEAR::isError($file)) {
                return PEAR::raiseError("Cannot locate file '$file' in archive");
            }
            return $file;
        }
    }

    function &getRW()
    {
        if (!class_exists('PEAR_PackageFile_v2_rw')) {
            require_once 'PEAR/PackageFile/v2/rw.php';
        }
        $a = new PEAR_PackageFile_v2_rw;
        foreach (get_object_vars($this) as $name => $unused) {
            if (!isset($this->$name)) {
                continue;
            }
            if ($name == '_config' || $name == '_logger'|| $name == '_registry' ||
                  $name == '_stack') {
                $a->$name = &$this->$name;
            } else {
                $a->$name = $this->$name;
            }
        }
        return $a;
    }

    function &getDefaultGenerator()
    {
        if (!class_exists('PEAR_PackageFile_Generator_v2')) {
            require_once 'PEAR/PackageFile/Generator/v2.php';
        }
        $a = new PEAR_PackageFile_Generator_v2($this);
        return $a;
    }

    function analyzeSourceCode($file, $string = false)
    {
        if (!isset($this->_v2Validator) ||
              !is_a($this->_v2Validator, 'PEAR_PackageFile_v2_Validator')) {
            if (!class_exists('PEAR_PackageFile_v2_Validator')) {
                require_once 'PEAR/PackageFile/v2/Validator.php';
            }
            $this->_v2Validator = new PEAR_PackageFile_v2_Validator;
        }
        return $this->_v2Validator->analyzeSourceCode($file, $string);
    }

    function validate($state = PEAR_VALIDATE_NORMAL)
    {
        if (!isset($this->_packageInfo) || !is_array($this->_packageInfo)) {
            return false;
        }
        if (!isset($this->_v2Validator) ||
              !is_a($this->_v2Validator, 'PEAR_PackageFile_v2_Validator')) {
            if (!class_exists('PEAR_PackageFile_v2_Validator')) {
                require_once 'PEAR/PackageFile/v2/Validator.php';
            }
            $this->_v2Validator = new PEAR_PackageFile_v2_Validator;
        }
        if (isset($this->_packageInfo['xsdversion'])) {
            unset($this->_packageInfo['xsdversion']);
        }
        return $this->_v2Validator->validate($this, $state);
    }

    function getTasksNs()
    {
        if (!isset($this->_tasksNs)) {
            if (isset($this->_packageInfo['attribs'])) {
                foreach ($this->_packageInfo['attribs'] as $name => $value) {
                    if ($value == 'http://pear.php.net/dtd/tasks-1.0') {
                        $this->_tasksNs = str_replace('xmlns:', '', $name);
                        break;
                    }
                }
            }
        }
        return $this->_tasksNs;
    }

    /**
     * Determine whether a task name is a valid task.  Custom tasks may be defined
     * using subdirectories by putting a "-" in the name, as in <tasks:mycustom-task>
     *
     * Note that this method will auto-load the task class file and test for the existence
     * of the name with "-" replaced by "_" as in PEAR/Task/mycustom/task.php makes class
     * PEAR_Task_mycustom_task
     * @param string
     * @return boolean
     */
    function getTask($task)
    {
        $this->getTasksNs();
        // transform all '-' to '/' and 'tasks:' to '' so tasks:replace becomes replace
        $task = str_replace(array($this->_tasksNs . ':', '-'), array('', ' '), $task);
        $taskfile = str_replace(' ', '/', ucwords($task));
        $task = str_replace(array(' ', '/'), '_', ucwords($task));
        if (class_exists("PEAR_Task_$task")) {
            return "PEAR_Task_$task";
        }
        $fp = @fopen("PEAR/Task/$taskfile.php", 'r', true);
        if ($fp) {
            fclose($fp);
            require_once "PEAR/Task/$taskfile.php";
            return "PEAR_Task_$task";
        }
        return false;
    }

    /**
     * Key-friendly array_splice
     * @param tagname to splice a value in before
     * @param mixed the value to splice in
     * @param string the new tag name
     */
    function _ksplice($array, $key, $value, $newkey)
    {
        $offset = array_search($key, array_keys($array));
        $after = array_slice($array, $offset);
        $before = array_slice($array, 0, $offset);
        $before[$newkey] = $value;
        return array_merge($before, $after);
    }

    /**
     * @param array a list of possible keys, in the order they may occur
     * @param mixed contents of the new package.xml tag
     * @param string tag name
     * @access private
     */
    function _insertBefore($array, $keys, $contents, $newkey)
    {
        foreach ($keys as $key) {
            if (isset($array[$key])) {
                return $array = $this->_ksplice($array, $key, $contents, $newkey);
            }
        }
        $array[$newkey] = $contents;
        return $array;
    }

    /**
     * @param subsection of {@link $_packageInfo}
     * @param array|string tag contents
     * @param array format:
     * <pre>
     * array(
     *   tagname => array(list of tag names that follow this one),
     *   childtagname => array(list of child tag names that follow this one),
     * )
     * </pre>
     *
     * This allows construction of nested tags
     * @access private
     */
    function _mergeTag($manip, $contents, $order)
    {
        if (count($order)) {
            foreach ($order as $tag => $curorder) {
                if (!isset($manip[$tag])) {
                    // ensure that the tag is set up
                    $manip = $this->_insertBefore($manip, $curorder, array(), $tag);
                }
                if (count($order) > 1) {
                    $manip[$tag] = $this->_mergeTag($manip[$tag], $contents, array_slice($order, 1));
                    return $manip;
                }
            }
        } else {
            return $manip;
        }
        if (is_array($manip[$tag]) && !empty($manip[$tag]) && isset($manip[$tag][0])) {
            $manip[$tag][] = $contents;
        } else {
            if (is_array($manip[$tag]) && !count($manip[$tag])) {
                $manip[$tag] = $contents;
            } else {
                $manip[$tag] = array($manip[$tag]);
                $manip[$tag][] = $contents;
            }
        }
        return $manip;
    }
}
?>
PK�a�\،�w��pear/PEAR/Installer.phpnu�[���<?php
/**
 * PEAR_Installer
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V. Cox <cox@idecnet.com>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * Used for installation groups in package.xml 2.0 and platform exceptions
 */
require_once 'OS/Guess.php';
require_once 'PEAR/Downloader.php';

define('PEAR_INSTALLER_NOBINARY', -240);
/**
 * Administration class used to install PEAR packages and maintain the
 * installed package database.
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V. Cox <cox@idecnet.com>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Installer extends PEAR_Downloader
{
    // {{{ properties

    /** name of the package directory, for example Foo-1.0
     * @var string
     */
    var $pkgdir;

    /** directory where PHP code files go
     * @var string
     */
    var $phpdir;

    /** directory where PHP extension files go
     * @var string
     */
    var $extdir;

    /** directory where documentation goes
     * @var string
     */
    var $docdir;

    /** installation root directory (ala PHP's INSTALL_ROOT or
     * automake's DESTDIR
     * @var string
     */
    var $installroot = '';

    /** debug level
     * @var int
     */
    var $debug = 1;

    /** temporary directory
     * @var string
     */
    var $tmpdir;

    /**
     * PEAR_Registry object used by the installer
     * @var PEAR_Registry
     */
    var $registry;

    /**
     * array of PEAR_Downloader_Packages
     * @var array
     */
    var $_downloadedPackages;

    /** List of file transactions queued for an install/upgrade/uninstall.
     *
     *  Format:
     *    array(
     *      0 => array("rename => array("from-file", "to-file")),
     *      1 => array("delete" => array("file-to-delete")),
     *      ...
     *    )
     *
     * @var array
     */
    var $file_operations = array();

    // }}}

    // {{{ constructor

    /**
     * PEAR_Installer constructor.
     *
     * @param object $ui user interface object (instance of PEAR_Frontend_*)
     *
     * @access public
     */
    function __construct(&$ui)
    {
        parent::__construct($ui, array(), null);
        $this->setFrontendObject($ui);
        $this->debug = $this->config->get('verbose');
    }

    function setOptions($options)
    {
        $this->_options = $options;
    }

    function setConfig(&$config)
    {
        $this->config    = &$config;
        $this->_registry = &$config->getRegistry();
    }

    // }}}

    function _removeBackups($files)
    {
        foreach ($files as $path) {
            $this->addFileOperation('removebackup', array($path));
        }
    }

    // {{{ _deletePackageFiles()

    /**
     * Delete a package's installed files, does not remove empty directories.
     *
     * @param string package name
     * @param string channel name
     * @param bool if true, then files are backed up first
     * @return bool TRUE on success, or a PEAR error on failure
     * @access protected
     */
    function _deletePackageFiles($package, $channel = false, $backup = false)
    {
        if (!$channel) {
            $channel = 'pear.php.net';
        }

        if (!strlen($package)) {
            return $this->raiseError("No package to uninstall given");
        }

        if (strtolower($package) == 'pear' && $channel == 'pear.php.net') {
            // to avoid race conditions, include all possible needed files
            require_once 'PEAR/Task/Common.php';
            require_once 'PEAR/Task/Replace.php';
            require_once 'PEAR/Task/Unixeol.php';
            require_once 'PEAR/Task/Windowseol.php';
            require_once 'PEAR/PackageFile/v1.php';
            require_once 'PEAR/PackageFile/v2.php';
            require_once 'PEAR/PackageFile/Generator/v1.php';
            require_once 'PEAR/PackageFile/Generator/v2.php';
        }

        $filelist = $this->_registry->packageInfo($package, 'filelist', $channel);
        if ($filelist == null) {
            return $this->raiseError("$channel/$package not installed");
        }

        $ret = array();
        foreach ($filelist as $file => $props) {
            if (empty($props['installed_as'])) {
                continue;
            }

            $path = $props['installed_as'];
            if ($backup) {
                $this->addFileOperation('backup', array($path));
                $ret[] = $path;
            }

            $this->addFileOperation('delete', array($path));
        }

        if ($backup) {
            return $ret;
        }

        return true;
    }

    // }}}
    // {{{ _installFile()

    /**
     * @param string filename
     * @param array attributes from <file> tag in package.xml
     * @param string path to install the file in
     * @param array options from command-line
     * @access private
     */
    function _installFile($file, $atts, $tmp_path, $options)
    {
        // {{{ return if this file is meant for another platform
        static $os;
        if (!isset($this->_registry)) {
            $this->_registry = &$this->config->getRegistry();
        }

        if (isset($atts['platform'])) {
            if (empty($os)) {
                $os = new OS_Guess();
            }

            if (strlen($atts['platform']) && $atts['platform'][0] == '!') {
                $negate   = true;
                $platform = substr($atts['platform'], 1);
            } else {
                $negate    = false;
                $platform = $atts['platform'];
            }

            if ((bool) $os->matchSignature($platform) === $negate) {
                $this->log(3, "skipped $file (meant for $atts[platform], we are ".$os->getSignature().")");
                return PEAR_INSTALLER_SKIPPED;
            }
        }
        // }}}

        $channel = $this->pkginfo->getChannel();
        // {{{ assemble the destination paths
        switch ($atts['role']) {
            case 'src':
            case 'extsrc':
                $this->source_files++;
                return;
            case 'doc':
            case 'data':
            case 'test':
                $dest_dir = $this->config->get($atts['role'] . '_dir', null, $channel) .
                            DIRECTORY_SEPARATOR . $this->pkginfo->getPackage();
                unset($atts['baseinstalldir']);
                break;
            case 'ext':
            case 'php':
                $dest_dir = $this->config->get($atts['role'] . '_dir', null, $channel);
                break;
            case 'script':
                $dest_dir = $this->config->get('bin_dir', null, $channel);
                break;
            default:
                return $this->raiseError("Invalid role `$atts[role]' for file $file");
        }

        $save_destdir = $dest_dir;
        if (!empty($atts['baseinstalldir'])) {
            $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir'];
        }

        if (dirname($file) != '.' && empty($atts['install-as'])) {
            $dest_dir .= DIRECTORY_SEPARATOR . dirname($file);
        }

        if (empty($atts['install-as'])) {
            $dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file);
        } else {
            $dest_file = $dest_dir . DIRECTORY_SEPARATOR . $atts['install-as'];
        }
        $orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file;

        // Clean up the DIRECTORY_SEPARATOR mess
        $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR;
        list($dest_file, $orig_file) = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"),
                                                    array(DIRECTORY_SEPARATOR,
                                                          DIRECTORY_SEPARATOR,
                                                          DIRECTORY_SEPARATOR),
                                                    array($dest_file, $orig_file));
        $final_dest_file = $installed_as = $dest_file;
        if (isset($this->_options['packagingroot'])) {
            $installedas_dest_dir  = dirname($final_dest_file);
            $installedas_dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file);
            $final_dest_file = $this->_prependPath($final_dest_file, $this->_options['packagingroot']);
        } else {
            $installedas_dest_dir  = dirname($final_dest_file);
            $installedas_dest_file = $installedas_dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file);
        }

        $dest_dir  = dirname($final_dest_file);
        $dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file);
        if (preg_match('~/\.\.(/|\\z)|^\.\./~', str_replace('\\', '/', $dest_file))) {
            return $this->raiseError("SECURITY ERROR: file $file (installed to $dest_file) contains parent directory reference ..", PEAR_INSTALLER_FAILED);
        }
        // }}}

        if (empty($this->_options['register-only']) &&
              (!file_exists($dest_dir) || !is_dir($dest_dir))) {
            if (!$this->mkDirHier($dest_dir)) {
                return $this->raiseError("failed to mkdir $dest_dir",
                                         PEAR_INSTALLER_FAILED);
            }
            $this->log(3, "+ mkdir $dest_dir");
        }

        // pretty much nothing happens if we are only registering the install
        if (empty($this->_options['register-only'])) {
            if (empty($atts['replacements'])) {
                if (!file_exists($orig_file)) {
                    return $this->raiseError("file $orig_file does not exist",
                                             PEAR_INSTALLER_FAILED);
                }

                if (!@copy($orig_file, $dest_file)) {
                    return $this->raiseError(
                        "failed to write $dest_file: " . error_get_last()["message"],
                        PEAR_INSTALLER_FAILED);
                }

                $this->log(3, "+ cp $orig_file $dest_file");
                if (isset($atts['md5sum'])) {
                    $md5sum = md5_file($dest_file);
                }
            } else {
                // {{{ file with replacements
                if (!file_exists($orig_file)) {
                    return $this->raiseError("file does not exist",
                                             PEAR_INSTALLER_FAILED);
                }

                $contents = file_get_contents($orig_file);
                if ($contents === false) {
                    $contents = '';
                }

                if (isset($atts['md5sum'])) {
                    $md5sum = md5($contents);
                }

                $subst_from = $subst_to = array();
                foreach ($atts['replacements'] as $a) {
                    $to = '';
                    if ($a['type'] == 'php-const') {
                        if (preg_match('/^[a-z0-9_]+\\z/i', $a['to'])) {
                            eval("\$to = $a[to];");
                        } else {
                            if (!isset($options['soft'])) {
                                $this->log(0, "invalid php-const replacement: $a[to]");
                            }
                            continue;
                        }
                    } elseif ($a['type'] == 'pear-config') {
                        if ($a['to'] == 'master_server') {
                            $chan = $this->_registry->getChannel($channel);
                            if (!PEAR::isError($chan)) {
                                $to = $chan->getServer();
                            } else {
                                $to = $this->config->get($a['to'], null, $channel);
                            }
                        } else {
                            $to = $this->config->get($a['to'], null, $channel);
                        }
                        if (is_null($to)) {
                            if (!isset($options['soft'])) {
                                $this->log(0, "invalid pear-config replacement: $a[to]");
                            }
                            continue;
                        }
                    } elseif ($a['type'] == 'package-info') {
                        if ($t = $this->pkginfo->packageInfo($a['to'])) {
                            $to = $t;
                        } else {
                            if (!isset($options['soft'])) {
                                $this->log(0, "invalid package-info replacement: $a[to]");
                            }
                            continue;
                        }
                    }
                    if (!is_null($to)) {
                        $subst_from[] = $a['from'];
                        $subst_to[] = $to;
                    }
                }

                $this->log(3, "doing ".sizeof($subst_from)." substitution(s) for $final_dest_file");
                if (sizeof($subst_from)) {
                    $contents = str_replace($subst_from, $subst_to, $contents);
                }

                $wp = @fopen($dest_file, "wb");
                if (!is_resource($wp)) {
                    return $this->raiseError(
                        "failed to create $dest_file: " . error_get_last()["message"],
                        PEAR_INSTALLER_FAILED);
                }

                if (@fwrite($wp, $contents) === false) {
                    return $this->raiseError(
                        "failed writing to $dest_file: " . error_get_last()["message"],
                        PEAR_INSTALLER_FAILED);
                }

                fclose($wp);
                // }}}
            }

            // {{{ check the md5
            if (isset($md5sum)) {
                if (strtolower($md5sum) === strtolower($atts['md5sum'])) {
                    $this->log(2, "md5sum ok: $final_dest_file");
                } else {
                    if (empty($options['force'])) {
                        // delete the file
                        if (file_exists($dest_file)) {
                            unlink($dest_file);
                        }

                        if (!isset($options['ignore-errors'])) {
                            return $this->raiseError("bad md5sum for file $final_dest_file",
                                                 PEAR_INSTALLER_FAILED);
                        }

                        if (!isset($options['soft'])) {
                            $this->log(0, "warning : bad md5sum for file $final_dest_file");
                        }
                    } else {
                        if (!isset($options['soft'])) {
                            $this->log(0, "warning : bad md5sum for file $final_dest_file");
                        }
                    }
                }
            }
            // }}}
            // {{{ set file permissions
            if (!OS_WINDOWS) {
                if ($atts['role'] == 'script') {
                    $mode = 0777 & ~(int)octdec($this->config->get('umask'));
                    $this->log(3, "+ chmod +x $dest_file");
                } else {
                    $mode = 0666 & ~(int)octdec($this->config->get('umask'));
                }

                if ($atts['role'] != 'src') {
                    $this->addFileOperation("chmod", array($mode, $dest_file));
                    if (!@chmod($dest_file, $mode)) {
                        if (!isset($options['soft'])) {
                            $this->log(0, "failed to change mode of $dest_file: " .
                                          error_get_last()["message"]);
                        }
                    }
                }
            }
            // }}}

            if ($atts['role'] == 'src') {
                rename($dest_file, $final_dest_file);
                $this->log(2, "renamed source file $dest_file to $final_dest_file");
            } else {
                $this->addFileOperation("rename", array($dest_file, $final_dest_file,
                    $atts['role'] == 'ext'));
            }
        }

        // Store the full path where the file was installed for easy unistall
        if ($atts['role'] != 'script') {
            $loc = $this->config->get($atts['role'] . '_dir');
        } else {
            $loc = $this->config->get('bin_dir');
        }

        if ($atts['role'] != 'src') {
            $this->addFileOperation("installed_as", array($file, $installed_as,
                                    $loc,
                                    dirname(substr($installedas_dest_file, strlen($loc)))));
        }

        //$this->log(2, "installed: $dest_file");
        return PEAR_INSTALLER_OK;
    }

    // }}}
    // {{{ _installFile2()

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param string filename
     * @param array attributes from <file> tag in package.xml
     * @param string path to install the file in
     * @param array options from command-line
     * @access private
     */
    function _installFile2(&$pkg, $file, &$real_atts, $tmp_path, $options)
    {
        $atts = $real_atts;
        if (!isset($this->_registry)) {
            $this->_registry = &$this->config->getRegistry();
        }

        $channel = $pkg->getChannel();
        // {{{ assemble the destination paths
        if (!in_array($atts['attribs']['role'],
              PEAR_Installer_Role::getValidRoles($pkg->getPackageType()))) {
            return $this->raiseError('Invalid role `' . $atts['attribs']['role'] .
                    "' for file $file");
        }

        $role = &PEAR_Installer_Role::factory($pkg, $atts['attribs']['role'], $this->config);
        $err  = $role->setup($this, $pkg, $atts['attribs'], $file);
        if (PEAR::isError($err)) {
            return $err;
        }

        if (!$role->isInstallable()) {
            return;
        }

        $info = $role->processInstallation($pkg, $atts['attribs'], $file, $tmp_path);
        if (PEAR::isError($info)) {
            return $info;
        }

        list($save_destdir, $dest_dir, $dest_file, $orig_file) = $info;
        if (preg_match('~/\.\.(/|\\z)|^\.\./~', str_replace('\\', '/', $dest_file))) {
            return $this->raiseError("SECURITY ERROR: file $file (installed to $dest_file) contains parent directory reference ..", PEAR_INSTALLER_FAILED);
        }

        $final_dest_file = $installed_as = $dest_file;
        if (isset($this->_options['packagingroot'])) {
            $final_dest_file = $this->_prependPath($final_dest_file,
                $this->_options['packagingroot']);
        }

        $dest_dir  = dirname($final_dest_file);
        $dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file);
        // }}}

        if (empty($this->_options['register-only'])) {
            if (!file_exists($dest_dir) || !is_dir($dest_dir)) {
                if (!$this->mkDirHier($dest_dir)) {
                    return $this->raiseError("failed to mkdir $dest_dir",
                                             PEAR_INSTALLER_FAILED);
                }
                $this->log(3, "+ mkdir $dest_dir");
            }
        }

        $attribs = $atts['attribs'];
        unset($atts['attribs']);
        // pretty much nothing happens if we are only registering the install
        if (empty($this->_options['register-only'])) {
            if (!count($atts)) { // no tasks
                if (!file_exists($orig_file)) {
                    return $this->raiseError("file $orig_file does not exist",
                                             PEAR_INSTALLER_FAILED);
                }

                if (!@copy($orig_file, $dest_file)) {
                    return $this->raiseError(
                        "failed to write $dest_file: " . error_get_last()["message"],
                        PEAR_INSTALLER_FAILED);
                }

                $this->log(3, "+ cp $orig_file $dest_file");
                if (isset($attribs['md5sum'])) {
                    $md5sum = md5_file($dest_file);
                }
            } else { // file with tasks
                if (!file_exists($orig_file)) {
                    return $this->raiseError("file $orig_file does not exist",
                                             PEAR_INSTALLER_FAILED);
                }

                $contents = file_get_contents($orig_file);
                if ($contents === false) {
                    $contents = '';
                }

                if (isset($attribs['md5sum'])) {
                    $md5sum = md5($contents);
                }

                foreach ($atts as $tag => $raw) {
                    $tag = str_replace(array($pkg->getTasksNs() . ':', '-'), array('', '_'), $tag);
                    $task = "PEAR_Task_$tag";
                    $task = new $task($this->config, $this, PEAR_TASK_INSTALL);
                    if (!$task->isScript()) { // scripts are only handled after installation
                        $task->init($raw, $attribs, $pkg->getLastInstalledVersion());
                        $res = $task->startSession($pkg, $contents, $final_dest_file);
                        if ($res === false) {
                            continue; // skip this file
                        }

                        if (PEAR::isError($res)) {
                            return $res;
                        }

                        $contents = $res; // save changes
                    }

                    $wp = @fopen($dest_file, "wb");
                    if (!is_resource($wp)) {
                        return $this->raiseError(
                            "failed to create $dest_file: " . error_get_last()["message"],
                            PEAR_INSTALLER_FAILED);
                    }

                    if (fwrite($wp, $contents) === false) {
                        return $this->raiseError(
                            "failed writing to $dest_file: " . error_get_last()["message"],
                            PEAR_INSTALLER_FAILED);
                    }

                    fclose($wp);
                }
            }

            // {{{ check the md5
            if (isset($md5sum)) {
                // Make sure the original md5 sum matches with expected
                if (strtolower($md5sum) === strtolower($attribs['md5sum'])) {
                    $this->log(2, "md5sum ok: $final_dest_file");

                    if (isset($contents)) {
                        // set md5 sum based on $content in case any tasks were run.
                        $real_atts['attribs']['md5sum'] = md5($contents);
                    }
                } else {
                    if (empty($options['force'])) {
                        // delete the file
                        if (file_exists($dest_file)) {
                            unlink($dest_file);
                        }

                        if (!isset($options['ignore-errors'])) {
                            return $this->raiseError("bad md5sum for file $final_dest_file",
                                                     PEAR_INSTALLER_FAILED);
                        }

                        if (!isset($options['soft'])) {
                            $this->log(0, "warning : bad md5sum for file $final_dest_file");
                        }
                    } else {
                        if (!isset($options['soft'])) {
                            $this->log(0, "warning : bad md5sum for file $final_dest_file");
                        }
                    }
                }
            } else {
                $real_atts['attribs']['md5sum'] = md5_file($dest_file);
            }

            // }}}
            // {{{ set file permissions
            if (!OS_WINDOWS) {
                if ($role->isExecutable()) {
                    $mode = 0777 & ~(int)octdec($this->config->get('umask'));
                    $this->log(3, "+ chmod +x $dest_file");
                } else {
                    $mode = 0666 & ~(int)octdec($this->config->get('umask'));
                }

                if ($attribs['role'] != 'src') {
                    $this->addFileOperation("chmod", array($mode, $dest_file));
                    if (!@chmod($dest_file, $mode)) {
                        if (!isset($options['soft'])) {
                            $this->log(0, "failed to change mode of $dest_file: " .
                                          error_get_last()["message"]);
                        }
                    }
                }
            }
            // }}}

            if ($attribs['role'] == 'src') {
                rename($dest_file, $final_dest_file);
                $this->log(2, "renamed source file $dest_file to $final_dest_file");
            } else {
                $this->addFileOperation("rename", array($dest_file, $final_dest_file, $role->isExtension()));
            }
        }

        // Store the full path where the file was installed for easy uninstall
        if ($attribs['role'] != 'src') {
            $loc = $this->config->get($role->getLocationConfig(), null, $channel);
            $this->addFileOperation('installed_as', array($file, $installed_as,
                                $loc,
                                dirname(substr($installed_as, strlen($loc)))));
        }

        //$this->log(2, "installed: $dest_file");
        return PEAR_INSTALLER_OK;
    }

    // }}}
    // {{{ addFileOperation()

    /**
     * Add a file operation to the current file transaction.
     *
     * @see startFileTransaction()
     * @param string $type This can be one of:
     *    - rename:  rename a file ($data has 3 values)
     *    - backup:  backup an existing file ($data has 1 value)
     *    - removebackup:  clean up backups created during install ($data has 1 value)
     *    - chmod:   change permissions on a file ($data has 2 values)
     *    - delete:  delete a file ($data has 1 value)
     *    - rmdir:   delete a directory if empty ($data has 1 value)
     *    - installed_as: mark a file as installed ($data has 4 values).
     * @param array $data For all file operations, this array must contain the
     *    full path to the file or directory that is being operated on.  For
     *    the rename command, the first parameter must be the file to rename,
     *    the second its new name, the third whether this is a PHP extension.
     *
     *    The installed_as operation contains 4 elements in this order:
     *    1. Filename as listed in the filelist element from package.xml
     *    2. Full path to the installed file
     *    3. Full path from the php_dir configuration variable used in this
     *       installation
     *    4. Relative path from the php_dir that this file is installed in
     */
    function addFileOperation($type, $data)
    {
        if (!is_array($data)) {
            return $this->raiseError('Internal Error: $data in addFileOperation'
                . ' must be an array, was ' . gettype($data));
        }

        if ($type == 'chmod') {
            $octmode = decoct($data[0]);
            $this->log(3, "adding to transaction: $type $octmode $data[1]");
        } else {
            $this->log(3, "adding to transaction: $type " . implode(" ", $data));
        }
        $this->file_operations[] = array($type, $data);
    }

    // }}}
    // {{{ startFileTransaction()

    function startFileTransaction($rollback_in_case = false)
    {
        if (count($this->file_operations) && $rollback_in_case) {
            $this->rollbackFileTransaction();
        }
        $this->file_operations = array();
    }

    // }}}
    // {{{ commitFileTransaction()

    function commitFileTransaction()
    {
        // {{{ first, check permissions and such manually
        $errors = array();
        foreach ($this->file_operations as $key => $tr) {
            list($type, $data) = $tr;
            switch ($type) {
                case 'rename':
                    if (!file_exists($data[0])) {
                        $errors[] = "cannot rename file $data[0], doesn't exist";
                    }

                    // check that dest dir. is writable
                    if (!is_writable(dirname($data[1]))) {
                        $errors[] = "permission denied ($type): $data[1]";
                    }
                    break;
                case 'chmod':
                    // check that file is writable
                    if (!is_writable($data[1])) {
                        $errors[] = "permission denied ($type): $data[1] " . decoct($data[0]);
                    }
                    break;
                case 'delete':
                    if (!file_exists($data[0])) {
                        $this->log(2, "warning: file $data[0] doesn't exist, can't be deleted");
                    }
                    // check that directory is writable
                    if (file_exists($data[0])) {
                        if (!is_writable(dirname($data[0]))) {
                            $errors[] = "permission denied ($type): $data[0]";
                        } else {
                            // make sure the file to be deleted can be opened for writing
                            $fp = false;
                            if (!is_dir($data[0]) &&
                                  (!is_writable($data[0]) || !($fp = @fopen($data[0], 'a')))) {
                                $errors[] = "permission denied ($type): $data[0]";
                            } elseif ($fp) {
                                fclose($fp);
                            }
                        }

                        /* Verify we are not deleting a file owned by another package
                         * This can happen when a file moves from package A to B in
                         * an upgrade ala http://pear.php.net/17986
                         */
                        $info = array(
                            'package' => strtolower($this->pkginfo->getName()),
                            'channel' => strtolower($this->pkginfo->getChannel()),
                        );
                        $result = $this->_registry->checkFileMap($data[0], $info, '1.1');
                        if (is_array($result)) {
                            $res = array_diff($result, $info);
                            if (!empty($res)) {
                                $new = $this->_registry->getPackage($result[1], $result[0]);
                                $this->file_operations[$key] = false;
                                $pkginfoName = $this->pkginfo->getName();
                                $newChannel  = $new->getChannel();
                                $newPackage  = $new->getName();
                                $this->log(3, "file $data[0] was scheduled for removal from $pkginfoName but is owned by $newChannel/$newPackage, removal has been cancelled.");
                            }
                        }
                    }
                    break;
            }

        }
        // }}}

        $n = count($this->file_operations);
        $this->log(2, "about to commit $n file operations for " . $this->pkginfo->getName());

        $m = count($errors);
        if ($m > 0) {
            foreach ($errors as $error) {
                if (!isset($this->_options['soft'])) {
                    $this->log(1, $error);
                }
            }

            if (!isset($this->_options['ignore-errors'])) {
                return false;
            }
        }

        $this->_dirtree = array();
        // {{{ really commit the transaction
        foreach ($this->file_operations as $i => $tr) {
            if (!$tr) {
                // support removal of non-existing backups
                continue;
            }

            list($type, $data) = $tr;
            switch ($type) {
                case 'backup':
                    if (!file_exists($data[0])) {
                        $this->file_operations[$i] = false;
                        break;
                    }

                    if (!@copy($data[0], $data[0] . '.bak')) {
                        $this->log(1, 'Could not copy ' . $data[0] . ' to ' . $data[0] .
                            '.bak ' . error_get_last()["message"]);
                        return false;
                    }
                    $this->log(3, "+ backup $data[0] to $data[0].bak");
                    break;
                case 'removebackup':
                    if (file_exists($data[0] . '.bak') && is_writable($data[0] . '.bak')) {
                        unlink($data[0] . '.bak');
                        $this->log(3, "+ rm backup of $data[0] ($data[0].bak)");
                    }
                    break;
                case 'rename':
                    $test = file_exists($data[1]) ? @unlink($data[1]) : null;
                    if (!$test && file_exists($data[1])) {
                        if ($data[2]) {
                            $extra = ', this extension must be installed manually.  Rename to "' .
                                basename($data[1]) . '"';
                        } else {
                            $extra = '';
                        }

                        if (!isset($this->_options['soft'])) {
                            $this->log(1, 'Could not delete ' . $data[1] . ', cannot rename ' .
                                $data[0] . $extra);
                        }

                        if (!isset($this->_options['ignore-errors'])) {
                            return false;
                        }
                    }

                    // permissions issues with rename - copy() is far superior
                    $perms = @fileperms($data[0]);
                    if (!@copy($data[0], $data[1])) {
                        $this->log(1, 'Could not rename ' . $data[0] . ' to ' . $data[1] .
                            ' ' . error_get_last()["message"]);
                        return false;
                    }

                    // copy over permissions, otherwise they are lost
                    @chmod($data[1], $perms);
                    @unlink($data[0]);
                    $this->log(3, "+ mv $data[0] $data[1]");
                    break;
                case 'chmod':
                    if (!@chmod($data[1], $data[0])) {
                        $this->log(1, 'Could not chmod ' . $data[1] . ' to ' .
                            decoct($data[0]) . ' ' . error_get_last()["message"]);
                        return false;
                    }

                    $octmode = decoct($data[0]);
                    $this->log(3, "+ chmod $octmode $data[1]");
                    break;
                case 'delete':
                    if (file_exists($data[0])) {
                        if (!@unlink($data[0])) {
                            $this->log(1, 'Could not delete ' . $data[0] . ' ' .
                                error_get_last()["message"]);
                            return false;
                        }
                        $this->log(3, "+ rm $data[0]");
                    }
                    break;
                case 'rmdir':
                    if (file_exists($data[0])) {
                        do {
                            $testme = opendir($data[0]);
                            while (false !== ($entry = readdir($testme))) {
                                if ($entry == '.' || $entry == '..') {
                                    continue;
                                }
                                closedir($testme);
                                break 2; // this directory is not empty and can't be
                                         // deleted
                            }

                            closedir($testme);
                            if (!@rmdir($data[0])) {
                                $this->log(1, 'Could not rmdir ' . $data[0] . ' ' .
                                    error_get_last()["message"]);
                                return false;
                            }
                            $this->log(3, "+ rmdir $data[0]");
                        } while (false);
                    }
                    break;
                case 'installed_as':
                    $this->pkginfo->setInstalledAs($data[0], $data[1]);
                    if (!isset($this->_dirtree[dirname($data[1])])) {
                        $this->_dirtree[dirname($data[1])] = true;
                        $this->pkginfo->setDirtree(dirname($data[1]));

                        while(!empty($data[3]) && dirname($data[3]) != $data[3] &&
                                $data[3] != '/' && $data[3] != '\\') {
                            $this->pkginfo->setDirtree($pp =
                                $this->_prependPath($data[3], $data[2]));
                            $this->_dirtree[$pp] = true;
                            $data[3] = dirname($data[3]);
                        }
                    }
                    break;
            }
        }
        // }}}
        $this->log(2, "successfully committed $n file operations");
        $this->file_operations = array();
        return true;
    }

    // }}}
    // {{{ rollbackFileTransaction()

    function rollbackFileTransaction()
    {
        $n = count($this->file_operations);
        $this->log(2, "rolling back $n file operations");
        foreach ($this->file_operations as $tr) {
            list($type, $data) = $tr;
            switch ($type) {
                case 'backup':
                    if (file_exists($data[0] . '.bak')) {
                        if (file_exists($data[0] && is_writable($data[0]))) {
                            unlink($data[0]);
                        }
                        @copy($data[0] . '.bak', $data[0]);
                        $this->log(3, "+ restore $data[0] from $data[0].bak");
                    }
                    break;
                case 'removebackup':
                    if (file_exists($data[0] . '.bak') && is_writable($data[0] . '.bak')) {
                        unlink($data[0] . '.bak');
                        $this->log(3, "+ rm backup of $data[0] ($data[0].bak)");
                    }
                    break;
                case 'rename':
                    @unlink($data[0]);
                    $this->log(3, "+ rm $data[0]");
                    break;
                case 'mkdir':
                    @rmdir($data[0]);
                    $this->log(3, "+ rmdir $data[0]");
                    break;
                case 'chmod':
                    break;
                case 'delete':
                    break;
                case 'installed_as':
                    $this->pkginfo->setInstalledAs($data[0], false);
                    break;
            }
        }
        $this->pkginfo->resetDirtree();
        $this->file_operations = array();
    }

    // }}}
    // {{{ mkDirHier($dir)

    function mkDirHier($dir)
    {
        $this->addFileOperation('mkdir', array($dir));
        return parent::mkDirHier($dir);
    }

    // }}}
    // {{{ _parsePackageXml()

    function _parsePackageXml(&$descfile)
    {
        // Parse xml file -----------------------------------------------
        $pkg = new PEAR_PackageFile($this->config, $this->debug);
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $p = &$pkg->fromAnyFile($descfile, PEAR_VALIDATE_INSTALLING);
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($p)) {
            if (is_array($p->getUserInfo())) {
                foreach ($p->getUserInfo() as $err) {
                    $loglevel = $err['level'] == 'error' ? 0 : 1;
                    if (!isset($this->_options['soft'])) {
                        $this->log($loglevel, ucfirst($err['level']) . ': ' . $err['message']);
                    }
                }
            }
            return $this->raiseError('Installation failed: invalid package file');
        }

        $descfile = $p->getPackageFile();
        return $p;
    }

    // }}}
    /**
     * Set the list of PEAR_Downloader_Package objects to allow more sane
     * dependency validation
     * @param array
     */
    function setDownloadedPackages(&$pkgs)
    {
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $err = $this->analyzeDependencies($pkgs);
        PEAR::popErrorHandling();
        if (PEAR::isError($err)) {
            return $err;
        }
        $this->_downloadedPackages = &$pkgs;
    }

    /**
     * Set the list of PEAR_Downloader_Package objects to allow more sane
     * dependency validation
     * @param array
     */
    function setUninstallPackages(&$pkgs)
    {
        $this->_downloadedPackages = &$pkgs;
    }

    function getInstallPackages()
    {
        return $this->_downloadedPackages;
    }

    // {{{ install()

    /**
     * Installs the files within the package file specified.
     *
     * @param string|PEAR_Downloader_Package $pkgfile path to the package file,
     *        or a pre-initialized packagefile object
     * @param array $options
     * recognized options:
     * - installroot   : optional prefix directory for installation
     * - force         : force installation
     * - register-only : update registry but don't install files
     * - upgrade       : upgrade existing install
     * - soft          : fail silently
     * - nodeps        : ignore dependency conflicts/missing dependencies
     * - alldeps       : install all dependencies
     * - onlyreqdeps   : install only required dependencies
     *
     * @return array|PEAR_Error package info if successful
     */
    function install($pkgfile, $options = array())
    {
        $this->_options = $options;
        $this->_registry = &$this->config->getRegistry();
        if (is_object($pkgfile)) {
            $dlpkg    = &$pkgfile;
            $pkg      = $pkgfile->getPackageFile();
            $pkgfile  = $pkg->getArchiveFile();
            $descfile = $pkg->getPackageFile();
        } else {
            $descfile = $pkgfile;
            $pkg      = $this->_parsePackageXml($descfile);
            if (PEAR::isError($pkg)) {
                return $pkg;
            }
        }

        $tmpdir = dirname($descfile);
        if (realpath($descfile) != realpath($pkgfile)) {
            // Use the temp_dir since $descfile can contain the download dir path
            $tmpdir = $this->config->get('temp_dir', null, 'pear.php.net');
            $tmpdir = System::mktemp('-d -t "' . $tmpdir . '"');

            $tar = new Archive_Tar($pkgfile);
            if (!$tar->extract($tmpdir)) {
                return $this->raiseError("unable to unpack $pkgfile");
            }
        }

        $pkgname = $pkg->getName();
        $channel = $pkg->getChannel();

        if (isset($options['installroot'])) {
            $this->config->setInstallRoot($options['installroot']);
            $this->_registry = &$this->config->getRegistry();
            $installregistry = &$this->_registry;
            $this->installroot = ''; // all done automagically now
            $php_dir = $this->config->get('php_dir', null, $channel);
        } else {
            $this->config->setInstallRoot(false);
            $this->_registry = &$this->config->getRegistry();
            if (isset($this->_options['packagingroot'])) {
                $regdir = $this->_prependPath(
                    $this->config->get('php_dir', null, 'pear.php.net'),
                    $this->_options['packagingroot']);

                $metadata_dir = $this->config->get('metadata_dir', null, 'pear.php.net');
                if ($metadata_dir) {
                    $metadata_dir = $this->_prependPath(
                        $metadata_dir,
                        $this->_options['packagingroot']);
                }
                $packrootphp_dir = $this->_prependPath(
                    $this->config->get('php_dir', null, $channel),
                    $this->_options['packagingroot']);

                $installregistry = new PEAR_Registry($regdir, false, false, $metadata_dir);
                if (!$installregistry->channelExists($channel, true)) {
                    // we need to fake a channel-discover of this channel
                    $chanobj = $this->_registry->getChannel($channel, true);
                    $installregistry->addChannel($chanobj);
                }
                $php_dir = $packrootphp_dir;
            } else {
                $installregistry = &$this->_registry;
                $php_dir = $this->config->get('php_dir', null, $channel);
            }
            $this->installroot = '';
        }

        // {{{ checks to do when not in "force" mode
        if (empty($options['force']) &&
              (file_exists($this->config->get('php_dir')) &&
               is_dir($this->config->get('php_dir')))) {
            $testp = $channel == 'pear.php.net' ? $pkgname : array($channel, $pkgname);
            $instfilelist = $pkg->getInstallationFileList(true);
            if (PEAR::isError($instfilelist)) {
                return $instfilelist;
            }

            // ensure we have the most accurate registry
            $installregistry->flushFileMap();
            $test = $installregistry->checkFileMap($instfilelist, $testp, '1.1');
            if (PEAR::isError($test)) {
                return $test;
            }

            if (sizeof($test)) {
                $pkgs = $this->getInstallPackages();
                $found = false;
                foreach ($pkgs as $param) {
                    if ($pkg->isSubpackageOf($param)) {
                        $found = true;
                        break;
                    }
                }

                if ($found) {
                    // subpackages can conflict with earlier versions of parent packages
                    $parentreg = $installregistry->packageInfo($param->getPackage(), null, $param->getChannel());
                    $tmp = $test;
                    foreach ($tmp as $file => $info) {
                        if (is_array($info)) {
                            if (strtolower($info[1]) == strtolower($param->getPackage()) &&
                                  strtolower($info[0]) == strtolower($param->getChannel())
                            ) {
                                if (isset($parentreg['filelist'][$file])) {
                                    unset($parentreg['filelist'][$file]);
                                } else{
                                    $pos     = strpos($file, '/');
                                    $basedir = substr($file, 0, $pos);
                                    $file2   = substr($file, $pos + 1);
                                    if (isset($parentreg['filelist'][$file2]['baseinstalldir'])
                                        && $parentreg['filelist'][$file2]['baseinstalldir'] === $basedir
                                    ) {
                                        unset($parentreg['filelist'][$file2]);
                                    }
                                }

                                unset($test[$file]);
                            }
                        } else {
                            if (strtolower($param->getChannel()) != 'pear.php.net') {
                                continue;
                            }

                            if (strtolower($info) == strtolower($param->getPackage())) {
                                if (isset($parentreg['filelist'][$file])) {
                                    unset($parentreg['filelist'][$file]);
                                } else{
                                    $pos     = strpos($file, '/');
                                    $basedir = substr($file, 0, $pos);
                                    $file2   = substr($file, $pos + 1);
                                    if (isset($parentreg['filelist'][$file2]['baseinstalldir'])
                                        && $parentreg['filelist'][$file2]['baseinstalldir'] === $basedir
                                    ) {
                                        unset($parentreg['filelist'][$file2]);
                                    }
                                }

                                unset($test[$file]);
                            }
                        }
                    }

                    $pfk = new PEAR_PackageFile($this->config);
                    $parentpkg = &$pfk->fromArray($parentreg);
                    $installregistry->updatePackage2($parentpkg);
                }

                if ($param->getChannel() == 'pecl.php.net' && isset($options['upgrade'])) {
                    $tmp = $test;
                    foreach ($tmp as $file => $info) {
                        if (is_string($info)) {
                            // pear.php.net packages are always stored as strings
                            if (strtolower($info) == strtolower($param->getPackage())) {
                                // upgrading existing package
                                unset($test[$file]);
                            }
                        }
                    }
                }

                if (count($test)) {
                    $msg = "$channel/$pkgname: conflicting files found:\n";
                    $longest = max(array_map("strlen", array_keys($test)));
                    $fmt = "%{$longest}s (%s)\n";
                    foreach ($test as $file => $info) {
                        if (!is_array($info)) {
                            $info = array('pear.php.net', $info);
                        }
                        $info = $info[0] . '/' . $info[1];
                        $msg .= sprintf($fmt, $file, $info);
                    }

                    if (!isset($options['ignore-errors'])) {
                        return $this->raiseError($msg);
                    }

                    if (!isset($options['soft'])) {
                        $this->log(0, "WARNING: $msg");
                    }
                }
            }
        }
        // }}}

        $this->startFileTransaction();

        $usechannel = $channel;
        if ($channel == 'pecl.php.net') {
            $test = $installregistry->packageExists($pkgname, $channel);
            if (!$test) {
                $test = $installregistry->packageExists($pkgname, 'pear.php.net');
                $usechannel = 'pear.php.net';
            }
        } else {
            $test = $installregistry->packageExists($pkgname, $channel);
        }

        if (empty($options['upgrade']) && empty($options['soft'])) {
            // checks to do only when installing new packages
            if (empty($options['force']) && $test) {
                return $this->raiseError("$channel/$pkgname is already installed");
            }
        } else {
            // Upgrade
            if ($test) {
                $v1 = $installregistry->packageInfo($pkgname, 'version', $usechannel);
                $v2 = $pkg->getVersion();
                $cmp = version_compare("$v1", "$v2", 'gt');
                if (empty($options['force']) && !version_compare("$v2", "$v1", 'gt')) {
                    return $this->raiseError("upgrade to a newer version ($v2 is not newer than $v1)");
                }
            }
        }

        // Do cleanups for upgrade and install, remove old release's files first
        if ($test && empty($options['register-only'])) {
            // when upgrading, remove old release's files first:
            if (PEAR::isError($err = $this->_deletePackageFiles($pkgname, $usechannel,
                  true))) {
                if (!isset($options['ignore-errors'])) {
                    return $this->raiseError($err);
                }

                if (!isset($options['soft'])) {
                    $this->log(0, 'WARNING: ' . $err->getMessage());
                }
            } else {
                $backedup = $err;
            }
        }

        // {{{ Copy files to dest dir ---------------------------------------

        // info from the package it self we want to access from _installFile
        $this->pkginfo = &$pkg;
        // used to determine whether we should build any C code
        $this->source_files = 0;

        $savechannel = $this->config->get('default_channel');
        if (empty($options['register-only']) && !is_dir($php_dir)) {
            if (PEAR::isError(System::mkdir(array('-p'), $php_dir))) {
                return $this->raiseError("no installation destination directory '$php_dir'\n");
            }
        }

        if (substr($pkgfile, -4) != '.xml') {
            $tmpdir .= DIRECTORY_SEPARATOR . $pkgname . '-' . $pkg->getVersion();
        }

        $this->configSet('default_channel', $channel);
        // {{{ install files

        $ver = $pkg->getPackagexmlVersion();
        if (version_compare($ver, '2.0', '>=')) {
            $filelist = $pkg->getInstallationFilelist();
        } else {
            $filelist = $pkg->getFileList();
        }

        if (PEAR::isError($filelist)) {
            return $filelist;
        }

        $p = &$installregistry->getPackage($pkgname, $channel);
        $dirtree = (empty($options['register-only']) && $p) ? $p->getDirTree() : false;

        $pkg->resetFilelist();
        $pkg->setLastInstalledVersion($installregistry->packageInfo($pkg->getPackage(),
            'version', $pkg->getChannel()));
        foreach ($filelist as $file => $atts) {
            $this->expectError(PEAR_INSTALLER_FAILED);
            if ($pkg->getPackagexmlVersion() == '1.0') {
                $res = $this->_installFile($file, $atts, $tmpdir, $options);
            } else {
                $res = $this->_installFile2($pkg, $file, $atts, $tmpdir, $options);
            }
            $this->popExpect();

            if (PEAR::isError($res)) {
                if (empty($options['ignore-errors'])) {
                    $this->rollbackFileTransaction();
                    if ($res->getMessage() == "file does not exist") {
                        $this->raiseError("file $file in package.xml does not exist");
                    }

                    return $this->raiseError($res);
                }

                if (!isset($options['soft'])) {
                    $this->log(0, "Warning: " . $res->getMessage());
                }
            }

            $real = isset($atts['attribs']) ? $atts['attribs'] : $atts;
            if ($res == PEAR_INSTALLER_OK && $real['role'] != 'src') {
                // Register files that were installed
                $pkg->installedFile($file, $atts);
            }
        }
        // }}}

        // {{{ compile and install source files
        if ($this->source_files > 0 && empty($options['nobuild'])) {
            $configureoptions = empty($options['configureoptions']) ? '' : $options['configureoptions'];
            if (PEAR::isError($err =
                  $this->_compileSourceFiles($savechannel, $pkg, $configureoptions))) {
                return $err;
            }
        }
        // }}}

        if (isset($backedup)) {
            $this->_removeBackups($backedup);
        }

        if (!$this->commitFileTransaction()) {
            $this->rollbackFileTransaction();
            $this->configSet('default_channel', $savechannel);
            return $this->raiseError("commit failed", PEAR_INSTALLER_FAILED);
        }
        // }}}

        $ret          = false;
        $installphase = 'install';
        $oldversion   = false;
        // {{{ Register that the package is installed -----------------------
        if (empty($options['upgrade'])) {
            // if 'force' is used, replace the info in registry
            $usechannel = $channel;
            if ($channel == 'pecl.php.net') {
                $test = $installregistry->packageExists($pkgname, $channel);
                if (!$test) {
                    $test = $installregistry->packageExists($pkgname, 'pear.php.net');
                    $usechannel = 'pear.php.net';
                }
            } else {
                $test = $installregistry->packageExists($pkgname, $channel);
            }

            if (!empty($options['force']) && $test) {
                $oldversion = $installregistry->packageInfo($pkgname, 'version', $usechannel);
                $installregistry->deletePackage($pkgname, $usechannel);
            }
            $ret = $installregistry->addPackage2($pkg);
        } else {
            if ($dirtree) {
                $this->startFileTransaction();
                // attempt to delete empty directories
                uksort($dirtree, array($this, '_sortDirs'));
                foreach($dirtree as $dir => $notused) {
                    $this->addFileOperation('rmdir', array($dir));
                }
                $this->commitFileTransaction();
            }

            $usechannel = $channel;
            if ($channel == 'pecl.php.net') {
                $test = $installregistry->packageExists($pkgname, $channel);
                if (!$test) {
                    $test = $installregistry->packageExists($pkgname, 'pear.php.net');
                    $usechannel = 'pear.php.net';
                }
            } else {
                $test = $installregistry->packageExists($pkgname, $channel);
            }

            // new: upgrade installs a package if it isn't installed
            if (!$test) {
                $ret = $installregistry->addPackage2($pkg);
            } else {
                if ($usechannel != $channel) {
                    $installregistry->deletePackage($pkgname, $usechannel);
                    $ret = $installregistry->addPackage2($pkg);
                } else {
                    $ret = $installregistry->updatePackage2($pkg);
                }
                $installphase = 'upgrade';
            }
        }

        if (!$ret) {
            $this->configSet('default_channel', $savechannel);
            return $this->raiseError("Adding package $channel/$pkgname to registry failed");
        }
        // }}}

        $this->configSet('default_channel', $savechannel);
        if (class_exists('PEAR_Task_Common')) { // this is auto-included if any tasks exist
            if (PEAR_Task_Common::hasPostinstallTasks()) {
                PEAR_Task_Common::runPostinstallTasks($installphase);
            }
        }

        return $pkg->toArray(true);
    }

    // }}}

    // {{{ _compileSourceFiles()
    /**
     * @param string
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @param mixed[] $configureoptions
     */
    function _compileSourceFiles($savechannel, &$filelist, $configureoptions)
    {
        require_once 'PEAR/Builder.php';
        $this->log(1, "$this->source_files source files, building");
        $bob = new PEAR_Builder($configureoptions, $this->ui);
        $bob->debug = $this->debug;
        $built = $bob->build($filelist, array(&$this, '_buildCallback'));
        if (PEAR::isError($built)) {
            $this->rollbackFileTransaction();
            $this->configSet('default_channel', $savechannel);
            return $built;
        }

        $this->log(1, "\nBuild process completed successfully");
        foreach ($built as $ext) {
            $bn = basename($ext['file']);
            list($_ext_name, $_ext_suff) = explode('.', $bn);
            if ($_ext_suff == 'so' || $_ext_suff == 'dll') {
                if (extension_loaded($_ext_name)) {
                    return $this->raiseError("Extension '$_ext_name' already loaded. " .
                                             'Please unload it in your php.ini file ' .
                                             'prior to install or upgrade');
                }
                $role = 'ext';
            } else {
                $role = 'src';
            }

            $dest = $ext['dest'];
            $packagingroot = '';
            if (isset($this->_options['packagingroot'])) {
                $packagingroot = $this->_options['packagingroot'];
            }

            $copyto = $this->_prependPath($dest, $packagingroot);
            $extra  = $copyto != $dest ? " as '$copyto'" : '';
            $this->log(1, "Installing '$dest'$extra");

            $copydir = dirname($copyto);
            // pretty much nothing happens if we are only registering the install
            if (empty($this->_options['register-only'])) {
                if (!file_exists($copydir) || !is_dir($copydir)) {
                    if (!$this->mkDirHier($copydir)) {
                        return $this->raiseError("failed to mkdir $copydir",
                            PEAR_INSTALLER_FAILED);
                    }

                    $this->log(3, "+ mkdir $copydir");
                }

                if (!@copy($ext['file'], $copyto)) {
                    return $this->raiseError(
                        "failed to write $copyto (" . error_get_last()["message"] . ")",
                        PEAR_INSTALLER_FAILED);
                }

                $this->log(3, "+ cp $ext[file] $copyto");
                $this->addFileOperation('rename', array($ext['file'], $copyto));
                if (!OS_WINDOWS) {
                    $mode = 0666 & ~(int)octdec($this->config->get('umask'));
                    $this->addFileOperation('chmod', array($mode, $copyto));
                    if (!@chmod($copyto, $mode)) {
                        $this->log(0, "failed to change mode of $copyto (" .
                                      error_get_last()["message"] . ")");
                    }
                }
            }


            $data = array(
                'role'         => $role,
                'name'         => $bn,
                'installed_as' => $dest,
                'php_api'      => $ext['php_api'],
                'zend_mod_api' => $ext['zend_mod_api'],
                'zend_ext_api' => $ext['zend_ext_api'],
            );

            if ($filelist->getPackageXmlVersion() == '1.0') {
                $filelist->installedFile($bn, $data);
            } else {
                $filelist->installedFile($bn, array('attribs' => $data));
            }
        }
    }

    // }}}
    function &getUninstallPackages()
    {
        return $this->_downloadedPackages;
    }
    // {{{ uninstall()

    /**
     * Uninstall a package
     *
     * This method removes all files installed by the application, and then
     * removes any empty directories.
     * @param string package name
     * @param array Command-line options.  Possibilities include:
     *
     *              - installroot: base installation dir, if not the default
     *              - register-only : update registry but don't remove files
     *              - nodeps: do not process dependencies of other packages to ensure
     *                        uninstallation does not break things
     */
    function uninstall($package, $options = array())
    {
        $installRoot = isset($options['installroot']) ? $options['installroot'] : '';
        $this->config->setInstallRoot($installRoot);

        $this->installroot = '';
        $this->_registry = &$this->config->getRegistry();
        if (is_object($package)) {
            $channel = $package->getChannel();
            $pkg     = $package;
            $package = $pkg->getPackage();
        } else {
            $pkg = false;
            $info = $this->_registry->parsePackageName($package,
                $this->config->get('default_channel'));
            $channel = $info['channel'];
            $package = $info['package'];
        }

        $savechannel = $this->config->get('default_channel');
        $this->configSet('default_channel', $channel);
        if (!is_object($pkg)) {
            $pkg = $this->_registry->getPackage($package, $channel);
        }

        if (!$pkg) {
            $this->configSet('default_channel', $savechannel);
            return $this->raiseError($this->_registry->parsedPackageNameToString(
                array(
                    'channel' => $channel,
                    'package' => $package
                ), true) . ' not installed');
        }

        if ($pkg->getInstalledBinary()) {
            // this is just an alias for a binary package
            return $this->_registry->deletePackage($package, $channel);
        }

        $filelist = $pkg->getFilelist();
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        if (!class_exists('PEAR_Dependency2')) {
            require_once 'PEAR/Dependency2.php';
        }

        $depchecker = new PEAR_Dependency2($this->config, $options,
            array('channel' => $channel, 'package' => $package),
            PEAR_VALIDATE_UNINSTALLING);
        $e = $depchecker->validatePackageUninstall($this);
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($e)) {
            if (!isset($options['ignore-errors'])) {
                return $this->raiseError($e);
            }

            if (!isset($options['soft'])) {
                $this->log(0, 'WARNING: ' . $e->getMessage());
            }
        } elseif (is_array($e)) {
            if (!isset($options['soft'])) {
                $this->log(0, $e[0]);
            }
        }

        $this->pkginfo = &$pkg;
        // pretty much nothing happens if we are only registering the uninstall
        if (empty($options['register-only'])) {
            // {{{ Delete the files
            $this->startFileTransaction();
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            if (PEAR::isError($err = $this->_deletePackageFiles($package, $channel))) {
                PEAR::popErrorHandling();
                $this->rollbackFileTransaction();
                $this->configSet('default_channel', $savechannel);
                if (!isset($options['ignore-errors'])) {
                    return $this->raiseError($err);
                }

                if (!isset($options['soft'])) {
                    $this->log(0, 'WARNING: ' . $err->getMessage());
                }
            } else {
                PEAR::popErrorHandling();
            }

            if (!$this->commitFileTransaction()) {
                $this->rollbackFileTransaction();
                if (!isset($options['ignore-errors'])) {
                    return $this->raiseError("uninstall failed");
                }

                if (!isset($options['soft'])) {
                    $this->log(0, 'WARNING: uninstall failed');
                }
            } else {
                $this->startFileTransaction();
                $dirtree = $pkg->getDirTree();
                if ($dirtree === false) {
                    $this->configSet('default_channel', $savechannel);
                    return $this->_registry->deletePackage($package, $channel);
                }

                // attempt to delete empty directories
                uksort($dirtree, array($this, '_sortDirs'));
                foreach($dirtree as $dir => $notused) {
                    $this->addFileOperation('rmdir', array($dir));
                }

                if (!$this->commitFileTransaction()) {
                    $this->rollbackFileTransaction();
                    if (!isset($options['ignore-errors'])) {
                        return $this->raiseError("uninstall failed");
                    }

                    if (!isset($options['soft'])) {
                        $this->log(0, 'WARNING: uninstall failed');
                    }
                }
            }
            // }}}
        }

        $this->configSet('default_channel', $savechannel);
        // Register that the package is no longer installed
        return $this->_registry->deletePackage($package, $channel);
    }

    /**
     * Sort a list of arrays of array(downloaded packagefilename) by dependency.
     *
     * It also removes duplicate dependencies
     * @param array an array of PEAR_PackageFile_v[1/2] objects
     * @return array|PEAR_Error array of array(packagefilename, package.xml contents)
     */
    function sortPackagesForUninstall(&$packages)
    {
        $this->_dependencyDB = &PEAR_DependencyDB::singleton($this->config);
        if (PEAR::isError($this->_dependencyDB)) {
            return $this->_dependencyDB;
        }
        usort($packages, array(&$this, '_sortUninstall'));
    }

    function _sortUninstall($a, $b)
    {
        if (!$a->getDeps() && !$b->getDeps()) {
            return 0; // neither package has dependencies, order is insignificant
        }
        if ($a->getDeps() && !$b->getDeps()) {
            return -1; // $a must be installed after $b because $a has dependencies
        }
        if (!$a->getDeps() && $b->getDeps()) {
            return 1; // $b must be installed after $a because $b has dependencies
        }
        // both packages have dependencies
        if ($this->_dependencyDB->dependsOn($a, $b)) {
            return -1;
        }
        if ($this->_dependencyDB->dependsOn($b, $a)) {
            return 1;
        }
        return 0;
    }

    // }}}
    // {{{ _sortDirs()
    function _sortDirs($a, $b)
    {
        if (strnatcmp($a, $b) == -1) return 1;
        if (strnatcmp($a, $b) == 1) return -1;
        return 0;
    }

    // }}}

    // {{{ _buildCallback()

    function _buildCallback($what, $data)
    {
        if (($what == 'cmdoutput' && $this->debug > 1) ||
            ($what == 'output' && $this->debug > 0)) {
            $this->ui->outputData(rtrim($data), 'build');
        }
    }

    // }}}
}
PK�a�\�ٲ�=�=pear/PEAR/PackageFile.phpnu�[���<?php
/**
 * PEAR_PackageFile, package.xml parsing utility class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * needed for PEAR_VALIDATE_* constants
 */
require_once 'PEAR/Validate.php';
/**
 * Error code if the package.xml <package> tag does not contain a valid version
 */
define('PEAR_PACKAGEFILE_ERROR_NO_PACKAGEVERSION', 1);
/**
 * Error code if the package.xml <package> tag version is not supported (version 1.0 and 1.1 are the only supported versions,
 * currently
 */
define('PEAR_PACKAGEFILE_ERROR_INVALID_PACKAGEVERSION', 2);
/**
 * Abstraction for the package.xml package description file
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_PackageFile
{
    /**
     * @var PEAR_Config
     */
    var $_config;
    var $_debug;

    var $_logger = false;
    /**
     * @var boolean
     */
    var $_rawReturn = false;

    /**
     * helper for extracting Archive_Tar errors
     * @var array
     * @access private
     */
    var $_extractErrors = array();

    /**
     *
     * @param   PEAR_Config $config
     * @param   ?   $debug
     * @param   string @tmpdir Optional temporary directory for uncompressing
     *          files
     */
    function __construct(&$config, $debug = false)
    {
        $this->_config = $config;
        $this->_debug = $debug;
    }

    /**
     * Turn off validation - return a parsed package.xml without checking it
     *
     * This is used by the package-validate command
     */
    function rawReturn()
    {
        $this->_rawReturn = true;
    }

    function setLogger(&$l)
    {
        $this->_logger = &$l;
    }

    /**
     * Create a PEAR_PackageFile_Parser_v* of a given version.
     * @param   int $version
     * @return  PEAR_PackageFile_Parser_v1|PEAR_PackageFile_Parser_v1
     */
    function &parserFactory($version)
    {
        if (!in_array($version[0], array('1', '2'))) {
            $a = false;
            return $a;
        }

        include_once 'PEAR/PackageFile/Parser/v' . $version[0] . '.php';
        $version = $version[0];
        $class = "PEAR_PackageFile_Parser_v$version";
        $a = new $class;
        return $a;
    }

    /**
     * For simpler unit-testing
     * @return string
     */
    function getClassPrefix()
    {
        return 'PEAR_PackageFile_v';
    }

    /**
     * Create a PEAR_PackageFile_v* of a given version.
     * @param   int $version
     * @return  PEAR_PackageFile_v1|PEAR_PackageFile_v1
     */
    function &factory($version)
    {
        if (!in_array($version[0], array('1', '2'))) {
            $a = false;
            return $a;
        }

        include_once 'PEAR/PackageFile/v' . $version[0] . '.php';
        $version = $version[0];
        $class = $this->getClassPrefix() . $version;
        $a = new $class;
        return $a;
    }

    /**
     * Create a PEAR_PackageFile_v* from its toArray() method
     *
     * WARNING: no validation is performed, the array is assumed to be valid,
     * always parse from xml if you want validation.
     * @param   array $arr
     * @return PEAR_PackageFileManager_v1|PEAR_PackageFileManager_v2
     * @uses    factory() to construct the returned object.
     */
    function &fromArray($arr)
    {
        if (isset($arr['xsdversion'])) {
            $obj = &$this->factory($arr['xsdversion']);
            if ($this->_logger) {
                $obj->setLogger($this->_logger);
            }

            $obj->setConfig($this->_config);
            $obj->fromArray($arr);
            return $obj;
        }

        if (isset($arr['package']['attribs']['version'])) {
            $obj = &$this->factory($arr['package']['attribs']['version']);
        } else {
            $obj = &$this->factory('1.0');
        }

        if ($this->_logger) {
            $obj->setLogger($this->_logger);
        }

        $obj->setConfig($this->_config);
        $obj->fromArray($arr);
        return $obj;
    }

    /**
     * Create a PEAR_PackageFile_v* from an XML string.
     * @access  public
     * @param   string $data contents of package.xml file
     * @param   int $state package state (one of PEAR_VALIDATE_* constants)
     * @param   string $file full path to the package.xml file (and the files
     *          it references)
     * @param   string $archive optional name of the archive that the XML was
     *          extracted from, if any
     * @return  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @uses    parserFactory() to construct a parser to load the package.
     */
    function &fromXmlString($data, $state, $file, $archive = false)
    {
        if (preg_match('/<package[^>]+version=[\'"]([0-9]+\.[0-9]+)[\'"]/', $data, $packageversion)) {
            if (!in_array($packageversion[1], array('1.0', '2.0', '2.1'))) {
                return PEAR::raiseError('package.xml version "' . $packageversion[1] .
                    '" is not supported, only 1.0, 2.0, and 2.1 are supported.');
            }

            $object = &$this->parserFactory($packageversion[1]);
            if ($this->_logger) {
                $object->setLogger($this->_logger);
            }

            $object->setConfig($this->_config);
            $pf = $object->parse($data, $file, $archive);
            if (PEAR::isError($pf)) {
                return $pf;
            }

            if ($this->_rawReturn) {
                return $pf;
            }

            if (!$pf->validate($state)) {;
                if ($this->_config->get('verbose') > 0
                    && $this->_logger && $pf->getValidationWarnings(false)
                ) {
                    foreach ($pf->getValidationWarnings(false) as $warning) {
                        $this->_logger->log(0, 'ERROR: ' . $warning['message']);
                    }
                }

                $a = PEAR::raiseError('Parsing of package.xml from file "' . $file . '" failed',
                    2, null, null, $pf->getValidationWarnings());
                return $a;
            }

            if ($this->_logger && $pf->getValidationWarnings(false)) {
                foreach ($pf->getValidationWarnings() as $warning) {
                    $this->_logger->log(0, 'WARNING: ' . $warning['message']);
                }
            }

            if (method_exists($pf, 'flattenFilelist')) {
                $pf->flattenFilelist(); // for v2
            }

            return $pf;
        } elseif (preg_match('/<package[^>]+version=[\'"]([^"\']+)[\'"]/', $data, $packageversion)) {
            $a = PEAR::raiseError('package.xml file "' . $file .
                '" has unsupported package.xml <package> version "' . $packageversion[1] . '"');
            return $a;
        } else {
            if (!class_exists('PEAR_ErrorStack')) {
                require_once 'PEAR/ErrorStack.php';
            }

            PEAR_ErrorStack::staticPush('PEAR_PackageFile',
                PEAR_PACKAGEFILE_ERROR_NO_PACKAGEVERSION,
                'warning', array('xml' => $data), 'package.xml "' . $file .
                    '" has no package.xml <package> version');
            $object = &$this->parserFactory('1.0');
            $object->setConfig($this->_config);
            $pf = $object->parse($data, $file, $archive);
            if (PEAR::isError($pf)) {
                return $pf;
            }

            if ($this->_rawReturn) {
                return $pf;
            }

            if (!$pf->validate($state)) {
                $a = PEAR::raiseError('Parsing of package.xml from file "' . $file . '" failed',
                    2, null, null, $pf->getValidationWarnings());
                return $a;
            }

            if ($this->_logger && $pf->getValidationWarnings(false)) {
                foreach ($pf->getValidationWarnings() as $warning) {
                    $this->_logger->log(0, 'WARNING: ' . $warning['message']);
                }
            }

            if (method_exists($pf, 'flattenFilelist')) {
                $pf->flattenFilelist(); // for v2
            }

            return $pf;
        }
    }

    /**
     * Register a temporary file or directory.  When the destructor is
     * executed, all registered temporary files and directories are
     * removed.
     *
     * @param string  $file  name of file or directory
     * @return  void
     */
    static function addTempFile($file)
    {
        $GLOBALS['_PEAR_Common_tempfiles'][] = $file;
    }

    /**
     * Create a PEAR_PackageFile_v* from a compressed Tar or Tgz file.
     * @access  public
     * @param string contents of package.xml file
     * @param int package state (one of PEAR_VALIDATE_* constants)
     * @return  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @using   Archive_Tar to extract the files
     * @using   fromPackageFile() to load the package after the package.xml
     *          file is extracted.
     */
    function &fromTgzFile($file, $state)
    {
        if (!class_exists('Archive_Tar')) {
            require_once 'Archive/Tar.php';
        }

        $tar = new Archive_Tar($file);
        if ($this->_debug <= 1) {
            $tar->pushErrorHandling(PEAR_ERROR_RETURN);
        }

        $content = $tar->listContent();
        if ($this->_debug <= 1) {
            $tar->popErrorHandling();
        }

        if (!is_array($content)) {
            if (is_string($file) && strlen($file) < 255 &&
                  (!file_exists($file) || !@is_file($file))) {
                $ret = PEAR::raiseError("could not open file \"$file\"");
                return $ret;
            }

            $file = realpath($file);
            $ret = PEAR::raiseError("Could not get contents of package \"$file\"".
                                     '. Invalid tgz file.');
            return $ret;
        }

        if (!count($content) && !@is_file($file)) {
            $ret = PEAR::raiseError("could not open file \"$file\"");
            return $ret;
        }

        $xml      = null;
        $origfile = $file;
        foreach ($content as $file) {
            $name = $file['filename'];
            if ($name == 'package2.xml') { // allow a .tgz to distribute both versions
                $xml = $name;
                break;
            }

            if ($name == 'package.xml') {
                $xml = $name;
                break;
            } elseif (preg_match('/package.xml$/', $name, $match)) {
                $xml = $name;
                break;
            }
        }

        $tmpdir = System::mktemp('-t "' . $this->_config->get('temp_dir') . '" -d pear');
        if ($tmpdir === false) {
            $ret = PEAR::raiseError("there was a problem with getting the configured temp directory");
            return $ret;
        }

        PEAR_PackageFile::addTempFile($tmpdir);

        $this->_extractErrors();
        PEAR::staticPushErrorHandling(PEAR_ERROR_CALLBACK, array($this, '_extractErrors'));

        if (!$xml || !$tar->extractList(array($xml), $tmpdir)) {
            $extra = implode("\n", $this->_extractErrors());
            if ($extra) {
                $extra = ' ' . $extra;
            }

            PEAR::staticPopErrorHandling();
            $ret = PEAR::raiseError('could not extract the package.xml file from "' .
                $origfile . '"' . $extra);
            return $ret;
        }

        PEAR::staticPopErrorHandling();
        $ret = &PEAR_PackageFile::fromPackageFile("$tmpdir/$xml", $state, $origfile);
        return $ret;
    }

    /**
     * helper callback for extracting Archive_Tar errors
     *
     * @param PEAR_Error|null $err
     * @return array
     * @access private
     */
    function _extractErrors($err = null)
    {
        static $errors = array();
        if ($err === null) {
            $e = $errors;
            $errors = array();
            return $e;
        }
        $errors[] = $err->getMessage();
    }

    /**
     * Create a PEAR_PackageFile_v* from a package.xml file.
     *
     * @access public
     * @param   string  $descfile  name of package xml file
     * @param   int     $state package state (one of PEAR_VALIDATE_* constants)
     * @param   string|false $archive name of the archive this package.xml came
     *          from, if any
     * @return  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @uses    PEAR_PackageFile::fromXmlString to create the oject after the
     *          XML is loaded from the package.xml file.
     */
    function &fromPackageFile($descfile, $state, $archive = false)
    {
        $fp = false;
        if (is_string($descfile) && strlen($descfile) < 255 &&
             (
              !file_exists($descfile) || !is_file($descfile) || !is_readable($descfile)
              || (!$fp = @fopen($descfile, 'r'))
             )
        ) {
            $a = PEAR::raiseError("Unable to open $descfile");
            return $a;
        }

        // read the whole thing so we only get one cdata callback
        // for each block of cdata
        fclose($fp);
        $data = file_get_contents($descfile);
        $ret = &PEAR_PackageFile::fromXmlString($data, $state, $descfile, $archive);
        return $ret;
    }

    /**
     * Create a PEAR_PackageFile_v* from a .tgz archive or package.xml file.
     *
     * This method is able to extract information about a package from a .tgz
     * archive or from a XML package definition file.
     *
     * @access public
     * @param   string  $info file name
     * @param   int     $state package state (one of PEAR_VALIDATE_* constants)
     * @return  PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @uses    fromPackageFile() if the file appears to be XML
     * @uses    fromTgzFile() to load all non-XML files
     */
    function &fromAnyFile($info, $state)
    {
        if (is_dir($info)) {
            $dir_name = realpath($info);
            if (file_exists($dir_name . '/package.xml')) {
                $info = PEAR_PackageFile::fromPackageFile($dir_name .  '/package.xml', $state);
            } elseif (file_exists($dir_name .  '/package2.xml')) {
                $info = PEAR_PackageFile::fromPackageFile($dir_name .  '/package2.xml', $state);
            } else {
                $info = PEAR::raiseError("No package definition found in '$info' directory");
            }

            return $info;
        }

        $fp = false;
        if (is_string($info) && strlen($info) < 255 &&
             (file_exists($info) || ($fp = @fopen($info, 'r')))
        ) {

            if ($fp) {
                fclose($fp);
            }

            $tmp = substr($info, -4);
            if ($tmp == '.xml') {
                $info = &PEAR_PackageFile::fromPackageFile($info, $state);
            } elseif ($tmp == '.tar' || $tmp == '.tgz') {
                $info = &PEAR_PackageFile::fromTgzFile($info, $state);
            } else {
                $fp   = fopen($info, 'r');
                $test = fread($fp, 5);
                fclose($fp);
                if ($test == '<?xml') {
                    $info = &PEAR_PackageFile::fromPackageFile($info, $state);
                } else {
                    $info = &PEAR_PackageFile::fromTgzFile($info, $state);
                }
            }

            return $info;
        }

        $info = PEAR::raiseError("Cannot open '$info' for parsing");
        return $info;
    }
}
PK�a�\$���(�(pear/PEAR/Registry.phpnu�[���<?php
/**
 * PEAR_Registry
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * for PEAR_Error
 */
require_once 'PEAR.php';
require_once 'PEAR/DependencyDB.php';

define('PEAR_REGISTRY_ERROR_LOCK',         -2);
define('PEAR_REGISTRY_ERROR_FORMAT',       -3);
define('PEAR_REGISTRY_ERROR_FILE',         -4);
define('PEAR_REGISTRY_ERROR_CONFLICT',     -5);
define('PEAR_REGISTRY_ERROR_CHANNEL_FILE', -6);

/**
 * Administration class used to maintain the installed package database.
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V. V. Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Registry extends PEAR
{
    /**
     * File containing all channel information.
     * @var string
     */
    var $channels = '';

    /** Directory where registry files are stored.
     * @var string
     */
    var $statedir = '';

    /** File where the file map is stored
     * @var string
     */
    var $filemap = '';

    /** Directory where registry files for channels are stored.
     * @var string
     */
    var $channelsdir = '';

    /** Name of file used for locking the registry
     * @var string
     */
    var $lockfile = '';

    /** File descriptor used during locking
     * @var resource
     */
    var $lock_fp = null;

    /** Mode used during locking
     * @var int
     */
    var $lock_mode = 0; // XXX UNUSED

    /** Cache of package information.  Structure:
     * array(
     *   'package' => array('id' => ... ),
     *   ... )
     * @var array
     */
    var $pkginfo_cache = array();

    /** Cache of file map.  Structure:
     * array( '/path/to/file' => 'package', ... )
     * @var array
     */
    var $filemap_cache = array();

    /**
     * @var false|PEAR_ChannelFile
     */
    var $_pearChannel;

    /**
     * @var false|PEAR_ChannelFile
     */
    var $_peclChannel;

    /**
     * @var false|PEAR_ChannelFile
     */
    var $_docChannel;

    /**
     * @var PEAR_DependencyDB
     */
    var $_dependencyDB;

    /**
     * @var PEAR_Config
     */
    var $_config;

    /**
     * PEAR_Registry constructor.
     *
     * @param string (optional) PEAR install directory (for .php files)
     * @param PEAR_ChannelFile PEAR_ChannelFile object representing the PEAR channel, if
     *        default values are not desired.  Only used the very first time a PEAR
     *        repository is initialized
     * @param PEAR_ChannelFile PEAR_ChannelFile object representing the PECL channel, if
     *        default values are not desired.  Only used the very first time a PEAR
     *        repository is initialized
     *
     * @access public
     */
    function __construct($pear_install_dir = PEAR_INSTALL_DIR, $pear_channel = false,
                           $pecl_channel = false, $pear_metadata_dir = '')
    {
        parent::__construct();
        $this->setInstallDir($pear_install_dir, $pear_metadata_dir);
        $this->_pearChannel = $pear_channel;
        $this->_peclChannel = $pecl_channel;
        $this->_config      = false;
    }

    function setInstallDir($pear_install_dir = PEAR_INSTALL_DIR, $pear_metadata_dir = '')
    {
        $ds = DIRECTORY_SEPARATOR;
        $this->install_dir = $pear_install_dir;
        if (!$pear_metadata_dir) {
            $pear_metadata_dir = $pear_install_dir;
        }
        $this->channelsdir = $pear_metadata_dir.$ds.'.channels';
        $this->statedir    = $pear_metadata_dir.$ds.'.registry';
        $this->filemap     = $pear_metadata_dir.$ds.'.filemap';
        $this->lockfile    = $pear_metadata_dir.$ds.'.lock';
    }

    function hasWriteAccess()
    {
        if (!file_exists($this->install_dir)) {
            $dir = $this->install_dir;
            while ($dir && $dir != '.') {
                $olddir = $dir;
                $dir    = dirname($dir);
                if ($dir != '.' && file_exists($dir)) {
                    if (is_writeable($dir)) {
                        return true;
                    }

                    return false;
                }

                if ($dir == $olddir) { // this can happen in safe mode
                    return @is_writable($dir);
                }
            }

            return false;
        }

        return is_writeable($this->install_dir);
    }

    function setConfig(&$config, $resetInstallDir = true)
    {
        $this->_config = &$config;
        if ($resetInstallDir) {
            $this->setInstallDir($config->get('php_dir'), $config->get('metadata_dir'));
        }
    }

    function _initializeChannelDirs()
    {
        static $running = false;
        if (!$running) {
            $running = true;
            $ds = DIRECTORY_SEPARATOR;
            if (!is_dir($this->channelsdir) ||
                  !file_exists($this->channelsdir . $ds . 'pear.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . 'pecl.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . 'doc.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . '__uri.reg')) {
                if (!file_exists($this->channelsdir . $ds . 'pear.php.net.reg')) {
                    $pear_channel = $this->_pearChannel;
                    if (!is_a($pear_channel, 'PEAR_ChannelFile') || !$pear_channel->validate()) {
                        if (!class_exists('PEAR_ChannelFile')) {
                            require_once 'PEAR/ChannelFile.php';
                        }

                        $pear_channel = new PEAR_ChannelFile;
                        $pear_channel->setAlias('pear');
                        $pear_channel->setServer('pear.php.net');
                        $pear_channel->setSummary('PHP Extension and Application Repository');
                        $pear_channel->setDefaultPEARProtocols();
                        $pear_channel->setBaseURL('REST1.0', 'http://pear.php.net/rest/');
                        $pear_channel->setBaseURL('REST1.1', 'http://pear.php.net/rest/');
                        $pear_channel->setBaseURL('REST1.3', 'http://pear.php.net/rest/');
                        //$pear_channel->setBaseURL('REST1.4', 'http://pear.php.net/rest/');
                    } else {
                        $pear_channel->setServer('pear.php.net');
                        $pear_channel->setAlias('pear');
                    }

                    $pear_channel->validate();
                    $this->_addChannel($pear_channel);
                }

                if (!file_exists($this->channelsdir . $ds . 'pecl.php.net.reg')) {
                    $pecl_channel = $this->_peclChannel;
                    if (!is_a($pecl_channel, 'PEAR_ChannelFile') || !$pecl_channel->validate()) {
                        if (!class_exists('PEAR_ChannelFile')) {
                            require_once 'PEAR/ChannelFile.php';
                        }

                        $pecl_channel = new PEAR_ChannelFile;
                        $pecl_channel->setAlias('pecl');
                        $pecl_channel->setServer('pecl.php.net');
                        $pecl_channel->setSummary('PHP Extension Community Library');
                        $pecl_channel->setDefaultPEARProtocols();
                        $pecl_channel->setBaseURL('REST1.0', 'http://pecl.php.net/rest/');
                        $pecl_channel->setBaseURL('REST1.1', 'http://pecl.php.net/rest/');
                        $pecl_channel->setValidationPackage('PEAR_Validator_PECL', '1.0');
                    } else {
                        $pecl_channel->setServer('pecl.php.net');
                        $pecl_channel->setAlias('pecl');
                    }

                    $pecl_channel->validate();
                    $this->_addChannel($pecl_channel);
                }

                if (!file_exists($this->channelsdir . $ds . 'doc.php.net.reg')) {
                    $doc_channel = $this->_docChannel;
                    if (!is_a($doc_channel, 'PEAR_ChannelFile') || !$doc_channel->validate()) {
                        if (!class_exists('PEAR_ChannelFile')) {
                            require_once 'PEAR/ChannelFile.php';
                        }

                        $doc_channel = new PEAR_ChannelFile;
                        $doc_channel->setAlias('phpdocs');
                        $doc_channel->setServer('doc.php.net');
                        $doc_channel->setSummary('PHP Documentation Team');
                        $doc_channel->setDefaultPEARProtocols();
                        $doc_channel->setBaseURL('REST1.0', 'http://doc.php.net/rest/');
                        $doc_channel->setBaseURL('REST1.1', 'http://doc.php.net/rest/');
                        $doc_channel->setBaseURL('REST1.3', 'http://doc.php.net/rest/');
                    } else {
                        $doc_channel->setServer('doc.php.net');
                        $doc_channel->setAlias('doc');
                    }

                    $doc_channel->validate();
                    $this->_addChannel($doc_channel);
                }

                if (!file_exists($this->channelsdir . $ds . '__uri.reg')) {
                    if (!class_exists('PEAR_ChannelFile')) {
                        require_once 'PEAR/ChannelFile.php';
                    }

                    $private = new PEAR_ChannelFile;
                    $private->setName('__uri');
                    $private->setDefaultPEARProtocols();
                    $private->setBaseURL('REST1.0', '****');
                    $private->setSummary('Pseudo-channel for static packages');
                    $this->_addChannel($private);
                }
                $this->_rebuildFileMap();
            }

            $running = false;
        }
    }

    function _initializeDirs()
    {
        $ds = DIRECTORY_SEPARATOR;
        // XXX Compatibility code should be removed in the future
        // rename all registry files if any to lowercase
        if (!OS_WINDOWS && file_exists($this->statedir) && is_dir($this->statedir) &&
              $handle = opendir($this->statedir)) {
            $dest = $this->statedir . $ds;
            while (false !== ($file = readdir($handle))) {
                if (preg_match('/^.*[A-Z].*\.reg\\z/', $file)) {
                    rename($dest . $file, $dest . strtolower($file));
                }
            }
            closedir($handle);
        }

        $this->_initializeChannelDirs();
        if (!file_exists($this->filemap)) {
            $this->_rebuildFileMap();
        }
        $this->_initializeDepDB();
    }

    function _initializeDepDB()
    {
        if (!isset($this->_dependencyDB)) {
            static $initializing = false;
            if (!$initializing) {
                $initializing = true;
                if (!$this->_config) { // never used?
                    $file = OS_WINDOWS ? 'pear.ini' : '.pearrc';
                    $this->_config = new PEAR_Config($this->statedir . DIRECTORY_SEPARATOR .
                        $file);
                    $this->_config->setRegistry($this);
                    $this->_config->set('php_dir', $this->install_dir);
                }

                $this->_dependencyDB = &PEAR_DependencyDB::singleton($this->_config);
                if (PEAR::isError($this->_dependencyDB)) {
                    // attempt to recover by removing the dep db
                    if (file_exists($this->_config->get('metadata_dir', null, 'pear.php.net') .
                        DIRECTORY_SEPARATOR . '.depdb')) {
                        @unlink($this->_config->get('metadata_dir', null, 'pear.php.net') .
                            DIRECTORY_SEPARATOR . '.depdb');
                    }

                    $this->_dependencyDB = &PEAR_DependencyDB::singleton($this->_config);
                    if (PEAR::isError($this->_dependencyDB)) {
                        echo $this->_dependencyDB->getMessage();
                        echo 'Unrecoverable error';
                        exit(1);
                    }
                }

                $initializing = false;
            }
        }
    }

    /**
     * PEAR_Registry destructor.  Makes sure no locks are forgotten.
     *
     * @access private
     */
    function _PEAR_Registry()
    {
        parent::_PEAR();
        if (is_resource($this->lock_fp)) {
            $this->_unlock();
        }
    }

    /**
     * Make sure the directory where we keep registry files exists.
     *
     * @return bool TRUE if directory exists, FALSE if it could not be
     * created
     *
     * @access private
     */
    function _assertStateDir($channel = false)
    {
        if ($channel && $this->_getChannelFromAlias($channel) != 'pear.php.net') {
            return $this->_assertChannelStateDir($channel);
        }

        static $init = false;
        if (!file_exists($this->statedir)) {
            if (!$this->hasWriteAccess()) {
                return false;
            }

            require_once 'System.php';
            if (!System::mkdir(array('-p', $this->statedir))) {
                return $this->raiseError("could not create directory '{$this->statedir}'");
            }
            $init = true;
        } elseif (!is_dir($this->statedir)) {
            return $this->raiseError('Cannot create directory ' . $this->statedir . ', ' .
                'it already exists and is not a directory');
        }

        $ds = DIRECTORY_SEPARATOR;
        if (!file_exists($this->channelsdir)) {
            if (!file_exists($this->channelsdir . $ds . 'pear.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . 'pecl.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . 'doc.php.net.reg') ||
                  !file_exists($this->channelsdir . $ds . '__uri.reg')) {
                $init = true;
            }
        } elseif (!is_dir($this->channelsdir)) {
            return $this->raiseError('Cannot create directory ' . $this->channelsdir . ', ' .
                'it already exists and is not a directory');
        }

        if ($init) {
            static $running = false;
            if (!$running) {
                $running = true;
                $this->_initializeDirs();
                $running = false;
                $init = false;
            }
        } else {
            $this->_initializeDepDB();
        }

        return true;
    }

    /**
     * Make sure the directory where we keep registry files exists for a non-standard channel.
     *
     * @param string channel name
     * @return bool TRUE if directory exists, FALSE if it could not be
     * created
     *
     * @access private
     */
    function _assertChannelStateDir($channel)
    {
        $ds = DIRECTORY_SEPARATOR;
        if (!$channel || $this->_getChannelFromAlias($channel) == 'pear.php.net') {
            if (!file_exists($this->channelsdir . $ds . 'pear.php.net.reg')) {
                $this->_initializeChannelDirs();
            }
            return $this->_assertStateDir($channel);
        }

        $channelDir = $this->_channelDirectoryName($channel);
        if (!is_dir($this->channelsdir) ||
              !file_exists($this->channelsdir . $ds . 'pear.php.net.reg')) {
            $this->_initializeChannelDirs();
        }

        if (!file_exists($channelDir)) {
            if (!$this->hasWriteAccess()) {
                return false;
            }

            require_once 'System.php';
            if (!System::mkdir(array('-p', $channelDir))) {
                return $this->raiseError("could not create directory '" . $channelDir .
                    "'");
            }
        } elseif (!is_dir($channelDir)) {
            return $this->raiseError("could not create directory '" . $channelDir .
                "', already exists and is not a directory");
        }

        return true;
    }

    /**
     * Make sure the directory where we keep registry files for channels exists
     *
     * @return bool TRUE if directory exists, FALSE if it could not be
     * created
     *
     * @access private
     */
    function _assertChannelDir()
    {
        if (!file_exists($this->channelsdir)) {
            if (!$this->hasWriteAccess()) {
                return false;
            }

            require_once 'System.php';
            if (!System::mkdir(array('-p', $this->channelsdir))) {
                return $this->raiseError("could not create directory '{$this->channelsdir}'");
            }
        } elseif (!is_dir($this->channelsdir)) {
            return $this->raiseError("could not create directory '{$this->channelsdir}" .
                "', it already exists and is not a directory");
        }

        if (!file_exists($this->channelsdir . DIRECTORY_SEPARATOR . '.alias')) {
            if (!$this->hasWriteAccess()) {
                return false;
            }

            require_once 'System.php';
            if (!System::mkdir(array('-p', $this->channelsdir . DIRECTORY_SEPARATOR . '.alias'))) {
                return $this->raiseError("could not create directory '{$this->channelsdir}/.alias'");
            }
        } elseif (!is_dir($this->channelsdir . DIRECTORY_SEPARATOR . '.alias')) {
            return $this->raiseError("could not create directory '{$this->channelsdir}" .
                "/.alias', it already exists and is not a directory");
        }

        return true;
    }

    /**
     * Get the name of the file where data for a given package is stored.
     *
     * @param string channel name, or false if this is a PEAR package
     * @param string package name
     *
     * @return string registry file name
     *
     * @access public
     */
    function _packageFileName($package, $channel = false)
    {
        if ($channel && $this->_getChannelFromAlias($channel) != 'pear.php.net') {
            return $this->_channelDirectoryName($channel) . DIRECTORY_SEPARATOR .
                strtolower($package) . '.reg';
        }

        return $this->statedir . DIRECTORY_SEPARATOR . strtolower($package) . '.reg';
    }

    /**
     * Get the name of the file where data for a given channel is stored.
     * @param string channel name
     * @return string registry file name
     */
    function _channelFileName($channel, $noaliases = false)
    {
        if (!$noaliases) {
            if (file_exists($this->_getChannelAliasFileName($channel))) {
                $channel = implode('', file($this->_getChannelAliasFileName($channel)));
            }
        }
        return $this->channelsdir . DIRECTORY_SEPARATOR . str_replace('/', '_',
            strtolower($channel)) . '.reg';
    }

    /**
     * @param string
     * @return string
     */
    function _getChannelAliasFileName($alias)
    {
        return $this->channelsdir . DIRECTORY_SEPARATOR . '.alias' .
              DIRECTORY_SEPARATOR . str_replace('/', '_', strtolower($alias)) . '.txt';
    }

    /**
     * Get the name of a channel from its alias
     */
    function _getChannelFromAlias($channel)
    {
        if (!$this->_channelExists($channel)) {
            if ($channel == 'pear.php.net') {
                return 'pear.php.net';
            }

            if ($channel == 'pecl.php.net') {
                return 'pecl.php.net';
            }

            if ($channel == 'doc.php.net') {
                return 'doc.php.net';
            }

            if ($channel == '__uri') {
                return '__uri';
            }

            return false;
        }

        $channel = strtolower($channel);
        if (file_exists($this->_getChannelAliasFileName($channel))) {
            // translate an alias to an actual channel
            return implode('', file($this->_getChannelAliasFileName($channel)));
        }

        return $channel;
    }

    /**
     * Get the alias of a channel from its alias or its name
     */
    function _getAlias($channel)
    {
        if (!$this->_channelExists($channel)) {
            if ($channel == 'pear.php.net') {
                return 'pear';
            }

            if ($channel == 'pecl.php.net') {
                return 'pecl';
            }

            if ($channel == 'doc.php.net') {
                return 'phpdocs';
            }

            return false;
        }

        $channel = $this->_getChannel($channel);
        if (PEAR::isError($channel)) {
            return $channel;
        }

        return $channel->getAlias();
    }

    /**
     * Get the name of the file where data for a given package is stored.
     *
     * @param string channel name, or false if this is a PEAR package
     * @param string package name
     *
     * @return string registry file name
     *
     * @access public
     */
    function _channelDirectoryName($channel)
    {
        if (!$channel || $this->_getChannelFromAlias($channel) == 'pear.php.net') {
            return $this->statedir;
        }

        $ch = $this->_getChannelFromAlias($channel);
        if (!$ch) {
            $ch = $channel;
        }

        return $this->statedir . DIRECTORY_SEPARATOR . strtolower('.channel.' .
            str_replace('/', '_', $ch));
    }

    function _openPackageFile($package, $mode, $channel = false)
    {
        if (!$this->_assertStateDir($channel)) {
            return null;
        }

        if (!in_array($mode, array('r', 'rb')) && !$this->hasWriteAccess()) {
            return null;
        }

        $file = $this->_packageFileName($package, $channel);
        if (!file_exists($file) && $mode == 'r' || $mode == 'rb') {
            return null;
        }

        $fp = @fopen($file, $mode);
        if (!$fp) {
            return null;
        }

        return $fp;
    }

    function _closePackageFile($fp)
    {
        fclose($fp);
    }

    function _openChannelFile($channel, $mode)
    {
        if (!$this->_assertChannelDir()) {
            return null;
        }

        if (!in_array($mode, array('r', 'rb')) && !$this->hasWriteAccess()) {
            return null;
        }

        $file = $this->_channelFileName($channel);
        if (!file_exists($file) && $mode == 'r' || $mode == 'rb') {
            return null;
        }

        $fp = @fopen($file, $mode);
        if (!$fp) {
            return null;
        }

        return $fp;
    }

    function _closeChannelFile($fp)
    {
        fclose($fp);
    }

    function _rebuildFileMap()
    {
        if (!class_exists('PEAR_Installer_Role')) {
            require_once 'PEAR/Installer/Role.php';
        }

        $channels = $this->_listAllPackages();
        $files = array();
        foreach ($channels as $channel => $packages) {
            foreach ($packages as $package) {
                $version = $this->_packageInfo($package, 'version', $channel);
                $filelist = $this->_packageInfo($package, 'filelist', $channel);
                if (!is_array($filelist)) {
                    continue;
                }

                foreach ($filelist as $name => $attrs) {
                    if (isset($attrs['attribs'])) {
                        $attrs = $attrs['attribs'];
                    }

                    // it is possible for conflicting packages in different channels to
                    // conflict with data files/doc files
                    if ($name == 'dirtree') {
                        continue;
                    }

                    if (isset($attrs['role']) && !in_array($attrs['role'],
                          PEAR_Installer_Role::getInstallableRoles())) {
                        // these are not installed
                        continue;
                    }

                    if (isset($attrs['role']) && !in_array($attrs['role'],
                          PEAR_Installer_Role::getBaseinstallRoles())) {
                        $attrs['baseinstalldir'] = $package;
                    }

                    if (isset($attrs['baseinstalldir'])) {
                        $file = $attrs['baseinstalldir'].DIRECTORY_SEPARATOR.$name;
                    } else {
                        $file = $name;
                    }

                    $file = preg_replace(',^/+,', '', $file);
                    if ($channel != 'pear.php.net') {
                        if (!isset($files[$attrs['role']])) {
                            $files[$attrs['role']] = array();
                        }
                        $files[$attrs['role']][$file] = array(strtolower($channel),
                            strtolower($package));
                    } else {
                        if (!isset($files[$attrs['role']])) {
                            $files[$attrs['role']] = array();
                        }
                        $files[$attrs['role']][$file] = strtolower($package);
                    }
                }
            }
        }


        $this->_assertStateDir();
        if (!$this->hasWriteAccess()) {
            return false;
        }

        $fp = @fopen($this->filemap, 'wb');
        if (!$fp) {
            return false;
        }

        $this->filemap_cache = $files;
        fwrite($fp, serialize($files));
        fclose($fp);
        return true;
    }

    function _readFileMap()
    {
        if (!file_exists($this->filemap)) {
            return array();
        }

        $fp = @fopen($this->filemap, 'r');
        if (!$fp) {
            $last_errormsg = '';
            $last_error = error_get_last();
            if (!empty($last_error['message'])) {
                $last_errormsg = $last_error['message'];
            }
            return $this->raiseError('PEAR_Registry: could not open filemap "' . $this->filemap . '"', PEAR_REGISTRY_ERROR_FILE, null, null, $last_errormsg);
        }

        clearstatcache();
        $fsize = filesize($this->filemap);
        fclose($fp);
        $data = file_get_contents($this->filemap);
        $tmp = unserialize($data);
        if (!$tmp && $fsize > 7) {
            return $this->raiseError('PEAR_Registry: invalid filemap data', PEAR_REGISTRY_ERROR_FORMAT, null, null, $data);
        }

        $this->filemap_cache = $tmp;
        return true;
    }

    /**
     * Lock the registry.
     *
     * @param integer lock mode, one of LOCK_EX, LOCK_SH or LOCK_UN.
     *                See flock manual for more information.
     *
     * @return bool TRUE on success, FALSE if locking failed, or a
     *              PEAR error if some other error occurs (such as the
     *              lock file not being writable).
     *
     * @access private
     */
    function _lock($mode = LOCK_EX)
    {
        if (stristr(php_uname(), 'Windows 9')) {
            return true;
        }

        if ($mode != LOCK_UN && is_resource($this->lock_fp)) {
            // XXX does not check type of lock (LOCK_SH/LOCK_EX)
            return true;
        }

        if (!$this->_assertStateDir()) {
            if ($mode == LOCK_EX) {
                return $this->raiseError('Registry directory is not writeable by the current user');
            }

            return true;
        }

        $open_mode = 'w';
        // XXX People reported problems with LOCK_SH and 'w'
        if ($mode === LOCK_SH || $mode === LOCK_UN) {
            if (!file_exists($this->lockfile)) {
                touch($this->lockfile);
            }
            $open_mode = 'r';
        }

        if (!is_resource($this->lock_fp)) {
            $this->lock_fp = @fopen($this->lockfile, $open_mode);
        }

        if (!is_resource($this->lock_fp)) {
            $this->lock_fp = null;
            return $this->raiseError("could not create lock file" .
                                     (isset($php_errormsg) ? ": " . $php_errormsg : ""));
        }

        if (!(int)flock($this->lock_fp, $mode)) {
            switch ($mode) {
                case LOCK_SH: $str = 'shared';    break;
                case LOCK_EX: $str = 'exclusive'; break;
                case LOCK_UN: $str = 'unlock';    break;
                default:      $str = 'unknown';   break;
            }

            //is resource at this point, close it on error.
            fclose($this->lock_fp);
            $this->lock_fp = null;
            return $this->raiseError("could not acquire $str lock ($this->lockfile)",
                                     PEAR_REGISTRY_ERROR_LOCK);
        }

        return true;
    }

    function _unlock()
    {
        $ret = $this->_lock(LOCK_UN);
        if (is_resource($this->lock_fp)) {
            fclose($this->lock_fp);
        }

        $this->lock_fp = null;
        return $ret;
    }

    function _packageExists($package, $channel = false)
    {
        return file_exists($this->_packageFileName($package, $channel));
    }

    /**
     * Determine whether a channel exists in the registry
     *
     * @param string Channel name
     * @param bool if true, then aliases will be ignored
     * @return boolean
     */
    function _channelExists($channel, $noaliases = false)
    {
        $a = file_exists($this->_channelFileName($channel, $noaliases));
        if (!$a && $channel == 'pear.php.net') {
            return true;
        }

        if (!$a && $channel == 'pecl.php.net') {
            return true;
        }

        if (!$a && $channel == 'doc.php.net') {
            return true;
        }

        return $a;
    }

    /**
     * Determine whether a mirror exists within the default channel in the registry
     *
     * @param string Channel name
     * @param string Mirror name
     *
     * @return boolean
     */
    function _mirrorExists($channel, $mirror)
    {
        $data = $this->_channelInfo($channel);
        if (!isset($data['servers']['mirror'])) {
            return false;
        }

        foreach ($data['servers']['mirror'] as $m) {
            if ($m['attribs']['host'] == $mirror) {
                return true;
            }
        }

        return false;
    }

    /**
     * @param PEAR_ChannelFile Channel object
     * @param donotuse
     * @param string Last-Modified HTTP tag from remote request
     * @return boolean|PEAR_Error True on creation, false if it already exists
     */
    function _addChannel($channel, $update = false, $lastmodified = false)
    {
        if (!is_a($channel, 'PEAR_ChannelFile')) {
            return false;
        }

        if (!$channel->validate()) {
            return false;
        }

        if (file_exists($this->_channelFileName($channel->getName()))) {
            if (!$update) {
                return false;
            }

            $checker = $this->_getChannel($channel->getName());
            if (PEAR::isError($checker)) {
                return $checker;
            }

            if ($channel->getAlias() != $checker->getAlias()) {
                if (file_exists($this->_getChannelAliasFileName($checker->getAlias()))) {
                    @unlink($this->_getChannelAliasFileName($checker->getAlias()));
                }
            }
        } else {
            if ($update && !in_array($channel->getName(), array('pear.php.net', 'pecl.php.net', 'doc.php.net'))) {
                return false;
            }
        }

        $ret = $this->_assertChannelDir();
        if (PEAR::isError($ret)) {
            return $ret;
        }

        $ret = $this->_assertChannelStateDir($channel->getName());
        if (PEAR::isError($ret)) {
            return $ret;
        }

        if ($channel->getAlias() != $channel->getName()) {
            if (file_exists($this->_getChannelAliasFileName($channel->getAlias())) &&
                  $this->_getChannelFromAlias($channel->getAlias()) != $channel->getName()) {
                $channel->setAlias($channel->getName());
            }

            if (!$this->hasWriteAccess()) {
                return false;
            }

            $fp = @fopen($this->_getChannelAliasFileName($channel->getAlias()), 'w');
            if (!$fp) {
                return false;
            }

            fwrite($fp, $channel->getName());
            fclose($fp);
        }

        if (!$this->hasWriteAccess()) {
            return false;
        }

        $fp = @fopen($this->_channelFileName($channel->getName()), 'wb');
        if (!$fp) {
            return false;
        }

        $info = $channel->toArray();
        if ($lastmodified) {
            $info['_lastmodified'] = $lastmodified;
        } else {
            $info['_lastmodified'] = self::getSourceDateEpoch();
        }

        fwrite($fp, serialize($info));
        fclose($fp);
        return true;
    }

    /**
     * Deletion fails if there are any packages installed from the channel
     * @param string|PEAR_ChannelFile channel name
     * @return boolean|PEAR_Error True on deletion, false if it doesn't exist
     */
    function _deleteChannel($channel)
    {
        if (!is_string($channel)) {
            if (!is_a($channel, 'PEAR_ChannelFile')) {
                return false;
            }

            if (!$channel->validate()) {
                return false;
            }
            $channel = $channel->getName();
        }

        if ($this->_getChannelFromAlias($channel) == '__uri') {
            return false;
        }

        if ($this->_getChannelFromAlias($channel) == 'pecl.php.net') {
            return false;
        }

        if ($this->_getChannelFromAlias($channel) == 'doc.php.net') {
            return false;
        }

        if (!$this->_channelExists($channel)) {
            return false;
        }

        if (!$channel || $this->_getChannelFromAlias($channel) == 'pear.php.net') {
            return false;
        }

        $channel = $this->_getChannelFromAlias($channel);
        if ($channel == 'pear.php.net') {
            return false;
        }

        $test = $this->_listChannelPackages($channel);
        if (count($test)) {
            return false;
        }

        $test = @rmdir($this->_channelDirectoryName($channel));
        if (!$test) {
            return false;
        }

        $file = $this->_getChannelAliasFileName($this->_getAlias($channel));
        if (file_exists($file)) {
            $test = @unlink($file);
            if (!$test) {
                return false;
            }
        }

        $file = $this->_channelFileName($channel);
        $ret = true;
        if (file_exists($file)) {
            $ret = @unlink($file);
        }

        return $ret;
    }

    /**
     * Determine whether a channel exists in the registry
     * @param string Channel Alias
     * @return boolean
     */
    function _isChannelAlias($alias)
    {
        return file_exists($this->_getChannelAliasFileName($alias));
    }

    /**
     * @param string|null
     * @param string|null
     * @param string|null
     * @return array|null
     * @access private
     */
    function _packageInfo($package = null, $key = null, $channel = 'pear.php.net')
    {
        if ($package === null) {
            if ($channel === null) {
                $channels = $this->_listChannels();
                $ret = array();
                foreach ($channels as $channel) {
                    $channel = strtolower($channel);
                    $ret[$channel] = array();
                    $packages = $this->_listPackages($channel);
                    foreach ($packages as $package) {
                        $ret[$channel][] = $this->_packageInfo($package, null, $channel);
                    }
                }

                return $ret;
            }

            $ps = $this->_listPackages($channel);
            if (!count($ps)) {
                return array();
            }
            return array_map(array(&$this, '_packageInfo'),
                             $ps, array_fill(0, count($ps), null),
                             array_fill(0, count($ps), $channel));
        }

        $fp = $this->_openPackageFile($package, 'r', $channel);
        if ($fp === null) {
            return null;
        }

        clearstatcache();
        $this->_closePackageFile($fp);
        $data = file_get_contents($this->_packageFileName($package, $channel));
        $data = @unserialize($data);
        if ($key === null) {
            return $data;
        }

        // compatibility for package.xml version 2.0
        if (isset($data['old'][$key])) {
            return $data['old'][$key];
        }

        if (isset($data[$key])) {
            return $data[$key];
        }

        return null;
    }

    /**
     * @param string Channel name
     * @param bool whether to strictly retrieve info of channels, not just aliases
     * @return array|null
     */
    function _channelInfo($channel, $noaliases = false)
    {
        if (!$this->_channelExists($channel, $noaliases)) {
            return null;
        }

        $fp = $this->_openChannelFile($channel, 'r');
        if ($fp === null) {
            return null;
        }

        clearstatcache();
        $this->_closeChannelFile($fp);
        $data = file_get_contents($this->_channelFileName($channel));
        $data = unserialize($data);
        return $data;
    }

    function _listChannels()
    {
        $channellist = array();
        if (!file_exists($this->channelsdir) || !is_dir($this->channelsdir)) {
            return array('pear.php.net', 'pecl.php.net', 'doc.php.net', '__uri');
        }

        $dp = opendir($this->channelsdir);
        while ($ent = readdir($dp)) {
            if ($ent[0] == '.' || substr($ent, -4) != '.reg') {
                continue;
            }

            if ($ent == '__uri.reg') {
                $channellist[] = '__uri';
                continue;
            }

            $channellist[] = str_replace('_', '/', substr($ent, 0, -4));
        }

        closedir($dp);
        if (!in_array('pear.php.net', $channellist)) {
            $channellist[] = 'pear.php.net';
        }

        if (!in_array('pecl.php.net', $channellist)) {
            $channellist[] = 'pecl.php.net';
        }

        if (!in_array('doc.php.net', $channellist)) {
            $channellist[] = 'doc.php.net';
        }


        if (!in_array('__uri', $channellist)) {
            $channellist[] = '__uri';
        }

        natsort($channellist);
        return $channellist;
    }

    function _listPackages($channel = false)
    {
        if ($channel && $this->_getChannelFromAlias($channel) != 'pear.php.net') {
            return $this->_listChannelPackages($channel);
        }

        if (!file_exists($this->statedir) || !is_dir($this->statedir)) {
            return array();
        }

        $pkglist = array();
        $dp = opendir($this->statedir);
        if (!$dp) {
            return $pkglist;
        }

        while ($ent = readdir($dp)) {
            if ($ent[0] == '.' || substr($ent, -4) != '.reg') {
                continue;
            }

            $pkglist[] = substr($ent, 0, -4);
        }
        closedir($dp);
        sort($pkglist);
        return $pkglist;
    }

    function _listChannelPackages($channel)
    {
        $pkglist = array();
        if (!file_exists($this->_channelDirectoryName($channel)) ||
              !is_dir($this->_channelDirectoryName($channel))) {
            return array();
        }

        $dp = opendir($this->_channelDirectoryName($channel));
        if (!$dp) {
            return $pkglist;
        }

        while ($ent = readdir($dp)) {
            if ($ent[0] == '.' || substr($ent, -4) != '.reg') {
                continue;
            }
            $pkglist[] = substr($ent, 0, -4);
        }

        closedir($dp);
        return $pkglist;
    }

    function _listAllPackages()
    {
        $ret = array();
        foreach ($this->_listChannels() as $channel) {
            $ret[$channel] = $this->_listPackages($channel);
        }

        return $ret;
    }

    /**
     * Add an installed package to the registry
     * @param string package name
     * @param array package info (parsed by PEAR_Common::infoFrom*() methods)
     * @return bool success of saving
     * @access private
     */
    function _addPackage($package, $info)
    {
        if ($this->_packageExists($package)) {
            return false;
        }

        $fp = $this->_openPackageFile($package, 'wb');
        if ($fp === null) {
            return false;
        }

        $info['_lastmodified'] = self::getSourceDateEpoch();
        fwrite($fp, serialize($info));
        $this->_closePackageFile($fp);
        if (isset($info['filelist'])) {
            $this->_rebuildFileMap();
        }

        return true;
    }

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @return bool
     * @access private
     */
    function _addPackage2($info)
    {
        if (!is_a($info, 'PEAR_PackageFile_v1') && !is_a($info, 'PEAR_PackageFile_v2')) {
            return false;
        }

        if (!$info->validate()) {
            if (class_exists('PEAR_Common')) {
                $ui = PEAR_Frontend::singleton();
                if ($ui) {
                    foreach ($info->getValidationWarnings() as $err) {
                        $ui->log($err['message'], true);
                    }
                }
            }
            return false;
        }

        $channel = $info->getChannel();
        $package = $info->getPackage();
        $save = $info;
        if ($this->_packageExists($package, $channel)) {
            return false;
        }

        if (!$this->_channelExists($channel, true)) {
            return false;
        }

        $info = $info->toArray(true);
        if (!$info) {
            return false;
        }

        $fp = $this->_openPackageFile($package, 'wb', $channel);
        if ($fp === null) {
            return false;
        }

        $info['_lastmodified'] = self::getSourceDateEpoch();
        fwrite($fp, serialize($info));
        $this->_closePackageFile($fp);
        $this->_rebuildFileMap();
        return true;
    }

    /**
     * @param string Package name
     * @param array parsed package.xml 1.0
     * @param bool this parameter is only here for BC.  Don't use it.
     * @access private
     */
    function _updatePackage($package, $info, $merge = true)
    {
        $oldinfo = $this->_packageInfo($package);
        if (empty($oldinfo)) {
            return false;
        }

        $fp = $this->_openPackageFile($package, 'w');
        if ($fp === null) {
            return false;
        }

        if (is_object($info)) {
            $info = $info->toArray();
        }
        $info['_lastmodified'] = self::getSourceDateEpoch();

        $newinfo = $info;
        if ($merge) {
            $info = array_merge($oldinfo, $info);
        } else {
            $diff = $info;
        }

        fwrite($fp, serialize($info));
        $this->_closePackageFile($fp);
        if (isset($newinfo['filelist'])) {
            $this->_rebuildFileMap();
        }

        return true;
    }

    /**
     * @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
     * @return bool
     * @access private
     */
    function _updatePackage2($info)
    {
        if (!$this->_packageExists($info->getPackage(), $info->getChannel())) {
            return false;
        }

        $fp = $this->_openPackageFile($info->getPackage(), 'w', $info->getChannel());
        if ($fp === null) {
            return false;
        }

        $save = $info;
        $info = $save->getArray(true);
        $info['_lastmodified'] = self::getSourceDateEpoch();
        fwrite($fp, serialize($info));
        $this->_closePackageFile($fp);
        $this->_rebuildFileMap();
        return true;
    }

    /**
     * @param string Package name
     * @param string Channel name
     * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2|null
     * @access private
     */
    function &_getPackage($package, $channel = 'pear.php.net')
    {
        $info = $this->_packageInfo($package, null, $channel);
        if ($info === null) {
            return $info;
        }

        $a = $this->_config;
        if (!$a) {
            $this->_config = new PEAR_Config;
            $this->_config->set('php_dir', $this->statedir);
        }

        if (!class_exists('PEAR_PackageFile')) {
            require_once 'PEAR/PackageFile.php';
        }

        $pkg = new PEAR_PackageFile($this->_config);
        $pf = &$pkg->fromArray($info);
        return $pf;
    }

    /**
     * @param string channel name
     * @param bool whether to strictly retrieve channel names
     * @return PEAR_ChannelFile|PEAR_Error
     * @access private
     */
    function &_getChannel($channel, $noaliases = false)
    {
        $ch = false;
        if ($this->_channelExists($channel, $noaliases)) {
            $chinfo = $this->_channelInfo($channel, $noaliases);
            if ($chinfo) {
                if (!class_exists('PEAR_ChannelFile')) {
                    require_once 'PEAR/ChannelFile.php';
                }

                $ch = &PEAR_ChannelFile::fromArrayWithErrors($chinfo);
            }
        }

        if ($ch) {
            if ($ch->validate()) {
                return $ch;
            }

            foreach ($ch->getErrors(true) as $err) {
                $message = $err['message'] . "\n";
            }

            $ch = PEAR::raiseError($message);
            return $ch;
        }

        if ($this->_getChannelFromAlias($channel) == 'pear.php.net') {
            // the registry is not properly set up, so use defaults
            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $pear_channel = new PEAR_ChannelFile;
            $pear_channel->setServer('pear.php.net');
            $pear_channel->setAlias('pear');
            $pear_channel->setSummary('PHP Extension and Application Repository');
            $pear_channel->setDefaultPEARProtocols();
            $pear_channel->setBaseURL('REST1.0', 'http://pear.php.net/rest/');
            $pear_channel->setBaseURL('REST1.1', 'http://pear.php.net/rest/');
            $pear_channel->setBaseURL('REST1.3', 'http://pear.php.net/rest/');
            return $pear_channel;
        }

        if ($this->_getChannelFromAlias($channel) == 'pecl.php.net') {
            // the registry is not properly set up, so use defaults
            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }
            $pear_channel = new PEAR_ChannelFile;
            $pear_channel->setServer('pecl.php.net');
            $pear_channel->setAlias('pecl');
            $pear_channel->setSummary('PHP Extension Community Library');
            $pear_channel->setDefaultPEARProtocols();
            $pear_channel->setBaseURL('REST1.0', 'http://pecl.php.net/rest/');
            $pear_channel->setBaseURL('REST1.1', 'http://pecl.php.net/rest/');
            $pear_channel->setValidationPackage('PEAR_Validator_PECL', '1.0');
            return $pear_channel;
        }

        if ($this->_getChannelFromAlias($channel) == 'doc.php.net') {
            // the registry is not properly set up, so use defaults
            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $doc_channel = new PEAR_ChannelFile;
            $doc_channel->setServer('doc.php.net');
            $doc_channel->setAlias('phpdocs');
            $doc_channel->setSummary('PHP Documentation Team');
            $doc_channel->setDefaultPEARProtocols();
            $doc_channel->setBaseURL('REST1.0', 'http://doc.php.net/rest/');
            $doc_channel->setBaseURL('REST1.1', 'http://doc.php.net/rest/');
            $doc_channel->setBaseURL('REST1.3', 'http://doc.php.net/rest/');
            return $doc_channel;
        }


        if ($this->_getChannelFromAlias($channel) == '__uri') {
            // the registry is not properly set up, so use defaults
            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $private = new PEAR_ChannelFile;
            $private->setName('__uri');
            $private->setDefaultPEARProtocols();
            $private->setBaseURL('REST1.0', '****');
            $private->setSummary('Pseudo-channel for static packages');
            return $private;
        }

        return $ch;
    }

    /**
     * @param string Package name
     * @param string Channel name
     * @return bool
     */
    function packageExists($package, $channel = 'pear.php.net')
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_packageExists($package, $channel);
        $this->_unlock();
        return $ret;
    }

    // }}}

    // {{{ channelExists()

    /**
     * @param string channel name
     * @param bool if true, then aliases will be ignored
     * @return bool
     */
    function channelExists($channel, $noaliases = false)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_channelExists($channel, $noaliases);
        $this->_unlock();
        return $ret;
    }

    // }}}

    /**
     * @param string channel name mirror is in
     * @param string mirror name
     *
     * @return bool
     */
    function mirrorExists($channel, $mirror)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }

        $ret = $this->_mirrorExists($channel, $mirror);
        $this->_unlock();
        return $ret;
    }

    // {{{ isAlias()

    /**
     * Determines whether the parameter is an alias of a channel
     * @param string
     * @return bool
     */
    function isAlias($alias)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_isChannelAlias($alias);
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ packageInfo()

    /**
     * @param string|null
     * @param string|null
     * @param string
     * @return array|null
     */
    function packageInfo($package = null, $key = null, $channel = 'pear.php.net')
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_packageInfo($package, $key, $channel);
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ channelInfo()

    /**
     * Retrieve a raw array of channel data.
     *
     * Do not use this, instead use {@link getChannel()} for normal
     * operations.  Array structure is undefined in this method
     * @param string channel name
     * @param bool whether to strictly retrieve information only on non-aliases
     * @return array|null|PEAR_Error
     */
    function channelInfo($channel = null, $noaliases = false)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_channelInfo($channel, $noaliases);
        $this->_unlock();
        return $ret;
    }

    // }}}

    /**
     * @param string
     */
    function channelName($channel)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_getChannelFromAlias($channel);
        $this->_unlock();
        return $ret;
    }

    /**
     * @param string
     */
    function channelAlias($channel)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_getAlias($channel);
        $this->_unlock();
        return $ret;
    }
    // {{{ listPackages()

    function listPackages($channel = false)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_listPackages($channel);
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ listAllPackages()

    function listAllPackages()
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_listAllPackages();
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ listChannel()

    function listChannels()
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_listChannels();
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ addPackage()

    /**
     * Add an installed package to the registry
     * @param string|PEAR_PackageFile_v1|PEAR_PackageFile_v2 package name or object
     *               that will be passed to {@link addPackage2()}
     * @param array package info (parsed by PEAR_Common::infoFrom*() methods)
     * @return bool success of saving
     */
    function addPackage($package, $info)
    {
        if (is_object($info)) {
            return $this->addPackage2($info);
        }
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }
        $ret = $this->_addPackage($package, $info);
        $this->_unlock();
        if ($ret) {
            if (!class_exists('PEAR_PackageFile_v1')) {
                require_once 'PEAR/PackageFile/v1.php';
            }
            $pf = new PEAR_PackageFile_v1;
            $pf->setConfig($this->_config);
            $pf->fromArray($info);
            $this->_dependencyDB->uninstallPackage($pf);
            $this->_dependencyDB->installPackage($pf);
        }
        return $ret;
    }

    // }}}
    // {{{ addPackage2()

    function addPackage2($info)
    {
        if (!is_object($info)) {
            return $this->addPackage($info['package'], $info);
        }
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }
        $ret = $this->_addPackage2($info);
        $this->_unlock();
        if ($ret) {
            $this->_dependencyDB->uninstallPackage($info);
            $this->_dependencyDB->installPackage($info);
        }
        return $ret;
    }

    // }}}
    // {{{ updateChannel()

    /**
     * For future expandibility purposes, separate this
     * @param PEAR_ChannelFile
     */
    function updateChannel($channel, $lastmodified = null)
    {
        if ($channel->getName() == '__uri') {
            return false;
        }
        return $this->addChannel($channel, $lastmodified, true);
    }

    // }}}
    // {{{ deleteChannel()

    /**
     * Deletion fails if there are any packages installed from the channel
     * @param string|PEAR_ChannelFile channel name
     * @return boolean|PEAR_Error True on deletion, false if it doesn't exist
     */
    function deleteChannel($channel)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }

        $ret = $this->_deleteChannel($channel);
        $this->_unlock();
        if ($ret && is_a($this->_config, 'PEAR_Config')) {
            $this->_config->setChannels($this->listChannels());
        }

        return $ret;
    }

    // }}}
    // {{{ addChannel()

    /**
     * @param PEAR_ChannelFile Channel object
     * @param string Last-Modified header from HTTP for caching
     * @return boolean|PEAR_Error True on creation, false if it already exists
     */
    function addChannel($channel, $lastmodified = false, $update = false)
    {
        if (!is_a($channel, 'PEAR_ChannelFile') || !$channel->validate()) {
            return false;
        }

        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }

        $ret = $this->_addChannel($channel, $update, $lastmodified);
        $this->_unlock();
        if (!$update && $ret && is_a($this->_config, 'PEAR_Config')) {
            $this->_config->setChannels($this->listChannels());
        }

        return $ret;
    }

    // }}}
    // {{{ deletePackage()

    function deletePackage($package, $channel = 'pear.php.net')
    {
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }

        $file = $this->_packageFileName($package, $channel);
        $ret  = file_exists($file) ? @unlink($file) : false;
        $this->_rebuildFileMap();
        $this->_unlock();
        $p = array('channel' => $channel, 'package' => $package);
        $this->_dependencyDB->uninstallPackage($p);
        return $ret;
    }

    // }}}
    // {{{ updatePackage()

    function updatePackage($package, $info, $merge = true)
    {
        if (is_object($info)) {
            return $this->updatePackage2($info, $merge);
        }
        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }
        $ret = $this->_updatePackage($package, $info, $merge);
        $this->_unlock();
        if ($ret) {
            if (!class_exists('PEAR_PackageFile_v1')) {
                require_once 'PEAR/PackageFile/v1.php';
            }
            $pf = new PEAR_PackageFile_v1;
            $pf->setConfig($this->_config);
            $pf->fromArray($this->packageInfo($package));
            $this->_dependencyDB->uninstallPackage($pf);
            $this->_dependencyDB->installPackage($pf);
        }
        return $ret;
    }

    // }}}
    // {{{ updatePackage2()

    function updatePackage2($info)
    {

        if (!is_object($info)) {
            return $this->updatePackage($info['package'], $info, $merge);
        }

        if (!$info->validate(PEAR_VALIDATE_DOWNLOADING)) {
            return false;
        }

        if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
            return $e;
        }

        $ret = $this->_updatePackage2($info);
        $this->_unlock();
        if ($ret) {
            $this->_dependencyDB->uninstallPackage($info);
            $this->_dependencyDB->installPackage($info);
        }

        return $ret;
    }

    // }}}
    // {{{ getChannel()
    /**
     * @param string channel name
     * @param bool whether to strictly return raw channels (no aliases)
     * @return PEAR_ChannelFile|PEAR_Error
     */
    function getChannel($channel, $noaliases = false)
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $ret = $this->_getChannel($channel, $noaliases);
        $this->_unlock();
        if (!$ret) {
            return PEAR::raiseError('Unknown channel: ' . $channel);
        }
        return $ret;
    }

    // }}}
    // {{{ getPackage()
    /**
     * @param string package name
     * @param string channel name
     * @return PEAR_PackageFile_v1|PEAR_PackageFile_v2|null
     */
    function &getPackage($package, $channel = 'pear.php.net')
    {
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        $pf = &$this->_getPackage($package, $channel);
        $this->_unlock();
        return $pf;
    }

    // }}}

    /**
     * Get PEAR_PackageFile_v[1/2] objects representing the contents of
     * a dependency group that are installed.
     *
     * This is used at uninstall-time
     * @param array
     * @return array|false
     */
    function getInstalledGroup($group)
    {
        $ret = array();
        if (isset($group['package'])) {
            if (!isset($group['package'][0])) {
                $group['package'] = array($group['package']);
            }
            foreach ($group['package'] as $package) {
                $depchannel = isset($package['channel']) ? $package['channel'] : '__uri';
                $p = &$this->getPackage($package['name'], $depchannel);
                if ($p) {
                    $save = &$p;
                    $ret[] = &$save;
                }
            }
        }
        if (isset($group['subpackage'])) {
            if (!isset($group['subpackage'][0])) {
                $group['subpackage'] = array($group['subpackage']);
            }
            foreach ($group['subpackage'] as $package) {
                $depchannel = isset($package['channel']) ? $package['channel'] : '__uri';
                $p = &$this->getPackage($package['name'], $depchannel);
                if ($p) {
                    $save = &$p;
                    $ret[] = &$save;
                }
            }
        }
        if (!count($ret)) {
            return false;
        }
        return $ret;
    }

    // {{{ getChannelValidator()
    /**
     * @param string channel name
     * @return PEAR_Validate|false
     */
    function &getChannelValidator($channel)
    {
        $chan = $this->getChannel($channel);
        if (PEAR::isError($chan)) {
            return $chan;
        }
        $val = $chan->getValidationObject();
        return $val;
    }
    // }}}
    // {{{ getChannels()
    /**
     * @param string channel name
     * @return array an array of PEAR_ChannelFile objects representing every installed channel
     */
    function &getChannels()
    {
        $ret = array();
        if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
            return $e;
        }
        foreach ($this->_listChannels() as $channel) {
            $e = &$this->_getChannel($channel);
            if (!$e || PEAR::isError($e)) {
                continue;
            }
            $ret[] = $e;
        }
        $this->_unlock();
        return $ret;
    }

    // }}}
    // {{{ checkFileMap()

    /**
     * Test whether a file or set of files belongs to a package.
     *
     * If an array is passed in
     * @param string|array file path, absolute or relative to the pear
     *                     install dir
     * @param string|array name of PEAR package or array('package' => name, 'channel' =>
     *                     channel) of a package that will be ignored
     * @param string API version - 1.1 will exclude any files belonging to a package
     * @param array private recursion variable
     * @return array|false which package and channel the file belongs to, or an empty
     *                     string if the file does not belong to an installed package,
     *                     or belongs to the second parameter's package
     */
    function checkFileMap($path, $package = false, $api = '1.0', $attrs = false)
    {
        if (is_array($path)) {
            static $notempty;
            if (empty($notempty)) {
                if (!class_exists('PEAR_Installer_Role')) {
                    require_once 'PEAR/Installer/Role.php';
                }
                $notempty = function($a) { return !empty($a); };
            }
            $package = is_array($package) ? array(strtolower($package[0]), strtolower($package[1]))
                : strtolower($package);
            $pkgs = array();
            foreach ($path as $name => $attrs) {
                if (is_array($attrs)) {
                    if (isset($attrs['install-as'])) {
                        $name = $attrs['install-as'];
                    }
                    if (!in_array($attrs['role'], PEAR_Installer_Role::getInstallableRoles())) {
                        // these are not installed
                        continue;
                    }
                    if (!in_array($attrs['role'], PEAR_Installer_Role::getBaseinstallRoles())) {
                        $attrs['baseinstalldir'] = is_array($package) ? $package[1] : $package;
                    }
                    if (isset($attrs['baseinstalldir'])) {
                        $name = $attrs['baseinstalldir'] . DIRECTORY_SEPARATOR . $name;
                    }
                }
                $pkgs[$name] = $this->checkFileMap($name, $package, $api, $attrs);
                if (PEAR::isError($pkgs[$name])) {
                    return $pkgs[$name];
                }
            }
            return array_filter($pkgs, $notempty);
        }
        if (empty($this->filemap_cache)) {
            if (PEAR::isError($e = $this->_lock(LOCK_SH))) {
                return $e;
            }
            $err = $this->_readFileMap();
            $this->_unlock();
            if (PEAR::isError($err)) {
                return $err;
            }
        }
        if (!$attrs) {
            $attrs = array('role' => 'php'); // any old call would be for PHP role only
        }
        if (isset($this->filemap_cache[$attrs['role']][$path])) {
            if ($api >= '1.1' && $this->filemap_cache[$attrs['role']][$path] == $package) {
                return false;
            }
            return $this->filemap_cache[$attrs['role']][$path];
        }
        $l = strlen($this->install_dir);
        if (substr($path, 0, $l) == $this->install_dir) {
            $path = preg_replace('!^'.DIRECTORY_SEPARATOR.'+!', '', substr($path, $l));
        }
        if (isset($this->filemap_cache[$attrs['role']][$path])) {
            if ($api >= '1.1' && $this->filemap_cache[$attrs['role']][$path] == $package) {
                return false;
            }
            return $this->filemap_cache[$attrs['role']][$path];
        }
        return false;
    }

    // }}}
    // {{{ flush()
    /**
     * Force a reload of the filemap
     * @since 1.5.0RC3
     */
    function flushFileMap()
    {
        $this->filemap_cache = null;
        clearstatcache(); // ensure that the next read gets the full, current filemap
    }

    // }}}
    // {{{ apiVersion()
    /**
     * Get the expected API version.  Channels API is version 1.1, as it is backwards
     * compatible with 1.0
     * @return string
     */
    function apiVersion()
    {
        return '1.1';
    }
    // }}}


    /**
     * Parse a package name, or validate a parsed package name array
     * @param string|array pass in an array of format
     *                     array(
     *                      'package' => 'pname',
     *                     ['channel' => 'channame',]
     *                     ['version' => 'version',]
     *                     ['state' => 'state',]
     *                     ['group' => 'groupname'])
     *                     or a string of format
     *                     [channel://][channame/]pname[-version|-state][/group=groupname]
     * @return array|PEAR_Error
     */
    function parsePackageName($param, $defaultchannel = 'pear.php.net')
    {
        $saveparam = $param;
        if (is_array($param)) {
            // convert to string for error messages
            $saveparam = $this->parsedPackageNameToString($param);
            // process the array
            if (!isset($param['package'])) {
                return PEAR::raiseError('parsePackageName(): array $param ' .
                    'must contain a valid package name in index "param"',
                    'package', null, null, $param);
            }
            if (!isset($param['uri'])) {
                if (!isset($param['channel'])) {
                    $param['channel'] = $defaultchannel;
                }
            } else {
                $param['channel'] = '__uri';
            }
        } else {
            $components = @parse_url((string) $param);
            if (isset($components['scheme'])) {
                if ($components['scheme'] == 'http') {
                    // uri package
                    $param = array('uri' => $param, 'channel' => '__uri');
                } elseif($components['scheme'] != 'channel') {
                    return PEAR::raiseError('parsePackageName(): only channel:// uris may ' .
                        'be downloaded, not "' . $param . '"', 'invalid', null, null, $param);
                }
            }
            if (!isset($components['path'])) {
                return PEAR::raiseError('parsePackageName(): array $param ' .
                    'must contain a valid package name in "' . $param . '"',
                    'package', null, null, $param);
            }
            if (isset($components['host'])) {
                // remove the leading "/"
                $components['path'] = substr($components['path'], 1);
            }
            if (!isset($components['scheme'])) {
                if (strpos($components['path'], '/') !== false) {
                    if ($components['path'][0] == '/') {
                        return PEAR::raiseError('parsePackageName(): this is not ' .
                            'a package name, it begins with "/" in "' . $param . '"',
                            'invalid', null, null, $param);
                    }
                    $parts = explode('/', $components['path']);
                    $components['host'] = array_shift($parts);
                    if (count($parts) > 1) {
                        $components['path'] = array_pop($parts);
                        $components['host'] .= '/' . implode('/', $parts);
                    } else {
                        $components['path'] = implode('/', $parts);
                    }
                } else {
                    $components['host'] = $defaultchannel;
                }
            } else {
                if (strpos($components['path'], '/')) {
                    $parts = explode('/', $components['path']);
                    $components['path'] = array_pop($parts);
                    $components['host'] .= '/' . implode('/', $parts);
                }
            }

            if (is_array($param)) {
                $param['package'] = $components['path'];
            } else {
                $param = array(
                    'package' => $components['path']
                    );
                if (isset($components['host'])) {
                    $param['channel'] = $components['host'];
                }
            }
            if (isset($components['fragment'])) {
                $param['group'] = $components['fragment'];
            }
            if (isset($components['user'])) {
                $param['user'] = $components['user'];
            }
            if (isset($components['pass'])) {
                $param['pass'] = $components['pass'];
            }
            if (isset($components['query'])) {
                parse_str($components['query'], $param['opts']);
            }
            // check for extension
            $pathinfo = pathinfo($param['package']);
            if (isset($pathinfo['extension']) &&
                  in_array(strtolower($pathinfo['extension']), array('tgz', 'tar'))) {
                $param['extension'] = $pathinfo['extension'];
                $param['package'] = substr($pathinfo['basename'], 0,
                    strlen($pathinfo['basename']) - 4);
            }
            // check for version
            if (strpos($param['package'], '-')) {
                $test = explode('-', $param['package']);
                if (count($test) != 2) {
                    return PEAR::raiseError('parsePackageName(): only one version/state ' .
                        'delimiter "-" is allowed in "' . $saveparam . '"',
                        'version', null, null, $param);
                }
                list($param['package'], $param['version']) = $test;
            }
        }
        // validation
        $info = $this->channelExists($param['channel']);
        if (PEAR::isError($info)) {
            return $info;
        }
        if (!$info) {
            return PEAR::raiseError('unknown channel "' . $param['channel'] .
                '" in "' . $saveparam . '"', 'channel', null, null, $param);
        }
        $chan = $this->getChannel($param['channel']);
        if (PEAR::isError($chan)) {
            return $chan;
        }
        if (!$chan) {
            return PEAR::raiseError("Exception: corrupt registry, could not " .
                "retrieve channel " . $param['channel'] . " information",
                'registry', null, null, $param);
        }
        $param['channel'] = $chan->getName();
        $validate = $chan->getValidationObject();
        $vpackage = $chan->getValidationPackage();
        // validate package name
        if (!$validate->validPackageName($param['package'], $vpackage['_content'])) {
            return PEAR::raiseError('parsePackageName(): invalid package name "' .
                $param['package'] . '" in "' . $saveparam . '"',
                'package', null, null, $param);
        }
        if (isset($param['group'])) {
            if (!PEAR_Validate::validGroupName($param['group'])) {
                return PEAR::raiseError('parsePackageName(): dependency group "' . $param['group'] .
                    '" is not a valid group name in "' . $saveparam . '"', 'group', null, null,
                    $param);
            }
        }
        if (isset($param['state'])) {
            if (!in_array(strtolower($param['state']), $validate->getValidStates())) {
                return PEAR::raiseError('parsePackageName(): state "' . $param['state']
                    . '" is not a valid state in "' . $saveparam . '"',
                    'state', null, null, $param);
            }
        }
        if (isset($param['version'])) {
            if (isset($param['state'])) {
                return PEAR::raiseError('parsePackageName(): cannot contain both ' .
                    'a version and a stability (state) in "' . $saveparam . '"',
                    'version/state', null, null, $param);
            }
            // check whether version is actually a state
            if (in_array(strtolower($param['version']), $validate->getValidStates())) {
                $param['state'] = strtolower($param['version']);
                unset($param['version']);
            } else {
                if (!$validate->validVersion($param['version'])) {
                    return PEAR::raiseError('parsePackageName(): "' . $param['version'] .
                        '" is neither a valid version nor a valid state in "' .
                        $saveparam . '"', 'version/state', null, null, $param);
                }
            }
        }
        return $param;
    }

    /**
     * @param array
     * @return string
     */
    function parsedPackageNameToString($parsed, $brief = false)
    {
        if (is_string($parsed)) {
            return $parsed;
        }
        if (is_object($parsed)) {
            $p = $parsed;
            $parsed = array(
                'package' => $p->getPackage(),
                'channel' => $p->getChannel(),
                'version' => $p->getVersion(),
            );
        }
        if (isset($parsed['uri'])) {
            return $parsed['uri'];
        }
        if ($brief) {
            if ($channel = $this->channelAlias($parsed['channel'])) {
                return $channel . '/' . $parsed['package'];
            }
        }
        $upass = '';
        if (isset($parsed['user'])) {
            $upass = $parsed['user'];
            if (isset($parsed['pass'])) {
                $upass .= ':' . $parsed['pass'];
            }
            $upass = "$upass@";
        }
        $ret = 'channel://' . $upass . $parsed['channel'] . '/' . $parsed['package'];
        if (isset($parsed['version']) || isset($parsed['state'])) {
            $ver = isset($parsed['version']) ? $parsed['version'] : '';
            $ver .= isset($parsed['state']) ? $parsed['state'] : '';
            $ret .= '-' . $ver;
        }
        if (isset($parsed['extension'])) {
            $ret .= '.' . $parsed['extension'];
        }
        if (isset($parsed['opts'])) {
            $ret .= '?';
            foreach ($parsed['opts'] as $name => $value) {
                $parsed['opts'][$name] = "$name=$value";
            }
            $ret .= implode('&', $parsed['opts']);
        }
        if (isset($parsed['group'])) {
            $ret .= '#' . $parsed['group'];
        }
        return $ret;
    }
}
PK�a�\Z h66pear/PEAR/Command/Package.xmlnu�[���<commands version="1.0">
 <package>
  <summary>Build Package</summary>
  <function>doPackage</function>
  <shortcut>p</shortcut>
  <options>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>Do not gzip the package file</doc>
   </nocompress>
   <showname>
    <shortopt>n</shortopt>
    <doc>Print the name of the packaged file.</doc>
   </showname>
  </options>
  <doc>[descfile] [descfile2]
Creates a PEAR package from its description file (usually called
package.xml).  If a second packagefile is passed in, then
the packager will check to make sure that one is a package.xml
version 1.0, and the other is a package.xml version 2.0.  The
package.xml version 1.0 will be saved as &quot;package.xml&quot; in the archive,
and the other as &quot;package2.xml&quot; in the archive&quot;
</doc>
 </package>
 <package-validate>
  <summary>Validate Package Consistency</summary>
  <function>doPackageValidate</function>
  <shortcut>pv</shortcut>
  <options />
  <doc>
</doc>
 </package-validate>
 <cvsdiff>
  <summary>Run a &quot;cvs diff&quot; for all files in a package</summary>
  <function>doCvsDiff</function>
  <shortcut>cd</shortcut>
  <options>
   <quiet>
    <shortopt>q</shortopt>
    <doc>Be quiet</doc>
   </quiet>
   <reallyquiet>
    <shortopt>Q</shortopt>
    <doc>Be really quiet</doc>
   </reallyquiet>
   <date>
    <shortopt>D</shortopt>
    <doc>Diff against revision of DATE</doc>
    <arg>DATE</arg>
   </date>
   <release>
    <shortopt>R</shortopt>
    <doc>Diff against tag for package release REL</doc>
    <arg>REL</arg>
   </release>
   <revision>
    <shortopt>r</shortopt>
    <doc>Diff against revision REV</doc>
    <arg>REV</arg>
   </revision>
   <context>
    <shortopt>c</shortopt>
    <doc>Generate context diff</doc>
   </context>
   <unified>
    <shortopt>u</shortopt>
    <doc>Generate unified diff</doc>
   </unified>
   <ignore-case>
    <shortopt>i</shortopt>
    <doc>Ignore case, consider upper- and lower-case letters equivalent</doc>
   </ignore-case>
   <ignore-whitespace>
    <shortopt>b</shortopt>
    <doc>Ignore changes in amount of white space</doc>
   </ignore-whitespace>
   <ignore-blank-lines>
    <shortopt>B</shortopt>
    <doc>Ignore changes that insert or delete blank lines</doc>
   </ignore-blank-lines>
   <brief>
    <shortopt></shortopt>
    <doc>Report only whether the files differ, no details</doc>
   </brief>
   <dry-run>
    <shortopt>n</shortopt>
    <doc>Don&#039;t do anything, just pretend</doc>
   </dry-run>
  </options>
  <doc>&lt;package.xml&gt;
Compares all the files in a package.  Without any options, this
command will compare the current code with the last checked-in code.
Using the -r or -R option you may compare the current code with that
of a specific release.
</doc>
 </cvsdiff>
 <svntag>
  <summary>Set SVN Release Tag</summary>
  <function>doSvnTag</function>
  <shortcut>sv</shortcut>
  <options>
   <quiet>
    <shortopt>q</shortopt>
    <doc>Be quiet</doc>
   </quiet>
   <slide>
    <shortopt>F</shortopt>
    <doc>Move (slide) tag if it exists</doc>
   </slide>
   <delete>
    <shortopt>d</shortopt>
    <doc>Remove tag</doc>
   </delete>
   <dry-run>
    <shortopt>n</shortopt>
    <doc>Don&#039;t do anything, just pretend</doc>
   </dry-run>
  </options>
  <doc>&lt;package.xml&gt; [files...]
 Sets a SVN tag on all files in a package.  Use this command after you have
 packaged a distribution tarball with the &quot;package&quot; command to tag what
 revisions of what files were in that release.  If need to fix something
 after running svntag once, but before the tarball is released to the public,
 use the &quot;slide&quot; option to move the release tag.

 to include files (such as a second package.xml, or tests not included in the
 release), pass them as additional parameters.
 </doc>
 </svntag>
 <cvstag>
  <summary>Set CVS Release Tag</summary>
  <function>doCvsTag</function>
  <shortcut>ct</shortcut>
  <options>
   <quiet>
    <shortopt>q</shortopt>
    <doc>Be quiet</doc>
   </quiet>
   <reallyquiet>
    <shortopt>Q</shortopt>
    <doc>Be really quiet</doc>
   </reallyquiet>
   <slide>
    <shortopt>F</shortopt>
    <doc>Move (slide) tag if it exists</doc>
   </slide>
   <delete>
    <shortopt>d</shortopt>
    <doc>Remove tag</doc>
   </delete>
   <dry-run>
    <shortopt>n</shortopt>
    <doc>Don&#039;t do anything, just pretend</doc>
   </dry-run>
  </options>
  <doc>&lt;package.xml&gt; [files...]
Sets a CVS tag on all files in a package.  Use this command after you have
packaged a distribution tarball with the &quot;package&quot; command to tag what
revisions of what files were in that release.  If need to fix something
after running cvstag once, but before the tarball is released to the public,
use the &quot;slide&quot; option to move the release tag.

to include files (such as a second package.xml, or tests not included in the
release), pass them as additional parameters.
</doc>
 </cvstag>
 <package-dependencies>
  <summary>Show package dependencies</summary>
  <function>doPackageDependencies</function>
  <shortcut>pd</shortcut>
  <options />
  <doc>&lt;package-file&gt; or &lt;package.xml&gt; or &lt;install-package-name&gt;
List all dependencies the package has.
Can take a tgz / tar file, package.xml or a package name of an installed package.</doc>
 </package-dependencies>
 <sign>
  <summary>Sign a package distribution file</summary>
  <function>doSign</function>
  <shortcut>si</shortcut>
  <options>
   <verbose>
    <shortopt>v</shortopt>
    <doc>Display GnuPG output</doc>
   </verbose>
  </options>
  <doc>&lt;package-file&gt;
Signs a package distribution (.tar or .tgz) file with GnuPG.</doc>
 </sign>
 <makerpm>
  <summary>Builds an RPM spec file from a PEAR package</summary>
  <function>doMakeRPM</function>
  <shortcut>rpm</shortcut>
  <options>
   <spec-template>
    <shortopt>t</shortopt>
    <doc>Use FILE as RPM spec file template</doc>
    <arg>FILE</arg>
   </spec-template>
   <rpm-pkgname>
    <shortopt>p</shortopt>
    <doc>Use FORMAT as format string for RPM package name, %s is replaced
by the PEAR package name, defaults to &quot;PEAR::%s&quot;.</doc>
    <arg>FORMAT</arg>
   </rpm-pkgname>
  </options>
  <doc>&lt;package-file&gt;

Creates an RPM .spec file for wrapping a PEAR package inside an RPM
package.  Intended to be used from the SPECS directory, with the PEAR
package tarball in the SOURCES directory:

$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz
Wrote RPM spec file PEAR::Net_Geo-1.0.spec
$ rpm -bb PEAR::Net_Socket-1.0.spec
...
Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm
</doc>
 </makerpm>
 <convert>
  <summary>Convert a package.xml 1.0 to package.xml 2.0 format</summary>
  <function>doConvert</function>
  <shortcut>c2</shortcut>
  <options>
   <flat>
    <shortopt>f</shortopt>
    <doc>do not beautify the filelist.</doc>
   </flat>
  </options>
  <doc>[descfile] [descfile2]
Converts a package.xml in 1.0 format into a package.xml
in 2.0 format.  The new file will be named package2.xml by default,
and package.xml will be used as the old file by default.
This is not the most intelligent conversion, and should only be
used for automated conversion or learning the format.
</doc>
 </convert>
</commands>PK�a�\�%Fiipear/PEAR/Command/Test.xmlnu�[���<commands version="1.0">
 <run-tests>
  <summary>Run Regression Tests</summary>
  <function>doRunTests</function>
  <shortcut>rt</shortcut>
  <options>
   <recur>
    <shortopt>r</shortopt>
    <doc>Run tests in child directories, recursively.  4 dirs deep maximum</doc>
   </recur>
   <ini>
    <shortopt>i</shortopt>
    <doc>actual string of settings to pass to php in format &quot; -d setting=blah&quot;</doc>
    <arg>SETTINGS</arg>
   </ini>
   <realtimelog>
    <shortopt>l</shortopt>
    <doc>Log test runs/results as they are run</doc>
   </realtimelog>
   <quiet>
    <shortopt>q</shortopt>
    <doc>Only display detail for failed tests</doc>
   </quiet>
   <simple>
    <shortopt>s</shortopt>
    <doc>Display simple output for all tests</doc>
   </simple>
   <package>
    <shortopt>p</shortopt>
    <doc>Treat parameters as installed packages from which to run tests</doc>
   </package>
   <phpunit>
    <shortopt>u</shortopt>
    <doc>Search parameters for AllTests.php, and use that to run phpunit-based tests
If none is found, all .phpt tests will be tried instead.</doc>
   </phpunit>
   <tapoutput>
    <shortopt>t</shortopt>
    <doc>Output run-tests.log in TAP-compliant format</doc>
   </tapoutput>
   <cgi>
    <shortopt>c</shortopt>
    <doc>CGI php executable (needed for tests with POST/GET section)</doc>
    <arg>PHPCGI</arg>
   </cgi>
   <coverage>
    <shortopt>x</shortopt>
    <doc>Generate a code coverage report (requires Xdebug 2.0.0+)</doc>
   </coverage>
  </options>
  <doc>[testfile|dir ...]
Run regression tests with PHP&#039;s regression testing script (run-tests.php).</doc>
 </run-tests>
</commands>PK�a�\,��t"u"upear/PEAR/Command/Remote.phpnu�[���<?php
/**
 * PEAR_Command_Remote (remote-info, list-upgrades, remote-list, search, list-all, download,
 * clear-cache commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';
require_once 'PEAR/REST.php';

/**
 * PEAR commands for remote server querying
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Remote extends PEAR_Command_Common
{
    var $commands = array(
        'remote-info' => array(
            'summary' => 'Information About Remote Packages',
            'function' => 'doRemoteInfo',
            'shortcut' => 'ri',
            'options' => array(),
            'doc' => '<package>
Get details on a package from the server.',
            ),
        'list-upgrades' => array(
            'summary' => 'List Available Upgrades',
            'function' => 'doListUpgrades',
            'shortcut' => 'lu',
            'options' => array(
                'channelinfo' => array(
                    'shortopt' => 'i',
                    'doc' => 'output fully channel-aware data, even on failure',
                    ),
            ),
            'doc' => '[preferred_state]
List releases on the server of packages you have installed where
a newer version is available with the same release state (stable etc.)
or the state passed as the second parameter.'
            ),
        'remote-list' => array(
            'summary' => 'List Remote Packages',
            'function' => 'doRemoteList',
            'shortcut' => 'rl',
            'options' => array(
                'channel' =>
                    array(
                    'shortopt' => 'c',
                    'doc' => 'specify a channel other than the default channel',
                    'arg' => 'CHAN',
                    )
                ),
            'doc' => '
Lists the packages available on the configured server along with the
latest stable release of each package.',
            ),
        'search' => array(
            'summary' => 'Search remote package database',
            'function' => 'doSearch',
            'shortcut' => 'sp',
            'options' => array(
                'channel' =>
                    array(
                    'shortopt' => 'c',
                    'doc' => 'specify a channel other than the default channel',
                    'arg' => 'CHAN',
                    ),
                'allchannels' => array(
                    'shortopt' => 'a',
                    'doc' => 'search packages from all known channels',
                    ),
                'channelinfo' => array(
                    'shortopt' => 'i',
                    'doc' => 'output fully channel-aware data, even on failure',
                    ),
                ),
            'doc' => '[packagename] [packageinfo]
Lists all packages which match the search parameters.  The first
parameter is a fragment of a packagename.  The default channel
will be used unless explicitly overridden.  The second parameter
will be used to match any portion of the summary/description',
            ),
        'list-all' => array(
            'summary' => 'List All Packages',
            'function' => 'doListAll',
            'shortcut' => 'la',
            'options' => array(
                'channel' =>
                    array(
                    'shortopt' => 'c',
                    'doc' => 'specify a channel other than the default channel',
                    'arg' => 'CHAN',
                    ),
                'channelinfo' => array(
                    'shortopt' => 'i',
                    'doc' => 'output fully channel-aware data, even on failure',
                    ),
                ),
            'doc' => '
Lists the packages available on the configured server along with the
latest stable release of each package.',
            ),
        'download' => array(
            'summary' => 'Download Package',
            'function' => 'doDownload',
            'shortcut' => 'd',
            'options' => array(
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'download an uncompressed (.tar) file',
                    ),
                ),
            'doc' => '<package>...
Download package tarballs.  The files will be named as suggested by the
server, for example if you download the DB package and the latest stable
version of DB is 1.6.5, the downloaded file will be DB-1.6.5.tgz.',
            ),
        'clear-cache' => array(
            'summary' => 'Clear Web Services Cache',
            'function' => 'doClearCache',
            'shortcut' => 'cc',
            'options' => array(),
            'doc' => '
Clear the REST cache. See also the cache_ttl configuration
parameter.
',
            ),
        );

    /**
     * PEAR_Command_Remote constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function _checkChannelForStatus($channel, $chan)
    {
        if (PEAR::isError($chan)) {
            $this->raiseError($chan);
        }
        if (!is_a($chan, 'PEAR_ChannelFile')) {
            return $this->raiseError('Internal corruption error: invalid channel "' .
                $channel . '"');
        }
        $rest = new PEAR_REST($this->config);
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $mirror = $this->config->get('preferred_mirror', null,
                                     $channel);
        $a = $rest->downloadHttp('http://' . $channel .
            '/channel.xml', $chan->lastModified());
        PEAR::staticPopErrorHandling();
        if (!PEAR::isError($a) && $a) {
            $this->ui->outputData('WARNING: channel "' . $channel . '" has ' .
                'updated its protocols, use "' . PEAR_RUNTYPE . ' channel-update ' . $channel .
                '" to update');
        }
    }

    function doRemoteInfo($command, $options, $params)
    {
        if (sizeof($params) != 1) {
            return $this->raiseError("$command expects one param: the remote package name");
        }
        $savechannel = $channel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        $package = $params[0];
        $parsed = $reg->parsePackageName($package, $channel);
        if (PEAR::isError($parsed)) {
            return $this->raiseError('Invalid package name "' . $package . '"');
        }

        $channel = $parsed['channel'];
        $this->config->set('default_channel', $channel);
        $chan = $reg->getChannel($channel);
        if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
            return $e;
        }

        $mirror = $this->config->get('preferred_mirror');
        if ($chan->supportsREST($mirror) && $base = $chan->getBaseURL('REST1.0', $mirror)) {
            $rest = &$this->config->getREST('1.0', array());
            $info = $rest->packageInfo($base, $parsed['package'], $channel);
        }

        if (!isset($info)) {
            return $this->raiseError('No supported protocol was found');
        }

        if (PEAR::isError($info)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError($info);
        }

        if (!isset($info['name'])) {
            return $this->raiseError('No remote package "' . $package . '" was found');
        }

        $installed = $reg->packageInfo($info['name'], null, $channel);
        $info['installed'] = $installed ? $installed['version'] : '- no -';
        if (is_array($info['installed'])) {
            $info['installed'] = $info['installed']['release'];
        }

        $this->ui->outputData($info, $command);
        $this->config->set('default_channel', $savechannel);

        return true;
    }

    function doRemoteList($command, $options, $params)
    {
        $savechannel = $channel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        if (isset($options['channel'])) {
            $channel = $options['channel'];
            if (!$reg->channelExists($channel)) {
                return $this->raiseError('Channel "' . $channel . '" does not exist');
            }

            $this->config->set('default_channel', $channel);
        }

        $chan = $reg->getChannel($channel);
        if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
            return $e;
        }

        $list_options = false;
        if ($this->config->get('preferred_state') == 'stable') {
            $list_options = true;
        }

        $available = array();
        if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror'))
        ) {
            // use faster list-all if available
            $rest = &$this->config->getREST('1.1', array());
            $available = $rest->listAll($base, $list_options, true, false, false, $chan->getName());
        } elseif ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
            $rest = &$this->config->getREST('1.0', array());
            $available = $rest->listAll($base, $list_options, true, false, false, $chan->getName());
        }

        if (PEAR::isError($available)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError($available);
        }

        $i = $j = 0;
        $data = array(
            'caption' => 'Channel ' . $channel . ' Available packages:',
            'border' => true,
            'headline' => array('Package', 'Version'),
            'channel' => $channel
            );

        if (count($available) == 0) {
            $data = '(no packages available yet)';
        } else {
            foreach ($available as $name => $info) {
                $version = (isset($info['stable']) && $info['stable']) ? $info['stable'] : '-n/a-';
                $data['data'][] = array($name, $version);
            }
        }
        $this->ui->outputData($data, $command);
        $this->config->set('default_channel', $savechannel);
        return true;
    }

    function doListAll($command, $options, $params)
    {
        $savechannel = $channel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        if (isset($options['channel'])) {
            $channel = $options['channel'];
            if (!$reg->channelExists($channel)) {
                return $this->raiseError("Channel \"$channel\" does not exist");
            }

            $this->config->set('default_channel', $channel);
        }

        $list_options = false;
        if ($this->config->get('preferred_state') == 'stable') {
            $list_options = true;
        }

        $chan = $reg->getChannel($channel);
        if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
            return $e;
        }

        if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror'))) {
            // use faster list-all if available
            $rest = &$this->config->getREST('1.1', array());
            $available = $rest->listAll($base, $list_options, false, false, false, $chan->getName());
        } elseif ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
            $rest = &$this->config->getREST('1.0', array());
            $available = $rest->listAll($base, $list_options, false, false, false, $chan->getName());
        }

        if (PEAR::isError($available)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError('The package list could not be fetched from the remote server. Please try again. (Debug info: "' . $available->getMessage() . '")');
        }

        $data = array(
            'caption' => 'All packages [Channel ' . $channel . ']:',
            'border' => true,
            'headline' => array('Package', 'Latest', 'Local'),
            'channel' => $channel,
            );

        if (isset($options['channelinfo'])) {
            // add full channelinfo
            $data['caption'] = 'Channel ' . $channel . ' All packages:';
            $data['headline'] = array('Channel', 'Package', 'Latest', 'Local',
                'Description', 'Dependencies');
        }
        $local_pkgs = $reg->listPackages($channel);

        foreach ($available as $name => $info) {
            $installed = $reg->packageInfo($name, null, $channel);
            if ($installed && is_array($installed['version'])) {
                $installed['version'] = $installed['version']['release'];
            }
            $desc = $info['summary'];
            if (isset($params[$name])) {
                $desc .= "\n\n".$info['description'];
            }
            if (isset($options['mode']))
            {
                if ($options['mode'] == 'installed' && !isset($installed['version'])) {
                    continue;
                }
                if ($options['mode'] == 'notinstalled' && isset($installed['version'])) {
                    continue;
                }
                if ($options['mode'] == 'upgrades'
                      && (!isset($installed['version']) || version_compare($installed['version'],
                      $info['stable'], '>='))) {
                    continue;
                }
            }
            $pos = array_search(strtolower($name), $local_pkgs);
            if ($pos !== false) {
                unset($local_pkgs[$pos]);
            }

            if (isset($info['stable']) && !$info['stable']) {
                $info['stable'] = null;
            }

            if (isset($options['channelinfo'])) {
                // add full channelinfo
                if ($info['stable'] === $info['unstable']) {
                    $state = $info['state'];
                } else {
                    $state = 'stable';
                }
                $latest = $info['stable'].' ('.$state.')';
                $local = '';
                if (isset($installed['version'])) {
                    $inst_state = $reg->packageInfo($name, 'release_state', $channel);
                    $local = $installed['version'].' ('.$inst_state.')';
                }

                $packageinfo = array(
                    $channel,
                    $name,
                    $latest,
                    $local,
                    isset($desc) ? $desc : null,
                    isset($info['deps']) ? $info['deps'] : null,
                );
            } else {
                $packageinfo = array(
                    $reg->channelAlias($channel) . '/' . $name,
                    isset($info['stable']) ? $info['stable'] : null,
                    isset($installed['version']) ? $installed['version'] : null,
                    isset($desc) ? $desc : null,
                    isset($info['deps']) ? $info['deps'] : null,
                );
            }
            $data['data'][$info['category']][] = $packageinfo;
        }

        if (isset($options['mode']) && in_array($options['mode'], array('notinstalled', 'upgrades'))) {
            $this->config->set('default_channel', $savechannel);
            $this->ui->outputData($data, $command);
            return true;
        }

        foreach ($local_pkgs as $name) {
            $info = &$reg->getPackage($name, $channel);
            $data['data']['Local'][] = array(
                $reg->channelAlias($channel) . '/' . $info->getPackage(),
                '',
                $info->getVersion(),
                $info->getSummary(),
                $info->getDeps()
                );
        }

        $this->config->set('default_channel', $savechannel);
        $this->ui->outputData($data, $command);
        return true;
    }

    function doSearch($command, $options, $params)
    {
        if ((!isset($params[0]) || empty($params[0]))
            && (!isset($params[1]) || empty($params[1])))
        {
            return $this->raiseError('no valid search string supplied');
        }

        $channelinfo = isset($options['channelinfo']);
        $reg = &$this->config->getRegistry();
        if (isset($options['allchannels'])) {
            // search all channels
            unset($options['allchannels']);
            $channels = $reg->getChannels();
            $errors = array();
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            foreach ($channels as $channel) {
                if ($channel->getName() != '__uri') {
                    $options['channel'] = $channel->getName();
                    $ret = $this->doSearch($command, $options, $params);
                    if (PEAR::isError($ret)) {
                        $errors[] = $ret;
                    }
                }
            }

            PEAR::staticPopErrorHandling();
            if (count($errors) !== 0) {
                // for now, only give first error
                return PEAR::raiseError($errors[0]);
            }

            return true;
        }

        $savechannel = $channel = $this->config->get('default_channel');
        $package = strtolower($params[0]);
        $summary = isset($params[1]) ? $params[1] : false;
        if (isset($options['channel'])) {
            $reg = &$this->config->getRegistry();
            $channel = $options['channel'];
            if (!$reg->channelExists($channel)) {
                return $this->raiseError('Channel "' . $channel . '" does not exist');
            }

            $this->config->set('default_channel', $channel);
        }

        $chan = $reg->getChannel($channel);
        if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
            return $e;
        }

        if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
            $rest = &$this->config->getREST('1.0', array());
            $available = $rest->listAll($base, false, false, $package, $summary, $chan->getName());
        }

        if (PEAR::isError($available)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError($available);
        }

        if (!$available && !$channelinfo) {
            // clean exit when not found, no error !
            $data = 'no packages found that match pattern "' . $package . '", for channel '.$channel.'.';
            $this->ui->outputData($data);
            $this->config->set('default_channel', $channel);
            return true;
        }

        if ($channelinfo) {
            $data = array(
                'caption' => 'Matched packages, channel ' . $channel . ':',
                'border' => true,
                'headline' => array('Channel', 'Package', 'Stable/(Latest)', 'Local'),
                'channel' => $channel
                );
        } else {
            $data = array(
                'caption' => 'Matched packages, channel ' . $channel . ':',
                'border' => true,
                'headline' => array('Package', 'Stable/(Latest)', 'Local'),
                'channel' => $channel
                );
        }

        if (!$available && $channelinfo) {
            unset($data['headline']);
            $data['data'] = 'No packages found that match pattern "' . $package . '".';
            $available = array();
        }

        foreach ($available as $name => $info) {
            $installed = $reg->packageInfo($name, null, $channel);
            $desc = $info['summary'];
            if (isset($params[$name]))
                $desc .= "\n\n".$info['description'];

            if (!isset($info['stable']) || !$info['stable']) {
                $version_remote = 'none';
            } else {
                if ($info['unstable']) {
                    $version_remote = $info['unstable'];
                } else {
                    $version_remote = $info['stable'];
                }
                $version_remote .= ' ('.$info['state'].')';
            }
            $version = is_array($installed['version']) ? $installed['version']['release'] :
                $installed['version'];
            if ($channelinfo) {
                $packageinfo = array(
                    $channel,
                    $name,
                    $version_remote,
                    $version,
                    $desc,
                );
            } else {
                $packageinfo = array(
                    $name,
                    $version_remote,
                    $version,
                    $desc,
                );
            }
            $data['data'][$info['category']][] = $packageinfo;
        }

        $this->ui->outputData($data, $command);
        $this->config->set('default_channel', $channel);
        return true;
    }

    function &getDownloader($options)
    {
        if (!class_exists('PEAR_Downloader')) {
            require_once 'PEAR/Downloader.php';
        }
        $a = new PEAR_Downloader($this->ui, $options, $this->config);
        return $a;
    }

    function doDownload($command, $options, $params)
    {
        // make certain that dependencies are ignored
        $options['downloadonly'] = 1;

        // eliminate error messages for preferred_state-related errors
        /* TODO: Should be an option, but until now download does respect
           preferred state */
        /* $options['ignorepreferred_state'] = 1; */
        // eliminate error messages for preferred_state-related errors

        $downloader = &$this->getDownloader($options);
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $e = $downloader->setDownloadDir(getcwd());
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($e)) {
            return $this->raiseError('Current directory is not writeable, cannot download');
        }

        $errors = array();
        $downloaded = array();
        $err = $downloader->download($params);
        if (PEAR::isError($err)) {
            return $err;
        }

        $errors = $downloader->getErrorMsgs();
        if (count($errors)) {
            foreach ($errors as $error) {
                if ($error !== null) {
                    $this->ui->outputData($error);
                }
            }

            return $this->raiseError("$command failed");
        }

        $downloaded = $downloader->getDownloadedPackages();
        foreach ($downloaded as $pkg) {
            $this->ui->outputData("File $pkg[file] downloaded", $command);
        }

        return true;
    }

    function downloadCallback($msg, $params = null)
    {
        if ($msg == 'done') {
            $this->bytes_downloaded = $params;
        }
    }

    function doListUpgrades($command, $options, $params)
    {
        require_once 'PEAR/Common.php';
        if (isset($params[0]) && !is_array(PEAR_Common::betterStates($params[0]))) {
            return $this->raiseError($params[0] . ' is not a valid state (stable/beta/alpha/devel/etc.) try "pear help list-upgrades"');
        }

        $savechannel = $channel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        foreach ($reg->listChannels() as $channel) {
            $inst = array_flip($reg->listPackages($channel));
            if (!count($inst)) {
                continue;
            }

            if ($channel == '__uri') {
                continue;
            }

            $this->config->set('default_channel', $channel);
            $state = empty($params[0]) ? $this->config->get('preferred_state') : $params[0];

            $caption = $channel . ' Available Upgrades';
            $chan = $reg->getChannel($channel);
            if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
                return $e;
            }

            $latest = array();
            $base2  = false;
            $preferred_mirror = $this->config->get('preferred_mirror');
            if ($chan->supportsREST($preferred_mirror) &&
                (
                   ($base2 = $chan->getBaseURL('REST1.3', $preferred_mirror))
                   || ($base  = $chan->getBaseURL('REST1.0', $preferred_mirror))
                )

            ) {
                if ($base2) {
                    $rest = &$this->config->getREST('1.3', array());
                    $base = $base2;
                } else {
                    $rest = &$this->config->getREST('1.0', array());
                }

                if (empty($state) || $state == 'any') {
                    $state = false;
                } else {
                    $caption .= ' (' . implode(', ', PEAR_Common::betterStates($state, true)) . ')';
                }

                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $latest = $rest->listLatestUpgrades($base, $state, $inst, $channel, $reg);
                PEAR::staticPopErrorHandling();
            }

            if (PEAR::isError($latest)) {
                $this->ui->outputData($latest->getMessage());
                continue;
            }

            $caption .= ':';
            if (PEAR::isError($latest)) {
                $this->config->set('default_channel', $savechannel);
                return $latest;
            }

            $data = array(
                'caption' => $caption,
                'border' => 1,
                'headline' => array('Channel', 'Package', 'Local', 'Remote', 'Size'),
                'channel' => $channel
                );

            foreach ((array)$latest as $pkg => $info) {
                $package = strtolower($pkg);
                if (!isset($inst[$package])) {
                    // skip packages we don't have installed
                    continue;
                }

                extract($info);
                $inst_version = $reg->packageInfo($package, 'version', $channel);
                $inst_state   = $reg->packageInfo($package, 'release_state', $channel);
                if (version_compare("$version", "$inst_version", "le")) {
                    // installed version is up-to-date
                    continue;
                }

                if ($filesize >= 20480) {
                    $filesize += 1024 - ($filesize % 1024);
                    $fs = sprintf("%dkB", $filesize / 1024);
                } elseif ($filesize > 0) {
                    $filesize += 103 - ($filesize % 103);
                    $fs = sprintf("%.1fkB", $filesize / 1024.0);
                } else {
                    $fs = "  -"; // XXX center instead
                }

                $data['data'][] = array($channel, $pkg, "$inst_version ($inst_state)", "$version ($state)", $fs);
            }

            if (isset($options['channelinfo'])) {
                if (empty($data['data'])) {
                    unset($data['headline']);
                    if (count($inst) == 0) {
                        $data['data'] = '(no packages installed)';
                    } else {
                        $data['data'] = '(no upgrades available)';
                    }
                }
                $this->ui->outputData($data, $command);
            } else {
                if (empty($data['data'])) {
                    $this->ui->outputData('Channel ' . $channel . ': No upgrades available');
                } else {
                    $this->ui->outputData($data, $command);
                }
            }
        }

        $this->config->set('default_channel', $savechannel);
        return true;
    }

    function doClearCache($command, $options, $params)
    {
        $cache_dir = $this->config->get('cache_dir');
        $verbose   = $this->config->get('verbose');
        $output = '';
        if (!file_exists($cache_dir) || !is_dir($cache_dir)) {
            return $this->raiseError("$cache_dir does not exist or is not a directory");
        }

        if (!($dp = @opendir($cache_dir))) {
            return $this->raiseError("opendir($cache_dir) failed: $php_errormsg");
        }

        if ($verbose >= 1) {
            $output .= "reading directory $cache_dir\n";
        }

        $num = 0;
        while ($ent = readdir($dp)) {
            if (preg_match('/rest.cache(file|id)\\z/', $ent)) {
                $path = $cache_dir . DIRECTORY_SEPARATOR . $ent;
                if (file_exists($path)) {
                    $ok = @unlink($path);
                } else {
                    $ok = false;
                    $php_errormsg = '';
                }

                if ($ok) {
                    if ($verbose >= 2) {
                        $output .= "deleted $path\n";
                    }
                    $num++;
                } elseif ($verbose >= 1) {
                    $output .= "failed to delete $path $php_errormsg\n";
                }
            }
        }

        closedir($dp);
        if ($verbose >= 1) {
            $output .= "$num cache entries cleared\n";
        }

        $this->ui->outputData(rtrim($output), $command);
        return $num;
    }
}
PK�a�\݄<iipear/PEAR/Command/Mirror.xmlnu�[���<commands version="1.0">
 <download-all>
  <summary>Downloads each available package from the default channel</summary>
  <function>doDownloadAll</function>
  <shortcut>da</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>specify a channel other than the default channel</doc>
    <arg>CHAN</arg>
   </channel>
  </options>
  <doc>
Requests a list of available packages from the default channel ({config default_channel})
and downloads them to current working directory.  Note: only
packages within preferred_state ({config preferred_state}) will be downloaded</doc>
 </download-all>
</commands>PK�a�\�%q����pear/PEAR/Command/Channels.phpnu�[���<?php
// /* vim: set expandtab tabstop=4 shiftwidth=4: */
/**
 * PEAR_Command_Channels (list-channels, update-channels, channel-delete, channel-add,
 * channel-update, channel-info, channel-alias, channel-discover commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

define('PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS', -500);

/**
 * PEAR commands for managing channels.
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a1
 */
class PEAR_Command_Channels extends PEAR_Command_Common
{
    var $commands = array(
        'list-channels' => array(
            'summary' => 'List Available Channels',
            'function' => 'doList',
            'shortcut' => 'lc',
            'options' => array(),
            'doc' => '
List all available channels for installation.
',
            ),
        'update-channels' => array(
            'summary' => 'Update the Channel List',
            'function' => 'doUpdateAll',
            'shortcut' => 'uc',
            'options' => array(),
            'doc' => '
List all installed packages in all channels.
'
            ),
        'channel-delete' => array(
            'summary' => 'Remove a Channel From the List',
            'function' => 'doDelete',
            'shortcut' => 'cde',
            'options' => array(),
            'doc' => '<channel name>
Delete a channel from the registry.  You may not
remove any channel that has installed packages.
'
            ),
        'channel-add' => array(
            'summary' => 'Add a Channel',
            'function' => 'doAdd',
            'shortcut' => 'ca',
            'options' => array(),
            'doc' => '<channel.xml>
Add a private channel to the channel list.  Note that all
public channels should be synced using "update-channels".
Parameter may be either a local file or remote URL to a
channel.xml.
'
            ),
        'channel-update' => array(
            'summary' => 'Update an Existing Channel',
            'function' => 'doUpdate',
            'shortcut' => 'cu',
            'options' => array(
                'force' => array(
                    'shortopt' => 'f',
                    'doc' => 'will force download of new channel.xml if an existing channel name is used',
                    ),
                'channel' => array(
                    'shortopt' => 'c',
                    'arg' => 'CHANNEL',
                    'doc' => 'will force download of new channel.xml if an existing channel name is used',
                    ),
),
            'doc' => '[<channel.xml>|<channel name>]
Update a channel in the channel list directly.  Note that all
public channels can be synced using "update-channels".
Parameter may be a local or remote channel.xml, or the name of
an existing channel.
'
            ),
        'channel-info' => array(
            'summary' => 'Retrieve Information on a Channel',
            'function' => 'doInfo',
            'shortcut' => 'ci',
            'options' => array(),
            'doc' => '<package>
List the files in an installed package.
'
            ),
        'channel-alias' => array(
            'summary' => 'Specify an alias to a channel name',
            'function' => 'doAlias',
            'shortcut' => 'cha',
            'options' => array(),
            'doc' => '<channel> <alias>
Specify a specific alias to use for a channel name.
The alias may not be an existing channel name or
alias.
'
            ),
        'channel-discover' => array(
            'summary' => 'Initialize a Channel from its server',
            'function' => 'doDiscover',
            'shortcut' => 'di',
            'options' => array(),
            'doc' => '[<channel.xml>|<channel name>]
Initialize a channel from its server and create a local channel.xml.
If <channel name> is in the format "<username>:<password>@<channel>" then
<username> and <password> will be set as the login username/password for
<channel>. Use caution when passing the username/password in this way, as
it may allow other users on your computer to briefly view your username/
password via the system\'s process list.
'
            ),
        'channel-login' => array(
            'summary' => 'Connects and authenticates to remote channel server',
            'shortcut' => 'cli',
            'function' => 'doLogin',
            'options' => array(),
            'doc' => '<channel name>
Log in to a remote channel server.  If <channel name> is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first.  The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems).  After logging
in, your username and password will be sent along in subsequent
operations on the remote server.',
            ),
        'channel-logout' => array(
            'summary' => 'Logs out from the remote channel server',
            'shortcut' => 'clo',
            'function' => 'doLogout',
            'options' => array(),
            'doc' => '<channel name>
Logs out from a remote channel server.  If <channel name> is not supplied,
the default channel is used. This command does not actually connect to the
remote server, it only deletes the stored username and password from your user
configuration.',
            ),
        );

    /**
     * PEAR_Command_Registry constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function _sortChannels($a, $b)
    {
        return strnatcasecmp($a->getName(), $b->getName());
    }

    function doList($command, $options, $params)
    {
        $reg = &$this->config->getRegistry();
        $registered = $reg->getChannels();
        usort($registered, array(&$this, '_sortchannels'));
        $i = $j = 0;
        $data = array(
            'caption' => 'Registered Channels:',
            'border' => true,
            'headline' => array('Channel', 'Alias', 'Summary')
            );
        foreach ($registered as $channel) {
            $data['data'][] = array($channel->getName(),
                                    $channel->getAlias(),
                                    $channel->getSummary());
        }

        if (count($registered) === 0) {
            $data = '(no registered channels)';
        }
        $this->ui->outputData($data, $command);
        return true;
    }

    function doUpdateAll($command, $options, $params)
    {
        $reg = &$this->config->getRegistry();
        $channels = $reg->getChannels();

        $success = true;
        foreach ($channels as $channel) {
            if ($channel->getName() != '__uri') {
                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $err = $this->doUpdate('channel-update',
                                          $options,
                                          array($channel->getName()));
                if (PEAR::isError($err)) {
                    $this->ui->outputData($err->getMessage(), $command);
                    $success = false;
                } else {
                    $success &= $err;
                }
            }
        }
        return $success;
    }

    function doInfo($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError("No channel specified");
        }

        $reg     = &$this->config->getRegistry();
        $channel = strtolower($params[0]);
        if ($reg->channelExists($channel)) {
            $chan = $reg->getChannel($channel);
            if (PEAR::isError($chan)) {
                return $this->raiseError($chan);
            }
        } else {
            if (strpos($channel, '://')) {
                $downloader = &$this->getDownloader();
                $tmpdir = $this->config->get('temp_dir');
                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $loc = $downloader->downloadHttp($channel, $this->ui, $tmpdir);
                PEAR::staticPopErrorHandling();
                if (PEAR::isError($loc)) {
                    return $this->raiseError('Cannot open "' . $channel .
                        '" (' . $loc->getMessage() . ')');
                } else {
                    $contents = implode('', file($loc));
                }
            } else {
                if (!file_exists($params[0])) {
                    return $this->raiseError('Unknown channel "' . $channel . '"');
                }

                $fp = fopen($params[0], 'r');
                if (!$fp) {
                    return $this->raiseError('Cannot open "' . $params[0] . '"');
                }

                $contents = '';
                while (!feof($fp)) {
                    $contents .= fread($fp, 1024);
                }
                fclose($fp);
            }

            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $chan = new PEAR_ChannelFile;
            $chan->fromXmlString($contents);
            $chan->validate();
            if ($errs = $chan->getErrors(true)) {
                foreach ($errs as $err) {
                    $this->ui->outputData($err['level'] . ': ' . $err['message']);
                }
                return $this->raiseError('Channel file "' . $params[0] . '" is not valid');
            }
        }

        if (!$chan) {
            return $this->raiseError('Serious error: Channel "' . $params[0] .
                '" has a corrupted registry entry');
        }

        $channel = $chan->getName();
        $caption = 'Channel ' . $channel . ' Information:';
        $data1 = array(
            'caption' => $caption,
            'border' => true);
        $data1['data']['server'] = array('Name and Server', $chan->getName());
        if ($chan->getAlias() != $chan->getName()) {
            $data1['data']['alias'] = array('Alias', $chan->getAlias());
        }

        $data1['data']['summary'] = array('Summary', $chan->getSummary());
        $validate = $chan->getValidationPackage();
        $data1['data']['vpackage'] = array('Validation Package Name', $validate['_content']);
        $data1['data']['vpackageversion'] =
            array('Validation Package Version', $validate['attribs']['version']);
        $d = array();
        $d['main'] = $data1;

        $data['data'] = array();
        $data['caption'] = 'Server Capabilities';
        $data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base');
        if ($chan->supportsREST()) {
            if ($chan->supportsREST()) {
                $funcs = $chan->getFunctions('rest');
                if (!isset($funcs[0])) {
                    $funcs = array($funcs);
                }
                foreach ($funcs as $protocol) {
                    $data['data'][] = array('rest', $protocol['attribs']['type'],
                        $protocol['_content']);
                }
            }
        } else {
            $data['data'][] = array('No supported protocols');
        }

        $d['protocols'] = $data;
        $data['data'] = array();
        $mirrors = $chan->getMirrors();
        if ($mirrors) {
            $data['caption'] = 'Channel ' . $channel . ' Mirrors:';
            unset($data['headline']);
            foreach ($mirrors as $mirror) {
                $data['data'][] = array($mirror['attribs']['host']);
                $d['mirrors'] = $data;
            }

            foreach ($mirrors as $i => $mirror) {
                $data['data'] = array();
                $data['caption'] = 'Mirror ' . $mirror['attribs']['host'] . ' Capabilities';
                $data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base');
                if ($chan->supportsREST($mirror['attribs']['host'])) {
                    if ($chan->supportsREST($mirror['attribs']['host'])) {
                        $funcs = $chan->getFunctions('rest', $mirror['attribs']['host']);
                        if (!isset($funcs[0])) {
                            $funcs = array($funcs);
                        }

                        foreach ($funcs as $protocol) {
                            $data['data'][] = array('rest', $protocol['attribs']['type'],
                                $protocol['_content']);
                        }
                    }
                } else {
                    $data['data'][] = array('No supported protocols');
                }
                $d['mirrorprotocols' . $i] = $data;
            }
        }
        $this->ui->outputData($d, 'channel-info');
    }

    // }}}

    function doDelete($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError('channel-delete: no channel specified');
        }

        $reg = &$this->config->getRegistry();
        if (!$reg->channelExists($params[0])) {
            return $this->raiseError('channel-delete: channel "' . $params[0] . '" does not exist');
        }

        $channel = $reg->channelName($params[0]);
        if ($channel == 'pear.php.net') {
            return $this->raiseError('Cannot delete the pear.php.net channel');
        }

        if ($channel == 'pecl.php.net') {
            return $this->raiseError('Cannot delete the pecl.php.net channel');
        }

        if ($channel == 'doc.php.net') {
            return $this->raiseError('Cannot delete the doc.php.net channel');
        }

        if ($channel == '__uri') {
            return $this->raiseError('Cannot delete the __uri pseudo-channel');
        }

        if (PEAR::isError($err = $reg->listPackages($channel))) {
            return $err;
        }

        if (count($err)) {
            return $this->raiseError('Channel "' . $channel .
                '" has installed packages, cannot delete');
        }

        if (!$reg->deleteChannel($channel)) {
            return $this->raiseError('Channel "' . $channel . '" deletion failed');
        } else {
            $this->config->deleteChannel($channel);
            $this->ui->outputData('Channel "' . $channel . '" deleted', $command);
        }
    }

    function doAdd($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError('channel-add: no channel file specified');
        }

        if (strpos($params[0], '://')) {
            $downloader = &$this->getDownloader();
            $tmpdir = $this->config->get('temp_dir');
            if (!file_exists($tmpdir)) {
                require_once 'System.php';
                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $err = System::mkdir(array('-p', $tmpdir));
                PEAR::staticPopErrorHandling();
                if (PEAR::isError($err)) {
                    return $this->raiseError('channel-add: temp_dir does not exist: "' .
                        $tmpdir .
                        '" - You can change this location with "pear config-set temp_dir"');
                }
            }

            if (!is_writable($tmpdir)) {
                return $this->raiseError('channel-add: temp_dir is not writable: "' .
                    $tmpdir .
                    '" - You can change this location with "pear config-set temp_dir"');
            }

            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $loc = $downloader->downloadHttp($params[0], $this->ui, $tmpdir, null, false);
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($loc)) {
                return $this->raiseError('channel-add: Cannot open "' . $params[0] .
                    '" (' . $loc->getMessage() . ')');
            }

            list($loc, $lastmodified) = $loc;
            $contents = implode('', file($loc));
        } else {
            $lastmodified = $fp = false;
            if (file_exists($params[0])) {
                $fp = fopen($params[0], 'r');
            }

            if (!$fp) {
                return $this->raiseError('channel-add: cannot open "' . $params[0] . '"');
            }

            $contents = '';
            while (!feof($fp)) {
                $contents .= fread($fp, 1024);
            }
            fclose($fp);
        }

        if (!class_exists('PEAR_ChannelFile')) {
            require_once 'PEAR/ChannelFile.php';
        }

        $channel = new PEAR_ChannelFile;
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $result = $channel->fromXmlString($contents);
        PEAR::staticPopErrorHandling();
        if (!$result) {
            $exit = false;
            if (count($errors = $channel->getErrors(true))) {
                foreach ($errors as $error) {
                    $this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message']));
                    if (!$exit) {
                        $exit = $error['level'] == 'error' ? true : false;
                    }
                }
                if ($exit) {
                    return $this->raiseError('channel-add: invalid channel.xml file');
                }
            }
        }

        $reg = &$this->config->getRegistry();
        if ($reg->channelExists($channel->getName())) {
            return $this->raiseError('channel-add: Channel "' . $channel->getName() .
                '" exists, use channel-update to update entry', PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS);
        }

        $ret = $reg->addChannel($channel, $lastmodified);
        if (PEAR::isError($ret)) {
            return $ret;
        }

        if (!$ret) {
            return $this->raiseError('channel-add: adding Channel "' . $channel->getName() .
                '" to registry failed');
        }

        $this->config->setChannels($reg->listChannels());
        $this->config->writeConfigFile();
        $this->ui->outputData('Adding Channel "' . $channel->getName() . '" succeeded', $command);
    }

    function doUpdate($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError("No channel file specified");
        }

        $tmpdir = $this->config->get('temp_dir');
        if (!file_exists($tmpdir)) {
            require_once 'System.php';
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $err = System::mkdir(array('-p', $tmpdir));
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($err)) {
                return $this->raiseError('channel-add: temp_dir does not exist: "' .
                    $tmpdir .
                    '" - You can change this location with "pear config-set temp_dir"');
            }
        }

        if (!is_writable($tmpdir)) {
            return $this->raiseError('channel-add: temp_dir is not writable: "' .
                $tmpdir .
                '" - You can change this location with "pear config-set temp_dir"');
        }

        $reg = &$this->config->getRegistry();
        $lastmodified = false;
        if ((!file_exists($params[0]) || is_dir($params[0]))
              && $reg->channelExists(strtolower($params[0]))) {
            $c = $reg->getChannel(strtolower($params[0]));
            if (PEAR::isError($c)) {
                return $this->raiseError($c);
            }

            $this->ui->outputData("Updating channel \"$params[0]\"", $command);
            $dl = &$this->getDownloader(array());
            // if force is specified, use a timestamp of "1" to force retrieval
            $lastmodified = isset($options['force']) ? false : $c->lastModified();
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $contents = $dl->downloadHttp('http://' . $c->getName() . '/channel.xml',
                $this->ui, $tmpdir, null, $lastmodified);
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($contents)) {
                // Attempt to fall back to https
                $this->ui->outputData("Channel \"$params[0]\" is not responding over http://, failed with message: " . $contents->getMessage());
                $this->ui->outputData("Trying channel \"$params[0]\" over https:// instead");
                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $contents = $dl->downloadHttp('https://' . $c->getName() . '/channel.xml',
                    $this->ui, $tmpdir, null, $lastmodified);
                PEAR::staticPopErrorHandling();
                if (PEAR::isError($contents)) {
                    return $this->raiseError('Cannot retrieve channel.xml for channel "' .
                        $c->getName() . '" (' . $contents->getMessage() . ')');
                }
            }

            list($contents, $lastmodified) = $contents;
            if (!$contents) {
                $this->ui->outputData("Channel \"$params[0]\" is up to date");
                return;
            }

            $contents = implode('', file($contents));
            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $channel = new PEAR_ChannelFile;
            $channel->fromXmlString($contents);
            if (!$channel->getErrors()) {
                // security check: is the downloaded file for the channel we got it from?
                if (strtolower($channel->getName()) != strtolower($c->getName())) {
                    if (!isset($options['force'])) {
                        return $this->raiseError('ERROR: downloaded channel definition file' .
                            ' for channel "' . $channel->getName() . '" from channel "' .
                            strtolower($c->getName()) . '"');
                    }

                    $this->ui->log(0, 'WARNING: downloaded channel definition file' .
                        ' for channel "' . $channel->getName() . '" from channel "' .
                        strtolower($c->getName()) . '"');
                }
            }
        } else {
            if (strpos($params[0], '://')) {
                $dl = &$this->getDownloader();
                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                $loc = $dl->downloadHttp($params[0],
                    $this->ui, $tmpdir, null, $lastmodified);
                PEAR::staticPopErrorHandling();
                if (PEAR::isError($loc)) {
                    return $this->raiseError("Cannot open " . $params[0] .
                         ' (' . $loc->getMessage() . ')');
                }

                list($loc, $lastmodified) = $loc;
                $contents = implode('', file($loc));
            } else {
                $fp = false;
                if (file_exists($params[0])) {
                    $fp = fopen($params[0], 'r');
                }

                if (!$fp) {
                    return $this->raiseError("Cannot open " . $params[0]);
                }

                $contents = '';
                while (!feof($fp)) {
                    $contents .= fread($fp, 1024);
                }
                fclose($fp);
            }

            if (!class_exists('PEAR_ChannelFile')) {
                require_once 'PEAR/ChannelFile.php';
            }

            $channel = new PEAR_ChannelFile;
            $channel->fromXmlString($contents);
        }

        $exit = false;
        if (count($errors = $channel->getErrors(true))) {
            foreach ($errors as $error) {
                $this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message']));
                if (!$exit) {
                    $exit = $error['level'] == 'error' ? true : false;
                }
            }
            if ($exit) {
                return $this->raiseError('Invalid channel.xml file');
            }
        }

        if (!$reg->channelExists($channel->getName())) {
            return $this->raiseError('Error: Channel "' . $channel->getName() .
                '" does not exist, use channel-add to add an entry');
        }

        $ret = $reg->updateChannel($channel, $lastmodified);
        if (PEAR::isError($ret)) {
            return $ret;
        }

        if (!$ret) {
            return $this->raiseError('Updating Channel "' . $channel->getName() .
                '" in registry failed');
        }

        $this->config->setChannels($reg->listChannels());
        $this->config->writeConfigFile();
        $this->ui->outputData('Update of Channel "' . $channel->getName() . '" succeeded');
    }

    function &getDownloader()
    {
        if (!class_exists('PEAR_Downloader')) {
            require_once 'PEAR/Downloader.php';
        }
        $a = new PEAR_Downloader($this->ui, array(), $this->config);
        return $a;
    }

    function doAlias($command, $options, $params)
    {
        if (count($params) === 1) {
            return $this->raiseError('No channel alias specified');
        }

        if (count($params) !== 2 || (!empty($params[1]) && $params[1][0] == '-')) {
            return $this->raiseError(
                'Invalid format, correct is: channel-alias channel alias');
        }

        $reg = &$this->config->getRegistry();
        if (!$reg->channelExists($params[0], true)) {
            $extra = '';
            if ($reg->isAlias($params[0])) {
                $extra = ' (use "channel-alias ' . $reg->channelName($params[0]) . ' ' .
                    strtolower($params[1]) . '")';
            }

            return $this->raiseError('"' . $params[0] . '" is not a valid channel' . $extra);
        }

        if ($reg->isAlias($params[1])) {
            return $this->raiseError('Channel "' . $reg->channelName($params[1]) . '" is ' .
                'already aliased to "' . strtolower($params[1]) . '", cannot re-alias');
        }

        $chan = $reg->getChannel($params[0]);
        if (PEAR::isError($chan)) {
            return $this->raiseError('Corrupt registry?  Error retrieving channel "' . $params[0] .
                '" information (' . $chan->getMessage() . ')');
        }

        // make it a local alias
        if (!$chan->setAlias(strtolower($params[1]), true)) {
            return $this->raiseError('Alias "' . strtolower($params[1]) .
                '" is not a valid channel alias');
        }

        $reg->updateChannel($chan);
        $this->ui->outputData('Channel "' . $chan->getName() . '" aliased successfully to "' .
            strtolower($params[1]) . '"');
    }

    /**
     * The channel-discover command
     *
     * @param string $command command name
     * @param array  $options option_name => value
     * @param array  $params  list of additional parameters.
     *               $params[0] should contain a string with either:
     *               - <channel name> or
     *               - <username>:<password>@<channel name>
     * @return null|PEAR_Error
     */
    function doDiscover($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError("No channel server specified");
        }

        // Look for the possible input format "<username>:<password>@<channel>"
        if (preg_match('/^(.+):(.+)@(.+)\\z/', $params[0], $matches)) {
            $username = $matches[1];
            $password = $matches[2];
            $channel  = $matches[3];
        } else {
            $channel = $params[0];
        }

        $reg = &$this->config->getRegistry();
        if ($reg->channelExists($channel)) {
            if (!$reg->isAlias($channel)) {
                return $this->raiseError("Channel \"$channel\" is already initialized", PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS);
            }

            return $this->raiseError("A channel alias named \"$channel\" " .
                'already exists, aliasing channel "' . $reg->channelName($channel)
                . '"');
        }

        $this->pushErrorHandling(PEAR_ERROR_RETURN);
        $err = $this->doAdd($command, $options, array('http://' . $channel . '/channel.xml'));
        $this->popErrorHandling();
        if (PEAR::isError($err)) {
            if ($err->getCode() === PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS) {
                return $this->raiseError("Discovery of channel \"$channel\" failed (" .
                    $err->getMessage() . ')');
            }
            // Attempt fetch via https
            $this->ui->outputData("Discovering channel $channel over http:// failed with message: " . $err->getMessage());
            $this->ui->outputData("Trying to discover channel $channel over https:// instead");
            $this->pushErrorHandling(PEAR_ERROR_RETURN);
            $err = $this->doAdd($command, $options, array('https://' . $channel . '/channel.xml'));
            $this->popErrorHandling();
            if (PEAR::isError($err)) {
                return $this->raiseError("Discovery of channel \"$channel\" failed (" .
                    $err->getMessage() . ')');
            }
        }

        // Store username/password if they were given
        // Arguably we should do a logintest on the channel here, but since
        // that's awkward on a REST-based channel (even "pear login" doesn't
        // do it for those), and XML-RPC is deprecated, it's fairly pointless.
        if (isset($username)) {
            $this->config->set('username', $username, 'user', $channel);
            $this->config->set('password', $password, 'user', $channel);
            $this->config->store();
            $this->ui->outputData("Stored login for channel \"$channel\" using username \"$username\"", $command);
        }

        $this->ui->outputData("Discovery of channel \"$channel\" succeeded", $command);
    }

    /**
     * Execute the 'login' command.
     *
     * @param string $command command name
     * @param array $options option_name => value
     * @param array $params list of additional parameters
     *
     * @return bool TRUE on success or
     * a PEAR error on failure
     *
     * @access public
     */
    function doLogin($command, $options, $params)
    {
        $reg = &$this->config->getRegistry();

        // If a parameter is supplied, use that as the channel to log in to
        $channel = isset($params[0]) ? $params[0] : $this->config->get('default_channel');

        $chan = $reg->getChannel($channel);
        if (PEAR::isError($chan)) {
            return $this->raiseError($chan);
        }

        $server   = $this->config->get('preferred_mirror', null, $channel);
        $username = $this->config->get('username',         null, $channel);
        if (empty($username)) {
            $username = isset($_ENV['USER']) ? $_ENV['USER'] : null;
        }
        $this->ui->outputData("Logging in to $server.", $command);

        list($username, $password) = $this->ui->userDialog(
            $command,
            array('Username', 'Password'),
            array('text',     'password'),
            array($username,  '')
            );
        $username = trim($username);
        $password = trim($password);

        $ourfile = $this->config->getConfFile('user');
        if (!$ourfile) {
            $ourfile = $this->config->getConfFile('system');
        }

        $this->config->set('username', $username, 'user', $channel);
        $this->config->set('password', $password, 'user', $channel);

        if ($chan->supportsREST()) {
            $ok = true;
        }

        if ($ok !== true) {
            return $this->raiseError('Login failed!');
        }

        $this->ui->outputData("Logged in.", $command);
        // avoid changing any temporary settings changed with -d
        $ourconfig = new PEAR_Config($ourfile, $ourfile);
        $ourconfig->set('username', $username, 'user', $channel);
        $ourconfig->set('password', $password, 'user', $channel);
        $ourconfig->store();

        return true;
    }

    /**
     * Execute the 'logout' command.
     *
     * @param string $command command name
     * @param array $options option_name => value
     * @param array $params list of additional parameters
     *
     * @return bool TRUE on success or
     * a PEAR error on failure
     *
     * @access public
     */
    function doLogout($command, $options, $params)
    {
        $reg     = &$this->config->getRegistry();

        // If a parameter is supplied, use that as the channel to log in to
        $channel = isset($params[0]) ? $params[0] : $this->config->get('default_channel');

        $chan    = $reg->getChannel($channel);
        if (PEAR::isError($chan)) {
            return $this->raiseError($chan);
        }

        $server = $this->config->get('preferred_mirror', null, $channel);
        $this->ui->outputData("Logging out from $server.", $command);
        $this->config->remove('username', 'user', $channel);
        $this->config->remove('password', 'user', $channel);
        $this->config->store();
        return true;
    }
}
PK�a�\
�\���pear/PEAR/Command/Remote.xmlnu�[���<commands version="1.0">
 <remote-info>
  <summary>Information About Remote Packages</summary>
  <function>doRemoteInfo</function>
  <shortcut>ri</shortcut>
  <options />
  <doc>&lt;package&gt;
Get details on a package from the server.</doc>
 </remote-info>
 <list-upgrades>
  <summary>List Available Upgrades</summary>
  <function>doListUpgrades</function>
  <shortcut>lu</shortcut>
  <options>
   <channelinfo>
    <shortopt>i</shortopt>
    <doc>output fully channel-aware data, even on failure</doc>
   </channelinfo>
  </options>
  <doc>[preferred_state]
List releases on the server of packages you have installed where
a newer version is available with the same release state (stable etc.)
or the state passed as the second parameter.</doc>
 </list-upgrades>
 <remote-list>
  <summary>List Remote Packages</summary>
  <function>doRemoteList</function>
  <shortcut>rl</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>specify a channel other than the default channel</doc>
    <arg>CHAN</arg>
   </channel>
  </options>
  <doc>
Lists the packages available on the configured server along with the
latest stable release of each package.</doc>
 </remote-list>
 <search>
  <summary>Search remote package database</summary>
  <function>doSearch</function>
  <shortcut>sp</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>specify a channel other than the default channel</doc>
    <arg>CHAN</arg>
   </channel>
   <allchannels>
    <shortopt>a</shortopt>
    <doc>search packages from all known channels</doc>
   </allchannels>
   <channelinfo>
    <shortopt>i</shortopt>
    <doc>output fully channel-aware data, even on failure</doc>
   </channelinfo>
  </options>
  <doc>[packagename] [packageinfo]
Lists all packages which match the search parameters.  The first
parameter is a fragment of a packagename.  The default channel
will be used unless explicitly overridden.  The second parameter
will be used to match any portion of the summary/description</doc>
 </search>
 <list-all>
  <summary>List All Packages</summary>
  <function>doListAll</function>
  <shortcut>la</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>specify a channel other than the default channel</doc>
    <arg>CHAN</arg>
   </channel>
   <channelinfo>
    <shortopt>i</shortopt>
    <doc>output fully channel-aware data, even on failure</doc>
   </channelinfo>
  </options>
  <doc>
Lists the packages available on the configured server along with the
latest stable release of each package.</doc>
 </list-all>
 <download>
  <summary>Download Package</summary>
  <function>doDownload</function>
  <shortcut>d</shortcut>
  <options>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>download an uncompressed (.tar) file</doc>
   </nocompress>
  </options>
  <doc>&lt;package&gt;...
Download package tarballs.  The files will be named as suggested by the
server, for example if you download the DB package and the latest stable
version of DB is 1.6.5, the downloaded file will be DB-1.6.5.tgz.</doc>
 </download>
 <clear-cache>
  <summary>Clear Web Services Cache</summary>
  <function>doClearCache</function>
  <shortcut>cc</shortcut>
  <options />
  <doc>
Clear the XML-RPC/REST cache.  See also the cache_ttl configuration
parameter.
</doc>
 </clear-cache>
</commands>PK�a�\���u��pear/PEAR/Command/Registry.xmlnu�[���<commands version="1.0">
 <list>
  <summary>List Installed Packages In The Default Channel</summary>
  <function>doList</function>
  <shortcut>l</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>list installed packages from this channel</doc>
    <arg>CHAN</arg>
   </channel>
   <allchannels>
    <shortopt>a</shortopt>
    <doc>list installed packages from all channels</doc>
   </allchannels>
   <channelinfo>
    <shortopt>i</shortopt>
    <doc>output fully channel-aware data, even on failure</doc>
   </channelinfo>
  </options>
  <doc>&lt;package&gt;
If invoked without parameters, this command lists the PEAR packages
installed in your php_dir ({config php_dir}).  With a parameter, it
lists the files in a package.
</doc>
 </list>
 <list-files>
  <summary>List Files In Installed Package</summary>
  <function>doFileList</function>
  <shortcut>fl</shortcut>
  <options />
  <doc>&lt;package&gt;
List the files in an installed package.
</doc>
 </list-files>
 <shell-test>
  <summary>Shell Script Test</summary>
  <function>doShellTest</function>
  <shortcut>st</shortcut>
  <options />
  <doc>&lt;package&gt; [[relation] version]
Tests if a package is installed in the system. Will exit(1) if it is not.
   &lt;relation&gt;   The version comparison operator. One of:
                &lt;, lt, &lt;=, le, &gt;, gt, &gt;=, ge, ==, =, eq, !=, &lt;&gt;, ne
   &lt;version&gt;    The version to compare with
</doc>
 </shell-test>
 <info>
  <summary>Display information about a package</summary>
  <function>doInfo</function>
  <shortcut>in</shortcut>
  <options />
  <doc>&lt;package&gt;
Displays information about a package. The package argument may be a
local package file, an URL to a package file, or the name of an
installed package.</doc>
 </info>
</commands>PK�a�\nmi?;�;�pear/PEAR/Command/Install.phpnu�[���<?php
/**
 * PEAR_Command_Install (install, upgrade, upgrade-all, uninstall, bundle, run-scripts commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for installation or deinstallation/upgrading of
 * packages.
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Install extends PEAR_Command_Common
{
    // {{{ properties

    var $commands = array(
        'install' => array(
            'summary' => 'Install Package',
            'function' => 'doInstall',
            'shortcut' => 'i',
            'options' => array(
                'force' => array(
                    'shortopt' => 'f',
                    'doc' => 'will overwrite newer installed packages',
                    ),
                'loose' => array(
                    'shortopt' => 'l',
                    'doc' => 'do not check for recommended dependency version',
                    ),
                'nodeps' => array(
                    'shortopt' => 'n',
                    'doc' => 'ignore dependencies, install anyway',
                    ),
                'register-only' => array(
                    'shortopt' => 'r',
                    'doc' => 'do not install files, only register the package as installed',
                    ),
                'soft' => array(
                    'shortopt' => 's',
                    'doc' => 'soft install, fail silently, or upgrade if already installed',
                    ),
                'nobuild' => array(
                    'shortopt' => 'B',
                    'doc' => 'don\'t build C extensions',
                    ),
                'configureoptions' => array(
                    'shortopt' => 'D',
                    'arg' => 'OPTION1=VALUE[ OPTION2=VALUE]',
                    'doc' => 'space-delimited list of configure options',
                    ),
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'request uncompressed files when downloading',
                    ),
                'installroot' => array(
                    'shortopt' => 'R',
                    'arg' => 'DIR',
                    'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT), use packagingroot for RPM',
                    ),
                'packagingroot' => array(
                    'shortopt' => 'P',
                    'arg' => 'DIR',
                    'doc' => 'root directory used when packaging files, like RPM packaging',
                    ),
                'ignore-errors' => array(
                    'doc' => 'force install even if there were errors',
                    ),
                'alldeps' => array(
                    'shortopt' => 'a',
                    'doc' => 'install all required and optional dependencies',
                    ),
                'onlyreqdeps' => array(
                    'shortopt' => 'o',
                    'doc' => 'install all required dependencies',
                    ),
                'offline' => array(
                    'shortopt' => 'O',
                    'doc' => 'do not attempt to download any urls or contact channels',
                    ),
                'pretend' => array(
                    'shortopt' => 'p',
                    'doc' => 'Only list the packages that would be downloaded',
                    ),
                ),
            'doc' => '[channel/]<package> ...
Installs one or more PEAR packages.  You can specify a package to
install in four ways:

"Package-1.0.tgz" : installs from a local file

"http://example.com/Package-1.0.tgz" : installs from
anywhere on the net.

"package.xml" : installs the package described in
package.xml.  Useful for testing, or for wrapping a PEAR package in
another package manager such as RPM.

"Package[-version/state][.tar]" : queries your default channel\'s server
({config master_server}) and downloads the newest package with
the preferred quality/state ({config preferred_state}).

To retrieve Package version 1.1, use "Package-1.1," to retrieve
Package state beta, use "Package-beta."  To retrieve an uncompressed
file, append .tar (make sure there is no file by the same name first)

To download a package from another channel, prefix with the channel name like
"channel/Package"

More than one package may be specified at once.  It is ok to mix these
four ways of specifying packages.
'),
        'upgrade' => array(
            'summary' => 'Upgrade Package',
            'function' => 'doInstall',
            'shortcut' => 'up',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'upgrade packages from a specific channel',
                    'arg' => 'CHAN',
                    ),
                'force' => array(
                    'shortopt' => 'f',
                    'doc' => 'overwrite newer installed packages',
                    ),
                'loose' => array(
                    'shortopt' => 'l',
                    'doc' => 'do not check for recommended dependency version',
                    ),
                'nodeps' => array(
                    'shortopt' => 'n',
                    'doc' => 'ignore dependencies, upgrade anyway',
                    ),
                'register-only' => array(
                    'shortopt' => 'r',
                    'doc' => 'do not install files, only register the package as upgraded',
                    ),
                'nobuild' => array(
                    'shortopt' => 'B',
                    'doc' => 'don\'t build C extensions',
                    ),
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'request uncompressed files when downloading',
                    ),
                'installroot' => array(
                    'shortopt' => 'R',
                    'arg' => 'DIR',
                    'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)',
                    ),
                'ignore-errors' => array(
                    'doc' => 'force install even if there were errors',
                    ),
                'alldeps' => array(
                    'shortopt' => 'a',
                    'doc' => 'install all required and optional dependencies',
                    ),
                'onlyreqdeps' => array(
                    'shortopt' => 'o',
                    'doc' => 'install all required dependencies',
                    ),
                'offline' => array(
                    'shortopt' => 'O',
                    'doc' => 'do not attempt to download any urls or contact channels',
                    ),
                'pretend' => array(
                    'shortopt' => 'p',
                    'doc' => 'Only list the packages that would be downloaded',
                    ),
                ),
            'doc' => '<package> ...
Upgrades one or more PEAR packages.  See documentation for the
"install" command for ways to specify a package.

When upgrading, your package will be updated if the provided new
package has a higher version number (use the -f option if you need to
upgrade anyway).

More than one package may be specified at once.
'),
        'upgrade-all' => array(
            'summary' => 'Upgrade All Packages [Deprecated in favor of calling upgrade with no parameters]',
            'function' => 'doUpgradeAll',
            'shortcut' => 'ua',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'upgrade packages from a specific channel',
                    'arg' => 'CHAN',
                    ),
                'nodeps' => array(
                    'shortopt' => 'n',
                    'doc' => 'ignore dependencies, upgrade anyway',
                    ),
                'register-only' => array(
                    'shortopt' => 'r',
                    'doc' => 'do not install files, only register the package as upgraded',
                    ),
                'nobuild' => array(
                    'shortopt' => 'B',
                    'doc' => 'don\'t build C extensions',
                    ),
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'request uncompressed files when downloading',
                    ),
                'installroot' => array(
                    'shortopt' => 'R',
                    'arg' => 'DIR',
                    'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT), use packagingroot for RPM',
                    ),
                'ignore-errors' => array(
                    'doc' => 'force install even if there were errors',
                    ),
                'loose' => array(
                    'doc' => 'do not check for recommended dependency version',
                    ),
                ),
            'doc' => '
WARNING: This function is deprecated in favor of using the upgrade command with no params

Upgrades all packages that have a newer release available.  Upgrades are
done only if there is a release available of the state specified in
"preferred_state" (currently {config preferred_state}), or a state considered
more stable.
'),
        'uninstall' => array(
            'summary' => 'Un-install Package',
            'function' => 'doUninstall',
            'shortcut' => 'un',
            'options' => array(
                'nodeps' => array(
                    'shortopt' => 'n',
                    'doc' => 'ignore dependencies, uninstall anyway',
                    ),
                'register-only' => array(
                    'shortopt' => 'r',
                    'doc' => 'do not remove files, only register the packages as not installed',
                    ),
                'installroot' => array(
                    'shortopt' => 'R',
                    'arg' => 'DIR',
                    'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)',
                    ),
                'ignore-errors' => array(
                    'doc' => 'force install even if there were errors',
                    ),
                'offline' => array(
                    'shortopt' => 'O',
                    'doc' => 'do not attempt to uninstall remotely',
                    ),
                ),
            'doc' => '[channel/]<package> ...
Uninstalls one or more PEAR packages.  More than one package may be
specified at once.  Prefix with channel name to uninstall from a
channel not in your default channel ({config default_channel})
'),
        'bundle' => array(
            'summary' => 'Unpacks a Pecl Package',
            'function' => 'doBundle',
            'shortcut' => 'bun',
            'options' => array(
                'destination' => array(
                   'shortopt' => 'd',
                    'arg' => 'DIR',
                    'doc' => 'Optional destination directory for unpacking (defaults to current path or "ext" if exists)',
                    ),
                'force' => array(
                    'shortopt' => 'f',
                    'doc' => 'Force the unpacking even if there were errors in the package',
                ),
            ),
            'doc' => '<package>
Unpacks a Pecl Package into the selected location. It will download the
package if needed.
'),
        'run-scripts' => array(
            'summary' => 'Run Post-Install Scripts bundled with a package',
            'function' => 'doRunScripts',
            'shortcut' => 'rs',
            'options' => array(
            ),
            'doc' => '<package>
Run post-installation scripts in package <package>, if any exist.
'),
    );

    // }}}
    // {{{ constructor

    /**
     * PEAR_Command_Install constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    // }}}

    /**
     * For unit testing purposes
     */
    function &getDownloader(&$ui, $options, &$config)
    {
        if (!class_exists('PEAR_Downloader')) {
            require_once 'PEAR/Downloader.php';
        }
        $a = new PEAR_Downloader($ui, $options, $config);
        return $a;
    }

    /**
     * For unit testing purposes
     */
    function &getInstaller(&$ui)
    {
        if (!class_exists('PEAR_Installer')) {
            require_once 'PEAR/Installer.php';
        }
        $a = new PEAR_Installer($ui);
        return $a;
    }

    function enableExtension($binaries, $type)
    {
        if (!($phpini = $this->config->get('php_ini', null, 'pear.php.net'))) {
            return PEAR::raiseError('configuration option "php_ini" is not set to php.ini location');
        }
        $ini = $this->_parseIni($phpini);
        if (PEAR::isError($ini)) {
            return $ini;
        }
        $line = 0;
        if ($type == 'extsrc' || $type == 'extbin') {
            $search = 'extensions';
            $enable = 'extension';
        } else {
            $search = 'zend_extensions';
            ob_start();
            phpinfo(INFO_GENERAL);
            $info = ob_get_contents();
            ob_end_clean();
            $debug = function_exists('leak') ? '_debug' : '';
            $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : '';
            $enable = 'zend_extension' . $debug . $ts;
        }
        foreach ($ini[$search] as $line => $extension) {
            if (in_array($extension, $binaries, true) || in_array(
                  $ini['extension_dir'] . DIRECTORY_SEPARATOR . $extension, $binaries, true)) {
                // already enabled - assume if one is, all are
                return true;
            }
        }
        if ($line) {
            $newini = array_slice($ini['all'], 0, $line);
        } else {
            $newini = array();
        }
        foreach ($binaries as $binary) {
            if ($ini['extension_dir']) {
                $binary = basename($binary);
            }
            $newini[] = $enable . '="' . $binary . '"' . (OS_UNIX ? "\n" : "\r\n");
        }
        $newini = array_merge($newini, array_slice($ini['all'], $line));
        $fp = @fopen($phpini, 'wb');
        if (!$fp) {
            return PEAR::raiseError('cannot open php.ini "' . $phpini . '" for writing');
        }
        foreach ($newini as $line) {
            fwrite($fp, $line);
        }
        fclose($fp);
        return true;
    }

    function disableExtension($binaries, $type)
    {
        if (!($phpini = $this->config->get('php_ini', null, 'pear.php.net'))) {
            return PEAR::raiseError('configuration option "php_ini" is not set to php.ini location');
        }
        $ini = $this->_parseIni($phpini);
        if (PEAR::isError($ini)) {
            return $ini;
        }
        $line = 0;
        if ($type == 'extsrc' || $type == 'extbin') {
            $search = 'extensions';
            $enable = 'extension';
        } else {
            $search = 'zend_extensions';
            ob_start();
            phpinfo(INFO_GENERAL);
            $info = ob_get_contents();
            ob_end_clean();
            $debug = function_exists('leak') ? '_debug' : '';
            $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : '';
            $enable = 'zend_extension' . $debug . $ts;
        }
        $found = false;
        foreach ($ini[$search] as $line => $extension) {
            if (in_array($extension, $binaries, true) || in_array(
                  $ini['extension_dir'] . DIRECTORY_SEPARATOR . $extension, $binaries, true)) {
                $found = true;
                break;
            }
        }
        if (!$found) {
            // not enabled
            return true;
        }
        $fp = @fopen($phpini, 'wb');
        if (!$fp) {
            return PEAR::raiseError('cannot open php.ini "' . $phpini . '" for writing');
        }
        if ($line) {
            $newini = array_slice($ini['all'], 0, $line);
            // delete the enable line
            $newini = array_merge($newini, array_slice($ini['all'], $line + 1));
        } else {
            $newini = array_slice($ini['all'], 1);
        }
        foreach ($newini as $line) {
            fwrite($fp, $line);
        }
        fclose($fp);
        return true;
    }

    function _parseIni($filename)
    {
        if (!file_exists($filename)) {
            return PEAR::raiseError('php.ini "' . $filename . '" does not exist');
        }

        if (filesize($filename) > 300000) {
            return PEAR::raiseError('php.ini "' . $filename . '" is too large, aborting');
        }

        ob_start();
        phpinfo(INFO_GENERAL);
        $info = ob_get_contents();
        ob_end_clean();
        $debug = function_exists('leak') ? '_debug' : '';
        $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : '';
        $zend_extension_line = 'zend_extension' . $debug . $ts;
        $all = @file($filename);
        if ($all === false) {
            return PEAR::raiseError('php.ini "' . $filename .'" could not be read');
        }
        $zend_extensions = $extensions = array();
        // assume this is right, but pull from the php.ini if it is found
        $extension_dir = ini_get('extension_dir');
        foreach ($all as $linenum => $line) {
            $line = trim($line);
            if (!$line) {
                continue;
            }
            if ($line[0] == ';') {
                continue;
            }
            if (strtolower(substr($line, 0, 13)) == 'extension_dir') {
                $line = trim(substr($line, 13));
                if ($line[0] == '=') {
                    $x = trim(substr($line, 1));
                    $x = explode(';', $x);
                    $extension_dir = str_replace('"', '', array_shift($x));
                    continue;
                }
            }
            if (strtolower(substr($line, 0, 9)) == 'extension') {
                $line = trim(substr($line, 9));
                if ($line[0] == '=') {
                    $x = trim(substr($line, 1));
                    $x = explode(';', $x);
                    $extensions[$linenum] = str_replace('"', '', array_shift($x));
                    continue;
                }
            }
            if (strtolower(substr($line, 0, strlen($zend_extension_line))) ==
                  $zend_extension_line) {
                $line = trim(substr($line, strlen($zend_extension_line)));
                if ($line[0] == '=') {
                    $x = trim(substr($line, 1));
                    $x = explode(';', $x);
                    $zend_extensions[$linenum] = str_replace('"', '', array_shift($x));
                    continue;
                }
            }
        }
        return array(
            'extensions' => $extensions,
            'zend_extensions' => $zend_extensions,
            'extension_dir' => $extension_dir,
            'all' => $all,
        );
    }

    // {{{ doInstall()

    function doInstall($command, $options, $params)
    {
        if (!class_exists('PEAR_PackageFile')) {
            require_once 'PEAR/PackageFile.php';
        }

        if (isset($options['installroot']) && isset($options['packagingroot'])) {
            return $this->raiseError('ERROR: cannot use both --installroot and --packagingroot');
        }

        $reg = &$this->config->getRegistry();
        $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel');
        if (!$reg->channelExists($channel)) {
            return $this->raiseError('Channel "' . $channel . '" does not exist');
        }

        if (empty($this->installer)) {
            $this->installer = &$this->getInstaller($this->ui);
        }

        if ($command == 'upgrade' || $command == 'upgrade-all') {
            // If people run the upgrade command but pass nothing, emulate a upgrade-all
            if ($command == 'upgrade' && empty($params)) {
                return $this->doUpgradeAll($command, $options, $params);
            }
            $options['upgrade'] = true;
        } else {
            $packages = $params;
        }

        $instreg = &$reg; // instreg used to check if package is installed
        if (isset($options['packagingroot']) && !isset($options['upgrade'])) {
            $packrootphp_dir = $this->installer->_prependPath(
                $this->config->get('php_dir', null, 'pear.php.net'),
                $options['packagingroot']);
            $metadata_dir = $this->config->get('metadata_dir', null, 'pear.php.net');
            if ($metadata_dir) {
                $metadata_dir = $this->installer->_prependPath(
                    $metadata_dir,
                    $options['packagingroot']);
            }
            $instreg = new PEAR_Registry($packrootphp_dir, false, false, $metadata_dir); // other instreg!

            if ($this->config->get('verbose') > 2) {
                $this->ui->outputData('using package root: ' . $options['packagingroot']);
            }
        }

        $abstractpackages = $otherpackages = array();
        // parse params
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);

        foreach ($params as $param) {
            if (strpos($param, 'http://') === 0) {
                $otherpackages[] = $param;
                continue;
            }

            if (strpos($param, 'channel://') === false && @file_exists($param)) {
                if (isset($options['force'])) {
                    $otherpackages[] = $param;
                    continue;
                }

                $pkg = new PEAR_PackageFile($this->config);
                $pf  = $pkg->fromAnyFile($param, PEAR_VALIDATE_DOWNLOADING);
                if (PEAR::isError($pf)) {
                    $otherpackages[] = $param;
                    continue;
                }

                $exists   = $reg->packageExists($pf->getPackage(), $pf->getChannel());
                $pversion = $reg->packageInfo($pf->getPackage(), 'version', $pf->getChannel());
                $version_compare = version_compare($pf->getVersion(), $pversion, '<=');
                if ($exists && $version_compare) {
                    if ($this->config->get('verbose')) {
                        $this->ui->outputData('Ignoring installed package ' .
                            $reg->parsedPackageNameToString(
                            array('package' => $pf->getPackage(),
                                  'channel' => $pf->getChannel()), true));
                    }
                    continue;
                }
                $otherpackages[] = $param;
                continue;
            }

            $e = $reg->parsePackageName($param, $channel);
            if (PEAR::isError($e)) {
                $otherpackages[] = $param;
            } else {
                $abstractpackages[] = $e;
            }
        }
        PEAR::staticPopErrorHandling();

        // if there are any local package .tgz or remote static url, we can't
        // filter.  The filter only works for abstract packages
        if (count($abstractpackages) && !isset($options['force'])) {
            // when not being forced, only do necessary upgrades/installs
            if (isset($options['upgrade'])) {
                $abstractpackages = $this->_filterUptodatePackages($abstractpackages, $command);
            } else {
                $count = count($abstractpackages);
                foreach ($abstractpackages as $i => $package) {
                    if (isset($package['group'])) {
                        // do not filter out install groups
                        continue;
                    }

                    if ($instreg->packageExists($package['package'], $package['channel'])) {
                        if ($count > 1) {
                            if ($this->config->get('verbose')) {
                                $this->ui->outputData('Ignoring installed package ' .
                                    $reg->parsedPackageNameToString($package, true));
                            }
                            unset($abstractpackages[$i]);
                        } elseif ($count === 1) {
                            // Lets try to upgrade it since it's already installed
                            $options['upgrade'] = true;
                        }
                    }
                }
            }
            $abstractpackages =
                array_map(array($reg, 'parsedPackageNameToString'), $abstractpackages);
        } elseif (count($abstractpackages)) {
            $abstractpackages =
                array_map(array($reg, 'parsedPackageNameToString'), $abstractpackages);
        }

        $packages = array_merge($abstractpackages, $otherpackages);
        if (!count($packages)) {
            $c = '';
            if (isset($options['channel'])){
                $c .= ' in channel "' . $options['channel'] . '"';
            }
            $this->ui->outputData('Nothing to ' . $command . $c);
            return true;
        }

        $this->downloader = &$this->getDownloader($this->ui, $options, $this->config);
        $errors = $downloaded = $binaries = array();
        $downloaded = &$this->downloader->download($packages);
        if (PEAR::isError($downloaded)) {
            return $this->raiseError($downloaded);
        }

        $errors = $this->downloader->getErrorMsgs();
        if (count($errors)) {
            $err = array();
            $err['data'] = array();
            foreach ($errors as $error) {
                if ($error !== null) {
                    $err['data'][] = array($error);
                }
            }

            if (!empty($err['data'])) {
                $err['headline'] = 'Install Errors';
                $this->ui->outputData($err);
            }

            if (!count($downloaded)) {
                return $this->raiseError("$command failed");
            }
        }

        $data = array(
            'headline' => 'Packages that would be Installed'
        );

        if (isset($options['pretend'])) {
            foreach ($downloaded as $package) {
                $data['data'][] = array($reg->parsedPackageNameToString($package->getParsedPackage()));
            }
            $this->ui->outputData($data, 'pretend');
            return true;
        }

        $this->installer->setOptions($options);
        $this->installer->sortPackagesForInstall($downloaded);
        if (PEAR::isError($err = $this->installer->setDownloadedPackages($downloaded))) {
            $this->raiseError($err->getMessage());
            return true;
        }

        $binaries = $extrainfo = array();
        foreach ($downloaded as $param) {
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $info = $this->installer->install($param, $options);
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($info)) {
                $oldinfo = $info;
                $pkg = &$param->getPackageFile();
                if ($info->getCode() != PEAR_INSTALLER_NOBINARY) {
                    if (!($info = $pkg->installBinary($this->installer))) {
                        return $this->raiseError('ERROR: ' .$oldinfo->getMessage());
                    }

                    // we just installed a different package than requested,
                    // let's change the param and info so that the rest of this works
                    $param = $info[0];
                    $info  = $info[1];
                }
            }

            if (!is_array($info)) {
                return $this->raiseError("$command failed");
            }

            if ($param->getPackageType() == 'extsrc' ||
                  $param->getPackageType() == 'extbin' ||
                  $param->getPackageType() == 'zendextsrc' ||
                  $param->getPackageType() == 'zendextbin'
            ) {
                $pkg = &$param->getPackageFile();
                if ($instbin = $pkg->getInstalledBinary()) {
                    $instpkg = &$instreg->getPackage($instbin, $pkg->getChannel());
                } else {
                    $instpkg = &$instreg->getPackage($pkg->getPackage(), $pkg->getChannel());
                }

                foreach ($instpkg->getFilelist() as $name => $atts) {
                    $pinfo = pathinfo($atts['installed_as']);
                    if (!isset($pinfo['extension']) ||
                          in_array($pinfo['extension'], array('c', 'h'))
                    ) {
                        continue; // make sure we don't match php_blah.h
                    }

                    if ((strpos($pinfo['basename'], 'php_') === 0 &&
                          $pinfo['extension'] == 'dll') ||
                          // most unices
                          $pinfo['extension'] == 'so' ||
                          // hp-ux
                          $pinfo['extension'] == 'sl') {
                        $binaries[] = array($atts['installed_as'], $pinfo);
                        break;
                    }
                }

                if (count($binaries)) {
                    foreach ($binaries as $pinfo) {
                        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                        $ret = $this->enableExtension(array($pinfo[0]), $param->getPackageType());
                        PEAR::staticPopErrorHandling();
                        if (PEAR::isError($ret)) {
                            $extrainfo[] = $ret->getMessage();
                            if ($param->getPackageType() == 'extsrc' ||
                                  $param->getPackageType() == 'extbin') {
                                $exttype = 'extension';
                                $extpath = $pinfo[1]['basename'];
                            } else {
                                $exttype = 'zend_extension';
                                $extpath = $atts['installed_as'];
                            }
                            $extrainfo[] = 'You should add "' . $exttype . '=' .
                                $extpath . '" to php.ini';
                        } else {
                            $extrainfo[] = 'Extension ' . $instpkg->getProvidesExtension() .
                                ' enabled in php.ini';
                        }
                    }
                }
            }

            if ($this->config->get('verbose') > 0) {
                $chan = $param->getChannel();
                $label = $reg->parsedPackageNameToString(
                    array(
                        'channel' => $chan,
                        'package' => $param->getPackage(),
                        'version' => $param->getVersion(),
                    ));
                $out = array('data' => "$command ok: $label");
                if (isset($info['release_warnings'])) {
                    $out['release_warnings'] = $info['release_warnings'];
                }
                $this->ui->outputData($out, $command);

                if (!isset($options['register-only']) && !isset($options['offline'])) {
                    if ($this->config->isDefinedLayer('ftp')) {
                        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                        $info = $this->installer->ftpInstall($param);
                        PEAR::staticPopErrorHandling();
                        if (PEAR::isError($info)) {
                            $this->ui->outputData($info->getMessage());
                            $this->ui->outputData("remote install failed: $label");
                        } else {
                            $this->ui->outputData("remote install ok: $label");
                        }
                    }
                }
            }

            $deps = $param->getDeps();
            if ($deps) {
                if (isset($deps['group'])) {
                    $groups = $deps['group'];
                    if (!isset($groups[0])) {
                        $groups = array($groups);
                    }

                    foreach ($groups as $group) {
                        if ($group['attribs']['name'] == 'default') {
                            // default group is always installed, unless the user
                            // explicitly chooses to install another group
                            continue;
                        }
                        $extrainfo[] = $param->getPackage() . ': Optional feature ' .
                            $group['attribs']['name'] . ' available (' .
                            $group['attribs']['hint'] . ')';
                    }

                    $extrainfo[] = $param->getPackage() .
                        ': To install optional features use "pear install ' .
                        $reg->parsedPackageNameToString(
                            array('package' => $param->getPackage(),
                                  'channel' => $param->getChannel()), true) .
                              '#featurename"';
                }
            }

            $pkg = &$instreg->getPackage($param->getPackage(), $param->getChannel());
            // $pkg may be NULL if install is a 'fake' install via --packagingroot
            if (is_object($pkg)) {
                $pkg->setConfig($this->config);
                if ($list = $pkg->listPostinstallScripts()) {
                    $pn = $reg->parsedPackageNameToString(array('channel' =>
                       $param->getChannel(), 'package' => $param->getPackage()), true);
                    $extrainfo[] = $pn . ' has post-install scripts:';
                    foreach ($list as $file) {
                        $extrainfo[] = $file;
                    }
                    $extrainfo[] = $param->getPackage() .
                        ': Use "pear run-scripts ' . $pn . '" to finish setup.';
                    $extrainfo[] = 'DO NOT RUN SCRIPTS FROM UNTRUSTED SOURCES';
                }
            }
        }

        if (count($extrainfo)) {
            foreach ($extrainfo as $info) {
                $this->ui->outputData($info);
            }
        }

        return true;
    }

    // }}}
    // {{{ doUpgradeAll()

    function doUpgradeAll($command, $options, $params)
    {
        $reg = &$this->config->getRegistry();
        $upgrade = array();

        if (isset($options['channel'])) {
            $channels = array($options['channel']);
        } else {
            $channels = $reg->listChannels();
        }

        foreach ($channels as $channel) {
            if ($channel == '__uri') {
                continue;
            }

            // parse name with channel
            foreach ($reg->listPackages($channel) as $name) {
                $upgrade[] = $reg->parsedPackageNameToString(array(
                        'channel' => $channel,
                        'package' => $name
                    ));
            }
        }

        $err = $this->doInstall($command, $options, $upgrade);
        if (PEAR::isError($err)) {
            $this->ui->outputData($err->getMessage(), $command);
        }
   }

    // }}}
    // {{{ doUninstall()

    function doUninstall($command, $options, $params)
    {
        if (count($params) < 1) {
            return $this->raiseError("Please supply the package(s) you want to uninstall");
        }

        if (empty($this->installer)) {
            $this->installer = &$this->getInstaller($this->ui);
        }

        if (isset($options['remoteconfig'])) {
            $e = $this->config->readFTPConfigFile($options['remoteconfig']);
            if (!PEAR::isError($e)) {
                $this->installer->setConfig($this->config);
            }
        }

        $reg = &$this->config->getRegistry();
        $newparams = array();
        $binaries = array();
        $badparams = array();
        foreach ($params as $pkg) {
            $channel = $this->config->get('default_channel');
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $parsed = $reg->parsePackageName($pkg, $channel);
            PEAR::staticPopErrorHandling();
            if (!$parsed || PEAR::isError($parsed)) {
                $badparams[] = $pkg;
                continue;
            }
            $package = $parsed['package'];
            $channel = $parsed['channel'];
            $info = &$reg->getPackage($package, $channel);
            if ($info === null &&
                 ($channel == 'pear.php.net' || $channel == 'pecl.php.net')) {
                // make sure this isn't a package that has flipped from pear to pecl but
                // used a package.xml 1.0
                $testc = ($channel == 'pear.php.net') ? 'pecl.php.net' : 'pear.php.net';
                $info = &$reg->getPackage($package, $testc);
                if ($info !== null) {
                    $channel = $testc;
                }
            }
            if ($info === null) {
                $badparams[] = $pkg;
            } else {
                $newparams[] = &$info;
                // check for binary packages (this is an alias for those packages if so)
                if ($installedbinary = $info->getInstalledBinary()) {
                    $this->ui->log('adding binary package ' .
                        $reg->parsedPackageNameToString(array('channel' => $channel,
                            'package' => $installedbinary), true));
                    $newparams[] = &$reg->getPackage($installedbinary, $channel);
                }
                // add the contents of a dependency group to the list of installed packages
                if (isset($parsed['group'])) {
                    $group = $info->getDependencyGroup($parsed['group']);
                    if ($group) {
                        $installed = $reg->getInstalledGroup($group);
                        if ($installed) {
                            foreach ($installed as $i => $p) {
                                $newparams[] = &$installed[$i];
                            }
                        }
                    }
                }
            }
        }
        $err = $this->installer->sortPackagesForUninstall($newparams);
        if (PEAR::isError($err)) {
            $this->ui->outputData($err->getMessage(), $command);
            return true;
        }
        $params = $newparams;
        // twist this to use it to check on whether dependent packages are also being uninstalled
        // for circular dependencies like subpackages
        $this->installer->setUninstallPackages($newparams);
        $params = array_merge($params, $badparams);
        $binaries = array();
        foreach ($params as $pkg) {
            $this->installer->pushErrorHandling(PEAR_ERROR_RETURN);
            if ($err = $this->installer->uninstall($pkg, $options)) {
                $this->installer->popErrorHandling();
                if (PEAR::isError($err)) {
                    $this->ui->outputData($err->getMessage(), $command);
                    continue;
                }
                if ($pkg->getPackageType() == 'extsrc' ||
                      $pkg->getPackageType() == 'extbin' ||
                      $pkg->getPackageType() == 'zendextsrc' ||
                      $pkg->getPackageType() == 'zendextbin') {
                    if ($instbin = $pkg->getInstalledBinary()) {
                        continue; // this will be uninstalled later
                    }

                    foreach ($pkg->getFilelist() as $name => $atts) {
                        $pinfo = pathinfo($atts['installed_as']);
                        if (!isset($pinfo['extension']) ||
                              in_array($pinfo['extension'], array('c', 'h'))) {
                            continue; // make sure we don't match php_blah.h
                        }
                        if ((strpos($pinfo['basename'], 'php_') === 0 &&
                              $pinfo['extension'] == 'dll') ||
                              // most unices
                              $pinfo['extension'] == 'so' ||
                              // hp-ux
                              $pinfo['extension'] == 'sl') {
                            $binaries[] = array($atts['installed_as'], $pinfo);
                            break;
                        }
                    }
                    if (count($binaries)) {
                        foreach ($binaries as $pinfo) {
                            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                            $ret = $this->disableExtension(array($pinfo[0]), $pkg->getPackageType());
                            PEAR::staticPopErrorHandling();
                            if (PEAR::isError($ret)) {
                                $extrainfo[] = $ret->getMessage();
                                if ($pkg->getPackageType() == 'extsrc' ||
                                      $pkg->getPackageType() == 'extbin') {
                                    $exttype = 'extension';
                                } else {
                                    ob_start();
                                    phpinfo(INFO_GENERAL);
                                    $info = ob_get_contents();
                                    ob_end_clean();
                                    $debug = function_exists('leak') ? '_debug' : '';
                                    $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : '';
                                    $exttype = 'zend_extension' . $debug . $ts;
                                }
                                $this->ui->outputData('Unable to remove "' . $exttype . '=' .
                                    $pinfo[1]['basename'] . '" from php.ini', $command);
                            } else {
                                $this->ui->outputData('Extension ' . $pkg->getProvidesExtension() .
                                    ' disabled in php.ini', $command);
                            }
                        }
                    }
                }
                $savepkg = $pkg;
                if ($this->config->get('verbose') > 0) {
                    if (is_object($pkg)) {
                        $pkg = $reg->parsedPackageNameToString($pkg);
                    }
                    $this->ui->outputData("uninstall ok: $pkg", $command);
                }
                if (!isset($options['offline']) && is_object($savepkg) &&
                      defined('PEAR_REMOTEINSTALL_OK')) {
                    if ($this->config->isDefinedLayer('ftp')) {
                        $this->installer->pushErrorHandling(PEAR_ERROR_RETURN);
                        $info = $this->installer->ftpUninstall($savepkg);
                        $this->installer->popErrorHandling();
                        if (PEAR::isError($info)) {
                            $this->ui->outputData($info->getMessage());
                            $this->ui->outputData("remote uninstall failed: $pkg");
                        } else {
                            $this->ui->outputData("remote uninstall ok: $pkg");
                        }
                    }
                }
            } else {
                $this->installer->popErrorHandling();
                if (!is_object($pkg)) {
                    return $this->raiseError("uninstall failed: $pkg");
                }
                $pkg = $reg->parsedPackageNameToString($pkg);
            }
        }

        return true;
    }

    // }}}


    // }}}
    // {{{ doBundle()
    /*
    (cox) It just downloads and untars the package, does not do
            any check that the PEAR_Installer::_installFile() does.
    */

    function doBundle($command, $options, $params)
    {
        $opts = array(
            'force'        => true,
            'nodeps'       => true,
            'soft'         => true,
            'downloadonly' => true
        );
        $downloader = &$this->getDownloader($this->ui, $opts, $this->config);
        $reg = &$this->config->getRegistry();
        if (count($params) < 1) {
            return $this->raiseError("Please supply the package you want to bundle");
        }

        if (isset($options['destination'])) {
            if (!is_dir($options['destination'])) {
                System::mkdir('-p ' . $options['destination']);
            }
            $dest = realpath($options['destination']);
        } else {
            $pwd  = getcwd();
            $dir  = $pwd . DIRECTORY_SEPARATOR . 'ext';
            $dest = is_dir($dir) ? $dir : $pwd;
        }
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $err = $downloader->setDownloadDir($dest);
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($err)) {
            return PEAR::raiseError('download directory "' . $dest .
                '" is not writeable.');
        }
        $result = &$downloader->download(array($params[0]));
        if (PEAR::isError($result)) {
            return $result;
        }
        if (!isset($result[0])) {
            return $this->raiseError('unable to unpack ' . $params[0]);
        }
        $pkgfile = &$result[0]->getPackageFile();
        $pkgname = $pkgfile->getName();
        $pkgversion = $pkgfile->getVersion();

        // Unpacking -------------------------------------------------
        $dest .= DIRECTORY_SEPARATOR . $pkgname;
        $orig = $pkgname . '-' . $pkgversion;

        $tar = new Archive_Tar($pkgfile->getArchiveFile());
        if (!$tar->extractModify($dest, $orig)) {
            return $this->raiseError('unable to unpack ' . $pkgfile->getArchiveFile());
        }
        $this->ui->outputData("Package ready at '$dest'");
    // }}}
    }

    // }}}

    function doRunScripts($command, $options, $params)
    {
        if (!isset($params[0])) {
            return $this->raiseError('run-scripts expects 1 parameter: a package name');
        }

        $reg = &$this->config->getRegistry();
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel'));
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($parsed)) {
            return $this->raiseError($parsed);
        }

        $package = &$reg->getPackage($parsed['package'], $parsed['channel']);
        if (!is_object($package)) {
            return $this->raiseError('Could not retrieve package "' . $params[0] . '" from registry');
        }

        $package->setConfig($this->config);
        $package->runPostinstallScripts();
        $this->ui->outputData('Install scripts complete', $command);
        return true;
    }

    /**
     * Given a list of packages, filter out those ones that are already up to date
     *
     * @param $packages: packages, in parsed array format !
     * @return list of packages that can be upgraded
     */
    function _filterUptodatePackages($packages, $command)
    {
        $reg = &$this->config->getRegistry();
        $latestReleases = array();

        $ret = array();
        foreach ($packages as $package) {
            if (isset($package['group'])) {
                $ret[] = $package;
                continue;
            }

            $channel = $package['channel'];
            $name    = $package['package'];
            if (!$reg->packageExists($name, $channel)) {
                $ret[] = $package;
                continue;
            }

            if (!isset($latestReleases[$channel])) {
                // fill in cache for this channel
                $chan = $reg->getChannel($channel);
                if (PEAR::isError($chan)) {
                    return $this->raiseError($chan);
                }

                $base2 = false;
                $preferred_mirror = $this->config->get('preferred_mirror', null, $channel);
                if ($chan->supportsREST($preferred_mirror) &&
                    (
                       //($base2 = $chan->getBaseURL('REST1.4', $preferred_mirror)) ||
                       ($base  = $chan->getBaseURL('REST1.0', $preferred_mirror))
                    )
                ) {
                    $dorest = true;
                }

                PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
                if (!isset($package['state'])) {
                    $state = $this->config->get('preferred_state', null, $channel);
                } else {
                    $state = $package['state'];
                }

                if ($dorest) {
                    if ($base2) {
                        $rest = &$this->config->getREST('1.4', array());
                        $base = $base2;
                    } else {
                        $rest = &$this->config->getREST('1.0', array());
                    }

                    $installed = array_flip($reg->listPackages($channel));
                    $latest    = $rest->listLatestUpgrades($base, $state, $installed, $channel, $reg);
                }

                PEAR::staticPopErrorHandling();
                if (PEAR::isError($latest)) {
                    $this->ui->outputData('Error getting channel info from ' . $channel .
                        ': ' . $latest->getMessage());
                    continue;
                }

                $latestReleases[$channel] = array_change_key_case($latest);
            }

            // check package for latest release
            $name_lower = strtolower($name);
            if (isset($latestReleases[$channel][$name_lower])) {
                // if not set, up to date
                $inst_version    = $reg->packageInfo($name, 'version', $channel);
                $channel_version = $latestReleases[$channel][$name_lower]['version'];
                if (version_compare($channel_version, $inst_version, 'le')) {
                    // installed version is up-to-date
                    continue;
                }

                // maintain BC
                if ($command == 'upgrade-all') {
                    $this->ui->outputData(array('data' => 'Will upgrade ' .
                        $reg->parsedPackageNameToString($package)), $command);
                }
                $ret[] = $package;
            }
        }

        return $ret;
    }
}
PK�a�\,_�h/h/pear/PEAR/Command/Test.phpnu�[���<?php
/**
 * PEAR_Command_Test (run-tests)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for login/logout
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */

class PEAR_Command_Test extends PEAR_Command_Common
{
    var $commands = array(
        'run-tests' => array(
            'summary' => 'Run Regression Tests',
            'function' => 'doRunTests',
            'shortcut' => 'rt',
            'options' => array(
                'recur' => array(
                    'shortopt' => 'r',
                    'doc' => 'Run tests in child directories, recursively.  4 dirs deep maximum',
                ),
                'ini' => array(
                    'shortopt' => 'i',
                    'doc' => 'actual string of settings to pass to php in format " -d setting=blah"',
                    'arg' => 'SETTINGS'
                ),
                'realtimelog' => array(
                    'shortopt' => 'l',
                    'doc' => 'Log test runs/results as they are run',
                ),
                'quiet' => array(
                    'shortopt' => 'q',
                    'doc' => 'Only display detail for failed tests',
                ),
                'simple' => array(
                    'shortopt' => 's',
                    'doc' => 'Display simple output for all tests',
                ),
                'package' => array(
                    'shortopt' => 'p',
                    'doc' => 'Treat parameters as installed packages from which to run tests',
                ),
                'phpunit' => array(
                    'shortopt' => 'u',
                    'doc' => 'Search parameters for AllTests.php, and use that to run phpunit-based tests
If none is found, all .phpt tests will be tried instead.',
                ),
                'tapoutput' => array(
                    'shortopt' => 't',
                    'doc' => 'Output run-tests.log in TAP-compliant format',
                ),
                'cgi' => array(
                    'shortopt' => 'c',
                    'doc' => 'CGI php executable (needed for tests with POST/GET section)',
                    'arg' => 'PHPCGI',
                ),
                'coverage' => array(
                    'shortopt' => 'x',
                    'doc'      => 'Generate a code coverage report (requires Xdebug 2.0.0+)',
                ),
                'showdiff' => array(
                    'shortopt' => 'd',
                    'doc' => 'Output diff on test failure',
                ),
            ),
            'doc' => '[testfile|dir ...]
Run regression tests with PHP\'s regression testing script (run-tests.php).',
            ),
        );

    var $output;

    /**
     * PEAR_Command_Test constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function doRunTests($command, $options, $params)
    {
        if (isset($options['phpunit']) && isset($options['tapoutput'])) {
            return $this->raiseError('ERROR: cannot use both --phpunit and --tapoutput at the same time');
        }

        require_once 'PEAR/Common.php';
        require_once 'System.php';
        $log = new PEAR_Common;
        $log->ui = &$this->ui; // slightly hacky, but it will work
        $tests = array();
        $depth = isset($options['recur']) ? 14 : 1;

        if (!count($params)) {
            $params[] = '.';
        }

        if (isset($options['package'])) {
            $oldparams = $params;
            $params = array();
            $reg = &$this->config->getRegistry();
            foreach ($oldparams as $param) {
                $pname = $reg->parsePackageName($param, $this->config->get('default_channel'));
                if (PEAR::isError($pname)) {
                    return $this->raiseError($pname);
                }

                $package = &$reg->getPackage($pname['package'], $pname['channel']);
                if (!$package) {
                    return PEAR::raiseError('Unknown package "' .
                        $reg->parsedPackageNameToString($pname) . '"');
                }

                $filelist = $package->getFilelist();
                foreach ($filelist as $name => $atts) {
                    if (isset($atts['role']) && $atts['role'] != 'test') {
                        continue;
                    }

                    if (isset($options['phpunit']) && preg_match('/AllTests\.php\\z/i', $name)) {
                        $params[] = $atts['installed_as'];
                        continue;
                    } elseif (!preg_match('/\.phpt\\z/', $name)) {
                        continue;
                    }
                    $params[] = $atts['installed_as'];
                }
            }
        }

        foreach ($params as $p) {
            if (is_dir($p)) {
                if (isset($options['phpunit'])) {
                    $dir = System::find(array($p, '-type', 'f',
                                                '-maxdepth', $depth,
                                                '-name', 'AllTests.php'));
                    if (count($dir)) {
                        foreach ($dir as $p) {
                            $p = realpath($p);
                            if (!count($tests) ||
                                  (count($tests) && strlen($p) < strlen($tests[0]))) {
                                // this is in a higher-level directory, use this one instead.
                                $tests = array($p);
                            }
                        }
                    }
                    continue;
                }

                $args  = array($p, '-type', 'f', '-name', '*.phpt');
            } else {
                if (isset($options['phpunit'])) {
                    if (preg_match('/AllTests\.php\\z/i', $p)) {
                        $p = realpath($p);
                        if (!count($tests) ||
                              (count($tests) && strlen($p) < strlen($tests[0]))) {
                            // this is in a higher-level directory, use this one instead.
                            $tests = array($p);
                        }
                    }
                    continue;
                }

                if (file_exists($p) && preg_match('/\.phpt$/', $p)) {
                    $tests[] = $p;
                    continue;
                }

                if (!preg_match('/\.phpt\\z/', $p)) {
                    $p .= '.phpt';
                }

                $args  = array(dirname($p), '-type', 'f', '-name', $p);
            }

            if (!isset($options['recur'])) {
                $args[] = '-maxdepth';
                $args[] = 1;
            }

            $dir   = System::find($args);
            $tests = array_merge($tests, $dir);
        }

        $ini_settings = '';
        if (isset($options['ini'])) {
            $ini_settings .= $options['ini'];
        }

        if (isset($_ENV['TEST_PHP_INCLUDE_PATH'])) {
            $ini_settings .= " -d include_path={$_ENV['TEST_PHP_INCLUDE_PATH']}";
        }

        if ($ini_settings) {
            $this->ui->outputData('Using INI settings: "' . $ini_settings . '"');
        }

        $skipped = $passed = $failed = array();
        $tests_count = count($tests);
        $this->ui->outputData('Running ' . $tests_count . ' tests', $command);
        $start = time();
        if (isset($options['realtimelog']) && file_exists('run-tests.log')) {
            unlink('run-tests.log');
        }

        if (isset($options['tapoutput'])) {
            $tap = '1..' . $tests_count . "\n";
        }

        require_once 'PEAR/RunTest.php';
        $run = new PEAR_RunTest($log, $options);
        $run->tests_count = $tests_count;

        if (isset($options['coverage']) && extension_loaded('xdebug')){
            $run->xdebug_loaded = true;
        } else {
            $run->xdebug_loaded = false;
        }

        $j = $i = 1;
        foreach ($tests as $t) {
            if (isset($options['realtimelog'])) {
                $fp = @fopen('run-tests.log', 'a');
                if ($fp) {
                    fwrite($fp, "Running test [$i / $tests_count] $t...");
                    fclose($fp);
                }
            }
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            if (isset($options['phpunit'])) {
                $result = $run->runPHPUnit($t, $ini_settings);
            } else {
                $result = $run->run($t, $ini_settings, $j);
            }
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($result)) {
                $this->ui->log($result->getMessage());
                continue;
            }

            if (isset($options['tapoutput'])) {
                $tap .= $result[0] . ' ' . $i . $result[1] . "\n";
                continue;
            }

            if (isset($options['realtimelog'])) {
                $fp = @fopen('run-tests.log', 'a');
                if ($fp) {
                    fwrite($fp, "$result\n");
                    fclose($fp);
                }
            }

            if ($result == 'FAILED') {
                $failed[] = $t;
            }
            if ($result == 'PASSED') {
                $passed[] = $t;
            }
            if ($result == 'SKIPPED') {
                $skipped[] = $t;
            }

            $j++;
        }

        $total = date('i:s', time() - $start);
        if (isset($options['tapoutput'])) {
            $fp = @fopen('run-tests.log', 'w');
            if ($fp) {
                fwrite($fp, $tap, strlen($tap));
                fclose($fp);
                $this->ui->outputData('wrote TAP-format log to "' .realpath('run-tests.log') .
                    '"', $command);
            }
        } else {
            if (count($failed)) {
                $output = "TOTAL TIME: $total\n";
                $output .= count($passed) . " PASSED TESTS\n";
                $output .= count($skipped) . " SKIPPED TESTS\n";
                $output .= count($failed) . " FAILED TESTS:\n";
                foreach ($failed as $failure) {
                    $output .= $failure . "\n";
                }

                $mode = isset($options['realtimelog']) ? 'a' : 'w';
                $fp   = @fopen('run-tests.log', $mode);

                if ($fp) {
                    fwrite($fp, $output, strlen($output));
                    fclose($fp);
                    $this->ui->outputData('wrote log to "' . realpath('run-tests.log') . '"', $command);
                }
            } elseif (file_exists('run-tests.log') && !is_dir('run-tests.log')) {
                @unlink('run-tests.log');
            }
        }
        $this->ui->outputData('TOTAL TIME: ' . $total);
        $this->ui->outputData(count($passed) . ' PASSED TESTS', $command);
        $this->ui->outputData(count($skipped) . ' SKIPPED TESTS', $command);
        if (count($failed)) {
            $this->ui->outputData(count($failed) . ' FAILED TESTS:', $command);
            foreach ($failed as $failure) {
                $this->ui->outputData($failure, $command);
            }
        }

        if (count($failed) == 0) {
            return true;
        }
        return $this->raiseError('Some tests failed');
    }
}
PK�a�\d֣S��pear/PEAR/Command/Pickle.xmlnu�[���<commands version="1.0">
 <pickle>
  <summary>Build PECL Package</summary>
  <function>doPackage</function>
  <shortcut>pi</shortcut>
  <options>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>Do not gzip the package file</doc>
   </nocompress>
   <showname>
    <shortopt>n</shortopt>
    <doc>Print the name of the packaged file.</doc>
   </showname>
  </options>
  <doc>[descfile]
Creates a PECL package from its package2.xml file.

An automatic conversion will be made to a package.xml 1.0 and written out to
disk in the current directory as &quot;package.xml&quot;.  Note that
only simple package.xml 2.0 will be converted.  package.xml 2.0 with:

 - dependency types other than required/optional PECL package/ext/php/pearinstaller
 - more than one extsrcrelease or zendextsrcrelease
 - zendextbinrelease, extbinrelease, phprelease, or bundle release type
 - dependency groups
 - ignore tags in release filelist
 - tasks other than replace
 - custom roles

will cause pickle to fail, and output an error message.  If your package2.xml
uses any of these features, you are best off using PEAR_PackageFileManager to
generate both package.xml.
</doc>
 </pickle>
</commands>PK�a�\+9ҜҜpear/PEAR/Command/Package.phpnu�[���<?php
/**
 * PEAR_Command_Package (package, package-validate, cvsdiff, cvstag, package-dependencies,
 * sign, makerpm, convert commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for login/logout
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Martin Jansen <mj@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */

class PEAR_Command_Package extends PEAR_Command_Common
{
    var $commands = array(
        'package' => array(
            'summary' => 'Build Package',
            'function' => 'doPackage',
            'shortcut' => 'p',
            'options' => array(
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'Do not gzip the package file'
                    ),
                'showname' => array(
                    'shortopt' => 'n',
                    'doc' => 'Print the name of the packaged file.',
                    ),
                ),
            'doc' => '[descfile] [descfile2]
Creates a PEAR package from its description file (usually called
package.xml).  If a second packagefile is passed in, then
the packager will check to make sure that one is a package.xml
version 1.0, and the other is a package.xml version 2.0.  The
package.xml version 1.0 will be saved as "package.xml" in the archive,
and the other as "package2.xml" in the archive"
'
            ),
        'package-validate' => array(
            'summary' => 'Validate Package Consistency',
            'function' => 'doPackageValidate',
            'shortcut' => 'pv',
            'options' => array(),
            'doc' => '
',
            ),
        'cvsdiff' => array(
            'summary' => 'Run a "cvs diff" for all files in a package',
            'function' => 'doCvsDiff',
            'shortcut' => 'cd',
            'options' => array(
                'quiet' => array(
                    'shortopt' => 'q',
                    'doc' => 'Be quiet',
                    ),
                'reallyquiet' => array(
                    'shortopt' => 'Q',
                    'doc' => 'Be really quiet',
                    ),
                'date' => array(
                    'shortopt' => 'D',
                    'doc' => 'Diff against revision of DATE',
                    'arg' => 'DATE',
                    ),
                'release' => array(
                    'shortopt' => 'R',
                    'doc' => 'Diff against tag for package release REL',
                    'arg' => 'REL',
                    ),
                'revision' => array(
                    'shortopt' => 'r',
                    'doc' => 'Diff against revision REV',
                    'arg' => 'REV',
                    ),
                'context' => array(
                    'shortopt' => 'c',
                    'doc' => 'Generate context diff',
                    ),
                'unified' => array(
                    'shortopt' => 'u',
                    'doc' => 'Generate unified diff',
                    ),
                'ignore-case' => array(
                    'shortopt' => 'i',
                    'doc' => 'Ignore case, consider upper- and lower-case letters equivalent',
                    ),
                'ignore-whitespace' => array(
                    'shortopt' => 'b',
                    'doc' => 'Ignore changes in amount of white space',
                    ),
                'ignore-blank-lines' => array(
                    'shortopt' => 'B',
                    'doc' => 'Ignore changes that insert or delete blank lines',
                    ),
                'brief' => array(
                    'doc' => 'Report only whether the files differ, no details',
                    ),
                'dry-run' => array(
                    'shortopt' => 'n',
                    'doc' => 'Don\'t do anything, just pretend',
                    ),
                ),
            'doc' => '<package.xml>
Compares all the files in a package.  Without any options, this
command will compare the current code with the last checked-in code.
Using the -r or -R option you may compare the current code with that
of a specific release.
',
            ),
         'svntag' => array(
             'summary' => 'Set SVN Release Tag',
             'function' => 'doSvnTag',
             'shortcut' => 'sv',
             'options' => array(
                 'quiet' => array(
                     'shortopt' => 'q',
                     'doc' => 'Be quiet',
                     ),
                 'slide' => array(
                     'shortopt' => 'F',
                     'doc' => 'Move (slide) tag if it exists',
                     ),
                 'delete' => array(
                     'shortopt' => 'd',
                     'doc' => 'Remove tag',
                     ),
                 'dry-run' => array(
                     'shortopt' => 'n',
                     'doc' => 'Don\'t do anything, just pretend',
                     ),
                 ),
             'doc' => '<package.xml> [files...]
 Sets a SVN tag on all files in a package.  Use this command after you have
 packaged a distribution tarball with the "package" command to tag what
 revisions of what files were in that release.  If need to fix something
 after running svntag once, but before the tarball is released to the public,
 use the "slide" option to move the release tag.

 to include files (such as a second package.xml, or tests not included in the
 release), pass them as additional parameters.
 ',
             ),
        'cvstag' => array(
            'summary' => 'Set CVS Release Tag',
            'function' => 'doCvsTag',
            'shortcut' => 'ct',
            'options' => array(
                'quiet' => array(
                    'shortopt' => 'q',
                    'doc' => 'Be quiet',
                    ),
                'reallyquiet' => array(
                    'shortopt' => 'Q',
                    'doc' => 'Be really quiet',
                    ),
                'slide' => array(
                    'shortopt' => 'F',
                    'doc' => 'Move (slide) tag if it exists',
                    ),
                'delete' => array(
                    'shortopt' => 'd',
                    'doc' => 'Remove tag',
                    ),
                'dry-run' => array(
                    'shortopt' => 'n',
                    'doc' => 'Don\'t do anything, just pretend',
                    ),
                ),
            'doc' => '<package.xml> [files...]
Sets a CVS tag on all files in a package.  Use this command after you have
packaged a distribution tarball with the "package" command to tag what
revisions of what files were in that release.  If need to fix something
after running cvstag once, but before the tarball is released to the public,
use the "slide" option to move the release tag.

to include files (such as a second package.xml, or tests not included in the
release), pass them as additional parameters.
',
            ),
        'package-dependencies' => array(
            'summary' => 'Show package dependencies',
            'function' => 'doPackageDependencies',
            'shortcut' => 'pd',
            'options' => array(),
            'doc' => '<package-file> or <package.xml> or <install-package-name>
List all dependencies the package has.
Can take a tgz / tar file, package.xml or a package name of an installed package.'
            ),
        'sign' => array(
            'summary' => 'Sign a package distribution file',
            'function' => 'doSign',
            'shortcut' => 'si',
            'options' => array(
                'verbose' => array(
                    'shortopt' => 'v',
                    'doc' => 'Display GnuPG output',
                    ),
            ),
            'doc' => '<package-file>
Signs a package distribution (.tar or .tgz) file with GnuPG.',
            ),
        'makerpm' => array(
            'summary' => 'Builds an RPM spec file from a PEAR package',
            'function' => 'doMakeRPM',
            'shortcut' => 'rpm',
            'options' => array(
                'spec-template' => array(
                    'shortopt' => 't',
                    'arg' => 'FILE',
                    'doc' => 'Use FILE as RPM spec file template'
                    ),
                'rpm-pkgname' => array(
                    'shortopt' => 'p',
                    'arg' => 'FORMAT',
                    'doc' => 'Use FORMAT as format string for RPM package name, %s is replaced
by the PEAR package name, defaults to "PEAR::%s".',
                    ),
                ),
            'doc' => '<package-file>

Creates an RPM .spec file for wrapping a PEAR package inside an RPM
package.  Intended to be used from the SPECS directory, with the PEAR
package tarball in the SOURCES directory:

$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz
Wrote RPM spec file PEAR::Net_Geo-1.0.spec
$ rpm -bb PEAR::Net_Socket-1.0.spec
...
Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm
',
            ),
        'convert' => array(
            'summary' => 'Convert a package.xml 1.0 to package.xml 2.0 format',
            'function' => 'doConvert',
            'shortcut' => 'c2',
            'options' => array(
                'flat' => array(
                    'shortopt' => 'f',
                    'doc' => 'do not beautify the filelist.',
                    ),
                ),
            'doc' => '[descfile] [descfile2]
Converts a package.xml in 1.0 format into a package.xml
in 2.0 format.  The new file will be named package2.xml by default,
and package.xml will be used as the old file by default.
This is not the most intelligent conversion, and should only be
used for automated conversion or learning the format.
'
            ),
        );

    var $output;

    /**
     * PEAR_Command_Package constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function _displayValidationResults($err, $warn, $strict = false)
    {
        foreach ($err as $e) {
            $this->output .= "Error: $e\n";
        }
        foreach ($warn as $w) {
            $this->output .= "Warning: $w\n";
        }
        $this->output .= sprintf('Validation: %d error(s), %d warning(s)'."\n",
                                       sizeof($err), sizeof($warn));
        if ($strict && count($err) > 0) {
            $this->output .= "Fix these errors and try again.";
            return false;
        }
        return true;
    }

    function &getPackager()
    {
        if (!class_exists('PEAR_Packager')) {
            require_once 'PEAR/Packager.php';
        }
        $a = new PEAR_Packager;
        return $a;
    }

    function &getPackageFile($config, $debug = false)
    {
        if (!class_exists('PEAR_Common')) {
            require_once 'PEAR/Common.php';
        }
        if (!class_exists('PEAR_PackageFile')) {
            require_once 'PEAR/PackageFile.php';
        }
        $a = new PEAR_PackageFile($config, $debug);
        $common = new PEAR_Common;
        $common->ui = $this->ui;
        $a->setLogger($common);
        return $a;
    }

    function doPackage($command, $options, $params)
    {
        $this->output = '';
        $pkginfofile = isset($params[0]) ? $params[0] : 'package.xml';
        $pkg2 = isset($params[1]) ? $params[1] : null;
        if (!$pkg2 && !isset($params[0]) && file_exists('package2.xml')) {
            $pkg2 = 'package2.xml';
        }

        $packager = &$this->getPackager();
        $compress = empty($options['nocompress']) ? true : false;
        $result   = $packager->package($pkginfofile, $compress, $pkg2);
        if (PEAR::isError($result)) {
            return $this->raiseError($result);
        }

        // Don't want output, only the package file name just created
        if (isset($options['showname'])) {
            $this->output = $result;
        }

        if ($this->output) {
            $this->ui->outputData($this->output, $command);
        }

        return true;
    }

    function doPackageValidate($command, $options, $params)
    {
        $this->output = '';
        if (count($params) < 1) {
            $params[0] = 'package.xml';
        }

        $obj = &$this->getPackageFile($this->config, $this->_debug);
        $obj->rawReturn();
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $info = $obj->fromTgzFile($params[0], PEAR_VALIDATE_NORMAL);
        if (PEAR::isError($info)) {
            $info = $obj->fromPackageFile($params[0], PEAR_VALIDATE_NORMAL);
        } else {
            $archive = $info->getArchiveFile();
            $tar = new Archive_Tar($archive);
            $tar->extract(dirname($info->getPackageFile()));
            $info->setPackageFile(dirname($info->getPackageFile()) . DIRECTORY_SEPARATOR .
                $info->getPackage() . '-' . $info->getVersion() . DIRECTORY_SEPARATOR .
                basename($info->getPackageFile()));
        }

        PEAR::staticPopErrorHandling();
        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $valid = false;
        if ($info->getPackagexmlVersion() == '2.0') {
            if ($valid = $info->validate(PEAR_VALIDATE_NORMAL)) {
                $info->flattenFileList();
                $valid = $info->validate(PEAR_VALIDATE_PACKAGING);
            }
        } else {
            $valid = $info->validate(PEAR_VALIDATE_PACKAGING);
        }

        $err = $warn = array();
        if ($errors = $info->getValidationWarnings()) {
            foreach ($errors as $error) {
                if ($error['level'] == 'warning') {
                    $warn[] = $error['message'];
                } else {
                    $err[] = $error['message'];
                }
            }
        }

        $this->_displayValidationResults($err, $warn);
        $this->ui->outputData($this->output, $command);
        return true;
    }

    function doSvnTag($command, $options, $params)
    {
        $this->output = '';
        $_cmd = $command;
        if (count($params) < 1) {
            $help = $this->getHelp($command);
            return $this->raiseError("$command: missing parameter: $help[0]");
        }

        $packageFile = realpath($params[0]);
        $dir = dirname($packageFile);
        $dir = substr($dir, strrpos($dir, DIRECTORY_SEPARATOR) + 1);
        $obj  = &$this->getPackageFile($this->config, $this->_debug);
        $info = $obj->fromAnyFile($packageFile, PEAR_VALIDATE_NORMAL);
        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $err = $warn = array();
        if (!$info->validate()) {
            foreach ($info->getValidationWarnings() as $error) {
                if ($error['level'] == 'warning') {
                    $warn[] = $error['message'];
                } else {
                    $err[] = $error['message'];
                }
            }
        }

        if (!$this->_displayValidationResults($err, $warn, true)) {
            $this->ui->outputData($this->output, $command);
            return $this->raiseError('SVN tag failed');
        }

        $version    = $info->getVersion();
        $package    = $info->getName();
        $svntag     = "$package-$version";

        if (isset($options['delete'])) {
            return $this->_svnRemoveTag($version, $package, $svntag, $packageFile, $options);
        }

        $path = $this->_svnFindPath($packageFile);

        // Check if there are any modified files
        $fp = popen('svn st --xml ' . dirname($packageFile), "r");
        $out = '';
        while ($line = fgets($fp, 1024)) {
            $out .= rtrim($line)."\n";
        }
        pclose($fp);

        if (!isset($options['quiet']) && strpos($out, 'item="modified"')) {
            $params = array(array(
                'name' => 'modified',
                'type' => 'yesno',
                'default' => 'no',
                'prompt' => 'You have files in your SVN checkout (' . $path['from']  . ') that have been modified but not committed, do you still want to tag ' . $version . '?',
            ));
            $answers = $this->ui->confirmDialog($params);

            if (!in_array($answers['modified'], array('y', 'yes', 'on', '1'))) {
                return true;
            }
        }

        if (isset($options['slide'])) {
            $this->_svnRemoveTag($version, $package, $svntag, $packageFile, $options);
        }

        // Check if tag already exists
        $releaseTag = $path['local']['base'] . 'tags' . DIRECTORY_SEPARATOR . $svntag;
        $existsCommand = 'svn ls ' . $path['base'] . 'tags/';

        $fp = popen($existsCommand, "r");
        $out = '';
        while ($line = fgets($fp, 1024)) {
            $out .= rtrim($line)."\n";
        }
        pclose($fp);

        if (in_array($svntag . DIRECTORY_SEPARATOR, explode("\n", $out))) {
            $this->ui->outputData($this->output, $command);
            return $this->raiseError('SVN tag ' . $svntag . ' for ' . $package . ' already exists.');
        } elseif (file_exists($path['local']['base'] . 'tags') === false) {
            return $this->raiseError('Can not locate the tags directory at ' . $path['local']['base'] . 'tags');
        } elseif (is_writeable($path['local']['base'] . 'tags') === false) {
            return $this->raiseError('Can not write to the tag directory at ' . $path['local']['base'] . 'tags');
        } else {
            $makeCommand = 'svn mkdir ' . $releaseTag;
            $this->output .= "+ $makeCommand\n";
            if (empty($options['dry-run'])) {
                // We need to create the tag dir.
                $fp = popen($makeCommand, "r");
                $out = '';
                while ($line = fgets($fp, 1024)) {
                    $out .= rtrim($line)."\n";
                }
                pclose($fp);
                $this->output .= "$out\n";
            }
        }

        $command = 'svn';
        if (isset($options['quiet'])) {
            $command .= ' -q';
        }

        $command .= ' copy --parents ';

        $dir   = dirname($packageFile);
        $dir   = substr($dir, strrpos($dir, DIRECTORY_SEPARATOR) + 1);
        $files = array_keys($info->getFilelist());
        if (!in_array(basename($packageFile), $files)) {
            $files[] = basename($packageFile);
        }

        array_shift($params);
        if (count($params)) {
            // add in additional files to be tagged (package files and such)
            $files = array_merge($files, $params);
        }

        $commands = array();
        foreach ($files as $file) {
            if (!file_exists($file)) {
                $file = $dir . DIRECTORY_SEPARATOR . $file;
            }
            $commands[] = $command . ' ' . escapeshellarg($file) . ' ' .
                          escapeshellarg($releaseTag . DIRECTORY_SEPARATOR . $file);
        }

        $this->output .= implode("\n", $commands) . "\n";
        if (empty($options['dry-run'])) {
            foreach ($commands as $command) {
                $fp = popen($command, "r");
                while ($line = fgets($fp, 1024)) {
                    $this->output .= rtrim($line)."\n";
                }
                pclose($fp);
            }
        }

        $command = 'svn ci -m "Tagging the ' . $version  . ' release" ' . $releaseTag . "\n";
        $this->output .= "+ $command\n";
        if (empty($options['dry-run'])) {
            $fp = popen($command, "r");
            while ($line = fgets($fp, 1024)) {
                $this->output .= rtrim($line)."\n";
            }
            pclose($fp);
        }

        $this->ui->outputData($this->output, $_cmd);
        return true;
    }

    function _svnFindPath($file)
    {
        $xml = '';
        $command = "svn info --xml $file";
        $fp = popen($command, "r");
        while ($line = fgets($fp, 1024)) {
            $xml .= rtrim($line)."\n";
        }
        pclose($fp);
        $url_tag = strpos($xml, '<url>');
        $url = substr($xml, $url_tag + 5, strpos($xml, '</url>', $url_tag + 5) - ($url_tag + 5));

        $path = array();
        $path['from'] = substr($url, 0, strrpos($url, '/'));
        $path['base'] = substr($path['from'], 0, strrpos($path['from'], '/') + 1);

        // Figure out the local paths - see http://pear.php.net/bugs/17463
        $pos = strpos($file, DIRECTORY_SEPARATOR . 'trunk' . DIRECTORY_SEPARATOR);
        if ($pos === false) {
            $pos = strpos($file, DIRECTORY_SEPARATOR . 'branches' . DIRECTORY_SEPARATOR);
        }
        $path['local']['base'] = substr($file, 0, $pos + 1);

        return $path;
    }

    function _svnRemoveTag($version, $package, $tag, $packageFile, $options)
    {
        $command = 'svn';

        if (isset($options['quiet'])) {
            $command .= ' -q';
        }

        $command .= ' remove';
        $command .= ' -m "Removing tag for the ' . $version  . ' release."';

        $path = $this->_svnFindPath($packageFile);
        $command .= ' ' . $path['base'] . 'tags/' . $tag;


        if ($this->config->get('verbose') > 1) {
            $this->output .= "+ $command\n";
        }

        $this->output .= "+ $command\n";
        if (empty($options['dry-run'])) {
            $fp = popen($command, "r");
            while ($line = fgets($fp, 1024)) {
                $this->output .= rtrim($line)."\n";
            }
            pclose($fp);
        }

        $this->ui->outputData($this->output, $command);
        return true;
    }

    function doCvsTag($command, $options, $params)
    {
        $this->output = '';
        $_cmd = $command;
        if (count($params) < 1) {
            $help = $this->getHelp($command);
            return $this->raiseError("$command: missing parameter: $help[0]");
        }

        $packageFile = realpath($params[0]);
        $obj  = &$this->getPackageFile($this->config, $this->_debug);
        $info = $obj->fromAnyFile($packageFile, PEAR_VALIDATE_NORMAL);
        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $err = $warn = array();
        if (!$info->validate()) {
            foreach ($info->getValidationWarnings() as $error) {
                if ($error['level'] == 'warning') {
                    $warn[] = $error['message'];
                } else {
                    $err[] = $error['message'];
                }
            }
        }

        if (!$this->_displayValidationResults($err, $warn, true)) {
            $this->ui->outputData($this->output, $command);
            return $this->raiseError('CVS tag failed');
        }

        $version    = $info->getVersion();
        $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $version);
        $cvstag     = "RELEASE_$cvsversion";
        $files      = array_keys($info->getFilelist());
        $command = 'cvs';
        if (isset($options['quiet'])) {
            $command .= ' -q';
        }

        if (isset($options['reallyquiet'])) {
            $command .= ' -Q';
        }

        $command .= ' tag';
        if (isset($options['slide'])) {
            $command .= ' -F';
        }

        if (isset($options['delete'])) {
            $command .= ' -d';
        }

        $command .= ' ' . $cvstag . ' ' . escapeshellarg($params[0]);
        array_shift($params);
        if (count($params)) {
            // add in additional files to be tagged
            $files = array_merge($files, $params);
        }

        $dir = dirname($packageFile);
        $dir = substr($dir, strrpos($dir, '/') + 1);
        foreach ($files as $file) {
            if (!file_exists($file)) {
                $file = $dir . DIRECTORY_SEPARATOR . $file;
            }
            $command .= ' ' . escapeshellarg($file);
        }

        if ($this->config->get('verbose') > 1) {
            $this->output .= "+ $command\n";
        }

        $this->output .= "+ $command\n";
        if (empty($options['dry-run'])) {
            $fp = popen($command, "r");
            while ($line = fgets($fp, 1024)) {
                $this->output .= rtrim($line)."\n";
            }
            pclose($fp);
        }

        $this->ui->outputData($this->output, $_cmd);
        return true;
    }

    function doCvsDiff($command, $options, $params)
    {
        $this->output = '';
        if (sizeof($params) < 1) {
            $help = $this->getHelp($command);
            return $this->raiseError("$command: missing parameter: $help[0]");
        }

        $file = realpath($params[0]);
        $obj  = &$this->getPackageFile($this->config, $this->_debug);
        $info = $obj->fromAnyFile($file, PEAR_VALIDATE_NORMAL);
        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $err = $warn = array();
        if (!$info->validate()) {
            foreach ($info->getValidationWarnings() as $error) {
                if ($error['level'] == 'warning') {
                    $warn[] = $error['message'];
                } else {
                    $err[] = $error['message'];
                }
            }
        }

        if (!$this->_displayValidationResults($err, $warn, true)) {
            $this->ui->outputData($this->output, $command);
            return $this->raiseError('CVS diff failed');
        }

        $info1 = $info->getFilelist();
        $files = $info1;
        $cmd = "cvs";
        if (isset($options['quiet'])) {
            $cmd .= ' -q';
            unset($options['quiet']);
        }

        if (isset($options['reallyquiet'])) {
            $cmd .= ' -Q';
            unset($options['reallyquiet']);
        }

        if (isset($options['release'])) {
            $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $options['release']);
            $cvstag = "RELEASE_$cvsversion";
            $options['revision'] = $cvstag;
            unset($options['release']);
        }

        $execute = true;
        if (isset($options['dry-run'])) {
            $execute = false;
            unset($options['dry-run']);
        }

        $cmd .= ' diff';
        // the rest of the options are passed right on to "cvs diff"
        foreach ($options as $option => $optarg) {
            $arg = $short = false;
            if (isset($this->commands[$command]['options'][$option])) {
                $arg = $this->commands[$command]['options'][$option]['arg'];
                $short = $this->commands[$command]['options'][$option]['shortopt'];
            }
            $cmd .= $short ? " -$short" : " --$option";
            if ($arg && $optarg) {
                $cmd .= ($short ? '' : '=') . escapeshellarg($optarg);
            }
        }

        foreach ($files as $file) {
            $cmd .= ' ' . escapeshellarg($file['name']);
        }

        if ($this->config->get('verbose') > 1) {
            $this->output .= "+ $cmd\n";
        }

        if ($execute) {
            $fp = popen($cmd, "r");
            while ($line = fgets($fp, 1024)) {
                $this->output .= rtrim($line)."\n";
            }
            pclose($fp);
        }

        $this->ui->outputData($this->output, $command);
        return true;
    }

    function doPackageDependencies($command, $options, $params)
    {
        // $params[0] -> the PEAR package to list its information
        if (count($params) !== 1) {
            return $this->raiseError("bad parameter(s), try \"help $command\"");
        }

        $obj = &$this->getPackageFile($this->config, $this->_debug);
        if (is_file($params[0]) || strpos($params[0], '.xml') > 0) {
           $info = $obj->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL);
        } else {
            $reg  = $this->config->getRegistry();
            $info = $obj->fromArray($reg->packageInfo($params[0]));
        }

        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $deps = $info->getDeps();
        if (is_array($deps)) {
            if ($info->getPackagexmlVersion() == '1.0') {
                $data = array(
                    'caption' => 'Dependencies for pear/' . $info->getPackage(),
                    'border' => true,
                    'headline' => array("Required?", "Type", "Name", "Relation", "Version"),
                    );

                foreach ($deps as $d) {
                    if (isset($d['optional'])) {
                        if ($d['optional'] == 'yes') {
                            $req = 'No';
                        } else {
                            $req = 'Yes';
                        }
                    } else {
                        $req = 'Yes';
                    }

                    if (isset($this->_deps_rel_trans[$d['rel']])) {
                        $rel = $this->_deps_rel_trans[$d['rel']];
                    } else {
                        $rel = $d['rel'];
                    }

                    if (isset($this->_deps_type_trans[$d['type']])) {
                        $type = ucfirst($this->_deps_type_trans[$d['type']]);
                    } else {
                        $type = $d['type'];
                    }

                    if (isset($d['name'])) {
                        $name = $d['name'];
                    } else {
                        $name = '';
                    }

                    if (isset($d['version'])) {
                        $version = $d['version'];
                    } else {
                        $version = '';
                    }

                    $data['data'][] = array($req, $type, $name, $rel, $version);
                }
            } else { // package.xml 2.0 dependencies display
                require_once 'PEAR/Dependency2.php';
                $deps = $info->getDependencies();
                $reg = &$this->config->getRegistry();
                if (is_array($deps)) {
                    $data = array(
                        'caption' => 'Dependencies for ' . $info->getPackage(),
                        'border' => true,
                        'headline' => array("Required?", "Type", "Name", 'Versioning', 'Group'),
                        );
                    foreach ($deps as $type => $subd) {
                        $req = ($type == 'required') ? 'Yes' : 'No';
                        if ($type == 'group' && isset($subd['attribs']['name'])) {
                            $group = $subd['attribs']['name'];
                        } else {
                            $group = '';
                        }

                        if (!isset($subd[0])) {
                            $subd = array($subd);
                        }

                        foreach ($subd as $groupa) {
                            foreach ($groupa as $deptype => $depinfo) {
                                if ($deptype == 'attribs') {
                                    continue;
                                }

                                if ($deptype == 'pearinstaller') {
                                    $deptype = 'pear Installer';
                                }

                                if (!isset($depinfo[0])) {
                                    $depinfo = array($depinfo);
                                }

                                foreach ($depinfo as $inf) {
                                    $name = '';
                                    if (isset($inf['channel'])) {
                                        $alias = $reg->channelAlias($inf['channel']);
                                        if (!$alias) {
                                            $alias = '(channel?) ' .$inf['channel'];
                                        }
                                        $name = $alias . '/';

                                    }
                                    if (isset($inf['name'])) {
                                        $name .= $inf['name'];
                                    } elseif (isset($inf['pattern'])) {
                                        $name .= $inf['pattern'];
                                    } else {
                                        $name .= '';
                                    }

                                    if (isset($inf['uri'])) {
                                        $name .= ' [' . $inf['uri'] .  ']';
                                    }

                                    if (isset($inf['conflicts'])) {
                                        $ver = 'conflicts';
                                    } else {
                                        $ver = PEAR_Dependency2::_getExtraString($inf);
                                    }

                                    $data['data'][] = array($req, ucfirst($deptype), $name,
                                        $ver, $group);
                                }
                            }
                        }
                    }
                }
            }

            $this->ui->outputData($data, $command);
            return true;
        }

        // Fallback
        $this->ui->outputData("This package does not have any dependencies.", $command);
    }

    function doSign($command, $options, $params)
    {
        // should move most of this code into PEAR_Packager
        // so it'll be easy to implement "pear package --sign"
        if (count($params) !== 1) {
            return $this->raiseError("bad parameter(s), try \"help $command\"");
        }

        require_once 'System.php';
        require_once 'Archive/Tar.php';

        if (!file_exists($params[0])) {
            return $this->raiseError("file does not exist: $params[0]");
        }

        $obj = $this->getPackageFile($this->config, $this->_debug);
        $info = $obj->fromTgzFile($params[0], PEAR_VALIDATE_NORMAL);
        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        $tar = new Archive_Tar($params[0]);

        $tmpdir = $this->config->get('temp_dir');
        $tmpdir = System::mktemp(' -t "' . $tmpdir . '" -d pearsign');
        if (!$tar->extractList('package2.xml package.xml package.sig', $tmpdir)) {
            return $this->raiseError("failed to extract tar file");
        }

        if (file_exists("$tmpdir/package.sig")) {
            return $this->raiseError("package already signed");
        }

        $packagexml = 'package.xml';
        if (file_exists("$tmpdir/package2.xml")) {
            $packagexml = 'package2.xml';
        }

        if (file_exists("$tmpdir/package.sig")) {
            unlink("$tmpdir/package.sig");
        }

        if (!file_exists("$tmpdir/$packagexml")) {
            return $this->raiseError("Extracted file $tmpdir/$packagexml not found.");
        }

        $input = $this->ui->userDialog($command,
                                       array('GnuPG Passphrase'),
                                       array('password'));
        if (!isset($input[0])) {
            //use empty passphrase
            $input[0] = '';
        }

        $devnull = (isset($options['verbose'])) ? '' : ' 2>/dev/null';
        $gpg = popen("gpg --batch --passphrase-fd 0 --armor --detach-sign --output $tmpdir/package.sig $tmpdir/$packagexml" . $devnull, "w");
        if (!$gpg) {
            return $this->raiseError("gpg command failed");
        }

        fwrite($gpg, "$input[0]\n");
        if (pclose($gpg) || !file_exists("$tmpdir/package.sig")) {
            return $this->raiseError("gpg sign failed");
        }

        if (!$tar->addModify("$tmpdir/package.sig", '', $tmpdir)) {
            return $this->raiseError('failed adding signature to file');
        }

        $this->ui->outputData("Package signed.", $command);
        return true;
    }

    /**
     * For unit testing purposes
     */
    function &getInstaller(&$ui)
    {
        if (!class_exists('PEAR_Installer')) {
            require_once 'PEAR/Installer.php';
        }
        $a = new PEAR_Installer($ui);
        return $a;
    }

    /**
     * For unit testing purposes
     */
    function &getCommandPackaging(&$ui, &$config)
    {
        if (!class_exists('PEAR_Command_Packaging')) {
            if ($fp = @fopen('PEAR/Command/Packaging.php', 'r', true)) {
                fclose($fp);
                include_once 'PEAR/Command/Packaging.php';
            }
        }

        if (class_exists('PEAR_Command_Packaging')) {
            $a = new PEAR_Command_Packaging($ui, $config);
        } else {
            $a = null;
        }

        return $a;
    }

    function doMakeRPM($command, $options, $params)
    {

        // Check to see if PEAR_Command_Packaging is installed, and
        // transparently switch to use the "make-rpm-spec" command from it
        // instead, if it does. Otherwise, continue to use the old version
        // of "makerpm" supplied with this package (PEAR).
        $packaging_cmd = $this->getCommandPackaging($this->ui, $this->config);
        if ($packaging_cmd !== null) {
            $this->ui->outputData('PEAR_Command_Packaging is installed; using '.
                'newer "make-rpm-spec" command instead');
            return $packaging_cmd->run('make-rpm-spec', $options, $params);
        }

        $this->ui->outputData('WARNING: "pear makerpm" is no longer available; an '.
          'improved version is available via "pear make-rpm-spec", which '.
          'is available by installing PEAR_Command_Packaging');
        return true;
    }

    function doConvert($command, $options, $params)
    {
        $packagexml    = isset($params[0]) ? $params[0] : 'package.xml';
        $newpackagexml = isset($params[1]) ? $params[1] : dirname($packagexml) .
            DIRECTORY_SEPARATOR . 'package2.xml';
        $pkg = &$this->getPackageFile($this->config, $this->_debug);
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $pf = $pkg->fromPackageFile($packagexml, PEAR_VALIDATE_NORMAL);
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($pf)) {
            if (is_array($pf->getUserInfo())) {
                foreach ($pf->getUserInfo() as $warning) {
                    $this->ui->outputData($warning['message']);
                }
            }
            return $this->raiseError($pf);
        }

        if (is_a($pf, 'PEAR_PackageFile_v2')) {
            $this->ui->outputData($packagexml . ' is already a package.xml version 2.0');
            return true;
        }

        $gen   = &$pf->getDefaultGenerator();
        $newpf = &$gen->toV2();
        $newpf->setPackagefile($newpackagexml);
        $gen = &$newpf->getDefaultGenerator();
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $state = (isset($options['flat']) ? PEAR_VALIDATE_PACKAGING : PEAR_VALIDATE_NORMAL);
        $saved = $gen->toPackageFile(dirname($newpackagexml), $state, basename($newpackagexml));
        PEAR::staticPopErrorHandling();
        if (PEAR::isError($saved)) {
            if (is_array($saved->getUserInfo())) {
                foreach ($saved->getUserInfo() as $warning) {
                    $this->ui->outputData($warning['message']);
                }
            }

            $this->ui->outputData($saved->getMessage());
            return true;
        }

        $this->ui->outputData('Wrote new version 2.0 package.xml to "' . $saved . '"');
        return true;
    }
}
PK�a�\�X�

pear/PEAR/Command/Auth.phpnu�[���<?php
/**
 * PEAR_Command_Auth (login, logout commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 * @deprecated since 1.8.0alpha1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Channels.php';

/**
 * PEAR commands for login/logout
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 * @deprecated since 1.8.0alpha1
 */
class PEAR_Command_Auth extends PEAR_Command_Channels
{
    var $commands = array(
        'login' => array(
            'summary' => 'Connects and authenticates to remote server [Deprecated in favor of channel-login]',
            'shortcut' => 'li',
            'function' => 'doLogin',
            'options' => array(),
            'doc' => '<channel name>
WARNING: This function is deprecated in favor of using channel-login

Log in to a remote channel server.  If <channel name> is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first.  The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems).  After logging
in, your username and password will be sent along in subsequent
operations on the remote server.',
            ),
        'logout' => array(
            'summary' => 'Logs out from the remote server [Deprecated in favor of channel-logout]',
            'shortcut' => 'lo',
            'function' => 'doLogout',
            'options' => array(),
            'doc' => '
WARNING: This function is deprecated in favor of using channel-logout

Logs out from the remote server.  This command does not actually
connect to the remote server, it only deletes the stored username and
password from your user configuration.',
            )

        );

    /**
     * PEAR_Command_Auth constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }
}
PK�a�\�%sp  pear/PEAR/Command/Common.phpnu�[���<?php
/**
 * PEAR_Command_Common base class
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR.php';

/**
 * PEAR commands base class
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Common extends PEAR
{
    /**
     * PEAR_Config object used to pass user system and configuration
     * on when executing commands
     *
     * @var PEAR_Config
     */
    var $config;
    /**
     * @var PEAR_Registry
     * @access protected
     */
    var $_registry;

    /**
     * User Interface object, for all interaction with the user.
     * @var object
     */
    var $ui;

    var $_deps_rel_trans = array(
                                 'lt' => '<',
                                 'le' => '<=',
                                 'eq' => '=',
                                 'ne' => '!=',
                                 'gt' => '>',
                                 'ge' => '>=',
                                 'has' => '=='
                                 );

    var $_deps_type_trans = array(
                                  'pkg' => 'package',
                                  'ext' => 'extension',
                                  'php' => 'PHP',
                                  'prog' => 'external program',
                                  'ldlib' => 'external library for linking',
                                  'rtlib' => 'external runtime library',
                                  'os' => 'operating system',
                                  'websrv' => 'web server',
                                  'sapi' => 'SAPI backend'
                                  );

    /**
     * PEAR_Command_Common constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct();
        $this->config = &$config;
        $this->ui = &$ui;
    }

    /**
     * Return a list of all the commands defined by this class.
     * @return array list of commands
     * @access public
     */
    function getCommands()
    {
        $ret = array();
        foreach (array_keys($this->commands) as $command) {
            $ret[$command] = $this->commands[$command]['summary'];
        }

        return $ret;
    }

    /**
     * Return a list of all the command shortcuts defined by this class.
     * @return array shortcut => command
     * @access public
     */
    function getShortcuts()
    {
        $ret = array();
        foreach (array_keys($this->commands) as $command) {
            if (isset($this->commands[$command]['shortcut'])) {
                $ret[$this->commands[$command]['shortcut']] = $command;
            }
        }

        return $ret;
    }

    function getOptions($command)
    {
        $shortcuts = $this->getShortcuts();
        if (isset($shortcuts[$command])) {
            $command = $shortcuts[$command];
        }

        if (isset($this->commands[$command]) &&
              isset($this->commands[$command]['options'])) {
            return $this->commands[$command]['options'];
        }

        return null;
    }

    function getGetoptArgs($command, &$short_args, &$long_args)
    {
        $short_args = '';
        $long_args = array();
        if (empty($this->commands[$command]) || empty($this->commands[$command]['options'])) {
            return;
        }

        reset($this->commands[$command]['options']);
        foreach ($this->commands[$command]['options'] as $option => $info) {
            $larg = $sarg = '';
            if (isset($info['arg'])) {
                if ($info['arg'][0] == '(') {
                    $larg = '==';
                    $sarg = '::';
                    $arg = substr($info['arg'], 1, -1);
                } else {
                    $larg = '=';
                    $sarg = ':';
                    $arg = $info['arg'];
                }
            }

            if (isset($info['shortopt'])) {
                $short_args .= $info['shortopt'] . $sarg;
            }

            $long_args[] = $option . $larg;
        }
    }

    /**
    * Returns the help message for the given command
    *
    * @param string $command The command
    * @return mixed A fail string if the command does not have help or
    *               a two elements array containing [0]=>help string,
    *               [1]=> help string for the accepted cmd args
    */
    function getHelp($command)
    {
        $config = &PEAR_Config::singleton();
        if (!isset($this->commands[$command])) {
            return "No such command \"$command\"";
        }

        $help = null;
        if (isset($this->commands[$command]['doc'])) {
            $help = $this->commands[$command]['doc'];
        }

        if (empty($help)) {
            // XXX (cox) Fallback to summary if there is no doc (show both?)
            if (!isset($this->commands[$command]['summary'])) {
                return "No help for command \"$command\"";
            }
            $help = $this->commands[$command]['summary'];
        }

        if (preg_match_all('/{config\s+([^\}]+)}/', $help, $matches)) {
            foreach($matches[0] as $k => $v) {
                $help = preg_replace("/$v/", $config->get($matches[1][$k]), $help);
            }
        }

        return array($help, $this->getHelpArgs($command));
    }

    /**
     * Returns the help for the accepted arguments of a command
     *
     * @param  string $command
     * @return string The help string
     */
    function getHelpArgs($command)
    {
        if (isset($this->commands[$command]['options']) &&
            count($this->commands[$command]['options']))
        {
            $help = "Options:\n";
            foreach ($this->commands[$command]['options'] as $k => $v) {
                if (isset($v['arg'])) {
                    if ($v['arg'][0] == '(') {
                        $arg = substr($v['arg'], 1, -1);
                        $sapp = " [$arg]";
                        $lapp = "[=$arg]";
                    } else {
                        $sapp = " $v[arg]";
                        $lapp = "=$v[arg]";
                    }
                } else {
                    $sapp = $lapp = "";
                }

                if (isset($v['shortopt'])) {
                    $s = $v['shortopt'];
                    $help .= "  -$s$sapp, --$k$lapp\n";
                } else {
                    $help .= "  --$k$lapp\n";
                }

                $p = "        ";
                $doc = rtrim(str_replace("\n", "\n$p", $v['doc']));
                $help .= "        $doc\n";
            }

            return $help;
        }

        return null;
    }

    function run($command, $options, $params)
    {
        if (empty($this->commands[$command]['function'])) {
            // look for shortcuts
            foreach (array_keys($this->commands) as $cmd) {
                if (isset($this->commands[$cmd]['shortcut']) && $this->commands[$cmd]['shortcut'] == $command) {
                    if (empty($this->commands[$cmd]['function'])) {
                        return $this->raiseError("unknown command `$command'");
                    } else {
                        $func = $this->commands[$cmd]['function'];
                    }
                    $command = $cmd;

                    //$command = $this->commands[$cmd]['function'];
                    break;
                }
            }
        } else {
            $func = $this->commands[$command]['function'];
        }

        return $this->$func($command, $options, $params);
    }
}
PK�a�\��#S
S
pear/PEAR/Command/Build.phpnu�[���<?php
/**
 * PEAR_Command_Auth (build command)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for building extensions.
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Tomas V.V.Cox <cox@idecnet.com>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Build extends PEAR_Command_Common
{
    var $commands = array(
        'build' => array(
            'summary' => 'Build an Extension From C Source',
            'function' => 'doBuild',
            'shortcut' => 'b',
            'options' => array(
                'configureoptions' => array(
                    'shortopt' => 'D',
                    'arg' => 'OPTION1=VALUE[ OPTION2=VALUE]',
                    'doc' => 'space-delimited list of configure options',
                    ),
                ),
            'doc' => '[package.xml]
Builds one or more extensions contained in a package.'
            ),
        );

    /**
     * PEAR_Command_Build constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function doBuild($command, $options, $params)
    {
        require_once 'PEAR/Builder.php';
        if (sizeof($params) < 1) {
            $params[0] = 'package.xml';
        }

        $configureoptions = empty($options['configureoptions']) ? '' : $options['configureoptions'];
        $builder = new PEAR_Builder($configureoptions, $this->ui);
        $this->debug = $this->config->get('verbose');
        $err = $builder->build($params[0], array(&$this, 'buildCallback'));
        if (PEAR::isError($err)) {
            return $err;
        }

        return true;
    }

    function buildCallback($what, $data)
    {
        if (($what == 'cmdoutput' && $this->debug > 1) ||
            ($what == 'output' && $this->debug > 0)) {
            $this->ui->outputData(rtrim($data), 'build');
        }
    }
}
PK�a�\�P>>pear/PEAR/Command/Pickle.phpnu�[���<?php
/**
 * PEAR_Command_Pickle (pickle command)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2005-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for login/logout
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2005-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.1
 */

class PEAR_Command_Pickle extends PEAR_Command_Common
{
    var $commands = array(
        'pickle' => array(
            'summary' => 'Build PECL Package',
            'function' => 'doPackage',
            'shortcut' => 'pi',
            'options' => array(
                'nocompress' => array(
                    'shortopt' => 'Z',
                    'doc' => 'Do not gzip the package file'
                    ),
                'showname' => array(
                    'shortopt' => 'n',
                    'doc' => 'Print the name of the packaged file.',
                    ),
                ),
            'doc' => '[descfile]
Creates a PECL package from its package2.xml file.

An automatic conversion will be made to a package.xml 1.0 and written out to
disk in the current directory as "package.xml".  Note that
only simple package.xml 2.0 will be converted.  package.xml 2.0 with:

 - dependency types other than required/optional PECL package/ext/php/pearinstaller
 - more than one extsrcrelease or zendextsrcrelease
 - zendextbinrelease, extbinrelease, phprelease, or bundle release type
 - dependency groups
 - ignore tags in release filelist
 - tasks other than replace
 - custom roles

will cause pickle to fail, and output an error message.  If your package2.xml
uses any of these features, you are best off using PEAR_PackageFileManager to
generate both package.xml.
'
            ),
        );

    /**
     * PEAR_Command_Package constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    /**
     * For unit-testing ease
     *
     * @return PEAR_Packager
     */
    function &getPackager()
    {
        if (!class_exists('PEAR_Packager')) {
            require_once 'PEAR/Packager.php';
        }

        $a = new PEAR_Packager;
        return $a;
    }

    /**
     * For unit-testing ease
     *
     * @param PEAR_Config $config
     * @param bool $debug
     * @param string|null $tmpdir
     * @return PEAR_PackageFile
     */
    function &getPackageFile($config, $debug = false)
    {
        if (!class_exists('PEAR_Common')) {
            require_once 'PEAR/Common.php';
        }

        if (!class_exists('PEAR_PackageFile')) {
            require_once 'PEAR/PackageFile.php';
        }

        $a = new PEAR_PackageFile($config, $debug);
        $common = new PEAR_Common;
        $common->ui = $this->ui;
        $a->setLogger($common);
        return $a;
    }

    function doPackage($command, $options, $params)
    {
        $this->output = '';
        $pkginfofile = isset($params[0]) ? $params[0] : 'package2.xml';
        $packager = &$this->getPackager();
        if (PEAR::isError($err = $this->_convertPackage($pkginfofile))) {
            return $err;
        }

        $compress = empty($options['nocompress']) ? true : false;
        $result = $packager->package($pkginfofile, $compress, 'package.xml');
        if (PEAR::isError($result)) {
            return $this->raiseError($result);
        }

        // Don't want output, only the package file name just created
        if (isset($options['showname'])) {
            $this->ui->outputData($result, $command);
        }

        return true;
    }

    function _convertPackage($packagexml)
    {
        $pkg = &$this->getPackageFile($this->config);
        $pf2 = &$pkg->fromPackageFile($packagexml, PEAR_VALIDATE_NORMAL);
        if (!is_a($pf2, 'PEAR_PackageFile_v2')) {
            return $this->raiseError('Cannot process "' .
                $packagexml . '", is not a package.xml 2.0');
        }

        require_once 'PEAR/PackageFile/v1.php';
        $pf = new PEAR_PackageFile_v1;
        $pf->setConfig($this->config);
        if ($pf2->getPackageType() != 'extsrc' && $pf2->getPackageType() != 'zendextsrc') {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", is not an extension source package.  Using a PEAR_PackageFileManager-based ' .
            'script is an option');
        }

        if (is_array($pf2->getUsesRole())) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains custom roles.  Using a PEAR_PackageFileManager-based script or ' .
            'the convert command is an option');
        }

        if (is_array($pf2->getUsesTask())) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains custom tasks.  Using a PEAR_PackageFileManager-based script or ' .
            'the convert command is an option');
        }

        $deps = $pf2->getDependencies();
        if (isset($deps['group'])) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains dependency groups.  Using a PEAR_PackageFileManager-based script ' .
            'or the convert command is an option');
        }

        if (isset($deps['required']['subpackage']) ||
              isset($deps['optional']['subpackage'])) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains subpackage dependencies.  Using a PEAR_PackageFileManager-based  '.
            'script is an option');
        }

        if (isset($deps['required']['os'])) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains os dependencies.  Using a PEAR_PackageFileManager-based  '.
            'script is an option');
        }

        if (isset($deps['required']['arch'])) {
            return $this->raiseError('Cannot safely convert "' . $packagexml .
            '", contains arch dependencies.  Using a PEAR_PackageFileManager-based  '.
            'script is an option');
        }

        $pf->setPackage($pf2->getPackage());
        $pf->setSummary($pf2->getSummary());
        $pf->setDescription($pf2->getDescription());
        foreach ($pf2->getMaintainers() as $maintainer) {
            $pf->addMaintainer($maintainer['role'], $maintainer['handle'],
                $maintainer['name'], $maintainer['email']);
        }

        $pf->setVersion($pf2->getVersion());
        $pf->setDate($pf2->getDate());
        $pf->setLicense($pf2->getLicense());
        $pf->setState($pf2->getState());
        $pf->setNotes($pf2->getNotes());
        $pf->addPhpDep($deps['required']['php']['min'], 'ge');
        if (isset($deps['required']['php']['max'])) {
            $pf->addPhpDep($deps['required']['php']['max'], 'le');
        }

        if (isset($deps['required']['package'])) {
            if (!isset($deps['required']['package'][0])) {
                $deps['required']['package'] = array($deps['required']['package']);
            }

            foreach ($deps['required']['package'] as $dep) {
                if (!isset($dep['channel'])) {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains uri-based dependency on a package.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if ($dep['channel'] != 'pear.php.net'
                    && $dep['channel'] != 'pecl.php.net'
                    && $dep['channel'] != 'doc.php.net') {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains dependency on a non-standard channel package.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if (isset($dep['conflicts'])) {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains conflicts dependency.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if (isset($dep['exclude'])) {
                    $this->ui->outputData('WARNING: exclude tags are ignored in conversion');
                }

                if (isset($dep['min'])) {
                    $pf->addPackageDep($dep['name'], $dep['min'], 'ge');
                }

                if (isset($dep['max'])) {
                    $pf->addPackageDep($dep['name'], $dep['max'], 'le');
                }
            }
        }

        if (isset($deps['required']['extension'])) {
            if (!isset($deps['required']['extension'][0])) {
                $deps['required']['extension'] = array($deps['required']['extension']);
            }

            foreach ($deps['required']['extension'] as $dep) {
                if (isset($dep['conflicts'])) {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains conflicts dependency.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if (isset($dep['exclude'])) {
                    $this->ui->outputData('WARNING: exclude tags are ignored in conversion');
                }

                if (isset($dep['min'])) {
                    $pf->addExtensionDep($dep['name'], $dep['min'], 'ge');
                }

                if (isset($dep['max'])) {
                    $pf->addExtensionDep($dep['name'], $dep['max'], 'le');
                }
            }
        }

        if (isset($deps['optional']['package'])) {
            if (!isset($deps['optional']['package'][0])) {
                $deps['optional']['package'] = array($deps['optional']['package']);
            }

            foreach ($deps['optional']['package'] as $dep) {
                if (!isset($dep['channel'])) {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains uri-based dependency on a package.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if ($dep['channel'] != 'pear.php.net'
                    && $dep['channel'] != 'pecl.php.net'
                    && $dep['channel'] != 'doc.php.net') {
                    return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
                    ' contains dependency on a non-standard channel package.  Using a ' .
                    'PEAR_PackageFileManager-based script is an option');
                }

                if (isset($dep['exclude'])) {
                    $this->ui->outputData('WARNING: exclude tags are ignored in conversion');
                }

                if (isset($dep['min'])) {
                    $pf->addPackageDep($dep['name'], $dep['min'], 'ge', 'yes');
                }

                if (isset($dep['max'])) {
                    $pf->addPackageDep($dep['name'], $dep['max'], 'le', 'yes');
                }
            }
        }

        if (isset($deps['optional']['extension'])) {
            if (!isset($deps['optional']['extension'][0])) {
                $deps['optional']['extension'] = array($deps['optional']['extension']);
            }

            foreach ($deps['optional']['extension'] as $dep) {
                if (isset($dep['exclude'])) {
                    $this->ui->outputData('WARNING: exclude tags are ignored in conversion');
                }

                if (isset($dep['min'])) {
                    $pf->addExtensionDep($dep['name'], $dep['min'], 'ge', 'yes');
                }

                if (isset($dep['max'])) {
                    $pf->addExtensionDep($dep['name'], $dep['max'], 'le', 'yes');
                }
            }
        }

        $contents = $pf2->getContents();
        $release  = $pf2->getReleases();
        if (isset($releases[0])) {
            return $this->raiseError('Cannot safely process "' . $packagexml . '" contains '
            . 'multiple extsrcrelease/zendextsrcrelease tags.  Using a PEAR_PackageFileManager-based script ' .
            'or the convert command is an option');
        }

        if ($configoptions = $pf2->getConfigureOptions()) {
            foreach ($configoptions as $option) {
                $default = isset($option['default']) ? $option['default'] : false;
                $pf->addConfigureOption($option['name'], $option['prompt'], $default);
            }
        }

        if (isset($release['filelist']['ignore'])) {
            return $this->raiseError('Cannot safely process "' . $packagexml . '" contains '
            . 'ignore tags.  Using a PEAR_PackageFileManager-based script or the convert' .
            ' command is an option');
        }

        if (isset($release['filelist']['install']) &&
              !isset($release['filelist']['install'][0])) {
            $release['filelist']['install'] = array($release['filelist']['install']);
        }

        if (isset($contents['dir']['attribs']['baseinstalldir'])) {
            $baseinstalldir = $contents['dir']['attribs']['baseinstalldir'];
        } else {
            $baseinstalldir = false;
        }

        if (!isset($contents['dir']['file'][0])) {
            $contents['dir']['file'] = array($contents['dir']['file']);
        }

        foreach ($contents['dir']['file'] as $file) {
            if ($baseinstalldir && !isset($file['attribs']['baseinstalldir'])) {
                $file['attribs']['baseinstalldir'] = $baseinstalldir;
            }

            $processFile = $file;
            unset($processFile['attribs']);
            if (count($processFile)) {
                foreach ($processFile as $name => $task) {
                    if ($name != $pf2->getTasksNs() . ':replace') {
                        return $this->raiseError('Cannot safely process "' . $packagexml .
                        '" contains tasks other than replace.  Using a ' .
                        'PEAR_PackageFileManager-based script is an option.');
                    }
                    $file['attribs']['replace'][] = $task;
                }
            }

            if (!in_array($file['attribs']['role'], PEAR_Common::getFileRoles())) {
                return $this->raiseError('Cannot safely convert "' . $packagexml .
                '", contains custom roles.  Using a PEAR_PackageFileManager-based script ' .
                'or the convert command is an option');
            }

            if (isset($release['filelist']['install'])) {
                foreach ($release['filelist']['install'] as $installas) {
                    if ($installas['attribs']['name'] == $file['attribs']['name']) {
                        $file['attribs']['install-as'] = $installas['attribs']['as'];
                    }
                }
            }

            $pf->addFile('/', $file['attribs']['name'], $file['attribs']);
        }

        if ($pf2->getChangeLog()) {
            $this->ui->outputData('WARNING: changelog is not translated to package.xml ' .
                '1.0, use PEAR_PackageFileManager-based script if you need changelog-' .
                'translation for package.xml 1.0');
        }

        $gen = &$pf->getDefaultGenerator();
        $gen->toPackageFile('.');
    }
}
PK�a�\���s6
6
pear/PEAR/Command/Config.xmlnu�[���<commands version="1.0">
 <config-show>
  <summary>Show All Settings</summary>
  <function>doConfigShow</function>
  <shortcut>csh</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>show configuration variables for another channel</doc>
    <arg>CHAN</arg>
   </channel>
  </options>
  <doc>[layer]
Displays all configuration values.  An optional argument
may be used to tell which configuration layer to display.  Valid
configuration layers are &quot;user&quot;, &quot;system&quot; and &quot;default&quot;. To display
configurations for different channels, set the default_channel
configuration variable and run config-show again.
</doc>
 </config-show>
 <config-get>
  <summary>Show One Setting</summary>
  <function>doConfigGet</function>
  <shortcut>cg</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>show configuration variables for another channel</doc>
    <arg>CHAN</arg>
   </channel>
  </options>
  <doc>&lt;parameter&gt; [layer]
Displays the value of one configuration parameter.  The
first argument is the name of the parameter, an optional second argument
may be used to tell which configuration layer to look in.  Valid configuration
layers are &quot;user&quot;, &quot;system&quot; and &quot;default&quot;.  If no layer is specified, a value
will be picked from the first layer that defines the parameter, in the order
just specified.  The configuration value will be retrieved for the channel
specified by the default_channel configuration variable.
</doc>
 </config-get>
 <config-set>
  <summary>Change Setting</summary>
  <function>doConfigSet</function>
  <shortcut>cs</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>show configuration variables for another channel</doc>
    <arg>CHAN</arg>
   </channel>
  </options>
  <doc>&lt;parameter&gt; &lt;value&gt; [layer]
Sets the value of one configuration parameter.  The first argument is
the name of the parameter, the second argument is the new value.  Some
parameters are subject to validation, and the command will fail with
an error message if the new value does not make sense.  An optional
third argument may be used to specify in which layer to set the
configuration parameter.  The default layer is &quot;user&quot;.  The
configuration value will be set for the current channel, which
is controlled by the default_channel configuration variable.
</doc>
 </config-set>
 <config-help>
  <summary>Show Information About Setting</summary>
  <function>doConfigHelp</function>
  <shortcut>ch</shortcut>
  <options />
  <doc>[parameter]
Displays help for a configuration parameter.  Without arguments it
displays help for all configuration parameters.
</doc>
 </config-help>
 <config-create>
  <summary>Create a Default configuration file</summary>
  <function>doConfigCreate</function>
  <shortcut>coc</shortcut>
  <options>
   <windows>
    <shortopt>w</shortopt>
    <doc>create a config file for a windows install</doc>
   </windows>
  </options>
  <doc>&lt;root path&gt; &lt;filename&gt;
Create a default configuration file with all directory configuration
variables set to subdirectories of &lt;root path&gt;, and save it as &lt;filename&gt;.
This is useful especially for creating a configuration file for a remote
PEAR installation (using the --remoteconfig option of install, upgrade,
and uninstall).
</doc>
 </config-create>
</commands>PK�a�\
u���pear/PEAR/Command/Build.xmlnu�[���<commands version="1.0">
 <build>
  <summary>Build an Extension From C Source</summary>
  <function>doBuild</function>
  <shortcut>b</shortcut>
  <options>
   <configureoptions>
    <shortopt>D</shortopt>
    <arg>OPTION1=VALUE[ OPTION2=VALUE]</arg>
   </configureoptions>
  </options>
  <doc>[package.xml]
Builds one or more extensions contained in a package.</doc>
 </build>
</commands>PK�a�\�w��zzpear/PEAR/Command/Channels.xmlnu�[���<commands version="1.0">
 <list-channels>
  <summary>List Available Channels</summary>
  <function>doList</function>
  <shortcut>lc</shortcut>
  <options />
  <doc>
List all available channels for installation.
</doc>
 </list-channels>
 <update-channels>
  <summary>Update the Channel List</summary>
  <function>doUpdateAll</function>
  <shortcut>uc</shortcut>
  <options />
  <doc>
List all installed packages in all channels.
</doc>
 </update-channels>
 <channel-delete>
  <summary>Remove a Channel From the List</summary>
  <function>doDelete</function>
  <shortcut>cde</shortcut>
  <options />
  <doc>&lt;channel name&gt;
Delete a channel from the registry.  You may not
remove any channel that has installed packages.
</doc>
 </channel-delete>
 <channel-add>
  <summary>Add a Channel</summary>
  <function>doAdd</function>
  <shortcut>ca</shortcut>
  <options />
  <doc>&lt;channel.xml&gt;
Add a private channel to the channel list.  Note that all
public channels should be synced using &quot;update-channels&quot;.
Parameter may be either a local file or remote URL to a
channel.xml.
</doc>
 </channel-add>
 <channel-update>
  <summary>Update an Existing Channel</summary>
  <function>doUpdate</function>
  <shortcut>cu</shortcut>
  <options>
   <force>
    <shortopt>f</shortopt>
    <doc>will force download of new channel.xml if an existing channel name is used</doc>
   </force>
   <channel>
    <shortopt>c</shortopt>
    <doc>will force download of new channel.xml if an existing channel name is used</doc>
    <arg>CHANNEL</arg>
   </channel>
  </options>
  <doc>[&lt;channel.xml&gt;|&lt;channel name&gt;]
Update a channel in the channel list directly.  Note that all
public channels can be synced using &quot;update-channels&quot;.
Parameter may be a local or remote channel.xml, or the name of
an existing channel.
</doc>
 </channel-update>
 <channel-info>
  <summary>Retrieve Information on a Channel</summary>
  <function>doInfo</function>
  <shortcut>ci</shortcut>
  <options />
  <doc>&lt;package&gt;
List the files in an installed package.
</doc>
 </channel-info>
 <channel-alias>
  <summary>Specify an alias to a channel name</summary>
  <function>doAlias</function>
  <shortcut>cha</shortcut>
  <options />
  <doc>&lt;channel&gt; &lt;alias&gt;
Specify a specific alias to use for a channel name.
The alias may not be an existing channel name or
alias.
</doc>
 </channel-alias>
 <channel-discover>
  <summary>Initialize a Channel from its server</summary>
  <function>doDiscover</function>
  <shortcut>di</shortcut>
  <options />
  <doc>[&lt;channel.xml&gt;|&lt;channel name&gt;]
Initialize a channel from its server and create a local channel.xml.
If &lt;channel name&gt; is in the format &quot;&lt;username&gt;:&lt;password&gt;@&lt;channel&gt;&quot; then
&lt;username&gt; and &lt;password&gt; will be set as the login username/password for
&lt;channel&gt;. Use caution when passing the username/password in this way, as
it may allow other users on your computer to briefly view your username/
password via the system&#039;s process list.
</doc>
 </channel-discover>
 <channel-login>
  <summary>Connects and authenticates to remote channel server</summary>
  <function>doLogin</function>
  <shortcut>cli</shortcut>
  <options />
  <doc>&lt;channel name&gt;
Log in to a remote channel server.  If &lt;channel name&gt; is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first.  The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems).  After logging
in, your username and password will be sent along in subsequent
operations on the remote server.</doc>
 </channel-login>
 <channel-logout>
  <summary>Logs out from the remote channel server</summary>
  <function>doLogout</function>
  <shortcut>clo</shortcut>
  <options />
  <doc>&lt;channel name&gt;
Logs out from a remote channel server.  If &lt;channel name&gt; is not supplied,
the default channel is used. This command does not actually connect to the
remote server, it only deletes the stored username and password from your user
configuration.</doc>
 </channel-logout>
</commands>PK�a�\0(;rʹʹpear/PEAR/Command/Registry.phpnu�[���<?php
/**
 * PEAR_Command_Registry (list, list-files, shell-test, info commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for registry manipulation
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Registry extends PEAR_Command_Common
{
    var $commands = array(
        'list' => array(
            'summary' => 'List Installed Packages In The Default Channel',
            'function' => 'doList',
            'shortcut' => 'l',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'list installed packages from this channel',
                    'arg' => 'CHAN',
                    ),
                'allchannels' => array(
                    'shortopt' => 'a',
                    'doc' => 'list installed packages from all channels',
                    ),
                'channelinfo' => array(
                    'shortopt' => 'i',
                    'doc' => 'output fully channel-aware data, even on failure',
                    ),
                ),
            'doc' => '<package>
If invoked without parameters, this command lists the PEAR packages
installed in your php_dir ({config php_dir}).  With a parameter, it
lists the files in a package.
',
            ),
        'list-files' => array(
            'summary' => 'List Files In Installed Package',
            'function' => 'doFileList',
            'shortcut' => 'fl',
            'options' => array(),
            'doc' => '<package>
List the files in an installed package.
'
            ),
        'shell-test' => array(
            'summary' => 'Shell Script Test',
            'function' => 'doShellTest',
            'shortcut' => 'st',
            'options' => array(),
            'doc' => '<package> [[relation] version]
Tests if a package is installed in the system. Will exit(1) if it is not.
   <relation>   The version comparison operator. One of:
                <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne
   <version>    The version to compare with
'),
        'info' => array(
            'summary'  => 'Display information about a package',
            'function' => 'doInfo',
            'shortcut' => 'in',
            'options'  => array(),
            'doc'      => '<package>
Displays information about a package. The package argument may be a
local package file, an URL to a package file, or the name of an
installed package.'
            )
        );

    /**
     * PEAR_Command_Registry constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function _sortinfo($a, $b)
    {
        $apackage = isset($a['package']) ? $a['package'] : $a['name'];
        $bpackage = isset($b['package']) ? $b['package'] : $b['name'];
        return strcmp($apackage, $bpackage);
    }

    function doList($command, $options, $params)
    {
        $reg = &$this->config->getRegistry();
        $channelinfo = isset($options['channelinfo']);
        if (isset($options['allchannels']) && !$channelinfo) {
            return $this->doListAll($command, array(), $params);
        }

        if (isset($options['allchannels']) && $channelinfo) {
            // allchannels with $channelinfo
            unset($options['allchannels']);
            $channels = $reg->getChannels();
            $errors = array();
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            foreach ($channels as $channel) {
                $options['channel'] = $channel->getName();
                $ret = $this->doList($command, $options, $params);

                if (PEAR::isError($ret)) {
                    $errors[] = $ret;
                }
            }

            PEAR::staticPopErrorHandling();
            if (count($errors)) {
                // for now, only give first error
                return PEAR::raiseError($errors[0]);
            }

            return true;
        }

        if (count($params) === 1) {
            return $this->doFileList($command, $options, $params);
        }

        if (isset($options['channel'])) {
            if (!$reg->channelExists($options['channel'])) {
                return $this->raiseError('Channel "' . $options['channel'] .'" does not exist');
            }

            $channel = $reg->channelName($options['channel']);
        } else {
            $channel = $this->config->get('default_channel');
        }

        $installed = $reg->packageInfo(null, null, $channel);
        usort($installed, array(&$this, '_sortinfo'));

        $data = array(
            'caption' => 'Installed packages, channel ' .
                $channel . ':',
            'border' => true,
            'headline' => array('Package', 'Version', 'State'),
            'channel' => $channel,
            );
        if ($channelinfo) {
            $data['headline'] = array('Channel', 'Package', 'Version', 'State');
        }

        if (count($installed) && !isset($data['data'])) {
            $data['data'] = array();
        }

        foreach ($installed as $package) {
            $pobj = $reg->getPackage(isset($package['package']) ?
                                        $package['package'] : $package['name'], $channel);
            if ($channelinfo) {
                $packageinfo = array($pobj->getChannel(), $pobj->getPackage(), $pobj->getVersion(),
                                    $pobj->getState() ? $pobj->getState() : null);
            } else {
                $packageinfo = array($pobj->getPackage(), $pobj->getVersion(),
                                    $pobj->getState() ? $pobj->getState() : null);
            }
            $data['data'][] = $packageinfo;
        }

        if (count($installed) === 0) {
            if (!$channelinfo) {
                $data = '(no packages installed from channel ' . $channel . ')';
            } else {
                $data = array(
                    'caption' => 'Installed packages, channel ' .
                        $channel . ':',
                    'border' => true,
                    'channel' => $channel,
                    'data' => array(array('(no packages installed)')),
                );
            }
        }

        $this->ui->outputData($data, $command);
        return true;
    }

    function doListAll($command, $options, $params)
    {
        // This duplicate code is deprecated over
        // list --channelinfo, which gives identical
        // output for list and list --allchannels.
        $reg = &$this->config->getRegistry();
        $installed = $reg->packageInfo(null, null, null);
        foreach ($installed as $channel => $packages) {
            usort($packages, array($this, '_sortinfo'));
            $data = array(
                'caption'  => 'Installed packages, channel ' . $channel . ':',
                'border'   => true,
                'headline' => array('Package', 'Version', 'State'),
                'channel'  => $channel
            );

            foreach ($packages as $package) {
                $p = isset($package['package']) ? $package['package'] : $package['name'];
                $pobj = $reg->getPackage($p, $channel);
                $data['data'][] = array($pobj->getPackage(), $pobj->getVersion(),
                                        $pobj->getState() ? $pobj->getState() : null);
            }

            // Adds a blank line after each section
            $data['data'][] = array();

            if (count($packages) === 0) {
                $data = array(
                    'caption' => 'Installed packages, channel ' . $channel . ':',
                    'border' => true,
                    'data' => array(array('(no packages installed)'), array()),
                    'channel' => $channel
                    );
            }
            $this->ui->outputData($data, $command);
        }
        return true;
    }

    function doFileList($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError('list-files expects 1 parameter');
        }

        $reg = &$this->config->getRegistry();
        $fp = false;
        if (!is_dir($params[0]) && (file_exists($params[0]) || $fp = @fopen($params[0], 'r'))) {
            if ($fp) {
                fclose($fp);
            }

            if (!class_exists('PEAR_PackageFile')) {
                require_once 'PEAR/PackageFile.php';
            }

            $pkg = new PEAR_PackageFile($this->config, $this->_debug);
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $info = &$pkg->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL);
            PEAR::staticPopErrorHandling();
            $headings = array('Package File', 'Install Path');
            $installed = false;
        } else {
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel'));
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($parsed)) {
                return $this->raiseError($parsed);
            }

            $info = &$reg->getPackage($parsed['package'], $parsed['channel']);
            $headings = array('Type', 'Install Path');
            $installed = true;
        }

        if (PEAR::isError($info)) {
            return $this->raiseError($info);
        }

        if ($info === null) {
            return $this->raiseError("`$params[0]' not installed");
        }

        $list = ($info->getPackagexmlVersion() == '1.0' || $installed) ?
            $info->getFilelist() : $info->getContents();
        if ($installed) {
            $caption = 'Installed Files For ' . $params[0];
        } else {
            $caption = 'Contents of ' . basename($params[0]);
        }

        $data = array(
            'caption' => $caption,
            'border' => true,
            'headline' => $headings);
        if ($info->getPackagexmlVersion() == '1.0' || $installed) {
            foreach ($list as $file => $att) {
                if ($installed) {
                    if (empty($att['installed_as'])) {
                        continue;
                    }
                    $data['data'][] = array($att['role'], $att['installed_as']);
                } else {
                    if (isset($att['baseinstalldir']) && !in_array($att['role'],
                          array('test', 'data', 'doc'))) {
                        $dest = $att['baseinstalldir'] . DIRECTORY_SEPARATOR .
                            $file;
                    } else {
                        $dest = $file;
                    }
                    switch ($att['role']) {
                        case 'test':
                        case 'data':
                        case 'doc':
                            $role = $att['role'];
                            if ($role == 'test') {
                                $role .= 's';
                            }
                            $dest = $this->config->get($role . '_dir') . DIRECTORY_SEPARATOR .
                                $info->getPackage() . DIRECTORY_SEPARATOR . $dest;
                            break;
                        case 'php':
                        default:
                            $dest = $this->config->get('php_dir') . DIRECTORY_SEPARATOR .
                                $dest;
                    }
                    $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR;
                    $dest = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"),
                                                    array(DIRECTORY_SEPARATOR,
                                                          DIRECTORY_SEPARATOR,
                                                          DIRECTORY_SEPARATOR),
                                                    $dest);
                    $file = preg_replace('!/+!', '/', $file);
                    $data['data'][] = array($file, $dest);
                }
            }
        } else { // package.xml 2.0, not installed
            if (!isset($list['dir']['file'][0])) {
                $list['dir']['file'] = array($list['dir']['file']);
            }

            foreach ($list['dir']['file'] as $att) {
                $att = $att['attribs'];
                $file = $att['name'];
                $role = &PEAR_Installer_Role::factory($info, $att['role'], $this->config);
                $role->setup($this, $info, $att, $file);
                if (!$role->isInstallable()) {
                    $dest = '(not installable)';
                } else {
                    $dest = $role->processInstallation($info, $att, $file, '');
                    if (PEAR::isError($dest)) {
                        $dest = '(Unknown role "' . $att['role'] . ')';
                    } else {
                        list(,, $dest) = $dest;
                    }
                }
                $data['data'][] = array($file, $dest);
            }
        }

        $this->ui->outputData($data, $command);
        return true;
    }

    function doShellTest($command, $options, $params)
    {
        if (count($params) < 1) {
            return PEAR::raiseError('ERROR, usage: pear shell-test packagename [[relation] version]');
        }

        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $reg = &$this->config->getRegistry();
        $info = $reg->parsePackageName($params[0], $this->config->get('default_channel'));
        if (PEAR::isError($info)) {
            exit(1); // invalid package name
        }

        $package = $info['package'];
        $channel = $info['channel'];
        // "pear shell-test Foo"
        if (!$reg->packageExists($package, $channel)) {
            if ($channel == 'pecl.php.net') {
                if ($reg->packageExists($package, 'pear.php.net')) {
                    $channel = 'pear.php.net'; // magically change channels for extensions
                }
            }
        }

        if (count($params) === 1) {
            if (!$reg->packageExists($package, $channel)) {
                exit(1);
            }
            // "pear shell-test Foo 1.0"
        } elseif (count($params) === 2) {
            $v = $reg->packageInfo($package, 'version', $channel);
            if (!$v || !version_compare("$v", "{$params[1]}", "ge")) {
                exit(1);
            }
            // "pear shell-test Foo ge 1.0"
        } elseif (count($params) === 3) {
            $v = $reg->packageInfo($package, 'version', $channel);
            if (!$v || !version_compare("$v", "{$params[2]}", $params[1])) {
                exit(1);
            }
        } else {
            PEAR::staticPopErrorHandling();
            $this->raiseError("$command: expects 1 to 3 parameters");
            exit(1);
        }
    }

    function doInfo($command, $options, $params)
    {
        if (count($params) !== 1) {
            return $this->raiseError('pear info expects 1 parameter');
        }

        $info = $fp = false;
        $reg = &$this->config->getRegistry();
        if (is_file($params[0]) && !is_dir($params[0]) &&
            (file_exists($params[0]) || $fp = @fopen($params[0], 'r'))
        ) {
            if ($fp) {
                fclose($fp);
            }

            if (!class_exists('PEAR_PackageFile')) {
                require_once 'PEAR/PackageFile.php';
            }

            $pkg = new PEAR_PackageFile($this->config, $this->_debug);
            PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
            $obj = &$pkg->fromAnyFile($params[0], PEAR_VALIDATE_NORMAL);
            PEAR::staticPopErrorHandling();
            if (PEAR::isError($obj)) {
                $uinfo = $obj->getUserInfo();
                if (is_array($uinfo)) {
                    foreach ($uinfo as $message) {
                        if (is_array($message)) {
                            $message = $message['message'];
                        }
                        $this->ui->outputData($message);
                    }
                }

                return $this->raiseError($obj);
            }

            if ($obj->getPackagexmlVersion() != '1.0') {
                return $this->_doInfo2($command, $options, $params, $obj, false);
            }

            $info = $obj->toArray();
        } else {
            $parsed = $reg->parsePackageName($params[0], $this->config->get('default_channel'));
            if (PEAR::isError($parsed)) {
                return $this->raiseError($parsed);
            }

            $package = $parsed['package'];
            $channel = $parsed['channel'];
            $info = $reg->packageInfo($package, null, $channel);
            if (isset($info['old'])) {
                $obj = $reg->getPackage($package, $channel);
                return $this->_doInfo2($command, $options, $params, $obj, true);
            }
        }

        if (PEAR::isError($info)) {
            return $info;
        }

        if (empty($info)) {
            $this->raiseError("No information found for `$params[0]'");
            return;
        }

        unset($info['filelist']);
        unset($info['dirtree']);
        unset($info['changelog']);
        if (isset($info['xsdversion'])) {
            $info['package.xml version'] = $info['xsdversion'];
            unset($info['xsdversion']);
        }

        if (isset($info['packagerversion'])) {
            $info['packaged with PEAR version'] = $info['packagerversion'];
            unset($info['packagerversion']);
        }

        $keys = array_keys($info);
        $longtext = array('description', 'summary');
        foreach ($keys as $key) {
            if (is_array($info[$key])) {
                switch ($key) {
                    case 'maintainers': {
                        $i = 0;
                        $mstr = '';
                        foreach ($info[$key] as $m) {
                            if ($i++ > 0) {
                                $mstr .= "\n";
                            }
                            $mstr .= $m['name'] . " <";
                            if (isset($m['email'])) {
                                $mstr .= $m['email'];
                            } else {
                                $mstr .= $m['handle'] . '@php.net';
                            }
                            $mstr .= "> ($m[role])";
                        }
                        $info[$key] = $mstr;
                        break;
                    }
                    case 'release_deps': {
                        $i = 0;
                        $dstr = '';
                        foreach ($info[$key] as $d) {
                            if (isset($this->_deps_rel_trans[$d['rel']])) {
                                $rel = $this->_deps_rel_trans[$d['rel']];
                            } else {
                                $rel = $d['rel'];
                            }
                            if (isset($this->_deps_type_trans[$d['type']])) {
                                $type = ucfirst($this->_deps_type_trans[$d['type']]);
                            } else {
                                $type = $d['type'];
                            }
                            if (isset($d['name'])) {
                                $name = $d['name'] . ' ';
                            } else {
                                $name = '';
                            }
                            if (isset($d['version'])) {
                                $version = $d['version'] . ' ';
                            } else {
                                $version = '';
                            }
                            if (isset($d['optional']) && $d['optional'] == 'yes') {
                                $optional = ' (optional)';
                            } else {
                                $optional = '';
                            }
                            $dstr .= "$type $name$rel $version$optional\n";
                        }
                        $info[$key] = $dstr;
                        break;
                    }
                    case 'provides' : {
                        $debug = $this->config->get('verbose');
                        if ($debug < 2) {
                            $pstr = 'Classes: ';
                        } else {
                            $pstr = '';
                        }
                        $i = 0;
                        foreach ($info[$key] as $p) {
                            if ($debug < 2 && $p['type'] != "class") {
                                continue;
                            }
                            // Only print classes when verbosity mode is < 2
                            if ($debug < 2) {
                                if ($i++ > 0) {
                                    $pstr .= ", ";
                                }
                                $pstr .= $p['name'];
                            } else {
                                if ($i++ > 0) {
                                    $pstr .= "\n";
                                }
                                $pstr .= ucfirst($p['type']) . " " . $p['name'];
                                if (isset($p['explicit']) && $p['explicit'] == 1) {
                                    $pstr .= " (explicit)";
                                }
                            }
                        }
                        $info[$key] = $pstr;
                        break;
                    }
                    case 'configure_options' : {
                        foreach ($info[$key] as $i => $p) {
                            $info[$key][$i] = array_map(null, array_keys($p), array_values($p));
                            $info[$key][$i] = array_map(
                                function($a) { return join(" = ", $a); },
                                $info[$key][$i]);
                            $info[$key][$i] = implode(', ', $info[$key][$i]);
                        }
                        $info[$key] = implode("\n", $info[$key]);
                        break;
                    }
                    default: {
                        $info[$key] = implode(", ", $info[$key]);
                        break;
                    }
                }
            }

            if ($key == '_lastmodified') {
                $hdate = date('Y-m-d', $info[$key]);
                unset($info[$key]);
                $info['Last Modified'] = $hdate;
            } elseif ($key == '_lastversion') {
                $info['Previous Installed Version'] = $info[$key] ? $info[$key] : '- None -';
                unset($info[$key]);
            } else {
                $info[$key] = trim($info[$key]);
                if (in_array($key, $longtext)) {
                    $info[$key] = preg_replace('/  +/', ' ', $info[$key]);
                }
            }
        }

        $caption = 'About ' . $info['package'] . '-' . $info['version'];
        $data = array(
            'caption' => $caption,
            'border' => true);
        foreach ($info as $key => $value) {
            $key = ucwords(trim(str_replace('_', ' ', $key)));
            $data['data'][] = array($key, $value);
        }
        $data['raw'] = $info;

        $this->ui->outputData($data, 'package-info');
    }

    /**
     * @access private
     */
    function _doInfo2($command, $options, $params, &$obj, $installed)
    {
        $reg = &$this->config->getRegistry();
        $caption = 'About ' . $obj->getChannel() . '/' .$obj->getPackage() . '-' .
            $obj->getVersion();
        $data = array(
            'caption' => $caption,
            'border' => true);
        switch ($obj->getPackageType()) {
            case 'php' :
                $release = 'PEAR-style PHP-based Package';
            break;
            case 'extsrc' :
                $release = 'PECL-style PHP extension (source code)';
            break;
            case 'zendextsrc' :
                $release = 'PECL-style Zend extension (source code)';
            break;
            case 'extbin' :
                $release = 'PECL-style PHP extension (binary)';
            break;
            case 'zendextbin' :
                $release = 'PECL-style Zend extension (binary)';
            break;
            case 'bundle' :
                $release = 'Package bundle (collection of packages)';
            break;
        }
        $extends = $obj->getExtends();
        $extends = $extends ?
            $obj->getPackage() . ' (extends ' . $extends . ')' : $obj->getPackage();
        if ($src = $obj->getSourcePackage()) {
            $extends .= ' (source package ' . $src['channel'] . '/' . $src['package'] . ')';
        }

        $info = array(
            'Release Type' => $release,
            'Name' => $extends,
            'Channel' => $obj->getChannel(),
            'Summary' => preg_replace('/  +/', ' ', $obj->getSummary()),
            'Description' => preg_replace('/  +/', ' ', $obj->getDescription()),
            );
        $info['Maintainers'] = '';
        foreach (array('lead', 'developer', 'contributor', 'helper') as $role) {
            $leads = $obj->{"get{$role}s"}();
            if (!$leads) {
                continue;
            }

            if (isset($leads['active'])) {
                $leads = array($leads);
            }

            foreach ($leads as $lead) {
                if (!empty($info['Maintainers'])) {
                    $info['Maintainers'] .= "\n";
                }

                $active = $lead['active'] == 'no' ? ', inactive' : '';
                $info['Maintainers'] .= $lead['name'] . ' <';
                $info['Maintainers'] .= $lead['email'] . "> ($role$active)";
            }
        }

        $info['Release Date'] = $obj->getDate();
        if ($time = $obj->getTime()) {
            $info['Release Date'] .= ' ' . $time;
        }

        $info['Release Version'] = $obj->getVersion() . ' (' . $obj->getState() . ')';
        $info['API Version'] = $obj->getVersion('api') . ' (' . $obj->getState('api') . ')';
        $info['License'] = $obj->getLicense();
        $uri = $obj->getLicenseLocation();
        if ($uri) {
            if (isset($uri['uri'])) {
                $info['License'] .= ' (' . $uri['uri'] . ')';
            } else {
                $extra = $obj->getInstalledLocation($info['filesource']);
                if ($extra) {
                    $info['License'] .= ' (' . $uri['filesource'] . ')';
                }
            }
        }

        $info['Release Notes'] = $obj->getNotes();
        if ($compat = $obj->getCompatible()) {
            if (!isset($compat[0])) {
                $compat = array($compat);
            }

            $info['Compatible with'] = '';
            foreach ($compat as $package) {
                $info['Compatible with'] .= $package['channel'] . '/' . $package['name'] .
                    "\nVersions >= " . $package['min'] . ', <= ' . $package['max'];
                if (isset($package['exclude'])) {
                    if (is_array($package['exclude'])) {
                        $package['exclude'] = implode(', ', $package['exclude']);
                    }

                    if (!isset($info['Not Compatible with'])) {
                        $info['Not Compatible with'] = '';
                    } else {
                        $info['Not Compatible with'] .= "\n";
                    }
                    $info['Not Compatible with'] .= $package['channel'] . '/' .
                        $package['name'] . "\nVersions " . $package['exclude'];
                }
            }
        }

        $usesrole = $obj->getUsesrole();
        if ($usesrole) {
            if (!isset($usesrole[0])) {
                $usesrole = array($usesrole);
            }

            foreach ($usesrole as $roledata) {
                if (isset($info['Uses Custom Roles'])) {
                    $info['Uses Custom Roles'] .= "\n";
                } else {
                    $info['Uses Custom Roles'] = '';
                }

                if (isset($roledata['package'])) {
                    $rolepackage = $reg->parsedPackageNameToString($roledata, true);
                } else {
                    $rolepackage = $roledata['uri'];
                }
                $info['Uses Custom Roles'] .= $roledata['role'] . ' (' . $rolepackage . ')';
            }
        }

        $usestask = $obj->getUsestask();
        if ($usestask) {
            if (!isset($usestask[0])) {
                $usestask = array($usestask);
            }

            foreach ($usestask as $taskdata) {
                if (isset($info['Uses Custom Tasks'])) {
                    $info['Uses Custom Tasks'] .= "\n";
                } else {
                    $info['Uses Custom Tasks'] = '';
                }

                if (isset($taskdata['package'])) {
                    $taskpackage = $reg->parsedPackageNameToString($taskdata, true);
                } else {
                    $taskpackage = $taskdata['uri'];
                }
                $info['Uses Custom Tasks'] .= $taskdata['task'] . ' (' . $taskpackage . ')';
            }
        }

        $deps = $obj->getDependencies();
        $info['Required Dependencies'] = 'PHP version ' . $deps['required']['php']['min'];
        if (isset($deps['required']['php']['max'])) {
            $info['Required Dependencies'] .= '-' . $deps['required']['php']['max'] . "\n";
        } else {
            $info['Required Dependencies'] .= "\n";
        }

        if (isset($deps['required']['php']['exclude'])) {
            if (!isset($info['Not Compatible with'])) {
                $info['Not Compatible with'] = '';
            } else {
                $info['Not Compatible with'] .= "\n";
            }

            if (is_array($deps['required']['php']['exclude'])) {
                $deps['required']['php']['exclude'] =
                    implode(', ', $deps['required']['php']['exclude']);
            }
            $info['Not Compatible with'] .= "PHP versions\n  " .
                $deps['required']['php']['exclude'];
        }

        $info['Required Dependencies'] .= 'PEAR installer version';
        if (isset($deps['required']['pearinstaller']['max'])) {
            $info['Required Dependencies'] .= 's ' .
                $deps['required']['pearinstaller']['min'] . '-' .
                $deps['required']['pearinstaller']['max'];
        } else {
            $info['Required Dependencies'] .= ' ' .
                $deps['required']['pearinstaller']['min'] . ' or newer';
        }

        if (isset($deps['required']['pearinstaller']['exclude'])) {
            if (!isset($info['Not Compatible with'])) {
                $info['Not Compatible with'] = '';
            } else {
                $info['Not Compatible with'] .= "\n";
            }

            if (is_array($deps['required']['pearinstaller']['exclude'])) {
                $deps['required']['pearinstaller']['exclude'] =
                    implode(', ', $deps['required']['pearinstaller']['exclude']);
            }
            $info['Not Compatible with'] .= "PEAR installer\n  Versions " .
                $deps['required']['pearinstaller']['exclude'];
        }

        foreach (array('Package', 'Extension') as $type) {
            $index = strtolower($type);
            if (isset($deps['required'][$index])) {
                if (isset($deps['required'][$index]['name'])) {
                    $deps['required'][$index] = array($deps['required'][$index]);
                }

                foreach ($deps['required'][$index] as $package) {
                    if (isset($package['conflicts'])) {
                        $infoindex = 'Not Compatible with';
                        if (!isset($info['Not Compatible with'])) {
                            $info['Not Compatible with'] = '';
                        } else {
                            $info['Not Compatible with'] .= "\n";
                        }
                    } else {
                        $infoindex = 'Required Dependencies';
                        $info[$infoindex] .= "\n";
                    }

                    if ($index == 'extension') {
                        $name = $package['name'];
                    } else {
                        if (isset($package['channel'])) {
                            $name = $package['channel'] . '/' . $package['name'];
                        } else {
                            $name = '__uri/' . $package['name'] . ' (static URI)';
                        }
                    }

                    $info[$infoindex] .= "$type $name";
                    if (isset($package['uri'])) {
                        $info[$infoindex] .= "\n  Download URI: $package[uri]";
                        continue;
                    }

                    if (isset($package['max']) && isset($package['min'])) {
                        $info[$infoindex] .= " \n  Versions " .
                            $package['min'] . '-' . $package['max'];
                    } elseif (isset($package['min'])) {
                        $info[$infoindex] .= " \n  Version " .
                            $package['min'] . ' or newer';
                    } elseif (isset($package['max'])) {
                        $info[$infoindex] .= " \n  Version " .
                            $package['max'] . ' or older';
                    }

                    if (isset($package['recommended'])) {
                        $info[$infoindex] .= "\n  Recommended version: $package[recommended]";
                    }

                    if (isset($package['exclude'])) {
                        if (!isset($info['Not Compatible with'])) {
                            $info['Not Compatible with'] = '';
                        } else {
                            $info['Not Compatible with'] .= "\n";
                        }

                        if (is_array($package['exclude'])) {
                            $package['exclude'] = implode(', ', $package['exclude']);
                        }

                        $package['package'] = $package['name']; // for parsedPackageNameToString
                         if (isset($package['conflicts'])) {
                            $info['Not Compatible with'] .= '=> except ';
                        }
                       $info['Not Compatible with'] .= 'Package ' .
                            $reg->parsedPackageNameToString($package, true);
                        $info['Not Compatible with'] .= "\n  Versions " . $package['exclude'];
                    }
                }
            }
        }

        if (isset($deps['required']['os'])) {
            if (isset($deps['required']['os']['name'])) {
                $dep['required']['os']['name'] = array($dep['required']['os']['name']);
            }

            foreach ($dep['required']['os'] as $os) {
                if (isset($os['conflicts']) && $os['conflicts'] == 'yes') {
                    if (!isset($info['Not Compatible with'])) {
                        $info['Not Compatible with'] = '';
                    } else {
                        $info['Not Compatible with'] .= "\n";
                    }
                    $info['Not Compatible with'] .= "$os[name] Operating System";
                } else {
                    $info['Required Dependencies'] .= "\n";
                    $info['Required Dependencies'] .= "$os[name] Operating System";
                }
            }
        }

        if (isset($deps['required']['arch'])) {
            if (isset($deps['required']['arch']['pattern'])) {
                $dep['required']['arch']['pattern'] = array($dep['required']['os']['pattern']);
            }

            foreach ($dep['required']['arch'] as $os) {
                if (isset($os['conflicts']) && $os['conflicts'] == 'yes') {
                    if (!isset($info['Not Compatible with'])) {
                        $info['Not Compatible with'] = '';
                    } else {
                        $info['Not Compatible with'] .= "\n";
                    }
                    $info['Not Compatible with'] .= "OS/Arch matching pattern '/$os[pattern]/'";
                } else {
                    $info['Required Dependencies'] .= "\n";
                    $info['Required Dependencies'] .= "OS/Arch matching pattern '/$os[pattern]/'";
                }
            }
        }

        if (isset($deps['optional'])) {
            foreach (array('Package', 'Extension') as $type) {
                $index = strtolower($type);
                if (isset($deps['optional'][$index])) {
                    if (isset($deps['optional'][$index]['name'])) {
                        $deps['optional'][$index] = array($deps['optional'][$index]);
                    }

                    foreach ($deps['optional'][$index] as $package) {
                        if (isset($package['conflicts']) && $package['conflicts'] == 'yes') {
                            $infoindex = 'Not Compatible with';
                            if (!isset($info['Not Compatible with'])) {
                                $info['Not Compatible with'] = '';
                            } else {
                                $info['Not Compatible with'] .= "\n";
                            }
                        } else {
                            $infoindex = 'Optional Dependencies';
                            if (!isset($info['Optional Dependencies'])) {
                                $info['Optional Dependencies'] = '';
                            } else {
                                $info['Optional Dependencies'] .= "\n";
                            }
                        }

                        if ($index == 'extension') {
                            $name = $package['name'];
                        } else {
                            if (isset($package['channel'])) {
                                $name = $package['channel'] . '/' . $package['name'];
                            } else {
                                $name = '__uri/' . $package['name'] . ' (static URI)';
                            }
                        }

                        $info[$infoindex] .= "$type $name";
                        if (isset($package['uri'])) {
                            $info[$infoindex] .= "\n  Download URI: $package[uri]";
                            continue;
                        }

                        if ($infoindex == 'Not Compatible with') {
                            // conflicts is only used to say that all versions conflict
                            continue;
                        }

                        if (isset($package['max']) && isset($package['min'])) {
                            $info[$infoindex] .= " \n  Versions " .
                                $package['min'] . '-' . $package['max'];
                        } elseif (isset($package['min'])) {
                            $info[$infoindex] .= " \n  Version " .
                                $package['min'] . ' or newer';
                        } elseif (isset($package['max'])) {
                            $info[$infoindex] .= " \n  Version " .
                                $package['min'] . ' or older';
                        }

                        if (isset($package['recommended'])) {
                            $info[$infoindex] .= "\n  Recommended version: $package[recommended]";
                        }

                        if (isset($package['exclude'])) {
                            if (!isset($info['Not Compatible with'])) {
                                $info['Not Compatible with'] = '';
                            } else {
                                $info['Not Compatible with'] .= "\n";
                            }

                            if (is_array($package['exclude'])) {
                                $package['exclude'] = implode(', ', $package['exclude']);
                            }

                            $info['Not Compatible with'] .= "Package $package\n  Versions " .
                                $package['exclude'];
                        }
                    }
                }
            }
        }

        if (isset($deps['group'])) {
            if (!isset($deps['group'][0])) {
                $deps['group'] = array($deps['group']);
            }

            foreach ($deps['group'] as $group) {
                $info['Dependency Group ' . $group['attribs']['name']] = $group['attribs']['hint'];
                $groupindex = $group['attribs']['name'] . ' Contents';
                $info[$groupindex] = '';
                foreach (array('Package', 'Extension') as $type) {
                    $index = strtolower($type);
                    if (isset($group[$index])) {
                        if (isset($group[$index]['name'])) {
                            $group[$index] = array($group[$index]);
                        }

                        foreach ($group[$index] as $package) {
                            if (!empty($info[$groupindex])) {
                                $info[$groupindex] .= "\n";
                            }

                            if ($index == 'extension') {
                                $name = $package['name'];
                            } else {
                                if (isset($package['channel'])) {
                                    $name = $package['channel'] . '/' . $package['name'];
                                } else {
                                    $name = '__uri/' . $package['name'] . ' (static URI)';
                                }
                            }

                            if (isset($package['uri'])) {
                                if (isset($package['conflicts']) && $package['conflicts'] == 'yes') {
                                    $info[$groupindex] .= "Not Compatible with $type $name";
                                } else {
                                    $info[$groupindex] .= "$type $name";
                                }

                                $info[$groupindex] .= "\n  Download URI: $package[uri]";
                                continue;
                            }

                            if (isset($package['conflicts']) && $package['conflicts'] == 'yes') {
                                $info[$groupindex] .= "Not Compatible with $type $name";
                                continue;
                            }

                            $info[$groupindex] .= "$type $name";
                            if (isset($package['max']) && isset($package['min'])) {
                                $info[$groupindex] .= " \n  Versions " .
                                    $package['min'] . '-' . $package['max'];
                            } elseif (isset($package['min'])) {
                                $info[$groupindex] .= " \n  Version " .
                                    $package['min'] . ' or newer';
                            } elseif (isset($package['max'])) {
                                $info[$groupindex] .= " \n  Version " .
                                    $package['min'] . ' or older';
                            }

                            if (isset($package['recommended'])) {
                                $info[$groupindex] .= "\n  Recommended version: $package[recommended]";
                            }

                            if (isset($package['exclude'])) {
                                if (!isset($info['Not Compatible with'])) {
                                    $info['Not Compatible with'] = '';
                                } else {
                                    $info[$groupindex] .= "Not Compatible with\n";
                                }

                                if (is_array($package['exclude'])) {
                                    $package['exclude'] = implode(', ', $package['exclude']);
                                }
                                $info[$groupindex] .= "  Package $package\n  Versions " .
                                    $package['exclude'];
                            }
                        }
                    }
                }
            }
        }

        if ($obj->getPackageType() == 'bundle') {
            $info['Bundled Packages'] = '';
            foreach ($obj->getBundledPackages() as $package) {
                if (!empty($info['Bundled Packages'])) {
                    $info['Bundled Packages'] .= "\n";
                }

                if (isset($package['uri'])) {
                    $info['Bundled Packages'] .= '__uri/' . $package['name'];
                    $info['Bundled Packages'] .= "\n  (URI: $package[uri]";
                } else {
                    $info['Bundled Packages'] .= $package['channel'] . '/' . $package['name'];
                }
            }
        }

        $info['package.xml version'] = '2.0';
        if ($installed) {
            if ($obj->getLastModified()) {
                $info['Last Modified'] = date('Y-m-d H:i', $obj->getLastModified());
            }

            $v = $obj->getLastInstalledVersion();
            $info['Previous Installed Version'] = $v ? $v : '- None -';
        }

        foreach ($info as $key => $value) {
            $data['data'][] = array($key, $value);
        }

        $data['raw'] = $obj->getArray(); // no validation needed
        $this->ui->outputData($data, 'package-info');
    }
}
PK�a�\�z��k<k<pear/PEAR/Command/Config.phpnu�[���<?php
/**
 * PEAR_Command_Config (config-show, config-get, config-set, config-help, config-create commands)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for managing configuration data.
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Command_Config extends PEAR_Command_Common
{
    var $commands = array(
        'config-show' => array(
            'summary' => 'Show All Settings',
            'function' => 'doConfigShow',
            'shortcut' => 'csh',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'show configuration variables for another channel',
                    'arg' => 'CHAN',
                    ),
),
            'doc' => '[layer]
Displays all configuration values.  An optional argument
may be used to tell which configuration layer to display.  Valid
configuration layers are "user", "system" and "default". To display
configurations for different channels, set the default_channel
configuration variable and run config-show again.
',
            ),
        'config-get' => array(
            'summary' => 'Show One Setting',
            'function' => 'doConfigGet',
            'shortcut' => 'cg',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'show configuration variables for another channel',
                    'arg' => 'CHAN',
                    ),
),
            'doc' => '<parameter> [layer]
Displays the value of one configuration parameter.  The
first argument is the name of the parameter, an optional second argument
may be used to tell which configuration layer to look in.  Valid configuration
layers are "user", "system" and "default".  If no layer is specified, a value
will be picked from the first layer that defines the parameter, in the order
just specified.  The configuration value will be retrieved for the channel
specified by the default_channel configuration variable.
',
            ),
        'config-set' => array(
            'summary' => 'Change Setting',
            'function' => 'doConfigSet',
            'shortcut' => 'cs',
            'options' => array(
                'channel' => array(
                    'shortopt' => 'c',
                    'doc' => 'show configuration variables for another channel',
                    'arg' => 'CHAN',
                    ),
),
            'doc' => '<parameter> <value> [layer]
Sets the value of one configuration parameter.  The first argument is
the name of the parameter, the second argument is the new value.  Some
parameters are subject to validation, and the command will fail with
an error message if the new value does not make sense.  An optional
third argument may be used to specify in which layer to set the
configuration parameter.  The default layer is "user".  The
configuration value will be set for the current channel, which
is controlled by the default_channel configuration variable.
',
            ),
        'config-help' => array(
            'summary' => 'Show Information About Setting',
            'function' => 'doConfigHelp',
            'shortcut' => 'ch',
            'options' => array(),
            'doc' => '[parameter]
Displays help for a configuration parameter.  Without arguments it
displays help for all configuration parameters.
',
           ),
        'config-create' => array(
            'summary' => 'Create a Default configuration file',
            'function' => 'doConfigCreate',
            'shortcut' => 'coc',
            'options' => array(
                'windows' => array(
                    'shortopt' => 'w',
                    'doc' => 'create a config file for a windows install',
                    ),
            ),
            'doc' => '<root path> <filename>
Create a default configuration file with all directory configuration
variables set to subdirectories of <root path>, and save it as <filename>.
This is useful especially for creating a configuration file for a remote
PEAR installation (using the --remoteconfig option of install, upgrade,
and uninstall).
',
            ),
        );

    /**
     * PEAR_Command_Config constructor.
     *
     * @access public
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    function doConfigShow($command, $options, $params)
    {
        $layer = null;
        if (is_array($params)) {
            $layer = isset($params[0]) ? $params[0] : null;
        }

        // $params[0] -> the layer
        if ($error = $this->_checkLayer($layer)) {
            return $this->raiseError("config-show:$error");
        }

        $keys = $this->config->getKeys();
        sort($keys);
        $channel = isset($options['channel']) ? $options['channel'] :
            $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        if (!$reg->channelExists($channel)) {
            return $this->raiseError('Channel "' . $channel . '" does not exist');
        }

        $channel = $reg->channelName($channel);
        $data = array('caption' => 'Configuration (channel ' . $channel . '):');
        foreach ($keys as $key) {
            $type = $this->config->getType($key);
            $value = $this->config->get($key, $layer, $channel);
            if ($type == 'password' && $value) {
                $value = '********';
            }

            if ($value === false) {
                $value = 'false';
            } elseif ($value === true) {
                $value = 'true';
            }

            $data['data'][$this->config->getGroup($key)][] = array($this->config->getPrompt($key) , $key, $value);
        }

        foreach ($this->config->getLayers() as $layer) {
            $data['data']['Config Files'][] = array(ucfirst($layer) . ' Configuration File', 'Filename' , $this->config->getConfFile($layer));
        }

        $this->ui->outputData($data, $command);
        return true;
    }

    function doConfigGet($command, $options, $params)
    {
        $args_cnt = is_array($params) ? count($params) : 0;
        switch ($args_cnt) {
            case 1:
                $config_key = $params[0];
                $layer = null;
                break;
            case 2:
                $config_key = $params[0];
                $layer = $params[1];
                if ($error = $this->_checkLayer($layer)) {
                    return $this->raiseError("config-get:$error");
                }
                break;
            case 0:
            default:
                return $this->raiseError("config-get expects 1 or 2 parameters");
        }

        $reg = &$this->config->getRegistry();
        $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel');
        if (!$reg->channelExists($channel)) {
            return $this->raiseError('Channel "' . $channel . '" does not exist');
        }

        $channel = $reg->channelName($channel);
        $this->ui->outputData($this->config->get($config_key, $layer, $channel), $command);
        return true;
    }

    function doConfigSet($command, $options, $params)
    {
        // $param[0] -> a parameter to set
        // $param[1] -> the value for the parameter
        // $param[2] -> the layer
        $failmsg = '';
        if (count($params) < 2 || count($params) > 3) {
            $failmsg .= "config-set expects 2 or 3 parameters";
            return PEAR::raiseError($failmsg);
        }

        if (isset($params[2]) && ($error = $this->_checkLayer($params[2]))) {
            $failmsg .= $error;
            return PEAR::raiseError("config-set:$failmsg");
        }

        $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        if (!$reg->channelExists($channel)) {
            return $this->raiseError('Channel "' . $channel . '" does not exist');
        }

        $channel = $reg->channelName($channel);
        if ($params[0] == 'default_channel' && !$reg->channelExists($params[1])) {
            return $this->raiseError('Channel "' . $params[1] . '" does not exist');
        }

        if ($params[0] == 'preferred_mirror'
            && (
                !$reg->mirrorExists($channel, $params[1]) &&
                (!$reg->channelExists($params[1]) || $channel != $params[1])
            )
        ) {
            $msg  = 'Channel Mirror "' . $params[1] . '" does not exist';
            $msg .= ' in your registry for channel "' . $channel . '".';
            $msg .= "\n" . 'Attempt to run "pear channel-update ' . $channel .'"';
            $msg .= ' if you believe this mirror should exist as you may';
            $msg .= ' have outdated channel information.';
            return $this->raiseError($msg);
        }

        if (count($params) == 2) {
            array_push($params, 'user');
            $layer = 'user';
        } else {
            $layer = $params[2];
        }

        array_push($params, $channel);
        if (!call_user_func_array(array(&$this->config, 'set'), $params)) {
            array_pop($params);
            $failmsg = "config-set (" . implode(", ", $params) . ") failed, channel $channel";
        } else {
            $this->config->store($layer);
        }

        if ($failmsg) {
            return $this->raiseError($failmsg);
        }

        $this->ui->outputData('config-set succeeded', $command);
        return true;
    }

    function doConfigHelp($command, $options, $params)
    {
        if (empty($params)) {
            $params = $this->config->getKeys();
        }

        $data['caption']  = "Config help" . ((count($params) == 1) ? " for $params[0]" : '');
        $data['headline'] = array('Name', 'Type', 'Description');
        $data['border']   = true;
        foreach ($params as $name) {
            $type = $this->config->getType($name);
            $docs = $this->config->getDocs($name);
            if ($type == 'set') {
                $docs = rtrim($docs) . "\nValid set: " .
                    implode(' ', $this->config->getSetValues($name));
            }

            $data['data'][] = array($name, $type, $docs);
        }

        $this->ui->outputData($data, $command);
    }

    function doConfigCreate($command, $options, $params)
    {
        if (count($params) != 2) {
            return PEAR::raiseError('config-create: must have 2 parameters, root path and ' .
                'filename to save as');
        }

        $root = $params[0];
        // Clean up the DIRECTORY_SEPARATOR mess
        $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR;
        $root = preg_replace(array('!\\\\+!', '!/+!', "!$ds2+!"),
                             array('/', '/', '/'),
                            $root);
        if ($root[0] != '/') {
            if (!isset($options['windows'])) {
                return PEAR::raiseError('Root directory must be an absolute path beginning ' .
                    'with "/", was: "' . $root . '"');
            }

            if (!preg_match('/^[A-Za-z]:/', $root)) {
                return PEAR::raiseError('Root directory must be an absolute path beginning ' .
                    'with "\\" or "C:\\", was: "' . $root . '"');
            }
        }

        $windows = isset($options['windows']);
        if ($windows) {
            $root = str_replace('/', '\\', $root);
        }

        if (!file_exists($params[1]) && !@touch($params[1])) {
            return PEAR::raiseError('Could not create "' . $params[1] . '"');
        }

        $params[1] = realpath($params[1]);
        $config = new PEAR_Config($params[1], '#no#system#config#', false, false);
        if ($root[strlen($root) - 1] == '/') {
            $root = substr($root, 0, strlen($root) - 1);
        }

        $config->noRegistry();
        $config->set('php_dir', $windows ? "$root\\pear\\php" : "$root/pear/php", 'user');
        $config->set('data_dir', $windows ? "$root\\pear\\data" : "$root/pear/data");
        $config->set('www_dir', $windows ? "$root\\pear\\www" : "$root/pear/www");
        $config->set('cfg_dir', $windows ? "$root\\pear\\cfg" : "$root/pear/cfg");
        $config->set('ext_dir', $windows ? "$root\\pear\\ext" : "$root/pear/ext");
        $config->set('doc_dir', $windows ? "$root\\pear\\docs" : "$root/pear/docs");
        $config->set('test_dir', $windows ? "$root\\pear\\tests" : "$root/pear/tests");
        $config->set('cache_dir', $windows ? "$root\\pear\\cache" : "$root/pear/cache");
        $config->set('download_dir', $windows ? "$root\\pear\\download" : "$root/pear/download");
        $config->set('temp_dir', $windows ? "$root\\pear\\temp" : "$root/pear/temp");
        $config->set('bin_dir', $windows ? "$root\\pear" : "$root/pear");
        $config->set('man_dir', $windows ? "$root\\pear\\man" : "$root/pear/man");
        $config->writeConfigFile();
        $this->_showConfig($config);
        $this->ui->outputData('Successfully created default configuration file "' . $params[1] . '"',
            $command);
    }

    function _showConfig(&$config)
    {
        $params = array('user');
        $keys = $config->getKeys();
        sort($keys);
        $channel = 'pear.php.net';
        $data = array('caption' => 'Configuration (channel ' . $channel . '):');
        foreach ($keys as $key) {
            $type = $config->getType($key);
            $value = $config->get($key, 'user', $channel);
            if ($type == 'password' && $value) {
                $value = '********';
            }

            if ($value === false) {
                $value = 'false';
            } elseif ($value === true) {
                $value = 'true';
            }
            $data['data'][$config->getGroup($key)][] =
                array($config->getPrompt($key) , $key, $value);
        }

        foreach ($config->getLayers() as $layer) {
            $data['data']['Config Files'][] =
                array(ucfirst($layer) . ' Configuration File', 'Filename' ,
                    $config->getConfFile($layer));
        }

        $this->ui->outputData($data, 'config-show');
        return true;
    }

    /**
     * Checks if a layer is defined or not
     *
     * @param string $layer The layer to search for
     * @return mixed False on no error or the error message
     */
    function _checkLayer($layer = null)
    {
        if (!empty($layer) && $layer != 'default') {
            $layers = $this->config->getLayers();
            if (!in_array($layer, $layers)) {
                return " only the layers: \"" . implode('" or "', $layers) . "\" are supported";
            }
        }

        return false;
    }
}
PK�a�\j���!�!pear/PEAR/Command/Install.xmlnu�[���<commands version="1.0">
 <install>
  <summary>Install Package</summary>
  <function>doInstall</function>
  <shortcut>i</shortcut>
  <options>
   <force>
    <shortopt>f</shortopt>
    <doc>will overwrite newer installed packages</doc>
   </force>
   <loose>
    <shortopt>l</shortopt>
    <doc>do not check for recommended dependency version</doc>
   </loose>
   <nodeps>
    <shortopt>n</shortopt>
    <doc>ignore dependencies, install anyway</doc>
   </nodeps>
   <register-only>
    <shortopt>r</shortopt>
    <doc>do not install files, only register the package as installed</doc>
   </register-only>
   <soft>
    <shortopt>s</shortopt>
    <doc>soft install, fail silently, or upgrade if already installed</doc>
   </soft>
   <nobuild>
    <shortopt>B</shortopt>
    <doc>don&#039;t build C extensions</doc>
   </nobuild>
   <configureoptions>
    <shortopt>D</shortopt>
    <arg>OPTION1=VALUE[ OPTION2=VALUE]</arg>
   </configureoptions>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>request uncompressed files when downloading</doc>
   </nocompress>
   <installroot>
    <shortopt>R</shortopt>
    <doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT), use packagingroot for RPM</doc>
    <arg>DIR</arg>
   </installroot>
   <packagingroot>
    <shortopt>P</shortopt>
    <doc>root directory used when packaging files, like RPM packaging</doc>
    <arg>DIR</arg>
   </packagingroot>
   <ignore-errors>
    <shortopt></shortopt>
    <doc>force install even if there were errors</doc>
   </ignore-errors>
   <alldeps>
    <shortopt>a</shortopt>
    <doc>install all required and optional dependencies</doc>
   </alldeps>
   <onlyreqdeps>
    <shortopt>o</shortopt>
    <doc>install all required dependencies</doc>
   </onlyreqdeps>
   <offline>
    <shortopt>O</shortopt>
    <doc>do not attempt to download any urls or contact channels</doc>
   </offline>
   <pretend>
    <shortopt>p</shortopt>
    <doc>Only list the packages that would be downloaded</doc>
   </pretend>
  </options>
  <doc>[channel/]&lt;package&gt; ...
Installs one or more PEAR packages.  You can specify a package to
install in four ways:

&quot;Package-1.0.tgz&quot; : installs from a local file

&quot;http://example.com/Package-1.0.tgz&quot; : installs from
anywhere on the net.

&quot;package.xml&quot; : installs the package described in
package.xml.  Useful for testing, or for wrapping a PEAR package in
another package manager such as RPM.

&quot;Package[-version/state][.tar]&quot; : queries your default channel&#039;s server
({config master_server}) and downloads the newest package with
the preferred quality/state ({config preferred_state}).

To retrieve Package version 1.1, use &quot;Package-1.1,&quot; to retrieve
Package state beta, use &quot;Package-beta.&quot;  To retrieve an uncompressed
file, append .tar (make sure there is no file by the same name first)

To download a package from another channel, prefix with the channel name like
&quot;channel/Package&quot;

More than one package may be specified at once.  It is ok to mix these
four ways of specifying packages.
</doc>
 </install>
 <upgrade>
  <summary>Upgrade Package</summary>
  <function>doInstall</function>
  <shortcut>up</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>upgrade packages from a specific channel</doc>
    <arg>CHAN</arg>
   </channel>
   <force>
    <shortopt>f</shortopt>
    <doc>overwrite newer installed packages</doc>
   </force>
   <loose>
    <shortopt>l</shortopt>
    <doc>do not check for recommended dependency version</doc>
   </loose>
   <nodeps>
    <shortopt>n</shortopt>
    <doc>ignore dependencies, upgrade anyway</doc>
   </nodeps>
   <register-only>
    <shortopt>r</shortopt>
    <doc>do not install files, only register the package as upgraded</doc>
   </register-only>
   <nobuild>
    <shortopt>B</shortopt>
    <doc>don&#039;t build C extensions</doc>
   </nobuild>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>request uncompressed files when downloading</doc>
   </nocompress>
   <installroot>
    <shortopt>R</shortopt>
    <doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT)</doc>
    <arg>DIR</arg>
   </installroot>
   <ignore-errors>
    <shortopt></shortopt>
    <doc>force install even if there were errors</doc>
   </ignore-errors>
   <alldeps>
    <shortopt>a</shortopt>
    <doc>install all required and optional dependencies</doc>
   </alldeps>
   <onlyreqdeps>
    <shortopt>o</shortopt>
    <doc>install all required dependencies</doc>
   </onlyreqdeps>
   <offline>
    <shortopt>O</shortopt>
    <doc>do not attempt to download any urls or contact channels</doc>
   </offline>
   <pretend>
    <shortopt>p</shortopt>
    <doc>Only list the packages that would be downloaded</doc>
   </pretend>
  </options>
  <doc>&lt;package&gt; ...
Upgrades one or more PEAR packages.  See documentation for the
&quot;install&quot; command for ways to specify a package.

When upgrading, your package will be updated if the provided new
package has a higher version number (use the -f option if you need to
upgrade anyway).

More than one package may be specified at once.
</doc>
 </upgrade>
 <upgrade-all>
  <summary>Upgrade All Packages [Deprecated in favor of calling upgrade with no parameters]</summary>
  <function>doUpgradeAll</function>
  <shortcut>ua</shortcut>
  <options>
   <channel>
    <shortopt>c</shortopt>
    <doc>upgrade packages from a specific channel</doc>
    <arg>CHAN</arg>
   </channel>
   <nodeps>
    <shortopt>n</shortopt>
    <doc>ignore dependencies, upgrade anyway</doc>
   </nodeps>
   <register-only>
    <shortopt>r</shortopt>
    <doc>do not install files, only register the package as upgraded</doc>
   </register-only>
   <nobuild>
    <shortopt>B</shortopt>
    <doc>don&#039;t build C extensions</doc>
   </nobuild>
   <nocompress>
    <shortopt>Z</shortopt>
    <doc>request uncompressed files when downloading</doc>
   </nocompress>
   <installroot>
    <shortopt>R</shortopt>
    <doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT), use packagingroot for RPM</doc>
    <arg>DIR</arg>
   </installroot>
   <ignore-errors>
    <shortopt></shortopt>
    <doc>force install even if there were errors</doc>
   </ignore-errors>
   <loose>
    <shortopt></shortopt>
    <doc>do not check for recommended dependency version</doc>
   </loose>
  </options>
  <doc>
WARNING: This function is deprecated in favor of using the upgrade command with no params

Upgrades all packages that have a newer release available.  Upgrades are
done only if there is a release available of the state specified in
&quot;preferred_state&quot; (currently {config preferred_state}), or a state considered
more stable.
</doc>
 </upgrade-all>
 <uninstall>
  <summary>Un-install Package</summary>
  <function>doUninstall</function>
  <shortcut>un</shortcut>
  <options>
   <nodeps>
    <shortopt>n</shortopt>
    <doc>ignore dependencies, uninstall anyway</doc>
   </nodeps>
   <register-only>
    <shortopt>r</shortopt>
    <doc>do not remove files, only register the packages as not installed</doc>
   </register-only>
   <installroot>
    <shortopt>R</shortopt>
    <doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT)</doc>
    <arg>DIR</arg>
   </installroot>
   <ignore-errors>
    <shortopt></shortopt>
    <doc>force install even if there were errors</doc>
   </ignore-errors>
   <offline>
    <shortopt>O</shortopt>
    <doc>do not attempt to uninstall remotely</doc>
   </offline>
  </options>
  <doc>[channel/]&lt;package&gt; ...
Uninstalls one or more PEAR packages.  More than one package may be
specified at once.  Prefix with channel name to uninstall from a
channel not in your default channel ({config default_channel})
</doc>
 </uninstall>
 <bundle>
  <summary>Unpacks a Pecl Package</summary>
  <function>doBundle</function>
  <shortcut>bun</shortcut>
  <options>
   <destination>
    <shortopt>d</shortopt>
    <doc>Optional destination directory for unpacking (defaults to current path or &quot;ext&quot; if exists)</doc>
    <arg>DIR</arg>
   </destination>
   <force>
    <shortopt>f</shortopt>
    <doc>Force the unpacking even if there were errors in the package</doc>
   </force>
  </options>
  <doc>&lt;package&gt;
Unpacks a Pecl Package into the selected location. It will download the
package if needed.
</doc>
 </bundle>
 <run-scripts>
  <summary>Run Post-Install Scripts bundled with a package</summary>
  <function>doRunScripts</function>
  <shortcut>rs</shortcut>
  <options />
  <doc>&lt;package&gt;
Run post-installation scripts in package &lt;package&gt;, if any exist.
</doc>
 </run-scripts>
</commands>PK�a�\�4�{��pear/PEAR/Command/Auth.xmlnu�[���<commands version="1.0">
 <login>
  <summary>Connects and authenticates to remote server [Deprecated in favor of channel-login]</summary>
  <function>doLogin</function>
  <shortcut>li</shortcut>
  <options />
  <doc>&lt;channel name&gt;
WARNING: This function is deprecated in favor of using channel-login

Log in to a remote channel server.  If &lt;channel name&gt; is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first.  The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems).  After logging
in, your username and password will be sent along in subsequent
operations on the remote server.</doc>
 </login>
 <logout>
  <summary>Logs out from the remote server [Deprecated in favor of channel-logout]</summary>
  <function>doLogout</function>
  <shortcut>lo</shortcut>
  <options />
  <doc>
WARNING: This function is deprecated in favor of using channel-logout

Logs out from the remote server.  This command does not actually
connect to the remote server, it only deletes the stored username and
password from your user configuration.</doc>
 </logout>
</commands>PK�a�\�����pear/PEAR/Command/Mirror.phpnu�[���<?php
/**
 * PEAR_Command_Mirror (download-all command)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Alexander Merz <alexmerz@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.2.0
 */

/**
 * base class
 */
require_once 'PEAR/Command/Common.php';

/**
 * PEAR commands for providing file mirrors
 *
 * @category   pear
 * @package    PEAR
 * @author     Alexander Merz <alexmerz@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.2.0
 */
class PEAR_Command_Mirror extends PEAR_Command_Common
{
    var $commands = array(
        'download-all' => array(
            'summary' => 'Downloads each available package from the default channel',
            'function' => 'doDownloadAll',
            'shortcut' => 'da',
            'options' => array(
                'channel' =>
                    array(
                    'shortopt' => 'c',
                    'doc' => 'specify a channel other than the default channel',
                    'arg' => 'CHAN',
                    ),
                ),
            'doc' => '
Requests a list of available packages from the default channel ({config default_channel})
and downloads them to current working directory.  Note: only
packages within preferred_state ({config preferred_state}) will be downloaded'
            ),
        );

    /**
     * PEAR_Command_Mirror constructor.
     *
     * @access public
     * @param object PEAR_Frontend a reference to an frontend
     * @param object PEAR_Config a reference to the configuration data
     */
    function __construct(&$ui, &$config)
    {
        parent::__construct($ui, $config);
    }

    /**
     * For unit-testing
     */
    function &factory($a)
    {
        $a = &PEAR_Command::factory($a, $this->config);
        return $a;
    }

    /**
    * retrieves a list of avaible Packages from master server
    * and downloads them
    *
    * @access public
    * @param string $command the command
    * @param array $options the command options before the command
    * @param array $params the stuff after the command name
    * @return bool true if successful
    * @throw PEAR_Error
    */
    function doDownloadAll($command, $options, $params)
    {
        $savechannel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        $channel = isset($options['channel']) ? $options['channel'] :
            $this->config->get('default_channel');
        if (!$reg->channelExists($channel)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError('Channel "' . $channel . '" does not exist');
        }
        $this->config->set('default_channel', $channel);

        $this->ui->outputData('Using Channel ' . $this->config->get('default_channel'));
        $chan = $reg->getChannel($channel);
        if (PEAR::isError($chan)) {
            return $this->raiseError($chan);
        }

        if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
            $rest = &$this->config->getREST('1.0', array());
            $remoteInfo = array_flip($rest->listPackages($base, $channel));
        }

        if (PEAR::isError($remoteInfo)) {
            return $remoteInfo;
        }

        $cmd = &$this->factory("download");
        if (PEAR::isError($cmd)) {
            return $cmd;
        }

        $this->ui->outputData('Using Preferred State of ' .
            $this->config->get('preferred_state'));
        $this->ui->outputData('Gathering release information, please wait...');

        /**
         * Error handling not necessary, because already done by
         * the download command
         */
        PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
        $err = $cmd->run('download', array('downloadonly' => true), array_keys($remoteInfo));
        PEAR::staticPopErrorHandling();
        $this->config->set('default_channel', $savechannel);
        if (PEAR::isError($err)) {
            $this->ui->outputData($err->getMessage());
        }

        return true;
    }
}
PK�a�\����pear/PEAR/Config.phpnu�[���<?php
/**
 * PEAR_Config, customized configuration handling for the PEAR Installer
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 */

/**
 * Required for error handling
 */
require_once 'PEAR.php';
require_once 'PEAR/Registry.php';
require_once 'PEAR/Installer/Role.php';
require_once 'System.php';

/**
 * Last created PEAR_Config instance.
 * @var object
 */
$GLOBALS['_PEAR_Config_instance'] = null;
if (!defined('PEAR_INSTALL_DIR') || !PEAR_INSTALL_DIR) {
    $PEAR_INSTALL_DIR = PHP_LIBDIR . DIRECTORY_SEPARATOR . 'pear';
} else {
    $PEAR_INSTALL_DIR = PEAR_INSTALL_DIR;
}

// Below we define constants with default values for all configuration
// parameters except username/password.  All of them can have their
// defaults set through environment variables.  The reason we use the
// PHP_ prefix is for some security, PHP protects environment
// variables starting with PHP_*.

// default channel and preferred mirror is based on whether we are invoked through
// the "pear" or the "pecl" command
if (!defined('PEAR_RUNTYPE')) {
    define('PEAR_RUNTYPE', 'pear');
}

if (PEAR_RUNTYPE == 'pear') {
    define('PEAR_CONFIG_DEFAULT_CHANNEL', 'pear.php.net');
} else {
    define('PEAR_CONFIG_DEFAULT_CHANNEL', 'pecl.php.net');
}

if (getenv('PHP_PEAR_SYSCONF_DIR')) {
    define('PEAR_CONFIG_SYSCONFDIR', getenv('PHP_PEAR_SYSCONF_DIR'));
} elseif (getenv('SystemRoot')) {
    define('PEAR_CONFIG_SYSCONFDIR', getenv('SystemRoot'));
} else {
    define('PEAR_CONFIG_SYSCONFDIR', PHP_SYSCONFDIR);
}

// Default for master_server
if (getenv('PHP_PEAR_MASTER_SERVER')) {
    define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', getenv('PHP_PEAR_MASTER_SERVER'));
} else {
    define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', 'pear.php.net');
}

// Default for http_proxy
if (getenv('PHP_PEAR_HTTP_PROXY')) {
    define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('PHP_PEAR_HTTP_PROXY'));
} elseif (getenv('http_proxy')) {
    define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('http_proxy'));
} else {
    define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', '');
}

// Default for php_dir
if (getenv('PHP_PEAR_INSTALL_DIR')) {
    define('PEAR_CONFIG_DEFAULT_PHP_DIR', getenv('PHP_PEAR_INSTALL_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_PHP_DIR', $PEAR_INSTALL_DIR);
}

// Default for metadata_dir
if (getenv('PHP_PEAR_METADATA_DIR')) {
    define('PEAR_CONFIG_DEFAULT_METADATA_DIR', getenv('PHP_PEAR_METADATA_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_METADATA_DIR', '');
}

// Default for ext_dir
if (getenv('PHP_PEAR_EXTENSION_DIR')) {
    define('PEAR_CONFIG_DEFAULT_EXT_DIR', getenv('PHP_PEAR_EXTENSION_DIR'));
} else {
    if (ini_get('extension_dir')) {
        define('PEAR_CONFIG_DEFAULT_EXT_DIR', ini_get('extension_dir'));
    } elseif (defined('PEAR_EXTENSION_DIR') &&
              file_exists(PEAR_EXTENSION_DIR) && is_dir(PEAR_EXTENSION_DIR)) {
        define('PEAR_CONFIG_DEFAULT_EXT_DIR', PEAR_EXTENSION_DIR);
    } elseif (defined('PHP_EXTENSION_DIR')) {
        define('PEAR_CONFIG_DEFAULT_EXT_DIR', PHP_EXTENSION_DIR);
    } else {
        define('PEAR_CONFIG_DEFAULT_EXT_DIR', '.');
    }
}

// Default for doc_dir
if (getenv('PHP_PEAR_DOC_DIR')) {
    define('PEAR_CONFIG_DEFAULT_DOC_DIR', getenv('PHP_PEAR_DOC_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_DOC_DIR',
           $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'docs');
}

// Default for bin_dir
if (getenv('PHP_PEAR_BIN_DIR')) {
    define('PEAR_CONFIG_DEFAULT_BIN_DIR', getenv('PHP_PEAR_BIN_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_BIN_DIR', PHP_BINDIR);
}

// Default for data_dir
if (getenv('PHP_PEAR_DATA_DIR')) {
    define('PEAR_CONFIG_DEFAULT_DATA_DIR', getenv('PHP_PEAR_DATA_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_DATA_DIR',
           $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'data');
}

// Default for cfg_dir
if (getenv('PHP_PEAR_CFG_DIR')) {
    define('PEAR_CONFIG_DEFAULT_CFG_DIR', getenv('PHP_PEAR_CFG_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_CFG_DIR',
           $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'cfg');
}

// Default for www_dir
if (getenv('PHP_PEAR_WWW_DIR')) {
    define('PEAR_CONFIG_DEFAULT_WWW_DIR', getenv('PHP_PEAR_WWW_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_WWW_DIR',
           $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'www');
}

// Default for man_dir
if (getenv('PHP_PEAR_MAN_DIR')) {
    define('PEAR_CONFIG_DEFAULT_MAN_DIR', getenv('PHP_PEAR_MAN_DIR'));
} else {
    if (defined('PHP_MANDIR')) { // Added in PHP5.3.7
        define('PEAR_CONFIG_DEFAULT_MAN_DIR', PHP_MANDIR);
    } else {
        define('PEAR_CONFIG_DEFAULT_MAN_DIR', PHP_PREFIX . DIRECTORY_SEPARATOR .
           'local' . DIRECTORY_SEPARATOR .'man');
    }
}

// Default for test_dir
if (getenv('PHP_PEAR_TEST_DIR')) {
    define('PEAR_CONFIG_DEFAULT_TEST_DIR', getenv('PHP_PEAR_TEST_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_TEST_DIR',
           $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'tests');
}

// Default for temp_dir
if (getenv('PHP_PEAR_TEMP_DIR')) {
    define('PEAR_CONFIG_DEFAULT_TEMP_DIR', getenv('PHP_PEAR_TEMP_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_TEMP_DIR',
           System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' .
           DIRECTORY_SEPARATOR . 'temp');
}

// Default for cache_dir
if (getenv('PHP_PEAR_CACHE_DIR')) {
    define('PEAR_CONFIG_DEFAULT_CACHE_DIR', getenv('PHP_PEAR_CACHE_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_CACHE_DIR',
           System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' .
           DIRECTORY_SEPARATOR . 'cache');
}

// Default for download_dir
if (getenv('PHP_PEAR_DOWNLOAD_DIR')) {
    define('PEAR_CONFIG_DEFAULT_DOWNLOAD_DIR', getenv('PHP_PEAR_DOWNLOAD_DIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_DOWNLOAD_DIR',
           System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' .
           DIRECTORY_SEPARATOR . 'download');
}

// Default for php_bin
if (getenv('PHP_PEAR_PHP_BIN')) {
    define('PEAR_CONFIG_DEFAULT_PHP_BIN', getenv('PHP_PEAR_PHP_BIN'));
} else {
    define('PEAR_CONFIG_DEFAULT_PHP_BIN', PEAR_CONFIG_DEFAULT_BIN_DIR.
           DIRECTORY_SEPARATOR.'php'.(OS_WINDOWS ? '.exe' : ''));
}

// Default for verbose
if (getenv('PHP_PEAR_VERBOSE')) {
    define('PEAR_CONFIG_DEFAULT_VERBOSE', getenv('PHP_PEAR_VERBOSE'));
} else {
    define('PEAR_CONFIG_DEFAULT_VERBOSE', 1);
}

// Default for preferred_state
if (getenv('PHP_PEAR_PREFERRED_STATE')) {
    define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', getenv('PHP_PEAR_PREFERRED_STATE'));
} else {
    define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', 'stable');
}

// Default for umask
if (getenv('PHP_PEAR_UMASK')) {
    define('PEAR_CONFIG_DEFAULT_UMASK', getenv('PHP_PEAR_UMASK'));
} else {
    define('PEAR_CONFIG_DEFAULT_UMASK', decoct(umask()));
}

// Default for cache_ttl
if (getenv('PHP_PEAR_CACHE_TTL')) {
    define('PEAR_CONFIG_DEFAULT_CACHE_TTL', getenv('PHP_PEAR_CACHE_TTL'));
} else {
    define('PEAR_CONFIG_DEFAULT_CACHE_TTL', 3600);
}

// Default for sig_type
if (getenv('PHP_PEAR_SIG_TYPE')) {
    define('PEAR_CONFIG_DEFAULT_SIG_TYPE', getenv('PHP_PEAR_SIG_TYPE'));
} else {
    define('PEAR_CONFIG_DEFAULT_SIG_TYPE', 'gpg');
}

// Default for sig_bin
if (getenv('PHP_PEAR_SIG_BIN')) {
    define('PEAR_CONFIG_DEFAULT_SIG_BIN', getenv('PHP_PEAR_SIG_BIN'));
} else {
    define('PEAR_CONFIG_DEFAULT_SIG_BIN',
           System::which(
               'gpg', OS_WINDOWS ? 'c:\gnupg\gpg.exe' : '/usr/local/bin/gpg'));
}

// Default for sig_keydir
if (getenv('PHP_PEAR_SIG_KEYDIR')) {
    define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR', getenv('PHP_PEAR_SIG_KEYDIR'));
} else {
    define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR',
           PEAR_CONFIG_SYSCONFDIR . DIRECTORY_SEPARATOR . 'pearkeys');
}

/**
 * This is a class for storing configuration data, keeping track of
 * which are system-defined, user-defined or defaulted.
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 0.1
 */
class PEAR_Config extends PEAR
{
    /**
     * Array of config files used.
     *
     * @var array layer => config file
     */
    var $files = array(
        'system' => '',
        'user' => '',
        );

    var $layers = array();

    /**
     * Configuration data, two-dimensional array where the first
     * dimension is the config layer ('user', 'system' and 'default'),
     * and the second dimension is keyname => value.
     *
     * The order in the first dimension is important!  Earlier
     * layers will shadow later ones when a config value is
     * requested (if a 'user' value exists, it will be returned first,
     * then 'system' and finally 'default').
     *
     * @var array layer => array(keyname => value, ...)
     */
    var $configuration = array(
        'user' => array(),
        'system' => array(),
        'default' => array(),
        );

    /**
     * Configuration values that can be set for a channel
     *
     * All other configuration values can only have a global value
     * @var array
     * @access private
     */
    var $_channelConfigInfo = array(
        'php_dir', 'ext_dir', 'doc_dir', 'bin_dir', 'data_dir', 'cfg_dir',
        'test_dir', 'www_dir', 'php_bin', 'php_prefix', 'php_suffix', 'username',
        'password', 'verbose', 'preferred_state', 'umask', 'preferred_mirror', 'php_ini'
        );

    /**
     * Channels that can be accessed
     * @see setChannels()
     * @var array
     * @access private
     */
    var $_channels = array('pear.php.net', 'pecl.php.net', '__uri');

    /**
     * This variable is used to control the directory values returned
     * @see setInstallRoot();
     * @var string|false
     * @access private
     */
    var $_installRoot = false;

    /**
     * If requested, this will always refer to the registry
     * contained in php_dir
     * @var PEAR_Registry
     */
    var $_registry = array();

    /**
     * @var array
     * @access private
     */
    var $_regInitialized = array();

    /**
     * @var bool
     * @access private
     */
    var $_noRegistry = false;

    /**
     * amount of errors found while parsing config
     * @var integer
     * @access private
     */
    var $_errorsFound = 0;
    var $_lastError = null;

    /**
     * Information about the configuration data.  Stores the type,
     * default value and a documentation string for each configuration
     * value.
     *
     * @var array layer => array(infotype => value, ...)
     */
    var $configuration_info = array(
        // Channels/Internet Access
        'default_channel' => array(
            'type' => 'string',
            'default' => PEAR_CONFIG_DEFAULT_CHANNEL,
            'doc' => 'the default channel to use for all non explicit commands',
            'prompt' => 'Default Channel',
            'group' => 'Internet Access',
            ),
        'preferred_mirror' => array(
            'type' => 'string',
            'default' => PEAR_CONFIG_DEFAULT_CHANNEL,
            'doc' => 'the default server or mirror to use for channel actions',
            'prompt' => 'Default Channel Mirror',
            'group' => 'Internet Access',
            ),
        'remote_config' => array(
            'type' => 'password',
            'default' => '',
            'doc' => 'ftp url of remote configuration file to use for synchronized install',
            'prompt' => 'Remote Configuration File',
            'group' => 'Internet Access',
            ),
        'auto_discover' => array(
            'type' => 'integer',
            'default' => 0,
            'doc' => 'whether to automatically discover new channels',
            'prompt' => 'Auto-discover new Channels',
            'group' => 'Internet Access',
            ),
        // Internet Access
        'master_server' => array(
            'type' => 'string',
            'default' => 'pear.php.net',
            'doc' => 'name of the main PEAR server [NOT USED IN THIS VERSION]',
            'prompt' => 'PEAR server [DEPRECATED]',
            'group' => 'Internet Access',
            ),
        'http_proxy' => array(
            'type' => 'string',
            'default' => PEAR_CONFIG_DEFAULT_HTTP_PROXY,
            'doc' => 'HTTP proxy (host:port) to use when downloading packages',
            'prompt' => 'HTTP Proxy Server Address',
            'group' => 'Internet Access',
            ),
        // File Locations
        'php_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_PHP_DIR,
            'doc' => 'directory where .php files are installed',
            'prompt' => 'PEAR directory',
            'group' => 'File Locations',
            ),
        'ext_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_EXT_DIR,
            'doc' => 'directory where loadable extensions are installed',
            'prompt' => 'PHP extension directory',
            'group' => 'File Locations',
            ),
        'doc_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_DOC_DIR,
            'doc' => 'directory where documentation is installed',
            'prompt' => 'PEAR documentation directory',
            'group' => 'File Locations',
            ),
        'bin_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_BIN_DIR,
            'doc' => 'directory where executables are installed',
            'prompt' => 'PEAR executables directory',
            'group' => 'File Locations',
            ),
        'data_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_DATA_DIR,
            'doc' => 'directory where data files are installed',
            'prompt' => 'PEAR data directory',
            'group' => 'File Locations (Advanced)',
            ),
        'cfg_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_CFG_DIR,
            'doc' => 'directory where modifiable configuration files are installed',
            'prompt' => 'PEAR configuration file directory',
            'group' => 'File Locations (Advanced)',
            ),
        'www_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_WWW_DIR,
            'doc' => 'directory where www frontend files (html/js) are installed',
            'prompt' => 'PEAR www files directory',
            'group' => 'File Locations (Advanced)',
            ),
        'man_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_MAN_DIR,
            'doc' => 'directory where unix manual pages are installed',
            'prompt' => 'Systems manpage files directory',
            'group' => 'File Locations (Advanced)',
            ),
        'test_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_TEST_DIR,
            'doc' => 'directory where regression tests are installed',
            'prompt' => 'PEAR test directory',
            'group' => 'File Locations (Advanced)',
            ),
        'cache_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_CACHE_DIR,
            'doc' => 'directory which is used for web service cache',
            'prompt' => 'PEAR Installer cache directory',
            'group' => 'File Locations (Advanced)',
            ),
        'temp_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_TEMP_DIR,
            'doc' => 'directory which is used for all temp files',
            'prompt' => 'PEAR Installer temp directory',
            'group' => 'File Locations (Advanced)',
            ),
        'download_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_DOWNLOAD_DIR,
            'doc' => 'directory which is used for all downloaded files',
            'prompt' => 'PEAR Installer download directory',
            'group' => 'File Locations (Advanced)',
            ),
        'php_bin' => array(
            'type' => 'file',
            'default' => PEAR_CONFIG_DEFAULT_PHP_BIN,
            'doc' => 'PHP CLI/CGI binary for executing scripts',
            'prompt' => 'PHP CLI/CGI binary',
            'group' => 'File Locations (Advanced)',
            ),
        'php_prefix' => array(
            'type' => 'string',
            'default' => '',
            'doc' => '--program-prefix for php_bin\'s ./configure, used for pecl installs',
            'prompt' => '--program-prefix passed to PHP\'s ./configure',
            'group' => 'File Locations (Advanced)',
            ),
        'php_suffix' => array(
            'type' => 'string',
            'default' => '',
            'doc' => '--program-suffix for php_bin\'s ./configure, used for pecl installs',
            'prompt' => '--program-suffix passed to PHP\'s ./configure',
            'group' => 'File Locations (Advanced)',
            ),
        'php_ini' => array(
            'type' => 'file',
            'default' => '',
            'doc' => 'location of php.ini in which to enable PECL extensions on install',
            'prompt' => 'php.ini location',
            'group' => 'File Locations (Advanced)',
            ),
        'metadata_dir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_METADATA_DIR,
            'doc' => 'directory where metadata files are installed (registry, filemap, channels, ...)',
            'prompt' => 'PEAR metadata directory',
            'group' => 'File Locations (Advanced)',
            ),
        // Maintainers
        'username' => array(
            'type' => 'string',
            'default' => '',
            'doc' => '(maintainers) your PEAR account name',
            'prompt' => 'PEAR username (for maintainers)',
            'group' => 'Maintainers',
            ),
        'password' => array(
            'type' => 'password',
            'default' => '',
            'doc' => '(maintainers) your PEAR account password',
            'prompt' => 'PEAR password (for maintainers)',
            'group' => 'Maintainers',
            ),
        // Advanced
        'verbose' => array(
            'type' => 'integer',
            'default' => PEAR_CONFIG_DEFAULT_VERBOSE,
            'doc' => 'verbosity level
0: really quiet
1: somewhat quiet
2: verbose
3: debug',
            'prompt' => 'Debug Log Level',
            'group' => 'Advanced',
            ),
        'preferred_state' => array(
            'type' => 'set',
            'default' => PEAR_CONFIG_DEFAULT_PREFERRED_STATE,
            'doc' => 'the installer will prefer releases with this state when installing packages without a version or state specified',
            'valid_set' => array(
                'stable', 'beta', 'alpha', 'devel', 'snapshot'),
            'prompt' => 'Preferred Package State',
            'group' => 'Advanced',
            ),
        'umask' => array(
            'type' => 'mask',
            'default' => PEAR_CONFIG_DEFAULT_UMASK,
            'doc' => 'umask used when creating files (Unix-like systems only)',
            'prompt' => 'Unix file mask',
            'group' => 'Advanced',
            ),
        'cache_ttl' => array(
            'type' => 'integer',
            'default' => PEAR_CONFIG_DEFAULT_CACHE_TTL,
            'doc' => 'amount of secs where the local cache is used and not updated',
            'prompt' => 'Cache TimeToLive',
            'group' => 'Advanced',
            ),
        'sig_type' => array(
            'type' => 'set',
            'default' => PEAR_CONFIG_DEFAULT_SIG_TYPE,
            'doc' => 'which package signature mechanism to use',
            'valid_set' => array('gpg'),
            'prompt' => 'Package Signature Type',
            'group' => 'Maintainers',
            ),
        'sig_bin' => array(
            'type' => 'string',
            'default' => PEAR_CONFIG_DEFAULT_SIG_BIN,
            'doc' => 'which package signature mechanism to use',
            'prompt' => 'Signature Handling Program',
            'group' => 'Maintainers',
            ),
        'sig_keyid' => array(
            'type' => 'string',
            'default' => '',
            'doc' => 'which key to use for signing with',
            'prompt' => 'Signature Key Id',
            'group' => 'Maintainers',
            ),
        'sig_keydir' => array(
            'type' => 'directory',
            'default' => PEAR_CONFIG_DEFAULT_SIG_KEYDIR,
            'doc' => 'directory where signature keys are located',
            'prompt' => 'Signature Key Directory',
            'group' => 'Maintainers',
            ),
        // __channels is reserved - used for channel-specific configuration
        );

    /**
     * Constructor.
     *
     * @param string file to read user-defined options from
     * @param string file to read system-wide defaults from
     * @param bool   determines whether a registry object "follows"
     *               the value of php_dir (is automatically created
     *               and moved when php_dir is changed)
     * @param bool   if true, fails if configuration files cannot be loaded
     *
     * @access public
     *
     * @see PEAR_Config::singleton
     */
    function __construct($user_file = '', $system_file = '', $ftp_file = false,
                         $strict = true)
    {
        parent::__construct();
        PEAR_Installer_Role::initializeConfig($this);
        $sl = DIRECTORY_SEPARATOR;
        if (empty($user_file)) {
            if (OS_WINDOWS) {
                $user_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini';
            } else {
                $user_file = getenv('HOME') . $sl . '.pearrc';
            }
        }

        if (empty($system_file)) {
            $system_file = PEAR_CONFIG_SYSCONFDIR . $sl;
            if (OS_WINDOWS) {
                $system_file .= 'pearsys.ini';
            } else {
                $system_file .= 'pear.conf';
            }
        }

        $this->layers = array_keys($this->configuration);
        $this->files['user']   = $user_file;
        $this->files['system'] = $system_file;
        if ($user_file && file_exists($user_file)) {
            $this->pushErrorHandling(PEAR_ERROR_RETURN);
            $this->readConfigFile($user_file, 'user', $strict);
            $this->popErrorHandling();
            if ($this->_errorsFound > 0) {
                return;
            }
        }

        if ($system_file && @file_exists($system_file)) {
            $this->mergeConfigFile($system_file, false, 'system', $strict);
            if ($this->_errorsFound > 0) {
                return;
            }

        }

        if (!$ftp_file) {
            $ftp_file = $this->get('remote_config');
        }

        if ($ftp_file && defined('PEAR_REMOTEINSTALL_OK')) {
            $this->readFTPConfigFile($ftp_file);
        }

        foreach ($this->configuration_info as $key => $info) {
            $this->configuration['default'][$key] = $info['default'];
        }

        $this->_registry['default'] = new PEAR_Registry(
            $this->configuration['default']['php_dir'], false, false,
            $this->configuration['default']['metadata_dir']);
        $this->_registry['default']->setConfig($this, false);
        $this->_regInitialized['default'] = false;
        //$GLOBALS['_PEAR_Config_instance'] = &$this;
    }

    /**
     * Return the default locations of user and system configuration files
     */
    public static function getDefaultConfigFiles()
    {
        $sl = DIRECTORY_SEPARATOR;
        if (OS_WINDOWS) {
            return array(
                'user'   => PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini',
                'system' =>  PEAR_CONFIG_SYSCONFDIR . $sl . 'pearsys.ini'
            );
        }

        return array(
            'user'   => getenv('HOME') . $sl . '.pearrc',
            'system' => PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.conf'
        );
    }

    /**
     * Static singleton method.  If you want to keep only one instance
     * of this class in use, this method will give you a reference to
     * the last created PEAR_Config object if one exists, or create a
     * new object.
     *
     * @param string (optional) file to read user-defined options from
     * @param string (optional) file to read system-wide defaults from
     *
     * @return object an existing or new PEAR_Config instance
     *
     * @see PEAR_Config::PEAR_Config
     */
    public static function &singleton($user_file = '', $system_file = '', $strict = true)
    {
        if (is_object($GLOBALS['_PEAR_Config_instance'])) {
            return $GLOBALS['_PEAR_Config_instance'];
        }

        $t_conf = new PEAR_Config($user_file, $system_file, false, $strict);
        if ($t_conf->_errorsFound > 0) {
             return $t_conf->_lastError;
        }

        $GLOBALS['_PEAR_Config_instance'] = &$t_conf;
        return $GLOBALS['_PEAR_Config_instance'];
    }

    /**
     * Determine whether any configuration files have been detected, and whether a
     * registry object can be retrieved from this configuration.
     * @return bool
     * @since PEAR 1.4.0a1
     */
    function validConfiguration()
    {
        if ($this->isDefinedLayer('user') || $this->isDefinedLayer('system')) {
            return true;
        }

        return false;
    }

    /**
     * Reads configuration data from a file.  All existing values in
     * the config layer are discarded and replaced with data from the
     * file.
     * @param string file to read from, if NULL or not specified, the
     *               last-used file for the same layer (second param) is used
     * @param string config layer to insert data into ('user' or 'system')
     * @return bool TRUE on success or a PEAR error on failure
     */
    function readConfigFile($file = null, $layer = 'user', $strict = true)
    {
        if (empty($this->files[$layer])) {
            return $this->raiseError("unknown config layer `$layer'");
        }

        if ($file === null) {
            $file = $this->files[$layer];
        }

        $data = $this->_readConfigDataFrom($file);
        if (PEAR::isError($data)) {
            if (!$strict) {
                return true;
            }

            $this->_errorsFound++;
            $this->_lastError = $data;

            return $data;
        }

        $this->files[$layer] = $file;
        $this->_decodeInput($data);
        $this->configuration[$layer] = $data;
        $this->_setupChannels();
        if (!$this->_noRegistry && ($phpdir = $this->get('php_dir', $layer, 'pear.php.net'))) {
            $this->_registry[$layer] = new PEAR_Registry(
                $phpdir, false, false,
                $this->get('metadata_dir', $layer, 'pear.php.net'));
            $this->_registry[$layer]->setConfig($this, false);
            $this->_regInitialized[$layer] = false;
        } else {
            unset($this->_registry[$layer]);
        }
        return true;
    }

    /**
     * @param string url to the remote config file, like ftp://www.example.com/pear/config.ini
     * @return true|PEAR_Error
     */
    function readFTPConfigFile($path)
    {
        do { // poor man's try
            if (!class_exists('PEAR_FTP')) {
                if (!class_exists('PEAR_Common')) {
                    require_once 'PEAR/Common.php';
                }
                if (PEAR_Common::isIncludeable('PEAR/FTP.php')) {
                    require_once 'PEAR/FTP.php';
                }
            }

            if (!class_exists('PEAR_FTP')) {
                return PEAR::raiseError('PEAR_RemoteInstaller must be installed to use remote config');
            }

            $this->_ftp = new PEAR_FTP;
            $this->_ftp->pushErrorHandling(PEAR_ERROR_RETURN);
            $e = $this->_ftp->init($path);
            if (PEAR::isError($e)) {
                $this->_ftp->popErrorHandling();
                return $e;
            }

            $tmp = System::mktemp('-d');
            PEAR_Common::addTempFile($tmp);
            $e = $this->_ftp->get(basename($path), $tmp . DIRECTORY_SEPARATOR .
                'pear.ini', false, FTP_BINARY);
            if (PEAR::isError($e)) {
                $this->_ftp->popErrorHandling();
                return $e;
            }

            PEAR_Common::addTempFile($tmp . DIRECTORY_SEPARATOR . 'pear.ini');
            $this->_ftp->disconnect();
            $this->_ftp->popErrorHandling();
            $this->files['ftp'] = $tmp . DIRECTORY_SEPARATOR . 'pear.ini';
            $e = $this->readConfigFile(null, 'ftp');
            if (PEAR::isError($e)) {
                return $e;
            }

            $fail = array();
            foreach ($this->configuration_info as $key => $val) {
                if (in_array($this->getGroup($key),
                      array('File Locations', 'File Locations (Advanced)')) &&
                      $this->getType($key) == 'directory') {
                    // any directory configs must be set for this to work
                    if (!isset($this->configuration['ftp'][$key])) {
                        $fail[] = $key;
                    }
                }
            }

            if (!count($fail)) {
                return true;
            }

            $fail = '"' . implode('", "', $fail) . '"';
            unset($this->files['ftp']);
            unset($this->configuration['ftp']);
            return PEAR::raiseError('ERROR: Ftp configuration file must set all ' .
                'directory configuration variables.  These variables were not set: ' .
                $fail);
        } while (false); // poor man's catch
        unset($this->files['ftp']);
        return PEAR::raiseError('no remote host specified');
    }

    /**
     * Reads the existing configurations and creates the _channels array from it
     */
    function _setupChannels()
    {
        $set = array_flip(array_values($this->_channels));
        foreach ($this->configuration as $layer => $data) {
            $i = 1000;
            if (isset($data['__channels']) && is_array($data['__channels'])) {
                foreach ($data['__channels'] as $channel => $info) {
                    $set[$channel] = $i++;
                }
            }
        }
        $this->_channels = array_values(array_flip($set));
        $this->setChannels($this->_channels);
    }

    function deleteChannel($channel)
    {
        $ch = strtolower($channel);
        foreach ($this->configuration as $layer => $data) {
            if (isset($data['__channels']) && isset($data['__channels'][$ch])) {
                unset($this->configuration[$layer]['__channels'][$ch]);
            }
        }

        $this->_channels = array_flip($this->_channels);
        unset($this->_channels[$ch]);
        $this->_channels = array_flip($this->_channels);
    }

    /**
     * Merges data into a config layer from a file.  Does the same
     * thing as readConfigFile, except it does not replace all
     * existing values in the config layer.
     * @param string file to read from
     * @param bool whether to overwrite existing data (default TRUE)
     * @param string config layer to insert data into ('user' or 'system')
     * @param string if true, errors are returned if file opening fails
     * @return bool TRUE on success or a PEAR error on failure
     */
    function mergeConfigFile($file, $override = true, $layer = 'user', $strict = true)
    {
        if (empty($this->files[$layer])) {
            return $this->raiseError("unknown config layer `$layer'");
        }

        if ($file === null) {
            $file = $this->files[$layer];
        }

        $data = $this->_readConfigDataFrom($file);
        if (PEAR::isError($data)) {
            if (!$strict) {
                return true;
            }

            $this->_errorsFound++;
            $this->_lastError = $data;

            return $data;
        }

        $this->_decodeInput($data);
        if ($override) {
            $this->configuration[$layer] =
                PEAR_Config::arrayMergeRecursive($this->configuration[$layer], $data);
        } else {
            $this->configuration[$layer] =
                PEAR_Config::arrayMergeRecursive($data, $this->configuration[$layer]);
        }

        $this->_setupChannels();
        if (!$this->_noRegistry && ($phpdir = $this->get('php_dir', $layer, 'pear.php.net'))) {
            $this->_registry[$layer] = new PEAR_Registry(
                $phpdir, false, false,
                $this->get('metadata_dir', $layer, 'pear.php.net'));
            $this->_registry[$layer]->setConfig($this, false);
            $this->_regInitialized[$layer] = false;
        } else {
            unset($this->_registry[$layer]);
        }
        return true;
    }

    /**
     * @param array
     * @param array
     * @return array
     */
    public static function arrayMergeRecursive($arr2, $arr1)
    {
        $ret = array();
        foreach ($arr2 as $key => $data) {
            if (!isset($arr1[$key])) {
                $ret[$key] = $data;
                unset($arr1[$key]);
                continue;
            }
            if (is_array($data)) {
                if (!is_array($arr1[$key])) {
                    $ret[$key] = $arr1[$key];
                    unset($arr1[$key]);
                    continue;
                }
                $ret[$key] = PEAR_Config::arrayMergeRecursive($arr1[$key], $arr2[$key]);
                unset($arr1[$key]);
            }
        }

        return array_merge($ret, $arr1);
    }

    /**
     * Writes data into a config layer from a file.
     *
     * @param string|null file to read from, or null for default
     * @param string config layer to insert data into ('user' or
     *               'system')
     * @param string|null data to write to config file or null for internal data [DEPRECATED]
     * @return bool TRUE on success or a PEAR error on failure
     */
    function writeConfigFile($file = null, $layer = 'user', $data = null)
    {
        $this->_lazyChannelSetup($layer);
        if ($layer == 'both' || $layer == 'all') {
            foreach ($this->files as $type => $file) {
                $err = $this->writeConfigFile($file, $type, $data);
                if (PEAR::isError($err)) {
                    return $err;
                }
            }
            return true;
        }

        if (empty($this->files[$layer])) {
            return $this->raiseError("unknown config file type `$layer'");
        }

        if ($file === null) {
            $file = $this->files[$layer];
        }

        $data = ($data === null) ? $this->configuration[$layer] : $data;
        $this->_encodeOutput($data);
        $opt = array('-p', dirname($file));
        if (!@System::mkDir($opt)) {
            return $this->raiseError("could not create directory: " . dirname($file));
        }

        if (file_exists($file) && is_file($file) && !is_writeable($file)) {
            return $this->raiseError("no write access to $file!");
        }

        $fp = @fopen($file, "w");
        if (!$fp) {
            return $this->raiseError("PEAR_Config::writeConfigFile fopen('$file','w') failed ($php_errormsg)");
        }

        $contents = "#PEAR_Config 0.9\n" . serialize($data);
        if (!@fwrite($fp, $contents)) {
            return $this->raiseError("PEAR_Config::writeConfigFile: fwrite failed ($php_errormsg)");
        }
        return true;
    }

    /**
     * Reads configuration data from a file and returns the parsed data
     * in an array.
     *
     * @param string file to read from
     * @return array configuration data or a PEAR error on failure
     * @access private
     */
    function _readConfigDataFrom($file)
    {
        $fp = false;
        if (file_exists($file)) {
            $fp = @fopen($file, "r");
        }

        if (!$fp) {
            return $this->raiseError("PEAR_Config::readConfigFile fopen('$file','r') failed");
        }

        $size = filesize($file);
        fclose($fp);
        $contents = file_get_contents($file);
        if (empty($contents)) {
            return $this->raiseError('Configuration file "' . $file . '" is empty');
        }

        $version = false;
        if (preg_match('/^#PEAR_Config\s+(\S+)\s+/si', $contents, $matches)) {
            $version = $matches[1];
            $contents = substr($contents, strlen($matches[0]));
        } else {
            // Museum config file
            if (substr($contents,0,2) == 'a:') {
                $version = '0.1';
            }
        }

        if ($version && version_compare("$version", '1', '<')) {
            $data = @unserialize($contents);

            if (!is_array($data) && !$data) {
                if ($contents == serialize(false)) {
                    $data = array();
                } else {
                    $err = $this->raiseError("PEAR_Config: bad data in $file");
                    return $err;
                }
            }
            if (!is_array($data)) {
                if (strlen(trim($contents)) > 0) {
                    $error = "PEAR_Config: bad data in $file";
                    $err = $this->raiseError($error);
                    return $err;
                }

                $data = array();
            }
        // add parsing of newer formats here...
        } else {
            $err = $this->raiseError("$file: unknown version `$version'");
            return $err;
        }

        return $data;
    }

    /**
    * Gets the file used for storing the config for a layer
    *
    * @param string $layer 'user' or 'system'
    */
    function getConfFile($layer)
    {
        return $this->files[$layer];
    }

    /**
     * @param string Configuration class name, used for detecting duplicate calls
     * @param array information on a role as parsed from its xml file
     * @return true|PEAR_Error
     * @access private
     */
    function _addConfigVars($class, $vars)
    {
        static $called = array();
        if (isset($called[$class])) {
            return;
        }

        $called[$class] = 1;
        if (count($vars) > 3) {
            return $this->raiseError('Roles can only define 3 new config variables or less');
        }

        foreach ($vars as $name => $var) {
            if (!is_array($var)) {
                return $this->raiseError('Configuration information must be an array');
            }

            if (!isset($var['type'])) {
                return $this->raiseError('Configuration information must contain a type');
            } elseif (!in_array($var['type'],
                    array('string', 'mask', 'password', 'directory', 'file', 'set'))) {
                  return $this->raiseError(
                      'Configuration type must be one of directory, file, string, ' .
                      'mask, set, or password');
            }
            if (!isset($var['default'])) {
                return $this->raiseError(
                    'Configuration information must contain a default value ("default" index)');
            }

            if (is_array($var['default'])) {
                $real_default = '';
                foreach ($var['default'] as $config_var => $val) {
                    if (strpos($config_var, 'text') === 0) {
                        $real_default .= $val;
                    } elseif (strpos($config_var, 'constant') === 0) {
                        if (!defined($val)) {
                            return $this->raiseError(
                                'Unknown constant "' . $val . '" requested in ' .
                                'default value for configuration variable "' .
                                $name . '"');
                        }

                        $real_default .= constant($val);
                    } elseif (isset($this->configuration_info[$config_var])) {
                        $real_default .=
                            $this->configuration_info[$config_var]['default'];
                    } else {
                        return $this->raiseError(
                            'Unknown request for "' . $config_var . '" value in ' .
                            'default value for configuration variable "' .
                            $name . '"');
                    }
                }
                $var['default'] = $real_default;
            }

            if ($var['type'] == 'integer') {
                $var['default'] = (integer) $var['default'];
            }

            if (!isset($var['doc'])) {
                return $this->raiseError(
                    'Configuration information must contain a summary ("doc" index)');
            }

            if (!isset($var['prompt'])) {
                return $this->raiseError(
                    'Configuration information must contain a simple prompt ("prompt" index)');
            }

            if (!isset($var['group'])) {
                return $this->raiseError(
                    'Configuration information must contain a simple group ("group" index)');
            }

            if (isset($this->configuration_info[$name])) {
                return $this->raiseError('Configuration variable "' . $name .
                    '" already exists');
            }

            $this->configuration_info[$name] = $var;
            // fix bug #7351: setting custom config variable in a channel fails
            $this->_channelConfigInfo[] = $name;
        }

        return true;
    }

    /**
     * Encodes/scrambles configuration data before writing to files.
     * Currently, 'password' values will be base64-encoded as to avoid
     * that people spot cleartext passwords by accident.
     *
     * @param array (reference) array to encode values in
     * @return bool TRUE on success
     * @access private
     */
    function _encodeOutput(&$data)
    {
        foreach ($data as $key => $value) {
            if ($key == '__channels') {
                foreach ($data['__channels'] as $channel => $blah) {
                    $this->_encodeOutput($data['__channels'][$channel]);
                }
            }

            if (!isset($this->configuration_info[$key])) {
                continue;
            }

            $type = $this->configuration_info[$key]['type'];
            switch ($type) {
                // we base64-encode passwords so they are at least
                // not shown in plain by accident
                case 'password': {
                    $data[$key] = base64_encode($data[$key]);
                    break;
                }
                case 'mask': {
                    $data[$key] = octdec($data[$key]);
                    break;
                }
            }
        }

        return true;
    }

    /**
     * Decodes/unscrambles configuration data after reading from files.
     *
     * @param array (reference) array to encode values in
     * @return bool TRUE on success
     * @access private
     *
     * @see PEAR_Config::_encodeOutput
     */
    function _decodeInput(&$data)
    {
        if (!is_array($data)) {
            return true;
        }

        foreach ($data as $key => $value) {
            if ($key == '__channels') {
                foreach ($data['__channels'] as $channel => $blah) {
                    $this->_decodeInput($data['__channels'][$channel]);
                }
            }

            if (!isset($this->configuration_info[$key])) {
                continue;
            }

            $type = $this->configuration_info[$key]['type'];
            switch ($type) {
                case 'password': {
                    $data[$key] = base64_decode($data[$key]);
                    break;
                }
                case 'mask': {
                    $data[$key] = decoct($data[$key]);
                    break;
                }
            }
        }

        return true;
    }

    /**
     * Retrieve the default channel.
     *
     * On startup, channels are not initialized, so if the default channel is not
     * pear.php.net, then initialize the config.
     * @param string registry layer
     * @return string|false
     */
    function getDefaultChannel($layer = null)
    {
        $ret = false;
        if ($layer === null) {
            foreach ($this->layers as $layer) {
                if (isset($this->configuration[$layer]['default_channel'])) {
                    $ret = $this->configuration[$layer]['default_channel'];
                    break;
                }
            }
        } elseif (isset($this->configuration[$layer]['default_channel'])) {
            $ret = $this->configuration[$layer]['default_channel'];
        }

        if ($ret == 'pear.php.net' && defined('PEAR_RUNTYPE') && PEAR_RUNTYPE == 'pecl') {
            $ret = 'pecl.php.net';
        }

        if ($ret) {
            if ($ret != 'pear.php.net') {
                $this->_lazyChannelSetup();
            }

            return $ret;
        }

        return PEAR_CONFIG_DEFAULT_CHANNEL;
    }

    /**
     * Returns a configuration value, prioritizing layers as per the
     * layers property.
     *
     * @param string config key
     * @return mixed the config value, or NULL if not found
     * @access public
     */
    function get($key, $layer = null, $channel = false)
    {
        if (!isset($this->configuration_info[$key])) {
            return null;
        }

        if ($key == '__channels') {
            return null;
        }

        if ($key == 'default_channel') {
            return $this->getDefaultChannel($layer);
        }

        if (!$channel) {
            $channel = $this->getDefaultChannel();
        } elseif ($channel != 'pear.php.net') {
            $this->_lazyChannelSetup();
        }
        $channel = strtolower($channel);

        $test = (in_array($key, $this->_channelConfigInfo)) ?
            $this->_getChannelValue($key, $layer, $channel) :
            null;
        if ($test !== null) {
            if ($this->_installRoot) {
                if (in_array($this->getGroup($key),
                      array('File Locations', 'File Locations (Advanced)')) &&
                      $this->getType($key) == 'directory') {
                    return $this->_prependPath($test, $this->_installRoot);
                }
            }
            return $test;
        }

        if ($layer === null) {
            foreach ($this->layers as $layer) {
                if (isset($this->configuration[$layer][$key])) {
                    $test = $this->configuration[$layer][$key];
                    if ($this->_installRoot) {
                        if (in_array($this->getGroup($key),
                              array('File Locations', 'File Locations (Advanced)')) &&
                              $this->getType($key) == 'directory') {
                            return $this->_prependPath($test, $this->_installRoot);
                        }
                    }

                    if ($key == 'preferred_mirror') {
                        $reg = &$this->getRegistry();
                        if (is_object($reg)) {
                            $chan = $reg->getChannel($channel);
                            if (PEAR::isError($chan)) {
                                return $channel;
                            }

                            if (!$chan->getMirror($test) && $chan->getName() != $test) {
                                return $channel; // mirror does not exist
                            }
                        }
                    }
                    return $test;
                }
            }
        } elseif (isset($this->configuration[$layer][$key])) {
            $test = $this->configuration[$layer][$key];
            if ($this->_installRoot) {
                if (in_array($this->getGroup($key),
                      array('File Locations', 'File Locations (Advanced)')) &&
                      $this->getType($key) == 'directory') {
                    return $this->_prependPath($test, $this->_installRoot);
                }
            }

            if ($key == 'preferred_mirror') {
                $reg = &$this->getRegistry();
                if (is_object($reg)) {
                    $chan = $reg->getChannel($channel);
                    if (PEAR::isError($chan)) {
                        return $channel;
                    }

                    if (!$chan->getMirror($test) && $chan->getName() != $test) {
                        return $channel; // mirror does not exist
                    }
                }
            }

            return $test;
        }

        return null;
    }

    /**
     * Returns a channel-specific configuration value, prioritizing layers as per the
     * layers property.
     *
     * @param string config key
     * @return mixed the config value, or NULL if not found
     * @access private
     */
    function _getChannelValue($key, $layer, $channel)
    {
        if ($key == '__channels' || $channel == 'pear.php.net') {
            return null;
        }

        $ret = null;
        if ($layer === null) {
            foreach ($this->layers as $ilayer) {
                if (isset($this->configuration[$ilayer]['__channels'][$channel][$key])) {
                    $ret = $this->configuration[$ilayer]['__channels'][$channel][$key];
                    break;
                }
            }
        } elseif (isset($this->configuration[$layer]['__channels'][$channel][$key])) {
            $ret = $this->configuration[$layer]['__channels'][$channel][$key];
        }

        if ($key != 'preferred_mirror') {
            return $ret;
        }


        if ($ret !== null) {
            $reg = &$this->getRegistry($layer);
            if (is_object($reg)) {
                $chan = $reg->getChannel($channel);
                if (PEAR::isError($chan)) {
                    return $channel;
                }

                if (!$chan->getMirror($ret) && $chan->getName() != $ret) {
                    return $channel; // mirror does not exist
                }
            }

            return $ret;
        }

        if ($channel != $this->getDefaultChannel($layer)) {
            return $channel; // we must use the channel name as the preferred mirror
                             // if the user has not chosen an alternate
        }

        return $this->getDefaultChannel($layer);
    }

    /**
     * Set a config value in a specific layer (defaults to 'user').
     * Enforces the types defined in the configuration_info array.  An
     * integer config variable will be cast to int, and a set config
     * variable will be validated against its legal values.
     *
     * @param string config key
     * @param string config value
     * @param string (optional) config layer
     * @param string channel to set this value for, or null for global value
     * @return bool TRUE on success, FALSE on failure
     */
    function set($key, $value, $layer = 'user', $channel = false)
    {
        if ($key == '__channels') {
            return false;
        }

        if (!isset($this->configuration[$layer])) {
            return false;
        }

        if ($key == 'default_channel') {
            // can only set this value globally
            $channel = 'pear.php.net';
            if ($value != 'pear.php.net') {
                $this->_lazyChannelSetup($layer);
            }
        }

        if ($key == 'preferred_mirror') {
            if ($channel == '__uri') {
                return false; // can't set the __uri pseudo-channel's mirror
            }

            $reg = &$this->getRegistry($layer);
            if (is_object($reg)) {
                $chan = $reg->getChannel($channel ? $channel : 'pear.php.net');
                if (PEAR::isError($chan)) {
                    return false;
                }

                if (!$chan->getMirror($value) && $chan->getName() != $value) {
                    return false; // mirror does not exist
                }
            }
        }

        if (!isset($this->configuration_info[$key])) {
            return false;
        }

        extract($this->configuration_info[$key]);
        switch ($type) {
            case 'integer':
                $value = (int)$value;
                break;
            case 'set': {
                // If a valid_set is specified, require the value to
                // be in the set.  If there is no valid_set, accept
                // any value.
                if ($valid_set) {
                    reset($valid_set);
                    if ((key($valid_set) === 0 && !in_array($value, $valid_set)) ||
                        (key($valid_set) !== 0 && empty($valid_set[$value])))
                    {
                        return false;
                    }
                }
                break;
            }
        }

        if (!$channel) {
            $channel = $this->get('default_channel', null, 'pear.php.net');
        }

        if (!in_array($channel, $this->_channels)) {
            $this->_lazyChannelSetup($layer);
            $reg = &$this->getRegistry($layer);
            if ($reg) {
                $channel = $reg->channelName($channel);
            }

            if (!in_array($channel, $this->_channels)) {
                return false;
            }
        }

        if ($channel != 'pear.php.net') {
            if (in_array($key, $this->_channelConfigInfo)) {
                $this->configuration[$layer]['__channels'][$channel][$key] = $value;
                return true;
            }

            return false;
        }

        if ($key == 'default_channel') {
            if (!isset($reg)) {
                $reg = &$this->getRegistry($layer);
                if (!$reg) {
                    $reg = &$this->getRegistry();
                }
            }

            if ($reg) {
                $value = $reg->channelName($value);
            }

            if (!$value) {
                return false;
            }
        }

        $this->configuration[$layer][$key] = $value;
        if ($key == 'php_dir' && !$this->_noRegistry) {
            if (!isset($this->_registry[$layer]) ||
                  $value != $this->_registry[$layer]->install_dir) {
                $this->_registry[$layer] = new PEAR_Registry($value);
                $this->_regInitialized[$layer] = false;
                $this->_registry[$layer]->setConfig($this, false);
            }
        }

        return true;
    }

    function _lazyChannelSetup($uselayer = false)
    {
        if ($this->_noRegistry) {
            return;
        }

        $merge = false;
        foreach ($this->_registry as $layer => $p) {
            if ($uselayer && $uselayer != $layer) {
                continue;
            }

            if (!$this->_regInitialized[$layer]) {
                if ($layer == 'default' && isset($this->_registry['user']) ||
                      isset($this->_registry['system'])) {
                    // only use the default registry if there are no alternatives
                    continue;
                }

                if (!is_object($this->_registry[$layer])) {
                    if ($phpdir = $this->get('php_dir', $layer, 'pear.php.net')) {
                        $this->_registry[$layer] = new PEAR_Registry(
                            $phpdir, false, false,
                            $this->get('metadata_dir', $layer, 'pear.php.net'));
                        $this->_registry[$layer]->setConfig($this, false);
                        $this->_regInitialized[$layer] = false;
                    } else {
                        unset($this->_registry[$layer]);
                        return;
                    }
                }

                $this->setChannels($this->_registry[$layer]->listChannels(), $merge);
                $this->_regInitialized[$layer] = true;
                $merge = true;
            }
        }
    }

    /**
     * Set the list of channels.
     *
     * This should be set via a call to {@link PEAR_Registry::listChannels()}
     * @param array
     * @param bool
     * @return bool success of operation
     */
    function setChannels($channels, $merge = false)
    {
        if (!is_array($channels)) {
            return false;
        }

        if ($merge) {
            $this->_channels = array_merge($this->_channels, $channels);
        } else {
            $this->_channels = $channels;
        }

        foreach ($channels as $channel) {
            $channel = strtolower($channel);
            if ($channel == 'pear.php.net') {
                continue;
            }

            foreach ($this->layers as $layer) {
                if (!isset($this->configuration[$layer]['__channels'])) {
                    $this->configuration[$layer]['__channels'] = array();
                }
                if (!isset($this->configuration[$layer]['__channels'][$channel])
                      || !is_array($this->configuration[$layer]['__channels'][$channel])) {
                    $this->configuration[$layer]['__channels'][$channel] = array();
                }
            }
        }

        return true;
    }

    /**
     * Get the type of a config value.
     *
     * @param string  config key
     *
     * @return string type, one of "string", "integer", "file",
     * "directory", "set" or "password".
     *
     * @access public
     *
     */
    function getType($key)
    {
        if (isset($this->configuration_info[$key])) {
            return $this->configuration_info[$key]['type'];
        }
        return false;
    }

    /**
     * Get the documentation for a config value.
     *
     * @param string  config key
     * @return string documentation string
     *
     * @access public
     *
     */
    function getDocs($key)
    {
        if (isset($this->configuration_info[$key])) {
            return $this->configuration_info[$key]['doc'];
        }

        return false;
    }

    /**
     * Get the short documentation for a config value.
     *
     * @param string  config key
     * @return string short documentation string
     *
     * @access public
     *
     */
    function getPrompt($key)
    {
        if (isset($this->configuration_info[$key])) {
            return $this->configuration_info[$key]['prompt'];
        }

        return false;
    }

    /**
     * Get the parameter group for a config key.
     *
     * @param string  config key
     * @return string parameter group
     *
     * @access public
     *
     */
    function getGroup($key)
    {
        if (isset($this->configuration_info[$key])) {
            return $this->configuration_info[$key]['group'];
        }

        return false;
    }

    /**
     * Get the list of parameter groups.
     *
     * @return array list of parameter groups
     *
     * @access public
     *
     */
    function getGroups()
    {
        $tmp = array();
        foreach ($this->configuration_info as $key => $info) {
            $tmp[$info['group']] = 1;
        }

        return array_keys($tmp);
    }

    /**
     * Get the list of the parameters in a group.
     *
     * @param string $group parameter group
     * @return array list of parameters in $group
     *
     * @access public
     *
     */
    function getGroupKeys($group)
    {
        $keys = array();
        foreach ($this->configuration_info as $key => $info) {
            if ($info['group'] == $group) {
                $keys[] = $key;
            }
        }

        return $keys;
    }

    /**
     * Get the list of allowed set values for a config value.  Returns
     * NULL for config values that are not sets.
     *
     * @param string  config key
     * @return array enumerated array of set values, or NULL if the
     *               config key is unknown or not a set
     *
     * @access public
     *
     */
    function getSetValues($key)
    {
        if (isset($this->configuration_info[$key]) &&
            isset($this->configuration_info[$key]['type']) &&
            $this->configuration_info[$key]['type'] == 'set')
        {
            $valid_set = $this->configuration_info[$key]['valid_set'];
            reset($valid_set);
            if (key($valid_set) === 0) {
                return $valid_set;
            }

            return array_keys($valid_set);
        }

        return null;
    }

    /**
     * Get all the current config keys.
     *
     * @return array simple array of config keys
     *
     * @access public
     */
    function getKeys()
    {
        $keys = array();
        foreach ($this->layers as $layer) {
            $test = $this->configuration[$layer];
            if (isset($test['__channels'])) {
                foreach ($test['__channels'] as $channel => $configs) {
                    $keys = array_merge($keys, $configs);
                }
            }

            unset($test['__channels']);
            $keys = array_merge($keys, $test);

        }
        return array_keys($keys);
    }

    /**
     * Remove the a config key from a specific config layer.
     *
     * @param string config key
     * @param string (optional) config layer
     * @param string (optional) channel (defaults to default channel)
     * @return bool TRUE on success, FALSE on failure
     *
     * @access public
     */
    function remove($key, $layer = 'user', $channel = null)
    {
        if ($channel === null) {
            $channel = $this->getDefaultChannel();
        }

        if ($channel !== 'pear.php.net') {
            if (isset($this->configuration[$layer]['__channels'][$channel][$key])) {
                unset($this->configuration[$layer]['__channels'][$channel][$key]);
                return true;
            }
        }

        if (isset($this->configuration[$layer][$key])) {
            unset($this->configuration[$layer][$key]);
            return true;
        }

        return false;
    }

    /**
     * Temporarily remove an entire config layer.  USE WITH CARE!
     *
     * @param string config key
     * @param string (optional) config layer
     * @return bool TRUE on success, FALSE on failure
     *
     * @access public
     */
    function removeLayer($layer)
    {
        if (isset($this->configuration[$layer])) {
            $this->configuration[$layer] = array();
            return true;
        }

        return false;
    }

    /**
     * Stores configuration data in a layer.
     *
     * @param string config layer to store
     * @return bool TRUE on success, or PEAR error on failure
     *
     * @access public
     */
    function store($layer = 'user', $data = null)
    {
        return $this->writeConfigFile(null, $layer, $data);
    }

    /**
     * Tells what config layer that gets to define a key.
     *
     * @param string config key
     * @param boolean return the defining channel
     *
     * @return string|array the config layer, or an empty string if not found.
     *
     *         if $returnchannel, the return is an array array('layer' => layername,
     *         'channel' => channelname), or an empty string if not found
     *
     * @access public
     */
    function definedBy($key, $returnchannel = false)
    {
        foreach ($this->layers as $layer) {
            $channel = $this->getDefaultChannel();
            if ($channel !== 'pear.php.net') {
                if (isset($this->configuration[$layer]['__channels'][$channel][$key])) {
                    if ($returnchannel) {
                        return array('layer' => $layer, 'channel' => $channel);
                    }
                    return $layer;
                }
            }

            if (isset($this->configuration[$layer][$key])) {
                if ($returnchannel) {
                    return array('layer' => $layer, 'channel' => 'pear.php.net');
                }
                return $layer;
            }
        }

        return '';
    }

    /**
     * Tells whether a given key exists as a config value.
     *
     * @param string config key
     * @return bool whether <config key> exists in this object
     *
     * @access public
     */
    function isDefined($key)
    {
        foreach ($this->layers as $layer) {
            if (isset($this->configuration[$layer][$key])) {
                return true;
            }
        }

        return false;
    }

    /**
     * Tells whether a given config layer exists.
     *
     * @param string config layer
     * @return bool whether <config layer> exists in this object
     *
     * @access public
     */
    function isDefinedLayer($layer)
    {
        return isset($this->configuration[$layer]);
    }

    /**
     * Returns the layers defined (except the 'default' one)
     *
     * @return array of the defined layers
     */
    function getLayers()
    {
        $cf = $this->configuration;
        unset($cf['default']);
        return array_keys($cf);
    }

    function apiVersion()
    {
        return '1.1';
    }

    /**
     * @return PEAR_Registry
     */
    function &getRegistry($use = null)
    {
        $layer = $use === null ? 'user' : $use;
        if (isset($this->_registry[$layer])) {
            return $this->_registry[$layer];
        } elseif ($use === null && isset($this->_registry['system'])) {
            return $this->_registry['system'];
        } elseif ($use === null && isset($this->_registry['default'])) {
            return $this->_registry['default'];
        } elseif ($use) {
            $a = false;
            return $a;
        }

        // only go here if null was passed in
        echo "CRITICAL ERROR: Registry could not be initialized from any value";
        exit(1);
    }

    /**
     * This is to allow customization like the use of installroot
     * @param PEAR_Registry
     * @return bool
     */
    function setRegistry(&$reg, $layer = 'user')
    {
        if ($this->_noRegistry) {
            return false;
        }

        if (!in_array($layer, array('user', 'system'))) {
            return false;
        }

        $this->_registry[$layer] = &$reg;
        if (is_object($reg)) {
            $this->_registry[$layer]->setConfig($this, false);
        }

        return true;
    }

    function noRegistry()
    {
        $this->_noRegistry = true;
    }

    /**
     * @return PEAR_REST
     */
    function &getREST($version, $options = array())
    {
        $version = str_replace('.', '', $version);
        if (!class_exists($class = 'PEAR_REST_' . $version)) {
            require_once 'PEAR/REST/' . $version . '.php';
        }

        $remote = new $class($this, $options);
        return $remote;
    }

    /**
     * The ftp server is set in {@link readFTPConfigFile()}.  It exists only if a
     * remote configuration file has been specified
     * @return PEAR_FTP|false
     */
    function &getFTP()
    {
        if (isset($this->_ftp)) {
            return $this->_ftp;
        }

        $a = false;
        return $a;
    }

    static function _prependPath($path, $prepend)
    {
        if (strlen($prepend) > 0) {
            if (OS_WINDOWS && preg_match('/^[a-z]:/i', $path)) {
                if (preg_match('/^[a-z]:/i', $prepend)) {
                    $prepend = substr($prepend, 2);
                } elseif ($prepend[0] != '\\') {
                    $prepend = "\\$prepend";
                }
                $path = substr($path, 0, 2) . $prepend . substr($path, 2);
            } else {
                $path = $prepend . $path;
            }
        }
        return $path;
    }

    /**
     * @param string|false installation directory to prepend to all _dir variables, or false to
     *                     disable
     */
    function setInstallRoot($root)
    {
        if (substr($root, -1) == DIRECTORY_SEPARATOR) {
            $root = substr($root, 0, -1);
        }
        $old = $this->_installRoot;
        $this->_installRoot = $root;
        if (($old != $root) && !$this->_noRegistry) {
            foreach (array_keys($this->_registry) as $layer) {
                if ($layer == 'ftp' || !isset($this->_registry[$layer])) {
                    continue;
                }
                $this->_registry[$layer] =
                    new PEAR_Registry(
                        $this->get('php_dir', $layer, 'pear.php.net'), false, false,
                        $this->get('metadata_dir', $layer, 'pear.php.net'));
                $this->_registry[$layer]->setConfig($this, false);
                $this->_regInitialized[$layer] = false;
            }
        }
    }
}
PK�a�\��Y�;;pear/PEAR/REST/13.phpnu�[���<?php
/**
 * PEAR_REST_13
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a12
 */

/**
 * For downloading REST xml/txt files
 */
require_once 'PEAR/REST.php';
require_once 'PEAR/REST/10.php';

/**
 * Implement REST 1.3
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a12
 */
class PEAR_REST_13 extends PEAR_REST_10
{
    /**
     * Retrieve information about a remote package to be downloaded from a REST server
     *
     * This is smart enough to resolve the minimum PHP version dependency prior to download
     * @param string $base The uri to prepend to all REST calls
     * @param array $packageinfo an array of format:
     * <pre>
     *  array(
     *   'package' => 'packagename',
     *   'channel' => 'channelname',
     *  ['state' => 'alpha' (or valid state),]
     *  -or-
     *  ['version' => '1.whatever']
     * </pre>
     * @param string $prefstate Current preferred_state config variable value
     * @param bool $installed the installed version of this package to compare against
     * @return array|false|PEAR_Error see {@link _returnDownloadURL()}
     */
    function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false)
    {
        $states = $this->betterStates($prefstate, true);
        if (!$states) {
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
        }

        $channel  = $packageinfo['channel'];
        $package  = $packageinfo['package'];
        $state    = isset($packageinfo['state'])   ? $packageinfo['state']   : null;
        $version  = isset($packageinfo['version']) ? $packageinfo['version'] : null;
        $restFile = $base . 'r/' . strtolower($package) . '/allreleases2.xml';

        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
        if (PEAR::isError($info)) {
            return PEAR::raiseError('No releases available for package "' .
                $channel . '/' . $package . '"');
        }

        if (!isset($info['r'])) {
            return false;
        }

        $release = $found = false;
        if (!is_array($info['r']) || !isset($info['r'][0])) {
            $info['r'] = array($info['r']);
        }

        $skippedphp = false;
        foreach ($info['r'] as $release) {
            if (!isset($this->_rest->_options['force']) && ($installed &&
                  version_compare($release['v'], $installed, '<'))) {
                continue;
            }

            if (isset($state)) {
                // try our preferred state first
                if ($release['s'] == $state) {
                    if (!isset($version) && version_compare($release['m'], phpversion(), '>')) {
                        // skip releases that require a PHP version newer than our PHP version
                        $skippedphp = $release;
                        continue;
                    }
                    $found = true;
                    break;
                }

                // see if there is something newer and more stable
                // bug #7221
                if (in_array($release['s'], $this->betterStates($state), true)) {
                    if (!isset($version) && version_compare($release['m'], phpversion(), '>')) {
                        // skip releases that require a PHP version newer than our PHP version
                        $skippedphp = $release;
                        continue;
                    }
                    $found = true;
                    break;
                }
            } elseif (isset($version)) {
                if ($release['v'] == $version) {
                    if (!isset($this->_rest->_options['force']) &&
                          !isset($version) &&
                          version_compare($release['m'], phpversion(), '>')) {
                        // skip releases that require a PHP version newer than our PHP version
                        $skippedphp = $release;
                        continue;
                    }
                    $found = true;
                    break;
                }
            } else {
                if (in_array($release['s'], $states)) {
                    if (version_compare($release['m'], phpversion(), '>')) {
                        // skip releases that require a PHP version newer than our PHP version
                        $skippedphp = $release;
                        continue;
                    }
                    $found = true;
                    break;
                }
            }
        }

        if (!$found && $skippedphp) {
            $found = null;
        }

        return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel);
    }

    function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage,
                               $prefstate = 'stable', $installed = false, $channel = false)
    {
        $states = $this->betterStates($prefstate, true);
        if (!$states) {
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
        }

        $channel  = $dependency['channel'];
        $package  = $dependency['name'];
        $state    = isset($dependency['state'])   ? $dependency['state']   : null;
        $version  = isset($dependency['version']) ? $dependency['version'] : null;
        $restFile = $base . 'r/' . strtolower($package) .'/allreleases2.xml';

        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
        if (PEAR::isError($info)) {
            return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package']
                . '" dependency "' . $channel . '/' . $package . '" has no releases');
        }

        if (!is_array($info) || !isset($info['r'])) {
            return false;
        }

        $exclude = array();
        $min = $max = $recommended = false;
        if ($xsdversion == '1.0') {
            $pinfo['package'] = $dependency['name'];
            $pinfo['channel'] = 'pear.php.net'; // this is always true - don't change this
            switch ($dependency['rel']) {
                case 'ge' :
                    $min = $dependency['version'];
                break;
                case 'gt' :
                    $min = $dependency['version'];
                    $exclude = array($dependency['version']);
                break;
                case 'eq' :
                    $recommended = $dependency['version'];
                break;
                case 'lt' :
                    $max = $dependency['version'];
                    $exclude = array($dependency['version']);
                break;
                case 'le' :
                    $max = $dependency['version'];
                break;
                case 'ne' :
                    $exclude = array($dependency['version']);
                break;
            }
        } else {
            $pinfo['package'] = $dependency['name'];
            $min = isset($dependency['min']) ? $dependency['min'] : false;
            $max = isset($dependency['max']) ? $dependency['max'] : false;
            $recommended = isset($dependency['recommended']) ?
                $dependency['recommended'] : false;
            if (isset($dependency['exclude'])) {
                if (!isset($dependency['exclude'][0])) {
                    $exclude = array($dependency['exclude']);
                }
            }
        }

        $skippedphp = $found = $release = false;
        if (!is_array($info['r']) || !isset($info['r'][0])) {
            $info['r'] = array($info['r']);
        }

        foreach ($info['r'] as $release) {
            if (!isset($this->_rest->_options['force']) && ($installed &&
                  version_compare($release['v'], $installed, '<'))) {
                continue;
            }

            if (in_array($release['v'], $exclude)) { // skip excluded versions
                continue;
            }

            // allow newer releases to say "I'm OK with the dependent package"
            if ($xsdversion == '2.0' && isset($release['co'])) {
                if (!is_array($release['co']) || !isset($release['co'][0])) {
                    $release['co'] = array($release['co']);
                }

                foreach ($release['co'] as $entry) {
                    if (isset($entry['x']) && !is_array($entry['x'])) {
                        $entry['x'] = array($entry['x']);
                    } elseif (!isset($entry['x'])) {
                        $entry['x'] = array();
                    }

                    if ($entry['c'] == $deppackage['channel'] &&
                          strtolower($entry['p']) == strtolower($deppackage['package']) &&
                          version_compare($deppackage['version'], $entry['min'], '>=') &&
                          version_compare($deppackage['version'], $entry['max'], '<=') &&
                          !in_array($release['v'], $entry['x'])) {
                        if (version_compare($release['m'], phpversion(), '>')) {
                            // skip dependency releases that require a PHP version
                            // newer than our PHP version
                            $skippedphp = $release;
                            continue;
                        }

                        $recommended = $release['v'];
                        break;
                    }
                }
            }

            if ($recommended) {
                if ($release['v'] != $recommended) { // if we want a specific
                    // version, then skip all others
                    continue;
                }

                if (!in_array($release['s'], $states)) {
                    // the stability is too low, but we must return the
                    // recommended version if possible
                    return $this->_returnDownloadURL($base, $package, $release, $info, true, false, $channel);
                }
            }

            if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions
                continue;
            }

            if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions
                continue;
            }

            if ($installed && version_compare($release['v'], $installed, '<')) {
                continue;
            }

            if (in_array($release['s'], $states)) { // if in the preferred state...
                if (version_compare($release['m'], phpversion(), '>')) {
                    // skip dependency releases that require a PHP version
                    // newer than our PHP version
                    $skippedphp = $release;
                    continue;
                }

                $found = true; // ... then use it
                break;
            }
        }

        if (!$found && $skippedphp) {
            $found = null;
        }

        return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel);
    }

    /**
     * List package upgrades but take the PHP version into account.
     */
    function listLatestUpgrades($base, $pref_state, $installed, $channel, &$reg)
    {
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }

        $ret = array();
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            return $ret;
        }

        if (!is_array($packagelist['p'])) {
            $packagelist['p'] = array($packagelist['p']);
        }

        foreach ($packagelist['p'] as $package) {
            if (!isset($installed[strtolower($package)])) {
                continue;
            }

            $inst_version = $reg->packageInfo($package, 'version', $channel);
            $inst_state   = $reg->packageInfo($package, 'release_state', $channel);
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
                '/allreleases2.xml', false, false, $channel);
            PEAR::popErrorHandling();
            if (PEAR::isError($info)) {
                continue; // no remote releases
            }

            if (!isset($info['r'])) {
                continue;
            }

            $release = $found = false;
            if (!is_array($info['r']) || !isset($info['r'][0])) {
                $info['r'] = array($info['r']);
            }

            // $info['r'] is sorted by version number
            usort($info['r'], array($this, '_sortReleasesByVersionNumber'));
            foreach ($info['r'] as $release) {
                if ($inst_version && version_compare($release['v'], $inst_version, '<=')) {
                    // not newer than the one installed
                    break;
                }
                if (version_compare($release['m'], phpversion(), '>')) {
                    // skip dependency releases that require a PHP version
                    // newer than our PHP version
                    continue;
                }

                // new version > installed version
                if (!$pref_state) {
                    // every state is a good state
                    $found = true;
                    break;
                } else {
                    $new_state = $release['s'];
                    // if new state >= installed state: go
                    if (in_array($new_state, $this->betterStates($inst_state, true))) {
                        $found = true;
                        break;
                    } else {
                        // only allow to lower the state of package,
                        // if new state >= preferred state: go
                        if (in_array($new_state, $this->betterStates($pref_state, true))) {
                            $found = true;
                            break;
                        }
                    }
                }
            }

            if (!$found) {
                continue;
            }

            $relinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/' .
                $release['v'] . '.xml', false, false, $channel);
            if (PEAR::isError($relinfo)) {
                return $relinfo;
            }

            $ret[$package] = array(
                'version'  => $release['v'],
                'state'    => $release['s'],
                'filesize' => $relinfo['f'],
            );
        }

        return $ret;
    }
}PK�a�\,#y��+�+pear/PEAR/REST/11.phpnu�[���<?php
/**
 * PEAR_REST_11 - implement faster list-all/remote-list command
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.3
 */

/**
 * For downloading REST xml/txt files
 */
require_once 'PEAR/REST.php';

/**
 * Implement REST 1.1
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.3
 */
class PEAR_REST_11
{
    /**
     * @var PEAR_REST
     */
    var $_rest;

    function __construct($config, $options = array())
    {
        $this->_rest = new PEAR_REST($config, $options);
    }

    function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false)
    {
        $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
        if (PEAR::isError($categorylist)) {
            return $categorylist;
        }

        $ret = array();
        if (!is_array($categorylist['c']) || !isset($categorylist['c'][0])) {
            $categorylist['c'] = array($categorylist['c']);
        }

        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);

        foreach ($categorylist['c'] as $progress => $category) {
            $category = $category['_content'];
            $packagesinfo = $this->_rest->retrieveData($base .
                'c/' . urlencode($category) . '/packagesinfo.xml', false, false, $channel);

            if (PEAR::isError($packagesinfo)) {
                continue;
            }

            if (!is_array($packagesinfo) || !isset($packagesinfo['pi'])) {
                continue;
            }

            if (!is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) {
                $packagesinfo['pi'] = array($packagesinfo['pi']);
            }

            foreach ($packagesinfo['pi'] as $packageinfo) {
                if (empty($packageinfo)) {
                    continue;
                }

                $info     = $packageinfo['p'];
                $package  = $info['n'];
                $releases = isset($packageinfo['a']) ? $packageinfo['a'] : false;
                unset($latest);
                unset($unstable);
                unset($stable);
                unset($state);

                if ($releases) {
                    if (!isset($releases['r'][0])) {
                        $releases['r'] = array($releases['r']);
                    }

                    foreach ($releases['r'] as $release) {
                        if (!isset($latest)) {
                            if ($dostable && $release['s'] == 'stable') {
                                $latest = $release['v'];
                                $state = 'stable';
                            }
                            if (!$dostable) {
                                $latest = $release['v'];
                                $state = $release['s'];
                            }
                        }

                        if (!isset($stable) && $release['s'] == 'stable') {
                            $stable = $release['v'];
                            if (!isset($unstable)) {
                                $unstable = $stable;
                            }
                        }

                        if (!isset($unstable) && $release['s'] != 'stable') {
                            $unstable = $release['v'];
                            $state = $release['s'];
                        }

                        if (isset($latest) && !isset($state)) {
                            $state = $release['s'];
                        }

                        if (isset($latest) && isset($stable) && isset($unstable)) {
                            break;
                        }
                    }
                }

                if ($basic) { // remote-list command
                    if (!isset($latest)) {
                        $latest = false;
                    }

                    if ($dostable) {
                        // $state is not set if there are no releases
                        if (isset($state) && $state == 'stable') {
                            $ret[$package] = array('stable' => $latest);
                        } else {
                            $ret[$package] = array('stable' => '-n/a-');
                        }
                    } else {
                        $ret[$package] = array('stable' => $latest);
                    }

                    continue;
                }

                // list-all command
                if (!isset($unstable)) {
                    $unstable = false;
                    $state = 'stable';
                    if (isset($stable)) {
                        $latest = $unstable = $stable;
                    }
                } else {
                    $latest = $unstable;
                }

                if (!isset($latest)) {
                    $latest = false;
                }

                $deps = array();
                if ($latest && isset($packageinfo['deps'])) {
                    if (!is_array($packageinfo['deps']) ||
                          !isset($packageinfo['deps'][0])
                    ) {
                        $packageinfo['deps'] = array($packageinfo['deps']);
                    }

                    $d = false;
                    foreach ($packageinfo['deps'] as $dep) {
                        if ($dep['v'] == $latest) {
                            $d = unserialize($dep['d']);
                        }
                    }

                    if ($d) {
                        if (isset($d['required'])) {
                            if (!class_exists('PEAR_PackageFile_v2')) {
                                require_once 'PEAR/PackageFile/v2.php';
                            }

                            if (!isset($pf)) {
                                $pf = new PEAR_PackageFile_v2;
                            }

                            $pf->setDeps($d);
                            $tdeps = $pf->getDeps();
                        } else {
                            $tdeps = $d;
                        }

                        foreach ($tdeps as $dep) {
                            if ($dep['type'] !== 'pkg') {
                                continue;
                            }

                            $deps[] = $dep;
                        }
                    }
                }

                $info = array(
                    'stable'      => $latest,
                    'summary'     => $info['s'],
                    'description' => $info['d'],
                    'deps'        => $deps,
                    'category'    => $info['ca']['_content'],
                    'unstable'    => $unstable,
                    'state'       => $state
                );
                $ret[$package] = $info;
            }
        }

        PEAR::popErrorHandling();
        return $ret;
    }

    /**
     * List all categories of a REST server
     *
     * @param string $base base URL of the server
     * @return array of categorynames
     */
    function listCategories($base, $channel = false)
    {
        $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
        if (PEAR::isError($categorylist)) {
            return $categorylist;
        }

        if (!is_array($categorylist) || !isset($categorylist['c'])) {
            return array();
        }

        if (isset($categorylist['c']['_content'])) {
            // only 1 category
            $categorylist['c'] = array($categorylist['c']);
        }

        return $categorylist['c'];
    }

    /**
     * List packages in a category of a REST server
     *
     * @param string $base base URL of the server
     * @param string $category name of the category
     * @param boolean $info also download full package info
     * @return array of packagenames
     */
    function listCategory($base, $category, $info = false, $channel = false)
    {
        if ($info == false) {
            $url = '%s'.'c/%s/packages.xml';
        } else {
            $url = '%s'.'c/%s/packagesinfo.xml';
        }
        $url = sprintf($url,
                    $base,
                    urlencode($category));

        // gives '404 Not Found' error when category doesn't exist
        $packagelist = $this->_rest->retrieveData($url, false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }
        if (!is_array($packagelist)) {
            return array();
        }

        if ($info == false) {
            if (!isset($packagelist['p'])) {
                return array();
            }
            if (!is_array($packagelist['p']) ||
                !isset($packagelist['p'][0])) { // only 1 pkg
                $packagelist = array($packagelist['p']);
            } else {
                $packagelist = $packagelist['p'];
            }
            return $packagelist;
        }

        // info == true
        if (!isset($packagelist['pi'])) {
            return array();
        }

        if (!is_array($packagelist['pi']) ||
            !isset($packagelist['pi'][0])) { // only 1 pkg
            $packagelist_pre = array($packagelist['pi']);
        } else {
            $packagelist_pre = $packagelist['pi'];
        }

        $packagelist = array();
        foreach ($packagelist_pre as $i => $item) {
            // compatibility with r/<latest.txt>.xml
            if (isset($item['a']['r'][0])) {
                // multiple releases
                $item['p']['v'] = $item['a']['r'][0]['v'];
                $item['p']['st'] = $item['a']['r'][0]['s'];
            } elseif (isset($item['a'])) {
                // first and only release
                $item['p']['v'] = $item['a']['r']['v'];
                $item['p']['st'] = $item['a']['r']['s'];
            }

            $packagelist[$i] = array('attribs' => $item['p']['r'],
                                     '_content' => $item['p']['n'],
                                     'info' => $item['p']);
        }

        return $packagelist;
    }

    /**
     * Return an array containing all of the states that are more stable than
     * or equal to the passed in state
     *
     * @param string Release state
     * @param boolean Determines whether to include $state in the list
     * @return false|array False if $state is not a valid release state
     */
    function betterStates($state, $include = false)
    {
        static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
        $i = array_search($state, $states);
        if ($i === false) {
            return false;
        }
        if ($include) {
            $i--;
        }
        return array_slice($states, $i + 1);
    }
}
?>
PK�a�\�W�f��pear/PEAR/REST/10.phpnu�[���<?php
/**
 * PEAR_REST_10
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a12
 */

/**
 * For downloading REST xml/txt files
 */
require_once 'PEAR/REST.php';

/**
 * Implement REST 1.0
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a12
 */
class PEAR_REST_10
{
    /**
     * @var PEAR_REST
     */
    var $_rest;
    function __construct($config, $options = array())
    {
        $this->_rest = new PEAR_REST($config, $options);
    }

    /**
     * Retrieve information about a remote package to be downloaded from a REST server
     *
     * @param string $base The uri to prepend to all REST calls
     * @param array $packageinfo an array of format:
     * <pre>
     *  array(
     *   'package' => 'packagename',
     *   'channel' => 'channelname',
     *  ['state' => 'alpha' (or valid state),]
     *  -or-
     *  ['version' => '1.whatever']
     * </pre>
     * @param string $prefstate Current preferred_state config variable value
     * @param bool $installed the installed version of this package to compare against
     * @return array|false|PEAR_Error see {@link _returnDownloadURL()}
     */
    function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false)
    {
        $states = $this->betterStates($prefstate, true);
        if (!$states) {
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
        }

        $channel  = $packageinfo['channel'];
        $package  = $packageinfo['package'];
        $state    = isset($packageinfo['state'])   ? $packageinfo['state']   : null;
        $version  = isset($packageinfo['version']) ? $packageinfo['version'] : null;
        $restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml';

        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
        if (PEAR::isError($info)) {
            return PEAR::raiseError('No releases available for package "' .
                $channel . '/' . $package . '"');
        }

        if (!isset($info['r'])) {
            return false;
        }

        $release = $found = false;
        if (!is_array($info['r']) || !isset($info['r'][0])) {
            $info['r'] = array($info['r']);
        }

        foreach ($info['r'] as $release) {
            if (!isset($this->_rest->_options['force']) && ($installed &&
                  version_compare($release['v'], $installed, '<'))) {
                continue;
            }

            if (isset($state)) {
                // try our preferred state first
                if ($release['s'] == $state) {
                    $found = true;
                    break;
                }
                // see if there is something newer and more stable
                // bug #7221
                if (in_array($release['s'], $this->betterStates($state), true)) {
                    $found = true;
                    break;
                }
            } elseif (isset($version)) {
                if ($release['v'] == $version) {
                    $found = true;
                    break;
                }
            } else {
                if (in_array($release['s'], $states)) {
                    $found = true;
                    break;
                }
            }
        }

        return $this->_returnDownloadURL($base, $package, $release, $info, $found, false, $channel);
    }

    function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage,
                               $prefstate = 'stable', $installed = false, $channel = false)
    {
        $states = $this->betterStates($prefstate, true);
        if (!$states) {
            return PEAR::raiseError('"' . $prefstate . '" is not a valid state');
        }

        $channel  = $dependency['channel'];
        $package  = $dependency['name'];
        $state    = isset($dependency['state'])   ? $dependency['state']   : null;
        $version  = isset($dependency['version']) ? $dependency['version'] : null;
        $restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml';

        $info = $this->_rest->retrieveData($restFile, false, false, $channel);
        if (PEAR::isError($info)) {
            return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package']
                . '" dependency "' . $channel . '/' . $package . '" has no releases');
        }

        if (!is_array($info) || !isset($info['r'])) {
            return false;
        }

        $exclude = array();
        $min = $max = $recommended = false;
        if ($xsdversion == '1.0') {
            switch ($dependency['rel']) {
                case 'ge' :
                    $min = $dependency['version'];
                break;
                case 'gt' :
                    $min = $dependency['version'];
                    $exclude = array($dependency['version']);
                break;
                case 'eq' :
                    $recommended = $dependency['version'];
                break;
                case 'lt' :
                    $max = $dependency['version'];
                    $exclude = array($dependency['version']);
                break;
                case 'le' :
                    $max = $dependency['version'];
                break;
                case 'ne' :
                    $exclude = array($dependency['version']);
                break;
            }
        } else {
            $min = isset($dependency['min']) ? $dependency['min'] : false;
            $max = isset($dependency['max']) ? $dependency['max'] : false;
            $recommended = isset($dependency['recommended']) ?
                $dependency['recommended'] : false;
            if (isset($dependency['exclude'])) {
                if (!isset($dependency['exclude'][0])) {
                    $exclude = array($dependency['exclude']);
                }
            }
        }
        $release = $found = false;
        if (!is_array($info['r']) || !isset($info['r'][0])) {
            $info['r'] = array($info['r']);
        }
        foreach ($info['r'] as $release) {
            if (!isset($this->_rest->_options['force']) && ($installed &&
                  version_compare($release['v'], $installed, '<'))) {
                continue;
            }
            if (in_array($release['v'], $exclude)) { // skip excluded versions
                continue;
            }
            // allow newer releases to say "I'm OK with the dependent package"
            if ($xsdversion == '2.0' && isset($release['co'])) {
                if (!is_array($release['co']) || !isset($release['co'][0])) {
                    $release['co'] = array($release['co']);
                }
                foreach ($release['co'] as $entry) {
                    if (isset($entry['x']) && !is_array($entry['x'])) {
                        $entry['x'] = array($entry['x']);
                    } elseif (!isset($entry['x'])) {
                        $entry['x'] = array();
                    }
                    if ($entry['c'] == $deppackage['channel'] &&
                          strtolower($entry['p']) == strtolower($deppackage['package']) &&
                          version_compare($deppackage['version'], $entry['min'], '>=') &&
                          version_compare($deppackage['version'], $entry['max'], '<=') &&
                          !in_array($release['v'], $entry['x'])) {
                        $recommended = $release['v'];
                        break;
                    }
                }
            }
            if ($recommended) {
                if ($release['v'] != $recommended) { // if we want a specific
                    // version, then skip all others
                    continue;
                } else {
                    if (!in_array($release['s'], $states)) {
                        // the stability is too low, but we must return the
                        // recommended version if possible
                        return $this->_returnDownloadURL($base, $package, $release, $info, true, false, $channel);
                    }
                }
            }
            if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions
                continue;
            }
            if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions
                continue;
            }
            if ($installed && version_compare($release['v'], $installed, '<')) {
                continue;
            }
            if (in_array($release['s'], $states)) { // if in the preferred state...
                $found = true; // ... then use it
                break;
            }
        }
        return $this->_returnDownloadURL($base, $package, $release, $info, $found, false, $channel);
    }

    /**
     * Take raw data and return the array needed for processing a download URL
     *
     * @param string $base REST base uri
     * @param string $package Package name
     * @param array $release an array of format array('v' => version, 's' => state)
     *                       describing the release to download
     * @param array $info list of all releases as defined by allreleases.xml
     * @param bool|null $found determines whether the release was found or this is the next
     *                    best alternative.  If null, then versions were skipped because
     *                    of PHP dependency
     * @return array|PEAR_Error
     * @access private
     */
    function _returnDownloadURL($base, $package, $release, $info, $found, $phpversion = false, $channel = false)
    {
        if (!$found) {
            $release = $info['r'][0];
        }

        $packageLower = strtolower($package);
        $pinfo = $this->_rest->retrieveCacheFirst($base . 'p/' . $packageLower . '/' .
            'info.xml', false, false, $channel);
        if (PEAR::isError($pinfo)) {
            return PEAR::raiseError('Package "' . $package .
                '" does not have REST info xml available');
        }

        $releaseinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . $packageLower . '/' .
            $release['v'] . '.xml', false, false, $channel);
        if (PEAR::isError($releaseinfo)) {
            return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] .
                '" does not have REST xml available');
        }

        $packagexml = $this->_rest->retrieveCacheFirst($base . 'r/' . $packageLower . '/' .
            'deps.' . $release['v'] . '.txt', false, true, $channel);
        if (PEAR::isError($packagexml)) {
            return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] .
                '" does not have REST dependency information available');
        }

        $packagexml = unserialize($packagexml);
        if (!$packagexml) {
            $packagexml = array();
        }

        $allinfo = $this->_rest->retrieveData($base . 'r/' . $packageLower .
            '/allreleases.xml', false, false, $channel);
        if (PEAR::isError($allinfo)) {
            return $allinfo;
        }

        if (!is_array($allinfo['r']) || !isset($allinfo['r'][0])) {
            $allinfo['r'] = array($allinfo['r']);
        }

        $compatible = false;
        foreach ($allinfo['r'] as $release) {
            if ($release['v'] != $releaseinfo['v']) {
                continue;
            }

            if (!isset($release['co'])) {
                break;
            }

            $compatible = array();
            if (!is_array($release['co']) || !isset($release['co'][0])) {
                $release['co'] = array($release['co']);
            }

            foreach ($release['co'] as $entry) {
                $comp = array();
                $comp['name']    = $entry['p'];
                $comp['channel'] = $entry['c'];
                $comp['min']     = $entry['min'];
                $comp['max']     = $entry['max'];
                if (isset($entry['x']) && !is_array($entry['x'])) {
                    $comp['exclude'] = $entry['x'];
                }

                $compatible[] = $comp;
            }

            if (count($compatible) == 1) {
                $compatible = $compatible[0];
            }

            break;
        }

        $deprecated = false;
        if (isset($pinfo['dc']) && isset($pinfo['dp'])) {
            if (is_array($pinfo['dp'])) {
                $deprecated = array('channel' => (string) $pinfo['dc'],
                                    'package' => trim($pinfo['dp']['_content']));
            } else {
                $deprecated = array('channel' => (string) $pinfo['dc'],
                                    'package' => trim($pinfo['dp']));
            }
        }

        $return = array(
            'version'    => $releaseinfo['v'],
            'info'       => $packagexml,
            'package'    => $releaseinfo['p']['_content'],
            'stability'  => $releaseinfo['st'],
            'compatible' => $compatible,
            'deprecated' => $deprecated,
        );

        if ($found) {
            $return['url'] = $releaseinfo['g'];
            return $return;
        }

        $return['php'] = $phpversion;
        return $return;
    }

    function listPackages($base, $channel = false)
    {
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }

        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            return array();
        }

        if (!is_array($packagelist['p'])) {
            $packagelist['p'] = array($packagelist['p']);
        }

        return $packagelist['p'];
    }

    /**
     * List all categories of a REST server
     *
     * @param string $base base URL of the server
     * @return array of categorynames
     */
    function listCategories($base, $channel = false)
    {
        $categories = array();

        // c/categories.xml does not exist;
        // check for every package its category manually
        // This is SLOOOWWWW : ///
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }

        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            $ret = array();
            return $ret;
        }

        if (!is_array($packagelist['p'])) {
            $packagelist['p'] = array($packagelist['p']);
        }

        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        foreach ($packagelist['p'] as $package) {
                $inf = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel);
                if (PEAR::isError($inf)) {
                    PEAR::popErrorHandling();
                    return $inf;
                }
                $cat = $inf['ca']['_content'];
                if (!isset($categories[$cat])) {
                    $categories[$cat] = $inf['ca'];
                }
        }

        return array_values($categories);
    }

    /**
     * List a category of a REST server
     *
     * @param string $base base URL of the server
     * @param string $category name of the category
     * @param boolean $info also download full package info
     * @return array of packagenames
     */
    function listCategory($base, $category, $info = false, $channel = false)
    {
        // gives '404 Not Found' error when category doesn't exist
        $packagelist = $this->_rest->retrieveData($base.'c/'.urlencode($category).'/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }

        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            return array();
        }

        if (!is_array($packagelist['p']) ||
            !isset($packagelist['p'][0])) { // only 1 pkg
            $packagelist = array($packagelist['p']);
        } else {
            $packagelist = $packagelist['p'];
        }

        if ($info == true) {
            // get individual package info
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            foreach ($packagelist as $i => $packageitem) {
                $url = sprintf('%s'.'r/%s/latest.txt',
                        $base,
                        strtolower($packageitem['_content']));
                $version = $this->_rest->retrieveData($url, false, false, $channel);
                if (PEAR::isError($version)) {
                    break; // skipit
                }
                $url = sprintf('%s'.'r/%s/%s.xml',
                        $base,
                        strtolower($packageitem['_content']),
                        $version);
                $info = $this->_rest->retrieveData($url, false, false, $channel);
                if (PEAR::isError($info)) {
                    break; // skipit
                }
                $packagelist[$i]['info'] = $info;
            }
            PEAR::popErrorHandling();
        }

        return $packagelist;
    }


    function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false)
    {
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }
        if ($this->_rest->config->get('verbose') > 0) {
            $ui = &PEAR_Frontend::singleton();
            $ui->log('Retrieving data...0%', true);
        }
        $ret = array();
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            return $ret;
        }
        if (!is_array($packagelist['p'])) {
            $packagelist['p'] = array($packagelist['p']);
        }

        // only search-packagename = quicksearch !
        if ($searchpackage && (!$searchsummary || empty($searchpackage))) {
            $newpackagelist = array();
            foreach ($packagelist['p'] as $package) {
                if (!empty($searchpackage) && stristr($package, $searchpackage) !== false) {
                    $newpackagelist[] = $package;
                }
            }
            $packagelist['p'] = $newpackagelist;
        }
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $next = .1;
        foreach ($packagelist['p'] as $progress => $package) {
            if ($this->_rest->config->get('verbose') > 0) {
                if ($progress / count($packagelist['p']) >= $next) {
                    if ($next == .5) {
                        $ui->log('50%', false);
                    } else {
                        $ui->log('.', false);
                    }
                    $next += .1;
                }
            }

            if ($basic) { // remote-list command
                if ($dostable) {
                    $latest = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
                        '/stable.txt', false, false, $channel);
                } else {
                    $latest = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
                        '/latest.txt', false, false, $channel);
                }
                if (PEAR::isError($latest)) {
                    $latest = false;
                }
                $info = array('stable' => $latest);
            } else { // list-all command
                $inf = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel);
                if (PEAR::isError($inf)) {
                    PEAR::popErrorHandling();
                    return $inf;
                }
                if ($searchpackage) {
                    $found = (!empty($searchpackage) && stristr($package, $searchpackage) !== false);
                    if (!$found && !(isset($searchsummary) && !empty($searchsummary)
                        && (stristr($inf['s'], $searchsummary) !== false
                            || stristr($inf['d'], $searchsummary) !== false)))
                    {
                        continue;
                    };
                }
                $releases = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
                    '/allreleases.xml', false, false, $channel);
                if (PEAR::isError($releases)) {
                    continue;
                }
                if (!isset($releases['r'][0])) {
                    $releases['r'] = array($releases['r']);
                }
                unset($latest);
                unset($unstable);
                unset($stable);
                unset($state);
                foreach ($releases['r'] as $release) {
                    if (!isset($latest)) {
                        if ($dostable && $release['s'] == 'stable') {
                            $latest = $release['v'];
                            $state = 'stable';
                        }
                        if (!$dostable) {
                            $latest = $release['v'];
                            $state = $release['s'];
                        }
                    }
                    if (!isset($stable) && $release['s'] == 'stable') {
                        $stable = $release['v'];
                        if (!isset($unstable)) {
                            $unstable = $stable;
                        }
                    }
                    if (!isset($unstable) && $release['s'] != 'stable') {
                        $latest = $unstable = $release['v'];
                        $state = $release['s'];
                    }
                    if (isset($latest) && !isset($state)) {
                        $state = $release['s'];
                    }
                    if (isset($latest) && isset($stable) && isset($unstable)) {
                        break;
                    }
                }
                $deps = array();
                if (!isset($unstable)) {
                    $unstable = false;
                    $state = 'stable';
                    if (isset($stable)) {
                        $latest = $unstable = $stable;
                    }
                } else {
                    $latest = $unstable;
                }
                if (!isset($latest)) {
                    $latest = false;
                }
                if ($latest) {
                    $d = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/deps.' .
                        $latest . '.txt', false, false, $channel);
                    if (!PEAR::isError($d)) {
                        $d = unserialize($d);
                        if ($d) {
                            if (isset($d['required'])) {
                                if (!class_exists('PEAR_PackageFile_v2')) {
                                    require_once 'PEAR/PackageFile/v2.php';
                                }
                                if (!isset($pf)) {
                                    $pf = new PEAR_PackageFile_v2;
                                }
                                $pf->setDeps($d);
                                $tdeps = $pf->getDeps();
                            } else {
                                $tdeps = $d;
                            }
                            foreach ($tdeps as $dep) {
                                if ($dep['type'] !== 'pkg') {
                                    continue;
                                }
                                $deps[] = $dep;
                            }
                        }
                    }
                }
                if (!isset($stable)) {
                    $stable = '-n/a-';
                }
                if (!$searchpackage) {
                    $info = array('stable' => $latest, 'summary' => $inf['s'], 'description' =>
                        $inf['d'], 'deps' => $deps, 'category' => $inf['ca']['_content'],
                        'unstable' => $unstable, 'state' => $state);
                } else {
                    $info = array('stable' => $stable, 'summary' => $inf['s'], 'description' =>
                        $inf['d'], 'deps' => $deps, 'category' => $inf['ca']['_content'],
                        'unstable' => $unstable, 'state' => $state);
                }
            }
            $ret[$package] = $info;
        }
        PEAR::popErrorHandling();
        return $ret;
    }

    function listLatestUpgrades($base, $pref_state, $installed, $channel, &$reg)
    {
        $packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false, false, $channel);
        if (PEAR::isError($packagelist)) {
            return $packagelist;
        }

        $ret = array();
        if (!is_array($packagelist) || !isset($packagelist['p'])) {
            return $ret;
        }

        if (!is_array($packagelist['p'])) {
            $packagelist['p'] = array($packagelist['p']);
        }

        foreach ($packagelist['p'] as $package) {
            if (!isset($installed[strtolower($package)])) {
                continue;
            }

            $inst_version = $reg->packageInfo($package, 'version', $channel);
            $inst_state   = $reg->packageInfo($package, 'release_state', $channel);
            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
            $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
                '/allreleases.xml', false, false, $channel);
            PEAR::popErrorHandling();
            if (PEAR::isError($info)) {
                continue; // no remote releases
            }

            if (!isset($info['r'])) {
                continue;
            }

            $release = $found = false;
            if (!is_array($info['r']) || !isset($info['r'][0])) {
                $info['r'] = array($info['r']);
            }

            // $info['r'] is sorted by version number
            usort($info['r'], array($this, '_sortReleasesByVersionNumber'));
            foreach ($info['r'] as $release) {
                if ($inst_version && version_compare($release['v'], $inst_version, '<=')) {
                    // not newer than the one installed
                    break;
                }

                // new version > installed version
                if (!$pref_state) {
                    // every state is a good state
                    $found = true;
                    break;
                } else {
                    $new_state = $release['s'];
                    // if new state >= installed state: go
                    if (in_array($new_state, $this->betterStates($inst_state, true))) {
                        $found = true;
                        break;
                    } else {
                        // only allow to lower the state of package,
                        // if new state >= preferred state: go
                        if (in_array($new_state, $this->betterStates($pref_state, true))) {
                            $found = true;
                            break;
                        }
                    }
                }
            }

            if (!$found) {
                continue;
            }

            $relinfo = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/' .
                $release['v'] . '.xml', false, false, $channel);
            if (PEAR::isError($relinfo)) {
                return $relinfo;
            }

            $ret[$package] = array(
                'version'  => $release['v'],
                'state'    => $release['s'],
                'filesize' => $relinfo['f'],
            );
        }

        return $ret;
    }

    function packageInfo($base, $package, $channel = false)
    {
        PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
        $pinfo = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false, false, $channel);
        if (PEAR::isError($pinfo)) {
            PEAR::popErrorHandling();
            return PEAR::raiseError('Unknown package: "' . $package . '" in channel "' . $channel . '"' . "\n". 'Debug: ' .
                $pinfo->getMessage());
        }

        $releases = array();
        $allreleases = $this->_rest->retrieveData($base . 'r/' . strtolower($package) .
            '/allreleases.xml', false, false, $channel);
        if (!PEAR::isError($allreleases)) {
            if (!class_exists('PEAR_PackageFile_v2')) {
                require_once 'PEAR/PackageFile/v2.php';
            }

            if (!is_array($allreleases['r']) || !isset($allreleases['r'][0])) {
                $allreleases['r'] = array($allreleases['r']);
            }

            $pf = new PEAR_PackageFile_v2;
            foreach ($allreleases['r'] as $release) {
                $ds = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package) . '/deps.' .
                    $release['v'] . '.txt', false, false, $channel);
                if (PEAR::isError($ds)) {
                    continue;
                }

                if (!isset($latest)) {
                    $latest = $release['v'];
                }

                $pf->setDeps(unserialize($ds));
                $ds = $pf->getDeps();
                $info = $this->_rest->retrieveCacheFirst($base . 'r/' . strtolower($package)
                    . '/' . $release['v'] . '.xml', false, false, $channel);

                if (PEAR::isError($info)) {
                    continue;
                }

                $releases[$release['v']] = array(
                    'doneby' => $info['m'],
                    'license' => $info['l'],
                    'summary' => $info['s'],
                    'description' => $info['d'],
                    'releasedate' => $info['da'],
                    'releasenotes' => $info['n'],
                    'state' => $release['s'],
                    'deps' => $ds ? $ds : array(),
                );
            }
        } else {
            $latest = '';
        }

        PEAR::popErrorHandling();
        if (isset($pinfo['dc']) && isset($pinfo['dp'])) {
            if (is_array($pinfo['dp'])) {
                $deprecated = array('channel' => (string) $pinfo['dc'],
                                    'package' => trim($pinfo['dp']['_content']));
            } else {
                $deprecated = array('channel' => (string) $pinfo['dc'],
                                    'package' => trim($pinfo['dp']));
            }
        } else {
            $deprecated = false;
        }

        if (!isset($latest)) {
            $latest = '';
        }

        return array(
            'name' => $pinfo['n'],
            'channel' => $pinfo['c'],
            'category' => $pinfo['ca']['_content'],
            'stable' => $latest,
            'license' => $pinfo['l'],
            'summary' => $pinfo['s'],
            'description' => $pinfo['d'],
            'releases' => $releases,
            'deprecated' => $deprecated,
            );
    }

    /**
     * Return an array containing all of the states that are more stable than
     * or equal to the passed in state
     *
     * @param string Release state
     * @param boolean Determines whether to include $state in the list
     * @return false|array False if $state is not a valid release state
     */
    function betterStates($state, $include = false)
    {
        static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
        $i = array_search($state, $states);
        if ($i === false) {
            return false;
        }

        if ($include) {
            $i--;
        }

        return array_slice($states, $i + 1);
    }

    /**
     * Sort releases by version number
     *
     * @access private
     */
    function _sortReleasesByVersionNumber($a, $b)
    {
        if (version_compare($a['v'], $b['v'], '=')) {
            return 0;
        }

        if (version_compare($a['v'], $b['v'], '>')) {
            return -1;
        }

        if (version_compare($a['v'], $b['v'], '<')) {
            return 1;
        }
    }
}
PK�a�\��T�I�Ipear/PEAR/Builder.phpnu�[���<?php
/**
 * PEAR_Builder for building PHP extensions (PECL packages)
 *
 * PHP versions 4 and 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 0.1
 *
 * TODO: log output parameters in PECL command line
 * TODO: msdev path in configuration
 */

/**
 * Needed for extending PEAR_Builder
 */
require_once 'PEAR/Common.php';
require_once 'PEAR/PackageFile.php';
require_once 'System.php';

/**
 * Class to handle building (compiling) extensions.
 *
 * @category   pear
 * @package    PEAR
 * @author     Stig Bakken <ssb@php.net>
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since PHP 4.0.2
 * @see        http://pear.php.net/manual/en/core.ppm.pear-builder.php
 */
class PEAR_Builder extends PEAR_Common
{
    var $php_api_version = 0;
    var $zend_module_api_no = 0;
    var $zend_extension_api_no = 0;

    var $extensions_built = array();

    /**
     * @var string Used for reporting when it is not possible to pass function
     *             via extra parameter, e.g. log, msdevCallback
     */
    var $current_callback = null;

    // used for msdev builds
    var $_lastline = null;
    var $_firstline = null;

    /**
     * Parsed --configureoptions.
     *
     * @var mixed[]
     */
    var $_parsed_configure_options;

    /**
     * PEAR_Builder constructor.
     *
     * @param mixed[] $configureoptions
     * @param object $ui user interface object (instance of PEAR_Frontend_*)
     *
     * @access public
     */
    function __construct($configureoptions, &$ui)
    {
        parent::__construct();
        $this->setFrontendObject($ui);
        $this->_parseConfigureOptions($configureoptions);
    }

    /**
     * Parse --configureoptions string.
     *
     * @param string Options, in the form "X=1 Y=2 Z='there\'s always one'"
     */
    function _parseConfigureOptions($options)
    {
        $data = '<XML><PROPERTIES ' . $options . ' /></XML>';
        $parser = xml_parser_create('ISO-8859-1');
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_set_element_handler(
            $parser, array($this, '_parseConfigureOptionsStartElement'),
            array($this, '_parseConfigureOptionsEndElement'));
        xml_parse($parser, $data, true);
        xml_parser_free($parser);
    }

    /**
     * Handle element start.
     *
     * @see PEAR_Builder::_parseConfigureOptions()
     *
     * @param resource $parser
     * @param string $tagName
     * @param mixed[] $attribs
     */
    function _parseConfigureOptionsStartElement($parser, $tagName, $attribs)
    {
        if ($tagName !== 'PROPERTIES') {
            return;
        }
        $this->_parsed_configure_options = $attribs;
    }

    /**
     * Handle element end.
     *
     * @see PEAR_Builder::_parseConfigureOptions()
     *
     * @param resource
     * @param string $element
     */
    function _parseConfigureOptionsEndElement($parser, $element)
    {
    }

    /**
     * Build an extension from source on windows.
     * requires msdev
     */
    function _build_win32($descfile, $callback = null)
    {
        if (is_object($descfile)) {
            $pkg = $descfile;
            $descfile = $pkg->getPackageFile();
        } else {
            $pf = new PEAR_PackageFile($this->config, $this->debug);
            $pkg = &$pf->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL);
            if (PEAR::isError($pkg)) {
                return $pkg;
            }
        }
        $dir = dirname($descfile);
        $old_cwd = getcwd();

        if (!file_exists($dir) || !is_dir($dir) || !chdir($dir)) {
            return $this->raiseError("could not chdir to $dir");
        }

        // packages that were in a .tar have the packagefile in this directory
        $vdir = $pkg->getPackage() . '-' . $pkg->getVersion();
        if (file_exists($dir) && is_dir($vdir)) {
            if (!chdir($vdir)) {
                return $this->raiseError("could not chdir to " . realpath($vdir));
            }

            $dir = getcwd();
        }

        $this->log(2, "building in $dir");

        $dsp = $pkg->getPackage().'.dsp';
        if (!file_exists("$dir/$dsp")) {
            return $this->raiseError("The DSP $dsp does not exist.");
        }
        // XXX TODO: make release build type configurable
        $command = 'msdev '.$dsp.' /MAKE "'.$pkg->getPackage(). ' - Release"';

        $err = $this->_runCommand($command, array(&$this, 'msdevCallback'));
        if (PEAR::isError($err)) {
            return $err;
        }

        // figure out the build platform and type
        $platform = 'Win32';
        $buildtype = 'Release';
        if (preg_match('/.*?'.$pkg->getPackage().'\s-\s(\w+)\s(.*?)-+/i',$this->_firstline,$matches)) {
            $platform = $matches[1];
            $buildtype = $matches[2];
        }

        if (preg_match('/(.*)?\s-\s(\d+).*?(\d+)/', $this->_lastline, $matches)) {
            if ($matches[2]) {
                // there were errors in the build
                return $this->raiseError("There were errors during compilation.");
            }
            $out = $matches[1];
        } else {
            return $this->raiseError("Did not understand the completion status returned from msdev.exe.");
        }

        // msdev doesn't tell us the output directory :/
        // open the dsp, find /out and use that directory
        $dsptext = join('', file($dsp));

        // this regex depends on the build platform and type having been
        // correctly identified above.
        $regex ='/.*?!IF\s+"\$\(CFG\)"\s+==\s+("'.
                    $pkg->getPackage().'\s-\s'.
                    $platform.'\s'.
                    $buildtype.'").*?'.
                    '\/out:"(.*?)"/is';

        if ($dsptext && preg_match($regex, $dsptext, $matches)) {
            // what we get back is a relative path to the output file itself.
            $outfile = realpath($matches[2]);
        } else {
            return $this->raiseError("Could not retrieve output information from $dsp.");
        }
        // realpath returns false if the file doesn't exist
        if ($outfile && copy($outfile, "$dir/$out")) {
            $outfile = "$dir/$out";
        }

        $built_files[] = array(
            'file' => "$outfile",
            'php_api' => $this->php_api_version,
            'zend_mod_api' => $this->zend_module_api_no,
            'zend_ext_api' => $this->zend_extension_api_no,
            );

        return $built_files;
    }
    // }}}

    // {{{ msdevCallback()
    function msdevCallback($what, $data)
    {
        if (!$this->_firstline)
            $this->_firstline = $data;
        $this->_lastline = $data;
        call_user_func($this->current_callback, $what, $data);
    }

    /**
     * @param string
     * @param string
     * @param array
     * @access private
     */
    function _harvestInstDir($dest_prefix, $dirname, &$built_files)
    {
        $d = opendir($dirname);
        if (!$d)
            return false;

        $ret = true;
        while (($ent = readdir($d)) !== false) {
            if ($ent[0] == '.')
                continue;

            $full = $dirname . DIRECTORY_SEPARATOR . $ent;
            if (is_dir($full)) {
                if (!$this->_harvestInstDir(
                        $dest_prefix . DIRECTORY_SEPARATOR . $ent,
                        $full, $built_files)) {
                    $ret = false;
                    break;
                }
            } else {
                $dest = $dest_prefix . DIRECTORY_SEPARATOR . $ent;
                $built_files[] = array(
                        'file' => $full,
                        'dest' => $dest,
                        'php_api' => $this->php_api_version,
                        'zend_mod_api' => $this->zend_module_api_no,
                        'zend_ext_api' => $this->zend_extension_api_no,
                        );
            }
        }
        closedir($d);
        return $ret;
    }

    /**
     * Build an extension from source.  Runs "phpize" in the source
     * directory, but compiles in a temporary directory
     * (TMPDIR/pear-build-USER/PACKAGE-VERSION).
     *
     * @param string|PEAR_PackageFile_v* $descfile path to XML package description file, or
     *               a PEAR_PackageFile object
     *
     * @param mixed $callback callback function used to report output,
     * see PEAR_Builder::_runCommand for details
     *
     * @return array an array of associative arrays with built files,
     * format:
     * array( array( 'file' => '/path/to/ext.so',
     *               'php_api' => YYYYMMDD,
     *               'zend_mod_api' => YYYYMMDD,
     *               'zend_ext_api' => YYYYMMDD ),
     *        ... )
     *
     * @access public
     *
     * @see PEAR_Builder::_runCommand
     */
    function build($descfile, $callback = null)
    {
        if (preg_match('/(\\/|\\\\|^)([^\\/\\\\]+)?php([^\\/\\\\]+)?$/',
                       $this->config->get('php_bin'), $matches)) {
            if (isset($matches[2]) && strlen($matches[2]) &&
                trim($matches[2]) != trim($this->config->get('php_prefix'))) {
                $this->log(0, 'WARNING: php_bin ' . $this->config->get('php_bin') .
                           ' appears to have a prefix ' . $matches[2] . ', but' .
                           ' config variable php_prefix does not match');
            }

            if (isset($matches[3]) && strlen($matches[3]) &&
                trim($matches[3]) != trim($this->config->get('php_suffix'))) {
                $this->log(0, 'WARNING: php_bin ' . $this->config->get('php_bin') .
                           ' appears to have a suffix ' . $matches[3] . ', but' .
                           ' config variable php_suffix does not match');
            }
        }

        $this->current_callback = $callback;
        if (PEAR_OS == "Windows") {
            return $this->_build_win32($descfile, $callback);
        }

        if (PEAR_OS != 'Unix') {
            return $this->raiseError("building extensions not supported on this platform");
        }

        if (is_object($descfile)) {
            $pkg = $descfile;
            $descfile = $pkg->getPackageFile();
            if (is_a($pkg, 'PEAR_PackageFile_v1')) {
                $dir = dirname($descfile);
            } else {
                $dir = $pkg->_config->get('temp_dir') . '/' . $pkg->getName();
                // automatically delete at session end
                self::addTempFile($dir);
            }
        } else {
            $pf = new PEAR_PackageFile($this->config);
            $pkg = &$pf->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL);
            if (PEAR::isError($pkg)) {
                return $pkg;
            }
            $dir = dirname($descfile);
        }

        // Find config. outside of normal path - e.g. config.m4
        foreach (array_keys($pkg->getInstallationFileList()) as $item) {
          if (stristr(basename($item), 'config.m4') && dirname($item) != '.') {
            $dir .= DIRECTORY_SEPARATOR . dirname($item);
            break;
          }
        }

        $old_cwd = getcwd();
        if (!file_exists($dir) || !is_dir($dir) || !chdir($dir)) {
            return $this->raiseError("could not chdir to $dir");
        }

        $vdir = $pkg->getPackage() . '-' . $pkg->getVersion();
        if (is_dir($vdir)) {
            chdir($vdir);
        }

        $dir = getcwd();
        $this->log(2, "building in $dir");
        $binDir = $this->config->get('bin_dir');
        if (!preg_match('@(^|:)' . preg_quote($binDir, '@') . '(:|$)@', getenv('PATH'))) {
            putenv('PATH=' . $binDir . ':' . getenv('PATH'));
        }
        $err = $this->_runCommand($this->config->get('php_prefix')
                                . "phpize" .
                                $this->config->get('php_suffix'),
                                array(&$this, 'phpizeCallback'));
        if (PEAR::isError($err)) {
            return $err;
        }

        if (!$err) {
            return $this->raiseError("`phpize' failed");
        }

        // {{{ start of interactive part
        $configure_command = "$dir/configure";

        $phpConfigName = $this->config->get('php_prefix')
            . 'php-config'
            . $this->config->get('php_suffix');
        $phpConfigPath = System::which($phpConfigName);
        if ($phpConfigPath !== false) {
            $configure_command .= ' --with-php-config='
                . $phpConfigPath;
        }

        $configure_options = $pkg->getConfigureOptions();
        if ($configure_options) {
            foreach ($configure_options as $option) {
                $default = array_key_exists('default', $option) ? $option['default'] : null;
                if (array_key_exists($option['name'], $this->_parsed_configure_options)) {
                    $response = $this->_parsed_configure_options[$option['name']];
                } else {
                    list($response) = $this->ui->userDialog(
                            'build', [$option['prompt']], ['text'], [$default]);
                }
                if (substr($option['name'], 0, 5) === 'with-' &&
                    ($response === 'yes' || $response === 'autodetect')) {
                    $configure_command .= " --{$option['name']}";
                } else {
                    $configure_command .= " --{$option['name']}=".trim($response);
                }
            }
        }
        // }}} end of interactive part

        // FIXME make configurable
        if (!$user=getenv('USER')) {
            $user='defaultuser';
        }

        $tmpdir = $this->config->get('temp_dir');
        $build_basedir = System::mktemp(' -t "' . $tmpdir . '" -d "pear-build-' . $user . '"');
        $build_dir = "$build_basedir/$vdir";
        $inst_dir = "$build_basedir/install-$vdir";
        $this->log(1, "building in $build_dir");
        if (is_dir($build_dir)) {
            System::rm(array('-rf', $build_dir));
        }

        if (!System::mkDir(array('-p', $build_dir))) {
            return $this->raiseError("could not create build dir: $build_dir");
        }

        self::addTempFile($build_dir);
        if (!System::mkDir(array('-p', $inst_dir))) {
            return $this->raiseError("could not create temporary install dir: $inst_dir");
        }
        self::addTempFile($inst_dir);

        $make_command = getenv('MAKE') ? getenv('MAKE') : 'make';

        $to_run = array(
            $configure_command,
            $make_command,
            "$make_command INSTALL_ROOT=\"$inst_dir\" install",
            "find \"$inst_dir\" | xargs ls -dils"
            );
        if (!file_exists($build_dir) || !is_dir($build_dir) || !chdir($build_dir)) {
            return $this->raiseError("could not chdir to $build_dir");
        }
        putenv('PHP_PEAR_VERSION=1.10.16');
        foreach ($to_run as $cmd) {
            $err = $this->_runCommand($cmd, $callback);
            if (PEAR::isError($err)) {
                chdir($old_cwd);
                return $err;
            }
            if (!$err) {
                chdir($old_cwd);
                return $this->raiseError("`$cmd' failed");
            }
        }
        if (!($dp = opendir("modules"))) {
            chdir($old_cwd);
            return $this->raiseError("no `modules' directory found");
        }
        $built_files = array();
        $prefix = exec($this->config->get('php_prefix')
                        . "php-config" .
                       $this->config->get('php_suffix') . " --prefix");
        $this->_harvestInstDir($prefix, $inst_dir . DIRECTORY_SEPARATOR . $prefix, $built_files);
        chdir($old_cwd);
        return $built_files;
    }

    /**
     * Message callback function used when running the "phpize"
     * program.  Extracts the API numbers used.  Ignores other message
     * types than "cmdoutput".
     *
     * @param string $what the type of message
     * @param mixed $data the message
     *
     * @return void
     *
     * @access public
     */
    function phpizeCallback($what, $data)
    {
        if ($what != 'cmdoutput') {
            return;
        }
        $this->log(1, rtrim($data));
        if (preg_match('/You should update your .aclocal.m4/', $data)) {
            return;
        }
        $matches = array();
        if (preg_match('/^\s+(\S[^:]+):\s+(\d{8})/', $data, $matches)) {
            $member = preg_replace('/[^a-z]/', '_', strtolower($matches[1]));
            $apino = (int)$matches[2];
            if (isset($this->$member)) {
                $this->$member = $apino;
                //$msg = sprintf("%-22s : %d", $matches[1], $apino);
                //$this->log(1, $msg);
            }
        }
    }

    /**
     * Run an external command, using a message callback to report
     * output.  The command will be run through popen and output is
     * reported for every line with a "cmdoutput" message with the
     * line string, including newlines, as payload.
     *
     * @param string $command the command to run
     *
     * @param mixed $callback (optional) function to use as message
     * callback
     *
     * @return bool whether the command was successful (exit code 0
     * means success, any other means failure)
     *
     * @access private
     */
    function _runCommand($command, $callback = null)
    {
        $this->log(1, "running: $command");
        $pp = popen("$command 2>&1", "r");
        if (!$pp) {
            return $this->raiseError("failed to run `$command'");
        }
        if ($callback && $callback[0]->debug == 1) {
            $olddbg = $callback[0]->debug;
            $callback[0]->debug = 2;
        }

        while ($line = fgets($pp, 1024)) {
            if ($callback) {
                call_user_func($callback, 'cmdoutput', $line);
            } else {
                $this->log(2, rtrim($line));
            }
        }
        if ($callback && isset($olddbg)) {
            $callback[0]->debug = $olddbg;
        }

        $exitcode = is_resource($pp) ? pclose($pp) : -1;
        return ($exitcode == 0);
    }

    function log($level, $msg, $append_crlf = true)
    {
        if ($this->current_callback) {
            if ($this->debug >= $level) {
                call_user_func($this->current_callback, 'output', $msg);
            }
            return;
        }
        return parent::log($level, $msg, $append_crlf);
    }
}
PK�a�\j�y99pear/PEAR/Validator/PECL.phpnu�[���<?php
/**
 * Channel Validator for the pecl.php.net channel
 *
 * PHP 4 and PHP 5
 *
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2006 The PHP Group
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @link       http://pear.php.net/package/PEAR
 * @since      File available since Release 1.4.0a5
 */
/**
 * This is the parent class for all validators
 */
require_once 'PEAR/Validate.php';
/**
 * Channel Validator for the pecl.php.net channel
 * @category   pear
 * @package    PEAR
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  1997-2009 The Authors
 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
 * @version    Release: 1.10.16
 * @link       http://pear.php.net/package/PEAR
 * @since      Class available since Release 1.4.0a5
 */
class PEAR_Validator_PECL extends PEAR_Validate
{
    function validateVersion()
    {
        if ($this->_state == PEAR_VALIDATE_PACKAGING) {
            $version = $this->_packagexml->getVersion();
            $versioncomponents = explode('.', $version);
            $last = array_pop($versioncomponents);
            if (substr($last, 1, 2) == 'rc') {
                $this->_addFailure('version', 'Release Candidate versions must have ' .
                'upper-case RC, not lower-case rc');
                return false;
            }
        }
        return true;
    }

    function validatePackageName()
    {
        $ret = parent::validatePackageName();
        if ($this->_packagexml->getPackageType() == 'extsrc' ||
              $this->_packagexml->getPackageType() == 'zendextsrc') {
            if (strtolower($this->_packagexml->getPackage()) !=
                  strtolower($this->_packagexml->getProvidesExtension())) {
                $this->_addWarning('providesextension', 'package name "' .
                    $this->_packagexml->getPackage() . '" is different from extension name "' .
                    $this->_packagexml->getProvidesExtension() . '"');
            }
        }
        return $ret;
    }
}
?>PK�a�\�Z��aa
pear/.filemapnu�[���a:5:{s:3:"php";a:104:{s:15:"Archive/Tar.php";s:11:"archive_tar";s:18:"Console/Getopt.php";s:14:"console_getopt";s:12:"OS/Guess.php";s:4:"pear";s:27:"PEAR/ChannelFile/Parser.php";s:4:"pear";s:21:"PEAR/Command/Auth.xml";s:4:"pear";s:21:"PEAR/Command/Auth.php";s:4:"pear";s:22:"PEAR/Command/Build.xml";s:4:"pear";s:22:"PEAR/Command/Build.php";s:4:"pear";s:25:"PEAR/Command/Channels.xml";s:4:"pear";s:25:"PEAR/Command/Channels.php";s:4:"pear";s:23:"PEAR/Command/Common.php";s:4:"pear";s:23:"PEAR/Command/Config.xml";s:4:"pear";s:23:"PEAR/Command/Config.php";s:4:"pear";s:24:"PEAR/Command/Install.xml";s:4:"pear";s:24:"PEAR/Command/Install.php";s:4:"pear";s:23:"PEAR/Command/Mirror.xml";s:4:"pear";s:23:"PEAR/Command/Mirror.php";s:4:"pear";s:24:"PEAR/Command/Package.xml";s:4:"pear";s:24:"PEAR/Command/Package.php";s:4:"pear";s:23:"PEAR/Command/Pickle.xml";s:4:"pear";s:23:"PEAR/Command/Pickle.php";s:4:"pear";s:25:"PEAR/Command/Registry.xml";s:4:"pear";s:25:"PEAR/Command/Registry.php";s:4:"pear";s:23:"PEAR/Command/Remote.xml";s:4:"pear";s:23:"PEAR/Command/Remote.php";s:4:"pear";s:21:"PEAR/Command/Test.xml";s:4:"pear";s:21:"PEAR/Command/Test.php";s:4:"pear";s:27:"PEAR/Downloader/Package.php";s:4:"pear";s:21:"PEAR/Frontend/CLI.php";s:4:"pear";s:30:"PEAR/Installer/Role/Common.php";s:4:"pear";s:27:"PEAR/Installer/Role/Cfg.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Cfg.php";s:4:"pear";s:28:"PEAR/Installer/Role/Data.xml";s:4:"pear";s:28:"PEAR/Installer/Role/Data.php";s:4:"pear";s:27:"PEAR/Installer/Role/Doc.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Doc.php";s:4:"pear";s:27:"PEAR/Installer/Role/Ext.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Ext.php";s:4:"pear";s:27:"PEAR/Installer/Role/Man.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Man.php";s:4:"pear";s:27:"PEAR/Installer/Role/Php.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Php.php";s:4:"pear";s:30:"PEAR/Installer/Role/Script.xml";s:4:"pear";s:30:"PEAR/Installer/Role/Script.php";s:4:"pear";s:27:"PEAR/Installer/Role/Src.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Src.php";s:4:"pear";s:28:"PEAR/Installer/Role/Test.xml";s:4:"pear";s:28:"PEAR/Installer/Role/Test.php";s:4:"pear";s:27:"PEAR/Installer/Role/Www.xml";s:4:"pear";s:27:"PEAR/Installer/Role/Www.php";s:4:"pear";s:23:"PEAR/Installer/Role.php";s:4:"pear";s:33:"PEAR/PackageFile/Generator/v1.php";s:4:"pear";s:33:"PEAR/PackageFile/Generator/v2.php";s:4:"pear";s:30:"PEAR/PackageFile/Parser/v1.php";s:4:"pear";s:30:"PEAR/PackageFile/Parser/v2.php";s:4:"pear";s:26:"PEAR/PackageFile/v2/rw.php";s:4:"pear";s:33:"PEAR/PackageFile/v2/Validator.php";s:4:"pear";s:23:"PEAR/PackageFile/v1.php";s:4:"pear";s:23:"PEAR/PackageFile/v2.php";s:4:"pear";s:16:"PEAR/REST/10.php";s:4:"pear";s:16:"PEAR/REST/11.php";s:4:"pear";s:16:"PEAR/REST/13.php";s:4:"pear";s:34:"PEAR/Task/Postinstallscript/rw.php";s:4:"pear";s:24:"PEAR/Task/Replace/rw.php";s:4:"pear";s:24:"PEAR/Task/Unixeol/rw.php";s:4:"pear";s:27:"PEAR/Task/Windowseol/rw.php";s:4:"pear";s:20:"PEAR/Task/Common.php";s:4:"pear";s:31:"PEAR/Task/Postinstallscript.php";s:4:"pear";s:21:"PEAR/Task/Replace.php";s:4:"pear";s:21:"PEAR/Task/Unixeol.php";s:4:"pear";s:24:"PEAR/Task/Windowseol.php";s:4:"pear";s:23:"PEAR/Validator/PECL.php";s:4:"pear";s:16:"PEAR/Builder.php";s:4:"pear";s:20:"PEAR/ChannelFile.php";s:4:"pear";s:16:"PEAR/Command.php";s:4:"pear";s:15:"PEAR/Common.php";s:4:"pear";s:15:"PEAR/Config.php";s:4:"pear";s:21:"PEAR/DependencyDB.php";s:4:"pear";s:20:"PEAR/Dependency2.php";s:4:"pear";s:19:"PEAR/Downloader.php";s:4:"pear";s:19:"PEAR/ErrorStack.php";s:4:"pear";s:18:"PEAR/Exception.php";s:4:"pear";s:17:"PEAR/Frontend.php";s:4:"pear";s:18:"PEAR/Installer.php";s:4:"pear";s:20:"PEAR/PackageFile.php";s:4:"pear";s:17:"PEAR/Packager.php";s:4:"pear";s:14:"PEAR/Proxy.php";s:4:"pear";s:17:"PEAR/Registry.php";s:4:"pear";s:13:"PEAR/REST.php";s:4:"pear";s:16:"PEAR/RunTest.php";s:4:"pear";s:17:"PEAR/Validate.php";s:4:"pear";s:18:"PEAR/XMLParser.php";s:4:"pear";s:19:"scripts/pearcmd.php";s:4:"pear";s:19:"scripts/peclcmd.php";s:4:"pear";s:8:"PEAR.php";s:4:"pear";s:10:"System.php";s:4:"pear";s:44:"Structures/Graph/Manipulator/AcyclicTest.php";s:16:"structures_graph";s:50:"Structures/Graph/Manipulator/TopologicalSorter.php";s:16:"structures_graph";s:25:"Structures/Graph/Node.php";s:16:"structures_graph";s:20:"Structures/Graph.php";s:16:"structures_graph";s:11:"XML/RPC.php";s:7:"xml_rpc";s:16:"XML/RPC/Dump.php";s:7:"xml_rpc";s:18:"XML/RPC/Server.php";s:7:"xml_rpc";s:12:"XML/Util.php";s:8:"xml_util";}s:3:"doc";a:8:{s:32:"archive_tar/docs/Archive_Tar.txt";s:11:"archive_tar";s:12:"pear/LICENSE";s:4:"pear";s:12:"pear/INSTALL";s:4:"pear";s:15:"pear/README.rst";s:4:"pear";s:69:"structures_graph/docs/tutorials/Structures_Graph/Structures_Graph.pkg";s:16:"structures_graph";s:24:"structures_graph/LICENSE";s:16:"structures_graph";s:29:"xml_util/examples/example.php";s:8:"xml_util";s:30:"xml_util/examples/example2.php";s:8:"xml_util";}s:4:"test";a:40:{s:36:"console_getopt/tests/001-getopt.phpt";s:14:"console_getopt";s:34:"console_getopt/tests/bug10557.phpt";s:14:"console_getopt";s:34:"console_getopt/tests/bug11068.phpt";s:14:"console_getopt";s:34:"console_getopt/tests/bug13140.phpt";s:14:"console_getopt";s:35:"structures_graph/tests/AllTests.php";s:16:"structures_graph";s:41:"structures_graph/tests/BasicGraphTest.php";s:16:"structures_graph";s:48:"structures_graph/tests/TopologicalSorterTest.php";s:16:"structures_graph";s:42:"structures_graph/tests/AcyclicTestTest.php";s:16:"structures_graph";s:33:"structures_graph/tests/helper.inc";s:16:"structures_graph";s:32:"xml_rpc/tests/actual-request.php";s:7:"xml_rpc";s:24:"xml_rpc/tests/allgot.inc";s:7:"xml_rpc";s:36:"xml_rpc/tests/empty-value-struct.php";s:7:"xml_rpc";s:29:"xml_rpc/tests/empty-value.php";s:7:"xml_rpc";s:24:"xml_rpc/tests/encode.php";s:7:"xml_rpc";s:29:"xml_rpc/tests/extra-lines.php";s:7:"xml_rpc";s:27:"xml_rpc/tests/protoport.php";s:7:"xml_rpc";s:27:"xml_rpc/tests/test_Dump.php";s:7:"xml_rpc";s:23:"xml_rpc/tests/types.php";s:7:"xml_rpc";s:36:"xml_util/tests/AbstractUnitTests.php";s:8:"xml_util";s:34:"xml_util/tests/ApiVersionTests.php";s:8:"xml_util";s:42:"xml_util/tests/AttributesToStringTests.php";s:8:"xml_util";s:41:"xml_util/tests/CollapseEmptyTagsTests.php";s:8:"xml_util";s:42:"xml_util/tests/CreateCDataSectionTests.php";s:8:"xml_util";s:37:"xml_util/tests/CreateCommentTests.php";s:8:"xml_util";s:40:"xml_util/tests/CreateEndElementTests.php";s:8:"xml_util";s:42:"xml_util/tests/CreateStartElementTests.php";s:8:"xml_util";s:33:"xml_util/tests/CreateTagTests.php";s:8:"xml_util";s:42:"xml_util/tests/CreateTagFromArrayTests.php";s:8:"xml_util";s:45:"xml_util/tests/GetDocTypeDeclarationTests.php";s:8:"xml_util";s:41:"xml_util/tests/GetXmlDeclarationTests.php";s:8:"xml_util";s:35:"xml_util/tests/IsValidNameTests.php";s:8:"xml_util";s:34:"xml_util/tests/RaiseErrorTests.php";s:8:"xml_util";s:39:"xml_util/tests/ReplaceEntitiesTests.php";s:8:"xml_util";s:39:"xml_util/tests/ReverseEntitiesTests.php";s:8:"xml_util";s:42:"xml_util/tests/SplitQualifiedNameTests.php";s:8:"xml_util";s:31:"xml_util/tests/Bug4950Tests.php";s:8:"xml_util";s:31:"xml_util/tests/Bug5392Tests.php";s:8:"xml_util";s:32:"xml_util/tests/Bug18343Tests.php";s:8:"xml_util";s:32:"xml_util/tests/Bug21177Tests.php";s:8:"xml_util";s:32:"xml_util/tests/Bug21184Tests.php";s:8:"xml_util";}s:6:"script";a:3:{s:15:"scripts/pear.sh";s:4:"pear";s:18:"scripts/peardev.sh";s:4:"pear";s:15:"scripts/pecl.sh";s:4:"pear";}s:4:"data";a:2:{s:16:"pear/package.dtd";s:4:"pear";s:18:"pear/template.spec";s:4:"pear";}}PK�a�\�>��#pear/data/Archive/design/design.txtnu�[���eZ publish Enterprise Component: Archive, Design
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Introduction
============

Purpose of the Archive package
------------------------------

The archive package takes care of the different archive and compression
formats and handles them universally. Archive provides the basic
implementation to extract and create the whole or a part of the archive.

Some research will be done during the design phase whether the PHP stream
wrapper classes can be used to provide a common interface. 


Current implementation
----------------------

The current implementation implements only the Tar archive. The implemented 
algorithm doesn't support many (or if possible all) Tar archive-types.
Furthermore, a clean up of the design and code will be done to provide a
better interface.


Requirements
============

Design goals
------------

The Archive package should (at least) provide a low-level interface where
simply (a part of) the files can be extracted to a specific location or an
archive can be extended with new files. On top of this interface a part of a
virtual file system can be build. In another package?


Design
======

Introduction
------------

In the design we make a distinction between archivers and compression
libraries. If a format supports both, it is categorized as an archiver.

The compression libraries, if not available in PHP, will be implemented as a
stream. The stream functions from PHP have a different resource handler for
files and directories. Therefore they are hard to combine and makes it
impractical to use them in an archive (which is streamed). 


Supported file formats
----------------------

Archivers: 
Tar, is a pure archive format. 
Zip, is an archive plus compression algorithm. 

Compressions:
gzip, implemented as stream in PHP (zlib).
bzip2, implemented as stream in PHP (bzip2).


Since the most common compression formats are already available in PHP, we can
simple use the stream functions to access them. (And use them directly in the
archiver).

PK�a�\�g�3�{
�{
*pear/data/Archive/design/class_diagram.pngnu�[����PNG


IHDR��X�)bKGD������� IDATx���{T�U���W��	��h��N^�3i㤩y=h:�x��i*W�ۘ}C�r��/%�RP��Xi��%/��&�L��x�1R$D���:g8@���c-֜�?��|>�d�z��]



T=���	p�8Ն�T�SPm(N@��8Ն�T�SPm(N@��8����܋��ۧ�˗@
�/�`tj-vN��?^IIIF�P͒��t��!�cP��s
�(11���QDD�����9Ն�S�������ˍ��
����^0:u;�PΟ?���$�c����$:t���)�@
JLL4:�J���0:u;���P��jCq
*�ʕ+FG��)�V���P�
���
(##�F�wqq���K�}�2lk��*|�
�������P�%$$(77W������>���D(*22R׮]3:��(N�Z\\�$�g�qh�v*((0t�T7�S@�e�Z������߯��_͛7��b�7�|ct4��)@�ΝSdd�ՠA���)""BǏ/v����]��X,5j�x�yzz�]�vz��Wu���s�Y�F�4n�85n�Xcǎu�/-۹s��裏�q��2dH��H�Ν;գGyzz���GO=���9Rj�S�N���E-[�T^^^�c���ԲeK�x���*���K
0@^^^����СCu����n�W�}|��rqqQPPP�YN�<)=���ϯ��5��깽{��S�N�����[����r��裏j�������ˡ�f����C�6m�իWu��m�>}Zo�����飬�,�9�ܹ����K��>��]�~��ܹSj�ɓ'�ȑ#���V�ƍ+�E�6nܨ'�xB���۷u��5%''�W�^���/K���}�������b�l߾]�}�����k/֨��RV�R�>}�{�n����ڵkڶm�z��Th΢������s��Է�~�4�o��$iРAru�OV�2��~걌��9R���z�����S�n�ҁ4e�����l6�����+((p�����_����Ϝ9�iӦ�Ν;�>}�Μ9���\�ٳG=�=�7�|�)�'�|�+W�(88X&�I�Խ{w������OK�����u��u���;��"IS�N���?��g�*77W����C=������O�Y"##%I�W�.�zll�$iʔ)�*�^���ɓ��_�Z���SVV�>��s�k�N����j{�Eۅ�l�{cƌ���B�’��%I���{5�����Uzz��̙�e˖顇RÆ
գG}��5k��_����{��y<�H�^y���f��U�V��Ԙ1c�Emڴ����z�>�H��n�:�9���$I&Lp践m�K2o�<������[��"I�&Mҟ��g�n�Z�ի�V�Z%駝FJ���O�y���u���k����.�9RR��KY�]*��%�>}�h˖-�ի�5j��}��>�$}����kI�{�G����B����?:p�\]]5hР
�j�S��l��<����^���cǎ�~��ƍ���<
4H�/v���g�I�fΜ��]�ɤ���9sơ��~жm���⢈��k&L���������?���o߾N}�b3c����={J��^�ZbIjР��y����i͚5�֯_�۷ok���jذ���y/���s�9�u��M�t�ƍ
�Y��ڵ�~�a:tH�������S~~��w�-ZTh=P{P�@=v��qI���_�;kt��Q�OG��$22RgϞ�C=��>�Hnnn����$I�;w.s��>�H?�������@�k�[�V߾}��?jÆ
%�ѪU+���d�i׮�S_�F�$Iw�ܹ�N�*I���q�/z��T��RܱK��䡇r�kܸ�$)??���Z��އ���>���ڶm���v�G�po�8�z���`�4��?Tbb��6m����o���qs��MIR�&Mʜ�vd��ݻ�-������V8R�,6����Na:tP�^�t��)�ݻW�d�Xd�Zխ[7u���>��沈l;�T��އ�ߣ}l)999ڹs�$�S�WP�@=f�
�ڵk��Q�� �~��f͚%�_�^:t(u
[a��?~\_~�e��>|X�~�m��V$KU+�{Jq��H�{/u�#�<���`m߾]ǏWJJ������秮]�T�S��lǷ|���^NN�Ǝ���l���k:th�cm��X��2ͽf�I҄	J-�?~���(o��6z�h5k�L[�nUNN�դI�7�a\E�K]5f�ݹsGQQQ��Ζ$=��rqq18�
�P�=����7�xCyyyN�����t���/����T�1B���+u����K�V�^�t�j����Emڴ�$ݹsG�ׯ�$=����;s�LIҺu�ʼ�Hy�T///EDD�ڵkZ�t��^���c�:3T�b[I~~~��o;�g�֭z뭷$q���S��fΜ���O����O<�Ç+''G�w�ִi�4a����+**����d���{�ԩ�֮]{��-f̘�
(66Vs���w�}���l�ڵKcǎ�$M�4I��c�]�tI&�Iݺu+uޞ={�k׮�t�v��Y��-O��)IZ�t�$�#}���#يk�l٢��<������z�G�������]�����P�(!!A^^^��?���ݻ���KPtt�rss�|�ru����E�I�RSSդI����c����ߗ���/^��-[�q���/�o��F={�ԫ��*I����$=��se�o�=���)O��ҩS'u��MYYYz�GԽ{w�1y/���NJ{O��裏J�F�%5hР�s�3��W�^��l�x�P�
<X_}��&O��V�Z���C��w��q�رC3f�p�����kL�<Y)))����f͚���S���/��k���jذ��]����d�h�¾��ݘ�f5k�L���t�ڵ*�R�l���k�Myߋ�bcc��O�q��rww��~��r�a;�G�H�5.F��^��������-���ĉ
����N�8��� �#+""B�_l8��s
�}�vIҰa�jma
�w�����t��5�X�B�4�|���Fq
Ӽys�g�٬�]��T�S`�V�Z)##CO=��V�ZetP
(N�aΟ?otP�\��{�)�6��ڸ��d���FGP	III2��F��Na�j@``�F�et�4j�(u�����)�@
Wxx��1�Gq
5 !!AF�P�f���㍎@�Aq
5(11��*�"3ʏ�jШQ�����n�jt�W���Eq
�@zz�L&�~��_I�.\� �ɤ�����8y�d�\;11Q���?��c����>�V�U�ԱcG�vHH�a�j��^zI)))�X,�j�G�j�ʕڸq�


4f��K�.5���b�j���Sl�.%%�֭}��-͟?_#G��������5b�͛7O�nݪ���)�d2�֮]+I�����d҆
$I+V���d22&J���t�;��7n�8���+66�d��}��wz�����~ݼySmڴ�3�<���;����Ttt�v�ڥ�^������H5i��>�VP�a�-[�L���jР�~��_������$I������֎;t��eyxx�]�vzꩧ4l�0��
�X,�����z���U�V9�)�����wIkgffjÆ
z�����kӲeK{qф	Դi���{�)�V$q��)��f�n�Z�7o��jդI�����jϑ����'��ի����4-X�@w��ѐ!C$I7o�Գ�>�ӧO��]�rE			:|��bbbԨQ#���M���ׯK�rrr�y�f���k�ܹ���+W�w���۷o�믿��_���,EDD�5��e˔���P$R��]�O?�T���
s��Çkǎz��˕	�^ı>�j�J�BBB�mW�5k���ի�С��l٢={�h��ᒤ�����k�����
PLL�8�իW���_iii���s��u��ڲe���߯ɓ'K�v��m��e�I?_t��ٳG����$i�ƍ�w:�X,N;��m�V���עE����KZ{�������`�ym}�1��)�V�ұc�b��m߾}��W^yE���jԨ��Ν+�Ţ�����q����s�S�N���P�Ν5g�IҮ]���={�ՠA�.(7nܰ_�����D���9r�,����˔������.�ɓ'%�T|ST�6m��w�`��$��d/�X�t�L&�>��I�믿nS�.]�$Ij߾}��.^�(I�ܹ�C׮]�)�]�v����ޒ���|{���{5h�@ԟ��'�3F111���)s~[1Hy�������!Ijڴ��5[�m@}Gq
����K��_�ؤ(�R�8p�>��c-X�@�;wVNN���}
<X�7o.�%�RPP`�����t�2�m�����R���>W�{�)�b�(::Z�"�Ţ+VH�BCCe�X�?���$����:���_���W_9���~~~Z���[C���ի�v�ZM�8Q7n�вe�*4��($++��Wܽ����ӢEI��ם��lc�;�S0��j��SqJq�ЫW/I��o��+W�(''�~��������'I���Rjj���򔚚�ŋK�z��]z�)�L&mڴI���z��$��]WΟ?�9}||$I[�nխ[�t��i-Y���]�ڶ��Ν;�4���"�܋܍@}V�S~���j�ΝJMMՓO>�pm�ԩ��'NԮ]�t��yM�<�a\``�S_YL�8QQQQZ�d�SIhh������2224b����i۶m%�ٯ_?mٲE���}�]IRXX�Ӹ��wqk���K)))�Z�9���Ê�܋�9-F��o�5�E������մiSyxx(88Xo���l״iS���j�������|}}5n�8�����ۻ�k�1B,�/~�yzz���S�ڵӤI���k��ǽ���
����rssK���_�ȑ#u�}����Saaa�?~�ﻸ�
�F�i�޽N��ݻWM�4��?^��p/r)(((0:����EDD��l�6�U�Vi���ںu�$I/^԰a�4m�4M�2�������b�����S*`�ĉjٲ�CQB||����4~�x��.�Fwg2��e^��R-��^^^Z�p�f͚�	&H�����|�r5l���t��)�裏j�̙z��%I�=��BCC
NP�P�@�'���l��l6:@��jtܻ(N@��8�����'IIIFGP	III5j��1�S(N��=��@��8�`6�e6����8�S�������ˍ��
����^0:u����Ο?���$�c����$:t���)�@
JLL4:�J���0:u;���P��jñ>����<x��5k��>�L.\аa�����۷W��'O�T����L&�]�g�XƖԮ�K�.i���:x�\�"��g?S߾}5v�Xy{{�j��kK�{W��ѿ_�O�l<xP�ԣG�=�R���Q�@-`�Z%I;vth���T��/��RRRjU�©S�4u�Teee�rssu��I�<yR۶m��ի���+��{���ww��Q�\�R7nTAA�ƌ��� u����h�s(N�(�8�֮N)))�^/K�EUf���;���R���5k�,�m�Vyyy���o��;��ĉZ�r�-Z$��P��\���X c��׭[�4�|�9R~~~��#Fh޼yJJJ���W��@}�jt�+��d�Y�v�$)::Z&�I6l�$�X��Lǟ�kRSS%Io�񆂂���
�k׮����$�۷�Ȉ��bcc�����c��ƍ���t�����{�)�!W�^Ղ4`����S�Ǐ׎;�E.�eggkŊ:t�z��!C���Wnn�}L��7GY��e�cӼys��(�Ţ]�v�z��G�р4}��R���w����~��_�G�;v��o����־�%e,��*�������;C��7�ѣ��|�I-[�L7o�,v���<-]�T}��р�j�*I���5g�����������pDSE3����+33S6l�c�=f?J�Z�li/��̬pV�c}0��S�N�l6�u��ڼy��V�&M���� %$$��geeiʔ)�pႽ�ĉ�3g��ܹ���>}��?n�|��bbbd�Z�r�J���\�jy�L�2Eo��"##5|�p���+$$D�^{ٲe���t(D(���M�8ѡ@&--M,Н;w4dȐrg)kƚxE׼y�}�Y�>}�>�ʕ+JHH��Ç�F�9̱t�Rmٲ�������${�������������?V*sI��>��Segg+,,�i���0>|X;v���O?]-Y���9�Y�VIRHHH�m���x]�pA������с]l����u��q���(!!A�Rbb��t�Ç+99Y�dl��m
?T��<ʚ�f��ኊ�����֬Y��S��o߾�1c�vø�=�m�V���עE�ʕy͚5�z��:t�-[�hϞ=>|�$)&&�Lk�Uь�}^6�yWE�\�v�N�>�������ի��ﯴ�4���9�a�Z��G�/���d����i���ڿ�"##%I{��t撔�y�߿_��4���6T
�S0���cǎŶmv��-I�;w�:u�$���j޼yNs�ܹS���� ����m۶Z�p�$9MS*�g�ںu�֭[��^&�IV�UK�.��l���2�=~�xyzz�;�}�$I���ըQ#͝;W�E��_�=_y2��+�fq�_�;w���c;F��W_}U?��<==e6�%I?����̙�֭[�A��0a������.�y^'O��$�n��i�6m�8�U�c}0H��!�.]��K��ۯ���^�uI?��q��9IR׮]��4����%IC�-v��2��n U�'88X����4i�rss���h���[ϫ$����t�$�}���~y�X��U�wUt͋/J�:w���o�}�=��
?��G��k����˫�5�����!Ijڴ��8[�m��@SPP��vqq�똢n޼Y���<yz��-�ɤ��t�q����8q�$��eZ��]S
g*|L�Mqϵ�Mь5�ʺ�L~~~��4hPl��k��Y��e{��e��UŻ���)�&�y IDAT�b��ȑ#���THH����t���w�Shh����Ʒj�J��׿t��1u������1�����t��9m۶M~~~�~/wS�<���:r�6oެ3f8]�� S�(++KM�4�T�N$>�����+--M:t��5Jb���ٳg��W_�{�����ʞ��*��jѢ��\���ׯ�E��lG����)�j�J�BBB�m���K�/^,�ժ��<}���Z�x�����K��Ν�'N�Ν;�����?�Y&�IӧO����a;�:�'ϸq�$I111z뭷������\ݼyS{���+���0gy���G��u�VݺuK�O�֒%K����K���o�ʕ+����ҥKe2�4|��R�.�%)��*����$EEE)55UyyyJMM��~��ݻ�׬*�y^���lEN��j�('�vN�@�)N����'�|��g�jҤI��;i�$}���JMM����5l�P/������㣌��1B~~~ڶm[en��y���	&hݺuڸq�6n��4_�֭��/T����-[���w�ջ�+I
s���V;w�Tjj��|�I�kS�N-u�Q��<��2q�D�ڵK�ϟ��ɓ�:��&�y^�z�RJJ��V�BCC����ͅ8�E�����|��7�¼����C��Y�frwwWPP�-Z$I���mҤ�bbbd6����'777y{{�_�~���s���_V@@���ܔ��[-�Y�<�4k�,�\�R����< WWWyzz*((H3f�кu�컓��^|�E�9R��w�<==����;�kѢ�bcc5p�@5m�T
֛o������vYר��U�6m���X�=Z���rss����ƍ���8y{{W��U�<�kРAjԨ�����4�޽{դI�.E�j��{MBB�"""d�g�h�*]�|YC���������|~�^�j�*�^�Z[�nU@@�$��ŋ6l��M��)S���݈�IR|||�m����)�}���dҦM�t��
����̙3z��$I]�v58!P7L�8Q-[�t((�������ӱ@��(N���%�d�
0@ݺuӨQ�d�X�����H�u����.\���d]�|Y�/_Vrr�.\��
�{���@�̞=[������u������TϞ=5e�����3}�Q͜9So���$��Shh����7Q�@���*��,��lt�O���@��8Ն�Tw�P����@%��f�#P�P�@
Wbb��1T���@�#P�p��
;�P��ۧ���c�f�Y���F��Π8�TPP`t�@��DZ>�6���p��@zz��f͚��>Ӆ4l�0���j���վ�ɓ'վ}{�>��$I�X,�~���*�=ۘ�)���)11Q�$���C�G�68��(N��Z����;:�CBB�}�^zI)))�����:z�V�\��7���@cƌQPP��t�bt4�P�@-PRq��]�RRR*���,j):wEwi�	�n����5r�H���I�F��y��)))I^^^'0�����L&��g�ڵ����h�L&mذA��bŊ2mc���*==]cǎ���7N��銍�50��(N��z��,X��gϞ?~�v��a/r),;;[+V��СCճgO
2D��rss�c
��9ʢ�l�4͜9S����/�ŋ�֭[����j��z��w˼~ff����aÆ)??�����e2���SO9d�����k�)<<\Ђt��U����m6lؠ�{L������-[ڋ�233�|O��S0��b��bQBB�$�u�ֲX,����$��HRVV��L���۷�ƍ�}��N�8�9s�8͝����ӧk͚5�t�n߾�˗/+&&F���8�ôi�t��a�����ڼy��-[V�?��OZ�~�Z�j����2�ӴiS�3F.\�g�}�pmϞ=��>}�8��ڶm�rrrt��
m߾]�'O֍7�c��?��Segg+,,�)_XX�����cǎ2�����f�Z%I!!!Ŷm���u�����+&&FPtt��N6�ׯ�������:tH����ҥ�>���dI���>nWV�֭�e��߿_�'O�$�޽�ر˖-S||�ڶm�+V�Q�F�Z+""B�5���؊Sz���пo�>-_�\PLL����u��%�_��>���P����/I
v�f볍�o(N�`�b��;۶�v̝;W�:u����BCC5o�<�9w��)I���RPP����Զm[-\�P��}��j���fϞ���@5h�@��3�Ͳe˔�� ooo���{�.�Z��w�F��S�N�/����Q;ǎS�ƍ�0��W_UXX�<<<ԩS'͝;W�c�Ly��ɓ'%�T�ST�6m��7�F��2�L�K�j�ҥ��믿��_]�O���;wN�ԵkW��-������K��Z��iii^F�ڵ���w���X���L���z�*����q�F���*,,L_|��ܹ��={����O�=z8��t�"I�pႽ�<�0##C�OGe볍�o�9�:��������r�1Eݼy�J3�������6f�Y
6TAA�V�ZU�7o���~ZG���j�޽{%9�#ɩX�V4���?���m�W��6��Ҟ����S0��bё#G����������~���PEGG;�oժ�����رc�֭���رcNs����ܹsڶm������^*����~-_�\{������աC�
�5a�mڴI7n�_|!WWW����i\jj���5G��$���?�����h�BW�\���բE�kׯ_�����9Y�VIRHHH����qI��ŋe�Z�������Z�/vۿI�ܹsu��	ݹsG������?�d2i����=l��!""B=�$�/�K��y���SO�O>э7��#��Y�fN��x�
�3<z��$I�
��)�3l߾�$ُ^*��gP߰s
*OqJDD�>���={V�&M*u�I�&���?Wjj�Ə�p�aÆz���meddhĈ���Ӷm���a�0��R�͕�����̙�g�}Vбc�Թs�
��3�())IR�G�H?T�v��Acƌ����{�꥔�Y�V���:���Ӓ����9-F��oڅyyy)::ZC�U�f���� -Z�H����iۤI����l6���Onnn�V�~�簋��/�������)77���n:u��ÇK���)�7��ӧO�c�-[���p������W�<�V�ZU�g8h� 5j�H{��uZk�޽jҤ�}���ƥ������k!�?�E�U����2d�������\���5{��Ջ/��֭[k����l��T�/6�V���ի�u�VH�.^��aÆiڴi�2eJ����!I���/�
�X�9�:�O�>2�Lڴi�nܸ���|�9sF����$�k׮'4Vvv����{}���	&��'NT˖-��������t,@}�ntP6�֦M��d�-Y��ᚏ��"##
JV;>�'((HC�������p�B͚5�^�����˗�aÆ5��6�8�:b���
���3g�(77W>��z��)S�����舆����e2�4w�\����x�G}T3g���o�-Iz��Z�9j�S�#\]]e6�e6���R+m߾��c,K���8r5:�]���P��j�nt�ѣG@%$%%�l6�:��S����5j��1TҨQ�Խ{w�cP��s
5 <<\���F�j�)Ԁ��EDD@0�͊��7:u�)Ԡ��D�#���(?�S�A�F�2:�Jغu���s\��{;��<yR�۷���.]���u��A]�rE���~��}�j�ر�К&�I�d�X*���u��AIR�=4z��Y�^Eq
��K/�����J�:uJS�NUVV��/77W'O��ɓ'�m�6�^�Z���U�fu8z�V�\��7���@cƌQPP��t�bt4�:�c}��RRR*=�;C��,u��]			:x��ۧ>�@���/t��e�\��BkZ,�)b�u��ϟ��#G���O���1b��͛�[�nU���*�S�EL&����$55U���o(((H���jذ��v��(IҾ}���xW���JOO�رc�}�ƍSzz�bcc
LP�Q�@=V��haLff��y���7�Q�=��Ojٲe�y��<͛7�$]�z��Z``�,�v��Uꚶ�G�р4}��bs��iii�9s�����_�R�/v����իZ�`���={j���ڱcG���a�=��c���$�e˖2�Lڰa�233��DP�)��͛7���꣏>�w�}���<]�rE			�2e�����O�2E��+V��ѣ�}�v��^�l�233�D�3m�4>|X999�~��6oެe˖ٯgeeiʔ)ھ}�nܸ�۷o�ĉ�3g��\�~������t-,,L���ڱcG�����8�z�b�8|��׮]�ӧO+  @111:p�V�^-���)..�a��Ç+**J���Z�f��N���}�jƌJLLTnn�]״i۶���߯E����u��ڲe���߯ɓ'K�v��m��.����~������߿_��t��g��8َ�)�蚢�5�V�1w�\u��I�ܹ�}��=�
8P[�nպu�����d2�j�j�ҥ2����S��Ǐ/OOϻ��={�ՠAEDDH�nܸQ�=���j޼yNs�<yR�O/E�i��aʇ����ŋ��Ν;;�w��U�t�ҥ��I�&i����?����H�={Vo��V�ֶ��M�v�쟽��%I�����s��9d�	

u�+##C�ԴiS�k�>������ϊic�%�hmQ��æw�޺u떶o��td����&N����h<x�Lk�e�I���vqq)q\AA�C����>WW�][_ik�d�����K����+�~[�����,Iڼys�s�v0)��:�j�J�t��1���mIjѢ�$��N�l}�1(�S��l;��?��ׯ_?IRTT�RSS������T-^�X�O��،7N����zKiii����͛7�g����+�������fU{���%I�/��jU^^����k�=־}{I�-�)��g���X�9eddhĈ���Ӷm�4q�D�ڵK�ϟ��ɓ�:���_&Lкu�q�Fmܸ�i�֭[�^(uͪ�O>�DgϞդI�J۫W/����j�*44���j��X���c�j��"��R�k����
����rss%IM�6Ull�F�-___������W�ƍS\\�����5k�V�\�~�������<==�3fhݺu���)uͪ�����h
:T͚5��������h�"I����}�A�ԨQ#�ݻ�i��{��I�&��XP>�@=7p�@
8Щ������ٳ5{��2�ӣG��ѣ�k�T�S����$�y��Z�`�C��˗%I�����q��2��Z�z�.^����I�ŋ��W_iڴijԨ�]�
�a�pO�ӧ�L&�6mڤ7n(??_gΜ�k��&I�ڵ���'�e˖�����������O�Ǐ����vN�0�L�2oM!T��M�6iɒ%Z�d��5EFF:�yyyi�…�5k�&L� IJNN����հa��
���>�����G�T�=0b�7�T�F�XCkLlD��z�Fj�z�Ln�ME�L�d���4�˭`�P�R5����W#JT�Q��0D�G~���Ay�}�f�a���{}�&3��7k�9<��ϟ���PmݺU���S������$�<3h� ͞=[˗/�$���늈�h���Sp�'m���C�E��Y���3�;���Es
��)h3^F�Q���kt-������x�c�VhN�%$$hW4��,�,��1�vGs
�`���Z�r��1����7�0:n���<
*++���kt-����������)�����#h��jt�;���М�6ñ>@����۷o�������/����
жm������	ۗ�lnR��fs��l���tO999ڷo�$i�СJHH04��)<��Ν���»6W�ܹS�/_�$]�|Y;w����?ߞqTjj�֯_���zM�8Qaaa
7:�)<�
����K�^z�%}��'���{�S�l�ilw�wL���բE�'��$I����…���+___C�x���ln�2��ܹs��_����@���P�.]TRR���FG��������kҤI��ɓ'�����00���97r���\�R�w�Vmm����W^yE,�伋GMM�V�^���}��W�֭�^|�E%%%���G��a�$//O�n�ҋ/�(___������V^^�^{�5�|���?�����XW�^��?�W^yEcƌ�����A�nݺ���4m߾]UUU�V�>}4n�8�?��u�q�w�_�۷O+V��'�|"///%$$h֬Y����{ァ]�v���[#F�����|���r劲��5x�`9�{��!�٬��lM�:U�����6��@s
n�ڵkJJJ��ӧcǎs4�ܮ��N�f��ѣGcUUUJOOWYY�RSS���j�����O$Icǎ�$���(;;[���JJJR���.]Ҵi�t��������[o��͛�w4��9kHMM�ڵku�|�9�#G��ڵk�Z�ͪk
��6m����~������:�t��u��O�����~��f���O?UMM����\揊�RII��o߮	&�ں��c}p���:}����������{�*--�i��u����ѣz�駕������+''G���*))Q^^�$�]Rl6��_��W�={Vaaaz�'$Iaaa
�ٳg�j%飏>҅��SOiӦMڵk�^~�eIRzzz�뚺I�&���7ڻw�v�ڥ7�|S��~��f׵���2��О={4k�,IҲe���驍7���X3f̐$�ڵ��]\\,I�ׯ���1{
�QhN�@f���Oc�}��$)99Y�������"""�p�B��H��,Y���0yzz�w��JII�$mٲ���M��L�ƍ'I��㏝�w��-I������Pu��Y��ɲ�l�����次s�Β�m�������*..N6�ͩ���u���7��O<!Y,I��_��W�^�ر��N�*I�����u���K�z���2��?�T`���M�:uJ�4p�@������JI��Ӑ�Ǐ7:ו+W�c�Iү~�+��W�r����t��U���ՈB IDATI�Ξ=+I�۷o��nj]s��L���ۧ}���?��?5}�tY,u�ԩ�u��ٛb$�O�>��}}}]�kκ/]�$I�w����k���)�~�ΝG��m\���띮;t����;k�t���F�o۶Muuu��|���ڶm[�9�Ժ����֭[��[oi���~��>��C�3F7nlv]k�رc�����9�ˆ�ik�h+����ٳ����>|XC�q�>|إ�d2�ԩS��ϗ�dj�\�#nV�\���(��{���o����<���I��w�/��RǏ�SO=u�w7���kPLL�bbbt��Q��/�G}�+Vh„	ͮ3Js�ݵkW�;wN����ڵ��=�QAw��7vN�M�5J��t�R����ƍ:r䈖.]�R��s�I����u��1ݼyS/^�| �٬Y�f9j�;k؏�����?��?��������DFF�W�^:z�>��sIҰa�$I˗/׹s�t��u����2��z���6��9k7n��f�6lؠ��=��
�$y{{7��H�Y��� ��O�����$����)�	�ժm۶��ɓJLLl�611Q;w�Tii��L��t�S�N�3g��:00P�.]Rll�L&�~��J�&M�t�#a:t�I�&��S^^��Ν����*((Pii�^z�%���^{��sS뚳�iӦiɒ%Z�l��-[�T��:#5g�Æ
Saa����\򗕕I��}�ٶ
�vN�b��d�����뫴�4��ĨK�.���RXX�/^,I���q���)==]�E&�I���
�ȑ#�f���4�͛���yzz�ڵkںu���Ѭ/����u�V}��7�ڵ�222������_����ׯ��{�=�3��\S뚳���X���[z��'���#���G���z�w�]g��{����ܹ����\�STT$???ǎ;F�P___ot6YYY�Z���5{�uk����رc����V?l�V���ի�y�f���H�Μ9����k�̙JJJ28���j�J�233�.l���1b��f�6lؠ˗/�֭[���p�1p�@��ӦMS�=��#233e2�\�0�)�	��7˖-Stt�����x�l6jƌ'�|}}������<UUU���JyyyJIIQ�N��� /����?�BCC�u�VUTT���NݻwWdd����dtDdРA�={��/_.Iz���ap*�oќ������b��b1:
@��T��6Cs
��)h3^F�QҡC�#h!��bt�
�)���Ç+''��ZAhh��p+��6��)��ݻw�j�@+�X,���4:n���Q}}���Mf4���М�6ñ>@����۷�Ә�lv����Q�n�4t�P%&&*88�Ms�3�l�6��.''G���$
:T			�2/�Ì�qs��Uaaa�@���t��YmڴI۶mSjj�����)���������׫��^'NTXX���Í���hN�WXX��ۛV���kUTT(55U����/~�mڴI���m���vL���բE�'��$I����…����f�xx���ln�8�Eǎ��O�?��?����J���F�j����?^�&Mr�M�<Y�ϟWFF�����)��.護�Rtt�"##5e�m߾��������7�QLL�"##5v�X}�ᇪ��s��Lsc������(IڵkW�歬�����Ǎ�����/�l0�?���������C�jҤIڲe��{��~I�r劲��5x�`9�{��!�٬��l]�r�I��8�7q��5%%%���ӎ�cǎi��.�uuu�5k��=����Rzz���ʔ��*�������K�>���f�*�٬����*--U�������:s挞y�����e�K�.iڴi�p�c���z뭷t��M�;�����OUSS���(�����TRR��۷k„	���i��������ӧ���t�ݻWiiiN�}ح[�NG���O?���,�߿_999
WII����$I6����fs����{L����͞����?���P�����>҅��SOiӦMڵk�^~�eIRzzz�sHRqq�$�_�~.����5h>�S0��ؚ;��ih���>�$%''����VDD�.\��ނ�IҒ%K&OOO���[)))���18�u��MI���?7bk�#G��c�=���}��7��7n���@AAA1bD�s�޽[���\����ܹ����e����?���_^^.I�ի��|�?��S
��c}p�N��$
8�i<""¥���R��໎?��<��u�=����ƍ���)::Z{��Quu�f̘!OO��?{��$�o߾�fk�/]�$I�w����k�|4�`�;�ѱ����:���N�:t�g͝�^��Ԉwu�IғO>y_���裏��'�(::Z[�l����Ə��ZkC���N�
��cM��hN�M���S_|�>�!C�8�>�Rk2�t��)����d2�z�o��FYYY��=��~�
�СCU\\���2�ڵK?��t�g�w�/��RǏ�SO=u׺���ڵ�Ν;���ju����^uu�����Q�FI��.]���2ݸqCG��ҥK]j�{�9IRrr��;��7o��ŋ��d6�5k�,G�}W�Q8����UVV����g�����ѣG�׼�4a�ݼyS������S\\\��6L��|�r�;wNׯ_��/�٬�_~��r؏��t;�ؽ��ݱs
n�j�j۶m:y��MLL�Ν;UZZ�)S�8��ԩ��̙�ԥK�+�ɤ��|�z�QCw
�{�'oo�W��}�Y���ٳ�ӎ0
��O������꥗^r���k��W�aÆ���Peee���p�-++s���a� 6�M6���{���JKKSLL��t�"///���i��Œ$G�������e�Xd2���驀��9Rk֬q�	d޼y
		�����������^�ziҤI����'�|��~s�$�?^�����n�v��=�����������{Ocƌ���G�V�ΝUTT�2_QQ��������:������MVV��V����yݚ���4v�X+//���(X�j�V�^�͛7+$$D�t���?^3g�TRR��	�Z��������;��&F�!�٬
6���˺u�***��;�H�hpB�5m�4���é� 33S&���X 4�)�	��5˖-Stt�����x�l6jƌ't_���JIIQ^^����TUU���<����S�NF�pk^FM3�|���j�֭���P]]��w���H%%%)((��nmРA�={��/_.Iz���ap*�Gs
n���C�E���(-�/@��X��S�fhN@��2:�����#h���\Y,�c�V�9�v���x�ch���x=��3F����s
�`���>|��1�vGs
� ++KV���Z��bQff��1p4�Ўrrr���h2��hN����@l޼��������)@����۷�Ә�lnҳ6��U�k��d���m�9��w��_999ڷo�$i�СJHHh�Bs
���s窰��ݚ7�{>4��JMM���U__��'*,,L���FG�Sx�6z���H�5_K�c�KS2���jkk�h�"����d2I�bcc�p�B�����׷U��6��2��M>N�_:��&M���<y�Ο?�������)��.護�Rtt�"##5e�m߾��������7�QLL�"##5v�X}�ᇪ��s��LKc��?~\�g�������HK�.Ummm���>p���e�Z���P�Ǐ׭[��橬���lָq�Z��>׬Y���\��_��W��O~��C�꥗^Ҋ+t����q��
����1b�����j�*IRuu�,X��Ç����o��k׮�W���kLS~�5fggk��


r����Cf�Y��ٺr��}g���&�]����$�>}�1v��1-X������N�f��ѣGcUUUJOOWYY�RSS���6=�3g�Tuu�$��ڸq�nݺ����{>�b�
]�rEÇװaÔ���?���z���5�v�$�1�E9�s�4�^��W_}U'N�pԜ;wNYYY*))Qzz�:w����_�6mr\��w�SHH�rss����ӟ�$����-�|7�}�駪��QTT��{���TRR��۷k„	m�<z�97����ӧO+88X���ڻw���Ҝv��[�n��=���~ZYYYڿ�rrr������I�l6�����tmgߵ��?
�ի�6mڤ��bM�>]���g�5i�޽{���X�/��jU�Ν�f��{sʳ�>��
�}.IZ�v�N�8����]�z����u��q��TVV�?��ڳg�c�e˖���S7nTqq�f̘ᔻ%�囹�oI*..�$�����=�1{
@k�9ݭ!��q{�Grr����/oooEDDh�….�-((�$-Y�Daaa���T�޽���"IڲeK��i���


Uǎe�Z%I�/_nҳS�L����$�������]{����4��w��EDD�(��sI
�8v�ٱc��;�|�M=������b�$}���Z�`�z�ꥎ;j�ԩ���M�-4�]^^.��&�;=���N5��c}p�N��$
8�i��&���JIRLLL��:~�x��mh7�������s@@�$�֭[Mz��a7e��_�^���Ҟ={t��MEFF����1��z�\gΜ�$
0�i��Ϟ=��}�:~��ȟۿ���o�9��}Ҝ��K�$I���.u�1{
@k�9�٘`�%������z��:ܳ�NW�^mj�f�v��P��ܾ��$=��c�0a����TVV���"I
��\w�u7�5�t�ر�q��ݜ�9�o�嵐�����Cs
n�gϞ��/t��a
2�1~��a�Z�ɤS�N)??_&��=c���S�jÆ
Z�~����#
6���	�ɓ'u��!=��3��C�I�����ڵ�Ν;���ju�����;�Z�}��^p�F�%IZ�t����t��
9rDK�.u�}��$I���:v�n޼��/�>��l֬Y���]2�Gô���/��/7n��mۦ˗/�?���t���F�)IZ�d�JKKu��
���:�ok���V��Ed?&�v��ۏ+h)vN�MX�Vm۶M'O�Tbbb�����ڹs�JKK5e��{�:uҜ9sׁ���t�bcce2�����To?j�n;��!���!���rss%�]�ȴiӴc�UVVj���N�BCC]�$�}6L���*++SDD�SmYY����vN�b�������뫴�4��ĨK�.���RXX�/^,I���q���)==]�E&�I���
�ȑ#�f���1�͛���yzz����mx��}�;�q�<bĈ6���﯌�%$$(((H���


��ɓ�f��ɼ��9��ѣG�s��***ryOQQ������������F��a���%��*�_�w^����*�;V������k��?���4g����K7n4:��[�j�V�^�͛7+$$D�t���?^3g�TRR��	\V�U������5pac��Ĉ#d6��a�]�|Y�n�REE��y�I��
N�jjjt��E����$i�ԩ'z8L�6M=z�pj���̔�dr9�����f̘1ڰa��-[�e˖9�Ԍ3J�vn?�',,Lcǎ50�����W)))���wG�O^^�V�\�N�:�<lhN�M̟?_���ںu�***TWW��ݻ+22RIII


2:b�

Ruu��f�������it��ƠA�4{�l-_�\���+""��T�aDs
n���C�E���(�f˖-FGx�=j�=cx/�S�fhN@��2:����\�#h���\����Bs
�(!!��@��9�v`�Xd�X���;�Sh�w��ʕ+���>\o���1pF�QPYY���\�ch���\�߿���vN����@X�V�#�v�9m�����*//W߾}�w�}���:t萾��+����d2)22RV�U�������fI��fkq}NN����'I:t�Z)%�Å�qs��Uaa�Kƍ7���*??����JUVV��?�ҥK��϶W���������׫��^'NTXX���Í���Xq���
�/_�\����ر�^}�Uegg���XEEEJKKӈ#t��u%''�…��8���Z�h����d2����X-\�P���F�x�М��l6;��1���wmܸQ>>>����/�ۿ����_�U;v����"""�b�
��G?RMM�6n�ht�v�������kҤI��ɓ'�����00���c}p#.\�ʕ+�{�n��֪O�>z�W�`�Ir:����F�W�VAA����+u��M/���������#IN�0��m6�6nܨ��zM�<YO?��]�̜9S;vT�~�\ޓ���y��),,L�V��$]�rEiiiڱc�.^��nݺ)::Z3f̐��_�Ynw����X˖-SAA�|||4|�p����֭[���ŋ���V������Utt����ʕ+�������ѣ��f����5u�T���7i^�G�)��k׮)))I�O�v�;v��&���:͚5KG�u�UUU)==]eeeJMM����7P�7�=��L�{���ŋ��b�
]�r���q��U���:q℣�ܹs���RII����չs�F绛��{O������ׯk˖-:t�֭[����F��r劦O��3g�8ƶmۦk׮��~�駪��QTT�˽��(���h���0a�}��aı>����L�>}Z���JOO�޽{���洃�ݺu�t��Q=���������������p���(//O���$6��q]UU%Iz����;o�޽U\\�h^Y�v�N�8���G�իW+88XǏך5k�{�ݻwk�ʕڻw������g�jݺu�|�����Μ9��={꣏>r|��?�ܥ���X��v�����k�-�S0��lv���g�}&IJNNV�������-\�����%K�(,,L����ݻ�RRR$I[�li4׭[�$I:t�g�;��M�2�q|���0���ˎ;�Ԙ7�|SQQQ�V�������4gcv��)IZ�`�����;��/�K����rIR�^�\��y�5���&N�:%I8p��xDD�Kmee�$)&&��w?~�ѹ���t��Y}���ݻ���u�u�~l΀����9{��}�#Ieꓮ IDATC�u��$�#���^ӿ�s��ҥK�$�{�1{
�Es
��XI�H��]}}��uC���Ys��W�6zРA:{�����?kƌM�|��wMi�}������;�WWWw�://������q�M�����ov�;�~��kk��(�X�DϞ=%I�v��Z�L&�$)??_6���OIII�s���J�֮]����ow��W�킃�%I�r�_�3K�l�v�c���^JKK��<(I���w�\��z���2�ڮ]�J����]����5��)��Q�FI��.]���2ݸqCG��ҥK]j�{�9IRrr��;��7o��ŋ��d6�5k�,G���~�$��?P\\��_���^{M+W�Tyy����TWW���
���j�ԩN�h�ȑ#%IK�,Qii�nܸ���RG�g�}�Q(Iڼy�jkku��	-[���~��w���Z�d�$i�����/8r8p@7n����7���.�}�����#�ng���[����Z�ڶm�N�<����Fk�s�N���jʔ)N�:u�9s�8�u��%����d2)??_���\^^^Z�~�֮]��k�68WϞ=��o�3��iӴc�UVVj���N�BCC��F��M�6�׿��~��_K�������{��<��S�8q�=sM�2E��_T^^�t���ѣ]�P�
���B���)""��}��ۛl��)<P���4���Wiii���Q�.]��奰�0-^�X�������Szz�,�L&�<==��#Gj͚5N�{̛7O!!!���T]]�c���S���Sff�����}O;v�������4r�H-Y�D6l�3�<sϵ���+##C			


�������4y�d�Y�F��9s�(..N��w��㣨�(-Z���^�b��.///�W^ѪU�������(--Mqqq
����F����d��ѣG�s��***r�WTT$???�7�V����z�C���ʒ�j����;�[SUU�Ǝ���`����df�Y�����V�Z�իWk���
		�$�9sF�Ǐ�̙3����nY��V�$)33��k����)��#F�l6kÆ
�|��nݺ���
���;������0m�4���é!33S&���%p�nc̘1��e˖)::ZC�Q||�l6�5c��>|}}������<UUU���JyyyJIIQ�N�����2:h����+44T[�nUEE����Խ{wEFF*))IAAAFG|d4H�g�����%I����"""N�`�97���!��"��bt���f3ln~Mñ>h34���М�6�et%:t0:��X,FG��М@;>|�rrr�������±>h3�@;ؽ{��V��1��Ţ��L�c�6hN����@�d@�q���)h3�T^^��}�:���fI��f3"R�f���Ѿ}�$IC�UBBB���ihN�7w�\ڄҖ<���T�_�^����8q����nt4�G��+,,4:B����բE�'�ɤ��`���j�…���5:�#�� f��q�
Z.##C�ϟפI�c�'O��畑�a`2�G��F.\���+Wj��ݪ��U�>}��+�h����t4OMM�V�^���}��W�֭�^|�E%%%���G��a�?7v���&;;[+V�Pii�:v������~&___G�+W����;v��ŋ�֭����5c����9���ŋ��o���B���*::ڱ�;5e]�����5x�`9�{��!�٬��lM�:U����t��)��k׮)))I�O�v�;v��&���:͚5KG�u�UUU)==]eeeJMM���o�6s�LUWWK��_���7�֭[JNN�$]�zU����N�8�x�ܹs���RII����չsgI�6�L�>]gΜq�n۶M׮]kѺ>��S���(**��=QQQ*))���5a„���7���Mdff����
Vzz���ݫ��4�]A�֭[��G��駟VVV���߯��������Dyyy��wI��l��r�^�ziӦM*..����%I�}���ڵku��	���8��^�Z���:~��֬Y����3gΨgϞ�裏����{]�T\\,I�ׯ��{�c���S0��lv��ظ��#99Y�������"""�p�B��H��,Y���0yzz�w��JII�$mٲ�E��ϟ���Pu��QV�U�t��e���0���ˎ;�;w�$-X�@�����/٢u���K����N�?��S
���&N�:%I8p��xDD�Kmee�$)&&��w?~�EY����9  @�t��-ǘ���8=g�~��Yǘ������7X{���ҥK�$�:���m��t�1:�]R;^�����C�����իW��A��ލ�7�7��ٳޙ����)�Y�=����Fq���d���97ѳgO}��:|����?|��K��dҩS����/��Ԟ1%I���:y�:�g�y�1~��!G>��={�ĉ:p����eee.�mκ�v�s�Ω��Z]�vu�W]]�@�r�_��iԨQ���K����L7n�Б#G�t�R���{N�����cǎ��͛�x�>����f͚5�Qk�=�~dNk9r�$iɒ%*--Ս7TZZ����:j_x�G�t��
��oӻ�ۢu���W�?�C��}�^����)�	�ժm۶��ɓJLLl�611Q;w�Tii��L��t�S�N�3g��:00P�.]Rll�L&����[�uڴiڱc�*++5}�t�{���NcS�L�_�����kƌ��ѣG�4�4g]Æ
Saa�����Tkߕ�&�
vN�b��d�����뫴�4��ĨK�.���RXX�/^,I���q���)==]�E&�I���
�ȑ#�f��C�͛���yzz����U���﯌�%$$(((H���


��ɓ�f�8j}||������8���G�F�Rrr��{���ѣG�s��***ryOQQ��������t����7:���,Y�V����5UUUi�ر
V^^^��ߝ�Z�J�W���͛"I:s�Ə��3g*))��p7V�U������5pac��Ĉ#d6��a�]�|Y�n�REE��y�I��
N��6m�z����8���)���r,��)��1c�H��-[���h
2D����l
Ԍ3N���UJJ����TUU���*���)%%E�:u2:�#����i�ϟ���PmݺU���S������$�4h� ͞=[˗/�$���늈�08����܄���,�,��Q��
�8��6Cs
��)h3^F�Q���`t-���+��bt�
;��BCCot-�g�y���vN�>\Ç7:��hN�dee�j�@+�X,���4:n���QNN���Mf4�)����x�#h�͛7��at<��9���\}��u3�͒$����M�k�s999ڷo�$i�СJHHh�|0�)<��Ν����f7����*55U�ׯW}}�&N����0���
���><�
[��fk�Ɩ��Z-Z�Hqqq2�L
Vll�.\����6���� f��q�
��������kҤI��ɓ'�����00������;����?�w�;	5-���Ҩ�%:�z�t��Ȼ�ǟ�c6�u�-Z���
��bb�"�B's!�2��o7@Q��s�p�r$����<��{}��u]c�s>_�@.^������ӧ�;w&((����I-,X����:w��������̴�wLqcr�39r���`�u��O<��ٳ�t��GѧO>��#���Y�v-;v�A��~
6�`0�v�Z��Ӌ���������������J�@DDD
��7�S�NY�RRR�:u�M���L&L�@rr����ٳ�������…qv.��_|���Tn޼ɗ_~Ivv6o����~�!aaa�nݚ����e�222�ҥ�M�.]����HLL�<�L�]���������������*����Taaa�:u�F���ݻY�x�UE�իW���L�6m'!!���ڵkGbb"QQQ�L&���du\RM�6eÆ
���3v�X�m�f���	��f�����@�V�lƘ��}DDDDDDDDDDDD��2o����8���;�z�-�q*W����/ӦM��w�֭̚5\\\x�ᇙ1c���e|e0y�d���pss#00���4�~���'<<>��S<<<,�>�MtɭY�fV}DDDDDDDDDDDD�m}DDD*�'Nо}{�v___��'O�   ��\G�)��l5o���9�$;;ۦ_xx8���\�r����[�]�|�5j،3����������������I�)"""�{s�������ɱ:vrr*�On׮]+l��V�re��b43�lذ��7o�h�"�ϟo3��ٶ؛�-��EDDDDDDDDDDD��"""RA4i҄_��������gi߿�M_OOON�8�ƍ���,�0���^�^�z|��'�ر���d}�Q�֭˹s�HMM�nݺV�RSS-}DDDDDDDDDDDD�e�1d�/����ٳg���DVVd���6}{��
�[o�EJJ
w���ҥK|���&L�`�k�<b�
�����?���h��}K�{���}DDDDDDDDDDDD��)"""D`` �|�
Ǐg̘1��3f۷o�Y��R�
�&M�׮]�˗/3d�<==ٸq�U�VC��PQ���0u�T��yv�����i۶-]�v%66���$|}}��$%%н{�R�CDDDDDDDDDDDDJ�*�����GL&S�IU�Ve���P�V-*U����3g�����ҷz�ꄄ�`4������z�����˭�����4n�233�����׿���zJ���qww'..Φ\\իW�T����*����T u��a���VmgϞ�^�zV����k���k��ٯ_?���g�^��(���5�0��N��ԩS-�ժU�h4�l�2N�>M�ƍ8}�4�����_��ݽPq�������������c�r���HѣG�ׯ'--���l�;�;�@���a�=z4
6$,,������͖E""""""""""""r�Qr���H1`��̙C�>}���cذa�L&j׮���a٨Z�*3f� **��g�r��Y����1cU�Tqtx""""""""""""Rm�#""RAL�<///6o�̱c����䡇�s�Ό7�
8:�2ӡC����;w./��2����JDDDDDDDDDDDD
C�)"""���3F�����P�A�v��L�����������������H�Qr������������������%�����������������H����DDD$����ADJ 22�aÆ9:�
E�)"""�h���ADDDDDDDDDDDD�\)9EDD��F�F���)wJN);w��O>qt"R
�u��+����0DDDDDDDDDDD*gG ""� 8y�$����CDJ(22���G�!""""""""""R��r���H9���pt"R����ADDDDDDDDDD��Q�)3JN�2�m}DDD�ÇӢE�q���iٲ%-Z��_�~x{{ی9r�111>|����l�R�5
&��d��!""�={���������d��]dd��C�\����ԩ���)7JNy��������Z%�\�t���x����ߘ={�͸�K���ߖg����?�p�B֭[GNN#F���LJv��9:4�r�M����h$,,��a��������%����<�bcc�<רQ#����������IHHࡇ���Z��*�ܸq���~��C����	��!C�6m���T�Z�L������a4������ADDDDDD��9�EDDDʋ�`�lws?�'--��Z�8p����yhh(.\`�ȑ��Q�Fq��BCC������������ȃI�SDDD*��/��'��s�NnܸA���y��:u*`]�$##�e˖�u�V���z����q�����
`�c���9:u�Ć
����m۶��]�v���GTT�M�������$%%��7oR�^=z��Epp0���y������ŋ���t���գO�>�?��ի�ĺx�b�x�
|||X�h���]���;ҠAK��
b0X�v-�>�,5j�(�}�#���tt"//��2�[DDDDDD��(9EDD���~�:�ƍ�ԩS����Kbʽ233�0a��ɖ��g�BRR.�ڦ'/;v��ٙ]�vli߹s'NNN���ٌ����Y�l�U۹s�X�v-iii̜9��Z׮]����ѣV����ILL$$$Ē�b6�|���-�([�l!##�.]���ߥK����g�)��EDD�����D8F����0G�!""""""�0��GDD���ԩS4jԈ��v����ŋ�*���^����dڴiCxx8			DDDЮ];-�N�Zb2���<<<hٲ%��ҥK���-������ԩS�f�5k�0e����ٵk_|�qqqy^�ʕ+9z�(�7�\߲e�hԨG�a���6c~�a���-	/����j�ʦ����GDD�AFNN�^z�U/���跼��������)9EDDā��+��m۶��[o��S�re|}}�6m�ͼ[�n`֬Y��������?̌3���.t��:u"''Dz�Ϯ]����ɳ,��;����y��Gټy3�1�>p�:J^�]_۶m-�a���;�1AAA�-�>@ӦMm�6k�̪��������������m�#""RA�8q����[������=y�$v�:r�H����#44�]�v1p�@K���-}�ne�I�&q��!�s999y�s��iڶmk�n��3g�،1'��]�|�5j��5���������������H�Pr������F�\%%w��r'x899�'��*��ֶm[���سg�o�&!!�R�Ş>��C�ѤIz��I���iݺ5Ç/������ܽUS�{��l[��f�~������������H�Qr���HѤI~��W���oU�d���6}===9q�7n��ӳD뺺������ݻٰa���t�Ё*U���g�BBB�]�6G�����ʢR%�A5j����ٷo�ՖA���\SA�֭˹s�HMM�nݺV�RSS-}DDD�b�|�2���dff����ٳg�S�N��oNr-(��ƕD^	����xxxТE��ĉ�\爘��vQ�����Z��v�?*ۏ����}�o߾̞=���$���8x� �g϶�ۻwo�z�-RRR�s��.]��?�`00a�K_�/��[�cN�	

�J���ݻ���$%%�iӦY������ի�f��deeq��u�޽�5[�h��ҽ�m�>"""R񄇇���	@ff&k֬qpDOvv6W�^%!!�7�|��={�����DDDDDDD�N�)"""D`` ͚5��~c̘1������~�ͦ�1ch֬�o�} IDAT ((�N�:ѿV�ZE�*U�4i�����ɐ!C8p�ݵ��(/^�:�ǜd2}�t�t�BPP?����|JJ��q�G���ˋӧO3v�X���;v,gΜ��ˋ�c��sw��ڵ+III6��m�Ir������x�笎�w999��a^�����ܹs�_��?��O$&&2k�,��V�r_k^/{cDDDDDDD�l)9EDD�>b2�0�Lv�U�Z�ŋ@�Z��T�>>>̜9����Y���			�h4��鉋���Ջ�˗[Uy�7hܸ1...�O"��#�XJ�רQ�V�Z�y
o��&����jժ���ҺukfϞ���X�n��q5j� 44��ÇӠA\\\hР�F�b���xxx�s���߿?������ٜ����z��
4"""R�$%%��?P�^=>��3�ԩ��d⧟~rthJ�ʕy衇x�gX�j+W�tpT"""""""�G���
�N�:L�>�o���={�N����W��U_^{�56n�HBB�}�s�����۪_�~����IHH`˖-�m����111�L&�mۆ���?B��[�F
f͚E\\�v�bŊ��ۗ���c2���㏹s�e�{լY�ɓ'MBB��Ѽ���6�)y%�T�V
��Ⱦ}�8}��������۷��� �����"""�'N0~�x���pss��ӓ��@����wrr*��dbذaԯ_WWW�7oΔ)S�v�Z�q�X��Q�FQ�Z5F�i՞_l'N��C�T�VͦR\qbغu+������R�vm
�޽{�����ɉ�
���e�oVV
6��7+�s)s5��g�i\JJ
�G��q�Ƹ��Ҹqcƌ�/�������{%%%ѴiS:t���)��=���x"""""""%����T=z�`0�~�z�������رc���;�$��]ff&�(�D�ѣGӰaC���,maaaxzzT�뉈�������㏳d�~��7�0���t�Ё���"�Y�jU��+V������x�"�o���ѣ������у�ׯ��q��V�^
�����W�^mI|��رcٻw/T�V�D���JpO>�$			ܾ}��W�E׮]�������LJ�={r��y6m�d�Ott4�ϟ�gϞ���e�\~��GZ�lY�1�6m��ח�+Wr��n߾͙3gX�b�۷��o��S�|����={r��%>���ׯ_�-%e�DDDDDDDJN� ��9s�ӧ~~~6��D�ڵ-�����͛g�cR~�WժU�1cQQQ�={��g�Ō3�R�J��'""�Gq��e�Jzz:�&M�_~�ƍ�޽�q�Ƒ����h������c�5k��ҥK-_;v�_|�;w�0a��;Fff&;v��ۛ�����&�o���s��ѪU+p�ꇏ�gϞ�T��/����IMMe޼y%��^`�ĉ?~���Lv�܉��77o��_��W���f[�l��󡡡�7(�s�Kvv6/^d�����3���J�ƞ;w��#Gr��

DRR�n�"))�A�q��u�ιs�,cJr��v��O<�������ڵk��-M��DDDDDDD4JN� &O��k��F�V��R�
���xzz2d����hܸ��C,�.P�R%Z�h�o�Q&kt�Ё��`�Ν�ܹsy���-��DDD�(���.\��ԩS�?>���T�R�,Y«��Jjj*�~�i���ٳ��ӧ��ob4-�-Zĭ[�1b��9͚5�r��t�ޝ5k��j�*�9�/_���>k�n>6��˴i�hӦ
������1c���iڴ)�+W�k׮,Z�����|cy�g�S��7o�J※?'mڴ�ڵk3t�P���%�K...ԯ_�aÆq��i�L��/��o�f,�ڵk��ݛ
6кuk\]]iݺ56l�w��\�r��ZƔ�>l޼�'�|�7n�O<�g��l1UX���yP)9EDD��pvv�h4�j�*v��Ibb"7nd�ԩ4h���ڇ~Ȟ={��ۻ��1�̛7�y��1jԨ2[GDD�¼��ĉ�7W򈉉�s���TF�EVV���g���V��[�ی5���p��1��+W��q�F����:������DTTW�\�3��={ڴ'��^zɦ�s��\�x1�8���x�����bŊV�V�^��۷	

�T|+�璗��~��~��B�ߺu+p7i���WJ������&����>�_����s��-V�Z��gY(�� """"""� Pr���������������݊�[��n������s��q���Y�f
...V�9@۶mך5k�u��z������\ӦM�ٳ'�n�b�ڵy�ѤI����bּys�6www�ܹS�xs�������[�@ɟK�-��ܹÕ+W���gԨQlݺ�.]����R`��5����7����_�>�9���Lrrr�>���m1��U\��y�)9EDDDDDDDHKK+Q��K�A�5��믩]��M�k׮P�z�B�e޲g۶mv��o�n��s�HIc1suu-�{=��t�ڕ�����8L&III�����[�������L�Z��ҥaaa�����HKKcʔ)�MOO�f͚v�רQ��ׯ[�Jr�k֬���999�?����"�QZJ�9�������<h��""""""""T�V
��W��[y�^e�C��ꫯ�����իy��G�]Ü�P���d����B�MLL�СC��[�XJ[��)���@ɞKa����䟂��ORSSힿz��U�~]���c�֯_������6�D���~"""""""tJN)G�>�^zU�Wxx���)3����ڵ�H�n޼�ȑ#����w�!   Ͼ��p���
5��+x��g�M

��_E���
>�Z�j��W_q��M"""�^�:�F���W��RT�n�*����%&&�=���`��ޯ�s�[�n�c�=����Y����T���9��������QUrt"""�nݺ��0D�xyy9:�2��O�w�^�{�=���K�Jֿ2���`Ĉ��/!::���op��´i��]�w���۷�e˖ѵkW�sIII<��c4mڔ�Ǐs��V�^
�ĉ�788�իW�j�*�{�=\\\
�ޢ�R�V�J`` �~�)|�/^dܸq6�����ʕ+h۶m�}����?��|@�~�pv��3O���̝;�'�x��^���W^�o��o�a����ر''��\f���s��S�!88��5kϓO>Ibb"7o�d۶m���<��T�T�Y�fY�DEE�駟�㏳r��^z�%���

e�ԩ�?������;F�	��1c����̙3����s�δoߞ3gΰu��B]oQb)+�Ǐ�>l���=��deeq��Q�{�=&O��M)�K/�D�5ضmC�!99���L���2d۷o����*��4�˗/�~���ܹ�/�����ZZ��9�������<H�rrrr����Mxx8�����3k>���h4`y_��ED�GNNN���a4��+::��C�r��
�s}��g���K�c���?�P`���!$$�q��a���;w�ᆪJ�*�1���BCC�$�t�R^x�F��ڵk,�2y�꣰��4_^��שS'y��8p��y��\�]�0ƍǒ%K
�ƍ6l��m����X�v-��j/���i�&�~�ij֬Irr2�5ʷa���|�y`��~~��I�SDDD�QNN�^z�U�_���+"�G2`�����رciҤ	�+W�f͚��ۗ���?����E^c�ر�����Z�j���J˖-y��wٶmU�T��իDEEQ�n]Ku���Fjժ��_�իWK-��f��b�j�YQ�KA���h֬#G�d���6�)�8p {��%((OOO*U����'�=�?���Mb
��}~ꩧ�8q"���n�TJ�9�������<H*�EDDDDDDD>>>,[��P}�\�R�5�w�N����<_�V�<�S�����&����+iKQ���|~��y����.�s)h͒���GY�jU��+���`�,XP��Y+����DDDDDDD�.UN�2��)"""��ÇiѢ�����lْ-ZЯ_?���m�9r���>LJJ
[�l�`0`2��'�<DDD�g����>|�C�yP)9EDD����k�Lr��%��㉏���~c���6�.]ʷ�~[��ڏ?��…Y�n999�1ڵk���DDDDDDDDDDDD8��GDD���F����@vv�U{vv6			<��C6cL&�C��ܸq���~��C����I�F�2dӦM�ƍ�KDDDDDDDDDDD�A������`�l�s?�'--��Z�8p���t:u����ʅ9r��mԨQ\�p���PF&"""""""""""�`Rr���Hr��E�O�N�>}�ܹ3AAA����Mj���`��йsg�g�}Fff��Ͻc��aN>����jߵk~~~61��||������֭O<��g϶�d���μy�xꩧ��駟f���\�v��{��O�>L�0�2~�ڵt�ؑ
X�7l����ڵkIOO������������HYPr���Hq��uƍGtt4iiiܾ}����N�j�733�	&�b�
Μ9��۷9{�,!!!����٦'/;v���ْ�b�s�N����&����_$11��7o���ʗ_~���-�]����?Ϛ5k8�<YYY�;w���pƍGFF�͜���'==ݒ��e�222�ҥ�M�.]����ALLL�c��Sr���HƩS�hԨ!!!�޽�ŋ[U1[�z5��ɴiӆ��p����]�v$&&��d��1�LV��lْÇs��%�n��_~�ooo�ԩS�6mʆ
���g�رl۶�r~�ʕ=z�ƍ[�oٲe4jԈ#G��|�r�9~�a���9s&�{��V�Z��5��#""""""""""""e���y���F'�v��dI�x뭷x����eڴi���+V��n�
��Y�hԨp7�cƌ<���h\�;u�Drr2�v�b��ڵ���˖?�5y�d���$$$���4�y{�׶m[�N��ĉ�����3((WWW���Ç���0�5k�̪���ȃ,22�ʕ+;:�Bdd$Æ
st"""""""���
�ĉ�o�ު���צ�ɓ'�;ב#G
�������V�)�h޼��k��N�>
�MH���zϜ9c3�9������ԨQæ����GDD�A��W_��W_9:y@(9EDDāro�c�����^999V�NNN���ڵk�
��m����ƞ={�}�6			T�\�nRL~�t����roKn�VM�w^gg۝�mEY[DD䏨��DDDDDDDDDJ��SDDD*�&M��믿��~��%�������ɉ'ظq#���%Z���___v��͆
HOO�C�T�R�D��֨Q#�?ξ}���ڷo@���nݺ�;w���T�֭ku.55��GDD�A6|�pG� ��֭��V�"""""""%�H�:y�$			�CD��������˯����ٳy��wiٲ%�b���6}{������y뭷�<y2�<�W�^e��լZ�
����E����Drrr8y�$^^^v���c��݄���ɳ�ի˗/g֬Y���<��$''[��{���ѢEΝ;lj'l�P��"�hѢ�c�H"##6l��#y0DFFZUy)9EJ�Ν;	tt"�`4	st����@����?Θ1c��;f��o�΁

�:W�J&M�d9�]�6�/_fȐ!xzz�q�F����(/^�:.M�G�����ɓ�;�ꜗ��M�=]�v%66���$�m������%�����х��a4��A�'gG L999z饗^�~=�(1�L�L&��V���ŋ	�V�ZT�T	fΜ	��~Ǭz�ꄄ�`4������Ku�{�����4n�233��#�P�NjԨA�V�J�-jԨAhh(Ç�A����РAF��������(p�������N\\�͹��8�W�N߾}K=vɛ*����T u��a���VmgϞ�^�zV����k���k��ٯ_?���gՖ;A��ɉ����s�-�8���5k2y�d&O��o�y�Y�Z5�F#˖-����4n��ӧO�o�>^|�E����[DDDDDDDDDDDDJ��S�L�<y���G�!"���W�l�GңG222�2e
����z��8q�������;8���ѣٴiaaa�$���0<==m�8[.\`��ԪU�o���S�N1x�`4h@ttt��g0���Ç[Uz+��Z�*>>><���t�ҥX�4�����`Ϟ=���3|��r[[DDDDDDD�4)9E��Ν;������h$,,��a������3gs�̱:W�vmƏ���/U�Veƌ���<��DEE��'�P�JG'""r�KJJ�u��V�mڴ)��_�ubcc�V\7n�`������g�…����q���d�…�[����F�����ڵ+��EDDDDDDDJ��S�\���8:��)��p&O�����7o�رcdff��CѹsgƍG�
�}�C�3w�\^~�e|}}���HŐWr�����N����-��srr�r�
.$**�%K�99�4�*ȍ7x��:t(���2�iӦIժU�-�Ҡ��
����ш�htt(��H���g���,^��r�`�,XPn�CJ���u���W^!**��~���!�+44�.0r�HKۨQ�X�f
���;0:��svt"""""""RqƌcՖ����``�֭V�bbb0���K�>}�0a�e>sr̽I2��ddd�`��ܹ3��>#33�б;;�5H���HOO�gϞ<���l��'O��`00hРR�+;;�E�1d�:w�L�=����W_}e�/==��k�ұcG��x
6�`0�v�Z���}�""""""""�%���8ȹs������pw���Dxx8M�6�d2�|�r|||0�Llܸ�C����a���~ki�|�2gΜ��ՕnݺY��ϟOzzz��$���d„	�X��3g�p��mΞ=KHH���mK�r�
~�!�
�F��1�S�NY��c�z��Q*q-\���K�r��In߾MFF�_��aaa�~[�l!##�.]�جץK222,�[DDDDDDD��Pr�H._����NNN���q���r]���	''�rWZv���/�@�V�pww��͍&M�0t�P6mڔ�8G�]ޖ,YB�V��m=�-���؂�DDDD��KJJ�M�6v�===y�Ǹs���� ++��ggg���y��X???���-k<������3s�L����2Ȝ0�z�j���iӦ
���$$$A�v�HLL$**��������ƍ	`���>������[q���)ݻw/��6l���i����ر�)S��n�:K���x����f�#"""""""RQTrt"����pK���L֬Y��/����_.\`̘1l޼��ܩS�8u�_~�%`͚5xxx8 �ǽ���������@dd$F���a���sBI�֭���ۗ�b2��ҥ			����׿������ܹ�?��ϖ��{��Z#((WW�"�e�.h֬Y4j����2c�Ltt4�.�\)))l۶�~��P�fM��ʕ+ٵk]�t!==����S�Z5|}}K%.www�]�FXXG��W�^:��C�Z�y��a�n��ܚ5kf�GDDDDDDD��P��<�?5��s�Y��rrr���)�5ϟ?O�Νټy3�5b�ܹ���Odddp��-RRRx��w�Q�������U�1�]�^��H�xyy1l�0G�!"%4l�0:u���0DDJ�������|��`�o���wߵ������zHLLnnnS�re�8III8;;�l�cN�(��'O`U
Ŝ�q�����UNL&NM� IDAT���|����2u�T֯_o��������ڵ�;w�йsg*U�s=E����;nnn�ٳ�?��#Fb�4cf��Y�F
���m�]�SDDDDDDD��T9EĎ��$~���ի�g�}���b2��駟�>1(w��o��ѣ��ٓ����Z�jY�oѢӦMc��t�ޝ��X-Z�ĉ�H��֭ݺust""""%֠Aڶmˁ�|�2۷o�S�NԮ]���۳s�N222HNN�]�vԮ]�j|Q��&K_�v��9�U�F�>}�fȐ!,[��R��N�:<��3������D\\pwK�Ҋ�_�~����}�v���k����g�}��իy��y�g,�g:;�~��ܦ-6EDDDDDD��Q�q�'N0~�x���pss��ӓ��@����wrr*��dbذaԯ_WWW�7oΔ)S���+5jժUc�ȑV��v��	:t�@�j�8p`�c�������quu�v��4��{����?����
6̳JIVV
6��7+�s���c���ԯ_�
6�$�ܫM�6̙3�%K���޼y�?��=zP�n]*U�D�z�xꩧؾ}��1=���	�{���O��-�{#����뽕����/Կaz���
t�?)""��d2�x�b����&�����kU��&Zdgg�b�
�_�nI��֭7o��/��ڵk6[����'7n���JLL,�\իW --ͪ��g���Օu�ֱk�.����ڵk�����A@@˖-c�ʕ�=���4�ϟo�S�n]RSSm�3�����������T��"��O?m��s��Ά
���/0`@��Z����+x���s玥��ѣ�������G�jլ�ܹs�իW�o���s�Y>�6{�l\\\�a�ر�D�{�.N,�֭�h4���
�իW���"&&�;vбcG�q���гgObccٴi�
������ٳ'>>>@џ��^M�0�:u��y_�ƌC�֭���{�(כ��N�^�lW.]�Dtt4�7o&**���~��Z��Uq�,��$���KY���h"""����SD�,))	���b�^O<�s����/��$�t�ڕ���f�z��U�8��������ɓxyyлwo�/_�[o���ɓy�G�z�*�W�fժU-Z����ٜ:u�?���*f���4h�ׯ'''��m�Z%ߗ4�A�q��i�L�€x�G����\��e�-Zp��9N�8a��r��	K��D�)��/_f�С���3i�$����ӟ�ľ}�X�l!!!�F:d�$�/�<{�l�N�
�ҥK-�ǎ��_�Ν;L�0���4nܘ={�0v�X~��G��}fΜi5�7�|ùs�hժ��N�:�����?�̖-[��/�������"==�D����L�8��^{�F����Ș1c8r���׿����e�����Ʋl�2��)��Ǎ��ܹ���z*�8������&E��9s�w�^Z�n�_|���/����۷�I�&�{�n�{�<�S�=���Y��k�vr�[�$��tq��]Sy)i��aÆ9:)������!�����$�ԭ[�RQ�E�4h���M��?��S�NѲe�b��W�vm._�̐!C���d�ƍ�3��۷s������W�R�I�&ٝ���r�\�2���6��=������>%�k���̚5�9s�X*J����Z��ڵ+���$%%Y���Ϥ��DDDDDDDD�7��G�/��…L�:�������M�*U�gɒ%��ꫤ���駟�;Ϟ={�>}:o��&F��rnѢEܺu�#F��ӬY3*W�L���-��[�j�͜˗/�t����|>/ӦM�M�6xxxиq��w+�|���4mڔʕ+ӵkW�'���g��N�:l޼�s��Y��p��6m�v�ږ}֋�\̟�kժU��VQ�7,,��+WҵkW�V�����:ub�ʕ8p ϵ�=���Y��[I����^�ٮ��J�}-""""��;姟~�:έ_�~�m��9��[����4n�233��[񘓝===qqq��Ã^�z�|��BU�T���קO�>,Y��v����`�=J5�!C�0}�tZ�l����e+�1c���;�X����www���l⋋��z����۷����8��+E!RL���Z�A�>6�֭���={��
�̓��L�֭�رc�{����Ү];�?N���ٴi��v;:t`�޽����R1/W�\��ӓ��L�?n)�w�0��WWWΞ=K�ڵ�ƚ�����b����b�/99�&�###�jժ���BVV��q�{>i�$>��#�̙�?��K����������|��'@񞋋����ܹsg����z�r��*U�����e���k�{Vř�$Ϸ��]SQ�Nr�d/V{m%y_���0'�>��
�������V�;����e˖�hт~�����m3�ȑ#���p��aRRRزeK��d����d�{w������Dn߾��h�$�ۯ��_�b+my}�;7��T.�FDD{����ߟ�Ç;4���G��JD������$��>�����1i�$�6mjٲ�-ZIJe�ꫯ,I�O�f���⋖�R1��L��G"99��Ͽ��K��Ə�����f͚5V�)p���m۶-t\k֬�֭[����*1�ٳ'۷og�ڵ���Kv�hҤ�M[qb1k޼�M���;p7Y� /��}�!!!V�)����=�^�Jzz:5k�,0���z�=�O?�Dbb"			�۷�����gU�9K�|s+�{��k*�Ĉ�x_�c�������Z%2\�t���x����ߘ={�͸�K���ߖg�6�M��޽{-�/^,�5��/���?�p�B֭[GNN#F�������EDD-##�7n�d����fy=z4�6m",,�ɓ'w<==m����"���V�~K�.%""�5j��_�T1�v�p��ra�?m�m۶|+M,_�<��s"EIc1suu-�{=��t�ڕ��x����޽;&����$���x���-}��\���1�L���ЩS�B���ʢR%����z׭[�ԩS9z�h�Ɓ�gU�9K�|s+�{#�k*%�]'666�s�5"!!���l��H���$$$��Cq�����n2�y���?��:���Ō3�4{��<Ur��_uG'�ܸq���~��C�Zֆ´iӈ���jժ�ODD$�{+ ���0p�@FU�Veƌ��꫖D���(>���T����DDDDDDDD���{p���y�W�������^��C��ꫯ�����իy��G�]Ü8P���d����B�MLL�СC��[�XJ�/�@HH`�j
﹘��/�v?��3u��-�O����3r�H�=J˖-y��Y�l_�5?��s��Y�Ϸ$�
G�ȱ�OC��o)������q��A�����^褴�b���`0���\�>)���\�p��#GZ�F�Ņ,�
��4h�777�v��G}dS��:t�@pp0s��e�ܹ������::,�bQr�8���7�v�*Ҹ�7o2r�H222x�wȳ�y{����Bͽb�
�n���nN�0�/���RچN�Z��ꫯ�y�&T�^�Q�FY�+�s1�����?'==�������IKK˷2Ma���{���:�̙3;v,VUL����t��|��}o�*r��ŋ�>}:}��s��c7�%##�@�Ν8p �}�����>���7�9�$>>ު������ƙ��μy�xꩧ��駟f���v��.]��̙3y�'�ҥӦM###æ_��cǎ�c{�q��y�����?�F�Itt������0a�z���=w�\K<y�/{k���9r���`�u��O<��ٳ�q��[{��`0����|@�=�ӧ�- 55��S�ҭ[7z���?��O�_�n5ga���׽v�Z:v�H�
,�
6�`0�v��B��BDD�<EGG��l��/G3�̛7�y����7��D�)�O>�$p7����{EDD���Ā���x�
8`� ?�{�`ٲe6璒�prr�Y�f���{������E�&0�_1�)��Ը��B�<olJM�u{($�nk�̘O(b�鄅����)y���D�1R@p����Y����������s�7�\����;wظq#����}�
		`Æ
e�Q�XGGG����v�K�,��ի6�b��\�g�}�~������СCK��lt���.]���-ӧO��JMMJ^~ٲe��幹[�1+r}��9�g*��Q<α?.nܸ��q㈋�#;;�[�nq��YfϞmѷ���I�&�n�:.^�ȭ[��t����L�2��I[�<����IG���Ʀ����\Ǝ��͛�|�2�o�&33�M�61n�8�׉��ƌ�Ν;�~�:|��焆����.++���`>��3�]���۷IMMe޼y�ڵ���>��7�$99���\S�111����k����'����͛7�~�:۶m3{ݩK�,!66���<����裏صk��_�����͛�����g��t�R�~�}��/�������b~___��򈏏�����M�)b!!!ԭ[���D^|�E�͸}��1q�DF�I�53�s�N��}ڷo���Xy�뿨Y�&QQQ̞=�˗/����޽{M�>F�
@||</^��ǧ�*Fݺu�S�N\�x�={���x�ˣ2a��ލI�\�*v]"""hذ!�w�]�v�������q��m���III�����W�^eΜ9t��ᡏ������t��e�ܹ�w�}ǨQ��n����/�t̊\_cb��۹}����@E�Au�8������…���ɑ#G���(�۽7n���Ӵk׎M�6q��1bcc�ر#III�ܹ���d�>���f�\\\x��9w���ի|��������~��s�_����4<<<Lq�Y�wwwRSSY�v���
��ȠI�&�[��tL����ǃb7Z�nW�^�M�6l߾���?���rg�7o`֬Y$&&r��a>��C<X�9�s��6m���ILLd̘1�۷��<RRRؼy3�fҤI���cggǶm�HLL4����������Ӻuk���m�+񈈈���������o��S�*<<<شi���|��Wt��GGG���CDD,_���;��Y�p!'O��N�:��ؔ�cԲeKV�Z���
�/�q��Ԯ]�?��|��wt�֍Y�f�nN�<�L����ts�$��Qi߾=�>�,7n����i���*r]�5kƾ}�hٲ%?��#���*-Z����'''��?0s�L�r$,��c�9s&p��A�ƍ�Q��ڵcÆ
̝;��-[��_?�1+r};w�������f͚@ůAu�8�nM��VJ[��h�1Q!44����coo���w�����saaaxyyaggG��͙?>@�Kڔ�K�.���>|����_GJ��C��
/{��5�ݿ?�gϦm۶�c��_�Z��СC̘1OOO���

%99�O>����|��״iӆݻw��w�y����<�h�̙xzzR�fM������.��ǬY�hٲ%����ٳgӴiSj֬i�u��u�~�}:w�p/٦8c)cy2(9E�����8q�1c�ФI���[�.���#>>�����2��?�{�1cƐ������'�ի���O?�4�-b߾}ԪU�k׮�s�N4h`�r� ��z���駟r�ڵJ��Q3~���)F�.F�ڵ�ԩSDDD��/��憽�=�j���ˋ�'r���JKL?~<�֭�cǎԬY����?��.\�ܹsX�z�#���7**�_|�ڵkS�F
~��ߙ�U�T�s쏃���ЩS'�vooo���������%�4��Vea�(U49�h{q��q_�x��v���^]I}+�q�V�Zݷ�իW5j�F�⭷�b˖-���PXXX�9�s�Z�haz���X.�����''��vtt�د<�OYYY8;;[�cl3��	

*5�_?��O�lڴ���"""""""VW��ȓ��ˋ5k֔�ﯿ�Z�9z��IϞ=K�^�^=����5����E<e�q��X�3^i���رc;v��.�u)�f͚�?���Ǘ{ߊ��FrIF�i�P��*2&��6k֌ݻw����נ�篢c�o����<��/c��R�r1`y�ml,�9{�5/O%�:P�fM�=ʭ[�8v옩�Iy��ha��x�5jT�?QJ:?%Y�d	gΜ�I�&<��s�hт�m�2dȐJ��~�&�����e����U������ry~����4���Q����Mll��Cy���yR)9EDD�1ѤI~�����[��%�~��E_777Ο?Ϯ]�pss{�y��ȑ#l߾���:w�\j�'www~��'N�8a��ω'L�=���4���|}}M�)))sQO=�?��3����iӦ�~G� 22WWWS��۷o�9i�<��qP�ߧ
������iР��6�RA��EDDDDDDDDDD�M�)"""��~����?�x�b-Z��O?͙3gX�x�E����k��̙3iٲ%׮]c�ƍlذ��T666���^�7:�}�Y�9BTT�Y�Eq�{�f�ڵ����h�"ڴi��ӧMq�0��/�j�*���X�p!�۷�ܹs����>O�u�ޝ���.]JXX���c������ҤI>����G��o߾����p�BS{vv6���/�*�9x��U�Vdffr��y�$��TZbIDD�ʬ
&"ec0����v"""""""V����DPP��9?���G��o�ѣG��~N�<Ɉ#̶ժU��S���������E@@nnn�ڵ�b<c2�իW͞�$88��{����Θ1c̶yzz���1�����s��1a�S�/�`JdxX���
{����ɓ���Kfۊ.Cֻwo���7o��ͳ��ٳ�����|��<��Խ{wHII�X��X�qK��-����`0X;�'BPP��C�:[k """����Lrrr�������ߟz��Q�F
���L�=L}�ԩCdd$�777���pqq1U�(Z�b���xxx`ggGAAA�s�lْ������L�֭K=ggg���2d�5��ΎF�1|�p֮]����������ꊃ����#44��'�4h@TT~~~8;;cooO�֭y�w�߿��ߌ3������ڶm��ŋMI3[�l�v��s�}z�prr���<x�:u�Я_��_DDDDDDDDDDD�̦�����A�oǦM�

�kU���HI��$4��.��qT����.]b������s��J_��V�^͚5kرcddd0h� &N�ȸq�a�_�D����ƬRJ��"�h��"""""""$�r����c�W�^����������ݻw���Y�`�:u�r�"�Ӹqc�.��Ѹ��Y,$""�8:w�\��;66�iӦ1m�4bcc�0*���a�DDD�l�����Lxx8���f�\]]M�ψX���#�����_g�ȑ�ܹ��˗S�V-+G'""�p�x�
J]��Zs?~��+W�e�
:t(^^^t�ر��)N�)"""���3g�����ݻ���)((੧��[�n�7�F�Y;D�Ν;�ҥK�<y2���V�JDD��%$$T�����;w.��������9sغu+���U���������%�H�غu��C�jl�֭<��aT{�����C)����<�|||�R!D�'**�+W�0l�0S����ټy3QQQ���X1:%�H2d��C���˗Y�j������ҬY3F�E��������޽{��_hذ!}��a„	ԩS��Ϙdòe�8y�$5k֤o߾L�2�TU��ݻDDDϥK�����E�8�A���U�qrr��qDDӧO��ˋիW���SR������srr����g�1��׸qc|||���a�ȑ8;;��B��������T"%��#�oL������HYeee�իW�|"5 IDATMm���̛7�;w�0`�rss;v,iii�~���lڴ���$"##qrr2{�ĉ\�~��7o�m�6�޽Khh(+W�d������n��ԩS�:u�7n�-[FNNN��[,�q��/� //___�m���$%%��/�\��DDDDDDDD*��S�:t�˗/�v"��ѣ������+Z�nW�^�M�6���[4lؐw�}�O>����HS����IKK��ÃE�ѺukN�>�ܹsIMMe�ڵK�4mڔ�����SO�f�"##ٷo�)9e����X�nݺE\\���lٲ��� �*)%-wԼys"##qpp���.m���DZ�nm1��-11Q�)"""""""bUJN�G*==��[�2x�`k�""��֭[����vUb�֭�AD��]#"�eE���_{II��СC̘1OOOBCCM	$F���3mk߾=:t`��ټ���ݻ�"9e�̙�1������$;;۴��ɉ��\���IKK�w��X�G�Q��(�q��ܹs����5kf�GDDDDDDD�Z��"U"66��!�H5V��C��v""""��ŋhժ�}�edd�R��ԩ��8E�h��������w�ڦL�‚8z�(G��>`̘1jժU���� �U��.IVV���یm�>""""""""֢��*`00�CDDD�T�+��o��G����/�lR\�J}%����G׮]ٿ?�~�)�~�-�V�b�ƍL�<�L��V5����4gAA���9n㾶��یm{^EDDDDDDD��SDDD���C�X�|����JУG^{�5k�!"���SO���?���J�6mJ�����O?�ĉ'�ҥ���ĉ���Uh~��������|��W�[��e˖�)9�8
�q�u�� 55բ_Y��$
4 33��ׯӠA�mׯ_7��&˯ՈT�+W����C߾}�p�>>>��������c�^�î�m��OϞ=;v,���U�&xll,ӦMcڴiZ�I�HOOg�֭�CD�֭[9v옵����޽;K�.%33��7o�d�|||��l�׻wo���8y�$�o���ɓ,^���={�{������L^^-[����(��Jzz��tuu`ǎ��瓖�Fxxx������K�?�b\c[E��L��"V���@۶m͞�k׮J��7HHH��2���|��L�2��+W���V��Js��qV�\ɖ-[(,,d�Сxyyѱc�*�_�I��/��[PP��C�M{�Wسg'O�䥗^2�6~�x����`���Kzz:cƌ1����i�V������n�@���mz���JVV����k׮R��ݻ7۷o�������ע_Y�����w�NBB)))fq¿�cW$YGDDDDDDD�2�r�XUi�)��-99�,�#!!����믉����ߟ�w����cUf\����ܹs	���
www�3g���U������T/��?U�
���������Ӻuk�y��
����DEE1d�5j����5b���]��r���y�x��qpp����-Z0z�h,X`�7}�t<<<�������cN�:���@�֭������̝;���]��/��NNN<x�b܃R�N���W��!"""""""R�T9E�\�eu"""���0=_�b+V���B+���
�����^c�Ν|��w�龢���r�
Æ
3�
>�͛7EHH���'���;aaa�W�n]fΜ�̙3�ۯ���%������������+����̚5�Y�f=�Y����k׮��``͚5ddd���@FF'N�`�ĉ899�w\�GM�S�Z���a���fmIII����g��v|||������������äI�L��c�&�m���cŊ���ӭ[7��U�����lm�yթS����{�9
�ݻw�������cZ�a�{�.�W�&  �nݺѫW/^y�v��a�/''����y�5jdjoܸ1>>>��Đ��S�c��׹s�,ڌ�AE�}�Y���nj3HMM�����ޕEll,ӦMcڴiZ.IDDD�h���4nܘ��hS[tt4nnn�1Š���������ܣ�)R����?���`�iӦl۶���F�����6m�ҥK0�3gΐ��g��W||<_~���4qVV/^���=z��Z�l999f�RPP��I�8}����ҥKDFF����ʕ+M�'����_Y�|9:t(���|��f�v;p��z�b����ʕ+Y�~��߭[�8u��N��ƍ��_���W�羾�$%%��/�|�����o�ABBB��Uݽ{�_��}�����Ć
���|d����\��-[�PXX�СC���cǎSDDDʦ�	�e�8Vά.�?>���:#G�`�Ν,_��Z�jY9:UN+JII�]�v%>wss��w���ĉܾ}��{�bkkKbb"7o�4��g�5+WܼysY�p��E?�,���ƍ9}�4�ڵcӦM;v���X:v�HRR;w�,�x�V�ׯ�v���ߟ	&������ڵk�5&���ٳR�ھ};poy�#G�p�S�-[���%&&кuk��1����oWBB�}�_����IJJ��O?�S�Nܸq��>����{���|�ΝK`` nnn�����9s�����EDDDW�;w&$$��K��t�R&O�������T9E�ȘPҶm����׏S�N������/ǎ#;;�?���|��':t��}���}�����1b�˸\PXX���$����3h� ���4hP��:{�,���3UI�[�.����_��Ç���KNN�~�-�k׾�����ɉ��\���IKK�w��h6�qY��M�Z�׬Y3�>"R5��D��������Ã7�|�aÆq�ر*�!**�+W�0l�0S����ټy3QQQ���TyL"""O�������`�v""""""""��"U�x	�%K��d���E��h�"���x��wM~���S�fMBBB��?���_~iJN����W�^fc,�#==�������^��7np��1����ٳg���mJ1b[�l!**
___>̝;w�֭5j��'Y���L�‚8z�(G��>`̘1���YYY��%��3���H�p��U�/_ΡC���ϧE��5�ٳg�Eyyy�Y��={�����
�?��q�ƙ���&�'1Ƙ�v��u�������[�r��Yn޼IÆ
�ݻ7!!!899=p���<���ٿ?�j���_d���ԬY���bbbx�g̖lkܸ1>>>���0r��_�DDDDDDDDDDDD�:���Tk�5�C��={���,���O�.]puu�S�N:t���<N�>Mǎquu5ۿ�US
�=77��cԮ]�>}���f�Ӷ������/s��qRRR8x� poI�ʊ��Ϗݻw3o�<:t�͛7Y�j���g۶m�~666��J�ی}D�nܸ��q㈋�#;;�[�nq��YSbJQL�4�u��q��EnݺťK����dʔ)ܽ{��b�駟hР���>��7�$99���\n߾Mff&111����i�Y�fG^^YYYlڴ����o��_|�yyy���Z����K^^���ul""""""""""""R���"U.99���ڵkGrr2+V���ۛ��d��K��{�.�֭�ƍ����=zp��M>��Crss-��(777v��e��'))��cթS���l���#G���-[8|�0���t�޽R�rqq��ߟ5kְ~�z������fٲe�>ƛ��+m+z�YD�+::�.���Ndd$G�!""¬���ƍ9}�4�ڵcӦM;v���X:v�HRR;w�̫�}�-��۷9s挩�U�n�L�6o��K0ILL����|���D��믿��M��۷ϴ=11�֭[[�fl3���A��U�����SJz^���G�.]j��aLN�޽;˖-3��ݻw�㰱�������t<==x���Y�v-���̜9��-[r��56n�Ȇ
���a�����ݻ\�p�w�}��mۚm������Laa!:t�^�z������`֬Y��ߟ�-[���?`ooo��U�Vdffr��y�$���ϛ��ȣS|���ړ��MI����o����7g�^{�5��{�� ,,www�7o���4hqqq4�btqqa�ر������3gΰ{�n���{���k�lU���׿ҼysƏOLL���i��s�/+T�q)7c)]PP;v�v"O��[�b0���������U)9E��<�)
40UTiժ��B@ӦM���~Džx��M�E���Օ��,pssc׮]�=����s��IF�aֿV�ZL�:�ıJ�ykooOHH�E��Q�غu+`�����LXX���Kix{{�w�ޝ��RRR������A�
�H�1&�u��ɬ���/@zz:���%����Z����_�>�;wf���f��W�^e�ԩ�9s�b�-Mf����nݺfKeee���l�����GDDDJ6x�`k� �D<x0]�t�v"""""""V������(�}������HNN�H��ѣ111^�g�����dffRPP�[�'22��>��}��q��j׮���7�&M2�qZ�5j������F�U�qծ]��W�^�W@@5j� 66���4�4iBϞ=	6�{�x�8x� �F�2���ԩS�~��=�xE��/kcLt���:�=lllا��V2yP,E-Y��3g�ФI�{�9Z�hA۶m2dH��rpp��v���Z�Lhl+�|���ȿ���Z;y�(9E�"..��_~y�X�O�>��ӧ[��v#�x���~~~�\\\�6mӦM�o\���A���[�^�������j׮��``͚5ddd���@FF'N�`�ĉ899���D�kҤ	?���~�-�>����zR����ϟg׮]�,UG� 22WWWS���۷�Q���ѠA233�~���rdׯ_7���)�S���������������(9E����呟����wF�i�x�����ψ��f�̙DGG���f�|��XW�~���X�x1�-�駟�̙3,^�آ���?�ڵk	

e�̙�lْk׮�q�F6l؀���W��ݠ*,,$==OOχ��ȑ#��ۗ��4.\hj��Φ~��5_�V������I(�e�Z�j��� ""�[7h� ���y"Y;�Sr�H+������b4������y���M�2;w�d���ԪU˪������ >��s~��'F�}߾�G�f����<y�"ѬV�ZL�:����Օ��,pssc׮]��w�����1o�<�͛g���ٳ���>�|ݻw'!!������Ͷ��+�����X<x0��v"O�;vX;���v"O�F�Q�fM�w��{g����C�s�΄���t�R�.]��ɓ-n��H�HNN.u�0GGG"""�^�zԨQ///SuS�:u���`���
;;;\\\�ݻ7k׮5�.2}�t<<<�������±Ϙ1???qpp�m۶,^��	&�e˖���^��ɉ�Zl;x� u�ԡ_�~>�|��"R����B���z�<�ׯoQ��ҥK4l�Ь��ŅiӦ1mڴ����營��E{iI2�qvv&,,��m����+m���k��`0�f�222��� ##�'N0q�D��������<|||����Ν;g�e�7wll,G��k׮2�*Cy(��"""��ի>>>|���dggs��]~��G,X@�N��a��q��DGG�ڢ��qss�X�HDDD�<�x�
������Ǐg�ʕ̘1��ӧ�b�
N�8Q���������T��SDDD��� <<�>}����2x�`���quu5�N�[������ٹs'�.]�ҥK�ܹ����S�V-k�'"""�����j7w~~>s��%00777���	`Μ9���Wq�""""""""�����̙3�6m�[��V�Z������F@@��Ѧ%n��;w&$$��K��t�R&O��������M���1-�#�ŕ+W6l��m���\�r���(+F&"""""""Rv5��<lll���Ts���!T{�������΅���o�/����OBB�����Ӈٳg��7//�5kְg����ѰaC��?1n�8L��޽KDD���\�t	{{{Z�h���4h�Y"��qrr��qDDӧO��ˋիW��)���˗/�j�*��ͥY�f�5�T���srr����g��Q�F�>�7��LJ��F����syN��������H�Sr�<R=z� 66��a��c�����!���������0f�222Lm��97nܰ�[PP��I�8}����ҥKDFF����ʕ+���W0v�ʕ�_����֭[�:u�S�Nq��
���۲e����1K)���,����z���-55�y��q��P�_|�yyy���Zl�%))���x^~��r�$"""""""RՔ�""""""""�†
��ȠI�&���[xyyq��)�͛g�w�ƍ�>}�v��1{�lZ�h����	#))��;w���l߾�+V���í[����#<<�-[�dV%�x5��͛iV��,֭[�իWiӦ
o��
6��w��O>!22��:wbb"�[���ؖ�����v���9v옵�yh���t����a�����&(9E�C���h""����hk�!"""��*����KJܨ,���`��ٴm�ooo��׿�믛�ݳgaaa����H�ϟϠA����3%�899���Ktt4iii��ݛ��@�ۈ#ʝ���̘1�T-044�����{��9�6mj��Y�ff}D�}$"���JDDD��(9E�Daa��C�j�I�������!��C2�AD�7�…�o�ެ�S�N}����/q���T��)S��`��=�ѣG��3f��Z�j�)6c2Hy]�x�V�Z�{߬�,���-�ی}D�#}$"��'��*�����*УGbcc���T��ED~k�WD��7���Fv��5jX~|�޹����~~~t�ڕ����駟��߲j�*6n���ɓ˴,NiUS
M	��&9ٸ�����6c���EDDDDDD�q����4iBZZ�|�
���������nnn�?�]�v����]\\���ߟӧO��W_�n�:�-[V���lll(,,�ƍԩS0��b��SO���?���J�6m�5G�
�����4h�l���M}D����t�;f�0DD��ӓ.]�X;��$%��Ts�Ν�P��G=wll,G��k׮2�*Cy�h�u���9."��⋬Z����0.\H���9w�o���E����k��̙3iٲ%׮]c�ƍlذV�^
������`֬Y��ߟ�-[���?`oooӘp�����JY���dee�c�^~�e.]�Dxx�E��ݻ�ҥK	�^�z,_����X�4i�'�|R�ܭZ�"33����[$��?��G���!y\����ȣ���j�7� !!�J�h�e��Ǐ�r�J�l�Baa!C���ˋ�;Vy�"���.�x�M�GkĈ|��W�;w�	&��_x�S2���ѣٿ?'O�dĈf�jժ�ԩSMσ��	#<<�"������ؘp����v�*5�޽{�}�v�{�=�{�=�j/F���
{����ɓ���Kf�Ə߹�w�NBB)))fq¿����ٳ�E����L�DDDD-�E�E��HHH�vs���3w�\qss��ݝ���̙C~~~G)"""""�Jrrr�'�;88A`` ���888Я_?BCC-�֩S���Hnnn������B�޽Y�v�YE����͛��O?����hтѣG�`�S��ӧ��ၝ���u�ԩR�n]�e�ܹ�4h@TT~~~8;;cooO�֭y�w�߿�}�~�prr���<x�:u�Я_��Xie- IDAT+S��|||�R!D�'**�+W�0l�0S����ټy3QQQ���X1:y�ծ]�Y�f1k�,����/���0m�4�M���q����o???���8/���c��tww',,��s׮]����5k��������N�8�ĉqrr��""""""""Ձ�S�v��eV�ZEbb"���4k֌Q�F�}{
 ''�������/��BÆ
�ӧ&L�N�:�~�$����-[�ɓ'�Y�&}��eʔ)8::p��]"""����ҥK���ӢEȠA���*�899��8""��ӧ�����իKM�)��A�]��999�����3�ШQ#S�ƍ���CLL#G���ٹ|BD��ܹsf�.��#[[[�֭Kǎ�8q"����*�2y�Ɏ�5�266��G�еkW�b�DDD����g��̙3�������b9#��J�)�����"88��W���RSS�7ow��a�����2v�X���L�233ٴiIIIDFFZ|Sm�ĉ\�~��7o�m�6�޽k*E�r�J֯_o���-N�:ũS��q�F��7]�l999fI"�y�%��/���+qu___��������_.WL"b]o��			eJ��{�.���+���#))�
6���YQJi�?�ʕ+ٲe���:///:v�h��DD�7����Pݒ?�GGG�ϟ�믿�ȑ#عs'˗/�V�ZV�N�ɐ�����888p��%�ׯ_e����PXXX%�=k���v,��*�IcV�9+�X�ZU��DDDD��l�����[���W�ҦM�o�΁��@dd�����IKK��Ã��H�9š5kpww'55��k�Z�ݴiS�o�Nbb"cƌ`߾}��۷o`Ŋ9r��JAoٲ0�`���ޛ7oNbb".���.m���DZ�nm1����GD			��n|HNN&))�O?��N�:q��
>��*��lJz�|��/���|�ΝK`` nnn�����9s��Ϸvx"""RI:w�LHHK�.e�ҥL�<oook�%��شi�y�f+G$"""""�Q���ҾiW��Q�<t�3f�0}�?44�T��ȘTJ����С�g���W_e�޽�����3s�LӘAAADFF���m����Dnn.��Ѥ��ѻwo	,s�#F������G]��.ɹs�{�7�5k�̬��TLu]6�����|�M�
ƱcǬ�-**�+W�0l�0S����ټy3QQQ����)�u���`�0D�H�/&�5���׳v�Z&O�lݠ�@'���_]y��r�<�.^�@�V���/##���RT�N���)�E���...���0��L�B͚59z�(�.C�%22��7o�9~c2Hy���K��������6c����<W�^e޼y��Ӈnݺ1b�������H����cŊ���ӭ[7��U�L���(�1I͸�Yy�,:�7�|C�>}�4i�Y��۷Y�d	�z��O�>�^��4��ٳ�ѣ�?�<���͍7J=��w�z�j�֭�z��W^aǎf�_I�(''������?��?�ڵ+/��˖-#77��}SSS			�G���d���fUN�KNN111<��3fK�5n�bbb���)~�DDDDD�RRR���ѰaCV�ZE���INN�ᄈvh""""""�%��U]"��%d�bل�[\�d������;����w�f޼yt�Ё�7o�j�*���϶m��4iUS�~������)+㾶��/ƶ�=�"R�7n0n�8�������֭[�={�ٳg[�-((`ҤI�[���/r��-.]�Ddd$S�L��kXY���O4h���\�l999f�K�,!66���<����裏صk��_�����͛�����g��t��R�\�r%}����ܺu���<N�:�[o�Ettt������رcټy3�/_���dff�i�&ƍG^^��>'N$))��7or��u�m�Ʋe���_|A^^���s������G|||�������T'�ϟg„	xzzR�fM���

����%����y�Oq���<���������-Z0k�,���֭[ܫPX�vmS�Bc��b;�<�;w�v��0�cسg]�v��WWW�7�|s�8���bccC�ƍ�}�v�}o߾M�ƍM���{]*��ٳ��၃��=����}�so޼ɻ�K�^�hР5jԠaÆ���'����c���~7KSU�a��={�,�F����
{{{Z�l����J��,�""""��)9E�XO=�����������'�ڍ����*4�������Y�����Lvv��
��0��-ZA��c+�q��x�x���mEoT�H劎��…���ɑ#G����H�ظq#�O��]�vlڴ�cǎKǎIJJb�Ν%&���۷9s��-�[�n垳��͛����…��SRRؼy3�6UU	��Ύm۶���Ȅ	8p�@��n߾�+Vp��8��Y�زeK���~�z������0]�5k����Njj���wQM�6e���$&&2f���Kȕ'���DZ�nm1����GDDDD�:;x� �۷���;?��3���Ν;W�1͞�[���]����s��UnݺEZZ���z�2�<��Ν;lܸ���O�nܸ�;w��7�1c���7ߐ��G�ڵ*��~��_�رcܺu�k׮�s�N�w���_]j^^^<��s\�|��>���>qqq\�|��{///��\��|��gx{{�~�z�.^�Ⱥu��ԩ_~���>�9�999t�ޝiӦq��A����s����qqq��Ӈ���r,������[�����76l 33�۷o���ʔ)S����*�oRDDDD�F
k b-ݻw'&&��K�F�z�X�|9���4i҄O>��޽{�v�Z���X�hmڴ����,^���={�{������Y��߿?-[���,���������}�tuu%++�;v���/s�ҥ�ȕ��K��U�Vdffr��y�$���ϛ��Hٕ��N���dSChh(�۷��ۛ9s���k���߳gaaa�$��͛3�|
D\\�
z�]\\;v�C�9bĈ+A͚5��-[`0X�z5������ٳMK
�9����挜�����%::���4z��M`` ����W\IפC�̞=�W_}��{�b��̙3M��AAADFF���]�XΝ;�{����K������u�V��"��lݺ���[;�j+++���@rrr�:u*!!!��w��ĉ�Y����HgΜ1��P�ʱF�/6U��裏L�?��#'N�Ν;L�4�7�|�=ʘ1c8~�8��E��Nff&�[�6�/�ҥ^^^���/�������ϩS����4-�Y�XƏϫ��ʴi�pww'))�ѣG����[o�ŧ�~Zj,&L !!�5k�0p�@��QQQ�7��u)���L�
F~~>��ߦe˖|�������駟2d�N�>M�ƍ+t����oh۶-~�!������r��	�N�ʑ#Gx��y饗*|����e�[�����@~~>C�e������8}�43g����~$祤�I�:JN�'�+��ž={8y�ś���Ǜ�w�^���M�p7���h+���`����H �6=6&����Ʈ]�J�w��l߾���{���{�ĥ�z�%�ݽ{wHII1��U9��%�H���:u�d�^�� ==�ǪH�$;;;�ׯO�Ν?~�ه=�ӘDQ\�D7'''��-Z��&dI�L�‚8z�(G��>`̘1jժU�~�edd�R�2^��/Z�S�\\\���KVV���sی}DDD�۱c;v�v""|��\�r���P�z�-S{׮]�ڵ+��μ����fۋ;z�(���`ƌ�6c��СC��L�={�d���<��3lذ�"!�X	q�ȑf�#G�d�ܹ�]����)s�̡]�v����_�XF�m��I���Y�z5}���رc�����/��ݻw���iJ��r�
�}�������ʺ.�b�
rssy���پ}�i��m۲}�v���˾}�X�r�i��C���ׯ7{�ܥK֯_O˖-9y�d�c/��<%%Q��Þ��.�]�y+r~?��C�_�N������1�w�ؑ��8z��ő#G*����7)""""UG�H�P��$*[�
������ggg���iݺ5������DEE1d�5j����5b���]��Bod�7oO?�4�uqG�͂L��O����vvv�w̩S�Hݺuqpp��ח�s�V��K���^��ɉ�Z�{��A�ԩC�~��}>D�d�׿⯃����[%}�����yi1;v�ݻw��[oYT�Ȝ%UM�Y�f���*���Ϗݻ�?��?.�:��KTE��mޢG���Mq,n�&����š�½3�XW�CZȺ��U4oN��(B�-�ܔM$cS�?�P���ޢdj)D����2̀�������<b���~?�u
��|���,_��g�}�;w�i�&&L���ݻkܯ��'�TT�BVmc����X�j�����<��f�z��˗�bϲ�̯~�+��-�<���_�7o�dڴi���2n�8k�[˲0��J�f������6�?��{��Y�fL�>�f[`` ͚5#%%�~��Ҹ^x�����b��oصY�Z�v�Z�q����f̘Aii)}�Ͷ�۷s��]�	�uq]��R�344��o~��_��?���^�sx��y�f��;��	����:���P�.���̳h�"�}Z�ha��u_y�~'EDDD��r�4i���DFF>��c�=Fhh(���U��,��Q���_��,|}}��nnn,Y��%K�<�u����m۶�d2K^^ݺu�W8~�8s�ε�p "u�{��|��8q��{��~��	����.�gϞ:-�[g�Y����\���>��#֮]˫��Z�~�yzzr��y�?���?om?~�8@��Cub�ԩ���ܼy�n�5�RG�EDD�L���D��#F�-�)���������U�mΜ9�?�'�x��;wҼys��*�+Ve�Ν���7�G��[j�G����<x���D�I#p�o��j�E�*���a�ݻ���gϞͺu눋�����>P7ץ:,����<K{�J�sϝ;�7�|Cff&G����f6׼�Im����=�Չ���;ou��S�4h��q��a�s�;)""""
G�SD�F����ڵ��]_			��ȣ�R�hժU���PZZ�ɓ'��
=z4aaa�>}�{��q��u��?`4�7o����)˲<�U�9��/���h��?����>}����
�V0�n��F�@dd$��ٔ�����m�&�Yꬺ�X�>�,�T�����H"""���$'';;�&#99��K�4e�n�z�~~�!III�k׎?��Ot���������{��,铖�F�f����爣xj�Ee�'��駟f����o�V����"''��{����[�>�u�����a�X�,-,,�����ڵ�޽{ӻwo���x�HMM�￯m���]�[��k����o�x���DDDD�K�S�Q3��2nC/!�(qss#""�X�\NIIa����ү"R?�O������	��opp0$;;�.q�u��,\���C�ܸq{��U|5���ITTQQQ6�ʗ�n?G�8p��/2s�L�m^^^vmu����IOO'''�.Ɯ��v�1""�4$$$`2���H�PqI�նm[nݺŏ?�Xi�BeN�:łh֬۷o�駟�t���n߾]�9rss����jŐ��ɩS��۷o���4��6{�l222���c�ȑ��X��u��v����?r��M:v�h�����S>����;vX�z�)&O�LϞ=�ܹ3}����И4���yks~۵k�͛7+��哑6>i<T9EDjlРA����f�֬Y����VD�/++���bbb���}���h�oooV�X��E���N\\&�	��@������`ԨQlٲŦ���ŋ�֭͛7����ֱ�dΆ�������yꩧpuu��Օ޽{̻�[�~�k׎��x�L�B�.]h޼9]�taڴilٲ�z�yܸq�i��z�cy�����ZmGDDDD��z�'��_�Z���ܹ�ԩS)**��w߭r�d�r8�$��裏�l6W��$�[�WGMc�kS�L�}��|��ܹs���$��ݙ6m�M��^�������L��-U��/iT�s�����y�fN�:Ŋ+�9s&~~~6�W���j~����]�[��kI$;|���1�=Zg񉈈�H#b�C			��/���ED1�Lf��T�󟢆|?�|��yРA�^z�^Ɨ��>0�F�K��m�.]2�F��;1�Gף�~%"�>����P�s�_M��5�{h�ҥf�<|�p�ݻw��ڵ��Ǐo�>�|3`���7���U�…̀�����ݶ�'O�s�=�f��\ZZj���4�#G�T9�_��W3`���4���ZہJ��&�Tg���W�n9w��0Ϛ5ˮOm�˃b�l�ѣG��ݻg��޽{�Q�F���ŋ��5=����f�\XXh����֘o߾]�c��1>h_Gm
q��j�ڜߨ�(3`9r���ń	�r^�����H�OUN�����~��h��?�֭[�����ZMc�N�PZPP]�v%!!�ږ����`�[ZIDD��;s�L�ے��X�h�-"))�����{�1222��/~Aff&w��!--��s�H�-������ƍ�߿?[�n�Y�fU���oЪU+���Y�t)�}�EEE8p��S�X�Nݿ?�/_�h4��s�U9�СC8p �/_&55�Z�[�X�˜9sX�z5`������o�A�v�HKK��ߟ��\JJJ�����ߟ�ҦM~��_��S�s���ܯ��w�q��=���f̘��5k���_��P�R���ż�9�o����C����Ϝ8q���N�>͔)S*����"""""u���1�hQ���G�Δ�x?\�j�yРA/���M�i:����Ç7_�|�|��e��������_g���z߯D�ч*��-Zd4h��mG�5�9�|��es^^�yĈ�cǎ5p��(k��~���C�}������Zݠ�cӦM6�
Ti���bcc�͚5s�o�С���b��l6O�2�����u����n̯�����������U�����{�93`�_��U:nM�K�9krmRRR̭Z�rدU�V�?��v������TDze��}��1�?�����8ڷ����6���[���_�۷o�p��[�:�4�k���)"""?���,Z���}�Һuk\\\0������@�nݜ�8��A�		a͚5�Y����������DDD���t�����,[��I�&a0�����ߟ��p���8J��k„	?~��3gҽ{wZ�l�c�=�رcٿ?o��M�o����s̜9���tƏO���quu婧�b�ʕ���Ѻuk~��GRRR�ԩ��ǃ�L&ڷoϟ��'~���:���Y��8��bQ��R[/��G�%  ��@�-0̘1�cǎ1q�D�}jrgϞ�G}Āhժ�����+V�`ٲel޼�N���4��yk{~�‰'�={�����ۗ;vXg񉈈�H����H�0e�g� "�Xrr2&���a4z...�L&�+��ׅ�����@VV��#�?���\�z��K�iӦ�s�N���			qbt"M���7������?�j��#G2r��J��o߾Ɖimڴ���l6?t,5���U����?p�\��Y���~�m۶�h����3f0c���&C��>��}��>�]�[����������暉���H�Q��W^^^L�<��a�H#7y�d��yg�!""""���k�X�|9cƌa�С��~�F�5aƢ���
6����СCy饗شi%%%�>�)?FAA���<�.]�X�t����Hbb"�|�""""""""M�*�H�1b#F�pv""""""�PXXȬY��t钵����,]�ԮoII�i� IDAT	���#77��v��������!::����ٷoEEE6�n۰a����d������yT""""""""��)R�v��A�f���C=��>}��߲DDDD���t���������_cS��b������ү_?v���#GHJJb��dff����.K���e}���@߾}�ƶ�Y�����������Q�iIII�AD����2e�g� "!99����0DD�E�%s*k/��Q����������Λo�i�755���H<==�իL�8��{�2q��J�:s�=z��ֳgO�>""""""""�p��"
b����AD�O?���!�;///��<&O����?��0DDY.\`�6�>>>v}/^�����ñΞ=[�\7n��]�vv�,m�>""""""""�p��"""�F���#�����H�*VD�TL��J)�1��6ϛ5k��>ݾ}���1]\�W<��9�WDDDDDDDDjN�)"4ԇ�gΜ��'���9j3wRR�`Ȑ!Z�D��ر�I-_$�(3�L$$$8;�GR�����o9q��=����ĉv}
.\`Ϟ=��թS'���y�&�:u��v��MkyxJNq���~���t�܅X��ǎ#::�]�va6�y���f��
�ȣ())��!��CP���H�;v,�~�-�V�b�ʕ<��S�:u�U�V�=z4[�l!,,���P���Ï?����ٶmF��͛7�+���f.^����O>�$���\�p�.	Ų���n&y�(9E�I��������,[��I�&Y�<�'<<���d���2L�G��ɓ���<�O?���!��<ҦO������	��opp0$;;����m�[�f�…��:t�ƍ���c0سgÇ'==���|||l����`�ȑus`"@rr��C�Trr�>��GJN�F��k��?���s��U�N�jm�6m;w�$>>���'F'"""""
�����Ctt4_~�%�oߦW�^�|�r\]]�}��݉����?$--��W�Ҷm[|||�7oO<���ŋٸq#������0n�8֭[ǡC��1c�M���ݝ�c�6́�4Z6XDDDDD��Rr�4iׯ_g�ƍ���S\\̘1cX�t�þEEE��ƒ����O�Ν?~<�fͲ�����������ϕ+Whٲ%�{���_f�ĉ�?�q����e�9&&�ŋ�����͛+M�q��w߱i�&222�}�6={�dƌL�0�ʹ

HLLd��t���ڧk׮�F	�]�v59�"�q�������/,\\\x��0`s�ε�ҧ1��d�ƘLy��e�o���Ç��ϧe˖���?y��:u*6�]kG�X���8|�0C��""MXǎY�|�Mە+W�ܹ�M����-bѢEU���닯��M[۶m1�L��ƒ��G�n�������̝;�6m�<��`2�0�L�CDDDDDD�H�)�d0s�L���m��9���v}KJJ�7o���ֶ+W�GNN��Ѹ���֭[���޽�ɓ'9y�$���L�>����]�����$��q�AAA\�v��v��Y�/_ν{�x饗*�w߾}1l�0�mÆ
#33�����ꫯ�(&i��~�m��ӫ��PVV�?�@ZZ���l۶
//��R�����ٳm��URR™3g8s�{��!66����\�t��1���ٵkf���^{
ooo���DD����g?����%K���닻�;.\෿�-��������HHH 44�����RA"R{_}��ׯwv""4b��|�Mg�!"""�HRr�4Y۶m#//��ݻ��{�����ɓ'���ؾ};�����׏�K�һwo.\�@dd$������X��|��'lذ���ݻwٻw/QQQ�ڵ��ӧ�TIq�a�^�������R}�׮]�駟�ޣs��ۿ������㥗^�t���k7��-##C�)"�����*���(++�ʕ+DDDp��1>��CV�XQ�!V[}']4��������ϳ`�z��Eii)�N���=�O�&::�z�t��k�c-..fٲeL�4	�����?���$''���� q��H�9��V����0a�1QQQDEE�l�Сs�̩�9��܈��`��������iݺu��%Ҕ]�x���d&O���PDD*���L˖-������#K�)��}�Y��>�;x� K�.�g���LJ��7,X���ojj*���xzz�H"""�8q"{��&��iӆ۷o�����s�5j�&MbҤIՎ-  �Ɖ)p�N$�w�y�Z� ,,�����{��z��a��gϞ6}D��4�ec�sqq�[�n��׿f�ԩ9r��!5i��������o��-Z0p�@"##����������իL�:��6m�4v��I||<!!!N�NDDZhh(^^^������;%%%<���:�Y�fո�du4���֬Y��������yD�R�""�Uu*^����H�)9E��K�.п�vGe�/^�����ñΞ=k�������w�����>|�>���3gb2��}�%��._���O>Y�}oܸ@�v��Y�,}D�y�]����ꫯ(..�w��̘1��K��I-EEE��ƒ����O�Ν?~<�fͲ&��O
�Ib�%���͛6�ՙ��\111,^�ooo6o�lm?|�0k׮�?��?hѢS�La޼yܼy����|�嗴lْ���g���Ҷm[��PVVFLL����ʕ+�lْ޽{���/[�
k���9*(( &&�p��u:w�̘1c�3g���v�&&&�v�Z���iժ/��"o����BHuc�ر#�}�׮]�&�Xxyy��Yٵ~е��Q����ӂ�<x�͗�]�v�h4���H``��7�����g���&�	��Tos8�9EDDDDDDD�%��ST�0���f��-Z�����ا�۷o[���eȐ!<x�?��O�8q�M�6�}�v�ϟ_�eq*��b6�i֬%%%v�-�jò�����6K�Ì/"����Y�fY��N�>m�¿����͛Gnn���ʕ+��ő��Ctt����:�<�:uz�9׮]KAA��]ЫW��.���ҭ[7�����߹s��>���_��a����lݺ���ݻ�<y��'ORXXh�+���*�}�6���:�Ν�����c�233����M�66�̝;ך�s��v��MYY���UMb�5k�>s���W^aĈ��ׯVe�+�=(���N���GQQÆ
��6l�0233ٿ��������R"?qݻw��ѣ6�999v}
{��!++��i����???bccٺu+AAAܺu��k��*VKRHaa���|�����mb���b��m忄�������K����$..���������۷o'77�~���c��9BRR 33����6)��V���RN�:�ʕ+:th��,�W�^ddd�b�
����v���_��W�͛@TT͛7g���ddd0g�����J�$�lذ�����/���%K��k׮��h�֭�;w�nݺY�Ill,����={�-[���ӣG>��222�9s&iii���W^!22>��#fϞ�/��o�ARR�M"ヮueע����u���@߾}�Y�,}DDDD��u��U�F#/��"p�ڭ�hd„	N���p�R�U͝��ĢE�X�h��m�*)9E��_��DFFr��QJKK��ox����=���0N�>ͽ{��~�:��0��/N^~�e�F#�1EEE���ooo�;�-	'�%��ҡC>��S���9w�QQQv����5k����Ν;�^����+��R�ܖ��.\�`7���6��HՌF�ͣ�vK@XX����e˖���n7njj*p�=��ۛ�͛ӫW/"""ػwo�b2d���������믿�Ps8��d���郫�������t�Rz��A�V�'�YX��$$$����?���I���ʲI��n��]�g�}�Z%�v�������E�V��UPnݺU�X|}}���Oٶm��կ0����z�jL&��}��Wٵ�i�5y�Z>�,U�e�;g~/""""
�r��3�<c�_�~N��1y��+���̹�;Ftt4���/fÆ
?~��#��
-�#MV@@_|�gΜ��}0n�8����`<Hvv66�Z�n�…�σ�����$**�.�����s��q�������Si��F��O>aݺu�[������/IMM%;;�����6{��*�>|8��������	��Ph�ȑ��("����4p�@�������3???�cզ�@����ر#�
b�����R��Ӓ�PQ�d�������������}뭷x��w9|�0��>`�̙�L&Z�n]�~������ڴ[���˗�)���=t,}���o߾SRR–-[����w���W���4�_���_���7h׮��6K�����ԭ�ӧ;�N��Ȓp-�U��by�ԥ��7�����Y�l�&M��]���Oxx8����{MDDDDD�%�H��e$ꃫ�+111lذ�/�����B^x����طo�M_www�����IKK��ի�m��͛�O<a����O�-HJJ�ܹs��%�F�IPP����ŋٸq#���6�.8�p�B\\\HMM�����Ȳe�?~�M�N�:Ott4_�5w���'� 88�����U�=n�8֭[ǡC��1c�͸���ݝ�c����HuT|��TI��}�l6�<�TC��OE�o߮n��~��͜�U�hժ��v��}�eȐ!<x�?��O�8q�M�6�}�v�ϟϫ��Z�~�U>Y�"GU�j�ȑ#)..f�޽vK渺�DLL��V�թ�R��-��:��9��������Ѳ"
�����!4:�+GZ���c}�a�6l��ύ�j���\�z��S�ZۦM��Ν;���'$$ĉщ����Hc��i�ڶm˒%KX�d�M��=<<<�k�>���_��,|}}�}�p�:@u����$22��s�m���Dll,yyyt��
�_���̝;צz��4��ݻ���r��	�{�9k��'�.\���={l���'g�Y����\���>��#֮]k�tR�~�yzzr��y�?���?om�����y�N,}����ѣ�޽�7�x�nK��&�<���N;u�D~~>7oޤS�N6�,�5Ul�k�}��6m"##�۷oӳgOf̘��	l�Á�~�:�;wf̘1̙3wwwk?K�Mbb"k׮%;;�V�Z��/��[oY���������r�
-[��w�޼���L�8�f��?geeY���a���x{{�y��Joxp���l<x�M�|׮]1�$&&�B������4]JN��� >��3

 !!��`����4��c���߲j�*V�\�SO=ũS�X�j�]�ѣG�e����

�O�>���l߾�m۶a4ټy3p�2��l��ŋuGgM�l(/��2yyy,Y��	&ЧO����m��hԨQlٲ���HV�\��O?Mnn����f9���2m�4�=J\\�o��W^��ˋ���=���{�u���k]���N�|�I���p�]�%���O""R7�L���D���DBB���hT,I���0�L��уݻw���Cpp0����ر���q�AAA\�v��v��Y�/_ν{�x饗��� _�uk�\���|v��Aff&qqqv7�̝;ךt}��v��MYYaaaDGG�u�Vk��w�r��IN�<Iaaa��_[�v-v���ٷoEEE��6l����߿��(EDDDD�Ѧ�i��x�*똛�,X����@RRRX�~=�[�vrt"2}�t>��sΟ?Oppp�}���9x� ���v�e�[�f�…��:t�ƍ���c0سgO��ɜ
%((���H�����������S�~��?p�/^d�̙6ۼ�����2�ѣGȶm�صk�v��G������uu��R������IOO'''��<����K��KHH�d29;�&�:	M���}���s���}��G\�v���~���{�Ν;�o��o��$..Κ��u�VΝ;G�n�X�r%}��%77�e˖q��Y�l�b��M�=������'66���8��Ҭ�)�|�	p�"���ݻwٻw/QQQ�ڵ��ӧ�TIq�yV�^������2�59�������Ws��Җ�����Ѱu�E��4h!!!�Y��5k�0��*�������U�_111���Ѿ}{Z�h���7+V���0��ݝ��8L&���͛���a��Q���ŋ�֭͛7����ֱ�dΆ�������yꩧpuu��Օ޽{̻�[�~�k׎��x�L�B�.]h޼9]�taڴilٲ�z�`��DGG3j�(��������ꊷ�7o��۶m�C��uu��R���q�hӦ
���СC���3v��z�SDDDDK2�3�<��y}�ꫯx�w���M�6���������Gk���4����߿?-[���g�e�ҥ8p�n���P���hժ�5I�֭[��J+			$%%��?0i�$���HII�V�5NL��q;r���~�ME={���#"""""b��)Ҩ�‰s�L&�E)�Hu�ؑ�˗۴]�r�Ν;۴{xx�h�"-ZT嘾�����ڵ��=��sV6�ö;���營�_��T����{�1BCC�ˡ�d��ګ3��!C2dH��:��sn+k���m۶�L&bcc��ˣ[�n���q��q�ΝkW]DDDD
��^��իW[��\���+W�����˗�/'������>k�>p�@�q��ݻ��gK�zYY������w�����>|�>���3gb2��]�֒RS�=nGnܸ�O֯��f�#"""""b��)"""??���0�|���ܺu���2����[�iX>q���N����ڵ+			ֶ�����P"""�b4+]v6))ɚ���������j֬�C�_>٤��-[V9���/��Y�|9�>�,w��aӦML�0�ݻwWk�ʪ���f�ώ�&>�q[�uq��h����UDDDDD=JN���0aQQQ�3��{�ɓ'���E��3g��#�����͍��RRR�r�
W�\!%%����j�-*""�,ǎ#::�w�y�ŋ�a��?��D~�������_�~dee�a�|||�K��wU����g�V������w���`0�j~������e�֭q��-֮][��,I!����6G�V��v�S�Nܼy�n����GDDDDD�B�)"""?���,Z���}�Һuk\\\0������`]Eęj�:4h!!!�Y��5k�0�||||����H��l�2&M���`������)..vvx"?	999���G�����X�f
���ܹs�իWc4y�W��F�@dd$��ٔ�����ͪU�9rd��~�嗭U����ӧ��ހ�+/^|�:t��O?����s��U��v4�e)�.؍ki��rA"""""�hk���iHNNvv"҈%''3y�dg��蹸�`2�0�L�E�R�}��-"�X����?U���\�z��S�ZۦM��Ν;���'$$ĉщ�44��_�򗤦����Ϳ�˿�l�={��砠 8�ŋ�9s�M?///���

"22���(�����:t�ƍ���c0سgO�c�5�O>��u�ֱn�:�
fׯ���h��Ç���NNN�]R���&YGDDDDDmJN�1e�g� """"""u�/� 99�ӧOs��:w�̨Q�		�M�6�?\222���"55WWWF���o�I�Ν��դ/@QQ��������ӹsgƏϬY�puu�711��kג��M�V�x��y뭷pss���~�:7n$==���bƌ�ҥK펽�����DL�.]��]�v�h4���H`` �ڵ{��,�H�����7��<o�:u">>���h���k�ܹ�O<App0?��ϭ�ڵkG||<��<����ԩ?��ϙ={65���ߟ-Z���Ĺs��޽;#G�$((��o���lܸ���|JJJ�s�…������Jqq1F��e˖1~��Z���Ǎ�9��� IDAT�u�8t�3f̰�СC���3v���y�)9E��y�|����ڴ��瓘�ȭ[�X�b�Ͷ����;��ܹ�޽{9~�8۷o��B�:}KJJ�7o�����\�B\\999DGG��b���ܹs�y�u�ݻwSVVFXXp?�d�̙���Y�����),,�;�}��QTT���a����d������U�Eٻw����/N���ӓ����{��

%44��~�U�r���營�_������[�9���X�d	K�,y`�����۶m��d"66���<�ҝyyy?~��s�Z�EDDDDD,��"�ꫯ�b����CD~,wĊ���H�s�N�,Y�K/�D�f�8y�$s���СCv�-<�S�N��˗پ}���7��}�vrss�ׯK�.�w��\�p���H233IIIa�ĉ6��у���qbcc���#--͚��m�6����޽;���ޜ<y��˗�OFF}����fi���Pr��<�������HHH�&�$$$`0prt"""""�)9E��ŋINNf����ED���dZ�l��0Drr��C���׈ȣ̲�̓ڳ�����/1�͜:u�?���������	��۷��X�d���H���	c�������%�T�ojj*���xzzЫW/"""�8q"{��KN	

�����ӧǭ[���<�ҥKy�g����7��
,��̙3�����z��i�GD^e�O���#�`nnnDDD�`�HIIa����n���щ����Hc��iIII�AD��ӧ;;�3e�g� """�Ю]��…9u��6��l�6d����ҥK��{��E�J��8{��][�޽�?[�*++��Y��߿��~��ƍ�k��n����GD�Q5h� BBBX�f
��������Q�����Hc���`2�0�L�CDDD�R+X*8�,�z�jN�:E���y��ݻ7�<�L���-Z�~�`I
qqq�U_G	0�9��R�R_�f��[Ƭ8v�x���(~K��9D�vT���ߺ"""""R]JNi_}��ׯwv"RF���o���0DD��������ѡCΝ;g�^ZZj�ԑ��m�,DZc����'�����`0p����ك�`��C�{��;w��G�Z���ɱ�۩S'���y�&�:u��v��Mk��yhU�-���ĢE�X�h��;iB.^�Hrr��������̑#G���H���_SRR��ӧ	��ߺu˦��ONN���;v���Hƍg7fu��=���0N�>ͽ{��~�:��0�̛7����_����H�=Jii)�|�
��]�'�|�.�m��Y����������*��Թ��~���t�%g�;Ftt4�v��l6��k����m]C]D}JJ�i�>}��CiF��޽{Y�|9˗/��~��i��#;v$88ئ��O?�k��f�ou�s��A���	��ۺuk.\X�c
�/��̙3̙3��>n�8�$��Ç���NNN>>>6�,�VF�Y�DDDDDDDDU��"R������l�2&M���`������)..n�(EDDDDD�����0��w���777\]]y�gX�j�5�c׮]6�׮]ˈ#hѢ]�taƌl޼WWW������ݝ��8L&���͛���Q�زeK������äI��С����;���0���ƍ�M�6:t�nۡC�pwwg�ر5�A�Q׬Y3=��C�F�رc���&EDDDi��"��e=��>�|���s��U�N�jm�6m;w�$>>���'F'"""""R}�ڵ�.�SQ��#�=��֭��������a]2�*���騽m۶,Y��%K�Tٷm۶�L&bcc��ˣ[�n���q��q�ΝK�6mx"Mň#TERD~���������#K�)Ҥ]�v������W_Q\\L�޽�1cK�.l?�,**"66���T���{:w����5k��>K�M�����((( 11���ӥKk��]�b4ILL$00�v��5�a���9s������,\\\x��0`s���'���X�^���~�;233�{�.&��-[��ObLJJ����2�)S��U�"""�D��g����@hh(			���DDDDDDDD�:%�H�UXXȬY��t钵�����Ĕ�JJJ�7o���ֶ+W�GNN��Ѹ�T�J־}�(**�Ys�bذadff��~^}�Շ<*��{��IOO�V�GYY?��iiidff�m۶:��(<<��G�Z�_�v��;v�����ڵ���k�����7x�PEDD�	sss#""�@JJ
�ׯ�u��N�N�q�ꫯ�>}���y ��DBB���y$)9E����.]����'�}����ɓ���s��U��۷o'77�~���t�Rz��ͅ���$33���&N�HVV��%�222�۷�]����%���S���W����YYYW�\!""�cǎ���bŊ:�';;�>��A�QZZJDDD��*..fٲeL�4	�����?���$''���VWa���H4h� BBBX�f
��������Q�4^f���!��TJIt""""�K�)����p�^���#--
���0����������6}SSS�������^�z�ĉٻw/'N�t�3g�УG�m={���#"M������Ņnݺ��_���S�r�ȑ:�����.�5kf]:�6���z�*S�N��M�6��;wOHH�C�+"""��ɿi��d2a2����������H�V�:$"��.0p�@�vGw�]�x???�F��aIH9{�l�sݸq�v���m��Y���T�ڵk,_��1c�0t�Pؿ��}����"6l؀��C�套^bӦM���X�������$�ݼy�n��G�2f��͛W�X*�3x�`��򱅅�a4ٻw�;��9F��%K�PPP@bb"��K�.�~]�v�h4���HAAA��WDDDDDDDDDDDDjO�S�)*���JK�6k��}*�}�v��-c����Y��+"R^aa!�f��ҥKֶӧO�t�R��%%%̛7���\kە+W���#''���h��I�u��y:u�d�m�ڵXB�:�%K�p��1V�^���]�v%??���(�t�b=�����aÆٍ1l�0233ٿ��Tq��W�2a�ڷo�_��.]��ĉ�ҥ�]Rz}8s�O>�����s���P�L��pg|���s^�z���wdffr��]L&��կj<Uz���ݻ�$���<Q��+^�P�X-q>�y�ɾU�MJJ����2��׹����H]R�i��w���'l�+>0�ٳ���,�Gfff�sY��-_a�����^���t���������_cS�b������ү_?v���#GHJJb��dff����~HeyO�Jii)�N�b�ʕ:ԮO�^����`Ŋ5����k׎w�}���B�/_NYY����Jaa!xxx���@߾}�ư�Y�������������3��<�ׯ_����o3}�t�ۢ���z�j���P���IKK�������]�V�s�5��ǬKU]��رcDGG��;�x�b6l���ǝ�����4��"M�رc���oY�j+W�䩧��ԩS�Z�ʮ��ѣٲeaaa���ҧO~��G�o�ζm�0�l޼�_�l6s��E���x��'����…vI(���
�i���YYY�������߿?p)���p�|�M�����DFF���	�O���`�ĉ�ݻ׺4Ymc�����_�k��յ^b�<x0&����^�uN�<ɴi�x��}Μ9�c	��z��i�GDD���>}:�~����i���1�L��Q�,9��>���W�����իW�f͚z��!dgg�0h� JKKk�e73\�|���Z�je��QWUe�:MU׻.T'VgT��(..fٲeL�4�z3���?���$''�����DDDD�ѧ�i��O������	��opp0$;;����m�[�f�…��:t�ƍ���c0سgÇ'==���|||l��|�2r�Ⱥ90ydY��h�^�}��ŋ���9��ٳ���y��t�ؑA�1{�l�Y�Y?�;����s��N�<I�^�����l�q�p��JE�6K��d����A�I�<y2�?����ht%����c}�a�6l��/���IKKc���N��.Y�Q�F#͚5�����JJJx�w(**bݺut���ǔ��իW�:u��mڴi�ܹ���xBBB������<ꔜ"��3>dpss#&&���h���Kn߾M�^�`���6����LJ~HZZW�^�m۶���0o�<�x�	k�ŋ�q�F���)))`ܸq�[��C�1c��8:���;cǎm��F��_u֏6��6ϛ5k��>ݾ}��!�=���uKMX΋���*��6G�NDD�Q�����DDj�ڵk�_��������bz��͌3X�t)`��KQQ��������ӹsgƏϬY����O�q��o~��N���~�;��yڴiSe|�s�֭�_��~���e��~�������j�*�χ����|�2������:��wbb"k׮%;;�V�Z��/��[oY+a�?���kAA1118p��ׯӹsgƌÜ9spww�򘣢�8s�o�����ge���<##���(RSSquueĈ���t�ܹʹ�ƾ}�X�b&L����焇���/��al��cbbX�x1����
�_|���ɜ>}�;w�йsgF�EHH�_�q�Z���2ׯ_g�ƍ���S\\̘1c��������m��ڵ+F����D��!""""R��"MZǎY�|�Mە+W� ���`ѢE,Z���1}}}�>0h۶-&����X����֭yyy?~��s��Zi:�w�η�~ˉ'l��9q�]_����سg���&
��bٸq#gϞ�駟&77���h���N�:����͛7�T�y󦵏��HS��L��gY�R������7L&=z�`���������7;v�/,,d֬Y\�t��v��i�_—��0o�<rss�mW�\!..������&�W���ŬY�شi��ф��Vڷ:s�;����s��)������߿����/��7np��ek�ƃ̝;�wΝ;wؽ{7eee���U���۷y���9w-??�;v���I\\\��Y}�駤�����˴i���o�[���c�u�޽?~��۷���Q�q�[�d	ǎc�����еkW��󉊊�K�.,]��&9ő�k�RPP`M���������{TUu���$r)�Q��LK�b���~�K��1R�X�N�Q��q�̘8Xr������,1 .�� ���h�H~���p9�/�k��d��?��l��s����Ĕ��GEEk֬��\뻓뵲��PRR���߿�k׮��8p���*���nȐ!ddd��7�0mڴ8*!�B!�Iq�xd
>���*|}}?~<������fܩ�����_�~������TABaȸq�׿�źu�X�v-�>�,����[�N/vԨQl߾|||x�g���_���bǎ����w��jՊ��ZΞ=���s��mL.�u��	bbb0`۶m��ۛ��X�
��سgO���(..�+BQ�H�ٳg��B�qwwG�ј:
!	s��1u
�5e��}�\VDGGs��9y����ի999P^^�E^^}����Ϗ�ݻS\\LHH$&&���3jFC#FΛ7�����k�.&M������|������ԩS2������;���HOO�ƍ�m�V=/��B�nhz��'	

�S�NDDD��jINNV�S:�/���ӧOӥK֮]K�^����c�ʕ�}�v�S��~�z�z�)���VG�a���4���|8�<QQQ�eh
(�r,666�^�oooٶm�V��ڵk�_�[[�&��nݺ��jՑJbcc��—ɓ'ӪU+rrrX�hiii�i(��F$m�cȎ;())��ɉ���=z����w3ԍXЫW/�uJ[zz��!�B��F�S�}��7�w"33�I�&�k�.BCC	

�Yogg�…[t�����t�R�Ν@bb"�7o�m۶-�/!��iΜ9�߿���OO�Fc===9|�0���zpm۶eٲe겝��/_f�ԩ888�w��cri���J���h׮k֬��ܜ�� fϞͪU�عs'666:���rssqqq��C��wذawvpB!�jƌ̘1��i�Hسg��S��)������"99���E�>��Ņ���~�m�؃���#PWx���;III
~�_���9������DGGӺuk����sܸq��䐙�ɐ!C8~�8���|��W9r��cǪ�aԨQ�����G��`Μ9h�Z***����y�߿?~~~���|��wz#���`nn·~h�h�����������ߟ%K����l�8��
��R�믓����ٳuFm�����:�����֒��Ͼ}��駟8q�в����z��a������{�=�.]�[XX�2�׵kW�!�B!�)N�,�M��}�8s����t�ԉ�^z	///��W[���fÆ
,Y�D�S!ģ����,--	',,���T�^�J�n���� 00P�C4kkk�Z-�}���ɔ��cee����/�駟Vc�}�]>��c��ʨ��n�c2&��

�…�^�Z�����V�ZEhh(���L�0�M�6���Ƽy�t�HKK���Zg>w!�B!ĽS�����׳~�zuy�ڵ�]��{���~X�[C���={�)S��wQQ�Q���׏iӦ�k�.v��a�f���s�ر���U�}��7<��cx{{���|��jq���ÇoV�ݻwWV�ƹy�f��)����_�]9��ϟ�i���e�ʕ�?���P�����Y0`�ΔM�j�}r}K�,������Э[7�z�fo[�X.^�Ȳe����׋�����\wr�*�L),R����@�(3�)mJ�B!�w������k.3334�=���B<<����---�C�:��,_���˗7����?~�^������77�����-88���`��W^y�W^yE]���B��AII	]�t�>|=u��-2�?!�B<�Mќ�>����75�Hs���s��1�����^{��AP�(�U�VM��w;�^���[������c��>;v�H����������>|�_|;;;��y�9BUUyyy0;;�f�צM�gC��X
�DDD����F�1x���\�#ie_fff��_K����+������ɉ#Fн{w����⯵wr�*���9��^�γ��׎B!�
��!��1|�p����e���X[[S\\�|�3�Q7�|���k��������wppЛbH!��A���EXX;w���3gңGu!�w����<y��ҷo_�o��ѣGy뭷pqq!<<\'��ɉ��_���:Ӵ���z};88P\\�޽{qpph�|���X�b>>>�����>ǏϩS����Ϲv�nnn���������~�իW�=�ϝptt���ԩS���j��S�t���ㄇ�3`��)c�����S���SO=u�}*>��c����ݻ7yyy���5�&	C��?�V�	�>}Z]_SSc��Xwr�:99q��iN�<�N����V�۷����+W�о}{�uW�\Qc�B!��[L[�.�B�f�4iP7���ѣy��1c�����ٱp�Bgx����$((���DJKK)--%11��� ڶmk��B����l�Q?��\�~��+W2}�tpttd�ԩp���ۏw��z߾}
.�J��sݺu���RSSCNN�֭ӋU�:���)((���ҥK��o��Օŋ���H��*�=z4Ç'##�9f������/�┡C��ȑ#���N)�		!;;��������:l�0.\����?O<�����n����>�YYYj�τ	��XN�8ALL@�����Bll,'N�Pc�y�G�����������;�Wa̵S�ĉ�����J�� IDAT�ɓ�����?m�gϞ�Y�Rڔ!�B!�9E!�x@������̾}�8s����t�ԉ�^z	///:v�h��K��ۛ
6us���^!��Zj���"##)//g֬Yj��ٳ���%22ooof'D�S�2g������?����g��zzzr��a����FLl۶-˖-S����|�2S�N����{�6ڷ��/���TUU�>۷o���������S}/��O��?��s����϶ب/��?>�}�gϞe��:뜝�ն��X~��W�
i�
{{{��w��̜9�`|SӨeffRYYIPP�ڵc͚5�����ٳY�j;w����ƨ�{�ȑ$%%�7�.@AA��h%�˘k�>:Daa��
+&L�+B:t()))����'V~��b$!�B!�9E��Z���<�!�111�~�z �����hرcG�!##��{����'�)M�h4|��G|��G̞=���!��C��x�bF����ӟ�Ć
t��uuu��Օ�~��իW�����ѣ	��ŋ:�PUUŖ-[�2e
/���'Of�֭TWW취�ooo���3f�֭�e�ҥK�Y��1c�0d��J�i��TVVǠA�t��ܹ3������QYYy�9q/�/F���u�oeiiIxx8S�L�'���ܜ=z�f�,,,�Xkkk�Z-�Z�n���-#G�d���:�C���t�֭҅[�ұcG�,Y��n�>�nj�/PFQ�S�����k��Fǎiݺ5;vd���l߾[[[RSS[l�7n���
sss:v�ȼy�ضm��sh���P.\�������@ݔE>>>���
�|�X�����cii���}��aݺuj�Ν;o;�[{����‚��p�O�����7��	&Ю];����֥��amm��P$�B!��Ъ�����I��GLLs��A��Ξ=����M���A����o=g����M����zXY�`����0�^	!~�Z�"::�Fcp�!�����'�ap�I�&�_+}L�2���D�8GGG����/>�������ˋ��<��������aff����?Ε+Wtb_}�U����J<<<())щ6l��Eޭ�˜�e���_6�xv��Ehh(˖-S�RDEE�i�&�{�=�M��d^��x�~���JKK�<y2���z��"#r�޶mۈ��`Ϟ=t��������Y�h^^^&�д��k!�B�{(SFNB!�B!�Qbcc���-��������Oޑ}��6o��ѣG�j�8::r��y���n+6**���<���KLLǏ'>>����a��'�|�ݻw����NS�����߱c%%%899��s��Q���駟=ʨ(��0�x����ի�^?J�#��d��Ḻ��k�.***�y�&gΜa���<���&�P������ܹ�N�Ett4zS
	!�B���M��x�9rD�N.!�0D��ȝ(B!�&�PAE����LRSS���%??�}����O?q��	�^��ׇ��/C��_�~����d�����6:�������7t�֍�� ���IJJ���]�_�����;��Z-�Ç���G�>}pqq��c�ҥ���;f��u�6�u��U'F��ɤI�ԑ��)Zvvv�T+B��YZZ�ҥK�;w.���l޼��mۚ8;!�B��qO�4B��<JEl�Z�2u
B�;��4B�(�x�"˖-#??_o�����Y0`�Ν��سg�uSRTT��ֽ{w�gez��7o�mJ�����ٮ��Zbz
c����������)mJ���l߾}�9s���j:u��K/����;v4u�B<���76l`ɒ%����8+!�B�(��!��pss#>>��i!Z�r׽B<l�Y(#�*�X�~=���8991b��w�N�>}x���mn���Rbf�?�psb�����-mڴQ6T0��Y���
�����s��IA�x�����h�P���|�e��B!�0)NB!�B!�Q�;�V�����ӧO��kjjt�:���u����੧���9��w�^Z�prr���Ӝ<yR�V 77�E�o�1�Ӿ}{��ʸr�
�۷�Yw��5F!�B!��~"�)B�g�;1>>^�x��
ޕ(���9r䑚�H���F�!::��i!�}��ѣ�;�ӧO�f�����{{{u988��k���ϒ��CHH&L��9��F�b��������3�<ï��JTT;v��Օm۶u,'Nd�֭����f����Gaa!���F�s;�9��={RVVFqq�^Jqq�#�B!�Bq?��!YYY����s�Njkk�9s&=z�P�_B<��]q�"3!��3r�H���$00Po}AA���#���xzz����ݛ�3g�mۜXOOO>Lvv6:�m۶eٲeF�����������&LP�>�c�g�С����������N�2�˰a��j�B!�B!�ƒ�!ׯ_g�ʕL�>]�y�ԩ��������3B!�B<l��X�b555�������3����3gg�Ν:�)7ndժU;v{{{&N����z}7'����V�g�}Frr2���XYY�����ŋy�駍>^���ٲe��ڵk�18`t�0�x&L���M�HKKc޼y:����amm͸q��j�B�.Vq?KHH@�ј:
!�B������BcS��������Y�f�m�g�&66���H���M��B!��Qccc�N�S߭��(�q6m�Ԭ��kkk����Y�|y�q
��4�nee���/���M��~��m�{<VVVh4"""())�K�.���p��)-ZD�v횝�����33f�0uBѨ3f��/�:
!�B�����¡C�HHH����7nСCF��������R��Nhh(���777�~�m:t�gL,@UU<x�_~��:���/�ݽ���ƍ�����c�ر���;:#�\�t��?�����_���ѣ����;���J���4h;vT�;w�+qqq̝;�;=�B�GXaa!={��k?�<QQQ;v���2ڴi���GF���Y����Uc�e�a||<ǎ`��r�B!)����믿&::���qppЛH�����nnn�NC!�B!�	Iq���}��'DDD贕��GEEk֬�Y���w�^nܸARR�N�"**J�K���VWW�x�b�����JKK�j��������N��-�ʕ+j�_~�%7o�����+8Y�`%%%�6����ڵkz�����t��V2�������M���YB����/!%%E����'o���kSuu5����w�^"""t
��,���عs'���̜9�=z0`��{��B!��XZZ�ҥK�;w.���l޼��mۚ8;!����0g�S�!�M�h4DGG�:
!�B������^ll,���L�<�V�Z���âE�HKKӋ?r��7ofРA�����_����FEE���G߾}���{��BFF���������OD�N����@�Ւ�����ر������x����ѣ999�Ozz:�z��[�����Kq�ⶥ��l�裏�v�/��"K�.�[�n��Ԑ���G}DAAaaaj��1��\���ӧ����ԩS	 !!Ag�*!�B�����fÆ
,Y�g%D����M��B4H��B!�.)N&�L��T{ff&�����֒��Ͼ}��駟8q�W�^�����We�_�~����d������S�{��ABBBptt�[�n���NRR�^q������@ݛ�VKEE���������ѧO\\\x�X�t�N_���@]�K}]�vՉB<����8M��� 88�'�xsss��yBBB�:u*G���9EFFR^^άY�ԶٳgKdd���B!L˘�i4��Fc�4�h�3f�:!�hО={L��B!�CM�S�}��ŋ,[����|�u���zm��YV�y8w��mŞ={�)S�̯��H��{������@7o�T۔���맳���?����˗����[��)1B���ŋټy3G���t�ޝy������~�SUUEDD�_~�C�����xyyaaa��/�����…\�xQ-NQ8;;�}�T��
J\s�)����4h��TB�;w��Օ��8�Νk�R!�B!�B!�B����h��[�_����|���1bݻw�O�>���k�67׽���33�ۊ5Ts+C���i�F��U�Vz�>�]?�[�7���fhB��ϵk�����)�+((PSnU]]��ŋ���S�JKK�j����f�u�V^^^�p�B^}�U����۷��kܝ2&�PUU��xu�!C�����7�|#Ӝ	!�B�)//gҤI<��|��;wwww:v�HRR�]�aa!={�4�.55�={����KEE666<��sL�:777�xcF�4{��i�������������FÛo���훺��F����/[$����v�o�9�]�ɵ���s^��R���s��1����>KB!��^��q�S�Di�Z���8}������F��#;;[��bVVO=��^�͉upp�����{����������O���ɓ:_�����Ŷoߞ��2�\�B���u�]�rE�B<����9w����������Ջ��(//׉���"//��}����G���)..&$$���qww'33���^}�U���غu+��9��9��ߟQ�F���3�I}��KMM%  ���*�u��y���ЫW/�})m���R�"�B!�F�<D��XY�۷�]�_��RRR�޿���or��!�����?������ʸq�X�zu���N�<�._�x��1r���%5�>J���c�Ν���2s�Lz�衎-�B!�)Hq�x`=z��c�r��i֬Y��WTT`oo�.�v�Z�}�Yrrr		`„	z}6'vԨQl߾|||x�g���_���bǎ����m�6��e�ĉlݺ���֬YC�~�(,,$88X/�gϞ���Q\\�W�R\\��!L
�yU�=33���d����i�\\\���։?x� !!!8::Э[7���pww'))I-�h���?~<���?~��'O���ʼn'����O>��C��DEE�y�fn޼ɐ!C��[c�,,,��ҫ�k׮:1B!�h\BBB���&�hXBB3f�0u����S��)%%�`{pp0����///F�M�N��r�
ǎc۶m<x�6m��|Nej���|��'8�����o����xxx��c�1gΜ&�Ւ�$
=�-�9���0��\���ӧ�7�M�:������4YnB!���&�)�7r�H���$00Po}AA���#���xzz����ݛ�3g�mۜXOOO>Lvv6:�m۶eٲeF�����������&LPNC�%%%���\\\\t�)�6�������i���p��Y�L�b����"��ݫW/z�ꅧ�'���l߾���p>��C֯_��v555�[����̙3��K��S����˗���ыSڔ!�B4nϞ=�ٳ��i!a�
����	W��l�–-[���N�"))	[[[�Z�Zu�%M�4���3k�,����>}�z��)�(����jժEFu���fŊTUU�i�&����'22���rf͚��͞=���X"##�6avB!��Qff�����	��aŊ�?KKK,,,�ӧ�֭S�:v�ܩ�q�F���077�cǎ̛7�m۶|3ޜXkkk�Z-�Z�n���-#G�d���5j������L�>;;;,,,7n���z�&L�]�v����KKK��ښq��������l����Vg�U�Vz�֏���ի��6l���z�A�k���N�fHEE������M�6�l�2�0��<��u{��f�\!�BWmm�<�!�{����6���C��ŋ2z�h^z�%<<<��opuu�+v���b˖-L�2��^z�ɓ'�u�V���՘[�����~޼y:�)����Wob�ꫯ�ҥK�Y��1c�0d�u���Rr+**���777ƌúu�~����4h��ree%}����
��O�7nl�!@hh(���,]�T����W���7V�^����G�&00����Օ��$�������ꊯ�o�ϩ��ɓ'=z4�/V�:��ŋ9r�zn6l�`�sT��^�
i�5TYYI\\�
�cǎj{�Νquu%..�����>.!�B!�"�{666����:����gӦM�껹����,_���˗7�P���v+++|}}�m4���
�FCDD%%%t�����N�:ŢE�h׮]�� �x�999���~��^xAm���b(..f�޽�0���ի'O���/������+��*Qֿ��;�����ޞ?������Q��۷����+W��Msv��5F!��{��L���777��8u�����?�h4<��|��������I�=���Q�]�����ΝS�


����뻺��ŋ����������j���%,,���2��XÇo����ؼy3YYY
�TVV�`�JJJԶ���s�ڵF�6dѢE�{�7n��_r��M�7;���ի����>}Zm+++#&&����Zm��-�ٳ���DƏ��ٳ���|�޽{�\���8u�QQQ���6��[���������qqq�s�Δ��Jǎ�����o�m���7RYY�n|��'DDD�Ĕ��GEEE�M�t'פ1�Ё����eZ1d�222��o�6mZ�B!�Ƒ�S�x̟?�Ν;��i�����TCB���2JҺu���ͥ�����֭[�;j�(��β��~��w.]����7\]]u�SFQ����Z-~�!EEETWWs��URSSY�b��~�������7NNN|���S��S����g����hVB!ģ&!!���S�!�##!!��Ǐ�:���2eq߾}
.+���9w����h�Z�=Jxx������(����۷/111?~���x@FF���G���_�,����`p�IŎ;())Q�)y���O��mȓO>��ݻIOOg��$''�����/8}�4]�tQ�]DD����}�v��+((`���<��S��#Gؼy3G�E�������牊�2��4b衰��a���\�v���@n޼ɪU��v�AAA���6xݺu#==]-:����
_��������O�b�X��i�5i�1�Pzz:Pw�I}J�#�B!Ľ&#�����$((��K�2w�\ټy3m۶5qvB�{eΜ9�߿���OO�Fc===9|�0���zElm۶eٲe겝��/_f�ԩ888�w�^F��ܹsٱc;w�ԛB
�>m��Oe�����L�<�`Lff�Qy:���rssqqqщU>�6lXC�D!�����F�ј:
!	s��1u
�5�o�>}�\V(E�����2...�/9x� !!!8::uE	AAA���������{�9)Ӭ��7��imm�ο�>|???��\\\x�X�ti�����ン�3Pw]i�Z***���й�߿?~~~���|��wx{{�lSQQ������|��F����뫎�ѯ_?���Y�d	���z�2ƠA��h4DGG�믓����ٳuFm�����tީ����֒��Ͼ}��駟8q���t�Ƹ�kҘk����{�^�2E�#�B!Ľ&�)B< ���76l`ɒ%z_�
!|
Mu�j��ᄅ�����իW�֭�|�fmm�V���>#99���r���pqqa���<���j����LYY��\�K�.��_d׮]���\�t	sss�v�ʘ1c�={�O+fL�&L`ӦM���1o�<�~��Ұ��VG�B!�B���4�~�z֯_�.�]���k�u���y��}6��
9e���.**j4��;RZZJii�Zb�2͊��[�4DJQ���q4G����hI�� IDAT���qn޼��vJ��G�Tr8��N{mm-+W��󄆆�E
�<x���t�e�Uc��[�d	Ǐ'''�nݺ��[o5{��r��E�-[F~~�^lCEG�䪸�kҘk����@�(3�)mJ�B!�������1oo�M�@���ݍB<����	�i+--�C�:��,_���˗7����?~��u��P�!��On���iee�F�!""����t��}�z��)-Zt��2B!�B��[��e���b�kjD�����R:ğ����:��7���U��Ő6mڨ?:nc5T�Azz:���c��V��Oٗ��ig�����+������ɉ#Fн{w����k��֢���kҘkH�.�g��%�!�B!n�i�
!��ن���+�v����7or��V�^
�ޝw����ӹsg���ն��h�B!�h)���:�<(�������N�e(��ǰa�x������[,�;ɻ)���j�rc�Q<�233	�o߾dff�e��n4���L�����?���O�e��ݫӏ����h4�iӦ�����?��/�"H��ɓ:���E��2�̩S�tڕe�|?~���p`�C�����Y���੧���>�1EEE��ݛӧOv�};v�V�;C7-mMM�媸�kҘk�}��\�rEo�Ҧ�!�Bq�Iq�B�4i����=�^x�3f������.4q�w���%AAA$&&��l'&&D۶mM��B!1aaa����:
�_��?��;���練��EXX+V���w�e˖-z_��G���z߾}
.�J��sݺu���RSSCNN�֭Ӌ5j�����s��%���������ŋ�Xe	e�����W^���
///bbb�p�555����o����י8q�:e�!'N $$��'ORSSÏ?�Hppp�O�9r��Cvv6555dgg��nذa\�p�x�	BCCiݺ�m�388X}����		�k�'N� &&���jqqq!66�'N�1��Ӧ=z���j


P�+**�(_�1�d}�\C={�P����Ҧ�!�Bq�ɴ>B!����ggg���Ǚ3g����S�N���Kxyy5:��d�x{{�a��n�qC��!�B�mUUU�_�^���^SF�����?��aaa$&&��^x�$95��\���ӧ�#	L�:������4q��^2�8eΜ9�߿���OO�F��������dgg데ضm[�-[�.���q��e�N����{���~��7���[6n��ƍ��3j�(V�\�h.:t���B�
&L�`���n�?>�}�gϞe��:뜝�ն��X~��W�
ij*W{{{��w��̜9�`|S#/effRYYIPP�ڵc͚5�����ٳY�j;w���Ʀ��Ԑ�#G���D``���2��ܚØk�>c���C����Bnn��d�K)FB!��^��qO��<�B��KBB���i�����h4r�@΃Bq(_6��lРA>|���d��xShժ�������$&&��?�,��DFFR^^άY�ԶٳgKdd$���&�N�k��Q�k�Pq���%��ᄅ�����իW�֭baa��Z[[��j���HNN���+++\\\X�x1O?��������SVVFuu��naaAhh(���|��W���PQQ��?�s�=���;Ço�-,,g˖-:t�k׮1b����9p��8#���ɧ�~��Ç�t��۷g̘1����������b�ܸq#�V��رc���3q�D���t�'c���r��V�^�NU��舏��V�"44�����SCV�XAMM
iii����<��3xxxp�����ٹsg��sM�g�54a�6m�DZZ����Y�������:
�B!��������ٙ3f�:
!�}nƌ��⋦NC!�B�СC$$$PPP��7�С#G���ۛv���-pIOO'44��baa���o��6:tP�3&�F-��������/t�Ё�_~Y��O�߸�86n�Hvv6�=�cǎ�w����ҥK|��Ǥ��p��uF����_����c֬Y|�ᇼ���q�P�OK�����lmm�dlee%���|��w\�t�:0z�h.\����غu+���\�z��]�2o�<u�Ɇlڴ���D�L��;�Cee%qqq4HgԿΝ;���J\\s������6�^<����t�����F����F�(--�{����e���,_���>Ǐ���\?|��f�(�.[YY��닯�o���m36��������v���ຆ4��M�6������W^�W^Q�
=�
����F�r���S������^�wr
YYY��h�������.]�PRR©S�X�hQ��W	!�Bq7Iq������pss3uB!�B!Z�'�|BDD�N[YYqqqTTT�f��u|�:�7HJJ�ԩSDEE�w�[]]��ŋ���S�+--E�Ւ��KXX�Z��X�hW�\Q����/�y�&���@]�Ƃ())Q�ٿ?׮]k�<8;;����֭[	k�K߻�?���7o�����z�*���:�O�V���ʈ��!##�V�~yy��e�ϟ�ŋ�آ�"���ߙ<y��}���%::�>}��_�8p���*��2�������M�f��G���é����ח���cmmMqq1|��?���3�0�|���k��������qppЛRH!�B�{ɬ�!n_LL�Z���<�!�&s��1�K�B!�h���X|}}IOO����O?�
��ȑ#l޼��G���jqtt��DEE�VlTTyyy��ۗ���?N||< ##���D�~�|�Iv��Mzz:, 99Y]�c�JJJprr���?��ѣ�����O?5z.�͛G�n�صk�:Eɽ���>ƍ�޽{�2e����}���>}�.]���j9z�(8::RTT������?���/һwov��Mjj*���*Z��`�7n$::�nݺ�e���%==�^�z�m��)1Bԧ����ѣy��1c������5y�񨰴�$((���DJKK)--%11��� ڶmk��B!�#LFN�D||��SB���”�^{��)!�@BB���i!�]�L/�T{ff&�����֒��Ͼ}��駟8q�P7*G}����h�����ߟ%K��������ѱ $$GGG�u�FPP���$%%���ӯ�����@�ߟZ����
u��Ç���O�>�����{�t��ϛ��9������DGGӺu��ﶂ������D)��_�~���???�|�M���;�\9r�+V�����_q���7���-����8���@]�P}]�vՉ�>�wx߾}�9s���j:u��K/������TQB<����76l`ɒ%����8+!�B��qO̘1��)!�c{��1u
w�����
��1c/�����B��x�"˖-#??_o]mm�^��u���s�n+��ٳL�2�`~EEEzmݻwWV
&n޼��)�+���Lү_?�M�Ʈ]�رc���Mn�233՟�]�����裏��󣢢��ӧ�N�����:�ʱ�?^mS~�ٳg�r����I������u��˗�����NiSb������F#���[_��i��B!���Hq�Bq������f�4�B!T�Ee�C_4�_����|���1bݻw�O�>
�gn���Rbf�?�psb
�����-mڴQnժ��z��}�ϧ!o��)))���g�ر
���֪����nV��aee��ѣy�駙:u*
�4��b��s��F��ݻ�q�۶mc�ƍz}zޕ6c�'�B!�B����B�{�������Y�|9˗/�)��xH���ЪU+y�C��Q��L!r��1�Z-���'O�Y_SS�����������SO=��wsbػw/���z��������	��'O����6k{+++V�X�o��FHH��V��.�]�����NY[[�LYT�2ҩS�tڕe�t��	h~�˗/g�…��������k߾=W�\��NiSb�B!�B�p��S�0����/����1++���0v��Imm-3gΤG��P�B���	�`��!��u��QƎ��ӧY�f��^QQ������ڵky��g���Q�7&L���gsbG�������LJg�y�_����(v�؁��+۶m3�X&N��֭[			a͚5��׏��B�������ѣ>|8���z����|�2{��aڴi���jT���y�&�Ν��+}��i0v�ȑl߾���֮]K�޽���cݺu6L�:t(qqqlذ����x�	6o�L||<NNN|��Wz�ϙ3���$�����OزeP75PYY���zE(���j�B!�B!>R�"�	���l�~�:+W�d����jS�N%  ���,--�e�B��`ƌ�NAq���c���0r�H���$00Po}AAC�Q�������ԉ�ݻ73g��۶9����>|���l<<<tb۶m˲eˌ>&:Daa�:���(�����Kff&UUU:�#G�d���lڴ�M�6蜣ۡL�T_�6m�np������w�q��Y,X�����Y����3$;;�?��O:�o��[�n������:G��~���:���rssqqq��F������IHH0u
BѠ����F!��.��q_hl.�GIdd$���̚5Km�={6���DFF6��B!�B���ޟ�X����������y�g����̙3����s�N�‹�7�j�*�;���='N������kmm�V���>#99���r���pqqa���<���F������lٲ�C�q��5F����?hv?;vdɒ%|��:�˖-��̌�r��u\]]Y�r%/���ѹbnn����=���ͣo߾
����ɧ�~��Ç�t��۷g̘1�����ڪ��۷'22���0�=ʍ7x�����d̘1
�_�~����޽�O>��m۶1a�6m�DZZ���ӉOKK��ښq�������^{��)!�B!�0)N�.�u�V��ӹz�*]�ve޼yL�4I�i���~��λ�K�=ضm[��UUUDDDp��A~��:t��/�����G\\7n$;;��{��c���;�`ii�sgۭ�UVVǠA��ر�ӹsg\]]���c�ܹ��ش�B]���:C�7tn}�SQa||<ǎ`���Bq��ب���w�#��\-�)͍���e���,_��Ѹ��^1�nee���/�����6�7�̙3�F�������
��ؿ��?�����������
>ߍ����???u���
�FCDD%%%t�����N�:ŢE�h׮]����F�A�ј:
!�B!�&$�)�w��e�ϟ�ŋն��"���ߙ<y�m��q�F*++u
A�WWW�x�b���Ԙ��R�Z-������aff��ǢE��r�
7n���/���͛���7�ρ���28��!C����o�aڴi�u�Bѐ���/����W�&����",,��;wR[[�̙3�ѣ0ujB!������믿&::Z-������Ao�&��8r��7o6uB�$777�~�mS�!�B�P2k:D���Ϲx�"�{�f��ݤ���ꫯ��jo��nݺ���Κ5km���"//��}����lj��g��ddd������O>��ݻIOOW��NNNt�&���T�����ի�^J�#�-)%%E�My}��u��vS�~�:+W�d���888����ԩS	��NO!�B���Ғ�� )--������D���h۶���w�ٳgIHH0uBѨ���?n�4�B!Z2r�0�����ߞ��ɑ#G��9͝���ot�����08�y������#PW����;III���������:g��Z-��SXX���׵kW�!�ë�)�D�"##)//g֬Yj��ٳ���%22ooof'�B!�8p ���lذ�%K����b�Ľo���As��1u
B!�5)N�����гg��W)�h���ٳL�2�`|QQ�^[���՟mmm�y�f��\���ٻ������/PP1�\����`*kJX�o%�%��( �yKwK��2KEtͼ`	xET�`Ŕm� ��zAB-�0�K"r	E~�;'�pf@@}?�y�|�g�y��9�̙�yn��n/KiS�!�\׮]c�ڵ9r���ڷo���,4�Z���	&..��W�bmmͰaØ2e���W:)��Ę��\^{�5�4iBTT��g�.]b��Ѵlْ���Z]wBB���ann��˵���X�>�+1DDDгgO�i�Z�h���#L�8Q�{�B!>Cn%9�����{M�!�B!�B�j"�)�F���X��&&&����D}MQQQ��tUM��^RRR�n߾��fff���o�J��_�*�6C�B�x���cʔ)\�|Ym;w�RZQQ3f� --Mm���$$$���Tu���Q�F����������e�`���Y�|9111˩S�S���}߾}���ӧO�����CRR���g̘1��W!�B!�B!�Ba<IN��_��~��W.\�@�.]��gbbBII	yyyXZZ�����Ɔ��tbbb������ӬY3�����ɡY�f�rrr�>B�'Wxx8�/_��֖%K�йsgΜ9������}���HKK��ޞо}{����'))���hF�Errr����� ""�M�6�LN�߿�F�#G��v�Zz���ٳg����ʕ+�������;ܯ�йsg�ؔ���INB!�����f���<��S��?����ˌ5��͛�з��y����|F2�s��2�k�(o
�*��:�=/j+}ƾ�q2f�
ymE}###ILL�W�^�7��X�B!ģ�r�LQ
����ʕ+��ʢ���+V����믿��kҤ	_}�\�x����Jo�����r��9����~�:k֬��ё3f�N��2e�9mQzz�V��Q�@,�0����ƣ���ߏ�u놙����i�7..���S��ڵcѢEUv��q�Ƹ����?p��Q�T;�O��aÆ888h�?>}���̌nݺ��뫱o��~��yڴi��2M��G!�BQ;���еkW���}��.};��"���q��Iy��7o�֭�ԩS5�B!��&R9E�zo��qqq�����k�i,�:u���A����b��լ^�@�4���������驱�~��̙3��u6i҄7n0z�hlll����o߾:t���T�/s��2e+!�,J�Z�=4�˾g���o...:�U������ر���P����ѣG)..�w��ԭ���F�^�4�w��@c�"Cb�q�p����6��B!����!_�	Q����k:�Z�����t�С����j{�c2���0�}^T}Ƶ&Ǿ���>�WWW�:��ѣ���c�ΝXXX�XlB!��zHr��*�`ԬY3BCC	�رcҡC���y饗�~s���Ԕ��8


ptt�>`ذa����Ғ��6n�ȁ���V�̘1�:��y��~�z���(**��ٙիW����F���x,--:th��EQ�rOQRR��\��TQ��n߾�o�ԴiSƌöm�HMM%>>НPW6Y�޽{���Y�͐ؕ}/�z�Ҧk|�B�'YdddM� ��u��5B��k*��� ������֭cݺu�D2��b���dgg3~�x�m„	l߾���Pu�_!�B���H�����߿�>̟?����k����Q���.tXYY1w�\�Ν[a�����	'''���
���Npp0�l����N�:����iРA��B<�Z�j�O?���ӧy��ӧOk����!==�������i�ĉ�ڵ�;vp��QLMM�i�JKIIѸ}��I�y��bo֬YYY���ЬY3�e999j!�B!ģ�ڵk�]��� IDAT#G�PPP@������b������|��������իX[[3l�0�L����9��Ԫe�a��Z�����ի��/���ٳժJ���(ƌC�V�����Z�ȑ#�r�
QQQ�j�J��)���� �͛���6l�޽{��~233133�}���9�Q�Fil��o�e�Ν�;w���B���4h3gά�kSe�Zy���ȪU�����Mݺu7n3f� ''��˗s��a���0`>>>4l�P]����8Tt^�36���			���9��������ں��ސ����_��C�QPP��!C����rss����gϞ4o�\moѢ���DDD0q�D�UQ�B!��C�S��E&M�Ğ={������plll��B<y��O?�IJe�X�x1�>�,gϞeٲeZ}̦M����LJ�;r��M���غu+���lذ�_Y����K�.}G��O?�ȑ#ٵk%%%<��s<��SZ��.]��~��5����٨�;u�DVV���ZI(�4H�:u2j��B��ոq�j:!�8����t����?����;mڴa��ݤ����퍝�۶mS����1e��)Aϝ;���"f̘AZZ�ږ��IHH���ꬾX�O��&��{�n�ݻ����F�֭[����w�}GJJ
ݺuS���������/�H�V��ڟU�V����&�e�u��;w8s�gΜ!//O�����?'88Xc]YYYDDDp��->���*%�V�X����q�FZ�l�Ν;�}/,,dϞ=������o}�AC���Q,_�����_ll,�N�",,++���~*󻒛���ɓ���P۾������۷���|�S���Ӈ��$���Ϙ1c�`��B!Dm�p>�	!�baa��E����&33���L���Y�h��ׯ��5��Ã�m��믿���M�^�x�7���_��z{{Ӷm[RRR�����_��ٙ�[�R�~}�̙��mҤ	p��#F����:%��)}�@J�S�N%++�.]����fT�JueN�Ҕ��bB!�d��ᔔ��C򨆇��{M���j����:�+��ù|�2������p��1���4�0(���HKK��ޞm۶q��q"##�޽;IIIDGG��#����d��6m�EBB�'O�:�*_��ٳG�=66WWW����v�ڑ���&L(I�֭�رc>|X�>�c��u۷o`���$$$p��Q���u
ׇ%55��۷s��Qf̘@@@u��a���$$$0m�4>��ΐ��g�;/c�Gq��֮]˱c�		��֖+W��s�u>*b̹�غu+�jՊ͛7���?���V߄�:wLiS�!�B�Ǘ$�Q�<���̜9��+W�r�Jf͚���CM�%��&]��� ((�z�)�֭����z��t�]KKKBBBpww��Ɔ:u�`eeŠA�شi�F5�y��ѲeK�ԩCQQ�ѱ�.�<`��}V�ZE�~��[�.͛7��ˋ
6���3
4�y!0>>KKK�j�>	!�B!.%�k׮:�+�___�u놙����i�3..���S��ڵcѢE�������[��^�zj�[�n��;h� �6mJ\\w����ݻ���Ѽys�s�1�����9K�r&<<���H~��w\]]INN�H@8|�0�}�]�ta�޽�Y���˗p�����͟?��;bnn�&u���,X��6m�P�^=&N��9�+6>���.�����S��}���̌nݺ��w�Kv2Fe~W<���ڵ��;���C�����[e�m�V��B!�x|ɴ>B�B���rg�B��M��p�B����L�y�����;w.s�έp�NNN899U�G�;O�>
ܿ�Ԯ];�}7n��ի�.}coذ!������A˖-����ԩSL�>�J�DB!�BT��V�X��+��/f�����#ʴ�=z��x��z.]������m_�p����ԩCqq1w����Lkyaa�گ���۫?+S�ܻwO�v�֭�ȑ#	

%>>�!C�p��Qrrr�6m��~c�G��_1{�l>��#ILL���?g��ɸ��kT�v�s����ٳZ�,))ѹ��R�F�ҟ�J�������}�AC���Q���K�y���4��*͘�?��]Q�(=%h��ܸq�F�i-Sڔ>B!���%�S�B�GĀpttd׮]ܺu�{�����?��G�/U���|�_�Η_~	��U]&M�D�-W���ñ����ӳZcB!ģ����###������j�JQZ�$��)�A@7n@vv����
J��J'�芭��_SSS����+U���2j�(��1�S�j
ܿ)a�޽,\���{���B>��3���ݻ�~+V���ٳ�j�
OOO>���j{ϫW���vSӊ/a2>���.�������[W�R%�I���2�+�kˮ�l���ؕ6}~_�B!ģM*�!����Ç�k�.�X֤Iu���Vz
;;;F�Q�۷��`ѢE���;jbLtt4k׮}�oB!��w�}�C����ɓ�c�JJJpss���N��]a���dN�8��iӰ��gӦM;v�����888�ѿU�V���O�>}�^xAmW*8�fccCzz:111���[�v�q�qqqx{{k-W�U�С���.��֖^�z���@jj*�f�4o�\�S�QXYY��₋�iii|��l޼�U�V1f�		�I�&\�xQ]�ݻwu&�$C�G�qХ��&%%E���ɓ'x�g�l�9�Z�j�ŋ9q�}��Qە��Jk֬YYY���ЬY3�eʔFeۅB!��G*�!���ΝK�Ν�_�>������0z�h����)m�[��ͩW�}��e���:K[?l�?�<3g�d�ʕ�\��Y�f�,�-�BQ�C��l/((�>���lmm=z4~~~Ts�B<^�/����u>/m�С,[����T�޽˙3gX�l�V�����˹s�(..��Y�GGGf̘��U�5(ӛ���_|�֭[�z�*���dgg�}�v6n��+��R���ƌCqq1������j�g�ȑj%��|:v숝��Ω��;FQQ�Ν���Om�u�Vev��0d|�]煢��f�ҥ�~��I���pvv��mT��R�N�8�ݻw����Y�t�V_e�#ez�Ҕ��� 	!�B��S�Js���;w�tB�Zl�Ν�;��è�LMMqww��ݽ�C���>��}m��86B!ģL�[�:���BCC���f���jۄ	ؾ};���̜9����fHr����|�
����j&�y{{s��ARRR����_�>s��Q�7i҄7n0z�hlll���aԨQ8p���D֬YÚ5k����k�UY����Ӽys���iժ�FeC��<�&M���_g%�҉��
"66���p�B���;wN�JFm`��;�΋���M�j��]�t��ͭʶQ�s��ӓo������kTruvv�JB�۷/�"55U�F�����!�BQ�Ir���ƍ���B!�BT��~���>����n߾M۶m���b���j��\ʶ+σ���7ovvvlذ��v���|��������իX[[3l�0�L�����ֶ"""X�j)))ԫW��_~�ٳgcaa�1mB��rss����gϞSl�h�GGG"""�8q"�5����S6���x^���AAAr��an߾M�v����d�…���������q�F8@vv6
6���3fhL�3o�<֯_OVVEEEԩS�5k��7�|�O?�D~~>���������1�ie���2j�(���=z�Z�Ø�)��ѣ�[�.����T4�Z����L�4I��{�q��]���)..�cǎxzz���?Ď;j]r�!��8�:/�{lV�ZŇ~Hbb"M�6�W^�?��*sn���ĺu��o���c�����o�>����ά^����x���4����cii�V,B!��/������B<>�mۆ��rZ	!*���������xe��Q��C����J�311!<<\�0V�yy*��r��
��ݹv�ֲ?�P�&`hrʳ�>���6l�q��EEEL�2���4����bjj���ƍ�������_���W#9E���̮]�`Μ9�{�",,�իW���1c�h�^œ��Cu~���dĈ���]����=���6l�@pp0_}��:-qFF�F�b���L�2��#|2߯�B!�Q�TNՑ#GX�vmM�!�x��׏��~���B!�zؼy3׮]�K�.,Y�kkk>��S���b�T�ڵ#$$D���aaa���aooςh߾=�������Dtt4�F��XG�6mX�h��_&$$����Krr��/�ܹ�V�J[BB�$�Q
@~~>������	KKK���Y�|9=z����4i{��!<<�~҇���֔B��J�B��z���ׯ_M�!�P��"�K�.�s�NƎ[ӡ!j��;wbffV�aT��;w�tB�J��k��3]�Ct�'''s����[����__�J����s����qqq���ckk�O`Y�h�F�"66V+9���G���Ã��nݺUa<�ϟ�'��նm[�>B��k���j5����eM�4aڴi5�B,Z��w�y��'�ڵk�_�~
G��Q�O��[!�x��ܹS볲�I�SD��������X��3�3E!���+W�ЩS�*]����K�.��⢳����ڷo��lee��{�*��ƍ4j�Hk�Ҧ�B<\J��޽{���)**�/��{�fʔ)4o޼�CB<���?�̙3Y�r%�f������zr�3ͣB�Nj��IM� �p��"�BTwww��/�B�Z��t6��in�^�*))Q_STTTn?]USt����T��۷ok���ԧo�J?SSS�eJ�\��z�����*�D����D~��B!�\��"�BT�#G��v�ښCQ�����o�]�a!D���_�¯��ʅ�ҥK��LLL())!//KKK@wUC��ؐ��NLL666�^_y�5kFVV9994k�LcYNN��G!��Q&�~����oӯ_��C�o��	�knpGGG��/��СCy���B�(ۭ(V]}���H�Ν�ܹse�&!�p��%u>_!ģk�Ν?~���B�׷o_V�\IVV����X�GGG^�u�_�&M�ꫯ(((��ŋTz����חs��Q\\���Y�f
���̘1��u*P�)���i���ӵ�+mU=��B!Du۹s�\�B���Ν;5>�
QӤr�xb���:tH�R�������$%%�u�VZ�n]
Q�gH��ɓ'	dǎ�����憝�ݻw��x�x�Ir��6��A!j�7�x���8RRRx��4�M�:U�yРADEE�z�jV�^
@�>}*�}ooo<HJJ
�����ׯϜ9s^g�&M�q��G���Ɔ�����ˡC�HMM��A�jj*���7~G�B!j���p�rI!32
��m�r�xb:t�������#))�����=z����ƍjl�v+��l������>�WWWlll���e�����QPP�з/�B!��}�h֬���899ѨQ#����ܹ3˗/g���j�9s����J�ƍ177�O�>|�����Ғ����ݱ���N�:XYY1h� 6m�dT5�y��ѲeK�ԩCQQ���4hЀ��x�����XZZ2t��J�O
y�C򨵏m۶��ۤB!�cM*��ZA����*�<���)-[���g���OT9���P���?~��6a��o�Nhh(3gά��B!�5����
�XXX0�|�ϟ��^��_y�+��hee�N=Z}���䄓��F[Æ
qww'88���Z�l	@FF�N�b���4hР��!�_�~RER�H��j�B!�OIN��k׮�v�Z�9BAA�۷��ˋ����	&..��W�bmmͰaØ2e
����0��'1�M�6���h�������_�_����5C�aڴiXZZ���ݻGPP���'33333ڷo�ȑ#5j�ΘʋUW�ơ�6""�U�V���B�z�x�嗙={6�"""�ٳ'͛7W_ߢE���`�ĉ4j��c'���Ο?�q�q��Ԗ��+W�Fbb"YYY������8����cee�ѿ����'###ILL�W�^�7�Z�+�B��M�4�={����p�콍��֔BB!�B�����E�-j:�ǚ���:Ir������2e
�/_V�Ν;�&��VTTČ3HKKS�233			!55���@LM����_~Vܾ}�7�|��/�mYYYl۶���$BBB�;�ٲe���Ν;�9s�3gΐ������ѱ�b���j�Maa!�w��޽{����o�>���u�	ߧO���ؿ?cƌ1:n!D�{��w9t�P�I41�?��ԩS���Sۊ��8�<�ϟ'&&���`5ɮ���ɓ'	dǎ�����憝�ݻw��ЄB�'����-�w�a�ĉDGG�v�Z�ׯ_��	�h8r�H��y!Duqww'<<����q�666annNff&M�6��훘�PRRR-��*G�a���9r���t���i޼9/��"o�����j��Uڗ_~������{�l��c���U�N5jD۶my饗�5k�<�A�i�=Ɔ2d�j�+j{|BT㿥�����s��elmm			�رciT�P���������=۶m���DFFҽ{w������4hu�ݻw9{�,�/�w���-[�p��EZ�l�����-.\`ӦMjߨ�(֭[DZc�8|��Z�zǎ:��o��ġhӦ
QQQ$$$0y�d8�.OHH�s��Z�Uڔ>B�GסC��ڔ����;�פO>����<^|�E�m�Fbb"G���/���g�%33���@����-Ou�gAA|�������`kk��ѣ��󣠠�o_!�{���9s&+W�d�ʕ̚5��K�GNII�<�!y�ڇ��{M�M
#l۶���"��J۷o��j���l�N���ٸq#�Ν������"._���ݻy��x��W�u�V��:m�4n޼Y�1T�����7or��)>���t�BXXXM�e��>�B�Ǐ$������]I��[�n���������z������Ύ:u�Ю];-Z@ll�Q1��Ջ�'������o����OW|�=��Z�����W�\Ndd$���;���$''��3�2$����[��^�z�L���<�<��tF��m�V���j�}_����ҥK����nݺԯ_�=z���ܿ�6

%;;���ǫm&L ;;�����L!�
www>��>��&L�P��!�BPo�����x^�)IQ���~�w���ݻ[[[V�\��O~~>���Νc���4jԈ��X\\\�{�n��X��Mh+**��~�?��#F����///���S�k��I'�)��KOO�G���R�t�...�%�F��…F�P�N�~�i^y�BCC���Q�edd��s�i�F��ʕ+j��ٳ�W����|�駸��Baa�Qq�fH���۫?[YYp��=��ƍ4j�H�J��GQ=�]��…2d�{���ӓ����Lj���gݺu���лwoF��g�}��M�L�Wnn.dԨQ�p����ё�#Gj���?�࣏>�_�~2��r��5�u��B)ժk=�[�&99YM�+o��O�8��!C�1c��1Q�_�p��3gү_?^z�%�-[�U�D�c���KDD={�Ԩ
֢E��� 77W�!B!�B!�xb����kkk>��3�6mJrr2��}M�V+���\�x�������ҥK,,,077�S�N���q��Q�z�):Ć
j:�Z��̌�͛��K/���%%%L�>�?�����B�ZI�SD�0f���Y���{P���۷������ݻ�%K��"�K�/j���ػw/.�瞣����>���Ç�{�n�c3��8fff�Ϻ�Si35�~�P�ʛoQQ����2e
���ܺu�;w�p��9�BRiEEE̘1�͛7s���ܹCff&!!!̞=��}5j��N�� IDAT777._�����e�`���˗/'&&���BnݺEll,�'O֨�dh�S�L\�n'O��Ν;F�ӪU�����9u\iӧO'))���Brrrؽ{7�V�R�r����G~~>}���Z֧O���ٿ�Q�#�B!ģ ;;GGG^~�e._����#Ç���U�le��U���2$��T�4䵺�ꊫO�>�������*CT��FFF2w�\�ΝKddd��'��$==�iӦ�U�mll��� --Mg�>�JNNf�ر<��Ә��Ӿ}{�ϟ_�5�͛7���6l�P�H��W[zz:�?�<
6dĈ���Wv�ի���4i҄�#Gr�ĉ
��011�E��V)�{�.-Z�P�+9.����ݻ���~���(�z�r���ޞ�����K��ƞ�}�C���‚&M����BRRR��K?��V�q,,,��O?e��4k֌�u�bmmͫ�������X�lddd�k׮
�I�}���;�c�s��1i�$Z�l���9-[���ۛ�Q��ۧ����t��󘘘���OW�u�Gcϟs����免�
ffft�ؑ5k�Ty|��;B�V��"j�V�Zp��i������ILL�V�Krr��9U����S�Ni�+�KWY��J\\\f˖-L�4�[�ni|�Yq�Y�f���h-Sڔ>B��/<<�˗/ckkKHHǎ#((Hg"EXXiii��۳m�6�?Ndd$ݻw'))I�JLW��!<<<hР�V�T%9����G�a�ڵ;v���lmm�r��|��Ʈx������ʊ͛73u�T�[o�Edd�F���o�v�HHH��?�p�۴iCTT			L�<�sz50�X%$$йsg�eJ��G!�B��Qjj*]�v�xnoo�P�����?lչ�GEQQW�\!**���ǫS��*��ɓ��{�1o�<֭[�u�M�'U||<ݺu��/���_������,�m����?Oll��봰��x�y�fz��Ů]��v�w����ŋ,_����������b�z�2���oXX����0y�dN�8A~~>
6�T,;v��W^���ܹs��7oM߾}���ʍ��Ύ���o�� 66��~����_�z\���1c�Z��"������k�^�����0�PXX�͛7������;v�1��8���ҷo_�ΝK||<7nܠ����ׯː!C����m�*bjj�̙3��_�`�X{��g�زe�z�+Wؼy3=z�кY��}�ٳ'�<�?��#gϞ���_����f��0t�=bccqpp`�֭deeq��].\���ٳ�d�������!j��5�2t�P~��'�-[��ŋy��g9{�,˖-��;x�`6mڄ��/>>>t�ؑ�7o�֭[qttT�Й��PRR¥K�hݺ���
4�M�6�����ŋ�ҥiiij|���9r$̟?��ÇӱcG~��W@��IY��jH��ԩYYY���k%�(�-u����
!�Tޝgeۓ����___�u�ܟ���Ϗ��~[�\\���j�Z�v�X�h�F�"66V��27n���+[�l��ѣ��Ӈ��\N�>MÆ
��`�?�Z!�[�n���2k�,8�~x3&v'''���8{�,Ǐ�ĉ�<y�����H>��s�~���'������㣾{xx�Q�Őc��᧫2W۶m5�!�U��Ã������≰s�N���k:�Z�����r�С
���_�mU�>�V��t��?��3���$&&�������Tvl

��puuUo�=z4~~~�ܹ��x�x�ܸqWWWrss�3g3g���8u�����������ٳg5n��U�|ٲejEٍ7��?��3ӧO����3f��ӲeK�<y2'O�d���Z7}��7deeѹsg�:ڋ/����?�����׏?�ș3ghݺ�:����L�:����o̝;[[[�����…,Y�D��]�iӦq��!����)�K

��l�q9r����j�q�V�^=����f��<y2Æ
��wߥG�|��w�����O,Y�DM�Q���GE�uǀ�N�8A׮]��/ppp��ԔS�N1g��;�ҥKy���C(cV^�}����6�}�gee1~�x


9r$K�.�cǎ�������_3n�8���hѢ�^����F@@_���MzJ2OUW�3f�9�^����;�����G��3ϐ�����K�.���J�5�B�vR9E�z�mۖ_�oooz���o��&u����M۶mIII��ӓ_|ggg�n�J����3g�ڷI�&����)w5i�$Z�nMFF�'O�W�^L�<�+W�кuk��z�/��m�����___�/pK�'VC��W߾}�?/
�����"�0��֣G�v]��.]���E�l���q�…*���ӓz����=Jqq1�{��n]�<�^�zi<�޽;p�lwU�޹sg���Y�v-�~�-ӦM�_~���^��$�<H���՟����i�9V7n��O�T�Ҧ�B!��رc;vlM�!�c�ر���5F�S�o�-[����#�[���ihD�W�^=�}�Y>��S���z�*111�Ghh(����t p����l�s�O�/�����l,X��U��С��קW�^|�嗼��;���~��
ד���…x�4�67l�������9m۶��̌����}�v�nݪ�N���ĉ5ڕ�e�����燽�=VVV�lٲR����&֬YC�6m033�o߾ꍲǏ�0�1c�дiS���KVV�Ʋ��l���C�&Mpuu�;.ʵ*]�{�U��a��DEEѷo_4h����i��=jTL��cxx8[�l�o߾XXXP�^=^|�E�oc�u=�2�!����cƺ2�oY�֭���<���(�v특�9]�v%**�������>�7Ю*s��U�;���)���:�g�TaƎ�1��_|ANNÇ'""�N�:annN��݉����k���q����)�V���
�������ܾ}�v������…5�p���$$$��7r�����;�g̘A�Ծ���c���deeiL�`�F��_|����~�:͚5㥗^b�ԩꗖp?��nݺDFFr��E�+���WWt�'VC�З��3�W�&>>^-�������Ғ�C��^!ğʾ�)^+z_,�ɮ���(8G�!�6mʘ1cضm����������&�(	��5{���)(( 66Vk�sss&M�DPP���z�>US@��Uy~@�c���*Y��U�
!��P���5�B�޽{��~233133�}���9R��b~~>������q��U���6lS�LQ��/������o�>>��c��}������x��5�ޗޖ�sPP������N�"��o�e�Ν�;w���B���4h3gΤA��Y�~�3V�~�:�ׯ�СC0d��*�!����f��>|X��
<G}�077���z���E�j��ĉu�L ē@�d�M��)S��駟��~�,Y��ONN&L��ݻ8;;kUDW�#����9::�N������ִ^'Nd�…DGG�→7~�5p�@�6cbQ���[Zm�{��ڵk��'�yyy�z�j6o��￯.�Ν;xzzR�~}���RPP��X�=f͚���/hT$6����/����g������?��C����cƺ2�oYJek�k��������8p��{��<ֺ��G�t�ؑ�Ǐ����������{��ѻwo�
��e�8s�(ۙ;w��k�֭�￯��ye�t����$��GBӦM��jEff&����VVV̝;W��)S@�e̅�ƍ��ハ���������Ra��1�UW���Q�>�moذ!�������f^fddp��)�O�n�!��Z�j�O?���ӧ�n�O���kccCzz:111:K�U��'�k�.v��ѣG155U�/�����q���ɓ���{�Ν9q��w��y@�+���*}C�U�f����"''G�XNN��G!��*��(D�swwW���)� ~�����iӦ
�w�&55ooo���ضm��?00P�[�Ν;�9s�3gΐ���~9YTTČ3HKKS�fffBjj*���U��`����<y�+V���@�-���"  ��͛�`���]V�ZEnn��%��Npp�F���,"""�u���$�Q�����e���ddd�m�|�
yyyFŢT���նʌ���ݷo������Ӈ��$���Ϙ1c��/!u�Ã�ϔ��-K�jۡC�o�N�:u4�+r�{�9��ھ};���V�]V�iӆ�r��A"""t^/�?+\T6E�*�
��yqq�_?u�TV�^MHH�FrJ�)}���bee�͛7��ͥq���G�ʞ�oV4l�ЬHl]DZ��/�ߓ������9u���㌥�?h��º������[�zK_�,Mi/��uy���͍%K�Ûo�	�NyUє>�/]�s+{��{��={��^�z�V���t�QIr���@~~>������	KKK���Y�|9�=e��Z�&MbϞ=����I/���������Y��	�d:t(?��˖-c���<�쳜={V�����i�&|}}���cǎܼy���0�n݊���zG���	%%%\�tI����~�iF�ɮ]�())��㩧���t�R5�3g�����Q�ѐ�'L���'		��ۼ���nݚ��"N�8�'�|��SQ�� ��N�:���Ezz�V��\өS���B�'רQ�4ʩ!��wtMʴ����:�+����?���s�����c�u����HKK��ޞо}{����'))���hF��Q����x*�RHyM�F��裏�9s&.dÆ
|�����b�
�����v���V*QJ�ϟ?�#F`bb™3g�>}�Z�R�X+�	K߱�e�֭dddЪU+�,Y���gΜѺ�L_M�6��͛j�>�P���;�			��i.����INO,}�Y��o�ƍDFFҨQ#���k�UL�
��T�P��9p�@��כ6m*79E�M��Ģзoy�t�B߾}IHH >>�������Ljj*/��ݺuS�s\:t�@rr2�Ν�{���w�jTA��T�J��<�c�,X�V��.?��3�AS���cƺ2�oY����&2)��KJ-︌7�%K���_��oRXX�Vi�(9�Xƞ���?�x�Wi��+�;%7��G�$��Zo����ڵ���4�5i҄iӦ�PdO-Z�;C���ڵk��B��yxx��7���/����]a_ooo<HJJ�V"Y����3g���I�&ܸq�ѣGcccc��^^^�ܹ�=�ܿ�X6�.]����fT�f�ĉlݺ�;v�c��m�iӆ��~[}^U�[C�U߾}9t����888h,S.̗7�B!��Ǝ�رck:!�_}�UM�P�)�v��U�sE�
�}�6���\�x�A���ꊫ��F?�lmm����-bԨQ��Ɩ�pa��={��q�|�MΜ9Ä	ʽ۸,OOO�/5>LII	gϞe�޽���|��w@�N�Z��:x� ,P�������?x�w�E�*P�K�ʌ���=�<p�scYm۶��#ē�aÆܺu��7o\m��ٳ���;���F�.]��Fnn.�o��kiii���$%%q��Y�	hUKU�:u*			���п�US�8
=.J�˾}��JN���ٳ'#F� ,,���քm۶�I��>�,cǎ�m۶X[[ӹsg���ڶ�����<ƌuU���5��͛���	��)ɤJ�}����s����ƒ��Ư��J~~>666�Ftc�ј�Q�F���;^�%�<*�SBT��q/�|||�;w.�;w�~�����bcc��ѣ	7(U��g�̙�\���+W2k�,�/P�U#99��;�,,,

��Ņ��z��u�bgg��#.}1��Ғ����ݱ���N�:XYY1h� 6mڤQ�c޼y�lْ:u�PTTdt�?�0@g�U�Vѯ_?�֭K������bÆ
F���;�ȠA�x��155���;;;�z�-�nݪqgNU�oE9V���4h�@�����XZZ2t�Ї�B!�5���GGG���X�b���|��7,^�X�0{�l�իGbb"�~�)nnn���PXX���K�.��UV^���&Y�W~^��GY�f͢C��9s�v���]��(I�k׮��兗�K�,aǎꝻ啵�7��*3V�/_и���p|��5��nƌ����q���Ng�M�#ēH����ѣ�������Ǔ���G}T�4��t8Jr�l޼�?�tIII��'��>����7���z�������B"##���d„	��9.�Ǐ�O{�Ty�ȿ��/nݺ�Q����-]��
6p��Y>��c&O�����FUc�*Oqq1AAA�1�R�2f���U֕���s����5���͍��b�������W^y(��3�Ɯ?J�]bb��u�8q����Q'�SD�gjj�������ar���6m�U&933kkk�v+++�Ν�ܹs+\���NNN�y�EM�ӧO��8k׮��>�7f���\���+z��U�ܝe����l���@�cհaC���	&##CM�����ԩSL�>]J4
!�x��?^+U�t�����oҧO�����XU����Q<�1���E_�΁�)22R��ܫW/ƍWm��srr�W�^<x�����ӧO��g�ƬY��iW��P��G�J٩ V�X�ٳgiժ�}��t�ڵ���ʌ��ڲ�(]��ʗ6�>���V�q���a���p*m��2!���
'N�`�ҥ:T�w<22777�
Fll��>o�<RRR=z4~~~nc��:u���`���,55������iӆ_~����b������
�;s�Lu��K�R�N��!�<xxx�~�zV�X��kט2e��4-��^x��C�����v�*�z��˗Y�r%���̛7�Rۭej�{���|�.��\�T�/mժU��W�������=:t��^�Ժ�kc������ٙ����X�'''�e���c�ʕ���K�۸q�X�h_}���8�0����ј�g�ȑ;v��������o���x�I�!��1`�ٵk�n��޽{����|��G��w�UV~~>ׯ_��/�t��1�XM�4�-Z�����ccc�5��B�8{��w��RPP��ӧ�={v�w��W��b�9PN�<I`` ����cݺu�:u�ڶ�$KNNV�.���'99�u������U����
���ٲe�&M�֭[_��������z�X�~=.\�K�.\�x���@�ץ$K���0{�l����޽[�X��V�Z�ws���;wضm�
R�+3���Y�f���h�CiS��$�9s&�7&!!�W^y���$
9p�ӧOg�ĉԭ[�5��Ѭ_��nݺ�e˖&x���[ԫW���P,X�o��F~~>����jʔ����ʕ+8::>pڔ޽{ӣG�\��Nc� ���L�6
��d�S��q� ((kkk��݋��=�ׯ��ŋܽ{���RSS��?����#׮]��Ϗ�{���5����ݻw���ܺuk�~��o��Fqq1��=^^^Iׯ_�T|w��%33������	��̌��`��5ƌ�1�oyc��[oѨQ#8��ѣIKK���w�qQ���_" 7Q�T`�|E1/���e��-4���Jد̌�jTR�)^��R�bYJ��(�!��0M�L)��b��s�q��:������1�s>�9s<��y�ϻ���B<==9p�VVV�&�2p�@z�!***8|�0����>8�R-9�-9^x�����/�yyyTWWs��	fΜY�*w���m�$�!�w	myDD'N��G��ۛ��\���/�w���<y2�������z��{As�+KKK���HMM������RSS	����� �BEzzz��7L���k��݋��7n�P�d��)#�V����s�V���bŊxyy������wUU���~�Md2d��麦M��$�WVVҿ\\\033S�=������r�'��� IDAT�	�_�ΥK�x���quu%  @髽a�-o�R_�5���>���F�������[��Ç+76�<p�ʕVū՜cu���z
���p���������[e(�����CAAK�,����ɉɓ'�k�84tl;Jә3g�ն�ɑ��hk��������Ғ�����{KKK&N��Z������k�2|�pemI��ǏcccC�v����߿?6l�]�v�Z��=z`mm�O<���~��ѣ	`���@m)���Y�1͉�v:t(�>�(<��C<��cz}Z�@m����ӿN�>͋/����3fffXYY��C�ŋY�r��Uk��R�<���ޘ��ѡC�&-Ԗ0�ѣ���2��[��b�
�����9�7��fff8::���޽{���!))��r��ђcݒ�c��?�	�FC�عs'��C�<��;wҡC4
�{�n�͚5Ky=f�lmm[��ƴ�8����%%%�Ν;�g��N�8p ����$~��O	�Hr�Bq�

b�ҥ8LLLppp����F����Ӻu�F�3fk֬i�0�����W�<�����^��իW�x�bF�a��B�Z���M*5c�ڵ�K�.���K|��F�H������r���IR���.k����IN���j�Ǐ��ѣ	

����ߟ>}�p��q|||x�ǘ<y2[�n��‚W^yE�kgg�����${�u��eee���aeeśo�����2���SVV֤mե=d�ʕ������ÿ��oe��'\���s�n���À8�<.dԨQ�����1���3f���9r[[[�y��D��CǶ��j��E�6nܸ�I�{�ԩS9v�s�ΥgϞ���ѩS'&M��޽{y�t�������ܹsIOOgʔ)t��sss|�A�z�-��ߏ�����;���t��U系!*��Ν;�s�N~���[��}��Ш)Z�}_��B~~>j����z
��̰����ŅE�q��Q�Ĕ�n�%bccyꩧ�����Ԕ?��OMZn��lٲEI�����'���O?��7�dŊlڴ�U񙚚boo���aaa�:u��ӧ�j�u��X7��m�?��3|��7�������)���r���V�k�2{���O�7�8��5jyyy,X�@9^$>>������)!ڂ֍+%DImV!DcT*��Ch�LLLP�Tm�X5��e[~�vh�{��_!��>/^d�ڵ<x���*����%$$�����$::���4~��W���2e
������@'F����!��ϵ�Q7����Z;}��t����L�8���-��/��a����(//�O�>���6���5kHMM��Ã%K�p��
�j5{��333����6mZ�~���ZͲe�pqqQ~m�~jב��Mdd$�~�)���̜9���._��;�CFFfff�?��� ��zCn~_���x�駱��#%%E�f�ٳg�����ɉ��b����@S�!��Ǽ�����F�I�nݔ�=z���JBBs�̡cǎMyKDݜ��Mh2����鉩�)III��eƍ�$�@�y�G}����p���֌1�������]�l�ׯ��M.p���~���x�
ptt$((��_����~��fm��^�?� 33��ׯӿ|||8}�4j����D���Zo]�9V7377G�V�n�:���+***��Lhh({��i����qpp`���̙3��ݻ��o�q0tl����ɓY�f
�������l?33&M���#+Ľ��Ņ���&����Z��q��5�ֹs�f�lfee�OMMM�ci����r���c޼y�n�9�K]:t`��,X���˶d�-=F}�����?o�:}}}���Zs��1�,В�����)�m�{ܜ�c0h� �n���m7�X]�~��w�������6�8��ڒ@ڲ��3�[qN
a,��"n��cǒ��d�0�wm-G!�B�UTT0�|Ν;���8qBIL�������
����bbb((( **J'Y��~��7֮]Ԗ�hHyy9���Snh�?���xrrr������
���R����x��ԩS�\���ׯ�;�{gF�a���ӮQQQ���)}�]�F~~>���TTT0{��f�w]������)���O�w�}���e���>��ɉ��d�=�z�*�}�&&&����
�d�}�ر#�f�"&&�/��R��|FFP[*r����ٜs���|Ϟ=TVV�����FNN{��eƌ
�h��ݿ����{xx�����zmmmY�t)K�.m�������՜��~�`)����/��/ip[�m�cǎ����ws����j�oS���e���	�+`�oKXh�q0tl�����5*����h����Q.���9v��-һn
!��u�N�>])�(��?HY!�B!�B4�F��ܹs8::��ÇQ��:#Phm۶���B�B||<G�!))��Ç���Cjj*�{�277��̺� &M�Į]����лY{���8���prrR⍎���ёS�N�y�f��-[�x�"�
"%%����}�Ybbb�?22�FC߾}Y�n�r#S��n�:>LFF�r711��*r��}����śo����*((`���:t����v$������'�����_m"IC1��̞=+++���7n\��@Sϡ��,��?�6m!Ľ��Ϗ=z��h�6�F���>>>F�L!������o�>}�u��(%r��9E�Vl��`B���J��!H!�B�Y�%@�ܞ�����

e�С�1��˗��K/��OKK <<\)yѷo_��˜>}:�w�nU��'N��~��h�wذa�����/�o�>���P[B;�_hh(����I||<����_�[[[e������h4����0a^^^xyy�x�����)iӜ��
���@���6m�?��!!!�����Z�Vs���&�v�ҩS'�������СC���QVVF^^�RF�>�9��z�O�<	��c]}����#���YZZ��/��ӟ���ڵk���0rtB!Ľ�K�.�k�J��?l�h�� �)⎐�gB���OIl�ڵ3vB�VR�T�A!��̙3z?&J08{�,@��8N�:����Y����#G��������\�Ro�Gqq1P��Q�6���YiӾ0`@�b��������~��x@��d��x�
������f�ƍ̝;�JU�
�放�&Qh5g?���g������kKK��h����Cbb"������q��!�_���ѣ15��'��CM=楥�@m鏛i۴}���Gy���@V�^
��ŋL�B!D��ٓ��R�M�ƦM����$9E!��ƎKRR���B�ڧ��^ssR�vĔ��%n~�P"nc+���75D���L�8�~�����Ittt�G$�q�^[s��U*)))\�z�M�6��swwgԨQ8p��;w���dž
ضm�/fƌ����ꎚ�C��աC��&&-���ҥKf̘A||<dff�%}Ҝs���\�>�Om�$�qQ�T��.�B�Fڤs!��e�4!�B!��ճgO���t�o�ppp`׮]�������iU,666\�r��>�R0ǎ�i�Nkc�޽;��]�.]�…��Ƞ��Pg���-DGG���W�\�Ib�U����[}�˜9s077'11�C�abb˜1c\Wsϡ��]�,U�m�B!�B!D���)��k��z�-ۘ���V8y�d���6$))���lF��̙3oUhB�[���U�"!�e*�
�Fc�0�¨&M��?���U�x뭷x����X�j�^���͛7JPP�����g۶mlݺWWWeH�v��QSS�ٳg��ƍ�;w���{�����w„	l޼���p�z�-
Daa�oݑ;ƌCBB�W�&<<�Ν;�v�Z����ٳ'��׿��?{�lv��ͩS�ظq#�֭`ڴi�ԩS�߿??��fff
�_K4g?o��ޗx�iӦ���SSSða��ܹ�2��9Мs���|���?�3g��%�h�V��B!�B!tIr�F�ꫯ�����Ę�G�Ebb"555̚5�~�#B�J�
I.�h�$�L!j͞=�/���������s��?�����<^y�e��Ύ��R<==qpp`׮]:��{��̌���zc���c߾}�={��s����ի�N�_��W���8~�8O?��N�\���			a޼y>|���<�
������DDD��̈#ꍷ�����Rs�___�����C�@sΡ��1cƐ��NAA��{QPP`06!�B!�B��$��6�V�jb��Q�����e���X�b^^^��ƞ��,_����d,--oU�B!�B��TCߣ,--Q��DEE���Ayy9}����LJ�+Wbnn��!&&��>�����s�����1b���O�l�2֯_��穮�n0>SSS���x衇�eȐ!���ر#���|�8p�K�.ѵkW�x�	,X����ҷk׮�����Ç�z�*�����ߟ'�x��m:�g�}���6n�ȦM������Ԕ��$����ڒH�ƍ��ϯ��k�����Ҕ����Zy=~�x�y�΁�CM=�'Of͚5dff���Cff&666L�4��D�_�mYrr2*���a��ٳٱc���B!�=L�SD�К�=����X.\��s�=��=���l߾�����B!�B�[�K�.�\�R����{{{�v[[[�.]�ҥK\���;���z���h��N�

"((���	o�6BBB		�i����ã�m6g����o�io�w���<z��M߾}u��w4���skkkT*������@qq1ǎcѢEXYY5u�D#z�ꅷ����B�y{{��c�;��k�Bܛ���-�+ĝ$�)�ͻ9q�ƍ��j���KII	fff8;;3m�4�O�~K����Mdd$�~�)���̜9���._��;�CFFfff�?��� �/��YYYDDD������9cǎ套^R~��;����5vvv���`bb��?{�,���899�s�N���HHH`�ȑt��M�ףG\]]IHH`Μ9t�رU�Bq9y�$P���4h����n���IIIdgg0j�(y�S!�h��㩬�$88wwwlll8s���?���#mQee%UUU|��̙3Ǩ���g���h�d�F����^� �:cǎe�ر�C!D=�����B!���"�:QQQ���)�׮]#??���|***�={v������L��G899���Laa!W�^��>��Ą�_]g�w�yG��~��Uv��ͱc�ضm[��(Ϛ5������K���222��u�g�*++qss�[���999�ݻ�3f��!�'���*�����UG�%**���Djjj�5k...>�ء	!�m�ԩS��㏉�� ""Bg���.4Rd�-�[���Ņg�yƈ�Ԗ�
��_VeRSSY�v-F��^K~�B��M�R��h��׮];c� ��6�h4�u�:ѶHr���h�F֭[���+׮]c���DDD���h�ǎ�#�����؂��o�N�޽���cӦMDDD����'�|B�=زej�ZI����]���#G��w߱|�r~��g�m�F`` ���zO�_�|���6o�l09eܸq@�,�ۮ�-++K�S�M���n������+V��元����,_����d,--��B�6ѫW/>��sN�>Muu5ݻwg���̟?_g�G!��u���˗quu%44����;$y�Y�z5�/fĈF���%O�!ڲ�=�n���r�R!�12B�hk$9EE}�"7�J�������FCQQ&L���//�[_pp0���j��7m����BBB�ݻ7P;��Z������׎l2t�PBCCY�x1���'00��6;uꄗ�qqq:t777���������Z�q��ɓJu���G����c�R9����X.\��s�=��=���l߾����z��B!�����J%70D��޽��!$�����m���^;v�0vF���-�i!�B�V��"�:K�,�7� ;;���l6n��ܹsQ�T���ܛ�P^[YY)������
=M?j�(�imi�s��5�]�����͍C�q��uF���i����R:v쨷��M�Gq�x�"k׮��TUU��쌯�/!!!�������h�����_���gʔ)̟?sss@7)���17n�@�V�w�^JJJ033��ٙiӦ1}�t��M��nLj��e˖���¦M���ҥK�_����t����8q�r|�*++#!!��#G�<�ݣG\]]IHH`Μ9��B!�B!�B!���$9E��7>�sC��ݝQ�Fq�v��I^^6l`۶m,^������С��v�&-�M$Ѻq�F���ҥ3f� >>���233�����4�.m����TQQ����u�N�8a0񢺺���
����bbb((( **��״����"..N��v�������SQQ��ے�"##)++k�D@YYs�Υ��Xi��/�����g�*++����rss#''��{�J�4!�B!D��<yR���������jr�!ׅ����5ߘۖ�!�mɭ�+%�bkk������������Ǖ+W���4vh?~\g��ѣ���O��Ι3sss9t�&&&�3F�ߵkW�儴m�>B�{�F��ܹs8::��ÇQ��6�m�Faa!C�!>>�#G�����������!55�M
���mU9���֭[��Ç��� 88����f�VW߾}�����7�l0��[�R\\LϞ=ٲe�r����{��YYY8Po��M�G!�B!���W_U�ov��Q���x��X�l�֭�رcw8B!��JC�|cn[>o�B�52r���L�6���b����:u*���租~�������z��y뭷x����'<<�ɓ'+}ڵkGMM
gϞ�W�^J�<��i��㏩��aذat��Y�?`�Ο?ϙ3g�PΜ9��B���i�=77�����СC1b˗/祗^�韖�@xx8���@m�GXXӧOg���z�vZ��ʊ��r4
EEEL�0///���Z����N���8p����������_��{��Iz��>}���B!�5���m�����d����������
�WUU�b�
���ppp��ӓ�˗����`i!�mS}�|cn[>o�B�E��"�:~~~���ADD�μ#F\����Z�)��.]�����6h� f͚�L���QZZ���'�ڵK����Krr2�[�`̘1���SPP����B��	h?��N��k�ٳg���0��S�N5�����s��u�]�f���իW�~ZK�,�7� ;;���l6n��ܹsQ�TXXX�*6m�Hc�%���;Z73���R:v�7Oۦ�#�B�kv���;��B�hN��Ull,.\��Sڞ�y�o�Nll,���F�N!v?\���y#��-���&4�YOOOLMMIJJ�����={2n�8���nW���믿Nvv6]�tᩧ�b���:O�/[�����s��y���u����V^�?^g��ɓY�f
�������������ƆI�&݆�B�7_���%���Fg�]�v���Yyyy��;u�Dii).\���Io~II��O��ݝQ�Fq�v��I^^6l`۶m,^��3f�8����Rw�7o��T�O�q31ѯr�m3tl�B��]c��Bq��x�"k׮��TUU��쌯�/!!!����J���IKK��_��ޞ)S���S�!�������HHH`�ȑ:�Y{�聫�+			̙3�`�B��~��6l�@VV������___�N��ӯ���Z;}��t����L�8��bcc���^�������t�Ё'�|�%K�(��ܸq�Z�޽{)))���ggg�M����[�5_�Z�V�l�2\\\شiS���jol���F!��F�SD�g����G�O�7�lK�7��S�N�Y���m������np^^^P[j�o߾:󬭭Q�TDGGS\\��4...��� IDATرc,Z�++��-��;��ٓ~����<}�Q�]{ͨ���3gΰk�.e����۷/�������(%�����nkk�\��ꫯزe���JrJkckHϞ=)**�o����Mi׎,UW׮]9�<�/_�+�v��e��Bq��9s��C�3v�X�R��m���`����(�'N�PSꪮ�&  ���B�������


���2����g�*++u��h�������޽{��NB!jG������ŋJ۩S�X�r%ׯ_�g�jv�7o��@+���牏�'''������-Z��t��U>��nܸAhh(QQQ���)��]�F~~>���TTT0{��F㏌����L'I�V�!�y#�����ے⎫���ҥK|��̙3�`????z��F�Q�4
���ܑX�w�vT�U�VQPP��A~~>�V����ʉ'�~�:�.]����Օ����vtm�����غu+���+ׯ_�…l߾��>����zJYfڴi������SYYI���qqq�)
ԜؚKOxx8�|�
���~�-o���^��-�T��M�G!���$''+eD��_rr2G�1v���s�����HLL�F�V���m�6
2d���9r���$�NNN������L����tVV�[��M�G!D�-[�p��E
DJJ
<�����(����(**���I��GGG���ȩS�ؼy�޺{��MJJ
YYY̝;��Y)))�[��Ç���App0���@��|��}����śo�y�[>o�B�md�!ڐ�%|\\\��~���$,,��_~YI`IMMe�ڵXXXܑX�w��ٳ��/���
�fR���?���zIk���+ʴ�����xzz���]��>}:���';;������_oO?���u��Ϗ��p"""�����;bĈ��\>>>|��W�<y��*�'O�KB3f������ieܸq-�E!�h�4
*���aq_h�S����jo�ȸ͡�	�СC���/˗/��&--
�M�wttjo:���1}�tv�ޭ�y0��ɓ@��Л���G��B�m�:}��A^{�5z���^����h��6���^|�E���G``��2AAA�:gϞMLLW�\Q�[YYQ^^�F�����	&��兗�W����ir�꺚�߆��B��JFN�
�֭:t`̘1�Y��������G!00�իW�z�j/^�wsUq�1􄅖��%j�:w�)...ʓu������J�������ckk˄	ؼy�Έ ˖-��ɉ���S]]
@���y������ưað�����[[[��܈��$,,Lu��ӓ�+W��bnn���9�������o�(��277G�V��兝����L�4���ɓ'ceeEff�޼��Llll�d�B!��&m��?��n�7�h����*��	)�N�jp[���t��Qo��M�G!D���h|t���b�6!�.�]�������׶��ܸqCi[�d	:t ;;���{�Y�f�իW��6����߆��B��JFN�jm���ݻ��_�R�ӎB�g�t��ʕ+u�JJJ����i���e�ҥ,]���u�������޾}{����nr|xxx4گ��5t]�o���5����0������F�RMqq1NNN@�ǎcѢEz���B!�����k�Ŀ�O�ק��Fg�n"~}}nV^^��|�:ML�ԶڮBK[�N���X7��fu�Pڎ��;�F���ܹ���<6l��m�X�x13f�ht����RSS�lS��X]��o��B�V��)B!�]b��񸺺���s��nܸ��ӧ�QIn~�O4��Ϗ=z��h�6�F����^�!!�B���׎N`
�S�߸q�7o�����Ԕmh�$%%�j=��1�㤤$%q��c#�M={� //O���iv�ڥ�zY�_NNN���ڵ+�/_֛�m�BQ�{��@�Si˭;vL�];���7���-DGG���W�\!22�E��&�TTT(m�����m�|�!�h�$9E!��KL�:���&N�ȣ�>���7�����ٱp�B#Gx����$,,���TJJJ())!55���0,,,��Bq�y��W�={���P4'���*���X�dI�7��-**�.;�6��ѣDEE��k��l�2֭[�wSK�۴�<W�ZEAA������Z�J���?@hh('N���\�t���WWW��ڛ��R@����RBui�ZS�T!�Ecƌ`��՜?��W�������ʳ�>��0a���?~�?����Ǐ+��q��5{�ӦMS����������G]�{ͯ���;v젪����""""Z���y#��n"e}�B��DPP�z����?����TWWӽ{wF�����֭��C�+=��#�z�j/^l���B!n���tc����x�C������o�Ejj*~�!�>���E*++y��w���WUUU�X�///�ijOOO�/_Nrr2���F�P�	�g��/�����߿�����8p��Ǐ덴haa�+���L���QZZ���'�ڵ�1cƐ��NAA��w����e7O��^�׿����4�?��O?�3o���k???����ٳg�;w�N�^�z�5������DDD�%�Խ����g„	����f�֬Y����^���|�!���Hr��#fΜi��mXrr2*���a�y&&&�T*9V��W!�B��Ċ6Cԯ]�vt�҅�^z���T���[c�Ԡ�#Gr���߯�q?����…<��sJ���?��ۉ��%00Ј�ݟ�q����D�VEFF������V�\�������Ɔ��>��#���υ���fĈЯ_?��e�X�~=�ϟ����ɓ'�f�233�Չ#33e$!�h��q��ڵ+���DEEq��a�^�J�~���'�P�u�ؑ��X>��8��K��ڵ+O<�,��ֶ������Ԕ��$�����rp�ƍ���O�g�_�W^y��Ҩ����Օ+V0eʔ�|�!���Hr���z�ꅷ����B�q���<��c�C!�B4�ŋY�v-���
ggg|}}			to^TVVMZZ���+���L�2����+7~��0u_���W_}Err2'N���ի���3a�����ƍ��j���KII	fff8;;3m�4�O���xLLj�'���4gYYj��}��q��%���8q".�[��_~aÆ
deeQ^^N�>}�U�>�g͚5������%K�����������=��r\�o�on�Ngggɧ�~���)3g�$  �˗/��;�����Ǐ'((kkk��VVV�j�*��ӱ��`�����t��U�_c�Tݸ�j5˖-��ŅM�6QVVFBB#G����G���������9s�رc��X��t��ʕ+u�JJJ����i���e�ҥ,]���u�������fmm�J�"::���b���(..�رc,Z�����Bq�rtt$<<��~�:u"((������7��v<<<\��k~}۰��$88����F�7e���F!��D�S�m5v�XƎk�0�B!�B�B̟?�s��)m'N�PSꪮ�&  ���B�������


���R�:Zk�ƍDGG봝?����\�›o�	@TTqqqJ�k׮���O~~>̞=�����X�v-ӦMk�oyy9���S����ONN111�
���R����x��ԩS�\���ׯ��3���{gF�a��,\�Pg^�^��?>6l **��8�����L��G899�����W�^��>��Ą�_]g���P233���;v��_��h�����S������)�({�졲���0�nnn���w�^f̘q��h�ƏOee%������cccÙ3gx�wx��o�������h4�=�F����^� !�����F!D[$�)ⶊ��oяzB���J�B��;!�B���s��������wH~~>˗/�…:}�m�Faa!C�!$$gggΜ9Cxx8999���2}�trss[]Jh�����3�Ю];���Y�h���(��֭��Օk׮�{�n"""HLLd���M����*Zz� 7������'''�z�-Haa!+V��ԩSl޼Y))�e�.^�ȠA�������=���׿���1��I||<}��eݺu������/���?f�ԩ2���������۷ӻwo���شi�����'�УG�lقZ�&##Co��'O�q�F��w�}NJ+(..f�֭���@�ϩ����KLL�2�JVVԋAۖ��%�)m���k�Bnn.S�N��?&""�����vvv��n.KKK���x�嗙3g����]��[�-!��Sn�uZ��|�!�h�$9E�III�Aц�OIl3g�4vB�VHNNF�R;!��-껩ps{nn.���jG�:t(#F�`�����K:��������Mc����޽[/���222��������?���믿jG+Ѳ������FCQQ&L���//�V�p��	��߯7�z]��߰a�		��_d߾}Jr��x���ի��\hh��ukSlmmY�~=��������|�r�͛���w4
�۷o�N�L������M�6����z��
��9sP��\�|Yo���PF�	�СC	

%00����+�)-9�|||t��<y@���>}������� z������ӧ����{��=�����}�Uy�Y�z5�/fĈ�|;B!�o�y#�����qGx{{;!D�c�c�p���K��B����y�nj�Bݙ3g�r�~�>{�,P;��!�N��eq]�x�W^y��No^MM��zɒ%���dgg����ƍ�;w.*��YO��}�����#G��������\�Ro�Kqq1P��R��x����J�����S||<eee���o<���:t(3f���?f�֭���7i
�g�[����ז���.s2���-!ՒsJ�p�UZZ
@ǎ��j۴}����'�MLLP�Tw<��B��EF8i���F!D["�)B!�0v�XƎk�0�B!�u�M���ة��Ю]�F�ܬ�&������w�ѳgO���?������F�swwgԨQ8p��;w���dž
ضm�/nQ)kkk&N�H�~����$::��#�ܸqC���1m�J�"%%��W��i�&"##���#==�?��'�|��~555J,�����С��v�&D������.-9�ꎚRw;��Ҷ5��!�B!��~��"ڼ��o���$���5j���B�H||�}U�H�{�J�B��;!�0��={��?���ǣ�>������upp�̙3�ڵ�����[LLvvv)��LMk
������
�ꫯزe���-JNѲ���ʕ+��qtt���رc:#r;v@�8u�ޝ�~��S�N1hРF��t�R���Y�v-6����5���AAA�����o׮555TTT(�v+G��ٷ�~�3"�����֭8��v����|�2]�vՙ�-7ts�B!�B!ZN�S�h�ѣG���"11���f͚���Ç7vhB��TRR��CB��$�	!D�I�&��?�j�*�z�-|�A���;V�Z����g��̈́��D�������ٶm[�n��ՕM�6�M�8{�,�z�jq|���'�����7�|Si�r�
]�taڴi�ԩS�߿??��fffJ���s��
Ν;�{�����;a�6o�Lxx8o���
���P9~�ƍS��3���V�^Mxx8�;wf�ڵ$%%ѳgO��������޽�S�N�q�F֭[�`�'Nd���ddd�ͳ������;v0c�JJJ���hp}���[o��o2`��?��o�
�3�KsΩ�0����s���$m٪��RB!�B!D�$9E�zTUU�b�
����'�<==Y�|9���
��B��x{{;!D+�ر��!!D�0{�l���~��G�������ρ8~�8>>>:�,,,x�W�im"���'�ڵK��vd͛iGڜ0a�w�f�ʕ�\�R�߉'pss��Ϗ��p"""�-F���x���48��Ϗ}��q��Y�Ν�3�W�^:m��_IKK���<���:},X`p��۷'$$�y��q��a���6lX�����Kee�N��	HIIa͚5�Y�77����
�;��� ڜs�>cƌ!==���������M�Frr��CB�z%''�׿�$''�$�
!�B�j��"�c��1$66�.��s�)m�?�<۷o'66���B!��n��3KKK�j5QQQdddP^^N߾}���a�ʕ���+}mll���ᣏ>b���\�pkkkF�A@@���S�.[�����s��y�����k����Aff&ׯ_������p��i�j5��������鉩�)IIIJٟ�={2n�8���Z���)vvv<��C���2dȐz�v�ؑ��X>��8��K��ڵ+O<�,���V�۵kWbcc�������\�z�~������O<Q�6�ʳ�>KJJ
7nlt$�nݺ�x�b��贿��+������FUU����X��)S�4���
		�������cccäI��C�J��S��<y2k֬!33___�y���ʶŭ%�����ڱc�<�!�B��J�S�]i͚5������%K���$::���4~��W���2e
�����ܜ��2�~�i���HII���DY�ٳg�����ɉ�;wRVVFBB#G��[�nJ�=z���JBBs�̡cǎw|߅���$�z����{{{F����?����l{��ɓ'�>�zRR����5J~LB!��ҥ���$%%%������ڲt�R�.]��:���qww�ko��#;v$<<�༅�L{xx���q[�i��N�

"((����ݯ��BHHH�}�5k�f��i���$88�����Wߺ��^wZ[ʧ!M=��۾��5*����h���qrr����cǎ�h�"����C4�J�B�R;!�����1vB!��Hr����{h4���X]]M@@���J���bbb((( **��;2k�,bbb���/u~`���?~<{�졲���P�nnn���w�^f̘q;wU!n���j~��gRRR��/���b�С��W_}���t���u��Q���HLL����Y�f������Í�B�V�?���J���qww��Ɔ3g���;����9B!����g�}�F�Q��4
z�D�<x��k�;!�h�رcy饗��'�!Ľ륗^b�ر�CL�"D��F��o߾�[�Ny�i۶m2d����9r�III>���RSS�ں�VVVl޼Yg���m=鬬,���M�G!����V'khב��KVV۶mcԨQTVV�����[���JOO7�v����X�b^^^888��舧�'˗/�9FB!�j�ԩDDD0q�D}�Q���������No�!�"KKK���HMM������RSS	�������SΞ=Krr���B�%''s��c�a���r�B�{Prr2gϞ5vB(d�a��Kj�{S422���xlmmY�~�N
4��Õ�}��%,,��ӧ�{�n�O�N�N����"..�C����FYYyyyJ}j�-%лwo�����G!n�;YJ�C�<����{�������]�v��2@ll,.\��Sڞ�y�o�Nll,���F�N!�0��� z������ӧ����{��=�����G�-{�Gd���,^�X�m@�zIII�A!�5{�lc�`T�FJ�	!�=�]�v�A��"���������o��(�Y��?u����LJ��Dbccqss�СC\�~�ѣGcjZ�_�����W~3m���B�)7'�ܸq�Z�޽{)))���ggg�M����ӛ�^333���			!##CIN�y{�i�ZͲe�pqqaӦMTVVMZZ���+���L�2����cnn���_~��
6���Eyy9}����Wy�n���1����V�ٷo�.]��ޞ�'��1E IDATp�Blll������s簳�#%%��w��Y<==qrrb�Ν�������ȑ#un����WWW�3g���!��~abb�J��� �B!�Bq�Ir�0��Gh�H*�����^�ʦM����T����4����r�u�.]�1c������	����7����K-m�d
!�-**���8e�ڵk��瓟�OEEE���>|8��}�}###)++S7���	���P�SRRBLLDEE)����R����x��ԩS�\���ׯ��3�Ի���r�͛GQQ��v��y������!&&F)�vs�cǎe̘1�����_����іv?~<{�졲�777�������a�޽̘1��c%�B!�B!�B!@�λm�ҥK���:7Aصk���z�rrrt�5g����ILL�СC���0f�e~׮]�|��^�6m!�0���֭[��Ç��� 88����݇UU��b"Hy��~�9�x�ƌ�d�EM�Ԍ� �mE��9�d\�QSD����
0e+7�SzbR��d�k��A�<��ɐ:!
�����׸ـ��.�k��z���k����>����Fm�G�|�����uww'77�7�|���
y�Gزe�ӟHOOg�ȑ:t�;v�~��ǜ;w��~��۷��~~�����X*Z�q�M�6QTTD�~�HJJ��$&&ҷo_N�>�ƍ��u֬Yt���&�R�b)R���`ذa6۳�YbDDDDDDjS�t���鄅����DD�H}���H�Rq��+�f�b��lذ�h�g�����ɓ����?����x{{�p�B��<��L�4��?���/���x�X>t�P���mr��YbDD�������v��b6�IOO������>|ت �!~��cz��̞=�j��={����';v��ݝ��(233����k�1`��v�Jdd$���}��ݷop��1b���<��DDD��_ԛ��O`` ��_���/���;vggg����}11p�@��
4�*FDDDDD��W_}�Α,�9B\\���K�.e�ڵ=z��3��"""�O�)Үt�ؑ��:t��9v�s��eРA?~�ٳg��O0a�6o�L�.]X�d�Ͷ�̙cLt�>�1�JAA��z���눈��ŋs�}�����|����IJJ�ʕ+�ޖe���ݻ�6�R�aq������
j&O�ܜ����o��V�WRR���>j��c�Ym��\gϞ�}��Grr2_~�%?��O>��Q�s���u�f�=K�%FDD���5k:tЏ~��
?[�l��%/�,;;����*V�XA`` nnn��ۗ���/_NUUU+g)"roS_-""�n�x�H+�u
��1b?���پ};6l >>����裏طoeee�S�.4F[��������Z6a�V�^MNNs�̱Z�������Ǐo�Q��ت�YFIiH������ѣ�����O?�رc�_����BCC�2eJ���������6��QS�Я.�.]2^w�С�95ԍ7�\V3�=z0e��l�BAA999�u��%G�^K[K���HkѰ�"�o���N�]h��(99���2f̘a�͜9��[����LHH���������"""-I�)����nDD�1������1dCXF]8p ���V˜��1�L$&&RRRB�~���O�=z��i��ؓ��+������SXX�޽{��㏉��mpqʵk׌�9}}}��������ܹ77�zcz�!����q��i~��F�o߾���G��'�0�-ê�n�AAAl۶���4���K��z��Iii)�������j���r#FDDDDDڿ7n�����ݻ9{�,���xxx0i�$c4H���Jٳg�}��z���g���Fa|��Z��w[���2j�(z��m����oooRSS	

�uG�{ݹs�X�f
���
�̙c�#����j��K�)rϩ������?��y��6���|��g��f���0�͸��1{��V�WD�.�&M����e˖��/0d��������x������_�a����k���DŽ	��3�<�ƍ���$<<�!C��ߓ����͛�&>>�9mZjj*�V�"::�x�5k֐��N������������3g�O�����q�F��������?Laa!������|�A&M�Ķmۨ����G�0�:���R���m�P������jڴi�NA�c2�0��NCjǦM���׮]#??���|._�̬Y��z�*.���Ј={�,IIIW���v���e>>>:t�ݻw7jL�{��˗�?>�|��v��I��WA}���H[�����:����''N�5��ɉ��(-Zd��ر�5k�ХK�V�UD�>���DGGCLL��2//�Z׹�ɐ[������6�����s璕�����m���t�’%K�����/سgǏ�g?��U�K/�d��޽;.\   777v��Ipp0_|�gΜa޼yV�0���>s��!##�-j3f���؜ǂ��Z�io�f3&���i��,�
�6m߾��k����͵k����$&&���4��/%%���By�"""��𠸸���h:Ď;�<y2��uڋ��\�
f���-77W7<EDj0��|��7��ۗ��z�aÆ�������)++��U_-""Ҷ�8E�9�{����ooo"##�رc���?�8!!!�Z�
����:o����	���7  �N�:���NQQ���gܸq�v�Ν;���ƓO>IPP=�P�rvqq!))��>��}��QVV���3^^^,\�����={�$99���8<ȕ+W<x0s����?���t�R֭[Gii)W�^�[�n$''�_��_deeq��yz��ɏ�c^z�%\]]������֢E�	&�z�jrrr�3g�ղ��\\\?~|�Α�����ت�x�f{c>'5V׮]�t�f����"|}}	$00�*nϞ=DGGӷo_��݉��b���dff�Lt�S�N7���iРAV1""mE[���@dd$#F�n>��|�r^y��X��"""m��S䞓��٨x�ɤ'
E�M�탾��?���MZ���Է
WWW�����v���Kttt�1~~~���ٴ������ӭ��v�{��1��
���V˜��1�L$&&RRRB�~�())��ѣ,X���]�ֻ}i/^�o�A^^yyylذ�y��a2��F�=s�@���N�>]�~.\��,����f���L���c�Y����j��M�)"""rϨ������?��������`>��3�f�Qc6�qss���HDD�^T�0�]�vZ�	��:u��C�6y���t���=z4ӦM�S���uj^���[���ϏѣG���ŧ�~ʱc�X�~=)))���S7TWW׻�K�.ջ�C�888�,��YbDDڊ��O[��k�3�W����m*N�{ƭS�xzz2q��Z㜜����bѢEFˎ;X�f��ӓ"""rwy��W���n�
�#G�GZZ���L�>OOOF�y�3�;����������{����k����Q\\�Ν;qssk�>z��Iii)�������jYyy�#""������p��1��?��h���{+��"""m�m������]�w���w�}�3�իWӱc�:c�qBBBX�j�V�"44��!cEDD�E�n���m�c���M^����+V���}��%  ��˗SUUu��;iҤIx{{�m�6*++2d���8::q�<�����<y�~��������ooo.\h�Z���L/#2Y������9�6��ܭƏ�;�CAAׯ_'??�w�y�&V}���Hۦ�S�Uddd�;i�222�:u��Ӑ{@fff��M&&����i��9l{{���LYY3f�0�fΜ�֭[INN&$$ĎىH]������&&&����e��ϝ;���,�?n3�g�.]X�d��{��\�p������عs'cƌ!;;��������ƍw�OD�ݛ5k��9����ܹs�U_-""Ҷ�8EZ����{�,\�q�			�޽��g���與��&Mb���wd_yyy�������t�ԉiӦ�p�B���y��wٿ?���<��S������l�~nn.111�ٳ�Ν;3v�X^y�z��ew�kggg�w����qp���gΜ!  �~���駟RQQAjj*�F��w��F\�>}�&55��� �u�֬s!r��G1\@@�:u"==���"���ƍ#88؈sqq!))��>��}��QVV���3^^^,\�����K�.eݺu���r��U&L���ի���aΜ9V9������b� "�V٣�vrr"!!���8���ϥK�pwwg��٬\��Ν;��EDD�6�H���""""""w���86m�d��v�������s��ef͚��}���{l߾�x��Gѯ_?222(,,�ʕ+|��g888��[����s�N#.33��G�������k���>}:III������h߿?O=��v���m���p��!v��͔)S�qD���������8WWW����7���Ϫπ��n&����DJJJ�ׯ%%%=z�еkצ���]�G��\�Ҫ��ٳF����j��K�)Ң8��5k읆���'WEDDD�����]�ooo�]�Fff&111����Z�r�H%5�TnAA[�ne�lڴ���xbbb����w��}����?&!!�(�����Q�8q�˗/��o�%%%���>l3"Lyy9���lܸ���˰�6�f�����\���ゃ����0�̈́��`6�qss��~BDDnzꩧ���dٲe������Bqq1�.�=��ݟ�j����iQgΜ!##��S��;i�222ptt�w�"##��)�H3�����U,R���‘�]�r��%�f3EEE���H``��oٲe2�9Jg||<���?���`����@yyy��[F61b�������o�>BBBj���O`` �6m��/���LJ��
�;fp��)#�[
4�*FD��b��h��)������bѢE�c�֬YC�.]Z5�;�%��^x�m۶CLL����ݻ���/��}��i9*N�V���n�D�
�ü�ӦM�w
""""w��ŋy�7���#//�
60o�<L&S�_�7���СC�׷����a�vrr�s�ѣG[�9r$�|�M���={6iii$''���×_~�?���O>I�N7�V�p�ݺu�Y��f��{��?NHH�V� 44�(t[���0�?����/W�^塇��'�d��������S}���H�Pq���H+0�L�L&{�!"""R���"5�������G�&++�O?��cǎ�~�zRRR

�#���w�}��;884h}K!�ō7�~�=�2e
[�l�������_S�t�С�mY�,1"�x�=�IK��C�۴d?���`�~S}���ȝ���Vp�֬Yc�4D�;v,����is\]]���ߟ��B�����Lll�)Ni��Ǐ[
9��������m�6�����/qpp`̘1��={RZZJyy9={��Z�2�P�v�{I�/�G�7'xzz:aaa���i�"��3gΐ��a�4D��222�ӟ�d�4DDڜI�&���Ͷmۨ��dȐ!xzz���h��nz��)((��9r���h&L�`�XF79s�պ>� �&M���?��ŋ��G?�0�[�*..�ٯ���i�DDDDDDDD�59E����*��ٵIx�����HKK�����ӧ���i�Y."R���o�fͲw
""mRpp0������c���˫�unŤ6wzx�=z0w�\���~��ӧ�w�΅��͍�;w��̙c�:���1c��Φ����x

j]GDDDDDDD�^���:dgg��^UUŊ+���
����/_NFFNNN��������H�hLqH@@�:u"==���"���ϸq�n�%66��_���<z��O~��ϟO�Ν���K��n�:JKK�z�������맞z�jل	X�z5999̙3�jYNN...�?��J�}��N$"�V�L&{�`7�f��"""ҢT�"m�剹;�d\KHNN����3fm3g�d�֭$''b��DDDDDDZ^m�����oҺM�ol������ի�ݗ��~~~�.;v�����j���3&����DJJJ�ׯ%%%=z�еk�z�-r7;v�F��va���N�.�G��ܽ�x�	{� bPq��y�•��Tbcc9~�8��w�=��/��������D����w�}G�^�x��筞����d׮]��曼��ƺ��9˗/������>LEE����5�޽{1}���ۛ��T����֭[���75���v��ߺݚ��S�������0z�h�M�֬퉈������J������

�5.88��>���Lxx8f�777fϞ�j����������E*N�vc�����p��~���q��
"##�z�*.����X��ٳ$%%QPP@\\,[��#G���{����E�>}(--%&&�޽{aU�r�]�vQYY�����2:��ݻ�2eJ����ȑ#��ő��Fuu5ӧO��ӓ�#G�;5�z�:����''N�5��ɉ��(-Zd��ر�5k�ХK�V�U��:p���v�d2a6��F��D""w/��|OO['m��S��8p QQQ<��C$&&���ľ}��└�
y�G�����Ã��b���9t�;v�`���t�֍7�x���V�\I||<���:�/_����ՕÇ�:R@nn.Æ
���Җ����iwb곆l�NO�VUUŊ+���
����/_NFF��X""""mM�޽)//��ۛ��H:v�Xg��?NHH�V� 44//��JU�ͫ���w
""u�׋�t�RD��ӡC{� bE�)buM/Q�������Ɯ��f�"))��/���@tt4}����ݝ��(&O�Lff&�'O`ԨQF��/�H~~>3g��?��?��ԩS��B��
d#"�wj
��$99���2f̘a�͜9��[����LHH����]s�����lT��dҍ�T�"톇�������7nmgΜ��߿�O�>m�>44�?��O����������6�.Э[7�e�6K��ȝV�p�ƍ$$$�{�nΞ=���#L�4�(ƻ��Mee%����ٳ���^�z���3�|:w�l�UTT���ʨQ��ݻ��ާO���IMM%((��~UDDDDDDDDDDDD�*N��yó!7B�׵
Cu��a/]�Ԙkeٯ����2K�����ǦM���׮]#??���|._��b��^�z��RXXh��={���$


���3��]�vQYY�����v|||8t��w��th"""""�d�5e]#ߪ���y��)�j�oȱB㎷1�l/���<om]zz:yyy�=�iӦ�9#���յ"""�2T�"w
777���ٹs'nnn��_�n�O���������8����]�gϞ���R^^NϞ=�����1""�a����]�ooo�]�Fff&111����Z�Rח����/%%���By�"""��𠸸���h:Ď;��[rss6l��v,m���*N��W_}����6_�ִ��v�����HKK�����ӧ����ȑ#흚H���յ"""�rT�"w�g�y��7Ixx8C���'%%�͛7���M||<_}�[�la�ȑ����֭[7n�F�n��R]]͙3g0`C�������b�"���b#FD���*��^ۇ�]�r��%�f3EEE���H```��j�g�����۷/���DEE1y�d233��S�N0p�@��4�*FDDDZϬY���O읆�=!##��d�4�j/�
���m�֔Q�o�1�l縶��VUUU�b�
���X�|9899�9C��U��kEDD�e��M"�N͝;�A�q��qfϞ�O<��	ؼy3]�taɒ%TTTE׮]y��7�ԩ���_�����fL IDATݻ7���8q"cƌ����f���q�Ƶ����,^�����<>���O�NRRW�\�s�Ç��gΜ���ooo��R�r��i#�…t���f;�6K�������S�2u�T{�!rϘ:u*O<��h,�-D��JNN����3fm3gΤ�����d;f&����O�ZiY9Eڄ;�4���III|��G�۷���2������b�…<���������oO���ۗ��p^�ubbbx��Y�t)�֭�����W�0a�V�^MNNs�̱�NN...�?���""���<������ѣ�����O?�رc�_����BCC[l�����z�_�t�xݡCl�a-m�i���NAD�IΟ?Ϻu���Φ���g�}����Zc+**HHH�/�����Ջg�}��_~#�ƍ$$$�{�nΞ=���#L�4�(�o���`�����ҥK���$>>�h���#66����S�NL�6��R^^λ����qtt䩧�"<<gggc�{��%##��'Or��z�ꅯ�/!!!t����&sSGGi�q6F�\�Ĺ���$11�={���w�ѫW/��y�ϟO�Ν����N�w�nw����X����%&&�={�йsgƎ�+��B�^���}RSS5j�{�6��郷�7����P�H[И~�!�y]ׯ�����i��@\[���+aaa���չ���~���~ۦ��?�)?��O��~~~���Y�8;;c2�HLL����~��PRR�ѣGY�`��!SD�5������?����ݻ��?�����+Nqss�����;wC�֥gϞ���R^^n3Zyy�#"""�G��"��d2a6��F�VQQ��y�())1�>��s._�l{��%^|�E�������R�l�¡C�HJJ2�����cӦMFܵk����'??�˗/3k֬&�ۘ,bcc�����)
��{�}�v�G}D�~���Ƞ���+W���g����믿��
HLL��Vii)���\�x�7�|�I����l�����W��p�B#��ٳ$%%QPP@\\��Es~'{Λz<�.;w�4�2339z�()))����k�.*++������LJC��{���A��zM6�:��������F
��>�l6��l��͍ٳg�9;��L�4����-[�/���!C������c��g�a�ƍDFFΐ!C����IIIa���x{{�СC)--���ئ���؈��5y�dL&����'4��A�m޼�������[o����'����\��&vӦMѯ_?~��_3l�0
Y�b�O�f�ƍ����k׮��ۛk׮���ILLiii����5�ŭR5&www����F�SIoݺ���i�&��㉉���ӓ��w��Ӈ�?�������o��u�V�-[�ĉ�С���,X����#禎����l������
y�G�����Ã��b���9t�;v�0F`h��D]�!�N�ŁX�f
�F��ĉ,_��o���������0l�0��-m�����.mVC��^�u]��VDDDZ��SD��ɉ��(-ZDPP;v�`͚5t����ىȽ$88���hbbb����Z����b��;w.YYY?~ܦ(�K�.,Y��x?f����)((�ɩ���q�ƵX�"""R��S�2u�T{�!rO��O�B�UW�G�Ç���@DDÇn~�կ~ŢE�����@dd$#F���G%""�_��|��ƍ��]�r��%�f3EEE���H```���19X̞=ۦ0n:2�9
O||<���?���`����`�P	��~���9q������ꫯ��X[�8����bϞ=DGG�|�����ɓ���4�S��;��s���u}�(#F� 22���P���g��S�NۻՠA��bDjjL?�RzM6�:��������&x���			aժU�����`�w4��|@@�:u"==�B����7����J����裏طoeee8;;����…<x�;a�V�^MNNs�̱�NNN...�?��r���7�|`@X<��c6���}��Zc���[�m��ż����呗�dž
�7o&��·��19XXn~�t�h��N����a�vrr�Y�ܹs,Y��'N�,����'��k�q6GS�ř3g�u��O�6^7�w¢�缩�c1z�h��#G��u�\�p�nݺ٬oi�Ĉ�E
�&s��F׊��H�Sq�H�L&
�-"���/@�����}�u[ۺ������Vﶜ��1�L$&&RRRB�~���_`=z����EDD�u4u
�z���L�6�E�mY���������������ͥ1����t���7%�:�"�A����ˍ��7�;uj�כ7nܰi���c���dee�駟r��1֯_OJJ
���w|���r��m����v�z���{�q��	�����O?���Ço�~���l�������:�Is~'{Λz<5�-��;t�P�6-m����O���^����k�kEDD��5�\�&
�O�>��f��l6���f3-��������(++�wTUUq��1/^̡C��N��9B\\���K�.e�ڵ=z��i��������?�٪�2]�,�9Լ>,���ܬ�]]]�'11�M�6�ŋ���mr��͡%X
ْ��X�x1'N�Z~���f�-gCX�عs'�����7�w�5���?n��ȑ#�ۿ���ֳgO�Z���YbDڪ�\����kҵ"""��T�""""-��ɉ��(v��ٳg9{�,;v� **�C"���H�d����*++y��`F�c����b�����s��
>��C��t;UUU�X����@����۷/,_����*{�'��~�͟��g�_��_���~�m�X___#����\�~��Ǐ��;�0n�8#vҤIx{{�m�6*++2d���8::69�����<�իW9y�$˗/7�/^��k$˔�і��>�<�����<y�~��������ooo.\h�6�w���v�s~�����p��u�9Btt4ps�]��A���6�[�n�^H��i�5٘뼶�W׊��H�Ӵ>"""���qBBBX�j���xyy�9+�OK�>j�(���طo�q#�:t�@�=x�Wرc��_���$''SVVƌ3���3g�u�V���			�cv"-o����ݻ�S�N���/�&L����_|��3g�7o�ղX�MLL111V���ҘZ���/����\���+W�,?y�$>>>t�ޝ.���;w�l�>��q6�ܹs������6#xv�҅%K���;Q�yk�9�Sz��ܹs��~�a�O�n�3f����N[Fj+ED"�i�5٘뼶�W׊��H���)�*:t���G?u�lٲ��ݔ��������̙3흎���4����Q�p��
���	��'�䩧�����|�I���W��s���7�����Q��]{S88�z���嶱������?e����g?#66�K�.������_��c���̘1������c���<�쳬^���gjj*�F��w��F\�>}�&55������H�UߨL�;w&!!���@�w�N�Ν?~<���6�ݺu#99�iӦѻwo:v�H�޽�9s&7n���Ո
`�ʕ����;�;w�s��xxx0w�\�x�&Kcrh)���~~~899ѹsg��;�c�����t�R���Gǎ�z�j�����!\\\HJJ�d2���Fǎquu��ח�7Z����߉��[C���رc�ԩ�{�fΜ9���ӹsg#f„	t�ڕ����srrpqqa���w4/�{5w�h�5٘뼶�W׊��H���)ҢƎKzz����v`���NADDDD�(..�M�6�]�F~~>���\�|�Y�fY�0����~�z���o�
���?X�f
ps��\�t�_|���"�����-[�p��!����ڵ+.\ 88�s����O�f�ʕ���L�8��}|���f�n��ܵk����>m���áC�ؽ{7S�Li���3���,[��e˖Y��v���'<<�A����?�����k�
ن�P�v��ޭ[7c���n}���??�&��;�
�f�ew����FXX�msk��Dm筡�N�����F!c]���1�L$&&RRRB�~�())��ѣ,X����K��jh?��뼶�W׊��H���)"""""""�,۷o`�ڵ<x����7��zJ|Μ9����m�6c���bu��ۛ��dzs�N����n�fӦMѯ_?���8x� �����ۗӧO�q�F#��?�ܹs<���l߾����������Z���l��ݝ�k�7@rss6l��:�6K���HM��������l���f���l�?���ZiY9EZԁl�����d���'""""���)rj���v׮]�t�f����"|}}	$00��u�ԉ�˗��/��[oa6��رc��N�<ɾ}��=`߾}DFF2b�}�Q"""��/�_|AHHp��0ܜ�2J`ddd�S���”-[����ʺu묦�8u��YoРAV1"""5999ŢE�

`ǎ�Y��.]��9;�ܩ�kj�)�t�����,�H�����w
"҆�KEl:t�w
"�L&���)���9�/�7� //���<6l��y�0�L�~�?b��L�¶m�ؼy3s��m�|o��q��e��?���ŋ�,�)))n������o�5�,��ڠ��l�@EE���?x��e.\nNQ���#""R�����V�Z@hh(^^^v�J��ѵ"""�rT�"""�
ƎKzz����;����ݦ擩�'`�Ī���G�&++�O?��cǎ�~�zRRR

eʔ)u������dgg����s��W]]m�^�z�!�� ���<��<�����67nܰiklQ��db���\�r���xbccm���`;;��ME�""����&a2�Tl/-��G8ii�VDDDZ��""""""""���ꊿ�?���lڴ���`.^�hUdQggg^{�5���m��Rtq��e�����w6y�����/�ӷo_�=j�ny���f�=��C@�s
��_`����z��	@yy��z�6K��������H[��SD���������`���L�6�Us������E"w3�Ʉ�l�w""mʤI�())aٲe���2����o8::�v�g�}���z�����,�޽;.\�O>aʔ)�={����;���7��o��>|x�����lܸ���h~��_���SXX�;���q��1cƐ��ʪU�����`͚5���ӿ~����l֬Ydffr��i6l�ڵk��S���R\\lS�R\\lĈ��������U*Ni�#G�GZZ���L�>OOOF�i��D�
����w
"�*2�]pp0��������xyy5h˖-����TVVZ�����}�vV�^��ի���iV���jrtt$$$�������/8s���ͳZ6`���_���ٳ��Ǐ��*���^�u�;v$""�_|��r��1}�QƌCvv66糠��.�ikT�"�UUU�X����@c�怀�/_NFFNNNv�PDDDDD�ij5�.t�ԉ��t����߿?�ƍ#88�A��ݻ7�����7��j_�d	�ٳ���*���Y�b�?�|���:u�{���G?bΜ9<��#u�v�֍��d�����,Ο?OϞ=���K/�����۳gO��������\�r���3w�\~��׹�#F���۷�a����0a�W�&''�9s�X����������2DZ�F���,##��d�4�f֬Y|��'�NCDDD�b*N�6��)sڲ��d��ʘ1c��6s�L�n�Jrrr�O܉������W�}v���߿���j���L�>ݪ��ɉe˖�lٲz�u��
�C��~���	��}��%::����� ""�x����d"11������@II	G�e��t������ˀ�:u�����ԩSy�'읆]���;M�:��;
��S�ͳ�$$$�t�R<==���������D����w�}G�^�x���?>�;w���޽{�����ɓ\�r�^�z���KHH�՗x�ϟgݺudggSUUų�>k���EEE����5�޽{�}���ۛ��T����֭[K��5���!�f�`m�j�[��*==���<F��'<EDD�����0��Fa��l��͍ٳg�9;���;��c��;
�Czz��S�{��S�݈������(�z�*.���Ј9{�,III���6l 11�j{������r��E�|�M�f�ɼy�())1�>��s._�l�Ϯ]�����u�s:��ݻ�2eJ�^DDZ͑#G���#--���j�O����'#G��wj"""rsrr"**�E���;X�f
]�t�sv"�۲e�fͲw""�e2�0��N��u���)��H1���uҶ�8E�
www����QRRR(,,�G!""�������СC�ر�ɓ'�u�V�-[�ĉ�С���,X����c�7o���������[o���I~~>+W���'77�aÆ�,�����8ED�6�YKh�sPUUŊ+���
����/_NFFNNN-���<��㄄��j�*BCC���sV"
�'�E�-�׋�&O����""w�.m��S�.,�+ܮ�֛��g϶��gϞ=DGGӷo_�fKTT�'O&33�(Nٿ?��՜8q�?��|���|��W\�t��fVVps~��Ç���ů~�+-Zd�۩S�8p��q4�*FD��Zsz����LYY3f�0�fΜ�֭[INN&$$Ďى����|�[7����:u��S��'�|b��j�ԩ�EDD�E�8E�
K��ř3g�5������s�αd�N�8aW]]m���o1b�U�c�=f�ޅ�֭��2K�%FD�N�Y�r��
ؽ{7gϞ���&M�d�5�޽{�����ɓ\�r�^�z���KHH]�v��)!!��K����I||<�ϟgݺudggSUUų�>KDDD�r�y,�SSS�������w�}<��s,^��ޑNV�^͎;�g���TTT���ʨQ��)���郷�7���������������H�T�"vQsD���p�)`]TR�[GDy�8q�����駟��Ã�Ç�ge�f�mw�d{�X��tpp�Yfi�\�"Ғ���شi��ڵk��瓟���˗�5�
HLL�j+--%55��/��oZ-�������(ꨨ�`޼y���1��9�/_nrN�Y�`���\�r���wܸq����Z�?���f3Ç��_`׮]TVV���c���áC�ؽ{��k�˜:u��C���=��G�l��������Gii)��������x�駙1c�����GM������0z�h
S/rQ?mM�����W*N�v��͍��bv�܉��[���?�����޽;EEE���ׯөS'���OQQ��nN�l�gϞ���R^^NϞ=��Yn��l���o��ڵk��ڵkdffCZZ�MqJ]S��f�֭,[���'ҡC���Y�`9996����$%%���7o���������[o���I~~>+W�l���k�DEE��C���HRR���8%66�-[�����ڵk�Q`rss6l��:����\�������E^}�U���5����+/��ՃW�^�ԩS�:u��;w���h5�dk8r�qqq���Q]]�������d�ȑ�����>����O��H{��i��y�6n�Hdd$���2�����6oތ���1����y��(**�z��ŋ��у���'�_����h�|�MF���S�x��m�?t�PJKK)..�)B)..6bDD�SW�H��>�w�ڕK�.a6�)**��ח��@���������ĉ���믿櫯��G���={��WYYYDDD0|�p����կ~ŢE���_M���0�Y�f����ŋm�,�)����[���I�S�N7]j�L-g�i�222ptt�wm`� IDAT"�����N�j�4����N�My����|�2O<��-��ݝ�ׯs��	��}N�<I\\��Zk�,���bŊ��|�r222��UD�?����O��H{��i��ΝKVVǏg���V˺t�’%K�����dff�r��Z��?y�$>>>̞=��{�r��)c��	&'cƌ!;;��������YFZ7n\��SD�.�/�7� //���<6l��y�0�Lt���&�!C�Z�;w�%K�p��	��ڦU�oX|��7�1ª����3�����0^[
Nnܸa�e���C���?x��e.\�[�n6�Y�,1"""��'�|�'�|b�4DD��{
��Ǐ��o�7��~�Lj��&  ��jN��ɔ��1c��m�̙lݺ���dBBBZ5�{��i�S?-""홊S�Mh��...$%%��G�o�>���pvv��ˋ�2x�`#���^�������?0d�fϞ�����@ZZ>>>t�ܙ��֮]�޽{�|�2O?�4����ڵ�j�&L`������0g��e999���0~�����g���!��ϏѣG���ŧ�~ʱc�X�~=)))���6k����{�'Nп�~�i<<<>|x�s��:j
����f!K�N-�ǭO~w�С�8����۹r�
������ڬ���`�����m����������Νc͚58p���*<<<�3g�����Jٳg�}��z���g�����[����
׆��b�޽dddp��I�\�B�^��%$$Ęz��[����l���x��g��m�-ǚ���ҥK���4F�ѣ���9w�q��b����{��d-q
͵�����TF�e5EE�>}�&55����Z2�֧~Z����i���S�ͫ�MWWW����wݺu#::��e������y\�e����(��b*:._p�eR�p/��B�PW�ƅQ�&jX#�9d�i���Y�ILJ�Tb\�P���I��"� ���d9���:��~�繯�x���z�###֮]�ڵk����������ɡs�����p��Y�.]��G�B�SSSlmm���%33��G����o��S����M�6\�|Y�^RRRe�I�.]�|�2�O����FiW�,�+���k�???�����̤o߾������G~~��rm���J!������TQF�����uF�VXXȢE��Y��L�],..��Օ��L�-77���`222��(�6j2�;

��?//���pn߾�,�PPP�����Q�}�����k������@�b�E�ؼy3K�,aڴi�9������Rp5�����i|�T���!55����Z}�B�
��I��/��B!ʫ���B<c����ر#*�JiS�T���k-5$�um�ԩX[[��STTDϞ=�ի@�} =u����\�x����+�o߮r�ɓ'�����ӧ)))��g���uWm8::*�k�رCi�ݻ7��2n����!�MYTTQQQ�C�gFTT)))���S�T\�z�N�:̩S�Ը`��w�^233�߿?aaa�����IMM%&&м)--�»�+{<����`�ڵ$%%q��I>��S��l�j�}�999t�҅��P�5����_��‚��$�"+��i����Ԕ��P/^̘1cx��7���������r�Q��Un�����ǚ��@�>}��R���!tK����$O!�(OfN�

���bŊ̛7������hժ���B<휝������mVVV�:�رc���e�ƍlܸQk�ŋ+�#B��ɉ�G�r��%��&M�Ta�ZeS���Z�͚5cݺu,\��S�Nq��9��#8q�Z�O=�˨Q��,!�B�T*�C�g�����Ch�*���|{ZZǎ��ӓ�^z	x��g���Z��9rxX,ߩS'��>///��숍���ήN_KMƌ������.��W_��?��w�p���Ǐ`ݺu���Oy�o��6+V���kvrr�Z�.!;q�D.\�@JJ
�O��̙3|��wDFF�c�^x�Ǟ��{����Gii)666ʬ�5��ҥKt��M�ݻw��#��{��%OK�BQ��8E�Z<x0nnnlݺ�e˖�����U�"{{{�7oNdd���N�.]5j��ε�c͚5���������ٳ'NNN���OQeq���������s��Q
3f���>|�V�Յ�^z�iӦ͎;عs'�&Mb۶m$$$0�|��			3a�E,�B!ijM]�>h� ������r�
���+++�ZcV�����ٚ�y��uV�ZŅ�����)?���P_�U+j:����ae���C�>}pqq����ݻwȇ~Ȗ-[*ݯ�������V�X�,Q�Xo޼	<\��<u���B�$O���i4�$O!�P��!ꀃ���u(��w}ඵ���bU�=�����r�Dy�΄Rձ���X�v-k׮}l<�-�)߯����oݺu����@PP999t�����Ξ=�ҥK�iN�B!��W���?�ы�zzz��Sޣw�ו���e�.\�@�.]3f�����׏Y�fUx���n�\�+�'y����5jw��%66Vk���	$99��qn߾��ի9}�4-Z������Z�X�����R�U�B�
�Ӓ���i!�5!�)B!�����3�B�R���<\����'''G'�B4չ0Q�"##�/݇�u�@���ҥ?��#�Νc�СJ��s���������177o��j2�:ӦMe6LxxG{����ҥ�/_����3W��}��+ӧON�>���y��7���gE���z�ʕ+��_h۶-~�!�U�fff��呟�����ƶ��|��B�$OK��<-��q*�
%�B�244��ˋ��rss���%&&///Z�j���B�9s���֬Y��ի���ٳ�KQ��Kl����dddPRR���y������7OOO.^�ȃ�q��1��ָ��*}�ws��0xR5S�ԩSs��E֯_��߾}�ɓ'�����ӧ)))��g���u2~ys��^������ʢ���;w�Ϛ5k4�*��Ņ_~��.]�Z�Ϛ�ڻwo�\�nS�B��i���I�BQ�̜"�B�����֭[X�lY��#!���ݽ{�
60c��.N{{{֯_OTT���:�PQ_�����qqq�����Ǐ'==]k�V�Z�j�*�y�6m�y�&������s��'��&c�;���X6n��ƍ��u��Elllprr��ѣ\�tIcy�I�&i]���7n�����>#""����>ݺuc����_PP�/���o�Qa�����:b�N�8AFF���2���F�z�kB�?�Ӓ�%O!�x)N
B�XBT%**
]�!���AޓB!�ôi��u]/�S����]�Ɯ9s���s�o�>BBBpss�atB�ڪ*�H@@���ܹs���ظq#J_ccc���ٵkǎ�ڵkaee���+=z�P��^���۷���Gqq��^�1׬YCII				<x�={����O?�D`` ���```@`` ���=z���Bƌ���'�~��b�
�
����ύ7h޼9ݻw��W_e�ܹ�n���SMc�4i۶m#!!����k'!!ccce�!D��<-yZ�B���++++�u�����#�Ubb"~~~:�J��9R��wtt@�R�2�Z)��?B4M���Ӑ��M�?����3�O�&==�^�z=v===T*�RxY�ye�*N�h۶mۈ����֖�+WPTTDPPG����]�v���k,Z�


x���iӦ
�����w��+W�`ooO�Ν9p���O��#۷o׈��͍��:����cω
�Y���!?�����oЩS'bbb�B�v��IPP_|��;w '';;;�.]ʢE�t�xZ<K��I�>|���~���h�2�Q
i2s��W#G�d�ȑ�C!�B!����2X�v-�{�&--�Z�)
壏>B�Rѯ_?eJ���b\]]���T����LFF���0{�l�����o�8q��7>>�ѣGp��a���������Ɔ��T���>}z}�T!���=���"֮]�ĉ166&;;�>��A��8BQ_���9t�*�
�a������rBݑ<��<-�����E�'����<�!y<���E!�Bh���f��񸻻�z�jRRR�߿���R����R�������_�F|�޽dffҿ���HII!22�������9���H�֭ٽ{��q��)�5ꓒ��ӧ�V�6u!��gʔ)�����+�0t�PfΜIZZmڴQ
������///bbb���%77������hժ���B����]���BT�̜"Ddd��CB4b�RaʬY�t�����d�K!D�


e�����ԩS�r:���c�ot)___���055e��혚�*ێ9���7�:u���///��숍���Ύ�{�3f�g�N�<���
�;wNY��ҥKt��M+��ݻk�B<}<<<�ڵ+_}�?�����t�Ё�_~�E�Ѿ}{]�(���qssc�֭,[�L�� �h$O?�$O!��)N
b�̙�Aш}�����u��Ur�O��3g2l�0]�!�x���o,Y��/��www�{�Fy�aXXܺu�^xA�v��lmm+�7++K���ɉ��BBB�����ɓ<x�_~���~uq��MLLL���nS�B<}�qpp�B�g���ѸI���/��q�8E!�h#G�d�ȑ�C!�M@TTnnn���p�ĉ���Q�3��o������ܻw��;w���l+++�r�;w�(?�mۖ�ӧFFF			������^�(Oݦ�#�B!�B!)N��"�.�Irr2Ç��?�xʄ��=S�	�4spp@�R�:!�S��͛,[����/^�֭[+�%�1qww�]�v���Off&}����ܜ��l<����c�5o�<>��s"""8y�$����1B�nffF^^������i웟���B!�B!������9s���"""(++c�����Ջ��:4!D����uB�Z�"3!D}9t��/F__���X&O��됪��ё��X���رc����7�ݻw��鉇�={����7{����>��ښ�;w*�y��:u*��9eee0��^�޻wo�������*B���V�!�B!�B��G�S��D]ΘR��w�a�f̘��Mhoo��뉊���аA�B4��3g�:!D-|���A�}�6�����䄟�mڴ�uX5ҬY3֭[�…9u��Νc�����p��q���qrr�اU�V�Z�J�X���'**
�\�`Ĉ�8q������4�eddT���qQ��B��(**��&**�-Z�:!�B<Ť8E4
���NSµkט3g��6w�\���GHHnnn:�N!�BQ_���[,X�ݻwٿ?����ICM>����KL�6���hv��Ν;166&88�]�vq��1�]����VVV���ңG��)?�=ZcۤI�ضm			̟?_c[BB���L�0���Rѐd	c!�h�����!C!��J�SD��.\	d������K�������� �9��N�v�x��X�h�ٳ???�����ݻ�c�������￯�奭�-���+��ެ[�����8����%==��-[2~�xV�\�1�ɍ7ؾ};'N���ݻ���+��UPP@xx8C��}��J{ǎ���&<<�y��5�u�
�6�|��IǨ�~���$''0|�p��Z!�3�����k���i�رc��灦����֭��cjj���;����:�s��֭ی��ppp ((���:w�@NNgϞe�ҥ�n�I^���988����0�BT���L�!!�� �)�����@�Ҷ��WWW233�>������A@@&L��Ϗ.PTT�|Q�7�|��ܼy�_�F�YiK�.%??�{���~JKK����,X����e�������B�c>|���"lll����ؐ��J\\ӧO�ѹB���̙3AYY�gϦW�^8Pס	!���ԩS8;;s��u��٣��ͳ�����w����y��U���ٙC��R����@�Rann.�R�F,11???]�!��5r�H�/_��0��4$�O��˗Wy�S�������.���x��wػw/�����ߟ��0RRR���d�������9��y��gϞ����o��}}}����w���5ʇZ��vݺu#::���$,X��cǔ�}�999t�҅��PN�:E`` ?��ֱ����ӧ��6u���B�����g�=�ݻwٰa3f��ܜN�:aoo���{�n��+�B�Zqq1����=KKKΟ?/��=z4�&M"33�^�z��oT����///bbb���%77������hժUG-���+W���0��JQQQ����:�����<-�O���(�\���0�P��)B'��?<����NNN(Ϗ9���7�:u�xyyaggGll,vvvL�0���ϓ�����
)))ܾ}�iӦ������DƏ���7���=<<�ڵ+���s��me���ǁ�SZ���+++�~�mV�X�q�K�.^��޽�F!ij�6K�4!!!\�v�9s�(ms��e߾}��������B��q��9����|�2۷og�������:�F�}�����cmm���'͚5����qssc�֭,[�++��
UQ����A!*����tJ�R�lB��Dc#�)��Pk��+�lmm+쟕�����裏��qqq�l�777���K����8E__�ѣGW����򳩩)���J�իWx饗4�4h�ֱn޼	�����6u���B�/\)--%00���8rssiѢ���L�:;;�:C�<<<___���iٲ%�Ǐg�ʕVz�m۶���-+W�������p��,�бcG���	g޼y�D!��)*))a˖-lڴ��C�r�����bcck���A.�!�B!�B4!R�"t���ՙ)��YS��ʪ�Ν;��;�@zz:7o����6�6m�0h� )**"33��ҦM�*�ۢE��*�q���ys�n���W�R�IU��2�ٳGy~��}Ο?���),,��;~�.]J~~>���c���������Ya��>��JE�~�X�d	������666��������,n!�BW.^�����Νc��͸��W�w�B!�B!��)NM���9���<xss�*�N�8��g�Jaa!#G�`�ȑ����駟r�Ν�.�S]�t���˜>}Z��z٠G������G~~>fff���˷!�Ztt4���X[[s��}bcc���!""�N�S�u놗�:t ((���`�;Vaq���/aaaXXX���O�֭HJJ�O�>Z��ے���8E!D�VZZ��������/���밄BT�ҥK���[y>i�$^|�Ez���ĉ�ѣ��>YYY���q��%.^���Ç�4��f�|�Ʈk׮��������qpp`���Z��Z�����V�Dxyiii�f����H���>|8�f��i<B4e��T��y��8p K�.�0�R}�ƒ�ʓ|(�BMn�M�����ӓ�/��nܸ�����5���J�W_}}}}������1�}��0v��Z�5y�d���9}�4%%%|���l޼Y������l�m��t!�.����ǵ?J]�R�����֭[̘1���4bbb�4N�v�J˖-���۷ok�S�����}�ve�3x�E<,t)O�t���B����O���+xxx�v�ZN�:%�)B�����*�q�IIIT�~�v�"88���$nܸ��jY�~=ǎ������b�_�^�cVt���3g��p�3 IDAT��5kX�z5����={V�a	�$�$�r��-�;�…�r�J=G'G�B�G��)��rqq��㤧���䤱�U�V�Z�Jynff���iii��ݛ���/�����ի��⋏���:���8z�(�.]R����wݔ/B1b'N� ##+++�m�VF�U똄O��+W�i�&���INNfǎ,X�Z�jU�cYZZ*?�NJKK�����PPP��[�x��m7o����Dk?u���Bє������իWӭ[7RRR4h��ê����\\�988�:Q�'NT��S�N���PZZ��4[ii))))t�Ё�~��!¬�.���tv���)))��˫^��|5��5Y"\�3ܽ{�
60c��F{{{֯_OTT���:�O����<
���KKK�����ˋ3gΰk�.�}�����;?�:��'�P!DyR�"�'����ؘ��`v��űcǸv�FFFXYY���5e�ĉIKK�*�9r$���u�����������s��Q
3f���ZS�N�4�m۶�������5�%$$`ll̄	�$.!D�T�/�ʛ8q"Ç���8p�s����'��w�^�-[V���h�B�YOO��~DGGs��=v�܉����~�~���n���B!Dc���âE�8r��W�fӦM�l�R�aU)22R�!���ڵ��Ch�rÇ'::����3`��===���ƍW�V�DII	�����a``��X����p��5�̙��͝;�}��������v[�.O__�Ν;��̙3���]��L�|(��<)N�^U蚚�����c�coo����V��իY�z�cǭ,��ڍ��X�v-k׮��������C�Ν��_p�={��K�*�v!DELMM�����֖��L�=Jhh(���uZ�R]���k�???������T�3033#//���|���4����W�!�MEXXo���ڵ#!!��_~Y�!	!�S�������ݻw���d����[��ޥ����� �9��N�v�x��X�h�R�Q~i���6l���$%%i��<y��C�VX�RPP@`` �~�-7nܠ]�v���+,Y�ccc��7n�`���8q��w���+�(��Q��{4�!C�(�*z����|�	IIIܹs��ݻ3�|�L��1�ѣG�����ŋܻw�v��1v�X���hݺu�竢1�{�������Kzz:-[�d���\���\%''���˗_~I��͙5k�������O�-=z4)Ǭ�I�����2d�2s3@ǎ���&<<�y��U8��O���ӕQ/)����&c>:V`` �W��W�^�ܹ����k(--%00���8rssiѢ���L�:;;;%��k�|\�X$
!�����c���:t�J���*�
sss�劄�QS�N%''��k�2e�z���/��h�t�����%++�;v���@�޽���#;;[�E��Y�޽<^!����_������9o��>>>M��|֬Y�A�g���*�J�a4i���,Z���W�*m/^������WWW233����\������   ���2d����<yR�����D���:t��>w��a�…\�|Yi���#,,���T�����,X�������_Maa�cc���7o�����ו���,6n�ȃx�7��Ki웗�Gxx8�o߮Ѳ59jK�.U."߻w����SZZ���g�_se�l�Btt��|׮]t�ܙ��(�r��=:���>��P����Ç)**���Fk|RSS������$B�7]�����π�MPO2���/��������٣<��>�ϟ��*�pV�_y������C!�y���B�:ahh���111��撛�KLL^^^�j�J��	!1ggg|||=z4/����A��ʪ�}���+|ԥf͚�n�:���8u��Ν`Ĉdddh�n+��B�����пRRR��o���kR�)j*����2y�C
�ppp����J���իt�ԉ��`N�:E``��C��{����I���	#%%���HHjj�2�ɣw����iݍojjʋ/�ȥK��q��@�~�G��m�Vk�={�p��e:w��D�N����b���J��>�����t�Bhh��~��Ǟ��Ů����۷/������3m�4����~���`�ڵ$%%q��I>��S����5�&�@�[�n�,5,�رc�=5�����}�8y�$�������͚5c���$%%�d������~HJJ�O�>Z���}�x��"O�WRR…x�4f6��e5����
�4���.p��ԩS���+��GDDԸ_y������C!���!�������֭[ٺu+˖-��²��V��j���lܸ�_|�����ŅM�6�s�U{饗�/<w����I�hݺ����066f„	
�BQ]������0u�T&O�Lzz:����B�&��������<==y饗hѢVVV�_�^�G���ۛ^�zѬY3,,,��� 66��16���2e)��'ORVVưa�*�_Q�Pf���o��Ǐ`ݺu���OyMo��v��{���D֬YC׮]iݺ5���������S��w�}G߾}�ꫯ������w��DM΁���]�v�e˖�]��o߮���ڵk�ٳ'J����֭[G�n�hٲ%���4����ҥK��yT���5��4�<�hÇg޼ydffbjj�…k5�����r?jO�O�S��T*"##�u�3f� --M�X���ʫ�|\�X$
!���,�#D#��� wS	!�TQъ��-���O�ou�U�_u��[�Nc�V###

"''�Ν;����ٳgY�ti���\!���ȑ#,\����b8P�߽B!�z)�A�i�Wtsϕ+W*��YYY�w�С���p��I�x�
�H��%}e��h����_�6��/��R�}�z��-�z��uV�ZŅ������h̚�5KKK�gSSSJKKk4��<z���؆��Z���t��MLLL�����}�x��*O?�Y�f�mۖ���x�b���k5�����'�'�\��M�6���Lrr2;v�`��888h̪^�~��G>�n,��BTD�S�B�`���9t�*�
�����899�8:!�BSaa!k֬a�Ν̘1�O>��v���:�gޥK�*��Irr2Çg֬Y
������ᆵ���|�����c��W��@@˖-INN�����(��DE��8��ۼy�}e[��Ȗ-[�p�]�ta̘1XZZү_�:ͣU��h�B���1�T˖-+l�ׯzr񚼟ԱWtLu[}�>!�CS��ս!�IƬh�x�|R�ĉ>|8Ǐ��;w�O>���{��l�2�O�^�~�U�|\�X$
!����!������Ŋ+��Mcbb����N!���%&&���­[�cΜ9�I��_9q�D�!Μ9C@@���1{�lz����u���u�҅��s��i�Zr��9�����dggs��A��柄��VVV�:u���h


<xp��_:u���?��ٳg5��9{��ۣ����˜>}�=##�V1?�C����/deeѷo�J������iӦ
�/_V����T�h�&�)����̌��<���133�ئ^ڣ|�x6������MVV�;w������t���KcV����23rff&G�%44___����{T}����"�P!DEjV�)�BQK���͍�[��u�V�-[V��B��r��=֬YØ1cx����Ȑ”F�ĉ�߽{�
60c�����ԩ����_���w�6p�B��0a���}222())���Z}Ǎ���'/^�ܸq��?�kkk\]]��껶��=TD}�5$$@�_ycǎ��ۛ��tJJJHOOW�5j��w���J�ӧOSRR����͛�>50b��n�J^^���c˖-X[[3m�4���N������/�~�z�����@��WM�ASP���zf/��&�R�=n�%����Å8t�۶m㭷�b������CCCz���ɓ���uj��e������P�N����5��9EEE��ٓ^�z�3�T�_y������C!���SD�����uB�F,**��3g�:рppp�uB!����4����z�*���,\�P�!�Tu�mo,BBB�v�F!�ܹsٷo!!!����0:!D]ptt�믿����ťʾ...?~���t��C[�jŪU���mڴ��͛���cnn�����.F�~����8;;���r��,X���k׮mNNN=z�K�.�d��}ҤI^�{��9r�������/^��<v�Xbccٸq#7n�:�ŋ�������9h
j�~1b'N� ##C�&��8M�8GT��\�p��/���I^^YYYdee��/�(˧t��KKKz��ȑ#�ѣW�^e͚5��\M�.�tu�d̆��쌷�7>>>���hl{4�T�_Eǯ�|\�X$
!�����!�|!�B!������y�=z4���t��M�a5j�(�������N˖-?~<+W����P�[TTDPPG����]�v���k,Z�������w�eʔ)ʾ_�5�ׯg���|��7Z㧥�QPP@xx8C��}��J��;bmmMxx8�����Ĥ^ω���*�344$00������s�899�q�F%�̮]�8v�׮]���+++\]]�ѣ��w���l߾���<���+�gϞ�mۖ�7obbbB�>}*���Ą��>��S�?΍7033��W_e��Ř��*}
��ߟ�G�RXXȘ1c��X���		!  �S�Nq��=z�聋������o͚5���������ٳ'NNN���O���M��WM�ASP��ӤI�ضm			̟?_�8			+�K��������,[�Li[�p!�Ǐ�G�����Xk____:t�@�Ν2�Zi�y�:j2fC����y��DFF*K�u�҅Q�F���\�~��G>�n,��BTD����L�A��GXX�����JQ����T*G����CɏB<�秧!_	������ٙ��L|||x뭷��ßzzz�T*eֲ��+S��)�m�=���f�ڴi��������E�����u��C����>̞=���"����ر#yyy̙3�֭[�+���u���4>��s|||X�j������˶m�x��>}z��W���,��А��rssy�7�ԩ111u~|!jj�Ν��_(E999��ٱt�R-Z��Eej���_����'�v����???
��������/ky�=�߇OB��K��א�^�jH��SD�JLL���O�a!���#G�|�r]�!�B�gDii)���lذ�p��Yz��밚�nݺ���E�

"88�cǎ)�){��%33�����n�:,--�����ۛ��Tbbb�����ĄM�6����ƍٹs'�����lٲSSS���*,�IJJ�p&u[RR���č=���"֮]�ĉ166&;;�>����h(���:t�J������\k)��h׮�~�)K�.eٲe2��K���{�Ѷm�
�IKK�}��DGG3j�(^x���nI��I>BQ���zu������9s��CB4bQQQ�h�B�a4���(]� ����F��Ï?����������;xxxм�|<V~<�����v�
<��788�۷o+ۏ9���7�:u���///��숍�����!C����J�b�…�?��s�2t��*�t�@�K1u��]����2e�2S����ƶ6mڰd�E&�&CCC���X�b��� &&???Z�j���D}�����ɓ����n�:"##�����ŋ���W�ݾ}���,<x��Y�x��}��a��ь7�I�&�����Ԝ�iQ��C!��ɷo�ADFF�:!D#V~���٬Y�t�B��*++c�Ν�Y��=z���ʀtV�fii���^����Ti�r�
������|ٲe���p��y,,,��_���n޼	�����6u�����R�}��W���OӡC^~�e-ZD���u��������֭[���߬��t�h(zzz���`gg�{��[o�E`` ۷og����>}���RN�8���	���$&&OPP666����L�<�?��|I�"yZTD�B�GIq�B�dG!�B�~��.\ȱc�����w���@�a5*�ΈT��Ny��~����������1�ܹS�+��ѻ���m�&�hZ��s�hR�*��y�����p�B��`cc���3��ޜ>}�:йsg��#S�L ??���8bccٺu+t�ޝɓ'��o0v�XZ�n�˗V!�Ӣ2�B�&�)B!DHLL���O�a!�ȑ#Y�|���B�@hh(+V���ܜ��D�
�됞���dggs��A�������deeѷo_233	��ݽ�}������#??333�m���J!�B]�۷/G�%**�իWӷo_���3iҤ
�?��s̜9��3gRZZʿ��/:Dll,���0n�8&N���ѣ0`͚5k�W%�BQsڷ	!4X[[W��zE"##qww���]�3B(�\�BTT���B�RTT)))�CQM���S�Ne���������R��ƍ���'/^�ܸq��?�kkk\]]���}�aaa8���`���طo�}���G=�z� �޽{����5��M�G!�BWfΜɅX�l�p������gȐ!xyy���ʯ��ʎ;066f���<��m�2e���}�ݻW�/C!����)Bԡ3g�@DDeee̞=�^�z1p�@]�&�h$�hM�����Q�!!�)**
777LLL���o3f��Cz&���p��q���qrr��֪U+V�Z@AA^^^�nݚw�}��͛����ܹsy�w�����Ą6m�p��M���177���1�'N�����~}FF�F�j�,�BQ�֭[�
�'*$�С...���PVVFff&���$$$�{�n<<<�!j!�B��!�)Bԑ�w�a�f̘�LWmoo��뉊����P�
!�B��u�˗/G�R�x�b�n݊�����j����j}ccc���ٵkǎ�ڵkaee���+=z���LJ�~��M�6ѩS':uꄇ���>>>l޼�իW�}�v���(..`ҤIl۶����ϟ�1~BB���L�0�֯EQ{�ُ���rpph�q�Ն������_�~��曵>����ܐ!�B�z%�)�QP/�S_~�JHH׮]cΜ9J�ܹsٷo!!!����0:!�B!�~_�5�- 66�ɓ'�8��We��*j755U�>���͛ټy�V����'��?)�'N��ĉ5����@PP999t�����Ξ=�ҥKiݺu�^��~�9Rf�B4	]�v�u:!9Z!�^���hL�8E4z���Gnn.-Z���Ғ�S�bgg�ѷ����� �9��N�v�x��X�hOܷ�m۶���-+W�������p�B���~;v��ښ��p�͛'wl
!j���|���+{��%99���<Z�h���ƌÜ9s055��p�����I_{M����$99��Ç3k֬�'�B7


X�z5���?�={6�|�	mڴ�uX�9;;s��!T*�2��J����\k9!!�B!�B��8E4z�ٳGy~��}Ο?���),,T�,..��Օ��L�onn.���ddd���~�����G�R��ׯK�,����acc����Ɔ��T���>}z�O�B<�����c���*m���\�t�K�.q��A���4
�5gΜ!  �����ʘ={6�z�b��M!DN�8����g


���`�̙�I耡�!^^^�X��y������Z��qtB���DY*B�$888�R��h�3g�0hР:����K�����x_�9G!�^*������q�8E4z������cmm��������LJ���ˍ�{����I���Y�n���dgg���Mjj*111�L+5�(___��°�����_�:))	�>}�h�nKJ�lr
 IDATJ��!D��f鳿���2l�0V�X���%%%\�p�����\�x����}��:�����ow��eÆ
̘1sss���Y�~=QQQ��B!j��ݻ�[�???^�u�С���:4x�`���غu+˖-���J�Q	!�$L���Ԧ���Ύ4�<'/���.\������eמ��F�֭�s�*��˗/3v�Xf̘��34�9rooo:u����^^^�����Ԥ���0��Ԕ�۷k,q��%�u���w��G!�Rۥ{*�����͛y���h޼9�
���{{{�ț$$$�k׮1g��m�ܹ�۷������t�B��RRRpqqQf?tvv�uH��ppp��*B!�hp�uB!�����Fo�ʕlڴ���d���ٱc,���Acz�+W�`kk[�q������ZXX�p=�[�n��/(�n޼	�����~�6u!�xR�WJKK	$..���\Z�h���%S�N�*�k۶-���ׯ_W�SԺv������_�6m����ٕ+W����s��8p@�'99___���K�7oάY�puu%??�>����xZ�h��ѣ����Ȩ֯]�<<<___���iٲ%�Ǐg�ʕU�t�m�6bbb���e�ʕΐ!C4�5�ر#��ք��3o޼
s�B��U\\̦M�زe�ƍ#..�.]��:,!�B!�B!�c�?��u/--M�QU�ĉ�ꫯظq#�޽{|��'L�2����+�>n��;w�<Q_5u1LYY;w��ئ��ы�j�6�:KQ�صkW�\��q��y����i���h�"�,Y���?gΜ��Z�411a���\�z�o��Fc[||<�G��h߲e���q��mv������_�B\\��ݣ���C�)��ו�K����ʽ{����g������V���>b�޽t�҅%K�p��a��������occCQQqqqu�B��;w�C���?��ϏÇKa�B<C���+���:~��W�lق��=666�3GGG�}�v��U��l����������Ndd������ܹ�ڵk����e˖8p�s��q��=�ORRzzz|��g�������ǬY�4������x^~��ݻ���1ƣ��?�	&`ddD�v�x��7),,�蛗�ǂh׮���8::V�}vii)7n�w�޴l�^~�ev��U����:O?�јHB!d��D���bkk���-���=z���P|}}�>}:���dggs��A��ͫ<^M�����Ӯ];������'33��}�`ffF^^������i엟���B��
���?���ܿ���X|||����X+yڴi��'�Jhh(0�q��agg����p����pv���ĉ�c��SF��GFF���[�n�ٳ��;w���C�^�ؿ?;v$44���@�u�[�nxyyѡC����رcxzzj�U/�faa���?�[�~�ЧO�}�mIII��!�
�w�q9�����!s�->"��	帓S�t�f���qZ�4Śϴ�Ќ��ULсf�"9�O�U����a�:���v���u�����ۭۭ^��~=���r]��~�JKKY�r%~~~����={sss}�%��!��?0{�l����Ŝ?���ϳ{�nBBB�*)6o��6����_u���JPPQQQ�����caaA�~���uUTT�����k������q�Ʊw�^@ii)���>|8�;w�ʕ+xxxЩS'>��Sbbbj=��˗�'%%��{�j��hggǍ7(((`ӦM�������!C�t��m۶i$�x{{�j�*�秪N�0i(�ཐ9T!�� �)���0a���x{{���/ӣG~��g�4i��c��������E�=��?g�֭XYY)Ot�[������\�x��7�~�zz��INN�/_�HB�|���G!���.����>�7oޜ;w���K����eʔ)L�2E�>njØ1c����ĉ�>}���TN�<Itt47n��'��u��L�2�/����G�bmm��۷9{�,-Z����Rm���������2�i�&���O�,YB�.]�>}:���J�^}���s��@���Ub���	�|�	&&&�6��7�X+�ڵ�Z!�օpqq!55�+V�h�"��
��صk����������x���E�5k֐�����?>ݺu������L֬YCVVAAA,_���Ǫo��w�t�R�L����eoo���/1115.�*DC�f�N�:��ٴi�{�f�ĉ�����w�
���[�laԨQ̘1�������B^^;v�M�6���+�R*W��6�?�����2��ҭJϞ=ټy3�<�+V�`Ŋ|��Jr��ի�t�ݻw'""�~��q��q�O���U�ٳgvvv�u�V<<<��1�_�̓U���A7$2�
!��o�D����@@@Æ
c����/����ҵkW���pvvf��;��[�ҬY3.\X���5nܘ%K�ШQ#�;�ٳg2dPQ=�*U[�JBq�,X@ӦM9~�8}����:����a��ի����[�����3g�~��'��i���iڴ)aaa=z���R���znk��;U5@���A�������2�~۶m������j�n޼	T,iT��M�G!ăQ^^����ׯ����?<==%1��L�:��S��;!S�Ne���p��aHKK`ŊXXX`hhH�f�x�����ȑ#�>�",,���\�M���988����|f�a�ZVe������CCCZ�n��W��1��r��!lllHLLd޼y�5J�1�}�Y6oެ1�����ѣ����wԕ��P%�駼��1l�06nܨ���-[7�����[o�u�%�k���i�dB!�&�SD�PSF���=���DGG+�
���:t���o�CCC����9x� ��������t�޽N}��ӧ�&M"66��7�i�&Ǝ�ڵkIJJbƌj����hٲ%�G����B<���N�1c�0h� �u�7l�@xx8s��U��:t(������k��622��Ņ��`���m۶e���l۶���t����}UմiS��=���+hU^ӹ*GGGbcc)**bӦMj<N[�����-��~]�|��3gr��a�,Y�����|/q/�xU��TVVFpp0����ڵk4i�sss&L��ĉ�۶m[~��W�_��O<���s�ε�\v��u֭[Ǒ#G(,,��ܜ3f�d�����FFFHZZM�6eԨQ,X�@-q�����Đ��EQQ�۷����7o�v�rL�}n�ڮ�;88OOO,,,�J��������o��F���y饗�5k���+T$�GFF2`��ϓO?�4VVVDFF2}�t��B4d.\�[�nZ��;w�N�:)����������y��g	��1��ݻ��{۶m��p.^��$Ѩ6Lc_�W�f�̙�۷�}���t�R|||X�`�]c���ΕP�y��y�6n߾ͫ��J�6m���U���ʕ+���өS'���+e����������666̛7���۫�[�P!��n$9E<Ə�������ĄE��hѢz����%K�7�-Z���ё������.��ٜ9s777�jBQ_LLL�92##�����e���^�zq��iv���[o�����cU�3�O�Ύ;�����ѣ(��6�-�}���[��Ç������>@�v�����֭[K���!��.��		aѢE<��3;vL�ʼO$�R���ё��}��H	

�/�P��믿8w��Ν#??'''e۬Y�X�bs��aҤI���лw�Z'?���3k�,~���-++K����ܔ�EEE�ܹ���2��ƍ			Q{LNN������)KՇ��@n߾�\-..��ݝ���ϵk�

%==��� ���޽{)((���Zc���֤���o�>��mUW+�iY�ھ��������zR�����lڴi�;�]�vBrr2>>>�^��V��J��R�y��Z�j�T���3f�����ÀfRχ~��ݻ���;>>�3g��T�9T!��;IN�������7��������������	&������7/��2=z���Կ�ppp���ӄ��r��&M�D�Ν)..���ӬY�;;;��?��L�0�;vP^^N߾}5�2|�899�ŋٸq#�ׯ*�%�������I(�ĝ�K	!��׮]c���|��,Z�����4k�L�a=�&N��������P9IBԟ��X�b	+++���/���	 **J�O�4�-Z�a��l�–-[022�o߾���1q�D��UEDD��/�бcG��}z��Źs��%77W�c�t邟�O=�!!!���r��A%9e���x{{3n�85jĹs�pssS*W�T%Eݺu#44Ty����dddлwo�,Y���9�/_��ߟ������3���@�MU�ڒ���ªx�t�ڕ�����O?ѥK��Z�LXyY�d	�Νc���<y�w�y��>�H�1�U�=����9|�0/����^�nemڴ�7��7���ɓ�ܹ�?��^b�J�����н΃NNNDFF�y�f��)U+9r�u��1`�233���ի������S� s�BQ�$�QO������c���L�>���8֭['_�!����	�('kii��ngg����ٺu+QQQDEEi�K�.̛7O�}ƌ���ڗ�/��/_�Vոqc�,Y›o�ɱc�8{�,}��eȐ!:t���t��������.�����H�ΝK�6m8t�666��0u�T�N���0�x,�ڵK�!4X�}�ڮ�sA��͹s�\�t	[[[�L�”)S��s̘1�3���LN�8��ӧIMM��ɓDGG�q�F�|�I��=x� >>>���������s����;w*.��������l?|�0���dff���r��N�<	��;w����Ւo��eJ:v�T$����1q�D�����ϟ�za�k׮j}�x�L�4���Y�~=}�����L5j������8p��>�8��Q����7n#F�*�������?`aaQ�ׯ_g͚5�^�;;;8�S��������֭[<x0������i�577�ҥKlذggg���,T[��Ӻ̕��C��u��L�2�/����G�bmm��۷9{�,-Z�����[�rҧO|||�;w.T�SdB!�N�S��G������C)�8w�\�7�BQ]�1���144$::�K�.`ff�СCqqqQ�;�|Ȏ;����q����t�ڕ�#G���u��-Z(�k[��aӧO&M�Dll,7ndӦM�;��kג��Č3�'%%ѲeKF�������u��u<<<رc���Z�J�!��&,�����?~��72s�Lk�I�W�^���WWW���ټy3����Z���+Wj}������?��^�w>����瘟 */�q��u.\Hff��c�.�q�T@U�\�P�ڕ/^߼y�X�*U���ooov���ѣG�߿�ڶ�͛+	$��Ÿ��ҪU+�n�J�&Mزe}����Ņs����O��O���KϞ=�ҥ?��S��Е��';w�$55��Ç+�I^^^������$V�O�̕��C���ٙ��(��°����ѣ���2x�`
�/�
4H��~���-U$s�BQw��"D=stt���B��B[����0\ՠA�4>d��ٳg��;<�u�v�xtm�m2N�~�C[�%K���wܢE			!;;�N�:���͙3gpssӚ�#������3gFFF�ݻW�E������3::Z)�?h� ^{�zW�����5>f�
Dbb"_}�gϞeÆ
���3w�\e���C�RXXH||<:tPۇ��...W�$FeU�F5jTm��K�j�r�J233133c��ᘛ���s��4ϔ��+�...��_�%��R�r�j��Tm5!�֭[s��Q�/_Η_~Ivv6t�Ё��x���p��I~��g�l٢$zu�ڕ�����₇�۶m��?��LJ+W���V;���	Æ
c�����hڴ)���x{{�c����0a�~���\����M�4�O>!##��ݻ�ꫯjT�N]���̕��C��m۶L�<�m۶����,���Jn�dURa�9P�P!���$9E!�


(,,��>P�+{T�����7����P�V���)���z�N!yyy,X����0\\\���iݺ���B���T�����������_�Z!�����(	��߿�-[��$���ՋӧO�s�N�z�-�}����v�P��̌������ٳ���J�*��.T�0����i�@��	PRR�q�TE�|H~~>-[�t�2`jj��˗ٽ{��lIuڵkGNN�nݢ]�vj�nݺ���aԦM>��#>��#�b	.@-idȐ!���O��1c�Z��iӦ1mڴ��Q��������a�6l�p׾3g�d�̙�MNх.s�.�P}�>}:;v� **��G�b``��!C4�����-Y���
�?��:�.s�B���O]B!�xl
6��cǒ������ƍ�wH����1~~~���q��5�]�F\\~~~5�BQ{�O�>�����W_�y�fIL:;u�T�VM�Naa!K�.eʔ)���ұcG�������/���	&`eeŎ;(((�G�XXX�UK��$�U�Vq��E����s��f������U;����|@zz:%%%�;w�>��DZc�(..&++___�=//���z�2��̲k�.
�t�N�U���LJ��,JKK�q��1VVV���+}{��	���S��M�G�x�e��e�6���'�d„	�ٳ���<�����Oh�[�b�{jj*����;�N��*�B���)B!��СCnݺ���>>>4n�X�!�w�����ÃիW0w��אBQ;x{{���=�6m�}���K��XB�aFnn���l߾���0<<<��*�������Q�}���ӧOg�֭DEE���.]�0o޼j�rrrbϞ=���O����K������dzl�2�-[��=++kkkڴi�͛7�����ԔݻwckkKll,k׮e�ڵX[[�zlWWWIKKӨ٬Y3.\��=d�:Dzz�����t@��B�Ǐ.s�.�y�.f̘ALLP��նm[�؟}�Y^��:�.s�B�N*���Q�F�#?�#?�l۶M�Ӕ�">>���d>��c�u�e����Y��5k�(wX
!���cǎѯ_?����/رc�$�<"���������ӌ1B�т�֯_���<x0�ƍcÆ
��_`ee���JJ
VVV$$$���?+++��ۧ�[5��/��၍�
#G��>Шpr��
�/_�ȑ#�����ח����v��m"##0`�����~+++"##�}�v����z�TG���gٲe�����###���quu��S�;�|��������'���###,,,x뭷غu�R�Dccc���?~<O<����XXX�|�r���t~��/f̘1cdd�s�=�|��9s�$OOO:u�D�ƍ�yt�…L�2�֭[cdd���5K�.���-[�$44GGGLMMiܸ1&&&��ڲy�f���ǎK���IJJ��ORR-[�T�%!}5�Ӻ̕��C��hѢ��aô�	���CCC:t�3شiS�c�9T!�P'�S�}eccCtt���B<:w���BQO���O�}�]V�^��ѣ9x� �:u�wX�>���JGqq1���ddd(}�]�Fhh(���1z�h֭[Gff&4o��}����w�)_�߼y��W�bdd���M�q���q��-���عs'eee���	'3g�$;;[y̞={������޽{)((�Z���ښ�������ɓu:VB�{��b���?~|�?h� 
T�ڶm�Q��ڵkj���]���ުU+e���T	*cƌa̘1jۍ�����ۻ�1jJ�111aѢE,Z���>Pq1��ё�������ϳ}u�� IDAT��9s�nnn�<.���+���y���$6�={���խ[7�}Z�n�T���̡B!D�H�!�B!��&55+++6l��
����ĔGX�n�HNNV�
'##�޽{�m�6N�8Att4���#%%���8LMM�׿�Eii)gΜ����```@rr2EEE����_x����ҥ���$''3s�L<�lߺu+��٘���e��;Fpp0.\��Wrr2�z��ئjS�B<�
���;v� //���2~��G�B���?���/�~�i"""����LMM5��B<��\YPP��7����>}�_�P!��oR9E�WG����I�a!���j҄B�p)))��ߟ��kkk����?��ﰄ*/�SS{�;S����ʜ����cǎ@E���'N$>>��'2z�hΝ;ǩS�����ĉ���1i�$���K�9¨Q���;;�c���R*�999J^^��=11�%K���s�`ii�;�����u��y�"ᥪ�]���B<^~�ev��A@@j�ڴi�V��Qdll������W.���űn�:�5k���
EC�++/�caa��q��2�
!����@����;!D�8%�5j�H�!!���C������Ņ���+W2o�<�P��@���r���j�ٸx�"�F�⣏>R]���GӦM����믿��S�S�.*hcnn��nbb@YY���/�ЧO��i����͛@ŒU��T}��Uܷ�~ˏ?�Hqq1O=��f֬Y��f���������ի�;w.���z�Jѐ4Թ�C�ܺu+++|||hܸ��A�P!���$�!����
���CQTw�!*.��t�R�����ӧ��?���DU��WL��^Y�)p��ܹT\$�۷/iiiܼy���DH�6mx���9r�dddЯ_?ڴiS�~�4i���-XW�
5�Q=^[���M��x�����')�1BԤ�Ε���w�S�����B�Ir�B!�B���㏸��r��q�}�]����^��SSS._���ݻ155���1c8s�[�l!??�"�7%%�O?��;w��uI��033�ҥK�>}kkk�]�lPe�ڵ#''�[�nѮ];�m�n�R�!�B!�B�ړo�C�����S�aԋ�z.���?~�A���k���>��ϑ#G�勄x�9::��0�Л��r>��3<==�֭)))���W�a���Ύ͛7��プ�=z��?� <<��[�beeŦM�9r$�W�f�ΝJrʐ!Cd�������s\/��"6l��ߟ�˗ӧOΟ?ϊ+4���ٓ��._����r��e��B!�B!��=IN
��o�͡C�Hi�����Kjj*AAADEEQ^^�믿��������H����J�!6I2����lf͚EBB���,_�\cY�xsuu%11���4���ն5k֌�*�k�KKKN�:EϞ=�С]�t�g��_~���]+�Ԇ��3�����̙3Gi;v��p�2d�:Dzz:���j�T�V�z�1	!�B!�B<N$9E4x��w��>�Kaa!K�.eʔ)ʗ�����������=�!�B!DU���̛7���ۓ���������T߲eKBCC����9x� ����h�KKK����޽�Z�1c�p��)�d"##�eI###���Y�~=���'??��Ç����޽{��;��kג��Č3Զ%%%ѲeKF�]/q	񸑪�B��,&&GGG}��7NNN�ڵK�a!��&�)�A�������&,,���\�M���988�}�v�������ctB!��Q����[o�ŗ_~ɿ��oh޼���zV�g7-ZĢE��{{{���5�===�����š��E�x{{���]c�-Z���HHH���t��	��t������5 ��:w��ԩS��B�h�ԩ8P�a���B�h�:u*�;w�wB($9E4h���ʿ�:uJ�=88OOO,,,شiS�I.U�UGFFHZZM�6eԨQ,X�@��ȯ��ʆ
HNN�Ν;t�ڕ3f���/����~bbb��ʢ������ckk���͛7���BBB����۷祗^b֬Yje�o߾Mdd$PJ^<���XYY����iժ���Z!��RZ�nM�~�pssӸ#�>���j�*RRR�믿pttd��̀ڞCU
-Y�~����ӳgO��t9���?~�A���Bԣ��X�z�-������1b��C�pqq�o�!""///"""055�X�Hqw666����;!�Ո���wB!�xHr�x�r��m�D
]���q��-���عs'eee���p��M\\\�~���/�l�2JKK7n7n$$$Dm�999DFF������˫����www222��k׮Jzz:AAA�w�^


����؏��5)))�۷�ɓ'��x!�è�����������֭[�=��חӧO+W��qU����СC������JPPQQQ�����caaA�~��O!����̛7���p�|�M111�wXB<0�����1�|�O�@\\�֭�Y�fz�N��϶m�prr�wBqW���DDD�;��Q�F�A!�}�X/['IN
Z�*)�.\u�֍��P��"��ҥ~~~<��S�������-[�p��u�}�Y��}ڷo�G}ė_~Ihh����}�v���7n�5�ܹs������T�s	'##�޽{�d���͹|�2�������ĉHNN�W�^�EՖ��,�)B�G^�y����k׮���Gjj*��y�I�u���T$#��ߟ������i�
�:Jm�q?t��=�SXX�ҥK�2e
���@�������ĨUBB�ޞ={�5keee|��׼��+�I��߿?�^���s�bii�稄x�ɝ�B���qO��8q�\�B�G�T�
�$���nI���w�p���\��///�.o'''BCC���S�9r�ŋ+�|||���ÇS^^Nff&�~�-.\��ɓܹs���cǎ@Eҍ��'N$>>^IN9�<P�TSU׮]�!NuY��qg``@�N����˴i�8q�D��QRRT��F���=��q��&,,���\�M���988�}�v������x�1	�0���gѢE|��g����|��'�m�V�a	�W���r�F�z4u�T}� ��ڵk��CЫ�S��<-�B��J�S�CM��QW�����2�eeeJ�իW�ٳg���~�:.$33Sc[yyy���r�
�Ǐ׺��ŋ��7o��U�V�Tm�>B�G�*q%88OOO,,,شi�������o��F���y饗�5k�Z"�jǏ'00����CCC^{�5��ݹu�~�!��I�&6///Z�h�����s�nܸA���1bs�̡e˖\�r�ɓ'cffFll���0aW�^%6633�Z�~7��=�rm�}�hV����a�޽,_���_~Y�g�|}}5j�~.���n��>���D�qؿ?111deeQTTD������Ã�͛�WmIY���H�f�x���;w.M�6U�dd$P[��駟��ʊ��H�O����L!��#G����ʭ[�����/��B!�B!��J�S�^T�P�J�]�,//W��,..���M�4Q~׶�fm��\�r%������1|�p���y��jU.�n�+�+���100��j��A�x�r��m�|qq1���ddd(}�]�Fhh(���i�+W�TK�����ԩ111�~�����o000��w�*�7�|�K�.)����a۶m���J�Ν�����ɓ���ѧO�oZZ���833�:�^��~�	�v��ݗcVoooRSSY�r%���<������@�X�dI���M�ks�7o�������v�7n�HHH�Z���"##��˫��?���=z�HTٶm%%%xyy�w�^


����x���5)))�۷O���.���X�t)��������SO�;,!��9�|�7%��/������	{��/Uk��؃��Y]���T�W��>�z�*���?~����4i�3�<���Ù6m�rs�JM��~��ؕEGGs��q
$������뿡U��@!����_u�!�J����W�*Wѕ���C��/44�0n�8��� �155`��ݜ:uJ�'%%E髺�W����m�.�
!-ݺu#99Y��NFF�{�f۶m�8q���h���GJJ
qqq�HOOg���=zwwwhܸ1;w�$99�9s�K��|��\�t�N�:ʱc�		�cǎ\�x�͛7(	�|�ڸ���L�2�αWURRBff&���<xp���_t���Z�j�{�G~~>˖-����w�}���|���4�@��/R��hS5�ڞ���zΫS�q߾};P�`����ѣG���OHJJR������MRR��l����������K#6U���B�S�Nѿ���	櫯���!�����~''�j�'&&*�?��员���"{<���888͕+W(..&??����������J�����I�cW���JPP�/��ӓ���s��}�%��t}�7$2!��'�SD�רQ#��˹r�
�;w��o�6m�y�&�v�b���\�v�N�(�2���HV�^���?O<��֭#::333���K��ǎcԨQ\�tI��<ڶm�����ٱy�f|||���G��������u�V����%z��INN�/_�HB�|���G��.�j{�����jw�%$$���Oǎ��d???&N�H||<'NT۟��7=z���ёM�6���d�e���ӧ���J���Q*���ۗ%K�������ၭ�-m۶%!!OOO�4iBII				t�ЁaÆ�9������	o���F{}��0`���DDD��or��9x�tڏ6U��y���缲��ÇS^^Nff&�~�-.\��ɓ�zE�����;t��
�ٳgɍ7���ϟ�^V�2ղ�>Bu���>���6���x��%�h���Q�$)��bbbd���СC5n�ꫯx��W��믉��c̘1"4�d��ڌU��Y����|����֭���f����

R�s�����9�Jaa!K�.eʔ)��o�����������#��{�t}�7��) �B�IN
�*����SSSv��]m_[[[bccY�v-k׮�Z�x�
HKK��W_U�6{�l�q���Y�l˖-��OVV���Z����+����������f͚�p�B��!C�p��!��ӱ��T뛞��СC�|�Յw�+W�0~�x���U���Vy�sss�wm\�����D�ʞ�y��+���!&L ,,���$F��ѣG�u�s�̡q��u���ƍӶm[�����ٳ����1���s�r��	Ν;G�n���Sm_]�H�m�Ceu=�թ�_�~�������-g�ҽ{w�֭[PVV��ݼy��ZS��M�G���tf̘����	����,��ڵk�v��wB��!-Ӑ���ɓ'iӦ
���9r�)))���Ri�>IKK`Ŋ<��@�g�����9r�>ClP������U*M888�}�v���4nX�>ܯyZ^��F�!�IN
BMof===��O��ɡ����,\�(,,��ʊ�K���K/�)�v��FPPǎ�����ݻ����ȑ#�~�/������$JKK�ѣ�����������ҲeKBCC����9x� ����h�KKK����.΍;��kג��Č3�bMJJ�e˖�=�N�U�U��|ȯ���.�k�TѴiS�}
��_��I�&�e����kF�A||<jI�;�%H}3}���΃J}�����+W������Ç��ܜ�{N����Uӵůj��B�����իW���biiə3g�jJ��S�DA!�hH���f߾}\�v�&M�`nn΄	4�BBB����۷祗^b֬Y���U�}��������^z	ccc^|�E"##���S�a��ッ�������B���믿�a�����s�]�veƌ����ϱ�����i֬/��"s��U�˫Ɖ��e��ɘ�����	&p��Ubcc133����|~�e�m��믿r��u��J�Ν�Ʃ�Uw.��U[�����ƾ�5�{���}�6���0�:(�O?�4VVVDFF2}�t��B�/U���2o���6T�(�n�:�9Baa!���̘1�%K���U=622���@���hڴ)�F�b��j7��߿������(**�}��������A���e>B!t$�)��3f�F���>���퍷�w���{����;���_c��Z���Ϝ9s�ߵ=�XaѢE,Z���qZ�h���#!!!dggөS'���3g����v7���`jj��˗ٽ{�֪!��cǎ���O�9s��*�5l+�߱cG
Drr2���>|��Ç�}P~��Wv���O�x�"�>�,�un�]΃>?~���Pڴi��K���%%%����v�ڑ��í[�4��S-KT�]��Յpqq���Ӽ��{xzz*���I�dA!D����a޼y���_|����_q��9Ν;G~~>NNN���NFF��ڵk������NPP�]������7nPQu122�ݻw3k�,��Ё��ܾ}[��s��M\\\�~�����ŋ,[����Re�*���=z��(�m�6JJJ���R�׹sg���8y�$iii�R�PQ} ;;��bffV/ǣ�t{֬Y�X��9s�0i�$lll�ݻw����z.jK�sv/�ƨ��ڻw/Z+F[[[���¾}��<yr��+��j;oý�����5k���Җ���$�h���|PTT�Ν;)++�����7�����"##���S��2!�x\ܟOB����Ņ��~����-""SSS�e���;;;|||��ʢ���7n���cee���{��ekk���?iii�������|h.-6y�dJKKquu����)S��-��=�ɓ'ٶm���#44KKK�o��ɓ'�;|�σ�;v���b����U����+���Y҅j��˗/klS�U^�H��Qyy9�ׯ�_�~q��)���Jb� &&���}�!�c#&&�'N�;����B���9v��VnN���R�������A�޽ٶm'N� ::�~�����B\\�~�ҩS��>y�$W�^���B�4faa���W�^����nݺ����\�ܲeׯ_��g�%66�Ç3i�$�"��������h�����<�u,�E�o��F�=>>@��U��Q�����]�:��I����Ą-[�0{�l��[o�Ett�ZE��h��ڪ�9��صU5F]�Wrr2�z��د�M�G}��
��������_~�cǎ���r��1���kLP�ҥ���$''3s�L@}�ݾ};P�8����ѣG���O��*� �B�+��"�C���???�ϟ���Ӂ�R��֭�Y�fz�N����$&&������֬Y3.\Xoc���p��\��|pW�ܹ�F�СC�С��������/�-��9��۷���y��,_�CCC���ppp��w�%**�^˧�z4[[[���Y�l˖-�؞�����5mڴ��͛���cjj��ݻk=Ɛ!C8t����XZZ�mKOON������?��op��!�,Y���o��:���������w�u�%;Tm?u�͛7�Ν;DDDp��%lmm�2e�F|BBP��ݱcG�⢟��'N$>>^c9��T��Vɘ0a�V�⫯�b���svvV[j�ȑ#@�rН;w*�Uw�W��;�Э[7fϞMdd$7n�����֖�mے�����'M�4������:t�a���x�U]�VU����ĉ�>}���TN�<Itt47n��'����U�Em�z��E�u9^�ϟ*.�WյkW�>B�]��j;o����_�T���T������׷��e^^^����ɉ��P�f�ÇS^^NO^� IDATff&�~�-.\Pn@���e>B��!B�����ÃիW0w�\�sB��S]�hٲ%���|���<x���\Z�h���%���t�޽��kժaaa|��$&&r��
ڵk�ȑ#�={6&&&j�
�8q"������k��~����q���_y��/
:v숗��.�X�����<<h�/������$JKK�ѣ��������5���|��'����.��Ǝ�ڵkIJJbƌjے��hٲ%�G��ϧ%�Cc˖-̟?�N�:q��1��rB!���{�q��q�?�ƍ�9s&���j7먪�?^�~.^�X�8�o���Y��5k�h�9x� w�ܡe˖j��*W�^j_ѯ��֭[PVV�����!&L ,,���$F��ѣG�u�s��Q*��x�����\��Ջ^�z)U87o�Lpp0�V�b�ʕw�깨-]�ٽ��.���͛Zo�P����/�������_UA���Wk��;ssss�w�(����ׯ�p�B2335[^^^�~�B�!��IN�!���(w:
���A-ZĢE��]�[�n����ƺ�ՙ3gs�̩v{mc�)κ��q+��X�Bk��+���+��R�j3�Jm�C}�s]�{�V��׺���]Qu��E�8::Bvv6�:u ;;�3g����F���u�[��ݯ��ʜ9s���Y�p!��T�BѠU}��J���p̘14���D���+Ξ=ˆ
g�ܹ�27w�`x�����s���?���={�h�_�RG��ѵ�ǤI�زe_�5#F� >>^�A@�^�ǽ�e�C�RXXH||��2FFF�������k5vuDz��\9/�γ��.cT�.�K��~���x.B�2OWU�y�>_�U_G5�*W���o�ʕdffbff����177����^�k��@!���$�!�B������|�
J�NDD����5	񨋉���ÃV�Zq�����t�0�\�4h�N�
���	�Ǐg���ddd��~�l�B``�r���Ԕ˗/�{�nLMMuC��Ϻu밶���~��Q�͛G\\\�KS�<��S����\�x�g�}V�X�cǎ4���d���9|�0ÇW��{���^�2v�^�8}�4;w�䭷��خ�����km4jԈ��r���7�*���9�����x�k׎��nݺE�v�ԶݺuK�#���fޮ�׿������ٳgՖ�>{�l�cW�w

�M�6\�tI�^RR����Kl2!����ݼB!�zfll���qqq\�v�k׮����T����7o���믿���=gϞ��!�HMM%((�ŋ������9s挾�B�h„	XYY�c�


�ѣ����vvv������Eii)7n���?���
www���Nr��	.\ 33���<Xk��K�.dddp�…c2d�W�&''���"V�\����&M��P7y�dJKK��/�&��r<�.c;88�W�Z�ŋ)..�Ν;>|�ŋ��4�_MT�w��Eaa!�.]"  @�_mϙ��k;Fut9^�e�T�+S�=�����Im����R-����NII	�Ν�>���q��1���������Wi���d>B!t!�S�B!�C���xxx�z�j�Ν[��B<J���fϞ�������I������K�2e��S{{{|}}������X�
!j���4.�U~����Jbb"iii��5k�…��۴i�͛7������TI�6mZ�K 4jԈiӦ����o�]m�o��			����ꫯ�m�={v�]:�:�������Z���x�7]ƶ��c���lݺ���(���4�ץK�͛��]���޽��Xlmm���e�ڵ�]�@ke�ڞ3mc�v���r��¡C�HOO�����T��B�j;o��_���{��᧟~��յ^ⷵ�%>>�e˖�l�2��YYYX[[�| �B�@�S�!%��5������Q�a!R���2���J^^�-"$$ggg֭[�ܙ'D}�u霆(,,���\�M���988�}�v�������ctB��j�o���144$::ZYV��̌�C�����kٲ%���|���<x���\Z�h���%���t��]�����'�|BNN���|������+��端�ʆ
���ok�Xڮ];���

�رcѽ{w\]]9rdmK��8q"������k$��r<ꛮcϟ?���c����{nܸ���!]�ve�ȑ888мys���W\\\c,.�����
���b�ҥ���Kj�j{δ�]�1��x�;��kג��Č3����D˖-�JB�']��v��_�ULPP��Ν;t��
ggg�-[������u��Ŕ�����Dii)=z��ٙ����`��������@!��A����r}!۶m���	�?�#G��n�:=G%�x���(_�999�ϐ�I����B��S��Q�����̜9���B6n܈����C�F��$�U��:5%����̾}��v�M�4��ܜ	&0q�D���������o��F���y饗�5k�ƅ����ڵk����w�qUU��_�T�*�	j�w3��
�ZjY��x���15%/X)�(���P��1LK/(���:2B�r�A������䠼���g�z�um��v��K�.%++�7�|��_~�m۶i����LBBǎ�Y�fO:�BTI]��A�	���ر___�9B۶mHMMe„	,Z�����8�gO]�+���&--���~KKKBCC
�S#���4u��όK2r�x�lmm���5tB!�B<�rssquu��ۛ�'�}�vZ�nm�D����޽{�Ϗ=">>���xrrr��9���899�����MKK��Ϗ�����166�pݒ��׿HϞ=Y�p!'N� 77W��666���p��I&M�T�"�B�0�;F`` ...��$
�i@�x�
6L��4f��6mJJJ
��9}��5p�O��B!����QM��ߏ����ȏ���40�B���ŋX[[�޽{9t�$��;|�0[�n�…�;wWWW<�� 11�^�z��~.^�Hpp0}��!&&F�
֊�-��ˋ��@:v��֭[�!ߣ���޽��:�2M!��Ycbb���;���������Fhh(���4n����	Q�ƍ��
5j`ʔ)\�t�-Z(���+��B<+d�Q#���
���K�)S�N5tB�*		�a/E����g���xzz��k�q��)e�f!��T9O*�t����dggHrr2#F�`���L�<Y�nXXXZZбcG��ݙ0aǏW��H]
///��ߏ��۶m���LYv��Mڷo��O:tЪ#�B<���뇳�37n`���X[[8*!j����ڵ��o��~ ??�^x���3��:��/��B�g�$��1e�C� ��Ŏ9b���v��I_(�s`ʔ)8��a�:��ի888������7.�����a	�X�t)�ׯ'::���h�o��ܹsQ��Zog޾};;;��IJJ�T]��������o��Ɵ��'e���h֬��z�2M!��Y�V�%�^�y������B�~��"�B�[[[lmm
�B�Z���OOO֯_π�z�*�:u2tX���t��g͈)%�ƌàA�8{�,_�5W�^��LJ��/^̤I�(***����l���P��>|���<v�؁����L��el�;���L���B!�B!j�$��:���ղn�>i�₃����`РA2m�B������EB<��j5����C<�nܸ���#W�^��O?e���z�Q[���agg�������:u�={����$�XXX����ѣG���(s{���|�rZ�jŖ-[8w�������sss���������\k���L��B!�B!�x�$9E�*�r�
���<x���"�M�F�.]�ӧ��CB�B����AQ�d&����B�l�ªU��ٳ'��׿���B�V�Ǐ'55WWWƍG�Ν�駟hР�Ro�ȑ�޽777\\\�ܹ3���;�۷�JŎ;*\���3gr��q���ؾ};[�n�k׮��������������B!�B!�O�$��:�<#����Ç�Y��ɓ'+o���۳z�jBBB011��0�ϑ)S�:!D9r��!���?��;����Y�z5�V��~}��&j?<<<ذa6l�Zfmm������ٳg���c֬YZ�7n̲e�*U��z��j�*�͛Dž�z�*���
C�!<<�����:th�w^Qi!!!�A!JR��ۄ��h%!�BT7��)j��L�S����������ӕ�3fp����qvv6`tB!���***⫯�bŊ�oߞ�/ҷo_C�%��������S�~}���INN��ʊ�C�����kڴ)~~~�ڵ�3gΐ��A�&M�����ɉ�^z�RuK�ݻ7'N����l߾�;v0v�X6o�LDDs��ѪAӦM=zte��dd!����9"/d!�⩒�Qkݾ}�I�&aee��Çu��?�;w�p��a���8u�!!!ܸq���<Z�jň#pvv���To��b�ݻǶm���Ç�5�U�V鬛��EPP����u��Jy�6mP�T1{�l�5kV�C!�O�͛7u�����Ӽys���âE��|@TY|��������#�j5�w�*��Ltt4�
��B��s����#,,�+V�~�z5jd谄�0;;;���X��̌�˗�|��j����U�Vi}wkҤ	j�___RSSi۶-�����ƲhѢR�+
!��Z�F�V:!��(**2tB!��$9E�Z�ڵC�R��G�޽�eqqq���2p�@���ؾ};���Z맧�ă�����fVVs��%55U)������ѩ{��	rss����YfccCLL'O�dҤI��e!��q|�����J�(,,��~�̙3��İo�>ڵkW��^��˗/+��޽[��]�rooo<HQQӦM�K�.��ӧ��
!D��x�b��͉��`��I�皃�ǎ#00���Й:H��DFF�e�C�!�Odkk˒%KF��y��d�lmm
�:!ʢI�8v�V�����<y2��Օ��(Ο?ϗ_~	<������Gjj*VVV�ٳ�.�s�Nnݺ�S7**
��ݻ�,Ӕi�!Dm^��K�.)?111|�����ۗ��v��U������}�vbbbX�j��~E=|��5k�0y�d,,,�����ޞիW�����]!�t��]�N��Z�f�̙���Jb�5���wwwBCCIKK#--���P���iܸ����θ}�6!!!�C!��ŋ
�A���H?-�ϡ��n߾m�0�P��)� �M��<::��-[*C�7hЀ�����hݺ5Æ
�ܹsq��u���[nݺ��@vvv��:{�,�x8�={`mm�G}�￯U��͛�o�^g;:tЪ#��o�����ؘ�m���2}��ræ��x|���hذa�����OFFӧOW�f̘�����ٹ��
!Dy����p�B6lȉ'=z��C�N�ׯ���lܸ�ŋcmmm਄�����
�B�j�̙���e
6!�x�:!���)�V�_�>�Ǐ��(�ϟ'33�	&P�^=��s��aΜ9��/��$''�/��КB�o߾:u�߿@�f�t�i�4u��:�c����<x0Æ
�w��ȑ#:usssٺu+vvv<���~���:�U*U���%i��233uֿ|�2�F���ɩB��������ⱹ���R���4���;T*�����iڂ���߿?�[�V�i��JEPPYYY��_!�����L?~<���:���"����j6m�ĦM��1c���B!�B!��sd�a%G(k���'�g����F�����166f„	JOOO�_����Ç�S�N��ٳ�sejYJ&�ԯ��_E�mhl���)��D!Du�f�޽��G�O||<999�>���899�����MKK��Ϗ�������]��?`nn����ˋ��,%!��cquu�ʕ+xzzbmmM�6mHOOgÆ
�nݚU�Vp��	rss����ن��
111�<yR�>N!�[XX���#??����;;;C�$�B!�B!�#�)�ֳ��dРADEE�����s�>|�֛�������ѢEe�x<M�������HNN����Z4tꚛ����Nff��Z�h��
!De>|��[��R�x��ǏgÆ
<xPIN	 11�^�z�j�*:u�DJJ
���ʄ	�t�R��*((�֭[|��g<X�Nǎ���S��)o,��O�f�X�~=��ά]��;v�n�:rrr���������(�w﮳
MYTT�$�!�]NN+W�dǎL�<Z�je谄BQ��7oҵkW��Μ9Chh(׮]#;;�nݺ1j�(Ə�w$]Q>5=�mpp�r�pРA~�MaXe��������<x�333���*M]��[5ѿ�g�cM�%㩎��ܹC@@��Ѥ��ӠA���?3|�p�O��ܛ�(�=m�l�8�	!�Hr�x&L�4���������ɓ�ֻp�������|���J��hٲ��y�������Ã�?��޽{s��M>��S��]�v%==����$�����B���/�%�/]����)������̈#�<y�N���������www&L����ǵF��L|fff̛7O�|֬YZ7�3�����V�	d޼y���3c��Թy�&�)���С�V!��.�ϟgΜ9���o�߿��ӧ:$!�B��> <<\�!]nn.����?^�<..���8���X�v-#F���hEe\�rooo<HQQӦM�K�.����С	!ʡ�~Z��ٳ<x�x���ٳ�3�&C�S����`�rrr����|n޼�͛79z�(���ʋ�O:O�!�.N�CB�M�S�3a�С�nݚ������@�1��Ǐ�v�Z֮]����7�N�PҬY�8u�7o�d�…J�رc���!C�NBB���Z�4#�:��(�O�t�R֯_Ott4���l߾��s�V�iܸ�R����N!���T���իG˖-�ׯ,���B��&��iDzx�b.^�H||<;v���߿@�ی�2M!��������[���7����W_��#��MfΜ���&�x��j��Cz����-wss��nݚw�}�!C�мys~��>�޽{���ٵk/��r
G�쫩�>d͚5L�<Y����ޞիW���I��!����i�������z�o�����P�&��d"Dyڪ�x6m�DNN�ߧcǎp��u6m�č7�V^~�{�ٶ�\��B�$��Z�I$3a�v�܉��=FFFZ�W�\IAA���t�ܙY�f��?�s�N<X�䔆
�s�N�n�ʩS����a��ḹ�q��	��cǎe���DDD0g��e4mڔѣG��!ꪒ�_Y�k�3�A�q��Y���k�^����,^�X�������6���+ߓ�:�:c��u���Xg����D!*�ʕ+̙3����o�΂�Ol���sڵkg��	5=݋>���DDDвeKv�ޭ5����%�������������
�(���?Z��͘1��������T�i���t���{Z�h��~Hdd$111���/��������~�������ӷo_<<<���'22Ґ!�*rB]��"�.�ͤ�f͚���Q�z%�h�Gt�&Mpuu��յ̺M�4A�V���Kjj*m۶ 55���X-Z����wL!*���;;;���HLL�ԩS�ٳ///%9��‚���=j�7��V,۶m#))�=z������7˗/W�������Nff���k���J!�����<<<��_����
�����⋆K!�xn�s�NN�<IZZ
4�S�N�?^g���$r� IDAT�\|}}	��_�U�V���̟?_I�/>�i�G�`���Z�)�M�6���"�u�U����Ν;9}�4��ݣU�V�5��ҴiS���������o��~��L�:'''233����9w�
4`ذa���ФI�����ذaaaa4l�[[[�,YB�V�t�ڹs'+V��K�.�ر��ǩ"Ǿ���=ܮ�

��ˋ��85j�k���ҥK��г��

���Z�M�6�T*����={���6��SS��Fhh(�����������Dhh��Ke�����>>>DEE���M��3g�ƍ�����\6l�ٳgiܸ1���:�/�Q�FZ�>|�I�&aee��Çu�3~�x�ܹ��Ç���*w\Q�I&�H�-[��_~��ݻJr�F�v��)�v.J�U_���ٓ�~R�q��B�'�)BT���ǎ#00���`֬Y�N�?~<������2n�8:w��O?�@�
�z#G�d��ݸ�����B�Ν����	`߾}�T*����EEEܾ}����Y�X���g�����Ӈ;v���́:t(����k׮�������������k׮ճ�B�:�ƍ̞=�k׮���ɒ%K��$Dm5u�TC� D��V�	4t�4ooo��ݫ|~�������Ǔ���LU���������Jݴ�4���HHH��ۻ��v||<�x:��4i҄y��i�egg3o�<�������t���OLL~~~:/1yzzj=�ܵkm۶%$$D�?//�cǎall̺u����ϕd���<�?Nll,���i���"++Ky@V��T�c_�z%U��-Z�Hy� //�C�QXX���'N� 77W�H�666���p��I�%!D��T?
�G��ox���SJq��Q�ϟ�w�ܒ}��qpp��ݻJ���$֮]���l[��Օ��������OAA��l@�]�v�T*���{����ݻ��,..���T���U��ʪh������O?e�…L�8[[[z��u_��J����9���\;�:$���T!����wwwBCCIKK#--���P���iܸ���B<gذaÆ
c��ʍ7kkk����#:t ..�Y�f1p�@Ǝ˾}�hܸ1˖-S�h�x<�iu~y�L,呕����;���|���ԯ__��n�:������HNHH�ن�l�СU�;!D]SXX��͛����^�z\�|��K�Jb�x&RTT$?�#?5�V�
�_���I�غu+.\�ܹsʨ�T����H�^�ؿ?/^$88�>}�Chh(����K�����PF�-��{����L۶m����…���biiIRR�w��Y'!!�p��y�������իǡC����RF>w�����lٲ�.��燥�%w��!  @�nǎ�����?��q����֫�c׾}{>LTTs���̙3��(�w﮳��LSGQ=j����/.ݹs�.]�йsg�t�B�.]�s�N�#�������ݻw�ѣ��ܹsL�8???����7������P�j)��I:8v�V�����<yr��GI*�J�OET��'��ၙ�{��a��>�w�}���`���e�?�=�U�s���˫*�N�	!�~rU�*�ׯ���lܸ��7�x�b���BQe}a���g�ڵt�֍�
ҰaC:uꄣ�#�ׯW�5m�???�j5ԫW333F���ݻ�FY�bm۶�^�zZ_ �KEb)�
6��/���₥�%�x�w222ذacǎ��Ԕ���mDDDдiSF�]�B�?���F���Ņ�>����H����BQ1�=P�W�9#00���`~��7&O�̥K��������A�.]�W�;v�����C��ԫWx��Z���nnn��ݛ
��+��j�*N�>�����+�;w�aÆJ���_V�ZE���iԨ�g��7=i�mllhР�{�V^^��t֬YZ�
T�8��ؗ�^u;ڵkG�F���<x�,�y�&�8���:h�B��6�Ӏ���/Z�?����Z�z%����HV�\I�v�055��͍K�.��Cg��>���;bbb�L�Ij,iĈ�lْ��0=z<�6,,�֭[3lذj;�U��njÑ#Gطo�*����<==Q�����j��(������ʵS�CB��L�#D5P���&��F���agg��zfff,_���˗�Yo̘1�3F���o�U�������e�~�)�~��N�7�|�7�|S�ܤI�j5������*o=���ˢE�t��B}����ꫯX�b�۷��ŋ�����a	!�u�ҥKY�~=���DGG�}�v�Ν�Z��������~oJJJ*��֭[���?���Fǎ��)**"''��M�*e������+Zu57ܹsGg;œ��?�ԩ�򻉉I��4H�s�>}���u�j�iT�8��ؗ�^I�9vŏ�f
��	E����Y�f:�j�4u�գ��鬬,%imӦMlڴI�Ι3g�����A�/��/�}y꥗^R~o޼9Pz2c���?~<���DDD0j�(Ο?Off&.T�!+{<*;HqU9ݻw�{��8::�����ݻٹs'_|����Ol��(������ʵS�CB����"�B�璃�mڴ!00P)��‚Y�f02!ij"--�q����쌳�3�.]��!�y���}	V�r����e�B<�4#G�AR_��1c���oY�v-���
yyy���0n�8:��[TTTf����e.�ݻ7�ϟ/�εk�9r$������en��X5j����S֯��ޡ�-}�|;�"ǩ�Ǿ��ʫ�cנA�w###��2}�BS�o=!����O��wO�����/�}��Nyɾ���@EG��8q"���|��7��5����0a�R��ǣ**�СCQ�Tddd��kذ�2yttt��.�X�I�y����ImhT��)�!!��OFNB!�s���www��}e(���P�l�R�[{B��ŋ177'""���:$!j�>�����jyc�Ъk_�\����7����iӦѥKe$!Dՙ��)�I&&&r��)��ك���&M��‚���=���E��x�78~�8����7��-[j-/,,dǎ��o*o�[ZZ��?�������J\�-..Nk��+W���/>q݊�����+�i;sss���������\k�f����B����~Z3�ϖ-[����Y~��y�,YBhh(�'O.s[/��?��III��ѣ±<���%�
"**���Ν;����iݺ�R��ǣ**�v��ݹ|�2���w��Y����?��$###�����R�sV�6JS��%�!!��OFNB!�s�_�~8;;�q�F6n���ŋ���6tXB�Z��ݻL�:�Zʹiӈ����!�7tզ:���Ç�Y��ɓ'caa���%����^���VC�B���ǣR����Nnn.�;w�K�.��(#G���͍7n��p��=�����R�prrR�j�X��0x�`������_qtt��ɓdee���#�]��ҥK���fȐ!Z=G����qqq�g�}<~㼺}��$$$PPP��+W���`�رO\�"ǩ�Ǿ��Jz�N3݃�aiq����B���&��[�nq��u^|��R��
<���ۓ��ȭ[�ʌyȐ!lܸ���t������D�R1q��J	m�&M�?�P��)�0S��Q�*��3����/� ))���|���9w�+W���&�Ζ�E�9r�����̆
t���k��m��"�K�CB����"jDHH��CB�b!!!L�2��a��Z�F�V:!�3 44��ҰaCN�8��ѣ
��y�y�i�'##��ӧ+e3f��������l��x>888���
t$O@wtt��ٳ����L�ٸqc�-[�|nѢ�������=
��
x��w���êU�tb9r$�|��p��>}�۷o3w�\���ڵ�)�-[����Q��G�L�6��V�8��ؗ�^IO��
2���pt�NHH�NuYM��Ç`���N�bdd�������	

�>(5�w�y���0���x뭷��-X��|;�C��u��ddd`eeŀ��W�xT���=r�HfϞ;}�8x� ��^���Y�d���>#F�����l޼�͛7����L_��m�49^rB�$9EԈ�S�:!�B!�z���>�w�������o4o���a	Qk�B�x��;w�b�
�t�Ž;JMr)Y�����qqq4jԈ�^{��K�bbb����/����CTT���t�Ё9s�0n�8�6N�:EHH7n� //�V�Z1b����155-u_rss�%,,�_��V�Z��o0�|��糲�

���ZC��i��JEPP�gϦY�f>�B�5e%����S�~}���INN��ʊ�C�����kڴ)~~~�ڵ�3gΐ��A�&M�����ɉ�^zI��b�
�m�Fzz:���Jy˖-ٻw/������~��ȈA�1i�$��͚5��ߟ/����g�r��=���y��WY�`fff�q��xyy�n�:���iٲ%����NU�������+�i��cDzy�f"""�3g�ֲ���6m*��BT�!�霜���[���x��7ˌ����LJo��V+Y�$sss�����…�����K/���ȫ��Z��R&ccc&L��Ν;����I����nm����g�����ڵkܻw����ӡC^}�Uf̘����R���>˖-��ؘ��0>|�J�b͚5���Z��{��]�6��x�uH!�3****2t��~fΜ���BT�̙34p$�W�?��Q��C��y��ӧO3w�\���عs'vvv�I�jgddD``�2�X�ϥyRRIqœS�u��͛7y�7���+��Ҽysev��'�������Q��ܽ{W'�u����o�}�v|}}��۸q�b+�/���̟?���D�����c��3%���gÆ
,[�L�.h�y�f>��#&M��7�?���KF�*�;v���ˑ#Gh۶-���L�0�E�1�|G(j���_W��C!D��uH��ߋZ撌�"����H�l�b�0��[[�2�dB!�Snn.���x{{3q�D���KZ�je谄x&OD�`�cǎ������}}ڷo���;/��������q��%9eϞ=ܽ{�=z��V�Z�׿�������)�)��Օ��~###���Y�he�K@@�����ՋU�VѩS'RRR��� &&���P&L�@TTݻw��MYTT�$�!D
spp�رc���<N2���Й�A!��nrB]��"��۷o”)S��		�A���F���:!D��5χ.���ݻwٻw���o}�OzS֬Y�NLpqq�]�v��7����x��<22��+W*���ܔ��s��QTT�����o�u���=���e���������www&L����Ǖ䔛7o��jJ�С�V!�5���www��}fϞ
@hh([�l�q���N!��N�CB�K�SD�6tB�Z����ϳ�S�:!������Y�n_|��G��̙3�кB��IȨ�N�:)����PXX��ݹs��]�����w�l�2�_����IS�ܾ}�ԩ�������߿@�f�t�i�4u�BԬ~������ƍX�x1����J!D]!�!!��&�)B!D
P��2��B�իWqpp 99,X�������V)9"JYS����QS�����w�����_|D=}�O���ӓ�ׯcee�����ԩ={�,W��W��������X���L�!Du�h�\��q!��$�!!��INB!j@dd$[�l1tB�j`kk˒%K�(���<==Y�~= 66��;:,!�###�����ɡiӦ���#��/��O?���D�=J�
���-Z� 99YY^PP@���o�XXX����ѣG���(3sss���������\kYff�RG!�B!��.�}�G��J�ҙ/���f���,_�\�1B�}�6!!!�CQE!!!\�x��a�r�q����|��'|�駄��Kb��D3�f���hC�9�ÇINNfÆ
�n{Ȑ!lܸ���t������D�R1q�D��.\ ??�7n�z�j�������ȑ#pss�ƍ���ܻw����o�T*�������RRRt�֔=i
"!�B!�B�睌�"�>�����*�z�����9x� EEEL�6�.]�ЧO�j�T��5!�m3g�4t����زe}�={��_��W��+!*�E�ܿ{{{,,,8z�h�uG���Çټy3�7o��Ʀ�m���;����[o���l��Z�?~��kײv�Z��ܸq������ٳg���c֬YZ�5nܘe˖)��Bxx8			:��'$$0t��J�B!�B!��@�SD�R2	%<<���|��!k֬a����p����^����LLL�܆B!�(����ΝKDD�W�fժU�N�!�([YI�+V�`۶m������_�v�-[���1aaa<|��JŚ5kx�7*���9���x{{s�����x饗ptt��W_U�\����"""��?�ܹ3�f��~`�Ν<x��ҴiS���صkgΜ!##�&M�`mm���/����رcټy3̙3G+ֈ��6m��ѣ+��B<o4#	!Dm�V�
��̜9S^�B!�S%wiE���j��#����?L�>])�1c���gggF'�BQw����|�r���?s�����g萄xn�3�1c�h���}���WWW\]]ˬ_���---���(3�f͚�Zg�…�����L���,M�4A�V���Kjj*m۶ 55���X-Z���i���ygkk+�H
!�	�ڵ3t!}�B<�h��P:!J�w�^T*���Z�111�T*��´����P�T�<y�J�J����ˌ5J�\S��]�x9@nn.[�n��Ύ����o����F`VVAAA��ߟ֭[+�mڴA�RDVVV�!��.7o��)�����ѣY�r%III��^�>W��_�JEzz�β۷ok��/���IMME�R)od�k�2q=M5}^ʒ���ʕ+>|8666x{{W��+�䦗�niii���[,\�����KS�5���6m���baa�3-�B!�B!D]$#��Zk���lٲ��ׯ�����iv��I���*C#߿�;w�аaClmm�mxyy�����8�$���899�����������GBB���?��:q����z�K���!&&��'O2iҤ�!�x
>������5RUaa!���gΜ!&&�}��U�
���W\�=8w�����i�FkYdd$
6$??���(����\�vM�Nu����yy�իWs��e��ݻw���+W������)**bڴit�҅>}�T5T!��wߥE����k�-(�5���www��}fϞ
@hh([�l�q���NË����"���Z��lZWL�:��!!�xJ��u�v��QkYXX���/Oll,666p��i������"//�ƍ�������K�ر#~~~4l�Pg��.]�;�P@@�����ՋU�VѩS'RRR��� &&���P&L�@TTݻw�پ�,**J�S��Fxxx�ˋ�����������Ε+Wصk�q��W��={*�)�F��Z�IN�9s&���DFF�$�h5�)%�>*��R���I���ؾ};������ww�Jm��Ç�Y��ɓ'caa���=�W�&$$��
[�1���g���<x'''����4ib谄uX�~�pvvf�ƍ,^�kkkG%D�RTTd���Tu=�N^
!�������!�E��Qr����5#�h�]�x�0~�x�����䔑#Gj�3k�,��)e�L���A�.]�W�;vT�?~\�����}��:��С�V!�x�Ӷm[>��C�q\S4I%�G���Ӯ]�rSSS�y�LMM���љv�dr��&�KAA�lll\�kiq���ddd0}�t�lƌddd���_�XE�t��1z��EDD�}�>>>��"���j5�6mbӦM̘1���!�B!�B���"j��] IDAT��^{
###%9��ɓ4j�ggg4h�?��O�qr���1Æ
�Z_� R�o����N+QF3ZJRR�R����4k�Lg;�2M!����w�v�ZF����5k'O��I��I[�n��Ύ����o��㣕��/�<4	x���Z�N���ɉ#F0h� �z�-6n�Hnnn�����e�ڵ6�1c�������_�I%ׯ_�Z'&&�G�1p�@LMM4hyyy:#�ܸqCk;�ۯJ\YYYlڴ�7�|S�w///�����v�+Oi���/_fԨQ899i�ד�������Zqj~wssC�Ri%l|��w�T*\]]��D������kӦ
*���� ���ʵ�B<x�����[o�ꫯϘ1c�B!�B!�B�'�i}�A��^A��:���
qqqܿ��g�2p�@Z�hA߾}���$77���D���C�-�̛֭�Ob���G�pX�ƺy^�22KQ999̟?���Y)�q��V�ҩ��������(#iii�����������~��~��G��͕��۷���U/==��� <xP�if\]]9�<�8qb������B���i۶-������OXYY��NmȐ!���r��i"##���Q������Ғ�͛Wxˊ_�͛Grr�־�߿���������{Z�
///�������7���ʕ+W�����ښ6mڐ��Ά
hݺ����ĉ���*�8bbb8y�L'���ٳ8::���C:�3��B!Deܼy��]�j��'a\s��=���q=�f]�N�Zf��l�������`РA��B�F_?�q��BCC�v����t�֍Q�F1~�x�/��ueK鯅B�9E�zcƌ����={�������-�d^^_~�%���:S�T���G��ҥK:?111J]����	/��P!�$00���KKK����p�;w��}B#  ���Dz������x�"�����Ӈ��BCC훗�>�,\�~�O>����+�8<NR�����|��DDD����~����`"""�)_Μ9�,�ٳ'�=�O��!C�`dd�L�V�~iS�T5��{����L۶m�s��닥�%III�޽[o�����ѱcG����$��)o<͚5c������v�Z
Y�n999���cff��|u��]g�2M!J���C�-[ƫ��J�~������!�BT�>���3g:���ddd:�*�r�
��ެ\��+V�u�Vbcc
��RZ?���˒%KX�r%ܿ���|���ؼy3�Ǐ��ٳ5p-V�5O�k!�5EFN�ޫ���ƍ9t����2d������#F��𶍌�(**��۴k���#G�{�n���pqq�s������o�>T*;v��k׮��������������B���$C���ѻwo���Y�z5K�,Ѫ���������www&L����Ǖ�ɞ��7��̘7o��ܹsq��u���[nݺ���3�Mi>��#:v���

�޽{���ݻs��I;v,������ȠK�.��O'v�֍�ׯ��?��/>19��q�;7���
�V�������8;;W��Ҕ��h̚5Kk��7�ѿ�j5���̛7���xf̘���:7o��7Qq���4u����ŋ8::������?s��1tHB<7fΜɑ#G�uBHHj���a=����\^��I��&���xzz�q��j�vMy��!k֬a���ʋ`����^����LLL��YPZ?������iݺ5�.C��y����/>|��{����k�.^~����v*�XJ-��&Ir�����ͱ���ҥKt��U5�}��������[�n�NѢE�߿���==zGGGΞ=K\\�f�Ҫ߸qc�-[�|2d���$$$`mm�U7!!��C�V8.!Dݠ/�@scS��ַo_��%��۷o`gg������J�W�^=Z�lI�~�X�`�V?{��]�-[���u�{��h/���f����B����)��Q4I����\�~���H^|�E�]���~E=)���T�qBJq�su�ΝJ�[^e�
M���7�x�b.^�H||<;v���߿@�P��2M!����g���xzz2r�HN�<�L�%���)S�:!�)S�0p�@C��Lx֦�yZ����ٳg9s�L��\������PF��1c��߿���5�6�ӑ��DDDвeKv�ޭ5ʰ��%�������������
�@�k!�5I�SD��?fnjåK�t=lmm	

���+V�m�6�������iӦ����k�.Μ9CFFM�4���'''���cǎe���DDD��AӦM=zt�bB�M�022zb���;�	��悧�'ׯ_��ʊ�ÇөS'z��Y��h���O�n�066�ƍ*ӿ�KN�ꫯ���dƌܺu###�S�TG\�)��RRQQ�r�4כ���M���P��F*B���ƺ3Ij��u[||<�g�&))�-[����$�N��f����A!*�����;wr��I���hР�:ub���:�������KXX���+�Z��7�`�������_�����[�x��裏�>}:_|���Դ�N�:EHH7n� //�V�Z1b�����u5qFGG����7�|C����:u*NNNdff��s��94h��a�pqq�I�&ޏ��,����߿��C�6mڠR�

b���z�؅Ϯ�ꧏ=
��ٳ�N
0m�4����֭�VyVV;w�����ܻw�V�Z1j�(.\HӦMuګl�Y�}����� �������Q�F���k,]��R����B!j�$��g���=���:�+V�`Ŋ:��(Y>f�ƌ�S��̌�˗�|��2�jҤ	j�___RSSi۶-���X-Z��B������VVV��?���իZӤ\�zU����)))=z�R�HUFtt4~~~�h����deyAA��W��SSS:t�@rr2������cffF�^����у�-[Kll,���t�������������j������9�L�������(%U�l۶���$z��Abb"���Z�Nsss������ԙ�.33S�#���ƍY�n�����իt����a	�\��/!j�f:DQy����ݻW����#��㉏�'''��3g�������������#!!ooo���OKe�i׮������ooo\\\J������*KOO'((����k-���������]�vѶm[BBB����8v���Ƭ[���q��	rss���щ��Ɔ��N�<ɤI��<vB�gKM������Q�KӤI�i�����7o�����t���OLL~~~:��*�gVu���E�)�Z���8t��������z���BQ�$9E�*rpp�رc*7���ЙH!�k����?���>�O>�[�n\�~��>�L��ȑ#ٽ{7nnn���йsg~��wطo*��;v�K��}�6�ڵ�r�.\��^#99Y��hٲe���ѣ�����RXX����Ηo###lll�?��=��j��G��h�n=`��2�f�I��V�	���ya�Z�RKM��#���)%5
H(���-D."�	���I�vEC��g��d2�M���s<c>�<��7a��;7��,����͍/����� ��׿fޛg�2,�m�6F��ŋ	��x�Òk���=ʦM��۷/�֭��ߟ͛73h� ���@Ϟ=���%;;�l�a骞={V�AJ�v��Y|}}9v�˖-c���5�i$Ryxx���m�0D�Cg�T��so���899q�����&**�x�7n�HVVO?�4.�k׮dggDZZ���xxx�����YOJZ����%)o<�M�8�ݻw��W_�ꫯ�
�7ؼy3���4hЀ�'O2}�t��gff�y�f:w�̆
X�n�����у����:�~�zBCC9t�P���0�eI�Yʒ����)򈩩<}��㍢�a�Ο?O�N���_�J�^�������ܹs|��fK�T4gV�����ܹ3���<�������Y�hQ��R�ZDDj���TR���	d֬YL�0���XV�ZE�fͬ���U�Ǐg����dҤIe֝4i���ddd�
�k֬s��1>7��������8����܈��cɒ%,Y��l��ӧqqq�t{O=�;v��ȑ#@�wŸ���c���Ҍ�+Ke���\�p�ɓ'�lspp0)sssc�֭|��G|��G%ލRU�Ki,�F�#//���@Z�h���O�F�䭷�b�ҥDEEѺukHBB���8::��#33�l�>�_���		!  ��={���^jNj�T�ѣG3z�hk�!R/l۶��!�Z�
�(^���N�-�q�����?777������2��o�>����ر#]�t!00���JR]*O�F�X�x1����_�Edd$
64�w��!���8u��v���ٳ=z(y�΀��w�ܟ�gݺu����,\��Ν;���

5ށo�q�9s���=��&uD�v��y�aÆܽ{���Kr��A-ZD�>}x�gX�p!�ӟ8p�����ʾ�"�h����ƏOxx8ׯ_/�(_��HM���*Я_?���Y�b3f�0��D���	

%$$�C�q��
�t邏�K�,1Y[�U�V�����s��A.]�D˖-qtt��Ϗnݺ�Λ7�O>����\


*���),,$11��w�ҽ{w|||��

%**
�J�׻wo�c�v8;;ӨQ#
��N�L\�[�&""�O?����x�\�B۶my��:u*���ƺs���Ɔ}��q��-���x�x�W�,���)���`~���-[f���cǎ,X���K��|��#�裏HLLd�ĉ&�HLL�U�V���KUv�R����L�4�C��p�B/^L�ƍ������R�g�fٲe�������ڵk�<y2���&7]�pww��c�2��̐R���ӧOF��W_}ŗ_~Y��/_fΜ9�:u�l[QQ�Yك3>�|Ń�)6o޼R�q��U�N��uD��QSy�}�����O\�x�.]��X���999��)z��g����SќY��W�=�O�wS��|-""5M�SD��������*��㏛�Jr��EڵkgRnkk�ܹs�;wn��>|8Ç7+��K�֭[T�iӦ��^im�T޻w�r�֪U+RSSK�^|����c��e����`   ��xʊ�4e�/�5R�~,�������k���k��-[���ۛ��0rrr�S����p��q�O�n�����ׯg֬Yt�ԉ���R�������[f���>(::�����3cƌ��xE����-�wz���8;;�7�|É'X�f
7ndƌ�%J��f�N�����3			|��g���fۗ/_ΩS����gȐ!t�ڕ޽{���6mZb�ÖT��84hP�>
e�:"R���<ݧO~��'���K�����oӻwo���J�yʠ�͙�}}E�у7{�7�*_��HM���Zh���������iժ����o�uW�Hm����Ν;���4扌�����l�!y���/L�6�;v0s�L>��C-�("���#$$���(���;v,=z�o߾�MD*���www������b����_���+W;=������f������Y9���ӲeK�ϟςJ�A�0/<<�6m�p��y���B5��W��G۶m����ڵk�m��d�aي��"�h��<��+�Gdd$���*�?���{��n�:���x�׌S:v��?��O�?΀���?n������2�k�i��)"""5��W_�/�2l�0�{�9F�Mzz:mڴ1��D�6k޼9������r��E.^�Hll,����P�������Os��I8���_�K׀��(==�RKiܺu���{///����ر#���,^��[�nUa�"R�F����_}����t�ޝ=z�w�:�E�q��i�޽˕+W���qrr����X�p7�a���`I<�6l�&--��:)))p��i/^l,�~�z�ˎð�Evv��~e.u!"������?�<������L�4��{����ǝ;w����={6���8///�����

"##���B222���4hP���
��ώ�J:���""R�4s���H-�`�صk?��<��<���L�2����[;D�r�ׯ����X��3f���h娤����o̘1�-[�0u�TV�XQ�z�"R�X��Nm��K�7n��쭷�b���DDD���o��D��|}}	

"88���`�m�m9i�$������0���Y�f̙3��M�6\�zOOO���ؾ}{��mI<e	 ==���|�r777���X�d�ٲ��O���ť��Yr$!!���L���333���	,"U�&�tpp0����o.\h�СC��_�j�$���/�…L�<٤����Y�5U�gǃJ:���""R�48Ej��%���v����
���:/���\?�޽�)S���/�l�D��.\���Q����g�֭f�G���?��֭[���g������p��in߾M�v�pss��ߟ-Z��FI�b�\��'�|BBB�n�bذa%vD���e����o2��C�899�e�&L��Ar"�TY��<==iԨ����ek���4h����z�Z�"<<��?���r��%Z�l���#~~~t���Xw޼y|��'���RPPP-�dI<ei߾=3f�����I����),,$11��w�ҽ{w|||��

%**�J�Xr#F�࣏>"11��'��'11�V�Z��K/U:&�y�%O?���lذ���h���[~��4h���3�F���3��u��DDD�駟ϕ+Wh۶-/��S�N��ֶ*NQ���ώ�t.��ED��ip�T+WWW��������ADD�H^^�����>c�ر�Y��6m�X;,�899q��Q222�ӧ�q[FF9990{{{֮]KXX���sssٲeׯ_��/W�yyyL�<���c��ݻ�y�Y�={����_bG���iii�ݻ�Q�F���E�qww�����lmm�;w.s��-�����>|�Y�%3F�[�k����;v,cǎ5)kݺ5AAA%�p9��mIyy��e˖x{{FNN�:u ''��Ǐ3}��R(�H�VSy�iӦL�0�	&�;��{��`��2�U6g�d�-�>K:���""R�l�������<:x�gغu+QQQl޼YSD1��;w�4)�������͛7���HJJ"99�O?��'fy}�����`oo���III!44��gϚ�MJJ�W�^f�e�:""R}|}}�С���Ʋ��H���̖��Q�����S�Z>|����[;����M�	�����,\���?���_���P�x�	k�%"0,�����T�q���Ǽy�hܸ1����۷����3x�`:DQQ�N�b׮]�={��G�p�ƍr��…�ݻ7�����/a֬Y&uϜ9@�Ν���O����Ӽys�5k�qV���XV�ZE�fͬ���(_��HM���EEE�ADj��4��A��AD*�����!�:�������Cxx��z�"��iԨ#G�$""���D�
Frr2׮]cڴi4l��˗/3g�N�:e�K�G�駟L�x��g��^�z���Eq�2C�^�����ߟ+V0c������|-""5E�SDDDj���+����CD������C�5�ܹ�����ٵk�ΏHV|]zÌ)%�c��o�~�zv���aÈ�����c��˗s��)���2d]�v�w�ތ3Ƣ�Y�hi��+
�@`�U�
e,,"Rs���5�[D�P�����)"""5���A�"�H���d�ĉ�9s��+W�?�I�"�Hǎqvv&))���L:Đ!Ch߾��Njj*���i�������8��8{{{Ο?ϱc�pqq1�gff��m۶-���\�v��mۚl�v횱����������,�[�D���Z�<::��s�2w�\͖ """��{��|�r���h֬Ǐ�������C�F���ݻ�
!� IDATL�4������J����BAA�O�f������ׯ����_~��� �;Faa!��=|�Yݞ={���m��Pf�#""""""""5G3��Tл�KBBB�S\��w���EQQcǎ�G�����
���5��V��W�����o&M��ѣGY�l��ͣaÆ�KD�dРA�oߞK�.aoo�s�=g���͍��8�,Y’%K�^��i��PJ������9s�ӦM3��1�l��IHH 33GGG�m��V
T�c����)"���Pb��[�x�������OOO/^LLL͛7��0E�J\]]5k�H=Q��***bݺu̟?�nݺ���F�>}���T���?���BCC���4�;�|
ILL��ݻt��~��BCC���*��&M���իٿ?7o�dȐ!,Z��={���1b}����L�8�d[bb"�Z�⥗^*���6f�k� "R����zu�Aq�Ǐg۶m�CDDDa�"R�"""�t��ƍ3����[l޼�����������z�a-"����w�y���`��.]J�&M����ӦM3���A�[�&((���SҠ��-[@@@@�u[�l���7aaa���ЩS'rrr8~�8ӧO�E�?0�R�=��a���i���0��aX�r��ȣi���꧐ZE�S�^�w�����ݻ��/Ҹqc�v��ȑ#���0����OXX�����_�]�v���+L�2�����d�ox���N^^[�l����o��X�C�899�e�&L�@�֭k�EDDD*��/����3vvv>|��~Q+"u���/;w�$22����>>>V�N�~ruu�����a��H)4������
N�z!$$�
6�߹s��'Or��In޼���(((��Ϗ��,c݋/Nff&!!!��ؔ�Ξ={���/qjj���ػw/�F��£�Z�.]��#۶mc�̙iiB�3�7oN`` �f�b„	��Ʋj�*�5kf��D�M�6�{�ͼ������v5���""�舌�����I�)R/lݺ�իW���ĝ;w���#88���(�$7n$++���~��ҵkW���	

"--���X<<<HOO7�1� ))	�^�z��`(KJJ�����n����G�7oη�~�СC������뇿�?+V�`ƌ8::Z9*ѝ�"R��At�yČ3��!�����Z�h��7����󸹹��兗��I�}��Dǎ�ҥ���xxxg�ЃΜ9@�ΝͶ=��&uDDDDj��~���3g�q�F�y�V�\�������0ooou���2�G��v""�ڶm��C��ѣG+O���H����q�G���#�a���,[����TRSSY�v-�'O����dZ�.���^�~Ν;Wf;W�^�u��f�e�:""""�ž}�x��w�;v���^�vH""""""""""��������3���|��7�8q�5kְq�Ff̘a\f�����ܸq��통9mll̶ʴ~�����7o�d����[���c���'���[;,�s��z��i|^�2�ŕ�Nu���K���8k�����/s��ulmmٽ{7M�4��v�{�k�)�U���^T���hRSSpvv�RR.���-���te(O�Hu���q�����www������b����_���+W���ّ����۱������mے��˵k�h۶�ɶk׮눈��X��Ç�4i����7of�ر�IDDD�F���$$$�ڎ<)���x�_����׉��g���V��n��ߋ�������(**b�ر��у�}�Vi;�hQ�~t(OW�i��48Eꅑ#G���C@@���*ݻw���q���zC��/�`ѢE,X���ݻ���e�ƍ|��899�n�:�(EEE\�pz��Inn.���f�P����uDDDD���ۼ��{�\��W^y��>��B�rE�n���1�_HD�OLL�G��vR���k�P+��N�o����_�;vk�NϚ<�U�Vu�^ܺu���{///����,^�����7o^�mʣAy�d�ӕ�<mJyZDj��H����KPP����lstt4>�4i���ddd���cR�Y�f̙3��M�6\�zOOO���ؾ};$!!���L��dff0hР�><�r9v�&Lয়~"44�w�y��!���l۶�m۶Y;�^�A���\�=J�6m����r��a����_x�'��\�t�q����z�-6o�LDD���V�N,�<-�<]�)O�HM��v"5��ӓ%K��?��&M�ФI�v�ʤI�X�l��^�V����;;;6l���-nnn|��&��̛7�N�:ѰaC


1b-Z� 11�,���DZ�j�K/�T�,"""���B��}����С�"R��G?�����Hk���y���cݺuxzz���3x�`�~������z�j���y���y�7X�f���W����+�<m�߿???���pvv��_gŊ���Իr�
�>/��...,^�ج�����رc6??�
oY������������V�\ɍ7J�Gaa!˗/g��6�8k�k�X�p!���:��K�r��M�Xbcc�w����
͛7��_�޽{���Z�/���ҥKy��qvvfܸq��ŕx����,Y����3|�pV�\��n�΅�߿?���%�g�ȑ����8ó%ב�1�;w\]]y�����u떱N�>6�����3d�<<<�w�I;.\��ɉ�#G���-[�пڷoo�סC���زeyyy�>>�>�i�i���Q���@3�H�����C����2w�\�Ν[f��Ç�M;ײeK���	#''�N�:������Ǚ>}:-Z���A����X(++___���{�/_άY�hР���+3f��C�w\]]�9s��è�BBBذa��;w8y�$'O���͛�?���������2ֽx�"���dff��M�ޯgI�k׮%,,����lٲ��ׯ���;�&O�LNN����ݻK���1�\����<�N��(��7n��;�p��y��۴iiii����}7�|�r�n�j|���өS'bbb��t��mv�܉��
K�.5�-**bǎ�������l���ۙ2eJ�����ի���r��ec�s�αd��޽kܷA@@������M�6QXXȂL�988����ѣG��ȠO�>�m���0`����k�ڝ>}:׮]�ׯ���{��hѢ���p�\]]8p ���|��&ߑ:t����g����qqq1۟��iii�ݻ�Q�FU��ĺ��������EDF3��T1___:t�`rWTdd$vvvfK����T�{��b�
���GÆ
9v��g��!&&���k�!Ro���p��k�Q�:�V�^MJJ
�"  ���(c��7�����O?ͦM�8r������ۗ��4�]�.I���n�D���~�+o��7o�w�%%%���̧�~
`2�_~INN����_����BCC9{�l��7�ҥIII�N��{I��gÆ
�?�N�:NJJ
aaat�ؑs����_��#33�͛7���l�C>88��
��_���ĴiӀu�=z����=zн{wz��A�=���K]z�x��ׯ����<��Slݺ�C���on���~����h�K <x�Ķ�y;w�4)7�����T�}ˮU�Ν;�u�V����<y�I���x�?�-Z�����Ȱ�yRR�z�2��Pf�#u���4(O�DyZD�_4s������45��e���	d֬YL�0�?mݪU�h֬Y��""""��?��ĉIKKc�ҥ,X��F���Kdd$����C�^0�).�J�.�xyzz:-Z��ƍDFFr��y������2v�۷��� :v���	��Ã��8<<<��8,i�СCq��)v���ٳg9z�(��r
���,\��޽{����_��f͚U�c���I�&�>��1t�-Z��x��3�<�…�ӟ�ā�7�G@@�����ۛu���￳p�B:w���	

5�In`�,~�ȑ#����7�|C�����Ç�?>�c(�.����/t����S��e��\�Rb]777�q���Ǽy�hܸ1����۷�����\��kw���c?~<���\�~�\�}�=��cxyy�a����qqq!//�'NвeK8s���|ГO>iRGj�i�iP�V�V����o�E�A�~��gŊ̘1�A/"""R]�����Ϙ7o]�t!--�g�y��a����T��ٳY�l�������v�Z&O�������@.\(ui�s�Ε���nv*�)kI��/_fΜ9�:uʬ^QQ���O?�`�����>k�������$���U|?��-��
j���6�GϞ=��\J�k׮��͛77{]^^������?��<x�7nЪU�2�6�`,e�֭���c�=ܟ��$�5b�ȑDDD���Ȱa�HNN�ڵkL�6��
�v-�1��jkk[f��?o>>>DEE������ܽ{���88��ի�n��l�2C�۔��S�����ED�E�S�֨�N������D����Ô)S�w�����Ur�����Hu)i��������3���|��7�8q�5kְq�Ff̘a�����Ò<x�{U����˗s��)���2d]�v�w�ތ3��}�wI��U䘫����N��M��XncS���w裂���:���;�w�6���xܖ.}i�{��7Y�~=;v�`ذa���acccr�}M]��76>��q?���5�M�6���i\�İTăm��~ʴ�h�<�<
����""���)"""""u�ƍ�9s&�ڵ#11����!��X͙3gJ��2::���T����:D�v������www���ؿ?�ׯg�ʕ�NO;;;���پ};vvv5�%mrPxx8mڴ���텅�4j�{{{Ο?ϱc�pqq1n��̬T�խcǎ�����0�X~��q�*�ϰTĪU�LΑArr23g�$66֬ӳ�'�x���s����SOUY�;v��ٙ��$2339t�C��}���:��}�Ą	�ꫯ���"99h�޶m[rss�v�m۶5y�a����Rw)O+O?Hy�vP��ڤ�a�"""""Rk]�|///&N����Ǐ����}�]Ə_������ϟϼy�X�z��Kx��F����_}����t�ޝ=z�w:�E�q��i�޽˕+W���qrr����X�p�a�����M���


8}�4�/6�_�~��_~��� �;Faa!��=|�A��_]��܌qgddPXXHFF~�!`z�ve�={�S�N����������ӹsg���8{�l��3tҭX����\n߾����qrr��7߬��G��ݻw�4if���}������9r$�w�����'��o�f�n0���m�ZCYy���MyZy�A���GyZD�2͜"""""R���2m�4�5kƷ�~˰aì����%$$�X~��-�{�=����w9zzz�x�bbbbh޼yM�)"���KPP����lstt4>�4i���ddd���cR�Y�f̙3��M�6\�zOOO���ؾ}{�b��M777���X�d	K�,1���ӧqqq��LJ���s���M�f�>b���#Kگn���8p�.0y�d�mfe��7�0nܸR�hР�ƍ�o����������f߾}ddd�믛l�:uj��<h� ڷoϥK������3�^�Ѱ�Ji,]J�"�'N$&&0��8p 			dff���¿f����p�.����S���i�����*YD���������]�ƬY�X�~=����Z�
[[[k�%"R�EDDp��%ƍg,{뭷ؼy3���[1:1(�s��ӓF�m\^��ޞA����k�תU+������9x� �.]�e˖8::���G�n݌u�͛�'�|Bnn.�ے6�ϟOaa!���ܽ{��ݻ����?�@hh(QQQ���ФIBCCY�z5�����͛2�E��gϞ
�_�Z�nMDD�~�)���\�r��m���/0u��*���Ν;�ڵ[[[^{�2���Y��]�v1s��R�mۖ��BBBHII���t�֍I�&��/T:f<<<

���Ӭ�������hٲ����M��1��>����D&N�h�-11�V�Z��K/U>p������<]���E�.kPTTTd� �ѱi�&Ə��:|�0�V��rT"R����1L�i͐DDj�}����;�PPP@hh(����ID�
i\���ܻw���P����ŋiܸ1]�ve�ȑxxx�����',,�}���믿Ү];^y��L�B�&M���HLOO'//��^{�����O>1����Off&;w�u���w�R����>��S�����E�ђ��Ȝ9s�ܹ3_���u��ƶm��ԩ999xxx0}�t�L�R�!��>������T�G%O��稜I��)R�\]]quu�v""""uZ~~>���g�ڵxyy�f�ڵkg�DD*%$$�
6�߹s��'Or��In޼i�*((��Ϗ��,c݋/Nff&!!!��ؔ�Ξ={�������l���iii�ݻ�Q�FU�щ��<����u��}�&L(����/;w�$22��|��ٙ-�!""UGyZDj�ҿ��KII�o߾lٲ�M�6��)"�Hغu+�W�&%%�C�@TT���ƍ����駟fӦM9r���h���KZZ�����4������III����,C���������1bYYY��у7�x��z͛7'00���X.^��ŋ���%00�f͚�p�""����6�9E�Ř1c����a111�VND�����K��b�
^z�%����ر����2-Z��ƍDFFr��y���������ˤ޾}�

2�.]����qqqf�=�̙3t���lۓO>iRGDDDʯ}��\�v
'''-ZDÆ
K�ۯ_?���Y�b3f��ѱ�B����E�����R�=��a�H7z�h`�0DD���c�ĉdgg�f��N�J�
���<œ�������:̞=�e˖���Jjj*k׮e���x{{�ܝw�����K�Ϲs��l��ի�n��l���PGDDD�/..΢���޺ID�)O�Hm��)R�\]]quu�v""""uRaa!�������������X;,�j1|�p�������o��ĉ�Y���72c�F�@QQQ���q�F��
��ll�W66�i��������H����Z����L�4����/_�̙3K�H��=KJilmmqww��ݝ��,������Y�r�qp������l߾;;;��h۶-���\�v��mۚl�v횱���������T}�-""""bE���㣏>��ё�w���ٳ50EDy#G���ɉ������|�w�N�=hܸ���СCX�h�O���ݻ\�r��?�'''����u
3���ٳ'���f1�uDDDDDDDD�zh�+��x��INNf���,\��F��'������Lpp��6GGG��I�&OFF>>>&��5kƜ9s��۴i�իW�����Ύ�۷3p�@���4�/@ff&�
�������X;�R���0z�hk�a5111&�EDDD�����#�ի����EDDD����ܹs�ܹ3G���g��vH""5��ӓF�������gРA&���jՊ��p>��s<ȥK�hٲ%������ѭ[7c�y����'����KAA#F�࣏>"11��'�Đ��H�V�x饗j�Ed̘1�ADDJ�m�6�m�f�0DDD���)"u�ƍ�9s����J�x�"S�Ne���̛7�e˖ѴiSk�%"b���?����-s��e�ܹe�>|8Ç7)kٲ%��ބ�����C�N�������L�>�-ZT� D䡼���v""R���"k� """�����W�\!''�>}�X;��-[�0c�ڴiCBB�vH""����/;�-# IDATw�$22������RA"R�>̪U�����C�����5���ȣk�̙���Z;@�SD�'N��3�X9��˗/����W_}������iٲ���y(''�j�ozzz��4͛7'00�Y�f1a�bccY�j͚5��XD�.��ѣ���H�bbbhܸ��ð����i�GLLL�C�H�SDꀌ����;;;k�""""ڱcS�L�I�&�ٳ��^z��!���K�����ߟ+V0c���H�m�DDJ5~�xk�`U���Z�MD�ӠAk� bB�SD�'Nh��:��̝;���0|}}���y�Ǭ���Ejz������N+���: ##777k�!"""�t�&O�̭[�غu+o����C�
N��
����5k��C�����'  ����|�M֮]K����������̙3����|Ĉ���gϞ>�nݺ���ܹs�ݻ�3g�p��i���S�1999�����s�K�.����4�ܹ���7_|�Y��V�|�[U3��0���5OyDGG���
���3cƌ�j<"uYE�sAu�_�|h�W��ߋ�()FK�uy>�+KE�T��n_��"�6
N��N�>��N�>}�������ȑ#L�0�˗/�a�|||���������w�%!!��s�ʕ+$%%���ď?�ȇ~h���?��o���&C5�x�b�;f|~���jo���%��;BBB��������c�ңG���k��D����E��"�>
N��222hܸ1�{��v("""R����-[����y��9x� �:u�vX""e?~<�Ǐ�v"������C�$$$���cǎ9r�{��accc,�w�G��'��_~��0K����`�ڵ��׏��B�5���WMto��;��݁}��-�{�=��������ӓŋC��ͭ�H]SV��Ϭ����k�UC��"�����rǏ�W�^4n��ڡ���H1'N���חs�αj�*���hР���)Stt��C�w�B�`�i�����֭[9y�$�<�<##���<�Jll���+,,
ФI��"���K�7n��쭷�b���DDD���o��D*�6�iy��3T�~���Z��� """b}���,_��e˖��s�q��	�v�j�DDDDY���#44��{�r��E7nL׮]9r$&u���	c߾}��믴k׎W^y�)S�q:X|�`g�غu+III&��$''��sϕ88%//���P8��+Wh׮Æ
cڴi�j�ʤ�+W��OHHH�֭[6����x|�޿㶒��_~a͚5$%%q��
�|�I&N�ȫ��j�����������ܾ}�v����憿�?-Z�(�|��fyρ�[�la�ʕdddдiS^|�EfϞ]�;�K;W����\��;vШQ#ƌ���׮]�o���q��<�вeK�>�s=�{˖-��ߟ����;t耓�[�la„	�n�����j:O[������hP�<nI��c


e޼y��уu��Y|�e���<]�j	K>C���*�����~}�3T�����Z�����CDDD���g�2a�N�8�|�ܹsM�z��ƌc�D�ooo"##�F�†
���ܹ�ɓ'9y�$7o�4.UVPP���YYYƺ/^$<<���LBBB��[������!99��N�ÇӠA�{�9��ܸq�w�y�����rssٴiiii���;}���<y2999ƺ�w���͛���]�z___._�l,;w�K�,��ݻ����������L^���˖-[�~�:�~�۴�L�>�k׮p��m���k�ݻǢE�,>��,_���[�����t�ԉ���r��mv�܉��
K�.,�����C~~>...f������޽{5jT��HmR�y���YޜhI��1�\����<����(������PKX�5>�*����G��g�H��o�Ej�_����\͜"""R�z�j����ݻw�?��0o�<
L�:)22���"��G?5����m�_�G��Sl��դ��p��!���2�۸q#YYY<���lڴ�#G�M߾}IKK3�v�������fw;����?��3g�p��._��ٳg�֭�?��Y�6l��t�ԉ��pRRR�cǎ�;w�/���X��/�$''{{{֯_OJJ
����={����a��_��˗/��SO�u�V:ěo�	@xx����͛ ))���d>��S-jӒs`йsg�,5�'O��=����d���$''���@pp0
6�믿&))�iӦp��!���{=$%%ЫW/��
e�:"�����NNN��g��ryr"X��-iߠK�.$%%�8����]�~*��+�C-aI\U���0����T�o׷>CE�}�.R�?~�>}�X9��-;;�_|��s�2o�<RRRxꩧ�����H�VZgKI冻�###�����~��ˋ��t�N�}��D�=hذ!]�t!00����r�7`�����K�$''STTĀJ�oP�h�"���C�ƍy�g�S�8p�X7>>��һwo7n���#��_���>|�������@�-X�h�������:�ѣGyꩧصk�1��߀�w�[’s`�`�hڴ�qf��ׯ[~�e�{��4i��8`��g�…t�ܙ�M�2a��,.`�t���`��|�I�:"uEm���eI��͉������O�,�R|?��͡��$.k|�UFu_����P��C���b'O��C�<���EDD��
c�ܹ����?HII����ٳg�l�2RSSIMMe�ڵL�<ooo�5kf�w�����K�Ϲs����s�=GDD��ɼ���A*%-���/>��>��?�l,�駟��u�����={�Y����̙3�S�N�m+**��MK΁A׮]��mmm�w�E�>̃���*l�y��f���z�z�*�[�6�g(3�y�t�.m'��vK�,oN�$�W�
�%)��������PKXWM~�Yr�KS����]��?48E�;~������_~��w�y�]�v1w�\��׿�|�&""�&×��/��;(�*����3g�<��򈎎&55gggƌS�}ʣ��%J*>|8��������7�p��	֬Y�ƍ�1c�F���dɝ��<�M�6%55�;w�p���Ö(i��!���6jTu_�6hР\��/_ΩS����gȐ!t�ڕ޽{W��oY�M7nl|\ޘ-մi���D�%ד!���i(����.�=O��%m�7'Z��+r�U1k�%�)+OW4�V���M�o�Q���p}�3T�����Z,##��Ç[;�z'&&{�1puu�vH"""���w�%!!��l���;BBB��������c�ңG���[E�J}gkk���;���dee��~֯_�ʕ+���vvvdgg�}�v���*�^�&Mptt$%%��[����G�~�J�ܱcG���r��q���6?���=�ϟ�رc����333+�x�	~��GΝ;W撔�e���i�������{Ќ%�.��zj۶-���\�v��mۚl3,sQ�\�QS�y��,i��9ђ<n�c.Mm�Ӗ�e�Ϸʨ�Q���*RT��F��;w���SDDDj�իWy뭷;v,���?~\SDD���t�����E			��ǭ[�x������Ύ�;�����ŋ�u�VD)��ȑ#qrr⫯�"??��ݻӣG�t捡C��h�"N�>�ݻw�r�
�1NNN�����5LG_�>&fŹ��DFF���ddd��0h� cݗ_~�X�رc������X�b���ܾ}��˗���ěo�iV?%%���N�>��ŋ��ׯ_�w�,9u�%דa����l��ʪb�*���Zy�<,i��a9ђ<^���Km�Ӗ�U՟oխ��G��g�H���SDj���,�ܹc������T��;w2u�Tlll���3�#."""��K�7n��쭷�b���DDD���o���Q���KPP����l{p��I�&OFF>>>&��5kƜ9s��۴i�իW�����Ύ�۷��k�r��e���x�.\���ɓM�988�������~Μ9ôiӌ�#F�(�c�"�~�m���GFF����ɶ�S����ǒ%KX�d��~N�>���K�Η%�.��z8p 			dff�-�d�Ӽ�
�����tyX�fys�%yܒ�����tiKey[WU�U��~���[��"��fN��222hڴ)�z��v("""����<�N��믿�/��ɓ'50ED�������燛���μ���X����|c'''�������Y�l���6�%K�;u+R�{wWe����L(�Q�\FR-�(7r�e�I3sD
������\��1�Qt��L��r�� ��8j��7-E�G�s��9�����羯s]��:�}A������̙3�=zкuk�w�μy����.��'NA@@/��"S�N-4{ǥK���x��iӦ
�Ǐ�8��0��:u�d~Jд���%���~`�ĉt�ܙV�Zѿ6l�P���}vE�obm�gdd�b�
�{�9jժe�^�N���Y�b�t�TRw���W�^L�0�'�|����`��ˋ��&O�l.W�zubcc	���'''����СK�,�x�v���ԭ[''�B�I�ƍ�Q�nnnw����͍ŋӷo_jժ����j�b��,Y�wwwsY���…�ݻ7�t�Bdd�M}v'5k�d���t��777���yꩧ�>}:/��ܘ1c�ڵ+����5k�ԩS�7�V�\	X�_����[�nT�V��;w�g�ΝT�^�.]����EJ]y��aK�֎���㶴_���8mK\��������_�o��<�������6z�h�lق�h�w("""���<x0ׯ_g��������!���:���	,��̟?�E��綾^�>~Mr�ѣ�֭�(��c�g�Rٖ����:�C�j���g�ܹ8::Z�����&7y��W�_�fdd0p�@Ξ=kQ�^0!Z܍SE�7�{��'9z�(������}O������e�L�8q"ݻw���J�INN���?��S�M��ȑ#	

�(���w�{�=^{�"c��L}_��(!!��� L_;|-RQ��İh�"֮]Kݺu8{�,={�$,,��C��9B���4^��߇""�M�Cˆ�{)g�5s�H9�����������nܸ�ȑ#�ԩO?�4���JL)����;v,�w�fϞ=,X���'�v����ٳٻw/���<��c�;w���������СC4oޜ�����ǪU��e�����[4h��5kؽ{�y
�ڼ��O>��ٳԫW��K��w�^.\����ﭳ��F��{�ns⎭��ҥK����f͚5�ر�W_}���Xs9k>��	3������w��
P��m�2""Ypp0u�ԱHf�����ӳ�R"""�+����"RN<x�g�y��a���T8�����Ϗŋ��N�ڵ���H��c�����������ͬY��>}:׮]+T~�ر�i�ggg�y��l��+l)�i�&���hҤ	NNN4jԈI�&��ͻ�K����Z�����W���o۶
�q��ѬY3�������޳�{�4p�@C����w���2-w����V����$''��g������gK�=z�%����
Z���\]]�4i�֭��?�u��1i�$\\\����H��ߡ"�C{ "�]�p��/���c�PDDD*�[�n�0m�4:v��ƍ�W����)�[���d�ȑ>|�P����hժ��kӌ���}�ʞ9s�e	���8q��6///�M���暷��/�@@�-�l�V�����[��Ν���~v����/_��ͭP9�6S����g�%""�3f��o���g�DDD�?�����"R�����(��IOOgРA;v�ٳg������y |��>|�z��Ѿ}{���h֬}��-�|�*�_5��*O�jMٻ%Q5������E���:�]0��*n֔��<s<���ž�n�[�;��Ϯ`�w���M������T&����;��~��TlJN)���Ҩ[�.�>���C�
�h4��S�%a�1u�^����̘1��'���GJJ
O<��}i[D�Ab�%�(III�������ɓ'�srr,�:RSS-fb1�����-T�5e===9}�4�ׯ���Ӧ�*N�z�8y�$�M�6�����RA���q��u�W�=㋵j׮�w�}lj'�.����]~��{͚5�p�W�\�f͚��\�b.#"""""""�W�GZD��RRR4k������={V��0�?�/��ĉ�<y2;w�Tb���=ػw/���9r���Ǜ�_�zբܔ)SHOO'''��HTTݺu+T�5e;v�@dd$G����\�t�Y�f���Oxx��������(8@NN�~�-S�L��.k�C֮]ˍ78y�$ӦM+q}m۶`ƌ\�p���,>��C���y��W���ggJ5-����iy�ӧOj۴�nK�������HŦ�SDʡ��T^~�e{�!""��n��<�ϟϘ1chڴ)���4o���a��<�:t�
�0a&L(��ȑ#��ԨQ����2�����ׯ�{�)¶m�HMMe�e]\\9r���4p�@�l��ѣGy�7�ۻu�Vd�Ž�Сk֬���;���,��V�fӦME���a�,ڵ�����������OOO֯_oS��mۖ�۷���^(�4�/�P����fN)gn޼ɑ#G���w("""���nݺ��;�0z�h��ۧ��{4f��v튫�+��f͚1u�TsR�ʕ+-�GGG@�*U�U��
"&&��P�nk�V�^���X������	www:t�%KJ4#��``�…���]�t!22�溬1r�Hz����?��`�M�6����%��f͚,^���]���憳�3O=�ӧO祗^2����=z4u����ɉ��l��~�֭ժUc�Ν�bݹs'իW�K�.%>^�8����$$$�{����� ��я~��)o���������h4���Ƿ�~{ǵ�ED�r�v���_Y�jgϞ��ӓ�� ��}\\\d���,[���_�ބ�����ӧ�����6�hM������5�={����J�>}�1c=��7n�֭����Ջ���f�vnn.�&Mb�ʕ�:u
��@���2dC�����.]�;#��'K�.�矷�""���������������\�e�âE�X�v-u����ٳ��ٓ��0��W$AAA�����"2�j���̙3�۷��Q���]���iٲ%P��������T-[��~��@�} b�d-�#R�<xWWW�4ib�PDD�β���ر�ō�ӧO����ꫯpttd޼y�ܹ���z����S�~}Μ9CDDu��e���~�dm�u�ؑK�.���ILL�o�f�…���ϴmۖ�'O�ߓ���իW�?v�X�����_ggg���DRRW�^eԨQw�~��7�x�/�����~���(\]]�>)=�����_�">>�w�}��f���g�e�DDDDDDD��Qr�H9������7U�����>��#���iٲ%1114oޜcǎ��͛���e�С<��#,]��Ν;3h� �l�Bpp0W�^��O?��Ã��<��'�'γ����6mʒ%Kx��Ǚ2e
S�L��>3'�̘1��'O��O���/III�������_ұcG�����O���`Μ9wMNY�z5��ḹ��u�VڷoO}."""%���ʤI�x�w̿�׭[��ٳ-fb��i׮]�DDʳ���
9S�������!��H�L)R���H9s��A|}}������V�`�������ۛ%K���OgN�ԩ#G�$::������x�w�ܹsO� IDAT��a2g�7n�ȑ#�2e
�/_6�_�v-,0/�Ӯ];�ϟ������W�Ε+W�����o��gϞ>��Ç�1�~����~���x�
ƌ3�K����}<��DDD0c��|�M������'Z]\DʳʞD���""��aE��B�)"���y�W�����Ǐ�Q�FE�OKK�xŦM�HJJ��ۛiӦ�z͛77��F���暷�8q�֭[[��]�v��1c���lܸ��7��Ɉ#�V�Z�1}��:���\֯__(�EDD�#�q�YV,�����%"""""""�8�;�ՙ3g�t�fN�2�(W�\)v��Y�%i�`0ܱ����uvv.T����={���XڶmKff&���<������X���� ,,��^z�^x���t%������������<4s�H9b4qppPr���аaC�=ʩS�hР�]ˏ7���4�{�9����{�=fΜY�mX�q��|���ر���w��IIIE����`��<�o���իW3}�tF�Exx8�v�bРAddd�r�J���S*�����ȃ��ѣ4m�����(��1��<2������E�k0x��Giժ!!!<��c6�YR�cy?��s�slժU�kժ}������ܳ��gGGG~�a|}}	�'��_!Z��g��߉�DD$?͜"R������养���C�r��W_~�������p��ƌ����:u2�ݺu+3g�$  �ݻwӮ];f͚�֭[�eL��;v�DmXk������c�nݺ���	+T����ϟOFF>>>����|i���Ř1ch߾=O?�4���JL����?d�0l���]����9w�k֬�������;�ڝ�1���ܹs3f�G�fΜ9�����EJΖ1477��~������!C�p�̙2�N�Fc�����SD��ѨYSDD�l�ر�]��={����Z�V�}�?��3!!!�����'�����ҥK���!88���4y�~��p��E�6mJ�
8u��m�b��Ѭ^���H������ѣG-ʾ���ADD��>�}�Y���{���js,""R��� ֮]k�0D*���D��o��텶���ËRT��Q��,�'���s��M����1w�\�����̚5kpuu-��l��"(��q��>�{�����^�z1~�x�[�܋��������\Ο?ϤI�0�|���|�e���z�)oc�� )�fN)GRRRhѢ����r��fϞ=�1�
P�JjԨAϞ=IJJ2�Έ����cΜ94l��e��9s��ߛ�>f͚E�F��R�
7o޴�
[T�Z�m۶1|�p~��P�jU���˂
�
cѢE�����₋�͚5�m۶�ٳ�:uꐚ����RԧO�B%r��Ӈ�-[�;��������ȃ�jժ<��̜9�&M�����_���aU8�/��ŋ���߼m��\�x�ŋ�12y���q��ё�u���?��}���9��Mc���E3����.]����JN̜9��3g[&!!����B�
ĠA�̯���o�-m���Y���ݝy��1o޼��


5'�:t��_��Htt4������H�X�j��C�I���g�(8���uRR���|��T�R��}�Ε+W�>}:;v��ٙv�������C�����dѢElڴ�������G��=C��`0�����p�B6n����qvv��ˋW^y��={�1n�-[����ȑ#G�����G�C�DDDP�Z�R9�w��ʹi�شi�����~�m}��},\���[�r��%}�Q:u��o�A��խ���ٙ��ƍǎ;�۷��mX�9���1��y�…�=�&M�S*���Γ�α��V�X�s�=G�Z��e�ԩ���?+V���_����H$?[�Gk��;��wҠA�\�bs���*�k��1X�_֖+��l�V�XAtt4���T�Z�Ν;3b��,'�Ƣ1HDD����r´֢����(77���h��}Z�hAJJ
�7�wX""""����Y�f����LݺuILL�СCdee��GGG&N�@vv6����2�ϟ'66���t�Ν���/Qϝ;�e˖��ݺu���4��Ҹ~�:AAA��7�|-Zd��…�X���W�Z����c2}�t��$YYYlذ������pww�KoZ�v�C���ɓ�'$$��~bcc��5�0}v����q/�Cigtt47b�䟟��I~_}�����iӦо6mڰ�~6n��k��fe��ܝ�ף-cmI�:u
��5k�����Ҿ����J:Εd3'�dee�z�jrss����)�A""R%���)))ԩSǼ����He����������ĉ��������P���X�v��� 11���@{��@)j��;IOOg���4hЀe˖ôi�hҤ	�W��N�:,]����c�����8t�͛7gܸqxyyq��i���ؿ?�֭3?n�19g�����u�6l`ڴi�\�����b�^�|9cǎ�{��888���FXX;w�,��1ٵk�g������Ì?�s��g^�Z˖-��ɓԭ[����/<��S:t����'N�d���Q�?��s�ڰ�s(��%I�F%9�F�k1����<)�۽{7O=�T��4m۽{�nK���z�v��u�������L�:�֭[���2����5]�*�8%�4h��I��]�6�-"66����ڜ�bm,�DD�8%O?�Re45k���T*yyy̟?222ؿ?�ƍSb��H)�ӧ}��w"��Ӈ�-[�;�r������nۭ5v�X7n��`0'ݼy�q��ѠA�V��믿X.��i�&���hҤ	NNN4jԈI�&�a�sY������Z���~��޽{���̺u��ߎ;��o����7�f�b���/O������6mpvv�g�1�d����ғ����3�<���3>>>�7��[��T��۷�R��g(mi�^>�;)�q8��Ml(��g�y��ѣG�_�7ɯaÆeD�Ėq���і�֖�Z�j�믿ΡC�pwwgȐ!��fi_�Y�_%�J2����ԯ_��U��M�^�js,�DD�8�9E��0������ȃ��cȐ!|��׼��L�8��/}DD�ޭZ���!���WM�65�;��^^^����zߙ3g�ѣG���8q��#F0y�d���HJJb�������������9r$�.�///�ԎǤU�V�MG}���w��(gϞ����b{�-8w�M����xxx����|��P��4�p-������I~�/_��ͭ�>�6S��b�h�Xk'''jԨ���>˰a�,f(/I��}Mdm��MIƱ��`Z�-77��X4��Hq��"Rdffr��Q͜"""�B\\o��u��a׮]zrXDDD��*�$`��
wR�j�"�;:�y����?[E׮]iժ۶m���?��̛7���8�|��;.U��r��a�իG������Y�f��۷T��$��$��Fk�o��7/mq��|���q/�CI��8�K�/��g�y����C�m���ʈ܉-㴵ף-c����$m��5]���U��ܝ�1ggg�#��Ec���G�)"�@ZZ�o�Vr���Th/^d���|��g���;DEEY�4�����������ӧY�~����qww�G���уC��e��.]Jtt�o&%%k�1��ɓ�999�J�Ejj��rF�����6��c�q��)RRR,��SRR��7�[�n���@�J�FI?�;)��,�{9Oj֬Ʌ�r�
5kִ�gZf��v��`�h�X[�Ѧ5��J2Ε�8fM,�DD�8��/"%������O<�C)k֬�駟�?���7of�̙JL����6-�P:v�@dd$G����\�t�Y�f���Oxx���+�����?�~�)���4nܘ&M�E?y^T�{��%;;�#G�0~�x�W���qM�2���trrr0�DEEЭ[7��2%�DEE���JNN���L�:�^x�uܼy���tF����ǩ[��E,��a��`��,-w;O�:�Lˎ�>}�P}�m��&)
�^�����5����bm�t�+�q��X4��Hq4s�H9`4��Tv""R���O�������1d�����������X��Ã˗/ӫW/<==Y�~}��¶m�HMMe��\\\9r��upp0QQQL�6�iӦY����c�:t`Æ
L�0�	&��ȑ#�iӦԎ�F����Xl�_�~6��֭[9s������ׯ_h�I��[�swwg���75mi���V%=��d�yR�9ֶm[�o�Nzzz�~HOO�o��T�^�����5����bm�t�+�q��X4��Hq4s�H9`4iѢ���)U_~�%O?�4[�l�/���?Vb�����+99����"��=��u����Dvvv��_�zubcc	���'''����СK�,�xʻW�^L�0�'�|����`��ˋ��&O�|ǸnjC׮]quu�`0ЬY3�N��o��ʕ+K�����	�J�*ԪU�A���`��.777/^L߾}�U�NNNԪU��d����74hЀ����|�r�|���a��`��W֞'E�cݺu�Z�j�ܹ�P�;w�z��t�ҥ̏A*�;���^�����5����bm�t�+�q��X4��Hq������Hev��m����?��������=���`����_�~����F��KDDDD����0}�X����J���,[LL�-b�ڵԭ[��g�ҳgO���:t��#,������/�uE���@||<���E��W�D���R�$k�;;r�7n����ޡ���ܳ]�vѢE֬Y�ʕ+Y�|�SDDDDDD���`�ԩc�X���g�eMDDJ�� )��SD��h4b0h޼��C)���,ƌC���i֬��������a������TJ���L�4�u��q��yΟ?Ϻu�4i...�OD*8�A""R�*�@��KII�Y�f8;;�;�INN&88����2d�{�$"""""R�=��DDD0c��|�M������T�DD� %��ؙ�h�E��CDD�f�n���+QQQ�k׎
6РA{�%"""""��D.H``����JJc����e}D�,%%___{�!""b���tZ�lɌ3���f���JL�")9EĎN�:��˗5s���<0n߾�������Ņ���z�-��������������SZ�GĎRRRptt����ޡ�������_BBB��o�<y2�G������a�����������H9��;JII���777{�"""R���<bbb3fM�4!99��͛�;,y������!��+11���@{�a7AAA�]���a���H��;2�����;�b}��w2�����w�}��'b0������<@�ׯO�>}������Ӈ�-[�;��-"R1��Ӈ����;3%��ؑ�hd���CDD�HK�.�w��ӓ]�vU�/�DDDD��`�0DD��V��w"""R	(9E�N~��G���;Z�ha�PDDD,������|������DEE���j�DDDD����@PP�������@�����}���`�DD�����W�e�|Qr������(9EDDʕ��D"""pssc�֭�o���!����H�'�E�<��It={���K�
�o߾�AĂ�SD�$%%OOOj׮m�PDDD�駟x뭷HHH`ذa̘1777{�%""""H�>}���H�֮]k��O�>�EDD�L)9E�N8��������/�d�Сlذ���wv�HDDDDDDDDDDD*%���IJJ
�z��w""R�edd0z�h���ү_?��P�F
{�%""""R����HNN6o;z�(M�6��:�&��QQ}S�Z�NY�b��nժU$%%ЪU+M�/R����8��z���SD���;vL3�����l߾�������ʕ+5u�����TZ�ӟؾ}{���)��hd�ܹ�\����<���G�&M�]�Ha|�.""�+%���AZZ�oߦE��EDD*�7n0n�8fϞ��/��…�]�����o
��ܾ}{��-RЍ7x����ݻ7�����Ջ��Ǔ�������#)?������e�Nt����Xr�w"���h��ݝF��;�D��ۇ���/&66��?�\�)""""Rn���[�\�ȃj���\�x������
0��/�x�b;F&rw�m��]DDĒ�SD�h4ҢE����T�n�b�ĉP�^=����wX"""""w�l�2���			�ؾ�~���ٴi��=z����ƍ�7Q8@�N�,o���Z�kff&s�̡G��nݚ�ݻ3o�<����Lm�8q���x���:u*7nܰ(��?0q�D:w�L�V��߿?6l(TgFF}���hժ/��2���\�v�P�K�.���/ҦMƏOfff������[�IJe�����С��?f̘Q(����ν��V�X�s�=G�Z����ԩ���?+V� ##�^�I�.rss����W�^�nݚv��1x�`֮][��5�ҝ����Ƞ}����ٓ��\�}gΜ��ߟW^yŢ�7o2y�d�ԩ&L��,Q�t����XҲ>"v`4	�w""R	���3h� �;��ٳ	Wr�����<0�t���ٳ9|�0���T�V
��7�y�f�t���˗9w����{���h222,n�Mvv6���:tȼ����ƒ���ܹsqt�����¸r�
YYY�^����\"##��lq��ĉL�0�۷oӽ{w�]�Ɛ!C8y�܅HHH`�����ƚ�.##���PΞ=k.��_r���{�[�-	[b�?>�-�x��X�bW�^�>�9撜Ͻ������LڴiS��6mڰ�~6n��k��fk����ܹsY�l����[�HKK#--��ׯܟ���͍~����͛�ڵ�yߎ;h׮��{�O����_��
6���B\\���6Ǯ�]DD�0͜"r���䐖����o��o4K9"�888覦�����L�>\\\0�>\c�����<P<==y�駹}�6)))�/߭lݺGGGv��MVV�Kb6���?oN�hԨ�w�6'$䗜�l�o�븸8:D���IHH`߾}�Z�
___���Ϻu늌��~Q?EiРk֬a��݄����_��/]���ooo֬YÎ;x��W���5�[�l'O��nݺ��Ʋw�^-Z�c�=Ɖ'X�d���'�|�ٳg�W�K�.e�޽,\���Ǐ�ϖ~��ޒ�-�,_���cDz{�n���Âعsg���I�so���<��S�ʚ��ʈ<h֬Y��9sػw/;v�`�ر�\��\��k����ZAAAT�V�b��_�S^x���v�b����ݻ���X{�1Ν;G\\�ͱ��w��(9E�>���o�y�&~~~6��gϞ%z���T.Ǐ�^`�ĉL�<��;wҸqc{�%""""b��d���M3��nL�۷��W���+����Ů]��_�S:v�h���16�fZ.(**�&M����D�F��4i@���Ļ�K����Z��yV��W�����m̘1ԯ_�jժIrr2�}����)�%22�g�yggg|||7n[�n5�ݶm�ƍ�Y�f8;;����{�wO�`K�%aK,;v��o���ۛ���̚5��ӧX,sTV}aR��;z�(�KRRA
6�(#RX;N���xV�Z�O?�D�޽INN�Hڸ_���?L�޽9v�{��~�-��<��C��g;v,mڴ��ٙg�y�<�U��A[b�.""R�����RRRpqq)2c�n>���2�HDD*���<�Ν�رciڴ)���4o���a�����ܓΝ;3s�Lsr�ƍ�Z�*|��l޼�Ν;������c��L7mq��z��Q�'N���'�����6-���k�v��9�6mz�zL����XloѢ�E=��=�<�L�e�l���N�Up�[b���9r$�.T.//�D1���]
 IDAT(x�]�|�eɑ�L�LeD4#F�`���$%%������	

%00s����%1p�@V�\��ŋiӦ
{����۴nݚ*U,o��j���i�s�8ak��EDD
Sr��}f4y����+""r/N�>Mhh(;v�`ܸq�?ggg{�%""""R���	�d��|||HMM����l۶��-[���A�-صk���:t___<<<,�k�)`��P���o܋����.˙?���tl����l�[�-	[b���9|�0��գ}��xyyѬY3���[d���&�=����XxBs�6-�*�-�t׮]iժ۶m���?��̛7���8�|�M^{�5��5j���^#!!���t�^���׽i������w�´��H�v�cǎ�Q�FT�Z�p��-�z����888��'�X�7!!���k񇪃����m4lؐ��H�6�/--�.]���C�裏2|�p�_�nQ�…����裏���JPPP��c���˄	hڴ)U�V��͍֭[����S������.]���.\`�޽L�<Y�)""""R�t�ڕ��\�.]���	   ���,,X��k�
-�SR����_�����B?���/�v�v���gx�ǀ_f�����t<����eM�"�gK?�RoI�KRR����1��ݻ[ԕ��cs̥qNԬY�+W��g�f*#� rww�G�,Z��e˖�իW���6�����믿��``�ʕ�ٳGGGڶm[�\jj��k���o��Ů�]DD�0%������,:v�������Gvv6YYY���н{ws���y�x���y뭷�S�9s����֭˂lj����DEEY��_ǎټy3���\�t���F�i���?Ӷm[/^̥K����"!!��k�ر��/�رcdggs��5���6l��t��H��x�W

eذa��?�)4������HE��/�����ի��)��˗/�C�6�mz��`Nr����ȑ#ܾ}�K�.1k�,���	/���t|3f��…dee�����ϫ��j.g:(RSS���!55��S�����w�3�=p�999|��L�2�P���-��DI>��{����͑#G?~�y�իW˴/�cZ����Ӆ����m	'���W^��ߟO?����L7nL�&M�Y�l����m����W^y�/����W����O��#�*7e�������h4@�n�J��w�´��H�裏HNN�e˖�������SO=����7o&66��C���#��t�R:w�̠A�زe�9���O?��Ã��<��,�F���9v�aaam�״iS�,Y��?Δ)S�2e
�}�.~����ɓ<��������KRR���z�c4���/��cǎdgg��'���9s5jTYu��H����HDDnnnlݺ�����;$�2S�fM���HNN�iӦԪU�
������OZ�b-._�L�^����d�������m�6RSS8p�Ey��|�[�xQKa���ٴi���������
f�wpp0[�n�̙3���Z��_��Ŷ��e��=�o�a�ޭ[�B7Qm�[�-	[b�С6l`„	L�0�P]G��M�6e��i۶-۷o'==???�}��Z�ZnD�ALTTӦMcڴi���\KE��%1h� �⯱5jb���ۛ~���(v]�"""�i��2�j�*�w|}}IKK��ɉ��8�:u��ȑ#پ};l۶���~�Ν;��F�*U�fɒ%��0�3g�7������˗�׮]��x���1�k׎�����z��DGG3w�\.^������������U�$""ֻ|�2�_�~��Ջ�*1EDDDD*Ӳ��ڵ+P�f�i��.�3z�h�֭������/�w������'NNN���ӡC�,Yrߞv�Y�&�/�k׮�������SO=����y饗�����X�x1}���V�Z899Q�V-��%Kpww7�5,\��޽{���`�K�.DFFjߖ~��ޒ�%�1c�еkW\]]14k֌�S��PV�\Y�}Q�nݺQ�Z5v��Yh�Ν;�^�:]�t)i���;�ӽz�b„	<��^^^���0y�ds9[�����x衇�n׮]�e���	�J�*ԪU�A���`(Q��EDD
s��?����jժq�ƍb�רQ�K�.�_߼y��{���4����������yQ3��҆�7o�4�Q�������E�...ܼy���L\]]�u]�v
777��+V� 44�C�jՈ��dĈT�V�#""��׿�Űa�ptt��?6OA-""""R�$$$d���k��,&&�E��v�Z�֭�ٳg�ٳ'aaa�f@��'((����"_W$���X��f�Ν�9�
���31�xe��V��."�V��{)��5s�H��ͽ�+W��ϔHRm��.�ӗE�4ʿ6�I���9{�,����mۖ��L"##y��lj����DD�ή^��СCy��y��IKKSb�������(88�:u�X$<������Yh��7���\�t���E.[_�t����XRr�Hjذ!�N�"//�ڵk��G���G^^999�ǍGZZ�=��~�-���m�)؆57n��;,�'%%Y��Ã���k�.���ϟ��g~��'F�es�""bi�����~�zV�^�'�|�������puueҤI�[�����s��y֭[ǤI�,fP�{׮];�u�ơC�hҤ	ݻw����z����2�ꫯ�W_}�?�@�
3ft���\v�̜֭9���v��M�v�5k[�n5�1�rr�ر"�8p�999\�p��6�5`����رc�n�b������*��元����'##|||�ZDD�67n�`�ȑt��	???����ի����{�����3�1co��&~~~�K�©U�U�V�m۶�������Ǡ�]DD�WyZ�U��\�r�V�Zq�ȑB��U�Ʈ]�hѢ?��3�<�W�\��4lؐS�N��・�;iii<��#Ԯ]��/РAN�:eu�krK�˾�7oҺuk�F�E��|�r��, <<����ѣ���u�%""f���#$$����3k�,�����������

2wP�Hy`^���������x�|-""��{)g�5s�Hz��ٳg#F��G����5jгgO����I#|��w̙3ǼLOÆ
�3g��=̚5�F�Q�Jn޼Y��
P�J�"۰EժUٶmÇ�7��
U�V�o߾,X��Pٰ�0-Z���...���мysƎ�ҥKK�s""�Svv6���P�^=��Ҕ�""""""""""""�*�@�����`�̙�9s�իW*���@BBB��
bРA�������Ŷ1s��;�R�JEmwwwg޼y̛7�eCCC	

�c�""rg$88�'N0{�l����3[������������<�4s��}b4K4����Tl999DEE��������>|�SDDDDDDDDDDD����)"��O?����?%������Ǐ��hdʔ)�5
GG�����HŔ��h�DD����H�>}���$&&���l�0DDD�Sr��}`4��"""�/K�͝;��c����������������H��۷��C�b�]���k��;����"r�Fj׮�c�=f�PDD��N�>Mhh(;v�`ܸq�?^O&����H�H``����b����;���"r���h�aѢE�5����{����o�DDDDDDD����V""��o�M@@�����"r_8p��={�;�����3l�0���3j�(�����b�DDDDD�Tbb��C)���D���c�0��x]Y�WD��HLL�I)W��"R�2339z�(����EDD�`Ŋ���xxx�}�ve�����H��'�ED���Z�MD��qpp�w"��"R�RSS�}�����d._�LDD�V�"<<����o<��C�KDDDD����������XPr�H3�������e�PDD�>�׿�ŰaèR�
_}�]�t�wH""""""""""""v���2f4iѢ�����^�ʨQ�X�hd���xxx�;,����?����mG��iӦ�\���o�<*�oʢ^k�)�X�U��Z����$Z�j��
EDJ��SDʘ�h$  ��a��Hۺu+���ܸq�իWӫW/{�$"""""""�ӟ�����}�TF���s�r�J����ׯM�4����ޡ��<Д�"R�rrrHOO����C�2����رc�;w.���*��ϧV�Z�KDDDDDDD�T0	e���eV�HA7n��ߧw��xzzЫW/ƏObb"���v�PD��h�D*�o�����,Z�ha�PDD��ݻ___���X�l�W�Vb��������TH���V/�#�Z�x1/^����m��ŋ,^�؎���<���"R�RRRpqq����ޡ��H)���&22�^x///���8p������-[���?!!!��ߏ��?�6m��ޣG���ٸq�9��t�ԉ��p�2	&2L����L�̙C�=hݺ5ݻwg޼ydgg��q��:q���/2u�TnܸaQ��~`�ĉt�ܙV�Zѿ6l�P�Ό�>��#��?ЪU+^~�e����v�Z���.]�>��_�M�6�?����"c��l��$l�e˖-���ӡCs̘1�P<e�ŝ{�X���{���:u����ϊ+��ȸ�n�����H2�<���T��KMD��8x� ����<y�y��1l�0����������}ץKfϞ��Ç��̤Z�jlܸ�͛7ӥK._�̹s�0�눎�&##æ�h���	�СC�m�ϟ'66���t�Ν���?�ƕ+W���b������i>���`�{w_ӵ��}��T�@/1�\T�R1��V�m�����^-m�V�Һ��jk���耢���� !�Tj�	WB"2�����M�d8G�H����~4g��~�q���ZW�\��s��I���{JNN֋/�(I�q���S�N��EFF*88X{�����m����۷�.\�`k�n�:�����up�_g8�e�̙�7o^��###�l�2���h„	gv晸�������~:]�O?����٣����W^q����)@�:p��ի�������I�&�Q�F*V��8�P��[�˗W�ڵ������0I�eӦM*P��~��7���K�"""$I�5�bHR�J���o��
R

M��ŋu��ժUK���ڽ{�BBBT�^=�ٳG�V����:b��Ş�+���o����}�J�~��W�E��ʕ+�Q�����{mݺU/��$i����v���t��)=��Ú?�v�ܩy��顇�ɓ'�p�B[ۯ��Z.\У�>�E�i�Ν�3g�N�8�.�#��~��^�dY�t�$)((H����v�ءٳgK��mۖ����g��~�$=�����Z�Y�Gq
�K�1
�O<��(�;t��Q����>Ї~�-[��r�ʮ��k2*F�}�udk���ݻ�:(>>^۷o���)͛7Os��ݻ���ݡl��&M���U��`���T����}I�;��3�z�-U�PA
�$���ض[�mԨQ�P��
.�1c�(44T?����e̘1�S�����T�n]�=Z��i�&[�͛7K�F���5k���M����;�sG��~��H��[�j�޽�Q��~��'}��g���%)�4G�u-�n��;&��=��ci��\#@.9}���]���)�����h������ۧ5j�:�=��g�է�~j+NY�~�<<<4d��^�Z7nԳ�>���(P@M�6M���CG�={V�Ծ}{��O�<iw}�X�#�'/^\�߿/����I��U��i?�ii�֭�f���[��H���%Iu�Ա�65G��#�Zev�n=ő,W�\ш#�￧kg�q*�3����^TT�$�X�b��Z�Y�Gq
�K���U�@ծ]��QN8}�����;vh�ر=z�
��?�^�`-F�W�P�n]<xPQQQڼy�|}}���'�xB۷oW\\��9�z�����;;���"�-`�'��w���������t��ԅ.V�s���^ʑ��H��p$˔)S����G����*W���5k�s��v���kau��g��
��xº�)��y|�䒰�0����hѢ��pмy���o�B�
ڽ{7S�d�u��
ӢE�+???I������٣ٳg�ƍ��qV���u�����*_�|���|P�Ν�ɓ'3m���ҟ����0����և��IR�sx��Gu��)�߿_O?��m�uZ������G��ڵK�4�|[�ҩS�lۓ��T�P�\�)]��"##u��5�.]:Ͷk׮������@�O7D��v��E�k�N��Ja
@Z�l�
�モ$[qJ�&M$IK�.�$5k��ᾭ#UX�m�d+r3f��=���d���_���԰aC
4��sq����N����H���kʔ)jذ�^z�%[;�yO�4ITRR�<�ɓ'K��y�[۶m����߿_III:|��>���t�w�:8ү3��';w�TBB��=��c��������Ȉuz�3gΤ�f]��N��1r
�K����ꫯ�: ��-[��^{M���ڼy��(�\�ҥU�~}����Z�j*[��$�bŊz�Gt��yU�^ݩ-�����_~Y�˗׏?��޽{k���:x�w����F�a�/��D�7eQf���
6��j׮]�m�?�ի�6mڤ�gϪo߾i�U�P!ͺ�ݻ�_~ѱc�4`��6mڤ+�p�:8ү3�ҬY3�]�V���{�t}=zTO?�t�]��4i�D[�lQDD��ׯ�f�u��ԅD�0r
����u��իW��QY�r�:w�u��E�����&444��֭[KJ���,�N�3r�H=���*X��$IE�������˫`��*^���5k��޵�-J�.��u��*V���������?���?okW�X1-X�@�;wVٲeU�`A�-[Vݺu�…U�xq[[www͙3G;v�������ժU+�3&������G��5J�[��������U�fMM�<�V���7����H�6mT�pam۶-ݶm۶�hѢjժ����{c�qu �ټy��7o������vu@V�Z����]����K��Y,-Y�Dv_��Y�fi޼yZ�b���.��������8!�}|��=&��S�\�x���G]�vM�{�V�Զm[:t���>׫W/�+WNK�,��[�d�ʗ/�n� �c(NrAxx��֭��;6mڤ:u�hݺuZ�r�.\�%J�:����￯U�V��ŋ�x�V�Z���_�����yZ!W򣰰0�l���1����)((H_|�:v�3f�L�2���ҠA
2DS�N�$���k�_���S@�Gq
��u����曮��_;w�T�^�t����?�aN
P@@��c@�´>@;|��T�^=WG��ޭ[��g�yF�+W֡C�(L��9�a������P���]�kPϞ=u��͘1C����,��c�w9�a���U��
��\!))I&L����J�.���p
0����s ����1���ѣGիW/:tHS�L����U����	T``��c�|�� ����륗^ru�����h���=z��ԩ����3�@6����: �����:`Cq
��Ξ=���(խ[��Q�q��i���G;v��رc5z�h�VȦN�:�:���
�����d�X���c��Ν��#G�bŊڽ{��x�	W��m(NrPXX����x�⮎���BR2 IDAT�ԿmذA#G���������XyB``�]�G(NrPxx8S�@.[�x���2e�h۶mjܸ��#�!!!��p___WG�}�� ����gϞ���ҕ+W4d�}��:t�>��#.\�ձ�N�:�:�Q�䐘��:uJ���su�wV�Z����S7nT�-\	�T����"<<\����t��5���[:tP۶mNa
@��)@	����*V���(�/lذA���SBB�V�\���ۻ:���)@	cJ����2d�ڴi���zJ��a��䐰�0=��3��y���ջwoEGG+88X]�vuu$�!FNr@RR�>��u�:
�I�n�RPP����U�zuEDDP��O0r
��;���x��'8p@={��ٳg5g�����Ց��9�����j֬��(�g$%%i„	�U�ҥNa
@>��)@W͚5�����(�'9rD�z���Ç5e�
>\
P3��)�5k�h�֭�~��m]xx��֭��T�7���h�ԩjР�
,�����_���)��
		����J�,��\ݻwWhh��+�7n�:ܳ������k̘1z��w�}�vU�^�ձ��(NT�zu(P@�}��:v쨨�(����/�P�%T�F
u��Y��?��k׮�:.��1Fs��Q�z�t��u�ٳG�G�V�B�.p?�c��Cy����խ[7������ݶ�ܹsڷo�BCC���r��:q�,���k]�pA����ƍ��[oiܸqi�w ��O�U�RE���:u�T��(}�Q=�裺v�
,�o������ŋk���*S���nݪƍ�:\�i}U�TI�������� 
0@��ջ���p��e���+�ٳ��wﮰ�0
S�c��8�x��z�u���t�&L����D}�.H�����k������ƍբEWG��1r
��t�)G�������t��.J��=z�W^ы/���R�I��8�R�J�y���U�fM
0�E��56lؠ~��)))I�W��/���H��0r
�*U��ĉ��˗/׆
��_�`��.LwOll���6mڨI�&����0�0r
��9sFIIIJHH�ȑ#ճgO5i�����ؾ}�z����h�k׮���{#�N�\��u��Y}��G�z��>��#W��\�Q�F���_իWWDD�)�#�N���$�_�^����5q�D�+W�ũ w����W�^:���̙�~���:��1Ƹ:��.]ZQQQ�^��<(777WG�\�����'jҤIjڴ��ϟ��+�:�PFN�%I���(L�o9rD={����O>�DC���bqu,�!\ȫ�5k�ʕ+�u�֮�9.%%ES�NU�
���0
6��8���ImڴѦM�\r��!�3F���mۦ*U��:�(�1Ƹ:���������1 �c4k�,�5J>>>Z�h��֭��X��B9p�)�s�ΩM�6>|�^�u�ٳ���B�\kѢEz���U�|ym߾]������|$NjS������@:Z�d��cy��˗5h� �\�RÇפI������X�grm䔐����(��������H�"ڴi����]	�T��t��)���X����<)::ZÇ��ŋկ_?}��'*^���c ˵�poY�n���ﯔ��^�Z/��#�>���)���L� Ghɒ%���9ׯ_�ȑ#5w�\u��E_~��J�*��X����%K�(  ��1܇���)!!!w�P�!>���e����Gׯ_�7�|ô{��dW�Ν]�}���a�;�b�
WG�x�;V�~��ڵk�9s��tu,�0�_������#44T�z�҅4�|����Ցp�8�|"11Q'NԤI�ԴiS�]�V+Vtu,����L �%K�(  ��1��YTT�ʗ/��������ŋ*U��];��b�$c��~w�z��J��^^W���-""B={�Աc���'�h�С�B�����;wvu��8�>���IRBB��.]��^{�ũ�HNN�ԩS5n�8կ__aaa�R���c�E:u����pu��…%I={�L�^g�qو#�cg��+y�o'N��3�<�q��i���ڶm�)��P�r����о}�T�L͘1C�J�Rhh�>��h�,c4s�LիWO���


��o����:8-22����2����\v��
0@*T����ʗ/���@9r�n{�Œ�r���Pu��I<����U�re�ƍ�Z�h�$�[�n*R���v�f}f�Μ9�
�H�"z���8�$mذAO=��������:h�����8~��,�ʕ+���$�m���T�\9[{+G�˝��e�nf���;wNmڴ����5r�H�޽[�j�ru,�iQQQ����b�����������w�N���y���{�쮻S���4h�jԨ�…�P�B*S�����������v��;w���͒��BF�WQ����mۦ:u�h�ܹ:w����`5h�@k׮u�O//�4�-Z���zJ�~���\����D�:uJ���6m����t}$''k��Œ�oJ�/^����L3���W���W\\��)rGY$�o�Q۶m�{�n%&&��իZ�j��4i��{�f��jժ�ץK��f��m֮]�K�.���_U�V��;�%�����ޢE�T�vm�;wN����Ə/777W��Hpp�$I			Z�t���Y�F�R�F�4{�l����y󦒓���_��~�رcU�J}��w�0`��^���ٗ2����\��;��1b�N�8��7oj�Ν�߿���/����n�4i�m�W_}e�����8p����5h� �>}Z			ںu�|||t�}���鲭[�N���z���հaCI�����V���/�����N�8�C��ڵk�6m�e��W_}UC�՟����m߾]>>>����ĉ3�2`�IҼy��n_�`�$������/wý�
�k]�tI:tP߾}էO�߿_�5ru, G,\�P��Z_����\y쬖��w�ܹ�:u�<==�������q㆒��t��mܸQ/��bbbԭ[7����Z����\2{�l]�|Y�G��'�|"yzzꩧ��ܹs����ڵk���/3�g׮]z�$��ר�m�f�ҭ[�ԥK͜9S�=�������3���믿Nק�C�=z�Yo}�ՇBcǎU�Z�T�xq=���w�E�z���>�L+V�����4i�Y�fI�v�ޝi�W^yE�J��O?�����4�._��5k����[;v�t�ři��+�������U�V-:tH�6mҧ�~�n- ����о}�T�L͘1C�J�Rhh�>��hpЧ�~*IZ�l�ƍ�ڵk�H�"*X��J�.��-[��������e2 �8%�X��:t���֑<֯_�a׮]S�nݔ���6m�h���i�oܸQ�4dȐt�6l�P��>}:���h��㏲X,
L��G��X,Z�j����3����n�3Y��n]�ƍ%IW�\�0�$yxx�gϞJJJҢE��l[�x�ս{wyzzJʙ��[��l�(u��M]�t��/����p����8s��
*���C�˗W``��9b��3Ř����ԩ�x�����r��


ҍ72�e���[�n*R���v�f}f�Μ9�
�H�"z���8�$mذAO=��������:h�����8~��,�ʕ+���$�m���T�\9[{+G�˝p����l'N��$�i�&�~G�-Iڼy��\�����yV���<+�dt4Cv�����}?+Z�������O?�:�]�O�ְa�T�jUyyy�D��_����}�?�8p�)]l��L[�d�I�������FR�Kɒ%3�s��F����1QQQ�/^�H2W�^�v�/���H2͛7���Y�fF��1cF�m�̱��9���߭[�2ݞ�ÇI�jժi�ժU�H2���u�ޗ��8r�Y�ˉg&?0��իW���˛�~���O���{�#ﷶn�j�w�����ӬY�&�>Y�[��啦�…M���}�'̍7�#))ɔ+W�H2{��5��k�.#ɔ/_�$%%�=k�-Z��}ݥK��X�-[��(P��5ڳgO�9�1����H2+V���y�ʕF��ϑ���q6[�J��$3{�l�r�[no��=��d�=�ϊ#͐չ9s/R��dɒ_߯2��
07ntu�48��3 �T�Xќ?�־C�N��S�<6�y{9%�����Q����J!!!*V��V�\)oo�tm��Y�h�l�N��믿��A�_�f6�O�…s$�������V�F
5i�DǏ׶m�$��W�jԨ��ԩck{��%7����111�߿�ڵk��-[�СCj۶��c!���Rǎu��u�1B'N��͛7�s�N���_			
�ŋ��g�I�L�4ɶ�����}}��i
8P���4h�N�>���mݺU>>>:p�>���t�֭[���H=���jذ�$���WU�V�ŋ���?gzn'N�СC�t��5M�6펲Hҫ����C���?�TBB��o�.���g9̀$I��ͳ�}����o4g����l�aÆI��V�Zi�̙:r�RRR2=�����u�uV�yV��,{����w��;C��X��*�=LIIѥK�Էo_���h��񮎖ƈ#�V�Z),,L			����֭[U�~}�9sFAAA��+W�tYVWy@N��0r�ߜI��ȑ#�p���b���+WfخX�b�:�Hv�#G���ߺ>'�d�_f��_�p��dz��m�1fȐ!F��3gN�v�ޗ��:���uw���9��/��b*V�hʖ-k���;W�=.��&M�d$�1c���gĈ�n�ڹs�)T���dF��f�[o��n���{�I��K��cǎF��4iR��|�d:u�d7���P{#t8���߰a���q�F#�<���0Ƙ��xS�T)S�P!s���4�.]�d��܌����y�1�������f���l)))fԨQ�F�)Z���7���_�'�m����{�;yVr*C���N���#��n�ږ�f͚f�ĉ�ԩS���dt/���I�����2���n$������?~�H2��޶uw�s˝r�p�c�����#Iڱc�C���ǫk׮������վ}��V�\Y����-Z$I�ѣ�ݿ��.ݻwO�>;͒�:w%KjŊ���WHH��-�nݺ�i��}���lrO\\���g�}V
4СC����/�:�5k�H��jw�u$����g�ǵk�ԭ[7%%%�M�6�<yr��7n�$
2$ݾ
6�1F�O�N�>::Z?���,��l�ѣ�,�V�Z����s����[�L����[׸qcIҕ+W2�!I�ٳ����ҽZ�x�ս{wyzzJʙ��[��f�X4e�<xP#G�T�Z�d�Xt��
mٲE�'OV˖-U�Z5mݺթl���Y�
����I�2eԭ[7m߾]͚5����U�re5n�XӧOWddd��ƍ


R�J�����{LcƌQ|||�v�F{L�X�;wN�z��< wwwթSG_�u��(��%J�H���o�U�-T�dI����bŊz���m�GJRJJ��{�=U�VM*V��7n�f�)G�]�|�AI�;BN�*Ud�QTT��ZY��>֯�l٢ҥK�E��ڤfo}V�7�c69]���)=z��d�4ib�m��o�$��sϥY��k�I��_6)))��ג}��I��СC�9ȍ1&))�<��CF�ٽ{w���ر�H2=�P��nU&	�H������[����$ӿ�tm��/Ye͌�}�s6���S��ر�T�R�x{{������q��d�����w�F�(Y�d���ܹ��d|||LTTT��Ό���_I�y��v�7k��H23f�H�͚9666G�X��u�V�۳Zo��jժi�ժU�H2���u�ޗ��~$'����h���?�>���m��.\�H2���&444���=�jߌ��ɳ�SR��wnwz/���)���JLL4?���ٳ�)^��)X��iݺ��?���w��MӰaC����Ϛ���4�3[�1&22Ҕ/_����.�ߋ˗/�޽{I�w�I�m�ر�G��v�F�ʰݴiӜ:wc��3g��dJ�*e�~�m�u��,�_�~}�_ׯ_�X,ӽ{�����ٹ��_{)N�%�ϟ7%J�0�L˖-��ݻ�͛7ͦM�̀����)T��9p�m��+WI�N�:�ƍY�������K���Hk~��S�fM#Ɍ7�c�ڵk�$Ӱa�l��'�$��O?��e�KFG�d��̶g�><<�H2E�1�̮]�ҵq�d'kf��a����� ?���7o���)X��i۶�9���#!����f���
�=�ܹs�$S�X1s��a�m�Ӹd4]�=O>�d�r5j�(ݾ����L��|?ҤI#�lݺ�����~�ޗ��~�N�����Ę���ɱB`g�Qf�s�Y�������8%���8b^z�%���a<<<��/�l���[�i���8q��d|}}́Lbb�9|�����3��ܹs3�wժU�hѢF�y��Ǎ1Ƽ����u�?n�_�n^}�U#�]X�ZfײO�>�
?�ǚ1c����3�����_5R�� �u�֙[�n��ׯ�3f)�QΜ�ҥKM�ʕm9===M�-�_|a�.�󳷮{��i�g������Q�(N�Mk֬1^^^���nРA�~�ڼy��b�ۮq�ƶ_>Z���̈�è.]���e����f�n��Q�FF��]�v��:z_��53�0��l��S�_�߿�ԪU�+V�̞=;�Q�{��~˙�!��9b
.l,�Y�re��+��1�#�dw9r�H��3�7��,Y���v{�.\h$�޽{c�2d��d�̙������n�q&��0�ܹsY��|����.x�*Kv���n��͛7���ϊ3���N�������)�]�z�L�:5��Ç�pt��թS�H2�N�J���ɓF����ԩSm�E�=����T�V�H2;w���ؙ}��W��Y�lY�}RRR�޽{�ܹsͰa�l������6�L�֭ʹi������n�1���f����瞳�W�zus�…t�g�������Ye����(�{{��X���WXX����G}Tnnn*Q��Z�j����k��i����o߾ڲe��{�9��իW�|�_�U����z��V�Z�ҥK�k׮��7  @%K��ʕ+u���˒� I�߿�m�/wӽ�
��IJJ҄	���ҥK+<<\��bqu4�c>>>��;v8�_||��v��8�?^�۷ϰm�ʕ%I��{ѢE��=z���ҽ{�4���,9�s��*Y��V�X���x����hѢ�֭[�v�ޗ���lu�֕$���Y�uww��ĜR���?���ťۖ��~V�ɐ�{�9����ҥKգG�=Z^^^jڴ�/^�)S��p�����ĉ��J�*�b���9:t(M���D���_#G�TJJ��x�
�^�Z%J��$�>}Z���Od�\R��v횾��[���_�ڵ�fΜik�ʁ� IDATw��E=��z��'�ꫯ���?��Çm}XM�:U^^^Z�~��|�Mծ][�&MJ�L8z�5h�@AAAZ�v��\��q����ѣ>|x�ιZ�jٻ8�q���8%�U�ZU����ٳg�����W�j���jժU����љ~Hc]n��3�h�ڵ���֭[���k�ر���$�,YR7o�ԕ+W�] R�paEGG��͛*Y��$ex|G���Um�l�~�����/h�/�ɚ{�f֟����9�ƍ룏>Ҕ)S�i�&���pu,�ڶm+I��������b���O�~�ȑ:x�^~�e�;6�c4o�\�4o޼t�"""d�X��c�I�����x�bI�СC3�wȐ!�����Z��ə�u&Kn���R``��^��)S��ʕ+�ڵ��-������np&[�޽%I�Ǐ��3���ɒ$??�4뭅z)))g����$�ٳ'ݶ�����Ǚg%���d�ʽ�$&&j���
T�r�ԫW/%%%髯�ҥK��e��}������k�l_GEE�U�V�7o����5�|M�6�V$�=�/�W^yE���$i�ĉ�mÆ
Ӿ}����7�|S,���ֵkW]�pA���W�&M�1c��GѬY�l�9��E��b��…��yzz��ߖ$�����:ό~L�sɭ[��m��9"��baZ��i}�%''��������������Ց�Od�����M�%�$ӲeK�{�ns��M�i�&3`����n
*d8`�g�ʕF��S���q�F�Y�?n<<<�$��;���Hk~�����ƍ3��v�Z#�4l�0[��OI槟~��S&�F8�%;�e�=�����F�mʍ]�v�k��}�N������:g�%&&���~�H2f�Сf۶m�ڵk&))�\�|٬Y�Ƽ��KF�)T��ٱcG��Z��Y�|�ILL4�n��yw��H2>>>f۶m��͛��ɓfĈ������<+�et&CV���s��og��INN6�7o64�J�2�����/���\�|9�>��:M̟��i��G�#ɔ-[�l߾�n;k�={�dy�̮ydd��d���l�-j$�9[?			v�ڳg�y�����s7�#Ɍ;���0#ɔ(Q"���蜭S���:j�޽��g����(�{{)N�'P�����ɓ���ϸ���?��$&&�:�G�o�Y��xyy�>4�}�1cF��
4Ȱm�%�y���>�}iܸ��y�1ƘΝ;If���:Ϲs�I�K�.�uY}���,��ϙ��F�I�v�����}�N��8�3٢��L�֭�|n�/n�/_�n�f͚e��eu�{��MS�z�3gN��;��d���Y��3�"uߎ����F�y�G�$S�n]3e�s�̙L�sTPP��d�~�i�o�>���h.^�hF�i$��͛c�)Y����.�ɬ�c���Μ9cbcc�k��f�75{�<))�;v̴k��H2����m֢����?��͛f߾}�nݺ�~.]�d�1�R�J�{cnݺe������x$��n�1����d,�6l�9x𠉏�7W�^5+W���w�޶}���c�2=gc�y��$3u�Ts��
a6l��}v���c���y�)�+RRŘ3L�"ELݺuMXX��#!r�ֱc�L߾}ͣ�>j���L�%L�V����ӵ�~�Hq�1�lݺ�<��s�dɒ����T�^�|�&>>�cLtt����4�K�N��FbccMɒ%�������6�d�@#�,��Fq�W_}e$��>�,Ӝ�ܗ�d͌#�)�d�Z�n��ѣ��V��)\��)P��)^���5�Ǐ7���v�;}��i۶�)R��)T��y�G���j߾}�}�����۸��___�z��,�w�Y�,���sn��g�S:u�d��G�8|�p�m��\�^�j�W�n�{K�…��������/�r������_�͑����n�m�fk߽{�L�[Gv�5kV�mڷoo�/��ne-Z�h�V�Z�Q]ʖ-k�V�b�t�>����m۶��g���;6�Z�I5�tV``�m���_�3%IK�,����;wN���ӯ�����zK�ƍ�����c!���X,-Y�D��?���+W�^g��ŋ*_�|��d�>�	&�~ЅT�xq5m�T&LP�ڵ��k���������?+..N�k�VPP�:v�h7Gjnnnz�Ըqc�5J����mW�^ՠA��z�j%''�N�:z��7��������?�5k�H��ϟ�/��RG��$����]�vz��U�dI[��9��֯_��3gjϞ=�t����T�Z5u��Q��׿T�hQ[�e˖i̘1:{��ʔ)��/���V���5j�BBB��͛뫯���?��}v���c�+��y�)��-Z�H����ʗ/����`�i������)�ℬ�Sr;���@�}!�����]�tI:tP߾}էO�߿�� �Sp����U�V-:tH�6mҧ�~*///W��7n�PPP�*U�$=��c3f����mm���|���i�
�$M�>=�46���i^g��ߣ�X,:tH�Z�R�"ET�L
<X���i�FFF�o߾*S������7n�;������{�V��<<<T�X15n�X_}���
�=�����DEE��^�7�|�W_}US�NU�b�\�O��ǫy��


��;s�&M��={���V�4c�m۶MÆ
����*T���g�jȐ!��~��i���wt�Ԛ7o����K��Y�f)99Ys�̑$]�zUM�4ѩS�l�+&&&�񃂂����:!!A�v�Ү]��7�x������)8`͚5�U���mۦ�k�j����rԴi�*___8p@���:|������q�F͟?_�T�dI-Z�H111�ٳ����իW/[1H�"Ed����d����#�jժ��㊋�Ә1c$I?��m�ԩSu��)���h��ݺu떶l٢����Zвn�:ݺuKׯ_׌3$I��yN\F���V�b
����ř�:<=�*111�߿�ڵk�֭[+""Bm۶uu,@>"IZ�t��ի�B�
�F�Z�p�$i��Ŷ�-Z�Ј#�e����i���>|x�����?W�*U���#FH�{41�+VH�fϞ�F����]M�6�̙3�U�hQI�'�|�/��B�/_��e���ӧ�� o�i}���l���;Q�BWG�}jӦM�۷����r�J�o��Ց�؉'$I�*U���СCi^O�4I6lЮ]�T�F
}��G���r��T�V-�ץJ��$����֝<yR�Ըq�4�5m�4]_S�NU߾}�~�z�_�^��ƌ���_*\�p���}ӧO���]@����U�
�Ĵ>d ..NÇ׳�>�F�)""��@�K]�aϵk�2�f�Xr�����:ePꩄ$���-]ۮ]��…�?��4ib�*�GѬY��u�ݻwk��宎���˗k��ݮ�Y��S�o߮����>��@@@��,Y���Ol߾]�{�Vtt����յkWWG�'{�1;vL���*V��e�ѣG�СCz��'�w�^���;9~��R��>��[����n׮]v�{{{�O�>�ӧ���ݫ�N���x�

4(G2�9�<ܛ��+��⮍�b�aaaaqz	�[߮p����רQ�����ի+""�������%,ǎ��wIv���'���{�J����'�I�x�m�K/�$�����߯��$EFFjԨQ�X,jѢ��߃�u�&I8p��nݪ��D�ٳGL׶r�ʲX,�9s��_���u�nݺ�Ҏ� ��S�+BCCիW/�?^s��Q�~�\	�???����:�b���…�yxxh„	��?����X�9Rqqq�:u�x������ȑ#U�paթSG������9r�>��s���


Ҋ+�c�5h� �1
.�iӦ9�{�ȑ���t������w���Vpc��[oiРA2d���f[�}ܛ�O���۷�:p��������]Bq
ྗ����'jҤIjڴ�֮]�cSwC�
T�BW���ڷo�	&�~ЅT�xq5m�T&LP�ڵ%�=��_��E��gϞ�}�-�^�ziҤI
�g�}�nݺ�`���u�$�D�ڱcG��p����6oެ�� }����Q�4{�l-]�4Mہ���M_~���9"I���Q�v���o;{��%�w�����թS'WG�;˗/�����c��,���+00P�no}�˗/��Wɒ%�q�F�?^���?U�lY�]�6'��5
6̲Mhhh���vVHH�mn���zJ�;w���W�Ρl��׀�"""ԳgO;vL}�j���We��
ng�X�d��J�~��� �
u��)���5k�y]�V-�e��8�/��B�|�1�ҥ��V��z��:�3���5u�T�7N���WXX��T���X�C(�y�=[�b}��eg�;!�v7o�Իᆱ�;�|�򒤗_~Ycǎ������啣����ĉ�ի���߯���k�ȑ*X���c���秐�W������:���K�S�M{3g�͙3����?������݂t��eu��ն�[�nZ�t�,X�!C��0��1F_|񅂂�T�Z5���2R�
*�B�
���-\ ��_��iӦ�^�SO=�v���O>э7Ҵkذ�6l�[�ni������S�-��{��ʕ+��������۫q��z��5c�%$$���ɓ2d����ԲeKM�<Y7o�t����f&��_��e˖��'�Tٲem�˕+��
jٲe�~���Y /;s挞}�Y���9r�v��Ma
��.**J�X,���PTT�]=��bqjzHg�s��x�]�W��Ҽ�̹�8%44T���
�$U�XQ���Z�p�$�jժ�6�t��
���OK�.եK�������H������Kw��?�X?��������kתo߾�����IHHРA��ٻ����ODp�DK=b�`�I�J�S8O8@�8uL=J~AM�IjJ��
PTL+,25'4�v�������9䄄�?��}�n@Pp;�׵��׽���k��:{�^��l�2N�<���IOO'22��cǒ��c�����INN&33��/�f����J�*=�o�����Z�li�O˖-���`Æ
%���ȃ*""N�:Ů]��>}:vvv�NKDDDDDC��������X�b��3z4t����)������H�:sJjj*���۷��/_Α#G�Y�&����ڵ���jԨAZZ����V;v�`����ڵ���HjԨ�ɓ'���6�DGGs��A��݉��e������ѤI��������v�ڬ]���;w��-[�<?�(���(9�ܹ�
X�cl3ƈ�<���y��W	$00����)N��X�6�~���撛�{��+������SO1~�x��+""""""{ �S5j�綑��#$$������$88�͛7[�=i�$Z�l���������q�FBCCqss��֖�u�2m�4,�

�V�Z�)S����R܊���Ç��4��S��Y��ȣn�ʕ���s��!�m��{g�������Xjj*?��#ժUcѢET�R�������C�o�!$$�2eʰv�Z�%�EDDDDD�c���"�Y?�̙����ׯ`ƌf���8qOOO�~�{�9N�<i1�����v�&M8~����رc�����lb�4--͢_WWW�w'''�<����-_t��(���q��
*X�cl������ogϞ�O�>���ҷo_���G�֭���������GG�%00�􂑋���y������s;��@�޽y�'�����ՕI�&q�ʕ|�Z�l����\�r���Ϭ��܎=J�f�(W�����=�7_����ޞʕ+ӵkW~����_����z��dgg����M���M�FE�/�IKK��ח��/^L�����7����(6l���O<�}��5�8'""""""�Ϫ3�ܫ��BJ�.�gl�R�;�;M��x;;;��L���h���s42�ݏ�ED�%>>www������oY�h�ʕ�vZ"""""r%&&������NVV�N�"66�f͚�9S�8::�m/[�ooo>��3Ξ=���9r��g���z��E7n�0-7m\������ܸq���駟���0��s7��Z��W^y�ݻws��u���O���iժ?��C�y���Ѷm[N�>��_�gLBB�O��m۶����w_�^�J�����?=z4���z����{�G@@?��3��ٜ={���8����ꫯ�ܟ������ܙU�S������c0X�`M�6��e�F��ݻ׬㶋���)))f�{���o����xܺu���$99���^%ǪU�p��E�~�m��G�ŋ�k׮���+�߿��_~��i������}v��yz����˗7n����v��v�b�Сdee���Kzz��q������P�O>����~c���ܸq�#F��o������۩W�{��a�����_��S�NѠA�l�-Z���͍��t������?�������ŋ̛7�r6lo��������bǎԫW���L�y�s	 """�QQQ:������_���Tڴi�������MRR���8p���/��qW�������H��6s�q�Lww�<�oծ];BCCIII!;;����}�]ڴicq�̙3IMM%;;�={��(t���Ӿ}{BBB8t�7n��ܹs|��xyy1bĈb:ۻW��}�Y����3�cDD7n�q�Ƭ_��/����K�R�bEk�%"""""V����3g�LXX�����ooo>��c�|�M.^��G}T`?IIIL�:��'���kڷd����/�����ŋ�S�vvv�iӆ+V�駟Z�t�R
d�n�6����ɓqww��ɉ�5k�S.���|��Ԯ];;;Z�jŒ%Kؽ{w����ٓ*U���7�p��)�}gΜ�믿�r�����(��2{�lV�^M͚5Y�z���EQ�~}6o�L�-(S�
6���?�}��\�x�tDDDDDD��<�)~~~ԪU�'N���7�<y�Z�j`qL�*U���ۛaÆq��)6lH߾}M1���ԩS���H�-�ԩ�~�)�7�$N�H��c�V��\�ؖW!������ի�5�N�:���Mjj*>>>�NKDDDDD�ȸ��o���~�L6lȷ��/ҿ����ԩ���(�M�60j�(�c��������~3k�p��֭��Ɔ��4h666���s�…|�j۶�E���b4r�H��^x��g��@�2e<x0���,[��l_tt4ׯ_g�888�s_6n�HHHeʔa͚5<���X�)S�X,�T�T)�z�-�|EDDDDD��<0�)0۾U�
����O�>8;;ckk���3���g�ҥ899YF�֭)]�4���<�%K�`ooo�)_�<��������₭�-NNN�k׎�K�>��%�N�:Q�lY-�ILL�|��Z�BD	;v��ӓU�VK\\ժU�vZ"""""ben.�lccc�iԨps�������z��b�
lmm�������Y�V�X�_�E�v�U��پڵkӶm[���/V�\�oO?��E���b���j�V�lYnܸq��
@dd�Y��K���ߗ�~��~��q��
>��#Z�hq�
�W�@���8t��=�/""""""�J[k��m���X�"AAA���+��1��ɉ���3~���C���-��y[�˕+���/�8q�4��'ػw/Ç7=dyeff2e�����ܹ3�1...�NKDDDDD�.]���O>����8*T���_~I�ʕ-b�\��|����K�lٲ���������bt�\w�aÆ�jՊ�;w���H�6m0���������a�������A���-4 IDAT�9�<#F�`Ȑ!��7���
���UDDDDDD���fN�����G��Չ��1�������������Ƚ14k֌��p���ꫯT�""""""fʕ+���Innn���f���y��7���!::��
8Fa<�?�P����d~���B��M.���S�5��:�}��ѪU+�ϟ_,y�w����O*U�T,㈈������8����ȴiӈ��'==���t���6m�i�_�����y��y��^�:)))�򦜈����<z�ի���_��233�ׯL�>�|c�������e˖0hР3�/�����>}�P�R%���233����|������,�n�˼y�X�b5j���>��ήX����lOJJ�n�$)��SA͚5cԨQ̝;��s�2z�h�6mj�DD�,55�-Z0w�\���شi�k׶vZ"""""�z�W�9s&������ⰱ��K�.f�&L %%�=z0y���h߾=�RSS����N�:ܸq���h�x��5j�~�i�3��k.%��ё��2g�Ξ=K�~�,�����y�f�z�-���Y�f
իW/���͛g�v��
fϞ
@Ϟ=�m,��+N1k�au���̛7�y��Y��""�3>�������{�������EDDDDDF�EŊٹs'���
���dff�e��ΠA�(]�4����c���裏���`���w��1r�Hʔ)CTT����>}���6o�L�~��`Æ
�<y///����}�x��8y�$7n,�%����9s�%}���رc��ۗ7n�`�����5焄���ˡC����"%%�W_}�;v�����bODDDDDD��y���?��M�6����L�>���D�y�k�%"""""��5k���#�}�-Z���ё:NVV��ϧI�&�c������B��山���c��3ϰh�"lllx��w�^�:�ʕ��_����L�4	��K�0z��B�o�=�xܝ%�������?�իWiܸ1-Z���)�}���9{�,Ç���w��$..��7ҠAʔ)���'�ׯ�z��|��Z[DDDDD��8EDD���,X��&M������`୷�����ک������C�K�.�ݻ����~�i���X�"/��26l`�ȑf�k��`۶mt�ܙJ�*aooO����1c[�l����?�����x�V�j���N|}}�T�_~�%��g��RҌ���5k�QQ�˺u�J4�޽{�u�V���(]�4u��e�ĉ�߿�ƍ���""""""����N@DD��ѣ�}�v����<y2vvv�NKDDDDDRnnnDDD*�…w5F�6mhӦM��+U�ĵk׊�gٲe-���ͽ�\��_~�:nȐ!2�c�����/w���;����?���=�#""""""�sߊS���s���G��ի�vR"""?~<�j�b���4m���)�������������H1*�e}jժE�޽Kzy���;�u��ᕞ�Ϋ������9r$�A�)"""""""""""""���9�u�ִnݺ�����ʕ+=z4U�V%11�^x��)�������������H	)����XP�È�c��ח��k�!��̙3�9��?��7�x�Y�fQ�lYk�%"""""""""""""%�ċS������P"�R���o�ڵ�9GGG6m�D����������<Frss���������c�����~
%"��/����)�]�p�cƌ!::�!C���������������g���:������+����[;%�Ϭ^�r���t�B�J�شiǏ�[�n8;;���`������`0��>̳�>[`LI9y�$���$%%q��)���xꩧh۶-����/3�|���HJJ��ۛ>}��Xn"b}�/_f„	|�����ۗ�>��*U�X;-������ШQ#�mwww��t'���?ٶm�})D��/��°aøz���-++�Çs��a֭[GDD���=���ٳ���j�*rss�۷/nnn4i��ک�H	ضm���:�/_fժUZ�MDDDD���׭���cg�����Z;
�"+e��+N1n?�Y!ʶm��SR�͛�իWiѢ���$%%�c�>��c�ׯOzz:.,�<
�ڵkL�2�^�z���B�5�ѣ�'O�ڵk�NOD�ѵk�7n:t�q�Ƥ���0EDDDD�ԢE�}+�ݻ7-Z��v""""""Ef��S�K��*<<���p��X�`�Uf'y����0s�L*U�@�ҥy��

�G��رÚ)�����̙3�����ֿV�XATT�F��bv"R\v�ލ��?���DFF���g�DDDDD���3�1c�X;
y�X}Y��0��ܹ�Y�f�q�F���iݺ5cƌ�Z�jf�/_&<<�͛7s��9�U�F��|�򦸜����ٰa���������J׮]�֭������&��[�i
���ؕ+WFJJ
eʔᥗ^b�ر8::�b�T���ӧ9{���8ŨV�Zy�ddd�ƍ��?�V��;wf�С����u��>��������a�ر\�|��+WҼys�e��W����+W�dРAT�P��~E������ә3g�۷gÆ
<����NKDDDDDJЀ����v"�-___bbb��������H�X�8�X@��/����K�ڵY�f
����������C�ٳg�n�:233IHH`�޽DGG�����+W2dG�1w��)bccINN&22��e��p�B�/_n��~�:���g���\�z��9%��Çs��E��Y����BBBL1C�e�̙ҽ{wZ�n���;vvvy摕�ň#8x��8�Ajj*.�T�RE����OLL�5"00�o�����Z�li߲eK���ٰa={�,�Z�ȃi߾}���������1b666�NKDDDDD�;;;�q\�
��y�������5Yu���T����ܾݎ;�?>͛7��f��ɜ<y���h��0˗/�ȑ#ԬY�3fРA<Ȕ)SHKKc�ҥ�صk�7������$$$0k�,V�Z�珽�fI�]Q�0�]�6ӦM��'�$""���H�l�bV�ҽ{wʕ+ǢE�X�l˖-���OOOڷoO�n��f8�����������+G�%44���d���M��%�Vaaa���R�n],X`*�ٹs'
4�8�ضs�N��<d���	

e�̙�hт}�����j�DDDDD�>�ݻ7�{��v"��/����)������ܕ����O��(�5�s�v�&M�e˖������a*�زe�)�=$$������$88�͛7�b�E111���q��z��` >>��έ(yQ�V-ʔ)c*��t�E\ǎ��/���Oy�7���"55�9s������a�ݸq#������akkKݺu�6m			wkd,Lqrr⣏>2�`p��a�f����ԩc#"����/0k�,fϞ�֭[U�""""""""""""""���)ƙG��̙Ü9sL�3f�`ƌ���$���f�5i���Ǐ��N�8����Y�s�=�ɓ'Mmcǎe���$%%�����ŋ	�����>���at�x�E999��ѠA4h���?YYY,]����p�{�=�<v�>>>y����f�^�X#��K�/_�…<���}�ϟ�B�
�ی1"�`���!,,�)S�����O?�D�����������<�Μ9C�.]�T��6m���t��
gg�<_|y>|�g�}��;..���$��s�>}����DDDDDD�fՙS��ti�Zc�F�Rw>���<:v��7�|�ԩS���$33�E�ѥK֬YS<I"#;;;�w��mڴ��ˋ3g�X쳷������ 77��|�\�rW�F�B���\�,Yb��xy�c[^�)"�_���m�”)Sرc�
SDDDDD$_�͔��2Ώ���y.%m����…�8q"&L`���ݻ�>g(""""""�*����Á�&,�iӦ��V)))f�{���o����F�?���...f�NNN�����������ҥK�����95��hР@��3G�̋A��[���?���wk4~�xؾ};4�Z�*/^�8��f��Onn.,��Ã�W����Lpp�E�������ȭ�����f۶m��׮]cʔ)���jԨA�=�<y2׮]��Y������ȣ�j3���Laޢ�9s&���dgg�g�BCC�ԩ�)�]�v������Bvv6)))�����G��v튗��}�<��3���泘��8ۇq��%���߿?������{������ŕ+Wؾ};'N�}���c��CBB8t�7n��ܹs|��xyy1bĈ���Հ�W��/6���5����f�)lE�`G�套^b���L�0�ݻw[,S&"""""b���e�,_����p���X�r%,�X�YQQQ�9s�~������ϙ3g����bf""""""����wS�R�J�����6lH߾}M�~~~l޼�cǎ`[�V-�6???BCC�5k�f�2�mڴi�yT�\����ӣG\\\X�n�ELQ�(����3h� >��SV�ZŪU�,bj׮͘1cL���lݺ���h���q��*�V���3d�v��ž}����U�Vl۶���T��i��wS�#"%+""������SO�k�.=<����ӧY�h;w��ʕ+ԩS���ӥK��˗/��͛9w�ժU�C�R�|yS��7�ʕ+	#%%�2e���K/1v�X��K9����a���ӱ����Օ�]�ҭ[7��n�n0L���Ù0annn,Y��,�Vy�������ˬ\���͛���l��^����hРAT�P�h7BDDDDDD���)0��KXX�[��t��8;;3x�`�,Y����)�B�
DEEѧO��������ٙ����t�R���L�=z�`�ԩԯ_{{{���quu��ߟ�ӧ�DŽ	�Y�&���dee�S�<���7�d�…�k׎'�x�R�Jaoo���#G���O?�r�ʦ�������/...������D�v�X�t���%E�����ݻw�7{J�N�([�,���񉉉�/_��_~������'N�ꫯH`` ?���
SDDDDD�P�K���7_�1,]�77�<�p.n�ϟ��Ϗ����?�����l��Ҙ:u���EW�\aȐ!�X��ӧO���ͩS����e�СdddX�=|�p��������ŋ�Y��lY���'�p��1�_�NFF����w�!&&�P����q��e�"��<�|��dddвeK�}-[�$##�
6)��Ym攄���M�6��+�*.((����;������S`��N:v�Hǎ�)J�=�ɯ���oo�������Ǐg�����Wn�����˕+���/�8q��5k7��w�^�Nٲe}"Rr���3fժUc���j���)������C�nf�-N˖-��ٳ4lؐw�y�jժ�����k������9r�5k�dƌ4hЀ�2e����X�t)�F�2�v��L�6�'�|���"##ٲe!!!�]����Eׯ_'!!�Y�f�j�*`6KJ^�V�֭Kdd�ًX�u���s�N4h`ѯ�m�Ν��ٳH9���������j3����Ϗ�ի��!������A"r��9s��={2x�`�޽{U�""""""w�X�ҨQ�<�Kڎ;�8q"�jբlٲ���`0����Mq[�l $$������4�t�y�f������U�eʔa��\�tɴ�NLLqqq\�p�^�za0���/T�,raJQ�;/�n�ܮN�:f1"""""""wK�)R��6m��񤧧���N||<ӦM�����<�֮]K�ƍ���ٴi����lF"""""rW������2a̙3///֯_��3L1%��ɓ.M7gu���4k���������q�朜S�رc)S�III������ۗ��H233�����
{�y9�<ps���ی1"""""""wK�)R�5kƨQ��;w.s��e���4m���i�<�Ο?���ٳ'���)))t���i�������3�{:��b�����8Nǎ��o�:u*���dff�h�"�t�š5k
5~~����暾geeY쿗�6[���cBc۽^W���8�`0��<<|}}�7o��ͣ���NG���_����֭[��o��OLo��������-��@xx8���,X@ӦMM�vJ��ΓO>	@ZZZ�q5j�`�޽f��m�����	"""X�|9~~~\�t�������Xr��US[^�V���KժU�x��>c�1FDDDDDD�n=�)""ro.]��СCy��Wy��ٿ?�����GHjj*p�8%��U�V̝;�S�N���iZb�{�v��JJJ
��٤�����ЦM�"�ݵkW����������g����
�{֕cǎݱ�ʕ+��_p��5�9¬Y���۸�ѣG-�5���rA"""""""�*m�DD�dm޼����]�ƚ5k�ѣ��S�GЃP��믳q�FRRRx��W�
6����Ϗ͛7s��1��jժe�V~~~���2k�,��[�7�\�2�ϟ�G�����nݺ|�l׮k׮�>�>�e˖q�=��nժ۶m#55�bf�=��b�[i��G�իW=z4/��͚5c���*L�s{1ʁ̶U�Eǎ�P�vvv4hЀٳgӥKS\�
����O�>8;;ckk���3���g�ҥw��i�=�:u*������{{{\]]�g��馸	&P�fMlmm���*��q��ѫW/*V����=-[�dʔ)w}�y�ݩS'ʖ-Kbb�E�����/_��_~���CDDDDDD�V�m�իW߯�D��z�jz��m�4;v��ߟ.K�~���������<�̶7m�d�<jԨAhh��*V�HPPAAA��B�������S`;v�cǎ���ёI�&1iҤ;����\�r�����'�Y�&'N�`�޽>��e�د������ȝܷ�>}�ܯ�DD[���L�2���0:w�������������_�5111�b���\\\8p����GA��������[�È�<�~~~?~���p�b�DDDDDD,xyy�H���>"w���ȴi�x��74h���̟?+g'""""""��/Nٱc���/�aD�1кukƌc�48YYYL�>�9s�Ю];�]������H�f�5js��`���4m���Y������ȣ�ċS�;��ի�ݻwI%"��իWcggg�48�����Ϗ��4�ϟψ#����vZ""""""��'.̀,""""""%�ċS������P"�0`��Sx�dgg3g��O����?Ͼ}�puu�vZ""""""""""""""�[q��������_�}��1s�LƏO�R�����������������H���L��DNNs��5����?2a����������������푚9���x0�.���#))	ooo���c�D�a�믿���Orr2o��6AAA�.�H�'\DDDDD"�W��[�n�NC䱳z�jz��m�4DDDDDD�Lټ����…Y�j������777�4ib��D����˒%K�8q"���#99OOOk�%"""""���ׯ��)4���k׮1e�z�ꅋ�=z�`��ɬ^�GGG+g("��G�2l�0�l�BPPo��6����NKDDDDDs111���X;
y�<0�)�<�"**�3g�Я_?S[���Y�bQQQ�5ʊىȃ*""������SO��Ӽysk�$"""""����ٱc���yl�nݚ1c�X;
�"y`�S�����,Z���;wr���ԩ���ҥK��]�|���p6o�̹s�V�:t 00���˛�rrrgÆ
���cgg���+]�lN' IDATv�XC9##���6n���A�j��ܹ3C�5�����ˬ\���͛���lj�^�:^^^�\��A�Q�B�b�J"�KOOgذa|��7�?�3f���`�DDDDDDLv����ի�ݻ��Sy�^�;;;k�!"""""RdEq��������ٳ����4�N�ʍ7x���<�ʕ+2�#G���N�:Ell,���DFFR�lY.\����Mqׯ_g����߿��W�2`����1b4Ŧ��Ijj*.�T�R|��dddвeK��Z�lIrr26l�gϞ�puD�Q�r�JF�M�ʕٶm�[��vJ""""""y���>"V`|F)"""""�)e�
cٲe�={��
�v�Z�o�N���������˗s��j֬Idd$�v�"""�5j����ҥKM�k׮`���ڵ��۷3i�$V�Ze�����������ݻ����I�&$''o�ݹs'
4����f���י3g�ի�����ۗ}���0EDDDDDDDDDDDDDV+N���2��n\�x�ĉԪU��e���`���?�w�-[����vvvxzz��͛M��Tbbb����…�����`Vp�q�FBCCqss��֖�u�2m�4L���v���թS�,FDOk׮�q��6m�ĢE�(W����)6Ų>'O���g�-�q'N����Ӭ���3�`�رL�>���$���X�x1������`�;v�>>>y����f�~��y*T�`gl3ƈ���…�3���h�BXXNNN�NKDDDDD䞝9s�.]�P�R%6m������֭���f/�<�/F�}[�l!>>�p���ׯO��ڵk��zJ��Ç��<� ��oA��1����7���#))	ooo���c�|DDDDDD6V+N��eA?4mll�u윜���;����֭[���/ٷo�-"::�ѣGӳgOrss�ʕ+y�*e9A�����MD|�ׯg�С�����W_���)���������T5jd����n���"##�I�&�ߛ�������Bdd$S�N�]�v%��?��O�m�f���={��p�BV�ZEnn.}����͍&M�X;5���Ֆ�)�'�|0���0jԨ�޽{�ڍ�...f�NNN�����������ҥK����b�Ǭ[���`�INN6�V�Z��/Z�fl3ƈȣ�ҥK:�.]�жm[RSSU�""""""����S��������{���y��ٰa�w�&>>�\��[o����K4�m۶�h�R8׮]cʔ)���jԨA�=�<y2׮]�vz""""""���8�U�V̝;�S�N���ɜ9s���{��g|�%44������III��w��M�6�خ]�����g�}FFF�<�nnn��ٙ�ڷo�|Pq��!nܸ��s������bĈ�X㴫G�����V�S��ȃk���xxx�n�:>��3bbb�R����)^^^�������ˋ�+W�`��̹�;v���H�*UX�t)���U�T��֖5j��o0b�nܸ��E�����QQQ�9s�~������ϙ3g����bf""""""�-�S���:7n$%%�W_}�l߰a��=��Ϗ͛7s��1�ժUˬ��Ϗ��Pf͚ŬY��b�6mj�����֭[IIIa�fq�7δݪU+�m�Fjj�Y𿷆n-��G�q:�ҽ{w/^�������*c�Jxx8&L��͍%K�7GEDD�q�F����U�F�Ν:t(���f�|��w�^��C����I�j�h׮�F��lٲ��s����G�m�6�]�F���kݺu4(��n}��%77���뛵6o㹯\����0RRR(S�/��cǎ���Ѭ��֥��n������(��w�rrrgÆ
���cgg���+]�v�[�n��/_��ʕ+i޼��?իW7^
4�
*�uy�=0�)��[�jU���X�p!�v�"33�z�����ϋ/���q*T **����lݺ�s��Q�jU^|�E�
����)�G��.]���8�9��O?M�6m���3ŕ/_���H>���l�™3g(W�M�6eĈԫW�۩S'>��<x�Yn����/_��_~���JD��=����={��˗[�������<*��u~��|}}�]�6k֬!55��܈���8.,,�˗/��🕕ň#8x�)&==���HRSSY�p!�Jݜx���DDD��w��)V�\ɥK��׿��,0�ĉ�����s��U�|�K�g��K�r�2d�Y[Q�6>|�i����L֬YCNN!!!��mt�u+�(־Gws�o�^.4��p��u�������z�*��o�%##��-[Z�ѲeK���ٰa={�,��y�=0�)wR�F
BCC�ɫ��bŊt�1|||���c����Ǐg���ƕ+W___"""8q�5k��ĉ�ݻ��Ç��+"b}���L�2���0:w�̖-[L��������<ʌ3ź���}��u�i��"::�����Npp0���=z���P������7�l�b�
&M��k�����
���g���$&&����O9q�O?�4��nnn�߿��S�Z�s��9�"��+J�F�k�fڴi<��DDDɖ-[		1�%%��]�_��^��e�%kߣ��ַ_��k��[j��$$$0k�,V�Ze*Nٹs'
4���ضs�N�������B�;�Ƚ���z����Ę�bbbpqq�,
"� ��@�f�'<<����J�)"""""��0�4j�(���
8�l��7������ԭ[�iӦ���`�ݾ};?��
6�o���?d���\�r��u�V���iԨvvv4mڔ�����E>������鼋��QPP�jբL�2�b�K�.j�ۯ[a�Eq��=��k}��2�,C\\.\�W�^���Mq�nݮN�:f1""""""R��f攇���#ӦM��7�dРA���3�|������ׯ��;����������+�G��3o̙3�9s昶g̘��3�@��7:v�@�3ۦ�����={�q�����?[���暾?~���{��8ggg�?Nzz:u���3���\�^�J����*o#WWW�w��Ӆ-�����Z䧠�o��־Gws�o�^cǎe���$%%�����ŋ	�����y��灛K����f����8�>h֬�F�b�ܹ�=��M�Z9+).)))���s��a���x�7����vZ""""""�[g��;R�:�Ɯ9s���y��i۶-���4jԈ>}�����}�.m�X��Ã�Ǐ���[�r�^�u5jDDD���E�������!o�n�����n���׫cǎx{{�u�V���K���ǢE����f��Ѧez���T)�ɧ�m��/"""""R8*N�O|}}�v"R�����3gӧO��g߾}ԫW��i�������w���~����@���Y�t)�v����M�6%<<�P����p��Q֭[���K��IIIDFFR�re�9bڟ��M�ҥy��9r�?��-[�4�7.9t�Ν;���@LL]�t�J�*f�srrX�d	������7-T��KBa�Eq��=*�k��䄏�>>><x���e˖f*N�Z�*�N���ŋT�Z��/�bDDDDDD��,�ED�:D�֭�1c3g�d۶m*L�ǚ�����=���h߾=!!!:t�7np��9>��C���1b��1�v�"++�C�1y�dS��K�x�W

姟~";;�0s�L��^x��6m�����?6l����\�~�0v�X���hժ�z������8#�q�¸ӵ(־G�q��v튗��}�<��3����3�<��=zԢc�1FDDDDDD
��SDD� ''����L�F����iذ������(N�g�֭���0p�@�}�7δݮ];�:u*S�N���СC�lْ���w�q��aM�;u�g��Y�9r$���+����۷oό3̖s)JޅU�reΟ?O�=pqqaݺu���Zkߣ��~~~���2k�,f͚e��֥�[�jŶm�HMM�X���w�6m�8�������h��B���_i߾=o���&Mb׮]*L���^�r����(_�<��������₭�-NNN�k׎�K���R1q�D:v숣�#���4jԈw�}�Tܰj�*���	�W�^T�\{{{^~�eBBB�̡J�*,_��7�|�F�Q�lYʕ+Nj/�ȢE�x�ppp��k„	ԬY[[[���
�-�(־G�q�{��ԩS�_�>��������ꊿ�?ӧO7�u�ԉ�e˒��h�Gbb"�˗��_.�5y�����g����0c��m�{���KLL��+��{q��iv��aZS�v���,Y���'R�^=�-[����=�+"""""�0���Wq�y�-Y�������j֬	��'�֭Çg�С�5��(""""")C�/�Ӻuk���JzyԪU���q��[�&--������z�l��ΐ!CزeAAA�������{"""""""������믿&&&��� �f!����ŲB""""""�?-�#"����_�����k
�l�27n��Ύ;�9s�
SDDDDDDD#���L�6���x���IOO'>>�iӦY,�$""""""�+�Sv�ءe}D�Xܺ�Oq���9s&�-�q�ƴk׎��H:w�L`` 			���̜9GG�bWDDDDDDD͚5cԨQ̝;�ѣGӴiS+g%"""""�p)������5��<����-==��{w^ӵ�q�iBi
M���TL�������j��:���[��-RT+�J�V�ƚ��M"�j��PR��D����oN&�d��z�<�^{����lIO����s�μ��;|��>�����cǎ�s�N5j��������//��CDDDDD$�Ҳ>"��IJJ�G�<���,\��h���pqq!88��~�M�)""""""""""""""�@�)"��7n!!!�Z�
ggg����	???�l�B```.F("""""""""""""�xh�d��˗���CHH���xyy�d�BCC���ض�y���2Vb:q��+W�y\r���P�~}�v횥�D�M�61e�,X@͚5S�oԨ~�!Æ
�E����_.D)"""""""""""""��3�)>>>:t�ؾr�J.F��>��#v�ܙ�D�Ç���˪U�0�Lt��
77�4oȋ<	Ο?O�^��޽;H��G}ĬY�hݺ51B�����a��c�d2�v"�    ��y"yyy�v""""""6�3�)aaa̟?�:u�p��]Ə�#��JBHv͵s��,7>>�1c�йsg\]]�ԩ>>>�^�''�,�/��ܽ{��ݻS�xq���+�}7o�d׮]l۶�;vp��a�_��-�DDr�� ����?���a��#�>�cǎ����lٲ�����������-s��]�������-��h���\�|��ݻm=z�`Ŋ,^��!C��bt"ߘ1c8t���ޞm۶�m�6�o�NHHIIIT�V��͛���C�&M(Z�hn�-"��.]��v"�ILLTr����������d�G&9%#����u���X��ǢE�زe��7%J���^���YJp=z4�6mb�ĉ�i��h߸q#>>>���L�:5U����c�…l޼��/���@Ŋ�С���Q��M>ޚ�����\���u����b��,YV�\I�^�(R�H��_$/Y�v-S�N�|���s��m*U�D�f��h֬��ϋ�������mΜ9Z�G$yyy����a�������$O$�dVBB�&22�h�x�"~~~DDD���K�|�25�ȑ#9|�0ӧO�v�ڔ,Y���h�N�����F�Js���/˖-3�	'<<�[�n����1��i�&������L5���'!!!l޼�7�|3S�.���={�H޺w��ʕ�o߾4k֌2e��rt""�#   �""b2�r;�cts\$w�}�������Uy"9��*))-_����H���5j+V$**�ɓ'BPPP�k$'�\�V,E�a„	2��cDz`�ƍǭ[��>}:���i�_�f
s����Ã��D֯_�ԩSY�j���鞯5c���@ժUS�ܶw�^%��a�ڵ|��W4k֌J�*�v8""9*000�C�<&  @����������H�˵��@R�ے��Җ-[�<y2�J��B�
�?��;�~��4�S�U�n]�I���~���pz���/��r��M���9s�M�6�s��t���dzv�'(W�\�9ʗ/o�G�q�����v""M�.]r;�c��""""""""""9.OTNɬ�g�о}�4��>}:�v[b�}�]8@xx8*Tx��C�2a����	f������///
(�-ccbb���]R2�����������d�˗/ӦM�y�~��Ν;Gǎqqqa���9z�'NP�re���*�&���RJ�"nzq�ϟ�r�����M۶m�-�ܒQ��@����_�>]�v}��������H�ɵ䔔�ffٞyк�7o�̶cY�e˖ԯ_�;v�v�Z~��7�͛����y��w3\j�ڱvvv�˗/��6s��@���-����s�}�;w���ϖ�;w�p��IƍG�…iҤIn��#>���/�V��d2ѭ[7��ܨY�fn�&""""""�c]9��Օ��(֭[���k���/�����T�V���H|}}>|x�c���i߾=�۷'22��[��t�Rf͚�ar��c�/Ntt4ׯ_�x���_�n��kbbbpuu%!!GGG.^�H�b����	�J�ήq�eϞ=,]��={�ERR...ԫW��}����vnǝ�G96�']z�)�휲s���?*I+)㈉��/�`���|��erJ||<cƌ�s���gt�:u��LJիW����������HNK]Z�1ҬY3F�����IJJ��ի̞=���<H@@5k���Ϗڵk�b�
<��:���w�}G\\�*U���
����v��D��5�����Ju|s[��""""yA@@			$$$�bŊ\���f^V�q��|��7?~���x8w���=�ڵ�m۶ܸq#���<����Z�l.��Ã�+W0w�\���y�+V��?��cǎ�r49c���\�|��ݻm=z�����,^�8#���NN�ӧ�˗',,��={R�^=Z�jŷ�~K�6lX�����@ll,�Ǐ�`��L�8���z��7n���i�ݻwo�N��+��B�
=z4�k�6�-Z���믿n�؆
�{2)9s[�ƍ�y	EDDD)K�,୷޲�~ԙL��^��ҥK4hЀ
6P�T)f̘�ѣG����Ν;?~�I�&Q�H֯_O���{��C�QDD�\���c��t�ԉ
��+�зo_~���T}���;w.�۷�A�����̛7�HX,�^�~���O�fȐ!4jԈ�͛3e����-�^�z��'Ҽys<==���!..��c����2�֜�٥K�7n���*��ק{��_�>U���XfΜI۶m�_�>�ڵc֬Y���6���_���Ń^֞{ll,+W��nݺ����%K�4���MDDDDDD�̲>9QZ�p������7߰}�v._�L�B��]�6��^���S�N�ҥKL�0�R�JP�T)>��Sƍ�ԩS����S��ԩO=�����9s�2e�иqc#���?��/�$::���ڱ�Z��/�`���ƍ�ݻwS�paZ�h��s�
��믔(Q�y����O?�ѣGs|����o߾�9s�&M���?��3�X�\�2>>>t�ؑƍ�s�N,X�{wK��H^f�\��ɓxyyQ�\9���{"""�ӧnnn�}}}�
+������έ[���WJ<x0���Fߋ/���GDD����˗3�^
4�X����|���ܻw�xP(66�~��q��yc�ƍ�u���`W� IDAT�0�L���0s�L ��G��LL�{��ʕ+F�ӧO3v�X������n޼��o�m|�M@@!!!���Q�`A�8f͚Ell��\b˹oڴ���8<==S����$$$�͛7?p�k���L����T	,)����������Y�n`۶m̘1#���}|��焆�Ҷm[�9ڶmKhh����VL�۷g����۷�}���j�*�{�=�)b�iٲ%k׮�lڴɦ��
��ˋ#G�X|Hp��y�9BϞ=S}� """b��)[�,������ooo��"����=�+���P�t�³�>���#+Vd�ȑ���Mn�ҥ���
2�›�3�-**�:u�P�P!��LVbزe�����ё�E�ҡC:�a'O���Ύ�%K�[���ݻ�,Y��of�uٽ{76l��g�e͚5�S�swwg�ԩ|����r���k��k�\DD�ʕ�N�:����F��S��������3�P�N&L���k�R͓޿��O޾`�*U�����*Ub�����Ǐ�L�28::R�j�t�4�5n��f������ٚ5k��K��߿�]�v1r�HV�Ze�[�|9���������f͚����χ �J�i)W�k֬a�޽�����۷����[Ο?O�2eX�t)���g�…�:u*��(�q�֭K�V�ؼy3���0�������]�r�jժ�f�v���o������oٲe�9s�ҥK������Y�h�J�����iV��P�{��e�ĉ6��޽{�Z�j�}�6sy|���M�޽)Y�$���F���?������3#�G��ݻ�Q�_�5��			Ɠ�u��I�,��899Yl/]�������w�q��9s�ӦM�W^I�ۤ�$�ƾ�2���˗/')))����ǡC�����P�BY���4kݺ5 11�k׮DÆ
9x�`�q���ѤI.]���?��f����s��%�4i���`�u1�V��X�b�6p9�ݻw���盙G���<x�&M�p��U�̙ó�>k�שS�����������_�ΡC�?~<�j��ҥK��'N�w�����ܽ{�ӧO��[o�y�f�w�΄	8w����?~�~��Y܌ͭ�ED�ʜ�b��r��Ќ��?������?t�ܙ��P���-[�0y�d��ܰ���B�
�? S�M��駟I��J.7n�0��ر�Q�FQ�zu�]�6����m:���=�j���/�L�(c��ٳ�O>���e�R�`AF�Mhh(?���Ϝ`3z�hjԨ���/���F�`۶m�b�ٳ'����:�'N��}R*_��Ey|)9�1������	

��ŋ\�x��� ƏO�r;<y���йsgbcc6l�N�">>����ӿ�����ŋ�L&S��ɓ'�����?���A��������?HHH`׮]���>|�iӦ��m�ƍDGGS�jU�M�z�pss��ŋ���r��)��ù~��Q6?��0���{�?���������/���۷���2�e�,Z�(��
���2w]�7�RV�KO���iԨ��M�̞of��ʵ0۵k͛7�֭[�]���
��
Fll,�ԩS$$$��۩V���'&L�굲֗_~��ŋ�v��.]�]�v�L&z��ƍ���#66��g�ҪU+�̙c1Gn�-"�Y�J �Ē�ӧ���ƍ�4i�E���C��?~������K�n��������={�_I6yő�;����փ��T�bE�{ggg�ݻg��;w�5jX��U��Uql۶�ʕ+���k���f[�…����2b����K/��y���I$f��{LL�E�_3s���������<�����S�C�aƌ̘1�w�}�ڵk�vX"""�ꫯ�|�2�F�b֬Y���(P������_��r��u�����	f�ر��'w����},�Ν;t�֍���S�|yhܸ1+V�O�\^�W�^�����'��・�;��Δ.]:K���J#�gϦ\�r888аaC,X��2���7ߤX�blذ���h�}�/_���hѢt����u����.����of��ʵذa�[�&>>�իWӼys�����+p�F�/����NNN4mڔ��@֮]��*___�����O?�����\��N߾})\�0eʔa�������z�""K˖-ٰacǎ套^���̛7�6m����L&S��ز����Z��[��z�)��wvvf̘1$&&2e��%�R#=��?��謑<�&��	����9�|�Rin�j�""""""��Sr�c��ˋ�3g2s�Lz���ለ��#̼��{w�~s%�͛7�;����ѣw�ޥU�VL�2�b�/����!CR����d2��X����?�[�;;;���Y�^����#((���'ݸ�4i��-3�����;��4h��+Wҍ�W)y뭷�{�.K�.�ط|�r�ٳ�Q�.3�%>>�…g��l9��ě�k��w�ѱcG�ܹ÷�~�믿��O�2ehӦ
������_ƾ�իc2���ȳK�ƍ-��K4F�Y�
�����ED2+44�����Nhh(s���v��iV)qvv�}��,Z��e˖ѻwonܸ��Y��>����[�.͊'!!!�,-�O:tȢݼ��5�T�B�^���sɗ
����\M�T�R9rĢݼm>fFl9��ŋ��'�dn3��Ǘ�SDDDD���H�
	;;�T_իW�/��������/�b�
���-��o��,#��+Vp���6mJٲe-��+W�&M�p��V�\���(Y��,y�����������Ϣ=�>���b^z e�Cf�r���7+ע{��$$$`2�Ҽ��F�`�����ٓ�e�R�lY���˚5kHHH�����&[�'�S��K�d~r���HV������N�C�xxx��w�G�J��D���5k��ѣ9~�8III\�z�ٳg���������prZ�֭�<y2���ݻ=z��?�ܦy�~�mJ�.�?��c$���r��%�f̘Att4�o�6�Wz�7�~M�65���ݻ���I�),�z��e�̕ݒ3�=h)"���3*""""���O����o�!00�"E��v�Z�-�����-=�K�l߾=Ò�K�,I���/�"����,mo�jժѰaC�����ݻiܸ1���DDD���/S�F
�of��/�@hh(Ǐ�^�zV��{�n���r���7+��駟�D��<y��r���T���ό'����/�,Y’%K�X�"�7o6*�d��N�TI[�ɍ�ED�–�޽{3y�d�N��ԩS-�%_��O�>�ر���0z��iѯ@�6��.Z�(111t��	WWW֭[g����#��Wu�FϞ=ٺu+'N�`�F{�V��L�H����ƍcРA�^��7�|������˖-[�]�v}͉�p��߶mgϞ�_�~�ʖ-��-��ްaCv��IDDD���F�I���M�SDDDD�B�
p��5L&S�_iU9v�~�!vvv,_��jժexs2ƒDFFr��A�����p��1��f&�얲zJZUS s��|�gӦMV�r��I�/��Wfd&ެ\�]�v��wߑ?~"##S-%e��o�믿������3�����:th��L&S��۷o�gfe6n�ܐ2��ѣ��u�ԉ�c�R�Jqtt�bŊ��Ӈ	&�
.���^^^���boo���3M�6eɒ%7>��cJ�.����C�.����…�ܹ3E���ё-Z0z�h��]�6]�v%))��3g����Y�x1-[��H�"888P�jU�M�F�6m�~E�a���t�����qqq�G�,Y�Ĩ��]�ުU+
,��ݻS�۽{7��E���d""""""��ؙ��5�6>�5ow��%;#"O�իW��兿�?���ƶ�ȓ$��[Y}[W�N:���y�׬w��m�իGXX'Nd̘1�U�G�aϞ=F��1��ӧӫW/�-[�n�^�z�|�rF�a���JZ����<h�����O�R��x�"eʔ���\�xѢ�Hf�KHH��գdɒ�<y�"E�d�ڴi�9��={���f�|3ov\�ٳg3t�P9r�U�V�j��~���_�"E�XTs����޽{ܼy�H�1;z�q�՚k��}��m���}""�����1�ՂX�h?��#�K���t�ؑA��JΕ���QDDDDD����R�lY%��H�u����e	DD$sZ�n
���ݻwS�������[���rXX�:u���'�c4k��E�������˗ ))��˗��{�e8�!C���oӬ��Xr������\�v��ӧs���w�ji��\��_~�-ZM�n݈��K7�s��1c����������L��q->��Z�nMBB�H�(_�<vvv���yzz�9�yY����T���nrZf�y��ݛ�%KZ$P������-��DDDDDD$0e3SL+"b��������a��䊔ﷲ�׹s�LO?��	05o��t�S||�i۶m���MO=������Ƙ�kךS�5L7o�|�1N�<iʟ?�	0���6EGG�nݺeںu��z��&�4n�8��d2�_���<<<���V�Z&��a��
H���%k��hz���	0*T�����S���u1�L�?���T�D	`z���M������ݔ��h���3�����O�nz��L�i�رVǝ��ě]�"::���Ϛ���#G�SժUM�7o6ݼyӔ��h
7�j����t�b1W�L��^0�޽�o:}��iذa�
�|�3�/3q�*�~����%��_�{L2#44�԰aCӅL.\05l���믿�vXy�~EDDDD$�:���)�m}�K_���>|�/'o&����&''�tϛ7Ϣ�:u���ܢE�Lvvvi�kР�)>>�d2�L]�v5�ŋ[��_mLݺu3��:~fb�v��g4��_6�_|1�ym�.f���J�*exm����LL��f&��?��	0=��Ӧ��ϛL&��릪U��O�ҥM����<�HBI��p��L]k[�e&n[)9ED����]���MÇ7
>�����I�y�<��S<$����P"�2��,""9�M�69r�iӦ�e����)X� /��2�|�	-Z�����|�~��Q�R%�L��������B�
x{{��'��?~�]�FPPŋ�{��V�����'�|�ڵk�v��<�L�Ē�HHH���O�������ݝ��p�-[ƚ5k��߸r�
����-[�f͚�����/f�9e&��m۶����ח��{�5k��������6mk׮�?� 11����ӡCF����>k1���{��e„	�޽�[�nQ�V-ƌC۶m8p`��V�L�"""�2///���r;�v&S��سA@@�����)�ED2Ü�b^�:嶈ȓD�D$���XC��<:��("""""yTh�܎@DDDDDDDDDDDDDDDD_mY�GՉ'�\��E����Dž��Z�Mo;�hݺ57n��ٙ�7��蘥9�@����_�>]�v��DDDDDDDDDDDDDDD$3��䔏>���;wf9�$'�ر�7np��
v��A˖-s9���������j�*L&ݺu��͍�5k�vh"""""""�e�s;�'��ի�����0DDDDDDl�D'��ܹ3��$��Tb�ڵkh׮?��AAAODrJ||<cƌ�s�θ��ЩS'|||X�z5NNN��������ȓ�^�zJL�%]�t�^�z������������Z�q��)Z�(#F�`Ϟ=���p��%�{��/G-^��˗/ӽ{w��G��X��ŋ3dȐ\�NDDDDDDD>��>���CDDDDDDD�G&9�A�\�œ9sسg���T�X���z�Q�F�I-qqq,Z��-[���S�D	^{�5���#�d���g&1ƚ��ē\PP�����^��ɉ֭[�r�J���0`@���.]b޼y�ݻ��7oR�|y�z�-ڴi��~��{��=.\��͛�x�"T�X�:бcG����Ʋr�J�֭�����^�dI<<<X�r%�z��H�"��"""""""�����	��0D�X^^^����v""""""6��)�nݢ���;w�h;~�����\BB�&22�h�x�"~~~DDD���K�|�Jܙ��d2��O?��о}{V�\ɺu��߿?vvvF���z��͕+W��ӧO3v�X����9��gK����,[��藘�Hxx8���ܺuooo��mڴ���8<==S���������y�f�|�M�^|��9.�̟��������5y"9��ߟs��Q�T)>��3�V�Jxx8>>>\�|٢���ˉ����ݝQ�FQ�bE����<y2!!!ѱcGBCCX�$yu��l��bm<f�…���Q�R%���pss��ɓ���R�n]��ҥK�r�
ժU��>�D������~����H:���-�Y���s����Abb"�ׯg�ԩ�Z��c��~{���jժ�^Gs�޽{��"""""""�˺t�B�.]r;�'Ώ?���!������d��+!������WF�۷o`���ԨQj׮���O�y�l���ɓqss��ޞ
*0~�x֯_��g��x�����UM1�Сk׮�h߳g�|�	e˖�`���=���P~�����o�����C������?t�ܙ��P�<l�w��	ʕ+��u,_��E��D唨�(jժe�^�v�T}Ϟ=�_
'-�O�����THI�-���Ʋm�6fΜ�̙3S�߾};7oޤp��\�p�ʕ+g���l�w�СL�0���`����?>�����ˋ
��/&&�"E��:����GDDDRK���Hn�|�2mڴ�g��_~�ܹst���yh(�ʸ'N�x�g �ؾ};AAA=z��7oR�J���ѡC�4?��K�z�Ҫ"���H�%�_�>}��T�R�zLk�W�8%[?˳f^�)��=�"��	�~��t��5K󉈈���<�r-9%�n�Ag2�,�Ӻ��OJ7o޴6�laK<7n$!!!�w��a�ƍt����&���l��e˖ԯ_�;v�v�Z~��7�͛����y��w��w��g�1_��}�m��&""�Z�F���0DDDD����z�������}�;w��R�@\\#G�d߾}�aaa�������رciڴi����F			\�p�5kְq�F|}}�Q�F��Iq��a|}}Y�j&��nݺ���F͚5s;4�l�'*��)S�����~���_~�h���R�uuu%**�u�����0�L�-񘗸�3g������۷�>���� #9��㯿�����T�V-ݹ��g�����L���i߾=���lݺ��K�2k�,#���~ŋ'::��ׯS�xq��\�~��#"""""""���S���-e��Ν;�<��ѣٷo...���;4lؐ��~�K�.�f��-[ƈ#��ox���|���A�Q���Ν;������̈#X�f
NNN�zLk��Z����c���xƌC�Ν���:uꄏ��W����y���-Z��3e�&M�D�*U8v�S�LIշY�f,Y��ѣG�駟R�R%�]�������o���`����*&���g�R�l����xN�:űc�x���iРA�s5hЀr��ɩS��T�
6d�ʕ̘1�ɓ'��3�0g�)S�?����ly�:t���9r$mڴ�R�J���_888q[ۯr��DGG�*	ż�Sv��y��ٳoo��CD�UPy���GY�p!.4��Ν�ܹs��{��a���+V�%K����b�+U��d޼y̛7�����b�9/��T�R�������ݛ�'O�n�:-?�E�/����t���h�ѣ+V�`���2$��~y"9��ۛ�7��ҧO����Ӈ;vFϞ=-�(P�aÆ�E�%&&�N�:���ʺu�=vk�Y�v-ݻwOw�;;;�w�δi�

⣏�<� IDAT>�o߾lٲ���0ڵkg��������ݻ7�'Of�ԩL�:բo�ڵm�װaCv��IDD�E;��)�ƍ��ڈ���n.�����&"������,Y��h		aȐ!L�2�-Z��۷�…L�<�Q�F��^>��c���X�`�E��I2)�k��űh�"�l����M�%x���߿?����8��C�z��HLI�[�n�L&�T�����k7o�w)�m��<�ʕ+�5kaaa�ϟ�W_}��C�����k����èQ�صk�Er�֭[Y�z5Ǐ��۔(Q��M�2d�
,��14�V���,\��m۶q��UJ�(����/H�…m�/���b�u���e�ʕԭ[���Xɒ%���`�ʕ��Ջ"E�d:^�GM���,444�?�X�p!�۷�g�ᩧ���͍�'X�qW�pa���������{{{���iڴ)K�,������S�ti���IHHȑ�&���D6l؀��3m۶�p�v��Q�H6l�@bb"ŋg��Ŵlْ"E����@ժU�6mmڴ1�Y�ϖׯS�N�;�*U���舣�#+V�O�>L�0��~�Z��`���޽;�y�޽�…[|@%"""""""���:�+W���P#��͍��P#��رc����7o��/��b����p��iԨ��>k�,bcc�MIKBB�f�ҥ\�p���D.^����C��޽{F���p�C4�)T�o��v�}$��H�nK�f�
"$$�۷os��u���{f͚��X�j֬	��S������3b�BCC�y�&w��%::��+W�zH)���M�͛7y��Y�b�.]2�����沛-�iӦM��ť�����'qqq�τ�������"OTN(V�cǎ�h�x�"%J��hwvvf���><�9[�lI˖-S��R^6eߴ�>(�n�j�񜜜ؾ}�E[�R��<y��Z�����?�Ծ}�l�W�P!���X�h�ϟ�t���?�#G�0hРL=1#"""""""��򩻻{�ۮ����⋄��s��<==�{�.۶m#_�|�ݻ�۷oS�@c��/�l�y@�
���xX�,y����,_����H���5j+V$**�ɓ'BPP;v��ի��9%��H�nK�f�ʕc���<��s,Z�???�o���ѣ�}��Q�X1�]�f��X���#G��cggGxx8�
2@J�֌�Ųe�8s��K�fҤIT�Z���Hƌ��ӧY�dI��夵,U�XĖ�w�^�V��js�޽{y��7�>������ȣ���W^y���;nܸ��{���?���j���%���ݛ�%K���o�������j�!���˗�����W_�ܹsxxxXTO{�.\����~J�&Mhܸ1L��åK��8q"mڴ�^�z�hтQ�F�����G�7$��'N�H�σ��r��蛑��@#	9000�󉈈�dN(�^�z�ۀQ�|��ܸq�:p��m���c1�Y�f��ٳg��)ٲe�'O���
{{{*T�����X�~����� ͊$�)��H�nK�f�~�)e˖%����m7n��r�III<���w۵k�Z�jlذ�ٳg3m�4�~%��delZ�t�=�5j���K/�d,	�m�6�紖-��>�\�r��)_��E��E���ҦM���;�N����gѢE8p`.E&���ɉ�����ҫW/����3g
���DDD��n��`~�bbbx���ᅪ�C�q��!#	���ŋ��ݛ�����a����ٳ�E�Q�R���>b�Ν6?M�(;|�0����Z�
��D�n�pss3�󋈈dE�$��ӧ3}�tc{ҤIL�4	���������͛7�?~��O?��/��«��JDD����W^���|��gϞH����ӧ��]\\8w�/^�B�
i�7�Lܺu�…��Yz瑲ݖ��*V�h|���dO�͕+W����%o6lǎK��d2=p�̎M���x饗,���]�p!�q��ϖ�d~[�H�T��m��������<�Dr��i�
6������s�=G�
�߿�Mkˣ�N�:2�3f���R�v�\�JDD$��	�eѢE����xzz2f����X�l~~~̛7�"9e������������)S���'�&M"""�ٳg���-q��!�s����l9��Ϙ1c�ܹ3���t��	V�^���S.G(""O^z�%��ˆ��aǎԫW��E�R�V-���C\\���ԬY�"��j
<8�!y��5jp��9��ۗnr�ѣG�۷/իWgѢEF�����HHHH���G�v[b7spp0�7ǒ:@�*U���ӧs��1ʔ)C�&M�X�"իW�k׮�/+cm��Up���d�&��.jmn���&"""""�(��)������//��E]o��Ik	���p�Bc{�ܹ̝;��&W�K��9�g�}���~??�T��������)V�p�)��>���;r���w^�x�b._�L��ݍ�=z�b�
/^̐!Cr1:y���r��!���;K�,a�������Ԯ]��=@˖-9r�K�.�֭[4j��F��W_}�͛7S-�Y���DEE�n�:#Q3=����ׯ��ߟ6m��C��ݻǂ0�L�m��HL���KUQ%��&9{NJLL$  ��M�������DgΜ1�߽{�b��26-�J���?��ȑ#ԫW�h?r�@��~�\��ŋ���)^��ž�ׯ}DDDDDD'���EDDD�t��%ƍǫ��J����޽;�ׯ����၇���_����i����	

�T�R��߿��+Z�nm�w˖-�����!d��g͒�xO�>͐!ChԨ͛7gʔ)��ǧ�g�>�v[lݺ���ӴiS�ׯO�v�1cqqq�����1f�^y�Z�l�g�}�իWx���8�ΝK���iР���:���K��vll,+W��nݺK�,���+W�$66��sI)�ҁ-%ؼys�����`$�4l��+V�I�2W�0/�I.�G����$%%q��UfϞ�����{�
P�vm���o�����͛���%11��G�2t�P���iذ!�;w6ƙ�+~��G���9s�L��3Öح��k��;w��СC9u��K��U�V���߿����?�����nN@��k-�ɓ'�ݻw	cʔ)4n�ئ�la�u�\�2QQQ��1���������<.�D�����ɓ'���\�r|���DDDЧO��܌'_���{��ʕ+F��ӧ;v,III�����Ϛ5���X#�������ٲep���O>�Īs���_��ݼ�ƠA���Po߾��Ͻ{�=z��sXk���,Z�Ȣ-::��+Wr��
&N�h�o����޽��p��?r��A������SJHH`��DFFm/^��Ϗ��|}}���6m"..OO�T�xzz��͛y��7�t�"""�$�/^�ڵkJ�ʕ���ʕ��8w�U�T�T���E�C�N�puueݺu��Ӈ;vFϞ=-�(P�aÆY�M�:�w�y����Q�F�:F�f͘4i���+M�6e͚5|��|��i���V��n��^���K�uvvfڴi�5mڔ���3v�XƎ�j�������L�֎�V�޽ٶmgϞ�_�~�ʖ-��-;�r�6l�Ν;���H�����&'iDDDDDDr�*�����<Ƭ�I�t�R�\�B�j�X�f
�v��7��YO�B�
�ݻ�H��u<�/}�������Ė-[�>}:III�O||<_|�d�־�+W�5kְw�^㦄y����/sj�G�'�G��޽{ٷo�QƜ��܉'�?>�����ϏҥKs��y����t��|�r"##qww'  �H͚5			!((��w�^�V��js�����HV�|�q��Q��Z�l	��	o����%}>��cJ�.����QQ�p������八�+���8;;ӴiS�,Y��JE�b�X�l~�!իW�`��*T��͛3o�<����6l�0:w���O?���#����3&S琜��[#��(=����+W��ݻ�b�
�T�b���O>�e˖899���H��ՙ2e��^mժU��ڱ�*R��/�k׮���`oo���=z�`ɒ%8;;�4�-l�N�Z��`��i�7ܽ{7��E�9������Hn�3�L��0  ooo�Ӛ���0"��K�.���ۀ�-"�$I�VZo�&N�HPP�~�)]�v��LJ�72f�:t�`�{��7���b��ż����m@@nnn6�O˭[�1b���0�A����Ν;6���P��ФI�4cK�Lbn[�|�q#���R!!!i�Mk��2�c2�8v�'O��ԩS<x�3g�`gg��-�Ϟ=ۢ
LHHC��B�
�{���ѣ�N�"((�X"	�ܹst�ؑڵk�p�Bڴi��˗ٴiŋ����ի�jՊ�{���9�s�Ǘ-�OD�ɕ��/�=&�u,`ѢE��㏔.]����ӱcG
D������GɣBڲ>]�v}X�y�,�>}�t�O�nlO�4�I�&�.\�X��}���-�m�\�B�1bo��k׮M39��͛>���0>���T�)R�bE�{����ݳ9Vk\�r�aÆq�رT�Һ��Z���K��D��={���ۧ������111��'�S2���������ѻwo~��g������O��	&�����y�xr���^^^9}�;;;��;::fi|J�����O�}gΜaԨQ\�p�Y�f���i��Y��A�O�αc�(S�M�4�bŊT�^=�d��X����=ƃ�Zܼy3���^��ܖӯ�����Xrrrb���|�������� �̙�j�(��A�'��ٳ�9s���aD�	ШQ#>���CD$O

�СC8www�,Y���y���-�|1{��믿8}�4ժU��x֎oٲ%111�Y���e���;����7o�̄	pqqa�ҥ<���6�����GѢE��	6fw��婧��6��ѣԪU����_(S�L��puu%**�u�֥z�R*^�8���\�~=ղ>ׯ_7�������U�N�Œ3x��w�]�v.G%"""""�3R?>��Ξ=��իs�0"�[�z5��0DD򔈈�����N�aÆ̘1���hn߾��������7�x౬ߴiS���Kbbb�w����f���^3�=z\\\���{��)�J"��s2c���$$$p��q|||��7nX�4i$&&�믿���ꫯ�;w�f�=z4Ǐ'))��W�2{�l<<<<x��׼�RTTT�y�m�Y�IDDDD���ˋ�3g2s�Lz���ለ�������b��%"�!oo��AD$ϱ%9�o߾lٲ���0ڵkg�o��<���̾}�غu+[�n��W�fMz��ml���F�J�-�<nhh�cˌ�E�C�N�puueݺuV�mڴ)�ׯg�ر�;6��Ǐ[,MT�Z5���cѧr�����O�>�ر���0z��i��@�6��nذ!��޽�EY�
�r�]r���5CLE+t���59�b�i�I��h���\�23c㠉"���j��<���i31SZE����e�< �z\W�2�����k�����lݺ����'qM?�>�h��ODDDDDDDDDD�^7�s�����Ԏ��(�x]^ӦM���'((�ƍӠAڷoϼy��߿�5�U��=<<X�l�<�ԯ_ƍǒ%Kprr2�ެ“�:u*���8::R\\lױӦM#((ggg����ر#s��aܸq�^��">""�~����䄇�Æ
#&&��
Vz777���0�qww'00����N(�����Ņ�۷[��}�v���*-��nY���֯_o��g��^^^DGGWSU�Hu����,3gμf\zz�5c��[e�V��:((��� ��иq�J@���|�9���;������Vy���+F����X���� //�}��1~�x\\\�\CDDDDDDDDDD�z��)G��x�����Ǚ> 0�V���c���:th�1��$�=���ٵkݻw��DDDD��			aݺu$&&@bb"��j[ ��HIIa�����]'%%�!C��v""""""v���S^y��n�z�z,^����@<==k;��w�^/^��ի)++cذa���ҹs��NMDDD����LTT�'O&88���T-ZD�F�j9;��._��PDDDDDDD����┭[�V9_����Q�RTT���Y�`�
_�V�t�3g�d��
Ddd$)))8;;�r�""""w�.]�0q�D�ߘ�&M��ϯ����(11�����NCDDDDDDD�ۦ8��mWs3u�ڕ-[��y�fz��]���H||<�O���3�
>�U�V�ĉk1;����h�h4�v""R�-Z������NC�իW/^z��NCDDDDD�.��@u�9s�Y�fѧOz��ȑ#IKK����\�bRTT�{�ǀ�ѣO?�4K�,����S�[kTWu��N>��899��oSTTt�6n�Ȅ	�{����g��ǚ�,))a���<��c��Ӈ�K�p��9"""�ի�{���^��ŋ5����B����ڵ���D͛7��ߟ��$
�y]"""""""r�ٽ{7)))����])%%�ݻw�v""""""v�m:�T��ŋ�;�'N��>LDD�Ulqq1&L����|������a���88ܺ����ӢEƎ˒%KX�x1aaa����k1v��)���8�<o������Y�f���G}���7)))���g֭[�����������_RTTD@@�U�dff���Ƴ�>[��ۓ�h��>"�`Ĉ��������H�ԉ�)����8q///���عs'111]9LV�X���y�Y�r%�w�&99�Ν;���Ijj*`�}PVV���L�F*�g���S���GZ�n�'�|BNNN��Z�
���p222رc~�!۷o�����aժU�ر�	&0w�\���O���`ܸql۶�Fב��@����o3ň��������������ȝ��:�TV�Qq<++�͛70c�:u�������V��nذ���h���hݺ5QQQ8����3p�z-U�i>���'22�1c���o�������Uܶm�(++�СC|���|����_��…V����m�����ҥK��_����e˖ùs�jtG�0�W^�V�,bDDD��:thm� "u����[�Nl듛���?l1���g{��q`s��G�V�������z��ԩ�>�,�|�	�1�F���9s�S�L�СCVseeeVc<�k��mڴ1���|]�QPP@�ƍ��Lc��~-Z�`Ȑ!�����A���ݙb���ܨ�9r����q��ͤ��r�.\�@�v��ӧ�<��cn�'�|�3g�����͛[�?~�A��_�[�����"&//�g�y�_��W|��畞�:������ٵkݻwW��������-Rk�)��^��W,��W��5c*��M�f��|���?�u�V��׿��OX�ϟ?�C������?N�6m�رc���nذ��q��wx��:L�[k��l}�DDD�fz��E�^�j;
�;�+���֭[k�X������pv��a1���Mvv6qqq̚5�����r�:�m�6<hU����������dddX�8p���=n�}߻w/�/f��Ք��1l�0|}}�ܹ�u�+""""""�V':������7���W_��#��ǿ��+�X��@nn.k׮�`0��4m��|\]]�6maaaDGG[͛�􈋋�I�&;v�<_RRB���m��:�6mʩS�8w�M�6��3mTq\DDDjn�ʕ�1����:�Z��""w���[�n��L��1c;v��ӓ^x��={r�=���?�f��/_����裏��o~s��߱cGsqJ�>},�L�)#F� >>���t�┃�.N���ҥK̜9������4h��������$,""""""7N�(N�۷/�|�
s��a��ٴk׎��+ IDATC�1g���޽{�����3�m۶����eŊ|������t�R�j����2�?N�-nJ��S�>}���c��m۶Jcv���O<��c�x�7���ϟ����^�<��S���͵*B1m�t#ڰ���������NADꘕ+W�����;Tmo�s�IOOg���xxx�������y��ˋ_|�,Y’%K��nx��S��IQQ{����Ņ��իW���Iqq1NNN�������>}��{�<6|�pV�ZE||<'N��9�������M�Dqʈ#��/���5jT���F�b˖-dgg3r�H��F�1e���&M�PPP��A�0�]����nO>U	'++���"��@֯_ϬY��5k��q�&  ����s={�d�֭������g������>z�9�����!C��v
"R�\�|Y�)"Rk6n�HJJ
����Y�f2q�D\\\*=�̙3,Z����t.]�D�6m���HDD`YSXXHLL�6m��ٳ4k֌>}�0n�8����q�B����N����/K�.�(�1}]>�������;w.[�l�Q�F<��L�4ɼŲ�]�v�p�B��P�~}�ʄ	8w����c۶m4hЀ�{���0\]]��[[��7l�0���h׮��ڔ_RR.$;;��
��O���/���l.*9t�����\�|�^�z���B���ٴiYYY�JKK9|�0����EEE��Ʋa�~��G�5k�SO=�رc-�b
IJJ�k׮��y������Dpp0�7�y_EDDDDD�9�v&YYY�>I���LLL��{�~������;���Ǧ��qqq�F������HBB�Eǎ�S���퍣�#���7��ɧ*���L�4�j|ڴi��쌓�;vdΜ9�7�իW����ׯ...l߾�j��۷���F߾}oH^"""""""R�|�L�>���,.\�@II	�N�"))��s�Vz�ŋ;v,�ׯ��\�|�Ç�Sʻp�cƌaժU����s�\���c�Z=�p�B
+-��Jxx8�ׯ������V�\ɻ�k7�|���)**��|��G�]��?��Ϥ�����?SXXȺu�X�`������W
����+cƌ����^�?���L~��gΝ;ǧ�~�…��{������|LFF�En�z�����w�}GQQ^^^�s�=��}/..f„	,[���'Or��e��󉋋��_������_RTTd�������HKK���EDDDDD�~u�s
����Ug���|�5kf1���Nhh(���U�DPP�ո=�f+��:���\�Æ
cذac�7&::�f��@������u���b4���%//ooo���طo�Ǐ��	(��N�>M������{��?�ɉ'8p ����_����s��I�y�v��Mii)�۷'88�fg�~��?��]�vq��Y����ڵ+�Ǐ�e˖�埪-�aÆ�lْ#F���r?}�4o�����`��HBBp�,8r�H�������ڵ��ݻ3t�Л�����Z�jp���駟�^�z�߿�����|��$11�'N���śo�I���ٿ?����>}�"v���;vooofϞM���9x� 3g���ѣ$$$Xm�Һuk���,�2)�����~����d�>IIIl޼���0����V�ZE˖-Y�|9K�.e�ܹ����駟Ҽys�-[FLL���gϞ0��R]���-[�}��Gll,qqql޼�3fбcG���8x� >>>�uqJϞ=�W������jK���+Vp��A|�A"""hӦ
���DGG���Ijj*�ȯ}��V��222x��g���""""""Rc�M甪<��c�����'�p��yJKK���oy���x��k9C�($$��͛���hKLL�`0Xm$"""7�i[��;Z�~�oy.�3�M�6q��E.]�Ğ={�2e�U�L~~>������r��i�\��O?�DZZ���|����:�/�����^{�5�n�z]�GFF�y�f.^�Hqq1gΜ�����W^aĈ6�����ŋ�6mS�N��c߾}�$/��-��j|۶m��_��C�|����̛7���2�7o`ƌt�ԉ
���Gddd�bz�!s��M�6Y3r�H���ꫯҺuk����ӟ��������pڶm���F����JDD-[��aÆp��9�q���A���{F�-hذ�����ϛ�M��b����?�>}___~��_дiSڵk�ɓ'���o-�m���oذ���h|}}qtt�u��DEEX�my����f�V�ZYĈ�������Q':���ߟO>���s�Z�mҤ�E��=8;;��ɓ�o�����h�"5jT�ى���]*+N1���bcc���	`�̙8;;�|�r���X�d	���7�.]����

��LJ��ٳg���û���ŋ��Q�I悂�y�֯_����?^�������t�BII	���?j�^uUVTs��%fΜ��14���HRRRpvv�鹉���ę3g�2e
���+++����\��A%???�ؼ�<z�!�qӱ'O��:�T�P�����_����UHR�Z�βmڴ1m�w���''N� ??�֭[�̡����/���f��^�������:LC��ML[����1�ի�"==��￟X_^M����0`���G���.((�v ��4f����NtN	#44����ӨQ#04���D�ۙʭѥK&N�ȂX�`�&M��f�����x�N^�|9111�������{�W�V87��	���p~��_���Ƙ1c�'rv��@TT�Z���ё6m���oW;�T���S�N����=JJJ�������OV�(���>}��{�<6|�pN�>M|||-f&""w���,����?>���LJ�#G��k����\�sU,��W�^�������n��
6�9��P��t�:u��7�-�w�ތ5�+W����
���u_۵k�������Լe����Z�RRR��_M�z�ln�S��^UXv�1]��{l��gHDDDDDD�W':�888`4ͭN���MDD���X�d	\�p�V�Z��?�Ѣ����%&&��S�����ҥK�}|ŭ{Ν;Dze�x��'-�L��+���������ևEEE��Ʋa�~��G�5k�SO=�رc->()_�ӵkW��K��kµ�[�mL�-,,$))��]���	@����EH���6��m�v� ..�&M�p��1�|II	��[�m����7�|�W_}�#�<b�ꫯ�b������طoݺu3����3u�+�z�)֯_Obb"�������b�����K�RVV��~�;�6@5�וqqq�U�V;v�}����~��ݭ���С�۷�}��Q\\L�V�,��\��@nn.k׮��iӦ�:u�s��ѴiS�9��I�EDDDDD�ƪ�SDDDD�>�'�W�\	@˖-���"!!___���

		aݺu���������G�2k�,֮]k��…),,4E�{<�����o�[�/_NPPӦM�ֵ����gϞ׌-++��ٳ,X��n#_\\̄	X�l'O����������/�\�Օ�g͚�7�/�����"��(**"--��EDDn��;wR\\��Ç���4�W�fҷo_�̙CNN%%%�߿�9s�X�Mvv6%%%dgg�c}�Q��5������z�聟�?��#�F�"--���B._�́x��ٵk={�d��V��{��ҡC�ꖍ���Xu%�W�\�r���8���e����3fp��a�\��ٳgy��w�g„	�X�VJ�m��3���nIDDDDDDn<������rrr�O�V|m�l�2Μ9C�X�f
۶m����Ä�Z�nMFFo��F����O����8;;�a��ϟon?_�K�.��;����¸q�lƔ�Ҩk׮��׏��4�ӟ�d�b�
<ȃ>�ʕ+ٽ{7���t�ܙ��LRSSͱ��'�Ş5�s�*;�������1S������T82k�,9r$������y܈#hժ��=�F��{��<���|���V�!!!�hт��<F�M���=z4'O��E��=��M�G
��O?m���k�ܹ�iӆ�'OA�޽�ѣ!!!�ر�޽{3o�<�nq5��U1��޽��hش�Off��q��u�G�E�V����f�ȑt�֍~�����ӨQ#�L�b>ޔ��o��Lc5)V��Sq�������f��cH��&���L�6�-Z���Œ3�����>�Zw�ȑ���{<�K/�DJJ
_|�ݺu��>㣏>��Z~��^y����[fϞ���U�8::�����[l���:(::___iݺ5QQQ��6D�aϚ5�o&G��vũ�U�V1"""���b�iӦ���3NNNt�ؑ9s昋OW�^m�8gggbbb0`��{/�������\0[��ƍ�СC������OOO�NBB���v_�ԩS���ё��b���^,_��ɓ'ӱcG\\\puu巿�-K�,��߶�����*�tpp���
�{��[մ8��}wss#..�ш�`���wwwIHH��ү_?\\\ؾ}���۷o����ܕGDDDDDDn��o({��?�!"RF���S�3*a̟?����_Ϟ=�ٳgW?8:y�$P�v��{�/��Օ�ӧ�?������?�*�…�������[o���?^�z��Ο?�/�@nn.O=���=����0`�͵�=j��س�ܷ����o��L1"""��ƍms�|w4[�-̚5�b,??�f͚Y��s�=���Ve>��T

"((�F�V7�Z�
6$88���`��]Ͻ�l�cǎ�Ɨ���Ʈ]�*�������Nhh(���U�����h$66���<������c߾}�?�k]�������\��^�ҫW/���o�iD�.ТE��NAD�eo!q���kr|E^^^���OVsǎ#""��'O�p��J�̭��ݝ�3gœ9shҤ	�{���)++�r�.T�
j���7ӱ��Mc*�;�c�=FQQ������Fnn.��������vºu�HLL4+%&&b09rd-g'"""""r�Ӷ>""""w���,bbbx�����������f��T�}��ԬS�=����o�.b��7�`0,�����_~aٲe�.L1i׮���������-�M�[�v��=1����i��]�z�{ӦM8w�՜i�#""r��߿?s�ΥO�><��#2���,�4ib�	D�<ggg���HMM%??���|RSS�����
IDDDDDDn���9%==�#F��ӈ�]�h4���X�i���999���[���ٳ'III,X����h�^-ZDrr2>>>|��gU�����f���}�O�ν��K^^.੧�2�y�"##�&..�&M���>�3�
6���GLLS�N5��ݛ��f̘AXXm۶��/+V���?��ߟ�K��u>{֬�}�W�eee?~��I��ԩS���Z����cDDD�$aaa�hт�?��o�����b��>z��رc�����6֥K&N�Ȃ�4i~~~�������������\����HUT�&"b?{�S��y6l�@vv6����-��?]�\�=~„	�ر��7�q�F��Ν;b~�׿����R���{���k��/Uqvv��^c��񤤤���r���0j�(�l�Bvv�U;�F�1eʔk�_�=kV��5i҄��
��``�ڵ��ٓ�[����c����{�裏ڝ��������ш�h��T���Ϗ�����H�ж>""""w���(�x]^ӦM���'((�ƍӠAڷoϼy����R��=<<X�l�<�ԯ_ƍǒ%Kprr2�V����:t(W�\�/��y��͍��8�F#�GGG���	$!!�F�G�Y���m�ԩx{{���Hqq1�����Ņ�۷[�}�v���*-���nY���֯_o��g��^^^DGGWSU�Hu���3gμf\zz�5c����iӘ6m�ո��;�����������Y�:�-((��� �1WWW�F#���������
@^^���c��񸸸\�"""""""""""7[�(N��z�_�~�k׎x��� ~��_[�=z���4�9��Ç���/oH�&s�u-�O����&33�˗/c4IHH��������̮]��޽;C�����+$$�u�֑��HXX����-�DDDDDDDDDDDjK�(N���gϒ��AFF��=s�̱��裏����ɞ={̯Ϝ9s�sػw/�/f��Ք��1l�0|}}�ܹ�-�EDDDD���ٙ��(&O�Lpp0���,Z��F��rv""r'[�r%+W���4D�JF���S�[�(N���!^^^�޽���R�㥥��޽��~��zӬ[ג��
�|@�.]())!**��p��%fΜ��14���HRRRpvv�e������}�t��ĉY�`�&M��ϯ���;�K/���k;
��V�-j;�9\;���7o9s�u�ޝ��ϳ�~����l
�֭�M9ou���W�NNN�����>}��{�<6|�pN�>M||�-�EDDDD�g4��_��_���^�鈈���������X��SLE+��#�����Đ��F~~>
4�M�6<��36���֭k֬!##��z�<�c�y�RSS��+,,$&&�M�6q��Y�5kF�>}7nnnn�gϞ��g�֭\�t�>}�q�k)_�ӵkW�\�8���"bccٰa?��#͚5㩧�b�رV-�ͧ�����$�v튧��y�y������Dpp0�7�:VDDDDDDD�>�-Җ>"��h4���X�i������إN�T�x�b�/_n~}��e�������x�"#F����ڵ+�ر��'����өW��<��9.\���1c8v�y�ԩS�\����L���pqq�x�=���<s�_|�ŋo�53a�<h���'..���/^l޲Ȟ|���K����� 33���4�}��v-"""""""R���q��Q�}O������k֬��c�Νl۶���pV�^m���N�v�8r�gϞ�̙3|����׿������˗s��1������c�Ν�������ѣGIHH0�~���������òe�عs'111|���׼��Q���,^��b�
<ȃ>�ʕ+ٽ{7���t�ܙ��L��/�䓑�@����Lc�{�Z����T5n�X��Ņ.���ȱc�d��<���u�֍��c��~�iv��AYYݺu��y�ff̘A�N�x衇�����_dӦM�.,[�l ""��;���ǫ����ɓ��շa��������u��DEE1p�@֯_o��Ȟ|�9@˖-��٪U+�������v
"R��7DDDDDDDDD�V������˼����ڵ�]�v�0z�h�F#�5�y�#�<B||�Eq�i�Ӗ8=���?�ɓ'�c'N�0�T���?��l�=z�F�иqc�9Ә)FDDDnoC���DDDD���X��JNNf׮]t��]Ӊ�������֊S*�c���WD���ٲe���ꫯX�d	+V�`ҤI<��V�<��C4lؐ]�vq��ev��M�
���+���R����2��5�_���ފkWt�…�S�^=�wx2��bDDD�d41���������i�޽,^��իWSVVưa��s�ε���������
U';����3`����ٸq#˖-c�…6�S������c�Ν�Y����B�t�Ri�///���;���g��Ͼ}�0�1�;ƞ={0����ܨ��`0����ڵk-�m�=�4mڔS�Nq��9�6mj1w��9s����ܾ���Y�hQm�!"uXrrrm� "r׹t�3g�d���z
Ddd$)))8;;�r�"""""""7�0� IDAT�u��:�g���ߟO>����"ڶm���/
4��8�>���E'Mvv6%%%dgg3g�}�Qs�O>i�ݳg%%%8p���z��YA�޽�1c��ʕ+�={�w�}&L�P�|x�rss��Lc��=?~�����NCDꠔ������4����N�b->>�ӧO��sϙdž��ӧ��]��������)�d甐�����;w.s�ε��j�S1ʙ3g,^Wv�M�6q��qF�m1עE���#G�q�F�9¸q�����Y�Q�F�b˖-dgg3r�H��F�1eʔ�ӳgO�n�JNN�ս3uZ)_�#"""�/u>{�\��#F�v"r�ڸq#)))>|����f͚�ĉqqq��
tFFs��eÆ
899ѫW/^z�%�5kf^ϞX���"bccٰa?��#͚5㩧�b�ر899Y�����…��ΦaÆ<������NΞ=���֭[�t�}��!""���IJJ�k׮xzz�Ǜ7o���?IIIӸq���"""""""��ۦsJVVYYYՊ4h�f͢]�v899���D�6m5j���z�ǵm�7nL���+�mܸ1���:OOO���d���$$$���n�urr"&&���ӤI����۷/3f̨��_���qqq�F������HBB�Ew{��ׯ...l߾�jn����ѷo�v""""""""|�ӧO'++�.PRR©S�HJJ�z	`޼y�]�������ϳ~�zF����k[\\̄	X�l'O����������/�Lii�պ�Ǐ'33����s���駟�p�B�|aa!�G�&55�s��Q\\�_|a�/�����"��M(**"--��SDDDDDD�vW':��*Z0`��z��U�{[��{#,,�9���Nxxx���:Ou����	

%44������h$66���<������c߾}�?����������ȍ�j�*���y�駩W����g���6�IOOgѢEt�ڕC��ɓ'Y�b'N�;vŊ<x�|���ڴiCnn.���dff�����-�mٲ%QQQ�w�}�����͛��'�1yyy�����o�������5k��ddd�|p�4������>k��-Չ���BBBX�n����B���D��B""""�:r�E���6o�Ljj*�…�k׎>}���3�ܔ6�'O��w�a��ݔ��Ҿ}{���mnc��?���k�.Ξ=���;]�ve���l��"���*��x�ؓ�)���5���̮]��޽;C����DD�vU����xVV۶m����C�����_���.X�n�2ҩS'f̘��I�ؼy�UqJub7l�@tt4^^^�nݚ��(��뭊S���hѢ#F� ..΢˖-[����cǎ���_}�U&O�l�֑#G���hժ�E�������ȝ@�)���3QQQL�<���`RSSY�h�5���DDD�.{�Wغu�UCQQ����ر�b<;;���l���5k���7,���ƌÏ?�h۳g{���7ޠ����|BBB(((0����O������Nll,m۶�a�ݍ�����ŋY�z5eee6___:w�\۩���-p���L�¡C�����ʬƺw�n����ĉ5�=~�8@�]y�=j5֦M�צ��o�cZ�S�N�=���Vk��ưU�k+�w�������H]���K�.L�8�0i�$���j9+��n�js|ƌ�رOOO^x�z���=���?���5kX�|9ӧO磏>�7���
�%66�����fΜ���3˗/'..�%K�X�,]����

��LJ��ٳg���û���ŋ��q�uG����|���ҥK̜9���c04h���������|C�'""�F��Uuښ?>���LJ��6m�бc�J�hկo���(���F��
`ʳս�A���իg5oZ����)���Mc��!""""""RW�8ĚF#F�������Fm�r����پ};$$$���i������_��Ņ%K��d�>��r�͛7W[���W�`̘1V-�sG���(<<<��OK���8��{�ސ��V���>}��{�<6|�pV�ZE||��""r�1m�G�&M8v�y���Ģ�#;;�b{ �����j���rssY�v��P�z���p��1���c�V ''�*�iӦ�:u�s��ѴiS��s�ΙcDDDDDDD�֏g�����]�̙3̚5�>}�УGF�IZZ�����my�{�=@�=x��Y�d	�����ǔ_c�ڵ[��7l�0^x�F�i�ƞ={�ӧ&L0������k<��t�ޝ�{����[��~�z�������~�����OZ�nذ���,sa��)������(,,�/������޽;����Y�p���ۦ5JJJ�?>�=�}��a�ҥ�k����W�^��ݛ�^{��/^w�U��τ�����ڵ���y������Daaa�s��e�Νs��a"##��G�z�-rrr())a�޽DGGЯ_?�5�ۻwo�j7�Çs��Ξ=˻ヒ�������2�=͞={())����[V�<����Vs�1S�������ȝ@�SDDDD��/2v�XN�8a;|�0V����L�0������󉋋#''�ŋ�lQo��~z��Yi���+cƌ�9�p�B
ͅ
���p��s�ѣG�5kW�\�駟�Z��W_eÆ
1mڴJs)����5s����q��ƌc���S�X�r%���������b����Y�f���G}���7)))����?�̺u�ppp��^��m��g��/������r���233IKK��g��)�����!00����3k�,f͚e5��a���5�"�C�6����Ď5�-[����mQW�P�L�b�5�9��7r��ƍg�ׯ�UJϞ=ٺu+999V�*�:�<��v� """"""r�R�!11�'N���E\\;w�$&&�fg�+Vp��A|�AV�\��ݻINN�s��dff���
Xn���e~}��Y���k�k�֭����7�`ٲe�9s�:�f��m������V��~���ٰa����ʕ+U��ҥK���;���X|�T���H��s˗/�رcx{{�����xyyq��Q�����aժU�ر���ܹsqtt��O?%##Ü�mۮ;��T�g ##����[�c3ň�H�V��EӦM#((ggg����ر#s��1��Z�z�E�…�ի�����ӓ?��,]�'''������F\\F������#������P��%NNN���0x�`�4i���}��eƌV������Ņ�۷[�m߾777���kw"""""""��[�9e�С��T"rJII�h4�v""uJedz��ؼy3p��}�N����#22��^z�"��q$::ڼEN�֭���b��_���V����#W�\����F�5r�H����Ӂ�r�h��|�>2y饗x饗�x�"ӧO��>�Y�f�?�f�/���+��·�~��o�����(�����ࡇ"""�_|�M�61q�D�5���i۶-F���K���/�A˖-���'���p�ܹ�ι2��L9r��_y�Z����;W�ƍ���Td��{��wީ��Սuww'44����*�*+��5���Jxx8���Uƺ��b4���%//�\����Ǿ}�?~�U�4�����hт!C���ӈ�nȐ!t�֭���c�Z�?������?~��\��ѣU���ӓ'N���O�֭mƔ��q��E��ܬ�L&'O���ή��L�>�?������Y�r��BCC���歷�����t��>����u���WR�3}OL�Y^�k.�V�6m�_;;;W��=9Wƞ�����ꇒ��L1"""w���֭[Gbb"aaa��nv��j�!������Ջ^�z��ӈ���H�LS�*F(++�x]�^�k�Tt�…*�;u�ĉ'رcG��)�矧cǎ������h��ؾ�V��0u��駟��;FDD'O�d�…\׹ʳ�
�-Uu�iذ��q�[�{�=?�Mc�=�������b������ʢE�hԨQ-g'""""""rc��┕+W2bĈ�}��Fk;
�;����|�
_}��<�y������5���v�Z���zꩧX�~=����������R�.]JYY����,
Sl������9z�(:t�4.((���֬Yc��o�1_Wyiii����xzz�l�2�~{/�.^^^|��w�۷Ϣ[ؾ}�l�w;��g�iӦ�:u�s��ѴiS�9��C�EDD�T]�ta�ĉ,X��I�&��\'""""""R��������[u*���MD���۷/�|�
s��a��ٴk׎C�1g���޽{�����3�m۶����eŊ|������t�R�j���2�?n.�ѣ~~~�ٳ�Q�F��/ңG5j���>��Cv��EϞ=<x�5s�ٳ'III,X����h�^-ZDrr2>>>|��g�f���}�O�ν��K^^.�͘8p���H�������I�&�}��%00�������={6:t�����>z�s�){~&x�N�:Enn�U�i{��l�$""w&{���[���ш�h��4DDDDDDDn�[V�2dȐ[u*���o��DD�h#F��/���cԨQUƎ5�-[�����ȑ#-�5jĔ)S̯�4iBAA�
�`0�v�Z�Ν�/��7�|CDD��9z����ٳ������?φ
�������ܟ��'��&L`ǎlܸ��7Z�u�ܙ�����������ӷo_��������i�&�?��ѣ-�Z�ha5v;��g�gϞlݺ����'�srr�ۻGDDDDDDDDDD�wk7��Z���UiA���31110�{w�������o�����9��͍��8�F#�GGG���͝?�w��:u*���8::R\\l���`���L�<��;��₫�+���oY�d	o��6�5��u5mڔ��x���hܸ1
4�}��̛7����[�sٲe<��3xxxP�~}|||7nK�,����x�q�����3t�P<==qtt��ӓ�Ç�������-ϩ���ׯ...l߾�j��۷���ViA������������M��s����t\XXC���k�����ڵ��ݻW�����ȭ���Y�,����h֬�Ÿ��;������V�fPPAAA6�6lHpp0����ʯ��׼�������M�6e�̙׌KOO�VN��͞�{��0���j��=�ד��c��3����h$66���<������c߾}�?�j�&""""""""""��:Q�r�/^L`` �������޽{Y�x1�W�����aÆ���K�Νk;5�=��cNPPnnn���2o�<~��Z�P�$!!!�[����Ds!Nbb"��j[ �=�\��˗/�v"w����Fcm�!"""""b�:��OU-諣���������ϥK��9s&��`0���ŠA�����ҥK������܅L��̝;�>}���#�0d����hҤ	�ƍ���N���LTT�����瓟�Ojj*QQQ���IDDjO�n�2dHm�!rW2dݺu��4DDDDDD�v�tN����t�ڕ-[��y�fz��}�׷W||<�O���3�
>�U�V�ĉk1;����ѢE>��s���[������ѣcǎ��:�ɝ�K�.L�8��ػ󰪪���_A�I4�9�W�!�RDEKLM4�	ALɱ��9e�����(AM!� 'D�"Ne�0s�+(("���9�r8Dpx?�����Z��gǑ����3gbccS�Q	!���Y�f1k֬�C!�B!���G&9�2�W���	 >>���l���h׮ÇgĈ��ᇌ;�իW�ꫯ�w
���|IHH��ի4k֌����鉾�>����[��Ν;�엚�ʌ3X�bTڝ���t�>>>��Ջ��Hz��v��y��������;�7~�S&�BQ-:::���J�pQ��B����㉈���0�xj���^�a!�B!D�<�)����|��]N�8��'�u��ǏW�ߪU+<==Y�~=���ʺ��2m�4N�:��eggDFF���8�u��q��i���d���x~��'%9%''�K�.������=qqq���cgg�1���������3r�Ț� !�B!�B��HOOOn�Q��)�B!����29e���|�����r��]����e˖-Z�H�0a?��[�neȐ!t��Y��aaa�:u�Ν;�`�ڵkGff&>>>���È#x饗8q�ǎ��Ύ��"��݋��IIIܾ}222x�W022"))	�:h̭jKJJ��!�B!�B<�F�ŨQ��;!�:;v���B!��Ft�kb[[[�������TNTT��7...����u��
�h�"JJJ���O�w��~			���`mm���.m۶e�ҥ���(�QTK
9r���\���۷9t����ҿΞ=@�֭5�nӦ�Z!�B!�B!�B!�B���cY9eΜ9|��Ǥ������W_}ŤI�puu�����t��ȑ#ٺu+�6mb�ĉ}.\������1Ν;�믿ο��/%9%>>�F�1c����{~��'^�u222��ѡo߾@�2?�7�[զ�#�BQ
4���B!���T�#U�@Vy��յo�>bbb8y�$7o���_d��>\�gR���g���/h�EJJ
={�d���u�B!�B�J�[rJ�?���^GGGz�����ٹs'Ǐg������1s��J��y�8p��|�
��������J�y�&t�ڕ��trrrؿ?���*ffft�ޝC����ϩS��֭fff��n��h�Q�ɍ%!�BT���=QQQ��B!��g���x{{����֞��Nzz:AAA,Y���	����Z??<z�(���lٲ���ƌ���5ݺu��H�B!�B��XVN055���	'''N�:Ş={ظq#~~~�&�����兏���vKKK233�����Ҳ�9v�7n�֭[����7�RSS��믹y󦲤@ӦM�|�27nܠiӦj�ݸqC�#�B!�B!�L��Ve.\Hrr2L�>�޽{ӤI���/�o�Nhh(|��~�-/����U8������ŋ���|����̢E������а.�B!�B��c��2|�p����fȐ!�oߞ?��==���?`����Kbb�ƶ����…���}������%,,�M�6akkˆ
x��X�f
۶mP�Sz���7oP{�^����dffj$�dff*}�B!��СC�?���B<��WAR!j��.D�:t��bnnNHH�6+++�}�]���X�~=�ׯ端���hkWpp0W�\a�رJ۸q�ؼy3���̘1��B!�B�ir���>>>�����뫶��ƦJcx{{���F~~�Z�ĉٿ?��鸹��m300`�ܹ��M�6��Ɔ��4^x��֭[���\�x�_|Q�K�޽9p��fddЧO�*�B!DYrsYQ]��&��7{��!::�3g�p��m�5k���3f����_�KRR���$$$������=�f͢Y�f�x���K�����իWi֬����}}}�q###���#==�F���3g���ׯ_��/��0`�,X�@�)//���������i֬`ʔ)���(�bccpwwWKL)k̘1�����/j����~`���X[[�aÆ
ۡvϱ�O����򈌌�G�j�ݼyslmm�����ݝƍW�!�B!�x(���<E���LÆ
������lْ>}����Q�1,,,�9s&�W�Vk711!((�o���}��q��������aڴi���P��3~l IDAT��HZZ�FB���=���jK�4��>���2a��m��Ą�V��B!�B!G_}����jm�/_&22���\�-[��m�ʕJ���۷����رc���ajjZ���L�6�S�N)�eggDFF�����訍;u�TeI�۷o�m�6���Y�p!P�D2i�$����}~��nݺU��t��M&O��|��:O����$�8q(}0�"���L�<�����������S��a�cm~��G��󱳳��fggGjj*���..�B!���ӹ�����������DXX���$''�e��}�]�� ��W֘1c��155e޼y���r�����˚5k4S�4Q&--�iӦ��ϟ?���4�?����quu�رcjVdeeq��1��ܔ�B!�B!�D������IJJ"99����(}x��C��n�:>LPPVVV\�t�����
�ԩSt�ܙ���9BTTݺu#55����q[�n���IJJbҤI�۷Oپi�&���hٲ%7n������o��<���r��yZ�hAPP�&00+++Ν;GHH������hѢ��UE۶mIJJ�H *�^����we?�KJJ�C���T}�B!�Bԟ�"9�I���A���	W���ñ���XJH!��qw���
��۷��s���舝��&M",,�����˥K����_�~��Ӈ)S�h���_�l�2�«����Y�`���}mmm�(�t��V����;;;������	 77W�e�eYu}�QQQ̛7�y��Ug�
!�PW�{�����D~��g:v���ݻ����Y�r%PZ-�<ooo�����ӣK�.J%���!�雐����������Ҷm[�.]
@\\�Ƹ^^^�jՊF�)K��}�ܿ?,�S�N���accÇ~X���*�ҥK����ڵ��T�޽{������x��pssS[�����q��Q���u���ڴi��G!�B!D�yd��y��t�RfϞ���;111�[��z�N!������������&99Y�===���t���X�d	�KNN�'O��իJ�/���/���$��dgg���ANN����ϡC��}���[}���_y�wԖ(,,��ٳ�={���X�������ѣ����e�JJJ3f���t�֭�CBQ�k׮1w�\N�>�����D��gϞj?�~�_�x�F}/\��V���ܹsm�ڵS�W-T6D5~�.]��޽��9�BUu�k׮ZǼt��faa�ŋ��Φm۶Z�+))�֭[����8&U����9�F�ﵲՔUTme�M'�B!��~HrJ=y�嗙1ck֬`�̙����sTB!���Z�.\Hrr2L�>�޽{ӤI���/�o�Nhh(|��~�-/��R���իW���c���JPP�ׯWKNٰa999���1o�<Z�l���'�|BFF��9���s<j��Y�v-�n���W_e��ٴmۖ��"N�>�ڵk9s����Ji��^Km��<�x�b\\\���J��\�h����IB!J��������}aժU�>}��-[ү_?ڵkG�N�=z�ֱ6T�K�����Y�*}�%����z�����}�
4���,?v�xj����.]�p��E���+LN9y�$o��6�:u"00P���q������¹�UM��0α6�~ڮU[U�B!�B��Ȳ>���Օ�kײv�ZƍW��!��	��,/s��!<���9!!!6ssstuu�����w�eڴiܻw�����ڼ������<�쳘��0y�d@�\����ҥKiӦ
����k׎O?�(���KOO`���X[[ӰaC�޽;>>>@�k�(�ʕ+�;Vi7nW�\!88�#Bq?)))1g��
�����H�g��������*}UI�������i|���V��Z�l	�Vf++##��c�XYYp��1�v�Ϫ�<x0P�t��J!���lذ�����$��7�VS�Vդ��9֦iӦܸqCc��M�G!�B!D���!�B���_�d	�W�^����5�%??�/��'''z��Űa�X�~��S�e�);Fll,���ʒ1�3��ӧ���1�/��€�6m����⣏>��_�gϞ�;���8�1���HKKSn�ܸq�����7�xC�oBBiii�������}��+;���<֮]�СC�ٳ'o��&~~~O��(**bժU��ۗ�a���,X���=���磏>R��(�v��5�[�jEZZ{��U�+?we�R��Q�|��9f̘���=���+V����@m�^�yyyDFFңG��y�����I^^�^!������r��-Z���O]�|9q��Q%�rРAcV�o�����jngΜ�޽{\�~��?�[[[���R�{��LJ_~����"N�<���˫=��j�C���)**"==�+VЧO�o�^������իL�8���x���{�.'O�dΜ9���лwo\\\�����رc�?__�Ǭ�0α*�F�d�/�@ff�FU���B!�B��#�!�Bnݺ���'/^T�Μ9Â4�2m�4N�:��eggDFF���Z˪��8q�޽{W����X�jR���yyyJBBNNjI�Νcɒ%ܻwO�Il�?����y���+�����������͛7�<y2�ϟW�\�|���RSS	

���Hm�U�V�}�v��o���-Z��>�o�f׮]�����G)}===Y�|9S�L᭷���ޞΝ;��ӯ�Td�ԩ�̷o�f۶m�p�B�z��?�H~~>vvv����HMM%>>��#GV�x�B<|��űd��,Y���̙3j����͙8q�Z��;2f��}��w�ĉ�߿���t�dX(MB�;wn����͍={�p��Y�L���4Hk�DUxxx�w�^.\���I�Զ�j�J���ח�ӧ��k}��߿?�|��27l߾��>���>�@�ku=�slffFNN���XZZK�޽9p�Kf��֔M�B!�BQ?�r�B!� <<��/beeEPP�&  @k�AXX�N��s��DDDp������֭�����������*�p��uZ�hQ�X۶mKRR˖-`�ƍ\�v��;�}�vy뭷�ҥ��������А��V�ZŽ{�*������>�###�Ne��{����q���r��yZ�h�����XYYq��9BBB4����`���$''+O������˶m�HJJRbMLLT�������SSS6n��;�C�~��>}:QQQjUp*z-+:���nݚ�۷�����LS-�ջ����С��6U���B����=C�����CCC��ԩ+V�P޷�l٢����{{{6l���&L`Æ
���k�]��&&&��ꊥ�%���������@HHH�*m������fff���3p�@%	�&7nLpp0�G����]]],,,7n!!!�����777'44�ٳgөS'���066��^c����^�Z��ܹsqqq�I�&���cgg��ŋk���8���ϧE����*�V4hFFF<xP����111a�|<B!�B!L������0""���ǣV�sTTTmN#�xʌ?�Q�F��(?!�Ӥ�o��g]EI奥�1n�8~��7���K^}�Ue[rr2�f�R�Jߘ�e���/2b�lllP���);;;
9x� ���U>n�XX[[+�#G�$33���`^z�*���:>��RRRx�w�:u��~w��a�ܹ����z�j���5���=���cԨQ��?�a������+J{JJ
�.mڴa�֭jcѥK�t���}��y�fڷo�&ը�����ӧ9r����G�����6m���W_��Ϫ�Y�c)�W�sXX/��"P���k��������պ�•+W���iڴ���\�~�A���sϱk�.��,JU�����V�ﯺ�{L�Om�O�
6Ȏ;�謬,F��ԩS����kO}��(�B!� �Ζ�=zt]M%�B!�IUj�{��j��K�\�p'''�c�;w�ҹ,,,�x�"��ٴm�Vk���nݺ����ƶ6mڨ�|��%�=}kll�|�[o��Ν;�&�ܼy�y�摞�����5Sʪ�Ͱ�Ǒ��@׮]��U���8�*{�e��i׮��}U�:t�@��8q"��������իY�jU���"e�R=�]\\��U�:���J�(/Oզ�#�B�'����v�"<<///�4Y���RcI!!�B!���'��������B!��O������%4h��}ʻy�f�ۻt��ŋINN�09��ɓ����t�ԉ��@tuu�m��k��:T�_���o�m�ϟg��\�t	???���h���-C�M���5j��]G���;���CAAqqqK�������A@@)))U���Ǣ���|_��V��Pզ�XUmzm!���`hh�ҥK�={6�����İn�:�e��B!�Bԏ���r��!֭[���B<��핒�B!jW˖-����9~��ڒ2Ǐ��kiiIff&���XZZV{���Gxx8C����\m{qq16l�����C��%�h��s���r��9:v�Xa?GGGrrrؾ};�Z�R���w�ʊ����?��‚�7���W�P���ʊ?���cǎ�-is��1��=�:��/��m�6�O���]U��~I.��:�aӦM�|�27n��X��ƍJ!�B<^~�ef̘��5k�9s���kB!�B!��C���…DGG?�i�O���h�9R�a!�k��X�������8q�+V���ۿ.\ș3g�w�ׯ_���?��֖iӦ)}U�+TK����^��ĉ���'//��w�r��I�̙CJJ
�{����徱����5k�p��en߾ͪU����孷�R�988��_���Cqq1��'~~~@iҌ�ɓ'Y�h=�Ĕ�����NQQ����kЧO�Z�kܸq�z�jΝ;Gaa!7o�$11�����k
�_��V��P���*��,U[M�zB�hIKK��y��+�L����]���k�*��B!�B�hx�ST����j*!�h����B<�Ə�?����ĉ+�;q�D���Ozz:nnnj��;w�򳙙9998;;ciiIll,���L�>����h�ѿ>��*-���o���@zz:o���ڶw�yG�~ڴi$''�g���٣֯[�nxxx(?��7J�*a��ھ����޽{�p��&MR�֪U+��ѿ���ٴi[�la˖-}Z�n�V���ײ6U�:�ݻ7 ##C�茌�vz�B!�B!�B�\���B!������


	��ɉg�y��
bmmͲe����W�������+������bjj���!!!j�*�ϟO�-��ե��Pi777'44�ٳgөS'���066��^c����^��*WӦM	��ёƍ���G�X�r%C�Q�s�ƍ>sss6lH˖-�2e
�ׯW;�x�q��3z�h,,,�����‚q�����i��7{�l���qpp��g�EGG}}}����>}:�6m���L�_�kY��s4###<�1��111�0�H!�B!�B!Dݪ��)B!���fnnΒ%K�ڲ��h֬�Z���)���c޼y����舣���m�5���ww�*�WYˆ��>>>��iӦ,^����:T���[u�6i�///���j4Fu�{��IϞ=+�KE�kY��WU�Cccc\]]	$++�-Z���űcǘ:u*FFF�9*!�B!�B!�u�HN���j��j��5jD�֭?~<C�}��TeǗ��Ȏ;��� 77�ƍ��K/��쌽��C��*���HIIJoj�=�Ʊ!�����ۗ��|���qtt��Ą��LV�\	@����9B�4��u���]�Wz��ñ���XrJ!D튎�fĈ��O���hF�U�a!�B!D�=�)Ý;w���_�裏011�_�~���;w�d���٣������Hbb"��?V+o^�=���?[�l����1c�`mmM�n��4!�BԞ!C��u�V|}}�U�fffƔ)S�)2�4��uhhh�ҥK�={�R�'&&�u��UyY(!�5s��]yPE!�B!�U�X$�Դ�Gec�����g�ǦM����˗�g�LLL���d��<��sܸq���6l�@BBzzz,[����*((`��Ÿ��`ii	���3�-"::CC�:�E!����ˋV�Z�{�n��PXX�s�=G�^������¢�CO��\�/��23f�`͚5̜9��]!�*��ᄇ��wB!�B!�x�<2�)��Lu���3�|���8}�t��YUǎ#..SSS���hӦ����ܜ!C�гgOƎK\\...t�ҥNb�ʕ+�;Vi7n�7o&88�3f�IB!��]:::������Zߡ��XM�C�v��n�[��C��wB<����5kV}�!�B!�բS�T������P\\̆
pvv�W�^��ۗ��~�;vTkܢ�"4h��-??�/��'''z��Űa�X�~=���}���ôi�ppp�gϞ��曬Y����|�~ׯ_gٲe���k��ٱh�"�>;w�`„	j�)e�������w�}����չs�1c������k�X�����q����ׯ#F����Xmۅ���e���J���Hz���j��ͱ��%22���<��
!�B!���p������;!�J���9r���B!�B�j{d*�T���?�����w���ĉ�8q�[�n1~��J�/))!''��k�ЩS'�텅�L�6�S�N)m���������?::�y=_}����j�_�|���Hrss�%w���4iYYYJ�~��[�ni�w��q���[�q��۳n�:�=��m�ԩܸq�۷o�m�6���Y�p�Z�ƍ3f�����駟pttT�%&&����?��������|vvv����ȑ#+�[!�B!��7WWWY�G�zp��=�B!��Q�XTN)o���|��>|���D���زe��}TElmm�ѣ�
">>]]]�y���aaa�:u�Ν;��#G����[�n�����ݼy3���$%%�����_
����~�6m"++��-[�q�F>L@@����F�W�^��Ҳ�����\�rEc[�֭پ};IIIL�4	�}��ig����֮JN�ӧIIIt��AcU���B!�B!�B!�B!�c唲��T֞������Ȉ�7o���qpp����*ϯ��K�.]�:u�Ɯ			���`ee@۶mY�t)#F� ..�#F�	%%%�>}�ݻw��o����?p��Me����`��R���
~�!�g�V�_�tPÆ��<%%%j�-��ˋV�Z��'AAA���j�I�&���Jrr2vvv���q��q��������ٳ@i�Ky��T}�BQ�F�]�!!3�,�B!�B!��.<��̙3��?����RRR�ꫯ�4i���h�G�䒛��������d��Z�d.\�����ֱΝ;�|��5�Ν��ӧ5��M�x�"]�tQ�ӽ{w��,,,���&;;[I0�F�D����ƶv��)ߛ��P\\\�Xnnnlٲ���`���HNN�޽{���KI����J�*Oզ�#�B��ӪU+F�U�a!C�C�$:{�,/���m���������bjj�?�����F?��E�����/\�cTT)))���S���B!�BTY�%���ù:P;::ҳgO����Ν;9~�8�ׯ',,��3g2r��
�555e���xxx�b�
����߿�Zm�H�*[eժU�>}��-[ү_?ڵkG�N�4�8��ʉ��(ݻw';;�={���oWǞ={������)�7hР��077g�ȑDDD����,I�Zҧ�8::��A�ڪ2�B!j���=�����B!D���?�Ɂ*�|i���Je���\��ߏ��c]�X#�;��p��Q���ٲe%%%�3kkk�u�VoF�s; IDAT1	!�B!�x|hf<&LMMqrr"00���P<<<���������⋸��SRR�����r7�����ƒ���񕚚��U=-Ĝ9s6l��XEEE�l��_~�Em{FF�F|����`�*-e��믄��(K=(www�ٲe������лwoe{ӦM�q�ƾ�6U!�Bԝ��4h _�%_�U�/!�xR8p���;w���7� &&��T�ϠT�w\[AA�/���KKK���pvvfѢE�klB!�B!��>Ç'++ooo�B�����?��!��<y2			dee����m���'$$�����E�����KXX�6m��֖
6��w��a^�uΟ?ϲe˔���\���y�7X�~=>>>,[��.]�p��Y�/_�[׮]:t(�v���ӓ)S���k�ѴiS�]��O?��7�|CAAo��F�=����2|�p�n�JII	]�v�g�Q����\�|���L�$���L��B!�GTTT}� �x�DDD�cǎ�C��qʻ|�2?��3fff|�:t���T���/�{��̕+W;v��6n�86o�Lpp03f̨��B!�B<��|||����Wm���M��044䣏>b�ԩDGG3r�H��y&N����IOO���Mm?�Ν�����@\\K�,aɒ%�9s;;;���سggϞeʔ)�A�)�e-\��;w���O?��秵"L���Y�xq����&L�@tt4���@�޽9p��YU��>B!��;�F�������w�Jr���\�v�u��q��!


h׮&L`���zRK~~>���$$$p��U�5k�����D__�_2L��ˎCqq1���А7�x���Hbbbx�wj5޼�<ػw/ׯ_�Y�f0�)S�`bb���)kkk6lؠ���+??___��ߏ��o��3gΤQ�Fj���������OÆ
=z4ӦM�ƍ�\����D����۷/^^^+�I�=���P�m޼9���DFF���N�ƍ�{�B!�B<��e}ʗ+����3K�,��_D__}}}ڵk�ĉ��㏫<���
�G��޽{�]�Vi711!((WWW,--������BBBԪ�����8::bhh���>�:ubŊJʖ-[���'  ������g�,\�Pkl���������G�>}x�g����̌�}������ի�j����}��m4hFFF<xPc��bbb��k5!�B!�B<ynݺ���'qqq���r��]Μ9�$z�UXXȴi�ظq#�.]��ݻdgg+K,�w������{eIf'''�tY璒�Z���͛L�<�͛7��_QTT��˗�����ӓ��|�}������SK��*ooo������'''���>��s�~�V�"**���|rss���o�����#>>�۷o���Ǯ]�X�f��ߏ?�H~~>vvvc��ّ��O|||��B!�B�ty,*�hKZqrrR>D��e����������̛7�y��U��ƍ���Ѻ�l�(M����ۻ�1���W#I�2�U���~Ǐ�u�ִm�Vm���1������E�-����رcL�:##�*�*�B���ٳgՒ{�>�[��.P~�����


���f���Zo�<�O�:ń	x��gٵk::�3|�p���	�RU��Zr�*�����Jub.k�FEE���@Ϟ==z��'�����p.^�����~�):t�ĉ,Z��+W���
�ԩSt�ܙЮ];233���!55���F��Ve���ߟ��K�.ammM��������ښ_����4z��Q+񆆆r��yZ�h�'�|B�8u��/�ܹs���h,�Ӷm[����*0eUv\��7QQQXZZ��_ɾ}����R뗑���͛iݺ5���lذ___���ٶm͛7g�ƍ����엔�@�4�V�%%%1r��
ϟB!�B��TN�+??��ׯ��7������͛7'<<\i���Rc	$!�B���?��������Ǐ3g�RSS��Mc�ر#:t��ի:t�ҾG�!;;��m�Vy�K��:z�(�������̟?�/���cǎ�wXB�'�իWY�~=�ϟ��qmmmվ*k߷oP��q�.]�����ƆE�i�������������Ҷm[�.]
@\\�}c����W5Ee����ܹ������]�vU���ݻWc777��)U��Ҷm[

�剮_�����ۛ��ۣ�����+w��a���nݚF�)�ݸqC���ٳ@�L�i�F��B!�BQ�Ǣr�x��Vg�����F��А�K�2{�l����֭[���A��*�B��ǁ4��?�[&��ST1��������OLL�|�
���J��z�G�ɧ�~ʎ;*����w���`>���(UQ��k��


X�x1...XZZ���E������аV�B<����رc�7o&!!�}�Y���u%33��ݻ��kK��p�@�tϝ;W�\yyyJB�ڵkՖvVٷo7o����������k׮j�}/]����*ɣ&��(�7i�@�RGe����|ۮ];�{m�/999@i���Tm�>B!�B!DE�r���‚F�ѻwo>��3tuu+���/3c�֬YÚ5k�9s�<�+�B<�?�,��A����3k�,N�<Y��4ccc����v��>999$&&b``�СC�4>Q�����r�
cǎU�ƍǕ+W��Ȅ��;w���w�1z�h�{�9<==iذ!������_�5�V�KKKS��_;�&��ՠA�q�)��͛�n��(,,��ϝ;w��*�-m�VD[ˆJM��Tg�F�im�l�@��1j�j��yB!�B�t��)�Z	ܲ\]]��B<�������qww���Yy�L!��k׮�n�::DAA�ڵc„	J	��7����	$!!��W�ҬY3����r��|9��cTE^^�ݻ��ׯӬY3��)S�'�+�gϞ=DGGs��n߾M�f�ppp`ƌjOW���j<�|�M���ؾ}��M�.���L�-�'���X�sihh�СC���"66���~[#�����"��<�\�����^��kB5W@@�����ښ
6U�&ʎ��������=
6d���L�6�7n�r�J��ӣo߾xyyall�@1Wv�W�|���I�=���Pڛ7o���-������k}�]!�JLL��Ņ~���n�:���177��hٲ%���;ǏW�Fv��q�����dff�T��Ւ>�֭���Nc{rr2�f�"&&����ʊ?���cǎ�ꫯ*��jr��iӦ\�|�7nдiS�m��ʷ!�B!��I�!��I�&���1}�t,--;v,��=w�ޭ�Є�q��-<==���#77��w�r��%1����B�M��ƍ�t�w��%;;��� �̙S�S��q��M&O���͛�믿(**����DDD���I~~~����W|����q��Me���H|}}����Ϳ��/����3f/^䧟~R럘�P�2<�9�#G�Jo�i{�|ǎ�M��>����������S4jrM�Z����(��������o�%66���{���xn߾M^^�v�b͚5sE�s�~��G����@���#??��������1`����O��݋���#��0p�@V�XAFFEEE�8q�+Vh��߿?.�̙3ܻw��ׯ��ckk˴iӔ��
���~��7N�>���?O�^���ҫW/Z�nͩS����8^|||HOO������t�o�>}�{~�+\uI��ji��Tme�B!�B!���!���֖m۶����g�}ƥK�prr�E����{�����BԻ��p.^����AAA>|�����
*aaa�:u�Ν;��#G����[�n���*O'k+�_����?�-Z(1beeŹs�		�t�͛7���MRR���|���<x�J1��B���e�������Ĕ)S�>�Ǐ���H�GE��ҧO�
c��h׮]�v��?������\���.\�C�t�ر֎�2Չ�����6m۶%))�e˖U�&����`���$''+7/}}}���e۶m$%%)���5{��k�|%%%СC�qTm�>B���ɓ'+]�FWW++�:���ƏO�6m���?�8q"={������?���;q�DڴiCzz:nnn���4�M�6a``�ܹs��fff8;;3l�0v��	�رc+\z�A��2j�U'^Z�jEVV�&M�gϞL�4�K�.ѪU+&M�T�����R�޽����Tm5I�B!�B�t��!�S��̌)S�������5k?��w�ܩ�Є⡨�F���}���O$w��===lllX�h�Ƹ			@��������Ҷm[�.]
T���h��k׮J5��{�V�bb"?��3;vd���|���\�(��QSgΜQb��
]...���$''�˲?~ccclll*���RU=EU%E��P[��aMc�	777��njrMx{{Ӿ}{�e)�ܹÂhݺ5�5������Cu��ٳghݺ��8mڴQ�#�x�dff�r�J�v�J�Ν��/��ʒS


	��ɉg�y��
bmm�$$���obbBPP���XZZ������)����U�?>-Z�@WW�[�n�{�nLMM:th�����4nܘݻwk��Y�x7nLpp0�G����]]],,,7n!!!���V�$j9����A�add�5������(�e�B!�B��4���*z:E!�JuC�6�iӆE�i��*�O#UI��ݻ��kK�P��wrr�:ֹs�j%���,�v�֮��ҥK����5�Ν��ӧ5�i[G��7�nݺő#GX�v-, 77WIqssc˖-cggGrr2��ݣW�^4lX�?��{._�u֮]�޽{�����Ԕ��\��ك��	�
���LM���T�Q%b���({����H��]�v������Qݪ?�T�|����77�S���!�W�^%::������177gԨQ���+U-G���,Y�D�-;;�f͚�����2o�<�͛W阎��8::V;CCC��Sm���o�&M�����˫�y+z�)߮��oU�U�nll���+���deeѢE��}�رcL�:U�=V!�B!���'�������B<Z�jU�s^�z����3l�0�|~!�x�o,���Tv��|҂��%6�FU��W�ߪU�8}�4-[��_�~�k׎N�:1z���kll̀��?����3���Jr���9#G�$""������������gذa����{�nƌ��ݻ),,䭷�R{�z��/))Q^mOh��uP�)��TvM4j�Hk��N����R�wm1��$�_��Gdd$���0|�p>��C��ӫ��H߾}������GGGLLL��0��0[��xk����v�"<<\I�	���77�z�N!�B!���*�!���СC�7\\\pww�O�>u~CK!��-[��s��q^y������}---���$66KKˇ�����ǎ��W_Uڏ;��Q������033������J��T������\�vwww�n�ʖ-[HNNFGG�O���\:;;�Ν;3f;w����JM��A����p��-�X�UA��렬�&�Su�WӦM�|�27nܠiӦj�TK�oB<����æM�prrz��S2��[���닯���6Ւ����-��fhh�ҥK�={��^LL�֭�9�B!�BT�CON9t��Ǐ��!���������o��.\ 22�M�6H�V�7nnnnt�ܹN�B��e�����X��O>��_|�ӧO�b�
�����'$$�����E�����KXX�6m��֖
6�Kt�p�B�+`988����|�	;v�ԩSJLe��T6��Çy���9�<˖-S�sss177�r<���\�x���_t��Im���>����ٺu+%%%t�ڕg�y���s.UZ�jE�=HMM%>>�_�ڶm�5�����999�ر��#G����q���?��\��ꜯ^x�˗/�������Z���rEB��[qqq���-Z�`�رuQ����U�V�޽����?��s�ѫW/<==������<n�>/��23f�`͚5̜9S��B!�B!�6uV9�6ֵB<��3����JY�<##���p"""X�r%1116��bB��2~�x~�����&N�Xi߉'��~���5ʸ0w�\�gU����3������V9&���˅�4i�ڶV�Z��i������8�,Y’%K4�?s�vvv�ƠZ
�<===f̘��>a�����D	m1V�\�5r�HRSSY�j���w��1]��?I�bk,��!�Z�$�P��"b�RM-���O�VO�RR%-�J�Ȋ�%�*B�$��XJ��*Z	"���d2Id5	��5/3�{��{gb�~�9��B�u�ضm+W�d�ʕ��+j��Q�s��)Lu�ܙÇ�s�/>>(ۉ8B��S�՜8q����l�‰'hР���z�

quu���UߡHy���H!�B!�(*��B!
�U�V,^��k׮q��!z����N�:ũS�r]fbb���?NNNT�^�
*`mm���all��533#  WWW,--122���\�"��ӧO�~�����^�x�V�J`` C��N�:Q�NF���
077Ϸ�3f��舉�	��ƴlْŋ+��*�
*P�vmz��ɺu�hӦ�N�*U�(ϻu릵,�ӗ�988P�fM���,,,�ѣ�N���)S<x0ժU���{{{�Ν�S���GaΉ��0�էOLMM9r��v�9����{�~��!JH||<���4m�;;;����رc�T���CB!�B!�(U��$88777e������(4#�h����,R��deeadd��P�/������d���O�z�رcG�o�es���L�B�F�غu�����ڵkY�~=۷o�~��ܼygggƎ���g��#�߄x1�o����9{�,VVV6WW�\ˢ�}L�����B!��ԩ6�Oqh�S��N߂��S�J�hԨnnn��ׯX�W~���ۉ��'%%��U���[o���B�.]J��ܼ��{ܽ{�]�v��k�i-KJJ���Ey�{�n�֭�U��͛0�ڵk�gϞB�u������ev�n�"((���n߾MŊiРݻwg���:w��T_�[xx8111t�ԉ�C��9����1b���o�^�!	!D��u�J�b֬Y8::bff���Y�t)m۶�s�e�J�"--�u������Dy7r�Hv����͛�9s&�좓���δ@B����ؘΝ;���G�.]000�wHB!�B!�/T�HN)
O�<�ҥK̟?333�w�<y�y��q������(����ݻ7�}���0���E�DEEq���䔣G��~lKOO'::Z+Y���v
cڴi>|�H�e�/5.]���̣G�����t.^��ŋٹs'�ׯ�N�:@��EY���aaa��j�
���u��c�05j���	

b�ʕ4o�www���iԨ���B-}��e˖-,Y��%K�h-�Q��2��]�)|����߿��/,X��I��d�;v�j�**W�����շo_����0JTpp0����C�W�����CB!�B�B+�)%q1>�6�߿�ʕ+���dӦMe.9eѢE8p333<==�ٳ'u�����İv�Z���OŊY�pa��ӲeK%9�gϞZ�4�)nnnr��Q��.�ON�y�>\���\_j�X��G�ѱcG&M�D�&M��� !!�+V�������SI􅾥��1w�\���%...̙3���LLL�aɪW����g���?~���`V�\�ܹs�ڵ+>>>t��Y�a
!3g���ʊ={�p��5��ө[�.vvvxzz*ɒ"wu���������-S��Ѿ}{���X�|9&L�]�vz�J���Ǐ���d��ݬ[�CCC}��BL�8ggg}�!�+���J�!!�B!D�����L�RL�>��� IDAT���H^H�u��i"##177'  �ƍ+�,,,�۷/�:ub���DFF2x�`Z�n]�1i�J4I&*����8LMM�׿�EXX'O�$==]k��&����ؗgϞ�%�T�^�
*жm[|||pqqQ^���ܹs��Ç+e#F� $$���@����]鲳����___~��'���055�wXB�044���U��,���H}� ^R��������}�v>|H��ݹw��k��wxB!�B!�eR�IN�O�ĕ��,���ٷo���T�X��M�2`��Bݹ�����\�*����׳�~���/jժ�ᅬ�����/ ""���D?~L�Z�ppp���K���{����9|�0iii��ٓٳg��?��j%Sdgaa���;�V��~P*4}���/gϞ�R�J��Ջɓ'�L����|@�5ضm��]^III���P�~}6n����s��I�>}J�.]055�S�N���/�:u
{{{���JLL�������ߟ�ӧcmm�ڵk����y���s��ǧ,��&&���O�޽�$�hXYYi%j��y�ca�
vkڊ����ח]�vQ�B�ʸq�x��K�.%**��+ҭ[7fΜI�*U��	

�C�Zw߿��k������U�V�8�,*V�H���e�!�B!ʙ��X6l�@xx8��';v��>c�С�Ȑ��U�Vɔ>B葫�+�7o�wB!�BQ(�r�Y???���;���x��)*��s����苙Z��޽{���-[��Z���θq���u�O�>%99���&O�LVV�Rw͚5����N���Çdddp��mBCCY�d�R/55�ѣG�c�<x@zz:?�����:�9s�nݺ�]�t ..Ng�رc9y�$�?�lݺ___�zU�Veذaܸq���YkYTT�G�jը_�>������J���hejML�G�����Q�TԫW�jժi����Kjjj��
(��)�}����	��1cX�z5qqq<}�� ]�#g?��9��l�2���Q�T�����w߱s�N����o�>?~Ljj*�w�V�c{��E�R)IK���ۣR�طo_���e�������.!�B!�~mٲ���'�p��ebbb�4i�+������Z���<��2��B!���*��)۶m`���?~���(f͚@XXX�����*�:ЧO��ۇ����Vݠ� .\�@�V��ĉ���ӦMN�<Ɏ;��!!!̚5���h�;Ʒ�~��#G�z�6m��͛4lؐ���Ǐ�����˗ub�믿��W�
�s�βF��m�6���=z4�u;nnn����a��rMBE׮]��%�d��'grJ�Ν100�JN�oJ�&M��…u�e9�ԩS�����ڗ���sss���{>��c�w����	'==��}���K�ֈ��'$$�cǎ1n�8�,Y���[�n%::�1c�h�7��\����٦�LSG��K���ﰱ��w�aժU���B!�B�c���?�9s���o�;!�B!�B�rEo�d��$���LMMy��!�7o��ի8880x�`\���hݺ5cǎ�is������P�^=������Ldd�2}PTTj���������˗���_x���C�0{�l%ɣ]�v|��L�4I�}MRB�
��Z��ov3g����
x�0@JJJ�۩V��f�ƍ;v{{{RSS9s�U�T�]�v���}��q�����åK��s����ʼ�5k֤y��$$$p��5^��|�S���u��y����ڗ���8::�����'���%..�_����p֬YS�9�s�ci���f���7���)�v�Z�<y��ٳiԨ�����e��/(u��L���#�}&%%q��A����f������www���u��B���}� �(g�sC�g���ON�8���S�u
��U!�B!�B��ޒS�c���|��g���Ú5k=z4���T�\9�u4I.)))�?��ׯ���$�����RW�\Q�߽{�)S�����S/{�Í7hݺ�V��m��W�N���INNV�"rs��M�~NM�6U����hM咓��;aaabooϱc�������NI��9r�ft͔8]�t!!!��G���s��y����$%Fa�OY�˜lll���aԨQ����a������/X�lY�mi����8�5�5k�<755U�g�ܒ&�߿<��('M���x��Ȉ^�zѫW/֬Yöm���Ã�����c��;D!D3t�P}� �B�<`���s��W�΍7�]A�/^��
y�$���#Mݼ^VnmS�V-:u�ĨQ��K�"��-���pbbb�ԩ���R!�B!D��۴>��IrNQ�Wyv����ٳ�y����o��c�������֭[�m��ܜ�s����S/^���,�]��.�h˖-#!!��
������	�s�9��[��&a��ơY�[�KŊ���n��‚A�G||�2�K�ih�7o���!���dee)S�䖜ϒW222�|�2�N�R�;�
s|�j_v��[[�\�i166f�ȑ�Cϓ�K�֨T�R�円��h�.�z��������777v��ͭ[�pss�wHB�2���U����C�(�!^iiilݺ�A���k�1v�XLMM	�?��Ĕ���i������tnݺŶm�>|8gϞ-�vJb������cƌL�>�իWs���bmS!�B!�ȩ\��ϒL���prr�…8p��___
��͛7��Ã
6���C���1,--�~�:;w����2�mi��Q�W�^U�gddP�B6l�իW������^Y���A�I`` ]�v�u.�K�.�q�Fez�����`˖-���q��1

�ܹ����Ԕƍs��UN�>͹s�077�U�VZ�iѢ�>}�ӧO���N�ƍ�F�(����ڗ666��Ʋu�VƏ�����ׁ�'|�4���Y�&�o��ԬYSk�f����"w���Srr�s����q��QV�Z��0��X~��B�LF���]��ѣ_�5...T�^]�a�t���|�d��R��>y�k׮���GLL���Ƕm�
=}��y��Ҙ;w.�V�C���0g�"""d:Y!�B!�%Fo#�ǀ���e˖-�T*�|�M����Q.���GQ�~}���o��������ooo����޽{|��W���2n�8��?~���t�3g�R����{�������dddp��y-Z�����~�~���R����$88�?�����n߾MPP�1iii���{�iӦ@��<�k�f�����O�����[o�HעE֯_OVV���:	��ۓ��I@@��z��IC3M
�վ1b�,!�/��ʕ+������C����1c�־��y)�s��4Cko�Ӕwb�L||<
4�gϞ*�?B��WRR�CQEDD��x����p��
�����ѣ%1�����h:�WQ�J�h޼9_~�%�����_�ܹ��ȝ;w>|�R6b��ܹC``��G!�B!�˫\��2r�H|||X�d	K�,�Z֮]�m��Ą���3v�X"""4h���:�F��СC�={www��*W�̔)S��DFF2o�<�͛��Nbb"������s�.^�Ș1c��}���b���7O�<�����___�:=z�`�ܹ�߂������OC�ѢEv��ʼn'�FɮK�.�ڵ��'O*�E�5��>...XZZ�s��B(�}٣G<<<شiaaa����ߨQ#&N���έ/�R�pqu�ܙÇ��>Ռ ��9'
��7�d�֭lڴ����3a����;�^����双| �(����r1��u�޽|Gd,�wSQ:�޽˪U�8z�(iii4mڔ?��ٳg�#��T*֯_����믿�U��>����T��a4ϋ2
JA�-H<Q�bEF���ٳ���b�СʲAbb"�?�V�Z888��兩�i����uRSS	

�C�Z#t���k������U�V-�!�B!�y)3#��:u��?���0o�<�7o���1���4mڔQ�F��g���v��1t�P233Y�b�RnffF@@���XZZbdd���9lذAkt�3f��舉�	��ƴlْŋ+	(��ccc���<x05j��ؘ޽{���kl���,Y�___�v�J���144�F�t��
___���*U�T�-�*U�(ϻu릳�e˖�sCC�<�:u�5LQ�>}:�����Ȉ��t�p��n_N�4	???�]�6���cmm���ٴi�2�N^}���8���O�>���r���eG���̌޽{�H[��J�*����֭[INNf�ʕܾ}�P�^=�����B!�%�ڵk���ЪU�<o�eϣG����$22����>}Jbb����]zz:�ƍ���֭[<}����d�<y2YYY/4���G3���˗��5k�����:u��*#�����ܨ�SA�ݻw/*�*��v���Q�T�۷�P�"�B!�B�\���[Ҋ��NNNEZ7�3f(S�dgnn�ԩS�:uj��W�Z�\�e!�%+̚5�Y�f8�nݺ�ؐ�����<�zgΜ���ѤI��-[�,P���111Ŏ���GGG�z=>ٕ���gI<�:u*P<��E~Ǣ���G^�U�T��Օ���s��M�ׯ�͛79}�4cǎU��%�F��3�1c�p��u���x�7��B!����Npp0'N��V�Z:�#F�V��iQEٵy�fnܸA�z����ϱ���ܹs̙3�;w�h�

�…�jՊٳgӴiS�_����'O�dǎ8;;s�ԩ�z��4C�a���������R��Y��߿?�;w��c�*7}䵿Y ::��4e���4���"�B!�B�\$��ҧR�HKKcݺuxxx�9��K�2o#G�d���l޼��3g�~����ԙ~H��F��9Z�B���/j�Е���
;�~�v
*�8��hbb���5}�Q���+J�.\��?�v���޽Cü:���b��$''���_��-�3�Aa丗vEq��-���������T�X�
н{w�����V��������J�x�N�����e���Nhh(���8����ӫW/��;�~����ԩS<xx6o�֭�g#�Ι3Gk�[�������C�z�hҤ	,��ٙ���B%�WIǓ��	�uGEE�V�IHH`Ϟ=\�|�_���滽��{��E��wŜ7n�UG!�B!�(.��F���X[[ӿ=FS�I_���Ą0i�$%igǎ�Z��ʕ+�9:���F���������"�(�iӦq���R��"�IKK�̙3L�<???�y�B�_�[�h���
			=z4�Q�N�8Arr2M�4)Pb��ߥK����y��R����ŋ�x�";w�d���ԩSxq�{a������GXXj��aÆamm�L!�ˠG�0�>�}�#����m�V�<��iIIIy��{�ʕ�[��%�ݻw����{�.S�L!!!A��Z�~�
����g#��)��B!�B!�K�Su��������퍑���C*��/�׾}{���X�|9&L�jeȟ�ɽ{�1bfff<�v���Bp��a����Jb���)	���j5��7~~~�ر�u��:9�814��?���۷盜��?���R�J[YK��ϊ+x��;vdҤI4i҄��X�b�������p�B�p�E�CZZs��e��XZZ�Ώ9s�!��K㣏>�w�ޝ;w���O5j]�v-����~�D�ܦdz^2��F)i%Oll,͛7Wʖ-[FBB
6�{��4mڔ�-[h4������ܾ�i�d�,!�B!�%E�S�����!}�|�������;�+++���ǭ[�

eӦM�_�+++\]]�׿�������B�Re``���'Ndǎ�?���ߧO���K����{�.�j�ҩs��}����\�2���{��Ξ=��E��^�:�lz��m���ニ�G��g��ȝ;w>|�R6b�BBB���K��	�?�Zͱc�		��Ȉ���J�!��222���Y�`U�V��_
6��~�̙3ZI�gΜѩkii���ٹs��|�O%�ӧO	���A)�L����r��UeyFFF�SYtݚ5kr��m<x@͚5�����r!�B!����6x!�:�ի�ԩS����ܹs�1���`~��G}�&�(!w��e޼y���;;;���ٷo����]�*��իW��䄝�����o�!==]��}�ܶQ����X��~��ѩS'>��|}}��>ί�0n�8���/_�J�*t,�;���̔��w�3YYYZu������e����X��411�_�~dff�s��\c۵k8::*��e��:VE=�B�Vll,={�dܸqʲ��ٷ�����e��֭={�d�ڵ��l�gϦK�.��у���kM�`aa�oj�쬬�8u�����^ζ�ۗ���y}������ҥ�.�/&--M�킾WSSS	

�C���C���������������!�w��f͚�믿N�.]8t��7�wX/�C�ѦMfΜ���.\�O�>z��w��,^����x2228w��/ۣ֩G���ILL$33�{����W_akk���C3҇f��P�x�������<y2�/_�~�����Ǐ���Nbb"s��Q�SRR����y�6k���K�i�4u�B!�B�⒑S�B�U�V,Y��b_�B�
�=��ӓ7n(e���̞=[�nzz:�ƍ�…JYrr2������W"�~=|���>�H��۷o�ɓ'	���4�׬Y����n߾Mhh()))�T,����j�*@ժU6l����8::*�����֭!!!�n�0}9h� ���ٱc�F��R���<�T��8����/���JbEQΉe˖�m�6�w�}G������Pb��1�w���А���+u===Y�hcƌa�t�҅V�ZQ�b�b�K^Ǝ�ܙ���c�n�JVV���@�ޫ{��E�Raoo����ޞ�'O�o�>
T�����j/^Lpp0�ϟ�q�Ƹ��2|�pZ�n���^:III̘1���p������y�7�nnn���O����5*ߺ�F��СC�={www�e�+Wfʔ)��5jp��}\\\����3ѳ8
Ovy%��t�R��9DFF2o�<�͛��Nbb"�����oA��ܹ3�&>>^g���x���I!�B!īMFNBQ ���T�\9�:���dff����E�y�fnܸA�z������z!=((�.ЪU+���9q����iӆ�'O�c�N�:��s��)���q�F�^�J�����֯_O�z��r�
6lȷMBȬY�����رc|��9r�@1hF�����w���ܹ'''ƌ��qss���T�GC��ҵk�<c,h_4mڔ��~�?�������Zm��ƒ�����
-Z�(���Oab�.{�f�I�&DGG+�4='����'$$�cǎ)w�/Y�###�n�Jtt�r<5�Lc����`nn����L���?~<���Z	��;�s�K^5jĶmۈ��f���<xPY^��jtt4666:�4e�:B蛁�'N�������h�^�����$���'O��h�"Z�hAll,�v�b���/41%��������իW�B�
X[[+�����J]333puu���###���qpp`Æ
Z�{L�>����cddTj���'/���4jԈ�ÇB��͵�Ϙ1GGGLLL066�e˖,^�X�;便]�O�>�����#G�`ff��p#�B!�B�9E��!ʿ��\]]���Grr2]�v�N�:�1wwwڷo�ﰄ��\����V.�k׎9s�0q�D�������LJz���.�/X�ggg"##qvv.���~�mfϞ�'�|�/�����W��GEE�V�IHH`Ϟ=\�|�_�@g
��HLL���()ժUc��lܸ�c`s�C IDATǎaooOjj*gΜ�J�*:wgWؾ4hgΜa���Z	?���QSJs��{Q���k]�,�91k�,�|�M\]]Y�v-O�<a���4j�����K�stt��ё��N�8All,qqq��믄���f�j׮]�}��̙3����%>(S-��y�W/^���gv�)R4u�(d��ҵk�.�L���۷���O�1cF�>�^4��=����U��V���9S�Ne�ԩ�nS�Y�Sags��m݂�Sض5�V����O�˲'�涿]�J�*����~�zn޼I����y�&�O�f�ر��\'�B!�BF�'�XYY1dȐ�nF�2d;v�w"���\�|��� ���X�r%͛7���777�˜���mt
ͅ��ׯжm[��%V$%%���k;W�\)V�7o��%d���֭[����]�L�BBB��2�Z]��_8z��'N�`Ŋ̞=���%��ݝ��0����رcdffbggG�
y����}٫W/V�X�/��BJJ
��椤�p�����ӧO��~�z�b\οE9'�ߩ��bZӦM��&&&ύ���F�Ezz:6l��ߟ/���e˖z_�=.sss�����¼W�߿<� ���LSG�Ҕ��Ʈ]��\�2����w8��+W�0q�D�������Y�t��W�t��
�JŬY�ptt��̌�ׯ�t�R@��O���#G�{�n6o��̙3�g#wYZZ�LY$�B!�BG�'�t�҅.]��v3B!ʀ�M�2�|�ϟ����	f�ʕ̝;�y��`�}�(��&g҂���s��T�r�'����,[����6lH���iڴ)-[�,��}U�T�gϞ�������~�z%9��‚A�L||�2~׮]��fa���ؘ���Ğ={6l{��!==��jM�V�W�����m
�q�ΉJ�*�Znh��l�]�v%--���H�)s���9r$������(Ƃ�KŊ�繽�4
�^Ք嶯�����8222ؿ?!!!l߾�J�'�|"�)/�Ç���aŊX[[s��A�V����˖-[X�d	K�,�ZV�F
�>D�111a��L�4	v���U��;��B!�BQ������[i7#�x����y�f}�!
���;;;|}}ٻw/u���wHB�R���aÆ���o�9s�w�yG)?s�N]KKK�_��Ν;���,�X�ի����ӧ�F�:}��G~4IԨQ��W�*�322��$/fffZS����a�l�BXXǎ��АΝ;续���7o��dذa�4�
ҪW�700@�V���#e_s�E����(bccٺu+�Ǐ�Y���yI.%�0�՚5kr��m<x@͚5��i�0�Y.Dq��j���			!""��w�bggǢE�:t����Q�Մ��2s�L>|�_|���W���h�����õk�HOO�nݺ�����驓,(JO������b���L�0!ߩ
�B!�B��xa�V�������/!Ir+�*V��|��0����ݛ�~��ŋ���͛�����ŋu��у
6����̙3y��7��

bӦM��ڲv�Z��III��B����
6������Z�h������J�_;Ǐ�W�^\�z��*�)))XXX8���,nܸ��_~	@˖-��׮]��e��j5o��6իW�7����:t��ɓ�۷�K�.Ѯ];�4i�k܅�5jp��}�o�ΠA�HNNֹ{���WaΉ�1b������C��������Ʋb�
�Y?h�|/�¼W�5k��۷�~��N�&�&��GBד'O�ׯVVVL�<�#F���;�W�ٳg�4iQQQ�5��K�R�V-}�U`����������PȱB!�BQ�^Xrʐ!C^TSB������(E���t�ڕ^�z���J����/5777~��'~��wF��o�Q�Fq��!Ξ=����ֲʕ+3e��&���KKKv��Y�F��/��BRR�G��Zfee�U�[;DFF2o�<�͛�����D������6��+���S���&J�ca�2�A�q��I�-[�L/�]Q����m۶�r�JV�\	�k���^�9'��G�xxx�i�&���өӨQ#&N���.�^P�y�v�ܙÇ�s�{||<P�	=BT�\����ի��P^9���s��e�ڵ�oߞ�Ǐk��$�B!�BQ��q��B�\�T*:w���뱱��w�aժUܹsGߡ	�R211���'''�W�N�
���VF�066Vꚙ����+���ann��j�}$��ӧS�~}���HOO/TLU�V%00��C�R�N����S�#F�`Æ
�����Ό3ptt���cccZ�l��ŋ3f@����P��kצgϞ�[��6m��ԩR���[�nZ�r��0}����5k������Bk����)S<x0ժU���{{{�Ν�S���GaΉ�0i�$���ppp�v��bll���5�ǏgӦMʔIP��
�^�ӧ���9rDg;G���̌޽{�J��唜����oILy�������x��7	��o��رc��"�B!�B�r�@�V�Kr���������l������S�N��m���@�N�:th��+Dy���g��͹�/���L<HPP[�n����8::���E�~���eFi�+99����S�^=v��Q��Ԏ9”)ShԨ[�n�w8���{u�ڵ�_���۷S�~}n޼���3cǎ���Sg[/�7Q|���۶mc���>|���dzz�j}�%������s��i&L������+m�}L��CޏB!�B�r����G�/..???���P��6kk�\��B������z��W�^�Y��~��͛7+�)B��nݺ�R��5k������q��u�.]
@۶m�a٦R�HKKcݺuxxx�9"�*�{u�ȑ�޽�͛73s�L�م*KKK�阄�HKKcǎ����g��۷/������W���n߾���7���t�ޝӧOӲeK}�<Kf{����������B!�B�B��|��)�IKKc�ܹ<KKK\\\�3g�����8��,111���U~t���ۗ-[��d��,Y���F��T0"w٧𱶶���z�F��
�^511a��L�4II�ڱc�V��r��/,nQ~ܺu�f͚���F�^����oqvv�Z�j�핗����իY�p!��愆����U;v�(�)B�ɐ!C�ر���B!�B�B+3�)�1�Nyȝ;w>|�R6b�BBB���K��	!D�A�N�hذ��C�\�9s&VVV�ٳ�k׮���Nݺu�����ӓ:u��;�2�N�:<x�[[[���122�wH�%U��j������b���L�0�v��=�-�L�c``�RM#WnF��W�~~~������_�<x�O>���~���ӧ�駟R�J}��e�ĉL�8Q�a!�B!��)3�)��$����3}�t���Y�v-�lX���׳�~���/jժ�ᅬ��'���lܸ�U�VѪU+6lؠl��ɓxyy�x�bz�;99q��-|||�={6�M������r��Y*U�D�^��<y��'����믿���ä��ѳgOe{٥��J��~|�װ��%44�V�ZB�)�/�Ǐ��'�p��]�w�...rǯ�044����!22R�!�WDQ߫��ggg~���2�l����o�ȑ#_`4"?IIIL�6�-[�п~��G�x�
}��+777������,WWW6oެ�0�B!��P�Er����/���JGzz:�ƍ�…J���d�����Ϗ޽{�j�*P�T����o�>~��g%9��ܺuccc�t�gcǎ�����[�n%++ooo�Y���ѣ�y��O?�ģG�t��w�^T*���:����9y�$���cРA��+!�xUT�\���$���æM�?~<&L���	www���CŊK�m}��-w�!�(I/��}����W�\!$$����N������C�HKK��חE�Q�~}"##y�����sU�XQ.��nnn�A!�B!��\%�4i҄�����

�…�jՊٳgӴiS�_����'O�dǎ8;;��[oq��9N�>���=���/��Ǐ�\�2������;JKn5jĂ�[�.�ׯ'  ��*�)�6m��͛4lؐ�?�kkkΝ;Ǽy�t�
�����2MYtt�$�!D>*U����3������DDD���C�%44T�!��(�w�!��ɭ[�'$$��'OR�n]�
Fǎ���Ǐ?����ӹ}�6s��eڴi�oeݐ!C2d���╳}�v}� �B!�Eb���mmm��+pww��f������`mm���M�4a�����\׌�����ĉ���0`�?~�ѣG��=z��f�J�*)w+���(�:��ٳiٲ%+V�]�v|��:ۺx�"�,�%�ƍk�B�|5j�`̘1DEEq��U�̙Sjm��jI�(!e�Ns!�xUiF����ӧ������%�޽{>�*U�P�F
F���}�����׿�E�*U�����Ã��������Cf͚E�&M�T��7��ۛǏ��X�8��ֹs��ݻ7U�T�V�Z�?^!3{j�dee1o�<�5kF�J��Z�*vvv|��w�틂�t��.VVV,X���-[�w�^n޼�W_}�[o�U"툒u��e��}H�HLL��O?-7�)B!�B!��U�FN�$kh$%%���k�+W�ЫW/���K%9e߾}T�T	///v����?�L�^������Аnݺ�GӦM�����5nܸ@�֭���m�����P�jU�e�2M!�����Fn222�P�\�9"O9/.!Dq|��'���+���ФI���~��WT*7n��А��@��7lؠ�

��ѣ���R�F�\�|��1=z�P��Z�c�ݻCC�{,�gQ��ѣ���S��v�Z233���i֬Y|������tbbb���!%%��S��nAԩS�Z�jN�~��T�R��'J�Ç������/i޼9�����s��E�5k�U��*�{���cAb�~�v�������ЩS'�Z*�!�B!�(}z���KkA��漃�yw�?|�x�c��o��ٳg��>��cǎԨQ��m�r��QT*.\�M�6y�P�Q�bE�yn�4q�/�����s�虽L.4	!D�P�ռ��[X[[����|���I���|>k>�5���ә:u*��=*T�O>a�…ܻw�	&�s�N���qrrb���J��f}�J������T�T�~���l�2,--�Gs�#<<��7obii���s�Υr��:q5΢�u��Y�N�ʱc�011aȐ!,_��*U���i��Ӭ�,,X@XX���;��ƴjՊ�>�OO��WA�.]�wB�r*�}'O��̙3X[[��_0o�<���x��ILL��ʊ�K���g��s�N��w��͞={�ٳ'�N���͍���+V�����+8u�;vd�ڵ�jՊK�.1v�X~��gt�5΢�լY36l�@�
X�h�-�~����Z��@I\�駟�ѣ���lڴ	///V�^]���իV�m�ҧV�	

eڴi�������رc%I�L�6�Ç��$Q0qqq����Z�fذaX[[ӦM}�&�B!��(�%l������:/�۷W�o߾P�\\\��۷Wߺu��S�o�^���n߾�z�֭J|�˃���l7�8r�2Dݾ}{utt�V�����:u���n߾���ݻ:۽{���}���>��'�����U����k!�"##C�q�F�������H]�Z5��ѣ�Tgff>w}@�o��1c��G``��C�:�F��Y���:�7n���~�m����mmmu�Խz��ڟ��Y��j֬�S��?֪���V��3f��u�^�bEa�K����B���٫�|��Ϥ��(�gΜQ�>|���C�w.�}������M�m��ju�֭Հ��իZ�^�rE
��w﮳nQ�,J[������w����a���V����WjGGG��+Կ���� 233�QQQ����k�(����ݺuS�===�����C*���}���ݔE�*�u^��j_�R����ꫯ�2___u�~��*����+O��Q!�B!��Uw��r�G�x{{���Hff&���㫯���֖q��)u�}�]

ٺu+��c�Ν;P"���{���KFF�ϟgѢE:u5��^�~]g��,�P�B!J����ݻ���$�ϟO\\=z���_gٲeEڮ�4.\���FFF$&&�R��?>@�w�?y���h7n��i���w������SΟ?O�.]���K*΢�լY3.]��J�����~�о�\�V+���i���RSS��oX�zu�}!��dd��4�4�-[�T�W�R%��^k�����oy�s��e�4i�����x�78w�\��Y��Z�j�<�����x�����111a߾}L�6���zT*U�����1c�7�[�nDGG+S	����f„	t�Ё��tN�8��u�U���C{almm��r�(���@�ܹ���Õ�#Fp���i�B!�B��:9eԨQ4nܘ�g����Nǎ�ӧ�6m�r��L�2E�[�fMڵk��Ǐi֬u���Q�F4hЀ��,�7o��)
��ݝf͚q��mƌC�N�9r$͛7ש�I�����Y�)�ڵk�cB��z��1e�bcc�����������믿�u��T�\�ɓ'���Ʒ�~K�f�011aƌ�^l��ox�066���^I�ضm[�mj�t			�M�6T�P�-Z�a����J,΢��z�j�|�MLLL������s������Ϗ;w�0~�x�j5׮]�w�WE����<�Q�G��777�u^S��3*�t%�$���^�ǃtʊgQ��>�l������ùy�&t��YI�lРk׮��͛,\�ڵkǶm�������̙3ʍ�|������kkk�mۆ��?ǎ�$�\ܽ{�y��ѳgO���pwwg߾}�&��T*V�^���vvv��ߟo�����t�N�u�����ʊ+�ׯ�:u�>���W�>:�?������ӫW/:u����É��ԩw�ƍ�������˗癨V���u��=.\Ȼヒ��=s���3����9F������S��,55���P:t�~��k�akkKhh(�����&!�B��g���z��?�?*E9�
3�r��䐱4c���f�af��i�9]F���p��V�2l�rs(��&9�fF����,���;�
E|��v���}ޟ�������z���#Vl��O/�r���g�}Ʒ�~�ŋ)[�,M�6eȐ!�'�<==���Γ����5k�솟��
˗/g����ڵ�?����_~???�o�n2��ˋ�?�����ӷo_�m���\�r�o߾H���iР�����4���zҼ�k���`ǎ�ر�)S�����ȑ#����뾏;c���ȃ�޽;�W��:x���X����~��wܧV�Z���s��Yj֬Y$q�����y�wx�w���X�~=s��a���2�_~��O>���ݻL˖-j<��:t�aÆ���1u�T�����;�b�?�`��?�8ǤI���MOOgȐ!�<y�8���DPPǏgɒ%XZ��Wׯ_��w��̙3Ʊ��d��ˆ��"((��hJJ
����ҥKƹ�O�f�ԩdeeѩS'>��M�INNf͚5\�v�XŰ(�Z4���T@bb�q޶m��?h}����jLDپ};iii����9���;QQQ�ر���z���GDDDDDD̨�$����W*T���ѣ=z�=���퍷�w��1c�0f̘{�{�8�/[�,&L`„	w�[�lY|||$11�jժ������a��O�/�DD����,�����y�=i���ŗ_~I`` ������1o�<���M�=ijԨA�5���<f�~��"=ޠA�X�jM�6�СC��{��u�}�|�MfϞ����/�Q�F\�t����3o�<���z� IDAT�m��ݻ�$������999���899P�NΜ9�ҥK���ՕӧO��تU+Ο?_����IJJb�ĉ�\���m�r��Q\\\�V����qttd�̙ԯ_�cǎ1y�d.^�h2wժU�<y��
2i�$�ԩùs��'**�M�6ѵkW�����R��!(��+Wr���U�Ƈ~H���9y�$S�L���ӬX���C�¥K�pqqa�̙T�\��>���7dLN1���0a�:u��‚cǎ1x�`���Ϙ
S��ת0q}���$&&R�zufΜ���ǎc�ԩ��A�ڵ	

2��	��h���Tr������H	S��<.���GժU	

5���������#�;���O�j�LZ�=����/��gϞ%'''�+33���{�k�4��� **����s�ʕ%����y=��3�l�Z�nMBBnnn�����>&L��ٙЬY3���qpp`޼y���1��"��a����OP�^=���yC��B�
�.]^~�e�VR�SJ���L�ϟO������o	g׮]Olb��MK�:�������ѨQ#���iڴ)�'O�sܝ;w���VVVԮ]��ӧ��F�~���������Ik�;�5j`gg������lܸ�8o߾}|��w����u�V.\Ȝ9s�m� 
s�
מ={�4i
40~�&N��@�����$�����[���o�a��������JN)lmm�>}:�6m"))���$6m�����)S�����|�^����믿6��5k�Ν��c4�Ç���������9���?�����$''3v�X,,,x�W�;�G���z���Ʊ:u�`aa�'�|Bjj*��������XDD�x�ꫯx��ױ���Z�j�;�ݻw�g���z�0r�Hj֬I�R��X�"]�v�СC&-���Xk�…Ԯ]�R�Jq��5z��ͤI�����nݺ�)S�2e�аaC&L�@HHH���<z�|�
���L�2������ѭ[7s�Ub�_�w�iӦy�&$$йsg�$CC5��`h]c�����c���իw�c^�t��}�ҷo_fΜ�ڵk�m�nOz�����;�r+̵*h\��K�5��������������a�0GDDDDDDJ����IЬY3�ʼy�6lX�7dDD���6mӦM3&X|���l۶�@%��cx�vy��/�4>�}���yQ����Os��E�իG͚59{�,�ƍcȐ!:�X:�𤹈�<�ܿ��/J;^�R%��͂�koo�G}�G}T�};^�kegg����'�֭#%%����̙��o�m��"%_BB�F�bÆ
t�҅M�6Q�Ns�U,�N�(H�����ky����>���Z[�]�ܹs9u�իW��_�N�:4hЀ�ݻu���V��p����ݎ����N<7\WK˼���
z�EDDDDD��PrJ1���c,�,""%ׅHNN����+���ǎ;�R�
>>>L�2�@O�Ϙ1��7���H�
hݺ53f��矿�x�Z.��Ϗ�����O���5����9y�$�=�o���Ǐ/��)
˗/����Օ�c�ҳg�|[RH�u��
�͛G@@���ٺu+:t0wX%V�����9z�(/��q��ѣy�:88p��96oތ���C���ё�g�C�-��111�X�y�~��WN�>}�VN� (({{{c���*�D��Q�kUи�W�Ι3g��pww7n?~���'�*U"99��W�R�R%�mW�^5���Em}DDD�SNN�ɓ������T�^�����������BÓ����?��s��)i��1
O�={���._��ƍ�$��oaNjz��={���?���ARR�q|��|���ܸq�7np��1�����"""�Խ{wN�8ALL�ǏWb�cf�ƍ4hЀ�s�2}�t�?�ĔԾ}{8~�8�����rk۶-~~~��ő����˗Y�p!nnn�6��WE
C{��jӦ
�����ƒ��Ill�1��^z�8�U�V̛7���dn޼�ܹsqss3�¼��IOO'..�ɓ'ǯ]�v_��0ת�q�����m=O�8��Y��d��m��k�j�W+%)~T9EDD�:v��իW����gggs�$"""w��ߵ5OŊ�X��#�H���xF�����ٳ'����;��{�f۶m�={�����un���ٳg�������l+S��F�2����'%%oooؼy��|C����������ݻIHH`��&sjԨa2��;�s�Nbccy�7L��{Ə۴iÖ-[�:u*S�Nͳv\\�IE�Q�kUи|}}ٵk���4ȸ���+OIaֿ�V�Z�w�^�?��嵡Z��IB""""""R2�r�����X�ooo�_��I)s���NU�J�����жm[�V���ӧ��<"ׯ_g�ر4jԈ�~��={��ĔB���6&}�fkk�����ܹ3���(U�NNN̘1��r�����XYYQ�BڴiÊ+L�h�3�jժaeeEzzz�c._�<���t�ޝ*U�`eeE�*U�ի+V��B�
ƹ�*U"88OOOʗ/���5���gΜ9t���8o�رxzzbkk���

4   ���v��B�y'��V���Ɔ�˗ӭ[7�����}�����=�w��兝����ϳm����+W�XyGDDDDDDJ��"�kF�޽�7#
���Ëry���ݛ��~���P�{��^�������o�eժU�����㣯m3��?شi�W�f���XYYѩS'z���k��F�ҥ��<D999���1v�Xn޼�̙34h�J=مgs���0KJJ�S�N8::�iӦ"?��˖-#00�/���jժ���H׮]<x04s���(�>��������Gvw�{��j)���ʊv��Ѯ];>��6n�ȕ+W�����iٲe�3���tڵk�g�}F׮])_���C�G�ȑ#>�0p�@f͚E�ʕ��c�u�֤��1a�<==)W��ΝcΜ94i����9��׏�������2n�8�V򅃃C�vA""""""R2<��|||�2"""%������1#WWW�����o+)�	r��e�N�ʲe�x����Vb�#бcG���fϞ��ٳM����[�ȓ��֖�ӧ3b������M�X�heʔ1st""""""r?zrJDD�-z�ˈ���Ã�Ç�;��5k�J���LJ�ի�;��Ƌ/�ȋ/�h�0����f���L�2kkk����۷/��0n�8jԨ�֭[��_HOO�g���_d�T�R��!��5k֌�C�2o�<�
FӦM��������ܯ��������u�x���R"�[�n����C�X�z�*���L�4��_~�>}�����SO=e��DDD����xV�^͎;ػw���8�?���;ƈ#�2e���z�,--UmW�I_#""""""�����b�����P�޽��H�1w�\>��C�n�����ϰa��ԩ���t����!�������Y�v-�W�����ё�ݻ����$�'XRR�ǏgժU���=zs�%"""""""�س4w"""Rx�K��k׮�_����$>��c����6m��C1����ӦMj֬ɬY�hܸ1�v�"!!��>�H�)O���t�ϟO�z�ػw/_|�;w�Tb���������#��*������aooϠA�4h7n�0w8"""fu���V�ʆ
�С�K�6wHbf;v�`�ȑ�={�1c�0q�Dlmm�����������ONqss ::�8O�z���X���[�ҥ�Y�&�{���_/tE)��xyy���L�z������˳��ӧٱc�����ű}����
�СC�lْ�ݻ?pl""��~�r��I�V�JŊQD"""��رc���ΝcԨQlܸ�7�|�����<���뱱n�:�v�j�0D�8�֭���6w""""""���'���w��N~�_��'?��#ӦM�\�r����f�#?�/_&22���H~��W�����o�]�9r�%K��v�Zrrr�ѣNNN4n��ܡ��<t#F�`������k��ۗ�;�r)rrr8p�?�����g�p��q�s��a�ܹԨQ��[�ҡCs������Ѓ"""""""R`O|rJ�$��{��u���>��c�l���^��S9|�0���XZZdz��9|�0�<�����#��7n0e��u놃����L�<�u�֩���<�6n�Ȇ
����y��yꩧx���ӧ���XXX�;DǏ',,�իWs��Y5j�����1whRmܸ�Q�Fq��ef̘���������j�0DDDDDDD�)6�)Eծ���X�"cƌa˖-�:u����e˖lذ�cǎ���j���%55��m۲i�&3Fxg���\�x��={�z����ի	f�Сf�ND��+W�}���o߾\�p���0V�\ɧ�~JÆ
9z�I⡈��9�;w�իW�z�jbcc�Q�=z�w��&?���<y�Q�F�s�N|||�׿�e| A�ޢE����0w"O,�n�0DDDDDD
�D��);;�e˖���͋/�H�֭y�w���/X�r%nnn����d���(���عs��x�Νqsscǎ���c>���o��ƴi�h׮-[��gϞlٲ%�x��Ҙ:u*�[���ӓ���|333�}z=--�ŋӹsg^|�E:u��ҥKIOO�3w׮]2�6m�вeK�x�
�͛GZZ��<�e���*���L�<9Ϝ۵h����H����/�_jj*�����_7Ƴ`��_��gnab*�5IMMe͚54oޜ*U�ǫV����k֬!55���-"�qttd̘1���˸q㔘"""����Ù7o����۷�_~���s�*1E�HMMe̘14i҄���}���j�*%�<d�fݺu�C䉴n�:>l�0DDDDDD
��TN��%K��r�J���;Ʊc��?h߾=�-�ԩS���agg��;��oh߾=p�m΅�����ã@매�Я_?.]�d;}�4S�N%++�N�:�̟0a�1Q#--���02337n�]����!%%����РA�����2��'Oǒ��

���,Y��K�O>����@�����Y�f
׮]cƌ��y 11�8o۶m���w��y��XZZr��J#XXX䛜r��u�}�]Μ9cOXXQQQ?o���0�d��������8���DEE�c��z�;���������7w""",[��ʕ+cmmm�P�����aժU�?���t>��#��D�G���G�}D̠w���ADDDDD侔��66l`���<x�}��1a�֮]����?�<YYY�������޽KKK"##�y�&p�_9ܪ�aH�0���Ptt��}HH�.]��Ņ
6�o�>�|�M�����{�����ٿ��}̷�~��*����Ѽys���رcVVV���{&sW�Z�ɓ'iذ!aaa>|���p7nLTT�I+�իW�e"##9p��~�)���7����ILL�z�ꄄ�p��A�/_�O?�t��T�Pggg���|�2�.]⧟~�瞣bŊy�Y�r%gΜ�Z�jq��Aqtt���ӬX��b*�51Tz�_�~���rW���L�>���o�>��������P����u����S䎎9B�V��߿?]�t!..��C�*1EDDDDDDD�3۝�ۓ2�k�s��!�$44���p�\�B�n݈��6&*�J>̵k��ҥ7o�4�B6$��m۶���;v,5j���???���ٸqc��'N�v�����LI�beeE�&M����mr]c{"�������v��L�>���о}����pqqa�֭,\��9s����ٳg�&M�A�X[[ӴiS&N�x�8[�hANN��B́���1���͐����G�F������ՕI�&�{���0�$>>��5k�9N�Z�L戈H^5j� &&��_~�g�}???N�:e�DD����f�޽2��U���k��;$)�.]��ᅬ��DGG��'�P�res�&""""""""�P"+9r$�K��СC|��G��у�� c5�v��oN���>�K�f�СX[[��7���S,--iݺu�׿p����+��{��SO=p�'�
Zv��M�z������^˓����@�ΝMx�v�
�j5dp��%���K߾}�9s&k׮5�����1�;�<�52Y�I�&w=GC�ۓSn��Т'w�x�:�k\ؘ
sMRRR(_�|���sDD$�͉'���aժU��������LFF��C�b&&&�q��Q�V-ڴi��?~<{��5whR�dee�t�R����ꫯX�b���U���+D�pss#999϶�������[�9�������3A.���a�œ�\�����3z�hF�Mxx�ODDDDDD�(�-9Ő�q{��;�{zz�u�V�N����+7o�d�ҥt�ؑ���P�J\]]���#%%�={�ТE���iҤ	���q��I7n���}�c���(Թ���j>�j�3e�222ȷ
��I%���"�ܹs9u�իW��חiӦ�{C�p���.U��]�ruu5&eddp��ac����/i�01�>���z6��s-"�$rqq!  �_~��o���F��jժ{��!""O///�4i�_|A�>}8~�8G�eܸqԨQ���I	A���5j���'>>�>}��g�'���'O�̳�P��pO&���'N�09NA}���ݻP��ˑ#GX�d	cǎe̘1,^���[DDDDDDĜJD����ѹsgY�r%����ڵk,X��8��ӓ��lBBB��?�����Ã�7o�駟r���B��x�g�*���3}��!''�]�f����͛7�I≎�&**�8�СC1r�H:u�dr���L�W��?�`����Nlllhڴ)���lذ���T5jD�2e�����熈���
Sa�I�J��z�j���sDD��,--iӦ
AAADGG�D""bb�СDFF���?3k�,4h`IJJ��ח֭[���Oüy��)%S
����ݒSI$���3�w��ܱ��jO7n�`ʔ)t��
�f���ܸq��ቈ������D$�t��777�����Ҩ[�.NNNX[[��XZZ���SZ�j��իhӦ��2�b��.��͛Grr27o�d�ܹ�����o�Y����R�Z5�\�����M��j������#++�˗/�p�B���2dH��<x���t���<y�qܐ�ҡC���������ĉ̚5랱Z�ТE�;�5\sbcc���$66���^z�%����T�kbh�t�ܹ<�1��u���NLLǎ3w""�u��www%/J������'''"""X�~=۷o�~���M�CQ��1�S唴�4�9�����vvvDEE���n2���)%Upp0/^�gϞƱ^�zq��E�s)����뇿�?�g�f���&�no#S�R%�6mJtt4��գJ�*ԬY�����?ggg�*���ۓ�����7l޼�w�y��;w�o�a2����+�3[[[�M���Y�no���>�,���gϞ=������k�_�2e5j��}�6mزeS�Ne�ԩy։�����___v��E||<�
2n����7��v�d�K�.���O�~�ؽ{7			0�d[�5L�
Sa�I�V�ػw/Ǐ��~�P��$):,���?�q����ۗ=z�j��H����e���°��!44��!�cd۶m�9���Əϸq㰵�5wX��VJ���Y�|9;v� ))	kkk�ԩC�.]�ڵ+�WRɩS�L�EFF���ѲeKv��Mtt4�������ř�����3fNNN,[��$�ۓkrǼk�.֭[G\\7oޤr�ʴiӆ�C�bgggcZZ�ݻ�2e�кuk���{VpMKK#00��;w��S�re^{�5h�V:55�5k�мys�0��U����ƚ5k�ӧ������������)w+�����ԩ!/�� IDATSqvv����ԩC�����?�i2���țd`��r��>cƌ�Z�jXYY���T����xzzR�|y����_�>s�̡cǎ�u�wӴiS�w�NVV���7��+W��� |||ppp��ʊ
*ЦMV�XaR�c�رxzzbkk���

4   ���v�Z�V{��˗ӭ[7�����}������3κu�R�bEʗ/�'�ʗ/Opp0ݻw�J�*XYYQ�Jz��Ŋ+�P��qnab*�5�����Ύ����9���)W��۷��y��Hᅄ��w�^^x�f̘A�5�С���\�~��ቈ�]dgg�{�n�}�]�V�J�nݸ|���g/�u�����y��pqq�ԩSL�6M�)O�%K���g����@FFiii;v��3g�z�)�U�Fjj*����q���H�ʷ�{@���9{�,iii8::��SO���`�RSSM�:��O>a���DGGs��u233INNf͚5y��[_�n�JZZ)))|��0�����3d�BBB�p�$%%[8ggg�n߾���4c2�����IKKcǎ>?��f����S��w������9-[����@���K�U�@bb"]�ve��8��ʝ��nJ�~/"%ǟ���͛Y�j[�l�lٲ$&&�y�TDD�+''��cDzz�j.\�@ӦM���gϞ��Eč7`޼y<��|��GJz*���ܕFM�6\�~�ŋ���FFF[�la���8::�i�&&M�Ď;�5k^^^t�ؑ�/�u�V�~�i._�L�ppp0��_3}�tڵkgL1�бcG&O�l�D�;��Σu�֤��1a�:uꄅ�ǎc��/_�o���d�*U�����ƍs��)�L�Bbb"�.�~���t�R6lȤI��S��Ν��ߟ��&O�l�*3j�(��������T�����<x0�[�f��w��I�#"""""RBE��)"�B�~��Z���졡�888�i$""G�ҥ�֭_~�%��Ʉ��(1ED�����ʕ+8���8���{>��%�H�ذa���|���|��9rD�)�777�׽�og�~044���p�\�B�n݈��6&�ƪ�'O�����ŋ899���O�*�:;;s��~������>��5i�S�������Ņ�[��p�B�̙�o5???�7o���5�52V�5$��g�Ν�����䄕��k�f���lٲ�87>>���:�Z�j��1�R�@�Q���e���1�>}��i�&-ZD�2e���ȓ�bŊt����a����;y̜<y��Ç�{�n|}}�3g�K���#G����C�q��!>���������
4�J61��1��1����ԩSDDD���r��	��ogH�(�K�.1j�(N�:�g[~Ճs'帺�p���;����p��O�>m�8%%��V97Øa��������9(9E�8͚5c�С̛7�aÆ�)y+""����Ӊ���w��t�֍r�ʙ;$�����ׯ�\�r���������ի|��,\������H^|�Es�%E,w��������ӓ�-[�g����+�=�ҥKY�jÆ
㭷����KKK������&22�?9�?����Ջ�~�	c���j
�ܹs9u�իW��_�N�:4hЀ�ݻ�;�����!�����kܫE��ZǷ��[$�0�;�GI�)�D�������a��H���K���2d�����7>>>xyy�f�����q�_�5aaalݺ���y�rrr		aҤIddd�x�b
��/�E*T�@�Ν�ܹ3'O�d׮]����`�cr����j��̙3���p��1*T�@Æ
M����BŊ���!&&���tjժUd�$:@PP����9sƸ=33�R����v��	�4ib|����P�z�;����s�ؼy�=+U�T���d�^�J�J�L�]�z�8GDDDDDD�\t7HDDD��W_}�
6p��>��cΝ;�o�A�j�=z4׮]3w�""�Vvv6۷o���T�Z�^�z���Ʋe�HNNfΜ9�Qc?�����8�7�|���8����W�.]pss�/� --��u���������\�V���l����|]YXX���NVVAAA&���∡���<Hzz:qqqL�<�8��{�?���Ǐ������ϬY�h׮��m۶-~~~��ő����˗Y�p!nnn2�8�^�z�;w.�qc�9"""""""��)"""R"T�X�A�1h� Μ9Chh(;w�lٲ�MD�������ח:u�0c�z��AժU��<�.]�����}����|��w&#D�ӯ_?����={6�g�6ٖ����_�5��U�V���Ã������(�~���ޞ�����qpp`��ʹiӆ-[�0u�T�N��g���8���Mb�߿�ɜz��ѻw�;�ۿ���Cll,���&�ʔ)èQ���[�j�޽{9~�x��u��q�VEBs��J"""R�Ԯ]�)S��o�>���kkk~��G:Ĉ#��"Uff&K�.�nݺl޼��+W�o�>%�<�������.�\ooo�N����3666���P�N����?��O��
40~liii�r��-[��ֹ��1c�P�Z5���HOO`�رxzzbkk���

4   �A��v�Z�cL�4	///lll�X�"=z�`���.]���+W��� |||ppp��ʊ
*ЦMV�XaR	���;;;��ߟ�8���\�r�o���_DDDDDD�(<��)��""������!�H	��wߑ��L��y���dff����q����#�H�T���cĈ�<y�#F0u�Tʕ+g�/i�s��t����6hР@I/�ʕ�СC��!�qOOO<==M�ʗ/�����Tr��ʧ0�T�P�ѣG3z���[�lY|||$11�jժ���HLL������y�zr������{yԨQ��!�H	�e�f̘A�J��ѣ����h���a��<���������ؿ?�˖-3wX�p�cƌa͚5xyy�f��j"����׏�������2n�8BCCqpp��HDDDDDD�QS[ylM�6�_~��Q�F�k�.Z�lI�z����9s挹�)���4֬YC�Νqpp`�ȑT�Z�
6�p�Bs�'O���t�̙C�z�8|�0�ׯg�֭JL1#[[[�O�ΦM�HJJ"))�M�61}�tʔ)c��DDDDDD�	��+�DDDлw��<|||

5w"R�ԨQ��'2q�D���{V�ZŒ%K�>}:���T�Z��!����ŋ�S�7oޤ]�v|��gt�ڕ��˛;4yBm۶��Çs��y&N�Ș1c���5wX"4k֌�C�2o�<�
FӦM���������#HN1���yTK��cHIn"R�5kF�f͘7o�Rb���U�T��O?�]�vT�R��������|�lڴ	ooo�����)�|||���1w"""""""&��GDDD�8VVV�j��s��ӕ\+"�Lvv�]����(1E��ƍL�<�F�q��i���֯_��)0%������c�…ԭ[��ӧ���?�;y�;w�����y�.]j�pD�n�:���Y�d	~�!G���W_5wX""""""""R�<��)nnn��������ٱr�Сnnn$''�ٖ��`<������[�9��������k�:��=////F��ҥK9}�t�sN�>�ҥK1b^^^��֝�Dxx8�G�f��ф��Ad""�8�ԩ]�t�?���=����,]����s�&"%���ҥK�����g�e������Kxxx�;4'O��W^�G����+�:u�>��R�Yw`y�<��)�}���������u�/���lll����3�ĉ&�)�=�˗/IPP�������

"22�˗/�Zӑ#GX�d	cǎe̘1,^����s�%""Ő��3���'!!��۷S�NƏOժU�ڵ+����QDJ��g�ұcG�U����Y�&�7o&))��K�Ҹqcs�(����?F����+W�^����`�Ф�	���B/��zį��0s���/O�#O���&���P�kР���3>�v;CrJ�޽	&""ooo�9���{%�<��rtt����dggci�WnSvv6��g�ɷ�Kqp��
�L�B�n݌7V����<y2�֭�������Hqdee���'���\�~�/������S�res�&"%��O?���-!!!t�ܙ�e˚;$9993i�$���������M~�1>|8]�v5w"O�5j�;�B+6w���eKqw��)iii9r;;;�y���숊�"==�d^A�S��-[r��5�;f2Kjj*-Z�0K\�ŋ�ٳ�q�W�^\�x���`3F&""%E�r��e�ƍ�.]���H	R�lY֯_O�^���"�Ntt4���<���z��~��A�)1EDDDDDDDD�L����������ٱcIIIX[[S�N�t�B׮]Y�r%�-�aÆ�X�¸_TTC�%  �����;w�̅�gҤI���q�'�>6T ���X�t)���\�~�Z�jѷo_:v�'޴�4fϞ͞={(S�:t`ذa�.]ژTr��)�}��������;;;Z�l��ݻ�7	
�!..�+9�����3fNNN,[��$���WZZ����ܹ����ʕ+��k�1p�@c{�۵hт
6����q������lڴ)�~���,_��ݻws��e*W��+�� A�(W����˗/�����{�r��
^y���)�k]��SSSY�f
͛7�J�*��U����ƚ5k�ӧ�˗�w�����9x� �z��R�J�GD�#G�FϞ=i֬���)�K�.1a���������S�))�E��������j�0DDDDDD
�D<�d�>��3��� --�cǎ1s�LBCC��'�N�"--͸ߎ;��o�c)))\�p<<<
�~JJ
�����/����������L�:�͛7�?a��l�BZZ)))����p�B�z�)�U�Fjj*����q���HZ�j`����n��OKK��ё��z�d����j�xq/���2���.\�@FFIII1r�H�����Ӽys,--��(XXX��/����^���~����L���	c�&����T��M��z�*���l۶
??������}n���NZZ���EDD�A=z��'���@׮]��/���?��������3g���BӦMY�~=����K�@233Y�d	u��e�֭�Z��={�(1E
��LJ�������|||��_DDDDD侔��
6�x�b<Ⱦ}��0ak׮�������,bbb�[7�v�ލ��%���ܼy��Ǐ�*|��ٙ�c�&b���>$$�K�.���†
طoo��&AAAy�r�
����߿��B��o�5noР`��'wrJ�V����0IN�[K�ڵkɌ3�l��y�Z���'OҰaC���8|�0���4nܘ���|+�T�Pggg���|�2p�i��~���{��+��g�ʕ�9s�jժ��	��ёӧO�T�����ILL�z�ꄄ�p��A�/_�O?��縅��p}�ׯ��8�1��5`����	��͛���LDD999�QD���˗Y�h-[���c��Ŵk׎���?�믛;D�{ڳg͚5�>`�����ӫW/,,,����������<�̖����f�۸!�$44���p�\�B�n݈��6& ��/>̵k��ҥ7o�4&y�Sڶm[�X
��;�5j`gg������lܸ1��'R�vmlmmy����W2�!�����ŋ899���OP�R%����p�������S|}}�m�s7;w����'''����]�6ӧO`˖-��עErrr��S8@NN-Z��w�!1��ϏF�amm�����U��ݻ�s�����I�hР���4mڔ�'>P����ԬY3�qjժe2GDD�(�-[�޽{�m�6�<y2�⥗^2������ٳL�2�z��m�6.\���E�x����})�Ο?���m۶��ё�Ǐ3{��<mVEDDDDDDDD�Q9e�ȑ�.]�C���GѣG�����Pڵk����19eǎ�.]��C�bmmml�s��q,--iݺu�׿p����+��{������-frWN1$��n3���ω'L���!��0�ܹ�IBP׮]8}�t��Z�ܞ�r�xn��������7i���­��5�w�Ɵ��@�����0f�#""R�=z4G�%...�J^"R�5k֌��dBBB��������!��Szz:ԯ_��������[�R�n]s�&�X=$RT���ѣ=z4���ErL�⠔����`���{��ӓ�-[�g����+�=�ҥKY�jÆ
㭷ޢJ�*���KJJ
{��E����ӤI"""HKK��ɓ4n�{{��Zا �U����KKK������6���/9�?����Ջ�~�	�|�Uت)�=[
\�~=�qWWWc�PFF�6V8)��vrǔ;�R��~�&~����2o>�aLO���ȣp�dכ7obaaA�ҥQD"���Ş={h޼9*T��<[[�G�ȃٲe#F� 11???F���a)6>����ݛ�}������ȑ#,Y���kג��C�=prr�q��E������������)*T�s���r�J���ǵk�X�`�q���'��ل�����=<<<�y�&�~�)ׯ_/TK�g�y�s%�²���V�Zܸq����;F�
hذ��<*V�HLL111���S�fMc�������͛����󊊊�w?�6mJjj*6l 55�F�Q�L�|�;::c2nxo��z�����&s
��7�J�*p���<�1�戈��ӊ+pttdذa<x���<����5jիW�]�v�ڵ��!�<�ӧOөS'^�u�4iB\\~~~JL�be�޽���Źܸq�)S�Э[7ptt��ۛɓ's�ƍ"�RDDDDDDļJDrJ�.]pss�/� --��u��������qޫ�����%�ׯ��DҪU+V�^
@�6m�z��e��ϛ7���dn޼�ܹsqss��7߼�srqq 00���l����T������ݝ��,���L�+���ː����G\\YYY\�|�����Ɛ!C�x<C���`Z�hqǹ�����Oll,�������K/�d�ۡC��~����LN�8��Y���0��R?w�\���
ڶIDD�a�ҥ�ƍc������S�n]>��CΜ9c��D���L�6
'''Z�h��-[4h����Hqp��u&O�LÆ
9s��w�&<<�5j�;4yB��ʽs��Ez��i�ի/^4�{)���֧0��뇿�?�g�f���&�no%S�R%�6mJtt4��գJ�*ԬY�����?ggg�J���ۓ�����7l޼�w�y��;w�o�a2���޻�srqq�믿����_	0�yxx��_���orJ~�տ���Cll,���&�˔)èQ��x<C2ʥK�L��_��g���c��?��"�[�
-j-����4�V-U� b�Zr��Z�����Zj���D$ZK���.RԮ\J�	��H"���b�K2!���1��|����ə�~��c�._�L�~��m�T�R�6OOO�o��ٳg8p���]�vf�%��ߴiSBBB8q���C�YY.��>��>��>̪U��ꫯ���LK���R$��ѣ*T���5jd�X"�m͚5�5�;w�0u�T>����G�.Xyx�g��%K�0b�j֬ɢE�R]
��v�뀀fϞͱc�(\�0�[���?N6{�իWY�p!{��%**�*U�лwo:t�l��۷ę3g����L�2���0x�`�-��DGG�t�R�m��?��C�2ex��7�߿���޽K@@�52]�(_�<NNNЫW/�/��ZDDDDDD$��33��bII�.]�0a/��"666���P�Z5����ĉ��m۶-`^h`�E%�%}F�AŊ���&..xP�S�0 IDAT�l�2ڶmK���)T��k�f���f-2�nݺ��
���9�~M�4IvA1��))�������xxx����5%J���Ņ�˗���W�5x�g(^�8�k�N�o���Y�l���+Wkkkʕ+G�=X�|9%J�0����aɒ%���R�tilllhӦ
cǎ5;nf�k׎�E��{�n���޽;;;ڴi��)""��4h��ٳ�r�
7n�r�ʦ��D$kڵk��۹|�2s��Qa�<�N�<I˖-�ѣ�[��̙3:T�)�D�={6w��MV���
"44���X"##����-}��M���æM��}�6			�?�	&�a�S�����O>����0���HHH ""���������+V���&>>���p|}}���IJJ2�ݲe���)^rvv&::��[�f��+��!;���OϞ=1���"��h�"�.]���X�"W�\�s��4����[8���gϞ�����ZDDD 66�"E�X:�H��}�6>>>|��WԫW����ӤIKǒ�TVKmƓԶ�:t�q�L��dv�GGG|||x��gY�t)����*U����?̙3???�ԩ��ɓ)S�s��aݺu<���[��-Z��ѣ�ر#VVV?~�A�Q�xqv�ܙj>___.\�K/�Ę1c�V��.]bʔ)=z�q��ѹsg���ݻY�d��l����+�
�E��
l$��yB�噙SDrZ�>}(_�|�_���ppp0[HDD�It��	���._�l�("�*11�-[�зo_�}�YӲ�"O���$|}}�Y�&~~~,Z����0E�''�d���S���lٛ�5j�*U�p�¦/��ܹcھg�F�I�J�(Z�(cǎ%,,�T��k�.:D�:u�駟�;w.ӧO ***�۶m`ʔ)ԬYkkk�V�����7o6�={�,�`Y�GU�R%Y�'��|���>��#z��@pp0����ݵ""�T8s����c„	4k֌>}�еkWJ�,i�h"��`0p��A���	��ի4nܘI�&i�+yj���2d�~��W�������)U���c�d;cAFVU�V��ܸ�������i.gp��u���ӧͶ�7C��X�S�N)n?���͛7��"?��f�#""""""�Rq��+
6d��̜9ooo�)sEDD�T������;���Ϭ\�ooo>��:u�D�޽iӦ
�
�tL�Ƕ~�z�΅x���G�T�^���Dr�?����ѣY�|9-Z���_����ұD̤��NF�6k��`���
����T���c���Ԗ�3fp��i��y^�u�U�FݺuqwwOw��W�yŘ�@�	��m�,""""""�W�8E�<<<,CDD$G*T��;ұcG"##	dժU�����ݻ��^{��E[�r�x��w�ٳ'��׷t�����…��ϰ��cժU����ұDr�����{��agg$�y$��}�Y���OΟ?O�:uR�w�|}})]�4.\0mOHH�`��/�988p��%6l؀��C�y��퉈� 22{{�d�"##M}DDDDDDD�d�d�����S�dɒ0���.^���yj8;;3s�L��S�_~�~���9���_�>}Z�)�T1�b\�&-����Å�6mZ��nڴ)3g�$""���Xf̘�����Y����Ǚ3g7n���Ν;��K˖-;v,gΜ!11�7n0w�\������2�5./t��%���m�-A$""""""�ש8EDDD$�\�r���߿�lzyK�w��W���ݝ���[:��E\�|��ݻӲeK*U��ɓ'�2e�i������K�.t��1;...|��4o�wwwJ�*���{�=���9v�o��6͚5#00���;a���������7m?s�L��ҷo_�T�±c����q�ƴk׎�+WR�H�j:��X�ĉfY�m͛7��������*N֮]K�r������&11�ґ$����gӦMxzzR�|yz��MTT׮]�t4�\�_|Aݺu���_ٰa�6m�z�ꖎ&�eaaa�����mĈT�Xkkk����<�СCquu�dɒ��������㳜��ޞe˖Ѷm[�/N�B��]�6ӧO�C��~#G��m۶���bccCݺu�:u*`͚5��������xxx����5%J���Ņ�˗'�	�]�v-Z�ݻw�eݽ{7vvv�i�&��+""""""���0npwwϭ�D�)�����c��<��|�M�̙�w�}G�ppp�[�n���GGGKǓ���Ç���o	

�ƍ8;;3m�4���)[����䪍72t�P"""=z4#F��p�–�%��ڶmK۶m���V�bkk��ѣ=zt��S�?��
*0eʔ43/^<�>�H�\J�(��a�6lX��+V�.]ʕ+W�X�"W�\��ѣ4��E��y��.�gN�T�nnn9=��<����hܸ��c��<��y�
�޽{9w� 88�W^yGGG�=j��پ};�w�fذa\�p�={������WΟ?�[o�Eǎiذ!'O�d�ر*Lɇ���C������3�����������������d��9�Y�f4k�,���lR�Z5|||���ؿ?�}�*T�t,y�6��#GZ:��EDEE1u�TfΜI�5عs'...��%"dkk���}��z� 88�y��Q�H�y|9^����OϞ=sz�<<<��E&""9���
ggg���s��++�9�X�?���/�������ֹ�H$�X�z5�F�"**����<��sm�]��6l���9s&���4h�©DDDDDDD�G�]̭�D�)�"7���ܹs,]���={���/gx�N�:��_��蘃�$����R�Z�L�źu�X�z5۶m��֖֭[S�t�H)��9~�8C�a׮]��ۗiӦi+1��၇���c�������d�\+NI�I��_���DD$�/_f͚5L�>�
��鉇��>�l��:t��7�q�F�l�B۶ms1��f�ҥ��ߟ�g�R�f�t�߿�-[����Opp0			�oߞ��w�y��E��Bj����ی?�E�ѰaC���G�ƍ-KDDDDDDDD$W�ty����\�p���4h�ĉ�X�"o�������Ę�x�bjժE�^�x���@r1��>�
���eh?///�}�]"""�3gӣG�H�����ҥK�Q�k֬a���*L�|�Y��ٳԪU��1prr ,,,�r��4i���{�d�+++Z�hA�-�7o7ndŊ��ۗ�e�ҦMS�;w�f��M����\�2�>/^dҤIXYYY�L�K�.�����κu�زek׮e�ر��;f�&M����?�IE�`Ȑ!9r���3q�DJ�*e�X"""O-�,ba���DDD�	�D�>����L��%G�a���Y���@�nݨY�&��ճt4�lgkk���nnn\�v
{{�d���HJJ�gϞXYY����/���ťK����o����P��姟~�W�^T�X���0jԨA���Y�h�Ν�lٲi~�^�F�\L+��]�z�1cưl�2^�u�=Jݺu-K$G���o�"�NPP���'Z:�H������EDD$˞�┐�KGȲ��Ə���+t�҅q������������r�ʙ�-Y��nݺ%+z�ׯ�=�������_|����.]:7��+IIIL�8�ɓ'�����_mZ���Ņ�ŋӪU+�믿����pb��-!!�0q�DJ�(��ի�֭��c��ƍ�0E�B��ܴD�sss�t�|'>>^�)"""�ey�8%+K�<	�-[Ƶk��޽���G��^��e˖1x�`��]���ѣ|���f�ڶm˞={�С͛7gӦMT�\�)�n7n��Ã��.\ȠA��m����^௿����_�,��c�Ν|�����eĈ�=;;;K��QC�aȐ!��!"""""""O�<S��c���ύ,w��eɒ%�ر�7nP�LZ�j���]L��%���W��p�B���KTTU�T�w��t��,[tt4ӦM�_~�H�"�o�ooo
.l�@�F���5\�|y����W�^/^���#�'��ŋqtt�I�&)nwtt�t�Ё&M��q�F6l��)�^������aeeŞ={�����ٳgӺuk�V�J�r9�ȓ���ˌ1��� �~�m~��G�W�n�X"��gϞ���[:�H���ၟ���c���������1D�j���DDD�)��SR��υLm�������ij�y�&}���릶���3a��رc���G�f߾}��B5j[�l!::ggg�����	

e�֭t��5S9EDDD�Dw��a͚5L�6-�~�=�{����֬Y�b��d�…6l�Z�b�ʕ��ۧ���Ņr���رcs1�H���ٳ�2e
*T`ӦM�;J�B�
��qPF�-A����e|DDD$��┰��g8���p�+V���?�v�ڜ:u����s��y�/_��%sV�X���שS��'O�L�2̙3�u�����kV�r��-qpp૯�"  ��;w��S���@�ڵ��2��ݻW�)"""�/���ŨQ��={6�K��H�"���R�T)lmmMϋ)B�-ضmo��cƌ�/���)<�����W��Ν�W^��?�ȑ#��ŋ�`���ZP�P!���W��~���SD���É��`ܸq>K��777���,C$�їĩ��I"�/>>^�H��XqJjS�?��R<F;w�`�ر8::��+�0f�>��v�ؑ��={�0r�H*U�d:~j�?��S�V�
���ƍ��gϞ�r��f�V�R%Y���K/���ŋ�w����DFFMll,�o��֭[����ܾ}���bcc)]�4�n�bʔ)$&&2u�T���,}*O�s��ѥKΝ;�o��F�v�2}�5j�D<�'���������ѣ3f��瞳t,�'F��9%5W�\�<�~�����ߙ>�q�Z�je���뉗,Y���$S�͛7�w�>��f�#"""�k޼9͛7��o�&))	kk�lL�t�Q�Ǐ7����%&&&Y�[�n%{m,2*S�LΆ�â���<y2s����_d�Ν���X:��<"�wϞ=���;i3-��?�<YȁhҤ	���u<K�Xqʣ��g�/��<�`0���3۞ٻpӛ��x�
�m3���_��)U���#<�)B�"E���.]�BiD�.��@@@#F� ::�Y�f���l	,ɻ�NHH�c_c��#G��`�֬Y��`�[�nԬY�z��Y:��d��7o���@\\666�����3�������!W�{����p���f�9d��~n�o""""y�{e�B�
���=z�ƍ�ڏ=
��������
����{����L��g�}�?������S�N���hooODD������'�i�#""""""y�ѣG���ٽ{7�ӦM�B"yܣE(!!!9v�Ɍ��Ə�����V�.]7nAAA���f�x"bY����)���X�z5���N%""""��̧�ȃ��Ǘ/_6��R�2e
ǎ#!!�cǎ1u�T�dS��]�~=111\�p�iӦ��ӴiSfΜIDD���̘1'''�}��L�6N{��%�mƶǙbVDDDDDD���۷�Q�Fܿ����ߪ0E�1899ehyInٲe\�v��ݻ��z��k�X�l���HNX�|9�{�N�:�3���8vz��ț���&"""�_<�)��.]�бcG���C�J��r�
����I�&��׏����J�*ѯ_?��B�/����͛���������;v���~�f͚��2��X�r��	�mƶ��hDDDDDD$w%%%��7�P�F
���{/^̾}��H���prr�o߾��CCCqrrb۶m��;uꄓ�[�n5�>|�V�Z���$/�y����1���̟?�N�:��k�ѱcG.\���ϙ��"���}��]hԨ�ʕ3��/_'''�{��c����ĉ��믔)S����3��ɓ'-MDDDD$��┰��T�A1b+V�����K{���Y�l���+Wkkkʕ+G�=X�|9%J�0�?t�P\]])Y�$6668;;3~�x�q���Y�lm۶�x��*T�ڵk3}�t:t��sj׮E�e���f�v�ލ��mڴ��qEDDDDD��8p�F�1x�`z��ř3g�ׯ�i�N�~�� �O�&::�Ծu�V���n޼������
͚53�Ϟ=��w�&+�HO\\^^^�X��������x������?&))�qO-[�޲e���8;;���ٙ��h�{%"w��%H�J�(\�0��ٓS�N�����*�ǣ���pss�lٲ���P�Z5F�MTTT��V�X<��X�b����ie�t�
6�X�b�:'��m�hҤ	666�.]�w�y�Ç������ʊ��˓���b߄�ʗ/o�o����q����&'�:t+++j֬��g�beeEٲe����9,[��:u�P�P!ʖ-K�n�R�I67�GDDD$��LqJZڶmˏ?���ٲe���dɒ�5�͛7s��A6o����Ó����2z�h�o�ξ}��7oe˖M� �B�
L�2��;w��~V�\�o���Oj�4��+V�=ʕ+WL�W�\��ѣxzzR�h��zoDDDD�\j�9b�4yg|y <<���{gggJ�,�o����ٳS�aSD����/��2���=zx��;(P�{��%66�߬����j��'U�Ve�޽L�4��_�y�:ͪU�8u�/�����<x���@�իGhh(���)�5Ί��#323�޽{�]���q�m�>"�1�w���ёo���?�����8"""�aÆl޼9�Ǵ��M�zŊ4i҄�k�r��u���p�ӧO�E�ܻw������Z�
�ߒ>��Z�����43��׏ÇM�b�+��5kh߾=$>>�۷oLӦM9t�P�9j֬�믿�իWٴiS�}6o��իWy���M9�d���֨Q#^x�Ν;��ӧͶ�����_0�
���7�������$$$p��uqrrb�ƍ�~>""""�D�<���C������3���������������/�;w�A��v|y���Y��S�;v�`͚5�ر�:u�X:��S!��Gۍ��G<ȝ;wx�w���eϞ=���SZ�l�lOOOlll2�͸\Д)S�Y�&���T�Z��b.3c�={�ʕ+��J�*��H�n޼���+w��e�С�;w������O��������Ã���d��ǔ)SLۿ��[��/2h� �����ŋ��űk�.�W�Α#G�>}�Y������j׮m�;�q��ԬY����d7i��ܹs?~���Hf͚�XY��|���qqq�ٳ��ի��ɓ��2p�@�.]��e˖п �Knȭlݺu�W��0c�bj���3�&M�p�bcc9y�$�:u��xzz��?������d��Sr���->>>Nxx8������P�HK��7R�藟���o��+�������̙3���Y:�H�Ժuk���L�)[�n�p��<�B�
���9q�
�E��7id��˗�ԩS�B�Ν;p����3ξ��#�ƾy�&�`9�Gی}D$}�/�ڵk�3�ٳgS�zu�)B�&M��o�裏���䫯�J�8`„	�9ӶE�q��}�u���_M�*U(T�͛7g����\���˗/�W�^�ڍ���S3n�8^z�%J�(AŊ+@߾}�;w.�+W�P�B4mڔE���ҵkW�y�~��'"""�m�v��6m�t�Ҹ�����de٥�ʮ�g����`6s�?�����)P��ڵKq�_|�;vиqc
.L�:uX�n-[�$22�������d��SrAÆ
<x03�
` IDATg�d�̙x{{�Y�\p��e\]]iݺ5իW�رcL�<�l:~y|�p<�^�\9^y�Μ9�͛7��_hܸ1�K��~���ٳ���hN�:E�z�(]�t�q2;k
<�!-QQQ�>fN�m�B5�e�m��H~c\f�>Hq�q&��[��z���Hz��ABB�ڵc�ԩɶ�l�������/&k�u�6l��ʊ�={&�֫W/����֭[��z����ڲ���_���Y�k������S�P�paz��MBB+V�H�mժU������i�Y3;>���[��ׯO�58x� ׮]3�oܸ���$7n���}���?��g�
��'�$;�����ZDDD���f͚ŬY��ѣ��㈈���+���tQQQ�=��U�R�pa�T��رc���5;���!!!���ӪU+Ӷ�k�ҪU+J�*���
�+W棏>2}ٔ��o���?�R�J�}�
Fddd��s111|�������o���O���T�^���Dh۶-III�X��{��ѬY3�5kFll,�/&**�lI��rpp`Æ
)΄�-�<���/"�9��Ծ�s�N��9Liv��u���I����?�^�:�W����:�v��G���J�s�^��������B�J��m�\�2���:���'   �c<���fmY�bT�Z5���E���������7Y��K���.)-���#�����֭IIIlذ��f�q3�%} ��$�F�p��S[n�����HzT�"""""�Vll,-[�d����/]�Ĕ)S�ر#IIIf�6�[�n���?~<nnn�ܹ���H���|�2���K�ŇEFFҴiS�Ν˟�i�wΜ94oޜ�w�;���۰a���L�6�	&p��Iڷoo�X"�7�x�
����S�6m
`Z~���%��6���LE.cǎ�̙3$&&r��
�Ν���^^^Y>��df�Z�jp��%��ی}D$}w��y�~�~�-���/^���l&'���Gvvv�e\�g�Ν)���/���X8�Y��2+���ԩCӦM����ٽ{7�`�'N�ꫯ���h��KN��lƥ}�)���l۶
H�8�L�2)��(QH>#W^~�EDD$�Qq�����<��s��;�f͚EXX�7�ȑ#���s��I�5k�������E���h�Z�_~�%.$::���Xv��	`�.��g̘��S��Z�*������ٳ�*U�p��q�M���"�?�ϟ�C�t��	'''N�>��ѣ���~���4hЀ��XjժE�r�3<��s$%%��/�f���]�t�cǎ��ۗ*U�p��1<==iܸ1�ڵc�ʕ)R��C�f��="3c�sN�8avc[���s,��ӦX�b���
Ӛe#��AN�>�G}����V��N�:i����N�:šC�2�744�ӧOg�oV�d�GgOIi�x��%��f��_~�ڵk�y�fN�:EHH���888P�~�T�K��}�6�J��������G�)""""�o�ήW��N�:�;W�Ze�ψ#Lk�ܽ{���$5j���#G�4��Ҕ�[�n�/��^��Ɔ�M��x�b~��t���ǎKݺu���?ٹs'�W��瞳t4�|͸lMjڶm�[gQ��>#F��bŊX[[<�E�������D�����|����$3c�k׎�E��fx��ݻ����M�69�U�ic\�o߾}��/66��ݻ�ĉ�ԩS�}���TT��+VЫW�4�<==��ψ�f�n���*U����K`` vvvf��g�s�
���[�n$&&2e����h߾}��`�믿��~� ��Ny�����`n
�[C��S(((777K����q]�U�������fm�~yNǎS�@��Z�/^�w����K:����֬Y�ȑ#�{�.3f��ۛ�s�W]y]�t�K�.f�#F�`Ĉf��<�޶m[S���J�(��a�6lX���*�I�oJ�ft�bŊ���ҥK�r�i�+W�p��Q
��R"�����s��a���ڴic�3B`` ݺu��7�d��ͦ�#Fp��1�t�¸q���e˖=z��K���\��	^~�e*W���Abb���XО����j�*V�\�_|���u�盙,9��֖�={��W_1c��_�N���͖���r;���;>>>�_��.i/�fmժU����D�O�@׮]-v>""""i2d3???�Ç5��C=�x܇������d�EDDf��#��…��o���u��C׮]
��z���Ç�-[f8y�Y��Ə��N�e�Nw|����ɓ�����_�~��W�Z:��S��߿�XΊ��6���ۆ�ӧ�ڦO�n�ر�!&&Ƃ�$/П�ԯ?�䯿�2�,Y��x�
��
111�;vh���1,X�p���>?���08::������ᅴ~����O
�{���o�n�[��0|��g��`ؼy�0899e�\�ׯo?��-��2�%#�Kk{j���0+V�8`�'+�KF��%��#f5[F�K��/�l�_�`ACddd�����ӧO�߿o����۷7�^x!ٿ�{>���&"""��C9~;���9=�����H�U�R��g���P�r�,c˖-��i�˖-�ɓ'M����)T�P������9s�={�$��Ϟ=�|"���۷�8q",�W^a߾}4i��ұDD����->>>|��G������`�͛���D2�bŊ���������iܸ�Y��R�^=��I�&p��1�?f��YkԨ�…�߿?S�Ne�ԩ����k�=��|���w��<��|�rڷo�n��d�)�����꫄�����/���g�s�-��֭[7Ӭ�M�6�D�i�dРA�ej�ʗ/Ϗ?���ߊ��^���H����){��a޼y9=���͚5cȐ!��!""O(+++���;5k���w�eڴixxx0�|�~�:�f�b�̙�lْ;v�{\���777N�:E�~�L�oݺE�r�R�s��L�6
///V�Z����������~;'�
�'��``���3���.\��O�,MD$�5lؐ��3s�L��
4�p*�'S�8z�(ӧOg۶mDDDP�hQ^}�UF���H��o���ׯ5j�`�ԩ�߿���h�V�JϞ=9r$����cooO���3t\F�ɏ?���۷)U�T�d�i$44������'��Kn��l�����[���͍Z�j��s��Q*U�D׮]5jeʔ��������&NjS._�LPPnnn9=��<ł��R��\DD$#ʖ-˵kרU��i��ѣG�~�z���GÆ
��/Z�(�f�J�����V��w������l��Çi߾}����'�������8;;'ۯF��;��NZ�)q��a���	c�L�<�ҥK[:��H��l�"٧f͚,]�4C}oݺ��1�7oN���S�^�T)bbb2u̢E���1���8Y2s�Զ�����￟�ؙ�\�3+��u��f�̱���<��s�����ёC�ex��=����)F�N1'"�={��ty�͝;��c�r��e�߿@ɒ%ٷo�&Mbݺu\�r�%JТE&M���/���q�ϟO||<7n$11GGG���ӧ���a����o�>��K�*ž}����aݺu\�z����ӵkW&L��/�%߻~�:�ƍ�o���ٙ��P�ׯo�X"""""�f�����5��l����<�r�8EDDDD$��t�Z���S�>�t��̙3�9s�d���$   �m�}�Y�����3�|�ϟ���E�FIII,Z�����S�pa���;<<<L�h�����<�nݺ��۷M��?�‰DDDDr��SDDDDDD$�ػw/~�!'O���?���;;;K��V�<�鹇��f��^�*N9{�,�j�J����d֯@��,Y�z��1h� �W��[ͤ��Qaaa���:+�5
ww�4�d�ȁhҤI��%"""""�/<<�O>��U�VѺuk�9B�:u,KDRD�Ν-C$�	

�����1D$<���ܼy�w�y�E�Y:����H��7�)Ç'$$$C�IIIܺu��;w�ʕ+�T�R.��{,X����ʕ�t��r��,X��5k0t�֍�5kR�^=KG�����7o�&M�T�R�]��.]�X:���#>>^7}���<�˗/g���z�']�)N			Is��E+III������Ñ#G���o�4iRNGLSF�jrb���hf̘�̙3��ع%&&������ꊃ�]�taܸqakkk�"""""����2d/^dĈ|���\�	��營���c������������E
�bŊ|��'<x�‰,�Q�F���/�ܹ��Q�lٲe\�v��ݻ��z��k�X�l��������O�/_��Օ֭[S�zu�?ΤI�T�"""""""""�ʓ3�\�~�y��g�bbb�V��{�f̘1@�B���Y�t)۶m���L�2���������L���32�H�ʕ���Lw�Gۍ��,Yˆ#�Y��i�ȌdΊ��[f���O�޽;����iܸ1E�M3���	

�̙3���R�L\\\<x�i_c�0{�l6n�H��qww��ˋ��H�O�ή]�(T�-Z�`ԨQ+V,��q��]hԨQ���ʗ/�����Ջ�ŋg���ˬY���/�X�"?���۷�t,ɀ�� :w�l�"򈠠 ���,CDDDDD$]y�8�޽{��ߟ�����v��Sa���������ԩS����p|}}9q�,�@��O��`oo��c̞=��w�
#r:sZ�2v�J��߿?.d���5*�����,]�4Y[DDܹs�li�3f��?�^��T�X��� S���X6m�D����2}[�l!::ggg����΄���u�V�v��{'"""""�gÆ
6���Ə�����8_DrW||<��!"""""""O�<�������*T��ח����dɒd�^�Z��S�N��K/�����	�^�z���$�I$,,,�YS8}�4��9���Z�ϧjժ�ݻ�T���̏rrrJ�Y�w��T�Z��k�r�ĉT��z�jF��޽{ٷo�/`���f�O�8��իٷo^^^L�6
kkk���{�����صkW��c�޽Ԯ]�l|c��������d������[oѩS'���8}�4�~��
SD� ~~~=��#�>���,��D�`ee��zd�gϞ���-"""O�<7s�Ν;;v,���4hЀq��1dȐd}�m���)S�P����LJΝ;�y��O9�Z�G�%x����t.����.�fg�����dܸq����L�<???�����ڵ����ӧ�駟8w�� **ʬ��ѣ�Q�,Z�����3f�ӒJ�z�bɒ%ɖV��y�={��M�R�J�>"""""�}����:u*3gΤF��ܹK���L�f��tI�E�SR*1�fr��%�ׯ�l{�
��|�2�:uJq����g)���5�<�
6d��888d�8���fNo���x����ё�]��v�ZV�\I߾}�\�~��C�r��i�m����V�Z��E�5=�V��鹭��c��͛7(^��Y?c��������d���@F�ɝ;w�1c���,����\�g�>Z�`ee�n�G�4[Gj2[�a0L����R��T�ٙ9�w�?�������Z�nm�}ƌ�>}����_�jժQ�n�Tפ.\�p��
���Tf���tLc[J�o�����H�:u
oooBBBx��2e
�>���c����SlϞ=ZzD$��wM^DDD$#,R��V!���?���_~��7^}�US�o��f����K�.�aÆǚ�$3���0ܻw;;; s3�X"sv�]�X1F�ɨQ��2e�����K�ҥ�p�i{BBB��-��󰷷'""���H���m3.�h������d��۷�4i����W^a߾}4i��ұDDD$ї�"����_�_"""�mҞ��ڴi�ԩS9q�			?~��S���mٲ%cǎ�̙3$&&r��
�Ν���^^^����1�K�d���b������p���M���3�9�e�حZ��E������g������q��ƍgj�s����;��A��fl{xy!�8�����˩]�6+W�䫯�"44T�)"""""""""�L�[֧gϞ���������7;}���_~�رcxzz&�V�H�jz]�tin޼I�.]ppp`Æ
Y�����?���_~ɗ_~	���s���L��]c�=���0���������y�f&L���	�;s�L�ޫ�d�<�6mJHH'N��A���8q��͛?v&������x{{s��!
��ɓM�""""""""""�s3���ڲd�:u�D�R�(X� 5k�dҤI��ؘ������닇�X[[S�D	\\\X�|y�1F�AŊ���&...�����+%K����gggƏ��3�9�e���ʕ���۬}�ȑ�m�[[[lll�[�.S�Ne��Y�&�ϣ]�v-Z�ݻw�g�����ٙf���]�~///5jD��9t�_}��
SDDD���䄓�S��?{�l6���8���6�aÆ�+yDDDDDee���8�k���
�cǎT�P�����*�ĢE�X�t)�ׯ�bŊ\�r�Ν;3h� ���oᄒƵM���R|-""�;w�P�D�\oժUf3��<m���X�h&L��Ɔ3fгgO��""""�!��?��X���}�NHHH��ͮq�9�G}Ě5k0t�֍���S�^��$O���&"""O��<7sJ�-prrb�ڵܹs���$.^��ĉ�_���ʓ�O�>�/_>Y����IDD�)���ľ}�x��wy饗���?sm�_�����j߾}8991t�P����ٳg���Ta����HBBB,:NLL�Ǐ���*T�@�.]7n111��MDDDD�(��t���iӦѪU+^}�U����t�Ҧ%bD2������	'<<���`|||(R���㉈�H��dzu�V�����s�ѴiS֯_�[o�Eݺus-�ĉ9�<����6�Hn	�w��4k�{{{�9�̙3)^��������d��.��$Z�l׮]�{�=zp��5�-[f�d""""��t�G�5�J�*��O?q��E���x��gy���߿?�ʕ�tDy5lؐ��3s�L���iР��S���Hfݻw����u�ֱi�&n߾M����߿?����qttdʔ)��'))��G��7~��Wsml������ܹs�4i�J�b�ڵt���ұDDDDr̍7�ꫯ		!&&�V�Z1f̘�FGG�t�R�m��?��C�2ex��7�߿?666�
a](#�]�z���w�^����R�
�{�6���8w��%  �F�%��^�|y����W�^*:�\��S
(�����"O�%""�d�q�6l`���lݺ���8����0a�;w�^0��X�kk�\˶{�n���O�u�ƚ5k�5kV��/��o�ΐ!C�x�"Çg̘1���Z:����H��{�.����ʕ+�����{�������ˋS�N�������ĉ,X��R��<3�߼y�>}�p��uS����3a��رc��lٲ���h���Ͷ9;;�֭[�ڵk���NynY���p�ϟ�믿N������">>��s����k�.��/����Ǚ8q"��9/��b���^�zL�8����\[S^$'\�|777Z�nM���9~�8���
SDDD䩷r�J�\����?ϊ+ؿ?K�,�ܹsf}W�ZũS�x饗���R�^=BCC	�7K���uF���ׯ_�N�:����ڵ�w�}__�4�ٻw/�k�6;c�������HnPq������9�o�fȐ!�ڵ�U�Vq��56m�Ā�MI�{�GÆ
:th�f��?��?��{���-��G̏�5�f�R��v��Fʏf��}��ǘ�k�3>�%)LLۘ��G�C#��M IDATas82���J�����H?T�Wr�^.�˼�������:�^=��gF[�l��ݝ��z�N�:\�DJ��۷�;w.�[�&&&������iٲ���DDDD���!ǣ�����ӧӮ];,--�ر#�~�q���������T�\�-Z0k�,"""
�U��8���7M�6�������������ٳ4k�,ױ�͛��#""""R�ݶ>"""""mڴa���xzzbkkK͚5�����O\\111e����ݻ���8p ��s��a���T�Z�L���_|��ɓIJJbƌL�2+++�c������_~��:�h��r�������5ϱΝ;W�\E9?!!���z��1�r��5jԨ��Xv[v��Pf�)e5��TP���FG�24l�0���[<==9v�M�6�q��d�ܹ���coo_���qvv6���
ooo"""�Km��W�Νc�ĉDDD���ƂhҤ�ѱDDDDJ̽���UR�o0�L9���J�ܷ���s��7ox�(�?�=��s+Uʽxzv��ً���HY*��BCCK{y�GI��V�XAdd$$22KKK�-u<==y���4iR��u����,\���֨Q#^|�EBBBT�"��͛7�7o.��'�d߾}t����X""""�jҤ	�ϟ�رc899��cccs������ŋ�ܹ;;�"�U���?r��%Ν;G۶m�4O�z�HJJ"99�z���8���l�#""""RVJ�8�iӦ��������Ν;IHH�ҥK����`��Ν�O?�DLLL��,m;v� ==�7�|3G���<y27n��s�l#������MJJ
���gܸqy~XDDD�q�ꫯ�b�
����={6:t��ٳ̝;7Wߗ_~�u��������7�|�I�_�NPP�}��\��}e��D||��yQ�wvv&$$�E����G�ڵY�t)���4i҄�?�<�y�z�)����x�b�"��/��������݉�r�d21{�l>��ƍ�s�=��o�͋/��O<����y�#�����+�P�~��`���l߾��C��M�~qqq�7��OOO������ht,�rcȐ!�ݻ��g�2r�Hs{�^�̅�<==���8q�C��q�Z�jL�<��N�:\�v�~��agg�Ν;�t�[o�Ş={8q����z���n��8;;��Kǎs���"L׮]��2�����<�R������z�G�=���K��DD�`�o���ݝ?��+V�t�R�z�-�
���;ݺu�K�.�?ސ|׮]㫯����=ױ�u��ꫯ��\�~�:��_y�gHII�СC�]�V�)"""�X���&:::�cVVV�Z��P�N����ѣ>>>��V�^��k�����+W�f͚t�֍u���X�d�ԩ4nܘʕ+���^���իG`` ={��F�XZZҦM�ϟ�k��V�<�z���Ɔ���\�I����ѣG�^L�b�0�L��0>>�~��$��SӦMy���!""%�gϞDGG�+��bnOMM����s��ѲeKC�Z��ɓ'������=�6mbذa$&&�ZYE�,�L&֯_�������`�ܹ���;�l�%"""R҂����� ������\��5kְ}�v7n��˗�۷/�F��w�18��w�~�]��4m�Լ������HQ���ҰaC���s����p��):dXa
�…IMM嫯���;w���$,,�1cƔq:y�?~///�=ʨQ��3gu��5:�����`����ڵ��7�
��7bgg�kK!��V��)"""""��_�X۶mi۶m��)!!�s��0p���8E��իW�e���t�҅�G���s�KDDDDdmmͬY��8q"C�`ǎ,]��jժ�NDDDD7*N)�F��Z�888OOO���"e)++�O?��3f`ee����������h""""Rt��	///-Z�رc�ر���DDDD�q������������1�1t��!ƍGll,&L���;5j�0:������3���CDDDDs�� """"���ׯ�Z��Q�S��%&&2|�p\\\�W�111,Z�H�)"""""""""Rn�8EDDDD�ԩS��ر#���QJ������1����G}D�֭���cϞ=�m���h""""""""""Rq�������/��ggg7n�����qJDrr2U�h�L)]�~�-�<�3f�`„	�9s����KDDDDDDDDD�Pt]DDDD�Ē%K�2e
�Z���U���XXXA*���x�L�–-[puu%<<�V�ZKDDD��8p��D*���0�#���H��)U�?�իW�����D�=�¬#���۷�裏���Q�FDDD���X""""�NӦMy��7��!R!�{KDDDJ��SDDDD��ܸq�7�x���(�l��o�at�W�vmj׮mt�@���&O�LRR>>>L�:+++�c�����K...���CDDDDD@�)""""Rj�U������g�5:�H�v��9&M�Į]�4h.�I�&F�)ׂ�����H)3�LFG�
@�)""""Rj,--��ό�!R�ݺu.\ȓO>ɾ}��֭�ѱDDDD)���FG�p���پ}��1DDD��Pq�������ABCC�&%%����3n�8�Tѯi""""E��oA�����Pq������JFy����ѽ{w���x�W8}�4�&MRa����������TH��)"""""RF�_�Μ9sX�t):t�СC8::KDDD����@ttt�Ͻ���5�������899�i�_��O?����(���R�fM:w�̨Q�h֬Y�焆����#,��"""""���)""""�P.\������/��bt�r�d2�~�zڶmˆ
X�|9G�Ua����H���Ə?�ȤI�8r�H�Ν���СCٱcW�\��ݻ���o�޽��C����?�:�������ԩSY�l111e�[DDDD*>�����H�8p���_���(����b���Fǐr���8991b��x�
Ξ=�ȑ#�TI�����������^��1�=��ݻquu%++�իW�i��+Wr��5���زe?���7o�}������dɒ���Ҙ1c��ΎF�ѯ_?|}}IKK+V���n��������������<��FG2D||<W�\1:��CW�^e̘1888P�re���Y�|9u��5:�����c��!�-xJ���u��e„	�:u���סC��5k͛7�r�ʴlْ?���p�^���\�r777s���r�
���e\DDDD*�*;@pp0%�EDJ��d2:���T YYYL�>������{����دammmt)G������O�9s&����[��!C�`aaat4�Cv�J�j%YYY�Z��ݻw������%-[��O�>��۷Pcf��T�z�<��Ottt�<��<ȼy�سgVVV���0a��ׯo>Ϟ=y�۠A�U�fn�q�!!!t���|�aÆ888�СC�Q�F��YDDDD� ]��-44������ۍ�!""�͛76l���it$�ݸq��M�CʉÇ3v�Xbcc�0a���u3_DDD���
��3228y�$'O��֭[���o���ҥK�ӧO��?>;w����DDDCPP5k�,����8;;�۾��kRSSqrr����ɉ#G��{�n���_b� """"��+Ny��7Kj()!*N���?r��a���\\\��S.deeAʁ��D�M��g�}F��݉���m۶F��bضm˖-�����"""�7o�7oγ8%�Q\]]9rd����P��߿___RSS�ӟ�T`��t�R:w���ӧ�%!!��� ����=/--��?��y<@�6mr���v��A�����H�(��������׿������Qʍ��Ljժet1Hff&K�,aΜ9ԪU���0ݼ)��>���Elll�y�&7n��t�֍0`��"e8s����gϞy

b�ҥdee��䄟�_��M�6ͼ�I����a�ر�۷/��;w�0e�.\��…y�'��Ξ=@�f�r�׼y�}DDDDDV��?pYC)]&���""R��0%�[�nA���2~�x.\��_��W|||���6:�����<�I�&�ETT�|�	#F���ݝjժ�yνE.�n��~࣏>b��餤��(l�����ߟ��p<<<�8q"�*U*0���c���>�,���K��o޼�_��WN�8�ܹsy饗r�v�@��Pf�e�yX��rJhhhi
-"��6>"""���4:�����x�N�JXX�{�&<<�V�ZKDDDD�q��(�+��R�z�쉣�#�}����㏬X���� Ǝ����lmm�޽;�Z��_�~�Y��\�����ԩS9v�����������ꚪT�y;?{�Ѽ�ZΟ?����IHH`����W�eaa���m�}DDDDDV����曥5���###C�)"""e,""��իC��;wX�h~~~4jԈ]�v��k�KDDDDJA͚5quu��Օ��8������Y�xq��q�=!%%��/2i�$.]�DݺuY�p!�<�L�3�8q"ǶDǏ�O�S�~�w��>�A��_�>��l���#))���d�ի��Xrr�������HI(x�@y�$$$�f��c<2�x�	j׮mt)e_|��۷g޼y���p��)�����TP}���-[����ʓO>���=P�U������gΜ9�k�OOO.]�D�&MX�~}�
S�ΝKll,���?~???z��e�s��)|}}iРk׮ͷ0੧�~/��_v[v��Uj+�����ȣ'&&�޽{ckk�����1:���Ν;ǤI�صk�
b��4m���X""""R��������c޼y9�u��1�s�]��^���xyyp��
.]�D�޽��_жCu�����3G[۶m4h����ի����ҥK��ѣ�9��������u]���t��5�<"""""E��S*�k׮Q�jU,,,�Z�*׮]+�-,,��iq����m�6\\\hݺ5�Va�<�nݺ���/�۷�…�۷��������<����,��W�~��9s&�[����
+++Z�l���'|�ϯR�
���޽;�W���g�}�,^��T�B�
6l+W�����ܧ�����bccCddd�c���T�^=�����)Tpp0�������i�&Ǝkp*)�L&~~~̘1�1cưd��Tя��
c�ԩ���0o�<ƍ��	�
,��WWW\]]�u��ͯ_�Z����<�����ckk���;k֬����4n��˗/èQ��)1Z9��Z�nÆ
��3�L�L&�c���<6n߾����f�"  ��˗���؊���{��4��ݻs��i&M���	���NÆ
ٸq��m�ƍ���1d������HE��
(66���ԯ_�+VP�n]���9u���DDD���6m_}�_~��yt��Mrr2S�L�g�!99�C�HÆ
��&""""R�����5k;v� 11���Dv���Y��V����DDDD�Qq�C�x�"#G��iӦT�Z;;;<<<���˳����������7����yo�iӦq���|s�_����ckk���[����]�x�N�:akkK�޽:��={ptt��ʊ:u�ЧO�;V`��~�	6lHfff�}333iذ�����/"""��>��#G���?���("e�d2�~�zڴiÆ
��ѣ8::MDDDD��t��	///-ZĢE�;v,;v4:�����T0*N)���H:t��ի�t����$%%L�N����(����9��_�GGG�l��իW�����̟?�_|�[�n���ݻ���O�����{�n�F���c�HMM�����l޼�W_}�~�����_�Ύ;pvv��ѣ�氷�祗^��_e׮]y������_套^���(��EDD�"�U��Z�2:�#��͛�lْ}��E����8;;3b��x�
Ξ=˨Q��TI�"����H�Mttt������G}�G}��Ku.y<��k1\�v�p��
&O���?�LZZ��w�!==wwws�g2�r=���������.0j�(�޽��ѣ�p�����߿�V�Zq��q�ϟ�+�W_}ERRmڴ����^x{{{���������'O����G}�PY�}�]ƍǿ��o���9p��Z����|��f9r$k֬��x`` ��P��EDDD���޽���IMM5:��իW3fXXX���˩[����DDDDDDDDDD*,�ç�~ʕ+W�>}:�/�U�VT�V
GGGV�^�ĉINNf�����̙3�����|l�ʕܹs�A���'�мys,--�ڵ+�6m��>�5�u�:th����������K���Y�&�7~�,���,Y��f͚aii���3+W��~(0K����[�._~�%III9�]�r�]�vQ�N��""""RXYYYԨQ��$� YYY�\��6m�κu�8p��=����DDDDDDDDDD*<�C�63�ƍ��x�J�w��w���dLff&�z����?��o��//�\�:88`2��p�B���~���;wbaa���G�cC���‚;v��o��륗^��V�,�ƌ���K�.��Z-HժU6l����_�>DZ�� 2222dժUJ�}����_��Q!ݸq@[��s����	&0|�pΜ9c��XDDDDDDDDDDJ_�<�������+���?��ﱑ#G����V�Z�i�&*W���s�x�g
�kӦMܹs��_~��M��8֬Y3^z�%���;BBB�,hҤI���d�ֲe�\m666����?Ȼ����ڵky���o�%󾈈�T4���?�ӧ...����ªRE?V�G�������lذ��ݻC۶m��%""""� ,,��"���DDD�$�.z1���<T����%44�5jN�:ur��y�&իW/t��-{���W�@׭[�oqJv���f�feeU�s�նm[���9x� ���t�ڕ��hbccy����С���þ/"""MXX��������Փ�u��mlmm
N"����d�ҥ̞=�Z�jj�
RDDDD*��ADDDDD
��Nj!��ׯ_�d2��ke�ӧO3q�D,,,

����sd�<H\\G�-T�#G�p���B�-N������v�Z �US������d2�0h� �y�"""�]��ѱ*�;w�A�o�>�y�|||7ngΜQa����H���^�@=����""""%A+�C�V�8v���/�K�ϻ}�6nnn���2{�l\]]��۲eKbbb�������c�_���C��aÆ|�
:��� ֯_ϼy�
���YJ���4i۷o�O>!44��ի3x���������T$iiixzz�石r�JF�it��B^��Iي��g�ԩ���ѻwo���iժ�ѱDDDD��8p��K�C�B

5:����TZ9�^}�U�ΝKfff�㡡�XXX��k��h�:u*'N��_�~���8��/���5kr�����‚�͛p��]���7n\��zyy��g�z��d)
���xxxp��u,X�իWqss˵�Pq���"++�W^y�o������Z�)e��ޞ��_4k���(��;w�0w�\ڶm����ٵk;v�Pa�����c">>���0�c�THaaa�����S���ˋ�˗s��A^}�U����С�&$$�u��Q�J������ر��˗ӡC6l؀��E�s�3�+VHÆ
�8q"5j� **�	&���	��ݻIHH�������q�t��s�=����ٳg���������#G�|�r,X���������T$�*Ub„	t�ܙ�-[�P�jUZ�hat��֮]��4iIII����x{{ceeet,1�Vv)y���xxxCDDD*��R��k�� IDAT7&88kkk����/����5ݻwgժU����t�R�}�Y�9�g��ĉT�^�<ٞ|�IV�X������4l�[[[^y�N�:E�.]�6m�֭`�ر�ʟ�zJ�yR�,��C�<���ܺu���~�^x!W��/"""����
S��;w����:���:;v�ԩS����0EDDDDDDDDD��RqJ1���k���0b��4i���%�jբG��޽�1c������s�1������/Ԯ]+++Z�n͜9sطoժU���ر�z�����V�q��ݩ]�6���\�~�IJ���	�Z5%[Q�yt������K���p����c���4m���h""""""""""Rm�����Y�fM�����oŚ�k׮t��5��k�&--�Hc�����c2�:KQ���xA��ۼ�����(���<��˜:u*)))���3~�x�Tѯ3""""�����.�ǎ#<<�����`2�����K�.xxxШQ������kx����������#,��EDDD����\�G�͛7�^���1D�D\\�Ǐg߾}>???��쌎%""""@ff&s��e�Ν�����Oxx8������ߣ����y�fL&�
���^[�����H�T�""""�9r����#  ��}�G��$''3{�l�.]��O?͡C�ptt4:�����T@��ȢE�عs'U�VeȐ!��у&M������ӧ	

b�������m�6�ׯ_����P���'--�3f0`�s�x�~��%,,kk��SDDDD}�� """"�B�n��С/����qDJ��dbÆ
�iӆ
6@tt�
SDDDD�888z��駟غu+VVV|�駌3�V�ZQ�jU����ر#�/�W^!55��[���F	�ʕ+�����̕+W40������g*N)�L&3f��ݝ1cưs�Njժet,6nܨe�K����qvv歷��7��̙3�5�J��k��������W���X�r%����K�.��⋼��[l߾=�y[�n�d21x�`ڷo��F���^�M�6��<w�^^^�����+����OZZZ���^{��e���t��
GGG^�u-ZDjjj��;F���=z47n� $$�Ν;ӠAs��
���@HH7n�(V.�ش�����H9v��-��Ν;Y�z5o���ё�)))���6:�#��ի̜9�O?�GGG���y�猎%""""����6l�`~����ɓ'9y�$�n������-sz��U�x-Z�`���y5j���ܾ}��[�������OI\J.�|�	k֬�і��DHH)))�r.^��7n�Q���kRSSqrr�5���G�a�����߿T򋈈�ȣKA)��ڵ+��=�|�
Sʡ��L�b��?�ڦM�o�N`` Pa�����j۶m,[��Ç��~�M���͛�h޼y��j֬۶m���1�}��{�ٴiӦM��:t�O?�����\�[�h����E+ȱ
L���>"""""���)""""唭�--[�d˖-�h���8��[�n����'O�d�ĉ̜9��5kKDDDD*������={��{���p��M6n�����֭`��9�eee`aaQ���o�M�6��Ã�kג����U=����c2�8}�4_~�%?��3G���͛��2+++��g����/�H'������ȽT�""""RNժU���0�c��{�V,11����
6н{w~��Gڶmkt,�I�&�ETT�|�	#F���ݝjժ��5hЀ��.]�T��l����b�좗�p��U&O���ӧs3�L���_�ڵkԨQ#W���>"""""�Rq�����H1���bmmmt�GBff&K�.eΜ9ԬY����\�<))��P���I^+�ܯgϞ8::��w�Ώ?�Ȋ+

b�ر����N�:����7�|�ȑ#5��,--��k�l&��|<==��א�p��i�4i�K/�D˖-i׮̳����*U���ov[A�!""""��R+N��""""R�eddᑰo�>ƍ���2e
ӧO�����X"""""��Y�&�������޽{Y�~=�/6���׏�;w�a����i׮]�c�"IaYXX`2��u�իW�ܹs�/**
��k�R�NΟ?o>���I�*��٠^�z$%%���L�z�rKNN6��_�����Z�Ê�����;&�	[[[�c�[���x{{�믿Nxx8�Z�2:�����H������˗�6m���O>�$�.]r�t���O3`��l�»ヒ���z��O��/_&::���p�x�S�׮]c�����ߟ��D�͛���x��a���?s��yfϞmnOII�nݺ����SO����ŋs�\�x��GDDDD�~����2s��a^}�URSS��"�0u�T�n�jt�r'==��s�Ҷm[�;Ʈ]�عs�
SDDDD�0|�p�͛Nj/�H�.]����cǎ9�z{{���FFF6l���'''���x��7�?>gΜ�I�&9K�n�����ڵ+�v��ž���fΜ���C�᧟~2?s�L��;;;��Xv[׮]��ODDDD*�_9�xxx��"R�T������� �}�]z��ݻw��#�P�~}�#�;�v�bҤI$&&�����k�z��]����J�*������iҤ	]�v5�d�\�2S�N��Օ�?����h��Ƞ~���mۖ�={��+�P�r�"�<y2�*UbϞ=������3��_�R��b���L"##�{�.O>�$C��…�Z��͛7����z���?&22�aÆ�8I����ѣG������H�V��)���q����0�G@VV��������퍿��nR��'�Νc���|��8��ҴiS�c�����<P^�+������z{{{�{g�3�vkkk�M�ƴi�
u���רQ??�<��9��������Κ5k�|�2�7~��(&&�Q�FaccS`6y<i[�2t��M�����ŋY�n,Pa�<�RSS�}���?�o���͛7�0EDDDD��>|8
6d�ƍ涍7bggǐ!CL&""""�Y���"""""9������Jbb"{��5��-�ڲeS�L!%%ƏO�*�CDDDD�"���f֬YL�8��C��c��.]J�j�N'""""�U��9�r�
����k��o��_~�o߾4hЀ�����S$gϞ婧�*���ڬ���_�>���xzzҨQ���ȕ+WX�p!G�!##wwwƍ�Pc�/�:�]�1�צ8כ��e�a��JTT���8��<""Rr���[�����h޼��qD�-..���dzo�>�
���?vvvF��2ҩS'���X�hcǎ�cǎ���̋Sbcch׮]���۷/�(E2e�����/�HOO'!!�m۶��W_@��=���/ǎ3?�z�jI�,PQ^���ޒTZ�qQ?~���6oތ�dbРA�������IDDJ���'���XYYE�X����3gK�,�駟�СC8::KDDDDD�����1DDDD�Qn�S���W��}��uo�Ý;w�p�DEE��{�m�6����5��'��O�ԩ���%�� zm�r�F���{\iii̘1��?yܯ_?|}}	+�ׄ���/*L�G��d��>cڴiddd�l�2F�I�J���&""""""""""��2�����`~lذ�U�V���@HH˖-�s���jժ�nݚ��������;w{��b*U�T�V��[�r������m��ʕ+�LDDD�3h� fΜit�Ru��q\\\x뭷�۷/gΜa���*L�B+�w���W������?�GGG��܈����'���رct�ޝѣG������l�2\]]�ҥ�{�fŊ����k�޽�=�nݺ����믿΢E�HMM5�s��ř� ���xzz����
;ǽ�:w���1�k{P��sԯ��{�%�?�멠�q�}���?�c~�/^�͛7s��f���ॗ^�o߾dee�����}��1�B�ΝiР��_Æ
�E\7n�(�k+"""e'!!��ׯ�T��������sQtt4+V��^�z'�GM�l듽U�O?����;͚5c�֭�����鉽�=����׮]c���\�z��v��9fΜ�ݻw�ݻw��/^̍7��OOOg�����ř�$&&�v�Zbcc	0��O>a͚59�KJJ"$$���fϞ��ue��x��g���Kt����Ҕ���a��~=���͛���ۜ?�ܖ��Dpp0G�a�ڵ�������ggg֮]�7�|CϞ=�}�r^|�E���kRSSqrrʕ��ɉ#G��{�n����JDD�u�._�̠A���"e --
[[[�c����,V�ZŌ3���$00��C�baaat4�|��U��L�S����о}�<�g[�~=W�^�m۶|��ԯ_���|���]�6W1A�-X�v�y��� ���h߾=ӧO�e˖\�x???�9Ž;�۷/�6m`ڴi���N�<ɨQ����~/����ي2Oaԭ[ ǧo�2G~9s�ŕߜ�����a���|=�w6l��4nܘ9s�ЦM���1c�Νcݺuxyy�599���֭[�gqJ׮]8x� mڴ�u��mTq��H9�f�����ׯ��SE]-�������ˋ�'O2q�Df̘A�Z���%""""�/BCC��!"""""P��d��k�.���8���7M�6����������s�;d�s���={�����ޞʕ+ӢEf͚�c;����s��Qڶm˗_~ɒ%K�?>@�m[�W�y
��ݻT��5C%1��\ci��z��0�qQ���o�>|||�С���<��3L�>�o������j�b�����O:t�}��[[[:v��ٳgh֬Y��7o������?w��e��ɼ��x{{�XN*��WQ{%&&��[o���D�:u���Y�h�
SDDDDDDDDDD�D���)�+Rd[�`,0?�3gs��~_�"!!���z�P�g��>[||<���y�?w��W�^e��ɜ>}:W?��T�E��0����S�N���0�X���<�{\ԯ�{]�|�g�y&G�s�=�c삲2�͛7������ݻt���\�s��5jԨ�k���>""R�\�~777���ϦM��b�c&%%KKK�c[ff&˖-c���ԬY���P`t,�B;p�F��Ќ�;����Te��Oau�{WԀ��t�j!,����4i҄�^z��-[Ү];��y�2Oa;v�֭[��E�F��d~Js����7?���~�YYY��?kݺu�߿?�����ƚ�R����ތ�*�^�(�M�抈�??��3���ܸq�����*ȕ��ޟ�5���cܸq��_�b�ԩL�>�B�#""""�'��\����KDDDJL��DGGs��1F�I���Y�n�f���t�ؑU�V���?��K�.q��9ڶm[����x�";w���ή��QQQ�]�ּ������333��v�(�<HFF�y�nݺ����FL&�nݢz��@�W)�������<��S�F�����MLL/��=&&Ɯ�0�ʖ-[ؼy3��R�J8;;��׫W���$����W�^�s����}DD�|y�w�Y�&{��Q�FF�dddP�fM�cI||<��ބ����N�V���%""""""""""X�eJIll,�۷���h�h�"����}�6,����7�x�s�������p���޽���_�,Y����G��u��ÇIOO�̙3�����SRR��[�"{;���s�;w�ˤI����iܸ1�z�*�9
{�م+۷o'--����3o޼���kS��-���.��z��:�g���8q�����8q ��'���@�>}�ꫯHII�駟�v�����[]�x1׹�m�ٖHDDJ�ƍ����U��;t��#�)���t�ΝK�v�8v�_|�;w�Ta�������������2�֧(�)o��{���ĉ����9�������ӓ��'N0dȐǪU���ɓ�ϻu�FDD3g�d�̙��:s�NNNԩS�k׮ѯ_?���عsg��W~K�׬Y����ciiY�k�Oa��[�nl۶��?���?�''����kS��-���.��z��:�η�~K||<#F��qnӦMs�dذa�����Z��������cǎ9�e��FDD��O<at1X��͍�P(L�8���D��}���smE(""""�ʾ]�1�;Fxx8111��?��d2aggG�.]���(ևJ"@hh�yumGG�Bmi/""""R�[9�ԩS9�߫^�zҳgOjԨ���%mڴa������k��z��]�www���\�25k֤[�n�[�.�
������kkk���h׮����9�͛70u�T7nL�ʕIOO/�<�����Y�f����i�&Z�n]�k�Oa�q���0�Z�jaee���3f�x�y�6Ž��*��Rد����F�2p�@4h@�ʕiР�fݺuEZ������_|1DZ^�zaccCddd��"##�^�:=z�(�\""""���{����x�爋����G�)"""""%$33�>���#G�k�.._�Lzz:��dzy�f��}��p��q�f�ԩ,[�̼e�����HY�0�L�� 88�������.22�ɓ'ӬY3�nݚ�ʕ+Y�f
۷o�q��\�|��}�2j�(�y�Ρ�GHKKc�ܹ|��G�hт���"""""���v�k޼ylٲ��U�2d�z��A�&M���������~lllضm���/�liii�����ٓ	&����{����u�e�GSy�~�GZt�m�#�JMM%--�իW0t��<�
>�]�v�q�F�����q�F���rm]$""e�o���ё�իE�P�l�”)SHIIa�ܹL�0�*U�ci����~0:���H��6m�/�`tC��9��駟غu+VVV|�駹V	�ر#;v��c�޽lݺ�Q�F��ȕ+Wpss3�
<�M�6���W�e�]j�Rv�>������;�~���̚5��'�Xv��ҥK�V�Z�d��,X����	`���F�)P\\&L��o�eذa���cgggt�
�xxxCDD�@���lܸ��"���+YYY�Z��ݻw������%-[��O�>����|�֭[1�L<8��볍5��U�ҦM�\s�':::W���d޼y�ٳ+++\\\�0aB�UYnܸAHH�;w�A��
���@HHC��F��z�DDDDD��SDJY�
HNN��*W��o�N�:���ŢE�;v,;v,��""�ݹs��#G�q�F.\��)�RRR�={6K�,�駟��t����X�-k-""啊(E�.  �
6��gddp��IN�<ɭ[���W�E#�z�*p�-Z0{���7�|v��	��۷��� &&��� j֬	��_Mjj*NNN��wrr�ȑ#�޽�����X.���8E��EDD����;��FDD$))�~��Ǯ]�x�Q�(&���>��iӦ�����e�9r$�*U2:������#m۶m,[�222���`޼yl޼�\����@��͋<���߿___RSS�ӟ�T�`�ҥt�ܙӧO���KBBAAA�z<�c��l�mTq������������Ǐ�O�>T�V���(Z�nmt$)��{�������%>��%�-*�*��bI4"1b4*
�Qc!�Q�$Q,H�R�Q�[,�"QA���!ҕ6���aav��~��s�;w�ݙY���s/lmmQ���-11�|�	������ooo�!�I{>|�.h;""z͵n�}���vDZ���lz�N"`ll��������ݻ4hƍ�q����+))���(]���v�څ
6���6>s!K IDAT66���ߨ����)�w��%K��ၓ'OJ;�ܼyЦM�r�K:�H�i;�x��lmmamm���H4n�X�!�+���w�ޕ� �����������}�"!!�z��X�T��g�r�""�:GGG���j;�Zk�ܹX�b����-[�`ڴiptt����4_������ѣGh׮��a͚5ؿ?���p}��g���hee%�ܳgO��Ǐ�i�r�K�$y�����4��S������m���P�5
���D��egg�k����|���X�t)���ggg�v�!�������5�N�D/��D2����K�>|8���p��)�߿W�\��͛�k�.xxxH���D���?q��q̜9S��%����`�\�t	zzz��/`gg�T��޳JFp)ݩEr� ���$��DDDD�I5�����k�h"R **J�!�jcƌ�vT�H״��8���#))	s�������oh�n""""��U�F�`gg;;;����ĉرc�����SƎ�`�Ν�ׯ�v�*����<x��s��ѣGhҤ	������C�خ^�*��%11��[oIӚ6m���4dff�iӦ2�gffJ�iJ����u��ppp��b�H	��iHQQ���kBZZ�N�
4n�W�\��u��1��������3b�{��A^^:v�����4_���1n�8<�3f��
p��M������CTT�L��ߑJ\]]���#�j�
;v�P�c
�^����(**Bbb"|||#F����ԩ��aʒ�I�iB���ҿ��߿��%""""z�����������ooo4j��|JDU���333m�Q�q�...��񁯯/|}}e�YZZ�,/\��������Ν;�s�N�e�j�
�����"�ѣG=z��M?ԤI���ʤu��&L�.����O�Frrr��������
� """"�n�>rJXXttt��-~��H����k;�cJ�9YU�N�B�=��_���ׯ_g�Ҙ��@GG����h��^�j���ٳ�1c:w�ccc�U�V7n<���J����ѹsg�է�(����E�ƍѫW/,X����S�lm��>Vիz_YٹR�2^�z|D�����
;|�6v�X,_�o��6����������+V���[�~},X����ppp�[o�ԫW͛7ǠA����={��o߾��������h޼9���}}}i�#F���111嶏��AÆ
1lذj������H�>r�DdddMMD
���a߾}����TRR�/���~�-n޼��m�j;$��������U.��ÇX�p!"##1j�(�߿:t�r�D�CAA����w����zu�������.�����x��1~��'�9�wﮱ)��1s�L�խ���b<{��/_��˗�i�&|����<y��CSګ�����b�:������N�2,,,�x�b��S%�o�����m4hGGG�ɓ'hٲ%�ɓ'�|�2��ܪ�^�����HY5�9�oxi^aa!;�ɑ���ɓ'�ȑ#�����1��E�~������D�2


���5k������F�U�Q)o���ggg�ܹ۷o��SA�x���lllp��]�h�����ᅬ��z���ǽ{���k��СC������ǡ�[c��J�cVXX���IIIX�~=8ggg4nܸ��Dmﺄ������₃"44�-�����ܼVu%"""���ڧ�!"""z�ܻw666�p�N�<	gggm�Du���1ڵk�z�Ի�>t��v�
xzz"99�SHk���� ̄Y�fؼy3�4i���\�vMۡ���N���w�b��v�>��st��FFF���G�N��t�R�;w���8}�4��+KOO͛7ǻヒ��h,Z�� ���
/^��vxDDD����������T���"::^^^044�vxDDDD��x���t��b:����b1F���PTv���*m/�!��)Ū��EFFb����?>��""�*9s����===\�x�����w�܁��F��^�z!%%K�,�����C#
x��fΜ�֭[�����prrBJJ��:::�~�JHH����|�M���}�����DNN�¸v���4i4h��'ʤWۃ �РA�=�ʱ��c�`ee}}}4n�cƌ��K�*��֭[��с�������-**����4��*�%&&�ƛo���{����Ta;�u�___���_n���\�xC����7n;;;���+�_zY^����s|��0`�6m
]]]4k��F�©S���*֬YKKK<y�{�쩰MʴP}_ʝ���c�q�\\\вeK���e˖puu��۷�֭�M/^���,,,�nw��M�����7�DII�¶�J�s��7n���������Cǎ�~��j��"�wu�wuۨ�߀��u"��D"������???xxx���R�a��H����P�t1e��:q� ��9s�� �D"��p�ª�R��ϟ/�D�*�!��\Fe�#Nm�t�`kk+���“'O����������P��HDT��ٳG���>��#!''G��	yyy’%KCCC�K�.‰'�UU��Μ9#4j�HP�chh(<x��6����߾}�P�~}�y{��%��aQQ�`ff&.^�(� ���	sss���Hn{$�2D��	&��d]xx�P�^=��(>>^a� �������>.3g�˖-�[GYϟ?bbb�/^ȤW�|���

�m���/�;w�\~y��y�Ǭ�,���Ra:::Ʃl�<?��@?~|�eTv.����=��ǿ��`dd$7O�
�cǎ)�W����[o	����r�}�����ɩ��
U�=��*l��5k��\Q�W���n��7@ѹ.���(8::*\&���Hs�}#""�jtQ�#�$''�v�*w�Uu��im�����<���X�lƍsss�h�cǎ�ҥK����������FTT4h��p�5��O?����ƍ�z�j\�rC��vX�A7n���1o�<ܾ}���8�<�O����8::"55Uf;A�}|||������ݻ777c֬Y�w�


p��t����������믿"--
�;w���طo_XXX 55G���m�o�FRR233�nݺ*�3f�'�|����gϞE��s�Z���XfΜ	��~۶m��ӧP︜={������������4M��Abڴix���q��Y����ԩSh߾=


d���)�\:MB�q�ťK�еkW�={yyyx��9���`mm
A�z�j�������
G̑G^��ת����㴴4L�8���3f������$''c̘1�����㑖��t�&L�ؿ�����Pc��*{����
GGG���c„	�q�^�x���D6���@����n��7@�yADDDDDD�ʫj�ez�JFQ�󪪎�4��W}?VdӦMB�޽����K����*���[شi�#�=ؓ�����r��5��w�ttt��?��vHT͔�����K�,�[μy�*\/q��yAWWWPn��E�)|���ŋ�m۶�֍7N ���Ȥ�\�R 888ȍ���֭[˭S'Iy�~�i�m�?.��(�C^�RҤIAWWWHMM���_	zzzB�ƍ���|A�;.
4���r�Q��烤��f�*��o��&LMM˭+����w۴i#~���r�n߾-�������8���͕[��2*j�:��*�oY_~��@<x�P\\,����X<xp��Z^�.]�$���e���Ӆz��	����>}*�<e?e�s�I���9��6������u����:�]��]�6V�o���4��Bu�i�oDDDT�4?r�����/|��W:t(���0q�D:tH&�X,�X,ƥK�0d�̚5K�.//������5F��͛7����\]'N���Y�0h� XYY�>�������S�z䑔w��������x��w�f���BJJJ��c�����ԩS�o�>���YYU�P������޽{�y���t333��b���#;;[�}JDDD�mYYYX�`z�쉌����b���077�vh�%|��'r�KF�8z��22331i�$aĈX�f���Ǐ����m+�!�ݻ'���?����с���̺)S�@GG�����5p�ri��"1{��ri�����O�*�x9J���3����c��u�v�Baa!&O�CCC�ɽQÆ
+��"U=<<<ʥ����˿?�w�߿A`iiYn�[o�56ʥ��x�B�m�A�}]��cǎ-Z�z�d�ԫW�/>|X���ԫW/t��.\@zz�4��_~AII	��틦M�*��T9�$�~������Օ��&�s��9��mcU��;/�������^u���$!!p��-8::�M�6�駟���WWWXXX ,,L�?##...2�ܹ��˗����G��)�������N
�5kRRR�yRSS���dlܸQ�Ph˖-�|NKKCxx8������]��S777dff�?��~�	%%%X�d	`�ƍعs�4aa!����������r�KS���Ţ��Qe�9ryyy���)���
���q��Q|��G��I""""��v���ŋQXX�������M�kB��$�ĕuP�}���u3g����ѡC�޽��חY��@�=��k���x���֭[ˬkӦ
�S�N!<<\n�hժU�4ub�h߾}�4ccc@qqq��Ϙ1�}�BBBd~.;���qiԨ�={���l�����#OUχ:�K�LaWRR�VL�ciw��ŵk��.���� w��ꐛ���V��6����r�**Wҁ�,I��β�	&`ժU8p�>��c�N�Sє>U=^��{ׯ_�D"�eYYYUZ�2����K��wL��]�6V5�ʾ�D�����k;�:'**J�!Q�ѧ�����nݺ�]�رc�>}�.]�`�޽8s�>��C@HHH�r۵k���Xi'�]�v!%%ݺuCXX.\����H�������9���c������8w��n�
����o�ɿ%˪�S�6m�`�޽���Ŵi�'O���߻w/   �ϟǙ3g���	����0NeڨJ,�U�Oll,�s���⑤I�����D�)00�������D������cƌ����1{�lvL!ʏf�(�?����H���`���hܸq�<999T�c���^^�����:uJ&�<��#U�EB___�mJ�ҥ���[�n���%''�O�>x�w�y�9.��oܸ�tLEEE
�S���$��T'y�xy�پ}{�o�vvvX�j�;������c(M22I˖-��F^���U9˒���#���	�;㔥�H~��tHy���t���:�T�*瞤�6�US����T=��mcU�(:/�^W�[������� ����"""�j���S$$�Q�v�*wY��ٳ��J��[�d�t䎲&O�,�S�@���-Z��������q��!���Μ9Ap��u>|�o��ŋ��@JU�̢E��murrBHH��Cccc��� 44w��ŠA�0n�8�7�ҲUmce�({|T�?7o��cLYm۶��CDD�E������2��iJFF���ddd`ٲeD߾}����^�zi;<z�4h�YYYx��ʣm\�~�}�ttt�k�.t��Ea������Q�����}Ae���q��u��ɫ#��6c����"$$���rGM�ĩ�q���EBB�9��}�V��֭[�ݻ7F��]�v�]�6���IG�|�����mۢY�f�ܹ3,,,j�nI�(E#�(K�}]�築�	�={���L4iҤ�gϞI�TE���ѹsg:t)))x�����`nn��dbb���L�mW�!�:�s��9��mcm�@T[�������vDDDDDT	���)�!��#e�]�b����+`�ʕ�<��:u�T���>���I���Ҏ���}��)������U�V!""w��P���S��CWK�-.=$�ܹsa``���8|��0aBBB��J�V���Ţ��Qe�ddd����$M������ӧ:t(��å�|i��G�N�:��FHHbcc_���"m�ܹs*m���sL�8yyyX�b����\�K^�̎;S�L� 
?�'O�ɯUc�n�Ǐ���)��ۇ�ϟ#22
6ĤI�d�s\&N����Q*���?#++Kf�u�M[�z5��#E]�~��ޘ6m���dFQw*!E����U�:��:�_IY���r�_�pA&�*&L����b��� //��{�ɝ�F$����䮿t�R�խ�qW�|W����oQm&w8~��>DDDD�A�#�(KՋ���>W֩��h!k׮���ѪU+8�۷G׮]���T�z*���'����>VVV8u���ߏ+W�`���صk<<<��G),[�6V���G��#)Sް��4^��"ɏ�����޽��#��Q\\v�؁������òe�`jj�����{��ҥKX�z5�
]]�[���HL�0�>:$M_�`�^���c�b�ҥ�1x�`\�|����ׯ�̺��dt��mڴ����Q\\,��O>��\www�ڵ?��#V�^����W�^Ub�	FFFprr¦M��v�Z<}�ӧO/7M�:ǥO�>6l�;�	&`Ϟ=
��x��1���P�^=,X��J�V���A@II�JS�I^(�2eJ�u�������<�GE�.]�k׮�C����T�:�Z��W�>1b~��w�]�Ç�YWRR???��ᆱr�Ə///�۷O�JMN飪1c����ň#�퐴�&�s��9��m����."##�Q���j�����U*�.����.�D"���EA8w� ��3f��koo/�D"�ڵk�-��HT.}�ر�H$����J㷵�D"����!M��?�e*�K�z���
��%�]�&lذA�D���M��U���ҕ=>��Q�F	"�Hx��i�uO�>D"��TZ��N��#Qm��~���D0`���k;z
���
�������ЪU+���R�!��){����c�7���p��!??_��߄�3g
����������(�f����w�rrr*��֭[����@��/���4!77W8q�еkW���W_	� �b�X�v���K >|X�@ᵦ*�(S^E��_�rE 4h�@ ��ŕˣ�qA�w�ЬY3���[o	7n������P��������k�
������˫�^u�����@���
�/^(Uf���ٳ���4���HHNN�L�"������P�^XX(���Btt�0|�p����'�>}Z�2*j�:�Z��W�>~��tݘ1c�k׮	/^��]�&�3F ���W�M�u��]�WWWW��̔�O��Q��������ˆ#�˗//^��_�.888M�4Q�\Q�nu��:绺m�����������e�ڎϿ�4��7"""�F5�9eǎ�H$���A!((H�D������o�H$L�:UHMM��󅯿�Z�D����4�����_�.	O�>���;A$	nnnҼ���>@�4i����� �X,D"��CU�Q��B����H$DEE	���BAA��믿
"�H8p�4��8�m���({|T�?���D"��ᅲ�_ұ���?/��d�f���2___�^�zŒ3d~T#҄��B��o�LMM�֭[�����ٳ����k;4�2U��<(��Y��y�f��"�Ha�ҟ҂����������|Aa���a۶mJ���&L��U�#���([�:?b���G t��]a�����$�cǎ�����R�z��G�
Rx�T.r� IDATTfPP���-[&m��={��C���аaC��V����u����oE�8::Z�٥���@n[�터j�*i������G�x�?��`jj*���;w���V6���]��]�6���	vN���Ͽ�4��7"""�F�Ϸ�$s5w��M�riS�NEӦMq��U|��߿�tX�3fTZ���+ڶm��W�b����۷/F�������7o�4�A�˗/���
&O��[�nI�߸qиqc�رc�s^�ROU���|}}1`�X[[cɒ%KKKi>yq*�Fe){|T�?������-I���U)N""�[������"((�ܔ~D5�ԩS�ѣ/^������N�A$�ȑ#q��eL�6
�Z�����x�
6G���ٳe���*�1m�4�>}�>LMM������~+W��ɓ'ahh�gϞ!::M�6�ĉ�*������ؿ?�={Vm�Դ�3g�O��0���E�[�nHJJBPP�{�=���COO����������bŊj�W۶m�{g
@WW�����nƌرcz��	4j�C��/��ooo,[�X��tuuѬY3�����w�܁��}��,M�}��[�>=z4.]��ɓ'������077���3������JS�HXYY�ʕ+�1c���;wFXX���s����]��]�6j�oUN,C,Wi���4�.�NV��-�S�"##1�|̟?�S)�Jt+�R=�vF�v��riM�6Ŷm۰q�F�?ϟ?G�����<�
6DHH~���<y���hР,--1k�,t��A�w�…(**BLL���ѱcGL�<���CPP"""`cc�`ӦMHKKCAA��T�رc������H�\ҭZ�������
�q*�Fe){|T�?#F��w�}���8;;����
bذaj�;""�V�Z���5��c,\����5j���/s����===-FH����������?��U���m��MMM����R�������ʱ�R���m�����?��nU�Ki�1c�R/QTG��m�����j����\�Mbʔ)r|W�X)K^ʔ��1V�h@�.]��?*]���������Sa'���{u�=hݺ5���T�N�x+ʫ�qW�|�k�:�U�w��4������N�<���x���hݺ��ê���Dlܸ&L���z���Ј�����X�C��,?~��-Z����O�y�kԨ��wELLL�#y����Ç�]��x�A^������*�C^�ʶQ�X�9>��A�pttDpp0�<y��-[�<y�˗/��͍o&�F����W����8�>��\>���h!B""��$�Z���aaa��h��j���3�SFII	RSS�����D����r�	@:JJu�����|,[��ƍ���9��/T.]�QQQ022��:�����n�ش>D�qqq���BCC�i���077��ɓ��.~��Wt��
���X�x�tCy�7o333
GHDD�rd�{��!  �S��b51ō"���C˖-�x�b��4RoMڶm���e���4i��ӱm�6-FFDDDD�;��+���^^^���Fjj*RSS
///��GODDD��{����?�ᅬ�ݻ�ƍX�t)�#"�WR�&MЮ];ܿ����ի��C""���v\)))A`` Ǝkkk0S�Nž}�T*�M�6���L��'N`֬Y4h�������yyy�%K�@,����_�X,�����m��N��p��%2�f�dgg#<<�{�F��ͥ���� ����l�c""""�׋Ʀ�!R�H$���;�������rTDD�	����9s&fΜ��j;zM���c�ڵ���Ѷm[=zÆ
�vXDDDjժ2220f�j;"�:g�ƍعs�t���IIIHJJBnn.����*����M�JӶlق��`�|iiiGVV��������D�]����033CZZ|}}Ѽys|��*�G�:K�Gvv��#ʑ#G����re��� >>G��G}�R\DDDD�z��)��qttĺu�n�:L�4I���<z����8z�(����	iƾ}�еkW�������/_f�""�>|���������D���9{����8s�t�����J�/**��ױr�J����t��ݻ������Źs�u�V@LL���+V�@nn.�/_���|��W��ͅ��5j�R{����v��!66V�i%66йs�ry%i�<DDDDD�p�"""Ҫs��a�رx��7q���k�N�!Qw��m̙3G��ĉ�n�:���k;,"""""�F���(=!!�\ccci'��w�bРA7nƍ�r}�5��,]>s�A����q��aܾ}/^���H������

�����$L�4	}��Q�h��Sb�����ח.߼y����ֶm[�<DDDDD��s
i���1k�,6aaa|�jTNNV�^
����8y�$��"""""�r�Ν�+V ..qqqزe�M�GGGV�}���ѤI�D"̘1C�3�ӧO1o�<\�~��v� �,{xx�…HJJB�v��駟��U���p"���r��%i�<DDDDD��s
i\qq1/^�u��a�������t>T�"""�`�������gφ�./������ꪲ#�HF6�7RJYÇ���N�:�����ʕ+ؼy3v��|��G�֧�ڵkq��u�j�
D���ѵkW�?^��աj��GM�{�.I��!""""R�ƞ�GEE�T�D��wDT[����سgv��'''m�CuXJJ
<<<p��������o��f��=r�H<.���n�uiKTT�Q�רQ#�����)))8q�v����S�		A�ƍw�ޕ�/**�v�ߴi�ܹ�.]� %%7n���k�Ny�6m���4dff�iӦ2�233�y�����*Rc�Sj��7�nfff�y�&�
�QϞ=���7УG�����ʪZ��>�����L�;x?DDDDT{�3O�<���'F���;�ѣG==�j���:t(�޽oooizVV�4i��/",,={�D`` ��ݱ{�n��ڢw��5R�"�:uBZZ<xP�ʃ�y�����*R�S���X��QÎ)TA�Ν;��_����6m����kdڨ���j/�j?��~...��񁯯/|}}e�YZZV��A��СCX�|9�/_^n��7н{wxyy��������Յ��&M�����
011��:mlln߯_?�>}����ڟ�����U:""""z=U{申g�bÆ
�],� 22R�!i\bb">�����a֬YX�re�o�U��s��~���^���ǜ9s��+%!!A�cǎ���."##��ߴj�
���pqq�R.DQQbbbP\\��;b��ɸw������⯿�Š+ТE@�-�h�"|��W���ի��Ί:��1�}�bbb���,�.&&
6İa���!DDDD�ڨ��)>�ܶDZ�����4.##˖-C`` �������^�z�x�yyy022��z�v�i[TTT�M;B��q���vvvjm[����]7s�L��u>5jF��r,�֩h�
������x��	Z�l	x��	._�777+���������)��H��������0�������r�Jԯ__��PTRR�~�K�,���BBB�����_XX��z�v�i�QMpqq����E�BCCann�ɓ'k9:""""�
�i;"""�{�\��>}� ""O�<�v8T��šO�>���)S����uL�hР�F�#"""""�###xyy!::���HMMEtt4���`hh��������S����w�^���@,#**
͚5�vHT��������Ķm�0p�@\�r]�t�J,�������4�D"������������""""��B�O����1r�H������x��1���Ѽys:t���y�&:u�$�&���V�C�'�$u�PGdd$���VVV?~�F�%"��K�Z�
_}�fΜ����uOզ��[�l����abb�ݻwc„	U.711�z�Rk�?��͛7�R���^A�R9D�V�}�=�����GGG8::j;""""��4�9%99еkW��nݺ�xݟ�9N�>�� ��OY���ظq#""" &L����SۡQ-�����S�b�޽ظq#��ݵ�!�O�Ɯ9sp��
̟?K�,AÆ
�\���=��߯vǐv��U9������{�
uN�,פӧOW���;�TV_M֭H~~>�-[�q����0v�X,]�QQQ022�HDDT�������8r����p��HMM�����p�1{��Aǎ������W[YD�3E�=�� """""""""�z��D,K?;w�A,#<<���:��m۶!=='N��M�4	���ضm�##"�����W�\a����o`aa���8�ݻ��֎)D�&�?��x�ADDDDDDDDD9EYO�>ņ
p��Y���}��pvvƗ_~	@v����<�رc���ѬY3�����>}:�@����V"�><<����z�*0t�P̝;FFF
�;((,����ƤL����AAA8z�(RSS�������c̘1��������Fxx8z���͛K���̤��L�����ttt���W�aPp��1|��g��>/^�E�Ɍ�����U�V!22O�<���9����l�2x9��ݻ�s�NL�2E�mXX�������(i���H��Q����]�z���ǹs�`dd����A�Ҽiii���/���\�;[�n-���xyy!""��߇��>�u놏?�ӧO��]L�9M�g�ރ���4��5>U~�����:i�s���[����6m�য়~Brr2\]]aaa���0i���\L�>�?��ݸqC������̚5)))Ҵ��T��� 997nD�z53@���233ϟ?�O?����,Y���m������-�4Uڵq�F�4PXX���$$%%!77NNN�#G� //666�곱�A||<�=��>�H��@DDDT
>|�y��a�޽���ǡC�жm[�<ϟ?��e~<��|||�#G��^�zؼy3bbb�駟b�hݺ5>|www�l�[�nU��M�:J<x0����x�c~`` ���x����뇻w�J�	CVVV��===��7�H�

���8deea���J�Q��4y��{"""Ҵ���k;"""""��F���HNNt��M�Dhh(?~�-Z $$�ϟGPP�܎�v�BJJ
�u놰�0\�p����ٳ'���
@�
��������~��G�6m�`�޽���Ŵi�'O�T��v��!66���r�V�]�w�^/�F:�<Μ9OOO@DD�4_ll,�s���ꓤI�iB~~>V�Z���~III8|�0~���rS`ݺuHHH@߾}������B\�v
�������055Ŏ;���ggg���YYYؾ};7n,%x9b�dY�:J�ԩnݺ���<i'��Y����w��E�p���x��O��իW˕%���믿�ŋ�����͛���#�
M�g�ރ���4���QzM�?��̇����:htZIg��]��]��t�X�d	�y����%�.]�9s���=v����-Z��㇗�����S�T�E��u��'''����}V�ɓ'�L�S�*�266FNNBCCq��]4�ƍøq�dʼy�&���jʒ�$�CDDT��۷���[[[m�Buā0�|���a���?~��G����ݻw㭷�t��۷oG��k�.��7C���y������#..�}��ZaL��!��;�͛�իW###C�~߾}��[��O�>�`˖-5j�LY
6Dff&���q��5���c��٘={v�qӫOQ�����N=�M�g�ރ���4��ٳذa��� ��$��DDDDU���)e��]�k׮�.�\�+W���a��z�����Ҳ\�>���ɭ�Ν;Jǩ����K�ݨQ#@II�R��{�4U�5w�\�X�B:�-[0m�48::���P�O�#��y�%i�H!""�8v�&L�+++vN�*�s��Ν��b�ĉ��o������n߾
����$%%�,����رc���C�.]���[mu��Q��(�M�4 {M(�n����)k������ôi�p��Q=z˖-Ò%K0w�\W?QE4y��{"""Ҕ�"**
����Q4%.�:4:r������Si��rrr�5�����[E*z+P�]Ç���N�:�����ʕ+ؼy3v���<���
/IS�DDT�mذ��9��p���˃�����СC�<y�
Rz��:gff*\��5��u�-��u]E׫e��J_KJL�8#F���}����X,Y�~~~���Y��j�z�v��t�ɑR��}�=���H�8�Q������� ""�:���������� /�,MHH@@@��o�I�&�<�mժ�ʕ+2�]sss/��/]��_c�I���Q�F���Cpp0v��	dee���_��iӦ�p#I��!""*((�̙31o�<�X����022�vXTK�ٳ�;wƦM��f�\�|Y��)��#�ݿ_��EEE2����K$%%�w�޸v����j��ŋJ�-���̙32�qqqr�7n�S�N�ٳg�ŋ�����󕮓HM�g�ރ���������J�H�HNN���e�K6l`͚5HNNFQQ����f͚ry���7n�@qq1����a�����2o�J�̓Q]ӪR�*�3f�b1��ك��<t��d���ԩ���.M�&�CDD�����C���ݻ�w�^|��|ÝԒ����C�b���<x0RRR0o�<��>�߇~pttĥK�PTT���4,\�:::2d�4�o���o�����Gll,������~�摜ӷn�R�eM�4	���3gΠ�����pss+��}������-[����=z�G�*y��2�������i}T����_���߇��k�庺��ԩS�z�*&O�,������͓.7n�;v,���q������Qu���꫈*�rqq���|}}���+������ӧ���\n^y�񰵵U:F""����푚��s�Ρ{����j���xyyaÆ
�֭bccamm]�2===�o�>�;w"�Hf���1֭[x��\]]abb��zzzرcz��$%%���o��&���ѩS'�i����W����Tf���駟�����J�'M���7o��]�hf͚www���ˬ+�-�:4y��{"""�MԝrQ��2��͛7��CoeϿ%�s����H騑VVV?~|��MDDDD���FN�v��riFFF

���LMM���x{{�}k�aÆ		���#���Q�~}4j��
���e.�,X��-[�~��(((���VG}��k�رX�|9�~�m���C__�۷���+V�X!�7b�#&&�\}111hذ��mJ""z�mڴ	����B*��������m۰~�z$$$T�c
���8w��Ν�6m�@WWM�4���=���ЫW/���;=z����4=m۶E@@?~,��~�z�k�����iz��C��600��S�0{�l���000����u��ry���KKK���ݺu���'v��Q��G���Ӛj�&�x�ADDDT5��9����F�$&&b�ƍX�p!,X���\�|Y�a����<Y�#,,NNN��e��Sjj*F��-Z ::���"88���C˖-O�<���=���0}�t-GHU���#QY�/_Ɯ9s��ӧc���h֬��ê���Ç~�c�N\�+� IDAT��}�=���C�cvhh��e���U���ɑS�2�ʫPG~~>0|�p̙3����ĉ������Q��I��U��Q�����ST1`���b�ٳYYY())��{����H�X%չ�����L�Dhh(����
�MDDD��gϞ�O>A�޽QXX���xlݺ��vL���<m�@�2M�g�ރ���^%b�X�im��mۆ��tL�8Q�6i�$���c۶mZ�������EW��3r�H�ٳ����Y׸qc̜9SK��~FFF����g�}�)S�����a�j9:"""�MJJJ�}�v,^�����֭[1u�T���h;�ggg�?��C�aPTS?�$$$h�>��DDDT[�A���AAA8z�(RSS�������c̘1����R]ʔ]���ll��Gnܸ��ϟ�Y�f4h���all,�MPP,X�gU����Fxx8z���͛K�433�X,Fxx8�L�uv!�R�d�E��u��8|�0�ݻ�����?����5�O�.sAK��Dpww���������Z����4��ի�ڵ+�ׯ��P��x�">��S����pwwNJ+`jj��4�aÆhذ��� R�6�x�ADDD��ƍ�s�N�raa!���������\�tY�.{˖-�IKKKCxx8������-�������*_�U��#G� //666�ʶ��A||<�=��>�H�������v{%;�ԫW���ptt�v(u�/��m�Ν�9s&֯_777m�C��ӧO��_ $$���������;�h;,�:C�FlM��}�=�����ٻw/   b����8t�|}}Q��)ʔ���Pn�ؽ{7����G���������憘��ru�k�!!!���W)ƪ��ܹs������XvN!"""zͼ��S����f���~~~X��ػ����O\PP1��QM�4�p$��JL��MQ��Q�rטTBM4�J5���`�⤉��ĸ�GY*��`��뜟G@9l�s]��s/�s���羧0|�pK�$�DVVAAAL�:֮]���-|DDDDD���o����J���%55���Ppuu���OO�"�U��<HNNgΜa�Ν\�p������\��bvbJq�s��9�6m���O<aRGDDDDJNyD$''����޽{Y�z5C��tHRN>|�������c����-mDDDDD��7n3f� **���(�-[��o����իW7֫\�2w��%33��U����Ν;�z���ׯ3~�xΜ9��XNNN�2C"���:�͛7�U�V���2Cyt(9EDD�p��E�����طo��ΖIʁ��D>��֮]K�=8u��Z��tX""""""u��(ym��777���ٿ?۶m�ԩS,]���k�2z�h�v4�k���͛$%%ѨQ�\�$&&��w^�͛Ǚ3ghܸ1/��͛7�M�60 ��Y5�8�1��Y�R�\u
eZ�SDDD��Sb�):�).\����3��_��������C�2.++��?���3g��c���_���a�D�͇DDĒ���,�H�ggg���;���>}�={��j�*-ZdL i֬7o�d���x{{��c߾}<��f�����(BBB�S�			��YYYT�R�K�E�nݺ\�v���d�֭kr,99�XGDDDD-Ş�ҭ[7��Š�[)�'�|��>���������X:)�����Ϗ?��ĉ����{#b͇DD�,hҤ��C)���Õ+W�w�޴hт_~��d��=z�_|A�ʕy�W����ƍ�ٳ���_���+f�meeENN?��s���G����/����̙3��)))����P�qZ�lɵk׸t�R�$�K�.눈��ȣ%��z"""R�XYY1f�%�����0��^z��͛ˬY��{�����?�F)��
�ܹsy���y��g�:u*�:u2��۷/���dff��ӫW/�t�B�޽Y�p!��o��^3�oÊ%����������!C8����ٳg��u��]��똡��+�XEDDD��(��S:����[1CNN��C�r"##�0g�4h��_M�޽-V�w��%���,��A���HY���Ehh���)Sbbb
\��Ã*U�f�Φq��<��s���ʕ+�石e����~����ҨY�&m۶��ӓ��P}O�4���\�v���&O�LVV���ܽ{�-Z0d�~��G���ظq#...�~��:NϞ=��ψ����7�49I͚5�ѣG����ؓS��H�[�n���۹s'cƌ��ի|��L�<kkkK�U.dgg[:)�4K�u�啸����C�V�\����ӿ��W�����pss3)�U�y�1b���&��W���ԨQ///����r�
�5�ʕ+�<y��#Gbkk[�EDDD��ж>"""�͛7-��?��}��w��t�Ё3g�0u�T%����ݻ���Y:�2iذa4h�d���P2d�#KQr���H9���C@@-Z��6#�@�������Os��E���[6m�D�&M,Z����������)�lll�'<<���D	��ߟ�ի[:<����'?III��ݛ�{�o���˗/ӷo_�ׯώ;�}<'''�t��s��Ѳe�"��o�>������IMM�U�V�����ӇZ�j�K��=2�������^�z8;;���MÆ
�û�+�����lA�5�y��Y^�w�FTT���0�H��Hœ���;�æM�X�p!��׷tHRF}��W�?��7o2k�,ƌCժU-V���O�:������ȣ�g���LJ0z�h:u�d�DDDD�RJ=9%>>�6mژ<o۶m��?q�D8P�����4|}}9r�Iyll,��������燫�k��sޣ���^�ʖ-[��o�]�v%:��ĉ�q�Frrrx�7ptt�C��MDʈ˗/����?�c�z��a鐤:w�cǎ%""���3o�<,V�����=�Ex�y��gEDDD���///K�!""""e@�IN1</n�_$=p�@���:u*G��~�����t�ڕڵk����-[��z�j>��������Oy����������$00���(>���lق��M��Y�x��V-ɯ���1Gzz:ӧO�������ӦMcӦMf��"R�DEE���c�=Ʊc�hѢ��C�2&55�Y�f��g���SOq��{�9K�Uaddd�c�?������������ܫRi���d|�^���� ���ذaK�,)�,�t��!"##���g�ʕ���k���S�re6l�{�ǨQ��{�.K�.�t�%�Z�j�jՊO?�GGG~��W�o�n�ʽ+V������e�
"))�+VX02)���K�w�Nǎ9z�S$����ӲeK���X�h�}��S�YHH�~���Ðr�0?��t>+"""""""""�*��s899���mR����w�6)www��ɉ������Ǐ��/2j�(c����^���bpZZK�,��ݝg�}��^{��K����a2�!�b�Сԯ_?����o���2dȐ|�˯�a��rsb7�q��E|||�֭/��s��!==���уT�Z��<x��؞={5j���8;;�������1��\�n�b�…����-ZDjjj���/��s�u�6l�s��&�c
40&tݺu�H�H�ִiSƍGxx8�k׶t8R����ӽ{w�B�^��p��G��J�R_,�«_�~��"eUvv6˗/��Ãg�}�����z��[��[�s���u>+"""""""""�+�o*[��?///�6m��͛������GGG֭[Gbb"���gΜ!--
[[["""���o�ѣ7o���իX[[ӭ[7�X�-�֭[f}Y�����Q�8}���,11������	�R�?�x����ڵk��ըQ�w�y����%��q�9��9���d�ܹ��͛���f�ԩE�ٰw���e˖-#88ؤ޵k�ذa)))̜93���6/������;$$$��n�:���			1��7s>�]�v������K�~\\\���&""�~���H�"R�u�ܙΝ;[:)C~��7�����?�i\Q������2&00и�%@ff&qqq���q��mn�q/�ϊ���%XYYY:y�R��6>>��m�������~���8N�<���YYY�ݻ�J�*q��a�ܹC��Սm��׿�$4k֌�����s�c��ϐ0�v�ZN�>M۶m���i޼9�.]"  ���h����۷/7n��Q�F���/��q�9�4m���?LHH���c�ԩ��Gaoo����������^��ʊ��8F�Idd�q���,H[s�^����5jĬY�hݺ5�O�f���\�x��+W��㓫]~+����9>|�֭[���Pv��a]�rrrX�r%���?�{�.˖-���~��"��ڲe�T���dǎ̝;��7�S
z��y��gEDD�4u�֍��0K�!"""""Q��\Jڴi��s��2����c�HII�O�>ܹs�C����޽��C��31�A����H�ʕi֬����ر�X�r��Kb���^����n0e��4iB�jՌ�SRR��ݻwL�8x� �}�O=�;w����?�O>x�V:Ei��}��0u�TڵkGժUi߾=~�!{��5�ς2�s:w��G��x�	�:""��:~�8...�1�~��q������2ʰ�M~�z���fa��CCC	���������n�W�9ƽt>+"""""""""�+��S��:o�<�͛g|>k�,f͚�q���O?5&�DDDP�Z5|||����ͷ�~��/�L||<�*U��7��p��?��3���y�x����s��ei֬Y��srr�}�65k�4;��^����nмys��vvv@�$�\�~�:uꘔ�?�3g�䪟����
�6/W�\�}��&�;v��իy�3w����9ݼy�Z�j�g(3�����ݻƤH��ׯ3}�t�����c�/y�q��1c�������2�����E��Ս�
3Ǹ��gEDD�4:t�x�����\��_�n�S��ק}�����r��M���O�.]�S�;v�СC���q��i:t�`���j
<����U:ڵk��˗9r�H��)��=o��mڴ!88��Ŝ������븿ܜ�
�V�j��8�b=~�8�Z�2�͛7�3g�иqc^x��7oN�6m0`�C�+J[s��*8`��d�L���P�=tE*�����}���Y�d��Ñ2";;��� �O�NժUY�j��	"��	υ�J�(���pvvf���l۶�S�N�t�R֮]��ѣ���f�q/�ϊ���%��s��n�:%���H�)�䔘��?Έ#h۶-+W���ѣ����t�ԉ�� ��nnn�<y�U�Vq��m�u���htt4_|�������),.]����qppx`�^�z�c�BCC�ݻ7���&dz��Y�|9999�����++�\+�<��⎽$eff�n�:\]]��QQQ�����dz��L��WQ��aÆ���O�<y�.]��O�<	P��9�Sݺu�v����ԭ[��Xrr����TL���+�����ɓ�]����H���qqq�;???��g""氳����wwwN�>͞={X�j�-2&�u���Y�_�[�JH||<m۶��^z�%*U���͛��)]�v`����iDA��3,U
�\�N��ٳg�{�.7n����?��ɉQ�F�>��t�ԉ_�ooo"""�u����|����7���(�v튧����!�b�֭�������ܹs͎�~��^Py�G����߉��gܸq\�p�F�ѳg�\��=JFFgϞeڴi�򔔔�����e�}	 66���,bcc�3g�=��Y��Üϩe˖\�t)W?�2C�XN�:E�Ν�z�*G��w;yt\�v���z�ԩéS�X�`�S�BCC-��Y��郓�_~�%iii�h�GGG�tuEs�]�:������������ܯԶ�1'9�nݺt�ԉ��Z�lI���hڴ)��|�2�Z�*�]|u����͛xxx������f������2d���իWg���&es����w��~��?�5F��ݙ5k��Rծ��lٲ��>���>���K��27����=��a	������'��\�vuueǎ�����痫�ٳg�_��?fA�԰a�ػw/?��3o���ɱ&M��*+N�|N]�v����өS'������L��ؼy3Æ
��+�6m�司��,������7n����K�q��i�eE,mذa0w��\��w�s��y��gEDD��1w��ӧO��o����_繝�Avv6}��!11��� F���
q�w6���!,,̸����s�o�.""""�.����ߛ<��������a��n�3i�$5jD�ʕ����f͚�����元��+W���WWWV�\��>{{{V�^�رciӦ
���ԨQ��^z��K�2�|�W�n�f���xzzR�vm���qqqa���z
�27����=ʏ��5M�6e��_��V�Z��<y2nnn���`mmM�6m�3g�q�q��|�,hۂ�U�+V�`��ԯ_�ʕ+S�~}
�ʕ+K�.ts>��={bkkKddd�~"##�Y�&=z�(�XE�t������O���6lJLy��߿��;2e�F���ӧ��RF�o)����b�� <<<���U�VX[[cmmM����fƌ�z朻�u��Y��z�)Z�nͯ��ʡC�X�رc$&&ҬY�\��y�Q�Fq�i�'N��ɓ�4iK�,1n�.""""RTV9999E�`ݺu<C7�?�-_����`�n�J�F��r�
}��e�ȑ><�v�{)rrrx��7y��
t��T\W�\a��ɬ_��^�z�x�b�|�IK�%����!88///K�"���|VDD�n���-�.Rޕ��[������ϳhѢ|�M�2��{�2i�$�o���0�͛Ǽy�x���c�
/�HOO������1f�>��S���æM����)�1��++o"""R!Ĕ��)"RpÆ
�A�&�BCCqppȵ����oVVV�Y�F�)����>��Z�jEtt4۶mcǎJL)��ܹc�D�4�ϊ��HY���T�mr
�gϞԨQ�Çs���<�ܼy��R�zu^}��|�:}�4�-�w��&���+V���d�@3h� ���X�b�Eb�������lll�g�ر:���p/^�k�()�v��Ř1c��_��?���I�t7Z9����$�&�*�-�t>+"""��+�dggDDD���T�Z��͛ӧO����q��ꫯ���y뭷r�������,z��M�Z��;++�U�Ƹq�
�+��={�;w�P�^=\]]�������u1i�$Y�|9�n�bÆ
t�ܙ����lРNNNlذ��C��DDDDD
B�)"e�3�<���,`���ڗVDDʾK�.1~�x���+^�uv��M�&M,���۷�V���#)�t>+"""�U`` �W�6>���$..���8n߾m�.�_�~������7VVV&�lݺOO�|�ڸq#			���`oo_�x�-[Fpp�Iٵk�ذa)))̜9��آE��u�1e׮]�����⒫o�������_�~��ODDDD��"R�yyy���e�0Di�K��Kגc��'NбcGK�a1���̟?��s�ҤIv�څ�����3eeeY:��J{�����Y)��l���%Kprr"33�;v0w�\6n�hLNi޼9�۷�ԩS��?�1Y����ϴnݚ��z*�q���		����d;s�_�___^{�5������c�ȑDFF�߬Y3BBB��������n�:W]C��Ç��"""""E���v��
��'�|�����ñ��}��m۶
�lc�m۶1a�����gܸq��R������O?��[:
�� IDAT�G~�%�_�Wr���-������������+���y��ү_?N�:�֭[M��ꫯ����m�6���:t�q��8x� 999�9s��;wr�����;RSSs�2d��|�ܹs4m�4W�'�x¤�����HaU�t"""eYNNN��)����ҥ'N���/��ʟm۶Y:��x�"�z���_�K�.�;w�)S�(1�����iӦE�x,"""""e׸q�V�QQQ|�駼�����p�Ν\u_~�ej׮�޽{III %%�={�P�fMz���8�ww�"�{��u�|�M�|�M>��c�VA��j�����7oP�V�\u
e�:"""""�������
6$::���~��!I)JMMe�ԩ�iӆ+W��w�^֭[GÆ
-������H�c�xX�����عs'~~~�oߞ;w�t�Rz����͛M�Z[[��k�����Ν;عs'���T�^=�1~��h֬��_��Z�͛Ǚ3ghܸ1C�ᣏ>",,,���,a�V�R��_�uDDDDD
�Ķ�0`@Iu-"�شi��C�p_w�gdd0a�V�ZE�*Ux��9s&7n�`���lٲ���Lٲe���3i������aaaT�V�W_}�y������xRSS���	�ʕ+8880x�`�O�nr���qn߾kkk���Y�d	vvv�+66�	&p��lll�߿?,�F�&��}O����g�ƍ���OX[[Ӷm[�y��^�O�lc��ɤ��0o�<F�M�*�MQ�Q�����XʦM����t"垝����s��i���êU�X�h���3����Ahh(۶m�7�0�z�{9rgg�"�@HHu��0�������9iݺu�v����ԭ[��Xrr�������HQ��$M�4����ݭ����DJ�{�GPP��Y�h֬�����?�1��?�ɓ'�bŊ\�W�\	����v�Z:���Ǎ��w���w�nrgץK� ::�]�v��)�8�.]j�:--�իWS�R%c���{��ܸq�����˹{�����e�����DEEEJJ
&LȷmYt��i�{�=��ߏ��7s���O�����R�����XZ����ҥ���)���Õ+W�w�޴hт_~���U��ߤI:w�Ltt4�?�N�:ѬY�|Lj���m۶��ѣGy��IHH`�̙������mײeK�]�ƥK�r%�\�t�XGDDDD�(�=9�[�nt�֭��)S���9u����̟????|||hѢ
4 $$�cǎ1c��oߞ���_�Ν;y�����a����O,\���?�8�1.\HLL]�ta���mۖ���3r�H���[BBBr�6�_��۷��ٳ4i҄O>�$W���e˖�\��?���̞=�ٳg��W_DNNN�Uhc��7�|C������`͚5����dɒr�����Œ3X�x1�ڵ�ȑ#�r����?������Æ
#  ��s�2w�\�c�:uʳM�~����f޼yxzz>p�.��O9^WWWv�؁��~~~���={�|�w�ڕ�������s�9Ny���D��֭[����z�a�������k׎�ի3n�8���Y�f
�.]�W�^L�<���Ƚ�.]�+�����5...�$�-[��;�a����ӡC�T��SO=e\�e�ڵ��/��e˖����ga�Z�d	-Z���Ɔ���p���|_@͚5X�h���$%%���Ï?����eANNk֬�U�V�^����@���;%��<�4�C=�У,<l�Eʜ����A���???Z�j���5���4o�ooof̘�gWWW�֭�o�����=ݻw�IIIŲ���ɓqss���kkkڴiÜ9s1b7n|`��={bkkKddd�c���ԬY�=z9Ny���)�/�D��[���[�Z:�GBǎ�?תU�s�6m�\�25j�ȷ�����s�]�?��C�mwU�,p\\�Yq�gaƺw)b�r����y�7X�`o��6DDD0}�t�N�ʸq㰵�}`[K;q��>G�eĈ|���ڃ[D�4KQb����JZqww��ݽ�}T�\�]�v���#G
\� ��Z�j��1C�ʃ�רQ///����r�
�5�ʕ+�<y��#G��9������}%���}�EJ_ff��SDJ���M��Ĕ��R��`Cǃ�?,�#999WYa�,�X���Ɵ��
�����ٳ'[�n%88�Ç3u�T,X@@@�F�*P?����ӦM�/��s����Ę$I�w��!�
�ɓ'M��D����X���Ha6�������P�L�@hh(2��щ���HEP�������=z���hݺu�m�x�	~��'rrrr=����-���N�:���[:t���h>������1a„b�8dgg���8::�e����q��%�<����IHHxh������Hyacc���?���$&&���Hxx8���T�^��ቈ��H��br�ܹ|����1a�&L���ED*����.�#Fp��1233���4�2hР|ۼ���xyyq��q����v��'O��ʊ_|�H1��X��TΟ?o,k޼9VVV,[��[�nѾ}{ڷo���biǎ����™3g�.�
1R1U�Z��!H��䄓�S��_�z�y����။�/���&((����b��=h^U�4��G�3�<���,`���=�N�:Y:,� Jl[�G�ĉ9p�@�{v�8q���@6n�HNNo�����t�����Hqٵk'N�f͚�j��?�	ggg�2'''�{�|����u�V�9�3�<cr��֖�*�����'))��-[ҴiS~��'�L�¨Q������Ǥ�/�P��P�_��|�ʕ+y���9y�$mڴ�tXbaiii�s]ʤ�����۷o�2228w��Νc���S�~}F��ͫJ��p"""�(��������a����H��S����,OOOg���xzz���@Æ
���`ڴi����r�""RT,0��o߾B'�l۶�W_}��U�ҨQ#&O��޽{�Tn�ڵ9r��ƍ�iӦT�R{{{���KTTT�n/Sc}���4k֌*U���0r�H����ԩիW�z��m�___V�ZUl��\YYYҢEv���ڵkٷo�S���LK� \LLL�4.\��۷�ҥ�֭#**�C�����jՊ��D�e��߼�4i'""""""""R2,��R֖�.	+V� ))���
DRR+V��`d""RP999�����o����…��ɡZ�j�������>��u�������._�̼y�U��C�֩S�O?���~����Lnܸ�W_}��O?]�xJc����?���Ibb������?����餧�ǜ9sx��r�Y<���'Nd�ȑ�={���-ɣ�F��Aʹ�����0{�l�R�
իW�cǎp�Сb���NDDDDDDDD�d<r�\�~�ŋs��!���i޼9o��&~�!��]�iii�{�n~��W�իG�^�>|8���&�
?���p��-6l�@�ΝM��nРNNNlذ��C��"RDDʖ�W����s���ٳ��C������ɓY�n={�$,,GGGK�%ePrr2U�<r��R��WdggDDD���T�Z��͛ӧO���k���ޞ����\�~=W�_�&Mr��r�XP�9���
X�h���T�V��_~�q��accc�sϞ=lڴ��g�r���ի���+>>>����;��+���6<

bҤI8::�|�r�`�:@s8��H]U�}�6Ç����Ʋ�g�/��+##�Q�Fq��icYbb"!!!���H�J�/<�k�.���pqq�u��Ņ��h"""�ׯ__����������o�q��1%*TP,Y��ի��͛y���-��q:)n����^��<33���8���}�6�6>|8�g�fĈ����t�֍�m�R�j��eΜ�`�ȑ$''p��6o�Lvv6S�N`ٲe���v�6l %%��3g(��X�h�n�2&��3��NDD�|0`��C�p6m�d�DDD�y������r��e6lHHHG�%((��8��k�r��iڶm˺u�8v�aaat�Ё��h����;��ݯ�����n�:W߆2C)�fϞMTT�S*�o����;2}�t&L���ӧ��"���os��IK�!��-[��d��=���`�ƍ&u_�u���cժU����^��w�%,,�����eΜɠiӦlٲ�Ç��o�o�>���������Ç9r�_|����@��*s5k֌Ç^
:���DDDʫ&M�пK�!R!���__"""RlJm��S����!�p�t�ԩ�k��N�:1m�4ƌcRw���аaC�������ۗ;v�ZB�^�Ν��P{�'�x¤����]������[999�֗��?�̄	ؼy3}��a���4k���aI9Q�Z5�4ib�0��)�|��֖��TBCCIHH���OOO<==�����
777Μ9ñc�8~�8'N���#,,�e˖����֜9���)S��&$$��������Ù3gعs'.\�� 555�>kȐ!&[��3��NDD�|�֭ݺu�t"""""��Զ>�.]�cǎ&�:u�U�����=Ͼ.^����n޼	��~�2C)���;,`���4jԈ�;w��+�X:,�7n3f� **���(�-[��o����իWϷ]�֭iݺ5���ddd�r�J����?>���˳�9s&��͛��� ;;�Xv��uƏϙ3gr�-�MC��9�:��DDDʧu�֙ls("�O7[���Hq(���4�!X�+���)++��ֹ����3�iؿ�^��������_3n�8�]����ә8q���""%�(�!777���ٿ?۶m�ԩS,]���k�2z�h����s�=Gzz:;v�ȵ
���5Æ
#((������Y�9�AժUXo޼y�9s�ƍ��/мysڴiÀǽ��~��D���nμNs8��-,,��!�T8�֭c�֭�CDDD*�Gj�ƍ��?p��)��׿�O�:������.]b���888�=Vݺu�v����ԭ[��Xrr�����X��ݻiذ!mڴ�t(R.^������̀X�`�7�tX""f������wwwN�>͞={X�j�-2&��nݚ�Ǐ�y�f�}��\}VE�+���9SA�aBBB�S�			��YYYT������ʊ��n߾M͚5���by/s�u�É���o����t"Nff��SDDD���U��ѣs��!>>���,���3gN��ݻw��k��ٳܽ{�7n�����ĨQ��u
w���hٲ%�/��Pf�#""��x�bz��͚5k,����t�M���O?MBB{��e�ƍJL�r�O�>899��_���F�-pttLW-4h�G���x�"���r��A&O����N^̙3���ѣdddp��Y�M�f,OII�W�Y�n�Jzz:			̝;��c�3��NDDDDDDDD��<R+�<�o����~�	oo����f������2d��cիWg�����u����͛xxx������ڵ+ >>>������n���eddd���Ê+�={6|�C�b�y�f&L�@rr2�g�f̘1�ޕ/"R�
6����Ν�+1�޹F���:t(k֬a�ƍlܸ1W_M�6e̘1��eΜ��\]]ٱc~~~����:~��Y\\\�W����e�>��3>��3\\\
<�9�:��DDD]�݂���A�6m��͛�4���Œ��9;;��]�������Xl唘��"�����Ɔ�� ���y�ǨR�
���̜90ݟ�f͚�����元��+W���WWWV�\ir�ܤI�hԨ�+W6�޳gOlmm����Gdd$5k�4ޕ(""�+))�_|���0�mۆ����nm)�Μ9��������Օ3g�0a�%��H�c�|���???Z�j���5���4o�ooof̘aRw�ر�����?N�J������ёw�}�5k�W#ɋ9s���<y2nnn���`mmM�6m�3g#F�0&��5�?~<���Ԯ]kkk\\\�>}z��6g^�9�����WW�b��ĉ2y�d&M�Ē%K8y�d��!""""R�oj���sݭ���@�z�L����0a&Lx`�nnn�����ըQ///����r�
�5�ʕ+�<y��#Gbkk[ԗ#""f:q�}���ښ��(�z�)K�$� 55�3f�x�bڴiCdd$]�v�tXRA�;�۷o���ҡH�WҊ��;���j��쌳�s��*�)���kժE@@@�u
	*������___|}}8ƃ}
:��NDD��U؛(�kw��U�B�j�<xp��1HOOg���xzz������<m�46mڄ��M��)I[9���y�^�)))dgg��?�6�رc��7l�04h@hh��,44�\KJ��H�KOO�gϞ�lْ��h%�T999�[�GGG������O��"%��\�v��a���Ҟ3�5�É��T\NNNچ��222�<y2iii|��'���[�+V� ))���
DRR+V�(�qDDDDDJB�[9��&111��ݛ/��2Ͻ��ԩcr�^q�����ߟ�c�2t�P���Y�x1իW/ֱDD��lllصkO?���y�bccy���9t����VA))Z=A*�Ҟ3�5�É��<�פ
+�dggDDD���T�Z��͛ӧO�����Ν˹s�8q"�ڵ{�8��f�ܹ�޽kkk�u�Ƙ1cL渷n�bÆ
t�ܙ����4h���6l`�СԪU�����H�x����2e
M�4a�Ν���ddd�?��g�}��Ç����g�y,X��ѣ�ԩS��#""S��~���o����l�2���8v�X��&b���������)��3�5�É��H`` �W�6>���$..���8n߾m�UϽ�n�Jxx8nnn4���}��'l߾�;w�c�N�<�ڵk�s�]�v������K��...DGGA�~��y�"""""���%�u���T�^^^xyy��y�Ę"""Mvv6+W���ח���������T�ڥPʀ��K� Rb,5g*k����<ڶl���%Kprr"33�;v0w�\6nܘgr�ٳg�7o��_�6m�Y�:t�ŋӹsgΜ9ôiӸz�*k׮����cu�֭[�jo(;|���SDDDD��*s�)""""������'&&�Q�F1k�,{�1K�%����Lj׮m�0DDDDD��[a��n����%55���Ppuu���OO�<�LIIaʔ)T�R���盽
����qE�v��1u�TF�;}���)�Ν�iӦ��?��&uDDDDD�"�j,""ξ}�,���ׯ3b��t邵�5111,Y�D�)bQiii�ADDDDDJиq�V�QQQ|�駼�����p�Ν\usrr�>}:W�^���Ϙ(bggg��:t����Ʋ�7oP�V�\�
e�:"""""e�VN�
#33��cDz|�r�9��⎔���,_���ӧS�Z5֬YàA�����th"X[[[:y��WD1��R�m����pvvf���l۶�S�N�t�R֮]��ѣM��	����xyy���/*�*UL/�ggg�lck�絵��Lsf)�J,9eӦM%յ��Cw�(�~�:���'&&�/��R�)�ؑ#Gx�����3f}�5kִtX"F۷o7^,ɏ��DD�R6m�D���-�H�ggg���;���>}�={��j�*-ZdLN9v�AAAt�Ё�c�z���X��N�8�_��cYݺu�v����ԭ[פ}rr�������HYUb�)(��EDDL���ҷo_rrr8|�0�ڵ�tHR�������f�^z�%N�8�SO=e�DrѶRR������_}���ʕ+���һwoZ�h�/��@ժU����ԩSy�ǘ;w.�+W.�x�g�f֬Y�jՊ��8�ٳ��N˖-�v��.]ʕ�r��%c���ؓS������*�nEDD�u�V��3�<×_~I�z�,��)++���� IDATŋ3s�Lj׮ͦM�L�H)O4)��
F@@s��e�ܹ&�:u�������x�W��ö������ۤ쩧��7�0>�ڵ+ >>��A||<�=�����bON9t��/.�nE�aaa�A�T������#X�d���%)?�����ѣIHH`�ĉL�:K�%"Rh���HYЭ[7ƌc�0Dʔ�%����Ã*U�FBB�7��cذa<x��b[�h}�QQQ�����+�0|�p����uz���g�}Fdd$o���I���Hj֬I�=�-&��V��)?�������M�6Y:�R��+��a�m�P���/L�<��7��m۶��OZ:,�"�|HDD,mӦMJ�1S^�+�����f˖-�2@�ڵ���ضF�xyy̕+WhԨW�\��ɓ�9[[[�c)-Ş�b��DJߺu�<x���)5���JL)g222X�p!4hЀ�۷���a��;͇DD�Rt]@��6l_�5���L�2���P2d���y�J�@DDD
�|�
mڴa֬Y�����������ߟ��pILL$<<�W�n��DDDDD��VN���?~<۶m�_�~�ٳ�&M�X:,�r�g���LJ0z�h:u�d�DDDDDN�)��ܹs�l�2�caaaDEE����'DD̔���իWiڴ��C3�����'�0o�<�x�	v����/�l�D��aÆ,_����ϋ�E���۷���p���{RSSiժ/��"}��V�Z�i٧9��������B������˫��)YJN)��'r�<''N� 00��7����o����#:t�@�""����0`7n��ĉT����ʋ����	&p��ufΜɘ1c����tX"�"11���TK�!b���-iii���r������Xbcc			���WW�R��l�PDDDDDDDD�|����8�gyzz:ӧO���6l���ӦM#==���)bcc�ҥ?��#�W�VbJ9q��yz��E�~�pqq��L�4I�)Raܽ{;;;G"b���-S�N�ȑ#ԯ_��>�����;Fxx8��ޤ���W��]������������b��999���d��K܊+HJJb�ƲA����Ċ+,��H��W_ѵkW7nLtt4�۷�tH��������駟&11���������C)V�S���,��wea>t��!"##���g�ʕ���k���S�re6l�{�ǨQ��{�.K�.�h���"""""""""�{������&((����Z�*͛7�O�>���פnZZ����޽�_��z��ѫW���ޝ�EU�����я~T\r!L50�O��������RJ���Q))���B���P�"��&&����,"2�?���0l�6,����1s���q�y�{�9X�l������E�QXX���@�;:::�:}�􁱱1accõۉ��
�puu��۱b�
8p�������M�6������=:u�P_1���&jN-�����lll$��.\�PCCC����Bx{{#""�?FϞ=1e�,_�]�t�j/>>��ЩS',X���������ݻeeeL�<���h����G��
�����������S�b���PSScHDDԊ�;�v��WDDDԔ:ԝ#OOO����ߗ��!%%)))x�����������Gzz��nnn.RSS���Y��?��3���abb"����			Ǽy��숈ھe˖���8t������!--
k֬ATT������^�z�;,�f%Z�C]]]ΑP{�Ry�h�SS��hhh`�ҥeEEEX�t)����eyyy8y�$ �~G��ك��P�G�B__����KJJ��?BQQ۶mk���G+V�@~~���!!!������s������H�,X �������r[�GD3<�_~�QQQptt�>}Z\�ĉHOOLj#p��I���

��ѣ�����g�x���Hbb��}ll,`�СR1��Du���s��ŋ90��{��)6l؀ѣG�����������JKK�u-��<~����/S|�����ʂ��>~�����@OO�������'55�N�B\\���ywww())!$$���X�|9 **���oU֯_?���"66K�,\�|�־dHDD$?���
����񇈈��)���)5��^���ž�������" ++fff�?>�ϟ/Q�…777�����۷c���8w��tڕݺu����U���_���ޓwT�P8::�����ҥKk}*�����dQ}Ȓ�Tޢ����/_���B�s
�pvv�ȑ#�F����֬Y����Z�JbGGG4��H^^^x������y���
���ų�4�
�#��� PPPPk�0$""����8p@�a�kAAA�����ځ�����c����#>>�ƒ%K`ii�Ν;��egg,,,�=Nfff��<y��]O\T&�CDD�\�~�W�FBBV�X��?�ZZZ�������#//��jV-����������ŀ��#
���3t��E\����Հ��ƌx���q�"~]yɟ��_����kC�oHU>���&�9��9 ��dgg#88���C!jw�����#-68��(�'�s����O�����#22��=nܸ�C��ĉX�z�x�ﺦ�+**�u���T�$��LT����5{��1�n݊#G�`���z����#QG����޽{�;j�dɇZ*o9r$�߿����������?�������%%��W�UU�j��;�VC�oH)++�_�7ocHDD$�ف��<yVVV�����ډ5s
���7XXX ==�.]±c����!�ȫ���{��!,,���2�ѣG���!??=z��&�b�j9QG���St��]�aP***���b˖-PVV���/lllxc�����D���;��ܹs��3���-����^^^
�x��w�S���p��]$%%aܸq�III�Z��Q}1$""""""""�]�Sk'f͚ccc�9s���4h@��8sss��P���˗/��c|���066�������&�h�h�)��ݻ'�����DDERRF��Ç�;�E||<Ǝ�5k��>�͛7�p`
Qi��e„	022�_�;;;������eeeHKK���SSS̟?_�������
���(//Grr2v���4iR�tL��G�����������Hvj�[[[���������ی��į������dX[[K��ܹ36l� ~����'O�`�ܹ���EXXLMMq�����JRSS���DD-!88~�!ƍ��;��Ç�y�f������7n��a��Q��Ry���c�ʕ�������$���9\]]%(���"""���X�d�D}�2y����9 Q�t�֭fLz��e�={iii(**���!�L��Y�f�k׮��fU
=�ږ�l*�6j#j�j<��O����C�תZ�RPP����Ǐ�58"""jU�6sJbbb���;w.\\\`hh���`����Î;��t��@KKK���BII	���033����ė��7B__JJJ(--����PWWGtt�T����ҥ�M��'LD�
�Blݺ.ć~�����ڷ2���8p���. 00�BDԌjˇZ*ommm���cݺu>|8��ա�����z��޽{ѹsg���v�
___,X�:::PRR���/^???hjj6qo5�,}T_����ڟO?�VVVM~���b�]��6mBtt4�<y���R$''㫯�¬Y����V�\��^xzz��Ç��Ѯ_�OOOlڴ	7n���Ko�j��u�뢩��O>��|�I���O���ӧK�ihh���>>>��Ɂ��> ''IIIX�b���~DDmDaa!lllp��yx{{cٲe�������ڵkq��-|��prrB�.]�Q��y����*lll`ccS�u�888�Z��8�-o�@�����dHDD�\�r�Y���쌸�8���`�ʕ055E�n���"44������p��Q���k�и�k�L��Vs�S\\�={�`߾}M~��slݺ��χ��.�W�޷lق��`����9B""""9Μ����ڢO�>�@WWWj:i"��(''&&&���GDD��2<���%�L�}}}�����͍S����9 Q�fll\��c�JLL������
???̜9���PRR���֬Y{{{�|��j��H�رc�˗/�;���Ç�h�"q��ŋ���C����12"""����S�+Ah�%���԰}�v�[�N��ٳgq��i���ڣ^�z�������۷��á����_�5v��	|��w�5k���"j3Μ9���������Z�DDDmS��Ѣעkɗ.]Bpp0222PRR��={����V�ϊ&����7n����兰�0���
ttt�m{�…
�044�(/,,���7"""��c���S�L����%*�$''CUUS�N��롦��d�'ڧ>m@EE������\(++c��5kfϞ]�)U�Nqq1|||p�����_�ٳ'�y�,[�***R�7oތE�a�޽7n\�3���o������?��N�:a�����G~~>v�ލ��((++c���ppp������QXX���@�;V�֧O#00666�ڵk=z���������)��믿�U�V��\�z5����Q�PQQ�����àJ��ñn�:ܻw���شi�u%�Qii)�����R����ڏÇ���G�,//���(((�Ν;%�yxx���P<8 %%`jjZcX�t�DYQQ�.]���,�vO�<�����+V�@~~>���!!!������s��_Uu����	q���2��� %%Ϟ=���U��o���R���#==]\����@���TxzzBQQrBy,[�����g�KW��o{��Ahh���ѣG������`q�%%%�������m۶�|?��3���abb"���	�y����wDDDDͭ�
Ni�N����%,--�u`���X�~=���;̙3�ϟG����Q����.ED�bHDDԶ$&&V;ǩS�����9s&����+V ::Z�8�@ �h��c����L�#++���puu�СC�����[�"33~~~X�j��>������ѻwo���@ ����pvvn�󫪶6�d<x���(++ùs����ӧOW;8��Y�e�gp��	���cĈprr��q��=���!!!gϞ�v�>�?��Μ9�3f`Ĉ�_�~KMMũS�Я_?���������<x0BBBЧO;v��ވ��j�y����*վ�,66��S���H��BDDDm�������
CCC�����

��F())�wDDDDDT���?u�W��W�bذa8�<���k�޽���M�����XjEII	���mdq��e���3F�	eee�5
NNN����}```UUU񠏂��Zۑ��dmS4�K@@�����c���HLL�ٳg�<~C]�p����CII	�����Ν�v�N�:a˖-
���������j���o���4hTTT��_�x'''�������%!E3��z�n��j�PU�k@�:DDDD���fN!"������:��&,,6l����m۶aÆ
ծ�LD��ܹ��C """"�f���#lذ7oޔ�&
�ʪ>�������#77��
�P�gϞI�Θ��5j�D�1c�<x u���_kjj�{P���'k��ׯǎ;���x>|K�,���e�9US̪���
����v{fff���9���Ù3gp��q���IՑ�߆"~]y9��Wݒ˲�Ǔ'O]�v��'*�!"""�'ΜBDD
v��)�1B<U-�_ff&�}�]XXX`�ر���g�}Ɓ)DM�������������ꐘ�(�SWyU{��͛7ѷo_X[[c۶m

��~ռ{�ȑ�����IKK���9���j��C���&�����


�GD����ӧ��pqq��Q�PRR�C�aƌ		�w;��k`M]��|����ի���[ܿ_j���VS���X��Y�C��STV��Qsj�G�e����������3v�ލ��ף{�����{��v�څ�{�bРA�|�2����Q�S�c"�CDD$O��#�������ZZZ���,�f�}�wp��9`ƌ��֖�^QQ///�B����e����p��]$%%aܸq�III]]�Vq~����	XXX ==�.]±c����y��5��5���Ž{�֠�����M����777��-�o�l�ѣG���!??=z��&Z*�j9�<4��'�4š��ږ��XZZ��ŋ�NqJ-+887nDAAv�ލ5k�p�%�f"
��*�H������MQPP�P(Dvv����/����S�"++;w��H
8�l„	022µk�`gg�5k�`„	�ܹ3~��79r���055����������nnnpuuŰaÐ���]�v&M��*ί.�f�BNN1c�4���YW����9������4O�>ʼn'p��q��˫�cL�2�'OFTTT�u���rC�A^^�ݻ'5�޽{�:DDDD��;WDDTo�������ӧO�����;�-==k׮EDDlmm�k�.���G�a�k�ׯDze��5!---<y�s�΅��.���`ff�s����...R�ddd��Ĥ�㺻�c�ʕ�������$������������"""���X�d�D}�2y�_mlmm���www���Kl322j�q�bgg���H$''���Zb[�Ν�aÆz������(..�(o�~��<LMMq�����J�mjj*��
j""""jjM>8%&&VVVM}X"�A]k�5ą�p�B8.\�����C�
�c�8p#F�@\\
�555����;jŘQk`ii���y�AԪ$&&ָm�ƍ��o������R��M�P^^���h�|��
���5�ܹooo�>}��A����GPP.^��;w�@AA�ǏǼy���oH�ӵkW����ȑ#�����ǏѣG���[�裏���)�7��f�ܹ�ԩ����������&M���m��[�.]�@ ��ѣ�|�2>|


�������u�^�{��(o�~k�y����ꫯ�>�@�8����ҥ�M��蘈���KA�Ȼ�'O������fx�D�r��H���DPP�9�Ν;�;�I("  (--���+V�XEEEy�FD�a��6�A���)U��u��E$���>>>���'~�,''�g�Ɗ+<(߈���	%�n�˻ヒcǎq`��\�~�'O���-,,,�����+Wr`
Qgkk�>}�HD����Բ@DDDD��;ZDDD��ӧO�f����(//�իW��兞={�;4""""""""j��԰}�v�={�������ٳg�}�v>hFDDD�F'y��nݺ�!C�4�<��'���<(++�_���|�M,Z�Hj���ill���O�RPP����ǏǂZ�]""�[EE|}}���%%%x{{���


����ڨ�y�(�����ICs����bTQQAϞ=1~�x���AOO��㴤��9���M�DDDD��믿�U�Va߾}�իW���H�Q��C
N���Oq�ʕF]$�����G�ٳg���Rܺu�n�BXX|||����dm6��ׯ����O��P(�…1x�`�=Zޡux			���q��5�Z�
;v�@�����a-���D;���x��BC)�;� IDATC��O?���#G�l��d�Z��j��ż����H���%,--�Q�:��+W�4����dzg�0n�8�[�@yy9n޼����###���عs��m�ԅ��ϟc�֭�?>tuus��Ŗ-[55����Z��/_b����޽;����N����#8::����'OƵk���k��;,""j��K��M1�ES�\թӋ/p��xzz">>�}�BCC�y�<P4�˪���y-5���666���íIrr2�/���ѩS't��cƌ��� &&F�!����>ĢE��e�/�Ç���+�ȈH^�>}���{�������p�����7�`РA8�<N�8���L!j�-Z��?�X�aP;�V��@UU������/1x�`���_�wX�˜��-f��~�>XXXoooDDD�����ٳ'�L���˗�K�.����Ɵ��G�I-�```P��������ƍ1x�`xyyI�%z$''CUUS�N���%�{��8���<��| ����b�ر⥇�O�>066F`` lllеkW�:��ڬ[�na֬Y(**BTTƎ+�:����]�iiiX�~=�n�*��EEE�ܹ��àv������Gnn.���1p�@̚5�gϖ�[\\\�p��z��w�y˖-���
��s���O�T[;�.]Bpp0222PRR��={����V������=􊲲2�����䄨�(,X��ڶkʿ����ȟ��C�!66EEE�߿?>��̘1���o�Y5V]]]ܿZZZ

���?ϗdggc�ܹ�����ߠ>�O��ؼV�~��g�y-Q��a�Ԥ��K�.EVV��,//'O�DBB����e˖�/�����1g�L�8#F������m{xx���P�bZuV�X���|@II	BBBPQQggg��gϰl�2ܿ_�OFFF��r����(..�����6$$$ <<��͓�|���9�</^��C�"""zzz�����ͅ��0m�4$''cȐ!�������H'�/OOO����ߗ��!%%)))x�����������Gzz��nnn.RSS���)1���d͙�:|�0|||$��������
1z�h��۷�[5�����<y[[[<z�H\733...x��%fΜYc�
�?Q�'N���).^���ӧ��DEE&O�\�ץ���6u嵲�s}?��k���:


�������j�a�T~���\�����ʂ��>\]]1t�P���c�֭��̄��V�Z%�?g�hhh�СC8v��;�5
���={��ɯ��0`��yU���۷oG�޽����@�˗/�/���������C�"%%[�l�Ç%�:t�T;����X^�#���݋͛7���G������C����p��رZZZ		��9s��Sii��C� 44p��A����Ν���;N�>-�A��	���cĈprr��q��=���!!!gϞ��ٳ��K�Rߜ��vN�:ptt�̙3�������X���э�+mmm��(�K����ǎãG�0l�0|����ٳ'���K|��w�9sf��Uc���G`` �����2i�$�s�mɨ�>�圍�ke��~���Qe'NDPP��� """"�:���.�U-o���Ƹ|�2���#G��5
NNNX�f
"""�.N�>ӧO�͛7�믿�ڵk�~�:�^���� >|�z���mkk�:����VVV(((������e��]�V�X�n����cU�����CD�WYY~��g�ٳ�|���0.]���k��Ν;ظq#6o�,�D�
��� Y�!uuu!  YYY033���1�|��.\����g?0`�oߎٳg�ܹsR�5DCr�ʢ�� 
q��M�?�o��իW��U�1^�|	�ԩ�Զj�%K����6m�$�͜���5�HC��r�ݺu������8������7n܀�����ꌡ.u圵�+������g^KDD���#""""�֫�̜R����.V6f���j�w�С:t(���PZZ
???x{{c�޽سgO�m�.��e��ך��^��-r��=��E��H����v�mQ���_���o����n���ظq#���aaa��g�J�m'��#??�^7��c���رc����Çcɒ%���D�Ν�����'33�I�iL��=†
p��M�mB��Q������Ҫ�n�K���cC��kH�U�����O����/LLL��/_b„	�M�����r��ԕ������3�%"""""""j{Z��zՋc��V�%Tw!nҤIx��9Ν;'�����
lmm�����z�Q�YS�W7�Ej[;�����ʪ�!-*�D�4���R�ݻ�v킮�.~��G̘1C�aQ#��'5�,�����1~�xDFF��Ǎ7p��!�8q�W�/UR����JR��^سgn޼��}���7���1|�p,X���1\�v
`hhXgݪ��,��9Rm�W5Vmmm̛7'O�Djj�x9���i���թ+������g^KDD���5��O===ܽ{III7n��<))	���+.:t(�]�����\�R�X�LZ��E߾}���ƍx�7��7nܐ�ۣG���!??=z�ؖ��/�CDD�s��y�]����ؼy36m�T�A�D�z���V��>QS��Ԅ��,,,����K�.�رc���ߠ���Ž{�&��45Yr����'YYY�����
�����'O����ɼ�,�׻wo������İa�dj���'bcc�3g����ӈ�����"LMMe�Ed����ϼ���c�8q"����ɨC
NQPP�P(Dvv�xR333������
���6l��ӱk�.�O�-^�׮]�@ @QQ�̙����ڵkؿ?��ܼ�6�ڴi���c׮]puu���!n޼)>�ʆ���<ܻwO�b�hpMC��&"�W�ܹ�
6�����q��%�}MԎ���PRR�w��͚5999pttČ30h� ���$g�077���������A���ӧ8q��?cccxyyh\^"K�T[;����N����,�ܹS\^PPmm�z����ܾ}���۷������~[�sd�?SSSb߾}pssC���q��o߾���j<Y��6�z�¬Y�p���B�5
ݻw����1�Y����}�DD����l""""�6�C
N���“'O0w�\���",,������@vv6�,Y"Q��@����6668~�8N�>�ӧOK�ѯ_?�]���6����~��'ܽ{vvv��555ŕ+W���
###�m����njh"������֭Þ={ЧOy���=�{���ݻѿ\�pS�N�wXD�ĺu�&��������������.���wx;;;DFF"99����:w�
6��7&/�%g��333�;w...pqq�:~FFLLLj�A�RU���ؽ{�������>��C\�p���x�$�~��G�׍�9�� 88@�y[M�%"��������3�%"""""""j{Zv��Je� �X7n���>���PZZ
�ڵ+|}}�`����@II	:::X�x1������)q�u����fff�ի������c�ʕ8~��x���ljjjj����w�N�:a���+/#��oC]]]�Fye����ҥ�M��,qQ�IOO�o��˗/�ѣG������1b��۷;v�@RR�Q�jˇ�ΝBEE***8p ���c�q�.]�@ ������PRR����x���3G4&/�%g���M�6a���PSS���
��]�va���P�ڨ���_�~X�hN�:CCC�����z��___L�>]�v���2��ݻwcƌ����9gm444į'O�ܠ�n��|~d��~����=
B�Pؘ�<yVVV��{����\̜9zzz8{������>>>���}}}@NNfϞ�+V`ٲe�
����aaa����k��������[�!�[���X�v-~��',Z�������""���_Ԓ����a����!!!�G�������
P�{"""""""9H���)�t&O�ccc�9s�����;w�O��3F����-���#qQ"  ���R�,Q�!
�k�.̞=,��K�80��c˖->|8���DDD��ɓ�BDDD͢���?Ʒ�~����sD�Ǽ���������m�$���km�j�%�ZҌ3p�̙j�����O�-�����۷cݺu⋚gϞŁйs�����Nqq1�.]�3g�૯���,�ڭ��|��'(((��ݻ�f�t���;%""�v��>��̙3�M����������m�ݴv���8�<�ܹ���R���&L��eˠ��#��믿�U�Va߾}�իW��Ȩ�C'�&r��UDDDয়~�[o�%�pڥ���]�/^���
���9S
����������PRR�wH��Z"""""""����
Ni�3�4EEEXZZ���R����No��&������!�Pڝ��"�ܹ_�5����h����;,"""�@Ν;'�Z-�DDDDDDDDm��� "����)M�ԩS2d���[|�嗸z�*�u`���FDD��C!""""""""""jS88�������4��������n߾�U�Vq
}�N(�������C!""""""""""jS88��������'�|�ѣG���qqq8z�(z��)�Ј�((((++�9""""""""""���Ssx���uh"�App��C�ft��u���b͚5���
�8q�>��3����o���eˠ��1�D��P(��
a>DDD�KKKy�ADDDDDD$�����o��Q=������k�1q�D|���(//�w8����1i�$���a���������90������v��MΑPk�|������Ǹq����&�9e�ĉ�8qbS���C��������كu��a�޽�ԩ�&��P�>}�-[��ȑ#066Fbb"ƌ#ﰈ�{�왼C�6����&��y��IXYY5�a�H\v�}��χ��.^�___����;�v���~~~��Ϡ��ooo���AAAAޡQ���"��c>DDD����%��X�=~�\�&��<y����5�[�na֬Y(,,Ddd$Ə/�څ����Ú5k�����+Wb�Ν�޽���"�6������&�H�-`>DDD��A�DDDDDD�5����N�����88��ؼy3���===y���=z�[�l���~SSS$&&bԨQ���ژ�_O�<�����C�6����Qk�l�S����|||���UUUy�ҦUTT���[�n���2�;+++.�CD
ҩS'hii�;""""""""""�6�MN166$&&���oݺ�!C��Z��]�|gϞEZZ���`hh�)S�`֬Y�ڵk������=�?��>}�Hl����ܹs����G���[�NNNf͚�^�z��5�S�~o��� ���Ə�4��D
�����իW#99�֭ömۚ�o Qk�ߝEǬ���j�\��q��Nk�m��,""""""""jӃSZ�O?�W�\�����b8::"..N�<99���pqq���Y��?l�0DEE!==]jpJLL@EE��������iii��Ȣ�����������ӧ!
�p�B<�G�n�q��e���_ptt���/���p��
����W��Y��a�EDDDDDDDD�4J��W�\�S$�8;;#..:::X�r%LMMѭ[7���

���?>��3=z���Z��?|�p��)S�Hl
N������/bbb������{pJs���ϱu�V̟?�����s�b˖-���Z�� ��U^^///lݺ]�t��S��p�By�EԦ���
����r��u�3F�aPל9�P]�g����666��t�T���DGGC[[~~~�9s&������===�Y����x��%:�,1�������PWWLJ~uuu$$$���T�^}�4___<|��-�-^�>���o��C���/�߿/�0څ���;�~�)V�X��7or`
���ٳadd$�0�c>D�,""""""""���\�t	���033�����{�a߾}(..�u�G����S�L��	`mm����j/�b���x��w�mxxx���H��h�k׮aʔ)����(��Z����b���`��ɘ>}:<<<����}��˱g�L�<S�L��� ??NNN�8q"��ͱm�6<{�L�XX���:::��…�r�JX[[��ע�233�j�*L�8o��v�څ�ϟ�gP�͛7%�������2�7���?~<JJJ$�����@FF��q�����8x� ,,,0a�̜9��SXX���@�;V����ccc�����>%j���2�\�K�.�ŋ�N����L�<�{�Frr2���ѥKy�F�&	��v5s�<}������ ���N�<!!��Ƹp�D������%������%D���Ol۶
S�N���h�"�;wN�������عs'�z�-���`˖-5敲�,�mYb�o��}Q�g�yU�*��9|�0|||$��������ܹ���={�e˖I�D���'''��EEEX�t)���$�8y�$ ���.����
k�QGGG���xu���ɓ(//����D�={� 44T���ѣ���Gpp�xf������PTTĶm�)))SS�c���ҥK%�d��+V ??_GHH***���nݺA__999��?зo_@ll�Dl'NDDDbbb`bb�{�.�������nݺI�ِ~/--�����,.���HMM���'_����Q\\,��2$$$ <<��ͫw�D5y��!�ϟ��ׯ#$$s�̑wHmRyy98�;v�{���K""j�M����͛(..�#�����/bڴi�'O��PQQ�ĉ��h��΍Q[.!:'[[[<z�H�Off&\\\���K̜9�l�\aa!�,Y���qݟ~�Ib�C�A��6�,��7�k�����c�EDDDDDDDD��ʙSN�:�Հ���X����ȑ#�������������@�_~�����^����GVV��u}||������L���I�3`����V;8��, ���R����

Btt�xJ�˗/K'55�N�B\\���3www())!$$���X�|9 **J���Ǐ���5�Oud��~��!44���X�d��y>���>U����BAA111�:�-�Ӑ~?q����1b��<y���+���0z�h$$$��ٳR�
:T�2Q�Ƹv���������/L�@���5j����v�Zddd�/������ޗ����?���&���������E�ACCZZZ���EAA��ϟ?LJ~


hkk������u�STTGGG0����߿?���QRRRm�
���m	q[)))�6m444гgO�\�R|���>^����!C�@UU]�vń	p���z��P������^{
/_�DRR�W2#""������X�g255��oH�o��Ε�f̨�:u�ǎãG�0l�0���"**J��@ ד%�;~�8rrrзo_;vL�#޾}[*>Y�A��6��d���9]s��H���,""""""""�����t��(\�zÆ
�����_c���P�4�"�����9r$���add�-[�ԫ�Q�ij�DDDH�cmm
����͛1`����ᣏ>�π��1h� ���������899�_�~PUU���
��:%%%�nz�B־vpp���TUUaee7wDE�M~��7<|��F�^�=z􀡡!<x�;w�HԯnpJC�]4�{�t� IDAT���%%%0۷o���oݺ�����/Q���1i�$"!!#F��wHmNNN/^sss���FJJ
\]]���&�Јڽ5k������������
???���;8}�4������S���cݺu�������b����8q�LLL����fII	��ͱ{�nܹs����w����0s��j��44��Uy�sss\�x���x��1����aÆZ����������PZZ���"���㣏>���G��Զ�7͌"8�믿����f�BII�x��hp����D;�ݹ1��%D�i�&@]]���HLL�w�}'�'K.	prr�����9��͛���!d���9]s��H���,""""""""��U.����#lذ7oޔ�&
k��޽{�1c�H�I�Me<j�(�rѾ<��Gt�!��_�����ʐ!Cį+?9p�@���n���������ŀ��A(�ٳg�ҥ��L־������yT�9Et���T�7o�DLL���#--Mb��������j�gff�_?y�еkW�z�2Q���s�lll�f��ݻ�:��?��Vii)���+����w��8{��xZ"j			�q���{�����V�¨Q�����޽;v�@XX��?��#Ο?�)S� 11VVV�{�.��ߏ�?���6��ߏ��D�7^^^1b~��7�X�/^�@ ��e˚$��U�&�!C�����_��/��_�テ��7�B�x���ߧ����ZF������8~�8V�Z���O>i�?�S�Nŗ_~)�UUU�Z�
?��.^���S�"55����<y���ݹ���E֥�\B��UΉ�#K.'Z�u�ȑ�֭L�~��"��W��Sd���9]s��H���,""""""""���fNM]uɛ���ك�7o�o߾���ƶm�Tﶪ��<�z]j�y����Ȳ���j��u��.��Wc���4������/_� {_+++�_Wׯ���PTTDFF***��4W78x5x����o߆��B�S>7��k�H>A(:��XT&�g��*�,_~�%��(<<#G��������L!��o��#G�D�Ν�~�z����q��2jjjشi��g�;t����BEE&&&�A���5�)�>r��)�=�:u°a���u�8q���lH[ĠA����&�1����������Ç�r�J�B�lr�~�7����z��	"##1n�8hiia̘1���Aqq1���1z�hhiiI���ߝ��\��߹���D�V���N&K?�r܆�%���t��"U?{̳����������Vy�4>>��u�E[�������˫��ַo_����q��x�
q��7�������ݻHJJ¸q��墵�uuu��dZ�;#s��!  3f̀������
xyyA(��w�/�о����:���,$%%!%%���RK�6���HJJBRRJKKѿ��bCWW���CXXX���=z�@^^���ѣG�m���������P�!�)���ذaBCC1g������N	OD-��S�����<㙆�F��O�>]�h���^�>�o��g�KIIi�8��VII����w����Wܷo�,Y���p���c�֭pvv����;�ӧOGRR�;�gϞ�g&N����9rEEERK�4�,ߝ�S�޽�� 33���>Ed��틬�,\�v
&&&�rѲH�����!d���9]s�EM�gQe-6sJC���/(--EFF�l�".��.ye���w�څ��T���#%%�v풪kff������(//Grr���I�d�W�ԗh
�4a�᯿�������QXX���2���a���������)�ϟ/���}]хdTTT���D�i9�����˗�ɪ�~]�wvvFFF^�|�Ǐ�믿���1����uEӆ����LTV���D�4^�x�/�����HII����ʁ)DrVݒ�ă]�Ru��hGm��5�Ctc����Y߶^�x!.�<C@}��_�hrrr `jj���b8;;�_������u��z�-(**"$$�?�LMM����'��Ec�;7'��۷yyy())��={`ll�9s��ɒ����׽v���ˑ���/��B�}Y�A��6DC�M��隫/j�<���������*k�3�����ܹspqq��������'�D�����O?��ݻ�����
[[[DDD ;;K�,��f`` UVZZZx��	�Ν]]]����|��pww�ʕ+�����Ij���9\]]%n�4��k3l�0������_�s����'�~@BB�x�����������dX[[K��ܹ�x�}Q|W�\���y\T��?�����\b4��4�%�Ē����k�0� )�(
F"f
Ƶ4��"
��W%W�+.�|��pI�\PD���3�ad8����1���9��:gF�3�>�RSSamm��V~am����f8� ;;���X�xq��S#���ܹsJ#<�:u
�N�'שS'\�rׯ_����ܗ��	�M��iӦ�…��_�E�5X5~m۶���5ѽ{w���:v�W_}�n��o�Q�-�޹<�*�U~���6mbcc�����?�Xi݌3?��ZnҤI8z�(�\�777�r��������[5�R�k��:��u�'��)�Z/���Ç���tuuaee�U�V)>@۱c����Q�F�M�6���F�n���_P�õU�V���ann---������	���066��1yzz�}�����BQQQ���+SSSDDD`��������!�����{�a�ƍ�����Mm�uU��ߢE�J�[lmm�mq���޲eK���B&�A*�BKK��ư��Gxx��z044D\\�J�qqqhٲ�bT�������;F���b���9r$���˗/�/�`a
Q3�����ϣ��qqq�"''�J���� ��w�ggg����Æ
�X���&#�ɋ���wŲ.]�@"�`ӦM���C߾}ѷo_�߼�PU�C���ê��|��N�S���m۶����ѪU+���G���#�jr-������`8::����������㣲������[5�R�k��:��u�'A�KQQQpvv�����7YYY��OЮ];�۷O�8�!$${��A����o�Ƙ1c0s�LL�>]����=6G��ƌ��7o"==fffbGj


�������~��G�~�LD5'/����Q��ڽh{;;;�9sF����
��������ͅ��-222Tr�����ׯ�FrVw_���022�V����
�޽�hׯ_��͛+eԨQػw��uԸ�Q��uQS������T�;�E9�>���;�����?��Ǐ���׮]�W_}�/0�*�:u*,,,�>�����T*Uƚ����8��ؠ�����,L��={��gϞX�f
���\�x��)D��޽{1r�H���}�����±c�TFt+�u��8{�,.\��;B[[���3f���5�����244�v�k׮E�Ν����gϞfΜ���X[[C__����ի����e��Qc��,""""""""��~q��cĈ�������u&&&J�j�g``�+V`���<y2`߾}X�n]�_���-((������-[��ѻz�*�ϟ�Ç���	����J�b�"����H���P��m۶ů��Z�}�߿}�������k�mM�kz_'N�ĉUڹ����յ�}5��"""""""""�fU��d�XZZ���v������+�୷�����ann.vDj���9s� 000w�\X[[������b̟?���X�b|}}�9�zO�>�ʕ+��ݻ���:t�ر�������:����������fV�ҢE�d2�d2��P��U���"##�{�n�3F�8���?��ŋ����X�z5�Νm�f��U��YDDDDDDDD�B�DDM������Y��iiix���1~�x6���X�`S�������������^2,N!"��֭[���J��֓'O���~��!''gΜAXX,,,ĎFD
L� v"""""""""""o_'""����X�x1
��c֬Yhтu�DDDDDDDDDDDDD/�z+NٵkW}uMD��;Kjj*�ϟ�S�N����V�����ر��4jĈ�ݻ7ĎBMߗ�Xv�څq�Ɖ�������HI���?���&"�wW�\���^}�U��4j�=�W_}���ף_�~8w�(v,"�zq��}�E���!"""""""""���xq�L&�L&�t�DD
���d?~<���Ŏ�(	����x{{����6m���+��%�f���P���z����������H�ƋSN�>�u��i�["���;w��I�W����&O���Q�H�Rrr2�͛���x̚5�~�-LLLĎED� Ď@������12d���ŎADDDDDD���[�o޼�ՉD�k�.������|�d2,[��������ر�G�a�ܹ0`A@bb"6l��"zi���AWWW����z���Ķk�.�?^�DDDDDDDJ4>r�Gn jxQQQpvv;F�s��M�37o�ġC���{��Q)++CXX��������~�	S�N�D";Q�*++;5!�"""��s""""""j�4>r
QS���;;;��� !!��)\�p�ƬY� �ɐ����K����[�;Q���"z�"88gϞE�ΝŎ�hܿnnn������>����v�Z�i�F�hDD�y����������������z�և���������n�Ν������b���
���e��G���(++��͛�l�2���a�֭prr�H)DD�_��c5+W�\A���ݾyFDDDDDDDD�Y,NiĒ���~�z�ر� `„	�֭�|�M��Q3�9s� 55���X�bZ�l)v,"�F��Gi��ŋq��I�E�b��aDDDDDDDDD��i}���������R��ڵ�رc�l�2������w��������	.^����@�Q�:y�d��7�È���������h�)666��lHUXX�޽��'*�999��ݻ1Q���o����)))��u�н{w=z���8z�(z��)v4""""Q�:����������~4�i}�=�]�v!##���033���=�̙CCCP��9s���������.�www���)��I[���GHHbccq��=���ᣏ>���ӡ����ott4֬Y���������…a``�h��lذ'O�DAA�
��K��{^^���1`����+�[XX�����ј<y2Z�jU��L�앖�����}�ѯ_?�#5
�N���󑑑�ŋc�ҥ)�������￱q�F�9sO�<A�N�0e��1B�]^^���q��1<x�fff6l��ܔ�T�ڧ�����8r��������.]�`���3f�R_�NLLT�OOOt��
AAAJm�S��E�]پyFDDDDDDDDTeqʦM���,;;���x��1���k�u�����x�"�m�cc��-**¬Y������.++���HMM���Ѣ��33g�Dnn���_~�eee����_WWWܾ}[�͡C����S��?|�0���1x�`�u�FBB�9�O?����HD�=�L&������<�[��全�(888���믿.v,"""Ұ��L�:���W,�z�*�/_���R|��'�'O���>Cff��]vv6���������P��r/��Y�~="""틋�q��%\�t	O�>�����Y�yyyJE"�<nuxFDDDDDDDDTD�֧*۷ox{{�̙38{�,6o����Si��i�[��ΝChh(ڵk�;w�`۶m�j�m�6����W�^������s�N���HHH��}�T��ر#v�ލ3g���p��q��[�����С�lقs��!88��J_gΜ���Ce�|��
�����A�!%%'N��ԩSŎ$�����_�B���q��i���/8x� S�����-[����ٳ'v�ލS�N��' 44T�.""���h߾=BCCq��9����]�v�z�*���U�~ѵ��ݻ?��#Ν;�S�N����c��#�$&&���ҹsg�9sF��Mwe��uQ�i���GU�O�:�.�gϞ8x� ֮]���������������飸c���5iX�r%�u�---t��+V�8p@��%K����zzz�;?~�X��	�ҥKaeeX[[�/�P��ʕ+��[Q�N�������������.\��A�Ď$��Ǐ�o߾��…������������ӧO���`ii	CCC��� 11������A>>>�ӧtttзo_��ǎS�E�>�V"##�s�N<|����HLLT[�ΤI���S��q���0""""""""���(����><<<�����N�e���J�����[�nժ�͛7�F�R���ի*˺t�Y>=PYY�b���>}�(m�n����P;��|��
)۵k&N�WWW�_�zzzbG�_�///�ر�|�	��݋�]�����I�u����cǎ)�?UW��|��#�hڝ;wݻw���|�Ѿ}�*-�_��)�E�>.�W_}���x���cӦMpuu�L&���~��ˋAj��ǭ�È���������O��T��U���eW�^���tt��C�E�.]`ee���ǫ�[[[�0���h�:0Luڪ+�)O��-:::��%��zy���������˗��ÇGXX�L�"v�a͚5��󃅅~��W�9R�XDDM��Ǐ���Chii���Z�z�P�ؤ�]�>���8q���݋�~�
7nĶm�0w�\|��/�e�����gQQ���7�È���������O�9%>>��9�MLL�����%%%JE)))Jw#&''^{�5����V*��ƍ����T*��!�C����DRR�X����Ҷm۶���Fnn.ڶm��.77Wц�T�n��.L9|�0�����_a�ҥ����DDT���R�#PVߣ����+�௿��իWѳg�J۵k�ׯ_�ŋ��B�x�"�z����F�¨Q������G�b˖-X�fM��S*�H$O�>E˖-�Ѳ�ǭ�È����������-a�ȹs�PTT���,[�L���|������T��� 99+W�888��Y���.���gdd���<�ڵkacc�Y�f�X>��C�ʕ+������\�|~~~*m�CP߸qCe�|Ym��&����͛;v,>��CXYY)�n�0��H3JJJ�o
��������lb��հ���?��OE;{{{ϯSRRRPRR����Z�
��o�xߣG����
~��g�����_G�n��uE>�jU�7-�ٳ��̄����[ݾyFDDDDDDDDT��)���8p��/_��˗�����P}���...Jmz��	&�l[��...8q�RRR0i�$���������1M�4	G�ŕ+W���X����᧝�N�<���TX[[+����R�����),,D`` V�\�:�СCj󈈨n�>}
�SzP�1m�4���"%%��Һ3f(~�:u*�;��7o���U�����ʲ�:u*V�\	����7&&&���رc!�JSi����ؽ{7~������tM(W��V�o^���FNILL�txk///>��Յ��V�Z�(�رc�R�5k�`Ȑ!��ֆ��9�L���� ��W�m˖-
�L�T
---�����ᵺ[NWW���ptt���	tuu����G����

��...-[��|P�D�EAA���Ď!�_��{�F@@�/_�K�.�0�����{I��m�aaa>|8Z�j���1b��]�V��\�� IDAT�������ZZZ077������k5Z�رc�|�r�����Յ��.�t�|��W�v���h߾=���PTTTe�pttD�֭��������׷�ǭn߼#""""""""�?A��tgggȻ��{}���P�9�kҶ1

BHH��ك���n߾�1c�`�̙�>}��	�1��cC�믿0f��i�G�;�(�^�
��믘0a�ꫯ����Y;r����#�n�Z�8Ԉ��^&�#������w��N�~�����z����^$6�i}�P���Gdd$�,Y�R�Te�!���ɓ'w����`ժU�k���cǎ��w�;�K���X�D�xFDD�t�ܹS�D��DEEaϞ=b� ""j�X��H`ŊX�`&O�طo֭[}}}��5�
6����1"""вeK�#5����?���@NN���,X���ND�P�����ZMqBT�莚�TF�l�xFDD�t�7N�D���8������F����3gs�΅���ȩ�ֳg�0o�<���bŊX�l$�ر��www>|2��}��R�ر��^::::011;5^�i^�.N���M��A�L�L&v"Q�����?DRR��كO>�D�H
�ɓ'���Ú5kУG�8q��ر���H���5�ˀ�aDDDMGTT���ŎADM� bG ""z)4��"j�Z�h�ٳg�w���ѣ��q�Ν;��鉼�<b��ٜ‡��������
;w�;51QQQ�Ƈ�����N"j�Ə/v�����������pqq���?���ŎEDDDDDDD��7N�D���8�����;���ɓ'���ěo�����ٳ

ea
5�6r�D"������A�}�vxzz�ٳgX�v-fΜ�-X7HDD���z����$��Ď@DDDDDD�D��)C��DT#w��A�v�ĎѠRRR0�|�>}ӧO������ĎEDDDu��!""j,--Ŏ@D"��ɁT*EQQtuu���SS�ۿ�P[�ٮ6z��˗/#))	���{a���$����z�¥K�jT�^�xjr�
y>j���#""�Ƨ�FN!"����h|��gؽ{7ĎS�=z�/��7nD���q��y��؈���^ 00{���ӧŎB����%�$""""QEEE���PTT��۷c�ܹ"�j\�N��%K� $$�ׯa����v5all\�|DDDD͑ƋSN�>
gggMwKD5���KKK���իWc��x�ĎT�A��-[�����Raڴi�‡���x��?~,v"""""�
L�2o�)
����ɓ��_ 22�����ׯ�maa!�������I�&xq�͛7c֬Yزe�Fs5e�6rJS�r������j�a>�L&É'V�;����d̝;			�9s&���ЦM�cQ
�������MDD��d2����������`ff��7��_Ebb"._�+++��5ppp���{��*�N���/x��F�	�����www|��g3f�&c5i�և�TZZF�����<y;R���Ɂ��/���`kk�.Tk[""j|


`hh(vj����;w�����J�r�H�nܸ???:t��7LMM1l�0����gϞ*�S�\����D�ĉ���E�0n�8,[�-[�Tۇ|�'''a�ĉظq#�lقիW��F���;v,2220l�0����)������III022�;#/����֕�r�
�w�W^y�n݂����%%%x��W���ʕ+�֭��=/...8p�BBB�,N�O����Ri���bL�2��ƕ�oM��믰��6m���\�|���hӦ

///��۫�OFFV�\���Xܿ�:u¼y�`����k�������"##���T���Nc��x��Y�U�V�������%v�zSZZ*fff�T*�l�"��������`���!CĎADDDD��k��:uJ066�<�����l��m�����R���pAKKKm�~��	O�<Q�GII�`aa!.\� � ����T*����=y�Æ
S�<a„Zg�����Z�h��%$$T�Ca�СaϞ=j3�ݻW :���Kaa�`bb"H$!33S�~���OA"����³g�Զ)o���aݺujח?���mM����ǂ��u��=�D"��Ĩ�g��������mV�Z��|叵��`}iO���^"ZԬ��ꃍ�
lllT~ѣ��?>����+�mۆ��<M���\�R麝;wbѢEX�h�n���<==q�رj
��%$$���s���I�����)S�p�"�f���H�DDDDD$���8::"//��?PPP�s��a���(**�L&CVV��v� �<V�\�X��O?)~�v�fΜ���R̚5׮]CQQN�:��]�"99*�:���l���C��A�Э[7dee����U���K�.!77��׿�f̘�y����(**��ӧѵkW��o��2������ZRQXX`���j�����a�ĉ���j�
A���]]�*3���������5kV�mk�6����$XYY�������Gaa!�����[oA���)��޽{��d(((��	����gϞ!99|�J���+O�k�������D������///���!''EEEHII�?��ѣG�ĉbǬ�ŋ���Y���d�_�^^^���ď?���/6pB266����_x!�ݿ3f�[o�###$''��G�6mĎFDD����v(i"""""z�l޼w���ҥK�f�t��������ſ��o,X����ذaC�����c���///�ie������3L�0�6mB�N�������~۷olݺU����p��ɓ������̲e�ЫW/�}��u�<�g�ڵ�ر#ttt`gg��� ������駟���Dvv�Һ�w�b���011���#��?/�z���QVV�����TqΪ3������\,^�:::U��H$/|�S�㌌�DDD������àA�HIIQ�Onn.F����ht�����x��7q����[c��S�$""���)�Pbb���E˫���gϞ���9���K9r�ϟǾ}����'O����?ǥK�4y8
��ɓj��������J�h׮Ǝ�e˖�����SRsSVV��7�[�nؿ?�mۆcǎ�W�^bG#""
kтo������^v���̛7O�z�HG������\899���X�j�������9s�lkccAp��5��>DLL$��
|�'O�D"��}�����Js
:TeYm��͞=[e�[o��^U���Ô)SPRR�-[�(�۶m���1i�$������2p�@����n�RY���ø}�6z��‘�

�q�F�l�ӦM��m]��8�_�A`mm����^����Y�h��6������5��<u�A"""j>D����S�P͜>}qqq055Exx8>�����BKK�ڵüy�0k�,���b�ƍb�ը��0ܽ{'NT,srr�ݻw�?�ƹs�`cc|��g��������)|������`�]�DDDDD��JKKH�R��]XYYx>=Ie���p��ut��۷o������W����[�\۷odzg�`ooKKK�u;v�СC���3DGGW�G�T��&�\�.]T�x>*ɋ̘1T�ܩ8�P��e�ԩT���.__�]�v!''&L@�V�^�^�4O������������b���J��<奧���ﯶ[[�zɧ�5HDDD�G����ѣصk222PXX333���cΜ9�7���3g���������Ő!C���333E5i<�'$$����w������Ga���JS�����ƚ5k���===����X�p!m<x�
6��ɓ(((��aðt��:����<�رcx�����0l�0����e˖�v111�Wɛ����k„	o����U���r������D�n�T�r@��|�S�lyyy���ƀ�����666�����ɓ�u�@�#>|SSS��ԛ��lx{{#""����ѳgO�cQ=222;5�?�S��~�	;w�D�V��w�^�����y��	(}��"��g�?^�S���jG4�W8R�,ru�ڻgϞ���Ù3g���~���HMM��ѧOEۺ</�'O�����ۇ{������ݻ���hkkcҤI/�W>uN���Cm�sǎX�t)233��}^^T��y۶m5�ON�k������F96��M���#11O�<AII	���
�����Aaa!?~����U���-**¬Y��e�ܹs������Bhh(.\�2�$̜9			(,,Dnn.~���Y�F�>//���طorssQTT�C���ǧ���ɓ'��ϰ}�v���ߊ���ӧ#??_�V>U���]����>��͋�Y�yyy*0���9V���������U�
<���U�I5����L���_�s�ԕ��`�ڵ�ѣ�?��;w"66��)DDDDDDDD/	y�G���B�� ���X�`$	�m�V�gJ�}�C^$--
.\�Vۄ�Ũ�Q�,�Vq�u��u{^ڵk�>���ň��DDD�������2��Ǐq��q�i���N��js�QQQ�8q"233��o���!!!ػw/~��w�������]���S��#""��G�9E>d���7>��H$\�t	3g�D\\�J�ӧOcݺu0`��ӱl�2ܹs۶mS��:m�mۆ��4���K�.E�.]p��
�\�			طoƌ��oǎ�b�
���+		Ahh(�?�(>ٺu+n߾�:��o�E�n�p��%,_����)""���h߾=������iii��իW�8�ڷo_�UG�Ν�R_q���qbb��Q^Μ9�ѣ�JV��3g���O?��IxIݸq���?q��M�ر-Z4�ڷZ;y�$�ϟ�+W����K�.�]�DDDDDDDD/��]�"))	gϞ�G}T��
1q�D����믿ƨQ�*mۥK\�x���պ�p˖-��"/�Pg���ضm�l٢�&PMdѴ���c�…سg6mڄ�;w�e˖prrRjW��E����–-[�x�bE�����=q����aoom�ʥ6����

�̙3��eee)~.++S|�۳gO�;w���1b�J�III�G��[��O�;5www2D��F�}{lcc��j��S�p������ڵk@}����7���GQr���Z�����\�ݺu���:w�+V8���%K`ii	===8;;P��ĉ��K����
:::����_|Q���<���������W1Uбc�m���h�&MR;\c��q�չr�
��-u��I�
��ɓ'1`����"!!��ؑ4&++���x��wѾ}{\�|~~~,L!"""""""z	}����_RR��~�Ν�H$*_�{zz"%%cǎŲe˪�ǻ�		QY���
�D��l���۶m̛7��~�72nݺ��#W�$K}000���3=z�իW���8q��4C�}^�F��6m��ҥK�����˗ajjZe����ځ���j�6�y��Uϋ�**?2yAA���ѣG���վV5���):�<v��%v"�g�v��͛7ŎѬ4ʑS�߿��
������V�7�|p�֭Z����*{�)3W^�.]?P.��_~L�ׯ��}T��۷}��U��;w����q��-dee�s��j�O�>���r�]�T\^�X�����Ɣ/�������h�"�3aaauz�4&EEE����b�
���a���*����eΜ9ذaΜ9�?�+W�D�>}p��9DGG#<<���X�r�b�}��aÆ
�ӧ""" �H����ٳ�q�F������,@�V�www���ȑ#�s�lll^X��[o�_�~HNNFll���@SYꋛ�6l؀իWP�����R���>&L��͛7c�…'''�7bV����߿m��js�����z�*<==��_����֭[�<x��!o���X�v-���0r�H�G����������|DM�L&Cdd��1����=�\����j��)X�V�^���tt��C�E�.]`ee���ǫ��Py�uӊT�����ԍޢ����Y�U�gž�c�?u}��[�p���J�S._��iӦ���
!!!��V����UTTT�+{�^qy}�cu��Խ������̙�͛7㫯����O�9�G����;�]��%K����?����ر��������Hd�۷GTTq��Q4H��ƍ7E��_
HII���.�g����:6n܈�ӧcժUX�j�R���z������p�ܹs��Μ9�1c��ëU�R�,��O�>8p лwo��6�KE...ؼy3�߿���:~��wϋ@�[m�sɒ%pssæM��i�&�����������.(�����w��G}�Ç����J�EDD`ʔ)�GDDD/�F9r���644&&&���L������������ʯ���J��i+�Jq��
���@*�j�СCdff"))	�V,OMM�u��ڵ���q��E�7y/^��}�8���H�1���J}���!((� `�ȑ���D�2���QMj�>α:m۶Evv6rssѶm[�u����6T;vvv9r$F�)v��y�&<==�k�.�5
111�s��iĈ�x�"���lb�����|���?���>\]]��cժU8w����ѹsg8;;���zzzx����ۇ�m�b�ĉ��W&����{��ţG�ЦM�d�onnnHHHP;j�\M���lmm��o ##�z�R��*��7��
���9c������Gzz:���0p�@,\�#G��믿�)S� ((�~��b;[[[���o���o�믿�޽{x������'''��)��G��[��O�;i���;�"v�fKu8�F�ܹs(**BFF��<��?Vj�����T��� 99Y1$����J��i+�G���(--Ń�v�Z���`֬Y5>y�ʕ+������\�|~~~5�K���^�gJJ
JJJ�����^��m�z�-X[[�޽{pqq��#G������b\�|.D||<�������N^�g� 33�����,W�X>jG����w��q�J{�2y�9gg�fQ�RTT�U�V���
���ؿ?�����""R����?� v"""""j$�u놐�ܼyEEEx���9�����B�>*z��q�<|�Ϟ=Czz:�-[�(iӦ


p��}���W+���!>|���EaJe��I��^�_e����>� ���*S��E���t��K�.U�=<{�� ��Z����괭�qN�2���(,,Dnn.bcc��N�<�  66Ve;KKK�Ν;(..FZZ���4��&煨1:�<v��%v"��]�v)}�L��(GN���ǁ�|�r,_�\e}FF���#���*C���&LPٶ:m]\\p��	���`ҤIJm������Q�c�4i�=�+W����M���Am�DuL�:ǎ�͛7��ꪴ���Re���?fϞ�?��K�.U���w��7�|�45���=v�ލ~�A�L�s_[�q�MLL�����c�B*�"&&vvv8y�$RSSamm��^>jM�"z�:t���u�|||���� w{Q�r��=����������!�L���H�cQ�����h#�$&&"11Q�:///>��Յ��V�Z�(�رc�R�5k�`Ȑ!��ֆ���b:]]]���Ӷe˖

�L&�T*������aoo����Z��������`8::�����������S��Z�j���0�?�����҂��9������ IDATccc����������`eeCCC���ƍ��wߩT�{xx����[����.__�Zg���s�����CKKEEE��"..N�}\\Z�l�a_Rׯ_�رc��G�w����Ȁ��S���R���bG """"""""""j���)�Z�RL�SQ�QG�Z�n]�a֫�����-¢E��lWY����FFF���w����֭[cɒ%X�dI�}����a��ɘ<yr��T+sM΃�������1|�p�eFFF��d		��۷�~޾}/^�̙3�E�<}�FFFb�И��|��w�Gǎk4�'��rss���#v""""""""""�&I��S��ԩSaaa�4�Zdd$�R�ʔB�,))	=z���Ŏ�111�ݻ7���;�X����S����Z��[g""""""""""���'���`Ŋطo�������}��aŊ*��DEEaȐ!x�7��� v�:�z�*>��c�5
@FF�,Y�v�/"""u���ЪU+�ciTNN��� �H�������ݿD"�D"i���B�Ou===H�R�1���(++k�l��i��{>���K����3g��s����Z�X�Rii)�,Yggg̞=����رj�������ݻ7�]���Ǐc���靈������@�DDDDDDDDD���"�o�j.��7���"dgg���4iƍ'J�
Qc�-v��HLL����<�d2�d2�c4j999��d8y�$�n�ڤ�=ڽ{7<<<���???���C[�I��#""�����������H����S�LADD���1w�\qCU� �j�%%%��>���OOO�޽�7o��ٳEHH�8q�"���8p ._�����&[�r��888���C�Ezz:-Z��""����|���b� """"""""Ҙ��T�����̰q�F���"11�/_;Z����
̚5�ׯ����qaq
�R)��푘����ؓ'O���>}���ݻ8u�""" �JŎFDD̀��	tttĎADDDDDDDDMЍ7���KKK���A*����iiij�K$�>*JLLĸq�������ҥ�����ɓJsmٲ���###L�8QiyU�nܸ��������|�I��@ll,lmm����=IIIU���!�H`aa����mKJJ`aa�h/W�祺@����B|���x�wжm[hkk���#G�ĉ'�ڎ?���Ql�o��D��ݻ#??�Ny+��y��q�����)S�@*�BGG���:֮]��|�y�R�(22R(�M�߉�Ἤ�����W_}UhӦ���?
���bG""""""""�zP��_|��}T����22�L��d��^ѩS�ccc��?}}}a���*ۼ�uk``��><<\���R۶_�~“'OT�QRR"XXX�.� ���A*�
%%%j�G��a�?O�0��Y�뢣��-Z�=G			��A:t�@سg���{��C�����"999���X����ǂ��u�ϩD"bbb��ݻ'����D8~��R��n�LLLmmm�sS�|U���y��q��߿_000P�ͪU�4����V��-�.22��ߩ�.��<�Ǐ������v�;B�JKKüy�p��	L�6
�����?�!v,""""""""j C��Ν;ŎADD�VNN���̙3���*.^�������B&�!==]i$xAT�Z�j�.]
�駟˯]���3g����f�������#>>���HNNF@@���k��:���l���C1���A�Э[7����8|�0F�Q����t�,--���W�,0c�̛7�-B�v퐐�\�z�~�-���[i777�<y!!!=z����0�����y����HP�����III�����͛amm�-Z��ŋ���s���秘Z����6m§�~
WWW\�t	FFFӦM�Ç�b�
0��*S��R���{��A&����&L�W_}��^{
iiiX�d	���4��<u�YjX������ƍ�t�DT
�ƍ{)��=~�����۷/rssq��Y����0�������������͛7��ݻX�t)֬Y��]�B__�������� 776l�����x,_�����L�X�gϞa„	شi:u�����ؾ};`�֭*}���&O���\��|}e�-[�^�z����۷�Spqq�ڵkѱcG�����AAA����W���O?���)<���l�uw�����abb��nGS�KyHMM���˱h�"�…��+���������0h� DDDRRR��;v,d2�]��%K�6l؀��X8>>>j��fZ�ڞ����͛����#F ::ݻw���.�|�M8p�{��X��Խf���u�sF�x5��eee�֭[�T*���	AAABii�ر����������pZ>��Cӏ��U�&����	���,��/_�,P�=z$t��I 888�L�#�R��ɓ�>���AOOO�H$7��]�~]�H$������������NFF�ʺ�d���������ӧAKK����.\(������_����W,���R��-�/��9())��S�T��A*�
�DX�n�`hh(
W�\����o`]�KM����V ����U�ݞ={4����l�v�֧^i~Z���(8;;k�["�A�poM�o�������̙3�1c���[���������������y�/~�E
!--
^85��Q�:777\�~]�v��ۡ������ի��}�V;������3����TZױcG:'N�@tt4fϞ���:�,�M�.]��,344����p�3f�~@hh(>��s��S��y^*���ǫ����bڴix���+m����˗/#!!�ϟ�ŋ�?cjj�͛7cԨQpww�_��{���?p��E�w�9̡	3t�q�|��,f°���'�CҌm�Rt ����!-Iέ�9��HRݿ?z�����ӝr�����~�\��s���*���z��􎟟�E�����q��~]�x��j�Jg��Ƨ�{V�\����"�|
���m�6c�Q�<x��ٳY�j
��������B!�B!�B!����P��k�H���پ};�*U�����#ʕ+��TS�:tH�/�~��ST�#/�J�R�^'��
Ҷm[���	�]�vDFFK�-hҤ����&�nڴ�3fo�z�{��S�N<x�
0~��m�y
z\ݯ��ʗ/�sy�*U
5>]߳��*��[[ۢZ�dzg�^���R���7ӧO'++�5k�0b�J�(a�ЄB�ǜ<y�^�zû�k�p�B!�B!�+��ܜ���*T�`к/^�����___6l�w)))<z�(_۸p��O��W\�xkk�|�74�����Hxx8^^^�k�Ng�U�=/��ZS�
����v��T�Zkk�<+��>}��G�p��%BCC�իW��X��R��*_�<���$''S�re��?.��D�"�B;QQQ�iӆѣGckk�իW9r�$�!�0����߿o�0�B!�����B�P�ֿq�
��H���\�|Y��@&M�ĤI����B����������������̛7�>}���'666_c������R��:t�F��04��6h� *V�ȶm�HKK#00�r��1x�`�~=//bѢE�^���/2�|F�I�>}4*�deei�������`���@vNQܯ,�q)�~��N�<�s̨��B�O/��_z

���a�$B��ݻ|���|��G���r��i��ܨX���CB�����/3)�B!�(�TkԨ��ƍ-���?��N��̙3���1e�&O�̊+���~�
!�ȩG�@��322��bbb��49y�dbbb�߿?3g��s;v���SkYll,&&&Ԯ]���L|}}�0aB��7�
6����g߂�Rʔ)Ð!Cx�����$%%agg�5�PA�ˋ������r[�l���'O�h,�2e
�/_��Ύ5k����ȭ[����o-6�����W߾}pqq���t��B�O/�trJq%B&++4h�������ѣ4m��ء	!�Z�B!�B�W����W͑#Gt�?y�Y�f1p�@,--�V����rM#��3n�8*T�@xx8=z� ""���4:Ę1cppp���ggg�:����\��&M��~�zLLL����_����֭cƌܹs���T<���#F�`�޽ܺu�BA�-��u��4k֌[�n�o߾|�!�UuWWW@{J(�yyQ5k����ܹCff&�ϟgذa�w��U�w�^��ݩV�������OԬY___�m�Vh�A��KA��믿��Ғ��0>��SΞ=Kzz:�.]bРAz+�㼉�%�)�L.�0̩S�hٲ%�Ǐ����/�����[B!��ffff��B!������P(X�~=(
6n���+�mU�X�n����?�<���D֭[g�Ȅ⿭z���S�L8@˖-)S��:u��Ã��t~��W��u�ϟ@LL�ʕ���D�K�~�����cbb��ŋy�w077�s�Μ?�֭[3}�t���?~|��WUOQ��<��RT�4iB�-x��1|�-[���S���N�
��U�x�w055�q��lذ�Y�fQ�~}N�>
����9r$��{�R�J@vugOOOLLL;v�F�Nj*�q1t�,,,

�bŊ�ٳ��M�bff���5�7o��.��D�b���<%ϋ��!�'))�Q�FѦMʕ+Gtt4˖-�B�
�M!����cJ�.m�H�B!�����,V�^M���iݺ5�|�	_~��Χ�SSSY�b}��u�����www�4�����SRRظq#}�o�����;CN�III)�=B��^�z�ȑ#�Q�%K��B�
t�ڕ�{���_k���?
��ȑ#9r�={��bŊ�*U�
�`�:D�ҥy�����T�RE��y����bŊl߾�Z,EMU=EW�C�ˋrtt���G��aaaA�.]عs'���g֬Y�^��N�y�&�ƍ�[�ncu�҅�c�r��uQa1��_*�Z���ٳ8::bii���)������"��������s�����	�ѣGԮ]�aÆ=w����<<<8x� w�ޥjժt�ԉѣGk�'��Fd�޽ܾ}��%KR�n]���K�~�4�LMM��ӓ}����R�jUz��ɨQ�(U��ƶ�w���@����(	�����`͚5̜9sss|}}<x�������wNc!D�boo������xm蚿T!�BQ|EFFp�����U�[�l!66�#F`ee�������榮����3Ν;ǹs�x����>Kzz:cǎ�…꾷o���ˋ��X���(QB�s�{��!55�6m�h-kӦ
�ݻ���	!�0��������{���m�]�v�k�N��+<�Cٲe��Q*�/�!��[��z_}�_}��s�m�yy�6�cذa6L�2��������� ������b�~�T�fM<<<�<�=o����{��1|�p����mqqq̞=���Lz��s�G���W_�nKHH��ߟ�����([�,P4r D�����o8�<'Nd֬YIc��h��y�$�—��%��B!�B��bcchܸ��E-((��BϞ=#446mڤ�~��…4nܘ3fP�n]�_����3ӯ_?"##��RT	8�}�
���Z+U[xx�ܗB!�FU,�S|||HJJ�aÆ,\���U��|�r�n݊�������O���Y�`���\�p�Y�f������Qa_�\���۷�>}:6l�K�.�={�
;,Q@����A�]�ŋ�����>3vB!�B��Q5j��}Q+[�,�=��Ϗ��x:t��8p�F�}�����L�j��S�s�Υ_�~���jU������ԪUKkY�ڵ5�!�Ba,/-9%�|�y�GFFr��1�L�B͚5prr���)�m:tHݷI�&|��̘1�	&p��AurJQ\�E��222pssc޼yXXX�y�fI�B��133�����a!�B!�)�=gWWW\]]��,X���
$�m�ĉ̛7��'Or��IV�Z�ȑ#����t���~��7}���9N\\\�۹w��Ί��6U!�B!�E�D�Ft��-��}�ֻy�&����S�f�4ƅ�333N�<�����/���"--Mcݜ
�B�R%��0��!�����4k֌iӦ1~�x.^�(�)�LLL�%/y��L�#�B!��O�n�صk�g���?$--
wwwz��Ŗ-[��Je��<z�(��&&&���sR���!�Ba,/�rJ�t]sc��嬬,��nݺѪU+>���9{�,����2~�x��
�0�����0a:��!;	l���ЫW/�n�J�z�^r��e
4vB��Ib�B!�Bh���$**�ѣGӸqc���9q��|�
͛7�����baaA�>}�ӧ.\�����l�2�=hKKK�_�Ύ;���4xU�T!!!���d�T���,99Y�G!�Bczi�)�x�������aÆ�^�Z�j\�v���hZ�l�n����`_�r ^g���t�ԉ��X>��S�
��<==�_~�������[o�}�v��H�������!�m�6c� �B!��Nll,�7��e�۷/7o�d�����Ջ�����?�P�dIu��;��퍓�S�N�~��<x�___6l؀B�`���@�ÏJ�������5k���~�����ׯ��!�BaL�rZ��m��t�RHKK����B���w�:���LLL��İx�bڵk��۷o_
���;���ԯ_+++@����ɉK�.����ݻw��_P(�;V�W�_��?'�����t��;w�ԩ3g��ɓ'���iӦ̙3�ɓ'+�)B!�B!��h�Cr����pqq�O>�u��899мysu�#FP�vmbbb:t(-[��{��lذ�ҥK�߫�V�T	����ӻwo���U����-�q!�B!��XVN���/ٷo111|��g���7|�p<����ȑ#5�լYS�m���8;;��₋��F���V_� m۶9r���X�1@.īK�T2r�H�=���U����gٲe888��?��ӷo_BBBx����JHH�w�)��	!�B!�x��NF9����������H||<5jԠ]�v���r������ڵk9t�������ӼysƎ�1e��ɓY�r%			���н{w~��g��´����Q�\9�v��X!�B�����wY�*UX�nnnn�8q���4�իLj#�ܹ��ʗ/Ϻu�X�f
���ݻT�R�Ν;��舅���oQ\�E�x͘1��7��.k�ԩ������L�j�

�gϞF�T�ܻwKKK���)U��oߦr��/m�&&&@v��X�0DFF�v�Z�=ʵk�HOO�bŊ4hЀ�={����[o����o���ԩS��~�đ�x���4k֌f͚1h� >��C��={���@Μ9Ù3g�}�v�ėc�?!�B!��/	

�x��~�ġ�V�y,,,�4i�&Mʳ_�n��֭�F���9���xzzr��M�W��͛7���f̘1�-[��;!����y�왱�B�b�XVN�V����y�ѕ�R�B�N��ԩS���¾0���Y�jK�,aݺu?+?��k֬��ښ��J�*e�(�(�F���0~�x#GU|M�2��~�I+���ݻ������+^^^0@���ѣ5���KHH`׮]�ڵ��/���9sؾ}{��&^O�'O�…Z7��B!���>|8!!!�������aii�U\!D�jٲ�$������f͚��Vl�S^Ur ^���|��78;;kT([�,,`������,> IDAT�X[[)J!
����aÆ�~�z���_��cT���X�t)eʔaڴi��ߟ:u�P�ti<x@tt4+W�d�֭<��Ǐ�P(^z�9իW�}���+����S���O�Z��~��"����T�>}j�0�B!�E���_�^ʔ)�ܹs���ppp���믔.]���"��5�~�-�~����B�b���xݨ.����}�6�o�&88��s��E�xe�:u���3z�h�O�������iԨQ��	Q������P�jU��ݩ\�2�������˗�q�F�̙�|���9o��z���� ƌóg�X�p��#�^�z���#�=�s��Çy��1�z�zɑ�WQjj*eʔ1vB!�B�'ƍ�ҥKY�t)�Ǐ�y���K!^{C����D^��k��7�)�5��Rr^r ^)qqq��ݛ.]��b�
������ꫯ���o9x� �:uz�Q�W���Y�h�w��Ν;T�\�N�:���DÆ
�����<w�ܕC"##Y�d	�&99�5j`kk�̙3)W���1|||<x0������������:�Q�v��5���ϥK��ԩ;v�x�X���ǬY������ܜO>��9s��ݡ����˼�������ܸqSS�_����ܹs�˗/cee~^�^�
@������3X�f
�ֈ5w��󘖖ƪU�غu+�ϟ'99��+ҲeK�L�B�t��o<�^�z�믿B�.]�b
		Q�[�j��}�t��/f�������t��'''�ׯ�wggg���GRR�k�f„	|��wz�����HYV!�B!^_/��IQ��������a!�Nɒ%���3vB�0h� c��ړ�""�U��ҳgO�ԩC@@o��J��k׮q��ybcc9w�.\�…����S~Hr��-,,��>������'((�-[�\�"w����+233�m���,Y���{������:�������S���uww��חŋ��o�a�ȑDEEh�]�X6mڄ��=YYY<x���`����ѣG�裏t�aeeE���9r�!!!���W�Ohh(w�ܡ}���Ĕ����5k����G��{lj֬iдC)))t��A}<U�޽Khh(�v�"88��>�,�c�t�Ё�e�����SHH�K����lmmy�䉺�֭[����￳m�6�ė��P��N\\'N�h˭(~^D�Q*�y&�	!�B!�B��6[[[lmm��Bk2�����d�7oN\\�;w�ᆪe˖T�P�:u�лwo֬YÃ�޽;k׮%**���4��(f�ݻ��III����ի<y�'N0j�(��ӱ������)�J�����z�ڵk�_���_�3���LƎ�_�Ezz:G��^�z�9s�%K�hŶ{�n���V�+ݲeK����}�6{���s߮^�ʹs�HNN槟~z�X�0a׮]#==�cǎQ�^=��Ҟ;=�*Q���S��u��0j�(����o�`̘1t�ڕU�Vq��uB�>�s������Ņ��(5jıc�HMM%--��'OҺuk�J%�-�x9���ѩS'�^�����r��E���i߾=e˖�{BBvvv<y�}��ӧO����o߾<~��A�����^�����ޞ'O���_p��%�>}ʙ3g�ڵ�ƾ�T��"^��晴&�B!�B!�B��Ir����tz��ɍ7�����xZ�j�O?�����INN毿�"$$h֬fffF�^Gk֬!11�3f�l�2�իG�ҥiժ����}���ɬ\�2�qN�<��ٳ�2e�FE�իW���S���V�ZE�ڵ)Y�$�ڵS'LmذAkLooo4�U�U��9s&�7��‚�ի�P,#F��_~�V�Z�,Y��m۲z�jN�:�g,�r���ڵK#I 11���*U���������)S�P�D	���ϸq�hԨ*T�C�̘1��jT��U����Ӷm[ʔ)���-[�d������4fN�J#�)|TrN�ϊ+x��;v$((�F�Q�T)5jDPP;v�������Y�f
�����Ջ�7��S�T)�6mJhh(|��m�ϋ(Z%J��f!�B!�Ba���D
��
�7P(/�R��˗��
�֫E�t�ڕ)S�W�1��~�6m�ӧ���ܺu�H�_�T�P���g;EK~���4i�&M"00�ȶ#��L�#���ѣ���1w�\�5kƛo�i��+N��	&�\>j�(�/_�޽{�VINNf��dddн{w/^��|����7Nk]�B������ٱc&&&2Dc����g�&88����S�R%�q�o�^�� ��|���Zm�[� ))I�z�]dذa������0m�4�2___�={�СC)]�4P��bbb���+Ç��ۛݻws��y=zđ#G8r��/�nݺxyy��'���ʵk��.{��
�yTw;w�d�ĉ�;wj,�e߾}L�:U+)�D�L�6�C��k�.��R�I�&i�gjjʴi��ׯ�ֲ�yE��ӧ�/_��a�4ǎ��_5vB� 7g�B�
4��!!^1�7o6v�?"66�F�i�oܸq�o��~�ȑ#DFF>�oVV����СCDDD�a�j֬Y�1����s��-���ؽ{7nnn4i��m_gΜ��͍M�6�T*��/����iӦ�M�S�%��/u!^����u��E��+Da�p����y��=�JN�G��ڵkԫW����)5T��~�a��
��ӧt��Q�Cu�Z�h߾=�f�ƍ:�FjԨ��V�XT�֭�զ�j&?�H�������HN�=���yiԨ?��#?��#< ""������9z�(��'ݻw�رc���<7�����9�<�:u���h�<{��V�Z4jԈ��0RRR(_�<��Ʉ��S�~}�ի�w]�1hѢ����O\�x@ᄋj�Jg{a��������f���2O�� �B�_T�fM��*�(��C�,��ST�ґ#G�\�3i%++�۷o3w�\Μ9�ڵk�?~�Ɨs�O�>寿���͍�'O2m�4���(S�L�� ^
O�<a֬Y8P}/���̜9�͛7��+�ȒS$S]!��>|�B�֮]K`` �˗g���:��<z��r���;.Ք=����$�~��ST�#/�J�R�^'��
Ҷm[���	�]�vDFFK�-42�_��T�bE�u�F�n�HIIaҤI�]��Y�f��mmڴ�3f�����ի?��#������޽������LII�B�
:���h<~�Xk}6�T����0ϋ(���)9I�!^=���Z��B������l�0�B
��5�����C�~Ŋ�X�"_UM^�%JP�zu�M�����s��/lfff4hЀ�˗3|�p�\�Ž;�o��~ 711;;;u��	`ݺu:+ۋ�������R)/y�ˈ/!��������2�ŋ���011��ח�
�
Ub��\�p�ӧO�oDD��
F~Kastt����]5
v^ʕ+���	7n��3�������dO	�������O�
�5k���l߾�+W��k��Q%����Q����U2Brr���<�wL�N�D��^��E!�B!���111����%���(.����={6�:u�u��:��{��P(��]RSSY�b}��u�����www����}r��k}jժh��<p�cǎ�C��jՊ�>���K����
���
�B��ݻw�P(�>}z��_�dIF��ѣG
�o�;w�0g��t�B�V�����PeJJ
?���~��z��-[��~�ݻw�?>�;w�M�6̜9S����!��!�<�<$�n_�}E�N�;v,�}�6n��G}�[o����;�P(ظq���QQ�z���^�'���իW���(�?NϞ=�^ZZvvv���2�|��飷oݺu���&66��m�>wlX�~��~�����ニ�K��64��6h� &N�ȶm�X�j����+W���k�+�y���9~�8[�n�o�ɳ��
LFFF��^�h�W�f̘1�n߾��:++�%
�O���caa��]�P*��ٳsssڷo��zu���?� ""�=zh-W=5�sZ��
r��	N�<�3�%**J�
��"��"��(���B!����g۶m�C��T�P�\����=�j�b˖-���2b�����W���1�F��xH�ҥK̘1Ck���tƎ��.��zyy���[��\�v
Ь�j�*<==5�%$$�q�F>|���>}:gΜ��Օ�͛��;����o����}ѧiӦ��T��{�>|8III�qqq̞=���Lz��
d?p��W_iT�NHH��ߟ��������SRR9r$7o�T�ݽ{�·
�ՐqX�s�
�� ߯˖-#%%E���g�RSSiӦ��mڴ!""��{�2`�C�x�
=9E��xd�yQ\��у��(-ZD׮]15�u�_|AϞ=52�'O�LLL�z���t�ؑ��h<==�Bbcc���U�׮]#33___&L����ƍ��ח
6�h�"�x���!��2e�0d�V�\���+III�5Jk�����#Fp��q�͛G���5�	�m���Z�MLLP*�ZI&qqq@vBPn˖-S����
%�����Ԕ�]��e����ILL�w�ޘ���^����?puu�[�n����b�ҥt��Y�޷o_N�8���ݻw��Q��[A^�xY��ŗ|�B!�G>�
!���3INE.66�ƍ�|����Ǎ7�V�.��ښs��1s�L5����r��7ň3�[�.ׯ_��ٙ������ׯ����j)��:(##��W����n�Z�,  ��ӧӻwoLLL8w�cƌ!,,Ȯ,=o�<ƍ��ٳY�z5s�����Ǹ��baa���V�re��
�o�~X5))��
�p�B�V�����ٺu+^^^����O���Y�`���\�p�Y�f����z��
6p��MjԨ�…����ܹs̞=[+~Cb5d\��V�14����<*u����K�@lxx8���Z�����%9�U�|A~~~ʜ��~/�xy��Q%C��nܸ��P��Pv��Yy��)�'O�T�=ZY�T)�����̙3�u�o߮�M�4Q>z���\�rEiff������LHHP>~�Xy�e�F���rΜ9J�R�

UJ�B��}m֬�P�ڵK���_Cb��xy-��~��Y%�477Wʓ'Oj�)�yy�왲M�6J@iff��0a�2,,L�������P&&&*CBB����P���*�?������+��͛�Ϟ=S>}�T�T*����Sʯ��Z�������P���*�	(�_�����OOO%��S��P�Z�����Qo�o߾����+�>}�<���o߾J@Y�lY�k���$''+---���{�����h�ӧO�/^T���*+W��s[9/9���+����P�yB�W���
!��/��B��"����2�~ܼy�666�M�6)�J����Iicc�ܶm�F?;;;�����}���p�������F��͛75����?J�����-�����:v쨼u��:YYY����+�nݪtuuU���*mll��/[�Licc�1b����F�t�R���'--Micc�lӦM�����JeLL��m(�J��666�S�Ni��8qBicc�0`��M��}�;�B�Ȑq�w�r�
�R���\T�B���˗5����Sicc�LJJR斔�����Q���Kk�������⅝.��)B!D����g�8p��-[j�qwwW�����bbb�*~�T*�_�>���5�ŋ���UZ�n�����������+�q����舷���)]r3$��ҤIZ�hADD|��c^��bjj�Ν;���c�޽������3<==52�lll8|���SlJ���S�2z�hV�ZŪU�4֙5k7n��ի�>}��5k>w<}z�쉉���4��)wr{��w�����֖�۷�}�v��fff�����_U�PP={�dϞ=�ٳGc����3l�0�m�!�B!�ȟ��Dz��EŊٿ?7nܠ_�~���[W�4����f�m���@N�<	@�V�4h��#B��������+����,`��@���ׯ_�Y�f�5o�\k���>}��ܶ�b���x�
*W����
���XZZ��%%%��s��E��rߛ?~<�N��ܹsԩS���뢚��R�J�6C��֭[����ynG5-͇~�Ѯ:�q��K����>g��jȸ*y}��gH,�=�Eu,Tj׮��޽{@vu��Tm�>�x+��cB!Dz��Ett4#G��F��,Y�
*еkW�����_���?�4x#G��ȑ#��ٓ�+R�T)4h��8t��K��S�J����5���=+Vd���e_4��6z�hF�������/�����ݻqpp�ߧlٲ�(QZ�lɼy�r�
�Zݺu���sssLMMy��wptt��LJ�M�bff���]�ta�Ν̟?�Y�f�z��|�������Cq�F�4]�һwo���:t(������biiɰa�8s�V�AȾ�v��Y�ś��)�����뜾H� �E!�B!��OhԨ����)��s����ܘ2e
�'OfŊDGG;,!�(�r'z���<�On�=��"##կS�N�k�..\��Pd'�\�x�5j0t�P�̙C```��c���(4h�n3d�u7Cdeei����;��Ӵ��[�X
� �%�繨���j:�,QB;�A���\�R9�%�|���=�B���������W���h�ڵ�]�vz�W�X�'O�4fٲe��y����b�x����W_}�W_}��mr^r�޽;ݻw7x�ڵk�k�.�ˆ
�������΄����w|������uL6lȆ
�.ץf͚xxx����Q�j׮��ٳ9r��CB!�BH_r��(ZO�<a֬Y8P�~����9s&�7o�L�2F�P!�Fdd$QQQ�=�ƍ���͉'��oh޼���5j��r��YZ�h�n?{���ؖ��\�~�;vhT7)J��azyy����*Uddd�V�\I\\
6�…���1iҤ|o�ٳg���СCu�!����o��?���ЧZ�j\�v���h��֪$ʜ۩Q����DEEѦMu��EN��jȸaH,�=�Eu,�R�
			$''S�J�e����>����)/�?���!Ct.��q!�B���޽{Z��p��=���011���쥗�411)�S]��;vGGG���)[�,fffԨQ��R��ҷ����96!��u�P(ԯ������B�`�ƍ�X�B��(|�֭#11Q����ILLdݺuF�L!�^�j]yU��ڵ+�/&66���Ν;�5�<@ǎprr�ҥKdffr��]~��
cǎU�U]���VyQ'N� ==�K�.1s�Lu�Ç8}�4���4m�///�7oN@@�O�~��O�>%66��'r��U�W���!�ݶm[�.]JBBiii����P(�����T�/�����Đ��ALL����|�G��QQQdddp��y-Z��/��jȸaH,*�;�Eu,�QPM����yS8��A*��$G���.��B!��[JJ�Β������Ozz:���0~�x#GU|%&&2b��իnܸ��7زe�z�"  #D)�BQ0w���ݝ��p=zD�ڵ6l�z��ꛚ������t����у���cff����ӓ}����R�jUz��ɨQ����
�vN?��3�����Ӈ�'������{����۔,Y��u�ҷo_��iUI9�����nW�?y�$˖-c�Ν���2h� ƎKrr2K�,��ѣ�,Y�O>���S�bnnd_Kmܸ��>����zK��w�yG�(���@����>9B�2$9eȐ!�޽�k׮1bĈ<�1b�&&&��C�j,+]�4����}�J��w������Ғ;vh_:t�@hh(�g�f���Z�/]��|�ܹs)[�,�����Ԕ�s�2x�`�̙æM����ח(jaa��%K(Y�d����/�d߾}�����g�i�uttT=|�p<��B�� IDAT��U5�f͚mC��\�|�ѣG�ۻwﮕ4aH���[�Ē��ܦM�";��mۖ#G�K���5��~��[�^�ђS�}��ї9��u�7n��B!�Pxs������Ȟbl���x{{��)��j��ݹs�6m�O�j՘4i={����7�௿�b��͸��J�>}ؿ���!�K�5��;�bCu�ʕ+���S�V-�l�Bll,#F����J=]dW�>|8III궸�8fϞMff&�{�����?~�NB�'##��S�ى�cǎ�…�un߾�����������
ݶ�������Q�F�?
����+�@���Ν�ܹs<~�Xoe��quu%((H�~�ڵT�^�͛7��1--���J�(��9sسg����UڴiCDD{��e���K!����(�ϟ�x�S�2e����͍�G����#�ԩ�СC�={�Fbc�r����b�ڵ:t���D���i޼9cǎ�^�z꾓'Of�ʕ$$$��)�)S����AXX���ԯ_��C���_���M�		�Ν;̛7�jժ���L�:�9s����g5�R�JaiiI�֭qpp����Xn�~W�R�u�����Ɖ'HKK�^�z�1�Ν;���/_�u�ֱf�>�ݻw�R�
�;w���Q�R�J���+8p��?�}��899�gϞ�jȸaH,�9�mڴ)�c�O�����	cذa����(W�����(ފ��d�������ɓ���b���z�!���16n�Ȳeˈ����̌.]�0q�Dʔ)����36�B!�(�����O���Gll,��U�V��ݝ�;w���iԨ���+v���K���i߾=۶m�bŊ���}fΜI�~�h׮G�a���L�0�H!^�7o����ȑ��R�	m�}b��LJ��$6l�…�Z�*˗/g�֭xyyi%�ܿ���@,--Y�r%7n�СC��___.\�@�ƍ�1cu����8;;App������X�l���ԩS�+VP�lYu�jʢgϞ����6m*prJll,ԪU���׳z�j\\\���b˖-���;������ѣG�녇�`mm�5��-<<\�S�����P�����ϳ�ʕ��Uܾ}��U�j�[XX0i�$&M���ݺu�[�nZ�(_�<���:�嬜�+���O?��O?}���w�!;1F_�9U�P��S������ܜ�ӧ3}�t�v]�cH��7?��Eb��y6$fC��o���ͱ����ӓ�7oR�zun޼Itt4cƌQ�[�LN)h���,[�����D]�d���3���d ��[�l!++'''��H�B!D���Sc��ʻ~�:�-b���ܹs�ʕ+өS'���hذ�V�\�y�]9$22�%K�p��a����Q����̜9�r������ȮZhnn����������sUl׮]���\�t�N�:i��-H,���c֬YDEEann�'�|œ9s�J�����˼�������ܸqCg�����}�]�ܹ��˗���;/aaa�ڵ�7�|��� �Ĕ�7n���cǎ��~�HNIKKcժUlݺ���ϓ��LŊiٲ%S�LQ��\X6m�Ă�r�
o��6ݺuc���ԯ__�oAc+��)66�O?���U��{�n�|���m!^I~~~���;!^Y���N:xݩ�QT�ǹ߫;v�~Z�f͚899齷���ԩSȞ`�ƍܽ{W�|߾}8;;���S�s�Υ_�~�����Sݶ*1��‚�+Wj<�]�lY=z������t�Ё�2p���<�eoo��իy��)3f̠V�Z888��᡾GٟWu��j׮��G!��>��RSS�>}:ݺu�\�r\�~�%K�ЬY3#G(�q
>������ԉD~~~XZZjM$��������

��ѣ|���xyyx�:u�����lϙ����ϩS��iӦ���jժEPP�����:hfyEFF���7s\!�BW�2e��+),,�&M���o���?����NBB������h=A��υ���Z���'))�gϞϒ%K��Ox�����������K������%333�F�ITT���Uu
d'Q��уS�N���3<x@pp0m۶����z㰲��}��ܹs����}BCC�s��۷W'�z^T�j�رT�\9�c�s	���iĞ��B۶m�4iaaaܻw���L�޽Khh(�:ub�Ν�;�V�^����ϟ�ٳgܸq///>��C��ݫѷ���|�t��iڷo�ݻw���_%1E!�($
��B������B�`���,X�@��֭[@v5���Y~�B�
dee����o���ގB�P'���ũ��m�tD)))ܿ_c�ĉ133��ɓ,_��/��///uEȂ�[Χ��֭��Z�5ӽ{�tVW���!��j�:u�D�-���%22�J�*iU�⿦L�2̝;���`n߾��۷	f�ܹ�.]���|zi�SrNm�W{dd����5t�P�)y��ٮ2u�Tu�C���ˋ���d�!�Bo��s�>C��ݻw�������ϸq�x��w������///���x�"����rWEX�x13f���W�믿3f����;�iӦQ�zuN�<�ȑ#9s�K�,�JN߽{7			X[[��GZ�l���W�\aϞ=Ӊ�v��UΝ;G͚5IIIy�X �i�	&0i�$�U�FDD#F� ..���}�v���=�#G����I߾}���[��Q�F;/���%x�133��?�hsqq!**�F��f��7oN�%������ĉ,Z���>�,_�x���N�:��?Ҹqc���O���غu+��ҥK�D���"�[��ѣ|��g���B۶me߅x�
4��!��4v���T���y��>����ѣo��ޞ�� ���X�z5˖-S/�֭�Z�����l߾��g����/�ǏתЭT*��OOO׻M333����[W?U���/��+��w���_�Ezz:o��6�[�fԨQZ�B�_dccøq�X�t)�Ǐ�YuX_Ųr����J�x^�!��*9��U�sf��"��B!��[��չw��Z�2v(��5k֐��Ȍ3X�l��գt�ҴjՊ�~������dV�\��8'O�TϷ<e��iT�Ŀ��V�ZE�ڵ)Y�$�ڵ#  �
6h����
d��I�^�\��3gҸqc,,,�s�4Ȯ4��/�P�V-J�,I۶mY�z5�N��3�P�rev��EBB�Ʋ��DBBB�T����{A�������������Ӷm[ʔ)���-[�d������x�ܚ5kƞ={h޼9�J���ښ-[�йsg�ݻǚ5k^(�9��v�G�<y�͛7ӹs�B�w!^u�7of����C�bM~N�/22 {���HV�X@����խU��~�m@�}߂P%��رCc[�WDD����۞4i���G�jLM����郧�'�ׯg���<|�P#�E����[a�{NU�TИ�GEզ�#��u%J���ޞ
6p��1"""رc3f̐�!r���租~⧟~b���G�UN�9�
��bJ�v0<[:��2�s��ٮR�dI���_2DžB!��%JP�R%c��JRM33a���G�����ٻw/.��'99������A���Y�x���0n�8�u
������gǎ���0d��e̞=���`�߿��ܷo�^�� ��|���Zm�[� ))I�z���a������aڴi�e���<{���C��˛�<y��r���K^�]��w�{ァ�����䄩��安�	S�L����0s���"��gȐ!ddd���G�޽�OB�����i$#
!4���k}��bcc���]�sj۶-7nd�ҥ8;;S�bE~��W�Q�[�n5h�;v���'''�N�J���y�����lذ�B�NF.ȶ�Bhh(qqq�Z�J�xӷo_n޼������;����?�BY���u�-4�
4�LӒw�
�rI�/(�.?Ss���*�X�r���AB�"jr�]2s�P<�?|�\���@��|<x<�s>�|ޟs�3���C�~�hڴ)�.]4�_׬Y��7o�c�ȵk�X�t�Qm4�+��BVV.\�JBQ%@���B!���zj�)�x�嗹t�����l�Ro9333E�޽{�������ȅؽ{������ޞ��,�ܹ��9��q!ijB��0=�y#*"��%��Ϟ=�w����ϟ�I�&lݺsss�����6m�k�֭�������C=-�J�
�֭���'&&Fg�@�z����&�£0�X[[PPPP�&L`��Մ��j$���Jw^���}�6���T�^��xJr��9N�<IJJ
���ǏJ~H����:��o��S�N�)����aÆQPP������B!ʇ1�)cƌa�޽���iM38a����f������1r�H�u���̜9�Lu������Ǹq�8|�0���+mڴa����t�R�d��C�w�ޝ��8V�^��ի����pss����k
��:]�v-�z�B!D�T!�S�R��d�J�Hs��E�Ep�B<˺t�"�[QA��.DEp���2�۴i�����ڲs�N����F44fDՔ=���+6�2<<\or�*q�������P-[���͍��D�ڵ+������ӡC����eKs^�4iBjj*�O��cǎm���C��K�mۆ���Ν3he��jU�����2�V��]�zu�������رce~!�B[�d��'Oj�.��ޞ��0֭[��Ç��ˣI�&x{{�j��jժʦM�طoׯ_��Ɔv��1i�$�4iR溝��y������#((���`<<<�\�2����~M�z��ڵ+�G�Vo;s�L*U��޽{��>...̟?��}������ӇիW�����Q�4�%$$P�Z5�z�r�S!�BT\29��l�'��mLf��T�48::�{�n�B<��ׯ/7ąB�ecc�ݻw�}��ѣm�:u��ӧcffƖ-[�hccCvv6999Ց����#G�!%%�S�NѢE��Ky�0a������ҵkW�����4����]~����S~��7ڷoO���ٲe�9�@���<x0
6���-ZЬY3c�["}����ԨQC��4���|<x�G�Ѿ}{222X�d	,0jB!�(Y||��kմ|�899Xl]S��[nggǬY��5kV	���n???���4�������^쾬�����׷�:�i���666xzz•+W�[�.W�\���L�8Qg�B<��o�΀L�BTh&KN�ׁóşT��1�톚={6�ׯ'++���|@2DžB!��I�&=z���$���yyy6���\-ZT�ƍs��q���qss+q�xyy�����[�l!""������
2�3f�c��������Z�j>\�\i�˰a�X�jAAA̜9[[�b���7ܽ{Wcd��>����`&N��Q�ڵk��=zD�J���8���+o����$@����V��ݪU+�-[ƌ3dȐ!'B	!*��7o���H~~>\�v�Z�j=��U�w��&��ە�ӧO��}�8{�,w����‚�
ҥKF��D�1Vi��5�q��=z4�~�-QQQ̝;���(�B�gك2d���B��M)���(��n���

R\\\�˗/��]�|YqqqQ����02�,��G�$��O�#?�S�<==M�/C<�ʫ?�����������۶mS�o߾˧N��������ѣb�9s�(cƌ�Zw��	P4h�(��<|�PqrrR�_~)v�III
�899)>T/W���5C�W�z}�U��O>Qe���ZeJ{^�z�-��{���ҥK����R�R%�����
�s�ٳg�۔��S�c�Z޿��σ�N�:)��jժ2�V�ѣG��o��J�.]J|��"��<���(���%k׮�蓭[���_��JyoWV999ʘ1c33����
��x�J�7^�/z��E�������r��U��ի�������a	!�OD�yzz�7!^���
�H����E"��B�gE�.]���5uBȔ[�"�2e
�ׯ'11���~���@���9|�0111���S�re���w�����qvv&22��'�'O�̆
�N�:L�>[[[��������Sv�ٳ��W����B���o�Νy��8v�{�����.�������~�z�/_hO��;/7n�}��|��w�nݚ�>���}�R�~}<x���_���;>��snܸA@@mڴQo_�~}233�={6,����ӧO�l�26oެ.��_accS�cq��!F�����?��ɓ'�3g���ԯ_�q�ƕ)��8�fff����ꫯr��!���K&M�T�!L'<<�Q�FIxx8S�N5mPPL0�Gnn.={�$%%KKK������M�6ԬY�{��q��	v��App0_}�����ܹ�Ǫ��8�z�!����:S�LaŊL�:Uk�{!�x��Y��C��:!D9����ҥ���xnIr��YYY�p�B�O������5k���4qtB�?��ח�B�Ξ={6l/^�Z�j��R�n]���4h?��;v�*�a�ڶm�~�h�"��Ҋ=ު�?M�6eÆ
�?�%K��d��r�;w�����
CCoN�2�	&nPr�1�<)���t�Ё��^}�U�Ǽ4��aÆ�۷Ξ=˴i�t�`nnN@@�|���s����CPPAAA��ϟOLLgϞ�ȑ#���X�v-#G�d�֭�_z�%������J[y��_~���0�}�]|}}qww��ɩ��B�Pzz:���ppp`Æ
���&55��'O������G���BÆ
���ךڬF�t�ڕ�]�2v�X�t�®]����ӧ���B����'����C!��_~���۷3x�`S�"�(��۷3`�S��|+��+2�Y����Rf͚�̚5K���6u8�%�B!D����{�>K˻?q��e�رJ�z��*U�(իWW�z�-eϞ=ZekԨQ���<����W�Q��baa�4o�\Y�x�����(��ܺuK���T�������{��5j(���ʭ[�E1lڃ�b)����[_�v�6mR�/�(6Nc�Kayyy�ƍ���~[qttT�T��XZZ*͚5S&N�������6""Bi۶�R�jU���N�ի����[QE���T�W�^e:�����*-[�T�T�����P&O��\�z��bS��;�ӦMS��׹^��FN�s��ye„	J�z��N�:����r��I��7�s�ȑ#ʠA��J�*J�F���?�X�����j�>�@QE�2e�(s��)��r��y�]�v�������:���ٳg�ұcG�J�*J�5www�Sh��;s�(/���Ω���i/������1�%33S�T��R�J�ĉz�Oa�W�VeҤIŶ;%%E�ѣ�bii�ԨQC�߿���J�9lL����++W�T�v�ԪUK177W���~��)���+vŽ/^�/z���G����*:��L�#�����hG$9E��=
!���E�,�����{�c.�<xP���ә`bii�|��:�_܏���F���p���\g��^{M���Ѫ��ÇJ�:u@9r䈢(������������C�m��={�:th�cQ����Q*U�������CQ�[�n
��رCg�;w�T�[�n�>/���S���Gg�ܽ{W9~���u�����KKK�,,,����b�]�~K���ݻw�v���}�)�w�ֻ?}�E���/z���G���Ғ�!�O������B!�B/�jQ!�0��7o2h� ����9s&gϞ��>|���Ǔ�����'׮]��NQ����@��M�6����ߙ8q"L�4������|<H�&M8v�˖-ӊ��'++�-Z���@ǎi֬׮]�~(�mgϞ�ĉܹs��?��L�L�0�iӦq��y���9t�M�4!//�O?���X|||		ѹ>,,�����;/?��#C�-6��lmmiӦM�eƎK߾}9t����c���4nܘ����$,]���G�ҪU+:Dnn.yyy\��� IDAT$''ӹsgE��>ӻ����B!�B<�*�:!�B!*����V�j�0�B�ޗ_~�����H4�ԩ�:u��֖U�V�~��b���	`Μ9xzz����3t�P����˻v��֭[i߾=�7ofѢE����Kc������'<<�~���i޼y�n�;;�2�����_|�~���Fpp0�z��_~�����������ʢN�:�uׯ_��o��f͚4(�y9}�4m۶-6c���Ǫ[�n��_��gϞ$%%�k]���� 22�v�ک�w�ؑ��H�6mJZZ���u�/D�o�n�����!D�q��^y�
Wwll,����>�!C�fhB<w$9E!�B=


L�B!�o���iӦ�\?~�xV�ZŞ={�&�ܹs��Ç���C���Ò%K4֫F�2e�ֶ...(����֭[�޽333F�����ˋ��v��ŭ[��Y��θ�u릵�4��L�<YkY�Ν�q����V�ʨQ�X�z5|����u[�l��9R=�\i�Kvv6իW������u��>u�T�e:t��ݻz����?^���ܿ_o]�Q<�Y$�B<�>��#8@jjj���رc�[��m۶�(
C��Y�f�d-ċ�%��%R!�B�gAAA�<�*�BT8::[��ٳz���p��y�4i�֭[177�X���	P��1�mݺ�����=zP�~}�u
4�[�n�߿����I#����ZV�XT7n�����0,�v„	�^����P�䔢S�@�΋��
w��%''��c5i�Dk���
�=*�zJ�ܹs�<y���~���?�O���������(HB!�x�8p���}��}�ϟϠA��}]�͛��۱��z�a
��(��.]�[޻B!����ɑ�k!��0t�}�6m�Dll,����ܹS�(&999T�V��TS��۷��>Cxx���U�HYcQ���0z��Z�l������$$$еkWRSSIOO�C�8;;�˖�4i҄�G�����ѥ(]I%��T��T$۶m��Ϗs���������СC�Y���a!�arOK<-...&!D',,��ׯ3l�0���Ç�u�V���t�p(�(Y%S �B!DE5c����L�B��S��q��mE��kd�S�N1}�t���زe-[�,�UbHI2228r�AeSRR8u�AeKKy�0a�����QS�t�gϞ���=�vBW"L^^^��Ͱa�8w�͛7g�������s�N~��2�_��ŋپ}���B<��o�.�?��?�`����ՋN�:1l�0����egg����;�ЩS'�}�]V�\��'uqq��Ņ��L�L�B�.]x��7Y�d�ƴ��="88:w��o���1cرc�ƾ����G��gϞL�4I�����i����������}��Ԯ][]�N�:������Ra�r9�СCZs�
!��ↅB!��,--+�S�B!ċF5�FRR}��5x���<�
Fnn.�-���]o�ƍs��q���qss+q�xyy�����[�l!""��K������!C�0c�v��APP���T�V��Çk�+�y7n��9���L�4I�4DOC�J�x������$�����e�g�}@pp0'N�Xw��5��=�R%y~�<��BcEGG�,�ܻy�&�G��ƍ�e���PPP@�����I��ƍ��-++���hRRR

��m�ĉܹsx���y������[�N����N�8��'�w�A+W�$;;[#I�<ۭ�?�@nn.���Z�\]]IIIaϞ=8Ш��Op�➖����'������B!�B�y���7�>|��>66333��맱|��٤����/N�=		�Z������
6����-[�0mڴb���{���:Gv)k,O���#F����,_��7n0l�0�i�Js^�7o���999��Ӈ���bcy��!_|�E9�J�jj����u�c�"33x��T�ʕ+տ~�X!���EDDp��
Z�lI\\��4�<����;w��u���Ç			��ɉ��L�t��5hЀ��8;v,�x�K�Hyk׮����<x___���9�Qjj�֔G�5"11�E��{��՝��@�-���Z�*#�0N���"�B!�x�2��!!��!�ŋdʔ)�_����D�~�mqvv�������N�ʕ	To�k�.֯_���3������[��ɓٰaaaaԩS��ӧckkKrr2~�!����ٳ��W����B���o�Νy��8v�{��U't�W,O����ׯg����>P���z�jΜ9���i۶-#G�d��������s��}N�>��ϦM��p�@�#��K�.�ܹ���pqq�ʕ+�_�����2�~��dff2{�l,X����O�fٲel޼Y]���E!��]���Z^4!�<:t�9s�P�~}���գ����J���qvv�M�6���1m�4~��guҵ�ܹs�1b���ܽ{W���ښ�����8w�ݻwgРA4��G�������6�ݺ�9sx�|S�*A\UFa3R!�B�W���<x���B�0x�`��/��u����?��;v��ʊ�={�q�F���Y�f
m۶Uo�z�2--�jժaff��G�iӦlذ333�,YB�:u�����7���ɓt��Y�����ѩS���B��'Nu1&�'��ٙ:p��=^}�U:v�U�4�O���?��G�(
aaa��׏�_~�ʕ+ckkK���?>.\�A�DEE�s��rk߼y󰴴$33��]�beeE�&MX�jk֬)��Ν@PPu�ԡr�ʴnݚ͛73�|�6m
��#G�\�(���qqq�W�^\�|������n\�۷��3gһwo\]];v,[�l!;;[�������O�)�.���̚5�Y�f��OB��իWx�W�-w���qBJa�����~
+<=����x�B�3fP�jU���Y�jC�%44���<��/�h���[��7o`kk��N�LUFa�f�3gΔ�Г�;66���d:u�$O�
!�B�
�K�.t����a!���׏�Ǐ�l�2���KVV���t�Ё9s���[oi����ktcǎ�iӦ,Y��Ç���K�F�1bs�̡jժܾ}�]�vaooϰa�گ��'s��a�Νܾ}�5j�K,O���))):GMQ1���XXX�b�
f̘ADD?��#'O��֭[���S�^=:v숇����T�\��1]\\HLL�O>!!!�{����k�1�|�y�|||ʴ�	&P�jUV�ZũS��Z�*:t`ƌ���;4mڔQ�F��˩UB���tZ�j��u��O�ޏ>��h=
������/III����HKK#44����w�D�{;v�u�ֱm�6Ea�С4k�L+aN!�����d�'9RJQ%�X���&EU�R��zz��M�N�ؿ?;w���_eÆ
lٲ��S���7j��(�:���֗�ݪm+U��A����U�������αB!��袣�1b���BCQS� �SӬY3BBB*{�֭R�ѵkW�v�w}�5���Q����֊ǐ�ݒb1f���ݸq�7n\�us^���?�a�뺔���ڵ�;���[�+7j�(F��s���^^^��WN_r��r�����IJJ�v��L�<777�W���A\\���|���lڴ�W_}���<��>���gРA8::���y�ؾ};VVV&�P!���_~�K�.���I˖-��srr��?~\cļ�Ǐ������www������য়~"""��+W�*A���EQ�w�ժU 33S�������ޞ��,�ܹ����ƺ;w��!��B$��"`ʺ�s,�B!�%2�Ott4;v�0uB!D��k��7�q�F��kײv�ڧ�@�C�HHH�V�Z���S�vm�:'''�M����56l`Æ
=�؞7aaa\�~]c���Ç�u�V����ӭ	!����͍��V�XA`` 5j�`͚5���R�^=����w�Nxx8���,^���-[�����%KN�.���ʕ+���ү_?�6mʥK��QWE��ŋԯ_��}֬Y��7o�c�ȵk�X�ti�ۭ��W^y���,.\����r��u!��L��b���*�!�BT|&L ??���S�br�6uB�"<x �)B!D9x��7ndϞ=\�v�*U�иqc�{�=�Q677������˟����}��e����
'���{�n���9�S
:t(��мys�u���,]�����cii��o��ԩS5��2$>�?���
6���HNN
6dԨQ��ׯ��z�jv�څ��;3f�0���'Pt��urr2+W����7�+WfȐ!L�4�;w�l�2<H�*Ux�7�;w.666dggC���5�s�:upqq!&&///lmm�m�B<ƌ�޽{IKK��w��X7a���G�����ŋ�;V�\�����b����t�R��v�کW%�xxx����ԥ{����űz�jV�^
����V9Cۭ�n7778@zz�F���J��#��ɲ*���\֮]���;�;w���lذAc�0\\\����������___�/�תߏ=JϞ=�4i���O?�ĤI��޽;�:u��w�eŊ���j����`�z��E�N�6l�F,��6�s���]��'�B!����ÇM�B!��������
@�
HMM%<<x<����u�شi/^����r��	>��S�������gҤIDDDp��U<x��k�

U'i�ĉ�㧹����aܸq:���Onn.7o�$::�/���T�ݼy�ѣG���r��m>|Hff&��\�j[�l�^�z���u���|�rbcc�����ݻlڴ�ݻw��g���������o�eŊ��~��rssuެtuu%77�={��:.!�(�Ÿ=O���=aaa���[[[�T�B�-X�l�F2���-aaa2�ڵkcnnN�ڵ>|8������]���4o�,,,hܸ1���|��'�r�gϦnݺ���k��e�̙4��իcaa���+���/u�u�ݧO���IHH��oBBժU㭷�2�x!*�>�NtFF�z�����κu�T����;v��˗Ӯ];�ԩCVVK�.�v������?[�ʕ+���V'�i͑���ELLw��eѢE��:�7n�P�Su�

�߿��:K�����gϞR͵&�B!ʏ$�<�Μ9S�aXu
oaa����:u���'''�ۘjɲ��<�۷�]�vq��Irrrh޼9={���+�ӫ�����i2����X����ԩC�yb�	!��;��ͭ[��Z%..x<Տ��< >>��K��m�6F���-[��Ƞu����Ѹqc.\�@`` )))�ڵ��������_P�n�R��֭[��������뉉�a߾}̝;ר�"""�q�-[���O?���U�V��7���ʕ+����Q�F�]�kkk�������ٺu+
4 22���`�.]J�f��믩S�lܸ����KLL�E�Z�T-KLL���B�������%��^�:s��U����������޽{ӻwo�갲����__���n]u������IHHW�\Qn_�r��Ǐ3q�D�g��8r����h~��bcci۶��
���>���ݻG@@�=b��ܻw��bgg���HWFb�F�HLLT'�lݺx�����HRR_~�%�F�\��{\\�� 44T]���
�!�B�*((����S}�Q�/�'??��W�ǰa�HKK+�:J�I��P���|��̙3���n޼I~~>iii�^����{�����,���رc�[��9s�0{�l֮]����M�B��R%��j�J�k�
���(bcc�u��
"55U}-`�޽ҬY3���iԨ.��(sss�GX���hԨVVV�)	T	/��w��!�̙C��������ߟ��T�����U�)vvv�_�^�	zC���|}}iڴ)xzz�����G�
�Z�*^^^ܹsG�ݙ3g��#�հaC�2B!�.�G��N�:#�EEE����ȑ#M�϶�6r���
u-OMM��D��4Tu�@||�:û}��xzzŸq�8q�Ç�C��5r�H��6<��(�:u����g�r��rrr��v���4C���%�)�c!�B�gCNN�*U�|nQF(�}NJ������Y�n���|������aee�U�i+�6����?IIIԮ]�ɓ'���F����?���#22��?��M�6�ꫯ�4VS��>���gРA8::��@�7o۷oW���BQ��ל�/_����կ/^��ŋ���3f��'����Lrr2AAA�;OOO,--��]�x@�����U�vm._�̵k�hԨ��2��p��=�U����I�&�߫W�h&��իWUO5ERvv6�n�⥗^R�3��pl��Poܸ��w]}��7o�|�@�LUF!*}�P�ʔ� �uVVV,\���ӧ�!w��Ś5k���&ċ�B^i/܉vqqQ��R�v�N�J�&M8q��5�>0�.U2�ʍ75j�F���O?e۶m�;wx��@���{a�9B!�xvT�R��!<T}�]ժUi޼9�V��Y�f����޽��a�ܡC�HHH�V�Z���ӿjժ���9NNNL�6�I�&QPP��
L�I���q��u�
�^6|�p�_�NXX�	#B!��{���#  �6mڐ��dž
�ׯ_���\��ú~�Qggg����9y�$=z��ۛ���u���Ř���̊-[�*�DQ���5�z�tř����ΪU��\^����*�Zfl��B�x^�u�L�Š+X�bS�N�]�v�K�g�S9�hv^q�n���o����˗s��)�իG�n�hܸ1�Z�Қ�,�W�!�B<�߿/sȖ�?���
6���HNN
6dԨQ���O]F�a�ƍ̞=�f͚�/|����޽{���?qpp�o߾�?^�O��O?�}�vN�>M^^t�ޝ)S�`mm��DS�{�1��J�*x{{�������'��W^m.�����l6n���?��_����={����G�ݢ�:::r��ej֬I\\����/���Aݺuٹs�:A��ˋڵk�<fC�EQ�7o�����i���\�,Y����7�`�����ۗ�NC�׺�^��]�v���Ό3���&&&����k�:u����BLL^^^2͘Ba���T�=����[�&<<�Ç�Ю];6nܨ�����������O?�DDD+W�d�8::r��v�ޭ��}��%>>���(���G�Z�4�?z���`E�w�QOd(c�{�嗹t�����lٲ�}Ϛ5֬Y�������ΐ�gff�52LI�͔���=YYYܹsG�������r!�0%�����TO-'�(����bc;��ׯWw�322X�n�f�*U�������R�fM��)>�r��Fw��αB!ij������n޼��ѣ�q�zYff&п��+W�$;;[}�>??�I�&����.s��5BCCIOOgݺu�Ĉ�� BBB4����ELLw��eѢEz�4�C�m���gϖX�,m6�����øq�4��deeMJJ
���Z	 �X�t邛����������[]������8q777�����0n�8�ee9��������<NTٱcG�!**J}���:K{�W�ZETT�Z�����~����\\]]�ʻ�����ž={�7v�xލ1�;v�:!*��۷�:�gBzz:�[������{�+W����K�~�hڴ)�.]4GR�ѣ����3w�\�6m��۷ٲe�7o���E�h�Jĸx�zZ�Ν;Ӯ];�=���7ӦM�s��XZZ��o���_�������
2�������FLL+V� 00�5j�f�bcc�W��|��G�A||<����v�Z��_͚5�y�&;v�`�\�v��K��Β���+deeq�����.\P�B!�OW��֧_bN� IDATG�����O���������/��&M��.{�����i۶-����k׎�[�r��u�($��q��a���9}�4���S/�{�.𿋪+V� ++���<�/_����~�u�:���pa�9B!��8	0uϼ��nܸA˖-������>shh�V�F�����Nزe�nݚ��h~��bcci۶-)))�ڵK��֭[�%11���$���KuRB�'�RSSկ����'ao߾]bٲ�ِ㫯͑���;w��u���Ç			��ɉ��L��Ë�uĈX[[k�S%�t��������u�x,
3�|�̙3q��aBCC�[�.W�\a���F�i�'�DEEѨQ#֮]�N�ILL�E�Zۨ����<x0�6uBTh�wbc�SF�
�ҥKy�7�ܹ3����{{{ӰaC���9r$;v�O�>l޼KKKfΜ�.�z����C#iu�ҥ4nܘ�W����G�=�ܹ3�G�&))�=z�lٲR��mL|cƌ��ޞ��4�}�]�t�Bll,&Lйsss���033������F��ݻ�G��ڵ+C��F�F��$�k��s^�j���*�B!��
9r���7���Ww�+܉���f�…X[[�h�"*W��…>|8,`۶m��ڪ3�=<<ptt,v��ݻO@@���O���Օ1cưw�^u罰w]u���q���ӵ�&�αB!D�!Sh�Wx��▧��r��!�̙�~j���_}����#GjL[�w�^qrr'H,\��π��I��p��)���;Ξ=�N\/izPc�1DAA�+����,m6���o�>uygggڴi���ӦM��fʔ)zc�^�:�
"22���$\]]�����_���F�}��ܜ��=zTbL���|����O���pvv��ߟ)S��o�>&O�lT����+W����ׯ���N��̙34h�@k��
j��y��1*�eU4��ɓ����r����ƪG��W�]�vU'^T�V���P6m�ľ}��~����3i�$�4i�.;{�l֯_OVV�ƈ��j�"22���X~��G~��w����ԩ�C��n�1����ƺu�8|�0yyy4i�ooo�|�M�u8;;��GPP�����3gR�R%������qqqa�����۷�m֥O�>�^����F���.!!�jժ��[o�k�B!��d&KN)n�4C;�K�.�?��O>Q_�urrb�ܹ,X���K���g��"�˜9sx��!			дiSF����ƍٶm���w�u�-�c!�B�"�z�*`�耪��*�Q���u�/<O��7�9s&�N��*�(J��S�!Tӽ���-NY�l��-�ʕ+�ㄔ�^{�5�}�ȑ#ٶmaaa������DAA�;wV'�Ԯ]�˗/s��55j�3EQ�w�zz(�ԥh�ݗ/_6�Nc�{tt4�!�[�n��K/��ݼyН�Z�*#��4#�*�g�$>>^�?�Xlywww�}�����5kV�����[c��ªV����^^^%�����Znh|�Zz``��u�����秱̐�gee���/�����aL{u-�����ӓ���\����ʕ+?~��'jM])�e���'�B�
9r
։����ϴ����;���;�׺��������퐫�W1��n�!�B�g]��ꦿ�~��7� %�x)<�����9u���գ[�n4nܘV�Z1dȐ�5�C=z��͛�X�,m~7r��h��j�b�DGG��������h����\�|���$��)'O�d̘1�jՊ������t>u)z�T����\���:�=���ő��Gpp0+W���W�J�3殺�
{�"0`����C�
+::�;v�:!*�ѣG����ܹs������Qk�v!�(�?�Ш�V�WǎM�s��&�<�s,�B!^/��2�.]"33��-[����#.\`���8::[699���P��%���>|�w�c�)Ƀ�OLu����퍉�,���ɉ���s��q�/�ǏW�a///���+�m�FRR�*U���M��o߾���E�~��U����="88EQx�w��"e9���<yR=*������*��i�q�5k�Y����������ޞ��,�ܹ�����vw��Q��E1x�`l�0���<x �)B���ʊ�2}�t�5�v�b͚5XZZ�8:!�B��$���t��B!ċ��͍��V�XA`` 5j�`͚5���R�^=���b��ѣ����3w�\�6m��۷ٲe�7o��Ņ��`�m>L�^�8w��-R/�{�.�j����EQ�x�"���/u=E���ߜ={��� Ξ=Kݺu�ӧ���̘X=���ܽ{w���	d��Ŵlْ���,Yh�~R��^z���{����
EQhӦ
5j�P��ܹ3�ڵ��ѣx{{3m�4:w�%���_~�%��ɸ��1h� ���t>
�x�b-Z�+��BZZ�z$�^�z]gi��#F� >>���L���X�v-�xj���,.\����r��u!�Ba��_�)S��b�
�N�J�v�L��y�f���G��DTT���Ir�	I�X!�B�ƌ�޽{IKK��w��X7a„����f������i�2hii�̙3կ�w�N||<h����Ӹ��R�fMn޼�������޽ۨz
SMiT���˖-�J�*%��(cb1��j��ѣ��矹x�"cǎ�ض~��Zˊ3j�(�o��NjY�t)�'O��/~~~Z�{���ŋ5��1�|�e˖x{{k,{�W1b��u��}mnn����ƍ�����믴i�7778@zz��w���t��D!!�wׯ_�_�~ԨQ���˗/3`�j׮M||���+֙3gJ�h�ﳦ(}�Xq�1�̓�돍�U��թS�RO%'��<==������$**��a!�@�T~�'�O���'��9��9Ç7u8B!�B�Jjj�ޛD������ѻwolmm�R�
-Z�`ٲe��ׯ�}W�V���P<==qtt���;;;���o�͙3�޽{cee����Z�bɒ%����m�6fϞMݺu177'??��z��A�6��[�Ҽy��)k�
=���lkkKXXC��v�ژ��S�vm�Nxx8vvv�lcc����7��Z_�V-"##�>}:�Z�����|�M6l����OkICϧ�����ӧԪU��C��q�F�V�jt��}_;;;��@�>}���&!!A�|BBժU㭷�2��B<�T	[�Z��xݺuk��d��>�H#NTLǎcݺu̙3�ٳg�v�Z�TwB!�B!�FFNB!�B���j֬�W_}E�޽M�3��ɉ���b������f�b֬Y�����Vo=���޽{�<���SR��nSmÎ��6W�^��s�2w��b�/�����+
4�Q�F:�T�Z///�Ԧ%1�|�t\�VM�S�:���k???��clll���$$$�+W�P�n]�\����Ǚ8q"�����#ċB_r��uEu�2m_���G/yݿ����3h� ���`޼yl߾+++G(�B!��69E!�Brrr�����E�
-77�������_'�M�G��N�:�@GEE���5��/�Odd$7n��Ņ��֮]k��7B����6l�z���ù~�:aaa&�L!��b:s��u����nbcc�bTB��LFNB!���+K�Y���§Y�f���߄�<����X�p!ӧOW'��ڵ�5k�hMw$�(����
HLL$''��
2j�(�i�T�,7nd���4k֌��`�q�]HH{����?�����}�2~�x,,,4�駟ؾ};�O�&//�w�Δ)S����H�):�1���xJj{i���R�믿X�~=�����Scԩ�ԯ��������о}{j׮�._�Nu�������>F��3333uB!�㣏>�:G�SM��m�6Ea�С4k֌�mۚ R!DE�Į�2�I�Z����M�B�����O�!�Яv��ܹs���1777uHϬ�_�)S��b�
�N�J�v�L������o����I�
���IOO��ۛf͚�.��MF�͍7��233	���@+�n�ʕdgg�����4i�2׮]#44���t֭[G�J�#

"$$DcYYY���p��]-Z��]��c(c�)��x�+;;��c�r��u���{�~}��������Uk��������g�h��OA�.]�l!��)�7m�L�(�(N�'�ԯ_�����n���=!������ߦA�gB||��Cx�xzz���i�0������hݺ���*ܸq��-[�駟���U���o

�JNiԨ����6�l�BFF�[���Ϗƍs��IIIa׮]0��[����K���133�ĉL�8����qrM�S���P��S\�U��"�����͛�r�
�����O?�Y�f�8q����2կ�݉���h�Bk��e�����"�B�2��'|��*q�֭���1e�F'�0�rON�ҥ]�t)��
!�Ba���B!�騒QZ�j��ʡC��3g��������9r�Fr�޽{���	x�̰p�B@||�:���(�©S����8{�,G� ''��S�����h�K�I�������>��ڵ��>}z�����3g�РA��5l�P���x:Ĉ#L���(��C≺q�k֬�СCܿ�ƍ3j�(�����e�.Qߴ�2U��$垜-_�01�L!�ew��]�T�b�H�B�[�Q<�/_����կ/^��ŋ��ů^�
�+��b�U�*/^���]g���L��7n�`�̙�:uJ�\I�͍��P��S��*�=�[�|<��u��e���5ʼ��kZە�8m�͛7t�(Q-S��\BK�g���{�?~��p��iubJae�vR�JB��ܓSTd�O!����hv��a�0�B���⶙���#B!�1���.:rHI7���|�rN�:E�z��֭�7�U�V2��z���P��S�QS��/�>��re�K��9�Eۭz��٢Z&}B!�B<�����|�2NNN|�駴hт'N0o�<�_��Q����M[)S%
!J�ĒS��v-�����"�B��W_}���޽�EU�{�"^���F�
��n5�R�BSL+52/\/)a��ؠ�e��!�!"qd@s�� �4E��S�R�B�hJq
�9xfm�`��~?�3�3�w����k��������Hӡt				����KzRdgg㧟~ªU�0v�X����ܹs��?�	[[[DFF�4h~��7���F��D"JJJ����H�l���L�X,ƀ�����*M�PwU�%����5d�㧟~�{�V6�Sk�o���	���QYY	�e���B""""u4�8�T{sU��*%%��i.eU�lmm�q�F���;r}�:�$�J$��tXr
Qw��SOi:�.C�'����:�,)a�رJ?7����8��� ((O=�BCC�!C���/�lv�iӦ!&&�ň#�������`gg����uΝ;�3f���[�nګ��`ll---H�R�����¢�㨪�x�SG��^z	���

�֭[1n�8��?l��9r$���QRR���RRR"�!�
5�;������BRۤI�xMBD�
�s���#���*�m봓�*��Z��$�t�씔$&&�…�����Q�0}�t̛7O���DDDDݟ��\\\4=��INY�lN�8���\���+r��|��������ӧ���777�e:::X�n��������D``�¶.]�{{{0pvv�H$BRR�Z�J�x�SG/777�<y���X�j��|֬Y�,��)HMME~~��5�ߵ�S�����h���HMM�Ч�[3��?����0>|R��-���5&L���q�V�oʦ��,��BT6ea[���T�DԒ'"9�+�`������gϞ�k���Enn.�b1���؉Ѷ^X����

�tDԌ��xM�@��'�\�pA�sC&&&���FXXΝ;����c������ċ/���X��طoRRRp��-������^^^>|������Ç����G�aĈpssÕ+W�Ç���6l��={P^^���:��Q��񴧎8^}��Edd$v�ލ�'O��ݻx������7e֬Yصk��Ұt�R�eiii000�̙3��u1���]n�{��aӦMX�`�0]���36n܈�����vf�DD�ڐ!Cp��e�?�>���~��y��m�.�S%QK��䔮x���g����o��пܼyG�����c߾}��?���Q�/,����z���R$$$�7��t(D�HBB��C �4���r�����f����!((��>�=�ddd���4�
CC�&�iX����	NNN����bW5���W�.e}�x���>�������n�7����pqqATT���`nn(++CNNV�^
==�f�M]�&�V'�DGG�֭[X�x�жd�:t�����`tDD��̙3q��el߾۶mèQ�p��El߾]��:�%*���S%QK4���$_���#--
��ƈ����������o��6������p�ݻW�Ѷ/^XuO��@�������U�a�8z�($	|}}�"�Ha� "uܼy������@MM
�
��K�bΜ9r�����S�N�Ν;8p �O��U�V���@�'����;w"77���Ì3�v�Z���zDFF���q����+++̛7��ϗ�V�������Hlذ��ֈ��h򞾲�����������'��7<x0���www��� "zB�����o��իW����l_u�KT6m%�J$��(N��E���b��ݘ;w.&O��W_}���B�S�q�;;;��g���[�����O�$W�Y����~�������%�;y�$������I�&�W^AHHjkk�ƹy�&>��̘1�&M��ŋ�bij줤$�����	vC�-�[o�%�ǿ�6j��Ծ5�Ϫ��(**���7�L��_|۷oǽ{���oU.,����""""""""������͛7#117n��7����͛7CGGG��Q7UQQ!$>���x��!���(�#����X���͛7���C���#66+W�T�/
�W�FVV�߿���J|��عs��<,,���Cii)<x���Z������7$�J��ܹ���M��n�~+��wߡ��V�d����������Պ���������uuu��s�⩧�B�޽amm��[����+�M�����Hmmm���111rUO6l�ssshkk�%Κ5zzzHKKS��S%�E�S����������x��nܸ�X��kע�����SSS|��G(//���#88����oq��'�{���ᅬ��l���qqq�k�	v^^�����>���X�bE�}�ݷ��U=�
�t�/,����������z�g��퍐����`͚5
O��c����}�6lllp���9s���@,�8���b���C,�ܹs������������C��ȑ#������)))��#G�v�ލs���̙3�4Y� _�D����������l�nj쌌��ѣ�+k��!""�#00��=233���~0p�@���������?�ԩS		�����999�믿�?�����J���AYY��W6U����J$z�u�䔃���cǎEll,~�����c„	���Bbb"����nٲw��E`` ������ݻؼy3����>�>t��lj/8{�,>��S���k�	��;w@����4u�и]���Ps?�� ""����O?�СC5u����6�/��ܫqߦ>�VJJ
֭['''���c���8x�`�*vV쭡�������񁏏��"""������?���%K�h:j����:�&==��{���ha�f IDATzzz@vv6���K���j@@ƍ�>}�`����×�N�Rض��/,,,Я_?a����*a���?�D���x���X�`������U���M���oed��ʮņ
&ׇ��Z���������9���P__�+W�`˖- $��<X�J�J$"�ޝ5PS'��۳��q��	@PP���<N�ؼy3�ϟ���da^̉'����+V�@^^�,Y�g�}V���`�9sR�/^ıc��믿��𸼢L�l���C@@@�cjkk�ѣGJ+����.��s�ed?����b��ŏ2�� ""������֯_����N/��^jkk��燳g�ʵ���"77b����ptt�L�]��?����0>|R��-���5&L���Ј���	q��u��A����Ǐ�k�}a(�NCVVV�{###��߼v�Zlٲ�������޽{�|�r����<U�잭�T�oe***<~0�1Y��QO�Qɒ��٘3g>��s����U��uL�T��.������

�T�D�y�)�(--̝;W��"��k֬�?����<XZZ����c5>��}�6֭[��/*�J����`����ڵk�q�,--���J��{�.�޾LS���=�@�?��‚�������:�<�z����vۖ*	.���g����o��пܼyG�����c߾}��?�Ѯcw���æM��`��D"���36n܈�����j8B"""�h�Ͽd_�ufr���V��o�~k�>}����	�&M��ӧ��_�����f�����-��T��T*�YWW���-�-[�W/Ţﲶ�W"�'��a�cǎ�ʕ+���àA�0y�d�\�����>fép�D"tZr�:
�@�iX����`��G�x�"��^xVVV3f.\(ׯ-'��ƍõk�p���&�S.\��e˖a̘1�������������.���x�t�/,����;�wC�V4q��I������4#&&F�F����~�m���!<<���ػw��Ռ��hܺu�/ږ,Y�C�!::����������
�o�����"���4����W�^ENN�{�9�=''�d[ua�ܹ�;w.


p��I�߿;w�T)9�1---��*�=ب�~+cbb���rTVV���DnYee�Ї��'��{)�z����\\\:le41&u}]�r�H$BII	���T:�޳g�p�[PP���0����j���L�X,ƀ������w��m:��={6���!�H0g��-���GDD�R)^~�e!1EՓu�{�[�DDD����i���y�&��Ñ�����6K�.Ŝ9s�>����Hlذ��ֈ���x���(�8q���;�ٳgc�ʕ
��'O�DBB.]�����c�ptt���7������6N�Qgu������IIIww�&�pZ�h�R)F�%��ұQGmm-�oߎ��T������[o��pN�ꘪ��(�k�.$&&b�ܹX�v-�����'�������qqqpwwWZё�������b�H^BB��C 988 ..!!!

�SO=���P���cȐ!���/������APP�m�&��޾};`�ԩj�=o�<������s���#��o�P|�P*����T�ƽ)@EE���+����q���췲�G����r���(�W���}��������)ӦMCLL���#F��?�����g����N�I��?"66&L@DD���q��!L�:'N��	�̹s�0c�c�֭B{UU����t�=y�d���⧟~���'�~�mL�<:::��_�駟"33X�`�0��'�y�U�"""��*++��X;������n߾-�!00�=«��*��Ν��������兂��ύ7 �������0��޽{%����r��š��J�ܾ1u�ioꌝ����M�����cŊrmm96� --
��D����
?��#$��L������7$	ƌ#̓��wߡ�����
���푕���Ǐ��ia"�_}����+M�AD�f˖-É'����W^yEnٛo�)����S�PZZ��˗����PhS�������p���
�{�����DB"�2���8r�v�څ]�v��s.U�[��HMME~~�����Z��CDDDD��1wV����Æ
Cnn.�����s�a֬Y��Ϡ���u������y�f���a�֭�ݻ��>@uu5P������)������=�����/��/]���	����p�=e����P<�V6vpp0���p��u���cڴi�<y2<<<p��YL�6
;v쐛�Fۮ]�0u�T,\�O=���Ƿ1U��:�����"�!^XQWԻw����v��ߏ۷o���G���3g��k�x\��1KKKddd�DAAƎ���X������DŽ	������Da�C���������g���O?!��a����l�:�4dgg��uƾs����\�1T96�(,,�޽{q��9��b�������}���c��;<Nb�H$�����ݻ�*,�ѣG+�#k��!��G*���_*�H=
�:���	������CCC����G�Ǝ;��"::.���)���ajj�%K� &&FFFj�����@�5
}��E߾}aeeOOOlٲE�a����C[[��)�`ݺuX�`��}�����6mj�~+{֬Y���Sz~���̜9S��ADDDD������]@,c߾}HII��[����[[[xyya���'xܼy[�l������s����>@pp0>��Clذ{��Ayyy�'��>|���4<z�#F�����\����H>|����	vXXΝ;����c������ċ/�(l������q������Ǖ+W����I�&��_dz�>�ۺu�ЫW/�8q��݃��6mڄٳg�u�[{�աl�g͚�]�v!--
K�.���"""�j�ݻ}}}M��e5�|Ѹ=;;����k˪�   @�6���䦱9q� ((H8ﷴ���͛1�|$''c����3g�@*���ŋ8v�~��W�������f�I�qڛ:ckkk�ѣG���Wk��e�j��ƍC@@���������zK�1�ٹs'bccadd�={��}aSXX:t��zÆ
��CD]�…5Q�!{P��6333�د�����o�������}�ܹ�;wn��srr����Jc������~~~-�We������DEE���LH�.++CNNV�^��W��K���Ń4Q��e522���|||������?Th�����/��9�644l�YV&Z��'�2������;��ݛ݆��'��\�Ȩr���6/,��������Q[[��0z��ׯP}
GY�Lii)4yc���Hx��m�[�/^T������P{<���ئ���v�nܸKKK���R)�޽+L����(�8i����k׮�=���#���W��?�MXVQQ��]c�6Y"�zo��#!�d�N�z*=z�DH֑H$�Dpss�ptDD��{�9&��o����u�.��B=/,��������V��6=�8!C���,Q��T��hX5h9q�a��>�/^Đ!C��/���
cƌQ�I|u�io�=n�8\�v
gϞm29�…X�lƌ���(hkk���(��*�mmm�M�1�qqq��#Gp��}DDD`�Ν
���Kq[Y���Q�H$pqq�tD]Vll,\]]5F���t����)�z]]]l޼���`gbb"BCC�����興���;x�w4Q����T�� """z�4������`cc���"�%%%HJJ�H$j�off&@,c�����ba�Çѻ��� u�io�={�l$''C"�`Μ9066�[^__���H�R����B�H[��2.\��O?-|���_��!C�6U�T�w���Dhh(Μ9���a=������&&&r�UVV
}������z�g��퍐���5k`kk�ᨈ��suu*|Q�Ƈ%:�S���‚���������8��� ((O=�BCC�!C���/�lv�iӦ!&&�ň#�������`gg����uΝ;�3f���[�nګ��`ll---H�R���
�:[3N{Qg�ɓ'���?��<==��oc������/���O?����ppp���j�بj۶mغu+F����\a��3f�=fk~G\]]������"�ݻ�w��xj���r���($����}����V8��\\\��u}��D"�tD���.L�cr
i/,�����˖-É'����W^yEnٛo�����8}�4rss������u�ώ��HNNF`` �u��%���c��������3D"�������;vpp0�z�-\�|���
ۛ6m�m�&7}���FU666���k9r��4��ٚ�mmm���cŊ8w�Ο?������������WH����L�:U�$"�n
5��������BE�I�&��/�(o���x�
M�ADԥ)N�MDDDDD�����&�:511Att4���`hh�>}�`���رc�̙��
 �����Hmmm���111r_����{prr���.���1c�`���X�j�����
6�����ڨ��S{��������8p��}�]�3zzz���Nj/����p����´��U���c֬Y�۷/����h�"DFF�_�~j���ߑq����^�ݻ0k�,���!--M�ZZ0s�L������X�~�\�`W��FXX�{�=lذ�w�FNNN'GHDDDDDD���)DDDDD������l��J����>>>�n��а�qd	���''�V��R�-�U��:c@�~����www���zlZ���g�T>mh���\�}}}��� **
eee077���!''�W����^��uW���]n�{��aӦMX�`D"���7nDBBtuu;3L""""j��GD���""""""�Q<<<p��QH$���$	D"�´ID�=���P/Q�4#::�n���ŋ��%K��СC�����������_|��4Q��~�z���*=�U�;|�0�R)-ZkkkL�0A�QW�a�)�O�����Q�qtt���C��!��������͛���
�e�0��:n޼���pddd���Æ
�ҥK� ���Fdd$N�:�;w�`��>}:V�Z��,�&..;w�Dnn.���3f`�ڵBU���zDFF���q����+++̛7��ϗ�V�������Hlذ��ֈ��h2�GY{K������Ո���ĉajj*�<x0���www��� j���o��� �n�;�Z�󈨵:,9���DDDDԝUVV���^�aQ+=��3�FHH`͚5����pTDԝUTT����o�ڊ���G���W_���`Ŋ(..����#66YYY��
Ӌ�^���������/�@}}=aaa8p�������C^^�޽WW��߹s'����D�s�����P[[{{{�e�����������믫QCS�L��)S4Q�zz�?V�#���j�
���@*���_|Q�=z�ZZZ�������1>��c,Y�D��Q7��~ܾ}6668r�Μ9��^{
 ��~@qq1���!�q��9DEE���EEE���Q�СCq��ddd`������a��#G�w�ƹs�p�����>@�K���l�/=,--�����[���~75vFF`���
ە���Vll,�����/�Z�"�����gggL�<�?�<�-[����J�omm-v�ލ�s�b���x��W���:�O�y�ϪT̫���=%���+����#44��7KDj����tDDD�^]]���4A�&xs��jzz:�ރ��   @�n"#K*	��q��Ǐ���?�~�m�:uJ�Q___a�����Ũ�����顦�����pttĂ�`���wssC߾}��k�[���B��o6l�\���0"RWll��/�zU+������B�7n@,#??aaa�ի���GD�h����R$$$p�>"
HHH�tDDD=ƽ{�4u!ׯ_�9��~eee'�4���O�m�!+++�,9���k׮Ŗ-[������L�ݻ˗/���tttT�_��.U�[���
�����2Y��Q[�~4��LN��a>;;;<x������Ç�䔃���cǎ���?���PRR��� dee!11���Gvv���T�����'[�'��0S�����ƪ4�4�FOOO�!+�(�!���Z��a�Ic}��iv'''L�4	�O���_����#<<Ě5kT���T��T*�ٰd{s�J����lem�N����z��P�O�
|'N������i!7oތ���#99���orV�#"UtXr
QwVYY)�Eѓ�_ѓnРA���PTT�&������ի���s�='����D"Q��722�ܹs1w�\��ɓؿ?v��٪'P��� �Jq��]�������ʘ��������011�[VYY)�!"�6Y�(>>����I�&a�…�u!�V�+--̝;W�v��'6ĊyD�
&�5�wo�.O�2�U���888 ..!!!

�SO=���P���cȐ!���/������APP�m�`�����S��=��y�PVV???̙3#F��o��@��T*Eii),,,���PQQ����
���:nܸ����Vﷲ�G����r���($����}�H=�ׯGjj��'���g������ÐJ�X�h���1a�
DJD�d�
�T��'�J��NMMM��Y1��T���mo.����/�����`dd�o��Vi�SM������K12#����z�;w��ѣG�C�,,,Z�r����I�l�2�8q���x�W䖽���{�:u
���X�|�\?�6Uxxx ((���
	$����{Y‰��3D"����ܦ��#�9�]�va׮]{{{�~��������|�8 ??@�u��t���J��ݻ�M�6a��B�&ggglܸ			�����0����P��H$BII	���ZU��H��k=���������ӧO���
PUU�ӧOwRdm��~uYF�{g
6`���B�Z"""��H[[[i�2i^vvv�?4dbb���h899���}���ѣ�c�̙3G�ghh���h,\������ֆ��)�,Y����=���31j�(���}�����<==�e��߆
`nnmmm���5��u��a���߿?���{{{lڴ���l�Y�fAOOiii
�MKK���f��� j
;;;ၾ�*::�n���ŋ��%K��֭[����`dDD�)��̓��>��s���bĈ��� _�oڴi���\�t	�=;w��'����^^^B_Y�T@���ɪ�5ĊyD$�DUNi*�\�믿���+��o���''��M-�o���_��DDDD=K�)233CPPP�����___���6ۯ�e�]����p/��1tuu���??���������ׇ�����PVVsss@YYrrr�z�j���5�]�����

Ezz:�ݻ+++,]���������"**
'N�����b���X�r��8�0��a����j���a�ĉ055�<vvv������;

;c�����P����'N�>���\��������u�Ϭ�GD����MO��Xyy9~��G0�>��ӑ����7obРA��Kk*#�СC��������#""""uL�2�������z=z�DH֑H$�D
_|�4w���ʕ+q��5��ҥKBbJCuuu���BAA��v��
��b���#,,�z5]���Cmm�����푕���Ǐ�7Q���w�����ݻ7���Q\\��t IDAT2d�N�
�����b1��ۇ��ܺu����������.�ݰa��ك��r��y�v�BZZ�.]*+��L����Y�2��������ٳ�����^z	qqqHLL��?�=⭮�Fdd$N�:�;w�`��>}:V�Z�8###�a�X[[#""B.���������8}�4ttt��K/a͚5�ׯ��:���عs'������.���*++�c��9s}����?___����Œ|"""����������U:jʎ��pUw����͛7��w߅��;���BCC������:�D"��k�`ff����=z4���q�FܺuK��QPP��c����VVV())APP������������n��)##0z�h�8dmLN!"z�R��������f��b�Vө�$�(ONNFUU<x�bF����q��u<x�@�(_�v-���[O*��o���� ��NJJ�T*m�xkjj�b�
:t7o��ÇQ^^���X�\����
��ܹ���r�����Crr2jkkQQQ���X|��'
�>��#��ǣ��UUUطo������Ǐ���Q]]��G�"$$DX������Z?~\���������gx�g��퍐����`͚5
�މڛ���ܫ��������q�ЧO���b�ƍ
}O�8

���5���aii�͛7�������0t�P�eÆ
��CDD�<<<0x�`H$��󈨡.Y9�33������amm�#F���amm�_~���٘8qb��{����۶m��ѣQPP�M�6���111
��XZZB,U`jn��?�@||<D"��ك��8���(�y����C�a�С8p�"""kkk|��<x0��ߏ��H�9sFX��DDDDDDD�U��I����M�AԩJJJO?��\�����Rh�����fǪ����em�>DDԵ����GD-��)�d�wfF9�#�)2���|���ͮ�N���?^��r��)�u��ܔ&���_��,--���+LOt���~~~~1b���+�(�믿��C��_�~�$����z��'""""""""��&;;[��R{Gj\�[KK��>����4�\��^�o��ڔ�KDDԞX1����%+�tfFyuu�������?V蓒�����9޲�2������e�^�~]aY�Gk>\x߿P:��ȑ#��
�|�������*�nj|"""����0q�D���O����t8DDDDD�

2�/_������
��ϟW�+�PRR���$�D"��211Ayy9*++abb"�L��a�v""�zZ�?V�#��tZ��d�wFF���~����f����_���o��,u2ѕ%�ȴ�j�:���Oi��L����ODDD=�_��޽�d.7u3g�l߾���x��!���}�v��ӦM��K����#ܹs�|�	������%��o�=�	���Cك�
��>�HDDDD�ٺ����(�M�
{{{��gϞ�;#��D,X���񚙙��ի���s�='�����ӝ0#����z"Y�3��%""�|���puu�tDDm���o��W�^���g�}===q��i������Mn���֭['|0`***����H���$888 55���
����S�Nm�#""""j�.��2s�L\�|۷oǶm�0j�(\�x�Ɍ����#F��������>���"""<�(�J�(--���~��W\�x���1y�d��L�<C�EAA~��W�1�M�:::"&&AAAضmlllPPP �m�B��L#G�Dyy9JJJ�P��ODDD�գG��Qg����tD�Cib�]]]DFF",,gΜAMM
,--����@�����طoRRRp��-������^^^rӷoذ{��Ayy�P|֬Yصk��Ұt�R�8���``` Tr!""""҄.���Y�/��`���M~񠥥�ŋcǎHLL�������N�:���R,_�\n����B�*�e�wf�QO$��kdd��H������;366F``�\ۍ7�k722���|||�ݦ����������₨�(������PVV����^�zzzm�""jBBB�ϟ��0���4�%�4����w��űc�`dd��_~��X_y�����رcx�w����!����駟���Ӹs�LLL��/��7�l� �2�;3򉈈�'�wC ""z"-\�P�!uR�T�!P��y������NNN000@II	v��x���u<=z�����D�H��`'���\���]�r
�y����EJJ��YYb�:�������BS�J�iܮl�T]W�~M�3#����z2��u>�DM�A�e������U�a�vvv����l̙3��9���,�|��X�jU������͛7��w߅��; 11������iױ���?$	$��� "��zi:e��y������?GUU���q��lٲ@�g��Uw���yxx`��r��2#��������J@�>}4	uW�������ѣ����^�zA$����DxЯ==��3�FHHBBB�f���؉����4�KVN����n�7f�QO����_]�aQkn����ի\\\:��&�$"z�$$$`�������[��)��������c�p�����aРA�<y2V�\	SSSM�(����f�`F>u{����tDDDԁdSyt���_XX��#G6ۧ���� 11.\@MM
F���ӧc޼y044�q_z�%ܾ}�|�
,���������G�bРAr}���0o�<��oñcǚG���Z������L�4	.l�6����kz����'"RS�LN�TFyku�x;
�Q�_����K�������Ξ=+מ�����\��b��ѱCƷ����3gPPP�������۷/��ꐑ�!��.\����:�?��3���p��aH�R,Z���֘0aB��KDDD]�D"�D"�tDD�N/M@DDDDDDDD���ΖK�HMM�`4@@@Ξ=SSS|�8~�8~��$&&���555x�������!�3PPP��L�����*��!�z-%�t�q�w�6mڄ@$������ظq#�ݻ����]�r
QS4=%OO������4#&&Fn�j333�������Cxx8��ñw��v�A�T�89���?��3���l�2>|YYY���C߾}�~�&�t���hܺu�/ږ,Y�C�!::��ޝӓ(!!A�!Q7ÿDDD���)DDDDDDDDԣ�<y			�t��߿�����������kr�۷o#44���w�����t�R����O����Fdd$N�:�;w�`��>}:V�Z��,�&226l���5"""�ld��o8Vmm-���q��i���ॗ^š5kЯ_?�u233�s�N|��7�ݻ7.\///TVVbǎ8s�����������$%%����SZ�h�R)F��������;w"77���Ì3�v�Z���
I%/^��~VV<x�)S�@OO�&M©S����
{{{@}}=.]��?�)m=����‰'��c��={6V�\)�S]]���8L�8Q��
<vvv������;

�Wj?.�tDDDDDԌKN����M)�w�^DEEɵ���#..UUUغu���޽��+W�ڵkBۥK��Ĕ�jjj�b�
ˍ���,��b�$��;w����������ٳ'M�����Ç���G�ȑ#��}�����			Be������ѣ�ի>����qpph2}}}�X�B�M�c�z�jTVV
q|�����G@@���sss�����~Ð!Cr�M�2�N�Bzz���r��U�����������5ǽ��^^^rU\nܸ�X���|����W�dz���w���bi���YYY8~�8^�u��'�������E�au	���ظq#>����"""Mk��)S� >>��7KDDDDDDDDԢC�x���ꫯBKKyyyX�z5��Қ\O"��ڵk033ÿ��o�=yyyظq#nݺ%���(..���9�mۆѣG����6mBQQbbb�r����X,���!Ӱ�����������C$aϞ=���CJJ�BrJ~~>:��C�����@pp0�����_`��ؿ?"##q��a�;w���͛;�
�=�C���͛1h� DEEA,#%%�1cƠ��M&�888@KK����77�Ok����QPP��c����VVV())APP������������7z�h����222��ҁ�����0���wZ�S�����_F~~>V�\��"�rzi:""""�����ӧO�tDDD�����^͵�9s?��#lllp��1|��'رc��O������q�ЧO���b�ƍ*�?~�Pe�ԩS
븹�)M�Pſ��/XZZBWWo��&��$�4���#F�o߾B%�������:t(���www*����6����C�c������������*a�,�C�l��/��֭[������7���	F���ׯ�ʕ+r��%��渟8qkkkhkk����7o$''}<N�ilذar}�c���"!!A�aQ7������cܽ{�g�ƅ��+=/""Ҵv�����.\\�fH�RM�@DDԭ���������Z���X�n.^������咒��O?-�nkk�з��0~�x�vٺׯ_WXG���Ç�˞�U�H2r�H�}�i���������
뙚��ڵk�q�,--�� �Jq��]m��q)�ǘ1c�'�$==��J�
M�2/^Dzz:�����…r�7Ԛ�^ZZ
�;w���EEE���
����B?Y��u,V> "u����,�jjj0g�\�t	'O��?��M�DD�T�'����q��Ǔi""��ӯ_?M�@DDD���T7�M���G��ŋ2d^x�XYYa̘1X�p�Jc5������r��Uim�u�m�W��'�7׮]�ٳg�LN�p��-[�1c� **
���j�>}���Q�F�W�^�t����)s�%������ӱd�������R:�Nk�{K�5V��퇲c,kS�w����H��՘3g~�����(M�%"�*:,9���������������� ""�V�����b0P\\,,��!z�V�%6d�\�|�ϟdz�>+��?^�����^����<��sB{NN@$���t�ٳg#99�s�́�����zDDD@*���_�j�n����
���b��� //FFF;v�\?#''999���ða��Ŵ�H$BII	���Z�Y���������011�[&�:�q;Q{���œ9sPTT���N�CD]^�M=�=z�������Ν;���:\�t	7nګ�����9s&`�������Ç�����۷+�utt!77>Dnn��w�ԩj�+��!�R�3M�<�����������Ǐ���<���v�Zdff��,PX_�c�ٗ*QQQ�������BU---����ѣG��r�K�q�6m   �.]£G�p��|��'��������W6��lZ��dm
�[�'Kaaa�����0}�t���a��騫�����jS�ѯ=bi��T<������G������x������H�����u4M��P||<|||���é������J̞=�/_fb
uO\���B���J����*�e[�/<�2i�$�K�=�<x����k:"""jGGG$''#00���
�/]�{{{�vWWW|��z�*<==�����N�Bii)�/_.����B�M@EE���!������6�"88o��._���ӦMöm�䦨i�n���
���������L��o��YYY�z���{zz������ͅ���\�[�N������T������V�o~~>��%+Q��~�z���6y�����BBDUUN�>
''�����/���7��ݻw����:���III������)��~I�c7���?#,,���w�q=��oʩT�7�-�r܁e!�0����4{okM��mi��X�r�^唜و���F��aF�0D�~����^�^^�^�~�\�\�|<����,���?���;v,������+�K�$1e�С\�z�#G�СCC�$���\UN��������sӯ�z���2�|V�\���B!�ڲ��
�B!����X�C�w�}'''LLL�]�6�;wfɒ%L�>���p�ۙ�����3
4�f͚��ڲx�bj׮��577'88www�4i���1M�4aܸq�_���i����h�cc�J��P��
�q�F�y�:w�)���c��^��/��Rk�ò���t��Y���Ȩ�䖞={jLT��]���̌�� <==������������5^@2d������h�;&&333�*�x�=z��;w�`ĈDEEUzL�)�����K�Weųl�2�ݻG�=

%>>��Ǐ���ҡCnܸ��U���%]��dȾ��߿χ~���VVV4o�WWW>���߿o��x�������DJJ�$�!�:�U����:��oU
�"e�e�LLL�$!�B������B�����9���:ש�&@����
jU�q��7�X^�~}|||���)6���^���U5��ۖ�]I��ԩÄ	�0a�����\��s�Υ�offf�T	.�u-�u�,,,��,�S�^=<==Y�n����h����TN�>͌3055-�pD��J��IKK��ɓXZZ��{�q��q���?iڴ���{&%%%��g�ѠAj֬I׮]���Օ�Ǐ2�j%88��7o���,7naaa3k�,F'����ݻ<�7np��lmm
�B��`�S�bKQ� ��͛02!�B��k��ݬ]���a!��
988`gg�֭[��� //�����?���]�8BQ]y{{ӬY3BBB�e!!!XYYiM$����<֮]���+�z����ɓ'��6;;��+W���L�^�9r$�W�֨xT𾷮��QQQ���1l�0LLL:t(yyy:����?u����̜9SY����G1h� z�쉇�{���y����,\����X�|9999Z����н{w\]]u�gԨQt�ޝk׮��|�Ei���wÆ
�u��:kkk9|��ҷ�8��EŪkyI׬��K꣸ߗҞ���LT*ݻwW�9h֬vvv�T*233�bBT�����A����&�)B��V���r��-V�X���ǹ�>m۶e�ĉʜ�3ܳ��Y�n�⯿��q��6��S�*%W�
�4
o���G`` �ƍԪU��m�2j�(\\\����?�T*�/_NRRu��aРA̙3G���Ҟ��"'L�����^�A!��yP�L�B!�}Çg�֭�����R������h�"�y���LTT+V�К
ITO�V�b�ƍ�Ϲ���={��g�r��=e��2s�L�����7n� ((�s�αj�*���4??�ݻw0r�H���Q�T�ڵ��S�R�F
��/_Nff�r��Ν;x{{k$[\�t����ce�j������O�����#��O������q��I���x饗�uIII���ңGZ�lY!磬��{�ԩ|��gL�>�ѣGӧO�t�B�Z����(-}�Yy�Q��u����uN�fooOBB�7ި�x�Żs��毿�"::��m�:$!�(�UN)ν{��:u*{��%##���\~��W%�� ��jÆ
\�~���\eP5g����*-�U�V��wߑ��Bnn.��ٜ={�O?�T�M	}̘1���<x@zz:۶mc����z}�MI����l<X�8�B!�B!
:w�|�=z� 77������LJy��ѱcG�֭���VVV����L�"�.���*�f�b�ҥ,]����~�nݺ:,QJ۷o`<�͞ IDAT�ʕ�8q�cǎ���@xx��n���$''ӥKBCC�������W^!!!A�|R����D��O�<��ױ�����[[[lmm�~�z�/T�iӆ��X/^��
�u��:ub���;v�ѣG�����MDD111J��#G���K�t�g����
nnnz�����=
�C߾G����?lذ�iӦѯ_?�z�-"""4��w�@�Z�Vi�YI}�V��9_���t��Qk��e�6B��w��m
ĭ[�$1E�ԫ��)!!!���4oޜ�� N�8A``��L�@PV��Тo��Z�b������2e�@�C�>�F�B!�B!��L�.]��>�K�.���lܸ��}����m���fdd���'�6m���$$$�k�.,X��������ɲe�X�l�ƍ3t8Ͻ�t-755��{�������͍��D�������[[[���iӦ
�-(rJ���+\%cԨQ�ܹS�v�ǏW��?~�w�}kkkLMM���#11�;vhm����ӦMLLL�6m�䁧.����aÆ:tHI6|����I�&888T�(������Ddd$�6m�_��vvv�;w�/��OOO���R�]�Z���׬<
Ǩ�:�<��YEa�[��h#��\�n�bРAܹs���hڴic萄�\��VyQ�υ�'&&*�~~~J�nݺ�0{�l��U͛7PU...�ݻW�b��������EHH�/_������)��e��ヵ�5^^^��������� R!�B!��?� <<���pN�<I�&Mpssc�ڵ���W�BQY�̙��L||<���Y��)S����15SJJ
�d].]�Tl?���>|@Id*�ȑ#deeaff��\}?W���o߾�����k�N��~��EV�Y�&�F�"88������#==��ӧcll��|Tċ��;v�cǎL�4���~�z���/��/J��(-}�Yy�Q��u����͵ک���!*�_���IOO'::���!DuR-�\�z��]�j,�U
�ࠪ`ƻ:!���1g��ԩC||<_}�cǎ%((��y��qYXX��972�B!�B!DE�믿X�f
����U�V|�駼��8p��ׯ����>}�Hb���PW�.\�Z�r'''����…y��y���W�f���l۶M�6??��>����]��~��ct���a���Z�W�Q�F��)i���=###v��
<��add��"hy�Gy��w߾}�����͛Z�j׮���7���껨sY0&]�Y�kV�>�
Ǩ�Rǩ�t���8!D���/HFF�$�!�)UV9�p6��bJqY҅L�<�;99ѳgO���ٹs'gΜa���l޼���~[��S�j�R�/n�W�s#�H!�B!�B�Uzz:;v�@�R��?P�NF�Ɏ;2du��1t�BQa,,,pvv��ٙ��d~��6l���˕��VVV\�z�]�vaee�w�)}V�X�������8fϞMTTT�չ�6mʵk׸t��:u�;��4oޜ�={˹s�8v����Ә欼�<��cǎ�:u�m۶��[oi�W�Z��5j���Ͻ{���7�^�-�5+mE��|5jԈ��4���iԨ�ƺ��t���rܼyGGG�߿Ott�2ۂB<�,9E-[���~�̙3���k��3g�h�5�J���"�snd)�B!�B}dgg�k�.T*���`�Сlڴ��#GR�^�J���ˋ���J�G��Ֆ-[�3gԨQ���������ñ���ڵk��˄`��������ネ�
w��e���lڴ	;;;֮]�/� %%kkk.^��/���/�@�^�t�ѫW/Z�jErr2/^��ƦȘ{��J�b�ҥ���ӠAV�XADD-[�dǎ�>/o��qqqL�4	@+aF��Q���{ܸq�:u��� ���=z4���<|��S�N)�+
0@���WKKK�ܹCdd$o��7n�   @�]i����K�GE����ۓ���իW���y�bj"!�G��'������M˖-
�BT�jYku��,Y��s�����#Ξ=˒%K�ڪ�~~~���<~��۷o��_cgg�̙3���*!ꩀ�kԨQ��ٱu�V����������]�"���ܨ��cA2�B!�(Z�
*�&�BQ����k�.<==iڴ)^^^ܿ�5k֐��Fdd$U��2f�ƌS��4�������%  z�ꅟ��9���I�hݺ5III�?�=z0d�6m�Dݺu�;w�����WWWF��Ν;���(��u�5����We�(�'O�Q�F$%%1b����CDDӦM+�i�ҷo_�RJ˖-5^���GEӧ�0a����	���{{{���ϼy�HMM�U�V̞=[٦�+N������C߾}qww�A�Z�J{�t�]�>*�|����s��i�G��o߾��[Q:iii0���\ILB<��e�///���ϕ+W���L�4���hePU��w����+++v�ڥ�^=�PaEM=��퍿�?ZY�?��ԯ>�97�{���ѣ�;wN#�A�B!Dq�����Ba(�?���èT*v��Azz:���|��縹�iL�P�����7����+5k�$""�˗/O�1���$�����w�}Ǒ#G�y�&��գ[�n̜9�v��)m�ϟ���_��Ҹw������‚�_��8G���իٷo�F�Da�5"88�U�Vq��	<x@�v�4i,�i)���...��ꪕT���h����;�УG�n���?���۷�Y�&�[�f��7SSS�}�����bc�;w.FFF:t����cggLJ~Ȱa�4ڕ���껴}T�2d������a�ĉ�������Ly�VQ1nܸ���#yyy9r�-Z:$!��5����˳���P���P���eu��V�Zűc���ʢM�6�?��R�vm��┶�T<xP�5hЀE'���?���� U�ss�"�-�/]�.jyi�ͽ{�6l�۷��o����iӸx�"{���t��[e�=
!�ϛ5j�����CB!*L~~>qqq����u�V���O��������� og�?��jBm����%D�[�v-�֭#22RyH������3f�`�ԩ��bȿ'�:�~�:���>|��͛8"!��4�ղr
@Æ
Y�p�Ʋ7nиqc��̛7�y���O'''������5_R;ggg�����𾊊A��Ҟ�z�����ɺu�HMM�D�>}�3fHb�B!Dj׮m��B�
q��)��ˆ�� %%�Ν;����c�bccc�𴸸�H���

%22��a!�a����ٳ���|||		���J�����RSSqtt��ȈÇceee萄�RU���������	333�^���@׮]
���{nd)�B��{��`bbb�H�B��KNN&<<�JŅx�?~<cǎ套^2tx�3fcƌ1tBT[�����"��T&&&,Z��w�y�	&O�ȯX���u�8:!�
�����ԬY�ÇӬY3C�$���Z&�>��[�@@@��:KKK�O�n��O�s#�H!�B�<z���!!�er��T**��3g�ТEƌ�ƍ�ѣ���B!�S��W_e֬Y,]����~�nݺ8*!�
׮]c��ԩS�ÇӴiSC�$�U�Z&����`mm;}�����y��!M�6�W�^L�:�&M�:D�)˹�A�B!D����P�~}G"�B��ƍDDD�R����iذ!cƌ�?��:�g���i߾��u>d�Сddd`aa����uNhgg�~�銦����e�#""����gϞ���WY�B!t�����`W�^e�����r������S-�S���d�S���9�B!�����m��B�bݾ}�m۶�R�8z�(fff����p�B
D�Z��3���7G�-2a#::���222�����ɩ*C,����*���O�Z����p���;v,������+�I!���]�r�P�~}:�?��C�$�U�Z&�!�Ba(�����瓗�g�P�BEff&������s��Aj֬Ɉ#زeÇ��{��ѣG�]�s�NF���ݻ������)��PJ:��v��}>��C��ܰ����Օ>��-[�`bbb��B!*��˗qtt��ҒC�ѸqcC�$�UNj�
!�B��L� ����߿϶m�pss�iӦ���ԨQ��� n޼IDD����eb����2�Lu����ɓ'����ޣA�$$$��:�j/88��7o���,7n7o�$88؀�	!�BT��~�����ӨQ#���{ILB<��r�B!�B!D5�����	'22���l���NJ+puu�aÆ��p��-V�X���ǹ�>m۶e�ĉ,X�Ь���ͺu�8t����7fذaL�:�ڵkh$¨�/����(���6l&&&:�JETTӦM��x333	����ܾ}�ƍ�������133ӊ300����ckk�ڵk5�/鸲��	 ::��u�2t�P�~�m�ԩ��M||<˗/g���ԬYwwwfΜIzz:��9ǎ�V�Z888���C�z��cQ�Tt�ޝ&M�(�6k�;;;T*&L��ܼ�s(D�5�B��…8��M�r��!,--
�BL�%����W֮�Eزe��CB!�B����<�=�J�b۶mܹs�^�z�駟���N�f��S�޽{L�:�?��CY�믿*�=|���3g����,�q�AAA�;w�U�V�XM-??�ݻw0r�H���Q�T�ڵ��S���\�x���x��7�|���,--���P

���Tc��˗������QZ������OUBCCy��>>>���o߮���w�ѢE�l٢���g�����裏8p�������k�mooOBB�7��;v��ӧ�C!��r��y��?�ɁhР��CB���Z���֌3��w+�(�1c��ߟB!�B<��󉏏gΜ9����ё���}�]~��wbcc�={�$��AHH��͛7'((�'N�39c���$''ӥKBCC�������W^!!!���(@��Hbb���'O������bcc���-���\�~]�my�ݸq#�/_�E�J�u��Ѽys.]���뵶iӦ
���,^�Xk]q���ALL�2�Α#G��s��9��ˆ��c�̙`ll̶mۈ��e���;vL�.66��;j�S�L�F!�Ͼ�~�ɠ�רQ��*q���0kkk<(�)BA%TN�ӧ}����
!�B!�B<�Μ9�J�B�Rq��ڷo�������C����*8�Lq���	???^z�%�u��|��ٳ5�:t�7o<I�X�h...�ݻ�bcS'������5�/����;wҽ{�"��'^]m_~�e,X����/>̬Y�4�?~�2=����}ڴi��i�P�Tܾ}[�����������ڵk���a���j�
�	&Hzz������6�n�Z��E9~�8^^^�C����7tpqqa�Ν��HNN��ёv�ڱg��ׯo萄�Z�����P�0 ��=�7!�B!�xV\�p�JExx8��ɴjՊ�c�2n�8^y�C��̹z�*]�v�Xޭ[7��)))��ixt�t�R�}effr��a�-[Ʋe˴�9r���,����ojj*�$!� ��ׯ_��F��Q�ڵS�W?T����j׾}{��
�m�V����Dk�;w�`nn��N�L�F���0!���yV��s�NC�P!~��g���e�޽:�9B���5��S��Jdd���B!�B��^JJ
���q��)�5kƘ1c��޾�ʅ?/
O7���Rܔ9�T�:�%=����*v����y��a�mrrrؿ?nnnŶ+M�Eѕ0�V֪)�l[�N�ˍ���Q\}��ک��ߊB!�gΜa��t�Ё�{���,�ϫJKN3fLe�ZQ���\INB!�i۶m���ɛ�B!���u�V��ˆ����ҒѣG��_п���
�s�e˖���o�9s��^{MY~����VVV\�z�]�vaee�w_�)}V�X�������8fϞMTTT��)��ۼys�\���ӧ�ѣ��������<M5jDZZ���4j�Hc�z���˅BQ}dee�駟Ajj*VVVxyy��R�n]�ɔaaalܸ�	&(۪+׌3�-[�(�Չ��2���vIII̛7���8LLL3fK�.�^�zJ۴�4,X@TT�����Օo��F����X�h���\�r�ڵkӥK�|�M�N������<�.]��g��jrB!����!�B!�F999�A!�S��fǎ�T*>���	�F����''�rU�e3x�`~��7�,Y�'�|B���_X�d�V��~�z�������Ɔ�w�y�f6mڄ��k׮�<����'%%kkk.^��/���/�@�^�t�ҫW/Z�jErr2/^��Ʀ\��ߟ�������'�|B�N�HNNV���W��U���R���IKK��իZI(��
N$�����å��T�6����W�8�:�<|���C���������ﯔ��K{��w�4׫�1���(���гgO���+���0@���ի��������022b������������kkkRRR�5k-Z��o��HN)K
0�۷o����ڵky��1���ܽ{�޽{s��ee���P222�������/�T~~��!�����Ǔ����y�8u���W^a׮]��"�E(���3��?��ٕ�"T侊S��6̛7�y����PB!��ryyyRvU!D�������+++�~�m���

��͛l޼�#FHb��xyyѺuk�]�ƤI��ٳ'�'O�ڵkZm'M�D�֭IJJb�����у!C��i�&�֭�ܹs��������2r�Hv��	���G�S�ԨQ�UV����7��֤��2e�z��ɔ)S�~�:���L�2E���㸪R�޽8w��:���$�Q��������a�
�<���� ::ڰ=�*��⧟~bժU���̟?��+W*U�D�Y�l�����у�~����\~��g�����OPP
4`Æ
ddd0q�D?~���7�_�KKK�����ϥ����s��������`ǎ��K�r��eڵkǏ?�HNNG�%))Ik_ꄖ������Cff&�W�`�ʕ�����4hvvv��"�%x��S��O�1� R!�����)�.!�В��Cdd$�ƍ�iӦx{{���K`` iiil߾wwwLLL�s!11�ȷ�MLL��ٙ
P�fMlmmY�x1�FҐ��AAAxzzbee���1J���ovϟ?�-Z`ll̽{�طo������:b����ٷo������ܜ��`���iҤ	���4i҄q�Ʊ~�z,,,Ju�Ç�޾<����)111Z�bbb033c��U���ѣ��ZR���뫺R'#�1(:ٰ�T�*�z�%�����>~�!nnnXYYѼys\]]����~��'�G�rqXX���
5k֤S�N�_��͛7+m�;w.G��O�>DGG3{�l
Ta}��\�LLL�D�;w�(�###��ox�ר]�6�Y�Fk_ꗗ�/_ΪU��y�&o���������$$$0h� ^{�5"##%1E!J�\M�k�Sxe貉�4�)<��A�-[��B!����.��ѣG����T*v��Aff&}��eٲe���ѸqcC�(�аaC.\���ƍZ����B��Z'''������Ą#G�(?��O��������b�-��V�庎��ۖ�]Q��ի���'�֭#55�-Z�����ӧ�1c�<��i��+#--��'Obii�{�����IHH��?��iӦ�O���ܼyS�T0n�8���f֬Y���v��Eڴi�s�ٳg5~����СC���өS'*��.]�(�7l�xR%W�ҥKZ�2:88h�k�ҥL�2��r��A>��C����3gIII:{{{�o�Nݺu��� IDATK<!�x��rJUMq#�E
"o޼Ipp�#B!���޽{�+�ϱ��<�;ƬY�h޼9C�%99��>��������9s�$�Tc��ٱu�V222�������?�k׮�P��oE�Y�f���(�BBB���b����L<O���X�v-������&O���]_Pvv6+W���ٙ^�z1r�HV�^�Qy��}^�>�~��fΜI����ٳ'#F�`�ҥdggk��}�6�/f�����h�ѷ���:u
GGGfΜY��-n?���,[���_]9��˗����s�=�/����GGG֮]@zz:,�O�>0��>��{��i�E^^Æ
��Ą�C������zJqq���|��G4��={���޽{uvv6.��'''�/_NNN�V?)))t��WWW��5jݻwW����H_�.]�ĬY��ӧdɒ%J����.
�7///��뇋��FB@JJ
vvv�5
x�R��޽;M�4Q�5k�;;;T*����>>�[��SXzzz�늚�"�(�‘�~�S�J�V�ZZm=<<HMM%((�޽{+S5k�GGG���Cdd�$�!D)U��)�n�bŊ?~����Ӷm[&N�Ȃ����l֭[ǡC��믿hܸ1Æ
c�ԩ�B�>��Q?��[�l��_�4nܘ���3k�,�-���?>���ʀWu{�J����IJJ�N�:4�9s�(F�����ܸq�Z�jѶm[F����K�ǨO�%�OӫW�&66���,Z�n�ĉ>|�����@��&L��ܼ��K!��,=zd��B@BB*��-[�����/2g�<<<�|SSTOÇg�֭h��kii����
�nO[���ĄE���;�0a�����+VȃQeV�Z�ƍ��sss9{�,gϞ�޽{�4�>d�̙$''+moܸAPP�ΝcժUU���f�֭[��}ZZ*����e����L�L�Bjj��n���:�3�r�˗/'33S�>oY�OVVo��&�/_�8���P

Ҫ���_�}�v����-Z�e��<x��={022⣏>R����{�nF�	���3*��]�v1u�T���}������u���ҥK,\��Ǐ+�V�%..xr=44�G�iU̲����Ύ�'O����K/���KJJ"55�=zвe�*�ݝ1c��,���m�F^^~~~%n�>o}��w����kT�:v��
 ;;{{{����ۓ�����y�7�}lB[�֭9�<W�\�U�V%�_�`gϞ�{��<y��������B�(
~��g�;�СC�����:�[ZZ2y�d&O��ɓ'���			��ؘ�۷K�]!�Ѓ�*��޽{L�:��{����Ann.������R�zP�a��_�Nnn�2��3gN�Y���f��{�=����ѣG�^W�1}�3f� !!����ζm�X�|��~ժU|��w������Kvv6gϞ��O?�x��"b/)�`zϞ=ܽ{�G�)��]�v)��6%
"���9x�`�ΥB!Dy���R�~}C�!��
$%%���G۶m�ѣ�w�f��ɜ;w���$,X �)O!�͛Gǎ�[�.FFFXYY���JHH�2uLu��[^}�Uf͚�ҥKY�t)o��6ݺu3tX�9�N^X�r%'N��رc�����ۼy3���t�҅��P~��G"""x�WHHHP�i|)211Q���E}V�>��€'�
��������7���۴i����lْ
6p��	��3�ڿZ�6m���U�aJs���ƍ�|�2-Z� ((�'N�n�:�7oΥK�X�~��>Ν;GXXqqqJ%������ٶm���J�:�A��ɓ\�~[[[lll�����֖�ׯ��k�7l��[��ԩ۷o�رc�=��� ���o"""���Q���� u�Ş={4�������e�����*@�V�ؾ};���L�2E#���.
�7///LMM����������X:v��z����x��cOOON�:�<{z��w�Q����J�Ç��W_ѧObccqpp�믿����Ju�ׅ��Gi�7x�,�رc��撐���3�ڶmۖ5j�f�233���d۶m���Ib�B�Z&������мyse��3ѣ�>���{���7h��}@*�����XJ;��g�+�H!�BT~�!III�C!D%�x�"�|�	�;w��_f��͸�����ȅX�x1�;w6t��������dӦM?~���v��ł�ex��,���,[��e˖)��(����Z���BDD��7nnn$&&j��<t�������bllL�6mX�h@�Ӵ��>};v��'OҩS'�����_���1�Mtt4�A�Ν�U�ݺu��/W�j�Ǐ�������G����K/�D�Z�x�嗕�Z>�V���Ɔڵk���	@NN,�U�VԩSG��Txz��/\�D=��Ν;K����x��w������???ٱc���>mڴ��ĄiӦO�aҥ��4lؐC����<�z��!�4i�T���]����S��Rq(##�T�<o�����͍.(Ud2339s����Sϟ?���F�֭5ڈ����K������W_�V�ZXYY�t�RLMMY�lw��eҤI����i�&jժņ
077��ۛ�w�������+ׯ�}�c���t�ڕ�����G�ڵ�ѣ���XuŢY�faaa���y�����ӻo!�x�Uٴ>Ee�^����5��֭|��g��h_pPռyseP����޽{�io��رc�����/��o�>.^��ɓ'�����A���AAA�6SSS���		�������777%�"c/)�ƒixr�
������ R!�B!DeIII!""���0N�:EӦM3f�����ۗz�{!�Ϧ9s����O||<k֬aʔ)xzzjL/���<��E�K�.����^�,|�\�>oݺ�ܹs��_�����+����t��Uk����~�.��4Zx?�i�^~�e��긯_�������+���m۶���W���T�]ԉs�9r���,��̊�[W�X�Ӯ];�{uUϢ*�׬Y�Q�FLLL�����ő������166����K�ϫ��E��V���?���p������'..�ǏӫW/j�|�h�Ν;���k�O�L�FT������ŋٱc���XXX����ŋy���'�׮]cÆ
�unݺ5+W���ۛY�f��_���)))����Շ>�ԩCtt4���lݺ���F��7�|���6c�jժE@@/^��ؘ:0r�H�{��@!�xUYr�>�^�
h�ue-V����v`�V�\��m���T��Ki�\D
!�B!��Hiiilٲ���p��ⰴ�d���|�����_yX#��٤k*]�����ٳ'����ܹ�3gΰz�j6o���o��L���^jA�^,/}���/��_hٲ%����m۶t��www��,�o�����VQ�\�v?�%?ԩSG�r#����߿���&''����k�@Z8n}�`�=�G�fÆ
�޽GGG��݋����K�U��[�V-��wÆ
y�7

�ܹsJx��>��u=��$	�rYZZ��W_��W_�&44���P��'Nd�ĉ���TV��E���Znaa��իY�zu�m����������7o��BQU���χ��	�DTՠ��{5}�%
�J��"b/)����62�B!�BQ^w��aǎ������)��������$s�!�(������8;;����?���
X�|�r���ʊ�W��k�.����$.}�����L�nii	��˗���=�f͚�lْ˗/s��)����Ν+W���y��\�r�ӧOӣGe��ӧ*4>��>+V��8Gjqqq̞=������7mڔk׮q��%:u�Ta1�5oޜ�={˹s�8v����Ә�:]G}L�0��[�*��FFF���[YߨQ#���HOO�Q�F۪�i*�\}8p�ѣG���ʆ
$1E!ʩZVNiٲ%���gΜ��^S��9sF�mU
�J;��L���T��v0�ϵ�A�B!�B�����d�Ν���s�j֬ɰa�P�T����:K���m˖-/�!4mٲ��!<sF�Ejj*���>�]�h��7`�֯_���>>>���p��]6o�̦M����c�ڵ������IIIQ�F/}�T;q��
����,^�XY���AÆ
:t(�W���ߟŋ��K/q��y>��
鿲��ߟ�������'�|B�N�HNNfɒ%�fE��x�"���/���z��٦W�^�jՊ��d.^����M���ݻ7*���K����O�
X�b�lْ;v�;�7�x���8&M���0S]������?5j[�n%??��_~�
(�۷oOZZW�^�z~���_�锄(l߾}�=www���%1E!*@�LN<x0���K�,�O>�C����/� ����@P�����Rq�XQ��v0�ϵ�A�B!��Y��O?iMY[��(K�l����>{��E�R�g�=z����֭���E由��Idd���B<G����'  ����u���4i���$%%1~�x�vu��e�ܹ�ϖ��ܹsWWW���صkW�bӧ����w�^.\�…���믿boo����8�<ӧOW�2D�[��+���7�&%%�)S�h�����ZVV;w��L1RT5�5j����NTT��������ɓ9t�III�1Bcݴi�*$�}�ҤIn޼I˖-5^���_Gu��W_���]L�8QI�+��Իwo�=ʹs�4�V���**iI<_��ك��+^^^|���"����
��ˋ֭[s��5&M�DϞ=�<y���QФI�hݺ�2��ѣC�aӦM:?���2r�H�b�߿?.T�.\P���e8���   z�ꅟ���I�1Vt�'O�Q�F�`�O�>DDD��i}�����ґ2�B!�B<�\\\�n������e���L�8��M�2v�X�ܹ��_MZZ�w�f„	�����ϗ/���R~	�$&&� ��Օ�ҡCj׮M�ڵi۶-�&M��?Vڙ�����'VVVcaa�T�(�r���iѢ���<|���q���ヒ��&&&Ԯ]�Ν;�d�%%<<x2%}`` nnnXZZR�vm��o.k����ܜ��`���iҤ	���4i҄q�Ʊ~�z,,,��Gnn.�����‚�_�ض#F���ܜ}�����[d�F�������ԪU��;��3|��r�`dd�����pRMu��e���W��򽃃�ƺ!C�`jjJLL��v111���1x���-�;;w���Օ	&��w�Ib�BT���$�������eu��V�Zűc���ʢM�6�?��R�vm��┶|��w9r��7oR�^=�u��̙3i׮��������%--�
p��~ՙ��?�dff�d�bbbx��1666�?������@z����_]�E����GEE�L�ӲeK��틷��r�M�1�7v]˯_�ΪU�8q�<�]�vL�4��jl[�ks��=�
F����o5�1m�4.^��޽{155�:��*��Q!�B���P��:�P�?��ѣ����}�v���o���qww��ݝf͚:DQN5j� $$OOOC�"�S�y��#���x����0w�\Z�jŶm۴֯]��u��I�-HMM��Ņ3f0u��"�-����v�܉��;�&Mb�ڵEVOBQ&��rZ��
j��q��7�Xnaa��y�7o^��trr��ɩ�6Eeϛ�����s]�҇ŕ�ӵ�����;;;���\�A�1�7v]˛7o^�>*�W�����[����T�A��ӧ�1c�$�!��J�1��
�q�FC�"�ϥ��|���g˖-���ѵkW|}}qww�U�V�QT�-[�hLY,�Џz�!�x�dggs��}�e�	&�l���͞={		�����������0�8����;VS��U���������	333�^���`��E�A�B!��`fff�0����ŧ�~JDD���XYY���Ň~Hݺu���$,,��7j�$W�i9f�����������%%%1o�<���011a̘1,]�T��yZZ, **�{������7�|�u|yyy,Z����p�\�B�ڵ�ҥo��f�o�V�S�N�R������իt�ԉ��zlmm
��\���DFF:!�BT#�𱵵e�ȑ:ۙ���h�"�y�elŊ+4��Bgǎxxx0y�d֬Y#�)BQI�er����ٺu+h����Ԩ�!�2�B!Du���c�����Q=��ի��������022b������������kkkRRR�5k-Z��o�)�-��QЀ�}�6��
ҵk���c�{�.�{�V���'�2Z������_*??|����x������(��eEKNN&<<�JŅx����d�ر����U�0)�/�B]�4iBzz:vvv���all\d�W_}�Y�f�t�R�~�m�u�VU����:1eʔ)�^�ZS���ܤ��0o�<:v�Hݺu122���
WWWBBB�)_ij�� r�ҥ2�B!D���˓�)B<��-[Fbb"=z�য়~"77����>}���@�
ذaL�8�Ǐ���MFF�ׯ���R�{~~��si�(�}��\�p���l����'7PՖ.]��˗i׮?��#999=z���$�}�Z���ONN����^���+WVЙ,�����?/��2�;wfݺu>���x._���B!�ϯ�{���_M�&MJl���ɲe�X�l�ƍ��ų`��풘"�U�ZVN122���OOOC�"@��B!)33��7��Ϯ�����x��ԩ�ׯ�]�vl޼Y����ё�s�|�r���C||<���
��>�V�\���
s����>�Ν;�z�t(�|�
������5kx���5�effFzz:˗/����Ņ��z���zK�����T"""���q�ƌ3����;����8�B�}KqI�5-w+�ܷ�׍D��R���׭UD3-4��Ƚ4�}E%�]S4��D�M��7s��|<��|�w��s`�9����ח�_=�l1""""""Yi���xzz��o��V�)""������������!��
�<y����cggg�*V������{{{S�zu��¨V�Z�ei3c��_~��s�"E�fy2;u�
4�jפI�d}M�2'''BCC���^�:���DGG?4��믿�5k͚5�lٲ|��T�Z�իWs��%fΜIӦM��""""""��91���JLy�tHDDDD$�;w����d�0D��&|�$222�}i����1�&̥4�yɠ�K	�ʕ+Y]www.\�����5�,T�LfϞ��cx���H,X@�v�(U�#F��dɒ,^��+W�0�|ڵk��}���UDDDDD�r�/��Ã���3c�%���<F�$""""�DBB��C)W�Ǐ'""���=z4�W^a������eڴi�:FZT�T�Ç�y�fڵkg)K�~�…�۷/}��e���,^��I�&��3x��t���V�\��d��_�]�v���t�Ё�y�f�DDDҡ[�n�AD�0!!!�A��~�	OOO���ӕ�""�eYr����<~��ytgϞ�u"b#]�t���OOO�O�N�5�v�_}�S�L�y��_�����3m�47n���iժ�|�
:t�E��?�����'�\�r��H+ƎˠA����iР{��eРA��V�P�ӧO3s�Lz��I͚5-��gI���8~��WL&+W�$..��-[2{�l:w�L�B��u"""U�lY���l��<����l1'�4___%���؀�q����@�=,����������"""""τ��H�ׯϱcǒ�˓'[�n�v��ܼy�5j���)W�ԬY�
p��A
*D�%�z�*...DDD�y��>�����<..ΒF�d IDAT��������Vu�̙���(;vd��婞���֭[��db�ҥDEEѸqc����ڵ+�=�\�mEDD2��w�HV����맟~��Ã��+1ED�v�sdv������M�6n"""""�~d���>���)R��;w&,,̒4���ş�����)W���r=ӧO��xyy��7�P�|y��퉋�K������ƍ2d�=����t�֍9s�$�;h� �͛G�:uȝ;7�s���_fԨQ,\�0Y�{��i�&���(Y�$�ڵ�ȑ#|��ǜ;w�M�6Y��������iӦ-Û<�BBB���`Ȑ!JL��L�9e�֭���fJp"�1����2�EDDDD$cv��IPP���\�p�5jн{w<<<x�l���<�R���|?LD$�X�lY���Oz�����鉗�_��SDDl+�>�{<w�!!!Z�O�BBBl������<����Opp0����9s�ʕ+ӯ_?��ݩV����y ݏ��{�.˖-�u�E�3�����JL�&2=9�L��"��9�[DDDDD$-N�8��d"((�#G�P�lY�u놇�u�Աux""""""����'��ӦMSb��H6�e�)"""""""���={���`L&{����777�ΝKÆ
u�VDD�ԫW���pK���ǩR��#��0I�̎R:7Y�oZ�ɪX�*��&,,����ӭ[�,G$;Rb��H�������˗			!((��۷S�pa\]]�<y2͚5#gΜ�QDD���iӦl�8"O��{�2c����0��ݻS�rejժe��D�\PP=z���w�e�ԩJL�f�����Ӓu�����ŋ��g������~�l|[Sf�����Ÿ�Iٲeٲe�7�u8""��ƍ,Y����@6m�D�<y�ԩ�F��m۶�ʕ��!���<u��iӦ,�[�~111�7��]�R�dI\]];v,!!!899�8B�������JN�h�z�fͲ&�,�g�+�[DDDl�0�  "O���(�-[FPP������Ӿ}{���h߾�>��g���qy�ϟ�իWqww��yxx������at"Y�d2ѳgO�}�]�M�f�pDD$�TrJJYꩽ�x�"={���ё=z<�~v�����2�EDDĖbccȗ/��#I���~��L&�V�"!!��m�2o�<:w�L���m���H���?�����/�̂,�v���ˋ�'ҺukKyǎ�x�"��ތ=��s�2b�*W���ٳ��`���}rLtt4�����~㯿��X�b�������G:.�X&���S�r�iժÇ���z��fΜɶm۸}�6�ʕ�w�޴o�ުϨ�(�Ν���~�:Ŋ�E�80���ׯ��߲i�&bbbhѢ��|�/=�!=�fDzbY�n!!!;v���X�+F�f����"O�<Yz.���߽��(L&���
ŋ��wvv�^�z�L&z��׆��	�W�^:��S��:y�%�d�L���x>��C������)R���Czf(�[DDDl)..��!����ݻw	

�d2�|�r���i֬�������}���H�n�___�=Jtt�%� 44��k�Z�Snܸ�ŋqpp�Zt�ԩDEEY%<L||<��ȑ#��K�.���ǡC��1c9r�x��4h����?���/�޽{�3�rL}���ڵk�6�N�b���$&&ҡCn߾���N�>m�w��eصk~~~�sE�~��pႥ�ʝ;w�<��ߌHO,�f�b޼yV�/_���d�֭[|��g�9#����Y����h6l����
�k�.BCCy��7�{zD�-sbʰa�ꫯl���<ģ���"׮]c���hт
гgOBCC�W��U�9��Q<}�t:v�H�
�С3g�$>>�R�,���H��LJ�Ǐ3l�0jԨa����qqq|��4nܘ-Z0~�x��b��ԩSxyyѸqcZ�l�ĉ����Իw��g���Օ
ФI���˲e��t��֭c��4k֌�������)S���X���?��V�ZQ�~}���Y�jU��K�Ҕ���s*"""��e}���k�HDD��w�6l`РA8;;ӡCN�>̈́	8�<k׮���JLI��%KR�zuٷo			�_��9r�m�6�슇��W_���|��l۶͒��T�/f���[/Z��#G����/�Ν;	�V�Z�ڵ�+V����mJ[J\\\X�d	۶m�_�~lذ���…\�v�jժ�d�6o�L�.]�����8}�4�K���Ϗ;v0o�<J�*ũS��f�����p��?�<.dǎ̝;��'O&�/=�!=�f�|�'���@F�Ŷm�ؾ};s��`˖-Y~.���۶mU�VMV�\f�#�4Pb���&[&�ܹs�����j�*nݺ�ݻw9v�X��ݙ3�.\�ŋ�{��%�x���ܻw/]c/[��+VЦM<<<��nҤI�\����XnݺŪU��ׯ�n�Js�
b׮]�����ŋ�� �1c��=�Ν��ݻDGGs��A��������Y��裏���$$$X��}||��9���_~��͛$$$X��W�\i���������h˷DDDD�������3����dc�a�s�N�N�2ehѢ�v�⣏>�̙3l۶�w�}ggg[�*""�����p�yfs��Ν;�u��:u"66��[��KNi޼��8={�L�2<������T�\��9sR�|y>�����#G��lٲVK�'�_m>�?���e˒'OƌCxx8K�.��3'��3�5j�+W.j֬i�_�~�zKݍ70z�h^z�%r��E�:u����H�!=�fDzbټy3�w�Z�j�^��o���I�&��2�����߽�Ǐ�$%ݯ\�rVuD�t�����ݛ�Ç+1ED�	�-���s��yJ�*�_|AժU9x� cǎ��իVu�f�=�
*p��Y���-ŝ;w�Z�3����;��ɓy�;vl�b޺u+������+=z��c�r��E-Z��h\\\��O(Q������Ϗ
6X�Y\�d	ӧO�^�zܽ{�U�V���CPP=z�H�8�fsw��;;;<ȠA�����KҬ�/���bŊ1m�4�.]����e�Ǵ^H{f�����+W.[� "ϸD`` gΜ�r��8www^|�E[�'""��hժӦM��K


���///~��g֮]K�V�8t�9r�I�&V����ǹs��رc��O�:�byj��SS�B��
����ŋ�R���1/KS�fM��ڵk[�p��y�d3���&���~�t��=%=�\�v���{��G�&�g��3�1g�w�߽7n�?�du�e�:"O2����{�Ǘ_~i�pDD$[rJjS�_�,�N�:�;��C�Z�O�Q\�T)KFq�ΝY�j�%��Anݺ�ȑ#�����/����1-F�e��F��3���~�
6�99Ŝ�УG����2������۷�����4k֌�]�ҵkׇ��y�f���ѣ�^���'O�{�n�:�;��ܟU�\/s�Yz��2�EDD���������Hf8y�$AAA�L&>Lٲe�޽;��EDDD��?1�A_\�Y�&�ƍlܸ��^{�…S�vm�n�Jtt4G��V�Z.\تmzgM����t�6#�&����%۟RYz�4k����?Ɣf�L�yHO���X&O��ѣGy���iڴ)*Tॗ^�[�n)�������=�̑#����G��"��h�"�z�-%���<����)gϞ�gשS'Y݌f�'e�ƍ��ŋ���d(۽~��V�kժ�/;:-��>|�p>��S���c֬Y���OOOr����Ӛ͝�XҚU����n��6m�<�Hf:�<AAA�{�nJ�(A׮]�3g
6�"""�A�6mطo.�Ν;4n��ƍ�k�.�̙��۷�-�Q%K���ٳ�\���%KfJ�Q�D	���ON�:E�j�R�W�T)"""طo�����|߾}V����s��i���c�|�yY���s��oF�'���0���,�J�O���OHH���>��Ej�-��˗����hѢV�"##-uD�T�Ĕ���ɓ'�:ɀ�)�Y$<<�j{X9$O�H�\fd�ϛ7�m۶���I�V�Z?%�g;�9R�RN��2�۴i��ի?~<5k�$66��3gҾ}{/^����fs��ٓ�?�����ǒ���>���g�_�ŬY�hڴ)...|��T�^�5k�p��f̘A�F��GDD�1iٲ%9r��c5'�4j��ߒ�͚5Kw����/��$�1c�p��1�~�:�|�
���c��>��0ߔ)S�|�2���L�<�z��ѥKK=�q{{{s�8p�'N��_��m׮���={HHH����L�0!��9��7#2rMv��A||<ǎc�ر�r��Yu.Rc�"��˿I���eS���d2YfLQb��ȓ+[Μ�������~^}�UK������}Ԍ�;w2w�\jժŰa�2���(ڻw//��B��LI��ر#;v�ȑ#�[���2u�T�|��Tۥ5�;�ҚU����nyZEFF�l�2L&k׮��ё:�t�Rڶm�����Cyf-Z�:u�N�*U(^�8����eʔ�����\�panܸ���+%K�d�ʕ���[lܸ�гgO���s���K�����S�ҒEҷo_~��78����o�}��ܧO֯_Ϲs��ׯ�U��e�Z���ٓu��q��qh)o۶m������鉥Y�f�Z�����3~��d};v��
fٹHM�F�شi�J6�y����D"O���z���СC������͜��[�`�ĉ:t���<h��N*=�g�_�r�1c�P�P!|||ș3g�c�0a�%ֽ{����
��B3�t�ԉz����O?M�J��\�2��L'I����͝ViͪO�Qf������<Mbbb���ggg
���?��W�\!00��;*1EDD�1Hi��ڴi$���<�JF��1b�K�&gΜ����/_>������dɒ�̙�
ЬY3,X���-Z����ӦM���O�\��Z�*�&M�}���z���g���t�֍�ŋ�3gN�/���,�,���ܹs�ڵ+����֭[3f̘d��<��ߌHO,~�!mڴ���	^z�%&N�hI@	

��s���mے'O�lْlߖ-[ȗ/���'��ŋ����w�᫯��u8""�쌇������ò|��Sc��N�
ALL�z�""""��v�o�歷�J�n�ܹ�7o��[�6m�q��ό-[�dѢE=Ƥ����q͚5���R�Z5���{,e)wj���%K�X�^�פI�N���q�\����dzjժT���ח�
�9��ׯ�����ד���g�Y޼���o�С���۪�?����/�ƍ�S�N�dz.��"""""�9�޽˚5k0�L,_����Z�h���;���*T��!���<�t�K$u�g�f޼y,[��ҥKp��:w�̠A��߿��#�^�|��-]�www���ӵ쩈ȓ/�f3�<(S��ɉ�s�ұcG
*���=�+W��>�J�HOF�Y�7oδ�:u*�7��ޞ�ŋӻwofϞm�ruue����888���@�
x뭷���O-�R��Ok6wZ�5�>=�G��"""""�$JLLd���0ggg:v�HDD'N�…���ү_?%�����H��ӧ�����[���)Y�d��D���+W���N߾}��""����)q��%:t�@�R�X�bE����F�O�ݏF��"""""��a�ܹ���@BBB�t��k���Ã�ݻS�lY[�(""�T�/�����6l!!!������K�:ulY����iժUt�҅^�z��w�)1ED��no�RҤI���5jmڴ!_�|�={�I�&P�vmG(Y�O�>���/���3r�H@��"""""�}�߿�Ʉ�d"""�_|�A����n53������-ԭ[///�L���o���yb��미��ңG%���<��erJ���駟������j_�…-K�����ɉO>��aÆѫW/V�X���/�s�qt"""����a���?~�֡�H6r��I	

�ȑ#���н{w<<<�U�������鉧����I���P\]]���Pb���S*[&��9��e˲z�jΜ9C||<%J��A���ߟ�ŋ�:D�B��[��������a�H6����d�����777�ΝKÆ
u�TDDDDD$��[��.]���o�ߓ3gN[�$""Y [&��ȑ���
�uO�'������޽{�ȑ��a������_������)X� ������мys� �d�6m�cǎt�ؑ�}���S,[&�������B\\���u"�EFF�t�RL&k׮��ɉ:�l�2ڴi�ٔDDDDDD�Ȗ-[h߾=��׿X�h�SDD�rJN�����AD���hV�\��db������,Z���;�'OG("""�b�D�	��
�ںu+�۷�7�   @�)""�%�������?�0ț7����,Ϛ5k0�L�X����Z�lɬY��ҥ�
�u�"""��u�f�DD$����׿�E�֭	��^W��<������.����n��
��Hbb"7n$00�%K�p��M5jĤI��ڵ+ŋ�u�"""�<==���u""�F���;�ڵ��_�d2���`�DD�1��;�7&888��y,r��e�D����;

"88�˗/S�NF�M���y���m�������3���k׎�^{�ŋ+1ED����������?[� "�o�>L&&���g�R�jU����;�+W�ux"""��BBBl��<e��=J˖-y��Y�t)����IDD�LONٺu+=z���nE$ðu"""""Y�ĉ�ѣG)W����xxxP�fM[�'"""Y�[�n�ADD��ԩS�jՊJ�*���?�'O[�$""6�e3���q��/  @�a""""�T;w�����w�^����֭��ͣ~������:D�B���xzz�:I�3g�мysJ�.ͪU�ț7��CѲ>""""""��]�r��~�	��Ķm�(\�0]�taʔ)4mڔ�9s�:D����iٲ%Ŋc͚5,X��!���
)9EDDD$�ܹ�s���:�g�����C�Lv��M�,YBPP�֭��ɉ�;��GѦMl������#�����Zyj]�t�-Z�7o^BCC)\���C˖�)��� <<<�m&#}g��ǏS�J��&,,����kmU�l��ח��[�!��Ѳ�O�;w�r�JL&���+�۷��ߟ�;���d�EDDDD2��뉋��S�N���޽{�]�v&E�~�5��L���/Z�jE�9X�v-�=���C�l [&�<�>��6mڔ�Ę�{�2c����0��ݻS�rejժ�ɑ���ȣ��������a�<�ѣ��ÐGǚ5k0�L�X����8Z�lɜ9s�ܹ��}����۷qss��.]:C}t�ܙ�˗+1D�iӦ���F�2e�ʯ_�N�V����c�ƍ�(Q�F��Hv�-�S2cV[͌� �6m�pۘ�ƍG׮])Y�$����;���}�PDDDDD����lذ���@�.]Jdd$�5b��ɸ���[u""""�L�v�={�d�ڵ�̙3�},_�<��y�+W�������ZT"##i۶-7o�d����WDD��f��GY��Y4�|�^��������Ã��@�ϟ����
����ܹ�s���:�������C�t2��۷c2�		�ʕ+ԫW�1c�н{wݴ�g�y��;v���Ø1cl�H�L�6
;;;ʕ+G���ٰa�]�v\�r�
6���b�0ED$�ɖ3�ܟ�r��=�ΝKhh(�.]"W�\T�P�N�:ѹs�L+,,��S����?cooO�n�<x0���L�4�͛7�+W.�4i�ȑ#ɛ7�U�m۶����o������7f�С+V̪^ҟ���K�…Y�d	9r��?w�����.]��˗��d�f�� IDATW^�x��z���ԫW��D�^�ȟ?�#��|����:�����~r�߿���9{�,ժU�����ݝJ�*�:<�����|��|��w��ّ7o^ƏO�F�h֬�ϒ������������ּ����!!!�r;;;���cs��J�,I�=7n�s�N������l߾'''��ܘ2e���˗/3z�hV�X��;wpuueΜ9Ɏ�޽{|��'���/��2����߿�H�������3g2q�D���K���i֬Ŋ#""�M�6Q�bE[�)""�P�LN�ߌ3��,��޽��9x� w��ɔ5�'O�̒%K,����{J�.MHHG� 66�_~��9r���[��4i+W���[�j���cѢE(P �1�w�k׮�M�6��͛7ФI֬YCtt4
6L�GÆ
ٵk�����曏pDDD$�xzz���o�0D�
�����>}���9r��ʕ��ӓ�ݻS�fM[�'""""b3���4o��jV�7nо}{Ο?O�"E�9s&[�l��wߥiӦ�-[�s�����E�ҥ�3g�Ur���8{�,����ڵ�5k�X}a�y��\�~���hfϞMbb"s����͛4jԈӧO[�p�֭d�5�/����8>>���0��¸u��~zO�d#���������E���ٰa
4`Ϟ=�^��*U��:Dɦr<��홓F�O�Ύ;ؼy3�F� (((�6���KuKɡC�d���<r����ŋٶm��<��֭[�eǎ���Q�T).^�ȢE������	�G��ɓ�X�e��_����jժ��5��눈�������˗�A�T�P��ӧӼys�m���ӧ�Vb�����<��+���y���ի������ü��k���жm[
*�…�u��{�&11�>}�p��-,X@�…�f�4��8�{����ݻ>|�ƍ�v�Z�����U�JN�8Att�ey��K�Z�O�2�ӧOS�bEv��I\\�6m��2'��������̙3�>�'��۷�e�С���/Ύ;�X�"���6�RDD��ǖ��Z�HZG���`�
���k׮����bŊL�oԨQT�T	<==���c��Ѹ�����h�:/222�
6$W�\ԨQ���mÆ
��Y�`A�v�ʉ'ؾ};QQQ�߿��y�R�N�?��|�ʕ��#"""""�DFF�`�ڶmK�2e;v,�+Wf���\�x�3fаaC�T�"""""Ϻ��`ɛ7/���Z�j�W������hѢ��6m�q��lܸ��C�ҪU�4�Q�V-���V��勲�/�&5}�t*U������]�-[��9sx��Wqpp�I�&̚5+Y_���`�ԩ̘1��W�2d���̙3i>W��̜9���x�jU^�xq6n܈��͛7W�����艘9e���8::ƴi�,����Ʀ��<;IJ[J�N3fN��P���g''�Tǫ_����Z�j<�pϞ=qttd���l߾���D4h���?�.�_��P�2�%}�(""""ώ˗/�:y���Ʋd��|�M���<x0y��!00�+W��p�BڵkGΜ9m�����H�s��Iʗ/��ٳY�v-vvvT�X�ܹs3l�0�;���7իW',,�jժ��㓮1���,�y��&k���/[~.R���ݳ��:u
�
X�kҤI���L�������|�T�^ooo����d_111L�6
///��HRŋ�_~�ԩS<���JP�d[rJj	"iIiӦ
�W�f���ԬY���XfΜI���Y�xq�����b���.�ƜHbf~���E���7�d�޽:t�-[��[��|�0���e�&����d�7n��舝�����=!�|�q�{�3����R\�1�%����M�������ҷo_����֭7o�dƌ\�|��K�����~�N�H�ݻw�^�:������Y�K�������ǼdPҥ�r�ʕ����;.\��ϏF�Y�
*S��g�N�1H����Gdd�ef��nݺ���7���*L��k""��xb�3(P��;2o�<~���ڊS�N�uh��Uܻw//���C������ؾ};9r�Q�F��E�R~�h.3��L���O``��#���͛7m�<����6leʔ�m۶9r�O>��s�αn�:��P�P![�)""""��(W��nݚ��c�eKHH 00�3g�0r�HF���y�W8|�0����5FҾ���^�*U`���V�aaa)�/\�0}��e�֭�ڵ��>��������?�c�����3y�d��뇳�������7&M�Ā�z�*s�̡T�R6�XDD��'"9�S�NԫW��~����h*U�D�ʕ���rma„	:t�����݋��7m۶��1g�;wΪ�s�=G�N����_�u�իW���k^r��ٳ��5�%]�HDDD$��ף�ݻ�����|�M2GJ73��߇�'ˑ#G7n*T�A��Y��!C�p��	v������u�QDDDD$��t����'W�^%w��\�|�?�;;;Z�h�/���ٳ�>}:ӦM�q��l۶�&M���7߰~�zK��N�8��{��!!!!�������A�ؼy3w��e׮]4(Y�
*`ggǬY�����f͚ԬY���E��-���ˌ9�K�.�P�\9f͚�|�ٳg�0a�=��������Ul�O�>x{{���l=�:u�ئ^�z�3�%�2�H�"���[VeժU�{��Dž�ƍ���R�dIV�\i�׻woBBB�%}5jĦM�8t�P��=t�P�mDDDDաC�����)V�3g���&<<�Ç��K/�:<�D�Ν#((���O�2e�޽;=z�v�ڶODDDD�1j�(�-[���ؿ?_�5y��᫯��u���ȑ���D���+r���…�Y�&}����*T��{��W�R�J\\\�����nݺV�'#=F���ŋٻw/M�6��{xxp��q��#G�d��xyy���e�/i[y2$&&���CϞ=�w�o��6~~~.\�O?����/_>[�)""O�͜��WWWƏϋ/����T�P���z�O?�4�#M��S�Ҹqc���)^�8�{�f���VY�#F��t���̙�2=�Y޼y-?7i��j_۶mɓ'[�lI6�-[ȗ/�[���#����ٳ8��e����Hɒ%�ѣG�I�����C���������s�=gy-5j�(n߾�j\.��є7o^��ݭ��ٳg�[�.y��C���o��F���qpp�p��t�ԉ={�<0�'N`gg���s��'$$���l�o���N�<���X�"���*T��u��駟Z-�s�uN�����2m�4�4iBѢE����X�b��_�b�ƍ)����V�_��̚5�&M���/����k��Ɔ
8{�,S�LQb�����H&+X� ۷og�����ۓ#G�)B�ΝY�f
G���ݝR�J�����<��\����9��%��o��|������l���-c���e�u���#7ndȐ!<��s8::ҭ[7�̙���A��7ou��!w���Ν��_~�Q�F=�dOAAA�<y�'NP�reV�Z�W_}��ӧy�����"""ig<"#i7�?~�խ[ר[��#��y�f�nݺ���k��g͚eԫW�8�����F�z����Ǘ�ó��("�xzz����>���͛�
@�-w���/����MJu�nNNNV�,X`�̙3ź�k�6n߾�l��������ݻw�aaaa`�,Y�HHHH�x��h���s���3�y��d2r�ȑ�9ڵkW�q�a4m���e˖�����
�hڴi�\��H��]�����z]˕+g\�|٪}J�aƭ[��:u�Z����X�re�q�v��z�Y9�^�<���(cѢEƿ��/#W�\F�<ywwwcŊF\\���y�/^�:t�1y�d�I�&FΜ9
�u���7�|c����Q�q��ݳ�?�R�����g����:,y2���)���h�_��w�}@�^�R�קO��������S�dIz��Xb��u��
�v�JTT�'O�$&&�;vп�������ҥKV��H�y{{[������Ϝ9àA�HLLd��9s���x6o�LŊٻw/�&MJۯ����˗�Z��e���^{�ʕ+s��%֬Y�c;y�$$22�2]pFc0`����dzu�V*V�Hll,_|��c8p ���Kq�����߿?�����{�=���0`'O�$>>���h6l�@�jՈ����h��fI|||سg/��[�n%::���X���hР�a0a„TcI����k���\�OOOJ�(A߾}�~��\�B`` :t���"""""��իW���/��\�r�L&���/BCC:t(�˗�u��[�lU�V��ח#G�зo_r��e�DD�I���-�7u�s��u��~�0#<<�hԨ�q��E��ŋF�F����=�c���Y�{��3s����cƌIq�{���f;v�0���
�������92��/v��m���~]�v5���۪���?7���-�X��o�̙3'پ��b���w�M�f�ڵ`�(Q"�8�0bcc�"E����ƥK���]�r�ȕ+�Q�pa#&&�0��_��c>LJus��m�������C��(U�T��tqq1�_+�<y��<y�WJ�/�Ǒ���N�$&&7n4h)Rİ��3^�uc�̙Ƶk�l�������1j�(c�֭�\@ĖN�<iܻw��a����A3��Z���qtt�Q�F|����̙3պu����ˋ)S�0e��~�m�ԩ������/���;露�<�Ghhh�}DFF���ABBm۶e�ĉV�׮]`Y�:�z��agΜ�*���Y�r%vvv����j_�^����cŊ���ߩ�մi�de��lȐ!��4h��k�R��Y�w��$$$$[�zѢEܽ{��={�;wn s�KF<����o����O˾�^z	�0�p�B������0�_+�����Ĥ�>����Y�w�^F����͚5c�Ν�5���6o�̐!C(Z����`�ĉ4j�聟��RŊ����u""򔰷uO����Gj�jժt�����������ȑ#�,Y�N�<�꾁AŊ	LvC�ԩSԬY3�qG���)[���>�6m�ƍ1�L)&���-5�
*$+˓'���m?`����k����裏,�/��s]2b�����ۗ;v�c���زeK:t����-�r��i>̮]�عs'����Z�~)]�����ς�'OH`` ǎ�|�����OOO�U�f��DDDDDDDDDD��""""b+�n�z�z��=����ϟ��˗S�p�dun߾
@�|��ׂذa���`��T�S̉#��YF�2��V��5b۶mlٲ��_���p:ī��J�5,u3z]�����ݻ\966�R?���z����_�g����O,X���P����i^s<((�ѣGs���4�O*��^��iw��E���	d׮]�(Q��ݻ3�|�ׯo��DDDD$�:w�;w�u"�sss�u""�M)9EDDD�F���˭[��y�&LWۣG�2l�0���X�hQ��#�͛���(n߾��1�9��ݻ�î]�8z�(U�VMS��ƒ���m������_Oq�s��.E��ҥK\�z�ҥK�Z�ҥK����ҥ]�t�ܹs�[���[��u�VN�8������Y�b�Cc	�,���/���F�r�(V�U�V�r��i>�����O��7o�d����ٴi���K�.|���l�RS������Cmݺ5��""��A3���ȳ-��yVU�X��۷��]ll,���DGG�駟ұc�T뚗�9t�P��^�p!�z��0�T��={Z�O��ƒٺu�F�B�X�l����/_><<<��e�.̳���-�*U��Z�lٲ��ۗy��q��qV�\	�ƍ�˄	�={6G���>�_�~t���j�{���O���BBB�ҥ��μ���*T���`._����iӦ�SDDDD$]�~O�6m�2������MDD��,�9�[�nYյ��"$$��!��H:�k׎={�0a�Z�n����K���`�w��o���U�,�#F�����2v���Ѽys���Ǽy�hԨ�վC�Q�zu\\\��� 11�E���;�<�_///-Zď?�Ȅ	��xzb�
NNN��уo���ɓ's��5���l���^�V�Z�i�&&M�D�v�R\���ݻL�6
�6m�X�+W�gϞ�СC���KV�6l��1���a���#G��坟:u
�'��~S�N��C޼yS�Q�z�']bb"������,[��;w�вeKf͚����Mfy���R�lY�''b#��y�xyy��߲m�6ڵk���75j�`ǎ�L&,X���=��ޖ6+V���o��F�������=p�!C�0s�L�ϟ���3Æ
#�����1t�P�z�-BCC�x�"�����W_}`�
4�v���ݻ��~��v��=�x�KV8p�%9�/��.�
b�ԩl۶�f͚1n�84h@�|��q�aaaL�8�]�vQ�xqh��������ohذ!���;v�#F$;���#**�%K�йsg�ݻ���e˖�ԩS�1��?��bŊq��1&M�ď?�hi���,I���O"�0رc���p��U^{�5>��s�u놳���C��йs�,�;��d�>��43�����	݈H�ߧ������ixzz���~������d)n3gδ�_�n�T�&ݒ�7o�agg�b�
111�aF�n���?~�����3�{����H,i�/��j�ꫯ�Q�z�T�M�u1۸q�Q�P�^��ŋ;w�L�622ҨZ�j��J�.mDDDX�i֬Y��~�ܹ��3n�8�R�J`���Oi>o)I�~V���'�����ѣG�ʕ3�Z�j��n����MDDDD�B���֦M���n�=�����g����$���iӦ͆���<9ڷoϾ}��ׯ�?�<�r�`���nݚ��P�bU��?�H����cӦM���*T^|�E>��s6l�@�ܹ�y�&+V��hѢ�����_OOO
*���˹y�f�Œ��3��4k�Yz��YӦM9v�cǎ�nݺ(P�9r�/_>�֭���9|�p�3�(P�;v����jժ��䄽�=+V�>`�޽���X��?>�ڵ#o޼���S�L�…�U����(P�V�Z���?��g�1n�8fϞ��s�0�?�;{�,'N�F�T�^�E����ƾ}�8|�0cǎ�|��SDDDD�!�ahӦM[�6[?u�����0�Q:�G���1?ΔE$�X�lY���G�3�t�ѣ��
���E�Ѥ��#���믿&00�����;���8�F�L�:�@9d^�	R�RK��Y�!s��f^�Shi�����,���(�r@D��k��dbh�"
���s��p��y=�~b���Z߽���]�S�C�eĈxzzR�R�?7 """"b�n}?-"w�{"""%k[^=k�9���ڵk|��g�����|��glٲ�]�vQ�jU������C�>}�����EDDDDDDDDDn=�'"""""R@nn.�W�.�q��'�}�Ç��{�����֖�>��s��H���51EDDDDD��RSS+:���-sʭpww 66�B�		��t�҅�C�VH"""""r��9s�~��q��Q{�1x�"�_�~��{����IOO�[�n�X����S�N��������������LNN���������666%^ޤ��݊��YV�}�̘1��/�R?�U�X^��DDD���)>|�իW��k�1}�tV�ZE|||E�%"""""��'�|�C=d����%:Ĵi�hܸ1�z�"..�ٳg���̞={�8q�&������T��� rrr���a˖-��7q�D.T��' IDAT]�T�a����m��)�dee1w�\���3
6d�̙3�����ODDDDD�Iff&'Nd��>���Xƌ×_~i��ĉ���r���өS'���ƏϱcLj����W_���G����������0z�h��;��`PF�˪��)����{�7n��>�T6b�Ο?�ƍ+02)/G��cǎ|��'l߾��k�R�Z5�z�)���8z�(˗/��ݝx����ӯ_?�������?�M����#!!���z��f��ԩCll,G����DDDD����)+V��W�^�X��T���ɪU����k׮<��S�Y�Ɣ�/##�=z0`��_�n�ߙ3gpww�駟6�
�cǎԯ_�ԮA����LFF�m8S���;w�^�z>|�g�y�T߷o_lmm6lo��=��~�-������:u���EDDDD*Vrr2'N�I�&T�RgggF�Ibb��6667�
���eȐ!�s�=���ӢEfΜɕ+W
�kӦM��OL�ˋ�-99777xꩧn9�]�vѥK���]�6O?�4qqqE���?bccC�
��͵�677�
�����'O2y�dZ�lI�*U�U�nnn̟?�l�����ڽ����wޡ{��ԭ[[[[�իG���ٳg���s��BI�mi����=ggg���hժ�n��w�������]19�w�!  �ƍ3q�D��:��'OfӦM���o\�v������x�W�~�:���6�_��o��Ƭ�}��н{wv��Aff&�{xx����Ν;�LEDDDD�v��?0`���
3g��ᆪI�&fmjԨA�=h֬���lذ�^�zQ�r�
�ZDDDD��A������_���!55��� ���/q�ժU3�ߴi]�t��?�…\�v�S�N�d��w��իW-����#  �ߒ>����Wd�ƍ#..���Ln)��[���͵k׸t����xzzr�СB�pqq�G��;w�b�Q���pΝ;G�=pqq���̡C�pss��租~"''���t������'�Ν+V_xzz2m�4"""HKK#//�?�����pz���_|Q��ݿ�P�k[�s	��Օ͛7���Jnn.III���+,^����˯<����H~���,_���� �7oΪU��^�:p�dbb"�ڵc֬Y�hт��d-ZDLL���0��#G���?}��1�k��ҭ[7"##hݺ�EƲ��H
T��+"""=۶mc����_¶m�n��ݻw3j�(*W���ݻy��m��O2w�\*U�+���������4LFFS�Neʔ)��� >>�
6��燷�7ǎ����t��`��뭷�b֬Y|�ᇦ���I�&�����ɓ����M�F�8x� �ƍ����,Y�������_���J�֭qww�s�θ����?�c����W蹝<y�~��&M��2��6�	&��/2m�46lHLLcǎ%))�7�|��?���X&N��޽{ٰa�)|~7n`���@��˭�:u*L�0�3fдiSrss����^ 11����f��k��)��kb������Ѷm[��}\]]�T����L�:���(.\ȓO>i5k��,��ږ�\~��w������bذa̟?����Df̘�…�,��q�DDD,nQ``�!7����܊��o���o���={�4�?ެ��Ç���gϞ5+��_nnn�	&���}�]����!22�`0�/_6t���н{wõk�����O���.\���…777C�~�Jy�Dn��>��H��6x{{��ڴi+�ͨ$�w�]�f�={��R�J�A����nzLrr�0�ڵ�� ������a����E���ٳ��O�:��z���(����0���kfu3f�0�aÆYw��!`h֬�E��
�aѢEf�o��02�j,ƿ3��}����b�綾^�8�o�1�{キ�8�!;;�P�N����!%%Ŭݹs�vvv�ڵk���C��K����b�mժU
���ŋ���aÆ��iӦ���[ԝ<y��W�^h\��_����i0��ږ�\��Sk�E]�v�еk�2�/�u)�݌���:tG?��Hv��E��3g���养��i3>����dj���C�*UL3�8@^^]�v��F򘴴4-�0�ۈ���W`` �A�6me����ӧ�޽;.�������ၻ�;�>�(O>�$C�e�ĉ����̜9�%K��駟7�q������ef^|�E���L;w�,����tF�Ann.}��孷�2���o�2e�ű���~��g��/���
#G�4�5j666���Z|א_�=,�J����?oQֵkW.\�PhU�Ta������i�&�����]����U�V�澔F�ƍ�ׯ������/���m�b08{�l��:}�4�WWW��������B��v��Bi�mi��8δi�,�������w�ŗ_y]7��n۲>���f�Ɣz���f���dgg�n�:�/_n����W�\1�\�N
DPP			DDD�[���F�Z�nc������Hq�\�����Wt"9!!!%j�����k�q��deeq��._�LVVW�^%99���,233�t�����X�]DDDD�n���pӥaN�<Yh�ĉ9}�4-[�d˖-T�\٬���C=T츶l�Ÿ�IϞ=iҤ�Y]ӦM�ѣ{��!88����D�[�ŨE�eիW //��O�0�+V���g61��>P6��4f͚ų�>KTTQQQ���裏��SO��Oboo_�~O�:�ѣG���!::���x��ݿ��󠃵�n���\�;�����~�t�b��V��u)+�mrJiL�6�z��r�J���Gbb"mڴn�O699����b��8j�(>��c�n�ʁ�T�������u뒚�Jzz:u��5;6==��FDDD�$���ٶmC���PD��m�V��:v�Hǎ�8���˗/�R�?�������ϩ]��E�ç5j�(v\����޽��M�����b�8r���fRF~mڴ��ӓ��H"""�֭���$$$ЩS'ڷooj[�booONN׮]��ή�㲳�M��;v,5k���7�$..�_~����iѢ;w�y��Ŋo�֭̚5�S�N�}~��_Y(�-�ddd�3�C��Q���dy]7�����)#G�$<<���$֮]˪U��ٳ'���̞=�3fЪU+.]�D@@�7o��ݝu�֙���{x����1<��CԪU�T������Jrr����MmDDDDJ��ۛ����C�/!((�"E�������>\�|�K�.Q�f�{��1^~�elll0=�jm����\�R�19t�P�b����رc�nݺX�KKY�0a������ѭ[7�YS�q��ԭ[���Ο?O�F�
m���bj_�3�<�3�<Ù3g���oٿ?�����䧟~�W^!44��{�`Ȑ!4k֌z��Ѻuk\\\�}^e�4׶4����Hzz:���ԩSǢ��իe���HE�\��S�ref͚���
QQQ����n��m֬G���LJΝ;ӷo_6o�LժU�:u�E_�G�6�I˿�`ʢ���`q����1"""""""""""'-[��%:.;;��Ç���������*��q9k��[�i�&�Fu��P����c־8JKY:t(�j���>#;;���jԨ��#�ڕ��'I��&::(�!�&M���ϲa�N�8AXX{��)V,.`ݺu;v�0n�8����2�\�~�X����\�Ҝ�q�����Y�=*���*lrJll,����j۾}{�y�֮]�H���燷�7���T�\'''y������Arpp0�ܽ{w���}�R�zu""",�����F���ݻ��'""""""""""�W��7�|��͵�		��Ɔ~����O�>�#G�0p�@�̙S�={�`Æ
u			���ЬY3�����_,��)S��y�f���l[�X�C�j�9r$�.]b�ҥ\�p��Ç[,3T���c��d��]�f5�k׮��;�ЧO��f͚acc�ѣG-����ڟq٥��L������
Z�|��第,�����\�Ҝ��O?
��ŋ��>�-[Vf񉈈T�;2s���+�f�"66�l�'''�M�FXX���|��w,[��4K� c֕�M�Z�o����7���={�T~��Y������Ѻ{"""R�Ο?�����à_�ww����'N��Xww�bm��8���X�U�㇄�0m�4�M�FHHH��#"""""S�L�f͚DFF��Cvv6�w�fҤI�5
[[[-Zd:&44���{������G�&'�矧J�*lܸ�Y�fq��9233���>|8p#�:�Ν;���pww�S�NE�۵kW�����o��k׮b�oIb)/'N`�ҥ��>P��0i�$j׮Mdd$�<�_�5��������F�=����~���X��\�®]��z�*���$$$���
�o�qb������%''��ynLd:w�yyy=z�ѣG�M��?Jw!K�4׶4�������LDD�����/999?~��C��Q���^DD�v�#'�����L���>����LU�1c�РAMe���8;;�������%cZ�mۚ�k׮�b*�W_}մv�ܹ>��իy�ט>}:�V�">>�����X�F�

�Z�j|��t�ܙjժѫW/֯_ONN+W��C��c,X��#G�Q�666V7�V�Z�f�lllx뭷hР<��=z��]�2s�L���x���1{��)I,�}��t�ԉ�W���ҹsg�6��/��s�~�)�j��<��ԪU[[[�ׯ���QQQԯ_���0�֭kv���Z�nͱc��ӧ5j��Ύ|�;vШQ#����777�Ƅ;;;�T���3��4h���-�ڵc���̝;�V�Zp�С����T�k[�sqrrb���ԪU�;vСC�T�B�֭ٶm+V�(��DDD*��brJ����۷/��������SOYmW�Z5|}}	

%%%���BCC�jժ�9j�;(lr�q�N�w��[:ޘ)�`Ƽ�ʥ䲲��;w.���ٙ�
��g���"""""��ү_?���7n�7��Ύ�5kһwov�����?o���~*��ƍc�޽�����<�����޽��U�r��%BCC�[��)���x{{S�V->��s.]�Tf��7c�kYS�Jz_�z����Ǚ3gnnn899Q�R%jԨ��������ѣV3�899���ڴiC�jհ���e˖���>|��M���q�F�q������&L`ӦM�INNN<��c|��,X���s��eؿ]JzmK{.]�t��/&L���[[[Z�nMPPP�^�&>��`c0��APP#G���M��;A�~�HOO��ݝٳgS�~�"���7Ҭ�҉����G��:c6c&���@��p�S'hϡ��+�J�oy�]\�5��5k��/�0��MMM��ˋ�cǚ��������H�����{"""%k[�����%j���mZQDDD�Np��9֬YCdd$W�\�Y�f�=�~����'9�_���ӧ���bz'33�
6�k�.~��w�ի�O<���㱷�7��o�e۶m?~���l�ի�#�<”)S�^���䚂+J2Nq�,���{i��2��?x�ػw/YYY��ՋY�f����wFF���t���lbv�
pww'88�Q�F���X�k$""""""""""R\��)""""w�D��ooo�6m�'�|BBBcǎ��Ņ�� S���4ƌÅLeIII̛7���<�%�/_NFF�iRBNN�'O&11��&%%???X�z5�*�X�q�ڵlذ�����T����|��i�pkJ2Nq�4���^�q�2227ngϞ5���믹z��-�_�y�ر���L<<<,���� &&��;w2hР�^�+ٷ""""Rfh׮��}�M�6q��ڴi���ٷo�<�~~~�6oޜ��H�Ĉ��i׮AAADGGB����!44�t�-[�9s&���8p�������|����X�~I�)���SԹ����T��`��͜={�ƍ�i�&���X�~='O����;���HZ�nm��Xfl#""""""""""R�49EDDD��'��m������x��hҤ	իWg�������駟Z����c��ˮ]�X�h...T�\��͛����/��o�>:D�6m�ꫯx��wY�d	W�\)�|J2Nq�4���^�q������Y�h۶-vvv������/�O�8@ӦM-�6k�̬�����������Hy+�e}�m�V^]�H!�{'"rw(��c�ҥ,]�Դ��o��o72����o������8���̙3xyyYm���d��…L�:�cǎY�3E�[�q����<w���^
*x?��z����o�ެ�?��O��Js�wZZ���m�e�6"""""""""""��&�:����[���)Q���Cn6�$���K�r��17nL�=hѢm۶-�{���S\%��V��@�\/c�����|;^��X𼍯�J�,%�J��)�2����퍷�wYw+"""�K\\'N�]�v����K/����+�ׯ7k���/����D�6mJ<���3��Ʉ�����\dۃ���G�ڵ8uꔩ>77�ꄊ��S\�Oi��jܸ1�N�"..S�q)�Ҏ_��u뒚�Jzz:u��5�KOO7���|r���Y�reYw+"%R�!���M'%�k���~~����l�2-ZD�Z�X�r%!!!4nܘO?��ȱz�쉿�?�g�fƌ�jՊK�.��͛qwwgݺuf�DEE��c�q��),X`*�|�2u��������3ghҤI��)���S���z=���Y��E��`�ڷoω'X�pa��_���Ojj*����P���MmDDDDDDDDDDDn�2��r���m�Ɛ!Cʺk��m۶Ut""RL%����ϲk�.�9“O>iV7a„��5v�X���Ñ#G���1��Z�*S�N5�?��#���3o�<�͛g��������v�ڤ��1p�@���	+�8�U�x�Ry\/���[N�8�ĉM�}��5M)�����d�޽$$$���jVg|�u���������߃>W��ҿ""RRe>9�H�Dn��� F�Y�a��H1��r��Q����֭�ƍY�z5QQQdggӲeKƎˣ�>zӱjԨ���~�!�w���888�����ɓiٲ���k��Fnn.���ѪU+|||���Y�~=[�n��Ã�ӧ��{�JNNN��)���S���z��۳~�zV�Zŷ�~�իW�ѣ�g�fǎ��0}��eŊDDD0z�h����jԨA�޽�悉�����]o�С��������ít`�2��M�}�}�("R����.�֭cÆ
|��g4j���g�2`�&M����+8������g)/��EDDn"��2������H�3f_~�%���̘1�1I����b� �{ڿ?+W���0D�.��DD��49��'Np���[�		��t��E�EDDD�U�Z5|}}y��5j����\���U�Vpt"""""r'8s�۶mcȐ!���e�m�V�!���]F�S�y��Wٻw/���u�f���lݺ����a�pqq�C�������͹��1e��-[�/����kG%"""""we>��2.�#""R\����޽{��gee1w�\���3dΜ9l۶�jժ��0EDDDD����oo�CDDDDDDDDDD��*U����W��%�q�FΟ?����Me#F���lܸ�#��ݑ�S��V���Y�|9G��J�*<��c���+f�J233ٰa�v����^�z<���?{{{fϞ͎;X�`���3���_3g�{�1�����E IDATccc��� 88��;R�~}S�
���Npp0�F���ѱ\��������������t��y���G�Z���o���_0`���'<<������}�'Np���[=�(��im��Ĝ_�J��Y�&:t`ҤI�lٲT}����111\�v
ooo����ҟKHH�K�.:�����ԙ3g�����0D�
2��#'�M�4���t�����O�~�:�g� ''�ɓ'���h:&%%???X�z5�*Ub�̙>|��K����J�
HMMe���ԯ_�Y�f�MN�oǎdff���aQ���ALL;w�dРA�pDDDDDDDDDDD*FBBm۶5�o׮]���ꫯ�w��RO��]�_��ŋٽ{7111l޼�&M���s��!..δ�…[����ì^���[�b06l...t���VC�����9rdE�!"�`0�rw�䔦M����˽��ˆ
���c��ݦ�)$&&Ү];f͚E�-HNNfѢE���ʀpttd���L�2�y��n�:^�u�^��ҥKqrr"66������HZ�nm��,22R�SDDD�PAAAUt"""""""%R����Rp�޽{KԾ�mJ#�ׯ_'%%___>̇~Ȃ�t�#G��v�Z��������׷T}eee1w�\���3dΜ9l۶�,����=�ŗ�"rw	

*��i�mrJa��
���6c��,�#G�����˗M��v�`ѢE4l���͛���ˀg��t��oooy���1b�:u*2�'N7&�ԬY3�6""""��_�2���Y�,����_�޴�j�*V�Zu�g.�h�*U�Q�F���f����$Fnn.p����`oo_�6n����>|��lĈlٲ��72eʔ[�WDDD�����)-Z�0����ܘilt���������d���/�?�@���y饗nCZZ���u�2c����ׯ�~�zv��IJJ
vvv�hт��~��a
㤗��H/^̮]�������_�����+t��Y��O���
���slff&6l`׮]����ԫW�'�x���Ǘh������t��ׯ_����qqqaݺu%7���ر��|���ٳٱc,�_�~��_�5s����c���dddLǎ�_���]�
pww'88�Q�FY��DD�~Μ9S.�D��1dȐ2��MN)��8o����L?���X��,uԕ+WJ�U�q+U�dQg,������ʕ+���H9PY��a�����ۛ�M���'�����رcqqq1�;w���|��G��k׮��?��?p��U�4�K�,!,,���l��É��'  ��� ''�ɓ'���h*KII��Ϗ��V�^m�{kN�>
@ݺu-�/_NFF�iBHY�0s�L>�ҥKquu�A�����x�b�ׯϬY�رc���xxxX����ALL;w�dРA�[D�����_f�|�ȝ�<>-�;�;�q�ð�0bcc-������III�iӆS�N�z�ꛎa|��F�����J#ooo�6m��`��_i�����ڵkgu�h����~���طo3g�`�֭��߿��+W���
6��~#  �Xq���]@A���V�� 11�v��Dtt4!!!t�Ё��BCCo�Gnn.ǎ�7��k׮m�7oNdd$,(�Ź���̟?��W�2o�<�_��믿�իW�5M����u��}ˌmDD�*�s"mڴ��V����ՓSz��	��ٳ9~�8yyy�������3y�dS�C�D������Օ-[�p��!Sc�rA��?����ˌmDDDDDDDDDDD�
��Qڶmkuߨz���ŋ<x0���V'p̜9���h߾=�g�`����v.��k�.-Z����+W�y���n����a�t�¨Q�HLL��ɉ�{΢�����R=��(;v��ۛ��8�{�9���{�N�N�LmN�8�o	���5kf�FDDD�4n۲>�a�ر�ٳ�#G����cVW�jU�N�
@FF���T�^�`kk���/#F���_g�֭8::R�vm���8p ��΄������޽{IHH����l��nݺݞ)G3�,]���K����x�
S&���X^y��ϟ��9x� k׮eܸqx{{S�jU���t�b�ߡC~���2;kDJ�����������Q�re�ԩ���&L0e���8�,ǵ�^ ::�~���͛��K/�է��72�d,3�)�
˜RX����Q�~~~x{{���L�ʕqrr�G���ߔ�d��Ŝ;w�3fаaC6lȌ38�<�/`���4jԈʕ+���@߾}�^�:�GDDP�F
z��}K�!""""���'��;$$�iӦ1m�4BBBncT""""""w�>}���W_1o�<z�!���Y�f
����O>�hokk������T��J�n0���r��r�w���DGG��W_��oZ�H�eM��qo�1����`,3�)�;2sJa�V��;99��(�…Y�p�Ey����߿�i�O�>���Ǭ������lذ��g�ҨQ#Ξ=K||<�&M2�-���ꫯ�w��2y�,�>|�0�W�f�֭�
�����?��Ull,qqqL�8�v�����OTT/������_���'''������"11�o���M�6�|�r
d�ȑ#f�Y>�}��W�'VB���$''f5���6�{�GRRmڴ!11�իW�}�R�n]RSSIOO�nݺfǦ���ڈ������pvv&''{{{RRR�S��m�8��f��긲r��q6m���ݻ9y�$�/_��ޞf͚���3f�<<<*$6kJr�*���̝_I�YS��Pcƌ�A���qvv�XNHDDDD��޽{︱����;w.���ٙ�
2p�@�̙CVV�m�RDDDDD����o׮����~�i�������̤U�V���`ggg�~�…$$$�����ÇY�hp#�yq��1.�Sz��	��ٳ9~�8yyy�������3y��f�C�D������Օ-[�p��!Sc&���d��e�6""w��� �
999lٲ��#��]�z�q��ѦM/^Ltt4iii��撙�Ibb"�ׯ��ӓ!C�p��ՊY�`��RժU��ח��PRRRHII!44___�kf���������ź�rgڸq#�ϟg��ᦲ#Fp��y6n�X�����������LN3f�/�{��t�ڕٳg���jѾN�:�;�.]�0a�RSSiӦ
Æ
+v|�k�`�<��S%8��;v,͚5�ȑ#���йsg�����͛�Z�*S�N�+�����ח�ի�`�lmmM����:xzz���˺u�v�g'"R�=z����`0�������Ջ�7R�J&O��Ν;9w�999\�x�}��1m�4�W�������m�Q�.��RLnnnL�2�e˖�l�2^x��o�EDDD�&�Ν��_���K�.>���p�v������ߟ.]���O�|�r�����l����2e
?�0�>�(o���YV��ׯ�n�:H׮]�޽;�>�,�}��Y_��s\\�z�2=5V�k�7;������ 88��;R�~}S�
���Npp��=��U��(G�5��o�̛7�x{{{���iѢcǎe����/_��?���-���g��Ѭ[�{{�b�7}�t5jD�ʕMO���5j��燷�7���T�\'''y�����-�HY��x�bΝ;nj3hذ!
6dƌ�?�ŋ72�T�^����>"""�Q��{����@			|���ԫW�5k�P�NbccM��s���*1114k֌��8֮]K�޽�_�>vvvԪU�nݺ��oC�Z�

eǎ�ܡ49����y��y��1bDE�#"""rK���3f_~�%�.]"77���$�͛GXX��ݕ+Wx��زe�Ν#77���T���?~<���}O�4������IOO�O>a���իW��r���]�Fff&?��o����R�EY�|9f�D��ٱc���V�O��� 33��;w�(�;Mxx8�������o�!66�п�����8p��[���/���hѶf͚�X���ο��/�W�n�&66����B������Ntt��`��fc8991m�4��ˆ����cٲe�l��t��7�…������fm���Oll,.���ooo���9{����ٳg��������>��&99��'ҤI�T����3#G�$11�j{��n���2d�����ș3gZ<L�ߦM��Y�L����EŖ�����Y�J��]��ҥ���Ԯ]���~����"�������A����Zm���K�
L�Jr_~��'֯_���aaa�nݺ�si۶-���f �n,7׫W/�U�F�ڵ���"&&���.���oUI_���ټ��;t�ޝ�u�bkkK�z��߿?{��)t��Ǐ3z�h�������U�V���e_q^��I�SDDDD��6m�ąhӦ
۷og߾}<��3�����}��G�:u�F����GTT6l�aÆ$%%YM}ٴiS�o�Ndd$�ƍ`��ݦ��۷�j�*���طo3g�`�֭7���y��DFF�`��2?��Ǝ����ǘ���FDDDDDD�n2f�4h`��H`` �����T`d"r7����}��|����/���tsss����f�U�f��i�&�t���̅�v��N�bɒ%t�ޝ�W�Z�G@@�%}��
 //��ƍG\\���888�R,p�3�����h�]�ƥK�

��ӓC����=z��ܹs|��Vۄ��s��9z�聋�P�������y��g�fN+���dzv��B�DGGӽ{wv��Mvv6�.]",,�nݺU�qn��^���<==�6m��������Axx8�z��/��'<<WWW6o�Ljj��a�W^yŔ�,�˯��sy���
`\*��3���������k�ѤI�W���ٳ�����O?5�3N*�={6�۷��Ύ�z�Y�f��w�Y�=c��l�#Gp��eS��i���@BBB�x�"�&66����b����S���%=okN�8ܘ|SP�f��ڈ�������M�U����/���������Bhh(���T�Z�����@ZZ�&##��S�r��I������b���������MJJ��q��b[�h����?4����?3i�$���<y2?��3999�۷��-[r��a�,Yb��_Mjj*�[�6}�ڹsg\\\HII��R4'O��~ ==���~��b�0a/��"�O�&''����ӲeK���y��7��e�ĉlذ�j�ƍ?~<P����7�0lذ"c���ё�z��6�ƍ�'�`���\�z�={�ТErrrnz޷Si���ŋ����m۶�߿���L���9x� ]�v�`0�2�����x{{���Űa�8~�8��'��w���o%�����oMN�����n�^�1�o�?,������_�-L?;99p��uS�+��B�*U8x� ��Æ
��Ϗ���b�o�RR�=ok������6�ۈ�������m��ܘ2e
˖-cٲe������VtX"r�x���9�<�f�b���lْ�U�ҥK>��^~�e���y�����̛7�񀙷���nݺu���6��k�ҬY3����֭[�l`���}�?�5ʬܸo-;t~s�̡]�v899ѨQ�[�`�ر���4m�;;;<==Y�np#�HQ
D�:u�ꫯHMM5�;�<_~�%�k�f��@�������СC���T���پ};���T�^�=z�p�2J�d��3�}��GxzzR�Z5�T�B�Ν�裏8r��8�����׏��`�~����С���<��e_~�^ϷC�MN)΍֦M[�n�'�ED��g\*��5�K�Vui����Z��'�dggW�8}��᫯�b޼y<��Cdgg�f�����'�|R��˚b0L?���X���y��T��m���V��������_��;Wʆ��7o��6o��6#F���pD�.b\f��_�Zo��s��B�HOOgĈ���ҷo_�z�-�zcF�)S�X���`��6+�x�"aaaV�K5j666���r���B��ѣ�EYib1z���-ʺv�
��
��J�*�=���\6m�dV��k����1e�*�}����f͚��Q�w��y�,�:u��gޮh��f�O��`0X��y�}����eu�iӦYckk˿���2�/?k�����;|��			)�nEDDD���{���/$%%ѦM�B�5lؐӧOO�ΝM����8;;�j|'''������"11�o���M�6�|�r
T�lll0\�z�5j���dѮ��mMݺuIMM%==��u�ե���ڈ����������$&&7����ɓ��M�8�ӧOӲeK�l�B�ʕ�ꍟ��l����l�Ÿ�IϞ=iҤ�Y]ӦM�ѣ{��!88���ƍ[��&������K������	&�b�
����&0\�Jw_�|�2W�\)r�JI�l�Ң��(�a��� ca�M�����S�8z�(111DGG�>K/ϱcǀ�ˬ�ҥ���[����vв>""""S���,[����T���Y�t)���<��3�v�<��-�ȑ#���r���Sݺu+��O?�4���|���dffҪU+\\\�YWΜ9s�>k׮
�g�}FVV�N�b��ť>okc�JNN���XV��DDDDDDDDD�v��|QX�?��������M���w����i�a\�g���V�|�ٳǬ�5Ɖ#��QaY���M�6xzz��?��R���@�N�h߾��mi�q�q�5��b�c6�;]i_�[�n�E��h�///�|�Mv����n�xc�k��C�B�����P�S��߯�ED*Xq��y��gٵkG���'�4��0a���1c���w�q��ƍg֮I�&e�1f�-Z��ŋ-&��O{X�vm���8p ��΄����#�<���Y�b+V����â]q���؞���ݻ�����			@�&눈����������6.]�T�lǎ��_��Ɔ���B3;88���Q����:t�X1���p��1Z�n]��%���M�0���H����֭�լ)�8Kz_z��E\\۷o7-7T��E�����r�4�,((�4O�`Ȑ!4k֌z��Ѻuk�Ù�9::���Nzz:u�Ա��z�j��w'(��)�fJiӦ�|������rVko׭[��7ҧO����u��,Y��~����9::�q�F�J����\�2���gĈ������T�ȼy�x������ޞ-Z0v�X�ϟoj7}�t5jD�ʕ���)�ϩS�2x�`j֬���=̝;���mm�}�R�zu���EDDP�F
z��]��!"""""R��=E�M�6mEmzP]�1f�8p�@�����f���dff2�|���
mk\����lڴ	�Q�F�����Y��(i,em�СԪU��>����lBBB�Q�#F�0kW����s�accúu�駟�4T��t���L���4�l�…�[��cǎ�`�ƍ����Yv���'a<x�j�qqqeߝ��3������ݣaÆ,Z���j֬Ɍ3�1cF��
�`c���˫�?4���C�>}�5F�j՘9s&3gμi�✷���fÆ
�={�F�p��Y���4iR��D)��~�����CDD�"�q���X�p!�{�����萐�
�O<Axx��|���9r��2gΜ"��ٳ'���lذ��|�QBB>� M�6���������/�Xd�S�L!  �͛7��ٻ������A�C��#&r\���0gfc�rX��6�Okl9|�9�����g���!F�-	Ӳ�!
�tP������.�y�o�����^��z^׻��]��z�>���U�>qKKy�^�:��ά_���+Wr��-&M��5�Piޗ�-[2e����+���Ohhh��l>|����|�ԩ��۷����gϞ�|}}�|{��BY�� IDAT����q"TA�������LjԨ���KTT˗/���Z?w�V�*����V9E!�B��h���XXXhT,���R��B!�B!�B������j�"22�MVVL�:��c�R�Z5���BCCY�~=���lݺ==�"�ӧO���???<<<�y�&:t�ѣG0a���ù~�:���t�ر�q;w�L���~�:���/��$��2e�V�\	hO��{_���z���N�v�puu�~ %%�G�q��}N�:�g�}F�f͘={6�oH,��]���y��1���������ٰaC�m���3+++�q��͛7y���ΝcܸqI&�o�V�O�>KKK�=��o�ͯ��Jvv6.\`�ȑ�VT)�{ZѤrJ
		Q@9rdG$�B����}������L�W����'�f�R��CCCY�f
FFF�B!�B߱c�dj!�S��˫��s�aÆ1|�p<H�N���lذ�v�ک��,Y@ll�Vŏ�����͛�a�&M�IJe�X�l�F�Ν;�������1cF��wssc�����3`��'�/I,���֖�;�k�����}022b߾}xxx��_��營�_��4n�///����~����o�>�֭�Ʋ͛7��9e�4���ݝ)S��q�F6nܨ�wѢEs��%~��g5���Ԕݻw��[o�o�>��ۧ��֭[7n\��<��)e�̙3�[��y��1w�\֮]KLLLE�%�B!�o�����V�bժU̘1;;��K!�B!J%//O�<J��_QV��HLL���4j�}}}jժE߾}	g�������o��Օ#G���[oQ�vmhٲ%K�.%""###�޽Khh(fffj�'qrr�v���ٳ��w�Y,�MI��U5EQ�Ea``��U��|�2�}�=z�~��T�V
CCC�5k���3�v�"!!�LS��͛���<�:u�```@�N����<yr�n����ɓ'�e�ڵk���!�����Ӈ��%K��h�"6mڤ�������+�'O��ҒjժѪU+���tNT��R9�dff�h�"����%�:'�Ν;�^�zG(�B��T8y~999��[BTvǎc͚5��ZHHHE� �B!�x�������S����w��ѭ[7�J�ծ]�����ill�O^ޓ�=)���W��֛8q"'N|�K�����`��R�_����cϞ=%Z�8�[q���7Ng���c��lbee��͛�=����Pa�S���˭L�����GJJ�F�ݘ1cHII)���B!�B�L�\��Ν;+:!*��;w��B!�B!�[�m唴�46o�̡C��}�6��գW�^L�2Ec�1%�%22��˗��~�ڵ+|�����7##����_�E�z�x뭷�4iZ����Mll,�����Ӈٳg��P����C������[XX`ooOpp0cǎ��Ĥ܎�B!�B�H���e/((gg�C!�x�\�x�-Z<w�		�ĉ���F��,CB!���\&�ܿ��'�����%''Dtt4���k��b�
���@VVaaa������)���L�6���xu�7n���K\\�֭�J�b2S�N%55Uw׮]���%����GFF���Z����Htt4���6���B!�B!�B!�}�G���)y���3gX�n;v� //�Q�FaccC�v�y�B!���29e�֭$&&ҰaC�.]J�V����gѢE$$$�����:���:t��,\���ׯ��
 >>��m���ၵ�5IIIxyyMhh(C���q��xzz��+���ワ�/jrJdd$�Z����-22R�S�B��XPP999���LYQ�(�	!JO*	!��ȑ#�ݶ333Y�hÇ�����C��p�Bv�ܩV�B!�x֪<�Kٰ���x������E__��_:�5����qttD__[[[5yD`���xyyaccCժUiڴ)������i�������jy�{���/^�<Nb)�I�&}�B���ԩ#F���0��4F�!�S�ȕ+W$�H�Rڹs���!�xf
���/???RRR=z��6f�RRR���ȄB�{.+�\�v
��_]��}��\�~]k��Jy��W��mW�\`��:������fmm�>W����U��ܹ����ֺJ��G!�/�>��>����B��T~�䂂�ԛh�B����͛lذ���H�߿O�&M7n�藖���͛9t��oߦ^�z��Ջ)S�P�fM���`���7���ҧOfϞ�V���e��̈́��s��
�����w�U���	�ԩS��͛73w�\lllشi�F��t�?i��vZZ���t��sss�������3v�X��3�B!��3KN)��'ɟRP�j����R��a�������Zm����s===��J[��(�6]�	!������LPPPE�!D���B!�B�۝;w?~<�n�R�X�x1�=bРA���'N$11Q헜�LPP�����bll�1�ԩSIMM ++�]�v����Vd_�n[�nU����p��YΞ=Kzzz�D���IKK�H)��e߾}ddd��訵��ё��h���6lX�bB!�(�e�
��C�N����u��bcc5��Ϝ9������YZZ����޽{u�Qfff$''��������2��m�v!�B�\�	��0��������o+:!�B!D9۲e�nݢu��|��gԫW����������WM�غu+���4lؐ�K�ҪU+���Y�h			������1v�ƍ����W^���___"""��ݻw�v�Z������!,,��˗�c����5���	�iӦ���b``P�]ض###hժ�ָJ[dd�$�!��B<��)=z���///�.]J�֭���gٲet��Mk��?���K�ҲeKΞ=������W����,X���;͛7��ݻ�m�6���ٴiS�bmѢ���$%%i%�$%%�}�B��1b#F���0��rrr$9EQj���XXXTtB!�s/���E���2zI;v�y��aee���EDD�������_fΜɡC���S����1�����޽{�rccc�߿O`` �����у�Ç3|��b����R��(�~�r��E�q�MAM�4��#�ea�Ν������s��2~�x:ĕ+Wpuu�Xfee��P�n]&L���ֺukF����0a�&66��FFF̙3�ıv�҅#G�����Ʋ��8@w2�B!�B�۝;w���$;;nܸAݺu���)dK:�Ui�++�ϟ��LJ��HOO������ˤI�ԋ'e�믿��ݝ���[kYE!�Bh�~�:��?�]�<NHɯ}����gmm�>755 77Wm�={6�~�)'N��ĉlܸWWW���022*V���>S���Ν;���h-Sڔ>BQF�Y�!!^ U*jçN�*4����???F����9U�V��ܜ1c����~Y���ۛ�]�R�Z5���7n�6m��L�Y�&���899aiiIժU155U+����^���166��ѣZˎ=J͚5�۷o��B!�(){{�B�n����#�"b���`Μ9���GGG\]]	 --�\�;`����INN�Zv���X���s��M�>׮]��ޞ��z���縗VHH~�!~�!!!!e2��IPP���dgg�}��
����Ō3h۶-�W�����ܻw�G�q��]�������i޼9���#''�L�?e��޽[�c
!���r���y���˃�<ZZ��M
���/r;����~`��ż���dee�a�Ȯ]����ª��O�U�K�4���[������i��B899���'yȣ?��sY9�V�Z������^�_|�������'؋R���5j���	�]�FÆ
��bbb�:u*�����!�B��䣏>�ȑ#�~²0̟?��Ǐk�������/�/�G��֭[��O?�5��R������l"##:t�F�s�Ω�DY�3gΰn�:v��A^^�F���Ɔv��=ոBT&����7��[����ό3*6�b(�E���b��9r}}}\\\prr��Ύ:u�p��=N�>M`` ۶mcժU���|�����KE!�B�W^��?�$!!�ȿ�4h��ALL�:uR�cbb���,�MMM<x0�&>>���e����6lX�����#//���tj֬	@BB�V���.fff$''�������Ʋ��T��B<�cǎ�f͚�CQ���f�
��R��?ն��@,--��B!���
�9w�ȑ
����Ǐ��ܜO>����pN�<Ihh(&L��|��ǜ={�\�ߦM��㵖)�)�����S�{����8�,Z���ÇciiI�
:t(.$33���2����_~�^�zlذ��u�r��)5�Lh�3gG���ښ�'O�e����O����V�u�֥O�>���q��I4h�������+:t!�BT�.]��j�*������b�ʕ�����{����������Ç��Ʋl�2�u�V�m�����������7o���
���ʕ+W�8f�:u���o���$11��˗�z�um[�����5��V�
�BQЕ+WعsgE�!�(;w�,����rʋ�z��xzz2k�,Ǝ@hh(k֬)���B!�x�)ӲTT����رc=z��u�������A�̜9ccc6l��
ظqc�Ǡ$�LN����̙3��c��������(�\������GJJ
�G�V�ƌ�����������$^^III|����ܼy��u�ҫW/,X��8e�V�8u�+V����ä��ҨQ#F��…ջZڲe�w�F��=�
6�e�V�\�s%�?����C�r��z���޽{�*�����h�"N�>M�5�޽;�|�	vvv��q��EZ�h�+���իW�VM��Ç��?��͛7�x�zQ�$����ټy35k�d�����꫅��o����OǎY�f
3gΤiӦZ�������ǿ��/.]�D�ڵ�ի�-�m۶Z�u�V~�߅X�l௿��~����ۗмy�B�m^^?��3�1QQQѭ[7.\Hǎ�ֻt��W�����T�^kkk̬Y��]�v��L!�����}���Oll,��Ʋɓ'��ǏϡC��r�
��������ڊc���xyy�|�r���߯�ԩÝ;w:t(�����
�ѣ�w��/�P��;::j�+�~��v�.]8r�qqqZ�����%�!Dadh!*��� ��ʲ&�S��o�����V�bժU̘1C�I@!�B��8x� ӦM�G�888��;�j�*222�\�֭[,^��^�zѹsg\\\���^M�Q����z�j�~�mu���ܿ_�����ӧ�իӦM�hW��_FF�/�{�����ooo<x���ÇY�r%ݻw�W�^lڴ	x\���Ã�]�ҳgO>��������cǎ�HL�oԨQL�>]��]q��_BBnnnt�ڕ޽{�l�2���rq�����GGG���C�N�066�����,�Ĥ��\.\��1�����֮]���ܹ3�
bÆ
Zs����L�4������������
Q֎=���-_�5��'���$''�o�AXXX�Ǭ^����-[������nݺENN����X���ݻk|�(=zD@@�xJ�����ѣ"cpuu����dddP�F���`ǎ0��'O����ݻw	

�K�.���υ�accÛo��͛7����u�	��͛���jbJI�???rss�6m�S�ڵ��ՕG���㣳Ͽ��/\]]9�<>�֭[���`oo�w�}W������Ύ�[�r��urrr�~�:[�l�}��8p��uO�<I��݉�� ++��w�w�^�u�FTT�Fߟ��7�x����������lRSS9}�4����oߞ�7o>��!�O�`��g���???��뇉�	����jՊ+V0p�@����	~~~�9sss�V����9cƌ���SS�o{�С,^���-[b``������L�0�O?�T�7w�\6lHժU���*hΜ9>�Z�ja``���#�-*�~��v���166��ѣZ�=z��5kҷo�!�B����'�Tė��899�z�jV�^͘1c*:!�BT7n��?�ԩSܿ�����Lpp������t&M�DXX���#''�.�������L�8��۷s��MuAAAL�4Ig���7iii�&e�����������;w

��/���r�JBBB����޽{|��7�ݻ�����#<<���,������Y�j���2U�RY�5j0q�D�>%=�S�N%::���,RSSٵk���ԪU��
���Ɵ����[׮]ͩ}���222hР�j���fi�{vv6ӦMc˖-��7n�����ٳ���U��۷����w�9::���Axxx��-Diݹs��Ç���Ɯ9s�t����DEE1i�$���qrr�ƍ����i=������|����L�:�G�1m�4._�Lvv6?��͚5�̙3�X�B+�����dZ�j�&�u��	nܸ��}��ܷK�.q��YRSSY�z�S��9s&�����;v�f͚����g�}Vd,S�L(4����I�&�{_>��!C����Q�F���၃�'N� ++�s��1x�`<x������	E����$''3z�h233y��w�����������ȑ#INNֹ���+o��ǎ#==�ÇcmmMvv��{2g���Ҙ<y2�.]";;���"""hݺ5���E0!��eҠA������ **�m۶ѻwo�~�j���ݝ��0N�<IXX}�VbJa�t�<����?����ٱc3g����D�ӯ_?����ɓ'�m�z��̟?��r��q֬YC���u�/�~��v�5prr"&&�k׮�}�]�FLL...�<�B!���ONB!���o�<N舌����|��W:�Rr��U4h���/QQQl޼YgR�֭[ILL�aÆj_4h@BB���Z�4mڔ��H�,Y��,��5]'���oBBB8z�:uLDD��8qqql߾��Ǐ��B�/_NժUٵk����՟~�I]���4lذ��KI�u�ƍٽ{7���j��ѦM@sj���)]�tAOOO#9��)}Js�����m۶q��IBBBh׮��ф��j�תU+��6���髯�"%%���i֬FFF888��_3k�,RSSY�~}��8q�ŋ0o�<����e�6m��5��7ҤI��֭��y�m�6�1��DeZW��Z�gf~.�m۶�����S��`„	|��4n�}}}�t�V�:y�d��6��u���?h%Z�����S�N���}�t�P�i�^�u~��7��[�lɡC��ԩ����nݚ������ٓ��T���ڵk��>={�d��ݴi�ڴi��ݻ�ٳ'��7�֭ӹ~���ٽ{7]�t��ؘ7�|������Ǐk��_��	�͚5C__��իӣG�D��={J�/B!�x��?ն��@,--�*�
!DyIII��ޞ>}�p��U���5*@=/tU}Vڞ�(��/�U�O���PZ!!!|��|��2�KL�S�B!*@a��j�駟���iݺ5?��_~��z�|�)w�S�$,X���-�����ٱp��b�}����*+��Z����R�?��O�6mJ����9������ϟO���100P/(?x�7n����z1855U]�jժA�������+++

�y8�ݻ�.W�9�d��~����lll�_�>�ds˖-�~�:�/_���Bni����������Ɔ�U�ҴiS<==4��P�Hnܸ��8M�4��#DyR���9s���J%��*����2f�>|H���Y�l��r�"����ֺ�����婿�������{����t�� IDAT�5��رc���#44�����и�|�M���Ģ�>}�V[�Ν��ӻ��Аq�����C�l٢�,  ���\\\022J��(��+A=�r�saS�-Z�Hk��*U����k�Z�离�;U�h�:ɿ�~�A�3f��j�ر#���@�F�8p ���նڴiC^^�Ɲ�B!���J��W�zu<==	

�ƍܸq���P<==��tBQ����ݸ��n۶m��T�>��#��/�3gΰn�:�͛�ܹsY�v-111���*:!�BQ�[�n1g�Ο?����)	���h߾�F����V_増r��BY����Z�(�
�ѬY3��r�RW"I�-��K[[[��^�077��իܸq��M��!//���tj֬����X�C���?
VNQ��(S�(�v����9v����*�Ν�X?���+W���R뒐��>�s��F�j�Ҧ��<)�7���E�S�r�2e�����5k�����5��_�(۷o����+++�e�7��7������L��%#<m,���E
�3�ѣGO\���|������I�=���}166������(A��ݻ���J��С.\(��
R�WJ
R��~��9E�5��<<<x������"**
x�3һwo
�;�S�dP!�B���x�
�����og̘��\�B��’St��z�隦���9Rfc���ܷ�dff�h�"���K:t(.d�Ν:��ʫܒSF�Y^C!
�s�ΊA!D1����돂�+Wr��y5jěo����5mڴ)����IzzzŎ���#Os�����l/x{A���\�z��Ǐ��r��9��}ڴi���U�V-����W��:�-[��J�*\�p���\u:]�)_�5ǎc̘1\�t	===�S�����Ua���u�����	QZ�K���7�|CHH&&&�ٳ�:u�h�Q~�K~�E��'""����B�S�'�=M,��M\hݺ5]�t!22��G�ҭ[7N�:E\\;v���V�[����ƆӧO�Vt)���X�7o�sy�z�t�+ɂEU{�ZKa�4J�^zz���%�+y„	ԪU��>��ӧO�����?��ք�����BQ��Յ-QrNNNSZ
!Dy�U�j���l޼Y}�v�Z֮]+��D���HIIQ�v3f۷o���OgYQy���>VVV�1���BÈ#�O!*�'N�����ٳ4h����\O�3��_�h/��A�Z���O�C�y��[o����U�#77�M�6�����o��VS(�.���1M�4!33���Ξ=����V	�֭[S�n]bbb���!;;�ƍ뼀]��w�^N�:�����V������$)�6���I�2q��]���
}�r��yf͚���:��ʿ��&1������?�ott��*L�)i,eM�b����]5J�������sJ+��{�ֹ��c�T\�]�v�����|��0�6����{�=~���������~��wfϞ]&�B!�B��2���ӧ�իӦMS�edd�v�ZL�Ν4h6l ;;[k��2m�4z�聃����V�"##C���۷Y�d	�{���ё�j�)�`oo�1m6��?����=����9�{I�UY/!!777�v�J�޽Y�l���j?��СC�ܹ3ݻw����o��9^~iii�^����~[=����Z7���4����С���j������:����ʼrJ׮]��B!�O/**�>}����Ȓ%K�{��Q�n]��}����gٲe,]���-[r��y�-[�շG��������ҥKiݺ5���j�nݺ�8^===���r����s�����q��i&L��̙3�ܹ3FFF���o|��W�8q�.]�0|�p��Kz��Һuk���!77GGG��$zzz8::��wߩ����$��{Ϟ=�g�����Ӽys�޽K@@۶m��ޞM�6��RJNN&))I+	E�**�tKB��f͚q��i�?�&�GVV�G�&##�%K�:�<�'&&���8�t��ı�l��رcٺuk��ƎK@@[�la���Ŋ������#G2{�l���[6n�HHH5k�d̘1�J�L�4�U�V�i�&&N�X�9�cbb�J�*�������/�ЫW/�v%Ѱ4S$)�����_���f��Z�O�<��+KVVV��������|��w4�Ç��v�B!���)�P~��7���hܸ1�v�"..�	&`ccCPP��z��ޤ�������L�6M�V�ƍ���Ǻu��sk7n���Gc���d����w�z^/--
WWWujsx�<RX5̒�?>gΜa�ʕ���aaaArr2˗/���8�sݒ�b�ԩ�YYY�ڵ���\,X��u�4�Y���p��YΞ=Kzz:���:c��>'N$11QmKNN&((���h|}}�n�{R,���###GGG��9::Mxx8Æ
�}pE�S�S�����ӓ�<�Q�!��K�=X�x1��������o���/\��s=ggg�4iŸ�Ʉ	ppp����?���;~�x����v����888�����ױ��*��`Q�)4��U��YX�|9���\�~z��I�Ν?~<Ǐ�gϞ�X�B����(I&ʅ��.:+	�J��&��:�&L�I�&������B�N��߿?۶m��Ȉ9s��+�)s秴�&YI��R>��s�U�BBB���c��s��%66V���(={��:�����hҤ	�="  ��3g9�R�v۶m:+�<m,�z��8;;s��]V�\ɭ[�=z��4C�y_�5k�̙3���b��O,������f���j��V�^����#V�X�urK��/j�:E�����S�쟛�˪U��«��D�&M����ܹsZ�t��B!�B��r�H�1��낚6mJdd��H@||<m۶%((��'OB�v툎�&44T]w�������H�?�W_}�ѣG�~۶m�ڵk4jԈ-[���͛�t�R���T�P����駟�����ŋ����O>!==OOOLMM5�V*�t_�7f���DFF��l#""��w�O��O?����رcG���u�Viذ!���DEE���C�
HHHP�9.I,�约.Wڔ>��P�S%-�+�xzAAAZe��B���P7o�<>|�ѣGy��͛7��Ņ˗/�y�fv�ء��U���ټy3�֭㧟~��4m�/^��������???���+>��۷133�w��L�<SS���ܹsY�~=���:Kn���u�u�VBBB8p��/_FOO�
Fǎ��)�.J�6m��U�T)t}�U��^�-mr���^�fM|}}��o��� %%�5j`ggǴi�h֬��~�����/8z�(�ƍ���ѣԬYS��C�������뉌�d��xyyakkKTT������S�Z5����uBCCY�~=���lݺ����ӧOgÆ
���aaa��Y�011�ĉ|����.���p�_������Ϗ�:w�L���9s�����Yy�ib)/S�La����\�О�J����$�s��q�qvv��ٙ���S�V-�޽��ӧ	

"00��ңG�	(���0F�ŧ�~JӦM�p��1ǎ��W_�J��Y�&iii�޽�!C������a~ӧOg�ڵDDD0t�P���h֬			xxxp��a������Tcƌa���1�/��GGG

�p�s��(�ϐB�4F�Y�!!^0�4�B�$�(��
�.���E�o�������NE޴iS<==2daaa2��~����<Ο?�?���K���x�OE�T����P㰳���'�f�z�}�СNNN2q�DΞ=˘1c�x��$��pwwW�%;;;���˽{������ܿ���@�ѣÇ�Y=:?%�d������+�zxx0s�L:�ތS�X.^�<Nb)H�G�#^zyyyyO3@PP���(�|-�xv�Q!*�R100P���74h
4Й}/ĦM������o��aÆ\�v�!C�0u�T������b+�����5�+�oÆ
L�>]}moo�/����8�o��חI�&錡s��:t###F�EHH~~~�J��o�<y2�F�"88�_�����(�4^aˋZ�S�NDGG��k��sܒ�/���l>��c֮][dE��U�2s�LV�X���a���ԩS���5�[XX�k����޳gO��q�c���ݻ�#F���

	�:IX���޽{888p��y��4lؐ��H��y�y(��4
�q��1֬YS�Q	!^d����}�r+�����<ɩS��Ǐ�HN�ҥ�ο����:t�[�n1gΜB��Rnttt$;;���H��3322�޽�F���ʟ�egg3n�8hڴ)��k̒쫲~TT�����-;t�1nxx8�~��:������899i�S(Oa��t���?^�Xx���{�/GGG���*���g��7�*��)B!��bu�ޝ���ϟO�~��Y�&III�t�۷����j���|������<N������ť��/��Ê+ؿ?���ӱcG�͛�U���/�6\]]i޼9˖-#**����6m���3�����А�w�����G�.ָNNN̛7�={�p��]j׮]&���)S�]dZI���������1c>>>8p��~����tLLLhѢ}����ՕW_}����1�-Z0q�Dbbb���bذa���S�^=��~~~L�>��G���,,,�РA�>}�e˖q��A���/�ׯO߾}�?�βĥajjJTT+V�`Ϟ=\�|����4i»���L����d[B!DA]�vU�B!*B���']�_e�ʕ�?�F���obmmM�6m�*�)c�Z���T^�}U(� �Ί�������Ç�g�~��W6l�@@@3f�К�I���I�(mU�T�Z��=�ꭨ\$9%��d�=͘!!!�8qx�9&��BQ�����/_����5�թS�)S�TPd�yW�zu<==�5kcǎO��f��;,�xlll���)V߂4��[�nt�֭��k�.�JHa�����)�&O��$�����&N��ĉ��풼/5k֌e˖�lٲR������Z��I�4i�?��sYaǤu��l۶���=�U�^^^Z�!	!��M�V!JK*�ũS�8}�4S�L�m۶������agg��͛�5���%III�ݻKK�"�*�Y}}}�S������R�Z55jDbb"�O�֘r[�r�,�_����Z�nM||<�֭��?,r���kI���2x�`L||<d˖-x{{��ҠA���bbb�ԩ����ZRfff$''�������Ʋ��T��xyHrJ9s��֭cǎ���1j�(lllh׮]E�&�B�JB���~����dgg��+�йsg&M����yE�(�co��nnn�Z�
�3f`ggW�Q	!�B!ʃ2-�BWPP�~�mE�!�3J�G۶mu�.��={���ςpww�y��ܽ{����mۆ��=�6m�X'**�>}����Ȓ%K�{��Q�n]��
���bɒ%���r��E>����e~��g���h׮�6m��͍�۷ӭ[7u�===���r�
VVV���'y��w�v����g�4oޜ?��ЬtRP�=���ˋ�K��I6ʍ%Ž�&�-Z���LRR�VJRR��G�<$9%����R���L-Z�����,��C��p�Bv��I��՟IB!��ܪT����NNN�xA�ϏB!�/�#FTtB�LNN�$�-e��2a�>Lll����FFF̙3G}ݣG���X�x1�/��…8::������x�F5���I�(3d�ԩS�����鉱�1K�,�Z�jxzz2f�>��v�؁��	u���Ν;:KKK���[�}-������女�vQ7��?�C�q��\]]5�YYYi�G�.]8r�qqqZ�V~6J��"^\�<=#���O�������HIIј�|̘1������W��	!�B!�B!�B!D�LF9w����Y�&���899aiiIժU155U+{䯴1o�<���G���100�M�6,[�LM@ٱcl޼��ÇS�N�۷/,x�}^�|97o���ݝ
���qww'%%EM�;w.
6�jժdgg�x_�k�С,^���-[b``������L�0�O?���LLL���c�ȑ���S�jU���3f�������8����cll�ѣG��=z��5kҷo��+^\�e�%ie���̝;�dQFF>>>�߿�����z����[o1i�$غu+k֬Q�2SDGG���Ʋe�4~�����������_%���`��������А>}�0{�l�
'�o�f���9r���Lz�ꥎ�_ZZ���t��A��������3v�XLLL��h
!�B!�B!�Bq���B/����p��	9r�M!^haaa�8Phߢf�055��?��?,r{&&&xyy�\��B
@�5�?>���b%�m���?�9=��o���o����ׯ�����W�}-,&]�f��%�V�Z������^&�ԨQ'''|||�v�
6�ڵk���0u�T����ܖ�\*�rJqx{{����&qdgg3m�4�l��������ƍ���2{�lrss�ē��ϓ����h~޹s��ׯc``@׮]�c�ԩDGG���Ejj*�v����[]������+���������͏?��3�n߾}ddd��訵��ё��5V!�B!�Bh���#//���B!�꣏>���Y�3gΰn�:�͛�ܹsY�v-111�8B!���?~<�m���XZZjMe$*��r��iӦ���b``@@@���m����IJJ��ˋ��hBCC2d���gϞ%&&GGG>|ȡC��R�
���deeadd����رc�YY�7��ӓW^y|}}���P�O�m�Ƶk�hԨ�}�666�={V��f����j�Jk��ɰaÞ��	!�⹱s�N�R�aQ)�ܹ��CB!�B���9��=33�E�1|�p,--��S#,\���;wjTRB�����͛7�u�5jԠ}����ĪW����'�f�b�ر����f����*8:�=��e��'��/����&��߿///uή�M����ɐ!CcȐ!��ۗ�g�r��)9y�$�������/ǎ�O�>jrJϞ=�����+++�����޽{��Ç���A�6m�����'�f����ŋ�ㄗ��4i��G!��CNN��B!�B��R��d�����)))�=Zm3f۷o���77�
�N!
����͛7III᯿�⯿�R_ߺu���n޼�.���Q�}�ؽ{wF/^o��nnn�Z�
�3f`ggW�Q���\WNQ�5W�\(t�������ÿ��o��rxx8��������w�q�59�J�*t�޽�8����禦����mW�^���Vc=]��w��ρV�Ҧ�B!ċ/00P�d�B!�B!��֭[�Y��cǎ������5�ƍ����L�����LJ�����_Q�^=�z�-&M�����f�	7iiiӡC����>����رcu��B<��Ʉ���Tt(��ܹs�۷ok�{��-5��֭[ܸq�[�n����1F�5x�Wx�W�W����?����~�����‚z��Q�~�
�S�qrr��ɩ���%�̨.N�u��)�甾�>��������r��>L�N��S��۷�رcdddO�v�S�N��������+q��Z5�ë�_�J�eJ��m!��Ť�DB������A�!�.%D��4gB!*���t&M���
p��51%���l�M�F||��v��
|}}���cݺu:��+���GFF���Z����&<<�aÆ=�^	!J"55�ݻwā^�����B�L
��<�ܹ�^�����333���077�~���h��������4dB���s]9� KKK���ػw�:�ca���GLL[�l!==��]�еkW����ꫯ�����)�F������ӧ5��*��JW� IDATgffFrr2������i,KMMU�!��r8y�$;w�dĈ���\��\�����Q�R��!��]`` W�^�A�|��g�jՊ�gϲp�BRRR4�O۶m����ښ��$������&44�!C�p��)�7�FFFЪU+�8����HIN������c��턅���o3t��
�~&2I�G����222��̌�u����t�Ё�u�j��7�M�B�"{��Sz�쉿�?,��ݝ�͛s��]ضm���lڴ	�޽{�j�*v���&�t��ooo�o�@�=�:��a����X�d	���\�x��?�\�o�-HNN&))I+	%))I�#�B�����I�������\�a�2ҵkW�o5!�B��?�MQ�EUFZ,X�[[[���X�p�V������E�
hڴ)���2���0�R�.^�@�ƍ��5i�D����=|���}�v���[����ݻ77nd�СԪU�����NN���U�Ĺu�)))���hU3)�lRp�}}}5yDyXXXкuk�u�z���L����*~!�xѽP�)&L���������⢱��Ȉ9s樯��̰���ԩS�h�B�'�q������ի�l��X���Ņ�r��E�L������_M8Qt�҅#G������2��J�nݞ:&!�B!�x�I��O�IS !�/*��z���5��W�r�
��9VBBB��R*���h-S�tUAB�^^^Ǐ�?��<��z{���YD�Y�Tr�4+C�ٲ��8�F��-��+�ɨpH�+ 2
�X�P��F���^�k�7�����/�s@@��������Y{+z�{�NILL7n�`�С|�����all��}����H6���R��q�ׯ_W�V����ܨQ#:v쨑@�n�S:��t�I���u�[�jԨ��CB�#zKN�JFu�֭	

b۶m=z���l

177��Ņ>}�h̷���̙3Z��F�"**�ZZ�4oޜ��|||���o�{�./��>|Xc���ٸq#���̝;Wc[bb"�[�fܸq��B!�B����A�z'""�}���;!�
ԃ��u�©-&b���dͼ��r���ٸqc�m�1�+D��p����xyy��3���o�R�xꩧ��ѣGs��
nܸ��4֤I:v쨼�t�³�>K�N��ر#�:u�K�.s�4iR#��Ѝ5J~�BTZ���R�\###�-[Ʋe��lll��W�X��+�nYq�744���ww�r��R�$##�nݺ�����s�pvv��^B!��5�.]*��`aa!&L 77###:D��͵���"eY�?x\��1::���$�
���]��-D}3c�}� D�STT$�)B!��ݻ��/�p��y^|�Ee����ZsMLLHKK�U��ޡC�����ɡC��rrr�9B�{�4Mԉ'�$�	!D�U'�S:GGG���+���qss <<�vEB!�5e���;v�̄���rss���%!!KK���Jv\���ٳ����s�N����9s&fff4Ho1	!��+]7(

4hL�8QQ=\ll,���|���ܺu��m�2l�0���y���y�gϞ�h��>O�*JQW�7�_~��O>��?����~���O>�Dk�رcپ};���ѷo_n߾MXX���XXX�����{W\\Lzz:=z��_�~dee�������n/TփB��y��x��X�v���gӦM�^���C����Pn[�M�6�r�B�'NH�^!����P�F��qxzzKff&���������I˖-��B!ǎ+w�����<y2Pr��.:s�F"�Î���z�jlmm111�k׮��ذj�*


����t�R�\;::Z�z*��E]t��]N�<��ɓ���o�����f̘�ԩS�����q��
8��ɓ�9s&��ݫ���֘��Wc�BQ�f͚���)׮]c޼y6����s��5�������Ԕ.0{�l����	

�e˖,]�T�ۮ];���)S9r$/^�ڷzl����~�B<�5j�ȑ#�%##��bff��իy��'?~<���J�"Q7�K^�j`�����7C�S�d������퍷�7�/��B!�c���Bi=Sdeeq��iڵk�{�G۶mINN����&;;{{{e�����l�������Y�|�ޞT+omu��w�}�+V���ùs�j9BQ�����V�/�ݿ��ׯ�`��߿�￯��4,\��]�v��O���ͯ��JQQYYY�����SO�…���:	�4��B]|(�6���m۶�iӦ����h��mݺ5AAA�T*LLLhҤ	FFF����l߾]��Ɋ+�֭M�4�������ӪU+��HLL�u�֌7���X��WӦM�0a!!!dee���!�-�K�.L�>�ݻw�J,gϞ��u�ҨQ#iM$�h�����T*T*���B!D=p��M6m�ĉ'(((�w��̝;��+Wh\$���'00���xnܸAǎ�8q"NNN�Ż҉0�K�#66����3q�D�0aQQQ�����oVk�w��!  �#G������;��+��p�BZ�n�g@@+V������v\���xyy���@˖-�0a�/�E��IJJb���|��4m�;;;\\\�����O?���4k֌1c���憡��r,QQQ2�Ν;+�caaATTs�̡M�6=�B�0��U��V���Q111�f����y�bbbX�j0@�!ըF�ѹsg>��S���HNN�wH�'NF�v�8u�O?����K�.̞=KKK�{�9BCCqqqaĈz�X!jV���Y�f�Ƙ:��cǎ�FFFJ��XZZj��544D�RHFFݺu ##�s�����L�V��p�```��3�1c999�ٳ������_��ښ���K®B���"�BQ�ݽ{'''<Hnn.EEE���OJ�Gi��������NQQ����d��߿��������/��VVV8pࡿ�W&޼�<�x�
"##�~�:������"""'''���޳~�z�ܹ���QQ���<x���|nݺEDD_|�ּ�>����h������e۶m8p����o���q��=�ܹ�W_}�����Ç�����&ш#���'..��q�kեD٤zT����v���<��34��?�����j]'//wwwz��E�-055���C�=��iѲ^j׮]��ёN�:Ѽys%a��7.�,��Ohm۵k���
m۶�y����ٓw�y���<e���Y�f
����E��iӆ�Ç�m۶*{`` nnn�)�u�ܙ�˗���SW�����ϟ���!�۷gΜ9�qJ����T�S��o�fɒ%���C9˖-�*��~oJJ
�ƍ��А�;�h�"�޽[�s&�cƌ��‚]�v���������_��W/��B����舱��F)���pLLL�={v��%���'�x����Off��k8�IWu9!j����#��"�BQDž�����]���GѿRRRX�j���s���HMMe��\��޽{����ڵkINN&66kkk�*#�f>}�4���;fff���333��̸|�2gΜaȐ!��;�z�*ݺu��?�������z�j�\����quu�xO�^�

�(�V�q���DGGcbb��͛�����ѣ���i̻x�"�����ٓ;v���fff�޽cccBBB����N�<	@�����V��<y��ӧ�y��u��������ɓ���ajj�ܹs�4i�Ƽ�V����b���\�p�-Z��k��d������	 ..���L�5kF�޽�:u*����*�u�˫2U���wYkK����'�@�RJbb"���xyy��{�1r�H�1c�:u�����c�ر�JF9|���,Rׯ_g�СI)))̝;�����y���7n(������V�^�G}�1���ΦM���?رcP���+s
IJJ"))���\�����S���K.�믿�����o��۷oJ����8q�����i׮]��--''��#G����q6l�7�|�ɓ'�~�ǎ���_em���/���3!D�QS	�gΜaҤI�ڵ///���4��k��ڛ�b``���'��s��J��nڴ��-[V�ZB��366����wBT��˗s�رZo�����mzw��Iqq13g���̌A��z��a��)B!�z���`5]�G���Ã�{�f͚annΪU����ڵk133�I�&���OOO<���bcc�"S�N�Ie��5���W��9rD�=�g�֙�R����իJ{"�
������۷/͛7W�0��矬\���={ҢE�be�'��O���Sk����s�uۭ[�ptt䫯�������ʕ+�Y��(�R��ٙ��d�ݻGNN�w�f����v___�m�Fzz:EEE��瓒��G}��$oy�Ze��ǭ�T���7n�K/����?YYY���ңG�{�=�u�ƤI�

�Ν;���u�8s�C���ٳ��?0j�(��������������X%�K���g��������/_�Ν;�����JW_�ܹ3۷og�����$��7���G~~>���S>���9P'\:t�?���;w�������O��=##���
e�ݻ7�����}��W|����矜<ySSS~��7֭[��_5�9���>#55�^�zq��)���ON�8���))))Z7������˗��������{�V��	!�T�Z�l����e˖4n�lllWZ�T�����ꊷ�7���,^�ss�j_GQ}*R�N�RѨQ#�*{4j�;;�2��Ut���{X59���,,X@ǎ100`֬YU�Ԥ�\�T��v��Ui�[PPP�Q����*�����Ԯ�e��;!�h�����ź.������<�ʕ+�u��%!dݺu�M�Ҏ=J^^�F5��ƫ����k�����k��a7k�ӧO�ku	]�����|]����F�T8(�֭[:����s�u[HH7o�d��|��Gt�ؑ
6�w�^������T��ٳ'���t�҅��@���8z�r#wϞ=@ɍZ���8x� ^^^�ܹ�Y�f=�RTyU����Z[�G�/�LOO�G�ۛ5k��ɓ�<y2w��%66���H���pvvfȐ!,\�[[[Z�h����###yꩧ0`۷o�O�>�������u���������8q"���@I����+�(�u��Y����̙3��;w�P\\̿��/��ùp��tRj�֭���a������X[[�h�"-ZT�c���?���_��]�%~~~L�0(I��Ғ={�hU�)�:�d�֭>��#G�u�VƏϞ={��J�y,]���?�X�OEϙ����'�7n�J�R�-�XSQ5�P���Gbb"���x饗�ѣ��鸺�ҭ[7�n�Z��T|X5�۷o3r�H�^���'""���\���{��~ouKYmz###	ֺ�!DU�Xr���]M�Z!��ޫH[�=x��e�y��'0J;t��������?9t�����ΫH�eѕ0�Vժ)�yoY7��n@}����*s�x\�U��񚼸u��	�}�]妽����@��`(@���[oq���8nnn�>g͚EPP��E�V�Z���Gxx8W�^��_������V�*S=n]�zT���u��n����I�ضm+V����?~���d>���dN]~��g�$qJ�����X�h���,[���?�\����_��a�S��Inn.���,]�{{{nݺ�$Hdff2e������ooo,X@\\qqq�^��,Y�q>*s�ݺu#--���4%�C���'�|Rk������F��_~)s����ȑ#5�G������*_�o��\W�s&�BQ�+���3p�@._�����R���ɉ�m��k���ܹs���oqtt$77�]�vѮ];����k6�?�Ut�������y��'�����ٻw�������իW�ӧ���4���$�Joi�+ύ;���BBCCquu��ǧ�'�苴�6��n���>*�J�����%��}	!�hX�w�����5�����()9���Wrrr�k�[�lڴI�7mڤ1�Q��ڵ+�Ν�W�>���C���S�j�1�!Dݦ��T���.U�U�
����y�vɒ%�hт��$6l�̙3	

�*]��V���q�"գ�ҿC���RPP@LL666t��lllصk���|��J*(/�4��u��ƍ#00��͛ĺu�4�?5���Ȉ�ӧ���hT���ƿ��/�������	�~�ڇ��=1r�H��͓O>����2�2�>f�v��U�{v��
�_�HiM�j>��^�I�&���Ae]_�h��?���3!�B��(]�nРA4m�T�P��}�WX�t)ǎcԨQ$$$��o��k�U�j�jr,]��]h߾}@I��_|��͛3f��l٢�/u�����%;;�E�Q\\�3YXH�^i�+�j��r��	妅B?���B4�ƍ�_~�O>��?�駟���O>њ;v�X�oߎ��nnn��ۗ۷oFhh(ʅ�F�Q\\������yꩧ���>|8={�$55���Y������_f���]��?��������u��a<��ԯ_?���HKK�JBQ�;��
_!7U�.U���wy7oK��е���%Æ
#!!����s��y���c���j�SVՔ��{PW��G9n��p����o�!22�}��q��]^}�U�lق�����2LMM�t�������:j�.]b���\�r�Ν;�g���P�{��.\���!C*��:A�?�P�>��S��ԩ�FrJQQ��sܮ];�ϟ���9}�4�w���O?eٲe���T�ء�bwhh(�|�	�'O��g�՚s��y>��3������;Ǝ�|��q@w˭�<��S���O�8q�q��)��
KUM���9B!����V�[�v-���$%%1`�����}
xx59u������K��s�'mz�M����=9%==���f̘QݻB<DY=�B�o�f��СC���ơ7�ܹ���#!!�.0{�l�m-[�T�ր��n����^z�%��ֲn6j�{{{>��SbccY�|�#����ȑ#GHOOg���z��5V�Þ�N#G��رc\�xsss�m/^��p#��}]�t�ڵk\�r��9�k׮���o�;w��C�*�Z���+++���HMM��o�%$$����W�b�:q��ݻʓw���U�u�СYYY���h%�I��������'OILL7n�`�С|�����all�H��6m^^^�T*|||x��y�&�֭��ۛ�c�r���
��۷�ӧ�|�M���&MbӦM,Y����H:v숛��7o�O�>�M�����_���/�g�_|Q٦�t��!f̘Ajj��g�?���Ν;ӻwo�^�����g���W~�J_H��C�g��s�c�F��?��lmm166&33���>���޽�J�RZ���p�B���077'))II�ppp�8���b._������sdmm���...���aaa��ӧ��M�<��s�KEϙ���uE!DeՅ7*S��AM����&��P�`���2����3~�x���G`` 'O����ooo֮][�{�M����<՞��&���}̚5K�a!����~!300   ___�?N^^�z�b��٬Y�F㗕֭[Ķm�8z�(���bnn���}��Q�X��͛7����ݻw���122��_/7�ɓ'�����_��o��H�iӆ��`�n�JBB����С���*o����4se�>.]Uj���ٸq#���̝;Wc[bb"�[��x�XQw�9���(�_۶mٴi���t�ޝ�{�5Sj�ԩddd���ΤI��۷/׮]���T�R�:qo߾}L�>���L�O	V�u�-գꞳg�*-��s��M��∌��g����F�R��SO=ҐR�. IDAT�����Ÿ���o�>N�:��5�jՊu��p��m�$y��������'::�S�Ni]@��?�Qn<j޼�F[��S��ܹs��?����̈́	pss���WWW����_��Ǯ��SZ�l˖-ӊaڴil۶M��t�҅aÆi�YXX��[o)�w�ԉ��l���GϞ=��ߴ���{�g�._��U޻o߾�����3!D���wBQi��P�r�JRRR2d�O����;6l��5*�o߾���?~�	&(�III:�K���w������$���زe,@�RѲe�
�/mzECVc�)B!����oߞ5k�h�effбcG�q##�2od�fii���e�c100P�,݉5����'����
77�r�-+��q]�U�Vt^Yㆆ��T*��Ƞ[�n@�/��Ν���YJ�
QO̟?���x.\��U��7�T���
P����]�///���U�*S)��_fϞ=lܸ��7��%]��ֵ�T��[���ٿ��Ә����cnn������`u{�'8u�|�{��%#####ƌ�|��}My������pwwW��?�쳸��W��f͚ѩS'�λᆱQ���LJ��"���K���/�{�9�/_Ώ?����'>>>L�0ggg�5k��͛IMM�O�>L�<���{���ޢE���9p�$%%��о}{�
���VVVe���qtt$..�Ν;�R�X�z����/�������?u�m۶�:u
OOO������166f���Y��v��=�<?���LQ{T**�J�a!D�T�Bݑ#Gذa�F��ȑ#���k|��L�2�W^y�]]�2kT����V�RZ:>��g����5��U��6�ҦW��Hr�B!D7f����qww��Ғ֭[���Ƨ�~
P�'�kS}���9::��W_�$܄��cbb��jIQ1�yK�C�����w�}ǽ{��ӧ�����W_U��D(�6mJtt4W�^�{��=GGGe^e*E-]��ƍOAA�^���'V�u�-գ���Wx���OMk׮6l(��Ԋ$Ө�����y��'�$e�����,X��BIh9�M�2�)S�Tx�Z����/˝coo����Ƙ��ԡC|||���)we�c]�=gB��q��	6mڤ�0���>;)T�:߼y�hӦ
���4k֌����yIII�m۶:��U�
^E�X��ݻws��Y��qZ�S��\�I�^i�+�.INѡ�Y|���J��aÆI	D!�BT�I�&�k�.�Oзk׎��)2��[����OOO�y��̙@ll,�6m�p�N!D�еkW֮]��y�]
P.d��2��pww�����+r֖ܺ�QB!D����NLL3f��w(B�z&&&F�!T�B���+׮]#$$Di�bjj������������\uW��Jy			����k�.rss�:u*[�n%22Rc�T��<i�+mzE�%�)���ٳ����s�N����9s&fff4Hߡ	!���pss�G�|�����ҥK�����;w�w��[�5a�������
��ŋ�Z\!DC$գM^^}����ddd`bb¬Y�4Z��T*"##Y�h��{O�:����ƍu�eu���Q�}.\`ٲe�:u
f̘���7����ܬ�,V�\Ill,w����Ɔ�[�j������d�Ν���o4oޜ���o���T�P!D���~���`֬Y��B�"""�����;w�F�G]��*�T�����~~~���=t�T��i�+mzE�%�)�����իWckk��v���aժU���```���B�4nܸ^��o��9B�<u��ꦏ6B
�T���{��1v�X��iii�]����d>L�ƍ���#11���e^zz:���lݺ�̧X+�Ficǎ��/��������_��H9r�҂
J.����j�������|_XXHRRIII���lٲ
�/!�B!D�'mz�M���-9���s���`���5�(���$88X���B!�B��I���Y�ngΜa�С���3p�@._����3�|�
AAA899Ѷm[BBBx���믿ptt���(y
���X�bJe�(�_�~l߾�'�|��?���?���{�*�)���\�z�>}�ΠA�HJJR��JS��СC�;���BBCCquu���G�SQYO�
!�B�6��[[���R'+�ܿ��������̤Y�f��ݛ�S�bmm�17??���@���q�;vd�ĉ899Ѽy�*�}�ƍ�����ʊ%K�p�����2d�Fizccc,,,���bΜ9�iӦ�N�B!�BE}~ء���Q��n��SO=��ؾ};}��!,,LIy�W�8q"dԨQ$%%1a�:Tmk����зo_�䉽�?��[�n)����Tly��3f[�l��_��W�֭���a������X[[�h�"�EB!DM�t����ӹ-::���$�
���]m�&�B荴���N&�����c���"RRRHII��ݻJ���B\\\HMMU�fff�ŋ�U��Vf�6l�@xx8�<�.����������5b�������c���~B�B!�BѠ�������K�������8x� III0{{��&�Tv
��*_�o�(y�H�ʕ+>\�}cƌ�ڗ��7, ..���8V�^���K�,���BԊ�˗s��1�I�gϞ��ח�;wR\\�̙3133cРAz�T!6i�[�H�^Qtgc�ٞ={���s���;�?��*ڹs�2/,,���THDD��=���4���dbcc�4�����N�^����Q.��<y����k�G=��#�B��[DD�5����U
/u��B44�>t���)s[�F�jl�ҕfu��n%�`K�f͚i͵��'##��� F�I~~><����W��B�Gq��1���^�[[[LLL�ڵ+666�Z�Ji�'�B4t���z{{K�^Q�j�rJYp��9s�V�Z���Gxx8W�^��_���[[[������]���]�%O�xzzbmm���6@����~�z"""022b���)�.]�@Ϟ=�����Tc�B!_o����g!�B����r��%~��7���n�3d�N�>MTTT��Q}���~���L�0AW�DxP�v�?>��������޽�O?��e˖���R-1	!��~��
�����`������W����$88WWW=F'�
OC���!�6��&�ɶ>K�,��'))���$�l�‚P�Te�������ҹui���U����Ν;���t��I٦�ܦM����J�`B!��i�С:T�a!D����л���s��%Əς�ѣw���8p�g�y���\�x��%U[_{�5>���F�Q\\��˗133`ڴixyy�R��������͛�[�oooƎˑ#G*����V���ٙ��P��ٳgqvv֚ۻwo�^�����g���W�ǔ��"�B@Iů�������̤Y�f��ݛ�S�j=���O`` ���ܸq��;2q�D�����cJ?([:��Ν;DEE1d�:w��166��‚��(�̙��^�B!���ZKNy0��LkKKK�
FBB�������ŋ�>}:�]2�Ayyy�ו���R�سg�����ߟ���+�ԥl7��hY]!�B!�x�����;!�K�.��{�i����:V�5kFHH����۷oӶm[:u�Dvv6����gϞ���o����o�>N�:��5�ӪU+֭[W�xW�X��ݻ9{�,/��2���UQ���
\]]��@/�^!���ח;v(����BJJ
w��UZ~���Bjj�2733��� .^�������j�&??�#Fhm1b������)�%�B!DՔ��Lό�����"00�;v���Hnn�F����	�̙3Z����*�U[�l.���n;t���ǬS�B!��%""�F��K^򪅗�����T*���򒗼���֭[,Y���={ҴiSڷo���5.\P�888BqqɃ8���8::(I_|��z��iӦ���<���:uJ�III�����9nѢ			,Z��N�:ѢE���غu��\ggg177�e˖�lْ����NHHH��B�p�ٳ���;�?���;;w�T慅�����������'::�A����Lll,�������T!��*fR���!�B����m}�N�JFF���L�4��}�r��5�� ��cDz}�v<<<pss�o߾ܾ}���0BCC�����߿�sK�5k�ʕ+lٲ���GVViiiZI(iii�!�B<^�~�m���B!t;q��6m�wB�9/����~���3f���/���/�$::�ѣG��ﯴ(������^k��ڵcÆ
lذ��ԉ/722���??���]�`,(wm!��W�Ny�*�W�V�Z���Gxx8W�^��_���[[[�y����]���]�ЫW/<==���������ճgO�m���s�Bh�J�B4<5�~�N&�8::�v�Z��������fnn�|=o�<�p��g�֘ײeK�.]Z���5i҄�+W��o��w�q��y��yF�ɱcǸx�FLP�J.	!���2t�P���0��^HOO'&&�3f�;!Ꝛ�X$�B�K�,��'))���$�l�‚P�T�l�R���������\�r��unݺ@�6m�����s�B��ѣ��./DU�?�zKN)/���Ɔ�M��իW�޽;�G�V���nݚ�� �m��ѣG������sss\\\�ӧO��>��cڴi�ٳ�-[�������ٸq#���̝;Wc~bb"�[�fܸqU==B!�B��PW~BT\DD��6BQc�~���R��Rdiiɰa�HHH`����????���X�x1ӧOʮ�����W�F�иqc�m�1�!�%F�ŨQ��������S�$˹�L�Ҍ��X�l˖-����>`�\���+W*��R�$##�nݺ�����s�pvv�U�V�I!�B����c���C!�B!022R��������������8p�&&&�^�C�dee���C�4����(s�B!ģ���)����#_}���ḹ�����V� !�B��(%%�g�}V�a�:����{���ХK}�#�B!�xLM�:�����ݙ4i}���ڵk4k�L�7v�X�oߎ��nnn��ۗ۷oFhh(���%P���IOO�G���׏��,��Ҵ�P��Ҕ9B!���N�!!jYu�֮S'*��OOObcc���$33���X<==5z^
!�B�Eqqq�������;Q�X[[������1����G��ҥKen���V�}J�#!�B<����b̘1>��͕y�����Ԕ.0{�l����	

�e˖,]�T�ۮ];lll�2e
#G���ŋZ1��F�]G(��G�=�1c���B�3���_*�<�����ꊷ�7�/�`,�BQ���/8880c�,--���C�B۶m�}�6�f�b׮]���I!�����9v��V�gϞ��ח�;wR\\�̙3133cРAz�T!�B���/5��Ɔ�M��իW�޽;�G�VWZ�nMPP۶m��ѣdggchh���9...���G��b�
6o�LVV����?��7����ܹs5bHLL�u�֌7��X!�Q�F1j�(}�!���$9��T*T*���B!�����|�M�F�=�w8��iԨ�g�&!!�/���0p�@6o�,�[�xDǎ�9^PP��ի������(��j�*bbb000��0�B!�+++���:���H�@WKKK�4

Q�T���A�n�����ܹs8;;ӪU���B!����B!�c���GGG���طo�\`:M�6��/ҽ{wRRR������;;;�����xYXX`aa��0jLpp0������+cdgg��ȄB!��������cbb��ٳ��B!D�!�S�B!#�|�	{��%>>��={�;QG�3���۳o�>�}�]�n݊��-NNN<��l޼[[[}�)D���>��ő��I�f��ݻ7S�N���Zcn~~>������s��
:v��ĉqrr�y���5�Ϝ9Ý;w���bȐ!t��Y�cll���QQQ̙3�6m���Q!�BTNM%�v!<==y�w�3g���lڴ��-[�j,B!�
�TNB!�xL|��׬Y�oooƎ��pDִiS���ػw�26n�8RRR�2e
vvv888p��M=F)D��e۶m���STTD~~>)))|��GO����BHH���;EEEdffĒ%K��~��>|���|F���mĈ���W��'�B!4
<WWW����f��Ř���;,!�B���*�4jԨ�v-�B!*�����ٳg�d�}�#�kkklll�����ڵ+P��}۶m�����o2p�@�l�´i����oϞ=���`aaAQQ��ˋ�;w2k�,���HMMe��\��޽{����ڵkINN&66kkkΜ9�Q1E��ɓ���_+��ɓ'�>}z��B!DU�v����R�P�T�C!��A���Q�F]ݻB!�U������5}��e˖-�G�����jՊ����h�"�m&L��ŋ���[���`ooOPPz�V44e��p�&o��jՊ��<��ùz�*/��2���Z-����X�v���իW/<==�����Zm�J�t���Vk���s�B!�B!������B!DV\\̼y�q�{���Qa�?^��Oi999\�r������-��,Y��-Z���Ć
�9s&AAAܻwOc^zz:VVVXXX(/uB���,�n��M�6Z��c�9B!�B!�B�W�^9�ĉJyc!�~�;!�u�|�W_}�7�|ÓO>��pD=cmm͂�}�6m۶Uƿ��+166&%%���1J�=XEW;��fiiɰa�HHH`����????���X�x��f�a������ݮn�۸���#�1i�+�B!�B!�jONQ���BԾ��IB��������LJѣG�;QM�2�0g����X�j��9666�ر�V�Z�9J!j���VVVXYY���ʷ�~KHH�ׯW�SLLLHKK����Tz�:���ENN:t�ؖ����B!��I�+�B!jZ�%�!�B��駟�;w.���g���G�SO<����
���㥗^b�̙\�p��ݻs��e}�'D��:u*���3i�$���˵k�h֬�2o�رl߾����۷/�o�&,,���P,,,�Jn����N�=�ׯYYY���i%����)s�B!j¨Q�����wB!��1�]7X!�B�k999L�:�����e�}�#�iӦ�g����O^^��=���dee1w�\��(,GGG���3fÇ���ssse޼y�055�…̞=��C�2~�xBCCiٲ%K�.U�k��2�ȑ#�x�V�1�~%�B!�B!�:[9�ҥK
���:���h���6lvvv��O!�B4,���g֬Yܹs�#G�мys}�$�9+++\\\���$<<\i����%~�!k֬�s���;s�L��iccCӦM�����իt�ޝѣG+�+�[�&((�m۶q��Q���144�������]�b�7o&++���BƏ�ƍILLd�ܹ1$&&ҺukƍWG,�B��щ'�M���C+B!*�N&�,_��cǎ��du��c9{�,����ܹ���bfΜ����
��H�B�xzz�ѣG�֭���
���	�|�
�����K/��ƍY�x1�?�<S�N�S�B�+++���:��Ȉe˖�lٲr�YZZbii�1fhh�J�"00�����Ν;�����&�BQS����"""$�M!D��ɶ>ǎ�wզ:�����իWckk���	]�v��ƆU�VQPPP
Q
!��!ؽ{7}��7ofĈ�G�OW IDAT4 &��-Z�'''�Ν��%��b166&<<\��Ąٳg�12!�B!�B!���*�XXX�)�\��������2���@dd$�������1:!�B�/^d޼y,\�'''}�##������L�6���dڵk���cD�{eu���S
����w�aΜ9��Ʋi�&Z�lY��!�B!�BQ�\[��K'���`Ŋ������_f�˃���X�~=.\�E����k,Y��ׯ_��Ϗ�'O������)s��eҤIk|�������O?q��=:v���/����+�Z�*�X���	$>>�7nбcG&N����͛7W�w�����2d�;wVƍ����� **�9s�ЦM�J�k!�B4�o�fڴi<���lڴI���L���ٳg���̜9�����&M��;,!����ꊷ�7�/���\�Q	!�B�ϥK��ׯ��m���L�0���\���8t��u��Rчlk�a܊$f?x?�����',,���$���h֬O>�$/�����i�/�ϯ��s�Ң��IJJ`ذa����9"!�B��\r�ì_��;w�h$jT���3999ܻw�ݻws��}<<<�u����ܼySyϕ+WX�f
��S�L`˖-j�;++���(rss��ʌ���RSS����L����x�"���4n\�q��������,�?b�������c���U:B!�����/����55q1N���ԩ���c̘1��_�^�!��DC�ĩR�P�T�C!�B�/_αc������@nn.���$$$`iiY�!>V._�̛o��ݻw����B.]�ĥK�8p�����}�����$}�]�ٳg�e�Ν3s�L���4h�^�B!�xP�gΜ�ѫW/N�<Yn�Gyz��ɞ={8y�$,��ѣ���n޼ɀسgǏgڴi)�"##pww��ɓ�:u��[����X������������'::�A����Lll��'Oп�cQ���!���r�Jؽ{7]�t�w8�16x�`�m��ƍٱc���B!�B�cǎ+w�����<y2��5u}�u/������x֭[�ݻw:t($%%q��	������O�������2�a~5I�k��z�jlmm111�k׮��ذj�*


��B�7���baa��z�xYfϞ�HO���ѣGZ�h��Y��k�'N���ңGZ�j���gΜa�޽ʼ�Ǐs��i��_�_|���~
@^^^�1����v�Z���hҤ	�z������*s/]��$�<���Tc�B!/���|���lٲ�_|Q�����+V���ٙ�^��!�B!�IE��׆��,N�>M�v�x�h۶-���\�~]ߡ5X.\��?��̌�M�ҲeK^x�֮]�߽���dggcoo��988���Mpp�#B!�޵�Q'dTU�޽���=�߿�������Gx�w��1����		��66ѭ��E5Nq
��*r�D4�Z�w��PR��ӆ�ji�栕H� ��Hi�F갵nKTэ"�?�f�d2&x�o7���z��^��=a̼��u��Ǐ��f�JJJn���Ǐ0`��2�9r��ܹs899���1"""����>|8��>|���1�={6�����������S�;�ڵk,]��-[�p��I���hڴ)��������Ejj*���+�<��ӟ9r����7���*�)))\�v�?��O888��/���@JJ
�����x��/]���'���g�}�/����ŋIOO�…<�����+������3g۷o�v�ڼ�⋌;�Z�j�����L`` nnn$''�����ˉ'HNN��ͭB�Qe�[Y�Tѱ~�a~��Μ9�C=dr����d��_yע�\�j��5��ط�f����WAA			�o�޸�@Æ
���$!!�aÆ���������T�EE�������5j�:,�����!�Fe��e޼y<x777z��AӦMiժ�
��soU�r��+�|ll��1�U4g�?�9sڷoOdd���1akkˊ+�С�ر�>T���O#"""r�Z�h��֞W�\a����߿��/W0/**b���8p�{��I������eѢEe~~���6l�@�����7�&$$�~�zF�Y�{�PPP`,8w�����9s�s��"""(..6�m0e�222��E
���\�z�ɓ'�Ĺ�������ݻ��ɡu���c999���ѱcG��ܪd>*�ұG�ɇ~�믿���?]�v�駟6����J_����ݎ�9Z2__�5���xyy�����EVV[�l!00����W�s+��V�F
JJJ�x�"u��LW��c�=�O?�đ#Ghٲe�q���DGGS�~}�=j<~��Uj�,{z]]]9v��ׯ�坤
4�ԩS���ӠA�c����y03d��^��ʕ++�A�ȝV�^=֭[G�N�=z4����NI���]����d�4DDDD�6V���O����ʕ+lܸ�9s搘�h,NY�|9�駟f�ԩ4mڔcǎ1k�,���HII����+]�޽�'N���A�f�����Ã��_dggӾ}{��x�	������˖-�̙3�lْ>��Gy��>��5k�mV���o�������+���HHH�o�1+Nd���|��W&�)7n ((Ȣ�(���,��ұ����S��/fٲe,[�{{{ڴiCϞ=���3��ͮ�_����5���U:GK�+==�-Z��khKOOWq���<��eq�����㸻��4�~���;w��k��ɓ'�3gN���ҥ			DFF2k�,z�!.\HRRnnn�Y��$~׮]���=z��3g�ϟ?��?\���ٓ��X��Ù<y2͚5��/˗/��/����ӸT\���9u�ǎ3+B9v�1FDDD�&M"##���4}�Qk�#R���z���8|}}i۶-o����S�j����������������8::r�����8z�(����0RSS�5k�5�̘1???6n�Xf1ƍRRR̊G|}}��_�ʺu��,N			1)����o���6�
'<<��q�}�]�x�	^{�58{�l�����<��ä��2q�D���z�*������н{�*��ʪ��>>>���p��A���;����޽{ٽ{7III,Y��B�S��e�5��s�d�>@�&M�}���MbDDD4ղ8�Pp���+�ׯ/7��ۛ��d>��c>��c�2�K���Ç���JNN���39v�~����lܸ���"""�9t�^^^e�KXX۷o'''�����ծ]�����ҥ;v� 77�v�ڙ����Э[�J������;�/_�G}ė_~i��@�:z饗��_���o���O?M�^���������T���z������L233Y�d	#F� 88�ڵk�?\߆�,�Z����m۶0�|�ϟo��7�p���*����'N����'�4>�W�׮]+3�f͚���CZZ�z�"##���|^�ulmm�����bp;עE��hт��0������e�ҥ���e޼y���(K���(��%�u��9�����m��ٰ͝�����}5q�D7n���-EEE7�g���Q�^=������b���ΫA������ビ�vvv�hт�s�ҷo_cܤI����{{{Z�j��ٳy���HLL,�\�֭Ktt4������bkk���3�����ƚ���ӧ�������嚖�Fݺu�ݻw��WDDD�
{��aԨQ�?ެ�U�:�2e
AAA����&�`ʃ�F���?�S�[&���T��?�/���LJM�6A�6m�|�2�/�o߾�^��ܒ����y�…�߼y�-�/����ټy�Y{�:jԨq�~n��[���Ɔ
6׷�1Y��v��vX2v�n��������fq���������Y��˛�s*�:[z�*3�A�-�/C�66�_�ڪ�\DDD�E�r���p7*�����)S�0eʔ�Ɨ����5jĬY�n����S�1�(�\���y��y��o:N�:u&**���<7n@^^���cԨQ8::޴�����������_��Wk�#b�5jM׮]���c׮]ԩS��i��t�ڕ��$k�!""""U��ٙ0`�8�֭[Y�l, 00WWW�;���quu�xÖ>.,s���|�MRRR̶*��㧟~�ȑ#�l���\n�Q�Ft�ԉ��trssٹs'=z����s��q;,�E��ٳ�իW��o�?v�Pv1FEԨQ���.^�h\񦬕[n�Ut��X2_
4�ԩS���ӠA�c�����Q�,NS���|��W���1y�d���puu՝�"""��+W�0p�@j֬Ɋ+����KY�v-������+�Z�Jw�=���ݍ�Ë������ח��<�L�B߾}i֬?��vvvƸ�={Kxx8�'O�Y�f����e���|��xzz��g��+&8~�8����<x�?��t�ܹ�<:w�L�&M8p�?��#͚5+7�.]����@dd$�f�⡇b�…$%%���ƚ5kn{^��� ,,��`ƒ��j��=d����Ctt4.\���www���سg�q{��={�/}�n�~���;w��k��ɓ'�3g�Y\E�YYcWt�����͛s��)�;fV�b(�[���TG*N�8880c�ƍǰaÀ�U�.4ٳSDDD�?'Nd����ڵ�Gy���T���;�V��w���/!""��)�����H

e֬Y̙3���v������}�vrrr�n��]�6�Ǐ7�l(&��Օ=z0x��r�kԨ���;w.)))L�0�ܜ�Njj*999������k��V���nݺ�����ӧqss�C�&�-���f��={�dذa|��$&&���h�_�&Mx��7�?��~�ׯ/7ooo���������\��׬��+:Fy,��.]��c�rssM^������׆��ȃ�r��]��s�1f�"##���d�رfolDDD�ç�~JLL�[��v:"��{��|��'̘1��k�Z;����l����<@DDO=�������ӴiS���x����qu��%::���`\]]������ooobccMV��8q"�7��֖�/�i�&���y饗n�g�~�prrbӦM\�r�ܸ
���NNN���ѢE�ΝK߾}-���������\���E5��GU�t�q�Ʊh�"���y��G�������x�
���K�ׯo����4����D�z������ˋ�ӧ��U�5vEǨ���ӧ�����������Fݺu�ݻw�����()))�����:t(�nJ�,"w�~ED�YYYt�ޝq��1w�\k�#R�F�Ŋ+����駟�v:"""""}~(r�}��gDEE�v�Z7n@^^~~~�5��#GZ9ê��ODD�B�Z9EDDD����_�gϞ̚5���T�O?���m����Ϲs笝�������H�	

�aÆ�������puu5�HDD�A���j������@j׮͊+����vJ"U��ޞիWs��e^~�e������������H�ppp`ƌ���p��IN�<IJJ
3f̠v���NODD�jjZ;��7�|���]�v��CY;�;��Geݺut�֍I�&�`�k�$""""""R%�{�9ƌCdd$cǎ�]�vV�JDDĺ�XqʠA��T�"R��+WZ;�
���?X�t)�V��駟�v:"w\�v툊�"88�6m�j�DDDDDDD�Dpp0����NCDD�ڨ��wwwX�݊H�wOD�ޕ���رc�6m�NG�<x0{��eԨQ<��St����)����������H��┮]�ҵkת�VDDD侕��GPP�{�fƌ�NG䮛5k�����w�ѨQ#k�$""""""""""U�ʋS���:thUw+"())�v
""RAEEE���L\\666�NI䮳��%>>�:�Ν;����vZ""""""""""RE��8� ))�Nu-"刏�g�ڵ�NCDD,��op��A233�W������z�ꑒ�Bǎ=z4����NIDDDD�1h� k� "���+WZ;��ܱ━ީ�E�W�\Qq���=�o�111�]����z���X]��͉��g���iӆq��Y;%������>��J��""b�;V�"""""�KKK���fƌ0���T}���>`„	<���<����NIDDDD�յkW�v�j�4DDDD�p��xzz���]�ϖ<�FIIIdffЩS'-{("""���?�K/����ӭ��H���;���3x�`233iڴ��S�/���3t�Pk�!"����k� ""����8�Nػw/�-"11���^~�e<<<h۶��S�j�ҥK����裏K�5���H�S�F
����ڵ+���dddP�n]k�%""""r�JJJ�v
"r����g�ڵ�NCDD�!\qJEVL��K�.1}�t���puu   �iӦ�r�J�"M�O������dgg���l�tD�-GGG֭[�s�=Ghh(�V�R1������2p�@k� "��+W��8EDD,bc��===����Kbbb8}�4�6�
2�ӧOc��DDD�����Y�|9+V���'��v:"՞���W�fÆ
̜9��鈈��������H%U��S�?N`` nnn$''�����ĉ$''����֭[Y�r%�����<��#x{{3f���Ps�
*gϞ�o�;v��ҥK��Ջ�S��=������ڷo������aÆxzz�����a�prr�ݩ���7�|�ĉ�9s&�ӟ����=�[�n,\��7�x�֭[���o�DDDDD�.8|�0͛77�\�g��U$�N�S�W�F_k����/r��y���ټy3���U>NE�n�F*zcver(�{QU�������S�N4����V�)���xzz�{�nrrrhݺ��XNNyyyt��777�,YBTT���O�:EBB�ϟ���1���<c��͛�x�Y��_Maa!^^^fǼ�����b˖-V�EDD�p��1^~�ex��w����=gԨQ�ݻ���P�|�I�y�k�$"""""wЄ	رcG�-���۾};�ϟ��l߾+guo�S�{��eѢE$&&RRR��/����m۶��qDDD�Uq
@`` �w�櫯�2)Nٸq#AAA�X��)S�пjԨ����5jiii��/�$//777>��<<<ؿ?f�����h��옡-==]�)"""bTXX���
6$66�5jX;%�{�…9p�dffҠAk�$"""""wȎ;��B�t/�[��~���a�RRR�Z�r7簪Ǻ��.]b������
@@@ӦMc�ʕ888T��""�ಹ[yzz��)���ۛ�~���T�\��իWIMM��Ņ�ݻ�s�Nv��M˖-ٴi�|�	s���…�k���L�:�V�ZaggG�v�ʼ�����4i�����?n#"""�ꫯr��q֬YS"rk����^�������S\\l�DDDDD�?���S�N�{�n�ׯ�;��C=DVV���S��_LL�O�f��ƶ!C�p��ibbb�����܏�ZqJEլY___Ο?o\%##���|�������̙3���+���+|�$&&r��QJJJ*<��?�`�J���>k{��9���̎�1""""���g�ʕ$$$дiSk�#r�{��GY�nL�8��鈈���p��5>��3�ܹ3ݻwg���]��,����O?��йsg�����ŋ)**2Ɣus��Ș[�ne���x{{өS'���Gdd$���&qgϞe�̙<���xyy1m�4�K�7��={�ի�G���ެ����ϟ�K/�d<����k���ի̛7��ݻӫW/>��3���:u*]�v�gϞ���{\�x�,����]�Ɵ��'x���v�)))��/���{���/ЩS'l\m����B"""�޽;>>>,X�����l��ǏӾ}{��2
�� IDAT��ח�����O?�����R���9˜1c�ڵ+�?�<�g��ҥKƘ��7>6��СC�ѣ~~~\�v�d��Ǐ��鉯�/p�����@���qqq1�5l�OOO(((���1�k��^���gY˚����l�26l�@�^�ظq#666���c�͛��qss�G�4mڔV�Z1h� ��2��.h�Y�|j���ؘ��ڴT����lٲ�w�y��s�һwok�#r�x��g���"88�6m�f�DDDDDh�-�/�0�|���������x�"C�����ѣGs�c�ɓ'���&77�E�����d�%K�e�S�N�������9s&p��#F���g�ۼys���9�PPP`R,P���p������&_���Ǔ��Ett�ي����#99��?��7n�ʕ+��t��e���+lllx���%%%lذ����0`�X�~=#G�,��y�;w���PΜ9c�9r��6�2e
������x�^���ɓM�������d����������C^^;v����vG�E~~>p}^W�^͵k���s
�ֵkW�t�Btt4���?M�Pڹs'�q��������B�������"++�-[�x��&""�p��F�ѩS'������e�Ν������Xff&��Ѽ��[fo@�^�Z�����سg�I{nn�Y�a_{Û��1"""����͐!C8p &L�v:"������;�0z�h���;k�#""""�@3/|���ڵ��;w2e��q˗/�<��������wߑ��D۶m���2��q�
����e�Zޟ�*:&��+���
���ddd��Wy���/�����͍e˖�k�.�.]ʏ?�x[�<������a*r�e)��_|�ѣGiܸ1����ڵ���(5jđ#G���5�#77�+V���a\�dΜ9��ڲz�j���y��ׁ�>�޽�'N���A�f�����Ã'N�y�rYy/[��3g�вeK���ٹs'������J���HJJ"--͸U�7�|S�X������ʤݰ*KPPP����V�4iBrr2���1�$�[�^�8oC�������Q�n�HOO�E�f��1"""U�Z���7��ń��QTTd|Pڮ]�(**�СCL�6��~���
���/0k�,����իW������b�7o��c�̎�1"""�`*,,��ߟ&M���q%"U�>��'00��E�}�}�^V�a����8������

";;��K���T�g������O0c��r�i����s�Nv��M˖-ٴi�|�	s��0�f���L�:�V�ZaggG�v�x��wok|������o��K�c(r�u�����ѦM�N�
��m���2e
͚5��ޞ��`~��w�N�J�&M�U�Æ
�o�5\��7��Y�n]���o�4i���8::Nvv6k֬1{����O<������p}��x{{������ʕ+W��7>������b\a�n�v'O����;�j�2�8T��n��z��Ŀ��/�*2|���ԩS�v��p��a�zQLi�?��I���HU�k�X�[�n���p��i����С��qooo6n�HDDf�?t�P�K���֭[9|�����O�>fE(]�taǎ�����60��b�8�OII	����:u�ݻw�-�+"U��֖��x:v�H`` ;wpEDDDD�2o���>���dff�d�F�App0�k�6�?~���KY�9R���[q0[�’1Ϝ9���9x�Y\II����?�`�
\߂��ʜ��(�,7;�[�c(�oӦ�I�!�'N��q�͸7~�ѴiS�c���]�ϟ����b���.\�@ݺuo��!�����O׫W�k׮�[�fM|}}���!--�^�z���A~~>���:���@�_��\/0�Wgg��^Z�y		!11��������Ƞ���Ν;S��ϝ;����Y�6C���HU���)e-;v#���0�{pҤI�������=�Z�b�������{{{�.]JPP�����ޞ޽{���_�>}ptt4Y�� --��u�һw�
�+"""��ٳg�f�˼�DD�V�z�X�n��7ްv:"""""�
��?�/���LJM�6A�6m�|�2�/�o߾�^���<�r��$UŒ1�͛��qss#$$���{����r�,ݷ��ʎoPUE���f��j�*�����_-m޼���������l޼٬�tޥ��K����6l�\_�����v��쌏o��~�aٻw/�����n���0FY���fi"""7SmWNx���MV3�����f�*�y�`�*��S�S�L1�Y^l�:u&**���<7n\�8޷o�F���"""(�q��ϧgϞ�NG�Ѽys����m۶����vJ"""""ggg��8p�[�neٲe,X����@\]]9v��ׯ�����eɘ���DGGS�~}�=j<~��Uj֬���G�eϞ=&��VW��wZ�F����þ}��ر��}߾}U��aK�����}FFo��&)))ݴ��{��~��#G�вe�*�ѠQ�Ft�ԉ��trssٹs'=z����S���%�
ƪU�HLL$##�t�b<ޠAN�:E~~>
40y�a����"""��j+�ܫBCCiذ!qqqƶ��8\]]			�bf"""b-?��#C�!$$�q��Y;��K/�Č3�0a;v�v:"""""___<==Y�j���4k��t%Í���:t���bΞ=�'�|���'�G�6�Vk0l�RY��i�k�.���8t�ӦM3��?�_|�Y�f�g��^��?���~X%��)���Ƽsrr�z�*999̞=0]Q�v���<x�?��t�ܹ̘Ν;ӤI8��?�x������:u�˗/3o�<<==���)..&,,���"����r-��x��G�e��͜?�g�y��z�xܰUұc�̞kh��vJ"""Q�WN���1c�ƍcذa��*���)"""�������G�f�X�d���y`�����3p�@���qww�vJ"""""���Pf͚Ŝ9s�3g�ɱv������}�vrrr�n�]�6�Ǐ7�\�~}Ν;G@@����_��R�Y2���77n$""�����:���!!!lݺ�Ç���ާO�/�-�N

e۶m?~�#F�sww7k��u��0x��r���Q��f�ܹ���0a„r�>|8������Я_?�c���Z��ܭ[7\\\8}�4nnnt���xe�����M�-k�������+���ʕ+��.]��c�rssM~W�+UUђ��h�Jy��3f���DFF2v�X��EDD�WRRBXX���+k֬�����)�<�jԨAll,
6��Ϗ��Bk�$""""r����.���"""xꩧ�����ޞ�M���o��[�.�����ꊭ�-���x{{k�B�ĉiܸ1���U:oKƜ4i>>>888`ooO�V��={��%11{{{�.]JPP�����ޞ޽{~[��iNNN���0h� \\\�����Ņ!C�����m�q��6mڄ��3/���Mc��뇓��6m�ʕ+��5hЀ��|||prr��Ύ-Z0w�\���{�9������\=�.��.ױ2�u��1>�޽�ɱ>}����HZZ�����Ҩ[�.�{����EDDnP�����v:���g�С�)����=�}��fΜɇ~Hjj���E�:���ӱcG|||����v:"""""Պ>?y����1~�x�4i��ի͎��gDEE�v�Z7n@^^~~~�5��#G�۷�>ek��Jذa3f� 22R�)"�HӦMY�bIII̟?��鈈������u����={�����6�̸��P6lH\\��-..WWW�-�DDDnWMk' """r�9|�0!!!�����?����H)�{�f޼yL�<�g�yk�$""""""r��x#������/3���3f0n�8cKJJ
.�v��w%Wyp�8EDDD�������Ѽys�,Yb�tD�o��6{��a��dee��OZ;%����Ņ��|<==	��ֶ���{�1c�	�رci׮��JUDD w�8e�ʕw�k)�~�DD�^y�~��7RSS�U���S��X�t)ݻw'  ����֭k�DDDDDDD7ZLpp��FDD�;V�2hР;յ����U����l޼��[��?�����-8::�f��{�9���X�r%5j԰vZ""""""""""�*/NQu����܏֮]�̙3���F׮]����T����V��w��|�L�>��)����������<p��8��o�e�…Uݭ�X ))��)���W<HXX#F��7ްv:"b��ݻ�`����?���ү_?k�$"""""""""�@����Ǐ�r�JX�]��-�\���)���w������E�,^����H%�;��{�Bff&O=���S�6�XJo������8�@+7��}���:��i���7�]��СC)((`۶m���[;%�
�/�~��ח��,�իg�DDDDD��A�Y;��ݱ��{݌3HMM�o��q���NGDn���=�W��C�:�u��akkk�DDDDD�&88���`k�!""""������!99�>���?�///k�#"U�Q�F�Z��=z0c���X;%����oY�p����{�vR��Rq��>|��͛W���������S�NZ�QDD(?��aaa�9��^{���H�ԩK�,a�ȑ�iӆ�� k�$""""bǏg�ʕ8�ک��=f�ʕ�NADD�1*N��	&�c�������{��eѢE$&&RRR��/����m۶��y����m��������3ϰh�"k�#"wȈ#ػw/���4oޜg�y��)�����X�V>K���3t�Pk�!""�k'� ۱cG��ҥKL�>��� \]]iԨL�6�K�.��,EDD���b�¥K�X�j����NID���Ӿ}{���9{�����o�8EL���p��ill2d�O�&&&Ɗ�����ylݺ�U�V���j�tD����g�ʕ1d�����������������}����_~a��Ť��s���q^y����kWPP�ҥKٶmgϞ�G�W�^����ԭ[����	@BB, ''�Z�j��/��[o�����k�X�t)[�l��ɓ���ѴiS|}}���3���������K�.e�ĉxxx��g���ܨ��[�wyc���@���qqq1�4l�OOO6lNNN�]�{��U��={6����ԩ�������Ge�ڵt�֍ɓ'3�|k�$""""�*���ÇӼy����VJ�^ݔ�AU�[�q�T.u��OJJ"33�N�:1hР;2���ȃ�-N9w�����9s��v��"""(..���\�p�W_}��G��N�:E||<YYYDGG���h��Q�������ˬ^��k׮��E���/��W�\a����߿��/Vh�PPP`R$R��]�������B���̎yyy���Ŗ-[�('��n������1z�h^}�Uk�#"wY�v���СCy��g			�vJ"""""L�0�;vT����ݻ�E����HII	/��2�m��ک�������m}�-[ƙ3ghٲ%����ܹ����q_|�G��q��DGG�k�.���hԨG�!66֬�&M����Lzz:#F��o�1ONN��O?e׮]�ܹ�)S�����V�fgg���~�'HOOg�̙U~�卝��@�-�5�bDDD����<��|����NGD�$88�	&0j�(����鈈���<�JV�cǎ*ﻼ?"�.]b������J�F�`ڴi\�t��鉈������o���I�&���#���dgg�f�c���$<<�֭[cggG�6m�:u*۶m3�{��ɸ��S�V-�*(�ϟ77��GRR���AAAdgg���R��CBB����c�]�Ç׋oJ{���MbDDD����2�˗/�jժJ��+"���s�ҥK������_�������H����Y��qD�U111�>}���ۆ��ӧ����bf"""���R�bx�z�;�ĉ�܋2//�6mژ�?��&�ܨiӦ�����\�v���[oQ�V-233�裏x�嗉��������Pb���wYΝ;�����1C�!FDD�~0u�T�o���իy�Ǭ���X���-			Ԯ]��� ����������H���_���IXX�I{VV��������0OOO�l�b��`Ϟ=��ՋѣG�E07~�P�{���B>��S@�Ν�߿?�/����9˜1c�ڵ+�?�<�g�6[=�_~���^�S�N<��7��YPP����y饗�ԩ���c��\�p�,��ٳ̜9��///�M�Faaa��Z2��[��u�VF�����q>"##��sQ�k������ڷo����1�aÆxzz���@AA��N��������SjԨq[Ͽ�ؤ4;;������C�N�ؾ};�֭��g���,_���c�x��˻s����8fYo�n�
ϵ�1�Y2����TIII���%**�:X;�&~�a����ܹ3o��6�-�vJ"""""�R�޽Y�p!���и���-[��?�I�޽��7=�8q{{{�v�j�c����JQQ�G��ƶ�'OMnn.�-*�3nK�5���|._���ի�v�����s


�̙3��9r�������߿?.\��W_��ѣƸS�NOVV���ƹ+((`Ĉƛj6o��ŋok,�2,�eɒ%DEE�<�ԩS$$$p��yfΜiqΕyM�~�}������eֿ��YYYlٲ�B��H����)�ؿ�p��#GnרQ#���g�n���յR�;;;3`������/

��,X��R��Bn|�UֹU��ҠA���1"""����������Ç[;�f�y��-[��ŋ�>4��\]]y�g(..6~�~��U�mۆ��
������sss�С���'� ==�X�p��G��{��˗s��~�i�����HJJ�m۶dee���Rf�e��~��ޛ4iBrr2���1�o���x|ٲe�9s��-[����Ν;� ::���_p��Q7nLtt4�v�"**�F�q��bcc��_~�%yyy����l�2v���ҥK�����d,�2�eI.+V�`ʔ)��������@ZZ���ү���tZ�hakh3Ĉ��H�ܕ�k�ҥ����:u�˗/3o�<<==�o����5k999\�z���fϞ
@�n�,���OOOV�ZEaa!͚5���({Օ�Ǐ߲����v�Z.]��ѣG�3gN�ϻ��
[;v̬_C[e��NΞ=���?���DFFZ;��	g̘1�ڵ��鈈����U�#�n7��b(���8�<���\�|�o���_qJϞ=M�			)w����5k�����O0c��2�թ�ɓ'���N�Z�:t(�ϟ77�ۤI�pww��ё��p���Y�f�1�P�N�֭����M�6L�:�m۶c�o�\߆�U�V���Ѯ];�}��ۚK��Krٹs'�w�e˖lڴ�O>���s��lst�� �k���������q����v[��Ç���JNN���39��k�����m�6�?n�~6pww7k����Pf͚Ŝ9s�
Hڵkg|\�~}Ν;G@@����_���>���INN��?��?(sy���wYcw�҅;v���k�'��?�)��.���2dEEE�Z����D���o�>�����ʢq���NIDDDD�Zy��裏��)[�l�V�Z�3�
6����^x���\lll�޽���
_�[�p���<^ު▮�޴iS�cggg�]�fl;q�p�:
�Ҵi�Ƥ��g�5����u��e��Ȓy��_���W��S,��̙3�?���ŕ��T*�ʼ&J��Ν�c{� IDAT;����Y���#"""�s߮�ҠAbbb�����	;;;Z�h�ܹs�۷�1��ɉ��
���������0d�bcc�o:-@DDO=�������ӴiS���x����q'N�q�����RTTt�>ǏOPP������///�O�^��.k�>}����h�t�AZZu��5V‹��܋�y����[֬Yã�>j�tD�����a���899t��"""""��6:7n�SV���mڴ�СC�;w��۷ӱcG�ׯϳ�>˷�~Kaa!�m۶��
*s�ȍe�q���Q�*�7*��7�έ�9֬i~��%�`I��aI.���������{�GRRR�}V�\�~�������f��۽�"""��v��F�1k֬[�իW�ɓ'3y��ƕW)\V��ʭ�5����ǧBc8880e��L�r���wYcשS���`������3����Ǿ}�5j��~�"""�����ϟOlll��I���V�^=֭[Gǎy�7����vJ"""""Պ�����cٲe\�x��]�еkW������Ϲp�ٖ>����ʱc�X�~=���U�ge<��c���O9r��-[�רQ#��o�>:v�hl߷o��9���q��Q���c�r�ae�Y2��[�䒙�	@tt��X��ѣ��W�^�f͚wl.�ӠAN�:E~~>
409���o��ʻoWN��	

�aÆ�������puu%$$Ċ����T޾}�x��W7n����NGD�1͛7'..���X>��Sk�#""""R�<�����ذz�jcqJ�.]X�bp}�zKV�0l��\���9t���Ŝ={�O>�OOOF�]�s���"##9u��/_f޼yxzz���o�3���Y������ի���0{�l�u�f�}����{����ի���|��f�[2��[��&�v���C�1m�4c������\�ǰ=ӱc�̎�n������ܜUWN�Sw-[�w�����3f�`ܸq6���.\H�ڵ�������~��W����С����NGD�Q/���>'N�u�������)�����T
4�]�vdggӼys\\\hҤ	�����yꩧ*��E���9w�����~�z���ؾ};999f7T֮]���Ǘ�׭����{��Ç���JNN���39��k�����m�6�?Έ#L����M�BBBغu+���_7����Ǭh’y���ʰ$ooo6n�HDDf}:t//�;6��ҥ;v� 77�v�ڙ3��rc!����XN+����{�1c�Idd$cǎ5{3&""r/(..fȐ!\�v����*�KYDL�����ߟ��ܹ)""""r���ξi�a��_�VQ��>'N�q�����RTT@ݺu���&88WWWlmmqvv��ۛ��ػ��E�
������'''���hѢs�Υo߾�8'''bbb4h...������!C�������koo�ҥK	

�~�����ӻwo����Ʒd,�2,�eҤI�������=�Z�b��������;:��ӧ�������KKK�nݺ��ݻ�S$"""@������� >>��C�b���"r��QD���o���NZZ�
-E�J\�x�Ν;cggGZZ����NIDDDD���H�>��3���X�v-�7 //???F��ȑ#��a���ODD�B�Z9EDDD�K˗/磏>���?Wa��T�:u�f���,�-""""""����P6lH\\��-..WWW��DDD�r*N��Ξ={5j�Ǐׇ"R�6mJBB���̟?��鈈����Hppp`ƌ���p��IN�<��ޝ�U]�⎢V��X���6i�O�(
�u�Ɓ�2��L[�J0�+E4WP���EG�%E�*��u)�JP#@���`D0����.��s���\cf��?�֭�ԩS���l:�*�t@y:{��ս{w���{�sTS}��ѻᆱ	&�C�z衇L'��nݺ)<<\3gΔ$=��s��@9�����RQ�(Q~~����U�V-����j��NP��3F{��QHH�v��)�I�?(44T����3�v�}8���_+V�(��\׸q㔜��m۶����t�࣏>R�=Էo_m߾]���3��N-��aѢE�={�,X�Ν;��PC���h͚5:}���*��n:	*�r?9e�֭4hPy_@�"j������i�ر8p��5̟��'�Z�J}��ћo��W_}�tT*�>�R��n���8���8gϞU``������;��PC���Sz�ԥK=�����R�X,�P�U�p
@E���S�~�����xY�V�Ij�Q�F)55UO?�����Ԯ];�I���׊+Lg�`8TY�ƍSJJ�v�ء&M���EGG�����;w�aÆ���krww������ƇS|||$I)))�}����w��l٢5k�h���:���ׯ�:�o߾�����z���*ڊ+���$I���Spp��"n�…5g�-[�L;v4��$GGG�^�Z���4h�֭[�Z�j��������c�j���ņArss5e�mذ����ΝӖ-[�e����GӦM���c��]٤��jΜ9Z�|��v� ///u���te������0�?�AK�έ�ުիW���k���7�x�tP��b1���pʍt\��͛7���҆
T�^=�1B�z�R��͕�����$͛7O_~��j׮��_��ZJڻ�
����oz��Wկ_?�r�-���}��W^�ʕ+U�NÅ�Ώ?���� =��>}��(�������5b�u��YAAA�����kŊ�3PN�H�|�>��35h�@111jݺu�k���z����私��>S�~���m.\�3g�h��υ��(>>^.Txx��:J'//O����������e�ZM'�5
>\{���СC����ۛN@
���.www��������G>>>�gdd(<<\����ݻ��~�m���o%����K�ڵk%I�.2�r%WWW=��Ӓ����b����մi����^�ziʔ)�駟���Vӕ�I҅��\~~~z�'��/���\�3�|���͛��}��{���ٳ��
�5k��wٲe�U�f�
�oѢ�|||�l�2]�p�����d����o����F����늌�T�.]���L�9`���k9r����������,�^�Z���e��޽{%I={���u��������b����;��?�����?^�}������ϗ���ŋz�g��Q���:}�����4b�egg{�>�9s�h���:~��.]����l�����7��ҥK�}������ֽ��[l�{�W����/��p�-X�@���Sll,��2�r�J���($$D6��t�t�v8�U�VJHHжm�4|�pIҿ���צ���y��g�J�n���ݫe˖��3g�{m�֭���c������[o���%K����W[�x��=��n�M111ڱc�,X�[o�U���-�g��� I���Ҏ;�e�M�4I��|���u۶m�$�q��(x�`
�QRR����5y�d���2i޼�V�^���ߚ2e����*�pʄ	���.'''
4H��|ZI^^�$���w���"�{�I�&��{�U�ڵձcGM�<Yҵe��`��ɓձcGծ][�:u��/�,Iڸqc��\�3pqq�$-]�T+V�йs�ԯ_?���hݺu��>,�?�.W+��Q�*�~�A���Ӄ>��S����r��w+::Zo���V�Ze:n��2����S���m۶��
4�$]�|�L�6k�L��R�:u��+���yܹsgI�ɓ'��R�G�N��<ߥKI��_�=�F�-'''%%%i֬Y0`�bbb���S�:���$�~���(x�`
�I^^����'����j��N�6l�0=��s:t����L��MSiON�]�v��-�
]�`�cÆ
�����W��ԕ��Z�������}=��iʔ)�ԩ�rrr4w�\=��cZ�zu����\�܍~�T�Q�Fi���Z�f�6lh:����u��U}��Uff���)n�pJJJJ�7CPP�$i�…���(qMzz�/^,I
(���}��<NMM�$�~��ej���[%I�|�M���r�-e�^�
��'�Ԃ�x�b
2D�ϟWddd�&M�H�������โ5T���ϟ���X�y睦s�\8::jժU���QHH�l6��$�p��䔲*8�����u��I�?�����5b������T~~�N�>�%K���g��o���Gy��=Wz뭷��~���+55UӧO�$=��ÿ�����?K��O��}��)??_�����o�-I�ѣG��槞zJ>>>Z�j�������)///IEO]�$���_�k<W���`���5j�^}�U���rլY3%$$hӦMz�WL�@�s�����q���_Էo_�r�-��?�)I�<y�rss��W_)22�ȉ"x����%^���UC�-�ܝwީ\w�+
2D7n����5|��"����{�4���ӧkƌ�1cF�׺v�Z���O�7o����</I���tc�1��'55�����,�v����q��)���O=�N�ZNeP����j�ܹz�gԵkW����tT�jsrʸq�t�m��j�*//��yGGG͘1C����ѣ�5j�Z�j�q���ٳ�"##��{���ɩ��FFF���_j֬��y������{_�~��Z�p����լY3Y�V5k�L!!!���U�
�5���WS�LQ�v����(GGG�m�VC�մi�
�=���rqq��_]�_���ի�>}��y@�Pl�����S�~�ԠA-Y��p���aÆiԨQ6l����L�@���ȷ6K���ӠA�
�C���U����$)%%�pI��7o�,X�5k���n���L�ȑ#5b�Å(��#��)�SKL7�1B�V�RRR�ڵkW�iP)���O�>�����ƍ�N��RmNN��2d�Z�h��K�>�t�R�r�-z��
����ъ����ŋLPc8::jժU���QHH�l6��$(w��u���ԩS�n�:������n�:M�:U��Φ��ƺx�&M��6m����I�[���ɓ���S�&44T�E�|�I������b�(88���o,K�ǥ�������O�>�[���6m���0���E֞>}ZÇWӦMU�N
4H/^,��]�|YS�L�������T�~}u��]���/�n�֭=z�^{�5=��e� �
sssSBB�6oެW^y�t�;n�s
��>���{�nI��CBB�<U�_�@u����=z��{̓>��?�\�j�Rff�:t�.h߾}rww����ձcGիWOiiiruu-v
��^�=��ޒ�I�&��矋�}��g��GI�233խ[7=z�Ț'�xB�~�i�ޒ4a����{%~�3f�N�<)u��]			Ek�&������õ|�r����t�n�s-)))�n0E��w�GDD(""��0,""B)))��{����K�.���W_}���IR�F��h�"�?^���fӐ!Ct��y��ƪq��E���v{����q%ooo���+;;[�'O�$%&&�>s�L=zTڹs�rss�y�f�۷�ص
Z֯_���\]�pAs�Ε$EEE)77WAAAruuUll,�)j��C���������4�9PnN��+VH����չsg988��;�Tll�$iɒ%�k{��_|Q�7o����6mڤ�^>�`��Q **J����S��^|�EI�/��R���5k$I~���n9::�gϞ���.v�z��I�"##5g��9sFaaa������Çk͚5jذai>6��fΜ)�ܹs�s�\0��!G��$�i�F����$����ӧ�C�JJJҝwީ3f���Ծ}�Ÿ�.���˅�eddH��w�^�}={�,v��3g�N�:��/4v�Xu��AӧOWvv�����h�"-]�T^^^�Z�&�]��V�Z���\����f��N�?���r�$YYY�|������=w��[]y+!�?�z���ԩS����}��Wx��-Zh̘1�:u���R}-PS���)11Q[�l��/�l:�0���ppppE]�5�\��t�2hݺ�>�cǎ�U�V�]���/+--M���ڵk�^z�%͚5�\�(
OOO8p@[�l�#�<R�|RRR��7n�aÆiذaڵk�.\���hY�V���+��Ս����Ν��Ç�[�n��
@�V�'��������}Y�п~�UH``�$)44T{��Q~~�N�>�����b��W�^�k7nܨY�f���_۶mSϞ=5{�lmܸ�pM�)'���7�Gi���H�F��-[��ҥKJNN�ȑ#��m۶�,����u��yzzj������u���������6lX��a���b��L�2���ӠA����<~}�[VV����t�Сb����h�֭�ҥ�233ձcGeeei�޽jݺ��;�N�:�A�JKKS�F�Լys�9sF�ԪU+;v��{H�n���W?�����ݻ+55�Ⱥ�����Y���o�[�_��O>��kז����ҥK�ӧ�N�<���d����N��J)��S@�4l�P۷o��ѣժU+988���UJJJ*	׉'�֭[K���z���t��I���K�fϞ�6m���A���eڣ,����i�&������MNNN
և~Xl�ȑ#�`�u��U��&MҢE�n�c��v��Z�r����"��f:	ʬ�NN�V"@�r�JI�OA����/�ԣ�>�3fhܸq�s��IIIQϞ=5j�(��s�,R��p�֭[���W�
�b�
�	j����s�=z衇
o�(�E�iذaZ�l����M�@i����k���_ս{w988h�֭rqq1�U��ѣ���kǎ�ر��(
�S@Ű���߿��l٢������N�*/??_>��N�8���d5i��t\OJ-�@e���n:��7�|S�֭ӊ+L�r��ࠕ+W�ҥK


��f3���p
p
~��>��s�P%}��z���?��Ϧs�ZqssSbb��nݪI�&�����>�5ԯ__/^TNN����L�@�q��!���)((H,0����ŋ5t�P���k���s�Z��p=�f�2�UFVV��z�)�k�N��Ѧs�Z<x���y
>\{��5����)@	._���u��O��~��:tH��v��,��l6��|�I}��7JNN柛p���O�>:~�����դI�Ip5NNJr��I���(::Znnn�0a��$��^{�5}��WZ�z5�)p�888hŊ���WHH�l6��$(����~��$�}�����T||����k�UPy�\�RӧO�ܹs���g:j777%&&j۶m�8q��(���G�Q�
Լys�O�>z���NT(AZZ����{N�<�����v���hEDDh���s��S�|��jӦM��>�@�ܹs
V@���O?)  @>>>���0�5��5z�h
>\{��5��NJ���!OO������z��5e��={�`T6�MԥK��j�*9::�N�o�̙��{��~��tHb8(QFF�ڶm[�ɓ'�nݺz��
U@�2~�x�رCk֬������$�ժ�˗�f�)$$��R�NJp��Qyxxy�^�zz��w���CeP9,^�X�f�����]\)�u IDAT���\���M���ھ}�&N�h:d���v�@e����nӦM�t���y�n���ץK��}�vY,C�`ή]�t���+<<\3g�4���%K��������Ps�pr
p�o��V����G�,�>��%%%)66�&��ygΜQ߾}գG���;�s��駟֋/��g�yF�|��5'�W���Uxx�~��WY,�?^���ڽ{w�Ç�j�꧟~R�F�L'�M����޽{����ڹs�\]]M'��f��O�>���k�.5m��t��'�tP���~��7=���ڽ{��9�˗/�iӦ����nݺ�[�n��Q��y}��7ھ};�)PEX�V-_�\���
		���e�ZMg�aN�r��qIRfff� Jxx���yM�8�p����룏>ҪU�ԡC�9�2pssSbb����5a�EDD�NP�p[�*YYYjذa��z���o�]���7T�l۶M�z��ĉ��믛�ܠ�K��駟V\\�BBBL��9��p��S$���K4Pf�<yRAAAz��5m�4�9�?`РAڽ{�F��;�C�;w6����e:�
<==���a:n������U�|�,��$���{�{��
�ٳgM��!NJ���C�N��ŋM��M�M�֚5kJ<U
P�X�V���K�BBBd���	NJ���C�8=@���kɒ%��������@9rssSBB�v�ء	&��P0�������V�>l:*�ƍ5n�8����z��L�*@�.]���+22Rqqq�sTs������Q������4p�@���W/���@


��ݻ����;�P�.]L'��,v��n:�
}�Q5o�\����S�Bdgg��{��n׎;���b:	P�l6�~�aeddh׮]rss3���I�>@)yxxpr
�j�n�kذa:u�֬Y�`
�V�U���X,
		��f3��b8(%OOO������
1c��^�Z˖-���n:p���)11Q;v����M���NJ���CgϞUff��(W��׿�ꫯj�̙�ݻ����;w���5k�,-Y��t�j�������$��ST+G�QHH��~�i�=�t�����3F#G�Tjj��Ո�n��MGUA~~�\\\�p�B
4�t�aYYY�޽��ի�͛7�N�:����l6=��#:r�v��%777�I��NNJ��AmڴQFF�����v��_~�E			�$IV�U���U�� ��f:	@5�p
P���:r���æN�����kժUjٲ��@%ҴiS%$$h�Ν7n����)@�mۖ�U^BB��x�
EEE����t��ܹ�,X���_K�,1���c8(///��������~
:T�>����׿��Tb�رc5r�H�ٳ�t�*�b���#����/��C=�3g�����t�ɹs�t��w�y��ڸq�M'*9�ͦG}T�VJJ
��F�pr
P^^^���)��ͦ�*''G�W�f0P*V�Uqqq�Z�
��f3��
b8(�?��Orvv�ѣGM�@�L�4I_��Լys�9�*�iӦJLLTrr�ƍg:@�p
P�jՒ���>l:J->>^3g�Ttt�|}}M���N�:)&&F�g���ŋM��bLUM�6m���a:J%55U#F���ѣ5d��9�*l��ڵk����t�]w�[�n��T��n7T%&LЗ_~���T�)�Ξ=+yzz���?��j5���l6�}�Q>|X)))rss3���K�>@yxxpr
�J///O�����jU||<�)�rQ���������o:	@�p
PF��޺x�N�:e:�iܸqڵk�֬Y�w��U�&M������d�7�t�*����<<<$IG�5\%���ќ9s��;��TC;vTLL�>��-Z��t�J����n��6խ[W���S����$���iҤI�߿��@56`��;V���ڽ{����)�
h۶��9b:������|Po���@
0c����+00PgϞ5���b8�^^^���R���SPP��֭���8Y�V�I��j�*>>^�k�V���u��%�I*!�S������)*���0<xPk׮UÆ
M�jWWW%&&j׮]?~�M�755���U��"��b��*Nn����222d��M���̙���O>�w�a:Pu��Q.�|�E�U�~�ڵk���|0��OOO�����ɓ�S�p�7o�رc5u�T��/1������5~�x���)%%�B�Z�vm�^@���9�(�3gΨy��ڰa�z��e:@
u��q����G�Z�j�g����c���ڽ{����*d����L�q�24UD
'�7�Y�fjР����M�������-ZhѢE�*�ժ��x9::����t�R�k/^ԤI�ԦM999�u�֚<y�rrr
ׄ���b��O>)rݸ�8Y,�=�b�y\�=�|_ZZ���飺u�iӦ
ӯ��Zd��ӧ5|�p5m�Tu��ѠA�t���b_��˗5e�y{{���I���W���5���0�j��S�����_�S�@���Z�~�������a:�"������#Fh������Q�=J��σ>��?�\�j�Rff�:t�.h߾}rww����ձcGիWOiiiruu-v
��^�=���zҤI����E�>��裏$I����֭��=Zd�O<�O?��poI�0a��{�?����3�w?3����Fyyyqr
#fΜ�+Vhٲe�*�:(66VQQQ���UDD�RRRt�=�(55U�.]ҁ��ﯯ��J111��F�iѢE:��,�ͦ!C��󊍍U�ƍ��F�n�>.�W�Vzz����5y�dIRbbb��3g��ѣG��ᡝ;w*77W�7o־}��]�`�e������Յ4w�\IRTTT9}�@���)�
z�״b�
<x�t
��/��c�=�w�yGcǎ5���8q����ԲeK9rDG����^����~+���ڴiS��cǎUdd��������^xA�~��'�\���N�:i߾}�ڣ�w�V׮]%I?����6m�Z�j�f�I�ڷo�hÆ
�իW�5?��3=���EZ�l�S�N顇��?����i���@5��p
p��.]��Ç+;;[V��t� ##Cw�}�y���ř��l6��q}����?z�����Nnn�|}}����;�S�w�s��%
������~+����͕��c�
n�Sp]ggg���*;;[u��)��ŋU�~�"k�-[��Ç6���h���=z�\\\~�s�9n�ܨ�m�*//OǏ7���x�u��k����s(�ժ������ʺ�k�$�s���2�Q0�r�}
O���]�v��ԩS����VA-[�Լy�J�5��)�
���$>|�p	���n�kȐ!����f���P�4n�X�Z��$
6Lv��؏���"�y�嗕��&___8p@/���u�iݺ�$�رc�ڣ4<==%I[�l)�|RRR��7n�aÆi�֭JNN�ĉu��9�3��{�	�)�
ruu����222L����x�
}��Z�r���?����(IZ�p��M����|�>}Z�Ǐ��bQ�^�
�nܸQ�f͒����mۦ�={j���ڸqcᚂSN�����$���jϞ=��Gi���H�F��-[��ҥKJNN�ȑ#��m۶�,����u��u��I�:u�T��&�����@%����.]�ۿ�?�w��]ݺuSTT���ۺu��>�@�F�2��
��ʒ���:T�5mݺU]�tQff�:v쨬�,�ݻW�[�ֱc�ԩS'5h�@iiijԨ��7o�3g�H�Z�j�cǎ�z�>���~>77WݻwWjjj�u!!!��+*X���o�[�_��O>��kז����NNA���]��ΐ$yxx��o�5���:x���Ç3���6l��۷�^P�:u$I�5R@@����
�F���u��	EEEަ�u�֊���ɓ'.I�={�ڴi#����c���jժ����Zl��prrҦM�&777999)88X~�a��#G�ԂԵkW9;;���Y�۷פI��hѢ���j��SP�\�M4��曊��Ց#G����������&M�h����Pm�;wNw�}�n��V}��T���m۶ձc�t��%�)��ͦ��eggk�����Ziܸ��{�n�7�t�����/^ԤI�ԦM999�u�֚<y�rrr
ׄ���b��O>)�޸�8Y,�X"���+�f�+ߗ���>}��nݺjڴ�����믿Y{��i
>\M�6U�:u4h� ]�x��uOOO���+##CS�L�������T�~}u��]���/��@���+�hÆ
Z�j�n��V�9��:(66Vs���…M��`��.''G=z�PJJJ��|�A}���U��233աC]�pA��퓻���?��;�^�zJKK���k�k��R�!���<M�4��?�\d��>��>�H�����nݺ��ѣE�<�����O%��
6T߾}���P���1c�\�cIҲe��hذa�s�P/��f͚����Z����sTn냊����s�=JMMեK�t����뫯�RLL�$�Q�FZ�h�Ο?����f�iȐ!:��bccոqc]9Ke���v�+y{{+==]��ٚ<y�$)11��3g��ѣ����Ν;����͛7k߾}�k4h�-Z��>�$�_�^����p��Ν+I���*�O@u�g�=��3z���L�o���x����WgΜ1���pr
*\�N��o�>=zT��~{���~��<<<t���kӦM�Ϗ;V������SRR�^x��������|r�u˲G��w�ޭ�]�J�~��g5m�T�jՒ�f�$�o�^І
ԫW��k~��gz���z��={���_�C=��~XjӦMy||j��gϪk׮���.��j:	��"33S�����[��W_����t���p
*����~��k����Z�:����UZZ���N�޽[��΅��4�R�=
ޟ��[���v{�m
������\egg�N�:�׺x��ׯ_�vĈJNNVFFFa����&O��ѣG����z�.//O�{���ӧ����&M��N�ڿ����4t�P͙3�t���m}P�._����gee]�A�������,i��!���j׮]䱇��Ο?�S�N)&&F��w_ᭂZ�l�y���kPs�5J{��UBB�)��}������ܹs�p�B�9��)�p�[��$;vLv��؏���"�_~�e������W�K/�T�{�����$i˖-E�OJJ*����C'N�P�:u4l�0mݺU��ɚ8q�Ν;�1cƔyo5�?��͟?_�/V�L�`L�~���K/),,L��ɦs�#�SP�%I���ڳg����u��i�?^�E�z�*\�q�F͚5K���ڶm�z��ٳgk�ƍ�k
N9IOO��=J+$$D�4r�HmٲE�.]Rrr�F�Yd����._��:u�(::Z.\P�N�ԩS'IEOh�+mڴIcƌ�ԩS`:�^�u���KAAA���M�('��,�YVV����t�Сb����h�֭�ҥ�233ձcGeeei�޽jݺ��;�N�:�A�JKKS�F�Լys�9sF�ԪU+;v��{H�n����W?�����ݻ+55�Ⱥ���������V�z��]���O>��kז��P3;vLw�}�z�쩕+W��6fTw����U�-�a�����/��SP�6l��۷k���jժ���ꪀ�%%%�����ĉ���*�MO�֭��'O*<<\�4{�l�i�F���-�e���M�6),,LnnnrrrRpp�>���"�\\\ԲeK���O]�v�������վ}{M�4I�-����(;;[O=��Z�h�ŋ3��5j���D}��7�"�&89(}���,X`:@%g���͛7k�Ν����M'P)�^�Z������5|�p�9n'����K�6��
x��7�v�Z-_���~GPP�^~�e���i�Ν�s�����[���3Trk׮�k�����H=��s��M��޽{�_�~���M��A����KgϞ�/��b:@%��~
<X�<�F�e:�*�j�*>>^����ׯ����L'�����[�������/
T����tUJÆ
�f��ݻW�G�6��0��www9;;�ȑ#�ST26�MPNN����h:	�*箻��…5o�<-X��t�2b8(V�U:t���̸q�}�v%&&�Y�f�s�����4y�d���+99�t�2`8('^^^������X����������c:�*o�ԩ�ݻ������?��PJ����ۛ�Sڹs�F�����+44�tՂ�jU\\����տ���NP
�����K�|�����<yR}��U�޽���o���ZiԨ��g��7�t�R`8('������щ'L�0(''G���S�z�/��j:	�j�}��Z�p��̙���X�9��tP]x{{K�<�V�Z�`�ȑ#u��!�ܹS
64�@�տ�޽[����С��u�f:	�5pr
PN\]]դIedd�N`Hdd��.]����5Pq�z�-���C���:{����p
P�ڵk����`�_|�	&h���z��L�P#X�V��ũv��
��f3�������SG�1��&��������Ǜ��FiҤ�����q�ƙ�P�S�rԮ];>|�t��(++KjӦ��ϟ/��b:	��S�NZ�`���}-]��t��8��///�8qB���rqq1�����v
<XgϞ��ݻ�u�AԮ]��׿�Uw�u�:w�l:	����)@9����nWFF��7��)S�~�z%$$�e˖�s���}�]���)00P?�����)@9����jաC�L��`+W��[o������L�IV�U˖-��nWhh�l6��$b8(W���rwwב#GL��@{���СC��s�iĈ�s���ܔ���m۶i�ĉ�s�����q���TcgϞ�SO=�{�G����s@	�v���hEFFjŊ�s�����yzz*==�t�
��������V�ZZ�|�j׮m:	\������kذaJKK3��h����ۛ���=z�v�ڥ�k�����t����{O���
Թs�L�5�)@9�Vff�N�>m:@9�裏4o�<-^�X:t0�J�v��Z�r�rss*��f:	��Nʙ���$�ȑ#�K�����Z���ꫯ*((�t(777%$$����^}�U�9@��p
P�Z�l�z�����æS��'N(((H�=���N�j:�___EGGk�v��e IDAT�Z�z����q0T7�EJOO7������_���h�B�/��b1�nаaÔ����C��]�v�뮻L'5'��]�v��Tqv�]C������Dկ_�t��f͚�Ν;+00PYYY�s����xyy1�Tq����֭[�e˖�m۶�s@9ptt�ʕ+����A����˦�����xyy��ѣ���7��$$$hڴi�5k�z��e:��-Zh�ʕ���/5m�4�9@��p
Pڵk�K�.��3�����ۧ��޽�\������s���0��x�����8s����>}��rJ�l(3[f&�(����S*�$C3c޿?���������z��/�����������E{��ݻ����䀦M�j޼y�8q�������{&��j5:��\�|Y%J��ڵkծ];��H�?��S�7VժU�q�F���	�(""B{��Q�Z����WVNr����<<<t��1��H���$u��ENNNZ�r%�)���S�:uԹsg���ȷ(Nr�����=jt���k��������?lt����(""B�.]R߾}�¢@Π8�!5k֤8�#�̙�E���O?U�z�����+*""B�ׯ�ĉ���K�9�f͚l��[�lѰa�4q�Du����8�͛7�̙3���jݺuF����u����_�}����������q8p��	5i�D�=��V�X!��dt$`���@EFFj߾}�Q���q���Bq
�C�?.OOOY,5j���8��f͚���U�|���܌�v��u�h�B			ڳg��+ft$ ?����C{�19;;�ȑ#FGp���d���K.\PTT�)@�T�paEFF*..N}���d�S�R�P!U�ZUǎ3:
���=Z�6mRTT�*U�dt��T�TI���֔)S����9�f͚��������O>�����q@.��SOiڴi;v�6n�ht ϣ8�A5k�d[ ����7�|S}��5:�ņ��������6:����l�
�E�iذa�|��L&��q������Vݺu�n�:999	�r			jѢ�n޼�ݻw�����H@^da� լYSW�^��at�@�v횺t�"777�\����.nnn����ٳgկ_?�@�P��5jH��?np�`

ґ#G�v�Z�(Q��8 �R��V�X�U�ViƌF��$�S�T�|y�,YRG�5:
P`M�:U+V��ʕ+���it��j�JS�N���m޼��8@�Cq
��<==)N�n�:�5JS�NU�6m���7�|S]�v����~��W��y��ʦ�@��ݻ�.^��u��(P>,u��Y!!!F��@BB�|||��Ci�Νrss3:�XX9�a�j��O?�dt�@���ձcGծ][�|��q@>�����H���o


2:�gP��5j�ԩSJJJ2:
P $''�k׮JLLTTT�\\\���U�jŊ
ӬY����	�9�V�ZJNN���Ǎ�Æ
��ݻ���_F��P�֭5i�$
>\۶m3:��Q���ի�cǎ�Z�FG�E�i�ܹ
V�F����#G���Wݺu��nt W3Y��9 رc��}�Y�1B���q@��?����[�����oT�H�#����@�w��)��f���h���2�LFGĉ'd6�չsg���ȍ(N�m			jڴ��V�v�ڥ�ŋ	06lP���5s�L����F�r�CF' ��V�^z�%�={VQQQ�C���z�w4|�p�ر��8@���)۹s�fϞmt�q͛7א!C�u����k���ڸq��~��l #�V�����k�.Y,U�T��H@n��)F;u�"""��9*""B�}�]���裏�gϞT�V�҄	��GQ�g2��ҥK���OIIIFGr
VN1Xhh��k��H��/_��kM&�$iʔ)9r�L&�~������O�>�?~�fȊ�G��I�&���ӢE������Ƚbbb$I;v�رcվ}{;vL:tP�&M4k�,��T�fM}��
�'�|bt W(dt��s�N͞=���e͛7א!C�4��իU�BEFFj�޽�޽�5j�%Jh�ʕrqqɦ�٧}��7n���z�������H��X9%�9u�"""��Y��.��DEE�C�z衇������Y�f:������
�Z��ڴi��]���ٳF���)�Txx�� ��<�/����j�ԩ��2e�hÆ
�:u�ƌ�;vh�ҥ*S�L����L&�>��S=������֭[Y�
+�r�իW�dɒjٲe�v�ɤ���?ھ}�֭[��e��~0&$@J�(�իW+66VC�5:`�S�RTT�ڵk'gg�T�~��w����_]5k�|��ҥN�:
		�'�|�ŋ0�)�\��ڵk�:w����ŋ���S�Ni��ݚ={�\]]
H	�>���=z���{�x�(N���ŋ*\��L&�
.��/>��L&�L�v]fxyy�d2����~�L&իWO�����w_��!::Z�V�6m�m�O��/���� i����60%@��?^�Z�R�.]gt�8Ȣ��P%%%I�����b�
��>}��t/cn�g�.����3���իպuk-ZT��d�խ[W?���v�ءiӦ�H�"�H?'''������U~~~�C�)@-Y�D���K/�8��V��V��W�޽����˗+111;���


U�B�ԫW/I��z�ς$IK�.M�����X���ڲe�:w�3gΨ]�v�߿����~�A>>>FGȔ�%K*22R���׈#��<0�Y��^e˖���U�tiY,:t��h�J���զM]�tI���i�]�j�.]��6mڨ|�����2d����N�:eWdhÆ
JNN֥K����#G�h۶m�9s&���<�^�z
		ќ9s�La;�U� O����ʕ+�p�����P@@�>찿�d���n�E]�v��?,U�VMo����^�z�\��:z�쩢E��G�)����o��Q�F*Z��ڷo��,��y�fy{{���E�J�Rǎ���4s;vL&�I�˗�͛7��y�ʗ/o�o���ҷo_I����v��?-7n��K/�$wwwM�:���Ӓ����3g����ʔ)�B�
�lٲz���m�6�פ�]"�>��cݼySÆ
S�^��-Z �t��U#F��������q&+{Y*44T�-E�>��c��k�N�/_Nu���U�V�R۶mS�;*>�S�"E���`?^�t�������T}�x�	�رCE�Mў���J�*�ܹsڷo��f����;y{{���C�������R�g��3�h˖-���ݻ+,,,SYlㅅ����_�n�Jq�������5n��a�ժ�-[j��튊�RǎS�7::Z;v�SO=e/���{�~��<<<t��%����z��R]w��IU�^]�J��ٳg��⒪ϝ�M���#Gj���z�����{�3��ʕ+jٲe��<���j׮����.���I�����������*Iڶm��z�L	`���d�m�VG���b��?lt$ �XX9��ŋ���+W�hذa:~���]��ݻw��_VRR����u����Y��T����~~ѢE����
8P���z�W��/�())I�|�W���>H�m�ƍ:w�j׮-��,IjҤ�<==u��Y}��i>�����?*>>^~�a��HҀ��k���_URR�v�ܩ�ի+11Q�^�Y���$�{U���I��/�,)s�p���ѣ��V�����'88XV�U={��oa�ŋ5i�$U�\Y���J�}�gʔ)ڿ��֭��;w*!!A���ڳg��6m*�ժI�&��zG����W_i��z�*�) _srrRhh�
*�nݺ9,N��S��}��'���ӨQ�4c�U�^]�������i�С���׼y��gϞ=7n�$iĈ��[�`��_���ݻ��?֣�>*ggg�h�B+V��$}�駩ƴ�߻w����?f�yyy���]+V�R�68}�T�"ggg5k�L,�$}��wif�ҥ�J�.�
6�ܹs)����iݺu*U�����$e��ض�Y�dI�^����s��-}fΜ���x���[rvv�o���V�X�l��5k�"E��p��jҤ��-[&I������%2穧�Ҽy�R�T��)SF���ڻw�F�at �P��\mݺu���^{��y�J�6m������ٳ�n޼�6m�h���)���W�������l6�j��_~I���k�ڵ2�L��Jlz��m����g.G�Bd&�͠A�R�5m�T�t�…{�n�j��K/��͛Z�ti�s�}��nܸ�^�zٷ[��{y��'U�vm����V����/u��iyyy�W���k׮i���*V�����f���_e�Zհa�T�l�]�v�׳�G�)V����
hѢE�9s�}�@�*�S��>|X����!�ɔ�S�n]I��U���� ��믪^��V�X!''��O�8!�N�+V��jٲ�*W���\�*U��SO��
���<�H���d��V�Z�6777IJ����T[�ܽ�����ҧOI����Χ%""B/^T���U�x�ψ�'Oj�ڵ;v�Z�n-I����G�H��={��7�TPP�<ht �Q��\����Y�h�"����x��Z�f�J�*���իW%el��3[�nuX��m۶���d5����K���S�:uԬY3;vL;v�$Y,�����'�T����}��^z��-'''EGG��?��$���Z�v�
*�^�z�w\�_�޹=SV�\�RժUS�j�ԡC���{ڼy�=cZ�K #�N�*ooou���+y
�)�Պ-*I�t钬V�=?�V�駟4t�P�L&}��g�S�N�������Ç�o߾t�ݻw�~��t��L��v��)�VM���^*T���{N7n�вe�$I˖-Ӎ7ԦM�/_>͌�/_�֭[U�dI����������ѣ�N�<�Z�ji�رZ�x�֬Y�cǎe�=��899),,LV�U����Z��+(NA�V�zuIҷ�~���գG%$$��w�U���׶Nlll��^�t���+��U�a[��?=2�%�u��M%K�TTT��bŊ�gϞ)�e������W���VckO˶m�t��
�l�R�
���6i�$I҂��O?i„	
T�R�bs�֭l����?���H�ڵKo����q�lCq
r��^��⁛7o�:.�ɤ�mۦh>|�bbb���1cƤy���~Z��x��T�bcce2��裏J������g�I�^{�4�<x�$��O?M�_=f$KN(R��t��%M�:U.\P�=Rm3��bӱcG�,YR?����/_�C��t��i�ضz��'3�x�t��	I���6c���׮]˶{�4l�P���ׇ~���p��ق��j�V�%�k�.=���ڻw��u�V
8P�{�V�B���ۯ���ּy�T�~}-[�L&�)�{4H�VHH�F�����+!!A[�lQ�=$�oE�M�6�̙32��-�hڴ��x�	�9sF�7oN��f$KN	

�t{�{)��>R��˝\]]ս{wI�o�!I�ٳ�\\\����F�e���r�ʒn5�?^���:t�^z�%M�>��ﯿ�ʶ{�ҧO
2D���ӏ?�ht �(NA�V�bE����H�"���դI)RD�<�.\���$͞=[�?����	&H�bbbT�X1�L&��5jh���2�L�<y�ʗ/��E��U�V:t萚6mj_R{ɒ%��W_}5]�m��خ���d�)���דO>���G���S�&MR���{�����…)���رc��WP�F�)I���U�|y*TH^^^���O5v�XըQC��o߾l�'��iӦ�l6�s���ᅪ�d	�)�ڶm��*00P�<򈜝�U�D	=��sڴi�
����?���{j���z�T�dI����V�Z�8q��n�*WWW]�tI���*S��}���Wɒ%�f�]�t)۲�4��)�VM���{�����jժ%I����lNW����K�] �]��K����W�…���g�}V_|�&L���c�J�,X�m������?�\ׯ_�����
r#��j�� 

U@@�l���cȋ$I˗/wx��ٷo�Z�h���zK�&M2:�VN �jܸ��ϟ�ɓ'kժUF�2�������W�~�T�V-խ[��H@��r
��̙3U�~}u��Y���F�2��r9}���JHHP@@��V�ё�t�8�<�|�򊈈��͛5~�x���Fq
yDӦM5w�\M�8Qk֬1:�.���0@���W�>}t�����Eq
y̼y�T�vmu��Y���F��T��p�[�nFG�L��������1�-}���2���ׯ�V�Z%��dt,�!VN�e*W���]���k׮jҤ��1�+*""B�֭�ĉ���+��2͛7W��͍���7o�3fhȐ!2��j۶�ё�T(N�eBCC`t�2-_����ޫ����^���ڷo�jԨat$ �Sr���p�#@�Qd�`͟?_����ܹ���٣bŊ	��8%��ڵ�� Ӣ����P����*22R
6T�~�.��dt,@���@�U�TI���Ҕ)S���Q�������l6��g��$���2��j۶���r��G���{�����7�ԛo�ɶMr�SO=��ӧk�ر���/��Hb[�<'66V�T�n��^^^�e�M�z�-m߾]�%W����;w�V�\)�ժ�ݻ���S�?���	 :t����{���S���S�jՌ����S�{�؎��۷�{_�vMcǎ����<<<T�B���j̘1�v��N	� X�`�{�1���*!!��8(�(N��f���l�2I�…e6�&I�3g��f��1q!!!���S�=�m={�T\\�BBBL �rssSdd�Ξ=���@Y�V�#�c[d���5�|�ڵKW�^գ�>��^zIm۶M��ʕ+Z�p��l٢���Ke˖�3�<��� +V���VP�3f(&&F�ֳ�>�7�xCE��$ݺuK.ԦM�t��Y9;;�Z�j�ر�:u�b�;��X,��.\��Ç���S,H��N�������+W�ƍ�\�r�>�˗����[ŋ�؋���R��BCC���ϫq��z뭷�����<�V$q��1����J�*Z�j�bccշo_yzz*444�s\�xQ}��х�m'N�иq㔜�����K��^�������ɓ�~�ΝShh���ݫ��`����{�����$%&&jժU�u�F�-I�;w�}�I�q�~��G����p�3f�Е+WR�d�s;��_*Z�*8 IDAT!!A>>>����h�޽ڴi��t钡L��>���N���#G�A�z��g����m}���XI�����㜶t�R]�pAu��Qdd����u��Y�l�l�2�<yR+VTpp�v�ޭŋ�B�
:q№,Y�j�*U�(22R�v�R``�$i�֭�󑑑�no_�{�n}��7z��%I+W���r��ŒjE��U�j׮]�0aB�?���k�.IR�ڵS�kk������o���O={�ԯ��jt@��!�b��u�:<�i;w�$�1B�+W����F�-�ŢիW�يJF��������Y
4ШQ�$I[�lI5�ȑ#U�re.\ؾ
��˗��m+�,_�\�������'�Ţ���t��ի�\\\r�9z���7w{��GS�����+���W			F�@CqJ`6�e6��ES�N��l�ƍ%I'N���IgΜ�$լY3�~�O��$5h� E�O<�b�;U�V�����$�֭[��7�xC�֞={4s�Lu��]���JLLLw~[1HF����x�$�x�����l} ����)22R����ht0� �L&S������n���iާu��ڰa�ƍ�
(11Q���W۶m�jժt�^��X�V��III��g�m�>�P�5[[V�ңjժ


Պ+4k�,����8%�X,Z�p�$���K�Es�̑$5l�P���I��׿$I'N�H�_�
$IL�n;��������աC-^�X˖-S�>}t��e͘1#S�يB���{��gK�s;R�LIR|||�s�6[�imڴѤI�4b�m۶��8( (N�#bcc%�.Nqt� 4k�L�4}�t�;wN����-�:w�l�ײeKI�￯��ݼyS111�<y�$�E��wǎe6����+!!A5jԐ���$ǫ��:u�c�*UJ��k׮��ɓ�2eJ���ѽm[���o�Ƶ�ef� Ȭ�#G�S�N�֭�~��w����8%��
�)���S�2e�v�کy��
�$
0�ޯO�>�\��N�>���@y{{+00PgΜQ�ʕ��{���G�4e����VӦM5z�hI�W��������}��i�i+��5k�Z�h�nݺ�dɒ�~nG�����םlm�)���2�LZ�d�������W���FG@>GqJqw1ʡC�R?eʔQHH�Z�n��ŋ���Y�k��|��m��/^\!!!�֭�ʕ+''''�+WN={�Ԓ%K����{���jܸq�U��\\\���jժ�o߾z��w���+���IIIIi�9l�0����D�rqq����Ǝ���vt�6m����M;v�H5�;T�X1=��s�Ȋ�E�j���:~��
dt�s&��j5:DA����^����,X�ŋ+**J+V�$�>}Z�:u�����/��~���˗;<@�~�zu��A�f��k��ft�OVNrX�>}T�|���_�|�<<<ԫW/�(�ڶm�w�yGo������P���^f�9GƵX,92nAP�H�?^C�U�޽%I��њ={�\]]
N��3f�8��]��b��R�JFG@>Cq
�4j�H�����%I����6lhp*�L&��,Y"ooou��U۷o����ѱ��P��ϰ�I����/�c@*���Z�z��4i���kѢEFG@>����j֬�e˖)88X.4:��S�$�C�7n�^�u}��F�@>Aq
�{�wԺuku��UgϞ5:�BF�cFG�L���P׮]���L0�L�����O�k׮ڲe�\\\���<��\�[�nFGP%J���իմiS
:T��ё��Q������������N�:
		����7n���@�# ��8%�ٹs�fϞmtȲ�͛kȐ!F�@���jԨQ4h������O	y�CF@J�N�RDD��1 K"""��w����w�U�V�ԥK���y+��R���FG�L0:�����BCCոqc���髯�����ѱ���r
HSɒ%����kĈF�@Cq
��z��)$$Ds���ҥK���<�m}򘸸8�m�V%K��W_}�?��C�:uR�r�~�z���l6K�,����\�����������rww�ƍsl�mG�bkK˽�WV�&=���ؒ�u�VEGG�СC�z��jժ�g�yF;vT���35fnq��QլY����p�ٳG����nݺ=�h�E�v�}��iРA���R�F����<��<&66V�T�n��^^^�eB�m�6]�|Y�t��em۶M�[�68Uޕ�����~[�~�m�������(88X�ƍS˖-�	�Eo����o��h��;w�V�\)�ժ�ݻ���S�?��I�L�<Y?��|}}e�X���	��)y̽�Slǀ$�Y�F�Ԯ];}�����6�8%=+�d��1w��]+Ԍ=Z�~��ʕ+�A��Y�f*Q��Ο?���H-[�L����h�"իW/K�2����_�vMcǎ����<<<$I���3f�"""T�H������BCCոqcu��M_}��������\�!���f���l�2I�…e6�&I�3gN��4A�v��9�۷O�J�����,YR{����獎�'�ܹS;v�P�ҥ�d��o�^�K�����*T���^{M��򊒓�5�|��f�����ũG����={*..N!!!&��ʔ)�իWk�޽1b��q�˱rJ>���_+""BG�Qbb�ʖ-��-[j��rss��U%v�ڥ)S�h���rqqQ���5d��-[�>^F�J��AY�x�6oެ?��Se˖�/���_~Y...��
ӌ3�…��g��o��be����K������u��5=��35jT��Yz3�w~3�9�s�p�B
>\���Z�`��|tt�nݺ�^xAE����?���0EGGk��)��?=��d�ݤו+W�p�BmٲE���ʖ-�g�yFAAA*V����ڵk%I�{�V�r��ս{wY�VժU��uw���gZ�9;��,j�3ە+W�ƍ�x������z���ŋ�o���4h�@�-�����f�������\��<��K�cǎ���_U�TѪU���}����S�������/^�b�s��),,L�/_ք	R���쿀OLL���u��A}��grww�pߤ�$���+:|�����g�*88X����;w�z(�=T||�}�U�V�֭[=z��ۅ���:}�����7����l:����ߌd�̜͘1CW�\IQ8`�Z��_H�ڷo/I�С���´v�Z����2�L��o�%3ss?W�^U���u��I{۹s���{�*88�^d��?J��5kv��-����g(���OG�9���ȗ_~�������:��㣽{�jӦM�ҥK��y_Ϟ=�o�>
0@u����?nt$�Bl듇���J����۬X�B���ok׮]���o��'�H�v�ؑjܝ;wj���ڽ{����U�B�9sF�}�Y��~��g:|�������N���z��ǵw�^EGG��J�*���Ԯ]�(Iںu�����~�ӧO�G�ҥK�{�n-\�PǏ��|ݹ�ݟ�e$sz�7#�33gU�Vծ]�R�۷OgΜ����jԨ!I����Μ9s��Irb��{�������ϲe�t��IU�XQ���ڽ{�/^�
*�ĉZ�d���_�%I�X�b���ާ�����{�b�؏w��%I�]�v��lm�>(ئM�&ooo����…F�@.DqJb+F�[���c�o��F���S�:u�a�}��G��$�^1�no���|||������WS��8!#}7o�,Iz������)'''U�ZU�Ǐ�$�_�>ո#G�T�ʕU�paH�._�l?�m�6IҨQ�T�n]9;;�aÆ����֔�[F2�w~3�93s֫W�T[��
l���t��Q��f���o�%3ss?���ѣG�~��rvvV�
��mٲ�����I�t�֭�<�}9z���s��ˑ�G�J�]�r�G}4ElNNN
Srr�������lt$�2l�ܽ��ԩS5u�T��ĉ5q�DI�W>�pႆ
��~�)�XV�5U���w�c�2���G���:uJ���d9q�D��jժٿ�mtg1�m���맸�'�pxI�\%DJ=�ɜ��H��̙�@��ʕ+���?�P~�a�k�nݪ�W��X�b)�sb����Azefn�Ƕ=Q�
R�۞�̙3��r���?��ٳgU�jU��Y�V���?��5#�~��jω�/G.^�(I*^�x�s�6[����իբE����M�oV��S�S�꧟~�#�<�^�z�w�Qxx�=�*��F�K�J�푞��
`��h�ggg��&�)�yۘw�}w���H���oF2gf��^ec�ƍJJJJs��ׯk�ƍ�ڍ���dfn2�Q��� ��o���u���O?��}���+�;�~���='~���s��[[z�@�аaC͟?_ӧOO�ߠ(xX9%�X,ڿ�������%K�h���z���հaC-\�0E�={�H����U�T)I�ɓ'��o޼��� &&&�J"�$=��c��������~��7�]�V�~�;=��#:y���/{�mk���H���oF2gǜٶ�={v���|��2d������痡�sz�Ӓ�O*TЯ�����I�&�����i��/h���Z�|�ڶm�ҥK��֭[Z�`��V�^|�E�6@&�)Պ*�Y��n91��)SF�ΝS||�ʔ)��\||��p�>}�h����ׯ�j׮�z��	�+���"///�ǎ�޽[III:r�ƌco�|�r�~�&MRll�n޼��ߗ$�i�&՘����OK�F��#G�(99Y���>��#��f���+~��^���k����y�:�I�&ex,G2��~��Y���Ǐ맟~�c�=��M�:�ӴiSU�RE������1+���󟖜�~jٲ������7o*&&F�'O�$�h��޷iӦjذ����O���W�6mҕ+Wt��
:tHo���٣f͚�(��.EEE�ڵk:y�L���i�ˉ����b�2H�j֬)I���R����w�>}��f�|}}����+��)Niٲ�֯_�q��iܸq��9r$���K�V߾}S�S���w������۷��mۦ�����+E_WWW
6,�'u�W�^���u��Q��۴i�������ߌd�ꜭY�F�ԣG�{n�b2�ԣG}�����[o���w��OKN|?���G[�lѩS���\�ʕS�M�2E�
��?��Q�F��駟�ĉS�}˖-�Y�fi֬Y��pE��ʉ�(U��.^�(___yxxh�ڵj֬��o߮��X5l�0E��,�l����F����__|�}�AL���G�]�r�С�w1b�Z�n�"E����Eu����ɓ�E+W�L�ƌj޼�
*�r��饗^҂���j���-V��������/999���]-[�Ԓ%K2�ڂ���.\(???�*UJ...z��4z����HF2�w~3�9+sv��
mذA���z���|�v�کx��ڰa�nܸ����OKN|?/^\!!!�֭�ʕ+''''�+WN={�Ԓ%K���ҥ�l�2
:Tu�֕����-�V�Zi����6m�\]]S\3l�0����D�rqq����Ǝ����rf>���+���IIII�n���iǎ���رCŊ�s�=���@�T�\9EFFj�֭z�w�����V���Yhh�d{
w�$��,I�X,��@��`�-^�XQQQ�X��$�����ԩ���_~���H��/_��Cpp�^~�eEDD�K�.F��1,��p�O�>*_�|����˗���#ՖB�#���z�Wԯ_?>|��80�)��)����+::ZgϞ�ٳg���ǧ����Y�f�~���ԩ���㍎P���F�i��>}��O��W_}U
64:�EDD(!!�mc�ܥ��`�Œ#}�/����7:�0EDD�e˖z��w5~�x�#�b���6m�9s�h„	Z�f��q�Q���� ���_}���ѣG������̛7O�k�V�N�ot<���L&�� K������\���Ejܸ����U�V�o`�|��\�y��
7:dY�ʕ���\�R�J���P�V���{�i�رFG@b[�5o�\~��Ə����9��Sr��;w*  ���e���Z�|��1�����kڿ����e�XT�zu�# P��KY�V�#@�Qd��?�~��Gu��I{��Q�bŌ��lƶ>�0���Z�z����ԯ_?�X �8�R�J���PTT�>���� ���O��m۪dɒ�ꫯ���S�N*W��֯_ot<C��fI��bIq<r�Hu��-]�d�^w�ck�S�"E��������'[�dDN�#<<\{��$y{{�s��~�z�)M�6MÇ�O<�6m�	ل�S���XIRݺuS{yy�)��;w���⌎!I�v�~�����ڻw��q�Ł4w�\�1BÇל9st��A�c���x�
������_?����q�M(N�c�U�b;�$$$h�ԩ���b��b�h߾}ڴi�:t�[�n��˔]�]���c����O�P��|}}5f�]�v��x��J�*�UBB��q�
(N��f���l�2I�…e6�&I�3g���d
�ƍk۶mںu��9L&�J�.�!C�H�:dh�����8�����ֳgO���)$$�d�:777�^�ZgϞU``��q�
(Nɧ���k���+jٲ����ծ];M�>=�_��
^�_��w�}W͛7�3�<�q���…)��H_�%s��Q�ԴiS�o�^���WRR��qO�8����y��jժ�&O��j����K&LP�V����1cƤ�Wt������iӦ���l9�۞=t�ǭX�b��{��}��z���{wWU����γqE��W�8@j��ס,�'�Dr�Fo�f�7M���9�*&����(��%�ү�)�9�(����w��p�숾���yܳ�^{��Z��x������͝;��ׯ��=�<�.=z�}��:������1o�<�w�μy��}�6K�,��ˋ:ХKF��ƍ�b[�v-mڴ����X^�Nc�TZZ�]��O�
������?��?�u8""""""""RLem��]bb"?��>>>4hЀ
6���������DDD�/^�����6RSSY�v-׮]c���&�fϞͦM���� &&�C��z�j�V�ju���LƏϑ#G�ם;w���P���Y�p�1Q�`ܸq\�z���
�}�6AAA���Ξ=k�f˖-ܸq#�ysqqa���,Z�����[o�[�^�r�
�1���/����y�8uꔱ,55���

�bŊ\�|��#G�$�<y��S����M߾}-���G���cǎ`�…ƕynݺŏ?�ȏ?�ȍ7��o�!==OOO�v===IHH`�֭8�0S#"""""bQ�=�={6�&M�e˖�����!��������Hi�R$99www��k֬`�����űw�^�.]
@ll�Y�{����?&>>���P�֭KJJ
�W�.R�իWs����݉��`���DFFҪU+���6k�A�DEEg\�9�v<��� IDATV���ٳԯ_�+Vϲe�8q�D�s����ӨQ#>��s�|�Uro�ԳgO6m�D�~��� �Y�r%�N��^�z���OHHu����ɓ,_��XwŊ\�x��͛��ݻy��

��ܹs	�Q�F,X������"*>>�ݻw3y�d֭[g�>..�f͚��m(3�)�7�xooo|||��_l�����������SJCr�����c�ݻws��7o��͛�?>�g���-��ɓ������-ZW+ɝbM�m۶0s�L\]]����Q�FL�6
��3o��...�+WθBǵk׌��;qss���֭[��o4e�-[�)S����ÿ��o�����;v���f8D�-ppp�e˖�c�c�={�0q�D\\\�X�"AAA$&&��_��=w�\"""�Z�*�|���8�$���p"##�r�
���$&&�$?~��P�WÆ
Mꈈ����Whh(���xyy�u�V�?i[�R�����888���`��3�1cpg��/2a��=j�VNN�YY���M�[�j��3g�T���������xN�<iVָqc�wC���۷�e��[�har��?n���Z�h�������Y�j~~~w��$�c�q������?$00�k׮���m�:��E-[�4)7�5%%�Xf�ޤI�B�d�)--�+W���#�Ͻ����{�۷�}���x�b������|���z�/_�J�*f��uDDDDDD��bŊ|���iӆ��ǛlG*""""""""��VNys��Q�ׯ����y��w���̷~ٲ�9J���2e�<
S�RLn�Voqpp0~���3;oh3o�y���+���#�<§�~j1�&o?����j�0*U�D���Y�x1!!!V��;Y��\Đh���Ò%KL��Ջ͛73u�TZ�lIFF�-�O�>lذ��OK�2k�)H�F���� ""�y���:���SJ���D�-[���;���,X��֭[���h��۷����믿N߾}M����29NJJ29�����nKa�:;;�i�&�����+FG���8x�I�ak���T�'N��?�d�̙f�
�7n�0�YZ᥸*W��nY�Wݺu8t�I���0���߀������c�w�:r���U�ү_?BBBX�r%#G��ڵk̝;�X�V�Z\�zլ}C��������HI�ݻ7�>'Nd׮]�GDDDDDDDD���R����n�ؒ��x2339v�S�L1��M�x���INN&++�~����ѻwo�6S�[�nq��1����t������Ã���[=���z
��3gr��A���8|�0�~���޽;]�t��S�F
6n��͛79u�|��q���ۜ>}ڸ����[�u�v�
�kRRYYY$%%1k�,:w�l�۱cG�̙Cjj*���s�=g�}___}�Q�J.�����Ã�?����t�����
��lc�B��_5k�PV�m�DDDDDD���[o1`�
�o��f�pDDDDDDDD��
�'�؜5�)]�v%&&��S�2u�T��ǎ����x\�fM���L�4oޜ!C��][��~~~|��w$%%1|�p���˗g„	�Բ�Ç���r��q��p')�R�D~&O�Lbb"���&�]�v%**�y�����=GE���a�������|�9r$;v���������sqq1)5j۶m#))�g�}֤�1c,�oooO`` /������/-[�d�ȑ̜9�>��,1�u����;vd׮]$''����.s'Ј������;;;����С^^^���R�|y[�%""""""""w��SJ���(�69�m�ĉ��Ջ
*��舛��f�2&u�[�Τ�ܹs�ԩe˖��ɉ��%K����h�va�V�\���P|||pvv��ޞ�U�ҵkW�/_^�U5Y�l���ԨQGGGz��IPP�U�899��K/��O�0ooo�U����#������;VǙ��e���#�н{w>��SZ�j�o�*U���qrr���'''�
���˩Z���n�Z��W�^T�R�5k��ٳ�ӧO�}�h�¸��a�///�N�JӦMqtt��ёƍ����{�g��w��T�X���X�vccc�\�2={��z�DDDDDD
�r��|���8q�_|��ለ������H!������:��YDD���nC��{ɰ�Gbbb�֕ߒ%K		a�ƍԫW��g�2`�ƍ��ѣm�ؚ��/����EDDDD�+&&�~��1o�<^~�e[�#""""""""�K��)"b��#GR�N�D���p���Ͷr����û��o���={l���������@�)"b�
*0m�4���9w��Ν#::�iӦi�w��L�2�g�yoooΜ9c�pDDDDDDDD$em���NO<�̙3��^z�֭[�8*y����F�4h�v������a��������HJNy�%&&ޓ����������a������C�Z�j|���k׎��>��3[�$""""""""yh[)՚4i�ʕ+	

eٲe�GDDDDDDDD�Pr���������z���c�ԩ���+����:�E�)"""""""�@x��w�ٳ'��ޜ;w��ለ�������W���e��u""E�~�z|||l�����<d����m۶4�;v���h�DDDDDDDDzZ9�>��� A�l��H�4�v���:yU�V�/�����$^{�5[�#""""""""h�N�N��ԩ���)��7o�����M�6����:$����S�3����:�b���!<<��a�����C��ˋ��@pww�m۶�IDDDDDDD䡥�Tdd��C)2%ى��������g�|���899�:$����S�S�
�u""E�q�F[� """"���=k֬�M�64�m۶���h�DDDDDDDD:el��������ȽR�zu���HLLd�ĉ�GDDDDDDD䡤�SJ�.ЧO�W����9s���ɉ��[�W��ǏӤI�"]���Q�z���Ej?o?�S�:�ҽ�?22�}��о}{|O���<��c,_��!C�кukF�i�DDDDDDDD*JN)e���pss39vww�YL���o�k�.�%tH���,\��u�֑��Ð!Cpuu�U�V�MDDDDD�X
ā��ݝ'�x��!��������<4��R�䗜b8�_�ڵ�X��Mj���%��7o��;���퍳�3^^^L�2����S�BG("""""R<�f��СCxyy����#�<b�DDDDDDDD
el�ܝ����r�J�-[���k׮`����FĒ��0.\��СC�eÆ
�…����02��aooϚ5k���gȐ!dgg�:$���VNy@�?�E����iذ!�?�<}��1�1$�,[��7�|WWW�,Y@zz:!!!l۶����ڵk���O3z�hM����oY�~=ǎ###�ڵkӵkW�X��I�L�O�駰����^%9_�.]�O>a׮]ܼy��ݻX���wZZk׮�M�6899�שSǘ5b��T�R�9�ԪU���(:v��ĉ�;w��Cy�)9�0$r���O���РA6l�@rr2~~~���a���eF��ŋ�e'O�d�ԩdggӷo_���ΝKZZ�1)!33����s��c�s��Jrr2.�L�;��,^������RSSY�v-׮]c���˚~
��x�(��|�������ٳg���l�7��~��oHOO���Ӭ}OOOغu+�vzDDDDDD�;�Z���>��LJ6m�0l�0[�$"""""""�@Ӷ>�Hrr2����
V�X�ŋi޼9QQQ�޽��{���P�v5jD\\�11b���9rwww"""ؿ?����jՊ������׮Y��ɓ'�޽{Y�t)�����k�
���SX�������J)�'���/�U�Vq��Y�ׯϊ+���gٲe�8q�X��78�5kfV�Pf�#"""""� 6l&L`���:t��ለ������<Д�R��Q���,�ٳ��'���BŊ	

"11�/��¬��Ç�l��m�6fΜ���+���4jԈiӦc��{�n8@���ټy3���g���\�~���X�OaYOޱŽ������@���ppp�u�ּ�����?�q?~�
��mذ�I����ڵk����.]�u8"""""""",m�S
�]�#88���`��3�1cpge����4iR��
��O��_�~�<y���ŋL�0��G������)�_k�),k��;v�ܫ��~܋�:s�-Z�0��㏛]W�y�;�˗/P�J���2C����=�֭��ÃaÆ�y�f���m���������G�) ;;;���]9�nI%�W���ѣԯ_�'�|�ƍ������گ5����w��7�eh3o�e˚�_�(�w܆��2e�S2�Y�w%"""""R<��#DEEѥK�~�m��ADDDDDDDD�d(9�HLL���;www�/_N||<���
�[�fٲe&�������o�q��I�7onu�����lڴ	gg���۷���PjԨ��S��糲�,&TX�Oa'����U�~}N�:�����4�7l�T��S�V-RSS�z�*�j�29w��Uc��O<��E�5jmڴaРA�IDDDDDDD�b�L�ܗI	����s�ر#s��!55����������瞻k_ݺu ((�cǎ���ͥK��?>�?���x2339v�S�L1�_�v
���-h��Oa�-��t/�멧�`�̙<x���,>��_"��e���_5;g(+�6Q""""""��ȑ#y�W������u8""""""""��RJX��2j�(�m�FRR�>��ɹ1c�ܵ/???���;���>|�ɹ���3a��q׮]���a�ԩL�:լ�cǎ���I�5�|�2^^^8;;�i�&��)���S���|
>�o����Ǐ3v�X�޽{�%���<v�ؑ]�v���L�֭M���:w�|�vDDDDDDJ����?:t///8@���m���������A+��y�Q>lr�[�Z��W�^T�R�5k��ٳ�ӧ�]��\�2��������쌽�=U�V�k׮,_��d��'ҫW/*T����#nnn̚5˘P�n�:�|�M�ի���=���V�SX���$݋�rttdٲex{{S�F
�ٳ'AAA��??�{��bŊ��ƚ�����r����ٳ�S$"""""R*8::�~�z2226l��ٶIDDDDDDD�`����c� f���b�
y�E�*K�,!$$��7R�^=Ξ=ˀ7n�G��q�R����n�XDDDD�~���@�.]x뭷�>}���)��r��w�W�S��I�@xx8���f�������<�ڶmKXXO?���Cy (9ED�P�ӦM#::�s��q��9����6m�˗�ux""""""�aÆѡC[�!"""""""�@(k�D���O��9sx饗hݺ�����L�)"b���[�!""""""""""""""m�#""""""""""""""""��VN�����/�C�T�
�""""""r�Sr���������w�u"�����:�BQr�}j����AD��֯_ϠA�l������b�
�S��������< ��r�қ/"""""""""""""""� Pr�}���G������������KDD����/����#)u��r�ٳg����)�N�:�ꫯ�:y@888n�0DlJ+튈����Hi����ӧY�~����Rm���888�:y�4H��""""""""���S�S����AD��|}}m���������������'��:yp)9EDDDDDDD��|�2�ʕ��Ύr��q��忴;;;�����Ч�O�r�pvv�O�>���s���"��>"""""""�_�֧��p�}��z��l߾�3g�0`��������ux&<<<HLL4;�s�N���9|�0ׯ_�iӦt�ޝ���S�J��:�u��q�4ibRf���X���Aff&O=�׮]�jժlٲGG�易����+	����۷����3x��{ާ�����<X"""����<_�Y���^z��Q�>�������y�f6o�LTT�ׯ�L�w%""""""R�	��INN���������f1Y#==�W_}��'��˗���$))�y��ѿ���;[�Ydo�������D}��w\�v
�k׮��c�~���2q�D�|�M,X��C�l�������2˗/��79����䐓�cӾsnݺŹs�X�x1�*U"**��K��,��ss��"""""""��R'����.((��{����Ļ��֭[ٿ?�����q��u&M�ď?�h�P�d׮]�OLL�s����/x��g����e8�|ݼy�w�yooo����[�.^^^L�2��7o�ӾEDDDD�����O�ڵY�h5k�$11�Ç�:�R�lٲԩS���dzp�B�-[f�DDDDDDD����R
xxx?+W�����ڵkX�`A�����={�K͚5Y�|9}���f͚���S�n]^~�eƏOvv6�-�u����r�jԨ��I��^�:			�?�֡�Saaa\�p��C�ˆ
ƅ�ad"""""bɯ���رcqqq�\�r8;;���ˑ#G,ַ����'���D
�#�<���#�7f���\�~=߸V�X�y��T����P^Pl���+O<��*U�o߾Ŏ`۶m�o�GGGjԨA���9x�`�q���O���Q�N���,���ʢN�:��ޗ��0k'##��>��.]�P�V-ʖ-K�ڵy�g�V<x0vvv�n��f����hҤ	���V�hM,���"""""""���S@�D��ҽ{wƏo<���΂�ׯ:t�o߾,Z�ȸ�un�~�-�Ǐ�k׮�oߞg�}�9s�(s��%�O��?��O<==�2e��n6m���#prr���!Cx��>|��x����]�ah��ɓЩS'���2k�,�J�b)���MKK��?�g�1ޓ�s�ih#++���`�t�B���Y�d	W�^%00�N�:ѭ[7�}�]nܸaKtt4�o��駟�B�
<��Sܾ}���)�}��y�}�]z��A���:t(111ǟ���ԩS�ҥ�z�b�ܹ���f��>}�6m����e�����ӦM~��7c����iii�]��6mژ��֩Sǘ���f�O�����ҢE>��S~��7233IMM%""�'�x"�g��T�P��xŊ�oߞ�?���/r��-N�:��ٳ�ҥ�����lV�^
�wK��^�����c������S�R�b��n�:�z�)���ϭ[���?����cǎ8p �8\]]y��'9�<_���:111�?�'�|WWW����[�nP�|ycYZZ;v�_���q���l.]�DLLݻw端�2�_�hNNN,^��,Y��ٳ���K�-[�իWS�bE��6���"""""""���SJ�6&4hЀ��D�>ծ���:�;w.iii�`���d���X�����~͡������ܾ}�x��ŋ�4i���\�~���,RSSY�v-|�^ZZ���DGGs��U233ٲeAAAf�0l�ӱc�|�Z�R%^x���M�q��|�7���222�z�*6l`�ܹE�՚q\�~�^x�5k�p��y�=���`����������$==�k׮��g��i�&^y��n�JFFiii|���̙3��ڜ��e�7�����I4�o��q_�|��#G��_������ɓ'�:u�1a)�ɓ'Czz:�/_&""�����sqq1&�$%%��KJJ��ٳ�mۖ���[u����������4���ӓ��t�n�jq�"""""�׺|�2��ޤ��1a�N�8�͛7���g���dff���ùs�L����1�̜9�x���>3~���Q�� IDAT�7n��ٌ?������Lv��ͣ�>�?���ٳ�b۲e���4k���B�v�puu�ܹs|��7��ĉ���\�z�?��X��3��_~�_~����L���ã�>JFF�����e�ر���X<oXar���@��Ka����/�|�<x777���Czz:�۷�:�����o�_�vm/^LNN���Ƥ���F�ŕ+W�2e
mڴ�:>kc��ҽ)픜R�$''���n�8�F����Ӂ;of9rwww"""ؿ?����jՊ����0֬Y�I���c�޽,]����U�8{�,���gŊ��dzl�2N�8aϥK��W�^���n�;�rk�àA�DEE���?;w�0I��,�[4�f+W��ԩSԫW���P���			�nݺ�<yҘ��[rr2k֬a�޽ƕL>�����ٰaqqq�w��mr�HII��Օ����D(WWWRRR,��R�+V���ŋ4oޜ��(v���s�=@hh��W�\!22���X�׆9�k�fo��3,�lͽ����Y�ff��uDDDDDĶ�.]ʅd�ܹ<�裔/_�����駟��k�q��U>���ٷoS�N`�ĉ����-Y��?���!C��x�b6l����;w6>;�Z�ʬM�3ڈ#L�
ǖ��r�2e
���T�Z�]�X����?>
4�����;W�ܿ��8��5k�y�fRSSM�]�p�����5j��J��v��M����:u*��׿x��׍�
	++W��cǎT�P�r��Ѯ];��y_l�����LJ�����z�O>��m۶Ѷm[�/�FQb��ҽ)픜R��Q���,�5|�p��۶m`�̙���booO�F��6m�ɒ��w��4oޜ͛73�|��W���1,}����nݚ��~�,{{{�+�����ίܚ�0x뭷�{e���p�ڵ{0
�x
	AAA�h�Z�lI`` ;v�0kc������������I`` 
4�\�r�F�^�jr�!a#������/�,T�{������BŊ	

"11�/�����~�F�Q�Bƌ�7�)��]�R�fM�m�f\�9++�m۶���D�.]����ǁ;�Hy5l�Ф������ؖ!Q��_�xް�GA�^�z�aÆ���E�޽�5k���۷`v���999����&�W�\aӦM����
F�������\�r%߸�|�I����b��/��u����/�@�r�x������bŊ&�V�^ͭ[�>|�q����;;;�OŊy�ǘ1c�n��7�0y^��_��ɡu��f��0n˛ۂpvvf���,X��I�&Q�bEV�ZEٲe���5K�^DDDDDD��+�S����Lpp��xƌ̘10]�����O���5K^'O�4~�x�"&L��ѣf�ro�r��Z�haR���7���ɉ3g�p��95jd1���nܸA�ʕ-�/���ίܚ�0hܸ��{ժU�m�[mĒ��={��-[���:%%Ŭ�&M����#;�8��w�k2$�|���޹s'ׯ_7�Wy�6ĕ;��<����ժU��e�ҿ��ˆ���{���ݻ��W�2v�XcB�5�����T�RŬ���PGDDDDDl�ȑ#8;;X���cǎ�_~��Ge͚5����B�g���Y��?���nݺ���br�A�<��|��w�]��b�@����ʊ�A��@�sbvv�]�3f���#44�I�&��n�%s_�*_�<��?�C۶m5j=z�ȷ�S�8|�0			�߿�C�Xܞ�f͚,]��~���ꫯ�p�B\]][A���ҽ)픜�˻zHA?|��(���=z������OҸqc���<x��6�m��-Zp����ݛor��Ç5jnnn�����(������������Ҫ)�ʭ��wC,�J~�ȫ��r��Y,/S��E��l�R�ÝX�l�b\�� o���Sa�m��sϱb�
���+�w�NLLeʔa���:��kC����Pv�h����NaW�̯�g�}Fdd$U�T��/��F�fu�ּDaزg�Ν>?,_�<���/'k���j޼9;v$..���X:w�Lbb"��ɴm��䥕�ޗ�=��gݺur��)���۷/ݻwgǎ4mڔ�^z�H��D,`�ދ�������vJN)9x� cǎ��ݝ�˗�+��B�֭Y�lY��qvv��_eӦMw}{i߾}������JVVe˖�~���:u�����i<o�r(���~�������ӧ5k�49��m�,YBNN�<�11����lEK��X˚��ԭ[�_~��C�Ѯ];c�᭫��aK��?����ݻ�W_}���h�䔼������o�q��I�7o^b1ԭ[����Grr2�w���'�����Xǚ{]�V-RSS�z�*�j�29g�(o�������F�J��v���q���:z�(���vvv�^�:��J�*�������Ǒ#G8p�@�bHHH��ѣ4k֬P������3���8BCC�ܹ��USq��UDD�q��M�2h� 6lH�ڵi֬Y�+�8p�ݻwp��1bbb�ӧ�MbyP�|��7������[�nq��1����t������Ã��Ǜ]Off&ǎcʔ)�r��MO=�3g���deeq��a��}��:t�@�֭�������c�֭���q��->�믿ξ}��ر�Iƒ!9f�ƍܼy�S�N�z�%9wcx#ΰ�LI�ڵ+pg�������"))ɸz�ΝK��'Np��Q�����ϫC�4hЀ#G��u�;0g�RSS��� 88�{��y�dgg���Gff�YŒ5�ڰ�Я��j֏���[�����Ƚe�t�޽V]����СCIOO���wP��v8�^°dŊ�1����|?Ç7�_��R�L���ٸq#DFFR�re�
fR����8�C,Y���G�2}�t����ׯ��J3yW�y�&#F� ++��c�w�p�\���"""""""� SrJ)Q�)~~~4lؐ��$�N�v��ݻ7�V��|��L�0�Xא1u�T<==>|8?���c�>|8M�4!55��c�Ҿ}{F�IӦM-��иqcRRR�[�nt�Ё�#G�w�^�u���ٳM�=6�2o�<:w�l�1������2$�xyyѷo�bǘ�ȑ#qqq��ٳ���Ӿ}{���III�������/�`�С�.?mgg�СC������Q�FQ�V-���x��g�ԩ������JB�Ν�+�ԯ_��mۚ���^�i,��k(+�D )��>YYYf�###���3[��7�$))	///�1,1$������KNN��Ύ�
�����իx��l7  �U�V���]`ݢ�r/T�P___�������x�"C�5�f����8+��1���ܹs��o޼irn�ĉ?~��C��t�RƌCJJ
����_�������ȃL�)�D�d�Ç�F�ʕ	

���ggg���Z�*]�ve���&�AL�8�^�zQ�Bqssc֬YƷ�֭[�ٳzٲex{{S�F
�ٳ'AAAc�Y�&+W���^��͍�+R�R%����h�"��P�|y�k&L����7ժU���OOO�y�B��$棰�|�M�ի���=���Ŏ1�*U���qrr���'''�
���˩Z�j���u��7o�jժ<��3�}��g�R�
�7o�֭[�֫U�aaa��Ջ*U����@�f͘={v��Y�L�IʛTcͽ�ݻ7+V$66֬���X*W�LϞ=K$n)����U�F\\O=�			ddd�s�NƍLj#([�,3g�4^�'�|B�-X�re�I�/��"�ʕ#,,���@Ο?Ozz:;v�0&���u�VRRR���0K�ϫC�<��㤤��m۶B�ךX���������>P��R\...������ϓ����Çy���3g��ޥK��߷n�ʢE��[�.�-��?��ŅիW�q�ƿ,��]NNN���x��!6܆��"��[�d	!!!lܸ�z��p��Y��q�,��*������[<)�5�=���w��P,Z��_|�x�����r?����2z�h���:t`ǎ�/_�!C�IXXX��D>��3ƌÐ!CX�v-���b�]���ܭ���t]�v�HHH��#))�b��ޗ��Z�O?�Ԙ8��;��ڵk9q���9�ʕ+<��c����e�z��e��}�vz�ꅓ���V�Z��/^kc�[{y�����ⱈ������}*Q+����1r�H�ԩc��wxx8����}�EDDDD�ЧO:���?������jժѳgO�n�j����V����Ϯ]�x�駩^�:���4mڔ3f�s�Nʗ/��Att4�j�2�br7>>>T�^�/���?����b���%�[{_�k̘1�X��V�ZQ�\9�V�J�=�ꫯ�>}�q�%K�wVw9{�,&�)=z�`���?޸�ҽ�EDDDDDD�a��SlL+��ܟ���{^{�5֯_��A����iݺ��#+�r�������{R�2��"""""""�TbY[G "r?z�'0���K/)1EDDDDDDDDDDDDD���""��}&"""""""""""""RLel�����������������<���"""""""""""""""""���SDDDDDDDDDDDDDDDD�)k��2;;;[� "R,>>>�ADDDDDDDDDDDDD�JN��t�ԉ��H[�!"Rl...�ADDDDDDDDDDDDD���GDDDDDDDDDDDDDDDD���r�ٳg����CD��|||�u"""""""""""""bcJN�O����:�"S����������"""l�����������SDDDDDDD�ꫯ2`�[�!r_h׮��C�Z[ """""""""""""""".��R�\�p�>}�P�zu�o�Ι3g0`NNN��Ĕx$&&ˎ?N�&M��Ν;�������\�~��M�ҽ{w���O�*U�ݾ-Y�#�\����H�ڵi߾=~~~ԭ[�D�,KqY��o���5�������]QDFF�o�>ڷo���՞���������-}D����p|||l��������U��R�$''���fr�����o�k׮b%
���3y�d���kR���DRR���L�:��]�3Z۰f�233III!**�-[��p�BZ�hqO�|X���,\��u�֑��Ð!Cpuu�U�V�MDDDDD���LJ��p[�!bSvvv�ADDDDDD�H��R�䗜b8.iy�v��U�6���ػw/NNN���t�ؑjժq��y���X�r%�&M��>��+v���Q�9���?���Y�p!���cҤIDEEQ�B���@ɭZ�_�E�c��7o��;���퍳�3^^^L�2����[=�""""""""""""""Rtel�ܝ����r�J�-[���k׮`���ޞŖ���Cll,5k�d�����ۗ�5kbooOݺuy��?~<���,Z�����s�ʕ�iӦ|��G����￳i�&[�Uꅅ�q���j,6l.\ ,,̆���������������<|�r����www�/_n,KHH   �Y�fѳgOcy�~�HIIa�̙w�^�|�M\]]Y�d��*��_򮮑��NHH۶m���v��<��ӌ=GGG�u�ċ#F���dqC�!''��M���_~��Ƒ�ܚ�
m�]���s璔�D�r��ѣ���:*T(p�
��������޽����}��_��cǎ���A�ڵ�ڵ+T�X��>�v�����X�l;v��ҥKԮ]��ݻ3v�X*W�lu{��mIa�SZZk׮�M�6&cu��1&t�1�*U�9^��\�p�>}�P�zu�o�Ι3g0`NNN����:�?~�&M���¾�R��*��VҫpZ�^�ɾ}�h߾��s��������ܝ�SJ�+?��>>>4hЀ
6���������DDDp��9����ѣGIOO7&lݺ��۷�S._�LJJ
���t�����ܹsIKK�7qĒ��LƏϑ#G�e�Ν#44���d.\H�2w����رc��U�T�^x��[��8�[���q�z�*lذ�۷oT��[�j��'�e�/&$$Ĥ^jj*k׮�ڵkL�>=��s�%ׯ_�^�ԩS&�EDD���@hhh�^
Ú���7ߐ������Y;���$$$�u�VxOb��^~[ົ��,��x�7صk��:�p~��.\Ⱥu����aȐ!�����EDDDDDD�O)��ǵ�����<��cdggs��!���رceʔ!..����k۶mk�PШQ#���,&.�,11�x�z�j�9���;�߿���HZ�jEBB�����.]�@�z�J`F��8�[�A�
���"..v��	�?G�Q�fM���cٚ5k�<y2qqq�ݻ��K�[`����+W��ԩSԫW���P���			�nݺ�<y�d���roK��c
k�S\\͚53k�Pf�#"""""���S��]�v�z�3`�����z7o��w���ggg�֭���S�L��͛�ODDDDDD��PrJ)R��+�~|ڿ?׮]���ddd�g��k�u�f�����M�H)�m۶0s�L\]]����Q�FL�6
�d	e{{{n߾mU��oy˭��୷���Ņr�������k׊svv6e�wA�ݻws��7o��͛�?>�g��dR��\k�!'((�-Z���@˖-�[B�ر��6˚�t��q�NQ^
64�#"""""�W��+Ww�r5l�	�`����Er�…:�X6l�0.\�@XX�
#)]��O)������`�����3f�`ƌ����裏��)[�n�\�r��W_�}�vz��Arr2eʔ�K�.&m����O��_�~ϟ<y���ɉ3g�p��95jd�~NN7nܠr��V�b��8�[�A�ƍ�߫V�
�L��ŋ�Q��Iل	8z�Y������W�k-9{�,-[�4)���HII�x]I��g�}�|�2U�T1�g(3������Y�hqqq\�~��
���ӧOc�3��e�x��7quueɒ%���¶m���ߩ]�6O?�4�G�6{A��o�e���;v���j׮M׮]	�bŊ&����'k�)���s��EIΗ��K���Oصk7oޤ{��Ɨ&��~�NKKc�ڵ�i��d��:u���F�a�SDDDDDDDL)9����D˖-IJ���TUe���' (���������ΐ���V���af��L��c�f5�踜t3��L1�A��w&��JBT���$�Ԗ�� ��g�s@@� �k��{���}Ck��\��8{�,;v���]�v�s�=deeQZZʁ�۷�U"Ш�\�Jt�^��O�>?~�]�v՚���~�}�Y���HLL4��X�rrr�����9k����
������l��F���/�ѣ�Ѷx�b<H�N���oK���	

"22��]Ϲ
��Up�a�'����ٶ0���F��DDDDD�1,���������K�.lذ���BƍG`` )))F��g�c�W��͛Ǖ+W:t��K�.����HJ(//'66�}N�8��l����+V�o�����V�<y���TΟ?ow+]���S_
���7FS�WII	�Ǐ7^���O�x��u�_�u�駔��b3~HH���lݺ��Ç7tyDDDDDDD~q��r�����/�d�ĉ��ݛիW�{�n���?LBB�U���p���y�w�x�"�����������o�ͅl��i,???�=ʦM������ٲe���2����[���dժUTUU���HLqrr���b��IS�ޔ._�l<4
3�srr0��F"ё#G��V�Uw=������w�}G~~>���ў��Ф�אߓ��'O��ܹs���X;w��GDDDDDZ˶��{�����w�������Ջ?���t�Ё���o|���f��nݺa6���֮]ˁ�ݻ7�gϦ{��=z����K(�� IDATzz:O>�$��f�b�С899�o�>&M�Dff&p�^�fŔ��S_����k�h�I7z��}�]����ԩ��	d߾}̛7������ٳ������l%���������C�^�����6�Gyggg6l�`$������C��I�e�8a�f0�\���(**�ʕ+�9s�e˖a2����5�>���O?1n�8�n�JII	�/_f���L�:������ψ#��,�~�!eee9r�����_SCb�/{kT����?2u�T���k8p�M�ݻwS^^NQQs��1�ϟ?�9�un}Y�^,X@AA�p�B|���
�=�u�]=z�fK���������,��AAAv�[dee���/ӹsg<<<���#//�>��f�1c�X%gl۶
�zO���ݺuc�����mv-v���_|A�^����Y�l�-�W謮!��WC�y���c�fϞMPP�����+�\��]��C��ҥ�M_˶��>"""""""R7UN�E4$9��LJ��`���뮻�r�]�t��������ѣG�*]�k׎�g�����6mbܸq�ر���ƌcտM�6L�6ͪ->>����|��7v��~��y�7��^	c�ƍ��曼��v��6TCc�{kT]mo�y{{�h�"�m����زe��ͳ�&XQQ!!!v�����9v��Ǐ�:ֹsg���!��������Aaa!���V}-��4e"�������5�/^��ŋ��o��o��p�2�?��?Yݒ|`ay`ذav�W��y��i�M���m�]k�҆�S_
���[T��RS��GS����ǁ�[Ww�=�؜טu�y�gϞ���˦����GDDDDDDD��)����(���^Sxx8`��[��4vK�3f������xzzb6����������	c���6�ڷoϚ5kx��	

��Ã�m���#��r�J��׿ҦM�s�M�ƈ#���pss#$$��s�6��kh�ao�j���F�.]x��y��ѣ���_~���p���qss#((��2q�D֭[W�=�����HJJ"22___\\\�e��Ѭ^�oo���
�=
8���333�����k�XEDDDD�y��D}Ԭr����>/^���ԩcƌ��W_%--�^�6d��jh<�[5�f�,c��ޖ��Yǚ�m��qv�}|fik�ߕ�������/�*��"j�������:�GDDa�>c�f̘a�^��O5���Íė꼽��>}:ӧO�3.�֭[3v�XƎ[�����̚5�Y�f�_}�����~�kTW����b��v�Y�Lj����6$��n���3g2s�̺¾�8��k����ڶmKTT���@qq1���L�4	�z�&"""""�S^^_~�%'N�w�ެ^��ݻw��?����`���q�|���>|�^�z5x>???�=ʦM��Y�4''��llS{���xEE�݄���S_�Oc5�zu�ԉ#G���_ZU�����k����ɓ'9w�>>>V�Ν;g��kS�iqbbb�ر#���F[rr2~~~6������ȭ�![����%K�p��I.]���ŋ1�L<��Sל�R�4..���"�\�™3gX�l&����X�sv��Myy9EEE̙3�h?�<�ߪ�-h;O}]+��)�kРA,X��/�����
����_��2M�*�G��9fikL�U�_"UN���ݝ�����/�y���Y�|�͖Q"""""r�jHrʳ�>˶m�(((����:����_s�q�Ʊc�


l��۴iôiӌ�aaalٲ�y��1o�<�����		�]�v�={������شiS�橯��s#5�z�3��>��C�YU8p�MɍX������Aaa!���V�,k5�S�T9EDZ�{wɓ'�d��,Y”)Sl&�����ȭ�f2�����W���CRR���xyy���JϞ=Y�hC���\�����f���������ooo���X�z�U��_~���p���qss#((��	�֭�n�������
����ύ�����FBB#F��]�v�����c�w]��f�xxx���is,33OOO{��.��������/�SUUU����%KII!::˯��w�[Qtt4���R��"""""uѿ'��X�j���|��P\\̓O>ɤI��0a�M���ɉ��d����~i��T9EDDDDDDDDĎ��:v�h���������vA"""""""R;%�����������������IOO�ĉ�8q���t�ϟO�6m��������-���i��^&O�̒%K�2e
����JDDDDDD�֢�f*22��!��4���繈�����QQQ����֧��ܹ3#G�tt""�e�ȑ����CDDDDDDDDDDDDD�UNifBCC	

ut""""""""""""""""7��S����������u���"99��a���������������)9��JKKst""��$;��RRR�|�����FPrJ35r�HG� "�h~���C���Wb�W�u����a�������4��SDDDDDDD�Y{�x����������4��S�0�L���5�<�⮻�j�93wZZ999��׏��ț������H�MJJ���i������rt"""""""
���e���Kddd4yLC�޻w/+V�`ݺuTUU1j�(�۷�M�SDDDDD��ruu%99��a�8�^��[��S䖑�����.++c�ܹ�1???"""�3g�ׯ���f�)"""""�b�9��#G::igG �c2���t�q���8u�O?���6z�hN�:ERR�#iT9E�̙3��� ##���2��ٳ�---%11�m۶��O?ѡC̄	pss3�UVV����֭[9q����t�ޝ'�x�'�|�*��9//������3dժUV}����?�r�J����p�]�v�g�aȐ!u�]RRBjj*��w���F��;b2�HMMe�رxyy5d�EDDDDDDn�C�q�]w5���������_�~ڶFDDDDDD��Rr��[II	�Ǐ����h��O�x�M���rbcc9p��v��	�f3����X�g竅{V�X��5k�~�/_f߾}�۷��/}�ؖ.]JII�U�H}�={���N�>m�>|�y��q���Z빟~�)�������		!77��[�2|���$""""""r#���Kdddؼ�����ˊ+X�nUUU�5���@���{�����m}���}�]����ԩ���w�&!!����ڦ�ڵk9p��{�&%%�={����F߾}���%==��q�F�����{�nv��ɬY�X�n`]�$//��V�n������_o�5���;�>}�^�z�q�Fv���SO=��l�s���lz��i3����GDDDDDD�Q222���eee̝;�#F��燿�?̙3�������������45%��"L&��ϵڛŽ;�={6AAA����+��b�w۶m,X����@\\\�֭���`˖-F_���IKK��fĈ���Y%��e̘1V[�WVV/��2�;w��Ã��8�����<�СCt����X׮]��������Hӻ��rc$%%q��)�~�i�m��ќ:u���$F&"""""""MA�H�?~�>}�X��s�=6}�;��a��u��a��ԩSy�����!''���z����E�6m��%��~���F�}��Y���l�Y�,}DDDDDD����Y�r%���\�p��]���3�0d��~%%%$$$�}�vΜ9C�0`'N�����gI�IMMe�ҥкuk}�Q�N����;���$$$�u�VN�8���+ݻw�'���'����缼<�sBB3f� 00�U�VY���^������KJJHMM��ڞ�cǎ�L&RSS;v��m�5)9�Q��BM�����-Z���3�٧�.�����ׯ;v��_��_}�+W�d�ڵL�2��Ç_3�ڪ�TUU���@yy��q˱ư���l[���v=㋈����H�w��Ybbb8}���v��a�͛Ǖ+W:t(p�>����ȑ#F��'O���Bnn.f�٨,j1i�$Ν;��K�ذa�������b�
֬Yc�|�2���c߾}\�x����kƿt�RJJJ��Dn�u��駟RZZJHH�ͱ��rssٺuk���������ȭA�H�u��	�/��Ҫ���Ц����6m"//��'77ת���7Æ
#11�5k����Y�ti�b�$�\�x�h�^���;�ص���
���Y�������H���;�p��iz���ƍٹs'O=�f���f��9B@@f��ݻw������?�f���6cw�҅�7���������ύ�7n���;�w�f�Ν̚5�u���/�X�ɫ�֭��ټ���7��k�;;;��={ڌki����A�)Ro�
`��|��TTT��~����}���������+W�p���-[��d"66���O`2�x���)--��;�$00WWW��%�IJeP]ڵk��~HYYG�!>>ަ_���X�d	'O��ҥK,^���d<T�mn�V@G����֘�DDDDDD�~L&��ϵڛBVV/��2�;w��Ã��8�����~�����8��郫�+w�}7�g�`���6cϜ9�Ν;Ӻuk�
����J+��ɤ�����?3b����HOO�W�cƌ��鍸n{:\M��ɲm�����������JN�z3fw�u'O�d�ĉ��׏��z��a�wܸqt�ڕ��ƌ�����y��wiӦ
ӦM3�����C=�<`�(6�YN"""�,��o�Ƀ>Hdd$��~�M�g�}


x���	

%--
���ι-�-�*�X�|�:��[�?�\����b�n��{��j��w�n|�������h�:u*�[�&''����o�5
��̥K���%���{��={///�c�6Ki��r��W�����������#h׮nnn<��cF"Iu�����f���������ooo���X�z��ë���͛G�=pss��͍�ݻ3n�8^{�5�ߌ3��Ņ���:c�6m#F���n��͍���Νk���LJ��$��������Օ�={�h�"�R����Ã��L�q333�������Š�����H���B�Z�M�Ri���'��d��hu���|���̛7��ロK�.�r�J�†
�5mUS�������-�:;�>���]ﺊ������H����ȭ�m۶̚5�������>ooo�O����ӯ9�a�6lX�}���	�������ߟ4x�m�Ebb"���W߆���gҤIF�ei������{>L�^�j�����w�}G~~>���ў�����_���6�8�g�}�;��ҥK>|x��srr�����/���	��Çm���������ɓ�;w�c�Ν3��������Hˡ�)"�!&&��;���l�%''���ǘ1c���������-_�,Y�ɓ'�t��/�d2��SO�,��.X����***(((`�…@㶅}�'0�L�������r�wد�r�رk�i���?����#G����7����ѣGmƵ�5f� i�T9��1�LM2���B�V������y��;v,���,_��6m�88:ij�>�,۶m����������?o|���a���;v����[��ܹ�M[}��İ`����mH������ڵ��ٳDDD���ǦM�j3,,��7��o��obӯ��mo�����Aaa�U����@�uDDDDDDD��R���t�2y�d�,Y’%K�2e���5izyyy7��
������WWWz��ɢE�2d����ˋ��$"##����___F���ի�n��̛7�=z��憛�ݻwgܸq���kF�3f������u�9m�4F��m�݆��!!!̝;���mo����Aff�͸���xzz��c�5x=DDDDDDD��r����rt�d)))DGGc�5�."r+���0����]DDDD�.��d˷j�*���	����'�|�I�&1a�G�<999���LTT���"""""""�T�*����������MCǎ��������c̘1�LDDDDDDD�B+G """""""ҔL&S��{��jI��ݙ?>/��"cǎ ==��˗ӦMG'"""""""7��SDDDDDDDD䦻��{�<y2K�,`ʔ);8*i
JNi�֯_��DDm����9��a������pҜEEE��0DDDDDDD��)9�����tt""""""""""""""""�M�)͌���D�)�LVV˗/wt""�-44�^x��a���������������)9��9v��ׯg�ȑ�ED��֯_�������d���<�䓎CDDDDDDDDA�)�TZZ��Ci���hG� """"-��˗���tt""""""""�JN�f-99���dG�!""""""""���i֖/_NVV���i^x�BCC�������H�8;:q�Ʉ�djV�:t�}���δi�'$$���dzv�ZJJJ�t�A�a2�8y�ͱcǎka2����m�c2�<xp���g�+--��ӧ3}�tmM%"""""7̞={X�~���q����s��1G�!""""""�`��"��K/�DFFyyy�����Y�f�k�.����


0��̛7����&��W�^�ܹ�бcG�c�7���(//';;����>���7�i���{��eŊ�[����*F�E`` }����qEDDDDD��������9999:�FQ�q���<�����Fqqq�ڵ___^}�U�n�ʞ={HOOgܸq\�p�?��O�۷�I�

�6�,�)���V߫��w�䔦X���2�Νˈ#�����ߟ���̙CYY�u�/""""""""""""""�.%�ܢ�%OK���Eff&�۷g���:������₿�?������ʕ+�\��Ib�$��LN)--e�޽xxx������Ann.���V�ꛜ����8u�O?���6z�hN�:ERR�M�GDDDDDDDDDDDDDD�m��B}��g�_����".]�D�c���xxx�z��ӧY�|9YYY���ѽ{w�y�fϞ
`Uq�������o�Ι3g�С`�ĉxzz�,I4			̘1���@V�Ze����Y%�To�(--%>>�;vЦM
Ĕ)Shݺ��9999,]��͛7ӪU+"##����ܹs,Z���;w����C=�̙3i۶-�6m`�ر����]�Q�FQUUE�=�֖�RSSY�t)�nݚG}��S����n$�<x�j���\._�Lhh(��׏�۷���GHH����MN��u/--%11�m۶��O?ѡC̄	pss��;HMM��Z��;b2�HMMe�رxyy�]W����=���?t�w�uW�}���Nzz:����…��у��O4�ޠA�8}�4�7o���رcV[�~��G�q�V}���y�'�կ~��\�<�Y��JKK#''�~��y�c��������j������[$&&Z��<y���TΟ?�믿n���/2a��?n��)�]�p��{�#G�X͑��Bnn.f��&	f�ҥ���Ԛ�Q�Y�f�k�.�j�DJJ
̜9Ӫ��ŋٸq���'�_�ި,r��%>��#���y��W��z���_km۶�瞳jk�ZO�4�s��qlذ���J�����������N�:���m[hh(۷o'++�HN���(--��ߟ�n��j�Ƭ{yy9���VU\N�8��l����+V��|��ҧ�~Jii�Ku!!!���u�V�^�EDDDDD䪗^z����%˔��Zݓ[KZ�� IDATPPP��lf޼y���5��z�b�Ν8p�&9Ų孛����dgg[%��߿��!nԺ�ݻ�+V�n�:���5j����������h[����&tdgg�k�.�~�m233k=/99��Ǐ����lf���$$$�MjX�f
G�!  �蛘����?�f���6�t�֍��l��1������<����IKK#33��:���?�������{�]�v@||<...lذ���l&N��Ν;��Μ9@@@@��cOC׺K�.lܸ���lƏosAAA���>5�S������z{���k׮���ݛ�����CZZ}��%77���t��z��i3����GDDDDDD�V�8##Á�@\\�v���חW_}��[��g����7n.\�O����Ǎf�>��r_m����n���^VV�ܹs1b~~~�����9s(++���EDDDDDDn%JN�E�L&����w���_|A�^����Y�l�-�V<��%I"..�>}����Jpp0s�̩W߻�ۨ��}�v�sƌc�LC���+t��
www��y�	%�͚5�;�777��������ٳ�ҥ�[�f�رF��8
�е�9s&�;w�u���ó����-���g����9u������W���LJ=z��?���Z�����1�m�6,X@`` ...t�֍����e���C����75u��ժ������HS�y�,�'++���Lڷo��ի:t(�۷�����?˕+WX�re��`�ϭ��RZZ�޽{�����g���Ã��\��˭��79�)$%%q��)�%�ѣGs��)���nz<"""""""��m}Z�ӧO3m�4<hs������=
�=��c�lӷ�����۪�r�?�`s�%Q�1~���-���K$��t�m��w�n|vww�9��ח�Ǐs��	�u�f7���*.^�������е������u�|#���Whh��8���<x���,~��_e�-�Wטu?v�Æ
�{������g���c��f�#"""""�H�}��ׯ����K�.ѡC��˜<y��ִ՝>}��˗���EYYݻw�g�1^Ш^q�������o�Ι3g�С`�ĉV���$���f̘A`` �V�2����l^N�9Wii)����ر�6m�0h� �L�B�֭�����a�ҥl޼�V�ZIll,�ΝcѢE�ܹWWWz�!fΜI۶mشicǎ�u��Q�FQUUE�=�֖�RSSY�t)�nݚG}��S����n$�Լ�������˄�����A�~�ؾ};yyyƶ�����MN��u/--%11�m۶��O?ѡC̄	�^)))!55����j�:v��d"55��c�ڽ�i���r���͍��R�/��t�ԉ���t�ޝ�� "##�5Wͤ
''�z�YW��VMiȹ�p59;�]$�O�>?~�]�v՚���~�}�Y���HLL��ť�k���j|���=z��ٙ��"*++��p�%���/YYY�=����'''�[�4f��Jb�0�밷Ɩ���
������4���z���D���'O�������n�
p��E&L����Ǎ���"#1��.��s�q���9RRR����l6�$�,]�����Z�?�2k�,v��\M�HII�����3gZ�[�x17n4���$  ����/G\�t��>�ggg^}�Uc��6���mۖ�{Ϊ��k=i�$���K�ذa������q�m�@qq1��=�:ul��


e���dee�)�}�������/�X4f���ˉ�����r��	�f3����X�¸���O)--5b�.$$���\�n������=�������ȭL��@999��f�N��СC��WTT�=��端��j��������|�v�w??�FD�8� 99�n����JV�ZEUU����m��ֵ���k׮������Ͼ}��w��V�z��E������'??���r�t�R�~
a��mڴ��w��Onn�������&���f�#"""""�(�p5�#;;�]�v��o���Y�y���?~�f3�w�&!!�nRÚ5k8r�F���D���9|�0�W��9�[�ndgg�M���B��~�������4233��c,��VWXX�{�Ǯ]���� >>6l�@vv6'N�n_ka�N7  �����kݥK6n�Hvv6�Ǐ����UF�69���899H�����Oc�}�ڵ8p�޽{���ž={HKK�o߾��撞�n���H,m�>"""""""�JNi�v��Myy9EEE̙3�h?����=�.������
����…m�����`�


���������68^Ku
˖27�<@pp0?���ƍc�֭���p��e����ԩS��ɡ���1���u],����$$$Ħ*���!!!\�r��lu^C�[��~���8����r�
gΜaٲe�L&�a&�w+%˶P�Yڪo�$"""""r��L&����w���_|A�^����Y�l�-��C�dI�����O�>���lu�WW߻�ۨ��}�v�sƌ��J����
ݺu��ݝ��oBIu�f���;���͍��(��0{�l�t�B�֭;v,`���Ō�����е�9s&�;w�u��DGG�ӖdK�ɿ��oN�:E`` ��կ��/E��у~��o��֪����Ƭ��mۀ��Bqqq�[�n̟?�-[�}:\M��ɲ�����������/���i����زe���c޼y6Nj��얕����O>��cܸqu����9v��V�E�Νm��]�v�={���������o���x~�����7��-�����oXmQ�ص�K�^�ؼy3{��j/���͛�*&�MN����ƍcǎ0f���mڴaڴi�������Aaa!���V}��%+�������H�O�fڴi<x��X][�Z��������?����}��V�s���s,�
����lٶ�^"I��W��޽�������<___�?Ή'j������/���i�5t������ms5+�X������dee��_�����[�_]c���Rǰa��?|����R����˦���^�V��J�SnQ��Z���˄�����AAA,\��(ѻn�:�繻������aø���iժ���F���oyyy���Ddd$�����������ѣY�z��0�!f̘A@@...���7���վ}{֬YË/�HPP�mۖGy��+W�׿��6m�X��ص�K��f��ε&���׏V���_���{�����l&**
???\\\�&,,�իW[=�8p vK3gff���iT���jnAZW��ŋ9x� �:ub̘1��ꫤ���{��I�_\���*�4�jJC�mݺ���U:k�ӧ�v����y��7nW�\�֮���g{�ڣG���)**������^r
\M^����믿������:�Y������*��:쭱��!C"""""""�:UNi����X�`��c��	�nrK���m*��8q�:X��v�m̜9��3g�OmI45����	oԹ��w�vK)cK9�k�����=((���yzz���S���Yw������ә>}z�q�mۖ��()..6�"/..&??�I�&Y��'"""""���'��L�v�8r�q������N�:��7���W_�?��?F�W_}e���ߟ����|�~�=????�s17��ٲe���2����[���dժUTUU������k]�v�ʑ#G���g߾}x{{ӻwo�~�z��}����瓟�Oyy9]�v�a��~~~=z�M�6]�w����ɓ'9w�>>>V�,['�li�T9E=�&��������SYYɷ�~�k��ؖ0�����cǎ$''m������l$"""""�H�w寮����"�̙c��?�nK%ȅRXXHEE���c�…6}���X�`TTTPPP`�m̖����-en�x���`~��'ƍ�֭[)))�����߿��S����C���1b��
]�X��&&&RYYIHH�MU'''BBB�r�
f��꼆���?�0qqqq��Μ9òe�0�L���}-G-�BUgi�^�TDDDDDD��S�12������x��㭎�k�Ϊ�Hu���̟?�_|Ѩ:�������m�Bq���0�l�¼y�l*���V5::�O>����q���9GLL۷o�رc�?��X�Νm��]�v�={������شiS�Ǹ�����o�a���6�~�a�x�
�-j��u�ի�7ofϞ=����n���P6o�Lnn�q^c�[�q�Ʊc�


l^�hӦ
ӦM3���ߟ��
	��[XX4.YIDDDDDD�V��)b�9s&ӧO�gϞ�i�ggg������ 99�خEĞ{wɓ'�d��,Y”)Sl�������4����Z�8}��	���777���X�p��"ƺu�����NBBÆ
��o�U�V�����f���"))���H|}}qqq��חѣG�z�j���|M3f�   ���|��j߾=k֬��_$((ڶm�#�<�ʕ+��_�j�RBc׺.AAA�ggg�Z�[���g�ePc�S쭻��'f����(���pqq��ۛ��0V�^mU	e�xxx���i3vff&���FU�_����*G�K���Btt4�_C��""����hc����EDDDD�r+�{�ĉ:����4C�V�"11�?��x᧸��'�|�I�&1a„����Drr2QQQv��������4Sy��""""""""R��z������穬���o���^�{�qp��\���бcG�����d���l�i锜""""""""R�!C�π����F�I^^�ڵ3�����ݝ��瓞�Ή'8q����̟?�f+$���յ����������2͜9�Ν;������R^^�w�<��	�ut�Ҍ�{�L�<�%K�0e������������ͧ�f�����!��\�y.""""-���3QQQ���4��~DDDDDDD���섆������0DD�[�Ν��������������4Ύ@DDDDDDDDDDDDDDDDZ.UNif������vt""�-**���dG�!"""""""""""""��f�����!��4���DDDD�FKII!%%��a��������H#(9EDDDDDDD��^x�'�|��a�4����Ci0gG """"""""""""""""-�*��-�d2���gs,--������Gdd�M�MDDDDDD����˵���/99���(G�!""""""� JN�k�޽�X��u��QUUŨQ��o߾�MDDDDDD(**���dG�!�PNNN�ADDDDDD�Q����Heee̝;�#F��燿�?̙3���2G�'""""""""""""""��[��d2��[III�:u���~�h=z4�N�"))Ɂ������������������h[���>c���q��%:t�@XX�'O����Hn���&>>�m۶���Fhh(/��:t0�kH_���Rٶm?��:t`��L�0777�qSSSY�t)�nݚG}��S����n�=s����?��Ƞ���0{�l�k/))!55���___��cǎ�L&RSS;v,^^^׻�""""""":t�������r
�����O>��/������5i���7��rD�iii���Я_?"##o��"""""""r�(9�z뭷HLL�j;y�$����?��_��آE�شi�.]b˖-���v�Z���ܷ�����X8`�w��	�f3����X�gg�=�&M�ܹsƸ6l������8�j����)..6��O�x���駔��bs,$$���\�n������XE�k{饗��Ȩ5acǎ�?���ϳc����of��r�����ˊ+X�nUUU�5���@���반DDDDDDD�q��O��{�0k�,���ٵko��6���6����X�|9�w��l6����?��ڵk�w�ڵ8p�޽{���ž={HKK�o߾��撞�n3n�.]ظq#��ٌ?��?��8���R\\L�N�x�wؽ{7			|���6ceggгgO�c�6K�둑�Q����_<���v���<�D�k]WS+++c�ܹ�1???������`Μ9���946i8%��"L&��O]�;w��/��W�^|���,[��E�p����g͚EHH������ǨVR=9�!}�m�����Ņnݺ1�|�l�b3�̙3�ܹ3�[�&::�x���i0{�l���puu%88�W^y�f�C�W^j�ڵ�Ui9j�3;�ɓ'��/h׮�ӟ���������tth�^RR�N��駟6�F�ͩS�HJJr`d"""""""��֧:}�4ӦM��6Ǫ��l���g��R�����{��1�
f7�Ç۴u���l�����h��ߧO������Ξ=�����1K����������r�>}��˗���EYYݻw�g�a���V�CJKKILLd۶m���Ot�Ё��3a����l^�9Fzz:���<www
Djj*���<���74ޒ�ؾ};gΜ�C�0��'���igBB3f� 00�U�VY���*--%>>�;vЦM
Ĕ)Shݺ��9999,]��͛7ӪU+"##����ܹs,Z���;w����C=�̙3i۶�q-����w�}����v����Djj*cǎ�{�/"""""""͓�Sn5�x��p�b���<x�N�:�����ݻDdd�ݱ[���3�$�8;�֩O_{	0�٫����j|vrr�9n���5�~���-m������ŋL�0��劢�"#ѣ���rbcc9p��v��	�f3����X���=guUUUl޼��C�W_�HMMeӦML�0��{ӆ�{���{�9�9b��<y���rss1��xxxX��t�RJJJ��?�k֬Y�ڵ������BEE3gδ�x�b6n�h|��?�I@@�ׯ7�ҥK|��G8;;�ꫯ�駟RZZJHH���!!!���u�V����EDDDDDD�1��O�����lf�ԩ�C0���
��V������k��������M�6{VW����m�5u��	�/��Ҫ���Ц����Ν�9fi���_���d�?�����޽GU]�{��@�.r��0��B�Q-��R�np`�QFϲ�☨C�Z�<is\�%G�<�s�tR	�B,5"�#c�1G��E4B9��>n��
�~��Z{?��=�_�18��_���ڿ�֭[g�9cÆ
:z�~�a��������ԠA�������lIֿ0b���쫯��ٳg�x@���� �={��/��������ɓ
��&%%���_%%%JMM���w�����Ӓ%Kl֚z.I��?����L���Z�ݱw4pQQ�>��c�۷Oqqq��e˖���Y�~�����4c�I׎(6��˓$����fOs̜��S:�������N���Z�p�%^UUe����o���H���:|��%Icǎ���VrG�)I���Wqq��\����r�\�RF���R���SOI�u��!�����o���o�m�۷o_IҩS�l��1s��2�V����'���5`����(88���e��;wJ��3hPP����ջwo%$$H��n�z���
,�a�瞓$}��gM^ߜz��8�2ee׮]6�DGG[�'j�7�|S�{������x���r����������L&�$��ԂԳgOu��ES�N�d�&Ǐ�$����f�^�zY����c}:���0mݺU�/��ŋm֋���F��w�}�����y衇4i�$�ko%766V{��Qaa�����r���4w��f?Stt����?~��[Uҵ���M(ÇWNN����l�f��2bĈf�h��?;<�*��FI:}���k���SRR�佪��-
!���{�=��ݻw���F��������T�4p�@���ڳg��\cn�h�_���]�v���^�_��X�>}�X>����\WQQ��b� IDAT!I���Y3��9�}`rJ;eo���o��1c����]����߿��.]ji�ظq�U��+�Ν;���O���o�v�Z��Au+����JNN��d��`�����������M-quuպu�!���j��ъ����;v�<<<���k����+OOO�=��5ږ����,.I


V�;u�d�o��jjj�\߾}��������}��&s��b����0b�ҩ)͹�K�.v�NNM�s����c�y���yyyY��i�#f]�v��K{�j����^}�U���M�ݨ��^��{����5��&s���L&%%%���T���&ّ#G4s�L���t|=z����w}�����m����6��A�N�Җ-[d0�}/�>�V���\j�o�>͙3G��ي��hu��������u��
2�?r��y�___�;wN����Z3��8�6&��C���Q��ݕ��f�����`0�5��4�.]���"����o��ҥKmrG�)I���Wqq��\����r�\�RF�Qqqq�\��Q@'N�бc��_�BÆ
�[˰a�ԳgO=zT'N�hu�aaa����D���^����ܖm��~N扫���>֒���q������]			z��5u�TI�~smժUrssspu��[TT��o߮�^���M����jϞ=*,,��777͝;�����G�0a���qI��ɓox�L�N�4y�d���;����k��֪zcbb�k�.�>}ZӦM�Z��݊�ϵe˖f��RÇWNN����l�VTT$�e
7�q����GѬY��|�r-_�\�g϶�G-@�QPPp��c��ݵn�:�����{�U�Ν�%K�H�\]]-����JNN��d��`����������T��������쬋/j۶m�ֳ�>�d��ƍ�����mۦ�~��U�zyy)%%E�����󓳳����4e��������_��窫�k���1v�Xyxx(77�f-77W�����2�}`r�]�F�`��ܶ�d2�d29�@p�}�i���V���2IR�nݬ����z��W�ꫯ6��1c4f̘f����ݻw[����9�v��U���Ӽy��~�o��\�z���(~�=��d2)))I���
�$����ȑ#�9s�<<<���&&������h�'�|���*]�zU�}���z�-I��\���V����ݻ+--�KKK��`�9j	�}LN�3�<�O>�D˖-Ӳeˬ�|||4c�Uf_{��vswwWBB�^~�eM�:U�����U�V�������9tx���S``��mۦ�Nuuu����5l�0M�>]~~~�.�J{��Nx�G4k�,-_�\�4{�l;�*�4��Q����.Z,++K&���eNNN2�L�����z���������@M�8��e@�L�8QC�qt�&��1���


ut��)mLzz����]���dRZZ����`4��Q����.Z�&;�n���駟]Z��6j�ĉ�.Zl��͎.Ȑ!ChLt�ߋ]�Fs
h��̙�9s�8���)h��F�$�����͘�k������ַ�~���=��5j��{�9yyy�h϶����۷�ݵ��L8p@�4t�PEFF����)�S�[T[[����k߾}V���B*99Y�/VXX�c
l��^{M999v�v>�իWk�ƍjhhФI��A�9�Rw���t��� hNA�Ӹ���d�����׾}�������>|��v�~�A�6m���?�A��_��U�r�����K�.iѢE�����`�$M�0A.TVV�����2��Bc
p&N����@G��Mќ�Nݮ�ܚ�{�*77W��w�RSS���gY�׿�����Ck֬њ5k��:���+%%E�ϟ��ɓ-�)S���?VJJ�f͚��tDs��ќ9s]n�S:�/��BYYY*..��˗խ[7���i֬Y����
.yyyZ�l�v��)WWW���jΜ9�֭�e���J׎�IJJ�Ν;���Cݺu��O?��ӧ����fߌ��X�B����ҥ��|�I���+VS9����������ѥK�4j�(-X��U喙�Z�֭Ӯ]�T^^�nݺiԨQ�1c�<==-y[�l�$M�:ժ1�z�&MRCC�|�A���4�u����_WPP�֮]{øt{߱9�qm������У�>j��ݻw��hTFF��N�*//�[{����)Ї~���$�عs甑����*-Y��j�wޱ4_\�|Y[�nՑ#G�a�y{{7;���Nqqq:z�庲�2%''���H�W�����վ3g�Tee�e�O?�TW�^U||��kM$ӦMSii���۷��ŋ-~O555z饗t��I��������|%''[y���I����o��=�ܣ�^z��HҊ+T]]m��8~'ޱ=���jkkb����|�رC/��b��б9�<���,I�?����o�>��O�$������ݻW�V�������,�={V6lhQ�
t��Q=���JOO������A�)??_���6����S�6mR^^��M�&Iڽ{�e�/��JKKգG}��Gڿ�֭[�'N��=�_�^'O�T@@������~%%%���_%%%JMM�䖗�K�Z|�[ѻwo����45���w|�d������<IR�~�l�3��9�CsJ;a4��4���/��W_顇Ҷm۴r�J���;��Mil���
		����`��q}sHsrw��)IJLLTPP����ջwo%$$H��n�j��y��.]�(**J�TUUeY߳g�$i���߿�\\\�7�|��^�����5`����h����v��e�uvv�$]�z������VG��(~'ޱ=Ǐ�t����^�zY�`�t@.\�ܹsu��1������СC��4H�t�̙�>}Z�n�����X�>},���]�b���V�
<��=n���������ٳ�����Μ9���2�����~


�x�<==[\����f�;����$yyy٬�c��9�����I�))������رc�ѣ��q���G���Wdd�ݽ;w��k`nXpr��s+��`�goz�����s�N�l��{6޻q=������̙3ڷo�
�S���[����U������d��"]��\uuu7����)��w��cγ�w��սw'�S:�H�������#I:y�e���ު�����ꨠÇK�~�_��}+��A�N�Җ-[d0n�#�G�:y�:���K�����{�����ב#G4d�K�ȑ#�dU��O?��[�*--M�<���>���^���kת��A�>���1�S�N6U�M5i�;���չs�TYY)___����JK7b;���UWW���b-\�������{��UTT���z>|X������c���y+�#G��$��ǫ��XW�\Qyy�V�\)�Ѩ���f?�SO=%IJLLԡC�T__�o��Vo��v��2��YXX���zj�ҥ��#FXr�
���`���Pll�v�ء��j���O���o��+��>|�""",י��6oެK�.��ɓZ�lY�k6���<�|d�$���W�t��)�|s̜�=LN���´u�V-^�X�/�Y/..��>r�}�)66�*硇ҤI�l������X�ٳG��������uss�ܹs��L����/t��q͘1�;v��Ɖ[�]�v���Ӛ6m��Z``�Mlٲe��������Z�`��~#G�Կ�ۿYs�M�6����/IVᆬ��;���QEE�&L� ���-[�h������QQQ�������Sk�o��1&��S*((����oh̘1rww������ﯥK�Z�:6n�h��b�
����s������o~��]�V���6{�J�������e2�d0���,ooo���)55�E�6\]]�n�:EDD���G���=z���㛽�����RRR)???9;;���OS�LQjj��������>�_�^/������/�s�=z�'�f��������ܬ��;w�"""ԵkW���*$$D�-jq�fw�����
�������$]k����Pnn�M~nn�<==5z��V?���������"�f��銊���?C��w��h��6��4�ڵk����͛7+  @�TZZ��^3g�����\!ڢ��(IRZZ����LNФ��u��ݪ� --M���H!�9@���ݕ�����l������L���JHH�9���:;�m�#�<�Y�fi��咤ٳg+88�U��S�bw$��d��drt�v�c}p�М�;���1�]����rt	�bYYY�8q����М�FEFF:��V�9��1�L2�L�.ච9��ٻw�V�Z��2��BCC5g�G����]��>}ZYYY�.Z%++Ktt�&��Q����.Z,**��%h#���;���1�s3�����Wb+33S�$
:T������)hs>�իWk�ƍjhhФI��A�9�4�L�6�ҥKZ�h�"""d0���	&h�…�t钣��DsJ;e4-��t$))):��&O�l�M�2E�ϟWJJ�+-��>�?��5k�(//O555�ի�~���g�i���j�[�N�v�Ryy��u�Q�Fiƌ����]�zU�֭ӎ;TVV&���G�=����y�=kkk�����;w�����u릧�~ZӧO����ս322�裏�����޽��F�2224u�Tyyyݦ��4�S:���
����…�XII�/^�+W�h���v�����K/���'OZb�ΝSzz���󕜜,I��ի�~�zK�O?��o��F�|�.^����(IR]]����t��QKnYY����UTT�իW������?�\���
		��-$$D���ڱc�^|��V��s�X�裏>҅��CiӦM���/��/H����ox���u��I(99Y���WRR����URR���TK�M�$I|��߯/��R��ϗ$mܸђ�a�=zT?�����u��AeffjРA���Wvv�%7//O�ԯ_?���1shhNi'�F�՟��{��$���
�������UPP�������=v��-I���׀��⢁j����]�vYr�T��Ҕ����󟊈�PAA�U��Ν;%I���


����z��I�֭[-�Ǐ�$���Ӧ�^�zY����c}:��g�J����۬�JKK%I��<�j_Iz�W��[o�:p�>��CM�6M&�Innn��ӧOK�����޳���򹢢B����e�g��s@�@sJ;QPP`��<%�q\�:u�t[�}��U�ؘ1c4t�P�ٳG�}�����k�Y�F6l��ٳ��/J��ܻ��Ʀn''ہ>���~6pgq�Ot���K��Jr+���%IG������������Õ������+&&FUUUZ�b�%�|͖-[TPP`�'??ߒ���+I������3�����h��ᒤ�˗�ܹs�|���}�]�F���7�.,,L�������B��׫��PK�.�$�1’��s��h4�O>Qmm�x�I�\\\,y#G��$��ǫ��XW�\Qyy�V�\)�Ѩ��8K���S�N��f�5��"�X�������Ν;UXX�q��Y���w���u111ڵk�N�>�iӦY�Z�bbb����e˖iٲeV�����ϱ��ڳg�
m���榹s�Z�>\999***��C����$Y7�����)�X{|}}����1c����K...�ׯ��y�=��37����K)))�������������)S�(55U��ޖ�	&h���z����*WWW���G���z뭷,y���JNN��d��`����������T�I(cǎ����rssmj��͕���F�ݒ���)�����̱��ҵkW͛7O��ͻ�=���~�<ooo���z��W�̻�{d2�������RH�JKKu��͜9S7�h;���6%&&FݻwWZZ�%���&��`s,h�hNA����egg���Leee���VBB����]h&��A���#�h֬YZ�|�$i���
vpU�%hNA�d2�d2�]h%���Cs
��Sp�tvt��S�N�.Z�d29�m�)mLhh�233]�Z``��K�p��&��1{��UTT����V3�LJKKst��6�����%@��d��c}p�М�;�c}�,ǏW߾}����驧�RUU�����}�v������FIRAA���F�ݿ�s9����L8p@�4t�PEFF�l��N�9���^SNN�
6��٣��*IRUU���٣1c��%��͞��p��a�^�Z7nTCC�&M���� 
4�a5p;p�nYNNN��}��$iܸq�����;^SKX5����K�.iѢE�����`����&L����ҥK�
�֢9��2���gڂs��髯�������?��{�U~~�~��G��楤���<y�%6e��?^)))��֣9���p�/^�Q�Fiذa���֎;�6�����>Pxx��
����k͚5�����\��=���u��U=���rww�SO=��W������[]]���{O�>����q��iŊ�����3_{��!�5Jqqq6���jkk�x�b=��c3f�V�X�����z���z��4j�(�]�V�TYY�(44T#G����G]�x��Y222�裏�����޽��F�222T]]}K��������w��EM�>]gΜ�Ċ���`��ܺ�:�����ѣ�XYY����UTT�իW�ɩ��������$�?^����mٲEӧOW�N�nK�555z饗t��IK�ܹsJOOW~~�������au͊+T]]m�q��ϟ�}��I�֨������z͛7�*��w�զM�,���?+  @YYY�w{��e���������?�Q��矫��V!!!6�		Q~~�v�ء_|�ٵ�09�JKKә3g�����d�߿_�֭�ۜ�a�=zT?�����u��AeffjРA��ϷL>)((�\SPP`������ٳg�x@���� �={�*����_�^'O�T@@�%7))I���*))Qjj��5�{�V^^��,Yb���sI�?��Oeff*77�r���ݻm�)**���}��Y&�,[�L�����O����3fH����K�uyyy��~����i��sh�hNi'���4>z�^��<����E���Z�p�;;w�$%&&*((H����ݻ�$I[�n�im�����{N���g�5y}s굗;p�@˔�]�v�\-WWכ>�=o���z��-www��w��$�����͘����IDAT�?_<�\]]e2�$I?���,X��={�K�.�:u��kG��?~\�ԳgO�={��e�@{ı>ЩS�$I�����>}Zҵcx�)))i�^��Ֆ����{O��M��ݻUSS#OO�V�[ZZ*I8p�U�|�ٳgm�17y��/�K��]�J��^�j�׷o_����ӧ�峻���u�$///�5s̜@{DsJ;��󔔦��ihh��ީS���4VSS����UWW�dΏ?���۷+""�ɼ[��F�5���tjJs��ҥ�ݸ�S�É��h/�k�{���9��ѣ������믿֯�kK�믿��5:uꔶl�"����{���Y�j�BBBl��ۧ9s�(;;���)ͩ���_����9�!C�X�G��<O{���s�Ω��R���Vk���hO��vi��ђ��K����H�����o�t�R�ܑ#GJ����U\\�+W����\+W���hT\\�%�<��|Љ't��1���аa���2l�0���SG�Չ'Z]oXX�$)11Q������Waa�%wĈ7}?�5~����8 ��F�3Ǯ?2����)PTT��o߮�^���M����jϞ=*,,Ttt�՚����Νk���㣊�
M�0A�A�?��$i���7<z�S�N�<y��y�egg��^kU�111ڵk�N�>�iӦY���nE��ڲeK��h��Ç+''GEEE
�Z+**�Բ��
&��S*((�����u��)<<\��{�:w� -Y�D����j���Trr�L&���������0���ZM�x��� ggg]�xQ۶m�����}��&k7n�����m�6���O�����K)))�������������)S�(55U��޷��<W]]]��o��c����C���6k������L��=�������"�f��銊���?C��SYY�Ə/egg��o��VoK�]�VIIIڼy�$I���z���5s�LM�>��%IJKK���]���)�c�=&�ѨO>�DUUU�z�����;���[����;�Bk���-&&Fݻw��?����d0l�Z�����p�=��3��O�l�2-[��j���G3f�pPe���zo7www%$$��_�ԩS%I���Z�j����\�CsJ4o�<j۶m���TWW���_Æ
������������z�GyD�f�����%I�g�Vpp�����hN逜��d2�d2�]�-io��)�@G����qќ�;���1�]싌�tt	�bYYY2�L�.@��6&00P'Ntt�*'NԐ!C]�6��)mLhh�BCC]�mAsJ������(G��f2������28�)mTff��K�����)m�ĉ]���͛]�6�����brJu��q�����e���Y233u�I�СC��=@�hN�^{�5��䨠��ѥ���z�Çk���ڸq�4i�$iРA��R`�t@999�.ᶹ�r��%-Z�H2�ׄ	�p�B]�t�6T	n��v�h4�h4:��v!%%E�ϟ��ɓ-�)S���JIIq`et|4�t0�7�\�b�|��!�5Jqqq69����WII�f͚���P=��Z�t���~�A����Oj�С�<y��n�js�/��Bqqq
�СC5n�8-_�\���M>�$����>Pxx��
����k͚5�����Guu�222�裏�����޽��F�222T]]}�Z�����kŊ����j�h��3g���R�t��e}�駺z�����%I���х,ה��h��źr�Ə/I������d���s甑����*-Y��5���)..NG�����ʔ�����"�^�ZNN��>��s���*$$�f������kǎz��[�>@Ә��X}���$���[yyyM64�gϞڴi����4m�4I��ݻ-�}�.\���zH�6mҗ_~�^xA����l���%I���W^^���ۧ?��O�����&�eÆ
:z�~�a��������ԠA�������l�uyyy��~���<�9f���S�	{G�؋7nFi,::Z���-�c޼y
�$EEE)99YUUU���{�J��x�
K^||�e��ٗ_~���;vL۶mӉ'��W_I�jjj��a�Ν����D���K��t�����^[�n���?/I:~���kM5�����*�~4��e�
-էO�goooI�իW-��g�J������>.\�ܹsu��1�����&�=}��$)<<��zII��sEE�$����&�3��ۏ�v��D�Ĕ�MJi�FSSԩS'IR]]�
�wqq�|6�_�^̞w�}WǎS�=�㏫O�>�߿�"##oz�͚W���b����+s�Vk�Gs�]�S�Njhh�ŋ���)�z�Hs������_���衇�aށ$I������$�<yҲ^__�Ν�4:uꔶl�"���d=���:w�*++���k�VYYi�w��8	�{�I ��o�bnټy�.]���'Ojٲe-�����%I˗/׹s�t��e���2�z�l��߯��:k�…�xUU�
�e�ȑ����x�ʕ+*//�ʕ+e4g�5/t��)�{�c7;���)���d„	?~|��aaa����_#F�Pdd��������|}}UXX�q��)44T�������w6�]�x�BBB���������YbccիW/*::ZC��رc����Ennn�;w�es�LQQ�M��؈#Z���i4��S*((�����+  @��Ϊ��kr��s�*""B]�v����BBB�hѢ���뫔��3F^^^rqqQ�~���;��g�����3f���������k�ҥ�1c�$i�ƍ7|OOO%''�d2�`0���Y���
Sjj��$��c����C���6�������S�G�n����ujhhhptw���tEEE����w��ڵk����͛7+  @�TZZ��^3g�����\!��DEEI�����~p�(`r
:���u����OKK��`Ptt�+��9����������2���);;[			rssstyth�]�sx�G4k�,-_�\�4{�l;�*:>�Sp�0�L2�L�.��
��9w�)�c:;�ؗ�����Ų��4q�DG��
�9�����tt	�FsJc2�d2�]�mAsJ�w�^�Z���e@����jΜ9�.��99�X;}�����]�JVV�<��2�LNi�233]�XTT��K�F09w�)�c8�M2�����K����۷o�������Z���,33S�$
:T�������hNA����k��ɹ��#�t��a�^�Z7nTCC�&M���� 
4�ѥ�!М�&5nB��ɹc{��.]��E�)""B�A�4a�-\�PYYYrwwwh}tN�.-c4o�xؗ������k��ɖؔ)St��y���8�2:�S:�����h4*66�*���/�Ѩ�;wZ����e4�c�K�ˡC�4j�(���I�n����qsLmm�>�����kذa?~�֬Y����V?��^%%%�5k�BCC��Oh�ҥ�t�Unyy��,Y�'�xB!!!Z�p�jkkm����VFF�}�Q���Y�ݻw��hTFF����[];w;�S:�ѣGK��;fՐ�c�I���7K���BgϞ����BCC-�+V���ڪa�f�����>�HgϞ�O?����2%''�W^�իW[�h���3g*??_�/_Vee�>��S�X�²^]]�iӦ);;[���������o������Z���ج���������@�ќҁ��W�ҕ+Wt��IR}}�v��%'''������˒���"Iү�kyxxX��ݻ����d���

�>��oذAG���?���t<xP���4h���󕝝m�^�D{��ٳ�6mڤ��<M�6M��{�n�_������G��裏��~�[�N'N���+//O�ԯ_?�5s̜Z��v�F�����)�Ƒ����J�=��._���{�J��攑#GZ�'::Z���ͪ�|\Pbb�������޽{+!!A��u���?����S``��t風�(IRUU�e}Ϟ=�����rqqQpp��|�M���?.�Z�Kc�z���-����z��'�����;v�K�.�5k���׿�o���|�I���I�=����ƌ�8}��$)<<��zII����XnE�>},����%��Ƞ3g�H�`u��m�����$yyy٬�c��r4���9��S�5x8P������О={4d����h��ڻw�jkku��Q
4H>>>V�6wj�$5444�^SS��=�qqq�|�ԩ�
�h\O�ζ���;9�2���4�)И1ct��}��G�x�BCC%I������ן��'������R�A�N�Җ-[d0n˞-ѣG�<yR�RHH�%n>��z���:w�*++���k�VYYi��c;6��O<!'''}�駒diN>|�$��?�$���5{o�4�Q>�,M.���*..֕+WT^^��+W�h4*..����O=��$)11Q�R}}����[����6�}���$�:u�f�3���crJ�����`�o߾���$���S��/��3g��lєUTTh„	2ڲe�bcc�g�*::�*���Ms�ε���h��wdQS�����_���1c�%>v�X�&��Ç+''GEEE
�Z3OZ1bD��l19��*((h�yc̘1�l,�STZz��믿���9;;���N������d�L&9;;���[aaaJMM��&����jݺu�������\]]5z�h�����;V��͵Y��͕���F��s�
��k�m�0�^@��\�Al$HHЄ�B!
�
6�"���E��F�
g?O6�+9�O���1f��-꺎_���3���\.q��c�XDD���f��>v�]�B��u���30���hm��x��z��|>��y"���0Z��,�����]�E�u�x<�i��N���`&� ��j��!N�SDD��X.���`8�S�������0H�� ��1N �I��VE��o��*w��S^�z���msg|[Y���`��bʲt��[��˟S^DQ����*w��qJf�:ڶ͝��'�`�������[���8�d�SH�8�d�SH�8�d�SH�8�d�SHf��#�?��4�;FIEND�B`�PK�a�\��j�� pear/data/Base/design/design.txtnu�[���Base
====

Purpose
-------
This is the base package of the eZ publish components, offering the basic
support that all Components need. In the first version this will be the
autoload support.

PK�a�\u+��S�S�'pear/data/Base/design/class_diagram.pngnu�[����PNG


IHDR���|�bKGD������� IDATx���y|M���Wd4s
S|%Um5I[�EiiS\�T��!���⪡U������&�1�4����*1D(� �R��� "���|srN"�C�~>���^{�>k� >�{-�0DDDDDDDDD$���#�_(Y&""""""""r��e"""""""""w(Y&""""""""r��e"""""""""w(Y&""""""""r��e"""""""""w(Y&""""""""r��e"""""""""w(Y&""""""""r������ݻ�;�G"""�������<@�0��Ƚ���@�n������+V��DDDDD�b�d��e���h�0D�����ӫW/{�!"""""�Y&""""""""r��,Ak����h�2)
%�D�������ȃ���XDDDDD�(�,�Ck��<شF�������Y&""""""""r��e"""""""""w(Y&""""""""r��e"����`����H�ʕiڴ)ӦM#==�ޡ�������}F�2�������ի�޽�#FвeKRSS���������G�,�?-�0,>\�x��+WR�vm�����ɓ���������G�,��gggz�!�t���ŋX�h�������e"RdgΜ���ԭ[WWW����ի��Y?�5Ųr����[�nT�V
<==5jׯ_/T��<�.\�:�������iѢU�T��ɉ�U���+��u�V��%&&������T�T	___>��#�^�j�Λ�������<�0{!r�988F``��cɿ�۷Ӿ}{�]�fu��͍U�V`Qn+�]�ҥ-�[�p!o���nݲ���O�}�vʖ-k�~^��ܹ��͛Ӹqc:d.ONN�U�V���ڼ�����Hڷoo.ۻw/mڴ!99��5���c׮]<��C��̛�-<<�^�z��{�c�|�ѓe"RhW�\�k׮$''3l�0IKK#::��}����A``���[9�3�b������S�0`�n�"88�S�N�����?���������O?�W�YYY����\��=z��;�X��O�����ۛ�~����T���ٵk͚5�0>��c�k�
Frr2���#11���RSSٲe�5����|��GE�7��� ��X�g���`�3��aÆ�y�$::�prr2cĈ�F�iƫ��ju�޽{
��W��E9p�O�R��Q�FY����aƾ}���%&&�Q�L�r7770���Z]gF͚5�e�5ob),,���Z�c�|ث'�D��֮]��!Cl��۷/6lȵ���$z��Iff&�ڵcʔ)�7m���A�������0N�:U��
�`߾}���[��>}�0������HKK�(�S������/���y{{c�ϟ7�Ǽ������H�p�w"��2-D���g����\��ߟӧO����ҥKqtt�8��q�x��g�X�*++�k׮q��af͚Exx8����޽��
Z]��I���ٳg�w��6�=z4}��!::���h�v�M�6t�Ё������b�_�&""""""%C�2)4[�����_MDD�˗�o��r��VuL�]�+W���Q�T)*U����?���xxx0e�F�Ś5k��/_��ѣ9y�d���ݻ7+VdҤI�~��,X�����dÆ
ԯ_(��������H��k�"Rh�(�^�js�~���.�			���888�d�5j�g��Yq1b[�l1����ӣGN�<IÆ
7n!!!|��7;v,׶���o�>Μ9Chh(AAA4h��'N0t�P�1f�DDDDDD�d)Y&"�����Ν;t]zz:=z� 55��>���;�Z��������z7n�0m��rΜ9$$$0a�����ر���mYYY6۪[�.}��!$$��G�����u�Vs��Λ�������<%�D��^z�%�v�)33��|DDX�>��ҹsgƎ�g�?�<!!!V����ppp�^�z��ѢE��zh�5�^�u��������׫W�������
;o""""""R�,�B4h+Vdǎ���K�ٳ���t�l�€x���qrrb����k"##�5k�?�8�-��!�>���+���g�����o����y�fz���^3,�2339y�$�1#G��w�1��[�.p;���o�q��-���y�7�6m����˗�_����nݺ�q�FRRR���$..���@�d��7�7��ۺ��888fNd�<������k׮OZe��_2p�@󱟟���k��j


�o߾V�P4k֌͛7���f.�[.��}�2o�<��y��߿�ͺ�ƍcٲe$&&�r�J�t��^��iӦ$$$ؼ�V�Z�رsYA�M�.<<�^�z��Or�������C��,�"	�Q�N����X�"/��"6l�J��8q��}�m�6^~�e*U����
6d�ĉlٲ�"Qv7���ԫW�=z�n�:�D@�~�X�p!M�4��Օ
*��/��w�1a�ƍ�^�̤B�
DGG��ӨQ#J�.���^^^��d����2(��������Ƚ�'��/IO������2)z�LDDDDDDDD�D�2�;�,�C�2�;�,�C�2�;�,�C�2�;�����W�^�Y���a�H!�X���!�����ȟ��e"@�n�����������HqP�L����w"""""""rP�Lppp�w"RLðw"""""�S�L�N�:h�0D����õ������e"wt��Mk�<�n޼�d������Y){ """"""""r�Гe"�p��%�T��6m�ܹst�ԉ�ի���111v��V����)h�G��G)�5�Za��T?��u#""صkM�6�{��EjODDDDDD���e"������q�ƍ�����d۶mvK
>����̙3Y�|9�a�ꫯҠA�4ib��DDDDDD�%�D�!�d��~W���m۶[[����(�d`ZZ�ƍ�k׮���йsgƎˊ+(]�t��'""""""��5�Dr���g�,Z���s����Dze��1cF�_u������s��%z��a.�ٳ'�.]b���v�LDDDDDD�S�L�%''��g���+�дiSڷo����׭���ӪU+s�iӦ���jQ����L�0�6m�����رc��Ƙ1c���3��f�����ǨQ�,��D�Ijj*3f̠cǎ4k֌:��_���aў���XZ�nMpp�E����4h�>�,mڴaʔ)���j��"�l���Y�lO=�իW7�רQÜ|MNN.��EDDDDD����H.L��;v���@<<<X�jqqq��ݛ
��ׯ_筷���ɓ沋/Ξ={

�L�2̞=�����/^�Ȳe˸v�&Ln']���8�����OJJJ��;j�(����ԩS���F�\�x�O>���ի3z�h6m�d�ڌ����9|����…����̙3)U�27��矓��l�<0`III����j�*���3f���*i��IMM���ߪ���Æ
�ҥ�=�]DDDDDDr�'�D�"�b��]�ѢE�<y�Z�jJtt4!!!ԬY��Ǐ�`�sݥK��V;v�`�Ν|��Wl߾�\o��Ŝ?�:u�p�B����;w.���yƒ��Ҝ������G����|@VV~�!)))�?�
*X��c>^�d	��q�Ƅ���{�n"""hҤ	{��!22�*����c��䖇��W�fǎ�e˖�Ua� 
2�;v�裏Z�c*3��R�L�.
���)�3f��q���y�'=z4�7o6���ٻw/�5bݺu|��|���lnݺ�ѣG��퍳�3>>>�����0Rxꩧ$66���z�}��ѣG�~��<�۸q#�'O�A�8::R�~}Ə`�j'�k������U�ȑ#�[�.�������k׮���w�JZA�|��Q�v"0�z��Y���k�"����ԩS�:u��x�ĉL�8��s��U�'�x¢��'���_5����6����v�0}��9�q�m� ;;<�ݻws��!�ׯ��o�}�kΞ=@ǎm�?~��U�)I�������
*���e.��\�8v�,Ș�\��~z/'S���������ؗ�e"�X�ď�ԩSIHH�N�:�l�OOO����޽�E=S2(gR��ɾ���ė�������_;88X���\�����4���e/�5V���,�ELL�����ߟƍ�`����y�����a�ܹy^_�fMN�>́x�g������\�k�.BCC�\�2������899Q�NN�<Ill��b�WC�ìY�8~�8�5����̜9���{/�k���9s��~��ŸJB~窤d�U�T��ŋ$%%Q�J�s��r��������}h�2�<vq�V�Z�״:x� ���<x�)S���s�Y]MFFG�a�ر�rӚ]/�����X233�����?.�-�ݻ���p�4iBhh(>>>,]���{��똞�2�������g;r��n�����|�����\,�ew��*i�#�<��3g��1��ꈈ�����}��2�<%Y��o�y�fΞ=k��Ѥnݺe�Z�"**�>��>����#G�����k���?��ѣG�߿��|�v�l&bL��cLL��Ɍ?�2e�0a����?~<={���?d���/_�ʕ+s��:w�;�~�-�{�f�֭<x��^{͢m777�
�g��߹*is���ٶmqqq���X�5}O�J�������Ƚ�'�D�39oq�����3�|�w�N���qtt�z����ٓ��1bm۶�t�Ҹ�����͔)S�	��˗���;w.]�v�r�ʸ����/2f̘"���O>��~c�ȑԬY��*�ȑ#�t��|�	Ç�V�Z8::���@�r�

%00www�P��Z�b����T~窤d��ڵ�L�2l߾ݪ��۷S�\9^|��{�����������q""���h�X��͙3���֬YC�Z���;�v�ԉзo_;G���W�^��r�������C��,��|�MjԨAXX��,,,www��8EDDDDD�~�,�J�.��㉌��…\�p���HƏ�������;�����=���ˠA��6m��Z�_DDDDDD�K�2�{(00Pk㉈�����������������J����������ܡd����������Z�L�+V���l�0D��V�Xa�DDDDD�O@�2�;֬YÚ5k���������ؑ�e"�a�ADDDDDDD�J��ݻw�w"RL"""�������<��,��:�֭��#��Қe"""""R�,�#,,���@{�!"�N�^��������<�J�;����e"""""""""w�5L�|�t�T�T�M�6q��9:u�D��Չ����������h�SY^L�s^_\㉈�`׮]4m�T�)�������}M�2�|��������q��v��A��~fΜ����1�W_}�
ФI{�&""""""b��e"��[��t|����a�D\ZZ�ƍ�k׮���йsgƎˊ+(]�t��'"��.]��z�j{�!"@HHAAA�CDD$OJ�����+�s��e�ܹ��3f0c���zy?�?>�.]�G�沞={�t�R�ϟϠA������8991}�t{�!��o�;�|Q�L�%''3w�\6o���˗�Z�*�[�����+W΢�?���+8r����T�Z�V�Z1h� ʔ)c�w��ef͚Ŷm�HKK�u�֌=�ȱ�g����TBBBظq#���;U�V��_�o߾���X�{ٲe<��ST�^�\^�F
���X�l���:�˗/r�""�@@@����KS�LDDJ���”4:v����xxx�j�*����ݻ7
4 <<<��_��[o��ɓ'�e/^$<<�={�jN�͞=�����/^�Ȳe˸v�&Ln'����8�����OJJJ��;7s��asم

%..��3gR���
vׯ_Ojj*���V���g�6l�@�.]J<n��P�L�.r.���-Z�ɓ'�U�'N��G���Ì7��Ǐ�`��K�.`ԨQt��:Āؾ}���ŋs��y�ԩäI�hР��>�3��v�,��K�,����4nܘѣG���ə3g�<y2{��!22�N�:�c�}�Q�vLe;v�P�LD�bذaDFF�;����ӧӱcG{�!""R J���Ea�߲ecƌ����'�`���2�͛7��e?��#�a�����u�HLLd�޽��'�L�n�
��ѣ����������ps�q�F&O�L͚5�_�>�Ǐ�S�NDEE��eG����ê�z��Y���a&R��ڥ��<��,�EΧ��N��ԩS��'Nd�ĉ��'�L�J>���O>�$������?�`ذa$$$X�c���s����o9��Mql@p��Y�\;|��q��W�\��&���TGD����H�S�LDDTJ���cYYYVeS�N%!!�:u�вeK<==�{���L���	4���DI��gNٟ�spp0�a����TGDDDDDD�~�d�H.bbb������4nܘ��o����s����5kr��i8�3�<c.?p�����]�vJ�ʕ,6�����ɉ:u�p��Ibcc-�7�Z����9s��~��E�T�R��/���D�*U,�%%%�눈�����T�V��a����֏}��Ya�hժp{���������2e
�=���5���dddp��Ǝk.�v�/�����X233�����?.����n��v��nݺ��˗��/���#88�\��G�̙3V��LuDD$o���6??�0O>�$]�ta޼yܸq�ޡHn����aÆ4mڔ�� ����Oe�L�Ųe�h۶m1ET���c,"""z�L$EI����l޼��g�dq�nݺe�Z�"**�>���ΖG���ߟ�^{�~���G�ҿ�v���LL�޽{�u�V<�k��fq��͍aÆ���7oζmۈ�����Ǣ�im%ED$�����v���[����0J�.m�Њ��͛����l۶�m۶�~�zfΜi�ݘ1c��������C��L����[�|��̟?��ݻS�zu�^�:={�d��T�P�\wĈ�mۖҥK��₷�7S�L1'Ė/_���s�Υk׮T�\^|��{�v�r�

%00www�P��Z�b��O��k׎2eʰ}�v�v�o�N�r�x��K<f�?�'NX|�=��ݻ�5k5j���f�����r��ĉ;v�]�v1q�Dʔ)���Y�t��C�b�WDDD�\�d�H���,�7mڔk][;NV�X��#G2r��<�)_�<�'O�y.�de˖eԨQ�5�d̜um][�B�{�=�{�<�*[�,������p��yjժ��!�0�2e��;6����DժUy饗�\�2����^���G?�V�������2r�H�-[F�^�������(Y&"%��7�d�ڵ������aaa���[��)"r?9�<_~�%۶m�?��R�J4k֌�����eU??�<�|��СC|��W�ڵ���d���	`Ȑ!��e�O<��K���ݸq���06l�@bb"��ɔ/_�&M�п�MhLN�>��_͎;�p�nnnԭ[�^x�޽{[<mR�y˯�_~��#G���X�>M���d��<y�f͚1o޼B���^����6r~�d?6�W�{��ڵk�1c�N��jժ<��sS�^�<�˩���J�2)�K�f������DFF�777;G'"b�޽{�۷/ׯ_7�����DFF�~�z���K�.����իW3j�(nݺe.��_�ꫯؾ};˗//p����Àu&%%��={��0�z�*[�ne۶m̝;�֭[�ϙ֦LII1��e��% IDAT�y���x���Y�j�V��jժ��%1o�puu�(/J���׿�sbZ�0�Ω8�0)̽�.<<�q�ƙ�/^�Ȋ+���o�3gN��-�{+""r�Қe"Rb|}}4hӦMcڴi<�j����իW<x0)))�y�f>�ʕ+y��W�y�&C��zz�֚[Ç7�7���bcƌ�֭[�m�6�=ʲe��������|��W��7++������[��w�y��Tovs��!>>��~������IHH`ժU<�����_~iqͤI�HII�G�l޼��G�Oxx8^^^�;w����?E�����ox�NJ��ӧO�n�:~��g��-i#�zgٿ�p�.g,͚5#22�#G��~�zڶmKzz:C��ʕ+w�����"""�+%�D�D��g���g�ѳgO{�#"���K�r��e
Ę1c����Օ'�|�ɓ'ӻwo���Y�dI���߿��ӧЯ_?:v�h>NFF���
'N�v��899��SO��_�f���zzzZ|~�a���2d�����������S���>���777\\\hҤ	�}�p{���L���_����'''���x�g�9s&`��gq�[v���;v��ӧ���ЧO�b�sȐ!4hЀr����CjܶG&��w�5jԈ���퍳�3^^^|����s���|m�P��� <<}��G}�����"�k�""""��-[̯���ꫯ���s]D?99��C�r��-Z�h��#,��ر��ڍ�=�X�wV4���8y����?��c��Ԯ]������ݝӧO�믿��O?���;?��U�E�����ַo_ڴiSl}>���Ve�-�цIa�]v����Ѣ���~���s�N�l����8�L��EDD�;���(%�DDDD8~�8M�6ͳ��ӧs=7f�Ν;�������k��8s��>�h��˙h�����?~�ŋI׮]Y�z���/��±c��������aQoРA�9������~�v��ߟ6m�кuk�����c�rruu�F�<��t�ڕ�͛[�/j��Vv�-�ц-��w����?���$��I�n�����+�'��J�������慩�|�r֮]Kٲe�;w.+V�����
P�/s*U�*T���jժ��ٳ�:u�źgk׮���7���K���ҥ�˗g�̙���/\�`^��nݺ,Z��:u�E���<MW�>M��gW�q�RmdW�{�]�r�l��/_������Q�yyP)Y&rG�^��GAED��.]��ׯs�sB!��?�ĉqpp���?���+�>RRRHMM-pwӯ_?fϞͮ]��e���6�����/�L�ڵ�\�2^^^�6f׶m[ڶm˯���Ν;���!&&�S�Nq��Y&N��ܹs�c*�VI�Y�q�dP�{g��صk��P��]c�ǽ}����gH�|$,,��a䋒e"h�	��㉍��e˖���ƍ����1l�0^x�<�8|�0ǎ��׷8¶���a�z֬Y��sn��}ì�,J����f͚t�ڕ�]��y�f���g��+�EI���q�tE�w			6�f۷o
4�k���2�<)"���
J�����-[�$>>�Y�f���Z�7�v�Z�y�Z�lIhh��|ʔ)9r�v���u��M�r��a"""��eǎ��_�V�Zy.����`��i��N�:Y��>���t�-Z���|������u�
;oEQ}t��Ն���aX%�
s���yꩧppp0�ݺu�9s���5�ǽ}�i
3����k��d�н{w{� "�$��E���k��x�b���G�޽>|8
6d���|��Z�
GGG�n�fӦM,^���
2m�4�Ą-�z�bɒ%�\��jժѻwoʖ-ˁ�裏���^�׭[����_���dƌ�����5k��̙3L�2�w�y�ʕ+s��I���+sr
��ի�K��3gC�aܸq������ʉ'�2e
��SF����*�>:��j�L�2����~�zڶmKVV��΅�w����0l�0�y��ԩCbb"S�La���ԬY3_?���ފ����,�#,,���@{�!"��5c��z�!�������s�N:w�lUg„	4j��|lJP9r��{,׶M��׫W�	&��3{�lfϞmQ��'�$88�f�v����W_���������3���0�5B��w�}��ӧ9x� 5k�`�lڴ��Ǐ[$�Lz�!F�eq\�y+��賠�.�67n��ݻ2d���ĉ��w�}�ᇼ��{|�����ߘ3ge˖�s,�x�y�]�x�5j�;�"���C���8��jժ�}�ݺu���'''ʗ/ϳ�>�…��gϞ-pݺuc�ҥ�lْ
*��쌧�'���Ḻ��-j׮M���?>�'O�8ߣG�M�F�F�pqq�\�r4oޜ����aÆ�4����kʕ+�ʕ+8p ^^^�����與�}���ᆪV�Z�tފCq�Y�qGS�N�E��)SGGG�Ns���Ό3�����ɉ5jЫW/֮]���w����VJ����͏��#�+W�iӦL�6���t{�Z ���0f�~���<��ό3�����݋��y��Y�
_T��''''*W�̓O>����9u�T��	�n�����[XXYYY��oq�k�{����|@RR���͓)nɝ���U�/����I���"��1=Yf�g-�uu�҅��L�O�`�a�t,"%��ӓ�ӧӱcG�qHHAAAv��h����?�O?�4[�l����(�����z��\�v�ԉo���|\���q}/�>���1o�<^{�b�^��s�άX����%�V�q4lؐ]�vQ�b������+���s�gb��@��ХK����3/�{��9����sdw��營�_����'��+����{�=�{�=�@%"""R@�aX|222�x�"+W��v���ٳ������7n��8�7n�i�&<<<�qd�c�>���olڴ�:����o��ڵk�j�r��0n޼Ʌ�={6e˖e���|��W�5O�Ƒ�����			�Z�j9r��'�;T)%�D�!..��ڂ�q��v��n���̜9�#F0|�pf̘����������ٙ�z�.]��x�b-Zd�
.  ��ׯ纳�֭[IIIy ~�m���3իW�M�6DFF2r�H�`��ܸq�����5���`fΜ	�ܹs�U�9::R�fM���X�|9�~���S�L$rK�d�{���!&&��۷�)����7n]�v��ݝ�5kҹsgƎKZZZ��#"""RΜ9C����[��y��^�zq��a���Z)���bbb�֭ժU���OOOF�����3�<���Υ��3}�tZ�hA�*Uprr�jժ���+lݺ�f{�����八�+�*U��ח�>���W�ڼ���fbJ�����nɲ����غO�����2e
>>>�?��+WZ�+H��G׮]l�߂~/&N�XϜ9���/e˖�C�GӦM�ۛ$�r/��7z�7pww��ٙ�~�/�����﫢��F�a����k�s�ε�Mnj3�1cF�&�����t�=z�0���ٓ�K�2�|
d��DDDD����i߾=׮]3�]�x���pV�^ͪU�
��S�ҥ-�.\�[o�ŭ[��e'O���O?eÆ
l߾=_;�f��~��K�%''ӪU+bcc-�/_�LTT�֭#22���ۛ��ݻ�6mڐ��l.��� 66���X,X��]�x衇��2o�Z��L�2�]���k׮��͍֭[�:��o����(U��
�o߾DFF�ׂ*�~Kz7o�n���]A�EQ�

2_[�?7QQQ67��Wc����k׮?~��C��pAQ��:o�=Y&RLL�p���Һuk�����RSS�1c;v�Y�ft�Ё/����:
�.]b�ر<���<��sL�<����|����Šga�&/��;99�e˖��SOQ�zusy�5���cٲe?������˕+W�ڵ+���6���D��҈���o߾dddh��5������_��>u��֭[s��)222������b���|���7++�?����+W�)��;�X��O�����ۛ�~����T���ٵk͚5�0>��c�k�
Frr2���#11���RSSٲe�5����|��GE�7WWWZ�nMbb"����8y�$-[��uも�o�G&��[a笠�}�Y��JA���8L�g�Ca��gbb"�"))��>�,_�߸q���D�����oX�|����HZZ���*G��ƍ�߿�_|1ױ��]a��~�d�H.L���d��� &&�РA��~���$''�9�p�B~��W�"����:�b{�W�ҧO���{���IKKc���L�6���W�8�[A�^�~=������[����Ojj*6l(�XEDDD�뫯��ҥK�=��?�///���hڴ)�����w�%))�Y�f��ή]���1b���s���ƍ���̞=�z������s�=�ҥK�����NGGG�U�F�n�8�<�F��_�~ט�-�y��.]WWW�y��f��f߾}L�:///���)]�4�Z�2��}g�☷�^���+��uߊ2gU�N~����$Ƒ��F\\|��C�5�/̽(j�cǎ�q��T�P���a�^�vss�A��9���Z�j�رc-��Wc�ꫯHJJ"  �e˖��#����B�&M������9�~��m�4J���E��ﶸ���ٱc&L`ɒ%>|�ƍ��ݻ����I�&�ٳ���H�-��~�N�:,\����hfΜ���EQ�8���N��Q��w�����>jՎ��TGDDDĞL��!C��<߷o_�<ї��DϞ=��̤]�vL�2��M�l.C���a�:u������}�����(?}�4�a���cu���X��eJ��/��b>���a�?�\V�fJ�}��w�㼒e��v����2���}�����J2�)S��{��'r��M���Z�wU�{Q�8[�l�빼�)S�-Z0o�<6n�h�:���S�1;'''����쿨�������,���.��k����b>޸q#�'O�f͚��D����ԩQQQt��	��@��ѣ��7mڔ�#G2r��bWQ�,n��ѣ6���W��E{2-����g���
f׿N�>���K�.��������x�'
_�W��k�׮]����̚5���p���ٽ{���ep{]���x�����ݻ�;��lw�����Ӈ��h�����	�6m�СCڷoo�siq̛�����l߾���dʗ/ORR;v������+�k�����w�
*%%�
*ܓ~��=777j׮��O?M�>}x�,��^&NSr77�k
��?�`��Z�
���s}��^�%!!___��6 (��6o%�Dr��騩S�2u�T��ĉ�8q"�ū�����ٳg�ر��~L?�=6���[���/��(J�����ʕ+�/_ު���TGDDDĞ�/�]�z_�5�/_�o���ʕ+[�1�vY�\��zG�R��T����������)S5jk֬1�[�|9�G���ɓ�j�w��T�X�I�&����_X�`,��ӓ
6P�~}���f����o6n�H�Ν������̼����v���2==�3QS����$�
{/�gnk�����@�j�

%66���:w��O?�����]c�MQ�bZ�����T���~��I~��A�d�H1�[1��?
ٷ�vtt$33��'����a�ι �%��V��Mc-U�-rS����ED������r��R�lY�]��իW�X�b��MHH��w����%K�ШQ�\�HNN����nF���)Sزe��,<<ܼpyÆ
�֭��գjժ<��4h�f[���?��?��ٳg���駟�駟8v�'N�`�С濗�2oٙ�ek׮�s��Z��8�7)���
���~����ȩ0��^�Y�B/^L�-سg�ƍ�O>��XLOQ&%%����)����L�2�\���K���iܸ1, ::���~�Ν��v���9s��~��]i�W�G�%66�b�C�Y�upp�0RRR̿I���⎳���*U�p��E����~+���d�#"��7�|�_|��a��%4i���!ؕ������ܹ��_~9�ץ��ӣGRSS�0aB�O�xzzr����h޼yq�m%�:X����̙À,�e�%/++��/7�֭K�>}�ӧp{
�:��=P�y���g��B�
�[��0X�~=e˖���J�տIQ��nnݺe��I�����ߒ�-�����y��<�3f����Ν;[$.�ލ�Q�FDGG�k�.����;�5�?3-�/���.�o���?��1c8r��n�����|�����l�ۮ];&M�ľ}����$..�I�&Y�kz͚5���q��I���(�8�[A�~�G8s�U;�2S{z饗�����̴:�����h����ܹ�Վz9�~�
		�:�������e�m/�zh�_ξ���V�?��s����W�V�6w8/�����ċ/�ȅ�ҥK�n�WW�<�+l���r�"_�9+��c�����۷/r���-����n���ݝ��,�}�]��g��X������'�p��-��M�f3��s��a��FXXX��&#F�0|}}�u���a�����k���Vu}}}
___����d�K�.���?͛77�9b�{��
�O�>V�������㏭���V��v\�8�jǖ��P��W�Ze���.��g�…�����f͚|�%.aaaF��r�_W�Ν��;'N�0N�8at�����G�{�>}���`������"+ȿ7�Ν3*V�hF�6m�ݻwiii��͛����...������~�5�|��?��q�����s��1�������߸x񢑒�b�������~���5��c�͛7�'N�&M2\\\�X�d������4.^�hdffqqq�믿nq�Ϝ9c�fԨQ`<��Ɔ
��ׯ7o�4:d�k���nݺi�rWHH����7c���w�����/_��+V7o�4nܸQ�9��>ݼy���_���H�m۶`8;;۶m��W�~��8�0������8�,Yb����ͽKRR����nF�v�7n�0�nݺ��ߊ��>��700���>��0���������0m�p��%֬YC�ڵy��z�*QQQT�^ݢ�iC[�_�v�����-[�p��%ʖ-������V;񤧧3o�<֭[���_�5kƇ~H�6m,�OKK�/�`�ƍ������Ǹq�̏̚�匫��̫���C~�NII��_�Ga޼y���׏��D����tL�ݙ�t0����X���t�Bff&ӧO`ذa�c)���L�>�
���'!!!�9��)�7QQQt��5קX���Kh>���c߾}w�#{�������f͚5c��͸����
��k߾}-~�7o����Ywܸq,[����DV�\I�.]��?�5m�ԼK_N�j�bǎ��t޲�+�<\�p�Z�j��Μ9Cݺu󼦰�?�������-̜e��nʕ+��ŋ�v�/l�%5��LV�{QRq�w-Z�`���Ԯ]��G�Z���^�e׮]����\�z��E���o�Kq���Ŵ�ZXX���L��e��d�� ɩ?�9s�š5k�;��?�N�:1`����k���,��(Y&bJ���cǎ�駟�q�F.^�H�2ex��1b����+W��ܜr��}�v�L�Btt4���ԯ_�^�z1b����J¸�����NӦMy��7ͯfe�h�"�O�NBB���<���:�W^y�ŋ��o��/�q�F�5III|��|��7�:u��7oR�^=�������jժi޲�+��������yY��]S��O�>��پ};7nܠF����/������*U�A��mۖ��`z�!�u�oI��(?��^1Tr� IDAT�D��ǡC����!33�q��1a„{>��g�2i�$���;~��w~�aƍGϞ=���^�2�?%�liiit�ޝ�{��#G0u�T~��'""",~s*J�In�,�%�DD��AK�i7Ly�.]������������?���e""���ӧ�`xI�����s��A�q�OĈ���܍�e"�@�eРA��\��������:u*111DDD�W}'$$�g�}�a>�z��Ѱa�{����<ؔ,y@�Kk�������""F���(����ә1cm۶5�{��/���?�\O���H���w""""���ݻӽ{w{�!��f��\�B@@��,  �+W��f�;F&""""=Y&"""r�|�2K�.e������R�V-:v�H�-,ꥤ��b�
v���իW�\�2�<�ݺu�ئޔ�6m.�رc8;;ӬY3^�u�SWYYY�X���;w�����Dݺuy���iӦ�E[ٿ���0=~�x�M����~��E��l��mܹ����BTT�7�o���NժU�&**�:P�lق���R�LDDD�>�����ѣ���k.;{�,3g�$++�V�Z���ʸq�8w���ڵk9t��&M�z�p���\�~�7n�q�Fà�����"##�3339v�ǎ#--�����5�����B�*UJdܶ�ر���t�4ibu�I�&:t��;w���^DDD�%�D��ٻ�������r��|ç�Ć��|��g���1r��mf�������Ú���9-�a
Y�	��s� K2����>���u]u])��ۭ�~�_�w�z{�_��k�HY�!DQ�]�m߾��w�booϴi�hР������/DFF*A�;vp��u����6mvvv\�t�U�Vq��5�m�ưa��궱�aʔ)4jԈ��H"##��ߔ`�/�����7���*�����İ~�z���0`��,2mI�mmmY�x15k�,�q�j��?����N�^{{{��˄B�/	�	���;�!�S�����ҕ����������;kkk�{�=%���ĉiٲ%���
�._~�%����F�l���J� 22��*�MMM���䧟~��t�ܙ�}�ҷo_��?`��e�����|�2P,JuLUF!�B,��B����T����[��?�
d�988��S�����*W^^�rl��ѬY����Dٲeo��6������D��7i�D�rE�;nm�ݻ�5'�ꘪ�B!�>$X&P�Z��������WtD�O���G��_Eը��>m�8;;Ӷm[~��w���Ϲs�c׮]>\�e��f����+m���h��q���^]s�w�1��ς�9B��1����7	�	�_�
�R��
!ԅ��J�AQ�5jԈ[�nq��5%ߖ6VVVܸq��g�Ҷm[�ٳg���,U�u�ԡgϞ��ٓK�.q��Q�o�Ά
J��Z�j��瓕����y��5�r��[���듖�FFF���W;�������t��MV)!��6mZ�]Л˄��w�yGr	Q����H�LTy���:�w�&00�3fP�n]BBB����q�Ƭ\��N�:q��
����6m���\�t����бcG�۞:u*���L�0��ݻӬY3nݺh�J���'%%E�/����9���c߾}��曤��)},͸��ݼys��Ҹy�FP��͛J!�B}I�L!���x������L�<Y����������HIIa�ܹj嬭�y��
n{РA����~�z��V�֭��U��ӧcii��իu�٩S'~��6n��ƍh߾�F9}ǭ��:����ŋ�	p��E�t�C!�u��!F�Y��B�JoĈ���Tt7�"�2!��������_~��4+++���ʵ�s��i$pvtt�(W�zu�իG���8q"/��r��I�~BBB��Q��'ccc,,,prrb̘1���fl���=z'''�;�	!���XVU�~}/^Lhh(���<z�M�2h� ����r�k���/�$<<���x���/�ׯ�����N�:�ݧO��������4nܘ�;��榔;v,������i�?V��ѣ�^�:G��ѣG�iӆI�&1iҤR�[[�]�v%88�cǎ���V�c�033�����!��$g�B�V�^*H�L=�>}�6mڨ}~��W˵ݏ?����������ݻ8p���x6n�X�ք?+�?��͛DFF����Z�C�������e����:t(-[��:sB!�aeeŌ3J,W�NƍǸq�-�+��*_Yq���5�O��055e„	L�0���[[۵jբ��DFF������P���ٳ2SS�b�B!�(Ls� !�]�2���r��b�'$$(���dz}�v^�u>|�5'̋��}:|�0�6m��ɉ��L>��S���4��#++�y��1x�`��������ݝ�s��)��|���aaa��]��c�v���ҒT`τBQ��2!tж����???��U�X�jU�X�X�zu�4i§�~ʰa���*�K����	�Z�b���xyyq��yv��Y���������2l�0�����ټy3���yw�χ�Zj-�镞��)S�L᫯�b�8p��>��
�Kߔ�jբe˖�?�B�.M�Q�III�=KKK~��'�W�=G$//777RRR���C�O�{�=�&�6D���2!�H^^�֭��ݝ.]�н{wƎ�uw���LV�Z���+]�ta��Y��Ǐ+e
?�8::j}�ѦY�fܻwO�}��4i=z��ɉ��7ߐ���V��?�d�����'''�
�W^�+VЫW/V�Xap�iii̟?�^�zѥK<==ٳg��q�s��Q�fMƌ@LL�r�h���Ǐ�W�^J��������ԩ���
�8::FFF�A}BQz�[�fذa����5�������Ebb"3f� >>��{V�Z�n����o��СCŖUm�bgg��eϚ*m�'�|�̙3Y�j'N���n	Q���2!tP��9�<#F��Y�flݺ�ӧO3f�Z�lIhh�R��ח��`�sNN�N��ԩS<|�PyPy��1�&M"))I)���B@@�O���׷ط_%�r�
�5R��]��r�n�",,������_������iiiJ��/2�|�<y���/j��億�ЦM�{�=��|��!&LP�I�={ooo�v�ީ�]�p�IJ>>>ddd(�������L�o^������gϞ=xxx��!D� 3�*����ӿ�����>)=�`s��w����ˎ;�����ܹ��b����`���l۶��ݻ�,��?����<�eEӆJڐ��jժ�L�!DU#3˄(A�d����GFFK3��∉�a���lٲE)�i�&���x��W	

��~#<<����ώ;�/P}�h���r��-Z@�.]�s�7o`���>|�#G���w���۰aiii�nݚ��Hbbbx���ڮ��!!!��ٱj�*���j3$$��ׯcccC@@qqq������2���aÆ���_%��������J�����888h�US�B!�0d���V�Z56lȴi�����]�=zz����v��>|X�Epa������`jj���u�
IMM%00�{&D�&3˄(������x��!!!$''ӣG�����ݻ�%K�`ccb.\ȠA����bРAz�M����9�ǏW>��Đ��ϙ3gؽ{7.\���J9�4�O>�D�IsΜ9̙3Gk;>>>���bnn��ի1777��(�v��Сs��U�T���<y��5J�����ccc��s�-{-�y��je�B!J����ʕ+9t�YYY���3z�he�}���������w�^n߾���o��&LP�W���(Z�6��u��Q;��z]����������ɓ���ЧOf̘�6��Ν;�^������E�^���,�F��v�
g�Ν�;V��]�v������u��ջ��c���c�̙�lْu�֑�����{��!%%��5kboo�����s��{����������Ν;XXXЫW/�{�=�߉��Y��!�F�R�.��	�	�C�@Բe�X�l��yѢE�,���f̘���ѣG9z�(k׮eܸq�1Bm�k׮��ꪵ݋/���FFF4lؐ�;���*Ӭ�����?�̙3����+?߼y@#	�.�e�ܽ{KKK�ۼz�*����Zm9#�ީ�26hРIJ��Jzz:�և�1U!�B��TdZ
��w�r�J�`�٧1q�D%nvv6[�n%//Oy�����q�q�rMtt4>,�nC����Axx8;v�`̘1T�VM�.Una�����ۢ�:�M�Rԃ?~<���ʱ[�nJ||<�
��
��$X&D�۷/NNN���l߾���D֬YæM��2e��%T8P�M�YW%�7��e�8s���������ޞ6m�h�S��$#F� 22���l֭[�����m��/�R������jժIJ��$����aTu��)�xvv��AnnnEwC!���/���S�N1w�\RSS��NK��퍽�=W�^eɒ%JZ�A����P�2m�\]]���լY3.\�K/����?8p@	�lܸ�7n`kk��ŋiٲ%�N�b���%֭����i׮���;vLm�Ǐ�ڵk888(��R����ʳb��,�������ҥKٲe��`Ypp0���4i҄E����@RR�����ŋi�^�}�7m�˄�$9˄�!!!???� ?YBB�V�
f=��~�077�����������jA$Ռ��;w�ա��<vRm��34������K/���裏�������p��ikk@bb�����l�]NN�23�G�z_���@�讣���dAQy�o�����=%m‹H��L�Nۅ�MKQ�fM%-EQ��R�l�###%-��.��9{��ҟҚ5kM�6���D	ݿ_9�믿���M�6m��~��g%�m�U���;ԫ�N�R�{[4U�j�WHH���ܽ{������Pl~]mڵk��.ܿ��5%�gI"D���2!��or(��~��
fϞ���-Z��?��5k�T��ٓ�� �̙ìY�hѢ���6mb�ƍ8::�n�:�`fR~~>׮]Sr�=���8���Crr���
�T6lH׮]	�o�aɒ%ԯ_��+W�����PQ�ȑ#�����ŋ�]�V	(���o�ɥK��ꫯX�h�Z��̙3|��Wmr�ty��.\`�ڵ\�p�&M�Я_?Co%���
�n���իA1��R}��
!�-///���*�B�����_�>|���~��o��ooo�߿��{W_����Ϫ��yyy�1�rSU�Z��������Ӈo������s��}��͹�>���N�:jρ���ESu蛚�(Ւ�v�کW�U���J�ϒ6D�ғ`��0$X���Œ%KX�t)K�.U;W�Ag̘1��믜<yOOO�r���|����
������;����ܹ�T��ѣQQQ̟?_��g�����رcٻw/'O�d��je�}�]�u�����㉋�#11�v�����ȑ#����ʕ+�3��qr�
+n#����Z-����]�r��AN�>�� ��s��o\���}���+�(��˗�<<�JJ��ME��P�]�6�z���_����`Y~~�ҧǏ묫�Uqc(:}6]2t����8�M�6�{�n���ݻy��1o���Z�4��h�}S��p𫨒
��$X&D1��T�hk����S�F
��ÕĜ������j3�ԩC@@�ׯ����R�vm:t�I�x�嗕�3g�d���ܺu����|��'���˓'OhѢ���\�|???�lق��3�5"00___��������_f̘1���[g�m۶���&22��kײn�:�۬U�~~~���Ã�����ӓ���=�r�t166��ښ.]�0j�(e驡���NJ+���e���j�bcc�S�o��f��B��5j�|���ϵ>����Pe���r��%�ܹ�r\WZ��W��s�N�
�ʊj����T�>|��/�TP0���d�?��|^��]�Ҍ��ݝ���o��СCپ};�Fબ�*5���+III�۷�
6���3XfccÕ+W8q���ߕ�'N�P�f�F�q��-�ݻ��B҆Q<	�	Q��y	~��b˫�Kbnn�G}�G}Tl��}�ҷo_��&�W�[�.K�,�z�hW�e�k���[m�&C�lذ��쳔�,,,Ԏ�{�t���kt�Q�vmF����?7nܠI�&@��'N0q�D���������-��I�L啖�yyy\�~]y�ЦM�j�öm���� %%Ec%�!����f��,Y�_|A۶m9w�_~�e�ז&-GӦM�ԩ�������СvvvO]wQ��f)�G��d�-ZD�֭IJJR��fł�
��$X&��Pݻw'33�ٳgӷo_�ԩ�իW����rWT///~��'BBB�5kP�����Zc��B!�.啖����RUԬYSm��=zɊ+X�b�ڌ0Cyzz�o�>Ν;���_�~JG�Ҧ���� >>�e˖h��Vں�75�����ϵk�7n�ڹ�M�jӇ�
��d7L!D�R��X�t)�z��s�μ��;$$$РA��޺�<ժU���c�RRRHIIaǎ,\����BQ�+W�h=���J@@ӧOg�ȑxyy1k�,"""����U���P���,[��e˖]&u
QU�E�0UZ
WWW�ׯO�5hٲ��9���#F����###��͕�I�g
͜9�&M�`ddTbJ�5j`iiI�^�����i߾�r��?d��ԫWccc����7o^��1~~~<�
`ll̛o�ɜ9sJ�֐�֣G5j�_�EÆ
�ٳg��]���;��ϧU�Vcll���=cƌ���?�y]ݺu	dȐ!XYYadd���Ç'((HI�o�~��affFll��9I"D�嗔�P��P�j�		aĈZ?�g'//���0v����˗y��1/��]�ta„	XYYUtKʱcǀ�7�Ç����BCC9r�����g����� 77WYZ��Ps�-[�������Վ_�r������:KKK-ZDÆ
���i�`(��o�����|fΜ���7�Z�z�zE�aoo�������R͐�L��MJJ
���F6&��n�:���ٶm�ZڐA�1q�D&L�P�=/��#G+q�}�dd��BU�^�#FT�@eU����5�$((���,ڶm���'�����撜�LPP�/_&44��S�[�����٬Z���}�bii	@�>}X�r%>>>2�V�"�rZ
Q�I�!JG�a
!�Bh1d��R����L�>��͛cdd���	̘1��ǏWd�l۶���t�M\\\��BuU9-���$m��#3˄B!J��ݻ���p��q���������MI~]xcvv6[�n%..���t4h�o������;Z��gU����Ν;ܽ{��u����Z����9z�(?��3�/_�ѣG4hЀN�:1|�pLMM��V�1<|����(^}�UeY(�nܦM���8p �k�6���5kM�6��i)D�ձcG&O��7�|��)S��l@!�2!�B�eee1�|���O���˗�@Ya999|���\�tI9v��m"##�p�s�̡z��'�{xx����…�ݻ7:t�E�Ԩ���\XX���j����ؽ{7>T�pjc�>Lvv�Zrp����s��)�9"I��(�yHK!*7��%�a$X&�EDD��BT-��ٵk��'VVVL�6
;;;Ο?�ʕ+IOOW+�s�N.]�D�-x��wiڴ)7o���ϏS�Nq�z��Mxx��l.�>}�`ff��͛پ};۷o�f͚���+t�ܙ޽{+�a�ꉊ�`„	��уjժq��.\�lR��Z}���`gg�q����2,B!De%�2!�k۶m�GE!^`��=N||<�-[��u��L�4�%K������
򍩖R���S�L�> 66V	4���ggg���9yI�]> IDAT�$III�={�ӧO���?3o�<�e�E���Orr2���\�z�ӧO���Ylۆ��������hԣ:�*#�BQI�L(����B<�n޼	������RRRt.s�v�Am���aggǠA����a۶mDDD����w���_����q���AC�p��=�9�T�Te�B!*#	�	���B�����5!�U�ώ�%��
2U�V��2E�4�k���dgg�n�:��c5k���͍����'  ���d7nL�N������_棏>*�:CǠ��򰩎i�OBTu�<)��EDDT��y,���:z�w*�'B�Ғ�e�Yjܸ1���8w�����r�ܹse---�y�&�W���������HJJbϞ=6L�j�[I���i�/�����ׯ+�<y�����k
C���IKK###���뫝���P��hڴ�<C
!D	�y�����Wt7�&�2!�+$$�JE���BCC9rdEwC� ���ٲe��=|�vvv\�t��^�l�Νٶm��׿?~<͚5���ڵ�;vЦM,X̸���'%%kkk\\\HJJ��$33�>}�`mmMNNIII)�h�G�ĉt�҅�ׯ�v�Z��W���k
C���IKK��͛A1U`�y��Oq���\�u�F�n�*�B!ʐ˄B!Կ:č7�3gN�e
�������O�Ι�����|677�޽{L�>KKKV�^M�ΝquueǎDGG�ц��
���%����/���u\�|����k�֐1t�Ё��.^�H�֭��^�x��;{τ�J�e�B�gĈ���Tt7�"�2!�B-��Ufjj�…	

%!!���Llmm0`���ԬYS)kffƢE�غu+���ܹs333:t(M�6Uʎ;���P������Q�{zz��k��g�.]��_����M�4���	LMM��g�ر���r��q�<yB�f�0`7n� ""�ݻwӾ}{��2��]�̱c�puuU�oǎ���gg�R�V���$g�B�V�^*H�L�J��������*{�v�����o<x@�V��իnnnԭ[��m�7U_�211�Y�f�9����?�^�m��ܹs���+�%����ѣ899I�b!�T�^=��}�c�o��A�j��ԩ�����,m���u�ڵkG�v��꛶zj׮͌3��/�oIW�C�Z��߿?������bee@jj*gϞeȐ!j�=!���L!t۶m[Ew� ,�9�����ٳ9r���'Or��I�?>=z��ңG�8�<,�N�:�����.���?���Vh��?���ח-[�����СCiٲ%�۷��>	Q�v��0a��Θ��q��M���hժU��b���î]�7n�v���ҒTp�B!�'�2!�#s���ȑ#XYY��ӵkW�իǟ�Idd$���|�駬_�^m��ʦh�(==�+V�ƍ�l���<XA=)���ży�<x�����ݝ�s�A�Z�*�BTfݻwgϞ=�_����׫�377�gh���2e����+�z���011���	�b)n�!�����ж�������3f666Ϫ��Te\��"+;*��B�qttԹT��:t���X6lHPP�aÆacc�ԩS�4iO�<a͚5�]�4lؐ�3gp�̙
���#00���T�
�>|8���V`τ��ƍ���vvv���P�zu,--�ӧ˖-S���Z�nͰa�$00��Çk$�B���?�Xk����L�M��'�|Bll,���<~���'O�b�
�����_�}��c�~�<~���7oɰa�8y�d9�N<K���|�	3g�dժU�8q���%���eB��}���ٳg�����‚=z0y�d��̔rw��a���<x���,z�ꅷ���:�-�s�NF���iC�%??���A��#//???���CJJ
5k����777
�ԥo�����P�Z5�s�������w�^n߾���o��&L���X)�
t>|��K��w�^����֭ӦM���B�ތ����ؿ?w���‚^�z��{�Q�N��X��U�k�7Y������Ϗ�3gbmm���iР���T����!׮]��ݝ&M��}�v222�S�Nj^7n���#aaa�5J�*�C����߿�Σ�,�=�b����F�JJZQPxFӣG��|�2���=z�O?����H��_��Ռ2Y�QuH�L�2�v�Z%W�ʭ[���|��@A dܸqܸqC)�Ç5�4��S���]�t�]�6�Ǐ/�q���������ԩS�:u��*o��-�K~~>���|���i�F��Ǐ�4iIIIʱ��8}�4���jA#����Z	.fggʼn'شi���<x���Ǔ���vBCC���'  @	>�3�]222�֭]�v%  �_~���}�*ebbb���c?��3���Z�x;;;Ϟ={���л�B!�Э�,9+���K3�j333֬YÚ5kX�vm���dbbB�V�X�|9^^^�?��;w�R�瀮��7o&00�ɓ'W`�Da�S�2�y�ffϞ��Ç9r��}����J��7r��
lmmٰaqqq���q���:
){���4i�L�	��U����#&&�ٳg�e����Z����H�N��ׯ{���Ȉw�}W��M�HJJ��W_%44��~����pڷoO||<;v�Ш�СC�\����8�����͛lڴI)Lrr2M�4!  ���8��������ŋ=�?('$$(�
iW��ΎÇ��_0r�H���4ʩ�eo��P0����A�>�1U!�B����4�ϟO�^��ҥ����ٳGk���LV�Z���+]�ta��Y��Ǐ+e��bW}�w5�ᅬ��������[�����LJ��S����˲e��޽;�z�bݺuܻwooo�u�FϞ=Y�`���`��=���?�[�n��Ջ��瓖���_C�u��E&O�L�n��ݻ7_}�YYY�c}���(I͚53f�g��O�{Y��V�s�_|��{���ٙ�s璙��u�����ɂ�ӧNNN6���(����/yyy�[�www�t�B���;v���������z_ij'3˄(��/������!??�3gΰ{�n.\�����E�����̒�С�}�ӧOW�א�FFF<y򄼼��
������< $$���dz���<x�Z}��+���m۶e�ĉ�~�޽,Y�DI~jgg�…4hQQQ�=gϞ�̨j۶-s��aʔ)8p@y�s��`�B۶mh׮���L�:����+e�b�*������,7�W��&88�#G����LFF���Ԯ]�:	f�5k�ч�͛��B!D�z��!&L��ʱ�g�jM�Q�Y���v5Bif�/[�Ly��~�z�4iBDD����l~��'�W�΂Ԯ/��*'N�޽{J�[�n%//�9s����%�YZ���,/���1nCVʔG����xyy�/^����y�䉲	���E�U&���j�`�e$--�?�Pk���|�g�C�*���k\gHY+++�_�NJJ
vvvZ�����Ç��^�v3f����?��ѣ=z��k�2n�8F�������
SͲ��>�>W�^孷����v����Z�x��1'''�Ϫ�����/�v�ک�U��7o>�u1�]UpK��ӓ-[����3G��ɓ't�҅5
��OOOК�LuLUF��QTTo��fEwC!		����ذx�b8u�s��%55U�l�Y�������s��U�,Y�̪4h�Z���3�K����E����@RR���Sf�}�w��i6o�L�f�fݺu,]���-[�u�V7n̆
���Ә9�[
ЩS'Μ9�ܹs����Jӯf͚�p�B^z�%���	�J�E�{�o��~�hذ!���r�4���^���A}���ŋiٲ%�N�b���c-��7l�@ZZ�[�f���XXX�|�r~��Gt��K�U&�������ҥKٲe�,�we��*	�	Q��_f�}�-[��3g�`kk�?�����iӦ�FnU��p�	P��-۶m[�_�Α#Gt���3v�Xڴi���?FFF�G߾}qrr��_e���$&&�f�6m�Ĕ)S���-����9�����ˋ����
гgO��H����A�f���h�žf��*n�`�M����Ã��PN�>�,�U-���m��m̪c�6S�y����|P��B<�Y��mfy��;w.ӦMS+_�Y���v5Bif�Ϟ=�-Z0b�֭[ǣG��Vf��5
???evP���r5�ʬY�hڴ)#G�$  ����+�Ks�K����<y�?���ʊ��!+eʣ�C���'�(��̙S�?C���*Y�Q�H�L�2r��QhР��t���\jԨ���-���?~\m
��ӧ5�4��[o�ETT!!!���(o�TTk�����߿��@�!。`���+���$%%�o�>6l؀���Z�H�rڴjՊQ�FĒ%K�ر�2U��ښ�W��s�NeG���<yR�A��?��o��r��Ɔ+W�p��	����+�U�:m�i�X����2j�(~���l�‘#G�^���r�F�q��-�ݻG�F�ԮU=�=.��b���,_����!���W���T�
+ͬ��J��4��_y����K!��핟����Whk_�\Y8xX�{\R���Z>�z./m���1nCVʔG����?��0�/��2��U�˄(cqqq��Ӈ��de�H(XRذaC����f��,Y�_|A۶m9w�_~��F]���ҥ:t���3��S�ҥKLMM9�<�}�G��k׮z��*innnܸq�ٳg���B�-���$#Uѷ\qƏ�޽{�q�~~~̜9S9׳gO����3g�f͢E����_lڴ��7���$�U���/Y�h�Z��ԩS,Y��~��)ez���-ZD�֭IJJ⫯��gi�v�ժU#??�k׮)o�i�8��������?���O�v�_��r��W^�֭[\�zU#(�z`7�B��bÆ
��/
///���?oY��RtƼ�Yޥ�U_XY�FP). dbb���>����W�~>+�{\R��u��q���Jy��(�q�fUMY�_�߅!}�w����Z$X&D�ѣQQQ̟?_���g���쌧�'����ܹs���{�~��)A
C�,]�����K�.iM۳gO-ZT�_����ˋ%K��t�R�.]�V��[P}��V�Z,X���'����2l̘1��믜<yRc�&SSS>��C��6l��,�Һuk�����s��5ƍ�V�iӦj�J;�
������;����ܹӠvK2z�h"""� [׮]9x� �O���j梾�9!��'N���KEwE���ԟ��-�.]"11�Ν;+�5ʖfV}a�]�PV��
Q�������
<����ʊ��!+eʣ��^z����?\�x�֭[�}��}�g����Z$X&��{��'����Kll,O�<�E�xzzr��e���زe������ǪU�طo>���s����V�Ӑ�P
&<<�_~��˗/S�Z5������P{�z�q���S�F
��Õe�������xyy)��[�$:t`Ȑ!lٲ�o��___�ԩC@@�ׯ����*�>N�4��_~Y�.,X�ѣG��~&LP�U�n]����_�s��5�w�޼��jKAK;ƙ3g�z�jnݺ�lAmH�%�]���s������׏+V��ѣ�����R�N��x�����RL!�YTTTEw��x��7�t�_}��2��̙3�����U�m{iW#���wC��j}�f�BI��.ty��.\`�ڵ\�p�&M�����VV�Ǹ
Y)S�w�ڕ��0����,YB���Y�r%��������?j�ΐ���DVvT-��K�_(�s�Z�j���0b����󩴻UU���|��4k֌�[�j�_�n���l۶M��ƍ4��'2a„g���ȑ#�i�E?�������JpL5�T�eB�/{{{�/_�������ߠYҕQi�o�{���bԨQ\�rE��<x��1c��555���_�w߾}�H�Y�P�I�A�j���222���Rr9ִiS�����z�ƪ�q��v��i̮kݺ5�ׯW^r�G���֩�wQ�2esss֬Y���4���^�Ǹ?~�رc5���Oy�_���Ν;�1B���/��B�e�4"##��cQݻw���G�ܴi�4^V�r�J�͛����ֺ�:ծ�!!!Z?W2	�-BQedffr�����{� ٿ6^^^4n�X�*$$kkk�%�B!�x:			:_�ժU???\]]�_�>5jԠe˖J��³�U��G����5FFF���+3�
�L�9s&M�4���H���[�0}�tڴi����kצw�ެY�������Z��7�}Ȑ!XYYadd���ÇWH�%�u�F�5���b��Ѭ[�N�j���!�X_�~�ӬY3�
��͛�e��>��<ƭZ)3x�`4h���1o�����(ˣ�F�H߾}�[�.5k���������t����ݝ���ӪU+���166��ޞ1c���+�뇙���S}a����e�$3�^L/�̲�o([�l�ƍu&�=v�ӧOWr����;�\�R�|r���,�T��eW�\Q��/,55�]�v���HZZ5j�ॗ^�S�N���[j;�W���P��ќ<y(H(�����U��,{z)))8v��Q�WV/�3۳ ��ry�VvBf�	!��PVVV���еkWV�XQ�V;vd���|��7|��7L�2�Jʄx,[��Y�fi�r�
�|�	��Ѥ�����CVVW�\!""�O?�Tm�y]�<Mu��BCC;v,cƌ!44��g�>u�B<��w�#?�����'//�˗/+�R^��
��,�ʎ�C�!^/�5C*�1BfU
Q	�;*((���,ڶm���'�����撜�LPP�/_&44��S�[�����٬Z���}�bii	@�>}X�r%>>>K������?��ug�
��.���jժ�…�>}��*eǎ�\�R�+�Y&�B�Ő!C2dHEw����0}�t�7o���&&&8880c��?^�]T�m�6����r�������ζm�*�gBT^�f�⣏>��SSS�W����5���(˵�U���df�B!����򈈈�ȑ#ܾ}�5jдiSz��I�޽��fgg�u�V���HOO�A����xxx([�ʩ~�^�zܹs��w�R�n]������r%�s��Q~��g._�̣G�hР�:ub��ᘚ�{�>cx��!QQQ���4l�P9naaA�6m���b�Ԯ]۠�-��z��2ӻ�e5�� ��r���+?�Y&�Ba���P�n�JJJ
���dggs��y���;v�ڥ�������?g���������۷���d�ҥ���ؖ��.$$$�3gΐ��kP���������7���<y򄴴4v����닽֐1>|���lڷo�QO�������ȑ#�]!��Y��eB��ȑ#�9�B����/x{{�ꫯ���KLL�ׯ'::��s�N.]�D�-x��wiڴ)7o���ϏS�Nq�z��Mxx��l.�>}�`ff��͛پ};۷o�f͚���+t�ܙ޽{+��tգ�e8a�z��A�jոp�.�رc�^��������4��R��7�,��B!�(o,��!�x���OV�xxx8���dff��O?q��u:w�L߾}�۷�Zٸ�8� ߘ�����ǔ)S������X�����3���$''s��I���8{�,�O���f޼yj��
&??���dbcc�z�*�O� 33�ض
��˗���ѨGuLUF!����`�B!��F�͚5kHLL$11�-[���oӿLLL�r)))�N�E]�v͠v��찳�cРA���m�6"""��?�y�ݻw���INN�8���_l����޽{Zs�����񼉈���.!D��;�S��Л˄@�l!D�S�?��Х�,c]�"�`�W�� IDAT۶m����ٿ?�Ν#,,�]�v1|�pe�aIK��5z�h���Y�n��̱�5k���FDD�����@rr2�7�S�N������/��G{��c�V�P���(�1U!�7�<)��	�	�_!!!�#�UXhh���T�:u�ٳ'={��ҥK=z��۷�a�%Xfii�͛7Y�z5����aggGRR{��aذa�o޼	hN�
�-^�sss�_�����	FFFZ�5d���'--����ׯ�v.##C)#��Dv�B��˄B!4u�TRSS�0aݻw�Y�fܺu�5��xչsg�m�ƿ��/ƏO�f͸�>�v�bǎ�iӆ3����III�����������̤O�>X[[���CRRAAAJ;*��Q9q�]�t��]�V9���ի��ZC�мys��Ҹy�FPL�k޼���~!*�C��r�ʊ�BTzݺucڴi�
�H�L!��@�
��Ϗ��׳~�z�s�[�V+���s��y>��S�r&&&xyy)���͹w�ӧO��ҒիWӹsg\]]ٱc���DGGk����OO�뉉����___�:._�L���^k�:t�@BB/^T�/^�cǎ:�Uѵkת\.!�x�"""�ݻ�	�	Q��;w�W^y�T�:::���P�]*�����9z�(NNN��CQ)�Sr�>}022"::ZY�ظqc:v숛��R��̌E��u�V���s�fff8880t�P�6m��;v,���������������^cϞ=\�t����###�4i���...���[�رc������<y�f͚1`�nܸADD�w�}��Z�5d]�v%88�cǎ���vώ;�����Υ�uQ����B�[UK�"�2!*��?���VX����������e����:t(-[��}���5!�0�*_YI�ԩ�����,m���u�ڵkG�v��ꗶzj׮͌3��/<FW�C�Z��߿?������bee@jj*gϞeȐ!j�=!�B�ʨ�l�B�
s���B����b޼y<kkklllpwwg�ܹdeeUt��B�777,,,صk�rl׮]XZZ2`��
�B!�~$X&����p���������6|�pRSS	���	!�(+���L�2�p��mn߾́�<y2&&&�=!^8�Ν�y�|�����gggƍǦM���kE�R�.���ptt䭷�"//��k���8p ���?~�Ytx���	磏>⣏>�%͢R�e�B��}���ٳg�����‚=z0y�d���ݹ�
/��T�|FF~~~�߿�;w�`aaA�^�x��S�N��3�Z}�p��V�^����ʢW�^x{{km;,,�N�:)�r� Ǐ��#aaa�5��u���BTz�[�fذaʋ��Çk$�B�?]i=233�={6G�Q;~��IN�<I@@��ϧG�ϰ�Ϸ¿�֭[���3g8t�ݻw�y�o��FJJ
vvvt�����ّ4-�2�`�ed�ڵ�����u�aaaܿ�/����x���Ǐ'99Y����P���	Pd��Z}ǒ����q�q�R.::��j����?����5���3����ٳ�B�ʪ����߿��!�MWZ�9s�p�����x����ڵ+�����?�$22���`>��S֯_�k����{�|*�����`���l۶��`ُ?����{����g�7�h�@I�A�Z��I?�(J�a
QF6o���ٳ9|�0G��� 66֠�
9%$$(����INN�I�&���?666\�x��� �ur��cٸq#7n��֖
6���.\�h����888h�SS�B!�x�T�t�"66��
��iذ!FFF���0u�T&M�ē'OX�fMEw��կ_?j׮��ÇIKK�Z&==���LMM�ۗ��ETV2�L�b�z�)z<!!������9s��w��…����@����p���m`۶m��Ҽ���:u*���g���O}��c���_�M�6t�Ё�>���ӧ�����ЬY3��5o�\��B!ċ&--��+Wr��!������g���Jz��/S333�g�޽ܾ}�z�-&L����1�δ;w�`ԨQj�1
:t(����j�J�)=T�=zv��E�52d�&M�޽{|������P�fM�w�άY��]����f�ҥ�ݻccc�u�ƴiӰ��x�~�������ɓ'111�O�>̘1Cm�>�X�:u�.���Oxx8;w�d�ر��]�v�����g�â����bAE�Wt�%�QQK��KK�![\[	��"�	qc#l�
++1�(v�QTl�(�Z(����wof���|���[�9s���}�9�8PNU�m�6m����i֬������i�&>Lrr2XZZ2d��������"M��:�2A(#�=b�ܹ$$$��S(eR�4ݱM�6J�۶m��{���\M_˟�	 �
��ߓ'O�~�IۤcAA�%L�<Y�np���y`����6m������d|||���cݺu��>�(66�.]�zL�j՘4i�Ҷ��Y�z5AAA��[�l�A��������������*����)����

%&&___LLLJܮ�S����*��o�>���X�p!P�>.�Lu�N@@!!!888����������ٕ�]^^^�����u�ֱs�NyNN�����ƒ����1cԶ�<�Y�i^g"X&E(*	A�W�&!!��
���ciiI�V�9r�ڲ
������]�v�����j�Z��Y�`����鵪��&m+�A�����R��A��Ϗ?��sssV�XA�-�����͍�*���K||<~�!���XZZ������;QQQ���0t�P�E��w}��1
4Ъ��Sz,_��-ZϢE��g8��ű{�n5j�Ν;���Ãf͚�o�>��}v���M�8y�J��O����C�$$$���ƽ{���*I�5jĒ%K�_�>[�n��LJ��09��ikZfa���Ғ6m�p��E~��w�h���ܹs�-Z����]M�4���Gu&/׮]���5999������޽{
��G?k��E˄� �e�PF"""���v��JO^rss���GGG�BAFF�<\�����ann��۷����S�N�9)fi���4lؐ�7o��D(..N��:u�p��}RSS�S���>�S�� �a„	��ӧ��!�wy5;m�y�K�Ѯ];��ܘ5k���G����sss�U@dɒ%:���P��I~zzz�|�R뇭%I���BӦM�����ۛ/^���*��7n�6m��<_��ٺuk.\�W_}EXX�\WI���쌅�cƌ��LJ��4yI���23|�p.^������RbiTYI�5v�X��U�V�ٳg���q��Mz�聝��R=�G?�4-��L������ӻwon޼��fZZ���Ԯ]�'O���~�Nrr2*�HA�;w��2=z�`�����|�rZ�lI||<�V��[�n���$��Z���φ
pwwgٲe�nݚ�W��r�J��>���߿ORR�JP,))I>F��}��G��
� ��P�T�ڵS9�Ν;<XmY�=��W���'���4i�D�1�B�ҁ�n��������V;���Q�]�۝�jIڕ�~i:g��aI���2ӻwo���{�;FZZ&&&���q��Q�W�N�~�J�.)�$�3gK�.%""���6n܈��#���T�R��v�G?�4-��L��)e�G�,^�[[[Ǝ˵k��W�\Q:n͚5t�֍�#GR�V-��]Æ
cРA���ܽ{GGGlllptt�޽{XXX���Xh��9W��2v�X96e�lll�0a�J2X�+/��QgҶ��}� � oiE�+��TS[�KQQ\.����F�={��c._�LϞ=qpp��˗E�WT@���H�r��W0��T�&��.��e��ŕYCCC
Dvv6��СCdgg�駟*�JҮ������ˡC�X�x1mڴ!++�
60p�@��ۧq�%��g��Ex���e��u��$NNN���r��)^�|IӦM;v,�n�bӦM�ݻ[[[�Ν���.G����X[[�h�"�T���Y�~=��ߗs�ըQ�m۶��O?q��q?~L�:u��O���/�'6�hs�����АM�6�v�Z�=JFF�1.��_U��_�~�Y��S�N1~�x�}�N��z��bZ� �F�(�uְaCnܸ�ŋ�ر����ŋ*ǚ�����ā�L�Q�������Ti^^���(
>��S���ҥ)�K�.)MM�p�����m�Ѯ����
�������5���`�\]e�.�������ѣ�ر//�B�G?�4-��L���ԨQwww���L�"����\\\��)��۷/}��U)�f͚8;;���\d{��4=W���VK��T�V
{{{�n��ݻw夲w��%&&��S����#�P�Ν��^��Ԯz'@�>}�q��V�b���4oޜ��9]F~={�d���,\�ggg�6mJJJ
����ڵkkk����i=:w�L�v툎�����3gҹsg�T�µk�駟����K�.Jy�J���V�\)�Gll���4����h�6}�)u�BbaaA����]�F�v�T�ɖE���ݻwqqqa�4mڔ?��P	VPy�H�"��D�L�
3a�<����������̌�c�Vr�Ax[u�ڕ�]�Vv3A
5f�~��n߾���C��:88p��q.]���J�*̝;W�]ʕ;l�0���8p�L�>�7n���RGϞ=Y�|���	&p��1�ܹ�����t %ejj��-[�dԨQ��.m�XS�]���É��b���j�E�&L����;*y�����^Y�s�.]8q�qqq*u�4-Be9�A�0���,Y�������INN&$$�%K��PTA�M�.G���ؘM�61x�`jժ���>͚5�Xʟw�z���`oo���zzz����#�ę?>
4@OOON���P;w�d��ٴjՊ�U�R�Z5>��6l����/��fRJ��#GR�^=���W�_|�۷o/2HIyyyѵkW�W��Ǐ���[�?ʣ]��
��=zP�NRRR055�gϞ�ҮaÆ�x�b�7o���!���XZZ���ҥK=�<��_�~T�Z�S�N��iZ�ʦ�(.K� ��ttt������^��B����^-���_Tr������?cƌ����]A�BE~�$''3h� ���ߩ��R����oooo�n�����Ҵ:��S�2y��Jn�PVƌ��Y����RO�<}�4?��cY4Fxt�ڕY�fUv3�Jfoo/�� � ��{��dff���B߾}�^�:IIIxzzжm�Jn� ���Ex]�z�;w,��o���@"##+�� � ��Z8p �*�X�^��ر##F���Ԯ][e�%Ax[�4-�����UQ�[Jf)� � �_�������СCܺu���l�ׯO�Ν�<y2��ի�&
B�i߾=3f���૯�*r�A�b5LAAA�J���+�T�#r��{�_xݔy�L�0�{�r��3����Wv3A(!�@AA��P�2)�و#ʺh�
���Ae7C#�*o>�XAA��Pn�0E3�M�Q&ޯ� � � � ��Y&���TvA(#
���� � ���IA���Iy�D�L��СCߨ��� (�yA�
׵kW1KAA����`�P*����߯�f��#F��G������2AAAJ��6\ZWW>�����9s&U�T��֕���j:���6oތ��3O�>-�:AA�Ms���7*W� Be�����ϯ����w>XV���<RRR���$22���@��¨Z�je7�1eʔ�n�������Ͽ�uK��ghhHݺu������ss�rice���SZDDD`cc�ȑ#+�E� ���93A
��=T��.
��Ovv6����?����߈����ݽ��Yi�~�]���ܻw��� F�ͥK�*�IB>.\`ݺu8991�|֮]KLLLe7KAA�#�e�000�~��>�]�v�s��Jn� T�����?gΜ���233Y�`ϟ?��&
����Y�hvvv���annΰa�pss�HAAAK,KJJbʔ)XXX`dd���cƌ!>>^��:::�t��yF��{g��!��������ٳ��S�N$''������~�{��ԩS}}}�֭˧�~����Ֆ���ȴiӰ����ȈZ�jѾ}{�.]JJJ��s�����s��ѫW/����]�6�&**���
�{Q��mcmm�v���Ȉ�͛��?ЬY3����q��n�l۶��2z�hy�_|�Çٶm[%�LA��v��U�m�wڂ?]�t��ޞ�VBK�V����է��:v�H�>}prr�����x���0`yyyE���ǠA����&::�L��DE_����͛Ǽy�Ċ�B���`٩S�hݺ5�7o�?���:���Ӿ}{BCC�.���X�;v`cc���=zDNN7o���ӓ�ݻ����u.\�y��J�����ҥ����ԩS<y�/_��cBCC�ի?����9�Ν�}�����Oܸq���lRSS���fɒ%�mۖ(�S�I���	#++���8@�n�׺<����һwolll=zt��'33�ŋӽ{w��틗�/^�P9f�ڵ<�Ν;3h� 6l�@vvv���o͚5��Ջ5k�h�
ppp��ɓ%j��A����.]J׮]�ի�/�ѣG*uj[��י1c]�v�O>aժU*#�?~̲e��O�����͍��L���<�/�z������3t�P�/Cw���ښ!C����ٳ�:P�^=����kkk���Czz���%� ���믿�*OЋ/�v��~�-'N�(ǖ�=���x��)aaaL�4�;w�K=-[��E��������EIrr2M�4�]�v�Ҟ�&R��‚eO�<��Ύ��t�ΝKbb"ϟ?'<<�ɓ'��������譂��
�R�-[���u�S�N��˗L�6�[�n����ɓ'����…xzzj�޼�<=z���y�ƬY������ ::�V�Zq��i233���"""�Ν;�P(X�r��9s��%==�/�����D������$,,��-[r��m�.]Z�~+���#����dddp��q,--���fŊE�[0Y�k�.{��	&L�����������Y�x��X...������ɓ'O������?;;�iӦ�c��ݻGNN�����0g�� ��uK~��|}}iذ�V6|��G��Q�%i���ӓ���EZZ���8::���V�r�N�JTTYYY����o�>�������8::Bjj*�����/,\�P��򨿸�U�F
F�ş��o���T���޽;���+�����ڪ���֖��L>��OA��_q��)7Ο?��Ç8p ����u!��u��Ϣ���m۶ddd(ݟ���Ç���"������a�ʭ-�T�5)H��Pa���~�����ꊗ�VVVT�R6o���ٳIMMe���E���ŋprr���^����͋/5j7n�q��Э[7v��
�G���N===�{�=F��ݻwqqq��/�T:GZ�t�Νt��ccc����ԩ��߬`����իWcee���������C:\�VP���	

�K�.T�Z��?��͛7p��Y��^ٱc�=�e˖q��I>��s|||T���)�:uJȆ���}}}�����?��ߟ��H�裏���"$$��uxyy���G�&MX�v�V+����(M֦��ӧO��?������ܻw__�R�ۨQ#���8s����*}�k�.�޽KÆ
ٱc���lڴI)�W��kr�ƌCժUپ}�R�R��[�n�9s�-Z��C�&#� B�y�y���2�|*�5o]]]4h���W���K�~��V�gΜQ;^=�=y�$U�T�P�F IDAT�O?-��T&��D�,��Ϝ9S�ɓ'9"55�/�����\���ǪU���K#0f̘�r���5
��[�ni�v�B����˗��߾}�B�vh���w��vÆ
8p ~~~����V�Z�P(�{����,�M����Je[ǎ�F���
�$(j�4���	�V��…9���t'�o���&M�`ll,b?~,�?r����4k�===�4i’%K��Xj[����������~�zLLL�ꗗ/_���_��J\\\������֭[�#���JR������O�z��}-�tuu�U�VЮ];�����ʣ~M�W͚5����ڵkr;==��/R�Z5���Q�F*�hܸ��1� � ��=z��ŋ�ի�;wf�ر>|Xm�M�꾻j"77@m>bmR�<|�777z��I�n�pww';;����w��{tt4�z�bڴi%j�6�9�"}KMMU�W\�MS��駟����Bg��������ҷo_jԨ�U֧yyyx{{3l�0:w�L��ݙ8q��7u�2==���O?�>��3���T�k��D� *�~�
)���Y�ǩ�!�2e
�o���ʊݻw�����_J�ئM��Wp
a^^iii��dz~�z������%22R%w�͛7�|�2QQQDFF�������ĉ	�s�5lؐO>��A���g�ahh(_������ʶjժ�0RP�޽{|���ԬYP�{)��՞�?���u����>l�>}�{ァ�y�C�v��%j����F�wiz��Y�r---�K���}+�ߺuk��ڶm�RVyԯ�;v,{��e۶m���r��Y^�|I�Ν�@�'O�/C�IۤcAAx=edd0y�d��@W�\���U�X)ED����qqq�[�]]��D(
�<y���z�_�zSRR�8q�R.栠 �ۤ	///����6�Rs����/��(��۷�S���>��gff&���������t���^-$JLL����w��Ç@HH*AM)�egg�uH
��u��S999���KFFF�y�={ƤI��y�Mʽ�����얩S��Ǭ�,���G^^��P��$QQQ>|X��*%Ua�2MG+vܖ-[�F�+ݤK��t���K�����K�Z������֖F��j�*\\\�"�{�����U�@Q�Y�&+V��W&��?ؾ};۷o��ҒÇӤI��V�*U�hu����{�I����ڮ�?(�Nq9��?�Ѷn{{{���������[)��&��n���6�����`��\���F*�`��S^�kz�LMM>|8������q��)�)���R��X�.�T+�e�ȑ��A�T�f͢k׮��AЊ����'���X��-Z���>T:6�WWW,--IJJ���]N1t�PΟ?_�wW���fzzz*)h4�^��y��
6dŊ4k֌��]�_��4i������Z�v�O�!�366VN�����\�YO�;wV9FJ�bff���ٳgaaa*�2)EI�HHH���MNQ"͞����M�6\�x���]�FGGs��Z�hA˖-���T
t�]�kkkrrr

��Ã�{�,۹s'7oޤA�,_��-ZϢE��~�:۷oW�֨Q#�,YB���ٺu+>>>����2MS��`�PZ6
S�����6i��#M��/!!�ٳg����������:�ݼ�����<=��ߟѣGs��M�7o΢E�غu+���\�v�в>��s~��w�������ёf͚p��
�̙��J�oBŪ_�>�~�QIH�	8��|UJ&ZҺ�͛''�?y�ғ������#�z��Q��J
��V���1����Hӡ.��rlyԯ�7n����ݻ��gϢ��K�.]���KuC��m�p
o���@+��P)�m%:AЖ6�<�{��Һuk9E����J�%I�)===ڶm���Ui�ԫ.免��Jp�,�;V�!ti�YXj���_?ƍG||<&&&L�4I��үH4IQ�'���yH�ʴ�I�>�F����ӧO�����j�JԽ�۴i#��<v��9ť3)H��Ra#ˬ�������ٳ0@�󲲲=z4���,[��ЩP�*�C\\���dY�?�\Z���ۛ�S�*�uʼ�<��>,,,�8q"'N^�/4h��GJ�oB��ҥ{������ݝZ�j��?@Æ
��+JϞ=پ};.��ٙ�M�������/�v����oo��=f�BCC�~�:7nd�ڵE��ŋ$&&�q�FiР���+Q{%+W�d���4oޜ��Xy��Җ[�����a����Y�l�[���ի*�זW��\���{�!C���BA�6m�U�����>��$%%�Œ���c�w�����8��#i�7��]0%����%IQi�YZZӧO'))��qV�!S^L�Q��D�vj���0zzz���Ҿ}{���K��s�K�"�$E	@�޽����9v�iii�������ѣG�^���w钼_
��9sX�t)DDD�q�F���/rƒ4��`�$���I~ť3)H��Ra������ʕ+�ӧ��t���F�ŀ�������ҥK�R�E�ٳ'111lݺU%X�?��5j$�'׆4G;�t�˸q�T��?������ƍ���D\\�Ju�K�oAGG�BQh0�]3q�D�9¥K���ϔ�Ʈ	�?ΥK�;v�Ҿ*U�0w��Rխ�����+�&M"<<��/�|�64���OOO��ڴWbjj����Ҷ�-[2jԨR�[��c�r��Q�^�*���WA:��jy֯�?~�<R(�Lxx;q�qqq*_���r�A��i��CR0�CQ�$
S�Y6&&&,Z��	&�j�*j׮MϞ=K\���������_��z�%�/L��&ڴS���u
�).�Ja��KQ"�7h� |}}9t��F��СCdgg��+�J�~)�޾}�bcc����	��ŋlذ___���+��<�#[�t&"�P�*,X6c�֯_ϙ3g�߿?���nݚ��p��������חG�����~�zZ�n�Ν;�}�O�>�
6�m�6��}fϞM�5���`֬Y*7�E����Ν;�޽�e˖���aׯ_g���|��ԭ[�+W����ɮ]���?~,˾��<<<1b���������Ȉ+W���4��߿T�VQ�W�Nzz:AAA:���<�?�TE}0֩S�m۶�n�:���������
>����^�:>>>lٲ���0>|(��8m�4�'T%��u��|����q��"GHbffF�Ν7n�<��$�xyy������)���g���J�[CCC6m��ڵk9z�(|���,\��_��ԯ�8�^/��@��ݕ���׏5k�p��)Ə���ԩST�^�>}�h�F��!r�	o;��Lx4lؐ7np��Ey�z��/�kffFRR(v0m4oޜq�Ʊ}�v���i߾�Ҋ���۸qc�^�Jtt�Ҁ���X�c��r��Ҥ5Ѧ�
6��͛*�T���"\�tI�a��%�aÆ���Gpp0�F�"88@%pUV��������ѣ�ر//�B�e���ܾ}���:u�$o��+I{�ԩ���IMMU�U!R�e�‚e
4���;;;�=��E�a�y�) �.]�Td�~)Z޴iS6l��ɓY�j��dQҹsg\\\Ԗ�I�y���J�����2e
7nd�ƍJ�.Z��={����ȹs簰�^�W&!!��}���ѠA���)��m�U����s��qF�!o+������ܼ�ea7u�MLL�7o���+��]]]UVZ�i�D��«a�k֬)�r���jժ����7�4�A��5�^�r�F���?$ժU��ޞ�[�r��]4h���ԩSUV�-Ҩ���m���Z�D}���ƍ�Z�JNQ����r?ڥ��Qw�ܑ�G�2i�$�9�ݻwٴi��0_�z����իWY�b˗/�M�6\�r�+V��Y�vm�<y���>|8���xxx��+�j�6�9*�&)J$t��A^��ڵk�k�N�bY�2dw����Ņ�ҴiS���@y$XA=z�˗/�e˖�������~)H��Ra�2�����'G���T�Z��;���2��ƍZ����HӦMY�j���dffҤIƌ���FFF�edd���666L�0Ai���.edd�?�@BBFFFt�ؑ9s��駟ҴiSƏ����m711!<<OOO����u�9994nܘ!C��`��{�R�[EٶmӧO�ԩS�x���R�!o���L�?��͛�S�&L���������aff�2uTx7�f��JL��cƌ�_~����΄�&E��6lfff8p�Ȳ������o�:u*���>\դM��G���͟۹M�6r�EңG���X�f��U]zMi�NmRsTMR��7|�p���X�z5���_R)E&L����;*�Luy��w��1�ܹ�����>�m�)H��Rቦ�5k�֭[�s���٤��p��a���O����SP�n�

��ӧ�x�B^vW]���r����u��w�V	�IƏυ���"55�#G��駟�nl
����f͚���s��e233���!11��N%PV�~��4�^��7n̡C�x��999*|� �N����ׯ���4k֌A��=��ؘ%K�Brr2��Ʉ���dɒ"��
� �Pq����166fӦM<�Z�j���O�f��6�RT���cff���&&&�(���j�ϟO�
����8X�v�9r$/_���/Q����lذ�	&P�^=�޽�R^g�ܹs����f͚bkkˢE�4j�:ڶsӦM���Q�vm

�ӧ��
eE���k׮���S�^=y�Ea�nz��A�:uHII���T%�h��6l�/�y��bhh���%,]����jԨ��m�9r$���COO�z����_�}�v�i���ׯU�V�ԩS*�D
�,U��2AAs���#55kkk.\���^�Ƕoߞ3f��w���W_��OA�׋��)�/Vږ��@ݺu��k�"�o߾jS��r���	'''��ڤܨR�
���?��?�Y�q�����(��S��ڦ*�&Eh��D�����oW�Ҧ�|eڞ_�fM�������]p�HA"T,�•4'ڻF�n����T;A�t��}�6A^Cݻw'33���K���IJJ�����m�Vr�!R��§a
� � FGGG폞��k���Ɔ������nj�%$$0�|ڷoO͚5��קv��t��	777n߾].�n޼�-Z��'�� �c�xxxЫW/:v�Ȉ#8�<�k�Vʧ%�:��D�bd� � ����<RRR���$22���@���ި�YYY|���x{{�����/%%���(������dΜ9����ʘ��Ͷ ���������СCܺu���l�ׯO�Ν�<y2��ի�&
�kE� ʛ�	� ���)��LNNO�<����̙3���(���Y�bE%�P;YYY��ߟ'N```�رc����]�vԮ]���4������c׮]|��w\�x���i��0E-�#B����}g�)�t�D��̻�F�"X&�/00�BnHA(������P�~}�N�:u�ٳ';w�|c�es���ĉXZZ����Ԕ޽{ӻwofΜ��9r�,P�z� � �P~D�L����ٿe7C�B%%%�r�J~��<x���)�z�b�…�l�R�xM�Z�t��y<==9~�8���4lؐ#F���F��յns�N���V��/++��7����˗/���J�Z��ԩNNN���C���D���{~��7���������d��̞=�Z�j���M�%$$�i�&�W�Α#G���^��k߾=�cǎ���̜9�&M���k�P(ضm��׿HLL�V�Z��ՋE������w�Z�/3�+W��j�*~��7������{�ѧO.\HӦMUڞ��s�α`���éR�
ݺu��͍�;��W�k � �Pn�����_L�߅w������޾��+�����f�P���ϣ�ߊ�{w��I����P��R����j�/����X��۷+����۶m[ųg�Ԗ_�3g�(Ň~��=--MѮ]�Bۦ���8p��9QQQ�5jzN�ƍ���/U�999)���|]M�:U(\]]���ին���H�uu�
���?��066V{^�j�G�Qi��?""BQ�J��

gϞ-�5�_���wA(+�GA{�s|@�s�6�l�ȑ�U��|c搋�� �=*�	o�'O�`ggGzz:s��eƌ��o#&&��[���ヽ�=			�����)��Z�j���lٲE�~��-�N��˗/�6m,�A�DDD���ȅ���dٲeŶ7//�'O�p��q�͛��Y������ ::�V�Z��O?Ѯ];tuu���a�ܹ����r�J>��3���s璞�Η_~���3�5"77���H���+���Y�t)6l(q�?~��C�jrid�F�⧟~��~c�ʕ*�]]]���a͚5|��Gܸq�o�����ƎKbb"�^���Թ�>�G����2��+WҴiSY�p!����9���x��}��0`_�5m۶�ܹsL�4�7n�b�
<X�k �+�}R�poR|@�����`Ĉe]��1b�<U�u(�	�N�?��O?��Çquu���+++�T����
�7of��٤���~��"ˉ��`���899)}	��ŋ�5��7Ҹqc�֭�w�`׮]j����Q������cĈܽ{���K�s���عs']�t���###:u��Ν;�t��9���;�W����
����ѣ�x
.U�%&&���Z�6m�p��5���7oαc��ԩFFF�lْ������ٓ��T�����/��k����3z��IPP�Z���АV�ZDϞ=y��)�֭S{~���	

�K�.T�Z��?��͛7p��Y�c�����?� �{��@�O��¼N�,�6�#�ż��߷.]�(Err��r._��:t(����E�ƍ��_�~���\��Ҕ�'Nh��~ttt}��Q���i\nnn�|n~M�6U�Ν;+|}}w��)�����P�|�R�*
ENN�P���)m��a�޽j��_��S�Nj�S��:(šC����]�vjˉ��U9�ٳg
@�����]�kP�>�y.T�w��E�,�N�5�~���?cƌ)�b�7������_Ax}���(M�TG�Δ)S�}�6VVV�޽===��ׯ_�!�
E���yyy���������֖��H�7o�r�͛7�|�2QQQDFF��\WWW&N�Hxx8���4lؐO>��A���g�ahh(_�~�Z�*Ϟ=#==��5kj�)))�.������ޡC�Ur���گ.���5.���Je[�jՀW�2?m�� �n�� �fޤ�@��,9c�A���V��l�B@@5j� 88�ڵk����3��`�6tuu�U�������ҨQ#V�Z�����J�{����Օ�7ojT���5k�dŊDGG���}�v�oߎ��%��W�,I�5k֌��h����ܹ��/Y�2�n�I��u��nbb��%���Php�F�ddd��_�J�����J�� �M��[�L���߼�s��U>���m����?����D����_�~4oޜ>���}���p��u>�իW�r�
���k�����;M� ""�X�0ժU#--����F;$$$0{�lttt�-4W�j�HOO�ٳgZ�Q'''V�ZEXX��-���͛3b�7nLݺuiѢ͚5S[����Ν;w8z�(�O�����\�v�7n0g�BBB�פm���Ӈ��h�
�I9�>�����WiDZ�Z�4���5j���Bjj*�����!�+-m�� ���� B�޴�@�'��l}��ו�/Ϻ?~̙3g���a�֭j�ٲe>>>�9s�Ǐ������\�p�u��������Y�v�<ULʛ�.�l�8YYY�=���L��^�) IDAT.]��=��������7�/^���-����MBB˖-��ё��+�n+8
Pbaa�ĉٺu+W�^��_�YB�m���������q_�����ヮ�.���j���$�K2�U"]���(��###��++�\AA����>|����1������T��W���nkkky$����˜;w.}�����GGG|}}�iA]��䵨��y�7o�b^�N�8�V�mnnNdd���k^^���ԯ_�T�Wf����,Z�;;;���077gذa������n���߿?�*������?  ��}���\�tI~��gϞj�qqq���иq��_Z�2@Hʟ5n�8�㽼���?ָqcttt�|���9���*�J�oVVV̜9���,���_�֨�(Hvv6ӧO/tD������˗xzz0|�p�}:::@������Z�R����(|ԛ6����6*����ȻDݽfY�{��nMl_y���r�}��xm�ennn������Avv6�=��M���ɬY�prr�ԩS<y���l.]�Ě5k2dH�=
-m�F�~�KE}�KlllHKK#66Vi��K�HOO���¶m�x��!�G���}��<|��m۶Ub˄wŌ3�Y�&gΜ���DEE���EXXS�Neܸq������.����iݺ5;w/��>}:FFFl۶
WWW<x@ff&ǎ���977��7o�r�J����5k�����x�{��/_����ˌ?^�J#U������#G����Ann.qqq����J�o�*�Իwo�޽���-'N��~����������#>���]�t!99�=z�
�IBCC5jW�\��{|��g�>}�����*#Ҥ�uAAA��撝�]h�ӧO�F����1l�0������&>>�aÆq��q�V��̙3-CS�^A��N�#u�Gy��›��r�����v�ƍ�o�^��ۢT�h��r��Y�ի�����ҥ5k���s�N,X��-[��?�Q�mQ�gK�,)U�G��h���@���K��ʣG����9}�4ϟ?��Ғ������
(����d�֭9r����ԭ[�0y�dyկ�O~
�Q�t̞={����ҥKѻwo�̙#_���<6m���ÇINN��KKK��СC����ѣr������[�.=z�`ƌT�ZU�>�ԩAAA�9sFi��4ũcǎj�ԔE�eff�����ǩR�
���端����H>&==�M�6q��1?~Lݺu�իS�LQIZ���c֯_ω'x��9�z���}~����ٳ�:P�^=y��ᅬ��5{��aܸqrmA(
4���;;;�=�60�a�>��#��e˖�>o�J�/�8ٴiS6l��ɓY�j�V�R:�s�θ���-��@��ޘ����ٙ)S��q�F6nܨt�E�سg����;wN�}��7���@߾}U�hР��׿�~׶�

9x� ,`�ڵr�zu���={6���J�

`�ԩ*O���}���U��oߞ�Ǐ+�U*�:��o�~~~�1���`��������G�F�
m������6*M���~�]��(�Rx�T�Ȳ�F�H�1kkktuu_�%�O�>ͩS�055e���4SSS���077g�̙L�6��/_�aÆroOy������&O�Lhh(iii���p�������l�M�Ǝ;�w�999$''���Ü9s4�"S��S�ʣRSSٷo���u�ֱe��ܹCNN�����ƲbŊb��ݸq#,��<{����\�߿Ϟ={���к�:t@WWW%���ӧ��ѡcǎ*�U����Jff&O�<��ߟ����gϞ1i�$v��̓�������ɓ��̔�MOO��ё��RSS����_~a�…*����dff��^dkkKff&���5Bi8���iذ!ԬY�>}�p��a�O��t��7����ё'N0`�jժ���!͛7g��儅�i�j����7f���:t�͛7+���/ٱc}�FFF���лwo~��g�-[ƢE��W9�$&&&�����7�вeK��������ʊ����.����7���!?��W�\���kkkLLL��ӣV�Zt��	777Y�fM��2x5���X[[���O�&Mprr"66V�
�m��߿?ժUC__����oE�?h� ���;v,fff���cff���p�p��Jr
�MT3^��A(����4��Ȳ�":t�z�R��$<`Æ
�9s�gϞѸqcƏ���E���Q'R��q��)��oԨQ(
�7o��]��*��*��ԍ��t���???���O���Y�b-Z� 66777>|�t���/���|�ᇸ��biiIRR���DEE�СC���iԨK�,�~��lݺ����MPPk׮��ښ��BCC���`�޽�3�кw��
�
4
4bcc�:u*�N�Һ�LLLh޼9			<~��:u����#���R�
[Y��ӧO	��̌��׳g������];w���͛4hЀ�˗ӢE���Y�hׯ_g���̘1�]�vq��]6lȊ+h֬���,^�X��3g�ТE�}Ҷ3gΨ���ЬY�B�(��ӧ%��[�nt��M�c餩���3~�x��ƍ�6�Y͚5qwwW�:Ym�� +++�#�J�u�֜;wN�c7n̡C���+��[�lɮ]�4nOqׯ��%���6)�}E�YP��#xyy���?����ȑ#�6m���xzzr��I�޽;����j��gΜ��Ã#G�`hhH׮]�5ku��-U���O��!5-�m���i_��U!��^�`Ya��$����6i4I\\�֭CW��rO�<a„	J���_���ŋy��%�
R:���E풙����?���򍴔c�K�.��Y�Z5&M���M�r��My�4Z%**
�?hS�N%55x�پ}����S;j�(��?��S�V���F�DEEq���������?���0��P�֭[Ю];��ܔr�9rwww���hҤ	K�,a�С����ꉽ���<�h̘1������&�Z�*Ϟ=��Ϗ�7oңG��찳�+��'O�P(HHH�СC�&x��.�N�:�ٳg4hgϞE�P������o��I�&��){��Q�e�i�WWWfΜɱc��`����ՕV�Z���7�|��ٳ�ꕒ��)!%;/i�VAA�|�֭�2���!66���X222�)�y?�z�j��+�Z��A��gYYY<x]]]���[��===��^VV��������닉�I��U�}RI�!���K�25���lܸQ��4�#--MN�Pm�J�Uq��]��_~�����r�}��&z-��̟?^�=�h"##	࣏>�G�u��;x��-[�$((��'O������i�ɩS�����3�� �A�Z����U|||g�֭���ˣU
jԨ���IJ؛�-����~��޴i��'Q��~^IJJ�m۶J�۵k�r�;w<x�<$���Z�H+�������o��G���s���Ȉ��~��F����YYYŖ���#y�Ɗ+ػw�����#B���Rp:�2uʪ�����׬YP�'��?.5��߻wO�&���Z�c�{��	�ڧg�6�AA�=�g���s��I9��޽{��*�~$..�ݻws��Y�M����zzz�۷�3g�0e����ՂN�>͏?�Hxx8>>>���s��=|}}Kծ��4��ԴLMﻴm�&׼����8s�gϞ姟~�j�6}�VŎ;����D�r�}��&��`Y�Zu��j2�?�h�f͚���'�&�W�B����899aaaAժUY�p!�ϟ�����Ҩccc���K@y-===@�%��+8Z��@�p��1�s��BFFF�S��#�JS�4�� 1������mՀ��$���J:BKb``Pd�}���СC,^��6mڐ��ņ
8p ���+��իW���@Æ
;v,�~�m��}nӦ�����!22R~o�SV�WҼ~��Km*�6}}���5Q7VڦIrsAA^_����FO����ӧO�����J���qqq�iӦ�+վx�WWW5j����<�]AU�|[[[hݺ�<�*��<�JrYV�^ڔ��5W��ɓ�;w��-[r��!������	hw_�M_�U!}w��oT���›荚��4�:ō&�F�|��Wܨ�z����{����?�BE]xxYI�Ԧ�X��b�,�E�T
�~�R�%���Ȕ��EB4��&�%�ME�R�-3�M~��O3�300������9|���s�}�ljs��QTT�n媮����ׯ��7%ZEQW���L�~���t�֍�~��Ç�DD>|X����3gΜa����i0M���|||8z�(;v�`����������TEc:88�ʗ��\ ����
�
b���dddPZZ��kL��T������ӧ9t�ΖP�k�u��ɓ'���tB�

�۹sg.^��իW�ܹ��sʛ���B!��w̜9�%K����Knn.�1S�L!  @�QS�G��P�[!��)��h����X95X;=Lc̓�3�4��˔k��r��ef͚űc��3e�)c%�*DK�d�e��Щ���$�Fj�u��a�~�����#F;wj�^m��2�1�O�b�g�y���h


(//�ȑ#8�1������ܹs�+W�����h��v�c�����a̘1h46l�@YY�{����0��f���s��-�?��X�OݔF�4���AӍ���P��Z~~>�����端�v���oj�����r���{�y���*o6��kmJ����B�{Oeee�BB4�����Д�N�-g����*m�
�'�gi1׼v~�2V��B�t�*����$]�v���������7�?�>�,[�l!%%�Q�F��WQQ��U������SäM�V17S��$��4���|��ל>}����Z놄��{�n���	

�y�]�v̚5K}���@qq1~~~8;;��Q"88���(bbb����yN;��P�^^^lٲ���H�'=?~�`�κ(���-�5��s�NΞ=��Pt��]�,((�;vp��	5_�ȑ#�ņ
FVVzQ�J$��'
!��e2f@s������l;=x� ��ղ���ݰ��X��a�Xɮ
��ݕ	�k��h唘�K�r��En޼�{gF�Q��b�С4�_����233)--���|���̜9���\�
�sʠ)�*�fJ�D���@[[[��������u�ָ�����hG*��ّ��H@@���X[[coo������:�:g�\]]����֭[f�???"##�۷/666������FHHK�,���s���퍭�-666<��DGG�D�IgMѻwo�
^ǎ
&U4�u�ؑ��$Ə������8991q�D����z�z}�������y���&�9����L����������*�B�{�����|�w�Q�$**
�z_Ԙ�2ei����Ô��]��kV�e
�&�<y2۷o'??��^�������W^᧟~ROj1bo���NX�)�*�fJ�D�����Q/ڪ���.]�����3{�lfϞ]�5�����+7�hW�B��r�S+S��ر���:툪�m���ʊ��L��5����)�ԩS'�͛Ǽy�jm��f�?�zrQM��С$$$p��y�����s��!����EB!Ľ��]�|�#���z��3a„F�)sHc�ԝ����-��ˌ=bW�M�駟�k�..]�D�4hӦM�I�?g�>��#.^��F�t�ܙ��$���ؿ?7o�� $$���z�^����Ț5kHOO�o��ԩSXYY���رcu�:*�h�O>��ݻws��:w��SO=�K/���bnJ�S\\{���ڵk��Ջ�� "##u��F�ɲe������_Թ�D��>|8eee̟?ooo���8s�z��d����W_}EJJ���������ޛ!*00��7Z�BqO3e����G�֭IOOW��u�֍'�x���`���e>�o�Ann.�����o#44Tg���2ei,Cs͆2�57�ܹs)//';;�;w�лwo���8u����[�Ψ�2S�J�U�b�
v������_�JDD۶mӹ��+EsdU���������?�CQQ�G����E�h�U�V����ƍu�_|}}	#44��k*G"���|lIVVV�����^W\111lذ��s$''�c(���f̘����7n˗/7x:����T��߳���[�GB4��ӧ���\���7�Q��'XB�
�W���n^0 �Ym�
gj�D�o޼yt�ޝ�[�r��)nݺE׮]:t(���899Y���.3x�`���Y�t)����,�	���iXB!��$�J���b�=fԨQlذ��^x���P�ms���̘1�I�&�i�&�/_N�v횬��A�V��O��I�gF469�]�tI&�w?�W��F��1��~��!�h�|}}e1A�H��X!��W��D��1��~��!�h�ƍǸq�,�
!�� �U&�ɼR4�,�!�B!�B!�Y&��'r!Ľ�ҥK�5��o���s����닓�[�l�t��
'N��O�>w]����������![�B!�D˄@N�Bܻ


x�u?��C�����_'++�"ۈjk����űn�:*++�0a���8��)�B��4�b����Ң�X�~���B��\M�e��{]VV�]��7X�h���8;;����…Y�~=���M�M!��G!j���m�L���D~^�h9*++-݅��F��+���'>>^}�b�
V�X!���BIII\�t�^xA-�8q"��9III���[�wBܻ�B�f_,��-Ds���"?�B4c����w���_X�r%999\�v��={��/2j�(�z�����dzs�N�\�B�.]x��'y�嗱��S�)�iii��ƒ��O۶my�駙9s�uUQQA||<���ѦM���3f���:��://O�:>>�9s����ΪU�t�h3T^�}��vii)iii2'''���ߏF�!--�I�&ѱcG�^!D��G!Z�/��ݻ��˗�����z��Ǚ>}���!�B��h��?@�=��/((( $$wwwRSS����s��e�������H�ܹ��ѣ�v�S�N��ɓj��/���ʁHLL�}��:���իܼy�/�����
"""���c͚5j�۷os���9��׍Zx������Tg�ʜ�mȶm�(++���S�9OOO8@ff&cǎ5�OB�����B�9��2�Ϟ=+��P�'��o��t7�BԠz2��N�z�j._�L������`Ϟ=��� 11Q��f�N�<���+����߿���\\\(,,$99Y��=z� ##����L���]���322�����gϞ=̟?�u����`yyyzc�z�"''�7�|��]S�999���O�J�RG�4d�#�ukn����LN��|N�8A�>}t�j���m�z����}h�{7�שU�Vt�ԉ��<P�k�����������Cr��Y:��޽{�;w.ݻw ""B��R(�\<���0���k��s�N�<]���S�Hbb"%%%���۷�ڵk���p��I���������accc�]߆�8q�Z��gϞ:u�MK�?BQ��>`��2!�y������bɶ�>h�����~c׮]L�:��gϚ|
s������c�ܹ̙3�+Vp�С]S�;4
��M�6��{��h���x뭷�:��…u.ȟ?�Z ��#��\G��������=P����9s&m۶%77�>��	&����͛7�8e*c�ې��b�9ɔ2��B!��Y,�.���uO�][m�jLJ{yyy8p�/���Gy��ׯ�駟�|����7X�h���8;;��₟�.�ƍ
��M��ʪA߯��U]�6mjm��ۛ�[�ɀ�y�&+W�dԨQ|��F�_ST�����n��{��� IDAT!��|o�V�oᔲ���B!Ľ��.�նa׮]̚5ooo<==�2e
k׮������U����M�Զ��ә={6�gϖp�j,�:��C�V�puu����E��'%%q��%^x��l�ĉ\�t����&�h~��򈏏�����b�

��@ܘ�v�
T%������^����ٹ^�������CBBk֬!88���bcc�u=e���j��{3��
�ܹ3�zx�6�L�#�w#Kn��m�	!���Ų��8���1}�t�ΝKvv6���ܺu���|�-[Ƙ1cؽ{w�w�."[�����DFF��O2t�P������4��VVVƊ+���a�С�=��+W�D!����),,$<<�����z���h�����
V�Z���C�e���L�<��7��;�6m^^^xxx��ϳt�R���L���SS�Eii)�>�=��z���X�]�V�1���/�������(++#22��Ç���Mll,�����}���1d����~4
iii
Z��K'�6lK�.��ŋܼyS��$���� **���|������'::�'�x��nj�F�aÆ
���ѻwo����Qi�l�vpp`�ƍܸq��'OS�6Զ�u�̙3z�U�곽S!��ݚ^D�@B��-��%մ�)""�}������+��°a��ԩ����Y����|���/i�^[^��]���k������Z��w��ׯʹs�Բ�Ǐ�`����n�bڴi=zT-+**"11������n�1VXX���s��M���***���qqq�Y�F���m�9‘#G�~�z�ob>��ct�.^�HZZ%%%F�
g��\�v��S�r��I�k���r�i߾���5Fu9}�4��a�{�?>�����RSS)//g޼yl۶���2<==����ӓ����رc��q��&O����������y^R�f�Ν�={V=�Rѽ{w�2cELL�ނ֠A�ԯ(..���ggg6o�\�5������`ٲe,[���缾�m��aÆ���EAA�N?�װ>��B����"2B�"#�ٻw/���8::�����ѣqtt���^{�5�M�Ɲ;wX�r���k���aRRR8w�...$&&��~���u�k׮��ѣ<��C�����ߒ����9p�t[{�)[�z��AFF999�$R9M ##�+V��~������X�n]�m���@բNNN����O> ;;ۨ�{c�͚5�<yWWWu�pqq������d�Ǩ&���;v���z��C����~��7������V�����@�~��)u��M�ű�^�qS�ܹ3IIIx{{ӱcGڴiC�~�x��w5j�Z�cǎ$%%1~�x��������ɉ�'����&�7���������lllpss#$$�%K����̙���+����i�5k���t��	<==Y�hQ���P�#G��}����fggcgg�3�<c�x!ĽJ�@BC,YVQQA||<���ѦM���3f���:u���HHH`����t�҅g�}���P5�n�-NP5!U>	�4i����	&PYYI߾}u�w�����9~�87oޤK�.xyy��R���2�����ʢ]�v>�W^yE/���m���/�\�����]�FϞ=y��u�l�l�26mڄ��3g�4jkפI���Ւմ�zy^^�����?TE',\���ӧ��߾};P��H��ӫW//^���/[�l��7ży��޽;PuDobb"%%%���۷�ڵk���p��I������߿�k�ٳ���J�;�֭[�������
���)���`�^{�5v��Ixx���5F�j�9���g�ԩf���������0IKK�ʕ+��J�
e�6�d>K��ǖ-[t��7釋�QQQu��ԩ���S�,kRӢ��r|||j����7���F�akk����j�o�}j�C��������quu�N=t�aaa&�7B���
JKK���g�Ν\�r�.]���O���/cgg��S����K~~>m۶�駟f�̙jԕ1s���i�����̙3wwwV�Z�SG����e$����ˌ���mkG���bH�t&�`ޭbP5�W>
.++c�ƍ���&%%E����6���	����j���B"##�s��G�6؇>����|�A^~�e@�v���+�G�)��M��?S�$�>I������_+ڧ�͜9�%K����Knn.�1S�L!  �v���z�˗/3k�,�;����	pu1�u�j�Udڔ��…z�S�����GGG�K/���X����_w��I�_���ߴ)eJ!D��W_}EJJ��x������3AAA��R��4F�����P���RZZZc`CC���	!jb��2��`��۷o�e�bbbX�n���U{�ڂpss�̙3DEE���|}}u>���A��P>�5����ѣGceeő#G3i˙�ĉ|���8�cǎ�h�"Ο?�g�}�+��bR��W�������ߟ��~�.]�������D��1��ƒ��J�^�X�b����[��(��$���"J����TgjdUu��Sk���Ãݻw��_r��aV�\�ڵky��Wk}��{�=�;F�n��_����>� �Ǐ7���Nmj[��k�������D��D髡����GS4�	��}�fKfkk��ŋ�1c�&M`ӦM,_���<�-��s��o�������ѣ,Z�HM_Q="�G�,^���]����@bb"�v�Rˌ���4OS��Ջ���:���kj[�@B��X|����`
ݶfmm͝;w���fέbPY6d�~�a"""g׮]�b��m�ݻ��s���"""jLP�,������G��x��]
׭[7~��'>̣�>��>|X����3gΜa���:�IM���^݂t��Qv���ի�����
Ann.�����oڟL���Ӻu�Z�u���t��i:�c�=��+�5���jҹsg.^��իW��o+��V/B�<�&<<��K��ꫯ�dB�;��4F�����P��P�ω��HQ�&Y,3��o�v��n[srr�ܹs���������:��͹U��B�6�}���m*[ˌ=">55��Q��o��?�I}N�v5�3�<�O?�Dtt4o��}���رcDGG��1b���DDD0o�<z�����_֮]�g�}�F�aժU@U�Pee%gϞU�4Ԙ1c8�<���gԨQ��ݛ��Џ��������Os��I���%%%8::ݗ��c�{yy���LTTo�������ѣ��7��p渧���Ӈ�/r���E1e+���0�D�ݽ�t7��6�i,��
#}ECR|(��)S�:'�&s !DM,~���7[�n%22�p��MV�\ɨQ���/�z
ݶ�|j�o߾�|����1����ܹ�n�


�7� ==����S}{�r_���j��m���J�Ϫ��R]��~-��U�����ٓ�����<<<�<y���-$$��={���OPP�=�#G���>�]�v̚5K��D(���՚s�������0|�p��~���`�m///"##���$((�~�A���Ǐ�c�c�ӽ{wΟ?ϔ)S���`ʔ)\�p��ݻ��]66s�SM����I�ڔ��^B!��5�zC�W;��MMQe��@C�7�e$��I�,�����ӦlKHH`͚5SRRBll�ZG�F�y�f��;p�@�}x��g����>���`ժUTVV��sϩ�W�۪fΜ�7�-//7i,���{������-|
c��ڵ+`|2�ٳg�	���٣sX���l��&[��`��WakkK||<>>>�w�}�n�www5�H�
��������쌵�5���j���'cs����kkk�o���Ϗ��H��틍�
666���’%Kjm{�ܹx{{ckk���
>� �����ֺu�ꃱ�1�;v�HRR�Ǐ���	kkk����8q"���:[��9�&#G��}��s&fggcgg�3�<��B!D��5�i��
��6J�
EC�W3�3��Hu��u��н�:'�&s !DM,�����`
ݶ6t�P
�w�}GHH���C��]�v���|��'���2l�0�{�͵�쭷���7ߤO�>�����;����O���a�HKKc�ҥDEEq�}��|�r����֭��׿�Ȗ-[(,,��?fŊ�l�2GGG"##uʊ���ҥ�N���=�g�f��ٵ^���ooo�rCo�jz#f�\�Wfj�;v$**�`}eQ�P��{C}0t?�:ub޼y��p51e�L}ck�{2TޡCHHH���%�ϟ�СC����`%�B���عAc��0G���(..f�ƍ�;���"bbb�}߆ږ9��&_,&**����?~��BBBؽ{��mM��mk����������͛��-g���
?��,��ˈ#x뭷tBm���زe���z� P����Q�5�߿?!!!:e}���9N��6'O���������ש��K/l��ښ0u�T�����Ç0`Æ
#++��������8Ç���������퍝�gΜ��w���!DC��W_����.�������Q�����LV�B�<��
���ٹs'gϞ�KUQ�����j�����EFF˖-cٲe�]�޷��e$�������hݺ5����qݺu�'�P�*���>��Sv��ťK��С�
bڴi<�j�9s���Gq��E�-N����Y����t���N�:����;V�C�ܹs)//';;�;w�лwo���8u����[�ΤŲPYYɮ]���R���m���6;w�LRRqqq�߿��7o��SO=Uc~�a���������̪U�9r$˖-#;;�_|Q��l�2ΨQ�ذa��7	:�EB4���-�/fƌL�4	�M�6�|�r���{�ƍٸq���!��;7P�W|��'�޽�+W�йsg�z�)^z�z��0vNW�<͐Y�fѪU+�o�΍7�h4,Z�HM�c�}j[�@B��XU��HG-������?�ǪU�HHH`�ƍ:[�|}}	#44Ԥ�)�r)))[���)))�)b��GEEiiilݺ�S�Nq��-�v��СC	

����\���{��=�h4L�8��=�,����9��	�\�Ͽh
�M�b�9�°�y}��<�G����l�j�V�Z o�E���7a����[�B4��ӧ��[�B�fJ�@BCd�L�dk�B�<�ׯ`ܸq��~�z|}}-�
!���h�Mq�fK%s !�!�X&t<���p�.]
�������R!D�"��DK�}(�Bԗ́���b��#[��B!�0?��{�H�M˄����@9-N�fL�n(�B!�
!�eB �|�h	�Xh;q�}��1�\zz:���xxx�!B!�B�,�	A��I!D��믓��ep������cݺuTVV2a����8p�z*�B!�F��X&	W�l���ϫ-Gee��� ,,++�`��7X�h���8;;����…Y�~=���M�M!D#�'��v�e}a�����(��޽���`4__�f��+�Е��*y@��-;�tRR�.]�^P�&N���NRR���������B�9��}��{���j�P�7Nr	ьݾ}[˚�˗/�|�r���ˍ7pss��_d�����]YY			l߾�_��.]�������
�Ǣ���yyy������Ɛ!CprrR����h4��Ҙ4i;vl��B� 2�B�����; �B�{���	

e˖-���p��m�?�.�i�u�ӦMc���\�p�۷oSTTDbb"3gΤ���ֶ�m�FYY���z�yzzRVVFff���M!�B4_f�,�=���ͱ~��=��m۶��у��@�{�^�0�%���횪?�lll�ҥ������b�{,���1ƫ��IN-l�RRR8w�...������׏#G��p�B.]��Sw�ڵ=z��z����ƙ3g����lڴ	___��������Я_?�~(e999�;��nW���G!�n^h�b�����u��v��!���;?��o��vvv���m�6
Sǡ)ܺu�.�����_M\\?����ܝ�e*9��qմ�^��1�v��@DD���3h� .\����u�n߾���(ua�W�^,^�___�lق��o�m�8q�=z�=׳gO�:BQ��!�y���
^,�=�B4��NuST���l�2�l��g�}�l˪�W]��T�����s��)����������z�\�j��j�{�S�
gΜ�G�)4h�^ݳg����c�Z�����U\\`0'�R��B���G!Z>�Y&�	4M��wGGG�̙��c�,ܛ��m۶��ۗ>�www~��W6o�l�n�5�Zx��%���,س�#//O�_]卩��R籡�M��Tw�ڵZ�W�٪��[�L�T	!�Bh��0���5թnu)//O��iW����bbbؾ};666<���L�>�.]��\������xv��ɕ+W�ҥO>�$/��2vvvj���
�����̤���6m����Ƙ1ct�Pi�om�`l�����3g����9w�ddd�L�Ϟ=������|��u�w�6m		a���ٳGͫU������ΪU�Lz]~��V�\INN׮]�gϞ��⋌5J�s���WC?�����^N-�wt�֍�~��Ç�裏��֫���̙3gؼy�mh�Ν;s��E�^�J�Νu��z��ZG!�B�,�L��T��TVVr���.]
��>��v�}�]6o��͛7)))a˖-L�2����εkט:u*��9������\�x���TBCC)++S�����駟r��Yn߾MYYG����&%%Ť�5�]Ell,������1a�Ν;�7�|�SgϞ=>��(y�~���:�*}P�Ly]���	櫯���/���YgT[C�K{�J�)}7���S��<����P^^Α#G���֫;b��*����ǹs�W�\��?D��0m�4���A��uP�P�~jS�,u��B!����b�f�}�[bb"���'>>��"���n���|����3p�@�T7��֨ꔭ���!C�0r�H233���楗^�W��������ٿ?������p��֮]��Y�f
'O����U����\\\(,,$99Y������+ؿ?{��a����[�����4����ի999���Ҿ}{�z�b�O<a�?�8::����κ�}�^�իWs��e���OFF{�����;����)�9^���wc_{cO-�_`` ={���&$$&O���?��W7$$��={���OPP�=�#G���>�]�v̚5K����T�=z4Æ
���@��J�)��B!����2!j��U}k[��ꧺ�i�F=խ:�S���ݱ��VOuزeK��lmm�#�<�G}��_�>�Ο?OOOڴi��?LDD���t�P��v�ܩ�m߾=P������o�����?yyy�jcJ���� uk`�N���~`߾}@��ÇӡC�I�kr��Z��{w�v���e�޽̝;��ݻӾ}{"""����_��W��6t�1��ƾ�rj�e4e�2���-���p�}�Ѻuk�����Y�=;;;	���kkk������"99Y'*lΜ9���bmmͭ[�9r$�۷';;[������٩�nB!���&9˄0��<�M�2�-))�W^�̙3<��"�O�:����ΝS�Ο?��t�*cq���l�̙,Y����\rss��㏙2e
�k׮���Ɣv�b�"((�u�֑�����'����Ν;:Ԩ�/��˗�?"ZjS���.�=�g��9ƫ:S�n�k/��[����)+**�ˍhoo��ٳ�={v������[��C��������quu�~/:DXX���+�B!�mY&D-�sZ\S��f���=�-���DGG�D~5���FJ*C'�Ug(���7[�n%22�p��MV�\ɨQ���/꼦1j�V=J��ё�c�r��A


ԨS�c�� IDAT}��w��۷κ�`������2^ՙ�wc_{9���1|�p4
6l������
N�:Œ%K�*88���_'G^JJ
�����-!�B�|Id�fҔ��դo߾L�4���d���<x0���
j7??_'J�����V�\\\8}�4���S�:������|||8z�(;v�`������2v�X����vk2i�$6l��u�طo�Z�R���ۤ�����e�)Ly]�v���?�Laa!���7�s�W}�ƽ�rj���P��9���1j�(6l�@LL111:�;88���/��M[[[/^̌3�4i�6mb���&G�
!�B��K"˄0��<խ6S�N��Օ�~�����z��x�w�9x� QQQ@U���@E~~>��������5f�5�����޽{���@�6mj�/C�`J���ӟ�Ę1c���)))�/���w_����SPP�̙3���quu�c��(�xK�.��ŋܼy���{�F�&���������^N-�w̛7�ٳgӯ_?ڵkG�V�pvv��Ϗ��u��9
<���p�.]�ҥKy��WM�O(�B!Z>�,�L���9}�4!!!��
		a����n���V\\������l޼��k�����o���;v�fJ�
GGG���߿?&LP�s�NΞ=˔)St�v��]�,88���(��$�MX
��)����_d���@�F5E�������ֺ�WS^�ɓ'�}�v���y���u�j�~���U����6���,


�~&��¦טI�[�jE@@�ֆ!�hS!�B4Y&�	j;-�)Ou�ˠA�?~<w���߯W����X�qZ�n���/��"�V�ҹ��;������qrr���'''&N�Hrr��VP???"##�۷/666������FHH����C�`J�u�С�����Í�z��/���nT�2CLy]:w�LRR���t�ؑ6m�Я_?�}�]F���k��Oߍ}���B!�B!�%YU֕�Y���ʊ��5���cs***b��Ѹ���i�&�_��(T�Ur7���f֬Y����l
��[�j			lܸQ��B___���

����T�C�?�W4��7!,M~ޅB��$�L3i�S݄y���q����@M�-,KN-B!�BX��,�L��T7a�[.���=z�{#rj�yh�n!�B�,�b�f2o�<�w��֭[9u��nݢk׮:���P���,�Ea���W�^E��������$�G��B@N-����tKwA�F��c�Y�B!�had�L3�ԩn��^�U�e�KwAԢ%�N	!�B!�Y,B!Z����[�B4*I�/�Bs��2!������RYYYY�B!�h��4L!�B!�B!�G"˄�����ӦMKwCQO�ׯ�t�B!�-�,�	�?7nd�ƍ��B�34
p�(r��	���c���trss���\pB!�-�,�	TVVZ�B!,��_'++��������cݺuTVV2a����8p�z*�B!�,�	��'DK���n�.#�-eYYY�oܸ��E�����???.\��뱵�m�n
!�B�& 	���*ב�;�y����h4�H񇤤$.]��/���M�8�K�.���d��	!�B��"�eB�OJJ
����RSS	�t7�	��,��� >>���L���hӦ
nnn�3___����PVVFBB۷o��_�K�.<�쳄��bcc�ӏ�}*--%--�!C����ֹ����h4���1i�$:v��8$�B!,B˄BqW���c͚5��۷os���9�����Pc�ݺu�iӦq��Q�nQQ���G�V5�o۶���2<==������dff2v��߻B!��{�6L!�B�222X�b���gϞ=̟?�u�֙\o�ڵ=z��z���T���[���8p `ӦM�n�<�qNN�����R��B!�-�D�	��8q�>}��Ք[�m۶��у��@�{�F��ȑ#�۷/}���ۛx@�Naa!����8q��Ǐ�m�6����6��JOO'779�A�x5�
�^ޔI�۷oϵk�HII��ɓxyy�����m߾���(\\\�ի�/��ח-[��m��v��	z��\Ϟ=u�!�B��C˄�˽���dee=a�����x�7�����k���ʕ+��䐓���?�Ltt�^�O?��o����`$..�u��QYYɄ	pwwg������3g�d�rss�����?fʔ)Ю];��={���ڟ��b�9ɔ2��B!�h9d�w����Z�W�)�2335j�}�YSt���[***t�+**���o�ڵk��>nܸ��E��������X�p!7nܰt��h4�v�U����ٺu+���0��7o�r�JF��_|ar����Zۻv�Z��[YY�k��)u�B!D�!�eB�@��Ըu�n���Ȝ9s8v�X�����AII	G��)��ϧ����{�I�QIII\�t�^xA-�8q"�.]"))ɂ=��doo���			�Y����`JJJ���5����3�7o�[�������s��\�zU�9�L�#�B!ZY,Œ._�Ldd$O>�$C�%((���L��leee�X����ѣY�r%�n�R�h�)u���~�CMר^�<.,,$<<�����z���h��V�bX�D�����G5����R��}�{�9<<<x��牍�5�q���|�M�z�)<==Y�p!eee�k��*��1d��������FCZZ����B�ߘ1c�h4lذ���2z��;mڴ1�ވ#������ܹs�+W�����h�6m�ZW�{�l��\�gΜ��RV=��B!�h�$g�fr��uBCC9w�Zv��q,X�W�֭[L�6��G��eEEE$&&RPP@\\��m?u����������|�w򇰰05z��͛|��TTT�SoȐ!�jՊ}�����ݻ+++��e׮]c�ԩ�<yR-�x�"���8p���DڷoT-jM�2���ϫu���k�_��w]S�v۶m������wOOO8@ff&cǎ5j��
LTT111����<7h� �년��{�n���	

ҩ׮];f͚�>vpp���???���ټy3Æ
#++�������O4즅B!�]G"˄0���Ν;�������߿���x��%�ڵk9z�(=����|����3p�@8��M���N��h42��#G������5/��R��G�ddd���Ô)Sصk�^={{{���ˉ'�r�
Pe��?����=k֬��ɓ����㕐�������$''�u?��3Ο?O�n�X�z�:�?����u�[�#�_�~z�QʪG�	�RY"GYu~~~DFFҷo_lll�����͍���,Ybr=;;;	���kkk������"99Y'*lΜ9���bmm�F��9���ۓ�������l���x�gqD�B!�%Hd���i�c��<u)""��~��pX�p!ӧOש�}�v���pqq�W�^,^�___�lق��o��lmm��?LXXX��͛7��ݻHbb"%%%�>��c=z�}��1z�h���Geee����׀X�`���;w�T��v��
���h�A�����3f�\ה�=q�P�(X]Ϟ=u�!���✏�O��W֧���=�g�f��ٵ�����[��C��������quu��:t���05V!�B��X&��(�ky����[w�85M�
�nW�l�����+�p���}�Y�D���~moo�w���G%))Ig�L)7D�R9`��re�.\���)[[�E��u��2����t��Q��R��Bܛ����ꫯHIIa޼y@U$������N!�B�2�b�����,@նU���R�q�$���Tg(�}]���Y�h���DGG���&�6Ծү�I�i'�6t�@۶m������|��i���bam-�)�U}�Z��f��*�d(?�RV�}��5�	����i,[[[/^̌3�4i�6mb���k��½B!��A˄0�nݺ��O?q��a�h�Ç��uvv�̙3l޼ggg���o߾L�4���d���<x�U?���\�~;;;��(�����0h� ���OFF���<��ɤ���O��СC:[5:�3.ݺu��ɓ|��w:����L�Ν;s��E�^�J�Νu�S6�^.���<���p�.]
����j�B!�����B����9::������9r����zu������?Ν;w�r�
~�!��iӦ�u��&e{a]�N����+������:�988�q�Fnܸ�ɓ'�N�ke�0))	��|e^^^@Un���|������W�K������oj�����r���{�y���2�Jroe�6�L;��"%�57��������L�8���B!��H"˄0���@���kN�>MHHH�uCBBؽ{7���z9oڵkǬY�����燳�3�7o��ڶ���������~�zƎ˟��g�j�*##�e˖�l�2�H��R�._���ؐ��`v���ٳgՓ6ݻw�)

bǎ�8q��_~Y-9r��B�)c;l�0���(((ЋQ�ִ�B!�B�|Y&�	j�����%>>��>Z�n���;o��&P�MQaggGbb"8;;cmm���=^^^$''�D3͙3WWW���k�/�mРA�?�;w����f���ߟN�:acc���'�-��PԻwo��������nǎIJJb���899amm���'N$99Yg����
�������
�<�z�5elG�I������ֻNvv6vvvjĠB!�B�{�Ue]ٰ�h����HII!  ��cs***b��Ѹ���i�&�__4̪U�HHH`�ƍ���U'u���Fhh��{(����J``�z�C������&���ϻB!A�l��L�NYY������;;;Μ9û��#�<b�
C����ꫯHIIa޼y�����쬷�S��*00��7Z�B!�B4�X&���5�
6��4��A'ז�{��ڲx�bf̘��I�شi˗/��$O!��q��Y�B4�q��ѽ{wKwC!�-�,�	a&��ͣ{��lݺ�S�Nq��-�v��СC	

�����]5<x0���,]��W_}U/��Uzz��� �B!D�"�eB�I�V��<)͔�v������t�hT��L!��&�eB!D���+�	�E?~��� �B�H˄B�nܸq��L!�B#��t�B!�B!��[Hd��H``���!���N�8A�>}>���Nnn.��O!�B��2!�����x������"//O﹃Ǻu먬�d„	���3p�@�T��%�Pڮ���X���<��#��Ba�
S!�-FVV���7n�h�"���qvv���???.\ȍ7���B��|}}4h���!�BX�D�	���%DKҒ";��F�0��$%%q��%^x��l�ĉ|���$%%n��	s����htYK��_Z�B!�E�b�����B@@���!�����T�;��TTTOff&EEE�i�777ƌ����Nݲ�2ؾ};���+]�t��g�%44�?����(--%--�!C����ֹ����h4���1i�$:v��w-�B!�v�
S!�ǧ�~�ٳg�}�6eee9r���~����ޭ[��6m�W��…ܾ}���"�9s&���m�6�������{��ӓ��2233�~�iU�*�����ʊ۷o�����GGG"##�r�
/��:t������`JJJ�ƍL�<�:���ȤI�(**��?׮]c�����}�Eu��JQ���ֵ*�1�D�� �JԈ�K԰b�d7j��(��2�TT�h쉱��E F�1��H�(" ��:��y�y�̹�����r�{�iҤ	&&&���@zzz��Y��y뭷�V�u��a„	<~�X�>j�CNr{�ܹ�h��W�N׮]Y�n]��B!�x���2!�BT���V�\�������ݻ�E��u�Ve��M�8{�,m۶e���4mڔ+W��`�bccٵk�
"..N�r���HZ�j���-22������1y�d������?hҤ	�W���/�3sq�ƍ�s����~�6m�ĉ�:u�Z�j�3==�^�zi}�=p�����.i�%�W�^ܹsG9�ڵky���y�����Ky���Att4���<|���ӧ�{�B񲑙eB�'''�%@%96����777,X��7�8Z]���L�2�իWs��E�}.^���ի�2e
���eCi�an���L�>��ӧ�N�B�#����˃��9��><<�{�����A\\�v�R�:t�`oo���M�4a����ݻ��qΟ?�����kvvvZ}D�˙3gx��	�~�)'N��Ȉs�Α��Ƽy�ؽ{���{��a߾}<}����H���|�2K�,�w�%K�G�.]8}�4������Ot�ޝ��JUfq�d�-Z��/����F@@����j�Zy�I��߿��O������ի����BQ�H�L�TFF7n� ""��Ç���P��ݹs���HT*���z��[��JEdd�����ӧ	d�̙̘1��+W_�a	!�:u*&&&DGG�l�2�
�J��Y:v��U��ܴy��f�%�5�޽��&��M�GT>�V��]�v���2u�T gwԯ���-Z`ff�̙3�۶z�j�~�m���qqqQ�F����h�P�y�f:t�@�*Uhݺ�2CmӦMegI�Z�r%͛7��̌iӦ��XXX�t�RIIIa„	��j~���B!^6�,����ŕz9�9��∌�dӦM8;;����G}ē'O�(�����S(;;����ׯ_�1�ԓ'O����������ݙ3g�s�wB�Lr����+���зo_����ܹsi߾=���^��~���c��_a;�>z��55��.E��&�(V^;vT�Ν0mӦ��u�j��=�o߾Zϻw�������1.\�I�&J�/�5k@bbb��Y��ڶm�|meePh�ŋcff�������_�ʂHKK+�8!��e$�2!��y,K�011�e˖,[�{{{�����Cʚ��3>��uBB���t�ҥ�c(���RRR>|�����IJJ�N
!ċ���777���ٸq�R�|�ҥJkkk g�Y�d^\\����Q�vm<x��M�GT>fffzۍ���t|�*�%~5I���/,��{��q�d,��P�D���ù~�:*��nݺ)K8�򗿰v��"�C!�xYH�L�2�_ݟ�/2q�D�w�N�>}X�pa�f9U�Z___�;��ZZZ+W���͍�]�2`�V�^MFF��t�S�N����=����ԩ׮]S�4�0MAl���(:w�\���,Y���������;��ҥK���s��~�)}���Ņ9s���®1��[�l�S�NԫWOioРNNNlٲ���T�c!*��qrrb����Ѽys��큜�}�z�   �s�����3�ܹ×_~����ǏW�j>�k�nBN}&�)z���M�G��N�<��\�o��
#44��._�������*����X�j����ĉ�����Gq��=)�/��ґd����Ϗ��X���y��;v�К1Q:t�\j95�Əφ
�q����ܼy�J�ԩS��Φq��899q��U��g			\�~�Ν;ӨQ#��S�N*�1�'N```�7Y���#ƌ��͛�u�YYY$''�رc�a����=�]�v��222ؿ�R`8��\�ƁHKK���E�<...���q���n��95j�-�G�t��U�]�������Ύ��|||�ҥ���|��ט��*5�ewBwww@�n�HJJ҉A��믗���`ܸq��Đ�����Ǖ䬧�g�Ǽ��xyyq��)��ř3gb``@�޽�,��K�t��_���M�b�GcM IDAT``��5kHMM�}���o�О�&�BT�,�����Add$�G��~(�94�D�߿��mڴ��g�Ҷm[��ˆ��!<<�:��$7x�` g7��4��yxxh�[ZZҲeKΟ?��}�6.\�Y�fJ,�mܸ�K�.ѰaCT*'O�$88.^����믹~�:�5bÆ
�<y��� �D`q���	��/������z5��rwwg�ܹ�l�ccc���iڴ)���|��'J?T*^^^X[[cdd���%={�d���Z��f̘AÆ
122Rf����bnn����ub8~�8���[���T�~}���166�G�\�z'''&O���1����lْ��(�Z�*���,^�ss�w�,���nݺ@ΌK�̵Y�f9;tZZZbbb���o��r�ӧO�]�6Ԯ]��O���
����B��C�eB ��k��X��٬Y�hܸ1&&&x{{����b����3@�nʡC�X�`���ѤI�ϟ���ٳ'VVV:t���L���8t���գG�:�u���Z��.���B�V�[�L���]�vT�Z����3{�l>��=r��gϦM�6T�Z����뜷��p��y '9���?��>B�����6m"**���(�n���ɓuv����d����޽���>��ŋ�"�}���o�!&&�9Eѽ�������J��ׯ�����������7�п�V�JÆ
�9s&����4�cjԨATTS�N��֖*U�`eeŠA�����*�_Z�1֗_~I�&M�R���<���#88LMM155�m۶����a�����?�Κw��e�Νes���e�W!��Q��.B��hڴ�򵥥%Px1޼n߾
�����������/9	�������ݻ7QQQ<x�q���-ܹsgBBB���b����+�|��,����ƍJ��@�v��ͭ��ny��v�6M!īgԨQ�ٳ���Pe�Lhh(�����Tpt�,��j�b���Z�ڵk���:v^�j�bٲe,[��������4����,�9���Y���ѣ�Y�Q�T@��܆
P�T6��c*���B��C�eB �$�,��,U�]���;N�u��)Z�l���^�܅��}�]6l���~K�޽ٻw/���4H��۷��Ą��h233���Qf�����&����mL_��r_����N�մ���*+�����O333�ϟϔ)S1b�v�bŊ��ew��)<ȢE�hӦ
���xyy��k���XW�^�￧nݺ�Z��={���w�q��5���/��-^!�Ϗ,�����IXX���R����ݻw+��r?bcc��6668;;IRRǎ�7���527cccHMM%""���Tڵk��J����5�5��>5	@
}���s��k��:�Ѵi�!^M���L�8�ŋ�x�b&M�T�?�S�����8q��={�b�
�6mJ׮]Y�b���e6VHH�����(˟���			��k``���G��v���F��l߾�޽{S�fM������eʔ)<z��S�F
�5k�����_000К�_�x�]�ƨQ��[�.��ƴk׎�����=z���?M�4���;;;HOO�ꗝ��ܹsiѢ&&&T�^��]��nݺ�BQj!^A�:444��qttT;::���k�ז���NLLTO�8Q���vssSgdd(��\�R���~��?���:++K}��m����Վ��j???��9rD���Q]`7nT;::�]]]Վ������|�jbqssS�9sF����>s�z��jGGG��e˔����jGGGu����?���:33S����vww��E���ӧ��?����=���Վ���?�P�5Qy����s���������߄x��;P)~�xyy�����癙��}���G�����T����V�T��x���l����P�9sF�V�էO�V��^{M�����_s�j���̙����1b��Z�V���͛��Z�x�PO�2���&''������R�~O�<Q;99���o��={��9sf�׾dɒb�BQ����2!^ �7
�֭������`ii��������;;;���K�.�����_cjjʴiӴ���+3�5j�o�1
M1M�����CN��ƍs��uF����3�G��ƍ4n�X�����-Z� 99�q�����̨Q�������u�蟡�i{����f!�BC�VZ�eT�J�~�m6l�@rr2�7o�Z�jL�0����3x�`v���'O�u�Çs��e:t��%�С:t��~�w'�֭[����3�*o����X�z5iii���+�ܽ{7ӦM��‚E�i�K�;�S�x���n޼�������������|��g��d�����ҥ�O�&33��~���ݻ��w�)�����ؿ?O�>%55�իW�r��b�BQ8I�	Q��σfy����ټy�N2����J������aiiIϞ=Y�~=-Z��ꟻF���{����7o����S �U�V���^�:!!!:�z��addD�z����d�������


��ÃZ�jall�[o�E@@��y�s�������s��q��?~�z��Y!�(�gϞq��=�޽˥K��t�����g�>��s-Z���?���L�0???���u��5v�X�6m�<����,4n333�BDD�n���>#""��͙2e
iiiE��䎯��V��f���z��1c��2y�SSS��ΦS�N���2s�L&O�h�[�0agΜa߾}ܿ���H,--y�7J�={���S��ͱ�� ((�Zͅ��/<<�͛7ӡC�T�B�֭Y�~=�6mR�ZXX�t�RIIIa„	��j~��b�BQ8ue����000 44///����i�ڵ�s�N6l���9h� ���;vlG(�SXX����L���_�M�JJ�b�
N�8Azz��,���������~;��G�IDD�?�����<xp�Ǐ=��G�P�F


�^�:U�T��ܜ�>��|�߱c�֮Ж��Z;\���bkk���7����>�?f׮]l޼�`ddD�N�7n�����������֩�����7oޤF�����<y�D+)�_�͛70`?�����k~�ߺu��^{
'''�;��͛���bȐ!J��$񚘘���Azzz����������geeŝ;wزe�G�V�����ԩS177W�)j?!�����0��ƨQ�سg���̚5�p`mm���OG'D�ٶm��2n!ğ�W������A����KϞ=�^�:ԬY�3񕷘|^��ٕDA���dffr�6o�̮]�x��)o��&�֭cРAT�^�X�+0�9ɯ��0&L��՞��Ay�����f͚1p�@ڶmK�ΝiӦ�V����������ˉ����o���`�$ޢ�]�~�v�-��EÇ��Օ�;wLdd$,^��0~��b�BQT,M�
��������ݺuS߸qC}��
u�n������ϡ�<�Q���y�4��={�>r����Omee�600Pw��]�j�*uJJJ��pttT�}���}}߾}j@��䤴i޿��k���PZ�&%%)�so�t��u�������[mee�644T������Y�fj@[��(z�-Z���˗�Oll����>Rj33�R�B�C
�!*GGG&N���ŋY�x1�&M������¨�W�\�Yb\����-={�$::._����Ǚ8q"u��-����iժ���z����ҢE���HHH(�8�[���'==�S�N)KL�ݻ�|mccØ1c��ݻt�ڕ:u�*�~��0u�T�^�JZZ�'O����͛+��߻�����N�"++���dfΜ����{�V�6m�֬YCjj*�۷�}��@N-��BQ8Y�)��t����Ó�3t�ЊA�r��н{��ㅥ�U��닧�'�[�.��k
���.A400�>`ҤI�T*eg��8p �6mb�ȑ�9R�S�Ni՘�5k��d�%�%����;���DEEakk��޼y��E�����Ν;������Q����9K�,Ѻ����3q�D&N���7��E�'��p2�L!��Ķm�ƶm�*:!�Ŷm۸z�jE��B���/Q����(�DYFF���XYY�M`�6j�(j֬Ihh(�k�ʕ6�jժajjJ�Νٺu+���W^�-�N�(u�
4��ɓ6��5kbll���#۶mӪ�Z�~5j� **��S�bkkK�*U���bРADGGӱcG�������888`jj���)m۶��ߟ
6��B����2!�����0EeU�b꯲���%cccn߾]��ժU�Z*�V���˯�f͚lٲE�k�gliDFFТEe���`gg�o%�W�V-�-[Ʋe�
�;z�hF�]f��BL�eB!�B�J!55�Ǐ�駟0cƌ
�H!��H�eB����7;w��0�%$K
�B�^~١C|}}+.!�/-I�	2��CB�����
'::ggg�A���_���ܹC�^��ꫯ�RE>�!�(>��Cr> 	!�xu�>}���@�n݊Z�fذa���ӡC��MQ׮]���BT�,),De�_qh!����>��c<<<�b����̙3�m۶affV�
!�B��I�eB�ϠA�d�8!^baaaRw���������H����RRR>|�������͛			a�ĉ�B!�x�$Y&�2Dj	���̔dY9�$Ң��Y�t)�~�-U�Ta�С�?���s��1�V�J�=�5kժUSΑ��Fpp0��?��N�:��oc�ر�Č3���g�ڵܾ}�+Vp��	�<yBӦM9r$�g��}E/55�-[�ЩS'�ի��7h�'''�l�ˆ#�^�z9�Y!�B�"�d�B!��/� ""By�n�:6lȶm�8{�,����ٳCCC�͛@FF�ǏW�ܼy�JERR���j��t�RRSS���Ǐ;v,������ܹsJ�,��w����pqq�9������<x����~	!�B���$˄x��?�-Zh�if^�ebb���-�����߿\�ruu�e˖�hт�}�ҬY3�>/^���?�s��q�2������xBMRR�7o��֖�7�v�Z-Z���=;v�A�lذ��� �;��i�&Ξ=K۶m�={6M�6�ʕ+,X����Xv��ŠA���jҤ	*�J������
���?iժ���̙3����c�3^dd$�Z�ҹ^M[dd�$˄B!^!��wBT�?�oo�"���)��������ѣ�ܹs���HT*���z��[��JEdd$w��)�xJJ��̙3�1c+W�$>>�����999i=
k�y��+5�>}��ٳ�����Ą#F���C��`����122�I�&̟?��{�����㣵\�~   �v��Q�jU�3g�α����������N��B!�x5��2!^`�%��Ψ�{�.˗/g�޽|��׼���666��Đ�����*;;����ׯϭ[��=����(�ܳ\��͕��6m�|�����ի����=�ŋu�4�*�+W�бcG�v�R�w��]�5�4m�>B!��� 3˄(}3-^$VVV̘1����������ÇILL�jOHH 55�.]�<�8J"��RRR		��Ȅ(qqqZ���!g��>y��V�|�ѣG:m�g�t.�R��9^�5h��!�B!*/�Y&D���&((��r��M�V�JӦM8p�N-���ҖwY�6WVV���.�s�m�<߲eK�.%!!�|�M�N��3k�K�.DDDI�����(:w�̮]�t�LMM%((�Çs���ԩC�޽7nZ}�ܹêU�8z�(O�<�w��z�z��'ċ��ښ+W��{�negq5jԈ_��3g�йsg��̙3��v��$''��j׮���f)i�v!�BQ���2!�H`` �֭��իdff���Fbb"���?	

U�ivi۰a7n� 33S٥m�ԩdgg�h|�Z͝;wX�x1mڴ)����Kzz:<`ǎ,]�T�_�N�044T�c'N����@�C�ƣG�3f�7o�֭[dee���LXXcǎ%--M雚���ѣٵk< ##�����s�����v�KKK��źgB�z����;w�Ϟ=�Ν;|��8991~��B���[o�p�B������"11���j<��R�2��4my7YB!���$˄(#�\���'Or��1���غu��/�.maaa���N��]��ˢ��]��S�N���r��A���x���Ku=���ʌ�ѣG����Ғ�-[r��y����۷�p�͚5���J瘍7r��%6l�J���ɓccc�ŋY�~��믿��4jԈ
6p��I����p��y�zo��;�	!J���;;;���K�.�����_cjjʴi�
=���7vvv\�v
___���y��v�Z���֭���g^���_���.�B!^B�,���-NS�:44���p�ݻ���qqqZI���
WTFFFt�ؑU�V���ڬY�hܸ1&&&ʎ�>�۷K�.��jevYTTj�:�ze�v�k߾�������J�#G�0{�lڴi�����]缲�%�_R�,XXX�R�������###,--�ٳ'�ׯ/��-333���pss�f͚T�R{{{>��S@��Yq�suu��ܜ�Ǐ�y��q,,,�YmB!��� 5˄(#S�N�O>!::���h֬Y��ѣ������T�W�]��`���C&L���+W���V&������� �%��;w&$$���(�U�L��ׯh�8�?w��q����Ю];�}s��(�%ъ�nii���ә>}z�Ƃ�ML�Ν��v��M�ԩS��U�������\�~��
9����������S!�BT~2�L�g���}��o�>�ΝK���IOOg�����׏;v(ǖdW��XZZ�������…�.��7~FFF���V��|]�Np�۷��Ą��h233���Qf���d�&޼��J�\��'D�գG���ؾ};>$;;��~��O>�П@/�Q�FѠA������X[[���S�؅B!��Ef�	Q�,--qss��͍�g��߳a��.]�����N��-[2b�֯_ςpttTf�AN�G�V��ce����b+���1�<y���RSSqttԚQ����
�/_&>>^k�f||<��}iԨ�.]�ԩSZ�����������Y�h�-�z�V�Z�7���633c���L�2�#F�k�.V�X���1!�BQy��2!����Yiii4o�{{{@{�Vqvi��l�,/,̘1chذ!���#((H�Z�j�s�N�<y¥K�t>p��f�eHH@���z��	��KHH ++���eW��Ŵ�~�m��S����⧟~��>�9��'D�5k�,�O�N�V�055���kkk���	

U�O����#'Nd���,^��I�&{v�B!��df�edԨQ,X�@﬇��|}}9r䈲K[nywi�U�w�����kkkv��]`fff̛7???�m���y�׀�UDD˗/g���Z3�JK��}���s}F���Ç�z���ӦF�ƍ��|||����9����WWW�DWq�m�n�8z�(III:�e<!^<���xyy���Unc����B!��Af�	Q�����ܹsiٲ%���ӴiS|}}��:P�]�f̘AÆ
122*��Xn:�gϞ�d��}ڴixxxP�F
���qqq��?.��ռys�������Z�ʷo���			a�СԫW###�ի���'�ׯ�Z>jllLPPԪUccc�z�-t�+;�	!�B!�(-ua����

Uf�}.^
k׮%88��;wj�7h� ���;vlG(�#,,oooe����_�M�J�]!�� Nf�	!^Y��B!�B���f��%;�W���7����B!�/���� IDATI�	!^i�w�d<Q鄇�WtB���6�B!�(	I�	!^y��B!�B
I�	!���СC+:!ʕ�B!DY�d�BQ�I2ATV�B!*!�
S!�B!�B����eB�϶mۨZ�jE�!�(�m۶UtB!�B�J@�eB��Ν;ٹsgE�!�/������Kff&^^^L�<9��p��yZ�h�����T�c���<���9FC_��Ntt4���R�N!��H�L@�VWtBQi̙3�S�N)�o߾]`{Y���9z�h�X�KY�x��iٺu+j��aÆaooO��0R!�B�W�$˄@v��2	��^y			�Y�GGG���
l/kG�-�L���\��X�'O������ၵ�5���̙3�m۶affV��!�B�ʤ����:�zGB����t�����L�0�$�������.�/$$������yzz���BHHHF&�B��eB�Ohh(^^^��������0*���T���8|�0w�ܡN�:��ݛq��aaa��˝p�ԩ�3�*����l���8x� 7oޤjժ4mڔ�2h� �����СC���ԩS����o�;VI���4��8p��~�)���S���Ϝ9sx��7Y�h��E���b,�HMMe˖-t�ԉz��)�
4��ɉ-[�0b��W�^��B!��,B!D!=zĘ1c�t�Җ��LXX����T*���Kt�@6nܨ<���$11���D?~�$@322?~<gϞU�޼y�JERR����݄yN�>�_|���
4 99�E�Q�^=fϞ]��)ͱ --
�s�����<xpI/_!��&�0�BQ��7r��%6l�J���ɓccc�ŋY�~��7�,���8�y~��\���'Or��1���غu�r̦M�8{�,m۶%,,�������С����ڵ��qr�,9�Ш^�:�|�	�?f�ܹdgg3o�<?~��󱴴�{��r=������j�Jg|M���B!�(>�Y&���h����~�۷o���ҠA�~W�^���]y�g��ׯ����8��u�o߾2��(˜J��$��fllL�:upvv����
�-?��ߊNtt4��β��+"��dy����������ڵ�}��̞=�ɓ's��a&N�X�8���y�����\�t��={��၇��V�C��`���I�&̟?�A��w�^�e��թS'���

e̘1$&&���I�ΝK}=�9�����������N��B!�(>�Y&���?�Z�Ӻuk�eH'N�P��U��O?i��U�����7���`����n|/���oE8}�4���̜9�3f�r�J���+4&��~�:�� ˭cǎܸq���:u*&&&DGG�l�2�
�J�"==]��իWpssӚ	�I�]�x��cjfs�{�5i�$�5kFbb"M�4����zJs�ݻw��$Ӵi�!�B��d�/��G�j=oӦ
Pp�L�|�<�Ms��N��!��Nj��#22�M�6���LZZ}�O�<���r��>oO�<��?���kkklllpwwgΜ9Z�HTN�%�
K喝�]�8���˾}��;w.�۷'==�իWӯ_?v�ء�S����ѣG���,�zJs�����m�6M!�BQ|�,��ִy��Y�����ӧ177����ܜ��X222��UT��"���вeK�-[���=���w��^!!!���0|�p���ӓ��BBB*02��,{�;�P���ںT練���͍��`6n�ȨQ�x��!K�.U�h�ؽ{��a�����!?�V���ŋ�nݚK�.X&�S�ck׮
��t�״i�!�B��d�e$;;��k����N׮]�ѣ�;w��雖��ʕ+qss�k׮0�իWk%�r'�4I:M����:_ll,���t��sss���IOOך���͹s��dYjj*K�,���8;;��;�t�R�Y�N�:E�޽?~|��b�����ݛ�˗k��\/^d�ĉt�ޝ>}��p�B�M�o�f�ܹ��ݛ�]����������Z�*���;vL'��\gQ�7�[�n1o�<�|�M���>|8{���'�J��x{{��o0h� �?W�^��ɉ�*clٲ�N�:Q�^=�_�
prrb˖-����ފʯgϞ@N�������HHH`�…����%>���qrrb����Ѽys��큜�[�^�z9u�Ν;dzgϸs�_~�%NNNZ?��YU���%������0:t�J����͛7�����ף/Ƣ��sx����5m]Q!��e&��(#���lܸQy���Ibb"���<~�XY�������f�ݼy�JERR���z��ԨQ��
r��u�]�F�F��?�u��
��ݻs��aN�8����/_&--
jԨ�,[3f�.]R�HNN&,,���XT*���Z1,]����T�Kn˖-#44�6m�0nܸ��2"==�;v���M@@�?f�ر�����1�Νc����7?:t�…���{��y��޽˨Q��}����ŋ̝;�gϞ1`��|�-�{ҽ{w�u�J��ᆪo߾JM��G�8p���4�#7bcc9x� �.�^��oԨQ>|��W�2z�h��7n��V�s/X��E��h�"����}}}9r�			���h�355eڴi��Z�jq��]��ݱ��֙MZX�=..���T�ϟ���9�~�)U�Ta���xzz2o�<�nݪ�fXQ�G_�E=�[�n=z���$�v���$�t	L!�B�W��,��DDD�r�JN�<ɱc��`�֭J�M�6q��YڶmKXX111���ӡCbccٵk��B��nY�dY�n�000Ъ[�o	�ƍ�t�
6D�Rq��I��������ŋ�_�^�:�4iBdd$�~���kK�.%44�&M��r�J��N^���DDD�|���������_PPP����XYYp���B��΢�o6l��۴nݚ���;ƻ��J��K��x{{cnn��O�,�|��|ϴj�J�|�6}�D�ʫ�eիW'$$��C�R�^=����W�����_�KK������ܹsiٲ%���ӴiS|}}��O�~�T*���������KKKz�����fR͘1��
bdd�w�gQ,Z��[�n1k�,e���
�f�"%%E'�U���cQ�uuu��ܜ�Ǐ���q,,,x뭷Jt�B!�Bf�	Q��f�m�����ܜG�ʥK��ٳ'xxxh�=t����I��I�&̟?�A��w�^ew7}Z�j��9{�,������/���`ooOݺu��Z5-[�����~��^ӛ,�$�h׮�����ٳ�<y2�f�ĉZ��(;n�t�R��°��dժUE��<k�,7n�lL�R�x��a��9880g�>��Bϟ׳g��R��_}y��8�&I9s�L��s)�{R�F
<<<ظq#QQQ������ʙ3g�V��2��@N�2/;;;�>B@�֬Y��5kV�}�K�����憛�[�絴�d���L�>��~}��՚YY��|��g|��g:�������(ד_�E9�Z�jxyy���iذ!��ki||<~~~���B!�B�Of�	QF�N����	���,[��aÆ�R�HOO�ꧩO���ԜrrrR-/^,p��3�4���ݻk��<׼��O?i9� '�[ǎ�q���DJ^aaa@N-�{��x
M�6U��$�r������ģ�w�QQi�E֪U�оy��8�澕�fPY�'>>>���(E����x��]�vU�w��л�LӦ�#�x�5�
�����bmm��LU!�B�$˄(@���
j�۷/���c�ܹ�oߞ��tV�^M�~�رc�r�Z�.p̼E��jٲ%����;w���le�\Aɲ��,.\������ewy�-���Ye^^^����V�Y�vm�c��b��g�-ȩS���{X���Y������8������$%%)K�r�0�Ĩ�>���<�CQ6��̘?>�v���ܼ͛y�]�v1�|LMM+:<!�B���,��YZZ*KhΞ=��φ
X�t�R(��ښ+W��{�n����=���9vvv\�t���x����m۶Z�Z�n��������Ǔ��������._�L||<]�tQ����X�j���ԩS�+Vp��1Ξ=���$5jį��ʙ3g�ܹ��~�̙b�+33S����ٯ8��կ_�k׮q���b߃�zOF�����ٺu+QQQ*5� g�nrr2<�v��Z�j6]��.�x�8::2q�D/^��I�J<�V!�B�If�	QF���۷o'--��͛coohϠ�ի�S��ܹs<{��;w���_�����㕾��=�%��Lpp0��ٸ����200��ŅgϞ)E��&n4I����@VV			,\�(�nj���4k��5k��X}4�.\HRRYYY$&&*��ӧOIJJb�ԩ\�p��
���Z�X��i�R�/&99���t�������B����-���nݺ8�������C��׿R�fM�u�Q�R��4m%YF*�x����X�d	K�,��ӳ��B!��df�edԨQ,X��E��쒖�/����9r�����2���L�6My^�V-�޽���;����޽�Iz}�����h�ʭ{��|�����*�����\�zUٍR�q��:m�122b��ٌ3��'Or����[��������|�2���E>.��,--���ϵ��EU�����СC$$$��;�h�}��������e���9�m۶�I�nݺq��Q���tf�$%%�=F!�"?��s!DE2dH��!�2!�������ݩR�
���\�t	�YF���3j�(����*��u����?�����R8~�xef��3X�j���ddd(�����7&ggg�T�BVV��,�^�:!!!|��W9r�;w�P�vm�����_�-�j׮�.�Y�����133#((���@�;ƣG�hҤ	>>>̝;7�i�cmmM׮]1b���/Q,�y�j׮MHH����<y���t�5k���/}��Q��{��=�V���u�=�^suue���?~��#Gj�v��q,,,��}B!��:thE� �@���@]g�%c``@hh(^^^z���͛70`666�ڵ���ya?~�iӦakk��Ʉ�ڵk	f�Ν4l��ٍsРA���1v���r����������B~��W�|��␟?!DE+�����2!��G�������O߾}����ʕ+|���t�ر�#|1���������9��5j{��!44�Y�f�����RS�r�f�Ν�B!�/I�	!^X���c���z�ժU�q��UPd/��K.���0`��~fff̟?�)S�(	�]�v�b�
LMM�K����E�!^TC��q���B�a&�x^���,B��f͚E�ƍٷo���ԯ_��]�2v�X�իW�!���իǃprr"  ##�|�:::2q�D/^��I�t
���[xxxE� ��$5̄�Ky�]�d��ehh����Ծ(��{����������C�\I�$!^\��)�(O�e�A�eB!D%7h� ��"*%��"�B�� �2!���2d��.B!���+:!�B!�B�����\�!���r/
�Y&�x{{��zg!�x���������X233���b���������ӢE���:u�o�����x����j5���t��ooolll�m���p���pvv�e�B!�$�����XZZҢE<<<�<y�K�����5;v�cǎ:������̙3���s��iN�>�͛7K=����of͚Ž{�J}.�}222�z�����ѧO&M��k��V&cB�_��d���'�eiΜ9�:uJy~�����ڇ~�ѣG����j�����>c���:�\�z��W���7߰p�B^��2�����u�V�j5Æ
��ޞ:�h,!�";;����CLL۶m�~��ܼ�C+���d���Ǿ}���矉��ȷ�y��o�t�q�ƕ�����3�߿O||<���Z�����������u�Jd�B!�TBBk֬!66�ٳg�^֎=��}����޽ƌÖ-[������ѣG���	(q"/���<y��������������Μ9sx��I��B��Q��Z������پ};��_���e��f�5k֌C��������O���w�akk��#+}�ӭ[����0`���9�={�Tt�"2�Ld7-!*�Z]�!������Έ*���,��<���/�رccc���+ڶm�����|��G|����ر??�2?$$������yzz�y�fBBB�8qb��%���Q�jU�ׯ���]�6�z�b�ƍ���Њ�_�~�X��cǎ��o�~��?~�ȑ#Y�fMDX:U�V�^�z��Ӈ>}���G��_���ǯ�����IE�(�eB�Ohh��_�!y�<���Њ�5R�����d����3��K�.�ѣGZ�4I7�N�:)��k���f�ڵ���ӵkWz��{��Ν;ubHKKc�ʕ���ѵkW��ի��
�{'''�;P��xzz�$�r���_�~�jժ��NMMe˖-t�ԉz��)}4h���[�l!555ߘ�B<W�\aܸq4n�������ٳz���+..�!C�P�n]���iڴ)���:��U�.]���JOOgٲe��уڵkS�J�ԩC���9r���]�p����ӬY3LLL�Y�&���|��'ܿ_�1Žo����w���]�/?E?�{��}*�=+�������پ}��k�����2��eB!�(УG�3f�.]Rڒ��	#66�JU��(���lܸQy���Ibb"�����ޝ��x��H!b��&iג�n��ډ��Ј"֪�[��*��-���� Q����DhBS""��ZJREId���7ϝ��d�l��z�E�s���䙙3�RRRԍW222�8q�ޛ݄�������e�ʕXX��P�b�W�^y��~��|��GziE�{߾}���Ү];�c�ڵ�ĉ�߿����6!��#<<��}������i_�v����������Z�
6��o�����]�|�O?�����N�j�
UǩS�hܸ�^zrr2���zqC�ܹÞ={ػw/������W=��/�Э[7�/s2228y�$'O�$  ���H�}�Y�xQ���Օ�U��{�n>��s��w�J�*t���d���q3g�
��‚ɓ'3v�XBCC�;�]oI��<��eB!���ƍ�|�2��������������ս�3**J��T�6��+����ȑ#̞=���`����@���h֬�7o��㄄�ТEN�8Ahhh��h�e�W�^��_Ժ�;`�ZM7M�G!Dٺ{�.$''����ŋIKK#""��cǒ��������-c��uc�}��7���w&L�@vv6'N��'##�#G�аaCN�:ŧ�~Z�����p��m�mۦ���;���Y�x1'O�䥗^��ѣ������Ndd$m۶EQ.\�w�����Ɍ7��/���Ajj*��iӦ\�r�?����U�re�v��ŋ�x�ޱ�~��˗/ӹsg�_��~�c�����;f�աC�����8��R�x
JPP����ʹs�LS����=z(�[�V�w�xyy)���%R�F�Q4M��]����///���K	.���HPP��������EA�oڿ�~EQ<<<�F�?~\����E��(4Z��:u���[�h4ʔ)S���@�?�0گ!C�(�F�q�^�����F��7.�zZ�n�h4%##��cQ\uk�x��m��o߾�h4�O�>F�-���4*/�>>>
�x{{=����q����bŊ
����{z�f͚���
��_@�W��^:���2{�l�2���@���_
�]�xQ��U��W�RE��������XP����4s�M�vEQ�U�V)�����Y�d�(_~���9�Y�.s�,��III1(���5��'E	���EV�	�x��w�巺>|��ό38r�w��%++�����#�q�s IDATG�0}�t>���;����ͩS�X�r%�3g�dŊDGG�u��(�nܸ@����_y�n޼iv�ӧO�r��DFF��3x�`���IOO��w��5����x`...0����<���
�~�z��XԺ�޽@���
�iӴy�B�-ml��S�=>v�X���o�����3t�P����ի�-�;��O?�����EQ�����vEQ���_9{��^��+WP��-[�����`g�^xx#,((H��^BQ��ϸio��������=�[(��~]�YaU�Rx�y���-�~�W�L��DXX���r�lll;v,]�v��g���DFF�f�~��G*U�dg�(uǎx�)--�y����ၝ����̝;��[�āB�-�߸9�a����={��M�6>|��;wr��iV�ZE`` S�LQ�x):��_0d�F�͛7�駟?~��1Sc�UԺ�Av��5Ӧ�,���i�Sj�o���VA]�Ǐ�ʕ+4lؐo��KKK���/Yr	U�_�rrrHJJ"..�����͛7Ӯ];�?n��E;{�,'N�����Ϲ˝3go��DDD�&кu�F�~��۷�ޮ��1nNNN���K������L��չ�>ǎ�Q�F4l����Q�)��JII��ֶT�-�~�W2Y&�c,::�={�`kk����^��ڵkӧOڴiÐ!Cسg����e���~�znݺ��b:t(�~�-�ׯ7�͜�x���s�����՝��MV~oL�ckk���nnn���q�6l؀���:Yfgg�իWٵk�Y�����k�.6n�H���y饗��3����uשS���D�߿O�:u�ݿ_�#�����7'�7�|CHHիWg�ΝԪU� ��K���,,,�Y�&�ڵ�]�v899�h�"fϞ���tpp0s���۬'/�G��F�|��'jL��ׯ@@@
4`���ԯ_(��i��Ӈ%K���?����?�@VVV�����~]���Үtpp(�zK��܆)�rrrX�f
���mۖN�:��[o� i����b�
���h۶-���cժUz�M�b����s�NF�i2(u�ڵ>|8�}��A9>��?�C�t�ڕ���s���|���Vrr2˖-��_�M�6���___�U�s���<y2:t�[�n,Z�Ho�oA�199�-[�ЪU+�V*��{�l٢�S��x������CLLYYY��Ĩ��t������۶m#55�F����@�J��|]�t��ۛs�Α��͝;w���/qqqa�ĉj^�*-����׿��� ==�q�Ʊ|�rΟ?OFF����lݺ�#F�Qu������sӦi�!�([�(�ݻg4h��GwK��~��iӦQ�Biڴi�u�2���R�6o�̐!C�|�2�7f޼y����s�N.\�`��7�x�_���W����Ϙ1c���K�.1}�t�>�3n���b��*���7YV\�k�;f�q��a^}����4�Q^��2!̰r�J6nܨ����ə3g8s�)))j����&N��.�G;�����ʕ+�ޖ�u��i:u�g{:t������u}���ڵ���t���Ctt4���&�����~�m�o$�[1�8q��i&L����HOOg���������
|���Gjj*�ڵ3hW�v�8q����WW�!�רQ�8x� ׮]c̘1z�
�
[����/f���z�t�k�=�Ç�~A�U�J�����kժ�ݻwqww���N����{T�X���`6nܨw���/�;rG��۷',,���X��!���@�&�B��
r��I~��gz��]�����2d���|��G�����۠A�������}����l�q����Y��	&���ݝ2''��gGGG�z�-�z�-�Q�~����=`���֡Clmmٻw/���o�>�U�F�Ν�<����*��';;�u��Я_�����Q��ha�;v�b�
"""8r��*88X�H\\͚5c���?~���Z�h��'

���DEE�����_@��8=���ܺu���ѣGY�|9���coo�͛7	̳��6n���˗qpp��ߟ��������'>>����s���رcǎS?L�~�U�q<v�M�41�C���#�0O^�իWg������ԭ[KKK�֭�СC	(��{n���̟?�ƍcee���
4`���z[�������'vvvXZZbkk���+z+�fΜ������z�x---�9s&AAA4���T�\�֭���+>>>l۶M�vӢ�ݫW/�V�Jxx�A���ñ���G�f��B����k��&�������P�B��N3g�$&&F����e???�c���T�P��]%��~�M#M�zZ������;@�իG�
6�~�m��V�bEz��ABB�7o�֭[t�ڕʕ+�y���kW���jΘ�ܹs9{�,
6�o߾E����Q�Ǟ�B<i(��ֽ{�V4�2e�%00P��?��2d���h�7n�_�~]�h4ʸq��4�F�h4�|������h����<ۓ���h4�M�6�8p@/odd���h�<�Ν���h4���z�"""�F�8����~�MM�w�h�V�Z�iGm�۷o�}����h�>}�=W<=Jp��'JQ�o�d�^�Zqqqѻ���������_�a˞l�|��Q^�����F�
�t��M9~������<xP?~�bee�T�XQ9u�z�Ν;@y�嗕�[Dž�ʕ++��(���JJJ�r�套^R�?����9��5���ʥK��O>�D���R%00P=ްaCP&M��$&&*YYYJll�2b��\@�z��z��ٳ@iҤ���~�Jff�r���W�^
�4�H�f�_~~~
�ԯ__�իW�{���W�^]��[�*����Ç������L��͛Jhh�ҳgOP*U�������3����Ǔ�����}�B)؋�v�G�Gk߾}J�v�����+~~~JZZ�^�y��t��Š>]}��U4M��K�.)�Fqss3(/%%E/o^k��նm[E��(���F�k۶�����|999f�c�֭�F�^�u=|�Р?��$�e���+�Mjj�ҷo_��O?U�>��S�_�~�<Qp�|��Q��w�ޭX[[�M&�Z�J/�F�1�W�G����R�B��ڶmk��P��?cǎ�;wݺu&�Λ7OiԨ�(۶mSϹ��ҤI��988(W�\)Ҹ�K�͛7�Ʀ�R�����j�q2g�
�8���(�}��A{̭����(��2�
S3��ٓ�{�2�|�7oNzz:�V��O�>l߾]ͧ�
o~A=_y�8�g>�qm~]+�&�.�-�{�s/�ե�[7X�VA�Q{��6kӌ�/��kkk,X@hh(			$$$ʂ�R�JY7O!��>}�͘1cx��T�5jԠG��߿�I�&��t�R��3faaa��ݛ�5kbeeE�ƍ���9t�P�^*W�L�z�2d{���믿�;>n�86l�@�-�\�2���t�ޝ����|��G̛7x�J��֖��>���6m���5+V�aÆ��:u
'''�z
;n���٩�k^z�%t�9��_���^{�jժQ�bE5��9c���+��3�Ю];,X@||<0�gn��Տ����S�{�lmmqss��͍��88��
�U����q��Uv�ڕo�1cȞ={X�~=;v�aÆy.\���&0v�������R�	�?���B���ޞ+W���'::�?��)�:uꐘ�����S����
r�!��F��0y�d�.]
��)S�!�x<8;;�)f���mV;v,�/�}	���#G2r�H��F�a4�U�5����ǧ��f�t�~���B�cN����c�޽F��3fE}�̭���!$��f�߿?...l۶���T5j�n����J���ۛs�Α��͝;w���/qqqa�ĉj^�ʨk׮�i͛7��_'55��cDzy�f���O���HLL$00�q�Ƒ���k��F�-ںp�Bbcc����ԩS�]�^��;7WWW|||���!++���-Z���[A�Q<��իeh�tl!����ӓe˖�l�2�Z��B!�F��2!�0j�(|||X�x1�/�;��J`���>|�������J�*xyy��תU��w�����v�M�=|���~�	___�]K��t�.�ͭv�ڌ=Z/�iӦ<8ߺs���\�vM��R���� � 
:��۷',,���X�U����y�uB!�B!Dn��L3���3�|7n���VVV4hЀѣG����lll����;;;,--�����Օ����P3g���KKK222�t+++/^���/;v�f͚XXXP�V-:uꄯ�/K�,1�����/:t�bŊԭ[��#G�f�����[W���Y�~=o��&u����Ғ�u�2t�P���-�q�իU�V%<<ܠ���plll�ѣG��B!�B!r��eB�Ig+?���̘1�3f䙯gϞ������N�:ѩS�B��F�|�����X̶5j0k�,f͚�gy��K/�8V�V
OOO����q�ܸq���h&L�@ժU�,C!�B!�(�,B<F���ݻ	

R'낂����3��U�o�֭zq�B!���d��`mm͂�6m��cKhh(˗//���B<����{�����n�B!�O�,B<14
�'Of�ҥL�2� �B_qla.�B!��D&˄(�L�
{�yzz���Y�����o�u�(Q��:t(�f!����2!��ۺu+�
*�Q��n�ʀʺB$f��$i���,B!ʹ�� Y�)ʥ
*�u�y���B�'�L�	!�B!�(V3S�$��2!�߰a��/!�`%�[!��#13��%$$��˔�2!�X>B��w���u�K�,�ĉdff����ԩSM��������/�߼y���@"##ILL�R�J<���t�ܙ!C�`kk[�u£7q����i�F>D
!�=��)�(i�L�V3�B�;w.'O�T�}�v�����w�%,,�`W�.0n�8RRRԴ��Ο?���ٵk~~~ԭ[���8u�+W�$88EQ<x0��δhѢ�B�'���B��͛73lذ)[&˄BQ�bbbX�z5�����<Ӌ[XX���e˖���B�֭�6m���'++��~��e˖q��9V�\�G}Tlu���1o�<<<<�����ݝ�s�u�V���]�B!�(Y2Y&�Z�L��Mb�����ѕQ���sqq�B�
XYY�^Z��u.�f͚T�X�W^y���9z�h�ֹ~�znݺŐ!CԴ�C���߲~�z&O�\��	!�B����2�T��	B��w^����Y�n�Ν;<��3t�ڕ���ccc���N��j�
x4g*=''�u�ֱ�~�T�
4���0@�
��������?��_��3�лwoƎ�N��֓{�v����ܾ}[�,�rtt4:QX�:���ٲe�Z�һ�����Ņ-[�0b��W����!�x*��,�8��i �e�$1ʄ��<x��o���˗մ��D6o�̉'�jժf��r�J6nܨ����ə3g8s�)))j���&N�H\\��7!!bccY�r%y�5v�X.\���y�7�С͚5�R�JF���}�����J�v���k׎'N��~�g��B<}�Y�uKN��]�B!�z7n����888���ODD~~~���O@@��W��uTT�����;v�b�
"""8r��g� 88X='00���8�5k��͛9~�8!!!�hт'N�g=o��>>>��ڲa�ƍG�Ν�4i!!!ddd��u;v�&M���6M�G!��e*fY֝;�����3--��[)Dɒ�2!��)����W��C����_�R�J4oޜ9s�p��A�ۡ]�DHH��7DEE��Q?��#>>>8;;ciiI���Y�`{��)P}={���gӦML�:bcc������䯿�*�:ϟ?������z����B��U��!�2��֭[�_��[&D��0�B��7nмys��W^y��7o�]���������$22�իW3f�<==�R����ڵk���-'>>�P�6i҄&M�0z�h222`ݺu,Y���>��X�{�.�јd�4m!����?�dժU;v�P�^=F�I�>}��6f�-[�%&&�ʕ+ӽ{w�O���~\�X��baj��n�:fΜ���3k֬1�I���-q8�xD&˄B��PA�P�'''����ٳ'mڴ�����ܹ�ӧO�j�*�2e��KQ�<�y��A��;v�HZZ{���{�`eeŨQ�X�n���8�P��Ѹf�4m!����ݻ�5�۷o�i���̟?���l�����s„	ܿ���t�o�NNN���@�cu���ח��d�׳��1�S<m�6L!�B�������h�t��vvvE*���777���ظq#�F�"))	___5���]�v�q�tN�8�g�a۷o7z��ի���VQ�S����I�6M�G!D�ٰa�oߦiӦ�ر�#G���o����+L�N-'''v���c�3f�pP�X�y���_�>ǎ㣏>*�~KN!��2!�B����x�+&&���,bbbX�h�hՖ����۶m#55�F������Ke�.]�Gq�Ν;Gvv6w����/���Ņ�'�y�����Q£�*����%K���'##�p���{�=�z���_|��D�.m�6�B<-
3��=z���{GGG�V����7QQQ|��wj>sbvΚ5GGG*W���KJJR�4Vg^����U�����)�6r�B!�4j�(<ȵk��oɵ
�
[����/f���z�Z�l�����>|�������J�*xyy��תU��w�����v�K�.�1�M�6��Ӧ�����N��پ}{��ˆ����@ll,P��F!�������sbv6h�@����-�����:󢝜*������)�6��L!�Fo�Ъ^�:�ׯ��7ߤnݺXZZR�n]�J@@��a����̟?�ƍcee���
4`���|��j>���������KKKlmmquu%  @�̙3qpp��Ғ��5}ڴi�\�WWW��`aa������L�4�M�6Q�V�b��W�^T�Z���p�~���cccC�=�;!�x徥=��P�x�y���]m���={�w�^�ϟO���IOOgժU����d���L�*Ӎ�����W{
J�p����,B!D�jԨ��Y��5kV�yM}�1����fr�I]���̘1�3f䙯gϞ�����6m�ЦM�|�*�:�U����'~~~ܸq��J���h&L�`Z!D�{��g�~�:���4m��d>{{{�\�Btt4�[�VӋ�S���͍��88��
�5+@~�
P���u�Nc;6���ԩS���D�߿ooS�p��HV�	!�B��Q�F��s���agggpk�B��Ѿ}{�.]Jbb"���|��g�����dbv4V��X��hWE������q��e������B&˄B!J���5, 44���

e���M#��x���[ԩS������K�		`ܸqj�Q�F���ȍ73fmڴa̘1ܼy�옝�F�`���t�ԉ�m����
����N����ӯ_�<��N�}��t�ؑ7�|��5k��ocuk'ڴ17uINQ�d�B!D	�h4L�<��K��t�R�L�b�_!�V��,�:u�~�zz��I��թT�M�4��O?�O�>j����Y�X���o��兇�5j��ʊv��1o�<��-q8���eB!�%���OOϲn�B��goo���O��
��0�:��X,LSuX[[3{�lfϞ�o���[�p
!+˄B!�B���)�&��L!�B!�c��ťD�-�[>�m�iӦ1b�BCCY�|����L�	!�B!�"_�q8��)�-�,B!ʹaÆ1lذ�n�BQ`���%q8��@&˄B�rL�%��U�֭˺	B!�(g$��B}#� IDAT!�B!��OV�	!��؛o�Y�M�D��@B!�(V2Y&�B�s2� ʫ
*�u�y���B�'�L�	!�B!�(V3S�$��eB!�B!�B�?YY&�B�bu��-�,Y‰'�����ӓ�S��L/	�ϟ��_Twqq **��9�S�r�AWHH����i�Fb�	!;r]B�EQ��L�,B!D��;w.'O�T�}�v�����w�%,,챙�2G^}8u�+W�$88EQ<x0��δhѢZ*��I�L!DIڼys��E��2!�B���V�^�F�!+++���V"�&S}HKKc޼yxxx`gg���;s��e�֭X[[�f3�B!�%�Y&�B\\\���J;	��₅�VVVy���[�~=�n�bȐ!j�СC�u��ׯ/Ö	!�B���L!��JNNfݺu<x�;w���3�еkWƏ�����Ow­U�V��`��srrX�n���'!!�J�*ѠA���π�ڐ�����?��#���<��{�f�ر�ěn=E�A�=˖-���C�ʕ�޽;ӧOWWq�V���ٲe�Z��nݺj��{�l�ˆ#�^��Y�B������ƾ4�����ٙ��~�v�ڕV��~M3�5...��#G���ݻwcaaz�LNN���'!!�u��Ѳe�"���J;~����d�B!����~�m._���%&&�y�fN�8���?U�V5��+W�q�F����LΜ9Ù3gHIIQ�Pddd0q�D���Լ			����ʕ+�|�_&L������}�vrrr�.�>�۷���T��ڵklj'ؿ?,�~!DyU�ؖiii�>}��ӧ�r�J^}��Rha�hڴ)M�4��~��ѣt���d��Ǐ���@���Km���IP��
S!�yڸq#�/_��"""�����ޞ��xԼ�<�����M��ر�+V��#G�={6����9������ѬY36o�����			�E��8q����<�)
'''v���c�3f�R��V�;@�&MڨM��BaZ~�-���_~��������FNN_�u)���h�P�������w���b���z��O�����jд���_<�d�L!�x
ic��Uf,];1�����/�L�J�h޼9s����f�C�"-((������o<<<���R'�~��G|||pvv��Ғ���`����cv�3k�,�\���J,))��p��y���]n�����#�O�⌙Y�*T�@�ڵy�w8{�l���z��E�j�8v��]��޽ˑ#G�R�
���z)��tHP��
S!�y�q�͛7�K�W�y��eO�>�?����H"##Y�z5cƌ��ӓ*U����]������r������Ғ��l233�T������t5_n
4P�okk<��R�}�{�.�јd�4m!�(/n߾����9z�(iii4hЀ�#G�_��B*�ؖ�[�uct�u���b���s�_}�aaa���ѵkW���)H����y���			a׮]���[���%++�>}���/)[���֭c�̙8;;�f͚�46������8KPQ2YV�����o�u3���swwg���e݌��}A�N��gϞ�iӆÇ�s�NN�>ͪU�dʔ)��"���Y΃�<^�F
�޽˭[�ppp08������Mwr�B�
e�m���iӌ�O!�T)))�;�?��CM;w��ɣ��m����|�r���oF/�'����Ɍ3F��
�~ %%%߲��Bhh(�G�6x��ޢ���Q貵|}}INNV'�
�37s��7�T�L�=%V�XQ�MB�r��˫��P����r�
��Ѵn�ZM�����ήH������憛�qqq8p�
6��뫾Q�����ի�ڵˬ��ׯ�ݻw���=z��q�
6|l�P�N��>u���;��P�;]!�dAAA��������'�ФIΜ9�ܹs�u�^^ݸ�s�̡A�\�z5.��vh6����B���?~|�����Ăx��g�����ߟC���8�6m�ƍ���|��'8;;s���ϟ�o��?<Z1ݼysN�>ͯ����ߓ'Or��5�4iBӦM]�V����WW���tqq!33�={��x�b���MN���M���iҤ	qqq̛7O��:y��B�sAc��d��M&˞}��)�&!D���EU^�������1M�6%..�E�бcG���߿?7n�`�����ӇF�q��u@EW�.]��ۛY�fѨQ#�ݻG`` �6m��Ņ5k��VW)�µk�ptt�G�DEE�v�Z,--y�ר]�6w���|��7���k�m^|�E�z�����իW�<B�83�,wzTT�A�L��-[2w�\5���n\H{{{5.�سg���Na�;w�C�ѳgO����6l���z10>��9sx饗�G����6mZ�e������|���zc�
�]UfN�Ç׻=�jժ<x� ._����+z�c�9���:u�T<h0Y��8KPQ2Y&�B�<�5��r��5u7H-GGG��–�����ŋY�x��1ݭ�G���Ç���a���z��T�����V�Zܽ{www���صk�СCDFF��_��_��o߾�����C���	#66V�\���X�h�B��~������E��Kw�YJJ
Ǐgٲe̙3����|'xL�/��vS�V�S�w�ޝe˖q��A������%))�`ccC�^��.�7�U����75�q��� d��)Z�oB�������^��(6y�*�^�:�ׯg�ڵ>|�;w�P�N�u�Ƹq��7��pww�bŊ�����H^x�:v�ȨQ��|666�����7�p��!nݺE�j�hٲ%'NԻ}r�̙|��W$&&���<
��_�c�~��.]�Djj*6664k�:u��X��W�^|�����3r�H�6���cccC�=��B�sbf�h,>cQ�B�R�Z5�v�JÆ
qww����`�LQ�M�k�1���!w_*V�c{a�oeeE�~�d�޽<��{�����o��7�e���*���,����7�T�L�=�$��B��i�ҡF�̚5�Y�f���S��X_����eƌ̘1#�|={�4z����%�
bРA�֕W{���F�U����'~~~ܸqCݨ�ƍDGG3a�� �B�${��t��O���W_U�O�>m���q!��uQ�v>�-�)))��¬`��^���˜<yR/��v�p^�鿻�;AAA�ܹ����s�N����ۂ�̭$�JPQ2Y���fBa���L<�F���ݻ	

R'.������3��S!�t=z��ҥK,Z���?��ƍ��o��13u5.�)999����jrm,1��-���=$!!��v��x��X�j>>>|��G���˜?���{na�����H�V���/\�@˖-�_�~��έ��=s+���T�L�	!�B<!���Y�`ӦMcĈ��˗/�3�B<��
�?���+W��d���q!u�ڄ�R�Jz��]]]ٱc_|�_|��ފ��>|8��z;o���K��1�0��5p�@N�8�g�}`4��e�*h|Oc�w�T�*
��&]!��������P�����8�h4L�<��K��t�R�L���
!�x�EEE�����ښu�����F͚5�X�"���|��G�~\,m\HOOO��찴����V]���Rh�̙888`ii�g�1x/���]�v�믿�E��1///<<<�Q�VVV�k׎y��=VVV�[�jժ���=z���;�s�]���ԩS�{��Q�vm�t�Rle�rwwg���4n�+++���hР�G���?4y�6n�o�Iݺu����nݺ:������Ջ�U�npLb�
-YY&{���貰���Ɔ�����k�1r�H*W�\ʭ+QQQ�ر���(nܸAvv6u�ԡE�xxx}�*m�����?�!22���4j׮�7�|C�f����ҥKe���e�>��SN�:ep���\�+�4�o���_!w���xzz�u3���ծ]�����%$$��3��5�e^�cmm��ٳ�={v��&f�j��.����eiiɾ}���Wв�Â�4v~A�t�%�(YY&�X999$%%��ŋ:t(iiieݬB�s�cƌa��s��%������$11�~���c���o���Oq�1c?��< ;;�����g�}�L�TҼ�����>m���!��lu��	�m�FRR999�����J�W^y��[(�T�F���#((HM��B��,O��+L����w�QQQ|��ǜ>}�իWꛔ�t��m<<<�~�:�>�,cƌ��Օ�KKK�_��޽{Y�v-�f���lڴ	KK�2iﯿ�
�ڵk�ҥ���j|��q�Oy�sa�S�/o�+�B���ӧ۶m3�V�Zzq��(�*�#�e�U�bE�y�^{�5jժ���';v�xb&�f͚���iݺ5k֬1�߾~��L�2�=z0x�`�?NPP#G�,��feeЭ[7*T�Pf�vB!���0k�,ٻw/���;<�쳴mۖ�c�R�nݲn�x���$��#�e��7X�jaaaܾ}��5kҶm[�L�BÆ

�)�+�*�3gΰv�Z"##INN��Ύ>}�0u�T��o޼9�n�28���C���ؿ?/^$99��իӢEƏO�֭
ιr�
�|�
ǎ#!!�*U����H���=z��@���_~����0j׮ͪU��L���̬Y��;w.����e�.]b������ܹs�:u�о}{�L�B�z��Ӎ�Ƥ�\�2�Z�bʔ)�x�����q5_*>>�+V���?������3ӧO�[�nfǪ��#G�0i�$._�L۶m��믁�=r�Y����\ҏG~�-O�<s�o��ZA�a���~<̽��z=��
��_��B!
���Bb4�%�/a�L�	=���cǎՋ���_ʾ}�X�j����*3�2�;v0{�l���մ�ׯ�v�Z���	.�Y\\`�a:%%��C�r��Y��{��q��a���X�n]�vU�i�DNIIQ�2339{�,gϞe���l߾]/�ha�M����ӓ�5k�ۿ�ҨQ#�I�C�1u�T���մ?���;v��?�f�ڷoo����h<==y��!�h��9r�o����1 �=ʄ	��DŽ	�ooJ�￯>���րy�s<N�GI?�����%���(�3cϣ'ՠA�ʺ	B��A����X��B!D9#�eBu��=�L�BJJ
cƌa���<��s��űu�V�n�����ٿ�ޒgc+�V�^�N�,Z�HM�~�:���dgg���Ʉ	x��8u��>qqq�]�//�|ۛ��������d�…��@��֬Y�ٳgiԨ.䥗^��‚��8>��N�:ŪU��>���'���0d�Ə���YYY�>}���������-��7�,�����
������w�y���t�w��̙3�W�W�\a�ҥ���O���f߾}���0(�ߧs�Ό;��M���ٳ�v�+W�����%�1IIIL�>]m�{g��/^dѢEE�R;?W�\a�޽��۫��}����z<
�(��s��
�0�s�gZƞGO�����n���S�N�i@�
*�(J��A!����0���o��Ν;L�<ooo����\�2���
>>>�=���d�,�ԩS|����7No{�͛7����믿�����?OŊiժ_~�%��[�4h��ӨQ#\\\�:u*��''NdȐ!z��ܹ�e˖��h�R�
VVV�hтe˖p��9�sbcc�G�
NNNT�X�*U�кukV�\	�O?�T�q�y�&���
j�ƍ���ҦMV�^M�F��T��5b��մiӆ���i�&��ꫬ^��F���5�[�V'N�<iv�������i۶-�W��aÆT�T��M���/�X���2u�T������Qw�4�yPX���Q���1�1ƹ�u�)����H�d0`�ĢB!D���2�:t���Hn���ߟ��p�A��>}:���t�ԉ��{O�c��n������E!66��/ҨQ#5�ȑ#&�y����n�����ʕ+�3�#F�ꫯbgg@�F��hθi�4'>��ѣG�0a���L�0���H>l��2�ޗ_~@�5s8p�d�,--�4iR��^�ꫯ���<(����(��ט�c]�]k�z=3�<z�H�2!i'���G^��%i�֭%V�L�	U||<mڴ�3ߕ+WL��?���ɉ/���`�īW�ФI�B�/�$UNN< >>�M�6���;v�0����\�p�ӧOs��i5�Y�[!&O�̬Y�8u��N�M��k׎nݺѵkW*U���7g�lllHJJ"%%��ի|�����M�L;�999�i'�rrr�j�օ�l[I~����4��σ�z���||�SRc�+�kMQ�g�=�g�L<�$���y=B������d�Pt���|����޽�jժ�n�:jԨa�'55(ڊ*-lmmiٲ%-[����իW��g��v�Z5��ݻY�d	ׯ_/P��z��\�R
𝐐��wttd�ƍ����y����ę3g�t�-Z�(����z�8J�&�lllHKK3z�r����ھjې[^���`�}��x���kJI��VA�5E��=�A�%F�(O<x�'�|BHH7n��ΎaÆ1o�<uSOOO���[6nܨ��t���6�A��}�;nXA��=/&&�3f���?cmm͠A�X�t)ժUS�&&&2g�BCCIII���]iVNN, 88�+W�`eeE�f�x��;vl1���O^��O2�,*kkk<x@ttt�W;������S�B|}}M�Ⲷ�&%%���T�WT�2n�8V�^Mdd���nРAz�����?O�Z�hذ!ݺu3ZVϞ=�ٳ'7o���&**���(~��w�]���̺u��>v�Z�jř3g/�d��΀�֭���T�V���$�����������׶���|�PE�`���ٱ��}��x���c(ܵ����񐞞N�.]�Mq���\N�8��}����`ժU�������Ν;���ȵkט<y2�]���m�CW�.]�s���K�5k֐����/�w��۷�����9�7oV_t͞=�%K���gddIdd$III&�^�$�>N!JJIl�#�eB����ٳg9y�$�;w.�y>dڴi������E����#..�.��h���222���W��.����֭[�srr������၇�dܸqzr�[߾}�'((�1c��}m���y��ޛGGGbcc����S�N�DGG��J���3QQQ�9s��;���1y���999����@�v�Y�)�� �ǣ4���Zc�L�X�lQQQ�l�???�5kƅ�0a?������;��5k�a��w��ȑ#9p��F�"))�m۶Q�V-�/`t�Pk�hݺ5k֬1Y��_|�����y.\�…����ɲ�K�r��e6lHPP-Z� 22�hE�9?��]�t!##�M�61y�dV�X!�e�7`�<==˺B�rj���%Q&˄�s�Μ={�����:�ڽ{7���;w���_M_�h�Ν�W�^L�2%�:ڴiC\\!!!�e.\�w��888�,ܔ�Џ���5`����}HOOW'f:u�č7���6㱶���͛ӡC�=ʿ��o���+�+���믱���{�ީS'bccY�v-:tЛ�����믿�}��F�-I={�$**
???:t�7ɧ(
�|��smmm�w�111��
�h��}#�(J�&x���\�鿹c\��֘{=B<>��pU�^KKK*V���ܰaC��Ů]���兯�/:t 22�iӦ�9��[Ƿ�~�?��O�uh�X�B}����…�{��z\��}�ڵ�f!�:ub��ռ���ze���p��}|}}9{�,`ҤIL�4ɬ1�q3h� �]&�(1���%6Yf���\>|8իW��_e��ќ>}�����7�.���̜9S=租~bӦM4nܘ�K���zذ!� IDATaXYY�m�6�.]��۷IKK#""�w�yx3������~�:_}��/`ԨQ�q{{{�ч�۷o����ŋ�9s�:y�n���ׯS�N��ѣ������ͅ���tW��3n.�V�Z���ѻwo6m�������&==�.��_ӿ���o�L��78l�0�U�Fdd$�&M">>���L���4iǏ�����n�%iȐ!<�쳄��3u�T������">>�ɓ'�'�����9s�����Ç\�v��hV{�y��b��۷���l233M��8?�*L���*��ܿK!����ŋ������/S�B*T���~}����>>>��_�"22��M���
RG�������Y��c�â:ڇ�A`-ذD �XP�#FA%��$�.���y,�n��h"�#�(h0��"H���QD
�����s��Ev�ܟ����3�ά[fg�mccho��l0���u��YNj/�P�B�۷�����ԩS�y��9^�B�?df�P���;|��3�'NеkW�2_~�%����m///.]�D�:u^[�ɲR�J|��|��������Z�4h�ȑ#�^C��Y��Ջ.]����δi�������O��رcٱc7o���ٳ�Q�Fq��^��5�x�w���Ժml������3j�(n޼��ٳ�>�
�����k/W�K�.e�ر8p�h�oee�ҥK����{ݼT�H������`Ϟ=�ٳG�2e���>��/���ܺu�^�zi�7w�\�M�ft<�< ��ɓ';v�z,뮬�W�?Le��7��s���S�]
!^�۹������i�$S갲�ʶe�g�)�w�V��ݛ?���[����MHHӦMc���̛7��g"!ċ���?�^���>LPP.\�ɓ'ԨQ�V�ZѥKɅ���zfVVV�.]�&M����a�g�ׁ��3���//;���5�Q�&M�ٳ�K�W�Y&��hт;vУGlmm����hѢ4k֌u��ѯ_?����ѣ7n�>�X�bXZZR�J>��s��������ʊw�}��;�f��͛�u�޽Y�x1���XYYammMӦMY�z5&LP����s�����_5jU�V�`��(P��+2l�0v�ء3�al�)ؽ{7s����͍�e�baa�F��ޣO�>l߾]g�LѺuk�o���Lٲe)P�e˖�O>a���m�6�m��6lȎ;��O�تU���Oǎ�vSԩS�͛7ӦM�/���%���g������ۤXLy,Z�777
.L�(W�\����a
c��m�S��֘��R�j�T��:;u�С����餤�h��:u*�Ν�Q�F\�p�/��"�uܼy���t���֑�ͬ)%2�;ͬdɒ<��ǏΔ)Sx���+"�����9 !!�q��1i�$������%99��g����ҥK�9��~��}����{�.������;�<��s��i�/_ΤI��8q"^^^j��`����W���C�Ug[(;��"��p��mZ�l�{ァ3K�ׁ�${�ҥ�m�lْ�a	�F��/X�`NNN�:u���`<���nѢ�26�iӦ
M�6U���j�
��@&==�?���:\]]���nݺ�����7߰x�bZ�lɡC��n��ܹs�>}:*T`������p��iȟ��U�J�*\�~�+Vп4
[�l�o߾/^���B�333���Ԅ�Yo�J͖�0a����-[�Q�FѴiS�/�?��C`` �������z��lg���3���'%%q��
�/_NXXeʔ!00��m�U�Y��<}��=zЮ];5=�ҥK9x� �7o6�������O}_�z�D��2!D��U�U�T��͛z���/B!Df���ԨQ�S�Nмys�����$%%���#<<<(Z�(�ׯ��Ғu��Q�hQ
�8�)S���R�Q��q��	6l���%���,^��…��7��ĉiР�o��>��ʊƍ��$h����=�bŊ��hԁ��W�-����.�{َ?Npp0666�]��N�:accC����c�ر�9���TV�X��ᾕ4
5j�`�ҥ888p��}�oߞ�a�\�f��ݻ����O�>ܻw�5k��KL2X&��u����?������&	7o�d�…���@��B�O���9q��ǏG��`nn���
�1�W���~�}��6����///u�R�Jxyyq��F�
�w�}G�ʕ��� ))I���+baa��F�
��[��p��F�E�2e�h4���S}��lĈx{{���D��)X� �k���ӓu�֙�xB�Abbb�9s&�Z���Ņ����o�>��l			xyyѹsg\\\�ԩ+V� 99Y-�����P]@ٲe��ҫW/F�E����������7����N�&M�ر#K�,�ɓ'Z�RRR�t�Z�b�ʕ@F�ĩS�ҬY3Z�lɬY�����9?))�9s�ЬY3Z�j�̙3���щ�ظ�͸�5kF�֭�?>O�>5��szMC}�<���xxx�Kލ�/�m���[�����KZ�n���+ӧO7��K^��?�0k�,ڴiC�&M�ݻ7�v��{=SbIKKc�ʕt�����<x���qqqlڴ�F�i��+W����lڴ���8�풗$��"�M�6������a2��O�<�ƍ�CtB!^%K�d�ҥ���q��M����>}�111���_���Z�8����{��7��R����CK:�/V�+V�Й}���!C2dH�u񶊏�gذaܹsG=v��%�N��S699��#G������LJ��ϳ|�r��
�Qv�mڴ��2E�a�СZǞ<y�СC�~��z,::������QwW,Z����@���ի���g���j�����ܹsssf͚�u�…����Dv��ř3gذaŊ39�#F��$&&�e�����
�Li��]�T����������-��q���1d����o��={�h
����z^����4Hk`��ի̜9���T:uꤧՍ�e������={ƹs�8w����j���{��������N}�������o�>�u�7��"3˄��V�Z�޽���km�P�\9:v���͛1bD~�)��5���ȅ��թS���P���quu���"����q��������!44�U�V��a�"##�]�6����<y����ׯOxx8AAA�v�������޹��ח�ׯcoo����퍝�W�^e�ڵ:�?��7r��	u��P�@�l�BHHÇtgNAƒ�e˖���vvvܽ{�
6�P\+V$00���u_�
	9o�^�P_䄍�
�VnGS��I[��X�~=��7�˗gݺu�s;��_^ֿn�:bbbptt$00�cǎ��'�y�
1&e@��ˋ��P�;���'�<!!!ԬYS�>�R�e��2!D�(W�ӧOg�޽\�p�˗/�w�}gҲ!�o�:u�������/_���`�{�=���8z�h>E(��)eYW��]��+_�M�Fݺu�����ɉ�ӧ�\w���̛7
(@�ʕ�\�Y��eU�@ c�1��X�^=u���IHf���T�V
+++5OaRRS�N�bŊh4���z���+���ԭ[W�-�y0Ĕ�&O�L�
�h4꬟��W�ߔ6~�5M���
���˙_N�2/����ԩS�U����ַ�s^���q&M�D�
(\�0ӦM#""�_�U�z�Ģ�\���#  ��ҽ{w"""�Ք�o*V��S��^A)�2�2L!�B�JS6��p�-Z�к�dɒl߾��ŋӢE���.B�^nݺ��C��
3n߾
@�Ν�^��ի��U�lY�ܹCTT�+W�[&==���x����c�2:%g�B���ݻ:ש^���w楐U�TQ��n��&M�h�V�$f^�jJ\��W� f<4���wMS)�K�,�B��-��q+ׯ[���y�&�E�J�g~.�1��?�9s�FXX?��C��o߾,XP-@ѢEu��SʼL2�L!�B��lmm����Yj����ƍ�_�>�����Ӳe�|�R��r�����|fff:�5�WP�5�}Vʠʼn'��p�-[����C��dHvB�F���r�e�y6U�rr~vqYZZ��V?RvJ�Q��z̔�rҖy�kf�v�x�~S�˜Xڵk��ݻ�9s&���#11�+VСC�l٢���r,7�;9%3˄B!�+�N�:jn��_2q�D������`��ٔ/_>#B����s��5�����}����S��֖[�n�}�vlmm��룏>b׮]���ѡC5'�B��/==wwwu٦��7o��̙3Z�W�9sF�+��={Vk	��ӧx��cy׋�qny�����Z��M�/'m���|��\�~�S�Ni%�ח3/��w�믿�z�*���9>��X�+F�Ν�ܹ3���<x�u�ֱd�5a�R�������ǔ*UJ�|er��/��,B!���Z�j�իW�ڵ+͚5�p��DDD���-eB��ڶm����9�<)))�;w�����Uf�N�6�K�.���ʃ���pvvV��f�(K�\\\prr��xxx�o�>���x��.\`��񄅅ѴiS�wﮞ��̛7��gϒ���ٳg��7o���̝;Wm�ӧO3o�<>���<�˘6�)}}aHRR�ϟg���\�r{{{��lJ|9i˼x��۷2��ԩS���p���Ν�S6/�Wv}]�x1���$&&�h�"����D��K�.]pvv�_~!!!�jժ���h�|S��*ˮ3S��\47�̲�T�5�B!�g(W�"oԮ]�+VP�V-�V���ݻ�/B�7S�~�سg7o����#۲9r��g�ҿ��
,Ȅ	��%K�$66��]�bkk��ہ�)G�ŵk��D���lْ���JkIؠA�8t��o�VwTT�PA�Xn����iGGGz�ꕧq��9e�/�g}eV�X1.\�5�bJ|9i˼x���������Χ�1H�u�(/�<x0�����ٳt��Q�O?���y��2h� �͛ǂX�`�V��y�6m�ѣG9��N>Be�]^:?���e��������0��ggg��!�V�S�K�.e���z�!^?Y�eV�P!V�Z����9v�O�<�r����ߟ�3gbee�������LJիWs��a�ݻG�"Eprrb�ȑT�ZU-;q�D���{���INNV�������K@@�ƍ���ѤI�u릵TQ�hQ֬YÏ?�ȑ#Gx���J��u��|��jr�ܴd�f͚EXX666�oߞaÆi�G^�eL甡�����
[[[\\\0`���Ǘ��̋�meeŪU����������0m�4����yJ�*Ś5kX�|9���$&&R�jU<<<hݺ��󌉥k׮XXX���ׁ��͛7gРAj�?��o�����`�U_pp0����,ӗ�,�y��k��LJ�C�r��5 c�e��B���٩;&M�0�d�B�ܕ��HJJ��.tB�W���~~~���W���E�N����#(((ׯ��RfYe7�(rF��ղr�J���ٺu+���@Ǝ��1#F�`ذaz��_�~��Yo���I�-a�4M!��:w��	!�^�m�o777���]�vX[[s��-.\@�
�9B!Dn4h;w���Ϗɓ'��燭���rϗE��R�L3!�Ɠ^o���Sw�B���o߾����w��:��/���yT�dI�\OB��W�B��={6�}� ((�e˖�ۏe2X&�B������|YB�t�����^+�'O�B�
�޽�7n����;#��Æ
�lٲ��"�4lؐѣG�x�bƌ���e��2!�B�uz��A�=�;!�[f�֭��k��ܜ�}��I޳ב���=Җ��W�߻���Nll,>>>�;w��������]�EDDp��!�\�“'O(R��i�F�zϞ=��=Fcʾ��7oR�R%���ٳ��g�P�n]ڷo���!�B!��A��kgٲeDFF��>|���/99��˗�u���%""���\]]3f������-Z�����r/^��ߟo�����t&N�H�J��Q�F>D*�ٓfB��$9ʄ�#�e���0s�LIMMe̘1�UέZ����0
.L�n�hܸ1�K�&..�?�����N�8���cǎ5���1�������D���h׮eʔ�M�6,[��%K��nfB�W��0B��Q&��',z��e|�HMM�V�Z���ann���ܥK�8v����|��W��۫�/^777�ի�ĉ9v��ڵ��!#6�֭[����C��:�k�.�n�J�޽�1:!��Or�	!��۞�l��ͯ�J	!��m���yvm,&y��7n����$$$`ooO�Νqss�*��͛9y�$�=�dɒ4nܘ=zP�pa��28�x�b֭[��˗�����Ņ����r�z�2��
�=|�???N�:Ebb"�˗�K�.|��Ze

f=�ܞ={6�/�bŊ̚5ȘM�e�BCC����dɒ4oޜnݺi}@8t��;w�(ˬx��t�ԉ
6p������D~��'~��74
�����Ջ%J�ݘ���2�Ϯ]��]�6666j�ҥKS�V-v��E�N�(R����.�B!�[�n}���',F{��1S�N��v��m�/_NZZ-Z� !!�3fp���\LL;w��ܹs|���:K�fϞ͓'OHJJb������3|�p�b|��)3g���Q�ݸqC({�֭#>>�R�J���3�̙õk��2���'00�+W�0m�4u�������9�:���ذa/^Թ����2�<ȹs�X�h��df�Ę��'$$���D�ׯ�s_���9w�'N��m۶�>~!��e����\�r��@��M�����!!��d�Lm۶m<|��*U�0n�8J�,���/ 00PL	

�Ν;�-[�q��Q�re�]�����o�ֻ$��Ύ1c�P�T)	��ɓ�`��YdY�ر���G��˗/�l�2bcc_��/_����Z���}�v�]�F�j���O�P�w��eժU�;w�ÇӺuk���.]:�:�y���޸q��3gR�F
�_�βe˸w�AAA�8cN��P?�>}�ʕ+��P�J���	!ċ133�{��ܜbŊQ�zu�w��رc_�\������ڒ�����QQQZ��s�O?���ɓsm� �o^Ձ���w��E���9|�0W�^%>>��E����@۶m6l��ݰ_Dv}񪷫Еy%�B䥼H��${y�gϞZ�ew�ԩS<[[[
,����	`ٲe�����1,,,�^�:�~�)'O�ԉc�С���beeEǎ�����R�>|�Z���##G�4�ZYu��Qk�bhh(�}��*U��ܜw�}W�t 88X-�����E����A}G�A�ڵ�������#F�{�cN�W�7n��Y)ǔ2B!r_ZZ�=��ɓL�4�>�������$����frr27n̓z�ΣG���گ���DƌC�ڵ��o8u����/���<z���p�ΝK�j՘4iϞ=���/�,�7o��|BB���32�L�޽{���{ٖS�@V�^]�x͚5���Y���տ��ViiiF�x��]����"�����0�s��۷տK�*�����>����P�F�/�j�Һ��o�%�YcN�W�Ǐ��I�S�!�xqYTy�����?~����μy���)Bӭ]�������ڵk_�ݯ_7����oߞ�G�biiI����۷/NNN�,Y����S�N������Y�x1��;w�|)	�eF����Ϗ�}��wB�7�����:,�ex~r��-�ȩ��2ϸz�z@��Uv�LOOW���Ҭ���-�/�5k��������'�<',,L-�U�Ǡ�_�@��3&�iw�\};�*�r�_�B�gii�;�C�n�(U�-[�����,;�<���;�K�fŊ�ر���.\����&L��ѣT�R�͛7ӠA��mllhӦ
mڴa�رt�ܙ���3e��,Y�OQ!�yC�a
�E� IDAT�)��3�Fҧlٲ\�tI�r�L�2y]%1��P_��6�o���ӧ��=�̔�����ߦM�ԲJ��_��`7o�$((@�#��իW�nGFFd�טsڿ�(;r����ܧ˼k�B�.nݺ���éP��[[[��맾geff�������G��)S+++�T�������7n�ovqf���,]�777J�*����K���ݝ#G��ޕ+W9r$U�VE��P�D	6lȜ9s.�3���֭�O�>)RD�ɩ��P�����׸t��
���+++�������ʕ+�>}���)���3p�@lmm����Z�j|��w�_�x�U�Vamm���uʲjذ�:�lٲe\�~]���f�����L�2��Ջ���,��vv����Ӧ����o�ѪU+
*Dɒ%�ܹ����<��B��d�LM��f�bbbHJJ��LJ�={2n�8�\�F�X�j�/_&55�˗/�z�j �V^quu2�^�rE����~�)[�X1<Hbb"w��Qc̉���إ�ƍj��
6гgO�̙���^�:nnn$&&2s�Lv��ɃHMM%&&��۷3k�,i֬5j�Щo�ʕ\�r���"##���hҤI�Ę�U>hf��$�U��f�ˋ��B������[�.?�������DGG���OÆ
ٵk���,T����u��ѤI~��bbbx��ׯ_g�…������S�t%�{I\\M�6���?'88���XRSSy���v�U�V�رC��~���
��?r��5���y��1�N�b���4h�@'��햚�ʆ
��%����a�RSS�nS�ܹ'''|}}�{�.Ϟ=��ݻ�[��
p�<��)��k�.���X�~=��Ѥ��p��UƏς�ƶf����9rd��0ԯ_�!C���������2���ǐ!C�x�")))��������؍�"�s��I���8|�0���<z��۷Ӽys5׫”�x��]q��a&L�@�v�puueȐ!lذA����)}���3}��sS񤥥ѩS'���՜�/���3���/����>��s>���<Ib/��2a�O>��%Jp��eF�̀سgݻwW�u��[[[�ݻ�����ӧӧO�޽{���f��E���cooOtt4ӦMS뎎��)��_�����S�h����coo��˗�2e
�{�f�����h4h�V�#F���BBB�֭cԨQ��ӇѣG�~�z�>}��op3�*U�0m�4�����ٳ����R�J�/cN�Wd����2NNN������r�T!r[ll,ݻw'..�	&p���>}Jhh(Æ
#99��}����JOO�o޼y���q�#F� 55��#Gr��
���9v�U�V����,\�0G񦥥�/������C��8u��j����$$$���HXX...���3w�\�s&L�@\\�~�)W�\!99���>���#7o�����vسg���ԬYS�BҸqc���b�޽9j��Q�%�m�Xtt4�{���ӧt�҅��ϓ������ҥ������S�g��L��)�t��}����ӧO�ի�.]"))I݉:ky�2K��?6�
{��`pPj�ԩ4i҄��0�p��;w&))����s��}�}�ϋ�ϐ!C�裏8~�8���9r�*U������l���x�����՛�(!!�q��1i�$u�:99��g����ҥK�lgu
�e�GGG5m���dz=��ɓDEEQ�re�;ț����,_��I�&1q�D���8s�L~��֐�2���<O�%J��_���J�"E����r��|��縹���)�ܹsi߾=666���cccC��;w.���y���={6-[��hѢ(P�J�*�	�3�8p �ڵ���KKK�ׯoԮ��櫯���ݝ2e�`nn���5�5b�ܹ:3�,--�0a�'O�aÆ-Zsss�+���3�'Of�ĉXYY�o���4m�KKK�/N���3g����Ƙ�<x0e˖���\��ִiS
,�����N�…�YB�:����w�S�Neɒ%T�Z��ҤI~��'>��3?~����u��˜9s&�&M�Jx�r�J����ի?���*U��Ғ�͛�;@�_�^�u�.�,P�eʔ�G�����xzz��P+����iӦ*T�FC�ƍ���ٳZ�(��-�jժXZZR�P!Z�h�~^ضm[�������ZǕ��y��ˋ'O�вeK�U�VVVԪU���@Z�l�ÇY�|y�\˔~���y��1:t`ӦMT�^+++�ׯϮ]��S����%����F�Q�z��|���kԨ��C�hܸ1�GGG~��WZ�l��ǏY�r�Q�e������F`` M�6�p��|��
�'Nh�5��/^}G��{|ڴi�8q��e�2k�,����ɓ'	

��Ã'O�0e�Ν;��#~se�nݺ�u��l���_�ڵk�f@DDy^�ӧO�1cݻw���;;;�v����ӵ���c�.[˼�|||:t(׮] ((�	&���6���g̘1�-[6Gn_Giii���333~���^��?�L`` ^^^j޺{�����={�o�B��&L��ҥK��lٲ%?�9����Fd��Y�f�		!**Jon���HjժE�F��:z��1�����͛|���ܹSkS��
r��)�=���Dvr�Y���mڴa�ҥ9N�������fffZK`�r�
...�3777���2��>|���-���ܼy�
*��ݺu���{+++���(Y����Û��������~��ݻwӾ}{���ݻ�������#���z-C����aaa8p@o��m۶���2�W�@���HMMջI�!)))XZZR�@RRR��J�����Q�o�ƍ�M�2�������s��9j׮�uN||<��֘��k-�5����1�7�;333��/��6D�A�2 ��S�E��Ɔ
6��c3���aŊ4jԈ~���&��O�>�}��$&&�s�NJ�.�sNll,:t��‚ݻw�*�u�b�
֮]ˎ;��btt4�;w��ÃѣG�s��e7L�!��!3��i���ٓ}�������Ҹs�+V�t�)�={ƍ7���u��K�.�.]Z+Ɏ;(S�L�KE��U�$����՛�_��.���ùy�&U�Ve�ƍ:�+�ԕY:�Ⱥ�355��B�>}ؿ?���:��(�_���ۙ1c�ڵ���V�nfS�N 44����S�B*T���	$99Y����q�F���hѢ��@@Ŋ��HJJ�ژ&�(�)y?�R��K=����i?]�x0��P~�…�7�Ɏ����j�>�@�q%���eN�h�V�ZU�X�"Eݝۍ}����̙3iժ...��ߟ}�����������;w��ŅN�:�b�
�>�|N�kl߾ȘŪo�2��5����k����o���ݝ&M�бcG�,Y��A�R_JJ
�-��͍V�Z��,?~�ԩSi֬-[�d֬YZ9+�󓒒�3g͚5�U�V̜9����x����ի�=�f͚Ѻuk�ϟ�3�)'m��k��B�
���Njj��'Y�ر���ڵk��שS�hժ���(--��+WҵkW\\\pssc��:3��=�r�����شi�5�z.�+Wggg6m�$��^��@�����ƾ}�X�z�N��bŊ��M�v�Z���@�ʕ�%��2f��ϟO�N���$�_|��&_bBS���/Tn���P�hQ�mۦ3
P?L�FzsssJ�(���+���T�X����������f�ԩ:����A������D���k׮e�ڵT�R�}����=����������Ξ[�v-�F��Q�R��/^\����l�`굌�'�C�,���rpp�ԩSDFF��⒣���@�U���~}3B�yOM��^���Q����=���6�;w��.]��`f����ȑ#�vۍ����LJ��ϳ|��lgN*K+�6mj�L�"E:t�ֱ'O�0t�P���f&�����ҊE���^�z5���l޼Y�_�YennάY���_�p�:����Ȯ]�8s�6l��el\#F������u�l�BZZӦMLk��]S�nݺ�.�~���)��M�kɒ%��ũ�Q˗/W��C�$�s��q��9���渃�i�{�����7}���+����۷OV��1�Y&�HC�aРAT�\�F���9eʔ�M�6,Z���E����X5?���-GGGz��͚5kX�f
}��1:�B�
��&�=қ�?󌮬.^��g�}���6l0�:���"�L�4	�|R���ӻwo�_�N�5�1c���l۶�`�)�����֭[���0d��v��Ǐ�yLƴ[dd$���[�Wxx�:�*+}K/st�̔��MVʬ*��L���ch�m۶Fﴶy�f�K>��sZy�%J�0���r�r˜��=~~~ܹs;;;|||

eժUz?�oذ���Hj׮���?'O�$  ����NPP���2s��`oooT����\�~{{{5Fooo���z���<��ϟg�ƍ�8qB�ٴ`�
(��-[		a���;vL��Ǐ�l�2BCC����Ύ�w�;	�WŊ	$$$�!C���9m�^�P_T�R�z����_�,M?u��oߦf͚�)qU�\������Ku���ˋ��P�;���'@��m�CBB�Y��ι�1���;2X&�H��渻��`�֯_ϦM�����>|8666�^��2e
7ndѢE:�W^6www&O���ɓ�СC��"��R�jeM��<�����ݛ���̙C�Ν
��R�
���)�$%%�+;"�\���/��_2d�:w�5�-�R4�����ۛ?��S�ݐy�8S�mݺu@���ؔ�OJy�2k !!A�ڦ�jU��P.��'Oj���k��O���y�2SfEe5l�0
(�ʕ+s�<<s�>>>����_��2�M�ϔ�NJ��c��/��,E˺�M�qeaڴiԭ[KKK����>}��u��������
P�refϞ
��]���KY"o��}1֫WO��v��!�s<==�V�VVVjN���$�N�JŊ�h4�&��===quu��Ғ�u�3�2����ɓ�P��F�I�y�)m��kb(ѿ��_�Ufj\����� M�����G@@>�{��DDD�lS�E;���@ƠZV��lJ�wd�L!��%q�ܹs��+033�Q`�ĉ�={Vݹ*;-[����[����cff���rN)KJ2J(9���6	�R��T�T	333.\��s��e"ƶ[jj�:#Bٹ�%���f�)K\�
��������'��?��X.�����4/^�U���2���t�d�P�7�Q�'��U�2v�Xi߾�s����ӡC���5j�:�*�o��F�Xjj*.�YBd�/���yc��"�ܺu�
hwrr�){��m:w�5�lj��l���(�e���ufL���߀���ݻwu�S�zu���K�2�*T�`Y�֯_@k��)qe�_YΙ�ߗ)m��kҦM�/ΡC�ԁ�����bmm���W����ǣ�hc�ҥ������L΋v����/�W�)eDޑ�2!�BF�M���			�}����������Ç1b��‚y�����S�n]|}}��s�Q��h4�Y���S���?������C��ݻ7��3)�RRR�~�:s��e����7N�_�y<q�D���RSS�p��LQ�$����=z��~���III��꬈�;�n�����ݻ8;;Lخpqq�A�ܽ{W�M;pBƆ
Ǐ'11�k׮�矫����
$%%EM=j�(�-��Ç�ڵ+���$''I׮]9r��~���2��F����-�����������̥K��ٳ��g�1�ԦM���o\]]<x0����þ}����iӦDEEѢE�b�]�vѫW/.]�Drr2gϞ�cǎ?~���{OgF���ȭ65����=e�]�ew�û�fW&��-u�[�.����.вeK<<<�Hg�݀��<�9ݍ��B;��RWN��..KKK���j��]�+++:u�Drr2�w�`���$''��wД�2�*h׮�w�f�̙ԫW���DV�XA�L��E�Y9��?�cƴ�0��	!�B`oo���?�
��4nܘB�
ѪU+V�ZErr2˖-S��'gϞ���Z�n��?�V�V�+V`ff���)W�E��u��\�p5oJV��kiiI�*U�>}:���6L+1�2���?P�\9,,,�]�6�ׯgƌj���þ��j֬�ŋi׮���XZZR�N��݋��=���gr�)9]ƌ��~Qf�e�3}�t
,�իWi޼9�
�jժ,]��e˖���sd�=���T�ľ������hضm�j�B��P�V-�mۆF����O�2��L��)�T�X1)Q�{��~��h4j֬��͛���o
�hee�Ν;?~<iii�]���m�R�ti,--)S�~�!�֭#==��>��={�d�yO@@���f͚h4�իǞ={(W�۶m�I�o�/r�MMe��_������h�zPw�ݾ}��[DD��%���>��X��o֎�[bzz:����M;;; cirf�m%�ܤl��8}�4��z,/�z�66V׮]133c۶m��Jͭ��+F�Ν���חA���j���*/�YٌE�\嘡
[D��0�R����;!�xm�ڵ+�T��ҡCΜ9�…ٿ?���.\����I�&������2dժUc���������@�ʕ�ׯ�&M2j7a�F���-M�4aРA:3^>��S4
K�.��ŋh4��}Ə���;ժUc��\�R�BR�X1BCCY�p!۶m�ƍ<{��J�*ѥK�L�B�2eLj�G�D�R�ԙt�ӷo_&M�Ķm�x��%J���ٙ���̙Cpp0���4hЀ3f���&��j͚5�5���`���(W��z_�N�8u������ܿ�2e�жm[<==�&_6��k��O��<�?��믿fǎܿ�jժ1c������
�hee�ҥK3f���8p�˗/OѢE�^�:m۶eȐ!Z_�
�ѣիWg�С�9s�
*Э[7&O��w���"7��T�<�E�h۶-׮]c���|��WԨQ��/2�|��-[�d�ڵL�6�ɓ'S�Z5=zĆ
X�~=��ά\���!==�۷o��8]\\prr�ԩSxxx0v�X\\\(X� �/_��$,,��M�j��jѢk׮e޼y|��W8::��ؼy�\o��s��q��9u�n楉y�1m�S��BQ�B5j��x��e���tv�͍��t�������':t�Z�j���_��L��򢝫W�Ntt4�n��S�&g^�+�Y���,�ך��C�U?�GDD�$�Ba<ggg
��	���0i��x��YV~~~zo!^�2sR�f�]�7fff����KS��6DI�/W�ӧO0`7o�4x�rޓ'O����[�`��x{{��ڵSg���ڪ5���2j�(�?z�lْ���JkVd\\�
R�feV�B֮]��2�Xsz\�]�^=��u����^�Z]^�q��9����P<x�)S�P�D	=zļy�h׮�V�܈+00P+�Bfnnn�첬��E;+��7N�___�-[ƌ3�<�o3��맾�d��"df�[&�3B!�B�_��P�P�B�Z���˗s��1�<yB�ʕ�߿?3g���;emm����W�����ܻw�"E�����ȑ#�]z!#��Ott�Vn<|}}	�ܸq333�4iB�n���T,Z�(k֬���ȑ#<x�R�JѺuk>��Su�$7-Y��Y�f���
�۷gذaZ�q��9e�/-Z��T�R<x�uS�܎�k׮XXX���ׁ�e�͛7W�'/��?��o�%88Xg�,88kkk�Y�"��̲7\֙eB!r��,{��M3=��2��ަ�Sg��"**�N�:aggGPPP�_�U��,<�fY�r%���lݺ{{{ c�͏?��#F0lذ|��� 3���eB�wv��E׮]�;!�����FBB�����
�n�b�…4h� �#qe�� IDAT"o4��;w���n���燭�-�������2X���T��:u��0��֩S'�K3�Ba�:��/��`�,X�u_ɒ%
n�!��P�B̞=��>��IJe�tvyC��p�Z��U�V��B!�xK��K�[&O�L�
ؽ{77n� 99�w�y�
Fٲe�;D!�LÆ
=z4�/`̘1899�sTo,B!�B��177�o߾y���u$���>��?��B!�B!��
,B!�B!���2!�B!�B!�?�Y&�B�����?������
�6��ׯ�����0��h2X&�B��ڸq���;!��B�
�B�����d�S!�B!�B��Of�	!�⭶l�2Y�)��3}�����/��x�z���!!����~M,B!�[�m�2+��[o{�.??��:g�"o������,�B!�B!���2!�B!�B!�?Y�)�B!^ȟ�I���_���I�&�CI�����쬷�F��bŊ���ww��^�)1GDD�[}����ܜ�ŋS�~}F�AժU����"##8p eʔa�Ν������F�.]���bժU899�p�9�H�r��	!�B�������ѣ/�K@N�>}�4˗/��&==�^�z���@���_z�B�W���[III\�|�Y�famm�|�������x��!�&<<����S�B�\���ё�5kr��E�?������'O�$**�ʕ+�����M�r�,�B!�&;z��+W�ӧO�1cݻw���;;;�v�����y���K�R�y��VDD�����C��_��e��cJ����mζm�hР���^�:���֭[�nͶܯ��
@׮]�,}^V�{_�2!�B�pvv6�DG�Z֬Yý{��ݻ�z�O�>ܻw�5k��cdB��^��V&N��ŋ�9�׃��9���L�2ȘՕW>��C�)BHH111z����r��1
,��-��-�ޗ�d�B!�+��aŊ������*U����Y���8V�ZšC�x���K��U�V>kkk���tӦM,Y���gϢ�hhӦ
�Ǐ�P�B@��U�V�o�>�������J�*t�҅�?�X�Z�����P�^�j'N����+W�ۢ��������شi�5�lٲj�r�����̦M�0`E�5�#��"&&�e˖q��q�>}J�*U8p S�N�_7�f���ܿ�ҥK��G1l�0���ïϓ�������}9�Wq��=�-[FHH)))|��GL�8WWW�Xr�zi�v��_c�|����=G���ӧ�j�JmscT�X�Ǐ�m�p��
,H���3f�F뱄���`���ߏ��͚5cܸq�.]�B�
���N@@۷og��:u�ر���:t蠾��=�iN�'3���/s�=[�r��	!�B��bcc4h��/�W�^e�̙���ҩS'�<y�СC�~��Z.::������p��Z�1b���%11�-[����ƴi�X�|9���j�gϞq��9Ν;G||<���{n�K�,!..N�{n>n}���KBB���33WWW���ٷo��lG�ꊏ�gذaܹsG=v��%��6��Ɍ9���H�XTT>>>�?��˗g��ݐ��tbcc��o�U���>z���?��e��)'���g\\C���V��ٳ���x��y�&�J�ҹ��ӓ'NW������0y�d�r.d���@�ծ]�8s�6l�X�b@�R̀���������T�hv����PdmSS�'��=[�r�,�B!�xE�[����	�رc|��'�����|}}�~�:���������7vvv\�z��k��\�bŊ!C8|��z����ˋ��P�;���'?��3��+���,�+W&$$�/��2����CBB�Y���u�cJ!ī��Ϗ;w�`gg����Z�J���
����v����s��I�_�>����݂�-
���y|L���Wd�AUhB%v�%*vڢ�Pbj�%�����ھT�R��V�bM�����R{�"�D��V�DG���i&3IfFb���c2�{����kΜs�����գu���ر[[[hQ���Z�����Ɋ+���d����߿?��L'�ל8W�Z����\�d	�ϟ7��Ǐs��i�N�
@�
�߬_���f�iEDD0w�\"##	

�L�2ܸq�իW��x{{S�V-���~��7���9�իW�Z�*ժU3�=�jSS����=[�}�O:˄B!��a)�c�y!""��?�///\\\?~<��������0�?��5kbooO�Z�t�/v��mP��1c������Q��wRR�n��[�0֯_���M`` ���F?DӫW/��=�y�Ɯ={�w�OF�˗��#�x�̹���խ[�	&��s�NBBB�T����T�P�ɓ'�}�v�c����N�:,X���oN�{��`ܸqT�^{{{���
FR���ߧ��nݺ|��'�֙��ӻwoN�:�����A�O>��
*����LHH0�7v�X6l���=5k�ԍ��ܱ��B���vT����M-�O��=[�}�O�a
!�B�S7n��r�����N��U��^z�:u������[��vKzz�.mĈL�2���(�����o�߿?AAA899���?��2����{�.��uY�i�<B���ʕ+���2��u��z�*F����M�W;�,))�!C�p��ڴic�s��^�j֬��������L���kN��i����|�ckkK����e�xxx�����\�hQ@�>���}j׮���[o��_|��ݻIJJ��͍��$v�څ��+�[����%s�Zz�̋{��r�t�	!�Ba�"�y��B��0��C���>�zZ�j���?{��e˖-?~���z�j�
fҺ'Y�*SJ��LMM5�4ǭ����Dڴ�mW!��,��*����Μ'��������'N�O�>L�>wwwZ�haq����<~��`;��?��t��J��9qj�'�4u�q�z�����yڷo��ի�駟�֭?��������zX���d�77�Ǝ˘���r��}2
S!�"�z�嗁�GD�)S�cǎ�k��F�nnn�t�RV�\I�>}HJJbΜ9����z�E�����m�vicO^Ӧ[hZ��xzzp��q�������ܶm�tk�e|���XC�*U�ݻ7J)BBB�[�vdґ#G��8q�A��^/MeN��v�g||��?���8��G���W_5�۩S'lllزe����W���b�}2/��r��}2�LX�իW����vB���ˋ���[;!��Q�F�]��ٳgB�bŘ;w.�ׯ���S�K���Y�|9!!!L�:�jժq��)�O�@�&M̮�C�\�~��c�Ҷm[*V���~í���իxyye[���;w��e���t�ܙ�7o2c����Xݕ+W�֭[\�r��vJ�%�;��^˖-�p�ӧOg�ԩT�R�ӧO�m�hт�˗3~�xƌCŊ�w��W�fժU����h�"�������Ν;�~�:K�,a����ۺukΞ=�g�}�ԩS�U�gΜ��>3���륩̉���f�…����駟R�fMΞ=˴i�,��iL�6Mw�O�8AHH�޴J-///�ի�{��s�[�.*T��gN{d��dfyqϖ{_��2aU&=z^�� ((���0k�!�x���׏�;wG�v��e|"[�>}ؽ{7W�^�=%K���� �}��!$$�3f|@˸^��]�N����`۶mY�ټys6m��W_}�W_}`�1�����5jľ}����7X�H;*’"B�g�gϞ����\�|��}�f��o߾�ݻ���8z�ꥷ��ɉ�#G�ޛs�pvv��<x06l�s�κQM��۽{w]���ҵOq���륩̉�W�^�ڵ��g�2h� ]z�֭u/�R���
��j��֭���;w&&&�Y�f��k��Y1�>il�ܾg˽/��4L�/(��%�|�


�����ʴS3��%J�l�2Z�jE�"E����jժ̜9��m���)R�e˖ѵkWJ�*���-�J��G�,_�\��9:u�ĤI��R�
888���M߾}�2e�.��ѣ)[�,���9��3r�H)Z�(4lؐ�'Z|���nݺ5...8p������J˖-�n!D�������̒%K�X�b���Q�R%>��S@
)WWWBCC	

���[[[���t�x2��1纥U�n]�v�JZZ_|�E�:88�p�B���C�R�����iӦF��z�4��q.Y����@���qpp�e˖��P>ks�̡q�����Q�T)�{�=-Z��g͛7�D�ܻw��ŋ�3�GVL�Of��l���>�T�+�	������ٳ'�k(�;�HY&D����Y���?�-b�ҥl޼��e�O�>ֱcG̀��xQ�H����t_0f~��n޼I���)S�[�n�����M��"�2�'�b�B�L����a&�Y�L!
�>}���?Ƙ1c�'��m��WӦM�h4�;�V�Z���ʕ+W�9s&u�Աr�B�r��]�Y&�Y�L�'�F���o�s�|�n9ggg&O������ݻ7[�ne�ܹ899Y9:!��ڶm�ƍ��	����/:���.�,��L��&��BQ����2t�PfϞ
��aò]pY���3///~��'.]�Djj*/��2
4`���*U��!
��Ƚ/�Hg�B!�S�`�WPP�<�E��P�B/�߱�KI�X�E���k�4L!�B!�B!�?�,B�[�nY;���B!�B<[�Y&�S���1�������fϞMJJ��C�Hll,���T�V
���(Y�$�7fڴiܾ}��~�~�-U�V}�њ� �(�B!��ٓ5˄����ܻw���h���ٰa{�����ڡ���?�/�0x�BBB��̚5���P:w� <�� �(�xv���y�葵�B<g6l��B�ԳgO6o�l�0�ϩ
6�Y�2�L�\���{���r��-6n��+��BLL!!!��d�~�-�g���ɉɓ'���y��1�����+�.III���C�Bh��קK�.�C��ҥ��׷vVѥK��
!�T^^gdd�y��ޞ�_~�Ν;S�D	Z�h�ʕ+��Ϭ�I���K֮]K@@�޶%J��o��o��ŋ����[C!D�����Z;!�x��_���!!��dd�(P�\� A�������z��ɩS����jM����bcc�ҥ/��x{{3v�X�߿oQ��oo޼i�-%%�/����M�R�D	ݚ`��{��5Z���	���GGG�+���/S�L�޽{F�1��Ο?@�֭�=�q���b�ܦ��Y��ʕ+���R�paڷoo�=+�m7�ܙ���ҳgO��򒗼�eɫgϞ־�Y���]^�׋��2�L�]�v$%%��nݺExx8�6m�￧m۶f����~Ŋ���������.^��̙3ٱc�p��f�q��Q�T������L���9r�^zBB۷o租~b�֭�k�N����ü��$''��RSS9r�G�a���DEE���/�[�n^^^\�x�+Vd��������f��߿����mSc���	!^������Y;!�s�E�(��ر��f�"o�����'%����������k%$$�R�J)5r�Hu��y����
*��-�nܸ�c�!!!
P�
ӥ_�xQ9::*@�K�.���T��~���5q�D����d�����ܹ�6lؠ<==��,Y��gܸq
PիWWJ�Ѩ���4h���ﯷO�F���Ο?�RSS�F�Q{��QժUS�2d�S�ۗ_~�;���zK-\�P�<yR����ؾٵK�m����ĉ*11Q]�vͤ}�ڞ��N+((He�^Qp�߷�Yy��7��o���B�6S�,pX�a�a���ܾ}�q��1g�|||prr��ߟo����Ç���Ȃ�-'**�I�&O����E����C�u��7�|C��屷��I�&�Y��U�V-7�0P[[[^z�%�t����;v,��G;�a�ʕ4j�ggg�_�>+W� ..No��~�
�Y�f��ヽ�=���4o�\�.Ė-[��݆��L�B����_:t(իW�hѢ4oޜq�Ʊ{�n�Q\�0a5j��͍�e�Z\<ݹB!�B!2��2Q �����?�1�}���ر#�2�ѣ�?�u��L�>]o����
�СC
����C)ťK�̎])�o���ɓ'��/_��R��u���ꫯ���tOOOڶmKXX��n[���QJq��u]���fccìY����c���ԨQ�߿Ͼ}��>}:o��&�+Wf���&�Cf͚5�h?c���	!����ٳYn[�~=�F�bԨQ�@�ª������{�2����ȑ#iժ
6����^�ZoY�{��_r�<ZZ�)2ǗW�fW��{�Y�Lڅ�=<<�ͧ]�ޘA�q��e|||X�f
���z���wjժev|*Ӻ]���$%%q��),X@xx8
6$::�`�2x���ɓ'���!::�cǎ-wܸq��׏��H"##�'ho��&�۷�]�v888��?m�U�^��?���?��{��CLLd���\�p�֭[���o��O�����	!ċ棏>b߾}���l;z�(���gݺu(��֭�*U�v��V�T!,��h;v,��K���#..���P&M�D��ͭ�s(����\�Ӓ{o�$#�D��qqzK�}��w�_��"E��e����
�h�����jy��_�B�(V�
6$,,�O>����$Ǝ��oݺux{{���M@@�}�;w��Ν;F��۷/�6m�����|�r:w�L�jոx�n�Ӷ[FŊ�U�VL�0��~��[�n1`�RRR�8q�I�d���b�>Y��s'�ϻ}��M��'N$00ʔ)C�N��0a��Hg!�xbcc-�?~<��T�R���;v� ::��[�ҷo_�߿���_N�8��Q�����<�u?
���_�Y&
�S�ݻ�R*˗�5�N�>���ñ��a���T�V-�:�/���?��
�{��\�x�*U�0q�D�.]ʖ-[8w�\�e�����o\�r���P���O�J��p�#F�08&s�����]���1)R���"""�l��eU���b4o^�;!��zV�H�eٲeܾ}��ݻ��z���۷Y�l�#B<������(^�8˗/�}��/^[[[ʔ)������IKKc�…�Z��{o�%�0E����Ñ#G8t�mڴ1y����w�F���O?%   ˼���;v���x5j�ax����iӦO�<x�^��7o�~NOO�P!�~m///���G�~���h߾={���層�jժšC�����|�m^��Ǐ�T�)
*Dzz:�F�	�u����<�s'�֐��Β%Kرc7o����ooo:t�@ǎ��j4�.]��\�dIڴiÀt���k������ɬ]��z��Q�T)]�ҥK����ڵk�ݻ7E�yG-�Od�N����m۶лwo�kZFݺuC)e�DJrr2K�,a���$$$P�dI�x�

�7�ATs���~��Ύ�]�Lbb"3g�d������ӴiSƌ����v��2c�v�܉���7��?�dɒO�ڵk�3gqqq8::��[o1b����uyM�o�ZfV�����)�<��w��ņ
8s�)))�,Y��͛3t�P�f���V			,X��}�����x�
ƍgP��{�7Y&
���~x�d�cf������жm[��ѣG�ʚ�-Z�t�R�m������P�|y���>�2�Z�u�z��m�Μ9��3�-_�<666hذ�A�%�ַo_�L�b�4�̴Ihܸ�^���
���f.�٘��m���F����=M�B�̟?����W����#4
'N���>�=U 55���`V�X��7x��7o�$44�#F�x���_�h4F�%
6D��d�!�xL�&j�Vf�%j�…y�����ܿY(�L IDAT����5k�����cnݺExx8@���3k�,֯_�F�!))���m۶��c�RRRHNN��d����Ϝ9�m۶���BRR۷o���zˤX�����!%%���D���{����7r*�9�i�97�o���/���ܿ_�nk׮eƌ&�hN[%''ӿ�n�Jbb"������ό?ޠ\���o�Y&
��C�R�hQ<��o�����ٳ���ӻwo���t��n�ʂ�Y�&+W��u�deȐ!8::�l�2ƍǟ��F�a��ݺa�ڎ$S<~���/2m�4ƌ��~�����<����?IKK��ɓ���{z7҄���=z��K�.�ܹ����ǏOPP�o���֯_?6lHBB���:|�$%%���Ɲ;wؾ};�:ub�̙���1e��c�~��i�&?~Ljj����x4h���p��F���0yK����(��ʦM��7o����߿_���u�t�V�^ͩS��Q����DGG�~�zj׮MLL[�n��ϸ���Z��A�4m!��S���?�-[֬�W�\�ŋ)[�,���DFF�t�Rʔ)������
����g͚5:t���`f̘���-��=dРAF�"�ܹs���$44�2e�p��
V�^�Tq�+W�M�6q��A����/	c�}��2����$�8M9�Yսf�Ǝ��9t��/�&��ժU��~�:����X����H�,Yb�jr���V�2�f~�я?�����`�p�B�����Y���h�ҥ����h�
���7�|�k��z�.Y�$˼'NT+VT�ڸq�n���DU�j�,�+[���|��S��RJݽ{W�j�*�crssS6l0ؿy��Y���v���������h}�,3s�]v1*�TPP�


����2�����פW^jӦ��UÆ
S�W�V׮]3��{�����W]�~]/��?�P���j��e�����ˠ��K�����m���	�by��?����,�k�sm�|�2��ؠA���4�Y��|}}Utt�^zdd��U�;w68��Ǐ����]��s�t����X��w�ڥWWTT��U���O��ӧui���S����^�z�4K�9���}�X��e�zγ�;==]�<yR���S�f�R]�tQ������/�}3�7��������午���Y3�?�L�ed�(0ڶm˱c��߿?������S�hQZ�lɎ;2d�^��ַ�N���ٷomڴ�X�b888P�J�N�ʞ={prr2�,GGGʗ/O���駟���o��8�+VP�vmqss㭷��~��O?�=arѢE�}��܈���O>�Z�j8;;cgg���}�G��\�rz���n�d*�/����?�L�޽�\�2...*T777�ׯϔ)S8w�����/[����~�…cgg�+��br����q��Apww��������?0p�,�3��=M�B�1GGG������/�֭���<�z�*�Ų���t�h��g��ݻF�EѦi�!���zMԮ��q�̔R��~�:��t
@�:u�q�A9�+W��q
,ooo���	����_�}�ڵ��eI\�wss��侑S��ȩLSϹ1�����}��֭��ŋ��eŜ�Ҟ��5kꕡ=Wɽ7��E�R�R%��R��[TG�&MhҤ�Iy͹���xӻwo��-Z������91��2jݺ5�[�6{������O?�fJ�խ[�-[����9�.��&6e���֪U+���ٻw/[�l���,\��իW3l�0:w��|m��i�ڥ
�=PF���rBa�����zM�Y�&׮]�СCT�P�hY'O��_�~T�^��K�bkk�e��u9::M7v=5��N�#��.S��..{{{��Ʈߖ�7r*�9�i�97f֬Y�>}OOO�5k���7իW�k׮f�hN[i�f�'�y���w�Y&�B�����@@@�N�b׮]�X��9s��>$xxxp���mۆ����u�(Q�[�n���H�%�%&&��!���rMlӦ
۷o',,��m�R�xq�2���Y�hJ)�y�]GY�2e�|�2ǎ�~����ǎ�����8��9=z�W_}U��q=�}�Y2�<yH��!bڑe�d�ic�X���V���\�x�#G��-�o�W��L�B!�ȧ:t耟�7nD��P�bE*U���}*���9s�iii$$$��_���[t���Z;���Ft����i�	!�5�zMlРu���Ν;��ۗ;v���̣G�8y�$#F� **�F��-)ҼysBBB�����������o�sL�6���x?~�ѣGu�G2��ȋ�̹o����i�zγ�;22���TΜ9Ä	t��8�s�J������9��Ǐ9y�$ӦM3(W���,B!�ȧ���CHH3f�0x�}ݺuu?��ۗ�{�G�^���9991r�H�{www�޽K�N����`۶m4jԈ}���W.��mx^|HBs�zM�'O�2d.\`ܸqe�hт�S��Ms�ӧ�w���ի�'3jyyy���ŋ<��Z�jt��-O�2�a*c���e�97Vw���پ};�&MbҤIe�9sFo�WV�i�^�z�k�.Ξ=�{
*<���)&��MF�	!�B� ��蟕N�:1i�$�T����x{{ӷo_�L������Jhh(AAAxxx`kk���͛7g���z�L�=��e�bkkKjj*��?�...8p� ����J˖-�/s���^�I'�ʕ+>|8իW��Ņ…��o�p�B>��s�@)R�e˖ѵkWJ�*���-�J��G�,_�\�}n�3g�7��ΎR�J��{�h�"�4.s��2vyZ��scu��Ǵj�
ggg�^�:ӧO�ub�[�Τ�i+�,YB``��ae-[�d����ʽ7�QO�B�O!<<��={�@�^k�ٳ'aaaF�!
.��6nѢE,]��͛7S�lY���:v���0`��#��y��7666���d��g��ƈ�G�O'�bed�B!��O�>�.]Z�C|XX�N�B���ޛɚeB!�O!�S�rӳm�����ɓ>|8�{�`�̝֭;�`��B!���{�/�,B!����2t�PfϞ
��a�B!D�{o�$�e"_ڰa��C/�
6ХKk�!�(���f���d�!!��c�۽C<���?�Y&�]�Z;!�B!�B����L�+ң.�B!�Bk��2��DDD0w�\k�!�7��?�vB!�B!�!�,��իWe�(�/lذ{{{k�!�xF6l�@ǎ���9�V�?%��Ky�ֹt��|i����A��z��i���УG�d�L!��e�7of����C!�&�eB!�x����f�0�⹢��vBa�B�@!�B!�B��BF�	��={�ʕ+ݶ~�z����iBB�d�2!�5<�k��eBk��5̤�L+�裏طo���ێ=���Y�nJ)�u�F�J��]��"B�燬Q&��O�(B</��L+۷o���0q�D����S�NL�0�
6���,�B�熬Q&��O�(B<Od�2Q ������g�0�Բe˸}�6ݻwץ��у۷o�l�2+F&�B!�B<���L3���_L�4�7�x�
ЫW/v��a��N��0o�<hР�۷g�…�����d�'c��ɬ]��z��Q�T)]�ҥK����ڵkINN��B!�B!^<�Y&���������IJJ�ѣG�9s�q���MMM%88�+Vp��
=z�͛7	

eĈ���g[�/���F��aÆ�6l�F�aǎ�vlB!�B!�xB:˄0QXX׮]�L�2���ɒ%K�F~i�^��S�NQ�F
��É��f���Ԯ]����n�
���ll����Z��A��4m!�B!�B�Y�_Y�O�9��%s˞={?~<5k��nݺL�0�?�P/�Ν;		�L�2T�P�ɓ'ӱcG�o�Nǎ����ٳ�+W�`[����!�B!�"�Hg�&�r�
u���K�[��AޫW�`����=ۺ�޽@�"E�iӴy�B!�B�{��L�G�iG���H��d~,���M�y2��~�۵e*d8SZ�f�^!�B!�B<�,�D���\�p��Ǐ���ҏ?n���Ã+W��m�6<<<̮�D�ܺu���DJ�(��-11Q�G!�B!��K��D-[�`��������cN�8����
�h�x��ٙ3gHKK#!!����???���uy�#ĴS7*W��;�3#m�6�B!�B!r��,�D={����������7ۼ}��e�޽���ѫW/�mNNN�9R���ݝ�w�ҩS'<<<ضm�5b߾}�����@�&Mr�B!�B�##�D����+svvfɒ%P�X1���T��~�)�����������������Ѽys�/_�7*l��є-[[[[RSShݺ5...8p� �����&�G��j�666��B!�B #˄0K��ř4i�^�͛7(Y��^����F�bԨQٖ٪U+Z�j��V�pa���X�t)ׯ_�lٲ\�~�cǎ1x�`\\\��pD>ѱcG�lْ�!�B!�B�=Y&���6m���7n$))���t.]�Ĕ)S�S�N��קOJ�.MXX�.-,,����`۲e��CB!�B���2�\���˓rccci۶-7ndƌ̘1Co���;�
��:����<y2Ç�w��lݺ��s���䔫u	!�B!��	Y&��ƌèQ��Z�*NNN*T:u�DXX�n�dn�e�С̞=�ٳg3l�0���uܿ��c�R�B)_�<�Ǐ'%%E�'((V�Z��oxx8666t��Uo���놙RG�N�8A˖-)\�0%K�dȐ!���?zyoݺE���)Y�$�����ٓ���_zz:�&M�r��8::R�H4h�w�}�T�&�B!�����Er����ӳgO�ZM��a-={��M��>%%�&M�}��[o��/��B�B��w��������������իW�Y�&����8q��ŋ���2�@�V�D	��8�%K�p��=|}}�x�^�v����?��'�ß��Ѷ��/r\�O!�B!
�XY&�f��/����~��=z�G�q��I7n̯��Jhh(ŊcŊ$%%��{�F�>}HJJb��帻��u+�t�M�#�ʕ+s��94
�Ǐ����n��ٳ�x�">>>DGG���C���G\\�AY����������…�7o^.��B!�B�?�Y&�fZ�~=k֬�v�����Q�Z5�/_��իuy�x�
F�ɾ}�hܸ1{����?䭷�ʵ:��͛GŊqvvf�ȑܽ{W�}���,^���_�6m�7�|cP���+s��a���ܾ}�!C����ҥK�4�B!�BH�Y&�f:�<*TЭfcc���'N����k��FTTժU3x@Dn�P�F
������麴���
��״iS��fϞ���3;v�࣏>��^#$$�F�c�B!�BQ�Ig�ȗ2v�K^�x���g����ʘ���l�MaI�֣��yM@{{{��ݻw�넆�ҨQ#���W^y�E��tB!�BQ�Y;!2jܸ�n������e4�|��={�˗/S�\��7n'N��^�z>|�O>��/��2�}̭�+V��ɓ�߿���~[�e4���;����_�~>|����3g2j�(���s%&!�B!��odd�B���w� ((�#G���cnݺ�����
o��.��ݻ���/iܸ1�iӦ|����޽[�G;
�ܹs�a�=z0x�`���ϣG����a��y�������o�!99�Z�jQ�V-@�B!�B<olT�8B<C������S7-L�^�� ((���0��eXX������s���}\\\����N�:ܻw��5k�������)_�<�/_�V�Z���q��	�+��/���۷(W��/_6����-��<s�ÇiРG���ףG֬Y��w���Y�`˖-95�B!�BD�2�L�KJ)y�˪����,?�-ʡC�1b�ʕ��Ύ�ŋӱcG���t�XC��?�`޼y�/_x2�r޼y\�v��C���_S�B���x��Yu���ё�{�2d�^z�%�ڵ+�/6�;x�`�.]Jݺuqrr��ɉ5j0v�XV�Xav�B!�BQP��2aUY�,�_KamG�{/�B!��$#˄B!�B!�В�a
aegϞ�r��F��_�^��B�v�,CB!�B!^8�Y&�}��G�۷���X�mG�e����[��ݺu�R�JԮ]�
��ܔ��FRR����$''���̃(Y�$��ճv�B�B�>E!�BXXX���
!��,Š���g4���L�8���@<<<�ԩ&L`Æ
8;;?�0��RRR�9s&�����ѣԩS���D4
< 11�������,��믥�L!��cǎ�aV��d���t������般�e˸}�6ݻwץ��у5kְl�2�SE����İa�X�h��7�w�f��Ѹ����쌛����8;;S�H�)���3������ot�ڕw�y�ڇ�s��U������9S�~}����F��t�B�.]��B!�H:˄0Qzz:K�,aǎܼy{{{����С;v�˫�hX�t);w��Ν;�,Y�6m�0`��;�2�Krr2k׮�^�z�*UJ��t�����v�Zz��M�"E��Qs�,Y�7n0�|ƌ��ÇY�j�����`�jԨ����3�4g���
!Dn�iHB!��盧L͟?��+W��?z�'Np��	���]�Bjj*����:uJ���͛������)T(����/h46lh��aÆ��İc�:wG'r���
|�M�6�G�ԩS��ΠS5�-[��ۑJ)k� �xN�5�
Z�B��E����2!L�i�&�͛����=b���̘1�u���:�V�^ͩS��Q��ƍ��ۛ+W�BLL[�n�cǎ����Nz��A�V�j�6���YVԪU���X�λ�ː!C�3gNNNz�Μ9Å�x�"�/��^��^�уB��fBK�eBl�Y&
��S�K��5�\\\��>aaa\�x��͛H``�^��;wB�2e�P��'O�cǎl߾=�FgϞ�\�r�ʗ/��G�...|��nݚ�r�֬YC�5ty~��GJ�,ɵk�3fIII����ꫯR�V-^{�5�ׯO�&M�ځ&k�	!,���(ˉ�a&�B�x��L�1�)S�ETT�|�
���'((Ho��իW0Z���m=w��0�)�M��G`` ��գgϞ����̙3���`���w�y��˗p��%���8q�qqq�]��O?�[[[�ԩCӦMi֬M�4������a&���LCB!DA#�e�@�<b�O�lժ����ݻ�-[�p��q.\��ի6l�nZdN�;ݿ?���Q��k�M�5T
�r�ʱw�^�L����v���Y�8t�|�.߫��ʫ��J�ti�o�f����߿��;w��W_O�z���ۼ���4l�;�����fBS�J�u��K��vBQ�d�ʸ€��,]���+WҧO����3g�.���۶m#66���m%J� 11�`�6M�G<vvvL�:�]�vq��a*V�HZZ�Z��v�R�J�ܹs����Ν;lڴ�F��a��5kFɒ%�޽;˗/�֭[�舄B�����}������?�g�&%%�ڡ�%����e
�~���up�BdO:˄0Q����c�ƍh4*V�H�J������kѢ�Ǐ�̙3��������_����n�����v�&@�ʕ�r�A�4mQp5k֌cǎ�����OѢE�ڿx��t�Ёy��q��yΟ?��ɓ���2deʔ��חI�&IZZZ�Ba���t�ݻGtt4�1͚5C��X;��ʠA��w�B�G:P[� IDAT˄0Q�>}�1cM�6�A��?��u����ۗ���G�^��_�>�[�fժU8991r�H]^�zS�:u�}��4j����x��iM�4Ƀ#�Z�%���f͚5O]���#F��_~!!!�m۶�믳j�*6lH�R�

",,�;w��B�B��š#Ie�0�RJ�ʭ[�ظq#���
111���X;L�e>��^B!
�,�vJ�ԩS'&M�D�*Uppp���ooo���˔)St�\]]	

%((lmmqss�y��,_�\oT��ѣ)[�,������кuk\\\8p�A��Օ�-[��gF��������;��7�|åK�8}�4�ƍ��?��������L�1��cjZ~�-��RWDD�jժ�����舧�'�������$ΜXs��L�O��ޞ�_~�Ν;�j�*V�\i娄B�,�,�^��C�q��!֭[����'W���1j�(�m�Ftt4�w�f�������kժ[�l!::�_~��…ıcǸ~��.���9v��z����%�V<7�T��G}Į]�HHH`�����d����۷i۶-M�4���̙3<x���T�]���O�v�x�wHJJ�j�֜b%ӻ�+W�0h� ���ptt��Ã�={r��)��-Yo+66�.]���K/�@;vl�2�J����y������K�6mJ�%����dɒ���;�ݻ�hy�ϟ'88)V����L�2%��[s��i�[�9��;�9}i��vm��+W�p�º��%�K!�Š���T�_���_T�F�k�N͜9S�6s�Lվ}{��+F��

RAAAY�<��јSSSխ[��ƍ�+���5~�x+Dh���+?��۱啬�u떪P��T�2e��ٳ�ɓ'�F�Q>TgΜQS�NUE�Q�j֬�z����	k��)u*,,,��MA�ט���+777��rrrR?����>��f|9;;��_�|����5��N�:��F�����jԨ�������֭�el666j۶mz�����F��ʗ/�nݺ�k�f	s�3��;��Ɵ�vm�o����[�n�%� x�'B����2�\���˓׳�����ɓٺu+7o���͛lݺ�ɓ'�������y#SDV����ŋi֬'O�䣏>�Z�j8;;���@�ʕ�0a��X�b�۷�E�Y;l!�{�.���$''3r�HΟ?σ���d�����d0zKY_+��a�}����K�.1x�`����ҥK�����~|||8z�(3g�4)���t���/6n�H��������̘1�#G�P�zu"""�h4���E�
PJ1m�4�}F�Irr2�󤦦��hسgժU����zKhX�n���>s�AeZ'M��i�ϟ�ĉ$&&��_X|l�/!�x&��I'��=r���7O^��F��F����íNjHF�Y��y��e5p�@���T�ҥUPP�:y���0��X}�V����dɒ���^U�PA����U���Y���F�eggg��jΜ9�I�&�x�����V�(QB�m�V�ٳ�hy�ΝS�V�����A-ZTխ[WM�<Y����F����,al����O���Ĩ-Z('''U�X1վ}{�ey�O�V�{�V�K�Vvvv���G}��WYֵ�~��^zI%$$��E��j֬i���{O�)SF��۫2eʨ>}��s���x���3���.]�(@
:�h|���
P�*U2��6���śYHH���Gʎ92��Z������N��?��6f���DZ�֍�Ȕk}�B��رc
�,W���o��f���
P...z�NNN
0z͍��W�d䨖��f�q�۰�>K�!c���t����P�/6�fɱ�{�
��~=�wX:˄U=Ӽ��I:�����?c�ONR�5���(���/u��!��~��G���l4��ӧ�kРA
P'N4)ޔ�u����C��~�!˺.�v�ܙ屛z��|(7�ݹsG�*UJ���t_�vM���+;;;cr��6΂�a��śY�F��n޼it�ɓ'��ի�e���S�˗W�jݺ�z����v�uq߾}&Ǖӵ^{Mmٲ����7��Ǐ�ͨbŊ
P
4P�W�VW�^ͶK�͔�2����)���!c���t����PgΜ1�fɱ�{�
��~=�'�eº��L�W�Yf��gBB��ȑ#���ՃTdd�0`�*T��*Z���q�F��j����ʋ/*GGG���`u��%������߯|||�vrd����4u���a�����d��<�ƍS��^�����P�F������(ՠA(�}��Ο?�RSS�F�Q{��QժUS�2d�S�۳�,�o�U�VM���*""B���?j�޽���[�m۶z�ܾ}[-ZT���/gΜQ>TG�U-[�T���F�Ҟ���(��WJ��7o���С����W>T���C�
P���$-9ά�L)������ꫯ�:����U˖-�&O�lRݙ���-�����M�)V�X�et��U���Gݽ{�`���޽{&Ǖݵ��VTAAA
Pnnn����F˹p�ںu��0a�jٲ�z饗���l�2�c���T}��U���A���f��iϓ��S�O�Y��?��ʱ�{�
��~=�'�eº��L�W�Yf�ߧL�y"�O�ɸoNi�-���`���w�6��r�ԩ
�w.=z�H�ٙ��…+@%&&=fSh;Y[�h�������-Zd�n�g�2��i;,��1�͛����<������a��śYV#o�]�����o��)��T�B�
)�`�YvL�T��O<�h�h�ڵ�o�z=ٴiS������Յty-m7S�+3K볤��1��-)��c3�|�z"�N:˄uIg�ȯ��̼�O���D~���qߜ��[l'N�0���}������~��W��o޼�h]�N�̝\�W���O?�dt��?��U�n]�tK�3�~�Yz��������Qs��U...���E�={��3�)HZ��Y2�K�ԩS���E��ب-[�d�O;�<7F�ev��]OF�ii�=��R���8q�Z�t�ڲe�:w�\�e_�rE�������뭹׾}{]K����2K곴L�,KOO7����|��A�L;_EA���;l��P׮]��x�mذ��� k�Q`�:u
�l�?>�m�
�������f�lmm������ԪU��T��������ĩS�X�`���4lؐ��h�T�b��ŋ9y�$111DGGs��1��7�~��Idd$�����更oߞv�������햹�ܔ�b���1H+\�0��|ft��i|}}�����o4��͍{��LѢE-�S��������t��sf�gv,=ŋg����J8�|*U�dr��z|||8r���M�6&�B����h4|��d���ۛcǎO�F��{wU����.(�@"�Kb���K��.���(�*WBQDKE?���Bn ��KZ��LTLD1	4�l"��91�3�2 ��u�u�9�9��3�������e���?�ג'<�رnnnR�J?Q������2�255Ō30c��/����#G�ܹsbU���T鯪�AMMM#??_����{��B�(���R��EDT�$%�%����0a��� „	гgOu�QodggW�ݏ?����0�ȑ#hѢ�L���\@�&MT�hjj�y��ppp@pp0�.]���lxzzJ�;p�,,,`aa�Q�F�믿FDD���o��>}::[[[q۟��]�vaܸq���Djj����׭&յ�5j�pۜ�������Z���]2Q����p_EEEr�.o�MS^^��ʌ�"U�#G�Āo��6�͛W-1Q�6l������M���F�!�}���HHH�رc�|��
��߿?   @f_RR444`ff�R�{�� �G���ԩSe�oܸQ��ŋ��fff����7d�qpp�٦�uS�*��r@CC���vɿ����2�+�<��M�EDT+Ի��:�]R}�4̊^��#�.���w��mu9��K��?y�D�1Ϟ=�{���תU������BӦMgggq[���+���y��7E����*?����b�@r�z�H̒6�)
���[�Ç�����˗//^�Μ9#̞=[��������W���9rD XYY�<QX�?��C|��ҥK���L!//O8}��Э[7��r�J�c*z��|�R�{����_���a߾}�~�\�Ν+dff
EEEBRR�0u�T��4�OOO�еkW�ԩSBnn����K!11Q:t�@�0aB��[e㪈*��r��;��Å�/_J˗<t�cǎBdd����!%%EX�`��Sy˪hܪ�M�U_����5�H�8YF�'�*�y��;q�R}�x�B����W�������@�x���Wv�LOOO�&y2�;d���_��ou��1()�-��u��	��[e�%�˛��/{��˗B�v����J��...�6;;;(�f�/��"�}��Jǡ��z����.]��ٳg@�C)�=��eu����}}}�	�үm۶I���g+{� hhh�m׻wo�ŋR�9��駟J���_n�+V��"<(�s�k׮�gbb"ܿ�J׭�j�>�rA˽�qqqR�b�_��Sv�ʎM��U��'D
k�Q�eTױ�Yņ
���k֬����-��KXX&M���Ç�ĉ�veS�]�����:9III�޽;:t���+US$�^��̐�����$t��M��RT�n��.�V�ѣG#::���:t�L�;???�ǽ��{<x0"""0i�$<xr�>|�~~~�����ŋ��C�ŕ+W�a�2D�vPqq�����:L%)V� ��)R��-Y��o���ɓ�s�N��~���9��ݫPߤ^#F���kװ~�zDDD 33x��d�<X��*��fΜ�N�:aݺu���F~~>������%K�@OOO�s������z�������'1k�,���aӦM�u������{�a������ѩS'L�6
;v�q���������q��ܻw/_����F��/��mڴ��u�*e�S�:@PP�Ν���H���?h׮�����QQQX�j"##����w�}+V���~�ٳg���T�_DD5MCj�:0Q%.^��͛7�;"����W,x�������Y,�^������ѭ[7<��ڵkaee���h���b׮](..F\\lllG���ѣaee�K�.�.�Ν;�޽;���,]�_|�

��?�7n�ʕ+���##��"/梢"<x������իQXX�}�����ЩS'���`�ܹX�r%Z�n���d�_�^j� --
�����K����]�v�w�}���!99�/�ɓ'1a�����|�*We�+o[]���c�����o###C����ѵkW�������O��ӧO�����ѣ�����[oaѢE>|8LMM���Kܽ{���+���<z����X�j�x�Çaii����=k׮Eǎ����e˖�ȑ#000�͛7ѡC�*�(�%3''���3f��������;u��
###$%%�E����;#��Ƙ1c*�l�����~_�Էx�����	Q��7""�K�4LA`� ԏ�yǖw��[e�����ae_{��𼉉��-便�%x{{�=��ѣbM��/===��Vx��(�J�����S���D���N�<)�GDD����!���BVV�B}���>�!շx�����	Q�ƚeDD$���e�PR�|�̙B����Y�f���S�Nɴ-o"��_�/\� >\h޼����+�����W_}%ȴ��zzz����0y��r�K�޽[������M�
�
~��Aq�eРAR�<{�LX�t�`ii)������Bǎ�E�	�?��u+=.U(;!U�c�lZZ�0k�,���H����v�*���(tނ����_6l�`dd$����5:w�,���				��ƍ����ط���0m�4��͛J��������
&4n�X����|�M���޿ɓ'�y�����ܹa�ĉ
�-��>��X��%����'D�Z�0��?���;wVwT�)��ID$O}KC�o�Q����z-��X���;w��ɓ���������N�dQ���aÆ��Qw(DDDDDDDu'ˈ�M�6�;""""""�:��eD
Pqq1���ЩS'�Y�������������N�dQ���C`���hӦ
<<<�Q���2���ݻ�w�y7n����樈�������O[�Q�s��6m�7�xcƌ����#>>ZZZ������pvv������ ""�Z��2���ݻ077�߼y3����m�6|��gj������SwDT����S�!��8YF�����S�N�]�t�����ɓ'�M�6j�����pu�@DDDDDTc8YF����`ĈRۼ���w�^,[�?��"��`�ĉ����V�󎈪"88NNN���T��2�(55;v��֤IlذS�N��������UNNN�58�e��T�������
8YF����_��͕�,�)S�`ǎ���p��%�#OR.^��͛7�;"�g>��s���W�a)LS�Q�{�.���Bf���6oތ���ڵ��#����WFDJ	ǃ��R������{�.�abb����իWq����f�����͛�3\���t8"RW(+NR� >>^͑@�R��Z��ݾ}]�tQ�������ի��Q�8YF�ܼy/^�����\��;w��Z�BϞ=1q�D����ΎeDDD�V�-���4�x��Ulݺ� �4i:w��j����^'�,#j`$�0Ϟ='��ϟ��ӧc�ʕj�������\��Ο?_�~_�x�+V`���022�;˗/Gxx8�t~""z=q����ٹs'BCC���۷ׯ_WSDD
Gu��D�LO"����BI҂����cL�<Y�6e��߿AAApwwWctDDTWq����i֬�̶�ݻc���j���ᨎT����ID5�ѣGضm������333L�6
#F���ӧO#<<���(((@�֭���www������S�N!##:::�����ѣ1f��\��S���N�<�իWK���~����1h� ����L(*O��i��Wt,999

E�=жm[q{�v�`oo���PL�:���*����^O�,#"�����999�#Q
�j*QM���$�����S���"++Kܖ��ooo�z�
#G��{��� �-33��������ի[�nŞ={�6/_�Dbb"���ggg��)���W�^ņ
`kk�v��!33���h۶-�-[&���ģ�'O�D~~>d������X�:u
�ƍSi�DD��TwD�~VVV���T-���~��Wy�I�?FPP�##z}�޽YYY���ġC�p��|�������r�ۿ?��ɨ��(\�t	;w�DFF��:زe���q��xzz8�t��$���^���X�j��������b�\�yyy���AӦM�[�xJ������Wt,QQQ��]���/�&iCDDTW����ЬY3\�~}��Uw8D*Q4�)''���8s��<y�֭[c���={6�4i"���2��7"!!zzz4h�ϟ/���J*��k,^��;wƎ;ʭ$o{e�.�o�'���?����/�,YSSS%��^^^�q����[�n��_ŝ;w���� 77���HMM���#Ə����K�O�v��ѣ����O>�����2e
�{�r��J<�{��m@�d�aff&Ն���4N���T̄�u�A�EӜrss��'� 55Ul���������"00P�$����ϟ


��O?���X�E�:R�6n܈���I���<LO"���(�p���,,X��nݒ�'������j�*��� &&۷o�̙3���F�)ݮ4ejl�� IDAT,Λ7�/_Fbb"�����g�U�^�x�=��ӧ w�_�M҆���4�a��T�k׮�;"�(��g�������������F@@�������]�vɜ�C�8t����0s�L�ٳg�UI%�077GTT�X��:�]^�LO"R��g��ϳ��*��a�ܺu�۷���V�\���0�vC�����
oooX[[���۶mÈ#��O?)ݮ�T%E��\{MM�_y$�T�?DD�z�d���q��
�z�JݡP=S^��ׄ�iN���B||<~��g��d����VVV��с���X��̙32���)����Ub����~�J���`������Ə���x=zT��]\\���[c㖇�ID��7�P��S111J&��ϟ/�R���H��iӦ5j�g����";;7n�:F�v�����KKK���b�֭�S�x9�U�V �.M�M҆���4N���ɲ��<��3OT(�攞���^ڻ�+u��,,,į%������m��χ��bbb�i�&L�4	���(((P8~�䔲TM���DT[������Cff&


�a���ۋ+A+���B$''c����vɤ��ѣaoo��"??�:uB�Ν:::b{E۩"..!!!���A`` lmm��~�ƚ<��#Y������|6�����/٦��'��X���ݺu����_��8�R)B_Ӫ�FSz�,y���6d�����ΝÑ#Gp��ul۶
���üy���Uު2A�>e�We�LO"�3f�@DD��GI�5kV��9::�ĉ�������d888���k׮���/|}}����ڊ_+ڮ��VK����^�������)S�r�J8p@��h�O�>�رcadd�cǎ)|l�>}p��y$%%Ɍ1))	��W8F""j���������ҥ��S��h����1���|odd�R�՝�$����������]ӓ����Z��Z�BPP�CCC���k׮X�~���zK[�d	�}}}���[�nX�nfϞ
�ߚ�cǎ���7�~�m���BWW�>}:V�Z%�O�v��ţG����!~�����?���R6�ŋ���ZZZ�
=v�С000@dd�L����hҤ	��؉��ŕeD$b��������P���a�ڵh޼96oތ��0�o�^�����]�va�ڵ�ꫯ`ii��7obݺuT[a0z�h������#F�@�N����]�&<xSS�
�)YIq��a�7r�Tt���ҥ233���&3)��$��ell��k�Vئ�d���a��H&�$F��Q�FU���Y�f��Y�Ff��~�?���s*ϐ!C0d���mܸ1������t���(Iɿv����d��LDDpe�bmm͕eT/͘1�Z�Ӝ���+>5�t����+LMM�����3g�W�^�9s&���/����O�T���+������C�޽���@6�(YQ�PwY����o���>&N���͛�<ny}K�(IR�Jcz�.\]]Ѯ];�ۂ��add5FFDDu'ˈHdcc�?����E��^�ZM�FCC���Ԩ�t���h����!���0q�D�m�ZZZh۶-�L��]�v���Q�T��,X��ǏG�f͠���X�B�q���ID�������G�EFF222p��Q����Q�F�����(�a����
p��u���_�s�3G�� �Q�Is�f͚����+o¯:S���C__������"��7ӓ���������;������+��DDDW�Q)���hӦM�R1�9R�QMbz5NNN��o��7�`ʔ)�����8�,#")���,�O5��޾F�[�)��Iz�_|��S��=�͛73=�����,�,#"���������8{�,BBB��兂�����444�w�^�cCBB�����'J�	+[7�tzzz033���q���<x07n�֭[c�ܹ��˓j�����3g�u����ׇ��3rsse�W\\ooot��zzz044D�޽��?V��J�'���1=�����<�,#j�


п��9�^��ڵk��'OBSS۶mCdd$>��3|�055Ń����ܹ���
����&�Gi���Ǔ'O���رc^�z��g�ЧO����DŽ�� ;;[�OOO��?��/,,DLLbbb������p�HY\Vw999���I�a�	�,#j����ǣgϞ℔��=lmm���������OѼys�޽�
´i�p��i���";;D�- ����t���}���;��?���&�Gi]�t��]���ob͚5X�f
~��gq��������ر#���acc���1��4�1��������B�ݻ���زe'ˈ��\���8|���� ""�Z�4L�.,,��~�����
:::pvv�۷Ol;`�,X��ϟG߾}q��9|���4h�R}hkk����v��Cb˖-�ԩ�`��ӧO��_\v�܉��{����ׯ�o�.s�&M�6n܈�[����ǘ;w.A��{��NDD��L�0&LPwDTM�0������TĕeD
ܝ;w���R�-ZHLL�ھv�ZDDD &&����U���}�;�#~ݲeK%��$RRR�{��:�_�~2�����̙3q��)�:u
+V�����ϟ�J�'"��I��"""jX8YF����������+]������խ�I�g�tO��ёi;y�d:�F@@������???�]�s��QhTB�NDT��󎈪"88�5A��)N�5pfff�}�6�߿�:(IW��������˖-Cbb"z�聸�8,]��6mR����ԩnܸ�.`ذa����[�h�3f`ƌ����O?�����c�…�,SP߾}�ʂ��ֳgOu�P%cƌ�/�D���'�;"�N�5p�1|}}���-[����
o��&233��������̙3�3g�`ӦM�۷/Μ9�A����ȑ#1`�%���:w�\nYYY��o���'Շ��L���˗���
{��E�޽q��U���ɴ���@jj*�m�X[[�i��W��źeDDD
'ˈ8OOO>|�.]�����>===|��7�gϞa���044�޽{����ݻw������HLLD���ѦM<~�]�tA�p���
�000�P��ŋ��O?��ի����S�L��۷��zxx`Μ9pww����Ծ��R�.^�(>���HQLC"""����eD
\�f�p��%�^�?��3���ѴiS�������.�����'v��
333%�[�l���+�����^^^x�����
��ׯV�^��ݻ+���Ν;OOO<x���=z4v�܉���K�uss������{ܼyбcG|��G���/�p���u∈�Ú_%?~����?����˗/���$>:>>������9�d[e�3��v��mt��E���]��h[�Ǘ����f͚���nnn�ر�J�.{�T�5,,L,}ѫW/��k��eD�-Z`ӦMR�dž�G��߇�� $$D��iӦaڴi�'O��ɓ�C��&b�moڴ)�mۆm۶U�v�̙�9sf�}Մ�˗������Rc4�ۢE�p���z5�W]����gϞEll,���SSS��Q���իغu+8A0i�$t��666*������d�ecc��Ǐ�;""�z/!!�}�v��١��>>>���2�t��yu�P�J߷��bddd���W�^ŏ?��իW+u��^�/^`Ŋ?~<���cǎ����}}�*������TwDT7Y[[�֭[b*%QCT��]]짺b�…�p�B>��HI����;��455�pR���&LLL��/_�������c�,�)S�����

��x��j
'ˈH.+++�5���E���
��Ou�(I�Y�d	/^�-[��ڵkU>/Iמ�ѣ��}�	6�)))pwwG߾}1p�@�[�/^��:�'O�z�j8X�|9���������q��	���������)n���ǖ-[0j�(���#G�Ķm�PXX(s�G�a�ʕ4hz��ɓ'��Qބc�����ӧ1g�8::�W�^�裏���'�����cŊ�ׯ�����O�<��(3fy����С���R�+�]?������q�F�?���� 44=z�@۶m���ڵ���=BCC�����8���2�a�\]�t���>�_�.�'jHj+է*�TG�L�!�[����I������O(..�����	��3g"==]<��~C^^^������իW�a���ڢ]�v��̄��/ڶm�e˖
1g��?�edd 00IIIغu+45K�&���S���J�iKII���7^�z��#GV9��۷#  @j[ff&BCC���-�������H%D�F\\���ѤI�}(3��Tv�+s��}@�V��m�^y<==q��%%�%$$EEE����<y���ppp�9�����8u�ƍ��8���2�,#"����Э[7\�~]ݡP=SY:�-L�!�Y�kN���WZ;�C�8t�����Ӝ={Vܿw�^����}��ؽ{7������;w�Tx^�g������!V�Z���<x{{���+W�D^^|||дiS��}�p��M���;		��˗�����ѣ�9w�ލ��,XZZ�СC�p�>��c@``��W���W�k���`{zz"**
�.]�Ν;@�+���ؾ};������c�޽�̘+S�=.OQQnݺ����
лwoq�"נ����?���!22R�7�t\QQQ��]���&�&iCDT�qe����Z,JLT�����N�BFFttt`aa�ѣGc̘1Rm����������hݺ5��O?�T�#T6UP�8�"1U���ӧ���d�u��ptt���;*<V�1���L�:���J���uW��nW��������Cggg";;[���9��e�Э[7���-�.]�/��B���ѣ����O>�����2e
�{�=�MDD`�ڵ066������cƌ��'�Ϲ�/�,Y"����K�UT��p�A��[��믿�Ν;������ʴ���B�=�����򂻻;Ξ=��s���C�1W��{\ZyﵦM��O>�W�ȳt�R���f͚���P��TI�LIhifffRm���;N�Q�������?�;�Jmݺ{�����%������<��Wu��TWL�T%�F�12��������*..�=|�@ɿѥUV2A���y������HLL���9>��3��<�5J��)))�������5%++,��[�d�	� ������5���<ʌ�2����hii�e˖���ìY���y@�k Oǎů�5k&�ӧO@�P$�$m���;N�Q�������S<|�o�����!*סC�[�l���=^�|�'N���'�J��,[�HKK�ڵk�4�1c� >>^�e��T^?��iF�	


$&&���M*�Fޱ��P<���eD��~.T��4�k


������ �ڵ���&_J�d�7���-9F��6l��[�о}{|����@�n�0q�D����$���V�qUD��[@�4E�S�^y*{J�$VyT�lS�~�U�,#�rI��z��uN�Q�j2IQ���Epp0RSS������c���R�3���b��*�4ʌ�)5D�O��푚����]jUhRRR����#%%����y�&�n݊����������cǎI�n��7���)��<yyyb�}EWk���(��֢E@jj�����Hj2�ƍR+�\���ږG�1����@�Z�Bff&�?.�p��'s��NDT_��?��y���С�]���P�*4�|���!&&�6m¤I�����v��hJ��L)�FS]1ɓ���iӦaڴi���q���V7(3F���?Æ
P2!�� ̄��7n��5k��qqq		���
akk������п%��������+<y��}����1g��m�>}~~~���DAA6l�{{{��?q�����x��RSS���+�d�䳮���h"99˗/�����W_!))	/_�ĕ+W�k7hРr��2cV�ʮAEׯ2�Tڴ�4�}�m5�nKDT�����*�"�T��LGRԐ!CЫW/�;wG����ױm�6�۷�����3���b��*�4��G1����pqq��ӧq��m̞=[�>t�P���=�8>>999��񁁁V�^
mmm���`ʔ)X�r%8CCCL�>�ΝCBB\\\��ӨQ#,X�@�~ƌ���@BB>��#���f��vttġC������o���[�h��O�b�ر022±c����'N������2�$''K����ӧO�jӥK�
kI*3fuP�Ȼ~��ӧΟ?���$���J퓬l|����6"�:�+ˈ�B��ָ~���� �TӦM1j�(`Ϟ=puuEvv66n�(����;v���2����Z�I���4����ȑ#���{�2c���H�gJcJ
��$?_�AWW���?~<Z�h]]]<�Z�.���G����CL�666���?~,��jҤ	���###hii�iӦpttĮ]��V�j�
AAA2d

�����]�b���1b��n��?~<�5k]]]888`Ŋ21.^�&&&���k�-Y�C����>tuuѭ[7�[�N�L<p��9�-[��C�BWW-[�ĤI����==�r��2cVE���맨�C���@��YZdd$�4i���W}0DDu�@DT���pAKKK���Uw(T˂����L���<vvv���]M�&cԨQ����.���	����o��&���	|��n˖-����0c��֭[BQQ����%|��������&������섴���I^?��`gg'?~\���[�n	S�L��'O�=V�1.\�P����\�"��+W;;;aѢE*��H�\�uM}����m߾]���>|(n{��`oo/���j�����	Q�ǕeDT!�z�
7n�Pw(D�ruuP�*�_�~�ݻ��ʢt�����aff&�����C��޽{e�h$�sƎ+���:c�׏��#���pqq��!���\�ʌQRKH^ap��QY���h׮����m���022�IO%"��8YFD277G�&MX�V��Hcǎ���7�~�m���BWW�>}:V�Z%�S&��*�*��T��"y�*3F���2���ャG�"##8z�(|||ШQ#u�GDTmX�*�����ݻ��?�y�F�¨Q�*m״iS,\�.��ݐ!C0dȐ�I^?���X�v���z���clܸ1������t������q��5��������sQ�bggwww����͛'S🈨��dU�E��^_���8~�8�������)5DDT1'''899�;"���2"����5BBB 444��S���5r��J�T&��NC�
IJ�_|��S��=�͛73������$N�Q�����������㭷�Rw8DT͘RCDDDD�/N�Q��w�MMM\�v��e�����J��e�RCDDDDT��eDT�&M����			����Q�	������ ""�Z��2"R���
��Q�s��a>|X�aQ-�d)�{��ؽ{��� ""�5� �;"""RN��Blll��ボ��;R��'�;"�Z��;"���?�}��UwD�Mu@D����A`*ffjj�	&�;"�G&L�SSSu�����p����;"�������u�AD*��2"R����5k��ׯ�/d
T߾}y�	�b�Hi�����+ˈHa666HHHPwDDDDDDD5�+ˈHaVVV�|���àZƚ=DDDDDԐp���fmm���@�z�
ZZZ��jk�Qu��5��۷o�K�.R���������Ɲ={G�ō7������~��ѣ_�Ut+S�q*B��zu�\���!&&ЫW/�A��5��2"R���5��򐒒��jDT+� IDAT�~a�2"��kѢE8�|������|xzz�ҥKR�������@x{{���Q=V��r��8�^���[���&MB�Νacc��Ј�p���֭[7hii��,#""R���ϫ;�Z���K�.�m۶�;w.���f͚�ѣG8t���ك/��?��#�w��p����[&�Q_��/^���+0~�xƎ��˗#<<���j��������ѥK�'""*���^��8R�ŋ��-[b׮]9r$Z�l	---����9s��իWضm��å�PPP?~�ɓ'�ۦL��Ǐ#((H��QM��2"R����]���0���ꍬ�,l޼/^ċ/`aa�iӦaٲe�W	���#  ���Ѻuk>�~�)tuuH׭R���MLL6n܈_~���ژ8q"�̙��ϟc����p�tttЯ_?xxx�q���9N�>���p$''����[����#���a``Pcc�cǎ�N���m���I� �~�m��999�Ǚ3g����n���ٳѤI�k��7"!!zzz4h�ϟ�����ƍC���q��!��G������B�����_,^��;w��FU����兓'Ob���1b�����~����1h� ���P�^��G��m�6DEE!77fff�6m�T��]z{E�cE�o��׭[���ϣQ�F�ׯ�Ν�V�ZUx}sNNBCCѣG��_�v�`oo���PL�:����G��q����bmmͿ�)(//�~�)>|(nKNN'�J+,,Ĝ9sp��Mq[FF�����[�BSS�Đ
6HM��011Axx��gAA�?MMM�\��}�vH�+33��������իkt�����>}��;�ƍ�O>�ږ���O>����Rq��� 66���2/nnnx���x-~��'���������CBB����c�����={�}��*�Ǎ7"''���@Uxzz��իذalmmѮ];dff���m۶�2�>}�������ۦ������^��ȑ#����7	///DFF(�;|�0���,5!Z�2c>y�$������ s����ԩS7n\��MDu�0�H)666���?���Su�BDDT���Ç066F`` ������/wRd߾}�y�&�y�����������
bccq��Qҫu���^u��������ҥK�3g���ZZZ�駟�ٳg.\� ��~%�/QQQ�t�v��	�$EM��<y011Qh�{��Ajj*LLL�x`ll����ڵK�:�СC����̙3�<��8r��q�cN�8?~��c�077GTTV�^������{IbժU��˃��7����r�J�����M�6U:�ݻw#++���8t�.\���?�X��V�8}�Iܾ}۷oGtt4abb���t�ݻ�ܾ�sTT�k׮2�l��!��'ˈH)VVV�����۷�
�Z�79!o�d����VVV��с��-�/_.sވ��ڵkѹsghii���>>>���Q���':u�]]]899���,[�:t����N�
��*�d�,..������_��w�a���JVoI��X������J�W^<���⊪3g�����SSS��������
pttD˖-��/_�����mۢ_�~J�M���E&ݱ:���NNN������'��ʕ+�<y2�{�=��2�^�x�d������^^^�����?�\-1+�~����B�=���+++xyy���ˣ̘%���С��y��̤���i�D�cccdggˤ-����4���+����V���F��{����*�R�I֥�������T���,,X��nݒ�'��uM��m۶x��!222`nn.�� ��˓J�KOOPRB�4I|����yJ_��+�$���6F���� DFFb���t��?�ٳg��z��Gɤ����a6o�<\�|���077�g�}&�_�x%׬&����M���5$��t:pYʌY�M!�&�d3.�^?�,#"�q�����������/���)Kުe�����^Y�
6�֭[h߾=>��XXX�[�n�8q���=V+++<|��.]*w��ƍ�1c�u놀�q�J��V����T���ݻw�_~��p��	hjjb̘1*�M�&V�)J�x�]���-9���P�c�}���I2�����Y�ωd��ׅ��>N�Ր�����ݻ�~��T����e�!--
ǎ���Qm�Y���%5�Z�hRE󋊊���]cc>|8N�8���`�1-[���_\\�;v@|���$���1�߿�k׮�gϞb{�S�U������ի�������.�>���V�������XZZ��͛غu+.\(�W&�7�x���x��hhhȬ�Ste���7�7nH�f�r�
�����(3�V�Z!33ϟ?�y¦$]��'oQ�ÚeDDDDD5d���u��!))	EEEHLLĺu�d���@I
���d�z�
O�<�w�}{{{�(?��JI:Ym���Faa!�����Ijz��X{��
[[[���ߘ>}:N�:����|�7n�����>}��E���c@I]���!!!A���W�:�7�^�����QXX(է�c+Ou�߸�8����������������R��'����!33ذa����B��I�Ç�ŋHMM����R��&��W_!))	/_�ĕ+W�f���A�ʽ.ʌY�r*I3.M��&�R�H=���5��\�|Y�aժ�={���T�a�������߿��ӧW�v���8w����"��Q�FX�`��}�-���S�;FFF8v�XM��d��ĉ�������d888��X���vΝ;w���ֿ|��WR�p���8s�<x >�R���Tf����}�m��?F���Vѩ26y*��e�t�����������W����6|||0e��\�����R�Θ1HHH�G}$�v֬Y�׎��8t����[|���Ʃ�M���R�֥K�
�(3�>}���HJJ������@��W"��8Y���x�b��P������'�մ�j�������[�nŅ���sss������[�VU�&M��gϞ��ǏѸqc���bΜ9�ر��v�������p-(U-Y�EEE���īW�ЩS'����޽{�ǁ���Pcc��-[bϞ=���_ܻw�իƍ'3a�_

�Ν;q��9<y��Z���1k�,����$5���1v�X�zUʎM�긿���x��V�Zccc%i�X�r%|}}�f���mժ����u�VDGG���;v����1p�@�݂�������x����X�b�^�8}�I,[�� ��ٳhҤ	ww�rk��ݣ�C���o�Edd$�M�&u���H�O"z�h�U7�z-$$��Ε�$"z]hhhp���TR��&?O2220r�H��ѣ�~���!��^O;v�@@@>%O[3f����駟�S��'DT��Y��������������8x� ���Q\\�{��aժU U���kHc������ڵCpp��-88FFF2i�D�z`f�fD�:b�2"��F������W��y�-0{�l5EV��X�a��ׇ�����L�:p��Ql޼�5RstDT8Y�������@Du���LMM�믿�޽{(,,�o��޽{��O?E۶m�b�iHc�����������̛7O��?�>8Y�@���.�V&"�K455���� &��X�a���`�2""""""""����2""""""""����2"��233�B��kODDDDD

'˨���А����B�-ЫW/������@ݡ*��qihh@[[-Z��������su�[+$�/�~@׮]�Q�*���./^�{��Uz����_{"�����\��|��_�^DT���?�[���x��._��˗/#<<gϞ�����C��W�^�ٳg������#<<111h֬��C�u��1�{x��5\�v
��=~������;4���kODT]�����c={�TwD�"�,�zC�Waa!233q��A��曈���ڵk���ʎK!==hӦ
�����W_�;�'}$���#�����ȑ#QPP�iӦ����KDDDDDD�ǕeTo����7��q�ЪU+���{���_��ЪLKK��Ƙ9s&�z�-0aaa���Swh� �m�����_bÆ
pss�ݻw��������'NTwDT����I�a�
���d���a���055��������쌛7o�m�J�~||<&L��6m�@WW���Dnn�J1K�8gdd��+((��M�Я_?�j�
���hݺ5>��C�;wN��ܹ�9s�cǎ���C���agg�U�V�ٳgr�Q��)�W�^�/������ XZZBGGmڴ��I����Tn,���puu���	tuuabb��ӧ�Ν;r�+{K�V��S�I٘$�HKK���7n��#G"..�ܹ���n߾



�i�����^��[����HOO���weq���{N������UEpp��U�|��_�����,���e�/�…BӦM2�F�	Ǐ�9F^��/}}}���v�����}��w���\��HTT�@x�w��ggg����Ʀ��!;vL���X��а�c��̄���j�n�9x��oYU�wÆ
r���ӓ�&� ��򋠯�/��ƍU����IE�)Uc*}��_O�4IAx뭷���ޝ�UU�����<]��9`j�ɩ�P˛`8��Sڽ�M��C�h�-55n�� `zJK��Hi��e��@� ���޽�px���<��s��k�u�]{�w�<i�ߢE�@�-3�;���O@6l��Q^��b�go����%�U�{!�0��>BT�}"�}��=��,�r����XYY)ӦMS~��G�ƍJBB�2n�8���ZiР�r���;�788X��p�?
���J͚5@�4i����?+�����m�*�2g��c�5QTT�����ʆ
gggP�����̜9S�N�:)T���|%11Q�޽�(ݺu�ۧG�
��?^������%//O��o��;*���W���d���W~��e���J�:u@�5k�^������F�֭��������+'N�P<==@iР�r��em�K�.)u��U���KIMMUn޼����*^^^
�4j�H�t��XV���O��T�x������Ǖ��,��(J``�(.48�ڞ�9�����)�Ҷm[��m,NK>��٫.}_�r1*���DQY��5,{Й3X�p��QM�6�������F�3f�m0�!�:r�6㨤�f���������@�c�l�R�o���`ۏ?��J�ڵ��kժ�ʵk��IMMU���I+���Li�����]�q��=��?�����m+**R���ʂ�ruбO�>JQQQ���<���X2�;�YS��}��'���@�޽�^��˗kkk���Z���4)>crss�~��k��8-��+�WZu�Ǖ�Q!De��~��������*���U��en��U?�������~S�O�����[�޽��l�2����N��'ƾ��0����/���ʴiӔiӦ)���f�{��>B�9"9˄F}J�o�at��q�عsg�����b�ȑҿ.\�������<y���:�EQ���͎]Q���[N�8�W��/��(
]�v5���G�ƍz����0���(~��Wm[�N�P�.he��o�Ԯ]�޽{��]�vQ�V-��=�9s����+����_�����v��@@@���e�c����~4�%1���s��=��S�k׎Çs��e���/�����g�}�&M�X��޼y��}��i�g_�?{�c�!ă歷���׷��x���̞=�o�����\


��̼�UO����ѣ,_��3f0}�t�-[ƱcǪ:,!�="O�5)���c���J�
0a�~��ڶm���Q���3g�йsg��SJ%�,..&;;��'O���������3�?==�'N�����Ç�?v��;s�L^}�UHHHn���׏����/cgg�կh���W���L^�u6n�H˖-����y��F���y�
X<��������3��G-W?_0��eIL%��y�
>�w�}�m۶��k��e��_E���P�~}��1�%�}E~��:��B�ٷo_U���3�$''�����r�J\]]),,4�\Ǝ{?�_��7n�`Μ92D���f���lذ���#3˄&;;�B�>��S���W�[�l�Q�Fu�'�խ[��@���ښ�
���FTTo��6����Ջ���M�6�i�OOO�}�]v����n�~~~lڴIo6گ����ի<x0;v$==]�V�~S�O������G�ԩSx{{s��-��w�zM�65Z��|:bNN
40�O�z��?���~4�%1�T�vm��Æ
������fRUt�F��U��1��䳯̟�����n��t�t��CTS��N���ںB7Ž��˗1b�V6r�H._�LdddF&��Wd�Lh�ԩ��Q�c�����=u�o��&VVV�[���;�{��1�eƌ|��7ZYtt4#F� ==��{�9s�Ζ-[���<�+��·�~�ٳg������~��'�N�j�&K�͘�����g�ammMRRs��1Z���-�3��?hذ�V�~dee����ʜ~4��1��O<A�ؾ};'O�d߾}�������SO=eq�{��ʞ�e*K>��ٻ�^!�Rff&AAA��ۗ�ݻ3j�(v��it�-//�e˖���I���8p +V����@�SrS��:���,^��޽{ӷo_V�Z�}>s�Lz��I�>}�;w��
�ݻw3i�$����֭/��2K�,!//﮶�N�\�‚�ׯnnn̞=� &sϧ�z��&O�LϞ=�ׯ.��w���ng��O?�4:���{�A�Q\\�w�s�Ρ�����2��%͚5�N���ʿ��+t:��
es����~c�ܹ<���t�֍#F����a�)����/5�9s�лwo<<<x��w�r�����6�����O?����VެY3t:111ڍC!ăK˄�m۶:tȬ����1byyy̟?OO�2�i����T�������{�=V�ZũS�X�`���xzz�Ͱ)}��jѢ���*���>}�m۶z��V�=z0e���}����T��~������D@���������z�J3��Uј�3|�p����.�^|�E���,����`�,��+�g�~�{!��J����7��۷���ͭ[�HKKc�̙u

�4ik֬��ŋܺu�K�.�ԩS˼^1��ŋ���#//���l>��S�m����wv��I~~>999|��,Y�D�o�ʕ��_�"99��ׯSXXHFF111���TY[srr�g�֭deeQPP�W_}ŬY�*�|'N$))���|���ظq#����vw�����|�����лwo������/&##���BBBppp�>s���ի�;�/���?�����BΜ9CPP�v=WQ�~�T�f�bǎ���q��U6oތ���7�i��_M^^nnn�qss#//��\�B����	͋/��`2�K!..+++��PӧO'%%E[�_�>}�n�-55+++Z�jeQ�k׮�yԜI�G�6�_�b�d��V�Zaeee���MK��N�}�])..��7�4ȭV��~�eEEE,Z����k��n_d���,..�.���맕�ۏeQIJ�ג�L�.ܼy3�>P�e��g��ĉ�mۖ�_~�BDz䳷�g�A�{!��JQQQ�?'''"""HHH ,,LoƊjݺu�<y�����h>L\\]�t!))��[�������M�g������9t��&M $$�5j�q�F���0a��
����ۃ1���:t�O>����/L{� IDAT����>�…8;;�f��|��Zr��-[�i�&�����\�`�g`����/�k�f���zu�>�ի��qԙX���ի������%((���bm��y�T��Ś5k��̤cǎlڴ������+�a��e)��L�~�N�>�ʕ+IHH ""��͛s��>��2�mN�����С��q�2���v�)����(���\�}I�ϟW4h�J�~��Ç+7n�P��٣L�0A���Slll��G�j�lٲE�'�|R�~������5k*���o+Jnn��{�n�S�N
�̝;Wo�̘oݺ����Oʻᆱ���)��n�:m{۶m@y��ו�����PIMMUF��PΞ=���J���;w*ׯ_Wnݺ�?~\�߿�(C��P�ݩ]�u��i�J��2�(Æ
SN�:�ܼyS����_|Q�G}T�qㆶϯ���ԫWO///�ĉ�͛7�'N(^^^
�Ԯ][��_,�Dz�D=�
�[�n)7o޴8&S�]Q�'������(YYYF�u�[�n)/^T�nݪxxx(�bkk��۷Ϥc��%��%?{ս�KW�.����>quu5韢(ʈ#WWW%11Q����z�Jֽp�^�_�UquuUƏoCY�+���ﵲ��\���~��������X9q����WY�x�2t�P���U��t�Wv[�j�CRR�^���+�oO�:������������O���e}�������+��(����3�<����[�u��w�������*~~~�����d����􅷷���ꪤ����Nm4V^V=S�_�����Ê����ueE>��^zIquuU233
����T\]]���������#�4L�i޼9���2�ݻw����Y�b]�t��/X�������+��ծ];V�X��q�X�p!.ԫ׽{w��*S�a�7N�q�L�0��+W�r�J��s��!&&���#G�ТE�~�m�l�©S����08G��͵/�{s��T���|��'8p���@^y�-9zE��ĉ����+o֬[�l�V�ZZ�_��W���:t([�l���j֬ITT-[�����Dz����w�^���)�bQL�>|8Ǐn/���,��[�.�}���K+J�䳷�g�~�{!���Ξ=`�{��pT�Ν(3�EYO6U����%�Rrټ���eff2m�4N�:e�M)1�^�����<��z���\Zr�����-��RXըQ����%22777:DQQݻw����h�<
sʔ)>|��ǏӺuk�����m7�/.^��w*���/U��h���`�9m�z�*�g�֒�2���%�0��p��1���qvv��֖
��/�s�N^�u��?�����g߾}���K4l�;;;{�1�y�����A�;�Y�&�Z�bĈ�ر����?z�ǏϚ5k�ҥ5k֤~��<���|��,X�@K��&���C			����t��{{{lllh۶-o��G�50������ccc���
�6T�C�e�޽�t:lllhݺ53f����<����w�}ǨQ�ptt���GGGƌ�ѣG4h�^}K�ј��H^|�E�ԩ���
��_-���r@�l���
M�6��͍y��q�̙
�S�%���?{�k�!�ݦ.!+����r0�O���,�J��CZj֬i��ں��,^��S�N���̨Q��;w��Ͷ��U[�c�>���&K�gkk����ܙ�7f��=z���Tm���%��͜�0��%�m��~��I=g�5L��cm6�s��I.U!|2�Lpqq1��Șk׮Yt�^�z�|1p�?nw2f�ƌct��ѣ��3kР����|s�
Lo�O<��[�*�%=��9r��;v,7Di��>iժ;v쨴�L�w�I�VVV��T�Y�1L9�%��9?{ս��~����O?�����4��ޠ���#gϞe۶m8::��0˥>�'""�F�����m/,,���枷��ٙ��t���;�|��fS�v���|������r��!����ѣG�����s��:v��ɓ'Y�|9���?�����#�<¯����,VVV(�Bnn����ԙ��~�T'N�Л=�>���ٹ�s���&M����AVVM�4�ۦ>	�t��#3˄����
��ť��y�H�!$/��.$55���B�?n��|ˬY�HKK����+W���G��鴤����uyٽ���@AAiiizu����^[ˢ>�&88�����BN�8�=
���WZE?����/xyy��W_����O<AÆ
-:��ȑ#DGGӥK"""�ڵ+�ׯ׻9jN_��wK�,!##���|/^�N���� ��͛�q����F�dY^���z�wHMM�֭[|�����ϗ�/�Y]r�.+.I-���R�Ճ�,B��]�����e�����B<�|}}�ꫯ��_���+����{��%%%�Q�F�m�U�ӦM��7jԈ�W���퍣�#۶m��������	

"((�`{ZZnnnw��e5j�w������S<�S�KtT�J���`̘1lذ(	f�<]�%''���üy�]�6,��Ɔy��1r�H�ΝKll,���3�/^}�Uv��EJJ��ӼǏ��vwwgӦM|��|�ᇀ��3S�_��;|�ڷo����4s�ܣG���Gjj�A�=u��X.+��Z2�L!Jhܸ1�[��_~����h�`qwH�!�W�r�����	��ӓ�
bcc������$;;;�nݺu������GGGjԨA���qwwg���z�Y�O�N��ͩQ��ɹ�,5c�<<<�����ΎN�:�p�Bm�*66����,vvv���1d�5j���/���f�2�[�+�2>�:u�h�+����~��7prr��ɉ��._����2�/�4iBdd$ԫW[[[:t�E���N�6�!C�РA���pss3z��X����R͜9����cggG�ƍ>|8aaae��3�����v��Z��8@ݺu�Y�B���R	wD������+��{��Q���w��-Zp��U���X�j��'!���Ҿ���"**
���T��ɥK�8p NNNlݺ�ҏ_�<Lm5ׁ�6m-[�d�ƍU���U�V��͛i޼9.\`РAL�8�q����r}"�}-Yf�	�QE��q��9�_�NTT���c�B�Q�޽��t|���dggS\\��?�����Y�S[+*//�+W�hOr7��)QuƎK�f͈���ʢ��ptt4X�)�x0I�2!�B!���b��Q�Fz���wS[+��KX�ш����7oo���6��u�V�.]J�Z��8:!Ľ �eB!�B�%�hт;v���?SPP�#�<B���7nUb�y��ZQdee���5k5jԨ�D)���L�<�%K�0e����B���	!�Bq�X[[����P�)z��ZQ۷o���	�,��K�R�#��B!�B!ğd��!5lذ�A!�B!��ڑ����L%B!�B!�(��=d<�ҥK�:!��T���?�ٳgU�!�x����y��C!���uU �s��I�2!�eÆ
�;w���B<���СC�:!�}h�С�hѢ��BXHf�=����:!��VVVU��%�KB!��I˄B!�0B�%����O�`�B!�e4h��gWa�aÆUuB�
��2!�t��iڷo_��Gbb"ݺu�?�B!D%��eB!��G˄0�[o�ž}�HNN�V�>z�(˗/'66EQ>|8...t����)�B!�B��d�L3�۷�ڝ�ƍ̙3�!C�������7�g�fÆ
�����0�BQ�N���m����تr�}i��/^�Ⱥu�HLL$##[[[��׿��s�1b��ׯ�c��dU��ae]���I�ә|�%�Vdd$�/_fĈZ�ȑ#�|�2���U�B!4o�����U�=��?0r�H���8w����r��i��������Uf�*�VW5̘1��ӧ�l�2�;v�#B��Gf��j��~cŊ���s��uZ�jŘ1c0`�^������سgW�\�iӦ��ۗ	&P�n]��:�Chh()))ԬY����S�j�����	c�Ν\�t	[[[ڴi����
�;V������배0�O�����V�*�N���;���s�����O?����V�Y�f�t:bbb=z4���3�B!��2g]U�,{c�Ռ�>����\�}�Y�|�MZ�nMaa!�N��> --��˗�`��{Ͻ ��3�Y&���W�2v�X���K���
9s�AAAl۶M�w��u^{�5֯_�o��Faa!DGG3n�8����=q�D������'++��7�m_�|9�~�)�Ν�֭[���q��q�}�]���L�?44����A��l�1_�5yyy���lsss#//��;w��B!�#3�|)))���{���`ccC�Z�xꩧ��U�=#��,�ƚ5k��̤cǎlڴ������+���[�v-���4oޜ����ɉ3gΰz�j�c�lْM�6���?�|�}ӦM,[�������O`` ���������d�;��[�&>>��;�����s���СC��ej!�BT���<����ݻ7���r��M�:�w�fҤI���ӭ[7^~�e�,Y�w#����U�V���M����ݻ7���*�7o�P|�f�B�ӱ}�v��
�NG``��L������X�l���t�ޝ��b�



��w��&O�LϞ=�ׯ.�ƍf���@eNN|���ߴ~

���иqc233
��E�$''�gϞr�2V���y�&��ϧgϞ��ۗ�� �s�Sג~����۷/�&M*�6eUCNN�A,Bq��e�(;l��9�]�7c�Z�hܾp�5k�^=u�k֬Y<��t�ܙ�3g��o�g�&O���O@@�vL___"""���ֶ׮]��ׯEzz:���2�!C����Q����3�զ�ۘӧO�Kkժ�^!�BT���@:�X���������V�\Ixx��>��Đ���݌[�|9k׮��ܺu��Ǐs��qrss-�'�ѣGY�x1]�v�Y�fddd���3g����[PP��I�8y�Vv��%"""HMMe���X[�ߣ�8q"YYY���q�F�����K۩�@HOO���IIIDDDP�vm�b7n�&L�W^�gϞ<������ޱoM�h�"mEA~~>۷o�رc�[����Ե�LY%q�U
III�ܹ���[�BQM��2Qm\�x�OW�p�p{�����zJ�8%�i�F{�^DkeS�N�f͚$&&�����ÇA~~���S�2���\�z�hN2�L�#�B��s��5���8p�|��,���������9t��|�	��2�4uf���z��1�|rss	

�����s璛�˼y�_�~�3�׭[�ɓ'y��lj���������ѥK���غu�AL�1�ߘ���W^!88����f�Ə�s�=�믿N\\��:s<x��K����@DDNNN��7-�kI?�\%!��;,��K//,��n�����%�J+y���y<<<رcAAAt�ܙ��|V�X��ظq�I�/kV��(�kcRi��o黵%�*گB!��WրSY�o��6�[���ޞ���p��m����9r�;vdǎ|��G,Z�@oٜ:(**���8�]�Ɛ!CHNN6:(e���~���;^{�5���[F��3�<S�~�v� 88jԨA�֭�7o���N�s�͚5�Yb�g�[���+lmm���RIScQyxx�y�f>��3�x�
t:���,^�~���r��<������akk˓O>��j+=hgj]K���U��A�e���x�G���_9s�;v,�������ǎ��g�����U�O�1W��������ӓ�'O�{�n֬YChh�ESɭ��P���\�	�gΜ1�gj��iҤ	deeѤI�m�r���B!���ڶm��nР��/33�iӦq��)�}K�x�:u*���'11���DV�\���?>>>ԪU��͹�9e�>����iݺ5����Ϲs����4����)���m'ܝ�u�Ё:���GAA�W�&,,����ŋ��_y�u��K�.�?ޢ���)�$dU��a!3�D�ѣG�,YBFF���,^��N�%�pwwn߽LII������.\@�^��>���:���?����<ڵk���`|V�zQX�F��y�fnܸAzz:!!!��عե�gϞ58�Zf��N!�B�͒�w���x�bN�:���3�F�b�ܹ���ԫ����`�1��ý��_REV ����N��˗
����1v�X
��i����F������-��~0%���jB<,d�LT���*M�4!%%��_~��={j��r��c�ҢE.\����?ݺu��ߟ�/ҢE-ׄ9ԋ���z��M��ݵ)�]�v��`���8��c��z~�!�z�bذa4l���v;�:Ж��jp\�̒�C!�B�[�@KDDS�N5��(,,�^������Y�v-cǎ%;;����
����k�����Y�|��Qg�o۶�`�099���$�b���NNN��+TY����*k�N�AYrI0����ʌͰS����?z�(�>��Eu�F?��+�%ɪ!ăD˄Q�"GYiM�4!22�ի���-:t`ѢE0@�W�^="##6lԨQF���ի
�d
ooo���x�ǰ����Ύ6m�������zӧO�y��ԨQ㎉\�M�Ɛ!ChРvvv���1g���m�����v��z�U�nݺ���f��B!�FBB���1{�l�\͡e�lxK9r���h�t�BDD]�ve���9rD�cl�{�>}������(**�ʕ+|��G�t:&M�dv,���n�@9r$p{ ���̙3p��u���ό3�?�L_a�z�HMM�����G�ֳܾ�ne�jB<�$g��V����?��iР����Rր��r5_Yy<<<���0����jOn*��)�6v�:u����Cxx8.\�y���<ǎc�ĉ�B!D�������	

"((�`{ZZnnn�;���`BBB_JΆ/���JKNN&''�y��Q�vm,X���
���c�ȑ̝;���X�իG�F��z�*���8::�m�6���ػw/)))�5J�صj�bڴif��S�oϞ=�;w�`���+�����ѣ��ψ��5�4Ζ-[��C{���ΦM�������pss+��7���O��cǎ>ܢ����>�=z�o�>RSS
>Y� �x���2!�scǎ�Y�fDEEieQQQ8::\�
!���Uƌ�3f��ၽ�=vvvt�ԉ�2a�m������
		��~#  @[����D@@�/_����t�[�.������H�5�_�>���^�ڢ�F���n�@x��7Y�|9����/���;;;\\\x����ϴ�d`�
Uhh(={����ƌêU���3�ne�jB<̬�;e�����h|}}�䢥ߛ�Nw&-u��|>h���[�|�M6l��СCY�ti�w^�xPXYY�����Ba*�}"�5��ڔkas��M�V�"<<�͛7�j4h'NdܸqU_u!�O���%��2!���L�<�%K��d��L�"eB!���ɪ!��@r�	�T��,Q6�S%�B!�*{{{�͛Ǜo���ѣغu+K�.�V�ZU�BT,B!�Ba���Y� �x��`�B!�BTsVmT���A� ��eB!�B!�B���,{HYYYUuB!�B!�Վ�=dz��I\\\U�!����g����B!�,B!��6l��ֶ��B!�=$�e�����[�a!D�����$�B��b���l޼���B!�=$�e)EQ�:!����Qq���B�p��2!�B!�6lXU� �������gϞU���U�B!��ц
ذaCU�!��mذ�s��UuB��2�;}�4�۷kC� IDAT��穬���HLL�[�nrG\!�� ɉ(������&�e��[o�o�>�����y*+ƣG��|�rbccQ��Ç���B�.]*t\!�B!��a"�0�m߾}�<��7�3gC����'''����={67nܨ��B!�B����,F�t:��>#KT���H._�̈#���#G�~�z"##�<yrF'�B<���J=wy�õ^�t���$��B��d�LT��ń���s�N.]����-mڴ��ˋA������#<<�]�v��ӴiS^z�%ƍ�����h�E�)1�w�ݻw�a������ϧiӦ���3y�dj׮]� ''����~�i��f͚��鈉�a���ԫWϬ�!�B�m�*eFY$��Bcd�LT˗/g�ڵ�[�nq��q�?Nnn.���0i�$N�<�սt�����|�r��+g���1�r�J����222���!;;����9m�����������8nnn$%%�s�Nlr��B�����b,Ž��t@Kc�a�����IB!��Y&��M�6�l�2ؿ?������j�֭[�ɓ'y��lj���������ѥK���غu+�����lх�)1�u����H||<��O>���kj����С�A�j�ZG!��O�ә��QT/e���|�2���U�B��&3�PvN���w�N_�ڵ�~�:QQQ������ΐ!C2d�^�]�v����[�f޼y4��۷,ۼ�1��~E�ԩS�ر���#G�p���r�5���O��e˖�iժ�^!�BT���<BBBػw/�j���_dʔ)ԬYS�s��
`^�
s����t��>&&���PRRR�Y�&�?�<S�N՛���o��b�
���~�:�Z�b̘10@�X��c,������سgW�\�iӦ��ۗ	&P�n]���)>Ic!��<2X&���S�2�|ILLd�ʕ������C�Z��z�Ν�����qΜ9s�c2&33�iӦq��)�m�����9m�z�*�ы9�L�#�B��ȡC���g�������")"*�ĉ��� ??��7R\\̬Y����cǎ%33S��̙3QTT��M>���y��HOO��222���&))���m0��$��B���2L����rŲ��v��APP�;w&??�+V0`�6nܨջ�@ӝfmݍ��Y�x1�N���ٙQ�F1w�\���L:�9m���0��M-S�!��j\�v���88�-���o��o��V��.-��"Z�lɦM�������ߠ=k֬!33��;�i�&����+��@DD`zʌ�kג��N��͉�� !!���p���8s��W�6;>Ic!��<2�LT+������OOON�<��ݻY�f
���ڝ=GGGΞ=˶m۴d�U�1�#�#""hԨ�����Bll�����&M����AVVM�4�ۦ�Q-].�B�Y����ߦu���?����\��m75}CERDT���Z�h���/dggk�<��3�z�f��fv�C�5kO>�$�;wf�̙����ٳ�ɓ'����BQ�Y&�
///t:��9yyy�k�lmm�z}��n_0���QTTĕ+W�裏��tL�4I��ΨR�5ޭ��;OBB���1{�l�\�`3��9ml߾=gϞ58�Z��B!D�h۶���A���c���LƌØ1cx��w����n���q>u�Tj֬Ibb"����>|8���y��+*c�@�6m����7h�ŋ�ʹ�p�p{�����zJ�\��'i,�B�Gf��jc�رBHH�޶�]�j����ػw/)))�5J�^�Z��6m���Q�F\�zoooٶm�]���y���پ};AAA;--
777�����=z�o�>RSS�bHMM�W�^f�[!�e�S|c����=f��
�=�mڴ�S�N6L����ݺuc�޽lٲ���+V�n�:�L�R�[��h7�


ʬg�aI�"D���L�O�X!�0Ff�	��E��Ҽ��	

�����;;;ڴi��������խ[���|||ptt�F�ԯ_wwwV�^�ws���4oޜ5j�{�Wј��gƌxxx`oo����:ub�…L�0�3���}�ic����]��^>Ձ�[�./���mB!ĽS2}�ԩS
�j�����]���cǒ��Mhh���W�rss���<4�G��1T��;�W���$-���BMYQ���B!3�D�����������������������d�<���#88�h}u���Mmc�:u���!<<�.мys��cǎ1q�D�'D	!��zJHH��'==]{&�N�иqc����p����0�v���믿���̥�t߼y3��ҥK���ѣGbbbX�d	���4lؐ�K����3����ۃt��p��9-�Xi�����`�y�:v��ɓ'Y�p!`����ۓ���ٳg
�$��B�Y&�`�ر4k֌��(�,**
GGG�e�B!��~���

��͍Q�F��?h���Ҁ��BBB�ݻ7ݻwג�N�`�?��Cz��Űa�hذ���{��WiҤ	)))�������S{*����z�C����
fөƎK�-�p����t��
.^�H�-��]��G���)+J�4B!df�0KE3^�{��Ӝ��2Ԋ���g޼y��曌=��[��t�RjժU��	!��ʸf�1c���8p���"ڵkǨQ����	#66777������!..N{���3�z���,1m�4���ٵk7n�@��1g�^z�%��פI"##Y�|9			���Ӷm[����ׯ�Vo���|���ddd��2�^�zDFF��'��w�^�\�B�&M�ׯ�Ǐ������|��8p�1c��m�4B!d�L����+�'Ofɒ%L�2�Bw��BQqe
��.75}���œA<{{{	,���n�+�M*c�(��A�P��L�O�X!�(��	��O������|||�:!�B�jo�ر|��DEEi�p��B!H�2!�B!�CHMc�u�V.]�ĥK�غu+��͓4B񐓙eB!�B�����Ba��	!�B!Z��B!Di2X��6lXU� �B!�BQ�Hβ�L�-:thU�!��f�С�hѢ��B!�B< df�C�gϞ��ٳ��B!�B!���d�L!�B�2������[�a!��������(B!�0O\\\U� ���=��U��B���'9ʄ�a&�B!���Y���eB!�����B�������ǧ��BX@˄B!�(��gWa	++��AQ�S!�B!�B����2!�B!�B!�G�a
!�Bq��t:����s��|�
[�n�ĉ\�~��{��}����E�z��:�Ju��iڷoot[\\���t��Mr�	!D%��2!�B!�}#//���@:�W���BJJ
���^5V���z�}���<z�(˗/'66EQ>|8...t�ҥ
"B��,�B!�B�7f͚šC�ppp`�ܹ�ܹ�Ç�u�V����~�:��׿8~�xU�Z)���g��ƍ̙3�!C���舓����̞=�7n��(��"�eB!�BT�N�Ӗ<����8p�ƍ�z�jH�ƍ�Q�NNN���L�4���"V�XQ���U���\�|�#Fhe#G�����DFFVadBq��e�B!�B�eyyy����w�^jժŋ/�Ȕ)S�Y��Vg���lذ���4���iڴ)���L�<�ڵkP\\LXX;w��ҥK���ҦM���4h��P�	

�/���ƆaÆ1i�$���X�h�����֖޽{@�:ů 33��K�r��AnܸA�6m3f3g��s����ή]�����iڴ)/���ƍ���N��m�6F������6>EQx����srrcϞ=\�r��M�ҷo_&L�@ݺu
�(&&���PRRR�Y�&�?�<S�N��g��8;;�i�&��{yyq��E6mڄ����mS�����qqq�룒9�rrr����駟��f͚��鈉�a���\�6!��Wd�L!�B���d����<���),,$  ��+W��OFF111dgg�`��/_�ڵk�:�n����?~���\|}}M�g���z=�~�)͛7gÆ
�<y���|���K����;w�Yq���2n�8Ο?��KKK��J*((`ҤI�y.]�DDD���,_�k��bԥ�=z�(�mu����^�+�~�:������zqGGG���DDD��@�ĉ����b�ƍ3k�,t:G�!%%�'�|R�'%%�.������lV�T������9��_��������6777���عs'�.�B!�&�0�B!��ˮ]�F\\Ж�}��7���������9t��|�	��\˖-#!!����@ll��񤦦�~�z:ĤI�		�F�lܸ���x&L�����͎3**�������DDD			���Z�n'O����'::�ÇG�.]HJJb�֭Z�+W�мys��
�v�Z���i޼�Oxx8NNN�9s�իW�ӲeK6m�D||<�������:��_��}�v�bv�T�[�&>>���,KNN�����СC���2��B��`�B!�fPs���UVV9��o�M�֭���g���?p{@�ȑ#t�ؑ;v��G�h�"�(�:�)**���8�]�Ɛ!CHNN6:�R���@ڵk���>>>ܼy��3gҲeKj֬��ѣ��U�ĩ*͚5�'�|[[[�v���ٳ
bٵk������P�F
Z�nͼy�?�jԨ�^�jc�t��Y��g��}hѢ5k��f�egg���N�ƍٵk�n�����]�v���@�޽�n�jԨQz�3�9}�4p{@��V�Z��Ba>Y�)�B!�]ֶm[�u�
����L�M�ƩS��UE{=u�T�ϟObb"����\�|||�U����o�^{]r�a�6m�������ٳgxꩧ��t���`�s�����i4�3g�h�8�<�.]�u��F�+�Bnn�^�.йsg��j|/^48Nɾ�_�>��gfcc������8p��}�r��!����0a�6�gN�T�`Wy�^�
`4'�Z��Ba>�Y&�B!���p%�ŕW�q���ŋ9u���Ό5��s�gP��Ã;vD�Ν���gŊ0��7�܆�(�t�,K�T�@����c��J�XS�ߌ9q�}���Ϗ���r�]�5[[[��_y������/�۳Ĭ����`N�Tw������祖�Y!�idf�B!�U,11���5j�������ۗ������OOON�<��ݻY�f
���w=���q:;;��O?����3�hۿ��{�c:::r��Y�mۆ��c��饗ؾ};QQQ0�ƍ�m/..fժU(����7m�������ǎ��g���;vL��\NNNt�֍��xRSSٿ?�=��^^6s�f�&M����AVVM�4�ۦ.�-].��t2�L!�B�j"!!��������{��������t|������Ѯ];\\\��PU�/��…IMM�����Ǐ�p�B�c�����O,--���"�\��G}�N��@н{w�v������;w�$''�[�nq��	�N�Jbb"=z�В���cp;wXJJ
������h����ˢ~<x0EEE���QPP�wNs�Vu�����\F�.w-I-+��V!�ydf�B!�U��ݝ�۷DPP�����4���;v,�������W�X>�����ח����_~�??�r�����޽{IIIaԨQz�jժŴi���BBBx���駟��%��Ӈw�yGo�رcٳg�ΝӞl�jѢ�A��z�ꅃ��/_���Yo�%m3�Q�F\�zoooٶm=z�`߾}���|�ZlB!,#3˄B!��c9��5c�<<<�����ΎN�:�p�B&L�@ll,�����c�agg���mڴ��Ϗ���W�-����=aaaxzzҰaCl���;��)���J�D�f��Lh,�Ÿ�B�m�"�H)d���X�6�اaP&�2nCѐ���J"��e��I{�>�?��3w��ݺ����G}�9���{;}��?ZZ���ĪU����jذ!������
###hjj�����سg���f͚a߾}���бcG4h�����ׯ����q�F��5j�ݻwc̘1044���&

1n�8�ٳ��(�e...Rq�m�,��χ��	455QPP4h4h���h�����ѰaC~v!��i���NB!����ЀP(������I奤�`ذa066Fxx���S��ر���8r�LLL���9|�pL�6
^^^j��Ǎ�O���if!�B!D�����j���())��'O��o_}���kX�yxx��O?�P(�ӄB!�����$��,#�B!�����#��b�޽;F����x4mڔl�(OOO+W�Dxx8RRR������p�\�R�1TB!����B!��Z�p!���p��I<y���O`cc///���u�@ �̙3�i�&��Y��e�B��h��B!��R��Ճ��+�g��τ�z�&!�B!�B!�C�e�B!�B!��O�����UQB!U�1��*B!�BH����e!!!�ʊB�
�ȑ#�!��j�Ǐ��RB!�#����ѣG�*+B!*PXXH��BH%�-!DY�G�������AQ��I!�B���!��qR�`�0#���e���!�
�puuUw5!J���et'�B������ŋ���_�]
B�^�za����F�>|8��KQؘ1c�]BH%T�`�x ����({��9BCC��
!j
mmmuW�ʌ=��g!����,#�R��LfBԋ�oB!����2R�RSS�駟���VW�A!���eee�����ʮJ���������/�-����ظq#���PXXWWW|��
��˗/����q?B�4X����֫W��/0j�(|��_�~5�NyFFF�ꫯ��W_a̘1�ܹs��޺u!!!�q�nܸ����J��s�N,\�����(�<ijj�Q�Fhժ���Y�f���?WI���ڡl�`Uk��QA��*��tY��laa�!C���G�ƍU\cթ�~&�(�!է.�(#D��=.\�P��ҥKq��u���o�*T΍7�m�6<x�1�;����ҥ�R�&�"
������߿Ǖ+Wp������ܹshР���&���T�<y'O�Ľ{�V�+V��ѣGUZ�ԩSU�_Y����{ܼy7o���۱s�N����$��j)w��_���ׯ#44�/_��f�zQ3B�G]�QF�2.\� �&k�,!!����@���"�����òe�0j�(\\\�t�R���BOOO��B�D�e"$g��ݻw�x�"�̙���8�Y�?����j��6m� 22��ё�������077dzg��PC��:O���}�6�lقcǎa„	hڴ)���ZJ+k��@�&�/�����?��ԩSX�x1����z�jlڴI
5$5�0#�jQ�2iu�qG�z���444d^��e���x��5���>mܸq��?�{�n̜9S�%���U=uW�&����'�|��#G���۷O͵R���#���%s���瑓�GG�j��jhkk������Cxx8.\��M��>��zDE455all�I�&��hP�BH푛���˗��������uʙ3g0}�t������C�ŦM������SRR�;v���666����ĉ�^
���
VVV(**†
`gg�ر���ooo���}��Ŋ+����p=��G�/_�����
|$�g�֭prr���
�
???���iiiX�j���[[[,]�T�N����ѣG�9s&z��~��a�ڵ�����_�g��u�+++���ÇGII�X�ϟ?������YYY8p��u�CCC~�O?�VVV8p����wO�1 IDAT��+B!�S�`ٳg�0u�T���AWWFFF?~<�޽+s

�
_����1z�h�l�:::hݺ5/^���l��ܣG��+??������мyshii�E�2dΟ?/3��b���hӦ
tuuѤI���x����c�77v��q�۹���-_��:O��֮]��]���˗8t��6E�Uw;�͟��g� ����aÆ������/���SSSL�<>TY]����5��G�eQ�lے��0a�A[[m۶Ŗ-[*���߁�SB!5��ŋq��	����ݻw�����E�!>>���(**Bjj*8�u���m۶
�v�����QXX���\ܾ}?��#�B��ٰaBBB������L�ڵǎ���!""�����������fq�[Ϝ�xyy�ĉ���Daa!������-U���L�>{��ūW�PXX���aΜ9RI�deeaҤIGFF


p��)������iӦ!..�������Ç���+ow�i�رx�����o�t�&���������ͅ���T������EDDD��C!�X%	�B&�������� ��_�>;~���1��}����g����)s߯���egg�̿<111���/��333Y׮]ˬ���;v��1qqq�Q�FeӪU+�����~���g
4`m۶��6V�~}���Sf_(R~y�J�>�W�v�bؘ1c�4E˭�v�ۮ������رc�������y:}��J�R�tI��?+���(۶�Ǐ3===�Ǭ]�V%�%�~)�r�>��>��RS���2WW�2��0�PX��eL ����͍=~����沍72�@����k~�޽{3�@�BCCY~~>������g�������Ӈ	v��%VPP�rrrXhh(lذa֋K7n{�����۹s'��֖yzz��O����|��o�1�@��'w�a�ح[�XAA�v�<x�T��@ `������=~��M�<�	��Vخ�۷3�@�����R��c'N�Ȟ={������'W_�����{ֻwo6n�8���L���r�
c��9s�0�@��]��$q�?w�\�mD}��>!��W�ufٻw�0j�(deea�ܹx��!���///���Uj�cL�f�~��]����<y�iӦ���ӧOǓ'OPPP���(�i�7n�����oII	޾}�C��$W~Z�n�_���;��ŋ���E~~>._�0���O?�3w�\deeaʔ)x��!


����s�ΡC�x��)~��J�GWWx��Ԭ�{��!99}��)s�E���G�)�g��ի��6�h��nGe���!n߾�������R��Ν\�v
>|�ݻw1b����aܸqx����
>|�Ç�q�Fxxx�����gE���y��������رc����>�ƍ0`@�}Q��rE�U*k&���&�6m
kkklڴ	���ꮪB䙭^��uy�H��=^'�1;Y��d�XXX@OOS�LP�� '**
W�^E�p��Ilٲ��f}2��^
�		Azz:F����x����݆ŋ�m۶��с��+�ҿ����077���.����>��h=ϝ;���A�N������]�b�ҥRu����Y������Ԅ��V�\	8q�D���f�{{{�cǎ|yK�,QIy.�g�s����֫"�7ƨQ���\�t	@�,�[�nA__]�vܿ`nn.�G�V��!���nS���5k���#s�ܹs��Ή��eZZZ[�`�ض��9���ի2g���Dܫ^�zl���Ry���32��<|��`
4K�_�>���ӥ�ILLd���1��l�qug�1???����/b�lܸ�`[�l�:F��R����On��h>�.W��:.��~����lllXaa�ض��֯_?��^�ZeuQ4]����=���;^���2m[�z5���),,d666U�Y*�r>��V[{������ݻ���uWWn�|�H���M��hfٿ��*z�����yp޼y�����͋1�N�>�lmm��={���@�����M��ϗ�^\\��z����lw^^�Ծ���۷o���ʓlWNNN����


�����<��Y�ciii��֖yyy1�;u�lѢE�>=z�ٟ�1���&�����6�>�~�Bj��Y�����oen����r������q�PTT�A�a�ڵb۹�e�cee��<y�p�c�v��ܹ#����S0��>�>��s�rLMM��
�����o�ر#cx��%���~����_b�����+SE����3Eկ_�窺ܪnGe��ӧO�����@KK|A\


,X��x���8g�hР���s�NDFF�癣�{U��q�̛7O�---,Z�Hf���,UtN	�
LbfwAARSSq��!|��g�Jѵ�d��z�:����x�WE�*\�pÆ
�w�LMM���+V�\�f�8y�$�/_�Ν;#??~~~ptt��Ç�n������z���@�zr$?3�fbV�'�0��d^��:ʖ������٤͚5�ȑ#q��
$&&"::лwo�2e�.�f�B��H���B\�j##�r�++�8L�:O�>E�6m��@SSSl��G��;wV�~�8KJJ�����w�b������-�\��v��I����;w� ..W�\�͛7e���퍉'"66���J���aÆa�СbT��7ssst��������B�F��������m�mڴ)�XU�_y�LQܪM�RnU��2�s��e� (]�	(}DWUuQ���۷o1c�>|���������*�^��m\���p��~�SB���J�͛7G߾}�o�>����!���˗AAAhڴ)�ҿK���"~���NNNprr�ݻwq���ݻ���9rd�����)?~�[�n�{��[�nI�idd�gϞ�رc��,���)���q��u�k����*)O����q��!<x�.]B�z�гgO~{��͑�����4o�\�X�1Y�tB!ʫ֙e�>�_�~�v�BHH5j��G���Eqw�6l�|E��^�zhҤ	lmm!
�d�dffb���b�<x�[�F�֭�������b1�Dyzz",,Ll&���_�ٳ#G�D��.:*�oGGG�qN�:����
W�TU���3Eq�%UT]nU��2����S�@"�.��zU�U


�l�AAA����q��=������P�ʾWm�4{�F�dn/�b������)��h���])Z��'�κ��#66HJJ���mpvv���:���\�m�����g?���P�Jybb"���p��m��B�o߾Jg�'%%���iiiزe���0}��
���_(�Cv��u�Ν;2㈪�<I�w����>Z�l	ggg�:u
�������&M��ۿ����+��4nB!�W�3�������ߣq��
{��=|��w������ѡC�2����Bvv��eTd��X�v-����� ��ڵ��ѣѪU+�h��۷�/^$�1#F�����q��\�x/^ă��c̙3��Z�~��舍7���pqq�	�h�LU�s��3Ep�����Tu�Uݎ�ο�����Zu�����������l�2���9ʼW�i733##͚5����lTE���!::C�(MMMEpp0���p���
��%����w�^L�<���|Zrr2֯_���DGGC___�2nܸR�����`oo/��
P�ĉ8y�$���1t�P~�իWѯ_?~0


p��u\�~{���˗��'��۫��T�&׍�L���8q��/_��˗KmOJJ���-<<<�f��[�N�o�������q��)<}������������#!!nnnb��ׯ��s�VX/777�9s����ԩS��A�I
0��<IM�6Żw����###;vL�<&L����P�`@Ϟ=q��$&&J�gn���1�B�W�3˸G���^䕟��o����������T澭[� {ʵ�����V�ر���êU�0i�$899��n+))�����&N����@ܿ���*z�]�~�ԫW/��ɓ`�������ׯ0����T��*R\\�����aê�ܪnGU�/�1����_V[]�ѳgO̚5�q�F���I��{U��q��ܣ(�$*S?R��Jѥ�{��T��F���e�Z�`===���cǎX�v-?�s��A����/_�v��AGG��%���)��*��SOOprrB�&M���KKK�Z�
�x��
"((���022���&`oo�={��5cJGG5j�6m
0>>>R���<I��χ��	455QPP����nX��ىm4h4h��3��
�!��@e�Pd52ooo����Sj>�;x� �,�>k�,��������r�í&7q�D�m�o�f����X:�\�j����_@�J`���������ӹ���IKKcX�F��4e�MV�F������3lذa�l��ԪJ��YYu�e���kӦ�X}�-W��TV������Æ
��<2kkk�����(�����`FFF������2�Ueڶn�:���ݛI����ϒ��muȺ�^Z)�Tu�-�K��tYi�:�5��I*�իWL H]�Ƣ���@ `...2����3+++���>�ŋ��ʊ�ܹ���I�D�'��jW�u��ŋ�q���ׯ�r�
���cgϞeS�Ne:::LKK�ݸq�?��ѣ�ԩS���1�������%K����T����Μ9�:v���+V�S�?�����������޿?��M�6�1cKMMeEEE,11�����]p?{��?��i߾=���`��٬���ݾ}�
4�`�G��T��ծ��@�YXX0��߿�c�-�Q�F

e����R���Yy穰���z�������2L[[�]�pAl?e�Uu;$��.U���M��q�Ʊ��$���v��u֯_?��������*����e�1~�W�Șr�Ue�&:h7h� v��M���v��=6z�h֬Y3�~�h�L���ޞ={2,%%E�;w�0�[�ne��{֪U+�=)9�۵kW@�{�<�&ihh�ȼ�S���"�XQm۶e���
ۿ?{��y��(�o�1X��sZ��`�G�޽�@ `���,##����d6m�4&�����]�#''��}�����3�@����O����没C������i�ׯgÆ
cyyy�U]"'�>!�V��2�;~�8���+�����Ol�@��m`` ?H�ecc#��D�g///�c��wٲe���C��c222X����<��Ą=}��R�&�.Q�^��y7�)���^�yR��9O
6�y��l��n�<�I�TQy��N���-[J�Qu]M�Իwo�}��gR3�}�*۶��X֤I���۷O��%y���ɫ���iӦr}�5iҤ�<ƌÀ���޽��n``������]���w���,==����0WWW��{��������,<<�-]��
0��l�Rf޻w�j���)���d��oTp��7y?O�4U�Ӛ�ˈ<֮]���W����fG}�D�fܸq2g�s���YϞ=٫W�ثW�XϞ=e��%�G�'��j�?X�c���g�&Mb���L[[�5nܘ
0�EDDH�[�?��/IQQQl��I�&LGG��k׎�^�����K�[^�����U�V�o�a'O��ٞ�{��.]�0]]]f``�������/��i�߿��1�߿gK�,a:t`zzzLKK��iӆ}�����ו�7�vI�ft��Q�c�)�ɓ'�믿f���LKK�}��g�곲Α��kѢ���e+W�d���2�l��n���2�$Oy!!!�C�L[[�}��glƌ�իWU^���%$$�-[�Lj���Ue��g�ؔ)S������b�۷g����EU�eIue�H^u�����r���W����w��ɀ���ܹ#s�z��1�&I�ݒ%K���,�~�~�������Q��֭[�Ǐ�*�o�1XV�sZ��`�Gqq1
���͍��ٓu�֍
:����O��Qw�j���3[[[6{�l��F(�y��y�������Bj���1�J�V�㲑��BH��ؾ��J{7n\����������#G���������*CCC*����t4k���� �*�e�-k�h�t�n�he�M�v�{���ʜ�ڀ;�B�P�ﵙ���B!\]]e�N!��Bj��j]
�B!�h�hiչRtU��u#�B!��2B!D����k�LEEER�CBB���GGG����#!!...X�ti�e���(�-11hժ�R�߷o�s��|ڣG����R�����?����?�j�
�s��1���Ri�[u��u#�B!��2B!D�fΜ�ƍ#&&_�5��␟��s��aڴipww���֬Y���۷�S�Nطo�(`Yf̘]]]�޽���������g��o�xzz�]碢"$''㧟~�…�g�淛��(��P\\�;w�`„	شi�_ZZ��q��G�Fdd$rrrPTT���D��nJ�~�.5�n�B!�bZ�!��1311App0F��3gΠG�R�����K�.��V�$$$�=�(���նm[������k׮�ڵk������ŋe�Q�@xyy�q�`�…�:u*������/��e�p�<|�W�^�֖,Y��G��޽{8p�T&&&ظq���[u��u#�

������A!��jD�e�B��9::��͛X�~="##����
�{��X�` ���Ǐ.cҤIh۶-֮]���X�������Ǐǂ���+w^���022���5<<<�f|��)S����_~���݃��.�w�9s�`Ȑ!h۶-&L��;v`�ȑJ!������q��Q<y����hժ����h�"�lٲR�V�jr݈b�9�#G����B�F4XF!�����2c�ɒ���T�{�F�޽�ڷ���N�0&L�����]f<�ƍc͚5
=��H��k��c��OѺ������K!�ՠ�2B!�Bd3f���@��fϞ�^�z���%P�B!�Bd

Ehh���A��BCC�suW��$�YF!�BH�B!�"+!��K�r!5W�
�ї!�B!�B�mT>X֫W/����:[B!�B!�B�=�I!�BH-�˗/���iQB!DT>Xv��E�?^��B�cL�U �R
nܸ�m۶��`�a�ر���D�.]�]5B!�V���e��!�T���`�YA!���<,[��F�������K�.Ehh(����\CB!����0	!��)�!U+44�V��`ee�����2w�ލׯ_�o���ƍ�?���w��̙3��.�BH]C�e�B�333�=Z�� ��=z4z���j�*YYY�ٳg����-Z���S�NEÆ
��JJJ������@[[�[����3�.�߁Э[7��~�)���p�����Q�F��NB!������߿�/��B,��(JOO����<y2lmm��zR$�T*s���ݻ�0aZ�l��Ǐ�^�ze�[RRggg���   ]�v�D��W�wd).!uO�^�ЫW/uW�B�dggc���HNN��RSS���8�A��m۶a߾}�~����}�6n߾����Q�ӧO#77W�5���-�����#GVq�!�����Q�:�ᅲ;�O^^nݺ�9s� ..��kV�:t����͛7�x�b��^�r)))����������]�`�ϟ��[���͛�!��������A/zѫ^Q~���Crr2LLL���X����=ž={�}���[�nEll,����x�b�����bbb�۷�*�K�!�B��>��e.\(w;7��1���tl۶
���عs'�w�^U�2#G�ď?��#G���ή����O�b�Su�(�`���}!!!�!u
��~*AVz||<Ν;���A�N��;w���7���[�={��E�
J IDAT/֠AdggC("99���5jF�%������Ruhժ��>�BQ����U^h֬fϞ���pܹsG�U��A��_~ALL޾}�-ZH����;DEE�~��2d�jY�(.!u�-#�j9rD�U�U^�|	�t�L�W_}x���6g�����|�2._�L�4	����_�>�߻w�@fL2.�ۇB!���3�޾}�_�/^D^^Z�n�	&����� [nn.�7oޠE�<x0������@�N��u\l/���_V|����			���E���1g��YLiiiؾ};.\����<888�m��<����Ð!C�cǎa�ĉR����_(**���#�%Oޢm
����aii�;v��VV��W�~�`��BQ����QRR"�6p�@X[[��8z�(nݺ???�߿�f��c�ihh��8�\�!�BW#�rrr���/^�iIII2�


0}�tܽ{�OKIIAPP�m۶rڗ%==���+���Y�V�kڴi����������())�����A�I�&�w�ԩS��ɩ0oE�?r�H��� <<���RQܝbn��2}��달�,~0J�@��	�˩��).!�ׯ_���M�4����/^`���044ĉ'�۸q#���PXXWWW>��*gC�纬G�tuuann����ש���9�ܹs�l���l�k�pvvV�&IE��s��e��7U���O�>�͛7�V��ra!8prr����޽�3g�`�޽��Q�7o���Tddd�y��b�s�B��B�_��/
����P�fq��ߏ�w���/�Dpp0�\����t��qqq ~�/����ʊ
0ǎ����N�Z�����#,,111�4i��+���˗/ajj��{���}��a�y��~hݺ5:w�����v�X>ׯ_����Ѿ}{t��A�9�����U���V�"�p��g
�K��-11бcG�߿��K���.]�s��!''x��m�VT�>�X�bE��7����\̞=,@tt4޽{���$$$`���pvv����]M���o����=`͚5HHH@QQ�v�Z@�޽�}���aee�C�!77m۶���%@[[�ߏ[�ٳgR�qi���B!D~�6X&:%�H�d�d Tmmmt��K�.��722@����%455aaa��+W��le$%%�
�(c�…033���.?�*33���]�{{{�cǎ|{�,YRaފ���#)o��/@V��uss{<���%
���t�5
���2�8��\0\8{���1�3�%��V�`�;'!!���8x{{�y���p�q���8::(��RWTG�����ҥK044Ċ+�+W�𳬳���h�"ܾ}�J�QSI.|cll�/|�������	033�˗/1i�$X[[cҤIx�����|ܾ�n�:����Ɔ�!/�JyϞ=��=&�K�#�B�bj�c��1.�)G�"��s����̼=z$w���999�r�
~��gx{{#33Sj%"y�nݚ����x�
�qSn�$�d�eQ�������?���g�"33���ę3gаaC4H鼁�8����H0\NE�L�p	���z�1  ��[�n�֭[��EEE��b7ԥY�f�?>N�8�{�:��ŋ�f͚aϞ=b3ԍ����ߢA���󃟟����X[���oT��A�F�a�����p��y����y���ׯ�L��_��+tkii!$$�Eajj�޽{�i@��M�7oFtt4&L� V^tt46l�����B�ǣ�˔	���]V�R�}$egg�[E1���ppp@�6m����@��2�_����2��6_^$ۢ�U��Q��:::6l��ߏ�'Ob�ر8y�$


0b��,e�V�Jy��KV0\NE�L�p	!\�֭�ҿS�Z�E7�'�{J��X�����bbb����V�Za„	��5�ɻ�Mew	�ȑ#ajj�?�/����^�BXXLMM�n�c����2C9�رc�C�v���Ϝ9���P$%%!??-Z����=fΜ)3�"���X�v-.\��������3f̐�)%o��CY6oތ��p899aΜ9��M5jܸ1.\��V�/��<���puuE`` ^�|	�7o޼�iӦ)�>%�Bȿj��2SSS<~��n�B����[�nI�kdd�gϞ�رcRRU�[uQ�q>


0Ɛ���oWd�$SSS$''��b��eM���L�]\\ 
q��Q�;G���+U��<�j%)W���7����������Fbb"<==aii���`���\8�1�{�?��3��FY��ݻw�������#,_����6l��=P����������
W�^EBB��L넄�|�=z􀩩�B����Y�E__�'OK�G``�XZjj*8���L>.��|||
�t��ȑ#�z�*�B!!o�ʞ�_~�B�;v�c���7�����?�P��	�B���M͵#�Bj��6�v�Z$&&����o�����۷/��Ѥ�$#--
[�l����O����ݍ�/,OII	�?�իW��iӦJ�~���!99�֭S����_
�46���QTT�;w�য়~��XE��133C�n���DDD��ڵ+,,,*��$y�JR$��(.!/�`�e��g1QU���h,�nݺaРA������&�L�"��"���ݻo߾E����(�1Tn�ʣ��]���Ǐ��s�1��݊�7--
�Y7��?�/FLL.]���~�
�A/Eܿ������EPPLLL���K��s��9�P(����n���8��oj7===�\����HIIAJJ
��ñr��rC]B!�b5rf���q��)<}������������#!!A�.Z���1w�\���M��ݻwpqq����xGVl�tPG4f���=��°y�fl޼dޕ����Μ9����9h� �;�i���#G"..6l��ؔ�[���֬Y�u��I
(ʊA'z�ٳg�s������ʫgϞ�p��ʦ`���m��W��P��+((��\��|��wr�����N�:aڴiR�Dc166~1��Ç�ĉ���/^,X������?NY�w��ΆP(Drr2���1jԨrc��ۣY�f�����󡭭���"DFF���vvv
�WSS����>�/KTTc�w�N�<����ի������?�۩S'���`�̙8w�f̘�P���C___��۷o��E��~�3g�ĦM��f�*���B!�Q�`Yyw����m۶!**
��ٰ������/_.vAްaCa׮]8w�^�~
}}}t��ӧOG�6m�}�ϟ��۷#55��c@i���M��?��&L� 6�`�ܹ�W�"##���+++,[��V�/ttt��[��̙3���A�>}���ӧO�{�"�eoo��͛#--
͚5�g��"oQ����H0\yQ0\B>>�K6l�o��ի��ʬ�XU�pu���Č3���3<X�MEc�GQ�,ZU,�ggg�޽���ppp��K������S�BSS�b�544ċ/���"5{�#V޾}��s��\L��x��H�7n��H���C�1㬬,����e˖�6Z��npuu������A!��)5rfP��������RRR-Z�K700��y�0o޼r�8p (���?HzzzX�x1�HIY�����t}}}���455+�S$��P�@����7���L�p	!�V����˖-���֮]��M�J��Pd1E1�w!U-�2b��ݻ��p��	ԫWOlQE�۩S'�x��.]*s��Ν;�8q":v��@hjjbÆ
�w�LMMѧO�n�;vĘ1c�-�,��ε� w���CWWW���!??;v쀯��T^��
!�B�����Ύ�s������<y�?������R|��
�|�%��G@@��d���غu+���!��d��*����)��b��,��i׮���Ú5k���]��رcb��^qqq���|�	����HD"Pt!nq���@�۷�����dllkkk��� 11QQQ�ӧ��J������-
eΐ*))��;�Ð!C���˗/(�6g�����ʤ�s���׮]��C�2�=��y���!����F����E�B!�cV#˸��׭[t���G�F||<�6m*׋EP0\B>>���
�Y�E��ɓabb���t~��b,ܪ��6mBjj*���a�XYY�A��/d���.@iL���bxzz���@*Ι"��A׮]���xzz"""YYY(,,ĝ;w0g�\�|={��O-66HJJ�ҥK�t�ˊ�^����(,,ĵk��߿�˔��?~<:��ߟO��o!�Bd���ar�O�<�'O�����|�	lll���%v��EQ0\B>.�,��.����b�
L�6
���9r$>��s�-�2q�DDFF"!!C��Wt���.d���.@�B+���x��5LMMѽ{w��.>�n�:̘1�?����Ty}����ի�7���lj'�|�r������Pt��Aj��/���ǏW�Lyϡ(MMMx{{c��Ɉ��ŭ[�йsgZ�FN�Ǐ;W�B��j�`Y�z�(X)�R�"��!98�=W�e�Y�ER׮]1f�<x?��3�m�@��X�7o�ݻwc۶m���E~~>ڴiOOO��׏߯��(��>FY@@\\\�bf)��L�fͰo�>�����Ɠ'O���kkk�9Rj0(]i������(..F۶m���'O�   Th�����1�;w�_Lf�̙���U�Lyϡ�N�:aĈ���?v��A��!$$D�U ��b=z�Pw!J�`�,�$"88�Ǐ��J�N!�z|l��[{	�
;v�@`` �9"������1m�4xyyI�Ͳ��J�^�ihh@(�7�BCC�\#BHm֣G�����~!��h�5rf!�B�z8~�8�B!��4-|�/eW@%�48FH-F�e�B!)n��������p��믴���?��eH� ��.U6XFw�!�z��B�e��7�B!�T>Xfff�ѣG�:[B!��^B��h�B!���|��W�^�ի���%�B!�������_���˗/����B!��q��BQZ
�BHE���{\�p���R�nܸ�m۶��`�a�ر���D�.]�PSB!��UY̲����ʚB����8r䈺�A!��p���<,[��F�������K�.Ehh(����B�ZT�`��!���UXXH�e���j���t�'���
d�Ҫmv�ލׯ_�o���ƍ�?���w��̙3�X;B!�zT�`!��W�R�pi�?>,--�c�@nn.�7oޠE�<x0��������QRR���DDD %%���hݺ5���1|�p���ɓ����������Э[7�|�駰�����F�UMgB!5�G7XV^ �s��!<<w��Avv6ڵk8;;�EA�u.D/�8:::hѢ������	cc��b��Iw���.D����G��|}}����B`���{�.�OJJ
�������m۶�^�z�m۶a߾}�~����}�6n߾���>^�"y�r��i������Vj���-�����#GV�3!���,++�inn./^�K�.��'$$ !!AAAX�|9����u[yAe%�իWéS��m�6t�ԩjI�&�r��E����!�^�za����F�baa��� ~v���q��]|���F�֭���3�Y�qqq�g�����n�
+++�ĉX�n<��ɛg||��c111����K՟K�����2B!u^ٷ�꠲�����ҥK044Ċ+�+W� <<������ƢE�p���j�q�Uֹ����󯘘�߿������ŢE����WM5�8q}_�$��A��E=���R
BCCq��uWC�����^�����أ�����5k����������ʕ+'N��mР@("$$���5j����T��ܿ`nn.��U�Vb�B!u��f�ՔG�.^����h4k�{����`ll�o��
4�����������~�tuuѮ];���/���p��1zT�� ¤*�j̄T-nQ7��y��9���I�=��3g~��\�|�/_���?&M�WWWԯ__�<ey���?¥q�B!uY�}��۷���_q��E���u�֘0a�����U&��c����be�Ǝ�ڵk'��������={iiihѢ0u�T4l�P��˗/��������0f�L�>X�~=������
;;;,\����b����`ݺu�������D�-*U����			���E���1g�����
@+O�e���hkk�����ވ��,S�~�*��IKK���q�������_K�������!&&���hժ&L�GG�rϋ��SaB!���u�<�3�+�1Vn�������5Ο?��G��֭[������1k�,��HE�ECCd�5�Ҹ}!����F������/^��Ӓ��d(T6�)�heϞ=��G__�'OK�����ɓ���̧���"88qqq

��s6l�ǜ�]�v������|����q��qԫW+V�;~�����^~~>N�8��7ob���000P�^ӦMCFF���ÇQRR�qEy*��c���C>M���ӗU�,L�4	/_��9u�rrr��Z�{�x��-̣G��|�rcذa2z�j�SaB!3###<{�ǎ���Q�����	NNN�{�.Μ9��{���ח�[�h���7o���Tddd�y��b۸��tB!�.��1˄B!^�xccc!662g~�2
ƕ+W�.]��L�;}�����&&&
�q߾}HNN���	_��@�ѣGسg��1�����?p��%L�>�n�:hjj���È���ԩSQQQR�s��cccccc�z�
���T�������L�4	@�ʠy�X�<�:�h֬�����<}��v����/_���{����ۢ�UY�޽{��[t��aaa���ˆ#AAAe��"u
B���(,^�p��A~?y�R�Ɋ[TS�l�!��LܫgϞpuu����U��2$�V��A��W���1`�,X�����ʣ�����`޼y�7o=�\C���@i�ܤ�$#--
[�l������ΰ��¡C������m����@��{e��f�q�n�W)��T}���V�'�B�j,S$*�Ͻ��:u�mmmt��K�.�ʷ��L555�>:�Yu�ܹ3?���ٳR�,^�m۶���\]]>|���7��͡��www�޽�<�������ԩ?[Ht0D�z-\�fff����g�dff�ە���TVqq1@K��I���O����v�?��퍎;���%K�H�U�_�x�`�����A����A||<���O������A�)�0!���WYܩ>�X�bE���T��l��JJJ����s��a���b��RE{�U�,X����c�֭�y�f��$����V�Z!!!nnn�ѣ
�������ܹs�}=<<��d������
�ҵkW��lڴ)��Ņ�Y�=i���(U_.�w�ު�B!�F���arw����+�tыNe��ŋHII�����}c������=F׹sg�}�:�z�J*�;q��B�nݚ�Y4��$kkk�߹GEWU�^��s� �*���,��A�O��ӗU�n.�N�:�'�^�����]�BLA�	QUbI�~��6oތ'N��G�>}TV�<d��:-���)))X�r%nܸ�]�vaժU
�W�s%��0~�����r�;���y�5l�AAAصkΝ;m�kD IDAT�ׯ_C__]�v����ѦM~_�?{�U����)'C
��`[O}��05Ő<�y´]ZhlQ�]��)���xHP�ܦ�۳(���e�H-�L-A�����3��00���uy]Κ{ֺ�5:���eccCbb�Zj��Ņ~���i��344��+W���Kqq1�&::�Ç3q�D��>|�f͚��s�=V!��nSo�e�B�\�T_A��2�֭���G��r���o���_�k׮�]�V]��OuB�7ֻ���j�4WSiː�W�/���:�5��T'O��
[0���˺�����ܟ�:���E]!�"��RJ���ё��P������,������m۶���[�;��Ǐ�{$u��qppPo���R��&������mM�6%  ��kג����)������ӄ���ԾB!�E
re���?��#gΜ�g�Q��9sF�mm�2���$���:t�ZKQVV��ի)//gذa�D���3/^�������Km���`J_j����u�S���_��n��~��KII				xyy��M�!�.����BVV'O��*l��v��8��?��?�̅�ҥ�����"�RDX4T�$��ݻ�m۶��STTD�֭���bƌ�2ij"muۍ�Wu�Ć��֤���?�]�c�:6��۷ogԨQ���h�(|}}�r�
۷o����l�C�ݼr��ڼWʹ\�d	���g�̙��9I�

b������3w�\���B�6m�0a��{'�BԏY�_Y޽x�b233)--��ٳ,^�X�mm���ݛ=z��o�Lrr2���������2k�,����۷/�����ɚ��H222(--%##C�c]�sx���q��)"##��%�u�/cα��U���?���d֬Y�����m۶Zc6���˺���?T�?'O�����o�����{O�m]_�E�t�Rrss)**�>���]-�O]!�"¢!Rcw����Aii���$�|��'���[�8q�[�nQZZJnn.[�laɒ%�޿�L��/�vÆ
\�r���5�v֬Y�J_^^���Y�t)]�v5�1j36���+���\�|�����222����g�����,�Cq��E@��9�FRR���ܸq���>��c���R�INN6x�`ooϢE�عs'999���s�N-Z�UNA!���5ȕe�Ǐ端���ŋW�688���L5�+dz��
���hӦ���ɒ%Kx�W����B���;Cu�<((�}��q��e5uP��ꪳ�u�G�.]3fL��˘sl���EU)_����Z�.��ϐsY�0a{����j�)TL�U�4����ˤ������/����ԩS�|�1}	

"22�%K��§Yw�o߾<x���L�z�RDXX�fb��K�֭�裏�׿�E\\�Z{���@�d����iԨgϞ%$$�Ç�z��2�_�+�4W)i��Λ7�:p��%"##��ۑ#G����kkkk��S�Q۱i5j�|�
�w�֪��(�j�WEii)����V�{�6�x~��wiӦ
+W�d˖-�߿_]
dh갲�W��O?͌3ԉ�3g�,�Bܫ,���ĉU~����'66�#FТElllpssS��j��2
�M�6X[[�����ׯ�Z�J۶m���V�B���ƍy����ڵ+M�4�iӦ4�U�V���\I{�Y�n�G����	kkk���7n�ׯW���STT����������ĉY�z����~s�
U�{�����ڵc�رl޼Y�^���3�\�Ÿ��숍���ߟ�-[bgg�s�=�&Z�v\5iժ�֭��LJ|[[[:w��￯s���}���#""�N�:agg���:t 88���~[m7x�`�4i�wbA�s2&�����C���7�ХK�������T_+��DZC��/�}����ښ��z��+W�L�����&///III������JII��ɉ���ת����<<<�ܹs8880y�d���o��۷���^���~�������`ٲe,[��q��Y�;B!D�j�+ˠb+""Bk[NN�[���^�B��ƍH``��}l޼9s��U��V��IAc�7oޜ��h����sl�>�z/L-�mL�\0�\�{�PQ<7,,�������񝝝��N�ٟ��Ka��{��5fϞ���}u��&���~������E^^���
�.]bȐ!zW��&��6c�dcc���/�֭����x{{s��Qn޼ɴi��ڤ�Mۆ��CGGG�~�i�N��U����L6l޼9��#��B!��i��e���������0|||h֬�.]R��>��S��������74���>����ŅСC�v���ѣ�}��	�����kjZ�[�~)ǪNM��X�`AAA,^���-[���q�ڌ��_|�
6��_���MRRVVVZ�U��WC/��c<5�H�B!�i�d�СC�����<jٲ�V�'!��K)"��믫�:w�����˥���Cc�������e˖dee�ϗ��bc��#��7jԈ��r


h֬`�J&S��I��ԩ����_����H�~�i��ks�ڌ�2ggg<<<HMM%33�C�1`���ȺN�6�x�"��B!��i��es����Օ={���O?Q\\��?L�޽�2e�֗Y!��M����o߾lٲ��K�I�-X�|9��������;v��>�,YYYj]M��%�����+!(;v�`ԨQ�����hH��ɸ˗/���
T�٬_����p�Ν��?����M����Oqwwg���5{��ɤ�����Mll,����s�8�)c�gԨQ=zT
{�L�6���ƣOǎ����ҥK:�b�:l���dzc�KwC!���AN�YYY@@@���� �Z�K�s�0�w�P����ERR:�5���{���S��o߾���h�����Ufh��%�+���ޞ�¶m�5j��_�ڥ��fl����'''�^�����<���u�H\���GR�k綾^�t�w��^z��B���AN�	!�u��Is%16&&�cǎQTT�c�=Fpp0�
R�͙3���R>̝;wx��Ǚ0a?�����lݺU�䖡��={6VVV���p��m���Y�`C��vl��+44��+W�����BSRo׬Y����z�*M�6�G�L�>]��|Mz���ѣٺu+˖-#&&��Ǩ���Qj�������S�˜�>ƣ���������L�8Q�9I6Lbb��� �BhTnL��			�?^-�[��B��q�}�o���W�f�ڵ�رC+ux�ȑ���0e���9~�x�"�E��Y�F����WW;K��6*�h>B4h'de�B!�=JR�ko�ȑ�˭�h��5!�:�,۶m[]�Z!��+��LR�k綾^��eB!�}��&�d&]!���$uX!��8f�,�T;!�B��E����r��y:v�h��\�¦M�HKK#77[[[���0��c����`������9U��v�}]bb"iiixxx�"!��f�,;r�˗/7�n�BH�ۄBX›o�����,R���L�:���u[qq1�ϟ���ڵ��k����d�.�uN�:ELL[�n����1c����ƓO>i�	!�=���;�|����Bضm�|�
!������˖-����^�z���@ZZG���'�:u"''���3��N�8a�D�!n߾͂�M�68;;������}�v�W!�GuV�LV6!D�JHH`����B�wL��Nh����ޣE������SO���G��d-jݺu\�z��cǪ�ƍ��͛Y�n3f̰`���Rg�eB!�%4j���]�'��WVVFll,������`kkK��e�ȑj��&�*oW����d�RRR�����ӓ�^{�֭[�֐������Ʋo�>�_�N�֭�fڴi4k�Lg�����������o�>:~GGG~��W�]��N�)\]]�c�����/вeK�oߎ��n��|�2~~~�mۖ/��B�KZZQQQ|�����0z�h�O��͛7y���9t������ߟ�s�ҴiӪ��*U�^mٲ���(222hܸ1�>�,�f���޾�}EGG�s�NF���Y����g˖-���S�6�Gywww�l�B`` >���B�K&˄B�<==eU�������]�k��İq�F�qII	gϞ��ٳ��"����g׮]�����ӧٴi�N|C�޺u�ɓ'�����.77�����Ӊ���I�&Z����"??��bƌʔ)���{L�6�_|OOO�x�	lmm����2f�����������ܡC��߿��k>���o߮>^�f
m۶e۶m�;wN=7�w���ʊ�V9&c���p��M���9eee����m��GO׮]�6m_�5������G�}�>}HOO'99�Q�F���Bq?3{Ͳ���U>��~fϞ���}��aҤIlڴ����z��Cy/Ν;���;C������ה��1|�p���9y�d}t��2�\�����������˿BqS&hV�X��c�8t�aaalݺ��*�Zǎ#..ggg5IҔ�7n$++��m�DZc�X�v-���\�p������}������]ke�f�.c��/���6l`�ԩ0�W^y���D���ն�Ǐ�I�&:�R&��맵=33�͛7s��Q�O���%K������?'55U��R�a.�ڵc����2i�$��}�������}���X�B��LMM�s��:�Q�)m�B��}��������B���8z����222���#""//�z��M��ҥ�;w���ȑ#:W5?~���ڷoO�=��GR��0͑#G�f��$  ���xKw�b���Vy��'hҤ	�n�">>���,������߿V}SWu�֍��pfΜ���ujW�V��	�[�nt�ޝy���ꫯ�o�>��N�0;;�j�i�}||��������<y�S�N��7ߐ���'�|�C=D����g�ƍ=z�>}����ϙ3ghڴ��İ�0�q�����ի���?�7o�ڵ 00���Xu��̝;W]�9~�x�������iEBB�\�Rk��r�Y髦G}T��B�ڻ�V�U���ѣGqrrb�…$''s��qv��Ipp0�n�⭷���ٳ���{W�BY2�cǎj_���??���X�:�H!)GB�^yy���?��H�2�̚5�ƍ����G}��>XTTT��zxxh=V.����/&����*&�4=��S\�rEg��$MuL�Ν	f����ݻ�iӦq��E>��C�̈́	hܸ1�֭��ѣܹs�޽{cc��&�cǎ��5o'�С����j�Ն�1�	0}wS$$$5�~��w��nܸ��&��Mi#���,6YV߷�U�ȑ#>|GGG֯_����qtt���ggg^}�U�O�Ν;wX�j���{�<x0M�6%55�k׮�ms��
:�<��a�깇������W��_�BaY�E����m���aϞ=DDDн{w���X�jC����?��wyy��w��+�<�L�h�7�meՕȨiU>�~������իW�'((�(ԯpttdԨQ�:u���L>�ƍ��!砶4k�UB�<@yy9�W��zNy���*�$�F!̧��,�v�x{{ӻwo&L�@rr��I���BV�X��#�ݻ7ÇgժUZ_04_����i```��Inj�+��„	�����l�2�
���/��QQQܺuK��r���R>�������C��̛͛7OOO�…)((�y�����o����'���DDD�X2�_.\`ƌxzz2h� /^���ɐsl�>�����6�;w��Ie_~�%�������WЌ��ɓ'�VkU����z�j����ݻ7�����_�Y��ߝ�ϳ!)GR?O!���8880b�֮]�ƍ	

"//���(��2ѡ��…U�3##C��S���_�bR[gggN�>��VyܦM�*�RCƯ���7�p��%@w�(00;;;�n��ѣG����o߾&�Ւ�x�
��iJ�@�V���"�lS�!���9YVPP��)SHJJ"//������{�͛�Ӷ����ӧ�a��\�BII	999���1k֬�+�VV�C�iӦL�<Y����y�f~��WJKK�Ġ)S�PXX���>����D
���c͚5�ڵ�����$''STTD~~>�w�f�ҥ:�W��������#))�I�&i�<0�_!!!���STT�͛7���ϵ���r�kڧ>ʭ�;w�Ժ��P&����rjSLLk֬���˔��PXX�ٳgy��w���R繦����B����;�B���2	_�O߾}	`��ݖ�Y��jt	X���닻�;�}����<��㸹��+�Z�l	T|߹}�6YYY,Y������{dffRZZʩS����*V��V��IFF���ddd�x�b@�j�ʔ	�˗/=�q��LJ~ȅ(..�֭[:t�9s�0p�@�c>��C�����W_������ѢE���P�?��{�O>�Dݮ�F�LjR�i�j*��v�dY||<������jOll�ޕ_�6m�ܹs<��$$$p��qy��'IOOg�ΝU&�\�~��m��GS�j��SWIF5%�z�
�gU�E��޽;?��3�����w��I._�L�Ν�ҥ���Lm����<Kʑ�����O~��.\Xe�NQ5%`eΜ9����b�
�U6BK�}pɒ%��ߟ޽{�U�^������_�~�=��IGGG������`�ԩ���ҥKƌcR۠� \]]���fҤIxxx0i�$�\������ݥ:ʄ���Ç7j�$00���r�n��رc�ӧ^^^���dggӮ];^{�5��N�8Q��jȤ����PaN���̛7�F�q��1Μ9���~ff��k�mu9v!�����dYU?T�m���ckkK�=�?��~SRR���`nnnX[[Ӿ}{-Z@RRR�������Ǡ��>*�A����y���cgg���L�iܸ1�����%�J������d��S��$�4n�XM��\�f�9�i�U��пR�_39ɔ~UNmR
���Ǔ�������?'N��;٦���,)GBcU������СC���O-�;󩏐	X�QݿQ???"""�ԩvvv���ѡC���y���v�g���ߟ�͛cggG�>}X�`A�nj���������8q"�W��[G̐�>� �֭c���899amm����ƍc���ZɌU	

�m۶X[[�%1?�믿NLL^^^<��CXYYagg������
�~��:!��iӦ�߫KU�[t�֍_|����ӤI�.��ÇӬY3�{�z�B��ljnR����J���r4�o���#�ZNNN���/���о}{�m���)((�Y�f�6S�j��SWIF5%�r�
M����g�eٲe�۷���<���c�޽4k�L�vS�U9�i֬Y���ۤ������'�|¤I���U���,)GB���L}$��7GGGBCCIJJ�ᄈtw�*U�l޼�u��1c��N��F�Q����=aaa�
wEU�U͛7'::ڠ�ڶy��̝;��s�Vۮ�>�����㣳ݐ�+<<<t���DY}ծ];���U�՘������c�k7o�<�4M�6%  ��kג���������ӧ			��B!D����2cR���V�Kx�W�JS�b�u��
����ʷ�~��	�Ν;�	�ڦ��U�QM	=��cCS*���c����g����Cqq1Æ
Ӛ�2�_����PU�ڜgI9�a���_Y�p!�>�,�;V�JUcC>�i���g���9R�s���˸�����kP�KKK�����z����U�
Y�|�2={����O��}}}�ٳ'?���Q㕀!�N���\�~�������� y�������i�F'�L!D�4ȕe...��㏜9s�g�yFݮ\5�ԦM.]�Į]�LJ�2dIII���3t�P��W�ȗ��3l�0��Mggg.^���ӧ�ի����AU����壪$#s�����X~~~�����_0f������h��_JBӈ#8w�{��eÆ
DEE��օv IDATSQ�U�V���r��M�4#I9�~ܸq��� ���.��;w�<J�GVV��N	�HOO'..N�
��PTTDRR�O�fӦM8880f��������2C�aYӭE���ܸq�e˖еkW��P�t5%%33���ub���`,}!+7nT�/))��ٳ�={�����u���+���|��7ddd����gdvv6�z����Ũ������Nrrr�?��������f�g����ޞE��믫�;w�d�����!��x
���r���ŋ�䞳gϪi<��D���p���{�ܹ�����qwwW�^����޽{ӣG~��7���INN&??������[f͚EZZ}��ժ�e�� c�W�QeƜcC�{/�����ٓ~����d~��z�衳���24����8ϒr$��mذ�k׮ѥK�o�ΡC�Ժ1qqqj;SB>j
i?~<M�4�y�2Y��sE��gϞ=<x0���X[[3u�T��Ƅ�z�e��eªr⧲�M�Ym�x%`E������7�o߾DGG���eO?�43f�`�ҥ,]���3g�-U#��v�ʲ�����W_q��E����ḿ����Y~��0{�l�q˖-�q�~~~�i�F�¿d�^y�~��G������;�h��ľ}��|��N:���A�R��4�K22w��9dž��P�5���t>��@���9�Ddd$K�,щg��G]��}�r��A233u�-)GB�������O�8��#G�3g���@ń������!���*���өq���jH�̙3ٿ?3f̠y����q�F�=J�>}����̙34m�Ԡ_�����֭!!!:��EqvvPCQF�IRR#G�0�<K_�ʭ[����'++///����~�+���ptt$%%���Plmm)--%%%'''u��1㕀q71���X�QSMA^����5,L!Dݰ�ʲ�R���퉍�eĈ�h�����+њ_��5kF\\�i�kkk���b���Z+q�%�@�$�ƍy����ڵ+M�4�iӦ4�U�V���,m6Gb���+ɨ2cα��z/^^^�jՊ?��GGGu���eLB���8ϒr$��)�5}~��aHH˄	hܸ1�֭*�i޹s�޽{�ԭ���,ݷo;v��֖!C�� �E�\��Li��z��/d�q�Ƥ����G���U�|}}���S?/�=�͛79r���Ę�J��B!��� W�A�VDD�ֶ��Z�n�����7�x�7�x��}V����*Z�� c��W���톞cC�Y�{�#����j�e�~�a	M�^o��,)GBԍ�תKìm�Fu!���8::2j�(���T'�jZU���

b��Ŵl�R�"�1�(ƞ���r�5�.�(�xxxp����Μ9êU�شi3gά�F؋/�Ȇ
���/�&))	+++u"L�Su�WV�B!4Кe���W�H���QVV�O?����Q��q���#!,���W��֧�z(������z�/�*�����غu+G���ʊ�}���N�:Hyy9������i=��i׮]:I�'N� ==]mk�yP&�


�m5��2%de�ڵlܸ��� ��򈊊��5���xxx���Jff&�b��ZI�ƌW	OQ�T4I��B!��A�,:t(�}���:R-[�dڴi�uKR�����}��e��.]Jdd$-Z�`���$&&���¿��/�v���H�y��t�¹s�
�x�x�w�ԩgϞ����C����g�}Fyy9ݻw�E����ɤ�����Mll,����sd������3w�\�q���6m�ħ�~���;�W�6�<(�'w���Q������]___���	c�С<�����@�!+PQ���ѣj-��uΌoǎ����ҥK:�b�"�m�V�G!�B�[�d�ܹsquueϞ=���O���ӻwo�L��u�X�{�f� )GBԣ�_~���222x����L�4%�Ð��ĉٶm`\����=.$$$�m۶1j�(u�1�(��///�o�Ntt�Z&@	10��!+Pq^����z�*...<��3Z�3^	X�ٱc;v�t7�BQ��d������h�ד��.��/Dݩ�3�U�V�[�����;FQQ�=����4Hm��|����\�~�V�Z1h� �N��7�#**��������#�?�<S�Lѩ�5J���z���ѣٺu+˖-#&&�_(ʚ5kؿ?W�^US6�O��c�=f�y�={6VVV���p��m���Y�`C�1��~~~��ؐ��HVV...��׏���j_��(������O���1�<x0���>|��'j�GV�o5վB!Ľ�AN�	!������"YCC>4��p��ڵkG���u���"ʜ9s�3g��vCCQ���`ooOXXaaa��.BV�M�VmiC�++�*�G��t�w��^{
OOOKwCa�Y�_!��r��u�����,jGV�>۶mSo�Bcl۶�˗/[�B��2!���м���͍�Ç[�7�	XU�����B�U. �����d�|8!��qrr��͛���������t_��!�Bu0Y���Ibb��w+�Bܕ�	iIJJ�ÞCH��B!���0�B!�fq��y:v�h����݁�/0Ҧ.{���'&&��������I!Dc�ɲ#G�0~�xs�V!�����-�!���7�|��Zl2�nq��)bbbغu+���3777�|�IKwM!���V��/kBQ��b�B�9x𠥻��ݾ}����O�6m���c���l۶
{{{�P!�m�B!�1r+�uk۶mR׭K�(��֭��ի�;V�6n�86o�̺u�1c�{'�B!�eB!�	������K�����^z�^�zY�w���2bccINN&''[[[:t耯�/#G�T�U5�Vy��855�%K�������������k�n�Z絆����'66�}��q��uZ�n���7ӦM�Y�f:����%44777�~k����˜}�v�ZRRR���hݺ5C�aʔ)���U;�իWWۏ�ׯ�r�J<��۷�f޼y:����ٲe={����I��#����Ζ-[���iBa��d�������7nL�v�?~<Æ
������`�;���feeE���y��'			���v�:w�'N䡇b���XYYUٶ��___rrr����G��>�!�=�B��~��鉧����!�Zbbbظq�������g�r��Y


L�}����g׮]�����ӧٴiF��u��'O&++K}]nn.			���G�&M��E~~���O}�ߘ}3}�tΝ;�����!..���Lbbbt�K26���4i���궯�������_�5������G�>}����Nrr2�F�2�!��3U�0܃�|�M�~ �����,\�Pj0����������3y�d._�\'��ҥ�;w��~�ȑ#ն=~�8999�o߾�&��R(vΜ9����b�
N�>m�n	Q�hԨ���?��H}D�m߾�+Vp��1:DXX[�n5y�G�a���;v���8����r�
�6m2��ƍ��ʢm۶���q��1֮]���3.\`���:�m߾=������׺8x��	�q]�ߘ}oڴ�s����O�������ILL��'�$==��;wV;��|��dgg���†
8v���������i���
@�Νu�S�)m�BX�}����	��+�nܸAtt4III|��0�.�g��TC�/eee���h�"N�:Ś5kj��a�Q�F���c����_e���_@E��T_��B[bb��� �=M&ʪ�+��'NФInݺE||<YYYxyy�������P�֭���̜9�����Խ2����[�nt�ޝy���ꫯ�o�>��N�0A�F}�j���;%%���H�����ɰE�1r�H���tn�4dl`޼yt���=z���_]����h׮��~}�Q�6B!,�b�ewC!TGGGBCCIJJ�ᄈtw�
VVV�mۖ��z��c�r���:;���裏HMM�ڵk:u7�b��СC<�
�VZs�B�Bh��eBԭ;vX�w�Y�f��o���FZZ�|�	�&M"  �x��zxxh=~��'��_Lj��Fؽ{w��O=�W�\�ٯ2�SC�omm͝;w())���Vg?EEEj;c����0b��}�p�Ic���Ce�Q��7M7n��[�L٦�BaY
�6�k׮���7�{�f„	$''���sծ���+V0b�z������Y�j���j����GUJKKhԨ��s�Wq��U�ϟ���ׯ�������Ny|��I����>}�I��~�:���4h}��a���t�4)W�n޼��\aa!���������?u�����o��鉷�7\�vMmgooϰaøs�Z���/�����R|||�/!�����iYY�W���Ϗ޽{ӿ^~�e�_���,[��aÆ���/�@TT�n���.0c�<==4h�/���Z���Pl~~��s#�B�(�j�nX�v���CDDݻw����U�V1t�P>��s�}�����]Mac�}ͻ��@oWc�V���ǐ�W���y��@�wf}rrr���o�s�O��a��Msߕ�Q���~��wޕm�~�BQ��m�L�2E�j���7UƔ���(//�ƍ,[�@]Vm�q���^~�e~��W��Rc��*#5���(��ŋhժ��saaa=z���JHH�����s�j�3��Q�HLLd�Ν�|�P&����(�jj�ZS
熄���EEE|��甕�H�X!��իW���IOO�������V�9WC�
;p�6�s����Krpp`Ĉ�1�s�αw�^6l�@TT��3�Q�F���SPP�&O�[������8u���_Lj����ŋ9}��VکRU)�`
C�߾}{nܸAJJ
���:�Pn��2t�mڴ�ҥK�ڵ�V����Ņ��,N�<��},33S�m�V������͛:ߑ��{��;!��
reY||<������j����X�i4�쬪�&e5���;={�d��$''cmm�ԩSM:.TL���_�
���p��!s�2U�b���Ә�U)--���w��w��:m~��w9|��z��H�!�h;t�@�����������'Or��e:w�L�.]�>U�SS՚R8�]�vl߾���T&M��s��P��7�|���OAA���Z+Z-EgjGBP�%�������g�}Faa!�?�8nnnZ��l����w��m���X�dI��}���̤���S�N	T��0����PQ�+##���R222X�x1����q��EK̀'C��s����O?���~��;w�p��U6o�̚5kx��������zl��=w����|��Ǹ��kݑa,�?����<y���R���[�{�=��;v�ҥK:�)۔6B!,��&�4'���>���r�Q[[[z����u��Y����
kkk�`'@RR��}���橧�b�ʕ:W��9n�Ÿ���xxx謤2���Hk�O�@iu4�?9w�L�<Y����7ڷo����:	y��u�vJ1Z[[[�-�N�)W
+����,�jʿ���TY�Obb"���;����8qB�d�B߿k�p.��}�t^3w�\\]]iܸ��b-//O}^
�
a~|��'���3o޼*/�ԕʷr%''3t�P���ƽ�>�k�ggg5E�v!�JPPK�,������[�N��ҭLVEGGӯ_?F�M�-�ܯ��#���xxx0u�Trss�ҥcƌ1�mPP���dgg3i�$<<<�4iW�\���U�hWe���Ϗ�Ç5��#G���AII	�1C��W�^:�e˖Q\\�/���ט}�裏�����	�ի���O?�`���5��*&L�cǎ���2m�4<<<

�S�N:m����_u�l3dRR!D�k��a*WV*����0�`gU�/�yyy���+\�t�!C��-Ƙ�*Q+��\l�*#5���(����5���<���L�:U�Rw���J�	}�0-\��ϲl�2���G^^���w�^�5k�u��^M-�kJ��:�Wn=�<WR(V��t�R���ݝF�\��.I��$Eԇ�&}������!11Q-����B�~����ٳgceeEJJ
�o���ݝ0d������b�…���������?ϔ)S�~f��dݺu����\�~�V�Z1h� �N��~�Nhh(+W�$77W��f������پ};_}�?��#���4k֌'�x��sC�ݬY3���X�f
�����ի4mڔ=z0}�t�[;�aggGll,+V�`�޽0`�����믵�<���h>�ĉ��;|�0͚5SW�	!���z�,��%:%�e�+xiJ�Κ888�`����X�x1-[�T�o�r\kkkJKK
*���e��w���$c�iL�RMƮ
0�OC�����1|�p6m�Ğ={3f{�졸��_|Qk�^}||����|���9s�U�V�i�&fΜit}��
�j�B��߿�¼4/���������3Ky�e������Ƞq��<��̚5{{{u?ׯ_g�ʕ<x�۷o���gMj
�Y�v-)))���o�nݚ!C����_eժU���r��-}�Q&N���\�_M?��DZ����������ի)++#66���drrr����C����2r�H��m߾�Q�F��⢷����/W�\a����<^CBP�^pœ��Zձ��',,L-��{V��͉��6��m޼9s�έ����ハ���vC�ߙ_z�%�R�
ݷ��o��o��F��^[�sM�65�kڴ)�]����lڶmT\P=}�4!!!:�k�BXF�\Y���?�ș3gx�g��gΜ�i[W;;u�D`` �ׯ'22���~Z늚1�}��G9��N�ϳg��5��kM��1J�1�k�������/�`̘1|��:W�bH1���p��²j
�0Gp�9gnܸAPP�V�.��;w�no2Fm�P\]]qww�o�!##Ck�sFF��������+!(B��&((�ݻw�NJ���ӦM&L�`��	!�P4�����ŋ��HϞ=��dL�N}EG�3y�dڶm��Nll���Un|��w���Cii)������:�4��kM��1J�1�k]]]�ٳ'?���������у���k�3G�WC��Vf�¹�I�X!�ː0M5�p��RW�36l�ڵkt�҅�۷s��!^|�E���;Iz�#E��ڽ{��v���RҘ�J������gѢE�ܹ���rrrعs'�-����B��� W��?������/ꍎ�́Ԃ��*�lٲ%7n��Ϗ6mڰk׮j�moo�…			a۶m�5J]�d�qǎ��
		Q�+)�����ؾ};����ry}W�
eL?'L��޽{9�<ӦMS�<X�dL]S��j��p-T������|h�Ws>�Ddd$K�,љ��WWO�u�������:Er
-�[Y߾}9x� ���:ǖB�BT�WwR�vS
�+!P�+..N+��rp
��������ښnݺRm��3�\2r�H����[�9��9s�~����+�L�/�֭[��Ǔ��������z?�^^^8::���Bhh(�������������Z�Ș�J��!z�駙1cK�.`�̙�~�BQ�,����+�������2b�Z�h���
nnn�k�/�J�΀�ڴi���5xyy�~�z�U5����m�kkk���уѣGs���c�kggǪU�

���	[[[���OTT���fϞ���?͛7��Ύ>}��`������������ߟ�-[bgg�s�=W�_�L���'6668991q�DV�^]e�3///Z�j������N�90�|T��Ϗ��:uꄝ�vvvt�Ё��`�~��*_��=z4NNNX[[���ĸq�X�~�A�s+<x0M�4����:�I�X!�^M!��(?#���Gǎ���5(pFsE�2a�/p��+N��4nܘ��4>��#ƌC\\EEEU�����צ IDAT___����ϴ�G�r��MF����5`�x%E܋�I���$_a����-[Ʋe�7n���#�����*VEDDhm����u��Z�
-�YU�њ�D̙3�9s��l7�P�j��+��_�mghqך��OC��tL}�jo�µP��r�>�(�jH1Y}��m�\)+��L	�1TM!��(�8cl�a3�
By��ٰa_~�%���$%%aee�
`�x%E!�B�A�,�߿�Z*//���2~��'u�NMW䅸���#��n�B�B4...�<yRk�1�)J�Lyy9���Z�y��Av�ڥ�"������}�ᇁ��c�	$� c�f� ��kײq�F������ӻ�Z��쌇����dffr��!��di�x��%�A���!�B��4��2%�~ɒ%x{{��3���K/q��	Z�l�UOK������2Wp��g����ҥK��ͥ���>�www��?�>l�� ��?y�����)..֩sf�x%E!�B��Aކ�L޳g?�����<�����ݛ)S�h]aBH�X!*s��+p��_&%%���^x����)��
�15*BI����z�*...<��3Z�3^	A�0~�xƏo�n!��5��2+++�tW�]�%��4��!j�>?c��+V�w�^


0`����XԤ�lݺ�e˖�/�d͚5�߿��W�ҴiSz�����y���}�jՊu��ñc�(**��#88�A���fϞ���)))ܾ}www,X��!C꫟�666$&&���Tܒگ_?����}�R�,66???��bƌw��DGGs��a&N���	A�HLL�t�w�^�zY�B5*��Rn
?~�Zp��c!���~�<���+L�z�j֮]ˎ;�BPF�IHHS�L�p�>�*+�Vf��w�F��^|ڶm��{$������WWW@��EѠ�h�+˄B!�!((�ݻw�&K�0��ѣ-�!�]L&DŽ�{�d�B!�YJ�믿N`` ;w�d����""��
!LQ�����Rg�er%N!��.$�~�"�B!�a��2WWW^z�%s�V!D
�W��I�B!�0��'�<==���4�n�B!�
����ر�I�uwwjN(6�]m_���HZZr��B���>Y���	!��I�BQ��|�M<h�$VCt��)bbbغu+���3777�|�IKwM!���YͲ��ĺڵB=رc���!��>p��z9N]O�ݾ}����O�6m���c���l۶
{{�:=�B����&ˤv�Bԯ���,C���k۶m��y➱n�:�^��رc�m�ƍc��ͬ[��3fX�wB!,��&˄BK�:3BK)++#66���drrr����C����2r�H�]U��*oW����d�RRR�����ӓ�^{�֭[�֐������Ʋo�>�_�N�֭�fڴi4k�Lg�����������o�>:~cTuN�l�BTT4nܘg�}�Y�fU�,::��;w2b�f͚E~~>[�l�gϞ899��y����ٲe���<��&�]!�ݫAN��Z�S���ٹs'�~�-�nݢS�Nx{{���+?�ꀾ��xM=�!���e�V�_)&+��Hڡ��bbbظq�������g�r��Y


L����k�.���HJJ����lڴ	��޺u�ɓ'�����.77�����Ӊ���I�&Z����"??_kR��ƯOHH7o�T���SVVFxx��}����t�ڕiӦ��_SXXH�>}t��Ӈ��t���5j��-���� '�j������0�=��=##�����∈�����2�Y����\\V��
a^G�a�����e��ж}�vV�X���;%%%$%%�d��n�j�d��ֳgO���;�ϟϕ+Wشi��m���ݸq#YYY�mۖw�y�Ν;s��9,X��X�~��~۷oO\\vvv����{1��ƯO�v�X�h?�0k׮%..�����,���"!!���۳b�
u"055�Ν;�Fٖ��*�eBq��t�9q�ɓ���=z'''.\Hrr2Ǐg�Νs��-�z�-Ξ=k�^߿�kC;vmT.&�����}����'�]����R�L�z�m�6�?n�n4H�$L||<��������s��	v��i�~����ӧ���t��M�ڿ�Im�����ӭ[7lmm�޽;���`߾}:��0avvv���Ư�ܹsquu�q���$\^^�N;e�����+Wj��;�<P1�V٣�>��F!��b+��▷#G�p��aY�~��2qggg^}�U�4iªU�X�j�|�َ-�1���uGҘ��[�\t7R��jR��Κ5���~���4����O�4i<�&���C뱲
��_~1�mvv6ݻw�j��SOp�c���k:�>��H"����P��C��b��QShCBk(ڢ�#5���gQ%A��Ɩ�XCI��Ps���"��g���������\������;ɽ��/]�8�)y���~kJ�,i�ݔ{��Ÿ��P�q��[�nQ�@㵛7oX-�b�f#""ϗ�rf�D���BM�:u�d=�v��O�r�̶�[�t߾}L�<���ד-[6����ٳ'�o�f����ܹggg�֭ˠA�ș3���U|Ֆb����,\��-[����?~�4i��o���-�L��-	P[��'w�~���+Wr��qbbbȟ??��գW�^58�c��q��f�bǎܿ�
��&�b�"""�&ooo���ؾ};�|�
�f���,]��޽{[,狏����$y�l��d7%�-��361k�&��f����$�������5����^�����Ν��ɓ-��voLے;���<���dYb�5-��U�V��ʙ3'��ٶ�9�0a�Q�`��)R��+W	<.6�a�1b���U|5�b�<�gϞF��/_&88�#G�0s�L��-�j����$b�̙�…Ͷ]�r��˗s��F�eS��ܫ��(�v�j|R���r��=�㪘���H֕Ҫwww|||���!22�~��ŋ3y�d�{������ܻw���ԩSI3""��Cƒ�ꫯ�jl�…9w���z���C�P�P�d�19�\F�߿?���g����ܹ���Hʗ/@�|��r�
�o�&_�|f��~NM�]DD�OeͲ�ݻw/;w�dȐ!�X��w��
�)b��9
f�޽,\��…EN;r�˖-cϞ=����q�����ĪU�ؽ{��ig�Ν�����ݻ���`
.l_}���/��իٽ{7]�v�kT,]����H^{�5BCC�駟�R�J�߿�j=�䎙�F{jͥ�-�<�s/[�x\�c����ٳ�y���k�.����Ւ%K�x�"E�e����ݻ����s��I���ZLVD2�����%V�x��
4��ӓ
$9[$-�$��OZ��t��x�
�z�-�l���Rs�aaa��ߟ���kY�إe˖xzz��_M�ҥ)S�`>*O�<�Y�����s��ƍ��q����9�Ç9x� cƌ�q�Ʃkjt5f�"""x��!�;�:u�x��W�ϟ���3Z�(U��YS7����bӶ�t\��/Òe�(Ni{B�urr��BnMj��2�ҥK��₿�?��7C��x�⸺�ҩS'��L%�?=���T�t˖-���ʔ)���%J�`�ȑlܸ��c�FJ�|��;w���/_�M�61m�4Ə<��g+{����:t(*T��ٙ*U�����*&+�l۾}��~v����Y��'��KͪG�q��-�m��{�g�xF�f�T<p�@��3��6")	�Z�n]jԨa��W�Jc�)Y5u�T�ԩ���/��b��͛7/���xyyѭ[7�\�B���i׮]��P�X1.^�H׮]���k׮\�t�bŊd&ǔ��E�v]B֒�i�A���C�����{�r��a��Q�9b��i�-�Cy�d��e}����Օ}��1e�ڵkGpp0111f�L��._������-&�)r��S��K!MX',��*��R�S�/>>>f?���Y�4����H阶>sk�_�N�Ν�ܹ3��9+V�0�������=����*V�hvӳJH�dE�^Oҍ��o��y��i�.��eb�g���|��7T�\�{��`���M���I���2|�pʕ+���...�,Y���@>��3c\�~�hӦ
/��...ԬY�aÆ%y�ɓ'S�vm�eˆ���;wf�ܹV��26w��,Z�???<<<prr��Ãw�}�/��ҬcdR@�"Eprr2f��z���bŊ���;��f�5nܘ9rX]y�k�.r���[o���q����!�j�%��Þn���X�"��{��D�V�u��Q�t�B�
X�p�1͚�B���V��R<ү�jJ�NSJY�yekU{�t�');a��;FѢEy��7)Y�$*T���Ϯ�W����I��A�dE2[ztc6�r�
 O�<<������s��U^z�4?߳��ё"E�0x�`ڷo�O?���1�S��S��丹�1d��ĄIR�K/��S�N���}�4h�
Jv\R1y{{���m�ݖ�O�)�Kj?[�
:Ԭ�RΜ9�g�…\�x�(�r��E:D�=�j%""ώ,1��W,t�…|��Wp����6M�4/ݳ63�ѣG̝;���x�5kf$�
.`��"-��&%""��뤊��u\�}֭[g��~�O���<sk���@pp0}��5��<|�Ц��s��-
�/��bvk�M�b�-�U1Y�̕x�����/5jԠnݺt�҅5k�X��ڵ<z�&M������o�ͣG���]Ͱaè[�.���|���F
���ŤI�h֬^^^4oޜɓ'��=��O	�[+���:f̘���5jԠE�̞=;�֘��'~����ٳ'���3�k�ĉDGG��)��Ç�y��������t*�����ZD��@��			1����P�P!:v옉���Hf��2[��֨Q�*U�����͛���"66��G�ҷo_���G�Z�hӦ��_Z9�WF_M�~����:hǏ'..�7n0m�4<==�f��V�I�̓;�޽{y��Ǐ��O?5��Zo͞{���o���/���Ç9z�(_|��qULV$�9s&,�����ͯ����n��<�Y�~�z#Io�]�nݺ$g��i�&����y�&k֬�k׮f�-[�0uQ^�lW�^��ÇF���H,�5S��ŋs��%bcc��}���k�s��
�̙��	��ݻ�u-_�<٢�	
2��7�944�iӦ��ԩ8::�͛7�|"�5���1r�H֮]��˗�|�2k׮e�ȑdϞ=���L�%�e�7n%K��ҥK:����S�F
سg���g���f��Ңȩ�2��jb������+DDDбcG�W�N�ƍY�d	ٳg�_�~v�Z��'e�3�vnS�q���ԬY��;r��	c��Ǐ��=��cǎ�-[�+W�н{w����\�r�U1Y����n��ҥK�)S�ҥKP�Lʔ)åK��\:��o�1g��;r�"E�x�"K�,�;��tQ�GR]�S�i9��r��1F�
<��Ė.�)ug�u�aaa�ڵ�Xf����:�<��V�J�^��8q"'N�w��I6$��C�%��)�lO�мy���W_���S�Br��AΜ9iذ!�g���,>%J�"��ʨ⫉�ʕ���`���)T�NNN���S�^=����T�h�V�I�̭�{�x{{��憋�*T`�رt����7)��+�ϟO�6mȓ'...���[F�/!��Xэ�W�?�-[��W�?��� �U��lwd[�HM崐�N�`�����ԩ��������{��Ң��/J�(���ݺu0[�N��4����hP�<�gҤIL�4�w�}7���L�a��a����B�q�N�:ѩS'���EN�ݞQ�W�mwww������?M��T�Wk���-��ڹs��m,kM̔0�v�'�W�H�-�zULV$��۷/�}����c߾}̙3��]����o��KTT���2���ضm۸{�.�r�2۞8Qgꀜ�;��q���rZH�=�k��srr"o޼T�Z�nݺ���~�:����رc����T�R��_x���a�:������S�,y��a�BBB�D��Ɋ������ߦ8�����o�5��	��oMɟ�ݚ��C0$�E9���x#&[g���2��
/-�'��m�:�������e"��TL��?6f@�]���ӧ����S�ԙ��LJ��H~��/^��ɓ�$�i)���ӭ�߳g}�k׮�H�=zԘ����?��kO��ܹs:t��ի���E�����x�ݻg�~�eF�鸿��;�֭K��	��jU�9s�x��Çd�d?��˗�+W�p��m����T,"""�|Q�L$�$,&����S�e˖\�x�!C�дiSJ�.ͅ��u�=y�$ǎ��W_5+J�P�5(^�8����<y�h0z�hF�Eٲe���0��6j�Ȯ8���1c=z4�˗'22Ҧ.�y��1�q�nݚ˗/[�4iJ��?�bŊ����1h� J�.�_��ҥKY�d	���̝;7����{�ҨQ#Μ9èQ���w��!o޼Vc���I��n�S���[�X�fMf�!"""Hɲ�«����?������$!  �1c�0n�8�đ)�m*�߾}�$��988о}{Ə�ڵk��O��ʗ/O``���e�ҡC��0�ۺu+�ϟ�蘜R�z��z�j�N�j�Դ6KΔT�P�B�[����@�o�ntN(���Ƕq�F�����-^?~�85kִ��jժŎ;8r���T��j۶mf� "YT۶m��FD�J����sŞ-|}}ɖ-aaaƲ��E�R�N���eӦM���ӬY�d�ռysfϞͦM��裏��C�%>>�m۶�p{�ꅫ���q���(ϛ7��۷s��
���GÆ
�֭[�]���뇣�#[�l��xzz2l�0�4ib6n��̚5�+W�5�L݃,X��m۸v�9s�J�*���Ӭ�~j8���k�.���(]�4;v��ٳ̟?�+VP�fM��٪q��L�:�]�vѹsg��ԩ����!���H&p����TBCC�С�Q�7��""�1������z%�͝;���f��NŭZ��G��������4�1$$���Y���!!!��-"iN�/"YJ�f������N��j����H�%�V�\�^�+�+�dԩXT�LDҋj��d-�,���K�C�����u*~��F����@:$���ODDD�2�,#"""�|K�dُ?�������""b#͌I=Ǵ>���U7GD$�\�R�""""""O(�j�if��H�


�C��������H��n�2������!�<�T�MDDD�eJ����3�v�ښ�,�A�+��!�����%�2�o��Fٲe��s����o�>���������DDDDDDDD2��e��O>aǎ���?U�>x� 3g�dŊ���Ӯ];ʔ)C�J�2<N[��㏪�&�A���			��0DDDD҅�e�hǎOݹ�߿ϰa�hӦ
�
��חO?���+W��斑a���->>>�Cy�))-"""�:��@�.�-�ڵk�o�����r��5-Z�������������gzf�իW�={6�w���ݻ���+t�ܙ�M������b���lݺ�7n�?~4h@���ɕ+�1�����˗3y�d"""puu�Q�F���טu���#�ϟ��͛�|�2��Δ,Y��-[ҪU+�c%�{xx����3`�ʔ)�ܹs��$dm{JםԹ���X�|9ժU����S�`A<==Y�|9�:u"w��=�,�M�ݼy����_�nl;u�Ç'..�-Zp��]�{�=Μ9c��r�
����߿���`r��av�=zp��mbbbX�j�="((��3g��W_�ccc���_���_�w�M�&O�LTT�Y�*-�ۚ����hj֬i�Z͚5ٿ?�7o�u��v�$""YG�Truu�x��t�Ёf͚epT�'��҃�*�Y IDAT�爈��d
��2�ŋs��uʗ/��իٹs'�����Ƹ����3g�P�H���ٻw/.�p�œ:u�/�����ŋg����޽��]��m�6�իW0c�����Ν;2d+V��(��!�D��޽�Q�F��u'u�ݻw���⸦m�1""�|���9q�#F��Ԛ�Y��y��0`3f��СC������X��&�~��GH�b�ȑ#AAA�����gJrQ�bE���y���:t([�n�8��A�(V�����,�;w���f����ƭ[�hӦ
���]�֦�;v숋�K�]�5����8��+��b6FDD�m�SL6o�l,�_�dI&G�v�}`��7�)\���<���zn�_�$�<==-���K�.P�l�d�]�x��_�l{�ʕ͎�Pɒ%������딙���WWW���ǔ)Sh׮��������)9e/[�ۚ�7oX�If�f#"�Ue��gM޼y0`ǎ��h�5��Z�ٙeO���Wb���ɞ��ۛM�61|�p^�ubbb�={6M�6eժU6�?�Ye�����<x`�\�i_GG��mOz_ED�f�D�/��B�
�ٳ��Ztt43f��LJ5jТEfϞm�^l:�Ç�0au�֥A�̝;�۷o3t�Pj׮M���1b���3;FTT�&M�Y�fxyyѼys&O��ݻw8�<ժU�����u�lْjժq���bO�Ç���9�իW1b�5��ˋ��۳q�F��1��ۓzf�=b�ܹ���R�F
�֭K�.]X�f����=��yNTT��s����H�Ȑ�Q47��^z�.p��)ʗ/��…s��9:D��Ս�:"�
J��������LJ��H~��/^��ɓSU �����x�ݻgt�<u��8[�ۚ|��q��n߾M�|��^354H�]D�Y���ʃ�ٳ'���Ƙ˗/̑#G�9s��
&L0jX,X��"E��r�J�8111lذGGGF���x�X�bxzzr�"""�X��16""��/R�zu�-��������͛L�4	�
*��n�9��Mr?3{���=U���癝YV�V-&N�ȕ+W���a„	xzz��ի��1c�����ÇDDD0v�X�ԩc��[�l���'_�5��є.]�2e��g��?>�c�ɓ�5k�p��}Μ9øq�R}���mZ����[״-5�;ED���MV�.]Jdd$���������O���Q�R%���o��#GX�l{��1f;�7'''V�Z��ݻ�޽;;w�4����)��a���fh�i�&ձ�y	�jժѸqc6oތ��ݺu3k�9lm�c���̖f;���=U����M�u�҅|��A��ͩ]�6aaaf?�P�X1.^�H׮]���k׮\�t�bŊ�.�<���nݺԨQ��� �T�b�3%�|}}S�$ݔԛ:u*u���Ϗ_|1��m�ܦDۑ#G,�kږ�䡈HfJ�ffr�47Yٲe�2e����D�%9r$��B�!C�P�ti\\\�w�:t(ŋ��ՕN�:����7��W�y��e˖-�����Inٲ�֭��حqrr�r��̚5��~�s�'iD����,5�v�㞪y����H���&����ǢE��&w��8;;������ݼ�q�E���燇�NNNxxx�����_���������)W�...���P�dI��όq�H�"899�X7�_�~�iӆ^xj֬ɰa�R}���ݸqcr���]�,��k�.r���[o�e���j7Y1����1K��j�
��,>�L\S�̛ĸ��Y�gk�lٲѲeK�ܹc�o�ٳ�۷oӪU+���R;��K�֭[)[�,���4i��j1{��$�h�������Nz�S5��z2�fYf)\�0cƌIq�/���A�4hP�㒪�fm��^Yr�����nnn2�XB��x[��ڹs�̉��?.��ŋ)Rx��ۡC��ѣ��/|""YA�IS�'�z����$l�b���~B���VǦT,)�ϼ��;,^�����ӠA6n܈�������Ş���;Æ
#  ��cǒ'O�ׯo6ƞs��(&>>��'��?3ooo���ؾ};�|�
�f���,]��޽{'Y#,�署爈��d=�t�L���
		1��!!!*T��;frt""��P�B����[�.Ս_leO�…�����ݻ9r�;w���7�4뺘��+W�N�:��_2f��V�j6�ڞs�ڈ���6�IM�����j�#"""��d�2��b�ꏤ���#G�d�ڵ\�|�˗/�v�ZF�I���3;<�La�I���lj���ƍL�6
OOO��Z���L�֭���#00�E��:���{�"E�p��-�ϟ��s�ڈ���6I��َ5iyO�<GDDD$���2�P�jUz���ĉ�ݻ�Yc��M`` ۷o'""�b�m����ׯ_��+  ��[�r��y�&3��ԩS�]�FѢEy�7�%v777F�A�=X�r%�[���W_��]�ta˖-F#��6��W��W�f�ԩL�:��5k�+<��cƌaܸqI������=�U�;v��ȑ#�U���S�&˒�#�������&"�,I��\�r̂ضm׮]#gΜT�R��={R�T�4���xf޼yl߾�7n�/_>6lH�n�,Ϙ�i͟?___��Wi{�*U���cŊL�4��3g�}S#��3g�w�^bbb(U����4l��ׯ_?ٲe�����ӓaÆѤI�b���%[�l���q���-J�:u���II�{ڸqc�N�ʮ]��ܹ��q�<GDDD����R�����ҡC��m�ED$c<o����J�5w�\.\Ț5k̚�jՊ=z��gr���С𸦩��EDDD���L�Y&"""��`��f�$5�yz)Y&"""���<GDDD$kI��e��{����<��<GDDD$�H�dY�ڵ	K�Ê���dij�#"""�5�y��X�b+V,�+""""""""��T�LDDDDDDDD��lf�j�����HV��gE2�…�ڵkf�!"���2�(�����_f� �L[�r�3]{�����'��y�|�ᇙ���ቓe�Q&""O�bŊѶm��C�׶m[�W���a���M�Ҵi��C乣d��<MҼ����Hf�]�6�k���0DDDDD$�S�LDD�	���t��!��y.�����a���%Kfv"ϴ)S�hٳ�<��,�g��h����-)�f"�C�.E�i�d���<ST�L$}�Y�&�C�P�a&�>�,���cf """"""""���2����	@xx�կS�/1WWW�/N�h֬YF��l�/i!,,�}����兟�_��SD���'
��0DD�;J����dA��7'N�`Ĉ�ʕ�7�|3�C�R<�̙3Y�b���k׎2e�P�R��M$ՒjH���H�\�(Q�o��6�;w���5��K��4Z8}�t:D���/_���9x�`��t�7��OD$+S�LDD$H<���͛L�:��7�dɒg&Y�3��߿ϰa�hӦ
�
��חO?���+W����1�d�G�q��:ġC�شi!!!����

��DD�[J����s%#�����y�2`�6n�ȱc�2;�,eѢE\�v������}�]�-[ƢE��իW&F'���z��!�����=�Ç3g����I��f6��HFQ�y�}��Wxzzh�}���xzz�e���>>>xzz�y�f~��z��I�z����y��L�8���h��:u*
4`�ԩ6���!�EGG3c�|||�Q�-Z�`���<x�b�իW1b�5��ˋ��۳q�F�1���V�%�n���_~�A����x<�e�ܹ���R�F
�֭K�.],:+��?�<ժU����굷lْjժq����7**��˗S�Z5<<<����ӓ�˗e��"YU�l�ȟ??o��6�'O`��ՙ�����K3�DD��[o1}�t�;Ftt49r�0�a��=o���x��K�pqq�v��̙3����ʕ+,_��;w�0j�(�b�2e
!!!T�P��ݻ';6>>��7o2i�$*T�`����ٳ'���ƶ˗/̑#G�9s&����p��uc�S�>|8qqq�h�¦��<y2QQQFBj�̙|��W�뱱������ܻw�:��_�X1<==9p�T�X�x-""��/R�zu�-j�~��wDGGS�fM��k֬���ټy3�[�N�u����ŋ̞=�;vp��u^|�EjԨA�޽)U���x[jo%�=�믿2o�<���GTT�
�iӦ����x���믿��k�,^���			a��͜<y���(r��M�J��޽;իW���ܹs,X��ݻws��e�g�N�b�hԨ������[�c�}K�?���7ұcG>��3��׭[G߾}y��WY�nnnnf�����k���s��Y��ݩY�&}��L�2V�w��i�̙Þ={�q����V�Z��ݛW^y�b��\;w��>�̙3ԨQ��[�Zg:��Y%�a�f̘�ٳgɟ??u�ԡgϞV�LNF=K����e""��+T����?����СC��Y[[�n��ёݻw��#Gx�7ȑ#˖-`Ȑ!�޽�={�0o�<v��e�'O�LHH%J�`ƌV6͸���Z�j4nܘ͛7���D�n���.]����H^{�5BCC�駟�R�J�߿��k�c/^���)_�<�W�f�Ν���;�s͔(Q�ݻw�B�,�3f�w�^v��ɐ!CX�b��c�V6l0�n��֦M��w�������8�i�i�Hr8@ӦMY�|9�/_&66�?����k��������>f���;^�z5�[�fӦMܺu��r���͛G�v�잽
I�ĉ�{��Ѷm[���8�_�E\\��۷o�C�I���|||X�l�ϟ'66���(�=ʴi�hѢ�Y"��%eԨQ�˗���~��'��L3j����<y�E�����<�S�Nǭ[�ذa-[���۶m��LJ���?\�z��r��UV�^M�-�}_<x0G���6ՑKͳJ(44��>���'O���C�\��ʕ+i֬��߷ c���HFS�LDD�i	�L֖���f��j����Oܹs��-[Ï?��/YV�~}��P�|y6m�Ĵi�?~<w��M1�ɓ'���;�fͲ:�'''*W�̬Y�,�G����3�2e����D�%9r$��K�u
8�bŊ�#G����?���M�XӱcG\\\��M	�����¸u�mڴ!<<�,��P�z�ț7/[�l!66x��ܲeԭ[�����(^���L3*LcD���_ѻwo�ݻG׮]ٺu+���|��״k׎��X���k1{����`�>v�X��.\ ((���8���ٱc���˗/�x��DFF���<z�[�n�i�&>��#��̝;��G�R�ti���8z�(ǎcժUT�\���xfϞm���ν{�h߾=[�n��~��ѣ���R�T)����O���-������ѣ���g��Fr1>>�A�q��m���c6s���\�2�V��رc|��w4jԈпn޼i����?�裏����Q�F|��?~�o���F�͇~ȟ�i5�s�αi�&>LPP��o�$�HݳJ���?�F��]���Ǐ��w����MLL}��5���d��hJ�����5���H�m޼WWWz�ꅳ�3��=�8Y���h$j�_�N�Ν�ܹ3��9+V��̙3��_�R
<��u�֭$Dž���֭[)[�,���4i��j�������f�ӪU+��2K�K�.P�l�c�G�<}����Օ}��1e�ڵkGpp�1cϚlٲѲeK�ܹc�vسg�oߦU�V899�]��ܹs[�ϴ͖_�l�2nܸA�^�

�x�⸺�R�reƌC`` QQQ,]�4��<x�)S�Э[7|||��BCCy��͚5c��Ѽ���d˖�jժ1m�4��&%K�4�S�ti<==�ӧW�^�gϞf
.���&M�DժUɞ=;...T�T�X�}��q�}L<��ŋ�-[6�g�N��ՙ9s&��ޙ�-�u%�'�ƍ���Å�2�,Y?��믿N�޽�<�ҥK�T�...�*U�9s����ETT���
��^FGG���Ŝ9s(]�4��Δ.]�����,Y���LK;s���K/�duLB�yV	�/_�ŋS�B���)U��gϦf͚���_ƌ�������e""�L3%�L�����믿���ǹy�&۷o�z���ɓ�ʕ+��?Mdd$�*U"O�<L�0�cǎQ�hQ:v�Ȉ#�9>�g�N||<s��Mq���;Æ
#66��cDzm�6�1)%��x�� 9	�m�Y�I�Ye���lڴ��Ç����ٳiڴ)�V�J�8������_�x<K����H�%��k�k�a��i���D�?��w�:u��z�v��bGEEѷo_���[�.4{ݴl�cǎ��������ر������9r�'O�4۾s�NN�>mQ��_�Hn*T��]���7�p��e�ҥKs��i���clK���#F���Ã�����+&L�����&M2�����bY���#=z�0{�5���ѣ��{K�}�Z���o�u=�yV	������%�־�$�Y�RD$�������y{{s��!/^̽{��]�6�k�f���̛7��w�K0���<��eJ��f���e�ٲ%�����ϟ��ӧ�s�N"##)_�|�q�+W�N�:��_2f��V�j�|�P�B����[��e6)/��.\�ԩSɞ�����x�ݻG�\��[�pww���"##��X�x1�'ON��~�…���b���9r��;w��o�u���z���Ǖ+W�}�6���3{�������{yy%;�ܹsI���A��ř:u�E������KI�&�=��ݻ�:u�%K��v�Zڴi��ի�6�p�'N�����>|بs�81ݫW/
��9x� �c͚5iذ!
4�������-�u���_���?�{��F���#G�ꫯ&�OR�MK6�b���rN�_S�3M,�������R����myoO��""O3�,���
���h�t2%�jժ`,M�W��ž{���?~�O?���~�Ν�ۡC�k؜9sl����ޣH�"ܺu���盽fJ�q��q���q�ӦM��ӓ�={cM�6q�D�\�BLL&L����(���5k�p��}Μ9øq�l��e˖xzz��_M�ҥ��r	���u�����ȃ����^�rSk�������Ty��R�0�q+V�`Æ
�̙������/X�1��JM���qww�J�*L�2�>���w�2a��q6l�^�zԫW��ݻ3k�,~���$�&�nݚ9s��p�|�2�V��W�^x{{s���'�oO�aÆԨQx��2�Q&����L˵6W�w��k��>`�����m)Ꟙ���Z<���O*΄2�Y��d�,��|��Q�J���)[��1{�x�������+W�l@�z�ظq#Çg����<~�85k�L��NNN:���{��{�r��ac&BR���1b=z�`�ʕ�n�ژ%��ۉ���X•={v���g|ݥK�l�BDD͛77���f�z�X�z5S�Ne�ԩ)^WB�3�q��Y$ْ��`R�N<<<�v�E��X�d�֪U�;vp�����/թS���瓛�w���СCI&H�r��)F�����'O6���q��=����>GJ�u�Ɯ9s���k׮5���,Y�&M����/�'OJ�*EÆ
����ooo.]�Ğ={���gϞ��=�H�?�}{R�߿x<+l���V?�0I꾛>I�ZΜ9�s�QQQ���I��5�}V&)]�-�f2�Y��d�,��J��e�y{{�	�,��K0�qIooo���pqq�B�
�;��ݻ�g�آbŊ�L.[g�U�R???��⌢��x�@pp0���*T'''��ݩW�_~���̩|��h�"���ɝ;7�����`���4m��ׯ_?ڴi�/����5k�dذa6�	�������)W�...��B�IDAT���P�dI�eQIIX����ע��=�۸qcr��a��ή]�ȕ+��U$)�n����]�����|���ܿ��}�ҨQ��q�ĉ����ug͚<y�f���G۶miԨ���G�Y=V�…iӦ
�ƍ�����7�YB.���I�����'�g46:t����S�<1�rӄ�c�+<N�Ys��!�qO�I�ձcǬn����Y��ɬg)"�Q4�LDD$___|}}-�0�Xlϝ;7cƌ�z,S��H�YK�
:��C��8.��Z��3���O���������5����1d���l|��k�W�����޽��L���͙3'���,\���/R�H.^�ȡC��ѣG�,{�gۛo��ѣG�5k�k׶�7�a�>��#�|�M�����cǎ���4n�8�.�&^^^DFFFժU�^;q�M�4�H�"�ܹ����	�2��3L^CLL���nݺ\�x�o���ҥK��cm�hj�ۓ7ngΜ�y��|��,_��Q�F�}АЂ�e�&qqq̛7���~��^�n]�9¼y�]��Y��G��CӲw[�jE>z��옩yV���Z�jf<���Mf�K�dֳ�(�Y&"""ϕ��
,HHH��-$$�B�
Y�<(�Xǎɝ;7?��3���>|�����}���'�|����Y����gɒ%�+W��'��u�C������_3q�D�_����ٻw/}�@��1�����…̚5�X
`�^�pa�qB�����q��I`${���/��-Z�w�4u����ĉ�2�7�|��ۓڵkK�.套^bԨQ��&
.̚5kزe���o��G}��ӧ�����������S�hQڶmk��С9s�d߾}|��:u���XN�:�|�O?����[�u�3%����;��∍�R��
�_�~�9s���X"##	��.\??�cˌg)"��4�LDDD�+nnn�9��?���u�ڵL�>��ٳgrt����KL�:�޽{�g���QG�e�avƌ��:����?�<����+��¨Q��׿�Ŝ9s,�gW�\٬yEB�:\&֮];Z�li|ݽ{w���		1K$��d���9w�F��>���ԩSf�7��^z�l6jj�er��in߾��?~��H!gΜ�7���>��S�U�fQklƌ|��lذ�l{��7o���ƶ�2e��������o����S�L1f����^㧟~�O�>fו�g�Ј#�߿?�֭3۞7o^�ΝKΜ9S��I�����N3�DDD�S�jUz���ĉ�8q"�{�N�рHB���c����mۖB�
�-[6r��M�ڵY�x1:t0��y��Ѷm[�-[ƛo����;��Δ,Y����j��I���/��2͛7gѢEK�۷o�ĉ)_�<...�ʕ�Z�j�`����g$lBCC�}r����_�|@�R�Ȟ=;NNN/^�������[$��oOb���\�z��;Zԡ�U����\�~�js��M��?��O���(Z�(ݺucӦMV;�6lؐu��ѪU+<<<prr��Ãw�y�u�֥��	�[�.9r��ɉ��{V	�lْ3fP�T)�e�F���С6l0�l���|�""�!>>>>���Whh(:t��m,��"�>L��f�$�:+spp`ʔ)Fm��%K�}-�>��5�?I?���,Y��ҵk�L�LD�p�,�/%�DDDDDDDDD�K�2��R7Ly��\�2�Cy��\���m�fv""""�F�2y����ev""�E�������e""�����?���,N5�DDDDDDDDD�K3�DD$KS�2�̥f"""�Q�LDD�4�(���d���dI�Q&"�_�~���/����d������3f���D�i�*U��DD�R�����2+>����A�6e�|||2;J������$A�̋���%Kfv""I�2L��R�LDDDDDDDD俴SDDDDD8w�����S}�����o�%""��+��o?�1ED�٠�e"""""„	4h�S}����رc���ҥK	

���O|\y6(Y&"""""���?��I�cbb�1c���(P5j���Ӊ��y�㋈H֧d������������/���Y���7oҴiSc[ӦM�y�&k֬���DD�i��e"""""ỴG�X�r%{����?�$[�l+V����ӰaC��111�Z���{�r��M���C�:uhݺ5���f�>������<��γo�>���;Ξ=���M�<y�V��.ٳgOv_[��޽{lܸ��^{��y�����O�
ظq#-Z� gΜv]���<[�,�bBCCY�v��Ç9q�'N���4o����X>��3N�>m����?Y�z5'O�$((GǴYlbkL�,_��իW�m�~�:�6m�޽{���'�}��ݻwC�J�,�S�R%~��W����[o�e�u��ȳG�2�,��`�С���k<|���;w�`����[#1�n�:N�>M�ҥ�֭Ŋ�ҥK̟?�_��m۶ѰaC���R=�̞��:�ƍx����W��<y��#G���?��k�5<x�%JX�_�dIc��e""�7%�DDDDD�T}���S�t�E��ى��fÆ
������x{{���m6n�޽|���xxx���/ӻwo>��Cv��e�l3�c�櫯�">>�3gΰk�.~��w�9@ttt���s�gϞ�p���1m3��痒e"""""YL�Ν�={6����ìX��w�y�f͚���j��|�2@��ϟ?��1Ys��-Əϙ3g,^���Ov_{����Vk����ƈ���K�2;$�1���S�f͚T�X��u�V~��7�/_���y��w�e�)%�R���1Y̙3g(X� ժU�hѢ�*U�����x^{����j�6�6�y~)Y&""""��ʕ����S�~}N�>;}���oX�x���*P��.]b֬Y(PੈɚÇ�������a������}��_|��ׯŋ/�h�ZTT�1FDD�oi�FDDDDD2L�>}���c������P�xq^y��e����o��ӦM��ٳ<z����K�����g�}f�5ͨ2-kL���;ϡC������ٳL�>��~���$���M�\�t��ܦm�1""���2�,�U�V̟?��`���ʗ/o6��8q�����suu%  ����ݝ۷o���S�@f͚�.1Y;�o��Ν;�9s&3gδ8�ٳg�T���}��*U�ΩS��b8u�U�V��ED�٣�e"""""O ,,,C�4jԈ>��W_}ggg���)Z�(�Z��w��Ƹ9r0z�h�5kF�ptt$W�\T�V�/���lU�.]����ё���t���y�t�B͚5ɞ=;��Δ*U��}�Ҷm[6mڔ�\c�Z�Ȟ=;?���E�?��39r�f͚v_���<[�S��)""""�ppp`ʔ)���P�dI���ٰb�
V�^͌3����ڵk|����Ѻu�L���Wɒ%Y�p!]�v���DD��2yn�lْ���~�zc���)P�͛7���DD�i��e"""""���/]��QK>�?���>��ٳӻwoƎK�-ضm��׿puu���DD�i�d������<Wʗ/O���Y�h��E�y~)Y&""""���l+k�z�)i͚֬5��0DD�)��e"""""""""��d��������s�6AE�6������r�=Ʉ&e�W��_��� �,�7��뺺g$���1F��Yc�ڶ�{�-�n���=h�g��2?���j��=�֜��}�PUU����_��g�X!�@�eb�X!�@�eb�X��&�J�J�0IEND�B`�PK�a�\ 1D\  &pear/data/File/design/requirements.txtnu�[���eZ component: File, Requirements
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Author:   Derick Rethans
:Revision: $Revision: 7003 $
:Date:     $Date: 2007-12-17 10:05:16 +0100 (Mon, 17 Dec 2007) $

Introduction
============

Description
-----------
Provides functionality related to file and filesystem that PHP doesn't cover,
or doesn't cover enough.

Requirements
============
The methods in the file component are all standalone methods and cover missing
functionality and higher level file/filesystem operations. In the first version
the component should include a static method to recursively scan through a
directory and pick out files matching a specific pattern specfied by one or
more regular expressions.


..
   Local Variables:
   mode: rst
   fill-column: 79
   End:
   vim: et syn=rst tw=79
PK�a�\ߦ�� pear/data/File/design/design.txtnu�[���eZ component: File, Design
~~~~~~~~~~~~~~~~~~~~~~~~~~
:Author:   Derick Rethans
:Revision: $Revision: 7003 $
:Date:     $Date: 2007-12-17 10:05:16 +0100 (Mon, 17 Dec 2007) $

Design Description
==================
The component uses the register_shutdown_function() and set_execution_handler()
to allow the catching of fatal errors and uncatched exceptions. At the start of
the script you need to initialize the execution environment and when your
application is done executing you signal the component that you have a "clean
exit".  In case there was not a clean exit the shutdown handler will pick up
and call your defined callback handler to display the error message.

There is one classes in this component:

ezcFile
-------
Contains a static method that allows you to scan through a directory
recursively and include only the files that match the specified pattern. A
pattern consists of an array of regular expressions which all need to match
with the filename before it is returned in the array of scanned files.

Algorithms
==========

The ezcFile::findRecursive() method accepts a directory name and a set of
filters. The algorithm is recursive in the following way: ::


    method findRecursive ( directory, filters )

    foreach file in directory:
        if file is a directory:
            files_in_subdir = findRecursive( file, filters )
            files += files_in_subdir
        else:
            include = true
            foreach filters as filter:
                if !match filter on file:
                    include = false
                    break
            if include:
                files += file
    
    return files


..
   Local Variables:
   mode: rst
   fill-column: 79
   End:
   vim: et syn=rst tw=79
PK�a�\�\����'pear/data/File/design/class_diagram.pngnu�[����PNG


IHDR
@���PLTE���������\�}�tRNS@��f�IDATX��Mn�0��Gq��E|�xѮ��kCB�I%� ��bXD����}9>7�f�'F�n��G�=]A����͸o��
g�|�jb�VM�'[���Ć�~���u�]2ƕ�1xf��9��	Q��h����B$��c��+��gʀc-�=�U2=�X8����i��L2�h�����q��s�C�r*#��af�_��bWe��a�"���-Og8i���ZS�ڐ���j��G����L*y�g_���k�
c�äL�d�����JS�ğ�}��dD�}F"l�AH܋�09D�ްA���ö�`$o
ۛ��p��FơZv���(=r���2��|P�������|̗+�O_��q3ނ�`[4�x%R�IEND�B`�PK�a�\�rCBB)pear/data/File/design/file_operations.pngnu�[����PNG


IHDR$M&`�)	IDATx��ݱ�6F9[����7��`��������3��}�Ņ��&���9�T�\h4)|H~��x�^8��|x� �J���ǿF��. 6'��
���b{<z�AX@��?��@�&Q®6O����A&q�c�э�G�h��S�†t�����u�|!u���Ai�ODl���z�����<��e�.��hZW[���%N�����X��]�ɽY8H�5J�����U��bT?uZ9=j�DĦ�����*���hkS�R�z*7!��Q+��
�A��+��*�(�g�7�2(
��Nl3we�5L'�iAiP	b��A=���M���(���4h�"8�4�	��bp�8���@lN 6'��
�	��bp�8���@lN 6'��������x������">8�3�u�ͯ�
y�����_��m�Hr��'Iz�^lQ��ޙ�;�d��c��z���L�]��2����u��'�q�D�Q��c=�&l?�,��{�~����K�]*�;N����:�l���ҭ��}K�hP��Q����̰�
��cj�����=����_=!v�Un������߫Šc;��D�2�Ќ�[섈�<��a[��~eԢ0��
�2
�F6��@lN 6'����A�$�۲ֵ��m2x��J{���������+���1�������@!ʋ�J�$�7n��]F�:�]��(`j^���s�͹�˄슢�p6�b��}��1������Q�0촟F�3�#�"�K�s��;X��#[�J��j)3�14��lė�o1۱�P�����]��Z~ 6'��
�	��DK�E���T�ǩ���МƏ���s��>M�4����I7Z ��ǭ;�5V�{�H�H��-n���h<��������0wG�&8�b��p����>�������ް�F��|<�#2���@lN 6'��
����k�=I�y_��>��_l�W������pu��*��iϫ����j�dV׫;�VzlU�^Z3��n�X�,�ԏЄ��42����\�XrMbƖ2��-�h��ƴ� 5H$	
xu��F{��ͳ�.^��ȧ��Ǻ�T��.U����)��7���L{/�sdWL�8]���i�)N�I�(��q�Guկ�+� r�*�q.G�]i=���p��kT/���[�A��؏�89����quH�Zp\���]f�z����bp�8���h����T�LWG����/j���jD�q<�UϬuo#r�ݫ��l>�H���1U��#�}��WC_^�G�K�bOG��ȗ"3�ue�7"8;��Ĉ,�㐵��2�؜�obDK�ڇ��BC���b����H~#r���T�NFd�����+60�����@lN 6'��
�	��bp�8���@lN 6'��
�	��bp�8���@lN 6'�i}<��X����jWD��������:�H'fY�`	�~�����?]����bp�8���@lN ����b��-��8���e���������6��v+����珿�����P{bK4�b��]?��5q� �m*��m"�#�1���ЎAOo	�4!�-��"�O۾��V��"j���`dp�8���@lN 6'x9�C����_���y�[�! ����ʣ��Al9ƜC�.�����Ok�F�t��"��a����C��j�*��� ��D����}i���^Z�P]o[GD��r�����Ihb��뛴�Q%6U�0I��͓��z<e�.��x�?�����/|�?_]��x�R�	��bp�8���@lN 6'j_j�2!@&�{�\��k���@lN 6'��
�	��bp�81^l��W|H��Z5m$P�J}��8�"�'��V�>~�-3����*���b1��q�pƏl����*"�ޕSw�h�a����=~�vS��R��h�����5��n(	{ :����-{�����
����E���V��A�
k�Rlv'���oR���s?L4�4Hu�N"̼!��1�����ȝ���D+���Q�3bK8UӑE����楊��D�b������+"Gu���S-�VD�E�J�J�lL�j@��T�l��
�އ7�F��81^leFd���RJ�` ��U��eM�g���3ѯ���?��b���S��#~3�}���Qd}�ǘ��1ú�Lj��&g��2��ff1#��1L�zFd�0��3"c �E��xr�{V�5>J~O0"8��4`Q���
�2,�DF�2�/�*�7"��pB�au�˰���Ѿ(l����}ff�9�=\�e���H2��e�&�}*lD7Z���>��0	��;=6ľ��ʈܯ�b_��"�2���"2��5��1�
����
�1���F�
�1,�x#�s���-ڧ���`���‰5�[���1��D+"7�ba2����I'/2&c���+"��%:Έ-)�2&c���Ț���O#jv�w�VF�LD��dK�y
P�`DX�%��+������0%Ü��,Zǔs2ވ�;n�u���7��:�#�d�d�ySRI}�q�bJ��LdD.#��bJ�ጟFVR<~��JŌ7"ۡlr��"e#���Y��|	L�Џw4"`J�i|��i��{V�5>J�+����4`Z���M�T�Z�?�\�'��R�e�*�W�����v�X�K�&-�����xƏl�"F�z�m�A�V��N@��=׭d��bz��]р��F&Е���F��q����X\(<@�I�һ���|tI���'��mN��Q��N%
;w��������y�*��|<��2�5��Qt��:ڦ��c6=M#U+�x�'ZRB~(<О�͈<����qz�*�7#�44zk`O��������
+"��H'�Ӊ��b�����0'S8HRn#�]�p`d�V��~�
�gS/з���xz���$g!0���F��{��v�r�	b�DFd�wolɉ�Y1�P������Pp��c �oDN]�.��^����Y��R`Dnb�F�;��|���L#�@lN,&6�@�L,>Y�Ү�3#4��=��#�h��mhM���� 	}�b��69e���ƌz�E�菩ĚX��G����4��w}ibvǏok΅�{~[�خ�F�b�-�Lʚ
f"�8��9z��X���ȭp��,��d6�! d�93f����S^�D3�Z��Mh�6��Y��5"ے�F�ߚ`Dn�P��d���1�#2�0�p�8���2���m[��[��Ȇѩ��)�޲�k�2���M8*S���	v��CE?�|���	��s���1��3g�;=Q�-0��+"o�{#��Kd�OU׮|;��lN����Vω�w�oDw����&ʎ|��9��N2���v���5':bhN/
�׎��9$���ʈlW<�lY��zFԞ`]r�"�i\����;�k��`D�\ː#򛂘���L#�@lNL!6m��K�ϙ��61���r$�A��/��R�^N�͛�g��x�v�����N������9��ڃG6Òk��[�}S��iV�2�^qP��K\�R�C�IЭ���b�
��N�=~��������S]���S���+"4Z��(|�y~��f�4�L��C���G��NW*
C��[��驶w�"1�Fm�����VF��	���TjBEN���3����ye��>�F䧣�7z�,�D���ꭒ~Y5q��Z�s#�Ot�T�n�.:lʅ~6"o�Sd��hGV"~�%��⫀8���TW[����ޘ�V�c��ڪF��j���w�����u�i���o�z���n�ӈl�u��vU�_�V�ZJ�Z'쯴z0"X|w�`	V�F,bp�b;��`�0�Vf�)ro�ɉ�>1�G�������dYӧ/��0ވ܄�����{�ޜ��w8o�ëu3����#�3m�݂��1�u6�(�A���˴gڨz��1ok��n"zԺ�>?9�i���,�<=���)I41�+y��+� ѓS�����g�m����w�G��T&�
�3���a���9M�6�*�֦Nu*�e�B���-���q��]F�h��Ql��f��g"#r�7�W/HgN��O�DIe{�3D[�.�v2ŭ�K��7a"#r�K����9�U�1�4*ښ��_z���ClW�Y\��Âؒ9�G���*z"���ˈ���E#D�C�F?U+�m�F*�������R|q��ω\�D~��v�KM4)ܤb
C��y�-o��Ј��#5n�
�RV�����-�W�
Fd�s���cDX�%��+���@lN�޳=?}n������뗯-��3L#�@lNT���LV�k�bp�8���@lN 6'��
�	��bp�8���@lN 6'�|�
������J?t
IEND�B`�PK�a�\XV���0�0pear/data/File/design/md5.pngnu�[����PNG


IHDR����چ IDATx���=�䶡.`�֗(��`��h��ԁ��:�C�B./�NOp���
��@
&���A[4��?H<OMI�u� ���A�<���x{��*���U�
����]�8�"��!��6w�xx]晾�'�m�O.;40���OG�8׻o�~x� ��>���!���|�g9�����M$�?h�?�L��i�f�o��>��[y1�o�ĝ[���
�����c`}�����%���}���}�{��)*�R6^¯G����w�~�{�1��>줺�����_���*
~�{���|[�Ȼ�����;��.����~`o�"��!�"��!�"��!�"��!�"��!�"��!�"��!��q�S�qm�
����_�j�y���[�W���9��_���$�|�������!���`��W�g��锸}f�p�
�h��V�~k.'�	��Ϭ?�S֎��!��U�3 i����p���6����ԅ�^IЎ�]I�`���?h�7��N��rw��<\�?��<}�?��k��{�@C?4D�@C?4D�@Cv	��7���ۣ��}�{*��po�,�s��mw���T�爮��-;�o�[:�>��'�e�J����M��v\r~����6��o�ojR���`z��D�C���6�U�m�f�
��y��)�8��S�^4�fU{�d��-��@=���P<K܈ߵ�m��B}ߟ]�0�7\˖�d��ѝ��Х��fg|�e��ħ�-��n?r����|v�������c�j��࿜�w�}z���}�ײ�@#>��|���sk��@E~�ᇳ���_��_���_��/gW����~����~s�@]���~�_���_�o��{��쾟�3���s�[pK������f�]`�z�O��[؇m2��u��,`��`��1+٘b�
ef&0iPb��?hu��y=��/9�n������Y�S���q�e����C!:�)�f��?ds�*]�Fn�_���뺯�������3��ʏ�A9��m��u�'[�]Ԏ�j��{������~`�U��:_r�����T�}�R�k��'���>�{f�ʹ}v��/ٲ��L>��>�`��`�
����ea�e��������~S�B��
}2��'��H}h�����o�&�?T�d�������M�
���
����Jn�[�]P�`"�x&���}&.p� ����/�҂)w�'���-�Em8�.Y�5���w���˯_���=.g�K6��w��nx|f���3����1ߨS~"/�p@�6� ��̏���:�ܸ����C�:���o�<Y3[n��RW�~ğ�1�q�1��8�KA�v��#���i|��~3_.ȧ���Q�l����08#��gjc�p
n�z&��л0.p��wj����%;.�xfO���)h�~���x�8��`KX{S��**�FP�L�f������w�_���8xk���d���*�J~��k�[��8�F��J�t*���r��|C��� �&�`��b�F��}g��4�Kʉύ2]S/��Y��W�d��8��g��S�LM���8�8��*su��N�$�O�|u�׬�Sy�9V�K�ʏ�njߗ�1U��	��2�8Am���{MU�����7�����3� ��?��o�&���?n�fڲ���_o����D|j����fw��Ov�dz�Mm�R�r����[Vf�2w��|~�/}��gR�+k/.�vy �M+�0�7k���b8w	�v��j[;2<���Ɍ�/{��쾬�Ż���mU�qy����+ɱ������}�fq�ѻ�&�Te�Y��({�Ȃ:ǜ�$;?Ɲ1A?D%6�|w���8�f�E�`�R���_SO�3_���q�w���}�{�<V�W����z7q?��˴�̗٥r�p�>R3n_6���X�X%�(ϛY�H�g|E|xfA�S��䅒���Yt�~d%�ee�:ط��A~�8.$�L�V�~���������ض\����Ս��{��O��>~X_�?�P2_)l��+��������	|�!�^��������~h�����<W�ʻ�߉��b6,�3�L�bS�Mm�v>�+3e[f`vf�����~���֗�	8z�췘���L=�<zp���A%�S��/�L�3�X�d���z^�W0�j�!��/�iAΉ�������ɩ͂�e^�>+�
�Y`�"=/�<���ѧ6�����%���G�w��n<W��_�Ar�|�s+P�{P�d��
�{S��|�S�NU���HO��=dXr�mW�Y6qo�w���w,9M�Z��d��—���r|�J×�r>S%���}���q�:��;cY����.��E�f�f�e�ߦ���^�g�t�/�1,N�MdN�4��'��۹�����W*J�p����>��,MpҰ�([�\'���?x������*y�]
˙�u�Z����|��B�\tY�e
�
��F�t�"=�E�x�Y����V�ק�,fS��N��7+�zG���ژڌx� �}7�]�)!�[p��,K35���&��^�ڒ�v��ԍM9b�mMJX��P2���_�A	ݷ��]��X������F*�f��Z������|?��˩�U,[�W���4�a[�K�W?�Ak���b�o�k�Ý��"��!�"��!�bT?q���?q���8W����
���
���
���
���T��}��7w�`��%,�g� �W�3�����͞�3���c��ĕ٩������|<���5�LU#��X���w�}��K�u_~����˯_��6���zV8��C`�	�_=�J/�k~ӮB�S�㓦���cYݾ���Vc���9���)<|X��mqS>n�&���Ư�KN>��>��՚�K�S��m��d"~�{�L���̛�PV�2��������!��)���?����m���qQɣ�_z�8�0�=S���cU
��K���"�K�&�z���a���\I>o9~)x�塧���lWc��%����
��7~��ȿ��^�W��Է.�f3[.�ex��P/�2��J
ٓϿ`����Mp�m���I�t���d�&��՘{�q�/�	��9ޱ����.gY����Y���.�O�׬���m����	����_��a|�_@�S���+�7�K]��l\n��SE���%wQ�|,��P���L:��|_��;w�`����z����G)i�/��\AM�N�YV�.݉��f��)mٗ���Շ8���OnХ�iSW.
빉��֒O�c`������q�s�#:�>�f<�0�bSo�e2�����fS}���7�����z� ��ڬ�	�ϻ�f�K<s����|�eiA[|\����6�7!.'Y�L	A�K���T���?��,?謒�GY���:,�V,;DI�K��Ϫ�_��p׼�ǣ���qvMh]�_���Z���O�F
}{���O���?|���(?���_��/�ˡ��ѫ�ǿ��׿�u��}߻�fX|���F%�+�D��U�et��<��o?�5�k`Z���
�@ՒS��/�D6~�ܫ���%�����{���j���V��A��N��{�Ϯ�<_�]t'���^R�r�dTH�S�Òɢ;Պgn�_�,�S�c�}?��w'L��a��Y�T?�3��{
櫏碱��%��ab�aN��Y}^5�`x�l+��L=�W,Y��
��68������$��ے��ԡ���R��Y��+K��A-�s�����%y3�1�l1N��U�O&�]�Ec��?�Z�@N�^)���)ʧQ[в��K��T�fM���A\~�dk~����ϭL��v�:���d|�8�ߤ��^��$�-$�0<3����I�9�O���R�.Y��ɢ;՚J����;fʜ�H_���:�Yr��f�
�qr�H�8f����ӻ��Ytgv!��[s�=X�"=P$Ӟ>�Ew���-�IW?
I6pk���p-~h����~�v{�J>k:��)o��K���x��L�!C�Ӻ��8�T���i�Ʒ�-+�˷�,��Խ�+�Fk?U;%�,�S���a�/u��4��yFrz��_|��-LsP�T�q�rd?����V��_Ƌ�X����/Y��K�/�m
��6�P�:���t��7p�<��Tj�"=�x��IN�g���:\HɌ�O��sY�����f��[~*�x��.�ک��Ȃ=U�ZA��3?c� ���S��L˶?7���ׄ�`�N2��䨷 �,��X�����c��uw�+y������`��x5��ly��hٲ:��$�ǿ|r��tʷ�T`ഀB��,ғa��%;�t��˅��*�J�
X����B�r�D���?j��`�+-~h����~�jkֶb���-��n�%m���Om��=F���?U; ~�
m���Y��f�	�����7�KS���S���(_�'^\g�J�r��lB�S�5�����$�M��Ӎ���V��:�F^Vɚ=S�K��Tj�"=��5�8&��VV~nm3�tm�ٓ�@X�5~��~��5DZ���`<�������`��W�si�S��#��%L�{�,$V��O�,P�����d�jq�"=%�_ȧ�5{X�g�Z�po遃���O�k�|���ԇ
��yn[�ؖ?4D�@C?pyυ|vZ�g(6.?s�|e�W���^��%�0���e�0��k�$�oy1�e�~�����x�cLI��p����?U�/���ʿ��,�e��L�d#~�d�� �8�j�7�89a���ч�w�JF�s+S��t�k�l���J9�6�:$K��\C�w��&Sv�~j��!0l<�f�̸������_XL�S�ŋ�t�����vߦ�ܕxơ�S^rP~S��lb�?<ԗ���I��z�@>��Tj�%s����6��55�nˋ��r��������^�G�c���me֤����c1�5�����~�x��� ���@������2����+�JZ�Tmn&�]�%�O�Z��P�x1���<S����x�$c��=�2s���,�<NV5x29P���H��g���W�鶾�p�AX��榸�'`���)w�u�/�Ӕ�).�ِ�~Hhai�{t�si�@C?4D���o�h���ePl��>*���U�9�O-��$>�|J>~�q�%�t�C�u���?�]�,]���}��c%�3ilKW?��d��r㩂>4��iZ=C��.�_?W�as��i�ԿW�asZ��H���4G�-��E���4D�~Z���U8�Q�������@�?m�z���5���}�h��9C�wQ��	~����	~�#�+���~<�
pg����|���Ԡ�{���N�S�OC���R��~�}I}�"�i�V@'�i���?�N�)�N�`{.-Q-�O��8�ԧf����)���Q3�
�ܟ��@�l�8�B��e	"��3�0����4�8��4.D�@C?���KA�E	~�ٌ �?7�)Ʈ�>�&�����/�&��!������E��?�kƎp���� c'R�;�/H}�D�s�d%?7!�J~�4�F�%����w%��<�26'��1���ܘ��ڴ�f�\���E�t��"4C��fDC?��0���4�ؐ�%�!��!����DX@��2F�6	~�Eƈ�,��h�,&��
56᷈f	~h���b4���@+��N��0:�?����bR��k��~y` ��!��k�b؄�n˸�	~��$�O�4�X@���ܐԇ)���i�lK�S5��-�܄� PB�w��TJ�
`���}($���n[��~j$�v"���2��%��~h��.Is����O��q[plH�S;=���zogW��<?��A>~<~����9x;�ğ*�3�6��ώ��<��!��G��g��z�&SH|8nC��V�����RO~^��\�Aiq7@��\�(lE�s�d~���8΅�\���d����|�?��:�ǝ���>(�z�t�m�}opP)�{�@��>�D�s2wߑ$�a'��3i�L�s&�p0�Tĥ؛�j��@�s
;R�!��*H}8����vg��@��E��1��'��s����M#�D��Ci�1�����ϡ4��%�������A��~��P��4���:~h����z�������~`/�v@�?���k�ԇ:	~v䣿e~�P'�
��H��6�ؒQP9�lƨ���g�}
��p	�؆ԇK�lO��Z���I}�j	~`9�9�r?��k:pE��-i�TN�i��	~6���~���H}��	~`�8��?P�����64.A�
�F�)�
~h��g�W!���7�f?0��
���*��7&��?�	�{�Å[����rZ��#��o��&���0nnO�F�-I}h��g6�pW~���
�̦]p]ogW8قk7y�6;�д�#6�����a���U�t�3�v���	
��vI��}������ք��⧔�!�
~JI}���5�q��z
 �)��p���4o��h�v>-�e���	$�c4����c�2���ꇛ�D/�ۻ�ÿnt.�?)�_�<3u�̾/k2U=�Ԭ�?2I�N.4>c�W�-����˸
�?��BnC��m���C?�r��3Si���{%7��of����*%���|����A��m���A3z��A��� ��S{

��/�^
�
=���"�s	~`c���ɴ�ս����k�wQ����2�䁗W�3Ŏ�YN���e�K���~��s�
��×ݷ���
f�~�|~��̾�s�9\ԧ6���и�����W��w�?���ب����s�w�7��{���}4u,#��>�>��?���
/-md����w��'&���_�B��O"f���ri('�g���dݷ�)�'3��EI}`���u'&�;���I}`.��ą&&+<D7ы@�NL}�$pQ��+NLO"of�1f�+�U�G�/Gf~��.�k�f���dQ��˷�%��.���\��+1�XI�@C?\��>���*���F��=�?�@��.؎���r���>n�?��7N�;u������’�Z����\�]����������.�����6�΀���X�6�Z�ʹ�&���S��Rs�r6TR��=�i1��B.��ߤq��(p�B�?p��G�e�>w?��_�������������_��w�?������օ"��;�!��Q�������r�UԐ��+�ui��BR���{�L:6���3܌��&��D[�>�7���HN2~r�,�d�r*“#���EJ*��p[Z������;�����o�o�I��CQ�,cS�����\��~,�z��Ǻ->nƍ����Bڼ����?����V���qG��f�w�k�X�v�z�/��8.��W�͔9.����y����r�M����7%����'�/��	6H��3~�
�����Ŧ>2�g2
�,y`��G�p��=���p�����K��u�
�~��"=����Hn�����a�����H���,�}�A���܃�Ci�����
�����Ϯ��	~ؗa�@UL�C>~���*�H��G���f����Z��u��m�8V3�b�q��b�XO?
\���p�lWΫ؏�~h�����J���kv)�}�2�eA^�jےX@�w��������,��?��ɷe}Mؐ��������/��<��;���Z���C�Ƈ��Kog�˩B2���z�#p�Lz��O�
���Q[y��<.3�%y��3��_��m���IDATA�A��fP۩�!0u��N4����2rJJ;Z��oW��d��Gς����;���(_l|>:���uA��ZZo��<h_6��B��Jd����l�'_�\V�x�q�;�^��Z�@8X�-��=�0h��l���+���O��̩O�q9S��%o*�r|�!Y�L����w���i��	~�l:�[��3
��8�|%��.�%��'�;�@N]hO��,a�������A2�H�ۜڝت�|٩a�A��V�ն���q����O�܄ۤm�u�����$�G�]V[�-���]"���-�����P_&�F㽦'%O����S���x�}�x<ή�A����Hm�޽��ӧ��?�Z�����Q�s�G�N�������	�}�"�����R�����"�nV�[�~�p!����K��ķ�hg����L���`*��d�!��#!Y��3�O�L蒽�׳ɬ^3~����)t��3����[ϼ|ﰕ5'���v���C;!�~Zܷ�6�y����i�k���&'��BJ���8�N?8X�Ҭ��?8�&E��3��);�M\HWp:���'YHp�-8u�����<��܂���[:�X7꟟5�X�p�>�
w>h�ʬHH˂.�_�J��Ν(�e}�6}�iDf݊�S�x��;��	���]�Ɇ��m����}��r�q���;f�{��'��5���T�6��5:`*1��dk~+�s�es`,떀�	�J�|.g�_��Q�]��:�f������;��Α,���Gr9��3�?}Ꮒ}X�`��4�9����w*K}���},��~,ϲ�<(7#��n�,�߷���	�����3�ٟ�f�͊;��[�HO7����hE���ɿ��w�s����Gax���@����Sϔ������Yv��]�>�oٽ:/�Zp�3`��[�a
��u���_&�����0��Y��2���[�kaS����ؠ�a�W���]��g`?��떮)2���ݖ7�L��>G8̂Kfɋb/�_����όקȌ�M�\��F��2ݙ�w��3��ֻ��,���mz�/+�p[Mo����C������?+�@��)�V{�O����@�oO��6�=�j%������mꥸ�L��ۏ��֛yve��g=�˹���&#�v���}opЊ��K}ؕ��&��Ck�r�A�7"�,p�]���u�&�V��jp��Q�K$������
��!�A��'�%��E�x���>O����8���{+��+�{g�̩�G^
f��V�����[�[�8�E���{WZp34�����U�h=�7�����4���0���O�ח���=��Z��Z��_�])'^J�+h�[������h�5{�e���Z������^W����͝�ϤvZP	���Y\���~�}ߟ]h��N�Ԙb���?Bɭt���3uh���L�w�Y8k4�V��,84Fs�"���ȃ����A�%��[N}��O���>@�Z�5��t��aݩ��lV�BOP+�k�>����iC�,����Z������ԇ�	��[��N���}�j�˒g
���囚x�т\�Ez���*>�8�Ezjd�#�k$��I��0-?�C��jj�O�@C�.�{㗺9�.��{�@s�"��nπ���v1(!�g�,�S޾��O�{�30�z�/X�'^��mھ��/�3>D��O�8���P�����j�<Y���N���7a�[������̎�y��_��p��z<�*��P'���x�X���9�:��g��OS=�pE�@C?��}���6#��~�/�uz��s������έkx �տ���9|��Ƿ�����Y/�3�08D�J+�2乺W�z����L�q9ɗ^����iA\Tp���v"��BZ�
���#_M���\���~��Xi��i�Å���Z�qC<9�~n�Sk�O���t��Ez�Xyi��y.��Ez�a��ss����T�nC���i�_TSp}��,!��?��ԇ����
iqT�ۻ�gW.��}���������5������soR�NW?4D�O?}���dzk�4��ꚛ��eh��^��*��lI<TN�琑�k���;��R�D�1!P3�
��$#6�~?{�WgLܒ�g/F�TH�i��pK��I��~h��Bg��	~� H.�`~�7�
���}���&�9�8�����~����f~%]�d$?�C�s(���%�C/�!�����	~h����~Nc���?�1��x��2�l�<��<�r��?g2�������=O�/���p���䙉����s=�r�]��=��]�d�~��N�Ss��d�^r=h�[��O���6�IS��{��5~h��������p?�	~j#�vb�$�$����bv%��	�����:"
`?�"������z	-��	~�e��Jn�b�nK�1�O�D��?4D��
L�p7�����ҨX@���h�ogW��

�g\=��+x5x����9�3���>~3�r�3�6���������qf_�
l<��@!]��l���\�ؙ��P����>�?3U����M��}��OLhE���@C?4D�õ��"��0�g�0����ܻ0������\���E�@C?\��
�b�����%?7����k~���!�������~��F1����-Ҙ>`��jg�?�\��As؄���$@����~�R���������ϝ� 2
��%���xx���<�7�UslK�ss�`L�s[5w�/p���E�s[�_��׼�{���~�l��ÃjO�t����"���!��
}`sogWvw�ȏ�[��	��-���N?
�D��P>`W���<���3��V���E�Ӝ
S�IC8��}\̆�]a�o[%�@L�s=_���*\�ۻ�gW���~h�?���O��>|�pnM�zh�@C?4D�@C?4D�@C?��u���~(e� �?������3o��?�%_�5lP	��1N�<|��������L7��M�(��oπO����>E�����g��F�ÿ�
���u��?��߼k�\�x<���n7W���,���>=[�x�^�"��!�"��!��vv�d�;��w��o��_�<���훚����?|���Y;�s�%'�-� �f?�2�{��6��r7��~�Wr���<?%{�LM(�KX@�sq(��S������3�%W􉋝�$�����:���8�ϭ�]�S9�{�j:S��m���[y9�䥗Ŏ�/��_����G��m|Q?�^����g����<i���a�.�"=]Y/�Ez�X�Z�p%/���p%"Xɔ���
���
������5�4N�s=ni+��H��
���
���
�����F����߲2���|��߽��mU���(!�iQ��G������m2�A��-�݇�͒�u~�G�sm��nNd�y0�r�R&�� ��wyy\�=~�-H͝�/�x������?�������6la�=���5��-_`'�����x�](��-�/�����>=��a}��
�}��U0>8��Z�|��@C?4D�@C?�s�)!���?wp�@5|8�Q����9��<��-�܀��ڶZ�g�L�mH�[��.�ϵm8���5	P?���~;uX��*���,�i��?��Ez���H��"=[-��!���H�������u�
����!�"��!�"��!�"��!�"��!�"��!�b���ͺ�K	~.��x<|��ܚ\��~h�����ǣ�������!�"��!�"��!�"��!�"��!�"��!�"��!�"��%����*��SH�ì�TIEND�B`�PK�a�\�
[�o�opear/data/File/design/file.xmlnu�[���<?xml version="1.0"  encoding="windows-1252"?>
<XMI xmi.version="1.1" xmlns:UML="omg.org/UML1.3" timestamp="2005-08-22 11:37:08">
	<XMI.header>
		<XMI.documentation>
			<XMI.exporter>Enterprise Architect</XMI.exporter>
			<XMI.exporterVersion>2.5</XMI.exporterVersion>
		</XMI.documentation>
	</XMI.header>
	<XMI.content>
		<UML:Model name="EA Model" xmi.id="MX_EAID_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2">
			<UML:Namespace.ownedElement>
				<UML:Class name="EARootClass" xmi.id="EAID_11111111_5487_4080_A7F4_41526CB0AA00" isRoot="true" isLeaf="false" isAbstract="false"/>
				<UML:Package name="File" xmi.id="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2" isRoot="false" isLeaf="false" isAbstract="false" visibility="public">
					<UML:ModelElement.stereotype>
						<UML:Stereotype xmi.idref="EAID_34BCDD26_7984_4434_9B53_A14D5C28529D"/>
					</UML:ModelElement.stereotype>
					<UML:ModelElement.taggedValue>
						<UML:TaggedValue tag="documentation" value="Provides support for file operations which are not covered by PHP or are just missing."/>
						<UML:TaggedValue tag="created" value="2005-07-27 00:00:00"/>
						<UML:TaggedValue tag="modified" value="2005-07-27 00:00:00"/>
						<UML:TaggedValue tag="iscontrolled" value="TRUE"/>
						<UML:TaggedValue tag="xmlpath" value="E:\src\ezcomponents\packages\File\trunk\design\file.xml"/>
						<UML:TaggedValue tag="lastsavedate" value="2005-08-22 11:37:08"/>
						<UML:TaggedValue tag="version" value="0.1"/>
						<UML:TaggedValue tag="isprotected" value="FALSE"/>
						<UML:TaggedValue tag="usedtd" value="FALSE"/>
						<UML:TaggedValue tag="owner" value="Jan Borsodi"/>
						<UML:TaggedValue tag="xmiver" value="Enterprise Architect XMI/UML 1.3"/>
						<UML:TaggedValue tag="logxml" value="FALSE"/>
						<UML:TaggedValue tag="packageFlags" value="CRC=0;"/>
						<UML:TaggedValue tag="batchsave" value="0"/>
						<UML:TaggedValue tag="batchload" value="0"/>
						<UML:TaggedValue tag="phase" value="0.1"/>
						<UML:TaggedValue tag="status" value="Proposed"/>
						<UML:TaggedValue tag="author" value="Jan Borsodi"/>
						<UML:TaggedValue tag="complexity" value="1"/>
						<UML:TaggedValue tag="stereotype" value="ezcomponent"/>
						<UML:TaggedValue tag="ea_stype" value="Public"/>
						<UML:TaggedValue tag="eventflags" value="LNK=ff03;"/>
						<UML:TaggedValue tag="tpos" value="0"/>
					</UML:ModelElement.taggedValue>
					<UML:Namespace.ownedElement>
						<UML:Class name="ezcFileMd5Iterator" xmi.id="EAID_1133FA2C_588A_44a5_BFB5_03EA47ED31C2" visibility="public" namespace="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation" value="Provides iteration of .md5 style files. Each iteration points to an array containing the MD5 value and the filepath.

Each iteration entry consists of:
- md5 - The MD5 sum.
- path - The file path."/>
								<UML:TaggedValue tag="isSpecification" value="false"/>
								<UML:TaggedValue tag="ea_stype" value="Class"/>
								<UML:TaggedValue tag="ea_ntype" value="0"/>
								<UML:TaggedValue tag="version" value="1.0"/>
								<UML:TaggedValue tag="package" value="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2"/>
								<UML:TaggedValue tag="date_created" value="2005-07-28 11:57:00"/>
								<UML:TaggedValue tag="date_modified" value="2005-08-22 11:30:22"/>
								<UML:TaggedValue tag="gentype" value="PHP"/>
								<UML:TaggedValue tag="tagged" value="0"/>
								<UML:TaggedValue tag="package_name" value="File"/>
								<UML:TaggedValue tag="phase" value="1.0"/>
								<UML:TaggedValue tag="author" value="Jan Borsodi"/>
								<UML:TaggedValue tag="complexity" value="1"/>
								<UML:TaggedValue tag="status" value="Proposed"/>
								<UML:TaggedValue tag="eventflags" value="OPN=f76b;LNK=ebc5;"/>
								<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
							</UML:ModelElement.taggedValue>
							<UML:Classifier.feature>
								<UML:Attribute name="path" changeable="none" visibility="private" ownerScope="instance" targetScope="instance">
									<UML:Attribute.initialValue>
										<UML:Expression/>
									</UML:Attribute.initialValue>
									<UML:StructuralFeature.type>
										<UML:Classifier xmi.idref="eaxmiid0"/>
									</UML:StructuralFeature.type>
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="string"/>
										<UML:TaggedValue tag="collection" value="false"/>
										<UML:TaggedValue tag="position" value="0"/>
										<UML:TaggedValue tag="lowerBound" value="1"/>
										<UML:TaggedValue tag="upperBound" value="1"/>
										<UML:TaggedValue tag="ea_guid" value="{6D689FC5-7239-4408-8455-BE81B4296CBE}"/>
										<UML:TaggedValue tag="styleex" value="volatile=0;"/>
									</UML:ModelElement.taggedValue>
								</UML:Attribute>
								<UML:Operation name="__construct" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="void"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="0"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{77BF7508-D3DB-48b5-BAE8-4A7F0BF70A7E}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid1"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="void"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-D3DB-48b5-BAE8-4A7F0BF70A7E}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="path" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{8AB008F1-03B2-4cd0-BFD3-3427F0F10818}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="current" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="mixed"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="1"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{682D90CC-6AEA-4ba8-9DC6-BBA2BAED3C54}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid2"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="mixed"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-6AEA-4ba8-9DC6-BBA2BAED3C54}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="key" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="mixed"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="2"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{9A71D571-5EC3-45bf-A93B-52677BEF6088}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid2"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="mixed"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-5EC3-45bf-A93B-52677BEF6088}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="next" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="mixed"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="3"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{92C2D3F7-9E1F-49a3-9A81-938604747EBD}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid2"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="mixed"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-9E1F-49a3-9A81-938604747EBD}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="rewind" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="void"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="4"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{9D3F8406-B9C9-45a1-A0AB-B543AE293172}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid1"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="void"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-B9C9-45a1-A0AB-B543AE293172}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="valid" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="bool"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="5"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{6B3AA7F0-BADB-461a-A04C-13D905A90814}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid3"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="bool"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-BADB-461a-A04C-13D905A90814}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="path" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="string"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="6"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{B95BCE05-3572-4316-A952-6712A776E142}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-3572-4316-A952-6712A776E142}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
							</UML:Classifier.feature>
						</UML:Class>
						<UML:Dependency client="EAID_1133FA2C_588A_44a5_BFB5_03EA47ED31C2" supplier="EAID_F535D466_7D32_4dd6_BDA0_09D6AEC68094" xmi.id="EAID_0F483FD0_55FB_407c_899B_ED9C7589FFE7" visibility="public">
							<UML:ModelElement.stereotype>
								<UML:Stereotype name="send"/>
							</UML:ModelElement.stereotype>
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="style" value="3"/>
								<UML:TaggedValue tag="ea_type" value="Dependency"/>
								<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
								<UML:TaggedValue tag="linemode" value="3"/>
								<UML:TaggedValue tag="linecolor" value="-1"/>
								<UML:TaggedValue tag="linewidth" value="0"/>
								<UML:TaggedValue tag="seqno" value="0"/>
								<UML:TaggedValue tag="stereotype" value="send"/>
								<UML:TaggedValue tag="headStyle" value="0"/>
								<UML:TaggedValue tag="lineStyle" value="0"/>
								<UML:TaggedValue tag="conditional" value="�send�"/>
								<UML:TaggedValue tag="src_visibility" value="Public"/>
								<UML:TaggedValue tag="src_aggregation" value="0"/>
								<UML:TaggedValue tag="src_isOrdered" value="false"/>
								<UML:TaggedValue tag="src_isNavigable" value="false"/>
								<UML:TaggedValue tag="src_containment" value="Unspecified"/>
								<UML:TaggedValue tag="dst_visibility" value="Public"/>
								<UML:TaggedValue tag="dst_aggregation" value="0"/>
								<UML:TaggedValue tag="dst_isOrdered" value="false"/>
								<UML:TaggedValue tag="dst_isNavigable" value="true"/>
								<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
								<UML:TaggedValue tag="virtualInheritance" value="0"/>
								<UML:TaggedValue tag="mb" value="�send�"/>
							</UML:ModelElement.taggedValue>
						</UML:Dependency>
						<UML:Association xmi.id="EAID_6E4D6487_BF6A_4379_9015_AD24927A6A88" visibility="public" isRoot="false" isLeaf="false" isAbstract="false">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="style" value="2"/>
								<UML:TaggedValue tag="ea_type" value="Association"/>
								<UML:TaggedValue tag="direction" value="Unspecified"/>
								<UML:TaggedValue tag="linemode" value="2"/>
								<UML:TaggedValue tag="linecolor" value="-1"/>
								<UML:TaggedValue tag="linewidth" value="0"/>
								<UML:TaggedValue tag="seqno" value="0"/>
								<UML:TaggedValue tag="headStyle" value="0"/>
								<UML:TaggedValue tag="lineStyle" value="0"/>
								<UML:TaggedValue tag="privatedata5" value="EDGE=1;SX=0;SY=0;EX=0;EY=0;"/>
								<UML:TaggedValue tag="virtualInheritance" value="0"/>
							</UML:ModelElement.taggedValue>
							<UML:Association.connection>
								<UML:AssociationEnd visibility="public" aggregation="none" isOrdered="false" isNavigable="true" type="EAID_1133FA2C_588A_44a5_BFB5_03EA47ED31C2">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="containment" value="Unspecified"/>
									</UML:ModelElement.taggedValue>
								</UML:AssociationEnd>
								<UML:AssociationEnd visibility="public" aggregation="none" isOrdered="false" isNavigable="true" type="EAID_858CDF19_ACFF_47b4_AB72_045DB32961A8">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="containment" value="Unspecified"/>
									</UML:ModelElement.taggedValue>
								</UML:AssociationEnd>
							</UML:Association.connection>
						</UML:Association>
						<UML:Dependency client="EAID_1133FA2C_588A_44a5_BFB5_03EA47ED31C2" supplier="EAID_BB5C70C8_8A08_490b_BE8C_DF270C26A18D" xmi.id="EAID_72E0503A_BF12_49cb_8AF5_22BD87F067E8" visibility="public">
							<UML:ModelElement.stereotype>
								<UML:Stereotype name="realize"/>
							</UML:ModelElement.stereotype>
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="style" value="3"/>
								<UML:TaggedValue tag="ea_type" value="Realisation"/>
								<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
								<UML:TaggedValue tag="linemode" value="3"/>
								<UML:TaggedValue tag="linecolor" value="-1"/>
								<UML:TaggedValue tag="linewidth" value="0"/>
								<UML:TaggedValue tag="seqno" value="0"/>
								<UML:TaggedValue tag="stereotype" value="realize"/>
								<UML:TaggedValue tag="headStyle" value="0"/>
								<UML:TaggedValue tag="lineStyle" value="0"/>
								<UML:TaggedValue tag="conditional" value="�realize�"/>
								<UML:TaggedValue tag="src_visibility" value="Public"/>
								<UML:TaggedValue tag="src_aggregation" value="0"/>
								<UML:TaggedValue tag="src_isOrdered" value="false"/>
								<UML:TaggedValue tag="src_isNavigable" value="false"/>
								<UML:TaggedValue tag="src_containment" value="Unspecified"/>
								<UML:TaggedValue tag="dst_visibility" value="Public"/>
								<UML:TaggedValue tag="dst_aggregation" value="0"/>
								<UML:TaggedValue tag="dst_isOrdered" value="false"/>
								<UML:TaggedValue tag="dst_isNavigable" value="true"/>
								<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
								<UML:TaggedValue tag="virtualInheritance" value="0"/>
								<UML:TaggedValue tag="mb" value="�realize�"/>
							</UML:ModelElement.taggedValue>
						</UML:Dependency>
						<UML:Class name="ezcFileTools" xmi.id="EAID_4025D0AB_4288_427c_8074_0E9562FC5624" visibility="public" namespace="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
							<UML:ModelElement.stereotype>
								<UML:Stereotype name="tool"/>
							</UML:ModelElement.stereotype>
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation" value="Collection of higher level file operations than those supplied by PHP itself."/>
								<UML:TaggedValue tag="isSpecification" value="false"/>
								<UML:TaggedValue tag="ea_stype" value="Class"/>
								<UML:TaggedValue tag="ea_ntype" value="0"/>
								<UML:TaggedValue tag="version" value="1.0"/>
								<UML:TaggedValue tag="package" value="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2"/>
								<UML:TaggedValue tag="date_created" value="2005-07-13 08:29:46"/>
								<UML:TaggedValue tag="date_modified" value="2005-08-22 11:31:32"/>
								<UML:TaggedValue tag="gentype" value="PHP"/>
								<UML:TaggedValue tag="tagged" value="0"/>
								<UML:TaggedValue tag="package_name" value="File"/>
								<UML:TaggedValue tag="phase" value="1.0"/>
								<UML:TaggedValue tag="author" value="Jan Borsodi"/>
								<UML:TaggedValue tag="complexity" value="1"/>
								<UML:TaggedValue tag="status" value="Proposed"/>
								<UML:TaggedValue tag="stereotype" value="tool"/>
								<UML:TaggedValue tag="eventflags" value="OPN=6be0;LNK=641e;"/>
								<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
							</UML:ModelElement.taggedValue>
							<UML:Classifier.feature>
								<UML:Operation name="linkCopy" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="void"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="0"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{FB078574-658E-4463-B39E-E922C21DA7C8}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid1"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="void"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-658E-4463-B39E-E922C21DA7C8}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="dst" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{8B971C24-DD02-4168-AF09-89FEB79E4B22}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="src" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="1"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{B176642A-FF48-49f3-B210-96C2BB58CF87}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="link" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="void"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="1"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{0248CED1-7A1A-4745-ADAE-3D0C986A7AFD}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid1"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="void"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-7A1A-4745-ADAE-3D0C986A7AFD}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="dst" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{E53CF0AA-47A1-4071-8AE6-62841F4522C2}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="src" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="1"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{22E8BE16-1903-49a2-B908-723196EBD8FD}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="symlink" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="void"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="2"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{B299C327-0EB4-4fb8-9271-BB879AB1A9E1}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid1"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="void"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-0EB4-4fb8-9271-BB879AB1A9E1}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="dst" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{EB3DD4CF-F57D-480f-A68C-4A17BADF0A2D}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="src" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="1"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{9B8A6B92-D7F4-4bbf-A409-78DBFA142195}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="copy" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="void"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="3"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{6F6591E3-B697-4507-86F5-CA69D72D9B3F}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid1"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="void"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-B697-4507-86F5-CA69D72D9B3F}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="dst" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{D40C00F1-5FD9-405e-AC92-06F25923286C}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="src" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="1"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{CD053944-20BC-4392-A540-B0C46F9953B9}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="move" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="void"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="4"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{CC1FF4F5-4687-4eff-A2A8-D1D65371879F}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid1"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="void"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-4687-4eff-A2A8-D1D65371879F}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="dst" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{3F7C9638-3639-4ced-B4A9-0E776F01C356}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="src" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="1"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{0C71FEF2-AF18-42ee-BCBF-880C8B191691}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="multiLevelPath" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation" value="@code
eZFileTools::multiLevelPath( '5214361.cache', 3 );
@endcode
return @c &quot;5/2/1/4361.cache&quot;"/>
										<UML:TaggedValue tag="type" value="string"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="5"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{2E422B1F-6B5C-45bb-B028-3A667379BE04}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-6B5C-45bb-B028-3A667379BE04}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="path" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{E1E3C88D-C2F6-449e-83C9-ADFF843032E7}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="cleanPath" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation" value="Removes all unneeded directory separators and resolves any &quot;.&quot;s and &quot;..&quot;s found in @a $path.

For instance: &quot;var/../lib/ezdb&quot; becomes &quot;lib/ezdb&quot;, while &quot;../site/var&quot; will not be changed."/>
										<UML:TaggedValue tag="type" value="string"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="6"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{D0469931-5C9B-4797-99C2-1BAB0ADBF0CE}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-5C9B-4797-99C2-1BAB0ADBF0CE}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="path" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{88B4940A-8D27-4f11-848D-4384D08D346C}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="rmdirEmpty" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation" value="Goes trough the directory path @a $path and removes empty directories."/>
										<UML:TaggedValue tag="type" value="bool"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="7"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{ED7CF88B-EAD5-4b4f-A384-358859BCCCA7}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid3"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="bool"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-EAD5-4b4f-A384-358859BCCCA7}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="path" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{078F1AE3-26D5-417b-94E3-9EBB7AB03A46}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="rmdirRecursive" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation" value="Removes the directory @a $path and all its contents recursively."/>
										<UML:TaggedValue tag="type" value="bool"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="8"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{D89D49CE-CB9F-4503-B01B-8E70D99A5C86}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid3"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="bool"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-CB9F-4503-B01B-8E70D99A5C86}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="path" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{B566B84D-36B2-4326-A7E4-CA40A3B6037E}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="find" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="array"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="9"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{80720CDC-C8AF-43ea-9F11-6CDEFE0644C5}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid4"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="array"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-C8AF-43ea-9F11-6CDEFE0644C5}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="path" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{49D2C316-CD2F-4540-A50D-10BDC66A6510}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="types" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="1"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{58BEDD3F-B979-493a-8AA9-4FF602DD34EB}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression body="'dfl'"/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="prefix" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="2"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{7765FFB6-8CE3-475c-85CF-1788BD2D33BB}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression body="false"/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="withHidden" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid3"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="3"/>
												<UML:TaggedValue tag="type" value="bool"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{1193B71D-BC22-4d03-BACC-DA374E7F2E8D}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression body="false"/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="filter" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="4"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{7008AB54-E130-4bbb-949A-0D4902A5E70C}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression body="false"/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="copyPath" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation" value="Copies a file path (and optionally all it's subitems) to another path.

@note If the destination path ends in a slash it will"/>
										<UML:TaggedValue tag="type" value="int"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="static" value="1"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="10"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{5923A346-C467-4f98-9C63-7BBED5AD49FA}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid5"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="int"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-C467-4f98-9C63-7BBED5AD49FA}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="src" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{D427B2B7-5E11-4cb5-A238-CC694E86158B}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="dst" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="1"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{AF434438-85AB-4437-8C73-B3A21AE3BE67}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="recurse" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid3"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="2"/>
												<UML:TaggedValue tag="type" value="bool"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{715F428E-1BB0-41c3-928F-E77581531E83}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression body="true"/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="withHidden" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid3"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="3"/>
												<UML:TaggedValue tag="type" value="bool"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{C9830EA2-8EFA-412d-A63A-87B0CC50B2E8}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression body="false"/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="filter" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="4"/>
												<UML:TaggedValue tag="type" value="string"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{AB7C0B62-3C7B-4f3a-BB78-991F9C96F003}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression body="false"/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
							</UML:Classifier.feature>
						</UML:Class>
						<UML:Dependency client="EAID_3FBB1944_522E_40bb_A1D0_ECBA00B3A77A" supplier="EAID_4025D0AB_4288_427c_8074_0E9562FC5624" xmi.id="EAID_28D28C8A_D061_4a20_9930_DB80390A7252" visibility="public">
							<UML:ModelElement.stereotype>
								<UML:Stereotype name="refactor"/>
							</UML:ModelElement.stereotype>
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="style" value="3"/>
								<UML:TaggedValue tag="ea_type" value="Dependency"/>
								<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
								<UML:TaggedValue tag="linemode" value="3"/>
								<UML:TaggedValue tag="linecolor" value="-1"/>
								<UML:TaggedValue tag="linewidth" value="0"/>
								<UML:TaggedValue tag="seqno" value="0"/>
								<UML:TaggedValue tag="stereotype" value="refactor"/>
								<UML:TaggedValue tag="headStyle" value="0"/>
								<UML:TaggedValue tag="lineStyle" value="0"/>
								<UML:TaggedValue tag="conditional" value="�refa�"/>
								<UML:TaggedValue tag="src_visibility" value="Public"/>
								<UML:TaggedValue tag="src_aggregation" value="0"/>
								<UML:TaggedValue tag="src_isOrdered" value="false"/>
								<UML:TaggedValue tag="src_isNavigable" value="false"/>
								<UML:TaggedValue tag="src_containment" value="Unspecified"/>
								<UML:TaggedValue tag="dst_visibility" value="Public"/>
								<UML:TaggedValue tag="dst_aggregation" value="0"/>
								<UML:TaggedValue tag="dst_isOrdered" value="false"/>
								<UML:TaggedValue tag="dst_isNavigable" value="true"/>
								<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
								<UML:TaggedValue tag="virtualInheritance" value="0"/>
								<UML:TaggedValue tag="mb" value="�refa�"/>
							</UML:ModelElement.taggedValue>
						</UML:Dependency>
						<UML:Dependency client="EAID_E0B46D9C_CC4A_47d8_BFA3_F64DE7803DCE" supplier="EAID_4025D0AB_4288_427c_8074_0E9562FC5624" xmi.id="EAID_84988281_F05E_4f97_AE55_D975BC3F71C1" visibility="public">
							<UML:ModelElement.stereotype>
								<UML:Stereotype name="refactor"/>
							</UML:ModelElement.stereotype>
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="style" value="3"/>
								<UML:TaggedValue tag="ea_type" value="Dependency"/>
								<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
								<UML:TaggedValue tag="linemode" value="3"/>
								<UML:TaggedValue tag="linecolor" value="-1"/>
								<UML:TaggedValue tag="linewidth" value="0"/>
								<UML:TaggedValue tag="seqno" value="0"/>
								<UML:TaggedValue tag="stereotype" value="refactor"/>
								<UML:TaggedValue tag="headStyle" value="0"/>
								<UML:TaggedValue tag="lineStyle" value="0"/>
								<UML:TaggedValue tag="conditional" value="�refa�"/>
								<UML:TaggedValue tag="src_visibility" value="Public"/>
								<UML:TaggedValue tag="src_aggregation" value="0"/>
								<UML:TaggedValue tag="src_isOrdered" value="false"/>
								<UML:TaggedValue tag="src_isNavigable" value="false"/>
								<UML:TaggedValue tag="src_containment" value="Unspecified"/>
								<UML:TaggedValue tag="dst_visibility" value="Public"/>
								<UML:TaggedValue tag="dst_aggregation" value="0"/>
								<UML:TaggedValue tag="dst_isOrdered" value="false"/>
								<UML:TaggedValue tag="dst_isNavigable" value="true"/>
								<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
								<UML:TaggedValue tag="virtualInheritance" value="0"/>
								<UML:TaggedValue tag="mb" value="�refa�"/>
							</UML:ModelElement.taggedValue>
						</UML:Dependency>
						<UML:Dependency client="EAID_100C40C4_3F4F_4ebb_BBF5_F5B6A271706D" supplier="EAID_4025D0AB_4288_427c_8074_0E9562FC5624" xmi.id="EAID_BB7D590D_2393_4efc_8CBF_F0ECF7ED91B8" visibility="public">
							<UML:ModelElement.stereotype>
								<UML:Stereotype name="refactor"/>
							</UML:ModelElement.stereotype>
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="style" value="3"/>
								<UML:TaggedValue tag="ea_type" value="Dependency"/>
								<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
								<UML:TaggedValue tag="linemode" value="3"/>
								<UML:TaggedValue tag="linecolor" value="-1"/>
								<UML:TaggedValue tag="linewidth" value="0"/>
								<UML:TaggedValue tag="seqno" value="0"/>
								<UML:TaggedValue tag="stereotype" value="refactor"/>
								<UML:TaggedValue tag="headStyle" value="0"/>
								<UML:TaggedValue tag="lineStyle" value="0"/>
								<UML:TaggedValue tag="conditional" value="�refa�"/>
								<UML:TaggedValue tag="src_visibility" value="Public"/>
								<UML:TaggedValue tag="src_aggregation" value="0"/>
								<UML:TaggedValue tag="src_isOrdered" value="false"/>
								<UML:TaggedValue tag="src_isNavigable" value="false"/>
								<UML:TaggedValue tag="src_containment" value="Unspecified"/>
								<UML:TaggedValue tag="dst_visibility" value="Public"/>
								<UML:TaggedValue tag="dst_aggregation" value="0"/>
								<UML:TaggedValue tag="dst_isOrdered" value="false"/>
								<UML:TaggedValue tag="dst_isNavigable" value="true"/>
								<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
								<UML:TaggedValue tag="virtualInheritance" value="0"/>
								<UML:TaggedValue tag="mb" value="�refa�"/>
							</UML:ModelElement.taggedValue>
						</UML:Dependency>
						<UML:Comment xmi.id="EAID_820EC35C_401E_4832_87D6_9DFE4D44071E" visibility="public" namespace="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="isSpecification" value="false"/>
								<UML:TaggedValue tag="ea_stype" value="Text"/>
								<UML:TaggedValue tag="ea_ntype" value="18"/>
								<UML:TaggedValue tag="version" value="1.0"/>
								<UML:TaggedValue tag="package" value="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2"/>
								<UML:TaggedValue tag="date_created" value="2005-08-22 11:29:16"/>
								<UML:TaggedValue tag="date_modified" value="2005-08-22 11:29:16"/>
								<UML:TaggedValue tag="gentype" value="&lt;none&gt;"/>
								<UML:TaggedValue tag="tagged" value="0"/>
								<UML:TaggedValue tag="package_name" value="File"/>
								<UML:TaggedValue tag="phase" value="1.0"/>
								<UML:TaggedValue tag="author" value="Jan Borsodi"/>
								<UML:TaggedValue tag="complexity" value="1"/>
								<UML:TaggedValue tag="status" value="Proposed"/>
								<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
							</UML:ModelElement.taggedValue>
						</UML:Comment>
						<UML:Class name="ezcFileMd5Validator" xmi.id="EAID_858CDF19_ACFF_47b4_AB72_045DB32961A8" visibility="public" namespace="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="isSpecification" value="false"/>
								<UML:TaggedValue tag="ea_stype" value="Class"/>
								<UML:TaggedValue tag="ea_ntype" value="0"/>
								<UML:TaggedValue tag="version" value="1.0"/>
								<UML:TaggedValue tag="package" value="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2"/>
								<UML:TaggedValue tag="date_created" value="2005-07-28 12:06:26"/>
								<UML:TaggedValue tag="date_modified" value="2005-08-22 11:30:26"/>
								<UML:TaggedValue tag="gentype" value="PHP"/>
								<UML:TaggedValue tag="tagged" value="0"/>
								<UML:TaggedValue tag="package_name" value="File"/>
								<UML:TaggedValue tag="phase" value="1.0"/>
								<UML:TaggedValue tag="author" value="Jan Borsodi"/>
								<UML:TaggedValue tag="complexity" value="1"/>
								<UML:TaggedValue tag="status" value="Proposed"/>
								<UML:TaggedValue tag="eventflags" value="LNK=b874;OPN=34e5;"/>
								<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
							</UML:ModelElement.taggedValue>
							<UML:Classifier.feature>
								<UML:Attribute name="valid" changeable="none" visibility="private" ownerScope="instance" targetScope="instance">
									<UML:Attribute.initialValue>
										<UML:Expression/>
									</UML:Attribute.initialValue>
									<UML:StructuralFeature.type>
										<UML:Classifier xmi.idref="eaxmiid4"/>
									</UML:StructuralFeature.type>
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="array"/>
										<UML:TaggedValue tag="collection" value="false"/>
										<UML:TaggedValue tag="position" value="0"/>
										<UML:TaggedValue tag="lowerBound" value="1"/>
										<UML:TaggedValue tag="upperBound" value="1"/>
										<UML:TaggedValue tag="ea_guid" value="{FF497B2E-8C11-4ece-BDD4-295862401DF4}"/>
										<UML:TaggedValue tag="styleex" value="volatile=0;"/>
									</UML:ModelElement.taggedValue>
								</UML:Attribute>
								<UML:Attribute name="invalid" changeable="none" visibility="private" ownerScope="instance" targetScope="instance">
									<UML:Attribute.initialValue>
										<UML:Expression/>
									</UML:Attribute.initialValue>
									<UML:StructuralFeature.type>
										<UML:Classifier xmi.idref="eaxmiid4"/>
									</UML:StructuralFeature.type>
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="array"/>
										<UML:TaggedValue tag="collection" value="false"/>
										<UML:TaggedValue tag="position" value="1"/>
										<UML:TaggedValue tag="lowerBound" value="1"/>
										<UML:TaggedValue tag="upperBound" value="1"/>
										<UML:TaggedValue tag="ea_guid" value="{A643014C-6274-4138-8B07-43F2D54553DA}"/>
										<UML:TaggedValue tag="styleex" value="volatile=0;"/>
									</UML:ModelElement.taggedValue>
								</UML:Attribute>
								<UML:Operation name="validFiles" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="array"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="0"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{E8E9E784-5CF9-4008-88F8-36299224081F}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid4"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="array"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-5CF9-4008-88F8-36299224081F}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="invalidFiles" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="array"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="1"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{3C01B020-28A9-42d6-982E-ADFA6294E285}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid4"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="array"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-28A9-42d6-982E-ADFA6294E285}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
								<UML:Operation name="validate" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="bool"/>
										<UML:TaggedValue tag="const" value="false"/>
										<UML:TaggedValue tag="synchronised" value="0"/>
										<UML:TaggedValue tag="concurrency" value="Sequential"/>
										<UML:TaggedValue tag="position" value="2"/>
										<UML:TaggedValue tag="returnarray" value="0"/>
										<UML:TaggedValue tag="pure" value="0"/>
										<UML:TaggedValue tag="ea_guid" value="{AF5042CB-B920-4eb8-BBEA-0D756F8913CD}"/>
									</UML:ModelElement.taggedValue>
									<UML:BehavioralFeature.parameter>
										<UML:Parameter kind="return" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid3"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="bool"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{RETURNID-B920-4eb8-BBEA-0D756F8913CD}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
										<UML:Parameter name="entry" kind="in" visibility="public">
											<UML:Parameter.type>
												<UML:Classifier xmi.idref="eaxmiid2"/>
											</UML:Parameter.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="pos" value="0"/>
												<UML:TaggedValue tag="type" value="mixed"/>
												<UML:TaggedValue tag="const" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{C148F5C2-309D-40c7-B243-72A7087C4B90}"/>
											</UML:ModelElement.taggedValue>
											<UML:Parameter.defaultValue>
												<UML:Expression/>
											</UML:Parameter.defaultValue>
										</UML:Parameter>
									</UML:BehavioralFeature.parameter>
								</UML:Operation>
							</UML:Classifier.feature>
						</UML:Class>
						<UML:Dependency client="EAID_858CDF19_ACFF_47b4_AB72_045DB32961A8" supplier="EAID_F535D466_7D32_4dd6_BDA0_09D6AEC68094" xmi.id="EAID_BDF55442_9541_4160_87B9_3AD2B377A950" visibility="public">
							<UML:ModelElement.stereotype>
								<UML:Stereotype name="use"/>
							</UML:ModelElement.stereotype>
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="style" value="3"/>
								<UML:TaggedValue tag="ea_type" value="Dependency"/>
								<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
								<UML:TaggedValue tag="linemode" value="3"/>
								<UML:TaggedValue tag="linecolor" value="-1"/>
								<UML:TaggedValue tag="linewidth" value="0"/>
								<UML:TaggedValue tag="seqno" value="0"/>
								<UML:TaggedValue tag="stereotype" value="use"/>
								<UML:TaggedValue tag="headStyle" value="0"/>
								<UML:TaggedValue tag="lineStyle" value="0"/>
								<UML:TaggedValue tag="conditional" value="�use�"/>
								<UML:TaggedValue tag="src_visibility" value="Public"/>
								<UML:TaggedValue tag="src_aggregation" value="0"/>
								<UML:TaggedValue tag="src_isOrdered" value="false"/>
								<UML:TaggedValue tag="src_isNavigable" value="false"/>
								<UML:TaggedValue tag="src_containment" value="Unspecified"/>
								<UML:TaggedValue tag="dst_visibility" value="Public"/>
								<UML:TaggedValue tag="dst_aggregation" value="0"/>
								<UML:TaggedValue tag="dst_isOrdered" value="false"/>
								<UML:TaggedValue tag="dst_isNavigable" value="true"/>
								<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
								<UML:TaggedValue tag="virtualInheritance" value="0"/>
								<UML:TaggedValue tag="mb" value="�use�"/>
							</UML:ModelElement.taggedValue>
						</UML:Dependency>
						<UML:Comment xmi.id="EAID_95D79B4F_ABA4_4260_BA4F_276019A4E6DC" visibility="public" namespace="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="documentation" value="Iteration data from ezcFileMd5Iterator can be passed to ezcFileMd5Validator, e.g.

$md5 = new ezcFileMd5Iterator( &quot;files.md5&quot; );
$v = new ezcFileMd5Validator();
foreach ( $md5 as $i )
{
    $v-&gt;validate( $i );
}"/>
								<UML:TaggedValue tag="isSpecification" value="false"/>
								<UML:TaggedValue tag="ea_stype" value="Note"/>
								<UML:TaggedValue tag="ea_ntype" value="1"/>
								<UML:TaggedValue tag="version" value="1.0"/>
								<UML:TaggedValue tag="package" value="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2"/>
								<UML:TaggedValue tag="date_created" value="2005-07-28 12:07:55"/>
								<UML:TaggedValue tag="date_modified" value="2005-08-22 11:31:19"/>
								<UML:TaggedValue tag="gentype" value="&lt;none&gt;"/>
								<UML:TaggedValue tag="tagged" value="0"/>
								<UML:TaggedValue tag="package_name" value="File"/>
								<UML:TaggedValue tag="phase" value="1.0"/>
								<UML:TaggedValue tag="author" value="Jan Borsodi"/>
								<UML:TaggedValue tag="complexity" value="1"/>
								<UML:TaggedValue tag="status" value="Proposed"/>
								<UML:TaggedValue tag="relatedlinks" value="idref1=EAID_6E4D6487_BF6A_4379_9015_AD24927A6A88;"/>
								<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
							</UML:ModelElement.taggedValue>
						</UML:Comment>
						<UML:Comment xmi.id="EAID_D534CC51_01DC_433c_BB7A_609C554C6419" visibility="public" namespace="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="isSpecification" value="false"/>
								<UML:TaggedValue tag="ea_stype" value="Text"/>
								<UML:TaggedValue tag="ea_ntype" value="18"/>
								<UML:TaggedValue tag="version" value="1.0"/>
								<UML:TaggedValue tag="package" value="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2"/>
								<UML:TaggedValue tag="date_created" value="2005-08-22 11:32:42"/>
								<UML:TaggedValue tag="date_modified" value="2005-08-22 11:32:42"/>
								<UML:TaggedValue tag="gentype" value="&lt;none&gt;"/>
								<UML:TaggedValue tag="tagged" value="0"/>
								<UML:TaggedValue tag="package_name" value="File"/>
								<UML:TaggedValue tag="phase" value="1.0"/>
								<UML:TaggedValue tag="author" value="Jan Borsodi"/>
								<UML:TaggedValue tag="complexity" value="1"/>
								<UML:TaggedValue tag="status" value="Proposed"/>
								<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
							</UML:ModelElement.taggedValue>
						</UML:Comment>
						<UML:Class name="ezcFileMd5Entry" xmi.id="EAID_F535D466_7D32_4dd6_BDA0_09D6AEC68094" visibility="public" namespace="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
							<UML:ModelElement.stereotype>
								<UML:Stereotype name="virtual"/>
							</UML:ModelElement.stereotype>
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="isSpecification" value="false"/>
								<UML:TaggedValue tag="ea_stype" value="Class"/>
								<UML:TaggedValue tag="ea_ntype" value="0"/>
								<UML:TaggedValue tag="version" value="1.0"/>
								<UML:TaggedValue tag="package" value="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2"/>
								<UML:TaggedValue tag="date_created" value="2005-07-28 12:48:51"/>
								<UML:TaggedValue tag="date_modified" value="2005-08-22 11:30:53"/>
								<UML:TaggedValue tag="gentype" value="PHP"/>
								<UML:TaggedValue tag="tagged" value="0"/>
								<UML:TaggedValue tag="package_name" value="File"/>
								<UML:TaggedValue tag="phase" value="1.0"/>
								<UML:TaggedValue tag="author" value="Jan Borsodi"/>
								<UML:TaggedValue tag="complexity" value="1"/>
								<UML:TaggedValue tag="status" value="Proposed"/>
								<UML:TaggedValue tag="stereotype" value="virtual"/>
								<UML:TaggedValue tag="eventflags" value="LNK=b874;"/>
								<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
							</UML:ModelElement.taggedValue>
							<UML:Classifier.feature>
								<UML:Attribute name="md5" changeable="none" visibility="public" ownerScope="instance" targetScope="instance">
									<UML:Attribute.initialValue>
										<UML:Expression/>
									</UML:Attribute.initialValue>
									<UML:StructuralFeature.type>
										<UML:Classifier xmi.idref="eaxmiid0"/>
									</UML:StructuralFeature.type>
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="string"/>
										<UML:TaggedValue tag="collection" value="false"/>
										<UML:TaggedValue tag="position" value="0"/>
										<UML:TaggedValue tag="lowerBound" value="1"/>
										<UML:TaggedValue tag="upperBound" value="1"/>
										<UML:TaggedValue tag="ea_guid" value="{A32CA290-65BB-44a0-8D5C-92EA68EED0FF}"/>
										<UML:TaggedValue tag="styleex" value="volatile=0;"/>
									</UML:ModelElement.taggedValue>
								</UML:Attribute>
								<UML:Attribute name="path" changeable="none" visibility="public" ownerScope="instance" targetScope="instance">
									<UML:Attribute.initialValue>
										<UML:Expression/>
									</UML:Attribute.initialValue>
									<UML:StructuralFeature.type>
										<UML:Classifier xmi.idref="eaxmiid0"/>
									</UML:StructuralFeature.type>
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="type" value="string"/>
										<UML:TaggedValue tag="collection" value="false"/>
										<UML:TaggedValue tag="position" value="1"/>
										<UML:TaggedValue tag="lowerBound" value="1"/>
										<UML:TaggedValue tag="upperBound" value="1"/>
										<UML:TaggedValue tag="ea_guid" value="{09380ABF-1CC1-4293-87E4-16C9B18F66F0}"/>
										<UML:TaggedValue tag="styleex" value="volatile=0;"/>
									</UML:ModelElement.taggedValue>
								</UML:Attribute>
							</UML:Classifier.feature>
						</UML:Class>
						<UML:Dependency client="EAID_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2" supplier="EAID_2768CF21_33A5_4fe2_ACC4_5DEE87D31CAB" xmi.id="EAID_747D2D3E_7561_4da7_A8D3_CD4F23328392" visibility="public">
							<UML:ModelElement.stereotype>
								<UML:Stereotype name="use"/>
							</UML:ModelElement.stereotype>
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="style" value="3"/>
								<UML:TaggedValue tag="ea_type" value="Dependency"/>
								<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
								<UML:TaggedValue tag="linemode" value="3"/>
								<UML:TaggedValue tag="linecolor" value="-1"/>
								<UML:TaggedValue tag="linewidth" value="0"/>
								<UML:TaggedValue tag="seqno" value="0"/>
								<UML:TaggedValue tag="stereotype" value="use"/>
								<UML:TaggedValue tag="headStyle" value="0"/>
								<UML:TaggedValue tag="lineStyle" value="0"/>
								<UML:TaggedValue tag="conditional" value="�use�"/>
								<UML:TaggedValue tag="src_visibility" value="Public"/>
								<UML:TaggedValue tag="src_aggregation" value="0"/>
								<UML:TaggedValue tag="src_isOrdered" value="false"/>
								<UML:TaggedValue tag="src_isNavigable" value="false"/>
								<UML:TaggedValue tag="src_containment" value="Unspecified"/>
								<UML:TaggedValue tag="dst_visibility" value="Public"/>
								<UML:TaggedValue tag="dst_aggregation" value="0"/>
								<UML:TaggedValue tag="dst_isOrdered" value="false"/>
								<UML:TaggedValue tag="dst_isNavigable" value="true"/>
								<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
								<UML:TaggedValue tag="virtualInheritance" value="0"/>
								<UML:TaggedValue tag="mb" value="�use�"/>
							</UML:ModelElement.taggedValue>
						</UML:Dependency>
						<UML:Dependency client="EAID_00FF7C35_EE3D_4c0d_B416_535E24BCCA8B" supplier="EAID_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2" xmi.id="EAID_5AAD9A0B_2381_4754_BBDC_3592B5144DA4" visibility="public">
							<UML:ModelElement.stereotype>
								<UML:Stereotype name="realize"/>
							</UML:ModelElement.stereotype>
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="style" value="2"/>
								<UML:TaggedValue tag="ea_type" value="Realisation"/>
								<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
								<UML:TaggedValue tag="linemode" value="2"/>
								<UML:TaggedValue tag="linecolor" value="-1"/>
								<UML:TaggedValue tag="linewidth" value="0"/>
								<UML:TaggedValue tag="seqno" value="0"/>
								<UML:TaggedValue tag="stereotype" value="realize"/>
								<UML:TaggedValue tag="headStyle" value="0"/>
								<UML:TaggedValue tag="lineStyle" value="0"/>
								<UML:TaggedValue tag="conditional" value="�realize�"/>
								<UML:TaggedValue tag="src_visibility" value="Public"/>
								<UML:TaggedValue tag="src_aggregation" value="0"/>
								<UML:TaggedValue tag="src_isOrdered" value="false"/>
								<UML:TaggedValue tag="src_isNavigable" value="false"/>
								<UML:TaggedValue tag="src_containment" value="Unspecified"/>
								<UML:TaggedValue tag="dst_visibility" value="Public"/>
								<UML:TaggedValue tag="dst_aggregation" value="0"/>
								<UML:TaggedValue tag="dst_isOrdered" value="false"/>
								<UML:TaggedValue tag="dst_isNavigable" value="true"/>
								<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
								<UML:TaggedValue tag="virtualInheritance" value="0"/>
								<UML:TaggedValue tag="mb" value="�realize�"/>
							</UML:ModelElement.taggedValue>
						</UML:Dependency>
					</UML:Namespace.ownedElement>
				</UML:Package>
				<UML:Stereotype xmi.id="EAID_34BCDD26_7984_4434_9B53_A14D5C28529D" name="ezcomponent" isRoot="false" isLeaf="false" isAbstract="false">
					<UML:Stereotype.baseClass>Package</UML:Stereotype.baseClass>
				</UML:Stereotype>
				<UML:DataType xmi.id="eaxmiid0" name="string" visibility="private" isRoot="false" isLeaf="false" isAbstract="false"/>
				<UML:DataType xmi.id="eaxmiid4" name="array" visibility="private" isRoot="false" isLeaf="false" isAbstract="false"/>
				<UML:DataType xmi.id="eaxmiid2" name="mixed" visibility="private" isRoot="false" isLeaf="false" isAbstract="false"/>
				<UML:DataType xmi.id="eaxmiid1" name="void" visibility="private" isRoot="false" isLeaf="false" isAbstract="false"/>
				<UML:DataType xmi.id="eaxmiid5" name="int" visibility="private" isRoot="false" isLeaf="false" isAbstract="false"/>
				<UML:DataType xmi.id="eaxmiid3" name="bool" visibility="private" isRoot="false" isLeaf="false" isAbstract="false"/>
			</UML:Namespace.ownedElement>
		</UML:Model>
		<UML:Diagram name="MD5" xmi.id="EAID_DB7D23D8_1696_485d_808B_54E687067181" diagramType="ClassDiagram" owner="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2" toolName="Enterprise Architect 2.5">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="version" value="0.1"/>
				<UML:TaggedValue tag="author" value="Jan Borsodi"/>
				<UML:TaggedValue tag="created_date" value="2005-07-27 10:32:28"/>
				<UML:TaggedValue tag="modified_date" value="2005-08-22 11:34:01"/>
				<UML:TaggedValue tag="package" value="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2"/>
				<UML:TaggedValue tag="type" value="Logical"/>
				<UML:TaggedValue tag="swimlanes" value="locked=false;orientation=0;width=0;inbar=false;names=false;color=0;bold=false;fcol=0;;cls=0;"/>
				<UML:TaggedValue tag="EAStyle" value="ShowPrivate=1;ShowProtected=1;ShowPublic=1;HideRelationships=0;Locked=0;Border=1;HighlightForeign=1;PackageContents=1;SequenceNotes=0;ScalePrintImage=0;PPgs.cx=0;PPgs.cy=0;DocSize.cx=1118;DocSize.cy=783;ShowDetails=0;Orientation=L;Zoom=100;ShowTags=0;OpParams=3;ShowIcons=1;CollabNums=0;HideProps=0;ShowReqs=0;ShowCons=0;PaperSize=9;HideParents=0;UseAlias=0;HideAtts=0;HideOps=0;HideStereo=0;HideElemStereo=0;ShowTests=0;ShowMaint=0;"/>
				<UML:TaggedValue tag="styleex" value="ExcludeRTF=0;DocAll=0;HideQuals=0;AttPkg=1;ShowTests=0;ShowMaint=0;Layout=l=20:c=20:d=0:cr=1:la=2:i=1:it=4:a=0:;SuppressFOC=0;TDurLow=0;TDurHigh=100;TDurUnit=;TDurHide=0;"/>
			</UML:ModelElement.taggedValue>
			<UML:Diagram.element>
				<UML:DiagramElement geometry="Left=10;Top=10;Right=175;Bottom=85;" subject="EAID_820EC35C_401E_4832_87D6_9DFE4D44071E" seqno="1" style="DUID=5CF9789B;"/>
				<UML:DiagramElement geometry="Left=220;Top=580;Right=320;Bottom=660;" subject="EAID_F535D466_7D32_4dd6_BDA0_09D6AEC68094" seqno="2" style="DUID=015B1A7D;LBL=;"/>
				<UML:DiagramElement geometry="Left=380;Top=40;Right=650;Bottom=181;" subject="EAID_95D79B4F_ABA4_4260_BA4F_276019A4E6DC" seqno="3" style="DUID=4CF5FDE1;LBL=;"/>
				<UML:DiagramElement geometry="Left=350;Top=320;Right=469;Bottom=434;" subject="EAID_858CDF19_ACFF_47b4_AB72_045DB32961A8" seqno="4" style="DUID=34574259;LBL=;"/>
				<UML:DiagramElement geometry="Left=70;Top=330;Right=206;Bottom=483;" subject="EAID_1133FA2C_588A_44a5_BFB5_03EA47ED31C2" seqno="5" style="DUID=7525438A;LBL=;"/>
				<UML:DiagramElement geometry="Left=207;Top=36;Right=354;Bottom=164;" subject="EAID_BB5C70C8_8A08_490b_BE8C_DF270C26A18D" seqno="6" style="DUID=3FB60862;LBL=;"/>
				<UML:DiagramElement geometry="EDGE=1;$LLB=;LLT=;LMT=;LMB=CX=54:CY=15:OX=0:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:DIR=0:ROT=0;LRT=;LRB=;Path=;" subject="EAID_72E0503A_BF12_49cb_8AF5_22BD87F067E8" style="Mode=3;EOID=3FB60862;SOID=7525438A;Hidden=0;"/>
				<UML:DiagramElement geometry="EDGE=3;$LLB=;LLT=;LMT=;LMB=CX=38:CY=15:OX=0:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:DIR=0:ROT=0;LRT=;LRB=;Path=;" subject="EAID_BDF55442_9541_4160_87B9_3AD2B377A950" style="Mode=3;EOID=015B1A7D;SOID=34574259;Hidden=0;"/>
				<UML:DiagramElement geometry="SX=-1;SY=0;EX=-1;EY=0;EDGE=3;$LLB=;LLT=;LMT=;LMB=CX=44:CY=15:OX=0:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:DIR=0:ROT=0;LRT=;LRB=;Path=;" subject="EAID_0F483FD0_55FB_407c_899B_ED9C7589FFE7" style="Mode=3;EOID=015B1A7D;SOID=7525438A;Hidden=0;"/>
				<UML:DiagramElement geometry="EDGE=2;SX=0;SY=0;EX=0;EY=0;$LLB=;LLT=;LMT=;LMB=;LRT=;LRB=;Path=;" subject="EAID_6E4D6487_BF6A_4379_9015_AD24927A6A88" style="Mode=2;EOID=34574259;SOID=7525438A;Hidden=0;"/>
			</UML:Diagram.element>
		</UML:Diagram>
		<UML:Diagram name="File operations" xmi.id="EAID_E08BE808_E66E_4e96_AC26_FFCAE8FA59E8" diagramType="ClassDiagram" owner="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2" toolName="Enterprise Architect 2.5">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="version" value="0.1"/>
				<UML:TaggedValue tag="author" value="Jan Borsodi"/>
				<UML:TaggedValue tag="created_date" value="2005-08-22 11:32:07"/>
				<UML:TaggedValue tag="modified_date" value="2005-08-22 11:34:29"/>
				<UML:TaggedValue tag="package" value="EAPK_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2"/>
				<UML:TaggedValue tag="type" value="Logical"/>
				<UML:TaggedValue tag="swimlanes" value="locked=false;orientation=0;width=0;inbar=false;names=false;color=0;bold=false;fcol=0;;cls=0;"/>
				<UML:TaggedValue tag="EAStyle" value="ShowPrivate=1;ShowProtected=1;ShowPublic=1;HideRelationships=0;Locked=0;Border=1;HighlightForeign=1;PackageContents=1;SequenceNotes=0;ScalePrintImage=0;PPgs.cx=0;PPgs.cy=0;DocSize.cx=780;DocSize.cy=1118;ShowDetails=0;Orientation=P;Zoom=100;ShowTags=0;OpParams=3;ShowIcons=1;CollabNums=0;HideProps=0;ShowReqs=0;ShowCons=0;PaperSize=9;HideParents=0;UseAlias=0;HideAtts=0;HideOps=0;HideStereo=0;HideElemStereo=0;ShowTests=0;ShowMaint=0;"/>
				<UML:TaggedValue tag="styleex" value="ExcludeRTF=0;DocAll=0;HideQuals=0;AttPkg=1;ShowTests=0;ShowMaint=0;SuppressFOC=0;TDurLow=0;TDurHigh=100;TDurUnit=;TDurHide=0;"/>
			</UML:ModelElement.taggedValue>
			<UML:Diagram.element>
				<UML:DiagramElement geometry="Left=10;Top=10;Right=175;Bottom=85;" subject="EAID_D534CC51_01DC_433c_BB7A_609C554C6419" seqno="1" style="DUID=5826E60B;"/>
				<UML:DiagramElement geometry="Left=10;Top=100;Right=262;Bottom=293;" subject="EAID_4025D0AB_4288_427c_8074_0E9562FC5624" seqno="2" style="DUID=78B0D9A0;LBL=;"/>
			</UML:Diagram.element>
		</UML:Diagram>
		<UML:DiagramElement geometry="Left=400;Top=375;Right=639;Bottom=568;" subject="EAID_4025D0AB_4288_427c_8074_0E9562FC5624" seqno="1" style="DUID=6B079BEF;LBL=;">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="diagram_guid" value="EAID_9E84983E_2C66_40ec_92D7_FD1C1A445FCB"/>
			</UML:ModelElement.taggedValue>
		</UML:DiagramElement>
		<UML:DiagramElement geometry="EDGE=3;$LLB=;LLT=;LMT=;LMB=CX=57:CY=15:OX=0:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:DIR=0:ROT=0;LRT=;LRB=;" subject="EAID_28D28C8A_D061_4a20_9930_DB80390A7252" style="Mode=3;EOID=6B079BEF;SOID=6B079BEF;">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="diagram_guid" value="EAID_9E84983E_2C66_40ec_92D7_FD1C1A445FCB"/>
				<UML:TaggedValue tag="hidden" value="0"/>
			</UML:ModelElement.taggedValue>
		</UML:DiagramElement>
		<UML:DiagramElement geometry="EDGE=2;$LLB=;LLT=;LMT=;LMB=CX=57:CY=15:OX=0:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:DIR=0:ROT=0;LRT=;LRB=;" subject="EAID_84988281_F05E_4f97_AE55_D975BC3F71C1" style="Mode=3;EOID=6B079BEF;SOID=0C8E8C93;">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="diagram_guid" value="EAID_9E84983E_2C66_40ec_92D7_FD1C1A445FCB"/>
				<UML:TaggedValue tag="hidden" value="0"/>
			</UML:ModelElement.taggedValue>
		</UML:DiagramElement>
		<UML:DiagramElement geometry="EDGE=3;$LLB=;LLT=;LMT=;LMB=CX=57:CY=15:OX=0:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:DIR=0:ROT=0;LRT=;LRB=;" subject="EAID_BB7D590D_2393_4efc_8CBF_F0ECF7ED91B8" style="Mode=3;EOID=6B079BEF;SOID=7C13781F;">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="diagram_guid" value="EAID_9E84983E_2C66_40ec_92D7_FD1C1A445FCB"/>
				<UML:TaggedValue tag="hidden" value="0"/>
			</UML:ModelElement.taggedValue>
		</UML:DiagramElement>
		<UML:DiagramElement geometry="EDGE=2;$LLB=;LLT=;LMT=;LMB=CX=37:CY=15:OX=0:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:DIR=0:ROT=0;LRT=;LRB=;" subject="EAID_747D2D3E_7561_4da7_A8D3_CD4F23328392" style="Mode=3;EOID=1BB100C7;SOID=E2D528B0;">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="diagram_guid" value="EAID_DE985DEA_46A9_4772_8368_DBF30973E73E"/>
				<UML:TaggedValue tag="hidden" value="0"/>
			</UML:ModelElement.taggedValue>
		</UML:DiagramElement>
		<UML:DiagramElement geometry="SX=-3;SY=-13;EX=-3;EY=-13;EDGE=2;$LLB=;LLT=;LMT=;LMB=CX=53:CY=15:OX=0:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:DIR=0:ROT=0;LRT=;LRB=;" subject="EAID_5AAD9A0B_2381_4754_BBDC_3592B5144DA4" style="Mode=2;EOID=E2D528B0;SOID=4E9A7B22;">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="diagram_guid" value="EAID_DE985DEA_46A9_4772_8368_DBF30973E73E"/>
				<UML:TaggedValue tag="hidden" value="0"/>
			</UML:ModelElement.taggedValue>
		</UML:DiagramElement>
	</XMI.content>
	<XMI.difference/>
	<XMI.extensions xmi.extender="Enterprise Architect 2.5">
		<EAStub xmi.id="EAID_BB5C70C8_8A08_490b_BE8C_DF270C26A18D" name="Iterator" UMLType="Class"/>
		<EAStub xmi.id="EAID_3FBB1944_522E_40bb_A1D0_ECBA00B3A77A" name="eZFileHandler" UMLType="Class"/>
		<EAStub xmi.id="EAID_E0B46D9C_CC4A_47d8_BFA3_F64DE7803DCE" name="eZFile" UMLType="Class"/>
		<EAStub xmi.id="EAID_100C40C4_3F4F_4ebb_BBF5_F5B6A271706D" name="eZDir" UMLType="Class"/>
		<EAStub xmi.id="EAID_5E1407A7_38E8_4cdb_9FEB_D300E919B9D2" name="File" UMLType="Package"/>
		<EAStub xmi.id="EAID_2768CF21_33A5_4fe2_ACC4_5DEE87D31CAB" name="Filesystem" UMLType="Package"/>
		<EAStub xmi.id="EAID_00FF7C35_EE3D_4c0d_B416_535E24BCCA8B" name="File Handling" UMLType="Package"/>
	</XMI.extensions>
</XMI>
PK�a�\_x��!�!4pear/data/ConsoleTools/design/console_parameters.pngnu�[����PNG


IHDR��� IDATx��ݱ�Ն��:םA�`G�v��T�!L$�/&�I��8��`�O�.�4,�@����ԩ��%X�6�@����q������hl*^����^��]�mA]V�.+P���z�^�ƓU�(k,�Ē�6�Շ�{=��N��rgh_69����?�3H���.%�V��K��rH�Qi���A]�Xl�*�fJL%��8���mL�u��?(�"���*�|؃������#9�]��[�Rv�h�ڏu���E���a���tV�ի��:��+����np�R�>�o��%W�z)UZ�K�r�3�J���1�%�B,]�c��C
|��AZ{�����Hk{�Wע �'������
�z�]���/�+H�9��?���@]V�.+P���
�`��uX���@]V�.+P���
�`��uX�X]���S�<!����k�a�zf���h?v-��Ϗ���[�°"
���\��ϿI��v?��r*��nz�A�!b�R��z�ۇ�쎞�4��bz��{�z���#�o���b����ծ&L��9�Ʈx�U4��v��ڕs�o�d�8E-�Rz����%�颙�k�e�����ix�R��[�X�+��O���/^o\�ȃ,Jz�z&��d�u�79�{Ж���`�x�C�0v���`��uXa���Ed�`ԍcg�Ս��
��e�(E���~׹�<����;i��":S�cf�w���ڃ�� �iU/+�
�T2��+�1����n���a��
>����\���_�q��
��h@[��a�s�TwE��^&~{�~f�Jly*��m����5�9=��cWpnvk��K|e��e�_�<|�G�va�/���kpB��
��`��uX���h��J�kϛ?7���4^��4��Გ����"�sEs����K�nT]Az��0�+�<bz��������<>�rċ�31W8�+���^����)_�`sL�5�T�Y{/ �.^p����@]V�.+P������2�j�<0�r�����1�!5YqH�qZ���a�>��j��_�z�������W>^V5�%�>EU�ә�F�|�����ޫ�ѽ�������r�_٫�x՜�N(ݞ{����?�yo��v��
���荢ʖ�^1��iH'u9����f�߸�"��{ҪDT]�1��Cu��Pj�#v�n?���Q�.Kf��v�����`oj�+5���t}�P���=�({�E��X�Ҫޫ��:u���9�xA]V�.+P������.�*��w��̾���gU����.^��ɞ�wEoϪB
G���Kzi�X;�.���VZ\�Us�x����wio����oCz�x�y�s��yq�6du�����5�(�9�\���x�;�.�T�xg�����"<\���
�	�]��.+P���
�`��uX���@]V�.+P���
�`��uX���@]V�.+P����fo}�^�B�C��Z������F�ۧ�5ٙX1�{����燿}�[i^�.+P��&���g��0f�\w�\ح<�_�F]0o�>p[��.����������3{*H��Y�Z�'��N��|5���4��┩\͚�0@%�oǜ#o��Is�S ��`F'����`�Y���)�`���h&N�R��@]0zG���\��'fLi.6�wX��`&�C]V�.+P���
�`���w����rJ<?4���
12z߫L���҄nfl�#�ՙ���ʽĺ2S5�1F]�YV��Î��̷���2��(! ��[�<gx�䨊�O����g�.s�GʆacWppEØh���?Ŀ�8}֩�A=��1z��N�8xjWб&9�G��]v%HÃ6jH�hf�?�V�X�����8}�������bC�!.?ȍėqD��,��fcu�'�̽1J�,ՀrjP�P*-+'W��<�Gz�9�1gQ��+��(?��WO�O<R~�.�5�xcθ��l���h�����%��F�H^|9��MLy}||�^��W�7��ߘ��_؃������o��v~.}���n2�c��7X��0vX���@]V�.+P�-�&��[h�*9@����!���
�`��uX1�ӓ�����@~��n�˔�.�?��O�����TĚ��ގٍ��p[u��H��;�*&�,1N������j�u+�(5Wb�7���ܷlļ3�v��V��,z�3�@���������'�‌Z�������{2�����iĹ�ٍl����w㺥r��Q� 9�GZ
�RWj�ԁ�3�#1���\�+5�d��M/b�뺇0ݪ�#_��4�sn��Z��)��zU�Xc���R�}�x�0�AN�d�҈�%'lQ��5RE{��I�zГ1�X��wB�;3lE|"gj}�_]h	F1�.��A]V�.+�����+����ڕۺ9�~��[b�FM_��f��{2Cvbޙ�.ޚ�fdnj��ENm��{���|㯘1g@n��=a�j.��]�5�)�Y3 W�x�V+��zviw�;[��s�����)��_��6�h{Y��"�RU?Ae�V��H���\�0��Յ�`�j���uX1�uWg�e^�� �h��/(�|�W����|�����+vz��q���b2�6�"��q�6t[ߤN=���w �u���͟��{+������M�.�����1�2{%�6߁?�ZL�����j~�n]����f��ts&����.�{y��A�K
B�]�o~}������\�0��Յ�`���X�`��b���.^�,���w�v��<��gTܱ�.�n�ʇ	�wf���+ƹ�H�㣽]=�.�HM�hq)}|�Hk!p��Xo�߫����L������B��6u	
�\o%q)}|���x���/�bu�%ż��VuX���x��D;�)�ꚪOUxs��>��xRև�_fFn^�n����V��X�]��-��~��� v[�4�.積��Ɍ�U�g����^i��.^E����X`Ej��K�\3���z酭	.r�LQ_UX��\��tA�p�:/�-͈mr����#0�.ާ����\�b��K];���@]V�.+P���
�`��uX����Q����x/lF���
�`��uX���x���~��&ˍ��2[�Su��n"�ꚶ�x����~]��,��������k"�t]�*nq_��q~8S���*E8|�)�	�T5պ���$��%�Ģ��T���G� ���ㆴ<��o����8��?~wǗ/������E;?_�z��~�Ҽ�.�E����v�7���l��^v����o�q|�����"�Ʈx40*"'��sҽ�'Z��&9�{s%Wi�x�U!?q��n2��O.93<ɗ�m��;;Y����$'ZJ��B�ɯ�Ѯ?k���"��X\�p94�W2~��|o���)�ŰJM��s���+EP��G�������TA�G�	s��wr�����:���iT[��u��hf�s"ۍⓟE�Cm�BBYHZ�0v$�=�����@]V�.+P���
�`��uX���@]V�.+P��(V4S�{���bnϗ�q8�~03�u
������芀͞M�R^�����%<�`��9w]0a�wB=
f�O���
�5&����অ�joP�0|m	��u��eýA]�I��39���e�b(��5��A]V�.+P�H����`��u��5ýA]V�.+P�HX3��`��u��5ýA]V�.+P�HX3��`��u��5ýA]V�.+P�HX3��`��u��5ýA]V�.+P�HX3��`��u��5ýA]V�.+P�HX3��`��u��5ýA]V�.+P�HX3��`��uX���@]&�Y��z2��
�՞s��/����?�Rwh	�j����.�������������z��]�F_`rD���A]
p�h~w����JA`K��f'�`�FW`�!�
_�C�ӌ�I�,��O&-I��_�������
�`�	k{���@]V����T�7��
�`�	k�{���@]V����f�7��
�`�	k�{���@]V����f�7��
�`�	k�{���@]V����f�7��
�`�	k�{���@]V����f�7��
�`�	k�{���@]V����f�7��
�`�	k�{���x��̩��a)-U��8��?~oR��>}]��XQ;vt��燿}��ؚ\��`��uX���@]V�.+P���
�&��3ڴux�}����=�eze�!���ݮsU.�����Q(�a���z���9ãP��K��rN��7aOuţ��=��C.�d��8�<�+��b�1Plc\�~�UC�T�!=��RQe���P�3���F��X�mե�'⮢럢��L��Μ�E%2R����ċ��xcθ��J]5�/ګ'�焙��ۼ>>>^�׽��_�?	�����o��v~��������d+P���
�`��uX�������� o���X�l���
�`��uX����|��W�~���>���R��O���S��Y����̂L���L{u���w]�@`�.ecił-�B�����R��pL;3t#��g�T�����_?}>���~2�/8�q��c��o��3}j����Bŀ�Jw��������^1��"-���#F�/.�x+M\�.����-�W5Bjuā��������̙�K�O/��A�8�2P�sK�%��X�P��!�IaCu�%��I�wl��uX1�����wB��h@�
x��W�a�INe0nƤ3�\�}��ic���#�����'\��,����/�ҡ���d���T:t�֮<��맼p:8t�奋|/L.^X	\���������L¤��6uX�������{H��b^��-��C�,���S\�b���D������<-��M]�������<���hM/ZO�����=}�祐�A.��n<�.�ˌ
�>��A�Ig�͹���}�~�{��̥d<��� oiqЇ��x�f�9�k��ܬ��yӠ�xa%p�/L†�BK0	OY����uX���D�P*e�����R����:��	{��4��nF#���f�[}oQ�3JَD�P`$�O��NB�Tm���z1{�թ��5���Wבx�H�0R�2�	����#��oa��l�!	��F��#��ĩ�Δ2�ޮ��!W���G��xƕ�+'�2.ʼnkj���=3
L�3C��'�9�y�/~:p�� �W�3��K/�Gj}e�̉�<�<!��E��A��d����&uX����V]⽲̔��ӷ3۪+�m�T}	N��_3����)�H�,�O��������W��"������ś���R�����#\�5�F��|��ڹx�k���fY�����Ż3�9}q�����xu�c��w8��M��uX���@]V�.+P���
�`E�W�
G6@�Zuջx�Y�l���
�`��uX���x���~��&��O?߈�^]�uķ�~~����~ݬ]ЁeƮ`��[΍��#1F������L���+�0�(Z�W#貮_6�|F;?_�4b� �R+�]	A(?W\�T.ؘ��{|s2#;aܨI��3R=�ef�'�����RC=�k�Va-ڿq͢3c�����#j,�8���QZ��^�ve��x'G�ƃQ�.�rN�c�t�%<���Z��.QI���V5uX���XL]�*H��H`�jN�� %�5}�)v#��Y��[��p�ص��n�X�]��O��]�zw�����>A����q��s���S���	���]9�]9b7�8sps��t��<���u�\S�xc�dj)���{�D�S\��]��ˢu#�z�Һ̞:bEqba��l�M�s�x3��^%�X��<��ܤ���'��}nw7"�>gȯ�C�l��c>3�x�K��2��.i8v]���/�W9�C|�RV� ��%�B�_6?U�q�v�pf�a�*C��xF�v�y���Z]�:�F���k^y�����XK]�y5uX���XL]�}i��\r�E��
oT�-zdi��V�[� ���t;�<���������2ޫ� ��r� u�4���<8J�]2=�rs6r��lL�?�6�-o
��ƿc�H.�S\�n˥�4��։���
9�3MCb.���-MZ�rf�AR���A.���/��H�
���xғ���g�>�����&@��\�>-�޿�d����oЇ�ɡ�z�G�����xvT�=���2�8[ӛ�٢���Y��
��	%N�Ұ���+�!�ZN���u̷�4�;�:2���b-u-��X�`��bCu�zƷ5��{/`e.�d1o5�W�|_�E{���x�wE���*tw�hHU���4�-q��hb}���97��8��>o��h��$ҟ)\�1E6V]K�WŐzH]�siBM��MY�*���A��s9��lb�T��3��7��9�b�ɱ�f�/�P帜Z�׭IM�Oꌟ���Rj/�O���	��q�2~eM�5�Q�w�]RǮ�Tv�2�}���Al�rŘ*+��n=�;�汱�w�&?z�P]9O��w�����[:��[���.x�]p[:�&uX���n�xŔ��^n�uY��\�?�n(��j�
g���j���
��%�d
ݺ8kW�����(��ȭ��v-p��	�ݸ��n]�n0��3�RL]��<-@��]�n
�ک��{�{����XP��X���َ�vf�wB�������P]����j%}��m���Q0v�ql���`��\x�^�[飭�RN�����f&�	��\sw��ź�"���]����B�j�V=Ū�-���?G���W�W;��T[,1n��i9v�9L�d�-���	��rD�|w�+�p�_�B_�.�0U���]b�E��
�+|�]�JU��xS�v+��|/��hP�z.ހyl������E5��2��+FȿB�t�fF��k�j�R�[92ڎ�w~pB]<�9Ʌ�<5N�ň}����#�Ea삕`����	�%�����f�b�EX��.�>T.�Ͷ�K0ޫ!����|U�t3WLD́�sl��h�S��7�u{y{�Y�ůG����R��J���q5Re�X��+*ǷP)v�|�~�P�|�Ɍ���iX|���$��E����>ڇ3��75DģG��x����'���ui��G:�P���w���1��N��YR���7?v�����('@gP�k��w��e�Ŷ� e�evV��d=�{ƛw��ja�/�L���1��]��1��㺴ަ��.�_8fp��}+���s�~|�,���Ud��Wl�1X~Ȥ.^ef%WҗNҚ�w�|r3����l�,{�G������]�����J��뮢]zze��n�zb�} �P�w�'
+0�-����;;�&�qfh��� �.8�U�P+���XC]�/��_;�������LK)�wl��L�^�J��ٍ?�s�qMR�F̻�h9v��Q�4ɝ��-~?D"��8��K8�$�ĥ�)+��,�8Hk�s�ξ2��u�2�ܕ)f�1J����P�����w7f%o<���C�$�1|���j��e�Lj�=k9�ƫ�h�J6��G�e
��b-u���X�`��b
u�v�x��>soњ�3[�g�g�����V��xv�)Ʈ����ל�"�l"&�`W��K\%�2����AAJ��
��W�*�-b��n�*�O�u��8H*l�z.^Qf����6�"���z.�&鏦�|��>��\��|Lq�`Hf'YIDAT�cԥ[W�R���>�P��8f�R��'T�}���j%i�%��.�|��8&���%���5�����HE$�\L� �8o�2��였!�)����GK�ޭSw~/��D[cPD9�@*��/�hN}�M�ra���#��[�5H�*0�u�^�,��cD�f>�S�c:�x��!��
u��\Y��0�����N��.�y�T�N�2:�x+�����Yk쪽�z��IU��J]n���{��l��.�]A]VT�j@�)V�vuX���@]V�.+P���
�`��uX���@]V�.+P�����0�BfQ��eIEND�B`�PK�a�\���?�T�T,pear/data/ConsoleTools/design/design-1.3.txtnu�[���eZ component: ConsoleTools, Design, 1.3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:Author: Tobias Schlitt
:Revision: $Rev$
:Date: $Date$
:Status: Draft

.. contents::

=====
Scope
=====

The scope of this document is to describe the enhancements of the ConsoleTools
component for version 1.3 of the component. The following features are part of
this design document:

- Basic dialog system to interact with a user through STDIN.
- Enhanced handling of arguments (including help output).

This document describes a new range of classes, which will be added to
ConsoleTools, to fulfill this needs.

=============
Dialog system
=============

Design overview
===============

The following section gives a brief introduction of the concept of a simple
dialog system that enables the developer of a console based application to
interact with the user through STDIN.

Clarification of terms
----------------------

User
^^^^

The "user" is the person using a program and interacting with it during
runtime. The user has no knowledge about the internals and must be guided
through the dialog system he is interacting with. The term "user" in case of
this document is _not_ the developer using the described component, but the
user who interacts with the final program.

Developer
^^^^^^^^^

In contrast to the "user", the term "developer" in this document refers to the
person who creates a program, using the described component.

Dialog
^^^^^^

The basic idea of a new mechanism to interact with the user through STDIN in
this document is called a "dialog".  A dialog is presented to the user by a
certain amount of output it generates and a certain amount of input it
requests afterwards.

Basic design
------------

The core of the new feature described in this document is a dialog. The dialog
is an object, must have the following capabilities:

- Presents itself to the user on the command line
- Requests data  from the user through STDIN.
- Validate the result for its purpose.
- Return the result to the developer.

A dialog is usually used in a loop, which displays the dialog over and over again
until it received a valid result.

Class design
============

The following classes will realize the idea of dialogs in ConsoleTools.

ezcConsoleDialog
----------------

This interface describes the external API, which is commonly used by developers
and other classes to interact with a dialog object. Each dialog class must
implement this interface.

__construct( ezcConsoleOutput $output, ezcConsoleDialogOptions $options )
  The constructor of a dialog receives an instance of ezcConsoleOutput, which
  it must use for presenting its output, when requested. In addition, it can
  receive an option object, which must be an instance or subclass instance of
  ezcConsoleDialogOptions.
hasValidResult()
  This method must return a boolean value, which indicates, if the dialog
  already received a result from the user, which is valid in its context.
getResult()
  After the hasValidResult() method returned true, this method will return the
  value received from the dialog.
display()
  Using this method, the developer can instruct the dialog object to display
  itself to the user. The dialog must use the instance of eczConsoleOutput it
  received in the constructor for displaying.
reset()
  This method resets the dialog internally to the state it had directly after
  construction, so that it can be reused by the developer.

In addition to this interface, an implementation of ezcConsoleDialog can
contain a set of static factory methods, which return a dialog in a
pre-configured state (for example a standard yes/no question, where only the
text needs to be set).

ezcConsoleDialogOptions
-----------------------

This is the base option class, which must be accepted by a dialog. It contains
options, which must be valid for each dialog class. A dialog class may request,
that the options it receives are instances of a subclass, if it expects
additional options. Each of the options defined in ezcConsoleDialogOptions must
also be available in this subclass. Every option defined must have a sensible
default value, so that there is no need for the developer to change it.

The base option class provides the following options:

format
  The name of the format this dialog uses to be displayed. The format
  identifier must be defined in the ezcConsoleOutput instance submitted to the
  constructor of the dialog.
validator
  An instance of ezcConsoleDialogValidator. This validator is responsible for
  validation and manipulation of the result a dialog received from the user. An
  implementation of ezcConsoleDialog may require a specific sub-class of
  ezcConsoleDialogValidator here (e.g. for a menu dialog, which requires a
  special validator object to work).

ezcConsoleDialogViewer
----------------------

The ezcConsoleDialogViewer class provides a set of static convenience methods
that can be used by a developer that works with dialogs and by a developer that
creates new dialogs. These methods are:

displayDialog( ezcConsoleDialog $dialog ) [static]
  This method is recommended to be used for displaying dialogs. It performs the
  typical loop: Display the dialog over and over again until it received a
  valid result. When this state is reached, it returns the dialogs value.
readLine( $trim = true ) [static]
  The readLine() method is commonly used in a dialog implementation to read a
  line from standard in. It returns the input provided by a user, optionally
  trimmed of leading and trailing white spaces.

ezcConsoleDialogValidator
-------------------------

The ezcConsoleValidator interface provides signatures for methods that can be used
by a dialog to validate the result it retrieved. The validator is configured by
the user and submitted to the dialog via an option (if a dialog supports this
mechanism).

__construct( ... )
  The signature of the constructor is left to the validator implementation to
  retrieve settings (e.g. the valid results).
validate( mixed $result )
  This method is responsible for validating a given result.  The dialog will
  submit the result it received to this method which will indicate if the
  result was valid by a boolean value. To manipulate / fix a retrieved result,
  the dialog implementation can call the fixup() method.
fixup( mixed $result )
  A validator can try to fix a given result to be valid. This manipulation can
  be omitted by simply returning the result again. An example for a fixup would
  be to convert a date information into a Unix timestamp using strtotime(). The
  validate method would then expect an integer value > 0. The dialog
  implementation is responsible for calling fixup() as it thinks is appropriate
  (e.g. always before calling validate(), only if validate() fails, never).

Dialog implementations
======================

The new feature set comes with a collection of basic dialog implementations,
which will be described in this section.

ezcConsoleQuestionDialog
------------------------

The ezcConsoleQuestionDialog is the most basic imaginable dialog. It asks the
user a simply question and expects a certain answer. A typical output from an
ezcConsoleQuestionDialog object could look like this: ::

    Do you want to continue? (y/n) 

This dialog implementation provides a set of rudimentary options, which can be
used to customize its appearance and enhance its capabilities. For this
purpose, it comes with a custom options class ezcConsoleQuestionDialogOptions,
that accepts the following options in addition to those provided by
ezcConsoleDialogOptions:

text
  This option defines the main "question" text, displayed to the user.
validator
  The validator is an instance of ezcConsoleQuestionDialogValidator. For
  implementation details, see further below.
showResults
  If this boolean option is set to true, the dialog will display the possible
  result values behind the question text itself (retrieved from the validator).
  If a default value is provided, it will also indicate, which one this is. For
  example: ::
    
    Do you want to continue? (y/n) [y]

  While here "y" and "n" are valid results and "y" is the default result, which
  is selected when simply skipping this question by hitting just <RETURN>.

ezcConsoleQuestionDialogValidator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The interface if ezcConsoleQuestionValidator inherits from
ezcConsoleDialogValidator and adds the following methods:

getResultString()
  This method returns the result string to be displayed if the option
  "showResults" is true in the ezcConsoleQuestionDialogOptions object.

Concrete implementations of these interface are:

ezcConsoleQuestionDialogTypeValidator
  This validator checks the result to be of a given type (e.g. int, float). It
  optionally checks if the result is in a given range (e.g. [0-100]).
ezcConsoleQuestionDialogCollectionValidator
  This validator checks the result against a given collection of pre-defined
  values (e.g. "y" and "n"). Beside that, it can perform basic operations on
  the result before checking it (like strtolower()).
ezcConsoleQuestionDialogRegexValidator
  This validator checks the result against a given regex (e.g.
  "/([0-2]?[0-9])[:.]([0-6]?[0-9])/" for validation of a time value). In addition
  it can perform a manipulation using this regex with a given (e.g. "\1:\2" to
  unify the time value given).

ezcConsoleMenuDialog
--------------------

The second dialog implementation shipped with ConsoleTools is the menu dialog,
which is an enhanced version of the question dialog. The menu dialog will
display an ordered set of options and let the user select one of these. A
typical menu can look like this: ::

    You can choose one of the following actions.

    1)  Create something new
    2)  Edit something
    3)  Delete something
    4)  Do something else

    Please choose an action: 

The menu dialog also comes with its own set of options, the
ezcConsoleMenuDialogOptions:

text
  The text displayed before the menu.
selectionText
  The text displayed after the menu to indicate to the user that he should make
  a selection.
markerChar
  The marker character used to divide the marker of a menu entry (e.g. the
  number) from the menu value (the text of a menu entry).
validator
  The validator must be an instance of ezcConsoleMenuDialogValidator.

ezcConsoleMenuDialogValidator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In contrast to ezcConsoleQuestionDialogValidator, this is not an interface, but
a concrete implementation of ezcConsoleDialogValidator. The menu validator
offers 2 properties to determine the menu entries:

$entries
  An array of entries shown as the menu. The keys of this array represent the
  markers of the menu entries, the values represent the text shown.

In addition, the validator can be configured to perform a manipulation on the
result like the ezcConsoleQuestionDialogCollectionValidator (e.g.
strtolower()).

==============================
Enhanced handling of arguments
==============================

Design overview
===============

The current functionality for handling options and arguments for a console
based application in eZ Components (mainly the class ezcConsoleInput) has only
rudimentary support for dealing with arguments. The current possibility is to
either switch arguments on or off and does not allow to specify the following
things:

- How many arguments are possible
- Which arguments are mandatory/optional
- Names and types for the arguments.

The goal of this design section is to provide these 3 features for argument
handling.

Clarification of terms
----------------------

Parameter
^^^^^^^^^

The term parameter is a generic term, which covers options and arguments
together.

Option
^^^^^^

An option for a console based application is specified using a short or a long
name and can (optionally) carry a value of a given type. Short names are built
using "-<name>" syntax, long names use "--<name>". Options are already handled
by the ezcConsoleInput class, using objects of ezcConsoleOption.

Example: ::

    foo.php --save "bar.txt" -a

"--save" is a long name and the parameter carries a string value "bar.txt".
"-a" is a short name of an option, while this option does not carry any value.

Argument
^^^^^^^^

In contrast to an option, an argument is not specified using a specific name, but
by by the order of submission to the program. Arguments can only be given to a
program, after all options have been specified.

Example: ::

    foo.php --save "bar.txt" -a -- "baz" 23
    
"baz" is the value of the first argument, 23 the value of the second one.

Arguments separator
^^^^^^^^^^^^^^^^^^^

In some cases the semantic for specifying parameters on the console is not
deterministic. Since the algorithm used to parse parameters cannot handle
nondeterministic semantics, a separator must be used to determine the border
between options and arguments. The separator used is "-- ", which indicates
that anything following it is an argument and does not belong to the option
before it. The seperator is not mandatory and must only be used in cases where
the parsing would not be deterministic.

Example: ::

    foo.php --save "bar.txt" -a "baz" 23
    foo.php --save "bar.txt" -a -- "baz" 23

In the first line, it is not possible to determine if "baz" is the value for
the parameter "-a" or if it is an argument. The second line clarifies this.

Basic design
------------

The core of the new functionality is built upon 2 classes:

- ezcConsoleArguments
- ezcConsoleArgument

The first one is a collection class, which takes care of holding all arguments.
The second one is a struct class, which handles 1 specific argument.

Class design
============

ezcConsoleArgument
------------------

This struct class represents a single argument and defines the following
properties:

name
  A descriptive name for the argument. This name is used for 2 purposes:
  - Displaying it in the help text generated by ezcConsoleInput.
  - Identifying and retrieving the object from the argument collection.
  This property is mandatory and may not be left out.
type
  The data type of the argument. The type is used for validation purposes when
  the parameter string of the console application is parsed and is indicated to
  the user in the help text generated by ezcConsoleInput. The default for this
  property will be ezcConsoleInput::TYPE_STRING. ezcConsoleInput::TYPE_NONE
  will not be allowed.
shorthelp
  A short help text, which is used by ezcConsoleInput when generating a short
  help output. A sensible default will be set for this property.
longhelp
  A long help text, which is used by ezcConsoleInput when generating a long
  help output. A sensible default will be set for this property.
mandatory
  This boolean flag specifies if an argument is mandatory or optional. Since
  ezcConsoleArguments is an ordered collection, all arguments following an
  optional argument will be handled as optional, too. The default value for
  this property is true.
default
  This property carries the default value for optional arguments. If these are
  not submitted, the default value will be used as the value property. If no
  default value was explicitly defined, it is null and therefore the value
  property will be null, if the argument was not submitted.
multiple
  This booloan property determines, if an argument can carry multiple values.
  The default here is false. If this is set to true, no more arguments may
  follow the current argument, since multiple defines the number of values to
  be undefined. If arguments would follow, the parameter string would be
  non-deterministic. Therefore all following arguments are silently ignored.
  For arguments with this property true, the returned value is an array. The
  default value may be an array, too.
value
  This property is not meant to be set by the developer directly, but by
  ezcConsoleInput while parsing the parameter string of the application. It
  will contain the value submitted for the argument after parsing. If this
  argument was not submitted, the value of the default property will be set
  here.

ezcConsoleArguments
-------------------

This collection class carries the arguments for an application. It keeps track
of the order of the ezcConsoleArgument objects and offers 2 access methods for
them:

- By their order (using numeric identification)
- By their name

For these purpose, the ArrayAccess and Iterator interfaces provided by PHP will
be implemented in this class. ArrayAccess will be used for both variants of
access, while Iterator will iterate of the numeric order of the arguments.
Argument names must be unique. The registration of new arguments is only
allowed by number. The retrival is also allowed by name.

The class does not offer any additional methods to deal with arguments and
purely relies on the given interfaces.

Integration aspects
===================

The current design of ezcConsoleInput is not designed to handle arguments in
the planned way. Therefore its API must be changed slightly. Naturally this
will be done maintaining BC. The following changes are planned:

Property $argumentDefinition
----------------------------

Since ezcConsoleInput already has a property $arguments, which carries the
values of submitted arguments in an array, a new property will be introduced to
carry the instance of ezcConsoleArguments. By default, this property will be
null, which indicates, that the old manor of handling arguments is used.

If ezcConsoleArguments is used, the preferred way of retrieving argument values
is, to use the ezcConsoleArgument struct of the specific argument. The
$arguments property of ezcConsoleInput will still be set and contain the values
of the provided arguments.

Switching arguments on/off
--------------------------

The ezcConsoleOption class allows to switch arguments on or off for a console
call to the application using its property $arguments. This behaviour will not
be changed. If an option defines that arguments are not allowed, if it is
submitted, all defined arguments will not be allowed.

It is possible, that this behaviour will be enhanced in the future, so that
options can define a filter rule for arguments instead of a boolean on/off
switch. But this feature is not in scope of the design given here.

Usage example
=============

The following example shows the basic of the newly created API.

Using arguments
---------------

::

    $input = new ezcConsoleInput();
    $input->argumentDefinition = new ezcConsoleArguments();

    // First argument
    $input->argumentDefinition[] = new ezcConsoleArgument(
        "infile",
        ezcConsoleInput::TYPE_STRING,
        "The file to read from.",
        "The input file, from which the content to process is read.",
    );

    // Second argument
    $input->argumentDefinition[1] = new ezcConsoleArgument(
        "outfile"
    );
    $input->argumentDefinition[1]->shorthelp = "Output file.";
    $input->argumentDefinition[1]->longhelp  = "File to output generated
        content to. Output will be printed to STDOUT if left out.";
    $input->argumentDefinition[1]->mandatory = false;
    $input->argumentDefinition[1]->default   = "php://output;

    try
    {
        $input->process();
    }
    catch ( ezcConsoleMissingArgumentException $e )
    {
        // Only the first argument will possibly trigger this
        die( "Argument {$e->argument->name} missing!" );
    }

    // The first argument is always present if no exception occured
    $inFile  = fopen( $input->argumentDefinition["infile"]->value, "r" );
    // The second one is optional, but has a default
    $outFile = fopen( $input->argumentDefinition["infile"]->value, "w" );

Generating help
---------------
    
::
    
    $input = new ezcConsoleInput();
    $input->argumentDefinition = new ezcConsoleArguments();

    // First argument
    $input->argumentDefinition[] = new ezcConsoleArgument(
        "file",
        ezcConsoleInput::TYPE_STRING,
        "Output file.",
        "File to output generated
    );

    // Second argument
    $input->argumentDefinition[] = new ezcConsoleArgument(
        "bytes",
        ezcConsoleInput::TYPE_INT,
        "Bytes to write.",
        "The number of bytes written to the output file. If left out,
             everything will be written.",
        false,
        -1
    );

    echo $input->getHelpiText( "Some example program." );

Generates: ::

    Usage: test.php [--] <string:file> [<int:bytes>]
    Some example program

    Arguments:
    <string:file>       Output file.
    <int:bytes> = -1    Bytes to write.

Open issues
===========

- The access of arguments by number and name is comfortable, but (as described
  above) not reliable, if 2 parameters have the same name. It also makes
  implementation more complex (if a parameter is removed, namesake has to come
  in place. So, do we want this or not?
- The property name $argumentsDefinition is OK for the definition part, but
  does actually not make sense, if you access it later to retrieve the value.
  Any better naming solution?
- It is sometimes sensible to allow that for 1 argument multiple values are
  submitted (e.g. if you expect an undefined number of file names). To resolve
  this, we need to invent a property "multiple" for the ezcConsoleArgument
  struct. If multiple is defined for 1 argument, no more arguments must follow,
  since the algorithm could not determine easily where the multiple values for
  the argument end. Do we need this functionality (now)?


..
   Local Variables:
   mode: rst
   fill-column: 79
   End: 
   vim: et syn=rst tw=79
PK�a�\y��
�
(pear/data/ConsoleTools/design/design.txtnu�[���eZ publish Enterprise Component: ConsoleTools, Requirements
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Introduction
============

Purpose of the ConsoleTools package
-----------------------------------

The ConsoleTools package will contain several classes to support comfortable
development of console based applications. These classes shall be designed as
independant as possible from each other to let the user flexibly choose, which
ones he likes to use and which not.

Aimed features are:

- Comfortable handling of options and parameters (long, short, values,...)
- Formatting assistance for console output (placing, colors,...)
- Convenience functionality to deal with Windoze and Unix based systems

Current implementation
----------------------

Included classes
^^^^^^^^^^^^^^^^

2 classes are directly involved in the CLI handling.

eZScript
    General initiallization and shutdown script functionality. Very eZ 
    publish specific. Handles initialization of database connection for 
    example, but also some CLI related actions like shutting down every
    thing cleanly and returning an exit code.

eZCLI
    Handles general console output, formating and option parsing.

External classes
^^^^^^^^^^^^^^^^

Beside that, there are dependencies to log/debug/whatever and the following
ones.

eZTextCodec
    Base clase for drivers that convert text between different output formats.
    Currently has 1 extending class: eZCodePageCodec. Part of the I18N
    package.

General involved classes:
eZPublishSDK, eZDebug, eZINI, eZDebugSetting, eZExecution, 
eZExtension, eZDB, eZSession, eZUser, eZModule

General notes
-------------

The functionality for console handling seems to be widly spread over the
current eZ publish classes. Beside that, it is not quite feature complete and
mixed around with web handling classes.

Requirenments
=============

Design goals
------------

The command line handling classes should be redesigned completly, since it's
currently messed up with web related stuff and fully integrated with eZ
publish.

Following functionality will be included:

- General in and output handling functionality

- Output strings

  - Style output (color, underline?, ...)
  - Position change
  - Error/notice/warning support

- Handling of options

  - Long / short options
  - Dealing with help output
  - Optional and required stuff
  - Dependencies and exclusion of options
  
- Handling of advanced output

  - Progress bars (single, keep multiple in mind)
  - Tables

All parts should be as independant as possible. Some parts depend quite hardly
on the output itself, this is ok. Option parsing and handling should _not_
depend on the output class.

Design
======

The design for this package has been splitted into 3 categories of classes:

Output
    This type of classes provide low level output functionality for console
    based applications (like styling text, line breaking,...).
Generation
    This type of classes provide more advanced outputing features (like
    generating structures of text automatically, providing advances
    tools,...). This type of classes depends on the Output classes described
    above, since they output data.
Handling
    This type of classes is independant of both above shown categories and
    provides features for handling common functions in console based
    applications. Since they do not have to output directly, there is no need
    to depend on output functionality.

PK�a�\�>'�J
�J
/pear/data/ConsoleTools/design/class_diagram.pngnu�[����PNG


IHDR\��R)bKGD������� IDATx���{t��/��pPk
l�EAvU�UQ[�x*�HD+:��]�֭�V;��:�U�P@�B1(�8�3

iZ-D��(��JՊ `@���JƐp�(׵V���������ߝ�Ieeee�ִ�	46
.6��`#
.6��`#
.6��`#
.6��`#
.6Ҽ�	|^̞=;��~{���f����N
.��e˖eʔ)�N�ަL��lD����_�>k&M���C�:
hTt�؈
d��ٹ�����&�����@Y�lY�L�R�4j�2e��O�:\40Ahl&M���C�:
h�t�؈���(����[o�U��5�\>�/ر\P��ٳs���{��iӦMZ�l����+�o��B���4i�$M�4���⋹ꪫr�a�e�]wM���ӡC�q�1bD^{��g��u�]�޽{��]_�˥�o��Π1=;�Y4/t4˗/�����裏֚{������L߾}�_�*�۷/@��]k׮͕W^�1c�dÆ
5����̛7/����-�ܒ�.�,�F�J�-��\p�v[��jL�|�_���p@�����QG�G}4�:uʭ�ޚ^x!�W��G}��^z)?��Ү]�<��#�ׯ_֯__�?3֮]��O>9w�yg�5k�o��y�Dz|��[�.�nf̘��Ç���2��zk��odݺu�N�`*++���!(� Ir�9�dɒ%��W��^x!W^yez��֭[���(p@F����w�m��2k֬�3��if\~��5kV�v�g�}6��sON:�|�_H����w�w9���3a„<���ԩSf̘�����N`����@�.]�.� ]�tI˖-S\\��C�f�…u�7i�d�?+++ˠA��/|!EEE�ڵk��暬Z��F��O?�G}4_��2u����n�̻gϞ��曓$w�uW���^z)g�}v:w��t��9Ç��ŋ7{]I��>_���Һu�t��!���˼y��<o��Ź袋��~��e˖�m��r�a���o��_�9��ms��^|�Ō;6m۶͌3r衇nv��;,���oӢE��~��Y�dI��M=�M�o�xS1&LH�=ҢE�|�_��S^^�U{m�\>�m}.]�4�vXv�e�|�߬3�1c�d���O�-������K��[�.7�pC��k��{��0aB���]�6?��O�|%;vL��ͳ����FfΜYgnrl[>��5��[`��4iR���������~��r�)��j͵j�*>�`���[c|K_HoݺuV�^]}|�=�������׊=��C���Og�]vI�\x�;vlF���n�i���G��}���/����z����m
�5k��:g�]v�C=��?���;wn��铵k�֘/**�̙3s�QGU������?��?d�ʕu��>�d�ܹ����]r���]}���O~����*?��O�̹.]tQ~��_��k����-浩�ͽw6��������V\˖-��SN��^�3�m�Jçy�_�����O$I�ɓ'ט������u�c�=�_��:uj�='O����W�\�2}������:�oҤI�M�V}��t��峐���t���{�80+W���_�ŋg͚5y�gr�y祢�"C�ɛo�Y����Z?�F��������ׯ��j.���|��ǹ袋�ꫯ���"O=�T��o�<��s��[��gϞ�$��7��U�вe�s�15�-�z뭜q�Y�fMN=�Ԕ��磏>JyyyN=��|��9�����[oչ�瞛���={v>���̜93]�vMEEE�����F��_��+W�����ŋSQQ�իW��'�L�=��k���o�n�}Ҷ<������ߪ�[�����Q��6V�~���/�_{�9��#3w�ܬ]�6/��B��뗏>�(Æ
�_���K}}��x��,X� +V�ȿ�˿Ԛ��/~�	&����o��SN9%���9��3��c�e���Y�re�-[��N:)Ir���X��o����t�A�={vV�^��k�f�ܹ9ꨣRYYY��fK����`�)��~��_f����ks�m�e���K�V�r�G殻�ʥ�^�+V����fי;wn����$����2�zn̘1�裏2x���k��g��h�"�{l~��_%I�����K�.M�t��}���;�ȪU�r�q�e�ԩ9蠃RTT��:(S�N�q������=zt���+_�ԩSs��G�M�6��W����+I���F���$�ư�~��E�iݺu������$�o~���'m��[�xq��G������$��\��>�<0O<�D�8∴l�2=z�ȯ��w�qY�bEƌ��riҤ�>��>�#F�gϞi߾}:w�\k~���>|xv�u����EK�^~���s�I۶m��^{��?�y�d��5֘8qb���{���G�֭[�e˖9�#r�&I�ϟ�����`�)��~���&I�����9�y�%I�O���5V�X�3�<3�ׯ�I'����G5�:"\|�ŵ�-))Ieee^}���5k�$Iڶm[�+�iƌI����:M����M���~���G��K.���ؗ���$�|Pc|���J����7'N���U�t�A����o���r��my~U���[\��ڷo�$Y�re��4F��֭[���=������>�~���]��c��qܭ[����1��&���^{�TVV�W�^������$��y���,[O���p��$Iqqq�����J�?]�r���^�~��_��Wi֬Y���_~9�tHؒ����|��$6V5^����o�Zc��K�dÆ
5Ư���$�3�<�aÆ�K�.�ҥK�9�L�:5�5�Oږ�צM�$����~�OWS_�*:8��Ó$/���˥��r�?��i�sU�¦t�ر�q��ͫ_טkѢ�f�J�%K����ȑ#s�'V���umN}?��Sp��mܭ��q��o����Ҵk�.���oҡC�Z1�V�J��_ԯ*v�ϗ�ׯ__㸪�`S]ڵk�$����oժ�V�=|��L�:�F��������wߝ�N;-=z�Ȓ%K�[n��-ϯ�BU��֚?~�d�����y����^�xUQN�{�1��Ϲ�0fS6WD�q�������ڵk�v�~�����3cƌ��/��5���l=;XU׆������?�u�/��K/�4M�4�}�ݗ=zlv���r����$y��Ƿ*���s:v�aÆU�U}�}Ŋu�Sխ�*�O�[�V��?d�ҥ?~|�=���†W^y%�]vY��-��NH�������L��$����:��ꄰv��z�M�g���n���r�����&M�g��%K���ȑ#3nܸ��7�ɟ���mZ�>�`�)����I��w���yk׮�g��իW��oL�~�6۵k�$Iyy�V�}�g$I��_���K��׿�|�&M���s޼yu����ֈ�^�t�s�9'�ƍˢE����'IfΜ� �m��;��ҬY��3f�����?���ǧiӦ9��sk�5m����_�zu��^y啭Ϋ.����;wn����a��W�ރ����0I2f̘��⋹馛r��_�~5:�lذ��ko�g�z
.v��O>9�߾x�~��Z󥥥iҤI���[c�������3`���1b�{w�qI�q��՚+//O�&M��>�T�}��_�	'����z+�����U^���z�iڴi�����N:)I����֗�7lؐ[o�5ɦ�5��>��&M��^�5׻w�Zc�3�my~��_����f�ڵ9��SVV��=�͛��}����"��w��T�СCu��Ə��u�
d6�e����5����[nI��v�i;,��ڑ�m���/'I�:�Zs��v[��5k�Ԙ����g�z
.v��/�8��k�̙��O>9����ڵk��O��/�Yg���͛gԨQ��L�6-���/�/})��{o��u��w���-[f„	���k��og���y�'��Y>��9cǎ���G}4={��/~�,Y�$�ׯϚ5kR^^����')))�;3#F��v��|'�ڵ˓O>�d�…����…3`��̜93mڴ�w���O}�<��$ɠA�2cƌ|��Y�~}���3dȐ$�S��sۖ�����o��޽{�s������w������;�d���>|x�>����ӧO��sL��.��ٳ�v�ڼ��+��+r�wn2��
S�N���SQQQ+�G����K/���"����)���ٳg���ku�h�\�kG��U�.]����������^x!����B���w߭qަ�W}?��kRYYYY�$>&M���C���a7>��Gy$��W��y��w�S}\RR�?��[��{�?>�w^��u�Qy�'ҪU�����0`@/^��=�5k�뮻.7�xc���~8�
�G}Tk�e˖�<yr���_c��xdS�}]�|�#�<2/��b��t��9s����{�� ���U��������q�����<7��=��w��[n�%-[��5_VV�c�=6k׮�57v��\p�u�}�q�e�̙5ƪb�����4^xa��׿ֈ�s�=3}����wX.����ֹ���ll�ȑ�<yr/^�x�F7�Mݯm�,$��};+.
�o߾y���s��f���J�-�뮻�N����k}Y��W^���{nf͚�����m��RTT�<0?����O�*�H��={f��;vlN>���E�iժU�u�/�0�=�\��I��o~3��3lذ�y��)..η���<��s��辭ڷo�g�y&������#�[�N��ͳ�~���+��s�=W���3��>�*EEE��O��^z)�\sMJJJҾ}�4k�,��[�8∌1"�/��~��:�-���̙3'���K�RTT�#�8"�����?�yO�0!'�|rv�e�4o�<����Z1�
�̙3SRR��͛g�}�����,X��V�EC�-v�{p[�����{r�!��e˖i߾}�?������{n�馌92I2f̘�m�~m�g�::\l'�b<�e����=~_���p�Qp�i^��«��,t
��Qp�i^�>�N?��B�PÔ)S
�4z
.H�.]2hРB�P��M�e
.�1��c�9��i�@�@�4iR�Z�46�����)@��������:�&M���z��i@�����
4��)԰n�:�M�@c���@�/_������I��_=%%%�۷o�3k<-Z�(�.--�W\�+��"���;0+v��N`gU^^�$9蠃j��ٳ`95&W^yef͚����F��s�=�ѣG��Oeee�nݺ�C��y�pt�(�M\T��f͚��^�fMF������8�:uʀ2bĈ�Y�fg	@CRp����T��{�I��cǦ��$�'ON��q�))))d�l„	�|��q��cg�yf�/_�	&03���N��x��s�wfΜ9Y�jU��g�|���N߾}kĭ\�2cǎ�O<�w�}7��{�����.H۶m�㪊D&O���n�-���O˖-s�����.K�֭�$6l�رc3}���iѢE�v�SO=5������'_���U�;vl���t��-cƌ��Iu�o�7��ʕ+3y��~���c�=�c��s�ꂙ��:+�ڵ�߃�QRp�U}���s�����;>�`���3|��t��-�&Mj�<�{|}��y�w��^~��\�������o~3I�jժ��?�c�,YR��[oeҤI�7o^Ə�6m��X��/̊+�$k׮̓>�
6��K��=���G��[�.,Ȃ��f�С[���n�ʕ+k>l����?�իW�w�޵�z��y��e���9����S�B'�3*//O���ٳ��v�=��w�I�=2u��<��S�ַ��$?~|uܽ�ޛ%K��s��?~|�y晌7.�:u��/���ᄏ��{�w�N��9s���s�M�<����S�NM��q�y�g��SO�k�I����Ijv�(++�չb�}�͜9sr�M7m�����s��I�t�޽ֺUcU1|�)�(����:���6{��$����t��%mڴ�u�]������׿���*�����/})-Z���k��6I��O�Z�ꫯN�.]Ҳe��n|�A�|UG��'���4��_3p���eڴi[���a�RTT�`�]�E�%�[A���g�1|�)�؁JJJRRRR]X���8%%%y�ǒ$?���c���'I8��ƽ��I��>����Zc�O�ڵk����'I6l�P=v�e��e˖�;wn~�ӟf��?~|֮]��W8���^w]�{�$I�v�j�U�U��٧�`'ԤI�Ou�'(6֢E���s�'��G��_��>8k׮͝wޙ�}��ܪ�7�ݢ����uEEE��Os�U�6mZ��ګ�>�}��Pp����e�رI��={���,w�qG��W�^)++��iH_���$/���f�:u�$y���k�Wo��۷O�~�2nܸ�{�9�����nۦ��
>���걺�mk��.;vL��X���\�XU�}
.v����$+���xG8�裓$��zk�z뭬]�6?��SRR�o}�[�q}��I��5*������3����G?J�{���SOMIIIx�^�:���u떤��˖-��:tH�<��CY�fM�,Y��o�y�����8�$�ҥKk�[5V�g_�B'��i�sNf̘�����SN�1w���W�>����Odٲe9��sk�u�ҥ���8��3jԨ�|�͵�"z��U��C�y�2`������}���ԩS�,?��ϒ$�{�����]��G}tf͚����y&������I��l��^x���бc�L�0!'�xbڵk�-Z�{���[ҷo��v��e„	9��ӳ�{�Y�f�c�=r�g���N�����r����LQQQ���ҵk�><7�xcu�UW]�Ν;�Y�f����욗_~y�]w�5EEE�ݻwF����]��'�tRڴi���~�ֺO?�tڶm�N8���ƩIeeee���<�4iR�������Ͼ1c�dܸqy衇ҹs�$�o�������/�y�W�a�}[��l���>;{�g&N�X=6q��gذa���y��n%%%
�nYYY���3hݺun��\z�9묳�$ӦM��ߞV�Z8;�'P�vX.����z�I�K.�$�z�*pVlo
.)�(�!C�dȐ!�N�Դ�	46
.6��~d� IDAT`#����ݔ)S
�@
~/��)�h`��~z�S�I�@2dH�R�4�m����̞=;��~{��ؤ���B��V�B'�y�lٲL�2��i�2e���`t�h`��<��L�4)C�-tШ�p�i^��|Y�hQ8�:�JKK3w��$ɑG��O?}G�[M��͕W^�Y�f������s�=�ѣG��Oeee�nݺ�C)@��yM���fͪs|͚59rd����t��)Ȉ#�f͚�%l���+))IIII��hP&L����s�gT��y�Y�|y&L�P���n
.vR��N����|�k_�QG�aÆe���u��^�:w�qG��뗣�:*��7s�w����:��|r��+Wf���9��ó�{T���)))��ɓ�r���Z�;�?�0�w^y�|�Y�n]^z�\{�b+**r�E�{����gݺuy��73~��\v�eٰa�f�z��dzz����ݻ�\�޽�z��L�>}�]l
.vB'N�믿�N�:e���y�g2v��(��w�}Y�paz��I�&��g�Miii9�̛7/ӦMK����U�SVVV}<gΜ$I���k�]5V�E�B'��)))٪�O0loO>�d���˗��$I�^�2bĈ��?�S��3f$IF��N�:%I��w��p�
�߿y�����{-Z�(I���{ך�g�}j�@c��`'�t��$ɡ�Zc�W�^�b�-[�$�ׯ_�k���˛���K��k׮�\�XU4
.v��;WTu�hȎ�RYYY�I�&[��تU�6;_�fӦMk�U�յ/�����^{�W^y%�ӟ��/�z�O�S�����,]�4?�p����Wǎ��[oeŊ�رc��+VT�@cR�χ�w�	'$I~����<�ׯς���V�q��$�����K/��?λロ����)))�E]T[թbٲe�cp@�d�ҥ�֮����B����СC��c���^����7;|��̜93���ϰa�j̵j�*�_~y�q���{�e��)..��?���>:�f�Jyyyz��U����$ɱ��}.�.
���,eee;t�֭[g�ر�ׯ_v�m�4o�<ݺu�M7ݔ$)**��m۶mƏ�!C����8͚5K���ӧO��}��5�S\u�U�ܹs�5k����$�I'��6m��駟����O?��m�Vw���B��������믯1��o&Iv�}���۷�W\�+��b�k�x�9��k���.2dHƍ�7�x#�;wN����y���s��M�6��r`���`'�|%%%%y��dÆ
y��Ws�7&I=�����g��=��3'N��8qb���3lذ�l:\4R%%%
�nYYY���x 7�|sn����:t�\�]�lݺun��\z�9묳�$ӦM��ߞV�Zm׽`{Pp����ӥK�<��y��WSQQ�/~�9ꨣr�y�e�=���{v�a���s뭷&I.�����k��ۃ��F������nڴi��!C�4�u)Ğ�-�:��F��F\l�y���kҤI�S�I�@9�cRZZZ�4�mд�	46:\4�ٳgg�С�N`�*++�4Z
.�/4�ͤI���4-t�����4/t�x%%%I����g�7�-�P�\iii�Ν�$9��#s������I)�������̚5����{.�G���ߟ���<8ݺu�!�R�Lؙ4-t�xeee���ŬY��_�fMF������8�:uʀ2bĈ�Y�fg	��F�@���������i4:&L����s�gT��y�Y�|y&L�P���4/t�xUU].6lؐ�c�f���y��7ӢE�t��5��zj���_}���%��ի3nܸ̘1#��_�����_�z�;���c�V�\�ɓ'����{�Q��{���$�'O�Yg��v��5�
`�����=:��{o��u�`��,X� ~�a�Z�����\t�EY�pau�o����ǧ��<�G�NӦM7���?�իW�w�޵�z��y��e���9��>��@]6��W�4�N��$��;��3�䩧��5�\�$�����w�}�e�…�ٳg&M��g�}6���9�C2o޼L�6-�tبz]u<gΜ$I���k�Z5V
A�����d��?Y���ڴi�U�Ve�ĉY�dI��铁f��7cƌ$ɨQ�ҩS�$ɾ��n�!����#�<����o2�E�%I��{�Zs��O�h:\��.�,-[��ܹs�ӟ�4����v��m�[�lY��_�~)))���*�x��7��{w$i׮]�����h:\�`w���l�#;Zl��ȎG��3g�7��M��?��;��}�ݗK.�$��vZ��*++7�ߪU�6;ߤI�$IӦ���`�XU4$Iڷo�~���_�~Y�pa��?�3��sOn���B���+..�ҥK�������޹t��1o��VV�X��;֘[�bEu4��
��Ω������<�Y�zu���t��-IҢE�z�w�qI�뮻./��R>����������\t�EձU�*�-[V=v�$I�.]Z+ת��h:\���>;�F���7ߜ�o���\�^��7|��̜93���ϰa�jĵj�*�_~y�q���{�e��)..��?���>:�f�Jyyy�u����<Ir��~�����������RVVV��믿>x`���RTT��]�f������׶mی?>C�Iqqq�5k���ۧO�>���kt��ꪫҹs�4k�,I��N:)mڴ��O?]+ק�~:m۶�	'�Ѐw���;��
<���~��m�ܭ�k߾}���\q���;��s�'��e�]2dȐ�7.o��F:w�$y�7�����/L�6m��l+.h��>���瞙8qb��ĉS\\�aÆ03v:\4R%%%
�n]�-�֭[�nȥ�^���:+I2mڴ�~��iժU����N���a���/�8��zk��K.I�^�
�;��g�EC2dH�R�4��4-t�����(��H�B'�yw��:��L�R���Sp�@�t�A�:
�Z�n�-Sp�@�9�s�1�N�
.ȤI�2t��B��I����N-
�����)�0iҤ<��C�N5
lРA�N��u��)��-hZ�.�n-Z�8�ι���̝;7Ir�G���Oߑ�@�(�`����+3k֬���՚{��2z����������ӭ[�r�!���i���a֬Yu��Y�&#G���S\\�N�:e��1bD֬Y���������JJJRRRR�4̄	�|��q��cg�yf�/_�	&03ش�N�oÆ
;vl�O��7�|3-Z�H׮]sꩧ���5bW�^�q��eƌ��_���w�=_���s�y票�(Ij�T�.++�ʕ+3y��~���c�=�c��sϔ��d���9묳Ү]�p���\�F��{キ�xݺuY�`A,X�?�0C�M�TTT䢋.�…�c�|�͌?>���=zt�6m��}��^�:�{��5׻w�̛7/ӧO�i����>�M���[S�NM��q�y�g��SO�k�I�����q��w_.\��={fҤIy��gSZZ�C9$���˴iӒ���E������9s�$I�w�^+����hLt��JJJ�j��E�[�6m�jժL�81K�,I�>}2p�8�F܌3�$�F�J�N��$��on�����?�<�H����}-Z�$�{�k���>5b�1Qp���{���<����A�@E��k�6������H�AM*�U��b�A��xCj�b`�`�bʉ��\D:��p�6�Z�P%Da�Y��a�{��g�Yk�������X��̳_8]u�U������K�f�ҥ�����\~�婪�J�֭�}�V�J�:t���X�b��Y�~}��C�M�j
=М�8��?���d��y���������?�y����+�2eJfΜ�+��2_��W�$�����g�ƍ�\/++K��hѢ�ZC������;f�С:th^{���3cƌL�4�8pQQQ��+W�'�HEE�?�s��Y�vm6lؐΝ;7Z۰aC����!�!���K�Pȣ�>����|�3�����$iժU���3�L��?>���z�nݚw�y'��{o
�BƎ[�m8�bժU�Z�޽�$+W�l�����͉.C�G��ĉs�w�;�h�֯_���K/�4?����ꫯfԨQ��Z�n�����xݩS��_�>ÇOEEE�x≜v�iy��|��F�&���˓$�
��o>6'\�XMMMjjj�3��[o�5���#�8"GqD�;�\z����]�k߾}�M�����TTT���<;v�g���z����]w]�w����lٲ%Ir�9�m۶Y�pa�.L���3x���`9��05t��:t�};v�5�\�k��f�}C�ɐ!C�ڵk����L�:5�W�N��ݓ$�W���/��1cƤm۶{�&`?q����ѣӵk�̚5�X�5kV***2jԨ&��s�@3U(�˾555�eߝiӦM&L����ۿ�%�\�$�?~�ᄡn��f�����)���q����;�L�\y��ׯ_�S���h��I�[UUU���J>�����؎���,u�C�ܹsK�?�`�\�g#F�(u`��O���RUUU��^0p��,Z�(��w_�c�Ԝ9sJ���p�Z�jU�Ν[�M̝;��'�
'\�g>Ahn���3r��R��f�	�1p�������7�H�޽w�6gΜ,]�4Iҿ��1�@F��b�����k��s�=����&k/��R&O��Gy$������s��ǧo߾%H
]�R���s��iӦ�r�-��RQQ�nݺe���曳iӦ�����+
)
����M�>=�֭�E]T�]|��Y�n]�O�^�d�{-K�]��o�)S�d���ٸqcz�왯}�k�җ�Ԩ���6���,��N>��O欳��W\������;jjjݿ}��z��ٙ4iR^}��y�9��s�UW�M�6�E�����̞=;��zj�t�R��ڵk
�BfϞ�K.�$:t�W�&ا\4c�ׯ��ѣ��ok+V�ȭ�ޚ�[���s�M�lܸ1_�����o�֮]����,[�,ӦMK۶m�*Ø1c�aÆ$��͛���8۶m���wzϓO>����TVV6Y���̲e���SO�+_��^e���E��s3f���o��N8!������?���??I2mڴb��?�7�|3ݻwϴi���/d�ԩ�֭[V�X��zh�3{챙7o^/^��/�<I���&i|JFMMM�z���I�>}�4ٯ���͑���P(4��U}ѢEI�믿>=z�H۶m3~����������6@�?>'�tRZ�j��}�s�馛�$?���:�
7ܐ=z��#��ȑ#�$��.�y�7��~Xc{={�l�͑��f쭷�J����{�}�W�N�|�s�kT?���7�;���;&I�m۶�{֯_�$�СC���ZC4G-K�pSSS���4���IRVV�����������[�l�i_�V��8OC_�M?���q��ON�h�>��O'IV�X�˾nݺ%I^~��F��늊�b�a���+�v����ܹs�dÆ
M�j
=��h�N;�$ɝwޙ�k�f����w��B����?��w�g$I&N��W_}5~�a^}���~��I�A�{;u�$y�DziӦ��曹�;�:c�ǪU���޽{'IV�\٤����͑��f��.K�Ν�ꫯ��_�r�9s�$I��/���7z�����#�W���_�������/�[o��=z���//�6g�s�=4hPF��O|�{��a�c���9��s�������˛�7�p�%VSS�����u��9ӧOϐ!CҡC��j�*}���w��|�K_*�u��!ӧOψ#ҥK�����K�.�����C�cǎ�ޫ��:\pA�:�q�����-�ܲ����t��=���ٲeK��s�I۶m�p��&�.L���3x��~&�oe�����p(����ȑ#��k��7>�`�N���{,ݻwO��^�:Æ
˘1c�o|��	�����.�/F���]�f֬Y�ڬY�RQQ�Q�F�0잁��6m�d„	�?~֬Y�5k�d����0aBZ�n]�x�K-K�C�)���q����;�L�\y��ׯ_�S���`����JUUU�c�iQ�͍�����N�R8ԕ���:��\�'̜9sJ�-J��q��~�hѢ�9��1v�������2p����f�����6�Ѣ���iY�~�x����{�ks���ҥK�$���ψ#d4Hb����k��s�=����&k/��R&O��Gy$������s��ǧo߾%H
��E�pxy��vXߴiSn��\p����H�n�2|���|��ٴi�N	���@�
�
�R�(��ӧgݺu�袋���/�8�֭����K��Ñ��f�m���o���N���s�Ee���zv6��}����e�:묌;v��$�����ߟ�C�f��9��s3eʔlٲe��Z�bEƍ���_�bn����	;ʒ$����={vN=��t�ҥ�ӵk�
�̞=;���{�-�=ֲ�ع���g���y���+V��[o�֭[s���վ�&MJmmm��շlْ�c���^+��Y�&ӦM����3y��h���ƌ�
6$I6ZI�# IDAToޜ���ٶm[Ə��<O>�d���RYY�d���2˖-�SO=��|�+{�~`O9���1cF�~��p�	�7o^������I�iӦ��z���ŋs�m��>s�̼��k9��S]]�_|1s��I߾}�lٲ̟?����{l�͛�ŋ���/O�<��I����b_MMM�z���I�>}�4ٯ����.�B���555Y�hQ���O�=�$�Ǐ��iŨQ�r�G���O'I&N��nݺ%��PƄ	2lذ,X� Æ
k��
7�P�:r��L�6-��.���I~?����={6����@3��[o%Iz��O�mb�]}ժUI��C��ŊMj�w\�uǎ�$۶m�e����'I:t��d������������u���ד���l�����/޳e˖����t�����w���76��jժ����o�kѢE���ڞ~/��0pЌ}�ӟ���dŊ9�v�WVV�������{i߾}��>��***�r��<��������L�Ν�v��lذ!�;wn��aÆb(M?�f��NK��y�Y�vm6oޜ�~��)
9���}�:uJ�<��cٴiS�|���q���g�yf�d���y��׳u�ּ��;���{S(2v��=޳ᤊU�Vk�{�N��\��IC��'\4c�]vY�~�����h�/��/���8�̛7/��sO��$Iee��~���^�����y��W3jԨFk�[���W_��{v��)�ׯ����SQQ�'�x"��vZ�{�,_�<���kԿ|��$ɠA�����r�@���Ԥ��f�k�;w����3dȐt��!�Z�J�>}��|'_�җ�}W_}u.��u�Q9�#RYY�[n��cgk߾}�M�����TTT���<;v�g���zh�N����ҽ{����g˖-I�s�9'm۶�…��/\�0�۷��?�����������!���9rd~
��5���f�ԩy��ҽ{�$��ի3lذ�3&��7J�~^��9��fa����ڵkf͚U�͚5+5jT	�p82p@�ЦM�L�0!���Ϛ5k�f͚̟??&LH�֭K��L�R���rJƍ�;�3Ir�W�_�~%N����JUUU���J��\�Rhn\l��vZ�:��nĈ����ܹsK�=�I�=�կ~��1��	v��~2p�8��1��`�`?����ȑ#K`����K�-�ٜ9sJ�����<��c��͚����_�j�#4����hQ�͍.��B��$���)���̙��K�&I���#F�$h.ء�^z)�'O�#�<����\x�9���ӷo�RG���E��lڴ)��rK.��TTT�[�n>|xn���lڴ���`�3pPb�B!�B��1�>}z֭[��.��X��⋳nݺL�>����0pp���{r�Yg�{�)����r���g�С0`@�=��L�2%[�lI��������3lذl۶��~�V�J�P�y�W�={vN=��t�ҥ�׵k�
�̞=;����@��8��}�ݙ9sf�9�\q�I�-[�d�ر�1cF�z�|�Y�fM�M�����*۶mK�r��?��?��3�4���O��~��I�'�|2uuu���l�������婧����J��AbҤI�5kVz���?m۶M�̜93���ZN<��TWW��_̜9sҷo�,[�,���O��92m۶�C=�h߆��A�%I/^�$�ӧO�
��8T�,u��M�P�H������I�&���:;v�<��;מ~��$�ĉӭ[�$I�^�2a„6,,Ȱa�r�QG�.��?�%K����2���y�WҮ]����/I��o$I�=��&{��٨U.���I�����w�˧>���ڪU��$C���+V�(�5jTy�L�>=���Y�dI�nݚ�e��
y���I�:4٫����*��\������PUUU�͛�͛7�̤I��k����|�ƍ���>��|�+_Iuuu�/_��&I
T�)++K��hѢ�^
��8T�8\s�5��'?���/�?�|^{�p�	I�����\�2O<�D***v��%�\�G}4�<�H�,Y�-Z��N+�w��9k׮͆
ҹs�F�nذ�����G@�4r��ɟ�I����3�<3I2~������ٺuk�y��{�)
;vl�}>��O����O�Ӽ���g?�O|��޽{'IV�\�$CC��U.v�^Ș1cr�uו:J����<7�tS�����/�W^I�\z��ٳg^}�Ռ5*_��r�9��?�aZ�n������^_���R__�$4hP����.�/_�來������x뭷��|'}��Ieee^x�|�3�ٯϬ��IMM�G�=餓r���'��S.ڷo�iӦ���*)//Oǎs�g䡇��i�ڵ+�>�����s�9i۶m.\�侅�}��<x�G~p0jY��V__��<�����O�}��9rdfΜ�SN9���v4�q�M7妛njT�رc���\s�5i߆�1�=����ի�Z�v�RUU��S�f����޽{�d���y��3f̘�m�vo�4�p����r�m�e˖-�1cF֬Y�x����C]]]�y�|���O�\r�%;�=zt�v�Y�fk�f�JEEEF�u@�@)9� �/��#�<��1���O?�����Ϲ瞻þ6m�d„	�ۿ���P���s�}��u��$+����m۶����MEE�N{�a�$�ҥK6lؐB����ǧ��|����rJƍ�;�3Ir�W�_�~**����o��o�1cFf̘�c�9&�-*u��[�`��WUU���j?����pHٸqc}��L�>=.LEEE.��\z饥�D\��+��2?�p����w�y��O~�s�9'��奎d\����>:��v[F��.]��:p3p2����vh�ܹ��Ј�K�{.����/����76lX���#F�:��\�ֆ
2s��L�>=���/2`���jࢪ�*UUU���@�R__��{.?��2o޼$Ʌ^�I�&eРA%N�g-Z���1vjΜ9��͖��Y2dH�y�|���=�ܓ/�0GuT�c�U�Ve�ܹ��W�Z�(�̝;����3p4+��73iҤ|���-u�}�'��MuuuF�Y�Ь�����>��Ң����ƍ��?7�pC���.��j����~�G}4|�A��կf۶mi����5wo��Fz��õ9s�d�ҥI����gĈ2�w.�}nݺu�>}zz衼����۷on���TUU�裏.u<>�k��6�=�\jjj�����K�<yry������/�����}�� )�.�}��F���\r�%�9sfN9�RGb=��s;�oڴ)��rK.��TTT$I���o�9s��M�6mdL�o���s<�@֬Y���߰�GP(R(J�#�>}z֭[��.��X��⋋�������s�1N:�G�1V�X�q��e������o�=�6mj�[WW���?C�̀r��fʔ)ٲeK�g���)
Y�`A�{�ӟ�P(��ol4��� ����={vN=��t�ҥ�ӵk�
�̞=;����������������v��_^z�RGH����Ș1cҷo�l۶��q+cƌɲe˲y��lذ!?��3iҤ�-[2v��̘1#o��V>��Y�&ӦM�UW]U�����ӥK�|����ڵk�$k׮�wܑ.]�䦛n�i�'�|2uuu���l�VYY����<��S���@i��fnذa�ׯ_ɞ�~��L�<9'�tR
�B����=:~�a�2��=��̛7/�/��_�$y��g��3g��k���O<1���y��3gΜ���7˖-���$:tȷ����{���[�m۶|�[��{w	&�cǎ���)�[SSS�^�xq��O�>M�5�z�`ײ�84��ח:�!���/�s�,Y�)S�d޼y)//ψ#���0`@I�J
��G�����
7ܐ=z$IF��iӦ��w�-�?���I��'�[�nI�^�ze„	6lX,X�aÆ%IN=��TUUe֬Y��׿�_��W�����~���x�$���^Ϟ=�����C�?�xV�X�{�'UUUi߾}�#֎;���;&I�m�V��Z�*I2t��޿bŊF�W^ye^|���W�J�^��7�7�Ͱ~��$�?%c{
��8ص(uMeee)++kr���o��oұc�}�ѹ��[�$��N.�袴k�.�:u��ѣ}z��6m�e�]�v���裏�%�\�5k��6�ƍs�7�W�^9��#ӳgό?>�7o�a�͹7�կ~����]�v��'?������{�W���t۶m���[ӻw�y��СC�����^|T����,]�4W\q�a�}��������IҪU���?��`w��lܸ�c����h��W�
�e���.8�����:�����w�^�zeʔ)����$I]]]~��h�"ӧOor�C=T�9sf-Z�_���ԩ���y��y晍��}�ʕ�8qb�-[�'�|����mνy֙g��w�y���>��[�6z��n�������[�l�ҥK�t�Ҽ��kvzo���~;���'w�޲�_'L***�r��<������m�<�+V�N�k���ɓ'�M�Ν�v��lذ!�;wn��aÆb
�p��lٲ���+ٴiSn��$ɸq�R^^��_=uuu�ַ��$y�'��O��O�?������ŋӳg��7��]wݵ�g�u�]��������K��������3�dڴi�,��<�w��������e���I���L�Ԃ����u�0�O�Ӽ������͔)S�$���N��~~�e��9�c����<��$�����g�֭y�wr��P(d�ر����Nuuu���iӦ�_�~�я~T&J����U�Vk�{�N�!��5�z�`g����I'��֭[窫�J�lڴ)����޽{�M�6����d��S�L�_��_�#�Heeeq�`޼y;}�9s�$?�яҷoߴl�2'�pB񤌙3g{��?���gҦM�\}��I������$I���$�&M��ɓ�nݺ��_�U������M���_�ꫯN�n�r�%��]�vy�G�O|b����q饗�gϞy��W3jԨ|�_�9眓��iݺu�Vmmm&L���m���nK˖-���ַR[[�$�c��s�=7Ir�i�%I�/_��
�A��
����O>���C����gV|ݮ]���?dȐF�L��ۿ��N���$�իW��ʊ_�'����*��<��O,�>�裓$۶m��I�;�3mڴ�SO=�k��6���g3q�����5��O~���ʜt�Iy�'r�u�eժUy��2t�Д����9555����X{�o�>ӦMKUUU***R^^��;�3��C=T<y�;��o���p�
�֭[��[�n���nݺ�q�I�뮻.ݻwOyyy�lْ$9�sҶm�,\����.\����g���}@sQV��g�>RVV�$i�u��;����6mJ�֭�}�^ڷo�6m��
���u��y���w����<~��>ɹ?������wy��2u��,^�8��O%�8qbƎ�$����?��?��_�z�<���^����9rd��j��C��>��S���K��ݓ$�W�ΰa�2f̘|��(qB�8~^���*/��B���>IҧO���ӳg�$�o~����7�j���:u��.�,�-ʲe���o~3����r�5�{���2k֬�u�Y�-�'F���]�f֬Y�ڬY�RQQ�Q�F�0�[.8�\q�y���d�…œ.����s���'���/��|��Y�vm�������嬳��g��dz%��_��X;��RVV�k��6������>��}�sI�#�8b�ر6m�d„	�?~֬Y�5k�d����0aB��g�`ײ�`O|�ӟN����
�B����z���x�y�Dzdɒ�r�)��ڶm���k����ԧ>�u�֥w��9��c�dɒ�x�y��73iҤL�4�Q��������s�)�dܸq���;�$W^ye���W�T�o9�����?���?�GZ�j��ݻ����~��]~��QG�%K�䪫�ʱ���-[�裏ΰaòt�Ҝ|��,�xֽ�ޛ?��?Nyyy֮]�=zdɒ%2dHN8ᄴn�:�[�Ή'��o�13f��g�v���*w�uW��]�0+'\�_�����zo�;w�O~�=zv�t��)w�}w��=�wO�Y�[��￟���4(W\qE��#�<r����\@3w����_�z.����q��\@3w��'��O.u�Ê�(�
6dΜ9���J�v�J��������=d���B}}}�#�SK�,����<��ٺukz���O?�Ա���9s�:�Z�:.֭[���;}���i���W^y%��~{֬Yc���q�,����Ӻu�\t�E�9sfN9�R�b?[�hQF�Y�;u�� ���8���|0#F�H۶mK��4�Muu��0�
p}�ѹ��KK���E�����_�7��ͼ�����>���6m�ܹs3u��,\�0�sL�>����ݻ��`�(
I������9s�t��$I���3bĈ}�\�.`����ԩSS]]����6,,Ȑ!CҢ��ao���K�<yry������/�����}��:�1�-Y�$��vZ��O�4��rK.��t�ҥԱ`�ؗ'[�ʦM�r�-��.HEEE�d����3w�ܴi��������%K��_��_r���`�)
)
��QӧOϺu�r�Ek_|q֭[��ӧ�0�;����e�����a�a㗿�e�:묌;��VWW���?C�̀r��fʔ)ٲeK���N�Pȥ�^�h�e˖�P(�駟nT:th
�B�z�&C 
�+V�ȸq�2p�|�_��ߞM�65��w��m�ݖ/~񋩬���7ߜ���&ﭶ�6�g�Ω���h��k׮)
�={vjkk��{��{[�n͂2lذ<��㥎;4iҤ����lْ�c�fƌy뭷�d͚5�6mZ���l۶-�N��˿�K�����z*I��3�k�ׯ�[o��#�8"�i�1c�dٲeټys6l��H� IDATؐ��Ǚ4iRq���6�_~y�ϟ�
6d˖-��O����7���'�L]]]*++��UVV�����4��|���z��ѣG���/gÆ
9ꨣJv�W�^Y�xqn��$�̙3��k���OLuuu^|��̙3'}��Ͳe�2��TTT䳟�l�nݚ�_~9I���g?�YZ�h�ŋg���I��˗'I>��ϧm۶;�q��f޼yY�xq.���$ɳ�>[\���իW�c�Ɍ3��/�{�^~��_7�k���I�>}�4Yk�5���f����￟ٳgg���g>��S��k_�Z~��_��g��g�Q�
�B���ՓdԨQ9�#��O?�t�d�ĉ9���S^^�^�ze„	I�$I񔋚��$ɋ/��w�}7�w^6oޜE�%�3�<s��o�����#GydF��$y��w��?��ϓ$7�tS���,�Z�J�~��?��l��o���C��ٳg�8�Z�:H��_��ѣG�/��/2o޼|��_Nyyy�c�n5 4X�jU�d�С;�_�bE������w�]�xꩧr�Gfܸq��O~�g�y&g�}v�/_�-Z���O�e��;���cǎI�m۶k�����$9餓�w��'7�k���I�:4Yk�5���f������e�ڵ�ԩS��pk~h�p���?�[$I}��gᆪ����3�8(vjl�(FF��=64XDL�A��)�k��\�&k����KbBT"� €�"�vcl(����.�q@)�0<�Z�����~?��֜y�.}�3f�H��i�&;�SƎ�?�0Æ
ˮ��u�]7;�s�~��|��'y���կ~�K��Xu�U��������>���������///opm�؂���A��f��O?m���Iق�`��6�믿�?���h���p��^x!�
�̙3���'Iv�}��92Ȍ3��>�,u�v����^˘1cҽ{������7�����g��ə6mZ�_�zצM�V7���kB`4eʔ\u�U�رc~��_������;/�&M�g�}�>� �\sM���r��'���w�}S^^���?I�
��[����N���K�렃J�\z�3fLjkk3a„\r�%
�o�>I��7�6l�Xޜp�
k޼y:th~�����Neee�=��v�aEG�e�NȰa�2v����۷޵����G?�{����s�Ω��I���ӦM�$��o�M7�4o��f:t��'e,��}�f�С��?�����׍x�
���[����g����ܹs�k�O��c�=�:,	'\�™9sf~���e�-�����~;7�xc�z�0 �:u*:",�������,�=�Z�ʭ�ޚ޽{g��6�*�����Z+{�wn��'Cp�I�v1�Č�բE��t�M�իW�]wݴh�"���;�s<���yꩧ\{ꩧҪU�����WY�T*�ܹsӹs�p���w��:	�$�N�>}2�c�Ͽ��o�1��rK|�l��&I���z+={��I'��O<���<y��/�V8���jƍ�+��R�Vp���ˆn��n쮻��Fm��}������MάY���[oXZ�l��.�(?�p�y睼��;y��s�E�����x��*��=:7�|s��r�!���h�v�e�|�{��W\�$�����Ν;�
������:uj����r�-y�ҡC�\x��ӧO�р�w���ݻw�1��������	'��?��Ye�UҫW���׿N��݋�
���"�Z���W_�c�=6k��vё����������p�2�ꫯ��K�n݊��;�c��PϽ��[th�.h4s����ߟ�f�С�o���裏
��f��裏.:@ޛ��)\��ƍ�������C9$>�`9䐢�A�v�}���E����K�G�y�'���欳��7���l���Eǂ&a���ӧO�1�T*�,��J�~�r�Ee�=�HYYY�q�I���_t�z�|��Ф)\�T���Wth�>��#�3w�\���E�i�3gN�뮻��(��9��zF���n�-�����s�q�	h$UUUI�����^�{������1"Iҵk�s�1����p@>���<8̘1cҡC��u�Y9����Fhž��\�����~�R��c�=6�n�m��կ
���9�3iҤ���+�]w]�w�^t$`9X��-�ȬY�r��W�^u嬣�:*�~�޴lٲ1b@!ʋ@�n������;8p�����*UUUE�Xl�{w�;�n��F�{�8��d��.�v�m�V�Z�����ӥK�u�Q�~�G�K�.y�7�$C���'�����;]�v͡��+��"�|��B�XP��>�O�����޽{�?���1}���s�=�ҥKڴiS7�����*��sO�O��$�MBE�XvF���n�-��׿��?���8�b�l��RUU�Q�Fe�ر�ԩSݵ�c�歷�ʮ��v���7��Mn��z�O�<9��sO>����?]�=�O��o��y뭷�Ɔ��3g6��׿�5�|��O��޽{F��G}4_������Iq�@3��o���/OǎSUU��<{�wJ�R�р�4����#����$�իW����N��s�9y�g2|��0 I��SO-�~w�qG�z뭴k�.�
ʳ�>��n�)/��r���<�L��;!���͟+"'\4>�`~�����kZ�j�c�=67�|s�u�Vt4�s���i|ĈYo����c��3�Ȫ������<��ciӦM��s�$ɓO>�R���'�/�K^~��5*I2cƌE�5lذ$ɹ瞛�;&I:w����~�zs���&I6�|��l������H������$w�yg�8∴lٲ�D�Ҫ���G��橧�J�=2|��L�6-����*���$y�����('Nl���n��o&I:u�To|�wn0��?L����
���?VD
���MEE�}\s������������z��l��$9��#3hР��OJ�=��?�9����ٳgݜ_���8qbڵk����+[m�U:v�c�9f�r�/g|���������$Y����s`E�'�>|x8�E�?gΜ�7��([@����k׮y�g2~��<���k��ҦM��9#F�H��z����;�������W�v�$cƌ�7>~��s�_�$ɴi�\�?6����`9{��dz�n��'�Ȱaþp��ѣsꩧf�7΁�y��-��@��=�}�YN8�|���ի��=����O3iҤ���u���"�s�A%I.��Ҍ3&����0aB.��s۷o�$y���\�?6��.��x �zh��铪��\}��
��{�ꪫҩS�TUU����Yg��#F8�VR{�G݉�ڵKuuu��{�w��'?�I�w}�楗^��>iҤEڧo߾i߾}&O������k׮�ׯ_:t��`�n��d��_��c�=i_h��D`9��;r��G��r�w������Ǽ��+usN;�l�馹��ӭ[�><'N��g���6۬��TSS�����^///OϞ=�$GuT����]?��3s��e˖iѢE:v옟����߿��w���"�hѢEn�����+뮻nZ�h����?�w^��x`V_}�<��S
�=��SiժU���E����R�T*:@sw�
7�SN��g������I�y��}��9��s��&I�R����:*-[�,22��>}�d�ǰ����x㍹�[��f�M6I����[�ٳgN:餜x�'fe{��%��e�K.�)�������ue������N��3u��$I�޽ӧOe`�Я_�l�ᆹ뮻����l��F�۷o��`�)\,#�R)g�}v~��n��g��`η���TTT��o. !��iٲe.��<���y�w��;����E]���ʢ��R�(:@s��g��SN��7ߜ�o�=}��Y�V�Z��O̵�^��N;--Z�X�I��.���}�{��+�$���ӹs�S��S�hds��M�~����������+��"w�}w��뷜R4�޽{�w��E��F�pЈfϞ�C=4C��e�]�����~��y���3eʔ���y�������㏓$�_~��4
�d���9�C��SO%I�9�$IeeeZ�n�
6� m۶M�֭��V[�u��i۶m6�`��n�:�[�μy�R^^^�cQ�h4555��������d�MҦM�l��iժU���Ťp�H��g��#MԽ��[t�z�/��S�XƎ9昢#�I�`�ݻwz��]t`	���q�@#���{���X�o@C
��c�):���J�R��MIy�����Q���`�}��G����S[[[t�eB�Xlo��f������`�P��f��a���mۦe˖�m��r�Wf�ԩEGk��_�����RVV��s���~���kd���EGX&�J�R��@�>}z�9�2d���[o��r�-�ٳ�rN�`={��C=�%��b~�bQ�]����s�=��v�e��EGhtN��f�w��2dH6�d�80�n�Ν��^{-�sN�N����>:#F�(:j�䡇*:�����RSSSt�e�	�=��#9��CӦM��=:�n�i�9�^zi�;����#C�- e}Ks�.�w�}w�?��L�>=���E�hTN��f��nK��y�,[$�)������g9����O�:5?����f��E��|�����8ӦM�7�������E��_�7.���Xc��n�:��w3s�̺9�����K�=��:���~�3f4�{ƌ�۷o�\sʹm�6��w2y��/�����9�l��Ym�ղ�[�����ٳ��^X�u��%�����?�Qt�F�h�ڵk�7�|3&L��o��M�6-ݻwϋ/���ڎ;�g�y&k��f������_�|���~�;��M7ݴ��F�T�\�����Y`�o~�����q衇�O�S�y[n�eƌ���^{��fϞ�=��#555
��o���׿�5���
�T*�u�ֹ袋rꩧ�Q�t����:|�+_Y��~�_��_̖[n��ÇgΜ9y�駳�[dܸq��˖8S�����K/�O>�y睗$y���/m�J���W_}u��n�'�|�ٳg�'�H���l����?��C�fΜ9>|x��r˼��k��+���+�LMMMv�u�<���;wn&L���w�=�?�xn���%~fh����r���S�NEGhtN��f���2s��Ɍ3��k,�}�o�}&N���{,��_���>�<0:t�ĉ�,�	�G�N�Ν�$|�AZ�n����|��g_�^�T��ѣ��/d�ر����	&���,��ͫw�#�<��}�ku�>������ӱcnj?~����N;vl^{�z�W_}5[o�u��k�6l����A������:���jƏ��;.pN�T�����^�n�e˖�={v>�䓴lٲn|֬YY}�ճ�j�e���I�p1gΜ�hѢ�Zyy���z��N;찌=z���.I��W_=�f�Z�I��z��>X�u�y*/:��w�$2d�B�92뮻n�v����$
���?IbA��9s�,t��E�K_��SO��ѣ���[���O��3a„�����UTT,�/z�$�6m�"e��h����$�կ~���{���y���'?�IJ�R�?���B�W��$��O?]o���[l�E��r��\76nܸ�{�$��_�$Ç�W\�N8�^�c�ܹ��5���aÆ%I��f���1������T*5�3���\.�:���^{���N׮]s�=�d�ԩ���O3r��z�y��G�}-��w���ٳg���Oγ�>��s�f���9�䓓$�zh��6m�$In���̜93&L����_�x饗�
2$�g�Θ1c��$I��G�[��O�s�=�O?�4Æ
�I'��$�ի�B�=��#�$�{�Θ1cR[[�ɓ'��3�LYYYz�������J;X�����o��2~��^?��#s�wf��W��:ujv�u�z�����f�<��sYw�u��_)c����t�A2dH�ԝD1�4�$>?޶mۺ�86�|��_��7����y�}ƿ��/9蠃���ݻw\o��;�g�y&-[�\�ӦMK׮]3iҤ믾��y�駳��;/4�<9����m�f�ȑ��/���ꬹ�Yk��ҫW�<��c���P�l�$묳N��SN9%�l�I***�馛�?�AF�QW�H�+��2��w���맲�2|pn��%�{�5�d�-�LEEE�̙�$���r��f�5�Heee�����.]tQ��4`��|��Heeeڶm�SO=5Æ
�+[,��k���Ç�?�a6�|�TTTd���KϞ=3b�eXI9�X*����ׯ_N:���E�hN��JEEE�{�6��(�F�Xj��KF�Ut�F�p,���������(\K���*�'O�o�Qt�F�p,�]v�%���5jT�Q����Z�j�:�����(�B�h]�tq��l��J�R�!����E��d�M����.>���M����(\|����(\|����fΜYt���p��;�l0��dΜ9_x����̝;wY�����O?��KE�(��_�ѣG�2dH~��_}�}�ǏO�=2}��eXB�m�]jjj���T.�B�92���J.���z�7�tS�=����^�:t��O?�:d����:*�����2v��̞=��(KL�(���$/��B�͛W7޶m�$�g���{w�y�$��o���ݻ祗^Z�I��եK�̝;7���?����.����>��~��{�y�7��SO%IfϞ�)S����v��<����
6H�6mr���M�6�޽{F��<�[o�u�]w݌5��(KL�X���g��ɹ���կ~��^{-����~�r�!9��R[[��5v�a����;�����ݻg�}���?�<X����TUU�����(KL�X��]v�%�۷O�޽s�}�e�ܹy��W�$[n�e��ꪼ�T_ IDAT�˹��Ǝ;����g��W�<�>}�䨣�ʍ7޸<X�����9��KL�X��̙���?�{�N�s�1�裏�裏��_��o�V�Ze�m�ɏ~�\xᅙ2eJ�u��~����)�JYe�Ur�M7�'?�I�����.H�TZޏ���]��E��;wn�Q�HYɧ
�r��W�^y�7���'I��c�l��fYg�u2nܸ<��I�3fd��O�=r�m��[��g�M�����k��+_�J���ӿ����77�tSV]u��l@��`���{��{֕-��w��y衇��K/e����oժU�����~��1bD�uv�a�$Ʉ	��[���?���/�~xf̘��h�.��f���ӟ��o|��Ə>��|��;vl��z���{�z꩙7o^��k���6�,�Ǐo������oy���뮻��w�]64[
�r�����6�z��7޺u����#S�LiP�H�k��6/��Bn���z�;�cƍ���6�t�t��1/��b����7�C+�`�<xp:蠬��z
���)�JiӦM�k;�C������s��ԩS�O�0���Y�f�K.ɶ�n�W^y%�
������YS�����?�?�x�;�^�j���$���?\����׿��L�2%?����;v�I�&���6���˭�ޚ���*�]vY�9�L�4)�|��}$,���+�{�7����3gN��ׇ�$����ӣG��=���?��̚5+I2v��|���Yk����;fΜ9����A�eܸq9����z���K˖-��3�GY�T*h���c�<��Ӌ<��W�N;�]v٥��v�m�����}R�gϮ+Uz衹��˳�6ۤ��*m۶ͣ�>���,��^z)���?s�a�`�(\M�\�)S��[�n�ܹs�r��|���I'����޻nlĈ�m��2hР���w��̕W^�+��"��N�Q���dM�2%#G��!����r�)�����'f���_��E1lذ��>�����v��`��Xy���e�����O�gϞ��O{�K/�4-Z��g��4��TUU����5��(�E�h����S[[����žw����u�]�A��'�X��EѪU�t��a��=(���dm��i۶����G��?<'�|rfϞ����EU]]�`��p4i���y��g���믿>���OEEE#��.�쒚���J���,2��I[�o��t�Ms��+\@����3u�Լ���EGXd
@��뮻��_��ɓ��,�N�:�3��j��Vt�E�p4i]�tIYYYF�Yt`	UVV旿�e6�|�,2��0-[���9묳N�<��l���!��)+�J��C4%N�VJӧO/:Є)\+��o�9�:uʌ3��4Q
�J��˴i�r�h�.��N۶ms����k����?_t�	R�VJ'�xb�u�����>+:�ƍ�#�8"�g�.:
��R�VJeee0`@ƍ�믿��8�RXm�����g�رEG�R
�
a�̙9���/4ښ�m�]�>����y�7m]`���f����:9rd�Q���P�u�Y'���oi�k��?���y�'5ù瞛M6�$w�yg��4TVV�����=��(_��������ѿ{��V�3�<���_�Q��K�.y衇���p�0�v��腋$��UUUeҤI�1cF�Q����¨���k���)S�XB]�tɼy�RSSSt�/�p�0���SVV��{��(�j׮]6�pÌ=��(_H�Xa���z�j��2jԨ��KaȐ!9�����*��8�v�#FX
;�S�����B��RYY����;ҭ[�l����|/��)+�J��C4%������J�֭��c������H�rV^t�����"7�tS�
�;�8@�p���vZ��L�81�[�.:�)\,���ӳ�v�e�}�͠A���,G�Eh��\s�\w�u��;2t�Т�@�S[[�O?����p��<��~���w��ٳg��Y�fe�u��#�<Rt�R�VX�f�Z.�\��9����g�-��`eвe�l��f���):
���J�R�!�q������y�EG��	'����~;�>�h�Qp�P��7�<�]v��۾}�<��s��X����RSS�	4E
�
���:���J>��â�K�K�.�裏��+���`�T]]�$N���N;�UW]5�F�*:
@
�
i�
6Ȗ[n�4`VYY�N�:�����(
(\+����1����Ν[���\���5kV�1P�VX��Յ}#�<�v�!3f�(dh.����7�):@
�
�k׮Yw�u3eʔ�n���?^x�r�X�.�V�n����3l��r߻M�6��/~�k��&cƌY��VY�T*`ET*���>�d���9rdVYe��#��	K���,Ȅ	r�5�hD
K�}��9��ss���_/:�H�J�R��+�9s�d�w��+����8@#P�ho��F6�x㬲�*EG���O?����TUU ������t�M3p��$Iʋ���~��<���R�ҥKF�Yt�:
�
���&}���ԩS��,�.]�dҤI�1cF�Q�(\�ԩS.�첥^���:�R)�F�j�T@���2o޼��� ���l���b�-��s�XB�ڵˆn�p4
@��Ν�(�TUUe�ȑ��Vc:th^~��c�
�K�.M��s`�p�O>i�u�u�#F4�Z�a޼y9묳r�I'�T*VUUU=zt�1�(\�D׮]3eʔ���+EGI����g��y��'3hР���
�C�	'��y��@�h:w�-Z4�S.���r�)��3�Ȕ)S��M�.��.� ��~�(��P�Beee.��t�С�(���g?K˖-�����(�bP���3�8#UUUEǨg�5���_�;�3�?�x�q�ETV*�JE�h�:ꨌ7.�ƍKeee�q�/�����K�n�2s�̢���	����Q���{�'g�yf�1����ФL�2%��zkJ�R�Q����Ь̛7/G}t{챢�K���:~�a^}�բ�+1��Y)//ϋ/��'�x��(��7w@C;�S***2jԨ��+1��0;�S������׭���s�=���6�aÆe�wΌ3��MJeee:u�pJ�(�Zk��L��ڵkF���>�l���X:v�7�|3�~�Q�ɩ��JMMM�1������t��53f���㋎�6�`�\q�����B)|Nuuuƌ���@�p4;;�CZ�j��{��(_�_�~�s�=ӿ���������̜93/��b�Q�����쬲�*����ȑ#������r�7f�ĉ��꫋�MFǎ3r��t�С�(�JJ�h����3bĈ�c,�m��6�w^.���_�*:4	�ҥKV]uբ�+)��P����d����6l�2Y{Y8묳����?�i�Q�$EVn3g�\&�m�v�����h�"=�P�{�u���5�J��B��8��TT,��
	,E%��
h�/v�"�e)ұ�,JWt�@L��tp������2K�HHr'��㜜��������a��4H��l6��Τ��Ά���Pp�Zff���Qp�ֆ
���t�Q����Tk:~���e�{�n<x�t�i޼�rss���d:
p1\�j-::Z=��e��O��'���f3#n��&]��JLL4�
.@�֦M���O���6�Lf̘�-[�h�…��`LXX����M�.��`L�Ν5r��
�#<<\���ھ}{��SQ�V��~�i�;V'N�0#��”��d:p1\�j-88X�^{����LG)�W^yE~~~=z��(�C��ԩS��B�����ët�����fΜ�%K�h�����P�V�$)11�p�J(�Ƹ��W�>aaaJHH���*�C=�>}�h�ȑ���4�Ju���j���ɓ��B�0��ϯR�	�ѣG���R)�U�w�}W���:u��(T���
0�t�B*�c�j۶��V��?���뛎Sf7�p�֯_o:.��P�ծ][			�c�*�����b��l�C8:\\����PpP���㏺��;���f:
.''G�V�����MG.���*��oԞ={c:
�f��o߾ڸq��(�Pp\ƩS�4m�4�����Rn�ի�iӦi֬Y���7�
���V�Z)!!�t�,6��f:@eHIIQ``�6lؠ�]���Snl6��v���]���rww7	�
���Y����(����p���WPP��m�f:J��X,�={���ۧ��z�t*TXX��o߮��ϛ��9
.�1=z�Pddd������Jݳ2k„	�4i�>l:�j�*##C{��1Ts\�Ү];%&&��Q!���ոqc�7�t*LHH�|}}���s�<(�.�m۶:y�<h:J�����ҥK����t*����Z�n����Q@5�n:@e


�������l:N�kٲ��T��#G����tP����ooo��OR\\��(�����tP������'�V�Z�c'F�0����Ⱦݻw7�/�:j�\�����Yl6��tT��~�MYYYjܸ��(T\Ts��s������w��b���@�P�tT�7�|S[�n���MG�ʠ���

ճ�>�^xA'N�0�r3~�x-^��tPMQp�&M��Z�ji��Ѧ�Pnv�ܩ�kך��)
.��>|�^~�e�1*����fΜ�%K�h�����P.��”��h:��(�.+??_�|����{��z��4r�Heff���UӡC�t��i�Q@5D�pY�۷WRR�Ο?o:J�y�wT�N���/��p����$�.�BPp����T�=��o�Z������dc*[``����Լys�Q�j�^{�5j���x�Q@5D�pY!!!�W\\��(������p*�e����m۶\P����)!!�tP
Qp@5f�Xd�X\n��׶mۮh�;*8
(���_����������m��ȑ#��ȸ�^�z)44��R�+�[o��tP
��*��f3��=��:s�|}}/9o��Օ�8:\����y�b���СCz�G���j:
N���1��"��R�8//O�<�jժ��u�j�ĉ��S�N�_�~���S@@�
T�M��볲�4d�����nݺ8p�~����IOO׸q�Ըqcyyyi���ڷo�����.kNG{)&&�Ľv�ڥ�]����O���ӈ#���a���1-((�ĉլY3yyy�f͚j߾��ϟ��™Ԯ][[�l���MG���Oq��+ʎ;LG�ڱ��%@�U�F��(<6l��Ν[d�E�4k�,%$$<x�-ZTd�СC�p��"󂂂�}�v8�;;;[�;wVbbb����{�֯_�5j�Kβ�u�5��ԩSE�>��S�;w��7d�l6�;Vo��f�s�4m�4�3��9g��jȐ!���Uxx��8p��
��wE�ի�V�^]m�gA�\P||�~��'eee饗^�$�9Rnnnڻw�233����M��v��b���[�N999���UPP��=�iӦ���iӔ���v��iǎ�����ݻթS'}��7�
8�&gY�j֬���߯��L���H�V�\)��1m6����䫯�RNN����4k�,I����K|,���եKEEE)//�t���g*���իMG�Z���XI.bccաCIRZZ�jժ%I�駟ԪU+IRFF�����_�|�z��m��믿�}�ݧ�͛kϞ=�nݺ�v�ܩÇ��o��=t萂��u�wjӦM咳,{%%%)44T�t��)իWO5j����ޏ$�x���_u�}���W�^�Ըq�K=%N�jժ�&M���cǚ�@�eee�����[���v?8:\�ڴic��f͚��[�li���ϯ���w_��N�:I����$�$5n�X��,IڵkW��,�^!!!���֭+I*(((�~$i�ԩ���ц
��s���n�k������K�sV��r�bbb4i�$>|�t@5W���㼼<=��3�U���֭��'J�� �_�~���S@@�
����"�}}}����!C����Ou������o�]6Ozz�ƍ�ƍ���KAAA���Qvv���e�Y��v�ڥ�]����O���ӈ#���a���1-((�ĉլY3yyy�f͚j߾��ϟ����Tc%u�����t��8++K���y�]&|||������VNNN�Y��ܔ��_.9˲WVV���֭ۧ[_��/�̙3Z�j�,X���XIR@@�^{�5
>���*77WmڴQ�&M�f��q�XI?k�
��s���h�"͚5K			E��E�Y?d��X��� m߾]����V�Ν���X,�ޫ��׫F�咳,{]s͖u�) IDAT5:u�T��O=���Ν[�࢐�f�رc��o;'IӦMӘ1c��C�Pj۶m+r����K��7o^⚠� I�ѣGe�ي}@����j�*Y��Rw�А!C�e�����^Й3g��===��Gi��ɦ�\T||�~��'eee饗^�$�9Rnnnڻw�233����M��v��b�׬Y�u��)''G���


�ѣG5mڴ��6m�ծ];�رCyyyڽ{�:u�o��F.,��e٫Y�fڿ�233#IZ�r���Š���H��|��W���QZZ�f͚%I�>}z���
.@�
6L?�����y�f{'�������G�$EDDh������WJJ����e�Xt��w�[������|��6-������okҤ�,��{�=����u������v?�-44T-Z�0�fΜ�V�Z���[�F���G'�9s�Y�f���Qtt�$� I����< OOOu��^x�bŊ�\�l�$�O>џ��'����E�z���%I�q��,�^ӧO�-��"�=Z�t����G����%Io���f̘�'NhĈ��l:r��%��?Xl���Fa�@�\|\Ҽ˭�ر�bcc�̵Z�ڼy�����=w���õw��b9}}}�e��iӦ\r�u���@�=Zcǎ-v�믿^'N��$5j�HG�՜9s��&�ٳ�V�^��(�����L�������/77�ˮ��'5o�<����,������S999���*++�Ĭu�ֵM\mβ앓�c/��l�Q���{��w��K�j�С��|}}�Q�F��׷��������իս{wyxx�A�����ƍ���Ԯ][[�nըQ�ԨQ#������K���S\\���<8ګnݺ�ի�%�j߾�����{��wոqc����߬�(44T����VHH�ƍ�>����WraÅ.,b���۷9.((���9%9w�\����,�^v�*,���~����_�…ձcGeff*&&F7�x�fϞ}E�����\��:L��ȑ#�k�.m޼�\�w��L����~[�����(T{Չ���]�"�u�֩[�n


URR�õ��z���ۧ�G��Q�F��]����J~GKHH�����o���G��������.<<\)))���c:
�
������y�f
>\�Կ��?��#����m߾]���JIIQtt�,���r�V{\�߿�>֤IY,���{JKKS�֭պukIE;f����\����"==]u���ҥKէO�q�Jzz�RSSu�
7���&*��Eǎ��j��͛����p�s���{�����-[��M�6咳"�����u��	IR�F�t��Q͙3�^lr��={j������������������t�ӿ
0�܊m�(�W�V������
(::Z7n�[8R�vmmݺU�F�R�F���u�W�^����@������w�U�ƍ���IRTT�,X���Py{{���[!!!7n�>��r��3:\c���J�:h���<x��8Sޝ��p��j۶�F���^'O�4�
G���+��"ooo=��s��P�,6zi�
�\�R�>�����k�s�=��`g�X$I�
�
.P*�z���ݻ�k�.y{{��@��a:��3f(??_�w�6�RRR�|�r�1@G��Z~~����M���5k֨W�^:s�j׮m:���pp�ͦI�&)..�t�E����m�V6�M������*����X,}��'Z�v��(��ׯ�
Pp�
�oߞTaaaaJHH0Ta�z�<��c�#�Y�l���g�}��������tPJV�U���3Tat��|����OM���P��O�Z�2á��p���+99�tPaaa��_t��I�Q@E�`��ŋa:8�d�EFF����������~P�֭M�qz)))����iӦ����td�Z%I			�֭��4�*���nnn
S||��(U��f�?��O���7IRݺu5~�x���(:\���c�����e˖���I����/�0�J��ɓ���O+""Bmڴ1	��ꫦ#�*���4>��SIR߾}
'�
��BO<�z��a:F�1l�0}��G���Ҷm����f:eF�p*�/VDD��\Ԓ%Ki:'ҴiS5m��t�*�b�h���


լY���3Ϙ�@��0�GHH�����cǎ��@�Qp�r5a�]��t�Ti�p~)))�_������_]�����(g���Z�p����MG���p�"�l٢��zJ͛7�������t�M7�O�>��/Lǫ4�E���e¼y�Լys�1UL�ΝեK�1(3
. I:q℺u�Ν;k���ڻw��������cǎi����ѣ��w���T�qQ��
��gϚ�er��qEFF��ѣ���*�����j߾�֭[�n�AS�N��ݻ�������ݻW/���j֬�/��R={�T~~���T*��f:(�ڵkkٲe���3T1\@C���Çu�wj���z��ԢE������S͚5Ӌ/���[��N�:���4{�lӱ�4ӦMS�N�L�e���V�Z)!!�tP�Pp`�/���aÆ�aÆ���R``�"##�g���-�e�.�����}���k������4i�q��)==�ȼ͛7kݺu���k�b�
թS���!!!�<y�$i޼y���ݻW�
R�
���
h��:p�%�K�t��w���G�ٳ�����;p����`yyy�N�:����5i�$�={���f���>%)�_�nѢEjѢ�<<<t�����Wrr�e�]���/u
��4h���xeff�����oWbb�������
�X,Z�x�"""WW�7oV�=���Z윷���/_�nݺ���}||���>�O<�����ۦMm޼Y~~~����(͝;W&L�K/�t�999JHHP۶m���i��/Էo_eee[���U�V��{�ux_qqq�뮻���]伧��6mڤ�����t�=�(--�a��� �����/�l�|v5����*�_�nʔ);vl�^^^���ԣG�+�Q�K����/+.Y�D���������:z�n��f}��w��;Lǩ�Ο?���T��p1���Ә1ct��Y������:\T�ӧO�O�>JKK��ѣu�eeei۶mz��'���������oE��l�b_�����������9rDQQQ:����#G�(77W�������c������[�l�$u������K�:u*Rl����~��)++K?�����������d=�������c�=�����:t�|�AmٲEڴi��4i���\���+E�=Ziiizꩧt����*33S�~��Z�h��G�jҤI��Be}�.�4�����+<<\qqq�����ݻճgO���h��:y�d�r\������pEAAA�_�����LG�����H�1.�j�*==]���3T!\T�9s��ĉ?~��z�-���[���7o��}�Y�;wN3gμ�u���4q�DIRttt�� �g�VNN��q���{


����:w�O>�D���G����/���͛����O����tu��E+V�P˖-��驖-[jŊ�ҥ�Μ9�3f8\�whŊ�ر�|}}u�wj޼y���[�����$�������𐏏���.-[�L��z��r�v��z���/t뭷j�ƍj׮����ԢE�\�R]�tѹs�4{��R�&O��F���qEڷoO��U1b����+-]��t���������x�Q@B�@%��/$IO?����O>��$iÆ
%^�ܹs�߿����u�����_/r��o��$�9��Z��*�ͦ#G��Dz��$I����������kI�رcU�Fї�jԨ�^xA��n�:���k۶�$)55��M7�$I�֭�/^����?�s-[���fӯ��Zn�.Tϟ#���M�0A>>>E�.��¼��Ѯ];%$$��Q�u��YO<�F���gϚ�p!���ӟ�d/��\T�={�H�e�X�}�l�R�t��1l�0=zT�����O���V��%I�[���L�jՒ$�����~
�-,�X�xa�����$?~�$i۶m0`�6l��
jȐ!Z�b�rss�5ۅ��s�4��;���xXX�$i�޽������0;vLǎ3�J{�7TPP�q�ƙ�p1���SLL���
���]�[��̛?��-[��5kj���
(6'==]ҕw�(|�iޜ���_丰X�v���׬YS�����𼷷��=x�`�X�B��������?z����裏�E�:|�p�e���>%)�_�^�z��h
�,�3+,0�
ڶm�Z�j���Eխ[Wo����Ν���X�q.$$$D���7T!\T��7��={V6��į���[���?��g���b���-Z\r�+}�}�Ν%I�ׯ�������5�\���
�Ν;�p�ٳg�d�Z�<򈒒���/�h�…:t��6m*I:t�F�U!ٮ�%=Dž�T�N��m6[����������n:����ӧեK�Q�����w�}6l����L��!
.*Qa7��[��j]vv������LM�4I={�,qn�&M$I���Wt�~��I��{�={7�KY�r�RSSe�X���p�?�Pd^yiذ���h߾}Z�v�$iӦM����_EIJJr8'Ijݺu��5�x9033�ؚC��s:�����LG�6fΜ�������[8
.*�< Iz��W���_�e�d�Xԭ[�"��?��v�ܩ޽{��_������`��b璓�e�Xdk۶��v��=���ߌ_�رc�:u�jԨ���>~���K��L�����"k


4u�TI�=��s��W"((H�E�w�.v�C����3[Y���2mڴbc�ϟ�o�!Iz��G����d�…%�SX\s�����ߩ���4i����n[8
.*�ȑ#U�vm����P||�������***J����^{�5��5k�h�̙jժ�>���"�%1b�����h�"�?^ǏWff�6n�h�f1x��"k�Ν�z��iݺu
		�̙3u��a���+++K���z��7e�Z�����_,�=aĈ�Y�����[���[{��Qnn���٣޽{kӦM���O?}Տa���%I}����_������+99Y��WQ����U�/��R�?����ݫ��\�ܹS=z�Ж-[t��7k�СE�w��I�4l�0mٲE���:t�ƌ�Y�f������$iŊ���Wnnn������a:�Y�����b��l�C�d�X�x�b���/>�����K���GYYY�Ϛ5K#F��[�V%%%]���̳p�B=��r��O���q�Fy{{ONNV�޽u��pssSLL�&M�T��ڵkշo_���;��奥K��W�^E��GJz�����T�����v��A����U�F�*$[i��K]�,��e��3g�9_�~}mذA��v[����Du��Y�����;w��
�p�.]�hӦMEƪ�ˊK�,Qdd���.>�:�pPɺu��QC��M7�$ծ][]�vՆ
��Y�СC��c�С������N�:���ԭ�ު�_~Y�~�m�bI
		Ѯ]�4w�\=�
�������մiSEEEiǎ�-$顇���5`����]�����;v+h(�Z�ji۶m����?�h�B>>>rwwWpp��{�9�ر�H�Eyg+��W����M�6�j����]�7Vtt�v��U��B��x'66V={�T@@�<==ծ];}���zꩧJ�gѢEz����'www�x�y[P����LGU.�1����Z�댁���P��r�-z�g�׿��t���pP
���Z�~�Ν;g:
(�ƍ+11�tPPpP
���z����ߛ�R��iҤI���6P��m�V			�c�*���R�[���6m���8�Q���g�j�ԩz��WMGTc��~���߯��T�Q������ڷoO�E�馛��K/iʔ)���M�TSaaa*((PRR��(��QpT16�M6��tpi��኏����MG�v��׿*$$DQQQ��T�
(00��pY\c�,Y�:u꘎Qj���JOO�CpssӼy�u�V͟?�t@5���x�1������Z�l)___�����TK���z��g��/������v��)33�t��(�F�;w�t�Rsww��jնm�LG��&M�$�3�t@54~�x}���c'�n:��"##�j�*�1��O?��tU�O<���ϛ�Qm���k޼y:q��(E�p}��5����!���?��t�j��7��(�Ncٲe�#H��8��b:H�l6����8�^�z)""�t.jɒ%Z�j��������W}��5����ˣ��d[�T�t�4���LGT?������M�N��Pe�8qBV�U��{�$�رc�Z��֭��d�c߾}N���e�4f��3F˖-��T��y��i:���:u�&N�h:pR\�*#99Y�Բe�"�!!!�29��{�؛/���;4c�EGG�������?VrB*λᆱw�y�t����k�ʕZ�f��(�j ,,LIII�c'E��2J*�(<vu�}���흕��	&�O�>
�
7ܠ޽{��_TVVV%��b9rD���.�k׮�����O?���t�qU��j���Ç�����Y�V�ׇ~(I�;w��V��.]*I�>}��V�ɘ(��E�t��	����>ֿ�8qB�-2�����~�I���������~[z��MGTqmڴ���;].�C\\��Ǐ�o���^����_�~���/��KKKӴi�Խ{w����G�z뭷�}sa!��5r�Hu��I��s�^��"�


4{�l���[�۷�wܡ!C�hժUE�u�u/�~����5|��bse*�}��wZZ��.]���0]w�u�9��׷̤��]��jW~~�MGq�]w��L��3f������Z�h���x�Q�r7�R
�@��~EDD�Q�FZ�|����5x�`5m�TK�,���O�֠A�����<��'��z衇$I���z�'t��a����-Y�D���Z�p�|}}�\;**J�Ν�$e8;� IDATggk���*((PLL�$iƌ�������]�vi׮]���Pdd�e��[JKK+R�P�����땙��:;סC���kÆ
z��GK�	g����+>>^w�q��8.c�С�裏4l�0����ݝ���MXX.�Ct�UBrr�$)$$��qE���→E�Z�b����{=��#�����}��:|��4h��j۶mZ�`�n��<xP�~�k7j�H+V�Pll��*I���o��W�X!I�>}��mۦ�^�ƍ�$���"�윘�X쓞7n���X���K�~�%�+Ij޼y������/��B��^|XU�m�V?���.�b�hΜ9������t@f�Z�������Q����T	�-[�tx\Ѷl�"I���VÆ
��뫘�%&&j�ʕ�y��111jժ�<<<Ժuk�?^��q��b�;v�6l(///{����T��Ž�/ֲe�t�����G���Z�f��0`�<==+�ٷo��?
J.TdU]�v�g:��i֬�<����t@v�]wi������68
.�S�Z��Z��‚)S��j�ꫯ��$����9����?��w)����$�u��E�۴iS�:jҤ���Z�jIR�O�5j�������~[�?��.\X�7�8�֕޷#�O��$լY�ع±�9Tu���:v옎;f:��iР���*��[oՔ)S�xP���+`�X�j������>��w�֭[��'�u�����֬Y�ԭ[7-_����/����f����[���w��5��U8v��+΢}��JJJR���MG儂��5w�\IRHH�5}�tIRhh��_�믗$<x��n��Iҏ?�Xd��800�L�תUK={�Ԃ��jРAJMM�[o�U��:ddd���ە޷#�\s�$�ܹs���������Qhh����MG儂��%�Qp��2t��Q�4u�T���(;;[S�L��j�#�<b�w�]wI�^{�5�ܹS���ڹs�^�uIR�ΝK���?,�ժ�>�L�����[ԴiSI��c�����5$I�V�RVV�>�ɓ'����ݬY3I�/��R캅c�s�����t���%���bȐ!��믵s�N��ѣȹ��z���A��q�F����СC��kذa��+1h� ���k�<yr�����P��:}��z���@�]���k�u�]Z�b��y����;��:�w���h�;��Srrr����ò�����pzX�޽��qe��k�h�"�w�}�Y��<<<Լys����֭�}^͚5�h�"=��c������뮻N����￯Z�j�z�޽{k�ĉ���[���)OOO5i�D�֤I����y5h�@nnn��ͽ�5G��>}��v�����T�4a„2߷���~���j���Ů�y�f����k׮�~<.%??_s��Q^^��(�*�b��l�C�d�X�x�bEDD8<F�7{�l-X�@�V�R�
$I����z�ꥨ�(=�䓆E-Y�D���*|���c��;r�Z�h�	&h�����0:\��4H�����ŋ�c�/V``�`0��n��fM�0A���:d:�
Y�~�F�e:p"����Z!�MLL������׳�>��J�֬Y����6��������5k���Ң����'�hĈڰa��8�*�ԩS�5k�&O�̿Y�$:\���~��9r��N���S��/��BCCM��BlڴIu���ɓ'MGqi�3g������?6PE���)//O;w�48	:\�j�N�+""B�cP�Z�j%�ͦ��8=��C�㸴:(**Jcƌу>�k���t$��V�:���;����?�>�D%@�󐘉�xT$5����S��%�n�V^�b�v2��Zy��C��C��Р��Ǚ�ҜSo�"!��~�\TPdC����yt��k����9�]���jҤ��q@����S>>>���3:
$M�4I%J��[o�et@1`2�d�X�s�N���"���ԬY3
.��GyD3f̐����Qń�bQ||��1@A�@jڴ�v�ܩ��L��@R�n�4j�(�c��ƍ�СC�r��Q@�dt��-]�T%J�0:���ҥK��<tbccռys�8qBU�T1:N�hܸ����t��Aխ[��8 ,�nܸ��;wꩧ�2:0�HY�r�V�\itPH��܌�P����ꪸ�8
.(f�T��o��F���(���YYYFG�oNNNz�g���jtpZ�jetPDPp���={$I111FGP�-_����>Qp���K�J�z��ap+��C
_JJ�����ʒ�d2:���)QQQ


2:��Ttt������<�233�����;C��Y���7:
�s0:P�����`�mܸ��(�"��<T:w�^xA�ֵk׌�(�(��ƅd�X���OK�N�:%�Ţ:��x:t��}�����6m��b��M�6JOOϵ��b��b��qqq��1111b�F�����BN�W�z�����z����3g��_��㍎(�nܸat`0
.@���� I�[�n�c___�2Wo�񆂃��{�o��V��ɒ���d}��=fq�{�n͚5Ko����|�M͜9S{��1:���+j„	�6m����ot@�}�v�.]Z/^4:
0�ظ]���y��w��8�V��$=���իWȸ�ɵk���o�{���V�
ԵkW�3F׮]3:�`+W��Ν;����<x�6l�A�)33��8�"�V�ZJKK��qr\�"�b��_,�$EDD�b�h��Œ��3g�b��t��9�رC��?�!www�����FG+Ts��ՅԫW/{�K/��.h�ܹ&�&M�σ"���Q���ך5k��(Bʕ+��իkǎFG����l޼Y�
R�V���^S�NUjj�����c׮]jӦ�
d?w��E����M�6j֬�BBB�a��5��q�����Д)SԲeK�i�F�gϖ$%%%i���j޼�Z�n�w�yGW�^�6fjj�fΜ�N�:�Y�f�ر�>��c����:�ѣG5d�5o�\��_5i�$�n�����L͞=[]�vU�f�ԲeK���O+W��u�W�^���L=��*Y���y�eff��.)))�6m��{�9��m���r�$i���X,�۷o�����e�X�q��l�:u��bц
򵆒t��%�?^��_�1c�d���9��ŋոqcyyy��}�Q{QPJJ�=��ϡY�f���3:���OV�U�;w6:
���g�rNF���*I:|�����T�jU-_�\			�۷�|||m��'�hΜ9��8w�/^���d�?>۹�ӧ+%%���իW�S�N�$&&j���}/S�Lъ+�ǟ~��*V���K������4}��rpp�;�#IJOOנA��}$��ٳ���TBB�f͚%�쟫1p�@%%%��\�|�233v�|�fͲ�""Iׯ_�����~]�zU����sYYY��/$I;v��G���ŋ�f�����d2�ym�\�����o:~����ܹs���V||�"##նm[͘1CTjj�\]]%�^P�i�&�m�V�t��e�9sFf�Y͛7��������:}�����s�H�W_}���T�8���xmذAݺu��Z�\��Ge��E�����E��b�G}dt` v��BBB�$���7�c�E�I�F����Xm۶M����%I[�n�1n�5k/Ĉ��ҩS�T�BEFFj��튈�ȶ{���âE��m�6���'O�����/_���X
0@��e��u.ԁ�����h������Q�
��U�VՊ+����K����I�+b���ۊAfΜ��۷k˖-5j�$iɒ%��߱c�Μ9#ժUK����#�9s&�y�`�?~\+V����9sT�B=zT��͓����ի�7nhϞ=����}���rppPll�����k-IM�4���k����>��ӧU�re͟?�=p�ȑ�ccc%Iu���q��f�x85m�T�?�@�a�Xt��)�?��(� \�b��}ݺus=�ٲe�v�ء'�xB�֭Ӈ~���{O��(�*$$Df��~l+JS���U�D	���k̘1�}�F�R�Z�d6�$I����5z�hU�ZU����ݻ�$�w����7J�&N�(9::�F�;v�$i�ڵ9�9r��T�"ggg�����w�g���(�������w�.�՚���vl��¦s�Β�U�V�}An�ۺ����w���%ɾ�����~Prr�:w�4}�������ѺukI�[�o��V�4z�hխ[�=���9r:tH�.��V�Z�>��S���U�|y����S�F�d2�������wb�X�O�2ES�L����z��w%���ŋ5|�p<x0�XYYY9�l�ۜ8qB�԰a�l�����f�k׶��7HR͚5��K�,�㺓'OJ�:u��G���v�nnn�����;�6l�ƍ���8����O>Q���${���{Ĵi�4mڴc}��7�r�J�.}�9mN�>-I�����n�:�9sF����O�>�?�a�9;;kȐ!��/�i�&=���JHH����Z�l))kx��)IR���s�r�˗/K�ʔ)�㜭�����'O�jժںu��7ont�"  @۷o7:�'իWOgϞ5:
0;\�?�)S����\��BBB��;�(&&�o���f�g�L�ێqs�����svvε���?�ɭP�f���Q�D	��;e�Y�v�n�:������Oiii���աC-_���o���w�O鏝;֯_��y���"///���)11Q�/_ַ�~��M����C
6�����T8p@
4�����������89�����5���u�^�p@1�w�^����.@�f�Z�k�.
0@����7o��o߮�^{M���������0cdd��a��Ǐ��gdd��M�ʕu��1�ݻWM�4���ݻ7G_�ɤ��,]�zվ�Cn�M�/ooo�8qBk֬���w��3777u��I�:uҁ�y�f͟?_ӧOW�n�$I�W��$͘1C���9�ضm���իW�{��y��B�
��矵g�5m��޾g�I�v��ڵӞ={4�|]�z�i�͛7W||�����ʕ+jݺ�����a�ʕu��q�ڵ+�%$$��[�lY�;wNIII*[�l�sIII�>��[�Ν���7n�����8ȣ/��B�>�,_3x���(�l�����z���۷+==]���3f��=99��s�m�V�4i�$%$$(##C���פI�r�t�\�R׮]����5y��|�Y��
��”���7n�ҥK���e�X4hР|�i�u��ɓ��Ν;�b�hٲeJMMU�Z����#�;f9rDT���լY�\�n֬��V���ȑ#y�ӪU+I�ĉ�o�>eddh߾}�uoѢ���_��W988�wݰ\<�䓒�E�eS��>��3�,�v�RFF�~��GM�0!G�ڵkK�N�8�㜭����[��������~1��O?�[�n�5k��Q��y�)��=d���@�������󉉉w�+88XժU�/����}�*  @����/��r۹����E��ٳ�����}wӷo_U�VM���SHH��6m������>�������1m�"]�vUǎ%I}��$M�<Y-[�T�f�&I�$�Z�J�ԫW/{�ƭL&�z��%��a�M�>}T�J�>}Z���W@@����3gΨJ�*�߿��oٲe��ﯴ�4ծ][^^^���U��R�J�����?�m'���aHH�j׮�s��i��
P�>}����m+��m�[���"�x�^��F��1c��@�Á�P��Z`��?f;��[o��v�کdɒ2�ͪ[��&M��H��,YrǹJ�,���u��I���rrr����Ə/I2���ÇW����#��l6+00Po������-J�.���H���[���rssS�V�4o޼{�A��7�TŊ�����tI_��������l��lV͚5շo_�7Nׯ_׺u�����{��?���*S��֭[��ׯ�5O�2e4w�\���S^^^rtt����^z�%͛7Onnn��k�NR�b�n�-l�f�Y�޽�<<<d6�նm[{���ڷo/WWWmݺ5ǹ�[��t��]S@��
*��W_5:
� ����,�C����dRTT����r=.JΞ=��;�B�
y޵�ٳgkΜ9Z�r�*V�(I:}���t颁*44��ȏ��h�c�[���'O�jժںu��p(*���k=���Z�l��v�jt@!c����l�R�E˖-Srr�233��O?iܸq���
�EM�>}�裏***��%ooo�������w���6mڨw��:t������(d\ܤC���ɓ'�M�6jҤ�z��!��*
0��(jJ�,��c�j���:{��Ξ=�իWk�رrqq1:y�>�������Eִi���k���FG��ڴi�.]�dtPȜ�P��9RU�TѺu���O?)==]��_ԬY3��������(�5j�!C�h�ԩ��W_}U�����\�r�>}���㕕�%��dt$@!�����3�(&&F]�v5:(D\���AAAA


2:
��ow�r�J}���/���|�ݻ�z��mt�AJ�.�ڵk�j�Rp�C��ggg}����_���q�ƲZ�F�����BдiS�L&����S�F��s�N�c�BF�@!������㍎�q�ƺ|���;ftP���p���`�hڴ�~���c�|��󓓓�v�ܩ�5k
.@�ct��I�&
Sff�؈��dɒ�Վ;ԳgO���B�O��a���d2���_�P())I4:
�ӬY�4t�P�c
Qhh������
;\�"�O�PTdee������\]]�c�խ[��8��ʕ�СCգG�h���8�B�ꫯ2
.@���� �cxHEGG+88���Ĝ��t��!U�T��(�O�z�҂4p�@�޽[���FG0���W�R���P�(����u��I���{FG<\�89�7��jժ)<<\�&M��Ç��(`�+(6.\��:���]�6mҩS�ԥKyyyi�ڵFǻ�C��v��=Ζ-[�r�J%$$(99YeʔQ�z�ԵkW5o޼�sZ,I��j����̙3Z�p����t��9�(QB�*U�SO=�^�z����g0BA�qLL����$I�ٳg�dw7b�EGGkРAڼy�L&�ё��Pl$$$H��֭�����װLy��o�ᄏ����w���k�������=и� IDATj˖-ڲe�ڶm�q���l6��^>|X���^�joKOOסC�t��!�Y�Fs�̑��W�g+�v�ޭY�fiɒ%���ҋ/�(5h��h�/׮]3:pO������@�X�Bݺu3:��Pp���\؎����ǘ0a�6oެҥK+44Tmڴ�_��%%%)..N�g��ƍU�D	�?��rV�Ŵi�t��U5m�T����jԨ���<xPӦMSbb�f͚u�V���_�vMo����w�.oooIR׮]5f�-]�T%K�,�����gM�4ц
ԲeK��
�����b��_,�$EDD�b�h��Œ��3g�b��ڳg�֮]+777͛7O!!!�P�����:h޼y����ڵk�o�>�#�-�	���#'''����aÆ�8q�$��72b�4w�\]�pA�z������K�p��Νk`2ȟ��,�/mڴ���u���0mذ����S_�s��y}��NJ��Օ+WT�Z5�����С����@#""Bo���|||4{�lIRjj��̙��7��_U�r����*44Tf�9�\�7o�ҥK������4�+WN�Z�Ґ!C��ꚭ�޶�A^�Y�j�$��_V�j�r�gOOO���hƌ����U�~�ls���j���ڸq��f��7o��C��\�r�ݚ��̒������}��׺t�ʕ+�6m�h��*]�t�q/^��ӧk߾}rvv��O?�aÆe�}���S�ϟ�ŋ����ުT�b�?%%E�?��<<<�b�
98���DN�<��]��bŊZ�jU����=�m=%)33Sڰa�Ξ=�%J�f͚�ܹ��t��z�纔�-^�X�7�������G�$���[eʔ�h:}�������bfӦM�r�ڵkgt��(ҬV��V����%IU�V��jռy�$I>>>�>�t��e���G_~��~��7edd��ѣ
ך5kr�?}�t����XOOOנA�4�|�9sFׯ_�ٳg�aÆ)33�~�'�|����Z��r�222t��9-^�X�'O��}�g��{�J�Z�ly�1�7o.Iڽ{w�s��֬Y���4%''k�ڵ�߿�����8歮\�����oZ�h�Ο?o����h���*555�5T||���Ҕ����˗k�������J���3gj��ݺ~�z��ʔ)�_|Q�N�ҦM���۲e����t����򲞳f�ҧ�~��'O��JMM������SQQQ�]�^��W_)55U���9�Tjj*��
EXZZ�jԨa/�Ň�bю;��
�XHHH�$����zl3�|]�xQO<�V�X�-[��^�$EFF��F�������%I.ԁ�����h������Q�
�իWۯ]�h�$iԨQ���նm����[��u�VI�w���0$?�믒$oo�;�Q�J�$I.\�q��׌3�}�vEFF�B�
:s�.\xǜ�Z�`��?��+*22R۷oל9sT�B=z�^s��U�jŊ���U���%I�|�M�>/��&N�(777͟?_���z�)
<X111JOO��
���k��l-Z����rOw[OIZ�b�$i�̙ھ}��l٢Q�FI��,Y������XIR�:ur�ak��=...jР���⌎��b�h�޽���0:
x�(�ł���nݺ��|�������zKU�T�������d�Z����7$$Df��~�q�FI�ĉ���#GGGըQCcǎ�$�]���w˖-ڱc��x�	�[�N~���{�=I�p'���Vl���t�1������f�F�R``�J�(����+,,LR�‡���S���U�D	���i��ђ����:�5#G�T�*U�����`I�ug�v��i�ʕ����]�E			�2e�����'�<�w�Çk۶m�����ݻW�J�����濗{��z���J����������޽��Vk���[�C�I����VժU��P45k�L?���1@>Y,����FG؝���`�%��)S4e���ᆱw�}W�;3�9sF�T�v�<�o{0���ɓ��N�:���ѣ��/^����u���r+z��y���t��Y�={VU�T�혧O����U@@@��
H�N�:uǜ�����/[{Æ
%ɾ�7�Y�������$)33�sԩSGu��Q߾}����y��)""B���k�%K�h�ܹ
Զm�t��
5k�,Ga��濗{��z6L�ƍS\\������'����


����m�?��]�|Y�T�L�c��l}ES�&M��'�(--�6���Z�jԨ�L&��Q�N�:ruu��jU����� v�*�}����-��JܼsŔ)St��AU�\Y!!!z�w��y�3��͛7���y[���Z�`+8pp(�ݩ��D����}}Z�h!�Ţ.�8g6�էOIR\\�����Sݺu��ݻ�����[�����s�{��z�k�N�֭Sxx���������?�X:t����o;v^���Kn_C[w@�֤I���k׮]FG�p��)*""��(����$???�ܹ��(���iV��������V�fΜ)I��j��$�/����;D䇷��$i͚5�ƶ�����}m���6l�:v�m������[�n���s���>�H��t��}���޽[�T�z��f�M�
$I{����n;��W~ԩSG�n[�p��	I9z��-�٬%K�h۶mrppГO>�����nnn�ԩ��̙��O�>JNN�����)/ו-[V������z[���hz��T�|�lE���T��^�u�5JgϞ5:��5n�����E�(�$�Qp����l�O�:U�ΝSZZ��L�"�Ţ^x�s�n�Z����DݸqC�.]҇~(�ŢA��f���JOOWbb�ƌcoONN��]N�<yO���Sjj�BCC����+##C�Ν�…��+��ڵkz�gԠA�'L����eddh��ݚ8q�$�}���>��U�V�$I'NԾ}�����}��iҤI�r�a�n^z�%I�����:z����u��mٲEo��V�5�)_��:w���+99Y��Փ��{�翗{��zv��Y�E˖-Sjj�jժ%I�wݸU^��]��������f�E���������a���m߾��x@Ǝ+www
6��(�6d�͞=���s2:����_�~ڸq���ۧ�>۹W^y�s���W�~����ۧ���l�\\\4|�p�q�V��v�Z���+<<<�X���
����._���]����[k֬��<������6mڤ�ӧ�CB�֭���o�z_����۷o��'�xB/����8����ӧ����k�<yR����v�J�*9��u���ݻ�>��3-Y�DK�,�ѧjժ:th���_~YK�.�to�ҽ�S^ֳO�>�8q�&O��ɓ'g�����<y���'��w�}������~���
���?��H�R���G��S߾}���	P@(p���Ȼ�����v|��e�j�ܹj׮�ʔ)�%J�N�:z�ԡC���U�tiEFF*((H���rtt����Z�j�y��e{�⭷�R�v�T�dI��fխ[W�&MҀ$�^8��o�bŊrttTzzz��$�٬ɓ'k���jѢ������� �l�RӧO��/gg�\�k���j޼������套_~Y�gϖ�l���-�ʔ)��s�gϞ��򒣣������K/i޼yrss�����_׬Y�ԪU+�/_^2���������g����#�u�J���oٲ�=�}/�����ڵ�������l6�l6�f͚�۷�ƍw�<y��}��ruu�֭[s��u�V�.]Zm۶��5#�����|`t<@:tPϞ=5d�]�z��8�|0eeee<�L&������1��b�$Y�V��<[�n����U�jU-_����W��s��ٚ3g�V�\��+J�N�>�.]�h�


58a����`�~lz�1����]�&M����<gϞ�O<���P����F��;\��IMMեK��G�Իwo��O�>z��Geo�������BBBLn���ɓ'�رc�@1�dt �Z�li��㣎;��8%K��رc���ۋNV�^�3f�����t�f�����
.P�xyy)))I�Eaaartt4:�a5j�!C�h�ԩ��W_}U�����⏂�?1��jt�b�ڵ��[T�3((HAAAF���RVV�L&��1�@�0�o��ft�{ү_?�(QBFG���v_}��"##���|�����
.�m�6M�4�� �7n�(55��(�p2:�͂���r�J�cxH-]���R?~�~��W�/_��8($111JHH��㍎�G�5RFF���ݫf͚0v�EF�=ԣG�cx���4m�T�d�Z
N�”����'*>>��(�{T�F
yzzjǎFG;\�"#&&�������c�=���8=��F�A!�ӧ�,X��j��ɉ���Q�Fڵk��1��Om@�a2�������,�#xh���F�@!2�L��O�����_z��7����E�V�2:x(�EJ�.]dt���h�\���R
Sff����BR�vm�=ZcǎU���U�Z5�#��b�(22R���2��F���P����C=z�0:�����)�P�jU
<X�F�2:��������nݺF�A!��?��ŋkȐ!Z�v��q�Թsgu��������???͟?_*T0:

��d��d�S_ggg͞=[�ׯ����u��b���FG��rtt��OII�֭[���W�^�ꫯL�;\�СC�]�v��bbb'�O��ٳgaF����I/����1`��-[*::Z�ڵ3:J�ӥK�Z�JYYYFG�lRRR�{�n�ܹ�:|��233�}^{�5��E����x�
}��w�Z�9��޽[�f�Ғ%K����_|Q>>>jР�I��RЫW����[�j�� �
6�}���c///5j�HݻwW�F�ԨQ#;vL�[�V͚5
L
����rm�v��~�mu��]��ޒ��]�j̘1Z�t�J�,Y�1��ײeKI����U�r�}֯_�ҥK��G-�x�9 �,�,��1��s��…�>��^҅4w�\�P��f���g2�d2�r_�~]������������pIҥK�ԫW/�*UJ�ӧ����s\��5���O�J�����z�g��5ϕ+W4j�(ըQC��ΪV����”���k�{�y/s�߿_m۶U�R�T�\9
<XW�^���mM333�ڵk���YeʔQ�f��駟�u-�~������?׵k����?���رc�n���)�^�3(&�IQQQ


��vl�V���g��ŋ5c�}����v�j֬��_~Y�G�Α'55Us���ƍ�믿�\�rz��gj�4���ժ��=��s�W��>��l����}��*S���[�����`�~lz�1�{g����%00P>>>��ഴ4�h�"׿�?���ꫯ����g�ي'ʖ-�K�.e��+�("""[��MVV�F����?�LӦMӈ#�� /ڷo�.�j����1۹=zH��.]jD4P@��P\�zU���:uꔽ-11�^lq���t
4H���={V���JHHЬY����櫯�Rjj�s�T||�6lؠnݺ��]P�bbb�������S��f�{۴i�d�ZմiS͞=[���:|���M�6)22R����Ʃ]���͛�J�*i„	�0a�>��sEDD(++�^tqsdDD�$i���jݺ�����g�iȐ!�9s&
Ň~����+""B��v�ȑ#z�gJ

y�S�N�B�
��?��:u�h���3f�.\����…u����j��ѪY��N�8��'*>>^�W�V�.]d�Zsݭ#66V�T�N�9lm���\�%ۧ=��yw
[QբE�T�zuI�O<�y�����…s\̜9S�jՒ$
>\&L��˗�8g�ҥ�����ӧ��T�.]4x��<����k�Сz��ճgO�-[�~�رc�Y����@A��G)�%��n��7�|#I
S���U�D	���k̘19�nܸQ�4q�D������Q5j��رc%Ik׮��\��$U�Z5ǹjժe�%G��$ըQC&��z��$I����q���������$)33��L�:U%K�Ԇ
��o�^�z�8q�RSS�V O������������;wNW�\������@A�� N�8!Ijذa�v�}O�<)I�ԩS���.]�H��=zǹl��[�L��lmw��_�����lc��ūx�����k�n�III9��f����d���!�z���ӧ�'�|R���
S�J�4{��<����M���̙c߽���5j�02(NF��6��,nm/YYYَs{ ��>��r�����tp�Y���>�@QctyԳgϻ��V��:���9��
�������~��iǎZ�|��{�=�1B�
z�s��^z�%͞=[�����mۦcǎ���E�*U2:�O\�A�ʕu��1�ݻWM�4���ݻ7G_ooo�8qBk֬���w��*[��Ν;���$�-[6�9�'��@qգG�#(@/��&O���� ͜9S����ŋ5m�4M�:U�[���_��1M&����t��a���H�j֬��Ǐ��?VHH�����(�PL&�f̘!�Ţ�ȑ#�Y�&���@ΏI@m۶�$M�4I			������5iҤ}[�n-I
Sbb�nܸ�K�.��?��b�i���/N�<io�]��$�ĉ9ƶ��EɨQ���k۶mjԨ�J�(!oooM�:U����6mZ��,_���?�\�Z5I�ȑ#%IC��������$Izꩧ
�f 4h�hԨQڳg�j֬it$P(�ȃ��`U�VM��������O���K��}��U�jմo�>����iӦj߾�>��3���h������]��cǎ��'�|R�����cl[[�-
�����#�h۶m6l��V�*'''yzz�K�.���SÆ
�=�~�5j���I����$i��3g�������"���jԨQ�?~A��ɻᆱ�ׯ��/�T�Z���
�رZ��Z��:gɒ%�N�:���]NNN������%If��޷t�Ҋ��TPP�������(777�j�J���˶;śo���+���Q��钤������U[�n͑c�֭*]��}�
P����{���+�S��\]]���ʕ+�{����/��WhL&�}���#����Z�x�X��������F�)<<\III2gax��W��������C|�~��g]�~]�.]���z��e뗕������{��cǎ��:{������ڹs��]��k׮�w�sww/���)[�����J�<==
N
����OOO���gk�=�U�\�l�nnn1b�F�q�1۵k�v��ek+U�����4g��>}Z+V�$�>}Z{�������z����…�۷�֭[��ܩS�t��)-_�\:tТE����f@JG7n�(m IDAT��o���]�vi׮]Z�t������#�
�OМ9sԸqc����yвeKY,-[�L�������O?��q��I�6lX����G�>������mQQQ�VHHH�����j֬�֭[�
*h�ԩ���������]���z��wU�L�]�V�:uRFF�ѱ�<�N���z�8��~222t��i͙3G�˗�?�͜9S�j�2:
(�p�4,��j��C�Z�l�&O��ɓ'g;����%K��رc��믫w�ޒ�իWkƌrqq)й����OǏ�SO=��+W���=�ڵkk̘1�ҥ�Z�h��N�g����w��8qttT�
ԿU�^]mڴQLL��N�jt4�=0:( �p�#G�Ԉ#T�N�����A����ڵ����T�b���Q�F2d��N���S���W_�����@Qt��	
0@U�T�����������d2�u+�ժ=z�|��2�ͪY��F��+W�d�u�V�[�N�˗׊+r[�����^�����'���D���G+V��lVŊշo_9r�%I;v�P�6mT�dIyxx�S�N�����#G�hРAz�����,www5j�H�ƍ�o����5��v'����GZZ�>���l�Re˖����ʕ+��{N�~��]�_�d�|}}e6�U�re��o+R�h{H�ܹs�����iٲe2�Lj׮]�c>|XڱcG��;v�(�ɤe˖�׽@qg�*�.�b�d2)�w��5]����	��"��Q�U4��Ek�[Db�Z�mͭ��t�P�mR%%�$��B�j������֥��DA���s����������yܳ���>��f��?{EE)000�cxآ��$�M�=�y��ھ}�^�u]�v͢��A˗/W��ڳ+���������L�,�?��Oݾ}�"�~��ھ}����%ITxx������<�\oܸ��Q/������M��}���v���t�1���Z�j�^}��l�+..N-[�TFF�Y�����nݪƍ��~��G���+JII�6?www��ũB�
�۽�0?��^9͝����-[j���9�����믿��|_��l1���Q�V��(P(�s�i�{-_�\���rww��ӧ�r{����U�BݸqC�.]����Y�СC5s�L���G���7�~��ʕ+��ŋ��ŋrtt4;~�$a�Pd\�|Y���JIIш#t��	���k���0`�233���ϛ�3�ɓ'���̙cz��i
8P�o�֠A�t��ieff���<==u�M�2��c�I�?��\�C�%ԬY3�b�.(  @����ԩ�u��
%&&�S�N�~���u������k���;v��ںu��U����L}��Gf�#F�PJJ��x�
�8qB���JKKӖ-[T�V-�9sF�&M*�����[!!!ڿ�j׮�;v(--M���S�ƍe0����8~Ĉjݺ���ۧ7n())I�;wVzz�z�����*�x��
�8qB�~�����#I


2���urtt����233�~�z�y�\��H���ǥK��7lؠ������[����Pd̞=[/^�￯�>�L���rppP�F���7�hذa�z�������	&H�ƌc��Y�f�ƍ�޽����k������N͛7��ŋ%I�-2�'''K�j֬���


Ujj�Z�j�+V�v�ڲ��W�ڵ�b�
�j�J�����²ߢE�X�BM�6���������o��$�ڵ�,v߾}���S����SvvvrttT˖-#IZ�zu��v���~9����$-\�PM�6����J�(��
j�…��Ç�8�~��Z�~�4h {{{լYS˗/�+���˗/k��م~�666/yyy�w����ղeK�?�l\^�S@@�$)66�l�o��Fׯ_Wǎ�����s����޽�?x�Qp���N���+�H����\�zU=z�Э[�Ԯ];}��'f��6m�$
2�b�����N�>mjKOO�$�,Y2gbn�ƍ��w�yG��������}�]I���l�:Ԣ��_�$]�vͬ��g��$u��AQQQ��_L}�kז�`йs�
,�����3g��`0�A�}�=�����^�7n��/n�fcc�1c�H���藺����I-Z��7�|��7����?�ש]�v*S��֭[�۷oK�n߾���09::���?�������keee��׮]�R�J�]�vy�G���,[�Lvvv�N�jٲe�Nx�%%%I�����w�ĉ��|�M�9sF���Z�x��+f���II�/����\]]u������T�R��S��"�{ۍ�����Ӣ���Y�L7������ׯ�v�ޭݻwK�S���+��cǎz���eoo_`�ݭ �_n�:uJG��޽{�g�<xP�d0rӤI�l�_z�%I�O?��u��9�3�t���˗�jժ���V�ʕ�;_n��������4w�\�޽[͚5����u��Yu��Yz����k����G;w����>}��D��$��G�(RV�Z�U�VY;
`%��֐׸9s�(&&F...Z�z�ʔ)c���*)�;Vxzz*>>^G�UÆ
s5�֭[f;)���HR�...���ׯg��n�ӷo_�*UJ}���/I��_4�|͟?_ժUӆ
���Q ���^��X�t���}�:u*�c]]]�۞����9
�mll���O+""B����O?�$???�ر#��\���͝;W���j֬�>��sIR�.]$I]�vU||���������XIR���su��}p��a0x��ūH�X�q׆+W������c��'
6L666���T�Z����A�7o.IZ�~}��?��e˪gϞ�6���W�^�v̕+W�r��:w�}��)99Y�߿����$I?����^(�������
ЩS����+88Xs����իu������ϱt���������U�-������ݫ���l��s�Z�j�
*h͚5ڿ�v��-{{{u��Q�ԭ[7IҦM����?+66VO=��^}��\��;v�E��/����k�<�<==��~�ڵK���Z��edd(  @iii�����cl�j�t��A%&&�iӦ�;  @3f���_�#F�n|��ʕ+u��5��ؘ��o�>�ݻW�۷��g�S\A�R�����~��I�֮]��;j�֭��[~�_n}��ǒ�Y�fi�f}�ϟ7���ʒ���s�:�-ZX��ڵK�T�N��P�شiS
:T������O��秗_~�,&?שX�b��W_}�M�6I�ڴic�����]
6Ԟ={�'Nh����O"v�EƲe˴l�2k��	�!���7���Ǻu�ELL�lllԡC��ѣG�����������F�V�$Is�ε�KLL�������Mm/���ڴi�.�{��JKK�q�_�UӦM����F�mjo׮�$i�ԩ���2����iӦI�^y�����ё#G,��4ib�V�����ɓ'%I�z�����L���ӳ?m�4���nݺ�O>�D��[�cTX��G���MYYY6l�E���N���N����o�߽{wI�…͎�V"���1<lQQQ���lz�1�����ׯ��j(U��A��W^1�ٳǐ��nؼy���7�4����/n8p�i��ի
�u��5���>0��ǏJ�(a�dx�.\0\�~���?j׮m�d����m6���ӆr��$�{�9CXX���6ܼyӐ��fHHH0L�:�P�B�$Ä	����/�$C�N�G�1ܸq�p��C�N��NNN�3gΘ��t��C��;� �P�fMÆ
�����7o�ڵ3H2t�ڵPr����y����A�a��.nݺeHLL4����4F�!999�ʔ)c�ѣ���ѣ�7n���ox�W�U�T1\�v����A��`0"##Mq���f}��NYYY�g�}�P�X1������������$ʗ/o�u�V���;�'���p��qEEE)000�cxآ��dz�����//__�֭�����̜9S�6{{{k߾}���"""4`��l�oܸ�6o�,����D����ĉ9�Q�X1�7N�&M��[�f��v�7nX�(QBK�,����Y����E��v�5j��~�)�1�+W�Ν;U�j�B�-��/��%I�|��|��l�kɒ%:qℾ��[u���b���H����b��O?��^
4�U�9�]K�-Zh���z�gt��1999���s��;;�L�>]m۶���-��7o�;vh��9sf���;�'����[�t��A���_�>�����T�T)�i�F6l����������׶m���k��t�Ҳ�����?�?�P[�l�(���:u�(!!A���j߾����dgg'yyyi�:p�@���ԱcG�߿_={������/.777���[�F��puu��ݻ��{�V�ZrttT������Q�F�f��[^�_^���Z�`��ի�%J���U����֮]�>�@�����Y�fe;>((H111�U�������3�h��:t�E����񫯾R���믿*$$Ĭ/��)  @����m����p;\�y������-I����r&w;vL5j�ȶ/&&Fqqq��F��[�n35��@���x�=J��@n�ЁT�~}k�T$�����@ތ5J۶m˶��
�ҥKe0Խ{wyyy�^�zV��G����V�^m��Pk���Z;�GA|||���b۶mٶ���+88X���rssS�J�������+==�!g	��g���O������-oook�Q�̛7O/^T@@���G��x��͛g��x�Pp��ydeei֬Y���S�ƍբE���O�V�2��8IJKKShh�|||Ըqcu��Q3g�Tff�Y�唒��%K�襗^R���M1+V�����,Y�����<x���ؘ���855Ucǎ����J�(!www�7Ns���h۶m*[��Z�nm��oպuk�.]Z����Z���
�������
>\U�T1�9r��^���@��v����0-\��t|��M%$$(!!Aׯ_WPPP��2335h� %%%�bϟ?���%&&*,,L��9?;c���JKKS�&M,��4i��{�jÆ
�ҥ�_>w�$jժ����Mm��ɚ<y���ݫ���[��}�ȑ���?U�reIRpp�>��#���g���/�ԟ�i���{]�zUM�65���ٳg5c�mڴI;w��}�����b�
IRhh�v�ޭ����;v�$i�ҥy����TRR��ԩ���h�ٳG111�W����ݫ��XI2��#>>�t�s�NIR͚5-r5�c�%��`��x<}�t��ǫaÆ:p�n޼�#G��Y�fڴi�""",�U����Ҵh�"I��.I�9s���Ҕ���-[�H�֬Ys��N����$yxxh׮]�q�v��!www%$$($$����a�P�y{{��b�������TEEE�ԩSjٲ��������7J�&O��J�*I�<<<4q�D���jݺu��1�cǎI��V�j����nr/&&F��x�b=��s��4̟?_������Ԁ�ƌ=Z�㔔�۷OQQQ:|��6o�,����r�JI��ٳոqcIRӦM5{�l�k�N+V���|�@�Pp�ÇפI����8}����߿��nh�m�ٳg%I>>>ٮw����s��eI����E���r�ĉ��<!;			m5j�0;>��:v�}��Y�޽�EvN�>-�N��ݚ7on���@�Pp��{w�0�l�0w��W۶mըQ#mݺU�W�֡C�4s�LEFFj�С�ҥK��tsEjj�}�mll$I���}�6cȽ�����g�CŽ�K���[ڷo�<==թS'թSG/���j׮���s�����bw
����*���())I?��,X��>��TH��8777%''k͚5rss�s.e˖Յt��U�-[֬�x�ǽ������]ǎә3gT�j�|ͱ~�zIҮ]����OK��9b�y������s���ѣڱc�ڴicj߱c�)?P8(�ȇN�:�ܹs;v�:t��ի�_~�$�$rתU+͟?_�ƍ�;C�ի�ʕ+���ԢE����Y�fI�sc��`�ٳgU�JIR�5t��%''[V$''�b(*�5k���k� �6lh��P��}��qyyyI�:w�*44Tu��եK�4}�tM�6M�Z���͛8�$}����ڵ����ԿS�������g�����BBB4h� EFF���[?���
$Iz�����l�����O�>�����h�B�7ָq�$I
4�s\߾}���Ç�gϞjذ�ڵk�E���A#F�0Ŗ)SF���秎;J��6m*IJLL����ּy�9yS��'jԨa�9b�رz���k�.��⋲�������M�&'''M�>���v��I�Իwo9::��_ԡC�L�����q�w�}W^^^:uꔚ4i"{{{5m�TgΜQ���Mg�.�#'>>��)���OŋWLL�N�:%Iz��gռysS�E^�J�,���͙3G[�l�ŋ���
hРA���4Ŏ=Z_}��.\����LIR�v���k����ݻ�Y�۷oWɒ%զM�B�<ȫ;v(((��iȣ��(Z;
(4_|�ƍ��g��ƍ��R�Ji׮]���r�J�;wN���jѢ�>����o{༡���y�֮]�۷o�nݺ5j�~��'M�8Q���j߾}��.]Z�v��ĉ�r�J���o�X���t�	&��
���`0X;	�d���1�a��c�ͬY�4w�\�Z�J�+W�$�;wN���8p�`���/::ZAAA2����c������wO[k'��ѧOU�XQQQQ����(����gϞV��GOqk'PP���e���B���9::j�ĉ6l�z��%I���՗_~)+g������ȋ/��!C�hڴi���C��A�V�
���x�:t�ҥKkӦM���_������kݺu�N�H8v�jԨQ�֎��Q\\�$�Q�F�֭��L
�C�xl<*;Q���@Z;
����DIR�ڵ͎�ԩc����Q�Fi۶mV���~k8p@aaaZ�t���w�.///իW��	�_ek��S���I�m۶"�vzz�������/777U�TI~~~?~����r��u\�"�����Z�p�$)<<\���Z�d�$)44T����L9�7o�.^����S[�=t��E͛7ϊ��?ŭ�@Q��o�i�̙ڹs�RSS���޽{�C�fq)))
��͛���\�rjݺ��|�M�,Y�g,Y�d�>��3>|X%J�Ы����Ç���Q�������pmذA�ϟ�����U��N�:����l�����Ǜއ��k������ҬY��b�]���;��SRR�d����K*_��)�bŊ���^�z���%o+��)AAA


�v�
�7�?~\����Z���/_���D���W^^^���.�<._��>}��ҥK���'Oj„	�}��:v�(IJMM�?��O�:u�w��EGGk�޽����������իW%IZ�|����4n�8IRXX�iwI�y����٥. IDAT��ׯ���>�L)))f�y��Y�~����ԤI��&M�h�޽ڰa��t钧��&
.@�c�@���(I�S�N�Džm���t�jժ��>�H�ʕӌ3�r�JEDD�
.\�S�N�r����U�fM%%%)88X'O����5d����V���'�B�
�;w�"""�e�S�Ŋ+$I�����͛7�n�:���h�ҥ


2����]+$���C���/���i�;wJ�j֬i1��m�Ν\)��N�n��ڵkg{\�v��!I3f��T�"'''�7N���Z�r�)n˖-��q�Ʃnݺ����/����_��y�f���y�U�RE%J�0�Vq��5S�qG���(�����?�����������{���b���wv�;&�NAɽ����b((���:}����٣+Vh�������.@�ѭ[7k��$��`��'�q���S�j�ԩ��?�P~����wv((���$I5jԸoܹs�$I/��Y{�����[�j�L�]]]%IYYY���ÇkҤI���S\\����k���_���rpp�U������yg���˒$�>c�1��dee�ĉ�t�.]����]�����ҥK������ҥK���0߼ys}��wV�<�(�EJTT����'Ttt����\666i��������:m۶U�F��u�V�^�Z��̙3��C��K�.\?��-�i���L���r�Ʊ��������
x���ڪs��駟$�)N�P��ʕ+�r�����M�����O?mj;|���{�=���+Z�vm�r���V���pIR�:u���PIR�
oz�
*H�N�<y߸J�*I�<h�n<vss���������ܹs�p�B���G׮]�g�}�����ׯ_7�ewn�=��-[V�t��U�>c�1��y��w%IǏ�իWu��q�ڵK�������'�|��#G�w�޺u�&M��=z�?�����Qp����DIw
.�;~�6m*I�6m�.\����M�:U����ܹ�)�e˖��ɓ'���úu�>�O>�D�Լy�<�ݩS'y{{��o�UZZ��W�.///I��q����Y�LIҪU�����S�N)$$$����5jԐ$%''[�kl3�p?=z�г�>k*��ITT��t颾}�jѢEf?'

Vt�ر�bbb4r�H�9R1111+��(\���Oe˖��Ç��믫Y�f���o��)�O�>�R��Ν;�����Q�F�߿������J�*�߿���ӧ�$)$$D-Z�P�ƍ5n�8Iwv�02Q����cǎ���X�矫y���֭�J�.����nmc���z��ؖ������^o����̙����lcf͚�޽{k�ȑ�9s��+���O

.�dԨQ


ʶ�
Ә1c4z�h�����9C�{,�9bv�0�-[V���S۶m���";;;լYSS�LQ�Lq...�7o��u���˫X�b*_��z�������5�k���i„	z���eoo/{{{U�VM}��դI�Lq�G�V�ʕU�X1eff�w�#F���_�J������4i����|�wvk�k�NNNNھ}�ż۷oWɒ%զM�<�'��˗u��
���hΜ9�S�Lѐ!C�hʔ)���
���t���%$$�������O&EEE)000��ǝ���$)>>ެ===]]�vU۶m���oK�f̘�~�A˖-����C�xRDGG+((H�?��{ ���z�͚5Ks��ժU�T�reIҹs���뫁j��V�Փ��;�µs�N͞=[˖-�����V����T�<yR��w�%��{�iʔ)
Ӑ!C
%�'N�_�~�[��fΜY`��{��O>������.�#����T��8�7o�.^����S[�=t��E͛7ϊ��O�>�X�����LmQQQrssSϞ=����;}��Z�h���$}��:w�V�X���d�X�B�AC�է�~�J�ŕ+W4z�hyyyi�Ν8p`��m0����Mx��v����,���kÆ
:�����T�Z5u��I���f�iii�;w�6nܨ��]�ʕ�k������^��
F���"%%EK�,�K/����˛b*V�(ooo-Y�D�z�����C8k@A����$��dg͵Ka_޻�r���Q'N԰a�ԫW/IRll����K988X9;@Q��s�)))I5j�0�yzz�cǎ�2e�V�Z�o��V˖-S�Νt�[�n)<<\����Mm���z�
l��;w��o֬Y��

�����o޼���%$$��


�$effjРAJJJ2Ş?^JLLTXX�lms�tt���JKKS�&M,��4i��{�jÆ
�ҥK�@�x��5d�M�6M�4t�P5h��Yw[
>\�Z�R||�6nܨW_}�@����5j�(�<yRo���
�ڵk�K�.U�ڵM�)���A�@.�X�B�*oooݼyS�֭SHH��.]j*����TRR��ԩ���_ժUSrr�&O���{�*66V������7�����˚5kZ�`l۹s'�z�v�(
؉��
T``�����ٳU�n�<2�l�R�Z��G}��	�+))I�F����Ν;k������Դi�����ݻ�Z�n�RLL��~�mIҗ_~�3f�xqn��Q���@�g,LxP{a�x�����TEEE�ԩSjٲ�������o�q�FI��ɓU�R%I����&N�(___�[�N���9�s��1IRժU-�����b(���Ҵd�͞=[{��U͚5բE�|͵aÆ+N�t���+<<\��ߴe��l�Rҝ����p��ɩ@֓�M�6��W�=$I���ڴi�ڷo_`k��ck�ÇW�%�3f�{��PFF�Y�ٳg%I>>>�6��E'O���:�/_�$���X�ی1�G����lll,�o޼���zK���zꩧ4a�I�����9;;�L�2�ӧ��]�f1>==]��������z�)���K�ϟ`>���;v�<<<T�D	���kܸq?�j�Ƶv�ޝ��<���o�R�J2d��U���[�*)))߻D�Eff��O���իk�ʕ�={����M���y�f�8qB����-::Z�5����<<<ԨQ#EGG����(��ݹ¸�Ea�hq��m۪Q�Fںu�V�^�C�i�̙����СCեKIw��y?�����7ވkkk��c��7�}��׿n:�����ᡙ3g���t�)�.�����͛g1~�������H�رC���W�2e�]3##C�Z�2�Y����ɓ'k�޽Z�~��Ϣ��i\���>��xdff�e˖zꩧ4~�x���GO?��������^{M�4n�8�;V%K���W�&M���������ի�������988�Z�pPp�K�����񑏏������?h�����LnnnJNN֚5k����5ʖ-�.��ի*[��Y�իWM1���޽{u��!yyy��O?Մ	4d����:z�T��)S�hҤIZ�f���N���Ժuk���+((HgΜ�����Ge�������
j֬Y�S���?��jӦM���Ѐ
$O�Z~~~��ҭ[���������^qqq�V�Z�zP�����;����7�b��/jժU��o
t�k���f��t��M#G��ڵk���_����g��DX�ԩ�������*--MիW����$����תU+Iw��y��Qݾ}[���y{{kРA�X�
(gϞ5�ըQCҝ�����f�<���+խ[W>|�$)==]�g�V�5���1c�H������3g�T���eoo�&M��v�X�bE�k���H�/^�z��x��U��i������ӸV�6m��R���v��@�ѵkWU�R��i(�<==�T��$yyy��~S�z�Ըqc���Y�̛7O�����Itt�Z�n��+��*V��֭[+::�@���.r�O�>�<y�BBBb�נA��}�j�֭:|��z��i���#F��˔)�˗/���OnnnZ�f��6m�m۶)11�l^IJLL�$5o޼�O`E���7�wqq1��]��齳�s��۶mkvܬY3I��?���'NH��'>�+!!���4��h�"�<�����̙3
�͛7�駟Z;�<+_��6oެ�� �n�Z����ݷ�������[�����+W�n�:͚5ˢ/00P�
ҕ+WT�t�[<v�����x���?�5���4a�=��󲷷�����U���}�jҤI���%K*""B���rssS�b���ꪖ-[j���f�S�=Z�+WV�bŔ��)Ij׮�����}�v��o߮�%KZ<!�h��ƾbŊ�j|����V���z�xcLN�^�jі�<sZ+::Z666�x�z�^<�xrdee��SǎU�Z5-X�@�ʕ�vZ�����_]���?ԭ[7}����M�6���o�Q��\�R�L�w3�c@������#�ƹ��j�ȑ9r�}�ڶmk�Trgggj�ܹ:w�*W�,I:w�<�����)�'x��޽[�Z�2�����$լY3�1���:v�Μ9��U�j~Ƶz��]�vY�����
N�nݬ�����ŋ�;w���Õ���V�Z)&&F>>>����vz��A�i���jذ�F��3g�(99Y͚53۵� ,^�X:t����E����:t�ŋ�_�~�.(X\1}���w�}���(���;����(����gϞV�PԼ�曊��T�
�A�I�z���Ν;+$$D���


Uݺuu��%M�>]ӦMS�V��y���ϸ�ƍ���ڵk����Ο?�'N�E��N�_Թsg���O�ݻ�l�S�j�֭�ѣ��|�Mӿ��T���ݻK�-ZT��]�pA7nT�nݴlٲlc���q�F]�pA+V,�@���<6���e���B�7'����8q��
�^�zI��$�/��R5@�W�B5j�Ȭ���[��׿r3v�X�Z�J�v�ҋ/�h�����ӧX~ƵΟ?_`s(zBBB�d�=zTeʔ�v:������g������S)0�ԩ�BCCMmݺuS�J�ԫW/����zK�.�tg'���t�R
6�@����	�ҋ/��!C�hڴi�6m���
X;-@�z�j�������*W��1c�h���-�+U��v�ڥ�Ç�jժ*^���z�)���*..N���/���k���6��رc9����h�ȑ9r�o����'���F���S�U�^��*������+::ZŊ3ko֬��9R�76l��٫_�~z��,�)��hc���x�;Q���@Z;
@1�=�o{ٲe�v��<�-Ieʔь34cƌ<��k{�2eԬY3}���]�q7j�(m۶-��Y8���0-]�T�Aݻw�����իg�L��+S��>��s�w��j֬��Sp�7n(&&F;v���ٳ��N�������IIIy(k�����m۲mOOOWpp�������J�*���O�ǏWzz�C�ȿ���m�VTff����:uJ��y���ԟ���+pqqQjj���yD�(�������m�4
ռy�t��E��z�衋/j޼yV�Ȼ�3g�̙3�6m��S�h�o���իվ}{U�^]�/��o����d��������)>q���)t�D��=.]��	&�u��jܸ�z��
6d[������P����q���ر�fΜi������=GJJ��,Y��^zI�˗7�T�XQ���Z�d�RRR
�l�������`}��:y���X#G�T�Νe0����̙3
�����S{b999)--��i�<*n���U�VY;
O�e˖Y; ���Sxl]�~]Я��jj;z���}����L
4HIII�����+""B���
��m�ϿZ�~����ԤI��&M�h�޽ڰa��t���
xxF��={��ҥK���v:�����[o���}
N�2E���3f��S����k׮Y;
�G�p���]��k׮�N���C$)**J����*U�����޽[���f;PEFF*))Iu��Qtt���٣��իWO{��Ull�$)>>�4&>>�t�s�NIR͚5-�6�c�G����V�\�F�Y;�U�Z�'��bΜ9z�T�dIk��-WWW]�~��i�<b�Pd���X;`e��޹j�����mٲE�4n�8խ[W�ԠA�?^o���Y�ƍ%I�'OV�J�$I�8q�|}}�n�:����ֱc�$IU�V��sww7�@���߯y��i�ԩrtt�v:EBll�
�w�}W��v:�j֬�������#
.@�accc�@�d0��+JNN�$կ_߬�A��gϞ�$���d;�ɓ'���˗%I...}�6c��u��
-[�L_}�����T�V-���/���vjV�g����C��ɓ��N��T��*U�X;
�G\�"���W����N�*::Z�V��v��ޝ+�;[�9���*���h���޷�8����E����Txr%''k��ٚ3g��\��N�:i���jժ��S+N�<��;��W_�W_}��LP�(�EJ׮]յkWk��	u��M
.��g���?��C���_6�:t�"���M���Z�f�����Vٲeu��]�zUe˖5�z��)�x��5v��څ�;=l˗/W���U�|y
<Xo���*W�l՜��_�U�۷����/^�bŊY;%��|\��M�6��O>�D����u���'�X��0>n�8=zT�o����/��B���4h�)�xC�ٳgMm5jԐt�	�2�c����4h`�4�]QQQJNN֤I�(�������6m�5k���������;\�ұc�r��133S�۷׵k�����^���9�G�>�܊��Q\\�$�Q�F�֭[A��$)((H���Μ9��}��7�o߾ںu�>��={��988hĈ��2e�������󓛛�֬Y��M�j۶mJLL���711Q�Լy�91��Ο?��ݻkΜ9���v:���iw	k[�z��S�$�+WNݻw�vEV�2e�`�k�s�p��F�RPPP��[�nյk�$I׮]�֭[Rf��}��q����i̘1=z�BCCu���P����+>>��������p����t��*^������H�YQeɒ%���@����X�bruuU˖-5�|�"�ѣG�r��*V��233%I�ڵ�����o�n����U�dIӎ���駟ֵk�4h� 
I7n�PTT�ٮG(z(�ȅm۶ݷ���_]�[�9=��9>Hzz�������/777U�TI~~~?~����(K���zJ&LЦM����hկ__ҝ'�����U#G�Ԛ5k�g�m޼YӦM����Y\۶m�z�j�ٳG�ׯ�$9;;+00PԹs�L��Ν��ճgO999����x��
׶m۴p�Bk��X���������͛7��[o�����M�������YeʔQ�>}LE�w�OOOW�~���쬧�zJ�z�����Ojj�Ǝ+�(QB���7n�222��;�y�g����i�F���*W����ׯ�b��L���4a�ըQC%J�����7n�9s�<��ٳg5n�8U�RE}�{wVU��q�
�䀙e�9\gM���RoN�h��h9\s@����s(�
�+�f��b��U-5��(S�8%�ip�j"
�0�E IDAT�?|8yd�����<�����)����5d�w�.�x��Tp!"""""""'''�����aϏ?�H�
�2e
O<������5:�#g���$$$пSۀHHH`���&�GI���qrr�/��ڵkdffr��YfϞ
`*�(.��r���ڂ��pttdРA�:���Z�h��ѣ�4i�.]2:�cc�ر���������ܹsY�f
ݺuc�ƍ$''s��U֭[�;3�5k֐����A`` mڴ�?��s���T������ٳ������'=z� 33��re.gggv��Err2�/_f���L�0!�8u�T�Ν˩S�HKK��:t���~���;6++��;w��S�V-1bgϞe����GGrr2o��?����QDDDDDDD�Tp!"""""""��K�.��ӱcGZ�n͠A�˵P#99___\]]iݺ5=z��ߟ��4S����v���233�֭���t�ڕ���\w�����?ӱcGF�U��y���/##��>�����ӱcG�/_@bb"ӦM�m۶8;;��Vu-��}�_�ڶm���w�ϟo�y"�k���d��帹�Ѻukڷo�СCٲe��IIIlذ��^z�J�*��+W����6l )))�}�GS��%�������;v�E���ۗ��*T���#��Z���5k!!!���GHH�f���ήX�1���'���L�4��(����p�=JJJ
s�����+++N�8Arr2|����9�o۶�;vp��M8@͚59w�,�s�A˖-9r�����?��m۶�ڵ����b�Y���ׯϩS�HNNf���|��W���lYYY��+V��믿��͛$%%������o��"66�
йsg.]�D`` ���̝;�g�}6�qb��aeooϦM����5:���������
.DDDDDDD�r��
���۹v����8q�iӦ�蛖�ƨQ�X�v-���;����������s]	�NYYY����G������롐����d*(L��裏&99�k׮�r�JBCC��?�IXX���$%%�m�6|||L�rF�Ixx8���$&&��_�u�W???V�\���IOO'99���H�͛g��7�|Crr2mڴ�q�6mڐ��LXX�=�)�[&O��ĉiذ!vvvXZZ��舛�AAAT�Z���l޼9������Ø1ch֬Y��#b4/^̺u�ؽ{��qK�.�iӦ���1~�xRRR��O�_�>������{\�|9�x�v튍�
mڴ1l޼9�9�������y�(U��5b͚5[΢����Kݺu���7�lq�ʕ<��lٲ���r~~~$$$0z�h���8{�l��U����G�e߾}����|�s�}�m۶%11��(������(��������<J@DDDDDDD�8q���T�¼y�hذ!���̘1��������DGGӸqc�M�F�ڵ�����ӓ��pBBB�ի��#""����?��S�^=�֭@�z��W��N�"""��^z)G�Z�j`zЦ0�+**��?��5j�n�:�/_��������/��r�ʬ]��+V����ܮF�̚5�g�y�U�V��ݻ�>}z��1�A-___���HOOg���xyy�q�F��hذa�k�n;p��{����%""�;�N.N���������^bs�ƈ9E�ЧO�w��;��ѣGM!K�x��Mߗ+W��s�=g��L�2y��ܹ���m�p�̙<ǜ>}���'7���Ŗ�(s5n���O>	pׂ{�
FXXaaa̜9��ӧ3~�xJ�.��8KKK�ϟ��%oG���͍�ݻ���`t�{V�|yn޼it)�p!"""""""<'''���ڳWɝ>}:M�6��ښf͚1cƌ�ݹs'���ԫW+++jժŬY�ؾ}�]�����n��gϞlݺ5�q�
2[մ0�k�ԩԭ[�C�7o�dڴiԨQ[[[�|�M�C�r&O�L��ձ��5J\�v-�|�'��A�>}���0�_��'O��:�T�fM�>""""�`[�t)6lP��}`oo�k���U�Ɨ*e��_vaB~��V���NE�Y��n�,V�����ŋ	��_&99��ӧS�J�g$)^���+]�t�y��<2^���ADDDDDDD
A;\��������#%660_�Y�f9��?WW�\�믿�;WRR�}�,`��9��޽��ׯS�lY������.���뛾�}��ڵk����ᦢܟ�ϙ�����?~<�g��СC:t�e˖1l�0��ݱ��3��r�
`��m���>""""�`�V�����~�����M��w��m�l5k���ɓ�;w.ׂ��t?�P�C�eȐ!,[����_�:u�y��袘����[�nԨQ�͛7��<�ʗ/OFF��1DDDDDDD��Å�������<�"""̾�����e�:��0��s��ׯ�{�믿&---�>7o��믿�ў��"ɝ[�r�����ni�����r���M�t��Ν;�c���}��yRSS���Ņ/��2�r˝���x*""""�1b�&==�}��1j�(���_www~��g222�������‚�;[���+�sũS�Lm�k���‚~��ѠAƌc:vg��ܛ��d�.�۷o�|��'*^7n�0:���������v��GJ�j�8s�G��E����G������Hll,���8::z����,YB�6mr?x� �ƍ#$$�>}�[n����q�����Q�z
��WWW\]]�����o�e�ڵ,\��޽{P�bE���ILL�bŊf�M}DD��i�&�#��H>�y�Z�je�����رc�3u�T�l���i޼�ٱҥK�;`Q��\O?�4			ԯ_�5jC�jՈ��!88��/� �W^������L���OLL�駟6:��������<�Tp!"""""""��N�:q���ϟ�ܹsiРǏg���9�:;;�f��O���ɓ�[�.W�^%00����������ˁ��Ο?O���9}�4Ǐ�o��[��5K�֭�Q���ќ>}��u�K�
*p���l�B�޽�����˫�w,o��?u�}�ٳ'/^d�ԩ���P�n]~��7�|nj���Olll�Š��XSy����FG�|lݺ���F�J�pwwg�̙����9�|��<x�9s���W_q��Eh߾=s�̡I�&Ŗ�$�׿�����9�<7o���Ғ�{GGG�?�ɓ'�S�ݻwgʔ)�v=�;KKK�v����өS���q�ݲe˨U���1DDDDDDD�Tp!"""""""�����_s��9��o�!C��g��;ƠA�̎���1a����"777M+�����\�oaaA����&$$�w�}�Xrw�Ё͛7�x�b/^����0������<OOO���r�4k����/��޽{���2k����]�v��$""�pww�����""�����|_��bŊ���.��p���-bѢE�[�➫�����߬m�ҥ��[������J�����DDDDDDD��Tp!"""""""����<���۳b�
�������~�:�j�bРA������ؘ��-[���V�\��ݻIHH�L�24k֌Q�F���9i�$�.]J||<7n�`ǎ888��k�囵{����c�ƍW,�'L����%;w�$%%'''fΜI�n�
r�
�0���n��iii���Q�T)�������Z�j�k׎����v�҅ŋ�o�>�z�-���۷��e�ҩS�{�b�����ϒ%K��!"�4n�8ڶm["�~�:���
6,���%++�����U�EDDDDDDDD0Yy-�!"""""""R�,,,

2�n}���G�=�R�
!!!�~����.)˗/gժUlٲ��0�ŋ�ի#G�d���'���g�}��M��ZD�.������kp2)�M�6���G���ݻ9v�vvv�rN)���]�v�u�ֱl�2n޼ɩS����4:���������<@�Å�������<RڷoOrr2S�N�s�Δ-[���X���x��
N���5��6x�`�m�FPP�'O ((GGG
dp:)���`�#�He?�_Rf̘�g�}Ƈ~�ܹsKt.y�EEE���������d���3F�""""""""��~b$"""""""�����ر#-Z��o߾DDDP�BF�ap��=���7{{{f͚EHHqqq���¬Y��
�����C�Z�j̛7��>���Ǐ籗�����nB�hҤ	�v�b���\�p��+W���iiiFG�+�p!"""""""��ɓ'S�zuv��ٳgIKK�g��u��>�J�*1Wkn#4o�|||3f͚538�������cDzn�:F��޽{K|W
y�8p���k:u�-t��:t�+�ر��qDDDDDDDD�y�XZZ�����Q
�a�m�+)INNNDDD�䖓'OR�~�\�s��!Z�j�o�q?��;+++>��SZ�h��U�>|�ё����mt._�����K��y��F�ɗ
.DDDDDDDDDDDDP�.{��͵��ȑ#����q�F����ׯ����^0 �H�i֬���?�2e
�����M
,##�R��+�Yrr2�����?���˗7:�}��元�FG���""""""""""""����x`v�ػwo��)))̜9�>}����H�*Upsscƌ�����"�o�ܹT�V���h���C ::�1c�P�jU.]�dt�ß�ɀ���aǎ<��FG����ρ��!"""""""���y`999���dt���իIHH����������ի
L&R<ʖ-ˑ#G�С��Q�����_|Aǎy��c������M�����]�vJ�ƍ��#"""""""R �OUDDDDDDD(�6m�����"�ڴi��D��]��Eff&+V� ,,���8����]�6={��W�^�q����̪U�عs'���xꩧ�֭Ç����,ǝ����ذa/���*U2��\�2NNNlذ�7�|�r�ʕ�
�O,,,�� ���8V�X���~J\\...�ر�Ν;ci��T�-bŊl޼��-[�0e˖5:���������
.DDDDDDD䁲e��l�bt???֭[gz���Ndd$���ܸq���_ZZ�F�"::��7..������������o�����dڴi��X�6m',,�޽{�󵋈<h���k���6l�F��o��ё�z��I�J�puu5:������q��1DDDDDDD�Tp!"""""""���,�#�����y�f|}}qrr"==��۷����ƍM��Htt4�7fڴiԮ]���X<==	'$$�^�z�c�
�аa�Y��8��y$���3`���쌎"�P�V-jժet�BFF��DDDDDDD�Tp!�fɒ%�߿��"RBڶm˸q㌎!""""��7�x��""A䱕]`p���JZ�ҥ�~�:AAA���СC���C�>}��o�ΝxzzR�J�փ��f͢W�^l߾�^�z���ɓԨQ#DZ�5k��y����Aq@�,
��V%=�Q�9‹/�ht�"�ӼH!>|�M�6CDJ��M�8|���1DDDD�1�i�&}�C��!���㱵��СC,Z��~��@jjj���?WWW���L_�E���k�y�\�@�r�r�n��#"����d������O?G�D�+W���L�c�7�z��Y�fF��'��B����;AAAF��b6p�@�#�����c$((www�c��c��>��`�ݹsE���sG�;u�ܙV�Z�g��n��ѣG�'00�1c�лw�B��۪�ׯ_�x��׹���ݖ�G�Q��	&�`��y���H1�z�*���ë��jt$y̕��Ç'11����ٺu��DDDDDDD�
.DDDDDDDDDDDD���WWW\]]�����o�e�ڵ,\��THQ�~���������c��T�X���x�X��ٱ�8�ly��۳�~&L��g�}ft�Gǎ��Ϗ�>�+++�z�-ƌC�
��&������ceeet��v{y���BJ̒%Kؿ��1D��ڶm˸q㌎!""""""""b��={r��E�N����u����~��ں����Y�f
ӧOg���ԭ[��W����qrrb����*���8�<իW�~��������"66��G�QS�lY|}}quue��t����HRDQQQ<���4h�ooo�z�-ʕ+gt,�Giii��ٓ������ot�"��%*{����iiiL�8��k�R�T)Ǝ˜9s�|�2cƌ!44\]]����l|rr2ckk�k���G}t����ׯ3o�<����x�"���8��3gbgg�#wQse�cǎ1q�D<���=}����LJ2eʘ�u�=���d֬Ylܸ�s��accC�ƍ��?����Ë�������,\H�9|�0�6m�o߾FG�Bڴi��/�EDDDD䖓'O�=����@DDD�c
ҧ$��.88�C�ЪU+�x�{:�����f��xzz��兗��ٱ�W�.h�!C��g��;ƠA�����1a���
*p�����ptt$44��_~��{��c�쨨(ڵkwo-��ѣ}���Ã��(��퍎$Eиqc~��Z�li�P�<����O��O?���ŋ��S"Ǝˊ+L��ΝK�Z����nU�[�KKKV�^�c��5kL�ٿ??��3*T�u���T����~.���'���|��7XZZK΢������˗M�\�|9����w�:u*���uZZ��СC\�v��'�9VDDDDDD�*�����NPP��1D��ht�λ��޽{��~;r�~~~lܸ���,���G�z�x���&""R �߽nnn�*U���`bbb�V��ڵc���W�lYX�r%�w�&!!�2e�ЬY3F�E�:uL}'M��ҥK���'--
�.]��x�b����[o�e�u߾}�-[�N�:��1��ŋiԨs��a���FǑ"jժ������/�`ǎ4i���8%"<<��G�R�^=>��c��}<<<x���9q�իW��ۛٳg�c��m�رc;v$""��r��9,X��y�r�s��DDDвeK�/_N�ƍ9u�#G�d׮]����9�2W���Y�f
�>�,~�!~�!_}�+V� +++�n!���믿��ٙ��4֯_������*����ݻ���������޽{��Ph)))̜9�>}����H�*Upsscƌ���ODD������Օ��@<��ٸq#cǎ�\�rE����ĉ	

����|��w����[t�ܙ�[�r��a���ʔ)���;���/^4��x�"����
�t���yKD(U�V��ӓit�Cjj*�W�f���FG����ˋ+V�n�::v�ht��t�R�6m����Ǐn}��O�_�>������{�]n���O׮]����M�6�ƒ͛7�9gpp0��9/���J��Q�F��2�-gQ��nݺ��ۛv�r�J���
O.\���			�=���,Ξ=��X#��BDDDDDDD:NNN899ぷz�j�߿��m��$$$�z�j����Ƚ<x0�+W6�e:((GGG
d`2��c��Ѽ�⋦�t�x�Νcʔ)<�쳌=�����Hr1m�4|}}�ׯ��qJԋ/�h���B��{��}�2e�߹sg��m۶�̙3y�9}�4�j������]��[�YQse�ƍ����'�����z|||���',,�w�}�&M����Irrr��DDDDDDD�R��""���x*W�lt�ǥK�X�d	���'%%�ڵk��[o1m�4�����Y�j3|� IDAT;w����O=�ݺuc�������wd�ׅQ�9s�=�����b�Ν���жm[ƍ�SO=eꛔ�Ć
x饗�T����r��899�a��|���m���<,J���^�������5k��o��&!!!,Y�;;;�Ӊ�<KKKV�\��˗���0:�c+++�]�v�t�R���S�reƏ��o��3�<ct<)aG�eذaL�2�ѣG�������neeU��J�?��]����/$&&�h+j΢�u��0
�gq����ҥ[�laժU8p��ӧ��ョ�'�F�*�yDDDDDDD��p!RB�����o�MÆ
)]�4���T�V�>}��m�6���7�+���Ǐ3i�$�7oN���)U�*T�e˖̘1�s�����~�)
6�XI]������΍7>|8۷o�ڵk���s��	S������5jk׮��'==���8?~�]6(����ۛ��PRSS�v�۷ogذa\�v���o�!99�6m��ߦM���	+�k���y��xxx��ハ�cƌ�Y�fF��o�4iB�������̤y��t�ܙ�W��a�Ν;nj3Tl�hҤ	+W������(�~��-[�0i�$���{�<�P�fM��2YYY9�222�-���B�
:����Δ)S��?�8qb��!""""""R\�ÅH1KHH`Ȑ!�ر#DZ.p�����K\\\����qpp0 ��+55�w�}��˗�x��ի������7�Ǐ���kk�b�Ĉ�v.)AAA\�p�*U�0o�<6lHdd$3f� !!��o`` ���4nܘiӦQ�vmbcc���$<<���z��EDDD�;[f��Ι�����d�^z�%�?Ό3����	�������Fvہ�ݻw�����<H��(J���;���F��ǐ��%�ƍ�y��4i���8bKKK�.Krw#F��s��|������Ӵ�À�����养�;���4mڔK�.�`�|||pvv��+�|%1���YYY�:u�z��P�vmbbb�gРA<������)""""""b�p!R����Һukv��A�*U����?�����ܼy�'N0w�\ʕ+���quu-֕@u���t�����x뭷���IHH ==�˗/�s�N�BVV>>>���k���ߗ|٫������H�srr2�ʯ}���L�>��M�bmmM�f͘1cF���ܹOOO�ի����j�b֬Yl߾�د�8�:u*mڴ��ښ�M�2}�t�k8y�$5j��1>{���>""""""E1d�[��3�<���?QQQ�oߞ�������رc�3u�T4h���i޼9���8::���C�ҥY�`A��+���~�i�ׯo�Y��ɓ���[[[S��+��R<#""""""R��ÅH1:t(111���+lٲ�'�x��x����1c�z��]�v�ݻ��˗�C4�˄	ػw/�k�fӦM���fǟ|�I^}�U^}�UƎ���+;w�dʔ),\�Р�"""""r������ЬY�}ϟ?���k���^a�n�[a���/�c�V�Z��~��[;+f�r�
�ʕ�1>�-�������ȝ.]�Ddd$���FGy$lݺ��m�r��I�T����;3g����.�1�˗��̙3������/���@���3gN�<��\��׿�>}:�ϟ��͛�9kkk�.]Jtt4u�ԡ{��L�2�خGDDDDDD��h�y����2b��W����-���8��;YXX��N��ۗ��~j׮�ԩS�~��Y�}���c��~�i6oޜ���v�7����O?�4��'N0x�`�V����
U�VeȐ!�>}:������ر#���T�PWWW���sw��iF�E�:u����'��y��̞=��W��:����S�����X���e˲s��Nݩy��l۶
kkk�,YBLL�������իiԨ���<�����׏���<��:��;ݯ�SDDDD�Qa�u�v �t��{�n���ٯ8ǜ�J������	���_?�ɾ��۲e��vODDDDD���O?1l�0�U�ƈ#���<v���>�]��^�bEL�jոp�}�Q�Er[�B-ZĹs�HOO����|��W9
 �#gq�տΜ9Czz:qqq��aÆ��O?���BJJ
���̟??�߱�������E;\�Ck߾}t�ޝk׮�������ؼy3_~�%...�:������k����?�������7aaa�۷�2e���Q�x��'�:א!Cx��hѢ�Y��m��۷/)))������k���_�e�^}��\�y��a:t�@jj*��������7߰g�Z�nm��?����$S[ZZ?��3?��3k֬�СC<��3Œ�N�}�V�^Mff&�F��o�[��x�6l�|�	�V���?����?6m[�Vk
f�֭|��t�޽@s��~��"""""�jժq���=j����ѣ9�:::Khh(����%_q�y��1��3�9`�y�bŊ��Ǔ��HŊ��'&&�����M�"R�222�|����7��n޼ɗ_~���/��iӦ��_�b��sZ������jժFG��Tp!�+W�ЧO����0a<����/�Z�������9~����+���1�|�M��ʕ+M�gϞe�ȑ��矌5�)S�P�jU:İa�8r����̙3������k��lmmi۶�Y[||<���'%%��={��R�n]N�>����ٺu+o�����T�\9�9�
F�n�x��wy�������?���3g�7o۶m3��0aIII����L�<�5j�����Ç3f���̞=�b�v���{���W�^������'�|®]�r-��6m�Z�b��ż���9s�����#$$�A�q��i�~�i�;ٿT(�jN����t�ԉ3g�0�|�ΝK�
8~�8�������ٙ5k�0}�t&O�Lݺu�z�*����_�'''�/_�<������^�z��fμ|�ᇦk�������.]���ԯ_���xbccsV��ƚ�����m۶CD
�e˖FGȗ�����8p ���$�%K����ɕ+Wx�������W^1:�<@�M����9}�t��DDDDDDDDu�)�<�>���6m.�N�:���ѪU+>��S�y�Y�ti��9t��>����c˗/��͛��׏e˖Q�fM���i׮��9�ׯ7��~X�aÆE�.___�_����3�7o����Ɔ�{�͛7��������_��۷o��͛y��)]�4���
�~�)4��O?��GQ�N�������C��_rnݺ�زݮ(���ӧhԨQ!�(<����:u*��
4�ᆪe˖���ҨQ#���+���ILL��CN���杻�����e�ԬY��~��!C�ЪU+��o�����!C�Y�&ǎcРA�lْ.]��~�z���0a��o�
pss�G�E�W�9���O�����&>>�F�ѯ_?S��_~������ڵkW��y�;��~��e˖�Q�tiF��ٳgٸq��-Č�����x{{��BDDDDDDDK��BJ�+��;6��ÇgѢE���1o޼\�$&&2`�222�ҥK��Nw���Z	�NNNN9v8HII�lٲ�����ܹ�ɓ'�Xu��Ғ)S��{�nv�ؑ�u�3&G[�-�v�Y{�j�8}�4...�3����S�Z5�{��w��nW��/;����=��HJJ��̙3s�p���ٶm3g�,Ԝ���)""""򸉈��󘽽=+V���Ϗ���ׯS�V-
�ᅬ����oٲe	`�ʕ�޽���ʔ)C�f�5ju��1��4iK�.%>>����"g/̜yY�p!|����'��k׮>��ںt���ŋٷoo����}��Q�lY:u�T���W���g�F��B


2[��AӴiS&L�����y��שR��ёxÇ7:�<����7n����;��{�^�zѤIӈ������Ha��BJ���8::��/{W�܌1�s��Q�N>��s���̎���_;$܍��W�^%))��Ew��~��N������C9eʔ 33Ӭ}ڴi:�~��~��U���=zн{w�u�5���.]��ׯ��^�zȻ&�U�^z�%N�8Q��t?�O1��O�v4��SO=e����ĉ�8qb���ܹ3�;w6k˯�#�>�3��/_�ŋ�;�L�2����j�*.^�HժU�x�"���#G��t��w�/""R��\�ED\FG(�>��/���w�y�M�6�pqqqw���ȝ���;�
Ƹq�:u��q
4�A�F��B��{�OAW�ϫ�ʕ+	�\�rlݺ�
*��s��u��;Vd?_��322�^g�WAA�r��q�F�����
<��!Cؼy3͚53����o�Y��޽{ӨQ#bbb�-���իW��X���;@ݺus=~�Vٲw���(��)"""""i߾=NNN|��\�v���LΞ=��ٳx��
Nx�<�ʕ+dj

��ёA��LDDDD��.]???���Ӯۏ���Lv�؁��իW��ٳFG��Hdd$nnn��ۗE�GDDDDDDD�P*���R�*�W�^%+++ϯ?��3���Ǐ��;�`aaA`` �5�w��>p߮];����?u�+V4{�%�����\�d�֐��^������O�����a�L�
gΜa���%��(�_�N�.�5f�\����=��y������Oj����SDDDDDnqqq��ˋ�;ҢE���KDD*T`Ĉ'����5k!!!���GHH�f�R������<Һu�F���3f�=-��z�*.�^�z���kddd�i�&�W�nt4yHdddлwo�7oN@@�C����������HIQ��<��w�8x�`�ƥ��ҿ����={6���y��]�6QQQ:w���X�l�ig��|��W\�v�쇔�s����:����f��K���:t(�V���ɓ����gϞ�V��o���XYY�|���'���XZZ2lذ\����O��:t�����d�)""""�<y2'N�aÆ���aii���#nnnQ�jU�#�W͛7���|||3f��n�"""r��<y2�c���L�8��'z��ݢE��y��g���S�N1r�H�}�YfϞM׮]���&,,�^�zaeeetDyH�*U���׳y�flll��#"""""""b8\�C�k׮|��ddd�8����iU�l�&M�رc���1cƌ|�pvv`ժU9�EEEaaaA͚5Mm-Z��S�N���ӯ_?����<������ҒI�&�ڻt��G}Dff�٘��L|||��wk(��5kbaa����ڴi���8��S�cǎ%55��]�����Ḹ������ѣM;w�i��9���O����ݻ�ٱ��;�An��)"""""�����ݝ��׳�~���	

eڴiT�T��x�$""⮟�r���΂X�`(�d"""r7�.�ؑ#G�����cҤI�����/���"��ʕ+ë��jt�w��)���{����p�~~~4h��X�jٲ%�˗7:���������A�P���|��8p��]�Njj*�w�f�ȑ��曔*U
OOOӘ���.]JӦMY�n�]��=z4����^��iӦ������d���;�nC�1�b�
�z�)v��A�ƍY�t)111ddd���BTT�1NNN\�t�3f��0z�hʕ+��ݻqss#::���4���qsscϞ=�.]��c���=�~��o߾�ܹ�7n���ATT���_�ŝ�(��*\x��W�x�"mڴa�С�ڵ�˗/�����K�cȐ!�������ѡC�\�*�m߾�~��q��	���8v�ݻwg�����o˱3Fٲeؼy3����y�~���������ȃm�޽�����0s�L��郣�#U�T1-���r�S�<z��퍎p_���kDGG3f�ʕ+gt�GF)��EժU����ӧ�~�--[�����ߟ^x��zΜ9;v���|n����[�.���>����3�|�~�[�f�ԩfm5k�4=\���<������g���f��>�,AAA��ۗ�[��u�V�㶶�Q�F�<�����u�V�?N�Νs�Z�*�q�d+�`ccömۘ2e
����Y��5k��:������������%88��#Gl�^�re�n݊���Y{���ٳg}��5�e�7s���~���������<���������`���$$$���[�|���^�Ӊ���n����������H�h�yh�����/�0l�0�U����5�˗�S�N���1z�h��gΜ)�Æ
c�޽t�֍'�x4h�ܹsٽ{w���7nLdd$+V��k׮8::bmm������c�ȑ9r$G�E�=z���?3h� )U�������[9r�^�z�:r���?�����ѨQ#���)U�u����w��ȑ#9
�3[a߿l666,Z��'N0u�T���ppp��ʊ'�x��-[2c�N�>��ŋ�-��[;|�ٳ'''J�*E�Z�x�����I�&9��^���]�R�LJ�*ų�>����)"""""""""�'33��˗���F�֭i߾=C�e˖-9�&''��닫�+�[��G�����펛]4��}�뤤$6l�K/�D�J�L}*W����6l ))��TDt����^���͛�c����=
cȐ!F��B��P�W��V�*P�?���Hs�k׎v��j���-o��6o��v��lԨ�ׯ/p��vX��������鉧��!�
�ݩN�:��<RM�6��,Pߚ5k�����~��"""""���2p�@�c����c��Ϗu�֙^���Idd$7n�0�[%--�Q�Fm�G@@QQQ���ai���W�|�
��ɴi�&DZ6m�NXX�{�.ƫ����s�X�l$%%ѻwo�U�ft,y�����3g��Z�)""""""".\��������#88��""""l޼___���HOOg���xyy�q�FS�E`` ���4nܘiӦQ�vmbcc���$<<���z��EDD�iW����<�aÆ92d�8p@"����,���[�.]Jhh(�+W�w�����g�1:�<bBBBpssc�Ν8;;GDDDDDDD䁥�y`d&ܭ��…�V�ti�_�NPP111t�Ё>}�ЧO�~;w���ӓ*U�P�V-f͚E�^�ؾ};�z��s��'OP�F��j֬i�GD�GRR���L�:��e���ٳg�ҥ�ڵcÆ
���kkk�c�#����0�#F��BDDDDDDD�.Tp!"""""""�7�x��""���E��5~�xfϞ͡C�8t�˖-cذa���cggg�w��y\]]s=ϯ����<W�\�\�r9�e�e��⑒����?���,\���8fjժELLL�EX"�%22�.]��ꫯ���kt��
.DDDDDDD������1D�1��g�1p�@�c�<��ܹ"{g�����N�;w�U�V�ٳ��[�r��Q���	d̘1����{q����=naa���e�c�m�}D�xT�T	oooF�͠A�h֬�ё̨�BJ҅pqq�q��|���XYY���#"""""""w��y,i�Jɏ��������ͷ�~�ڵkY�p�����ё��XBCCqtt,�+V$>>���D*V�hv,11��GD�����Y�~=#F�������W��j�*�|�I�Z���)11*T���m�(]��ёK*ry��\2IDDDDDDDDDDD�1ֳgO�����{�����>�����)�����yإ�,����m(��qgy"_AEME��R�;�JA��IS+%4�(	�Ö,H��(D���?k=.9
�
�g�`�{�s^s�Fܿ9Mlܸ���lz�!Z�n
@�5,��z�)8v�W�^�?�୷��d2���k�k>�"--��֦MRSS�e0����H�R�
�V����Ä����\������l7� IDAT0o�<����t>�����m�6�֭kt�{�N�)��Ǐ[=�h2�HHH(���)�{o��c�$˝�QTT�k׮6��)�1cưp�B���	�����j���LJ={��������U�Z�j1y�d��z�ꑑ����;NNN���н{wbccINN��?�
гg��^���ڵ��ߟ��@���iڴi��}��U>��BBBؽ{7mڴa��Ō={{�R�G�$�x�
&N��<`t�J�G��]���"""""""R:�BDDDDDDD��N������1*�C����ә6m+W�$11��X""b����;.�+)wwwfϞ��?���
666�l��Νk�gggGhh(���899Q�Z5�ݻ7k׮�*Ԝ6mM�4�Z�j���зo_j׮M\\\�qqq�����ϖ��E*���7n�+��R��L&<<<�]�6�}�G�e�ĉ*�CթS�V�Z��sqqa��F���	R�"""�|���1D��������4:������]%66��%r󃩥u�Dy���a֬Y:'''�����DGGckkkpB�
ĠA�n����)S�0eʔ"�������f�V�N<==Y�f
�O��I�&�>}���DƏO�ڵo"R�Z�j��V��Λ7�v��Ѳe�RWDDDDDDDDDʟN��2�����at�
<���F�)��d�H��ٳg1b��m�ȑ�={���0������1c�иqc���-m���899���m`2����'�dԨQ�:�Ul!""""""""RA�)3�&MbҤIF��J�ܹs�X���{����C˖-=z43g��Oy���f͚5�ڵ����
Я_?Ǝ���
�UqGi�Q�9b�{߾}�k�.lll�ѣ�&M�A����/� ::�cǎq��%4h@�޽���˷�vvv6�-"66�Z�jѫW/&L����c��9++���H�t�BÆ
-�7�d2ɨQ���������H�QVŗ�}���-AAA��꫖���n�ʊ+�U�V�f�[KOO'>>�X'��������ȽORf������0:���&OOO�]�DDDDD�/^d�ر�:u��v��1K�ōrss��ȑ#��3g�Jrr2!!!T�Z���Ɯ�/&&&�K�.�m�6Y�n%����f�����t"##9�<��ͳ�@\\p��b˖-|��7���cggw�kޱc���t��-�8ݺu#>>��;w2dȐ�SDD�nֹsg���X�t)'N�����T"r��r�J6n�H�F����^d���Qqqq�~��FG�Tp!e�F�z`[����et��ΩS�pvv�7ޠm۶>|���@Ξ=k�wݺu9r�:0s�LZ�lIjj*.$>>��[�2x�`�<٢$;lw΢�ݻ�+VХK�=J`` ���+�֭��ϯ�Y֯_��38p U�T���Ì?�RXq��Ǐ���ұcG�=ʬY�8}�4}�&L��5�۷��m���ܶo�>\��H��DQ�<==���4:�����/������������+�V�b�ȑ*���RJJ
nnn�1�+VGDDDDDDD�BP���)<<<��!"%�e��#�����X)�����v��
\?��G��Օ��@&M�d�׮],\�gggZ�hAPP�f۶m�,~(�Ҙsƌ� y��8q"�w�.q��W_}E^^G�e���8q�o���.��@�.]����c��݅\�d�Ǐ�Y�f��i޼�U���z�j�믿2do��V�����-~��w���G�-6:��������H����PRSS�ԩ�U���k��iii4���RRR�5gQ;l�\Rsv����uǎ8u��-�ٹs�<y2G��w-///_���y��Go9wI֜�����}�~�6s��booτ	������8"E��̤O�>���P�vm�Ia�'VFEEEDDDDDDD�Ib��g�ҿ��>>��sN�:��iذ!۶m3:�]���i�殛;**���6lXyF�J���C�E:�\,P�J�[��YA'<ܩҘ�zu�_�\�v
��U��8ϒ%K8z�(M�6��'��e˖�o߾�׻�}4��Z�j��Q�5��/h-涂>K��2i�$~��g�n�jt�[�����ݝ��t������ot$)BZZ���F��P��&99����[��С�a��&S�N%66�ȇ����СC����a����>|8�[���*"""""b��M���?����c�Yڿ���|}���HMM%&&��v�-�9����N�8t�>�`��2ԇ��R�^=N�<i�~����~����o������$kvtt$==���L��effZ���Hš
]D��O��I�&^{���y�gظq#C�-�d"ŗ��Nj/�ȷ�~K\\�Z�2:��������H�S�mEJIa�ו]ll�]7wNN�f�b�С899��쌻�;������sJ��=��,Z����d�\���ÇY�hQ��O=�;v��W�����[oa2���5�����vG�J2ga,X`YۡC�X�p!}����\���'77�cǎhi?��U���瓜���˗���oY�`}��)t쒬�|�bjjj�q�mF�)""�����c�H	xxx���bt�ۖ���_|���?O�f��o
��SO1z�h^{�|�=,r7ٻw/7nd����o3:��������H��.�\ݸ����իY�z��ʕ+Y�r�!';H����8{�,#F����9����������DDDDDD������>����ǧȾ>>>�ٳ���$�����ժU�ɓ'[^׫W������qrr"&&��d��ԯ_?��ڵk����K��w��l۶�ٳg3{��|׏;F�nݬ�y�6m����U�%Ys��݉��%99WWW����z��Y���ݫG������"R	\�p��>�����9BϞ=���(���K�Ҷm[fΜIHHH9�)��={r�ĉ"O�;�.���ߘ3g}��k׮�1�m۶�뗕�ſ��/�{�9�v�ʀX�l.\��g2�0�L������G�=x�gX�h���׮]cժU�����OЫW/^x��l�b5�����w�}��O?m���>e*ɺ�;++���H�t�BÆ
-}7n��d"22����"�q�ғ��Ph����-�W�fРA�w�}T�^�֭[3o�<lll,}���

���'''�U�����{�f�ڵV')L�6�&M�P�Z5rsso;{I�,̲e��ѣիW�aÆ�=�U�VY����O����������о}{-Zĸq�ذa�U��3gҷo_lll�_�>Çg���ԬY�T�ܷo_j׮M\\\�q��ⰳ���b"""�����T��/}������0�_��/�0y�dx��N��O<��C��ꫯ6l5j�(��
�t�R�}�]����1�Hɨ�BDDDDDDD�l�)W�a�����I�f�شi�����кu�r�E}FFcƌ�ܹs����fϞ�իW8p p}ǣ�^z��'OZ����A||<���Ԯ]�j���Ǔ��	��K�شi׮]#  ���>��CK�˗/s��a>�ŋ���lٲedeeY>���c�����v55�֭����ܹ�!C��(������HY�_�~��Μ9\p�FL�2�)S�9���nnnVm�9���>ŝ����֭����o9wqƲ��g�…^3]�|��J<Wq�\�N<==Y�f
�O��I�&�>}���DƏ���ED��et)�aÆ�D~��W�l��̙3y饗ptt,��G��>`ܸq$$$P����*""""""""R�跂b���d:t�P���p��9ڵk�o�A�
x��7���	

�|�ᇜ<y�&M�0�|ڶmˑ#G�5k)))�]�???���5kFPP�5b͚5����{�nK���͛X�r%&��˗/�m�6���ٰa^^^$$$XN�(�!�-ZZ�K�����޷om۶�7��m߾}*���Ջ��lf̘���vvv����x�b:u�dpB��1c��駟���?���899���mp:)mFG�
���'%%�jժ��U�TaժU<��|����۷�����������ݮ���r2X�o߾��em�޽L�>j׮M@@			|��ǖ~�w�   �Gy�5j�裏2s�L����|c������B͚5-�U�?�rݼgxx8QQQ���:����n�Z�����%.�(ɺr��q�zA�͚7on�GDDDDD�H��� 88���~��{�W��թ
rw���%((��[�r��Μ9�֭[	

�V�ZF��{��[��nݚ�Q�"R*z��ӽDDDDDDD�1:�Bʕ���%K��d�����3�|��J˯��
@�6m��w��i}�Q�v�n��qnԲeK�\�v���k�1w�\8��x��wy�����,�C#���*�������}�k�6s#��o��O?�Dnn.�5�'�`�ر4l���R�;w��Ϗ�K�0q�D\]]
N%""r{�?^��e���8p�]�veذa�M�t��5������F�ŨQ��t>gg�2_�V233��o�ӧ��Q�������bt)\H�T�J�;�����ըQ��y����ڵ+{���O>���w�aݺuL�8�!C��r��N���˳̙������|oժ��1���*"""""R�V����'���FG)ue�9�ݨ�~�""R�L�:�����:t���6l�@^^Ç�u��t��р�"w�?���5k���;����?���ƃ>ht,�2������;?��#Ǐ�f͚FG�T�?9-R�X�z5:t !!��+W���JBB��,5j�����"��w,JLL�j7�vrr���4hk֬��?d̘1�?�e˖��x�B��/Z�
Z[q�]GGG�:73��������������u�������0k�,������θ��HNNN9���%%%1n�8x��ϟπ8v��}�=z�0:�H��z�*Ç��o�%&&F�""""""""P������d�z�EA��C���X�t)���\�t�%K�`2�x���-�z��
�…IJJ�ʕ+$%%�h�"z��Y��`2�ظq#���<��C�n�(�t����[�Y�^=�l�BNN'O�$88���]�����SSS�kn3�)-&�	��dt�R�ٳg1b��m�ȑ�={���0���]233�ڵ+qqq,Y��S�N�b�
��VD*�W^y�m۶�y�f����GDDDDDDD�R�nt�|�^x�]�v���Ā�����˖�nj×_~IZZ/���U?�|m�1f�.\Hppp��WWW����###www������)t�޽{�y�f�/_�����֭[�~�]wAsw�ޝ��X����r�}��S�""""""""""r'~��7�y����Džh޼9�G����V����X�z5_~�%��
4�駟fܸq���Y���;n>���v����H�-[FRR5k֤O�>���k���Z��xVV���t�҅�
Z�4n���Ddd$�F���޾��&�{Vݺu���oy��-F�T����^����(�~�i�㈈������TZ*��rws��?�`��<8::FHH����ҥK�j�
�y�K?{{{���x�سg�����<��3����888�xnwww�W�NTT'O��iӦ��ٓ1c�X�M�6���~���trss�s���T�Z�]�v�����db֬Y�����]��}��e������1z�h�q��ⰳ���g�-�!"""""r3///�l�bt������� "%�����1c8w-%%�ٳgs��U��x饗,��HOO'""���xBCC�]��me?~<���\�t�M�6q��5
�gǎdgg�qN�n݈��g�Ν2�2�T4m۶5:��+W��������"�%<<��3g��o���nt�JMR�m�f����?7$���3.�e��u������n���A�1hР"�sss��ͭXs���2c�f̘q��YwAsשSOOO֬Y��ӧiҤ	�O�&11�����$EDDDDD�<<<�� "���=$ro��8w��ڵ�7ޠA����|��DŽ��Z
.>��CN�<I�&M�?>m۶�ȑ#̚5���֮]����meh֬AAA4jԈ5k���ݻ	 !!��3������m߾}*��
����lڴ����___��[ZZ�&M"##��_��8R�\�|�y����3a��㈈������Tz*��b3f�~�)������p����68������TQQQFG��n՞���޽{�>}:...�;]b��ݖk�<��>�(3g���'_~��m\���[���"44����y���ǁ��7k޼�U��(==�իW�j�*Ξ=�K/�dt�iѢ̛7Z�hat$�@jԨ��_M�����"e`�޽�X�B������B�Z��Q�NvJ�ܚ��-AAA��꫌5
��[��b�
jժep:��T�bt��� "��믿ЦM�"��>}�^dq�N�:Y�s;Z�li����k׮yOFF��������}D*��r�J6n܈��cǎe„	���{���?�ׯg�ĉl߾��8R�8::A�HZZ���F��P����H�Ν���c�ҥL�8WWW�S�����HE2x�`<==��!"�TDD[�l1:�H�v�9��y
�L�N�5�*���˳����[h�5j�8��_ժU�]3��U*��C��i�&\]]Y�j#G���7s����ޣW�^DFF2b��#���������HP��ܵt�����S?�����H��������"RI]�|Y"��F���/����B�v�
������?�Lbb"�?���=11'''K[�*U�����ŋ������R��IOO'333�.晙��>"���S�L�[�nFG)5=z�`�ر���k��ۗz��IDDDDDDDDDJY���DDDDDDDDDDDD�ݻw`�ҥ���s��%�,Y��d�矷��ݻ7.$))�+W����ĢE��ٳ������-[�����ɓ'	���*���,mmڴ 555_s���HE1`��
Ula�x�b�����EDDDDDDDDDʀN�)��Ǐ[=�h2���Oi,N����V��ɛߧEEEq��v�ʰa�J}~�<^x�v��ERR�����/[�3f_~�%iii���V�\\\��z����͛Y�|9˗/�����իGFF���899C��݉��%99WWW����ɀu��ܽ�ի�ʕ+�駟��"���k���鉍���QDDDDDDDD�:�BDDDDDDD��N������1�zE�O�"$$��ӧ3m�4V�\Ibbb9'�{MBBB����������憽�=5jԠm۶,^�����[����ưa�hذ!ժU�aÆ�9��k����`�;y�d�Jݺu����[�n̚5��O�6�&M�P�Z5rss�۷/�k�&..._���8���x��go{N)_Æ
��_7:��cf͚�رc-�""""""""rw�	R����<x��1D��������0:������]%66��%r�wrZFI�>���0k�,����������m������ٙ�޲_ݺu���߿�~���̘1�3fX��3����7�������f�V�N<==Y�f
�O��I�&�>}���DƏO�ڵo�&�7�������;�����8""""""""R\H��|�2Æ
3:�������T0�U< �',,��g�2b�K�ȑ#Y�~=aaa����NDD���3�O?����pKHxx8NNNx{{�NDD��֭[y�W

b„	FǑr֣G�����!"""""""%��)3��ᄇ�CDDDDDD*�s�α�с� IDATb�
���KNN-[�d���̜9�.����f͚5�ڵ����
Я_?Ǝ���
�7~'�ř� ���Gpp0�v���Ɔ=z0i�$4hPfyرc��ͣ���{?��3�ӧ��y��			deeI�.]hذ��O�ƍ1�LDFF2j�(���o+���Ƚ��֖�� ^}�UF�\wŊԪU��t""R<�ȑ#7ns��1:�����c�������H	��Bʌ���7����\�x��c�r��)K۱c�,�7�����ח#G�X�Μ9Chh(��Ʉ��P�j�R�Ws.^����.]�Ķm�HLLdݺu888�I�3fp��!�,Y���+�7&==���`6l�̙3�
.n�c�����֭[�kݺu#>>��;w2dȐe��u��???�.]
�ĉquu58�������H�>}X�r��qDDDDDDDD��J���<x���h�c��m�����F��-���:u
gggBCCٿ?�W��:Y�lݺu9r�:�������cǎ��dzu�V��4����|�[�L�B�nw΢�ݻ�+V��~BCCqvv��_eݺu%}�����ޞ�s�r��EfϞ͵kט3g/^$((�Bߧ}��жm�|���}DDD*OOO�������#GGDJѵk׌� w�u��ѢE֯_O�jՌ�#""""""""Ť.�Lyzznt)!///�#�����X)�p�����v��
@@@�<�����;�m׮],\�gggZ�hAPP�f۶m<�T�RsΘ1�rZ�#�<B@@'Nd������Y�.]�X�_���^���Ì9��{��9�?@�f��]k޼�U�� 00������{��(r�

bڴiԮ]��(""""""""R*��
%55�N�:Y�����뛖���A�
+%%�Xs�|�ōn.
)�9�v�j��cǎ�:u�ެ�y&N���9|�0-Z��W^����S2nfn3��:t耧�'��������8r�������������(�4"R^��� """"""w@"""""""r׻���\�PT���̮R��-���…ōXl�1g��ֿҹv�U�V5$ϭ�����
�|DDDDD�U#F���?d���$&&bccct$� jԨAxx��1D�"""زe��1DDDDDD���B��?~�6m�x-**��w#6lXyF��6mʏ?����c�=fi�����urr"55�������%_i̙��durơC�x��<��o�MJJ
�ڵ�ȑ#���0eʔ"�qtt$==���L��effZ���H�mt�2���7�,YB``��q���������"R�/_V�������H���R4u�Tbcc�a�СC����a����>|8�[��cǎ$���}�Y~��G-Z���y��9z�(�-�����b�ڵ����C=�_�źu�裏0�L�Z�
�~C^^iii����v���Y�X�v��a.\@߾}�4�7�|CDD;vdժU����~�zz��I�.]��ߧ6mڐ��Njjj�Š��TK���1��TT-Z�`Μ9̙3��Ç��CIDDDDDDDDDJH"�(66�����f͚�СC-�����Htt4����SDDDDD�B�����>����ǧȾ>>>�ٳ���$�����ժU�ɓ'[^׫W������qrr"&&��d��ԯ_?��ڵk�����,OVVAAAԮ]�y��Q�zu���9r$s��aÆ
����>u�ޝ��X���quu��#99��={�8�����<==���4:��H��<y2���L�0�]�vQ�J�#I۸q#-[��S�Ne>���e>���L^^��DDDDDD���Bg2�
<����ٳ�1��6r�H֯_OXX~~~����������^�������+.\�@�-�f������X��������ݻ9{�,u����___Z�je�;m�4�~�m�����ͽ��%��0˖-cΜ98p�������c�Z������o�1w�\���pvv��ߟ9s�̂
|�������ˉ��c���V����aggdz�>[��""roۻw/+V�0:���ФI��ѣ��1�5j��ޣ{���ڵ777�#I���/�����g�\�������e.)ZDD[�l1:��������2\H�u��9V�X�޽{��ɡe˖�=��3g��dgg�f�v����N�
�ׯ���,�‘�OHH ++���H�t�BÆ
-}7n��d"22�Q�Faoo_���ׯ��ٳ��Μ9@�
���2e
S�L)rL77�|Gg�w��Ư[�.˗/������y,X���?��s<��s���Ou���ӓ5k�p��i�4i��ӧILLd���Ԯ]�D��{_ZZ���xxxED�)::����ӵkW����ܹ��Q�>|www���dɒr����C?KE��/_V�������H����.^��رc9uꔥ�رc�b�������ˑ#G,mgΜ!44���dBBB�Z�j�s�ر���l�u��Z�n݈��g�Ν2�W%""""""�z�";;�3f��憝����,^���vkcƌ��O?%<<���qrr�����t""b���(�#�H1U�R���,[Tl�N����t�ܙu��Q�Z5�#��������H))�)q�
,<<�S�N���Lhh(���g���V'P��[��#G�СC"""8x� QQQt�ؑ��x�n�
X����`y�o�>ڶm�ols���������ܹ�����O?�c�=���			ԫW�q����r���%((��[�r��Μ9�֭[	

�V�ZF��-�����ߟz��y�flll��$""""""""�H'\H�3�L�j������޽���y�\]]	dҤIV}w���…qvv�E�1x�`�m�V���Ǐ�Y�f��5o�ܪ��������9\\\ؾ};?�����4jԈ'�x��c�Xl/�s�����t�R&N�������DDDDDDnOnn.�����߿��u��Rڻw/|�{��%55��W�ҰaC�q^x��{�9�#��)Dyyyw<FI�t���Zk))\H����
@�N���z�#--
�A�8VJJJ�sedd`oo���GDDDDDD�\ժU��������(��,7'(/��)MǏ�M�6^����t�ڕaÆ�g4��?�@JJ
۶m�0:N�s��Y|||ؾ}{�k�N��ԩSlڴ�����~�zH)"""""""�:\H������F<4r����q��1.\�P�u�U�V�w��v�;�����������H�2u�Tbcc����C�		aÆ
���1|�pZ�nMǎ
H*""�:u�ĉ��������֭'O���ٙ)S�Я_?|�A�U��O?�Dtt4K�,a۶m4��?�����DQ
�۸N���,��"�@ӦM�����o~
���@LL			����㋜�������|��m�>""""""""""R����؞��ìY�:t(NNN8;;���N`` 999�RDJ�Ν;��r�bc����<y�'�|�~���S�Ү];lmm����M�6��_s�}�˪U���-"""""""� \H�����h�"����r�
�fѢE��>��Sp��1�^����[o���d�����׼�GZZ���|�{jjj���m�
/"""""""""RٙL&�IɕYXXgϞeĈ���#Gr��Y���L&"��ȑ#��ߟ>���("Œ��ʸq�pqq�f͚899���ő#G
�_�J�[~�,!!�~lllhٲ%3f��…V����ؾ};��?�7o��+4w����w��ǎc̘14i��4i���'N�(r]�|�
O?�4���ԫW�A��Y߉'�U�VԬY��Ν;3w�\����)i�����+�K�.��oҫW/�^�:
4��cϞ=��Æ
t���6m�K/�t׭QDDDDDD*7��)�����}�?��3>>>E����aϞ=$%%���mu�V�ZL�<��^�zddd���111t�ޝ��X���quu��?99��={���DDDDDD*���hjԨat������� "%��o���;�o�>.\�@���=z4�����1l$$$X�{s����ի�6m�[�fժU��dgg�f�v����N�
�ׯcǎ���<Fdd$˖-#))��5kҧO^{�5lmm�
Kn̖��Edd$]�t�aÆ�>�7�d2ɨQ����/�wTD�C�v��e���0�
I�Pqqq0����[���Ӊ��`���lڴ���nq���Z���x饗�z�����ɓ,^���;wG�:uX�n���ԯ_��s���о}{{�1��O?����~��W>��6n�Ȗ-[�ӧO�c<x�޽{s��%�z�ALL;v�`Ϟ=<�����|�
�<�YYY����\���;���;֮]ˁhԨQ�d�YY|~fYYY��ݛ�Ϊ��?�`۶ml߾��[�2`���_�j&L��>u�����_��-[����V�e�F\��n�Wy���e��Մ����W_q��Z�h���7�g϶�#�����������޽��g�R�N\]]-���M�6���~���trss�۷/˗/'..�ѣG[刋�����rↈ�������-[زe��1DDD������1c8w-%%�ٳgs��Ux[�.[����,�ↂ�sss��9�̙3������LHHU�Z6>~�x233��gnڴ�k׮Ph�;v���M�n��]�֭����ܹ�!C���zE�.d˖-L�:U']�]+##��C������ɓ���� 11�5k����'G�����r_^^^��-Z�̙3x���-�?���Ǐ��ի�����ӤI8��/�ȡC�X�x1���`�޽<��s�ZC͚5�ѣ�U[zz:#F� ''���,X���z�'N�'�|°a�8r��7�7�/�H�~��:u*�:u�o�ᥗ^���7���O?��<y2YYY������ӬY3�\����8q"G�a�ܹ���;���F���Wpp0�}��۷����Օ�U������ɓٿ?,(��b���<�����:t��$  ��?���#Gr��1�~C�(""""""R��]D*����3{�l>��s8@DD�:uȷ����S�L!&&����_�t�R�b777>��<Ȏ;�S����$&&r��iK�ӧO������7�k�.�Պ����������/}���{�|��s�h׮�7o櫯��� 44��mѢ���<�YX��u�8r�:t ""��Eǎ���g�֭��n֬�7of߾}����޽�ޠ(!!��z߾}�m�6�x�6s�w888��[o��GY�= w������+�'���{�={��3g�l�2Z�jE�Z��ڵ+����y��W������.r�0{�l�O������ڪU��������y��wi޼95jԠgϞ�_���>���?55(��bq�\��.��SO�y�fڷo���
�۷g���<��S��矄��x�^�ؼy3ݻw�v��<�����믿�����d�Z�jE�5����w��DEE��'��Z����W���p>��C�w�-5k������? ))��;u�Ď;puu��Ɔ�m۲i�&�y�222x�_��������N��J�W�^dgg3c���ܰ��#55�ŋX
/J˘1c���O	������''''���Ku.�{ٰaÌ� "`y�IDʟ�d*V{BB�e���ӧ���@@@@��E�����Iȅ��ڵ��K���3p�(#((����m�6l5����%�������?��<Ǐ�kܬy��V}D��2d����/��=�j�2:�����_�~�����+�P�N�#�+�I
���?�>v�X�|�Mv���o�Q`���LF�ɕ+W�۷/�-���������^�ɔ��%'';;��-�����N��Z�*���:�w�f����k�ĉ��{�1�|?כ6mʉ'�߿?'N�W�^4m������[ߝf�Qi|~E��������y$  ��խ[�R�
ӧO�/���O?%00��e�F\�]��?�ݩ������ƍ	&88��z�z�7n\��ikkKPP���*�F�`�֭�X�B�8�Att4'����!�7����iӦT�51ܪ=--
�A��?%%%_[˖--�;88p�ڵ"�ddd`oo���GD�=o��6�ڵcѢE̝;��8r���l�_|Q�-�9���S��N�8Q�q�����?ӪU+֯_O�jլ��^>�������_�EVVu��-�=��5I���^��r�V�Z�k3��q���3g��/��~���\/�x�g8p �*��l7*�ϯ�N�<�?�@||<$11�ȓa�u�V`{�.]8z��-�-�5������H夂���;�m߾��~����\5j�O<�رciذa��ٹsg���X�t)p}�WW�R�GDDDDD�^�����1D����������"�ZBB��k��<7���K"//�rOnnn��
:ݢ��� �p�B��5jX�/n~s��w������=�6m���-E\rw�z�*#G���ɓ|������FG2ĭNa�U������(����O�W�^�>柗�=��U�V$$$p��1��b�s�������
-�04^�x���%�T��LJ�u���o��w���/��v�Z֮]K˖-ٹs'-Z�(�l7��ϯ86l�̙39y�d��5�֞��}�1�c�""""""R���B�Z��T�ZOO�r�Lj9EDDDDDDDDD*�F���/����B�v�
�W�J���x��a���
}+NNN���s�]��#���dff���hu-33��GD�]������&���
��9_~�e��Tu�����_%>M��ѣ���T�R�u�����N�:deeq�…b�ѳgOرcG�
.��ХKȺu��E�����ԯ_?�=���%[ix���y���IKK�/�`�޽�ݻ����?��㏼��klݺ�Գ���W7�?���xxxмys4h@۶miݺu������x�}��2CY�QDDDDDD$�VH""""""""""""���ݻ�t�R��ӹt�K�,�d2���[��w�޲e999�<y����;�����   �cǎq��U����z�-L&���%�|Rō;ݷi�����|��m�>""r�,X��իY�~}�OP����&_�u��t�#F� ;;��s�2hРB��l�����b�=b��}�]�iE���9���iP�9������V�J���/��k֬�������gϞ2�v��_q-X��U�Vq��Q�͛Nj/�ȠA��N,�v�Z��������v����z�"""""""*�)��Ǐz��bʔ)���ѵkW�}�Y�L��޽{�dn�Ʉ�d*���#**�)S�0e�����m^�����8::���Ā�ѣ�����/�l�׻wo�/_NϞ=6lX�vL��7oNRR���<�����ۗ�>��Z�j1y���޽GEY�
��)j���xI3M�T�����H�7�vL��#�by����f�xɼ�Ĕ4o%(�̂�a�
50���5sT/��Z�Z������g�w�r_�X���O߾}���7��ֵk��
�…ؾ};���/�H�n��SO�'�_�p�����T�R�>}���O�<�={����ό3J�X�mї��I�*Uhܸ�����gϞ=z�A����_�>̼y󰱱a��ɦ�^�z��o[\�t�y����O��{Y4nܘ*U����ע���ˢ�f�v��_Yw6l�E_DD��낂�bϟ7oEEEfm.\`Μ9e�7X�(""""""���2x�W

�h��￙:u*!!!l߾�S�Nq��F IDAT������o��ĉ��?�Iaa�M���޽���(^}�U&O����IOO�Z>""rwIKK#--��>WWWbcc����ٙjժѲeK�Νk6�nҤIP�fM������b�̙7����111b0������ooo/^|]�NL�<777lmmM�?���GGGv��a�c�����ٳ�
ߏ��@ժUٰa/����S�%S�fMRRRxꩧصk�Ν㫯�b�ر6��U�f:g�ڵ|��iӆ%K���,Q�_|{{{bcc�>}:���;���lٲŴ��ȑ#��Y�hu��aÆ
�nݚ>��C�q��


����w��ӓ'N0c�ڶmk6���3_}����deeQXXHVV���lݺGGG^z�~���HNN毿��…dff��h�f�v=�_y4l�������ŋ�������M�!'O�,���;wā(,,d���<��S���ҰaC��y�ߣ������HUk' w�������\�xEDDDD�m۶��[o�y�f���=z4=z���{�%//���T.\Hrr2ժU��_�ic�4��f+((`�̙`0L+��X��J�CDD�$
4��:�M�ƴi��گ~?-���]�.P�)�}||���1k�Q����DGGs�����8r����;GG�R�����Ѻ�Fnnn$$$��͛�С�Ė~�#�<bzl��g����J��qg�f͚��2z�h�̙c���S�N��76$���O%���2k�,^{�5�����x��5kX�f�Y���=���4jԨ����'k֬a߾}��p�9~�w*$��y��cʔ)�3��`����3g����O?��w�}g*θ���:t(K�.5k�[�.��9����̡��QDDDDDDDRa&L���������T�=EDDDDn���@��$==���$\\\����q�Ʀ�ڵkӧO:v���IJJ"  �6m�X/��˱c�L�����9�.]Jll,���V�NDD��1b�֯_O||<S�L >>���СC���������Czz:s��%99��G�����c�=ƫ��j����?�\�1F�E�f͘3g�|�
���4i҄�� ^}�U���-�iݺ5{��eɒ%�Z����N�8���-
6�{��?��~��1����?���9sؼy3Ǐ�nݺ��ٓiӦѲe�r�Gq\\\��o�;w.k֬�_~��4nܘ~��1u�T�֭[a����+�^x{{{�}�]��ۇ��=�=�'N�駟�Y�f>��ҿ�󃂂���c�����O�{���ۗ�3g�}��=���������BDDDDDDD�8'N� 22��;wRPP���;Çg���y�F~~>���$''s��q�ԩC�޽=z4vvv��
<��:--ʹ�����͊-�T�vm�Jdd$������x������INN��Ύ.]�0a��ԩS�����9s�E��e�N�<I�:u�ѣcƌ1[U�xnbb"�ٳ{{{�|�I&N�hڵ�̙3$&&Ҿ}{�իg:�~��xzz���Ȱa�ʴ⤈���fϞ��/�̰a�X�v-���T�^��ىHE���������Pk�"B��͉��.S��q]ct�ڕ�]���{{{^x�^x���U�V|��e�7��Q��5kv�]�**��~����>|x�}Æ
3��R���n8��G����B*Ldd$			�NCD�S`` ����NCDDDD����/F���ÇMm���7[\����q�Ƒ��ej���%&&���L������)q����u�VjN]�t!22�ݻw[�͝;�u��p��9���HOO'..��o�
gϞ���СC���G������]��������윱cǒ��g���>�ҥK�	]7n$??///�񼼼صk�6m*v�J��}�Q����7o�Ǐ�����Y�HE�����_������/"""""""""�S��� 00���":t�fG``��|�����\���x>L�
����o�aѢEf;4��ő��E�֭IHH��o�e���<��#�ڵ��k��H����?~��PjN��wǎ��۹s'���|��7���РA~��7���J�jK�,�СC�����;::�
p��A/^lqN�F�X�j)))�5
�����ԟ��P��.c�1FDDD*G`` ��������͐!C����T��^z�֭[3v�X��J_U_ʯ���_|�#G�X;����BDDDDDDDny���fGi�Ƃ���PڴiC�j����`ƌ�MNN ,,��͛ckkK�&M�={6III��UXX@ժ�o"j�U�$�iӦ���E�j�hӦ�iw�+ʢ��n۶�ig�-[�X�3e�6l���=AAA�>}����ra��7nl#"""""7���-�1_�5����N�RTTĨQ�X�t)�������[X�DDDDDDDDn3����k�ά����"6''__�b�u��RǪW�������Ұa��+���Fǎ�?��#>|�ԱK�m۶f�����~�8������.]2��:u
ggg�s�m���<<<��?��ԩS�-�3������Y�b6l(�������������
.�d\�4--�ʙ\v�Z�hQl����IMM.O�8p`e�&"""""rK���[Y>�]��D�*U�s��gϖ�߮];rssټy3�=�\�q�7o6�_���1�667gc�+(�V�Z5���=?ƶ�r1�w�������<o���}�!!!���Y;��ނ�;w.�~�)=z�v:""""""""r�S�������+l۶��IB�w�&**�e˖QTTĠA�h޼�i�S�t������?����c�=fj��Ȱ�5dgg�n�:C���߿?III���ҵkW�6mj��?�d����,����c* �˟x�r�ҠA~��W����С��===����Օ�G��������Y_^^�)FDD�F�xOD�tNNNDEEѯ_?ƎK׮]���mk͚5��� ,,��� k�#""""""""�\�]�V��`۶mŶ0s�LL�b����1c+V�����2��m��ٓ���9s���o���o�>�̙c۽{w/^Lhh(S�L�Y�f�������駟����…�˓A�����ɡaÆ�mۖ��~����3z�hƌ�O<���+'N���/���?������z�����z˔�޽{	�W�^���ƾ���7�/&,,�7�x�V�Z���e��뙔բE�=Jvv�EaEvv�)FDD�zt�҅�˗[;
)�+�{���j�*:u�d�Tn[[�la��3�iӦY;�M��B�θ��Tq+����رc<��6d��.]Jll,���V�NDDDDD���_|�����ȑ#K�9r$[�neϞ=:Ԭ�z��L�4��V�Z�:u
�֭ 44�����/�����""",��޽;3g�,6�ڵk[�٪U+
tͱ�4b��l�BNN�F�2�kذ�E[Yt�ܙm۶�������Y_ff&p}�"""""R~�>���S�����o<��3̟?�ک���������mDrW����ҥK,Z��M�6���K�j�pww�_�~�����+k@~~>���$''s��q�ԩC�޽=z4vvvfy\�ә3gHLL�}��ԫW�S�~}<==ILLdذa8;;W�$"""""r�+�h���E����9{�,M�4a�С̚5����ɉ������W_q��1jԨ����ƍ�iӦ��ɓ'�p��Q
M�vvv����}�v>��s�����ӧ�Y�&?�0~~~t�֭�|#""�׿�Ejj*�k�橧�2��X��Wrvv&66��>���[�r��I\]]y�'x�pqq)�s{�^�z��{�c��nַc�����ٳg��+""�s�N��������S||<����NC�܆jQh/""""""""r-*����X�d�����ٻw/{��寿�2��_Y�
7nYYY����\bbb���$**
��ٸq#���xyyY�yyy�k�.6m�D���o��EDDDDD�D�k�f֬Yfm���ԩSǬ��Ņ��BBBJ����>>>%�w�֭�Š�ԬY���{��cWtR�fM�L�”)SJ�^I+W�רQ���@���9r�nnn9r���tƎ���c�c���\KQQ��S�2�R���S��$$$���`�4DDDDDDDD�X*�V�Z���������$%%βe�L�e����#++�֭[3}�t������&,,�]�v�v�Z���HKK��m %%��-[Z�jlKIIQ�������H1�u�F~~>ӦM���'''����;w.�ڵ�r���#F�~�z���M�����+"""""bE&L�����i����������Tp!��X`p���V۬����={���x:���7\W\rr2aaa4h��&M�0{�l���HJJ*����Q�F}�76�s}��a�ʕ���n�W�V-ƌc��nO̞=��_~�aÆ�v�Z"##�^�����8*�&N��k��Fjj*���,X��Q�Fh6y��q999���;��K��ԩS8;;[�ی1""""""bnʔ)4lؐ
6��/�PXXȽ��K�N�=z4��ճv���G}���`�͛�������rV"""��peZ�|9���t�ؑ�Z%�{8p�-ZX;
����H����\�����)�������M���tW�Ǘ��C��LJ�;�u�V֬YCFF~�!qqq�?�����+�Z@9{�l��U�T���Ƣ��f�s666h�TJe����vxNEDD*��ݻ���bٲe1h� �7o�#�<b��D�.������7n�gϞ�N���;�P�~}�}w���@��㭝��			Y;
��,gs�ܥ\\\�%::�%K�0b�N�>MDDD���֭#--��صkW��������g�gl3ƈ���������H�*((`�̙`0hР���̘1���k�'"w�Gy�g�}���`Ν;g�tn	���L�:���������������
.D�~������ʕ+��ϧY�f4o��jժ�;�{�������~.^��ɓ'y������dܸq�X�N999�6�������۴=�����������
<==M;%�*bcc9v��6�
2�cǎk��D�n��Λo�i�T�n˖-�5��S���/Z;�C��B1b���t�֍N�:
���G��F�I�ƍٳgC��C���ՋO?���ի3i�$Sl�Z��o߾t�����L�\�m]�v�97/"""""""""ry��ѣ���-??�������K�N��۷/~�!����9s��???.]�dv���<==�ׯ�)611����S�^=S\������$11�3g�T�����o����YYY�N�j��݋��? ,,���H;p�@�}˗/'$$����/_^�Y�������ȝJbuiii���Y5f͚Ń>���vvv���3r�H^{�r�999C`` �[[[\\\�f���f�SL�<777lmmM��׫W/ٱc�E�;v��ɉ�={V�3""""""b=AAAT�RE�:�rY�Ǡ�܀w�}���8�~ƌ@aa!�ƍ�O>��~������ĉ�t����4�Ç��_�]s���t��
��7��������^^^���iӦ
�S��	�M�6�7���"k�S�<�SO=ţ�>JLLU�T�vJR�^y�g߽{7QQQ���L�<���瓞�^��������ȝ������
<|}}��e�sqq1��R|||��jԨA`` ���9r777�9Bzz:cǎ����9�������n������\���hҤ	���7�
5..���,Z�n����qww';;���0v���ڵk���#((���D/^l�7[c��q�ᔔZ�li���-%%����W�������G��c����?o�*�����ݻ7����Z�
;;;k�$l۶mŶ0s�L0����f̘��+ppp��4EDDDDDD��.DnQ#F��~����Ǜ����1:Ԋ�����������TOOO��Z��b>��\\\L}������ѼyslmmiҤ	�g� ))	��5k��?���_
��3g��ȠF�xxxp�5jd�{�ƍ�bDD*���&L(v��;���M˖-IJJ�f͚�N�U�{�&66�cǎ1x�`Sې!C8v����V�LDDDDDDDnw��BnY�G��v��9880{�l^~�e�
�ڵk����z��V�NDDDDD�b8��)��PTTd�D�����u��5������s�M_:�e˖���_�5/^�S�NT�z��TN�:����ŵ�m�����;�`kkk�4*�}���ڵk�����ĉDFF�s�N


pwwg���L�>0���|���INN���ԩS�޽{3z�h��%Wb�q��i߾=���3�ԯ_OOO6lX���""""""""ע��[أ�>Jpp0���`���U�DDDDDD�T���Z;
�K%$$d�4D�jW/�s�ʒ�j�*Ν;�…���0�]����ٳ��k׮M���IHH 33ӴR|׮]M1U�T���rqc�1FD�2�m�rk�믿=z4�6��߿�Tlq���BƍGVV��-77���233���*�}�h�ƍ������e����Ů]�شi���������
.�u��DQ�5�HDDDDDDDDD�!!!ԩS���H�o�NVV�Z��`0���ͺu�0׼ְa�X�r%˖-�믿��ƆΝ;��]]]9z�(yyy��������g������s��a4h��o�I˖-ٻw/3f��رcf�qqqdeeѺuk�O����;��ل���k�.֮]���iii�b���вeK�<�m)))*���R�2""""""""""""���� �6m
��L�ݻw 44����s��EN�<�ᅬ��'�ƍ3�Nݺu�ׯ_|��O����{�1��h����l��m�k���4;��^���+��o�6m�V�̘1�"699���0�7o���-M�4a���$%%�:ցhԨ�E_�ƍ�bDDDDDDDD�K;\���������сJ�@�}�vV�^Mff&�O���ٙ�~�t�r��.nUϛ%++��ÇS�n]֯_��M�kv\�t�~�����ˢE�����+2��|�rRSS�ر#�rF""R���L�>���o�����ڶm�ȑ#ٺu+{��a�Сf�T�^�I�&Y\k���X���]���u�ܙm۶���i񾗙�Y�9"""wcb�v��ڋ�̘�����o��:x�`�c�:u
ggg�>c�1FDDDDDDD���Å�������H���+Y�����L�:����o�ΩS��p���۷og�ĉ�����]QZ�jE˖-9~�8;w�,5��o�%77�&M�����V�{�n���x��W�<y2���'==��i�����Z�צM�}�Y��\899C`` �[[[\\\�f����S֨Q��u�n��z�ꅣ�#;v�8oǎ899ѳg�2ߟ��\۷�~K�����Ϸv*��{���%�W���"��U�T�f��Ξ=[j���-`l+n\���R�8�����rZ�b����NCDDDD䖲m۶b��z�-6oތ���G��G��{���呚��…INN�Z�j����7m슞ӿ�|�MV�^m1��J��9����OE*((`�̙`0��3c�V�X�����3���~8}�t�O�n����BHH!!!e�nFF�5�I�&f}5j� 00���h�9���G�!==��c����x=�#"r����Q�jUl�T����۷/�:u������H�������ddd��c��ڍ�W2dgg�n�:�g��puu��ѣ������j֗��g��*��
ӡC[�ܦ@������m!''�o����i�e IDAT��m�C�4l���i��<==��/:����t���pqq!&&�ƍ��j׮M�>}�ر#�&))���ڴic��ˡW�^����p��	�ԩcs��)�o�N���y�駭���˱c��&�
2��K�Kpp���ʔ��OAA�1Æ
+6nĈ�_����x�L�@||<���C�VZ�""���w�ϓO>Y����Ǐӻwo�4i�ҥK����vJRF={���fΜ9���<���۷�9s�X�v�ޝŋʔ)Sh֬��'qqq|��xzz�p�B��NEEE����ҢE�=Jvv�EaEvv�)FDDDDDDD�z��B*̄	�0a����P;w�$((��i��m&>>^;�U�'N�Ν;)((��ݝ�Ç�V���P#??���h���9~�8u�ԡw�ތ=;;;�W~���ƚ5k>|�Y�ŕj׮�СC������?7\����Bxx8������ѥK&L�`�U�����9s�E��e�N�<I�:u�ѣcƌ�����:���DDD�g����y��'�8q"888���O�|�r֭[�s�=gqo���Dž�ӧ���l޼�+V��~Ν;G�:u�&88��վK*�)��,���K�X�h�6m"77�jժ���N�~����3{�i߾=���3�ׯ_OOO6l��DD��v�N͛7�o߾��9880{�l^~�eSQ�ڵk����z�ꕒ��HY���|��gL�<�ŋ[;�r��ˣw���[�N��f�����/���_9rd��#G�d�֭�ٳǢp�z��L�4��V�Z�:u
�֭�s��l۶���L<<<������k׮7��DDDDDDD�cc���D�*Ut��q��<,"R>EEE:t��Q�C*�_���ѣIJJ���Ӝ?������-�TXXȸq��O���8�<������0q�D.]�T�X�����t���ݻw[�͝;�u��q��9N�>MRR�F�����e�eΞ=���?�ҥK���߹p�G�%!!�ѣG���oq�رcٵk�Ν#//��>����S�����H���]�z5,X���S�����ٳgM9$&&^��)Ny^���(����������g�޽�����Ǜ�6n�H~~>^^^�yyy���ϦM�n8w�=ԫW{{{:w��{�W�J�>�(���̛7�y��1~�x�I�""����Ldd$K�,a�֭�N��
�'''�
6P�n]k�t[KKK��"X�h����s�=T�Z��͛����;99C`` �[[[\\\�f���f�SL�<777lmm),,.�����Ȏ;,�رcNNN��ٳ��XDDDDDDD�T��B*T�j��&1���A�""""r;�������4hЀ7�|��-[�w�^f̘��c��b�����ʢu��L�>www���	c׮]�]�??�w�8~�8��Ԝ��>����nI����oߞ}��1c�~��7���.q�-Y��C�����o�A˖-���b�̙<x�ŋlvN�F��={6��{/��������W_
���;m۶%##���l��~����Z�lI�V�X�t)ӦM�o߾T�R��{�2v��b'��WY_/�U�V0�|<==9�<III����l�2�瞔�Z�li1��-%%�T|"""w����r�j�2�����3�0n�8222����vJ�***bԨQ|���$''ӴiSk�$שv��̚5ˬ-77�������!!!����zM|||��jԨA`` ���9r777�9Bzz:cǎ�)"""""""r�Tp!j��0��i�H9W��������o��v"r��С
6�v��+'��֞���W_}@hh(mڴ��Ã3f0a�����d���hРM�4a��������d��_�j�U���'����1m�4��
mڴ!44������W_YH����n۶-ӧO祗^b˖-כ2e��{3((�����5���OFF�W�6{�?��s��[l߾���"���dž
�駟����;pܨ�^����={���x:���7f�8p�\|r�ƍ�ň����ܮ���x衇�_����ӹ�ƍ�j�*ڷoo�T�:u�֍��|�M����NNNdgg3w�\ڵkwS�1b�ׯ'>>�)S��d0:�%"""""""w\������D;w��NA"b!>>^+W���l�r򆇇�ElNN����^����U�^=rss���-���ȑ#���u�����#�<��ÇK��1ڶmk�n|~��7�s���M_���p��%��'�|����lٲ�ӧO�����ӧټy3NNN����{��	&M�ľ}�,�*�ؤ���zM�8��^{���TRSSY�`�F�"00��ի��N�:������m���UÆ
�={6���2��͛[;�U�R�7�|��i�JZ��F���ѧOV�\Ixx8���f��j�b̘17uLfϞ��/�̰a�X�v-���f�EDDDDDDD�K"7сhѢE�}˗/'55�<�f�������T��1�TD�U�T�v
w���4���I!W�_���Ž�y}�]ڵkGnn.�7o��+1n��ͦ��]�;����ƦԱ����+U�V��uI߫vvv��ۗ��86l��A�ذa���<��fW�~�m��������?���;=�P�?��0�rui�|�|||�ر#[�ne͚5ddd������߿��}�|���XDDDD�/��2.\�`0X;�wTܰa�������{�t�ԉѣG� ��z��G	f޼y�?���DDDDDDDD�C"7�+��¶mۊ��{�n���X�lEEE4��͛�V-������&##��{�Ԟ��ak0���fݺu�5���$%%K׮]iڴ�Ȅ?�Ȓ%K����߳g�٪��w��(W.
4��_%==�:�����nhR���?���Y��A��f�Sт�q����jժ��C�L�.\�(0��
EEE���_899��.R�����___|}}���b���|��'DDD�rwuu��ѣ������jv~^^�)FDD*���U�Ve�ԩ�NCn!�-bp�lll��?�1����������n�R�"¶mۊm/((`�̙`0hР���̘1����J�RDDDDD��׳gO�̙Cff&.\`�޽̙3�"�{�������~.^��ɓ'y������dܸq�X�.999���m����O�����ѣIHH���…=z���8^x�


xꩧ�-�뭷Ly�޽���0z��U��W� ,,�={�p�����c��]�^��+AÆ
i߾=?��#�6m����Ã&M���7�PXX����1c���������3V�^MAA�"<<�"�<�W�~����d�ʕ���ӬY3�7o���aܩ2;;�b<c[I�Y��ȍiذ!�v"R�aÆ�NCDDDDDDDDD��h��:�*����5���r��1lj2dK�.%66���`+f'"""""r�	

�/���_e�ȑ�Ǝ9��[��g��j�W�zu&M�dz\�V-N�:���?��u���'�����|��DDDa1N��ݙ9sf�9Ԯ]�"�V�Z1hРk�}�#F�e�rrr5j�Y_Æ
-�ʫ���ڵ���~����ooo����5k�fͲ�߿?^^^Ş�j�*�{�=�{�=�b���z�1���0���-�7<<<L_w�ܙm۶���i����	�X������K�.t����i�������������H;\�]�ҥK,\�:u�D�n�x��X�z�El~~>�����חN�:ѷo_>��C
M1Ƣ����gΜ!11����S�^=SL������$11�3g�T������Ν;y�hٲ%������s������뭝^��R��i%�e0�ӧ���ddd����Ahh(}��`0ܔ�+���Z�*�jբ]�vL�<�_~��׸Y�ȝ+--���}-Z���/��sU�V�y������ٙb������!00�����-...x{{�x�b��
&O�������f�	���'""��]�r�=�`ccC�Z��֭���;����oDD]�t�jժԫW��Ç�p�B�<K�J������2p�@�ի���-���cȐ!,^���?�����Օ?���ڵk�v��ҫ����������C1g�ƌ��eˊ���I��f͚������Ul�Jy^/f͚Ń>���vvv���3r�H^{�5S\�^�pttdǎ��ر'''Ӯ)""rs%$$��;�:n�#!!��?>������?Njj��S)�v���RTTK�,1=>�<{��e�޽���_PXXȸq����2����Cff&QQQ�ؔ\��q�F���]���ˋ]�v�i�&����NDDD�|�;�ȑ#ٰa�E��Ç9|�0�}�}��a�ҥ7<a�nr��Q6l��
طo�V�*1�_��k֬���*�ŋ���?IOO'==�>���?��buz���v��;,���P�N�vBBB		)��>>>�����߭[7�u�V�\k֬i�ա<cWpR�fM�L�”)SJ�^I�*��>ikk�ƍK����3aaa��.����iӦ1mڴk�S�����__�RcjԨA`` ���9r777�9Bzz:cǎ����c���[�|��S�28p��S�;Daa!���:t��������8����`Ŋ�NADDDDDD*�
.�d��6�|<==9�<III����l�2S�E\\YYY�nݚ�ӧ���Nvv6aaa�ڵ��k����GZZ�iW�+'����вeK��m)))*����������СC4hЀ��z���<���-���+V����&))	___���K�V�G��hڴ)�����Xo����_ҨQ#�������UTTd��������ݻ����u��1|�pjժ��O?]�"ף[�n���3m�4|||prr";;��s�Ю];+g(��#F�~�z���M�*������T�X;����ӧ+u���/��s��߳c�\܀:��B���kEDDDDD�L�%%��X�p���VռQ����={���x:���7��%''F�
hҤ	�g���Ϗ��$���J�4j�Ȣ�q��f1""""���s�q��!�qV�^�=��c�ߢEf̘���]�ve۶m,\���^z�Jߞ���Cdd$۷o��'���ߺu+��Çg��VȰbU�V�z����O��O0u�T�~�mƎ��?������S�;L�>}X�r%��ᄇ���ժU�l������ٳy��6lk׮%22��ի[9;�����B�>}HKK�Y�f�2�?��V�\Ɇ
x��+e�;Մ	�0a������X;k�8q"���������2h� bbb8w�Y\NN���xzz�c���K�ԩS8;;[�ی1"""rw���f̘14l�{{{AAAdee_�J�kWKKKc��ԭ[;;;��ݙ6mgϞ5�۱c6l�nݺ�Z�ʢ��J�[�6MZ���-����ψ#pss���777F��O?�T�}|��w���jժ���/�v�*���~��q��ѴiS����{x��Gy����?�=��������Q�>}X�~}���vc���z�璾���-s���Ã#G��r��k^�ܹs���t��
WWW�V�J�:ux��ٺuk�ǿ��,�B�z������Ãu�֕��Xה)S		�e˖T�^���������f���裏̼y�7o�Ǐ�����i���-���t�/_NHH!!!,_���)�:���/V�x���|��G���УG�J�NT���С�r��h��tW�\a�٢"w�����;vd�֭�Y����>��C���?~<���������\=i�j�?���X�6����ǎ;x�g8}�����ѣ$$$�j�*>��kN��������O>�����/��:�ܹsٴi;v�F����0n�8j׮}ͱF��C=�c�=f־~�z@AA����~�O>a�ʕ�^���]���[���M���Νcݺulܸ��[�ҩS'S�w�}�O<��3gLm���������,^����T�ޛ���n����ё������Z�_���ի�:��F�/��\lllf��Ѭ]�����cϜ9���7?��Y�ɓ'IJJbÆ
�]��g�y�Lc_�Drr2���3;g�����׏%K��i\�\666h�TJU����ln���5���+l۶���ݻwŲe�(**bРA4oޜGy�
�����jժ,\��Ν;�СC+l����O��|P���|�U�F||���.��[�z�����Lr�rqq���___���ؼy3�|�	����@vv6�֭�`0�{WWW�=J^^���f}yyy���:u���Μ9äI���#==���hbbbd߾}f�wW:g��O����S�/���رc�x�"�ƍc�ԩ������ʨQ�ؽ{7s����_`�Ν<���e�{{{�t�b�v��QLAA���㭷ޢY�f���O����f�HVV��׷��Q��ݻ7���
�ڵ��������7�4�bҤI�9s�^x�)S�ШQ#.\����~��������^��?�)�]�z_�+��=z������O4k��Էo�>:D�^�ptt�����<W��ՅW�~ࡇ⣏>�����ә4i�|�
o��V�
.��{��?�$00�tNXXM�6��/���j��*""""��m۶�^PP�̙3	0�n���ό3X�b�EѼ�ȭ�cǎ�;�W^y�>}��ia��Ѽys����Y�&0`�v"�?^""""""w �e�E������ӓ�+W���O�f�h޼9py��ݻ����x�"'O�����ӓq�ƙb�;U����Z�h@vv�E�6c������>��#�;���Ӊ���iӦT�^��;������/����|P�uRSS�5k�����*�.��fРA,X��ƍS�Z5�v��ҥK���OM���GZ�ly�5�|Ξ=K���Y�j=�vvv<��C�Z���ݻ��U�ݺucժUt��GGG�q>��c���k������~��M�R�Z5�f����Y���v���w���������Mnt��<ϕ��.�.Q�
�K�,�s��888`ooO�L�K�ٳ�Lc^���̉'�ѣ�V��U�V���Ѯ];���Z�n}=�/""""����i�)�V˱c�<x��mȐ!;v���X+f&"R�9s�`kk�ԩS+lOOO�M�Va��*���҈#�˫�v�֍N�:
����)n�ȑ4nܘ={�0t�P:t�@�^����O�^�:�&M2�֪U��ZY߾}�ܹ3���9ۺv�Zw("���{\����*�dĆ�aÒ��1s�$9'���ЬO�C��0#��ՕC%�aʙHkJ��S�j
�(�����z��:KWx�o�n�ޯ��z=���z]��BT4��gΜ��)S�X`)))�;�'O�0`��/_����ѣ���ikffFvv6����R������a	�DSPPT��9��\��r��СC�?c���w�}����k���<x0�����ʾ��ۓ��MBBB�Ŗ[Y�ꄊ�~�I�\�]X�ų�_��\^�U���Ǐ�w��M���5>������~��R�߉�G�===e�!�B��d���X����ٳ'}��e���Z����X�~=���{2��7�����qrr��̌���c>�<(�;�#w2Hjj*���t�ڕ
(u5j���������>�� �Ϭv��|��wxxx(��
�,*Z��+W
���燽�=�����.B!�B!�jz�@����r����
===����q���_�^��d�y�P�R�e�N�8Arr25k���Ԕ�ӧӲeK��ܹsٰaIII�
��v�ZΜ��� IDAT9Ä	4b8s������ׯ�X!�����q���]�VྩS�r��MZ�l�Ν;�R�����X:u�T������w����Ԯ]�X����������yJ�f͚deei�ϛ7�I�&q��yΟ?�|��۷/C��O>�����b˭,޿f͚Ѿ}{Μ9Cjj*�j�"%%���`Z�j��(��Kr���Ç�����q����+���\�p�������u|i~'ԉ�]�v����{�x��7n{���uB�W�����CB�´i�HII�ѣG�޽���,e�����O��|�HLLD�R����+W��ё��pV�\���)�5"))	WWW4h��y�d���9BZZ���Z����	

%00��Ç?�+ ��n���l۶�͛7ӳgO]�#D����/9u�T������qssc׮]dgg3z�hZ�nM�Νu�B!�B!*"I��,,,,��gdd��hR����ӿ���5kbmm���			4i����"""�6m5j�(�I!��Q�U
��e�����U����SV���@�W�hٲ%aaa\�|�nݺ�'O�����a�zvւ6jժ���ԫ�ĉ�]�6�|�
/^�?�`�֭lݺiѢE�Ė۳�j���o�%((+++>̓'O
]ݢ,�/�u./��Vԟ��k�.�͛�$K�Vi~'�״�Đ�^{�b�F�����8�wH�S�f�pvv�aÆxxx�R�8qℒp���ELL:t`޼y����������߿KKKjժ��ŋ���c�…l޼�E����CV�\���aaaʌݹ��m۶Z�˂��%�BQ�yyy�XW�	]L�W�S�N�[���΂1b�2щ�������ߟ�ի�g�B!�B!���$�B����֖���퍃����ccc���BQ^j֬����w�^�W���ߘ5k�*U��ˋv���Gjj*<(V�z�",,�#G�+���իt�ڕ!C�����<�~��=RRR�[���1���Sb+Æ
cذa���s��1Ξ=�ٳg�z�*ׯ_g����߿��c{��/7u��������Jyy�_R���T�TI��ѣGe�ɓ'��W�P���aܸq���[�9��͛S�~}ڶmK�֭��gi~'��ܻw�z��i��EY�???]� �BS'3U��AN�6m
䬖�R�4����pqq�q���h�ggg,--	����Y����ooo>��S���;vl��]�\��$�ռys�:BQQ�7^.���,*W�\ш��_��OOO���3f�R6v�Xv�܉��'vvv:�N!�B!��$\�
���jϪ��H�^�:���̚5������~֭[W!gB!��ѲeK.^�ȹs�4hP��{��cƌ!--�%K��B���	DGGӣG�"�3f�}��6mbΜ9����������&&&���/���2p�@�c.\���+KM�6eҤIL�4	��~��!C�(�ul�}���ٳ'FFF:t���l�9B͚5��ʥ��\�2YYY���i%�\�~�����)���2�к˖-`���L�6Mc_bb��8s��w�C��={�_~�EkE;����I>B�+��ٺAQ�?éW'���R����
S���jlϘ1�.E�-���ϋ���ݻ����e�:B�2�9s&իWg��պE�P�$���,���	$11}}}LLL:t���X�ziiixxx���M���4hS�L���@#��1������K׮]iР�R�Q�F����������T!�B!�/?I��t��;;;V�Z�ܬ355�qTB!�(O��ŋ,[��~������Q��ϏѣG3h� ��s��,e_�>}�����V�Ett4o��6͚5��͛@�����#((�ѣG����5j���[�X�j�+Wf�ܹJ����_X�r%����x�=++K��ӷoߢ/R�7oN\\��Ѵo�^c����V������_^zzz��׏ݻw���Crr2C��jժ��qթS�;w�J�>}4��T�gn�����믴lْO>��к����˹�Y�Fy���^�j%���6lgϞe������O# ;;[9F�-KKK���u������޽{u����I�ř�[___y�_gQIT<(I��R��_"��L�K�/;���ٳg��C���۷oW�333���"**��*+��^FFӧO'&&F�����J�"::77�B'�8r�iii�~�hnnNhh(���>���]!�B!�/6I���6S����<0$�B�����ذa���8:v�����e�֭��������~6l�@ǎپ}{���f�ƍxzzҨQ#f͚E�Z�		�/�`�ĉǸ��ӵkW:D����/4hM�6%33��ׯs��!V�^��۷Y�p!�:u��s����8q+++\\\hٲ%���̛7��'OR�F
fΜ���p�ر���2r�H���{��ͩZ�*�/_V�@r�ZP����+��ٽ{7.T�˳���ٳ'���c�ԩxzzbffFBB6l`ӦM%n�ɓ'���߄�����F`` ���xxxh%��մiSbcc�;w.�-�~��\�|�+V�c��ޝ;w�L�(���g�}ƚ5kd�ȑ,]���-[r��5�ϟ���K|=D�F��ȑ#u�����)	B���������YÆ
���Ү];bbbpss��޾�c�իGRR)))ԫWOc_JJ�RG!^V�6m��ɉ�7�J�x5��p֯_���������ʮ]��D������"&&�:0o�<LLL�����Ņ��P��ߏ��%aaa�&oжm[�X�e����p!�B!�BI�B!��<4i�F���c��֭�V��7ҹsge{ɒ%DFFbhhX`��Z[�j�ƍ�2e
˗/g�����{�=5ʚ7o�<|~�ڵ��T��…Y�x�F�믿���7#G�d߾}�۷OcժU�Y�f�_\_�5�����~���Z��4i·�~�\b+�W�A�Q�R%nܸ/�,�/����s��bcc�ի��>www�N�Z��E%�c����"cqpp`�ԩlڴI+�c�����r��5~��g�6mZh[����U��v�b���޽�ݻwk�R��<y2U�T)�\�B!����Ӈ�[���䄃��Z��޽{xyy�c����ؼy3?��3>>>t�ܙ͛7cgg�Ν;�ի]�vr>�fgg�|mӦ
III���i%V���)u��e��~>��s������p^y�����s�5j������q��{�fĈ�1�T������UU7n@�-pvv��Ғ��,--��ʕ+�~7ؼys�:B!�B!�x����B!��L
<���&O��o����>�kצ_�~j݌�~�z���<y2�N�bРA���k��[o�t�RN�8A�jմ��СQQQ���3p�@�����קZ�j�nݚiӦ��l�6d�.^����
������all̄	/��fIq��y���kڵkG�����ӣe˖|�嗄��k� -��J����ؘw�y�����$P�������XXXP�N�֭?���}�Y����ӣ~��������Llll���g�}ƶm��ܹ3U�V��Ȉ�>���~��%K��`��Ḣ��w�G�DDD0a��������1c�9�WCa[�>}{{{���O����ׯ����={���mffV�C4���燽�=�������:!��Y�y��DFFbccC�n�0`;v�Z�j̙3���T����Q�K�,AOOO�^�h���ԩS+++��|n�����_]�7�Y!^ǎ#44���.\`�رL�:Uk!�fϞMժU			��c��ѨT*=zT�z���XXX(�c333廝���B�{�.�3�F^�2u!�B!�B��d�!�B!�Q�֭���(V����T}��ի��T�Z��>��T��k׎;v��zU���]�6...����$�������/����755�Z����8�kc„	L�0!��Ǐg���%����-[�d۶mZ���(cc��'^L_~�%�N�Қ����,\��cǎi����?�>}�ӧOӯ_?/^���A��]ф�����Ʈ]����f��Ѵnݺ�V�B�j*������T*�l�‰'HNN�f͚���2}�tZ�l	���+���/Vf�nܸ1,Z�WWW�-[�ܹsٰaIIIddd0`�֮]˙3g�>��9sCCC�����"����o�%!!��/�������͛2��>������(B�W޿��d}]�)Փ�<y�}��q��%6n܈��3f�`���%�W�P<(t�z��ʕ��T����B!�B!^
�p!�+�2��XQ~���9r���B!�й5j����իWiժ��-[�ХK��M�S��-_�lǎ��А)S���ҰaCRRR		a������ϒ%Kʬ|���΂1b���dee����z��:�P!�˨�����)�0dٲe,[�L���?��?V����O���5�ԬYkkk<<<HHH�I�&$$$��i�de4!�iÆ
���۬^�GGG�}���L�>GGG�T���ŋ���,,,����رcl۶�5k�(�ŭgllL\\(�D���#))����ի��/%%E�#�B!�B!	����dԨQ�C!�B!J�[�n�<y�ѣG�j�*�u�FժU����ٲe�~�-S�N�q����0;'@DD�R�h޼���nݺ<��ݻ3f�1b;v�]�ϑ��'��Ɍ3F);v,;w����;;;F'�B�[[[<���7x{{cll������B��111a���,]��Q�FѢEe_ժUK�X.^-C�%!!GGGL�V���?4VN)n�>}��u�V���ppp�U�Vܻw///v�؁���7orV����&>>��M�ЦM�������J����S�!�B!�BH…xn�����uB!�BQj�W��o߾���ӷo_���*U��Օ޽{�p�P�o�fݺu�={���tLLL�0a���45������ ((��������3h� �L������ܯ���طo&L�H�ȭnݺ��ذn�:~��G%�B�Npp0���a``@Ϟ=��/�_�~�}�t������;Ǐ�Ν;ԯ_�?���S�bhh�Վ��/k֬!22��U���G1{�le5���,���	$11}}}LLL:t�Ɗ�������ҵkW4h��7j�333|}}?~<�j�*�mB!^xիW��ٙY�f1~�x���Ϻu�V����B��ꫯ���aƌ:tH�����-...�����ꪱ��Դ�&N��ɓ'����Jj�V�s��Q��ԩ�ݻw�����ؘУGN�:Ett�F���������NZ!�B!�/I�ύ��!ċI���B!ī��Ԕ��(V�^͑#G�y�&���4jԈ�={2k�,�w��0E>dʔ)ܺuK)�|���l�[FFӧO'&&F)KLLD�R����+W.��K�.��SϞ=Y�n���Z�V�X��x��DDD��兑�Q�'�˃���O�q�R����������T*jԨ�q̴i�HIIQ�޽{7YYY899�����ە����DEE�Ç7nG�!--
sss�����	

%00��Ç�|�B�U�.]���cժU̘1C�AN!�x������?ЫW/|}}5V���W����BOO???e��oЫW/lmmK\����JŖ-[8q����ԬYSSS�O�N˖-��s��eÆ
$%%�����X�v-gΜa„	��9sCCC���ܮ�B!�B!^�p!��.����ȑ#u������5�eB!�x�����|��w�C����7�nݢq��|��7�mۖ��(�ϟOrr�F]///bbb�С�����Ą��8\\\

e���XZZ�����
���q�1����Z��={�u��ѵkW~��7�ϟϟ����vvv����۹q�M�4a�ҥ�mۖ��,X@ll,[�n���N�f͚���LÆ
���@�Rq��	%�bϞ=�_�333233	��Օ]�v)	����m�V+.uYpp�$\!�xeX[[cmm��0��L��у)S�`oo��y��t�����ZXX`aaQ�ŭgdd���=������߿?����(�Y�&���xxx���@�&MHHH ""�iӦiMZ �B!�B�W�$\�����ooo]�!�(!�CSB!�BTꄃ�����8q�NNNt���Y�d���Z�����B�ƍhѢ���XZZ���e�q�g���+�+���l�����訬ѱcG����1c'N��J�(L~�ݩS'�͛�̙39~��V{4m���T*�߿��Q�<��ۛ7nлwoF���#4ڹr�
����W���5�!�B!^L������Se,$ċ��֖���퍃��3����1666:�N!�B!��$\!�B!���;CQnjj�U7>>���3ccc�A�$&&����$.�'!!A��W���5�;w���[�
�>:u�Q������1&&&�k###�����ٳg�x�bBBB		aӦML�<kkk�U��Ի{�.�j���C]��#�B!�x��߿��s�������e���
�Ua�3V$իW��ٙY�f1~�x �w}ݺuc^!�B!�B��$�B!�B!�^އ5���G��$*U�Td��<xP�w�y���D�;ƤI�
�w��1�~^yW�P'<T�\�о�+wE^�����O����޽;'O�d߾}\�t��7���Ō3>|�Ʊ�Ŭ.˯}!�B!D�w��qƌ�ĉ�[�����Lu��;;;V�Z��3�A!�B!��.I�/��<�SX�fv100�~��t�ޝ�'Ҹq�2��b)ɵ�h���		rf�5j��#B���uB��z�7�~�:�.]��w�U�/]��U��ؘ��88���q��>|8xzzҫW/Z�l�U��իl߾KKK�����c���p�|���Ҹqcn޼IDDݺuS�#""Ju~��򅅅���p��1�m�ƚ5k���z�ꑔ�DJJ
����8>%%E�#�B�G�OBQqEEEaeeE�~�X�~���e�E��<X[[cmm��0�B!�BQAI…�������ɞ={8|�0nnnt��Q�a��/<<777v��Evv6�G��u��t��Yס	!�x�H��B�N�~��~�:˗/g�ҥ���[���o,_�\�n�>}غu+NNN888ЪU+�ݻ���;v��̌͛79+4dggOӦM�ԩ�1dʔ)L�:��}�R�^=n߾�ѣG����?���8p`��e˖)qFEE������:���W�޽ٺu+...,]��v����w�^�J|-�JBB���<�V�Z����c�iӆ��$���+���:B!D~d�$�ӭ[�<x0]�ta�ΝT�RE�!	!�B!�BQ�$�B�b�=���Ǐ����qss#$$����?�ٳ��ի�0B���΂1b�2{���������_�#!�ϝ̆&��7n�8>�͛7�8qb�u'N��ɓ'������Fc_�j՘3g��]�N�޽������8p'''?~�ѣGY�f
k֬��O�>,X� ��֭�g�v�=zt�}�fkk���lj��g�����6m�UV��������ꊫ���>SSS�u�=8u��������@�>�B��d�$�WJJ
��N�:�ٳ�5j�:$!�B!�B!tB.�Ι��/֒�U�V孷�����֖�W�r�������$99�1c�(ecǎe�Νxzzbgg���B�
Ξ=˺u�t�����/�ٳ���x�6��^�:���q��i<x@�-���a�…(u


Q�Tlٲ�'N���L͚5155e���l�R�;w�\6l�@RRJ�������>}�����(�߿O�ڵy������/0�5kְh�"BBB�[�}/�� IDAT.dʔ)q�wn�j���ӓ~���'Or���իG߾}���022*ֵ����
===����q�o���z����V�7`�֮]˙3g�0a�FgΜ��А~����!�/7?	�b��ͫa�ȑ���?�?�ڵkY?++�ʕ+�CdB!�B!�B�/I�ޱc������<z��ӻwo���4fӹs�6l�ԩS�����2o޼|�,I�����3q�D�͛��ӧ5.������ ((��������3h� ��f�	'���������={��/��~��}��]___֬YCdd$U�V壏>b���+=��z<�����/6n�Hpp0<�y��L�0�������'�|�̠�����x���hҤ	���#55___�v�J�
�z�5���___ƏO�Z����
!�����?#G��u(B�
���KKK]��ʩ[�..�(KLL�gaoo���}�m��ߟ��������/4�� �k�f�ڵ%�;���ڵk����C�����_�����W�fM������ !!�&M����@DDӦM�q�Bh��/�TL�*U ;;��ڜ1c-Z���_/V��۷'88�X�]xx8���(6��R�����_�!!�B!�x$�BTh�6m���C�,))	___�߿ϒ%KHMMe���$$$(�>�Ç��,I���ܹ3׮]S�222�>}:111JYbb"*����h��ܴf�Y�b�ѣG����2iiڝ6m)))J��w�&++''�_���ݻw�������1���,\���O�2d�F��J���ѣ�>}@y��ȑ#���ann����9���2|�p��B!DY����uB�
B��(?�>iii8::ҿ

���cŊ/ԃ3/[[[<��������퍱�1666:�N!DE&�'!^2�yu:�D����qrr����9ET>,--ٷo_�&�<o�����	!�B!�B��%뺊
m�Ν8::̹s��8s�Roǎ$$$��o�m�6Ο?����FDi�Gݺu�w�R���ELL:t��LJ.���G�Ν	

e���Z�={�u��q��yT*�7��?������m֬{��!88�ɓ'p�ĉR]����m۸}�6�ڵcϞ=�>}�aÆ�R�7n5j�`�֭m�.z���жm[�8�e�:B!�B����puu��?��w�e�ȑ���Q�N�N���_NիW��ٙ������Hbb"�����ٙjժ�:<!�B!^Z���:OX�z5�6m"44T�q<�}���:��V�����8?B!�B!^.�…(wfff�*����dgg��o�q��!�]���?�����'O�`޼y�o�SSS���kf͚��nI��ӧO���NAAA���иqcZ�h���3���h-���訬�бcG����1c'N���ή��:88дiS 'qA�Rq���R]���ٳg�ꫯ�zNNN�
�k�fĈl߾�s��annNjj*�.]�f͚���p�� '�#��͛k�B!�B����C��ᅮ��AÆ
y��2e

4�u�/�.]�`ggǪU��1c�2fB!�B��lllضmS�N%,,L㾙x~֭[��kBT���B!�B�\�.Q�ݾ}�9s���o�i��=3ĭ[���D���y���JR��1ԩSG)������"�cbcc�ʺwﮱݹsg�xKۮ����������,��$��y��ЦM�|�T���a׮]xzzbnnιs�x��)���ݻw�U�����2u!�BW���<x0���G��֭[XZZҠAt^�p�ʕ"?�o???BBB���n�F�*�Є%P�re�������u(�
�u�ŋp�B��������o	

%33kkkfΜY`��߸�����*��u����Q�2C	Q~*U���ޙz;##{{{�mۆ��3g�dɒ%ܹs�3fp����`����}��iii������GժU���Y�r%���ưq�F:u�Ċ+HMM��Ϗ�����7n,�X��Yㄜ	ھ��b����=�Ν�z��9�U�VQ�fM�N�k������3�v���͛СC>��S�L���޳�p�����9R�q!r����:!�B!�ρ$\�r���Na7}V�\�o���o��|���	�۷׺1��9��͞S���q��E�z�-�>
�{u���W'%T�\������W^�8o�%�ve�~e��[�.Ç��LJ��hΜ9@�^����}���e��O!�x^��������:t�YLɗ_~ɩS�t�ra}������Ʈ]����f��Ѵn�ZI�B!�B��ϟ�|���P����1Oq�E�2��b�9s&����ҥKiѢ7nTV�OKKc���T�\OOO��nݪ������ٳ\�xQc"2�֭[��W_�p�B�ɷ���pqq!44�#G�h��)m��=�O�>�^�W�>}�s����͛y��F�y9::���*����������/���`mm����NcB����aܸq�C!�B!D�~*Y�
D=��J�b���2Dc��'Ox�74n���`̭$u��������{�V��3�8p���0����P��"##5����x��7��ݢ��z<��6l�:F^�Ǐ���]�vq��9*W�L�=����� %%E�Xu���B�+%\��_u�N��p}����`�F����1�7��ʊ��瓞�^�Q
!�B!���{�M�6ʼy�
-/kE�y��5�OI����XC	Qq���r��%���Y�d	vvvT�R�˗/E͚5��{?y<x�C���c���i޼97o�d����Y�J���hР���dff�믿ҳgO�=�J�*q�iii,Z�H+�իWF�n݊�W�6m�z�*iii899��?��egg+��d�Ç��cRSSٸq#�ׯ/�Z!�B!�B���$\�����������̟?_)��>��Ņ�/���~��W�-[��VI�����DGG3{�l�]�F�&M0`���O�>899q��e�>}ʝ;w����133c���Zm.[����h�<yBxx8...��nQJr=�G�ꄉU�V���ģG�X�r%fff6L���/���Ç��>o��6�����_��}\\�V?�2u!��<���)?۷ornԚ������ܜU��%*OOO���3f�R6v�X����f~B!�B�=�x�,�'�133�r��Z.JN�PBT6l�cǎT�V�ٳg9IQ?��u��eذa���(�>�q�F������J�={
�S��ĉt��===ڵk������U�8۴iC���ꫯ�����`�Ν��k����jՊ�ի3g��޽[��f����HNN���7������+�B!�B!^|z�@����ݛ��.\�…��_�|ssslll8v�W�\a�ԩ�h=|_���tC��Ȉ+V�����M�8��'O����F�jժ)_��V�n]&N��Q֮];F��L��$��y�?i�$�������O>���g�i՟0a������Kc_�=8u���ј��j�S���!��U��_�q�F���y��͛7g„	<X�^jj*���?~�;w�P�~}>��C�N���d��}F�e͚5DFFR�jU>��#fϞM��������ݝ��@�����Ą�C�bii��V��aaa�kwww�ΝK�֭ټy�F���+/��;55___�v�J�
�:�5RfƏO�Z�J�F!
���1�B���A��(��k׮��#oyq�1jiiixxx���M���4hS�LQ�7
w����G�aɒ%c�Ç3�|>��#\]]��x�qYq������X�y��u���|�M����ѣG5�ͭ���={����y��5���\����g�6�+q��W�-��W���u��r�},̪U��<y2����`�����={65j�(�XQ��\�R�k~~~���н{wF�U��	!�B!��%%	B�
����W_���Μ9�ӧOiժ666���︻��k�.���100��ݝ���s��1>|�|��xʭ$ub``���1��Ǐ�aÆ�


Q�Tlٲ�'N���L͚5155e���l�R��5kְh�"BBB�[�.ԸW�v�s.Žϣ�z����鉛��ϟ�ѣG�lْ�'ҷo_����P���5�
0��k�r��&L����̙3*7�B��s��U���i֬�w�&::��'Һuk|||�{w����֖۷o+e���,\���O�2d�<x���~ʍ7�zIII����J�Һ�<m�4RRRx���w�&++'''��ܔ�=233���"**��2nܸ"�_�f
���>�睟#G���������>sssBCC	d���%�IQ��{��w�^]�!�B�@i�/�U�qLFFӧO'&&F�����J�"::777*W.��	g�ʕ���ҨQ#���puu�A�̛7���Y��1��z"��lll�q��Ν�_��W����i�JV'&T�R��c�J^PT�8맴}��V�R�B�W3f`�޽xxx����V���ťT+�����/9u�T������qssc׮]dgg3z�hZ�nM�Νu�B!�B!^&�p!*�Z�j����ܫ1@΃����8::j��[I�f�1�Y����{{�bկ]�6k׮-�v��Y����q����y]�t	�f͚i�XT�fM������ !!�&M����@DDӦM����B�z�%�Lzy���m۶q��mڵk�7�|C��������Q�TJ��۹q�M�4a�ҥ�mۖ��,X@ll,[�n���N��f͚���LÆ
���@�Rq��	%�bϞ=�_�333233	��Օ]�v1n�8��e��ТET*�ƍ�:��m۶Z�˂���a!!�Pvv��CB!��$㗂>�T^�q���111t�Ёy��abbB\\...�����~,--��@�+-�>�V�Z,^�;;;.\��͛Y�h>d�ʕ�{���ˊ{-d%ċ��ѣ?~�ȉ�Ο?O�>}��ӧO��?�ּys�\��͛7i֬Y�\��S��&MbҤI�����޽�+V`oo/	��ԩS������`�F����1VVV̟?��z�B!�B!�C.�/���4������?Ə�o=[[[<���7x{{cll���M��+�B�G�`Ѿ}�|����g�9��5m�'''%)B�ĉʾ�;ЩS'�͛�̙39~��V…�����q�P�Tܿ_�_�F
<x���77nܠw�ތ1�#F;~�'[@��;?W�\��}���5�!�ƨQ�t�B�����xe�t��<,,�T��*�8&((7n�$�;;;ciiI@@������ ]�v���ooo>��S���;v,��3�ϳ+c(!^;w�[�nE֛:u*^^^����$�;��c�
���+��֬_���;r��mV�^ͪU��ӧǏ/��x}U�T���l�^�J�֭011�ƍlܸ:u�Dll,@���҅��^t���$''3f��l�ر�ܹOO�RB!�B!�I�B� ��}�u�֭���^�:���̚5KI�ؿ?�֭�Z�j��B�Wއ�V�\�ʕ+��K��t�R�����?hӦM������r{�w4�����Dy��M5++K)�={6�/&$$���6m���ɓ���.��h��9%U����ݻw��d�R���!ʆ��?#G��q$B�W���!!ċ�4��*�8&>>�|�Q?�[%Θ1�.E�-������,��+c(!^�{�WÆ
�޽�F���3g�,�GGG���˹s��ҥ�ƾ5j�z��\�}��_�"99�6m�ЬY3n޼���ӧO���N�>����e������;���$&&������	C��JDLKK��Ã�� ���o�ׯϠA��2e��Ԓ�;��	$������ҵkW4h��iԨfff���2~��|�6	!�B!�B�$\!^
4 %%333����R�J�u�t邝��V�rn<����W�B!D�U�R�g:>wE^�����ӿ�w��ɓ'ٷo�.]b�ƍxyy1c��^d����������Y�[}l�ʕ���˞��
!�y{{cmm��0��(ƍ��0�x��M:(ͬ܅�_�������B�y��3�R�e\V�ce%��e߾}���H�
���f���&iծ]�s�αd�~��G022�s��|���JB\Y(�����%K���o����'''���y��1ӦMC__�
6@˖-��O���Sf��qssc����vff&QQQDEE���C�3wFFӧOW�-@bb"*����h����v�����077��gnnNhh(�����Q!�B!�"?3!�(aaa/��e)  ���`���{��i
bmm��իY�zu�K[!��!,,www:t�@XX�ׯ���T�<�?4l�(zv�ƍ�Q��666.U�FFFXXX����۱�����Y��T��y��R�߹���S�^=RRR�����u�B!���y�_Ԋ3�Q�q���'44�b(Ȇ
����]�vܸq77�29�g9V�PB�Fvv�F�W��Җ׫W��~����nݺ�ʕ+�V	���:u���w�q��M233�}�6����}XYƙ��;w���?j%[��1c�p��u233ILLT�'O��/��Bzz:���DEE�|�r^{�5�6E�={��~�zΟ?��ӧqtt`׮]J=///bbb�С>>>\�p???:w�Lhh(���4/s�@۶m�bP���!�B!�B��$\!�BQ����������C�=X�jIII<z�+WbffưaÔz�{���Ņ��H�<yBdd$˗/�W�^%�{�С���������4Z�jE�֭��WLj��/��:u��w�^��ӹq�����>�nӦ
qqqZ���u�B!���y�_Ԋ;��ӧNNN\�|��O�r�����{��̘>}�R�$c�������йsgT*����ܹ������'��{������T��֭��ݻW�����4~�*jԨ�b����?��È#S�(�������[��J�*�h�ggg gR��\�r�f͚i�k޼�F!�B!�B����uB!�B�
*B�ŤI�

"22�O>�Dc�g�}�����������3y�d�zM�6�*+[[[\\\puu�J�055U^שS��w�bee���1(��޽{�g�֮]�ڵk077תW��ί�=zp��)���5��������s�ʕ|���?���"$$���$�y����3fFFF:���S?��,�4���@���5jT��&����<�/��.�8f�ĉ�<y���Hlll4�U�V�9s�(�E�y�z�5,,���T����Q�K�,AOOgggƎˢE�صk���%9��b,�2�B��?d���|������7����e���,^����BBBشi�'O��ښjժ)��	~��SԪ�w���wJ]��#�B!�BQ�…B!�� o�ů����]�ի���'����V�Z���Ӷm[V�X���z�j���ӓQ�FѠA�T�B�
;v,[�n-�C�VVV,\����z011a�ĉ,^�X�7w�\�4iB�*U���(��9s�0b�j׮������,X����_��F��9sF��3g�`hhH�~�J|=�/�/���q��i�_�z��c����G||<<|��+W����θq�HNN�A�_xx8nnn|��W̝;�����밄BT0aaa&�=��Zq�1����T*���166�J�*ѻwo�nݪ��Y�1OA\]]�믿ppp�q��4n���w�aUWy���@Q�<�&9R�h�����m#*����aA�f�0��GDǜ%-���iJ��S�n3oE`<4ʄ��
�����o7<�Q?���W����������������Wx�_M�{��P��{ IDAT"uÕ+W(**�v/^LQQQ���Ƚe��Y�whe���[�n%<<�.]�p��
�/_ΐ!Cظq��]YYY��\�v��z��L��[.}0�ۈ��������	�p!�Ubb"����CD�`�v""������K��Ѷm["""~�]�f�&88��v�}0[Q���w�;�yyy���U�1���		!$$��W�+�iӦbbb��ͥ]�v��撞���ɓiҤI�����c߾}���\�~��ݻ3e�:v�Hii)'N���?��ɓDEE1gΜZ�����:ƅV���8;;�s����~�z����U�""��j6����c�6mӦM��]E�Ư���?�E�+���+��Re�w:/�C�X_qq1#F��Y�flڴ����w�W���-"  ����[��#GGG���Ǐ�k�.V�ZŒ%K9r$������e��ܰ&Z�lI^^�l�Ҭ�����FDDDDDDD�N)�B�w�}��Ç[;�C...�ADD�N����;			�\			8;;3v�X+G'������n�������Z���c�аaC^x�"""������N���#??�ѣG����X�v-qqqZ1:�S�C�XOYY'N���*<i�.x���Y�j|���4h��!�}2l�0rss			aȐ!<��S|�����ؘ��ߟ�+WJpp0O=��������g͚5xxx��'��N�(++��ٳ�ϱ�~�i�����ɱH����1��SJ��C��ﵺ� �AeggǬY��2e
�ƍ`���,]��ƍ[9:��ŋY�t)���WWWƏό3󟋅����İs�N~��GZ�j���1i�$lmm���=Z�h�?��ŋM	F...�vW�^��=͛7gӦMԯ_����ٳ���Ю];����III,Y����5j�K/��ԩS�N�z�*����޽�K�.ѪU+@@@���q����Ν;����w�޼�j����͛DGG�c�.\����
���6�ls��Ϣ��]�z���$�u놓����M�6xxx���ĸq�ppp���YDDD�͡D�gƌ�_���[������T�^�z|��'q��EZ�nm��>�'""���H"##��n?�d„	�ݻ����ļƍ��{o޼9�/_���ggg�l�B�^�طoYYY��deeЧO�{}{"""""""�Q…�7K�.%11��a��2$$$X;�:��_$00�ŋd����ׯ_gҤI�;w�Tv��IS��튋�y뭷8~����…��ƒ��ETT�YbDE&M����	`Ĉ��ݛN�:���	���k��Fll,_~�%^^^�����зo_�k&O�LAA7n�`�ƍܼy���P�]��o�Avv�隼�<9t����4i�Ĭυ�e�S�)))������#QQQ�^��tMII	���dffr��uƌS᳨�u۷o���OOO�><==9t�;v�`�ȑ�#"""u��P"���?f�…�Y��X;�*����{�nk��H��f,>>>4lؐu�֙��۷�O�>���������g�}ƞ={��ϧiӦt�ڕ��z�'�|��v���|������Q\\���裏HMMe���f1���booϠA�j�EDDDDDD�a�����`[�T��)��tE�e00�CD�!!!�s��Ѷm[�͛���;���������o�6>>��ǏөS'f̘���+999DDDp��!6o�����9|���iF#F��iӦ,_��U�V�j�*lmm�ҥ���g��ᦓ2ƌCRR+W��0���O<��f͢u�����˞={L	�W�&;;�v��1w�\���9~�83g����Ӭ\����@�>8�ҥK�֭'N� ,,����oj�i�&�-[���%%%���Irrr�s��^����ZhU��,--M	"""0͡DjOBB�������R�x{{�����6mӦM�������\�iӦbbb��ͥ]�v��撞���ɓ-6"����h�<<<�^U��ٳ���P:w�
]�v%,,̢ߝ;w���
4�cǎ̚5����j������Κ5kx�w��� ++�E�a0���h֬���|��|��W\�z�cǎ�v�]pp0...4j�ȴp�ʕ+����K�.��<*�56$$OOOlll�ܹ�)y��`Z������u�駟�����l޼���P��N�:�J()�C�fmDDDDD�r�~�-'N���&$$���X���?mڴ1�0!!gggƎk��DDDDDDD�a�.DDDDDDD䡒���/�`V^>���ٳ��y�������;&L�����+W�_��-Z�رcINN&..OOO���+~��gz��IÆ�oո����vtt��͛����\�t�bv���ϟ?oc�=̾���8wl�ԩ̞=��r��AV�X�ĉ14nܸ���u�/_�����c��������T��͍M�61d�k�"��74��j�_;;;f͚Ŕ)S7n�7of�ҥU�aEDDDDDDD�C	��3�QX�7�*j[�7���5��.�_޺u�8x� pk�ϨQ�je\y𕟷Tg>SVVf�}�z�~�My׮]���O�>�������Y���-���DGG��B-Z�`�ȑ$&&���Ejj����lll���2�'e�W>��ض~��=��ˋ=z�w�^����;���ˉ��'((��#GV�wu�3���c�jr�"""""��W^y��!�X݋/�H`` �/ ((�DDDDDDDDjJ	"R+�=JTT��ɔ����k����f�IUDD�a�E�""�Ӿ}{Μ9ñc��ok*?v�E[gggrrrزe���5��ݝ#G��q�F�~�m�z�i�ƍdž
HNN櫯��~����ի��mۖ����t�w�n*OOO��222�68z�(������9::��퍷�7Ǐg׮]�Z��%K�T�pQ��Z�lI^^�l����Sy4h�$""b�}�f00�CDDDDDDD2J�����
G��{***b�̙����������뱳���8DDDjC�޽Y�n����:��r�
4�3gΰ`��Ν�3�<É'X�`�E����r�JBCC	橧����7���Y�>����bв�2Ξ=���~~~9r���X�]�ƈ#pqq����#G����ƹݯ~�+�
Ɔ
(++�K�.<��c5��~���r�J"""�;w.�>�,Ǐ7�kE�f̟?��\233���`��6Æ
#77�����SO=�����Q^u�{�����#''�"�˜����O�y��ȃE�'���7r?����l�2hР���1Q…X�qW͇1�An���#??�ѣG����X�v-qqqZ1:y،3�m۶��w�1a„*�N�0��{�����رc��7n�{�g��y��\�|���ٲe���gܸq�Y����d���-�x�'x��w-�Ǐ��끊#���ߟݻws��Y&N�hV���bQТE�������k���Add$���fm�v�Ze<չ�W�^�۷���,������;&"""""��i޼9�6mbŊ���;�GDDDDDDDD�D	R��ڵ����s��InܸA�V��ׯ���4i����ҥK|����۷���"��3*�&mk"44��۷3g��b*߶maaa���K�'?��˗/'--�k׮ѡCƏov]y�%��/�y�&����ر�.`cc���+Æ
c���U�w��U���ٽ{7�.]�U�V0������-�MJJbɒ%dddШQ#^z�%�N�j:���ի$%%ѭ[7���L׷i����7n�}�"""uځ3f����:&!!��`�0*U%����MTT����ڵkt�ؑ�c���������=���|��g�ٳ���|�6mJ׮]y뭷x��'Mm�O���L^^��Ŧ�)S�н{w6l�?��.]�DÆ
�С����l�jԴiS��}��������@\\�~�){���ҥK�lْ���o���hq͒%K����iѢ/��2�&M2{.>>>4lؐu�֑��
@����ӧ�����S���G}Djj*�Ǐ7�#55{{{
tG�DDD�?�<�4�����l:v�h�0�g�}�>����PF�A�v��������������V�XALL�YY^^III\�r�9s���O�8���\S�m۶q��u�>kҶ�BBB8z�(�-�k׮�iӆ��<"##qrr2%u\�|.^�h����ӄ�����?3t�л�#**�իW��/))!33���L�_�^釘׮]�7�0-��[�;11�C�k�Hh���p��
6n��͛7	

`������i1���'�bǎ�9��YDD��)++�v"RGԫW��!<�Z�hAxx�Yمhժ�Y���#ӦMcڴiU���兗�W�u=z�G�5��رc��0�/��,����f͚Lppp��m֬}��/����ۻ�6�S��6m��` &&���\�b���\��ә<yr�I*""�p�I����DFFAvv�Ŝ�aFrr2S�N5�(�,11���Dk�!"""""""��R…�ik׮n%2:�z�ꑙ���ɓIMM5�[�f
����oߞy�����Fff��⚚����D���8880{�l	�O>���3ׯ_gѢE��EW�Z�ŋy��g�7o�Z���+��߈���넋M�6�l�2<<<())!%%���H���+M�X�z5��ٴk׎�s�������Ǚ9s&�O�f�ʕ�]��O0k�,Z�nMLL����ٳǔp��������xƲ��4%\������=ӷo_
			���{{{rrrX�p!/��U�+,,�������/�ƍ�j<�������wL�"			8;;3v�X+G'""""Rw$$$0c�>���6�n�V�|�r����������{��w�N��{O	R�*K\(_~��a���OYY'N�`�֭���o�n��`�w�^f̘�s�=@׮]�ӟ�Ĕ)S��I�;ѭ[7			���dff����o�[S�����@hh�)I�n5i҄k׮���@vv6������__�*�۳g�)�Ν;ХKf̘�;���ݻ-.���M�0f�bcc�r助�ԩS��Č�:t�`�FDDDDD�^2d6l 22���H���͛`��n�۷��k77��N�P���1k�,�L�bJ:ټy3K�.�q��V�NDDDD�nؾ};'N��#o����ù\�����wޡ��4m���!���������#N	R�]�x���{�'NX��~��s�LIF�ZZ���3�bQAAA|���dffұcG��?�՟?���~��}��ԩS�={6���X���'b0�\�����J�����㾝����k�	7o�4�]�|�u�Gy�2cyp�:u�ҿm֭[���ѣ�F����D�dLߺu+��׿(..�u����ٓI�&���d����(((��Ã��P4h`�x���_$00�ŋ���]�v�rT""�0����/��������;�Si��P��ȑ#|�������?RVV���3={�d̘1�m������H���_���ë��JDD��é5��_qww'""����[;�:m�ҥ$&&Z;)�""""""��S…Ժ�Ɠ-*JhX�h'N��}����w���Օ�{����߸h���񚴽_�իwWח����(..�����G��ݻ�/���cǎ�|�r���	

b�ȑ5���lllL_Wt_Ʋ���[���y����u�����۷�¿�=JTT��ɔ����k�������?o�HE�QQ�~}��ڡT(%%�*��d#��T���DD��Ƒ#GL�_�x���{���Sii)���g˖-ל={��g���_�`����sO���D�ӧO3t�Pz��Mll�#�YJ�֭Y�~=�:u�v(��@BB��� 11�1c�X;��,W@��!�ݴbcc�:u*C�5�/--�}��f�deeY�Y��w��?����<��dggeVߺuk�֛�5a|3���릲�ptt��ۛ��V�^���?W�\aɒ%��o�-==ݬ����s��hٲ%u�2cy0�۷���"fΜ���/��δm����(**��(EDDDDD ##�+Vp��!f̘Qe��V�i���lٲ�F���o���DZZ���DGGӷo_nܸAhh�'�h�&�`;v,;v�o�������
8��y����������5)�B���Mqq1'O�$,,�T~��^~�e"""8r���������ᚴ��|�
���<������ҵkW֮]�7�|cjӫW/�ևhyyyܸq�E����#*�y��|������Mdd�E�aÆ���
(,,䩧����
0?���~����MFF���ddd�`��;�9�x<}NN�E����#�EDDf���Vqqq���3z�hS���������Y12y����q�ׯoZ�\Yym���oٸq#���|�駼���<��4j�;;;�v�ʒ%K8p ���lܸ񞎯��Hݴj�*�l�B�&M�����������#����J�~�HII!<<���p���'O����رcٵk�N�"  �T?x�`���5i{�_�@����\�z�Y�fѤI�̙CÆ
�5k~~~���&99^�uv��IFF�����y��7�|�6m⣏>⣏>���Ӣ���?DFFZ$dt�ڵ����ٽ{7gϞe�ĉfu...e�ѫW/���GVV����SE�$�CDDD��ŋY�t)���WWWƏoڽ���æ������İs�N~��GZ�j���1i�$���F2~m��())�nݺ���djӦM<<<HJJbܸq888��m������C��իDGG�{�n.]�D�V�0`��ۛ��>�֭pk�RY�͛7���fǎ\�p\]]6lÇ7��n�O7n���???:u�T�}N�<�F����~����M���fU�08u��]��|��y���9x� yyy��������ѣG���xGc���6�[���УGF�U+㊈��������	bu���>�///��찵���c���D���dlmm�����ח�͛ckkˠA�

��&mk*22�~����`ڶm@۶m	&??ߔ�вeK�����������Y�p!C������{___�5k���-���̜9Ӣ������<��3���bkk���+&L`��ٕ����@\\�F���ɉ
��䄟�+W��xò:L�&MHMM��KMM��ޞA�ո_���ׯ3i�$RRR�r�
%%%�<yҔlq���b�z�-V�Z���)))�…���2u�Tn޼Y�X۷o������POOO
ٱc�=�7y��3�z��饗^zY�5f�k���v�o��k׮�~������<�4i���w�wTT�}�gϞ������B233�7o			�vw;2�?>x��*�u�ؑ9s�зo�{6��n""r�����w�����~����֭��ٳs��uN�:Ett4cƌ!??���y?=z���(>���O�βe�HOO�vX"""""""RM:�B�4"""*���t
��M�BHH�YyE�5i[�]M�ϟ���-�_y�^y����m�Vzo��mggW����Q�͚5#88����_[QyӦM1��Đ��K�v����%==�ɓ'�8l�Z�����s�h۶-�����ݝ��L����>�������t�ԉ3f���JNN:t�͛73|�p��`o�; --
�b�������9r�]y@�[���!����d���dggӮ];�Ν���;Ǐg�̙�>}��+WP���M�6�l�2<<<())!%%���H���M:�v�t��:t�P���MDD�}���u~�!ׯ_�{��L�2��;RZZʉ'���9y�$QQQ̙3��c���EEE̜9___����[��i� IDAT���~�z���j%�s:�BD�;ڴic��[BB��Ό;֊�������/��{�� 44�Ν;cccC׮]	�h�s�N"""pss�A�t�ؑY�f���R�X�N��'���3."2��]M�O�s�t�b:�o���w�q����֭[�O?����/�f��ͦvw;2�BQ�^=���\��h�&"��.���E���x��~���nmz���FÆ
iܸ1/��ic�X3�_G~~>�G�6�������O\\�#���	"r����1k�,�L�¸q�ؼy3K�.�q��V�NDD�ё���/�`V޵kW��gϞ��ĬӧOW9��˗�['��g,3��ݨQ����eee�AD�!77�.]����=�ϟ�㾧N���ٳ9x� dŊL�8��`����Ο���8�<��=;v�Q����<�233�ԩS�IW�JJJ�ѣ��X;��&�O��z�*����޽�K�.ѪU+@@@���f��hт~���/��c��չ����RQ٘Ư����>}:nnn|��'q�OJJbɒ%dddШQ#^z�%�N�jv�ŋY�t)���WWWƏoJ���^����֭NNN��۴i���III�7����"""""""Rw(�BDjŋ/�H`` �/ ((��ŝ"""��Gԗ�@�6�_<X������ڵkU���_��P=c��He0�CDQ����3��a�<����xj�����G��ݻ�/���cǎ�|�r���	

b�ȑ��ϟ^|�EΟ?ϗ_~I@@�Y]e��Hs7���_̀�����_�v8u���
������{�3�N�:Y;$�׮]�7� ;;�T���Gbb"�"66�t���I��?>�1�޽{өS'lllj<��%K�z��Y�CE&O�LAA7n�`�ƍܼy���P�_�ΤI�8w�隓'O��-n�}�v
�������СC�ر��7���������MJ��Zc0�hJDDĊڷoϙ3g8v����oM�ǎ�h���LNN[�l��ٹ�c�lْ��<


hٲ�Y�����""""""5նm[���;����޽��<==��3�stt���ooo�?ή]�X�jK�,1-������[�la�����Ջ�{��v%Wh�&�����d�С���K�?���<�~�mV�^�[o�Ejj����O��=yp���dggӮ];�Ν���;Ǐg�̙�>}��+Whj?b��6m����Y�j�V���֖.]�п����m�cu�ؑ��XS��<��̚5�֭[Cll,{��1%\$$$p��9ڶm˼y�pww'33���0����JKK����bcYZZ�.DDDDDDD�8�-�DDDDD�4h� ,X@VV���dff�`������ 44��'O���?s��%���?xxx��[o��?�>{����駟 ''Ǣoc��������ȝ�ׯdddPZZJFF�i�ӧO�;�{ذaxxx�a�
yꩧpss0�Y�n�O���o��ƍ���,]��S�NQ\\Lqq1��׿X�~=�ƍ3��^�����u�;w�!C�бcG֮]K�
���~��|��|���|��g��N���0{�Rymٳgp�V�Ν����K�.��!v��mq�����9k֬�w��Ã��,-Z��`�����cǎ��d���`\\\hԨ���+W�Ty]�v%,,̢�S�N��8��С�Y��t…�����#b̘1l۶���	&T�v„	�ݻ���ƎkV׸qc�{�=�͛7���������̖-[�ի���#++��]��]������'��T��emٿ?��9YYY\�r~�����C�޽�S�N�-~��{^�n�G��5�V�)��ߟݻws��Y&N�hV���bQVӾ#""���$22Ҭ�y��Ο>��6lHrr2�W�f����Ծ}{BBB��ؚ��Ծ������#[�l�I�&��������°a�prr�vHR���t��Ŭ��^��^���;&L�����+W�_��-Z�c~�����kGGGn޼i*3&$c6*�{����888X�ˌmDDDDDDD���	"""�Q�z���K�{�z�>|��������7�=�
6��͍9s����fooOll,�ggg4h���#���c�ʕf�|�O�N�v�hР���<�&M����jGjj*����7DD&������ȴi�ؿ?�/_�����~�����3u�T��?�~^މ��ߴ˦5=z���(>���O�βe�HOO�Z<""��j����@\\�F���ɉ
��䄟�+W�4-��>>>�����3�`kk���-���L�0�ٳg����	�A�L�>���^}�U~��_ӨQ#�ׯ������#""�
6н{�{6��n"����~��'�o�ί~�+k��@�={6M�6�߷v(u��wg�ߡ��[��	
F}���Ã��|�:[[[���L����n�XU��tYY���5�կo�,�X�0��-""""""��	r_%&&RRRb�0D��֯_��`�v�A����m�0DX�7of�Ν��ѢE�����.\�@�V����6mӦM��O///����ʚ6m��` &&���\ڵk���.==�ɓ'kGy(͟?�]�vaooϤI�0`�[��������'��s�NlllL	o5�o�>���Z(STT�̙3������5,,����cggW+q���ܮY�f��m+��YY���w��׹������������ݫ�5w�]˗/���HMM����v8,{{{���x���)((�Y�f�I��m۶|��w����%����L�u�ő#Gظq#o���E_Ɠ&*Jf��ڷoϙ3g8v����oM�ǎ�h۲eK���(((�e˖fu�6"""""""R�)�B��ݻ+�B��ꫯ���-wgȐ!2��a�<�JKK�pq���ۗ��BBBB�����ޞ��.\�/�pO�����;			��O			8;;3v��{:��<z<<<��K4����tRRRptt$66�:��Z�h��!C�ѣ�G�&%%___:w�l���@\\����=�T����ڵk���#00Њщ��ȝ��M����`РA<��s�������iԨ��C�JԫW���2Ξ=���������Ν˳�>����Y�`p�T#???�9Bll,׮]cĈ���P\\̑#G����߿�c�k�
�̙3,X���s���3�p��	�=��駟&//�����
c���Q�������Hݤ��o�}�]�}�]k�!"""�@1. ��>̐!Cذa���DFF��7oޜ���{:����f�bʔ)�7�ub�ҥKiܸ�=KD�"���DFF�w�^7n��/�LPP�ق�]�v�~�zN�<ɍ7hժ���#00д��͛7���fǎ\�p\]]6lÇ7���_0~�x�d�۵hт�cDzt�R�����.�?���҈��d�Ν���һwo�}�]�)D����=餢��W���ݻ�t��Z�b��`ooo�ORRK�,!##�F���K/1u�TөW�^%))�nݺ���d��M�6xxx���ĸq�ppp�������X��n"��A�J����lQ�5oޜ˗/��ン�3[�l��ߟݻws��Y&N�h����Ŭ����7�5k֐��Lrr��O<�����y��3�m۶��w�1a„*��Ջ}�����E׮]�겲��$���p!�͘1cHLL�v"r�			�����j�DgΜ�v���`\\\غu+��׿(..�u����ٓI�&�-��W^|�EY�x1AAA.���/!!!|��W�����DJKKM;7�X�����k���HJJ�ʕ+̙3���(V�^mjSRRBff&���\�~�1c�p��1�։BU�ݻ7K�.��ѣu.4-�q�)))������c��ڵk���dgg��[bb"�"66֔Pb4y�d


Lcoܸ��7o
����),,����b<OOO:Ď;9rd����As7���5N��>}:�1yyy���@\\�~�){���ҥK�lْ���oZ�{�L�B���ٰa���?�t�
6�C�8???��mEc�kvvvDGG����v�;vd�ر���ckkkj;x�`>��#RSS?~�Y?������3hР����������;J������F�E@�cr4oook�!Rgm޼��;wZ;���~֯_����`�ocT�c�����O�[�ggg>��c���سg�)�b�ڵ��Č�C�R�^=233�<y2����~6m���e���𠤤���"##INN6����?���\e\�?�8���u`�ҥt�֍'N��牏�'00���,�[�z5��ٴk׎�s�������Ǚ9s&�O�f�ʕ�]��O0k�,Z�nMLL����ٳǔp��������xƲ��4%\���<�4w�{���///��f͚l����=zУG�;���s��궃[�W�����]�p�tB%@ӦM1��Đ��K�v����%==�ɓ'[l� """""""u�.�z��Wy��W������n�jC�aȐ!�C��*--}�.DD�b�$�_*�}!ğ��':v���o�IRR�.]2��߿���2N�8�֭[��?��7�|�:!¨I�&\�v�������ׯ��������m�=�aê�n)++3���BBBL'Ht�ܙ��P���سg�E�DU���@hh(�;w�K�.̘1�w�y�ݻw[�g<		n%a���r��S��S��[��u�����������èo߾���������p�B^x���������'!!��d������3cǎ���EDDDDDD��p!"""""""�'�|��u�f��y���ŋ���{�8q���ۓ!�N���ٳ9x� dŊL�8��@�ƍM휜��p�.\0%.T$77�Ծ��v>����;w��{�l�.]���~�?��WWW�׎�����|�2�ˌmDDDDDe�Ν���Ԕ�,RWU���ݺ���Zې!Cذa���DFF��5oޜ���2;;;f͚Ŕ)S7np��K���� """""""u�.�u��)�~�i����T����U�V��у	&жm��
�V�.�Z۱�[����7�5�V���+??�μ��ֶ�>-Zĉ'h߾=����puu�瞳�xyyѣG����_|��c�X�|9���1r�H�V2Åصk���z���ڵ�Ծ��c�ׯ_�T��	���ؘ��W��E����X�e]'""""�(���0`����پ}���y�ddd�m�6�)"���tȭ[������bZ�nMϞ=�4iR��+����x�b����ڵkm�."""""""wH	�Hz���ٷo_��s��y6m�Ķmۈ���s�ε�Ԇ�G�Err2eee���k����v���u��a6m���Ç������e˖<���ҿk�X+�;?�9s�U^�
hڴ)�?�8����;������x��}�-J�����ױ��4o����lS}ii�)���ooo���9~�8�v�bժU,Y�Ĕp1r�HRRR����O�>f'l}��^���Ç[�gdd�mp��Q~��_���ڶm�w�}Gzz:ݻw7�������\��Z�lI^^�l�Ҭ�����FDD��4��Eaa!C�������k���9y�$!!!xzzһwok��@��=h�ׯ��`�`0��;�FDDDDDDD�{�=��f߾}U�>|��JKK#>>�=zPXX���G���j)�G����oEEE̜9___���i۶->>>�����X�6�.]b�ĉ���k$''s��nܸAII	yyyl۶�I�&��op��5k��P��矹r�
Ǐ��>c��|����K���ŅW_}��a�H�ꫯ���b�0�
���Mqq1'O�$,,�T~���
���6l������z
777��T�.]���+�PXXȤI�HLL�~������<���y��7)**��_�0�{���deeQZZ�ѣG���`��6�S$Ξ=[�=������222(--%##�ЧO�?'�)�999uƲ�'I���TE�'���7�������#;;�]�v��[;�GΨQ�x�嗙<y2%%%�GDDDDDDDD:�B�θsg]�A�Q�F<��3�����ߟo���-[�h׵�@\\����=�T����ڵk���#00Њщ�
/^��ח��֭[3q�D�����?N�
����ٺu+�~�){��%  �5k�РAk��@)�Dii)�:u��+W�k�.�O�N�f�,NщuO�޽������_�~���Nxx�E�ɓ'�����ߟ��"##���4kӵkW��CCC���×_~ɒ%KX�d�E����g�̙�ԢE&L�`V�����k���o޼9�/_���ggg�l�bя��?�w���ٳL�8Ѭ���Ţ�:z��ž}���ʲ�שּׁ,��9DD�ѥ���<L��?��_�{�nS��Ծ��(~�߰x�b��?Y;y���.^�Hxx8�gϞ�;�;v���aJ�0*,,dٲex{{ӳgO�����)..6�����������i����k<����?�a�����ݛ�ŋ-Ƭi��O�&00�޽{3p�@,X`qRåK��3g��ӓ��0
+��1�?�����g^z�%z���ѣIII���;���͛|��'���гgO����믿n�3�իWIJJ�[�n899��۴i���III\�z���"�(	�￧{�,�|�I7n���
;v$((�
6�����_MBB���~�5lؐ�-[���Itt4���j�sO���D�ի��^z�e�JLL�����ν8�>���;;;lmmy��X�`$''���Cxx8�<����������ʄ	�={�Y����DFF�d�����c�=F���i޼9}��eɒ%��/�Q�Fƴd�z��MÆ
qrrb���|��'��ښ�L�>�v��ѠA�J�6ppp ..�Q�F���D�
prr��Ϗ�+W���X��5x�`�4iBjj�E]jj*���4����ȣK�'��z0_��X���$::��k�ҽ{wk��H�ر#aaa̝;���lk�#""""""""�p!u��י4i�Ν3��<y�3fX�-..歷���㦲.KVVQQQԯw9F�?�<���?�j܅�v �q�)))���oZ�r'�N�<���S�7n��͛�����&N�Hnn��m۶q��u�{��_�|��ӧO��?��СC+x�5�%**�իW�ڕ�����Iff&ׯ_g̘1l߾���B<==-�����СC�ر��#GV���������ٷo/^���gϞ��OZ�wuu��>˟����ɧ�~���z�*���2�w�y�&M���}��7�۷�-Z�|��*幹�LXX��Ɍ?�"�+V��W_q��%Z�lI�^�

�C���י3g���`�…=z�F�ѭ[7����ҥ��u�}��}�iii\�p�ƍ����K/�Ą	*����V����U�|@ZZ���?غu+Æ
3����������;��?��իWqpp��'  �����3:}�4˖-㫯��ʕ+���1u�TXa��u��Y;�#t:^�,�|����5&]y{{���]����K߾}��ިY�f|��GU�������ˬ��{n֬���W�_u�WӦM1��Đ��K�v�[���3y�d��'EDD�K�'���7����{fϞm�4J�o���$$$�֭[��}���HII���`����ADDDDDD�%\H������s�h۶-�����ݝ��L������7k�����ԩ3f��Օ��"""8t��7of���>|�tzBMwCmѢ����k<��8�ҥK�֭'N� ,,����O``����O0k�,Z�nMLL����ٳǔ�f�rssi߾=�����͍��L���-�~��j�*.^�ȳ�>˼y�hժ��_���Flll�	5�eӦM,[�JJ8�G0 IDATJHII!22���dS�EZZ�������Ҕp!��o�aҤI\�v�T��?�y�f�o������ׯ_��lܸ���6m"$$����T�����駟���Jrr�i���d���c�=��ٻ������!R22��9��C2�i�a�!aH�9�<3�!b��T����Ö�$
��d�ZdC'9������wx�o7���^�뺞��{���u=��о�N�-r%B3m�4��ӕ�����}��q��1�l�B�n��l3""+++?~d%�:u��gϲ{�n:v�ԍ�����Z-��ɓ'\�v�k׮�w�^���Kݺu�$��^��������5_}��N�RK��)%%�1c�p��5�����3g����;}��)R�%�G�ϟgҤIj�DGG3i�$V�^]�~_#G��tB!D�����ȑ#���(�>>>bmm���B��d�$�x�5jԈ��h�~�mM�"���U��e�z�쉿�?�F��tH/L�.]$�B�
D~�B!�B�W�$\�r�Jv(��ҥK���H�v�011a�…̘1C�~PP���Y�;99aaa�ѣGs%�j�r�*���)I����WvVh׮���888�$\���y��all�رc�����Ç��3g��`��}�] �~~��W̜9S�����灬��U�����'�5j�����������Ջ#F0b��6oܸd%��Z�]UG�������@JJ
�Ǐ��ښ
M`` ���̚5�'NP�^=弼vؼy�2�}ŊJ�����#Ϟ=��ʊI�&ѠA�����/���f�̞֭=�_RZ�޽�t
��ڹ~�߽{�3f���N�~��;w.M�4�֭[�^���'O2}�t�?Λo����/���?��	&ЦM"##�?>�o����
��e�HIIa������ӰaC�>}ʕ+WX�x1111�_��o���Lbˮ��_q��mTTT���l�µk�hѢ˗/��w�EKK���h�-[Fxx8�6m*R�EI��Ç�5k�r�_|A�ƍ����?V�X��E�Jt�B!��tttprrb�̙���p��!֯_�+�W!�B�ׅ$[T<ݻwg͚5���{�党1cF�g�B!�B!��lI…������V0��$��n߾
��v�111���޽{Ԯ]�T�������С��g��m֬�򵾾>ϟ?W�T�WTr���_�@�V��l3?ʼne֬Y,Y����PBCCټy3�Ǐ���Jm�����Y�f��Te�:B��ݻw������s��Q�;v�Hǎ������ooo��9����v�Z&N���}���KFF���X�t�R޹sg���;,,,8p�p���m޼y��k�Ν���bff��͛����E�l޼BCCٵkW������ڥKV�X�رc�|��Z]U"—_~���R�
]�t��͍�r��I%ᢴ�eWV�_A

r����X�f��\Y�5k֬�O�>\�~�H}�������?����ӦM�o�ΨQ�/�ŋ2S�]�^�7n�{A@@���@��N�|�Iy�&���:ub�ԩJ����C��t!��"JLLdժU����������6mZ��/B~c!�.ȡ��$$$P�jU�z�->��CF�����,�	!^]��u��Ǝ������B䐙����B!�B�!I��.���L���J�*Z'���䢆�/���w�y�T�f�!������Z�v�V��|]�=��v�x^T�y�Eqb177��̌3g�p��A�\�¦M������Ç�Œ�����J�%���G�JpN�F���ӓs���;a�ѣG̚5�gϞѳgO�����.\���:׹�^��2��Ӂ��cJJ��ͤI�r}�iii1i�$BCC9s�L�ו�P%��9dhhȭ[�?~<666����J�B�-r]_icˮ,޿�T�V
�����={6�co���0%�G�N���ʕ+3e����Կx�}��焄��;`xx8nnn������ɨQ�hٲ���*�����WTVVVXYYi:!���.\����j�����Z~c��7o2q�DRRR����nܸ��78|�0%�9S�_B�j�Z�*>>>�CA��g�tB!�B!ʘ$\�
�Q�F���o\�r���_)�r�J��������q��ae�mYz�䉲BL�^�J�odd��h(+}g�r�E\O�F��������t��U)W�
�݋�~��������ЦM�"�W�X�2dC�!::�S�N�c�\]]��x��j�?x�@�#DyQ�Ԓs��nݺ��1GGG���O7n̺u�\���qծA�[�.RLzzz<|�����<w�)
U�9w�Qi߾�Zl95n�8W�*$�:S�Ne޼y���+?W


�ڵ+}���O�>j�a��-��x�
���d�/E��p��M�\�•+W������RI��͛7<GV�֬�4�7$$$��4-ZĈ#��}KKK.\H`` :::��B!��	��͛�ԩO�>-����7Z�f
)))t�҅�3gҴiS�>}ʯ��ʚ5k�~�:nnn�Νeѧ�����0r�HF���0�d�)��!�B!�x��^�]�
����X����(�>}�իWY�bE���{��&_�~�gϞ����w�}���)�'OV�v.�}�v�1<~����(f͚���ѰaCP�~U�/_�\Oxx8����n�0��ٙ˗/���S�]�����s�}�w��
�իW���@zz:�~�-���6,���СC155eϞ=���ҢEZ�l	��ѪU+ �Ԫ2U!�CQw�ɯ���?G�AWWwwwjժ��Njj*P�+T�9w�(ȳg��^�Ve�/aC�<�J&�I��CQ>�͛7���*e����ݻ��S�bnn��Qf�eW��(T�ׯ_�кG��W�^���{{{6n�����~��,�=R]c~�!���Ŋ�Ufjj���)�xyy�����ѣ��1cƐ������#B!�BhJY��T����hii���]`yyQ%|,_���-[R�J�W�Nǎ���v�,+2��x2228x��B!�B!�B�3��BThcǎ�رcܺu;;�����q��"##���V;V�zufϞ���]�6������CCC>�V?��w����\�Rm�~q�U�S�N��iӦ
�F�*U������ԩSܸq{{{�|���^D��~�)AAADFF�����8qb��'[[[���qqq���E�n�Uջu�FHHQQQ�V[W�ѣG��]�����Crr2��M"&&��K�R�R%\]]i޼y�}������Z�>:w��իW9w�:t(������}�����]]]>|ȣG�x�7r����C%��`nn���9��?���.]�ҥK����ܾ}��K����^汕�+��/��U"?�R~.6k֌A���[oQ�vm�7oN߾}��gI�Qa�<z������G������qww�ĉ���S�jU�5k�СC���P�+j=�J���� ((��w�R�n]
Ą	�	K���ӣG����s��ԫWO�ӠALMM�������}�	!�B!^N�=��ݝӧO���Dݺu�ӧ���jd�t�����W^^c!�����ͽ{�r������ܱP�_B����LƏ����y�&
6�tHB�vnܸ��bi���Y;Q��'��B!�B!^q�p!4.�E*:::�������ٳgINN�iӦX[[�x�b�U�������d۶m������.&&&L�<Ym�ܹsٸq#			ddd���6���|�����ZY�8�������_J�:u8p��C���[mmm���ٰa�N�"%%�?�GGG�?^��*���^^^������?���N��ͱ��+ppqb����J�*@�F��ѣ���J��n�:Ν;Ǹq��;w�zzz�+B��ƍs��5._�̇~X��?~�̙3IKKc�����ׯ�>����y�&�:u*��?�OOO|||?~<����?q�����.B�5! **���Hz��뜈��^Y222bĈ�1�ӧO3q�D�KY�V����={��ݻ
M�ظq#˖-c̘1j����?��V������lْK�.q���<�T+v����͍�;w*��<y�իW�z�*)))�;�X�222�<y2���J��x<==�����ͭ���?Njj*]�v�u�k׮���q��	�^�kBTlcǎ��C�
�tB�bHNN��>S�������/aaaxzzy�Ϝ�k,0a��/_���=Æ
�{��m�Vm��d�%D�Z�`�������l�KKK+��D�����			��rxx8nnn������ɨQ�hٲe��B!�B!�(
I�^�:uX�x�ZY||<u��U+���gΜ9̙3��6U+��TP�GA�گJ�Z�X�n]���_�y����2�|�ϟ_h�ѿ������n�8�xȐ!2��:���XYY���;w�$w��!""�I�&��A�%��r��56n�H��ݩ\����#G�0c�>��C<==��+Vp��u���C�}���M@@@����7o2h� 6l�ٳg����w����>}:7n�ATBB��=ZZZL�0A)�ٳ'QQQlݺ��ݻ�=���9��=���Li��ٓ;w�p��1Z�h�v,�N6e[I߿�ruu��hܸ1}��)��jǢ�+mj}����s�$���ܜK�.���A����p233ٶm[�}��o�>6l؀��)O�<��ѣ������L*j=ooo���i۶-,�Y�f������LXX����Bm��.\�u�ֹbU�]�pA&��9r��CB����/��;wKÆ
Y�t)�[�&::�E���ۙ:u*@�c����k,0l�0tuuٴi;v�`ǎhkkӾ}{z���ڂ=2���l޼��+W�k�.Y��%��ҡC���;���pD1����Y���ƢE�1b���@��l.$00P�k�B!�BQ&$�BTh={�$55����cnn���qqq�\���;j8B�2����ȑ#���0o�<|||044���Z�щ׍��5�v���/vvv̝;�w�y���p>�޽{�\�2s��U�9y�$�v��w�a���j��2v�X���ٳgo��&vvv�����%Kr=D_�|9���0h� >��3z�ꅑ�O�<��ۄ���m�6����O����~�ر�ر���P�L��_|A�ƍ���cժU\�xlllJ}̖-[�6m�-��Ąjժ��o��b�
��'�2���y��III\�z�]�vq��9�T����K�d��������cŊ̘1�ڵk�֭[ٿ�R���-4�$�h���xxxp��9�M���ٳiҤ	�n�b͚5������T\
+/ihIԨQ���d|||����W�^j���^PP���дiS��������ѣy&�ܸq��5&�&M���B��4�B!4�8���`i׮���Ă�6m�O�V.����B*���~��W.^���˗	�_~!  �͛7��o�I�2��h:����qvvV�����7ޠG�L�>��}�������M~	/;///=z�R6f�v�ލ��W�B!�B!��N.D���G�g�\\\pqqQ;V�vm���5�x�������̙3��‡b���T�^]�щ�M���Y�n���OXZZ���7�ЦM�
�~�:�^�m���o@���o�������͛7�y�f�z;vd���jeo�����L�2�[�n���g�+Wf���̚5K��A��]��iӦq��IN�<�v\[[��k�*�̔Ɣ)S8y�$111����:^�~}��}�2����5k֬��kԨ���+�~�������舏�>>>jǦM��?���[����T&d�$�HWW�
6`ggDZc�8v��9+W���/�,4qD��Y�f�d�BCC	

e��͌?+++��¢ֻ}�6@�;M�������Y�f�c�2U!ī��$R!�(/����AQw����,�S-���_�����ԺukZ�n���l߾wwwV�Zŷ�~[&}�K�>}�1c�`oo�k�p��ruu�w�a��Ÿ��j:�
��fӦM\�p���d�4i¸q�裏��=z�wwwN�>MRRu�֥O�>��۫%���\����WWW"##�V����c֬Y���%\f?�ѣG���ѹsg�ի��iР������acc��g�B!�B!DqH…���͛���1?��#���;ԯ_�>��	&���L���ԩS�Ne���888`bb����W�^���lݺ����s��]ttth߾='N�{��j�U֋c�ȑ4i҄͛7NZZ���:��'����뜖-[��?�o�>�?��׹�>�+W���333lllhժU�}��ۗÇ�y�f~��'���000�[�nL�<��͛�:򢧧Ǟ={غu+AAA���<y��z����3i�$�ԩ��b+�W�ʕ+�����o�M�=����nݺE:w���T�V
OOObbb��֦}��|����ݛ&M�0w�\|}}8p`���u�ԉ~��
6p�����hڴ)�f͢W�^|�嗯eb[a5���333Μ9���r�
�6m���eכ��+lRbrrr��U�����rS��Dl!^XYYi:!�k��חh:!^ke1~z��y��(��P�=HKK��ѣ��歭����-���*�2���[�l���S���7�|��+W2e�lll����������޽{JYLL�/�ٳg<�l��ψ��U�%$$���KXX�����I�&�����ٻw/ϟ?���1�s�?Njj*]�v�u�k׮���q�ĉ\;{!�B!�B�$\�
MKK++�Wf�ͫ�M��U�L���~��\;��'<<�D}t�ܙΝ;�mmmF���-wq4oޜ5k���jW���Y�&s��e�ܹ��8�_am���aÆ1lذ<��w��X�{�7n�$�e�J��ɊC__�!C�0d����9u�;v���U�adQ���Ç144,v,$$$��Ԏ���,B��F��ȑ#5��5���I��%bddĭ[�����K�.JyDD@��&ٕ�X�u��\�|��{�2eʔ\������	��<x�ʕ+�N����>���۷3y�d~���=ޱc��ݣM�6,[���u�v�Z��ߏ����p�s�Nbcciذ!K�.�u��DGG�h�"bbbؾ};S�N-Q�7��ɉ�����ၧ�'���8::r�ҥ<�//\�d}��*�p�$\!�B!���r/]$�B!D	���4k֌[�n�y�����mۖcT"?C���Ԕ={����J�-hٲ%U�V-v�޽{������y��III|��w���2y�d��j����v�QM&�NU��n:B!�B��S�^�pvv&22��O�Ɋ+���#J���Bcƌ��ӓU�VCFF��ɜ={�/��B����S�_B�f͚%^�_Tl�*Ub�֭����e�M��B�����+�����|��S�F
%�a���ʹ���@�gO�v�Z�*�۷g���>}���Λ7ccc�U��رcx��a��ܸq�J�ȩI�&ju�B!�B!JCv�B!�e�}��\�x��ӧ�`�ڷoO�j��?����7�Dh���-��θ���ڝ��Ĥ����8s����X[[�ի^�:�g�V^׮]����cii���!��[�n�����.@TTP��RB��G^+_V�6Ϟ=ˁ�����ÇԬY���{KKK�w�^�8oܸ�69�E܋����_x{{JBBU�V孷���?d�����뗸�ו]@@��������'���!�/[[[N�>��۷?~��1cc�\e�m�<�B�{���Ɔ]�v���,V�]�ƍ�1cF��)�/!����w�e�ܹ���2i�$�Ty}����_@�vw�����]ǎ��)�f͚)_�Ǝϟ?/��Y�Q9��Tu�B!�B!J�ˑB!�(s���X[[�k�d�7o�<�t颁�*��ZKKK�T�B@@���4jԈ=z`kk[�zzzzxzz�m�6���ILLDWW&O�L��͕�s��� IDATe�ƍ$$$�����X�n�Νcܸqj��;w===�����B�H�?f��Ŝ:uJ������ٳ�={�����d����K���NHH�F>cn޼�ĉIIIQ�222�q�7n�����xxxP�^�b�]�u�����憿�?����5��-[ҡC�R]�B����϶�5k����֭[9s�IIIзo_&N�X����̜9�.]��g��]�FRRU�T�I�&��ۗ1cƨ��/�/!�(��2gΜW2�"�ggA����J��Ĉ��L���{9e�9����iii�:�*+�	!�B!�B�$\�,00M�!�(���@F���0�/�w�}���m۶q��9���O�<y›o����)vvvʊg���@uȐ!2��s�ZO__�9s�0gΜ뙛�cnn�V������ܹs��
Y��EDD0i�$�	FB�2Y�|9�N�BOO�	&ЧO�ׯσ

e˖-Q�jU���������/֬YCJJ
]�ta�̙4mڔ�O��믿�f��_����[��-��HKKcѢE�1CCC kb�…	DGG�T�$���Q�V-�͛Ǽy�
���gc~��1R133��̬оʢO	!ԨQC~�����?� &&�6m��[��Ȉ[�n���NDD�2.��D���LRRR��� &&�L�600 !!�```�v�J!�B!�B�Ғ��B=y�O>�D�a!��5hЀ�j:񒲵��ȑ#���(��|||044�s�!�뫠�9+����=���>���4i�D9V�N>��#���=z4G�eĈ�k�Ns�@dd$��X��oP�J:v숳�3����?�L����"11�ѣG+ecƌa���xyy1u��2�O!�x��K�,�w�fРA��B�n�u놟��W���ٙ7�x����@�F�ؿ?�z�b���8;;�t�RڴiCtt4+V��G�J��k���8p��Ç���K�cT%pܾ}cccZ�jEBBqqq�+���:B!�B!��%	������G�a!�B�TT����0!@GG'''fΜ���
�b���T�^]��	!^6������p���W���qpp�Z�jju<<<

��ݻԭ[�A�1a�����m[��…������6ݻwgƌԭ[W�{��Aƍ��l�]�:u���f����߿_I�(j?�??�'�䕘���#���9}�4IIIԭ[�>}�`oo��<��???\]]����Z�j��׏Y�f�� Q�N���o�ݻ�k����q��CE���]ףG����s��ԫWO�ӠALMM�����Ɔ�5k�y��B!�/! �Y���
���XYYi:!4��O?%((���H>��c�c'NT��������ܾ}���ǫ�366V+�ի���cݺu�[���]��8FU���%���>|�nݺBTT&&&j�����$!�B!�B�����¬_���W�B��.!���u�ԉ�S��z�jr=4B���?>?���5���ח�O�*+8gdd0y�d����s������$**
777���
�c�ʕ>|���t�=JDD������p��z��Y`[ݻwg����������HNN��>#66V)KHH��ח��0<==�Q���9�&M�J�{�����8::*u&L����˱��gذat�ޝ�m�R�j�<�(�?~�8���yN��ڵ+aaa�8q��Ç��!��)����ӧ?~<_~��$[�W^A����兛�?��3���4o�;;;���ԫY�&^^^lݺ�3gΐ�����}��e�ĉjc�ٳg���EPPiii����h�"
T���Ν�ƍIHH ##��n�:Ν;Ǹq���;w===���_���B!�B!�����\�x���@F���P�����(!�/�˲ŋfee%�����?����!7n��Ϗ��`%���ۛ��hڶm˂h֬qqq8;;ơC����(����ϳ~�z:w�̯���…�믿�f�ԩܽ{CC��z뭷HLL,v?��f��Ν;����aÆ,]��֭[͢E����a���J�*�7��ɉ�����ၧ�'���j	Æ
CWW�M�6�c�v�؁��6�۷�w��XXX��R�{��u]�p�֭[�FUم$�B!�(���իW���d�ȑ8;;k:!4��ȨH��j�b޼yʸ:?:::̟?���竕���7~�Ynnn����Z���.VVVxxxp��6l��;w���`ҤI�B!�B!�(	I�/���>>>�CQLcǎ�tB!�B�QM�/�<��������M�0q�D���HJJR���쌑�M�6���	�=Zh����]ڵk���#+���7�T)��0���j�-n?E���#�ڵ�}��,X��iӦq���\�͛7ccc k�����Çs����믿r��E._�Lxx8���l޼�7�|(���q����S�&M��!�B�]LL}���S�NxzzR�R%M�$*�?����ׯӯ_?M�"���֖#G����$����`hh������B!�B!īB.�B�r6{�lfϞ��0�B!^y͛7W��U�ϟ?W�n߾
��!C�<?&&��>����^w��Ț��R�^=��㉏�W�r���~I�)
U�۷W+�ر#��W�s�5k�|�����ǜZ�nM�֭���###��۷���ΪU����o������P�f�\�Te�:B!�B�ܽ{�A�ѠA��ۧ���ׯ��Ã�ׯ+	������ɉ�3gbcc��C�X�~=իW�ptB!�B!�xUH…BQ�6lؠ��B!^J�w����l��<��&O嵓Dv��Ʌƕs�
U"����RֱcG���9u��~�i�m�:uJ�_�~J����U�*_�o�=HKK��ѣ��E��������ݝ��P����^G^ׯ*����B!DN?���*U��ɓJR��-^��ݻw�石s�NM�#��S�NL�:�իW�������B!�B!īD.�k�ƍ�j�J�L5a�0M�)��L���T@@�2���̌O>�D�	!�e#00P�!!�(���!qqq>|CC���6����Vʆ�ѣG���G�j;o�ܼyS��caaQ�~���Ȉ[�nA�.]���֭݇[s��e���˔)Sr���ԓ#J{�
HHH��{��RG!��A�OB���駟2r�H���4������ذa������ѧOM�$����
+++M�!�B!�B�W�$\����NHHH�K>x݄����憿�?����5��-[ҡCM�&�3}�tM� �K㣏>�t�"I�BQ��ݛ�۷���ȼy�hѢ���/����ڵSSS�l�R`˗/g�ҥ���;\�zggg��i߾=���8r�&L��ޞ�}�b``��{�8y�$��=iii80�1QQ��T����ܾ}cc�<��ի۷o��ٙ�K�ҦM���Y�b��[Eq�3�˗/���Irr2Æ
��ؘ��._�̚5k����R�{��u�jՊ�����r%V�<r.� �����<I��(����fʔ)DFFR�Z5M�$�B!�B!4H.�k)$$���b"FE����4-ZĈ#��L---Y�p!������h8B!^��k�2d�M�!D�u��!fϞ��0JLVSB�����gΜ!22kkk�cիW/��Q�:u���S+kӦ
�F�R+stt���ǜ<yWWW\]]s�ջwo-ZT�~j׮��������АÇ�j��֖ӧOs��mƏ�v���8WYQ���v�څ��?�����4nܘ3f(��s��nݺBTT&&&j�GEE%KBQ�d�$���ڰa�....|��ךG!�B!�Bh�$\�355*^B�x����HLLd���J٘1cؽ{7^^^L�:U��	!�%w��y֯_��0�̌3�޽���x���ROOOOO�m�Fpp0������bbb��ɓi޼y�m�����_J�:u8p &L@[[[����6...�={����s��U>|H�Z�x�����gϞ��g�ܹlܸ���222�l�f͚xyy�u�VΜ9CRR��ۗ�'���_Ļ�n�̙t�҅={�p��5����R�
M�4�o߾�3�5j(��s���n�:Ν;Ǹq��b9w�zzz��߿D�"����I����o����'''3f-[��tHB!�B!�BC$�BTx���c����?���4�5kƸq�X�`�>�&55����{�.u��eРAj�PT	ٿ.�DGGG�?�7�|�G}��;v��ү_?\\\���ٴi.\ 99�&M�0n�8��r�/���ϟ?��ݝ'NOժUi֬C���¢��=z���;�O�&))��u�ҧO���ն�V���燫���}r�~��5k��EQcy��~~~t�ܙz��)�
4���???lll�Y�f��BQ�ܾ}���@F���P�D``�������o��W���>s��aΜ9%j�V�Z�[��ȱ��ٳ�Ċ��sss������V�Z̛7�y���^q�#���fff��]Q�}^ץ�����ܹs��
p��"""�4i�Z��B��I�OB�|d|#^'3g���ŋ<z�HӡH�/��85�B!�B�@.D����„	���?���ׯ+��edd0y�d�������x<==������
--�2�m���������bbbB�
HHH��Ņz��)1޿[[[�ݻ����ŋy���.Unnn�ܹSy����^��իWIIIa�رy�����g�}Fll�R������/aaaxzz暜2i�$<x@zz:{�����8::+��Ǐ���J׮]s�յkW���8q�Ç/�]��'�������E9v�����k׎����(��=!�xyT�TI�!�J����ȑ#���(�#>>>bmm���B����xy�,㛋/��\��BG�*U^�Ϩ'O�(�B!�B!�e��f�������bdd���'?��3���j�"�x{{M۶m���ŋСC���8t����K��\����4�*5k�dɒ%����x�b�?��_MJJ
NNN����c��ݻG�6mطogϞeذaxzz���۷�
6���?s��Y�ϟ������ܹ���X6l��[������a����iܸ1����…�?����b�r��Z�n��U���B������駟bgg���/ׯ_�tXB!�B�tttprr�СC���ϡC�prr�z��O!�BhHLL����t(B�p>>>dff�?�'�*�?!�B!����B���I�_�tI�����H�v�011a�…̘1C�~PP���дiS��������ѣe��n�Ν�����LJ�>���W�2f���}������/066V�G�+DiըQ���d|||����W�^�1�#Fx^^��}��,X��iӦq��i�N��vμy�k;v,���<|��رܸq�J�ȩI�&ju���2��U���t6l؀��9o��&���c�������d�
�Y�f���o�޷je�W�!Fxx8;v�tB!D�שS'�N���իppp���D�Q	!�BM���gРA4mڔ;vh:!^����+�"�ǫ�|N!�B!�H…�����rM8�k���۷2dH�m����߼v�ȏ��/^��ի4mڔ�ӧ��믿hժU��,�Y�f�d�BCC	

e��͌?++�'!߹s�J��Nu�Uqg��L(;x<��رܿ��%$'U����+���Y8p����磏>R�>��#�=ʁ=z����YXXp��*��ƍ���@hh(fff��7!�x�g�2��2������J�a!�xI$&&�j�*���x��	VVVL�6-��!�J�QA��E�S�d(*�0`�>L�54�/�ŋ	d�ȑ�Ej:!�B!�/�$\�r��PQ�p�Zɺ�:9%''5�2�W�ő��������븹�9fff�9s��r��6mڄ��7>�X�eO�ȩjժ��y]WQcQ������
UYi������ݻw��/���c�t邽�}�z97�?N`` ?��w�ޥJ�*ӻwo����<ooo�m���?�LժU111a�رԮ]���BCC9~�8���;�?�v��t�ܙ1c����3�N����>�}���ς��xfΜI�z�pss#%%��G�Ҷm[�ԩ�ԫ[�.�.G�e�����f�2���-^U�t������r��ḹ����Off&�F��e˖t��A�
!�B!,\��˗/+��ݻW`yY+h���q���222���$11����+;�
�:������G�a!___Ǝ��0�B!�B��ܳ���@5j��+W��s�044�V-�t�R�aaa/$ƍ7C�6m������M�x�������K8HIIQ��kC__�!C����Ν;�����Ç����۾��j�ת�Y\E����Zm*'U���"���.\Hpp0���<y������w�z���/{��%>>��O�����͛7ٺu+?��C���9s�Ǐ����ٳgY�hQ�Il~~~���r��5RSSy�������d۶m���2h� ���oe�CՃzU2ޅHOO��|�HOO租~*�/NHHH��iii,Z��#F`hh������,\�����r�R!�B!�DFF�y�f���X�`A��e-�1��DƁ�����d����%((��͛k:$!�B!�B!�+D.D�ֿV�XATTO�>��ի�X�"W�޽{������y��III|��w���2y�d��*���ۥ��_~��ח:��鉉����J�n�X�z5			������bjjʰa��m[�z��HKK#66�\�����){��!55�-ZвeK@}G��z�����3���<}����H���ѣx7���������Ն�,���Y�e���4h�ggg|}}qrr��{*��'O�`�|}}ٹs'&L�رc��_�|Y��l�2�իGbbb��*G�`„	x{{��ビ������㏩^�:P;Wu�S�N@֪�M�6��O�f����j֬��d���S�,YB�v�011a�ڵ@�.-3f̠m۶t�ؑ�s��J�i֬����޽�:u�`ccC|||��$''3�|�6mJ�j�hҤ	�������իT��*U�ɓ'L�>}}}�ԩ��ŋHJJb������R�vm%�0;U���fΜ�V����W�ҿ*W�LժU�2e��`�}�'U}�ڝf��ŴjՊjժQ�fM>���m�V��///=z�R6f�����`dB!�B�������8Ci=}�TiSKKmm��E��8PhJ||<?��3������t8���гgO~��wM�"�B!�B!�IM DAƎ˱cǸu�vvvֵ���̙3DFFbmm�v�z��̞=[y]�vm�߿���%���>|X�~a�.]�ģG�prr�F�|��7T�R'''ƌ��_���?5k���O?%((���H>��c�v&N��o�z�b߾}�[��u��еk�\�lmmqvv���%WB���I�����r��in߾���Վ�*+���ҭ[7BBB����cTTP��!^f�|�I���{�����ڴi�ĉ�LHˮz�ꤦ�r�����O��}���177ϳ��	��%Z�l���=˖-#,,L��yv;w�$33���XΝ;G\\�򽝚�
������:t���:t�@JJ
ׯ_GGG�6m�(�T��d�*�[��_��������
ccc�����C���ؿ?ZZZ|��j�;99)����?x{{s��y._��$'攞�N�޽�S +���ٙ��0�?���z��i�pwwW^/]���M��i�&%�255��;w����LIOOg����_�w��γ�޽{���d%Rlٲ�gϞ������Y�j��:##���PBCCy��!s�����?���;'N� >>��U�ҬY3�����Z���T<<<

��ݻԭ[�A�1a�e�Q�ߙT_�~��XB IDATO���s��ԫWO�ӠALMM�����Ɔ�5k)n!��'00��r!�x�5���=z���;�O�&))��u�ҧO������S�e�t�����W^^c��P���i422�jժѯ_?f͚��� �@�z022��_�D)Q.�ׯORR��C�b�q�F��(;p����F!�B!�$�BT=P�����777Ξ=Krr2M�6��ښŋ���\OOOOO�m�Fpp0������bbb��ɓն��;w.7n$!!�����������͒%K�I�FFF̛7�����/_���^^^������?���N��ͱ���o߾��?{�l���

"--
SSS-ZĠA���YZZR�J����Q�F���[[�|ۯY�&^^^lݺ�3gΐ�����}��e�ĉ�����5��n�:Ν;Ǹq���8w�zzz��&B����oe�֭[z�q�شiW�\�ʕ+���3l�0��P�Z�\�۷o����w� !!!�>���V�\���.33S�z��;v����ӡC"""x��9:t�r��<x�]]�\m��TuD�ɑ#Gx�����Y�v-�/�u��add�֭[Y�~=�N��u~pp0�&Mb�֭\�p��c�r��-֬Yòe���s͚5\�t�.]��e�ڶm�͛7�4i'O����S��E%,,�+W�вeKV�Z��ŋ�:u*�۷���r�J�,Y����f����pڶm�ڵk�7o^�}����{\���񇈐�b��3#�Z��s�`�0�2�g�V9��c!1k�r�T&dBH�fs�ON�eRm)i�����tuut���~�u�]��z�^�wt��~=_��mٴi�F�"55���v�܉��yyyʮ^�������ʊ���u�VY�vm�.���ٲe������ݻw;v,���1}�t��)))�T*�����J$)h���dgg�,jiiIll,`���e�[��ٵk��NXB!�E���⣏>Ҹ���J`` ����T*jԨ�Xm?�1ԓ�6m�ro$''�;v�������s�
]�d�T�Z�
6�"�+����=z���ЧO���ۛ��`���5jmڴQ�B!�B!�(L.D�gll�…5�RRR011�(722b�ܹ�N:,n5��&�|�reE�
ĠA�4�7n���{���z��8;;���\j�666��ؔ�}�ڵk3o�<�͛W�s�$��5kbgg���/���4i����dΜ9ôi��!�/������4�����N��$��XZZҡC~��g>�ŋ	

�~`̘1Z�N�����(��J���ի4jԈ.]�дiSZ�j���\�vm����޽{�|�2����;wV�'�՟�L]GTL�/Vu&N�ȪU����aٲe�l������ˋ���[�%K���?���}||���&44�؄��Ͷm�x��ׁ�]`6m�D�V���J�X�n:t`���,\��{�����*��}��g,^�Xٝ�`_��@N�{
(���k�Һuk���hР)))�����}444$##OOO���bkkˌ3�1cF����`aa����Ã��`e����?			�o����4v		���Vc%؂DGGE'��ˢ��e���H���B!�(ɖ-[�z�*M�4a�ҥ���$$$�`�ٴi���Ŏa�+^c�'Ѽys���hذ!����T*"##��
!��ףG&N�Ȝ9s�߿�c-b&���G�Y~��=,X��#055���?>۷oWv�B!�B!�(H.D��������3������Ċ+x�wt�x\�ݻ���%�#  SSS���u�[�F��~�:�ϟ�Xq����e:���+++����r�
111�޽�͛7k%\\�t�v��)�/\�hN(/��ٳ,[�Ly�t��u�G��D�!C�p����Ǚ3g����l�S��n�"33�:u�h���������N%�[�V^��dףG<���޽;W�\)��ς:�����8�����jժ��.�����V
����ST_S�LQ�V����xnn�2a�(+W�dҤI8p��`�\]]�={v��kԨAVV\�z��={2b�F��Q/""wwwe'��-[��憭�-��������ŋ���?��h�B��B&��
!*����Gq���N�"22WWW%������Ņ�3gr��a%ᢼ���I̛7�f͚0v�XT*w��y�� �@!ī櫯�bϞ=�������pJ���^T~~~���1z�h�l̘1l۶
??���A!�B!�/�g���O�����W�^���|�ᇜ:u��u�2u�TG(W���qss#,,���RRR���
]�'D���p���CBB�="11�Rϝ9s&#G�����мys塷z�wA�~�-�/_�ѣG�?^�[�n��u��<x�o������R�����666�W�^?~���,Z�n�1�]ۍ7��W��눊������RT=�.+%���S������V.+-����qve=z4��ɨT*�u�Fvv6������klذ���̞=�jժêU�5j*�����z׮]�w����P�ԓkK�G�cG��g5uYi�z!^]۷og���C�
��!!^,���@~�EA����)���C�Ǟ<(򸺿�ƨfff�k��Ǫ2B�g�^�z�\��
6���?�:�'���h�"���C׮]=z4���uԿ
+\�~�믿ҫW/�O�^b9@vv6k׮��Ɔ��{�!C��~�z�߿_d_���8::ҽ{wz��͗_~ɽ{��:EŖ��IPP]�t�A�J�F�aaaAPP��ГB!�B!DA�Å��ԫs�����oܿ��
��{�1y�d��a��ӹsgY�r%NNNt��I�Q	Q�
2���~��w��ܔ�nݺ�:����6n��ƍ5�܉@�v�ڸ��j����1`��b�x��w9v����E���o�i��acc�����υ�:u�ĩS�HLLԊO����9��r��i��ǎ��7�,��-Zp��E~���"W�|��}����رc����W�+jeV(>!�nݺL�8��'���?�c�V�X�ܹs5N���ښ�]�r��v���ٳgY�~=���8991|�p�k)N�ĩ���AOO;�[]�8�'B�WG@@vvv�C�R�='�Н«o?Ϊܥ%ȗ��Cծ]���t��Ҋ�U4%%E�W�����q����$##�U�V1��"��y7n~~~|��'�8qB��<���t�u�R����…y��C�y�v===����z�[�����L�>����NJJ
*����x����~�L�6MY�&''�;v�����<�������������1KKKbcc9p��Q!�B!�BMv����vvvlݺ��Ǐ�l�+�/;;;���k���kƌ��p��0BBB		)򘾾>�/���###���dڴi��ۧOf̘�믿���>���4m�[[[��������t�ԉʕ+cll���
�-�x�_�ĉ�����}}}Z�j��ٳ������5��Y���nݺa``�/�����/��B�5�|8"^...$%%�$��;�_����;��_��Ç�����g�Q�R%z����S�(}�����ݗzʥK��2333*U��7�|Cff&o����zkժU�վ��666����e��s����JSSS���éS���bccK�^�z@�;|���u�B!��I4n���i� �{���q=�1T˖-���(�xdd$�Z���� �@�egg+��N
B�*U��ƍټy��Cy"�7o�֭[���ʱcǔ��*���mٲ%���,Y���rh߾=������O���бcGbcc	�j�y�愆�ͤI�����,����=
����L]G!�B!�� Y�E!�xU�^�ɓ'3y�d���IE%mXYYaeeU�~

qvv.�N�>j֬��ٳ���N�(H�;@�ƍy��4�U�^�A�JZZ��l���ƅ9r$e��b211a�������@~b�̙3�=��ٙ]�vq��	�PjԨ��_���svvf˖-ܸq�U�~}���h۶-͛7��g޼yL�>GGG5��en{�С$''�����iݺ5����*����6m��Օy��Ѻuk���o���ٺu+lذ�����ǵk�h֬m۶%55���$�	5���mۖ�{#�B!����ٓM�6����ҥK177'!!�/���=z<v��kշo_N�:ŷ�~K�ʕ�߿?���ܾ}�C�)����߿�^��ų���#ƌ�ٳg����Q�F�I�����C(R�ō�+?u�Ǐ��>S>�]]]K�-�,���\,�p�:����]I�lٲ%nnn�������F���Sb;v,*��;w���YDQ�"�h�B��B!�B!DA�p!�B����!''����mɇʱc�����~���ׯ���[�B7|||7n			4i�;;;,XPb�M�ڵ9q�K�,a�Ν$''cdd��ϒ%Kx뭷�Z|�k���͍�S�Ҽys���100 ++������k͚5���r��5����M����>�֭#!!�_�t��|���en��www<<<����8֩S'�	8r��Ν���^����s��Q�׭[���t�
���){��[�n=z���x�v���'��$��Ʉ��@׮]9r��#B!�����ڵk�}�f͚i�����1����%22���֬YÚ5k�b<xp��N*�5�8P<K�1d�޽O���"ߍ7����Nb(��ڵk���Y?11Q��`�������%Ɠ��@�Z������u�B!�B!
��!�B�����-Z�(v�
������/�����|��T�V��*Jw�ʕ�?ny�:u�2e
s����E�����*�[�.�V�bժU%�]��-�Y�&���;����;Vk@�snm_��ѣ=z�V��I��h���aèR�
!!!\�z��M�ңG�z����T*6n�Hdd$iiiԬY�N�:1}�tZ�j����OY�n���ܿ�~���z�j���4~����044�o߾Ot-B!��ӧ�&88���<F�E�6m�ر��CB!�U�	�'H������r��n߾M�z��ݻ7S�LQ&a>��5��\�2k֬!44�}��q�����144�}���1B���^��ų��၏�������S����(��S��EQ�S+U�T�����sԿ�R��E�w/V-++K���.Me�_]OOOO똺���!�B!�B�$�B<S����:!�c����u�%gllLVV�ڵcڴiE>�P377g�����0f���͟W��%M�J�����u(υ��M���ddd�ܹs�;wn���������(�Y�&vvv������L�&MHNN�̙3L�6�5j<�E!�x,���c���1SSS ��پ};իW�q�B!��]�6���c޼y��-.y����1�����?��?��ԾJ���r�U@@...�[��L�����aÆ���$&&�x߽R�J���q��]

��w�(/SSS���سg�2V}�իGjj*ԫWO�XFF�RG!�B!��0I��̬Y�����uB��ԬY3]� t($$��aÆr�4h�
zFшWM^^{��eŊ?~�E��2	ϋ��{��%  @�����)���:�N�2(iuNQ4???���4vR3f۶m���GGGF'�B�����v��>��sf̘��P�x�u�֍�� V�\���;u���ˋ���6m�Ν;��]����ٵkÇ'%%�'���ʊM�6���ʼy�hݺ5��7���lݺ�r?OP'�\�vMy�նm[RSSIJJ�J�HJJR�!�B!�B&	B!�����m�������2p�@���HKK�uh
���yOH�^�:nnn|��'�7���0���000x��!^=�����h<<<����jժt�ޝY�fabb�U��LJO?��6m�(9233�������ܾ}z���ԩS��<���O֯_Ott4YYY�hт���3p�@�z������͛7111a��L�<��U�*�rss�������������C��Xܠ��233	

�K�.4h�@)oԨ1n�8jժ���~!�B��d(�6]� �c�s����h�Bס��ĉ����ܹs<X�ؔ)S��={�$44�իW�z�j����̈́	8r��Ν�J�300`Μ9�nS�2l�0LMMٳgݺu��ѣ���өS'����������/D!�B!�/-I�ό������C�����uB�Wؕ+W�Z[w��e�ƍxzzr��
F�M`` o��cƌ!55���%��s��8::�r�J����f
!ij�b�
���@NN���9s���4�zzz����$#dee��Gq��U�Njj*�����ƢR��Q����888p��-�nbb".�ѣG2����3}�t�z)))�T*����FOOooo�l٢�{��qqq���q��]Ǝ[�z���';;���0������r��^�o�B!�BƁ�i�T���C�L�8���dN�8���t���X�ի�����ޜ<y���Z�jń	�ݻ�RoΜ9�����{����`��0�b344D�R�q�F"##IKK�f͚t�ԉ�ӧӪU�r��駟�n�:RSS��>���c���DEE1~�x��QQQҷo�'�!�B!�B��$�B<S2a[��zR�B��nݺ���7���ܻw��>�����4o�\�cjj����u���ųfgg������B���?���]�t��̟?�7n����Fݖ-[�R��]&�l��իWiҤ	K�.��7�$!!����ȦM��66o�̭[�077gٲe����j�*v�܉J�R.���IHH�}�����`ffFRR��������J
�ڵk����������App��7{Y�EGG��oj}��e��ђp!�B�'&�@!ī��͍Ν;���2c�]�S&�7��ݽ�:իW���ggg���3���Y�}O###�Ν�ܹsK���m[[[cmm�QV�fM����%99�&M����̙3g�6m����B!�B!DA�p!�B<gs��!""B�aQa���?qIIIxzz���K�j՘9s&�1&&&Zu�4i��˗9r�Fy��ݙ5k��"��鰰�(Sy�I���ʎ:t���'''"##�.���d���H\]]�Сo��6...̜9�Ç+m��>��3�5k�����ч�o@www7n�'z���akkKxx��pQ�F
�����ի��ٓ#F0b��6�Z��ŋI�j-Z�Ш#�B!����[̙3lmm155�uH�spp`�޽0o�<055���^��	!�B!����{�
!����2p�@]�!D��$?'qqq�k׎-Z�k�.�-[Ƶk�X�xq�����Eff擄,����ڵ���;p��u������d ?ɢ�w�y�7n(e��m۶-1�k׮`cc�����N�HLLT�Ξ=�jժêU�5j*�����6�Z/==�Z�jiť.S�B!�B�d-ZD�:uJݱA<_իW��͍��0RRRHII!,,777t�B!�B!*(��BTh�JK�b�Y�]PժU111�k׮L�0AY��e���
		!&&ȟ\Ux�r!tm�ڵ�A�����?������^{�����'N`iiI͚5�<�Q�F<z�ooo4h�<CBQ��'e�T��y�#77==�'
�nQuU�T�L����x<++KymmmM׮]9r��w���ٳ�_����>|x��c,���ee�!�B!����<\]]����}���G���F��[��A�1a������׹sgY�r%NNNt��I�Q	!�B!��"��!���ܸq���P��ۇ��7:t�uX�;}�4������ǨQ�hӦ���������C�q�ʕrշ����X[ IDAT��ޞ��D�?�ѣG	`ɒ%T�Rz��A�=�޽;u���I�&@���O3�B&�
!��;wN#��������륞۸qc~��wΜ9���)�gΜ�wHRkذ!��������ۦ��)III�ٳG��acc���
			:t�͛7���$R��^�z�HMM%##�z��i���B!tA�OB��\\\����{�'	�3p�@F����qqqT�^]�!�����;;;]�!�B!�B��$\Q�������?���ox{{��Nhh�� ��ݻǂ1b�2qiذa̟?��۷˿��P��틍������
#""��oժ�Z�b„	$''űc�g�ʕT�T�������o����T��w�NHH��#�x���/���˗�t�R�x�
���pww(�ʢ={�dӦM����t�R���IHH��/��G�J�nݺ�ʕ+qww�N�:xyyBӦMٹs'VVVlڴ	WWW�͛G�֭����g�֭XXX�a��Jrr2���8�֭[�������]�zm۶%55���$�Ċ��$��B�<�I����|��7�X���T���Y�z5={��󲋂B!�B!�J.�ΩW-��PQU�V�7�x�U�V���K�سg#G��uh�<???���=z�R6f��mۆ�����:�NMd��C�
��ÇO�pQX�&M=z��;����QQQ|��7@~…B���������fnnΨQ�J=���Çs��5&M��q�Y�fe'N$""�s��1x�`��S�LQ^O�0�#G�p��9���5�0g�����������C�n�I:e�׭[7�=J||��$���x@3�D!�B�g),,��?�www&O���p�xf�4i�ŋ����u(B!�B!��1I…x!dgg���#G000���899Q�Z5�ΡC�ؾ};.\ ''z�쉣�#5j� 778@JJ
������1t�Plmm����>&L��Ņcǎi$\dgg���KDD7o���Ą0y�d�V���S'�DGG���ADDU�V�{��̚5��Ay�

��ӓs��Q�Z5�����ٳ5vz�}�6�֭��ѣܻw�^�z���R����?�d���DGG���E�-?~<$33���S�n]BCC5nD_�v�aÆѤIv��Mff&AAAt�҅
(�5j���AAA�7�Z�j��_W!�ˮ^�z:��C����ɉ'�[��Si����;���%�xy`gg��0^*eI���dѢE���`llL�����0ũU�~~~|��9r�۷oS�^=z��͔)S022R�֫W???���9y�$999�nK�{�V��R�ظq#������Q�fM:u�����iժ�RwذaT�R����^�
@ӦM�ѣ�ׯ_?V�^MTT�Ǐ׸֨�(

�۷o��!��i��/�'���O�3��S����#�b�d!�B!�B��$\����3'N��'����C�͛�o;���qNjj*AAAܹs�%K����͖-[�:< ..���8�޽[��{;v����J����>}:			JYJJ
*����x����n��X��={����Cxx8gΜ���_���8�N�6�����;v������+�?�tҤI$''+��۷��w�j]��?==nݺ������…y��C�aԨQ�T*<����R�رc�����߿���l,--�b���$66�0|�p��BM���;-Z��(+n��U�Ҹqc��<V�xCBB����Km߾}�;w�:п�g��XjժE�~��z�yyyO�M!ċ�R�J��U�vmV�^]b��7j׮ͼy�gI7n���{������;w.s��-����
666O�^͚5�����ח��d�4i@rr2gΜaڴi�bB!��&�'!^O:�9�<C��O�>�]��)E%ī-00���@]�!�B!�B�Ғ��B�믿		��Ԕu��Ddd�2�e۶m@~bƐ!C�T�qqqL�6���(����P֮]���< <<���˕pall�����������@���qqq��̌��$��݉��%,,Lk'��Ǐ���E�.]8�<����ƍ��������6o�7776l���/*����H%�a�֭$''ӴiS�-[F�6m���c�…Z�,�߼y3�n���ܜe˖abbªU�عs'*��!C�0v�X���شiS�	=z��w	x��7�bW�EGGK…��ꫯ8u�F�BI�߿�����75j�Pv��hJ�������_M^^�~�)-Z��7��A�B!�ϖ��{��%  @O`jj������B!�����d:t�mۨ\�����7k�,�gtB!�B!���K�sgaa��UZ9�_|A˖-�^�:S�L�����cǎ���?cnnΏ?�Ț5kX�bYYYJ=�j������_1b�N�:EXXX���ѣGT�򿼥�����iӦ
�+W�e˖����Վ��3������ӡC%!!22�ڝ7o͚5�Z�jJ"ɝ;w��G���Ņv�ڡ��O�N���/��z�?~��>��f͚Q�F
\]]9u�;w��W�1b�.]Rv8�����ٳԬY�N�:p��E ?ɣ0����:B�╴�3��Q���Sv�(�g��T�u���v�Z����_�>
4�O�>xyy����B!�x��W����aaa������BXXnnn�:<!�B�
�ӧ��ՄB!�B!�/��B�Z�j���]�6���J٭[��3g�ϟ�:��v�g�f�������7�|äI����+��[�nP�n]��ڵk���yNbb�VY׮]5�w����ׯ?Q�fff�k###@�{�n�C����;Zm=��oܸ@۶m�lS��ޞ��`�������ĉ<z��{OIvIOO�V�ZZ���u�xQ�9�̻M�B�ڵ�0aǎ��ի���v��Ezz:T�Hxx8�v�b���:�N��S��D��?�>����bbb����ԟ�B!��Ν;����ʕ+prrR�مBQv�b�TR�2^BQ///u����s�B!�B��$�B<w���TժUKl󫯾��4mڔ>�333ڵk�����ښ�]�r��v���ٳgY�~=���8991|��2_ǯ��
�o����v��njwȀ�%%��o��iW___y]�R%���6�]8�g�QeE166f���OTT=z��j��LM]V��xQ���_�믿���CӦM:t(�W�45rrrرc'O�$==��u�ңG������,O��z���~���/��m߾�'Np��M�T�B�fͰ���w�ޥ�UR��]�ݻw	�}��+uLLLh׮���2��5k��=B<�O���ۛ��`���5jmڴQ�Q��<�u�؋���;;;]�!�B�2��B�\���<<<���Z�jOܞ��O!2!ē
d�ر�C!�B!�S&	⥠^�K�R);N\m��ÇJ"���666��ؐ����C�ؼy3���eN�x��ZLϞ=�rSSS���سg���ej�ܹsJ�	�?<x��ן���4mڔ�W��믿bii�����k�}�7lؐ?�����D���K�;n�8���{���9q�zzzt��M9^�^=RSS��Ƞ^�z�fdd(u�xYܻw����*e�����lQЃX�x1W�\Q�n޼Ihh(�/_��յ�d����呑���M��]m��o`` aaaJ��r��%.]�Ľ{�<xp��+Mtt4999ENL�ر#qqq�8q��}�>���x�^�I���c���1B�[cذa̟?��۷S�zuG(�B!����XL�KB�����e���4jԈ�:!�B!�BQ��ϰ�;y�$����…̟?_)�s�C���‚����lZ�nM�6m����?���ٳ�|�2M�4�_�~�q+++\]]�p��=��۬Y��O������ˉ����Ç�>}www�'n�4�����ݝ_��������˗k�}��&V�\Ijj*999|��WXXX��K�n���:t(����Ν;���[ԩSG9޶m[�����Q����2�����?iР˖-#00777�����Õ+Whݺ5_}�AAAxzz��oGdd$��;DHHH��E��F��ԩS�$�?��8x� ...�e�&O���}���{U�u���Z�l�u�:yD]G�g���B#��U���GZZ�G�V�ƌCZZ~~~:�L!�BQ���'/	!�˧y��,Z�www._���p�B!�B!D)d��R�ٳ'���,\���j�p����888���u:u�Td��=�322bŊ�&L�ȑ#�;w{{{��̙3G�ccc&L��QfnnΨQ��������s��!.^��ԩS��~��i%.<��'N�HDD�Ν�Z�~ʔ)Z�Ǐ����ѣ�Ʊnݺq��Q����;v>G��f�ȑe*		!66��S�*Ic���L�>]I�R;y�$�|�	
4��^��ɉ�?����(z��X1���Ѷm[F�I�v��_���ٻw/ׯ_��w����kk�NJ�,~��77n�uL]��#��ܾ}�u��q��Q�ݻG�^�pqqѪ��[E��jnn.>>>8p����133c�С���j����T�Z��ݻ3k�,LLLJ��СCl߾�.������	={���ёG�1x�`�֭Khh��N:׮]cذa4i҄ݻw���IPP]�tQ>/5j���AAA�7�Z�j=�7S!�B��R�m|||���OiӦ
6l ;;___"""�y�&&&&0�ɓ'S�jU�lق���۷Wv������ё/��Rc�Knܸ����2>S���q��8w�ժU�O�>̞=[c'����d�$^d$%%�[s��!  GGG"""t�3s���bE;v��v�">>�;w�P�V-�z�-�
F��ݟz߅�V!!!���еk�b�	!�B!�Bw$�B��Ӹ���g����C���x���[���ޞ�~�
������dذaT�R����^�
@ӦM�ѣ��S�jULMMy�7n
6�8nhh�J�b�ƍDFF���F͚5�ԩӧO�U�VZmzzz�h�"bbb066�����'i�,�����ڵk9t�w���>��Օ���?�u��^�z�������ɓ'��ɡU�VL�0����5k�T^���������ի���b���Ǣ��044�x0*ċ�ƍ��������0s��"ۺv�Z��U����Œ%KHII�G�Z���w���_���g�r��Y����׿�ŠA��V�Z��+���@�EM]��#�.dff2i�$�����}��q���R���f˖-�G\\w��e�ر�W�X��={���!<<�3g����Q�}|��7���j����ĝ;wX�d	�F�B�Rq��A��cǎ��}��~����������Ғ��X8����K�v!��c�رZ�WB!�%���$33SIL��>ӧO'!!A�����J�">>ooo��틗��ϟ';;�5jp� WN�}���tnܸ�$�gڴi�=���v��Ann.���@��{2^/�Ç3i�$�Ν��P����T��7�|C���	x)�����9z�ֳ�����r��!���cǎq��1�����ŋ5��>��+�ӧO���Mpp0yyy�5�6m�бcG]�&�B!�B�$�BTh��+\^�V-�U��
��������<vߥ122b�ܹe~�P�vmV�^���-��';;;���\j�g��ƍ��w+��ٳ@�6�-[��8V�fM����%99�&M����̙3g�6m��T��J�̠�^��pyAyyy�+U�Tj�²������А3f��_��w�addĻ��ZZZҡC~��g>�ŋ	

�~`̘1Z	Syyyʵ>x�����WW�WS����yٺu+���4mڔe˖ѦM����ɫ���P֮]���< <<�����?~///�t����?>7n���GG�"�ضm���2�J�*Ǵiӈ���'K�iӦ".ԻOEGGE'��ˢ��e������B!�(N˖-Q�T��Lh߾=...���������;������akk�[o�E\\gΜ��Ғ�r��a��􈎎&''e'�w�}��{�͛7��͍�
���J�"22RI�(�xO�K�E��O?akkˇ~X�B���{�=�N��ܹs8p u���uHO�ѣG�,_�|9���Аɓ'ӫW/6lHFF111lذ����Y�d�S뻢%_ܻw�0b�LMM6l���g����c	!�B!�B��g
!D�����۷���7n\��hԨJY@@������?�X�x^5j�o�]P����`ݺu���h}=V���:666������CVV��khh���K�.��/�d�Сdee�y�f��:�޽{JYyv�(�N�:@�������u�xZ,,,4�J*?r�...�k�}}}:u��_|Qj?�?�����_1b�N�:EXX�V}ggg,--��קC��$����b�8v�?��3���㏬Y��+V(��k�fĈ\�t�'N�?_gϞUvʂ�}v5o�\��-Zh�B!�B��3~R����X;""wwwڴiC�ʕiٲ%nnn���(=�'a���Oܹs��C����������++�c�7o͚5�Z�jJ��;w�����xI�h2d]�tA�Rɂ&B���_~���^��=��~w�™3g��ȈM�6aooO�ƍ�\�2���8�M�6allLxx8�Ν�u�ό��iii�=Z)3fiii����02!�B!�B&;\!*���_yݦM�Rd��ի����'�|�$e�����允��s�U����Ғ��`���;>��cZ�lɕ+W�Ĥ��}�]v��Ś5k�裏h޼9w���~ ,,�v�ڱh�" ?�!//���e5��6�'N�����ۙ8q�c�;s�L��Ҙ<y2�>͛7'55��V]��Ȉ��:D߾}�u�7n,5΢��E�ܺu�7nh%VܸqC�#��\�~�:h����;��;{�l/^LLL111|��7L�4	;;�"'v��U�z�zuE�u�s����Z�
�pcooOpp0~~~XZZr��	=z�{ァ�|����;��.S�B��;}	!����s��b)<�W/�P�nlj����ӇU�V)	�Z�j8::��?p��A���C||<zzz�+�bff��622 77W)+�xO�K�Er��M@˖-ٽ{�F��xu��A�R�Y�<ݺu///�?ν{�033c��񸸸��Cdgg���KDD7o���Ą0y�d�g�p¤��ݻw0~��b�coo���;w�T~g�ۉ����Ã���V�J��ݙ5k&&&%�]�Zff&>>>>|�۷ocbbB�^��:u*���Z����ɹs�V�}��a����n������p�RRR�����̌�C�bkk��oPP]�t�A�Jy�F���� ((�q����B!�B!�I…�BkРXXX���J�ʕ��۹sgY�r%NNN���B�L
����INNVV�/���-?��3�.]���?�8V�Z5��ꄆO>�����nݺ�600��ёŋ��~����k��V�~mmm���a�ƍZ	�����.]�p��A�n��֭[��M/IQ�թS'N�:Ebb�F�	�;w.�m!ʣ�E=�SSO�+<ɯ`Rq����ڵ+G�a��ݜ={�������Ç/�M�D =��7�ꫯ8�<M�6�>��̌v��iM�666f���OTT=z�P�W�,�?u���)ī'  ;;;]�!�xE*��!t�<�'�“�KK�R��נA�~�mΝ;Gzz:G���[�.��Ǐ';;���:v�HݺuKlW___y]�X�<�=/��Ç�Œ��٣1IYQ���w�2y�d�X.\��$[t��}�O�NBB�R����J�">>oo��c� IDAT�+�={����ݻ�����ӧ���X��={����Cxx8gΜ���_Iv,���,>��#�^������Hll,*�J�MXmڴiddd(}�ر���\�Y���7[�lQ�?x�8���{��2�ؿ?���XZZj�eiiIll,к�+�B!�B�(�n��:u�T�E���p���Y�f��
/ű���믿�믿f̘1�!B!����BBB�<f``���VVVԪU�ʕ+ӢEfΜ	h>دQ�K�.eРAԯ_===

�ҥ˗/�XAj�ĉ4h�===<xP�8����ׯ���l޼����ӧ3f���_G__}}}�6m���-NNNJ����cmm���!���t�ؑ�ӧ�cQ�խ[7��_����/ԨQ��B</M�6��_�(���/�FFF������˖-[ppp�Ν;xzzj�=w��{�C��_��cbbP�T̞=[k��*�ǍGժU	�ĉ���ѭ[7�x�z������u�B!���Ի\�ٳG�[�+66V�kmm��۸{�.ݻw�'{�����ߒ�������U�񞌗ċ"77��^{�������:!D9p��u7n�J���ɓ����\��ߟ��ڷoO`` ?��!!!t�ؑ��X����$ɂ�Do޼	P�.��ŝ��Ҵ�?~///N�<�J��q��ܸq��.l˖-\�z�&M�(����K�ƍILLdӦMZ�4oޜ��P����4i�������P֮]�ɓ'9v����+����x��7��P���!�B!�B�d�!��T�vmf̘�Q�~PQx�ECCC4v�(���e�I�%~�M�4Iy��8�XYY�:i����ɓ'3y���+����^�:�
"44���4�QZZ.\`�ȑ���J���Y�~=���,Y��:p��E�/_^�C�%99gggH�֭��?̈́,��˗�t�R�x�
���pww�_�~��u��I����իWY�d�R~������_�>C���'//���~�:u�(u۶mKjj*IIIZ�����:B!�BQVVVlڴ	WWW�͛G�֭����g�֭XXX�a�z���ʕ+ٱc��pѭ[7<==ٶm={�|��3ޓ�xQT�Z��^�a!
P�UZ��S���WWW:t�@�N��?>�f�Ҩ���;�7�e˖���akkKxx8�����u��}��|��
���Y��ߡC\]]qrr"22�����|���R�����4��7�b	-�dc�$FE��c�����c���!?#2�X��_�u��Ze#�Z�V�V�����z�zU���d�����z<���x�U����Ty��ͻ{��̝;�>���G�j\o��ٴi�ooo"""���S�������Odd$��鸺���鉧���u.]��%pT�ڰJ�G!�B!��'.�B�zf�ر�9�Ç����Ç�q�k׮�S�Nz��~:t(VVV8p@i;p��<�o���#|||��5&L���	___�~�UIN!!!���лwo������F��͛��燓��Ǐ';;�.]���;�T:�j�QPP�������?*������;V�p�_�~j�T�.���j�x�B<i+]�R��^@QTT�k�����#���������sx�9�Ԯ]��1c3f̨6�W!�Е���ڵ#11^y��֭[166f���J�-Z���@aa!;vT6fh۶-�=�>�S�N��ƭ��<���B��A���K/��k{/�����+ύ���J���˗�K�76++��~���j��srrR��G�ܸq��kV6F�����U���͛����)�-,,��*?*ӦM�q��$$$����w�y���
ծs�����5�P���!�B!�B�$�B!��g\\\X�~=�ƍcԨQ̘1�~�F����ccce׫[�nq��-e�ƍ�;<�PU9{###���������###�$NT��Ã�� :uꄑ�FFF������ǢE�4����ҷo_5j���5cǎ�/���Ȩ�1f͚���&&&ѵkW�-[Ƅ	عs�Z�&M�(�U��T���)�������cffƀ���B�G}����u:���Ǖ�6���8~�x��WS�ϟ',,�Y�f1s�L֬YÅ��B�'LU�O�133#""///lllhذ!����i�&��nnn�f���Eu�9uU��=y^BQ[�����V���$4h�q]m'���ϯ�*�!..��~���@@�:�*���Y�P>�������777<HPPݻw�����k�2h� ��V�s�Ŭj�v}!�B!�B�Gյ:�xD۷o���X�a!j(::///}�!*1n�8lll���'33���bZ�hA������y�����ҥ�F�b�ƍ�=�.]��9*!�4i҄9s�0g�����j[t����N�4mڔU�VU٧����k�J�(��ŋ@���۷W;֤I���ذa����n�(�a�…L�8SSS��"��R��*'N���#Ѵo�>�~�m8@LL����*��SMܿ�����������A`` ��ј���yB!꿪�fYXX(U����၇��F�̙3�9sf��V��v]���yI!��`kk˕+W�x�"�z�R�U��gccCFF���U��Ç�ƍ�ׯ/��F���-[�(�3�KLLT��x��y����ҪU+�]�ƅx�W�v�&��leaa��?���B\\�7o&44��Çeյ�����ͥE�j����*}�B!�B�d�
�μ��+�1B�a!jaĈjo.�'����&$$��[���΄	$٢��ٳ�={6�
�w8B<U


��_����
��1c���e˖DFF*m����������XbB�?���j,����lΞ=���%���i֬gΜ���whlܸ���F����=���%!V!�����%!�uMU-iٲe$''SRRBRR˖-�諪�4o�<���x������}����L�4I髪�p��u��{��<������پ};?��3%%%dgg�m�6Ə���y��7�ѣ�FK�.U�<���1����"WWW���ILL������De��^�b�С8::�{�n


�С����zuU�����k��*V�B!�B!��H�Qg�L�”)S��B!��嵽�=C�����Ą�2u�T%)#&&�իWcll�XbB<]T����̜9{{{����,lÆ
9r�[�naee�[o����?FFFj׹}�6�W��ԩSܿ;;;Ǝ�ܹs�?v�V�����Ç���s��a���044��Ύ�C�*�s�O�x��1V5O(�]���C�z�-LLLx��7���"&&�����t��Gtt4iiibee���+��ں���ݻDEEѳgO������-[���HTTcƌ��ܼ�8�B���</	!��k���:t�k׮���We_???�?Nbb�F⟱�1ӧOW�����Ν;xxx`cc�����d������������1N����?���7o�g�.]x�w��<___�=���7n�ڱ6m�h����ח��`BBB		Q;��࠼�ӧ'N� 99Y� 99�]‡B!�B!�T�u��ۛ
ȗ|�W=����!�����5�7�O�>�Z���
V��_&  ��+W�r�J&O���a�B�Thh(w��U�1i�$6o��͛7)..&++����M��Ç�s�ݻ���?������Q\\LZZ��lQ���0֯_���)..������$�,Y��;�65���y���r�%��������SZZZ�<�[�n���9w������QQQj�Ht���_MAA���c9;;SPP��Çk�B��%!���ܹsj	�噘����;͚5�Q�F��۳x�b��333"""�����Ɔ�
baa���+�6mR��0s�LZ�nMÆ
)**Rڍ��		!44�~��ѬY3�����Ņ��P��иqc�񆆆ҷo_5j���5cǎ�/�P�����377g�ƍ�9kkk6l���5�G�fӦMXXX�~��ѩS'���022���???-Z��8p ������k\#>>333��B!�B!�O*\�:ehhX�b!ēG�-���W������������˫��B��oߞ��e�Ŷm�HII��_d�ܹ��ّ��App0gΜ!&&F��ɍ7hժK�,�s��$%%HNNN���ٳ�5k����Hqq1�������s�N���9w��*5���y�={��7obooO���jC�����㏜;w��={�|/w����9s2d
4 ))��'�-�e��O��s��c��N�>����u�Q!�x���B��Լys����ڲ�����Rk���`ƌ̘1��k������V�q�
��jڴ)�V������mڴ)�g�f���U^���R�����+T�I�&xyy�a�233iݺ5���\�p��'*�$�B!�B��p!�Ԉ#1b���B��޽{��S-66�F��O����"}!�
�����/v���QKB8r�����j�
(KVX�p!Æ
#66VIf8v���ͣ[�n888Ȕ)S����Ԕ��|"##IOO���OOO<==��gMb�l�111��-T��?�����W����'ORZZJjj*䧟~��ٳ����x�.]�m۶c�k�N��B!�B�����BAAs����
333222X�|9/��#|:�����W_�$|DFFbcc������B!�B!Dy��S!�x̎9�,�B!�uG�p_����4y��e�uFF�������q�M�ƢE�HHH !!�u��1n�8���066��ܚĨRq�w����ѣ|��|���;v���|��̪���۷�>}:����JKK�׺�Ν;���k\Oզ�#�B!���4�ݻwBHH��1KKK&L���Ȟn&&&,\���S�2f��l�իWW�ށB!�B!/I�O4�N���i}cW�.b��y?�k�.prrb�ȑ�e\!�DW�\�wB!��R��]�k*V}(��M�J
��ӠA�*���憓�Ǐg߾}\�x��kײm�6&O�����+=�61V��C�(**��:���;�ҩ���+HMM��֖W_};;;�v��|���U���@c,U�.�Z!�B!ģ�={6mڴ��\�z���"�}�Yz��?������/�ʕ+�<y�N=!�B!���!D�:�<aaa�ܹ���R�y�����ѣ��CB/>��C}� D��f�}��H$�P!�<666ddd��~lll��kkk˕+W�x�"�z�R�/^���X������NJJ
qqql޼����*.jcebbbX�z5���ǿ���L�BLL��	�$���,--HOOW����ШQ��L�̽E�dgg���K�-�����U�!��k��'!�B������KߡTI�=���!�B!�u��
!Ԝ;w�ʯ��q�~��}�ϟ���'666�j�
��~��/ē(66���X}�!������iӆ#F�;!�dĈ�i�F�a���̛7���4<x�/���g�}���#�&MR�0�e˖���LII	III,[���q����#�w裂��:`oo�����OU��뵊Q��~����T��yz�O�޽i۶-)))���O�Χ�o�����"���T����j4��;����1��M�G!��K�����F!�B!�B�W#.��9::O�$e7n$''�Q�F)m�G�fǎlܸ���=F'�������]�a��0`ӧO�w�ַo_����0�Bh�������ILL���G혱����ooo:ĵk�����8���BHH��1嵥�%w�������_��ٷo�F�R:*jР�F�b��������GU;'WWWbcc	

"((H�xZZ���:ϽO�>�8q���d�v���d���Wm\B!�7y~B!�B!�B!ēN*\�z������ \\\pss#44���]�O\\�&M���'''�~�mV�\IAA����Ç|��xxxлwo\\\x��wٻw�#�7o�<5v�>t����̙3Gi���Y�`o��NNN�5��]��Ĕ��u����ݽ{�O?����+�/44���|��^�|�������믿βe�ԪVܽ{���(z�쉵���޲eK�����ݻU�[!����o�N�
�K��K�Ծ�o߮�_OO��T�333#""///lllhذ!����i�&��
&&&������N�f�hԨ���,^�##�J���� ((�N�:add���vvv����h�"��̙3iݺ5
6�����1VT\\�����`��Uދ��~sss<Hqqq��n֬Y���abb���]�veٲeL�0��;w�h���Ԕ��x�����133S��!�xz��|�W����!�B!�B!�_�T��œ9s��o����۷SRR��ٳX�n6lP;';;���(���1aaalٲE�S\\LRRIIIܻwoo�Z�w��yV�X���-[�$;;�������;w.w���ח۷o+�^�|��� <x��!Cj5�Jm痟��{�Gzz�Җ�����9s������3q�Drss(,,��/���Ç̛7����������5�svv�̙3>|��Ç?Ҝ�B�'ծ]����	1r�H}��SU"���3f�`ƌ�^�y����������r<ww�j��������V�+�khhH\\\�稘��p�رJ�U�{sss����^K�t���ܛ4i���6l 33�֭[���Ʌ�8q��s�B���<?	Q��O��۷�H/��{���A!�B!D��Q/����ڵ>��s���8v옒p�c��,�aȐ!4hЀ��$&N���[�={X�f
���KHH;w�Ԛ������j���9�-"  ��� ���,X��{�X�bl޼�۷oӥK�,Y������?���CDD�#'\�f~[�l!==�֭[��'�йsgRRR�?>�/_fӦM��Ӷm[.\ȳ�>ˆ
����رcJ���ӧ�ܹ��x��ӧOK…���P�q-F�r�
�1͛7g�ڵT^ ��Ç|��ܺu��ҥK�j�_q>5�����}�kddD�V�x��qqq��ڏ��9\�v�v��i���!�֭o��f��(jgĈ�A!�#pqq����9s���憙�,_���^zI�����|��WDFF*������������B<N�$�B��+��"�B<A�ߵB!�B�t����U��P���n��1�۷`���DEE��/�(�O�<Iii)���<x��~���g�e�TLMM���'22���t\]]��������ճgO��������#))�ѣGӫW/�ϩS��5kmڴ`޼yJ�£��T��Λ7�nݺн{w�Ν�|�ѣG5.fϞ���ۛ������.]�3*R-"V�B<����h߾=���|���U&�%&&r��-�{�9��-���"�]�FXX���U�C�V�X��s�&�����}�v>��SJKK�9s&�ڵ�S�Nz�T!�x�
4�ݻwBHH��1KKK����LLLX�p!S�Ne̘1��İz�j�����B!�B<��L�”)S��B!�B!�SM.D���/(��6m
��r��m�O�Njj�ƹ�����iӦ�h�"HHH`ݺu�7//�Js�O����ɓ���GRR�۷��?T;~��M:v��5k�6����ʒ,�S�ت��<;;;嵪�G��O�ܹ�U��Hզ�#�x�
0���_=z��D���8�m�Y�;*^'77��[�r��Ibbb�؄����f����x�gx�7X�z5����(Q��ҥK����q�ƴm�ooo�8�Ӊ*��?/�楲k�.prr���B��J2?x� W�^����g�}�޽{�����C|*�����r�J����A�Q	!���������C�s˓g!�u���͏y IDATۛ�۷�;!D��(!�B!���$�B<v?p��C+##�*��b�
RSS�����W_��Ύ�]�j|p��憓�Ǐg߾}\�x��kײm�6&O�����k9+�4h���/--U�QTT�q�Ϟ_���

����j300�8�j{�!��L����J>xT}��a˖-|������XZZj�����ܹs4n�=DY��M�����ɓ'IOO�w85�w�^�ܹàA���A��޽{5j����G}ĉ'tN(������Y�`fff���ua�T5�����Ν;)--�w��ޞ=z�!R!D}b``���^^^��'�Y!��L�I�B�5CCC"##��ؾ};{���wB!�B!�d�p!�
��"""�E��Ӗ��ШQ��������NJJ
qqql޼����GN����Ϲ|�2]�t!%%���0f̘���g���)}tՠAJKK�w�fff\�|Yk��̯U�V\�v�.��+�(�.\���F�XUZ�hAvv6����h�B�Xnn��GQ{����_��3g�иqc�����ѣՒ���믹z�*���;�����ٓѣG+>|Htt4�|�
�nݢQ�F�iӆ�����`ll̫��ʡC�8~�8���4�9q�<��Ņ&M��<~EڒM~��7v��ٳg����y�W�0aB��ك�	_���|��|��ܹsKKK�������Ւ�t�_�ͣ����*��w�������4o�\�ceeE׮]���eȐ!�}�2'N���xń�;w�j�*bccٺu��pQټ�߿������T�=���A`` ��ј��<�0�B!��LM�k#�$B!�#F0b�}�!����%�B!�B!�B�[�Q�}�����F``�Ҟ���СCqttd���СC�����
�q��Y�o�N�=������AY�ҧOV�\Ivv6����X�GGG���UTI${��������ѯ��suu 88���DJJJHLLdٲe��ׯf7�ر#�Tm�>B��	

��ɓ����W_}Ŷm۔�QQQ�����?PPP���}�6d���J��۷��_���EII	�������_��J�p��1�����′j;5�:���#00�cǎ���Oqq1�N���>�������olܸ;;;�����,Z��}�����CII	�n�bϞ=����U��~��N�>Maa���/{��Aaa!�|�M��-ꎣ��R��IռysfΜ	@jj������7����Vf������(��B!�O���<�!�B!�B!���T�OWWWbcc	

"((H�xZZ�����LHH�F‚����kW�A޹s�{�..��ԔŋӨQ#.\��ѣY�`;w���ܜw�}�#G������o��v����W9�={��j�*V�Z����F���Ou�ѣG�~�:�ƍS;֦M�6]��Ӈ'N����1vrr2P�D!����

��ʊ;vp��AΜ9���������+
4য়~b�…|��w�u���0w�\^|�EJJJ8y�$�ׯ�СC��+[[[:v�ȥK�HII�k׮�5RRR��ʢ}��J2���Wg������вeK�L�B�v���	����"�300���k���\�r�:0~�xڴi�͛7	'))�cǎ)�+t�_��k�.�0Ο?@���5�Q�����+I1��p��mV�^ͩS���>vvv�;��s��;��a��9­[����⭷����_�zS��4�׺��ZRRh��˸PV&<<�Ç������!vvv:�aÆUWU�V6��w�EϞ=���V��l�GGG���3f�����!�B!ē��>[[[��٣q|�Сܼy�={�`kkK\\��Ѥ��QXX������`jj�um�"�����9'N������k�sZy�L"�B��K��6`�5�R�*S5y��&}��k�.prr��!�B!�B<=$�B�ݣ��0k�,JJJ����t���^�Jxx8;w����5jĮ]�HOO����__�Z���?�̢E�hժ�Z�b���,X�����.]J�-ظq#aaa|����/���,��f���p���߿���#���筷�R�W�����q�F���q��q~��Z�h�믿��㱰���=8p �V�">>��cǪ������LQNeo�Wl/����<��s@Y����o�)Ƿl�Bii)�����Ǔ���$<(����)((૯��ƍ���777�REy�ҥK��ũ%\T�nQ��s��&L��/�@�.]?~�R�Gt�ؑ�#G��e��N��,�x��<y2~�!������ܯ?�իW��1��T}���޽{���s��
�---M�"���"&M�DJJ�Җ��EDD��Ʉ��a`P��v���ܹs�O?�@��&ㆅ��e��_qq1III$%%q��=���k_u���k


�&�:;;s��>��������ۛ�{��;!�_Ttt��CB�M�68::r��Y�֭�r,11���L^y�lmmY�n6lP;?;;���(���X�x�Nc޽{�q�Ƒ����:t�{��i�g!�u}�'N��S>~R�?���0v��Iii)�����Z�S!�B!���!	�V�p����	��w„	j߻�����^뱵Y�t)K�.�h<x0�VkkժU��V6���	s��aΜ9�ƨ���״iSfϞ��ٳk|���&M����ņ
��̤u��dffr��&N�X��qBݴi�Fymff��"��믿�|�r%����R�رcY�v-/^��ŋ�ܹ����o<�ƍ��׻wo6m����?���133#??���LMM�ӧO�ǯ��?�����Z{�Ν�<O�������ŋ��ʢ_�~�ơl�8�|��Zׯ_W^��~�Yrss��߭��T}��!22�7nЪU+�,YB�ΝIJJ"00�����۶m#%%�_|��s�bggGFF����9s����
ƹs��ŭ��6l�Q�K�qe��5k����Hqq1�������s��GJ��l^�O����P��>}Z7	��X�J!7�=$D�1|�pΞ=�W_}��p������	��;�3gC��A�$%%1q�D���uo�֭dffbkk˒%K���'))Ik�ey&B�Ww��	���T�}�ܿ������鉍�
P�^`` ��ј���9B!�B!�B�I�B�___���+"##�D���Hlll����stB<Y�W��?*[Tl/��а�kFDD���N˖-�ٳ'������̘1C����3ݺu��ٳ=z�K�.Ł=z�Z5CCC������9u�o��&�N������_]-�@��JΨ��ѰaC��733����?���7���K��)_��&�Ku�
e��׆�|mU
Tm�>��UY2C�s��q��1�͛�,rpp 00�)S���?r����Jœ��۳p�B�
Fll���PS
6�[�nL�8Q#Κ�kjjJ~~>��������ꊧ�����.\�t	��m�jk׮�Z!ē���!��A�秄��7oΑ#G�9s&������p�����qqq��ɓ���������駟8{�,P�Q���?�ܹs�
��㏙:u�Z_y&B�$�O�
O��7���èQ���ѣG�c�6n�H@@��B!�B!D]��!D�111a�…L�:�1c���ի166�stB<�.^���%K����ƍ��(Ifff��ߟ���s��طo�7o�H x�78p�G���7���ѣ����z���lْ7n����V����~��F�?�<����ݻ���p�t�Tx�g�y�&��9�<�L����~5hЀ��R�߿�T�)_)�&�5k��۷�{�.͚5S;v��]��xzddd��K/��;88h�U�wUY��˗/�<��׼�<��}222x뭷�.v�ɸӦMcѢE$$$�����u�7n^^^u�o�;w�e��*R���!�,�D(�xRԤ2�B?5j�СCٸq#����k|��7���2a��}�۷o3}�tRSS5�Q��u��i���3�B����۬^��S�Nq��}���;v,s���5


ذaG��֭[XYY��[o�����$Y�d���8���IKK���+++\]]	P�s/Ӳe�8q���Ƹ����ӢE�*��e.P�>|TT={����Zioٲ%���DEE1f����B!�BQ�I…�N�����r�J&O��u����\�p�޽{s��
֭[�����ӴiS>��rrr���Ņ�mے��
�-\���Ɔ_|���$����]�F�.]x��j5~u���KTT���|�t�ؑ�W�^�����7�|CNN��Ѽ��ʱ^�z�w�^>��3�{�=ڶmK^^ &&��]��`���������1`�n߾��뫍S�������%o׮�o���͛�7o�T��'[�u�����m���[T��ZU,,,�?>���,[�KKK���_�q���prr����۷��/�v�Z�m���ɓ>|�ƵUs-**�q� �a���
������B�Em߾��{��;!��j���͛7s�^{�5bcc100P��b�
RSS�����W_��Ύ�]�*FuUYNm��3�B���޽{����m�����$[�WTTĤI�HIIQڲ����� 99���0��jjݺulذA�-;;���(���X�x�ڱy���%Q�ݻ��g����Rm���_SPP�����u���9s���x�S!�B!�OI�B�9///Y,%���Ջ�'OFXX���W�ңG�
Fxx8�ׯ�H�ҥ��k0���$����-j2~u�BBB׮]c�…J{�>}�d]��E����0`��$2l�0Ξ=ˏ?����w��7n������gϞ����e�֭lݺ@���5�N��3�<������Ν������������:��䳵��ʕ+\�x�^�z)��1���ؐ�������$�?C�N�3f�6m"88��_~Y�VS�q-,,pww��ݝ�����ؼy3��������{��)�֤BGy-Z� ;;���\���rss�>B�'ӈ#1b���B�EK…�H�V�prr����$''s��I^}�U�ݧ���������t�xII�֤��lmmIOO��W[p�����W�I�B����ܸq�V�Z�d�:w�LRR������ݶm)))���̝;;;;222�̙3���0l�0Ν;W��;v�`Μ92�
����ĉ�Ċ�.]�ĺu��ѣ���̟?���L�n��￯u]�p��i:w�qU��ӧ%�B!�B!�xJ=��B!����ڵ�]�v=�5�}�]���166��А^x�iӦ)�<�o�������?���!������2l�0&O���ڽz��Y�fܽ{��M��-���144dѢE���aaa���!���L�8���K�.8���y�f���ԔO>������3�```���={�d�ҥj�#t�_cǎ���
333

�ѣ�&M�6�w�}kkk(..ʒK������4���w���j�YK�_`ٲe$''SRRBRR˖-�諪<1o�<���x������}����j�ݩvO�~��Nq���{�nݚ_�U��LM�:t(����޽���:t耽�=P�3��Z��w�^�߿Ozz:!!!�Ʃm^;v ##C���M�G!�BQ�
>����GQQ���Z�}�����F``�Ҟ����8o��&���|��������?�t�R���L"�B�վ�j?v�P�>_�n�044��A�o�ʑ#G�������4lؐ���+�%���)�<y��g�ҥK<�g�}�����}�͛GϞ=144�[�n̛7Omn��d.�.]�m۶�Q}~��#�B!�B���T�B!��1*�7i҄iӦi�[q���+��ua``����"]ǯ����������}�KT7n�ƍ�h733���W��Eet�_���:�\�{ggg��	̞={���Qv����!--��#Gbll\mܢ���СC\�v
??�*����q��q���Q;fll���ӕ�---�s���ذ��*�mbb‚�8q"���>������LHH�F�������Օ={��j�*V�Z�S2��y��Ӈ'N����6���l�~����B��Qv�t�R�.�<y�${��%99���<������?<<<�۷�#_�b��r/jc׮]ʮ�NNN�9�+���ү_?��������VccWWWbcc	

"((H��4��=|||����ҥKL�0Ai8p�Fb�<�!��/T�^z�%�����
O��ݵ^���j+�}�6ӧO'55U�Xii�F[����ݻp�ƍJǨ�\�ܹ����F?U���B!�B!�>R�B!��:t(VVV8p@i;p��<�o���#�u�ܹJ�������;͚5�Q�F��۳x�b�����fffDDD��免�

6���WWW6mڤ�v�̙�nݚ�
RTT�S��9��駟�j\����ԩFFFagg����-R�M�>OOO�6m������̟?����k������?>>333���B��G}���w�\������;3f���ɓܹs���~��WN�<ɴi���u�{�M]Ư����ƬY��9s&k֬�…z�G!Dݩ�	�6�6lP������2k�,���011��Ȉ�]��l�2%ib�Ν:�addDxx8���XZZbddĀ�]�˓g!�����Y�ohe��P�勇>i�>Q+V� 55[[[|||X�`A��-U�UgÆ
+=�&sQ]�@sy��M�B!�B!��A*\�:�|�%��?���5* !���ؘɓ'�l�2���C���iܸ���u�y��;�fee`ee��naa��3�1cF��tss���M���]�g͚ŬY�4�u�v��l�8�̙Ü9s������դI���ذa����n����L.\��ĉ155�6n!��Em�9�8q�O��K�.%..333���y��x��g���%!!�/���#G�`hh�$�Ք��We����3�|<==���������c�C!ēc„	jU'�377'88���T�{���g
]�[�D!D}akk˕+W�x�Z���/j�!##����+�buAU�0""KKK��ӕ�%%%4j��R�~�A�B�w�}�ͭ25�K�-���&77�-Z����U�!�B!���$	�N3r�H}�!�B<�t�¨Q�ظq#�G��K�.z�J�


�3gnnn�����������><��嫯�"22�ٳg���
>>>z�N��Ƿ��>�p����XXXA�v�c͛7gРA8991j�(bcc���[�n��6n�HNN�F�R�F�͎;ظq#z�N!�(#�$B!�p���-[�'�|B�N�HMMeٲe}���ϦM��7o�gϦC����ol۶��[�����_|�U|(--��iӦV�}��������m���G��͕�?��/^LǎILLd�ҥ����^�&s�ر#���dddh$Vddd(}�B!�B�t��Qg"##����wB!�Se��<X�a�:6h� v��MHH!!!j�,--+ݵU�311a�…L�:�1c���ի166�stB���J�g�̙���+�$


ذaG��֭[XYY��[o�����un߾��ի9u������Ύ�c�2w�\�d���>$<<�Ç������!vvv:T��:G���X�<����رcՒ-�k޼9>>>�^�����?J…ꚧO�&$$�#G�`ddD߾}�2e�Re����%�ܽ{���p�=�/��������&L���L�:QQQ������H�ƍy�7�6m�R���ݻDEEѳgO�����[�l���#QQQ�3sss�sB!y&BQx{{s��!�]����_�}���8~�8���Ƀ���L�>]���Ғ;w���၍�
����9&WWWb3�"i IDATcc	

Ҩ��������}�.]4b�ر#����\���É'HNN��A�orr2����y~B!�B!��_$�B�բ!D��ZP%���={6mڴ��\�z���"�}�Yz�����RQ��_~���V�\	��ɓ5>B<�BCC�{���{����I�&��������"""���d���000�޽{���s��
�oZZ��lQ���0�l٢|_\\LRRIIIܻw��5���y^�x(��T��}��z�jΟ?�ql����b���Bbcc�p�۶m��¢�;�|�{�=��ӕ���l�o�Ι3g������T휉'�������_���C�͛��_MAA���gggΜ9��Ç>|��q
!�uE�I�B<	��ibbBxx8aaa�<y���|ڷo���AAAj��fffDDD�~�z�;FNNM�4����I�&��/(}gΜ��Nvv6EEE5�w֬Y���σ�С>>>\�z���pv�ܩ�L8w�\JKK9v�fff0���7n\�5���Y�j���;V�:���ʘB!�B!�x:I…�3������fĈ�EQC����;!���200���///}��T�{)�_W��퉈�P�l۶���^|�E�Ν���s��bbb�
���ܸq�V�Z�d�:w�LRR������T9�={X�f
���KHH;w���ۻ�j5���y޺u�*�|�����ԩS�^���={���J`` 7o�d۶mTE[�l!==�֭[��'�йsgRRR�?>�/_fӦM��Ӷm[.\ȳ�>ˆ
����رcJ���ӧ�ܹ��x��ӧOK…B�'�<�!�x�5o�\��DVV�R�P��‚3f0cƌ*���憛�[�}*{�477'88X���˟�t�����\�4i���6l 33�֭[���Ʌ�8q��fB!�B!�xzH…�S^^^DFF�;!D
U��B!���Z�_]{�>>>j;q9r���`Z�j�%+,\��aÆ�$3;v�y��ѭ[7�����)���DFF������+���xzzV;Ϛ�X�<U;�6jT��>���j�[ޜ9s��B�u�Ƽy�<y2ǎ�H�����ؽ{w�Ν�|�ѣG5����e�&���)�/]��%fTԮ];�>B!�B!����BAAs����
333222X�|9/��#|2�����W_��ٳ���lll����stB!�B!��K�p!�B<fӧOg���C!�⩧Z|�r��u��ݵ��|���:##�\X���P�ӦMcѢE$$$�����u�7n^^^WynMbT�8Okkk������R����T�W���}�=�q�F�W1F�����U���͛����)�-,,x���v���l�ӊTm�>B!�B!�6h� v��MHH!!!j�,--�*J������p�B�N�ʘ1c���a����>�!�B!��~��!��1Z�f��CB!����W��?*[Tl/�|��^ɡ���|����4hР�k����������ٷo/^d�ڵl۶�ɓ'3|��JϭM���K/���E\\�n�׊��S�WT�:�*����tU>��"CCC嵶��j���M����B!�B�Qe��\�z���"�}�Yz����$����_~���V�\	��ɓuژA!�B!���$\QO��o��������XT����-BR��gdd���NNN���ѪU������(�qyܱ�ڵ����l�ڑ#G>�q��*::Z�!!��޽��|��"%SNqs�a���6�09ME�!��ӝ�p[3
�I�4?r��)�j�i��P"r�Cug�l���Жr�����ӕ���x\�]}����~�����E�������Ν;177/����?��3�Ν�k׮J��s��u-ppp 55��i�&���JM��&ƒ8;;MPP=z�U�V}.^���͛prr�8�������̙3���Z�ҤI~��WΞ=K�nݔ��g�T�������"''333�c999J!����$�B莞��������:��̕B!�B��!�qqqܼy��7o���}��_PP��+W���dϞ=���ӱc�J_�֙3g�g�֭2b�����ܹ��C{�|��ǺA��ƠA�t���6!��zz���ƍ�����ӓ֭[��_̖-[���aݺu��׏���ŋ��_Ҷm[Ο?��ŋ˼���#̞=�A�Ѻuk~��7@�zCaa!���XZZjcI:u���ٽ{7&L`ҤI���333�_���������۷0`@��-Z��wrr2>>>��߿���ի7n��LJ/�����ۓ����c�=ʜϢڴiCVViii�iiiJ!����$�B!�B!�B��J.�xN�ر���{�]�v��	�WV�{�.������$&&��g�����]C��YU��}�6s�����E�=vذa|��DDD�X���kt�UVTT3f��u&;�	!D�5n�8���HJJ���M�X�Z���=z4{����_eܸqZ]���|}}�U;fmm�<�W����6sssv�ܩU�������ݻ�߿???���4���ݛ�s�{�����}�oߞ#F�Q���<x���tƏ�v���R��<�z�-:DJJ��|���K�B����'!�B!�B!�BTu�p!t���xv�ϟGYYY�<y�z����g�q��N�8��A�F�*�5k֤m۶|��׸��s��Ev��)�˽����z�*#G�T�F��7�|CPP:�N!^<G�a�ʕ�CQ�L�6���~[�a�P*���ؘ��@֯_Oll,W�^���kkk�L�B�V���������O||<yyy�h�777�͛���A��6l5j� <<�˗/`aaA�=pwwW�͚5�իW���EAA��1���___�����HNN��͛ԭ[��_'''z��Y�~~~̟?���DLMM0`&LP����/�N�:����8nܸ���}��e�ĉ�����~׿V�X��Ç;v�ڱÇcllL�~��W!�B!�B!�B!�(J.D��J�`֬YXYY�n�:���ٰa111\�v����3p�@� �1���c׮]ԨQ��Ç3e�rrrX�d	������ӳgO<==122R����%  ��r��
�ׯO�>}�4i��Ƥ����쌅��������ȕ+W�����¢ܱ�DEE���C���! ,,���(&N�X�s���ϸq�3g���j	��yBB������```��o�ʹiӨ_���5�7,,???����Y�&�.ӧOW��p��
V�^͡C��}�6}��aΜ9���Ӹ����5kHHH //��͛3v�X
�1�����Ç	`߾}dff���O˖-qtt���I闛�KXX]�t�aÆJ{�ƍ���!,,�1c�P�N�b�F!����Ӊ�����u(B�*"""B�=�x�JK�011a�̙̜9��qLMM�7o�Z[ff&�������PfU3{{�b+�7��$���ٳ�Ċ�ԭ[�+V�ڧ�����nݺxzz���Y�x%�O�v###\]]ٰa4m����Ξ=��ɓ�]�v��B�[�A!�xa����:�}�B!�B��$�B<������U�0e�RSS�>���������?zzzjc,]�T-b���4mڔ��e�;w�{�n���?>yyy|��ʮ���Dhh('N� 00KKKlll8y�$IIIt��Q雔�DFFݺu���B��ٵkC�-�	c�ΝL�0�jժ=�ѹsg~��'��"s�d�v��	<����hΞ=Kpp���iEƝ<y2999ʸ۶m��Çxyy��ƏOFF�rΞ={�u�ƽ>��ggg�����וs.]�ļy�x���}|�X���ټy���޽{$''���̭[�=z4{��%??;;;�����q��	��ۇ��s�1	��_���͛{lϞ=$%%бcG�#���uB�*��߯�g�gϞ���3{�l���166&--�%K���o�8—���;�w�&$$DI�		���777G'��,RUW!��<��ݓ[�B!�B!�"����{-Z� !!��Ljj*:t 44��ǏN�Ν9q�QQQc�����7�p��Q�L����/իWg۶m$$$0i�$����6o���˗iڴ)���;v�
6ФI.]��ƍ��w�V�ntt4...���ɓ\�r+++Z�n
���VVV\�r�\;�j�������Ki�Ȝ9r��+Wr��1iҤ	W�\!88���m֬���$$$0~�xbcc��[�l!##6m�ıc�PK y��ߴiׯ_�}��DFF�СC,q޵�E�<�j�*�;F||<�g�`�֭J���ڵk�q=U���Oj�ҥ%�Z|��yBCC��7n�������8B!�B��SU��O�>t�ڕ���S�NQ�^=���
CCC������"33���L����V�Z�O!D	\]]),,��<�Q�G�޽iժW�^�y,�=\]]u��E��VHH���C��|!�B!�x�H�����ؔ���D777��cbb���I�&���ooo�������(�;{�l%a��Օu��q��]�̙C�f�3fJ��{!����R��S�N̙3��>������A�^�055%&&�Y�f����������aÆ��ٳB��������ȿ��ov��A�.]��ӊz��5j��#��s���бcG����:u*���xxxTx\OOO,--=z4���ܼyS9��9sx��������?�O>Q�i\�ȑ#|��J?///�FI���v�������˗�ի...Jb�ʅ���TUT}�xR%%�ݹs�U�VaooO�
x��wY�r%~~~� N!�U��}����/��BAA�5�{��L�0A��(t��7���Ãe˖0u�T���u�B!D�Y�h
4P~�&�E�\�R�����
�B!�B�b���\P-WIOO������.]�hkӦ��v����-[*�


5����%Y<�7��ʕ+���GGG���8|�0}����ѣ���0i�$�W��u칹�<x��˗�|�r��������all\�xq��u�ի��Ud�mmmվ�ܹ3�������������*m��U	2*�����U���_s�M,ӧOg��$&&����ڵk?~<���j�׳���S���x�6UQ������ݾ};����.��h����h�o��ȑ#u�U�*�iT�*Njj*cǎ�A��޽=���=|�GGG233	(��֢���׷�ޚ5kҬY3F�����Y)�.\�P�{���p�G�T�&!�-===\]]_��z�տ=��e�	!���ѽ{w]� ���?NDD���CB�A!�B!�S 	�+�x�<��n�Y�3//O��f͚�-mAai_`�2t�P6m�Į]��ӧ������UH�&�={�PPPPj��w�g���O�����m�Vi�Ȝ?^!�����"����+ϫU��q\5fѱ���_\[yh���=�����űc�Ν;ǚ5kf�ԩ8;;��R��\�V�x���z{{�l�2�5k���G�$�m�Ʊc���Φ^�z���ggg���Ç�����ѣ\�v�5j`iiI�޽�۷���3�㋁O�u����t��SSS�O���y�׈��fȐ!=��B�K���i׮�ϟ�ȑ#Je��?~���LZ�hQ�v�{�./^d�����;��:�b��_��СCž�=s����lݺ���BF�������*�B!�B!��\]]			�uB 44�ѣG�:!�B!��L.�s��ܜ��4v�܉���S�V�&M���_9{�,ݺuS�Ϟ=���x_[[[HII!>>�w�y��
V(���(�Q9`;;;��G�eڴiDEEUZ�Ž{�

�W�^�[%))Im�3g��ꫯ>Ѹe������˜>}Zm�RRR4�>��7jԈ�~��K�.Ѿ}�r��m,&&&888���@jj*`ӦM���)	fffdee��������999J�|ڴi�n�R�����c������J�k׮�O?������h�����>/^��ŋܾ}���{O�1������;w�](ܹsg���9z�(���{��B<1ggg���+�o�^j��w�}��a�*|���=��8��٬X����h�l�Re.:Tl��۷�;w....�{�aÆ��_Ql56!�B!�O���?����*�
!�B!�B!�x9Tlk!t�w��xyy��?��nܸ����accÔ)S*�Z�������>III,^��=z��wvv��7����D����O?q��y^}��ˆw�ޝf͚����O?��D�y��]RRR�>}:?��M�6���Z��E�������9s�>>>O<nY<���>}������E�i�}�뭷X�lYYYܹs��K�bcc�СCK<O�X�����o�%??�֭[cee�W�hӦ
iii�S����珅����|��G�ܹ����֭[�t�R������m۶$''����~�̙Chh(�7of„	���:*�3<<\9'<<\�Z�hբE��[�l��G������Zb�����###�~�z�}�������V�Z<�GX6SSSf͚����u������z�*#G�T�F��իW	

�adB!�B�rg�ԩ�C!�B!�B!�H��\7nqqq$%%���v�V�Z̘1�Ү�����IOOg���j�,--5�z��AÆ
�z�*t�ڵB��ر��#GR�Z�bc�V�#G�dɒ%DEE��K�{+i����	K�,Q[�_�9755eܸqjm�۷gĈO4nY���8p�.\`ҤIJ{���5��?��bbbHJJR��L�8������|}}�U�kmm�<뭷8t�)))j��wŏ�ICB7�^����{�=��O�;�'�|�T��?��ԩS���9|�0}�������ٽ{7���;]�v���{{{��i3fq~���Q��Tm�>BM������G�Z�0`S�N�f͚J���?�ȝ;w�_�>�z���Ãڵk���Cطo������ӲeKqrr��А���Ν;��4�ٵk���gРAԩS���/J���
7n�`���:t�۷oӧO�̙���ݿ��O���lذ����]�F���8p &L���@�W��*�>Jk�X�~������ѥK��h�7��Ɔ��0ƌ�̻/�����9B�,EDD�:!^jG��G����aii��p���Ύ����E�ƍ+}��~�
�JW!ʣ��e=���$&&`kk[��K�B!�B!tE.��U�w����~�zbcc�z�*FFFX[[3e�Z�jUi�թS��� ��Ǎ7033�o߾L�8��zzz899��a�4��'�{����cbbR����k֬��gڴi�O����޽;cƌ�Q�FZ�]������'11SSS����i|/
`ժU8p�[�n��;�����޽{����bffFPP���;v�;w�ЪU+ƍW��tmb6l5j� <<�˗/�����www�_���Y�b�f�رj�;|�0������O�{UCӦMվ���P*^����<;v,k֬�ܹs�;w��[�2t�P���[�1���������1U���B��ٳ9z�(�(Y 44�������	�ڵkٰa��9YYY���q��M.\���?�7oV�ܻw���d����u��G�U�
'**�q��i��پ};�R����/Knn.�Ǐ'##Ci۳g�n�*����dgg�|�r^{�5��L�2���T�-33���@RRR�GO�Q���Weڻw/������i����ĉ�۷gg�J��U��ە�9B!�B蚭�-zzz;v��*����L�=X�v-�F��Ա���;s���m IDAT���lݺ���BF�����;w�uhB!�B!�
I�UZi�&&&̜9��3gVhm��֭�������,�&MR��PTY����s�r]��А��X���w?ݡ��s�R�n]V�XQi�j�=322b���̞=�̾O�M�4���G��cJ�cdd���+6l ##CY�����ٳg�<yr����g����we���+��saaa�����W����ѱcGN�<���p�aaa�ڵ�Q�F)�8ڌY�bm�"�ǩ�J��#��?�����p���Y�z5aaa���*�I����QbƐ!C�V����L�<�Ç+�DFF�j�*lll�w�������u�V%��e˖t�ԉs����?�Uc8}�4���k׎���ku��lٲ���,,,�ꫯ���"99�y��z^Iպ�W��QU*88���T:t�9shٲ%iii���p��	�����坯�8u�T��&$$Ю];�sTm			�p!^
e��B!��Y�[�.�ڵ#11�R.~��w
ěo�)���/�۷o3w�\\\\077m8��_�����#B!�B!�xD.�������ݻ			Q膄�`nn��������A�\�r�իWӠA�2�ӻwoz����?�Lbb";v�`ӦMJ…�c��+�p��urssy�WԎ���*}�x��P���E���9-Z�`�ĉ���q��
�x||<����?����~���'O�����]�6yyy���p��ez�ꅋ��R��q��Μ;w��۷���w���S��%..�9s�(�)��������O�=N����ر#�'O֘ט�|||hҤ	-Z����'''�����m櫲\�p�f͚ik޼�Z!^t��S!�е��B�|lmmILL���]�F�~��W����j��������q��UF����5�o����� <<<t�B!�B!��4��B�B144��ۛ��(233���$**
ooojժ���D%�ڵ+����/���Ç�믿f���,X�@��G1|�p���ǝ;wh֬����F�SU�"33SiS�y���xUm�>BM�Z�R�׭[��*mׯ_g�ر�;������[�r��e@}���ӧS�fM���1b���ܹsG��.u����ܼy��7or�����߿���/��@ǎ���x�R�;u��N����i�}}}XlrKzz:�B�����P%Y\�tI��|U���l�ԩ�qLզ�#ċ.""���]�!�x���!!t��*�BTݻw�ԩSܿ������gȐ!����|�B��bŊ���G��}~~>�V�����ݻ3d�֬YCAA�h��w�y'''��a£���������
�K�.4l�P�׸qclllS6mB!�B!��5�p!�/�7�|�-[�ԩS����qT��999q��I.^��g�}�v�f͚�����
`����_�^�o���+4���	999|��'4hЀիWcmmͩS��t�ڸ���7�|��n\��D���ʳ�\Y�[.]�����caa�;�C˖-y��4v������֖��8v���s�X�f
���L�:ggg�k2���`���{F����OAAC�UK�+�ˢJ�(���xXiLLL�;w.���,^��z��ѻw�b�Q��+rh3_��UIg�?0kKu~q��Tm�>B�BBBpuu�uB��Thh(�G��uB���KB�*���%??�s��=��<x��Q��|�2G����G%F)�O�믿&$$��^{�I�&�~�5e�RSS�~���������?u��Q6.ٿ?���J��xz��	�޽{������N�vvv�8q�}��i�N!�B!�Bd�(!D�S�6-�WWW�/_����5j���e'<<\�sj׮͗_~��iРzzzӥK-Z�VI��w���'���*������caa���S�N�И|�
6DOO�{����[oQ�V-~���x��j׮]�T�哘�@`` ӧOgȐ!j��u���6l��͛qww��͛���i�;l�0�U�Ǝ;����6�/����O�VkOII)�m۶e̘1���T�P177`�Ν�{��'N�P�_��R%@ܺuKi{�R�6�������8�jS�B!�B��k�///LMM�h���������s�N�ʖBQ���B�-X�j�k� 88���T:t�@hh(Ǐ'<<�Ν;s��	���=z4�k�f�ƍj�.z��@BB��gkQ�6U!�B!�B]�
B!�s��Dccc����*O��w��;�?ɘvvv����<���H�^����z�*?��#ÇW�-_Q1ǎ��w�����,\�Pi�y�&���8::�����ٳ4h�[���~@___c<KKK�t��$w��E���iѢE��_��f�|||X�p!;v�…,Z�H�y������!##���f͚��ݻ77n���OOOZ�n�_�Epp0[�l��Ɔu���{��իGvv6۷o��ٙ��L|}}ˌ�Z�j������%mڴ!++���4�Ċ��4��B!�/��&p������W_=�8���ѭ[�J�J!����[V���������	�W����D9���M�4�E�x{{���Dtt4NNNԭ[6o��ѣG���#77�s��add�T_�p�͚5ӈQ�ѓ��B!�B!��I�!�B<U���ԯ_�]�v)m�v�A����{:�L��_�^��7ovvv���q��E�?��$L���ҳgO�w���G΢T�,�.]
���K��_777%�`ҤI������N۶m�u����!��ϧZ�jDDD��/�(�ƍG���IJJ��͍nݺѿ�l�B�Z��1c�ҷ��+VУG��+��Rf����UQUy뭷��z��T;
!�����i/ ���g�̙���ckkK�~��9s&G�����$s��+W��t�R�
������G�&  @��Qq���Y�<J��9s&3g�ԺʝB��^�u
KL��y'_�UUhh(������j����pppP>3�������W}uss�f͚p��Q<x@��ݩQ��~����ԩSG#U���B!�B!��I…B!��Z�j1u�Tbcc�v�׮]#66j֬���ЙS�N�� W�~�)���b``�k����ŋ�4i[�n-�7om۶��Z�lɸq�X�`A�c���333���/LMM���S�������\\\�W����OIrІ��5Ç�,_�\i766&00WWW��ͩ^�:&&&��Ջ�7�U�(�|͘1�֭���vvv̝;��g͚EӦM�^�:��ߟڵks��a�����ؘ~��i=B���_���G�~*c߽{��>���3gOvv6�����?�$>>��ӧ��+?�*�i�_��/2j�(���IOO����[�nq��=z4W�^����̙3����駟2k�,V�Z�ٳgu�B!��9���c��A�����J�Z�(,,T*���z���<幩�)��Μ9s����]�o&R�Z5�Q���Tm�>B!�B!��VC��[hh����������}���9R��jԨQ�o�^�Q	Qu���Q��N�:����W������C�c�^�:{��-�Oy�_4�����Ȉٳg3{��2�����駟�駟j����(;���<�ehhX���~moo����Z������lذ����6m
@FFgϞe���Ԯ]�̸��Q��C�Ur$[�h��ؘ	&ЧO5jDNN����[�����Y�pa��Q\�O�LX^˗/�֭[t�֍O>��-Zp��}Ο?�������W�M��~V�p��m�Ν��������/�����

�IB!�B0s�L�ׯ�ʕ+���'55U�=���9iii�ܹS��R�1c���߲u�V�=����R���̌��,rrr033S;7''G�#�B!�BQH…xj�M����B<,--u�x�<����:!������ٽ{7!!!xzz���9nnn:�N�����xv��'gϞ%::i޼�r��ԔA�akk�ȑ#�����Ņ�;�.�
HJJ%����+ԨQ�7�x�
Ƒ#Gtb�����z�*#G�T�F��7�|CPP:�N!�B�2=z4���\�t��kײj�*z���ƍ�����ӓ֭[��_̖-[���Q��ѠA���o),,�S�N�g7�6mڐ��EZZ�FbEZZ��G!�B!��*Ь�)�B!��344��ۛ��(233���$**
ooojժ���x����`cc��ӧ�ӧS�LQ����j�*�޽;C�a͚5h�s��u�͛G�>}�޽;nnn�۷O��T>|Ⱥu�6lݻw�gϞ|�l߾]휒�/o�%��;;v�Z���LMM�d��Nc̻w�`��~�m���üy�~�z������\�/_���������Ϗ���b��ҥKxxx��oӷo_/^��۷5��bR����ԩS<x�\������剫�����\����ҥ
6T�7n���
aaa���jܛB!�ܸqC�a!�V�W�Μ9s�V�ǎ�ܹs�7��͛������ݺu���lٲ�Z�j1c���ƎKaa!=z�P;��v����q����9B!�B!��".�S�r�JBCCu���\]]			�uB!�K��7���Ãe˖0u�T���u��/???rss��L�2���T�Off&��������ޣ�)nݺń	���ߕ�?��#s��)��l޼Y��޽{$''���̭[�=zt��jcI��Zӳg�R�|��Y�r%gΜ�8�d�v��	��;w�����ٳcbbR��-//�?��˗/+mYYY���r��	�]���9�'O&''G���m�x��!^^^J�	&�h�"&M��СCy���С����M������y��ݻ���|���4����q��	��ۇ����#�B����a�XYY����:!�Ъ:dǎ:t(����]��u��allL`` �ׯ'66��W�bdd���5S�L�U�V�)ϋ~>�߿?+V����Ì;V���Ç166�_�~ZޥB!�B!��!.�S���Jaa�<�!�������B!�K��Օ�˗�|�rF���p�x��hт��.\@pp0���t�Ё��P�?Nxx8�;w�ĉDEE)熄���ӤI9v�e.����`ժU;v���xfϞ
�֭[��.�N�R��&ƒ��ڵk�����?���^��q�ȑ#�\��cǎH�&M�r�
�����_��͛�|�2M�6U�qÆ
4i҄K�.�q�F�s�5kFdd$			�?���X�>C����6m��ĉy�w��?�Ixx�Z5��b-:%)+.m^3			�k�N㘪M�G!�U˵k�8p`���ãje��?�dŊ�8:!��^q���̙éS�X�n��fbb�̙3ٹs'Ǐ��,[���d�{3�f͚ѢE�cFFF���r��Y222����Ξ=����Fr�B!�B!��H�!���1c111�C�*+::Z�!!���lll���"777��U�|||hҤ	�h����7NNNDGG��������ˋ�;`mm�_|��i�J��v�������˗�ի...����y���X�}��
j�(��>���j�}��ٳ��;v��ˋ�S����G���R�<v�ԉ9s���Gq��A��<==���`���r��M��������?~�ӧOs��N�<Ixx8k׮�A�e�Xt�JRV\ڼf.\�<ZxTT����!��j155�ȑ#$$$СC�c<`ԨQ\�x���8%�U!^&���ܾ}������3��~����޽���<==�G����渹�=�x�B!�B!�"	B!�34h� ]� D�'��!��,���*���888�ҥK��4�x�
�>���e^w���,X����DY�v-�Ǐ��ՕZ�j�z�61��φ
���Iff�� P�.��U`���U��s������%_�5:u�֮��+W�h�ӲeK幉�	>,��ڵ�]�v�7���6n�H@@����Y�ti�1�����6����l�ԩ�qLզ�#�/���t�5kFRR������BC����ڵ+���L�<Y������9x�~�/��={*ϭ��2dH��

��O>Q�2���X�re����B!�B!�%I��9QPP���y�&&&&�ٳ��8U���vu-���me)Z>�2��4~E������<Z�4|�pG$teժU�A!��T�=~y���T\%�����i�=�Z�j���*/���ǎ;8w�k֬!88��S����\����}���dffr�>���:p�ҿ���1T�zzz��W^�%P���+ϋ��=zp��m���5�Epww'  @�V��T�(O\*�yͨڊ�OU[y^kB�"{��C�D���l۶M���/�$  ���H�u릣ȄB�6lHNN666xyyQ�z�����xxx�l�2�N�Z���B!�B!�%I��9�͛7�y�&qqq����8*QgΜ��ߟ�[�RXXȈ#���Rv�B�b�E�BQ��������Ν;177/����?��3�Ν�k׮J��s��u-ppp 55��i�&���JM��&ƒ8;;MPP=z�U�V}.^���͛prr�8��������^}�U�biҤ	���+gϞU[xx��Y�
�c�v�8}�4۶m����qU���J)/m^3fffdee�������ڱ����B�̊K2�����e���dggcjjJRR���g���%V*B��Ett�V�]]]quu}J�!�B!�B<9I��9�c��{�=v��ETT�'\T�*������۷�;w....�B�aÆ��_�����#�Œ3����uB<��������ۄ���:!D#;�V
�{�f�ƍxyy���I�֭�믿f˖-��ذn�:�����?���ŋ���/i۶-�ϟg���e^��ё��fϞ͠A�hݺ5����Y%������t,--���$�:ub���޽�	&0i�$��틙�ׯ_g����������0��d�E�)����������/5��z���ƍ�����/��}�����*�أG�2糨Q�Fq��i���c�СXZZRPP��ӧY�|�2�����yʹiӆ��,���4+T	#mڴy*q
!������RXX����8p ;v�ܹs����M!�B!�B!D%���s�3��B��$++��'OR�^=>��3�9‰'��?hԨ����

��ի�9Ri5j�|�
AAAxxx�0:�,2D�!�ܓ���BT�q��GRRnnnj�jժŌ3��G�͞={���_7n�V�qww���___|}}ՎY[[+��իGvv6Æ
��ܜ�;wjci����{�.������???�>�{�f�ܹŞojj�q��۷gĈ��_���;$==���ǫ����h+�޽{3f��l��֭[ٺu�F�f͚1m�4�b}Rڼf�z�-:DJJ��k %%�X2�B!��
ЪU+8p �$[!�B!�B!�J.D��J�`֬YXYY);y���a�bbb�v����g�L�0�1���c׮]ԨQ��Ç3e�rrrX�d	������ӳgO<==122R����%  ��r��
�ׯO�>}�4i��Ƥ����쌅��������ȕ+W�����¢ܱ�DEE���C���! ,,���(&N�X�s^���{��e�…4Hi߳g_|������?�`͚5$$$���G���;v��yE��pS���Ç�o�>233��קe˖8::���T�xe}������IIIԬY�w�}��ӧ+�(�Knn.aaat�҅�
*�7��Ɔ��0ƌC�:u�>��WTT��CB<cG�a��ѺCQń������0^(I�766&00�����իW122��ښ)S�ЪU+����!���$y�$ IDATO^^-Z���͍y����MeذaԨQ���p._����=z���]�7k�,V�^MVVZ�X|}}�����#99��7oR�n]^�u����ٳg���1�|155e���Y����:u�������q�fff��ۗ�'bbbR��)�O>�[�n|�����ƍԨQ��͛ӷo_F�E�ڵ���Ii��߿?+V����Ì;Vm�ÇcllL�~��J�B!�����$&&�:!�B!�B!�O�$\�炟����ʢ����L�Bjj��'33���@RRR�GOOOm��K��%C�_���M���s��v�ލ����� //�?�PY$�*N���r��	�����Ɔ�'O���Dǎ��IIIdddЭ[7,,,������]�v�����@XX;w�d„	T�V��&��g��̙3,]�kkk7nLVV���4lؐ9s�������;ׯ_Wνt�����O�;���?�7oV��w����$''s�֭����"�ɓ'���<zMl۶�����U,{��%??;;;�����8q������ٹ��"��*+,,�uB�*�i�_�+-��Ą�3g2s��2�155e޼yjm���ԯ_���988���P������W8��$���ٳ�Ċ�ԭ[�+V�ڧ�����nݺxzz���Y�x%�OI����ږ:���׮M\�}����ʆ
��ȠiӦdddp��Y&O���YU!�U�ҥK+�<*��)44���P]�!�B!�B�’��\hѢ����n�������ҡC�̙C˖-IKK��LJ'N�Vi %%�o���f͚�y�f֭[���/VVVl۶�ƍ�i�&���W�ۼy3�/_�iӦ|�嗴k׎��T�Ν˥K�ظq#8;;s��Iv�ޭ�p
���K�b?y�$W�\��ʊ֭[`ee���/^�ԩSt�ҥB��P�‘:u�`�<<<�7o�֭c���ܺuK�J�6m��oߞ���������_��w���	�d�U�Vaccý{������ח�[���pQ����5k���7�5bÆ
�$\�7���ڵk���-!!A.�Z��?hԨ���B!^h={�$??�ٳgcoo���1iii,Y��7�xC���F�׌��;�w�&$$DIF			���77�g�B!�cnn����iӦi�MT!�B!�BT.���Q�lll�e����)�111���`eeE���iѢ����I��={6�[���WWW�޽˜9sh֬5k�d̘1Ju���X����ر#���t��I��p��Az�ꅩ�)111ܻw����CÆ
�E��=**
@#a����;v7͕�K�.���r��i>��C~��F�I׮]�>G���O?��Ғڵk���ũS����8�Ξ!!!��������©S��9*Ny�������Ғ�5k*�7o��:�.�8�j޼�Z!��F`` k׮�uB!�mРA���ҧO�v���ϩS��W��&M�q����5chh���7QQQdff���ITT���ԪUK� �U���%������ۺE
�o�V۰I!�B!�B!ċO*\��jq�Jzz:��t�F[�6m���-[�T�j����@�N���U;S^�r�5j���HPP��O�>=z���&M�D��յ�=77WIX�|9˗/��K^^���ŎWU��:u*Ǐ'99�-Z����W����\��O�΂HLL$11��k�2~�x\]]K]�R����M�*x<|�P�X����GUB�R���!�6Z�j���ùp�_�5ժU�uH�%r�…��'11[[[��,CB�J�J�����_(((�Q�Ft�ޝ	&аaC]�(����f�|�M<<<X�l�賷����]!����F�ɑ#G�|�2u���uHB�ʕ+	

�uB�"
u�B!�B�J$	�+��_U͢���W���A�����V�f�b���U�����U�ʦM�صk}��!::===�R��ľg�


J���]��ك����wP��t�oaa�2Fq�loo���-qqq�ر�s�αf�����;����?��r�+r�)��𘈳��)��!`"�68���-��:\�,Mp�y��Z��Hj�\M�Di"�
"�?���� �qx?��x����k}�9�0�>k�Z��ѣ8p`��+�3���5=.輊��؂�1c�I�Hi��.\ȅ�����~v�T���dz{���n;t�����]����<^}�U�7oN�6m,��H�Y[[���mZ!�AQ��|1W�k�A��DDD�E���|�
[�lQ����U�������t"DEE���c�0DDDDDD���n����999CBBB�->>���_�>�6+7>7�b����Fll,���|���t���l˒�
ܜ�����|�Y���x�b���iժ�N�"44�l�_�����E�bL8�|�����6���`���\��aÆq��E�ϟ_h�%y�J�8�ԩS����|�ˌuDDJ���{{{�W_}E߾}L6)o�w�.��ʕ+L�6�A����D���0`S�N�ʕ+��������H�
		aٲe�^���]�Z:�DJ��{R���������r��9.\��``ԨQ��W�n��ȑ#\�~�#G���Gйsg��$77???����<Q��O�<ɿ��/{�1:t�P`l:t�Q�F$%%q���r;��8p���(ڴiCXX����^����t����s璖��իW�3g��W^y�жkժ�ƍ�r�
�N�"$$$_�~��a0���NVV͚5�y��E��^��8�K�-HII�׆��XGD�$���iٲ%��_ٹs'��k׮���Y:4)��`Z��^Nzz:^^^��!C����Nxx�#)����L�¢E����t8""""""""""R��t"����Ǯ]�8r����f��V��رc˭�aÆ��w�q��i����5l�0_Y�Νqtt$==�
��ϖ*�M�6���eZ�vVVVxyy������Ktnw䙐�@ff&AAA���3k�,z�!���2d3f�`�ڵԬY��Ç�c��9B�>}��y�7
�[�nlذ����o��o���=_�aÆLHHH��WW�B�/�Wō�cǎ�޽����|1&&&�K�x��'9z�(���c�޽��⋸����_�����e��l�2&L�@���Y�t)YYY,_��;v��S�n]^z�%F�������7n�l�2�o��ٳg����I�&��׏�����W�6o������š5kh׮�٪^����`0�f��J͚5+��� ��ь1�I�&��[oX�ڵk�;wδڲ��߉'
��lݺu��������+34�p!���@BBB���Q�aaax{{��䄍�
t�֍���r]5�f͚���3x�`�����ё!C�����Y}kkk� ��K�(N�999lݺ^~��"��ӧ5k�d�֭����y�����o�1q�D�F���g�ĉ�����ԩCxx8={��f͚���ҲeK>��cz��]h�cǎeРA<���������δi���0`ӧO������;;;�4i���3g�,�����Q�Xz�ꅽ�={����ƞ={�Q�/��B��x�'HJJ��Ņ�{���舻���K(��͟?���LS"Cvv6�F�bŊ�9s���Ξ=KXXcƌ�ƍ�cCCC��/8}�4999deeq��Q>��C"##M�J�fA�m�FVVV�	����dee�}��rzED�A��フ��6mڴYd����A����2e��Nppp�����1bD%F&"r?~|�{:t���P��}&L���E�8|�p%G("""""""r�V���ZQ��7�q�ƕ����?���L�8��'ٗ�ȑ#9rd������-�~�m���V�;w�4=�=��Χ$	.�g�f����_~��|� ���/򋧂��V��'Of���w�����K���+�5Q�X�W����7˗/'55gggRSS9|�0o��&���E�!"R�֭[������]�6u������ˋ�{�իW����\\\3�2�j�*���hݺ5S�L�I�&���L||<��Ѧ��
6�h�"999lٲ���֮]k�2��m&$$��la@˖-��o,���e��*��fݺu�ADDDDv��E�Z���*xj�g�}�Y�f���Wd=1�{��˯\�´i�4hNNN���ЦN����V�Ze�)"""""""�.DD*ҰaèW���L⑑�899���k��D�nd�Q�8�|�IMe��������LJ��g�UH��C�Y:3��l�S9����)�`ǎӼyslllpqq!((�-[�����"##Y�n��'�
"!!����R�Y�'NШQ�|�7nlVGDDDDD�N222���b��͖E��u�bccSd�:p��y~���J�JD��
��x�
'==///Sِ!CHOO'<<܂��������ȃJ+\��T�jժ�{��СC����O>�jժ�ND�e���<���;v�.]���mllX�l��_y뭷HMMe�̙�]2ŝ��ߟM�6���g�P�Ę�`t��i�BW/INN6=3f3g�$..���8>��S����6�T�6r��yj֬�o���XGD�8l�DD�%ED�r�iӆ�U��o�>Z�ha�pDDJ̘��f��ϟϑ#G�R�
�?�<cƌ1[Q"++��˗�c�~��w�֭�K/�Ĉ#L��m�6f͚E�޽M�~���L�:���o��&_�			dff�f�ڵk�����N�z�0�Y���C�x/RDDDDDDD��(�BD���mۖ���Ν��ѣquu�pT"r7*逮'�|��G��o���$%%�p��Y>�����i�&K��OBB���[�H,̭�[����K�.����777v��ŦM��駟X�d	�V�b���8��mĘ�cm��<cك��#"e�������TTT>>>�CDD�vvv���������)�7�|����^��W_}ō7 ;;�Q�F���d:��ٳ������Hhh(���L�<�C�1g�\]]�W�iii������Ȕ)S�.n�m�6���pwwϷ��ݝ��x�o�n��)"""""""R��r���ͼy�7oC��t8"r�x��'ILL�W����K/��ڵk�ѣcǎ�@tR������!!!!�oV���/_�ʕ+6l/^d����n�vu��0}{+c��������ȝ<��ÖA����܈���t""eҨQ#6l�@ll,����ܹӴժU$%%Ѻuk���ؿ?�֭�M�6���
�\�v�̙\�|��ӧs��
f̘��˗	

���l�}H���XZ�l�/>c����������HeQ…����]����l%���y��]�6ӧOn~��~�W�N�Z�<x0~~~<�����o|��w<��c>��իS�vm��ٳg�ϥK��<y2...T�R�ƍ�իW���8ϝ;����)N���u��Q^x��W�Nݺuy뭷�|���NA��7�>}:-Z��J�*ԬY�:��_�t�����@�?Nnn.�Νc�…F�e�ۯ_?�����ʢY�f4o�[[�R�i|-O�>m*kѢ)))��5�눈�����܍��ùv�Z���С���w\%RD����N�'N�aÆT�RŴ�ۭ�qw��@pp0͛7������زe��n�v���������xyy�����'����o׸qc�:""""""""��!K """"E{��Y�l��|���dgg���MVV�ׯ�z�ꄅ���ネ�������X�j?���V�Z�y��U�w�n6�XJJ
�����dzm�6���sw�sɒ%8p��ʕ+���&<<��}u�ޝs�Ι�\�t)���f��n�������yvv6qqq���q��EƍW�w???v��ő#G�5�W�jU��L�
Fpp0!!!�����uuu-U��j���0'''bbb�ر#�w�&11Ѭ]��K�Ν�v�""��'N���n�:���nnn<�2C��ܸq��!�"$$��S�ҠA���R����FǎIOO�F����H�hҤ�鱃�`���8	���G��'''�==z4�����ѣ�����;��1����7Wɸ���XGDDDDDDD��h���\||<?��W�\a֬Y�}�ogg@�*U:t�Y���͛ٺu+׮]#66�ƍ�믿2o޼B��7o			�oߞC����ñc��ԩ�|�
aaaŎ��Ɔ�Ǐ���Ō3���)S_-Z���&++���@�����g����gznL��믹v����,Y��E��ZT����$��Q�aaax{{��䄍�
t�֍����`���<������aggG�&M���c�̙�js„	8;;cccCvv6�z���ޞ={��wϞ=ԨQ�^x��/���}i���YBow��!BCCy����0a�-���Õ�����#33��!� 22�)S��hѢR'[���e��ݸ���ct""�g��x�=���|U�[W6���kA�c�c��O�skYA���������T$�p!***���K�!"%�~�z���-����ŋ��SO0f��O�Ε+WX�|9�۷g��|��G4jԨ�ٽ�,Y‹/����;˖-�gϞlذ�?���>׭[��իy��hժ4mڔU�V1bĈb��g�����̜9Ӵ:Ei�Z�h͚5`�ر̞=��3�ըQ����ϟϱc��߿?o��o��V��YBQ��7�X+rxxx:�\i��ٳ'={�4+�^�:���,_����T���HMM���ü������1���ݻ,�r�
ӦMcРA8997�N����V�Ze�)"""�@زe���L�4鮼7 "r�qrr"%%�����EY�x1��ɴjՊ��$BCC�x��N�:������A�:u�edd�ꈈ������T&�p!�}��xzzZ:)OOOڷoo�0D�=��3�Ƿ.���O���Bdd$
6,���w��	�_~���cN�<	���VVV��iӦ=z�DqU�^�\�jݺ��q�ڵ���2w�\�U����?~<O>�$���deey��ٰaèW��������H����`d"r?3K�Q.���IOO����T6d����	�`d"""������@�B�߿OOO<==	�t8""���ݻ��������ܹs,\�����Q�Lu8@TTmڴ!,,WWWV�^́Lu�+U�>}�Tf��'%%%_�Ʋ[W��Z�B*̻�˻�k�0DDD�y��jmcc������!�?���	666�s���lb�**΢��/;;;���.!���E�^�ظq#˗/'66���@�ΝKpp���R2ժU#((���{��C��'�|BժU-��<���˖-c„	4oޜ�K��������ٱc���;u��套^bĈf�_nܸ��e�ؾ};gϞ��֖&M�Я_?���o�_qڼ59�8!!���L֬YC�v��~�׫W����5k:t�Y2������^rr2}����'<<��DDt~~~�ڵ�#G��d�jժ�;���L������g֬Y<��C1d�f̘�ڵk�Y�&�j���0'''bbb�ر#�w�&11WWW�>�ܹs地���������
Ra|||�f�֦M۽����X�Lj��ANN���}��}����lٲ��7n����J^^^����ke�U�V-��?�@||<�&M��?���R�rgm۶%  ��s�2w�\F���KQ��6�|233M���ٌ5�+Vp��rrr8{�,aaa�3�,	044�/���ӧO���CVVG���?4[ѧ$md۶mdee���o���;YYYl߾��^Y�z5...�^�[[[K�#"R)HHH(S5j� ,,ooo����������nݺaZy"���� IDAT$$��~���'R�~}�ׯ�ĉIOO'$$�	&��쌍�
������{{{��ٓ��={�P�F
^x�2���������HIi��P���fQD�ޠd�{߭F�ATT�����řVr2dH�ǿ��+������͢E�xꩧ��?�7os�Υ{��|��w�kE�eeeE^^?��3͛7�I�&�:u�%K������O?Mrr2`�b�����7��ޖCD���Ņ��0��U�V���D�֭�2e
M�4!%%���`��㉎�6�^�a�-Z��` ''�-[��ڵkM3�̈́���-�bcc��!�e���8��^%�˴i�;v,����ED�PX"FA��7��	lfϞ��ٳ��˼��˦�={��gϞfu�W����7˗/'55gggRSS9|�0o���~~�������H�S…T(OOO<==-����ƍ-������\�����o��v��L�<��7�w�^ڶmk���ޞy��[|�ף�>Jzz:-Z��Q�F���L�8�Q�F@@@�Y��]���DD����T~�___���;vl�e��Ņ�� ���ϖ-[L	���\�t���HN�:E�n�4h�
2�$m�ĉ4j�(�>�*P�:""����[:�KT�w5j�(�6ED�|6�͛7�ĉ������	___G'""""""""%\������.\�@Ϟ=ٹs'���x{{3m�4�V�Z�1?�0{��e֬Y��� 55�t�¬Y�x��'�-���k�…r��i�]���o����-�/&))	��M�ҧO&M�Tn�#""wc‚��ӧ���(��q�#�1c�0s�L��∋���O?���ooo�ߡ%i� �ϟ�f͚��ˌuDD$��t"r���˳tŖ��Ʋe˘0a�f`)�jժ�{��СC����O>)򞶈������HEQ…�]��Y\���[�.nnn����fQ��Ͻ����f�֭#..777
�b�}Aa
JZnkk��``۶m���V�Z,X��z\y�Y�}yyy��啯���?���E�!""w��/(���nw�w��%��={���Ʈ]�شi?��K�,aժU�=����͂XYY`mm�o���XGD�A��������������a��իW�1cݺu�K�.�GD�նm[�;w.�G������Q�������ȃJ	"����lΜ9Æ
���	

婧��tX�:Dhh(k׮%//�W_}��͛ӦMK�&"��'2}�t�~�m���,�C�v""w'''RRR���)��D<<<��� ))�o���+V0�|S�EIۼ]�:uHKK###�:u�����0���_�ƍ�W�qqqJ�)#ooo%ߊ�������]A	"��[gm�v�����	

%..�I�&�a��U�f��ʕ+L�6�A��[
0��S��~�z�G"b���-"$$��Z:��^Æ
���t"r���aÆ�C��ݻA`` 'N�Y�f\�p�U�V��_b0X�t)���#55�ɓ'ӻwo�5k������Q�i��ʊ��<N�>m�&Z�hAZZ)))�+RRRLuDDt�ׯ�t"RI��������B۶m˥���С�i�c��)�B,�`0�	R�*U��㏳`��
��?�LLL�fҾ�����������lȐ!�^����p,��<��V��ƍiڴ��Cy t�ԉN�:Y:)����v��ȑ#�����Z�*cǎ5=6l������bV��յTm֪U����3`��������cǎ�޽���D�v�ܹs�N\D�>��^"����2���w������ɓ+=���͍Tj�""""""""""Rq�-�HQ���ңGF�eڗ��ŢE����C���ۗ%K����]`ׯ_gΜ9t�҅=z�f���`ʔ)t�ԉ�ݻ3c�._�l�Fff&�����_��͍>}�0�|.]���ӧi׮(�<���G�v�L��7�;���������l_I_�k׮1s�L:u�D�=�>}:��G�>K�nrr2t�ԉ�{��>��+W���=w��f�����ݝ�S����U�9WD����3f������
///�l��|�v�J����q��q�O��`0Я_?S�5k�Ю];M��ի��``͚5dffx^""!//�4H���G$""R~J��_�F
�������	�֭f+I0��ӧ��cgg���M�4��Ϗ�3g���	&��쌍����^�zaooϞ={�Żg�jԨ�/�PҗGD�i�?G�6m��Y.?+���π���$((�\�,	777�����_+�o)Z�B�	���'33�4�=;;�Q�F���d�s��Y���HLL$44kk�|�9s�a���/��ggg֯_oj��իl޼kkkf̘��K�x���9u��ش�4������',,��
b08p�G�ᩧ�2�=r�����oߞ
�*���i���'O��J���LLL��uزe�fժU���i��7�$##���W_}ō7n&)������j:�믿Η�RQ��?�aÆ�%�$''3}�trss�۷/���*aaa|��7����TϘ�ҥK�m�FVV���bwww'>>��۷3p�|�ED�ާwED�E%b8880n�8ƍw�v<<<���c��ٳgO��)�W����7˗/'55gggRSS9|�0o��&���w�ADDDDn���۷/m۶%,,++�J��`0��CG�ƍ+�y�DEE���c�0DX�~��C�
�.����Bll,�f�`ժU$%%Ѻuk���ؿ?�֭�M�6��������DV�^�޽{M+e���`cc�W_}Ell,#G��W�X�r%�N���ٙ��0������˩_�>���DDD��o޼٬_�J	�
*u�E�]�6.\0����~��O>��}��F���9s��V�*S��5bÆ
�������Ν;M����KRSSiР+V�`߾},[��,��"�_�b���Z�bÆ
|������+�����ヽ���62^'�;w 66��-[��Xf�#""���
���i�0D����IÆ
-��E�
F�z��fu������	___F&"""r���y饗pqq!&&;;;��aoo��O?M\\�E��K���uoR�.���Ϥ������}H+\H�3�*�uFR___�/Gv��@pp0���n&eѿ�l�B����ڛ<y2͚5��ۛ�K�r��5�L�B�F�:t(˖-3���78?00дr��O?͔)Sx�����[�nԮ]�;v0a�lmm�~�:;v���Ѵ
Bib/Jnn.=��Ҿ>ƕ�z�)=z4;w�$  ���N�8�4���LJ��0.^�hڿk�.�L��O<���+��?�{�=��*��~�����T/00д��?̠A�X�r%{����ݝ��L~��'�W����+'N�0]O�2�df�#""��N�:ѩS'K�!""��jժ�{��СC����O>�jժ�NDDD�piiiԫW��ap��%���@LL��W�={6u�ֵh"�`x��wy��w-���������}M	rO�}��ӧO���Q`����|e-Z�0=��˖&M��W�V-�q�����$�[=��3�9s���Я_?���ٳg=z�`�޽ddd0r�HlllJ{Q���jժe*+Mnnnf�۴i����2�{�������7Le���,F��Vѿ��(���/k׮%<<www���Knn.:t0%��?��5k�;�Xf�#"""""r��m��ܹs=z�)�[DD�m?��+V��~ %%���\i߾=Ç��_�t�����
����rm����899������gϞ5�
,���?g�ĉ��矖��Ǐs��y�n�ʣ�>j�p�ի��C����QQQ�CDnS�󊈈����e)�B*ݭ+W���lq{��n_��N7(.]����J�*ֵ��.����:h��W^aŊ��G�lٲkkk�UJ{Q<��?^�>n]!��n}}JӮ�����K�[ۼ���㩨�*+H�ڵ8p QQQ$&&�g�:w���)cYq��׮]+���T>ooo���-�������t���غuk�}�������W_}E�޽Y�z�i�)���(������f��Ռ=��Q=F�i�LIII�W�����i�0D���nܸ��a������H9ӝg�'999���BLLNNN�W������_9|�0�۷7�>|�˭u��܈��%11����]����X!����f��֭[��8r�)��СC<��c�Q�
8u�����T�����nE������?$''ӪU�"�:�����]���{�bmmMǎM��ԩCZZԩS��،�S��ALL;vL�zDDDDDD��o�����;�N��~���7��^z��{����~�z�̙Ö-[����o��`�R�����^c�ʕDDD(���Ϗ�<�<==���t"����p!"""""r�)��"ֽ{w9~�8����;w��b05jT��eLd�ȑ#\�~�#G���G�+8���\������fРA���k�HLLd̘1�<yggg�%�K���ٳILL��:t���`�2�{'/��"p�=x� ׯ_�رc̞=;_݊�ߘ01w�\��Ҹz�*s��`0��+���}��G�ׯ_�5/^��'��G1�oѢ)))��1�눈XZǎ�|�2s�̱t(""""""���Çs��)�v�ʱc�?~<�Z��Z�j���ѢE�N��޽{y�Gؽ{7K�.�t����D~��G�֭˒%K�]�6			;v�ҡ������������}B	rO���q��9r___ڷoO�^����/�Z�*cǎ-���
FÆ
IMM���777���9s�
6���߬~�ΝM+Z4hЀg�}�\b7��cǎ�����~��㏱��-S�k����777�x�
���hժ���j�c/���/-Z� --��#G���ưa�x����խ���N�:u8r�}��S�N�[��7�x#_��^{���< ��1y���9�e�#"b)�k�fʔ),X��3g�X:�2IIIa�ȑ4lؐ*U���䄏�IIIַ����v���<==y��G����I�&L�<�K�.��۳g[�n��GeÆ
fvܮu�ք��������q�
���3vvv8;;����ɓ'�</�УG�U�F�Z���� >>���N�<ɨQ�hڴ)U�T�G�m۶̜9�.xLIc+JI�?�+V0d��W�����YyA��QJJ
m۶�z�����׬NRRC����;;;\]]���1;��v��oQ�K�.�Y�f���ҬY3V�Zܜ)9((�
`ggG˖-	/���~�x����R��4ה������y����ڵ+���Y^N�8�����R��J�4�cI�[��q��1n�8��"""""""R����X\BBB���Q�aaa|���ܹ���t�W������K��R�fM�����صk�Ν�N�:<��s���888�շ�����,[����<b�����ɉ:0t�P�򗿔�����3c����]�6/��"#F���ή\c/�\�-[ƢE����o�|�2]�v%00�m۶��kw�:u�Nhh(�����ի4m�???�{�|��W�nzܥK�}�z��o�{����^3۷g�jԨ�/�P�ED*��o�Mhh(ӧO�/��t8"""&>>>lܸ��a��j����AJhϞ=��Ӈ�/����҈��bÆ
|��W��ݻDmV�V��+x������5��:u��?���۷�g��}#� �Q�FQ�v�;�����O<�o�͛7���ɕ+WLegΜaŊ���g�ƍ<������~�u��իW�z�*111l۶�]�vѡCS���sϑ��i*�����<x��������A�%�ە�����5���{q���K�,aժU|��G���گ��?���ر�~����ۡC��ׯ+W�,�9�ƬY��1c��yrr2������|��glذ������cooo6a���P��(���DD��1u�T��P�?������6~�xv��]��+Ky�x��!BCCY�v-yyy���4oޜ6mڔc�"""""""RVyƩ�E������������8+��|S�n�g�ƎK�F��ꫯ��_�t)˗/g�ƍ8;;���J���y��71bDe�\*�<�<8V�\���??��O<���������x{{0x�`G$"r�q٨�(|||�m��u��۟�?��-[��3f���_���ÇY�|9aaaԬY���_899��G}Ĕ)S�����M˖-�v��F�bҤI8;;���?���L�6�Y�f��O���D\\�۷/����ѬY3.]�D�~��={6͚5��ɓ�i�&jժERR���3{�Z�jE�-?~<�<���_�_~�w��l޼�tL�N�����7�`�ĉ4jԈ�ׯ��~F�MRRo��K�,)��n�,��ۼy3}��e˖f+7�hт���͛7�X`��A�lٲ��
������3.\�Y�f�����׏��`�6mʱc�x���ٿ�iE��&t~��o,wtt��?�W^�ڵk�����v��\�z���P<==���?y�7ضm�����Ɩ��,�uS�9��2���~����w7|��������Oi۶-ׯ_��ή���V�w�w�w�e��ʕ+xzzҳgO�}�],X���~����%��Cψ�����ܟ�…�H1deeq��>��s�Z`�aÆ�y�f"##�8q"p�&���������Hq����`�&O�LLL���1
p)��>����t���M�nnn���Q�fM,X��ŋ��...��ӧ��%v,]��k׮�ꫯ�駟��;w���իi׮_~��)�"%%��-[���-ZĥK��޽;6l�����̱a���yv��Ihhh��եK�X�v���N�=ػw�Y���9s���#�`kkK�n�X�n�[�fӦM���e��Vey�"""����ʴiӈ��(re��S�Һuk�*Ɵ�9��=z�0;�g�y�����Ν;W�9��1����?��'�ϟg��>��
�…y���9z�Ye�<��)JI������éW�}�C�\y&#\�~�Ԧ���)���r)���p������2�
2�իWN@@��y�X[:�{A�.]�իIII4oޜ�}�X�Z�j�ٳg9{�,���Q�j�J�ZD�ά��M�8*jЈ��HIXYYiӦM�]�ɽ�8��o�]�~�j�۷o/���������իW����|�
@��yyy���6�]�r�90��v���ĉM�������4i[�n-�ѣG�+{��g�x�Yy�
�ݻ7�����?�1�{�'���#55��b�Ui߿?��������L3{
:+++������?�k׮�ʌL�4)߹=��C�P*B�Ν͞7o���xРAf�\\\���4+/��$�MQJzM�������,���eff2o�<^~�e����ӧ���7��ddL�h׮��ya�7n�`�ҥ0�:ХK��ƍ�Ő��ŢE����C���ۗ%K����]`����yIb0زe�Y��_��``����Q��),������Y��v�����h*�W���5k��@DDDDDDD*�V�)GGG2220bccShݶm��ܹs��_T���VV�""%ֳgO6o�lD!""bi���7�Y\D�2EEE8L�NIII899Y��ɓ��9r$���+M�6e����$''���O+&.\�@ff&?�p��),��O3�c�]ӦM�U�^�9��VS�La����۷�}��7�?��s��ۗ>}���P]��nU�o���\�v��ݻӰaC�}�5�k׮�ڵ�5k���[oئ1)�V����́��СC�q�E�:u̞?��}}s��ckk[`e�<��)JI���Y���/�z��&m篢 IDAT���֥K�x���9uꔩ,--���(���	��޾Tm����r�J���=�ѣG�|��)q2;;�Q�F�~��={���0	

͗Y�'O�СC̙3WWW�իGZZ!!!8::�dY��)˱۶m#++ww�|m������8p`iO_DDDDDDDJH	"��X:�Ap�7w���b"rO�ݻ��C1��������a��*''G	���κ_X�/���u��Q�fM6m�D�Z���1��\�+�6mJBBǏ�}���:��f썳��Q�fM._�\��������?����?�!""����4i����P��nU�/""��;w�"MDDD�	
5����P�1�<�Hq�-�’(�"'�UY?�P�k�~���Fvv6,pଈ��`�ʕ�:u
ggg>��Z�lIRRӦM#99����J_			�n�����
6�h�"999lٲ���֮]kJ2X�jIII�nݚ)S�ФIRRR&>>���h���_h?�*j��15k�d�̙0}�t�.]ʌ3�|�2s��)�o��OY_���XZ�l��cYll�.DDDDDDD*Q�M!""""""""""R����_�p����B����|��_�����ʊU�VѪU�"�0&^�I�Ν�����?�L�:u�5��222
<�…f���+��?�HJJ
aaa���Ӽys~��ƌS!���KJJ��:���x����.�߹��v�������]�z��1�EY>�$���iӦ<�����Y:y�����;w�SO=���-O?��i�����q###Y�n��'�
"!!���hS�;vL��ͱ����Ņ�� ���G�v���������xyy�tqϧ,Ǟ8q��j��7nlVGDDDDDDD*�.DDDDDDDD�"��)��t���M�=0��у����6��2�[��q��1n�8֭[W)}���4m���{��踫W����EVV3g���ãкM�4 11�Xm{yy�駟�V�(�?��.^�h�R������ٿ�Y��ҰaC�����9q�111�ڵ�Bb+��b�
�ZdR�1��X�8Z�n
��?�X�V����uKVVV�}���K�c(��~*Rq���������t""�JMM�駟6+�g8s�L��3fU�T!..��ꫯ�/����xxx�%��������b����P�v�ѣGӴiS�=�����N��OY�=�<����2�눈�����H�P…��������}`���Th�v���ŋ\�x�,y��!BCCy����0a�-���ÖKD*Ћ/���ٳ�~�z���֭��ʊ޽{��O�0�#G�0`��N�Zdݻw`���%&&beee�m��g��^ --�W_}���F����;w.���L�0�TޫW/�̙Í7̎�q�s����+2��hܸ1VVV;v,�>ww�|e�[I߿��\V�Z��o�]d�|���^��W^`޼y�V����3�[Ajժ��V��˪����2&	�~��߹��i��t�%�)�V��|/��={�u�V�O���O?�իWY�d	�{�櫯�2�+h��[w���V��)˱�߯�d�[�nM�����������M3��Ƚc���xzzZ:�ҝ�f����I~�6m�O�>��$::��={��ҞSI\�r�iӦ1h� ���L�ׯ_O�j�*<�|,^����X^|�E���yꩧطok֬!""��z���`�1���,^����z��+W�q��[o�Œ%K�^�z���{ԬY���8�}�]���̎Y�l�ڵc�֭�nݚ�����K/ѰaCrrr��_غu+����?�0
����E��s�N@pp0M�6%99�)S��k�.����tPC�!$$OOO.\���;U�T���$�@�򎭤����9s���g�}�ȶ;t�3�<áC�رc��9�7�`���l߾OOO>���6m�ɓ'�:uj��t�ԉM�61r�H���1����x�b>���;�]J�y(�5j���Ɇ
�߿?7n��ή�����͍ٳg���裏Z:�|�ׯϯ����Çi߾��ܘ�n��������Ã��$���[V�X����8p�����bbb��_I,^����dZ�jERR����7��c�s>e9�N�:������A�:u̎���0��ʣ��P999<��a���H)���i�,�k�r��Miii8p�Z�j1i�$~��������_�b��'==///Sِ!CX�z5��ᦙ�E����LTT�g���r>����I�0f��H���²Ɯ2��FrXY����a����a���id
9D�Ԕlm�h6����}���."���q?�}}��s����^>��.\]]ٷo��$A�+VЮ];�ٳgp��)���J<�b��f͚�b�
ƌüy�7o�J�Ν;���RָqceB¹s�JL>���gƌ̚5K���W_%<<����}�ve›���1���4jԨ�5��_�}�vΜ9Sl]�
X�p��M���	4���cǎ%,,L�	����l޼�޽{�u�V���CBB���@___����/{����8::�

bܸq�\���P�۷'66Ve���B�?SU�[o�Evv6�'9!ij��ɉ��0����3g�2�@���k�0`���������L�f�믿044T�{��	cڴix{{ӬY3n޼Ɇ
X�~=����Z�
x��Caa!/^�aÆ:�v��	"""h׮�V���ˋ�7���H��5��bԴm������"##C-�"##CYG!�B!�O��>�BT���p
�%/y=������6"��D�G�fڴi��B�{{{eBFi��ϟ��ˋ7�|�=z0o�<�ܹ�V��ɓt�ޝ���+����l�2\\\�ܹ3���gŊ����X��{��t��www���[b\
�Z���ҹsg�u��G}Ķm�Tڔ�^�K'<Z�����}�bbbB�>}((( ::��Qʵطo�Ǐ���	�}�]-ZD^^�Vc���aӦMt�Ёz��)��ׯ���=�6m"''��8��'ggg��������CCCj֬IϞ=ٻw/��J�.h݇���o߾ԪU###^�u�̙Á�^��Z�֭[���BPP}����CCC�W����-���$%%�%[(��ߟ�'O���%XZZ2b����*lga�;Ɨ_~I˖-111���>��3���Ԓ'*26M��͛7����N�:*�u�qss�V�Zl߾��7ojԦk׮$''3b���Z�j�������T����=qqq���P�vm����ԩ?��#cǎ��j����?�Ghh(}��F��ꫯ�}��2}}}I�B<�F�IÆ
������<<<�|�2
6��ã\��[�nt��Y�{g;;;e�Q�FѸqcN�:���;�:u�w�ެ_���ի3i�$e�ڵk�v4�߿�Z���?Kz���!���055e���(�Ϝ9�ğ5Oq1jڶk׮������(+O�B!�B!�'��O�ҥK9r�He�!��ћo������CQI^�uf͚ŧ�~�L�X-�B<I���dggp��]�n�JAA�Z���ŋ���QN����g��񤥥)�\�r���RSS	�Z�Gk]���2f�.]�����o�1u��2�dݺu����'%%���rss6lX�m����q£ժ��G�d6m�Ď;3f�V;c�\����`����,6m�ĭ[����k:�={����G�.]��ҥ			�ݻ�A�i��bkk��}�$7n�ЩGGG�'�3v�X�'ܷlْ���k\���P��5k�����J�M��W�V-��HM�����ﲮ���
k׮U+W$�XZZ����NmǏ��--]�i�CY�*�x�ƍٽ{w��t�L	!�xrJ���ܜ��P���;bcc�v�u�ԡG��;��8p DFF������5����333BBBX�f
��իԨQ;;;Ə������)SX�|9YYY�.v�������of͚���VVVx{{3s�L�;w���).FM��ݛ%K�p��aF����Ç133�gϞ:�[!�B!������?~�-[��l'.�x>lٲEe�b!ċ�O>aɒ%������Vv8B!�ըQ#���x�W&$$��%\4i҄�����ذaiii�nݚ�S�ҴiS222�'!!���h�
����\�t	+++���+Z�hAJJ
���\�z�����X�l���ܿ�]�v��͛6l���ʕ:�N��&ƒ�	p��	._����-͚5M洵���ٳ$&&ҡC���ƍ�������鑒����'��j�qqq�h�B�/EY\\�$\!�(���)w����ٳ��Z�f
�۷ڡ	!�OT͚5���ۻ̺%%o�T��₋�K�絰�`���L�<��z�z��W�^�_��s��Pѯ_?���W�95OI1jҶF����Lff&
4 33���d<==��mK!�B!�O�$\�'��͍����C���V�B�LLL�eҤIL�2kk��I!�N�LPV�6,���iذ!��Y8$$�[�n��swwWIB������_�"f�&M�����c׮]�d�0m�4ڴi<Z��׷̝�LMM�}�6��ᤧ���䄫�+���e�M�K'@tt4��-�…پ}�V	�����3gΰ{�nΝ;lj'�}���c���߁G�3�kܸ�J!��$�:u"66�?��E�ѩS'�����?X�f
.`ܸq��B!���#G�s�N��ÕI0���XZZ���^��	!�B!�/I�B!��=z4.d��٬^����B!���M�*�������@��b��ŋJ\���ʯ322x�7T���ٕ�ĉ�5k�����dzr�J<<<pss�z�ꥶ�&F��Ǚ������������8p�۷ocffV�x���_&M�ę3gԎ*��t�ׯ_���\�|�2E!��$_�5=z� ))�=z����#  ''���B!^&&&����駟2|�p��BK�.-�B!�B!��x�*;!�B�l222b�̙���q�ܹ�G!�.11Q�UV9�N����/�܆��ʯ���J����E�_��;5�Ԧ��z����ݻ�1cm۶��ݻ�X�ggg�n�Zj[]b||�?��S���޽{���O��)j���9skkk��ݙ9s&���j�4��:V����.E�&�Z!ċ��Ύ��&N�H�-011����W_}�!C�p��Q����S!�/�������ŢE�X�h&L�h�!�B!�BT<��B�g����F��XT�}?�s?��?.22���x���J�B�<swwg������^��!���ӣ�����\����P^���ddd�c�,--K�kmmͅ���_�ر����_ը/\\\pqq!--�}���v�Z/^̠A�*$ƒDGG�t�R�t�v��ѣ����%::WWW�Ω��,$$�ڵk����<����J��שS���,����S��J_����:B!DY^}�U����CTA�o��_~᭷ު�P�B<'���pss��0�B!�B���p!�x!$%%��Δ)SX�l��ɕ�B<��Y�|9�����B�1��m۶q�����	��~�~�m�M��o���Ç�v��~�-����?^Y�gϞ̛7���T<x@JJ
���+��`oo��O^^͚5���(~w��/�cqΝ;Ǚ3gx���ܹs�u:w�L�F�HKK�zW�cǎ����o��������֭[Z��y��ddd���(S�B!��ǎ��ɉ����E!�B!�B!�d�!�Ok���i��Ν;L�>WWW劮��ח-[�`bb�T�B��b��B�prr"**�%K��d��bwf(�Q�F˩S�pwwW9V�zu&M��|?l�0~��'���OF��U?#G���ߟ����;;;�׵k���8KKKv�ءU��پ};C�Q&t<NOO�!C�0�|�����������v�bƌ̘1C�o��F�.]4{׮]9x� ���*����8::��B!ēұcG�U�Ʊc�x���+;!�B!�B!��.D������޾��UXhh(W�^eȐ!ʲ�C�r��UBCC+12!�B!��KL�4i���ԬY###�t�����+<333BBBpss���}}},,,prr",,LeG���pqq�V�Z`kk��ٳ022*���2c�^�u���022�iӦ�5�Y�f)�M�2�
���O~~��1>���޽���W�x��w177g���ܿ��k���ӫW/LLL022�U�V̛7�q���y�f��޻woLMM9|��Z_����L�ˈB!De�Y�&-Z� >>��CB!�B!�B���B<��AAAL�2[[[V�Z@^^��������?�P�n]���˘1cT&�(���ŋ���100�>`���dgg3�|:���!ݺu��ۛ5j(ϑ��CPP����ڵkԭ[��ݻ3n�8��̸x�"�
��ښ��(�q0�˗/����Ʊkkڴi�ٳ�ٳg���,�駟��w�Q�����b�
���}�6�7fĈ*�J��Ojz������� ���˕+W044�iӦ0���{���u�o�i�&/^̩S�066�w�a�ĉ�]+rrrشi:t�^�z������ޞM�61|�p���5��B!�B�g���	>>>�����?��LI	�����`���L�<�̸^z�%���\�@ݺuK�����R�߫W/z��s���khhȾ}�Jm�`bbJ<�������/�\��M�^�F
���&33�
���Irr2������j4!ijk˖-VvB�'d˖-����� 	B�
�e����	!*ϋ�<#�B!�/"I�υŋ�����0������IKKSֹr�
!!!���H�j��,X�@%b͚54hЀ-[�(�s��]v��I�j՘9s&�o�f��Ѥ��+�feeABB!!!4l�{{{N�8��S�hӦ���S���̤S�NX[[���|||HJJb�����Q�~}����^�zL�:��ׯ3r�H���_e����3c�>|H���u�_!00�u��)�߿���RRR���eذaŶ��Z?>A��ӓ��l��ۺu+L�6
�={����G�.]��ҥ			�ݻ�A��k�B!�BQ�nݺ�������z���̌���ϟ�o�Q�>�F��Ν;	������p,--qww���a۶ml۶���B�u�ܙ�7���OtB��q��}>���C!�B!����mV�OY�&M���c���lذ���4Z�nMDDǏ'22�v�ڑ��@tt��9RSSٸq#G�e�������֭[���S��y��!e�u�֑��N�
		�رccee���	PN�߹s�J��v����U���ю%���͙5k���̘1���fΜInn.~~~XXX�v�Z���_Z�lITT��� $$D�;S<Eb˲e�8v��R�,�y���iz��jԨQQQ���������j\\-Z�Pk�(S�B�aÆ���'/y�K^�+""����
!�P�&@����ر#�&11�ڵk��� �gbb������\�r�+W����իW����TXX(/y��yUe����믿Vv(B�*"<<�ҿo�K^�R	!�B!��Zd���M(�<11Q����;FFF�111���cee<J������c׮]j[��ЬY3���X�j���c�ԩ4j���Ç��1�7yڴiʝ+ڶm�ԩS��Oؿ?^^^899��K/Ô)S044����P�^=�u�s���Сnnn���3z�hRRR:t(;vT�9r���9
6T�O�+Dy���r��m���IOO���	WWWe�II4��j�� IDATEy{{+�0l�0BBB�u������E5n�X��B(^�a!��dUC!�=��]v����A~~>���
�;wf̘1�E��o�///-Z��	����䨄A�o�xqDFFVvOL�-�Y�&���o߾��BTK�.U��O����3B!�B�"���\PL�W�x�"...��?��ZY��͕_���*�nڴ��k�v�������E���\�|@hh(��{��=z���lƍ����α�jJY&L�����III�I�&��?�Q9����5�H'Nd֬Y����ʕ+����ͭ�UE5��E��<


�eׯ_��8E���B(<���WvB!��B�U����nnn�J�'�Y��i˖-�U���Z�j��?���ں�CBTǏg˖-�$�3�Ex�B!�B��$\��������%��(s�۷o��[�Z�j���$E'�+�����]�����ݻ�k�.�U���c�.�W4==�r�/,,T�#??_�x�^�ppp 66��۷�믿�b�
6l��	4h�V�w�

�_7.EYq�YQV��!�B!�B!����pI��
���`ذa��7gΜ�AQŸ��Ɏ�B<#^��!�B!�x�H…x.YZZ�����;���|�}YYY�����L�N�������X��upp ..���T:�[o�E�z��j�˗/��lْ��4�<y��+���_����)===
������(yG\\\pqq!--�}���v�Z/^\b…6�ZSu��!++���l�ԩ�r,;;[YG!J2l�0"""*;!�(�L@B!�B!�B!�B!��bI…x.���ۄ��1m�4���i֬7o�dÆ
�_�{{{V�ZU!}999���?s��Q&1̛7GGG���
��ѣ�5
WWק��'����]�v�Z�
///6n܈��#:t�k׮lڴ�E����O�Z�X�t)���X[[��?{�ڵks��u�m�ƠA��r�
j�@ff&>>>8;;ӬY3���/@uG��i{�5Ѽys������PK����P�B���
aB�g�|P�!!�B!�B!�B!�BQ�H…x.�5���XN�:����ʱ�ի3iҤ
�k�ȑ�߿��/���r�aÆje���ԫW��W�bmmMǎ+$v{{�R�LLL$''???LMM�={6���1t�PfΜ��͛177磏>"&&�S�N��煮g�ر%����DTTK�,aɒ%t��E��ȑ#�'  @-!��ή��k{�5ѵkW<Hjj�Zߩ���n�B���<xpe�!�B�0�l�Rj��B<I[�l����^����3�j����ҥK���{ԫW�]�v�|΅�������qss�O>)��I�����)�
�����8�6m��Q[��������� 	�B!�3�Y}FR8y�$۷o'99������B,--�ܹ3Æ
����-�4B!�B!D�$	����G<333BBBX�f
��իԨQ;;;Ə���M��gnnNhh(�}����\�v�:u�УGƎ����J�jժ��{������{j���3k�,�/����f�̙0w�\�ԩChh(���;v��w�bccèQ��ѣG��4iժU#&&�;w�`oo�����۷�J��b``@dd$���X[[����ȑ#K<���Z�{�fɒ%>|�#F�;|�0fff���S��
!�B!��m۶�m۶�C!�sD��F�V�T޷n�Z�s���r��I�������g�q��A�~��TD�III�y�f
�������]�v�B!*ʳ�����Νˎ;��\�x��/�}�v�͛��bl�=��3�B!�BQuI…x����:&O���ɓu:�6�5k����oo�R�R7n�ƍ+񸦱�gq�Ν�ܹs����G�~�Tʬ���תo|||���)3F\\\�:?h~�5�5j��͍��`233iР���$''��鉩�i�}	!�/���,�ׯ_�a!^@�����B��PI	���8u�+W��}��<x���v��R�Wd"���*+Ʋܹs��ӧ��ꊥ�%�h1___�lق��I��/�B����>#-Z��;v`ll���;={���ښ��Μ9Æ
8t�ӦM#**��u�VX��L#�B!�BTm�p!���F��Ν;	W&r���cii���{%G'�OΑ#GX�v-G�!##��R�^=:u��G}���WU)v���	�.\ 88�}��q��Yrrr077�Y�f��ٓѣGӤI�
��iY�z5���ܸqC�ؓ���z|�0}}}���iܸ1=z�`„	���k����c��k!DU��TvB@ddde� �`oo�VDPP��e�X�l�N	�I�������addTj��^hh(W�^eȐ!ʲ�C��q�FBCC�����B��C��T	���3�ٳgٺu+FFF|��wj�����agg�_|��}�غu+���ֿ<�!�B!�U�$\!�<������O>|8���,]���իWrtBQ�^�ʨQ�ؽ{�ڱK�.q��%�n݊��37n��¢�|~ݻwooo)((P9v��MN�8��'�?>�|�	�����ظ���Mi;u=�>|�͛7INN&99��˗�z�jI��9�e�\ɑ!^T��C�j���!((����s��5�֭K���7nfff�zE�9:t�<��XRyAAAAA�ݻ�+W�`hhHӦM0`��Jyyy�?��Cݺu�۷/cƌQNL,�Oy&HN�6�={�0{�l�����?��������;����xJ�Q�k���æM��С���S�ׯ_{{{6m�����177�z�B<fΜI�����)Z!���i�֭2t�P�d��<==166�E�ַ<�!�B!�U�$\!^�۷��ˋE�0a����*9*!��x��7]�t!==+++&O�L߾}y������?�`˖-,X��]�v�����?����<j�޽{��Ӈ��X

9r$C��7ޠv��ܺu��'O����oINNfϞ=�]�EI������ܸq������[v���#�]���n.���%��ͭ��B��"""6lXe�!4�H8{�,nnn4jԈ�[����ʨQ����%""BY���ی=���teYVV$$$����N��n�:���BJJ
�����T~~>�Ǐ'--MY�ʕ+������J`` ժU�)������Ă����~��dee@�z��:uj��S��{��!//�.]����K�.$$$�w�^
���x�9r��/J…��U�g$�sa�޽K��I�&̞=[���}�3�B!�BQ�U�_n�������_��_�СC+;!�x">��#���y뭷8}�4�}�-[����###�7o���/G��V�Z<x�U�VUv��
ooobcciԨǏ'$$�^�z���/c``�K/��;�Chh(Ǐ��ʊ�2y�����344�^�z��у��h���),,��ӓ{��UvxB!��	JMMP�f��{�u�֑��N�
		�رccee���	S�-��Dbb��}I�QQQ,[��cǎq��!|||ؼy��͆
HKK�u��DDDp��q"##i׮			DGG��OQ���%���͙5k���̘1���fΜInn.~~~%�x��x�{-����V�.Z��#DU���c�*;!���HW�\�q��Z���}�3�B!�BQ�I…B!D9ddd0n�86l���1���6Le5������|=.11������/cddDӦM������*�>��ݻy�嗉���V�Z%�ݺukX�z����~���#GҠA���hР�F��ܹs���ĉt��j׮���			Ŷ;w��Ǐ���cccjժE���5k7o�,�����F��w��111aϞ=������}���ܹCCCV�Z���r�����qm?w�^��,�sYR\O�3��y��aggGff&��}�}+ܽ{�o���nݺQ�N�[�.���#66V�u�����1t�P�ի���vvv�ر�Ę�B!�#��V�Z�^�L�6�6m�`hhH۶m��<�߿_��>���ɍ7puu%11Q9I &&lmm��קI�&����k�.�c(I�pss��ɓ�=�_~��!C�бc�r��<m?#5j�H��ɒ��%DU���ٳg�~�ze�"���JJ�,��*<#����T�۷<�!�B!�U�Ae �B�:|�0�.�n�R�)�Z���b�֭8;;kuN��k׮e���<|�PY������ٻw/��F�����Ə�K/�Tf_�F��U�Vj�lv�����s玲���ˬ]����m۶��;�{��Ǐ����ݻw�G��w���={����s��ʺ'N��G����(����9y�$'O�$,,���x^y�
��q�޿��`


���y���Ѯ];<<<���X�f
.Ԩ]Eƭ�u����h�Z�jxyy1f����6lX�usrrprr��ɓ*�׮]c׮]�޽���h�}�]����z���0`��6III0�u��iԯ��PL�(n5����;��C��m�6RSS�u��������7�,����<�B�������&A~�O�_!�n�N�X�`,P��3gs��}����m۶*��ԗ/_�9��'2k�,��㉏�g�ʕxxx���F��Օ�.^����K��9���}j�q„	?~����4i���R�k:��UL2777W;��L&��������B�?N߾}+;!��*<#իW�˗/��_ѤI�b,o��L#�B!�BT}�ÅB!��_����+999L�4�s��q���;Ƙ1c������M���Baa�����_y|͚5ʯ���<==y��!�Ǐ�?� ??�C�accCRR���W�?r�����h��Ƽ��)˲��2dw��a�����r��=RSS0`���|�dee{N���ˑ#G���%66��M�����W_}�RwҤI���0v�XΝ;G~~>yyy8p��-[��2k֬
��(]�߾}�8p�F�WaȐ!@�V�+O��\g�gR���$O�3�-����)�ɓ'iժG�!//��w�O�Ν),,d�ܹ����y�&nnn�6�O��޽{�<y��ݻ����~�/��>�����w�_|��'O�СC\�~�p��
:�ĉ���/���׹�'�&������?gʔ),[�����J�G��(VD.�^�z�{�nf̘A۶m�{�.+V���ٙ�[�*�l
��dXY4Oy�*V��VM���2��MTe/��2666�dO!��H���*��ʋ�<=#�o����Y�XYc.o��L#�B!�BT}�p!��������%/y=g������!�3����իL�:�ŋcccC���qpp`���|��dgg�|��R�ό3����qssS[�j�����?d�ʕ4n�CCCٸq#�ׯW�����E�:�kٲeܾ}���~���(Z�j����Z�"**���~�7nXl�nݺE׮]155孷�b���=zT��/��<Z����CCCLLLprr"22��۷WXlE�r�۾�j�J�+����Y��"��:k�i~f�emm
��
_xx8�֭�k׮���`llL�N���K�:uJ�>u��W�����{��DEEѲeK���x�7�駟hݺ�.�B<�4��R��>�h�;w.�����̌�'����ٻw/�g���ʊ���r%����B[w��a��鸺�bii������We�!!ij%11��� Z�nMbb"˖-���Nmb����Z2�⽥�e�Ɒ���Ņ��`֭[�ȑ#�u��/V�Q�c������$$$�+��,_�����ӲeK���5��I��m�:u���Vk�(S���rpp�رc���W����[��ӧO�X����-�4B!�B!D�gP�����/�^e�!��QÆ
+;!�i;w��O>)���1c��oػwo����:t(<�w��̛7O�b5.///�����jRL433�n0E������"W�j��/8p��w�.v\&LP+�ر#�n�R)����ܹs8;;3a��u릜 ߪU+��7��t����,,,J=���sss�jW]��:k�i~f�U�zu�Ѫ���?K<��k�h<�V��c�����6L�:���Eboo�T&�蒓�ٵk���иqc屗^z	ggg2d�v���Օ6m�T^�:

��իʝ���ƍ	

-�yL�lHMMP&�>��('''����gΜ9�lْ��4��b���:�1`�233����ٙf͚��_`hh�����oƴi��Y�fܼy�
6�~�z���Y�j�h%���B.^�X��Ӝ8q���ڵkǪU����b�ƍ8::ҡC�r���5mۼys������P���XP�y��:�[�灃�ӦM����ؕх�i�
�H������+��=cǎeȐ!���[�����L�����UX��L#�B!�BT}�p!�B����4��սΝ;W�q����bcc�ƍ���W9��A�CBY,,,�y�&999ԬYS�6%ū��8EyI�5��ب�ըQP߂~�ԩ|��G;vL�����5=z������UXlE�r�������&;;[��rrr055ոMIt�[�묭���і"�E�$���tN�>MBBǏW��ib�.�C1)���n�;w�,x!�RI���+�oڴ�ŋs��)���y�w�8q"&&&*�����2e
�����yyy�?��Cݺu�۷/cƌQ�����t�R�9;whڴ)#F�`�ԩ�ƥx_PP@PP{���ʕ+ҴiS�\�@Ѧ����X�8RF���lQ�K/����;K�.�~P&\(�G@@111��o�����u�q�2''��� ���ϵkר[�.ݻwgܸq*����ߜ�6m�D��W���}������gӦM>ss�b�.��\�$\�9����s��E<<<T�5l�P�L#G���ߟ��T����)�5j����:u
www�zիWgҤI��k���8KKKe��B���ILL$''???LMM�={6���1t�PfΜ��͛�����x��QӶ]�v���������cy&x
�<puu�cǎ*��i�*�H��9l޼�u��)w�}���5>>>ַ<�!�B!�U�$\�'f�ҥDDDTvB���^�a���t��Y����H���پ};�k�V���QA�+lllHLL��~�S�N�y���{$T$������S�n
�41j�(j֬�W_}�ɓ'�믿#,,��M��w�^�4iR!�������ĉ������Q{����;%��.qk{���4?3��?hРA�u7o��ԩSIOO/W��\�*)1�V�Z�IQ6OOO����{�.[�n����iӦ��[�x1999�I�����?^�p��BBBHMM%00P�Rqnn.cƌ�ҥKʺ����2٢4���*E�߿OJJ
)))���2lذ�jcI��_�֭[�q���,]����$�c���WN��{�.�v�"99�
6h�w��mF���:++���		QKr,��ٳ���<�t��_�.]HHH`�޽4H�8�O��	�O�Vy_���9���|��w���r��5�ԩC�=;v�ֻ�5p�@���T~������ё�#G*뙙�š5k8p�W�^�F����1~�x���)S��|�r�������)������of͚���VVVx{{3s�L�;w���).FM��ݛ%K�p��aF����Ç133�gϞ:�[���+���+��R�a!^��YU���2e
...���$&&r��e�߿Oݺuiٲ%�z��G�*���oy�B!�B!�>I�O�L��Tڄ-!�#5j��֭[ܼyS��$Μ9ç�~���6l�e˖%������۷5���ё��D��٣Q��ٳg�С���gÆ
��?�ݼy���� IDATl^z�%�67o�T�V��}��}.^�Ⱦ}�8r�G���ٳ\�p��']��r�z��ɉ'����J����(v'<�9��,�޽[aq�v�Y[O�3����X���&"""�������<�ƍS�n]Z�h�����}�r=mn޼Y��)�I�B�'�Q�F�����+�LHHPK�hҤ	!!!�]!6l�@ZZ�[�f�ԩ4mڔ�����IHH ::Z�Exx8�.]��ʊ����-Z������/W�^-5���(�-[���=���g׮]�y�f�
V�n��X�8������^}�U�b�s���.]J�8s����\�|�
6���Ub��[�n���4hЀ9s�ТE��Ҙ>}:�ϟ',,///�6e�߸�8Z�h�֟�,..N.�xF�ڵK��?�\j��5k��퍷�w��.�QI�...����y^&O���ɓK�׫W/z��q�ř;wn�	����_�~��S���&mkԨ������dff*�333INN��ӳBv
B!D٪�3����-_|�E��UT��L#�B!�BT}�ʮ"�B!�X���ѣZ��{�.C�!//�Y�f�����M��[��,C�`�ʕ�U�K��?p��-���>�ms��q�z�aÆ|��G��+W�VL����t�cƌ����5k�{Orss����O>��ݻիW0t�P����������u�…
��(M���*�3S��@���K�����j�*Μ9��ٳ�����Ee�����2���z(V_��_�m�̈́:!�2{{{�WY���aÆ+���U���]�����?������ӤI����I�`ڴi�i�CCC����-3>�Č��p"##�q����$&&��0�M�%�S�jg�]��SXX��ߢ|||�ҥ����i�F�져.�*�:�m�V�S����ڔu�n7j�H�m�ƍU�!��X#G��~��*�����cii���{%F&�B�9y�B!�B!�6I�B!��A�>}�G�<x�v<22===���UʧL�©S�8p`�,�~�m���Վ���������V��ٳ'YYY|���N�W�t��-�Z�jL�2EY޻wo,X�6�����E�УG�Rc�D�ƍ�������jNJ�
�"c����kL�2�{������ɓ'Uڜ:u��7o�|�rZ�jń	�۷/����wޡ[�n*�k׮
?1?$$����:�$M��gF����>}�}��R�?��Ç�[�x���;w�ٯ.����믿V��\XX�l#�xr�&AYXX�,��.�ŋ�G�uM�P��������o��r;;�2�8q"��������7���R�H��X�8�ի��+WJ�+33S�~Q*�۵k<z&ц���m۪�+���˗�ڔu�_�<�q�q�2E!����???����r�
W�\!::???�W�^��	!�BhD�i�B!�B��M.��Qq�[>�����=]�t����b'~T�YM��=�X"##��GFF>�~����ˋ�5kG�>}HHH��ݻ8pOOO��������6���,_��6mڰn�:��%����cllLhh(S�N��&//����+w�5j�J��� �֭��ݻiݺ5˗/'==�p��RSSY�p!���������LX���177�8���4���IKKc����bjj�'�|R�k���a����Đ��˃HMM���
�_�AEǦ��ꫯx����믿ppp`������\�v�:���¸q�x��!+V��ҥKԮ]���P��|�MƍǑ#G�{�..\`��ɬX�����:�]���x��re��<��Li<x��+Wرc�{�&  CCC����\��aÆ���������r��iF����p�ڵ2���z�;�
�w�^̙3g��>iii4�cǎ�xU��ZU^e���N�}/344T~]ڿ�Ew}x��Ź}��Z��m�z�ի�w�fƌ�mۖ�w�b�
���ٺuk�mu���q*����W��O*��1	��ʫ�$����Xe��'!��i߾=^^^,Z��E�1a���B!�%�L#�B!�BT]��<B��>��j�y������˗���⧟~"00�6m�<�(�Ӑ��D`` �7o����?�[[[�j�B���A�DDD���ʾ}��ԩ�Z�+V�|?�={6�h'ń��(&F6k֌+V0f��͛Ǽy�T�u����ƍ+'z�;w��I��̘1�Y�f����꫄��3x�`�o����U�N�F�J�_S_~�%۷o�̙3���K�x�
X�p��M����ۖ-[�ꫯ�7o!!!%�F�p��
V�X��9s���W�����g�Ο?����J��� ƍW!qk{���ccc<x����	�O�3STY_���X�~���"��fܸq�\���+W��>}:�6m�ܹs�8qB��Q]����9�7o�w��lݺUm�tHH*�!D����(,,$77W�onq;9����%�رKK�R�Z[[s��~��W:v�,���_5����\\\HKKc߾}�]��ŋ3hР
��$�
b׮]�����舍��Z��gϲn�:��E�:uJ%1>))	x���6������?INNV�w099@�1֩S���,����S��ʱ��le!�O����2!\!��y%�4B!�B!D�$;\����z���qqqlذ����/�s��S���T�ʶO;w�>}:���XZZbee���{,���ٙ��d<<<�����А�5kҳgO������R�…Z������۷/�j���Ȉ�_�9s�p�b�#oݺ5)))ѧO,--144�z��������IRR�Z��B���9y�$���XZZb``���%#F� ))��I������رc|�嗴l������>#))Im�~EƦ�S���g�̙���|��W8::R�N�^�:�5�_�~,Z���3gbll̼y�;Z(�������k���ȈN�:��?2v��
�[��J�>}�Q�����޽�U]�*���y-�V�4j��P;��!3O�ݦf܎�a%�)��:~Ԁ�L�a�ϙå���\NРHJC (����{�7'7��q]\���>k�?�|��kUy/��g�*-Z��cǎxxxLzz��Κ5��;w2`�Z�l���O?�4������o�͊+غu�E���~:���d�M�f:���g߾}�m,�"Ү];8���׹p������ψ#

���֭[\�z�?����ܹsMu�y�֬YCjj*7o��ܹs�*+2f������GyWWW���233kce����/�@aa!3g�$&&�˗/s��M������b֬Y\�~�g�}���իW����ٳ�ݘF�]e�eyzzBJJ
7o�$%%�t�&1Z��G ##��1c������HC���_������������T@;\��W��䭡e˖<��c|���s��!&M�d�Ф�"##���1M��2e
�~�)���̛7ϊщ��������-����?ת��Ç�x�`˖-�5kV���ҧO>����W��Au�۶mKHH�i��ݎ�&�~e���DPPP��^y�֮]KZZZ�cnnn�v@0�ϸkz��w�Ο���u�>3՝W۾�M�ƴi�*�?u�T�N�Z�Xjz?z���Ν;˕��j�2����ӓ����a�6l����G��3}�t�;FJJ
���f�Z�jŢE�L�����?�����k�O@@!!!����Kqss3�n׮���������¡C�jcU������_��_�BXXaaa��1”�VV����]w�>}x�嗫������9Bff&3f�0;֭[�re�:t(Ǐ'55��~����K���Ν;Y�d	999���(""""""""""w�v��F�`0`08s�#G�4[y����M�6���͐!Cx饗ؼy3EEEfm����u�V|||2dO>�$���
(ן%mD�������%'N��q�w��믿�j�*�
�ȑ#Y�r%W�\����nzz:���cذa�5�5k֔۩��ի���ی5
�/_Naaa����_�|���z���~www&O�L\\\���&K?/����޽�A����l*�ܹ3��ݻw���_�}����?�G}�ѣG��4R4k֌�����������fX"�^U;�-Z��	&жm[������4�.������lllprr��ӓ;v��`oo϶m����E������o`ggWi?>>>�\���{;;;����ٳ'ӧO7۱jɒ%t����:5��*vvv�������y�h޼9�ڵ��'�$,,�����-[Vx~XXÆ
�E�8;;3m�4�n�jv��_V�6m���dҤI8;;ccc���3S�Laǎ899Yt=w=z4�<y�ܱ�'O���hڡDDDD�!��ݛ+W���[;)C;\H�F~~�ib{QQs��5[)�ҥKDDD���Jxx8͛��'
g׮]�z��Ŝ;w�s��q��5���j�fm
0�l2]m�}�L+}޸q���8������2M.�M�s��!//���g�}FII�i��|f̘AVV��?���\�v�ܵ6D�����%�����r�Jnݺ�K/�T�]o��˗_~Iaaa���zxx����W_}���+�IDDD�h��;v��_~�u��1x�`Z�l�?��O>��c��}fϞm�HE�{{{�.]�ҥK���&hT��ai='''/^��ŋ���}���\�Ҭ�ҥKt�ر������}///���j�%;O>��<����+�m۶��F*SQ��Զm[	��=K�}[�n���/۷o'++��]����Err2s�����ʾD�����3�nFD�^2`�Z�j��ӧ-N�1���!&&��a��������ܳ�p!MB�=���0�|EZZ}��eٲe��ٓ��BBBHLL���;�����i�&������ʞ={L���ͤ�$��	�LF�S�������m*�ɵ}���lܸ�A�����˗s��E����7o^��}��	�S�Nl߾����=jJx��O���⡇��w���Օs�Ε�0�P��ܹ�+W�ЧO�}�]:v��|��NDDD�	
�y9u�p{屲�e�N�R…���Tk����5��g�2jԨrǛ5kFhh(���w?8�7O>�$���,]�///������'��r��������?mJ䈎����+G'"����AD��������FBB�i�lK,X�����DDDDDDDD�~�m�~�Z0f_Օ�����-���		���z��App0qqq���U(��������f„	$%%q��Z�Y[�n��E���:զߥK���ၭ�-���3%$=z�N�ҭ[7Z�liJ,��_LǏ;��e�x��DZ����͍�����j�����k�|�M�u놃�AAA$%%�矗k�6�X�y9�<p;I���ݻ�������Νc�…���{{{Z�h��>��ɓ��o����k�)"u����ȑ#��o�ĉIJJ�]�v�������	��\�t�K�.q��A���iժ��������;			�CDDDDDDDDDD���$'�eff���]a���t���j�*HHH`˖-̘1___�I5i���\�@�v��ԯ�������N��������	���S���~����W�J�
�ŋj��zC|^rsshӦM���e�:""""�y������4 c�����'���RTTD�N�2d3g������!�ȼy�X�n��������Q��ѤI�����%�����*�‡~HAA����GD���7c�0D���u<#"""""r�R…�uIIIfY�-�ӝ�[@���(((0������ݝcǎ��_��߲y�f����?>�Ǐ�q��u��{�1SYm��s��ORB��ٴ�6���ښ^7k֬�qc�e�.OC�_Q�%��b���{nd,�m�"""""r�i޼9������Z;����������H�)����Q�{XLL�i����;�n�"11��#GZ;iB|}}����v"��3""""""�*%\H����BFF���ť�NNNx{{���MZZ�f�Ν����&�״͚*..6�0���Y�kHII1%��={������S��y衇�p�gΜ����T���Z�nC�ߩS'~��G����ӧ���5��C�dgg���G������3��΃>H�����ɱv(""""""""""r��K��4#F� ((���[�nq��U>��Cs��5�3f��}��QXX�#�<���+`��BM�4�\���Ym����+���,\�������k׮�=�V��^����Tn޼�ٳg			�s��y��g		�̙3ܼy�����^��\݆��С�[����lnܸ�ڵk1�7������裏���Q�?c�������������Hu����<y����;h�i��O�αc�HII�����X�V�X�h��}@@!!!���jV��ͭVm�k׎��\|||pqq�СCf���}�NNNN���{f�kүQ���>}�YY�>}x����nu���9|�0�ϟg��٦�ѣG�K<h��_y����III��_4;6k֬J�k���СC9~�8���f��?�^������+]�#66�����ݙ4i��MDDD�����})..��ח�^{���P�x��ŋDEE���@vv6���<��<��SL�<''�z�4F��)�B�.))���8::���ѣG��ɡu�ָ��1w�\z��e����C�-����…<��C>����Z��d�>��#���)**�2V;;;\\\2dS�N�S�N�����0�z�-h߾=�>�,3g���ήN�V��Ύm۶�i�&>̵k�xꩧ

��/���uU�C�DFF��ӧ�q��z�b���5�����2z�h6l�ɓ'�6m�Y'O���ёg�y���("�SLL111�CDD���營�������x�
�?^��LϞ=Kxx8{�존���_~WWW`�HEDD�~�|�rΜ9cz�ʕ*��[e���Y�fq��5SYQQ�ϟ��:t��۷���\o}��h"""""""�%\H�VU2����/f���ն��퍷�w��,m���//��[��mۖ
6�[���]Qy�֭Y�t)K�.��nC�ߥKBBBj�^}^Z�n���/۷o'++��]����Err2s�����ھD��[�`cǎ�v""�<x��C�����ADD�j�?^a����Y�b&L�����p����ٻw/���w3L������e��͛7�,�o���֯_ϵk�<x0���:=z���͛���`���|��w�����o�[�����������[;��*  �Ν;m*������+F&"""""""r2k�Q�"##���a��ɦ�)S����Cdd�#���>�H�D
��@��ͱ�����n1&|�^�WWWZ�hA�V�x�'L��}���ڧ�h"""""""��p!"RK�����3u�T<�ƍiժ������q�Fbbb���H�����v"u6i�$k� "@ii��C�p��e6o�̩S�(((�{��L�6��ެ^~~>۶m�ȑ#\�z��;2r�HfϞ������q�b�W˖��޽���0RRRhٲ%O?�4.����l�����{�n
�����N�Ν1�޽��S�ҦM���M"""r����`РA���Je�%%%l۶�����K�.akkKϞ=3fL���پ};�����Ot�ؑ�{��3g��7*/�oߞ˗/s��x����u�Vn�V�>5F�(�BD�ȼy�X�n��������Q�H}�5��FD��i֬��C�WJ k��������aH���%  �+W������Y�r%�n�⥗^����W_}�.��eggCbb'�� IDAT"888�*�9s搗���7���())!((��s���K
���(w��Ã��D���+Ə_��DDD�֐c���pv��ez_\\̹s�8w�׮]3������;w.iii���.]"""���T���i޼y�}͜9�իW3{�lƍǰa��۷/���֯k����������?�����4*III��"�������Y�~=S�L�v8""""""""R��;wr��������9q��ƍ ""�To׮]\�p��]���ӧپ};]�t!==�;v�:��~����s��)f̘�ѣG�]2�=�S��ݻw���e�:"������[;�O�d�S�x����i�&N�>͉'X�t){��1�EZZ}��%&&��������2`�9x�`���7������عs'�f�⩧��w������]w]��MDDDDDD��i���WU�_�5o��&ݺu����� �������M� ����ׯ�����ߟe˖p�ȑZ�H�n�hٲ�iE�_~���sΟ?�N�(�{��fuD��k֬,`߾}�ED�����r�c�#::���X~��g&L�@RR�)� >>���\]]����G�gQ^^^8p�O>���^{
��@jj*k׮��ח�~����MDDDDDD��������4e999<���<���/�_��cǎ�����?��Ο?ϣ�>����%!!www&M�t7C���8���Z���`�ԲeK~�a���x�4���笈4F/^��瓬�,���oV��O��S={�4�vrr�����srsshӦM�c�2c�7�����R""
�!�>.dժU$$$�����-[�1c����j��T/33oo�
�IOO�Q��{��w��L�>���"v���m�x���Y�vm��1��������C	""""u���
��?n��o߾V��1y�78~��U&�V�ٳg	gϞ=������/���ʀ�z�"""���_����y뭷ptt䩧��vHU�sVD�̚5kV���J�(--5�_TTTi=[[��c�׼y�
��eu�6i\�Bhh����&�&c��T�j	///���9v�_|��~�-�7o&**����3~�x�X�*U>|8ׯ_'..ggg�cvvv�m�6�d����1��������C	Ҡbbb(..�v"RC{�������a�4	�%\���?��~�:+V�`„	����������ٻw/���w3L�r�N����eÆ
�����'�4�=gE�1�ԩ?��#�����ӧ�z]�t�~ 99����ʓ��L���$���R�]����#P���ӡC�����ˣC�f����LuD������O?�Dzz:�z��v8"r���ا6������ۛ��4>�Ν;	3%\��������C�j�_�޽9s��}���������̓#�ڧ�h"""""""����-�ԓ��3q�Dk�!"�0q�D�_���9��`�ڵk۶m�`0�{�n6m�dZ5L���Hrrr�<y��lʔ)���i��DDD*־}{�,Y�?��+GS5=gE�1:t(�֭#;;�7n�v�Z�ƍ3���� $$���n޼IJJ
k֬n��lԮ];8���׹p�B�V�7�����i*{��G��L����XGD�
nnn��ٙ��."�Pj2���1c�`0طo���<��#����;�1��� ���;nݺ�իW���1̝;�T���Ҕ)S�����'==���"


8q�o���Y?�ѧ�h"""""""��p!
f��,X���a�����._���͛9u�t�ޝiӦ��ϛ����g۶m9r��W�ұcGF���ٳM�����߽{7aaa���вeK�~�i.\hZ�����m۶��W_q��%lmm�ٳ'cƌa�رfm�:))��z۶m,Y�WWW�n�Z��Wwݕ������ݻ4h����;w6%�L�:�6m���BDD����!@aa!���;v�V�Z���2�|Z�liVg��������O?ѱcG�{�9fΜ���]���ӆ
8x� ���,\���k�y�&�IF5y~�e�uZ����F�W^!>>���^|�E�c�f�2��ȑ#dff2c��zݺu3+���d���lذ�
6���Q�۵kGnn.>>>���p��!�����IMM���ͬ�q�źL��ƧU�V��ߟ����������j2��M�!!!����KJ�s\3}�t�;FJJJ��{�Z�bѢE����F��ԩS��Oسg{��)��?l����1��������C;\H����Y�f�җ��藟������4ZIII$%%�CMRR;v�����T�!������G���s��M���Y�r%�2�+((��W_��O?����ܼy���lbbb�9s&����ڞ3g���ܸq���<>��3���L��������̤�����BΝ;ǻ�Ktt�E񇅅���o6!�>��"_~�%���N���𠰰�����F񈈈u��t�R���(,,$77���>��C��"�Ν�Ν;�x�"���\�t���.\HIII��6�����⡇b���U^_ii)W�^eݺu<���5�E��uZ���sVD��~�С���xyyѦMlmm�ݻ7��Y�\�6m���dҤI8;;ccc���3S�Laǎ899��.Z��	&жm[������`Ŋ��ɒ%t�����=z4�<y�\��'O����3�<S�>E�q��o�.D��T5F��ا�|||X�r%�=�vvv���ѳgO�O�ΪU�L�������lllprr��ӓ;v��Q�x	��_'<<OOO~��мys���puu�w���|�iw���Sc4���v��ekkk�Ki<�l!b�*U}����}C۹s'W�\�O�>���t�ؑ>���?����^z�%v��Ņ�ڵ+���{�&--�+V���Ύ;�7o�Y�?�0���t�ԉ�۷�ѣG	

`���lڴ	��@qq1qqq����g�����v���y=z� ""��J�qݕ�}��)z��]�]c٩S�?~|�b��yh���?���}��w���ѣEZZ}��eٲe��ٓ��BBBHLL���]j�7�N8����G�lڴ	�ru�ܩ�N666f+��EM�Ӓ�>�9+"MC�.]		��^۶m	4=*coo�ҥKY�t�Yyٟ�*��X����///��֭[��������ʢk׮dee���̜9s*|��H�6y��zK����c�|\c��퍷�w��:99�x�b/^\e���KF���W�W}�1��������C	Ҡ&N��ĉ����Ё��H�`L�0������_��oҭ[7���LIFG�5�ׯ���gٲe���k9r�\�E``��M???"""��_L�((( ::�.���Ʉ	�0a����8�,�?��PRV����ꈈH�P�����{z����Y�ؽ{7W�^5��� $$�.]������;v,qqq�D���mL�prr⣏>�x�P���ǜ9s*Mƨ��\���}=gED�qG���h�D���h\\\�rt"��
ưaì���TAc4���.DDDDj��Dǵkײv�Z�w�y�w�y�|U��p��E���+����N���O<a�Νz��izm�ZRRb*[�p!�V�"!!����l�Œ3�U�V�o�xYS�^wErsshӦM�c�2ci<*J20>ck�\�ի��u۶m�g\ff&@��o����^״�����o~Sa=���/��w�###��{�ޒ-�f�i�s_�Y��cooOpp0���:S�N��lܸ��DDDD�~i�&""""""rP…H-�?�ܤK'�4��[c�
5���ۯ���X���O�4�����=͚5��wN.-��ֶ�~���pww�رc|��|��l޼���(�ϟ�����-JKKM}�;^��6�ۼy�rnjeu��""rw��vu�+���Vy�����}�����~nܸ�֭[	�����+V�   �5k�Ю];F�Qi�U=?+�_�;���羞�""
k�̛7�u��0�|��ܬ�����Mc4�{�.Dj�7����.��~s��Y���ٳg������˸��2`�k�&"����$Μ9��ٳ�۷/;v�������7nnnl۶��ѩS'~��G����ӧO���t��?�@rr2�6�'''���R��������ۛ��4>�Ν;	�(᢬f͚QZZʵk�ptt�W�6��+ҡC�����ˣC�f����LuDD�q��g��<*���BFF���YӾ/^Lǎٸq#'N� --���{�1�N�ʎ;		a��ݧ���g]�,{��9+"��|}}�v""""r��DDDDDDD�m��j?~���IIIU~5E�-��ׯ�b�
&L����]�t��LJ�˗s��uk�'"����T���[�a�С�[����lnܸ�ڵk1�7�T������RRR�y�&)))�Y���Ç׸�1c�`0طo���<��#�����Ym��ڵ�\�~�.Z�뮨o��T��5���JDD7K��2� �w�}ǭ[��z�*~�!���s�֩o???z����-[,���W_�k׮�����;-}~��:-}��9+""""""""""""""�%\����Ð&&22���&O�l*�2e
999DFFZ12�_4���W^y�:���‹/�ȰaÈ��`֬Y�zt�֍��,f̘���;3f���ŋt�֍3fԸBCCy��'2dAAAfۥ'������K/U٦11dÆ
>�I�&���+��81��u'cYmPDD�z,}.Xj���t�ޝ�����<x0�G��O>�U�V,Z��N}��ذl�2�5k��ӧ���o����ޞ��z�f͚�w�^�����Y����uZ���sVDDDDDDDDDDDDDD�5J��F͘�q��F�i��faa!�6m��ۛ!C���K/�y�f�����())a�֭���0d��|�I^y�8P�?Kڼ39�.�"AAA�������?c0X�t�����˼��[<��Ӹ��3y��r�UYle�-�?�������y�pww��_$,,����
�MOOg޼y6�Q�F�f���(,�%??�ݻw3h� ���M�;w�`0�{�n���?""uU6��������C�DFF���E�6m����w�޼��{<���zmڴ!22�I�&��쌍�
���L�2�;v���T�}||X�r%�=�vvv���ѳgO�O�ΪU�L��,YB׮]���)��.kѢEL�0��m�bgg���+V���uW��ѣqpp��ɓ��=y�$���<��35�""b=�>,���HDD������`cc�������ر�l���ݯ_?���r���ƤI��u��ׯ7�[����uZ���sVDDDDDDDDDDDDDD�5-���%������7M�/**b�ܹ�����\�t���RSS	�y��D����ڵ�T����s��q��9�]����_�۬K�.��ٳ�]�777:w�Lvv6���8;;�l�2rss	�ʕ+�s���Y�r%�nݪv���Xz�*((��W_�…����lbbbHLL$""�s�̙C^^7n���>���Ĵ2���|�����Q..�ꫯ?~|-H��&���/�J]�t!$$��zm۶%00����*�%%%Y\��퍷�w��yyy���eQ���,]��,鰲��\wE}�n�___�o�NVV]�v ++���d�̙S�%""��%υ�<㜜�X�x1�/n���-[f������|�M�|�M�2K��u�NK��zΊHC���p�7�ݻ��!4J�~�)�ӟ�~w."r����������񌈈���ȽJ;\H�УGN�:��o�
@TTiii��ۗ����׿ˀHLL���s�����M�8}�4'N�0MDٳg����m�9I%))��I+�*�2jӦ
�V��ڵk�\�����z�-�]�Fpp�i��;wr��������9q�i%Ԉ��:�[K�OY�v��…t�ڕ��N�>����ҥ����ر��9?�0����ԩS̘1��G��8�S�Nлw�r}ˌuDDD�
�s��DGG�ʢ��qqq���ߊ����4}zΊHC�8q"'N�v"Ҁ�b�n�bϞ=ܸq�ڡ�H#4x�`}�iD4��7i����L:����D���L����		�K�.����`ƎK\\cǎ����������p����L�0�	&��W�6�ˠA��%::�W_}�s��1e�~��ߚ�|����L�u�@PP�iW����eL�

�_�~��ߟe˖��k�q���͛gvN``���������_~�q,�ϟn'p�ս{w�:""�V�s���[[*gooOpp0���:S�N��lܸ�V�ZY9:��M�Yi(����AD�*���)**�̙3�,"���`�k�!"""""""rOS…4	�I�F���x{{WX?==��z�…�Z����زe3f����l�GMڬNM&�Ο?������;w�=z����f�/^����>jq�5a�)+++��dq�'�x�,�;�����ڸ�GIII�c���n�R���XGDD�"d޼y�[���<vss�rT"""�=gE�!4k���!��]RZZj��^�z�����%\�H9~~~���X;)C��{�.�+��`\���$�;w���AQPP`z��养�;ǎ�/���o�e���DEE1�|Ə_�6了�1�����FQQQ���Kݙ@Q�����uE�ei,�s�7o^�
c��/"��v�h�|}}�v"""�$=gE�!�;V�[D�a1118p��a4J���>}��a�H#ekkKtt���4��W)�B�$2228t�...��wrr���ooo���8|�0;w�$,,�4���m֗�>����t���CZZ���,^��t�S�N��㏦:�j֬���\�v
GGG��]:,�?eu�҅~����dl*ONN��=�$�:���M^^:t0;?//�TGDDDDDDDD�'Nd�ĉ�CDHqq�&(V��ݝ-[�X;i�4Fi<4��7�_^�	1bAAA|��wܺu��W���b0�;w���1c0�۷���By�\]]�jҦq�����:]���7bbb0`����駟��Tg�С�[����lnܸ�ڵk1�7�Ҷ۵k���~�:.\ 44�\=K�OY����������͛7IIIa͚5>�f7��<��ddd�k�Xf�#""""""""""Ҕ��������_�EDDDDDDDDD侣.�I�>}:ǎ#%%�c�Z�bѢE�����Z.��ͭVm�k׎��\|||pqq�СCf�
C��'%%���Opp0���۴hт��`�L��[o�Ş={hӦ
���
��񤤤��/��3k֬J����d���lذ�
6���Q�������9Bff&3f�0;֭[�re��4��C�r��qRSS�Ř��
�.�CDDDDDDDD��9�|�����ƒ��ܞ�=iҤ���ԓ�������׿��|����}.''������D������^���!���6���T�9�Թ�4�i:�p!VW�_j9::���ѣG��ɡu�ָ��1w�\z��e����C�-����…<��C>����Z��d�>��#���)**��u���r��eV�ZE�.]�ҥ������[����z�j:t�@dd$���>}�7nЫW/�O�ΨQ�*mѢE4oޜ��x�_���``Ŋ<��sf�,�?e�iӆ��H��?p��1�^�J�5j�f���ɩ���XF�͆
8y�$ӦM3k��ɓ8::��3�Ը�����P\\l�0DDD�~~~8p��a��}j�޽�A�bo��Ǐ��w�gϞ%<<�={�PZZ��/����+�B�"R���|��������Ca���9s��ʕ+U�׷��?M��p"""""""M�.�Q��eNNN,^��ŋWێ��7�ݚ�� IDAT���ֳ�M///���joY�W�f�����_x�^x���.]�Re{e����g�ҥ,]���-�?�׶m[	��u��u�����}�v����ڵ+YYY$''3g��lCD�R�V���4z'N�[�n�C�^L�8��!��}N߇�)9~�x��ׯ_gŊL�0�b'˗/g�޽�����0E������!�������-[8p 7oެ���U6�iJ4�iZ�p!"MR@@�����6%|DGG��₿�����{ɂX�`����o���Z;i�P�]u�%������0y�dSٔ)S���O���d޼yV�NDDD�#)͚5��ή�r���p"""""""��.D�I���'88��_��S�p��A6n�H�V�����K�������v""Պ�������a��Y�fͬ������A��˗ټy3�N������ݻ3m�4��yS��&$�-7�߶mK�,��Օ�[�VZPXX��ۉ��租~�cǎ<��s̜9�lR���ݻwFJJ
-[��駟f�…��ۛꔍ-??�ݻw3h� ���Mu:w�``���L�:�6m����{A~~>۶m�ȑ#\�z��;2r�HfϞ�����ޝ�A���������m�6���+.]����-={�d̘1�;�,K�I��jÒ�p׮Ac8��K	"�d
8�y��n�:�ϟ�������{���-����CD�R�&M�v"�j�رJ ������C@nn.\�r�T����ʕ+�u�/��R��
#??�lb\E�EEE̝;���4S�K�.Ajj*���4o�ܬ�9s搗���7���())!((��x���K
���(w��Ã��D���+Ə_���{KAA���*.\0�eggCbb"888Ԫ���pv��ez_\\̹s�8w�׮]�����8��T7޺[נ1�������H㥄i�|}}5KD�ĉ�8q����o��+"�T\\���{�Ν;�r�
}����wߥcǎ|�|���DDD�:�G�DDD��PQQyTTiii��ۗe˖ѳgO222		!11���[%��&88�N�:�}�v"""8z�(AAAf�I߹��S��ݻw�X�e�N��d=`׮]\�p��]���;�лwo���X�b����ر�y��T:���|���lڴ	��@qq1qqq����g�S���������[w�4�i�f�f0̾�*���x��7�֭�ą�?���1����K���<>>���\]]����G�W����@�u�F˖-M��~��*�9�<p{�`Yݻw7�#"""������=
@PP�����֖����l�2�9R�8�;cDGG��?�̄	HJJ���z�'՗��[w�4�i��Å���HZ�x1'N���Ã�7VXg��|��7<��S�_���c0��,00�I�&UY����=z�/�������������D�>}�fԨQ4k֬N�׷����裏����hՉ��%!!ww�J�}DD�:�>'�t��	8@jj*���mڴ���?|||6lX��}7�Q��Q�8j{��>˕+W���_:w�lv,33�?��t��ɬNVVcƌ�7��
�ӟ*��>�3g��/HNN槟~�������]�t����H�!��]�x����e�W]yff&����OOO/WֳgO�k'''JJJ��'77�6mڔ;f,3���';;'''�`��������f�O<��1Tm,\��U�V���@BB[�laƌ���ҪU+S�ڌ��dccí[�(..��ֶ��7n��U�x�n]��p"""""""��.DDDDP`` ����o8|�0�F�2;�7�|���=���
Kxx8���8;;�{�7n�`ٲe�8q¬���7�|�
�|�
����{�nݺ���7�x��ǏߵɄe�={���p���Cii)/��2���0�*񈈈�ʞ���++W�����f�?��3'N��ĉ<��3�Z���������O�>�8q����r	������(**�ԩSf	���M�T�����͛�^��C��;���Iff&_|�k֬a�����^��ԇ��w�J�ixii�霢��J�U���lyiii���+�s ���5o^~�kcYcK����/t�ڕ}��1n�8k�#"�XM�H��.��^^^���s��1������[6o�LTT���g���@��Iwj۶-������еk�r�/]�d�WVu㭻u
É������4^J���w�^Ǝk�0D������ĉ���=�s��̙3�
6�~�z�bZ��ڵk�-�Ν[n5�VXX�ڵkY�n]����;�p��	�={6#G��cǎ\�z���x���$$$�l�2>���z�6�?^��nMl�~�:+V�`„	����������ٻw/���w%�\E�	�իWs��a�9s&#G��S�N��呐��֭[�����֖��~�����/�qS��ȑ#͎.�������믿.�p����'�콬���R�֭�СC�l��y�z�!JJJ��?�ATT'N� ((����ӱc�:���4�{Y�N����IOO�4	nOd+--�ڵk8::կHl	2228t��s�:t�@vv6yyyt���X^^����4=NNN��ݛ��%\�H��ҥ?�����<�T���P�q������x{{�����Çٹs'aaa�d����z��Ann.���L�>���G�ЫW�F{
É������4^J��U\\̤I�����H��j��)S���ϖ-[x�7�裏�r�
���L�2��c4hǎ��ѣ�1���MNN��/��u��DDDУGӱN�:������1c�N���ɓ���Α�����0y�dSٔ)S���O���d޼yV�NDD*���L\\NNNDDDн{wӱ�����������ɓ���c„	����z�#�����F����={^y����Cbb"EEEf�ʗM��O��=�}�vvv���o߾f����pss���8|�0�}�s�̩�8�"������ݻY�n!!!<�lܸ���Xz�!>��sڵkGnn.`���\�t����:�?b�v��APP���<��#���&**�O>����֭[kԦ19$33�nݺ�裏���MFFF�Iy�:"�4������`�0D����Ɏ;		�wޡO�>����f��:�.w̘1dee�t�R��yy�~��G�|g����*�<��3$%%�?��}�Yڷo�իW9|�0�1�>�l����DDDDDDD/%\H����&::��a���X���
����1c{��aܸq��۳o�>�7oβe�̶	/,,d��������{\UU����h8Xjij�)"9�MM��-/cx�j_'���_�H�8��M�`&���#I���wD$/��!K����$�?|��s�������Y{�>{��^��l��o��u���7�!::ڬ��k�X�d	��9���4jԈ:��3�X]a��_��g���#�z�2Vڰ�ҥK,Y��-[�p��9Z�nM����0a�1�+����;v��`���^F�Œ%Kذa��G:[U���f���_�,k��[�}W�\IBB���4nܘ�{�^x����ҥK�\���~___c�;3�� V�\ɨQ�hѢ��K#""|��w$&&�����˗�С�G�f�̙���[ω���=�l�Ey>>>DEE������wc���8YYY̟?�M�6���Ahh(S�N5V=p�3���}FWdo��J>|�l��{�r��UBCCi֬���lٲ�}��\o9r��8��bz�s�?>۶m�I�&<��L�2�ƍ�v�Z���9r��`��&N�H�ƍ�ܹ�EyK�,aƌt����|�赭�-eo]W��=�{�E���Y~��߳i�&rss��ok�m����배0֭[�…Y�p!��Rcǎe۶m���e��I�&L�6��c��������Gzz:}��a������h�?//�Y�Iq�޽{��GQZZ�����'"57f��l�B~~>�ƍ3�ֶm[�4G����-��o�8�N��<x0[�n%;;���~��*˿��oy���9�
'""""""�p�7�RgL`���㍈Ԏx���p֮]���iҤ	׮]c�Сf��JJJ�4i��΅��$%%���ǢE����-b���F��W�r��A<ȏ?�Hdd�Ym۶%::����/,Z��������<��s?~�H+**"55��{����d�ؿ?p�SRe{�1�,Yb�q�uY/�q�L&N�h,�~��֮]˵k׈����>����j���������n,E/""�����������Fڑ#G���9�<����ׯҘBCCILL4���曤��ן���b�
���*?�r��U5�S��N���iӦ
��?�!  �>x��X��}˖-dff�ٓ'OR\\���?����_ll,�v���HMM����hG�8���oߞW_}�궄�.]�d<�ε�WM>U}~����dm�A�V�Z���̢E�ؽ{7W�\�{�a�ر��׿6�M�6
WWW6m���˗	

b����7��Ql���$%%���[�r��Y�7oN`` �&M�{�q��3f���wߥ������w�…ٹs'�G�6˿s�N<==y���kt."�<���s�z�!g�#"7���H-Z� 99����m۶q��9Z�jů�kƏ��Ϫ��������ի��q�۷/cƌ1�9�N��qss���fݺu|�������OOO�~�Z����>��DDDDDDD.
��:�g����6l��C����-�,"���g�֭Ɗ�Z���7˳b�
:����̙3�С�N�">>��{��a�c��u����;��իW���`����Z���ѣG�駟�f��|�I�31/_���ǏӦM^{�5:w�̡C��={6ǎcٲeL�<��g�ЦM�J���9��VY�Ջ���kR&w�us���;�`�ҥ$%%�u�V�3��sh��MLiYYY�`("b���N�>���?���:�;w��̚5�xF��<������o���4�_��W�dff�����?��Ç�5kgΜaŊL�<٩�(��>Tőg�-U�	@׮])((�СC6\���233��� ��-*������{V�^����.+W�d�֭��l�xb���ۓ��d�R�kk/{�ږ�>?�܋j�3���_i��M�Kll�Yz��	[�ӕ}{yy1}�t�O�^i�{��0�,�y��DDD�t�R


���


���a�ĉ��%"�׹sg������ր�5������T:I���m�A�1hР*�ko;�Z���6l���v�<��Ԇi�4�B�TDD)))�CD����"�*[+����L�-x���Ni�f�����,��M���������	o�ܹ<�����b�f��HII��ㄅ�1t�P�j3nwwwf͚�s�=�믿NJJ
nnn��n�
@\\ݺu�{��̜9���-[�8�ѯ����L舺�[�S111�m���}����ŋ��G��wZ���YӔGDD�f�:00�Y�fY������Ӭ���:������bcc�Y��u�F\\S�La�֭=[��U5�S��N:w���ΡC�8p _�5gϞ�cǎ�~������w��ĉ�k׮�Uy��i߾=�Ǐg�ʕ�;w��~��5\\\,���^��y'**ʬ}T�0��|����8r/�=$R�ƌ�ƍIII1:N������GTT�����puu�gϞdgg3e�g�#""�Hm8��I.DDDD�����f�����9[ֱcnj�/�����
���dgg��{�1n�8"""hҤ���u�Ɛ!CX�f
~�!cǎ��SPP\��Wރ>��3g���o��3g�p��i�C�5�}�u��J}ԋ5�ԃI���^^^�/�1�>Z�ha��)�:�����̬u\7uZ?u���w�I``��>�<O�������B��5�燯��Ŷ��`��=z����ӕ�m���|F�T63{�kQ�:��k׮�/+Vdffj�ohh(�&33�v����W_���{��x���
�י��/gΜ�?��O���T\�:��^5��U��q�^T{H��5mڔ�s��?��Q�F�a���HD����F;LDDnjÉ������4L��@DDD�F�o�>�U����L��������'�0g��w�Ε+W��_�“O>�ڵk+=���s���׿�ա��:e�:�m۶�,�����'O�7o�@XX��1ʟ�i�p[ۭ��z���z0iԨ����lצ4WW˦�)��~""R���
kߥ�<O�1u$7=�l1m���,W�0=S�=��&Ϩ�i��}ur�}����ʑ#G�v�YYY��p}@Fii)��׿pqq�s��U��U���C��_Xl��]h��_�]۪�R&5������^T{H�~<��CL�<��`��L�bu���x�N�ʂ�������DDDDDDD�p!��,��N�;��#�=J�N�ޯ�;v�~�z���x�"-Z�� <<ܢ�IuT��&�l/S111>��<uGmZ�z5�����Cm����-~~~�:u���t��������ŠA�4h�b���|�$$$0d���5oޜ�^z������-����s��Irrr�ի�����c�i2x�`222X�laaa������L�>��}�2l�0V�X���'Æ
3�uqq�����OOO��L�U/5�{�jՊ��".\�@�V�̶]�p��#""���灀����s�z��i�8p�"��ϓ��BFF�������l�������˗ן���暭��~ڵk�P,u񌪎��)�W'͚5���������p��A�������͎եK|||���!''����n�5kV�تNzz:˗/�O�>6WҨj`Jy�\[{�R&����Ƒ{Q�!��ADD����
'""""""Ұh��:��/Y�c���O���ӧOgǎ�?���R���{v��/���/�\���gM,Z���g�:��ڲ�~-Z�K/�Č3x�w�1""�z��G����ȑ#���Ϝ;w���~��� &M�d�}�g

b͚5s�ұcG�|b[���O�~�ػw��6�*������RZZJnn.o��}��5�2p�@���y��HMM�o��gϞ��İg��N�Jqq1�?�<���ƾ-[�`���\�|��Ǐ3��z�Ӭ���6�ȑz��i��S�,���jc���ȭ����7� //���R<h|W������s�{��<��Sm<�JKK)**bŊ�?�˗/��O�@�7o�<#���Xi���3�:�S[��>�`�ҥ\�v����\\\		��&))�l?[�o[x��ʕ+W?~<���=z���JJJ8q�iii�5ʬ��8rm�mK��[���Ƚ�����������������(�…ܲ�cń�۷����c���xzzM�����;�p����,^��M�6ѨQ#^}��Z��>W�(..歷޺��@�|�2�g�f�С�l����̚5���4�6m��E�F1v�X�m�Fnn.QQQfۚ4i´iӌ�cƌ!>>����[t��w����X���Gqq�Y��1cزe����7�l[۶m-��̙��˗ٱc			$$$X����]w�e�ƺu�X�p!. $$�bߺ���-[r��y������#==ݢ\G�}��a������Y\���<��:Ɋ��"##���O9y�$cǎ�4�#�[ω��8~��'����ϼG}�ٳg[�����"�.]�0bĈ*�.�.�Q��H��bO���>��c���\�Z��l*�j��=�]��^z	wwwV�Z���ˍN*
 66���9rm�mK��[���Ƚ�����������������(�…8]PPAAA��A���!##///�-[FTT���������ÓO>ɲe����!##���\g�\-?�0۶mc�֭��Mi�& IDATڒ��9{�,�>���6r�HΞ=Krr�#���o߾Z����IRR�����憗�aaa,[��l����p�̙�}�݇��t�Ё�c���+��U���/S�L�HoѢ���>___����e�ȑ,[�///���7&!!���z������puu��LJ��P�̙C`` ��_���/�l�7m�4����7���X�Z�2c�ڴi����͕��{8�f͚�s�N�m;w����Ә!ZDD�ִiS�,Y A����pww�cǎƀt#�#�[�	�ϟOBB}����n��Օ�-[ү_?���H�ƍ�ƛ��@hh(����2z�h/^l���Q��H��bO�t���x���js`App0���1RՀ{�2nnn̘1����
F�v�hܸ1������F||<k֬�W�^Uϑkko[��޺�G�E��DDDDDDDDDDDDD�F�RVVV�� ��	@JJ����[�駱��ϐ!C`ݺu�<��3�9s�u����͛IKK�ȑ#\�r�֭[��ɓi֬��r��{��9�}�]�o���˗�߿?3gΤ_�~y�*�� ����,]��M�6���Һuk~��m��W^!==�����!�/_Nbb"O?�4����kv~YYY̟?�M�6���Ahh(S�N�u��f�*�i�~.]�Ē%Kزe�Ν�u����ߟ	&���i�3�r�J��ͥq��<��c����j�|�֭��g���nc͚5�5�u������$$$���������Ù4i.\��7�dǎ4jԈ~��C��͍r�N�.]⩧����w�5��ɓ'����ƍiѢ��k��T�~���_�


����޽��Cq�ŋ�t�R֯_O�6m��u3x�`&N�Htt��#����)))DDDX}/Ґ��緰����~6l�P�ֈ��mnu����̺�u/6�Pjj*����~mZ��kχ���}#rKMMe���������_�����"
��3""""""7'����Կ�m�ė_~Inn.ݺu3����RPP@�^���c�ҥf��r�J.^�h̤X�K�.1n�8


��O?����"oM�,))aҤI:t�H+,,$))���<-Z����g8`��%44���D���o���7�$==�+W����ANN+V�ph��~���{��Ǐ��sjj*{��%))�l��ĉ�p�Q�ڵk�v�qqqf�ڶmKtt4��_X�h1116�p���z�-�A;���hӦ
iii�5�r�
7n�������u���(..�:�jHH{�����?gȐ!6�KD�VѦM�Cݭl̘1lܸ���㹗�����QQQN�ND��ү_?������e��xzzr��)�|�M|�A'G(rkp�^T{H�c����_���a����4(W�^e����CDDDDDDD����Dl1uN߸q�YzFFC�࣏> 66���,v�����Ν;�.��?������>��v��͒%K�׿�e�מ2���o�>�+8t���?����ٳ�իWӣG���k6���~���_����W���ٳ�233ILLd���$%%���ϙ3gX�bE�qV�|�r�?N�6mHJJb���,]��;Ʋe�,��뮻X�nYYY�7��[�Z=��ѣi߾=k֬!//��:z����裏صk�&M`�������v�Z����0a;v�0�s�:eeeйsg��Mi�<"""M�6e�ܹlذ���B
ٰas�ΥI�&�OD���O������gϞ6�}��ѲeK��/"u��{Q�!qTYY����"��~�6m"))��a�����8�{[��O�,���������E+\H�

�+=;;6m�Č3hԨ���lڴ	___cՇ;vPVV��Ç��O�׿�ŗ_~	\_��^۶m`�̙t�����@^~�e��?��I��6m >>ڷo�ܹs<x0<�����{巪�6�~yk��Э[7���2e
[�ne��ɕ�<�@���8cő�ݻ3s�L��y�l�bq���ڶm\_�8))��/Z=���;�f�����_'%%777�|��}ll,��{/,^���~���3gr�]w0j�(�,Yb���]��G��+���6�#""b��C1y�d,X��)StrT""7���|�	'N�����;޽{�����C�%T�^T{H�Y�En�W�vv7���L>��Cc�#��$&&�����0D��gDDDDDDn.p!
���;�<�����ܹ�����k�..\���	���}�ӦM�����pd��ӧO�	L|�A��5)3??�A�Y�~��1㵯��1ˣi�5F�����������|�e*�{��f�9s��>:t0^{yyp��5�et�֍!C��f�>��CƎk��Ѻ�ԩ��Y�fVckڴ��~�\����ТE�|�4S��"""���pv""74WW����j��2�I������x#ܿ�0���0l�0'G""u�t���BCCy��W)**��;�tv8"�{��!--Mm$�B����\H���G~��������>���?���������������[o���Ç	�G�C�t����Y�l�amu���YՀ��4<���y�f~�����g���F��*�o����Ze���lE�F���...v���پ};��_y��,�;Z��7��^�;r�L�f혦4{�_DDDDDDDD�KII���Xjj*�����ҳgO\]]ٽ{7������8IDD)))�CDP{FDDDDD�f�Ҡ���LVVyyy�ر�Gy�l%���l���hٲ%Ǐ7����Z4QQ@@Ǐ��'!!!Fz^^�Eޚ����ǩS�HOO��ϯҘ�BFF�����ۗ{��"��_�����������Z���@�v�*-�"N�<INN�z�2�srr��
͛7祗^"&&���x��u����ujժEEE\�p�V�Z�m�p႑GDDDDDDDDDD��x{{ӹsg���5�BDDDDDDDDD�����"uhȐ!���ό;����j5��ݻ)))�ȑ#̚5�H�x�]�<�����������R���+�͛gs���4�j���ol{��G����ȑ#���Ϝ;w���~��� &M�d��޽;O=����DGG����7�|Cii)EEE�X�����s��e�x�	z��a�y���ˣ�������h�gEaaaF����RZZJnn.o��}���������O�~�ػw��<5��Uq�:u��	�S�NYǔf�#""""""""""R[������DDDDDDDDDD��i�i�틯�/gϞ%  ��={�m###�9s�0g����9b�b�-QQQl޼��G�2a�#}���-�e˖�?���p���HOOg�رl۶���\����kҤ	ӦM3K���㧟~�/� !!�����}�QfϞm��|||;v�YZ�.]1b���Z��3�-[����ϸq�̶�m��"��bccٷo���f�u����u�ӧ۷o'//���@���Rjs@��Կ��4�����H�HKK�Q�F�CDnQiii�A�i�}��9��իW�����>|�S���K�޽IMM���g�#"b8z�h�LHV�S��*��	iC�V{S�F��E.������+�fɒ%����1����K����s�N~��g�^���8q�K�,aժUvu����`ɒ%���;l޼���Gy���8>��j�9c��}�]���())��ӓ��$�����u�VΞ=K���	dҤI�s�=q͟?�;v���r��E���y�<x0����y^			��/�������Om��kqVԢE���y���ٶm�Ν�U�V��׿f���xyyUYǎ�eʔ)��4K���]G���Y�p!;w�d���f�ٹs'���<���5�ID���ի�����H=Z�~=�ׯwv"""�f���,Z��U�VQVVƈ#�ر��kED��˗��ɱ��JD�Y^|�E�o�^�]뫜��v�������HãrC�0a�٪�hт��x���T�E��_�5oޜ��Xbcc+�ko�`��y����>}:ӧO�zk���W�
[���Y�pa�y��i�~������!&&������=נ�#F���տ��I��:5oޜ���.]JAAmڴ������&N�H�f�*=��4\)))���8;�[FYY��C�U�/_f���:???��Ù5kiii4m����ȍ�cǎ|��k��١���o��r*���٫�9B�F��I.DDj��1cظq#)))ƀ���������rrt"R���dff:;�*M�:���Pg�!RcZUJD�իW;;���ء.99��g����i#G�䣏>"99�ɓ';1:�ѹ��X��,"RQCl#�%�EDDDDDD&Wg "r3hڴ)s��eÆ
RXXȆ
�;w.M�4qvx"R{��!--��a��T*--���|g�!R+�������Эe�…����l����b�y�
D�޽y���_�BII	�.]�Ga��\�v��x�����3�yW�\��?�������;�$((��+Wr�ҥz8S�.]�ğ��'�z�)�����oKBB?��Y��� c����+���O?��+�J����3g�}�]���͛73i�$��Œ�^�`���y����={6���c������;w��2�j[���(""""""�pi��Z��C1y�d,X��)StrT"R"""HIIqv""6���8;�Z���BDD����[Tjj*����C���gRRR�ڵ+&L����I�&q��!#_aa!III���h�"Z�h��#HJJ�/�`��F�;vЯ_?>��3���			�(?$$��{���3dȐ�<U�~���{�9�?n�����޽{IJJ�Y�f�Vޛo�Izz:W�\!##���V�X���W��S���{��K����r�J.^�ȫ��j�-..��;w�Q�_��/�����<==��aO�����j7�������4\Z�B�&�o�>-���O�O�#G�tv8""""""""bEBB)))�oߞw�y��D�b�
:���Ojj*{��a�����у�{��a�"##i֬˖-3;�i�E߾}����s��1��LyDDDD�a���?~�6mڐ����ݻY�t)���;v̢�S���������Lٽ{7III���s��V�XQ��T壏> 66���,v����`�(��ѣ���{F�mڴ����?��f��-A�F��L.DDDDDDDDDD�d���t�>�"55///�}�]���7m�@||<;v��͍���3w�\222�f�С|����ڵ�K�.q��7on�zz��Q��.���n�<""""�ő6�֭[��+8t�֍F�ѽ{wfΜ	��-[j5���XBBBhԨݺu#..�,���c����K�t��'�|��o�͛o�	\_�����8~�a�⶷m	j7�������4d��@DDDD��G�ҩS'��V�^Mvv6���>�>C�7�=w����������ŋ�hтx���pBCCk�lSG��\�О2jGu�}�'���㏹��;Ͷ���n�߸q#w�q�Y����y�n��v>���q8��+S�g��'���?�����o����???z��Mdd$����m��w�
+奦��H|����~��ƶ��|
du�cǎ����X�j��Ʉ���k�.~��gz���_��?�-ZX˔f�#"""�t���,���̙3�Z^pp��=zp���Z-�*�}�ӦM��������,�*�5�Weq;ҶT�QDDDDDD��Ҁ1��/�}�v�����ϢE�X�jeee�1��;�Y�z���O̙3�͛7������ر�;v����+����Q�eߪ�t�Ž;8t�ŀ���L<<<())!++�l�W_}eǚ�V߶�)--e޼y���[쓟�O~~>���?x�7�۷o}�{CP��V�^�g0ODD�֭�ʕ+,^����c���u啟���LJ!C����J^^;w�0�]\\pu�\lڔf�#"""R[��F��ڵk6����m����b3
L�X���RMʩ�[o���Ç	�G�C�t������m6S�����f��-�ni�4�B�Tjj�1c���X"""���8��ۭ�_�|�ٳg3t�P���g֬Y���Ѵi�SDD�N�zΛ7�͛7���Itt4����;��…dgg�x�b6m�D�F�x��Wk��2��v�j��߿��6Ӏ���H�����̴pq��!���ֵv[�,X����t7nLTT�?�8\�v�Ç�b�
v��A\\�֭�u���c��3�6�X3}�tZ�nMbb��b������ԩS�����ʌ5�5kְj�*v�څ��+}��1��jՊ��".\�@�V���p႑GD�����BBB�裏�ٳ�������?'O�$''�^�z�999fm"���������Wi�Gnn��j����]�v�ZNUL+�%%%ѲeK�?nl/--5��W_�~���6�p�m�v�������HåRg�N������TS۶m���
�:3��h���9{�,�>���6r�H>��#����<y���{999ddd���ERRw�}����LJ'�|���`�}�Y222:t(ݺus^�7	S'h�	���b���O�f���ϪU�ػw/%%%f��Tpq#���Y�v-�������f�	���ؼy3k׮e�ĉN��aQVl���$##�cǎ��{���;��裏�l�2��∉���{����NJ+���	

b����qn��v�y�֬YCYYݻw��n3�w�ԉ��"N�:e�A�ԩSF����…deei���8$,,�e˖�k��F�.]8t�o��`�zW˖-9�<�ׯgȐ!2�|�c�L���[��i޼y���k�w�}<x���xX���k���<��c?~�lℋ/���c���x��W�ԩ���̛7��{��i[��(""""""�pi��ԙ^�z�͂""""���#11���L._�L�=z43g����t�R6m�ķ�~K�֭��o~Ctt��)���b��\�t��+W������k���;	

b�ʕ�5�-Z��i��������?��F�m6آ<���HLL����1��t���,�ϟϦM���� 44��S���*����K�.�d��l�¹s�hݺ5���g„	��右r�J��ͥq��<��c���5��ߞ:���:1
�8|���{����ի���ҬY3���ٲe���#$$�k׮q����X�׊���m���l۶�&M���O0e�7nl�q�:T�kO<k׮�����#GZ�(o�ĉ4nܘΝ;[gɒ%̘1��;zj3��﫺���k����{^mX����3g���c���8p��ݻ3v�X�m�Fnn.QQQf�4i҄iӦYk��Ѥ������������#00�l[^^��}DD���Ņ��v��e��JDĖ1cưe����7n�ٶ�mۚ�����n�:.\�…����3
���Ϗ��tc���cǎ5�ߥKF�Q��T%,,����̙Ü9s,�9rĬ�.]�X�ݩS'"##m��H�R�F���������H����DGG����ŋ�z�*G�1:��WRR¤I���8s�W�^������$^x��]�ViY�}����V��Bqq1��y���������yx����Wi���P���o���7�$==�+W�p��E2227n/^�����x��裏��o(--������T���)..��g�ĉ�ݻ�+W�p��֮]KBB�C�VT�:�����ۛ6m�p��%���eee�;��/����i�9y�$������������ƒ��Aqq1�ϟ'55���~��^��P��g|��}�����V?�			\�t�xP����s^��ԑ{^m�[Ӿ}��^y�[�n��w�����ӓ��$"""������
///c�gk��. IDAT�
7o��x]�8p ͚5c�Ν��ܹOOO�q��OD�2���dgg;;i�*k#�hт��d����/nnn���2r�H�-[�����wڴi:ooo<<<		a���ǜ1cmڴ��͍���m			������/�G�f���f�k������K0��M����A׮]y�7�0a�V�2�?s�L���>>>�1�%K��
ȯȑ��ڍ"""""""
�V��Z���Jjj����:��D����N�>���?���:�;w��̚5��gϚ�]�b���g�̙t�ЁS�N�޽{ٰa��9���Cc�ْMLiYYY2��NWDDĪ�|~�����Uӯ~�+���`���D~�a>̬Y�8s�+V�`���6ˮh���?~�6m���k�ѹsg:��ٳ9v�˖-c���f��u�]̝;�;�K�����֭[���3�W~����[����N�v�JAA�"  �pѧO\\\���$&&�C���nQQU����߳z�j���x��wY�r%[�n5�_��P[��\Y��۷'))���T۱�g�5���ϩ#��ڰR���|�̙v����>}:ӧO�븦yw�u�۷7�ּys"""X�t)�i����rrr�8q"͚5��鈈X&..�ӧOmR{x{{c��cKӦM���%66�,�b;k��0�fY�U+�[���hт��x��L�.*�?o�<�˲�m�v�������HåRk�N�Ze'
�q�m���!�4(�:"VL�wf��غu+qqqt��
���@f͚�ԩS��nڴ	���x�������Ν����Ȩ�9~��Q�z��L�LyDDD�S}>M�e��W�딲�2��ˋ��5f��֭qqqL�2��[�:Թ��yw�ޝ�3g��ϳe���������H���^Y����)�W'�;w���?�СC8������g�ұcGn��vZ�j�}����Ç9q��ڵ�r�EU^~�e�����Y�r%�Ν3�W�:T�i��m�ڥۡQQQf3��e�5��W�9u�WV�Zqq1�/_��+�F���o̘1lܸ����cJJ
~~~DEE�[�"r��ٳ'nnn�޽�aÆ9;q�ڍ"""""""
�\H��ի�z�rv"""��S�N����Z����`РAV�u�رJ�:�<p}֯�Li�<"""��Z�rSg�|���RXXHaaa��

�����ѣ�O���l[et���,�TgΜ�اC��k///���U6`�⵨i��}uҵkW�+233

5�744�Ç���I�v�ꫯ�w�=��c������:ס:|}}9s����,fϷW��1�2��|Ϋ��:rϫ
+u�_�~��;���O[�״iS�Ν���cPƆ
HLL�I�&����<==�֭YYYp!"rR�QDDDDDD�aҀ�j�����.W�������f>�6�vy?��C��M�tuu��fJ�V���H}����>Haa!�7o����|�7o6�WTquSGrk���6�¤Q�F���zn״N��:��puu�ȑ#\�v���,��������dff2r�H������B�Ν�:��ʯ�ʮCYY�Q��US���Cq�����&L�`��V��"{ϥ6b�����ϩ=��ڰR�|}}�p�AAA������f3�C=��ɓY�`S�L�:PHD��BBB8qℳ��jR�QDDDDDD��р�T@@����9p�={�4�8`���ϏS�N��������e�jՊ��".\�@�V�̶]�p��#""R*�X���!C����Arr2}��5[���믿f���<�b{nn�Y�����Ю];�b���ɓ��䘭6���P�󫎚�)�W'͚5���������p��A�������͎եK|||���!''����n�5kV�ت��upqq�����OOO��@���IOOg��������U
����k�sn�#��ڰR�222�ADDDE#"rݟ��g��""
�3&+�Q��(""""""Ұ���""""R��q�x�
���(--�����y}�Q���8r�?��3�Ν���&((�I�&yM�����i�:u�ԩS�6��򈈈ԧ�|v�ޝ��z���b���IMM�o�������"V�X����|�2O<�=z�a޼yF����'>>��VZvEaaa��Ǔ��Kii)����y��۷�ʫ�ԩ-��	\L�t�R�]�FHH���...������?���d��-�Է-�\��-[�~�z._����Ǚ?�]�<�:�+W�0~�x9z�(%%%���p��	���5j��1�;v{�iu8rϫ
+""�"
��]Z�BDDD�ɧ�~�ɓ';vl�yǎ˶m����%**�l[�&M�6m��e˖�?���p���HOO�O�>l߾���<��������)""R^}>���~��/�����,�y��G�={��|||,��ҥ#F�����ƌÖ-[���gܸqf�ڶmk�VW�S[�S��̞={�ӧ��ㅆ�����w�^c���S߶8r���X�n.d�…�����K/����;�V�b����J*��M콦���=�6��������������ԔV�����%ћ6mʒ%K4h��v���t�ؑW_}#���'IIIDDD��燛�^^^����l�2��}g̘A�6mpss����>q�f�عs�E;w����ӘmXDD�>����t���瓐�@߾}���puu�e˖��׏�����?Ҹqc��&$$���;����=�ŋ��i���Z�hArr2Ç���777|}}9r$˖-��˫F�j/G��{��k׮�kWWW�����qw�e���\�S߶8r�M��СC���Ã���sl����ƌ3HIIaذa�k׎ƍ��ꊯ�/aaa��dzf�z����M콦���=�6��������������ԔKYYY���i("##HII���FPXX��O?���?6l���.^���K��~�zڴi@AA�f�ĉDGG�ZY"�RRR�����^�!���o]=�+((��h6d����3���{�:m���T"##1�ڴ�{�֞"rk����m�~����̐D�
�gDDDDDDn.�Ug���_�~ˀ����ԩS���<��Zޘ1cظq#)))��������GTTT��%""b��~��s9zϫ
{�X�z��Cip�N�������������MM.DDDD�i��ڶo�>�|�I֬Y���?���-[2a„Z-�iӦ̝;�?���5
�
6���H�&Mj�,{��PD���{^mX�	
��A���жm[>��N�8AII	w�q�{�&::__�Z/�b���,X��)S�X�刈����Cq����j�����D�����9;��‰'���x�ᇝ��ԡ��DRSS���T����������E.DDDD�о}���خ��DDDQgeX�2EDDlq���Qu�&�Q�Nn>�qM�{���R���]G��Xjj*������?��/���={�8;�c���8;A��������ӻwo���Oqq��C��i���������������M�O�>\�zU������������Ԑ����=z�N�:Yݶz�j���f�����ܤ�n��N����ׯ����P��*;��\"""""""R]p!"""R���TRSS�����-#22���Hg�!""R+^|�E�o�n�����Y�h�V�����#FбcGz���HE�fӻwo�s��ȭLm.�	
���ԩS<x����R�^���H�X�z��C�U۷o��~��efϞ�СC��� <<�Y�f���FӦM�3L�	��?���a��XU�+[TFm.�)Wg """"""""""R���

rvvINN��ٳ<��F�ȑ#9{�,���N�LDn���q��Ig�""Nv#��j��\"""""""RSZ�BDDD�������:;�*�����0Djl����AD���2g� ����p�ʕ$$$���K�ƍy��x��f7...f�ҥl����{X�U��� �$��P0ʹ0�<�M<�NRY���Z��++���Z"�19�
P!Me��<�"�D�l')5-�����vsؠ��uy�^Ͻ�u?�֭����.\�@�f�x��g�6m��������7߰t�R�bz��_͂xꩧ���o-�OHH ++��7ңG���M1-Z��`0�q�F&L����c�����O���׭����`�e͚5̙3777V�^
�^�_����@:u�DHH�����̜9��˗3x�`S���'gϞ��Ϗ������<��ŋ����޽{�z�*�
2��f��DDDDDDD�2h�����H)���	�v""ŪS���S�TZ@$"���㭝�T��ӧ���	��k�ؼy3������ˌ3HMM5�'==��� RRRX�r%666̛7���D>���w�N�-�����ggg�ϟo���f�|�
999�����X�޽���gǎ�1�
�-L��EDJ@VV�iaBYj�������������;v��ߚ\\�t��g�booO߾}�ͣ�Z-++�)S�p���{���k�\�bq.�\"""""""Rl�������������Huy�زe���L�2�ݻw��������J�N�����DDDеkW���پ};���,Y��+W��h�"


x�w�r�
�/������f���f����X:t�`����#"""RڶmKll,K�.�V�����c�q��u������g׮]���˵k�HII�'�0-�(Ji��g�}ƙ3ghժ�֭�СC�Y����_�R�%"""""""�A.DDDDDDDDDD�V2fJk�;w.�[��^�z��L._�l:���nnn���Ҷm[/^@tt�)�G�x{{s���N����1v�X�x��>q�pcB�ڴic#"""R^��|||���7�.kMd�¸�����\�|�aÆq��58�w���K̽�ZmϞ=̟?�G};;;�w����X�K5��������T���N@DDDD*�����jM'N��}��E��� ..wwwF�]������2��ݻw�}�v���{���y�G4hÆ
��ѱ�R��[��['�����ZBD*W�v�L_;99PPP`jKKK��ӳ��<y��Y�8|�0ǎ�m۶�����J��ҥKE�3�6c����Hu0.@0*kM��SO���w�;vP�^=fΜ�?��O���[�z�)RRR������%�QZ���/�йsg��u����\��DDDDDDD�2h������ܶ��z��{�91311��+W�i�&
3fnnnt���
�����WNN�����f����$''ĢE�0`�u�%�ѵ�j	)ɭ?�ʲ�����u�:u,���gvvvyR,��_�M��mE�&"""R��n���^9;;ӥK����t�{��gϞ4nܘnݺq�rrrHMM�k׮4nܸ��V�5��u-�>���ʠ""""�TM�8�w��"ۯ^��…9r$...xyy�`�"##iРAu�)""w��}}}9x� ��μ��+��ӇF�q��9�l����y���?��c�=V�YW����L���"b
...�>}���(�Ϟ���o��ɓt�ؑ��TV�\ɛo�Y�{�6mJFF���4m���Xff�)FDDD�Z�Syxx���ĺu�r�
}���o߾�������lx�y�jՊS�Nq��z��mjOII��U�%"""""""���Q""""Rn��4YQ�+88����3v�XS۸q�8�<���V�LDD�v`���4i҄���J�&M�����ՕW_}�3fp��uV�Ze�t�Z�%D��}}}���~�:/^��?�`00c�S�w�}Gxx8]�v%((��ݻ�a����;S���iii�����p��i���m�k(OM�?�	6o�`ZpѧO6l�P);H>��3���q������Y�l�E�j.�Zp!"""RKݺȣ���իW���E�^��߿?/��"[�n5{_Y�rrr��O���W�^:�U�V���k�GQ9eee�q�Fz�聳��)�E�6n�HVVV���;Ut<���`„	f���ƌ�+������Y{VV}��=����<������]dnG�aРA��(ŵC��^�s����;���SO����رc���6뿸�T���,�|�I�NAA�ٱ��4Æ
3;����%K�۷/�
bѢE����.�5��k�<y2mڴ!99z����O?�g�}F���y�7�?�/^���K�.�nݺ�����gT�ƍ�;�:���â��ll�ׯ_�_���Ν;DŽ	�駟�����"e����.ݻw�ڵk�o���w�x��￟��y�2�VڷoOFF/��2���L�4�Gy�"V5��������T-��C�\����������GNNǎ��#,,��q���̘1�u��q��Y���HOO'((�ٳg[L���7�|CNN�ٶ�F�{�&''�;vT�
���ܱcǀ�N�(�=���ԩS�b����:u*6l�ܹs��瓑�Axx8ӦM#''��<deeY,층�<c�K��4i_~�%���;����<y�E����GGGƌ�/��·�~kvl߾}���߬����'**�k׮q��e����2e
�/_6Ŕ�UK�HE$$$���p[�hذ!AAAx{{��₭�-NNN0����S����9w�s�����WWW�Ν����`Μ9�l�[[[�ⲧ�~���o����iذ!����1jԨ8p�ک���T�F*kMd���X.`0�va�1�v��۳f�F�I�ƍ���g����ZĪ��ʠ""""w�-[���'�p��!���Ǽy�شiS��BCCIMM�S�N���s��a"""�ڵ+���l߾��u7��.66�:X�jl3ƈ��T���s/^�e˖�:����9u�-[�$((�C��v�Z\]]9y�$!!!�i۶-���,]�������֭��_�cǎlٲ�}����/?F����qpp��&る['�8p���@:DPP����={���PSLy�Q���T��~����ěo�ITT�f׮]�X���z��l�2x�����sϑ����eˀ��m���Ç��o������IJJ�̙3���9s���$|||ppp��k��[����޽�\�H�J��bYj"#///�vq��O�:uj����V��{�7o111<x��˗���`��KDDDDDDD*�\����T��`0�SZ{u0�b(,,���~��7F�IBB���Ų������燛�����mۖŋ]b>'N�nl�6mژň��T���s������t�ݻw���K�Ν����K�.̟?�]�vY����{{�R��3�'����u��888���KBB_|�E���8�5b�ȑ���<x���,�=�=��C������͛G�޽����s�Φ���Yy�Q�����&M�D�-�v`
���+f&"w�޽{g�4DD��j.�]Zp!"""r��={6���#..����/�3��� �]�V����4<==��>��'O��ϥK�ptt�8fl3ƈ������%-j,�8���@zzz��*,,$;;۬�D�.]���w��
��g�Z�Ǹ8�����~ڷo_l����LJz������~�:�z��nݺf����f��v�
�/��bj+�5���;]�
X�x1۷o'==���t�o���ŋ�_�����;L�^�HII��oED�t��DDDDDDD�vi�����H�&/n��a�*|��W,Z��.]�p��5V�ZŐ!Cؼys��
K쯴_�שS˒��f��,e�:w�`ڹ�(��=d���\�~��~K�)���-�z� IDAT�j/��[]ch�&M1b��������~���g{��=����5���;��?�̙3Y�b+V�`֬Y;��Twww�_�N||��S�v��DDDDDDD�v�-=DDDDDj'''<==���$55��;w�n�:1bD��\\\8}�4QQQ����;��M����Aff&M�65;���i�)My1�e�{��g���&,,�!C�ФI�s�z�j
y�簵���Օ�~����$z��i�OJJ�ИiT���y���Ϝ<y��;V�ϲ�0a��9�6m�����ЧO����d��Gx�Mm�F�"r�������i������'..�A�Y;�j��KDDDDDDD*J;\�����!�
��`���?'''��~777����7p�@|}}���~�:/^��?�`00c�S����iii�����p��i�\�m���R�q�W�^t�ޝ.0y�dv��AVVyyy|���̞=���8����ȑ#M�0`~~~$''���Orr2˗/�����3�<�X�����]��|��`�^0�5F��}��ǰa��믹|�2�=���{�Eܲe�HII!??���D���x��+t��%DDDD*���{�;������������%�p!"""r��4i~~~������ov�����7y�d���Crr2>>>fq����7�0�nܸ1�.]�������ӧ{��%%%�b{����&����������?���
�����?�ŹȻ�kZ�`<��]�HKKcʔ)f�[��h+��/��"111$''��ϛž��K����+b�ĉDFFŏ�M�4a���fm;vd̘1�F�""""���ߟ���[;
�ZE;\����T���������-�G���{{{ڵk��ɓY�dI��6lHPP��޸��`kk��� $$���s�̡e˖��ڒ���x��������u���4lؐ��W���QY�9��@`�������<��888p�=��?��U�V��ZLHstt$88�ѣG��쌭�-��Ό7������*�{y�ަM����������ѡC��}�b�+j���{���u�����	�o߾ԭ[ggg&N���ի�����5���\�ڵ�e˖�NCDDDDDDDDD�V�""""�TQ<<==���,��e�srr��7���7�,1�����{�ooo֮]˙3gL��?s�IIIL�>�Rs)�팇���c„	L�0��}6jԈ�s�2w��r�VR;�}�puu��ϯĘ�����ct��Qx�ڶm[dL�F���_�Z��z��%D�V�Ǐg�֭�NCD��q7-)���p��򬝆��zFDDDDD�N�""""Re&M�ė_~IXX�iRjXX...���X9;)MNNW�^���ʵ0�2���Q�FY;�b�>)��={j��H
�zFDDDDD�Τ""""U�`0T�y��$ꚠA�,^���_�4As���R�~}+g'"""��߿��k777�Z�������k� """R��k���k�NCDDDDDDD䎦""""R��qfΜɊ+�5kݻw�rV"""R���dffb0���ֶ�sP-!"u�Աv
"RM
����H�1~�x��í����B�������ȝE.DDDD�Pmى��y{{���m�4DDD�����K���zG���>\?D�`���lݺ��i���:vvv���Y;
A�������ȝJ.DDDDDDDDDD��5j�F��v"RE���4A�effҨQ#k�!"�@5�H͡zFDDDDD��dc�DDDDDDDDDDDDD�zL�6�q��Y;
�ZA;\��������������|����Ǔ�����7���j��U�ĉ�o߾�cG�a۶m$%%q��
qqq�W�^�?WW�*�;""���8���=z�m�%"����/����=�MD�FI�ľ}�غu+)))\�|GGG{�1����۷o��m0HHH��sW&�T"""""""��\�����"<<���<k�!""r�?~<[�n�v"r�����v
RC,X��#G��^���%�W���z��{�ZL���gٲeDEEY�'--���4�m������ׯ_��
����ʕ+ٴi����3777�v�Z��D����ӇK�.q��q}�Qk�#"w��j�?���E��s�N���~��}���o�>̒%K����Ծk�T"""""""��\������gϞZl!"5ިQ�hݺ�����F��v
"r���!1JNN��O?���'??��ʶw��"�W�XATT�����LJ��ӪU+


8~�8����۷___�l�B�f�*��W��p�BF����^^^,X����H4hP�D��u������BD�Dq�IJe�عs'
6dڴi4��͛���I\\�W�&&&;;;�.]Zi}״���DDDDDDDj-�)�k���k��f�4DDD��NADDj1��TΤ:�B
��@�:uLOY.��:���l޼{{{����өS'��ݻw�{�����ܹ�͛73}��J�?88����3v�XS۸q�ذa���̜9����S�n]�b�ԩ�NGD�Ae�H���Dtt4NNNѦMӱ&M�0d����;v,��ь9�Ν;[-ߪ��JDDDDDD�vт��?���pk�!"R���0�������m�S���S�����)H���b͚5�ڵ��/ҬY3
��/�LÆ
Mq�I�=z�nLP,�����5kְc���ӱ���]�v6��Ç�吓��ڵk����…4k֌g�}�iӦ�o����$7o�Laa!�ƍ�Xlq��ӧS�^=:t�Pi}gee�q�Fz�聳��)�E�6n�Ȅ	ptt,6/�9�����/������U�l۶
��'�-��Y�&M���!00�/��´��x���X��������ޞ�}���k��v�*�����.ܸq#$''S�^=�z�)fϞmڍ���Q5�������H�""""����#,,��i��k����NA�R
>\�D�j���ٺu��Ӑ*����ԩS9uꔩ-##���p���	

���B�^�r%�ׯ7�����رc;v�+W�0~�xrss�1c�������t���HIIa�ʕ���ۏq���O?]b>m۶e�ҥfm��7�|CNN�{��8ֻwo���ٱc#F�(17����Y�b���4j���鈈UWs��Q���_b>}��%00���D�c�>QQQ\�v���h���

��ɩ��\��p���dff��޼y3���e����DDDDDDDj-�)ŨQ�5j����kh�k���ӂ�;���9u�-[���wߥC�����p�BN�<IHH3g��rq�[�l�O>�`0���Gtt4���lڴ�4�.44���T:u����i׮�O���Ϗ��x�o����Ë�'==�اB��v������5����XM�%z��Eǎ9{��\��媫��p�...%�s���p��y�c 00�=zp��q,X�ٳg	

e�̙�}��ԅF<��/�y��]���� v��mZpQ���JDDDDDD��)�"""""""""""5��`0�SR��ݻ�s�����ѥK�ϟ��]�*���	�aaaDDD��o�1r�Hؾ}�).&&???��ܰ���m۶,^������)((�N�:�n��[���}��	��d�[�cD��kѢǎ+r¯��~婑�������nݒ�	YXXh�ߛ͛7�޽{cggG�ΝM��u^YU�.�;w.�[��^�z���/_6/�}TM%""""""R�h�1s��	ڷo_䱈����pwwg���ՙ�����Pey�hM�o�>�n�JJJ
�/_��ё�{///���{�翵���{��M�ҙ3g�ҥ�Y{�n�8{�l��={�l�,YB\\qqq|��L�2ooo�ׯo�KKK��ӳ��<y��~���9{�,?��3m۶-W����K�ptt�8fl3ƈ��H�Q�uLzz:���nݺ�8c����lq�����u׮]��_J컸>�S�k�����ŰP����JDDDDDD��т1y뭷ػwo�Y�r%�6m����1c����f������Hm���h�"v��i��o��o�>�����Y�d	���꣤��:�n��ɭ�gY�t�D������ݝ={��m�6�=ʪU�

e֬Y�1(�I�7���.��?�ٳg���oy��͎w/�n�o�66�gۊ�yCDDD�_yj��c�u�Fzz:;w���_,6�w5�⇛ݺ;���+�>����B;;;��E�<e����DDDDDDDj-���{��~��U.\�ȑ#qqq��ˋI�
�3M�
[�l;w�aÆL�6�A�Ѽys233���c������`gg�ҥK+�GQ5Uu-�P�&R<WWW~��'����ٳ��=))	��=SQNNNxzz���Ijj*;w�dݺu�&ع��p��i���*ԟ��QQQ�_��>}��裏WԄ���iӦddd���IӦM͎eff�bDDD����:fĈDGGL�~�x衇,b~��G֯_����-�'''�-*MLL�,W.UU��>���}*�Q""""w9��`���;Ipp0�ϟg�ر��q��q��y���������H�%%%���!!!�����ꊭ�-M�4aȐ!���ФI���INN�v�妺M�x��Ϗ��d���INNf�����ׯ��6l���?����~�a����!8___~���_��ŋ���1̘1�k|�qZZ����c�ȑ\�v��^z���@N�8Ann.�����?�!22�	&���2�n߾=�O���~c�1FDDDj��c�t��s�=GNNӦM#<<�s�Α��OFF������K\�z�g�y����-[FJJ
���$&&�����O?]b߷������Q5�������H�.DDDDj���֬YÎ;HOO��Ύv��1l�0�����v�Zbbb�p�͚5��g�eڴi����-�y����,6n�H�=pvv6Ŵh����ƍ�0a����p�"""�cVll,������`ooO߾}y��h֬�E�5k�3gnnn�^�(�XY��eee�f�v���ŋi֬�
��_�aÆf�x��9V�ZEll,��ٴiӆ�'2d����^CYk����Q�k7޿�7@rr2���㩧�b���f;5���r��^�J�v�8q"������Ķm��8q"mڴ)2�&M����C`` _|��;w6˧�Ͼ���毫�^�n)٤I�صkiiiL�2��X�֭-��{n???����7;ֽ{w�ד'OfϞ=$''���cW�~}�x�
��ƍs��%���pqq!**
�?���ԭ[�M�6�~�z�S�oժU+�͛Wi}��Ӈ�{����bvM)))��-Z��:��ח?���o�����,�8p .,2�&M�0y�d���;2f̘R����+�.,�}TM%""""""R�h��Zj�ʕ��� --���<rrr8v��aaa����\f̘��u�8{�,yyy�����ٳ)(((��o�����z��mq�w�����cǎJ�>��x�������ڵk\�|���h�L���˗-b���2MH��Xy;�egg3u�T6l�`�4���p�M�FNN�齗.]bҤI|��������s��I-Zd6i�<�P���q�Q�k7�>}:���\�v���L6o�l6)�ʕ+L�6���h._�L^^?��i��͎=
@���K̳o߾$&&Z+�g_�Bu�ȍEM7/l����#����=ggglmmqvvfܸq������T�~���X�h�<�������Ӯ];&O�̒%KLq
6$((ooo\\\�����ɉb�4�9s�вeKlmm���5����2g����5j>� ������ggg�����9={�����~�iؿ���߿��
2x��
�C�:%�H�Y�������O@@�����{���Ɔƍӿ����W�^��зo_�֭���3'Nd���f(��UE]X���JDDDDDD���""""�Ԗ-[��O0������?�6mb���������J�N��?>�ڵ���������>|x�O^����C�9�bcc1bD�^���HI8@`` =z����,X���g��̙3�b۶mKPP�iBFY����o����:u��-[���ҡCRSSY�p!'O�$$$�t�u���믿ұcG�{�=�5k�_��������:th����5DY�ʣ<�n��x�b�7o�ڵk	

b������/�����+�:t�رc,X����ϛ��…�������`�~(��/����{��M�t�5b�ܹ̝;���⾇�k�����ӳ��:99��o��o���၇�G�����x��K����{�f�ڵ�9s��-[p������>}:��GD���',,����s�Z;���c���_�B��4jԈ��������uayj²�G�T"""""""��v����`�����`��KXX���o�9����o�n�������777lmmi۶-�/ ::��~N�8ܘ�w�6mژň��X˼y��ݻ7vvvt���4}����>>>fO���Xy;�c|}}�ܹ3vvvt��Ŵ#î]�L����3�[���___��/*t
e�!�W�v��s�Һuk�իgZ�q�nE��{��,X���\Ƨ�֭[�3H
�{��|�%��{��MD�ڤI�hѢ��NGaaa������c��D�����x��W9t萵S�k���]�Å���H-5{�l�,YB\\qqq|��L�2ooo�ׯo�KKK(��Z'O�,��K�.7�Y����#""R�Z�x�$����^w���_~���Ɖ�F+o��3g�ХK��nݺp��YS�������Qy���5DY�ʣ<�nԮ];��NNN��N�>mv��ݻ[���ٙ��t���iݺu�y:;;[+�g_�����D��5hЀŋ��3a��o�N```������z�����Z;���j*��E.DDDD*��I�Ɖ��m/^<<<pwwgϞ=l۶��G��j�*BCC�5k#F��~2�Ͳ��K<^�Nll,7G3�cDDD�����Ћ�n�m*6V�NŹy�QY���\CYk���U���������uI���{PTl�n�HOOg�Ν���Şk�Ν��[�糯�۹��D�:<���̜9�+V0k֬"��H�ѧO<h�4DD�*��DDDDDDDj-��Ŝ�������ӓ��Tv��ɺu�0M�tqq����DEE���R�>�6mJFF���4m���Xff�)FDD���eAcrr��N���<����"c�������O?�DRR={�4�'%%��1j޼9?��3'O��cǎ�v
e�!�WV��jժ����9z�(O<��ѣ�#F� ::���`����C=d��?�~�z�nq�v>��UŽP�&"����oook�!"��W�^l޼��ׯckkk�tDD,T烎��j*�ڡr�'""""�nذa>��srrrx��qss̟~<p�@|}}���~�:/^��?�`00c�S���iii�����p��i��m�kY�l)))��瓘����O?�t��-�XY�
0???������'99��˗Я_?Sl�>}X�b\�v�>����/�P�k(k
Qָ�(ϵ���X�|��39v��7�ҥ�=�999L�6���pΝ;G~~>�����K/q��U�y��v�jq��|�E�T�q/T����HE������MJJ��S�q�Å���H-5i�$�����������[�O�<�={��������Y\���y�7L�7n̥K������Ņ��(����޽{III�������L�LM�4a���fm;vd̘1���<cee�7i�$v��EZZS�L1;ֺuk��_|������y����b_z�
]CYk������nf|iy���Ə��_�O?�d���ח?���o�����,b�…��B IDAT�|Y>��j�[UŽP�&"""ѩS'6lH\\]�t�v:""""""""""5�v��			վ�����-�G���{{{ڵk��ɓY�d�)�aÆ��퍋����8991`�BBB̞r<g�Z�l���-������5;88��~����OÆ
MO��������Kݺuqvvf�ĉ�^�{{�R�[���2�stt$88�ѣG��쌭�-��Ό7������L�M�6%88����C�����2�B�P���q�Q�k/�
�f�<==���{�[�.nnn,]���3�����ߟ�����ǽ�ދ��
�7�����R�^�"�+�g_TMU�Bu����T���-O<�qqq�NEDDDDDDDDD�ƩSXXXh�$DDDDj����V����իY�v-[�n�e˖�9s��Ç3}�t�M�f�E�nu��!,,oo�"_��d����qG��Z�X�Iť��3t�P\]]پ}�m���|���n_xx8�Ǐ�Ϧ����Q�0|�p�7"w���p�nݪ��V��W_akk�����S���ב��w��_���gDDDDDD�Lu��������|�&M��/�$,,��s�7~���₏������Y������a޼yxxxаaCN�>��@�nݬ�a�R�&w��[��u�Vk�!"rGz��g����TP^^�G��v""""""""w,-��B�'!W��~�r�
X�x1���:&L`���R�~�j�EDDD�fC����?����c�7��_�Rf֡�M�Tz"��������0�n!"""""""RŴ�BDDDD����g�̙�X��Y�fѽ{w+g%"""w��s�Һuk���+����K����իӦM�����)V;�mr'�S�E��NAD����NCDn�zFDDDDD�΢""""U��w��j���x{{[;
��kﴱ�N`ccS-5Jm��U�ɝ&22�Q�FY9�*��s)�Ç�I��P=#"""""rg҂����´�H���㭝��H����MXX���Tψ�����ܩl��������������������������HM�""""""""""""""""""""""""��k�DDDDj���H�n�4DDD�������Y;
�KEFFZ;�!Ο?χ~H||<yyyx{{�ꫯ�^N�8A���-�Ϟ=Khh(qqqddd`gg���ϓO>�رcqrr��>"""�����ݝѣGW����y�~��w>��ck�""���` !!����y��T���������5i�����H)�����j�u�V�n�j�4DD�.�`��9bz�믿��^��z�-���k1���䥗^�ʕ+����\N�8��'���b�ڵ8;;WZ�����\��M�6QXXȘ1cpss�k׮�8�Ѣ����BDj� """""""bmZp!"""R���0��¬�����]�����)���������~��?N~~~��m�޽E���G\�r��={��Ӷm[���9~�8}�?��+W�d�ҥ���իWY�p!#G����///,X@dd$
4(w_"R3����t�R.\��}��g�tD��+��%Q
""""""""5�\����� 00�X;
�R���k�����i��6�*%"5EDD��S�
0��O�L)u���޾��b\�l�2�^�֭K�n������˫����;v��mܸqlذ���`fΜY��������bcc>|����JR�5RuR
""""""""5�����>Ldd���)Qdd$iii�NC�RDFFj���ϡ;[VV}��=����<������mg��УG����

X�z5^^^��Ջ�����/�u�V�rrr��O���W�^:�U�V���[d����u�&M���_-�ݺukصkW������ƍ�ѣ��Φ�-Z`0ظq#YYY��H�ԤI:t�C�����T���4z�聗�W�LJ
F�=���عs'3f�`���:jŊ����ǭu�ŋY�t)�ӟ�ݻ7,(��ADDDDDDD���""""��&,,��i���N�:�NA�R������m�4D�.��㭝�T���l�N�ʩS�Lm���OPP:�ʕ+Y�~��u^^ǎ�رc\�r��Tnn.3f� 55����NPP)))�\�����4m�4�-[��/��/�@߾}�ԩvvvE��n��|�
999�����X�޽���gǎ�1�ļE��pww'..��i�Hkݺ5������d:w�l:���̙3g�ٳ'�Z���O?e�ڵf����`�ƍ\�|��K���Ϭ�,�L�™3gLm_�5W�\��U
""""""""5�v��;���9u�-[�$((�C��v�Z\]]9y�$!!!�؄������k߲e�|�	�b߾}̛7�M�6��Jjj*�:u"<<�ÇA׮]���g���%���/��燓��֭㥗^��'��W^!""�l׊��366�:X�Sc�1FD��z�"!!���|k�""U̸X��/�4k���`�ȑlذ�y��������������g�}ƙ3ghժ�֭�СC�Y����_��ADDDDDDD���Ri9p���V�NADDDDDD�e0�Ԟ����ݻ�5=��K�.̟?�W_}�]�v1s��
����@vv6aaa�:u�0r�H�$E������puu�m۶,^���Ç����K�����?��Ç9r����|��wDDD�駟r�}�UJ�'N���8֦M��3���s��5~��:u�d�tD��Z#���ѤIbbb�3gvvv������3���`߾}r��q���+�����w�7v+�={�0�|}�Q�w�����믛Ū��B.��>|���HF�e�TDD�\dd��S�;��\�'���:��*���7~Q?z��*�ODDD,�����3�p��e�����믱���vZ5҉'h߾�m�C��H�v����"��u��
��g�V�ܳg�fɒ%���ǧ�~ʔ)S�~������4<==�<�ɓ'��o��С�'O&77���֬YÇ~�|P)}^�t	GGG�c�6c���:t�K�hԨ��S�*V�n]�
Fpp0���gРA<x���L^~�elmm���_y�78~���9
���/��`Z�jd��n�DDDDDDDDj
-��J���MXX����r���?��i��X����\��M�6QXXȘ1cpss�k׮�NMDD䮲g�._���˗ٳgVΪ�y뭷ػw�m-HU�#b�~�Vd�yAA�m���ၻ�;{��a۶m=z�U�VʬY�1bP���Ҟݯ_?�^�Jtt4���f����4ik֬1-���>�ԩ�����1c�1FD�666Zl!R˕�Fz�X�n���?4h�����ؘ��p��qZ�jœO>I�v�x��G˽��X��Z�ԭk9mA5�����������:!""""V���P�;OT��W��p�BF�������xyy�`��^�j��DDD�*۶m��`����L��ڻw�m�_��H����
@RR�Y�񵋋�m����	OOO֮]���4i�/_&  �c�#**�����Ǘ�G�ؼys��O�>
�OL��>�6m
@ff��1c�1FDDDjWWW��݉��%%%�}����O�-�4.�

b���:�����e�U�V9rĬ=%%�"V5�����������B�L`` �v""�*""��)H
U���ީ���9�<cǎ5��7�
6�̙3�������###���ƍ��os����9w�͛7�vzw�?"�À		��Ϗw�}��;������ˁ�GT԰a�8s����cȐ!<��������ٙ�HHH���̝;��~������P>��3�W�n<�������4Z�n
��r���������^�u�����r��>��#S?���;���8�Fd0�L$��9\M�	��R��h��(JNW�㔚?Q�2ĮQ���G51��4牌����fidj)Π���9�r��pP?��9O��{��G�"�Z�A��f͚���r�ԩ5xԬY��m'"""�׭[7���K����޽�ٸ}����/p��I�z�-c�իW)[�l��y���7o����[ԫW�cǎ��;��UDDDDDDDD�
��B��߲j�*z��a�TDD�۪U�l��<�.]��G}Ď;�y�&�ڵc�ĉ9�ܸw�QQQlڴ�������@�j��ܹ�ɒ����CDD�7o��ё�-[2b�ʗ/�g~[�laժU=z�[�nQ�|yڴiðaø{�./��2eʔ!>>�d��ӧOӵkW���X�v-iii���Ѹqc��*V����qqq���ww��7���H��
�QQQ�;___��iiiDEE�u�V.]�D���i׮�����䜿�����cϞ=\�v
���G@@�I܍7X�`�7o���|����K8GGGc���{K�֭[ǽ{�x饗pqq��_$..�u��1h� ��h�m.^�h�T��͛T�V�~���2�~KnP��>'$$�_|Aɒ%�ٳ'C��ʕ+̜9��;w���@�֭?~<�J���m
犋�#22���$���x�5j...Ƙ�Z���<<BBBغu+�O�&44�d���w�2k�NDD&�6lh|߿�o�NRR���&q��Ό=��L�2\�|��]�������i۶-}��e�ҥ�X��+V�ȥJ�*�1⁝�E��ر���d����f����*"""b{�Z��B�
\�p�ʕ+ӤI��mڴaÆ
L�2�)S����ѣ����{���`�l�±c�<x���cǎ�Aꃈ������Hq�R��������u""�-66�>}��:
yH����ٳg�e_}�ׯ_�w߹s�d�����t>��Ç�~�z���̙3Y�~=�n�bÆ
<x�e˖���a��1,0)KMM%..��W���[oѫW/�����o�С�1n�Ν�n������7n��㚿�?���gӦMt��-ߺ���XÚ{`dd$iiiƇ�]��k���ɓ'�1�����Ʋ�~���quu���˄��p��Ec�'�2e
w�ޥS�Nܹs��C����b�;�<���$''3w�\� FK���233��/�9���8p vvv9�1{�\�~��r��c�ѣG��ֻ�K||���~����V�2�ۭ[����/)Q�o��&`]�2�+W���z�j�ݻGXXX��Y���/y�:����…�����۹t��ʕ��gРA���d��]�R�dIV�\i��T�\�V�Zb�sss#::�O?��m۶q��J�*EÆ
:t(իW7Ǝ;��>����T�ܹc,9r$M�6��>�~�ҥK�,Y��yz��m�o=�sv�ؑ>��]�vѯ_?�z�ڵ777ڷo_��—���%J��K�.DEEѵk��/�7���v���ݻw�Q��������DEE�b�
�\8::Ŝ9sزeׯ_��#,,�����$V}).4�BDDD��-]���g�R�re�O����/�6;Xv���̙������lذ���V�X�c���ݻ�={6�7�ȑ#L�4�s�αl�2�
f�˗/`„	t��	;;;>̐!Cصk}��!..�E��pa�IlϞ=ԪU+�ye{����""�Ys�Z�*���ƕ�,Y�ɓ'�����ߦV�Z���0y�dN�8��E���X�x1/^�v��L�>������f�������-[FJJ
u��e�ĉT�V�S�N���Y�n�q�K������;Ν;���/5j����___~��Giܸq�v��6111�9s�J�*1}�tjժ��Ç�4i.\��k������˩R�
K�,a���DDD�����ի�X�"�/&**��簶m
�T��ԩSyꩧX�`���l۶���0ͮ�ai{��#�p)]�4�Ǐg�����`bn偁��{\ƌØ1c��С���_Y5k֌f͚�{�q�R�JĂ8{�,^^^�={��2d��"""�p<x�ɪY�����~�I�M�J�b„	L�0!�X�ADDDDDDD��(������d���g�ʫ|���L�8�:u����@Æ
�����|�c��QLL+W��?��{��$&&�nݺ�&L����իg��y۶m��c�Ν|��wԮ]��7��2s�L��ᯇ��w�Ώ?��޽{��V�8t�qfT�cǎ=Ԙ����I���ȃd�=088�8� kLXX���������Wqغu�1v���_�{z{{���j|h͚5Ƹ͛7���/���T�Z��S��a�c���{k��φ �;w`�ڵf�ђ�iذ!�&M2��5&L�@�5ptt$((�۷o3q�D�T����}��0�Nֵ����������8P��իy�gi{��#"����*V�h��qLL����03)L|���&�숈%�ADDDDDDD�8�
""�PJMM�bŊ�NC�"gΜ�^�z&�
4�w�Q�F1m�4HHH��?&44��� ���s�g����g�5���/2z�h�9�c[ff��}pp0+V�`�…����w�^�޽K���)Y�n��˗��f<��Pf��T���g���hx���ٳԯ_ߤ�p�>w��f͚y�|��i�\g:?q��{K���Ҍ�D�{�=�{��߶m׮]���ͤ<{ۜ:uʤ-�-�G�6�:+i�jՌ�]\\r�gMۚ;�������3?K�[�y���0u�TF�i�n�:fϞm�wSy4���O4jԈo���&M��:y�""""""""ŁV����ݻ4h�j����'''*W�L�����/m�^�������������	OOO��������}���8t�P���",,���<==�(C��}?��jժe��D����h�ʫ�0h!���8H!/:t`�ƍL�2����s��-�͛G@@�W��������%J���{��w9r��+W&88�7�|��+W�+[�,ݺu�$''�k�.Z�je�1�{5w>Cك�����de�=0�
y1�{�������H��{K��|g!�}�6_}�U����&{}�j���y����d�<�~��\��ڶ��^CK�[�y\4jԈaÆ1k�,f͚�����<)�|}})[�,���u*"�SDDDDDDDDlM+\�ds������ƍsl;s�gΜa����|�r�̘r�ܹCjj*7nd�ƍ��dzjժ|��em�#G��k�o��ڵk�0;�<��)�X�r�ʜ<y��cyrr�E�{xxH`` )))lٲ�ŋI�n�Lb���Lf?p����r=~BB��є)S��'O�gddb�۷/�}�+V�`�޽�(Q�-Zc˕+Gjj*W�\�\�r&�r�1FDD��W�0� �@�J�*��/�p��A�6mj,?x� �� 䧞z�_��'NP�v�\����ɩS�X�~�E��-��[�n�:fϞm�0ػw/#F�`ݺut��=ϼ*W��O?�ġC�Lf567���Ύ��L�_�n\9��j��ڶ�����?"�8	

"((��i�H����iӦ$$$0r�H[�#"�1�ADDDDDDDĖ�$�H���͛7g�ƍT�T�Y�f��?p��
n߾�ѣGy��qwwgÆ
���a�:���9^���?��?��R�J���[��H�^�:�7o�u��۷o��7�P�J�"��<�wD�a��/��OFF?����N��v��???>��3nܸA�5�Lgj6x�wHNN&##�@ǎ�=׾}��s�G�eҤI��W��?��t�ܙ�����W���'�x¸�f͚�:u*��
e���~�mڴ��W'%%���ARR3f�LWs24�5k���ܺu�w�}???^y�c\۶m��ѣܽ{�K�.������СC�����-�;~�8G��o�͛77[��͛S�JRRR8~�x�mӾ}{f̘al�Ç(�� IDAT�&+���?���7or��I"""�<~AXӶ�2�@q��ic���E�y�����{�n[�!"""""""""b3p!�ŀ8y�$�=�?�����:�k����GGGj֬ɤI�ػw/O<�;v�`����N��P�dI*V��СC�;w.QQQ6�����k�عs���۷o��qf"����`j֬Ijj*��Y�f�����3��oHH�nݚ�͛`v��e�ҿ�5kƠA�HMM�v�����+�s2�2e
�����?�=z�$�_�~ƁPY@��=�jn�CY�}DDD���
BBB���ٳ���ҬY3BCC9w���ބ��c@�r�HJJ��_�e˖�\��A���IIIӴiS:v��ҥKqvvf���&���V�{��W��������W_��Fn��郏������}�����#�Ч��hժ={�4���XӶ�2�ڵ+�:u,�.���ȣ���߸�������������H.ĦN�:������	OOO���CJJ��x;;�|_�%&&ңG�|�I�V�&L�ڵk&q�v�b�ƍ<������PHݺu��t~��'9�=z������ptt��ˋ����:sh�ܿ��;ڵk���eʔ!00���������:��ի����O<A�F��6m����}��-/�^?Ku�� �q�t��)5jD�R����~)))��ݛ
*���HÆ
Y�~��9��$k����Y��R|��f���pQT��e����/hny]O��$&&���hv���#QQQt�ޝ2e����H�����k׮L�2�g�yGGG㽬��L�6-G|dd$-[��dɒT�P�~��1�|s=Ǹq��С�q�a�:u�1c�`Ŋ&�J�2�oݺ�ɶ�;���ʮ]�r�g׮]���g�y�
r4pwwg�…��ٓ
*`ooO�
�ݻ7�-����[�\9.\H�pww���Z�j1s�L�>��������鉽�=�iӆE���x`�>����t6n܈�����?���/����;7n$===�8����'��dɒ�����[o����ѣ�޽;�K����&O��o�[˚���رc������޸���E�y�5i�{{{l������������md�< AAA�AAA�~�n�Ν��@����s�_~�cs�Y_...&�-ʴ��7۠A��k׮c�	dN�<٢�޺u+s׮]��o�6)��/2]\\̞�T�R��7oε^			����9�stt�ܻw��>����twwϵ-|||2SSSXn������˗3�L���k���W�^�U�M�6�����.s�ҥ��_.ֶ��׳ �߰�֭[�����5j�0�U�V�tvvμ~�z��/��y���7�z��v=3333cbbLΓ��<:����5�lԨQ��k�Ν��5��ڵ����q���_�3g�egΜ������O�$G��
���g���~��Ey��9w�\f�F�2;u�d�T��-���x0w�K/����~�����3f����L���?���K��/�gDDDDDD
%��˗/ӽ{w���=z4Æ
�駟��,X��8S�#G���4���X3f�`�ĉ|������!C�p��]��o����			���r�fΜi��s�����j���D˖-M�RSSy��W�y�&�;w�wޡF�?~���0֮]KϞ=III�bŊ9��K/��믿N�
���x��駟�>}�Ɋ�G�&--�A�1~�x�T�BFF�~�-Ç'%%�iӦ1o޼�[V�~����������Ǐs��a���IKK+p����O��������S�zu~��ƍ�?���|s5�KA����im|VNNN�k׎/����ǏS�F
�#G�p��I����<;��Ê�&�on殧��ύ7�y�qu��}���		��/�$&&�����l���$88�����׺uknܸ��	�Сnnn�:u��3gРAgX<��#R�V�\i�DD[}�������i��#F��K�.�NCDDDDDDD�V��	���?��.\`�ĉDFFR�zu���i֬�|�	#G��ʕ+|��Gy'!!�)S�0n�8������ϟ��۷�ի�1>>>888ЪU+�/_�ҥK��N��V�Z�ל9s�v�m۶%>>�:u����H�:u����m۶���̝;��[�&>>�-Z����s�=g|�u�޽&����x��w�^�:���ЦM��׮]��r��A]��n޼Irr2S�La̘1�5�l�I��[�.xyy�~�|�	/^�]�v���S�vmiР_}�u���7os��}�����g�cp��a�9E�=���f�z���nݚ�;������/�:u2����ԩSY�n�ϟ��[���S����\�Y����0�nA�v�hҤ	=z� 11�2e�0x�`gX<��#"""���_���_�NCDDDDDDDDD�&�…؄������y���ٴiӧO7s��z��MFF;vdƌ&ۿ���
�c_??�3�߼y777�*���͛?~<%J��g*Q�o��۶mc�ƍf�5|��eM�4��ի&�+W���0|�pZ�nM�ʕ�S�N���onY��3�N���_=�y�{�e����x�7r�S�dI&N�H```�y�˥ �c�6>;�CS_|���/���d�9E�=���f�z��T�P�+W����GXX�����6jԈaÆ1k�,��
6,�TEDD�?~<���lܸ����;w���SOѼysH�
l�b����H��ٳ��S�"������={6����NCD�QFDDDDD�Ѣb)))xzz�w���\�
<�_~���ի�|��}�8q����[������'iii�.]ڢ}r����xv�rCn�U�^=GY�R��w�I�ĉ0`���c߾}�_�?���t�ԉ�_~GG��[V�e�����O?M�&M0`/��B������eM����hܸ��}�7o�o��r)H�X{=��ϮJ�*ԩS�]�v������;W�\aϞ=ԨQ��w1{�E�=���f�z�<,�6l�*>((�d�)��P���Y�%tO���J�p����ߘ�#,66�>}��:
��NPP111�NCDPFDDDDD�QU"����Y�s����OY�r%���]��2e�䈹v�`������=jQ<@FF��紴4�\l���p��u�۝��->w������7�-��_eѢEt�֍ڵks����[V�{�233s�n޼���lj���s����k����ϐ�����}�x�<��-��������xs�s�qU��������<W�����[�~s3w=EDDDDDDDDDDDDDDDDDDD��b����O��^w��ͱ�#G9r$vvv,[��ڵk�y����j�
����ڢ���r��l,3<�}�������&�ݯW^y������:u���hBCC�য়~bԨQ���\��R���1l�.�c姠�c�,H|v��_~����pQ��sk��DDDDDDDDDDDDDDDDDDDD��b��$���k�~�n���W_�ƍL�6����\c�U�@rr�E�~��W��㏍���e͚5\�z;;��ܿ��}���[����ۛ�`��;���ؾ}{��V��W�
R��u������>�����~�ǒ�y?�-[���Ã�7�����_M�R�x�����V�sK��DDDDDDD��r��ƍ�s�=���?s��ͳ�0;v�䳟�~~~y�cILQ�^��V�\ɘ1c3f+W�,¬DDD�q�W�Ė�V�HDDDDDD�xӀ��_|�w�y�����W�\���]���ǎKRR]�veҤIy��m۶,X� Ƕ��d������1�5i҄��ۓ��J�^��q�F��>s��f͢D��;�XޱcG�}�]�ݻg�Ͻ{��5k�?�|��[���;;;~�����s�=��
z�
SA��+���{�i�Off�qk�}����ƛS�dIڷo��牍��…�k�''�<�+��yn����8�&����X�����K/���K�QӧO����K/��W�>}l�cP��I�&�m�6�_�Ν;w�x�b���믿���Á�;w.�ƍc�ر̙3��q�"""�e�J}"��[I[' ��aÆ��G�g�^|�E��éW����#..�E�Q�dI��Í��[���>��z��d����~���'���c�…T�X��#G���NBB#F����&�DEEѸqc6n�Hݺuy���y饗�&==��~���7��{�q��E�L�B���M�9g��m�F׮]	�z��8q��'�}�v\]]�׿�u�mػwo"""�ѣ~�!���899q��Q� Ã�:��\��V��
4���H6m�D�=x��^�:ǏgҤI�۷�@��}������&  �իW3e����<7nnn���O�.]�w�����"7y�1�.]��:
�|5m���)�<��QDD����$�q5jd�X#��mǎ�rܢ�[n޼��ɓ�޽;����IvV�Z���KQ�)"Z�d	����:�ٲo�>���������M.�&�������{��lٲ���a�����g�5~~뭷��������
+ԨQ�y��1p�@f̘��3L�7o΄	L�|||�j?~<ׇ����2e
ӦM3)�駉���G��]���kךlwrr"&&�*U�䚿�����k�r��:t�c�������%��\��V������b�
:v���իY�z��>��ф��boooU.ik����y饗�����ɓ�e.��{��F��}�vz��a,���,��������������x��2�������GG�<��r.�…���Ʋ޽{�|�r.\Ȱa�l����f���|��wp!"�O$""""""�pЀ����<�̙3ټy3������ҤIƍG���M���'��J�5�1c����ƍT�Z�>}�0n�8���r�S�n]>̒%K����СC\�x{{{���i۶-Ç�����sv�ԉ��3f�e�~��w�|�Iڷoτ	�U���0��Ã}��1s�L֮]��?�Lzz:>>>t�ܙ7�x�'�|��r�����ԯE�<x���~�͛7��S�fM�M�F@@������Z����c�,�7��ӓ
��S�N���-�_Q}�s�p�B����k�.n߾MŊ�Mn��={6����NCD$_111�:
��ֳgO[� "�oRy�����֭[�t��˗�]�v<�d��
�ƍ
�ȭ�޽{DEE�i�&Ο?���ժU�s��9VM�q�,0��������K/1p�@����A$����∌�$))	'''^x�F�e�9��ꐖ�F\\�7�B�
Ƙ�+���G\\}����ݽ@���ӬY3>��nݺ�������b��~c޼y�ٳ�k׮���C�~�rL�em�A�ar��GEE1v�X|}}�?~��/s��[}"���\�M����`��b�����U�V�j�ʪ}���4h�
*�9k׮�ҥK-�����m/]�4��ᄇ��$7k�_~�zP�[[?��ի�x���A>�%|������zZ�[�������{n���LJ�7Yn"AAA����:
�\����:�J�DĖbcc�ӧ��ӐBp��5^{�5�J������Ʋ�~���4��ܹsY�d��szz:�����\�~���s�C�%%%�{��y���INNf�ܹ�(Q��5�ې!C�r�
�n�b���ܻw����"���_͍7�ϱ��ߟ����i�&�u�@�-"N�f͸s������"�|�2!!!\�x�Xv��	�L��ݻw�ԩP��؃���%22���4�����O$""""""��(��܈�<\]]������f���4jԨ(��B�d�N�<�������۷�P�R%N�8��E���Yg-NLL4~έ<>>�9s�o�>v��Ʉ	X�b�q�e˖���Bݺu�����o�e�ʕ<���߿�u���y��Q�J���ٳg���l۶͸���g�����1"R�T�^�'�|R�FE$�ŋs��Ej׮M||<;w��W^ ::�gM��A�a��[U�Z�={���[o=�z�O$""""""��Ӏyl5m��^�z�u�V�_�NFFǏ�7�`�̙<ؖi��������H.���L^y���^�z888P�~}&N��֭[��a&昘V�\��A���ILL4@ؼy3����booOժU�:u*6l(p�?~<���899gz�z�j���رc�_Of���c#"�O˖-ٷo����bf����7ooo\]]	#11�5k��
�{P}�����Xh�6G}"��GI[' "b+��?�<��ϱ��Ύ��ڴiS�ɉ�X�رcԬYӤ,�CFY999Q�J����?��H�"�|���e�^+W�$!!�f͚ѳg��ORDD�!�s�N>��s����z�*�����k׮�l�򾏟��m�^��/k�={���뛔7h��s���أF�bڴi$$$�����Lhh(AAA8;;�N�>
@``���8q"�����s��]���qppȱ�֭[Ƹ�U�f|�����{����/_���=�6C�!FD��f͚���:
Ƀ��?\ؿ��Q��?]����T&/�ֲ���O$""""""��Ѐyl5lؐÇ��{���_��/����NŊiٲ%#G��Y�f�NSD$W���:;v��e�o�����7���͍�{��3,���u��Νˊ+��̤W�^������� S�����L�2�-[�������ܹ��;wҾ}{�M�V�Y<���ȃ�~��@·2�+�{աC�5k���Y�v-�b޼y,[���Çӭ[7233�<εk���^�ti._�̅���ʱ����Ƹ�а���Y�.Q"�܆2s��H�ЬY3RSS��_
����<z�ޝW�A�a���ř���s޹s'�����D"""""""
�����O?�ٸD䡵cǎ<�g�����|�lذ��K������͛L�<��ݻ���	@׮]�4i�V���ť(�)��y��lق���]�v<��S\�r����ϟ��͛qpp୷�*�9�ݳ�j�"R�*U�_~��4m��X~��A�ϓ���� 00���@RRRزe�/&22�����'�N�b���:_ժU�|�2�7o���9�o۶
��ի�:�+W���T�\�B�r�L�]�r�#"�S�ƍٸq#+V�u*"�[�ꩧ���_9q��k��5���c��a�aggGff&ׯ_���
0�����6G}"��G��DDDD�j~~~f�j/Nʖ-�رc8r䈍���…�p�������w��\�p���03����lذ-ZDpp0�*U��ޞ�e���E�([�,6l ))��)[M�)�6m�NRR$%%1c�Z�jU�cw��???>��3nܸA�5�Lgen۶-aaa=z��w�r��%>��C���:t�1�0���ӧ�e�۷�?��K�.����ݻ\�p��˗�駟��/�:ԬY�S�N��Pf�����Ņ_|ggg[�""�H�-�5k���ܺu�w�}???^y�c\a��,�Ø��L�2|���ܼy��'OQ�z�O$""""""�p�
""""E��ŋ̞=�ݻws��M�U�F�~��8q"`:�؍7X�`�7o���|����K8и�y�����\����_�ܒ��_˻GEE�i�&Ο?���ժU�s��t��%߼��7�z���G�ƍ�P��1�bŊ���G߾}qwwϷ
DD��b�_�ٳ���6oތ��#-[�dĈ�/_>GlTTcǎ��ח������FTT[�n�ҥK�/_�v��1x�`�l�������cϞ=\�v
���G@@�I܃��Z�v�Z��뇏���v+[�,���̞=�5k�P�^=��3�{�����mk�7.�$r� IDAT.���H���prr�^`ԨQ�U+�/��
		a�֭�>}���P�m���9ʬ=vxx89�kذ��}���پ};III��9;;3z�h��2e�p��e�v튧�'�ׯ�K�.l۶���>��C>��������t�ԩ�֡E��ر���d��$''�7�EDDD�ހؼy3III����&�
d|_�1K�0�%�iӦ
���|�|����爳����������<ܴ…���H!�~�:dÆ
\�z���t�=jl�՝;w:t(�/�ܹs���s��y���5j���+P���\�t�Y�fP�N��w�ܹ|�駜>}���tnܸ��Ç�>}:111�/?_�57n�0�G-nܸ��M�
��""�p�9s&�ׯ�֭[\�z�
6�իWs�FFF���f|X�ڵk���k,_���~����RSS���e�ܸqø��˗			��/���?�$##�'N0e���5
��jiܡC�hݺu�mֲeK8p_�k��`Ȑ!�߿�[�nq��V�^Mdd�q��"�����\�����p�Bz��I�
����B�
��ݛE����Q��v�ڕ)S���3���舣�#ժU���L�6����Ftt4AAAxzzboo���mڴaѢE&��;///���s����|�ᇼ��ԯ_777J�(������DFF2u�T���K:v숫�+�v�ʑî]�pss3��!"""�r�ʱp�B:t耻�;ԪU��3g�LNP�1K�0�%�=z4ݻw�t��8::�����ɓ\o��DDDDDDDnZ�B
Ull,���NCD侭Z���)�C,&&�3g�P�R%�O�N�Z�8|�0�&M�…&�˖-#%%��u�2q�D�U�ƩS�g����[��.]��:�tVYg������dv-k���9s���#==�
6��+�ӧO��*�z�ٳ�Z�j���P�g��u�V�s����m���̞=�ƍs��&M�Ĺs�X�lÆ
3��Z�*����U&�,Y�ɓ'�����ߦV�Z���0y�dN�8��E���X�x1/^�v��L�>������f�����3�ƽ�Ҹ��OO�<��駟����=-�X۶U�Ta�ԩ<��S,X����h�m�FXX�~��ܟҥK3~�xƏ�oln?�r+$000��zxx0f�ƌ�g\��СC�r{{{z��A�=�=W^��+/�:�*U��� ,X�ٳg�����ٳ<x�!C����o"""R�T�T����|�,�=�>��~In�pqqa„	L�0!�xK�>���������M+\H�iڴ���)�y�A~~~&��ʷm�@XX�������
2iҤ�ݼy3����booOժU�:u*6l(p���4hЀ�>�(�`k�k�#OLL+W��?��{��$&&�nݺ痗cǎ=������I���<�&L����?ԫW�p��>�Upp�q�E֘����W�ںu�1v����7ooo\]]	#11�5k��
��ji�a�̒%�g#33��YYӞy��m
Ə���7NNN�A$YW�P�@D��BŊMVh�����ӓ��`f&"""Rt�'y8h�)4#F�`Ĉ�NCDD��N�:@�
L�6l�#�������u��	��k�m��ի���ԩS���KfW��漣F�bڴi$$$�����Lhh(AAA8;;[��5._����|v�2C���<z�ݻ��*٬Y3���>�,gΜɱ��|��g�P�~}�rý�ܹs�2��5k�sa�[-��P��ϟ��x{{皣��*Tȱ͚�̋5mkP�Z5�{�ݻg,S�@D������ԩS9r$}��`ݺu̞=��~�y��"��k�Cɛ�D"""""""
��BӧObccm����en�_y<e�#��Uy�q)�����.ߘ�]�fi�FL�<���f̘A�2eh۶m��ۡC�5k���Y�v-�b޼y,[���Çӭ[��6��0㶵��(�s�6C�����G��蛻wd]�"/Y�7��~S�VK�4h����ٲe�5�-[�㳳�=�\�888ߛko�DD
�5bذa̚5��Ç���@D�����|WU���O$""""""R��J�rpp0YUD�a��n�4�!U�re~��':D�&M������ɩS�X�~=���,�g�y��}��h�"���iԨ�q�肜��Ã��@IIIa˖-,^����H�Þvvvdffr��u����V�Ȫ\�r���r��ʕ+g��ʕ+�y4Y2[fRR��l��o�[��V�T�_~���ҴiSc���L�O=����+'N��v�ڹ�0�u�֍
6�p�BZ�jE���s���dɒ%t��%��iϬ�i[K�_ "��

"((��i�H$''ӬY3<h��)"ŏV�(��')�4�B
U�=�ѣ����o���p!־}{~��'f̘��o��3�<Ñ#G�1cF�ضm۲h�"���?~<5j���?�dٲe,]�???�ϟ�o@��ӧ��7��^{�͛7s��Y���;vl��۹sgΞ=˄	�F���므��eʔ����|���t�֍����o���U�fMRSS9u�T�(O�:e����;�c��>|���p:v��mڴ1J|��]�6)))�{u�V���-Z� ..�Y�f�O<��ٳY�r%�+Wf͚5@��[-��_�>���?���/8p ��矧\�r\�x�o���O>���7o��/����=-�XӶ�R�@DDD��W�Nzz:			p!"""""""""�4
�)d}��᫯��_~���y��ߟ�۷���Dpp��6gggF�m�l�еkW<==Y�~}��vqq��7�dȐ!�Z��nݺg���!!!����cE֥�۴iC||<|�|����y�[�Z�h��;HNNα�zrr2P�6ED��Q�l���ڵkӫW�|�
		a�֭�>}���P�m���&e`���$%%���/��4��0����q��m���"##����Q�m�2y�d�mbI{Z���m-�~������9;;��ϒ�����+"""""""""�()a���u�����x�8s�~~~�8���رc���+W�d̘1�3��+WaV""�Wbbb�K����E`` O<�%K���ח��zGGGc��������鉽�=�١���<v�X�������Ν;�ٰaCz���ݻwy�
tޮ]�2e��y�qtt�Z�j��ߟiӦ�F�M���)]�4�������PgV��ձcG\]]ٵkW��]�v���F���-jy4EFFҲeKJ�,I�
�ׯ���7�����ݝ�ҳgO*T����=*T�w��,Z�cl�r�X�p!:t���jժ�̙3M~�-�{��q�W�"""���HZ�j�O<A�%(S��[�&22����899�=-�XӶ�R�@DDD�xh޼9			�NCDDDDDDDDD�Pi��ì�u��1�\�n]��T������ر#ׇwmu�0w�\V�XAff&�z���חg�}���y��-[�)S����?���˛�{xx��C�t��!Gy~��q��1nܸ喞 00����<c\\\�0a&L�3���իT�R�`�Ξ=���gϞ��2WW�|��GW�ҥ�+*�&�{d�ҥ?~<�Ǐ�\�*U"<<<߸}o�&Πu�ִn���xK���=�\[ڶ�]�����<������n�4D���Z���)���7o�ܹs�v�nnn�NG�Kzz���ԟyTi����\>?�v��Q��}��M&O�L������R�Jt�ڕI�&q���"�RD��Ѻuk�����ϸz�*�����6�DݠAg�p		�bŊ����bbb���$88؆����HQS�@��ӣGz��a�4D���çE�ܽ{�����:��VӦM��S�QFDDDDD�Ѥ.�H����(���"**�yΜ9̙3�&+;H�.\ȅx��W�e�{�f���,\��aÆ�0;��+  ��>����"""L��)S����(�����S�Ne�ȑ����u��1{�l���m�����%�D?+W��u
""���O?��O?MBB�ڵ�u:"��#F0b�[�!"""""""�HӀyl���ơ7�={�p��5|||�ׯ&qiiiDEE�u�V.]�D���i׮�6Y"�0�$..���H���prr�^`ԨQ���p��=���شi�ϟ���jժѹsg�t�br�����;v,���̟?�$&+s��;�s���G�ƍ�P��1�bŊ���G߾}qww��B��<Ə���77n���Ν;<��S4oޜ���\��5jԈaÆ1k�,�NÆ
m�����؂�"�;;;[� "E$33��)��{�9._�l�4D[}��!66��i�H6�ψ�����<Z4�B������� �T���իINN��������|�2!!!\�x�Xv��	�L��ݻw�ԩ׮]��^��ɓƸ��Tbccٿ?��Ѹ���{Ȑ!\�r�[�n�z�j�ݻGXXs��eɒ%���t>��Ç�~�:}���7���H��Ҭ~@��z���_s��
���sl�g���lڴ�nݺY�����D�d�T	jK�J�#>X[{�_ �x�ҥ��͋<�bcc����m��Xiٲe�NA����@LL���ԟyTi���Drr2u��5���-^���/R�vm�O�N���y���Y�f
���ƁK�,��ɓxyy��oS�V-RRR�<y2'N�`ѢE6���U�T���=��*���C
q4��a�0�<������a��f���UZf��y
�Q255�#P
"L�Xh�gI$�#������
$�?��{ذ9�n��u�+���}���Ƚ�^fΜIݺuY�r%����رØp�n�:�,Y��d"//���DBBBX�v-�YX�ҤI���qrr��.�줤$�5kV�洤�$M���b�8��a��m�����""��>���C��������y�E�-�������;�CÆ
�Q�AAA����~�z#ߎ;

�e˖8::ҪU+�N�
���ۋ]{���4lؐjժ�Udee��;bDEE�/��€HMM%!!�\�Vx�EE�ۚ'N7'�ոqc�<""""""""""""""""""""""�:�p!w�y�����3�|�9s�3g`}g��r��Y�6mZj���Z�je�ަM�����i����
��7��	&0k�,���INNf���9�W�^���*���m��˗�Y�f�c�4s����lo�5cccINN��ۛA�UY�"""ro����P޸�~�lV�Z55jD@@/��R��W��_��h…<����n��(�rtt,��=z����Ν;ٰa�fٲe�^�����ӿ�2�/iw��������b�o������ǜv��*"r����&//��a���<0����u"򀊋��u"�v��A�.]�ڵk)((`��xyyѺuk[�&"""r�\�~�����{�{�9[�T"��DDDDDDD�=�GN��F��������SO���ʒ%Kh۶-�����v�[�.'O�,5_�z�8t�E�����G��wuu�O�>�\���>���Ç���Ehhh��g���믿i��m���;���Ŏ���yDD�'�>�,�u""�8p 
6�u"Ub�j{EĦ�9$U�N<��z�*ӧOg��xxxP�^=����6mW�^��勈���)��SNMMe˖-����U�V�8����&""""""ro�rǥ��7'\X{'t�Ё��,X@pp0�>�(�/&66�
�~�z|}}���$88�9s�мys��ә7o�:u�p�}��%##�)S�ЫW/�x�	����w�(((�̙3e�sss�������ӿΝ;GHHH���Z�M�6��>}��ĊӧOyDD�7o��o���y`����:���L&�;2��n��2d��6t�P֬YCDD�ƍ�at""""�O�Z��4i���;v���H�5�{�v��;�n�p�ꫯ���Α#Gx���ر�1���_7�
>��
����ȑ#�f�ȑ�={��
2r��
�=|�pBBB�ܹ3�۷'((��ˇ���~~~��ݻ�k����h�":u�ĠA�x��G+}����С��Wa��L@��`gg��^z�u׿���m��)R%l�oI/��������d�d2q��v��رc�c999,Y��>}�о}{z��Ͳe������>�d21b��k���`2�غu�Ez�>}0�Llٲ�(�h'O�dܸqt�ؑnݺ1o޼b+_�t�ٳgӭ[7|||�6m999��-;;���ڵkG�:u���{��DLL��ٕ�;���߿���$[�!"唓������ܹ3=z�`�ܹ\�t�"ϭ�
۶mcǎ���ooo^~�e,X`�OSآE��ڵ+�-*�=���X��ggg�p�B^z�%#���P�\��Z_�ƍ�X�???ڷoO�Νy��W���/��k"""""""�&�p!w\�	�}���;��ݝ���.]ʾ}��v��?�8#F��[�nF��5k�'�|�Ν;�t����t�֍�_WW�
�����C=Dll,�N��A�t��ɘ�0i�$>��cΟ?o��da'N��ޞ�[�r��UL&ӧO��_��}[+�gϞ,Z��={�0l�0���ٳ�w�^��8::e�0DDJ4h� [� R���뇿�����Tttt��Qr	

%;;�薛��رcIOO7�;w���p���X�t)ݻwg���;v���jԨ��-[��믍gc�/_��ٳ899ѱc��3f���\�v��?��7n��dgg3r�H222�s6o�̯��Z�Z_}�999���;���CJJ
[�l����+��Z�h���$&&�:)��� ���ܜ<Ϸ�~KTT...y+�w���������Y�r��Ο?OLLYYY̞=�j|~�!QQQ�hтѣG�z/\�|��ТE��W�\��^3��5�MJJ
�����[�t)�}��q�<�=�ѣG���_	�_��i…�qE����6��^�z���Ga���L�<��|����N�ӧ}��)�z=z�G��*��ٙ)S�0eʔ2�羭��������ʕ+��Ƞ~��dddp��!ƌc<|��8���:���^����<M���5i҄��p���X�z5���<��SL�:OOON�>Mpp0)))$$$Я_?�~�i�=ʡC����!??��۷cooORR׮]�z��Ƃ3��J}^֨Q#fΜIݺuY�r%����رØp�j�*222hРs����ˋ�G�2cƌb�2�*߬Y�b��iIII�'"����7�gϦ��@;E��N�8����iݺ5ǎc���ddd�j�*��?Y�l�	`͚5L�2�޽{cgg�ѣG3f�1ᣨ��P���iҤ	K�,�ڟ*�{Xa����i�}��N��~��̙3�f͚�������9y�$����7��}�u���d�L&yyy$&&�ڵk�	ꯉ������ܻ�m���;��c�=f��{TT�02y�L&�WY����ƀA��[����4i҄�3g�[@Ƽ��y��������E߾}�v�{�����o�.]J�}���4lؐjժ񲲲��;w�`�ԩ�h�GGGڶm�_��b�:q�psGQ�7��#"r;�oߞ˗/���:)��� ڵk���#-[�4&|�ر�X���v��ͷ�~K���ٴi}�|�ps牢̓-\]]���quu-�888ЦM>���b}?�=ѲeKiժS�N`���@�z�	!QQQ�����/�0`�RSSIHH0�PMDDDDDD�ޥ.�U��$���]"�l���̜9�7�|�W^y���/^L���m�����ܦݩ6(==�aÆ���/���ؾݚ7nзo_Ν;GXXm۶-�E�"�g-oIm~�j�hԨ���Ke^�N�v'N��iӦV���ƒ���\�@}� IDATqРA�?H����ݻ���'--���,j֬��O?���;v���m�t�����Ha�mfgΜ(qGړ'O������q[�l�Z�j�7�/�����������4����ܹs�qxzz?�޸q�H�駟hٲ��ymڴ)v�˗/P�f�b��i�<""�C�֭�^�:���+����֞���h�V�Z��Vپ�ŋ�8q"ǎ+�����XZtt4�����/��w��Z��~����ӟ���ӧy����{FF�{43��Ξ=T��7a�f͚Err2���,_���#G���o�k"""""""�.M��
y�g7n,`�����+""wN���i֬ǎc�޽��ٿ?�Ν�I�&w�������y�pqq�瞳uHV�����ڵ��҃�t�R֮]KAA���ˋ֭[� Ry�\�~�3f�m�6��_~��ݻw�{�n�w�άY�,V*�������c��[I�K�l*��gm�_a�՗�ԩC�V�8r��/_f�Ν<�쳸��ѦM���KNN���n�77�R����h�lggW�9���=�P����M�7�Y+CD��899a2�ػw/#F��u8"R���s���X����ϟϱc�hР�=�����hѢ�I��[��k׮�b�
BCCK-��Օ�ӧ3|�p�͛���[������
�����ooov��Ɇ
8|�0˖-c��Ռ?����ꯉ��������4�B�Zw������?����CDDJѿ�ΝK|||�.֯_���_�˪�6��u._�̢E�HLLdժUw턋]�vYM�z�*ӧOg��xxx7�yڴi������|'����϶m�pqqaԨQt�ڕ�u뒙�Irr2+V�`�֭8::2{��J�a�
���W{,"�����ӧٸq��YQ�=zp��!>��S~��Wc���;����'�|•+W�=Я4
4�ԩS8p#=--�X^wwwΟ?Off&����233�<"rk�a�l|��]^>>>|������A����ȭ)��e�}��ſ�����GY*�w2�4nLP8u�q<??�b2�[o�E�ڵY�x1�w�&==��͛�ZƓO>�+��Bdd$���<��3��a������СC<��F��C���1�l_��Օ>}�ЧO���ٶm�~�)���Ƅ��DDDDDDD�]ŗO�
3�LV�+���={�������ŋ��|�2�w�z����Kw8²ժU�I�&X�r�n��2d��6t�P.\�@DD�
#��ݡC�HLL��Օ��H�W�ԪU�^�zI�Z�HLL�ȑ#���Q{,"�a0�����߸t�}�&���c�y�u놽�=��9�1�C��Y�__�[��^ 88�����w�}��_,oӦM8}�t�c�4s����ۛcǎ�Kӯ_��n�U�ɜ9sHKK#//���F���/�܊����Gnn.ǏgڴiFzVVV��<���,_��\���k�Q�~}~�����,���e���9r���|�9¼y��ԩ���2}��}�b2����NNNO<�^^^��fꯉ������ܻ�Å�������CHH;w�z�����?�jժy�m�F\\Ǐ�ڵkԮ]___ƍG�5��[�����e�Ν;���#�����ۗ~������K/�Dll,7n��W_-�_|A~~>�z��f͚�.�(�D��+�]�t��?��]�vq��U�v��ԩS+\g�������srrX�r%[�n���v�ڼ�⋌5�b����WI�QZz�cE�eggC�v�S������d2�+��bԻ��T���7))����n݊��;v�7ޠv���򆅅1i�$���X�b��ل���}�v.]�D�ڵ�ڵ+�G����Ţ���?,[����$�\�B�ƍ6l�z���W�mUy�mذ�aÆѸqc��V�V-Y�x1�ׯ�e˖�ϒ�@k�fy��|nLL���9r�jժ���3a�c7��փ�c)�#F�s�N�9B``�ű�ի3q�D㽻�;m۶%55��M��/�5��駟x��'�\�<ٶm'N�`���FzϞ=�
��С�v�"--��f���H��ͻK�
:v�ȴiӌ�9�1�YE�6�7oΈ#,Қ6mJ@@@��V�����Kbb"3f�`ƌŮu��q����:u*���������ôjժԘ���y�3fqqq��ߟ���>��۷s��F�iq^Æ
-�*��>|8������bq��2��DDDDDDD�]��BDDD��2e
������p��e����裏��˗/��w�%55�+W������牉����f�ҥ��o�̙3��呓��ѣG�;w.QQQF>�V�			V���0`��
�_���lF�IBB������y�f����}���.]�ĂhѢ�����\Ǝ˧�~�ٳg����ܹs���3a�nܸa�-o}U��������b_������Ö-[nK�""�>���7r��5���HLLd�ȑVW�

%;;�8q��^{�5֬Y����
���fԨQ����^�|��Ç��_������|N�<Ɍ3ظq���v�U��w��a:w�\j��W�<x��-�gi*R�fcƌ!%%�k׮�����Nhhh��A�ȃ)55��d�Ҹ�����?888��ꊯ�/����V�ѣP|@��sռ��rrr",,���憓�ݻw���UϞ=�Q�{��)vlϞ=���н{�*�KD�$����5k���ED�0u�Tz�쉓��j�b����Y,T����y�z�聳�3NNN�hтy���I׮]k���-[��?�(�.m۶eРA���o,\��H�Y�&4�:u����@�:u:t(������Z\��}=???f̘��O>���NNNxzz2b�f͚e�SMDDDDDD�ޥ.䶊���X]RD�^g��>��/�����1111�ر�ɓ'�ێ|ʔ)���;;;�=ʘ1c,��Y�nK�,�d2���Gbb"!!!�]��X���ӓV�Zq��a��X�D}�Μ9C�f�h޼y��/˪U���ȠA�̝;///�=ju��
�W�������E��իIOO穧�b�ԩxzzr��i���III!!!�胔��*�������h֬Y�s�iIIIƤ�u{��e��Ŵk׎cǎ1m�4Ξ=��ի7n�E�&M�n�2��g�q��)�ׯϜ9sh֬���L�>��'Oi\��O?��ŋ4oޜ�s�R�vm>��C֯_Oxx8�{�nO[U�|?��3@������.\�p}��U��5kԨ3gΤnݺ�\����pv��a0.o=�=��J��ruu孷�⭷�*�:~~~���K�4i�&M*�ܒⰖ���3e��L�Rjއ~V�\IFF��� ##�C�1f̘w-��3�i^��>77���z�O?���z�?���̞=�K�.1~�x6n܈��}��aɒ%��^�999�7���X�U��K/�������]�r��s�KFF0}�t�W�^,���Y���9�[o��7�|���3d��<���;���7n0s�L֮]ˏ?����O=�����F���oLD�*܇x���˝���j֬Ipp��c�w�V�ԩS��\���w�y�w�y�X�#�<��ɓ�g�h_�O�>��ӧ�몿&""""""r�҄�����4h����r%M(�^�����/4i���_���.]�d߽{7;v�M�6��?���7��6�Q�W�\!**�S�N���ˀ��*
�߿?�&>>�"����X�S��˲s�N��b�)ڶm�_���|��r_����-[2f̘b��u�V����W�ps��̙3�ׯ���� ֊�WU9q�ps�hQ�7��#""Ucʔ)�N-[�$((���dzcǎb���;v� ((��-[ЪU+�N�ʟ��g�o�n\c�޽��A
64�+���h�ʛ/77��*���y�����*R���HݚM�<٨ۀ����-v�(o=�=��y���(c0aTT�8:��۟��g��Œ�s�̡I�&,[��x�����g�}���=�Ώ��4�^���{�r���ܬ�y��5�t�b���߯��
{{ˍ�+ge��ҥ���+''�+V��o�Y�_Ԕ)S��_�j����%99���d����5)ND�n���������Ƚɾ�,"�EAA�^z��}���?����#�<��7���/2l�0�
�ܹsY�v-�N�,BN�0�jժ���̇~��	�ڵk��|���y�Gؾ}�1P1++�m۶���BϞ=+\~Y~��'cP�Y�6mJ=/55���T�o�NӦMqtt��_�:��̙3�͕�L&��2\=y򤑷"�UU._��\��(s�9������g��U�����֭[�k�
3�7���nN(��v�={�H3�ܴi�Rc�mUy�թS�s�Ε�����H}����ԭ�����yU��}��փ�cy�8;;3s�L8w��Ν#!!��3gZ�>/"U/%%�Çs��UfϞ
��q�ppp��������{��q��b���lڴ��ׯ���D�ƍ���Y�pa�e.\����T�}�Y<H^^�}�;v�믿&<<���LYM�6��'''ǘ�l^��s���]͓16o�������fٲe����DD�uꯉ������ܛ�Å�6�/6V��_����:�Kݺ�<�-���m���9v�
4����ӓ-Z�-�G�x{{�s�N6l��ÇY�l�W�f������ߢ�޽{�z�j6m���ٴi�����������%y�Ie��m�������>|8�����͍.]�X-�$�w�H}��mgg�o��2�_tu��i�<""R5��3���>��j��^���~~ߎ����ڴiùs�ضm���j�1l۶��_TE�2�խ�����.o=�=��3�<øq�X�`�Ǐ�m۶6�J���OL�0�3fp��U>��c��;�ìY�,v;5[�l/��>>>���ѣG֭[�ܹs��i~N�f�~���мys"##y���Y�z5�F���8+S֒%Kx�'�8q"�~��]]\\���$44���~���?��?��O��'"r/QMDDDDDD�ޣ.�ٿ?qqq�CD�J����3Mn���d��Ù0a�{��8���o����J�>}X�r%�}�Ç'++����b�����Ύ
6�-:Ѡ"嗦A�8p�"=--�\�<�䓼��+l��a����\mѼ3F�WJJ�E��ԗy�寿�j�^}�"������,v̜f�#""e��Y_ԑ#G,�<x�V�z��p��!�t�{s�P�n]��6�v�U��gn�#""J�����>0v�(�V곰��mE����ȃ��ߟ��p�B�j�pD�'��]�E���?�p������}ǎ��?�Y�9?��M�4����x�wX=z�h��Y���z�)��Z�j�O�X�`���lٲ���~���~���`rrrJ=OD�^���������ȽE;\�m���OTT����e����:y@�۷���S�N1{�l#=++�Z�jѷo_222�2e
�z��'����7`�"�YÆ
i׮)))lٲ����m�ҤI�J�_�^x�e˖��ٳiٲ%'N��߯P=���klݺ�����˜4i�q�K�.DFF��ɓy�'�����իY�j&��+V�����ܸ|�2�����ߟs��Rf�vvvp��6l@ӦM9�<�O�.6�����F�:�>s����'���ѣгg�2���%22���`�̙C���IOOg޼yt����ۡCbbbX�`���<��,^����X4h������V�7_�V�x饗���/5j�G��[�n���s��E���k���\�z�^x�֭[W�>����R��U�zP{,"""w�����t�r�_��b��_��k�N+ge�*��\yw2d={�$>>��+W���DPP��;vl��#"""""""""R�4�BDDD�.���Kbb"3f�`ƌŎ?~�Npp0!!!�&���x���IIIa���0���%00�m۶q��	F�m������X��μ��{�3���8���o��=b�v��ɑ#G�8�z��L�8�x_��eݺu,Z��E���~�5������`�ƍt�Ё]�v���V�wb��2LED�d�j�bĈi͛7g��e�;|�p�o�Ι3g9r�ű�
Z����lݺ�#G����/[�}��׍�oG[U�>@PPׯ_�믿&44��.X]�ta���V�<�i�
,�"u[^���"""r�طo]�t1��޽�f͚�xN�ƍ9q�?��#�5���U��.]���~��
����ƫ��ʫ��ʷ�~���|�[o��	"""""""""b��@DDD�~���Jjj�-]�wޡG�8;;���D�-�7o�1ia�ڵ���1c��|�I���prr��ӓ#F0k�,������ݝ����ԪU��K���_'''���0`nnn899ѽ{w���*\'m۶eРA���o,\��Hwqq!<<<<<ppp����XE��j�孯�'2`�y�������)qja�&M�~��888���ܜ\R�F
���S,��={pqq�{���)Yhh(;v䡇�N�:6�+VX��[��5k��A��S�ԩS��C��������ݝ��z��A͚5qtt�Y�f|������w;ڪ�����		!44�N�:�裏boo����;w&44�����T�V��i�
���-��փ�c�W�=�������Ǟ={��C�-�?��͝�8@~~>�ϟ�w��Ύ�]�VY|�)k���$''�xM�������鉝�˗/';;�V�ZѪU+�r��EDDDDDDDDDn����[!���������P�8q�b�La�������4�N�&"� ::�����f�r�P{&UeŊ�\����x�ׯ@FF���c̘1�5�����Ύ��(���������&�	�'>�M�[}�=����wk�C�~�Կ��EGGW��'	�c*���|e�ߡC���,�L&���C��խ�������7Ǐ/g�5ػw/mڴ��8+SV�-�ݻ7��ͳzͺu�r��5jď?��'�|R�.}��aÆ
V��<H�=������k��ĽП��{����O�~�mv��eu`��Y�t)k׮���������E�֭m�����nÇ��/�$**�ɓ'7���� 00��щ��<���_��㉏��u""UnÆ
>�-[�P�N����>}�1�šGy�o���ٳg�~�z222puu�s��̞=���~���LY���|��7%^�>"((�3g�p��uƌ���#�1���<����˼��Uv?"����<-�&"""""""ri…Hڵk���W�2}�t���~~~L�6���8����d�"""r8;;3s�L�|�M^y�X�xq�&DDD��=�hEX��,*鳩�����|��*��͍?��?����V4��eEDD�f����ptt,v�!C�0dȐb�9��#G�Z���OTT�v���4�Bl�d2X��~��,�<:t(k֬!""�q���0:�]�y�ƍǂ?~<m۶�qT"""��"���,����uR|||��������u8"��ŋ�w�^[�!"E�?#"""""rфy`]�x�xy��U<==6lS�N,'����r�J�n���?�L�ڵy��5jNNN��&��955���lbbbh׮u��1�<��c�L&bbbx�W�Y�杸m�����u""���y�-ܯ���X�����m���.��r���V�Z�۷O.Dn�����>��]B����&\���_eԨQ���OF���Ǎ�����2v�X��Ӎ�s��NZZK�.��޾IJ���+rrr���)v��LJ���l�B���o�DDDDDDDDD�_QQQ�<%r���&  ��aH����C�$''��o�:�����?QQQ�CDPFDDP�x IDATDDD�~U�(q��XTT?�����#<<�}��f����իIOO穧�"::����K�֭III!!!�\455�x���@�f͊]ۜf�#"""""""""""���


l�m��'�i�0DDDDDDDDDDn�v��;�d2�+�����c����hٲ%m۶eڴi���y�n�
@pp0����I�&̜9�~�����H�~�J,�ĉ4jԨرƍ[��xxx�:�[�	�@:}�4mڴ�Ho۶m��gΜ�O�>V�u���R˺|�25k�,v̜f�#""w����R'׉��HՊ�������a��*..��!�=��x�yј��+rna���$''���͠A��$^��T�?c͉'hڴiU�t�n��**77�^x���,\]]ټy3NNNe�u��T�SDDDDDD�b4�B����Šn�mggWf���\�R�q�5���3�Y+WDD�yyy��ADD����'>>��a����Qd�ҥ�]��������[��uh""""�z��ٵk�M�{�ܹ���,���عs'=z�qT����8M��R�
��?���Ç���`�>|�X^N�>�ƍ+�����;�ϟ'33www�c���F�;EEEe�0DDDeMz����«W�2}�t`<����cڴi������\a������v�uV��	 6l��_�/� !!�\.�T��s�������T�&\��{���d޼y̙3�'�|�cǎ1o޼by�t�Bdd$AAAL�<�'�x������^��U�Va2�X�bps����Μ9CÆ
hڴ)�ϟ�����&V�>}��#""w�ŋ�w�^[�!"R�7�x��;�:�[�]�D�nk��l�����…2�H:t(k֬!""�q���0:)����oqss��w�e�޽������u��:<@}N�ʲ�u"�@�ƍ����͈#���W_���w��#F��q��9r���@�}�Yz��ɪU��^�:'N4򺹹7W�ݻ7:t --�ص�i�:u��{����~���l��H����8s挭��qqqj{EĦ�9t�9s��ڵ������}�Ү];���m�;v,���x{{���/�`�rrrJ,�d2�=�.]���ٳ�֭>>>L�6��5�������]�vԩS�H��0�L��Đ��]�[)��}����,YB�>}h߾=�{�fٲe���y
������s~��8@׮];v�Ez~~>��ϧs��t���X/33��S�ұcG�t��{�ǯ��Zb<�'O�dܸqt�ؑnݺ1o�<�^�Z�{/,!!�7n��/����/���7HHH(��a-N��/2c��v�J���	d˖-��'�9EDDDDDD*O;\���b�9ggg���X�t)�w��ʕ+4i҄��@f̘�������Ņ��p�����c�.\���?L۶m;v,�?���wҤI|��ǜ?�x�ֳgO-ZĞ={6l�E{���Ņ�ݻߙ�J�'**��a��������!�T���(���m��<����	�uR�6l��d��o��ȑ#�l��8v��222x��giР˗/g�ʕ�?�������={v�����f�ȑdddi�7o�h��W_������O�c>>>����e����_�[��\�z��/ҠA[�"�H%77��cǒ��n��;w���p���X�t)��%��X��CCC��ζ�0�|֭[g����F������3���5���K���y�J��1cƐ��i����s��
���*{AA_|���(_�>}���a�ƍ�5�B��~��WF��O?�d�?~��S�V�����<�p!�Z�j1c����k�������M�6Ԯ]�"���+o��7nd���l߾�XL��ѣ6l`���|��W<�����s��!���:t���@jԨq��VDDDDDDDD�e8��_Z�'&&0`�֬Y��)SHJJ�o��O>n.�R^�V�"##�
�駟�o�>������MJJ�Y�fŎ���yDD�EÇg���CD�Xe��դ����SO�������u�֤��;7^\/55�x_��kҤ	III�&�����f����c��������IJJb����޽��zhԨ�֭#))��#G�cǎ
߻ٷ�~�ٳg����'����///Ξ=[�����駟�W�������D��ܓ��"""""""��	�@�ܹ3&������deeq��
���1k�,c�EU>|8�=�����QQQxxxX�e���������<(L&�ū�t___jժ�֭[��� ??��[�R�N:w������Ҽys6m��G}�|��+W��Ν;�:u*-Z���ё�m���X�'N7�ոqc�<""�"���m��P�>�֭[����4i�̙3��M\-Ie���ɩX��)Sx�'prr2vļ~�:S�N�Q�FT�V�W^y���4�'O�aÆT�V���.++�ұ�'`�w�0�۷/6l(3���%���hٲ��{�6mZ��I}N��{�������U)55�^�z����BBB,����+�TgggfΜɛo�i<�KHH`���T�^�J���'NдiS��bcc�/ý��4hНMDDĦJk#w��M||<iiideeQ�fM�~�i����رc��m����+bV���Ý���]�6��ތ1�z���R.\��+)))������ϟ���[�fQ�ꫴ�gy�o$ro{衇�۷/�ٳ��]���7ߐ����ѣqpp��ŋL�8�cǎ�FAAA��駟hٲ�E���^._�@͚5�3���܋|||��矫�O&"e������QΜ9@�>}��s���R���E��Q��񳧧�񳳳s��V�<WWWnܸa�U$���l�o��…Y�pa��;v��ʕ+����+�ӧO�/m۶-��I}N��ӄy �W�شi��׿��ͥnݺ�oߞQ�F��ke=��3�7�0~��R�����no��6�v�:x��,]���k�RPP�����u��6�TDD��*���~�:3f�`۶m���w�f���t�ޝY�fY]��Vʶ���\Ξ=˺u�ؼy3K�.-60�"�M�Ɓ��/^��0KUu����ݫ���&�����O?�/��k׮$&&booO�~��<����رc4hЀ�{OOOZ�hQ�IV��E'i<�P�G�vvv��ߐڜf�#"r/jݺ5իWg߾}�p!bc飔5ٴ�ݿ*s~IKW�V�j���Sy8::?[�gU$�͛7���[j��ׯ�y�fP�8��QZ���{R�SDDDDDD��4�B�Z�sp���=���Ɩ�w�-�)ɮ]���_�z��ӧ3`�<<<���cڴi���Uh�0�{QIm��϶m�pqqaԨQt�ڕ�u뒙�Irr2+V�`�֭8::2{��*+�NO�(\���׿��ҥKINN��w�eݺu��9r��˗��3ϐ��_%1����gy�o$r��W����$%%�����ݻy��,_1�d����N�2����[�XT�
8u�����HOKK+���ݝ��ϓ������ű��L#��Ƚ��ɉv�ڑ��̈#l��}���!+�G�������lܸ�[�"n�|[�H�			,^�آN;���x�
�=�A��������0�>\����>�������H�Un��`2��n�~/����…2�H:t(.\ ""†�����ΡC�HLL��Օ��H�W�ԪU�^�zI�Z�HLL4&��U�ƓO>ɇ~���?��37n���,L&�����	�NR�H�ҿ~��7F�Annn�����Gnn.ǏgڴiFzVVV��y�������w����k^����Ŏ�Ӵ"����ڷo�޽{m���"}�.]������߸t�}�&���c�y�;#�9s�R��m��?���c���O���^�}��4jԈ��t~��r�߽{w�͛GZZ���=z�y��U�����<�p!"""r��'b���1i�$���X�b999�\���[����?S�vm^|�EF�e1�ƍ����e�Ν;���#�����ۗ~��Y�W�k�b�955���lbbbh׮��*��=�&����^y�j֬y{*KDD���T�a��
F�ƍ��R�V-Y�x1�ׯ�e˖�IJJ"$$��[����Dǎy�7�]�v�e��,;;���0�o�ΥK��]�6]�ve��Ѹ���NLL���9r�jժ���3a„r�����Ȉ#�:u*�w�fРA�ע�׮];�{ڶmqqq?~�k׮Q�vm|}}7n5j�(V'���^Z������D�?�:u�N�:\�p�
X����Kbb"3f�`ƌ��?~��Օ��
d۶m�8q�ѣG�={�,6ȭC��ڵ���4ڶmkq̼�t�N��}�""w#ooo,X@ff&�<��y`U��2b�v��ɑ#G�8V�zu&N�h�wss���������ƍ+t�ݦ����2ĘtR���C��> !!���~���ؼy3?��c���>�������H�i��;$44���lc�^nn.cǎ��O?��ٳ���q��9��Ù0a7n�0�]�t)���8s�yyy���p��Q�ΝKTT���"״櫯�"''��"rrrزeKՈ��ȭ�Sm��Ç�ܹs��:v�������ظq#׮]#++���DF�Y���ͮ\��k��ƚ5k���C~~>�ϟ'::�Q�F���S�1cƐ��µk�������?'44�B�n��bE�[�W��˗���ʕ+W�����!$$�B1�Wy��Q�H�ޓ��ju�����1���ϯ��w�y�=z��쌓�-Z�`޼yƀĵkז+'''���0`nnn899ѽ{w������ٳ'5j�`Ϟ=Ŏ�ٳc�c�{Uǎ�֭�/_�u("���Q\\\���puu��ח��H��&M�D���qpp 77����m�{^^�6m��Օ�^z�����ԬY�M�6���Wf���΄��ѧO}�Qz�!����={6@�v�T�SDDDDDD��Å�V���DGG�:��B�&M7�Y�z5���<��SL�:OOON�>Mpp0)))$$$�֭[��%K0�L��员�HHHk׮%  �B�,i�줤$�5kV,~sZRR����M�$""R1w��������(5������…Ŏ�ݻ�ŋӮ��޽�UU���H�e�/e��S����Ўڌ����t̔����f΄���ұ3�g�-5/d(�G
I�<N0���N��!����?ar_����#�w}�Z��N�{���W�N�RXX�~��gmڴI�����7��ٳj߾����?�{��:y�,Y�3g�hÆ
.�N�N��l�2=��Ê��Rtt����W�C5�y�$I��򋹭*�g�;���xIҢE�4j�(YYY�ĉ�1cF��TEy����F@�4}��#:ߩU�V
/w=��O���v˖-�h�"-Z��¾-[���������������K�rrrt��q͘1�<�ܫz�!
U����Q$���I���Ӽy�*�����5|��j�_޿�k�^��l��-�������S���o߾*�z�,f\;w�$�g�,oݲ��	@�Qp�:3k�,�C46����~�M����#O�޽[��v��I�]��l�2���hǎ�ߥ-Z�Е+W��g����K����-���l�,�O��t����:w�\�
A}��4��٬Y�_����-Zd�)��'�Thh�fΜ�}��YHT��Fhh��|�II�SO=�������ڻw��.\��;J�]�5n޼)��9��y��/��R���:u�>��3�����o$ݞͣ.T�}�g#�e���ھ}�bcc�p�BIRll�\\\hp:ԧ�����@�-������訬�,���뒤޽{Wk�|��z(��'���L���%I���e�?s��9s���W_UZZ���Ҵv�ZM�:U��������6�r��%I�Gu-��f�@})���T�X_�#۴i�s���ܹs�…��������Q�u�^�$I?��S��.oO=�T�v�?����:]�t1����$I�u�V��{��I��������մݹs��ԩS��*\�
�}���@}qppвe�4{�lM�4I��u�V�Y����Kh�~���飏>�ʕ+�r��˜��˝��n��	@�Pp�:�f����jU]=�{O��M��7}���[Hw?�9������������O?շ�~�w�}W�6m�̙35v��*o�,VVV�$kkk�e�6S���ٻwo�;wN{�����r��ٳ�ܿ�ҳc�
��[P��ښ����G�J��u�fn��y��U�V�ԩS�С��y�u��E=z�иq���_\\l>��#UU�
��ԧ>}�(88X�W��$͜9Snnn�@}3�R��g�����
�������6mZ��<T�9�:
.P����kt����8���������m�6���ܵ����������'OjϞ=��a~(���,�u�����U^^�Z�n]bY^^������F�~~G�;V;v�PLL�
��{̢����7J�|||,��������رc��Gy�JYڵk��QǏW�~���Ǐ��j��ܸq�<���������U����$I�����3Ξ=k^^TT�f͚���J��źz��%Un��T�}�g#����_���F��������s!�9���BU6d�IRhh�233u��M]�xQo������d�;z�h���룏>RAA��q���J*9buU�i�9;;��ֵkWIRVV�E^S��
A}��|ꩧ4r�Hhڴi����?��O)77W�6m�K/��k׮��S�^�,����k���PQQ��;���pI҈#*�wi�����p������H���Z�b�$iРA�?�w�믿*##Cs���?����ۗ�[��z7�Raa�233fn�|��$��1�l٢k׮��ٳZ�r�]�[�9���Fд1��A�L�����+==]���%����k�ܹ�ד'OVxx�V�\i�`��}We���κt�ƌ#m۶MPJJ�222,���ȐT�qPS��;R�]T�믿�/�PDD�""",�2DK�,)3�<�)S��h{�'4~�����1�ݻW��ٚ:uj�e;v�h��;gḓ���^��	U9�����Ҏ;�t�R-]��byff�<==��奏?�Xo����|�MI����]�_�9���Fд1��$ww�r 1��ӧ�]����y��i޼yJJJ��T��8r䈎9R�u-������FNNN���҆
J��<f�-]�Tݺu�������ԥKM�2E���j���`��o�^666*,,�t{��-Z�y8 GGG
6����:S_�#%���N+W�TDD�
���_���rvv�������j޼y�Y#""4p�@5k�Lmڴ�/��u�������S�V��q�ƩM�6���Q�6m4q�DmذANNN5=�%��S�N�0a����խ[�˫r^��?�IÇ�������ԣG�X�BӧO�$%&&J��Ν+___�w�}������g��-w*�V�}�g#��u������_����Q�R��������!  @�[���TlQ�c���󕒒Rf�cǎi���JLLTqq�Ə���~[�z�2 )д���)  @�_��_��~�Օu��)**J[�lQ���%I999���ь34m�4�(���J����/�5А5��oC�7(���FM��k���i����-//O<�>��#����7:p�)�븸8##(�g�qift�
�!����2ۯ]��%K����W...�n�����d988�gL@2y�dm߾]���Z�p���7�\\\hp:���g#�a`�Wh��>=��JKK����f�t�l� IDAT�����15
.`8F�,[LL�Ο?�	&��&N����x���(88�t����A˖-��ٳ5i�$I�֭[�f������~��h������%�����B����E�n����k�.�;wN����ҥ�F�]bT������EEEi���׿��|P���o5m�4��ٕ�Q:S~~�Էo_�i��ܧm۶rwwWBB�&M��V�Z��	4y}��Qpp�V�^-I�9s����N`>�}�*,,4�/P=k֬Q\\��1�R\\lt@-�����7�_߸qC'N�Љ't��UT�_aa����t��Is�s��)::Z������u�yv�ܩ��yzzZ,�����Ç�k�.�;���@y������ot�y���8������������_���Ǐ�駟6:p��Wll��1H�����0�QpH���%Io������u��
�رC+W�Tbb��K��۴i�N�<��={*$$D]�tQVV����u��amݺU>>>:r��l����*I�޽�EVS[jj*h�������#���z衇���J�����;S�����s�-Z�ʕ+����ٳg���%___���V���ݻ%I���j׮�$��Gղe����;v��ǧ�<�O��$u���bY�ΝK�???�#ꐇ��<��s�*D� iΜ9z��W������4�]�VS�N��������/;;[����]�Μ9Sa�K�.I�Z�je���f�p/	�����1�aɒ%�y����
�a����>}Z]�v��H5V�c��~���� WWW����������������T��*֦�޿IIIJKK�t�`pܸq�
�Pp�zW�K�����"Ç������߯O?�T�~���}�]mڴI3g��رc�ԯ����]�r���VVV�$kkk�e�6S@݋��S\\��1h2`tu�駟6:� ���Z�z�V�Xat��?�RRR�ه��µk����jΜ9���������c����Dk���ruuU�^�H
0
��qrr�������u��I�ٳG|�"""̅����⢬�,m۶M...U�Һuk���*//O�[�.�,//��P�f͚%�c�]�����@�HJJ2:����GU�fܾ�4,Z�H:t�̙3��R#)))FG(S}���W\\���ߊ���֭[��{�5����VXS��ڵkZ�d�|}}��nj���0%''���>c�7ր�ѣG+''G�-��~�;=����?�!I����r�!C�hÆ


�…����_~ѦM������]�֭�t{����begg�cǎ���]�*77WYYY�YYY�>��ׯ_?b����(((Ѐ��K/)<<��8P�<���$}��'%�3��gee�x@�f��֭[��w�	�����k„	涉'*>>^111
60�>Yh&O�,IZ�r�����+44T����V�~S�LQ�Ν������@���O#F�Ї~({{{͝;�����Y���0F�%I0`�$)##�"��mРA�s��E�Z�r�^�u�޽��8P����5o�<yyyi�����/j���z��g��驰�0�ٷ��@o������տ�5J��
�}���K�|��ʬ�zG��СCT����H�V���5t�P�vyyy
		��5d����+�z�j�yL�Ϝ9���`
8P�>��V�X�k׮U���������������oh�ȑ������?���]�r�R�F��ky��UUM����_���٣�� yyy�3�^��|��{����+!!A}��U�6m�}ڶm+www%$$(??���poa��!L9:f�5k�LIII:{��$�C�4h��Ȣ*����_������ղeK���)((H�=������;�(77��ֈ#��o�z�Jd=p�5lذ:;�����)..��4
0:��/jϞ=�4i��?��m�	�D||����z�O�����S�*''����[<�.I���


�ɓ'�m�ΝStt�222i.((Ku֏��P~~~��%iժU���ͯ��}�o�^�����_�~]۷o����^y�
�Ì3���g^o��ͺu�y����$���֚5k$ɢ��ʕ+z����%)77Wqqq:|�����բE�
�M]_��Ee��1�T���]�VQQQ%�������]�|Y˗//7�Ν;UPP OOO�e���:|��v�ڥ�c�V��e\�I*��Koooy{{�u��srrҼy�4o޼
�
>\Ç/�ֲeK���+**J999j߾�$)''GǏ׌3,��ԎY�f�����Pc���3:P)IIIFG@�n�:���iҤIڹs�]h�{͵k״x�bM�2E�{���}�����Q��E���:q№.]j�wӦM:y�z�쩐�u��EYYY
��Ç�u�V����ȑ#�Y�[���裏*::Zvvv%�322�N�:i�ƍZ�n�V�\)WWWm޼Ym۶�|������/���y�ԩ��-[��~XQQQ���־}����.��-����[ӧO/Ѷq�F�={V�۷ן��gu��]'O�Ԓ%Kt��mذA������������T���1�T�����K�-Z�Q�F���J'N�Ќ3t�s�޿������ݻ[��-55��h"(��ɓ'k��튍��…%I���rqqQ``������ׯ)P����������I�������믿�ŋ	u���XVVVF�ꍽ��V�\)//�z����%I!!!�ѣ�$���M�/��ٳK�ݽ{�$)<<\�ڵ�t���e˖���G;v�p��X���-��?.I�׺u��믿*$$D�:u�$M�4I�ׯ7�\Q���cǎ�nϺ�˗/�ڱ�)33S���+1߾}�$I���z��'%IO=��BBB���/k�޽���M]_��Ee��1�T����*..֩S���g��~�7�|#�9}��$���Ν;��h�(�@�U��5U�S�V�����-[�ٳgkҤI���[�j͚5���78u�O�>Z�j�,X�g�yF���FGBY�x�233��'��7VVV�8qb�m��{����?��$��7)k����lI�gh(˙3g*�Q��M��ֵkW��-Z�0�ܥK���ӝ�999I�nݺen���y��ի����o($$D�/_����$)''G���;����?�l���禮�ey�B����8F��^�.h�ܹ:u�Ų���
�K�.]�$�j��b�����Qp4`}��Qpp�V�^-I�9s����N@ݚ5k�������ltԡ�m�j����r��C�6o��򱁻=�~���~y3*4o޼�vkk�
�Q[[[��e��S�c���-[j�Сz��4f�EEE�.�sg�Gi��M]_˚�nQ���Iu���U�t��)u��A�<�t�=zhܸqw�iz_��S�����
ֽ2E]�����1�7VVVz�7���:ֿ]�tI��}��T_E�X;t蠳g���ѣ%f��Ȱ���⢬�,m۶M...U�Q��T��%I�/_6��k�N?����?�~���ۏ?n���絬��8ƚJKK�$EGG�8Ϟ=k^^TTTf��$�n�Z������S�֭K,���3�4
��j���M-Z�����4	�=��$)<<\G�UQQ����;���k}�"I


Uff�n޼��/ꭷޒ�������}M#�gggWk���6�ߺuK����,I�ѣ�y�������!==]EEEJOO׊+$I�
����Z֖�8��r��!*33Saaa�vSLY�_S`VV��Lm
@��]�f������T��0:��jϞ=:}���O�nn1b�Ń�S�L��������������5w�\�kggg]�tIcƌ�����m�V����fwww/����V����ד'O�޽{�����S���۱cG����յ�-�q�5���;vh�ҥZ�t�����Lyzz���0`�RRR���!77��f�Ϣ�����!��ﯴ�4�cu�����fvvvZ�~�|}}���,;;;
6L���}-������FNNN���҆
J��`��o�^666*,,��
Mmdo֬�z�!
:T��z��e^֪U+���hܸqjӦ�lllԦMM�8Q6l����]�_Wײ���1�ԟ��'
>\���S�=�b�
s�Jbb���߿#F�P�-t���8p@���6lX��a�*nH��� I���5�����������V$''K��7F���Рn���f۶m���х���lt�ֽ��JII�'�|R�m�u?���jϺu��-[��}���������hƌ�6m��:��r?f�@��ׯ�
???�NVPP�������Ejٲ�~�������ŋZ�|��u�ftU4y�d�m۶DASll�\\\h`2@}kft4^�f�ҬY������H-_�\G���F⡇�/��"kkƉC�|�r���i���FGPEZ�l�fϞ�I�&I��nݪ5k������t��D��L@@���⌎��)�̝;W�|�&L����4xl$(�@c�����k�*22RNNNF�P
}��Qpp�V�^-I�9s����N�o\�N��ږ�b�Uqqqڲe��1�&���V����ݻ��ϟ�w�y��HP���[�nz�����������ot��(�@���󓟟��1��nܸA��t��Y�����4t�P�;��HP�_|�m۶i׮]���1:j��ypO�UPP��M�����8`V\\�h�ȑ6l��qPC�pԢӧO�k׮e.KJJRZZ�$���C�ƍ��h4*JMM�ĉu�5k�m/Ƴ��Һu�Ժuk�����3PK�ϟ���9r�bٱc����Dk���ruuU�^�H
����AIII:|�0��z�W\\�nܸQo�P���d�#��>�$%%��k׮iɒ%����$i̘1
Srr��3&�F�n�ԭ[7�c�����/4`����F��	�����h@������\�p���T���ALL�Ο?�	&��&N����x���(88�t�+,,��ѣ�������F��	�f�ҬY���ШQp�&�֭[Z�~�v�ڥs�����V]�t��ѣ���S�oAA�����{�n��_�҃>�����6m����$����;>r���󕐐��}��M�6�>m۶����4i�$�jժ��ajժ�z�쩯������gt�P�(�@���7�_߸qC'N�Љ't��UH�=�RPP�N�<i�{��9EGG+##C������.w?;w�TAA�<==-�yzz����ڵk�Ǝ[�Gp��߿���Ҍ��Slmmkt����e��cjh�>��cI��o�-wwwݸqC;v��ʕ+���h.�شi�N�<��={*$$D]�tQVV����u��amݺU>>>:r�H��-LRSS%Iݻw��`jKMM��4yІ
t��u�������bݼyS͚s����O~~~��@I7nܠ����ꈻ�{�?wk�-Z��$���*))I�������#G�h�֭�~�w�$������U666z��G�l�2IҎ;*���ӧ%I�:u�Xֹs�}@툋�ӥK����*������u��Q�������޽{�ڵkFG@`�4Is��ѫ�����4���i�ڵ�:u����K�����-I�.s;gΜ�p?��9�Z��Xfj���ʕ+Z�x������'������H���{L?��������itம_��E�iȐ!rpp0:N���;r�H��?}���v�Z��j���T�T��3ԕ��kRR����$�.�7n\}F��Pp�zW�ˤ����NÇ������߯O?�T�~���}�]mڴI3g��رc%ݞ�"W�\�p��&����d2�6n�P{+///EFF���ёP����ꫯ4o�<��w�.��^3:���ϟ����{��e��;vL���JLLTqq�Ə/WWW���ˀ��-
.�d999���[���:y��٣>�@�eeei۶mrqq��>Z�n���\���u��%������3p�@���Z�`� 777�#��^x���_�2:pW���Z�r�.\�v���P)))FG(S}�4�����k״d�����3FaaaJNN��g{�4�a��&`���rww�G}���=���ruu�$��ښ�
2D����LݼyS/^�[o�%www���f����6���W��ʲ�`jkhS��,Z�HԄ	���otT����^z�%�cw�d����Z�`��Q�z����k„	涉'�󊉉10u��4I�'O�$�\�R�V���*I%F��2e�:w���t�_�~1b�>��C���k�ܹ���Βn��1j�(IҀ$ILm�
��#�i���ѦM�t��e�����q4"��銉��k���-Z�J.^���˗��g��������TPPPf߂������V���5j�(���*,,4�qww/��+����=zTC�5zgj/**ҪU�4x�`
:T�֭�$���)$$DԐ!C��+���ի��1�>s挂��5p�@=��Z�b��]�V�c����|���9r�<<<���+""BW�\���"I{��QPP�����V�^m~/�w]��󕐐��}��M�6�>m۶����(r4:͌1��1cԬY3%%%��ٳ��:hРA�bIrttTtt���}�۷O�ϟW˖-��榠� =��c�,�;C��\�m#F�Лo���^(��rtt԰a���hz\\\�q�F=��s=z�������X�x����ht�*����ԩS���cn����-Ɨ���B��ɓ�s��)::Z�����u��;Vg������x�_�V�Z��?������W��한�l���׵}�vY[[�W^��<̘1Cyyy�6oެ[�n���W�ʕ+z����%)77Wqqq:|�����-�xj���]�VQQQ%�������]�|Y˗//7�Ν;UPP OOO�e���:|��v�ڥ�c�V���1��,ooomڴI�������_~Y�Z�*����I���Ӷm���_k�޽Z�zu�bI>|�>��S}���ڹs�$�e˖�����K|q�����Ǐ+00���{���Õ����#G@#�v�ZEGG�����(U��*''G:t�|�C�i�����,�nڴI'O�TϞ=����ZIII�ի�>��[�J*9�ޑ#G̯+���}�Q���Z<👑���x<x�<��ʕ+ecc�͛7+55UӧO�$}��w=�:u�����TM�:U��o߾*{i�� J���ƍu��Y�o�^���:t萢��Ԯ];�9sF6l���/IZ�h�RSSu��A��o�t{�@��뚚�*I�޽�ENS���@�<y�ڶm���Xs[ll�\\\�Qo��;��Ԛ�;�gϞFǨ����K�BBBԣG������M�/��{�nIRxx�\]]ecc�G}T˖-�$�ر��}Ug���@���Y�/Z�H�?������ IDAT����/I���_�N�:�y��4i�$�g���…ձcG5o�\��˗/�ڱW�T��'�|R���zꩧ"Iڻw��:�}^���K}��7z�'��g�魷��믿.�9}����E+�u�ܹD�fF�Sz���r�h����A˖-��ٳ�_hmݺUk֬���}�f�x�u��t�~�$=��%�����b���lI���w��9s�L�9����Һv�j����.]��vpp�0ϝ�\���I�t��-s[u��2��srr$IO=�T�v�5���-֩��r��͝;W�N��XV\\\Az�ҥK��V�ZY,3����XPpԃ>}�(88X�W��$͜9Snnn��T��/�P}�f��
���̈́P��˚�A��7o^f���u��(�����g+++��5=�긳ࣴ�>/�V�ҩS�ԡC=��3�ҥ�z��q���5��|��S[Y��{h��{&�����o����t��q�����Q�{JE�X;t蠳g���ѣ���4�gddX�uqqQVV��m�&�*��F����ڵӏ?���Ǐ�_�~��Ǐ��]����$I���rvv�$�={ּ�����"Ijݺ�rss����֭[�X���g�@cR�!��\�|Y7n��H�*�瞓$�����ѣ***�w�}��^{͢�!C$I�������͛7u��E���[rwwWPP���iF����j����ev///I��Azz��������+VH�
T�u��!*33Saaa�˗/K*��v��U����e�=S���3\������޽{5k�,�������t�N�:�'�x��8h�\�"GGG�c�X``���٣ӧOk����#FX<@?e��߿_���
,����^s��5�vvv֥K�4f����h۶mUZ�����'O�޽{�����S��XֱcG������;vh�ҥZ�t�����Lyzz�y]���edd��ͭ�z��R�h���hr���Gs���g�}ft�ᩧ�R�-t��!����ۻw�:t���FG�1;;;�_�^���rvv�����
���P������������\\\dcc#'''yyyiÆ
%f1X�`�ڷo/Vy���.��j�J1117n�ڴi#�i�F'NԆ
���T�GR�?��O>|�dgg�=zhŊ�"���DIe_�#F�E�:p��v8 GGG
6�Ώ��dU�<��%����X����d�k�����i˖-�������t��=�^�Ν;u��q����:T�<򈢢����&�֭[�ӧ�\\\�c���y?���@}X�n�����e��o�^����#͘1CӦM38�qJ�?�~"4͌���ƍ7n��1,���rwwW``�v��%�#������͛���&lÆ
��Ƞ����ɓ�}�v���j�…�n����(00��t�>k��񊍍Uqq1���4�?GGG���+55U���F�A)������K�.MЕ+W�3f�'�0:�`888hٲeںu�Ν;�s��i�֭Z�l���퍎@�c�ԙ5k�諯�2:Ԫ��$�#�E�{���ի5g�=��3<x�ё�<==%I���?op45�����_��W^y��(@�ӧOk��Ւ��3g�����T�
.Pg���k%''�����(Pc���FGPGfΜ�={�襗^ҩS�dm�$�
�<�S�N���7:
����l���Z�|�z�!��
���������@���u���_���F�����S@@��1�+++EGG+77�b��k׮FG@�z�j�k�N������1�<gggu������_]۶mS��͍��Qp��qpp���fFꚻ��$�ȑ#��kj���l��ӧO��T�IIIJKK�$yxxhܸq���JNN�����1���Ƈ�� ���WJJJ�
5*r��1EFF*11Q���?~�\]]իW�Z�cݸq����@%�vaDJJJ�nO��]��%K����W...��1c�(,,L���rpp��}��������2���P����[��Qpù��K�����(&&F�ϟׄ	�m'NT||�bbbl`:@cakk�M<����#4X�;w��̙��ݻ�I�t����բE��
ƚ5k��W_@)IIIFG�"
.���ٳG�������������K���%�T�x��y�����ڵk:t�BBB��fU�V���$!!AJOOW������3g��}�������ׯׂ��⢟~�I�����emmm^/;;[cƌQ���駟*??_			�۷�ڴic�׶m[���+!!A�&MR�V�j�8M���������jɖ-[���`���)##C�Ǐ��_�L�)((��?���x�����?��O=���FǨ����Z���|_4���FG�
.Р�]�VQQQ%�rss����˗/k��咤��|M�:U999�~����^�j�ͪ�3f(//O�t��um޼Y�n�Rhh�]׍��P~~��(::Z_|�n���_J�,Iڹs�


���i�=OOO>|X�v��رck��h�5k���8���[s�����7�#5I-Z�PϞ=u��!
.P�N�8��}�*%%E���3:N����3#1�@���1�(4B\�A����$-Z�H�F�����N�8�3f��~~��rrrԡC��/����N�8��K�Zl�*}�t��9rĢ�S�NZ�l�~�aEEE)::Z���Shhh��,�Z��GUtt���씗����mذ�̂�A�I�RSS%��)�Mm���\jU@@���⌎��r*�S�N���Ҙ1c4t�P�?��HMҀt��A�c��?�~�ߨo߾FG@D��]y��ۏ9�/��R���:u�>��3�����o$IW�\1�ݿ�$)$$D=z�$���i��Ś={v��V�oM,\�P;v�t�a���h]�|�R����N�t�}����W7n������|}��jٲ����$I�O��t��Oi�;w.���dkk���Ci��~�����_֌3���O�G1:R�����{Oׯ_�����q�Hl߾]�w�VJJ���������4h.\�ܹsu��)�e������'IғO>Y�O�޽-֫J�;�5EE�t�b����I�t�֭J�k*�0	Tbb�bbb��驃��͛�߿��5����K�$I�Z��؞��������'???�c�Jڲe���I�W�Vjj�&L���NB�0`�
u��Qyzz�@QQ�,X��c�j��Fǩ7�ϟ�_��W>|X7nܐ���^~�e�cU��ӧյkW����+���{���NIIIJKK�t�hlܸq��P�(�@�+�E������Z�j�N�:�:�g�Q�.]ԣG�/�L�waH2#T�oM��ښ����Һ�o�<�;v���┑��H�
d���F�1�U5��y�抏�����6oެ�'�Iy�GԶm[}��W\�V�]�V������FG�Waaa:z��LSu���WJJJ�O�f�cǎ)22R���*..������^�z��h�L#~DGG���Y�t��Y��"5k�L:t�ٳg-F5��Ȱ�fU�6$�&M�G}���D<xP���0`�yy�֭������<�nݺĺyyy�>����\�m���@��m��6���]�*==]�<��Q�������5��/���W_������7���n����GEEE'��������W�Y$�ڵkZ�d�|}}���"I3f���”��,�:�j��P�@t��!*33Saaa�˗/K��{�9IRxx��=���"}��wz��,�U��u�4�Dvvv��?��C=z�>��s]�|Y���ot����������ʲX��V�t�4E_}��^z�%u��]-Z�P���աC���j���Fǫ7VVVu2���*$$D��������5k&ggg=���


-QD{�y�Խ{�2����,�K�1��޽{k�����~�m�V���>��/�؍<'
�}۳gOYYY�رc����QYYY�7��M��W�ץ6�YE�
��9r�|�A�c�������u���M������]��ֲ��38Q�����k„	涉'�󊉉10�
.РyyyI��.]*OOO��7/��̔$�k׮����������ɓ'�[�n۬J�;���W���L3v�3F�F���:/���%I�
*��4�EY3u��J�@St��y��w�ӠA���+33S׮]Saa�~��'m޼Y�?��F�i.�D�믚={�\]]�b�
>|X���n޼�_~�E�|�������9s���_5:r�M�>]����1��t��?�7�xCO<�6m�dt�z���5���ɓ%IQQQ��o�gZ��h��h�^|�E�_���h�Ν����3:J���f߾}K�����o���#G���C�?��"""t���m�����ѣ:t����J�iժU<x���u��I������jȐ!z�Wt����޳g�������eΰz�jX��=ڂ������V���5j�(���*,,4�	

����v��Qb��?�\���Z�hQ�Y��󕐐��}���c���r����?:�#�D51��Sm�1�sV9�dl>�br�)͇��5%VI36
Ü��Ri�rȤ�LEg��]�oW�AW.��q�ݮ��^��p]�~�_����X�m۶pssC\\JKKU���������4�.H�RRR.��G���FFF��ׇ��֮]�3fv�����Gxx8F�
���c�

�iS��O҂`kk�xʘ������#�7h� ����2�N�>
SSS8��&""z�ݼy�z���acc�����…(++Cee%rrr�j�*�������g|�G������q�F���`�ԩ8t�nݺ���j�ȑ#�2e
���?ǠA���A�� �m
qH^UUU�y�&~��6�4i�ܕ��6���
��c>q�D��� &&J�VTT 66����Uk��'"""""����҂�����h2�ݻ�iӦa�Ν�y�&jjjPXX���XL�>]�PWXXJKK���u����2���`�֭HHH��~�Ç������ؿ?֯_/�ꫯ�p�B����޽{bqqq

U�vVUUa�̙ؾ};nܸ���j 22s��Emm-`ѢE���ºu�PXX(,,Dhh(����x�b�}:teeepww��swwGYY>���!""""""��CW�)cff����y�A&&&X�h-Z$�.o0�*e
QDQ��鞞����T�����ڷo��;J噘������χ��- ??�������J�BDD��L�:�/_ƛo��~�-[����ԩ�,Y�#F�w��8y�$�lق>�@C?[q��	�o�{��E��ݥ�[�j�`������兓'O"  �7o�P��===XYY᭷��[o���bݺu�ǥK�```���~盶�m�bРA8p����ooo�e���{ܽ{C�E۶m�b�DDDDDDD�GJJ��C��;v��˗akk�U�V�s������ҥK������(̚5K���;"22���R�YYYعs'ڷo�;v`˖-

���#���{�m�۷oGxx8N�:%�۹s'����
---dff���_�pNQ�
���l8;;c��Ű��G^^BBBp��Y�۷#F����V�X�Y�faٲeزe��"Ǻu�`nn�0�3g�:w�,ӿ$�̙35j����fp��g@YY�����7�x8�<�'OF۶m#������Z�5D^^f̘;;;���>>>��Ζ[^KK둯�RRR0f���?����>���h�"���O�>���?�����#��u]����i������ɓakk}}}���bʔ)�믿�n�;w������,,,��关g�ʭ��_a�̙ppp���Z�l	WWW�X�w�ޕ[G�ؔQ�]�t	�6m���:$3آ>WWW�߿zzzزe.^�(���x7$_���~���KEq=�s��֮]���c���
��������~�>}��u����Յ��%��'N��c����lL�0VVV��ׇ��Ƭ��|c�z�
��k��dś����G�/)��sR�O�4	�������K/���?�\i[��Րc#��1�!//���011��a��7�������yt��q@PP�v�
===t��M\��رc2u|}}e[L���K���'W�����ŋѾ}{��:����z�N�¹s�ХK<x��9>������XG�������:::�ر#���˾��k�Fjj*�M�����Ǐ�믿���u�����u��A�=#"5����~��suu_&Ljjj�MII<<<�7n7n�<<<����)FK�<���u�٬���y�ʿ��N����2/CCCa���2u䕭�222�*%����-۽{w�޽{b�3f��K�6h[+**�ӧO���R�?��`dd$�O�ȑ#
�+99Y044�����/���RuΞ=+���)�:t
�[}���?�X ̝;�A�W���_ ,X��Aq�;nU���sSY\O�i�~�k�֭a�رJ�())\\\n���������X�?>,����������)|��ޘ�ˆ��5�󶢢B�������˗/˴)�p��%AKKKhժ�PYY��sR^����n�ڵk��Q5����9���ߏ7N��~'"""R���8���G�aQ3א����W�����իW/���U����J���\]]�^�z�ԯ
E�^�
I����q��m���Wn�u�ɋ�>Ee�������*���O�|ee�0n�8���U3f��m��G�r���=WWW�gϞJ�g�'5O\��`eexxx��>����²����5k֯_����c���pqqy��w���ѣQZZ�y��᯿�Byy9���0}�tTUU���R�A�y�����[�n�_�r���x��fΜ�+W����
�N��������� 110t��m����x�
�Y�
1~�x���c������Bee%���0|�pܿcǎEaa��6�����o#11���lj'`oo���*�^�Z��y�PZZ���{�����PVV��Ǐ�K�.�z�*V�X����j��;z�(`�ȑ
ڿ�Ǐ �<U5&nU��䜔�{�*�4�U������T��BCC���
'''$&&���HNNF�^� ֬YӠ>�?�޽ooo�΅PYY���T�����ܾ��w�!sު����[�?�  22Rn{���&L����Z�Iyn߾-�s�ƍCNN*++�����*l[ոul�8���_���Dqq16l���ADDDD
ӦM�����/��t(DDjS[[�0O���ÿ����V�hºu����]�v�������`@�@=+iHV�����4e+�Q�FvP��2��9�4D5�����$��y��)͗HJJtuu�G}$�(w�nA�s��	���	$LLLBqq��>�Y�x�@�ׯ�̌l<���'w��g�9s�L�ǎ-[��J���������666j�����-Z���"�u�s�@077d\O"nU��b���4ϙG�V��������6ڷo/��j�_�%�
E�4f�[�N���~���j�gϞr�j
���uު���,�q� IDAT&yyO������/� �_MM�`kk+Ν;'�z�Iy�V�C��)[]]-���Kn[��q���_-Ӧ�~'"""z2�.]*
����t钦CPu�='oU�Q�F	���Brr�T����*���
#G�TZ_�{�\]]�;w�i�.]�UWW+m�!}�9Rpuunܸ���DXX����*L�8Qpuu6l���~�*���
���L{������*���;
꟞=��HDDDDD�<q�""""R����>����ӧO>|Xa��Ř0ajjj0h� �]�V*��_~̚5K����A��+WĴ��r����
["�ȑ#���@�ʴ���p�B����֟={�L�믿())�Jo׮`Ȑ!������-�999A���-��s�$�����?���$��߿�R=y���YUO�Q���!���Ri��W�B��������(��			���������ŋ����
ј�V��?U=���_G�Νq��u:tH*�СC��χ��3�������GrLd�tuu��O�q=�qx��7���������q�ơ��L��4kIIIؼy��àg����W^yqqq����۷/ $$���AFF�xM�w��O-���$TUU!''K�,�%�$�C\�vM���

BNN<x���"|���pss�̙3Ų�ΝCll,^}�UDFF���;w�Ĺs��2�b�ԩ //O�I��=8�����.;;`mm
---����௿�R�ƌ3p��U888`�Ν��ё����t�֭A1I�/--Uy{$$�J�O�.��>�4@mm�T��!�$������vvv�:u*��ك��*��VWc������G�_��x�TO]q���U�4�UI��2H����HHH�ҥK���	kkk� 
�ߘ����x�����ի����o�Ɯ�����J���ɓR�ϒ������?�������ٳ�#�PG\�{$ʈ��������ALLn޼�9s�h:�f-55AAA���1=���ЦM���ɚ<y2��쐟�???���~~~�q��������c��X�l������?��S����XXXF��aÆ��ǔ)SСCddd���=z�A������������zRpp0����r�J��ꊟ�/_.^o��������U�$�i`!""""""���DDDD�v
�y_Q��[�">>fff����WuIVTh���%7����F��FZ�-�733�x�Ɋ
1e��ٳGj��QQQ5j�t�˗/�-��s����
�+!)/���q4&nU�����9�*�
����,�k�.������^^^X�z5�9�۷o��gc���x)ҲeK��M�;��9oU��S�&�ۉ'BGG���ϫ۷o#!!����*��sR�K���֭[+��θ�8�c �����������Ν;5N������bq�4�"�ΝCtt4>��h:�&���۶m�رcaeeXYYa„	���RyU��裏���	###������	k׮Ō3<��,X[[[���<Y���)"##���
kkk�����}��ETT���Dhh(n޼���@���lll�[�n!44Ta,�
���1N�>-��ӧajj��6n'�F�j:j�bcc��0����)311AII	�޽��AQE�������������ѥK�}����޽{
�w��HII��C�УG�G����?��k�aذa�������ݻwQ\\�V�Z�Թ{���:���x��wq��5=z���HLLğ��K�.a�ܹطo��ck��8p Ν;�ݻw���5D||<���]n� ��ҒJ���P[܀j�YUO��Qʼn'(�=_"66>>>��_~cƌA�`ii�Ν;��m�1�CR��ݻrtW��ʳ�o�y��4q����`���矱c�̟?;v�@uu5���mۊe�yN�cff���b�ۯh����jʿDDDD�������c��͘0a���i�^y����"11Q\��>Awww�=Z��4)))r�[�h���@6��㦛��!$$DnYɠ��􄧧g�bN�����e֬Y�5k�Ȥ:C�U���	������|q����|�����ߟ�$=c8��9s�`Ĉ�����4���������_��o7�^EEƏ���2�\�^^^
����#==YYY�2�ʌ?�~�)���+̛7O���{��EII����������q��Y<X��o��&�S';;;L�:S�N���O6l�����ck��>}:֭[��[�b�̙pvv�ʿ�>�w�OOO|���ԩ�����7���(��ڨ��EYY���ė.]R[�u5d?�JS�̣<x�����aÆ)-+���e����K���kkk���|���ggg$&&���{3]�
�g�;ߘ�V��?Ui꼝2e
~��gl߾���Ƕm����yN�ӥK$%%!99C���OMM�[O�q5��""""j�
6���V�a4[:::x��ב��,�o"��gΜ�o��&3�ѓ4y�d�߿111����X[[ˬ�IDDDDDDDM��O=���5k֠��F&?>>ZZZ2�.X�9r$�,Y���~��"""d򲲲����:�i���:���B�7eee
۾~�:֯_mmm,X�@L4h`ݺu2M���b������zKi�
ѡChii�…2y�V�Pgl�9~/��",X���J2D�䌌ܽ{�7o���fϞ���~���0`���#U���p��Y��###�����x��!�<�sFK�,�����w�yGi���\�ĉe���������1���w���a%A��� ֩�Y��7�U��x6���Ç�e˖���DLL.\��V�Z��S�9�(

Ńd��s��Kѱi��DDDD�0������	���@RR��à&���������k����p�9cdd���`�۷(((��}�CCCM�GDDDDDDD������[���/���Y�$bbb�>=/�{_����ׅ-Z���zK��߄��r�رcŒ3}}}AWWWHKK���k׮½{�˟�)��?�X(,,�߿/=zTprr˗/��s�����R ���¦M��K�.	���BYY����)�[�NhӦ�@X�l�T����[033Ç.\� TVV
.\�.�����W�Jի�R���E�	�Ν;��ݻ'TWW��� A�˜1c�Hl�9~� 555»�+���???�ȑ#�?��#TWW���Œ3�~W-,,����[f�HbvppN�>-������¼y�CCC�ŭ�~A���}��P]]-TVV*ܟO�Q�^]]-ܸqCطo����)��'O>�
������BMM����%L�8Q�X���=2��쏒����V �5J�������.��`bb�p���w^]�mc~���y[����@<n�gϖ)��sR^zqq�`mm-
$��������!�3Fhժ�ܶ��c󤎃 4��s""""����֭[�����Q011�]���PԊ�=[bbb���!  @����t8�Կ��DDDDDD���#��>"j�x���!U��߿�`dd�pӗ_~)U���U��O� �����r�z����e����^z�%�}����<x-�o�>�A�/a�޽2u�rqq�йsg�1����<d���T=~555Bpp��8�>��c���F��s��I
���
W[܍��}��Ux^ʋ�i�3u��255�ۯ������K��ߧݻw7(�����D��u_����V���W�M�߿�|�֕��$�׹s�dʨ�������$�l�Rn;v�[��q);6O�8�~'"""�桨�H�����ۧ�P��*((�tjǿ爚6�O$"""""j��ADDDD�2������C�v���-Z`�8|�0��}��.]R�???�<yo��6Z�l	}}}����X�j�?.wyvgggdff"<<����5���`hhGGG���#--
+V����a��
___X[[CWW��֘4i���0b���Csss$%%��?F�.]`dd]]]888`���HKKC���Xl�?	,_�W�\��իѻwo�n�:::044D���1t�P�_�˗/���֮]�7�xC�777�9s^^^������>z�聟~�	����n�~޶m����^P�/��9����.,--�����`���6���{۷oǫ��
���c���駟�r�J,]��e˖�ט������tL�4I����ݻwc���ccc��=��|�T��{V�۞={��_��ع��ɔQ�9�(��������s�Έ���ĉ��il\ʎMS�� """"j�Z�j������j:j�ڶm������������A�t�<���bbb�~&"z��������6�&z^��{R���<�[����8~���ágХK����GGG\�xQ��=��9�����B[��Q���9�����������']M@�)/^D�N���:u
?�����PRR333���+9r������[2kkJJ�c��N���HNN�p�ױc�j8""""jnڷo�͛7k:jŒ��Q^^�?��/��L�֭[�3�Q�w��M4[�lAϞ=55\�si���8y�����J,[�G��J���q��)�:u
Ċ+����־����4lڴ	�v� 7n�ꫯj:4""""z����'N���q�~�z����r�
�n݊����3fh8R""""""嬬�`cc�	& --
-[��tHD����"66V�a5[pAϥ�'O�M_�f
�=
SSSL�>���G�6mP\\���dlٲG����V�\��������r,]��G����5`�ȑX�d	���;i8B""""z^lذo�������[o��kii!44}��}���@KKQQQ�֭����k�.M�DDϸ9s�`Ĉ����������Y��tDnnnpss�tHOOǁ`nn���(������:::hժ����(�j�
@FF��C~b�mۆ[�na���bڄ	p��-l۶M�����������;w.:w�###����^�����믿b�…��������A������b����t8D�FVVjjj45C\ႚ���7nDbb"���aoo�I�&a����W�(++CDD�9�۷o���o��6�O�}}}��!y�����0i�$t��An,�Z����/6n܈�{��k׮R�9s���8r����o`Μ9���T�w����DZc�PTTKKK���3f̀���L;qqqCFF0`�̝;W\�������8|�0


���{{{>\j���R�����^�����޶m[���!..'N������FDDDD�6/��>��SM�ADDDDD��…1o�<xxx���I�!=��޽�~��!  ����y�6n܈��XM�AD����������H�8�����c���~������#�����
3g�Dvv��VPP���HdeeaӦM��V�����}��Q�o���7"--M&�O>ABB���@zz:���ann�|c�w��M��˗/�i�������ٳg	ccc�:���(..�����Q[[��� ��M��c��|uu5233����������p��!������]&.www�={�ƨQ��=DDDDDDDDDDD�V�\�'N`ܸq8w�8y�n������C�ooo���h:"+�w'"""""��C���DM@LL�_�DFF"))	���R+/HDGG#;;��Έ���o�����x���8{�,���@z������۷���Jcz��nݒ�KLL�ƍ������H����ƍ���V�w};v��˗akk+nwDDlll������(�:�۷Ǟ={p������?.��ٳ��_ ))	�N�¢E��v�˝9sйsg�>$i�2DDDDDDDDDDD�:]]]��Ƣ�����������+����t(��.]¦M���-[j:""""""""j�8�:777���tɀ��� t��zzzpqq��%Kd�=r� $$������Aǎ8p�Ҹ���<�ɡ�d�Oyˀ.Z�������C׮]��%�|hy�ݭ[7qe�cǎ��	����Y3JJJ�|Ɋ111���ǿ���ѣG#%%E�/^�pG}:t�*CDDDDDDDDDDD�ӡC������Cӡ<�ttt```�_�Uӡ��cǎ�9s��C!"""""""�fJ���D����޽�T����L�k׮���䶕����/+++���vvv
�������ٳ���W_}p��u�}+�[�nR�p��
�:����{sss@mm��6w�\�X����HNN�W_}???x{{���P,w������L�4I"""""""""""j<M��,���III����S�NaϞ=ؿ�#'T���ŋѩS�Fׯ;y����1m�4���?Nx��'%%剴���d�{�;���CDDDDDD��'z��_jȅ���Ihii=�L}���S�߽{w��ѣ�:u��rG���W�b�d����z��;��>===���鉞={�ĉ���q��y|�嗈����ٳ1j�(���b���k����_�������tDDD�oooM�@DDDD�6GYY���75o������1d�M�CM���q��I�N(//���1w�\lڴ	����Z�ה��4lڴ	�v� 7n�	��������gpAMZ�v�p��%�?^�b���e�Z[[#//			���V��Q�F�ضmz��
�2��'v��1b�L~FF��L'iii�_|Q�Xlllp��U����G�bzzz:4j���+_xyy������8z�(�oߎ��0q�E�֭QXX���b�n�Z�~qq�X����̙#��D"""jڔ��HDDDD��ٳ'�������>}�h:z
���������DM�BM�ɓ'�֖dІ ����i�&�۷�|�M�pQ^^��K�b����}�#Gbɒ%���`dd���������4K=��=!�]�YYY���Aff&֮]+S�_�~��� ����(**��777̜9S,+Y��ڵkbZ�n�0t�P���a��鈍��͛7QSS���BDGG��Cyy9,w6�5kֈq���!$$0h� �}�׷o_@HH222PSS���q�{���W�������ݻw���/��H��!YV7//O�
I��,�KDDDDDDDDDDD�N:t���
���5
=%��θ~�:���5
=G���ЪU+̙3p��
G�۶mí[�0~�x1m„	�u��mۦ�Ȉ��������pAM���~��g\�zS�LQZvʔ)8q�222���+�ghh�y�扟-,,p���9���HHH�p�Fee%~�����!,,L��~��a�ҥrchժ�L�]�t��q��w]�'OƱc�p��5���I����ɤ5��ɓ���P���J幸���=<<p��IdeeI�@VV��
� "��i�ƍ����tDDD�"ooo���h:""""R�����������3g�h:z�LMM5�3���ƍ������r���cҤIX�x1��[�����#G���۰����o���ӧC___,������CXX222```�`�ܹR+$��fxx8,XGGGlٲp��Q|��w���AEE,--ѷo_̚5���bݺ�H����+���p^Ky�`ii)���q��1������nj3��+۾��"l޼'O�Dyy9���/��w���"..��������m۶������0q�D���5h�5GpAW��]}FFFǦM�p��)ܻw;v@�� IDAT���/�-[&u�������غu+�?�[�n���...�9s&IJ,��͛QXX���*1]__���8u���݋��L����E�x�W0b��KQ���a���HNNF�V�0x�`��Y������۶m��_�'N����[��[o����{���
ڷu�9��������˗�ڵC�޽1y�d�ܠA���g����Ә4i�T�O��������6����5>>>�������X�h233��O?��fӣ���QQQ���I��>�O���ׯ�i999r毪��̙3���-� 22YYYشi�8�@����������Q[[����F����Rq0�W_}����2������CII	V�\�p��}���/6n�>|�T޽{�0m�4�^�$���X�={���066V�}������C~~�X�����ղ=��;t�������.Ӿ��;Ξ=�ÇcԨQJ�Qs���j�
˖-�J+((XZZJ����#  J���􄧧��>}�(X�H�-��g��ܷ�A'-Z�@`` ���h���t///xyy)m�����ވ��@~~>lmm���HOO����̅@"""""""""""R///lذ�~��#�w�������!&&ׯ_���
V�^�Ν;#33K�,��[���FGG#;;���X�x1��푗�����={���È#��o����hӦ
"""��Ǐ�.�fǎ)Np�s�N�
6ZZZ��̄��?N�>
��}�+[4�R+fHxyyaƌRi;v��˗akk�U�V�s������ҥK������(̚5K�}�����G�v�z�j8::"33S�~����de�Ν;˴/I;s�\�sM��D֧O���a���())Amm-�\��+V�w����ɓ'�m۶R�����������������������ysww�ʕ+���+]%�����i:�&������ t��zzzpqq��%Kd�9rGGG���cǎ8p@�N`` ���``` ��XRR�Xm������ԩS8w��t邃���?�'�|��
�4�Errr�)!o�v��M\A�رc�ܾ'N/^'''�}���jٞ��]�x��2�u��A���+\P�6d��޽���

�ʳ����5�������������'��ۇ�7���P��ѳ�֭[2dZ�l�_~�ׯ_Lj#`ee��ͫ���ŋ�ԩS��;>>�����={b�رO34""""""���…q��1�?���077�tHD􌐷�d�V^^�I�\\\d�\�v
�Õ���͕I����K~�jkk�M�C�����͛�?��C�� r�}���U2�߿��~�
6l��ŋQRR�ѣG���ݺu��/��7nܐi���]�~еkW�m<����Ν;333���4I""""""��\P�&����r�
���ЦM���ӧO�����Cl�\]]1k�,�_�0{�l�[�������899I}vvv�XLM���q��I��V��ﴴ4lڴ	�v� 7n�ꫯ>�8��������G�����oѭ[7̚5��њ�H�RSSaggKKKM��,�������2��[M��J3�j��j�n�:���h׮�|�M�����ɩA�4���LLLп888`�ȑ���\(Rw�I}��Oc�Xuue�P��'mmm���4yǒ�������y�Ԥikk�����ޚE�溤����iS4�B�yw���&�wyy9�.]�ѣG���0r�H,Y��}�����f�DDDDDDDϭ�m�"**
C�ŀ0e�M�D����;v,��틭[�j:�&O�}�v���ҥK8�<^�u1����2e����������:��RG��Uy###aaa�|���_SS#wp����055����i666�z�*���ѣG1===]�Qڵk�˗/#55���b���z]�؞֭[������hݺ�T^qq�X��������y&;M�cpss_;v�������
qqq�/��B���y۶mí[�0~�x1m„	�u��mۦ�Ȉ�������?o��6,X���]ӡi�_|�7n`ٲe��7p�@�ڵk������dffb�ڵ2e���

BNN<x���"|���pss�̙3U�_�m&%%���
999X�d��.!Y��ڵkj��׮]êU�HO.Էo_@HH222PSS���q������<Xl#55555�p�֬Y#SV�өS'@^^�L�$MR��������y�.�����ٺy�&���K�9s���C�0i�$2D�\ii)���q��1������nj3ę���D������`���;w���Cmm-���q��a@OO���>|8F�!�V�)))���p,X����زe�T���?j��]ZZ���8���k���˴m�V03q�D����v ���������BCC���9ԞE��Ax��V�۷oc��՘?>���`gg�鐞i>>>���q���G��3e��8q��344ļy�T�_m�����e�����Ɂ��;,,,p���9���HHHht��&���ìY��ϓ'OƱc�p��5���I�����I����G��ŋ1c�1}РA2�"Ա?=<<p��Idee���E*O��FC�5g�:KDDDDj���������ڷo���DEE�2Oҝ;w0y�d�߿w��EMM
rss�l�2$$$���ݻ�iӦa�Ν�y�&jjjPXX���XL�>eee2m�����ٳ���@qq1���{������6m�֭[q��5TWW������X�z5bbbXXJKK�>�s��9t���ʤ���pwwGYY>�R<DDDDDDD�x8�B57o�ıc�4�Ipp0������&�08����������B˖-���GGG�\����/�555Edd$���amm
����o߾���jԪ�h�>���'������'''�]�V��k�.��`kkTUU��]]]��?�A�����7���W_���̰m�6�;VVV��с��&L����(���?�}}}}���c��Ѱ�����>����'�?
ccc�>}Z&����055WF!""""""z^q�z�bccQ]]��0���w�}����9�ٯ����~~Ҷoߎ��]�t��իaii�O?�{��Edd$�
رc._�[[[�Z�
�;wFvv6�.]���\DEEI�R<D�6m� ""���8~��x�kϞ=�/��nnn���Ɓ�]�v���Gj5y�O:v���H�����nE}�9sйsg�v%igΜ��Q�T����������i���p�BAGGG��<�KhZvv6�����_cڴi���hժ���KKK�tsss   @i��&ב���m���!$$Dn^�!<==�����ŠL�-����F�mbb�E�aѢE��������ވ��@~~>lmm���HOO���?�����MDDDDDD��qJzbz��1c�h:""�3fӈT$`���$�󓖘���gvvv066FPPRRR�w�^�����AAA�ڵ+���Э[7,^��Έ;;;���PRR"�Kn@��� >>���/F�����۷�A��<�B����ŋ(��C�Re�����������={���X�EϮ����W^��)S4J�ѧO���a���())Amm-�\��+V�w��I&O���m�J��kkk���j02""""""���+\�3g�̙3G�a�S&Y9AbݺuX�n��yժUX�j����P7n��G.�����֭�T��梤�������e�kkkŴ�s�bŊHNNFrr2���+���������
�_2�AU
�ny�ܹ��,q�I�$e���������"ggg���!99Y�z�Ӧ���V��|���B@@�o�]]]|�X�r%���0{�l$$$@__^^^��/��O��eee�5k���a``��C�bݺu���VϽ{��z�j���#??������ҥK��Y=n���+##���_add�w�y.\���ۥV*��Okkk�]�v��ի��ׇ��3�M���ӧ7�5C���ݻ���P�<�"�add���`�����ĉ����ƍ|=��������9�zb|||��0��ԊK�=;$7_���������鉞={�ĉ���q��y|�嗈����ٳ1jԨG��huA�nz�8�-���-��$�q�+�GQQZ�n��0���������t8r}�?�Z�
;vė_~�s��x8�bǎ���ƶm�d�GEE�墣�������TXXX��������%//!!!8{�,:$sM��q6��~�����Hls���6m���p?.Z������UUU�(%%%PX�y%Y����r�
���ЦM���ӧO�����C$
quuŬY��~�z��ٳ���ᨈ���������'JOOOj�Q"�gUll,~��M�A�LHIIAjj*f̘gggDEE!))	~�!\\\�n�>Imڴ������\t��Ea9\�z����ѣ�������Psssxyy������8z�(�oߎ���
��OKK� ��055���ʔk�v�Ӻuk���X恍��b�i���=z !!o�����ir�����0:{�,Ο?GGG���òe�0k�,t��
999����'�|�+V !!A�����q��A���)))���իW�a��^�Zn�6l@JJ
z��-[������'�����/� 22RfU���٘�:uꄨ�(���X�f
֬Y��[�n�����H��?��3��뇪�*|��5k�����C[[�����t(��� """"""��.�3fƌ��0��[uu5\� ++���,�����ၸ�8�_�!!!hٲ%6n܈��x�k�{�����QQQ		��U�ХKdggc�ڵ�޽{����Ñ���E�aȐ!x饗���]C\�v
vvvJ۴����;w��?`ԨQ(((@hhh��[^ߝ:uBaa!���dV���e�������H�^~�e������HOO�	�xxx`Ŋ(,,D۶m5��͛7�k׮��s�bٲe(//��_-^{�裏�b�
qՇ����K<��%������Ğ={�����ܹ/��"�K�.���������eA46����_ॗ^̛7k֬��;w��GSSS#,,.\��#����WZ���������Hڏ.BDDDD���0�b�ԩhݺ5222��;��7�o����{b�ɓ'���������CϞ=���7n���~~~*�=y�d@hh(���^�z!((��a����9Æ
S�f߾}�}�z�cǢe˖��ny}{xx���U�$�1P�������H����	mmmL�:Uj�z����믚E��ݻ������NNN�{��===�>����ػ�������A@�3�R��(󂔊�-ŲqH��f�F=J�ȟ�yԯ�ɬ�,��E�
3EA
9�J��)Q��yE.��;�e�	���x�ǃY{��{�43��ؿ����/�l���`���.v��]c9�3W�
6l�ŋ�=��s����Lrr2�ƍ��'::����
��
\�Mi߾}��۴iҩS'���CDD���Wen���kd운j�*"""����|ISDD��JX���OV�����	�~��888�����ٳ�ׯ��_������g��4n�{{{7n��Y�x1nnnU�;$$�)S�p�=���舣�#���>�iӦY��?///���),,�p̱c�ҿ4h���#L�<���]��}����Ņ͛7�w��͸��ҧO�*_�y
6$!!���$�~�m[ǹ����1a�<==m�L���e����W�:u�X=6&Tt��N�:U���9�3�����g��P��f�
"77���8�t�B^^QQQ�~��,\��Rc���������\N��w�]ƍGJJ
V�L�2����[����_lڴ�M�6ѧO�M�f��oM�}�ٱc,`�ʕ�L&H�V�h׮������
"))���w�}g�M�6%::���4h@dd$����+���ڃ��

�p����Rw$,oggg&L���	.ۿ2�]�����h4Knn.^^^��撙�ɨQ�pqq�p\�v�v�ʔ)S���䡇�Z��f7s�L[G�j�n�JϞ=-�7m����o�Ǵhт}��q��A�7o~U�]˹���y��y��پ};�W�f���DDD0z��:��bٲe�:������� """"""W�V���NJJJ���:�ׯ��Օ1cưf�~������>}:M�6eݺuW�}Ysgdd\W�ϟg������OOO�6mJHH�&M��'"""Wٰa�hҤ				����<==2d�
��������HY����ܹ3���ٳ��#�s�=�?�@QQ�7o�<��c���`4����p�ǎ�W^�`0ЫW��W��233���.wL�?����������{�Ǚ3gh۶-m۶����n4;v$44��1D�����5)"""""Ri��9���9_���$%%���F\\-Z���kذ!����S�N4���$���O�6ml��j������4��6x�`�/_N||<���6L'""���v=3�h����:u*/��2C�`͚5̟?'''������IHH ,,�?��WWW[G����n�S�NVm�������3a�>��s�l�B��������o�X��������7�|S昷�z+Ǐ��LJ�͛s��A"##=z4���>��޽{���쥗^⥗^�u�ZM+\�u��ŋ,\����:w�L�n�x�����K�������&((�Ν;�����RXXh�S�K������_|�O=��U�Eq
6�����>+5NAAӦM�k׮��Ջ)S���\v��?��9s�7�x��{�N�:���y�敺3���_����p�v���?LLL��j���gΜaŊ<�4n���ޤI���Y�bgΜ)��H�ѡC��Ù;w.s���^����ֱDDDDDDD�M�6eÆ
�~�!��_|�c�=���^^^���+|����,�A�lٲ�1c�мys�ԩCÆ
	f۶m�o߾��Ug�;v0gΜr�|뭷hٲ%u�ԡ���Q�F���NNN899Ѻuk&L��G}Tc�s=�`0hӦ�:�DDDDDD�v�
r][�`���qQQ�w�f��ݜ;w���0
=z��R�G�%..���,,X��]��E;w��[�n��ڵ+���gǎ��͞=��k����ORR���,]�77�J��ٳgy�g���,mǎcٲe��������1�F��ԩS��W�^�ŋ���*���[���(�+  ���t���y��'+}>"""�J�/�ш�h�u���d��qu�=<<���/�47���;o��&o��f���j{e�:w�>>><��V�˗sРAV����1�#FT8Gm���@BB��c��lٲ2o)""""""76\�u��O?�����ߟ��"����5k+W��
,]����lZ�n�ĉ�&''���h���Y�f
���dddXV�(����OO�
��~��?~�Ծ��T�ϟ�<��={�4iG�a�ҥ����;wI�1���^^^̘1___����<y2���+�/.�,r��͙:u*��v�����űa�K�Ee�cZZ����r�����Tp!""""""""""""Wl�ܹ�>}��ӧ�:�
+44���P[�.�P""""""�O����J��������+9$$$�j�*���/���OFFk֬��n�:���iժ����lْ�S����Ta���B�ԩ��|7����3a�ppp�M�6�b�
6T8fI�QQQ�i�ڶm�ĉ����K�k� IDATI�fͨ[���x���Ӗ�������.p����!7���#G�0g�^}�U�4ib�8"""""""""e�
r]3fӦMc۶ml۶���{�#F`4qrr��;t�AAAe��믿V8O�ƍ9z�(G��Y�f���͵�/�S�NV�۵k��Ç+���9ڶmk�޾}{�қ�%y{{[~vss��ŋ���^�'NP�~�Rs���}DDDDDDDDDDDD�w�����ݛ��[G������� ""��Q��ڷo>>>�>�����[�.͛7',,��{���_�U�V�m�6��g��Y��Lr�eddX=6�QU� 00�N�:�q�F���v��ɻ��ҥKy�x��'��W�(��ٳ�o߾=G�e���<����[�~��I%W�0<����B2�(Jrpp��l0J��u4[Vfs[Y㋈��mٲe�:����TRbb"F���1DDDD�8w�yyy�z뭶�b3{�졠��V\\��Iaa!?��3�g϶�9�HM7n)))e~}�


���y��puu�{��5>���ر��r�JL&�U�V���������Hͩ�o��\Ennn��̰a�8}�4��ͳ����`�ڵddd�����+��\p_�j?��3�1������ڵ���;���;+y��4m����L�v�c�VUe�����N�*u����GDD�cǎ����:����TAhh(;v�u�
ĠA����m�fHKK�u)��ё��Th�(RK�����X%?{NNN�_�~,Y���橬���3y�d���'M�6%$$�I�&q���k�GDDDDDD���
r]{�'���e„	��׏�ロ���?���={�d���DEE��w��ɓ'Y�t)K�,��ߟ��Vh0�L:t�f͚жm[{�1���+F��s�=��?������}�|��ϟ�G)�� ���:3f��{�a���DGGзo_K���.�G�,^����hf̘����Kvv6111<��CW�:���p��1rrrJV���X��������K���K��!""""""""e�6m�;wf֬YDEE�:�Mt�ڕ��~����z���VU�UÆ
?~<III�ٳ������4h��m��,_����x��ïy&��Lr]6l���̚5�Y�fY����<|�p6n�Ȯ]�2d�U?'''Ǝky���Ή'		��ӓ�k�EAA�}���ͳZ���gϞL�<�̬
6d���Vm��{�՝yʛ��9���:t�#FX�k֬Y��ʨ�u�ҥ)))deeY�dee�+���+,,�e˖�:����T��h$!!��1DDDD�*���c֬YDFFҳgOl��ԩ��m۶���:�����̟?���TΟ?���7O=�'N.��`���Gll,�֭���Q�F<�裌9GGGK?V�X��y�صku�֥w�ތ3gg�j��h�"ƏO�V�,7�[�~=����ݻ���|5jD�=����rl�q��U�/�…@مCgΜaѢE|������4jԈ^�z��s���������iݺ5�/����Nxx8111�����đ#G����s�άX��x�ƍ[�4i�V�X�СC�_�~��EDDDDDDD*�����oڕB�:uX�j���w�q=�Æ
��suu%..�?��
6p��q�ի����G�殻��?~<��ǎ��������ȬY�شi�}��w�����4hЀ�￟��`�u�Vn�y����k��m�66l�#�<Rꍹ��.�~�������q�F���O<<<x��y��gqss��E��u�۷/��׿ؼy3O=����7o������=��Z���)""r��u��ƌ���1��رwww[G������%55Ur�;w�#G����Ö��{�Z�-�+,,d���dgg[ڎ=J\\YYY,X�;;;�cF�ũS����g���\�xѲ�NuƜ7ogΜ����{���Z�9v�+V�����L�>����%�L&N�8�o��}��g���ٳ<��3��d��-[Fzz:qqq��Ӈ���g����pqq 99�����'8r����t�ڕ��$����,� ==���d�|��
�CDDDDDDD*Or�

"((���܈�� ""��~������[�nV��A���_����e�4hЀ��H"##+��b���+s�ի��h$66���\������%33�Q�FY��1

%44��1DDD��>��s[G�k�`0�x�bڴió�>�'�|b�H�\�.]زe��c��\BB��iӦ̜9___v��ͤI�8~��UߥK����M�֭�8q"������Mzz:k֬!88���͛3u�Tn��6bcc���cÆ
����ٲeK���,7�[�|9&L����`0�{�nF���͛�K���\٢��V+fgooϳ�>k�����o����Ō3�%;;�ɓ'�믿�x�b��ù���ٽ{7���p�����{���HKK#??'''���x�qqq!--
__�Ry�miii*��AߞADn:Æ
�I�&Vw*OHH��ӓ!C��0������������TG�F�X�t)��9.�u�k.  ����rW�Ylذ���(ڴi���~~~L�4�T�u��M�V�����e˖L�:����R�DFFҬY3�֭kY]����W4�!C,��6mb����{�|��׼��[̞=���DE�3Y���i߾=��N�b���q۶m-��|����,�!?���O��'� ??���TK�EϞ=طop����-ZX����.DĊ��3S�N��_f�С�Y��������d�t"""ׇ}�����S�U�V�m�6:u�Ā�e4�2��Ջ�ӧS�~}[G�悃��޽�՗�������СC<��#��R땵��K�999�o��j���_�c:@PPP��믥ڼ��-?���p���+�\D`��0v�X���S���d*s�+���>}�����}��2�unn.m۶�j7_�#G�лwo�|�M�����ԭ[���p���K���;z��MVVvvvt��
�'N���rs�����������\�H):t <<��s���/��F�����hܸq���X-Eo�c�,X�ʕ+1�L8�V�ZѮ];$�f��ͦA�4h��1njcǎ�ĉbggg�87���	��}J*k5	��d�Ԝ9sسgw�qݻw��ۛ�R7���Ź��1y�d�
FLL��'.�x�	@�ƍi۶-�v��ĉlܸ��;���N���IMM%//���lڵk���;�׵�ב���k/"""""""է��+T֗-k�ш�h�u��NJJJ���ϟg������OOOBBB�4i���8;;_˘"""""""7%�L/����6�ղcǎRw�����$���ٴi��-���>���;ؿ?;w�����ܹ�T_OOOrrrX�v���+Uc�W����!���o��.\�N���Q��s�=:�ŋM�,�y4mڔ����Iǎ-홙��f���dff��Gq��9�v�
@׮]IOO����ٳVE;v�S�N���a��ԩS�>"""""""Rs􎖈���\u���e.�^����s��q
di<x0Ǐ'>>ކ�DDDDDDDD�.88X�_��p��ƍ���<��C��s��ӧ111deeq��v��MLLL���/�GEE�w�^���o���O�z�-���=zt���1�n�Jaa!{��eҤI��ӧO�Ww�С���g���ˋ����E�Y��ѣ����ڵ�.�k�.�5.�:x�ᇱ��c������.]��|�r�1|||���)���f�#"""""""5C+\����H���0�|RSS9�<���<��SL�8���[^^����[�����F��裏2r�H˲�ŋF�?gddp��V�X�<@�ƍ-}�4i���?+V�`�Сԯ_�Z���������M�6�.ak_|�#H-��{�q����lE���0���<����+�;|�p6n�Ȯ]�2d��>'''Ǝ[�kb�=z���Ĕ)S�2eJ��{��%  wwwN�8AHH����]������ٙ�^{�Q�F���ȓO>ɝw�	��a����9t�#F��:�Y�fVm�������������͛s��s��a���U1�t�BJJ
YYY��Ⲳ�T�$""""""Rô…�����J�Νc�ȑ$%%q��i���ػw��آ���BF��G}đ#G(**��ѣ���1f�.^�X�\�~�-yyy��@^^���5vn"""""""""׻����iӦ���/[��.����̢E�

�[n�N�:�jՊ�ӧXn<���J\\F�OOO���qss�G�,^��Z�(�Ę���
���8;;����}��GLL�=�+W�`���xyyaooOaaa��������7ް�ׯ_���x@�ƍ����q��<�ŋ���f5N`` P�H¼څyU��}������͛Keڼy3�����LDDDDDDD�fh���	�u�+���h�"RE			>|��M�2s�L|}}ٽ{7�&M���V}�.]Jvv6�[�f�ĉx{{���Ctt4���Y����`222�V�0KKK��׷Ts[ZZO>���:]�+]��G}D�:ux���>}:��'/��k׮��ё�� �~�m�b�����ΪU��[�.�=�s�̱��xYΞ=�̙3Y�j���xzz��ɓqrr*���9�3׮]����`˖-8880x�`�ΝK�z�,}J^Ӌ/2u�TV�\��qtt�u��<��3�9�Ϙ�fӧO��ޞ��([G�b6lXje��G�ШQ#�v777"""����p���^��JǬ_�>���e�3]��Bs1Cu�(��+���+��R��A�DFFy�9BBB		)�>~�xƏ_��^�z�Fbcc���������\2335j...��WDDDDDDD*OrU1`�[��k�\�p���}`u%6l�@TTmڴ.�ulҤI���KV}׭[@tt4M�6�e˖L�:���`���*,"ݷopi���Z�ha�GDDDDDDD��_|�E�YϘ1��-[���}�v�RQ��������_�x���ҥKIMM����ݽ�9����ٳ���o����bgg�}usVg��={��Z/\������j��&L�����X�m�6�m���ӧ+�f[;r����N�<�̙3K��_l�[�n���1a�quu%''�ٳgо}{'��6l_}�			�����<==2d��Ӊ�������>v��"R=			�L&mڴi�U���8rrr�������{��!����l�"�_��¹N�8\��ZI�6s�����ٹs'�ϟg������coo�޽{�����^`�ڵ���ꫯ���)(( --�-Zp��A�x�r�|�7��Ƞcǎ�ر���"~��'�v��w�}G\\\���\>>>�������YV�\�z5��{���5c|��7p���}�]�~��r��"))�;�'O�:�M!>>�g�}��1��~��0k�,z��Ń>Hhh(���[�!�/ggg�N�ʚ5k8z�(G�e͚5L�:�jE#�*�����a�]��j*Y,e0.ۧ��g�V��<f�;Eo+k^�6�y�ڴi���cƌ����������+��`��ٻ��#�<���#�ƒO?���9W�Z����i׮u����{ﵬ��t���Y���~�m�n������/�믿*|�����y��`��?���?��d��w�x��x�"[�n�u����$""___��������ӓ�����uD��:�ܹs�;w./��B�7�+W���vILL��	ZD�6KLL�u��;����s�N|�AK�Ν;K����$''��k����Y�<<<8v��N�����jߩS�,}DDDDDDD�6���Y|�����s�z��=>00��q׮]ؿ����/�lٲ��wﮱ�ՙ�u�֖���N��M)�͛Ǹq��g�ܹ�1���d����<y2QQQ�3�2����z����e�}�Q[������0��F[G���RDDDDDD��P��Ԩ��"`�""""��Ӈ���Ì3��{سg111����ٓŋEdd$w�}7'O�d�ҥ,Y�.\\Z��d2q��!�5k���ǎ#''�TaENN����������؆��s����:�N��.^�x���}�c�ICq��Y��-?_�s�ĉt�޽�q
D߾}���ω��%--���(�ΝKtt4�G��0��s��lٲ��1DDDDDDDDD�ag�R{$$$`2��iӦ��D�F�-��������ԩO?�4���J�>|8-Z�`׮]2��;ҷo_�,Y���cǎ��uww $$���.]����Ujls�C=T��("""""""��֭[�oڴ	__�r�iѢ,��.�X����[�n4�����<��Ӥ�����Ϋ���_�EDDĕ��5ѵkW�m�V��_DDDDDDDDDj/\�����U���AFF�5���ٙE��-��B�:uhժӧO������J\\F�OOO���qss�G�,^��ju������兽�=������6o�\*��͛quu�O�>W��EDDDDDD�jy���(**b��͖�\�1���?0����\�p�cǎ��+�`0�իW��ɹ�,Y��?nY�������`0��{�q��ڶmK۶m�Z�g�;w&//��;w�:������������\������ȍ�aÆL�2Ū��ѣ4j�Ȫ��͍����ލ100���@��z��a4���%77///rss���dԨQ���\�鈈��������v�mt��ɪ��ߟ_|��c&L���Ζ-[�С��>�x��W�s5i҄7�|�e˖q��q|||h޼9$22�ѣGNxx��qݻw��s��|}}iذ!������T߁���Oy饗ppp�u��Jbb"�����!"\z=������H����u�F^^&L 00WWWrrr�={6�۷���
�W_}EBB���$$$���ɐ!Cjt.������
Frr2�7�h42y�d����=�A�lٲ��ӧ��g�������ݺuc������5��j��[ošC�(((`ԨQ888��;�
�]w��?��^}��;���`00`��֭k�(�ʫ����ݻy��m�STTĀlCDDDDDDD��2�L&��C����ȍ!,,�THP����`%ddd0k�,>��2�����x�b�J5���7/����.V���̟???��GDD�J���""""���`@���/55�nݺ��_ү_?[ǩ��o"7�e˖��#DDDDDDnpZ�BDDDDj���H�5k��_́(,,��n�s�Ό9�ƍ��:t <<��s���/��BDDDDDDDDj-���رc�ӧ��-l`�������:����j�*[G���������6���F���x��(�-���%K����Ɏ;l���?���Hhh����XV���E"""""""""""""R���,n��n��v[G��D^^'Nd�ȑ�n���qnZF����[�`ٲe����:��������0\���������������d2�:�u�d21t�P4h���뱷��u$�̙3��g�2}�t[G�j�l@DDDDDDDDDDDDD�_����8�m��믿n�8r��_�>���:��z������������\5Z�BDDDD�Hbb"�����!"""����Hhh��c�����
�}��̝;�1c�УG�u�f�Hbc�ƍ�u�
�۷�j���_�~U�2��ҷ"�V�b۶mt�ԉ\�x"""""""7+\�����)**�5""""""""7�^x���d���ɥ� IDAT�;hذ��#]���D�֭KPP����H
7n)))W\�p�ڱc,`�ʕ�L&H�V�h׮�����������pTp!""""Ֆ��@BB��c����\5aaa,[���1DDDl*!!��h�r0���Ӯ];F��g�}��`�u�j[�f
���Up!R���\��%5jjՉk��L�<�������	@HH�&M"11ggg'����BDDDD�m�������:����TQ׮]y饗l����"S�iiUK)��Ã�K�����p�B��y[G��.]�0a����o���mGD�F���s��q
di<x0˗/'>>���p����BDDDD��~ 11���P[G�JJLL����1n(����{GDDD���ݻ��;�н{w[G�"�;w�ԩSdeeѶm[[��&���ˍtΟ?���7O=�'N�Wp���#66�u����ӨQ#}�QF�������y��+V0o�<v��Eݺu�ݻ7cƌ�ZQ��c.Z�����ӪU+.\����ILLd�޽���ӨQ#z��Axx8...�c��c>���_��S\^^111������D�n�x������p���>s�+V���q�Ɩ�&M����ϊ+:t(��ׯֹ�������܌Tp!""""W�h4��"""7���0[G�Z`ԨQ��p��~4h@ZZ�
.�p��9F���Ç-m{��[WXX��ѣ��ζ�=z���8���X�`vvvVnj5�S�N�����ի�x�"QQQ�s޼y�9s�R<��{�k��رc�X��ӧO3}��rϿ:�_NU�DEE�y�f�R�����IHH����s�����Pj������INN��'���y��������̪�n����������M,,,���M�6mڴ��mٲe��'W䚰���S�Nlݺ��Q�{ǎc̘1�>}��Q�
$$$p��a�6mJ\\[�neѢEV+!�-]����lZ�nͲe��X�j�ڵ#==�5k֔:�y��|�駤��1b�6l�pEc�lْ��4K������0aiiilٲ����R�P|��������9��Sܾ}�x�غu+qqqxyy���˒%Kʝ�*�����-5����GDDDDDDD*G+\���������T����V��Zk���� rMo�׽I�&�n�:bbblE����!**�6m����ǤI�x饗���[����h�6m
\*~�:u*���$%%luLdd$͚5.����Y�Tg�!C����hy�i�&L&{���믿�_~a����={�����S�<QQQ<��iӆ��(���ٰa�?���޷op����-ZX���Q�������J�������li߾}�����oժUl۶
�N�:��-"""׹��PBCCmCDDDDj@�.]x��8r���b-33���xpvv�u��ř�#����}��V����Js��!���ʜ��_-����m����
��/^ј�"�?����cDzgϞR}M&S��^��S�<%���m�p���r�J�'NP�~�R��m�>"""""""R9*���ƍGJJJ��;v�`���\�����iժ�ڵ�AR��K�N�HHH�|9\J;v,;vd���"5�d!��`�l���Z�������,����9sسgw�qݻw��ۛ�R7����S�<%��9���}�sT%�y|;;�R��me=7"""""""R>\����H�t��l���Rf����<y2���������&M�Dbb��(""""׍cǎѤI[����'7��g���7�п[G��z��a4m��g�����֭[�%�DE��q��߿��;w��Z�w��Y����'999�]����啪�1�+�������o��f�����)�kW㜪�租~�Za���7p�)OUr{xxp��1N�:����վS�NY��������H啾������H
�/s)��]||<ǏgРA����s��q���m�LDDDj���T�}�Y|}}qqq�nݺ�q���ߟ��������pU�,��~&N�Hǎqww�N�:�����e����|���o�����,�%7�o߾=�Ǐ������By��r��u��v��Q��?��#���￿Z�w=�s�j��V���^�]�����l�(R


����h4ұcG[ǑЧObbb����…�޽����R}{��	@TT{������?�䭷���ߟѣGWy��s�֭�w�^&M�di?}�4��8:t語Se�͘1���,��������믿@�޽��*�}||���)5����GDDDDDDD*G+\����H�d.�0����ŋ,Z����d�=������<��[��l?���<bccY�n���;�5��Ge�ȑ�����t��V�X�<@�ƍ-}�4i���?+V�`�Сԯ_��\ �i?~��Ç��_��w��a>��ի�ׯ˗/����)o\�/".X���/Z�;y�$۷og���̞=�_|�ٳgS�n]����{�������ɓdff����;��|��!ClM*aذaDFF˂.�?66�r\mr#��D�ڵkyꩧ����
-7�p�����mEjHXX�|�
d����>|87nd׮]���rrrb�رU��&��ѣIIIL�2�)S��ڿw�^pww�ĉ�������ڵk��9U6�ٽ��[����V�U�ݥKRRR������ϪoVV=�P��ODDDDDDD�…�����$,X��~ȡC�(**"//�ݻw3s�L�ܯ���ѣG��Gq�����8z�(qqq�3�ԗ�J���o��˳���,  ���<�
RDDD����_:w���_MӦM�;w.?��yyy�w�^f̘A���IJJ"((�.�:�
����Gy����coo��O?ͷ�~����)**��?�dݺu�/T���[��ۗ����A&�	��d��歰������|��w<��������SO����rW��<����:{{{��ϯ�o~~>˖-�N�:5^Ps�_'���…qqqaذaz
����Nbbbh֬���H
qvvfѢEq�-�P�NZ�j����,7�puu%..�ш��'������ѣG/^\�Ujb�W^y���@���qtt��#&&�R��r�JƏ������^�s�l��'ҷo_iذ!dѢEeW%w߾}qqqa��ͥ�ټy3�����NDDDDDDD�r�…�����>��S�~�m���)**"))�Y�f�r�J��*�o�ҥdggӺuk&N����7999DGG���Κ5k&##��jiii�����jnKKK��'��JWDDDDnO?�4���ݻw���?�[n�����äI�桇"%%����/�(�%22��7Ҽys>��3ڷoo��aÆ��ݛ޽{��/DJJ
���;6J}sppp�q��<���<��ü��̙3�Q�F���n���M�&M�۷/III|����r��^���'O��c��N�"�	777V�X�C=Ĝ9sx��WmI�)$$���*hذa���=
@�F�����܈�� ""��1���y��+�~��宺R|u���@�=M�)~�믿^�*��^�z�Fbcc���������\2335j...�!"""""""ִ…�����8��r�ׂ�C���V�Z�_�E������`͚5U�n�:���iժ����lْ�S����Ta�}��мy�R�Z�ha�GDDDn999<��s4k֌�u����IXX���e�7��J��� 44�[o�GGG����0agϞ��y�f���kn��V>���R�ŵnݚY�f��ڿw�^�
������xyy1|�p~��
�`������ggg���	

"==���~��F��]w�Eݺu��[�СӦM��ɓeS�l����~,X���3�~�m�b��:t�W_}���.,��^y�we�W����׹�e�^���Z��TVLL~~~�����'��;�Y~~>o��&ݺu��Ã:u�ШQ#{�16n�X��{�����iܸ1�������v��r3W���1�jժ�����`0p뭷Z��W|�x�^���[8p YYY��Y��U��0�����y��M>w�~?��Sxzz����w��[o�U�XU�U�מ9Gu^g999t�Ёz����W�j�T̓>�̙3�<y2?�����֭���|��'�>}��/r��M�pٿi��0l�0�4ib�bsBB���5�"��������M�$""""RIF��d4�}l֡C�JmWS�9���[S@@���K�.���X��筎�l��}��z��Yn��d�ر��C�����R�

L:t0u�ԩ&.������{.�T�zmڴ����fJmNNN������1e�-�9;;[�_�x���޾̾�۷7�={����3�ɓ'W�\���M�7o.��ɗ_~irvv.s�z��֭[W�ym۶����T�8GGGӖ-[��IOO7կ_��kѢEӱc�j,[IU}����&�4f̘J]_�Q�F����+���sW�:W�YQ�k�;S��V܇~hL�p�ӧO�����=w��`Z�vm��T�z$''�y��`0-Y����}�~w�y�	0egg��7{�l`
+s�9s�yNu��-�T�w5??����n2��~������7SÆ
M5�ܕ��W_��|��ĔyLUsU�w%��^�zY~8p`���},RY/^4���NS^^����
W��s111徟ٻwo��Ç�Fl����S�.]LG�19r�ԥKӿ��o[Ǫ���f+�XDDDDDDnLZ�BDDDDj\FF��v��k!00�����)S�жm[���y��w�ׯ�W��r?��T�|%�0]��Τvv��$7�]�kEDD��9q�����̙3�;�_~����ϳu�VF�Iaa!F���G�Zg2�Jm��і�~����0j�(���oF�́(,,dӦM�u�]�ر�ٳg[������c�U��֭K׮]qtt��;v�A�q��y�x�	���((( ++�'�x�s��1`��;V�#F���G%55�s�αq�F���),,d�̙V}ǎ˙3gx��g��_(,,$//�
6p�r��A˝wk"[q�y�֯_@HHH���٠A�����t\M��u6�N��=-ϵ�����]���?V�o֬Y����w�}������G~~>۶m�s�ΘL&^��J�Y��q��I�F�嘟~����~��Gz�����?_��P����/J�3��ׯ_�2��8q"�:ub۶m�����O?DAAC�������jݺu4h&�����23���a2�<x0���5�ܕ���<7d�޽�c����S��U�u��ޕ��~��v��ͩS�x�7�}=D.�`0���������\ց����駟lE䪉��$""___��������ӓ�����uD�!:t <<��s�2w�\^x����lKDDDDDD��tM�;DDDD�V�;�]�-�:�O?�d�?��C������}�5u����=����U�j��[DQ��B\h�kբUqkպ��Ώ
��h���8P(K�­D�
��~�-!	$!���ɹg��7��9�];��3�D�=z�S,�z�b���x�B)��/�D"a�{�.�nB!D[�…v4�K�2,$$De=S�N-s?'&&��D"�M�>]aߌ3��F~��~u���%�����l�,�g�fX�ΝYQQ�¾��"ֹsg�Dž��9}���Ju�:u�`5k�TH�V5x��R���$�իWOo�����Q��^�|���:���/�lllʍ�2�ֶ�ˋ��fʋ�����YXX�Y����r�[�n��C],���rD�.]��2777��pq��5����+�?{��1###��Y�:]\\�f�/yL�-��u�G^�t�`���W��\����v��Ƙ~ϝ��ŋ3���G)oaa!swwWY��������R����
�CTXXȬ���}�bH�!��pA!�B!�'Z�B!�|��� �J�o�>�d24m�͚5k��s�����������/_��ڵk!�J1~�x>/�R������͛�ݻ�+���!�BH�w��Q��ɓU�=z4�ĉj������!�����e˖)���?'NT*+�J�Ý;w����\����G���ɓ�΄[ze.###|��w��Ǐ�,?i�$��/���k��
x;�~xx8<x��svvc>�[l%�r���lllʭ�$.NN�V�T�%nm�Y[Uy�h������_f��w�1�r�O>�������|��wJeD"fϞ�QۚhӦ
�6m�K�.�ٳg|��#GP\\WWWԮ][eٹs�*�X_������#���899!##QQQ
�������C���@*���S�;�iӦ)��D�����*�>�ر��m�!�Dpuu���

!�B!�B!���B!�0b�����ѡC���#$$z�4_PP5j���:������?�333L�:��kkk�G�>}���$�X��������	!�R�RRRb��@isvvܺuKmcǎ�ݻw���_�B�Pa��۷�[��(&���l������=�^���V����R���%���X!�{�<&&C�EÆ
ѰaC�9���GAA�^c+I���
d���*�����aaa�U9}ŭm?k�*�mq�\�$����Çc�ܹ�޽;�b1�1�Qy]���}���?WY���]��54h� �=����QG�C�\ܩ��|ZE���h���
��kni=w�\�~ �HT�wss+�}�U�7������p����A�!##�СB!�B!�R�ЀB!�R�bcck����1o�<�h�&&&011A�&M��j����
aaa�X,�P(���
:u�;v(�N{{{�B�6oooXXX�ܹsJ��;wVVV����!�B�>i:�|۶mCdd$���q��A~�fI܊
��X�=�^�����r����5j��omm
@�j
܊�

����>x�;v�@�~�вeK����-��t9�*h�����p��Y�+B����gmU�5�-n{{�r��ٳM�4A�&M���%K���ɓx���Vm���R70�f͚Z�P���o�E^^��BY.�ԩ�2����g�G6B������8|�0D"���__�N�|r�4u���;�����1����������cC�R�-Z�ӧOk�z!�B!�B!�;�� �B!�2�����__�r�j����ӦMôi���׽{wt��]!������

�Ç���>|���x�7��!�B�!���x��5233�>������7�@ �_~A˖-ն����7o�h�F������(�������͛����ѧO���/�>�������,ԪUK�Lff&�>���}�������_!::��Ѹy�&���0e�:tH��r����p���۷�:u�###�ڵS��1�@���������Y[U}�h�̙3ԯ
������!C-Z���ШQ#ԩSNNN�`M��\���L��k��JyZ�j''';v)))x��d2�b1ڴi����{wL%�T�Y�^=xyy�?���]����b׮](,,D�^�`gg����S���YYYjϧ����:��y׹��C(���߿��é2�n����n�:p����@DD��� �B!�ByoрB!�BdĈ8z�(���1c�@xx8�b��,��B��q��5\�p={�Ը\^^ �ɰhѢ2}6i����HJJ���G�u��ĦM�0u�T�3�s8�ׯ_+<�ߤI\�z�/_F�=��\�t�ϧO
6�ȑ#1r�H��#GЧO��y}Ǧ�=z4V�X�m۶a���pqqQ؟���6mڠ{����y��HJJ�֭[�V�odd���b�d2�������wI��u͔���[�l��ӧ̼���G�H IDAT=`���7n�¾�3��Ȩ�E�u�DGG��իJ�Ճ�+jРAX�`�.]�~��z��4����W��K�.J�/^�nݚO���?��;w�ķ�~��۷��%��ܩҲeK�����ŋ*W��v��r����������ѵkW4l��С(���B�֭�A
��>}:�7o�ѣG:�����_~���� �B!�By�i�B!�B�D*�V��077ǂp��!<~��?ơC��`����:<B!�h�{�ᅦ\.W�	�@��npp0���9s��F�Ν���J���� ШQ#>�/�����<y�A�A&���;##�V��������tooo��+P\\�P����V�t�ڵ��5ѨQ#$''+�S��>c��}��'F~~>|||��NHH@ff&6l�gggL�4	={�D~~>�u�:(䷵�\�|Y����0�ŭm?��/�ϪT�5��9s� 99����ݻw�yo߾
6l�Ҿ5k��?���ۮ.�ѷo_��ի�S(���������;V�\	*��z�j����"�����t�Gr���P�fM$&&"<<��ɨU��� 5}�;uq����QTT��_ݹ�5.u��>#DS���X�r%���dh���x��è2�N����f��BC�C!�B!�BH��!�B�P`` T�Z[��R�wMxx8�6m�6m���0t8�B�s����}�iedd�5j0�k׮�ҥK,77��:u��;����0�H����2dا�~�޼ySn,7o�d����5k{��	���a��svvf����ܹs�թS�`�|�	[�~=KKKc���L&����D�b�
���3l޼y
�<x�������ǒ��Y~~>KNNf~~~���`w��U(���գ��3g�d���;q�{��
+,,d�����ۛ`���t9�1&��Y߾}fll�F��N�<�^�x�
ٓ'O�رc�60[[[���>�bvttd�Νc������l�ԩ���Loqk�ό1������
Y~~����k�����B���#v��!ֽ{w��={��:6a����&��YRR6l�¹�w�^�����_�f����ׯKIIa,99���ۗYZZ��_�*�Z���D"���Uf������Y~~>��X�=��Mnn._F�XI�ƍc�{ڤI�����ܩJ���bb��`���,>>�����ׯ��Z�j��K׸Խ�*�}V2_xx��ׄ�CBB377W��Q��rC�Pe�r9kݺ5�ݻ��C!R��I�Kh����q���^B!�By7�ov�B!Dc�&!���ϵ�M=z�����}�b�ƍ
�%�Vj0�Xhh(*󹻻+<��ILLdM�6-�
�P����C��=Jo����JeT�^���,���6F{{{�������#��ق�ơj�5k��ÜW�\QXQr۲e���֥�;u��TWU]3%��۬��T����]z�;w.�~ڷo�F1�����
+Jnaaa���<�kIK�,��w�ر�:###����R|vvv,!!A����1NLL�B�+W�(���S��j֬���]�v�,�k\e��*�}V2
� UaӦML(�S�N:��֭[���1KMM5t(DC�!�[�4�B!�B�F �B!�B!�T������1j�(4h���ƨQ����p��	L�0A!ZZ��m�5
gϞEϞ=Q�fM����E�X�x1N�>
333�2...HLLĖ-[УG��b���͚5øq����l�O�>�v��
�X�H�X��Ç#.._~���ǡ���
bbb0k�,�l�����Dpttķ�~���8888TZlڞ?�P(���q��,Y��۷G�ڵ!
aff����V����ajj�e˖���S��T����������011���+�9�1c��-n]�y����ѣ,--!�P�~�2�������D"ԩS�ڵÂp��m��3fv�܉�>�������A�n�p��,Z�s��l޼Y��t����c���|ggg�۷
{C3����)7��p��H�R�D"4n�ӧOGbb"Z�j��_����
-Z��&�J���ܩ�����1c�s��䄈�6Le]�*�W�g�T���ѷo_2Ϟ=3t8�O?�k֬A���

!�B!�B!Ֆ�1�*R����q��%}�C!��JаaC���:�2d <<\�kB!�T�v����ݻw+V�@JJ
N�>m�p�;(--
���h֬nܸ��zSSS����@���T4k�Le>�@��H5&���@��	ѧ��L�i�NNN8z�(�!��F��R�EDD`Ȑ!�g�ү	!�B!���D� ::��"�B!�S`` ���B!�B�lذ��a�j�������y�&�6m��۶m�D��v�;���/�� �}�Y�&~��Wt��۶m+sU'BH�v��
����>}�Brr2޼y�-Z�K�.��󃵵��mr+^��ƢG�x���9;;;�|��߇��?���ѣ����<|�~~~�裏p��q�����S�?��O[����x�"���q�\��B!�B!W��O!�TO40�T���DDD:B!�h�f�&������gΜ��A��j�*������w���m۰r�J�رc��ޫW�����u���Ν��z	!DSnnn8r�<==

!DG�~�-Ξ=�4�@&�a�̙�p�BzBB�y��S�N��e˖��￑���4�"::`bb����?^a$''�T����qqqX�~=����
�f͚��>��	!�B!����\B!����_�/����aB!DK
64t�B�X�z5�v트�8t��Ui�@ �����`"ԪU��900mڴ�K�����ݻ:BH�={VezHH.\���u�b„	���@�5���S�߿�v��w�}�m۶�U�V���ٙpѥK�}܀�!C�`��툎�Vp����,��?�-77s��E���!�����3g���ss�*��B!�By��}����q��%}WK!�-4l������B!�B!Zj۶-�z�jDEE��ݻ(,,���<==��7���Mo�5h����/����y�f��K!�;w�������2t(������q��9ԪU;v�@ݺu�}�����ɓaaa��7b�ƍشiS���Jp'82�qqq����ȑ#�g�\�|011��p�.ؾ};�={���>m����_�}�vL�8р�B!�B!������Ɛ!C�]-!�B����pC�A>?��"""!�B�D�	!�z�_�>~���*i��Z�g�UR$�R�DFFb�ڵx�葡C!D�^�x��~�	������E�&M0|�p̞=���2����8y�$�?�:u�gϞ=z4?XA*��cccq��a��a�[�4h� 0�ТE����llٲ�N��˗/Q�Nt��cǎ����ʺ��ׯ_WH�|�2
���	����ԩS���E�v����HMMU���p^�|�
6��ٳ���E�.]�~+����dX�|9Μ9333����&M���)˖-[p��	<~����hҤ	���V������ݻ��+��R)v�ލaÆ���ZeB!�B!Dszp��?�B!�AIU�6	!��w}^$�B!�|�9s&���ѸqcC�Sa2�>>>���ѦMC�C$''�G�FFF�����4h


0~�x�#?~���0$%%a���022R�Vbb"���%u,--��W_)��y�_}�����'O� ""�/_FXX,,,��Q�������C<x�
4�?^!OOO�:u
������w�B&��^�z�Q���X���1j�(<|��O��?������T�9s&.\���2""r�3f��_��v���"11������������L&㏡�v������8q����U|�B!�BQ��B!�B!�B!�B�I�R����k��V�X���8ԯ_�С
GFF�ի���0���`˖-*W���_���DDD�ҥK����g�}�˗/�СCWo����_�|�`oo�U��v�Bzz:���CCCQ�^=ܾ};v�P[�����p����@���h>��[�B���>D�
�s�N��nݺ��O]p^�z���H�;w�ӧO���X�nbbb��c�̙�={�(����R�\�r�"�B!�B�\B!�B!�B!�B����,Z��`훙�A*�*<������ʕ+1g�|��G���`HH>��S�m۶�3g�Rޓ'O�.]�f͚A(�q��X�`�رce�%
�����u��*�N�R[�h�
��y�&�={�f͚��~�ڵѢE<z�w��Q�_ր�3g�fϞ
ggg��f͚���͚5�7���9ƌ�)��;����W�^����������7Jm4j�H!!�B!�B*Fd�y_<y�vvv��R
����ˍ7мys��"##q��E���X��B!�B!��7�ܹ��iӦ<x�Ab���ѣG
Ҷ>͞=vvv���

�R�T)�[e�޽{�6m�(�o۶�R����|}}U�s���2�[�.222��c4n�Xe�rrr`eeŧ=|�кuk��\̏=R�f�.�S���
�<==q��uDGG�O>Arr�ByU222�~��ʸ4����\�F
��R�L�����ŋ�x�"6mڄQ�F!00fff|���`mm�����!�B!�BH��
%DGGc̘1prr���LMMѠA�����2US��@���a���puu���-D"lmm��_ $$���zo��lݺU�r�@����Ko\��i�����.eա�XI,���!!!�����?� $$>>>��U�~��]\\ �Q�k׮A �U�V:���Xu�}�[Y�BȻ��o�Ő!CT����1}�tcݺu�����	!�R"""��Mm��Fm�FHu���I�&a���HKK3H���HIIy�Z�r�
~���X������T�1�ת���͛2�s.\��6Orr2:w� �Y�&+e�h�FFFHMMEqq1Ο?@�����r��n݂@ (��9\���H�9.MLL��߽{w?~���C�֭�����7��������;gFFʏ|pi�:!�B!�����gϞ!((ǏWڗ��������o����
D�����nj3�~�z�/�233q��\�r?��&O��~���w�ر�AkEEE���D||<���a�lݺC�5th��ɓ'8~�8�?��ׯc���j�Ο?����/#F���3���ח�?44�/�>y���Ξ=�2=77s��E����Az����3g���ss��B!��믿Ɨ_~i�0!��J���j��Z�
.\@@@Ο?_��֮];o�ݻw����1L�::t@�~��"�j�4h�iii����_��&)�Ÿw�>���d={�ıc�ԪUKaqq16o��z���P�W��޽���x�����mʊ����5Bzz:��㑘����(�kٲ%jժ������5����ں4h���t\�v��7@RR�杢!������)))�믿�s�N�Y��/׮]O�<AVVj׮�P>++��C!�B!�����W�x��)���q��qԫW�V�Brr2d2��󑚚�ŋ���ǎ���/�r���~g���G��駟 
1r�HDEE�ٳg(,,�˗/q��I֮]ooo���6p=b��;LU�mx��)���O���yyy>|���\��1蓣�#N�<��������������#�/C��aÆA("<<yyye����CDDD"������/!�"�T�r)��������3�i�Ƴgϰ}�vFF!�B!���255��ݻq��
̚5��ۯ]�6�ϟ�
Ty��w�^���`͚5��T^^^�e˖!))	r����X�l�R�Ν;BBB������"�|�k׮�T*����J
��������Ѷm[<�AAA8q����QXX���dL�2/^������ϗ�ԩ`�ҥHHH�\.GBBc����<Ɩ-[x;�Wqq1ڵk��
�@ @�v�PTT���0�r���у��ڵk���HNN����WUh���R����L&CӦMѬY3���1��y���{��)��qy!�B!�R1�
#G�Dzz::v���5k�T�߼ys̙3_~�%ڷo��g�b��͘<y��"~�̘1gΜ���8�6m�(�U��u�nݺa�����ٳg1m�4lذ�@Q���Q�n]t��]�v�w�}�+V`ܸqHKK{�Vі��~��'�����֭��3g� ''ÇǦM��������8v���ߏ��@�y��7dff�W�^�����(	!���blٲ'N���Ǐall�&M����OiVj�L���P�<yϟ?G�:uгgO�=��9������Xdggc������Q�n]>����R)v�ލaÆ��ں
��B!��~BDD��� �B*Uxxx���R��6m�M�6aذa�ҥz��U��ϟ?�J�ӧ���#44m۶5t(��2d���ܽ{��O��� �9s			J�e���a�ԩ�k[[[����X,��Ç˗/DŽ	����ٳg+�ѹsg,^����]	�ԩS��>F����aÆJi��l�G���K�*�yzz�ȑ#�|�2_�,C��_��7n(�n���4�A]hbĈX�t)�/_��˗+�+�^���ٳg������V�(op
!�B!�B4S�+\ܻwcǎEÆ
ajj
�X�!C� %%Ee~�@P�VZll,��>�&&&hҤ	fΜ�7o�(�;w��?��>����WlQ������֭[�����bĈ������	����[�n�y\p��t����氵����/��Ni�n�������SSSԬY�.Dff��2��Vm�_ZZ֯_sssDEE)
�(M"���ѣ066��͛q��
���η&����4���m��.��UU׌��-[��m���Çطo�ڶ9yyy���ѡCԮ]"�u��A�^�p������:MII��Q�n]����m۶���]/>>>�rE���\>Ut郒qm߾-[����1>��#4H��(�*M�kI�>羬

U[g�\~}^_e���Xccc4m�k׮-�.m���š˽�޽{�H$���D�>}4�
B>,�ׯǶm�p��}B&�!11K�,Axx8�����Ǐ�Ν;���#����Ô)SP\\\f;QQQ��d
��sڵk�L�'N�!�b8���J+I�Fm��F��R
2#F���ɓi%z-���r�'ssslٲ����Y�&D"�5k�E�?�XYY!,,�����
����A�N��c������aoo�P���|�Z��k�.|��7pvv���,--ѵkWlܸ+W�����B����ؾ};��u�B(�nݺ<x0v���2���ٙ����H������)�pabb�-[����������	�����W]h������C�-`bb�?�����aaa�s��)�q��9XYY�+�B!�B!��X�����Ք~]����lll���̌=zT����%7sss��;v�`B�Pe�6mڰ7o��yǎ���s�jt�yyy�ܹs,??_!�ȑ#���\e������ɓj���ŋ���L����	�p�B�˗/3kkk�}ѨQ#�����V���o֬Y�2e�F��7n����5�K�qk��e]�e�UU׌&�VҶm�6p�2�x��5k۶��c����ǢK�8qBe�@�~��g�mq�y(� IDATyy��‚5m�Te_4nܘ�������uU�V�X�����i��S���K����1[[[&Xzz�ʾNKKc��ժU�����R�~��Q��ܲe��r�5�?T�^ХK��A�)�	d���j_R�^_��I$��MIǎ�D"a.\`,''��ݻ�I$֧O>_hh(�H$lĈ�ƍL.����4��W_1�D�8P�qL�2�I$v��U�bcc�D"aS�N��%�B�D��C�E!�C�����}M���y󆥦�:B��~?y������۴i�J�,##�O���`R��mݺՀ�}��y~�B!�BȻ��V����ѿdggc�ԩ�u�rss�ѣG������x���B9�bv��K��m��|���7EEE?~<�ܹ�������pttD\\~��>tt4h��)<==f�x��	���???$%%!??III���CNN�'O���sԨQ�ٳ'�������3gΠI�&(((��%K�N�:���3fnݺ����d2�>}-[��ݻwf��hl%�r����/og��F@@�ԩSZ��W���3+5��`���f����	�v�Z���/_�k׮�����ѐ�d����ŋ�������{��ԥ?233ȗINNF~~>�]��.]�`„	�kjj�.]��֭[J+	\�~����ر#,,,*�fϞ
777\�xyyyHNN���/���1t�P<�\��T��Zҵ�MMM����T�	c�����^�/U�?�ˠA�������|�����Km���U�����[�n!11YYYX�z��AHe�J�
[y镁�����#22�^�B����C��N�<	X�t)�5k�P�ƍc���cǎ���*����ҾF�)�!�B!�B!����T�Q���:@*�b߾}x��5���q���o�mڴ1p�D#F�����Š������:t�##�B!�B�3�����K�2,$$De=S�N-s?'&&��D"�M�>]aߌ3T���cW�\a���	8������*�Ͳ̞=�`�;wfEEE
����X�ΝU�oV����+�y��)�լYS!����իWJe���V�^=��V�.�F�{���2�����)7�ʈ[�~./����)/�Ҹ�,,,ʬ���P9���[�T֡.]��[�K�.Je
����F�lܸ�`?���B��+W2l�ڵj�h���0�L��x-Z��r�Ҵ��*��.]bX�������rfoo��+W�0��{}�J_�x1�|||��2ww�J9�U�^�O�N�K*����Dy[e���b�ڵ�����`���,77W!_�<��Ν;+WI���L"�(���c���L"�077��9HB!D�yQ;��ӧO�D"a]�ve�1��&�HXϞ=+=�w�!g�.��={���S���S��={�TaT�R��V� ��j����-[�L�ݺuSX)��bcc���{��{�����P��,R5h�B!�By?U�
G�L�<Y�ѣGN�8�����,<r����X�l��?��0q�D��R��1ܹs�O���XYYiq$���g̘##��422�w�}8~����&MRJ��/�_�VHoР������x�������1<|�Po����{��
��Ʀ�K�����hUN]�ֶ��U�׌�������e�{�.ch۶�ҾO>�������|��wJeD"fϞ�Q�>>>�#G�(�s����T��Νsss�����]��*��6�RE���/����222��/**
>���?ӽ>�/U�>�6m��>�H�ei�������;j�!�����^�w��Ǐc޼yhݺ5���q�F�����~��2V���L��@ ��r�4.!�B�III�~�P򵋋��b�N���[2�ڵ����c���ƺu�_�B!�R�f̘�iӦ���	fff022�X,���?���aooo���$	&N��U�VaժU�4i�ʿeB!�B!Dw��j(%% ���w��-��Ǝ��w�������+�B��۷oZ�n�QL666���Dvv6jԨ�Qu�r)�ƥs����訔fii	(..VH�={6F�������x;8�k׮�ӧz��
��V�.����
YYY���B�ڵ�m����
���и�:�ĭm?k�*�mq�\�$������d\�|�.]�F(��U�.��=��矫,���Q�pvvƹs琝�
kkkdee��hڴ�ʾVE�>P��<wL���z-��6�RE�|Ĉ�9s&BCCѳgO>=44�߯JE�/U�_���Ъ����[�>�轀F)���
|}}��닔����_عs'֬Y�~��x�9�޽{8|�p��T�]�6�<y��3OVV��B!u.����g�V��sss1w�\��ߟ�<���9s�`�޽JB!�TW�1����������4t(D��B!�B!���V��t�}u��mۆ��HX[[�����U���>������<�,��^s��
ذ���~�nEMa���
3R<x�;v�@�~�вeK����-��t9͚5$&&jT����f��]�ֶ��U�׌��`4��fϞ=hҤ	�4i___,Y�'O����ϵjS���Η��!5k�Ը}�
������e�n��HԩSGe:wL�fS׵�*�\K��aÆA(�СC|�<���H$�СC���R���k�����g\��cP!�;???H�R�۷2�M�6�?��:w�		Ajj*������K�]�R��Ǐ��r���>�ּys��{��b�Ҹ<�By?I�R~۵k`˖-�J�ؽ{7`ݺu��~�zپ};�={���>m��x���o�n��!�R��1��lW���ǎ3t(�B!�B!��W�l�7kzff&cj���"��ׯ_�7�|�@�_~�-[�,�
M8n߾= **J��7o�D�ڵ���f/.-33S!���۷/�^��{��!,,�F��LKKÔ)S*%6]Ο��`߾}Zcdd$�]�v*���A>//Ooq�������ƙ3g��q��������E��;w.BCCq��AܼyS�6u����4uu��
�8z�¿�
��h��OqǤn���*��}^�^=xyy�����h׮](,,���7�������:u1��︪󽀐��z����ѡC���#$$V�Q�FHHH�СC���
ooo����033�ԩS��ܠ_�������٫K�Ҹϝ�B!���ӧ�?>�u�777�|�.;;�W�F�^����޽{c͚5J�wrIn߾��'���]�vŲeː����+..��͛���wwwt��#G����PW�zK�|��5t�҅�Z2����9numgggc������Q�n]>���?`�0O!���'//AAA�����>|��ǏWz;�Z�~=������b�P!�B!�By�Tـn5�.hU.//��dX�p!|}}��mҤ	�����Z�i�&��pz��~�Za)^��˗/�,s��%�|�ҰaC�9����q�>���.�o����Dضm��s����f͚a��ɸq����n�֭��$X�����U&�)Օ�����KҤ��e�k�<EEEزe�����6oތ�ׯcѢE5j|}}V�)...�]]���c�իWU���+����������CTT,--ѱc�2�U���~��E@�֭�Z�����AAA��;w?K(����
7h��Ү]��2]�qU�{!�%66�J��]���?�͛�-Z���&&&hҤ	����p�B>�������X�Pt��	;v�PX�"88���
�(((x{{����ΝS��ܹs�����B!��}։��888 66;v��vЪ�<��bĈ8z�(233!��q��m̛7��Nx;�����¯����O�B.��ɓ'�����ѣU~�2n�8\�|yyy����o���5k��ׯ_�m۶��(,,�L&Cbb"�,Y���p��_�f
���>��U����L&S9�G�v� ��p��	��!�BH�155��Ǐ��������+�
]�x��/Fpp06lh�p!�B!�By�����=z�ڵk��������H����H4={�T�}.88			�ǜ9s�l�s�Έ��Ghh(?�0'))	�Z�����޽��,�^^^8y�$
�}�����Be�X�j���̧{{{��իX�b�w��
�>t�j�*@׮]��r4j����CRR��������>c��}��'���������]a6鄄dffbÆ
ؼy3ƍ�C�!??ݺuC�ڰ���˗/q��et��Ya_XX���ֶ�@ �1���b�~V�*�m̙3���pttD�޽��{��m��aÔ��|�"77���u鏾}�"::�W������ (�_F"�^^^����gϞ�O�>055-�\E�`����ҥ�BZQQ~��@�~�T��k���G�����f͚HLLDxx8���Q�V-��t�������˗���B�Pa��c�5.u���z/ ��|��rZ�__�2�rlll0m�4L�6��|ݻwG����,--���P<|������z�q�Ʃ��I!���7�7h���ʶs�N�x�-[�Ē%KP�N���8p����	v�څ��t���c���prrBJJ
�Ν�۷ocǎ�8q�B�X�`>��c���",,�O��Wۿ?`ݺu�J�(,,ıcǰ|�r�ٳC�All,�����'�7FXXLLL�~�����trrR��K;�|���M!���صk>��3�7���k�����E������ŕ֎.,X̘1�С���@aa��� �ػw��C �B!�R	�l���'�F�8�<z��ψw��i�7Æ
�H$�ҥK�2�†
�駟b׮]
��2a����b���={6�>}
�L�S�N�Y��I}˖-�S��?lذ��������ERRV�\	�T�/^`Μ9
3�O�0���8}�4���������������gΜ���&O�\�>�V|0`N�<�����r$%%!00����.��,Y��}��pss�W_}�?��/_������D�;EEEظq#222`kk��|_���'`�ر���F^^���0m�4lܸQoqk��������\��x�JU^3e���x��1>ooo,_����

U�R7;Rpp0�>}���"$''c���
��|���8t�1c���'N���p��u"%%���CLL�V}����7o�����cǎaРAHMMEAAлwoDGG�O>��Q��Z�����fff4h`ʔ)޾�J?H���K�	&@,�ܹs�ի��� 55T��q��?T�{y�dee���
�������q��a�z���a}F�;;;�ٛ���!�1t�PFF!����
��&p(���EGG�O���
���!!!���Ł�|�O������O?���1Z�n�ٳgN�:�T��3аaC���bȐ!�0�47�4<<���x�������X:tH�����`m�[n�U�}�5R�C!�����?��?����H~%������PX�V�HNN���?|���
�1����+`�0!�g���$�B!�������pV��үK:z�(377gTn7nT�/�H��-�����|���,77W)���Dִi�2�
�l޼y*��СC���Te9SSSv��2�b/oVVsrrR���=�{�n�Ŧ����r�`��q��f͚��r�B=W�\afff*�oٲEoq��ϝ:uR{]���������mVVV*�UUw�.�͝;�?�۷O�u���hfii��LXX��դ�=z�p߸w�^�e*�������V����KHHP����K�d��}^RLL�B�+W�(����*=&&�լYSe�v���9/�P��d���j_��Wqq1�jԨ�\\\�@ `FFF�U�Vl���lϞ=����jC�חD"���bcc���{��{�����`W�^5H,�BHY��v4���9��͍I$���_f>www&�HX^^�Bz^^�H$��ݝO��.((�ӊ����'**��k׎O���`���J�ũ�.�t��t��ǭ�>WWW�e���D"annne�K!�,<<\�kB��Y�f1���Tim�mۖ}��7�V�.����D"aEEE��T����wKY��B!�BywT�
��Y����1j�(4h���ƨQ����p��	L�0A!ZZ��m�5
gϞEϞ=Q�fM����E�X�x1N�>
333�2...HLLĖ-[УG��b���͚5øq����l�O�>�v��
�X�H�X��Ç#.._~���ǡ���
bbb0k�,�l�����Dpttķ�~���8������#
1�|ܹsK�,A���Q�vm�B�������z�ªU�0�|���bٲe���T����������011���+�9�1c��-n]�y����ѣ,--!�P�~�2�������D"ԩS�ڵÂp��m��3fv�܉�>�������A�n�p��,Z�s��l޼Y��t����c���|ggg�۷�_ц�]�<b�mڴ�v�Qn%����̙3�J��Dhܸ1�O����D�j�Jm����}�Z�h��W*�*����.������yXU����'
(8%���F����J?M����i�p8�4�"%	�y�JM���9KR�43�������>ndҍ�z\W{�׽��{�mI{�{��3r�Hӱ4oޜ��h���>E�+��>�������ʊG}���@�p��W�����o����'''�4iˆ#���O���_-��C�M�6���Jhh(o������NKDDDʐ�u���[�n����&�uz��ŦM�

�e˖\�~����/��_h���[dgg�^��U�8�mܷ\��_�NJ{^EDD�>}:�[�f�����ݓ5:w�l�Ulٲ�-[�0w��\���ʾ��eDGG���e��y�{��:s��>ǎ�o��t:���_hԨM�4���Nnj�&��7����/����E^^^DEE�^n�ڵ�S�N̝;7Ƕ��T�����ݻٵk�ƍt��OOO��o�|���<��y��|<x�7�x�.]���y��quue���%׾}���o��駟ҢE�<�<<<8}�4~�!�ڵ3�s�_���H�X(o6G^�Fǎc۶m,[��
*�w��<��k��mے��͎;�R��iޡC����s[��_&99�-[�P�V-��?���޽{�������WD�aceeETT�����)�iݺ5|��.�ccc�������~�ӽ���Ά
���t*r�xyyM�~�,���@ll,Pz�񊈈���H��Q'R�ԯ_�?�P���J�*aee��?���O>���I�R2t�EJ��7o���ġC����!)))׸�U�һwof̘��-[6m�믿x�gJŅb��ѣG�����~�ԩ���$''s��u��}}��5�u��
���`�9BVVG�a֬Yt�ҥ�k���>��s���hܸ1M�4r��x�9kԨ�ڵkIOO�ԩS�����s[�iӦ����q�#"""�_�z�HHH�'�/���Ν+5ߡ��٩آ�i׮��-D ���ӿ�""""""kK' "RX�ڵcǎ0���PڵkG�
���_��O�={6o��3}x蜋X���INN�ܹs�?��gϒ���ٳg9�<�Ν#99���n޼iگk׮y�y��%.\Ȃ�r�
�G�f�ĉ4l��~�����C�4\6�����#G����/�m9r�鵷�7۷o'11��Ç��իW/�XAx{{LHHH��WWW��5jp��E�����9�[�n�^�����3�|:v�#��ǝ�ڝ:ub�Ν=zB��� IDAT�,O��gX��gg�{6w�J�JM���Mcƌa̘1�NCDDDDDDD�LQ���<p�̙CϞ=9t�={�̱��ʊ���;��t�EJ��˗sQ���襤���(����t��~�<����899���ēO>������8;;S�N�/_ΪU�r����3�|/^L����e̘1ԩS�~�����C���~���P�V-"##	g���\�~�F����c��rU�V%22��?��;v��R�V-z���ȑ#���/�����X[[éS�x���ҥ��ަ��'�����LFFF�s�?�r����W_�����` 00�^x�Hǝ�ڽ{�f����޽��C��ͻ{�n�T����?_��!"""""""""""""\����Օ���̙Ö-[8}�4���8::ҹsgƎK���-��CE�\�����III!))�����.�:R$%%���Dzz�i?kkk�ԩc*�hذ!]�t�N�:ԭ[�֭K�:u����kO<��Ν3�����={6QQQ<��#1j�(�V�Zb�Mfff��'"""�Vll,����N㡳q�F��_��E�pvv&88��qժUc���L�<9߸�����������|�z��W�^Z�������_���m�ʕ+���ɒ%K8{�,u����ٳ>|�Q�F�)�"""""""""""""e�
.D��裏2o�<K�Qh���u���s��z�����…�;w�.�Vǯ^�j�o�*Upvv��GGGڴicVD�裏����VVV%����׮]c�֭|��G�[��ƍ�p�B�R����h׮��-DDD0����]�v�NC���fÆ
DEE�
P���prrb���NDDDDDDDDDDDDD,I"""R�\�t���ϓ��Brr2�ϟ�…f�)��w��Y�&u�ԡv��899���j*��}��;;;�����{��g�!66�>}�P�\�{�ޘ1c3f�=�[DDD�ad0�ɼyu������cڴi�;�!C��n�:,X@Ŋ-������dffbccc�4DDDDDDDDD�\�����?�0K�^8a|}��y����p�7n�0�geeE�ڵM�&���hР������:u����H�ڵK�;Ľ���L�޽��?�I����z^^^DGG��uDDD�dyzze�4DJ�6m����Khh(o������JDDDJJLL˖-cݺu�/_�l[VV7oޤB�
E�?55�C�����K/�T�tٶm��קQ�F���7oҡCF��ȑ#�������������
.DDD������…f�.\ 99�T8q{aEff�i���˛�(��&�5k����ٸ�Xtl޼���icc�6EDD ^^^�N�LS'�����OOOK�!"""�@�ƍٶm3g�$((�4������AAA���h��W����9u��}�'N��֭[:�D
.�����/�0aS�L�z��DFFr���t�R�EDDDDDDDD���Y�Ell콚ZDDD�K�~�,�F��]��o��FJJ���Ν�ё�…dee�����6�B������󄣣�鵃�VVV<ʲ�_�~��Ϝ����v�ZK� """"r_�nݚ9s�0v�X�u�F׮]ٰa���������Ypq��e"##ٷoG����ܺuڴi���mڴ��^�Y�f%���ӧ�X�"˖-#22???���x��7Kl
)�{Vpѿ�{5�����2W�^�����X`q��5�>���ԩS�T,���H�֭sV888P�vm����������<��z�-�mۆ��'������MÆ
�;w.����������ޞ��p~��0�iӆ�{��������5*v�7o��ĉ|��G��ۗٳg3s�L�T����+���z���������}T����xzz��"""b����={���dΞ=�gAEn�u����ё'�|��={������@�r�,xtR����0{�l8@ff&���,]����x�&w������h߾���EDDDDDDD �.:t�?�����p��)ٱc�?�|�}�������14nܘ>}��9u�7oޤq������_%==�'�|�jժ1c��x�
���>|8�-b޼y�o߾�k����������ݕx�Ş={X�`AIO+"""�йsgƌS�v��ԩSM�R�������>J�:upqq�gϞ���B�:u��	kRhS�L��������ݡC�gժUdgg3`��4iB�V�,������g���dffZ:
)�
6����O<��+pqq�A��lْ�k��ZpЪU+S�C߾}���7��/���*���ʕ+G�-Lc���#::�I�&���G�pssc���ԩS��k���������H�J��"11���X���W�S���H���bccS�}�V�����=�u�֥N�:������СC�n��b��Yvv��rx9r��>��6mڐ��Ŵi�,��m���	���'''��ݙ2e
������Y8C�_ڵk�by���׏z��Y:
�������?�����ۛ?��J�*����ۗŋ�gW�������0}�tBCCͶ�<y�:u��(�(��G�ҠA*W��c[�֭���`ǎԬY�Gy��뉈�������H�J���(&&�^M-"""����*�mڴ�M�6%��e��Ӈ/��R����` >>>��YYY�8+++lmm�[nIJJ
4�
4�+V�������i̘1E�&'""""��ܹsy����s�ީO�>L�6�о}�\�U�����;v,#F��Y�f�m'O��Q�F%��?�`���(;;���BBB�1c%������������/�G�����<���KK� `,�h۶��`0��`0�q�F�}7oތ�`���?�>w�q���7x��w�ܹ3=z� ((�?���l���TV�\I۶mqpp0�;::b0X�r%����<"""�������J?�я~��'::��劔���{�p��E�y�:�#�e˖4hЀ5k��;�o���O>�رc����4hP"�&$$��SO��eff���Chh(���*����Y������ϡC�x���quu��ё��dBBBppp�w�)Ҽ��ׯ��lܸ�Ç�|�r���زeiiit��1�;v�lݺ��^{��("""���,�����=ѿK� R����x��y��>|8�ڵ#  �w�yS\߾}Y�f
�^�s�/_���p�t�Bll,������C���533����'�|�4���������c�����ݻ�눈�������H���:~�8M�6-uk���@���u�EDDW�2c�bbb8{�,NNNxyyHŊ���dŊ|��2Ĵott4^^^��׏��XӸ�����^��9��������Ύ~��J�ʕM���ɼ��;�[��k׮�������nݺŴi�X�j�O����^�uF�Q�g�o�>�kLժUy��w�%((�E�1u�T�]���o*�(�={��`�ڶmˏ?�Ȕ)S8w�˗/�����{�мy����ݫ��2�_�~���DDDD�аaC���,X@@@_~�%����l����bΜ9���fw�ԩC�e�ĉ���K���r��5jT���'233qqq�����_$))�;vЦM�b�!"""""""""����Rf„	�ܹ3ϛ
-���C�gժUdgg3`��4iB�V��{�""��~�:ݻw7���̙3s��l�B�r�X�p!�w������g��^�z$&&���Kݺu����
.����w�Ο�	@ZZ�-��͛,^������N�:q��)�>���\�r%����̞=��>##���8���r�
~~~E8s�����n���m۶xzz�믿NBB�
�g�)r������O?�4���[|��7����ǏP�~��?���f1""""""""Rz�+W�q����K/1l�0�y��L�¿��/:t耣�#k֬ɷ� $$��M�������4lذ�%$$`ccC�f�8~�8������-����'�(��"""""""""Rx��"��Ν;K�������ၓ���θ��3e�����s�""�0�3g���k׎C�����?�@�Ν��믉���z��,[��+W�0t�Pn޼���7W�\a�ҥԨQ�����la|_�5n״iSN�8AZZ�Y�ƴ=44�S�NѨQ#���[nܸ�Ν;9r�H���E�7o�ƍ����p�B���J�L>��z�-5jDBB
4���.�|�۷7{o,&����Mc/^��q'�1FDDD�a�_�iLL~~~���s�)�ƍ�k�.f͚ŬY�h߾=ǎ�����{��8::��ٳٺu+@�t�8v�M�4!>>�N�:���b�X���`����R�DFF�����Mc�
"%%���Hf&""��Y+V��U�VX[[ӢE�.]
����M�=z�`����ܹ�Ν;�c�ƌ�s�=Wbk���Ѹqc���?~<`~��ڵk���y�g����k׮|��G9�R�
s��%<<����|�M������_r����f?w/i��ddd�gmm���֭[f]N���r�nj1""""�	&����6cW�I�&1q�D���8|��}�PDDD��ʕ+����������?���9s��]�3f�?�8o��&5k֤f͚��)!!��'OҳgO:u�ĶmۨU�V����+s.Ο?�ԩSy��h߾=d�ƍ9�RSS�3g/���۷��_f�ܹ\�z�,�X8r��I|}}�ܹ3={�d֬Yf�nݺŢE�pww�C�t�ڕaÆ�n�4�u缷�>x� =z�`���9br˩0ǝ�ک���\���m����`�qtt�`0�r�JRSS�9�"""���?РA���L?Ƨ�%$$����SOG�-		)�5\\\L��N�7��<y�:��׵k�s���bgg�֭[�0aO=��������5w�?���'OҢEN�:Exx��vc�õk�Lc��'7wv!9t���S��/_��c�.|�����L]QEDD�a֬Y3v��Ϳ��o�������
|�Pr�O׭[Ǎ7�f���T�T�D���+S/^��ۛ
6��_����ɓ'	

b������W��믳b�
Ο?OVV���DGG3bĈ\o�5j��\�|�/����s皶�����'����Hff&iii$$$0c����
��ܹsIMM5+|(���͖-[HKK�cǎ9�u�ؑ��4S�d�⺽�!7���nT�EY���6�u��n�_t���9{�,t�ԉ��4x��GY�hQ�������Ktt4�Z�"""WWWV�X���_SL�5�������s�ԩ|qfΜ�ѣG����СCлwoSLӦMr}��q�#"""bT���+����<,ʗ/ϤI�8z�({��)�~�z��aÆt�֭�9 ����G}D���=����������_�*�X�l��-Z�`����ڵ��}�a����O9u�u��%""�����d����9y�$K�.�1w���Y�z5{��e���|��7��W� ,,�����k�.���X�j����x����������K���Z�$��͛��8f�)���ӧO�����'++�,��w�!!!��m���?�����(�ƍ�k�.�񸸸\�kԨ��a�سg��'�.]��ϯ�k����L�6�J�*1}�t���M�N�j�e��=�|�t�B����^�z��֬Yڷo�ȑ#INN�E�0�өS'���Ǻt�RR�*"""R,��AAA��у:0x�`�nݚkHZZaaa���ѡC^y�.\HFF�)F]QEDD�,i޼9���xxx���m߾���Eu��	"##Y�|y����s�
.�dX���`|ͤI��W��*U"  ���x֬Yc�3J���OcccC˖-y�w���8���ɓ�W�*T����+W���[�FEEåK���� >>�u��(����=a���;7Ǐ�.(���Uc���Hq===9x��ԤI�����G����۷3o�<:w��޽{�ڵ+|�����n'N�(�5h� ��W�v�"33�0jԨ�
6��ʊ�>����TZ�lI˖-��"�b��		��L�<ggg����<y2)))�.�Ǐ��ÃjժakkKǎ	�s޹s�ҹsg���qpp`�С,Z����ݻ7�*Ub���9�߽{7U�T��/򱉈����k׮1b�6n�ȕ+W���䧟~2}�u���F�Ͳe�8w����$%%��q���N]QEDD�aemmͤI��V�Z���իǸq㊽n�V����)�<"""""""""R��-���t��9�6m�o�ٳgL7?�n��l��5l����������q�x��w���#..��>���Ç���IŊ������
zܹ�x�"U�Vͱ�8f�).֮]˾}�hӦ�ٶJ�*1g����/|||�Z�*�}�666,[���-[���MBBիW�v�ڤ��дiS�ׯ��ӧ�FaL�8�/���C���Ϛ�
��0q��Ɍ=___|}}ͶݾoY�[1��c3g�d�̙9b^z�%^z�%�{;;;���M����Z�j̟??��*W����'K�,��ٳԭ[��w�Ç3j�(Sq�����%EEE�����̌3h޼9			L�2������˗s��1\\\x�whذ!gΜ!88��n�:���C||��!)��NUЮ����ڽ:\�R����c|x�����������.��Å��w>�8��{��_T�d?�|��ի�6m"((��-[r��u.\ȋ/��_|Q���z�uvv��uFFF���9n����b��""RR�U�ƾ}�7n�����ښ�5kҧO���Lŏ������o����
�q������M�|�
4��ښ7nj�¨P�;v���7ߤv��T�P��������5jK�,��Օ�+R�bE\\\�gٲeE<sr�y{{���HTT�i,**
'''l��DDD��(
�]s�����ʔ)Sr�~��WӤIʗ/O�
�6m7n�w-uE���Lu��S����'O��E�y�9;;s��i>L�v�L���ɩH������憛�ǎc۶m,[���s��iVVVdggs��5�T��ɓ's��sS�V-����|�2�j�2�v��eS���HI�Q����c޼yy�DGG�c|�С:��~�8�Hk�yQ������Y�p!.�k����>|x�kK�bggǴi�;v,C�`ݺu,X��D�`("""RΜ9������5Glbb"nnn�Ε�wL�SWT)�[��ҠS�N���������y���1����׭[7��'�9r���,�9¬Y��ҥK��~��W1|��礥�Ѹqc�4i���x�;?5j�`�ڵ���s��)BBB�|ܹ�ݴiS��og3ƈ���<�ڴi���/��������[o�z󢈈��M����ѝE��u'ͫ����ի�nWWT)�T��aÆ��W_q��^~�e�m#G�4����f���$&&�x�t�z���Djooo���			�Qq��z5j���ŋ����������[�n�^�����3�|:v�#��ǝ�ڝ:ub�Ν=z4�
�G��V�""""bIE�����OO��FDDD�d<��c���/|���<��3���>G���gΜa���E�檮�"""""""""""""RX���|��Q�Z�����W�^T�Z�7o�{�Nj/�h��Z�*������ʗ/����
b�ҥ���zmwww���h֬������ҰaC|||x��wMq'N�nݺ�/_����|�?~<T�V
[[[:v�H```��;��{��M�J�ؽ{w�yw��M�*Ux���}>DDDDDDDD�d���5kG�%++���S���u�����~��'n޼ɟ�����N IDAT|��``��ѦXuE���Lu�pvv&88��qժUc���L�<9߸��Frwss���-�z��E�^�
�����������5� ǝ�ڕ+W��ӓ%K�p��Y�֭�ٳg9|�0�F��R�J��+""""""""�����7o����������Î;8r��6�V�bEƏoz���"""""""""""""RVY�Å<8���qtt$**�4���S��""""""""b��vvv,^�777�W����5M�4a�����ښb�T�BDD���899Q�|y����֭K�.5�N���"""""""""""""RV�����{�/p?L���6mcǎeȐ!�[��P�bEg'"""�K�>},�����Pll,����tr�ԬY��� ����$y��q{{{�������wNuE����\H�ԦM|}}	

୷������Y���Hi���I���-�����H�׵kW����W�^T�R�3g���{�кu�]��ۛ
6��ɓuE��K�+�P'�����OOOK�!"""�HTTQQQ�NCDDD�q/�����|��焄�b��F����%������������������î�\����ȃc���ٳ��i���H!u�ܙ1c�X:
)a�'O�^�zlڴ�_�����ԩC�1b%�������������������L""""Rd�~�-�������ҩ���H���bccc�4ʬ{�ݵ\�r�P���"""""""""""""�R���������'QQQ�NCDDD
�����)�������ƍ8;;s��Ej֬ɹs�P�����Ӄ������������=+�����WS����]��"""""""""� Z�f
/^��ŋ�]��X8��=h����������H�x�E�Ν���)�iEDD��իg�DDDDDDDDDD
-""ooo�-[FDDD�.`x���¹g.DDDDD,���4m��l�`0�[�B�ׯ���/���H�@����Ǜ�r;.�s�α|�r���HNN��ƆG}�g�}��booo��<��^���!..����ӿ������HA���ҧOK�!"""��ILLd۶mԮ]�?��
6��_��o���c�Y:��|EDDDDDDDD��J��bϞ=xyy��"""R���DEEY:
��0a;w�,p���78q�S�N�J�*<��8â��N�8�ȑ#�v�i,##��Ǐs��q֯_ϒ%Kppp�wK;t����Z����l@�&Mhժ��S1���TA�����=ɭ[�<x0�+W��ӓIPP�Y���;v��ݝ�-[�}��<�>��s.\��IKK��ɉ>}�0s�L����_�>�k����/_޴։'hڴ)
4�_~)R����S�La�ƍ\�|�f͚1i�$�R���W�2c�bbb8{�,NNNxyyHŊMq�n�bڴi�Z��ӧOckk������:#F�(t���������HYr�:\dgg߫�EDD$*|��Ν;��~g��ŋ�?>7n��>+�yל9s�v��ڵc�ر4hЀ��,~��G�̙�O?�Dxx8ӧO�w��ܯ����t�����	www�L�Bll,vvv�%��DEE��YDDD����f�ҥ���0l�0,X�ҥK	4S���ϏK�.Q�n�|��1c�YLbb",�ҥK|�駼���̜9���Xh�[�~=���J��=�<�ڵ#))�4����СC�y�i���]�~��ݻ�}os�����9p�[�l�\�r���3{�lS\FFqqq���q�����
'""""""""R�ܳ�#��ܿ���f͚L�8��7��?Z:�B;r�3gΤz��X[[Ӻuk���qwwgϞ=�L�"##III1��aРA�X����H|}}-������,XP�N)�1c�йsgK�!e���9}�4�Z��駟�U�V�jՊÇ��7�УG���hт�{��ut�m|���,\�ʕ+����޽���b���|�����Zp���/9�����$���899������fΜi*�(hܜ9s����]�v,Z�N�8��Q���믉��0u�X�x1�7o�{��ddd��g����KXX�����q"""""""""eI9K' """"��D�=�С�f�֭S��QZZaaa���ѡC^y�.\HFF�)�}r�#/YYY�>-� �ܺu�E����N��ڵ+Æ
c�ڵfqy�_��W͚5�����իG||<۷o�w��ңGF���Z�'O���חΝ;ӳgOf͚Ezz����lSSSY�r%m۶���4���``�ʕ����z^DDD�o�����XK�!""r���ƒ��h�4������-�h���,Y�$�&N����"����TnݺE۶m���bҤI�������ԪU�7�|���M�6��_�w�^����:�6�
6F�ƍ�R�
�/&;;�����q111�X��V�ZammM�-L]7�/_n��R�
s��%<<����|�M������_'""""""""R���E	8~�8M�6�u[LLqqq�oߞ������DDDDJ�k׮1b�~��w��O?��;3#6##�ѣGs��1�XRR=z���pʕ+|Mqvv6/^dΜ9<��E^7<<�O?�����IBB			\�v
//�B�W#F�`�̙�����ۗΝ;��₍�M��;w.���f��5j�醄�ׯ��_p��-��}�[�l!--��;��ֱcG8�֭[y��
}<"""%��ӓ��(K�!""rO��{��b����7�q���Y�f
�/_�Z�jf�y]��s<))�W^y��.Glvv��	g֬Y���lڴ���,z��m���(�Z�n��I��4�X|ѠA�\�'$$�^���2|�p�n��֭[	$  �q��Q�R�Blj���������%�pQL&L��C�ΤI��8q"aaa>|�>g("""R�EEE�����LDD���g��Ź��|�r�;������|�����ЪU+8��u����7�o����a�`0жm[z���֭[)_�<#G�,Һ��b{XX���g׮]����jժb�����o߾cooϲe�9r$�>�,o��&111f�8�v~4h�޽{�>}z��ԯ_�իW�w�^�������|�{���y��9�nj1"""""""�p�����Ƥ���c<��������|��w4jԈ	&�?��c�:u�0j�(v��ͷ�~�����_~�X�����q�n��w��!��ٳDDDЩS'�����GeѢE��)KTpQL;w��u<==���@<<<prr���www�L�Bzz�}�RDDD����`0�;n�A?  ���~\]]�2eJ�y���+���iҤ	�˗�A�L�6
��79����Ӻuk>��C�����iQQQ���p��%<<<���7+̸z���ڵk����?���`��ѣ����xzzr�…�3x�`lmm�7y�d�իG�
LE�W�\1m/�g{��q��"�;=���f1"""""""�p���`ӦMdgg�ٴi�Y\Qlٲ�}������Yg���L��I�&Q�B���ؼy3�ʕ��_,V��=�G��7ς��/9}�t�9dee��רQ�aÆ�g�8�?��O.]����_��DDDDDDDDD�
�\�y���&22���h4h)))DFFZ03���̙3�n��l���5Glbb"nnnf�}����ɓ^���a���4m�^x�\G-̺�ƍ�B�
���1o�<@DD�]�zX��7o���,`۶m����>}�ٳgh���iذ�鵽�=`�t��|�/^�jժ9�nj1"""���}[~Œ111������GLL�}�JDDDJ�#G���w�Ѽysz��kL�޽iڴ)���w-Dȋ�s��͛�~�:4�b��%�kggg^�u����x�":t�G)V�Ƃ�q�Ƒ��HZZ���?����q�Ʀ}׷o_<==9x� YYY$''3i�$����ѣ�)�aÆXYY��G���J˖-iٲ%��C7
'""""""""R����n�bѢE���ӡC�v�ʰa�X�vm�ش�4���pss�C����+,\����SLnOkHMMe�ʕ�m�S���#���+W���z�TDDDIJ��Ɵ��fO��]�/�NW�^-t�������ɬY�L]��n�^�شiAAA�lْ�ׯ�p�B^|�E���|�w���ҥ������lmm� ..�@�������un��QA>[�X�r9��8��"""R�L�0����:t���p&M��ĉ	����9C)-�,Y��1c�+++ƌ��ū��
�СC����M�6|�����4��<y��;��_~����_���ё}��Q�~}*W�̇~�ԩSM�4��ߟf͚�o�>ڴi���
NNN���R�R%�̙cv,������S�B<==x��g'""""""""R�������p>�����$--���f̘ATT�).##�ѣG�l�2Ν;Gff&IIIDDD0n�8����f˖-���ѱc��:v�HZZ[�n-��y=��cf�s{�������so���s�"�ЬY3�Bvv6���\�r�X�������ƒ%K���O��ʕ+̝;�c� ��5�Xa:tܮy���t��:M�V�p/泭U��/_α�8f����V�j);w��u<==���@<<<prr���www�L�Bzz�}�RDDD,-##���(j֬�СC���z��DEE�aaa0�ʕ+S�bE�y�V�ZŴi�L�og��	��+�;_GGG���π�^�:����iӆ��Xlگ�qժUc߾}�7����cmmM͚5�ӧqqqfGG�Œ%Kpuu�bŊT�X���Y�lY��DDDDDDDDDʒ2Up�z�j��/L���Ϯ]��`ժU���˗s��1\\\�����o�%&&�V�Zq�֭[��Ӛ�����Ʒ�nj1""""e���?��Y�8z�(YYY$$$0k֬�ݻw   ��~���7o���`0=z�)�XА��X�<^�u�֭˥K�X�xq��}��W1|��礥�Ѹqc�4i�w��Q�k׮%==�S�Nr�<s;�A�?1q��ٜ<y����^�ʮ]��4i��q�Ea>ۦM��+��q�#""� ����Odd$)))8�46h� RRR����`f"""b	���������T�T)��ʕ+s��%.\����-��ٹv%�k�z��\���W����η�~K����:u*���lذ�,�x-�iӦ<�������g�ʕ\�t�7n���G�}W�F
�͛��ӧ�����?�d͚5<��S9b��w�}Gzz:����h�W�^�8���~-���;���S�*U��իW����ԩSt��
�_P~��W���@�
�6m}��a�ƍ���'�u�?@���sl{����bDDDD�:///6o���ӧ����7��LJ;vp���'�T�X���Ǜ�רQ��/����ׯ�wn;;;�N�ʨQ������^�'�(������������[�n�^�����3�|�\;��)���޽;C���>cժUf��F���g̘1E>?EQ�϶S�N�ܹ��G���'��G�ХK��QDD�ab����ڭ[�X�x1[�n%))	6lȫ��j��VA����X�d	_}�.\�G�^`Ĉ�	o���RSSY�r%m۶������``�ʕ2��U�ޛ$"""R���\�v��ӧ0q�Dg$"""""""""�T�:\�7�
*Ǽy�0`\�~�,��_777��
���ɓ'�]��ŋ�^6�cDDDDʂۻ����Ύŋ���F��ձ���I�&������T�BDD���899Q�|y����֭K�.5�0q�D�֭K������(P������ߟ�7o2gΜ"����NPP͚5���[[[6l�����)n���xxxP�Z5lmm�ر#���w�1��;v,���t�֍ڵkS�\9lmmiҤ	o��&�}����FQ�Oa��ݻ7�*Ub���9�ٽ{7U�T1u���	�O>!11���L���HHH`ƌDEE:.##�ѣG�l�2Ν;Gff&IIIDDD0n�8nݺ�o>[�l!---�"ӎ;����֭[K��������=NNN�����U�Vw}�����������<��[��;o���{�C�^�h߾=;v���/���g�…,_����z��^{
 �6÷�z�j�ۭ��(W.g=�q�#""""P�fM����ƒ��x�G�����������/�9{��E�^�r����I�&1iҤ�]�.�uss�7����������y@���i߾�]��k�����r�o���m�ʕ���dɒ%�={��u�p��Y>̨Q��T��]�JDDDn�z�j���0dff�q�FBBBX�j^^^��[�|9ǎ��Ņw�y��
r�����9p��֭�O�>������޽{h޼y�\�c{�?��>��:��K�D�l6�7iy�t:����&�p��7[Ocj8cjF���gD*ṵgM7"4.Ó�N�I9i��t�eBd�(&�?��="����|��Z\��}}>�ko׊`��������'?�����[�;V�������nN��v�!����ĉ����e��]���\�ɤ��B�޽[&���k���[����p�z��]�܅�5�F����J���*88X*,,��/�,Iz衇N��j�{�w�}WV�U111�$��*�ɤ���v�@s�n6ޞqwwץK�d�Zu���3F���
oQݾ}�$I������$
0@			�0a����c�!�!�N��$��ׯ޹���ש0���w�#�@�o�Ѕ�?^f�Yo���*++u�}�iРA�$ggg{�رc%Iqqq:y��{}��z��d6�5g�{�m����"���%I����2��l5���\�����G}T?������<���K�f�28!Z��ﭛ�����������(;;[			ruu5����ϟ��ݻ+77W���o5y�d�������-����+44Tf��ek�8}�t�yΟ?/I�ٳg�s�1[
t��QQQJLLTRR��������?c�}�����ϯ�$]WWW-X��~ܫW/�?^aaa2�Lڽ{�F���������μ�TPP I5jTk�@���}���ӗ_~���j���?��?��3g�����h����ÇWtt�V�^-I�;wn���舮߹¶�E{�hq���`��?�;C�?�\o��mۦ�s��w{mj]mmm��]�t����88��m�V�a
F��9,,LNNN���ԙ3g$I}��ѨQ�e����Pjj���?裏>RYY�z��!???͙3G��{��vѢEڰa�JKKU]]-I
		Ѻu딓����~�N���yxxhܸq�p�����,�,��Q��Z�����������P����ĉ����e��]���H��:�ɤ��B�޽[&���Yz����R]�pA�{��s�…��(n�.$�p|3���Z�p�.\�h]pp�������C�E)))*..����$���Xǎ��ٳ�����nb���*..Vll��q�w�}���.Irvvnv�رc�y�f���)&&F��w����j۶mںu��f�6n�(針*jkkUTT��}�J����R�k�(,,��@G�`t��***J��޲Z��1��*�ɤ��H��v`��5))I�G���?���8I���_��f̘����+??_���
PHH��n�*WWW-X��^۫W/I?�8��OJ�F�!I*((���66jԨֹyhn����&����ɼ7��榄�=���>}�$);;[�ׯ���k�f@�j��E5$,,LNNN���ԙ3g$I}��ѨQ��Mͩ���Pjj���?�υ� IDAT裏>RYY�z��!???͙3G��{��vѢEڰa�JKKU]]-I
		Ѻu딓����~�N֜�yxxhܸqm�z@su����d��኎���ի%Is�έ�T@�� ==]���F��`�X���6�P�Ghh�BCCozmS�<==�p�B-\��Ѻ��`��ѣ�,�RRRT\\,___IRqq��;�ٳg������t�������d�X���͛�	&4S߾}����TTT��}�]Y�V���H��V�L&�"##
Nuu����2��m2ogy��������k��钤��l�_�^������h�@��_�^���F��d�Xd�Z���������իWK��Ν+???�S@}4\��M:�iӦ��Yv�hk�E���Ш6k��4iR[M
�����n�CkOطo_EDD�����"""`t�N��w�9r�F����7e6�%Iyyy
7���8u���뮗�����\IR`` ����Z��"==]ӦMk�i@3X,Y�V�c��^xA���oQ�Ƶ�=���d�رC����<y�
�aÆ�RR�Z��ӕ��nt@k�����̶�4��G�_n�	�)����sTUUiɒ%
��d�$���)>>^YYYrss��5@�7o�&L�`t�T@@���ڬ�"""����صk���z�f���i�����TVV�)S��ǦN���۷+--M������S�5\�)**�ĉէO�ܹ�������ٳڹs����?�PYYY:y�._����[cƌQtt����\��F�o��V6l���UUU�G}T�/n�i����*++����}���o���w߭�{L3gΔ�������redd���_^^^�qooo��feddh����ٳgS_ZІ֯_���t�cЦ�V�,��10\�m�(++ӫ���Ç���F�E�7o�Ա��������\IR``�&M�dp"�Ρo߾2��:r���������竸�X�ӧ��|�M���Թ���T�x�V�XѤ5����3Ϩ���>���﫢��^�Y]]�9s��ĉ����������@���rpp�$}����TPPP�y���t��a�ݻW'Nl�=��g�Xd�Z��@��֭���0�p#���裏TQQ���j�;w��H�=zT���z���h�"����:v�ѱ:
[���[g|Ϟ=����pI���%I���:x��?�w���$)''���mݺU����ӧ��l٢C�iӦM��_�Z��)k^����g?޶m�N�8�x@�����O����aÆ������ζ_w��AI�СC�e���j���p���/�'>\W�\QBB����QUU�%K�(<<\&�I����xeee������1��M����]wݥ}��iѢErvv֕+W�o�>yyyi��ђ�O>�D�����/��{�����9"I�t�R�s}��ǒ�ŋ�?��$���O��������ש��5���'IJLL����$i��JHHЄ	�g�M�0A�t��)IR�~���ӿ�:5��cXÅ��v�>�ZW�\��u��M...햭)���TVV�)S��ǦN���۷+--M��������4~�x���)''G�>�����?�…�5k�%I�Νӂ��_ԛ������}��W��|��C=T��V�,**�$���6x�����ϟ?/I�ٳg�:ۘ���N���<������\IR``�&M�Ԟ��M9�!�>�����~l6�������l6kϞ=u�}���e6�[��׸v�v��w�i���9r�}�Q-]�T�Ν�smyy�222���////������f�222T^^~��@畗�W竱�zJ���_IҞ={���`�B�^y�}���ӧ�"##�l�2eff6;��Q�	'��}ȷ���2��!�[�n�$��?���l5��^дi�<w��Q%''��_ԢE����رc�ڎa;\ܪ��X=zT���������R%%%���K�/nѼ/���v��-I�|����٣cǎi۶m���$}����TPPP�냂�t��a�ݻW'Nl�
�&|||�����@�|�y�:����&����W�^��3g���_�r�������GgΜ�g�}V�g����z�����dRaa�v��-���h�޽{���T.\P�޽뜻pႽ����op���JK�,Qxx��睰�0���+++Knnn��D��ᢡ� _�gϞZ�|�***�t�R]�zU˖-SEE����u��_�^�Rjj�|||t��Ym۶�^s��AI�СC�]o����&N���^3f�Puu�����;t萪��u��I�����/^�ؤu��?�S������>�LW�\���O+W���57[Ӷ�DQQ���رc%��+�ɓ'������o��k��&�٬9s��k,I*,,���m�V:���U������LS�L��M�:UeeeJKK30��vk������?6�h�)���e�X��g�������OS�L��~��猍�UPP������*..N���G�kN�:%I�ׯ_���_�77j�(��}���ܘ1c$IK�.UPP�"##�����~��ɓMZ'22R�Vii�f͚���@EEEiȐ!�j���m����0=�䓒�3f������Wdd���[����U,��3b�I
�a5jT���ޮ^���7*,,L?��F�����֮]���VVV��_Whh�~�a=��z�7T]]m�i�wx�T^^�������ٕ���[f�Y*//o�;���!w�h��s���{�����5`���W�����6L���W_��Ο?/�]6�g���ƻ��888h„	�~h\��a��/*88Xnnnrqq�O�S�Z�J�f͒$�ر�I9\\\�i�&����W�^rqqѸq��M�-YsѢE������JMM��b��d����<==5f�m޼�Ύ!!!rwwWNNN�999���иq�t����?��***RMM�*++u��q��7���j��UWWkΜ9ڲe�Ξ=������(55U����իW]�>Pee�����

Ree�������ͩ���v�'�5����T[[k��޵O껞�Sݗ�f�����v��6v��иY�fٛ�׳gO%&&��:���l�g�=z(66V�����6u���`׫����…�p���6��bQJJ�������+I*..ֱc�4{�l���7:�$�ܹS����l6���F{��QRR�v�ءiӦI��mۦ'N���ŋ5p�@*11Q�Vvv�&L������w��AI�СC�e��<xP'Nl�����w�ذa�N�>���_gΜQrrr��Ƈ��
���ӧo8_~~~��G�J����X�޽%I.\�w�m�V�LTT�����<y�j��d2)22�d���fs�����[���jUff���(<<\yyy��ζ��۷O�����A����QPBB�$iϞ=��s��)IR�~���߿���:u�ő#G����aÆ)55U~~~ھ}��9b��ի�$i׮]���ҙ3g���t�9W�\���]�rEG��?�8$$�^3x�`IRaaa��mc��f��ܔ�����l������D���JHH������@'1�|u��]�����o�ɓ'+55U�/_�SWTT$I


��2a�I�?�D�Ο?/���g��@g�dt��*//WBB���ݵb�
999)!!AS�Nղe˴c����Scƌ�Ν;�n�:�[�N�t�y��.͘1����߯ɓ'ۏG��������@~~~uj

$I�F�j�;��`��኎���ի%Is�έ��&������v��~�-+00P���y�}���z�7�m�6͝;W'N�$���6:ϥK�=o�Q����\lc�����"//�������Z111���$���(&&Feee�],,X���p�q�rqqQPP��,Yr�y׮]��#G���I^^^z�駵q�F����kBBB����z�������C�ƍk��d�X�f��Y�FS�N5:�<==������[����ŋ�v�Z{��d�$�޽�;�k�>���{��$]�p��9ۘ�:���EC�׎�\�R+W��W��O�'�����)66V���7�_����N7ңGY,������X�������b;vL�gϖ��{�s�i���*..Vll��q�w�}���.Irvv�׍;V�7oV\\�bbbt�}�����mۦ�[��l6k�ƍ�~ة���VEEE�۷�$i��*--Uaaa�Ɗ��B{
tv��p��EEE���[V��>f�Ze2�i`2܎���$��3��ѣ���+..N����g��1c�����|EFF*  @!!!ںu�\]]�`�{m�^�$Iaaaz��'%I#F��$��`5jT�!�/.Z���M			���VII�JJJ�����������˻��m%,,LK�.Ր!C���"
8P3f������uJMM��b��d����<==5f�m޼����-����U]]-I
		����rrr�e��ɑ���ƍ�7m���������իWK��Ν[�i�����t���4QVV�,��1�FBCCz�:OOO-\�P.l�.88X���u�z��!�Ţ�����W�T\\�cǎi���rwwo�M@A����O�X,|Hܶh������P@@��1��EEE��wߕ�jULL�$�j��d2)22��t�:h�@�͛7O���3:@�a6��dޖ>L����ܔ����^ӧO�$eggk���ruum�,�Vh��lÇWtt�V�^-I�;w����N���4Kzz�jjj��ZIVV�,��1n�E[�X,���e�Y�EVVV[M
�������c��
���.&""BF���i���I�&���0ȼy�4o�<�c��Z���b��b������v�����t�����Z��"++����(++KF������-]ZDD����kt:�Vk��4iRkM��ʕ+
		��ŋ���F�t`���Ӽy�h��pa�Xd�XZ#"55U999�ׯ��QܴiӔ��ntڔ�j�o?�w����ҥKZ�l��{�9�{�F�t��βZ�F��M��9�B�����իUYY���x��:���EDD���F)--՚5k���GF�Ё����ֲe�ԫW/͟?��(��LYY�^}�U>|X555�X,ڼy�$)//��p����Tnn�$)00P�&M28�.ܖ������jӦMrss3:�6��>��~|��9�4��ѣJNN֎;T[[�ɓ'kРA6l����]�p�d2��j�*EEEp��ϗ$���>|��\����cC]���JK�,Qxx�L&�$),,L�����ʢY�m���`�;�S�-���[h}f�Yf����\�b�spp���K{Ek���4���iʔ)���S����Liii&���'��vtm#�������&���8��f�ٳ�ε���f�bcc�]s�׎ێ���;-_�\#G�ԣ�>��K��ܹsu�-//WFF�������e�����lVFF����o�U�������������^y����J�JKK���$///-^��E���ڽ{�._���/jϞ=z�gt��E{�|���Jջ>((H���ڻwo�n:.�v���W�k�mz���˗���BK�.�իW�l�2UTT(!!A���-Z���Z�~�:���T�����ٳڶm�������C�ֻ�6f������@gg6��4�Psō����b��j������?��S��g?�Y�s����w�x���s�꣏>Rtt�$�ԩS��~��ջ���uj�+c����;w��^?~\Я~��[�/00���a�$I_}��}��~�e�z�1[
te�pධl�2���륗^2:
��~�
������V��֪[�n������99�u�իW%I�z.�m�k�llc�����@�WTT�W^yEݻw7:
Ͳa��>}Z���Μ9����:�m���ӧO�p����:�G��$�s�=��޽{K�.\�P�zۘ��2.ty����Utt��Qh�#G�(==]Æ
Sjj�����}�v9r�^ӫW/IҮ]�TUU�3g�())�s�\�R�r劎=���DIRHH��f������z���l5Е�p�K;z�V����bt����\			rww׊+���d?^�l����%Icƌ�$�[�N�F�ҤI�t�w�p޻�K3f�P``��}�Y�������ɓ�5#F��$Ի�66jԨֺU�h�Х����l6+""��(��H^^����Z|}RR����k������G���㣘�����w�X�`����u�w���EAAAZ�d�
�]�v�F�)'''yyy�駟�ƍ�4%������]999����ɑ���ƍ��{������V��}��O�'�|�nݺ���1�[�r�V�\Y��'��O<a?vssSll�bcco:�$�q�Z�n]��z��!�Ţ�����W�T\\�cǎi���rwwot�
��@�t��U���K


ըQ���@�%oooY�V���j��dRdd������p�K����/�K����FG��qssSBB����URR���egg+!!A���F��v�dth���z��g��@�5|�pEGGk��Ւ��s������T�~h������]g�Xd�XZ9
tF�hh��
�q2:Йdeei„	F��1.t	��f����[�ѣ��q]XMM�&M�dt@��@���/��Ņf@��Z��Z�F��.tz;w�ԡC��駟�ŭ_�^0:mj޼y9r��10����V����׿���L�"����O?�TYYYF���dee�����t�p�S������B���{FG�&,��V��1hݺu3:;\�.^���˗+::Z0:�.���֫�����j���@�dth�����2d���.���!�:uJ��3f6���޽����iӦ�'�h�xMb˛��gk�$��ٳڶm�rssUZZ*ggg��a� IDAT'?�#�<�)S���ӳN���iJ��������\IR``�&M��.�h
:�Gy��t/������&��N��_�l�2yxxt�������g�UEE�}���Z�N�ҩS��{�n�����˫�y�v��Q%''kǎ�����ɓ5h� 
6��h�m��n���=���W�k�޽z���%I[�nm��-r��Z�f�***���t��������!C����D���7��!�ר�UUUiɒ%
��d�����������6_@�h�Z��l��l6:F���.-Z�H���_������%I+W�ԠA����$WWW=��CJLL�$8p�Ȉ7������2M�2�>6u�T���)--�d$������ܹsZ�~�8���*
8PO?��/^,IuvW���TJJ���ۧo��Fw�}�{�1͜9S...�T���}Svh�r�$�[�n��5e]I�z��6mڤ�{����D���8p�Ə�	&�4Wcy����K_��Ν;�;S�u}���3ߍ�}�i�&-Z�H�
�ƍ�e;����ڵk�����ݻ��?���ϟ/777��M}o��˕��!yyyٯ�����lVFF��O���={�{]�.�vTQQ��3gꫯ����<y���kUWWkΜ9:q�}���D���*((Prr����mmm�Ο?�5k�H�~�ӟ�x���d���[����?~\ǏWEE��M���|M1s�L�\�R�f��SO=��#G����s��Z�v�����4>4d��ٺp�$��������W�*..NR���>�@���


�w.((H��޽{5q��f������h1�ժ���J>>>JMMաC��iӦ?�m�6�8qB<����駟*33SÆ
��Ç���-���yyy7�-���﯐��ݻW���z��g[��$�ܹS����СC��O+Iڱc�-�V���SO=���Dyzzj˖-z��g��#���Sff�����4�$
0@Ԋ+�ӯ_?�ܹS�3�<#I�裏����<xP�4t��z�lc�Ơ�@�p��e�?^FG��k��fs��������������_o�}��I�5h� 9::j��JHH�$�ٳ�ř��CiÆ
u27w]wwwI?4dff������Õ��W�1�-k׮]ںu�~��_�l6���@���,����&�)�����Ĩo߾�޽�}王/��7�=uꔤ�8�׿�:5��dth��_]�ӟ��o�[RXX(Iz衇���ի-**�$���68��ӧ���mW��/��Saa�{�z��]w���Z�|�rss����7�|S�<�,�\]]���V:TC�Ռ3T]]�͛7kӦMz��W��+���z[���8�����$��ի��漷�ϟ�$��ٳ�9ۘ��1��@�w��y�Z�J,�����q�'//�����%�����q�n���{}�.]��쬞��Z�d�jjj�j�*��-]788X���.]�����˗��o�������F箮�nv~I5j��f�����sqqQTT�$)77�I�5ewIrvv���eӔ��6��P�W������h����7�����bbb���-�ӧ�$���?�3~��$�L&I��ݻ�5o�������-�0d�M�>]���JLL�ŋoi]OOO���*%%Eo������t��E�]��^ck�����5g��k
:T�l���DC�m�9�m�޽%I.\�w�6f�`.th_~���x�
-]�T���F��7N��j�*�ʕ+:~��V�ZU�v�ر����8�<yR������[���k2�͚3g�����PTTԤ���/�����ڴiS��?~��f��~�mUVV��ӠA�$���W�^��]�v���JgΜQRR�Ms6t_S�N�$�����W_��ӧU]]�K�.�O>ы/�X�>Z�Ds���K�Wsȵlc��p2:4&..N���ӬY���@��6m���}��oӌ3��1c�>��c���+22��9WWW-X��~ܫW/�?^aaa2�Lڽ{w�s���iٲe�={����4q�D�s�=�^7**J���JJJ��@���g�~̘1ڹs�֭[�u��I�����x��;v��O���[�jǎڱcG���y���i�漷#F����UPPP�u����IҨQ�Z=#��c�֑#G����U�V�yB6]^^����<���M�6)44Tw�y����4h� �X�B����b����Pjj�,�L&����1c�h���uv@X�h�|}}������&����ӤI���k͚5-Z7,,LK�.Ր!C���"
8P3f������u,Pxx������(((HK�,�i�����?���d�3F?�я��� 
4H�=���n�j�U���Os5�
		����rrr�͓��#���ѭ�����А/��R���Z�b��u�ft�mhڴi�$����qk*))ѓO>)egg���0΍�ۍ7*%%E�v풯��$���X&L��ٳ5s�L�"��u��MV�U���cn'�p�ú�{�?��?4[��ѣG�l6����ŋu��U}��� z�!������FEE��ۻN��j��dRddd�fP�������?���~[IIIJJJ�s�W�^�5k�A�p���޺��)!!A�?���O�.I����������n�4�����Ĩo߾z���_���Z?����k�̙���2:"Z�%������իWK��Ν+??����4\���A�E���(he-}o��tLF����i�&�9s��(���ti555z�w!͟?_yyyF�tp4\�0�m�6�c��#G��W���|}}�s��i�ƍ*--դI�������M+V��ڵk���>��c�;VC������}�������JOOo��
:���x���W�>���Q]��ѣu��a��������ӄ	ZuN:����#�!�phEEE���O���
EDD]�ѣG�}�v�رC���F�t���$��ѱ����l���phдiӌ��
���]�K/�$M�8��(����?ז-[�����7*44�]�_�~�����uMڛ�j��b1:���Ц�@6�����P�V�o�>�۷O���W�n݌��Ξ=��۷k˖-:~���Y�fiذa��X,�Z���
@[���.��իz饗�_��_=z��q�����/�O��<==�7�|SAAA|��h�����"}��F�p"""���.���Z!!!���4:
����T��ݵ}�v����{��FG�Fh���hڴiF�pjkk���.���U�V�2:���ׯ��y��cthf�Y������qs�m�S�Ni��;�z�����͕$jҤI�<'�.�l�Ozz:
S�Օ��)33SO=��|}}���fx����5j\��ѣJNN֎;T[[�ɓ'kРA6lX+%�[C���w�}���lm۶M���w�{��Vt�MM���[����JK�,Qxx�L&�$),,L�����ʒ���-�����jkku�͞=[��ޚ:u����;����믿�O<at�6a6�e6����a������LS�L��M�:UeeeJKK30�;\�N���T���F��M�޽[�Ǐ׿�ۿiɒ%�2e�|||��e���"M�8Q}���Ν;�?~�Ξ=��;w�O�>��������'O���˺��5f�EGG��ݽ�5lM��t���jÆ
ڿ�����裏j���
^�5�m"�~���J���h߾}��ot��w���̙3���b����\����}���[f�Y�>}�z���ԗ��ػ�����þ(��F�9Jn�f���㒙i)R
).c9��)j.a�4f�[�&����������$�~#�e9����w�p<����z=����s����>$����-""""rW(�BDD�6���X�x1qqq�:u���*W�L�F�		�Ӿ��V�����Ғ����y�ؾ};'O��h4R�|y�֭���?O߾}-6`�̝;�w�y��/{λqŝ���E��|."""��־}{<�O<a�Pl�z����w�^<ȓO>i�;x� gϞ�Q�FT�V��3g2�|�����,_��+W�0a„"͙��Fhh(gϞ5�mذ�k׮Y���9�F#���'))�\�믿�`����O���y��ƍIOO����j���æM�x�嗋t�""""""""""""""w����_�;w�:ЬY3�͛Grr2�FΜ9�ʕ+�ر#/��W�\�u���ÇӰaCfϞ͑#G��� ''����Oxx8�?�8+W���ƥK�l��ܩ��D�y�233m������ׯs�ƍ띜��l��)�`ݺu��ׯ�k׮|���9���xv����ٳرcG��[�d	gϞ�Z�j,^��]�v1g�RRR��eμ'g$$$���.]JRR���,[��~����h�~�i���Ú5k�����W��U�2S[R…��H>~��7�4iBll,�<����>|���t���HNNf�ĉ�-[����өS'���m�c�ܹDFF����{����z�*�����lٲ��^z�+W�УG�M]w*77�f�8�����"#G���o�����֡���ڻw/o��&�<�����ñ9???����[�lI�
ؼy3ׯ_ ;;�͛7S�re�7o����ٻw/���'66�O>��)S�p���"ǵm�6F�������4hЀw�}ת�̹y�f"""�]�6���ԬY���{�_B	��?��c�=f5N�5,ڈ�������������ؒ������p��qZ�h��U�(_��E}�:u�K�.4k֌��Y�f1h� E�`���X�|9�:u���X�"�[��u����ߟٳg3i�$V�Ze�PE�m۶�u�ֱy�f����8}�4K�.eɒ%$''S�n]�Bݺum����Ν;�p�Bv��A�V�عs'�/_&,,{{{����‘#G��(NR�3gx��'-ʟy���w2��ӧ�~�7���k��…�-[֪����FDDDDDDDDDDDDDĖt…���N�:EXXիW���///z��IRRR��
�m�n���@�nݨT�NNNԪU��#GZ��uǎ���R�R%bbb��-���>n��p���dz��EժUqrr�jժ��ݛ���B�n�1�U�V������I�N�سgO��RRR�߿?���8;;S�|y�}�YƏϥK���S��
S�3�Ѯ]�B�5j��޺�����ԩS<�쳸����/Z��U�����D�=�\�2NNN4hЀ�k�8WI�d�Js}EJCnn.#F��m۶����u8""RL			�jՊ���o|������~�ȑ#�5
///[�hs			_�����K�����7�7O����K�.�~S�N�ȑ#T�V���`ƍGttt��2%Jܚ0��`��;��v	y��2��lgg�?M�ʔ�)"""""""""""""��p!""6�c�:v�ȕ+W�e���,[����V�\I��5������ŋy�7���1�?~�)S��i�&v�؁��;K�.���T�P�s���6lhQ�n�:�u�FFF����X�x1_}��V�*p��?�@˖-��� 33��kײq�F�m�F�&M�m���K�֭IKK3��F������Y�h�w�J�*�ۭJ�~իW���,^�����Ǯ^�z��ޛWhh(���0����l޼�Ν;[<�йsg>����}���Ui��Hi�ꫯHHH`߾}�EDDJ��͍�+C�ptt�uH�Gy�ƍObb"۷o�E�T�\��f���,X�OOO���0&���&MܪZ�j?~�������o.OLL�j{'szyyq��)֮]{���+�����˗�X��E��˗�mDDDDDDDDDDDDDDlM'\���M]�p��]����Ɛ!CHII!##�]�vѧO�F#AAA����rss��"""����3��	���GNN����ĉ�F�oߎ��7`ʔ)�qqq���E�ggg�6m�����,55��ݻ���A�ΝILL$++���D:w�̵k�x�WHMM�w���P��y���v�۶m�V�Z�F&M�d�vȐ!���ѷo_RRR0�����u�V�ׯ�ɓ'?~|�ŖWI���7��_�~�iӆ�3g���č7
�ϴַ^痔���¡C��|�2ӦM��@�K�

2?�Ç������iժ(Ҝ�)�Z�����ׯ3j�(���x��m����@���Y�b�;wV�E)y����ɡw���F�v�o�]�va4INN&<<�\�7�0�۷ ""���������Çy����s�9M�O�>}�\��ѣINN&''������'����G����m�ԩ�<)�V�2S[R…�����ٳ9w��F�⣏>���7n�ܹs<x0�/_fƌ���{�nƎ����	

2�͚5���,^}�UfΜI�5ptt�Y�f|��,Y���޴��^�z%���ӧs��U������'''|||���!  ��/�駟�ۿy�������s����F�-�;w.;w�hkz[�ԩS����WWWZ�lItt4�W�.���*�
<��Çcggǖ-[8p >>>�+W��-[2j�(���;�I�+<<___<<<�Z�j���ϝ;�?���V�ZC���qrr�g�aÆ
����8v���Ui��Hi�3g���U⒈�������H.\�`�P�R�5kf>ѢZ�jV'�l���c����Opp0G�5�'''i���`�ԩCjj*aaa4nܘ^�zQ�n]��E��t�E`` /��"p��5jp��A���iԨ�ڵcɒ%���0d��8�=���)��f͚�DDDDDDDDDDDDDD�&%\���M�[��A��[ߧO6m�T��/_�G�dggӮ];&O�lQ�e�h���Ϗ��\N�8a.����L�2ŸK�7o�w����[;;;F�@lll�����Z��6`�&�jժСC�����_�u>>>���r���R�-�����``�ԩ<x�aÆ���`��ի|���L�<�֭[S�N�o�~�8�ӢE�b�)�s_�v-#F��z��5���ߪ$kU��+RZz�!ƍ�c�=f�PDD�KOO'**����S�zu"""8x��SIHH !!��z;;;�t��L\0�a2|�pڶm����9�v��Ʉ����_)'''�̙C׮]�����ɉ6m�0z�h��E�sذaT�Z{{{�F#p��������xxxвeK-ZdqbE�v�psscǎV1�ر�2e�ЦM�"ݟ���������������d���͵u""��l�2z��韙[�M*T��ŋo;^���l�ꫯ���7{��1�mդ\�r\�r�K�.Q�\������ɥK��ܾ�1Ο?O�
��/^�H�
��������r�&���\\\�����>�E�bѮZ�j�nݚ_|��;���Tj�坻4���ҥK�ٳ�={����IOO��Ņ��8�}��Bc���ڵk���X��oI����/\�`����?�T�R�q�n|(�Z����YDDD�o7n�`۶m,Y��������,�-�& IDAT:t�@Ϟ=�ԩ��ζ�ԳgO���򽖒�5k���gժU��Ξ=K�.]�ׯ�9y[DD�=��@TT���[�EDDDDDDDDDD�Jt…���ԭ��ݼy󈎎�lٲ�^�:ߍ�W�^�~b���7���Ej���mq���P`�Fٲe��I��o�Az��MLL
40����/,Z���_~����s���R�-�;]��ʗ/O۶m	'66���T���Cff&cƌ)�<y�lq;�y�{���ȷ�|��Ş�V%Y��\_�sY�|9�[�&11�ɓ's��V�ZE�nݔl!�\�^�x��-W������"88؆�����������������.DDĦ��݁���������c�ȑ#<���ҥK�_�~�s�/n�Y�flܸ�H�=JŊ-6�6��=A �K�.Y�v�^z�%���ǩS�X�`���Ԯ]�cǎ����V��+S���3g�:vٲe��� ..�k��hz^�*�d��ս�쉈�ȃ�s��9r��{�2h� *W�l��/��Օ��{�5k��믿�믿�f��{�b%B���������������MJ��2�&�s��b���̤{��3~�x:u�T`�Z�j���X���w��̙3ͧ�믿�ʕ+�9��ٓo�~���]i�^�:!!!̟?�����k��m۶�[I�逸�n>��qrr�O�����o߾|��x�����>{"""b{YYY�ֻ��S�n�{���=��8���H"##��?�iqr����������������)�BDDl�}�������n�����`0СC��aÆq��A	/t����ϟoU�����`�F�沆
ҦMRSSy��WIOO/p�3g����Æ
3��k���S�r��
�>7n� 22�֭[{QԨQ����Ç�����J3���_�޽?~<,t�ɓ'дiS�rSr˭��K/��ӦM#77ע.77��DI��^~����E�_e���AD�O+77�;vЯ_?�T��޽{m�H�1m�4�M�F�=l���������������%\���M
8�r��O���ٳg���lݺ�~����k����@DD��Ϛ5k�1cO>�$���m7&0ggg.\ȨQ����HOO��3�faJ0�3g=�������2c��?Nvv6$&&�������Axx���Ӝe˖e�֭�����h$))���@�mۆ���
��ghڔԭ[76o�̵k����&11��� ���[I�/$$Ο?OÆ
y��7����ʕ+����￳~�z�2e
�?�b�2e�Cvv6F��cq��ۗ�U��i�&�u�Ƒ#G�~�:III�����ڵ��(�Z��ϞHQt��Eo���;Ƹq�x���i޼9�v�b�ر��"""""""""""""""rg����YDD�,[���={���u^�ׯ�k׮ddd�;�g�}ƀ��~~~�۷�1�k�����'��4i�w�}����Eybb"������8���=�G��JX�v-ݺu#++˪��ٙ�˗ӥK�rS�HA�<�W��7n̑#G��S�jU���y���Jl�]?��/ҽ{w6mڔo�ϟO׮]-�ضm�E�)��<Ò�����]�v\�vͪς

���>��?�2>�l�J��W��g�s��<>���			�V�Z���������;�{�n����޽;�{��'��uhZ={� ***�k�?��@TT��E�^����������������:��?J�j�ptt�\�r�iӆM�6Ym�?v�X��

���矧|��899Q�n]&N��֭[��-|}}9t�s�̡}��xyy��舋��kצ_�~8p �d�_|�������xyy��s��
�%���]�x��w�_�>���888�����o�́,�-J;�����'7ndÆ
���kԩS777������Q�F�?��G�Z%[,\���������>�h�\)x����y�������LJ����|z�����Q���W�=���Z����.\�`�PDD������Y�&�ׯ����L�6M�"""""""""""""""w�N�(%���C�RִiS�z�-[������رcx{{S�vm~��g[�sG��?Ϸ��`�6�:�ŋ���A��0a�ϟ��'k׮��ɉN�:1}�t<<<,����3p�@���qvv�^`�ԩxyy87�իW�4i��ќ={///z��ɘ1c,��4Β�u��A��Ν;quu�ƍ�r�Js��rss�q��_~�%'O����	___�x�
���S�e�+�;�bٲet��͖a����5+V��	"""""""""""������X�b���v�?�+V���h�0D�>���FFFG�������7o�>��M�A�1g��ĉ�Y�&�}�{��n&U|�����ٱp�B���-2�[�t)qqq�߿OO�|����$  ���s٩S����`Ϟ=lܸ;;˃�JgI�
���1��:r�H>��C��hd����޽�+W�0t��B����Y�>}���(�z�-���m��Q�F\�~��a����5ݺu�z��CDDDDDDDDDD侠��R�7<��y��`*"R�F��m�6^}�U"##iԨ��Μ8q�y��7�����8R)M{��᧟~�v��|�ᇌ;����SO���L��ՙ2e
�Ǐg�ڵV�׭[Gll,�Z�"!!��={r��I�M�ƤI��sڴi$$$ШQ#f͚���/G��_�~lٲ�X�
Q�8K2W�:uX�h*T�F�\�z�o���y�E~'v��A6l�@@@F��%K�0p�@�O����K�r�
111,^���۷S�bEZ�nMÆ
m�୷��i�""""""""""""""v�o"""""��6m�˗��nݚ2e����H�ڵ�:u*|�-[��m�R�f̘��O>�����׿���`���ԩSWWW�`>�!��>�������䄿��9� &&��9�����/x��qpp�~���2�.]Zjq�d��ӧ��3s�LsrŅ
��2e���G�駟r��9@nn.'N�(���ȟANN�ׯ'88��~����S�R%bbb8{���-DDDDDDDDDDDDDDD�:��.y�Wl��SӦM��R)�
p��!�M��ƍ9y�$ׯ_���iӦ<�ƍ�:L)e�<��e˚����1���^`��m�Z\7m��cǎ�'%%��5k�[�СR��$s�������2l�0ƍǍ7��oIhh(�6mbӦM�3�ѣG��77�B����̟?�������Ͽ��o�u놧���ÒB,[���ׯ�:�ǔpq��X��nݺ�8)�+V���h�0D��裏����:��\]]�-���/R�_�M�	���]���˗��JgI�rrr�?��y���ی7��1�w�N�v�X�j���'>>�ѣGIDD�����""�W_}�֭[S�V-[�"EШQ#%[���_Z�nݨ^�����	%\�EQQQ�:)��={�:�صk���۷P�^��ԨQ�����'O��c���J:W�z�X�vm�����$$$�������ʕ+�2e
C�U…�<�233qqq)��\�r�+W�F$w⭷��i�""""""""""""""Qv�@DDDD�",,�~���ׯ�c�sbA�=
���K/������&55��Çc0hժU��w7�2=z�\V�V-3g�$--���z���z
�yb��ȃ�ƍ|����P�R%���m�����������������!�p!""""r�T�R�ƍ[����1hР��9�U�V�s�N�}�Y�:777�M�Vj�ݍ�*U�Ĺs�S��=�'O��wޡ��8��Z�oѢ�݃�Ƚ�����ŋY�l�O���Ϗɓ'S�J[�&"""""""""""""""wH	"���T~��v<��Z�b��C�b��m�Y�z5�z�bӦMT�\��� ƌ���K�}ʕ+�Ν;�0a_�5gϞ��Ã�͛3a��x�R��n��'�0z�hN�>MVV�����ё3f������7;vdĈ�v?""w��͛y��wٷoիW�gϞ����ԭ[�֡���������������H)Q…X���c������q��)rrr�\�2�5"$$�^x��!������R3!!�y��}�vN�<��h�|��ԭ[����}�R�re�~s���w���ŋ�Gi�Ww�ʃ�W^�u""�u�O�{U��+��7�knOOO>��c>���b�-nyi�ս{w�w�n�.44����B���9;;��O0u�TZ�l�����C�R��1;w��{�&66֪�̙3�9s��+WҡC���<<<l�k���L�6�j��牏�'>>��S��`�^~�e�6aaa�Ki�'RAAA�:�RѼys�7on�0DDDDDDDDDDDDDDD�.R…��o��������y�G:t(�?�<��߰���ĉ�X���S��~�z:u�Ė-[pp�G�(�ΝKdd$����1���@j֬����.]��dƌ|�����у�;w���g�EJU\\���l��܁��h[� ��u�����D�6ml���]q��1�-[ƈ#prr�u8"""""""""""""""b#v�@�!!!?~�-Zp��a�~�m�ׯ���+NNNԩS���pv��I�����5k���~`|���,_��q����O���=+V�u�����Я_?�_�ΤI�l�H�;}�4+V��u"R+V��ϯ�eff2`�V�\i�PDDJՅ�={6���<���̚5���[�%"""""""""""""""6��	l�ԩS����lذ��~��
*ЪU+F�M������ێ���kq�����)Sضm�/_�Z�jt�֍��pʔ)cn�c�bcc�T�111�/_��9|}}���߿?s��eРA����L�<�-[���S�R%ڴi��ѣy�������\���ˈ#صk...4k֌��p6lh�/%%�iӦ�e�~��\]]�U��:ub���Cqc+Lq�ϴI�]�v��;j�(fϞͶm�,��I�k�zgff2s�L���k>��˗)_�<�5b���l�2���wM�SP}I����/�d�ĉ=z�*U�жm[F����~o���ɓ���L�V�X�vm�1�ݣ7�<x�-[FϞ=m���WD����p��ƍ�u(""w��_��%K���7�`ggG`` cǎ�M�6����:D�!C�i��
���

�:�;vбcG�\�bU����ʕ+�С���quu%==�|�x�b�x�
rrr��>��3�رwww���ǜ9s3f&L��fee�w�^6l�����|ݺut�֍���>���Z��������ݻiٲ%����NNNl۶�&M�����K�֭IKK�7�5j�{�n�T�R*��#R���U�Ǐg��ل���w~
[���\���hٲ%���/���5k�رc���ۦ8	%Y�83g�d��V}\]]Y�jm۶5��~o��U�V|��w���,_���ƴ�8***�k)>�m�g��kyp��YL.^�H�Z�4hP�~o��EFF2b�Z�h�믿��/�Lٲem�����������������'�l�_ͅ�ڵ+iii2���222صk}��h4į��j�/77��+""�\?o�<�'N��_�~���пN�8��hd���x{{s��L�bn�/�P�{pvv�iӦ����t�ޝ��:w�Lbb"YYY$&&ҹsg�]��+��Bjjj�c������ǵk�ضm�j��h42i�$��C�!--��}������h$==��[�R�~}N�<���K-��J�~o��&p3��M�6̜9���$nܸQ�|�����T����~|||���#==���Lv��M�&M�����/�x%U�5��o�V�طoYYY$%%��K/���A�=�����m�{��JII�СC\�|�iӦ��=����M�<�
f�PDDJEHH'N��ᆪw��J�J���fϞ͹s�5j}���޸��иqc�Ν���|�23f�(t�ݻw3v�X�nq�ƬY������W_e�̙ԨQGGG�5k�_|��%K��O�:@�z�J|_ӧO��ի���NNN���C@@/^��O?ͷ��͉������͍-Z0w�\v��i�v߾}L�:oooquu�e˖DGG�z��R�-�����>|8vvvlٲ�����C�r�hٲ%�F����D�˜N_����y��puu��ٙF���p��b�Y�]���y�6n�H�
prr�^�z�\��֭[s��fϞmn{�����/T�Z�T�]�_?��s����Y}5lؐ6m�0|�p����z|�y��СC:t��gHD��Μ9ç�~��ѣ���u8""E��)�yU�X��իߣhDDDDDDDDDDDDDDD�A���{lݺu4(�>}��iӦǸ|�2=z� ;;�v��1y�d��-[�0p�@��~~~���r��	s�iJ�2e�q'�6o��;#������Ύ#F�o���Ve
6�ʕ+�ժU�C�DEE��/���|||�����ٳ�[^%]?���ԩS9x� Æ
������իW����<y2�[��N�:l߾��q��<y���\4h`U����
����P�5�k���888X����Ý�o�-�xG�{���ٳ��q��
.^��֭[y�78}�t)EW��駟2|�p�
���������""�y��R�
����u("w�`0`0�rs�-�uVrrrX�~=���T�T�����P��=�������y�M�/RRR
#,,��'O����_|����E��M�O=�T�b2��8--��cb�ה$q+SyAo�����*swwnnz�kԨQ�ڵ���`�W�N���			!&&��X���u�����Ç~ȡC��p�7nd�ĉ�o�777�;F�v��'F����Y�v-cƌ�m۶xyy���[챊��k���������8r�H��%�_Sb���}���%ꗐ�`�ڳg�W��g��ڵk̛7���������1c�ڵ+^^^<��#~O��DD
r��
����8q"��ζGD�]�t�7�V~��'�J�j��ر#'N�࣏>�\�r�MDDDDDDDDDDDDDDDPJ���n=�����͛Gtt4e˖e���xzzZ��z�*P�+L����Ej���mqmJ�(h#Kٲe�v�Z��...E��w�����Xl��_X�h/��2������[^w�~y�/_��m�Nll,�����Ӈ��LƌS�y���KjժE�Z��ԩ�&Mb������E�NwM�2%�T���nQ~'����V�[��������a`ggGժUͧ���w}΅r��9�w�n.�ѣ�Νc�…w}~����ٱd����m����ͽ'I��W��u�]��'�|���~�5k�FJJ
��񄅅�7������������������(��3��p��%�F���rrr��9r���c0X�t)���/tS���4k���7��ѣG�X��ņ;S���˗��s��%����K/�ľ}�8u�, 44�ڵkp��1���ݕ�J�~eʔ�`0p�̙B�.[�,����6�e˖ѽ{w�?Nݺu3f���g���=z�Hc$�Mh����/Κ�U��Դ.�˗7����Í7�5k���4i҄�͛ªU��m�&k�M�0}��~Z�jE����4�c�=X�7��o�����lْƍӱcG"##���Ο?τ	hݺ5������[����a˗/���;�+W6�?������|��;:�HDDD����ё&M�GJJ
��jղuX"""""""""""""""�'���{�t��Ν;��/33��ݻ�������ԩS�mMK�4��M�3g�,�fޯ���+W�`0��ܳgO�}Lo�/�M/իW'$$�������?�v�Z�m�vWb+�^�	 IDAT�=��S���v;NNN��	"y����5kG�a„	���ҩS'�NnܸQ�x��n�g!�
�ǎ�m���I^?��S��g���k.��+�O?��y��q��i�_�Nzz:�bҤIDEEi��>����4���œ<y��+��fΜɈ#HHH��իdgg�������������

e͚5\�|��Ȇ
=z��<7n$==�:���ٴiS�b����eL�ׯ_��7���Ã
*0v�X�f�d���qww��ӓ^�zY�hgꟑ�AHH���T�P��^{�_����\�z��#GR�fM����Q��G��Jv��8K2סC�hӦ
���<��C0�|2`~�n�.>v�X�ԩ���3e˖�I�&̛7�Ϣ�ڷo��ٳy��,��SJ���ڷo��8�ߦ���h:t�(6l$00����B�`���Vu���jԨa.kذ!mڴ!55�W_}5ߍ�&gΜ!22;;;�
f.o׮S�N���~��
"##hݺu��E�50>|ت.��ʥ[I֯w���?��:��ɓhڴ�Ey��Ky������^�룏>2���Q��<==��T,X�o��]��"##�N����6?���E%�_�󈉉`����ڵ��۷3r�H���K��,�j֬I||<&L(t���l�9�ĉhҤ���/�`�ȑ��dzs�NfϞ
��;��,Y�ٳg�V��/f׮]̙3���������W��U����FDDDJߠA����OIKK��ŋL�8�E������_���ΥK�����<xp��-ZDzz:/^d�ҥ���s�������$  �)S�p��	�F#�N�"""�_|1���KgI�
`˖-���s��yf͚Ő!C
}�#G�d�ĉ=z���իWٽ{7}�����������8q���EDDDDDDDDDDDDDD�&�pq�
8�r��O���ٳg���lݺ�~����k����@DD��Ϛ5k�1cO>�$���m��9`����Y�p!�F���~#==���|��)	�dΜ9<��C������ˌ38~�8���ddd���ȇ~���������Ls�-[��[�HRRF����$ٶmnnn4莟a�=�֭�7o�ڵkdgg���HPP�ĈҎ�$����?�ϟ�aÆ������q��rrr����Y�~=���L�2Əo1��􆘘���1����$�fB�o��FNN���_7'��ͷ�e<�_�GXXqqqdffr��1��g�}V*k�W\\={����h4r�ڷo��ݻ�^�:o��mI�W�o~~~_�����Ett4/^�k׮$$$�f͚"�l>M��X7n�k��FRR���۷�w�^�ׯOll,�|�	S�Ln�9��t�˨Q�����ё
���Z���?��c�Yՙ��LmDDD���ٳ��~����sb����'99���tƍ`>�-�u��KVV���ԨQ��'O2mڴ�6m			4jԈp��u>LӦMٲeK�	�%��$sթS��G����n>��tr_ޤ���\�9sذaYYY�������>}z��"�s��1}�t����W�����ԩSE�+"""""""""""""""R����Z^J�`0e�\~�u^�ׯ�k׮�����>c���k???���w��.��ӧ���p�-��}�...剉���u{{{F�m�77�t�֍��,�:ggg�/_N�.],�M�#}�r�
�7�ȑ#���Z�*�����K3���ŋ�޽;�6mʷ������ϧk׮���&���̝;����|�3f˗/'%%������_~�����5kFff�՘s��1�w�kbz�K�.%88تO�J�ذa
40���~o�9�ٳ'ps#~�R|˖-�gϞ��~�I�$��$$$�i�&Əo�Yvqq!44��� ������{���l�ΝV	��`ooO�
x��g�۷���?�`Ȑ!~�M�c4�������\���N���-�6nܘ���|�3�������Ȯ]�
{L"wEQ�ED��nh����7�Ζ�����?��O>�$׮]3'/���ʕ��ټy3m۶�^�z$%%�;�SO=��9~�8����}�;���7-Z�0��~�q�d�}���?�<=�vvv����{?�>�(gϞ�m۶�k׎.]�P�f�–���,֬Y�ҥK�����ٙ�]���ӢE������c�:t�?�Hhh(ժU��ёr��ѦM6m�d�Y�رcŞ#44�����������Dݺu�8q"[�n�J���СC̙3������兣�#...Ԯ]�~��q�|�-^|�E���Opp0^^^888����믿΁�J��Ã]�v���R�~}\]]qpp��ۛ��~�X�!�4c+�xzz�q�F6l�k��F�:upss���5j���9z�U��…i߾=���888�裏зo_/^��O?���3����o�a„	�3�Y�fi<���<>>�N�:��鉓��5�o��o߾��&&={�$::�������ȣ�>ʀ�駟,�-��~���`�UXy۶m���e�ر<��Sdff��g�ѡCV�\Y��
:���9��bcc�4i���w�ԩ9r�jժ̸q㈎��ϴ���M�VmM��Lh*��	G""��h4�`����m��=��3Ϙ�/[���{�����o۶�ŵ����3%�׬Y��`���СC�gI��5_�BnܸQ�DFF���ʦM�x��y�'��� ==��~������…9w�.$  @�"""""""""""""""b3:ᢔ���脋�W�7��w:EA������oY�x1������8Fa�gN��͛�����͛��������+�޽^y��?�������o>��4gǎIMMe�ƍT�X�b����Ӯ];���X�vm�b)M:���O>a�ȑ=z�jժ�:�RU�	��7���댌��v�)����d�[�����{
�����9��N�s���ŋ�Z�����?���$""�����;�o��FNN�<�H�1�����������������kzM���<0:w�_}����<���Ԯ]GGGs;��ӧO��xv�څ�h$99���ps��+Wh߾=p����';;�Ç��[�U�NN�:eUg*3�����҈����7�T��H1�ڵ��z���ԫW��>5j���ɓ���Z}��)3�r.OOOBBB���cϞ=�1��/2t���T�RE�"""""""""""""""r�Q…��<0z���|@���iҤ	�G��A��v�S'y��K=��-[0v�X���	��ѣ���d����S�������Ѹqcz��Eݺu��|��HLL��3�5k֬�oED�Jdd$YYY�9�֡�<P�����~�:;v�0��УG�����K��3SSS>|8��V�Z�Z|wc.S�k�߃jժ��``�̙\�p�ӧO�u�V�2AVDDDDDDDDDDDDDDD�A����$$$����o]`` cǎ�nݺ899���D�Z��ݻ7�Ǐ7�6lU�V�����X�1>��m���ꊓ�>>>L�<���0���K����3g]�v���'''ڴicNɫ]�v����c���;vP�LڴiS�""�׹s��9r$*T�u8"�*U�иqc���h޼9�O���ϏA��g�ȑԭ[��;w�����舗�������1mڴR��n�U�R%��)\�4�y�HŊ�ڵ+{���<*"""""""""""""""[ ""R�:u�S�N��i۶-m۶�(+(��vu�)[�,�֙�.L���9r�՛�o���ݝ�� �ϟ�ٳg�Z�*gϞ���_�~���+N��4ieʔ᭷޲u("�իWӫW/6m�D�ʕ	

b̘1���ا\�r�ܹ�	&��_s��Y<<<h޼9&L�'�(����\�|�	�G�����dee�|�r������Bvv6���<���t�ؑ#F�������������������J��O��Ջu��e~;tTT^^^�8:��;q��g�f���J�?����B�KZ^�bE����ޝ�UQ����k��Z������]SS�v��ܲ���Vn��K����K������+��q�-��ܲ2D`~�;�x��q]纘�|f�5˙�=�m[�
,�3fhƌ)^6��i���;�cǎ��U�V�aÆZ�p��}��$��Pp@&�3gN�=Zo����v�*IZ�f�fΜ��۱ -X�VU�PA�z�2;
�,�M�6jӦ��1�d"5k�Ԁ4u�TI�믿�5j��
���]�v���+www��Ȅ<��k�j�ȑfG�0\��(  ��A[���˗�x�b-\�P�V�ҥէO+V��h���tԹsg�^����aŊ<��3��i***J�|�.\��~�I���S�v�4g�թSGnnnfG�0\��v�ڙ@
�k�N�k�6;`��Ç��O?U�fʹd��l�R^^^f�0�d���fG E��aÆ�H�"fG0������R(  @!!!f�x�q0OTT�r�ʕ�|oo�L��Qp��Z�n����cH�Ν;�������?���޽[O?��
*dv����Z�f�-Z�;v�…ʛ7�ٱ2=
.�Q�v�Ԯ];�cH�իW�������j߾��O�nv�0���ꫯ�Ҳe��F�i������2;@�@� C���2����av���3g*<<\���Q���� M�0A�O�V�*U4j�(u��Q>>>fG�R(�0ɵk�ԬY3(P@?���.^��֭[�hѢZ�n���2�'N�\�r�n�˗/׮]�$I���j߾}FF�<���ŋS0��~���L������7;�t�#G�j�J=z�P�*U̎�eQpa�#G�H�*U��0]�re�2e&��m�&�՚��}�͞=[˖-�a�С�ʖ-��իgxN�Ԙ4i��gϮw�y��(�I@@�̎�幛�Q�X��m�Q�m۶L����h�9Rm۶����|||ԦM�1B���� �~��w͞=[Æ
S�|�̎ ��ۧI�&��@�E�X,��…%Is�Ε�b�ҥK%I�f͒�b13&�k׮�cǎ��N�:�ڵk
613���ԴiSY,]�zթ߅�;��8��t�,�^z�tϝ��˗kРA4h��/_njik̘1*V�����ov)��k��ɪP��,�,X��7o��G��#�?��|��
���W;vԺu�EDDhڴij޼�|}}բEM�>]����l�:uJ����4h��':������9s�M�6�S��^x����S�W�vX׽����~������*SJ�;�mGDDh�ҥz��gU�hQ{�bŊ�f"""�8�+V�$;v�i^hh�$���S��s�N�>G�uX�8�ٳgkȐ!<x�f͚����@ڹu�~��'�3F^^^f�p���Z�`�5j�R�Jiʔ)jذ�����믿*��fGx�Qp���V��V�/^,I*Y���V��ϟ/I*[���Oz�~���w��^7n�P\\�N�:�Q�Fi�ڵ�~���z��W�d��������իW�x�b���[QQQN��ׯ���٣��ݼyS+W�������gϞ�y���…�s玢��t��a�?^!!!��?}�tEDD8>��~��a�EEE����i��������q�����T����.:w��0}7�rf\DGGk�ȑj۶�������6m�hĈ�s��ܹs�رc����m��ׯ�r�έU�V�ʕ+�5k�|}}͎�Ƞ��G��$U�\��tz[�`����/U�XQ�V�����+�H�����.\�3gΨx��


RXX����S�N�E�V�dI�Z�J;w�T�^�$I[�l��_�j�$i֬Y
����{�I��-[&I'�
P�z�)�ܹScǎM�Nl۶7�W�P�i��6Wo��r��Z�$6�ETT�8�\�r�gϞʕ+���٣��X�~f\�ڵk�ر���S�N�v횂��M� m�̙S���
F��˗/k���jժ�}�,d��2����&�{�ӛ��C�Q�%�+W.
>\V�U�|󍽟�Pb���Z���gϮjժiذa��͛7;�{�С*Q������oO��ϕ+�$)$$D˗/�?����m��j�j͚5��ߥK�T=l��v�ĉ��-(�W�R��H{.��bQ�=���#�ŢM�69��l�R��>�LDD��M���͛���W-Z�����鰜��c����_�����o����k�رjР����4b���~l�����S�;w�v��ʕ+�|}}�P䕐���Ǐ;�'�<?��ﯺu��i�ԩ�l�߾}[cƌ�����ׯ�Q�F鯿�r���K���g�uA�X�b�X,Z�t�"""�=5 ��7z�O<�B�
eP�B�E�=�j+,�2e�,�~��IҸq�2���/_�$�+W.�~�.]�$U�V͡��g�qX��J�.m�9_�|��}����ߖ���v�ڥ3f�C�


RLLL���
R*������%Iy��u�gk����5j$��B��
l?������|��<==�����H���Z�d���������իZ�x�z���T4!IӧOWDD��� ""B�z�Қ5kt��M����~�����˟?��/�������v�8�=��$���_�
�$�ܹs���������ϟd��?�\���V�"##�t�RM�4�i&O���k�*&&F���Z�n�z���P�a�EEE����iy???EEEُ7H�۷okŊz���O���fG@(�x���=��wP�+{��In�q��Z�~�F��jժ)&&F�}���5k��+W&k���na�����X���߶e�ݝ�2��=����*U�(>>^�$���i���rww�Ν;�[�Q�jժ�\�ri�…:s挊/��� ���)00P>>>:u��ϟﴽ��zJ;w��رc%I�-ҥK���Oh��
�ܹsu��I�em�;v��vo��s�='777��[��I�Y�d�$���Ν;���?�/��$�ر�i���P͜9Saaa


����._������)c�
�������3C;w�T�~��㏫S�N���״i�7@&G�E�Z��;w�$�r�ʲZ��5k�$�F��Z��Ozz���%I�N�J�����$�n��M{{{�j����S˖-���{��
����S�>�CJ�nݲ��ڷ��+��$ݼy�i����@��F��w��{�m�\�w�Vxx�Z�j���{��^�z��-[�H����U�*{��V���
&Iڼy�S�.]�8wmݺU�4l�0U�TIٳgW�5��;-k+N�P���o�v�ʖ-�"E�H��~Q�|y]�|YgϞu�����<۷o�޽{U�bE�_�^�|�&O�,I���tZ���ޓ����gϮ�U��G�I:q�$�dɒN��F���3o�<=����WXX�F��.hݺu�ܹs����(��`��+W��r:#�ް>u�T]�zU111�2e�,�^y�{��u�J�&L��C�)..N��ĉ%I�?�|��ݪU+Y,}��׊����O?��e�Jr=:ƅ�΂J�V�^���h�9sF�&MJ�~��v�r�$I�ϟwZ����@�hذ�����7n������ٳ�����}���]/�Hd� IDAT�$�ҥK��jժ9��g��$]�|�i[���/J��V��rw�w�[!����C?۴m�ѣG�O*�_��nݺ�[�n?~��-[�3g�Hr������a�z���%Iׯ_�$�͛�iy[����!66�B)�d���jٲ�<�C�iРA��vd~fx�d����={jӦM:t�Z�h�0�O�>���w�͛7�…�ի�C�%J8�%G���5a�M�4ɩ(�F���,��ׯ�M�6��ڵk]gݺu�j�*}�����%I~~~N���߮���s�i۶m:r�CN��05(�4��m�W��T�VM���׵u�Vծ][�3�<���PEEE�رc�^���+1			�λ�mӶ"�{�<<��3Z�|y������JHH�Ν;%�.����/�N�:��ɓrss����T�)S���_�O<�_|Q�K�V�J�Ծ}{��soN۾������Vlvw�����@���kĈ�t����gv�ԯ_?�#�0�E����F�,�(\�����ոqc�͛WٳgW�
4y�d5k���/o޼
V���U�hQe˖ME�U�N�4��T=�צM�5J�˗����<==U�ti���Ccƌ��<x��/�lٲ)666�u8Pm۶U������)???�92��j�M�4Q�\��c����رCy��Q�F�R|<�L�ƍ�����֭[�"����/�Pdd��իg_��:��6���}��>�������;����w˕+�J�*���h<xP�V�|����+VT�B�t��A<xP���*Y��r��u�<�v�$�����/��0?..�a�СC��$=���…K�n޼�=[����/""B&L�k��F��N��ۧY�f��.2غu����GSr���h„	��?~
:TC�M���7�'�޲eK�l�2�5n�X�7N�6r�̩��{O��}�'g�]m;w��
P``�.]���ŋK�.]����_�~�zH��iР��N���+WJ�ߨ�=���O��%K�H�w���u�j����0a�ƍ��+�رc�8q���NӴiS}��g�0a�Ǝ��U��ĉ���]��X��Μ9���@%$$����i�777�����SPP�}��SÆ
u���;���B�
٧?��C�7N�˗��Ç�&M���+WNW�^���
+Ο?o� k�:u�bcc������|��-Z���>|Xe˖ի��ʿR�p$S���U�X1�����BBB���.]���xt.\X5j�PLL�ʕ+��E�J�J�,����?JHHP���F��޽�J�(�K�.�W�^�U�^�t��e�(QB�z���v�t�b/H�۷�|}}ս{w�/_�e[���ݻ%�[⊭`dϞ=�ݏ��dԨQ���S�.]��o���?~ܡ�B�ԣG����O�>�z��*V��:��2���֖���v�f̘�w�}ס�
@�ܺuK!!!jԨ�J�(�)S����_?���N�8A��C�.2)�Œ.�Ml��_Μ95z�h���[�ڵ�$i͚5�9s�r��ar:��q��T�ƍe�Z������ҥKU�^=���y�*88X_|�nݪ���[�V�
ԧO�˗ル<==5w�\͚5K?��nݺ�_|QÇ׆
��W�T��������\����W��������!C�(..N;v�P||��~�iu��EgϞ�ܹs�l�2�mN�>]|�v�ڥB�
�iӦ�ݻ�<==�}�4i��?�X;v�P�n���c��ɓG�5JV>�7n���ͫ����3;
�P�ݻ�V�\�f͚iٲejѢ����̎��f�av������BBB�r:�(�ȼ/^�}��I��<u����DH�;w�$�&�N#�/^�Ν;���{���l�-I�Μ9
��իU�xqIҥK�Ժuk���O�{�N����>ggΜQ�
4k�,�����8�C��ٳʛ7�{�1�� �1�E&EaD���B�̺w��^!!!:t�������եK��H������'�T�^�̎d�o�NrĊ'�|2� 3q7;�r�̩ѣGk͚5�r劮\��5k�h���ʑ#���$Ø1c��O?�Ã�j )�o���_�֭[�|��JHH0;2!��v5k�Ԁ4u�TI�믿�5j��
@r����x��f�2���0-\�P˗/�͛7U�~}�?^			rw�}pD�)�՚����i0Ϝ9s4}�t�<yRU�T�СCյkW����
��hŊʞ=��1$Ê+Ԯ];�c DEE�E��ܹ�j֬ivd\��իWk���f��GڠA�̎�,���tb���w��AY�V�����(x�Pp�Nڷoov)������3;�C��#���X���Hğ��"E���p�/_֒%K�`�>|X�˗W�n����iv4<D(�H'�۵kgrɱb�
eϞ���%JpO�(���ӝ;wT�N���G���q�t�U�V)$$D7nT޼yվ}{͙3Gu�ԑ������"���(  ����s��fGx��������И7o�~��wu���(@����&M�hɒ%jٲ����̎��@�q�Ʃo߾*U���q�1q�D}��*Z���Q����ڷoovilŊfGx�͞=[���1b��Q�4�lٲ%:�|�����i�ĉ*W���y˗/׮]�$I���<�
<�J�(�v�ڙ@:�m��7ojҤIz���㏛x �o��?����`�<yRG�����ٱI\ 
���;ڶm��V�Ӽh���Z�l��P�T�lYU�^݄�2�������͎��>�H�4d�����ŋk��źq��ׯ�w�}W			I�rd$w���m�6�����9r�ڶm+ooo����M�61b����38%@��O>�DC�U���͎���ٳU�B���駟~�СCu��9mڴIݺu���
&�X,�X,f�HW����v�:v�ho�ԩ��]����`�d-���Ӷm���o�H���G
6��jձc�����'�0;��`����K3g�Thh����U�tiu��MÆ
�$Y�V{ߨ�(jӦM���?��c�饗^R�޽���)IE#���V�"""�t�R=��*Z���O�b�d�X�t�Ru��Uy��͈���jԨav �F�iv ���t��-���[�֭Sxx��ܹ��Ǐۋ-�����k���|���ܹ�+W�(((Ho�����ֆ
%???�y~~~����ƍ�l������Z�h��1�4C��#($$D/^���������s�:�@a��W_�رc�\��/^�ݻwk���^����٣5k�Hr�j�ڧw��)I�P��Ӻmm�>��k׮iƌ�^���V���>��E�@VA�E�X,�����-[�H����U�*{��Q��F���wӦM��	&�lٲʖ-��z�)�=Z��nݺ$�u��	IRɒ%��*Uʡ�����Z�b��7o��ŋk̘1�U���mۦ_~�E��3� �?^���3�8�רQé�$I-[�t��S�N%���ׯK�����4��f� �kݺ�6mڤ&M�h�…jݺ�r��iv,@�{�n�ߣ��ڵk�D�f��	�j�:L�F���=#��0���v�>����Lr�m���rkks�]�+>>^ٲe3;`7q�D�����(���̙3�x�b�cL����c��G�O<�ӧO�_~Q�Z����S_ooo�?^k׮���w��U�pa]�zU7o�T�…�ݼy���6oެ~��i���*T���qIR���͎x�($$����F@f�<�z�5���i�9���8>|X'Nt�[�^=I����u��q������'�|"�Ţ�����~	r����ʕ�$�?�iݶ6[��a6l�ʔ)C�ҝaھ}�z��^x��8@����Ν;�~йs�ԣG�$����C[�nաC�ԥK�y9r��������զMy{{k�ڵz��m�69rD5j�pX�ȑ#���>mv�!���jϞ=�Z�fG�C����Z�`�-Z�s�Ωf͚�ѣ���N}> ��޽���^��S�ڵU�D	�cp_\�̌�r�̩�s�j���ھ}�"##��SO�K�.5j�<==�}��ɣ�� ͛7O[�lѵkה;wnըQC���W�2e�}�O?�TW�^Ull�$�I�&��㏵c�u���!ǎ;�'O���WBB�F��6m�8�iaѢE�;w�v��)ooou��Y]�vU�*U̎x�͜9S�/6; ����(  �����B�
iԨQmW�\�$=��c���ӠA�4hР$�ٸqc5n�ء-w��
P``�.]���ŋK�.]����_�~ʕ+׃��Ceٲe:z�,Ybv<�v�ޭ���?���ԤIe˖��H�($$���t���fv�����x/��,����k���+!!AgϞ՘1c$I�<�L�n�{��*V���/�CBB���.]�������8}�
P�J�̎����ٳ�d�5k֌b �p�IY,�tY��jU�f���_kҤI�4i����o߾i�͜9sj���z뭷ԵkWIҚ5k4s�L�ȑ#M���-\�PgϞ���͎�,���_T�^=��Y���C��D�Z�~�Ξ=���X=���S��z�E���6k֬�h�ԩ���_]5j�H��duM�6�…U�ti�� �s�֭[����k���*R��Ο?/ww5���W��X�bf�@&���8�
���"��Z��nwww(   ݶ���j|||ԩS'�c �طo�-Z�%K�诿�R���5g��mۖb2Xhh�,X���P�?^���*Z��j׮��={�y��fG�nnn�$�0�l�V�U������u��9��ƪ@�*_��^z�%�����K��K
:T���O�eI�q�R+�,�)cj��*W���G�j���z�g����f͚�\��>��iyl��|d��	f�	Ȃ:t� �Ţu���7��ٳg�i�&���Cy��1;��k׮�Y�fz���5o�<?~\��ъ���ŋ�r�J�h�B͛7Wxx��q��!C��V�Z��/�믿*::Z���￵s�N�1BO?��V�\�l߾}u��
R#�qu-t��]���u�ٖ{X�= i\@Իwo������4r�H�(Q��H<r���թSG�ׯ�����N���G�***J�o�����5n�8�͛W�֭S˖-gv�,��/��ԩS�#G�=Z�Rdd������_���+�����pu��IV�����B�v�lٲ)$$D111I������ŋ���.]��i�0���!<
(��,�Q�F�S���1x����SgΜы/���G��w�QŊ�3gNyzz�\�r1b�~��g(P@۶mӜ9s̎�e̘1C��t�R}��R��r�έlٲ�p��jР�V�Z�~���Ν;?~�ɉ��+VLM�4э7�jժ$��\�R7n�P�&MT�X�J2
.�Q�Ν���Ƈ�,�Y�x�ٷI҅4n�8�����(d:�ϟW߾}U�D	yyy���[�;wֱc�\�O���e�Zծ];)RD���*]���{�=EFF:�۱c�֯_�"E�hժU*P�@��+W��I�&I�wԆ{?~\ݻwW�������ŋ�G�:y�d��%I{��U����3gN,XP-[�Ԟ={\.w��I���_eʔ����
(��5kj̘1�q��eR�-))=�m4i�$�6L��u�VIr:���wLL�f̘�^xA�����{�15o�ܾ�{���K��nݺ���[ٳg��O?�O>�$�z���ϟW͚5�;wn�����%1�=&w/��+*{��*R��:t�#G��w��̿ߵУGIR```��i�o럚s���6�}�$�{bˑ��SR� Y���ؔi���M!!!
�$�X���DR�D��]����$)$$��H��U�ViѢEڼy�{�1u��Q3f̐�;u���׽��O��;v�P�-�4/G�Z�r��5k�Оԃْ�3gNEEE٧,X�W_}U���N}�y��رC�s�$���Os���ȑ#5v��$�#I�o��޽{U�V-yzz�ۿ��{�k�N���N��Ν[�W�VÆ
]�׮]�T�n]���8����֭[F�ܻw�4h�����J�*�]�v���O�l��:5�t��:s挾������enW�:�a(""Bu�����]~͚5jѢ����KҺu�Զm[��q�ĉz�����l4c����y�fIR��t��Tg�{�����ؖ�2e������K_�u����c�οߵp��my{{�ƍ:}���|�I�~gΜQ�2eT�`A]�rE�o�~�s��c������`��ĮA[�����w�̄'w}����O͎�����gϞ�V�޽�;wn�Z�J/^�'�|B�����նm[EDDh�:y򤢣��޽{+66V�r��r�a8}&L�`�?o�<��gϞU�~�������ٳ������U�L8p@�'O��

�$5o�<Y����%�b��W��cǎ���V�V�t��ݾ}[G�Q�V�t��-�o�^W�^u��^�z饗^Rhh�nݺ��[��t�Ҋ������8P�ӧ�N�<���XEEEi˖-�X��Ν;�1cƤY�������曒�-niԨ�>��s;vL			In�v��M�4I���W�J����(���h׮]�S���Ї~��Sr���O(::Z:t����u��m8p@�5Jt;���ɓ:|��n޼�iӦ=P��H�1�۰a����]�v)&&FG�U˖-u��mu��E��g�3I�����ԱcG���� ��

�a�ԩ�<==���OF]3�;6zpu
�%H�����i>|�d�O@@��;�0
@z�z���+W.㣏>2;
LҾ}{�f͚ƬY�������8d�{����'L�`H2��r=Lr�MXX����aH2��0o�С�$�C�N��ݻאd�*U�ޖ;wnC�q���$���aÆ��z���������z���/��6�����͛7��
8��ȑÐd���?N�9rĐd����Y�����%$$C�1������'O��_4��}㧟~2���\��U�0��%K��}��9�;y�!�ȕ+W��K�q7n�!�h֬��2w��1�ԩ�2�f��/��6���M�=%����*W�lDEE9̻��;vl�r$7�+�w�6$��������8�x��$c�޽�a<���_�Y�̽�����Ͻ�W�=
@f��R�QHH�˷����'�}�`�?�P����믿nv�d���Z�z�7T�P!���i}�����7�x��޽{K�6nܘ�:n޼�N�:)..NM�4�ĉ�㏒�8-k�Xd�Ξ=ko����$�ɓ'{�hӦM���C�:�t���w�}W��~�z�˻��R�Z�$I����O<�$�Y�f
		��n�W�R%��K�.�Y��������iʔ):t��ʕ+���M���ڶm�&N��
�\�rھ}�}s؜;wN�a�F�N�[h� IDAT|�II�;�����}РAN�xxx؏cZg|����R�%9RrL�6r�H�̙ӡ���˖9=ժUK*T�ŋ�a��y6lХK�T�reY,I~n�Ǭk�^zpu
�y�x]�pAs��մiӜ����C||�N�:�r��%�'G�����رc�$oo�$��<y2�y}��չs�T�L-Y�Dٲes���)IR�jՒ�)_�|�q�"""�?�d-�X^ۃ��۲ݫL�2Nm�s�$%$$8�6L={�TXX����$�[�ѠA����jѢ�<==�,���U�TI}�>��#ݸqC{��ў={�s�Nm߾]�O�V�&M��5k�7��Μ9��G�jϞ=ڽ{�<(I2#�eRr���WIJ4���o�d�ؤu�Ĥ��-���}�YI����S�)%�w��{O���z饗�큁�������܏Y�̽��� +��0�������>}��i�ȑ#�ꫯ�h�"���/:��LRo�ON�y��i���ʛ7����[,XЩOdd���XQ�LY�V?~\�k�N�2qqq��ߟh#""$)т��y�J�nݺ�r~J^�УG�ϟ_�Ǐ���%I�����ϟ����t��ڸq��z�4�v�=w+P��7n�ƍ�s4H����ȑ#�nݺdmkٲe6l�Μ9���wK�q�G��W�…]�A2�ʕ+M��Oj_,��c��lϗ/���}/�[׮]5|�p�Y�F����)�?��Sk׮�����t���A���u�$�#��W� YO�<�,�}����ĉ��[�|�
�A�i����
 mL�6MӦMSll���ԩS
֨Q������={�,��T��%K���W_Վ;(� 
�ޔ��
���'>>�i�_�Uo��������W_�bŊIn#�x?���
6$��o���…;<�m{`��͛.��q�C���+�h߾}:�����ԫW/�-[V�t��i�����-5�/O�<rss�ŋ�\w޼y5a�IRhh�}�H��ŋձcG�9sF�˗�ȑ#�o��V���[�֑\�;��=��S�%=%�}�]_
p9��H
111�����F��Ν;Z�p�$i�…�s玚4i�bŊ�����Y����?�Y��L��;�s��.�8p@�g�֐!C4x�`͚5�>�)@V���j��T��V�\)�04z�h=��S�ڵ����|�My{{��W�*U�u�V�={VcǎU�ҥ͎�C�L�2����9E���Ĩcǎ���Ҙ1cԲe�D���ȑd��cǎ���?��&��|��7
�����6����r�ݻw;�K+%J�PϞ=�'Nh�ڵ���[��K�Ԝ�jժI���ݏ�&qqq�Z��~(I�3g�~��W�;V�z�R˖-F8IHHHv���
|v���r�m���Ș�,�i߾}.�mmׁ���&QQQN˜>}������C��`�IRpp�C�Mz_?��1�@fC��#�j��j��C��m�6�����9r�ڶm+ooo����M�61b����38%@�]�rE����jժ�������O�
Ҕ)S���av<�___}�嗺r劂����/2�i�iӦ��}���C�˗/�����5k��>x�`:t�w��ԫWO��4�ȑ#rssS�R��m�j�R�F�t��Uu����6/^�ԩS�����ۛ4i"I�2e��C�			�:u�$�A�IfO�R�J���MG�u�����Ԗ��Rs�l��3F�Jr�'N�$���;�ۊ[����)Ir�B��ӧ�N��K�j�J�4i�$�#�؎��#cj���iӦ9����k��ɒ������
,(�u@PPP��I�Z�[�V�T�@>|X!!!:z�
*�T����OF_3����?�����,�,��12���`]�v�f I�ԩ��]�f�@f�3gΨy��
		��jU�94{�l-Y��0dm�;wV�n���ր�?~�ܹSM�6՞={�-[��_�~�ڵ�<<<4a��2k֬ѧ�~��U�j�…#K���k����K���6l����EEEi����Y����s������U�re}��:s�����#G�裏>��b�_��#F8�����^S޼y�e��i�FǎSll��;�6m�h�֭ʕ+��x�>��:u�$�k�N�6mҭ[��#G�(  @�
#�:[j�_Ϟ=��秿��[�j�қo����P���+>>^���֭[�6m�h������И1c�k�}ͪU����XI���!�[���(>>^G�U�n�f���Ss����k�֎;Լys���/�������վ}�DG1H���͒�֭[�:��㊍�աC�ԢE�����'�T�^��ۊj�����P�������4h�>��D��صp�9r�C�����~[ҿ��*6�}�d�5�ر�����4!�		It:15k�4j֬������x���?7^y�����x���=z�|��r��g�q��-c�̙��/�l���-Z�0>��S���N9��a����?��1`������k���?o�������0���#   �iR�j����Ǐ;���7FŊ
OOO�w�1����")QQQ���ˍѣG���VJ~?����9s�4$��|��g�k֬�h߻?w4���\��S���������O?��6�e�f�5��~�Y�����r�����˿Ź�~��7o�4*T��h��ŋ�ΝK�l)=�aׯ_77n|�s�/_>cŊN�׭[��;wn��9r��|~���|�
�0��Œ
���…].�^S�%������ڗ/_n,X�)K�bŌC�9-�w�^#G�.��}��ص����g�޽N}�ܸj��k&�c��'[��<_���={��͛�.�Ν;�����Ç5~�x�����_ll�������˺s玮\���� ����I�*I6lPTT�ˡ������7��H'�VΜ9U�L��֭[�_~��ɓ5m�4)RD�/_6)���0}��'���O�raaa�ׯ����թS'�߿����_�f�t��A���KO<�gϮ���Q�Fڸq�^{�5���O�N�6z��m۶饗^R�������kܸqڲe�r���L�ʕu��a͝;WM�6�����gϮ9r�lٲ�ׯ�8�4����/������K�.�������խ[78p@�[�N�~��/_>�����WŊ�3gNyxx�L�2z�wt��,Y2ݲ��IR���a�����ڵ�ʕ+�\�r���]���S�ڵ5f����oj۶���jڴ�r��-��?��$���G,P������|��aÆ���4v�X�9R�4gΜ��D����_~Q�>}�DZB�
Z�x��v��r��ʘ�,�]�vںu�,�<<<��SOiȐ!:|���T����b�h�Νjٲ�
,(OOOծ][�}������v��������K���m�X��d����LR�&��Odfn�af�x���)$$�>��Ӊ����j��{�ĶY�n]EFFj֬Y�X,�s�֭[�I�&���Gk֬IQ��� }��g�\���
�ҥK��0a�<�#F���j��;vh�ܹ�Q��C�}���_�~z�4}���=Px�t��Y���C�N�C�Տ?����ޝ�՜�i�ggB�b0ֆ,�e1Ѡ	ɾ��`�������B#;e�d-Q�4�Ȯ"i���{�n�������>���9��|L�{��˗/�����ЫW/���9t����Z�����Klll���ۛ��ۧY��ݻlܸ��7r��-���
D߾}122ʥ��B!�B�/�|>/ė)_�|��ESė'��+�B!�Bm��v_M+`h:��	�
�իW���N�6m�ݻ��*0������9s(_�<ժUc�����ٓ���ō7�V��R��J!�B����իԭ[W�xdd$]�v��Ç\�xQ-�TdO@@�������s��t.F���K�������iܸqn�*�B!�B!�B!�B!���t��о�cǒ?~���X�d	}���Ņ���,ջ{�.VVV���)_�$����4�y��9E�U+SS�B!��ˮ]����}HH͚5�����J�Esqq�Y�fT�Zf͚ſ��KRRR��֮]���Y�x�$[!�B!�B!�B!�B!I��u/^Ty�w<7XZZr��A����ׯO\\�V��k׮�ڵ+����իWi�+����Q<�u�B!򪨨(�߿O�ڵ��|}}iѢ_}����T�ZU�~^���<x0C�a���9r�2e�`ccãG�ؿ��˗/���~.E+�{nnn�˗O^򒗼�����M�{B!�B!�B!�B�<CO������+++�����ѣlܸ�ŋӫW�L�322�Ν;�ݻ##�L�R�T)"##����T�R*eQQQ�:B!�y�իW�;\�޽[[[,--ٺu+�fx������^�z������I��ݕe����(Q�������K���]�����k;!��~�vB!�B!�B!�B��H…�G�DDD0y�d�v튉�	���PY�7��ڶmˆ
pttd�ĉ������K�l���͛133���x�SErr2w�ޥR�JԬY���H�ܹ��Xq��e!�B���ڵk+V�J�*����O?��СCY�b����ﳱ�~���R�
�.]�Z�jju�u����IJJBOO������F�!!�B!�B���dm� �B!�B�!:�@h���7o�Z��Y�f8::ШQ�L׳���J�*bggGӦM�ԩ�7o�@��7NY�D�X[[+W"nѢ�~�bJ�c9s�B!�IPP_�5����=��ӧ���$�9$))��S�ҽ{w���{Ξ=�1�`ڴi�x�S�N�r�B!�B!�B!�B!�B�O�,�e/^�vX[[������;���caa�L��L�"E�����ڵk9~�8�?�p��4jԈ#FP�F
e�	&�r�J"##����S�N,]�����E��cǎm<�B!r��˗����ҥK���`oo��>O�<��֖ӧO�f���f}SSS�ׯώ;h׮].E)D湹���?j;!����[[[m�!�B!�B!�B!�y�$\|�4%yXYYaee�nی�344d���?>�z���XZZ�+\�0����[����*T�@DD>�B�
��B!�6����g�:w��h>~~~4k������.p��ey�b����F~���P�B���s��V�X!���<���]�!!�?��CB!�B!�B!�B�<M.D�4p�@��ߏ��+'Nޯ�hdd������B!�H[dd$e˖e׮]�l�R��|6BCCY�b���ԬY�
(w^HNN��˗*mbccy��-���иq�\�[�̲���vB!�B�U;v�gϞ�C!�B!�B!$�"�233�(�մ�E^T�`A�O��/��B������C/[��
h9:!�B�����p��Y�U���P>+&&&lٲE�a!�B!��#KHH�ݸ�B!�B!�y�$\�<�q�ƌ5��0z�h5j�娄B!�gbb���B��W_}��0��˧@�K!��"WWW\]]��B!�B!�B�p�g}*;Q|l������j;!�B!��8}�47n����ܹs���$ʖ-KӦM4hݺu�v��"_�|$''��y�_�κu�8~�8aaa�~���E�bjjJǎ2dU�T��>���&N�ȋ/r��9�b�3*��O^���B!Df,[��ӧOk;!���?�L˖-��B!�B�.I�B!�����j;!��(;;;m� �Ǐcoo�����߿���ٵk]�ve�֭j!�OW\\���+��μ{�N���˗�?����3�|Ǝ˜9s���ϱ��
�c�ʮ�˧@�K!���s�αc�lll��B��dǎ���S�a!�B!�"	B!��ĉ<X�a!��DI…HͣG�h޼9���/_����ӥK�V����.���;v�`��8p+++����ӓ�#2"..�Ν;s��I�����֖F�Q�D	����|�2���l޼��r����ߟ�I��/a�
!�B�/���-����C!�G�ٝ*�B!�Bm�B!��֭[�A!�'dϞ=�7N�a�<lРA���Ӻukv��M���U�k֬�ԩS�ٳ'�<ygggƌ���?-�ƍ��ɓT�^�;vаaC��%KҡC:t�1c�����ˋI�&�x�b-E-�B!�B!�B!�B|>$��#���ٽ{���Bd��;����vB!�B��Ν;̞=�C����#J�,I�v�ptt�v��j�3�Z`�.^����9q�QQQccc�ԩS)R�������L�2xxx�%[|�nݺ̛7�#F��?��%\���0w�\���y��	eʔ�cǎ8::bbb��u%''s��&M��ٳg)P�L�:�&M���

eѢEx{{s��=
,H��ձ���_~�x
��--��ׯ_g͚5)R///�V���7n���iҤ	˖-c̘1T�VM�i��<����)�$''�~�z���/BCC)^�8�ڵcڴiԭ[7ݾr"����3x��m���			�]�v�ݻW����Y�h�oߦJ�*���vvv$$$0{�l֭[ǣG��^�:'NdРAj�������Ŀ��KPPQQQ/^��M���o�ѦM���g�D!�B!�B!�B!2G.>m� ���6m��0��5<   @�a!�ȣ�v���>>>|��wDGG+�EFF��憇��v���+X����7nd��$%%)����3�|�9����`˖-�1��%K�ۗ��=u��QK�ؿ?666�y�Fy�lܸ��;w�{�n:t���Ν�M�6����'��ݻ�Çs��	�5k��{��ڷoOLL��X||<�/_����lذ???ʕ+�#�����~�z޽{Lj#�M�PhР�^��u��1{���ˮ�����'*~��)���xzz�s�N���\�#��s��|�2���Ƈf̘����)c���-[�իW���,		����B�
ѧO��ڴi��G�ٳg8p���gϞ<?�B!��*333�}r���3�63nܸA͚53�.�S�N�{�n�]�Ftt4E��o���ښ�-[f��)���5L����`nn�?��刄B!�B!ħB.>wwwm� �B���ŋ�7N�a!�ȣ$�"�y��9�{�&&&�q��1j�(*V�H@@�֭���[[[�_�����������Ν˔)SX�v��������IJJbĈL�4�
*��燃����̟?�3fp��i�u떡kȟ?��d���H���˛7o�ѣ�g���Ą��P����~ 88����J�t�҅_���
r��̭[��5k���W�7n111:��'R�re9w��G�&88�?���U�V�Hl��;q�={���*��ӇիW��흭�M�X�fʔ)����t�R4h��[�����ٳgvvv���R�L�\�%��{�CCC�z�*�*URI�QX�r%�ׯ����۷<�}��ѯ_?���pqq��Ɔ/^0t�P>̲e�T.�͛��˗�S��W��Q�F�����q�8{�,�g�V&\|��B!����_��ɓ�JZx��-��G�U9���N�:ũS��ر#��'Z�37����b�
�o�Nrr2}���Ԕ
h;4!�B!�B�	����D���akk������"WݺuK�!!��C���#	yy��իy��1���̚5Ky���sss�-ʒ%KX�r�JyJ~~~������o���*˜��y��-}����Iy��‚�[���߲y�fe�ŝ;w��믳|]˗/�իW�m�ttt�S�t�Ё�Ǐ�b�
��ժU+�X[�n�?��C�v��U��
� IDAT�{��%,X@�����קM�6���S�n]<==�	ٍ�CY����Ԯ];�
ԯ_��7of�]vԪU�cǎ)wL�]�6����r�����6mZ�Ē��c>L@��}�:u*u�����P�|Ŋ*��Ο?�}���s�,Y A�(R���7�j���ի*�P�Oݴi�5Roڴ)�6m��Ą���t�[!�B��H.8y�d��1{�l�=J�"E2d�ڵ�\�rDEE��燳�3^^^���+���D�y-��͛7L�6�޽{+ܭ���:u*;v�P�Q!�B!�B��$��#�ٳ���!D��?j;!�B!R�ةa̘1ˇ’%K8r�H�������ׯ���t�ԉ�s窔{{{0j�(��fffj��y�x?Q<�����8q�r������&M���<xP�u�=Z�X�&M���V9nllLhh(]�ve��Ѵj�
ccc��ח��>������X�bi�;%ŤM�-|,ӦMS�����߿?�.2+���u��i����B�gSSS����[��Z�j����}�v��Z�*��B!�_333 �M��8p�������P�JeYɒ%�ڵ+�����ۗлwo�ի���?������c���<֯_?�n����5�B!�B!��C�p���ب�b(�Ȼv�ޭ��B!�HUpp0�r5��(vE�dذaܾ}�5j�u�VtuuU���€�퐐CCC^�|ILLL��RƫH�HIq\[J5j�P;V�pa޽{�r|ʔ)4��g�r��Y�}F����޽;�}�9ۇ�r�
*īW�2=�/_����Y�%|������Z,)gғ��H�IM�R�T~���Gq)�}}������	

��;w��� ��-�B�{�.�z������=z��<<<066��ѣ�ر������(]�4mڴaԨQ*THc�=�={�ʕ+9y�$o޼�]�vL�2Ec��T�_S_����[�///�<yB�ҥ�ҥC�Qy?���	��T�->T�dI���X�l����2�B��3g�7o^^^вeK~��gJ�.�R/e���'&&�5k�p��1�={F�ҥi׮Æ
Sy�h�m�6/^L`` ���C��;V����;֬YÑ#Gx��!���T�^�=zгgO�~�m�Ʒ�~Kٲe�ǿ��+���ضm����hѢ�H!�B!�B��!�B�y��	eʔ�vB�K�U񡔻5d��ڵkqww�hѢxzzR�D	�:�^�2>Q�F�\�x����6m��6���*�+���P����k��
�P����+V�Y�fq��e�ݻdž
ذaիW�ȑ#j�d5�e���r��e���i֬Y��`bb��6٥�p��b�
ų�e�>�6	O!�$��IOiپ};S�L!<<<�m�B!�D�*U��̌.��kC`` 4m�ccc���X�n�J���H�m�Ftt43f��P�111888�<v��!�Cf���xF��L�x��!...\�v�+V(wm�r�
�Z�J3��-[�l�2������ϟ�޽{�����e������+��ldd$nnn�?����NTT���]�v���;X�b�6mR�OHH��ի\�z�ׯ_+w5?|�0���4o�\-��͛s��y�9B�^�2|=B!�B!��ˣ�����ƍ�����3~�xƏ���{.F%��st��E�L����%u�ԡV�Z�hтѣGs��qm��k�W�N���s��w��e�…X[[ӰaCLMMiذ!��=�-�޽{9�gnٶm����>�xf����/�w�ޝ�s�9�9u
��Ν;S�zu��i	

�z��t��%K��v�Y�����U�eR�����K���S}%%%���~�:������c˖-Ԯ];�>2:9���x?�%#n޼I�R����SSLfWL�II�[�"����t�w����LMM�u�cǎ�(�e�u�� ��w��@���5�k�	!...S}���3���ŋ�Z,����`V���ѷo_��éU�ӦMcݺuxzzr��M��%�B�W)&��߿_��ݻ7[�n`��ɜ9s___V�^
���O��ۼy3�q�FΞ=˚5k4�@��>?���ŋʟ�l�Bpp0u����͍s�����N�
8�<{��Q�{��	��.{+V����je�O�fٲe�={ʗ/σزeK�q��i�&��éP�...�={�u��Q�|y���ذa�Z�ʕ+���3gpppP��W�{����9{�,�N�b����de�3g���_���8��#�B!�B!Dj$�B�_�U�ZLJ����X���~��	&�|�rr9B!���gϞ���@�>}ؾ};�n�"..���"##9t�C�a��yz%�*>>�3fо}{����r�
���$%%M`` �V��}��̜9���xm��i���^e<�P�pp0k׮�S�N�޽[�a}4�I�`��gmm��b҆O�YW�5��T���8���Kll,��'VVV��U$]�v-C��۷/�~�V�.i������&_�|j}�?^c�s�Ω��)�*UbРA�[��7n(Wm=q��G�-+�oȐ!�������{���:::�II
��nccc��ݺu+�qir��%�����_�~�ŒY�z3c���8;;s��uf̘���VVV*;Ҽ{�N[!
!�B�
333�Wj�۴iCɒ%���"!!x�۞��e˖U�p��).\�@�ڵ9x� ��7���2�K��}Ĕ)S�S����4jԈ��]�nv����`Μ9������K�j՘>}:�@��݇;j�H�֔=y�d�7o���>���S�.��o��W����ԯ_�)S�p��1�6'N�R�J�ϟ_��㇟�(v�puu��ݝ/^лwo.^���x�X,�r��j}T�RE��B!�B!�����#N�<��7o�6m�{���Ȉ���cmm�ԩSy��M.G)��S���Sz���ɓ')W����;�&((������?~<��ĉ6L�*�B���x���ٸq#:::��ݛ
6p��n޼ɥK�شi�r2��
����$�.Rs�֭\��V�׍78�<�7o�}���}��	&h�r;�\Cv���]]]<==y��m�u߾}˞={��եgϞ9��0���ҹsg�����D�rwww���G׮]U�O�0���@���m��u�֩�]�v�|��)'�4i҄�;I�>}4N�W��>.DGG�	&(�w��	��M��.R߭!3�T�B�|�

R+k޼�ڱ��-+��F��3���8:w��j�
�ϟ�k׮���3r�H��
%J�P�K���%��*dҚ̿h�"�cIIIʉc��r#����g0�����߿�Z��ŋ����s��1^B!��===z��Att�r�___�����;������5k۷o'<<М������P�^=��
6T���>�޽����J���3�ߍe˖��Çi�3""B������U~nР���(E)�����6&<�׎;�������ǒ%K�ӧ...j;�=����vRS�B!�B!�"5�p�e)W�ܬ_��Ǐ+W>�ׯ�?f���Z�L!ħf�ĉܻw��M�*w��Q�
@__�jժ1z�hv�܉��!�Ν���U�a2�͛ǹs�P����/�����‚�%K���K���iѢ,��Ãr��q��9������ӣT�R4oޜ5k�0l�0���qtt��^ʔ)������>|8ͺ�"::�V�ZQ�L�\�P�5jŊ�̙3t�ܙ�������>|8���GOO�9s�(��ٳ��+WR�^=6mڤ���&#G�$���_��)S����#bcc9v��=����J�5k�P�ti<HݺuY�r%���$&&����]��_����O�>e�ԩ*�lF�IѢE9~�8���Opp0��֜8q�B�
1f̘l�a�~������ˋׯ_���ȵkװ�����ӱe��$�:A���4h���<{����D�>}ʑ#G����E�<|��6m�hL�hٲ%Æ
�������q��-ƏϪU�R�]���������8p�>}�B||<���|��w�>}��U����1cɬ�|��R�J���G����DPPP&�����>�1�K!�B�.^���J���������ͪ����`Â�~�:����������q�C���iw���^BƇ;d(��=�fE��䐔�+;�eWZ��������^��Ғ���P�~}���X�j]�ve׮]jm5Ŭ8��{e!�B!�B!��GV|�޽{ǚ5k8r�>D__��իӣG���cccY�n^^^<y�ҥKӥK�����ڶ���혘�m�Ʒ�~��2�W_}���۶m���W�B�}�Z���'O���S�/N�f�=z45j�P���c�I�Z�իWY�z5~~~���`ddD׮]3f�r[x�.p��IJ�,ɪU����ibjj�ĉ�:u*۷og��j1899���˳g�(U�-Z�`���*�v���[�n����'��|��=Zmu6�۷o�v�ZΜ9�Ç)P��*U�C����k���Ɩ��ܿ�w�y�f
(��
�V�Z��[�.k׮����͍����p�4I�<��]F�9���ϊ8R�+�������8s�AAA<x�=zh�[��۷���r��BCC����hѢ4hЀaÆѴi�L����4,,��˗���Ktt4����;����k��W�^�8qwww���R�E1!A�rzN^kz���ӧy��9+Vd��j��?���2�~Gf��S�N1r�H���i֬���O��DhW�
pss�w��=zT��j�*劣3f� 00P9�ZŤV�ZŐ!C�;w.s��U�׬Y3&O��r�J�*ʉꡡ��NJ����?���?�T9^�bE\]]������OOO������J�ʕS�?�~��w<==�~�:���j�*T௿��(�e���~&M�����ٰa6l�؇��.������'��j�S�N���Ä��aaa�R�H�Ӥq�Ɯ8q屔����>|��D����
OOO
(�k�dVn>�Y5q�D�
���NNN*eӦMc۶m���r��er|��B!��T�/_sssΜ9õk�8u��[�V�����x�˚b6�n����&R266&<<�˗/��w��5������Ȉ;w�w�^���Ҍ�W�^8p����caa��s��7o�i�&�;��|���@ժU��;����s��mT�(�++

�����ʊ��`�=�ƍY�x��R�JITT�J�Ri��#�B!�B!DZd��/Њ+X�v-w��%!!���X�^�ʬY�TV���gĈlܸ�����Çqqqa�رi�<p��abccU>\Vh޼9���9r$ǯO!D�]�p��]��m�6>|HBBO�<aϞ=XYYq�ĉL�3�D;z����y�����ܻw�իWӧObcc�uw��
���-ŋO��^�z�}�ve;��Ǐceeſ��ˣG�HLL�ѣGxxxн{wΜ9��9�۷/~~~�}����h�=J�>}�_6*bee�֭[��ocbb

���{��<}�4�bK)����ݝw��ѯ_�t�-j׮���
�޽���9wV�9�r������W)|��5666̞=�.���K���x��%'N����رc�;+�q��iz��}�x��9���3|�p��
:t�X�b���q��=�u�ݻǹs�(^�8:t��k��ĉ����	IIIܹs��3g��쬱�Lj+;��I�

�͛7,X0S�
��ڵ+888`ll���>Ŋ�cǎ9r��#G��O-�--�<y�.]�P�xq�U�3g����j���}"�իWY�f
�;w���}}}
(���)Ç���_-�B�{��\�|;;;��������Ȉ���q�OVr��Y~��wj׮M����ӣF�������M����2{�X�d	!!!L�<333

�;P5mڔ�S��ҥK5&[��Μ9���%J������M��o�>��j��ׯ�s��.\===*V��V��Ɔ'N`ff���ժU��~��ի|��7�KV��3�UC�e�ƍ4hЀ���chhH�طo3f�`ڴij��>�x	!�B|*z��ERR������ӻwo��Ξ=K||<!!!L�:Uy<:::C�(vʛ3g�/_&11����4w�M�OŮw��U��m�GGGBBBHJJ�ٳg���ߘ��1b�e���ӭ[7bcc2dnnn��"##ٲeC��͛7t��Y-�`���\�v���D����;�u��IYGS�)�i�F9>���$&&�L�O���=z��̌�;w���	������5k��Ν;j�PS�B!�B!�"5�p����`���={�S�N)W)ݾ}��ޖ-[�nݺ���q��9���iР�ϟgϞ=�m�����k��23yT!D�x��%�G����888p��1���ٹs'}��!!!��c���c�v�n�R{M�0AY��*�����ё��$lmm9y�$7n�`۶mT�\���`V�^����ݢ�R1=����|����~��g����С�"$$�C�ѡCbcc�駟x���sN�4�֭[���εk�pss�R�J$$$�b�
���f������ۗcǎq��
���pss�F�ܿ�e˖�Xl���T�,͈�ݻ��ώ�ĝ�qV<�
>����g&��jZ)�C���abb���;AAA\�~�]�vѰaC���Y�jU����xDGG3v�Xe�Ç�޽{i֬�r�hJ|��w$''�c��uv��Arr2ݻwG__?G�U��ϟ+��[�nxyy)��e˖�\�Rc��ƕ޳������<x�+W�������cjjʺu�{�.���|��#G�бcG��/^� 999�WJ8p�/^��[�_��ԩSS���w:t(�������nܸ�����I��]�6�7oV&�?x�7j|?	�{z�ŊcΜ9KBB���,\��2e�|��2s�R�Q�s���…DEE���ȋ/���c�̙Ze�Q�Fxzz�s޾}���ݺuK3�*U�p��A^�zEBBB��p����…$$$p��-,X@�ҥs-�����3��2E�G\\QQQxyy)ǫ��$''����&��N!��seaa�����ؘ&M���+����7o���7o�T����d�;;;j֬Idd$Æ
��ܜ�R�V-���S�������38{{{�T�B`` vvv4mڔN�:)w�7n�J_���t�ЁW�^�x�b�u놹�9�}�K�.��״m�6��gJ�,���=���:���Hj׮M�>}�u4ř���T�888`nn���<�R�J888dd���	0o�<Z�jE�f͔�s4j�HY�E�����Dz��!�B!�B!�,�p�����T^��
*���+���x�޽{s��Ee���~Μ9������K�j՘>}:H��7n��
��B��c�֭<{��Q�F���H�ʕɟ??
6dΜ9���Ö-[�<���?K�,ޯ�kee�,sss#>>�nݺ1s�L*V�����~�-��7���<�O4̪M�6���9NNN���������	NNN�����͛5�oҤ	NNN4nܘ�ҴiSe��˗U�*���4i�+WFOO�
дiS�D{oo���CY�������dbDQ~i�i����Jܙ����g&������R���`ѢE4nܘ
```@�
X�h���Y��۷����5k���5j�@__�ڵk�aÆ4W�ի�v�R�Y-))��;w����k�d�֭���ЦM�-[F�jՔ������t\�}.nj���)E��\�r�!�B!�"�p0Mttt���Y[[+wcP��߰���`��P�N�Ν˰a��E��b``��5k�ݻ�r��;j\� �}N�0�
*���K||<E����[[[��������А6m�h�����y��x�b,,,(^�8:::�(Q�V�Z�x�b���T��/^L˖-��ӣlٲ��� IDAT0ggg�u4řRѢEY�~=?��e˖EWW��e�ү_?6l؀��a��C�����ԪU�^�:���*�+v�ԉB�
���v�)��x!�B!�B�e��v"��;�?��???���prr��[[[
(������	�
K���ϟ�?HMIqLQG!D�q��q�J�����|||?~��:111�;���$Z�j�o���R������N��7�|���@\\��8}�4ÇGGG5�TGG��Ç���lj'4^���W��^�R9ndd��۷qpp���4i�D9A���D�ۇ�r�bccͿ��R�H޼y��v�d%�̎sf��3�Y�/�S�"[�ԩS��U�X�߿��de<�=�j]]]F���P�R����Q�aaa���кuke����=���T�j~N^�&�gt��je����1��Ç���t\�}.S��)�B!�B|Ά
��gE�eΜ9��SH�ԡ)ɣp��L�<Y��|ju3ڧ��%���ju

?~|��~�U�V�j�*��+�ҥKӬ�)NM�S�X1&N��ĉ�<_j	4��[YY���B�…���eݺuDDDP�B"""`�����Y!�B!�B|$�"���@P��EZ+��4KKK���9q����\�r�U�V�e�F��\%8999��7QP�RPʉ`K���B�S$ԙ���Y��۩�9::r��}*W��ҥK���U)W���_g(�"E���ׯ3��2^ń���ׯ�[J�vlR|�r��Q�F1q�D�����'4oޜ���Ӯ];�s,�e�*T���bbb(^�x�}(�~�@%a3��wf�9�r��,E��"�%#�ݻ�͛7�r�
W�\!88H�o>����͛7�lӨQ�4����f������$\���+�5��j�xF�֭���A��#'���s�HJB!�y���!DnkѢ�&M�vBd��ٿ?���ʄWWW���4.$�B!�B!DJ�p�244T���ѣGٸq#�/V&\q����ݛ��Y�J�"22���(J�*�R��#�"o�����۾};���p�¬Y��bŊ��Q쨐���*W��իW�u�V�&5$%%�$z(�RK�Ho�ŎѫW/�-ʊ+

��Ç�ڵ�]�vQ�R%6mڄ��q����ܿ�U�ȍ7hڴi��ܸq@yّ��3;Ι���Lfݻw�r�ʥ[w������_�6Y���Pܯ�C

��gϞ,Z�ooo�?Nɒ%y��9G�EWW��={��ϩk�Dq���X^�D�T��d\�}.,���B!D�8�<{��k׮�E�9p�@��"/)X� ӧO�_~Q�H�g��-[�#�!�B!�B�ϟ$\|�z��ADD�'O�k׮���('}�z۶mٰa���L�8^�|ɖ-[ؼy3fff8;;�w�HNN��ݻT�T	��5kɝ;w�++�֬Y37.Y!D&,X�W�^���$��˜9s&���c���ԨQ#�>^�~Mlll�����o�z�*>>>J����ٳ'�۷g����I���ѩ����-'XZZbiiɃ���ŋ\�x������w�2s�L֬Y��e�lْ��@<������R�������۷os,n��8gVn?3�q��9���fϞ=�7��իӥK*V�H�%�Q��۷�p�Y�����Ĥ�g�r�hѢ�N���Ã!C����Abb"m۶�L�2�Z5)\�p�;�(�R����s)���dg� !�ceeŒ%K�����'_��K�ƍ5j.`�����*�B!�B!�����o�̛7�V�ZѬY3�	����T�R���@���hڴ)�:ub���(P@9q������5ݻw�o7
p��5��,,,>�
!�Ȏʕ+p���L�{��-���o޼a�رt��!�>n޼��s��w��������ȑ#�z�Je��"!000Pc����z9�|����ݛy������?������G�-+��~@WW��۷k�'����oߞ�ӧ��w۶mP��W��y�'����޽�cq(#�Y�zfғ���֭[ҝ��r�Jf͚ő#G7n666t��Ae��w�ޥ�oV������W�jl�ڹ>Իwo<<<عs'�rW6���VM	d��LI��JJ9W^}.�B!�B�yP,h򹱵�eѢE,Z��~��i;!�B!�B�	�%j�LXZ[[�������rҤ��1�d�"E�����ڵk9~�8�?�p��4jԈ#F��Z>a�V�\Idd$���t�ԉ�K����ÀTb���H�"t��1�X!Df�nݚ�� V�\I˖-���U)߿??��3�[����Ey|�ܹ���ЩS'F��f������N�ƍU�n޼I�.]�P��N�ޯ�߲eKN�>�O?��ʕ+S]�=22�����<ުU+�]���իiٲ�2)�OtVL�W$fG�V�����СC�����iZ9-'c��366f�С8;;����ի�S���͍7���f��͸��ѯ_?�������E�4i�D�CCC^�|I`` ���*e;v�ȱ�3;��]�޽{�2Κ��3��/&44�ʕ+Ӯ]�4�*v�ٳ�Zه�~���T&�k��񰴴��ŋ�[���-[�$A%''�v��4��С���ܸqOOOBCC)^��ZRWN^�&;v���ggg,,,ԞQ���ոR{V��s)�B!>��7~�`�y�����wDB!�B!�B!ޓ.�PVVVlٲ___|}}پ};cƌ�hѢ*�

?~<{���ܹs;v���$[���t����;w�ÇP�palmm	 ""BY7""������4�M!��eggGѢE�t����\�r��o���燣�#���+���L�0A���ۛ͛7S�V-.\�2�Z��v���…y��)o޼��ٳ���π��gϦD��<y�.]��y�f�ݻGRRqqqܼy����=z���F���_��g�…���c�ȑ������@XX#G��ܹs,X����g{;>�3�ӧOKRR7o�T�պu�[V����㱴���ÇX[[3y�dΜ9�˗/�W��o߾$%%�e�"##)V�,P�����)S�p��E޾}�ݻw�={6[�lɱ�3;΀�o�Ç���DBBB�c���LZ���x��1G����ggg���7o�ڤ��ʗ/�O�z��)III���2a����/_�GVƣo߾�+WƌCXX������1j�(�����7��t��
��3g�セ��G��Ԯ�lٲ\�p�!C�p��u�u�?��S�;_d5�Ԟռ�\
!�B�������3t�T��
!�B!�B!ėNv���ٿ?���L�8WWW�������rtB!4)W�K�.e�����bmm�VgƌԮ][�����		�o�I�ܷn��J�*̘1���'''���T�5lؐ#F��X�"nnn�9�۷o3}�t�}�����O?1v�X��_}�K�,a̘1x{{���Rn``��%K�P�B��g�ȑ#�&,,L�ʀ�ʕc���%���?x?n+V�`�ʕ899�cǎTw�P���b˖-�7Ne�1c����Ν;���G���ٳqtt̑�3;�u���ܹs�3FyL�\����̇�W��fy�B�X�x���"�6GGG\]]quuU)3f������*R���(\�0˗/��ޞC�q��!�6���gҤI�&���Ջ�[�������Z5)R��V����S�N)w�QX�p�Z"Sv�J�Y��s)�B!�+++�,Y��0��==��P!�B!�B!R#���Q���sZno9_�`A�O��/���\ewϞ=,[��
�j,B!2�M�6�۷�իWs��i�<yB���_�>C��e˖*��޽��>lll�R�
NNN������*U�D�=:t(jmLMM9x� >|����?���.�˗��ܜ���S�fM�}�oߞ�{���䄯�/Ϟ=�T�R�hт#F���UE�a�Ν�^�///�߿OBB+V�cǎ>��%K~��2{�tuu����۷/;v��LJ��Pbbb��ӣt�Ҙ��bnn��ׯqvv���	???v�ܩ<�7�|Î;X�l.\ 66�:u�0f�ڶm�1�"+qge�,X��iӔ;o�)S&ͱ̭g&-���R�jU,,,����t��j۷o_��Ϗ��aaaP�~}
D۶m�R�
&L��͍Ν;�{���G�ƍٷo˗/�̙3<{��jժ1v�Xڴ���;����Kܚ3Q�����rEY�3�ב
82s��+s�fZ�D�,A�$G�{�V�܈{��Td("�?����[�|<|<ι�뾮�}���s]����ϟ�sa�j�ppp�ܹs8::�M�J�kM,����3w�\�m��ݻw)S��l��l�EJ�J�"|.%}=o�(�W���>>>�����������Ybccc3;�WA�,Y�������zU.|||��?�g�ֹs�L�C$1nnnƕ��y�yyy��'�W�_�v-C�IteK\�v
OOOΜ9�?�K�\�|����S�L�;5H����^�����ホ���^�|�drT"�oS�vm����>KD�V�v�x��qG�!C�h�Is�2dٲecժU����8p E�����E�QyYh��Tf%F�WWW�rDDD�S�D	����C^`���DEE�u�VJ�.��ʕ+�T�RG&""""""������y��J�FDDDDDDDDD�š�IU�T�0��#GR�J�g�Ε+WX�r%.��g"�o���ƕ]ED2�V�����?AAA\�v���
*DժUi߾=�����3���@��8��me�+V0u�T>l,kڴ)gΜaݺu899=��'NЪU+���ߓCb�0%�6-���{�o3k�,�*"�/�񨈈�����,�p!"""""�bԨQ���s��I���ϒ%Ç�v�ڙ�ȋ+666�C��,Y�dv"�{�.�}�;w�Lp��͛lذ�
6P�^=���{��ɓ	QJf5jT��v��1e�|}}7n�s���m۶i^�2wo��\]]���0DD$�h<*""""""/��@DDDDD^M������|��ǔ+W�9r�5kV�+F�-���w�ޙ��������;w�Ю];v���믿�_|�ƍ9q����l޼��C��;wnv��A�^������%�iӆ�Y��f�=z�d�G��v�Z�f�J�6m�4�s�ν�;�����������H������kk��CD,���G�2;�WN�b�=ztf�!"""""l���\�r�ڵk��?�/_>��e˖���4jԈ�;r�����ڵk&E,��H�"ԭ[�;v�q�FZ�j�h�
6���ׯO�"E20J��Q�E:Z�z5�W���0DDDDDD�p��-�5k�k��Ɩ-[�z�*mڴ�hѢdvx/�ӧOS�B��o___���@�:u�裏224���v����c�Νܹs��^{���~����S�\����f�U��;Ƃؿ?aaa���ҬY3<<<ȕ+��ޡC�عs'd޼y	�-�rttd���=��+W&H�8w����g�޽ܽ{�B�
��;�пJ�.��u�;w��G�2u�T>L��٩Y�&����J�*	λx�"�-bϞ=ܸq�9r`ooOÆ
�޽��kHnlII��KLJ�?�y���.�…�˗<<<pttL����}��:�ڵcǎ���&�p���@�v�g;^x{{�i�&Μ9CXXy��jժ��Ջڵk'ږ��dx޻w�&44��%KҵkW�w�h[ɉ�y�&~���o߾�?���~��Z|O�MjԨ@PP���979R;�1����
��N�:t�ޝ�ŋ���Yj�{Z��X4��J�H'������������B�?�����J�*eZL/������ܹ3S&�$��Ç�3g+W�$66��;���HժU3<Nyu:t��={���Cc��۷Y�v-7nd޼yԫW/Ym�ȑ�使�?#F� &&�Xv��,X��]�X�r�1�°���+����s�j׮�˗O��}�v<<<���2��������a�~���y��m���_������#����[����˩V����ѣGqww'<<�X͉'8q��V�bժU.\8Mb�/=�_r�?��2e�������׳y�f�Ν�|��8��aÆ�ϟ����s�����Թr�
��^�aÆ���ӹsgN�8aR�޽{�ر��;w��陪�w��A���M���K��0a�IY\�Wj>w���1��9sZܧ����<~���ׯ?s�̡r��iڇd�5EDDDDDDD2�.҉Vy����80��1+�����;w�p}GFF2f�ڷo���-m۶e�����i������{��ѿ����ѣ���+V��'O��營��fӦM-Z�x��	�ϟ������믍�W�\aԨQ������J�޽)V�����?��ɓ,X��!C��[ٻ~��]���M���o߾������aÆ6�ҥKs��E�O�Ζ-[0`7n�H�"	����y����ٳ'NNN=z�#Fp��e�̙��ŋ�u'N�Hxx8�:u�W�^�(Q�'O�p��Ǝ�ٳg�5k�ǏO���J��{��\\�|�
ժUc���899q��e����l��СCٶm�8����t�shccC�-���Ϗ�C�&h��Ϗ��XZ�l���5�f��ĉ�/_�I�&��쌕�'O�d�ĉ>|�y��8�"44���E���<x0vvv�9s��S�2w�\����Ɋ�y�&����/��S�xq��"IZF$t��X&n��=�…̙3���������qH:ʨ4��XJ�H'~~~t��!�#K���amm��a�d�����ADD^ ����?����OOO�ٳg3{��L��A��d�nݺE�N��e�;wf���,Y��~��ebt""�X�|9w�ޥ��&�ӫU�F�j�ȝ;7^^^,[����u�Ç3s�L>��SZ�je<�����Ǐi޼9&L0�׬Y���6mڰz�jc����(W�\��맟~"""�:u�0�|���(_�<��ϧK�.�߿�����uժU�$�ڵk��_���Ɵ�iRא��矓/_>�e�F�ڵ�3gM�6e˖-Ƅ���WZ=��\\,[�̸�I�r�L������H�v�����ͪU�<x�������/���Y��o���$�jժ|��|��8��˗F�z��5k�����	///:v���Ç���q��s��ၣ�#y�䱸_yyeϞ��+2s�L�u�FHH�֭Ӣq��5EDDDDDDD2�.ґ��7������X���-�C���DDD�%��3o�<����Ç)]�4]�v�Y�f&�������d۶mܽ{�…�ЫW/��]�d�+V0c��=J���iذ!�6����S<==ٴi7n���Z�nM�6mLڊ�:((���ӓaÆ����?�`R'.s�ϻ��cŊԬY�d5�bŊQ�F
V�XA�.]ț7o����H<۷o�K�.f�w��///v�ڕ���0LLL��}����={������7�|3�J�QQQ�ʕ+y��ݻ�ݻ�Ʉ{+++z�����ٱc���2w?*W��ÇM�mmm�x�"=z�K�.ԪU˸bx���\_jc�+-��9ɹ��<<<��q�i����pQ�Jʕ+�ٳgٵk���خ]����qtt��7� 000ѶJ�,	��3��g��'�$8�5kV���C�޽K�R���U���}�,._�L�v�����?��֭[s��u������c�֭���LTT��^�z���/��̍�޽�ܹsٹs'���|��9����3��@DD�/f���ܾ}�…��ҳgOlll,�O���t�ޝ�#Gh�pai����Ô)Sؼy3666Ɲ�.l�gr�}޸0��==��dLl��bi,��}�5EDDDDDDD2�.DDD��Z�je�R�������4BBBpuu�T��J�� IDATR�Z���Ǐӽ{w���I�8BCC�֭w��1��={��c�C˖-�g��>��Ο?o�w��M|||8x� ^^^	&2��ݛ����&��Z���O�2j�(�̙�O?�d�ͱc�8v����%OϘ1���0��(iy��lܸ���\\\sqq��lڴɸ2���HJ�={�:u�$Y��ŋ�5jW�^�T�R|��wd͚��K�x�7,�)O�<<x����O�4�kH��J�*&��W�T�e��C�>}jRޯ_?���Ç�;������B�
��Lv�Mmlq���3'9�W�ڵ͖�5~�Izi۶-ӦM����$�����xܜ+W�‘#G8r�'O� 666ű�Q�J���Z��s�H��R��3$�J���Q����ѣ&���ѣ\�v�ڵkcgg���Y�x��7o�dŊ<x��󄅅ѣG�]�f,۰a���	ꦦ�ǏӧO�g�ƍxyyq��q�̙� �&)���3gR��ԩSY�n�l��_�Ųeˌ;�����s�ӣ���
���c_�5EDDDDDDD2�.DDD�����X�tif�!""/�ٳggv���ǁ�M�>�-]��;w�����ĉ)\�03g���_����8�䧟~��(Q�	&��op��Iƌ�ٳg����ׯ�IۥJ�bܸq����,^�///�o�n��bX�v���ԨQ���h�2e
+W�����d7���V�-[//�d�k�u'ַa%psS
e{���$I��v+���ʕ+Y�~=�s���ӓ���'�X�cE�R�8v��Ν�h2:@LL�I��amb	���"##�Ϟ=�E��k׎�y�2g�N�8<��j�*V�Z���=?��vvvi[\�}~�I��U�@��k5|�[�6m���oٲe���,X���P�n�J֬YMV{X�~=�|�
W�\I�X�;w��f�'v��:��~���*i׮�b���&	�o���˗0b�Z�lI�,Y8v��{�f׮]����?s��5���8q"���;v��c�&�kI���'�-[�ɓ'�T�#G����K�.1y�d<�ڵk|$�`��ܻw/U}�޽�Y�fQ�fMN�:��ѣ�~�:˖-3��R���ƅɹ��ѿ�c���b��4���/}"/�5j�lG�Һ���:��C�W�����׍t1���!�������{�n>��3���ɕ+�F�"((�_��Xo���U�+W����5U�Ta�ȑl۶-A�Ç��ޞ�ٳ'�<x�x�0����___���ڷoOPPk׮�(~ww�d'[$��9}�4`~u�ҥK��I
�$���s��%�/��gϞe„	dɒ�3fP�\�$��t�}͚5,��|���W��СC�e���aaaf�1���V��7n�ڵkٵkS�N�C��)S�˗/3a„t�-5�/=$��
ה�ds;5<z�(�q������;<y��8	��ߟ'O���{�Q�Hcݵk�2p�@�\����L�2��u���`���=K�2�k�eQ�^=
,��͛����ɓ'l޼��E���{�ȡC�prr����g�ԩ@��v���ȑ#qvv��ښ�ի��_$���>7o���ɓqtt$k֬�-[�q��${�@�l�[�/%}�1����\��1!�0Li��&羧G�)&'KǾk��������d<�p!�u��a�̙�ʕ+����cǎ8::Z�2�����������ըQ#���aH��M�ƴiӌ�'L�`��gng��r��u*T��d�k׮P�J��jժ�������u�|�x��l��|��W�߿����3�|z�聫�+9r�(~ä����	

�OJ4�ꈈ��F�R�8q���'����=z�A�ɐ!Chذa�}�<y����z��ݢE����G���`�i�&>|H�,Y�e���?~��G�'L��_륥�ŋӾ}{�۶m��O?e����[J�_z9~�8o��v��Ç	WT�����ӧDFF&����˩��}�����OϞ=��_��>w�\&N�H�ΝM�ݺu���ӧXY%�r��q��a���/�ի��aW���:���xQ�[0,((�lٲѺuk�,Y®]���ػw/��ߧW�^Ɲs�ܹÐ!C8u�T�v�%%��ի&�i���<q��O��O�V��?{��E�ƍLwdIIu��1yo�[�ᾤ����s�ӣ���
���c_�5EDDDDDDD2�v��$EFF2f�ڷo���-ŋ�m۶�=ڢ��EDDDDD��w�cJĝ����u��4nܘ����c�R�J����7o͚5cժU����q'9=~�8���\��\s��e���"""�q��ܹs�+�ǵ~�z�ѣ�I��_Mpp0M�4���I�a�`kn�㐐L&�W�R�w�}�۷o3`��$�|��M.\���={�4��[�`A��%�>}�…x�w����fw��^���i[J�_zY�hQ����,X@ӦMM�&&=z4�y~~~��c�9(��6lH�|�8}�4k֬�̙3���k	��.]�@�6m����e|�h_IiԨ?���gdx��4���MF~M�l��`ee�o��<�5������O�6�S�Nagg���;_~�e�vt7�!�'L��9"-�|^BFrv����?�X�b������b�qOJ�}޸09�==�O��-9�X:��XSDDDDDDD$�)�"�ըQ��</�%K�p��-:u�d,�ܹ3�n�bɒ%�������ȫ/((OOO*U�DPP�q���իd���^�u��/^��������)�?_�|�jՊŋ��O?ѭ[7<x��3RԞa�Ixx���ܵYz��*T����'8f(3�I
www�����A���9r��=b����5�����d͚�aÆ�ٲe?��3+Vd���ϝ���憍�
���ӧO�Ν;DFF�o�>$�u`ҤI(P��;w�����?s��bbb���"$$��Һuk������o�{����s�f�����ۗ�g��ٳg�۷/ gΜt��%��e˖xxx�{�n"""���!$$ĸ\��'�2��<��c�ȹs爎�&88��={���:t0�o���ȑ#	

�ѣG\�|�I�&�lٲD�1솱q�Fbbb���NP'{��4o����[˖-M&F�~��믹s�111�9s�aÆ�$Cܻw/��x���-ʡC��ٳ'�N�"::�s��1`��?��6���MF~M���}⏁�/N�:uسgǏ'00�����E��v����b��Ư{�'O�X������Ǐ'���>
c�u�֙���Z/@tt4>>>&�������U��oʔ)�.�$羧G�)&7Kƾk��������d<%\��n�J�>}�W�u�ԡE�L�>����zw��e���4h�F���Nr놅��b�
j֬i�K�bŊQ�F
V�XAXXX�^���p���e}�����>�����4	���2w]�n���ˋA����F�n�>|8~~~fW\K�KbHO6l`ڴiL�6�
6dX�""�:��J�*�}���N�>��7oŴiӨQ�������w&O��ѣGy��	G��믿�nݺ��u��ԨQ�_~����ʗ/���#`~�˗/?��
�z�j"##9�<S�LI�u��B�
��V6��Pf�#""����:�}�9r�`�޽�m�'''���X�b���|��899�1$p��o���`��A�ҥ?~<Y�da���Ԯ]�J�*���Ι3g�V�}��1��dɒ���P�ti�\�¸q�W����8;;��2e������M�/V�3g���Ɔ-[�ФI*V�H�&Mزe666̜9�%J����ۗr��q��Y�u�ƛo����#~�!�������1"]bK��KO�g�f���4nܘ�+Ҽys)R�, {��&�=<<Ȟ=;�.]�cǎ899Q�~}���;vl��~�������d���<�����z�����7�k���ё�M��믿���A�ҥ�pX"O�<̛7�|��H�-�X�"�7&  �ѣG�=/�q%vo2�k�eԮ];bbb�޽;�?�}��f��۷�Ǐl��<x`Q?�]^&O�̟�ɓ'O8q��&MJ��in<Q�~}F�Epp0111ܽ{���5j$�?לG�q��q̙3g(Q�M�4IU�&M���<y�Ç3y�d�T��<ɹ��ѿ�c���b��WcM���p�Uya̟?�ŋ��ݼy�+V��Ə<K��ѣ׮]3�۰a��J�ɩ�q�F"""pqqIp��Ņ��i�&��I�iӦ����E�?~�ŋ�3g�r�zaw�J�.^�ȗ_~Idd��,::��/r��Ev���	(X�`��d�S�N���÷�~Kll,Æ
�t�҉N�˽	�1�7o��ѣ�h���ا�~j|ݭ[7�m���˗�ѣ�I={{�e��֭�'Ofʔ)	�"�W�n|]�@BCCi۶-����[�.�6�ի���?�}��}��ٱ���m��w�y��;wr��q�8��0%	("""�ԫW��~���{�nn߾MΜ9�R�
�~�)��I}K��С�K�f���>|���H���iݺ5�~�)666	�qtt����ߟ�7Lhh(Y�f5�HߥK�D'�6hЀu��1�|����ݻw)T���}��\�rɾs����/��‚ؼy3W�^%::��%KҨQ#z��m��Gl�}~�Y�f�-[�#Fp��I�/NӦM�ݻ�1i5�7�|???f͚šC��������ׯϨQ��3m�4ƌc��H�"f�U�V
Ν;���#o��f�:�:u"{��xyyq��Ylll�R�
�1��קt��6���V��ׯg�ܹl۶��w�R�L<<<hٲ��HRWR�&��&^Fu�֥hѢܺu;;;jժer�^�z0v�X��@���f�񹻻�u�VN�>mL��g	�'�[ڧ��D���ٱcG������9rw߉/�ߍ�˗��S��L�OI�{��&eNNNt��1U�>Or�{z�o��0���b��WcM���������1b-[�$K�,;v�޽{�k�.c����k׮agg�ĉqtt�رcfy���{��0���P�g�%\��H�


J�x�D�������?�ڵk_؄�Į��$22�ʕ+���O�<���\�p<<<�lǜ�Jʈ��b���4n��8	�aÆ̚5�3f�#G��CD�U?��ĉ&�3B�B�X�d	s��a߾}DEEQ�\9�w�N�
�����˒%KX�`;v�0NkР�~�)���Kv�m۶%[�l���r��y���[�.ݺu3�6ls����͛<~�8�6�����7o&22�5j0f�>���]����4i�w�}Ǯ]��ڵ�I��v�"O�<4j�(�CDD$1eʔ1�c�9�NQ5k֤f͚�:��ƆN�:ѩS��Y�\9���[��;w.E����˰a��N�ψؒ�j+��WŊY�z�ű8;;�`��d�W�dI�,YbQ��6mzn����?��2�ر����ŋ'��Ab�$��ݛ���xUXYYѦM<==i۶�q���>��'O��k�.bbb(_�<���\�pOOOV�\iQ…��
���̞=��[���ϨQ�ظqc��47�ȓ'^^^,Z���۷s��-r��M���-N������֖��~�.]��믛OI3f���/�d���,X��M�ҳgO�����=5�==��tl_rb�t쫱��������H�S�EKlh�� ����ԩS����9s�C����Cc�;v0r�H����g+�|��4Ȥ���=}�4�J�J�a�kCy5}��G@�M�O����ӽ{w��z����0h� ���@֬Yy�7<x0�
��?����k��Մ��ҬY3cY�f�`���)�T#""���߲eK��Q�xq&O���z���g���><�z�%�+oժ�Z�J��ƍӸqc��ș3'#F�`Ĉϭo�u��;w�ܸ���x�b�]�F�%�v����{�&W�\I�+"""""��ի���q�͛7џ��L`n��;wn����in<�v�:t(C�5����Dr��g�=�.�i�nrƅ����ߒ�ajb�ƾk��������d<%\���ܹÐ!C8u�T�c�����W�^�r��&u�U�����


0N���Pf�#""�N��������DEEaggG�֭�t���ŪU�طo���(P��u�Ү];�V�����-I����H�r���<}�???�����۷ɖ-���ԯ_�d����J*ޤ�+��ܽ{���'��\[[[��k��zܸqL�>�R�J��_&���~���,]�����������݉��gN@@�*U�`����.���3�lْܹs'�/"""��nݺ�~�z����	(����������щ�������HcM�����e���V<�6m�N���Ύ�����M&[��/�&ad˖��&��aҪ��U�c�2s[ED��!22��c����.\�`v����h���+Ν;g,�}�6����9s�Q�F��~�<���ܿ��������ڵk���<yBHH!!!DFFҢE�d�g�v�����ɸq�hРիW�|��f�7?�ҥK	�P�BI�7n�q��G��y�fbcc�+�%���ٳ���(�V���XժU9v�{���6�"" �S+�+�ʳ�4ƍǠA��ҥk׮e֬Y&��"""""�G�e���|��י���IcM�����������@��?�x�ɓ'd˖
;;;Ο?ϟ��������������
��͛ܿ?�����눈ȿ�o�����MѢE8p e˖%$$�Y�f%�iݺu�;w�����駟boo�������رcl߾�
��֐���
����СC��زe#G��R�J<y�@-ZĆ
R�p��u5lؐ\�r�|�r֬YÚ5k����B�
ԪU�
w�x����c�ĉ&;w�S�xq���O�B����ߟ.��l>@ٲe�cH�9|��.DD�_뭷ޢ_�~L�>����S�z�L�JDDDD$�\�p�/_Ή'hܸq&G%�r�XSDDDDDDD$�(��%�o�>6l���?~�����,X��M�2o�<&O����\�2�O�fҤI	�JN�
*p��M.]�� ��ҥK�:""��H,�!~���/�W�^8::���D�>}�<y�I�}��0h� �-
@ɒ%�߿?`׮]�ć䲲��B�
|��G8;;���9r����z�*�jբq����_\\\8�<G���ɓs��q6n�Ș1c(X��s�iѢ�s�->��lmm���n<��g{���YG|�2CI_ډ����ꊫ�kf�!"""���������7o�������9p�E��C�,X���s�j���ƛ/&�5EDDDDDDD2�.^`���#  ��c�2v��ǃ��qqq��ݝ�[�r��i���M�41&F$��;��Ν;9~�x�Q;bԭ[7��)""/��ׯ��o���p��
<<<̶u��e��5�����CƏύ7�[�n�d��۵kW�͛Ǒ#G8r�+W��?��͛7'{��Ǘe˖�lٲ�iӆ��hV�^���K�,���s�/Q��E����_�Ν��O�˒�l
�^ډ�Pf�#""""""""��������ϊ+غu+�s�M�6|��4lؐlٞ�Yr޼y�������������2;�����DW����hܸ19s����ggg���kc��ʕ+�����ӓ���S�@lllhԨ�F�J�fr�6i҄\�r�k׮�v��E�<yhԨQj._DD^0���&��Wk����t�����X���C߾}���f�…�]Rگ��?��}���B�
<z�+Vзo_6oޜd����Ɏ�%y|��G���&8fmmM�֭8r�E�Y��`��6�^�<[C��U�+
eZ�PDDDDDDD��ɪU�h׮���:}��%w��,_���7o��Tm IDATt�R�6mj�(���~��˛7/�'O6{,���l�#F0b��rs���͝;7���,^��k׮W;v����{�&W�\ɾ.y5+V�+W�p��i�|�Mc��ӧ�-R�ׯ_g�ܹ)R$�b(S��Z�b���xzz���D�<yR�o�<y�_�>����ܹs�߿�5kְt�Rc�a�,Y���%22�}09;t�U�lYN�<ɦM��ԩS�㆝&�%3���<��^{�;w��k��fr,,,�XGDDDDDDDD^|��̚5�X6}�tz��I���312����IR�n�X�~=���>ooolmmqww���DD$3����r�J.\Ȁ([�,�Νc�…	�֪U�իW����'�P�T)<x�o���ڵkqvv��/����p��
lmm�G۶mٻw/�n���Ϗ�?�8E�zxxp��-z���{�G�R��y�&`�#D�|���>[�n�Q�Fܹs�E�=7Ns�լY3N�<ɯ��JDD
6��֖��hN�<ɏ?�h����Ik�y��K��Ν;\�~=Ab�!a�t�����ȫ꣏>��DDD��v�Z�<y��a��+&  �V�Z%�\�r1m�4jժ���'�b�ȑ�ܹ�Ν;ӪU+r�Ν�|||R������������HZR…$)gΜ�7�A�ѥK���f͚E�929:�L͛7g���\�v�Q�F%Y�M�6:t���>��s�cٳg�[�n����A�Q�H�Ν�d�9r�_�~|��Wlܸ�F�Q�d�d�ۦM<==Y�hQ�
'''��5k�e�~��g~��g�V��d��]W�Z�hժk׮eÆ
lذ!�yŋ7IrL�I��<��ի�ٳgM��ٳgx뭷�<F�W���=:t��0D�_�C����gv"b��U�*�BD�E�f�,��V|ٳg���
777���X�z5˗/�[�ndϞ�V�Zѹsg�4i������֮][�""�8�GEDDDDD�e��y���z�~��1}�t���O���39*�����ˑ#�ƍ��LJ�� """����E�̙3�䏨�r�b„	�Z���r��]r���o�AǎM~�������Ý;w,�ê��M�4aÆ
,]�Ԙ$��~6lH֬YٰaW�^�X�b���[�n��X�k׮XYY�w�^=z���3}��O�>IƘ�u�����o�i�&Ν;ǽ{�Ț5+%J��N�:4k��$�1%�'���l�y�~��'���+!����ʕ�t�SD�U������fv"""��֭���""/��y�ҥK�t���۷���c���jՊ
СC:w�Lݺu����8p`D-"""""""""�|J���������a���&�����פ���(P��<O�<Mqqq1;A?���=zУG��P�~}�ׯ�d�9rгgOz��d|��'v]U�T�J�*ύ/�v�7ϋ)�rK�mΜ9i޼9���ܺu��E�p��-����裏�+����|||pss��0D�_���[��yI2��k�fv"�jժ3g�L���)B�~��ׯ�/_f�ʕx{{�`�J�,�իWi޼y�绹����&���ȋK�QyY(�BDDDR�k׮DEEѳgO\\\ȕ+ׯ_g���T�X1�#��J�mݺ5������oƤ��~��"E�ТE��_D�e��$C����Gev"�LٲeK�	�"��0`�g�N�~�����ߟ,Y�����������8y�$˗/g�ĉ�ʕ+�󬭭�NU��]�p�2eʤi�""�2���������D	"""�"��6mbѢE,Z���X�|����Xr�m�9�߿?_�5-[�`���|��dϞ=��yUt��!�C�T�f�h֬Yf�!"Đp��_��7oN�
����0a&L�ƍI��СC���ڴiÚ5kR�@""""""""""�>J���ѣ����ڵ�k׮M�B��R�
�۷�`�����PJ�����:ubɒ%t��''��]DDDDDDD�q�ܹ�!����fhk֬��DDDDDDDDD�ա��t��憛�[f�!"ruu��D^*VVV4oޜ�͛gv(��R�l�y��8}�4*T0{��ח���P�N�%""�1|_���5�>9�&�ŋ)]�t�ϋ/((�m۶q��>|H�ܹqtt�aÆT�^=��Ǐ35ל�6l�ѣG�\�2M�6��D2W�5�g�G�{��s�#�q�%}�eccC�…�S�ݻw�x��)n�E�����4�y9(�"��h4�糷���DDDDD�U����s�N�c>̜9sX�r%���t��GGG�V��	����ȋ`ڴi���?fΜ9�	�< ((��� \\\�߿?��֙gF8u�>>>|�����2l�0J�.MŊ3;4���v�0�?}�4�&MbժUd˖�.]�0d��ݻ�رcٶm���4hЀq�Ƒ'O��O�8�رc	��Ɔ�y�Z�S�Ç�8q"���\�v
[[[���3f9r�0�˒%���m�С,]��lٲ�����{�.���gݺu���P�@�	O�<aĈ�u��Q��޽{ə3':t`����Ν�X'n���X�>}ʸq�X�r%/^��Ɔ��X
.����zI��R����\�~6l��9s�\�r��!)�1����������C	"""""""�)v��i�<22�1c�о}{lmmh۶-�G���Ϗ�9sfd�"""b��H.H��Ȟ���߿�\�rѮ];j׮M�…	�ȑ#����w�^����EK����b���4nܘ"E�аaCf͚Ō3L&�ˋ��/�dŊ�s���ޞe˖w,�����_��ʊiӦ��?n�8V�Ze�w��}BCC��>���7�gTT���7�|_�t�ɓ's��A6n܈����9xzz�O�0��e�2o�<:@DD���3I����a˖-���Z�W����{����~�������1b�|���Ǐgƌ:4CvMHl\�q�}��.\0&�}����k<�ИWDDDDDDD�墄�t�-_E^>���x{{gv"""""I2���2˒%K�u��:u2�u�ܙ�˗�d���뗉щ������~�&�����	$O�<L�0�%J��ϟ���{�*U�0l�0iܸ1����q�Y�z5���4k��X֬Y3X�z���a��9z�(�ׯ�L�2,\���3g2v�X�x�
6o�L���Y�`�f�b�֭	�߾};K�,����رct�֍��/^�СC����D�ڵ���T�!!!��ݛ-[����EϞ=M�9x� G���ёo����c�ү_?�T�Bpp0���L�:�����k׮�&444Y}U�P����%K2i�$&M�į�����'���&;[�16l�@���y��1���\�|�ٳg'z/^ٳg�bŊ̜9�nݺºu��7��Ƽ""""""""/%\�#ooo\]]3;����[f� �)2;yIܹs�Y�f�{�n"##qpp�k׮�90M1L�ڼy3�oߦp��|�������#q_Ɗ+�Y�&E�5�)V�5j�`Ŋt�҅�y�f�e����nܸ��)V���}��ܾ}���bŊ��~6n�ȅx��
�f͚t��9ѝ�%zܻw��˗s��!=zD�ڵ�ի����g�	���bժU�۷���P
(@ݺui׮�����m�@�V�L�-�ʟ??-[�dٲelٲŘpa�sٲe,Z��}��ammM���qss�@�&���i������ǁ�w�
�v��t�Ё\�r%hg���,]�������y���ҥ��<}�???�����۷ɖ-���ԯ_�
��@�J�(X����p��8;;@˖-ɝ;��{$�﫯��bŊ|���̜9���(&N�Hٲe���O�5k���Kp����y��^�:U�Ta߾}lܸ1�$�gw���)S'''~��Gʕ+Dze�$A̝;�ʕ+0x�`ƎKdd$,�B�
|��g|��W<z��xޥK�,������sfϞM���2d�&M��ݻԬYc�>}�LTT���o���'NЦM�)B�"E��s	�w��e�ܹ�ܹ���H>���(��[����g�p��ԫW�~���+W�D�E`ٸ����t�ޝ�#Gh�}b۳gS�La���������2p�@
.l�gr�]�b3f���ѣdϞ��
2x�`���s�ӣ�����y��g�>|H�ҥ�ڵ+͚5#,,�-ZP�@���Mv`�|�2m۶�D��Y�Fc^���.DDD��jԨ��ٳ3;yI���ӳgO�^�j,6;�������Ӈ�'O�nܸ���ǏgΜ9&�O�۸q#���$8�����ٴi�ڵK�U����{����������			1ٵ!$$�[�nQ�re�+Ɗ+L&'ó�������p<<<,�3<<�ѣGs��-c�!q3����W_}Źs�e�o���ߟ3g�0j�(���O�L?ͩ^�:˖-�ԩS	�-^��;v���#	fʔ)�ɓ'�v㊈�`̘1&?_ݹs����s��1&N�� �eܸq<|����͛���5&�����v�Zc�'O�BHH����h�x6a:**��U�&��jժ;v��{�ҨQ#��G2�����u��C�`��_ݺuM�o��9s���߱c��U�V�:��qggg�ks�=aaa�eooo,��s��zbcc�U�vvv�cq'lmm�t�[�ne�֭�3�
�L�7[�=Lv�ذa���	�Ο?�ŋ��ݼy�+V��Ə�h?�W�g�z7<ǔ�1u�T֭[<Kv௿�bٲe�˗/���ݛ����]�jO�>eԨQ@��{z�J�nݸs��g�2v�Xbbbhٲ%;v��ˋ-[�иqcc���@c��Ƽ""""""""/%\����/^��ŋgv"""����ի/^��'��op�ر�(�٪�'O��R�J�9.]���ɓ9x� k׮�M�6�]-vϞ=���	�0��ٳG�ODDD��Q�F?~��;w�$\&�&�гgO�իG�,Y8s��ƍ�?�����c���k�����$�C4$�pic�h�Cъ�+f%ƪ�h�K��-�m�VQ�%B���jQ�HL�!R��RC�544"���w�7'�$�	���#�欽�^�}N{�u��Ϛ5k�p�eʔ��wߥ|��=z�3fX��͘�U�X�f
'N��^୷���ˋs����ٲe�Q���/��N�Y�.]���6��{�2z�h�W�Nbb"ӧO�…�]���]�fgV�W���ٳ������R�BN�8��_~ə3gX�r%]�v5;��Ã�����ʊ+X�b�v�2.~��'#���4�m�Ɯ9s������}��������۷O	�Xv�f���su~v�r:?===�k��g��:@n���܎�a�j׮
@���N�:��5jmڴ�@�<x�~��q��M\]]���!%%���dfϞ��-��oHJJ��ӓ�?�ooo<Hpp�E�ŋ[s��DGGd;/��*�LI(�+���۷og���ԩS�Ç3v�XΝ;�…4h�=_�\�r�?�ҥK3w�\���ٲe����a�?�|.]�DժU���)U��}��}����iӆ�ݻ�d�"""�&\��4�y��~�y��v������?y���{�΃�e��
���?~~~��ۗ��&�'�^+���(�����s��NDDDDD_����w��[�l`̘1ԨQ|||;v�Eߍ70y�d�������B�
�?����1́ʕ+gq�|��f}DDD�t�b��]{ݺu)V�;v� --
�۷oKɒ%��',X�ҥK�X�"���|��7̙3�S�!�v��
@���y���)X� U�V孷޲�{?c�ر��C�R�|y���x��<x0�����zP�`�{Q�{[[�ݯ_?jժE���6�L��[����ۛ�R�R%�ٵk��9o��&���8::��ww7-�������z�*���DEE�%��<y��f�6Sy2��nL._��_5���O�:EFF�ŏ�}�A0U���X7n�֭[f�MUL�V��?��_|�ԩS�����ٙ�۷�{�nʔ)��۷>|���LnF�M�jՌ��|`�w۶m�ٳ�bL��V����Weu��m����^�5j~~~888P�F
#!�4g������E�B��޽;W�^5���y�o߾��#G��兓�cƌ!..���bŊѩS'�=Jll,p�2ǁx�g���4�y���S��'[�n5�)�i���¨Q��:M��㉏�'<<���`�6mj����ڷo3f�`�ҥddd�����m����IN_�����d�������f�#��9s�����:~�x�c�v�.Z���1S��ݦEDD$g���4oޜ��_~��z��o�>�_�N�Ν����?���_�N�Jbb��5��|f���;�Y5
������y��y�b���oWWW.^��ŋqww���
^��3�Y����ʕ+����c�Y���J�*������U�<==�ߟy����@�^��5k�,]�����Ӻuk
*d�3U0]#3S��
��=z4���T�^�}��q�ڴi��9�۷'$$���@���KjԨ��K����O��Oh֬�7o~ �=��s:t�l�ڵk����S�hQ���;;�z�*���4o���; S5�
���A�.]�䤄����/����v�5k�4�r8::Z���ٳԨQì=�\	�ҥK6�Ç[��{�Ϋ��P�D���~��f�M�I���{�n�ϭ]\\�<�c�s�����Y��у�K�2o�<���������4h�HvќWDDDDDDD�񣄋��֭[s<� 1�[Rǘ1c�����͍��~��
R�X1~��wV�X��x����3g���mn��Ս77n�:u2��Сcǎeٲeٖ���WӦM��ol����܃��*��Ӷ�oe]T�@�����n;���iZ��ڸ"""O���oMU.�U�}��Y�j[�n�^�zDGGcgg��/�l�	'11�2e�P�N<==y�����=;�U�0-~��~Ƽ���+dT�R��/�s�Nڷo��9;w�4�g�5~ӂ\k�܋�|�ʼ3��������Q�{��a�����o,Y���k�ҭ[7Z�hav���zz�*U��;��/^�^�ze{ΨQ�X�r%���Ԯ]�옓��~����Z�j�={��X�*6Y��ٱv�Z�7on��A�"EHII��_�D�̟?���xƎ˙3g�E�&/���ز{o�V9gڴi>|OOO^z�%*V�H�j�̪e�~�UY�ݻ��$�{#�}Z{���:88��4����0���{bɒ%�ر#�-"!!���Ըqc�k�=XDDDDDDD����B����ۉ���dɒDDD���f���`Ȑ!8991k�,f͚�W_}e�hs6o�<.\�@׮]��nݺ�x�b�͛ǠA�l���G*T�B�
�CDDDS����8q�P�n]�ݴnf���>}�5k��stv\]]INN�ʕ+����3��]DDDr��͍5j�w�^�;F\\���f�L���㏍șw.�}��դ��ʔ)�ٳg9|��YU�cǎY�1�}�YΝ;�̙3y��gs��E�l۶���ڵk���e��ԩS�^��,���ѣT�V�x|��ʖ-���Y������đ#G�vl7]�n��ggg�5kF�f�8q�;w�dժU̟?�H�(^�8�.]�ڵk/^��k׮}��ƈ#������ը��JVŊ#66��'��wߑ�����M�4a�ĉt+���y��r=V������!!!�m۶Y�����ɓܾ}�B�
ѦM�U�ƿ��o.^�h$(P�bŊ1�|��yzz����޽{���3�,������Í��+����YM���Wev��--Z`V�^ƈ��7�ۄ;������=��M��?��K�.����?NժUs�۳gO�/_�ҥK�����Ύ�
�5�y�<�-�䡹t����4oޜ
УG6l؀�����pg��/�����4h@�6m3�z� IDAT�5k���F���X�F^lڴ��ҴiS�ׯ�?��>�����6Fvdz���ݻ��͛3p�<�7��5k�;tfN����_��ߦG�f�׮]��O?�u��ƽ���Z삓�9~�8�
�Q�F����L�2�7n}����5�,YB�:u��L�2����d��K1���8oʔ)$$$������2e�E�f͚w*9r�۷os��e���|}}��s�];Ϝ9c�U�T	�ӧO[\��f�#"""y���Ozz:cƌ�֭[���[��~nݺ�ɓ'�>}�ў�]�5j�Y�}��!n߾����	����i�����1S2�_|�ɓ'IOO���.�K�.L�0��[�R%�4i�͛7	������ܾ}�K�.�f�>��Cn޼I�F��v�7���9v��o������d^Lk-ά�ԩc<?G����=z�9s�X��C��K�.lذ��7oR�\9ʗ/��oj;w��5Lm�>b['N��ĉ�>���ŋ3g�~��7bcc�Z����:XT
(Q��}��N��֭[\�|���""##�j����	4kstt��X;v�����Ӈ��Tv��i6ֳ�>K���Y�j�O��ȑ#�;�R�JQ�J����q�U�V�lٲ�&���L�<��{����Ư��ʤI���رc���Ƙ&W�^�ϋ�2���_�EBB�ǎ�lٲ�l��Ƙ4i�1'ܷo�'O����M^���1��=��O>!99��7o2m�4|}}-*&=�쳴mۖ���W�����'�yEDDDDDDD?�p���������l'�#G�0z�h�����8�C�m�ϟ'<<���f̘�J�|��W̝;׬-99�%K�p��U&N�����,44�k׮�y���_|e��3���o��]�~�7�|�lס��d-Z��ݻ	�����g���n57o���o�5������III1����Ϗݻw�a��r�"""r'�5..���I������TED�{��㏜:u�>}��طO�>�������[$�.\�aÆ�K�(��A�pwwg͚54lؐ�[�����������K7n�`nLDD�)���Cɒ%��?(S�����u�m�6f̘��3,�?y�YŊ�iӆ�;wr��)Əo�7l��b�n�tqq�ʕ+:�g�}��3gҮ];����ѣGy�����+T��{�6k0`�n�bǎ̟?��.�u���vAn�b�,>��X�"������Z�Y�mۖ]�vq��y��pgw��xs�]�v���1g�#q�$��>>>���Yݩ����%|��R�ƍqss�…xzz�U�;�֭[Gpp0����9r��.Y��уM�6��o�ѿ��e˖�s;��yQ^�U�e�	���S�N���h��1J�,i1'�Z�*����}]�n��?���x�
6n�H||<���?̎���[�{��Ųe����""""""""�U���"##9{�,����c���¬VgX�p!��z��,Z��]�vE�Z�ؽ{�Q=..�8'..�챉��B֟�/^��Q����!66���������dU�Bbbb�����7��˗���v_�`����-[�x�Ν���Ǐ'""��\�r�X���������-[��_����T�bq=S�����HNRSSY�d���x����K~��[��_���5k2i�$�jc"�d�n.�0)R���0(^�8���ۘ�9::}���	'00www���qqq�iӦDDD���9b�ʖ-����Q��e˖899Y�[FGG���lT�KQQQDEEe{��Ύ�_~�W^y��Y��7��Ϗ…�����?�{�G�Νr=�rpp`„	�����₃�~~~0��on�|�7pss��Ύ[�n����G}D�֭y��g�����ٙ:u�0i�$�J
6��� j׮MѢE������___���1b���7��������`ooOɒ%	��?4[�l-ά�y�&M�ī��Jɒ%����dɒ�jՊI�&��윫�9�W^y���~����o888����'�ڵc��F��
R�pa~���k���/899�j�H~bggG�v�;�9����9�)���#ժUcʔ)��K��jGGG����ԩ%J���ё-ZX�H+�cZ��e^�S��ʕ�k׮,^�آjϽ�J�F�(X� nnn��Ջٳg��0���?��]]]�7o���-Z�T��ԩSiժ�E�g�y��I�&f�4�y�ȰV�W�@�DFF%��>6�ng������֭ǎc�̙ԫW�8˻�k����W������{��Yڵk����Q��C�:w�-k���>�ѣG9v�{��!11�
�g��c��q�X��[�h���F��ܷ�����DGGS�H��5�Ν;s��If͚e�#�Ν;2d�˗g���t?.4>�r�
/��2vvv�޽;��jՊ.�~�z\]]�ƹ|�2-[��t��|�����G��c/�It��XD�I�q�F�����P���Cz�_�NѢE�;�<I��ӱ����ڣG`�S���/�-�{���{R�Ǐ����ӦM<<<�����ٳ�;w.+W�4�擒�h׮�_�~l,��Yn?���ر#iii|��gƎܦ��hu�� �d���ҥKY�b_~����Ӆx�w�ҥ�*(?�*V���'�ڳ��6�����>���|���_b]tt4Æ
�\�rV�;ҜWD�Qy��u�=S	�_|Ѭ=kyY�3g�`�Z�2๑�K/]�İa�8|��ű��8(�ndy�o777Ξ=���]T������i�{XRR5k�4�kz]Ν;��������)�wL��?�0�ffj3����ٳ>�e˖Ѷm[6l�@�r�l�#1w�\�+W�P�X1F�`��ٱe��5k���/7nd�̙���ѿ�t钧�S���4iBJJ
�F����gggN�>�ԩS�y��ݻ7��=���w[���ӣG�:�����Өm۶l۶��k�՗׮]˳�>�?��G'K�Dy�RRR�q������ٳ��~�󊈈�����<^�p�ݭ�5Y��A��'��ׯ�6�\�6m���ӓ�^z��+R�Z5c������0��T.ٚ�e��r�5j���ٳ���f�p�믿��oP�Z5�Νk�mMN�����e歽�֘����Y3��Z""��u���9'N�t�Ҭ]��֭[�:�G�֭[���ҵkW�.]JLL�Z��uXTӦMi߾=���			DGGF���6l={�d��T�Z�֡��C�ۊ�yG�V�X�|9!!!����/Q�����c)R����3t�Pc���ի�>}:�~�c����<�
.���2e
mڴ`˖-|�*T��щ�<��4ib����m��f�9����������E	����''N��ԭ[�h?p�E_wwwN�>͚5kpww��ܹ���pJ�(@bb�q<--���W�,�J�G^��^cݺuDFFҪU+J�,iv<==�ٳg���A�֭�dN�:����W������F�~r��Օ��d�\�����ٱ+W�}DDDL~��g�ɓ'	

���,^��s��1u�T8@tt��pw�b�U�FXX��y��\�p�����˜>}:�5b��t��I_�H�����?��ɓ'IMM�t��4hЀ~�����Ǭ]�6�
�O>`��V+>����Ƚ�Z�*]�ve޼yt��MI�""���͍+W����˘1cr��Ms^�LJ.�-Zp��	�L��G}D�ʕ9|�0S�L��۬Y3"""3fAAA������c�…|��7���2{�l�Μ9����}Ÿc�^y��8q��~��U��kJ�(���ʕ+�ر#�ϟ��-5'y��
����޽{�ӧC��A�.\��G���_�s�N6lH�N��1�6mJDD�'O棏>�jժ:t�x7n���'+k�U�J�HNN������O�6�����?��#G�h�"^{�5V�Z���?o�����M�F׮]���q��lݺ��a=�?�<C�a���t�ޝ�ŋ���FPP#G�䧟~",,��}�2t�P�v��;�C�ʕm��<9UN�_vvv��ư�c����Xe��֭[?U0E��<��dݺuy�9����������A	�X�����9u�}��ɱo�>}��矉���G�f�
.̰aÌǦ��:���Κ5k�[ӦMY�n���[?r�~~~��Ί+�������ru�I^� $$���~�'N0z�h��5k֌�>��
m�{�f��͜9s��}������2k�����kհaC�n�JBB��N7			�y���<}��Ҙ9s&~�!ŊcŊ�k���a��ڵk9t��/�I�&DDD���������{�ƍǂ�裏���O��
ТEZ�hArr2�۷g֬Yxzz2j�(F,"""""""""""""""""�?��:��]\\\���)R���0(^�8���ۨ$���h�uvv&<<���@��ݱ�����Ũΐ��#([�,�������S�#G���ߟ"E����H�j՘2e
���`�ҥ��ΰa��ԩŊ���???ƍ��8�r�%K�d��:�jժ����3�<��/�̬Y��׿�E�…��)Z�(��ͣK�.���aoo���ݺu#""�v?YY{�Z�l����������qvv�E��<���<�bbb�%((���s�ȑ�:�`�ԩ�jՊ��������Tv��e����ŋ3~�xfΜ���ǭ�9}�4����J�Ɇ*\�s%K��� q��yJ�*e��������>|x������ߢ=/個-��ɓ�3%]X�f��E�aԨQ��v^f��o�B�
ѳgOz�왫�Ŋ#((�������dm��Z=��32w�\���([�,III�߿�<��u��H�.^�HPP����W^!**
ooo[�es111��İu�V���ˋr�ʱm�6�5kf���0s�L���X�b�ٱ�ǏӦM^y����KE("""""""""""""""""��)�"kҤ	)))�5
���9}�4S�N��_�q�b+�{���'22�H�����ݝ=z�8:y������=z4���,]��Ν;�:�|c�ԩ4hЀ&M������KV�E=)
,ȧ�~J�V����iڴ)p'1��^�|��,^�{{{�*"V-[���!���H>�n�:U��nݺu�j���a�Y�l�S_�UDDDDDDDDD�%\�c�Z�b��億�bv�D�f�$��R�HƏ�СC�J�W�f���.\��щ�ȣ�{�n
D||<����8;;�:�|��_e�ڵ|��w�7n�СC�u�6���{��hٲ%Ç'..��7oҦM�N��|@hh��.D�.]��:ɧ���x�wl���Cw��-͍DDDDDDDDD$_P�E>���?��'O�$55�ҥKӠA��뇛���C�]�6�
�O>`�����8*y._���ѣ�3gM�4a���T�Z��a�;ӦM�J�*X3U����A�6�����O�U����Y����Dbccٻw/o��G�aɒ%�(Q�֡�H``����|��>��>�u""]dd$����CDDDDDDDDDP�E�fgg�7�#��!"�tIOO'<<�>�,X@`` 
�uh�Ι3gX�x1aaaV�oooJ�.Ͷm۞脋jժ��[o��[o���?o��mۖ���z�j*U�d�hEd���L�>��a��S��wߥQ�F�CDDD�0}�t�o�n�0DD�!�|TDDDDDDJ�y�۷�A����0aŊ�uX�Vhh(�n�b�…lݺ��e�R�L�֯_���h��}[��PM�0��������g�����g�ڷoO���Y�d	-[��a�"r���-[F�Νm��<%�-[F�v�l���`ݺu�h���a��SfݺuV+�>*�v���HD�	���������<N�p!"""�����c�ر̞=����G͚5mV�W�fM>��Ν;Grr2������\�xѢozz:vvv6���x��g9z�(/��ű2eʰe����O�֭�׿�Űa�l��de�D�)�Ji"�_ZZ���y�����u""�h>*""""""�%\�����C,X���� 222�3g�{�֗���oXmOMM%99���$�׮]{⫅XK�0)\�0,�z��9�_��Y�f���#�����[[� """""""""""��S��CԽ{wV�\i�0D$�-[F``��� >>���ˀ�<y2ŋ�uXOGGG������u(�NPPժU#00��~��o��777[�%"""""""""""""""""b3J�xH:w�l�D$:w�L�z�l��<�^�ʇ~Ȍ3���a���Ԯ]��a�S�u���ر����֭˪U��Y�����|������8Gr�o��F�J�����b�Νԯ_�.]�<��DDDDD�1�u��̛r���i�ys��=_|��Q�)EDDDDDDD$+%\<$QQQ�ADDD#�-bĈ���2s�L��뇝����zbL�0�����ɓ'�:�|�jժ�ڵ�Ν;ӨQ#�ϟO�l�����'[�n���f߾}̘1��K�����믿���7�jղA�""""""w��G-�)EDDDDDDD�%\<$
�u"�G���DFF�:y�:t�!C��u�V���˔)S(U����z�l۶��+�:�dž��+�ׯg�Сt�ԉ�'2f���+��O�n�j��ƍ�7�N�:���@�;v,˖-�H�"�2Ly<��Pvs�{���nʣ�'�)EDDDDDDD$;J�x�ڵkG``����\�޽��C�����裏���ϩV�111ԯ_��a=��?������x�8880k�,����3t�P�7o��\�|}}�'s!��7o.\�k׮F[�n�X�x1���cРA6�NDDDDDD�3�)EDDDDDDD$;J�x�:w�L�Νm����ʕ+m��<E�/_���ùv��~�)o��6�����u��MΞ=�/�`�PKo��6�+W�s��4nܘ�+W��s��:,yIJ&y���Ɔ
8�<T�X��m�Ү];��HIIa�ܹlܸ��/R�T)^{�5��뇣��YYc�v�K�,�N�:���}ʔ)���/K�,�gϞ-Z��<A"""""�ȝ9s��;���Ɋ+,��mۖs�αb�
<==ٴi˖-�ȑ#ܼy�R�JѴiS
�����1�%�_�|��3g�u�VnܸA���=z����6fvs���^�3����3q�DZ�je���㏌;�W^y���~��wf͚ELLׯ_�|������켬��$�^�֮w��5���ؼy3�/_�T�R4oޜ������lq�%K

%>>�B�
��+���{��hN)""""""""9Q…����#r��1��ƍ�ٳ'ӦM�t�Ҷ�w��	���y���m�c�Y�f�ڵ����֭ˊ+T�E�)7c�,X`<�u������F��KMMe�:t��{��y���IHH`ƌ���e���III����☟��w�fÆ
t����]DDDDD�///|}}ٳg���ԨQ�8ORR�����ӓ�����s皝���̒%K�z�*'N�՘׮]�o߾$%%m?��#���E��~�H95j���cڴi���P�L���			����H��?�ݻ7�.]2�=~�8���ܾ}�6m���&��/fu��u�|�M����d-Z��ݻ	�H�0`W�\�l���ߒ��Θ1c�)EDDDDDDD$g��I�<�~��l�m۶��Ç���O���iѢÇg���el___�|򋨨(����É���u8""��q��ƍ�z��?��[�2�|%[<"'N�P��}�X�";v��LJf͚��7��:$�!��_~�%;v�`۶m�5
��K���…9t�իWgѢE�ڵ���(jժ��ݻY�z5`��i\\��8&&�*U�X�jj3��'�i���.7� IDAT�o־n�::u���ŋ�;�111�����_����������d����ر���0�;f�77cf7���)+�wn�~L�-ʄ	���?	&==�?��?�������������t�U�VeŊl۶�������,;��/f�`�)[�,����ر��s������lj���8�\�r�X���������-[��S��������HNT��)�����[�Z��믿fӦMf��ٶm۶m�E�L�0�Kg7v~�o�>f̘�ҥK�����_��ۛZ�j�:4y̬^���C�r��eBBBx�w(XP�=JG��lٲ;�I޹���j�*F�M�^����_�<y�=�("��]�z�G9�rrr��DFF���HӦM�ԩ���)��6n���ɓ����B�
�?�v�ڱn�:ڵk�m<��r��Y+_��Yyr4mڔ�%K�q�FF����iiilܸ777�4i��l,##�Ç��?p��1���ܩ��[?��3�G��Z�j����0t�P���3�Α�N�:ɛo����֭u��5��6b9r$^^^�3ƨ
q�r;_�ʔ(1f���I͚5=z4C�a���4�유� ��w�Nxx8W�^5�kN)""""""""9�j���֭[��O�4�M�6���L�~�h޼9�K��ʕ+�ܹ�ٳg�q�Fr]Z97c���.�:u����:0v�X�-[F�"El���<:t(k׮�k׮����_�G�ĉ�n����3u�T�W�N������_Y�hE��uh"����{L�0��;w�s�N���+���K`` ��s�3g�`u��Ǐ���`����f�#"""""�k��qqq,X��m�2o�<���i޼9���\�r����coo��K�6l���NFFF��8{�,������_��{?c��)/߹
<�]�vq��A*T��;�cv�ܹsT�T)��̋���JJJ�$Ydfz
LqgV�bE�wS���t�MsJɉ�����e|me����[�"""�ѣ���S�dIZ�jEDD%K�dݺu����:�f޼y\�p��]�mݺu�…̛7φ�������͛L�8��ի���ȦM�X�x��-l��?������x���ٓ͛7G�
8qℭCyb��ř�ܭ�Q��~ 88��5kr��Mf͚E�V����o���n���k��V�1��������ȓ�}����ٱv�Z֭[����Y�iӦq��a<==�ѣ~�!QQQy�4w�:��V�~Ƽ�9҃p�s�����jq<����ʜ@������ҜRDDDDDDDDr�
�ܥK��>}:۷o�ƍT�X�^�z1z�h�|�����Ν�ƍ�x�"�J���^�_�~8::�;�~���cժU����(��Uɒ%�ѣӧO��3v�1]'&&���6n܈��#�5��wߥT�R9���w�k׮��͛�|�2�J��y�����ggg��,Y����P���)T����
��Q�"==���06l����qpp�bŊ�m����k׮�d��ԩ�����^�L|}}Y�d	={���""b�?����Krr2�Ǐ��3�,���ꊫ����x"5hЀ={�жm[�իDze�h֬����G��Ņ��8t��6mb������ұc�<�sww���ӬY�枒]]]INN�ʕ+�W�\1��������)�$s�ׯOLL			l۶��^z��{��;wN�%�;jM��Ҭ&Md���Ibb"{������hOHH��{?c��)7fΜ���ǩZ�*�bƌ>�8^�ti��}r�@�ddd����eW�#����<<<8u����^�zF����4��N.�?���~���n�:�^�ʭ[�8r䈑l�Yjj*d����;w�[�nq��y���y�r���4i�$�~�5`߾}ǦN�ʚ5k�y�&W�^eݺu��ۗ�W���;���,^�������4���Y�h���#%%���{�nn޼ɕ+W���o	

5�Ϙ1�9s�p��nݺEJJ
��?&22��~�zRRR�>$7���#%%�
6��~DD��w��:v�H�V��U��"((H��Tx�爎���_�e˖̞=��!��#жm[|}}Y�|9)))���x{{�;�涟)Yk̘19r�۷os��e���|}}8p��״��3g��J�*p��i�XMm�>"""""���ر#�oߦO�>���ҩS'��v��Ajj*G�a�رF{n��z��W�<y2{��%--�_��I�&e{��ƴ6����^�ٳ�E�Q�V-������a����ٳ��ӰaC>������y�&ӦM��ח���g{mSr�ʕ+�q�������X���|1��M�w^���x��҈��gʔ)4n�8oO�S��������HΔp��EFFr��Y<<<gǎ������c�p�B:D���Y�h�v�"**�Z�j�{�nV�^
��g<�x�"p�]_�{�9.\�`ql���L�>�;v����Νc�…9��ՂHLL�lٲ�}ϝ;�?NDD��9�ʕcŊ���зo_�l�b_�b_~�%;v�`۶m�5
��K��bbb�R����6S���TBBB�Z�*d���,[�OOO[�&�H999�d�ƍǠA�<x0iii�KD�޽{B�&MhРcƌ���'����C��剏��G�ԫW��-[��7�P�pa�
f�5-��Сmڴ�o!��]eMm���FDDDDD�76�?���nݺf�M�􃃃���G�=z�8~�ȑ\�ӣG*U�Drr2����~����ݛʕ+[�����8y�#e����ܩ�>~�x����8q"4��\�v
�7�xWWW����?�A�F����୷��92��N�ƍ�ҥŋ�����󼼼HJJ�o߾ԯ_��}�r��9�����	�BsJɉ.1klf�nJ3f5j�����oL6n�������{{{*T�����X�n]�q���ܵ\rFF��?35j~~~888P�F
�C�̉�a�k֬iT�ؼy��9AAAxyyQ�P!�w���F����Ib�����/�:u"..�HF��߀;	Y�/_ެ���<�6m�D͚5�8q"�F�"!![�%b3
`ܸq,_�����ӲeK���[�%�D�)��Q�С���T�\GGG�X�"}��a„	y����Lxx8������coo���M�6%""�l'�#FP�lY��퍹l˖-qrr"::�"���h���iѢ�C|FDDDDDĖ���h׮pgb�a2r�H���)R����T�V�)S�п�|s��8::F�N�(Q�����h��N�^ƴ6���)�BBB����	

�������p�Q���Օy�����OѢEqpp�J�*L�:�V�Ze{�aÆѩS'�+���#~~~�7΢_n�Y-Z�y��ѥK��ܰ����͍nݺ���K���)EDDDDDDD$'2����<+P����Z}l�9�"'qqq������Jll,���Ʊ�7oҨQ#���y寿��z...F��)��tڴi���Y�b^^^�^'11�.]�P�lYV�Zev�m۶�
��
6���;vd;v�6�}���P�P!��9::kv�;���ԩS��6l`„	�sT�pa���K`` �6ƨ_�>iii�9�IJ1%���G��D���H��EDLΝ;����Y�t)|��FR��ܱ�~ڶm����W��jժ�I$_Z�hݻw7ڳ>���={6s��e�ʕ�-[���$ڵkǀ�ׯ��#�r�y�����ä��%?МR���|TDDDDDD'�p�v"ͺ#iv�`YM"�<�du��������ݺsb:n�Y�����]���1%[�����ߟ~����`j֬�͛7�5k�Z���o��8�Z̦6k��'_ZZ���T�T�={��f�V�Z�d+jժŞ={(S�
4�￷uH"��ݻ7eʔ1[����;=z�ad""""""��iN)""""""""�)x�.b+����8q�P�n]����}���9}�4k֬���=�cu�ؑu��1o�<7n���?o���ѣ,X��(˜Y||�Y�}���-O�xxxp��)���O�z����������*p��!6m����	

�cǎ�������\�rWWW��\�b����֭[2dǏ'((�Q�FQ�H[�%������i�&
D۶m			aĈ�K䉖ۊ�y�uS���H�"�?��C�ҳgOV�^�����*�������d�9���������dG.�-Z0e�HKK��L�2Ţo�f�3fG����\�|�/��___h�5Uh8s��V�fMZ�nMJJ
���cѢE���拉�����…y뭷�q����*�jղ�aҤIF����c����l�2DZ�jڴ)�'O&>>���4���nܸ�ݟ�,ڶm���/˗/'%%�^xooo��:F�J�8}���5Lm�>""��;�<={��Y�fxzzr��A&L��d��H�ʕ����m�0�Z�
b�ܹ��_�bԨQ��ݛ�����a���v��4�O>��O>�������c�DDDDDD�1�9���������X�
�X�����9u�}��ɱo�>}��矉���(k[�pa�
f<.Q���:t��ݝ5k�w�5���/~��'BCC	

��Y�f�7�j%K����jժ����w;�޽{�y�fΜ9C߾}͎yyyY��F�޽�<y2!!!�����AiÆ
ٺu+			�&$$���!""����4f͚Ň~���˗/�C��K�(55�cǎQ�D	[���6lU�T�k׮;v�+VP�L[�%��y\*Q<l����:yiN)""""""""Y�…����e�(�H�"���@���)X� ���L�8GGG����3������=...4mڔ����#F��lٲ��ۓ��j�;::Bhh(�7�x�����Q�D	�4iBhh(��׿(T���xCCCiԨ��͍^�z1{�l�8�;��E�2o�<�t邛�������ѭ[7"""pqq���u�Ё��`*W����#���T�X�>}�0a��_˖-qrr"::�����8;;�GDD��K�:u9r$�СCJ�xL?~���t^x�[�"�����Ν;�t�u��a�޽�IDDDDDDDDDDDDDDDDD$G�p�ϕ,Y���`�����P�T)�v�����s����?����oҤ	M�4�s�Ŋ���?����N�+FPPAAA9^/�dk��x�g�y���@�ΝKRRe˖ ))����3`����r����<�.]�DPP4oޜP�re[�%��ĉT�X�Ƒ�I�ʕٵk���:�7&""�Ν;�:,�T�"kҤ	���,_���W�����ɓ'��/����#|2��ݛ2e�i�EFF���N�=l���<���̞=ooo֯_��ŋ�駟�l�8v����{���?~�H,�m�L�e9��B�r��o�qJ��T�Ü����f��u`
�%��ƈ��*�ff���ϐ��K�
yE����\z=_���y�߻Ԟo���ikk+kkk����ʕ�ƍ5p�@���SӦMSff�ѱ V�(�:t蠵k����W�����+WN�6(ٳ�dɒ�6m�F��w�}W��/��BVVV�<N{�쑗����߯�Çk���ܜ�IIIau�B�X�bZ�`��֭+ooo%''kٲez�猎
fffFGC���*44��@�Ea6n�8�����ׯ�����t����rrr��U�B�#>��x�
yyyi�ܹ�$ooo5j���T���…�4i����K9;;k߾}�[��ѱ𘥤��������A��F��֭�����~�z���0������Œ���iڴ���>|��t�bt@c>
xZPpQ�������CFG�����#����Off�5a�+VL����ݻ7OF����jժ��1�...���W�Νոqc}��7j֬�ѱ��P4�۷O���ڳg��
�3f�lٲF�B:x���Ӎ��<����?�ڵK�{�V�֭�x�b�����X��s�Nyzz@�'@���_(44����|��<���o���hѢEjܸ����հaC�c�	033S�%���<���Vxx��L�����+99Y�gϖ����р'.33���Vz�����BBB��( �GO
.�3)33S+V�иq㔑��ŋ���|�b����OT�N
0@ЪU����
@D�EZ�f��/nty�f�u�������dy{{k�Ν4h�fΜ����@yxx���^]�t����"##eooot,E(""BF���HMMմiӴ`�5l�Pqqqrpp0:��иqc�ٳ�Tt�z�j�i���X�#G��F���Sll�$���Q=z�x��AY�%&$$亝�c��~s����w��-�cĹ��sV��������it���k�jԨQ�r���4h� ����#���Utt����~[�}����}�cxLF���۷�z�̾}����իW+33S={�T���ՠA�@�����sV������SL�������nt�����>�@�6m�{ァ9s�襗^2:�����J+V�Pݺu5b�%%%���Oŋ7:�G�}��\ۯ^��)S����M666�$WWW}��GZ�f�J�,�$c(žDĽ�F�Y,�(l�Ĝ����d͚5Z�f��1�њ5kgt�p��5M�>]����N�:��۷+88�b��͛:{���1����i�ĉ
Whh�ڴi������X�a���`t��s�ΩW�^�6www�;wNAAA&u�Y�V�(@!!!���0:�<���4:�|ؼy����u��YM�>]�F�R�b�o
nKIIQ͚5�o�>5h��8x�:w�]�v�s��jҤ�"##U�n]�cE­[��t�Rm޼YgΜQ���U�Z5u��Y]�t��7--M���ҟ��_|Qo���(KKKI�V0��sBB�._��U�V�q�ƪP���OŊ���U�V��w�U�ҥ��U(�N�<�nݺ�r��
ϱ�s���?�ʕ+k˖-Z�f�>�k׮��_T˖-���R�J�:Ɲ�,�ϟ׿��/m߾]W�^U�֭5iҤ\�И��Iy�[=�ɓ'kӦM�1c�:t�`j����G�M�6�$��?�����bbb����*U����v��r{�rk��<3��]�|YK�.�֭[u��y���jݺ�,kk�ǮZ�J���Wbb�J�(�6m�h�ȑ��(�9+@�ĝ��q��i�5Jk֬�����nݪʕ+�̱c�$IU�V58	
B�z��nݺ�Y�fZ�b�:u�dt,�����˗��oܸ���$%%%�ʕ+����t
:T4�=s����,???���{��M�6)--M͚5˱�Y�f�����͛խ[��xu�FvvvrppО={�����_ݴ/11Q�O�VӦMU�re-Z�Hَ?{��V�Z�K�.iƌy�����߿�N�>mj��t�ʕ}e�G�[�τ	�o�>}��jԨ�*V���g����W*T0�\�pA}��ɶ�hJJ�|||t��Mu����ϒ�y��RSS5`�?~��v��Y���*>>^���9
h���/J��r�u�t��-M�<9_Y��M�M������>�L5k�Կ��o}��Z�n���/����+�L�2FGAy����?���]]�v����233��<Ӳ��p�B�޽[��њ0a�$i��զ~+V���U�n]���*..NaaajР����))��IL�111��Z�j�ȐՖ��nl��ﲵoܸQ����&IZ�r����111ڵk��,Y"I��<V IDATڱcG����u��iU�\Y˖-��ݻ�t�R�@1�57����n�|e)]���O��+W����G�n��ԩSu��M�6��ڲe���_�v��
Wtt��v�*I
��{v/y�g�m���:~��*U����@�޽[���UJJ����s�ꫯ*<<\111�߿�$駟~�w�E+\QG�Q�5r����Z�b�bccu��Y/^\���Z�h�^�zq��~��'EFF�JMMU͚5պuku�ܹ�-|��[����+IrttT�=�d4x���yyy����?~�&N�hZ���ѣGU�Z5�c��/^\K�,Q�:u4z�h%%%)  @VVVFG�;o��_��7�<n�J�Rjj�BBBt��q�l�Rnnn����DEEI�fΜ)[[[I�W�6m��t颍7�K�.��ȑ#�n�s�*U�d�-[�T����1cƨx�����PTT�*T� IRtt�233u��!}���:v���#�	y�m�6IҤI�T�NIR�F�4q�D�1"[�G�Q�VҸqcyxx($$DPRR����դIS��;wJ�Ǝ+;;;I��ɓM�B<���3�U(1y�dӪ&���פI���k�֭����v̸q�L�����@]�t)�Y��M\A�G����s܌s��Q
4(۲����:r䈎9�
6(  @*Txґ���4M�0A�v��֞�����D���G-[�4&�]�yKҾ}����իW+33S={�T���ՠA�@v���Ə��� ���[Z�f��W�nt,<�?.{{{�c�	>|�jժ��={���E�<>#G��������X-Z�H������G�B��'OJ�:u��yRRR�;΅$)�"����>���
�T�X1u��YAAAڱc�Z�n�]�v��ŋ<x�,,,$��qԨQ:t�P���g��S�NI��F�,
6��Q�|عU~
񽽽���$U�ZU|�A����$��^�*��̻�>}Z��"�;e}Y��t��Y�.w�֭|ga�
P4�O���sm�7o��\���M�*44T���ڹs����KլYSgΜ����N[�L�<Y�v�R�
4u�Tm޼Yqqq���T߾}�������+))�訒�y_�zUS�L����llldkk+WWW}��G�z��N	�s��-�ߞ�^+W�TTT�ȳ�G���^3:���m�*..N�/_V�&M
�)�����^ڵk��^>>>�_���]�&u��A�֭3�{�MCz�����$��<��YmY}@��v�*sss}����7���<�
�~��:�ʕ+�w�ޚ:u�����=V֜��O�b9�q�(c>���qxԹםא���c^�yug�݊/n�9���k�Espp��<FHLL�$}��'�^���+&+++5l�P3gΔ�僋��;wjǎ*_�����ձcG�/_^����￯�C���͛�7:�}�ܹs�ի�����]�ΝSPP���e�������Իwo>|X={�4:�"7n��ɓ')�(�����z�����E+W�4:��)S��:u꤀�-_�\}��ѥK�4�|SI҆
r�$$$(>>��c������/�ؗՖ�@ё�"�������dEGG�E��Vl����$j�ȑ�رc��gdd�)G�ʕ%I{���֞������s���׿����ծ][Ǐ��е�_~Y҃W*�[V���+WLm�:G^�w�Z�t����ڳ��޻��K�E��_�%�n�ZNNN�ݻ�6oޜk�FZZ�.\�N�:���I;v�������y���(_��i̻���)!!A[�n���k�����S��M�6rttT�^��q����_^�U��4�ŋ���UNNNrqqQ�~��P�6l� Iz��w�}Q��={jذa�ݻw��˗/k޼yz�w������?~���}��NII���������[oi֬Y�*�y_�|Y�V�R�ƍ�]GŊ���U�V���˹^�K�.i�ȑjܸ�$iϞ=����M˻y���Z�j��RD=����o5l�0yzzj���}�!���ܹ��v�Z���������'��j�J��>��7o��Z�`�4t�PS߬�pN�<ij�Q��$��~ˑ!�-�d�֭�n޼��}�*==]nnn��۽{����u��a}��G��K�.�i������$i�̙ڻw�222t�}��'�<�Ac�67����a�ٳG���jР�ըQ#�\�R{��1�i޼�$i�ܹ:{���]��O?�T�ڵ�=�]�\9IRDD��^���Ǐ���7G���3�ֲeKI�?���Dedd(11Q�f͒$���{3�9+@єs}[W�\��u��)S��Ç5iҤ}���5t�P<x��v��*99Y~~~�.o{���O>��յkW9;;�nݺ��R3/.\��>}�d+�HII����n޼iz�O^���Z����|�rS�7n())IIII�r�<==��/))I��d��s�=�dkKMMՀt��qS�ٳg���x�T�Ryy;s2d��9׮]Ӻu�t��-M�<���lڴIiiij֬Y�}͚5S||�6oެnݺ=T&ȏիWkԨQJOO�����Y���������Fǀ�,,,4o�<թSG^^^:p�V�X!kkk��O�>}�h�̙��q�L�F�L?���W۶mSbbb�"t+++�5ʴ]�\9]�pA������ц
Լysm߾]�����+�s��gۛo��
*�ܹs�\���4i�m˖-�q�F������'����L�ֻwomٲEG���M��۷�q~^��mn���՝r{�םt��eM�6M�J�Ҍ3T�X1M�6M���:u�V�^�ҥK�_�~���Rbb���d;ϠA��9F˖-��?�\���$���u���q[�n�ɓ'տ�l����r��E^�0g(����		ѩS�dkk���@�޽[K�.�ue�+V���[��BCC���05h�@��񊌌��lK,߽�r׮]5s�L�)SF˖-ӠA�ԢE
6Laaa9V�ȫe˖鯿�R�ڵ���hӓo��/��*I��ᒤ�j��݊��ք	$ݾ�7��Ο?/I�T�R�ރ�˗���T�������RRR������W_Uxx�bbbL_"���O��y���H�jժ��|YmY}��=zTm۶�����~�m>|X�
���cѿmٲE�w�V�f�t��	�#���s�'���U>>>�Y��,--eii�jժ�o߾�>}���������!YXX�L�2jٲ�����=�s̘1�T��,,,L���۫T�RڱcG�;v쐵��ڶm[��bnn�.]�H�=�Z5"�رcծ];�,YR����S��f͚e*���߂����RK�.����ʕ+'KKK�m�6ׇ`�u���F��[嗯����hܸq����t�!&�ƍӹs�L/���Ԯ];�.]ZŋW�Z�4{�lu����5j����������R͚5Ӕ)Sr���<�n�K�VPP�z��
*���B*T�������j��fa�
P4�efff�Y`ff���yxx亝�AO�ɒ�� www;vL��׿ԴiSӾ]�vi���~�L}###M_�JҩS�ԥK5j�HK�.͖�~7�:tHqqqڻw���ۧ�W��J�*Z�h�^z����nݺ��~SPP��իw�1��/?�ڡC�;wN���rrrR˖-s-��k�f͚)==];v�Pɒ%��nݻwׯ��*�lOU����￯*U�h�ڵ��fm�X�B5k֔$]�xQo��������e]�M���/d��j߾�^~�e}��wy�Ƨ]�*&!!!�nx|�^�*___͞=[5jԐ���}W�Gq��Iu��Y�O�ֺu�x� 
���Pyzz*kZ~�vQ�x�b(""�4/;}���t�!C�h�'�y�>� �<�&�Y�ǃ�(�i�#�����6l��=�etO�<)I�ԩ�L��������k�Z�j�o߾��/�e�
<X'N�М9s�}��$=�i;y헟k9r�J�(���X}��g�ٳ�u�ڵl��k���EΜ9s�|���JMM��v��iIR�����g}�Y�0�U�f�9�=�nݺ�1.\�t�)@w�j����ƍU�^=͟?_�f�ҿ��o�-(;;;�ܹS...jӦ����K�#x�>}��bŊ�n�
		����z��m`2@Qǜ��)ft���A���޽rn}�vw���|�M]�zU7n4d���T�>}�t�R����:vV�����77y헟km׮��m�6�_�^?�������b�
y{{�[�n����ԩSڵk��V���P�~�T�N����Y�W�5K���M?�67�Ys�Ֆ�s@^����5j�֭[��ݻ��>�u%!(�=��֬Y��S�jȐ!JNNּy�T��!<[�b~�o�ZJ�,�iӦiĈz��w%I�����/dee�D�p'�E+\b�+W�$�������ޖ$I҆
�����߱jժ%IZ�n]���V۸����\�bj�m%��_~����_~��L�2�ԩ��|�r���G�.]�������ߖt�I5��q��--^�X���z�wL���������g럵�uMR���G��/H�.^��c_V[Vx�3g�j׮���Y�6mRXX��8333͘1C�V��W_}�:���ѱ��o�!///͝;Ws�Ε��w��=�1g(Z(�(�ڶm+I�5k����������$͚5+G�V�ZI�&O��Ç��͛:��,X 
:��7��'O�����%I����3g�RRR������TEGGk�ر�Ƒ�r��I�"""t��U?~\���9�5o�\�4w�\�={V׮]ӧ�~*u��5��s��;w����֮]���4��۫z�꒲���~NNNjԨ����O���W�7o��˗u��
8p@#G�Tll��7o.777�q-[��$͜9S������Pbb��|��7��Un�w�5$����NYmY}�a�رC
6�ԩS5f�%%%�]�vF�P���C;v�СC����#G�	xlr+H/�xxxh޼y�7o�i�
@a����(ftܛ���~���8qB}���o߾}�j۶mJLLT�޽���ҨQ�L��ʕӅ���*mذA�Z�һᆱ���Z�W���իs��ꫯj����-[*<<\���>��sIR�f�rׯ_?EEE)11Q���?��4hP����Z��飙3g���7G�O��k?I�հa���/�hҤI9��U�V���M�Y�ߺu�N�<����g�ogg��-��k^�y7o�\۷oWrrr��KNN������?��رc�|�r�o�^�|�^{�5�c�8}��N�>�&M��\�F��g�������Q�V�R��퍎��a���%K��ҥKթS'�-[VŊS���5c�I������������!YXX�L�2jٲ������V0f�U�TIJOO7��1B~~~jٲ�^z�%������RիWװa���_�V_��Q�F���M�?��,--լY3M�2%�u���


R�v�T�ti/^\�j���ٳաC�|��ϵ������G5k֔���,--U�Z5���WӧO�w?I*_���/_�#F�N�:*U���{�9���[�ל9sdee��ҥK+((H=z�P�
daa�
*���]���*S�L��׼���n߾�J�*�;v��c�Y[[�VX���u떖,Y�5jh˖-
��O������E���T�XQ?��:v�w�yG�}��ё2f����F�x���)$$D�n?NgΜQǎekk�����~~
�/V@@�"""T�R%I��ޥK
2D48����)I
		�u���ݻWÆ
�޽{5b�M�6M���F�B�h�޽���1:
�2�~��&M��>}����_%J�0:����Pyzz*kZ~�6�'�}���<=�GO�bF�����(--M&LP�v�dmm��~�M�gϖ$5l���x����G�}��BBB4n�8I������F�{�68�����-������I{��U�z����"���V���1�7n��ԩ#=zT�֭S�
���"�G�FGC����ƍF���֡CI����Z�n�&M��{��JHHP�r�4x�`��iV�dIM�6M���:s�Μ9���HM�6MVVVF��		Q�ڵ�r�J}��W������:z���퍎���;Cݻw�̙3jҤ�~��g�#����S��ݍ���޽���쌎�MӦM��3��(�i�
�ظq�dgg��^���������/���I䩻xdo�񆼼�4w�\I����5jdp*���Ç���m۶i���U��华�".##C����^{�5���)V�vm��ǫ{��rvvֲe����jt,!���rvv6:j���>|��1@�����<<<���at<�o@^]�zU���͛�ڵkk�Νrrr2: I:q�nܸA�Y����?hĈrss�����G�����h�0
.�mذAÇׅ�駟���[Ŋ�(<RRR$I���'���x���W�z�4b�%''+88X%K�4:�Q=z�0:*44T7n�0:�`ntPx���o�ܹ�:uꤦM�����1b�(tJ�*%777�-[��(x�6L�6mҖ-[��o�ԩSFG�3���Nݻw7:�t��]vvvF�ELӦM�@�|P�q�$�!==]������W^yEQQQjӦ�ѱ�{rqq�����1�jժ����Թsg5i�D���rtt4:����rvv6:j���>|��1 W\ OOOyzz@yxx(~��'y{{�ĉ�8q�Ə/KKK�c�a�U��]�v���C�Z��ҥK���@�ࢀ���@>�L-���g�j�ر
		Q���ߪjժF��B�L�2Z�~�&M����{O��ɚ9s�,,,����Pp@w��-���kʔ)*S��֭[��]�
͞=[u����u��A����t��FGP(�( =z�0:�|���PHH��1�'*!!AÆ
��?��Q�Fiʔ)���6:j��������*'''�_�^ժU3:�����ϲ��eff����)xyxx�+x����oy{{�iӦ*U����ۧٳgSly����x�(QBM�6�O?�dt$�!������U�fM�]�VAAAڶm��ԩct4x���+ڱc��z�-�o�^�-2:�Lj�����U�V�۷��v�#G��ޓ����рG�-[�ET�R��j�*M�2E������RFF�ѱ<\�9r��������?TXX�L��o�>C�7333���ʕ+�0a�6l���T���jѢE*[�����?�\AAAF�@fff�)S�h�ڵ���վ}{]�p��XȷѣG���3�}��퓟��Ǝ�1c�h�…ڿ�N9u��E�52:��~�zծ][K�,Ѽy��ƍx�~��U�^���\]]�s�N����I�&:x�ё<
.�o۷oϵ��ի�2e����dcc#[[[���꣏>�իW�pJ�n���FGx�~��Wu��Q]�v����:���_���dz%##CǏW�jՌ�H��ׯ�={��bŊrrr�w�}gt$��.
��� �c<AAA:w�z��ejsww׹s�d`2(:����'��N�:��_�e�}��תX���р���ƍ���7:
`R�BmٲEnnn�ܹ��̙ct$���B,�c�޽jݺ��jڗ�!�*a IDAT����S�NrrrRǎ������l�u�/^,WWW999���E���SDDD���r�;�C�,�|��V�Z�ƍ�B�
�>+V����V�Z�˗/?��@ѐ���	&�jժ*Q���T��ɓ'�ڵk�>233��_�����P����G�2333����e���w�����m���Ӌ/��aÆ�ʕ+��={V���׋/���%K���S���9��֭[���Q�5T�D	�.]ZNNN�ꫯ�ڲe�^�u͜9S>>>ڿ�Z�j�P��G��$���k'�+Q��4g�M�8Q}����׍� �6�|]�|�TȐ����C����>gΜQ``�������'s�۵4~~~Z�|��ߍ7������$]�rE����>gn6mڤ��45k�,Ǿf͚)>>^�7oV�n���Pd\�vM�Z�RBB����~�̙3�M�6���\���ڱc�>���h�Bvvv:y򤼼�T�R%-Y�Dk֬y�1�ԪU+�?^��B�ŋ��͛Z�t�$��V���u��q�1����t�R��'L������銍�Ull�.]��?�0O�ՙ3g4z�h�\�R�:uҦM��ꫯ��X�iw��q�/_^�˗7:
��Q�F�v���ի��;���pV��p��Z��bbb4c�IҊ+t��Aխ[W������SXX�4h���xEFF��
�$-\�P�w�Vtt�&L� IZ�z��_^�y�M�			�혘IR�Z�r��j��y1o�<%$$�iӦڷo�nܸ����Y?���%Ie˖ղe�t��%���{�y���K�.)88X�ʕSff�鼙����q�5j��ѣJKK��ɓ%I�|�i�ܹsu��q���k�����׵}�v%&&�8WV��?���ׯ�����t����ddd�/�P�Z��k�.EFFj���[�H9z�W�nt�ڷo�ݻw믿�R�ƍ�w�^�#�
.�0�l��KR�޽eiiiڎ���$͜9SիW�����V��iӦI�6n�h�[�T)IRHH�������WnnnJHH�V���s��ȑ#���M�U�T���",,L��r�J5h�@ŊS�ڵ,�v�X�֭[kԨQھ}�����m�6
>\mڴylcdY�p����U�dI�5J�t�����IҒ%KԤIYZZ���E�-�q.kkkI�W2���ӹs�4l�0eff��_�o���85i�Dcǎհa�t��Au�����"
4���լYSqqq�U���|�M�� �W1��
��<yR�ԩS�\�����~9r��O����X���jѢE�߿�<<<dee�P��M��ƥK�α/�����A�;&�*?�IJJʶ=s�LEEE)66V�kז���cC��֭k��|��[�n�ڲ~_:99e;���%ǹ�Ν����k���ڼy��L��ɓ'k�ȑ����]�pA'N�W_}�-Zh�����.���FG�\�rڸq�F��^�z���:u���̌� �p�%$$d{=�]R��-$)33�c����~n׮����{����~���v���աC�[��Ι������s�'��ƍd���"��\�x���aƸ�wrn�d�>���j���s��ի�N�>���@5o�\iii�<y�^y�-^�8�y���U�F
EFFjٲeڲe��)V��,X�%K�h֬Y�޽��\�bt,����)dcc#IڰaC�B������g�_�Lu��IZ�|����K�.i���}λ����r�99�-��E��>'N�Pfff�WFFF���&MRRR�7n�h�ĉ�}������$EGGgk���͵�r�ԯ_?�ܹS���?~������?4�IJJ�����^�z�СC�ݻ7�l�4h�~��Gm߾]��Φ�\<�Z�j%I�<y�>��7o��Z�`�4t�PS�Ν;��Ak׮UZZ����U�zuIٟ���sf��{�Ma5jԐ$���o9�f�e����ڵ�$���C{��UFF�Ξ=��c����L�[�6�ݺu�>��39;;+&&F...Z�`��n�j����ѣ5F^���K�����hݸqC���2dH��ժU����-Z�˗/�~���_����+i���j̘1jԨ��_����x-\�Pe˖�w.@���o*>>^7o�T�ƍct$w0����4:ij���L!!!����u�^$I			yޗ����}��ĉ9����R@@���!<<\3g��ul�*�9g�v�t��I�W�ذa�i��Ç���v�����_hʔ)�ܹ��
�P��������\���]�xQ���:|�p�}�J��Ν;հaC����z���u��E���ϪR��N�8����L�2JJJRٲe���/�ܹs��W_}U'N����
6�yw�������}��e���+Wf�dɒlmwrpp�ٳg����Y�fi��27�N�E����ݻ�~��-Z�H���3:�…�r-��kkk���C666���P�2eԲeKg[I���U>>>�Y��,--eii�jժ�o߾�>}�C�s̘1�T��,,,���.Ij߾�J�*�;v�Ȼc�Y[[�m۶�}{a�?��v�ڥ�#G��W_U�b�T�|yu��E����B///����Z�p��T�"I�R��.\�S�N���K��`�U�ZUŊ����5F~�(QB۶mӰa���K/�D��ѣ��,Y���!C�F����JVVV�^���V�����jݺ��9��C�Rl�0kkk���k���0`�ƌ��7o(�X��1y�.�%�/V@@�"""T�R%I��ӧեK
2D48!po�p�]�~]�gϖ����V�*����\�RP�-�j�*=���FG�,��ǦO�>�X�b��CBBdcc�޽{�
���(իWOs��ѴiӴo�>�-�<���QLL��1�����]۷oWbb�u��1�#ExlJ�,�iӦ)22RgΜљ3g�iӦ�����xP����ٳ�ڵk��u��7n��/nt4�лy�fϞ�_���(�c׸qc�ٳG�K�VӦMet$�H����o�!///͝;Ws�Ε���5jdt,(T222�矫f͚JHHз�~���p���
xj����JOOW�jՌ�[[[EGG���V����gt$��)ft<{<<<���at(�v��%///:tH�Ǐ�ĉU�dI�cO�cǎI��W�np��XYYiŊ�W��F����$������O����5h� 9;;륗^RRR�f̘A��RRRT�lY���FG
����&L��o��F���jӦ����/�cE���L-[�L5k��w�}���PEEE�T~����������өS'�ڵK�����4i���$�#�<
.( P�-Կ������ի�ѱ�g±c���k�x��ի���xU�\Y͚5Sdd�ё�gZ1�<�<==aty�f�yxxψ��4͘1C�}��^�u�������X�3�_~�����1�'��_ԏ?����_]�v�'�|���������h�3���ҽ{w�#ȇ�ݻ�iӦF�3`Æ
>|����o͝;W���27gA)�q��?��
(��/�%K��^�z5j���� +++���
.
HXX��O�ɓ'5b�EDD�W�^�?�lll��<��v�jt�p��jԨ��={���E���5:������̌/^O������_x
eddh�ܹ�S��8�͛7k�ʕ[���m�*..N�/_V�ƍ�g��#�V�(@]�t�����1��x111����ѣG5~�xM�0AVVVF�1������U�^�ԢE�����X�S���Խ{wu����� ""��x��?^'N�W_}���zKk׮����ѱE���?�o��V�Ǐ�����������ܜE
��E�y�����˗k̘1*^��BCCիW/�c I����ܹsU�N
6LЊ+dmmmt4�D�Et��ըQ#�}��ъ��Prr�.]��ҥK�^�zruu����c��A�������~����+IrttT�=N�hаa�#///}���*[��ѱȡ_�~�^��\]]լY3�_�^���gt,�cnt<Y�G����g���ׯk������.(##C�����#Gj�ĉJOO�c6��퓟��Ǝ�1c�h�…ڿ�ѱ$--M'NT�F�������8-\��b@�ּys�ٳGjҤ�v��at$�C�E�}��\�?��mٲE���9r�"##�͛7kƌ���UTT����>ֱ
��W�^Ք)S���&������U}�^�jt<Oط�~�:u�hѢE�;w����M+�0��ӧծ];?~��(@�ggg��;w�E�jӦ����K�#O
.���`�ͻ����ƍU�L�w�޲������ʗ/�:(88X�˗�ƍ���hhނ�s�ΩW�^�6www�;wNAAA&�$�����ڵ�:v�(GGG:tH|����	�ȑ#���R�ҥ��<�{�9�Y�F'NԐ!C4�w��5]���#s��
ZJ̊c��*����PԬTMM
�Z�*��iQJP55d2�5U[��J���������8�N�y��\g���z��˩�>{�ۊ��3;�#ؚ)���.\�;v���˲��S�2eԶm[�k�.Q���H���h�Ν�r�
.�W_}U�������$%Z���ÇkӦM��^�z�T�R�f)T��z�衹s���SժU����>}�v��){{{yzzj���*\�p�}?��x�n��…�{�n]�zU�V�&M4`��˗/�y���͞=['O�����^~�e�1BNNN��[�n�o�Q�Z�T�H���E����������ٓ<�\,..N�}���L�"777�رC͚53;��>}Z...z��͎��E�'OV�J�ԧO���i͚5*X�����l���_|��˗'|�{������;w�{���X
4H���	u/_��ŋ�ԩS��/R}+��'$I/��R�y<==5w�\;v,I���͛7K�����������Z�r�\\\�|ͷo�֛o�����'�����ի�ŋ���9Q���ƍ	}�_�^������%�}�o߮��Hկ_?I����+((H;v�P��|=r???
<X?���������-GGG�cx���U�lY�c9R�Ν��m۪N�:�U�
̎d[)?��mذA������_��퓷��$i͚5	�V�\���PU�RE�W�V``�֮]��ի+((H�����"q����W�\�$������D���?��3Iف4w�\���k���*V�����j�ʕ�����˗��*^��/^,����X�b:{���.]��Mɒ%�a�<xP}���$�ٳ'�<��x��AIRŊ��,����ڵk0`�<==U�Hk���,�����Y���f�r�5j�СC*\���ի��۷�	ȶXp��<<<}R;��êU��v�Z�����ر�>���B�v��)I�:u�ʕ+'�.]Z�'O�$}����f����$�ڦ��a���A��ު_�����T�jՄ�%\���Ǐ��U����NժUӸq�$I�w�N�f�رz��g���[�͛7��:�?����p<�T�R����вe�T�|ymٲE�V��Ν;ys>�͝?��c*Z����٣6mڨU�V���O͎dK,���F�!��O?U�.]�x�bEGG'���o�I�ڴi�h�F�v�$IgϞM��"E�H�._��j�K�.%����u�&�^�zuI�ŋS=gJ}T�V-��^xA����7I�2e�$����E�t����ci�k׮I���ϟ���c�u�l!!!jԨ����]�*44Tݺu3;�G���Ξ=��(�
�l�2M�:Ucƌћo�����c�
.���Ç}R;��+�h۶m�����jժ)::Z���S˖-�~������8�۷o�Z����L�^|y|�=�;F���<y�3�\@�0;;��?[,�$�i���e�?������z�T�F
ݹsG����������jv4ip��%EGG��`EcǎզM���ߪiӦ���?͎d,���\\\ԦM���h���z�7t��M͞=;�����$i���In>|XAAA��ѡCIҒ%KR�
����Z�|�$%��'O&�~��1I�s�=��+�G�b�$IǏOt<�{���WZ�񩧞�$ݸq#I��c�u�<[�lQ�ʕ��W_i�̙
����ٱ�ÿ��/�F�fGr�V�Z���_�U��N�8av$ [`�E6ֶm[yxx��o�Udd�ʖ-�r��IJ��C�ƍ%I�ǏWxx��ݻ��W�jΜ9���РA�������o�%�V��Z�j���H���O�W������8EDDh�ʕ�߿����ԢEU�^=I֏>�H�N�R\\��;��S�J��7o�j�kԨ�$i�ԩ:y����t��IM�6M�ԠA���K�8�/_^��믿&9G���:r���]�۷W�֭U�N���iذa���1;�t���W�ڵ���dv שT��������.OOOmذ��H��l�������:u��O���ӧ'*{��ν{��޽{u��I���#Q=GGG���;	�,�k׮�}��rss��͛%��X#&&F�v���ٳ��q�ƚ8qb�Y*�޽{':V�R%u���}?|ͻw��o����}�&*{��g�K����/���~�I�N�J���S�NI�؂戋�Ӝ9s4y�d-ZT;v�P�f�̎@�U�P!m߾]ÇWǎ5e�M�0!a�4�a��>|X�N��}�������
*���^���*S��z��)S�$�˗/�/^,///������F...jԨ��.]�hW�ѣG�x�ⲱ�Qlll�q{{{M�>]�g�V�
���<y�`��z饗4{�l͘1C�f�={�<==ekk�"E��W�^�?��������ϯ%K��s��*R��lllT�Hu��MK�.���K��7=�ؼys9;;k���Iα�~�˗�������O5k����5j�(��4���ռy���_�>P׮]iv,��0�C��E�V����W��s+IJq�HN3�|���h�ƍ*^��$�ҥKj׮��~������{�U�V%�9õk����E��iӦ���/U�\9�c�#�ٳG�:uRɒ%�i�&�(Q��H@�b��o��-��!�U�V���M=z�01����e˖�B�
ڲe�V�\��;w����иqc*&&F�k�V@@�ّ�,ł�NNN�<y�|}}u��e]�|Y����<y�͎ ���jԨ����Ν;+444��.@V)S�����U�fM5n�X+V�0;�el�d75k�Ԑ!C4s�LI�СCU�F
�SxXTT���}͞=[�?�����av,r����k�ƍ7n�z��S�Niڴiʓ�����Xp��r��a�#d
///ސdc[�lѰa���k�̙2d�lll̎ -Y�D����=jv�dcc��?�XU�TQ����U�V)��fG2
�$�����:t�֭[�v��
Ӱa�Xl<~��g�av�׳gO�ٳG�R�����/��	�n� IDAT�4,�d{qqq�={�*U���'OjǎZ�f����̎ ��>}Ze˖5;I���SPP����T�vm�߿��H@�`� [���S͚55n�8�5J'O�T�f�̎ ��;wN���f��y��߿_
6��/��E��	�:[��f�֭�����1���u�ԩS'�c�׮]����|||ԤI�[�N�ʕ3;�X,I�aV?�a:{�l�;\df�f9v�^x��c 1{N$��,o޼Z�n�&M���ԩS�5k�lll̊	X.2�ƍ�q�F�c@�b��/_�1c����F+V�����ٱ��ҥK���|bv�h׮�6mڔ����d�9a�X��r���ӧ���õf�(P��h�cc�E&ɎC@v�A��<x�>��C����@d�}Ν;'IÔ�M�6��LN�]�tQ�2eԮ];խ[W���)�J�y�@TT��{�=U�^]w��Q@@����[�$�={V��哛���Q����CAAAʟ?��֭�]�v�	x,�paE�֭�����1X��u�ԩS'�c<�l٢�Ç�ڵk�1c��*�cH'��"�;]�����ȑ#�l�2���ꭷ��￯�W�j�Сڼy����զM}���rqqI�>22Rн{�T�P!�j�J�|��#_ܾ}[~��֮]�K�.���Mݻw�ĉ���$wFsf���'Oj�ȑ��󓓓�:uꤙ3g*o޼	u���k���Z�f�.\� {{{U�REo�����뗁;�̖�y��奯��Z˗/WϞ=ڮ^�ZݻwW�N��nݺ���=��܋�q�����Ww��Q���`��$חڜܷo����W_}Us��ѐ!C�8�@ֱ�O��<�p����K�V�2;F����kĈڰa�:w��>����9XJ.��&��d�͛7O�Jt�w��Z�dI��}����ŋ�+U���=��&�wtt�4h�Ç'���/k���ʓ'�Urf����zJW�^MT���Z�pa���4CcǎՌ3��IҬY�4r��d�`��΋�ׯ��׭[�t��I=����T�jU�˗O���*T�P�s�a��'Iׯ_W͚5u���Du^{�5mٲ%�oI�����N���'jРA�3g�����1;@na>|rه��#..N�g�V�J�t��Im߾]k֬a��K�ĉ�����/I2d�lll���HM�4I��y��$�nݪm۶)&&FT�R�t��͚5+�>g͚�Ç�N�::v��޽���yzzj׮]Ip<NΌ�U�|y�>}Z���?~�$�モ����=���~�A111�u��͛'I����S�#�����U˖-�͛7իW/ݻwOo��n޼��K��`��)�	k�=I�9s�Ο?/www*&&F?��N�<��\����E�Ǐ���b�
�h�B׮]��Y�.Y���OC�Qxx��}�]y{{�����X� �.<����K�nݺ%I҉'T�jUIҝ;w�/_�dۯ_�^�۷O�g�Νz�WT�bE���&�w�j�t��I�?^�=�\B�s�����]
6�޽{��3#}9rD5jԐ$]�zU�V�<yt�޽d�G�J�(�K�.�W^Q���ծ];�.]:�[�g^HҨQ�4{�lխ[Wz���g�%�'7'2c�U�RE!!!���դI��s~���jժU�陓ǏW۶meoo/___U�X1}
���Lw��5���{Z�h�7n�y��\�rf�`E)-����L��*�x\\�lll�֭[	�$)**J��β��WLLL�m����b�B�
��իVə��bbbdoo�p�<y�${��3��o�Q߾}�rvv���5b�9;;��?̑�y!�3'jժ���`U�TIG����cByrs"3枣��bbb��}�}����ϟ�nz�����_]!!!��oԢE���E�r/�0�|�rU�PA���Z�b�v���b�	��.6.bH���m����d��:)�q�F�c͙���x��� ��t��U�.]��ŋ��/*22R�ǏW�%4��4�Y'#�"^Z�Df̽���ɷ��KR7�s�H�"ڽ{�ڵk��^{M�g�N5?����)���ԨQ#���G�;wVXX����̎ ��O�}߾}���+�ئT�R��.�0�$���8���ʾ
,�>}��


һᆱ���[#G��Z���΋q��)88X�j�RHH��{�=���e˖��g�����9��ࠥK�jڴi;v�������t��
.V�q�Ʃz��}����_�����hr�~��)  @w�����5h� IR�n�Rl��K����t��Q���)""Bcƌ��bQ�&M��/3���y����	�ʔ)#�Ţ���J�n�R�j�T�Z5I�w-@���y�{�n}���������K/iΜ9ڽ{wB���Df̽��WԾ}�t��]i�I�>Μ3f�6mڤ�kתiӦ�r�J��Y�b�av@�u�V
6LW�^�|��C������X�@���|�{J�վp��믿���������l�7n�nݺ
O����Y�/�`����׿��/��矒��%K�…Z�`A�b���i�F�6mJ��H뼸~���V��7n�ĉ*U��.\��jժ���E���ruuMvNd�܋��Q�z�t�رD��u릯��:Q]k�ɐ��i�F�ahӦMz�����J�pxl/^T���k��V�Z
����Yl�+VL�K������/�1c�h���	�-�S�@���iĈ*Y��lmmU�P!�k�N	�[Cf�5g��.]Z��������ώ>>>�Q�����*U����[˖-���:�:/����]���J�*%I*U��>��s]�xQC�����Ȍ���࠽{�j��z�����Ν;k��I�ZcNV�\Y���z��gU�~}����;3�����aqqq�;w�&M���E���/��+��bv,�@���(��ӧ��&}9�ݻw��[oiѢE�裏���mv$@�dkv@����!C�(,,L�������ٱ�27nܐ����1d";;;-X�@�+W�ȑ#����?��dd�<f�,����
�p��
֔)SXl Ӕ-[����������k�֭jܸ�"""̎�'��0�����0�X�B�G�����fΜ��ݻ�@.e�X$I����������ɉd���Y�[�VTT�|}}��/�	O(v�<RXX�7n�>}��S�N
c��Le�&M��ҥK��x”/_^����X��4h�o����HxB������(�7NիW׭[��/��R���fG�������?ov&(X�����{���G�;w֔)S���j��V�غu��
��W��>А!Cdkkkv,�Y�`��
��_]K�.����ّ�`�@"/^Tǎ��k��V�Z
����YlL1p�@m߾]?���4h��/�	O\$Iqqq���OU�bE�8qB?��֬Y�bŊ�
<�7n���@EEE�N�:


2;��0�C�����+,,L�������ٱ�qㆼ���{�n��������H�ě;w�8`v����SÇ7;�d�pO����[����
.���`M�2�� [*P��|}}5t�P���C�Ǐ���͎O���@�[���Xպu�hv@6`kv�9V�X�ѣG+O�<Z�l�z��av$�G����̙3U�re
<X���Z�b����gv4xbyyyiժUf��j�w�nv@6��9s�^~�e���[�۷WXX�-@�ӧO�ڵK~~~���ԯ��jv$�2�pO���XM�6MӧOW�r�t�իW��X���Ǐ�dɒ*X���Qdc���


R�6mT�vmmذA/���ٱ�6w�\8p��������nv@6��سg��V��3f��ב#GXl [{��W�l�2�c�J�,���~��jڴ��.]jv$x�jݺuf� ]֭[���@�c�!v��\쯿�ҨQ��b�
�j�J?��J�*ev,H��۷!www���!��˧���k„	�۷�BBB4}�t��ؘ
�H^^^Z�j��1H��ݻ��M��r!�0�d��;V���Z�n�:t�`v,H��g�J�ʔ)cr9I�<y4u�TU�REo���BCC���_�����hȡ�`]aaajذ���ݻ+,,��r��g�*O�<,��!^^^ڻw��;�����ܹsfG@ł�%���4a�U�^]���
М9s�?~��@��;wN�<����͎ ��S��������:u�h�޽fG���0;B����\@.�s�N=���;w�>�������X�!gϞ�����1�p%J�о}�ԴiS���+Z�p�ّ9��ԿU�XQ���rpp�3�<��;j�֭f��2�E��*�rssS˖-5~�x�8q"պ'N����ղeK���Y���?vlmmU�`A���=z�~��G��ZY�d��Ȉ�/�]�v*P��lmm���#G�X���H���?�QŊ�R��,��;��s=zT�E�?��U�ed�Xs�%76����EDD���K���U����P���۲��1;dؙ3gXp�*�����7�h���4h�����8�c��?��S-[�T�
�h�"���+**J����x�֯_��^{M�Z��͛7͎��DDDh۶m�:u��L��j�I�&i�ԩڶm[�{��{�t��u?~\�f�R�J��r�J�c�&�ǣG�ڴi�n޼�{��)""Bŋ��׀t���D��x�
I���O��_/�]n���`&\@t��}͟?_+V����|}}�~�z�(Q��h��ʕ+��u�@.a�X4i�$�Y�F�/V˖-����������W���mۦbŊi�̙
		Qdd�bbb�>�@������6mڰ�/��ݵs�N���&[�]�v�dɒY�,s����?��C�v�R�֭�^�z%�sJ|���q�##���$I�6m�ݻw��E�Z�ܙ�gϞ���ѪU��j���h�^�Z����ѣ�Us����`��0'O������
�~��)$$D�[�6;X�…ջwo�c�e:u�}��),,Lu����ӧ͎�&�����ϫaÆ
		ѨQ�T�R%999���^�˗ׄ	���'WWW���O�?�ٱs��-[���ڷo_��{��՝;wԲe�,N�5���T�H5m�T���;v����cv�,���q��]IR�֭ekk+''��>gf+Z���7o��ׯkÆ
��]�~��_���͛g��$�t,���Ν;;v�j֬)�0t��a͘1Cy��5;@�P�F
�P�B�[��v��av$x"���0`��}�Y988���MݻwWhhh��-�#?;|��:uꤧ�~Z���*S�����u���D���߯m۶�駟ֆ
���b�*U�h��钤���?I�����o�x�ⲷ�W���ջwo�9s&�뒤C��I�&rrrR��զM%��̙34h������� WWWլYSS�L��דm��l�I���"��?j�EF珔�qNin���Q�M��5j�ҥK���oy���h}��z饗��SO���V�V�V��w��t���9�nݺ�H�"���W�5�y��3�Gj�!���?�#O�<I�ed,�5����X��|||R=O|y|}kΏ��%<<\�z��������T�lY͙3'�s�'ף�������_U�fM�͛�����d{�7o6J�*e������3�ݻgv$�+**��޽�akkk̝;��8��yyy^^^)~ؾ}�CR������u��$m�������)Q��K�666��}��۷o'�0`�!ɘ8qb��7::�ؿ���-[''�d�̛7��s���+  �pttL��������K�&((�ȟ?�cQ�T)#""�j��8�/::�pvv6ʖ-��ؖ.]�ptt4�ܹ�)��g�S�G�?�݃-ZdH2:w��9n޼iԨQ#�n�X�͛7�9KF�Ď;�mc�X�+Vd�x�羧�[�c���?*_tt�Q�`A�b��ϟO��s����(T��c�kJ�֭[S�3ӦMK�Mzs=jl��~Ϛ4i���.]�$������p�إK�ԱcG�n�Zu��Uhh��<y���(GGG�\�R|�F�����ݻf��\�ڵk�ر�nݺ�w�yGgΜQTT����կ_?������K�/_N��0�$��S�&�/Z�(�Ͽ���{��iРA��_�}�����]ǎ���P�����V�Z�����){{��c�ڵ����Զm[�:uJ111:u�ڶm�;w�s�Ί��H��}��ի����Ν;ڻw�ʔ)���X}�ᇉ���;�u���3g�(66V���ڳg�*U��.hʔ)V���޿ǮI�&:s�L�7ч����jذ����3���sV���$=z4�zӧO�ѣGU�re8p@������V@@��ի'�0��G��ό̉�ׯ���+�MHH�bbbt��Q5i�D�� < ��H�}�������dݱ̈G�sppP׮]e�/^��9/^,�0ԭ[7���g�5]�r%�w��E��኉�ѱc�ԬY�ϝ�\���=;s挂��u��
͚5+��xe��@����s��1���o�)S��̎�+mܸ�ȗ/�ѨQ#�ʕ+f��'=o�:u�!�?~|����N���
[[[C�1f̘DecǎM���2�v���7o^C�q�ƍT�L͸q�IF�ƍ��Hy��=�q���^���M�
Jr�ݻw�WW�D��wh��ᅮ�9u�!�(V��ղ=(���s͛7ϐd|�駉�̘1Ðd̙3'�O�8��!-�j����<���S=Gɒ%
IƑ#G���̙3ɞ#�,��|�I���{��Q�n�Lk̻Ys,�R��q	4$%J�H2�qqqF���
IơC�2�>�����-[&�{��]�^�zɞ�ڹ��l��I� v���W�@6s��խ[WcƌѰa���͛� Wj۶����t��խ[W!!!fG�\k�֭����z+��~��I�v�ؑ�9nܸ�nݺ)..N͛7״i���ڵK�4dȐ$m=<<d�~�嗄cQQQ��|���J۹s�$i�رIv�̓'��}�]IҶmےm?t��$�j׮-I�y�f���<�$�e˖Z�j�~�����ʕ+�0]�t�j�d��ײeKIҖ-[��_���g������$)&&&�z.\�a�Q�F���{N���ddNl޼Y����&ickk�q�ƥ��GIn<�1�dͱ�,�k�VŊu��Em߾=Q���u��%U�RE�2����ȑ#�����&̙�Y;��5l�0�}� [��q��-M�8Q_|��ׯ��G��r��f����y�C��_��V�^�V�Z�r���PI���[��Μ9�bـt������믿���M��g�J��U���L...�~��nݺ�
��MJy��X��lswwOr,o޼�����':>n�8���G������"��M��u��z��dooo�l��+Y��*W������֭[ʟ?�nܸ���lٲɎ���O�8g�;w�H����� IDATg������� ���$�0��>#s�ԩS��Z�j%ۦ^�zi�ɍ�5�]Jw,3�o�!ooo�����W_M8���P��̸���0IR͚5�-�[��#�a�\��{�`
��b�d6l��o����H-X�@}����b1;d���X�]�V-Z�P�…͎�	S�H���<x�ڶm��ӧk���f��\%���ToѢEZ�v���ϯM�6�`��I�ܾ}[R�w�pww��Ç�:uꤩM\\�lm���޺uK�R\��?~I�{��a�o�O�޽{�@����u��QI����K�j�ҥ*S��v�ءҥK[%ۃ���kٲ�f̘��;w�}���������?=�U�w[)^��#�Y�F�ƍ����ό̉�1Mia����ce���xXk�=�Zc��z��������WW�\��O?�+W�h��Ͳ��U�=���k��3�s�aO=�T�m���qϜ��;�ɔ��U���_U�6mԱcG5i�D���z��7Yl�t��y���S/^4;
�'����|||��'����[�{�VLL�ٱ ׈�M��2#�Ͻ{���
��o�-�Ţ�+W�R�J�����Q4h Iھ}{��>}ZO=�T�����q�F�m�_��(��z���u�����Z�x����r��I�Ν;�#FdJ�ǹ�_X�u��D�����?��{tt�Uνw�^I)��?��իյkW�?^*T�ĉ���M�6������3#s"�M|��R:Wz%7־�;��9T�X15k�Lw������%I˗/�ݻwռys-Z4��5�Gr5gRZ�`�\Y�[@<\�	���4s�LU�\Y�O�֮]��l�2=���fGӜ={V���f9r�6oެ�7�iӦ���?͎�����$���/]��յkWEFFjʔ)jӦM�u˔)#I:u�T��ݵkWI�W_}����|��w�y�f�%��l����D����g�U�>}��㣟�Y�7o��֭�-���a���rqqѶm�d��o߮�y�aÆY�Z����u���ܹs�}�{��i�…��֭[�Z���>�$͟?_aaaz���շo_�i�&�n.���d��U�T�$9r$�6�~d����xX��gt,3{>$�w�ޒ�e˖I��,Y��x<kΏ��/pH�<~���Y;�Y�����X@@�<<<4a��3F'N�P�&M̎�;w��������(�W_}U������P�Z�t��	�#@�עEI�<���|�ڵ�X,Iv:=z�N�<����k„	��ѸqcI���O��S�N�b��T�R	�j׮�f͚)""B]�tI�a�x/^�̙3�'O�=:�x���%I�|�I���߿��3gJ��6m�j��(U��,�BBB��կ_?�1kf��{�����5k�˗/k�����?դI988dI�iU�`AI�?ܽx���>��	"www���k�֍_�޳g�$e�g�N�sTT�#��Ȝx���%I�f�J�Ãa	mGJ�a�ѱ��|�_���b��m����U���Z�j�BBBT�P�$�ά9?R�!IӧOOv'���Fs�46Y�[��XpY��2d�^|�E.\X'O�ԤI��@<)Ξ=��R�*V���� �)SF���ڸq�ّ G2d�
(���E�


Rtt���٣��gϞ����ԩS�����/�TժU�|��D;K$g��rppВ%K4n�8��������ݻv�x���.T�…�m�6U�RE_~��Ο?���8EEE�ԩS�1c�<<<��_i„	�V�Z�>��ϯ={��}��


Ull�BCCվ}{�ݻW���z뭷{�u�&I�ԩ�v�ܩ;w�(..N�N�������=�n�l�)�8���w��Y�ZxzzJ��(::Z�Ν�ȑ#5o޼t�/..N�/_��͛ռysM�>]vvv��񑭭m�m�}�YI�,>��?t��=����W�^�v�z��#sddN���_ŋ׎;ԩS'�����ݻ


U����i�a�ѱ��|���aÆ
���Slll�:����ҥ�$iĈ���
�����5���������U�V:q�bcc�Ν;���EFs�46Y�[@" �}��׆������O˗/7�߿ov$�vZ�ha������Dll�1h� �b�}����xyy^^^)~�֭[
'''CR��y��%�_�f��>�y����a�X��W�^=#***I���`�lٲ��accc���N��|}}
�d�988�}�]�6�eT��7��+���x��ƅ2-[z�_J��������Y�Z�:d8::&��…Sl���*�ȗ/_�c�\��{�3q�Ą���ߦ��22'8`�͛7�6�/N�;��a��ѱ|��F�%9Or����9t�ծ)=����
WW�d�X�|y�m2�+��Ɍ��x������Ν;�-Z���K�Z�Rxx�z���7r����ٳ*[���1 	;;;}��W��/4i�$u��]���f���e˖:~�����g�yFvvv*P���5k�;vh���;w.�}���W?��^}�U������^*T�|�={����1I�*U�(88X.T�-���&;;;9::�\�r8p��;�)S�$�g�֭u��Q���Cnnn�������z��cǎ�]�v龎丸����_��*U�$'''������]�F�ұc�T�d�L˖��777�����ʕ+'�	?��O<xPmڴQ��eoo�:u�h˖-�߿��gkk�…�~���<y�Ξ=���߿��-[��ի��A...z�嗵e������8q�$i���i:_F�ċ/���Ǐ�W�^	m*W��o��6a�gg�4�F��Ú�=�ci�d��h�By�敭��J�(�l��u�B�
��������5�Gݺuu��	���?�W�XQ�W�VϞ=�m��\��MV��� �a��! �����̙3���t�Қ?�<==͎�V\\�����l�2u����8��]�v�s��*[�����;+V��H`��ݻK�V�Z��w�߹s����r����6;�!���v�+ۿ�jԨ�?�P'N�ѣGYl��A��F�fG�T����
�͛7U�vm9r��H����Y�EgΜI�|ѢE���5kfe,�,����k׮�_�~jذ��y��:uJ�����͎�^�|�4w�\�/_��(�He˖����*W��
h�ڵfG�4u�ԑ$u��E�w�֝;w�3g���w���,I0`��12��� �3C+V���ѣekk����Z]�t1;2�������{�5J]�vUHH�&O�,��bv4��5k��6m�cǎ�iӦI�-��O��F�e}8�L��N�>��_~Y}��Q�N��b�'����>��3-X�@ӧOW�N�t���cXU�5�#F�bŊrrr����J�(��]����O���12;\@���hڴi�>}�*T� ???թS��X0A���U�|yu��A
4����J�(av,�)Q��>��S�cd9v��t���U�jU͚5K}�>�b�'�K/����@ݽ{W�jՒ���ّ�Xpit�����K͚5S����Q�F�֖͂ �.]Z~~~���P�&M�r�J�#�1���0-Z�H*TО={�~�z�����g�5;�����k�ƍ6l�z��q���0�c x-;�"$$D�
R@@���?�P���3;�*!!!������ͮAr}��'�T��
���p�X�By��5;d�իW��ݻf� �֭['///�c�!v��dDEEiܸq�Q�������>����	��߯3f��@�ӻwo�ڵK����.^�hv$�tu��Q�N�̎@�t��Iu��1; �6x�?���C�꯿�Ҍ3��[o)O֧@f9�����͎����S���jӦ�jժ��7� �\m���>|��1�*Xp�����z�w�f�u��Qs��Q�b�̎�ޙ3gT�lY�c@�y�����nݺ�Q�FZ�x�w�aQU�����nf��� �Zf�⾛���������[��*K�,KsO�L�5�]1�HM�0�\�,wADp~��|���y�y��{���;,��C��ݭKD$G���l�"""����CPP��c����������H.�	"R�ݽ{�9s�@ɒ%Y�~=;v�v,�#66�N�:Y;��H�*V�k׮e̘1�������������d;ݰ*""y�����#����������H.�	"R������׏_~��#F���.\�ڱDD
���ɓ'�…�vvvL�:�g�}��âE�(R������d+ooo����CDD$�֬Yc�""""""""""�K�Z;���5ܼy��#G�������'O�d�G��?�$!!WWWkGyd�~�m�m���ݻi޼9�Ν�v$�@.D��Y�~=5k�d��|��7�۷���ڱDD
���X\\\��DD��j֬aaa$&&ҠA~��gkGy$.^����;mڴ�ܹs���ӡC+'�=�?�+�		aĈ�1����G�JDDDDDDDDDDDD�z4�BD
�s����內�'M�4!&&�~��ak�o�""�R�re���ʗ/o�(""�������v��4oޜe˖Y;��H�����f͚f۵jղZ����w����7�}��a���F��ȑ#�1cG�y�	EDDDDDDDDDDDD=�e,"�^rr2_�5�>�,ǎc�֭Q�lYkG)�*U�Ĉ#�CD�jJ�(�����ׯݻw��?�`0X;��H�Ik…q��۳gO��֭[�?��]�R�\9ʗ/����ƍ�֭[�8�������������ȣ�	"��EDD����ѣ6lG��m۶֎%""""bbggǴiӘ;w.'N�[�n��UD�www���`޼y�����?0c���ݭSҰp�B.^�H�n�Leݻw��ŋ,\�Њ�DDDDDDDDDDDDDr�&\�H�t��u�y�4h@�"E8r�&L������DDDDD,�ӧ[�la���4k֌?���ڑDD��������M�6xxxЭ[76nܘ�ݍ7��/x�W���cǎ|��ܼyӬ�q"Ill,�I�&�nݚI�&�M��{�.s���ˋ�
ҬY3z��Ś5k̎u�q��C�hժ���O��R�̌;��oܸ�?�@�z�x�'Lm�|�Iӄ�7n�s�EDDDDDDDDDDDD�6{k�n+V��w����|����accc�X"""""ԲeK����ԩ���g�ڵԭ[�ڱDDJDD���;>>>T�T��+W���nnn�x�˗/��[o����bcc��HII�S�Nܼy���~��'O��]�p���`<H`` �6;v�~��v�����\���w��7�|cZ��Ν;;v�cǎ�������ܸq�l�Cv�ے-[����@�F�R�5jԈ��u�V�t钩L"""""""""""""y�V��<�ܹs�ݻ7�6�N��S�N����mۖ��z���""""�����r�j֬I�f�X�b��#��d���Hjժeq;�-^�����5j�j�*����k��@``���w�}�ɓ'�P����8p�P�|ybccY�hQ�cW�T�U�V��~���صk��~ժU̘1��w�^Ǝ��eˀ�ML1���m�*U���~>���lwZ}�߿�g�}6�q�e�6"""""""""""""��&\�H�w��5�~�i�7oNrrr����d�L�B͚5���e�Ν,Z����
iEDDDD^ɒ%ٰa�������L�0��`�X""�8��f͚�sZhh(�F��bŊ.\���"""X�z���q�D@@�?�<Ԯ]�����;w�:��ѣ�X�"NNN��*�_�n�7��DHHW�\�k׮DDD�nݺ��ѣ���96nK�?�7��~�+W6k#""""""""""""��[;��Hz������2mҷo_�O?�Ā����y�;vl�n>�m���1c5k�dȐ!DGG�p�B
*d�h""����n�=e��L�bڞ0a&LH��Cv���?�V�Z��Ο?@�ڵ���ԩcv�{�����]�xq�޽k*6l}�aaa���1{�l��������u�����-�|�2ŊKUg,3������Kpp��c��d�%"""��&\�H�e0��_~��ѣ,X��>���ݻ����رc�?>�Z�bŊT�Z�ڑED$.\ȩS��裏�ED$W�߿?U�V��ۛ-Z�f��|�Ik��slllj�{'P���!�~ڵk����w�f�ڵ���̚5�%K�0h� �t���z���`0�������a�m���6�B�Ʋ�=�""""""b���AAA֎!"�@����Y���1DDDDr�&\�H�����|�r6m��s�=���Y�x1}��e���ܽ{�ŋӣGkG�,ضm���֎!"�'�nݚ��p:v�H�z�X�~=/��c��dHDD��o߾ԪU�E�q��‹/�ȼy�I��e�r��Ybcc�Q�F��ʗ/ϩS�8r�
40�9r�r��e���ŋ��鉧�'����ر�ŋ��_fh��lll0���S�hQbccS���-)]�4.\�ڵk�.]ڬ�ڵk�6""""""������v��s�&\���H����d""���)S�<y2����j�
����ƍc͚5�nݚ��M���bccquu�v�<�jժ���Q�zu�4i��ի�ID$�"##�U����G�q��L�:�.���Ȕ)Spww��^3�kѢ'N��ѣ$''s��Q&M�@ӦM3�������;+V� !!��U����X^�̙3<f�R�X�f
�n���ɓ|��gY����U���ӧS�Xfl#""""""""""""�i…��:AAA�;��'���kV7x�`ʕ+������ɛ���pqq�v�<�T�Rlڴ�7�|�.]�0i�$��c��<Pn�pѫW/J�.�ѣG�ر#M�4!$$�>}��ڽ��[T�X�������������T�X�L���[o��g�ѬY36lH@@/������///:u��1�C���+�6m�믿Nɒ%�<nK}'k�׽�eY��"""""""���닍��^z�W�z������ "r��;w���O���;vl�z'''&M����C��N�:VH)""�ʕ+\�|�*U�X;��H�cooϬY��Y�&Æ
#::����S�P!kGI�,���̶�ҥK�p�B���8@bb"������ѺukS�bŊ�p�B�Ν��ݻ�t��K��u����Ӈ�ŋg�o///���			��ɓ<���4m��4`�ȑ̜9�.�����1����-۶m�֭[���3~�x^~��,��R�/��_}������7�4;�}�(Z�(m۶����spp ((��1DDf͚5֎!"""����(L�%�;FӦM�ر#�}�����14lؐ…�s��G�RDD�CDD���#66V�\��<��[�ҭ[7�W���ի)[���#�Hc\��x��ے�͙3��f�*T������ܹ3����w��VN("����LDDDr�~""�Ypp0��������o,��,"�;w�:P�n]�&[$&&r��!���;ƌ�+��Bxx8�v�bÆ
VL-""Y���=+V�v�<�]�v���O���ԯ_�_��ڑDD$�y뭷x��'�n�	

�\�r���Ê�DDDDDDDDDDDDDr�����\�v�:P�X1>��֮]˱cLj����ѣ�<y�������Q�5j���>�f͚���֎/""Yp��I*V����������yիW',,ooo�4i’%Kx��W�KD$K���s�9r܂��ٙ?��w�y��={�n�:�O�N�B���NDDDDDDD��…<��֎�W� IDAT�,��|""""�6M��JJJ�dɒ��F�aoo����=�>>>ԪU�Z�j��ꊽ��m���>>>4k���1DD��{�͛73d�����8q"cƌ�v,�'�֭���:u*�
�C0DDDDDD$�BCCY�x1����>}����x�	4h@�^�x�W�񑰱��`0d�q��7,X��]����%>>�bŊ���F۶m�ݻ7�+W��>�ϟ��ѣ�r�J�;����s�S��>�sYD��`0���Ӽys{�1�t�bZ�������DD$U�\9G>�)��3g5j�`ĈDGG3o�<�n-"y�V�Ƚ|||���v�C.^�����6mJUw��9Ν;�ʕ+�СK�.�x��VH�w%&&���2g��޽kVw��U<���<y2Æ
c�ĉٺ�|߾}��X�AYt�DDDD�a�Z;��\666|��'�޽�U�V���K�:utC������C:t(6l`�ڵ�nݚ�/Z;����������0��7
6dӦM�/_��S�EBB�o�&&&�	&P�X16n܈��'���֎�g$&&Ҿ}{f͚���o��&�7o��ŋܹs�K�.�m�6���0L�:�W^y�;w�X;�#��ϕ�`��""""��&\��������3/���…xxxe�H"""""""""R���Ջ�'OҼys���x��w�Q����8::R�Z5ƍ�O?�Dɒ%ٳgs�̱v�<c����ٳ���Y�x1/��eʔ��ޞ�{�6mڰp�B���)_�<۶mc̘1֎���\������҄�|��g�%,,�
*иqc6m�d�H"""""""""�CN�>M߾}�X�"NNN�+W___���-����y��~x{{S�Lqqqa�رܼyӬݾ}�شieʔaժU�,Y2�ܵj���>`�����cbbx뭷�P����T�P???N�8��~��gZ�j���3�J���ӓ�Z��ĉ���WWW���(Y�$u��壏>��ի��l��d���ơ7��E��m�6�ԩ���֭ˆ
ppp`���<yҬ>��V}Z�i�Y�p!5j����2e���o���6KN����+���^���/"""R���ɚdK�,�v�L�\�2M�4�v��n߾M�������ꫯ<x��#�H>���@PP�i{���m�����ooo��g�~������X�����۷o;v���
*�ʕ+�С�Yyz7�8;;���`�^�x1o��6)))��֩S�}��Q�H���Ǽy�?~<�q����a����ԯ_GGGS��
��֭[��)R�k֬�M�6�F�-HLL4�wttd���4l��T���?Ӻuknܸa1_�ʕ	�lٲْ�[�2{�F����ȑ#����-f����̝;����O?��ҪO�s�)S�0z��T휜�X�b;vL���͒S�*���̹�w̹������)��""""��!���K/���������:EDDD��8q�����0p�@Ý;w�GD�	����ٶ�����^z饗^Yy����m�G������ҥK�'�x�`ccc>|��ĉ�[�n8`�ݻ�����P�D	ß���~'N�h��(((�T~��I����0���������{��5������M�kԨaaaaY>����hѢ��ꫯ"##
�o�6DFF^}�U`(U��᯿�2�Ϙ�F���^{�j���7�޽����b:t0ۧq���ЧOÉ'III���î]�Lc0`@�e�WV�_�z��!444S�t�Ν�P�~���H}z�����
���0Cbb�!**����i%J�0\�x1G��Թ��q�_���FAAAf����o��
666L�6
OOOkGy��Çcoo�ʕ+�EDDDD
�իWӳgO7nLHH%J��v$���pɏ��MDDD�-3+\L�4������>��T�#F�`ڴii����ѴiS���5jS�L1Ս3�)S���o��?��A�z��\�2��E�%>>�k׮Q�x�L��?L�8��-[�}�vlmmMuw�ޥM�6�ڵ+ո�O��߿?�g�6;�]�hժ%K��ʕ+�rggg�r�
%K�4�'**�Z�jQ�|yΟ?�-��U++ׯT�R\�z�˗/S�T��Q�|�2�K�N5�̮*����u�j���8;;���=G�1�Ǐϱ,9u��s\�����V������DDDD�`y��V���evED$g���k�ٳOOO7n�ڵkqqq�v,�G�O�Nhh��c���dZ�&M:t��c����dچ
<x��޽{3m�4�nݚ愋k׮ѽ{w���y饗�4i�Y����8p`�}���S�d}��-࿉Y�m�6F�mv�9���-cƌa׮]lڴ��
���~��\�~ݬ�駟�ĉt�ЁA�ѬY3�~�ij֬�j|��^Y�~��}��q�ˍ72���?~�٤0?G6l0����r�\��r�{_DDD��ʷ.6n�h�""fʗ/�/�`�""V�g��T�b�""Vݺu9x� ���*�^��&M�X;������,_�oookGɰ�˗���`�""""Y
@�r��mw�ĉ4��˩S�puue�ҥ��ٙ����P�v�e*^�8W�^�ƍY^eט�x������l�suuMUV�H�U���ӫW/8����nDoݺ5�:u�cǎ8::f[�{e�.\��7of��^�zx��0�ռys���� &&&G�ϩs������}��*�N�2d��#������Ԅ)𒓓9}��&\��XY�
سg={��M�6̟?��={Z;���>>>Y;���H����Z;����H���̶���o			�X�b�]��R�J�js��M �7껺�ALL
4��>������6&��i�$_�X1���-�*T(C����Q�D	>��:�ٳgY�h�-��Ņ�[�����������ơC�����aÆ���ѣT�Z5�<���b�q	�{+��Թ��q�����HA�o'\L�6
OOOk�a���֎ "�+�9s���d�OV�G�H�"�X�����|�M~��7>��Slll�MDDDDDDDDD2�H�"\�~��W�fz5��~��w�y�,YB�5���ƍܼy3C}4mڔ���lْ�	���;��գS�N,Y����W�r��5{�T�W 0>��a���k���k�9s�;vJhh(���;qqq6�u��e{��\��m�r��!BBB25�`����n��b��`H��pbbb��oIZ��9*Y�d�fɩs��qeDn~��T�� """"�q	\+'[[[&M��…��/x���3��5����駟2�_bb"ݺu#!!��>�(������cw��
�ٳg��֟�իWs��u��}<x��>���f�KŊ�ի,���_��ݻw�H��\�޽{cggǜ9s2|M�9B`` ����������w�XBBB�����2�˒_~��byXX�k���,�}��2;�����}��J.DDDD�9y�$�J���4�???�m���ݻi޼9����#���)ǏO�.$$�#F0b�BBBa*)ڷo���~Jrrr����lll�С�Y�ȑ#9z�(^^^�7.�>Z�l	��R�EFFbccC�ʕMe��קm۶\�p�7�x����F�Νc�ԩ���2r�HS�K/���)S�{���>w��e�ԩ@�+dF�ʕ���!***U]�F�R�eg��\?WWWLbb"�۷'"""�><H�HJJb������՗*U���~���i�8A�sp�/��"UYJJ
�'O�K�.9�%�ϕQfǕ�se���""""�&\�H���?�X;��H���-DDr�f͚F||<
4����֎$"�'�����Z�;|�0�|�
�F�b�ȑ̘1�#G�<�""""""��
8�%J��~ڷo��ILLd׮]��׏�={boo�ĉM��[���3g�����wߙ�,aɀprrb�…��������$$$�s�N�j~~~f�̛7���M�6Q�V-fΜ�ɓ'INN�֭[DFF�����ο��˸q��V0`Ŋc׮]xyyMRR���xyy�{�n
.���v��ooo�m�F||<���DFF����obDvg����n�oӦ
�ϟ�Q�F��Ջ�۷s��%������ٺu+~~~4nܘ����-ZX�(ФI���Khh(������1b�f͚�f��E��j�*���IJJJ�f�ƍ�����Đ���ѣG�ر#���<��3�V�ȉ,�y��:���+���)�l���!����
ӦM3-q���b���DDD�j�*"""8�<)))�.]�^x��]�����o�|��	�=����(R�O=��5�G�<���9�';ǕY�۷�ĉ�_��5j<�}TT�������iӦL���X�r����L�<���@6|�p�M�fڶ��g�ʕ�,��Hnйsg���Y�t�����H�\�B�n�ؿ?��=�����#�H.f�hdq� pwwH���[�n���M�v�:t(���;v�`���8;;?�""b�~����Hn���O6n�H׮]�u��Y�f1`�Ӷ��;����s�{KQ`` �{���mF
6d�Ν*TȬ<22///N�8�fvvv��G��[�~=���ܾ};U���?���;w6+7NI�v(K�ׯ_��Ã�~���>*T`���T�T)G�e��%%%1f�f̘AJJ��}�s<x�`&O����S�����6mJbbb��y��ѷo_��[�l��ݻ�ʌm�c
		�_�~\�rŬݓO>�֭[y��r<d߹��2r��͛����������u�����H~�.r�K�.����o���eˈ��#11�;w�p��6o�L�޽y��y���)))\�~���h���[^z�%֬Yc�X9ƸdaHHH���yyy�X&k��֎!"R -Z�(ݧ������*U�
6гgO�v���n�H"�����&*�W.��ŋ�'}�O
�x�".�b2�o:t�#G��駟���%Jжm[�nݚ�f��<���ߟ={����/S�dI�^�:&L`׮]�&[ԪU�cǎ1o�<ڷoO�r�ppp�P�B���ѯ_?>lq�@�N�8t�=z�\�r���S�\9�|�M>���*^�8�ޣF�8;;coo���+�.�Nu�yvf��3rttdڴi���0v�X���)^�8vvv�,Y�
0n�8N�8�W_}eq��9������T�R8::ҠA~��G���f�Ҿ}{�)���=O=�T�6����޽www���R�
�F��رc�&%�d��:WYWF�սr�{_DDD� �
�Ŀ��K׮]9{�,e˖��ߟ-Z��SOagg�ٳgٴis��%>>�
��cggg��9&'V���X���\�v��Ǐ�h�"v�؁��
���ϱ�D����?��C�ƍ)R�aaa����xxx���)S�L��{�����(�p!""""y��_ͻ�KϞ=�;w.���֎$"�LV��֪9���e��鄆�r��-\\\x��7y���S�IHH`��l۶�������_~�޽{��Z�4��7x�Wx��9s�Y������dÆ
+V,G+""�.DDD$���'��=h���*��+��…���4Z�"�=z4gϞ�A���,\]])T�T�R�A��b�
�/Nxx��#�
���)]�4�52-=h0 ))���]�2ehڴ)ׯ_g˖-�ݼy3ׯ_�Y�fY�l!"""""y�;����Y�r%�ڵ����֎$"�e�����ݛ�7r��u�ܹCLL�i�Ž����߿?�/��?��Ν;���_2l�0�޽�n_[�l!!!�F���kԨ			lݺ5��&"""""""""""""9��N�8�<4i҄�ի�����É�������偯�;v������N�j�hѢS�L!!!����?�̞={x�ǘ5kŋO3����G�`ٲe�����9r$�5�Z�j4jԈQ�Fq�ԩt�p��Q|}}�Q�u�ԡo߾����;u��ƍ�e˖T�^�^xOOO�O����-��l���˨Q�FQ�fM���o6m�dVg�:߾}���@�u�Fݺuqss�nݺ���ۄ��g�������X�y��իG�j��ԩ;v�H3s�.]		I7����>;ǚ�׌q����ѪU+-Z��2��~�����������V�Z�.e)""""�������߿�ӧOS�~}bbb�ID$K���8w��˗'00�0o�<�x�Tm�,YBtt4�j�"88���pBBBx�8x� �֭�WĈ��0m�߿�g�}6ձ�e�6"""""""""""""�{�[;�5������ݛ�7o����֭[ǖ-[�5k-Z���1*d��j�*ƎKJJ����ٳ̝;�}���l�2
.��5k���dɒ�K�.T�Z�ڵk���ڵ������h*���Y�j�7ofΜ94n���1�9����o����}ǎ�ݻ��K�R�NSۣG�ңG���Mew��!**���(V�\�ʕ+y��dz%�r����ңG�{�=v������f��x�w�NTT�Y�իWٽ{7{��a޼y�j�*C}g����ү_?�}����ׯS�N��O�6m(Q�aaa�={���~:U��g�Nɒ%iӦM��Ւݻw3h� ���>}�	&���+'r=�{u̘1�,����SDDDD$�{���s��4jԈ�˗Ӻukk��<���=C�N`�n�v�   ���_|�q��1t�P��۶m`�ĉ�/_�*U���ҹsg6n�H�Ν�����T�T)U]�ʕ�ڈ������������H�U�V��z�*�
">>v��Itt4+V��7��Ν;6��/����5r�HS��I�L�>{�,������Þ={8~�8?���*U"::��s����ܲe�����wwwLe���C�%11�6mڰy�fbbbؼy3mڴ!!!�!C���?�X<�1ch޼9!!!DFFLŊ�s��|�Y�O>����x�u��Ν;9~�8QQQ���ʹs�>}z�e�WV�_f���n�9s�EժU			!**��~���+WR�N�f��P�Y9Gׯ_gذa�}�l�BLL�ׯ�aÆ�?�b_���t��������-�Y�|9��N�:���c����˦����+l۶�4�&M�0s�L��e6��k��mc�þWO�:ŦM����_	��ɍ�x�	v��I���i߾=s�̱v$�L9}�4�كE�I�;s��������^�IZe����+V,U����FDDDDDDDDDDDDDr�7�b�ҥ\�t��@�J�prr�N�:L�8???nܸ��%K�=��Ç�6m}�����TLRR���
&L੧���ޞz����_�[���?����5����HHH��ÃٳgS�jU�Z�*�g���Ãk׮��[ܿ~��̞=��u����L�
L�H:d��8a̘1T�T	{{{
*D�
L�3�oߞm��]�/=�ʕxऍ�k���_P�n]
*���#/��_|�111�3+�hٲe\�r��
2{�l\]]qpp�F�,Z��jժ��_�.]X�r%w��5�KIIaŊf�s��,]��7nТE�O�N�*ULc	Ls,ٝ�a߫���͍�E�R�l�L��ܯP�B�0p�@F�a����HZ"""�^*�I��l����m�w�ʫ��ik���Wc��~EDDDDDDD�����W�:.I_��p�k�.z��i���7�`߾}i�ƍ6����5kƨQ�����@�=R��s�Ǟ={Le���.\8#1
@�~�R�!��֖~���{�n��[:�?�<����		����]������TW�jU���駟�-۽��=���III�ۻw/qqqԬY3U�SO=���>HV�ю;����Ύ��_�ڵquu�…��վ}����qss���w�����o�����Ύ���[�/�s=�{�~���KD� ������M666�?���`fϞ���'7n���� IDAT�v,�z�����_���߆�}��~��T�B"""8x�`�}�.]�k׮��3�ۈ������������H�eo��Zll,�;u�T�u�;w�J�*��W_agggV��i�}��e*Z�(ׯ_'>>�bŊeh���'Iܯv��f��W�R�Te�	 ��9p�@F���Ç9|�0���5jD�֭iժٖ�^�q��֭[��%�Ξ=��ί��ʯ��Jtt4��!e���������/�ۧ��S�L!$$��͛��CBBL��<�X-1^�Z�jY��x�����U��""bY�r���y��7�EDD�A�nݨR�
���*�7���bŊ֎%"���m�ǤI��0aիW��~3��z��-[�h�"=z4U�V��ի,Y���www�̙�7�`0p����jժq��N�>�jb��s��V'�ܡ�M����̶[�l6l�H�"̛7�%J�j���d|ŊJ�*q��1���2tc9@JJ��D���x�4'l''�ϸ�CFt�҅bŊ��7��_��ʕ+Y�r%+V��3=5�a���a�_F�={��e�>��
����M�dUVΑq�iM)^�x�}v�ܙ/����۷s��e{�1._�̎;����s��f�k���_�H���J�Js�����Ugg�� "�_]�r��/f�竈�����'<<�N�:Q�~}V�^MÆ
�KD�"___6o�̩S����K�����w���ѣ�V�-T�Ç7m�*U�˗/���E�r�X�~=�7fϞ=DFF�z(Fdd$M�6͞��������������H���v�G�xC�#G���K�u�ĉT����2a�lll���/quuM��ċ�W�����P�?���_|�#F�ʌ7�߸q��>ׯ_7��ڵkǺu�طo�'O��ۛg�y�3g�0a„�0�/���Á��f��u��1t�PΞ=������>c�ܹ�ر#S}f�=h��ʍʖ-K�ƍINNfժU�Z����d�5kF�2eLm�s��<h,i}-ew�G�u$"R�W3�Z������Hv�X�"���~���jՊ~��ڑD$��� ""����̼y����dɒ�������������mѢE	��LJr��aggG���iѢ�-2[�b�ȑT�P;;;���x饗(\�������GѢEi۶m�XDDDDDDDDDDDDDV�[�R�JDEEq��!�7o��n߾�;�í[�>|8mڴI����h~��w�֭��cw�ؑ��@����O�)�F[�n��͛��ؘ�*V�Hdd$G��Y�f��9r䈩]v*_�<]�v�k׮�ܹ�>}��#ٲz�2*%%��K�кu�t�Μ9�O>���ݻ��]�x���w�bk��ܦ��#777"""8v��'"=z4�>�v��޽{Y�j�{�fŊ����+;�j���+��ȑ#�h�"U�q%��ew.k}���������{��H>U�hQV�^ͨQ����y��׳�����c�������_<���f�ŋgĈf=��]�v�k�ά�H�"����`�Ο?O�
8�<G��_�~^WDDDDDD 88���`k�)p
܄��͛�̙3iҤ	vvvf�6l`�С4oޜ��@S��I����ᥗ^bРA����Att4!!!�&\������T�P��{����ФIBCC2d3g�L�	�.\`������һwoSy�f͈��d�ܹ4i���Ɩ�w�2�|7n�����f͚q��y6oޜ�)�/����ٕ-��/����KN�8A�J�hժU�mO�>
@�ΝS���wbb�����sԮ];"""X�`M�41��c0���o���M�6/^��Ǐ�v�ZN�8Aɒ%SM(�αZҶm[>̜9shڴi��j����������j"ƣ�:)hN�<I�J���/p�~��vvv|��ܾ}[�-D$Wj֬			�;�v��Q�hQN�>��ɓ�S�N����[o�a����=z4AAA�+W�=zdk_""""""��
:����EDDDDD$��;�z����/�����#G��z��>|���׳r�J���9r�i��۷��S�zu�N�jvc�%���,Y��+VP�L���(R�G�ᣏ>R� �駟ҹsg�����/���o�M�-(_�<w���̙3�ٳ�o���+W�0d��}�Y�>/^LXX`ԨQT�T�ӧO�����3={�|�sةS'�̙��?~</��"NNN���1i�$��'�3[V�_zRRR�t�ǎ��g߾}�����g����~�˗����L�4��C�R�T)N�<�ܹsY�z���իW8	!+�[�n,X��}��1x�`�N�ʕ9u�_|��~���x�WX�t)&L���96ִƿh�"~��gz����ѣquu�̙3|��W��%��\�&>>�-[�Ю];�޽����#�:)hN�8�j�����ONNN֎ "y���{�7""�:�b�
>��3>��3��R�Jѷo�l���ٙ?��w�y��Yºu�>}:�
�־DDDDDDDDD�`8s����֎!""y�����#�In�Eٲe�ꫯ4h?��^^^��|���ԨQô=c�bbbx���<v\\�+W��?��c���̞=۬]�:u�߿�Y�SO=Epp0�ԩS|������cȐ!6̬��'�dڴi<��۷�}�v�zGGG�M�F�
�̟Q`��������[o��/[�,cǎ͑lY�~�rqqI�����/��~���ҷo_

"((Ȭn���㏜:u��G�R�|�t���sT�Hf̘����7of���f�L�<�1c�<p�H�.]X�t)W�\1m��X-)Z�(�f���ߟ�{��V1�:u��I4Y�U�V-���<x��,..�~��4'O�L��(��6z�h*V�ȦM���?HJJ�lٲ4lؐ޽{��Od{�u��e�L�:�A�Y\!VDDDDDD$=ӧO'88��1DD�kG(�BCC�vɣ��;k
܄�-Z��?2w�\BCC��pvv�v����Ӈ&M���?s�L���r��̞=�Çs��-*V�ȫ��J�>}pttL�����6mbժUlٲ���._�����˗��Ã�={R�Z5�}�nݚ���3{�l~��'.]�D�ҥiܸ1������5�㰤hѢ�X���s�m�6Ν;ǝ;wxꩧh۶-�����˱l��~鱳��x��<��34m����ۭ[7���$66GGGj׮M�^�hٲ%�+Wf�ȑӾ}�/+�nݺ���̘1����s��%�T�°a�hѢcƌy��ԩ���qqq���Y�6�ǚV�
60s�Lv��ɥK�x�g<x0�:u�8�"���L���㉈���۔)S�T����DD
��/�{�����<PDDD����|||r�K�ѧ�������?>>>�D("b
�����?�
�""����pl��'���
ӦM����o%�{�E
�3g�вeK�y�T+5ȣ7|�p�M�fڶ��g�ʕ֌%"�H���<p�%ɛ�.��aݺu�~L���>�����LDDDr�~""���M�m��oK�����Ϗ�S W��j֬Ibb";v�r�ʩ�-[@�Z�q2�4�B$�Z�~=:t�r�d�ƍ֎ """"""""""9�̙3���[;����R���֎�/h…HU�vm���2d�>�k���ɉ�gϲl�2�ϟ@��ݭ�TDDDD
�0("�{�m�ִ򢈈�����HAt��q�U���		!,,^��GMD���P�JH"""�ӊ�C.D򨀀z��Att4=z�HUocc��ѣiР�҉������HALpp��c���d�����#����Hy��wٳg���Ç��7߰l�2o��nnn����<���}��VDD��	y�H.D�5k�i�&���[���ǹs�s�eʔ���???�ԩc�""""R
2��DD�1c�#�s�Сt����+""�*V�h�""""�C��ٓ�u��Ǐ�k׮�+W///ƍ����qvv~�1EDDDD$�p!��=�䓌7��1DDDDD�lܸ�:X9��H�d�>l�	"""""""b=���VY�A2g�…\�x�nݺ�ʺw��ҥKY�p!�b:��&\������H��6m���֎!"R �mۖ�Ç[���ӧl��EDD���AAA֎!"""�'�����ޝ��p�Gd�+�%�Pѯ-��S
ըP�T�jM-��6��U�ZZԾ�	�-	Kb��%�$�
b�,��������,7��
>���#�̙�ϙ��d�|�aѢE>|�gϞaii�g�}�1(O\\˖-c߾}<x��~�:0t�PJ�.���$�lܸ��s�r�����pttd�ر��^�x��e�سgw����+++�u릚�S�V��O�<��~ٲe�?kkk�,Y�eҊ��ڝվ���ظq#-Z��r�ʪ:U�V��֖�72p�@ʔ)�ۉB!�У���V�j�0
՛�f�;�p!�B!
LZZ�n��wޡX�b�G!�B�*��UӿC� �B��z��!�
"66VUɔ)SHKK�k׮<{���?����hU������9~�8�V��dɒj�6lO�< ))�-[����<==X�p!����~JJ
gϞ��ٳ������s������vk�{�nhժ�ƲV�Zq��q���CϞ=u�I!^5����]����P�_�NZZ�+W��Ύ��ӥKC�X(���HOO�۶�155�B�
4mڔ���ӯ_?�ǡg4mڔ�M�һwo7n�e������	�Ν;��:m����˙0a�=*�x.\��ʕ+ٿ?������S�L����ر#C����R�ͮ��9�&�[
!�B�s��U,--	7t(B!�B!�B!�B�֮]Kll,
6��Ϗ��駟�j�*U�?�����h�W�ΪU�8z�(+W��Z�jDFF�f��mתU???>���;���W-���`��=z������i�&@}F��'Oj�\Q�N>�O?���vg��Ç���jlW)S�!���޽{899Ѷm[V�X�ŋILL$99�[�n�e�>���t��ӧO
�k#99���0`...�x���a�V��;}�t~���l���ӧO'00����B�0����Ǐu�III�5�F�1g�N�:�ӧOIKK����?~�iӦQ�^=���RRR�C�Y�:^�.(^��n���1]�B�	"##���2p$B!��q��}*U�d�0�B!�B�����Uy�$}


�o��f͚xzz�f�P(��������q��|���xxx�o�>F���΄	T��߿?�V�R�x[�dI�={������888ЫW/z����������}���t��2�$3e�f��B�n�޽K�V�����Z�j|��W|���Ԯ]ccc�^����/�f�"  ggg��������Ÿ��Jll,[�ne����t�RF�a�_ou��%((���d��g<����`jժ���
���0kCRR�;w&$$���+͚5㭷���ӧ�:u
///֭[��ٳ�����Ĥ��+
�H�k��PPPAAA�C!��M�
(_���CB�\9y�$~~~�<y�۷o���FŊiҤ	�z��>0t��BI���������iذ!666899i�Mq��8�<����{��-�$CcccJ�*E�5hժ�w��v�=��<���ܹ3W�\aǎ4l�0��ϟ���kkku�_Vm��1��q۸q#3gΔپ���IAv2�ťK��_���e>>>�{���=�{�.�ЄB!�B�\�����Wq��m�e�EFM�6U�NF���-[@m$�c���?FXX�/���WWW���s��ࠫܶ[��P�L�eJ�RG!^7�&::���۳u�V�����gҤIt�ޝ�m�’%K���0Pį��ŋS�jU����9�fٲe�pQ����?>���Qc�������>c������7n!!!XYY���QQ�Bqtt���ggg����8q"s��5P��M��&\�3�B!�PI�z��B��|��7���h,���a׮]�ڵ~��wJ�.m�(_M���'$$���"##�}h��o�\�����4�>}JDD�[���ӧӽ{wC�V z��Ɍ3����~ȱ���=z�(��
WnF4o������������,\��M�6���N�>}����I�&�T!�B!DQ���JC6`dd���3&Pd�q�bm��ԩ���8p�m۶��?��h�"֯_ϨQ��ٳg���jv���t�>���5���ʺŊ�X���
!���L�6�]�vq��]*T�@�����:`Rn�?�Gz?y�$3g��<y�w�y&M���N�СCR�R%������Q�F̘1��Ç�|�r����/��/���i�cǎxzzj��+==�'N0q�D�=���9m۶eҤI�����]�r�9s��͛7)Q�VVV8;;3f��m�5���z�r�W�^<����r�8]�v�=zp��E:t�;�վ���N��޽{y��1�5���k׮j�F�Xt=>��ϼ��/����_k…����^v�N�:ϸ^�{@���Q^c�v>/\���e�(]�4AAAԮ];�cмys���y����?>ԩSGk{V�^ͯ��ʕ+W(_�<:t`���4j�Hk�jsV�iQ�	�zm.���KC� �jlmm4h���B�B��G�BE�����Ջ�7oR�J���qpp�F�s��MY�t)`�С�[�cccC��J�U�������h��599�#G�P�zu�hw���A������.]�Ě5kػw/�Ǐ�\�r3���Ht�ޝ_��m۶��w�aff�e��ϟ�}�v�������:K�?Eef@k�@bb"�'O�W�^XXX/�&M����/%J�(�0�B!�B�U�R��7o�m��jժq��5N�>������������uU�lY���qvv&""��{��v�Z�Ν����̌��HOO'>>^�I822R�^nۭMŊ����ɓ'T�XQmٓ'OTu�"�:�'�|�ӧOUe111x{{���ǖ-[prr�i���Q�]���?����4UYtt43g�dϞ=:t�R�J�~�z�N�
rܗ��666�����qqq!11QU���v�Z6o��֭[�vr8v�$%%���Ď;ؽ{7�e˖��'N���?$..NU���̩S�8u�k֬!,,�*U��%��
�)RRR����ݝS�N���}AAAt��Mm���p�u�Ɵ��c�YŢ���|��+(Y�$���̛7Oc���?���t��!�v�u���M�\�z5/^�`���9&[(�4i���;K�.e�ʕL�6M�ί��ʄ	T�ccc���a۶ml޼�O>�$�m֦(ߋ��i�J�&0tB��')���M�6ݳBE&L��͛��ٱk�.�Bݺu177��Ą:u�0j�(6o�Lٲe9v�^^^������@BBǏ׺<,,���
7�BR�xq*V�H�V�X�lC�%==OOO�#��*U�D۶my��)�w�ζ�]�x��)�ڵ�R�J��04[[[ը��?�W��޽{���WU֯_?�ݻ��ի
�B!�B�]�֭�={6111$%%1k�,lmm���OU���~ӧO�̙3���r��~��ڶm��u놭�-�7o&!!�z��amm
h��ƍ9n��`�֭$&&͌3��nm��_�>�rT�̔2��B��Ç�իqqq�7�+W�����ѣG2d��ɸ��r�������5��O��Z�b�
�W�^eذa���1|�p�^�Jrr2�nݺ���3s�LU���P�t钫6���ѦM�وbbb�۷/���t�֍s���sΝ;G�n݈���w�����hݦ��;�1������s����HNN��V�;n�8����/�r�
���$$$��~6lȵk����[Fy=������9��+W8{�,O�<aΜ9yn��ǏquuU�s��y�?ΩS�rZF� IDAT�С#F��1Vm����z>u�����:t�ʕ+\�rEmم����}���,YR�y�g���g����76m��:�֧O����.���ﱷ�',,���$Ο?���3ϟ?g��ܿ?Wm֦(ߋD�xmg��7o��ΆC!(^����
!�V���DEEQ�n]C�"�(bn߾͢E�		!66����ӲeKF������ị̆؟={��K�F\\899�����ĉ���P�B-ZDٲe�܇��5&L`ҤIlڴ��>�L#�ŋs��<x@Ŋiݺ5�F����2�vEEEq��fΜIxx8fff�hтQ�FѸqc���]�Ɗ+8|�0w���ܜ�5k��舛���6�[vt=
֮]���U/#3ڿ��^v	-y�~t=���&��9��o8|�0�ϟ'00�nݺe���ϟ���Ş={�r�
qqq�)S�&M�0t�P�Qs#/�Ddd$,�ȑ#<}�kkkƎˇ~�5�={r�|||�}>��㣪��fu���������CjԨ�g�}���[���%�����3ƒ���1b��Ѵlْ�˗��ɔG�L/^�`ٲe�ٳ�;w�`bb���ݺuS{���z			�\���� �߿��o���̐!CT/3���S\\7n�E�T�\YU�jժ��ڲq�FH�2e
�	!�B!�y0x�`���8s��(�_|��A��o�>nܸ����Z��5kj��ƠA��>}:3f��H�h֬���z��ңG,,,رcG��tpp��Ϗ�~���~�
�V�Zi��m���u�ք��p��9�8Ν;�-E!2Z�t)������S�󮽽=����)S�y����d�;,,�)S�/�m�����-Y���ϟӧO/^�*o۶-6l�E��[���~�	�/���w��s�,X��g�����X��c������燣�#���g�…Z�ծ];�X۷o�����СG�Q����0k�,ʗ/�L�spp��LJF��m�6-Z���2���(11���(|||T�o�;Vk�I�&ѨQ#ջǼ�o������ҡC�u�6mʮ]�h۶-aaa�ƭ-��]ϧ��3srrb�Ν����g���u���Ʀ�|*I)�����|����
4`߾}��y6l�_���qɒ%L�<Y�}*��H��v�!�BaX�?�A�4h�С!��'N����ƍ�s�)))ܿ��۷����B������gϞ���#RSS�y�&K�.�O�>$$$��nݺWWW�É���ٓM�6��S�߿ggg���/�޽Kjj*w����Ϗ�]�r���,�y��i���KXXϟ?��ӧ�ݻ�>}��V�̙38;;�a�nܸAJJ
qqq�?�����]����2������D��Ċ��ߏ��Y�S��g����P�X1�޽{�����ӦM�ĉ<~����4?~́�߿?������rM���ҭ[7v���ÇIMM%""�aÆi�<()W�aaaܼySk��7or��1ʗ/�����۪́T��>iii\�~��S��d���D\��ٜ8q"�ϟ'11Qc�v�{.dŊ��iBBgϞ��VK��m���d��ڵk���III�Ν;�Z���c���ŋl�ٽ{7			Z;q�jՊ����٣� �B!��s��I�@��bŊ�^��N�:Q�LLLLx��w�9s�ZG�2eʰz�jz��M�ʕ166�r����׏5k�d;NVz��)ShР������bee�����(��Ǐ�z���8��q��ի�ʕ��ԔV�Zi툗�vk�G}Dɒ%9t��v:D�ҥ�ر���C!2R:u{xxh]>d��l�9>y�~������G}���H��*?r�H�ummmIOO��ի����DJ�.�CK�/g�W:8+�+�ĉԺ��Q�4���}�>}�V��;�/;�{yy��백�!==�۷o�-���{����4�J�,�{��ԩSIII�믿�k׮Z�o߾�FY^ڧ$9N�8Qc��ŋ��k�N����z>u����Ν;�ʕ��%\�u���Ʀ�|*1�+WN�X�����.�<y��{��1*�Q^�{�(�p!�B!
�[o�Exx��#n!^_�?fԨQ������ξ}����`�����Ӈ��Ǝ˽{��֋���?~�jyƇ�7o���ӓ��4\]]			�ҥKlܸ�Z�j�ҥKU����|�A��`jj�����t���g���$%%���Ȯ]��x�"�v���ё�����KՔ��M�8�������ùs��f͚����p�B��?��3�����ۗ}��q��%Ο?���7u���֭[̟?_o�e����صlْk׮q��5�e���ܼy;;�,;��w���¢�l��Z��%K�p��y�ի����ϟ�…lٲ��M������K�rM<}���cǪ�ٽ{7/^dǎ�l�2ˑ_LMM��OHOO���Wk___����ڵ+&&&zm�6>T��K�.��ҦM�������r��Y)����k������3���M�������ѣ<x�o���M�6�\o���DDDШQ#���9v�>>>4i҄�Ǐ�}�v��/;�(I6�FwS�tI�B!�B!
K�j՘>}:�����ѣ�[��?�P�^�r�0a;v������k�d��G��;;;�~�z�9‘#Gشij3Dv�ԉm۶q��1v�ޝ�>J�(���~�޽{9r���ϧR�JZ����]�T)\]]9}��Z�۷os��i�6S�B�EDDZ;������,��СC�v�u��eÆ
�-����:��69u��
%^�crfJ�[f�fK/U��Ơ9J2�ѣG0`5k֤f͚<???�$��Ɩ�>�_f���ԭ[WWW����={v�u���}�;�-Zh]'��ز�%/�G��k��jժ���
�R]�O�<����ԫWO뵨(��\W��M�T~�����c �$.m���x��E���QQ���!	9x��!�g�fРA���oooz��M�޽
��]�v1k�,f͚Ů]��B!�Bhذa<`�ȑxzzR�V-���hڴ)ӧO��͍��8֯_��v��Ù7o�rjvggg�2ooo����ҥS�N�F�/^�-Z�������h�֟�IBB���,^��z��abbB�z�X�x1���<y�u��i]����g���4oޜ%J`gg�J"9u�Z]��ĉ�U�ŋ���;;;UҀ2��>b�H���@c�峲� ���q.,Y&�(�m���9sh޼9��昚�ҤI�̙�`^��M�6���#Z�l��ŋ�[�.&&&4lؐ5k�P�~�,�׳gO�l٢�p0--�͛7���g[�ٰaqqq8880�|�ԩ�j˪U��l�����Ϧ����֔.]�*U��x���V�+�� <������LJG�ѫW/N�<�J�Х�2����ӱ����ؘ:u���?�m<�.]^������R��B!�B!^m�
�jժj�gzyyaaa��W!�#���gUoŊ���P�L�m��[o��Q�ٳg@�g�P����<=55U��!;��𕄻��x�����s�o777���h֬����͛�Y���={ҰaC����[F�=���_���\�r///�ݮ�Ŀ��O�/���ʗ/�mYŒ���Ե�6NNN$''���ڵ����lg��½�u��ش�Okkk�D��:s����Ӻ����Z�\��=,/��HI�����9~�8���������#C���…x{{3x�`�����W�!�B!�(J���j]ާO�Ө+���;v,iii�k׎o��Fm�2�R�QQQ����ʒ���vr+44�aÆi�.tذa8p@�ڎ���?@�!��A��ݝm۶q��ղz��ő#G�[F�8JBž}��n;�����_��\X���ru��DEE�F�ɨF���rN�rM�ݻ7�u���1bD��kܸ1u��%&&F��:t��w�bmm�{�跭�(�������ؘ�Çk]O�q�g3��r�nƎ���aaa̛7�>}��j�*�s��z7n�^���1��{��@Σ�=|�@mN�R��B!�B!t�y�}}��+Q�?��۷o�Ν;ܹs��۷��?h'I!ěC)����Z;�+_iii�^�p�1c�`dd���iذa����{��m��f����˗�X���{?�Y�'O����x�Ė_�~�)��7ׯ_gժU����:�GEE1v���-?篠�}�:ʲ̲�VN�z|t9�y����X���oN	�}�� b�ر#>>>:�����uf5�ޤĘ�����{�(�p�eԸ)S��q�F������?�%))�ЩS'*U�D�ʕqttd����� �B!���t4������J�룏>�ڵkYn��ӓ[�nQ�V-~��7����_���ロ���wr3�LV�x���)�(+�e�m$s%$�#G�^����W_ѦMڴiÄ	ؽ{7)))z�-#}���իS�^=N�8�:�qqq�<yKKK��B_���8���D �#?���J����ܹs4h����ˑ�r#/���˗�]'�h*�����|H�|V�g�߶j�\G�5Һ�I�&9nCq�gSI�z��<yR�+���ЩS'�2e
�7&))�E����Ė-[t���5��KG###�$��eJ!�B!�B���7o�ȑ#�={6�g�fԨQ9>kB��Rf��8PWn$%%ѷo_����f�����
�o�������ŋ�F���_��ӧO՞�*�<~���u�;�VO_j֬��Y�r%�.]bǎ���I��-�� �}�����[�:y}/��㓛��6m�P�lYIOOg��ݔ*U����g������(�؆���1K�,�����ӬZ��bŊ��NV�]XX����(�"Q0���޽{ӻw�,�+n666+V��
-W�n��Ç�2ޜ��x��![�n5`dB!�B�.���dUoӦM���S�T)�-[�uz΄� �3V(�𣢢rU�	EI�6"9�י^�\��2�An��ٓŋ������l��ȑ#�ԩ7o��[l�)HIIQ����A��Ҳ��B���8�\U�R%Ǻ���888���СC��?

�y���\9M	��4Њ�ݻcllLpp�*އ�w�^���U��+��Vm��g5���)�"���l�(QB�}
�ʖ-���3+W���?�dРA<}���s��\OI�ٱc�F"�ɓ'�|讨X�"�}4$�L�#�B!�B�B�ߩ������ʜ9s�3g���3t8B��H�Ν�6m����}||022�i���9s�=z0iҤl���r�J�e�Ν���KKKU��Oǎ����O�>��z�ܺu�ٳgS�X1Ə�*W�5k�ƀZ/^�`���@�#�����###Ο?���U�Ve��-�� �}�~�)s����(==]����r|t=���צx��t�ؑ;w����ͽ{��СC��-�:ϊ��y�[ݺu��� ))�Ν;�{����qrr"99�#F�fz�lΜ9eiii̜9x��=��ڬMQ�����'\d'c"F�>}T�3&i������ݛ���J�޽�7o��:����\����̢E�8p ���,\��G���O@@�5�B�
���~�5J�B!�B��A����DEEe�u���u###�:u*FFF̝;W5jIV���mF-Z��СC����U�5k�W_}�*S:ng5�ӧO�b˯N�:�}�v:�̙3qqq�v��ܸq��S�Hl�9)��߯�oN	�ڿ���X���s�l[�$��S�o���ѣ�y�&VVVxxx0c��.]�޽{u�g^�����i�*U�кukRSS�����Ϗ��TڵkG�J�Tu��VmrjKV�}�U�
�]�nݰ��e���$$$P�^=�C����䶞r�����ŋ�����~��wlmm>|�����ƍ������g6Qʔ:B!�B!�B���#GR�\9>L�Ν9~�8III�߿�aÆ1p�@�/����U�l߾�?���������9θ;b����X�z5��=w��%!!�}���f�pssS[gٲe����ҨQ#������IMM%11�s���믿bkkKll,�&MR{�2b�ʔ)����ѣ$''A�=8p�%K����#��PI�sqq!((���xRSS9w�������[^�_A�K�����W�Ξ={pqq�…���AϞ=9z�h�b����|�Z?+J�ǔ)S�>g�0��(��)��4�Y�f�����۷iժ�&88����Jll,{���͍֭[s���&U(�ӧ/^$99�3g���'�J�ڵ5f�Ȫ���{�(�p�OC��B�
�Z����XbccY�b*T�/���vW�\Ɂx��9Ϟ=��L�<Ym��Ç���D�&M4�oҤ	IIIEjJ)!�B!ěM�M�ԩS:����sƌCbb"cǎ���1�}\�|9W��O����U��={x����5kp����>}Z���T�V�^�z1c����Y�|9�����-��/3[[[J�.MHH���<x��%KbggW(�ϭb�^>2�6�@��y���Ɔ
��G6��?���ٳg�ƍ���GGG��\r3�J^�	�c�ٳg���ն2�ի�*�b��̀��1�l�6J����̴�Sq�!�
4�3fЮ];Z�l���'͚5ӹ�������9s�`gg�G}ĺu�077gܸq���l*=z�k׮�n�@�t�JY۶m��x!�B!�B!�k�z��x{{S�D	��݋��%J��C�,[����d�ϟ���~^>�.]�4FFFZ����cѢE��/�P�jUJ�*Ň~���iٲ%�~��Z\����߿�z��q��U<<<�����Ą�%K��{�1a�bcc�2e
?����5j���333�mۆ��
fff��ذm�6������R�Wʏ��w�}�.ЩS'J�.���	��w�z���[^�_A�K�ʔ)æM�(U�[�l�aÆ���bcc�_�ł066�)��]ϧ������cddDtt4����¼γҼys�e'լ���)����;�/^�f�:v���o����	�*U⣏>b�ڵ���3f�v�ڕ�l!>>>���bffF�ƍٵkU�Ve۶m�������{�(�p�
��3~V�*U
Y�p!/^�`�…$&&2j�(UƓ�N�:�����7?��3�+W�޽{�ܹSU'<<�:u�h�oee�VG!��0ݻw��������i߾=�㲶����?VVV#I���/\�x��>��Q�Fe�{{{��]�|+++ڵk�*kܸ1mڴ��|��Z;�+bbbX�|9ŊcȐ!�re{K�.�:]���t�͏v��aee�u���~"����̌��iӦ
���c���<x�-[bjjZ(�ϭ�e��;����{�s���ʕ+ԪU�:d[Wپ{���V�Z��>)))����ԩ�rpm�=�X�"�:::R�lY.]�Ķm۸r�
�˗�H��g[��ر#K�,�z)��,�qe5�pa�7���'O�8%tA�ѣS�L�A����bjj���nnnj/�r[�t�ҬZ�
WWW,,,066�lٲ888�f���)ƏO���166V����GQ�dI��.:t�ҥK��a!�B!�B!�ȉ���O���ݝw�yʕ+Gǎٳg#F�P���>���			��?�|�򘚚ҠA�N����5:44jԈ�gϲl�2:w�&&&���cmmͰa��H�Pt�ڕS�N1`�,,,(^�8|��g���k}��e˖��ѣ|��w4lؐ%JP�xq�֭��_Mxx�Fgj}Ʀ�+yi_�֭9}�4�}��j6oެ�	%��V�����|��kcaaAӦM����`[�u�ge���t�ܙR�JQ�xqjԨQౙ��2o�<.^�ȷ�~���-e˖��ؘ���cggǤI��r�
���[�	�2q����R�xq�ԩ�7�|�ٳgy�tj�6E�^$�(l�{��U���9YiԨ]�ta�ΝL�2�˗/���2���ʮ���f�С����?~\���իW����T�c� IDATf��)u�B!
Spp0nnn$$$:!D2`�֭[�������Ǐ�A�����c��lق��1�ǏW�̺u�hР�g��q����~�z6o�L�J�pss�T�R�>}Z�P6�ӦM�{����9T�V���nܸAHH+V��ѣG|�嗼��j�\�v-aaa�1�o���Z�jq��u~��W�;F�%8p`��a׮]Y�d	L�<�f͚affFTT����_b��c��ˊ���v�b޼y�υ��ܰ��%88���Y�f��{�q��]֭[������KKK��={�u��q��!�/Ό3r��Z�j\�~�_~��ѣG��[o�ҥK�믿T�?~���\}��e�ʕ:tƍ���%׮]cΜ9���̌.]��a��N�
���MLL
��Y�͚5�8q�!C�0a��֭ˍ7��߲��"�q�,Y���xv��M�N�x��&&&�z��і���쌳�s���^ٲe�ꫯ�ꫯ��שS'U2��T�R����r�Jn߾M����}�6�O�fذay��B!�B����III1tB��A�Dᱶ�f�ʕ����ѣ<�m۶:��kff�_|�_|��}6lؐu���~��r��\�rL�>��ӧ$6]�_N�����^�@�v�Z�r%����"O��z|t=����*��[�u��sm喖�Zlխ[�_~�E��;?����q�ĉ\�ͮ�Y�_��EB�޸���ү_?Μ9��˗�Q������7n���A���UO�<^���L)S�!�B���h,--)^\~�B��J�*���o�5�#G�УG�:?��
6T}V���x�b�I���8KKK~��'���;/^��ŋ��5mڔ�Ç��ըQoooF���k������ؘ/����cǪ�W�Z�y�����App0���j˕�8����1b�������dРA˫T��65�>c���J���122��͛@�.������СC\�~�>}��-�6m���ٮ��<���%K2w�\���c:t(���xyyi${xxx�s�N�]�ƙ3g�ʐQ^��R�J�`����صk�v�R[g�̙L�81�đ�={�a�����O�n�6�K�fѢE���s��A<��|���Z�v�W�F�8v������B�o�WˠA����ˋ	&��充�0ptB!�B!���N�-�E�����CB�"J�,Ibb"�/_�^�z˕Yԛ7o^ء	!�N޸p�g�Pf��eF��HOOW�Ț�Ù;)�x��bŊ�ʔ�d,S(e9��*�BQ�\��cGS!ě����;w�t�RBCC��>%J��q��|���i�F���7tއ�����,^����p�Y�&ݺu�/����Tckkk���c���\�x��bllL�jհ��g�ԯ__�>?��Cv���ŋ9r�<�bŊ�nݚ�ÇS�n]�ۡM�ҥټy3K�.%((�[�n���B�5�ر#Æ
�B�
���/+�+W�aÆ�?�z���㼾������̟?�'N������
|�9&\dfllLٲe�]�6m۶��Օ��~;W���333V�ZEdd$���4nܘ���`ii����s��9n//�D���ٹs',����<x�:u�0v�X�8q��i�3jڴ)VVVDEEamm�5�J�m�*������ǃ�]�6t��Uk�E^�5k�'O��ɓ<��J�*���}�Uckk[ ��6�EQT�D	~��ƌ���d���̟??ǟ1!�B!���ѣG3z�hC�!�B�;;;8@�>}�={6vvv���q��UV�X����
��J!��7.ᢠlذ�7n�:x{{��6jddDzz:����,YȾ���˗���Q}�x�"��Ȇ�˗'66���8ʗ/��~\\���B!Da���֘�K!�k�fƌ����}�hт-Z贎��)}���o߾y�gݺu�3gN��+�r躼L�2�?^k��ˆM��ݶ�o�n��f���
K�.�i����ڶ�駟�駟j��ղ�b���U��g��(W�oT�\9�m�ٳ'�:�lkV�ժUcڴi:����jԨ��ի����o��C���9r���mԨQ4k��Q	!�B!�0�������m�0�BMzz��CBqs����?$<<�?�Pc���3f�����BH…�;w4h����1u�Th޼9�5�lٲ<y�{�ұcGbccU�!i�t�R���K�ԩ��˗Y�l�[�Vձ��$66���W#����U�B!�(lQQQ�����a!�BlllHJJb�޽Z�3lڴ	@�D��xUf�(h������:!�o����j�0�Bd���c�D`bb������B���ٺu���B��5k�ٳg�3g�w��ڵk���P�jUڴiØ1c���7t�B�#I�ȧ��x����������ؘ�#G��7߰p�B�̙C�R�hѢ����[��u��ФI�,�[�\9<==�ʬ�����U��5k�ɓ'����aÆju###��#�	!�B���x�ܹCݺu
�B!�q��;v�/�����ƍcff�͛7ٴi˗/�_�~�T!�B�ñc������С!������!�"���E�B	)))�p!�ȵ5j0o�<C�!� 2�(o|�E~G�X�b<��Ãʕ+P�re>��s.\Ȋ+3f�}�Ŋ�ȑ#<�����õnw�ĉ,\�����r��ѦMz�ꅉ���N�֭���?���qvvV[���dɒ�j�*_�B!��UTTu��1p$B!��OOO@DD�XnddĄ	���3@tB!�� �����BQx{{ӿC�!�B!�B������hK��X6f�ƌ�Q�]�v�k�N���ܜ!C�0dȐ�P�ti����lc+Q�]�t��Ϗ{��>�ݻ�ŋ�ݻ7����nC!�Bߊ+F�nݰ��2t(B!��Y�b��֭[���P�R%lmmqss�iӦ�S!�B!�B�F.]�D����.���!,,{{{z��]��	!�B!�0�p��֭d�Ν����s�N*U��'�|b��B�&jԨ�L!+�B�f�V�ʤI��xEx{{���b�0�B�\������aY���'44��a!�%���xS|��ׄ��p��I�e���,\��M�6���N�>}����I�&�T!�B�&���W���9�F��_~�k׮�߿��333G'�B!�B!�$vvv�l!����₝����(��;���/...�E!^{����A�"!$$Dkybb"�'O�W�^XXXУG&M����/%J�(�0��H��#�Bd$�/�$\�6lH߾}Y�z5����aÆ�J!�B!�B�iF���ѣ
�B!����///C�!��=ooo���o�0�+���@����իWs��=���*�ׯ6l`��Ռ9Ҁ�	!�a�����!!��-I�(b�:5h�.]�ҥ���B!�B!�"{III̟?�ѣGӿ���
�B�3I(B!�ț/^�l�2���Ý;w011��ʊnݺѽ{w��			�\���� �߿��o���̐!C055�K��ɓ'���c�ƍ�hтʕ+��T�Z[[[6n���)S�L!�Z!�WWW\]]
�B�Z��!��J2�B���k�va7nAAA�C!�H��'O����Ǿ}�������O5�����tXB�J��ąB!�n�…��矪�)))�={��g���]+99��Ç��{��V�ZŹs�X�p!Ŋ�r?�w�&!!�V�Zi,kժǏgϞ=���S��B��/44����:!�Eԫп�U 	B!
���/...�D!�x�(��uNNN�A!�huNLLd�ΝlذA��Q�re�y�n޼�����"�	!�x�lݺ��!!�ȇ���V�j�0�xc����`�lmmIII!  �3f�i�&U���뉈��Q�F|���XYYq��u�O�����پ};ݻw��ɓj3[(>��ᆱ�Rv��aI�B�qnܸ����<�B��U�_򪐄!�����K�3B!����yu���A!�����̆
غu+���|��,^��=z0r�H�]���p!�BQ�����v�ZBCC�~�:iiiT�\;;;L�.]b�022 ==]o����Ԕ
*дiS���O�~���\�N��R�.\��ʕ+ٿ?������S�L����ر#C����R�]�|9&L�ѣGˊ�B��Ą��3&.�[ɒ%y��^^^DGG���@�^��ի�Z=eF��ӧS�Z5�ԩ�?�@���	�{��Y��ҥKԪUKc�rQ�!ěHF0B�ѫҿ�U�Z'\�7�q��:!������!!�B
+++C� ������z���9r�
6���������c�ԩ���[F���ҥKԯ__�2�������w�ޅ�B�F�w�nnnj,�u��n�b˖-899�a�ʖ-k�(_?������H`` ~~~���J��k,))�����%K�����e�?���?~��3g2v�X�O������?t�P�mK�7cǎ��$,,���0/^���;��������ݸq��yddd��y��!eʔ�X��)u�B!�B�^ۄQUQ�(�tu��D!��٫8"Mǎ%�T!d���Q#uq��6l��3���a��Ѹ��R�vm}��Z���			�:Rhxx8.dӦM���ӧO���iҤ�"B!�,w�ޥU�VDGGS�Z5���+>��cj׮���1W�^��חY�f���3���/�ھ:-�f
HMM%66��[�2~�x���X�t)#F�0@���%%%ѹsgBBB011a�����ҬY3�z�-�>}ʩS����bݺu̞=����&]dEf�o���*3[��u��	{{{8��m��X�h�ׯgԨQ����g�ٳg�.Wf�іħ�e7�B!�B�<5BaP������8!���Q��|999���d�0�⍔�������H'�����h-OLLd������z��I��D���B��<x0��Ѵoߞ�[�R�|y����gҤIt�ޝ�m�’%K���0Pį��ŋS�jU����9�fٲe�p�7n!!!XYY���KӦMՖW�PGGG����ٙ�� &N��ܹs
�� �-[ggg������`�޽�]���s�.,,,�~�:;v�P�����+Ó'O�X��ڲ'O���!�Pw��=���(_�<���ܺu��ݻS�re^�Ȭ�B!
�k�p��_:!�P���,�Xf���WWWC�!�B9��������a��g����b_TR��H4M��4qO
Cs���%��[����wPQP1Q4W,HTPIMr���M~�f�E�g�g��s��s�̽��@ ����0�|N�8�֭[�駟�9s&�Z�b����׏5j����"ٰa)))����e`�֭lذ�ѣG��v�@ �=ׯ_����ܻw��U�ҩS'�O�N�&M��K}���gll,.$22���t�ԩ���3f̠bŊ�\TT��ښ��P5ge����eԨQ�[�N����ŋ,X��#G�������5]�ve���4l�P�y���s��i�L�Btt4���oߞ3f���V/99��K�r��nܸ���������0v�X�砫nE����?�OOO���Tʥ~�v����\�x�N�:�w��R�_RRs����_%--
;;;�̙������誋����x�3�۷og�ܹ\�t���z�nݺ1u�T�}�P(X�j�v�"11���t*W�L�V��4i;vT�ST�\�p��k�R�bE��Ë͊עE��ۇ��#?��cƌ�~��jm���a�/^Lrr2�+W�S�N̜9;;;5yM��8k��yn�"�{��֭[L�:��={ҰaCnܸ�����ɉ�72}�t&O�LÆ
IKKc˖-l޼V�^
̻��|���o�֭8L޽{��ׯ�9V\�~]��*			@AFc�m�{�W	�uX �k�p�l�2\\\�[
�@ `���孂@ ��s��5lllT�J�&$$DE^�~��/�r��AΝ;n��ѣ4/ڵkG�v���	g�̜֭9�	&��䄇����孪N<{���k�r��a�ܹ���	�����ݛ>}���fdd���Oxx8���T�V�O>��aÆajj
��4��=66�Ǐ�m�6Z�lI���e�5j���m�4h�*Uzg-��'**�O?��G��ew��%88���Pv�ܩs��٠6m�ė_~I^^�\v��.\��Ç����B�
lٲ�Q�FQ�j�b�:t(M�6U3�޷onnndff�e�o�fӦM�����޽�.]�h<�ɓ'�ر#
�(0t߻w/�"22�6m�Ȳ�O��s��<~�X.���&..���86n�HLLo��V��V��1~999���k����E\\�<~�����ӻwo�:gϞ�w����6]t�]�S��X�z�J搛7o�֭[ٽ{7ݺu��=~���;��(�����ρسg�~�i��gÆ
<{��Q�F�l!ѬY3���X�f
���|���j2�/f�����			!,,���Y��%�e����ʐ!C�?>�������쳷���:���HΝ;�_|�"gnn��N�J�*<|�WWWj֬�޽{i׮���;			*Dž��۷o_֧'�<�.��W
�uX �ay+ �@ ��bѢE*/��E�\�p���`<==:t(���\�x��4兑�=z�`ӦMܽ{��۷cee���7o��QQQ�����f�X�b�ׯ��&''���Ο?ϼy�

�岳�5j�6m������p��7nϞ=+��C����A۶m��mۖ��>\��'Ay���C>��s?~���INN&33���h�
Fvv6ܹsG�^~~��g�������߯^��ȑ#���cԨQ\�z���l�=J�
8{�,.��;@�^�Jtfff|��G�S%Ի�����I�޽IHH ++���z���ӧO�ׯw���xL///>���;�ӧO�����֖��l�͛�";~�x?~����INN&;;���"""hҤ	׮]cΜ9e��2��_I�U�INN�󤧧�t�R��/--
�Nbb"YYY���ѩS'�mh�E���u<u�Wf���t�ԉ3gΐ��ERR�}����0���TY��ח��8�6mʱc����@�PC�6m�����PT�DFF�9/G���8r��ӦM�u����ĠP(HLL��Ņ��,�������	��m��s[ (+bcc_x6IWWWf͚E�ƍ155���[[[��r�W�X���<<<�Y�&FFFXYYѱcG6nܨ��b�ĉԪU###����޽;���DEE��EŊ�ڵ��?a�@ xppp�?��ڵk�0˗/�z��*�-�pJJ
6l(G��@�: .�@ ʁ���/b���1$$����Ji_�*
�/_N�nݰ���z��t�҅�~�I��(�װ����ֶ\�~^Y-,,�۷/;w��޽{�Z����\n޼�\�S��ٳ�>Fhh(P�"1::��G�2u�T�o�.�mٲ���$�����ɓ���ЬY3N�:Ş={��Ne���Ǐ��{�� �I2�@ ��Y�����M��?�@�
077�u�֬[���cǒ�����_�lj��a֬YL�4	y��ի��ʢ���Z�
LLLh߾=[�n`��Ͳ������%e���<y�'''BCCiڴ)���4mڔ��P�����X�b��:t 44�v��aii��̺u�8qℊ�3g�G�
`bb���;v��C����L7e�j�����$!!�Y�f1a�ƍ�Qvƌ���aeeE�Z��>�u��q��}:u�Dhh(M�4��Ԕ�͛s��A����[�.��㩫�2͛7�СC���cjj�{��Ν;�ܹ3>d͚5���H�v����̌V�Z�xR�ʒ�Orr2M�4)������t���7]�K� IDAT��~�U�V���ѤIv�څ�����^�Z���y��@����–-[8q�'N�`���3F-����&L`�޽�<y��~��%K�РA�nݺ�ɓ'9t�P�a��Ã��xnݺ%�޺u���x���,--���
���<{��իW���J�6m�С����޽[M6##��˗���B�6mpvvf�ʕ���g��K�uX9�@ �".^����_�~Z�u��׮]ӫ^a<ȢE�X�h,�c
��αc�>|8�������Q�N>��s���W��0000(��^�|�iӦѪU+�T����1U�T��ё�ӧs�ʕ2o�E�n�:�/|�W�������7o�ĉ�z�j��(+]�m���'-Z�`֬Y�������;;;Jl������^�i{}���������(ͳ���b���<|���={�e={���Ç����o����'NNN�����O?)�QM�K�������{{�R�,]�?����Nll��D����y��w122�~��̞=�����Ο�	@�z����ب��@�#���3F�aÆ��)==����K���Y�`��~)
��ѣ��:88�����V���	D���~`�����N544dʔ)8p@c}�2GGG=z�R^�N��*((�7n��6mJ~~��QiiuS���i���Ғ����s璓��7�|�������Z�>�w�^�L��V��ؘiӦil�8]��]�SWye�O�����J����&MR�
����k��~�w��&4��t-���Z�i���
@���̙3���P)S�Ҽy��@ (C��F�*�*����Y�&_|�E9j&/R����`�`�266��7��ミ�H"�@ ^����,Z�����RGa�p����,]����|&N����
�7.#M���"%%��C�j\p�y�&7o�d�Ν��ٓ�[��/%#++�ɓ'�b�
��洴4N�>��ӧY�p!cƌa�…�������1bĈ�VAg���HKK#>>���x���X�n�z�Zꓸ�8���رc111:�`|2d�'O��߿D�����z����}��

"..�BA�:u�ݻ7�����P(عs'���<|��*U�о}{��틉�	��|�c�����֭[ٴi���ӽ{w���ϓ'OX�~=gΜ��ؘ-Z��_���֒%Kشi�.]��Ą6m�0h� ��͵�˳g�رc'N� 55ccc�֭����;w��<}�����cggGժU��jժѴiS��ߏ��3*T(��^._�\�*�0���ꫯ����*��q�3g111��İj�*��������\���￁�蜚�믿�l��ÇjQ<��$�@ ^u����Y�f�rR$|M�1�k׮ѠA�n݊����~�W��_VVV�����c��i$}%C��H���
G��g��k�ӦM��ӓ��h����C�Ν;���̧�~���i��LY�_a��ͩ]�6���xzzҥK���A���t9���Z�l��N�6m��[�.��㩫�2�����~�p��W�\!11�S�Nq��I�������z�����Ғ'O��<�����NQ��;���x�b��*��<��獶 ��y���‚ٳg3v�X
��={�駟T���@P�t�,e}+���Q�:���@NN�����ח�۷3p�@@5��iӰ����̟?_�:ܧObcc�4��f�۷�s=_�@ ����DHHH��h�,l
˗/�[�nX[[S�zu�t��O?��B�(-����޽{�iӆ��o�d���� ++��/2w�\*U����qqq!77���~e��ʢG����O���ɡC�HII!''��СC����޽;YYY�x���_䋭�������޽{9rggg
��M�e9���p��瓛�˭[�����Z���#�
��Ȉ���b�
�����C��xm	����ɬY�8z�(O�<!77��W�������0g����HII!77���TBCC�-6�MY�����<x�B��'Oعs'���|����8q���,�>}�ѣGٰaC�ښ={6�ϟ'++�'O�N```���Ν;�s����(
.]�Ě5k��_d��Ǐ�P(h֬��1�5k�B��ĉ�t�@ x
��������yЭ[78��Y����Q(�\���={�s�NY����'O��_ʮU8b�rYygr���(�]W����B�J��J�*j2�oI3VHѺe^Õ"�k3"��(�>}�q�.�C�%44T%�7ظq#}���I�&*�~K��2�?Mkf���$''T�����L}�O�O[�ʕ+��6]��]�SWye���T����R�}�vlmm�����Ņy��Njjj�稩�}�]�_ǔ�r��96l�q�j�4�K�U�xQ��s[ ��-Z0z�h�,Y’%K���)�̘�@�:"9X4m�T��Fd�����_�~*�<��޽��ҳgO��gϞ<|��ݻw��f�@P>xzzr��>��c��ohҤ	���ҨQ#f̘��'�\�2���;�W�.o�_&O�Ldd$�����ɓ�N���T�Z�.]��a�N�<��o���΄	�[���W�N�Νٳg�'O&??��#G�V/�`dd��o����۷o�6R��D�5�޽;iiirm�ܹ���4�w�N�5^���ב_~��{��Q�zu�͛Gpp0�g�Vɠ �w�^._�LÆ
Y�h۶m�~�q�Ɯ?���@u�js���5}���:(��_�x�b����߿?P`lddd����e����U�z}�z����ٲe����<y��~9r�P�188���@�
����:gϞ�~��j���ڪ��%$C��۹��̙3�>�{{{�-[Dy��믱���y��L�8QŐH��P(�<y2vvv�����7ߐ��R"��N�J���133��Ɔ�ӧ�9S```@NN_}�VVVT�Z�Y�f����ݩP�U�T!::����c��斨�3g�```�����ڵ+*T�Z�jx{{�Nʎ	�nP=v֬Y4j�333*U�D�6mX�~}�}`ee������2d�=z�?� �H���ݫ�˩S��l��7� ==]m�T&��@�#EvOKK�h|/}�����^�p��c�b``��-[hҤI�m��Ⱥ}��:t�D�.]��7�T	!]k�?�#�U&��>��3g�p��u����/_�̸q㞋n���>�'Ց�F۱�C��e<����6'�~Pv4	��ݝ+W�иqcfΜ���?aaa\�tI�ށ�]�����ر@%{�2������s[ x�hz�-�Oy���ҥKY�t)(7=��e��٩aѢE888��w�Ν+�<Oƍ���111,[�������V��uX����>}�"�@ ʟ��Å&�ܹC���;v��cƌ���ܽ{����̙�СC0`�G�fÆ
EF��d����ƪU����b�Ef�(�M�cnK�PĘ1c����LJm۶����)������NŨ�Z�j4mڔ����(:�@ ���ׯ3b��֭���5k�d�Z#&I8E}
�����֘��bkk�ԩS�����8p���ք����ogg���/�֭S���E�B�Z�055�V�Z:Tkjve�O�>M�N�����J�*���h5�INNfԨQ4h�333*W�L�-�3g�֗O��V����˗Y�b:t��͛y�-Z�o�>LLLX�z�Z4m�]���^w%���mj�.������`����u�?���ֶ%
˖-�C����S�Z5z��Edd����s�&%%1`��W����)����ݻW�κкuk���0�^S�ѷ�m���|||4g�֭ШQ#222��2���E���_�/˱/j~<��5kbbbBÆ
����<�.z�d�Jz�3O�_�N�-�P����%�Wm�ʥߩ#F���bllL�&M5j��q���;v,666R�vm�����zާ��Æ
�^�z���ЫW/���>|8o��6����5�|_�O[_~�%5k���ԔO?�(>ک�q߾}<x�G�ѭ[7BBBX�b�,w��U����0R�$#��o�%00��O����Ί+عs'����۷���L=zĮ]������Ϟ=��;w���Izz:�w���ͭH#2)b�…�z�*���r:vggg��qƌÊ+x��1���s��e�ƍ|��'l߾�����Ҹz�*gΜ�����q����rrr�ȑ#ddd��V�^����ǩS�2w�\.]�Dvv6O�<!&&��Ç�8O(ӻwo�����ȠaÆ�������>ӧO��ŋ�����~��GT����� @�F������He��@ �:R6	]��)
������`Μ9���h���X�H�������U��h�E�k�.=z��/��m
Mr`Wv�-�֭���'�������Z��ZEY��=O�9?;;;��Re�5.m��d<K#��h,����`���\�p��///\\\T���%tذa�z�����x044���K���q�����?,���y��@ ���:,���p���5kҴiS�ܹ���ҥK�����S�F
9�hbb"���q��}8PlD=e�>}ʌ3����ɓ'���p��1��b�i3''�9s�FJJ
�����������"����Q(4k�L�8͚5C�P�T���#**�>��u��q��
����{�.����hѢؔ�����P�޴i�[��������p��.\H�T�l���Q�4F�.�СC�������*����ޞ��@n߾MNN�o�fӦM4o�\�&���'OҡC"""P(����w�^ڷo/_J�>}�-Z�f�._�Lvv6������1{�l�7oν{��L���:~���<{���#G���Y�fxyy���3��w�Ro}�YW^�5�����=@%է&?~L�v�0aQQQ<|�P6Zۿ?�:u�_~)q��Gxx8l۶���Trrr8{�,�{���vi���Z�j����L_}uik�ʕT�^�U�V��ػu�>>>�e�,--qqq�J�*DDDh5��r�
���T�Z�2{M�߿{{{6o��ݻw���寿�bܸq��[a��^���^^^��ő��Qf��^n߾
�{ァR^x
��8X�q㫯�T�`�C���S�� �0���ԩ���4m)S�Ί3�<x0��������7����H2��t�Je�F^GΝ;Ǿ}�HJJ��
f͚������$&&��_�믿�Տ��`Æ
\�x�;vP�vmn޼Y�S����U�V�={����裏8r�juN�:��Aff��1z�h����x�"|��@����ŋy��Nm5jԈK�.������Ӂ�GP}�&EX�v-P�q'++�Ǐ�r�J�/_������/:t�M�6r{�����СC����ܹs|���jՊ�ݻ�y�f���U�A�T������$׮];@�Q�T&E���U�G�@�1���LHH*��&N�ȹs�puueƌE�!9Cj��IHH���@���ё�]�r��]���OFF��c߼y�%K�`hh�ĉ���ݻQ`?;={��%K��#�낍�
$&&��k۶�ZYY��=O�9��>���K��j����utE���u<u�Wfɒ%j盛�˂T�����
R;���rfff�m*ӠAƌ�B��G��:��:u��={��������\��K������p�B���O9^q��s[ ��,�����P��숍���M���_h�"�uX ���BR
���]���ѣ@��%�k\7l�0�l�BPP�g��G���޽{III�F�̟?���`fϞ�1^I�T6R6ڻw/�/_�aÆ,Z�Hv�hܸ1�ϟ�_��={����� E��d���y��!��9�?f���$''���Itt4Æ
#;;��PBS:�������^��ȑ#���cԨQr�գG�ҠAΞ=+/�;v@�@]fff|��G����ew����ݝ��Lz��MBBYYY$$$лwo�>}J�~��F����O>�رc<}����Hlmm���f޼y*��Ǐ����>���d������ ""�&M�p��5�̙Sf�)��I�d���%�_	)b�o���S���[�~V6S�.*ZË�ft壏> ..�H9___���hڴ)ǎ###�BALLmڴ!??_��V��GZZr���D�������S�Nx{{�u�YYY$''�x�b�xo�*2�\S��k[ժUcժU������%;��������?��Ì3hٲ%P����N~~�FCI������0`���e:��HMM�����\�x���,Ξ=K׮]�[W���������ɜ?���t�/�_'�90��P�7RS���e\SV裃�=�2��-ccc�{I#��mۖիW���M�F����b۶mx{{�v<5H (s�̡q�Ƙ�����	Dx�7o�����ܜ�Çh�J��w�ѡCLLL������:����x� �U�f��A7n�������|���9�ƍ
��֬YC�F����`ҤI*�X�ZVqm)��[�|9
6���Bvf(.�����~`Ŋ������M~~�V�PWWWf͚E�ƍ155�3:T�٨bŊ���A͚5122��ʊ�;�q�F�'R�V-������
��,--5f����bŊ�ڣ@ �:�G��7������уS�N�P(���`�ȑ4ccc�5�={������>/x{{cffƆ
�6m���###��~�M^�2mJ�]��jժq��������ʕ+��撙�IBB�/������3c�������T�T���\]]IJJ";;���$\]]�����Ғ1cƔ�������<}����\����5�/k����>�7|�pjժ��Çqss�…��䐔�D߾}�<�O��:���+s��1ȟ�Ivv6gϞ�G����P�n]���KY�nݺ@���{����#11����8�<x�@�>Z�h]�t�֭[�m�OOO�9ƒ�����>|��C�Ү];�ܹCǎ�\ۿ��֗��͹s���O9v���Zf�� 44���\��\/���@ (k��/R���/�uX ��ŋ�^��ׯD�[�n�7� ::OOO�������ĉT�Z����ʕ+DEEq��u��D��sĈrz�&M�0|�p9
�DiڔǎK����]�6>>>|��WDEE�;���o����q�2m/�����Y�����O��b޺ukZ�nM�J�X�l~~~E����0k�,&M�$/bCA�쬬,���ϪU����۳u�VZ�l��͛�h��C����%e���<y�'''BCCe#ĦM�J�.]���`ŊϫC�*�~��Ǭ[��N�:�e���-ZD�ʕ��֎;���aaa*Q`K��2��ߟ�)��ҋP)BWi�Go]�YW^�5�+R�t)
�6�����{���Z�"00��
r�ܹ��O�[�����өS'�:͛7���o�^NG���
w��Q-"�>ה���Ӗ��+3y�d������#<<GGG9��СCY�j7ndΜ9*��yyy�!�d�P�c��5k֐��NϞ=ٶm�\ެY3���O�4�P/k�J;Og̘!/lZYY���ם5jp��
���O��}�\��P��ښ۷o��燵���T�\tx�mU�X'''����|�2111����i�&�X�r��ܿ�Ǐ���?�eAM�4��+g�iذ�����Rk�™�5*M/�$RSS�A5Ο?�Vּys�{�J�����2�H�^���_�I���N�d����8|�0�f�̙L�>�q���...*�~�aeeń	�0aB�rݺu��HT�P����u떜�֭[���3r��"u��U�V�Z���믿ҪU+5��+W�dS��[ϝ;'JkBr6oذ!+W�dذa,X�@�Y�6m�:u�J����lP�����x���6�� IDAT�Y�f�8_B����� ���#,,Le���AAAԫWO��%���aaa\�pA�
�x����E7}��y��U�T��۷ӽ{wv���Ν;U���兑��N���?������,_��/����[���[[[�k�.���ɓ'3b�V�Z��^0s�L�m�Frr2�O���3J���)���cʔ),_���7�k��122b�ر,\�333��		a�ȑjA9jԨAXX�Z6�-Z����\�-X��<����c����S�j;v�(o%�ep�2d������___�}��GFF�Y��єu��Ç���R�fM���K�v���IHHP9.����@ (�s%��ȈN�:�k�.Μ9C�V�8{�,O�<���M6���X�p!W�\Q;FqQG��w��Z�TMF��iS�h�maY��SJ����T�)
�@ ������^
6�e˖q��a�����0���\�w�"�ȑ#@A���888���J���z	XR4�ɓ'�E�644dʔ)DDDp������V�����G�T��ԩCrr2={���LJ:��M�6U;��ꦌ>���@wccI^��_��[�~֕y���bK9��&�]��u�;��<U�>��w�^�L��V��ؘiӦ���N���8880h� ��A���W����˗��U�hܸ1S�N��Ғ͛7�����#�.\�СC|��'�C�q��-���d�ϲ{MH����ؘ)S�h|�T�z�v�~���%n�D۶mپ};�֭㫯��~��\�|�u�֩�:::�{�n~��G���K�իǣG���_سgM�6��o�
����s玜��,�E���-M�2f�RRR6l:t�^�zr����߿��۷�+$�<�R��@�zQ�8H���_��$DŽ��wO�i}��¢D�E[�J���ݝ�ݻ�{�n���9~�8ӧOgɒ%̟?_%�Yy0d����GPP�'O
�>k֬���P �W��={�…	��ݻXZZ���ȤI��2;]�|Y�6���hذ!, ::����ׯ���4i�F�m;;;Ο?O`` ������ܿ###�֭���>>>*N��8;;ǂ���_IMM��ښ�]�2u��R�Q��ʊ��h.\HXXW�^%''z��͔)SԜ��R7]��E���k׎��x�ΝKxx8���4jԈ9s�гgO����rzյtO}�_b����2{�l���y뭷pvvf�̙jkÇ��̌e˖q�����pttdܸq��Ջ�
2x�`V�^M߾}u�#SSS�-[������9r�K�.���S*U�D�F��ڵ+^^^��[Q���ѨQ#���K���[�.}��e���T�VMM~Æ
x{{EVV5j�(�/���#''Gk�Q�@ 
S�"11Qe�E��ꊱ�1!!!��c�:uh߾=C��夬��ׯ'""���*T����=�F��XCA�6???�޽��u������b��*:����@ (�s�#aH���:w�LXX���;�Z�"**
CCC9DD�r�
5jԠe˖ԩS�
��0����/�5��.M�Ž�Vΐ!��.l4�\Vҗ��@�+III�B&''k�7b��]�F�
غu��o��A9U|QXYY�����Ǐy�7JTG����{a�rm��"%$'��`�M����'���r��:u�йsg������OU�J��2��_ŊIOO'==�7�|��6$��e!V�u�g]y�׌�HN.�8�\�r���DN�:�ɓ'���JOHI-[��X�M�6Ŷ�|�v��}���ٹs'���#88X�Z\}�)}��w�jժ�Y����kV�X��,1d��N������Å����_�{M\�p(�b��֭[{��Ы��Tr��ҫW/�;ƭ[�Բ��O�>�>}�K�.1e��}fff*ץ�����;kkk���T�{a���QWJ��hKS���Ӈ�kײ~�z֯_�"����ޞ��X���/�r����6O��={V�?�������j�S�jURRR�v�Z�Dj-��+���#�ے7״�L�ƍIKK��ݻ�����n����Ki���`��ٌ;�A��g�~��'�N7�@ �ʼ����@q���?z�Ѿ}{�#����1|�p��W�M�4a���%�/n=A�7�x����3��r�M��+�XeU_�󃂵�M�6��KN>���J������x�*������Jf��<x���ĠA��VmmG�
4f�ч>�@~�)8�q�6�_�-h#((H��,AIؿ�ʶ��E#���u@ݒ^ S�zu>�����HNN&66�V�*���̛7�A�ѱcG�c��啨-)҆d4&�ɐ�4mJQ2���		Q�l۶M��"�J���He���
AYQ����֯_OHH�*U",,�*U���HJ��B2\�x�b��rssU���OmR�om�t1�:t(���*�oܸ�ƍ�۷/M�4QɖTZݔ�g�$����ϗ���$_��X��SR9]�YW^�5�+W�^��l���۱������͛'G��}�C/m�!���`mmM@@��.\��Օ����\S��[��Mggg:u�+jʌ"1h� ���سg�<~����ݻccc���e5����i�S��VY�U�y�_^ܓ�C4ann��ٳqrr�R�Jacc#gq111�e---�;w.�z����CCC*V�H˖-����U�+xzzR�zu

��]}�E���-M�ҥK���y�w011��Ą:u�ЧO�߉v��annΙ3gԎ{��,--i۶���+T�6m������r��if̘��kC�����A\\���ܽ{�I�&a`` ���k�~nm)
�{BBgΜ!55���<,--�/K��-Z0z�h�,Y’%K���QKg/�@ (=���h
�$9�`�@ ��ː!C�Q������:,���?��BW�u�F||�Q��w�D||<mڴ��͛�Z�J.��I�����Gl۶��k�2f�5j�իWY�v��:ŵi``@~~>w�ܑ#�8::�{�n~��G���K�իǣG���_سgM�6��o�
��ܿ�۷o��ݾ}[���A�
x��iii:g��p�cǎ���-[��EZVn����%��n߾=���:t�V�Z+��%Z�l���3[�l
�n���HOOWq�HKK�u+>��3>��3���o~��W�;ƱcǸt��/_fܸq�ٳ��u�g��v���ӧ���՜	�B2��fș���fp�l�UZ�A�~֕}��Bdd$�=��Dpp0
����ܰ���Z�j���{Z3)hB���ꤥ�i4�OOO/q�VVVl޼�:p��)fΜ������>ה����w����=z(p*ۿ?={��(���oӵkW<H`` �|�
������ЫW/ّ�v�5Q�R%93���A��CY�2��W�7�xooo�2�)��3eŊ2dH��ڶm��?C��64ɗTmm�R^�mi�'''����l��‚^�zJJJ
իW %%��/ү_?�] (C�U�F߾}U���}��j�����_�ĉjFf���,]����kڴ)7o�Ի���X��]�J��[o���Bbb"����ڵk�Y��Q�F������W�^�����9�<<<�[
�@ �ךV�ZI���Y�d	�Z���̌�W��~�z/^d��W�;vЧO��VC �eǎ孂��Y�4����@ x��`ooOժUy��!5jԐ#J8::r��QV�X��+��_�z�f͚ێ��3111\�v�ٳg���ڵ��tm��ʊ��tƎ���5~~~��ӇӧOs��%�L��R���L�X��ޞ��X���/5c���`��A����q��	>���S(�������w�}WdZB[[[���IHH�]�v���ݝe˖�j�*Ə�5��Į]�x�葊����-gΜ�ԩS���C��ɓ'e���nݺxzz���	�/������l0_ֺ�3~Æ
cѢE�_��Q�Fagg����ӧ4oޜnݺ��W_ѨQ#X�nP�744�ٳgddd�9K)��BoeJ�ϺR^�Lq���Ɏ�EES����X�z5#G�T�w�����g�04,:�>�aggDZc�8s�F�Y}zڵk���˗/g��Ÿ���9��sM髯��off&�
"77�#F�v�Z�NBB���@P����lڴ�o���
6��ʔ��k�I�&DGG��A$..Nc����e���:�F�P0l�0ڶm���%�o����(p��<��ݛ�G���/�����Z[[�駟��v���ڵk�8q"QQQ��書����W_aff����2iܸq�ڵ�[�naeeE�����ֻJ���	ݺu�v��e�֏?����������`�ȑ������GRRPp?�駟��y	�@ ^o�.]J�Ν9{�,�;wV�o``����N�~��e ''�~�����@ �2(gD�a�@ ��[5�f�������P^��ҥ�Z�lOOOڶm���9&&&4hЀq�������J����	s�̡[�nXYYabbB۶m��ti��ӓ�իchhHNNPIp�ܹ���kkk

�X�"-[���W�XѮ];���9s挚gΜ���Rk4q�@ (-����Onn�����l'N�ȹs�puueƌE�!Ek�7�IHH���@�w��ё�]�r��]���OFF��c߼y�%K�`hh�ĉ���ݻ�h�"�={�R�ٳg�C���B�bcc������j�4�~��n���;��ĉ��ʢgϞj���Ν#--
???�6m����|�	YYYt�҅:��K��N�Rk?  ���ֵ��~�p?k�E^3�0c�e����5�(�������b�է?>��3���k~~�J���|��>̛7��5k���3Ǝ�v|}�)}��wsҤI��矸���f����۷��믵�w�޽�\�2�ϟ'((���D�V����V�c�M___����k�+}��6w_�y��#���_�///��ݙ0a���XYY��/����Ajj*���DDD0z��"���י˗/�8��ַ�r�ʬ_��?���'N0u�T5�e˖i�iٲe\�v���<x��]�� �����A�*ה���ԴL�rww�������8Gzyyq��233�����,X�@-S�@ ����ޞ���3n�8�{�=,,,066�v�ڸ��s��	�+^9�����c���W�#x5���}.����Ã�K��t�R����@ ����$����1Jz�
7n���1�|ڶm+����;vhr�`ذa�_���� ƍ�����lI�l۶-+V�`۶mrj��+2d����ضmL�4��u��ӫW/.^�HJJ�\����ŋqvv��sc��Ѽ��?~�=zp��)
�9�A�all����:{���Ϗ>����@5'��x{{cffƆ
�6m���###��~�
www@=Z�ڵk�V����???�\�Bnn.���$$$�x�b��>3f���?Ti�R�JDDD���JRR���$%%���Jdd$����3��}(=8����ӧO���%!!A6�R��^���3~P`���g�q��
Z�n͗_~ɑ#Gx��-[���1���<V�\�͛7�R��]_��>�(H��1
�/_f„	�\����ֵ��� 44���\�����勼f�"77�;w�w�^�w�/&&&���cl\t�4�c�ĉܻw���<<x��A����C��>|8�j����ø��q��rrrHJJ�o߾DGG��+`ee��ŋ���!88Xe�>ה������ÇY�r%o���</�.]Jݺuٲe�w��ؖ��9���
"eC�\055U�+˱ׄ��75k�$**�^�z������ŋ�ׯ111�髗�������
///�B���133���kkk�t�¢E��^�zy�((D�&MpwwgÆ
lذ��eK�@ ��yP�vm�-[FRR���p��
�n�J�֭�[=A	���@ �@ ^V�_�U�-[&;E��ڪl�C�P��7�ТE�������qqq,]�TD*J������?cccv��Y�j�Ɇ腷�ٿ?������+W����[�vppИ��0�}6L�"~�6m���Ԝ�puu%99YkFFFL�>�9s��ۻw/nnndee��333c۶m���G�\r���i��G�hݺ5.\�X�V�Z?~�z��=�t?���<�͛ǂ4ꡉ���̝;###�,66���ۣP(��׮]ˈ#�Do}���ɉ��H9IM�������X�"�7oVkWӱ׭['�wafΜɶm�HNN���o߾��O?~��ݻ���S�:xyyadd����~��СQQQԮ]�?��KKKy�>sA_}ui�������<x�nݺ�rG��[�nT�^���D�|�M�c���ЦMy����888�Ȕ��k*����O>!--M����@�VG_�����c�3p�@Y��˂x�班�-�Ƭ�ٳg�Ǐ�e����1p�@� 򦴽c�y[ �W�������g��4��+o���
�@ (?��@ J���([�G,��cnn���,����������	g�@���ٳ'���,\����p�޽���%���L�4��]��ȗ��0^^^4lؐMFF���g�L�4I�o����ϟ'00���P����߿���u�����	��}�m:;;ǂ���_IMM��ښ�]�2u�T�{�=��CVVVDGG�p�B��¸z�*999���лwo�L�����s�M��022��o�eĈp��!���HKK��Ą��z;;;���x��1���,X������?~�9s��ӧOi޼93gΤW�^Z��u�[�~ްa���DEE���E�5���u����1�+W��wߥ[�n�5���z�Du����˖-�…������ȸq����w�aU����_� 8��vǓ�ۜ�)MP$��s��<�q�)%�$�9a2j��9���q֣��aV��`�������}]�{��_k�7����T�Z5���KK�.Mss{f��z4m�TǏ�̙3�c����/�^���O�.WWW���/M�ēZ�d�\\\��?���W3f̰�{��$s
<Xqqq2dH�bIjӦ�
�O>�D�ֺu���ըQ#ըQC�ΝS�:u�[H��g�Q�F:q�f͚�/��R���U��)S�����Rp������O�+���յkW�c���
Ȓ-[��̙3���������D@��
��$+\Y��s���ٳڵk��q�]�xQ/������u��y��<V~ˋ�'�<q��c��������.�8���w����Z�n��nt _���d�ϗك.�%nnnrss3:�T�XQK�,1:�bŊ)11Q�}���U��n����%I�����h�oy�x�b�۷��<�f͚q��#���(99��P�EDDrܩS�4b�U�RE:t0:��5k�L���F��@��ZÆ
�{�nu��M~~~jذ��-��^˗/��,I0`��I��������R�"|�#DEE6��Ç!///�2�"""dmmmt�<�aÆ[@.��gA�6m���aÆ�U�V*V��ё�|�B�
�P���1(и�ڼy�Ժuk;vL�[�N����J���jѢE��@~�dfǎڱc��10��
6:Y���ct�<m����l5�|լYS3f̐����q�G������N�:�y��i۶m�����,5k�L#F�P�F���i����x������G!!!F��gJJJ�� G988��?�ȑ#ճgOծ]��H@�ceeet���bԨQ<Q@�%www�c�3륗^҂���e�-/(ج��Y�
rAHH�6m�dt��
RPP����hn��Y�f
7:ϔ[p���jt�puuի��jt��"E
�GL�ע�����Į^���?�XG�Qrr��f�V�^-I���� IDAT��16����u��!IR�F�ԵkW��3������et(𒓓)���(T���.]�
hŊ�߿�ё�|�B�
�P���1x�ػa�����ό;v��  �L�<YG��l�����رc��u��)%%Eݺu���3\Ȣz��iذa�0a�:u�^x��H@:���;RRR��(`N�<)I��OT�~}ݽ{WӦM36�5e�u��E����$OOOM�<Y���38!���իruu�s�=��;w������ʕ+�/Wڒ���ϫz���c�+��5c�EDDhܸq�N���@\�5�'��������it�<��LJ��@DD���&�I���w�Z�YYY���&ײeŪU�t��Uu���������P�Z�J�60����Ӓ�ڵk�ٮS��a���1c�hϞ=�;���_ɒ%�h�"yyy�o߾z�7��ϴ�7o����
P�Eǎ��YֱcG���kF�������@���I���?�4h�@�_�iL�4I۶mӌ3���j��W_i���jӦ�|}}3-�x�=u{����Վ;dcc�f͚i���z���-�޼ySaaajР�ʕ+giwpp��dRXX�z�쩒%Kf�5 /ˬ�"u;�ٳgO��p�s:w�,WWW���{:~�x�{�<+�����榄��>}ZE��[��o)0�7���4:�)�����L�0Aǎ�ܹs���"]�rE���*W��&N��T�~��Gڼy�$�Ν;������ǵv�Z�*UJ��m�6%$$�I�&�oҤ��9��۷�s��O��q=�rٲeZ�l�e���_�����h�߰�@�
P�ڵ���Կ�<�3g����M���ںu+��BF<۬��x��ŋ/^�y�,y�̘��o�,Y���O��۷ok�ԩ���>��ݾ}[ӦM�G<�}��i���:x�V�\)'''���OZ�v�����%I5k�Lw|j[j���߿��K����S�7�믿��}�jӦM�&$$���_���jܸ�:v��@%%%Y�<XHb2�,�YY���͛9x�_�J�4u�T͚5K�.]2:<Sv�ޭ�͛륗^ҁT�re�#@�B	�p2��F� �			��&򛌞��Q��<�A�2��
�;CS�N���[����S�0a�e�W^yE�&MҐ!C�k�.�S�ϟ?/I�X�b��+U���U����Nf�Y+VԆ
t��i���G���
		��Z�f�e;99Y�N�ҩS�t��m���H����4h� �={��7>>^+W���ӧ�B�2N+\�ѣG��>�СCetx&����O�>rwwך5kdkkkt$�s(����K^^^F� �INN���G2d�>�S�N�J�*6l���Q�Fi�_}�UIҏ?�hi�v횤�V�xXj[j
�ӧOK��ԩ��vN۸q�$���_&�I��Ɋ������֭[g)�X�v�Ξ=�:u�h�ĉ�Z��bcc5{�l9rD������PLL�� �BЬ�pE���cmm��K���_WDD�@������k�ȑ���{���YF������Ș�RRRdee%�'\g�H���.���$��#S�8��)�-�]j�E�ڵ3��iŊӭ[��K�.�E��ҥ��t钦ߎ;$I�gϖ���$�J�*�6m�<<<%�L�a�+��ӬY3���W�F�R�v�T�T)�#@�s��=�9R���Z�`�F�at$��(G�iW�^��dR�6m$��TQ��$WWW���F�!�Qs���k���=z����s1�gŒ%Kt��ժUK�.]R@@@�����o߶�]�p!��N�<�f�رc��ʕ+[����%I7n�Hw|j[j
*��$�ɤ��HI�ܹse2���W_I�fΜi铓F���E��СCZ�`��u릕+W�Ν;i�]�|Y����n�e2�,E�����
W�m�ܹ���?5e���@�����.]�h���
�����@����rkI��n̘1����ss;vL7n�Ǝ+?~<�(Ⱦ��[�����W_�ʕ+�����P}��>eʔ�$mڴI����t�|}}3��?��ӧu��];vL�gϖ$�k��ҧz�꒤���tǧ���9�m۶ںu��N���u��Ν;
����6l�`闒���qnݺ���p�����5w�\-Y�D���gt(0~���l�R{���Ν;չsg�#@�@� O3zI��nϞ=yn���DM�2E]�t����������ɓ'+111�S(�n޼�iӦ�X�b�1c��)b��t��MIR�-$I.T���յkW=��s��[�lY���G�5һᆱ+W��V�Z�֭��OӦM%����Rۚ7o�]�
@��e˖I���8111�$���(&&���i�J�����V�X�5k֨w���?4�|KGGGI��͛�dK}9r�s��@��ӧ��6m���޽{F��|�…jҤ�~��8p��n��Qp�s\�}͚5��e˖�d2),,L���������Z�JW�^U���-m��޺z��V�Ze`2y�߽���W?���Ə/'''I����Ə��W�ZV�5j��t�ҥK���FM�4є)S2w���j֬��)�r�ʩW�^Z�t�lll,}ڵk�bŊ):::�����*Q���|�ͧ>7�W#6bu�N�:�d2i���JHHP�j����,I�����kٲ�$iҤI:w��ݻ��~�M�-��dҠA�,}SW��|�����r����>���<yR�|��q _;|���4i�2e��|��'T���e?�����~ݺuK�*UR�^���ꚦ�͛7�l�2}��7�����ϫU�V0`�J�(a�Z$������ɓ*Z��ڴi��#G���N�t��}-[�L۷oW||����U�jUu��Ii�z�똘��˖-�رc��쬥K�����wޙ�}��M����A�*W��������`�gϞ*Y�䓽�)c<����?L����Mnnn�m;;;M�0A&Lx�T�ti-\��ي/.�٬+V(..N�˗�$������8p��+��1(�B�E�޽5{�l���Z
.S���X��ӧ�v�ޭ�'O�G�i����jԨQ��2e��ڵk����6oެ�M�jϞ=:}�t�q%V��I�j��رc5i�$yzzZ�Ⱥ/��Bf�Y-[�Ժu�T�xq�#@��
�<'�I�!!!���+*&&F�W��$9;;��r�׮]S�޽�e�]�~]w��Յ4u�Tm޼���֭[z�w���Yw��Օ+W����+!!!��ԑ#Gt��ݸqC6lH��}@@��/_�˗/+99Y			:u�f͚����,�?�n޼���!;�;#۶mSBB��4i�n_�&M�����۷?Q�kz��-�4�ς������&N
��,Μ9�f;7xzzj�ԩ�Q��llldcc��U��O�>�>}��_�%�r�J��f9::�p��*U��Z�h�իW�y��رcU�|y.\XIII�X�
�H�'O����F�mt�wչsg���C_|���(��YF?!-((H����jժ��7j�޽z��%I+W���[�f�.]�����k�ʕ:x�V�X!''']�p�R(�+j�ƍڿ����'Iڵk�e�ƍ%I���:x���ky"�u�$�}"kF(U�T���5cƌl?���޿�$�f͚��MmK�������M����H���+>>^����6m�lmm��@����RLL�^z�%I�Ν;�������ݵv�Z8p@кu�4t��t��*UJ�G���͛u��a}��7�����/���_۶m��_����ڶm����pu��q���Y���pգGV��!Ŋ����֭[�;v򅔔����:t��O�����*\��ѱ ߢ��g�XԮ];�휶o�>IҸq�T�B+VL�&MRLL�>��sK��B�I�&�W^�����֭��'J����tc�?^*TPѢE���#I��?,�S�8���p�����ҥ�bbb���=z�M��wFΟ?/鯂��U�T)M���ׯ������O~~~2d�\\\��r+\���Mo�����?����8�����2��Z�p����4i�$�#@�W��<�d2�ٞ;w��Νkٞ9s�fΜ)I�Vu�N?��$�YN>#�O4�[�n��z���AU�V�|]�T)I���-m#G�����u��!:tH�|��'�ٜ姥�8<���wF�]�&I��`[j�+�����l��l��4,��7����3���Ո#ԳgOIRdd�/^�
W�`�…�U������y2�����Sǎ�֭[ժU+�#@��
d����o�`�ì��9O۶m�u�VM�:Uu��՝;w(WWWmذ!K�g��EJJ��뤤�t���y�[�P�b�����
F`�+�T�PAS�Lч~����8��\�|Y͛7ׅM�d#V��9111:z��:u�h���:x�
&-[�,Wr������…�U�V�������?���jذ������$GGǧ��T�Rrww����Ξ=����ZAAA�?�:w���YYY)%%E�o�V�%$I.\H�/��{{{]�rE7nܐ��}�}7nܰ��l��(r+\g���


���õy�f��@�q��	������^�K/�dt$(PX��'�>}Z�T�N��sCӦM%I~~~�r��ܹ��s��d2��߶�kѢ�$i���:y��޽��'OjΜ9���͛?�ܝ:u��d��땐��jժ���YRƫc\�|��c�)SF��i�&%&&�ҥK�}���h��իK�bccӍ�ږ������V``��l٢/����8�'l۶M͛7W�5M��V��Iy��o߾ڱc�N�<�:����Z��ݻ����]�|Y���KӯB�
�ڲ�w�ޚ={�|}}�E<�D}�2et��5yzz����O�hѢ�6nܨ�j�…��&M������h�M�jϞ=:}�t����ç)@����($$��<V,�-Z�l6kĈz��7U�X1�#�aV�Z���{��Z�|�lll���<���3gΤ��
���Z�j�t��AݹsG/������֭[[��,YR�V�ҿ��o�޽[�������պuk���*U������"E�(<<\�.]�$���P���ջwoK��c�jɒ%�r劒��9�Q�T�P!�رC���2�L�2e�ڷo�T����ڵ�…�^�z�7::Z%J�Лo����@�0|�pyxx�'V�B�#�"???լYS3g�Ԝ9s����>}��O���'j�̙���2:X\򤨨�4�;w�4$����fϞ��~�K����5~��G�����r�������9^۶mնm�,�agg�	&h„	�ퟕ��h��ŋ�l6kŊ���S���%Iqqq:~���F�|&""��J�FG�|���A3g�Ԙ1cԻwoըQ��H�k�޽��*((HK�.Հ�� [���[[�lQpp��%88X����ѣ����ŋ+$$��<1�٬��`�c�Y����ڵ��1���{O�V�����7�rŭ[������h}��rss3:<(��k&�)G��l�<�����M��#F�gϞ����H-^�X�����Ӹa����!O�g;�…+00PM�4QHH��f�ё G��ǫC����Ӯ]�ԠA�#�3�����ׯ������O�4d�����
PP4l�P���ט1cԡC�*U��H�#Ξ=+WWW�����R��ё�B� _c%���l6� ��������1�at��fϞ��?�\�'O��ŋ���n�޽���P�Z���e�	�9\x&�?^իWO�f2��tlj�j������˓
סC�$I�5R׮]�#� ���������|}}5`����O����ё ۄ���W�^�С�֮]+[[[�#�3��ޘ1c�gϞU(���;vLZ�n�RRRԭ[79;;s��S���
6:�e}���ʕ+��{�����2:�m���Ӹq�4|�p͟?_�
2:<�(�P��ٳ���B��]��ILLԔ)SԥK9::J�<==5y�dEDD���.;bd���JK�,��d������	�ڽ{�4j�(-Y�D���ӨQ����<
.���������1�s"""��@�0�L���"��dժU�z���w�ni�Vhh�V�Z����<+�֭�aÆ�_���<==eooot$xb���2��ꫯ&///�#D� شi�6m�dt@�믿j���ڷo�U�jU���K'N���P#!!A+V�Ў;��/���W���տ���H�_�ǃ_gg�GV2<8��C�4�|}��*R���v�A��ƍ�裏�w�^Y[[��_���U�x�+,,L����ɓ'U�hQ�i�F#G����]����Z�l��o߮��xY[[�jժ�ԩ�<<<,�ܼySaaajР�ʕ+giwpp��dRXX�z�쩒%Kf۵�̴i����_˗/7:<�_�U;v�w�}��;w�iӦFG��(�*%%���<����߿�~��GK۹s�,�JJJҠA�t��YK[||�V�\�ӧO+  @�
�ѼO�a�ܹڸq�e{���*_��""",�ܹsG[�lQ�B��<�\ԍ7,cnذA���פI�2=����Y�Ʋ����S�N�ԩS�}��|||$I۶mSBB��4i�n�&M��ȑ#ھ}�:w��<��_�Y�f�l6�s��*[��ёyP�R�4o�<y{{�w�Q�ƍ��Yr��E�o�^w��ՁT�zu�#@��P]�v5:y^xx���5���������Y�f�f͚:u�&O���W���v�Z�={Vu���ĉU�jU���j���:r�"##��ᡘ��Ǯl��j{�jY��ӧO+44T+VԚ5k�t�R������Y6l��������l�2�ݻ�o�U�bEM�6M/���V�X��+Wj׮]�4iR��%����_&�I��Ɋ������֭[g)�ؿ�$�f͚�Kj���)���V�ti���1b���v���l6���]Ŋ3: �֭��/_�����o�U�"� o;r�:v�
*h���rpp0:�!9�x7#""BF� O��$��0�Li^�jߵk�$iҤIz�Wdmm-M�<9ݸ;v�$͞=[���*\���T��iӦI����r�̞.Ä	T�Z5����l6K����OM�8Q+VTѢEճgOI��N�s�?^*TPѢE-����#�)�����`�����W�.]���HK����K����a�*UJ��;L&������?��O?Urr�z��_|Q>>>ڲe������	�#�,Y����?Z�d��Q�"##ժU+�L&�ڵ�bȣ(�.88�r�	����ˍ�<+bcc%I���K���⒮��˗%I����u�…,��U,�i2<���O�Z���k;;�l��1K�*%I��~�ǧ9r��O��C��СC��Oԯ_?��f���Z�]�vM�T�d�tc�����Cɒ%իW/���K��������;�lٲ��򒷷��5k�B�x�$<����5v�XM�:U^^^rrr2:���Ç�_�~
dE��
���vIJIII�mee�n܇�<�֭[#u�<M��E�f�q7�=�\��֖�3��i۶��nݪ�S��nݺ�s����
6�/�ܩmY�xR/���}�����رcu�����T��ƍ�cǎ`��'���^�ƍ'�5n IDAT3:
�����	&h�С�>}��-[F��q�_@���C/^ԉ'��k�Y�O�8������bcc�y�f9::�fLC2��\�J��������u��Y}���


���չsgI�����\��7n���>��7nܰ�rZŊ5a�M�0AgΜQhh�BBB��秚5k�{���V�jՌ�
�%ŊӢE�������e˖FG%%%�o߾Z�~�V�^�^�z	��p�Ο?����p�=Z�G�Vxxx.��曒�9s����Ӻ{��N�:�9s����I�&�ܹs�w�~��7-Z�H&�I�
��M]i����ٚ�I2�Ź2�.�:u��d��땐��jժ���YR�3�W�.I���M7nj[j �Ԯ][�f��ŋu��A�i�F���rvvVÆ
�p�B���OF�䂎;���MÆ
Srr��q<�_����zK_~���l�B��#�p@.3f���٣���t��;����[�N)))�֭�����ꫯ�r�������+����ӧ�#����G�w��ɓ'գG�4�lmm5j�(�v�2et��5yzz���Q�7oN��d2=r��>�=i��+'������[�gϖ���|}}��wqq�|ݴiS�ٳG�O�N�.I�O��$5o��3���J�5R�F��`�}���


մi�4f��h�Bf�Y���*S���q9���_�j���ŋ5f���xF]�|Ynnn�����W^y��H�'�
�={�d؞���)S��K�.rtt����<==5y�d%&&�rJ�9111�0���iٲerww�s�=�"E����Y3f̐$���X��(QB+W���l����
.�R�J�E�Z�zu��Ǝ���˫p��JJJʶsy�yq��������N��5j���F666�Z������ӧ[�m׮��+����t�FGG�D��K#.\Xm۶ժU�t��EDD�L�2:t����okݺu�=
�ʕ+��״i�gtϠ'N�q�ƒ��Rl��UJJJ��!�+++�l6g����'�fvCN~�ٹj�����/U�\9Iҕ+W���>}�h���`������(�c������G���vv���Wǎ������lOg�ҥZ�b�6mڤ���K������ᡁ���'���͟g���ƍڴi�BCC�s�N�����ߖ���ڴi#kkk�#���;wT�V-5j�H!!!F��ٱc�:w�
h�ƍ*]��ёO�.x�_�US�NU�V�Ըqc���C۷o��d�N�JHH�������ոqcu��Q���i����1�q��M����A��bIrpp��dRXX�n޼��g�{���e2��~�z���������{��
���38!Իwo988��)988X����ѣ�����+]��z���Jqqq�={�.^�(777999iȐ!ڷo@�|���V�/Vhh�v��etψ�� ����S�Nںu+���Qp@&n߾����+**J�񇒓�u��9M�81]ߤ�$
4HAAA�駟������x�\�R#G����9׶m۔���&M���פI%$$h����vn�W���J�|}}ժU+���k���RLL�ʔ)�����Ӵi����x���+22RӦM�������,{��5l�0�߿_/^ԨQ��w�^5o�\�*U�￯'N�:t�:h�СJNN6:�n�̙�۷�Ǝ�5k������H����2��QNNNZ�r�<�e˖�Y�"�ڵku��YթSG!!!:|�����ꫯ�ȑ#����$���X�����l�߿_�T�f�tc������l���=z�j֬)[[[*TH������Tpp�ʗ/otD<�~��<x�������!C������X�S�\��&N��S�N��ɓ���ݧv�ښ5k�.]�dtL�Z�x�.]��E�@u��]��>}�5{�lYYY�71:1�LYj��!��.%:i�$���+�$M�<YÇO�wǎ��ٳg���I�T�JM�6M������G�s�?^�T�b�t�*U���d�
��l��l6:
��
����?��?�PPhh����5e�5l�P����֭���
x�ʕ+k„	�>}����y��lu��-yyy)::Z���:v�ht$@6���L���J��ի��=��t^�|Y�����X.\x�\׮]�$�,Y2ݾԶ�>������V�B5l�������JM�6UӦM�h�"�رC����:u�ƌ��-[�l6���S�K�6:. �����4v�X���@q�����)..N�v�R�
���F\�W�H]�"'W��LJJJ�팖�{���nݺ���c*T(ݾ�6�$�/VHH��1Pf�Y���F�P��[o����zK���ڲe�BBB��{��ޓ����f����dgggt\�lmm���:h��jٲ�ё�s������*8p@U�T1: �Qp@&����ŋ:q�^{�5K��'�uttTll�6o�,GG�'����^W�\э7doo�fߍ7,}(H�!@N���1:�bgg�.]��K�.�q�6nܨ��u��]ŋ���������o�p��F�HrssSǎ5d��8qB���FG�OEGG���C5j�Pdd$��@E��x��7u��E͙3G3g�T�5�Gs��I׷e˖Z�z�&M����ǫZ�j�~��֮]��>�L&�IK�.���J)))�|��*T� I�^���\�����t�bcc-} �		Qrr��1Ȳ����f�c
�ҥK�o߾�۷��\����p����}��*W��������&M���9lѢE�U��.\�q��@>�^�z���Uk׮ee3(�(� >>>�ꫯ��?�O�>��ۧO�޽['O�T�=�쳵�ըQ�,�eʔѵk����)GGGm޼YM�6՞={t��i����9���Ӓ��͛gω�>|X�/_6:�|�B�
jذ��1 �aÆ[�///�-�v>|���K�.)44T!!!Z�d�*U�$ooou��]����Q�T�re��_�Ҍ3d6�U�|y�#�G�͛�q��iذa�?>+�@G� _����9���l�2h�޽�u떪T��=zh�ԩ�����-Q��V�\��˗k׮]�z���/.
4H/�����رc�d�]�rEIII��v��i�…���V�^��䈎�V�%��o�Ή`�ŋ+$$���)�٬��`�c@��L��*U�hҤI�4i�N�8���kΜ9�S��������ʕ+�)�ǏWPP�ƌ���0����ݻ�ѣG+  @~~~=z�ё����lٲ�:uj����xI���?���T�R=z�c?L�m�Vm۶M�V�xq��f�X�Bqqq��g������8p��+�wO�<��<
�#�>>>��%>�rKݺuU�n]���j���


Ղ4y�d5j�H����ڵ�^|�E��@�gkk�ŋ�C�8p�Z�lit$yXbb�z�表�(��������H�\B��x��ו���	&�m۶*Q��bcc��GI��ի�����[[�lQpp�Ə/I
����z�葭s@N����U@�B'�VVVj֬��5k��j�Ν


�ĉ5j�(�i�F������P�ҥ���������5x�`�<yR���FG����orww׹s�}�v5o���H�\D� _3�L92nLL�\]]�~�z������7�2e�h���:�����M��#F�gϞ����H-^�X����:�///���W6m�dt�3���Z�۷W��하����H���i�4h����d6�����ߌ ,\�P�j�҂,G�T�.]R��핔��}���f͚FG�BF �?~�F���5k���V�
����<==����g����������'???
2D...�>�;;;u��M���������]]�v��������۷�޽{FG��r�ʚ8q�fΜ���8���C�9�ƍ�D�:x� ��b�@��cc*THf�Yf�9��Ȉs���o�>i߾}���ս{�T�\95l�P}�������s����$)%%%��zX�…U�dIU�TI�[�֐!CT�r�͓���ԩ�3g���ѣ�W��c�=zT���W�:ut��)I�����ϫz��i�2[9�hѢ�X��|||���S�>�y8�󒤟~�Ik׮աC�t��Y[[륗^�o���ݻ�T�Ri�g6NV2���p:tH�ԨQ#u��5W��V�L���;z�w��O?)<<\���j׮�^|�Eu��Uf�Y
6��)��7n����4z�h�[���8�͛7���[o��֭[�%J	`V��)\�zU���j޼��/_�s��)11QIII����a�u��Annn��?��[ ܻwOׯ_����5o�<ժUKk׮5:V��ݻ�$iŊY��/�8i�3F>>>Y�����|�={��`��'���������p]�|YIII�}��Ο?�e˖���GW�^}�8F;v�4n�8�;V���:~��ѱ�\��䤑#G���������k�Νjܸ��V��I�&�̙3F��|���V�-Rxx������0�ҥK���o���[_|�����'���?�q��ںu�������3g�(!!A���Ν;��3g�dɒ��������޽kt�|'%%%�+))I?���v�ܩ�;�Ν;�ի��lْ�YϞ=U�pa�Ν;��{������H�"�ѣ��� \ �<�h"&&&�k���ruu�$}��g��dv^�����۷հaC����СCڷo�>��SըQC���
x�8I�F9-11QS�LQ�.]���('''yzzj���JLL������_�ԩSu��Y=zT�;w�g�}�:u�nݺ�Ull��1 �qssS�N�4d�%''�RRR4q�D
<X|�>��S)R��X�Qp��۷�.]��7�xCgΜј1cT�V-������FիW��ɓu�=��sڳg��.]jt�|���Z�ʕS�֭����+%%Eԟ�it�l���v����ڸq�#�nذAׯ_W�v����K	��g2�d2����He˖�رc%I���N��N�<)I������"E����V�����ٳ%I���32�c�Z�JW�^U���-m��޺z��V�Ze`2 �W��>��c���ڳg��4i"???U�\Y͚5Ӓ%K��/��(66V���7:
�\����^�z���O�V�Ҕ)S���#(����GVVV�x��ŋ��^>>>F���3bcc5`�U�PAE�����|||t����g�>,&&F^^^z�dcc��U�j„	�u�V�~���ںu�^x�mܸQ�=�\���ԩ#___Iҧ�~�n��s�Իwo�/_^666*_���������</I���oժU+��٩L�2rwwב#G2<���
��_~YE��s�=����k���~�z��<i�Gy�/��̙#���i���i�e�>߹sG,�믿.{{{)RD�?����ܴ{��'��i��ٳg���r�����F...ڼys�����#IZ�b�#���O�*��޳�_�^VVVj۶m�s~��w*T�������w��QVVViޛ��^���U���U�xqu����ï����S��U�Vjܸ�z���۷gX���� ����q���ر����d���1OR쑺:QF�GY�W��߿��K����S�7�믿��}�jӦMi�e��Qyu^e˖��׵|X�
�o����~}��Q�j�J�
�p���.h��j֬�Z�n�9s�[�"���͛7�
�\�r�v�L&�����͛^�YT�P!�����O�͛7�bŊ�0a����Ծ}{�Y��G�cT�\Y��׿4k�,���@.�~���z�-}��ڲe�z��mt$@�ZGC����q����С����Kە+W��7jÆ
ruu}�1����l�w�ѽ{�,m�.]�G}��۷+::Zŋ�$�]�V�4h� �ͬ�ҧOծ][���Z��-[����+͍�?����~�zmڴImڴ�p�Ç�E��s玤�
	6oެm۶i���jܸ����~�֭[��czRR��=��G�j���:t�^|��l���x�R*TH�V�����"��7o�E�:z�h���~�MQQQںu�"##աC�,�4�hǎ�ԩS�c�;�N�:i͚5����2e�h׮]����U�r�t}.]��ݻw�lٲrwwl���'nnn*Y����٣�7o�dɒi�Y�h�RRR�d��^�:;۷ok�Ν*Q����ܞhތ�����ޥ~/����w�q5����_�Jv��ױ�-�A�$��)�2��d��63vcF�

���FB�|%�0�� *%���3�S:��~>����ky��}��s��=������i�Ξ=���򦤤0x�`�A;7o�$((�S�N�p�BLM�>�R��w�2k�,�W���v.\��<55���bbbx��Q�
��߿?S�Ne�t�ڕ&M�P�F
,,,�\��ٳIHH����A�q��}�ߟM6l��ӧL�0�ڵݱc�������suu��ѣ�ܹ�nݺe�|�B!���,,,�ر#;v$11�-[�€<x0�:u��LJ:`eee�p��3f�V�Zň#�!�׮]�C����?DDDP�V-c�$��5#+\!�B!�xmݽ{///1b.\ ))�ÇӿRRR���͛:�Rz۴iӴ����/_�̠A�HKKc��\�|���8@�
8q�_}��6����/�g��ʊ&M�`ii�M�����ۛ��$�t�©S�x��1�N��K�.<z�=z�n�}���}��<x�G��o�>ʗ/OJJ
S�L��;b�0`.\ %%���D���K�j���?����s,�ge��eE�&M�R<oƌ?~��իs��AINN&**�F���b�ԩ���>�w�����2���<~�X;k��!C�m���
ooo�R��'((�>>>:�Yz�rM���qww'%%�;v��s��=V�\	��u��f�߹s'��ɸ��cmm��…�������E�L\\���q��a�.]���k֬����ԨQ����9���]�6G�e˖-���iDGG��khVXpqq�^�z����s�N���0`@��ظq#,����8p���@��?/�E�յkW�M�F��Y�r%�y��2�����đY��+W�C���_�0�2eʰq�F:D߾}ػw��xV��C��Z���1M�&�B!�"c666x{{�e�n޼�������dɒ��׏_�Ug"!�x��˗��s���ݻ��"�<yR;���Çe��B��)!��Tpp�ξl��&�l���M#88Xg�M���|}}3�ט6m�Ԅ	ҭgĈ/<�q��aenn�5f��ccǎU��ٳ�^�cǎ)@999i���ϯu�����"�ǏW�jٲ�JKK�9����Z�l��yi���չg��…��˗O���+s��)({{���Yٽ~�Օ�G�)@��ؼ��2e�(@���ozu\�p!�:2�%;}��_+@�j�J�Ljj�jذa��}���R�J�}��rppP�:v�X��g�����+@���['��|:w�5c����
P�7o�V����wߥ[N)ß'"w����mJ)�����UTT�N���l��ׯ��v�rvvVЋ����ׯ�������۾}{���>���f��n_f����9}��Z�|��裏T�&M�����֭��u���Ѥ�;wΠ�Μ9�M�w�rvvV���Ӧe��j����z�s��m���:t����BC��B!�Fqqqj֬Y���Y���N
6L�u!�x�yxx�*U����c�"���v�RT-[�L�{4!�BCV�BaM�@T IDATt�����B-�l��&�lo�l��F�u�V>���t�����w6��ܿ�<y���ӧO�9�믿0t�P��...(��|��6-))	[[�,���]�v0v�XLMu�4755�O>`��������ׯ��t��С���\�vM{�z��(��~�z�����~�ɗ/�?~a�?���u���;V�lY�k����Qxx8�|�^sssƏ�a{��קjժ����4�c��_�N�5pqq�4��^777�)¶m۴3]����p�B����;w.&&&,^���O�j�����*T77�l����͛gzn"�r�
u���IO��իWpww�Y������/ܮfe�={�P�re,,,h߾}��������ñ��"**�9s�гgO���HNN68��U�jU�?>�w�f����|��7�wrr2(_���.X� ���Y��w���@�z�4i�<B!�B��spp`�ȑDGGs��9
���iذ!*T`ҤI�>}��a
!�Q͞=��W�ʪ�B�A�V��cǎt�ԉ_~��…;$!��1p!�B!�ⵥ�R�����z��\�p!�:4/�V�P���P���t�k^�5t�`��			Y>
M��A�Ӥg�p�
�������
h_�?|�0~~~�.]�ҥKӧO6n�HJJJ�����~�y����u1ĥK�gҤI�m�;;;�R��N�:u
�z��[F�\uF���X�l�N�f_s<3Y�&xzzr��>��
�z�*�ڵ�\�r8;;s��~��g:ĝ;w�����*[�>O3pH��4�4[f����D����>|�0˱,X�I�&�������ٻw�K�۶m[�o���ɓ�U����,Z��:�aÆ��3�PM�6��Ņ[�n�����>3�������Ҡ|��w�4������=���6�B!���T��~�)�Ν#::�/_N��թS��|�v�B�Mʖ-K`` S�N%..���!rȔ)S`Ĉ�Y����?�B��d��B!�B����5d5�?�����)P��7o�H�"zy4/��b�f��ٳg
�����}�`�B�
��_3s�f0��4�:"  ��7��~��5V�XA�nݨV��.]ʱ؞������G2ͻn�:ʗ/O���qwwgʔ)�ڵ����;Kmf��4����fN�ݻ7ffflٲE���Mxx8����{v����7[�l`�ܹt��
��ݻ�p�B�|={�|�v�ecccPy�7h����N��v�Txx�����h�=���T�B�޽QJ1m�4�{3��,Xwww�-[ƪU���̞=[�G3x��gGVV�xVժU����4��`�ܔ�k[�X1�ߕ���I��B!�B�gggfΜ�իWٻw/���gƌ899ѬY3/^��۷��B�2cƌ��Ύ�#G;!�Kz��	��>��o�eƌ2��B�Ȁ!�"...���;�s��exl����9��#G�~��W�B��4�6ܻw�T�[ZZ�^�3g�0l�0LLLX�f
ժU{a�΂޴iSv��aP����S�X1��5/�)�{�����v��o��ƕ+W

�o߾T�T	�?����Ç�Jl/s��o�> ��&4BBB��ҥKT�R�I�&�l�26o�����fv�HSFs�yեaooO�6mHMMeժU���]������Fɒ%
�=;פe˖���#<<��Ǐs��a,--�ܹ3=z���_�?�`˖--Z�֭[�T���զM�O�ΩS�x��	111L�>]/o˖-�0agϞ%--�;w�0o�<\\\<x�6��3Cge�ׯ���?,]�4��v��~��G�X������A��6m"))�K�.1cƌL�L�|||

�o���ŋ������C8��1ct�#;��Y���+W��,M�&�B!�"癚�ҢE���;n޼��͛)U�cƌ��ޞ�;�f͚l�,(�o�|��1w�\���صkW��u�ĉ\�?3���ȋ��Ç�ҥ������O2$G�B��ɀ!��
0j�(z���'N�p�Bƌ��ѣY�`����+�P!����$"##�T.99ooo����qww�0o���8u�Aukf�_�x�v���駟x���Ú63�y�ȑ#:�rJ�ҥ�ӧ˖-�ܹs����
Z��ز{�����}	Z��F�N�
��%K8s�_|�}�����]gu��O�f�nv��F����o閉��δ݀�V�\	����u�
��kbff���gϞ��_�}iZ�Z���
4@)Ŗ-[�p����:/�� �^�z���ĵk��aÆ��Ӈk׮��
��ɉ�'O���G�
pssc����˗�#Fh�j4xzzf�������O?��Ą��0�:Ym����3fЬY35jĄ	tVjѢ��*2M�6�G���~��y�l�R�BǺu����Օ-Z0r�H�_�N�2e��㏳�?ّ�k۸qc ��Ϛ4� H!�B!D��L�B||<+V���Ԕ�}�R�D	���ٲe�?6v�B�+:t耇��1)))�҆����gEBK^����iٲ%����ٳ'�>�B�wɀ!�"������*�߿?��$&M����vvv�������ĉIJJz�Q
!�9�]�v��/�?y�D���111�C�:�G���ɓڟ�/���{ٲez�N�:���	NNNڴ���ӦM����ٳ'�����̙3155e����t777���k���>}�̙3x�^�!���011!66V��^ZNƖ��g��'K�
�ԩ��^�x�޽{��={��߆���>�ڵ+�f�B)�SF)�-�"]�t�p�����Lll,E�}ဢ�e��hmݺ///��={�Ю����vE�������Y�t)���.\sss*U��_|�������-AAA���bgg����E��X�Bg�ѣG������_�׭[�=z���ƬY��ծ��'�'O�J�*XZZbiiI���	���?��1b^^^*TKKK\]]�4iR�1ft^Æ
c�…�hтw�ySSS,--�T�C�a����A�ퟬ�ʵuss��Ɔ���z"""���ծ�!�B!�xulmm�%<<���xfϞM||<]�v��Ύ����w�^�&�B�7ɜ9s�z�����9i��͹R�Y����s������������t�t!�"]J!�x���~F������sn��Z����[U�^=��_i�n޼��ի�����W�B�\�����7������p_#..N*TH��SG�QIIIjϞ=j����R����'Nh�l޼Y�f͚��Ç��r��yeee�5n�8�=z�v�ޭ�W���駟ꔹ|��*^��Tٲe�…���RSSUbb����Q_������5y�d��׮]S
P��ҥ����U�?V����K�.
P666��?��)��H�x``�TժU�Ν;�ÇUjj����Qnnn
Pݻwϕزs�^t�����ƍj˖-�m۶
Pj�����E�
������Փ'OԩS�T�޽�yu�ʕLc�N=x�@988(@u��M�>}Z������XյkW�?�L��RJ
4H��>xa�����5y��rttTfff���Bݽ{W�OLLL�J�(��<y�s<��g�<��U���7�����ܹs��/�'�k�x�b������iqqq���E}����:L!D&�O!�/��ի�o�Qu��Q����WÇWG�5vhB�c���ekk��^���u�Yhn{b�:�9ÁTѢEUÆ
�����	!�x[�
B!D\\\pqq��?}��%K����I�F�h֬}��aӦM:�����Ȃpww�Q�Ft�ܙE���&�l�Ɣ���ڵk�W�%J���)Y�$...�]������!��		��ښݻwӠA���iժK�.%%%����S�vmm�,�'O�����t7��+�h�"LLL�>}:%K�$�����{���ҨQ#u�rrrb�޽T�X�˗/��R�|y,,,�����w�e�رܾ}�ɓ'��`P�T)������b���T�^+++�W���͛���"88�2eʼt�7��U�r��ڶm���-����ر���\�-;��Y�_3���qwwg�Ν��ڲ~�z�5k�i,cǎ`��Ŕ,YsssjԨ��ի�4i+V�رc�֕�>*P��֭#��lذ�jժaiiI���駟X�`fff/l;  �۷o��*�����D;�˖-uf���I�ƍ�֭��y�� �.͚5��Ņ�����S._��}�֩S���������dɒkӂ����������.�B!�x1GGGF�����9s����g�֭ԯ_�J�*�駟r��9c�)�/e�ر���1j�(>|H`` �ʕ���
'''&L�@rr�����/&&&�^�Z�������~g�w���l���ڴiC���)^�8C��ѣG:y����۷/ŋ��ښ^�z���C��}��)�'O�r��XYYQ�@5j�?���N�B�E}aaa�mۖ�͛�g��/nXg
!��1��!�oޠ.�os޼yڴ�5k�d9��ǏU�޽��7d�����dz�RJ����թ�z�j���~�����!����p�s�Ω�}�*GGGeaa�
*�ڴi�v�ܩ��p��:+d�=��}���p�����RU�RE}��*999ø����ҥKU�v픝�����P���S�*UR�
R'O�|a?���*???egg���͕���z�����ӧ�͟Q��w�7n��V�����V���B�
jԨQ�֭[�[V�߳u=������ŋ+WWW��g�����,��ʕ+U�ڵ����*X��jݺ���矕RJ�Z�J�u���WV�H)�.\����}m��ի��Q%&&*@(P òU�TQ��Q�F�y3�?��D)��;��t��t�/X�@j߾}֑�{�EdFj�ʍ��>}z�S�n�Zg��f�ε���V�7V7n�P7n�P�7V�����B�e�B�{�=��������ԩ����u��5c�&�ٲm�6���p����g٭[��~��?��R�J�B�
iWX�r�*T��rppPw����;���$��P��R�+��w���|���*W��^�N�:�};f̘?��5k֫�naC�^�={�255U��ފ�B!Dv�7u�B�1��͛7W���*22R����G�i=t��9��-[��������:w�z���?T�~������駟2�E)�������}�$::Z9;;�#F�d�!�x�d��o��/*@U�T�ء�q�yb\��iii*88X����ƍ�z��N�:��S������eCF��k�F��F��BBB^a�B����>!�B侴�4�g�կ_?U�Hejj��7o�/^��ܹc��"K<<<�;CՠAu��	����bccU�&M����{m�ݻw+ռys���բEebb�v�ڥ͓��3S�L1�
MyWWWu��y����&L��U�xqm>MZ�
ԑ#G��Ǐ���U�ҥ�b(T���/���?~�ԢE�����r�kE6d�>��bZZ�6l�211Q3g���~B�v3QJ)�B�W��Ą��`|}}���pqq1�������4mt�Ё[�nѰaC5jD�-ppp�+gh>.\���-[���צ������AݺuY�ti��<�Ύ;(V��N�w���͍���lݺ�%{B!�����ЫW/4�=��&�ի���������ؐ�����X����q��1c�|||		1B�o.y���B��@~�	!����Ǐٱc!!!lٲ�'O���憏�������;D!�x�+W�P�\9�>}ʥK�([�����A�
h޼9���Ӧ�5�ٳgӰaC���6ls���711��V�Z�<yҠ64���7�֭���@���155%--
�5j��ݻiժ���m۶ѱcG�J�*���i۶-nnnxxxP�\���?���r�@޽��������fժU���#{*�B����!�o��ÇceeETTs�̡gϞ�����|W�^��������ŋ_�ݻw(P���1M�&�B!�0�
гgO���ãG�x��	.\�O>᫯�`��S!�B!�"�YYY����ڵk�u�AAA<}����J�,���/��ᤤ�;T!�HW�2e033�\�r���h�
*�Sfڴi���DEEQ�Z5f̘�i;.\�R��K�E���ӧ�4�{�5�)׬Y3��fΜ���5;w�dԨQ���L�6����Lc�NVx/޹s�֭[�g�v��)�-�B�8p!����e��*�mۖ�۷3y�djժErr2�-�C�lذ!�2����Ç/<����T�ǹ&M�G!�B׬Y�(\�0'N������*U���_
��3hѢ�qB!�B!�x�lmm���c�ܸ֭q�o���k׮ѥK���4h����yAS!^�}O�����gx����3{��׆����Ѽ��
zy����~�:AAA4nܘ��D&L�@�R�X�d�A� r_v���p/N�2WWW���8x�`�6�B��%.�B�,(X� ���,[��U�V���σ�={v������7�$::��G��0�bŊ��I��B!��U�n]bbb>|8U�V���sssJ�*���7���|��'�S!�B!��h�/ΐ!C�����?�$00�#G�вeKJ�.��ѣ��ߌ�B�����;PJ�lO�<��?~�xbbb�W�����7��6���O���k�+V�:�QQQ��/R�}����=z�O>������#Gf�m�;�z��{q������jW�B!r���B!�]�t��ҡC*V�ȵk�����kٲ%+V�`„	�;��+r��=֬Y��իqqq��
abb�R��W�R�ti*W�L||<W�\�Xq��m!�B�z(U�s��1vB亰�0<<<��Ba���0�w�n�0�B�ҥK3f�ƌ��ӧ	

%44�Y�fQ�re|||���R�J�U��ڵ+3f̠hѢ8���X�5k3gΤe˖�ٳ�={�0g��4iž={hݺ5��ͣs�δj�
����k�m�6|}}Y�`5k�����a(&N�ȠA�X�z5�5�ĉ4H/o���t��-��ϏZ�jq��E@w�a\Y�O�ҽ���������e�Q!�x!p!�B��ߟiӦ1c�f̘�s�nݺY���}�8y�$~~~:����Lj#��E���ݻxzzbggGxx8�7f����:uJ�^�S�Nдiӗ;i!�B!�Ȣ��Tz��a�0�B!�B�ժU��/���/��ȑ#�����w���g���₏�={����ء
!�"���lڴ��g�r��]���mll�5k���#  �
�z�j,,,X�r%�j���ߟ��
.�;�í[��\�2eʔѮ�i�&"##qvv�i��6�b���lذ�'Nмysm����Ν��;v�X�СC:t�αg�
�2�>ɫ�b���e��B�\gj��BCDGGm�<==�<y2U�T���KKKʗ/O@@��y��������/vvv���Q�`AZ�h��+tV�=z4���������666DDD�����-mڴ��B!�B]����.)/�l��&�l��l��B!�0@�
�;w.׮]c׮]ԬY�/���ҥKӲeK~���޽k�0�o�B�
����)\�0���Ã��(�ԩ�СC�v�,���	''',X@\\����y��Q�\9���y���^eʔ��ܜ�E�굑VVV�۷�!C���;�`eeE�=�����4�e˖Q�n]���G�|��Q�����\�2;�&r���I^����c�D��jժ�t�B�%&J)e� �B�=LLL���7�}�5K�,aٲelڴI;k������`РA�����
!�x!!!���͟m���z���}��}!�0�<O���?>4fHB!D�4i҄�F(� IDAT?���'�B�7��Ǐٶm������Ϥ����憯�/������;D!D���c�}�]j֬ɏ?�h�p�ȓRRR�ׯ�֭�ᆪO�>�I!�[���!�"����ٺu+����;���`;;;�����B�5aaaxxx;!�&,,��ݻ;�9rD��B�7NXX�C!��deeE׮]�ڵ+			���O���һwo��ˇ��;����m�V~�!r���,�]�v�ܹ��m�;$!�����ɱc�غu+mڴ1vHB!�22�B!����%Wꍎ�Εzs���5�}�Æ
�w��lٲ����/_>#G'�BdMjj*=z�0vB!^�����.�⍢Y�B!�o�
����s��-���

�s��-Z��ݻ���C�&M0555v�B�<��͍�]���Gq��I�����yB\\:t�Ν;DDDP�V-c�$��-$.�B�7���3C�e�̙|�ԭ[��Q	!�Y,/�
!�B!�B!rL�%�����r�
!!!�]��%K����HϞ=�ի�k�6v�B�<b�ܹT�Z�9s�h�p�x����СC
*��Ç)]���CB�B!�ho�J����___c�!�Bd���9x��B���4i��l�0�B!�B�*S��ƍcܸq���Bhh(3gΤjժx{{���K�
���
V�ti&L���_~�����.�Kؽ{7ݺu�N�:lܸ�"E�;$!�o��pq��U�9��!�Rݻw7vB!��Ȏ9BXX��n(�Ȳ��0,,,��xM����
�~?+e��ܹsT�\9�垷~�z���hذ!=z�x�:�B!��mW�zu�N�ʔ)S8r�!!!,Z��O?��������C�=���7v�B�7ШQ�X�b�F�",,����FZ�j��ӓ+V`eee쐄B��^z����իWN�"�xK)���B!�x
���l�0�o�\J�nF����_zE�'N�p�B֭[�R��={R�R%j׮�C�
!�B!����Ą�
ҰaC�̙��ݻ	

��>c���4o�___<==eVm!������?>�۷g�Ν�m���!	�F�:u*�&Mb�رL�>c�$�B`�S)�d�M6ٲ���tB!�B!�x����_z Df����u$%%1i�$���������OOO&N�HRRRD)�B!��Yfff�mۖ�˗���)R�~�!vvvt�ڕu����dB��k��
FJJ���⍐��ƠA����OY�p!3f̐�B!^/�…B�z��ŦM���B�ڑ���B�U...�>��M�|�rnݺ����6��LJ��P�/_�СC��B!�B�m������OOO�߿ϦM�		�W�^X[[ӵkW|||hݺ5�W�;w.ժUc���;!^k�=�gϞ�ݻ�
6ХKc�$�B���W�^�ȑ#9]�"�޽��C���B����ɜ���E��nCS��,--)^�8
6$  {{���/F�_����(6lH�=^Y�B�z�*ݺu��ё�7��ҥ7n�`�ƍ8::�{�n���8{�,���/^�-Z0t�Plll�m#��ٝ;w���oٿ?III�jՊ��ǧ[>�6�}6?�Vbb"˖-c׮]����/^����ӿ,--��X�v-��գD���%K����ڵk�ݻ7
0�k�B!�BdS�B����ߟ�������Jǎ)V�=z��LJƍ�,�Beʔ!00��S����G�R�����[�nѹsg.]�Ğ={hР��CB!����ҫW���V��(���x��_���!!�B�)))ڗ���.\H͚5�V��8q���n�:�R��ٓJ�*Q�vmc�&��E�K���Ņcǎq��I���ɓ'�~�:
4��ёŋ�l�2�����]����_�fBB}����ڴ_~��G���}�6SRR<x0�O�֦ݼy��� N�:�…155`ǎ$&&���W���+G�e�Νt��͠sB!�B�3������G��Gq��eBCC	

eѢE�.]|||�U���CB�&Ǝ��ի9r��!D:.\�@�������bŊF�H!�H_��А����,�*ijd�!�"s�U�{�+5�g�����\�|���'�|�ƍ������JJJbҤIxyyagg���''N$,,L{.B���[�n;v��[���ضm^^^���H�Ν111!&&�A�ap{�W���8::2e�*U�DLL�'O��kH����鮢�f�N�>M�5?~<�˗�ʕ+L�6��G��e�<<<8t�U�VՋA�v��!p!�B!�FT�lYƏ���9y�$k׮%44�����jժ��닏��ʕ3v�B#���bΜ9t�ԉݻw��{�;$!^G��s�Δ-[���p��~�B��M�
�B!��ၯ����B!^;!!!lڴ��a�V�{�U���ʊ*U�0g����9�<�������ءl���ܺuooom������,_���C�1:!Dvi�ߙ�GEEQ�hQv����ѣ����ɓ'�ڵ�%JЬY38�R�3gΰ}�v.\���c�x��q�۷����S�zu�֭˸q�6l�Nޗis׮]L�6
{{{ʕ+�g�}���۶m��8w�eʔѫ���I'�B!�B�Y�&5k�d�ԩDFF���8q"
4��ח=zP�dIc�*�0��;ҥK>��CN�<�����C��6oތ��/-[�dݺu�ϟ��!	!�/$.�B]����޽���B!^;���2�"��ܹ÷�~���IJJ�U�V�?^/��7�>}�ҥKٹs'7o���‚���ӥK��ϖ;t�3f�`׮]XZZҤI>��c�/��v��MXXgϞ%99��ŋӢE�JZZ�:u�H�"lܸSSSm��W���鉃��7oδ,,,`���8p@;�"�+/����&�6X�t){���Ν;/^�V�Z1p�@lmmu�޾}����s��A���(_�<����h�IHH`�ڵԫWOg&��%K����ڵk�ݻ7
ȴ�o&sss�t����ˉ���U�VDFFr��}�����seĈ�9sF�������@�:u��L�W�^���=��/^���ݻ�>�4i�<B!�B!^&&&4nܘƍ3o�<v��Ehh(�&Mb�ȑ�l�___<==)T����B�Bs�̡Z�j̙3��c�;!�jɒ%|����׏E�i?�B!^g2�B!�B!D����@߾}�~��6�_~�ѣG��]�p!�V���CLL�=�W�^:����+���HNNf۶m����Y�������ŋY�l�NZ||<k׮�|����ٓ�� ~��Wڶm��w���]�6.\�0�!1���Ç��׏K�.�		��ѣik<z��k_j8{�l�av��Abb"���z�\]]9z�(;w�[�n/8s!����^�bQ׮]Y�r%?��3�Z�b۶m��������9s����4oޜ���S�z�,��(�	ss��M_���d<�B���	��;
M�&�B!�B�ד���ڵ�]�v$%%�u�VBBB2dC��C����ұcG�����"��-[������_ҫW/����R�	&0c�>��s&M�d쐄B��k�;x� �jժ���`ee���#^^^lݺ���2&&&9������6+++����С���<}�4G����k)��9�Ν�����9r$#G�d����0*!��ͷz�j�_����#+W�����,]��46n���8|�0 00�u����?x� �������aooύ7X�fM�m���ȡC������ ""�^�zaccÊ+t�j\4m�4�s�(Z�(���{��ҳj�*.]����AAA>|�e˖aoo�ŋu�&..{{{mޥK��`�q��!�V��wL���#�Ȼ���iذ!��ԩS8p��͛�<7���

b���t��Y��'O�Ԗ��#Ǐ�I?u�^ޗi������p������G�j�+V�����գI��B!�B����ˋ�7��_�h�"�dɒ����c���Ҍ�"�3�%J0z�hc�"�+������?3g�d���2�B!�G\�nݢC�4mڔ~���gϒ��DJJ
qqqlذ�N�:ѱcG<x`�p󌔔���پ};~~~t��]]!�Q�F�͐�q��	.\Ș1c=z4,���
!����E��`���T�^�֭˸q�2mG�Cpp0�ׯ����ˋ��h�l٢�?00WWW,,,�Y�&&L`�޽�q��;F�j�ؾ};���㫯���ټP�Bxyyq��y"##�W���?���Oݺu3=
����Ҟ��ң9�	&P�fM,,,�U��vՊ={��0oݺu�8q�^����eʔ�;��䤓G��u�֍��4HII���+�|�&%%��g��<W��]�vL�6��Ǐ���bcc�:uj�e2kS3��իW��Z�l	��,<{�,iiiܹs�y��������y+W���+W��֤i�!�B!�x�*T��}��k�.����/8w��ڵ��ޞ?�����LWJB�y������Y�v��K"�y��;vdӦM������;$!�"�����5b������3s�LbccILL���ǜ={�/���
�m�6���
�!O�G)�����r��M/^L���ٸq�v&U!�ȫ��ߟnzRR�&M���;;;������d�ĉ$%%��(�B�7S\\5k��I�S�N�e����QQQ̙3��={Drrr��6l��_�vm��s��m��}��}�L�ºu�t����~~~XYY�|�r"##IKK�Q�F/<�^{E�y阞w��ujժ�����7nh�4/?�<r��]
(�wL���#��ۚ6m�]���ё����oѢ�'O���???Ο?�=~��Y�����r�����3p�@6l���?U�T��kh��箧��v������8y�$~~~4h�777V�^M�|�1b���ƍ鯲�I�ʊGB!�B!^O%K�dذaDEE����G�w�^7nL�r�?~<111�S��:v�Hǎ���IMM5v8B��ׯӴiSbccٿ?m۶5vHB!D���.���åK�h޼9����5�jժamm���%�+Wf�ĉDFFR�pa���ϒ%K�v�`nnNɒ%<x0.`�ҥF�J�z~V�f���ܺuooom����n�Ҿl)�B�����u��k<?P��A
m۶e���L�<�Z�j���̢E��С6l��|���LM3�3�믿�̙38::���ǧ�~����-Z�nݺq��	N�:EDD���k�?��K�Y��P/Z��뢙>���Q��^9!ě���LMM������1c�жm[�gxիWg���8�u�����%K�.��ˋ"E�`iiI�6m�+e��ѣG����)))������/vvv���Q�`AZ�h��+tV�pss���F��VDD����i�Ơ�B!�B�f(W�'N$66����=zL͚5y��w�6m�/_6v�B��`�.]������*66WWWRSS9|��A�	!���W>��ʕ+8�ҥKcee����z�������711�t{^tt4ݻw�w��Ғ����Çu�EDD�}�v�y�6n�H�…3��F�̘1��^�ٳg���KKK�…/</�cǎѪU+���)R����=z4�r.\`��T�P+++
.���3��9���K�LVc{��^?Cyyy�գ�+W����L����3jd�N�>���%J���Ғ�u������%����뙝믱n�:jԨ���%������/�>JNNfΜ94k֌bŊannN����ر#���K��!�#ě��ӧ,Y�OOO5jD�f��ӧ�6m�˛��Ȃpww�Q�Ft�ܙE�i_�t�<;�$!!��k�R�^=����6...�]�����\<S!�"optt�h�����)X� ���,[��U�V���σ�={�^ޓ'O��8q��e�fXTTAAA>\��gWS�ݻ7����[����HLMM�3�"55�����_6�g������k����i�����:y��(V�����;�I��B�}$::�޽{�+P�ӦM#""���HV�\I�6m�e�͛��Ho�G���	d׮]DFF2}�tlll���f۶mټy3G�aǎ��d�ȑ���s������̙3�P��^<�������������~��w������y��B!�B�:�U�_}���'4k֌9s�P�|y7n̂�믿��"�ʖ-�رc����u>�"/ٷoM�6�L�2<x�2e�;$!�⥼�ԬY���k׮���B||<!!!8;;�m۶,�imm���r�J6lȏ?���۷IMM�ҥK|��W4k֌G�i�Y����S�h�L�
 ""�cǎ�oݺ��u�j�*nܸAjj*7n�`�ʕԩS�_�5�:�9B�f�ػw/���ܻw���p�6m��Çu�;vggg���;���RRR��>Ǐ��>�N�:zT�Ll�ˍ맡Y&/_�|��۷/Ǐ'11������ڵK����Mjj*'N��K�.�{�E2�%����뙝믱d�������%55���8����U�;w����ػ���㯤R�e�#��
�,e7L�Xu�l�!|g��
1�a�-2Ӑ��b�dFY3��i0����wΧ�S*t,���q?��}����}]WZZ�Z�b�رDEEq��m=zĭ[�رc;v��.���u�x�bV�Z��˗y��!���$$$0m�4���5�������bݺu���7nh\�o�g�ݻw������S�mNNN����z�
!�"�.]�0c��������ĉL�>������~����өS�666��?}�t����رc̘1x2*����Đ����ӧ�פ���j��X�"={�d׮]���ҠA�|	P���$11ooo����V���)'u'�3fp��q���9~�83g��g�P��>s�L�1KHH���I=��K�rmS��^!�T�
�J�*Z�=���������C��	!�B!�(.�nݚ%K�p��u�o�N�ڵ�Z�jt�҅u����D�j���y��w?~��C��K�.t�ԉ={��L!��UWl.n߾���+iii�3���$222���a�Сdee�T*�q��~*�*ע~�`ժU��/\�����y��^^^\�p���,��ߏ��5ǎc֬Y�����|��'j���	�[����X�������;��ٓ��D�.={�����׏��d�ezzz������ٷo�k�&++�iӦi�3fiii|��g$%%���Ezz:���;���\�x�)S����r*�+(��㜣�甔�DBBw��eΜ9Enߝ;wP*��}N�8Aff&���t�ؑ#F<3V]���|6Ncƌ�cǎ=z���LN�<I�޽���@�P��j�~�����cggGtt4���<x���XQ�T�>���񺊈��L�����������q�FN�<���=!!!:t���p>��>Ldd$@���8p�����A���#�B��yxxP�n]���6l-[�dРAԫW�4x�}�m۶8::���@�&Mr�P���e˖|��g$''ckk���[�u�;)L�4	'''<<<8{��f��ӧ��8�Jhw`x�z�,Z�j��9t�̚5Kg���Ƥ6h� ����v�����l�OOO�_�������������f͚\�rEs̆•+Wr����C׬$���B�)LMM	 22�7np��
"##	�s�!�B!�o.###>��c֯_OJJ
����*U��ÇS�J\]]�����UQ�J�b�������o�>}�#�3g�������",,L�e
!�xc[��+V������/s����ښR�JѲeKV��� IDAT�\��ѣ�{�.K�,ɷ���X&M���q�P*��m˗/'33777�-[F͚5122�M�6����a�M~�蘺p-�E�q��=:t�@DDvvvcggGDD:t��c���:�o۶-�j�
333ڵk�ʕ+8x�VޣG�0{�l���122��Ԕ����֭[_Xl9���SFF���L�4��c����3���?���XXXP�Z�"�o�ʕܼy��;���-���4nܘ]�vaoo�̸u�R��S��Y�95nܘݻwӤI����_�>?��#~�!�o�fŊ����/�ׯ�U�V���bbbB�-X�~=Ǐ/���(r>8��3V^�/�����u������+qqq�N�d�x2³��
���ԪU����g�t���S(֬YS+�B���i�i���|������R�|y����ܹ���D~\\\�4i������cccj׮��uvl�;w.�[��dɒT�T���|�r��O7n}������.3g�dذa�v�N@kƸ�m�>�
�cP�F
���	

}fg��ƤfnnΚ5k�ׯ�*U��АJ�*�P(X�v-�����|�����уr��Q�dIlll�:u�&f5ggg��̈���UgTTeʔ�̘!�o��M�2r�H	dԨQ:;
!�B!�x�������Ɩ-[�q��/���o߾T�ROOO���ãG���"=z�k׮|���dgg�;!���Ǐ�f���̙3����S�D�=�*�B�t%����۷���:�:�y��gϞ\3;�ݽ{�BAvv6���̜9Sk�/���ȑ#s����T-##�2e��19��?~|�/	%J�`„	�����ܹSg�F��+�y�����j�W�^���$�v�ʨQ�h۶-իW���.W��7������[>��_~I���unk׮]����o۶mL�0!�>%K���ח=z���X�r|
{>�?'???J��~�0n�8~��W�oߎ��?/^̳�����kG]�G�ו��7S�L!66���X�-[���'J�R���˗�|�8w�\��ܾ}x�����i�<B!��_�ҥ�����J��t'
]�6z�����je˖e�����y�sss�sRwp�鯿��tʬU��3�/��Ƥ���e�2~��My^�B��	j��}�]MZ�ҥQ*��^��k׮i:q_�v�?����Çk:�
!��@�Tj
8#�B!�B�T�|y>��S>��S�_�Nxx8���8;;S�re���P(�hѢ@�m!����iР.�V+���xxx���?J�~���B��[7“'O`ii���A��������<�6l/^��ښ��P

���hmԨQ�bR�����V���Uw�x�:=��m���s��G1}���V���/111xxx`ee���C�!""����[N/�=�T�RX[[�T*ٻw/���y�Uw,ȩ(�KLL�Y�f:�qtt|fܺb)��)�,l�����t���éS�tn?�<۶mc�ĉ|��GXZZ�۹C���(ԣW?=�u^�/�G}�Ν;�4i�5�,]���]���?j���w�^���7u��W��P!��푞�έ[�4�0@�=��m����?�@jj*�?�…��C7n��РAT�RE3�<�q����b�]!�B!�B��EժU��СC�={��#G�w�^�]�6����8qB�a
!r���fܸqL�2���d}�#D�ݾ}�Ν;��o��g��l!��Ul.������V�ZExx8���lݺ�����ʣ~���3V�;;�>}�@��\S��;k�-[Vg~�����׹=���2x�`"""hҤ�&�ʕ+�]��>}�`kk���_Xl9=�S�T��������S�N���kӢ�O�����ʕ+�oy�R��S��Y�9��^uzzz�V��M��]�6�kצG�L�6��{���>��2ڬx�XXXУGV�^���4h���̝;W�G�i۶m�:����q���|�x�w�'39=M���#�B�7_۶mqvv��ɓ����9��k׮|��t�ؑ�͛ӷo_���(_�|��=LMM	 22�7np��
"##	(�oh!�B!�B!�Vu��aҤI�<y���x�����뱷��Q�F|��\�tI�a
!*T���_~��P�(��/Һuk._�Ltt4m۶�wHB!�KSl.Գ6ܹsG����ѣG��=u��G�����7bkk�o�I\�M�6�޽�@�Ϟ=�;C5����~]�“���y��ݛ�G�r��%�������������oo��󜿗�(�S�����z���œϢ�W��5�>9;����������W�'Nd���lݺ��g�����ٳ�f4���t�ԩ�y�i�u��???N�>ͣG��u�,���///M^�L�/_֤խ[@�EMu�:�B!�|�*U��ĄV�Z1��\�;�nƏ�رc�_�>�J��D�XZZ���Bpp0ժU˵OӦM9r$���2j�(���B!�B!�B��iܸ1�}�/^�?���ɉ��@��}Z�n͒%KHII�w�B����̘7o���DEE�;!
$>>GGG��������yN!��MQl.ԳI<x�P�=x�www��ә2e
=z��3o�ڵHLL,P����,[�L3[B~~��'RSS5��3���:���E���bȐ!�^��3gΰm�6���Rb+�{���>{{{�=�s����"��ǧ ��y��_:�������X�|9�N�b�ԩxzzңG��c?~\�6
�:4h�d4�m���舟�����f͚?~Z�h���36l�T�R�3F�W=C����f��V�Z�?��i�N�B!��/�V/ӎ;8p�,�R�J/���P�D	�J%6l ::�Ç�m�6|}}�m�R�dΜ9̙3�BQ�!�WHH��"�,����,!!!���B!�x�J�(A۶mY�l�fV�5j���CժU�ҥ�֭+�@�B���ի]�ta�ȑdgg�;!�{�nڷo���=QQQT�ZU�!	!�/]�⪨K�.���3}�t:w�Lɒ�U��������̎;4�_}�Ǐ����|��С��'�W��<�����H�
�Q�/^�y��t�ܙ�{�����?�����β�^�J`` %J�૯�Ҥ;;;s��QfϞ�G}D������c����}���f͚\�t���D��촶999��"c+�{��Ҿ޽{͜9s�ܹ3��<�R�4�VQ�Oa�ga��H�6m�ڛ���̙3�:2�;w��*g�ܹ��322^��-B��~�QJ�,Ixx8�ϟ�z��i�F��L�2�j�*~��wRRR(]�4M�4���K�)�|�-Y����d����'�g���'**��j�E�2e�ܹs1�X!�B!��_|A�^���BQhVVV�A!���ѭ[7�u�Fzz:������2|�p����ڵ+J���]�bjj��p�x+,X��
�t�R���}�#�Nk֬a���(
V�\�����CB!���9�r���իWUe˖U�?�Pu��!UFF���~S
6Lell�*Y���رc�}�nݪT
6Tݻw�={Vebb�T_��*99Yu��}կ������S�ɓ'k�s��ջᆱT��j��Ū���[���CUzz�*!!A5{�lU�ʕU�jҤIZ�_�rEenn�T={�T�8qB����:qKgϞ*@eff��x��~����v��_��jϞ=�{��>|�JHHP9;;�U߾}_JlE9i��Qڗ����V��
P���Gu��IUVV��ĉ�޽{�J�.�g���R��S��Y�9c._��J�P�N�>����T��ǫ>��C����R���j����V�#F����U��٪��DՀ4��K�.����B��Uppp��o�e˖�TW�^դ]�zU���Z�r�#B�Oo�'�R�R*�y�!DA��~��B�&��7!�B��n߾�Z�j��cǎ*CCC����j���;w�>|���x���,,,T7n��w(B�2u�T�������O���c}�#�B+�J�z�!!!���u1O��c�\]]����Y�ҥK1b�f����G�>3��u1t�P��;::��o�Q�T)����D\\\HJJʳCCC����2eJ�m۶m�o߾dff��fbbBXXX����3
�u�umOMM�e˖�:uJ�>ժU�ԨQ��V��W�v>˳�/J�8���3���ϵOPP���暢�Y����|�c޸q#���X�"�v�I�&���+W2l�0�uL�8���0������ӧO���;ׅy�o.���Q*�:��V��׏6m�0~�xfϞMtt4���>��B����O��� 88X�B����o!�o"�|B!��7nNhh(��bŊ����BA�V�4�!^���t�ׯO���Y�n������lF���5kX�x1^^^�I!�(v%����]���2k�,���Krr2fff4oޜq��ѹsg����w�����N�:̜9�����өU����gܸq�������ޞ��֯_ODD��7o����+++:t�Q�hР��:�w�N||<3g���_����bŊt���ׯ_�v�baaALL�f�b�֭\�p��R�fMz��Ʉ	�X��K����8�}�Z���?��o�a�޽���ԭ[�)S�еkW<==133+t,�=>�=�E9�j�����ؘ������\�2ݻwg�ĉXZZj���011a޼y�:u
�7o���7�|�	u��a�,_�\�Å�����Rʍ��{)����Ԕ��F�̀���d�…��B!�[#$$���}�!�x
����M޿�B���B!�v����=�ѣGs��yBCC	

e�ҥXYY���R��>�w�B�1��̘7o���:�6m��;$��>nnn�۷��~���ݻ�;$!�B/�u�!^u��7������p��}��Ƒ�/~��7�ÅZHH�fv'
�^�B�jx��?==b�C��|��>CB�Ƭ��hѢ #R7y�B���B!�B�����	#44��/R�~}���Q(ԩSG��	�Fpvv&%%�#G�P�d���,��?��C��ݹx�"۶m���B!�j�L�U��������ٳ:�Z�
��M�whB�"�WLj�E�T��yB!�B��F�-�F�B!�B�iذ!
6d�������ҥK�<y2͚5���777�U���P�xm-Z���
�t�R���}�#�BIIIt�҅%Jp��A�����B�W��B�UZ�h��}�pss#00�-Z`bb…X�j�}�Æ
�s�B!�B�].\HHH���B���J��h!�B!�BQ�prr��ɉy���믿�ԩS7nm۶E�P���J�
���ƌ��ɓqww�R�J�I�Ebcc�޽;�j����bŊ�I!�л�@��4g�ʕ+DZc���)S�FFF���0{�l���[ڷo��@�B!�x)�JT*�,��"K��!N!�B!�B�

�裏

���~�bŊx{{S�J�w�NHH����w�B�6������`���E�E�l�Bǎqtt��~��B!�'.�[�I�&$$$���M���155�dɒ���{���s��A&L���0�B!�B!�B!�B!^;&&&��ݛ��p���V�^ͣG�<x0�+WF�PIff��C�V�tiY�~=�w8�-�t�R\]]8p ?���K��wHB!�+��������{̛7O�a!rؼy3FFF�C!�x�l޼Y�!!�B!�x\�|�C��;!�KԷo_}� �xM;v�ƍ�~T*U�m���0�p��M6o�Lhh(�{��lٲ����T*i׮��������}��j�*F�E\\��N�K�R���믙={6�|�
~~~�I!�x�H�!�z�e��l٢�0�B!^����M+�/Sxx8����lْ~��K�B!�B�‰������C��zPY!��W�^lݺ��xy��w1b#F��ʕ+lڴ���V�^���%���C�PТE}�*�+e��4lؐ�˗3j�(}�#�0YYY|�駄���v�Z�B�W�t�B�W���?!�B�7ѱc�X�x1�6mB�R��憍�
|�CB!�B�A��
��			�UB�"ۺu��C(��ի��W_��W_q��BCC	

e��ԪU�B�B����Nߡ
�w�����/���ߟ~��Q�bE}�$�w����Ņ#G����?ӹsg}�$�B���ÅB��Q��B�g�w����L�8WWW,--pqq��ߟ͛7cjjZ,q!�B!�B!�nu��%  ����=Jhh(�֭c���4l�www
5k��w�B荟�6l`„	�;��v�]�v��͛DEEѨQ#}�$�B��^Z��͛7�����)y_���/����H�B�W�|���(��	o�5k֐������&M�Pʚ5k9r��B!�B<��˗9t萾�B<�/"���޽{L�6���p�]����%���g�ĉ�*U
�RIhh(�ׯg���}ճ����W����ٰ
RG��?�رc9x� �����ۗ��@J�.�ɛ�����/���ܿV�X��}�?&  �M�6q��E��������O?e�С���M�ҴiSfϞMTTaaa̙3???qww�_�~T�\���]��Z�2e�7onnn6��-[�;$�KLL�k׮���s��AjԨ�B�W�K�p!#�!�(���`�J���B!^9�g�`ԝ1���{���+lllX�|9���^���{���������3t�P�������_ټy3�O����oߞ�#Gbff��w��-�,Y��AFF;v�����AݡD��ܹs9~�8&&&t��	ooo��(
�ƴ�4���h֬�*UҤW�R���0`�����!�B!��-��xͩ�B�]<x@����t�3f������޽�%J�t�R�������i׮VVV\�|��#GR�Z5V�X��=�#�:p��-��u��˗���#���{�ܹC�V�8��f���RSSs�����w�}�Y���"66���XRSS;v�3�S�%h׮�ڵc�…�ٳ���0|}}3f~�!���P�l�g�'ě�o߾,_��Q�Fq��a

��x
�۷�޽{ӰaC�l�B����B�Z(��,��T*Q�T��"�,y.B!�B�Ls��%--Mә ++///֭[���y��!7n� ((ooo?~��wٲeL�0���8�ݻGvv6��Ʉ�����j򥥥���Idd$w��%++�]�v���R�4|�p>̃�{�.?��#s���l/Lw��Mzz:NNN��qrr"==�={���v!�B!^,}_�EY
��C�Gs��!..�-Zp��1>|ȉ'hݺ5���AAA�+W�u�֑����y���
"55��k�R�|yT���{W������֭�ٳgIOO�\�駟4�9�<���:t���L����?��,u'�]�v���IZZK�.`ѢE�>fFFF|��'lذ������133cĈT�\6o�LFFF���u�d�4�3!
#,,�.]�йsg���#�-�B�Bx�3\DGG�p��]��
���B!��V�Zifuظq#'O����___j׮�5�[dd$�z� 44x2
[���100 !!��Ç��cÆ
\�v��ի3m�4lllHHH`ҤI/�M5j�   �ʕ+�z�j�������57?��P�~�\���8@�>}^J[�B!�B!�x[�����`kk�ڵk���f�ƍ:��;2f��ΝK�֭���e���t���ա�h�"�ԩ��1c�>}:�o��l߲e+V��y���mۖe˖��'�h�U�L�޽�ܹs9q��z�bĈ�1���)���������Ɲ;w��� 44�B����z�B�PЩS'�����>!^5���c��������JŊ��xM|��wL�0ooog�- IDATs�t$�B����O�˗/�9m���y�fy/MJJ
�ƍ�]�v899�x�bppp�whZ���;v,cǎ��GB!D�?ϟ�\�+���C��`�޽̘1

�U��رC�w���9r[[[v��ɂ�5k�����۷o������addD�&M���_h��Ə���&&&�������"��̙3��NO�Y��V!�B!�B!ċ���<4��@�X[[�����ƌ4hЀ��Xlmm�f�}Qu���k��P��֬��Ν���Qk��m��*+00SSS���×_~I�
�1c���ό�0ʕ+���'{����իL�6���$>���V��ȑ#����j�o�ɓ'cjj�����C��G�1z�h|||�;w.s�Ε�B!D��.��!R!��BBB4�	���Y�y����رc,^��M�6�R�pss��Ɔ>�@ߡ	!�ou��˗/УG���7��w�1c�p�ԩ\�T*���W�аaC�<�7.R��R�vm����
�´Q=2���y�|괜��	!�B!�����R����B�����ݻw��f``����9���z��Fs^#t�"���3[�la���8p???�1c^^^jGaT�R�/���/���.Jhh(˖-�z�긹��T*_�[!�S�2e��������O?�e˖�I��222���`ǎ���ѷo_}�$�B�����B�7����X�l���ח��8�����L�8WWW,--�Z�*...���������B�W�������A�� �	���3W̞=�S�NQ�zu<<<�<y���X���� ��nx�%g���H�VЛ�B!�BQ���|��gԯ_333LLL�^�:���l߾]�����/��۷111����T_�V�\I�������,��ŋ�T�\Kvv�V~___h֬'N�(����� �ԩ<�!8���X��˗/ϐ!C�������L�0������c����z���5�-!!���?ҤI�իǔ)S8{��K�C��I�PЮ];>��s��E�t��m:w�̾}�سg�t�B!��t�B�Zppp���!�����(Q"׃���f�RRRpwwפ)
RRRX�f�#B!�|���l۶-WG���8>�ɫ�A���7ݻw�*K���z��Z3l$&&��v�0m|�w�#٩��y�B!��EJII�k׮�iӆU�Vq��i222�����ի���t�֍O>����T}���
		!++���,BCC���cذaܹsG�a!^a�{�@�TOvv6��Ɍ7:v���o�1o�<Z�ńh۶-,��~��Qw��ف�0u�B�`����߿��r��a��+o�ڵ100`ٲe���ѨQ#5j�,�e���g��������������˩[�.̙3G3����E���_�b�
}�"^1.\��ɉ�W�E�6m��B��+�)))888ЩS'�^����]�v}iu>�!]}��̙"������ѣY�t)�Νә�ܹs,]��ѣG���\��&���;��c���V���ܬY3�z�g???رc�־�v����\�<]G�t�zff&S�L�u��t�ؑI�&q��M�}����Y�fT�TI�^�J#--�9��B!�ҡC���ӧO���#nݺłppp�9�}LLYYY�>}M����.]�0c��M�'N0}��bhQn�icݺu�t�R�r�i�<B!�B���?8::�s�N�V�J`` 'N� ==���LN�>�7�|���9;v�G�E�[�ڵk8p�ֺB����^�z<x��M�bdd���%������1g��ܹ��177gÆ
�n�:���4h��sWŊ�'���3[���ꫯhܸ1�/_�]�vӢE�4i�+���9r$����T*h׮]��~hٲ%,��ի�ݻ�F�1m�4jԨA���Y�|9�n��K|B���_|�'N��]����fff���`kk�B�7B�w�P��igg��noo_ܡ�ݗ_~I�������[�8p�AAA�^�Zg�U�Vā��u;v�ŋ3n�8���+-Zğ��ﰄ/����*Ub���$''���̷�~K�J��-R��f�b۶m<x���Tv�؁�����k�w�&==''�\�;99���Ξ={��0!�B<���Y�&Ǐ��Ã-Z���̆
(U�cƌ��m߾=�&M���	���N�>
���u��%99�aÆѲeK
D�z��E�i��8�تU+@�l�4�H!�B�
2����Ӯ];N�8��_~���-���S�n]���9x� �ʕ�?�`���������ѣGy��wY�t)*T ..�'N�;4!�@ٲe9x� ���ԨQ��%KR�Bz��Ell,�7�tV�r�
�-�t��Y�&�-��ի�9�P�V-J�,Ifff��(���Lj#�X�"&&&���O��Çg���4i҄R�JQ�T)������aݺuE<r/���!�:ub���$''��?R�JƎ���%ݺuc�ƍܻwOߡ
�L�&M�T�R|���E�v��E�v�hР��fvt!�B<�W�Åz�m����r�V�ʡC�x���V��Ǐ9t��+W~!���222�8q"���XZZR�jU\\\�'##C��	!���w�u5sss�L�����4i�?f���ܿ���,,,�Twtt4.$&&��� �V����ٸq�&ρ�_�~���i�<B!��_^���)S�AAA(�J,--144��‚��۳v�Z��ƍ�G}�y���Ύ�3g2l�06m����1��=����/_ccc:w�ߋk�Kj���3fffDEE�*'**�2e�йs��_!�B�\�t�aÆaee���	�����ߟ�'O��o``���iqqq��ۗ�+bllL�ڵ�����bTT;w�bŊDDDP�\�<㶷���o�`�ʕ���>}�A�Q�Z5����V��&)))�v9r��;bjjJ����ѣ�ֹ_RR^^^X[[cbbB�r�hڴ)S�Lь*���姰�OM� �B��t�Ҹ��k��>F�.]�iӦ�.]��ݻk�9y�$
��J�*allL�&Mضm��y���z�K_�|9u���Ȉ:u�h��?|�����W����1���g͚5y�U������B����3o�<.^��Ç�u�?��
4��			A�Rif+R8p *���������y��!7n�(T*�
�J�+F]�,]����<x��M�077י��ӓ�G����AFF			̜93���`bbB�^�#%%��� �I��*U��ݝ-[�h:�񪱰�`��٬^�:����f��w�N�>}ؾ};���I!�x��,�Jt�������k�-ZĢE�
���-[ABB�5Ҥ?~���4:t�@dd�#|=�Y����ͅgxr1:44�5k�hF�B��Fz~:�0�͚5C�Ţ�~JBB
���͛9N��
6��ϏQ�F��k�7Μ9@�5r��F�G!�E��Ǝ�رc�-��ܜ3f�ܦ�t�V�ti|||���yf���t���ӕ^�6�.]�R��ի�v�ժU�ڵk���>33��+�B!�x5EEEѭ[7��x���			!""����]��LSSS��u���駟���#M���5k{��!**�ҥKh����B�
Ϭk������v�}�v���5P���Y�n?��[�l�S�N:�<t��۷�<x�m۶�{�n��ۇ���&�#G���IKKӤeeeO||<k׮%66Vkг��iE=�=�k��d�ҥlܸ��3gbhh�g�������h��޽{�ٳ�Vێ;FϞ=Y�~}��TS�Ne��ɚ�s��1p�@*U�Ċ+����l;}�4���������U��
�#��V�L<<<����֭[l޼���0��郅�...(
:t����M�P�j�*F�Ell�����L�”)S���c�ԩ��W!�x	�}������<y2�:u�e˖����cǎ\�~��W���h߾=-[��[�n������;88�|�7���ĕs���KOOgѢE���GGG�w��ҥK����YW�-�ܣ�<x ��SOA���ǏY�|9...8::Ҷm[�–-[��*�qU����ӱcG���
{AcJKK#,,�f͚Q�R%Mz�*Uppp ,,L뢺�5j�(���IHH�V�Z|����U^˖-��?���^��I�}�6���i�<B!��aРAT�R���`MZpp0���xxx�12!�B!��}�6������1f������� &&��C�����R���7�u�%g��U�Vi��p�Ç�ѣGxyyq�����ؿ?���;v�Y�fi�GGG��'��
&&&�n�cccMZrr2���dddгgO���$11��={r��}���Grr��2===��㏉�����۷�ڵk���ŴiӴ�3���4>��3������"==���[[[.^�Ȕ)S^Xl9���ڵ���d�ׯ���֢Elll�q��w�η$�{�.s���Ν;(�JM�N�8Aff��݈#�٦�Z�d	k֬�Ν;���?t��
�J�B�`׮]�����˗qvv`�…Ze<���<=�{�בB���;#������ҥK�����_ѹsg�{�=F�Mll��ϋW����/毿���X�����:t(�|�
˗/�o���B!�KR,.��∋��LiX�F
���X�v-666�<���נA�ؾ};w��!;;�s��1i�$�Դ˖-c„	���q��=���INN&,,L3հ.-���<��ˋu��q��uʹ�AAAx{{���\�4k֌%Jh:X�EGGc``���Ea�)h{/^̪U��|�2>$==����M���Oa͝;���4MG���^Иv��Mzz�f������HOOgϞ=En���ԟ9?�K�r^˫�@ɒړE�߃J���G��m�45u���B!Dq255%  ���Hnܸ��7���$  �R�J�;<!�B!�sX�b)))���2w�\���)U�-[�d�ʕ�=��w�dɒ|ˉ��eҤI�7�R�ٶ|�r233qsscٲeԬY###ڴiChh(6l��t����/r�-ZĽ{��С���all���t�Ё����ŋ�ܿm۶DDDЪU+���h׮+W��u���ѣ̞=kkk���055�}������u��[N�s��^���^Woϋ��?���XXXhfC\�r%7oޤcǎDDD`kk���1�7f׮]���?�ME�x�bLٲe�T�����۷�>}:C��L�2T�^�����U��
�#�����{���_Ǚ3g���b���8::R�vm���HLL�w��-gkk���7~~~���G����ӫW/���زeK�YڅB�b���oO���[���7obkkKDD���w��i�/���p�<Ȋ+�'S�楠�UA���0<�R��ɓ���¡C��>����DFF���‚z��q��nݺ�͛7IJJ���Z��̅����Y=m�E����a�������iӦ�JjժŁ�:uj�c/hL��At]�W�==���d�Ν;���-�ϟ�u�K������s���Y���ǵ֏;��￯I{�w�{�n���i�<B!�ťiӦ�9���@5jM�4�wXB!�B��}�v��O�C��;��ݻwQ(dgg����̙3�����/�92׾�T*.\��I����L�2�h���{�0~��\�۔(Q�	&�s�N���5*W�zв��T���իеkW����r�f���*��k׮���r*��ضm���_kۀ000 22����/Ϻ۵k�+M=X݄	r��dɒ���>�EEצM�u�߮��Z�jժ�k��}=�F!ě��Ɔɓ's��i����ӧ6l�A�4hЀ3fh}�8M�4	333�wO����ر#���_�[�n�I!�x��Å����u5����ƍ���
333������㧟~��ۿ?G���֖�;w�`���&����3���_TE��wAvƌ���`hhH�Z�`ǎ:�kѢ*�J3���Q�T�h���)h{���&<<����WWW���tv)(�)�{Ac:s��d���լYS+��u��BBB��

�I�&���r��M�����e�2228�|��M�>���D���9v�3f��L_P�n]����NS�B!�(NJ��9s�0g�
���B!�B�'O�����\���\RRR�e6��/bmmMhh(���Z�Ճ�4jԨ@1YXX��/u��fvϙ��:��ֹ�J�.
�k�yu'���<<<�����ʊ!C��kV��-������P233i߾=VVVZ�jԨA�v����$,,,Ϻ�MrR��m֬��}�٦�zz���3N[ZZjm322�Y��
�#���Ҹqc���;.^����iӦ
��ͣv��8::�p�B�����x��)S�y��v�Zbbb��xI���o����y�&���@!�B�X%���988h�Ϟ=�ٳgkֿ�������lׯ_����͛73f�N�ʵM�R�_A�/���p��ez��s{^b�7oΚ5k8x� ݻw�t����na�)h{����2e
�����Ʋl�2<==Q*��*UJg=���P����۷077�U�:M�G�zJKK#  333�N�Jɒ%	@�P0y�d6mڄ��9�۷'""����3�|����,�B�
<X+���777�z�V���?HLL�5j��f��#u	!�B!�B!DQt���Z����p���ٺu�f����rt�
kkk���8}�t�����z�^�Y�lٲ:���䜽8��ܫ<x0e˖eڴi���p��֮]�ڵk�]�6{���5�BQc˩��o�ڵ����uY�v-#F�йM=���zԝf�V�\���[$yu�ru������B��C�%hӦ
mڴa�����/�������رc�С
�����)@߾}Y�r%#G�$..��ߙ���ȑ#t����w�q5g��_�J��0bЈ3FED�!BHi�(��Ɍmd����Ӑ�"dkc,!L��oc'c�Qiq��;ݺ�-���������|>��n�{�yS�re~��>��#]�$�B�7
4Å���	��̙3�t��+W��ۛ	&�o�+��T�qŚ��+c_�d�!�^�zs��1RRR8~�8������m��m۶�ڵ����S�^=���X�x1NNNlڴ)��;��[�6vmcR>'2�BN_���"EGG��g̘��G�1b+V�bŊ�1���XU��C����Jɒ%122��ޞq��e��9shڴ)E��|����ٓ�K���w9::bjjJddd��###)V�mڴ��	!�B!�B!��r����8
E�?iii���t��FOO��k�bee�m9evWR.8�g���_�z��e����*SNZx���}����b{]]�v��ɓܾ}��� z��%�jU�!C�����r�.^����9;'N�и�ZV�Ǧ<���:��4}�����u��u^B!DnҾ}{V�^ͣG�

�x���Q�B�v����ILL�u���`�.]���ŋu��G�v�U�Vԯ_�����d!���Ȅ���h�[�.���,\�kkk� Z�@Z�����;v��� �B�N�Զ���j�O���ӯ6�M�߼����ݾ}��yQ��8qB�~FFFX[[Oxx8���|��gY����~rs<%J���ٙ�˗�z�j|||x��s��Q���y��9�&&eJbM7��e�!
M2җM�:���h:t�V�C�DGG3u�TLLL9r$�����ѣ,X��r��e9�dɒ̛7�cǎ�s�N
�i�>�///Μ9���U����̙3x{{k\9L!�B!�B!r�z���l��JJJ��Ã��&M��e�q��9���enY� IDAT`ɒ%�l�ټy3Ϟ=S[K�gVߕ?~\�^~�R�
�z�b���\�r��۷p�7[^�ߪU����/��T��������u�p��I�۳[(I��YBBB�m����1�����B��ebb������<z�%K����@�=(_�<_~�%;v� %%Eס�wL�Z�:t(�Ǐ��Ç�G�+V��쌫�+۶m�:ӠB!�O�����
W�M����kҤ	�֭c���L�6�R�J�`���¨\�2�7oV��_|��7�<y���ٳg�)S&��.]�'O��e��u�FLL�jtm����
��;w�P�JZ�l�ʕ+3f#F��F���űv�Z֬Y���-K�.��_Æ
���bŊ٦d�K?9O�Ν��>#G���ɉ5jp��]@=�����ĮmL5k���Çܾ};�Ċ۷o��!D^����c����1b���������&�B��BBB��%!D�mذ///]�!�BQh�k׎S�N1u�TڴiC�"�_������N���ٹs��|���={Ǝ�m-[��̙3,_��&M��m;�<�~�)U�V�֭[���ڴiCDD���lܸ1�Eh�ݻ��ٳ���g���rGGGN�<�̙3i۶�Z��/_2{�lZ�n��Iʁ��9�o���ԩSGm���}���[n�_ZZk׮�믿ζm???�iS�N�� �x�v���Ç	�M�6j�`
���4)]�4��7'N��e˖jۂ��r�;?��W��_�|��<B�~+Y�$�z��W�^<z􈰰0֭[G�N�(S�nnnxxx��� ?D�7n!!!�1�իW�:�&O��ĉ3f�'OV�<.�B��S`��s3�W�^�-[��g�ұcG�6mJXX}��U�kѢ�Ǐ���ooo�^���~��e���y�����@���)U�T�Ǫm\�K����E�5���sssΞ=���7vvv8::�f��-�СC��W9�����j�5�M?����3f̠Y�f4nܘ1c��2�dl/��5/�k���M+1)˔鮅"/LLL�8q"۶m#&&����m��ĉ��F$�B�O���pss�uB�����[��@�B!�7~~~�,Y�#G�Ю];N�8ARR�����|��)R�iӦ��ٶm?��#�}��W��q�W_}���1+V�`���<z􈄄~��7U6___�}���ٵku�����ƍ���������5k���<~���c�R�^=�>�/���qqq��ŋ$''s��E\\\8p����9N:І��'��fDDϟ?'55���ϫ&��k��Ė��w�^<x���-
6̶�ƍS�~}<x@DD�V�o߾T�T��{����ƥK�HII��ŋt�֍���,�mڴ)�������$%%��2l�0/^�U��+/��ס\m8<<���T����]!�>��o���#G�p��
���[�=J�-�Z�*Ç�2���255e޼y�]����H]�#� --�~��1y�d/^��/�-�B�Y��.�=N�lٲ�X��E�ERRիW���Wm�RSS���$--�5j����͛7	d���W�Ѷ��C����ODD������2n�8ڷo��j������y���f[�b�

bٲe�߿���X>�����0`�*�&5jԠL�2<y��ŋS�v�,��m���Ņ"E�ƍ7�\�2���s^���19::2o�<"##�ٳ�Z���+V�6m�h�Bd���???Պ_T��%�B��
ĠA�t�B!�B��*U�DHH����۷O���ŋ�矫+3��={V5`\�B��Nj�����Ӈ�ӧ3}�t�z�7f�ȑje���		׮]�r򁁁�ǏgҤIj��1�������u�V�nݪ���ؘ��`�V��e��5j[�n�ҥK�m�6�J�*1k֬7[n��ʕ+�W������G߾}Y�r�ڤ��/^�������ȦM�شi���� z��1[�رcٳgׯ_ϴ�Y`` ����*�ב���백��j�J(_7B!DF���5�Q�Fq��BCC	

%  KKK<==���f͚�U���v�J�v�������ә2}��+!!���Gxx8��κI!�x��)^�OHH=z�P�(�X���ҥKY�|9[�l�R�Jܿ�.]�п�����~�~!�U:���`�*`!��?���=z��H��yB!Ļ(/�^�z�~����>|���)
6���?�"S�K�&...�82����Ӊ��"!!�jժѣG���166��Ƌ/X�z5�����<~��T�B˖-8p �~�i�1\�x��ӧ�o�>���/ʕ+G�6m9r���Ȕ��fu�����S~���n��͛7III��ܜΝ;��w�Q�\�7�6�/..333>���ݻ�U6億*U�DRR111�*U*�sp��u���{"""�믿�Y�&�&M���	SSS�/γg�2�w��)&M�Ddd$ϟ?�~���7�:d�ov��u[n^9���[�n��W_ɋ/�P�w��U��.��B�?�?Nhh(aaa���P�~}���pww�r�ʺO�E�]�Ƨ�~����:t���Zx��1;v����/4j�H�!	!���p!Da���Î;fĈ���fffx{{�8:!�B!�=!!!����:!�;fÆ
2�[!����d���Z���ԇ��C��9166�o߾���7O}ZYY�f����4�=��%K�dڴiL�6M'�is�J�*Ebb�����f����^�:�V��T��`ff�q?kk�L?r�7�x�-7�����n���9�v�Һ!�B;;;��������0m�4���;�4i���'nnn|�ᇺUr5j�`ĈL�8www*V���D6nܸA���III��ѣXZZ�:$!�B�?}] Daabb�ĉٶm111��İm�6&N��Պ@B!�B��������0�� 777���t�B!��SSS���v���˖-��Ʀ �B!��jՊe˖��͛�T�Ç�bŊ899�f����u�(�F�Eٲe��u("'O��I�&+VL&[!���d�"����={6���Z�Q	!�B��4h�
�uB!�B!�Ȇ����ݝٳgcgg���17o�dٲe̚5�~���8R!���fll���3�����l۶�u��ѧO���^^^899ɢ�B���	�����ٙ>}�вeK]�$2سg�����۳q�F�/�됄B��L�"///���t��=zУG]�!�B!�B!�B�thݺ5�O��u�֙����1c�Z�hQ�	!��bŊ�ƶ<y���pBBB�޽;|�]�t��ӓ/���"Edh��N�:ѱcG�������C�oժU���OOO�-[&�F!�(��S�B�
�uB!�B!�B!���ښs����={�u�)))T�P��M�2x�`5j��0�B��V�2e�ӧ}��!&&���0BCCqrr�lٲ������I�&M����u�B�,X���������_��`ڴi�;��#G2u�T���t�B!� .�B!�B!�B!�Bh���3w�\]�!�B����1x�`�͛7	

%44�%K�P�re�w�'666�U�'�|¨Q��<y2^^^T�TI�!������od�…8P�!	!�"2�B!�Nu��]�!!���B��uB!�B!�B!�xK|��'�=�ѣGs���䋀�,--����Ãڵk�:TQ�F���5k:t(aaa�罔�����{��aÆ
t��U�!	!�Bol…��B����`���t�BQ脄�УG]�!�B!�B!�;E�3!
///����H�u��aʔ)L�2�'Nʲe˘<y2���j�EժU�H���(Z�(��ϧC�DDDЦM]��^����ԩW�\!""�&M��:$!�Bh)�'\4m�Tf�
!�B!�B!�B!����ҥ�,&�(
r᥆
ҰaC8t����̜9�Q�Faoo���nnn|��G�(XNNNt�ڕ�r��9���u�{�֭[�k׎/^p��a�.#�B�e�X�!�B!�B!�B!ě�a�]� ��%y�nnn����:!�`˖-ާ��>-Z��E�,Z��={��~�zF�Ő!Chݺ5���P�T��O�Y��ͣN�:����?^���N�>���*T`�������:$!�B�R�O�8|�p�μB�}
��CBkW�\�f͚je����S�jUz��A�
"<�(㍎�V�i:.��v�Z�;�Ç144��?�y��xxxP�D	��Y��MoRXXǎ�Q�Ft�޽@�B!�B!�� �}/!�B�

�ر#;v$11��۷�n�:������}�������쌩������J�*�7�	&УG,,,t�;+""�nݺaggGxx8ŋ�uHB!�ȃ7��BT!2
		�	Y����r��A�'	�x�W�2a��+F����p�y��q]�z��}��sUYrr2W�\�ʕ+l߾��˗S�|�l�ѵӧO�h�"֯_�B����KKK>��s]�&�B!�B!D�������K�a!�;COOO�!!�3^^^�:�LLLL�޽;ݻw��ӧl޼�u����퍉�	���xzzҶm[���t�x
C�e͚5|��7�ܹS�ἓ֬YC�>}�޽;˗/�׌B�{c.�B�����ݞq���'O�7o;w�d͚5�v�EV����ϱ��c��T�V���T.]�D@@�/_fѢEL�<9�v4)�I����7WWWUNƎˆ
011)�8�B!�B!�x�>̂t��5����:�A�.]d2��@�-U�,Y___|}}���eÆ
�[�gggJ�.���^^^4k�]�+r��АŋӼys6m�D�n�t�;eƌ�=f̘!�;�B���L�B�V���
n�~^�)S��Ç�s�N.]���pr��ٳL�:�R�JP�H�ׯϴi�pqq���ú1G+V� 66U���'����X�???F'�B!�B!D��s�6l���Mס!riÆ
�Ad���M�W�b˖-�!�ʗ/��8p w��a�������l�2����޽;�������:T����0d�)V���Cz륥�1d��,Y����ot�B!�A�O������ɉR�J�믿r��=�t�B������dW�\�f͚����ŋ��ٓr�ʱc������K:w�LLL���X[[��~a�Ʊc�hԨݻw�qDB������,X��Ç������={�d��р��YBB˗/'""�����?�����ӧOU
G�`�ߵyOLMM4��֦_x���޽{������:w�L�.]r�+�x�;�2e����#?~��p�T�J���jG�{`` Ç��Ғ�K�f�K�xݺu̙3��g�bll�_|��!C�2Qh{m���Y�n
4�|��+T����-�֭��/��x��΋B!�B!�o#Y!_��OHH�[���B�I�*U���ߟ+W�ʺu�?>�|�	���xzzR�n]]�*�0s�LjժŤI��5k���y�%%%ѣGv�����%k�B��z��r��y�ԩ���}������醚���k�毿��q���ǏC�jմ�lQX�>}�E��������Y�p!gΜ�uXB�B�����Ӈ�;w���3RRR�|��j@~z���0�U�V��RRR���!((�!C�����<ŠP(��￙={6��߹��h�"�-[Ɲ;wHII!!!�s��1e������6���@�~�X�p!�O�&%%%Om͙3���x�����ߟ'N����ӧOٴis��Qm�͵ݳg			���g�fooOBB{�����!�B!�B!�B!t��Ç�AhP�fM&N���˗9u�ݺuc͚5|��ԭ[��S�r��
]�)�Q�\9�M�Ƽy�8w�yk=y�6mڰ�~���+�-�B�wL��p�q`���y�W��,�T��7o���%�}�Zbb"�ƍ���333*V����cǎ%11Q��	!t,88�{��Q�bE������"00P�`��k�r��E�֭KHHǏ',,��?��'N�m�6@=;Dttt��"�?
4��ё�{�b``@߾}��/@xx8.$**�C�1r�H֯_�Z�*���ڵ+ӦM�D��Z���}�Ҽys���+���HNN֪�jժq��&O��m<U�V%<<�#G�лwo��߯ڞ�k{��j׮�i��LYG!�B!�B!��]p��a���K�ڵ155��ؘʕ+���ʎ;t^����Ә��u��S�HJ�.M���>|87o�|����q�K�.1|�plll(Y������1v�Xnݺ�F����5~�����ׯϬY��}�6���4oޜ���caa��������Shзo_lll���C�P�:����۷qpp�Ν;>|]�$�B�|V .�H]�z5�����ڲn�:�ՠR[[ۂ�����|��#Gx����:O�<�СC-Z�:p��gŊ������*���$66�+V�02!ě��oG���ʕ�nj�g�}���!��֌;6S�L�6
KKK�V�'N`�Νy���������?f����~MMM�W�
����puu%::Zmbƛжm[�l�š5k��믱����̜9///���/������(�z#F��J�*�2>={�L�=7�ʕ+��I�����B!�B!��]���-_|�������'''GVx��^av}���1l�0�
FXXXF%�x������䄃�˖-����$&&���̽{�شi;v�C�j߽��KKK#..�3g����k׮�uX"))��R�n]8u�Ϟ=S��'N0u�TjԨ���?)))���~������6ś���GӦM������a���Ԯ]��'R�reZ�jE`` O�<�u�����d����X�r���y�������S�H�=�����CB!�P�.����cƏO�V�hܸ1����ݻ7�[���.\���3�7�S�N,^�Xm%n�o�������iӦ�nݚ�ӧgʒ��6O�:E�V�0`�j۾}�0`-Z��Q�Ft�ؑٳg�����7c;����Ą:������5��_~����TڶmK��ŵ�KM�=�rm��˗/Y�t)...4nܘf͚ѫW�L;���Y�n
4P[ѼB�
�I;���Y�.�x�ݾ}x�bFz��֙�޹sggg��]�t��Z������o�Q�fM

i߾�����;d����9v�s����ݝ�� ������uծ]___,X��}��ׯ�n�b֬YZ����%J�^�}P�͵UސS��KOY&7�B!�B!� ���u���YL�ɷ�~�Z�0�}��i-Z���?Çg�…�9s��#B�
=zD�ƍٵk+Vd���\�p���^�x��˗����)^�8;w���ٙ��T]���Q(j?���<z�_��N�:���DϞ=5fQ��.HJJ�]�v,^�z����ݻ���%%%�������|}}Q(̞=�:����K�]d``���#+W���Çlܸ�?��!C�P�B:u��ڵk���u�{�~�����1b����o]��Vطo͚5�f͚:t�J�*�:$!�B�!2�B9 5$$x��ttt�jF����������ӧ;w��ٳg���p��eF������d��U�x��)))���Đ!C�m*��ߟ'N����ӧOٴis��y�6�̙C||�jB��%K������%55���n�:f̘���M�ݺu`۶m��TN^puu}����-ZIJe˸s�)))$$$p��9�L�Bpp��ޞ={HHH���>S���$$$�w��׎]Q�(�.����]9��}PS�؜n���FN�%7n)))L�>]��!���mۖ]�v1~�x�իGRR�/��ɉM�6e�v��m�rpp��֖���Lی������رcZ��MvCCC��٥����*��3�Q�I:a!�B!�B�>�j…��O� IDAT�������Dƍ���+fffT�XƎ�i�8!��ի7nܠy��\�p�o��+++LLL022�f͚�;��G�R�T)<�ҥKu�[��А���Ӻuk�m�ƈ#P(��ߟ/^�:�7f�С<x�?ΪU�ptt�\�r)R�2e���_�b�
�?NŊ������u袐)Z�(]�v%,,�G��B��w�ޔ/_www6o�N��
�)S�`hhȨQ�tJ����:t`��ݔ,YR�!	!��
*�W��j5���`�ݻGŊ	

"**���@��Jk׮��ŋԭ[����?NXX��9'N�`۶m���Z�*���9r�޽{�
��K�ժU�ȑ#L�<���PF�ɑ#G8z�(?�������ի�ݻw9y�ZL�N��Ν;Ԯ][��L��^Gnb`�…DEEq��!F�	����U��9�Zm=#e����T�re�U���2>033`���&oDGGs�ĉ<�P�V-���K
ӦM˔�9���(Qggg�/_��ի����ٳgj���?�*�M���栗&t��&4Mfx�rsm˖-�ӧO3mS�)�!�B!�B�I�Yw������ë�d4e���b�
bcc���P�yzzˊ+t�^}Oү_?�T����1fff��у�/j������OF��Ѹ��Q�\9������`�ȑ����d׮]�+W���pJ�*�e�u��U-����?g�~��e|||�T�FFFT�T	___�]���q����j�
J�.���s�߳]�v�P�zu���)U�666L�4���8���6���ik���X[[s��}6nܨ�M�uNJJb�ܹ4k֌�e�R�H>��C:t�r�^��ŋ���|��amm��۳��ҥKR�X1"""2e����Ɔ;v`hhȂ�q���}�X�+++

)W����qD�����u�OA>�/^ooo~��bbb�7o��������Gѻwo���CZZ��C}��(Q����-[FTT���)�f͚ŗ_~ɠA��zAJ!�B��t2�"��t��ƌ�g�}���!��֌;6S�L�6
KKK�V�'N`�Ν��1b��ie���c�Ҧ���ڇ�C���ceeŮ]��?>?�������_��B��Bi����-^7.m�&vSSS�����0���\]]���V��q����D�������!�Omڴ^��<�<����;w��ӧg�۲eK��ߘ˗/��������󱵵e�����jw���*����T�T�������<�۹sglmmٸq#			ԨQKKK@=#D�ҥ�W���ܸqC�lE�������� f͚���INN����СC����G^�O^���֬Y�orHz�2e!�B!�B!ě���#&L��_|A�F������Z||<t�ЁF�ѱcG�̙��;+�D��ׯ���GӦMiݺ5ӧOW����K�.]����7�Y�f���K�;��N���ԩS�j�Ju�6}M1�渳�;>>�u��ѠA��*T���0��B�I���|��g����ܽ{���d>|HHH666��rbbb��xժU4jԈ�7��cRRR�q�?��͚5S[|k�ڵ0�2e��ؗ��/�������j�;v��ښիW��RRRx���V��~�����Y�y��q�5k���IJJ"..��۷���i������
?����'���<}��S�N1q�D�ׯϣG��-����S������@�����ӤI�
Fdd$O�<Q}_�s�NZ�j�/���u�y9G��+��)))�>}�Ν;��W�X���/_2`�>���b�����ݻ7iii,_�\c�Y�fѻwo.]�Djj*�?&,,[[�\�����Ȭlٲ��׏���s��&L���h׮+V�믿����(
]��^���u���������p
��/_2x�`F��ܹs�5k��	_B!�x�Ȅ�
C�?�3g���֖ݻw�߫�TT��83���:S��A����j+�t��мҷ����%J�>�N�ʁ�J�?�gϞ��ٓ)S��~�z�����m�_|�%K���~SMy�����X�b8::�K\��M�C���ؘcǎ1w�\���	

"))I��'O��f�g�,S�B��z�聹�9w����חF�ѫW/�޽�����/���={ooo���pttd͚5-Z��C���*'4���ЩS��011a„	���a�n޼��~}||�1c͚5�q�ƌ3P�[آE�͛���ݻw�v�쎫e˖��ׯ���{{{Z�h��aø�>U�VeРAy>?y��kۤI�L+ߤ/sppx#q
!�B!�B�k�l�!!!�������Y�r%���j�ߔ'O����Î;���#55��ׯ3~�x�
��j!����������#RSSU`���CBBB�����ω'HJJ��ӧlڴI-+�E�X�lw��!%%���Ν;ǔ)S�*�9s��6�!?�[�={�������}�m���$$$�w��\�#��O�<��Օ��x�ʵk�HLL$**�>}�������111j�)�L?ӦMSm_�l��7oҿ���0`7o�$99�C�Q�zuN�>�ZD����t��A�c066�iӦjH>|��ܹ3�ϟ�ŋ�?�Ν;�s�w��Ç5�ٻwoڷo��Çy��9��‚��d�L��Vw�С���ӷo_�]�Frr2			�߿+++nݺŤI��-���z�r�iӦ�:u*�z3f��ԩSԩS�Ç���@RRǎ�q��(
�N��U�y9Gqqqxyy���p�/^�PM4�ꫯ4��̼��-www�,'6�=�F�q��1����p���μx�ooo���/�גR��T~������[�R�J:��Ǐs��5
āppp��ܜ#Fp��]������t��-�u(�FRR�����O�[�����:$!�B��p�[�A�4#4�I��6�_<��̘l�̙\�t�ʕ+���̈́	˶ݼ�oddD�N�HNNf׮]�ڵ���d:t�@ѢE�%���%''�V�m۶e׮]�?�z�ꑔ���ŋqrrbӦM�z�k�����,���B����"��Ą��@���)U�E���Ғɓ'���Ŋ#((///���000�D��hт�+W�e@>|8�*U��@�{�&���t�ޝ��4�ԯ���Ǐ�V�Z��F����ݐ:t(����,Y###���7n\�1fu\�fѢE�hтr�ʡ��������|��W�Y�F5�"��'�rsm155%222S;���+VL�1C!�B!�B�w�r�u�j|���Z��ǏceeExx8��k׮���J�W��ƍT�T��� ���X�|9+V�몉"�U�Z���p�9B�޽ؿ�j{xx8.$**�C�1r�H֯_�v�Y�}�jժq���=�<�>r��k��Ԯ�LYGQ�~��'bcc=z4s�̡z��-Z�F����?3x�`�>}ʏ?��m;ǎc���������ڶt�R^�x���;K�,���CCC

`͚5���,5�ghk�…��￴lْ��p�ԩ���u��!<<��-[��?�d9жY�f���ӤILMMi޼9?��3G�U�{��I��X��իchh���	-Z�P�Uغuk�Ŗ^~]��T�\�d[O9�o���4i�������c����={V�>�r�~��g?~L�V����
###�ׯ��ݻ���p��5�����M�^�z\�zU�Z�j��o�agg���1VVVl޼��-[���S�.]����+��o�;իWg̘1�?�?��ooo6n�H����U��&M��9&^���%���L�0����mKLLTM�~_���?8::�o�>��ك����CB!DAS����`E�f2>V:y����F���P(��G�*lll}���T�{��
�����ʏ?����Q��ب�\\\666��k�}�*Ϗ6666�'O�����OU����,��M�J�o�V���*<==
�B��驰��Q����������F�*�p��k���.\��X�`����Faoo�*�С����F���L�<~�Xacc��رc��O��n���Y>�O<P���(:u��F���յ]�d����Vq��=Uٽ{����������B��&���B!�B(���pҤI
���
�B1f�����b˖-�򻢳g�f[���U�QQQ
E�n�Te��.]��*���S���(4h�*k߾����F1p�@�ڵk�����9eٕ+Wr���\���Ԟ2��srrʶ]�=����W5i�D(bbb4�s����^�Q\\����\(���jۭ�����ZŮ���iiiZ�פA�
@�k�.��w�ޭ���j�P�;w.�>����P��뫕רQC(7n�X�v��Ν;o4���z�4�����4�000�s���
@����i��v�r��bϞ=�ٶm�ƾ�|KII��(?�d�����4ɸ�0?�����^^^Y>Y{��"**J1h� ����Pԯ__1k�,�Ͽ�Nbb��Z�j
www�B��n�ʕ����*l�;�;w�(�ԩ��\���!�B�
,�EnV�Q�>=}�tΟ?Ojj*�Νc����l��1c�p��e����￙?>���0 ױ�g�QQQ$''s��eƎ�*���_f�;w�V�U�T�A�\�z��{�r��U����V�Z���H����-[HLL�ƍ̘1#S���޹sglmmٸq#			ԨQKKK@=�r�w�J�)�ү/�x�4k�L�~���3^�|�͛7U� �ׯ��E^����P�B�*A�j� 333���4v!�B!�B!
���-���l۶
x�Ҳ��-�w���W�y��+|��ݍr�\�
�J�{~�V
���P�^�D	^�|�*2d���;v��s����NPPIIIZ�onn�u��=nM�<y@���3mS�)�!
�ŋ033COO/�O�:u���hү_?nݺE���	

��@m���ׁ��YQ������x���6l�P�ve�2���W����>�ߗF�
�����M�*U�R�
�z�"<<<S�׍-���~9y��9��u�ƍ7ؾ};�ƍ�m۶����P(��?/�H9F�A��iܸ��rSSS �Ϸ��8�+�q{���5�+�|�r��K�0?�����ӣQ�F̟?��w�o�>����>}:U�V���ŋ��_�:Է^ѢEY�p!�ׯg������ҧO>��3@�8�����quu%---Ӷs��Ѹqc���8z�h�e
B!D�S('\���sss�޽���/�5�W�^ܽ{7S]___���9{�,���������Ț5k(Z�(C��u���f�-?~<���x{{���S�s������B�N�^��nݺ�n�����9����7ot�ޝR�Je����}||�1c͚5�q�ƌ3kkkU�&M��=g�S�988h�[�~prr^���jՊ�
���Ftt4�K��_�~:�P�Un����	'Nd۶m���ömۘ8q"E���!!�B!�B�^Q.6�W2��~�.M��mۖ]�v1~�x�իGRR�/��ɉM�6iտ������`5
�|��V���[e��W!D�d�`����-[FXXŋg�֭����@��3R�̀���T����%K��X_9�K9� ��|����Kxx����w�r�J�u놕�7n�ȷ��{�맍�7oP�R��_�,,,pvvfʔ)DDD�z`x^Α����i��Z4S9yE[gϞ�F����˕�)_yQ���"ЪU+�-[FLL[�n�r�ʌ1��+Ү];V�Z�ӧOu�[��ܜ:u�����G}����Ç����ܹs�/_0�͛7��7ߨ��߿�f͚Q�F
"##���u�B!
�M��p����LLL��ٙR�JQ�H,--�<y2�~��X�b��兙��(Q�-Z�r��<�"�m���Ӷm[LLL022�N�:L�>]50t���>�J�*a``��9��[�hAٲe����L�2�ly�+��C����Jɒ%122��ޞq�ƽֹsqqa���ԪU###���������W�r9���#���DFFf�/22�bŊ���!�O#F�`ذaԮ]��E�������...ku�SNy��666���1{�lfϞ���nr
!�B!�B�.���&00x��[tt4.^-t��y�>��# ��+V���3g�ʕ���}�V�%pvvf���^��={Ɯ9s�Ԟr�C�A���M��֤lٲ*˔u�K��}\\
�"�M�b_�t�������ڵk���ʶm�+#ܳg�V��^�Jٲe�2�+�g5Y��@���ڵ+'O����ѻwo�@�?���!C����^�i�@���BBB����ƍԪU�q�Ʊ|�r�nݪ�H�6�r���(�e�U[ʱaaa��qÆ
�n�Z����������o����:u"$$���X֬Y���1����B�
����a�u�[����8�z��add�޽{ٵkVVV/^sss��m~���=���?���̘1x5~�}���mۖݻw��{�B!�
E
���;w�=���_��_�LƏ�Vd��^�D	�
ưaòm3�Ț�_���ŋ3m�4��ү�ݶm[ڶm���300�񦊶qe<.F��ȑ#��_��8;;���m�>�///�/_���U�k�߿ϙ3g�߿�*��������^^^�E䳼^[y>!�B!�B��Qn2ο)M�4aݺu̞=�iӦQ�T),X@XX�+Wf����ź�M������/^d���@޲�w�ܙ���3r�H����Q�w��2g�P(ܹs�*U�d�f�ҥy��	[�l�[�n��Ĩb��5�]�fM>|��۷3M��}������U�^�S�Nq��Qڷo��~IIIxxx�����ɓ��N��‚3g�p��y�4i�c�̝;�%K�0t�P���l޼�gϞ�eʱ����ɓ�8q�v��e����z��J�*��Ջ^�z��v��I5i!�c���VZZ�j�c�N���;u�T�.]J���ն)���LO�2���sT�n]>�ɓ'5�Q�j�K�>}�={6K�.����V�)Μ9CPP������[c��'OҪU�L�ǎ�^�z9��������<<<���#<<���P<==155�s��xxxжm[�ψ��P(��d3f�`ԨQ�/_��~�	__�L�KVVV�Ŗ�V)))�������̙3�R�
�
"99��'2x�`r|OB!��P~"h֬���lܸ�gϞ���Kn޼��zP�~}G(
���*T 88XU�����JB!�B!�B!���0�W�^�-[��g�ұcG�6m�Z�o߾�z>>>T�R����ӻwo5jD�޽y��U�T�r�fv|||�W�Ě5kF�ƍ3f�Z�ҥK����4@�E�̛7�w�q�[m�[S��֚V	V��e��)kO�:����L����������I�|���={Ǝ�m-[�`��噶�?===���Ue
6�M�6<|�www�l�޽{̞=}}}��*wtt`�̙�|�Rm��/_2{�l ���ann����Ɓ�������3��^?m�;�.P�zu:v�m]e�/��2Ӷ�Y��Y}?/�k׮�P(�Q(�}2�^�:_�5III�k�.�LY'N���ɉ��d���+U���2������?Э[7�mʁ��W����T�R��ݛ���߿�ԩS�q��:u��̌p���[J)))�hт˗/���uG���nݺ���k�p�駟r�ܹ�-_-Y��[�n��w���k�?��ҥK�;w�L���ޝ�՘��%J���h�e��3c�V���HS�$#���mo܊o�nbflCTY�Z�ْH�eH�KFw�U)��9w�9�H���x�x�>��>��:��t��y!�*%�]�����өS'Z�l���qqq����Ub�###|||

%99���dBCC���|��O!�B!�B!�B�^N�PN�+΄�*U�H�n�05�s!� IDAT5�\�r4lؐ�Mh555%00�~��aaa���>8��k�bffV豝���1c
4������pwwW-�/&BרQ}}}����=�	�۷/+V��;;;�O���׭m��ݻcllLTT��y���011�k׮��B�77z�h*V�Htt4��9���<y�C�1b�Lٲe�;w����P�/_��̯�����G����!���L�6�[�n������0`���j���Q�jU���C�&MX�|9W�^%;;���L���������ݻx{{�U5j���:t'''���"!!'''>���1cǎ}�{8p�@\\\�������dgg��V��
AQ�:�_~���INN&,,��ݻ3�|ʕ+���?e˖�XeU�ɓ's��-rrr8�<_}��Z�ý{�^��ܣaÆQ�F
��ۇ��.\�ٳg$$$��������o�…t�҅��$���:t(����޽{dggs��]��ۇ��;���$''ӡC�IJ�����ߟ�/����JX<z�(~��F⥉�	۷o';;;���%��-t����o�%::��W�2e�bbb�ر#�j�b�ĉ��ƾ�<G��ȑ#4l�Pk�\i������9{�,�;w�Ν;}>��#.^��5��4x����=�ƍ��?T�/]��.]����J�B!�@񆂂��O������Q)�������-Z(���Ŝ9s�n�zӐE)��8q�b�ĉ��7�:QHo�B�>�"(((�m!�B���B!�B�P�߇�_~�Eakk��y���͛
[[[��իu�(j�d(�U�w�V)�?+V�P�߼y�<������_�����_�6m���q�;wNamm������3fh����P������

;v��z��{�j۟���hذa�1֨QCq����[a���zՏ����X������y�O��z,�n�Z��z�{t��QE�
��z�h���S�������|΍7N��ɓ|�Kpp����\��ի+Ξ=�q\��?�����B�P���*\]]�����3f��֫WO��奈����_����A���S�*ʔ)��ׯ�����w��%Eݺu��֊+W���;}��P�?^Gѽ����+�{�=Ejj�ƾǏ+Z�j��W�����:�N!�%Q�)�:R�L\]]U��B(��B��A��s�N]�!�B�8!!!�A!�B!��`Ȑ!�޽��� <==

���777G'Ļ�gϞ�9s�AJJ
��ƴlْ)S�hT��r�J������ښy��q��q222�[�.�
bʔ)jӤIΝ;ǯ������?�{�.���ԪU��;2f�>��#�c��ݛS�N1o�<8��;w�V�]�ve�ԩ4lذ�ס���Ǐg���ڵ�k׮���3�ԩC�>}���V��[����_~ʖ-K�J�����[�n�9���{�@�6CCC~��G.\����!-[�d������kkk���+V�\����+�:���ޞ3g�0k�,"""�s����g�̙��������g``��?�Ș1c�g���\�|�ǏcjjJ����ڵ+j�����Ņ�����_s��jժ���3���T�ZU�`` �F�"**��O�R�z�"�?��u�ߢ�iԨ3g�d�̙��űy�f֭[ǜ9s���0`P=�w�ލ����ͣK�.<��M��q�F���t|5E��Ɔ��h�����������-
6�lٲ�;w�F��8�¹|�2˗/gٲeZ���k�.�W�N�z�HNN��Q!��=�B�x�lܸ�A��<���B�$�@OO��� U�T�~�t�BQ��I!�B!�UE���r�TQ���{+�}W�<y�q�Ʃ`pqqaɒ%4k�LǑ��$ߗ�/_���+W�P�^=lll�t��[GOO��4h�"�R۶н�ϟŖ-[		�޽{�jՊ^�z1}�tbbbhժw���Ã�~�
�N���������<z�}�Mpp0=z�^$���ۗ�^�N�>}�v��O��x�nݺE`` k֬�ʕ+ԩS��[�ҼysE+�B���DV�B��PN B!�B!�B!�e͛7g�����0f�I�BQ$����������X[[k�_�f
�L*�+S��۷�}�������߿�͛7�w�^,,,hѢ��o�j�

eɒ%|��w�߿�
6P�F
^A�111!,,�a����C��q������:�B9p����DDD��-
dժU�ܹSSS̈#���B!J?I�B�S�UL�B��w}�/!�B!�EK*Q�\����¾B�"תU+>L����U�Vr��5֬Y�?�����u�%O�r��ѣ=z�]�v��у2eʨ����cܸq�oߞ���'����O�>}tu�*W����ԬY������7o��G�~�z]�V`999L�8�޽{ӥKn߾�ڵkY�z5������Y����t�B!J���pѯ_��uj!D)�,�-���$!�B��7�s�N]�!�B!�B!��[�h�;w����t��Yc�����ϧC�������9~�8&LȳOӦM���cܸq|�嗪�e�˗/�H�===f͚E�5;v,�+W�Ν;dff�����@5j`�Ν��Y4n�X�!
!��+�Z�j���RԧB��k�ȋ���<?�B-�={&	B!�B!�B!�H�f�8w��-b�޽\�~�gϞQ�zuڶm˸q�hݺ����D�lٲt��M��233IMMeܸqT�X�ŋ�|�rΟ?O�F��9�c�ȑXZZ����ٳgiժ����_ZZÆ
`ԨQ�iӆ�+Wҿ�R�,"�B�+򄋶m�Ҷmۢ>�B!�B!�B!�B!��5|����:�A�P�t|!�ĺu�x��)=z� 33����Iff&>�X;;;����ׯ_1E�v��Ӈ�G�Ҷm[.\�P�.�ϟ���������㈄BQ�y��ƍ4hPQ�V�"���������8�ۅ9�0.]�D���}�˂������u���l�B!�B!�����t�B!��+++,--�V�FFFT�T	ccc����X�"*T���333LLL022���SSSʖ-�)z:gooϥK�8p�C�WVVM�4�ѣGT�PA��!���zk�悃��֩���ƍٹs����ę4i���������ӧY�l[�lA�PпlllhڴiE*�B!�B!�(	ڶm+��	!�BQ�V�^��J���uF�puu�uB!�(��Z…����:���z��$\�R�M� 
"22�ϑ�������۷/���899���MHHFFFo<�B!�B!�B!�B!��T�B!Ļ�W�L!�?���-P<	�Q`` �o�f������i�&=z��B!�B!�B��G�2h� ]�!�x
�B�!!�B!�B�(���۷oӳgO*U�����y�&���XXX��I��.]�~��$$$��W_Q�Z5v��M�2e�<�����Ӈ��d���h֬�+�)��#88���Z�nM�~�t��]s��
����Y�&۷o��ߧO����}�vj֬Ɂ		��ŋ<y�U�ҡCF������1��߻w��˗Iff&�:ubڴiZ�՘��k+##"""�s�U�V�G�|��7��KOOg��ʹh�U{��ձ��e���<SSӂ�Z!�B!�B�duD!ޮ�� \]]u�(2a[��g�ƍ�0UB
4H!D����B!�B�Şp@�ƍն�4iRܡ��I�&I\\�5�aÆ\�p��G���g��y܉'HNN�nݺJ�(�N�>Ͳe�زe
�����cccCӦMu��R�V-lmm����9{�,��j�ٳgIJJ�U�VԬY�_~���SRRؼy3iii|���3==���Tm����?��&cfee1r�HTm���ϲe�T	~{��%##;;;�����˾}�pvv.�5
!�B!�%����L@�-�œ�BM����A�U���CB!�BP�I�PnCɫ�Mdd�ڶ��3�g�f�Ν�&\�ر''���۔�������۷/�������&$$###G(�x�8;;�￳{�n��eդ�}��i�&�N�J�޽����ܹs�1������~�z����Y�&�g���Ɔs��1c���3..Nk�
6���@�&M�6mVVV$&&2w�\bcc	

������h6l���-::Z.�B!�B�*...����:!�B!�B!�B�+���D�������Sm/]���K���dm�w�Ώ?�Htt4w�ޥjժ}�߿ϑ#G(_�<�z��A�E#00�۷o3`�U��ٴi����=Z��	!�)�����C�ʕ���`��ɔ+W���l"""���P%�9r�B��سg��'���;�=*p\�`ڴi�d�f͚����q�Ʃ�}�1#""�;w.�>u�����GGG���U	�.]�v���S��Z!�B!�B!�(�.]�D�����&&&�֭[K5!D��k��������0�B!�P�.
�啾�ۛ7of��Ŝ={CCC�t����U�?������#99�r��aeeE�>}T�R�222�'""�;w�P�jUz��7�|����F,~~~L�<���ܱ��Ջ��`���:t��u��?�!;;��={bjj
��		��ŋ<y�U�ҡCF����q��O~��΂޻��t6o�L�-���P�W�^[[[6o���U�'�o[ٲe�ӧ���DEEѩS'�;Fjj*ÇG__��w�2a�.\��q�BQ��n޼	�VM��O?��&c޸q�����/տ�߿���W٦�#�B!�B�Fzzz�A�R-((WWW]�!��4i���Zo;}�4˖-c˖-(
���
M�6�A�B��J~_
!�ˠA�t�B!���%�B����˗quu�v��l۶���x��ݱ��a�ƍ�<ψ#HMM�ɓ'l۶��ϟ�����e���_U��={ƹs�8w��?V������ȑ#IHHP�MNN&  ���x�-[F�2e��^�x1���jI/svv&88���P���5�ܹs'}���_~���_�OJJ
�7o&--�����$?��΂޻�{���������xvvv��Ʋo�>����(v!�(HR�җ_~ɺu���C�N��L�2j	c.�…ԬY����ceeE�ƍ�b�2Q�儉�e5��ɘ�J��]!C�����]��db�B!�B�����Q&�	�d�n�O��=33��ӧӷo_,--prr��ۛ����mB!�B!�B�:���E||<M�4Ѻ�*�k���LJ��{8t�*�b���,]�[[[�={Fxx8���g˖-���
6���@�&M�6mVVV$&&2w�\bcc	

ը�Q�n]000���:���ʊO>��?����'O���:u�7nаaC5j��M��:u*�{�FOO�s��1b����
qg�+�u��EGGаaC��m��ђp!�(V�>�[�&::���x�9B���Ւ䔥�077��ի�����Z�&^V�fM�^�ʩS�Ԓϔ��r{�1---ILL$,,L�%a^�T�BJJ
���T�REm�2Q��v!�B!���qqq���E�a!D���B6����ܾ}���ȦM�d���:�N!�B!�BQ�i.��)'�6n�X�xzzR�V-

U	iii������R����<x�}�Ghh��_DDs�����}}}�֭������c���a``�����jJ;v��W��ȑ#����4jԈ={����?�`�@}���U��,轻t��"��eu��Q�#����ٙ��������R{�����deeq��E���U������?^���:u���lΟ?Ϝ9s�<�Uc*�OܸqC��cǎxyyq��Errr�w�?��3����9Rշ~��$&&j��lS�B!�B!�B����ݻ̘1�N�:ѦM���طo���j�ddd�t�RhӦ
�{�fŊdee���>&�9���ټy3-Z�P[��z����ڲy�f������
!��o���֖.]�p��Mlmm�ٳ��#{}�}��ĉ�8q"�����B!�BQ�K���?8]�p!.TmϚ5�Y�f���cee�����ϟ?W��?��3gCLL������R�|yU?�V���_m�d�W�ҥ�-�����affFZZ��Ą�ݻ��޽{�	&p����(�����\gA����055�8��M�G!�S�v�����ԬY��-[���С���̘1�3fh��E��yqss�\�t��Ç�ڻwﮑ�P�1��͹�>NNNXZZ���;���ٳ����W�|y&L��ڶ��'22���x�5k��W��خ]�W^�B!�B!�(����W���0����?�o���͛���/2m�4��YYY�9���U[rr2��dzl�2ʔ�{���{�������];;;bccٷo�TfB����lҤ��bz�&M"22R�ӧO�l�2�lقB�������дiSD*�xَ;����‚�U��~,,,�V��j�J�*�6]�]��ر�Z�jѼys]�"�B!J�bI�(*�ʕS�[�xnݺu�u��>|�]�v���b�
6l��1cT��*�A[u��T�P��ݻ76l`Ϟ=��ߟ={����ŗ_~����p�B.\�@͚5i߾=VVV4nܘ~��h,�B���W�ɽ??�����N9����m�!�xS�*y_�L������I�hʔ)dggENN��ָ��q��5���زeK�.���c�ҥ8p�ǏӾ}{���ػw�k�9y�d�/_NJJ����Ą��֬YáC��}�6*T�Y�f�9�z����޽;?��QQQ|��Wj1DEEabbB׮]_ymB!Di�d��=��0�B�CV�-9�=ʺu�8z�(������`aaA�V�:t(�z��u��B�YMQ,6�ۅ��СC���_<~�SSSlll�ڵ+�|�M�T*�իW���Ƀ��ܥ9!�E5��7o��3{�l6lȹs�����j}7l�@BBM�4aڴiXYY����ܹs���%44GGG���T��8::��
jġl�����!��+�B�]�DFFjm���d������KKK����&$$##��S�E�f͘?>w����ݻܽ{���$N�:��~���1�˗W%b���{jI����ͩT��*UҺ�?ժU�ػw/���g�8]�%�B!J�bI�����ԩS>�&M��v�Z�?η�~K�f����+�����ppp������8��u�X�x���TKKK	S}HP����

b׮]��ߟ]�vh|�@@@���\�zU�?;;��e5"===
�?Ve�k��Q��,Ƚ�R�
)))���R�J��SSSU}�B��Vu"7SSS�Ν��qJ/'vhK�P�S�Ne�ԩ��-�ݺu�[�n}���T��S�B\]]�'))�5j���ę3g1b����C!�(�N�8AHH...�E!�Щ��]� ��۷o���Ξ={4�ݼy��7o�m�6z��ɦM�TU�E�<y�I�&�r�J�J�>$66���X,X����;w�ڢNo*�Ϡt�$�"t���y��j��7q��!�����㏁����׿���7""��s���P�n]|||ptt$<<GG�<Ǻt��k��اL�R�B�������6�a�ҥ,]�����@n߾̀TmdӦM2z�hF'���{F��o�Ǐs��]nݺ�J¸{�.w�����ܻw��ׯ���߿�q��e�R�R%�$������m���N%U�*U�W���9�V����[[[H���U߿!�B�wW���}����(�٧O����:u*={���ښ���P��ѱcG֮]������X[
��� IDAT[���C6l���뱵�e�ʕ���Lz�q��j�R�W�V-Z�h�*S|��e�5kFݺu�����t�҅�W��߫���Ҩ\��Fsss�߿�Ν;qvv&99����k�+�u��կ_���5+U}�B�!C��{�n������^�$gii������B!����+AAA�C!�Щ�72h� ]��λu�vvv\�z�����'ңG>��C�v�!!!,\����pؿ����KO�<���?'22�r����憫�+͚5��ܜ��4N�:EPP�ׯ��ח?���ݻwi҅B;�E�~��Z{�f�4�޸q��Ҷ�Xn�Ɂ�V`V�i�@(���������c߾}$''S�\9����ӧ�FRZFF���DDDp���V�J�=��o000�IrWJOOg��ʹh�U��իckk��͛<x�;���U�
�P��֤Tm����{�.>�<|�P�߹ۮ\��jS�k�dhbb�J�011Qm�����MMM�T����&&&T�XQ�Oqhٲ%?���-"22��� f͚Ŕ)S���puu���Y�<��NYq2�
*дiS����ѣ��z���P���9q���ߧR�J�nݚ#FI��ӧO����*s
!����p1d��Ν���5r������Ç9{���$����3a„W��Lzprr��Ғ��0�������Ʋp�B���q�:Ό3�1c���/bgg����۷��O?��O?h�W��,轳��'22���x�ƕ�i�v�4bB�v���øq�<x0���%K�P�|yG'�B!�B�[��իWi߾=;w�R�Jj��ׯ���7����k׎��HV�\�رcuq�2a�"##���"$$DcRw�ʕ�ҥ]�ta�ر888�w�}��ŋu�����sO�-n/OT�6��U��=z��~�9˔)��O٦m\!�(�k��˗quu�v��l۶���x��ݱ��a�ƍo=�e˖�믿���={ƹs�8w��?V%\gee1r�HT}���	 >>�e˖i}�Tڻw/Z���٩�tvv.«B�e˖�z��T�^���W&c䕤���#���IMM��͛<z�H���C���y��Y��ϝ��LʨX��Z���2q���L��2��U��ԩ�:ubŊ�ٳ�͛73n�8ƎK���8p }������WI��c�����/طo�;w�uH*���|��WlݺU��Ν;���F�~�X�n�kυpttd׮]�\!�B��Y����ն����e˖%88��W�P�fMڵkǐ!CT�LLL`͚5:t�۷oS�B�5k�ȑ#�W��+ǚ<y2˗/'%%���,��:t�J�*ܻw�ʕ+ӱcG�>S�L!;;���(rrr�����͍k׮���ǖ-[�~�1a�ʔ)CDD������2}�t����\gA�]���駟���⫯�R/**
�v��'���5oޜѣG�����1c��'�B��,Y�ѣGu�BQl���u�N%&&2g�~��7nݺE�ʕ�ԩ^^^4j�H�A&߾��{\\,���ä��R�fM\\\����D�/**�={�P�Z5�oߞ&M�0�|F���ի5..^�ȼy�ؿ?w�ܡZ�jt��///����.�B���w�}����)_�<�ڵ��ۛ�-[j���h�"���������VVV8880n�8��P���S���…���abbBDD~�a��n޼9�w�e˖,Y���cǪU�~�
�/����{��>
����@~�����O*U�D�N��>}���F�F,B�B͚5�r�
���k������Ғ��D��°��,�XU�T!%%���T��쩩��>B�&�cq�l߾��K�bkk˳g�g���lٲE�p�a�hҤ	ӦM��ʊ��D�ΝKll,���8::�5!/::��
jĠl�����!��J�*(�!?O�>�ѣG������Fzz�*1�jIiii���r��]�_���<&333�q�	ʤ�J�*q��%ڶm�����GGGIOOg�Νlڴ	WWWZ�n���ݻw/��'*
�ܹÿ��o�9sf�J�>|8[�n�bŊL�>ggg>���ݻGDD3f� 88CCC����صk�F��-�B��[�Exx��������*;y������!ϲù���1q�D&N��o����֭ݺu��8}}}��ݛ�MMM�;w��}Ç�3###�N��ԩS_kA�
v�*T����+���$%%Q�F
���8s�#F�(��BQڹ���>�B!�e'N� $$]�"�B�U!!!�A碢���/HKKS�����q�F�o�ζm��ٳg��idd���n�:���krrrTmW�^e���۷���(*T����0r�H*W��ʱ���iܸ�F"��ݻqqqQ�(����u�ֱu�Vv��I�.]���ĉt�Ё'O�������ػw/��M�6�����;�;w&==]Ֆ��ũS�8u�k׮%&&���{�Hb{Ya���@�?�ȑ#_�l�ԴiS<<<X�j���̙3�@ǽ�~�OOO�ݻw	f׮]lݺ�/���X���u�ڕ+W�0o�<f͚E�
�p������۱cG֮]������X[[���C6l���뱵�e�ʕ���"�B��7�U��bPJJ
��������>B�&�	�7ֺ�����#����z�*:t�o߾���W�_DDs�����nݺ������Hxx8���y�s��%j׮���N�:j}���bhhX$ɲ999���܉�j��
e��k׮�[�FOO,X@@@����I��ѣlذsss�;F�
T��{�=����֭�1�ׯg�ȑZ3B!�(jŖp!�9���ݻ	

R}Y���%nnn:�N!�B!^puu%((H�a!�o�ƍU+ھ��߿O߾}IOOg„	�=�>��3g����O@@���\�pAm�tm�Λ7�iӦ�f�U��k�1b999�9���5j����O�f��|����*[�z�*�5j�����€��̤O�>̙3kkk���O���صk���#!!��իk���Ã=z0i�$>��S~��w���k�\���ٳٽ{���	HOOgذaxzzR�vm���9q�cƌ!!!��3g�bŊ"�-��y�>��dAm���ϪU�ؿ�%\h�b��iӦѺuk~��'�6mʕ+W����Mhh(nnn���T�V�Xb�8
4��~���ׯ���o_www>�ٳg5�c*_�<&LPm���s��}������$,,{{{"##���ר���ݮ]���0!�;GYBi�…,\�P�=k�,f͚佐cQ?~<3g�$&&���~��<<<puu�|��~7n��s�ſ��+�q�߿�X8�e�6e!�(��177��ܼ@��\��ӧ�ٳ�͛7JNNݻwg�ƍ��ӧ��>z�ٳgLRR���4��ӧ�����*��o����ooo���IMM�A�L�2���(e�IŊ5�mݺ�+Vp��)222�����ё9s横|>��l����100�I�&|���|��7�u��xzz�%[�faa��I����d��ժ��}���`��Ѫ*�z�b�…��r���Ok���Ç����}�vRRR�����ٙ����S�o�cϞ=�ĉ9v�FFF������Z��0�L!�%˻��+����>>>������Lrr2��������	B!�B!�B��iժUܾ}�iӦ�x�b�իG���iݺ5�W�fܸq����|��|�Ì3�2e�Z�ȕ+W���S����/��B�:u(W��ڵcӦM�_�^�_��zÆ
_���.]ʣG��ر#۷o�q��иqc�o�Nǎy��˖-�z�g�}��۱����ؘ��۳z�j�;���ɓ��	���գ\�rѡC���صkW�Ŗ��<~��'�5*��O>��˗/�7ѠA<H�V�044�Q�F�ر��;����Z�_��)..�N����???�T�e˖���F��f``��kbb�J����D__333:t�ڵkժSL�<�5j���OVVݻw��ؘ��(�8���011�k׮o������֭{��aƌ|��'<y�+VгgO�mۦ���G��_9YT�*�ʶWMB��.''����_S�zu����u�?���j~���l���:v�Ȃ�v�YYY$&&2w�\z������u�[�nѪU+~��W�޽˳g�8w�_}�k׮}��w��aҤI|���j��O�����"55�gϞq��
�,Y��ѣU��N�ʬY��|�2YYY<z􈘘�
��ŋ_�ڕ�Y���;���\h�;`�ر�]����<x��
������/����boo��?������?��#�ڵS��ԱcG���OFF���c�ʕjI��gB!�(y$�B���͛3z�h|}}�e̘1+	!�B!�B!�ۤ��0v�X�����۷/�s���2p�@����޽;���Sۿ�~�IJ���(
�]��j���P���:"""�+:�<�L�2|��w�ٳG��cƌ�hkٲ%iiij�5k��gϞ����5n��BARRR�Ŗ��<~�����333�"ޖ�ӧcdd�֖��4"�?M�ʕ�1c���'&&��7�駟P�jU��fffL�8���0N�8����^�zj��u�Ʈ]�8q�{���B�
���r���ת��$Μ9���[�'�	!�R\\~~~4i҄��8�.]
@�f�TImő�fff���������2���4�əʕ�����bS�����;F�*U��_�lS�BmN�>�����^;1,66����S�fM:w��ٳg�>}:7n��СC6�ʕ+�vl�-"..�V�Zq��i�={���i۶-���'  @�W�P������>cP.�p�B���������˪ʕ@�U��GOO֮]�СC���Q��O?�b�
222x��	�^��QR�����x��)�����ߗ��v�{�:u��{?����y�ƾݻw�g��>}Jtt4u����,Z�Hu���X�����@ݺu9v�O�>��ѣԩS�s��1�|�c�ׯ��˗������;v��	!���)��D���ꪶқB����ʕ+��0�B�'$$D�!!J����W�^��-ĻH�O������򢬊����ù~�:���cӦM����믿��UHx333>|Hzzz��^�W�$�2e�2���<I^LJ4V͜6mC����?~@5��w��|��j�ѿil����glḷG�
}>|�Y"La�o�^k{�-�x�b��"Dq������`�ԩt��
Y�`�*�2�ݻw���'AAAXZZ���V�c	!�=���m�šO�>$%%1u�Tz�쉵��*I6��k;vd�ڵxyy��鉵�5>dÆ
�_�[[[U�-===
7nܠV�Z��I�)))$&&j$V(���<$��9::�k׮WV�)��ݻ�_��o��ƈ#8p 666E:����M������׮]K�z�ذa�jс�-Z���'ϟ?�G��J����K�bmm
��̯��_P�O�fǎ���_Ֆ���B���ɓq��Y<�'噘������ŋ9�<����5�Q�F���?}���G��mh{��X���?�;;;����֭۷og����7�D�U�VѦM���Y�jݻwg����-��	&0g��߿��_�{&�B��G.�B��Ν;ٹs���B!�(�=ʺu�8z�(������`aaA�V�:t��T�?�r%�����(ϥ�W����3ߒ�qqq�Y��#G�p��u����T�
4�G�6��:wIP�üb)L���}��E֭[ǡC����?IKK���:u�жm[����]��[����S�$/Wk(l�5k����)�v����\�ϣG���OԯW�qqq\�x�V�Z���lʖ����*y%�����c��˗/_�q��ݩX�"�g��ԩS���߬]���k�beež}��[�n�Ė��<~666�:u���Մ��8{�,�j�Cqxy%e�
�sK]���}+獋��gϞlݺ����k��jnn���ËtL###|||7n� 44�%K��P!�)		C�a�ܹZ_W�5k�����;���ٳ	g�˗g„	�msss�߿���������aooOdd$���j�]w�v����v��u�mĈ̙3��͛��1�	(��~ٹs�Զ�={ƨQ��`�ĉ����J��J��If��aZZL�0�p��}դ���dz���ɓ'�=���/�۷�}��1}�t���?~�Z���\{�5HLL$111߿߯^�
�|���[�nj�m۶�ʕ+y�O�=���WkW�.�]�T)��eE��_�	!���)��.B!���r9L���������۷oӳgOڵkǚ5k�x�"���deeq��M�m��_|A�^�
<9Q�3>\�*�6S�L�e˖�Z��.���INN���#::ooo���ٶm[��-�M�?��ÃF�1�|N�8�������&##�����������ť@������)�6<|�0�S999�^�p�q�ơ��dž
hԨQ�ctr��{����˗�R��ڤ8e�B�#sS>ϔ���/����'O���H@@��<�\�����Jl��u����
���׹sg�����~��I��xY^��=�T�R��"Dq���d�ĉ4lؐ���S�L,--qrr"((�5j��͛7g��������˘1c4&!��x9���j���ɉ3fРA000���
wwwfΜ��gbbB@@���XZZ������:t`�ڵj�)&O�L�5���'++��ݻcllLTT�FQQQ����ދ	!�?ɗ_~�V�-@����r��}��}�v튿�?�h�"U��o��eff���3P�����r��I�իǤI�T���m��$%%���=xyy��**A���>`�֭����[["`�-r��rE�W����'w�Pm�QA�B!JI�B!�B!t�֭[�iӆ={��������������ӧ\�x�Y�fajjJxx8dgg�:lQ�^�___ʗ/���gϞ�ѣGdggs��]���ϗ_~IZZ$..N�!�.##�N�:���!#G�d߾}ܺu���,<x��#G�8q"���lݺWWW]�-�a����رc�:�ɓ'0���fΜ���C�}�����M�{���/���A�gǎ����}�366V�1'N�P�WTjժ�СC��ҥK���p�����<~�|�
����\����ə3g�L�2xxx��SNX����8���_�L�j�111|��'��/���{+?��������9z�(������1m�4�U׊���+�-bѢE8�#�x�����ZA{�����Ž��3mذaǎ�رclٲ��cǪ�a���̘8q"aaa�8q�����zߥԭ[7v��ʼn'T��*T��Օ3gΐ���ꛔ�ę3gpss�շ���y��S�N�nݺR�N�����]]]���c���j�nܸ===���������vA��}ܹs��ڵ+*T�jժ�5Jc����<<<�Z�*FFF4Hk���ϙ1c������SSSڴiÚ5k�辽�:u�p��u�
(?�t��Z�"22<�СC5�W�fM��_��c�j���ǎ���www��gϞ��mnn�СCU���;<x�ĉ}�����y�4�~(���,\�x��ˎ?��}��6l������?^T%�M�����*�=B!D�S��]^�r�(!�P���B�r�t�BQ�����C�r��Uڷo�Ν;5V;�_�>���8::Ү];"##Y�r%cǎ�QĢ����ؼy��d�*U�йsg:w��ȑ#Y�j�g�f�Ν�U��&M"66�:u���Ed�J�h׮�ڵ��Ã�m��޽{�޽�����?��S�N1g��v��app0����G������'O��ٳgqrr���;�1:v�ș3g����^m_||<}��k����lْ�]����4 IDATA���ٺuk��n޼���/eʔa��ɪ��ݻs��I.\H�n��V�|��9���@��
�N�:$&&O�ƍ����i�/��^��W�cǎ�����?g�Ν����9Fll,���dee1f�U�%sss�ݻGll,;vT���y���P(<�\��h�":u�֖��Âpvv.�X�B!
bȐ!�޽��� <==

���R�"���{��	;vT[�%11��s��޽{)S�+V� **�o������S�V-nܸ��ѣ�Q��V��󻋂��[ǎ�w��"}�ʕ��������hoo�իWU�lܸQkU�S���?��������!&&����b���c���c���"b�%T�H%��/��X�ml�V,	�ڒ>���JyPb���&� jo)�!�PI��jO-!�,��~3O�Lb&���5/���{��{f��{�9ݺ1k�,���X�x1u��!>>�y��1w�\���9x� M�6��Ç�����P�J��u�Ё���#G�a�,--7nK�.��ΎK�.eϳgϸ|�2�|�
��Z���������+�ϟ����/_[[[�\����/}���nݺ����3=�[w��͛ӿ֬YC�-���K�=�P��n�b���L�6���D���prrҪ�СCY�n
4 ,,��Çht�V�����պN�ҵkWf͚����Y�n����:uJ��g�}��1�E�c&�B�Hɡ���+�Q-�K^�Wf��>?Ļ!�۟��%/y�K^o�KhsssS���2]~�իW�!C�(�+WV��̔
*(nnnJtt����9/�N�Rz��XZZ*���JժU����+�?�Hw��Pʕ+���￯�����@�S��ֶ.(���W*V�����*+VT<<<����,�(�r��I���Y)R��R�T)�S�Nʉ't��6L���U����A�ʔ)S���''��,��/��q�����A111Q,--��={*����I�v}ڛ���(O�>�4_EQ�k׮)�baa�w�������-Z(eʔQ�����e�*:tP:��:rL�E�ׯ�R�B���D���S.\���I�W�^U4h����+�}�Y�c1�3�u�o}�i\\�R�P!���4�v���*�2|��\���m(�ee�i_�~?d��0�����7��_�>�e���G���P��?VN�8�$''+T�����)&&&ʙ3g��رC�]��ɓW��.\X�o��V�}������8p@�Y��(���5��믿KKKP>��eɒ%��˗���4%))I���T�̙����{
�L�<Yc��ׯ+%J�P�K�.Jtt�����DGG+]�tQ���\�z���q3�FQe„	
�888(���S�<y����)���J۶m@quu͓زs�EQRRR�O>�DSSSe��������x%--M�ww�^���C�]ٺuk�ߗ����씐�%99Y���SF��)R$�c�:�7oV��Ҕ����JϞ=�.()))ʟ���k�N�.����<U<���D���~��.��s���ߏ
6̓W~W�7o�ܼyS�y�Ҽys�����o+C�g��ӧ+�ҤI�̙3JZZ��899)���O?��8p@122RZ�j����+�[�V����������bH���5k����*III����(����t�uvvvʉ'������Ê���V�ߛ��������<~�X�U���&/k�>|�|��:����+��Uךnݺ�T�PA�k�j������̔��u��}�f�~Ϟ=����^��W�Ν
���ӧOWW�,c�֭�������͛7�J�����|���mU�T��_�������U��ܿ_�엽�^�c&�B��'�;\!����C!�B�CnP9rD)Y����E�Q~��7�}^uC�hѢ�W�Z��L[�~}��;��ʤI���ӧO�����~��W�hѢ:�,V���ͯ����_�-ǎ����ɓ�t�lll�۷o�Zl/��ˍ�g�oΜ9:�(\���k�.���l{VmN�jժ
��X�"�|�*+���
d����(�:zL��L��̙3u���ئM�߽z��Q,�5�,/ڷ!���Se�Сz�CQ^���g��ܖ��چrR���`h�������ګ�����e��___��
6���z_���+FFF:�}��GZ�+��DFF*ժU˲ccc��*;w�Tw��޶m����׵�ѣG���C�1V�TI��Dn�f�SIIIQF���2�#Fd�9�ԩS:?o���/Ӹ[�n�i�Q-)�K��JW�B�ܹs�%U<�����~��.��s���ߏoS�Ey�.G���=Z	̷8�x[�u��Q�ʕ+����@iժ��ѣG+�ҴiSPF���]�oC�Pퟱ�W||�(�
R�S
|p��<��7�*U������2o�<���˯>0y���ȑ#�*U�(&&&J�2e��]�j�>4�z�_�����K)U��bff�4l�Pټy�V���P
��+aaa�<x����K)V��R�H�q��ʦM��)S�(�ҡCuZ�A�J�"E�"E�(�j�R&L��50�>u�Ν;��>�L���T����r��)�:uRv�ء3��n���JǎSSS�R�J�رc�����6lP�V�����(*T��?���x�?���R�R%���Dy����#Fh
����̮1�s̄BQ�)�������������ѣ���9�R�

�??�B!��.www֯_�sY��888p��=F�����>gϞ��ߟ��J�(�����ʲ̙3g2q�Du9nnn���_888�������?~<�*U",,�A�ǤI��6m5k��󄅅ѤI�l����T�V�'O�ХKf̘A�jոt�����ر�ҥKs��y*T���O55x�5�^�:�|�
����ԩS|��\�|�:��o���qrr"44�!C�0n�8�T�Bzz:'N���/���xzz���+�e�����+���?�~&&&8::�p�B�ի��˗���oٹs'\�t�r�ʽ2}�Ե�…5j�|�	ݻw�U�V|��*THg9����퍏�5k�dŊ4hЀB�
q��YF�����iڴ)Ǐי�!��޽{T�V�G�ѫW/�N��|����7nǏ�ɓ'Zq�4�ʕ+�{�n���y��1�*U�v,�:O���j߆�ӏ>����08@�6m^Y���>�������-�}�|>r�Y�+F�����-�[���4�__^~Yll,�g�f���ܾ}sss7n�رc���O5Җ.]���2���aHH3g����$%%Q�jU���;v,�֙GJJ
k֬a�֭������cll���5���|��Ԯ];�Ο?�̙39p���ݣ\�r|��L�0����y���g�fǎ���_���accC�.]?~��Y^�f�{Y\\��������ƒ��H�%�^�:�~�)�
�>�2����N�JHH���ԯ_�I�&ѱc�L�z�*���������B�
�~��V]ϝ;�_|�ٳg������?gܸqXZZ��XT��~Sf��������P�7ox�����G!D~�zv^277'999��eʔ���U/���ШQ#"##�Q��O��H�"��~�R�j�������y��q��-R�)))$%%Q�hQu^O�<�D�i7n�ȠA��1�������ȑ#177��7�!�g�B!��.��"3rY!�B�}oP�:Ix{{3}�t�|F�͂2ݮF�-HOOg�ر̙3G�m���̙3�^�z�q�F�����iԨ666���_/^���D=zDɒ%�Q��=x�����������O8t�V�T7 �βe�4�<t�mڴ�T�R<x�@��hѢ<}��P�T)�}����U�+V�ƍ�[���=�z ݐ�gܯV�Z�<yR��^�:M�6�I�&�2}�Ե��(�?�y���s���ŋӰaC�5k�'�|B�V�066ֻL�]���ӧiР�ƶ��8�U����9���:�3�N�>�I�&��ܒ��N˖-��g�3�1�X���C�jl�n,�5��h߆�S�C��/eʔ1�>�>�������-�}e։)����bT�B<�!y?�d4!�>2@Y���G!D~*.T2cllLzz�z9c���5k�������…���Jbb�F����u<�x��۷o��ߟ��P��50��il��S�~�!��-��)2d�S!����B!�B�}�`o޼�(�n�ҙOtt�(�5ʴ��*666
��m�VIOO��ޠAP>�W�
R�ٳgz�ץQ�F
��ٳG���]�
h���������ɓ'Zӵ+��T�VM��>�HY�n����ile����+�zC�q�M�6eY�&M����qf%**J3f�R�V-���Hk�x[[[�mR��_�������Q��rL�6m�������۷�>1^�xQk[Nby�����(�ڷ!����X�>��gn�ǐ6�Ӳt����Ӿ^���¬b|[�����3]� ��k^�����m�|Bh��w���G!D~�zv^�^��(W�^�+��ѣ��We�ȑ�u�2�}��֬YS�5����W�;y�2~�xP�-�ʘě���B!���C�	!�B!�o����`ee����֫f͚\�t)�<��իW���cÆ
Z����P�n]�bR�j��c�룢��q��:��֫b{����ֺbŊh̚0q�D�?N߾}�����ښ��u�VRSSs5��r��bH�3jժ���5��ŋő5k��~ 22����w�^���{ڵk���9�/_�m۶�>}�༯\�®]��4i...XYYY�f�1�p�
6ԙWӦM�$�ʕ+k�ˍXEy�K��j߆�S�9z��Ae��҆rZ����Qv���r�Y���B�{u~��K^�zs^B!D~�֭nnnDDD�����۷;v,FFF�i�F���,X�'''BCCiٲ%�-���4�����l���>}�0l�0�9BZZ'O�dذaZimmm122bٲe<~���u몯ۛ��\�B!�xw��wB!�B!�뒐���t?��3AAA�(Q�;vP�ti�4���/�WYvvv���s��E�4i��>��阘��'���������%J� 11Q�S��ʀ���`���DDDp��uV�ZŪU����e߾}T�Z5Wb�(��/3��?#KKK��U�hr��(U�...���/��ѣ��矙4i�w��+�M�61q�D�\�bp�SUQ����-[6�}s���y�ƒSyվ
i�vvvDDDp��y>��#����d��a���ǐ6�Ӳt��Y�zYN?3�Q!�

���
d�������]΍�ؼy3nnn�Ä	ؾ};ǎ�|��ܜy�����C@�%X�v-����^���u����Add$�J��\�rܽ{��իS�J�^��w�3f[�l�̙3���Ӈ�����ƍc���xyy��奱-�AJěː�Q�B!��;\ܽ{�:P�T)�������v�J����QLLիWe:GGG���
.#����7o�dݺu���q��mLMMy���iժ�{�V߬y+((���0���={��爄B!�x3+V���>|��C���p�#F���Ȉu��Q�F�L�x��1O�<ѫ�-Z�޽{��pK�F��ԩ�֭^<����C=zD�2e��y��:��Э[7�u����́8z�(G�%66�˗/3r�Hv�ܙ�����α�N�J�ҹ��(Z�?}����/Nbb"ׯ_���4]�%�������ѣz����;~�!������`ii������ǛU|�=ʴ�d�z^Ę�XrC^�oC�i�6m���`�֭�v����|��EY�ݾ^��B�w���k~� �0PZZ�<�_���uruu�{�baa��cǘ6m۶m�ƍ�,Y��-[2m�4j׮
���ׯ_g������`cc��ŋ����ˋ��@-Z���7��7)))�a�…̄	��_HHH�K�.�X��
6h�6l���,]�T=C����}��Ǐ��B!�����"**
��5kj,תU�༾��>��wr((bcc2d���������î]��|�����̙3,Y��M�6�(
�z���ޞz���whB!�Bx��ۏ;F������ӧ��ݛ��$�M�F�Ν3Mkkk�ٳg����y��̻w��,X��e˖1jԨLG�Wٶm			����r��iN�<I�v�9q�:]n���f�8�_��N�:�'�e���ӧO�^�A^5=�J�B�x��9IIIZU_�|����֭˱c�ضm_}�U�i��̀���cƌ,_��aÆil�u���ϟS�P!C��R�F
�?NXX:t�ڮ�I�uĘ�XrC^�oC��_|��y�X�|9Ç��g��|��EY�ݾ��sZ�?dTM!���#3	!�E�K�f��,X� �4���j��߿?���W/��ݛ޽{g��w���%K����__�W�4h�
ʲl!�B!^%gwij!��eC>|X�����1C�Of��ټy�HLL�I�&�ѣG�駟����u�K�,��0�j���L�4�=z`eeEŊ�޽;�}�����B!���!�3f�|�<((###��njùs���Ί��3���Zۢ��022R�иqc>��Sn߾M�^�HJJ�4�����s�R�P!ƌ�^߶m[�̙����5�y��9s����?�2v}���`ddDtt�ֶf͚i���ز{��)�={��ٳ����5��.]��'Oj��i9��5/�0u�TΝ;�e�3g����I������ׯ�V^���W���E�t���Y�x���vUyY^Ę�XrC^�oC��~�СCy��	m۶U������t-Z�s��|��EY�m_���^��B����9�u����t[PP�G�f����B!�B!�B��2Å���~~~�����/^��ŋ�No2��3f̠T�R���P�~}|||�޽;G����z+W���ݻ���Ӈ
6�r�J����1:!�B!
>///�.]Jhh(�ڵ��LJ:u�p��q6n�ȪU�011���G��Ν;Y�t)u��a͚53K���鉯�/+W��B�
�1�%J��_
��Ay???5jĞ={�U��|�
�۷��ښ��4._�̞={�7o���L�<YcTzOOO/^̡C��޽;>>>����ĉ	��ܜ���?9>�}��a֬Y����h�"�5kF�…�x�H���s3�윿��{�nz���ԩS�Z�*/^d���=z�>�@k�4'''v��СCY�r%���ܸq��K��lٲL�)^�8�?f�֭t�ڕ�ϟcff��Y�jǎ�q��2�^�zQ�N�+���9u�?��3۶m��Ą�S�ꕷ��5qqq�3�����XZZr��EfϞ�ڵk����Z�u��ӓE�Bǎ�={6\�r�ɓ'�gbxY^Ę�XrC^�oC��…���!88�z��ѷo_\]]iذ!e˖%99��/�����?s��5��^�5/��n���=�:?��B�?�|�
��y�QfB����}���C!ؼy3nnn��B!�"FJ����]=-��ˠ��Ef���y��9~~~�۷�[�najj���-]�t�k׮���^���ǘ1c���g���������Pf͚���133��ɉ���KKK��_�U�ʝ;w�%44�'O�`ccC����F�;p��7o��ŋ<}�KKKZ�n������٪WRR����߿�{��aiiI���<x0fffi;v�ȝ;wظq#vvvzC�{�.?��#������Ӿ}{ƌ�!��s��е^��U�nܸ����s��9
.�'�|�ȑ#)Z��:���K߲�m+�?�cǎԮ]��K�j����ETT���%J�����}>/�B!��www֯_�s9�ݻwӣG�LG�������S������ӧ_C��0x�`���裏8x� E��XE���p5s. IDAT�t�R�e����<��]�puu%%%Ek[�…ٸq���QU��O�k{BBM�6�…:��T����T�R%Ob3�e�Wv�q}PPÆ
��+T���}��]�����pZ�h�ӧO�����c�С:�svv&88Xc�*̓�ݻ7����Y��%K���O�=����~R��I�&�q�F.]��/���1CBv�iXX�۷��ÇZ��Y�����k�W1f'}��'m^�oC�)@jj*'NdѢE:g�ȨJ�*����|( 7���]Vv�WV�׼�����z����ׯW�����������m���k��SJNN���u����e�/$Dn��s�гg�A!4���B!�B<�e��E���X��ܨR�
[�l!**�`ooO``�:��%KX�f�z9--���H"##ILLT?8�������cʗ/�e�ٳg�k�.�>}��ݻ9{�,�֭�dɒ٩�Au��>��ǫ����1y�d�={F�N�X�l���eܾ}��7�����i��Wjj*Ç���nݺE@@QQQ,Y��B�
��
<�3f0t�P�u놓��j����T�10$��2p�@�ܹ�N�u��W�,Z?�aÆ���#��q۲eϟ?����|R��me�޽$%%�;�dԬY3N�<ɾ}�4n�!�B!�u�Ё�g�2{�l�����۷177�q�ƌ;�O?�T#��˗
.cРAT�V��3gr��q����Z�*���;�…k�S�V-"##Y�f
[�n��?�$>>ccc���qvv��/��p4@�N����`�̙8p�{��Q�\9>��S&L�������Хdɒ?~�ٳg�c����/��Ұ���K�.�?�r���Yl�������J����/8{�,���|���7Nk�x�Whh(S�N%$$���D�ׯϤI��رc�w�\�OOOBBBHII�B�
�m�K�f�޽�ݻ����s��I�_��ӧO)^�8t�ЁaÆ��{���!C(\�0,�….\�ƍ3r�H:v�H�j��߿?˗/ϕߡM�6��?�d����ܻw�jժ1i�$�����Q^Ř�XrK^�oC�)���s��e�ȑ�^��?�����h<x���1�+W�I�&t�ޝΝ;cb����|��vY�m_Y�__��B�����+dFq!DPPP~� �B!r�̙3ԯ_?��7d&!�o����B%**
x���eՃ��/��ё��4v��ͬY�شi����Y�H\�jU�fQx�ѣG���iԨ.\����͛�[�N��Ԭf���>uX�z5���ԨQ��ӧciiɂضm��7l���	�ԩFFFDFF2l�0BBB�U�u��q��yjժ�ĉ����ڵk���p��Iv�ܩ1�^�n�(V�����^��իWcffFݺuqvv�k׮�ې�׬YÝ;w�\�2ӧO��ޞӧO3eʔ,�_V���qʔ)���{�����C��.�=_���o[	

�y�]�.44T:\!�B�{{{�N�yyTx}�hт-Z�O�…2dC��V�5j�`�ڵz��E�̶[XX��ハ�O��f��*���?�:u�p��)�ciР;v�0�<��ٓe�m۶�m۶zǡO���ϴsA�~��ׯ���Skkk����//b�n,��Ty�;#C۩�ᅬ�����Hv�v}^��N�z�5�?��5���z
�#�"�|�Nߙ�
�=^�Y�3�����Ǐٸq#�5���B�
8::�q�F���W�gB!�B�wY׮]ٱc�\?B���K���5k�\V177�ɓ'�_��+W�кukz��A�=�.�o߾��l/:0�f�S����|��:t(G���[��G�0v�X���t��>r���p�����åK��7ʟ<y��z�߿*V���2e��v���ݻ�.`������…8q��9s�S�NIJe��#��pp0'NT���M�2n�8ƍ���� ;�7n��<���@BB�z���ː��m+111��N!/����H#�B!�B!��DF "g�4i��!�w��3}�.;3�g$3�!�((�]���B!���VB!D^y-.^�bΜ9̙3G�������/F�9r$S�N%,,���0�-[ƠA�pss�H�"z��z�U�6m��\�^=�����rY�:ܼy��իg�_||<�F��…Z�t��ԧ^��7�;w�Yf\\\��888���HMMeժU�����?�ϭ!���C�:u���!�S?[[[��%K�^���r��:_���o[��>���T�Ti�B!�B!�B!
}g��7�������kͶ2��B����;v���Έ#�;�|̭[��0aB~�"�B!�"�u�}���дiS���ٱc��'����[��/��R����n`b�yT�g5�>���^�͙3�.P�reZ�j���-5k֤gϞ:��S�WM��q�-Z�����ݻ5�W�����???��²����1���Z��\��EQ���T��-_���T���s��2�lCۊ���Z�o|B!�B!�B�I2�*�����qss��0�k�� h���w��ܠ�L�����Ɍ�B�z��İm�6�n�ʩS��3������[*W���X(�B��ѣG$''����ÇINN&99���~��!III$''s��RRR�<y25j�x��>y��ӧč7�����ݝI�&�%vsscÆ
�Y��~����
���WWW6oެ^�zVN���>ed��ܹs�=�cǎQ�hQ\]]�;w.ŊS��}�6'Nd�Ν$&&ҽ{wV�X�U��ϟ3e�6m��իW133�V�Z|��<8��B���Z:\����СC�U��V����|��W4h�???�}J�,I�Ν�ܹ3�ϟ��^�������2�ΝӸ�|��>���O�{�=�_�N\\\���Qud�t��\�rE�===]�s�>�����ڵk�ڵ++�,����@DD[�l���Sk��k�����occCLLS8GFFj�522BQ)^�8�{�
C�ח���в�i+e˖���<z�e�j���#u!�B!�B!�F��#�����L����� 3�!D^S����n�ʶm۸p�����{����T�P!��,ʔ)@߾}����M�6��B���ҥK��ӇӧOg���ܜ�E�baaA�b�(Z�('O�`�ʕ�#T
O�>���Y��ƙ
���K�B��%$$�����V�Zamm�������*UbŊ.�SFF�����$%%�|�r�={�~���Ç4o�\�9��@�ʟ0a?��z955U��6!!�ѣGg��	!�((r6������U���区t那�#���IIIT�V
{{{@����1c����HOO�̙3���жm�l�	�סy��̝;�۷o���S�̙���#ݺu����㤦�r��E���;���������3���\�x�gϞ���h�">|�:m�>}�>~�����HMM�ɓ'9r��c�j�ih����O���ӧIOO'**��ӧkU���۷���̕+W�5k�V:C�ח��ː��m+իW�׹%#�:U!�B!�yGQ�W�l(D~�v*�B�����5^�Z�:����g�&O�Lݺuy��)���t�Ё-[��.;3�g$3�!D�{������1Y�n...s��%����֭�
��pڴiC���uH)�B�ݻw�;�|U�Z5>�~�N�:=z�˗/s��M<x��8>>�˗/s��9N�8A׮]�ԩE�}�qϛ7���p�4i™3gHKK#::'''���(U��W�&!!�������3<<<HHH`ժU�.]Z�7a����Q��Չ��%))	ooo�mۦ�>w�\�\����'N� %%�Çs��9��T�4~��wRRRx��1���,^�8���B���Zf��:\xxx���ìY���oР���ҥKs��}�w��v�28�2e�0`��u5jԠW�^:�g6���"��u8p ����ܹs|��g����u���޽�ɓ'3y�d�r/^��13�>�0`����;w��}�j�-R��F�R/;;;ӯ_?֮]˦M�شi�VU�T�믿�V��{�V�6l�z}ݺu�~��ƾ�[�f�֭,\���h�=;��K��eH����͛s��a���4���O-Z�0�NB!�B!�B!�yIߙ�I���eFq!��O�>e���l߾��;wO�5�ׯݺu�aÆ�Ç����,[�,#.x���X�d	���t�Ё�Ǐ���sdBQpyxx0g�j׮�ߡ�bŊɦM�>|8���lܸ��U�f�Orr2���W?k���a�>���ų��V���Ύu��1x�`�EG�Q�F1�|���cĈ|��'�V���ŋ�V��F�bƌ3n߾�+VиqcZ�lɲe��ر�F^ŋ�ѣG̟?���h�v튧�'����0!�N��p���Q��ݙ<y2~�!fff���akkˀ�:u�:ݘ1c�T���Ƥ��f+.����	�˗���,_�33�l�ghʖ-�ʕ+qqq�D��������ٳ�С�:�رcqqq�hѢ���Q�fMfΜ�СC�:@�S��ŋ���VVVS�dIZ�nͪU��fK1bK�,�u�֔+W�B�
aff���=����]�V=���������닇��˗��Ԕ�-[2�|�c;j�(z�聅�fff4k֌I�&i�3�~��|R��m�m۶����WHHŋ��O?5�NB!�B!�B���޽�������?�������5;GG�W�c���4����޼y�9s�н{w�5kF�V�pww���Ok�ca��� F���ѣ�7�yKߙ��Mg�,㪙*���o�:�Q\!r.11�>��Ν;͘1c���!::��ӧkt�ؿ?~~~,Y����{/�.xT.���ټy3E��s��$%%�sdBQp���?ԩS�C��w(��W�^�9s��ŋӨQ#V�X�iڃ����q��u�t�U�V���H����К���LJڵkF�5�1΍2@���2e��s����8>��#��Z�l���ܹs)Z�(����o��v������B�%^��w��X��?�L��&+...���h��l���[XX��s3;�+�S��+���e�%Jd�F��"#}�U�dI��%}4mڔ�M�����)�W_}�W_}�e��E�2a�&L���^�9ҷ|Cڍ>�ː�A��R�X1�����ƍT�T	�7np��Y�
�� #�B!�B!ĻD5�O͚55�u
�S����2d���RSS���!&&�]�v���O����1�7י3gX�d	�6mBQz�ꅽ�=�����Єx��;ӷ���e�t��ܿ��ݻceeŮ]�dFq!��Ŋ㧟~�S�Nxzz���3��Ǐ<x0��9�z�z�Q|����=�v���ٳ�f͚ѧO�n݊��q>G(�O�=����}���^����~����ȑ#L�2///����O?��1h2�o�����-�ڵ�U�V899ѢE*V��Z��؉A�l���:��E��U��(��d@�w�޴mۖ�۷���Ohh(���̝;���B�y^[�!D�yxx��o��~�zƍ���뱲�Һ� �B!Ļ.00�����C!��S�7o��
��:\���Jv��ʼy�HLL�I�&�1��U����΅�7o/^dɒ%L�6-W�}$''3i�$z�聕��b����͛7S�h�|�P���۟S�ѽ{wLLL

�ʕ+T�\�-Zh<��o:�,�?��3���ݻ+V�
0|�p��cƌa�ҥܾ}���T�Ō�.$$$����k�*3�!��>��3Ǝ����5�F�ZiF��ӧOY�ti>DX�YXX�G����c׮]�iӆ���
__�O!
����зo_����͛75:]��LLL�>}:�1����^�z�_�'''�Eg�_��Ν;cff�ѣGY�|9���������D˖-iѢժU˓mll�����իT�R��'N�Hdd$�5�ԩS|��,X� W��G�jՈ���ȑ#�k�N�>,,Lg�ҥK3p�@ȩS�زe�g�f�����B!�p��;!���-ʔ)Sعs'�n��֭[�ܹ�)S�P�H��O!�B��I�&����wB!D�suu}g��կ5k���燣�#7n`���8::�g�9w�3f����)B���ճ�=z4?C|c�\���w�һwo��>}�p��]V�\���	�	���ѹsg֭[DZc�8v��6m�?��%J��V:�,�v��ĉ<x��s�jt�pqqaǎ�8q��{���Q��ٳܸqC�V5�x߾}eFq!��ӌ3�W�����Ӏ�޽{	`�ҥ2C[&T�7�]�&Mذa~~~Z3>	!��ڵk��_0w�\���F����
������ԫWggg�N�ʳg�8s�ׯ_gРA̟?��'O����ۇ��;W�^�?�����XYYѳgO/^�ٳgy��Y��֭[7��܈�� ==�۷o3v�X���hӦ�:�Y�`NNN���ҲeK-Z���iT�Q���f�}����aÆq�����8y�$Æ
�Jkkk���˖-����ԭ[��u��3i!�x3�B�a6l���s����/�Ԛ�Z!�B�w��_��_��a!��JJJb�̙>|�"E�вeK<==)[��:�������>�t���,]��Ç���L�6m�8q�δeʔ�Ν;���S�T)�m���:�IJJ��ߟ���s��=,--i߾=�ֺ�{��]~��GBCCIOO�}���3�f͚�U/]�-_��ƍ�?>�Ν�p��|��'�9Rc��;w����Khh(O�<��Ɔ���ӡC�l����lܸ�F�i<�W�Bu�~��i=�-�x{Ɍ�B�;�={F�J�8y�$^^^�Z�
�G�1x�`z��I�=�7����SSS��*�;wf���|��T�\ww�|�P!
�/Ntt4�G��bŊxxxp��
֬YC�…�;�|U�lY�oߎ��/cƌ�����S�bE�� �zf?��~������BHH�'O��ÇXXX��䄓�-Z��q�Ƙ��ׄ	ؾ};ǎ�aÆ���͙7o>d���(Q��k�bjj��ի�[�.DFFR�T)ʕ+�ݻw�^�:U�T��իz�a�1cưe�Μ9C�V�����CLL�F�q��1|�p�������ؖq_!�o�w��EA�B9/���z�Snnn����wB!�BX����wB!�k�(J~��ک�������F�*UزeQQQ0{{{���&$$x���9u��ׯ�x����Ǐ4h����;���:�<�3f0t�P�u놓��j���Fvjj*Ç���u�n�"  ���(�,YB�B/&�~��!�Ν;�[�n�Q�)_eذa<z���O��e��?���7�����Ã��x�>qqqL�<�gϞѩS'��޻w/III�%5k֌�'O�o�>>���!�$y5�ϛrOG5���#�ׯ;w����ŅBO�.]�gϞ�g̘���3�5���4�,Y��ax����g���Ill,�
���*[�r!����Ȉ5j@�޽y��޽;�ڵc۶mZ�X�k������/iѢ}���ȑ#0@=+�.fff4k֌f͚1~�x�?Ndd$G���ѣ���|��+V��͛ӲeKZ�n�w�;ƴi�ضm7nܠdɒ�lْiӦ�g.�����^��E'�ŋ��ၗ����,Z�ooo���oRRR*��&88�	&��/����@�.]X�b6l�H;l�0LMMY�t��z����}��Ǐ7�l!��;��B!�B!����Ԕ����wB!D�
d���F�R�`�U������İl�2�իDž�4i7n�`�ڵxzz�jlk׮�ƍT�\��ӧcooOdd$�'O֙�[�n+V___V�^��ի133�nݺ8;;ӵkW��֭[���U�'N��֖k׮����ɓ'ٹs']�v`͚5ܹsG#�ӧO3eʔl�ϐ�U�T�”)Sx��'  �C��;\�^����xjԨ���ӱ��d��l۶����oD IDATu�C�

���A��u�����B�w��(.�ٷe�
���=|�������E||<+W�d�֭XZZ�w������*s��aɒ%|���\�t	;;���BL�k�V_�pvv�ȑ#�oߞ-Z�g����|��`�S��N�b�ȑt��Š}*Dݺu�[�._}��bГ��`>���/�}��A0J�.͂X�`A���@������_�ܻwoz�2 �kt�/Y�$�������2�A�4hP�e!�x3I�!�B!�o%WWW\]]�;!�"O���I�����^�fM��/�Q�F������xyyq�С\�p�ĉ��4hЀo���#F�����.\���'����̙3�:u��� �-[F�r�ؿ?>>>T�X��U�2e��v���ݻ՝t�ҴiSƍǸq�U?C�W7n����Y�HHHPo?z�(cǎU��Vw��N�111���/S���J#Ļ�M��"�Ɍ�Ba���4Ə�…2d?��#�`ƌ���0f�����֭[>G�f077��pq��M������IOO��ښk׮I�!��5j���~�XW�vm�?N���i֬�w��t0�w���9~~~�����=���:�_�#G�ht�h֬�Z�2h!����B!�B!�B!�8����s��aΜ9������|����֭�?����1��S������r_0`����Z�
???~��u=���o:w�3���8��7o��KӦM���6C�W���U�]�dI�?�g���s���P�D	�t�u�4B!�B�7nУG���X�v-����MMMٴi�ڵc����G���������믿R�lY<<<2dժU��0��@�]�6�o��޽{�A)*W�LHH]�v�e˖l۶�V�Z�c�o7C;`8;;ӸqcLL�U!�o�<��222ʫ��B!�B��bbb^�`�>RSSi׮			�,Y���33�\�����1W=��h��ɋ}3


",,x�nϞ=s��B�n/_�Vccc�����ӧ��\�*oտ*�n,�hт��dv��M���5������ၟ���3XW�/{��occc����%c�Y�ߐ�U2�j��>���)[�g�B��ҩ��=
!�B���۷��}�R�lY���2�M��ښӧOS�h���+--�Y�f���qvvf�ĉ|�駴h�"��B�I5sEtt4�[���V�tiv�څ���[�f�Νt��)�|���q��a>��Q�D	Z�j��L�6m�]��\�B�F�NNN�v�B!�xC͞=����C!�y#G��M�6��(����>������IHH !!���`\\\r���&7���t���,Y¦M�P�^�zaooO�z��;4!�;(<<����J�Z�X�jǏ端��A������/::Zc��ӧO/FAT122BQ)^�8�{��W�\�2W�\!""�f͚��GEEi�upp ""�-[���驵�ڵk�f�+++�]�Ʈ]�����2bbb�b����J�o�
)__�ׯ_'..�5jd�ΐ�˖-��۷y��e˖����#u!�B����L�6���>}��|�r��3#�-����W�^��,:v�ȉ'ػwo>G'����eʔ!**J�Å�(lܸo�c���j��Ǐ?�h�0���4a�S#�	۬��
�F*��V1��mFR!L�
4L�D.&�\f
�0���U���;��qN騜�y�����ޯ��|�ާ�y]�P�R%ƌC�n�t�kN1��/��.BKll,~~~L�0�ڵkӭ[7�w�N���UvFB!JٟI!�%�СCDFFҧO]�"���;v`gg��0D)Wlemݺ�O>��_��m۶Ʉ
���_����3u�T���[��뇯�/2�B�����
�}����3f̠iӦ���0k�,z���S�F
n޼ɖ-[�߿?W�^eΜ9Z�׫W/�gƌ�nݚ3g�(��kȐ!=z���P�޽��N�
x��!G��~P(Э[7V�\������4i҄�����0V�^���9AAA���r��fΜ���mڴ����̜9S-�¶_���s�ά[��������ϛo��…ٰa��������u7mڔ��,222�&V(&��N_B�BDD��CBhI�nEYq��u�����������C�!��-Z��O�J��i�����ّ��.O�"�Z�RYD"11�I�&q��!����>}���B��6mJӦMqss#''���dbccٽ{7&L ;;��
*'_X[[S�n]]�-�B%0�b߾}8::w�B�WHnn��CB�d}��姟~�uB��ڱc��C(������.�UVV��F�L�2�}��q��!���/�~�m]�'�hŊ\�v���+ӆ�ڵkY�bnnn:�N�z�	�>���*iM�6U��mee��͛Y�`,P����������̙3�5J�nkk��Э[7���իY�~=�ׯW+�aÆ�7N���ٙ�{��������J�ʕ+3a���+�=Z�ަM.]��rnaۯM��5b����III�O>Q9�XQۺ;w�L\\��������U�f>��C�c�48p��CB�
:p�@__�}��)�w�=�>}���;��ܹsu�B�~-Z� %%����������?�}�]�
����u�x===ڷoO��������Ç$%%�{�nbccY�z5�=�E��	}�իW�u�B!^Sz���brss�!y�C�^Ro9B!�B��7n0m�4��������ɉ��(����~h���fѢE���KKK>��Sy��J>Ź�ϟ��͍.]�н{wfϞ����T�ѣG������Uy,66WWW����ر#�|�	���';;[y��h[�¶m���ɡw��ЫW/rrrضm�Zނb.l�k����?~̼y��ڵ+����U�oݺ���7]�t�[�n|��ܻw�Hע��[�6hC���l�<�ᆪK�.X[[3m�4nܸ���Ν;�[��ԩ�L�[�.���[��;w��B�"��`q��I��x{{ckk���>5k�dРA�����(;a����^�:���t�ԉ�S�j���>!!!���S�F
������Gc��������k�FOO}}}LMM3f�W��F�������������˗�Z�jXYY�r�J�]�	d���ԩS��+ҵkW~��G�8
�~m�/�Z�j�b�
z��IժU�X�"͛7g�ܹ*�gjS���-o��			j�%$$`hh����ֱ
�K:��/yȣh!J���\~��'>��#ڶm��Çe���/_BCCy���B�R�e˖�۷�-Zp��v����ɓ	W�/e���>]�ve���$$$p��Mv��A�^�������?�V�Zt��bbb�~SB!JR��p!�BQ�U�V�*�B�>\~-�{�������˗�i�O����[-�Çquu%--M�v��UBCCIMM%  ==�5F�ͭ[���شi999��/R�?�ȝ;w��,Y���SVV�֭���̘1#�k[nn.���+�~�)�t��u������ʕS��٘��wm͛7�͛7+�/[��z���l�����������o�}����_���"�=k�ܹDFF*cݱcǎ#,,�jժ�k�.���5�nީS':DTT���/��	!��=��WLLL�y�~�5kV����兗�W�e�9@�*U
U�Bǎ�رc���U�Z5&N��ĉ���r�ʌ;��c�����צ��ګ)�����Ӧ�*U������˹r�
����ʕ+;v�ѣG��o<�>!J�}���p�B]�!�(�
6�:!Tܾ}�#F�u�Vf͚�����{9��pqqaƌlܸQe7>!�O�j�
��~��Q�FQ�Brrr

e�ر�޽[�+�

�ݻ7�{��.Եg�bcc�����ߟʕ+cii����ܜ
d8�B��Qb;\!�Bhr��1�1B!�׎;���?uF���˗166&44�����BXXiii�lْ5k�p��A6l�@۶m9t��6l��͛ILLd�ȑ�ٳ�He6nܘ��D�D��k����Ebb"���'88@��s�A�G�Q>׶�Ç��bjjJ�&M055��Ԕ?��3�A��ƬM�k+55��kײ�~�s�̡|��lڴ���DF�@||��⾾����b�	M�g�Hl�R�;p�������̓��@�����W�)�!�����é[���.��������Ȅx1���DDD�:!������_Q�;vsss���Ott4S�L�A�:fdd�g�}�ܡU!�*sss�ܹ����r�����/&>>^���x5���[0��� Ξ=KFF���ԫW�ŋciiI�Z��۷/?��3������B�b%S��ə3g��}Æ
$%%OW'8p��M!�(u����O?���0��%��߮Ϧ9rD98��LJ֭[`ff���/�ƍS�
���?���ӉӧO��Ύ;v`gg�r���'
4��ё��Pn߾]�2������W>���'77�S�N�s�NΝ;��Ç�{�n�}�m������->��3���{�n݊���Z=�ƬM�k���K9����� <x���7
6`�С���(w�x����_���"�=���K�sE�֭����ݝ={����<��(�)�F���B!J#�O����:t(����…�\�������
�B�=k֬���E��b�
����ر#k׮�nݺ�I������ؐ��J˖-u�B�*�}�����/����O��8�WK�
1b#F��ԩS�޽���X���;���+�~�m����޽;��ּ��:�Z!DY&.���_M\\���:���	`������2h� LMMi۶�"B!�BQX�k�N%���L-off&�tR�&�ϟWK311Q�[q�?''�He*�+ܸq�	&p��)���[�G���ܹ��ݻ�������ٳ��w�bhhX`����.���o(���Z��W׷ ��꓃^$�gu��Q����˗�i7o��jժj�+�y�B�Ҫ}�����1�|��݋�3�B!DY������;�V���ӓ�3g*W�C���iҤ	AAA�:!�(3fϞ��͛���oe!��D���i޼9���<y���dbcc���eܸqdggӸqc�w�N�=�޽;�j��u�B!���\���4�߿��S�boo��������ח����8�B!�B��g�+�4��ى	�ʕ{n�gi�M�bŊ�^fޝ"�͛ǩS��_�>}�&&&�hѢP;/jS�o���Ç��~��7����9��5�Q޼���Q�R%��zzz���)�g��-./۳�L����_m��W���l�B��U�g�W����C!�B�Ν;���=�.]"22��?�X�!	
ʕ+��ѣ���cΜ9j�!�ЬV�Z̞=777F�I�V�t�x�ʗ/���9���L�2�p�����Prss133��Ɔ=zйs�|CB!@�.
3���[�b׮]c��ʴ!C��v�Z嶜B!��l�~�:�k��u���H�U�~}���9~�8|�2����jy������ 22R9ᾨ��̤�$BCC�Q�.\P��q�+jS��m�X�p!�:uR;��~ƍǶm��&\<K�~/W����ܻwO��savt�VI\��R�����윑�����v�Z�����֭[j�>ݺuK�G!�B��r���]��ڰa��Oǎ5�\!^W���`jj����_�>Ç��חu������p����/X�l������ɂA��J�*aee���~~~ܺu�ݻwMDD�g��7ޠk׮��ٓ=z�$!�j
^��t��
�M����5���899��՘Wvv6�-�o߾XZZ�駟��Zf�s�q��֭[���u��Q�[�.���[��;w�pk�BQ��9���7={��E�4k֌Ν;���Ξ={t�Kcbb���I�+K֭[GϞ=5Ӧme�O�������߿?�۷��Ԕ�-[bkk���G�-�z˲�^#���n=�����Ǐ9q��g�V�ۭ[7|||8}�4O�<�������WWW��/�28�Ç9}�4�����۷o��3Aff���;w�S�N���bii��~KKK6lHZZ�Ν+0Vm�]1�d˖-ܿ�.0gΜB��6J�j�s]�6k�,e_'''�������2�b`[FF������	!�BQT_�5����%''��ɓ�4i�-�رc/9B!�(�=zĄ	8p NNN�۷O&[�o������:!�(S���X�x1�������:Q�T�^��?����@Ν;�����Z�*3gΤu��1l�0V�^MVV��CBQ
�l�]�w�...\�|Y�v��i�����>|�WWW��ҔiW�^%44���T����ʮ]����ָ�g�N�8t�QQQ��߿��B!DI��￙<y2qqqjDz������߰�����-�_#>>>�������cӦM�����>�ϟ��[��޽{3o�<�x�
E[��.��W���#���/^��ٹ������ݻ������T�U�\�	&h]q�ieeŎ;�6mӦMS;~��i:u�D�5�y�&�����Ȉ���B׿u�V��
Q�ʕc��̝;�m۶��_��6�nee��͛Y�`,�=��J�j�s]�V�fM��~���4h��y�Ν���#55333�����|��/�!�B!�G�}9xz_b�ԩ���+w|�ׯ���DDD```�2�B�R+33�A����JXXX���D����J�.]8|�0�G!�sssF����'�~�)o����C�P�F����/���/�����'::���h\\\x��!�Z��G������G�o�B�z�&\���s��e����9s&͛7�ĉ���r��5��aaa���ѲeK���111!##:Ķm۰���ȑ#�]-�9�<?11��͛�šHKLL�	B!D)w��
���t�o��6#G���ʊw�y����s��%v��Ipp0{��eԨQ�^������:t!����qrr���T�T����ckkK��ͩ^�:��ٜ9s���h֬Y�Ν;y������]�B�=�Y���@||<w�ޥq��8991m�4�y


	

eٲe�ٳ�k׮Q�J���puu���:��(s���<~�����<yB�&Mprr�?� $$����өS'&M���ŋ���R��X��=z�Ν;�V��q��|��'�s�Nƍ�o>m�}„	������177g�ԩ��ݻ��\8%q}5���b������oIJJ�f͚��������e��$$$0l�0��044T�N"�%��ё-[��:!�(S4���*Y�b׮]c��ʴ!C��v�ZV�X�����B��!**
GGGj׮��Çi֬��CZ�ܹ3�Z�"((H&\!��fΜ�ƍ���o���u�(�������ooo�ݻG\\111DGG��O?���O�Ν����G��o߾����B�^ڄ�
�祗�
�={�OW�mݺ5fff����
�������ccc7n���ӱ��cǎ����[י3ghذ�ڱF���B!D����ɥK��СAAAT�VM�x�ƍqww��ƆA�q��A����"
QV���s��q�y��/_�6p�Z�jʛN`����O׮]u�ŧf͚j;C\�z���zK%�Z�jL�8��'Xf~�{5��̪U�����بQ����ٳ'={�Ժ��+[`l
������w������R�l���y~��}}5�yaDlիWW���*U������˹r�
����ʕ+;v�ѣGˊNB�5`�]� D�5`�4h��0�k$''�������z�*+V��Ą�>�L���l�/_Ntt4ׯ_筷ޢw��*��wɝ;wX�nԩSG��nݺ����n�:�JժU_B����y��	�}��f�b�0�j IDAT�!��e���+�'O�~�څB5k�d��ٌ=�#Fжm[]�$ʐ*U�ЧO���<��J���…�f͚t��lll�cC�B�Z^�.222h׮�J����Z���L�������X�͛74��U�)�!��\�r���@���q�o��&������k\�����e����<?q����$%%q������ӧ*>L\\5k�$00Pm�E^���xzz�������&\����d�������M�Z��ܹ3����p+ڕ��NJJ
s��%99�J�*aaa���;mڴQ;��ŋ,[����D�^�J�ʕiР=z���Yc��� �^���h��q�F�.]��A�j��ԩ���x���������J�O�7����[��
*�t����פIƏ������'\��߸�����Ϙ1c�p����,]��NTT�Ν�Ν;T�Z��m�2j�(:t�V���y_#/�ސ_��xu�ڕ��l����ٳ'���ddd0w�\@���(������پ};���xzzOw522���I��	!^u6l�uB!
)  �_~�E��ѣG�8q�'Np��=x��!������)�^�z���PRSS	(p��]�v���M�N�Ԏu�ԉC�%��!^Kׯ_��ё��x/^�����CE���Ĕ)S��_
�=V!���#G�l�2<<<HHH�\�r�I�QFFF6�aÆ���Kjj�r�W_}Evv6�={���ƆnݺQ�zu]�-����	Ϯ���-�sssU�k��l�gݽ{���25�V�ɇ7!�B��ÇqqqQ�����l۶�]�v����VeV�\Y��͛����ɓ'ʴK�.LBB�ׯWN�زe�Z-���4i�Dm�={�����S����_l޼��~���� :w�cǎ������ccc���g�ڵ*�NSRRprr�޽{ʴG�q��IN�<ɦM�شi����E��Y%q��i^K�.eΜ9���۷o'::�ŋcmm�U�R}�M�lܸ����q��&�C�4o޼Xۣ�k�(uM�2��'OOW��w�C�Q�+����ݻ���8BBB�zm��OS�����Ӈ�72g����5j��!���{�e``����?~<C�`۶m,\�P�3�B7��*Dф������0�kb���,Z�sss=zĎ;�3g�ׯWN�#--��-[��퍉�	���s��!�mۆ��G���bbb"��{����D�p!�x�$$$0d��ٷo��NA��V�˄!��R�r���‚U�V�����+�\�r�jՊV�Z1q�D<x@bb"111DEE�����/:v�H�
���B��x�޽�ׯOzz:Ǐ�>P�?~\-���DFFbdd�u]�j�"++�[�nQ�V-�c�n�R�B!�S���/���ܻw��#G���DݺuIKK#""������+����S���<M�	,Y�����0{�le��K�����ɓ'8880z�h�֭Krr2S�L!--���`&L����ݺu+T��~��~�:�ƍ���G�L�4�F�q��E�ϟOLLcǎe׮]Ԯ][��)S���G�����OJJ
^^^dff���˕ygΜɽ{�<x0�F��^�z<~���Ǐ3m�4Ο?�…�1cF�Ė׋^��Ѧ�y}����k�___��}233����a�ĉ�޽��5k:�g=��Eq�j%ק�������O
]~�*U4t(j{�y-���/�s�N��������8y�$M�4a֬Y�h�===��Ҙ9s&���*'\<�5RԿ?M1�����I�
عs'��>���������D�I��n�۷���M�Y���]�ΡBQ���d��/`��A�D�
�}6�$D{�7�{�.���\�p+++����W�
���?���4nܘ�ӧcggǎ;���˷�3g�аaC�c�]#y��u���˂�2e
����^��P�I��c��ф���q�i!��k׮���xzzbgg'�G�bW�R%��������ߟ7nKLL�V�bƌT�Z�nݺ)'`4m�T�a!�(��j…��
���̞=???�5kƩS�Tb*t�֍�+W��ョ�'M�4���%,,�իWcnnNPP�t�bnn.���4h���M����EFF��Ċ��e!�B<�v�Z���o��ݙ8q�2�]�v�k׎*U�JXX���g%''��O?��_ҷo_�5k����C>��c�����������ٱe�儋?�����{���/����MǎY�d�r��&M��d��JRR�W��خ>�@%�:0{�l9z�J���T���jժP�B:t�@@@�z�"&&F9ᢨ��U\ׯ(����Ą��0�j���J�֬Y���G��(
ŀ{m�T�j�7�I�&P��h�Z(j]�=

غu+?��-Z�P�m۶-?����֜>}��QԿ?M1�⧧������|ɤ�_�d'�G�+`���C!�s|��W|��w$%%���Ē%K9r$*;�eff�ܿ����s��M�V��vL���#������#F�믿2s�L<==e��W���|�AAA2�B!^�̙3ٰa>>>,^�X��W�[o�ŠA�4hgϞ%::���h|}};v,�5�G����bmm]�E#�B�,=]�29::ҨQ#.]����3;vdĈ\�tI-���3�5"%%''':t�\�r��ʁ�5j��_�~|��t������y)�>���bo�BQV�ٳ��C�j<������ow��᫯��ɓ't�ڕɓ'�OLL���I��V�Z���N\\�2���������<]uH1�ZAOO�ѣG�w�^��k�֭[p��]�tŮ\#G�d�֭\�zUy�I�&���+w,(���*�막6�����C�|Pm�"�Ҭ��T��Q유i���I���l�6���֕w7<���x���U&[(���;���gFQ��4�(�B!�B9rD���гgOv��ɴi�hӦ
��������ӇM�6)����XNA�~�@�g�W�M���B���c��HJJ"66�)S���+��ՕM�6q��u]�"�eΛo���Opp0��ɺG�fLMMqwwg˖-ܸq����Jjj*��N�:t�ؑiӦ��Ǐu�B�<t��EI�������������ݻ4n�'''�M�����2���!���,[��={�p��5�T�������*+]O�4�ŋ����Ç���e��$$$0l�0�8044�����4\!�(+�u�ر�|/^�����/_�aÆ,X����˫W�2U��


�}�6���+p�ya�UV�6mTb{VÆ
��@rrrT�������$99Yy���ȈN�:ѽ{w����X�b�ŖWq\?M�i^:tИ�h�b熗�0ui����T��100��ݻdgg��߀BQۣ�k��u)&/��ҥK�={��Ǐs��q��Ҁ��T����=/F!�B��͵k��ӧo��&111\�|;;;�ԩÎ;J��3gΨ�hlnn���tq��8hj�ž={ضm'O���ݻ4k�kkk>��"�ȏ���ڟ6l ))	x�}b�E�M��U�j��۷/}��%--���XV�Zŏ?�H������m322���|�﹵j�"++�[�n��6��-e!�x�-]��q��aiiɚ5k�[���C%l��L�8���P�L���p���6lK�.��͍����$E�*T�K�.t�҅3f��?��{�n���X�z5~~~T�Zkkklll���U�*����ل]�Y�&ӦMSIS����[o��W�V��'2q����ٳ'={�TI�R�
,_��+W�P�^=�\�±c�=zt�V�B!^5�[��y�֯_��۩R�
!!!T�^]-Ovv6P�+6lȉ'HOO�m۶�:�ɓ'*=��C���!����x�R�J�����T�Z���N�<	<���i�&6m�D�
��_�_�~�ĖWQ�_~�i^�Ȟ�h��P��T�j�7
6��ɓ�?�v��i<OӄMH��m^E���@c�������5������B!��J���bG2��-[�x�_�5qqqev��kovv6^^^*;+������Bhh(ӦM����%F[x����~�zrss4h����� ��?�}�W�\��ˋ>}�ФI�w鼋�t�֍�+W��ョ�'M�4���%,,�իWcnnNPP�t����\233iРM�6%++�������&�e]vv6���Z�
///������&�NHH�'OָӓB���+W���,,,X�|9...�IjԨA�����;w�]�v�7�|����5��������_!D�x�&\t��U��OϞ=144$##��s��;��E
>��۷���'������T�u	!�e�b%�cǎi��������\�r�����700�޽{�^���‚'N���P���vvvt�ޝ�x:	���ܹs�7�|S�۷o+c+�����'����ȑ#9r�?�����L���		)�؊r�JB~�XѦ�b���U[���`!�T�j�7�:u��ɓ�ڵ�ȟ�_�k�$�ڶm&L�N(�ݻ7��5j��ޣ{��Z����^W����:!��DEDD�:�R!�	��%)..����D����������S�cƌ�s��T�^�����͛7��/�0e��-[F�V�^r���>S�N���^��~�~��%""B>����Ç���Ϝ9s�3g��1333忝��ٻw/)))j��U�\Y�=�>�y�&�����Ȉ��H:w�L\\���*���?��w�B�Μ9���=W�^%22��?�X�!��l���,\����(z���p���i۶-nnnx{{����x��iҤ	M�4��ÃǏ��~bbbصk˖-�>�G����ҡC*Tx��!�KW��e���8r�}��a�ƍo�֨Q�Q�Fk�L�>����3t�P��@��R�r�b�K!�(�+�=z��>����=x����s��}&L�@�=
�#--��g�Ҿ}���'�Jxx8#G��J�*揊���ݻ*�4h@jj*)))t��U�cǎ)�'ccc����`���|��$%%�Hl/z�JJjj*���j����4o�\%]OO����߿��Jfff�Z���Sm�f��,[����p��:}�����k���̜9�!C���v���999�ZQLW�
��G�1p�@]�!�B���^rHH�r�9��E�X�h�+7顴ٷo			ԬY��+WR�N�1ccc<<<x�7$00�%K��0Zu+V��ڵk<X�6d�֮]ˊ+pss�atB�.����G�
ذa.\�~��|��>\���А��P�-[ƞ={�v�U�T���WWW�EU&M���ŋ�����Ç��ڲ`�6l�J			bcc�Z,�/ODD...�����ӰaC]�$t�y��t�ڕ��`�p!�/hƌlذ��S���p��W�
�ڵ+]�veƌܼy���X�����_���z��t��
[[[z���"�B!^�k�����''N�y��T�\===����ׯ���ԫW���l߾=nnn̟?������ʎB!P�^�x1O�<Q;�}�vLLL9r�J��ٳ9}�4������XGǎذa�ڱ�g�bbb�2�M�6t�҅�ׯ3v�X�߿�o�YYY,]�===�mG�����rNNNK�.�s���^]�v��Ąs�Ω��8c{��WR�:�������~��V�)))j��b�brͳ�WJ�O��Lvv6Ç������V�\����|��D]wK

U�����S9��k�e�7�������͕�<�!y��y�¹q�ӦM���KKK���������\mGvv6�-�o߾XZZ�駟����>4���;w���?���ӱcG>��~��G�޽��OQ�ѣG������U%����̛7��]�bmmMPP�n���ۛ.]�Э[7���[�ݻ�Rvll,���XYY)c�?>����722��C��L��kРA�3Fm�¶��fƌt�ޝN�:��뫌�Y��~��׭[����J�u����ܜu��q���u!�׷o_���ؿ?���g���xxx��DY�Z5&N�Hdd$d���̟?_mpHϞ=ٺu+d׮]���#8v�W�\Q�r�
ǎ���Ima
!�(�<x�رc8p Æ
c߾}2��5���ʯ����˗u�B�IիWg޼y�B�L�Y�&`�ҥ\�x�ӧO3s�L�<y��ɓiҤ	&&&�3�͛7s��-]�,���R��EI~��������C]�)�B�5NNN�^����ggg&M�D�f�HNN&22�M�6Q�|y&M��<'&&�իWӬY3�ϟ����&�������q�Fj׮���3U�T�رc|��w���_�Y�faggG\\�{��/����
ccc=zDff&qqq,[������cǪ����ȪU�HJJb̘1L�<��
��������100P�U�~�)AAAxxx0u�T��̨T����̞=@e����E�_Iڻw/�ƍc���4hЀ��t�Νˑ#G�_�>P�onnNLL���̛7�V�Z��_�z�j�����7��޽{�ڵ��={���CŊ��
%է��ԩS�p���?��Ύ>}�вeK�|�M<x@zz:���_�^9����f^�k�$�266&##�ٳg3n�8jԨ������2߿���2�#����|ox]-\��}���:!���4��U���|��Yhذ!�6m"55gggLMMY�f�2��{�pqqQ�t��i�����~��!������)Ӯ^�Jhh(���jg�º{�._|�r%xx:�͚5:t���P�A�?��#w��Q��0o�<6oެ|�l�2�իGDD��=���۷oGOO�o���%K��|�r�����X�n�o�fƌ����	��	�U�T�/�x�v߹s��#G������&��v�o׮]dggөS'�r:u�ġC����R�_ �(����	���x:���Hm��B�U����ٳlذA��x=��׏��dzl�2�O���p��Lrrrb�ҥ���s�b��#��ҴiS�6m���>$))�]�vMHHzzzXXX`kkKϞ=����B�R7lX!J=y�B!D���o�`����ٿ?���S�3c���}��E�Oȴj�*߲���hԨ3f��o�aɒ%,Y�D%_�v�+�*���;�Y��1c�p���|oZ�/_��c���W_��׭[��~�	bbb���Q9����O?�T,;m�3���Ο?����Վ����xyy�Hl/r�JҢE��e���*�k�&88�J�*��{xx���@FF�
R96k�,|||4�ӲeK<����2M�z+���Sm��R�J�Z�����b�
6n��ƍ�-�^�zL�4��}����hRu�5
����&�xxx�믿r��ERRR066V��5�2�^W$""B~�B��+hG��Ejj*���
���\�|cccfΜI���9q����\�vM%oXXiii�l�oooLLL����ߟC��m�6���8r�r����o׋����.\�@�z����y�椥�1u�TΟ?�ʕ+qssS9�q�Ƅ�������k׮�aÆ���/1g�LMMٴiu��eժU����<o�ڵxyy�駟R�\9N�8��ѣIHHPƬ����7�֟_�i��ի�r�
���g�̙���r��	�M��Vna�@bb"���	
����D�p!^9Eّ� /{eX�O���㕋l۶��R�r��B��-[�0b�6lȑ#GhҤ��C����>#G�dٲe����I!�x�ʕc��Ř���l�2F��됄(}}}�v�J׮]�5k������˗3}�t�W�N��ݱ��gȐ!�Y!���%�B�R��ʊ_����`������100�M�6|��t��E%ff��u0�F��d������>
4��>��/�T�`jj�Ν;ټy3�v�����ܼy����cllLǎ:t(M���j� IDAT6�Xg��݉��dɒ%�߿�����Z�jѹsg\]]y��n�&���lܸ���`����|�2�=�w��ƆѣGS�f��M��W����C�ƍ���"--
cccz����ѣ�Q��Z�V�Z�…9|�0��ٴh��u�y��1u�T�9ƒ�]�v���$�T۾�X�"�|�
#F�`ӦM$&&r��9nݺE���122�m۶���ңGʗ/��ړ��k��T�T���PΟ?���>mڴaĈt�֍F�1i�$֬YC�^����yY�
�3�w�B!^k֬���Q�a�b�E�-4>Wسg>>>�n�333|}}7n�J���h����j7n���ӱ��cǎ���ASlmڴ���v�ޭ6����I�wX///�@<���x�����4l���C�­[�����Ǔ��˩S�عs'�Ν����ӝ(
R�|y�<yBNNN��{�޽x{{+�����|�
�ǏW)W��w��e��ըQ#�<B�ҩ}�����1�|���133�qTBQ4�=bʔ),X���Ç�x�b�τ5j���#22��?�\��!D�ԪU+Ǝ���7����V�Z�I�bS�V-
�\t����DEE�k�.���/.�B2�B!��ʻ�˜9s
�799��갰����B�s�<x0�~�:�{�=~��B��.	��Z�*�&MbҤI:�M��WPY/���5kƖ-[
K�-֪�w�y�+V�p���[\}���}�P�n]���qww�\��n����?�<���;V�k���A!��u�������c޼y��~~~���OW\�����n���A��	���ܦp���B�Y��ޯ\�<�l��"�?��S��d�g�] �<�
�λq�&L�ԩSj�rss��ԩ��˗�z�*�7֘'77�{��ahh�LӦݗ/_PN�x6o^�\��7oO�O?K���#ī�e�DQ�ppp�uBQ,�\���9z�(���8;;�:$QJ������$.���O�κu��o		�u8B��f͚ѬY3��g�B<_�M�8p`I-�(�"""t�B!�B!�x�=;y�\�r�����P\
�1B���*UҘ���W`]����ԩSԯ_��>�Z�hQ�{��[������߿?�	'O�dĈ�hт�˗�3hn��<{m*TP��C�맸���G���5"�BQ���prr�V�Z<x��-[�:$Qʹ���矓���2�Z!D�U�V����3t�P\\\��t�B!J�b�pѠAP��
!^�� �B!D�u����_�ѣGٺu+ǎ�����bdd���%���C�e�b�uM+��dze�RSS�}�6U�V�U�V��׏.]���g�iA����Q�8��
6l ))	��;��!B�QG���ѣ�5��-[�r�J8�رc133S[��~�����s��q�Ώ?�V���DFFbddT�m166��ŋ;v�:(ӏ;����)�CCC�Q�.\P�����
�{�fǎ���ӧOj֬�r<''��� rss��㏕�-�iw����p�G��S�N����T�x��~�j�"++�[�nQ�V-�c�n�R�B!�(IO�<��c֬Y2��� �����O�>}�W�!!!̝;W��!D�5d��.]���;III.!�B��O�O��ҥK�
B!�B!����_W�A�?f֬YDFF����$33��[�2{�l>��â�[�=x�iӦ����?�O||<666|��w��^�<�qM_U����~�zrss4h����m�Vס	!^�b��b��g��eccCzz:�g���Ϗf͚q��)fϞ���[�n�\�<==iҤ	���/aaa�^�sss��������撙�I�
^�VVV�\����x���IKKS�2��<p�=z��…̘1C�~��mj֬���������q��Q�������Ғʕ+s��Y���IJJ�s����ۿP�{��E`` ���̘1�֭[s��f͚��m�_ӦM���"##CmbEFF�2�B!DI�������d�F���DR�B\\\X�h~~~/|/I!^w�ʕ#  �v��˜1ct�B!J�b�p�f���X!�+$77W�!!�B!򈋋+r���'22�J�*��䄍�
���'''�S�NF||<>>>l޼���z�"/�f͚Ell,������`mm��o�ͭ[�HJJ"((���h*V��2�U���L�����3u�T���+����___"""000�q�Bmi3���ё�~���/���\`�����ݻ������T�U�\�	&(�רQ��7oү_?���4N>|��Ç�{�n2339r�ʱ
���+++v���iӘ6m���ӧOөS�|�;g�ƌCzz:���j�w��
???ʕ+�LӦ�NNN���r���A����ʉ
�\�Ν;Gjj*fff*y���}��(��M	!�({��ك��U�V���x!...����q�Ft�B�Y-Z�`ܸq���booO�ڵu�rttd͚5�C!J����"W*�	
6l(���eԚ5kزe���B�
KOO�u�������2��Ξ=˦M����'88Xm���c���jL�Ǐ������hL�C�eg�3C"�lI��!�0�)�X�GL҆J2�g��D��}�1�GR�D�?|�t:�T�$���q�\�u_����4g���ef���ӦMc���l޼��c�j)Z�:s�������G�ڵ��*U�D�>}hӦ
C�!<<��ҴiS�\�������,���aÆ
���������=���ŋ*ϳ*S����xzzr���>}���	vvv̚5Ke&X��������<x�r��aff���u��Q֝2e
+W�$11������|���z�j:ģG��\�2ݺuc̘1���:u*=z�/^P�n]���u����lܸ��[�R%֭[Ghh(ܺuڴiÀhժ��[__oooV�X����III�S�N����g��v�s�z���/���ѣG>|�J;G�����ݻ�i�дo�^~�B���˗/qwwgΜ9��ۗ���w�OO5jԠ_�~xyyI…B��ٳg�?�����������

�vBQd
4�P�yk	���o�i!�{���p!�B!�+>d���DFF���3LMM>|�r�欉�������o�>���o�T�B�޽qppP��H�		a�ҥ�;w�R�J��_��wߩ̰��6����2e
�����������i�&���HKK�J�*t��gggʖ-��7k;�~��7o&33�\ƎK�R�hذa�bONN��ۛ���#�T�B׮]qtt�� Ǹs*W<���b���۷}}}ڷoτ	�V��k�=z�ʕ+9|�0Ϟ=�k׮g�޶mÇWI�ȪR�J��ٱ|�r�l٢L��k�9]SM�)��8/�mA��\g��k���LHH-[��Z�j���իcnnNHHÆ
�|��o�!Ļ��<"""��*UR[�!!!@����L�<�ɓ'��f�=�ѣ�Zy~:?��#\\\pqqɵ^N�iy�������X7�9��T�R6�aÆiܮI^�
P�\9�O�����U�5�1�ׯ\�r������K||<5k� >>�3g�0v�Xʖ-���cll��0�B��G����������|��w�b�xcNNNt�ޝ�/Ҹqcm�#��-/^���-�i�F�!	�+kkk�+��[K�B!�B!�g)))888p��=eY\\��A����899q��%eYBB~~~\�pOOOtuuU�;v,III����y�f^�|���[��\�t)������+���*u			�ɓ'̝;7���A�={�̱=���=��O�2z�hn޼�{pp0111���x��…ٱc��܇��s����I�����������ᅮ���v�g�бc�\cl߾=˗/�����?/
r�_w�DA���rN���Cjj*j�[XX�޽{0`@��"�(�:v�Hjj*ӧO�G�p��.\@��͵�Ж#F�k�.�����AAAagg���BQ�?~���p���)
M�nݨ[�.^^^�X�B��!�{mȐ!�Y��q��K�%��B!�,�_��sss�Y��ʕ+9n

Uξ%KB!�B!ĻĽ{��Q�~~~DGG���23�B`` �.]�I�&s��	BCCi֬111l߾]m�O>����0��������oԦ��	QQQʤ�
60}�t���8v��W���ѣ��б����9�bf�Vlȋ챯[���7oR�fM����F�\�~����+22��˗���5j���*���ׯ'>>�Z�j�v�Z�r��5�c����������N�4�����ݷ
��`4=�+Ƚ��s�V�TVXQP�)�!��>}��`��v�J�V����&66��+��� >,eʔa���l߾���ؾ};�gϦt���O:::�<��c�С��"ށ��L�-[Fǎ���8u�$[�B����رc	�8	�B��Y�r%/^T��-�`�СZ�|#y�CE�\�ce�-����9|���A�O���ӓ�7������W�͚5�B�B!D�۾};�C!�(�$��山��A�nnn4m�333f̘��	T��۷jԨ�J �={6������cii���������/@���x����igg�����#G��������޽�k׮q��I�������_�|	��a7���y����c�t�?��s\]]��o8p���ι�!'ӧOW�rдiS���?~<T����:tWWW7n��W~��&N��r���tJ��+���L���7��(�9~�}[�׳��9QL|��'���_����r�C�S�
۽{7�n�"==����?�m��I���ѢE���Y�x1�Ǐ���L�Q	�?�۷�	���=���cF��Ν;�駟pqq��ojĈ̘1���F���p��֠A&O�̌34hU�V�vHB䉞�AAA�C!�fРAo��*�"������˟={�̙38p�r�K+++f̘��M�(S�̻S!�(t͚5�d!�x����,
�Ν;4o�\�\���w�зo_�m]�~]����T�oCCC��m�v�&>|ȤI��|��Z]M�����U�������?111ɵݜd�=>>x����zܿ�@��f�TLpp��=eY~���O���=֬�U���9[���������%��(�9~�}���w0ٓp
r�g��s��?�P�|y��e�:B��IWW[[[lmm��(��E���q���BM���4���t8@���(ƪT������!�(3f� ((��S��Ѫ�B�K���X[[k;!�(v��p��q�(%A���<x�!C�(�lllذa�����S!�(*F���#��B�T�Ϡy�l�=1A���K^д����^���u��E�q��ejժE�N�055�q��y��!?�oѢ���'""GGG�z9���ŞM��233��R���&�W�P������Vn��?��(4�bѼysؿ?�F�ʱ����+�$�7��9~�}[�׳��9Qī�<)�d�Q!�B!����ӓ)S�ЩS'efl�N899Ѿ}{bccs�N!D��t�R����۷�vHB!�Вj���i^�|���7{��%!!===LMM�ׯ�����Z 55___������M�*U�ݻ7�#Y?�f�)99���Z�l�2�e���177'$$�aÆi��Q!�x_L�4��۷k;!�(��-[��l�"ojժō78{�,�Z�R��={V����w��aǎ��
�Ta�y��q����X�"7o�Tn���И���[YY�c�֭[G�v�hܸ��z�X�U�5�}�6gΜ�u����3g�(�S���!33�����WE8w��g�ӧO�駟*���Z�jq��MN�:������…ju@xx8���t�Ё:u�չz�*�֭P��!���E~���T�z^�I�ʕILL$))�ʕ+�쟔���#�B!�B��'O�����͛qss���D��K| ڵk�g�}Ư��������B�����5>>>|��<y2��T���JLL�z��E�=���������S9����?���ϓ���СC�U/=='''.]���������.\���3��&���Cjj���bbbػw/x�!��T�dI�-[��0�����o�B�н{wnܸ����7o
4����̟?_�n�.]���
�֭��Ǐ	d��������啯�f����|��ܼy��s�*˟<yB�J��	w�����8����8p ���cƌaȐ!���S9�=>>���X�m��m�Ν;�����ͣQ�F\�tIy�;t蠬[�bE����n�ʀHHH`��9�����ϟ�����={��ՋU�V���ܹsiڴ)W�\���]�؟�9_~�%�v���GGG�u�F�ʕy��!�Y��gϞѫW/�5kV��5]�79�oSa��y9'���'11�;w�%VܹsGYG!�B!�(�.0`�����{�nz������ɉ�S��d�*T���p�⽷|�r>��sV�Zń	���Vdd$k׮%22�;w�����U�F�֭5j_~���C|'���g"�׉����LJ#G�p��m��өP�
4�w�ތ3Fe�x�5k��������B����+��q~��˗���\�~���ʗ/O�z��޽;Ԯ]�Џ��5)��J[>脋��0V�X���9ϟ?'<<��q�Fe"E^�r��%�4i���+���ܹsbbbؾ};���*K7*V�����aÆj�*ʢ��$�B!�{�O�>���G�a!D�%	�c�С����ܾ}��#G�Zw�ȑ:t�s��agg���t��L�4)��/�6;w�Lxx8�f�b֬Yj���ⰰ�P&,XYYaddĎ;�}��S�R�dI6n�Ⱥu�T&.ȪV�ZL�>����1�p��]���U���u�ܙ��0~��~����(T�TI�6jԈ��+��vvv�߿�+W����,�ٳ�r Vnnn���DDD�t�R�.]�V�K�.̜9���k������M�q��圴k׎Çs�����T�*V#yWI&B��ٴizzz�C!�B�?~<-Z��ԬYS�!����ӦMcݺu20X!
A����4i�f�bРA2����9�ݻw�m�w����c�����Ӈ
6`hh��(�_�D���=zDTTQQQ,Z�???���Y�,��^q��������/_�T���cbbb���a�…|��wxxx��$rM��%\(^W�5�m+[�,O�>%((��7oҹsg��To߾}xxxP�F
LLL�={6������cii�c<W�\�O>Qۦ�LR�B!�B��r�Z�L�������ȑ#<}����5k���ʺ��������y���ʕ���'''�ԩ���
�ͩS�����ѣGy��u����Ύ[�n����ƍ���`ʔ)�\����D���t�%J0e����˖-[�����<��*U�ШQ#z��A�n�(Q��kc/_�<����^��C����#*W�L�n�3f�ʗ��&MBWW�}�����3��͙9s&�{���ҥK���9~�8�*U�W�^888��������͊+ؿ?)))t��	777��٣v|}}},X��#Gزe�ϟ�ɓ'|��G|��gXZZұc��M^��tM���M�q�����ٓ_~���G�2|�p���=���ݻw/�	!
�֭[ٺu���B!�BEjj*�Ǐg�ڵ�����O?Q��=���2CCClmmY�z�$\!D!�9s&�������8�"����/,,,�y�&5j�`�����ݛO?��%Jp��-6m�ĢE��o߾DDD��<Z�f
�/�L�2L�6
+++LLL(]�4�?�̙3�\��-[�`ccñc�r�-
_ZZ�z��������agg���-f�S�� IDATffT�X�'O�p��)���X�~=�/��ٳ�ڵ�LN%+[���|�3�СC�'6�s����f�E�U%���˜9s����W�&���ckkK�ҥ���^�v�u4144�chӦ
;vLe@@zz:���]�s �6���x0`,[�@9C��ȿ۷o��e���ؿ��;�Ν�iӦ����F&����Ԕe˖ѷo_�s__�w6[�6(V

��0%$$��_S�F
�o�^�틷G�g���ې�s��兯�/[�nU�4���%cǎ����*��R\�o���!(([[[m�"D�#�/!������ammMBBk׮��/��vHBp��)Z�h��Çs��C!Dޅ��1p�@>,�%�"�]�>����ӇݻwөS'�n�J�
4ֻp�:t���ǬX��o���G������3ؽQ�F\�|�m۶)�h�����ի�ׯ�ʤG���h�}�AaܸqxyyajjʦM�h޼y�u����������4iK�.-���(,ٿ�.����Y�W���� �=zЦM:Ķm�8{�,�V�"00����+���k���pO�>�u������Uۦ(S�B!ćiѢE���Z��}��e�����N�2�ڵkӠA�w�B��;��������ѣܹs�����h1b�v�"((��FFF���i9:!Dn
���x�M�0����k;!��X	

��ɉ&M�p��)�����Jfff�j�
///I�B�BbeeEϞ=qvv����2þx/ݹswww~��w���/*U�D׮]qss�Q�Fj��2^5�����X.\ȡC�HJJ�V�ZX[[3c����=��ݻ�Z�*aaa9&[4i҄���Ě5k�.���?>����T�Z��ݻ���Fݺus�Wff&'O�dڴiDGGS�ti:t�3hժ��~׮]cɒ%DDD��R�LLMM�۷/'N�؇�Ɩ��^�k׮�V�ύ��+�W��СC*�G!�s�NKK��_e˖-\�x���$*T�@�֭�:u*�;wָN�n�N�rM6n�ȼy�z�*����ѣӧO�x]����1߾}+++����ڵ+;v�����x{{c``��}����Os��E��ڵ�V�Z�|�r���LLL4�~��g�]�F�
�ڵ+3gΤI�&j�5=�5)ʯ��I}d���А�}����˺u�1bO�<Q��K=###v��All��#&&&�X*W�@RR��6E���B!>L�LV���iii�X��=zP�jU�U��_|����IKK{�Q
!D��ӧ,�k׮�j�
kkkbcc�X�"���Z�P�_eʔa���l߾���ؾ};�g�VY�TQ�lڴ�M�6i;!�K�6m��ݻ�C!�(6���;v,vvv�=�#G�H��(����ؼy3����CB�bc���\�v�U�Vi;!���ѣ4mڔ5k������Nbb"����hт���|�Y�L��k׮�M�6���o<|���ϟs��M.\HǎIIIQ�
^�g�T��k�5r�H�=�ɓ'U�w�څ���֭��<�����v�Z�7oNDDD�m�8q��;r��A���x��1;v�C�DGG��=y�$-Z�`���ܸq���t���8u��gϦy���_�[v�~��)k׮͵mccc233y��q�bINN�]�vL�<��G���?����=zDxx8]�ve�Νy�[A�(xyy1d�.^����Ϲw�~~~|����ݻ�P�kooϩS�HMM�\�r������K���^�l�ЬY3���y�����������s��e222x��!�������5)ʯ���N��ׯ���L�>�>}�P�n]���O����]�K�.��憋�u�������~�z������^e�dffr��]����듘�ȝ;w�+�ܹ��#�B|��jc%�?[�n��QL�W�����ٺu+C��btBQp...�{�nnݺEzz:���h۶-T�VM�!
!
�E�8;;�x�bƏ������B�Ea,�,ćHV�B!
��ױ����͛���bmm�퐄�ѐ!C�<y2~~~L�6M��!D�P�n]&M�ď?����
U�V�vHB��?����INNfҤI8;;���s��|}}�����֖˗/+'ͫ
̟?WWW|||��n�b�ر�x�'''�M�F͚59~�8����>}��2w�\"##���/�ԇR�J����Ȑ!Cx�������ݝ�u�r��5���ضm�
�ҥKT�^]�M{{{z����O���9y�$�G��ƍ���O�ڵKYwҤI$''3f�\\\��O����ĉ�?�K�.1g�eB֛ƖUA�߷�~ˤI�;v,�6m��ʊN�:ѠAtus���u+,X��S�NѸqcV�^�������9s�I�&���;_}�U��+��^��v�ڕ���&M�p��
���زe666���)��緿�]�v����cllLrr2�r5KK�|�y��^�������ն���ҦM~���5kƍ7��ؾ};vvv\�v��U����ۻ�A�p1b��Ջ�cǎ�m�777���Zo�ȑԮ]�s��aggG�֭�ٳ'�ׯ�t��L�4IY�bŊ���ƾ��kڵk���bU�u�Сp:/�B�=z���'�G���Ɔ)S�p���z)))0n�8lllpvvf�ڵ�����4h�
��ݻ̛7�aÆaooϚ5kTVx��%7nd�ĉ���2|�pf̘����U���n�_�t	{{{�̙�VGSL��wN�NII!<<�&M���8P�J7nLxx��B�>�����֖���ILL;v���U�-�S�(�W�{�oCAω��-K�,aɒ%��ؼ�ȄB!�B7[�n�e˖��ϣ�l!��2e�0b����y���B�b��͍r��I2�x��^������ҥK�S��K��M�6�Y���'����ʕ+sm���̚5��S��L����ſ�������_�]�6zzzt�Ё
6�~�ze}�$�
6,p�V�X�ӧO�ҥaaa4n�}}}7nLXX]�t��/�����ر#aaa�k׎�e�ҩS'֬Y��c�T���,Z��:uꠧ�G�2e�ܹ�r2�m۶ZlY�M�8��S����KDD���4nܘ�>��Ν;���ʁx��E�O:�&GX�n�ڵ�L�2�*U�֭[�n�:Ν;��6"��$��͛�g������קaÆl޼�nݺ��?��z�je�7��3hҤ	���ԬYx��ШQ�|����?��ի�7hЀкukJ�*E�F�زe]�t!))I�h@A��ۻ�����0H��ʊY�fѠA������Ԕ�#G**槞���2S��Ȉ%J`hhH�Ν	PY�bʔ)ԬY�%J���@Ϟ=)[�,G�U���ѣн{��xF�B�[RR���9r���d^�x�ݻw���Tf���2s�L���y��/^���Ç�ڵ�Y�f�$R(̞=���������S��ۧ|�
��͛IHH ##���4�^���ի��ڵkIIIQ[)����ITTiii4k�Lm[�f�HKKS{S,�B!�B!�B�/�?��ɓ���bРADGGS�n]m�%D��;�[�n�w�^m�"�ņ��K�,!  ��Ǐk;!�D1s�7�|�q���@��������!##��={2�|��8;;��knnNff&�n�R�={�x��*�}����⢶b����21j����?~�ZY�V�x��Jy�Z��ӧAAA����m�7&33����B�-��^?-ZĹs�2e
M�4AGG��O�r��a�ϟO�nݨ_����hsr��m2335� �駟���oS~�IVnnn�,YR�LGG��S������ԩ�Z��裏r�OCCC�J�͜9�2eʨ�e�߲�+�����](��*Ň���}�ҷo����z���L�<�ɓ'�Z�G����C��\�r������K||�2�)>>�3g�0v�Xʖ-���BQ0۶m��/���L�0��+�n�:"""�s��l߾�{��Q�Z5&L����	7n�`Ŋܽ{��[�2d���kԨ����\�2aaa���q��	��}�tuu�I�&dddp��|||����ꫯ

U�,���ͪV�Z���O���z�s:��ӧ011Qk���TYG�F�B!�"��\��2�OV�����۴i�q�C!�B�f�޽���p��ׯg�С�I�|iذ!;vd������K��!D�1x�`V�^ͷ�~ˉ'��
Q�\�t	##�\�)f����ё۷oS�N6l�@�%T�_�~����chh��ǏINN�����*mg�(WĖ]�:u��ʕ+��B���+�F�"::���h��8�nݺ��_��W_���_h�e��ׯq��������<~����bbb����ȑ#ܸq��={I�-^OV7o���ŋ���p��	Μ9@fff��)��^��,,,4�+V5�|�����"y ��e�����|��?rNTҔ���W\\\���]Q~��T��`Ĉ�ڵ��� \\\�W��agg���B��'��!��5%�S�N0j�(�GGGeR�BLL�jV�z��P�~}ƌ���;'N�PK�=z��ͯ�����0RRR��K�.Mjj*�v��޽{�j�Jc�fn���|'[@���b��5j�mS�e��@!�B!D�|���>|X�DB�O���ӓ�7������W�����B!D��ڵ�#F`dd�ɓ'iР��C�@���6l�����?�v8BQl,_���͛��秜]^��*������Chh(�˗g۶mT�XQ��ӧO���XQ�Nbcc����u��y�'##CeU�,�9
X/_�<����J�.����9��>���~�I9���?�$  ���LMMٻw�r��7�-�7�~YU�PAe<Rrr2�'O��LJ�3g��cmܸWWWn޼���oC~�IV��"r*OMMU)��j�h�^�z�:u�K�.Ѷm�<�u��9�W]�R���rE��ӂ(ʯ�w��%\�����v5�(U�)S�ٳg3q�D�
��E{���لB�<���[N���/�YF6l��NVY��5e�>�U�Vq��YΞ=�ƍ�߿?_~�%�J��S��ձ�+���$))	�_��R�)�!ĻLpp���B!�(�Çk,��3g�d�ʤy+++f̘��M�ԖB!�������3X�h#F�`�ʕ�񾰲�b�ĉ���0{�lm�#��F�&Mpvv�~���T�\Y�!	��r�����?~���$._��ĉ���!00�F��x���d�>}��ct�Ё��X��ٓ����W�ҲeK���k�W�?~LRR�*UR�G���1-ѿ����ݻwٿ?���DFFr��Unܸ�w�}���=��\?RRR���?sM�-_�<������������5h�kkkj׮M�*Uhذ�r�ڂ���DGGG�,---���&Y�t�*�K�
�eo��ݻw�ԩS����+�bӦMt��M��+�����](r	Z�h���3�/`��񘙙i9*!���ʾr�be����Ev�߰�W��Ͳʚa��84mڔ�'Or��\�BHH;w���Ɔ�ݻ���9�n�������ն�I��jZ"UQ���U!
b„	XZZj;!�B�c�	}ޗ	x
��ߟ���hccÆ
����Y��	!�B����㱱���ɓ�Y��ѣGk;$!ޘ��>������0c��߬�B��y���̙3Y�j���"Gu���ԩS;v�޽{�y���4�Bjj*s�Υo߾9�555�̙3\�p�v�ڽ��!C��l�2~��W&M���?'[�l�ɓ'*cPLMM��?����W�^j��8qBY�03j�(F��Ν;���9t��[�� ����?�رclٲ�o��6׺�������pww��ˋ�cǪlKHHP���˗�i����˗/IMMU��ƍ�k��ٳg�ر�Z��cǀWIu
o��,^�///F��r���9s???tuu����X�?��k׮j�Ǐ^�U�_o�Bޮ�;�V�[[[�,Y’%K����v8B!�A1��ݻws�W�Z5���T�ϫV�Z��ХK�͛����ׯO�>e�ڵjO�!�ٳg�2M}�k�5Qd>+���JQ�&��B!�B�>x��!�f͢k׮�m�;;;��݋���ڪΩ���X���}�Ҷm[���kV�ZEzz��N�}�����LHH-[�T~6�^�:��愄�h�|&�B!^�4oޜ��D���%�B+���$$$�c�m�"�Ŋ��!,��ۛ3g�h;!r����qP}hh(:::���G�|ʔ)�;wN��nn�t�����ڶ.���C�ڵ�e�Z��{��$&&2x�`RSSsl�޽{,^�]]]�L��,�ٳ'�-R�$��˗�I�sZ
 ?j׮���/^T�faa�VV���9�9s�p�ܹ\۟?>�۷W)W�;�����6l�Z[K�.U�;�x����X�"111j���4Ɲ�k���ŋ���T)���P����E�on�ԩ�7�|CZZ�z�z�8������Czz:�ƍ�qU�%K����x�0`��m�]�����]��u!�B��Ӽysv�ލ��?�}��˗'((�����ի�|�rZ�lI||<���L�0SSSnܸ����j�����ox��t�ؑO>����D@}u���L022ʵMCCC���ؿ?ݻw��Ç��oMǮ]�6>��j����W�B�wm���k;!���ÀxwRRRppp�޽{ʲ��8\]]�ꦧ����ĥK��e			���q��<==s�kϞ=���j�A��‚����ݫ���B!���˗/qwwgΜ9XYY��メ�����P}�����///����p��X>|8^^^L�0�Ç�̾/DQ����ʕ+����W�^xxxдiS���			!  ��%K����g���\���M��nݺ����ƍcժU���S�zu&N�H���9~�8&L������M˖-ٽ{7M�4�￧w���snܸ��ݻY�d�rқ�3�7�+Vp��A������N�:\�~WWW:Dٲe��o���ذ`�������aaaA�R����S&�d���0c+�5j;v�V�Z1f�LӦM)W����'O���LJ-[�P�dI�̙�r\���	��Ғ�/_������1ׯ_gʔ)���T�R���8.\���?z�He���ڃW�۶m�����͉��g�ʕ��믅rM����d�С���|��\�x��S�r��q���U����Y�h/^$""��СCi޼9}��?�ԩSDFF�;w֘T����3g&&&���1m�4"##���O�V���dW�_o�$\!�B������իWqvvV�6p�@���lj'HHHP��722*�Ֆ��x{{��㣖ѨQ#�I'N�jժ�\�2�6[�lIDD�ׯW��o֬�Z���[ӱ��̈����*q�2���"����֖�� m�!�B�U���:T�a|Ђ���w�5j�য়~�aÆ�?�3f�������\�t�&M���ꊩ�)w���Ã���oߎ��%����U-��l@Æ
��P�EEEI…B!D�������q��a~��B"DQ���D����q�����G!�
<==iݺ5�֭cĈ�I55k�$88����~Z�n�VgժU*cJ�Ν��s�000ȱm�d@u��eժU8880�|�J
m۶e���*e�k�V޾v�Z���K�(��Y��>��c������f۶ml۶Me{�R�

�O>�1����ضm�/_�G�j�k֬��?��Vb+�+Y�$;w�dȐ!�ݻOOO<==5�ohh���/m۶U)oѢ����ZY������������j�3g�$$$�k׮q��I���_���3سgׯ_�C�*mz{{���w~�IV+V���Ύ
6��W�Z�-[�P�|yeYA��:����ڵ�iӦ�b�
�X�D�L�8��R�T��

e�ر�����W�^�m۶Q�ti��ܮIvE���.�<U�B!�������{�*T��O?�����ʕ�dɒ���0y�d:v쨬W�\9����ճu�� IDAT��*UBWW�J�*ѧO���s����/���q���駟�������j���Ғ���+�5�jժ�������sms���������h֬NNNc�k׎ҥK������P�lY�-�&�B!�(����U�+<���M�6EOO333�}�}�����A�z�(Q�&&&̞=x5�Tn�\����ꂊ:B!�"wG��y��\�v���HI��^�>}�Y�&����E!��-Z�������y�䉶�B�>}�p�����U�zzz|��Gt�ޝ�{�2n�8��7n��1���9|�0�{��B�
���ӠA�͛���{4i҄������M�^�022BOO�ҥKS�^=Ǝ��ӧՒ-���kN�:���FFF�,Y###���ӧ����w?4144$::�~��F�Q�LJ�,I�:u����9}�����[~�@Ŋٳg���;Æ
�~���-[]]]

iݺ5s����ի*�*���ӫW/�X��?��1cưv�Z�5kF�R�044�/�`�Ν̝;��3g��啧���w�QQQ��ۗ�+���O�֭ٹs'cƌ)�k�0t�PBCCiԨzzz|��nj7��g�bff�R����}}}�-[F\\ӧO���CCCJ�(A�
hݺ53f��ڵk���/�&[X[[s��!��͕㿦N���������vM4)ʯ��M'�
ךW̠�hF�]�B}���lݺU����Bq ##�e˖0i�$�s�۸q#aaa�X��jժ�����[
$3�
����,[���}�*�����-Y�(f�V�h���BQ\���}���AAA���j|���d���D6���9v��R�iii�o�^��ڵ���ͱ-CCC8�q��6mڐ���v,���t,,,���#::�p:'������B�Eff&�/��Օ�={H�
����ܹsY�b���j�)�B��G�Q�~}F���ŋ�����B ��)>$o���&�
z[M!�B�"�_�~9r��;w*s�ܹ��U���W_i9:!�yu���ׯ�Fmܿ���@�?Nbb�r6�N�:1d�

)ڢEӀ�


������B�M�����7��������#�:�=}�4��6uu��V�i:�B!�x���nj5��;w��O?���"�����y����o�I�B�ʕ+3o�<&N����=�5�vHB!�($��pakk+ʄB�ּ����:W��.]����3�|���k<�?��ڥ�B
��=�~���W�^e̘1���(���ӹr�
W�\aǎ���*WC�s��i<==ٸq#���<�z��ѬY3m�&�"jժō78{�,�Z�R��={V����w��aǎ�X�+W&11���$*W���-))IYG!�B����eРA���s�:t�퐄x�jԨA߾}���=B�8::����7�|�\�T!��BO����d���ݬ��A�BQ�4jԈ!C����������!��Ç�qK�,!%%�֭[3q�DLLL�������,Y����8<==�;wn!D\��I�ʳgϘ9s&T����bƌlڴ�2e�V�B!ޒ�ݻs��
�ϟϼy�hР�/_f���ju�t�B@@nnn���P�n]?~L`` �ׯ���///��J���ܽ{ccc�ׯObb"w��QK��s玲�B!�P���ɔ)S�ԩ���T�ZU�!	�5NNN��у�/Ҹqcm�#��J�%X�r%lڴ	kkkm�$�B�BP�	w�ޕ7B�6mڤ��ŀ$m]_~�%_~����B�|177�l��x�ܹs���S�BJ�,I�������ʊ��Hm�X$�������,���aÆ
��������B��СC���߹}�6#G�̵�ȑ#9t��Ν���Ne[�ҥ�4i��yŊ�������Ȉ;vЮ];>̅033S�…2S�B!DO�<����͛73k�,fΜ���n��:}�4͛7/��NGG���L�� ��/���:u����Ŋ+��B;mڴa���L�2�/����e�j;$!�B��BO�P���B�삃�:t���B!�"�>|���ˉ���ٳg���2|�p\]]�D���T|}}ٷo��7U�T�w��888������H�		a�ҥ�;w�R�J��_��wߩ�h��6����2e
���SΎ��~6m�D\\iiiT�R�Ν;���Lٲe��fmGѯ��R�J���_<|�P�p�`ll�l399������+�2���ݻXYYQ�fM�mۖ�s������7�ѣGT�R��]���舁��Z���X�`���C__����3a��T������K���ٻw/			���ajjJ�~�������u���dBBBhٲ%ժUS�W�^sssBBB6l�˗G!D�h#��L�2x{{���ɑ#Gx��)&&&���1k�,��g��燏���+W333����S����)SX�r%������гgO~���=����U�8z�(t���t\!����p����<z�ݻwӣG��eiiɶm�$�A:::8::���(W���CB�bg��ԯ_www��ݵ�B�bN>��}o-�B!�B!�x�������{��eqqq�d�����qrr�ҥKʲ������p����j�'�;���$���ؼy3/_���ͭ�m.]����d��_�___�:����������Ν�c��{|���qtt����oߞ&M������n���<x0~~~DDD�v8r�;v�׹z��)�G���͛*�&&&???��.\Ȏ;�m���s��144��ӓu��)�y��9�ϟ�󤤤�P�����Cjj*jmXXX�޽{0`���!�(:*U�ĬY�T�T��

�<y2�'Oε�=z�
,W�������O͚5����̙3�;VfMB!�?~<-Z� ""B�����m�VH�	Q4�5��3g��ѣ��B;իWg�ܹL�6��#GR�n]m�$�B�7P��2�B!�B�b.((�{��Q�F
���������[e%���@.]�D�&M�ĉ���ҬY3bbbؾ}��>�|�	aaaDEEaoo���ߨM�����6l`���DEEq��1V�^
��Tg���U>��������]��1c�ЩS'ƍGhh�rfn��C�R�lYT�P$\t��!_�jݺuܼy��5k*����/5j���j����d���DGG���G�5��>����:aaa�X����h�9����ظq�Z���/**
��
���(S�BQtu��sss~��7�<y�˗/�u�s���y��z�#�?{��S�?~�5(�DnG�[�I�r�19�H��RR��d�☎��\4�I�jB��.�1dN�2���#�1Q#|
�%I.���|N��|��x|����{�����g�^˙֭[�,�����GG�mK!��U���ǔ)Spqqa�̙�ݻ���-���Z�h����r�\!�5oƌt�ܙ�s�;!�B<'Y��;w�.]���/..���d���ϸq�^dhB!�K)!!���{O�a!�x
���U�<55U9���ۛ��~SSS-ZĬY�T��޽___ڴi<K~����Ɔ��lllT�Y�`�۷�% ���s����:���#�����RXX�/���O?�į��ʱcǀg�B��:�+f��_8z�(Ǐ'--�cǎNJ+hٲ%M�4��Ύ��ד����������ɓ4j�SS�*�Ui��W�^,\���?���{����rN///��o��6���̘1�}��)���萛�KTT���:;;;������w��9�YBIq���*u�B<���x^����9�͛7��營���~}}}�M�V�mjkk�����ٳ�4i������U�m	!�B�JΞ=�رc�r�
۷ogȐ!,Z����8rrr000`�ĉ,^�X�w���111�_�^��@tt4'Nd�رlڴIY��oPXX<{���_��F��N�:���'IIIhkk3v�X���iԨ���k�X�p!���ܿ[[[�E=}�bcc�t�������0u�T\]]k�gE]���ΠA�HMM���LB�:kРAAA6����?�5J�!	!���$��9͛7�������FHH���2~�x����ݻ�"B!^�?f�̙�C!�(WVVPrV������X[[�z�.�(322R����<{Q�<�T�W�q�s���_~)QW10�,�i_�[�nt�֍ɓ'SPP��u��o�a�ҥ�����X֮]���III<y�sss4P}\QQ_���ϒ,�Rܻ+W������*ۊ��/_V�͙3��>����d���Y�b...888�;����ݺu�ƍ�8��LQG!��K���O?q��E


��_����9����������郇������K�E!��u�ԩS�ڵ+���(�+dee���KJJ
;w�^�z�������̙32d�۷';;ڶm˪U�T.������Ҳ�6������͛���8V�\ɓ'O���0���L�1���*O(xyy��7�(�

��"�޽���g5zR�N���	+W�d����G!�$KKKƍǬY���_�*�e!��(I�xN(����,^�;;;���eѢElڴ	mm��B��$00P�a!�xMO�W��VZ�B��Ō���)���$444j��EW�X�t)����ڵcȐ!ѣG�J��X��
ăHHH(1�TSSggg��”+@4k֌�>����h222HLLT������,E�2�+�ԡ�[t ������g���l۶��'OJdd$3f�࣏>*�ܕ=Nq-�_-��
!�([y��?�z������C��Qu�)�B�y��!���'$$��?�6lȒ%KHMM�_�~�\�Ο?���?��3��Ḻ�ҴiS""">|8NNN�ٳggg�޽��͛��ק�����˖-�TEu�҅u����o�d��,Y�?��L��'33�N�:E�޽INNVY}CAq̎;�������
6���App�$\�Jqww�O>��ߟ�M��;!����ڵ+�|�
�/Vw8�����&::Z�a!D������jy��]���ׯ3a�e���=111�]�5F'�B�ODDD���_!^&��β�sj׮���'O���w�U��<y�D]���ؾ}�2�y��9	�������̐������i�[�n?~����ӧ�دX-�xb��I�ؼy3���$%%Q�^=P���ڴiåK�8q����S��8qBy-ŝ:uJ忑��4�z�-�zzzzX[[cmm͙3gسg��pQ��7oεk׸s�͛7W9�Ν;�:B!�B!�(��ŋ�7�����رc��������Q~��޽;�֭�S�NDFF*�!�
�ܹs	`�$''3{�l�^n�UiC!88�Ν;0w�\�,Y����֭[X�j��y��Y�b�F�R9���.w��!  �ӧOccc����K}6#DY���"22��?�X��!D�Զm[�����/pvv�}���I�Q�f����F�a!��3PSJN�X�=}���+Wbkk���9�fʔ)ʇE������5���=���P


�u��033Sn߻w��7ҷo_��=[�n���7n�޽{�x�B!���ĉ$$$�;!����r劺�x��{|��Wddd��c���ꫯJԵ����ۛ�g����n޼����133��ݽ����9�9BAAgϞeѢE��w��[E!;;�Z�����;���.\�@AA���<x���*�Thٲ%cƌaǎܽ{��={Vk&��C����˩S�x��1�N�Rޫ�V�X�d�򾦥������#�uƌ����7o&//�Ν;cll���Q\e��ҥ𿄔�e�:B!�B!����[�bjj��ǏIMMUI����_�ر#o���өS'���U��ҳgO����޽;~~~�P�6LLL�?7k�P]��…����7x����G[[�]�v1o�<z�쉯�/yyy�.�B�&Mppp`�ʕ�E!괹s�Ҷm[�͛��P�BQ
j[�BBBBX�~�r�ѣG����������8q"���s��eݫW�NFF!!!%f�,j�Ν���aaaQb���)))�ڵ�ܙ0�B����ښ��@u�!�u�$�Ռ�'�c�.]���ɓ˭;y�d���ϩS�pttT٧���ܹs��~M�s�С$$$�駟�駟����Y,,,����֭[���b``���۫Ծ��%�&MbÆ
���[��:0k֬�NNNlڴ	(=1�2���ٻw/��ٸ����k߾}�2x6���}�޽;�ǏW9���/~~~%Z����Oe�0` ##��222��B!�BQ=~�///pvv&44mm���&1�F��diST�:mhjj��Naa��*�6�Ä	1b[�ne͚5>|ooo����� ����FXX����,J!jIÆ
���o5j�v���ʪV�IKK�wީ�sW����ˈ#((���hu�!�j���C���Z�b˖-��e:�9�����Pə3g011!::��G�G�޽III!>>���T�1�����ÇЭ[�1(�u�B!�B�O��r�ikk���5M�6�A����/�uuu	���ׯ���C�eݺu�Z��&���+++�����ԤG�|��WL�6
��w���Ӷm[�ׯ�\ٱ��Ϟ=����J˖-�W����3}�t6l؀��~�5j�����+�q�Ƭ]��q��ѪU+�ׯO�V����gݺu���8&  ��ҠAZ�j���+W�T�����|��t��MMM455122b���|��ge�S��F�������%Α������r�!�ϒ!��,�ȧr!������aذa�X����p֮][j����!�.]���������*�.\Hzz:}�������0���Q�;w��*���ɥ����gʔ):t���>�����O<==�ܶx}�������*BQ�F����
�g��ѣG5~~�r'���R�6��|�#���S[^�
fff�*/k�KM���!77���(233:t(vvv��٩�۽{7�l��6m�ϖ����Ɔ��lll�l�ܹs���;�S<tQ�B!�B��j֬Y��!�^�
@�-T�������vY�{K+�s6n�__�R�)�.���J�M���+��ߟ���W���ɓ'�gߡ;v쨲�*}դI,X��*�n�&M���o+�gmm���u�uJ��2�5j�֬YCNNm۶�
 9q�nnn���T�B��������~���;!���ڵGGG�7o�ѣG111)���~�����os��
�-[���?����ݻ��{���ٻw/Çg���=�aÆ�fk.,,��W��ʲ��gѢE����a����IKK��ͭD]###233	

��ё^�zq��@u�!*���www�/_^⹧B��@���	

b޼y5z�m۶��B�?��
s�̡aÆ$''���	'??_�^vv6�lp�����H�P<�(˭[��g[�S�)�!�BT�ҥK5r�G����¸q�pqq��Y3��}>n�8ƍW�1��S��c��.]�ҥKٱc�s�O����133c���ܽ{��O�r��E�
�\��.�����͛���`ҤIj�H=���iݺ5QQQʲ��(pttTcdB!�B!��=y�O?����+++�;Va����]�v%))�>}�������������l�2n߾��ɓiܸ16l@CC���7n���3�o��e˖t��E9�beۨ������;�͐!C��Ԥ_�~��V��t���===6l���C��r��6a�tttWw(BQ����[������?�ʕ+�G!����V�(>ۣbe��\Ѣ8+++������ٶm'O�$44���Hf̘�G}P�"�����W,_Ã� IDAT�]�^�|E�,�-�B��X�t)���52��cǔ����r��1,,,���uMM�����/�Ͳe�(,,d���ҵkWu�&�+k�ȑl޼???���T���뫬!�n��ʟ���=z��Qmmm|||�={�2�$>>��� �����B�<j"AY��YTT�r�B���?���IJJ"$$��ӧW��&M�������?�@NNzzz<��?���={ϒ~��w"""�������쌇����,_�ooo���y��a�ڨ��
��~�������3�U�V�R���



���;Μ9@�N�����O�ܶx�ikk���LXX���/u��B�����Edd$���?X�j_~�%qqq���```�ĉY�x�����111�_�^e���h&N��رcٴi��\1.Q1277��6�w��)<==IJJB[[��c����O�F��u�]��…�������ڲjժ���S|||����ҥKhjjbbb�ԩSquu��^�q��uF�IӦM��矹|�2666�jՊ��u�W-�Ν�K�.��#99�����3f!�sya	/===�������̙3�ٳ����	dee�}�v��F��͹v�w�ܡy��*��ܹ��#�BQ��LNU,]>d�8��}�$�/2!���������r���ÇD@@����,X@���駟�x�"��/���WWWZ�j��_i�Z��Ν;������M�������������1cF�3W
!��N�Q=2�B�WQbb"���hjjr��!儎U���O`` ���e։��&::�D���NNN��	&0a„j�eO�XZ���������VX����r������

b��݌1B��!D����C@@���?~��g�*�eee���KJJ
;w�^�z�������̙32d�۷';;ڶm˪U�T.�������R�ximeii�͛7�g���\��'O�<[!l��dff*������ݻ%����o�Qn���Lrr2w����ӳ=(�+##�=z�lWf��Ѽy�8p�@�c<���		!66���BƏ���1�{�VC�B���JI3ffffl޼���<:w�1�z���x{{s��Y�<y�͛7Y�|9fff���+�*^Tdgg+�sYYY%bP���U'�B�gƍ'��5�ƍddd����ԩSiܸ1����%�նu�Vnݺ�ȑ#�e#G��֭[lݺU��	�j�W�lذ�C�������Y�p�$[Ԁ��>����_h������u,[��e˖aoo��p�B!�B�(,,�믿fذa��ۗ�ǏW+�BQuݺuc��\�Rݡ!D�gcc���gϞ��w�%--�G�q��i��?�Lxx8M�6%""��w����ē'Opvv��ݻ�[�}}}�����B�e�HMM�_�~�QT�.]8�<yyyx{{��?(�������I�N�8z�(>��:u�ĹI;v���ÇܻwO�T\C�)*��������?x�ŋcgg���mڴ��֖E������x�V�pvv���???���T��9r����߿�S�N���ROKK��s�*�����u�����}�v�����(1#���A����	!���?�����(�?N~~>�ڵc̘1|��������9r��n�B__�A���G�$]*<��������hhh`nnΤI�TV	��9}||�C���_� 99��;wr��E>|���>}�����---���ϊ�l�
�����ӧ4---�O?�ľ}����S�[^̕���u�혘"""ؿ?
4`Ĉ�?���\V�^���_4h@�>}�:u*��ڵr�����}*�vdd$�W��ȑ#hhh`jj�ĉ���Wֽ�>			���ЬY3ey�-�ѣ			�=Ze�W!�B!�B!�x�ܼygggv���ҥK�3g���$����ΤI��|�2o�����B�:M��ȑ#���w�ޝu��ѩS'"##quu`ذa̝;���Hrr2�g�f���嶡x��[o�Un
���t����s�d�nݺ�ܯ��oժU���<�+V0j�(�s���r��8}�4666L�>��ӧW��D�����L��g�<88�����:֮]���UV����'&&��k�������*��p��%mmm���O�ڵ+���hjjbdd��ɓ��ϔ�tuu	���ׯ���C�eݺu*�S̟?��m�R�~}


1b:::$&&��!11]]]�{�ڿ`!���z���~�)$77�Ǐs��E��=z�g�}ƶm۸~�:�?�?�`˖-��������������Ç���e��ݬ_��������i޼97nT>T����ɓ'ܸq��~��իW�{�Um���P��?t�P�+z�߿�̥̋�\�~��5kְc���������g���,Y����$>|���9x� k׮�v_@���T'��֬Y�����<x�ŋ�����s��a���K]��w����瓔�T��&�B!��33��j��s�Ε�/..OOO<==�+�\!���%''cjjʉ'8x� s�Εd!��֖f͚U��J!��������~�7��N�:����R��ח�={���L���KL8]�_���;V�
�ϊ	���۾p����*�
<�Ĺ������f׮]̛7��={���K^^^������ӧ�\�[[[���<x0S�LQ&����Gpp0��֘��3z�hBCC��sA5�����{��q�F���K�V��uZ�n���7n�޽{�x�B���Z����kk�
����)_<����
+++��F����5k��ɡm۶���p��	�����ѩ�E!����������U�V̚5��;r��y���TfVؾ};����;w���;�۷�ʕ+������ξ}���_��rL�6m�1c͛7g˖-lٲ��G�2mڴj��]�v|���U
puue�С�����������x6��U��~FFׯ_��А:`hh���!�.]����*Mʊ�*�^U.\�o��M�6�����ի144��o��E�l۶�M�6�$���-�����Q���V����Y�p!&&&dff�������1�����gdd��#	�B!�B�}�����Nv���FHH���2~�x���KM�B!�x�BBB�7oC�%22��-[�;$!^[�������z�j-ZD��ݰ"!�xa*���Ν;e�lbju����,�ń��'vT�+(j„	�1��[��f�>���7���������^��էxNx��y�С��=L�<ccc���k=���������������8q"���s��eݫW�NFF!!!ԫW�<�;w�$//��,,,HIIa׮]|��G5xuB�ׁ|3�%����?�!**�������j�N!�x��5��xy\\)))L�6
ccc�ٲ�������?r��g�Vf����̘1��3g���Xb�ԩS100�>`˖-ܿ�����<`X�~=���dff���HVV��P�����ou�aÆ�޽{KM�(sU���\]]�� �F�"66�������ӦMF�ͦM�TVw���[S�[q����O���L�6�/�����e��ŋ��T��LQG��Mtt4�=RwB!D�ڴi��Cx�蕜ˣXݰ��x�b���߇lmmY�h�6mB[[�E�)�B�ݻwquue˖-��_���ۻ�SB�cڴi,]���۷���;!���

9w�˗/g�ܹ=z��UT.\Hzz:}���رc��$00�Rm\�tI�>�yu�ܙӧOs��A����)˓��K����ϔ)S�2e
ǎ���믿���S.^ �x�ؐ�۵m˖-cffƣG�HHH��Ϗ��Xe�Edd$gΜ��Ą�bddDVV���������
����^�>�=|�0ݺu+�����Òp!����.ᢶ�^�/�������a���L�4	���x������z��!�u͕+W��_�J��t��U>���RϥX���v��)nԨ�:�CuΩX�J��?��믿&33�D��3AW���߿�ѣGX�n�֭+Q?%%����+p��*�^U���ʟ���T�^��7Tm����B����V\�^�T��v�
��kהe�YG�R�����O������'�B!^cǎUw/��^�	X�v-ׯ_W&n����ڵk���PctB!�x�8q�q��q��=v�ލ����CB����x�w�־b���B�z�-F��ʕ+%�B!jч~�lޫW/�O�ζm����KKK����޽{	d��ݻ��Ç�|�rF�ͰaÀg�_^XX���(*�ppp 88���~�7n�lٲmT���=�-��͍
6`nnNZZnnn%����Ihh(�����Ջ.�+i�ڧH��ѣG�۵MGG���\������d�С���agg�Ro������*'��ر#>>>��ؐ�����M��;w��#ŸE!����.�.�ӧ���0c�LMM��B�r*>�]1x�����[β,��&Qty�:g��3�����̤u����ۗv��ѩS'<==�=wU�?t�P��

8t�VVV��\V��-WZXX��_^e=L�h6�ڸ�5�:�W�~}�mEbH�~Q\Ci}�(����e5k�,f͚��0�B�(�����S���صkW�^ECC###ƌ��2������5kְ{�n���Z�h��ᅬ����T�Ɍ��t��=6n�H߾}����n�3336n�ȤI�hܸq�t�B!D1aaa̞=sss���iݺ��CB�lllضm[��^$www>��C~��7�����B�I^^^lݺ���$e�bRD�-[��۷�<y2�7fÆ
hhhA�^�pvv&==��M�ҲeK�_�N�.]�С�.]Ri�O�>*�m�*�ϟ��OZZC�Q���ۗȾ`�������(1�G�cE�)>�ҥKY�t�r��/��/�jw�9s���g����Lrr2+V������7WZ[[�zE�NYnݺP�NE���BT�K�pQ�fspp���A�a!�uJ�֭����9w�={�T����޲eK�\��w�}G˖-k���8�ɓ'���/��������O�<)1ؾ:��۷x��h�޽K�?q�����۷�D�EqU�w��<P��Q���6�oM���Ο?�2��ٳg��G�6mʍ7�w�M�6U9�޽{�:B�n&N�Htt���B!^��i`��.$$����+�=zDzz:���ܿ��'V�^AA���9sFY��ի������AHHH���;w�$//��,,,HIIa׮]|��G�}�B!�������ݝ��H,X��_~�2A���m۶�;�F�I۶m	�믿Vw8BQ'5i҄��$>��s~��~��w
9r$_}��򝼇����;��


	������Y�|9���dgg����R����AOO����矫�����
��~���ؼy3w��e̘1�Z������nnnhhh��w�)�mu�ԉ>��O>��9zO�j����߿?���g۶m�<y���P"##�1c���dEϹsss��/V
!j�<�B!�+��‚��X���3s�L:v��o��ƿ���u�}�]�n����˙:u*:t��ݻ������ӣG���U���<�'077���ˬX�BY���K�&M��W�^���J�gee���ɛo�I�^�Jm�W�^�iӆ�~�����R�UT�J����q������{�Ǎ7X�zu���*j����mժUʾ>�<aaa0@Y��А7np�ʕ�W�\Q��u���ATT���B!jUtt4[�nUw��-[�����="!!???bcc����ə3g011a�…������/)))���cccCjjj��6>@�n�JĪ(;|��$\!��V�={��c�r��U�o�ΨQ����
4��Օ��`���2W*B�|�	$00�۷ocllLǎU!���K�d���	'''�	�0aB�m�������Jhhh�u]\\pqq)�mQ{RSS9~�8ӦM��Ąu��q��fΜ����r‹������5��֜9s�={�A@@��٤��YYYl߾�Z�5�7oεk׸s�͛7W�w��e!��*I�B!�+gԨQ:t������˭kccñc�8�|�6l���s�ۯ�s���<x���BBBJ�x�"�{�V&.̞=��-[��w�U���{�����o��f������ɓˌ�*�޷o_~��g6l��
J]a�y��-���[�&MJ���r��Ԕ��T.\�@���U�*��,�<����c�2v�Xu�!�BԪG���	����_���:::���Eff&C����;;�j�۽{7����i���;��ネ�
			��ؔ�bU����٥�\(�BQS���:u*&&&?~���۫;$!�[nn._~�%qqq���```�ĉY�x1ZZZ888���4i�����h&N��رcٴi��\�.G1X�2m=�ԩSxzz������6cǎ��ߟF�)�^�v��������eժU%���ӧ���ܼy�F�������	S�N��յ{R!�BӦM���cڴi�����u�z�����Ĥ��a̘1�������ȑ#�ܹ3���;�l=KKK֭[���7,�s��ܾ}���H6l؀��+W��7�fvv��;F�.]�v�YYY%+����u����^g\!�B���∋�+u���>>>XZZҸqc�ׯ���!�1��eLGG�/���Q�FѲeK�ի���.}��eɒ%՚��&�9e�,,,���BCC�N�:1g���~�IY�U�VԫW�G�U��Ǐ������.�.7�!C�ШQ#y��q�����NNNXYY�������{���ݽ�~��ڸ�����b��O055�~��4k�kkk����������o���������E��C!�BQ5s�̡aÆ$''���	'??�Z����������L�Q$Y(��r��-7n\b��LQG!��&=z�ٳg3~�x&O����%�B�	���XZZ��_s��E


��Ѝ=��O�ʛo��̙3��ggg���A۶mKMt�jEYZZ���?����͛7Y�r%s��U�}�6`�ڵܼy���|������/q.///���[
y��1���$''�������B!�e�2e
}��e֬Ye�8!DU�	�	)���<x0�����'MMM��&O����!�N���ё~��1b�6l؀�����6������2z�h��	��5�(4hP-\�����.ʚEY!��&4i҄�ӧ��������T)������\�e%x�V���lԨs��)u_���-,,J,_Q�
4 <<������X�vm�1C�]KKWW��?wU���򚾿��yy}R��������U���ڌ5�-[�p��uZ�j����9{�,�ƍS��J!�r�ܹj�袘E����+SG���><x� [�n%##��w�Ҹqcz�쉭�-|�~���YۿW5u
qqq$''пƍ�\�BTM�_�o����߿?���g۶m�<y���P"##�1c}�Q��U�r=77���g��ꕜIQ&��BQ�._��رc���(s@���e˖���J�~�X�r%&&&�?777~��g���quu�iӦDDD0|�p���سg���ܽ{�͛7���Oaaa��-��FQ]�taݺu���,Y��%K���?���?���t�ԉ��(z��Mrr���
�c������"99��Ǐ���App0����սB�Z{�7�_�~�������DP<�����*�/���-
4 ..���LڵkǠA�T�S�����իٷoׯ_�Q�F������N�N��u�ϟ�w�}ǵk�(((`Ĉ|��$&&����b���{�\����񄋁Vj@�B!Du999������+���p��֬Y@׮]�a�$���3fGKP� IDAT���������-[��9:�:x��yyy%�e��y��q�I�x=|��O?��={������<x����{���g����Y�6�liii���Kaa!�Ǐ���X�zB������5��֜9s�={�A@@�2�������b���T9��͛s��5�ܹS��;w�(�!�BԔ]�v���H���III�[�n�I���[o�@���Y�n�:u"22R�1l�0�ΝK@@$99�ٳg3|��kC!88�Ν;0w�\�,Y����֭[X�j�.�fŊ�5J�\���ܹs��{�ҪU+������,1)�B��gff���,�>@OOO�!�W\BB���?���8�A+������g�	�VVVXYY��5j�֬YCNNm۶ ''�'N��憎�N�/B��*9��B!�Kn���^�&L����'�O�FOOOf�%��//---f̘��}���?��?طo4l�P��:�ɓ'�ܹgggtttعs��C���ATӒ%Kسg���̙3���x�=ʮ]�����iӦ
�w���/��v��~�����	<`������a``@�6m���eѢE<x�@��	!�h̘1����y�f����ܹ3���hhhT����%��ޜ={�'O�p��M�/_������ʺ��q����e�����JĪ(��*WB!�E=}��/����#G�׿��cǎI����~��W:v��o���(f\NOOW����KϞ=INN�{����x�:Ku�f̀g�]*\�psss�����G[[�]�vq��u������!//��؅B<?___��������gggZ�nMTT��,**
���UV�+\:t��'��i�uHѥP��:\\\000 11���=zD����իvvvʇȢfI��ܺw�΄	X�v-���t��]�Q��������$bbbشiׯ_����빘�����ū�ĉ$$$���Gxx8����}͚5c�ȑ��ߟ	&������o�����c֮]��י0a����ޞ��֮]�����B����3�������HejjZ�z�'Of����:u��A---�Ν������֭[���b``����0` ##C�4�.Z!����7o2i�$���÷�~����5E�J�XI�4�$��h��ꦥ��xO_�}}фo�	&0b��n�ʪU�8z�(�}�AAA����$~!��y-[��/�`��ٸ��ҵkWu�$^���5�E�������LJٳg3i�$���	

BKK��"��;j<�BAT!������,!D��W��F�*����]��/�b��#j˩S����!&&���,z��Y����WΰVWݸq��� :ă022��ɉ�����X�f
�w��?��E�����������T<�ܸq#�:u��
2|�p�̙���v�����166f�ʕ�ٳ�M�6q��Y���iѢC��������P*�~uT�*{��{���޽{�y�&-Z�`ذaL�6
]]�2���r��Ç���c���hjj2p�@f͚E�-T��J_޼y������
��֢�m�����J�EQ͚5��ё�� ~��e�Ee�/��~�jW��WGuo�rO�ݻ�ƍ�۷/�Z�R��n�3336n�ȤI�hܸ�s]���^�$J[[[4h@\\����k׎A����\�z�������z�j������iԨ������+g��?>�}�׮]����#F��ߒ������J���������{��Z!���KMM壏>�����O�!DE

9w��.]�C��_�p!�����ۗcǎ�������m�2:w���ӧ9x� ��ߔ���ɥ����gʔ)L�2�1c�p�����<==%�B!^�iӦ��ٳe�y!��O�>xxx�����3JLF#�UQk	B!�B!^]����$�ӧOӡC����mfȿ�>���\�|YYv���R����Ι3g�eW�^%<<���BBB�W���1nnnʙ�����y��)����>g@@���S_�bk֬Q�s��56n��ݻw�]��:�WGE�P���P�rss�:u�r0+<���hRRRGGG�Z����l߾]BB'N� 22===�j}y��=\\\���Q�ݱc���/�ɓ'<xp�18��� ��ҪeT��+���Q���铝;w������E��-,,HIIa׮]�GB����$kkk���+<�����������ӳ�zVVVXYY��5j�֬YCNNm۶ ''�'N���V��B!BCC���dȐ!DEE���@����?������y��q�˖-���KKK����޽{	d��ݻ��Ç�|�rF�ͰaÀg�Qr��y�����Fe��۳h�"���ذa��椥����V������������舗���9��N�"��r�ׯOPPC��ᅲ�ֽ͢���$����x��B!�B!�k׮�`�LMM122"((��C�r��!.^��W_}Uf��ѣGٴiS�Ovvv�m�u\e��MQQQ\�|�6m�Α#GS��^!22�3g�`bbBtt4G�%..�޽{���B|||�c:t�-[8|�0...�۷��ٱcG>�L������ˋÇ���ĪU��g3Z������T�vuگ����*���~X�~=����m�Vy�5k�ЦM.\���u���C�

�ȑ#���ӦM�\�Bdd��NU�rÆ
���Ю];"""��믿�h��?�������|�M�_�^���(�:}\ѽW033+�S\M��V�>|�nݺ�8^Q��#�/gggZ�nMTT��,**
��B!^U���8::2s�L>��~��'I��
///�v�JRR}��ACC������aٲeܾ}�ɓ'Ӹqc6l؀��4n�gggn߾
@˖-�ҥ�r�ʶQ����w�!;;�!C����I�~�J��y��xxx����2�Đ!C�ܶB��4h�&M��ӓ��<u�#�B���l�EY/�뒸�8�fqqq�G!�B�
��_ptt�o�!--��m۲a��/_΀x�7�=>((�q�ƕ�:t�Z�U���*k�vi劁���޼���hhh`jjʢE�J�w������bllL����ر#>>>$$$�8f���oߞ�
2q�D�޽�\�tttT�a��;v��ݻ��O?�|�r���k����T��ꨨ�r��Ci��ի�r����X�bv?


�~�m��E�җ���`�…���Cy����?K�]PP@��/`ZXX��U��2����ꨉ����ɹs�gI#�)F(�!^�%o=��U���������\�z��W����ZZZ�O!����g�bnnΎ;HHH��>��U0�xU4i҄��$�̙C�hР͚5��Ɔ��d�y��Y���Npp��y���!���\�|�/_NǎiР>�RUѰaC�������iٲ%
6dܸq�	Z�rssc͚5���������m۶�~���J�BQ}_�5�o����Oݡ!�����ȋ�VZZ!!!���RXX���166�w���M!��P|||�͊-��ft�֍�����bccٸq##F�����q��aooO�~��<>**�ZK�FEE�̴�2���(���+qX[[�z�.�(322R�����ӧO�뜊�
7n�`�ܹ���/%�6�����_�~}�<y£G����(Q7??_Y�����*�A�x?���ЫW/�r�9�\�R�*ҿ�m��˗/+˪җ�㊯&S�K�V�Z)Ͷo߾��_ڪ ���2����{��.>ع:��W�>�u��7.q��LQG!^}����f̘QB!��ٴi...��у�Ǐ��}T��L__���@ˬMttt�r'''�����&L`„	�j�~�WZ���������VX���E�*)��h۶-�7o��˫ܘ�BԜ���{���?�(��!�쓙�43��Of�1��Q9�9�0d�|��0̊DD��-�9D��9�Yd���D����ޟ���T���y��v�u�߯�z�_׻���z֭�̙3�1c#F���w��uHB!D�#	%�ӧO���SSS���ό3���H�
!�9svv�{��C!J��&c����J%�+W��i�&6m�IJe�077gРA4KK�B���Ⱦp[�X;���ب��ǫ��U�Ț�PX}f���x�b.^����;v��ܜ�����w~�뭷x��III����m�ܹ����U�S<���>9Ѷ�?�x�1T�$��^]B�g֝=�3�9U��VŢe˖ܹs�}��1bĈ�߷o�Ҿ ���8��}~��&��̉*^m�:VX�$�(��[_�899(IV!�"==�iӦ����ĉY�d	*T�uXB�7��Ȉ�Ç�z�j��ܤ��B�A�&Mb�ڵL�:�-[��:Q�mܸ���t]�!����.�EhHRR���
bӦM*e'�B!��uXXX0k�,f͚�o��Fpp0�֭c޼y|��899i�y��033��9s��>�H9~���������dz}�v%1�uF�111P�zu����Z��w��
��"##>|��ШQ�|_C~އ�ԫW��7or��i�J-�O�P�>===233y��	���@�UΞ=�Ve��~P�a*?siffF\\�N����Z9~��y������ܹ���@:t�u~�\�?����]��ϋ��qQ*����̉��	���$''cbb�����d��B!�B�			888p���W9B�...,]��]�vѻwo]�#�e���˖-�G�DDD�`�U۶m%�BQ�9::I5�b[�b߾}���q��%��ҨY�&�:ub���T�TIiw��}V�X���y��)]�t�o�Q�ߺu{{{�����_�~��矄��cff��qUt		��ӓ�g�R�B�u�Ɣ)S�*L���_�\��#G����B�
6l�z�R�#55"##�{�.5k���O?eԨQj;s>~����ڴiC�ڵ��u����ʊ���J�*U^�B!����ٶm���B�R���[[�|�N�#{�]�[�lI˖-Y�x1��ф���hѢQ:���~Ӻ���t�ޝ�ׯ��w�1w�\�{�=.^��w�}�Ѷs�ά[�www���hܸ1>$((�
6`eeŪU��5~a�y��1�u�F\\�~��r�ѣGԨQCI2�u���C~��޽;����^��r��ѳgOjԨ����ٷok׮�gϞ��U�y}rҩS'֭[ǂ�;w.���\�pA�C�J��ի���n݊��=w��a�…9�=�|%�s�α`�z�衴��\��ٓ�+W�`����[�7o��˗�?���~�!�{�&""�Q�F1f��v튉�	���c�޽�Y���O�ҳgO��o�����u�(��M^�I�&$&&��X��B!�B��.22���cbb����Kl�S!Dᰰ��k׮����b_!�x�lllptt��ՕnݺI�1�aҤIL�4I�a!D�T,.|}}�W;���HHH�=R�<~���#G��������_y���~��XYYq��IΞ=K��͕sgϞ%!!��m�bff��qUƎ��Z�����?�̋/pww�8;;s��=�5׮]c�̙<���}����3\\\�p���Ν;p��y|||�R��w�&55Um�KkkkN�8��={����4!�:ckk������B�b�����ׯ��닂��>;v�cǎx{{�{�n6m�D�ʕ�l��agg�/����@����_��͛Z�6d5|�p���8{�,C�Q;W�bE\]]�=~a�٩S'v���̙3�9s��K�.amm�$���SSS�oߞ�����8p�111,[��e˖i�էO�����ggg���ϭ[�9r�ڹ����ԩ���,]���K�h�\�F�qYZZ��g�)��3�C�a߾}\�|�1c�(�{��,����ݝ����{���鉧��F�Ν;���Q����g��Ra|��eNڷo��9�<�Z�Rk��F�L�B!��(�x���3g�X�v�R	RQ��7GGGn޼I�
t�B�)K�,�iӦxyy��MфB�ҢX&\lڴ	��ӧӷo_���8w�cǎ%::Zi�a�033c޼yXXXp��9�E$����<y�������;w���qU�y�fϞM�:u�'  �(	�ׯ�޽{XZZ2o�<j֬���[�l!  @Yhąh֬�|�
�����dz`�N�8��m۰���ȑ#4m�T#ձ#G�H…B!�%XA-�4���C�>}tJ�~��\�����x���???|||8t�)))4lؐ!C�0s�L�j�����v�Z8@RR�+W�U�V���ШQ�|�^}~��Wddd����iܸ1C��ƍ����y�f����6m+V� 11�gϞ�{�r�ʱl�2�����_�~�:���ӬY3��O�=���!'U�T!00�իW���111�k׮�=��U�*m]]]���'22��O�bee����~��־===�5k111ԨQ��={jT���\�������ٷoO�<�cǎ����{�n��


Y�p!�b˖-�;w�G���[o�`gg����%~m����qQ*�����I�=X�t)���6L����ӽ{�B�>!ʺ���u�V]�!�BQ�ݿ�aÆ�ҥK�8q��CB#�������z��|U�B��ׯ���ә?>C�����uHB�6n�Hzz���B�RO/� �|f�q�F��������U��S-v�����ŋ\�r��W�r��I��������ɓ0���8|}}iӦ��Ǒ#G�<y��_FF�z�"##�ݻwc``@FF=z�B�
l߾�r���y\յ��{����L׮]����ĉ��D���x��r��A�q��U�m�F�z���o���ΎV�Z���@�^�HJJb��ݘ����s��}z��A�:u�����|�&���t���'##C�h��UX*\!D�177���[[[广��v����(q?�
<���`��7n
�z�ܹC߾}�W�۶m+�~E��}P}6�[�NqV��/
���U�V����֭[�?j%$$`gg�رc5jT��*DV���===���qrr^~,�(�I�&����__B!DV�����~�7o�]�v:�HQ͙3�+Vp���<m�"��𤥥aiiɿ��o��b�l����úC!�����T��pq��=\]]�x�ƹ�(�}�6�Z�
��-[�=/_�<���#00���h�t��ѣGINNf̘1J�E^�U177W�vj|��r��?��I�&�^�[���P�]�vMy����Α٩���!��t(���.\`���\�t�������LjժŇ~H�>}�]���[��l���j����e���\�z���*W����ݺu�U�V�=v��4�X
K^�x�8
�~��WΞ=��9�gϞ��_I��]CU�B�����̟?�������3t�P\]]y��!3g�d���/?l����?gРA�?���P*T�@�޽Y�x1����Ɠ��¼y�

%!!SSS���+VTک�5�={�ԩSY�~=�˗g�ĉ|��ܿ�	&�}�v

���e���j;��w��g�2u�T���(W�U�Veɒ%���-������ŋ̞=�͛7s��M

i֬�����O>����T�O����
�����dzh�"@�wOQ4�}ŕ��3����L�255eȐ!:�N�ҧ(VB!�/������Jǎ	

�V�Z�IQL�=�y����O?I"�B�a+V��ӓ������B�t�БI�&1i�$]�!�e�K�Ⱦ;`n�.^���/bffFǎ177�����L��=�|y�������ٱc]�ta�Ν���cgg��qUT���w��vL�W�6����ѧ���F;ձ��+�B��o�����ƾ���ϟ�z�j���4�ݹs�;w�p��L�B�֭_#ڒ�ٳg����v�ѣG������5&LP�Y0?
�=-��f{ IDAT�.^��ƍ�����dڴi4h�@�*'`֬Y���(�}||�_�>AAAJ��ӧOزe���2'Ndݺu�����Ç9u�իW�:fZZ�;wV��->>�p��	v�ޭ��ĉ�*}s�ΥaÆ�\�R����ʏ?����>����s��ܿ���V�Z����s���ӧ��+ϟ={FLL111<z�S�/+���O,\�����Q�zuƌ��8�p� �+###fϞ��ɓ:t(۶m���[-ALQ8�3O!^�T�B��'O�0v�X6m�Č3�5k�ֿG!�J�z��ׯ����s�B耝�ݻwg„	�:uJ�zI!�B�b�/�j�[@@���'..N9���A���133#..�S�Namm��?��F���գ]�v9r����s��!:v쨶�s^�ͫ:u���p��5,--slgjjJ||<۷o�β&&&$&&�������ڹ��d��B!Jmɩ�HTT������kkk�֭ˋ/���cǎ��Ʋl�2�-[����Ϗ��*U����=m۶�f͚<~��3g��ѣG��B�{*�/�/_�e�nݺ��퍧��,\��Ξ=KDD�.k֬��ˋ�3gҴiS"##�W��W���ۛ��]��ڵ�.]����y�&?������:�?�@ll,m۶eժU4k֌+W�0v�X���K@@�ZU�'Np��,,,����9s&�Ǐ��?�ҥKԯ_�E�1g��o�Zc5i҄u���������ٲe666899)U.�&���A~��W:w�̳g�ذa�Ǐg���J…�����g׮]ܸq�gϞQ�N���3jԨ2WHW�}�Y�֭?~�RYg„	�R
K�����,��r�TJ!��t����ܹs����2[qV��ƍ�[�n�;w�>�@��!D�����|�ʕ+�ʁBQĊe…ʱc��֭qqq|����G�Q�F
z���ʕ+Y�`�~�-͛7����̟?_k���=z��Ç���P�q�}������d�,X@�j��&44333�l��ܑuݺu������F�ƍy��!AAAlذ+++V�Z�\L���H||�FbE||��F!�(�T�d!��y�&���0k�,7n�v���KKK<==���!22��.ĸt����ؘ�s���o+��z�->��>��C�M�ơC�������B��.[�n����K9֫W/v���֭[8p��+>�̙�T�1b^^^���1o�<6l�,����͓'O4^�r�J�������accCxxx�	��Û6m��w�^~�X�n�5"((H#	bŊ4o��)S�0s�L�>}��ի��W���+�̙�T�(�X˗/�q�Ɣ+W���{�����:����$''���������ƍcܸqj��qrr���:V\߇�H�ԥ�Q(��S�����GGG]�!�BQj�����ӴiSN�:E���u���ҥM�4��ח�+W�:!�(s7n���+�f�bРAʦvB!�(|�2�S�N�ܹ��3g2s�L��.]��ښ!C��o�>._�̘1c��=z�P���С�k�&))	333>����W#F� 22��g�ҧO�s�G�V>���(Ξ=ː!C��U�XWWW�y���9x� �ϟ��1QU٣C�y�Q!�(����o���9u�iii���ѯ_?�.]
�'j������?s��1<x@����С���(�T�K�,a���\�r���3t�P������ٳY�d	���f�^V�ڽ{77n����z��iӆA�Q�bE�ć�	(y?22���Lz�ꥑl�Հ044Tl�*�'O�����y��!իW�m۶8::R�R�����yPPk׮�رcЪU+�Qu#�����C6m��ɓ'��h۶��ώ*������V-�"���z��}��޽{����Ɵ�{�m��;�y�o"?s�U~��'O��s�N�5k���\�fM��}v��I߾}�\��k]Ki��r^����������F������s|�իWԾ?du��9�c-[�TW�REy����+�����Y�f��
*�����WY�d	#G�dϞ=�ٳ��ݙ2eJ��'�B!�BQ�����W_�l�2&N�Ȓ%K��U�"����pqq��Ãŋcll�됄��qwwgÆ
|��7�Y�F��!���������q���
���044����S�m޼CCC���ppp�z��ҽ{w��ݵ����������GOO�@�敉�	������P�Jhڴ)�-R۹��ؘ�����055�\�rT�Z�N�:�n�:��=z�R�JDGGk����1ݻw�W�B!DI���SfΜɡC�HII!##�7n(�Y���3g�~����������ݻ����p�B��rgϞ͹s��HII!22���\�~=O�<Q*T���(;�����s�ݻǮ]�X�vm�ן����w�e�fn���1q�D���^{jj*�ܹ����+�GDD0s�L���r+7���DEE)s��!<<<HII)�?y�3fp�RRRHOO����,[�Lc�˗/h���TI�/^,P�yQ�9~�}[�׳�˜9r���4Z�h��-Z����ѣG_�ZJ��hʕ+��ח/��s�zs{������d�cFFFZ۾*΂�ehh��k�8p 			о}{RSSqww�_���R]P!�B�T��h�ԩS�:u�T�B!D�$$$бcG���	

b���l!�(��Ç�s6lؠ�P��L266f���Hek!���
U�Ta��Z�eߍ�r��L�>��ӧ����1c�h��8?��Է����˱Ϭ�V����,7�+W���	�ݗ8}�4cǎ�Y�B�z;v�௿��v��L�4��
r�����y��Z��۷s��u7n��ѣ�_�>��'~~~�;w�еkW��ԫW�	&`bbBxx8���?~\�y� }���1o�<�"�Ν;5j�:uBOO��W�2{�l���9W>��w��ȱbC^d�}۶mܾ}[m��_����˹u�[�ne��ԩS|��74k֌��8���IJJbǎJ�����۷���Dݺu�4i
4�ʕ+���h����/�*�N�:�Z^���=ͮ s���V%k��W)Ƚ��9����U
��͕6�X���;F�Ν���iӦ9��A�\�|��7o��;�i|or��ի3b�F��ɓ'���Y�hS�N��ťH�B!�x�/����j����~��LJ͛7����g�}�����f!�B����݋��&&&?~\���BD�j�4h����7N��!D�4h� V�Z�_|�ѣG56�B!��+�	"w���DDD���������2d�G'�BLN���

�ĉ�˄H,--qqq�Ht<v��'O�v���j&L�/� ::Zc������)}��!<<�'O��V�}��Q~��G233���#::���xΟ?��n������-^ۇ*9�y�D�챫��ر�7i҄ѣG3�|�?^�Q�F)��,,,3f����ĉJ������J�F������ѣ�����~���Y ���L���7��(���-������eNnܸ�L�NuL�F��1c�D�V����Q
��k��p�B���X�|9͛7�޽{���,Y��Ν;���B����
COO���L������/�������Q�FѡC��1zzz����!�o���U:<xP��O���၃���M����1caaa9VB!D����ϟϜ9s������ccc]�%�(%ƍG@@���?�u8BQ������퍕�����5J�!	!���$\�@FFF̞=�ɓ'3t�P��.����T�XQ��	!�E��?�4wd׶C��;w�8q�־nݺ�q���Ly\�re���3{������E���V�B���3���	III$&&��+�~s�=����x���j����
4��~������ 11Q9���WŪJZ�kV&&&ܽ{��w�*��Q]_�5
^d�_uߪ�VY#{NA���2'������JuL�F��:u�Ю];�cVVV9��ӧOg�֭=z�֭[���T�?��C��W�c���+�'O��q~�ڵ�]�V�Xjjj�*�!��x���r�R\�������=h� 6m�D`` �Ǐ�atB!�(��߿���3{���ˋ/��B�!	!J+++ڴi����$\!���hт	&��7����@�j�t�BQ�H�E	պukƏϒ%K�0a�Z��qTB!D�e_�Z�����	ڪ8�*yA[5��
�Ϭ"����nݺ�i�3335j�ԩSs�;��[ZZ���ıc�pttTk�Ӝ�*��h[ܯ�����e��ٕ+WNk����j}�&��T�"�8�2���ݻ����'�cbb����u�6ǯ�o� �zvy�U���IuLJ��_~�E�{�ڵqrr���#����z��G���߲e��Z�*�|�	�~�-|�A��W�cLHH���ܺu��5k*�D�X��.ШQ#�����_-B!�"_^�x���{���Ν;`nnN�~����Sk������?���ܽ{��5k�駟2j�(

��%�d}��Ǐ			�M�6J:��u�beeEHHC��J�*oઅBQ������/8t��FBQXƍ���K�.�V�Z�G!ʤ9s�i�&f͚Ųe�t�BQ�H�E	��䄓����B!޸�u���p��e�ŷ�/_�h[�V-���OV�XQh�F�gΜ`޼yT�Z�۷o+�?�5) ��w�֍��(�m�F˖-iԨ��v�ZX�U�ڵIHH�ҥK4o�\9~��%%>===233y��)�*Ur��p����}�>�V���׭[�۷os��EZ�h��z��F��ݻs��!�l�B�֭�_��F��7o�m�6�v�Z���"?s\�
�^�˜T�V�{����c���?Vڔ%ׯ_����xyyi311aǎ����A���������^���5���7�^&��*fdM.377���\y~��uƌ��B!Dq�[��(Z>>>�������tΝ;ǹs�x��	��ٳg���(	��\@@�ϟ���'�d�ݻw��������9kkkN�8��={���/īB!DI��닫�+;v$((H@!������/�g���G!ʤjժ�`�ƍ��ѣi֬��CB!J���jW!��
R-.Y�f
W�^���\�r�5k�h��裏X�l7n��ŋ<|���� ��9s�=~a�y��i��ӹq����������vd�������?�0k�,����y�&��餧�s��mv�ޭ|���*mڴ��Ϗ+W�(�v�ZeQ3�$��۷���4n߾���f����{z��E���h߾}��_U���Ϗ.�s�]���U�&M��OHKKc�̙DDDp��}�?ν{�ؾ};�f�"--��?����{�@�k{O_g��Ra��y��
��j�^uL�F��:~�8aaa�C!�(raaa�o������|�r�;ơC��߱6oެ�

�…4k֌�7r��qBCCiѢ'N�P��ccc�����*Ϗ9h���:�j#�B��+33��C�2q�D���صk�$[!����Çg��չV�BQ�F�I�-�4i��CB!J�p!�B��w��>|������smkgg�ɓ'�r�
_��ڹ
*������Ϗ>��C���ハ���7nТE�V�Jrr2�'O�V�Z�X�"��9�r���믿�m�6eOvu��eԨQ���_�~?~�;w�0c��s�����?�Q��iӆ�{��a�6l��Vi"���zK�=577��O?U�����KLL7o�d�������k]�?v�X���9v��ׯg���m>��#\\\
���4���qQ*�{=/sҪU+bcc�v����jm�]���$Q�899��0�B�"�q�F��BYdee���Y�
[�J�HII!88���8:uꄃ�j�"##X�`����aÆ̞=;;;v�܉��]�㨪:���;�T	��*?
!��l�����cǎj��	!DQsqqa�ҥ�ڵ�޽{�:!�(��Y�|9��ք�����됄B�RA*\!��X


%44T빊+2{�l:w�L�*U(W�
4`�ĉ(m+U��ܹs�ݻ7�j�B__cccڴi����k~a�9b�����X�"4jԈ)S�(x�ڵKiW�vm�IOO/�����1�E�ѣG���ahh���>5jԠM�6L�2��K�Ҽy�W�^�re�ϟOϞ=�Q���O�^��?>���J�aÆacc���1�h�"�d�����V�ZQ�\9jԨ���-�f�*�{j``��9s����jժ`mm�رc��o``���+nnn�nݚ*U����OժU�����͍iӦahhX����3�E�0��I���X�"���5^����J�*)�m�B!�(n�L�B�
�����ˋ�>���������ݺu[[[�����TI�d�<x��*U�h�SS�B!D����.�B�7��‚�]�����P��Lk׮Æ
��Օ��]�#�B�
z�����Ӂj5U7��)��.,,@��k~Bs���ddd������+��0ݽ{�	&P�vm�U#D�5`���l���Q��l޼���p�/_N�ڵHJJ�/�`�����Y�����9^^^���*���9r��#+:���U-�?B!J��>�-韷���������9QU�(ʊ�<z􈨨(~��Μ9��n7a��gYkkk�={�c����8q�~����IOO'&&���ՋWgddЮ];

9z�h�^�(�
��$�B!D~�����������B��q��],,,pqq���u8B!D�W�.�ׯ/�B���P6��g�RRRx���o�f�ʕ���{:�P�_����f͚�رC9�c�jժE�>}t�e��˗��ء��L�:��S�JR�B�b�jժ������Ϗ?����3�=���Sicjj
���ۉ���O�l����5Ω���!�B!�.���bjj��իu�B�i�j�bΜ9xyyq��U]�#�B�x�_�$>��c>�����V!�B��'��g�֮]�ڵk��U�ZU�Y_QrT�X�	&��w�ѷo_8����Q�BG'D��_r��7���������a���dff��g�aaaA�-�x�B!Dn���GBBӧO�W�^4nܘ?���]�ΝY�n���Ѹqc>|HPP6l��ʊU�V/+dffr��-�ׯ@�&MHLL$>>^#�">>^i#�B!��R�|yF��ʕ+�3g����I!ʬ��dzf�\]]�6�B!D�z…�d�B�$33S�!!J��#GbjjJtt4			���cbb‡~���5j��u�B����d�0h� ,--u�������O�>���e7�3c����022z�a
!��rvvf��,\�����kժ��x���DEEq��Y��֮bŊ���*ϫW�΃�߿?���l߾����s��AΟ?��/�����СCa_������	!�ȍ��U'�G�f������O899�:!�(�ʗ/���7]�t!""�޽{�:$!���*����Т�ZQBmܸ��[��:!D)���O�޽��R����X��/
���B������c�
bӦM2~�xF'��8�EŦ���S�|yBCC�����̌:��쬴366&  ��k�r�����\�2�Z���ŅF�)m�M�Ɗ+HLL�ٳg��у�K�Ͱa��b�����ؘ�ݻ��+B�|!�"+���(��~�mlmm��!�бΝ;��舫�+ݺu�B�
�I!�(��,���ѱ��B�P����B!�(s���/V�\ɑ#GHII�A�6�^�z��{��1~~~�߿����S�fM�t�˜1c066V�YYY���'gϞ�B�
t�֍)S�(�^�x���{���Ν;`nnN�~����S�+����X屟�ӦM��‚U�V���J��W]wNc?~����͵�� IDATڴiC�ڵ�6u����ʊ���J�*U�F!�E���[[�W��Z�*S�Ne�ԩ��������F�X�ʕqrr��ߟ���~�m8}�4cǎ�R�J�!D� B����UW�ƍ�{��;w�>�@��!D��d�,--Y�x1�G!�(��u�B!�BQZ=x�ggg"""x��!\�v��3g�}�v�]JJ
��9�6m⯿�"##���D6n�ȨQ�HMM��{�ر�8q���4���������T����v�ZnݺEzz:����;w�y�����===y���Z�Ca^�6�w�&55kkk�s��֤���gϞ|�#�B����ԭ[W�����`LMM2d�#B!�B���ڵ+����:!�(��ׯό3X�p!�n��u8B!D�Td.^WRR��='N� =='''֭[�,|N;p��BCC����]�v0 _c
!�B!�(=֯_Ͻ{����d޼yԬY///�l�B@@}����$..���~��s�ҴiS.\����׮]cݺu�?^��w�y�ٳgS�N���	�������˱��"==��;w�p�B6o���ժYh�ݷaÆ`hhX�ם��G��iӦ���9r{{�|�$��l�ZY�0�3��edd��ٳ�<y2C�`۶mx{{S�b�7�B�6n���u�B����uB�JOOfΜ��ŋ�*�
!�x�\]]	`ڴi����:!���)�	3f��ԩS��{���0��������a���dff��g�aaaA�-t�BQ�l۶���]�!�B�Ç��W_Q�~}��ݕ��(�7o��~�7�|�ĉٿ�F…������	�ѣG�J�*���Bpp0qqqt��	���!C�ly�nm._��L(ɮA�jm�B���u�֌?�%K�0a�Z�j�㨄�"e��lٸq#[�n�uB�����qwwgÆ
�7N��!D�V�B����ӧ�s�κI!�(Q�m��ٳg�u��ddd0{����&v{��)888`jj
@����1caaayB!DIТEI�B�"֫W/�ի��0�m;[����'M�4ɵ]BB�2�"��-[��������jժ�x�B96e��̙CLL111���2r�H�����*�!��z��<x��*U�h�SS�B!��MW�(jNNN899�:!D1�����B�A���p!J��ի3p�@|}}%�B!��޽{ӻwo&M��o��F���v�BQ���_M�B���ХZ�iee���^�v�|�IJJb�ʱA��i�&5v"B!�*ggg���u�B�F�����&Pdg``��8666�k׎��(~��Μ9�ʕ+	

b„	��ۿr��~���T�|���׹n�k���5Ω���
!�B!�B!�޸q�裏8|�0����B�2��ˋ>���+W2i�$]�#�B��2M1뮣mڴ^&fdO�P=		��ӓ�g�R�B�u�Ɣ)S���_������سgw����sss��뇝��F<���,\����(*V�HϞ=�0a*T���DŽ��ЦMj׮���nݺXYY�СC���)�B�5���l۶M�a!D���六����(Vt��u�:u��?�v����9��W�7o����Ӵm�V9~��i��b~U�Z[[[lmm�p����c���xzz�)�";===233y��	���\�vM�]^�[INN���D�\rr��F!�B!Dٔ��Hݺuu�(!�~B�ڴi�������p!��@�ƍquu��Ã��IB!D˄��;v���"--����/^�����?����<==�s��q��9�<y����O�>��G�/�/6n�HFFnnn�޽���T���5Ʋ���ĉ�ٳ�@�Y�B�Ҩ|��xyy�:!�(����]� �����’%KX�`ժU��ۛ��P���زe�:ubݺu,X���s�biiɅ����СC���ׯ			L�>�^�zѸqc���@�:Fff&�nݢ~����Y�zu<x�֭[����Ν;,\���׭m�&M����H||�FbE||��F!�BQr>|����s��a���y��9�kצm۶�1�޽{�:�7BU�/33�P��~�:����۷�+W���c�T�B�ƍ�޽;��9
6,�1ߔ5k��������q���3�r��X�\9�T�B�
�ڵ+&L��w�͵�׽]�Ev/^��ߟp��5�<yB�*U����{��5�
���~�,7n�ƍc�ҥԪUK��!D����ƍ�>}:�֭�u8B!D�P,.�U���;���ٳ�S����p�.���X�|9VVV����s�N.\��͛5.���oBCC155eŊ���p�%��ȑ#4m�Tc,ձ#G�H…B��Ջ^�z�:!�(�$�1b����={�>}���=z����ٙ���s��-F��֮~������ٙ�p�B���V�Z)�UI�����Ԕ�۷��g�N�g�ҥ,]�@��y�nmc�oߞ�r��y�8Ο?,E!D���4(���IJJb����ڵK���۷�}�6?��3�z�bӦMT�ZUQ�\���nnn�������s>��ɓ�<y�E�1q�D-ZD�
tm��3F�!�����y��!�O����ӬX��5k�0d�]�V������/Y�j��{�ĉ�8q�E�1e�,XP�?��E��hРA|����3}�t]�#�e^�J�X�d	�}�...�k�N�!	!���K�P%P��x^,�sssSv�<x0<z�(��*U"%%���`����ԩ888hm����./�G�&$$����+�/_��L��N����B!�B����Ą��@|||8v�iii4jԈ�ÇӵkW�]�*Ud���DEEq��}LLL�ڵ+�G�.�"����S�|yBCC�����̌:��쬴�6m+V� 11�gϞ�ڧ��+���DFF���S��������O?-�uk�G�,]����h�
��ott4���t��=��!���ۺu+[�n�uB!
诿���ښ��8�ի�ԩS���Oy��w)W�7n� ,,�ŋ�s�Nlmmٻw/���㊝����={������8��-[R�zu=zĩS�fÆ
,[��ӧO�{���t���R� {����ߜ;w�e˖�}�v�
F���5���k(iii��ٓ�b``��!Cprr�U�VZ��%K�p��"""�H�mi�k!�;###���իqssC___�!	!D���舯�/_|�Ǐ���B!�+��O(��͕ǪE(�w��jʔ)̙3���bbb�e�ȑ899Q�bE���5R���[�?x�x�@&;�1U!�B���y��k�SOJJbǎ�9s�{��Q�|y�ԩC�6m���O166.�`��Z�>~��WΞ=@����ٳg��&�(;�իǂ^�����M�����6*�v���[[�\�������&Oc1}�t��贵��uk�r��899���OBBo��6			�>}��c�R�R�\�BQ�Ȃ8!�(�F�A\\;vd�֭T�VM�|�&M�1cvvvt�Ё��j�*&N����K777���x�wزe-[�T;_�F
�u�F�nݘ8q"���<x��S��b�
E]6P�vm�v�J׮]���Y�x1cǎ��&�%;WWW<���9aaay�'###�������Q�B��2~�x�-[FDD}���u8B!oooZ�lI@@�F��u8B!D���.�/�PU�(HE���p�����666�k׎��(~��Μ9�ʕ+	

b„	��۫�744̵?՘�2=U���B!Dv�/&66��n޼ɬY�x��r,==��7or��M����;w.5j�(��K��/�q�F~��233�6m
4���uhBQ�9;;App������)C��qtB!tA�L-�(�I�&����:����3�|~��W���/jԨA�.]pww���R�}^���=.66�E�Err2fff8::2c��
>���ٵk�j�"<<\#�"�f͚�p�B\\\X�f�F�ťK����ػw/w�ޥV�Zt��www7n��ueffr��I���k�;FŊ�С3f�࣏>�x�իW��ػw/��FFF���ckk��ɓ�^C~c�M~޿�ׯ��パ��w�I�&��ݺuk"""�裏X�j�&MR{M�9�&����:���Ϭ�Uq�כ�g�J˩S��駟<x�ֱU����e˖-����$''S�Z5ڶm�W_}E�N��5~A��.0w�\����Çi֬s�̡o߾Zc�x�"~~~ɻロkLY�Iooo&N�HÆ
��K`` ��=W�^�Z�jt���5k��^���r��{�%Y�ƍ�޽;+W���!�(&�5k����o����z��I!�(�JE����Z�����طo�ׯ���S#��ULLLHLL$99�s���J!�B��*���u�����S�7oΐ!C033###���8֭[Ǎ7ظqc��-�uU���X�|9666ԪU�nݺ��퍧����hB��I�!@a+���e����g�f���:�m۶���-����
���QǑQ򄅅agg��0�M�>}x��r,11��7��?�L�^��է����������s�X\\�-bϞ=DGGS�re���pqq�ӦÇ���X�������"��'�ׯ租~�w�q5����_�e��2�Q�~
&#Y&��cM��en�Xo�m$�fH�P%F1�ƾDHh�a�-�1����~�sw:�t'�|<zL]�ky�s�s��zoݺ�v��i��ĉ899���d���m�6v��Łh޼�R��ɓ|��$''+e������˚5k8~�8��׿�$��t}�V�^Mff&#F�x�f�F�1d�V�\ɪU�X�`A��e܅�g]���.

����ݝ��H�
�%''���Dll�Z�_�ETT;v� 22�.]�h���Ǟ={�֭�Z�3g�Э[7֭[�u���`2339r�K7[��|N�^���s�j�Y�`�Zf�NDD?��S��!/�5F�w���=z� !![[[}�#��5kaaaxzz����p�B�b���[�nܹs�)S�ЩS'jժ���_@=[FAծ]���Dn޼�����͛J!�B����WY0/�]�r��c�baa���u���믿f�ر�	غu+>T��S�NDEE�u�V\]]��B��>��#<<<X�p!�G��I�&z�J!�>�������0�x�H���ҫW/���7n������űz�j���pss��ŋXYY)�e+�7oS�N`ժUJ��71b/^�`�ȑL�<�*U�p��q�™3g�?>�g��ȑ#t�ܹ@�P�D	��,���������S�u��ܹs�U�W�^��ӓ�����Å�\��F�C��cǎ�?�ƍs��I�ʵk���o��_���ƍ#99�aÆ1i�$�W�NFF'N�`���\�p�Y�f)�^5��
��ݻ�=zh~U\]]Y�r%���ө]Qŭ�<�,+�6o�9�+��e����K���Y�r%M�4��А��8ƍGtt4s��-�F���ǣG�pssS�x{{ckk�o���ĉ5j�ֱ8�󆿾}��r�J~��W�.�N�����}��5�ڵk��?�!22�p��U*V�X�/�����ҥ�>�{~B!�����ח�C�2|�p5j�B�b���b��x{{��ハ��ڵ�,�hѢ$>>^�}||<�Z�*|�B!����Bll,iiiT�Z�nݺ��w��5���ؼy3���<|���e�ҪU+z�쩶�R��c�…�]��+W�`bbB���8p�ډں�9s�L.\H��ՙ1cǏg׮]ܸq�gϞQ�lY�6mJ�~�(Y���6g?��*�eʔ᯿���V6\�XYY)}�����ၥ�%��=���J�{��1v�X*U�����Ns���ʦM�8q��=�lٲ4k֌޽{cnn�q��ׯgժUDGGcbbB�&M�߿�Z
���L6m�ıc���?166�Z�j�iӆO?�4�y+h���T���hР�ک�*T�~��DEEѵkW�F!��M2Q_nnn��V!�B�\��������ɷ�~��;88����K�,a���j�s;~�8^^^L�8Q�w��={F߾}Y�b�RުU+6l�@ӦM����
���֭[�Z�l)))�iӆ-[�(�]կ_�-[�Ю];��ߏ����jݺ�Z��|�	?��m۶�رcjuO�>
���/��}h������4hЀ��e1�ƖSa�˗/+����? !!A�vE���7���UժU���	�			`ݺuj�C7k֌u��Q�V-Ν;W�13?��<�m۶jm7n�Ν;iժǏ���իԫW�@������C�r�S����S2�ԫW���Y�=  ��ӧ�4�Jq~��]add�ȑ#Y�`s���Ȟ%�B?
D@@cƌ��rp�B���˫��N��ۢ�=z���E�:u055������f͚�s�}����>|X���Ç)]�4�۷/�ЅB<}�///:DJJ
ܸqC�l����ϙ5kܿ������O�lق�����mfΜ���y��)))�ٳG-5za�\�v-���J6���0/^�o��Ɠ'Ox��<`ǎj�j��={�T�+$$��/�����o�R��ر#��Ƈd������u��'O�0}�t����믿����_���Rҫ�z�j8��y��!�O�NJJ�R'44�͛7s��=222HKK�ʕ+�\���۷�9wmw��Q��Ҵ��ѨQ#���^�CU!�B!�B��Au��W_}�����;�w�γ�Ǐӯ_?222��Ϙ7o��_������deeq��
���ӧ�.]Z�;Q�g�&M��vP���!�'O`ǎZۏ=Z���? ))I�\��S�N������W�V�~}����s�N�ŖSa?�f���/�?'U���T��iS��u�g]��献T�<{�,�z���;YYYZ
�������2���m۶0y�d�6���J��T�S�L�Ŧ�zN&''k�>}�t��9c��#�5F�w���;���lذAߡ!���X�lG���g!�"�6Å�����ڰQ�z...�������R�J�����ի�s�U�T�Ν;���1b��ӛ�B�j�o���A�J�3f5k��ʕ+,]�����ݶm׮]�V�Z6�jժq��]9�<���W�l`mm��ѣ)_�<[�la˖-�8q��Ç�ϪU����*�'�����7����000��ի̜9S9�*<<\#CCa�o׮���lذ���"""011�v��|���|��J\]�t!**��[�����飏>�i�"##�}���cu��5�-[ƭ[�غu+���j}���2u�T4h����Y�t)���g���J]Շ��z:t�U�V�s�N�t��S�vgΜ�f͚}���(udS�B!�o����`�bbbx��9nnny.-�._�L�ڵ��so����8)w,9���+��Բ8
!^�.ٙM�:�^��Ç��ckkˆ
022R��ʈ�:��e,--y�����:/���jsn��5���j�����>�d�ԩ|��DGG
d���駟ҵkW�t邩�i�ŖSa�ҥK��c?~��R�E�E�9fa��u�u�&�3�Rmr�e�����߈���ĉ������U�������x�6m��M��͵����������=�ޜ��'�h-W�w�ҥ��[q~��]R�bE�������2d���B����3d�&M�����+m�B!�Ez�p�<x0�+WVҺBv�W+++��ȄB��C�>}Ծ�+����?������ؘz��1r�H�~UV�;�5j`hh�￯�6�-C�СC������TY�����٥KeSd��߸q#666>|��Q�l��ɓ|�0�;::�l�2|||pss�~��$$$ĤI���*�K���ٙ��]��.55�K�.aff���es�z�F��<�j�� IDATV�k�fذa�8qB#Vwww5j���1vvv��
U_��~��v��IRR��΄����������Fkkk�>Te9OiB!�B��M����IMM%==��;$��?�����; �XΜ9���'Nd„	,[�L�S����Z����p,,,����lٲuT
�G�Y��й3��6�x����;[��}����/زe�ZV������Y���={R�^=�_�^d��T��������������*S«(Lܺγ���sFW��U��G�>���
...|���ٳ�?��S�13��+��!���r�sR���Ν;@�Z��^�P���rU|9�$�8���=z4����օB藷�7���̝;Wߡ!��N��p�133c�̙�;���':/]��'�B�ݽ{��u몕��޽{@ީ�oݺ�Q�J�
�O�*L��?8��￙?��M^v"Ya�W�Y�&5k֤{��<���[��i�&���?~<]�ve�Ν����4jԈ��8233iԨ��i�/��?��@��S�cu��}�s��X�N��A�����ٳg9{�,7n���?�s�Δ(Q"�/h�Ǐ��SN�2U!D�Jhh���B!D1�Zķb�
>��#�ż���5�rg�Pe�x-^�ӧO�>}:�z�RN9�ѣӦMcӦM����ָ���]$%%���#��I\�x��c�b``����5��9Frr2)))�U�V�:u�]�vѬY��ֿr�
M�6�k׮�_��^���#?~L�r�4ڨN��~Na|���|���ܺu��{�r���9•+W�v�_�5���E[a����s��I~��'���
|����93�攕�����ZYZZZ��
�ͳ���sF�Φ��lp�S��{��F�T�P��u�*
�0�j���#��S�z��}������gm6m���AZ%��U�ym)��#Ļ���ƍ������B�U�X�ٳg3~�x�|N/�B�pQ�>��#<<<X�p!��+?�B!�ț��=U6���9�ޘ���?murӖM���"U�9�[q��u*W�LӦM�Z�*���|��7����
"--�����LLL�֭�6m��ٳJy�2eh߾=���W�^����@��:��l��;�zN�7u���/9���#
6��ɓ�۷�˗/����ׯ�۷��wA۩�%�*�2]�W��3��ݻ�;!�B�a/�l��`aoo������o,����`�߿����R֯_?6l�@pp0z�N�[[[bcc9v�;v,p���4\]]y��	�g����%Ϻ666���O�-^ڷ��+K�,aŊ�7N9)>/?��3IIIj����p��ibbb�С�FU&U��ƣ�jժ��_��_�}�v�v�,�/��
�����˪U�9r$
4P����J�ƍqvv���7�k�&>>�~��~����А��L�<y����ڵkEwN�g]��9�2/^� 00�>�&?�Ӆ1b��5�<�����2s*�|4hЀ#G�p��i���5��;���;.$  ��C�j<'����#((CCC�����ӧi۶�F��܇��8���.���૯�b���yf�B��yxx�رcٵk���B!����u:ssscѢE,Z�H��I!�B�ʕ+p��e���?C�)˗/'<<\�+,,L��O��o����j�<��ŋ"�f͚�޽[k_�l!�?��ڵ+&&&�ܹ���8

iܸ�K�+�J�*p��%�r�Ϫ{��ʕ+Z���R�tiڴiÜ9s�7oݺu#%%��k��SAکNBS���IU�*��	!�B!�<�f��M������̢E��ܹ3t�҅ŋ����ч��=����mۖ�#G��gdd���K�֭i۶-@���S�N�e˖�iӆ3f�����޽{9r$NNNJ.T6��W5���<y²e�pqq�y��t����ӕ:��������v�Ν���3eʔ<cINN&,,��M�*B������i�;KQ�T��Ν�5�Oxx8t��I�|„	�;wN�J��6m��z�j�k���P�F
���?�}��$&&ҷo_���ܾ}��bhhȄ	���>�___��<233���:_5j�����~�M㚶lE[a�>��	&���3:u�Dll�Z�s�����#�/_N���=z4;v�ٳg�k׎֭[��/[�,111�Yܺ�3����tQy��]L�6��~�
[[[�t�o݄��qm����O�>}鸅���?��E�i��������֖������4:t����[111t�ԉ��tF��g�E�i��x���гgO�k��R�����cffƪU���B����X�t){��a�֭�G!�(6$ÅB!�:���lܸ�~�����ԬY�k׮)'������u�V���{�J���IJJb���DFFR�~}f̘��E�g\\͛7��۬X�B)W�F700 ++�{��aee��:u�…����<y�v��aee���Ϲp�k֬Q�̩\�r�mۖݻw���E�ڵ_z�6M�6�Ν;2f�lll�v�����+W�T�+W�(���<-񫯾�����Ӻuk�W�Nbb"��u#����Q�<��ݻ+T�Tr.B?K�.%44T�a!�o��2ቼ���0t�P�_���%&&JLLAAA�����Y�x1���j�
 {�ޖ-[��W�ZE�*Uشi.\�O���_044T�v[�b�Ƣ���D���HJJb��ٯ|����9R��O�

">>???

�2e
gΜ��ח&M�P�re���R�JL�:�_�U��v��ɓ'Z
:::��ݻ5C
!����˗/��ѣt��ooo6lHtt4aaa�Y�ccc����6���,_���
�nݺ�f�5j���S�reƎ���Ǐg̘1|��jmiڴ);v�A��?��;R�Z5�?εk�رc�-�xyy��V?j�(�-[����ѣ�����ڒ���ԩS9p����|��W�<������LJ޽{�����H�%�t钲	$�	�E[a?�>��������8880p�@���G�ƍiڴ)�ϟ��ˋ��@��������1�lْ���Npp0���ܹs��˗�����q�:ϐ}�Jrr2[�l�{��dff晱�M>g򓑑���ɩS����c��ݘ���z��|�˄��			L�0�3fP�B.]�������z���F6��
3Æ
c����޽�޽{3g�lmm�z�*ӦM#:::��|}}�����_qtt�����ߟƍS�L=zDll,��������������M*QQQ��ۗY�fQ�fM.]���ɓ9r�|�Ff��|)�s_�w���C�aŊL�4�Yz�B�9�Z��_�~|��7t�Ё�%K�;$!�B�dÅB!�:�;w�ȑ#ܹsOO�|�v�ޝ�'Or��&O��v�D�<X��Ϗ?��C���營���7nШQ#,--y��1cǎ�bŊ,_�\��?��c\\\���d�Ν�ܹSc,kkk�Q��⢤	ն1� �u�Ɖ'�w��ɈVVV�	i9�)SF�q����cǎ��ݻw'00�U�Vi�~T�^�<�)h�&M�p��)4�S�*W�9B�9nnn����;!��


�����p��)%C�S�׭[��שR�
s�̡nݺ\�p��ӧ�����5k���P�f͚i,؋��gÆ
T�^�u�����vvvl޼�ʕ+�v�Z9t��nÆ
L�2��]�b``����1b��7��Z�~=.\�A�L�:n޼���7111DFFҽ{w,,,�5kxyy�d�����2�X�=
@ݺu5�W�=zT6\�U�R���Pz���޽{i֬�F5j�����u��9J�.�gߪ
~�j����www�͛Ǽy���5oޜ)S���ըQCY�|���<-���ŬY�����}BBB�ݻ7DDD�]/Q�!!!T�^=��?��\�xggg��U�Ta���%��<~�=o�6m��o�e޼y噍B����ߟ9s�`dd��O�6�]�v���@�V���2|��"�[�y���8@�޽���6����LN/۰T�ti~��G��"�L�4��Ç�b�
��.ӧO',,��W�r��I�U��o_��6n��g�}��͛ټy�Z��� ����Q155�_~a���,[��5k�(�fdd�رc�?>%J������1b���j�+W&""Bc1`q}��/ĻhԨQ,Y���۷����p�B����K�:uX�`ӧO�w8B!���q!�BK������,Y��3gҦM,,,022�F�ʇ�&&&J]sss�̙C�Ν�X�"����.]��M�2w��Be)(�>���K)Y�$&&&�����_+��رC�W�R%

y��y��0`���4mڔr��ahh���	5j���,--5b433S�W-��U�R��;w.:tP�.W��:ub�ܹZ?��<y2M�4��Ȉr�����Œ3��v��1j�(>��LLL011�jժt�ޝѣG�OA۵hт�%Kr��i�>N�>�����vB!�����W�zY�6�����ӓ�
bbb‡~�ԩSطo�F�h=yʔ)ԪUSSS���x��S�N�z��(Q����c�ݡC�8y�$���cǎ|���̟?��Q������7vvvQ�fMfΜ	d��ҴiS��܈��e�С�>}WWW�숹]�|@�BD�ߪ�:B�׫S�N���1d��V����	eʔ�}���޽�Q�F�տv��c2��ұcG�{�=LMM�S�s��a���ZOAmР�ϟ'00�:`ee���	%K���Ύ#Fp����*]�v%66�`ee���1VVV4�3g�н{w��CKKK������C�z�033���[[[Əϙ3g4^�26]?###f̘��7���oiժ�˗��Ȉ�%KR�zu:w��…�1c%J�`޼y�l�R�{{{�=���e˖��Ԕf͚�}�v�
Vdqf�����С�J���ؘ��?߹|Sϙ�S�B�9s&			wذa�]��F�Q�D	,--i׮۷og����ⷀ���W��hѢqqq4HiS�~}~��'\]]4�������d�.]�Ĕ)S������###�{�=�5kƴiӸz�*�}�]��-z��́�����ؘ�5k2q�DΟ?���i�/�ϗ�<��x������d^BQ|T�ROOO|||�y��B!�� �sͫNPSu��9��B����P�nݪ�z�/CB�b�gϞddd�d�ƍ��\����OF�M�J��f��9}�4�����ښ�קO�b�{�ƍٲe˖-�R�Jܿ�������GNdŚ��
K�,QN���a���2Dϑ�>���U-r�,�B���z�m������e�B�U
�9\��A[VGGG���9z��"�gϞѢELMM9v�Z�cǎ�m�P���CU����F�*�0n�8.^��s���U�E�<{�,�v���j�K���4h			ԬY����k���888����1?��111!:::�8D�+�O�x{W_�~ݼy___.\��l@B׮]���;;�׺�R�5D^�����Qeڻr�
����G!DϞ=�aÆԫW���Y��!�ze��:V-�B!�(j�
"--
www177��ݻ�^��:u��9·[ZZiii���O@��^�Dݺu�СCl߾]Y��}�v*V�H�.]�������Ԯ]���IOO�C�$%%aii�Ν;���-^}��޽���9~�8����������'����5�Ի� �_&<<��Ǐ�v�%!DA�~�)��#����<���h^�2��l����//^�jժ|��'���P�~�"}-|�"��Ȥ�Z��~Ue�:B!�z��,_�\�a�b��ܜ�O�r��jժ�q}ժU|��Go:4!�;�K�.T�V
/^��p�B�P�D	�-[�g�}��ݻqvv�wHB!����7779I!��U�֭ٽ{7�V�R>�Q�����y�hРA�5jԠM�6z�FJ�,��ѣ�7o���d�����?�yij{!�(
�Ǐ��E�`�$%%���ā�q-^uί\�°a�HMMU���ӹ|�2�/_f۶m�^�Zɜ$��̙3����q�F����۷/vvv4j�Hߡ	!�������߉���Y�fJy\\VVV�=Ն��� ʖ-���ו����VVVܼy�m۶螖/_NBB����…�����7��ۦ|��$&&��cʗ/�v����J!�B��5kƁ�۷/.�Y�f�(Q�7n�j�*,X������mehh�ȑ#�?>s�����L�!	!���ٙ�ݻ3v�XΝ;�����CB!��7\9r��K�u�B�wHxx��CB�������Ν;<�������ҫW/ʕ+���j�ʕ#%%����3bĈ���.�W����Я_?�ի�稄�,��"""���o�Ndd�l���U�|ѢE���ҬY3ƎK͚5�����ŋ,Z��K�.�����ٳ�(���U6=}���ӧӫW/ep�=�6m�6m�څ����k֬��ۛ9s�(�͛@�V��X,��Ѵk׎�ׯ��{���D�r�000 ++�[�nQ�Z5��nӦ
k֬��ӓI�&Q�V-=z��������'  ��'OJ�F���Ã
6ЪU+�6m
�5�ڵk����͛756VܼyS�#�B��âE����O9s��~���u|||prrz�	!����̜9�������B�\/^L�z�X�t)�Ǐ�w8B!�^���[�n�i�&z��]�]!�r�6m�wB�w���!�;w�s��坤Z`��
y�\B��9y�$e˖e���9r����������;�wʹs��;w.����4n�oooz��#G�b����quuU���dž
���C��	!�	̾}��u�C�Q�V�Z5����ɉ��(������Ҹ~��%)[�,>�G�XYY�m۶���_p�Ν;ǀԮ�,Y�q������̙3177g���3s�L���nj3ظq#ZciѢ$>>�&M�����
,B!�x5M�4��,Z��]�v���s*W�L˖-;v,�S�P�}�����_6\!D1�0q�DfϞM����\���CB!޸"�p�R\�	!�'44�����;!�B!���?���ѣ���P�F

D�N��:���2a���씍jO�<a����ٳ�?���
*бcG���155Uk�޽lڴ�K�.���F�
prr���ssse��c�2�2@dd$���t��333:t�@XX���6L�n~����.]ʑ#Gx��)6664��S��ŗ;޼�C�����Y�x1۷o��ؘ>}�0r�H?~���9t�&&&�nݚI�&Q�T)�ς΅j���0/^̹s�(Q��ڵ�믿���,�9���$00�ݻws��=LLL����[�nt��]�˕+�����
*ժUS�=99�.]�P�lY�l٢�M�֭[��у*U�Q��U���	d߾}���_T�P��m�2|�pJ�.�qG���LJ={�`jjJ˖-3f*TP��s?�m���LXXM�6�R�JJy�ʕ���',,��baa�BDa2�XXX�ʕ+9p����˗��O?eذaXZZ��H�M�8���>̋/�U��ƍ�q�F�0a˗/'11���t��(]�4AAA�Z�����s��}J�*E�&M9r$��������0k�,������fҤI̘1�Ν�5��>����Ç3h� ��>L�ҥi߾}̘B!ޔ���%K��5���,��/�x�F�E��͉���y��G!D.S�La�ڵL�<��k��;!��{m.�B!�B���Ç<x0<P�����ŋt��U���ŋINNV����3r�H.\��Թw�AAA������,�_�b�W�V�/11���0����={v�q�2d/��& IDATHؾ};�r...����m�6���100�'����������۷�:�.]R6[�
___�l٢��j�*�T�¦M���LKK�_~��А3fj.F���Ǐ�>7o�Lff&���y����Ǻu딟�?���9�<���j����ݙ;w.Ç���?�e˖4h��>-,,�۷/AAA���8;;+�:@�֭u�=%%��C�r��u�Mbb"����������Z����WNFOKK#**���8֯_�,.��3o�v��ɓ'8::j����HLL�w�gϞZ�B]�!�L�2L�4�I�&����[XX������Õ����eLKKK������<�̝;��s�j����-�R�J�����ի�s�U�T�Ν;���1b����B!����&M����/.��277g������www�`*�����U�B!�B�w�ڵky�����c˖-:t��?���� ��5k���ѣ����s��4h@hh('N� <<�F�Cdd��vÆ
@�i@G��رc�\��>��J�:uJ�Y�qN�<�ݻw����V�Z���agg�ݻw�\����BBB�}�6���M``�ZF�Š��gÆ
;v��#G�'k�y�f�=�,4UmF(�\T�^�-[�p��Q��������\�dٲeDGGs��!�L��ƍ��������Ғ�k�2l�0>��F�Exx��I����ܜ5k֨�����V�;��u�~�:U�TQ�իWcmmMBB��8G�a�ҥDGG���5w��e���J]�?���;z�(u����CU��#���0x�`*W�LHH�R����cdB!�B��l��ф�����;!�Z��ٓ���3f�^�x��p�B�7�������Ԯ][�C��u�V���IJJ��‚�����G��lٲ�Ƕ��
��u
���@�)}���sDB!�5QQQ�o�^�a!��#G�0q�D�U����g��������={�����޴0s�L�w�NTTݻw��������ŋ�ر��W�r��I ;KA~tP6���ѭ[7,X@DDM�6}��{zzҰaC�4i´i�3fL�1�̔)S�� nnn���3�N�J���8p ���J������I��Ƿ������o|��椤����qrr�W�^���Kk}�i�/^�ĉ���r��N�<Ixx8+V��bŊ�)S�^�z�n�:�;���#��ɜ={�R�JѤI�b�}��L�:�����}�����1���
6��ӓѣG��~������]�|@y�s�Q��Z!�o333fΜ�رc8p ��;�ҥK)Y����B!�BW���c�ĉ���E�YW!D����iذ!����5J��!�o�?j����9x���gϞ����޽{����o:ġC�h߾=�f�R[pRc7gΜ��Ϗ�7���E߾}����Q�F�M!�;$##����C!�?�j�{N����޽����T�Unݺ�����			�<`ܸq\�xQ�^VVV���2Nrr2���`ѢE,Z�H�����III�t��j����͛4n�X�<�����9�����666�fff�t�m}ZZZ����o|_�5�f����?~�+V0d�����]4Z�n]�֭�_|Azz:k֬!00����dolٸq#���8::r��1^�xA���16V��e�߹s��d���1S=�srppP�Y����۷_�����ÇXXXh�*S�B�裏���`�…@�I�E�{�B!���effƗ_~�ʕ+�<y2FFF�I!D.u��a̘1L�>�>}�P�|y}�$�B���
�Z>w�\���K�ҥqww�m۶��_�����?~�����ك��	�g�.����拧O�2}�tz�ꅕ�=z�`ڴilڴI�!�BWK�,aɒ%�C!�Pc``�S�ܛ�_�Q"g�
___.^�HժU��O����~���.��8;w�$===�Ϟ=c�ΝY�:l ����[VV�r=�8J�(�����0�6�b�M[��>����888p�"""8{�,����_��ѣGӳgOZ�j�ӧO����R�Jj}���2x�`����ʕ�gϞ�����Ç���"v�CI�M��9羠��[A۩�E��*��O!�Ń��nnn�C�w���$�B�w�ȑ#Y�d	۷o�[�n�G!�^^^���0}�t�����B�F�mÅ�dQ}o:���#**
KKK����N�,W��:u��WWW����ի
6�_��Qpp0������U)�ׯ6l 88=F'��]�v�Z���/���֚��,�����������ի�s�VVVܼy�m۶)��ZpDٲe�~��r=##Cc!|aƉ��`�ҥ8::j\?v�cƌ!22Rc�EnU�V�ڵk�={��?�X)?{��F]���HMMU2gh�6�t��Weii���...\�p��{��v�Z/^�l�[�.���l޼YkmU����O?��ƍ9v�����h�B�������߉���Y�fJy\\��9:w���ę3g��t�m
Ү|��$&&��c���?~��B!��Z�lIxx���B!�(R���8;;���/.��������LJ�C�2l�0���B!Ļ(��"��xyyѶm[�7o΀ؽ{7������<y²e�pqq�y��t���4s���GDD�
R�l�S�r�0`?���F?Ϟ=c֬Y�lْ�m����Ń^:��{INNfѢEt���t���ŋ5N�T�MHH��Ã�-[�駟2o�<�>}�����$  �=zмysZ�n͗_~�֭[5�
�iӦj'qV�\{{{���HNN�:?B!�.T��B�>QQQܽ{W�a�UT�.\Hbb"iii���boo����mڴ��ӓK�.������/���{���9r�F���h��ӹt�ӦMSʓ�����T{��-�ǹz�*/^�>�y��Zcn޼9իW�…\�z5�k߾=���#>>���Ο?ϼy�4�6�lݺ��O�r��u|||��0
3�/�mλu놽�=?��O�<�V�Z����Y'���do�Y�`			������¡C��8q�Z�*+V�[�n�ܹ���$�����{O�؝����ܹsdddp��9�1Җ5c�ܹ��y��������t���
ڮv���6��*S�B!�B!��ѣG�g��\���P�B�aРA4k���f$B!�z�p����T��ݹ}��Rv��%�N��Q7==��#Gr����޽{������9�N�lݺu�1�lْ�K�*�=�4�|�m�@ZZQQQ��ű~�z,--��RRR:t��ɦ������CPP���jmF���������͛������???֭[����9�ϟ�󤦦ҿv��œ'O��z���HLL�w���J!���\\\X�d���B�w�ll�ݗ_~ɞ={8w�]�tQ�6lذ����/8p��ΝS6쫔,Y�q��)?;99���^^^}]�t	GGGʖ-�Ç�ѣVVVl۶���puuU6�f``���+���'22�����y���g�Ν����|���΅��[�l��������e�Jۜ<ooo|||46�4i�D��M�68����7�q�F���W�Θ1c4�
ĦM��#
b���۷�[�n1d��kժU�(��&r?���գo߾j���S�v-Z������k�~N�B!�eG�Q>�B��#Ż�S�NT�^�+V��BQL�|�r���Y�n��wHB!�kU,3\���p��m���	

"::���@��*�ׯ�…4hЀ��PN�8Axx8�5"&&���HN�:��9u����	���U�1����ܿ_�ڑ#GX�t)���amm�ݻwY�~}�c�n�:�_�N�*U��^�z5���$$$�f��6իWg˖-=zTY<��~�-[X�l���:t�)S��-�8z�(u���CU��#�B!��������3���P�n]�ϟO�N�^ھt����憕�FFFXZZ���Ě5k�N�8q"��Θ��ajjJ����7oÇ���ڄ	�R�
FFFJǂ��sv�؁��%�;w�7�.]�`aa��;x��y�������Ņ��{ccc���={6���J�q��ѫW/ʔ)���)���L�>��s�+]漠��y�=���N�:���bjj���
_|��f�Rk?v�X���prr�bŊbjj����F���T2��T�T)������ӧ�*U��ȈJ�*ѯ_?֬Y��@�ŋӲeK����T��
"  @����s*h��>�sss>����Ç)]���aE!����|ɗ|�%�mYYY�%_�%_��
		�?=B�v����5�5k֐����p�B�Q�F>�)S�(�ۅB�w��paoo_��S�N)<==iذ!�}��i�4N�ܳg���X[[P�fMfΜI��݉���{��yƥZ@al��Tdee��7�)S�(�u6l�OOOF�������ȷߜ���~�ԩS�ꫯطo�F�&M�Z�j@��AAAj��������BHHׯ_��ɉ^�zѫW/�~._�do�ȭF�ju�B!��]dmm���w�u��@`ii�7�|�7�|�oy���t��쌳���㘘��w��|cP133S۴���+WN##ǽ{��P��Z�S�LQ6���w^c�R^�9/h�y͹��...�������C�ꪨ�oV�^��5k�c~�eʔaҤIL�4�@�)SF�B���ܿ�x
ҮT�R����z�j�ܹC�*U�s�qqq�1B#ۧ�)<<\�!�Vk֬��CB!�����̙3	

-Pb!��1g���Ù={6.�w8B!�kS,3\ܼy�ƍ��7i�D��[�������/�&����|�Re�P-�˝;w���{!E�F��}�v�}�5Ƈ~�V����w�j����Q�W�V�����}��ה(Q��Ǐ�d����KPPiiij�<|��^����LUG!�o��^�}��O�>�\G�/�9<u����6�~�����/���E2v��Ǜx<_���a�Ν�������Ν;_�?!��Z�n���=?��IIIdffr��
%SA��E�<y���~����9"�<x0�+WV;�3$$+++��ȄB!�B!�>T�P�޽{����P�B�|��̙3��K�r��%}�#�B�6o,�E�U�-�;=3w6	m���e��)%%%��7�޽{�ݻ�/��2�z��A�-"ɝC��аh����@������qvv����ٳg�g����=��={�����LR�!�o���/�N���\�B����q��q��$N�:ũS�pttd���j���B�y�x�"���,Z����,&L�@�5�S���C�ԩS'~��'|||���Q�V�lY����Z�n�|oggG׮]������1s�LƎ�l:���d�ҥ�,YR��	!��$.ī			���M�aQ�\�|�ڵk����Õ����@!��X888p��1��B�<>���@ƌ��ݻ��B�Z��
��Z�*׮]��ٳ|���J�ٳg5�ZYYq��M�mۆ����c��ٓ��(���iժ���u�\�ºu���9�;wN�@p��>���b�����{\����$��T�9��̡LK5����r�!Zh�c�5_9�J6k�v
�F�q��!�IL��ä�HJ���u}�����
���^���z�_﫫��z=_/K.\�@bb��މ���>x�󅓓NNN$''�k�.V�ZE@@�*���ܜ��t���077W;?++KUG!��Vqɩ�r&..CCCH�.]�[�.���=z���H���/�U��ĉ�Շ�LJ$_@^^�}����ԫW�w�}���@d�����M�&Mؾ};�ϟ��4hЀ��~www��A��կ_���,������jժ�Ig������Tm9���u�S!��M&�Q>����>��S��ݫ��ފ�;!!��� ֮]�B�`�С�jՊ:<�8�B]�ҥ���|����p!��XժU	

��ޞu��1x�`]�$�BT��ق������p��q<x@RR,Ш۽{w|||8y�$>�ƍ,Y�kkk<<<Tu�*\�tIU־}{���Knn.���DDDp��U<x@zz:aaa�7��w���{�i}C���WgBB~~~��ݻؾ�֭~~~;v�p��1�u��ۗ<x����kkk֯_Onn.-[��U�V����Ut.^��ц�LW��!�x9
2DVoϭ�'O��������׏��룧�G�:uppp��ח:u���ӧu�eӦMdffҧOUY�>}���dӦM:�L�痞�...�����۷���x�n�ʌ3$��	DEE��~�,Y�L�Q��Re����7�|�7�|����u�B!�x��ݻ��}��]f͚ŠA�������gggfΜ�ݻw�q�B!D�������z���CBQ��]�2z�h�M�Fnn���B!*\���bĈ����\�p�1c�[w̘1�ٳ�cǎ1r�H�cL�2E����)���8;;caa�֭[������c�Ν��O��ݙ5k�����4�l۶-C�-��\]]ٽ{7�.]���M�X�&M4�J���???����W;Vp�Ȯ]��w�^�?������ǁ�%|!�O�͛7	�ȑ#���Ѹqc�����ŋ�U�����_9p�������boo����	�-bժU�>}}}}�~�mF���*~Yۜ;w.�-�iӦ̙3���8���Ο?Ͻ{�055�s��>������*m��Q�q(�}(nrrrX�n�֭[���ҥK���a�cPT��0�/_΁��קS�N�1SSS���2��n��_~�СCܻw�.]�0~�x�1ܽ{7NNN4j�H�8שS�~���Ν;UI�����LJ�q*���ޗGy�e��999DEEѮ];���T�u���7� **�~��Q�V�'�!�B!��y�ܡ�2&�
u���ddd0l�0U�����_

���S��	!��1t�P�M���������u8B!����O�֭��/��u8B!D���ŭ�X�fM���qrr��ĄjժѪU+�/��ի�����T�Zccc�u��ʕ+�ve�6m�5�jժܿ_U^�zu���	������055��������kjԨ�5ހ����V����g�����Ojq�wA�k�&44�!C�P�~}�V�J���>|8+W���ظ���9;;3{�l^�u�W�N���i޼9cƌa޼y�z�{���А��X�6bcc122R�<"�B��ݻw�={6111ܹs�p��y�$�����7o�7o&##�p��56l؀��?�=�8g�ܹ$%%q��=�ܹÎ;X�z���j�*rrr077`͚5��?�����Ç�~�:۷og����^y�/��ơ,���q���e֬YDEEq��
�8l۶�ٳg���W�W�X��={T����0k�,�ܹ��S�����a�̙DGGs�����ٷoK�,��ԩS��&5E��z�ĉr�_���}yT��4c��~����LסC���믿��Z�B!�(L�@����N����#666��Ջ�S��o߾�ҷ��u��Et!22��S�2u�T�Dz!ċ��ի̙3�w�}�
FTT�F���l�����틍�
|��(��Ξ=���'vvv��ٓ�����#~��'���y��qpp`�رj;^|�,�����ȑ#����:�b*�u�wvv6k֬�s��j��5l�kkk֬YCvvv1#.�B��j֬�رc	��G!D16l��ٳ���9����B!*T����1{�l����4����>�)���#���Ewpp����̱֩S�؉�E��-�N�:x{{���]l{E%�h+wrr��ɩ�jժ���+V� 55U�sjj*���L�0Am�c!�B�~��7�^�J����4i����O�&00���L��[�n�ܹs�l��� IDATْq��ѤI�\�Bpp0IIIDGGӳgO�s,--�����ܜ
6�a�<��ɠ<m6nܘ/��R����Vwww�u�F�*U8s�s�����ޭ�<��GI�P��P�8lٲ�˗/��q��9���;.]�ĦM��V�+�#G�0c�ڵkGJJ
���ddd��o���,�Xnݺ���6lȤI�h֬�O�&((H��7o��֠A��UR�E=>
+��t�
�Q��xܖ�&$$��k�i�߼ysUI&B!���O?e�޽��޻w�ٳg�k�.��7oCLL�z�b޼yj��TDߕMBBAAA�]��B�СCiժ��Di!��/33WWW�_��*;{�,�g���Ç����;w���G��������NDD��񄄄h|65a���������#Պ�AAA�$%%���DNN#F�(1�������*��?������V㘭�-����8�L1	!�/���0`���BQ�I�&�|�r�N��ƍu�BQa*e…�����L�>GGG����x�".�cǎ:������ʶm�W%|���caa�ȑ#u�B�]Q��GFF����iժm۶���???���O>Q}H��+�������_bcc5&y��GXXX��a�rrr���>�@�d�z�j
)))���r��E�?<ޑ�8��<J������lc„	�6Z�n͸q�����N�pwwWM�iժ�Ǐ��/�$>>^�fYƲ�h�Bu��ƍc��j}+w4�V��?�
��e��4�3�%���mi�D�Z������2YQ��A~~���B!��u���:���޽{������k�.���pww�G�4hЀ��,���駟رc����ݝ+��ʖ|q��]f͚ŠA�T�3����9s&�֭�f͚:�PQ�V�Z���i۶-_~�%u����o�e�ƍ����V�^MJJ
�5b����iӆ��df͚�ٳgY�r%���jm7mڔ�s�ҠAV�XAHH��Ѫ��
6��w�ammM~~>QQQ����v�ZF���ÇU;Kh{�|��		)s2\i�������@�6m4�U��߿_.�B���7oN�޽����%�B!*9}}}�,YB�޽����y�t�BQ!*e�E�>}X�~=�������355�XYWT��5k2w�\>��F�<^900G'�B�ϕ+W� �} ��!k�ĉZۺt�FY�ƍU_תU�G�=Q��ݣ�n޼�…�V�S�6�����ǣG�x�������S�+��q(�}P*<W�^'hk###�ȶJҾ}{��_�u��J�JeKe�ʤ�±dnnεk׸v�jB�6��333+W��Q�1.��+��F�d���V�1Q�r��� e���x�u��E�-�B���*��&�>K���DEEallLHH͚5S333�O�>���0l�0���4ho����~�BCC���PK�>|8���������OF�<XR��|�ܷo�}�M�4���G���:�|l߾=3f�`�ĉ�޽[�9���[��#		��۪ㆆ�ܹs���pRRR�֭�
bРA���ȑ��y��׭ͩS���	%�)�(�!�/#///���ǩS�4>�BQ�8::���̤I�HJJ�F��I!�xb�2�B�f���9�<��ߧA����۸���y_QzVVVxzz�h�"���N�:�8*!�/���������]81�J�*%�)L�n*�͂�:������BÆ
�ܹ3�7�E�L�:�ض���ڵ���"33S��P׮]S�+��q(*�����h��_�?e�M��Z���6&��e,�ڍ�p?�8��ڵk������~\\��~y�ōqi�}Y��禰Ҍ�2^m�,��k�ۤI��4i���B!D%s��uٷow�ޥy��=�3f��sssY�b;v��ڵkԭ[���www�D܂�&{l޼�ѣG�%[dff�ȑ#	d�ƍ����v��ߏ��?;v�z�����1i�$�֭[l�ڒN���	f���ܸq��u�ңGƏ����F;k֬!  �cǎQ�F
�}�]&O��ڍ�ѣG��������>͛7���j+�fgg�f�:w���aÆX[[�f�F���5��\���ɐ�����ʝ��Լys����ƀ�{�'Of޼y���Ǐ?����...�^\���풔��������G�,S�B!^F�>���*?��K�,�u8B!J���ҦM���[�O���p�B�'V).���pqq���EסK׫�=-���!�x�5lؐ���S�N�GU�m��z��q�����{�իW!�WD�G���/�T}8|��e��j��_�_y�����믿�n��Zu�,�r�R�~}RSS9y��j�'O�P��*U��P(�{�.���@�"�>}�7�xC�͂�l�e,6l��˗9q�:tP��9sF�n�^����a�ƍXYYi�.�e�z��Y��K�,c�4U��Mi���Ą�ׯ����������٪:��7b�"""t�B�̔��* ''www��^'O�T%[t��}<<<HNNV��������	

*6Z�����ؘ���$!!A��…ٺu+yyyDEE���HXX��udiܹs��>�Hm����t"""���'$$D�Ki„	�������_y��j���� V�^�����ORRIII���0b����rss���Ո��֖��x���OX��B��gW���I:(n����yh���������͛9z�(?��aaaxyy����-
.r��}��Orݲ��BQ<===�N��ŋu�B�RhҤ	ӧO��חQ�F��3n!�����	B!�ű��e�ڵ,[���������k�;w�e˖i�}뭷شiK�,ᣏ>�iӦܾ}��~��-[���o0gΜ2�_�m&&&��os��e~��GU��;w�S��*� --
�2�okk�?��Cdd$zzz���abb­[������_O�)��܇�t�ܙ��T����4i͛7�ܹs,_�x������1YYY�ڵ�^�zq��uU=m�.]������еkWU������k֬!88��'ҺukΟ?�j��֭[���@LL�g�f�����`bb�͛79p��ׯ'//;;;^��rů���$c�4U��MiƤY�f\�~�+W�h$V(W�,�J����Oxx���B!����6mڤ�0����\�|KKK���KڴiCRR3g�$##C�nXX��ɴk׎3fмys.^�������lٲ����r7���NWz�W4�طo���t�ܙ'N0s�L�\�BXX���E�]��իIII�Q�F̟?�6mڐ��̬Y�8{�,+W����S휦M�2w�\4h��+		!::Z�p�a����;������'**
֮]�J�ؿ?�}W?e���%�B�L�
���9{�,m۶-����%.\ 11�.]������C�bll���NNN$''�k�.V�ZE@@@��o�����v:{��F��^�6��椧���������1e\�r!��e�����B��g�}Fhh(����y�B��$\!��ӷo_���Gjj�j�GQ��C�8}�4���ڱ5j���Z�+�ͷ�z������

�8~��y:t�J2��O�W���}���ٳ'���=z���0���4�z�w�֭[)���r�ҿ<HZZ3g�T;faa��~���s���ܹ������@m����ԩ�W���y���Uߗe,���G\\.\`�ܹ��]��&�4a����9p��V�bժUu�z�-<<<����Gae㧩"~nJ3&�:u����Z'7('C<�$�{�f��C!�x����_�e�AI�&::��o�:ub�̙L�4I���;��������^{��s�2`������"��\��Z��߂W�L�m���ӧ�v�x��7����ˋ��h���h����3c�&N���ݻ5��V��7b�BBB�}��긡�!w��!<<����u�ƠA�4h�Z;��6m��2�,�$
!�]�ve͚5,Z�???LLL$22�ƍ�q�F�u��ʕ+���c����mۖ��d,X���}���߿?���L�>�>}�вeK���_@sw�B��K�J���Ԕ��L6m���IKK��߿�׭��֭[����ŋ5+�+y�nݺ��!�B!��b``@@@���xxx��5�BQY��B!�EFF�����s�Υ{��Ԯ]��U�ҬY3&N��xjhh����۷/���COO###:w�o�V���6ǎ���-���ӢE&O����}�vU���룧�G~~~�������裏hݺ5�����:t���///�T�R�q(�}(J�Z�������===����ӧ����UF����#FFF���ӡC�"�>��s:u�DժU133��ɉ9s�񡯯ϼy�ptt���}}}lmm�0a������2e
���XYYQ�vm���066���ooo�M�F�������Ǔ���T?7���]�b``����q�������jҚB!�x�('�v��Q��S�Nu/]������֪�$m+�T�~}��Ҋ�����V� ��	�/_.�͢�h߾�Z�r�%�7o�\����1�=R�M�<�5jǷ�~�СC			!//O����Lj׮�ч�LYG��;v,���;v�>�;;;�|�ƍS�suu�I�&�����憍�
nnn\�r�&M����V澕:�������o��Z���󽩩)�����ׯ�6��,^�{{{����fY�[[���;�?�Ѯ�L&'	!�B!�7�W�^L�4��:!��ܞ�噴'�BQZu����?V+�v��-����puu-q��<��?i��j�b���Z�\����V������.z��M�޽K�[\���K{�j_���[�����{��522b���Ŷ��Wڱ�Y�f�bT�ʪ4�k{|�x-����w�%��$?7���5kҷo_6l�@FF�j�ZFF'O�dȐ!���ũS�*dӘ�6m����ǹ}�6�k��?��������Ux���Ç?q�%�r�
aaa��ő�����>���
��Æ
SM}�T�GFF<��;dȐ
�M!���σ�y~,��������8QН;w�=ޱcG���صkcǎ-�ޮ]�T�+�;�2�AO�b�Q*�@QX�U�stt��Ɔ={��y�f�=�?�@XX^^^8P�\m1+��!��g�7ya��愆�ā��ˣE��3��={��ծ]���P�.]ʞ={�q������ٓq�ƕ�oyggg�U�Fdd$)))4n�{{{��#�M���Ozz�jW��L�2===v��ݻw���f֬Yj;n�庵�ݻwo/^Lll,�G�Vk766###z��U��B!�B]�}�������
!�ϋ
O�(�Z�B!��0z�h���pww���CCC�\�Š+x���u��A����OLL����*���~�^�z|�:�N����Oٻw�M��w��g�VM�T�y�&111���ЫW/�͛W�;�"��:}�4�ƍ#''GUv��}N�:ũS�غu++V�кj��.!!��� ֮]�B�`�С�j�J�z�B��7n̹s�8z�(o������ѣu-,,�x�"[�n��¢�}
8���(BCC����E�uN�>��իT;gt��1��턄^}��2�biiɅHLL�K�.����D�r]<����	'''���ٵk�V�"  @�pannNzz:YYY����������#�x�XZZ���Wb�:u���퍷�w���z���\��TGGGK�G͚5�>}��"��溵�]�V-\\\X�b���4j�x�KQbb"&L��а�v�B�d!��dΞ��Z�n͔)S�3gÇ�^�z�I!�(��Y
K!��rpp`��帹�1l�0�N��?�����������}����^^^DGGs��5�]�Ftt4���ԨQC��	Qj{��}�6|}}ٵkFFFL�<�-[�p��A���O���,--ٱc_~�e��y���g����7ߐ��C�.]��� ..�}���l�2^�u���

z�q�“��ݻw�5k�
���KKK����9s&w�ޭ�H���P��`��?΃HJJb��u�w����'O���Çܸq�%K�`mm������r��K�.��ڷoO߾}�����ݝ���^�ʃHOO',,�q��q��]�{�=�	o����8Tx�^���ºu����ǎ�;vLu���%^!�����ښ��ד��K˖-iժ��;�r��/j��,��ݼ��E���JÆ
	W����caa�ȑ#u�B�lݺu�[�N�a!�KK��Ee���C�Z��1c��CB!ʥ�w�طo#F���f�/�B����9777,,,���%55���|���i߾=�
���L�!��>�ʬm۶6���P�N۶mu��Vbb"QQQB�f�T�����ӧ6666���(
ěo������رc��	�&&&T�V��;��燳�3����e��Rhh(6LU6|�p~��BCC����atB��1����.0f̘b�3�={�p��1�I�L�2E����)���8;;caa�֭[��$߻w��;w@@@�F?ݻwg֬YZc033ӈ�m۶:�ľruue���\�tI��R�&M4�J���???����W;֩S'��]�ve�޽?~\����@�>�O��:I;߽(j֬�ܹs��O5j[�l!00G'�%���E�a!�K)""B��J��Ȉ����Q�F1a„���T!�xZ*<�BI&T!
�xB�����G߾}�۷��Cy�U��o����4�wL*��STnW�^�~`���ܹs�f͚1z�h��飪�|888�iӦѪU+~��'rssY�b;v��ڵkԭ[���www�W���׮]�X�n'O�$//��u�ҭ[7<==144T{�Y��r�Ri�ټy3�G�VK�(��̌�#G�ƍU	�>��ߏ��?;v�z�����1i�$�֭�V�p��c���&88�ݻws��
�֭K�=?~<FFF�Y�����;F�5x��w�<y25k�T���ի\�~]�p�ԤIU����|�����a�����K�pvv�Q�Fl޼�L����JO�G�̟�IZZ���4oޜ���3`���]�󲳳Y�f
�;w�~����
bmm͚5k5j�k�F!�G�M�Y�&���Ý;wx��9r$�g�V�=jddDHH˗/'::���jժE�N����E���ӦM��'==����ʫW����?111lܸ���$n߾M�:u���ÀT;j��9s�����̌��{O�}Q}T�vmBCCY�t){���ƍ���ӳgOƍ���q�ƶ ggg�U�Fdd$)))4n�{{{\]]U�z����ŋ���e���jm���bdd��yD!XYY���ɢE�����HXB!�B������駟����_��ڹU!�x<��!�B!��y������+ׯ_W��={�ٳg���C���V?  ���lՄ�������Arr��NZZ!!!?~��� �$���+V�����Κ5k�}�6_|�E�q����G�;���Ύ��@4�-\�P�Rv^^QQQ$&&V�əw��ᣏ>RM�T^sDD��񄄄`hh�v΄	���R��믿���#|||Tu����e���|�����Ѯ];��ڪ]�6C�%$$��;w���:h�SI���J3�AAA�^�ZuN~~>III$%%���Sd{i��?������V�
[[[�����?8p��~��ygff��ٳ�����������:u*S�N-�MGGG��-�988���X�:u�x��2��-�N�:x{{���]l{E%�h+wrr��ɩ�jժ���+V� 55�F����Jbb"&L�})�x6d'�����EV�B<������ ���I�*U��ښ�+W2v�X]�$�B��^�U�B!�B�۪U��~�:m۶eÆ
������Q���^c���}(� IDAT��䈰�0���i׮<x���H:t�@||<[�lQ���/�0}�t����_��ҥK��+=���Ç��/K?׮]��¢�k�W����8�o�>9p�!!!XZZr����Š���իW���B�F�		��X�KKKΞ=�ʕ+5�iڴ)6l`�������V��?���cccV�ZŸq�x�w��㏉��T[�{Ĉj�L����/S�幦��`Æ
|��w8p����O��ڵk��oY�ۿ?mڴ�hCY��#�/���Y�~=�o��ѣG�?�y��бcGG�bruu�aÆ�������ñ��`�ȑ:�L!�B<-�֭cݺu�C!^X�<+�W:t��Ã�?��[�n�:!���^�.N�:E�֭u�Odd$qqq�����B!�BQ	�۷��>��&M���㣶�BA#G��z���w���������㤌�s�2`����0`�x��B��ĉl߾�3g�p��!��	�)K?�d�jՊ�P(�/h��骝�|�M|||���"::OO�b�-H�����Ûo�	@���1c'Nd����y{{��ň#		���m+W�>q��ȑ#$$$p��!"##����W�u��aРA�^�����[[[���9z�(�jբS�Ne�<�T��444�Ν;������B�n�4h�
*v�K{ީS���	%�5k�L��B�h����������_혩�)�Ǐ�Qd/��5k2w�\>��F���-[��@��	!�B��%<<\v�B��$""��ݐ����K"##�3gK�,�u8B!D��4	�~�){��}�[$�OBBAAA�]��B�СCiժ:tx�1	!��͖-[�V�B!�kkk�2�k�+W��:I_91]�ҥK899i���Y��ׯ_gʔ)�8qB������S�~}���HKKS%h�����_������ׯ�/_.6΢�h߾�Z�r%q�Լys�����<z��>ڴiC�6m3f���g�ʕ��_��W_�e֮]Khh(������_<|����~[#1����sM��ɓ'3o�<��∋������
�b'������Lj׮�ц�LYG!^4�d��۷s��y�߿O�
x��qww��PT+++<==Y�h^^^ɎB!�B!���gbb����1�ƍ�]�v�I!�(�K�p�w�^��s��]f͚ŠA������ٙ�3g�n�:j֬�L�B!t��Օ^�z�:!�x�Ibw�T�R�L��n%'Jܹ⫯��ĉ4nܘw�y��͛��o�jIJ�ӱcG���صkcǎ-�]�v��V8	A�p���Wb��Q\�����km���ޞ�w��1A�z�긺���e��̌����lj��U�U��sM�OGGGlllسg�7o��ѣ�������������]��ע�*��� ��===\\\*�*�O{� ]y�^���.�/�u���:!�B�'����ҥK�4i�w��u8B!D�t�p�\Y�E����P2226l��l�����/��������B�g�C�2	X!�N���A���ᅵ={��mۖ�m.^��֭[UI�EQ&���`jj
@JJ��4&旧��Ehh(����h�B���ӧY�z5�8~��1��Ax��W��0KKK.\�@bb"]�tQ�'&&����ڴiÑ#G���_���5�_�x�L,5j�ׯg�ڵ���_���ѵk�2�_�k*�x��䄓�����ڵ�U�VPd�Ei�377'==���,��������R�B!��[�&M<x���B��s�B�Ozz:
6�uB��OOO��[[[֭['�!���*�����{�nnܸAݺu�ѣ�Ǐ���HU��č��'3h+߿?����ر��իcggǤI��[�n��͚5k�ܹ�ڪ�
6��ښ5k�0j�(j׮]��B!�B�v�ʚ5kX�h~~~���Hdd$�7f�ƍŞ߽{wV�\�����޴lْ[�n��?����5?���9��w�%%%�/��BU~��m��̨R�

��K�.ѤI�2�Ӿ}{���˶m�pwwg������sss�_��Ν;Y�lw����Ӛ������y���IJJ����޽{��h���nݺ�r�J����?>m۶%99��w�(����9r�!!!ܹs�?��&M�p��}�9�7�|����իG���Y�~=
�����cbbR��sM������������ӧ-[�����w�(���nݚ��t.^���X�LRiݺu��C!�B<[vvv����:!�ⅳo�>V�Zž}��x�">�~��t�҅�c�ҷo_]��L(w@-i��Ұ���cǎt�ؑ!C�о}�"�=z���HHHH --�֊�=�jժԮ]�f͚ѳgO����\ئ�ƿ"�cE8q�+V� ::��gϒ��C�ڵiժ�z���ݝf͚Ux�˖-��ۛ�7oj�lc$����ƆѣG3m�4��}�9�B!DeS).�ܹ�G}���gzz:������a���p�B�n�
@^^QQQ$&&���������������1[[[�����?�]�R!�x�mٲ�-[��:!��Hcǎeǎ;v�>�@�ظq�J<̘1�ٳ�cǎ1r�H�cL�2E�}�n݈��b���̞=[���'Obkk���)���8;;caa�֭[��������c�Ν��_��ݙ5k���233c̘1jem۶e�С���Y���+�w��ҥK����kҤ�FYit�ޝQ�F���?�v�Z֮]�Q�iӦL�4I�|��Ѭ[�(_���J3�����������Z�N�:Oi��ڵ+{������?~(��!�B�g'""�#F�:!�:"�+^FFcƌa����._���˗���_�ӧ���K��%yY����}�v�o�Ή'ذaC�u�̙��͛�at��Ç�u����$&&�߳l�2��y_Dyyy|����O<z�H�ح[����'>>��2y�d����]|��Ə_am	!*�…y����U-h%�BTF�2�b��դ��ШQ#�ϟO�6mHNNf֬Y�={��+W���Y�
�>Qx�
x�BA`` �;w�ĉ̜9�+W�V!��߿�6m�h��,ۿ�$\!�x!M�2�?�P�a!�KO[��sssBCC	

����ѢEƌCϞ=K<��Ȉ���/_Ntt4ԪU�N�:���A�-Tu?��3<x@ll,>�e˖�9�����ڵk���eڴi|������s���2�P�zu������a�ƍ$%%q��m�ԩ������C����9s�����̌��{www�W����-��j׮Mhh(K�.eϞ=ܸqsssz��ɸq���'�|B�.]X�~=���7nܠZ�j�U��u��Z�j��.�S�k*�x:;;S�Z5"##UQ4n�{{{\]]������ݛŋ��ѣ�ڈ����Ȉ^�z�kL��i1b�6m�uBQ�DFF�:!��PDD��M�\�z[[[RRR���d�ԩ�������T�Z���ϳn�:���+���prrb�ΝT�V)��TZ-Z�`ǎܿ_�0%��1M�6U��<+�����͛7IJJbɒ%lݺ�ѣGcjj��sʋ�T����{��޽{���g�ȑ���ЩS'LMM�}�6G�!<<����E�q��Q�m�V�IEy��Z��Q�
�7o��޸��ѲeK]�$�Bh��^�)J*?|�0����8�|�Mڷoό3�8q"�w�.S"DI�O���|��o��プ�����ϩS���+k��
OYG!�x����agg��0�B�YZZ���WlmI�J���L�:��S��F�ڵ���J[���8::����ʕXP�N/^\lmqj�:u���퍷�w��5�E����`ccSl��=zx�:���^+w������KO'''������-�ҜW�V-\\\X�b���4j����T�0aB��**�e��A����iҤ���O�<?
!��%??_.���cǒ���;�æM�011Q;޺ukfΜɀ���g�޽���OL�8QG?����C`` 111������CNN�G����A�O���>��קgϞ��ٓ�?������	&p��9jԨ����)S��w�^�7oκu��ر��q333�}�]�}�]&N����;v����?׺c������ɲe˘2e
������B!��������$���t_�r�B�+<1�C���m!+Bff&�xRMa�2e!�B!�B<���ܽ{�e˖0j�(G����l۶���pU�Hxx8�9R��	!�v���B!�/��/������իW133�G����жm[��U�T)��«�>|���g����hܸ1�f�̙����Ʋ}�v�իdž
4�-
j׮���xxx�l�2����'O�`�v��ɵkרW��z����G����R(:t��?��```���=3g�䭷��8�̙3|��7�ܹ�����5kҼys�����O�^CYc+NY2�b۶mZ.�mۦ�W\�Ey?e��iS��(�Ǒ#GX�~=#F�(��<~��G6n��?��CVV&&&t�҅�>��nݺ����<&����?>�v��֭[�k׎y��ѯ_?�1�8q���`���رc���j�1YYY�m�6�z�-�8q�ڂ9�

�믿�̙3���УGf͚E�v�4�k�^gQ��2�<�V������уm۶i�#�BTzϪ�Ç��+�\�G�y������/Sl��yT����9<��G�G����e�y�@!�B!�����@�޽INN�U�V���O�!�D͚5�;w.[�l!--���4�l��ܹs100�uxB�U�*U��O�/""B�?�B<��v����T�(IzBQ������o�l�2���_�߿Ozz:XYYU�6k֬����U����a���\�~���|RRRX�p!���ꆅ���ၙ�Y�}�3���X:�V�m�6:u���ի�r�
���\�r�U�VѱcGv��Yd������h���u�[�n��ޞ��=t�VVV,]��s��q��}���8r�s�Υcǎ\�z��b+�I�_�n�044T%V�m�6�ѣ�S�,�,������	��-[�����M׮]�:u*���dff���CnܸATT=z�(Ӫ��yL�رkkk֬Yõk����'!!�����~�


�ѣGxxxPR��R�pss��Ç�X�Bk����777N�8���~�:���X[[W����Y�U���<x0S�L�޽{�G!��P)w�����…$&&ҥKUybb"��*U��P(���Q�Bp���2�w��1���U�'$$����$�������NVV���jDz��Tu�B!�B��ԯ_���,������jժ�Ig������dѢExyyѩS'G%��0`...�C��ΐ!Ct�O��O?e�޽ZoKHH ((��kעP(:t(�Z�R�h/������dРAdgg3e�<==y�WHLLdŊ������‰'��h�A`��̘1��˗��ϟ?τ	x��!|���4jԈ��8���HHH`�…|���۷�ԫiרQ;;;����t�
�ݻw�߿?����lْ3g������͛2d���4l�P�M777��}>��S:v�ȡC��裏8w�_~��Z�”)S���fܸqx{{ӴiS<x������"99�y����?THl���;eb��3g�v	8q�)))���CCç�Y�YQ>��9Rl=�9�o��ҥK�ԩzzz$&&2e�8���/|�A�}��1q��-\\\T��ѢE���>��3>��c�}�ٳx�z�,��ҥKٹs'����g̘���
�/�C��;w�����c˖-�9�3g�P�^�w����)�i�<�[�hmڴa�ƍ6L��!��O(<<\Q�������Jaee���w�}����R899)�=����W=zTѯ_?������o�U��ի����J���?+rss�ΝS�5J�}kkk������ŋ10@�������W9rDѷo_����b�����ԩSVVV����[�Z���o������O?-q̄xޕ��B!�B�����(\\\��^!�xQ�������"�B���<�^���*�s���\E߾}K�,Q�(������}�!
!�3QY���
???������Δ)S�=�t�E�j����>S;���C��8�СC
@ѬY3UY�Z��"++��>�3c���޽���Çj�>|��޽�������C��ݻw+����Z����PܼyS��Ǐ+���e��VPy�_��~���6�G�P(���k����4�/�8Ci��t^A999
@ahhXlM�6UZ��9sFkE�R���W_}�=z��8'??_acc��/����,a$�ݸqC�}Q�Ѯ];���
��_�8E��?�U��B<�s���:!�B+��&h<���4i҄��T��ܰ����͍+W�ФI���Tu�u���ŋ���gȐ!���h�ijj
���3���S;fffƘ1c���aܸq���Ӷm[�Z!�t����Ǐk�W���ۗjl�B!�B!�B!�(
kkk�]�_4���ddd��~:|�p222

�adB!�Q��>q�D��������?�l#++��Ç��c���jL������YF����K�el���D�ɾ�%���IS�H�e~�-R�|-e�K"�H������0C����:Ϸ�9�i!��u]�:�s?�y�sJ:��dһwo.\�v��899i�kiiIvv6W�\Q�=z���a!�D]hh(��Δ)���L�2̜9�}��i=ҤImm۶ 55U�������Ɔ�����/�XӦM���&%%��b˩$^?~��W�v�s��1~a�e�P�O�<ɷߟ�Ivv��
�|��rA��سg3g��8�\�rJ���T�Z�jU�bS�R�
iiiZ�Ϟ=��+�{q������B�
�ׯ_�!!�Z�Z�ELL�ֲ�FFF�����_P�V-ʖ-K�Z����/�U~�����
DժU��קcǎ̞=[�3f��Ԕ�e˒���vlٲet�ܙr��Q�V-����'���%2���aDD�F���

����m�B!�B!�BZa'$$`iiI߾}���ʷoVV�����Ғ���"�S����U��x]�?>�c�fڴiX[[ӱcGF�����sJBI�g`` ӧOg����@dB���������Ύ:еkWF���ݻ5�����r�Jlmm�С���g͚5j���2--��[�ҦMjժ��]�6���lݺ���,BQx			��������hڴ)/^���ƍ��?���ܜ-[�P�lY��.]��?�)��v�B�jQun�vUl����k�U�\@�"���Ǐg�С���affƨQ�عs��z��ƖSI�~u�֥iӦDDD(s~��}�;����ֹ(��3�/�Ç��A$))�={�0{�l���111 ;;[���Pm&ۦM��t��Ak{�J���ݻw�;�O>�ڮ��ܹs�/�W��Y!�B��r�@^�V����3�����X�"...������N氶����:ϱ~���6N�ʕqtt��ˋ��LMMHII!..����+��B!�B!�BQ��4iB�ƍILL$22��]���ĉܸq����k�qT�7�|Ñ#G4�����������Z��3g8s����̙3G�^��9u��V�b۶mdgg���@Æ
iѢEi�&D��Z�
???�ӧO9{�,gϞ��Ç2���&L��,��q������dzj�*�]�sڿ?���t��Q�Xǎ����8��N!Dq�ZE �~6l 00###����V��F��W�077'&&�s��Ѯ];����̤\��-�Q-&�k###���sSU9��ȑ#�Z�*?������_��닯�/
4���ō-��~*666���O���bgg���_233�nQ�f�_U��:��l۶
WWW����5fQ��9�+1�w���ްaCbccIHH�3)C�3g�`aa��x�5����S�(�W��Y!��ga IDATB��W6��M3b����K@@��D���	C�-��B!��ͳ}�vP�a!�/���K;��F^��3p�@~��Gv�ޝo�Ů]����{����*�9����͍�~��Z�j1q�D:u�DժU���ٹs'~~~̜9�
6��G�����#fϞ͠A���h���5k۷o�bŊ��ųs�NV�\���%O�>%$$�mۦ$\������@�f�puu�A�$''���Ntt4���0�����EΟqǎ�q��1�ڎ;&	B�
�\�2���ܻw/���yILLdʔ)������O�&M�#--��4F�.]���a���:%\\�p�6m�п�������ݻ���166�8G�[�j�������Ϲz�*aaaDFFɅ�|�2S�N%88��c+�뗓*�b�޽��ٱw�^��e�_X�����驵=~��D��]MAe�����P~�!���ԫW�5jиqc6l��EyO�ιw�իW�8��ZDz��"66����B%\���ѳgO���VŞW�.^��gQ4'N���ի���-Ю];���J;!�"	/IŊ�;w.S�Laذa�bŊW2�^!�B!^wO�>�/�(�0�B�i[�[�{�f���;v�۷ok�E��ݻ=z�
*Я_�W�/22�������V�Zʱ:u�0y�d*U�Ě5kX�f
k׮-�h5���p��-��}��lٲ���J1:�S�,��E&gU�T�@RRݺucРA4H�_hh(���ԩS����3w�\@HHH�I��ϟ�nݺ��ի��G!ī��ܜ��X~��7����y�?f������?`kk�g�
G||<�:u*�ڃf���]��iӦ)���e׮]����-�oР'O�$::�>}�h�s��	�_I233cԨQ�5
�_�����+��K:���~�u�ܙ*U��o�>���ٿ?�+W�O>y)��L�2dee����������ž��g�X�~=���Ϸ����d���j�nܸ�|����o�0(�{�Y�fDFFr��I���5���w˱cDzd�<==3f͚5�76���8���)S��G�����ɓ���C�=**
��?���q��*?��Y�b�7o.�0�o���K;!���o٢D�n�'''�,Y’%K�4i���B!�B�   ���ly�C�<ޚ�(����ڂ㬬,<==����C�t�ڕQ�F�{�n�OŊ�ׯϞ=cϞ=Z��믿��������8+,,�	&Э[7ڷoϧ�~ʒ%KHOO�9>�;w���?гgO:v�ȬY��Fa����t�R���ĸl�2<x�5���Xz��	��333Y�x1]�v�G�xzz�w8uuu�s��t�ޝ����]��y�99�G�Z6L-�"'&N��QaZ����zz:+W���֖:п֬YCFF��[�n�M�6j�׮]KKK�n�JZZ��1�x]L�:���X�|9x{{k���e���V����T�,.]���8w��к0Vզ�#��ՠZ��`�2335�����Q�`ƌ�9sF�
���ݻ���q,>>===%1�W�����͛888���k�X�d	eʔaƌJ{�޽X�x1YYYj�dee�d� ���^�z�����h�ر�F[I�V��/�r��aeeō7ؼy3�nݢG����uU�Z5���5�y{{���f��?���ܜO?�4߾�ߋT��l�2��G�8nQ���9K�.�Dvv�rNn���L�<�ǏӧO��~������!##��'�Y�c�ҥmϞ=cѢE�T	R��W�W��Y���c���N�Ǜ�B����
�QZ���Q�؄B!��[�b�����B���v��U�V���<��)gϞ��ٳ<|��!C��j�ȑ#�v��
���k׮�X�u��M�n�Jjj*?��N񥥥1z�hRRR������IE��ƌCRR�Z��7o&::ooo*U��vβe�HKK�HpX�x1;w�T�oذSSS�o�NBB�|G�{�R�L���{�x�t��Y�|w,�\�2cƌ)�}f�322�0a�r��|�Yooo���Y�j�����IOO׺x�cǎDGGs��BB�*�g_%]�G��ִoߞ��p���8}�4k֬��ߟI�&)��$hK��I��X�.Ϊ��?��B�.'''V�^ͱc��ӧ���4oޜ�Ǐ�u�V|}})W�����9����^���͛���W���'�f�|||�]�6S�L��Ȉ��(���kF��v���iӦ
���Y�f|��7���333�>}��˗ٷoK�.���̙3Gm��'�r�J>������s��%\]]	�R�JL�<��s��_��ၽ�=���Gǎ100�ܹsJH�]�K2���~y���aǎ̙3Gy�2��E�Ν	

bܸq���`iiIJJ
�W�.R���L���bbbX�j�|��xyyQ�\�˷��̸t�3f��￧F��;w�E��i�&�ߝ;w4�q�V���W_}Ųe�8p����̟?sss.^�ȬY�8~�x��-^��?����ұcG�!Chٲ%U�V�޽{��Ʋy�f��̤[�nZ�*TBBBppp`޼yԯ_�s��1s�L"##��4*c����Ν;0`YYY����Ua���B!D�y�.�B!�B��N�8���۱��/�P�B�j����kK�$�r�J,--y��)!!!xxx�m�6%�A�|��ǜ>}��'O�U]�����ի4nܘ&M��e�\\\�߿?zzz�={�����s|�6m"%%�������
r��YeAR^rW�Pɹ���Ϗ��$LMM�?>�7&!!�ٳgs��%|}}qrrR;�~��x{{k,J���g˖-ԭ[???<==���aÆ�ر�ڵk�q�F֯_�ѣG��t��������ܹ���i�s�[a�0����OBB͚5��Օ
������;���+;�;v�ƍk\G�v��1I���*U�`kk���-			����q�F�-[���MLLHNNfϞ=���z��իs��M�߿O���Վݿ_�#���ajj��͛4haaa�k�N�Ϛ5khѢ��\��{��

�*���‚5k�0v�X.\�…�u����z��)��/^���B�e�2g��͛���{����=AAA�700   ��u�������;���HLL���Z㸩�)?�����(�_^��틞����K�EI���Y�f��~.]�D�.]Ԏ�_��q���{~A�A���lڴ��]����3�ƍc�ڵ��g�f�֭\�x���33�|�U�����۶m�w���ر�;v�������ѣ)[���x����ݻ��3g�r�J|}}��[ٲe�2e
�-ʷ�I`` �Ǐ��|�v��Q�B��֭[��yA^ɿ��('N�P��	!Dq�k׮�w�oI�B!�B�Frtt$  ���B!^�͛7+�o���r�k�ٽR�J<x�����֭�
R*U�4p�@N�>��ݻծ�k�.�s�=Jvv6����۷OY��֞Sxx8���4m��V�Z��w�1e������Çpss�y��|��Ǹ��2y�d:��p1t�P�;����`aa<����ӓ'O����,@6l�ׯW@C��lٲ<{�����v߅����P��ݩS��<Ae�ܹ0���%���Z�ԫWO�����>����\\\�����‚�������+��w�/nnn8;;caa��{��gӦMXZZ���	<_�����իW���5��͛$''k$V$''+}�B�Zlll���cѢE���r��M*U�D۶m���o���R����B�1z�h,,,X�p!Ǐ'==����3d����[���5k�ٳg���c�Ν�>}�۷oS�lY����޽;�&M⣏>�:f������e�…�����?�P�fM���pqqњp[U�T���,Z���� �\��ӧO�W��}�3gΤf͚/,�¾~y111�e˖���ҴiS�+�������رc̛7���>|H˖-�={6���+0�"�r����;�аaC����0a��N�~��W�|�r100�m۶L�:�~��aaa��������)y�(�N�:���	

���Q�F̛7F��Q)QE__��˗3i�$���8x� .\��ÇѨQ#���=z4|�A�����ӨQ#ƌC\\fff8gggjԨ����LJ�'��'O�]�v��OQ�Yߊ+ؼysi�!�x���X�a!^I�B!�B!�B�֙:u*���#**���(֮]��ѣqtt��
�W�^,]��C����J�*UHMM%,,CCCz���}�6ӦM#11Qc̼v���ڵkJb�J˖-�=O[rIn)))��dm׾~���9�d��r.fι��A���+V�8�8�T�V-�]�ƍ7�_���>���<|�Pm���wa�_�3�����X.]��|}��]�����T}�x]�1www<<<���P;֪U+��#GΙ3g:t�Z�
*0m�4�y�jո{�.vvv����g�:u�đ#G���W�.<��h�F-���аaC���t��i�.]������+���"�٤I6mڤs��~���xժUqww��ݽTb+��ߵN�<Y���r�U�V
:�0��+LLÇg���Z�6�aÆ*�¾'���ٸq�F�*1���e���Z+�E��͕���ԫW�}��i=�����Ϣ�d�.!DqT�J��ya	_|�ŋ���5�}���A!�B!�B�Ar'��O�t`mmM���	'((�ӧO�f�����4i�ڮ���������ۇ�����###��?�\-Ac���$&&����'�РA�6mZ这�c�^�Q�܋�G)��ڪ[Zw(S�L�cg��7oεk����L���?5jM�6��ˋ�e��y=m�]��/haMΊ�c�͏�M>�%I���%��Ύr��HRR�>]�taĈJ?CCC���ٰa��֭[T�\�V�Z1a���͕�3f�`���ܼy���z����?�LDD���È�

Kt�k!�B��U�J�x��.\P*�a�Z�n��CB!��(�Of��̰��/��
!��A!�B��Ο?���sNG�e�����Ǔ�����}�vvvt�ܹ��.�"Ԣ�e���Q�{P�����u��eȐ!��ׯH�.	���DEEо}{��B!^�*U�`kk���-			����q�F�-[��p�������i�~������T�V
@Yp����S���ORR���t��QiW��^u����?�$..�v��)�qqq@�������S߾}			!  ���Վgee���Ivv6���S�-
s߅����ٳgO�sW�zun޼����^��ڱ���+}�xݩ~��J�*L�>��ӧ�����kkk��ʕ+��舗�)))���ϫ����1~�x��;B!��hڵkGxx8,Y��v��a``��+Wذa?���ƍ+�H�B!�x1J<�s��%�(D!�B!�x�}��79rD#9�ɓ'̙3���0������G�r��Q����7o^��Iul�ݓ'O�p���=���|��'/=�S�N�j�*�m�Fvv64lؐ-Z��X��m��g�������666XXX��_P�|y��fff�iӆ��h8��hժU��?N�^�HJJ�~P�SSS5��ӧk֬��ݝ~���͛s��y,XP�;��nݺ��닻�;��ϧI�&$$$�p�B�t�R�1tU�<��鑝��իW133�C��jՊ��XF���ɓ�С*T�…�[����(:u�ĠA��t߅���ݻ��닛����XXXp��=���ٴi���xzzШQ#n޼Irr�FbErr��G��#F�w�^pvv   �Z��	!�B��.]JϞ=9u�={��8������ݺu{��	!�x-ܼy�ڵk�vBQd%�p�y�f�RҗB�A���K;!�B!^�#G�hm_�`aaa2v�Xz�����������ӓ��Pʗ/���cK��䞋�w����?¦M�^z�ţG��={6�
Rvƶ��c֬Yl߾��+��x��m0b���������C�X�V���3p�@���Y�x1��b~�nݺœ9s�3g���s�ΩUL��СC	��j�����[Y�_T#F��СC\�z�ѣG�333�h{t��jժq��]���011aϞ=xxx0q�D._������ݻwg������)m�����ȑ#	�̙3�+T���iӔ�:u�ȑ#���k��T�3^f‹x{�U���^��9*V��ܹs�2e
Æ
 88�+VP�B���B!ě�U�V�={��K���~���O�>}J�ڵ�ܹ3S�L�}����o���H6n�Hdd$���<{��Z�jѮ];F�U�ջ_&��z���,�ߋ
��c5֒�Gm�������\�t��bddDÆ
���b�رԫW�D���_pvv����8���U!JZ�'\���K!^S�7of��ݥ�B!��*..����T������.�������}��<���
D���K/හ��13f� $$���ė>����n�b��Jۗ_~ɖ-[�������$����,��\�r������O�.]1b��s�u�F��չs����t��]�Ϸ�~Kff&<{��ʕ+WX�~=۶m�)�B__���׳r�J���x��!�|�	nnn�߿_�����֭[Gxx8w�ܡz����ٓ����*U���u�f̘��ի�y�&���������r�
zzz�oߞ�Ҷm�b�wa����ooo6l��Ç�u��+W�U�VL�0sss�o�޽��矉��`���j׉�����++���f!�
�[���ɉ%K�0iҤ<�B!DѼ��{,_��Tc�Ÿ�mu��-F�ɾ}�4�]�v�k׮�c�lllزe�K���x�<~��o��OOO���Ԏݻw���h���Y�hS�N���]k�ʹ��B��^X…�������5���SI�B!���۷o�b�
"##y��
4`���ʎ�9p������Ehh(���5jԠo߾�;}}}@}�X��1110|��<w�166f�С�X��]�v)	��;vBCC��קs��|���ԨQ#߱s~�������9t�w�ܡF���уq��ahh�q��[��l�2Μ9����z�b�ԩŮ��˜j���"33о�QA����NJ+h֬����y���899�p�B�œ���\�~www:t�֭[iӦ
�j�R�Ԯ]KKK�n�ʰa�022�^�BhҖ�akk������([�l��FFF���k=������h��r�ʸ�����R`���*_�jU���qvvη_^�-n���dmm�����~6L��^��7n��T����ә>}z��ttt��ˋ��LMMHII!..����S�R%��G��zӪ�9::���X�a!�B!D�����ر#IIIԩS��ӧӷo_>��ʖ-˕+Wؾ};�/&$$[[[<H�r/lY�!��7����Ǐ�ӧG��|��:GGGZ�jE�j�HMM%66���6m�Ē%K8}�4{��-Ѥ���Is-�x��)��B!�B����CƎKHH���<}��s��)�9edd0a�6n����y��)7n��ۛ�S�j����ӧ�ڵk��:w���S�4�-Z��={���cRSS			a��Ѥ���z�<x�1cưe����o233�y�&�7of�ر���k�3~�x���y��1���gǎ,[��P��V�9���Ivv6w��Qv�mڴ��q]�I�L����6o��J�ݻw�~�����~��ӵ�vޱcG��ӕ�!��7b�j׮M@@�����	C�-�ȄB!�B�*5jIII|��'���|��74i҄�+���O�F��5k�����G���ӳ����iӦq��4h��'ظq#�{��f͚�+Wcccz�ꅏ�'N��N�:���2s���]!^)oU�����<v��Q�O����5�۷��ʊ�ӧ�Bƶ��T�q�U_��> IDAT���X��!�B!�K��kרS����?~���׫UP�'!!�f͚�y�fN�8A`` -Z� ::���`@}�ؘ��?�����I�1���{��RѹEFF�b�
�?���7u������;vn~~~$%%ajj�ܷ��u���ҥKj�T�֭�Ν;9v��G������T����M�9�OAs�_|mڴ�w��8p��e���W_z�LLL�裏x��qqq����L�2;v�Ǐ@۶m�T�ǎ�q��q��T}�B�X�"s��%88�7np��
����;w.*T(��B!�B��Vrr2�ƍ���LLL2d			Z������-&&{{{j֬���>
4��Ņ�����`߾}ԬY��;w��;��w�f�����_~�8~��9F����)������2r�H.^���}������у�+R�Z5lmm����z�ŋ�0a�����;�кuk�͛ǽ{���S���S�ׯ0?~�����ڵ+իW�\�rԨQ�~��^�۶m�Y�f�����3f̘~�����_�CCCBCCiٲe��nݺ�R�bŊ$%%������I�&�/_��5k���|�������r{�߳B���[S;�o��ȑ#�L�<yœ9sSk���9z�(G���ʊy�桯�_�c�jN�:ŪU�ضm���888аaCZ�hQڡ	!�B!��Jpss�y���jՊY�f��_��


��ݝ:u�P�~}�Νˀ		a��y����P`9gU	]m�t]\\�j͛7��͍I�&q��a���
�_m���������ɓ9t�����133`Ȑ!x{{��FnŝS(���-[��͛3~�x��]���ʊ�g�Cǎ9q����|����ڵ���Hz����{��6i�[��F\���S�#�B�7C�֭qrrR*lM�4�V�Z�rTB!�%gȐ!�޽���B�7���K;�7RDD�~���g�j�;w�dǎ����+VT{�q�Fƌógϔ���$-Zā����r��ʆR&L��ظ��F�IӦMi۶�Z�޽{����ѣGJ���ٸq#���ؽ{7�z��z�'NЭ[7eC�Ǐ�g����Oxx8:tP�������ٓ��4�-##���Xbcc�%**�w�}�Db��E�~*iiit�֍��X��;w�¾}���O?�z���''NT�_�v
ooo�l���ݻ����)��ޣ��YYYL�0�>�@�1Z�h��ѣY�n^^^,X�@��O?�����������<�AW��{V�zk.�9��}�����ahh�رc�ѣ�.���'**
OOOBCC)_�<?��C����%_<z�ٳg3h� e�U;;;f͚���5~�B!�B�׍��
���%''h��m��իW����:ΥK��V�Z�Nƪ�mRRR����o�^�*Q�ڵk������Z�j�_��qN�
���T�@VV�F���ߛ��(�B��D_jj*'N$99��}�j}��:O�z�b���ʵ8���NNN���<xPI�(S�]�v��ݻi��jS�B!ě���GG��C��d��B�]^��������B����lɻ{�.�
"--�iӦ����{�G\\^^^x{{���Hbb�Zsm�f-\�WWW6lؠ�_�r�������3&L��̙3155%**�ѣGs��)-Z��Q����_�~:݃���;wVk�y�&��ѣG|��g,X�.^����AAA|��$$$P�vm�k�=��}���7�вeK~��wƌ��˗���ٻw��wڴi�����W_���Lݺu����ĉL�4����͛ǚ5kJ$��������Ã��X�6mʺu�hժeʔ!..�iӦq��q,X�g���i��ѣ?��͚5���˸���k�.���KΝ;G͚5K�U�7
��,7֭[���&\���Ҿ}{~��gZ�h��˗���f�С\�x��5k*���ھ_r{�߳B��[�%\�0�f�A\\!!!T�Roooe�Hccclllh߾=�&$$�A�);Y�i|||�u��Vھ��K�lق��O�vHB!�B��U�?�i+a[�s�|έe˖ܸq���0F��g?U%Fm�}sW�P%<�)S&߱u�-�B�|������(�;�P�9�R�
�g�fĈ,\��jժ)�'
�{�jժ��̙3g�{�.���k׎jժѲeK"##IOO'!!�-ZP�Z5��-VU[I͵B!�x�|����B�!00��CB!
eݺuܺu777~��G��}���o�###�/_��իՎ�Ŝ9s���o�6Z����ɓ'888�v�Z��K�.lٲ�6mڰi�&%�B�YX�ƍ�|_+W��t�ޝ�;w*�94mڔ�;wҫW/>̪U���W׮]�b��O��_�ѣ����Zߓ'O�x�b�y��gJݺu#00�f͚�,^/nl9��뗗������6kk׮~~~XXXp�̙<�oٲ%���W>�jܸ1;v��ʊ��0֭[ǬY�J�/^�@�&M
u��
�.\�����~ȡC��M��4i®]�����ӓٳgjL�W�=+�x���J�������'vvvt�Ё�]�2j�(��&���Y�r%���t�Ё����f�222�>9w����T�0|�p�d�����:t(�v�ҸΓ'O�7o�;w�G�̙3�۷o8vίU���X�t)����}��|��,[�Lca���K�.���D�Ν�ٳ'.T+���<����u�Vڴi��sj�ڵ���d�֭je��B!��u��Py���8}���9��ʮ0{���z����|�8p �<�=��
.\���о�L�?ڞ:u
@�r�*u���oH���yQv�)���)oN>��C�
Fvv6���j���p�dmmMVV7n��Ç�nR�;w���Ǭ[�N�C�J������Fl�6U!�B!�y����ly�C��[�x�����C�<^�C�ծ��'O�z|�ر����y��>_~�%�����ݛ��?x� �֍�---����ʕ+J�j���a!�D]hh(����>�)S��3g�o�>��O�4I��m۶���>k���!  ����K9ִiS������%[N%����?�$;;[-�BE�9T�u�����il���Ƿ�~�Vu!/E�G�kT�j������}^kFgϞ�$[��|�t������Y!�ۭ�*\�gժU����O�r��YΞ=�Ç2dL�0�����7�&>>�U�V廓�j�L׮]�s�άX�BY��ӢE�سg�?&$$���8����xt��ƌCRR��v��M6o�Ltt4���T�TI����+/?~̎;������
�}���Ozz:;vԈ�cǎDGGs�eQ�B!�B�i����|�2.d���|��$&&j�1�{�����憳�3ܻw6mڄ��%�����?�fggs��U��̀����׏�{�2v�XƍGϞ=�^�:�o������/<z�>}�ТE�,X��y��Y����ݻ��G�عu��
___��ݙ?>M�4!!!A��.]�obuT�9͋.s��1c�JJJ
�ׯgƌʱ��SϞ=Y�d	;v�P.:u�IJe�زe�rM�F�q��M���5+T;X5j�H��B!�B!�x0@mWo!�%g���Z7.E�ZX�FT��ڌ7�?��sss�l�BٲeՎ�6�RU(H�*U�w�iii�^0�;^Ղ��T�ymfnn��V�re@�
���+�F����?~x���gϞ��ߟO?�}}��-��x�t�����Att4'N�P6��/)VۺL�6m����X�E��J�*��B���ݻ����'�hmW�Ϲs�t+�W�=+�x���	;w��������ӧ������m۔Dh֬���4hЀ��d��݉��&88��T�ȹ��?�����{���[�4�EFF�b�
ڴiCbb"�f��������ع���������)��ϧq��$$$0{�l.]�����Fvkݺu�;w.�.^^^x{{s��a%�B�y<v�������رc�p!�B!�xc
2�������矌92߾#G�$<<�3g�(U*T���iӔ�ժU��ݻ���abb�$컹����<Ȳe�X�l��8ݻwϳܮ���F�M�4������s1b���ի�=Z혙��FۋR�9͋.s���+��3~�x�o����]�
3OիW�U�V���ШQ#��dݺuy��v�~����":u�đ#G�����)>>xy�/B�*۾};�˗/�0��Tm߾��CB�
y��]�����޾��B�7�ӧO%ᢄ�����6l�@`` FFFQ�Z5�><t�XannNLL�Ν�]�v:�����VIAU� ��FFF<|�P��
*�4.<���jժ��������_��닯�/
4�ԯ_�Db˩���.�mۆ���چں�k�nU{zzz��(�=6lؐ��X�С�N����[XXh=^�F
��Q�׋�U~�
!�n/-�B�tPP{LL��Y@RRݺucРA4H���|���;u���~��̝;�€�)##@�\Sn��CmY�...Jb���qsscҤI>|Xk���>|x��y���lVWWW&O�̡C�4�����R:d�������uϟ?<_��[�z��!�B!ě�bŊ�_��U�Vq��Q<x@���:t(s��Q۽���ooo6l��Ç�u��+W�U�VL�0Am�3f�z�jn޼��@__�=ʮ]�8{�,���T�Z��>���[�qٲe|���DEEallL�>};v�Z�y�����>>>�[����p�ܹC����ٳ'_}�U�*7Ga�4/��IAZ�j�_|��m�X�t)�V�
?O������h$It�ܙ�[�ҽ{w��޽{���?����ՎEDD`hh�����!�o�ݻw�b!�[�/�(��B!��S�reRSS�w�^��I$&&2e�����I�&y����ƃt�K�.��İ�~�..\�@�6m�߿?������7�ݻ���166�8GU�@U��>��s>��s�^�JXX���DFFr��._��ԩS	.�؊��b������~�!���ԫW�5jиqc6l��y��{|�w
��(�heeEll,����J�P%����S�񒸟����Y!��핬p1u�T�͛GTTQQQ�]��ѣG��訖�v��Ulmm�^��rR�j��ƍܸqCI\�&%%E�[���՞�h��k׮�;v^c�.ֲeK�_��qN�
��U�;r�=�u�޽�/�/'U���B!�B������3g�Zۍ7͝Z�T����ә>}z�״�����:��]�v�7�"/U�V��.���*/V�Zggg����^^Us��W�1�>��i^��eNt���o���o��z}]�	���;;;��3f0c���ʕ+��舗�)))����V���T�R��
!ěL�f8B�6qtt��ѱ��B!�Kr��y5j�ʍHTT�|��$�
!���������o�ѷo_��{��1�&==�~�!�u��|�_\\���t�ԩ�k<��˗�v�Z�M��um_N�v�"55===�1O�<Itt4}���8�ĉJ��dffƨQ�5j���+���'<<���V��OW,��ӓ��ǫS}���n�)SF�ӧOk�<��~�Y�f�P�{;v,K�,��ӓ1c��4N\\��ޔ)SF���ɓ'�ѣ�F��w��k`�U~�
!�n/-�"��Uem���i߾=���q��i֬Y���?�&Mb�@��T��e˖ܸq���0��6aaaJ��rW�P%<h���(r&P�V�|y�뜿(��:��s�Ŭj�v}!�B!�xSt�ڕ��t\\\�����А��d-Zh���%iĈ�ݻ���%�#  �Z��	!D�E<B��_M�ΝK;!�B��o���#G�贱���ԩS�Z��m۶������
6T6&B��Y�>}���e��XYYi�	����}���Ϙ1�3g�`ggǬY���{�������契p�G}Dݺu���?h۶-VVV��������<7g�v�K�,�L�2j?��ݛ�'O�x�b�����fee�d� �J�Q�^=�������iӦj�:v�ѿ$c+��+���Æ
�8�l�2��G�i���d��t颶333��yo8�SQ���ܜɓ'�����Ӈݻw+�v����f��ddd0iҤ<+w,]�T#��ٳg�窪u�*zzzdgg癐�ӫ��B��J&+��R�
���xyy���Lj#HMMU�����={��񈎎�w�v�<�a\�p???�q�̙3j�O�:�|��>W�N�y�`N��{-,]�z��ܿ_�|U���B!�B��lll���G��m�{{{bbb�V��ƍ+�ś�bŊ̝;���`�gpp0s��U�R)�o��۷+����}�v�b�B!�x�9r��ѣG̞=�A�abbB�:u��ŏ=z�Q
!D�srr�jժ;v�>}���Ǐ9|�0�Ǐgذa�+Wwww���`V�^M������+pC�'b``���������ߤ��s��!�ȑ#��Y�~=5j�`߾}4k֌իW���Dff&�=">>��~�	KKKn߾ͬY�ԪL�8###>���			ddd���������T�T�ɓ'{���K���	

��Çdff�Tl�Y��$c+��Wfff�������gϞ��0|�p%�Ν;ZϏ��dȐ!�?���N�:E�>}�����̌1cƼ�{\�x1�z�"%%��;2j�(<ȝ;w������8p��#GҩS'nܸA�n�X�ti��������s�����̙3|��DFF�hT�044`�Νdff�����_����*\�g�}FJJ
...���`aa�_��Wu�޽;��������쌅������ߟM�6aii���'�,��W�*�~�����׏�{�2v�XƍGϞ=�^�:�o������/<z�>}�h��_�`�����?��ٳ�?X�{�V�h;�nݺ��닻�;��ϧI�&$$$(Y�]�tya�بQ#n޼Irr�FbErr��G!�B!�T��Θ���o�>�\�BFF�.:t`�رԪU��Co�֭[���q~ҤI�jժ��B�WG@@��A�BwR�Z!��*�˥Q�A����n�R��E�[�l���''�R�N!���Ԕ͛73h� ���h׮�F�5k֨�����6��k���
���k֬a�ر,\�PY�ҡC\\\���ի�,<�x�b���˖-˜9s�7o�Z�{�G@@����v������֭�g�����

"11kkk�㦦����O/$���~����̸q�X�v-k׮U;6{�l�n��ŋ���ߵ�]�r%C�e˖-j�5k�d׮]CQ�Q__��{�2s�LV�\���/���Z�([�,S�LaѢE�K`` �Ǐ'00P��v��il$ֺuk��ñ��W�T�����Y!���L�1b���xxx���v,�B��#GΙ3g:t�Z�
*0m�4�y�jո{�.vvv����g����x��	dٲej�T�w���ٳ��jll��YڤI
;�=:t��W�jd����i��B�y�ԩG�!>��ٻ�������OO(�a&x�����=��m�l���9�y���Ԕ�%j����ene�&�Xfzg[)!["v�-�ܔ�P�t� ����ϑ�|���>�Ŭ�>k��̠���2K-�������!"""""r�hڴ)F���/���Kkl����>����㏼��$''SPP@׮]�>}�e\���|�l�¡C��t��۷��f���Vk͉#���]����Z�lɣ�>ʂptt�ƍlٲ��r��Z�hA�n�?~<~~~V}�sZZ���-[��x�bz����͛�LZ�U^Ѽ�;??���xluc��;b0���gڴi�Z,*"Ґ�;���t^}�U�����ɉx�%K�0z�h�����W�1����ѣ�W����r�}�Ȓ%Kl.r�۷/'O�d����޽��������f͚����C=�h�� IDAT�����hs�q����W_�z�j>��3~��'�nF�Mhh(�{���<lquu����|��G|��w\�v��]�2~�x��p��w�YlU}��b֬Y�lْ�_�o����-[��`��x�	z�����ټy3&L(u~`` ���s����ƍ����qww��9:88��3�|������O�׿��իWqqq�W�^�=���`��
�8q"�z��g�!==OOO&L�@HH�۷/�>&&�����"))�_���;��C~ϊȝ�n	�-��y��$$$���
@�Ν1bAAA�v���DGG��;�p��a.^�H�֭���b�ܹt����v���lڴ���\�-�������?��?��ɓ\�r�6m���?�???F�Yf�k׮��_$%%���{��3g���P��7sqq!&&���z�#G�p��%���x�G�5k���?��|njúu�HJJb���V}$%%���\�{�|�2AAA���ϖ���,V�X����7n<��3�������ő��Jtt4NNNV}ϙ3���<������q�aaalܸ��۷[�_�v��'Or��I�^�J```��]�����*��[�y�r�
�.U���Mjj*���TD�vӳgO���*�?��O��1bD�o~ܲeKf͚ŬY��5f�>}x��w+ݾ��*�oӦ
DDD�%���~U�{����V�M�6�iӦ���ĉ�vx�n5�c���m�R�����/��Tۮ]���'�ج+k�
�=+"w������/����suueѢE,Z���v>>>6��19rd��eiӦ
�֭��ضNڴiCHH!!!�WV�����<��[��h4ENN�:u ''���t�̙S��ӧOӫW/��S��loU�v�%!!����ʤI��e\��l۶����>}����/Ӿ}{^�u>��C���-�۷o';;�N�:�j�*z��ͩS�X�|9YYYlݺ�y��Y�ݥK��ù�{���"::�Ç[.v��
��
0\�v�����Ν;	������}��Gtt��M@kk�e����`�n����d%\�����H����H�Dǎ������������ԩS�����������H���/T�.���8��ĉlܸ�%K��x�b6l�@zz�����`0X�ׅcǎ�d�<==qrr",,���4>��CK�ÇF�~�hѢ���g�ҥ:t�T�!!!xzzҲeK���+W,��]��ƒ�����HKKc�޽���ԩUN��ʼm9}�4�{Bɭ�v�j�FDDDDD�1j�;\H�rtt$<<��޲��޽{Y�~=�Z��st""""""UG\\����F��ѣ��8���EQQ˗/'  www���Y�l�v���ѱ^�)���*ܥ.''����[�8Ъ��u���򳫫+7nܰ�-X���+W���BJJ
o��&�����J��0'8TUe�m��˗pqq)Ug.3�i��p!�
b޼y�Y��������e�DDDDDD��������a���H=3�
���ZLL/^䩧���M�2���{����͛g��DDDD��n�N��{�&Mjt��	�jѢE���0t�P�9�G}��_�o���;�?>&L�p��v�0�L�1KJJJ��d��s�6mZ��\V��UDDDDD�!S�E55�?��F�F�����!C�0d�{�!"""
L~~>[�l�СC\�t�������3{�l���-��Z�us���ʓ�����$11��s�=G���ke����<��x֮]KFF-[���Ge��V;QEbb"?���۷���g�̙V����󉏏g��t��RޱcG���L�6��]qEDDDD��=��ÿ��o����ӧO��<<<����IOO���1==���[U�����닯�/�N���>c۶m�]��R	�jҤ	&���W�Z>�dee�jW�y����Fnn.yyy���Y����Yڈ��H�f2�����ݔN?id


x�gx����������%..��3gRXXX����۷���b�\����	�ʕ+�:NM̙3���T�������>`�ڵ�����Ν˶m�8�<׮]�…DGG�`����8p���B���K����Maa!��y������eذa�Y����\���y��0<�䓖v�F� ""���~��7222X�z5#F�����Ǐ�`0��SXXH�=�ٳ'`{w�s��U�g�v�سgEEEdggY�y��W�^�={�T��2s��H	""""""�(���ѤI:t�С�>�_r��}�v����ԩ���?~���(<<<���b�֭U���]&���J�:q��1֯_���lj����Ã��ϳcǎZ�&�t���ݻINN&88�Ç[�w���S��۷/qqq|��$$$0`�RSSٻw��mrr2�{�.5����FDDDD�^�~�i���������3Ç'!!�Y�fY����INN���:���`Ο?�����*������d�ȑ<�������eigN��gܸq�iNY�n#F�`ҤI�m۶��5�9Y#33�T���$��������.��;��z�����w"""R�C�����,�aaa��������t�R�}�Y:ļy�j-���P�n���#,,����s���Z�&BBB��� 00���h�8��������}��Gxx8~~~�߿�r
v��i�$�[u��ժ�����P��ĕ���FLL7n���ӽ{wf̘�#�<bi���BLLo��G��ҥK�����#�0k�,\]]�<���?͛7'!!���l:w�̈#,��/fӦM���RRRRn�.�iӦ$&&RTT��``���<���՚���njúu�HJJb���V�&%%�����ѣ��|�������.�,�b׮]uյ�ܦ����ԕ!C�0d�{�!"""
XNN�{�������ku��C�Z=0`?��C��Sݺu��l^0v��
Kٹs��y~VV���˗/�/L�����FDDDDĞ<<<�����]�6m		!$$��ve%��*���-������J����Hhh(�����̼m�ݺuk�F#QQQ���ЩS'��X���̙3''�r�iHv�ڥ�x���H��Y�ŤI��k�R���;[T�N�7'��d2ѤI�
�,{��ͭ�~7�Ӵi�Z�&Z�ha��<��q��������g.�5������4|AAA|������ZPbccqwwg�ԩv�ND�j�]����"""R%��pa41��ݭ����������H�yxx�ߓ��n�3Vzz:��&M�`2��z�*��΀�n����aI8q���{o��S����9{�,���z~lqss#77���<��ܬ����,mDDDDD*r�utm�Jb�Xstt$<<���iӦ�w�^֯_O�V����H����k�0DDD�6S�	ǎc����ݭ�4"			�ADDDDDDDD�0�F�b�֭DDD�j�*���éS�X�z5#F���m׮�/_fϞ=L�0�.Y�Os�Ĺs����{�WX�j��8y�$�3�VǩK=�[�n%,,���z��/��Ž;x��w1l޼�^�z����ٳgK%V�={��FDDDDDnO�
b޼y�Y��������e�DD�f���;v��a�H#��s�1|�p{�!"���.Ν;Ǯ]��8qbmw-"��]�v�;�Cq��!Ν;Gpp�U����U٨Q�ؽ{7�֭cݺux{{��Ӝ0���;�����u�]̘1ê}�>}�<yr��e���w�1cG�!##��S�ZյjՊ�Z6��G����Yj�Uff&`��"""""R�D�p�F�F�����/��BkE��v�څ������zT�	f�����*..���@{�!""""""""�Ty�\\\���᭷��ȑ#\�t	777y�f͚������…iڴ)���a0X�|9�?��U��/fӦM���RRRbU�v�Z^|�ERRR�뮻x�ǘ9s&�:N]rvv&::�w�y�Çs��EZ�n���s�Υ{�cƌaݺu$%%1}�t�~���pvvf������������-F����X{�!"��&M��;�gu�p!""""""""""Ґ�iӆ��BBB�m���Hhh(���V�&t������S�X�]+�j�����ve�g���ՕE��hѢr�hݺ5F����(rrr�ԩ999���3g����*������������HC����������������/((��;Z�%266www�N�j��DDDDDDDDDDDD����������ի�LHH %%��C�2iҤZ[DDDDDDDDDD�v���Hxx8�?�<ӦM`�޽�_��V�Z�9:�O�v�E��CD�Qڵk��Ch�.^��رci۶-�~�)?��~~~t�Ё����;��.�k���Z�)""u�N�x�8z�h��M�i�'N�`�ƍ�ܹ����ɓ�ٳ'���EDDDDDDDDDDnW�
b޼y�Y��������e�DDDD���ٳ�={��;�*�����zܷo_��Ԑ��z��[�:ED����	G���>���X�|9������ϲe�صk����������������^����h4b4������؉�d�w"""�RV…��.�k�tl����`�����>|�����ŋ<��S��)S���{�üy��������������������M�4��!����B�`^�x�-[��e���
6�aÆ�f��D�:ED�>4�.nܸ��-[8x� .\�E�t�֍������X_�ܚ���g��k�.���[���i߾=�F�b޼y899Y��e�/^LϞ=�.�n�3??���xL�,m:v�` >>�iӦ���R�ϊ���������������Hök�.&N�h�HDD'����㏼��$''SPP@׮]�>}:cǎ�j���ϖ-[8t��.]�}��<���̞=gggK;���x֮]KFF-[���Ge����j�^��:�͛7�yCn[�ͻ����SDD�K�L�ظq#۷o�<�v�'O���ɓ\�z����2�}��7����*���%>>�+W���K/Yխ]����|��pou�
�.U���Mjj*d„	������������������H���h�w""�R\\\���j�����a4�ҥ|����̘1��={W�q\�|��� ~��gKYVV+V���7����y����-�rss���#55���h�M���̙C^^���|�ܸq���0�f�5�*��&�E�:ED��4�w��޽�}+��Ǐ��
�Ν;�Ǵ�4���{���P�������[o�@RRR����>���y饗��399�޽{�:�\fn#""""""""""�/00�&M��С����������T,33��}��|\׶m���?�L�>}ؽ{7��9O>�$��іv۷o';;�N�:���lj����Ã��,�n�Z��.]��{�n���	���Ö����4�yfm�[�:ED���m����u*�<--
'''


���%;;�Q�F@@@@��|���L&���>��Μ9×_~	���y��S����Pn��O�~��U׮]�ڈ���������H�JHH�w"��!C��;�͜`q����|\׎;��%K��� ,,̲��9Q",,�~��п�.]ʳ�>ˡC��7o��9!!!�>����ʕ+�����4��:L[*;o[��SDD�K�%\TłX�r%)))�����o��h�U�V���?�p�B���Ru&��T��?��\�|�Ru�2s�s�>}�^�z٬KHH %%��C�2iҤ�MDD*p�
�_{�5^{�5��U�V�j�*�R�:Ԧ�������YNN�{���h��ͺu�f�����7nX�j�^Ӭ2�0m��mѺN�/��pq�ņ�B��E���C��ȑ#|��G|��׼���ر����3a„2�y���o�ܹ3�ӟ�֭���X+�Ui�r�iӦ���eږ[DDDDDDDDD�nhA�H����b4�����H���/p��Q��_N�8�ƍٹs'&��ɓ'ӳgO`�HED�!��Û(nբE�rǩ�zM���a�L&˘%%%��k2o����R�����___���ؾ};AAA\�r��kז{������,X��q��Y���oU����
����Ru�2s�}����L&:tT���u��Q��EEE,_�����������ߟe˖QTTT�Q��HY���زe}��%--�
6���EZZ��K��sYYY���� ==ݪ���ݽZ�Ww�fỶW�^��ٚ[e�m��u��H}i�	�Ǐ�`0��SXXH�=�ٳ'`;��ܹs��8~�8%%%|��,[��R~�ʕrǶէy���gϖjo.�ΖV""""""""""""""""w"����`�wu&&&��/��SOYʦL��ŋ����cd""r���L�[��ða�X�f
�����k�a0x��'-�F�@DD���oddd�z�jF�Q�kc��ڵk��={(**";;����j�[�:EDĞd�EPP����9�|���0�Q3������,�+V���ۛ�S����rη�~[�ض�4��n������:*""""""""""""""""R?nܸ��͛��d�ȑ<����ٳ�T���B6l؀��/>� �ƍ�7ޠ�����愑�H��󉏏g��t��Ҧcǎ�����ϯÙ��HU4�����~777222������IHH`֬Y�vAAAxzz���Cpp0C�%88�������Ippp�Ǯ�zͲ��q�[��#F0i�$ڶm[�yk]���ؓ�.��f��ߟ+V�?��֭3f�`�ʕ�v�/�S�N4k���vɒ%�����舃���?�W�f����ܹ�ܸl�9f����HJJ*�>))	gggF�]��ADDDDDDDDDDn_�O���8��\���X�h�-��q\DDDD��ظq#���Ν�ڵkr��I^~�ebcc-�JJJ�;w.۶m��\�v�.͂�q�F��8p���B���K�y{{SXX��k}~""R=�&X��z\��܈�����Z�hA�޽y��W;v�����111L�4�:ЬY3:t�)Sغu+���U�&�5˲p�BhӦ
x{{�|��j�[�:EDĞ��;��������[n|||��\\\�����ޜt���a��֭[c4���"''�N�:���Czz:s���ɩ�9����������H���/p���2�o��Ʃi,'N�`�ƍ�ܹ����ɓ�ٳ'�C�"""""��޽�
6`0�v����'22��;w��;8u�}��e�ҥt�֍�g�Ajj*{����Ϗ��4K����������ݻT���d&L�P����ٿ���O?��.qxxx����fmڴ!$$����rە�]�����,kGGGBCC	

��}e�u�""bO
6ᢡ	

��?&66�r����;S�N�st""""""""""Rߎ=j�qn�㴭E^�@QQ˗/'  www�#.[��]�v���X�q����H�W�l����5�����ƒ��ͨQ�   ��]bb"xxxp�}���������ϯ�q̻�u�ҥT]׮]�ڈ��H�i]����%\T���#���<���L�6
��{��~�zZ�je��DDDDDDDDDD�������.^��SO=e)�2e
�111̛7ώщ�����n���\����RRRx��7	�h4Z��8w�@�w����*w�˗/���R��\fn#""����kJ�eU��u��H}P�E4�y��f��ϟ�����������g˖-:t�K�.Ѿ}{~�afϞ�����]Y�7��v[����DFF������Ç�瞣}���2NUEbb"?���۷���g�̙888Ɓx饗;v���3b�0 IDAT���o,[��G}�O?��f,������3x�`:t�`iӱcG���L�6��b3�s�k������0t�P�9�G}��_�o���;�?>&L�d2��OAAA��M�4�iӦ���e�6"""R3Z�)""uM	Ud41��CDDDDDDDDDD�����g�y���lKYnn.qqq������S���ꫯ�o�>���ٿ?����رWW�Z�"%%%̝;�S�NY�.\�@tt4���lܸ��M�ʉ'x�����cǎ���I�X�t�U���8@aa!��ޥ꼽�IMM����k"""""���ꊯ�/����:u��>��m۶�v�Z�5���;gϞe߾}���Wy777rss������ͪ.//��FDDn/ډ��ҺN�K�S�EDDDDDDDDDD��۷���M�N�������DEE���AVV[�n�R7��=--��܏;���9~�8���xxxp��yv��Q��Tdǎ�:u��}��_|ABB 55��{�����ʕ+�z�*+V��ƍ���\�z���p\]]ˌ%99�޽{��\fn#""""bO�Ǐ�`0��SXXH�=�ٳ'-Z���{衇��w����o�~�:�.]��+���s�Zښw�8w�W�^�={�T�2siؔp!""""""""""�%��`u�W~��a�S����E���ߟ�K�p�СZ�-44oooZ�hA�~�����$&&AϞ=i֬��w����߿��v���F���+�y�����SO��;��ӧ�ҥK���]�Z����� "##9r$>���Z�����nƌt�ڕ���N�ʐ!C3f�.�Z�b�…���ڵ��ߟq��0l�0233K�`.1bD�PDDDDDDj[s{ """"""""""R�rrr�߿�U���8�|��7t�P���~��q*b�ˮ������,������/���ɓ�w�}���w�c\�|�}��[���mDDDDD̪�{[m�y��$$$���
@�Ν1b�%��ٙ��h�y�>�ŋiݺ5^^^̝;��ݻ[�.^��M�6���KII	cƌaݺu$%%1}�t����pvvf���0c��:K�0o�(""""""""""Rn]�e�͢*�nܸQf��d�|�m^8UY͛[�n�i��O�d���L�r�

j<�9v[s3��o""""�P������|3WWW-ZĢE��m��ハ��UY�֭1�DEE���C�N������ә3gNNN՟���T[\\qqq�CDDDn#��p1|�pj�[�j�����'==�!C�X����pww��5i����իWqvvJ�Q���K��'���{ku�����s��Y���g5Dzlڴ���,���éS�ظqc��������%//777����<K�;IPP�1���������;S�N�st""w��{???{�!"����1�H�W�vS"""""""""""�̨Q���� ##��~����V�^
��#,m۵k��={(**";;����R}�wm8w�\��W^y���L~��7N�8ADDcƌ��q*��CƷ�~��׹t���_1̝;���/�$..�����_~�e�������gϖ�\fn#""""R��P'G}stt$<<��{�r��.\��޽{	�U�V��������TO��pq��1k�[iDL&��C�;LPP��ܹs[�yzzZ��5�ݻw�n�:֭[���w�>۵k��˗���ݝ}��Y���.f̘aվO�>L�<�VǩȌ38r���۪U+.\@~~>���899��K/Ѽys��Ù2e
/��";w�����f,Æ
��ѣdff���e5Fff&`��"""""r�4h���c͚5̟?��5���ԟ���g�0D�����h4�;�'��pa��"r���8%d��������H�IKK+���Ņ���z�-�9¥K�pss�Ga֬Y���Z�.\���M����HQQ���˗��[��x�b6m�Dnn.%%%Vuk׮��_$%%���{��3g���P��T��ٙ��h�y�>�ŋiݺ5^^^̝;��ݻɏ?��ʕ+�����Ã��^|�E"##y�Wl�2f�֭[GRRӧO�?))	gggF�]��EDDD��U�u���h4j1��Hb4����w"r3�,"w�:K�iHڴiCHH!!!�stt$44���P��[~������S�X�]+�r��ι���+�-bѢEe�y�Wx�WJ�?��<����Һuk�F#QQQ���ЩS'rrrHOOgΜ9899�������������HC���w_|��Ν�w"�@yzz2d�{�!""U��Lll�%�%66www�N�j���v��"�7]ߋ���������L	vv��iz�����NHH %%��C�2iҤ�MDDDDD����g�0D��Җ�""�GGG���y���6m{��e����j������N�Dno�����9%\��/��ѣG����c�8q��7�s�NL&�'O�gϞ0�����K.DĖ��@{� ""�4h� �͛ǚ5k�?>^^^v�J}~�=�^���DDD�LkEDDj�.���ѣ
n좢"�/_N@@�������l�2v�څ��c}�)"""""""""r[��
v�ш�h�w""""bG			�ADDD�A�ڢ���ŋyꩧ,eS�L��#&&�y���1:i����Ν;g�0D�N<==2d����ۄ>?�4l����'�;�1@㽱�����TM�N����y�7HNN�����]�2}�tƎk�.??�-[�p��!.]�D���y�ᇙ={6��Ζv����x֮]KFF-[���Ge�����7n�e�<ȅhѢݺuc���Y�u��iii���l���ŋ�ٳ'�7o.�"�VyE�.k�|���<x0:t���ر#����x�M����K�^�
�_����8{�!"vb4����w"""r�����M�"""""UW�5�f���DEE����O?�D���y��Ǚ9s&�����ԦF�pq��e������-eYYY�X���ׯ3n�8


x�g��ζ����%..���T���qrr��{Μ9���P\\�|��7`�ƍl߾��ڵk�<y��'Or��U+��ڵ���[]���m9p����x{{���&55��2a„*�$"""""RZ�!rg��$""""�����I�"w���@� ""R�]sXRR�ܹs9uꔥ����&33��7Ҵi�2��A��k�	۶m���O�>���˴oߞ�_�?����hK�����ΦS�N�Z��޽{s��)�/_NVV[�n-�EV�.]�{�!**���h>lI�ؽ{76l�`0p��5���Odd$;w�$00�j7[[��w�}DGG[2Nks�e����@�޽K�k.KNN�Ŕ���������Ի��@���c�0DDDDD�			�ADD�W�5�;v��ԩS��ۗ�K�ҭ[7Ξ=KDD����ݻ???��E�6��رc,Y�OOO���,If����������t�R�}�Y:T*�"$$��g`` ���\�r�R���DAA���dgg3j�(�t�S�N�r�T~޶�>}�=��V]�v�j#"""""""""R_&N�h�Dn['N���@DDD�.�z]DDnw�Ą��m�X��Tv�abb"xxx���9<<???��ߏ��_��h����H��K…�����8�<�z�*�]NN�{���h��ͺu�f�����7nX�,X�ʕ+III!%%�7�|���`�F#�Z��T�拗���m�|�2...���e�6"""""""w���\:v�h�0DD�x�c���������4f�]sx��9|}}m����U�8Z#(""RuM�@]iҤI�ο9��V-Z�(w>��V�XA���)..�7�`�ر|�����-L&��璒�R�5���ܦMK�-�e5}^EDDDDD�cǎ1k�,z��-[��s������;�zӤI�:���7߰x�b
D�6mh޼9�ڵcȐ!,[������x��mn�
u7��2�o�0??�
bŊ������""����t��Q�g�_c����w�fm�Qգ�b��9�R��PWs����4����P�5�7�������z�����T^��pQ���s�=���&++�>}�����Ã����t�b)OOO��ݽZ㻺���닯�/�N���>c۶m�]��	&T��&M�`2��z�*��΀�l����777rss������ͪμ8��r�;�ŋ�1c�|�I��~��~��>���c���{�YvI��)..�^`��ͥn���/����Jjj*���*, ""��&	55{��Z�>]�~�_~����������]�v���B�6m���H����a4���mgҤI�A�g�9��DDDDD�ʬ9tww��ٳ�۷�Zk�FPDD���%���
F||<k֬!""��m۲~�z�ܹ3~�!�F�b�֭DDD�j�*���éS�X�z5#F�����Ǐ'''���PƎK�=����
���d2q��9<==��]�v\�|�={�0a�.\�@ddd��mk�^�z����ٳgK]4�={��FDDDDDD����ۛ��l<<<X�h�?�8��{/͚5��c׮]���k�߿___>��S�7o��kUqq1�=�G��E�L�:�ш���ڵ�ʕ+|��W������f����k>���ZM�(KEw��/��~�:?��#���

��o�eժU�Y����Ԟ�'2q�D{�!"Re��P7ʺ&7߉��\����DDDDD�ʮ9|衇غu+aaa���УG~��v���ヒ�``��̀����Ԗ�B5O?�4nnnddd��?���Ç�����Y�,킂����$''���`�Jpp0�ϟ��ӓ���*�@dd$#G��$,,///K�v�����ϸq���sԨQ�[��#F0i�$ڶm[�y�{ذadff���\V����駟&;;�?��O���^�O�>8::���@�^�X�l���i۶-G��|�-[�p!G��[�n|��l۶�1c�p��wӼys��.}�Qbbb��/��� 11����/���5k�������ܹ��݀�����?}v���{HDDDD����3fеkW222�:u*C�a̘1��jՊ�Z�j����H�h�	nnn�����ニ�-Z��w�޼�꫌;����Ņ��&M�D�h֬:t`ʔ)lݺ�Z����b�
��?����ݺucƌ�\���n���t�ԉf͚QRRRn�.$  �6m�����7˗/���m�=f����HJJ*�oRR��Ό=��χ�����Hm8{�,�g���ӓ�-[���N`` �N��پI�&�JKKc�ĉ�}�ݖ�r���X�KJJ�O>���f���6����k١���.U���D�N�ppp�S�N̘1�3gΔ;/�/����~GGGڵk���/���6�;s�s�Υ{��lْ�m�2h� V�\�/��b��V���~�|�
[�l��ٙ��DXn߃
��l�~�z�����o~�bbb�ӧ-Z����f��ɥ��p���{���P}���5t�Prss����*����""���ӧ�����0z�h�,YBVVV�Ɠ����E�X�h���N鳃����~v����b^�uF����͛7�}��<��9r���w��I߾}qpp�s��<��3u>��|�z]DDDD�r���HKK��1+����ٙ��h�F#���4k�WWWF��֭[�v��A�Zb����X����Xn/o����`0�~��K�?�`2���~ێ�Ic�/DDDD��h4��Fc��o��矛\]]M@��U�V��?���9���|8::Z�ߺu��Y�f6�8�TPP`i;{�l`Z�|y��[\\lJJJ2���V���krtt�9f�֭M���e�+%%�ԪU�R�988�����[����jrqq)��ڵ�)77��b�UU_�%K����ŋ+���͙3���.]j3��^{�f-[�4�۷�T{[Gys��׳��my���-�qU�(���^g���{ "w�[��nѢE�A��;ӠA��=F�i:{�l����W_�F�a:��)''�4|�pӉ'�e�;��d2U�zA�Jϫ1v�����\�b���*snM�4��\pko��f����k�=T�ߍʖ�L����Eק�i��H�4���D�j�R=AAAt�ؑ��XKYll,���L�:Վ������ȝ��������…9s�EEE?~��3gRRR��h�…V�L�RGDD����wޱ���w�1g��_��ܹs���())���?�{��8q�W_}��رc<����C˖->|8����\�z�)���?~<������dff2~�x�^�ʤI�l�L��?αcǸz�*G��[�n������/[�]�p!���̚5�3g�PRRBaa!��O�>|���VwG�il7���g�����_��_�ɓ'�駟ڬ_�t)C�%%%���b������˯���ԩS�駟����cv�{�,��zV��_�̙3����e�*�QU�=i��=j����ʘ��Fjj*}���իV�Du�����˗���;����l�2����||�s�Ý�١*"##�ꫯ����9v�������ƒ>��d�W^)�������_��S�N��ORTTĔ)S,�'j{�����������LkEDD���5�c}Ewת�!5���f6l�����ϛ�
f��?�aﰤ�""""bV�;
EDD�SXX����[ov��qS���M�iɒ%Vu!!!&�4y��R�}�嗥vhݺ�	0���;fy�.]jL=���Vuׯ_7=��C6�����ܹsK�y��!`j۶�U��n����J����iL��ͪ�m���._�l�\�t���q����TXXX�|^z�
�SV]}��7�W�cԨQ����
�P��z��t�1��j�!��|G|;�q��ӠA�L>>>uǦM�L�6��㏖�.�lڴiS������SCR��}v��>;�R�ul�.]L�Ϳy�9s��������4]�vͪ�ƍ�Gy��V�ZU's���Pu�۪|&0������4$�}}ژ�;j��H�5���D�j�Å�2h� �͛ǚ5kX�f
��������a��������?��g��Y?s�L<XfyyyL�2��~��1cưz�j�z����+u��`�d2��w�Y��wbvvv��L�%&&BӦ�ϛ6m�_��>����ϟ?�T�<��+W��;w��رc�����������d2���Sk�ݬ:��9�6m�T��\]]��ϷY�|�r��n��9���׳2���9r$o��6����jժ�}TEm�����5����`૯���f�ܹ����B6���{tT���O�@$S�؀�A-喱�-ڂH5��&�`"Ap!"���-��T���1	"�D.-��r
�����x� �K
�����1�L����$�_ke��g����Lf�w���,]������KO=���/_���"�cܺuK+V�P\\�z��GyD�=��6l���N�6�\����~[��կԳgO=��Z�x��^�Z�V�M�6�n�I%��;��~�5k���Vhh���u��2�LZ�fM�}7�)�w��'O���fs�����>I��;3gΔ���S����~��Hro<Q�s���!�u�1G��W^��X�V#�G�f��f��a��9"I
���?���r�=���:y�:t���������'NH��t��VL!!!�����+W�x�(�t���N����֡C�2ew�u��� K�1c��{�9�ݻW{��t{"�/~�=��Sz��'Xc��T��/((HW�^�������T�D�����.�~�aIұc��n���|?K��l���?^/��>��c�i�F��銈�p�$��&>�PW/^�+W�8&�iH�b� IDAT„	��2I:s�RSS����e˖9&/[�L�V�rԻq�>�Ç���@����{��U�3Fyyy���g�*==]���JMMUPPP��Z��'OJ�Z�lY�ݽ�~��
ջw�21���[���ںu���V�@E;�yc������?��eggk���:x��kW\}�I?�'�=Zi�U9ǚ�"_jFC���A��.^�ݻ��W�>PFF�����q�F�hѢL��ݽc�}’'􋋋�^���\ބ���`IRAA���<� ))I�ׯw�3���i�ʕ2d�z�!���Ս����QQQ��4��999������V�Z�,�?��=Q��+>>>��{������OG�U\\�nܸQ�㺫��S�K�ڵӞ={4�|I��իu��u��I���ڿ�222ԵkWeggkӦM�}ׯ_/IZ�t���ݫ]�v��W_�$�]�V��x�Z��׫V�R^^�"""�����{�*%%E���:q�V�\Y������XG��k��&I�ի�c�'1�s-$iϞ=��|�L,�2{��;�ycO�]�V�۷W������w����w�}W�qCy充���*�XC��@ձ����w^����-��V��͛7��{��Q���K�����ի��CU؆���'�����_�e˖JHHp��']�t��>��5�c��_����/t��)���j��ю�
_}���L�R+�U�0`�$)##ãs��̔$���p�����~>͛7�����,OHH�>��#���*;;[�gϮtWw�~��G�V�s
�a2��~*+�������geeI�,X���(����]�v�;w�$i˖-����;X,edd���СCe�Z+]�}�vI�̙3չsg�K�.�1c�$i۶me��N��]��={jԨQ:r�BBB4f̘*���8~��$�M�6e�j۶�S��;�ycO����g�Q^^�x�͞=[)))ڸq�����J����DUα&������c��������ͣ��_��g�yF����7o�bbbʭ۾}{IRnn�[�~�g$I��wt��'�|�˗/��ǧL����.�ٿ�S����{N))):~��6o�,IڱcG��V��o�ر���ӊ+�~O<���T���j���.�|��.���'I�ҥ��1�f��J�>}4i�$I�[o�UnL����Y�՝x���+�ڬ���`��ow��iIRLL��„��XI҉'u�L��F�i߾}z�w4b������P-??_R��[�n��o���Fc-������
4Hiii
�R��^��/J�aRvI�2{��;�ycO���뒤+V��ѣ�?�F�����'�ܺu��rYn��S�N��P�s���!�u��k�Ç��C���w�<1h� ����믿����y(����#F�'�p���iӔ�����8͚5��6}�Q<xP)))�ӧ�Ӷ��\��?U�6mt��II��~�3
0@YYY1b�֭[��si_��-Z$___M�6�Q����/�Лo���:&�K�'�,Z�HR�Ok�D۶mu��)����'?��Ӷ޽{��_��U��С�^|�E���{4h�6l�P���%egg+66VEEE�4i������z�ǜ�n޼������!C�8m����fӭ[����+u�~��w���֭[�3g�襗^���7�	W�ԢE]�pA���z��G�����z�^U?�P]V��鵽�(]^R�'FH���SR�;�8P={�Ԏ;�q�F:tH˗/��ի5iҤ2}�;ʛ�[�XK��z��U��^{��/����b�p�<a_�6jԨ2�/^�ڵk.�ȱh�"�����;���Xo��$U�PǮ*�XC������u��
���H�?�"22RÆ
���h�
�<6q�D5k�L{��ѠA������ׯk���?~�F�%-X���ϦM���s��Z�jU���^x�5j�Hiii�1c����[j۶m���&%%9퓜��V�Z����:u��_yyy*..ֵkה�����zK&�I�ϟ׬Y�����/(88X۷oW\\��9���"9rDqqqڱc������/V��9R��<++K*..Vnn��f���pj#������oꗿ�����ջwo=��s��_��.���X�ϟ�֭[����>}��̙3�߿��~��rcٲe�F��cǎ���H999z��'�{�n�w�}e��a����U\\����r�]��;BBB��[oI������2u���+Iz���{�n]�~]_}���N���˗{�^U�g��'<l޼YV���O黶���(&&F)))Z�j�u��e�ɺ����K��T���K>i��b���1�s-Z�l)I�t�R���e�:@u1v�3���t{�ͷ�~��7o�����}�Y��I�p��w�ޭ��x?~\EEE:p�
�}��)22Rcƌ��s����:p[�=���چ
�ww[5Y,[
����;��l����r_���?��֤I�$�?˗/w�]nݒ?%����|||\��ի��ڵke�:|���ﯰ
???ۜ9s\�צM�l�5r�_�F�l�|�I�}\�^�K�.�|�rc�����<y��b����c�2e���ϯ�k��K/ٮ_�^�5��Ȱ�hѢ��[�����ٯ���͸:׺z?��Ϯ_�~6I�{��VPP����m�7vorr��mW�}����A��b����<��Ѷ��h��-]��m{��lG���Ο?o{��wm��Ѷ���;����آ��m������[QQ��/��-::���Q�d2٢��m�N�*�NLL��СC�7n�:d{ꩧl��Ѷw�y�Fc��z��I��^��S�ڢ��m_|�E�����[tt��W^q;Fx���'o�I����w���c��qK�̞=��[����V�^�r�{���w\M�cu����nU�#��&��B}��6���'\P���j�������5k�L�֭[��/8�ꫯ<nc���ڹs��x�	5o�\���z���k�i���jܸq�}:u�Ç+99Y�
RXX�ԸqcEEEi���:p��͛�ͧ�zJ��ߕ�����0���+,,L�>��8���X��Õ���ݻW��?=��CjҤ����աC���+:p�ڴiSk�y����w�ѱc��ꫯ�d2)$$D~~~j޼�z��Y�f����}�]5jԨ�8�
�;v�d2���_�ڵ�o~�>|X?��O��OKKӠA�t�]w���_��{o�ǯ�����������_k�…N�L&���٣���h�B����ѣ����?jܸq�U�������m�*''G			�ѣ��q}��Gjܸ�^~�eG���DI�…��#��W�^�9s�$�{��z-Z��$���驧�r����|�=Z={���ѣ��7�(22�̓��kUx��עO�>�����2�����W����;TO};�cܸq���յkW5j�H!!!��/�?��?�fϞ-IZ�b����㕑���zH���{��/�СCN�{�u��"_���f�٪s���t����-��̔$U�k�P||�$�b��|
�$I�=��\����b��lv��*L&�$�j���v��e}�ھ}�Ν;���Kݻwׄ	ԡC���6mRFF����$I?��կ_?%&&*88X��u�V����:{���7o�O?�T�t��%����v�ء.�e˖��/~�q��)$$��c��8�q7Fw�EAA��x�	u��Q�����q����S[�lQPP��1�3��y�k�@����$>>^����mP�233�ݿ��uIB�J��@]�h�AHH��N���S�Vz������TXg�8p`��f͚i���>}z����BOc�ܻw�u��f�RRR������IR~~�<���dz�Ԋ=z�ƍF���6l�"##�@-�����}��o߾5h`��?�I�ű��b�(,,L			G�ɓ'k���F��9_�
W�&M4w�\mڴIgΜљ3g�i�&͝;W�76:<�rU�	����ĉ�h�"IҤI�Խ{w���.@�f�ٌH2��2��F��6_��6,�(����������X��P�2335l�0��Pdff*  ��0x	��w"�@CÂ�W�qㆆnt�KmذA6l0:^���.��`8��"��bt�K�l6�C�E?�
.�[�d�v��mtҷo_M�<��0x1�bT��ɓշo_�è1��F~�����ؿ�233��233��~����233��*�����ӧ��F1~��=�p�
f�Y���0Ա��x�CPOX,��f����C���D~���'\�‚�R���ʜ;wN�V���׿�U_��bcc�-[��W8~��:v��umgddh߾}���={j���u���~p׮]ڰa�rssu��e�?�����Էo�o�d2I��Vk��]��P�?T��������+I��O~��S�N���M^y��ܹӐɕ�}�-[�Lk׮��fӈ#��]��y�Ԇ���?�3g�>��3���^�v�Ү]�4`�͛7O���5ڶ�!�?T�������Ly���t;w��]��ٳgk�С
Sxx����4k�,]�v����v��������ԴiSM�2E�6m����u�V͟?_��������~��m�j�z����C�?��Xp�J&���j�*IRrr�L&�֬Y#IZ�t�L&��a�iii:wy�G�ȑ#u��9����!��F:x�l٢���\�R			
�����n
<X+W���w߭-[�(''��xk����������v�~���/_�={���իj۶��}�Y
<ةޕ+W����m۶�…jժ�{�1=���jڴ���}�ך5k�x�b���Q�F��/�)S��I�&��[�n)99Y[�nՙ3g�����駟Vll�ӱJ�n�Z�'''kڴi���Ҋ+��䪼��.��+W�h͚5z���ӺukDŽ�Q�F)88س7�jp�_�+,,TJJ������wߩU�Vz�'4v�XJ*�ܸq�$��g�U۶m]�r��w+!!AK�,�'�|�Ν;;gϞ=Z�p������}�j���jժU�m��ύ�O���N�������d����_�l6�M�6��㏕�����$EEE)==���x�u��yGى'4g�ݼySO=��$��ի3f�����Ξ=���tegg+55UAAAN�?~�.]�$I�~��>��cݺuK3gΔ$-[��qw^I�q�>�Ç���@���ƿx�b]�r�i�RM��+�~��
ջw�2�z����lmݺUC��(&���~���H&LБ#GuϜ9���T���jٲe�-��ч�$=��#�ӷo_-Y�D(����6o�,�v��e�<xP�W�VHH���ld~B>�����Ԇ�^ 77W�ԩS'��kۇ~����롇���k�.��׿�$���:�Z�Jyyy���Pjj���ݫ������ĉZ�re�c�i�F�ׯמ={4z�hI����ׯ_/IZ�t���ݫ]�v��W_�$�]�V��e�Vk�;϶k�N{�����k���k{Ϟ=��|��q�e�:�w�UIZ�z��9�N�:)==]���WFF��v���lmڴIR���w�}'I
�0�{�W�t�ܹ2�v�ޭ%K�h�޽JMMUxx�����^��¶K3*?��`���&������~򓟸|]�v��-I��o~���Hi�̙�Z���O���fΜ�Ν;+  @]�tь3$I۶m+s��ӧ+22R�5r�m���ˎ�;�Z,edd���СCe�Z�=+�������Z;oW�?.���ڶm�T��0�LN?��ۯfeeI�,X���(����]�v�;w�$i˖-�TTT$I��6���%����ݻ�Թsg���KN�v���	������$\��}��}bЛo�)�ɤ���/���^{�������7�H�:v�Xa���|IR�.]�ʻu��t��ڷo�=$$D�t��-Gٔ)SԨQ#�۷O��F����T]�~����<��y�r��EIRppp�m�2{ꊻ���ӧ%I111N�6bcc%I'N������PIҙ3g*�g��K�ٳ���]�J�����
�Y^F�'��k�?@m`�����%'@�Pa;ԟ��g͙3G]�t��׵|�r
<X��[�wwڒwӶ߉��ꜷ}__߲��`/��u@��V��OE����8Q�իW+�n�,��g�UXϾ�^���Oǰ���֪����|w*����7c��+Y�V%''K�:u�$�ժ�K�J��w��rrem�я~$��Y���K�<�TnV��CBB����Z�J����|��/^\���'*8�\�����J˖-%I�.]*��^f�@]r�_��ٛ7o.�p�j�*;;��6�"IJKK+����/�j�*Ir<9�������$�w�}n��mF�'��k�nc�5�����+�)W��B�>}$I�-�ٳgu��u���2�L����׿I҂������b����7ސ$����㶟~�i�L&�[�N�������%��mO�>]�1[�h!Iڰa��]����<-\������;J�N�:U�2{ꊻ�꣏>*I�9s��;��7o�…z�d2�4a�G]W�`�.]�_�J���;v�����ߪ��XgϞ��ի5n�8]�vM�
R׮]����+77W���:p�,X Iz���+l�4#������i��W��0a��SVV�rrr��O:m7n����Dm۶M�O���ѣ��EFF�)sGbb�,X�����Խ{w��-Z��ŋ���0m޼��c���_�ׯ׻ᆱw�}W�Իw�2��=oWm���G;w�Tnn�S���aU&�P�IIIڱc�rrr����T�q��z�����gΜ����?��_��ŋ������>�ٳg�����VRR�S�C=�#FT�v�s6*?!�?0~���.^�����N��B˖-�����*88Xz����^�v�VZZ�����P���)44T#G��ʕ+�q�qqq�3g�x�*00P�۷WRR��͛�7m�4EDD���OEEE��_�СCլY3�w��.'{�{ޮ�~�����?���q?��s5m�T�zP��*���r���jӦM���*�٬��0���)$$D����ʕ+��^^��j����ׯ��7o.___�h�B�<�/^���zK�5r��ŋշo_���+44T�>��V�X����J�.���|F`���j���f���/I�X,._��[�b�RRR�a�EDDH��������k�رGo��W|||d�Xd6�]�n�L&�$��h��!�
��D����}�p�y@C�.@�KLLT�֭�&�X,���)!!���@]!�.�/x+����w��i
���FhҤ��Ν��^zI�F��$mڴIK�,Q�ƍ
���x+�އ�ފ�VDGGk�ĉZ�h�$iҤI�޽��Q��D>�]|_�F,�s
�� IDAT�{�I�{��f��f���^h�9
��MC��5|_�6�F�mXpP
.J�7:$)==]���F��f������񊏏7:^�����А��`�ɓ'+66��0$22��x����C�=zB�b�x7�{4$�F�mx��pK�,Qzz��a0��l��b1:^l���F��k�Ef���0j������!a��+0!�3����z��Mꊏ���!�
��w"�@C�ktކ��w��Ǐ�cǎ.�eddh߾}���={j���uw����b2�ʔ����Y�f�ڵ�Ə�:�Y<�&��?@�c�x�W�s�NY��2�8�e˖i�ڵ��l1b����ԵkW"��RQm�[�n����ە����>�H�����.�	`<�`_��N�s�N��׮]��ٳ5t�P���)<<\qqq�5k��]�V�Qp�)��6��ju�dggk�ƍ�֭�


��z��&�w`��`���0�L2�LF�Q����t��9=��3���#G�ܹsJKK302�_C�|}}����������z��&���w��gj�����Ο?�%K�h��ݺv�ڷo�g�}V3f̐t���v���JIIQVV����;�j�JO<�Ǝ���@Ir��e��j��ʕ+Z�f�~�a���:�n�Z&�Ik֬ѨQ�\�
@�r��-%''k�֭:s�Ծ}{=��ӊ���T~-IW�\Qrr��mۦ.�U�Vz����ϫiӦe�KNNִi��+VHr/OpG�6m$I�.]r*w7Fw���x�&��?@��*PPP��c��믿v�;v�1Y����"M�0AG�q��9sF������ղe���[��&?��S�w��e����[���ںu��Rͳ�γl�2�Z���ƍ:|��>�����Ǘ��իW5f����9�Ξ=���tegg+55UAAAN�,^�XW�\qL��n�P�ɓ'%I-[��R��^r�s��aq��p��X,������T�ݻW���Nw��[�z��9�N�:)==]���WFF��v���lmڴI��m�V��={$I>�`�c���u�g֯_/IZ�t���ݫ]�v��W_�$�]�VR�}�U�������G>������p�8qB+W�,�^�v�g�͟?_��yBE���u��Q���k��^�z9�y�;�B"7���4,<��L&�[�%' մ�۷K�fΜ�Ν;K��w�Y�fi���Nu���$I,Pxx��ۓ-�Ν���XmٲE����u��qIR�6m�lk۶�S�Y���W��b�(//O����СC5t��J�q�t��E3f�Ћ/��m۶i�ĉN�$$$(00��yBy��1c�T)Fw��	��?�3
5�T�ԩS��nݺ9�w�޽L�ӧOK�bbb\�ĉ�u��EIRppp�m�2{�)S�h޼yڷo���ۧ?��=z��f�7n\����n/`(ɞ|��7e��Ov��n� I~~~����q��),,�J1�{-�M�1~����U�γ�;���i�c�ٜ^���TZ���W�V��~L__�2��e���N�I�0p�@���S;v��ƍu��!-_�\�W�֤I�4d��ۿu�V��J>�B�z�Pݼ�U��^r�7�~�gj.����c}��W:t�~���9�:T�nXX�N�:�͛7;�q�]-[��ٳgu��%�l��iۥK�u@Մ��(&&F111:r�>��3}��Z�xq�.���u��I<xP=z�p�<xP����'T��ݹ�&��?@�R��7�a����7�xC���*..��Ç��o���裏J�fΜ�cǎ��͛�p��{�=�L&M�0�Q�~��ӧO;�:v�(I:u�T�c���u�g�~�i�L&�[�N�������%I
p�s�G���_��`���䨸�X999�|�_�~���I�P���� 7<��p@�����E'O�TRRR�u����c����(!!�i[�ƍ���/;^�h�B/^T\\���´y�f���G;w�Tnn��w��nn�$�&t���`�-\�P.t�V��u�G'&&j۶m:}��F��oddd�2W<��“ݽ�&��?@��.���j��j��6�4i���d��Ĩy���WTT��ϟ/I
t�mڴ�RSSe6�&???������Z�r���e�M����������H���+((H��y�8>��s5m��q�\PVE�B\\��̙�x@���
T��핔��y��9�ꣃ�������Ç+44T~~~


�ȑ#�r�J���T�'yBUx��ׂ���>�P]<��J�}�ݚ3g�Sٙ3g$I�Z�r*		�ԩS5u��
�9p�@
8Щ쮻��lVJJ����!I�����5~�xU�t�c���(&&��:��hIj֬��O���ӧW�E����*;Ny܍Qr�Z��U��p@y��L&�[�N�/_֭[����q��nݺ�h{���jݺ�,���b�(,,L			5�@e�M�0~���'\�=��T+ǵZ�<x�֭[��j�…N�[�h���F�lҤ��Ν��^zI�F��$mڴIK�,Q�ƍk�-�ʐ��!b�p.������?���׿����"��G?R�^�4v�X����x���њ8q�-Z$I�4i��w�^�����p�hXXp���Vk����Wf�Yf����pň6�Cn�����]�F�mXpP
.J�7:$)==]7n�0:u,33Sf���0����ڰa��a���D~�����у�R�jذa�ѣ��a�rÆ
3:��6l�"##��F1~��=\7y�dM�<��0�����0:^������`���x������fY,����|||���,��f��a���w#�@C‚�W`Bp���7:�Dlll��0ԕ�ÇB�`�x'�{44,�x�aÆiذaF���mذ����
J�;�N�hh|����*`2�$IV���Hn;~��:v��r[FF����'I�ٳ��^���*�G�a�J�U�f�ԵkW�?^:t�N�����hXXp@=��+�h�Ν.'o8p@˖-�ڵke��4b�EEE�k׮D
������[�n����ە����>�H���5چ+�*������fV��k�N�s�N��׮]��ٳ5t�P���)<<\qqq�5k��]�V�Q���G�žX�Veggk�ƍ�֭�


��X;����hXXp�7L&�L&��ax���4�;wN�<�l�ȑ:w�������eD���뫈������$�߿��ۤ����5�C�}�F�7�Oвߥ�֭[JNN�֭[u���}��z������z�TXX���eee��S�V���Oh�ر
t��tLW�\њ5k���+44�Q�u��2�LZ�f�F�����ڹ@���t��%''k۶m�p�Z�j��{L�?���6m�vmڴ�$]�tɩ��㻛;�ލ�4,,��˖-ӪU��oܸ�Ç����*((P||�G����4a�9r�Q�̙3JMMUnn��-[&_��P�駟���P�{�.��w������֭[5dȐj�;
�իW5f����9�Ξ=���tegg+55UAAAn��ɓ���-[V����@�������~�zI�ҥK�w�^�ڵK����$i�ڵ�[�z��9�N�:)==]���WFF��v���lmڴI�wȵ�n�g�I҃>X&V{��w���U�V)//OJMM�޽{������p�8qB+W�������:z�^{�5IR�^��<9���}?P�0~���'\���dr���d����W��b�(//O����СC5t��*���ʒ$-X�@��ᒤv��i�ܹ���Ֆ-[<Ǐ�$�iӦ̶�m�:����n��}�vI�̙3չsgIR�.]4c����ڶm�&N��v�!!!3fL���n�@������i<�L�2E�5Ҿ}���;�hĈJMM��׫T���Ӓ����L&Ǐ}�ԉ'*���ŋ�����2��e�:�Y~~��ۋ J�֭�$�o���~~~��{4h� ���),,�J�w7w����P����*}�Y��i�򎴥
8P={�Ԏ;�q�F:tH˗/��ի5i�$
2ģz6����^�Z�vI��o�{*���uhhj+W�u�G��������1~`�5�'\ࡐ����(%%E�V�Rbb�._��ŋ{\�~�͛7�j�����ή0��-[J�.]�Tf���^8�$<xЩ����*�����@���/\��~Z&�I�֭Saa��~EEEI�<��裏J�fΜ�cǎ��͛�p��{�=�L&M�0�Q�~��ӧO;�:v�(I:u�T�X�e�:��\������$-X�@999*..VNN��x�
IR�~��զ'�w7w����P���Ibb�,X��j�…Nۺw��q���$�رC999JHHp�׸qc���ˎ�-Z��ŋ���0m޼Y}���Ν;����t\I��͕T�ɢ4�����Dm۶M�O���ѣ��GFF�)�'�w7w����P��@�a�Ze�Z
�!..Ns���<���@�}��JJJҼy�<�״iS����l6+,,L~~~
		Q����r�J���N�6M���SQQ�$���WPP�>���2�~���jڴ�P�W�QQ��
VZZ�����P���)44T#G��ʕ+R�x<9���}?�>����x�p5A+&&F111���n���M�:US�N����5p�@����Kf�Y)))���WDD�$)??_���Ti4t��QIj֬��O���ӧWz��L�����wc�
O���KLLT�֭e�Xe�EaaaJHH002P�T�!�>�p��L&S��*w�6B�&M4w�\���K5j�$iӦMZ�d�7nlpt�������p.h���5q�D-Z�H�4i�$u����@m��P|��{Xp���˝dk��l��l6:PG��a�p�!P9_��6,�(����������X��P�2335l�0��Pdff*  ��0x	��w"�@CÂ�W�qㆆnt�KmذA6l0:^���.��`8��"��bt�K�l6�C�E?�
.�[�d�v��mtҷo_M�<��0x1�bT��ɓշo_�è1��F~�����ؿ�233��233��~����233��*�����ӧ��F1~��=�p�
f�Y���0Ա��x�CPOX,��f����C���D~���'\�‚�R���;����ձcG��222�o�>IRϞ=5|��o�^C�,�8��\j:	�ڄ�_+��bae�L�Y���HVT/�@H��9��t��$�J*dK�@��N�iV�B����߶>�W��\{��~�l�=��y.ٟ�=\guF1��Ɓ���(
���u�]Y�lY�����3{��,Z�(MMM���K3jԨ�p�	E��i:�3�ym5�>�@��-v�_�lٲvǷmۖ��?�&MJYYY���3a„�w�}ٶm�~��:�3�ym5��@�h��Ǩ��Leee���g�͛��~�)�]vYa���/�O?��y��13�ݧơX��S;��v�ؑ9s���w��?�����g�ȑ���3~���[�n�ܹs�dɒ����9�Cr����k�MIII��������!�7o�…s�)�d��ᅘ�;,���Y�pa���2d?��ȏ?��g�}6˗/ϖ-[r�G��+��y��"n��͙3gN�.]�_�5�rH�<��\��<xp!��X�paf͚����x�9묳r��g�I�V�tTg4�3gN��5*�?�|��jo���Ɓ��z
Љٳg��_,|���?��_��/�������$���s�7f��Յ�~�!uuuY�jUfϞ��};~��;3�[�f̘1m��3&+V�Ȼロ�'����b�ƍ�2eJ~���ؚ5k����\�$ٲeK��暬]���aÆ���gŊ���ˠA�Z���nȦM��$��G^{��ر#3f�H���3�f���͛[l�ޛ�n�����ޥ��Y�xq��g��'�|�?�0ӧOO�,Z����K/e���9��cS__��>�,/��rN8ᄬX�"o��f��O�nhh(|_�|y��裏n�C�XsP/��B~��s�1Y�xq>���\t�EI����B܋/���k�fĈ����'�|��s禼�<k֬���ۜ�����ŋ�|��L�:5I���w�&��hv�Gf���y�����8���@��
t[���]o��po4hP�lْd�ڵ;vl&M��I�&��[�dI�d�̙)//O�sS�>����������;���_�d�f�֎8�1@q|���I�{�'I�3f�BѬ�Qbƌ9��$�|���r�-Y�tin��?3mڴ�9kkkSWW��~��p��5Ig&O�����]�u���5����N�-��G�t��o�C=�O?�4�~�i�{�L�:55550`@!nݺuI����vϳf͚N��q��$ɐ!C�kk���X�/7Q'���$=zt�q�ׯO����N<����#G>���&Iv��Q�jMҙ�Mػ���n������E��V�M��+��f�7n\N=��|�y�7��_��g��K/���o�9'NL�455uz�-[�tz�O�>I��}��9�<�Ǟ�-�gEk�����:]�I:���-���
�ܾ}{��{2o5���CZ�������������NuuuV�^���{//��Bf͚U�0UVV�o��6o��V���v�Æ
ˆ
�iӦ6�űM�6b�����f�zh��Y�&�sL�q����o�r��TUU�W�\�$�U+$]�IvE�>}��Ԕ��=�N�S��:�q�/�~�=�>�(���SYY�W_}5[�n�����5*I�'Q�q�I�3f䫯�����_�5O=�T*++s�7b��4�nݺ���ѣ�$�~�m��ǚc��8�Ӓ$O<�D6lؐ?��#�?�x*++s�E�Ǝ�$�9sf��_���1�<�H����O��
*KIDAT�kw�&i�����$y��׳m۶�]�6�>��n�[����7\@'�L���3g��Gm��N*|�ꪫ����1�'On7`���q���|p6nܘ	&���,o��VN;�,[�,�V�jq�$Y�jU��ۜ	�=W_}u�,Y���Ɯ��-�]w�u��S�L�ҥK�nݺL�:�E\EEE����jM�^�ё�c�f���y��'��O&Iƌ�&���V�@o�
�


ihhدל0aBx�u�Q)))IIIIF�����*=�P!n����KMMM���ү_����f�ر�?~����}��1bD����۷'I�9�4(}�Q�>��<8g�}���0СaÆe޼y7n\������裏�c�=���;�7dȐ̛7/�\rI��~��e�����3�������Z��Wgt�;�ȤI�2t�Д��d̘1����w{�j���������թ���׸����y睹��;;�7n\ƍ�b젃JMMM�Ν����gĈI����g�ʕ��2hРݟ�W���g�̙�7t��L�6-ӦM�4�����w�&i��������3}����ʼ�8���@��
�ML�2%�vX,XP[�`A���2y��"f���8�o���=o��ǫ���'���i�������n�W\�$y��7���Og���5�zK]Л�q�nz��	��������O>97�tS�x�$��7ߜ�N:��Y�5��-�}K�=^o{�tMMMjjj���H��.�M�8t��{`��[��
�h�h�b'IR__����b�AMMM�Sz�������;
���~��K}@o�������[3~��b�IEEE�S���_~��)@�VUUU��*�����&.(����^�	�{.���b�t#��/}��@w�
E}}}��닝�
���;����Mmmm���	����d}�������-�}�Y֭[W�4�n���"UUU�N(�W^y��)@�VUU����b��e�г����4\�ҷ�	t7.Z�pЊ��V4\����
�h�hE�@+$���It'�ݶ��&��IEND�B`�PK�a�\�YǾ����)pear/data/ConsoleTools/design/console.xmlnu�[���<?xml version="1.0"  encoding="windows-1252"?>
<XMI xmi.version="1.1" xmlns:UML="omg.org/UML1.3" timestamp="2005-08-22 11:12:54">
	<XMI.header>
		<XMI.documentation>
			<XMI.exporter>Enterprise Architect</XMI.exporter>
			<XMI.exporterVersion>2.5</XMI.exporterVersion>
		</XMI.documentation>
	</XMI.header>
	<XMI.content>
		<UML:Model name="EA Model" xmi.id="MX_EAID_4B0C57B6_268B_4109_8909_F7FD1E17C16A">
			<UML:Namespace.ownedElement>
				<UML:Class name="EARootClass" xmi.id="EAID_11111111_5487_4080_A7F4_41526CB0AA00" isRoot="true" isLeaf="false" isAbstract="false"/>
				<UML:Package name="ConsoleTools" xmi.id="EAPK_4B0C57B6_268B_4109_8909_F7FD1E17C16A" isRoot="false" isLeaf="false" isAbstract="false" visibility="public">
					<UML:ModelElement.stereotype>
						<UML:Stereotype xmi.idref="EAID_1D64E7C3_A572_4044_9F13_82E10C926C05"/>
					</UML:ModelElement.stereotype>
					<UML:ModelElement.taggedValue>
						<UML:TaggedValue tag="documentation" value="Provides functionality for working on the console. This means the
ability to parse options to scripts and output to consoles."/>
						<UML:TaggedValue tag="created" value="2005-08-12 00:00:00"/>
						<UML:TaggedValue tag="modified" value="2005-08-12 00:00:00"/>
						<UML:TaggedValue tag="iscontrolled" value="TRUE"/>
						<UML:TaggedValue tag="xmlpath" value="E:\src\ezcomponents\packages\ConsoleTools\trunk\design\console.xml"/>
						<UML:TaggedValue tag="lastloaddate" value="2005-08-18 14:20:20"/>
						<UML:TaggedValue tag="lastsavedate" value="2005-08-22 11:12:54"/>
						<UML:TaggedValue tag="isprotected" value="FALSE"/>
						<UML:TaggedValue tag="usedtd" value="FALSE"/>
						<UML:TaggedValue tag="owner" value="Jan Borsodi"/>
						<UML:TaggedValue tag="xmiver" value="Enterprise Architect XMI/UML 1.3"/>
						<UML:TaggedValue tag="logxml" value="FALSE"/>
						<UML:TaggedValue tag="codepath" value="E:\src\ezcomponents\ConsoleTools"/>
						<UML:TaggedValue tag="tpos" value="0"/>
						<UML:TaggedValue tag="packageFlags" value="CRC=0;"/>
						<UML:TaggedValue tag="batchsave" value="0"/>
						<UML:TaggedValue tag="batchload" value="0"/>
						<UML:TaggedValue tag="phase" value="1.0"/>
						<UML:TaggedValue tag="status" value="Proposed"/>
						<UML:TaggedValue tag="author" value="Tobias Schlitt"/>
						<UML:TaggedValue tag="complexity" value="1"/>
						<UML:TaggedValue tag="stereotype" value="ezcomponent"/>
						<UML:TaggedValue tag="ea_stype" value="Public"/>
						<UML:TaggedValue tag="tpos" value="0"/>
					</UML:ModelElement.taggedValue>
					<UML:Namespace.ownedElement>
						<UML:Collaboration xmi.id="EAID_4B0C57B6_268B_4109_8909_F7FD1E17C16A_Collaboration" name="Collaborations">
							<UML:Namespace.ownedElement>
								<UML:ClassifierRole name="console" xmi.id="EAID_9300B830_36D9_4e00_AE7D_EA3DA9B092B9" visibility="public" base="EAID_11111111_5487_4080_A7F4_41526CB0AA00">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="isSpecification" value="false"/>
										<UML:TaggedValue tag="ea_stype" value="Package"/>
										<UML:TaggedValue tag="ea_ntype" value="0"/>
										<UML:TaggedValue tag="version" value="1.0"/>
										<UML:TaggedValue tag="package" value="EAPK_4B0C57B6_268B_4109_8909_F7FD1E17C16A"/>
										<UML:TaggedValue tag="date_created" value="2005-08-12 09:19:34"/>
										<UML:TaggedValue tag="date_modified" value="2005-08-12 09:19:34"/>
										<UML:TaggedValue tag="gentype" value="PHP"/>
										<UML:TaggedValue tag="tagged" value="0"/>
										<UML:TaggedValue tag="package2" value="EAID_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
										<UML:TaggedValue tag="package_name" value="ConsoleTools"/>
										<UML:TaggedValue tag="phase" value="1.0"/>
										<UML:TaggedValue tag="author" value="Jan Borsodi"/>
										<UML:TaggedValue tag="complexity" value="1"/>
										<UML:TaggedValue tag="status" value="Proposed"/>
										<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
									</UML:ModelElement.taggedValue>
								</UML:ClassifierRole>
							</UML:Namespace.ownedElement>
							<UML:Collaboration.interaction/>
						</UML:Collaboration>
						<UML:Package name="console" xmi.id="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9" isRoot="false" isLeaf="false" isAbstract="false" visibility="public">
							<UML:ModelElement.taggedValue>
								<UML:TaggedValue tag="created" value="2005-08-12 00:00:00"/>
								<UML:TaggedValue tag="modified" value="2005-08-12 00:00:00"/>
								<UML:TaggedValue tag="iscontrolled" value="FALSE"/>
								<UML:TaggedValue tag="lastloaddate" value="2005-08-18 14:20:18"/>
								<UML:TaggedValue tag="lastsavedate" value="2005-08-18 14:20:18"/>
								<UML:TaggedValue tag="isprotected" value="FALSE"/>
								<UML:TaggedValue tag="usedtd" value="FALSE"/>
								<UML:TaggedValue tag="logxml" value="FALSE"/>
								<UML:TaggedValue tag="codepath" value="E:\src\ezcomponents\ConsoleTools\console"/>
								<UML:TaggedValue tag="batchsave" value="0"/>
								<UML:TaggedValue tag="batchload" value="0"/>
								<UML:TaggedValue tag="phase" value="1.0"/>
								<UML:TaggedValue tag="status" value="Proposed"/>
								<UML:TaggedValue tag="author" value="Jan Borsodi"/>
								<UML:TaggedValue tag="complexity" value="1"/>
								<UML:TaggedValue tag="ea_stype" value="Public"/>
							</UML:ModelElement.taggedValue>
							<UML:Namespace.ownedElement>
								<UML:Collaboration xmi.id="EAID_9300B830_36D9_4e00_AE7D_EA3DA9B092B9_Collaboration" name="Collaborations">
									<UML:Namespace.ownedElement>
										<UML:ClassifierRole name="parameter" xmi.id="EAID_4C33B478_0B96_4ef1_B7E8_0F64B60CC675" visibility="public" base="EAID_11111111_5487_4080_A7F4_41526CB0AA00">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="isSpecification" value="false"/>
												<UML:TaggedValue tag="ea_stype" value="Package"/>
												<UML:TaggedValue tag="ea_ntype" value="0"/>
												<UML:TaggedValue tag="version" value="1.0"/>
												<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
												<UML:TaggedValue tag="date_created" value="2005-08-12 09:19:35"/>
												<UML:TaggedValue tag="date_modified" value="2005-08-12 09:19:35"/>
												<UML:TaggedValue tag="gentype" value="PHP"/>
												<UML:TaggedValue tag="tagged" value="0"/>
												<UML:TaggedValue tag="package2" value="EAID_4C33B478_0B96_4ef1_B7E8_0F64B60CC675"/>
												<UML:TaggedValue tag="package_name" value="console"/>
												<UML:TaggedValue tag="phase" value="1.0"/>
												<UML:TaggedValue tag="author" value="Jan Borsodi"/>
												<UML:TaggedValue tag="complexity" value="1"/>
												<UML:TaggedValue tag="status" value="Proposed"/>
												<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:ClassifierRole>
										<UML:ClassifierRole name="output" xmi.id="EAID_4D026C21_9F61_4699_BBE9_ED9516605496" visibility="public" base="EAID_11111111_5487_4080_A7F4_41526CB0AA00">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="isSpecification" value="false"/>
												<UML:TaggedValue tag="ea_stype" value="Package"/>
												<UML:TaggedValue tag="ea_ntype" value="0"/>
												<UML:TaggedValue tag="version" value="1.0"/>
												<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
												<UML:TaggedValue tag="date_created" value="2005-08-12 09:19:34"/>
												<UML:TaggedValue tag="date_modified" value="2005-08-12 09:19:34"/>
												<UML:TaggedValue tag="gentype" value="PHP"/>
												<UML:TaggedValue tag="tagged" value="0"/>
												<UML:TaggedValue tag="package2" value="EAID_4D026C21_9F61_4699_BBE9_ED9516605496"/>
												<UML:TaggedValue tag="package_name" value="console"/>
												<UML:TaggedValue tag="phase" value="1.0"/>
												<UML:TaggedValue tag="author" value="Jan Borsodi"/>
												<UML:TaggedValue tag="complexity" value="1"/>
												<UML:TaggedValue tag="status" value="Proposed"/>
												<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:ClassifierRole>
									</UML:Namespace.ownedElement>
									<UML:Collaboration.interaction/>
								</UML:Collaboration>
								<UML:Class name="ezcConsoleStatusbar" xmi.id="EAID_4F677B5E_DCEC_4413_9FB2_A9753E5E62E8" visibility="public" namespace="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation" value="Creating  and maintaining statusbars to be printed to the console. 
&lt;code&gt;  ... creating ezcConsoleOutput object  $opt = array( 'successChar'   =&gt; '+', 'failureChar'   =&gt; '-', ); $status = new ezcConsoleStatusbar($opt); foreach ($files as $file) { $res = $file-&gt;upload(); $status-&gt;add($res); // $res is true or false }  $msg = $status-&gt;getSuccess().' succeeded, '.$status-&gt;getFailure().' failed.'; $out-&gt;outputText(&quot;Finished uploading files. $msg \n&quot;); 
&lt;/code&gt;  
@package ConsoleTools
@link http://www.gnu.org/copyleft/lesser.html}"/>
										<UML:TaggedValue tag="isSpecification" value="false"/>
										<UML:TaggedValue tag="ea_stype" value="Class"/>
										<UML:TaggedValue tag="ea_ntype" value="0"/>
										<UML:TaggedValue tag="version" value="//autogen//
@copyright Copyright (C) 2005 eZ syst"/>
										<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
										<UML:TaggedValue tag="date_created" value="2005-08-19 11:51:29"/>
										<UML:TaggedValue tag="date_modified" value="2005-08-19 11:51:50"/>
										<UML:TaggedValue tag="genfile" value="E:\src\ezcomponents\packages\ConsoleTools\trunk\src\console\statusbar.php"/>
										<UML:TaggedValue tag="gentype" value="PHP"/>
										<UML:TaggedValue tag="tagged" value="0"/>
										<UML:TaggedValue tag="package_name" value="console"/>
										<UML:TaggedValue tag="phase" value="1.0"/>
										<UML:TaggedValue tag="author" value="Jan Borsodi"/>
										<UML:TaggedValue tag="complexity" value="1"/>
										<UML:TaggedValue tag="status" value="Proposed"/>
										<UML:TaggedValue tag="eventflags" value="LNK=629e;"/>
										<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
									</UML:ModelElement.taggedValue>
									<UML:Classifier.feature>
										<UML:Attribute name="options" changeable="none" visibility="protected" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="array(
        'successChar' =&gt; '+',     // Char to indicate success
        'failureChar' =&gt; '-',     // Char to indicate failure
    )"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="Options 
&lt;code&gt; array( 'successChar' =&gt; '+',     // Char to indicate success 'failureChar' =&gt; '-',     // Char to indicate failure );
&lt;/code&gt; 
@var array(string)"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="0"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{F33A1CE4-BFEA-4f77-A62F-27EBE1039C85}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="outputHandler" changeable="none" visibility="protected" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="The ezcConsoleOutput object to use. 
@var ezcConsoleOutput"/>
												<UML:TaggedValue tag="type" value="ezcConsoleOutput"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="1"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{AF891708-6CAF-47ce-AC06-786978028DEF}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Operation name="__construct" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Creates a new status bar. 
@param ezcConsoleOutput $outHandler Handler to utilize for output
@param array(string) $settings      Settings
@param array(string) $options       Options 
@see ezcConsoleStatusbar::$options"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="0"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{CBE6BEE8-62F4-4986-877A-DD4AB9BD61E5}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-62F4-4986-877A-DD4AB9BD61E5}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="outHandler" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="ezcConsoleOutput"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="classifier" value="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
														<UML:TaggedValue tag="ea_guid" value="{39827121-CD9A-46ae-8A2E-DA9973EE4935}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="options" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{A4C17CAC-8160-482b-9A83-BC834F8E3656}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="array() "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="add" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Add a status to the status bar. Adds a new status to the bar which is printed immediatelly. If the cursor is currently not at the beginning of a line, it will move to the next line. 
@param bool $status Print successChar on true, failureChar on false."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="1"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{DEBB3332-5AFA-4648-89C4-ABC6B5ED6C94}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-5AFA-4648-89C4-ABC6B5ED6C94}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="status" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{5BB0E5EA-65A6-4426-A912-35384AB3F5F2}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="getSuccesses" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Returns number of successes during the run. Returns the number of success characters printed from this status bar. 
@returns int Number of successes."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="2"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{81A9D66D-CD01-43b3-96F4-20C81BC8CA16}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-CD01-43b3-96F4-20C81BC8CA16}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="getFailures" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Returns number of failures during the run. Returns the number of failure characters printed from this status bar. 
@returns int Number of failures."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="3"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{88FCD858-D6D5-434c-A23D-753DB261B31A}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-D6D5-434c-A23D-753DB261B31A}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
									</UML:Classifier.feature>
								</UML:Class>
								<UML:Association xmi.id="EAID_8273AECA_7516_4847_9960_34C4FF71F006" visibility="public" isRoot="false" isLeaf="false" isAbstract="false">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="style" value="3"/>
										<UML:TaggedValue tag="ea_type" value="Aggregation"/>
										<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
										<UML:TaggedValue tag="linemode" value="3"/>
										<UML:TaggedValue tag="linecolor" value="-1"/>
										<UML:TaggedValue tag="linewidth" value="0"/>
										<UML:TaggedValue tag="seqno" value="0"/>
										<UML:TaggedValue tag="headStyle" value="0"/>
										<UML:TaggedValue tag="lineStyle" value="0"/>
										<UML:TaggedValue tag="virtualInheritance" value="0"/>
									</UML:ModelElement.taggedValue>
									<UML:Association.connection>
										<UML:AssociationEnd visibility="public" aggregation="none" isOrdered="false" isNavigable="false" type="EAID_65A37092_56CE_4e5a_8C30_366469BD8468">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="containment" value="Unspecified"/>
											</UML:ModelElement.taggedValue>
										</UML:AssociationEnd>
										<UML:AssociationEnd visibility="public" aggregation="shared" isOrdered="false" isNavigable="true" type="EAID_4F677B5E_DCEC_4413_9FB2_A9753E5E62E8">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="containment" value="Unspecified"/>
											</UML:ModelElement.taggedValue>
										</UML:AssociationEnd>
									</UML:Association.connection>
								</UML:Association>
								<UML:Comment xmi.id="EAID_55B8BBC5_46DA_4e67_9A1D_1120F11D48E7" visibility="public" namespace="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="isSpecification" value="false"/>
										<UML:TaggedValue tag="ea_stype" value="Text"/>
										<UML:TaggedValue tag="ea_ntype" value="18"/>
										<UML:TaggedValue tag="version" value="1.0"/>
										<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
										<UML:TaggedValue tag="date_created" value="2005-08-12 09:20:09"/>
										<UML:TaggedValue tag="date_modified" value="2005-08-12 09:20:09"/>
										<UML:TaggedValue tag="gentype" value="&lt;none&gt;"/>
										<UML:TaggedValue tag="tagged" value="0"/>
										<UML:TaggedValue tag="package_name" value="console"/>
										<UML:TaggedValue tag="phase" value="1.0"/>
										<UML:TaggedValue tag="author" value="Jan Borsodi"/>
										<UML:TaggedValue tag="complexity" value="1"/>
										<UML:TaggedValue tag="status" value="Proposed"/>
										<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
									</UML:ModelElement.taggedValue>
								</UML:Comment>
								<UML:Class name="ezcConsoleOutput" xmi.id="EAID_65A37092_56CE_4e5a_8C30_366469BD8468" visibility="public" namespace="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation" value="Class for handling console output. This class handles outputting text to the console. It deals with styling text in different ways and offers some comfortable options to deal with console text output. 
&lt;code&gt;  $opts = array( 'verboseLevel'  =&gt; 10,  // extremly verbose 'autobreak'     =&gt; 40,  // will break lines every 40 chars 'styles'        =&gt; array( 'default'   =&gt; 'green', // green default text 'success'   =&gt; 'white', // white success messages ), ); $out = new ezcConsoleOutput($opts);  $out-&gt;outputText('This is default text '); $out-&gt;outputText('including success message', 'success'); $out-&gt;outputText(&quot;and a manual linebreak.\n&quot;);  $out-&gt;outputText(&quot;Some verbose output.\n&quot;, null, 10); $out-&gt;outputText(&quot;And some not so verbose, bold output.\n&quot;, 'bold', 5); 
&lt;/code&gt; 
@package ConsoleTools
@link http://www.gnu.org/copyleft/lesser.html}"/>
										<UML:TaggedValue tag="isSpecification" value="false"/>
										<UML:TaggedValue tag="ea_stype" value="Class"/>
										<UML:TaggedValue tag="ea_ntype" value="0"/>
										<UML:TaggedValue tag="version" value="//autogen//
@copyright Copyright (C) 2005 eZ syst"/>
										<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
										<UML:TaggedValue tag="date_created" value="2005-08-12 09:19:35"/>
										<UML:TaggedValue tag="date_modified" value="2005-08-19 11:42:35"/>
										<UML:TaggedValue tag="genfile" value="E:\src\ezcomponents\packages\ConsoleTools\trunk\src\console\output.php"/>
										<UML:TaggedValue tag="genoptions" value="nKill=0;sLang=PHP;bConstructor=1;bConInline=0;sConScope=Public;bCpyConstructor=0;bCpyConInline=0;sCpyConScope=Public;bDestructor=1;bDesVirtual=1;bDesInline=0;sDesScope=Public;CHeader=.h;CBody=.cpp;JBody=.java;VBody=.cls;VBNetBody=.vb;sAssocName=$LinkClass;bGetSet=1;bGenInterfaces=1;JCol=Vector;CCol=[];VCol=Collection;bVMultiuse=1;bVPersist=0;bVDatabind=0;bVDatasource=0;bVGlobal=0;bVCreatable=1;bVExposed=0;sMTS=0;sCRefType=*;sCGetPrefix=Get;sCSetPrefix=Set;sJGetPrefix=get;sJSetPrefix=set;sCSGetPrefix=Get;sCSSetPrefix=Set;sVVersion=6.0;CSBody=.cs;DBody=.pas;bJInnerClasses=1;sJCollection=;sCodePage=;sPHPBody=.php;sPHPVersion=5.0;sPHPGetPrefix=get;sPHPSetPrefix=set;nLang=-1;"/>
										<UML:TaggedValue tag="gentype" value="PHP"/>
										<UML:TaggedValue tag="tagged" value="0"/>
										<UML:TaggedValue tag="package_name" value="console"/>
										<UML:TaggedValue tag="phase" value="1.0"/>
										<UML:TaggedValue tag="author" value="Jan Borsodi"/>
										<UML:TaggedValue tag="complexity" value="1"/>
										<UML:TaggedValue tag="status" value="Proposed"/>
										<UML:TaggedValue tag="eventflags" value="LNK=f7da;"/>
										<UML:TaggedValue tag="$ea_attsclassified" value="{AF891708-6CAF-47ce-AC06-786978028DEF},{5DEF0E6B-4A38-4bc6-B053-6C114AE6EC99},{38166CA5-115F-4705-A391-4B122E210FED}"/>
										<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
									</UML:ModelElement.taggedValue>
									<UML:Classifier.feature>
										<UML:Attribute name="options" changeable="none" visibility="private" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="array(
        'verboseLevel'  =&gt; 1,
        'useStyles'     =&gt; true,
        'styles'        =&gt; array(
            'default'   =&gt; '',
            'error'     =&gt; 'red',
            'warning'   =&gt; 'yellow',
            'success'   =&gt; 'green',
            'file'      =&gt; 'blue',
            'dir'       =&gt; 'green',
            'link'      =&gt; 'blue',
        ),
    )"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="Options Default: 
&lt;code&gt; array( 'verboseLevel'  =&gt; 1,       // Verbosity level 'autobreak'     =&gt; 0,       // Pos &lt;int&gt;. Break lines automatically after this ammount of chars 'useStyles'     =&gt; true,    // Whether to enable styles or not 'styles'        =&gt; array(   // Style alias definition {@link ezcConsoleOutput::outputText()} 'default'   =&gt; '',      // Default style. If blank, sys default 'error'     =&gt; 'red', 'warning'   =&gt; 'yellow', 'success'   =&gt; 'green', 'file'      =&gt; 'blue', 'dir'       =&gt; 'green', 'link'      =&gt; 'blue', ), );
&lt;/code&gt; 
@see ezcConsoleOutput::setOptions()
@see ezcConsoleOutput::getOptions() 
@var array(string)"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="0"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{2533A2BF-5CE1-4369-B243-0F1641634614}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="styles" changeable="none" visibility="private" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="array(
		'red' =&gt; &quot;\033[1;31m&quot;,
		'green' =&gt; &quot;\033[1;32m&quot;,
		'yellow' =&gt; &quot;\033[1;33m&quot;,
		'blue' =&gt; &quot;\033[1;34m&quot;,
		'magenta' =&gt; &quot;\033[1;35m&quot;,
		'cyan' =&gt; &quot;\033[1;36m&quot;,
		'white' =&gt; &quot;\033[1;37m&quot;,
		'gray' =&gt; &quot;\033[1;30m&quot;,
		
		'dark-red' =&gt; &quot;\033[0;31m&quot;,
		'dark-green' =&gt; &quot;\033[0;32m&quot;,
		'dark-yellow' =&gt; &quot;\033[0;33m&quot;,
		'dark-blue' =&gt; &quot;\033[0;34m&quot;,
		'dark-magenta' =&gt; &quot;\033[0;35m&quot;,
		'dark-cyan' =&gt; &quot;\033[0;36m&quot;,
		'dark-white' =&gt; &quot;\033[0;37m&quot;,
		'dark-gray' =&gt; &quot;\033[0;30m&quot;,
		
		'red-bg' =&gt; &quot;\033[1;41m&quot;,
		'green-bg' =&gt; &quot;\033[1;42m&quot;,
		'yellow-bg' =&gt; &quot;\033[1;43m&quot;,
		'blue-bg' =&gt; &quot;\033[1;44m&quot;,
		'magenta-bg' =&gt; &quot;\033[1;45m&quot;,
		'cyan-bg' =&gt; &quot;\033[1;46m&quot;,
		'white-bg' =&gt; &quot;\033[1;47m&quot;,
		
		'bold' =&gt; &quot;\033[1;38m&quot;,
		'italic' =&gt; &quot;\033[0;39m&quot;,
		'underline' =&gt; &quot;\033[0;39m&quot;,
    )"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="Stores the hard coded styles available on the console. 
@var array(string =&gt; string)"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="1"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{B0A8B63B-BF19-45f2-8901-CBEA9CA2D482}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Operation name="__construct" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Create a new console output handler. 
@see ezcConsoleOutput::$options
@see ezcConsoleOutput::setOptions()
@see ezcConsoleOutput::getOptions() 
@param array(string) $options Options."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="0"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{5EB221F1-7FE2-428d-B13B-468FC76062E3}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-7FE2-428d-B13B-468FC76062E3}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="options" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{BB692C63-8FFD-408a-B022-EF77A24C9F16}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="array() "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="setOptions" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Set options. 
@see ezcConsoleOutput::getOptions()
@see ezcConsoleOutput::$options 
@param array(string) $options Options.
@return void"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="1"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{6B166EA3-A27B-4e1a-9947-9AF5CF0B0D37}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-A27B-4e1a-9947-9AF5CF0B0D37}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="options" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{55EDB7C4-9E55-42a0-B4CA-A4F70D27151C}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="getOptions" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Returns options 
@see ezcConsoleOutput::setOptions()
@see ezcConsoleOutput::$options 
@return array(string) Options."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="2"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{0EB8E49F-C9C5-4890-8875-6B4F4E7250F6}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-C9C5-4890-8875-6B4F4E7250F6}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="outputText" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Print text to the console. Output a string to the console. If $style parameter is ommited, the default style is chosen. Style can either be a special style {@link eczConsoleOutput::$options}, a style name {@link ezcConsoleOutput$styles} or 'none' to print without any styling. 
@param string $text      The text to print.
@param string $style     Style chosen for printing.
@param int $verboseLevel On which verbose level to output this message.
@param int Output this text only in a specific verbosity level"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="3"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{0F861241-401A-4c5c-AC0E-3104A64E949F}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-401A-4c5c-AC0E-3104A64E949F}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="text" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{975F5355-C2EB-4fc5-A494-A8DF6D326BD9}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="style" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{41472B93-AF86-4fe0-A3F3-0860B3A242BE}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="'default'"/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="verboseLevel" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="2"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{A806171C-5D65-4ca3-9298-3A95FC79ED1F}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="1 "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="styleText" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Returns a styled version of the text. Receive a styled version of the inputed text. If $style parameter is ommited, the default style is chosen. Style can either be a special style or a direct color name.  {@link ezcConsoleOutput::$options}, a style name {@link ezcConsoleOutput::$styles} or 'none' to print without any styling. 
@param string $text  Text to apply style to.
@param string $style Style chosen to be applied.
@return string"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="4"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{2BC7FC3E-88AE-4cb8-99F8-872E0E6CCB9A}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-88AE-4cb8-99F8-872E0E6CCB9A}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="text" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{BEE56DE5-C4E6-42f9-981C-328F5CE4BA40}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="style" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{C32940AE-7E71-4e5d-B49A-0CB487D37932}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="'default' "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="storePos" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Store the current cursor position. Saves the current cursor position to return to it using {@link ezcConsoleOutput::restorePos()}. Multiple calls to this method will override each other. Only the last position is saved. 
@todo Shall multiple markers be supported? Must be emulated by the class, since not directly supported by ANSI escape seqs. 
@return void"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="5"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{D28A9B5A-586C-43d2-8EE7-62A375675E7D}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-586C-43d2-8EE7-62A375675E7D}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="restorePos" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Restore a cursor position. Restores the cursor position last saved using {@link ezcConsoleOutput::storePos()}. 
@return void "/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="6"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{6892A18F-3BCE-47bb-8A78-DB990F609A87}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-3BCE-47bb-8A78-DB990F609A87}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
									</UML:Classifier.feature>
								</UML:Class>
								<UML:Association xmi.id="EAID_8BBADE67_3C37_4c4a_8CD5_2911FACC538E" visibility="public" isRoot="false" isLeaf="false" isAbstract="false">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="style" value="3"/>
										<UML:TaggedValue tag="ea_type" value="Aggregation"/>
										<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
										<UML:TaggedValue tag="linemode" value="3"/>
										<UML:TaggedValue tag="linecolor" value="-1"/>
										<UML:TaggedValue tag="linewidth" value="0"/>
										<UML:TaggedValue tag="seqno" value="0"/>
										<UML:TaggedValue tag="headStyle" value="0"/>
										<UML:TaggedValue tag="lineStyle" value="0"/>
										<UML:TaggedValue tag="virtualInheritance" value="0"/>
									</UML:ModelElement.taggedValue>
									<UML:Association.connection>
										<UML:AssociationEnd visibility="public" aggregation="none" isOrdered="false" isNavigable="false" type="EAID_65A37092_56CE_4e5a_8C30_366469BD8468">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="containment" value="Unspecified"/>
											</UML:ModelElement.taggedValue>
										</UML:AssociationEnd>
										<UML:AssociationEnd visibility="public" aggregation="shared" isOrdered="false" isNavigable="true" type="EAID_A9F2232F_845A_4da2_A329_950ED3CDB676">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="containment" value="Unspecified"/>
											</UML:ModelElement.taggedValue>
										</UML:AssociationEnd>
									</UML:Association.connection>
								</UML:Association>
								<UML:Association xmi.id="EAID_D761BD7E_7981_43a2_823C_48DC2173761C" visibility="public" isRoot="false" isLeaf="false" isAbstract="false">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="style" value="2"/>
										<UML:TaggedValue tag="ea_type" value="Aggregation"/>
										<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
										<UML:TaggedValue tag="linemode" value="2"/>
										<UML:TaggedValue tag="linecolor" value="-1"/>
										<UML:TaggedValue tag="linewidth" value="0"/>
										<UML:TaggedValue tag="seqno" value="0"/>
										<UML:TaggedValue tag="headStyle" value="0"/>
										<UML:TaggedValue tag="lineStyle" value="0"/>
										<UML:TaggedValue tag="privatedata5" value="SX=0;SY=0;EX=0;EY=0;EDGE=1;"/>
										<UML:TaggedValue tag="virtualInheritance" value="0"/>
									</UML:ModelElement.taggedValue>
									<UML:Association.connection>
										<UML:AssociationEnd visibility="public" aggregation="none" isOrdered="false" isNavigable="false" type="EAID_65A37092_56CE_4e5a_8C30_366469BD8468">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="containment" value="Unspecified"/>
											</UML:ModelElement.taggedValue>
										</UML:AssociationEnd>
										<UML:AssociationEnd visibility="public" aggregation="shared" isOrdered="false" isNavigable="true" type="EAID_EE63FC0D_D590_4d0f_9F83_338683F8E000">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="containment" value="Unspecified"/>
											</UML:ModelElement.taggedValue>
										</UML:AssociationEnd>
									</UML:Association.connection>
								</UML:Association>
								<UML:Dependency client="EAID_65A37092_56CE_4e5a_8C30_366469BD8468" supplier="EAID_4B7CE667_749A_4dde_BE45_7CBFB5519DF5" xmi.id="EAID_E53B0D49_9955_449f_974D_2D23DBDB2610" visibility="public">
									<UML:ModelElement.stereotype>
										<UML:Stereotype name="throws"/>
									</UML:ModelElement.stereotype>
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="style" value="2"/>
										<UML:TaggedValue tag="ea_type" value="Dependency"/>
										<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
										<UML:TaggedValue tag="linemode" value="2"/>
										<UML:TaggedValue tag="linecolor" value="-1"/>
										<UML:TaggedValue tag="linewidth" value="0"/>
										<UML:TaggedValue tag="seqno" value="0"/>
										<UML:TaggedValue tag="stereotype" value="throws"/>
										<UML:TaggedValue tag="headStyle" value="0"/>
										<UML:TaggedValue tag="lineStyle" value="0"/>
										<UML:TaggedValue tag="conditional" value="�throws�"/>
										<UML:TaggedValue tag="src_visibility" value="Public"/>
										<UML:TaggedValue tag="src_aggregation" value="0"/>
										<UML:TaggedValue tag="src_isOrdered" value="false"/>
										<UML:TaggedValue tag="src_isNavigable" value="false"/>
										<UML:TaggedValue tag="src_containment" value="Unspecified"/>
										<UML:TaggedValue tag="dst_visibility" value="Public"/>
										<UML:TaggedValue tag="dst_aggregation" value="0"/>
										<UML:TaggedValue tag="dst_isOrdered" value="false"/>
										<UML:TaggedValue tag="dst_isNavigable" value="true"/>
										<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
										<UML:TaggedValue tag="privatedata5" value="SX=0;SY=0;EX=0;EY=0;EDGE=1;"/>
										<UML:TaggedValue tag="virtualInheritance" value="0"/>
										<UML:TaggedValue tag="mb" value="�throws�"/>
									</UML:ModelElement.taggedValue>
								</UML:Dependency>
								<UML:Comment xmi.id="EAID_7FBF19CD_D452_4a01_BF36_6591CF96D1D2" visibility="public" namespace="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="isSpecification" value="false"/>
										<UML:TaggedValue tag="ea_stype" value="Text"/>
										<UML:TaggedValue tag="ea_ntype" value="18"/>
										<UML:TaggedValue tag="version" value="1.0"/>
										<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
										<UML:TaggedValue tag="date_created" value="2005-08-19 11:59:22"/>
										<UML:TaggedValue tag="date_modified" value="2005-08-19 11:59:22"/>
										<UML:TaggedValue tag="gentype" value="&lt;none&gt;"/>
										<UML:TaggedValue tag="tagged" value="0"/>
										<UML:TaggedValue tag="package_name" value="console"/>
										<UML:TaggedValue tag="phase" value="1.0"/>
										<UML:TaggedValue tag="author" value="Jan Borsodi"/>
										<UML:TaggedValue tag="complexity" value="1"/>
										<UML:TaggedValue tag="status" value="Proposed"/>
										<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
									</UML:ModelElement.taggedValue>
								</UML:Comment>
								<UML:Class name="ezcConsoleParameter" xmi.id="EAID_A51EEA3E_1E35_4947_AFF6_4F0ED6B44ADC" visibility="public" namespace="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation" value="Class for handling console parameters. This class allows the complete handling of parameters submitted to a console based application. 
&lt;code&gt;  $paramHandler = new ezcConsoleParameter();  $help = array( 'short' =&gt; 'Get help output.', 'long'  =&gt; 'Retreive help on the usage of this command.', ); $paramHandler-&gt;registerParam('h', 'help', $help);  $file = array( 'type'     =&gt; ezcConsoleParameter::TYPE_STRING 'short'    =&gt; 'Process a file.', 'long'     =&gt; 'Processes a single file.', 'excludes' =&gt; array('d'), ) $paramHandler-&gt;registerParam('f', 'file', $file);  $dir = array( 'type'     =&gt; ezcConsoleParameter::TYPE_STRING 'short'    =&gt; 'Process a directory.', 'long'     =&gt; 'Processes a complete directory.', 'excludes' =&gt; array('f'), ) $paramHandler-&gt;registerParam('d', 'dir', $dir);  $paramHandler-&gt;registerAlias('d', 'directory', 'd');  try { $paramHandler-&gt;processParams(); } catch (ezcConsoleParameterException $e) { if ($e-&gt;code === ezcConsoleParameterException::CODE_DEPENDENCY) { $consoleOut-&gt;outputText( 'Parameter '.$e-&gt;paramName.&quot; may not occur here.\n&quot;, 'error' ); } exit(1); } 
&lt;/code&gt; 
@package ConsoleTools
@link http://www.gnu.org/copyleft/lesser.html}"/>
										<UML:TaggedValue tag="isSpecification" value="false"/>
										<UML:TaggedValue tag="ea_stype" value="Class"/>
										<UML:TaggedValue tag="ea_ntype" value="0"/>
										<UML:TaggedValue tag="version" value="//autogen//
@copyright Copyright (C) 2005 eZ syst"/>
										<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
										<UML:TaggedValue tag="date_created" value="2005-08-12 09:19:36"/>
										<UML:TaggedValue tag="date_modified" value="2005-08-19 11:59:18"/>
										<UML:TaggedValue tag="genfile" value="E:\src\ezcomponents\packages\ConsoleTools\trunk\src\console\parameter.php"/>
										<UML:TaggedValue tag="gentype" value="PHP"/>
										<UML:TaggedValue tag="tagged" value="0"/>
										<UML:TaggedValue tag="package_name" value="console"/>
										<UML:TaggedValue tag="phase" value="1.0"/>
										<UML:TaggedValue tag="author" value="Jan Borsodi"/>
										<UML:TaggedValue tag="complexity" value="1"/>
										<UML:TaggedValue tag="status" value="Proposed"/>
										<UML:TaggedValue tag="eventflags" value="LNK=c4ad;"/>
										<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
									</UML:ModelElement.taggedValue>
									<UML:Classifier.feature>
										<UML:Attribute name="TYPE_NONE" changeable="frozen" visibility="public" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="1"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="0"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{D5D8FF80-8D6C-44c4-AD27-F0E0CB9B5BD9}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="TYPE_INT" changeable="frozen" visibility="public" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="2"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="1"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{28F89EB9-A499-4648-90DC-3E8DCF434FB1}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="TYPE_STRING" changeable="frozen" visibility="public" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="3"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="2"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{3F952DBF-89CE-42c6-92F8-40C2CD29F196}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="paramDefs" changeable="none" visibility="private" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="array()"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="3"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{ABF6E2F3-BAF9-4475-993E-33F590591D7A}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="paramValues" changeable="none" visibility="private" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="array()"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="4"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{8F8762C2-810F-4d79-A1BD-F849872FEFE3}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Operation name="__construct" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Create parameter handler"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="0"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{D4FC7B05-E3A7-4407-BA0D-7201BD7D247B}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-E3A7-4407-BA0D-7201BD7D247B}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="registerParam" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Register a new parameter. Register a new parameter to be recognized by the parser. The short option is a single character, the long option can be any string containing [a-z-]+. Via the options array several options can be defined for a parameter: 
&lt;code&gt; array( 'type'      =&gt; TYPE_NONE,  // option does not expect a value by default, use TYPE_* constants 'default'   =&gt; null,       // no default value by default 'multiple'  =&gt; false,      // are multiple values expected? 'short'     =&gt; '',         // no short description by default 'long'      =&gt; '',         // no help text by default 'depends'   =&gt; array(),    // no depending options by default 'excludes'  =&gt; array(),    // no excluded options by default 'arguments' =&gt; true,       // are arguments allowed? );
&lt;/code&gt;  Attention: Already existing parameter will be overwriten! If an already existing alias is attempted to be registered, the alias will be deleted and replaced by the new parameter.  Parameter shortcuts may only contain one character and will be used in an application call using &quot;-x &lt;value&gt;&quot;. Long parameter versions will be used like &quot;--long-parameter=&lt;value&gt;&quot;.  A parameter can have no value (TYPE_NONE), an integer/string value (TYPE_INT/TYPE_STRING) or multiple of those ('muliple' =&gt; true).  A parameter can also include a rule that disallows arguments, when it's used. Per default arguments are allowed and can be retrieved using the {ezcConsoleParameter::getArguments()} method. 
@see ezcConsoleParameter::unregisterParam() 
@param string $short          Short parameter
@param string $long           Long version of parameter
@param array(string) $options See description 
@return void"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="1"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{4E5D9391-82C1-491b-8220-A30F1771C9AD}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-82C1-491b-8220-A30F1771C9AD}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="short" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{E7A0DD89-4134-4045-810F-CBA1DF7195A7}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="long" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{C77D434A-96A7-415f-9746-D0DCF5E9CC4A}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="options" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="2"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{74478E3D-49A7-4fb4-AD19-19A211A42A39}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="array() "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="registerAlias" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Register an alias to a parameter. Registers a new alias for an existing parameter. Aliases may then be used as if they were real parameters. 
@see ezcConsoleParameter::unregisterAlias() 
@param string $short    Shortcut of the alias
@param string $long     Long version of the alias
@param strung $refShort Reference to an existing param (short) 
@return void"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="2"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{7B98693A-A103-4d8b-AADF-A22492FA9A8C}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-A103-4d8b-AADF-A22492FA9A8C}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="short" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{164FCFA0-C49D-4256-8A55-2AC2A263BDEC}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="long" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{E48733E4-DA93-473f-A01D-78750A591EB3}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="refShort" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="2"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{CED82ED9-00BD-472d-9007-9F91CC856526}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="unregisterParam" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Remove a parameter to be no more supported. Using this function you will remove a parameter. Depending on the second option dependencies to this parameter are handled. Per default, just all dependencies to that actual parameter are removed (false value). Setting it to true will completely unregister all parameters that depend on the current one. 
@see ezcConsoleParameter::registerParam() 
@param string $short Short option name for the parameter to be removed.
@param bool $deps    Handling of dependencies while unregistering. 
@return void 
@link ezcConsoleParameterException::CODE_EXISTANCE}."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="3"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{8136EE82-D67D-4bfd-91F1-E02566F8A818}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-D67D-4bfd-91F1-E02566F8A818}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="short" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{AD1A6E5D-57D3-43dc-8E4E-D456DECC0FC2}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="deps" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{A91EE54C-9830-41e7-8DCF-D1C859C4A1E3}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="false "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="unregisterAlias" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Remove an alias  to be no more supported. Unregisteres an existing alias. 
@see ezcConsoleParameter::registerAlias() 
@param string $short Short option name for the parameter to be removed. 
@return void 
@link ezcConsoleParameterException::CODE_EXISTANCE}."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="4"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{8B23DBB5-0766-4ac9-8542-032AC549652D}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-0766-4ac9-8542-032AC549652D}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="short" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{4BDC2167-2BE3-4f48-890A-96BDB4B55643}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="fromString" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Registeres parameters according to a string specification. Accepts a string like used in eZ publis 3.x to define parameters and registeres all parameters accordingly. String definitions look like this: 
&lt;code&gt; [s:|size:][u:|user:][a:|all:]
&lt;/code&gt;  This string will result in 3 parameters: -s / --size -u / --user -a / --all 
@param string $paramDef Parameter definition string."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="5"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{5348AAEE-E3F2-4c9b-B9FE-2B1050E93D44}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-E3F2-4c9b-B9FE-2B1050E93D44}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="paramDef" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{3485F06D-23DA-4664-9921-45343D320684}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="process" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Process the input parameters. Actually process the input parameters according to the actual settings.  Per default this method uses $argc and $argv for processing. You can override this setting with your own input, if necessary, using the parameters of this method. (Attention, first argument is always the pro gram name itself!)  All exceptions thrown by this method contain an additional attribute &quot;param&quot; which specifies the parameter on which the error occured. 
@param array(int -&gt; string) $args The arguments 
@link ezcConsoleParameterException::CODE_DEPENDENCY}.
@link ezcConsoleParameterException::CODE_EXCLUSION}.
@link ezcConsoleParameterException::CODE_TYPE}. 
@see ezcConsoleParameterException"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="6"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{D5BE7041-F87E-4bee-9B1F-C75291978BC5}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-F87E-4bee-9B1F-C75291978BC5}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="args" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{7632E404-565A-4001-8CAA-EC25E1FA6EB2}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="null "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="getParam" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Receive the data for a specific parameter. Returns the data sumbitted for a specific parameter. 
@param string $short The parameter shortcut 
@return mixed String value of the parameter, true if set without value or false on not set."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="7"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{F2658D07-C9FB-475f-9A79-ED7211E8BBC0}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-C9FB-475f-9A79-ED7211E8BBC0}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="short" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{E12581BF-6AE3-497f-A787-7EFD7C32C0AB}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="getArguments" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Returns arguments provided to the program. This method returns all arguments provided to a program in an integer indexed array. Arguments are sorted in the way they are submitted to the program. You can disable arguments through the 'arguments' flag of a parameter, if you want to disallow arguments.  Arguments are either the last part of the program call (if the last parameter is not a 'multiple' one) or divided via the '--' method which is commonly used on Unix (if the last parameter accepts multiple values this is required). 
@return array(int =&gt; string) Arguments."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="8"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{56CDC70A-D8A8-465a-937B-DC4ED0B8A7BA}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-D8A8-465a-937B-DC4ED0B8A7BA}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="getHelp" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Returns array of help info on parameters. If given a parameter shortcut, returns an array of several help information: 
&lt;code&gt; array( 'short' =&gt; &lt;string&gt;, 'long'  =&gt; &lt;string&gt;, 'usage' =&gt; &lt;string&gt;, // Autogenerated from the rules for the parameter 'alias' =&gt; &lt;string&gt;, // Info on the aliases of a parameter );
&lt;/code&gt;  If no parameter shortcut given, returns an array of above described arrays with a key for every parameter shortcut defined. 
@param string $short Short cut value of the parameter.
@return array(string) See description. 
@link ezcConsoleParameterException::CODE_EXISTANCE}."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="9"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{3375BF23-9AEF-42cd-907F-14FDF5CD7ECA}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-9AEF-42cd-907F-14FDF5CD7ECA}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="short" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{2835C2F3-898D-4063-94FC-1EA7A8AF9589}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="null "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="getHelpText" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Returns string of help info on parameters. If given a parameter shortcut, returns a string of help information: 
&lt;code&gt;  Usage: -&lt;short&gt; / --&lt;long&gt;= &lt;type&gt; &lt;usageinfo&gt;
&lt;shortdesc&gt;
&lt;longdesc&gt;
&lt;dependencies&gt; / &lt;exclusions&gt; 
&lt;/code&gt;  If not given a parameter shortcut, returns a string of global help information: 
&lt;code&gt;  Usage: [-&lt;short&gt;] [-&lt;short&gt;] ... -&lt;short&gt; / --&lt;long&gt;  &lt;type&gt;  &lt;default&gt;   &lt;shortdesc&gt; ... 
&lt;/code&gt; 
@param string $short Shortcut of the parameter to get help text for. 
@return string See description. 
@link ezcConsoleParameterException::CODE_EXISTANCE}."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="10"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{E66F0967-79A7-47a6-ADF3-079AAC380175}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-79A7-47a6-ADF3-079AAC380175}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="short" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{21F7BD1F-E7B3-4087-8C4C-60B766E57DB4}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="null "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
									</UML:Classifier.feature>
								</UML:Class>
								<UML:Dependency client="EAID_A51EEA3E_1E35_4947_AFF6_4F0ED6B44ADC" supplier="EAID_C6C700C8_814F_49fc_9B9C_1123BB0B4815" xmi.id="EAID_F959A77C_CEDF_4555_A103_9EADB2730D13" visibility="public">
									<UML:ModelElement.stereotype>
										<UML:Stereotype name="throws"/>
									</UML:ModelElement.stereotype>
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="style" value="2"/>
										<UML:TaggedValue tag="ea_type" value="Dependency"/>
										<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
										<UML:TaggedValue tag="linemode" value="2"/>
										<UML:TaggedValue tag="linecolor" value="-1"/>
										<UML:TaggedValue tag="linewidth" value="0"/>
										<UML:TaggedValue tag="seqno" value="0"/>
										<UML:TaggedValue tag="stereotype" value="throws"/>
										<UML:TaggedValue tag="headStyle" value="0"/>
										<UML:TaggedValue tag="lineStyle" value="0"/>
										<UML:TaggedValue tag="conditional" value="�throws�"/>
										<UML:TaggedValue tag="src_visibility" value="Public"/>
										<UML:TaggedValue tag="src_aggregation" value="0"/>
										<UML:TaggedValue tag="src_isOrdered" value="false"/>
										<UML:TaggedValue tag="src_isNavigable" value="false"/>
										<UML:TaggedValue tag="src_containment" value="Unspecified"/>
										<UML:TaggedValue tag="dst_visibility" value="Public"/>
										<UML:TaggedValue tag="dst_aggregation" value="0"/>
										<UML:TaggedValue tag="dst_isOrdered" value="false"/>
										<UML:TaggedValue tag="dst_isNavigable" value="true"/>
										<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
										<UML:TaggedValue tag="privatedata5" value="SX=0;SY=0;EX=0;EY=0;EDGE=1;"/>
										<UML:TaggedValue tag="virtualInheritance" value="0"/>
										<UML:TaggedValue tag="mb" value="�throws�"/>
									</UML:ModelElement.taggedValue>
								</UML:Dependency>
								<UML:Class name="ezcConsoleTable" xmi.id="EAID_A9F2232F_845A_4da2_A329_950ED3CDB676" visibility="public" namespace="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation" value="Creating tables to be printed to the console. 
&lt;code&gt;  ... creating ezcConsoleOutput object  $options = array( 'lineColorHead' =&gt; 'red',  // Make header rows surrounded by red lines );  $table = new ezcConsoleTable($out, array('width' =&gt; 60, 'cols' = 3), $options); Generate a header row: $table-&gt;addRowHead(array('First col', 'Second col', 'Third col')); Right column will be the largest $table-&gt;addRow(array('Data', 'Data', 'Very very very very very long data')); $table-&gt;output(); 
&lt;/code&gt;  
@see ezcConsoleOutput
@package ConsoleTools
@link http://www.gnu.org/copyleft/lesser.html}"/>
										<UML:TaggedValue tag="isSpecification" value="false"/>
										<UML:TaggedValue tag="ea_stype" value="Class"/>
										<UML:TaggedValue tag="ea_ntype" value="0"/>
										<UML:TaggedValue tag="version" value="//autogen//
@copyright Copyright (C) 2005 eZ syst"/>
										<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
										<UML:TaggedValue tag="date_created" value="2005-08-12 09:19:36"/>
										<UML:TaggedValue tag="date_modified" value="2005-08-19 11:42:35"/>
										<UML:TaggedValue tag="genfile" value="E:\src\ezcomponents\packages\ConsoleTools\trunk\src\console\table.php"/>
										<UML:TaggedValue tag="gentype" value="PHP"/>
										<UML:TaggedValue tag="tagged" value="0"/>
										<UML:TaggedValue tag="package_name" value="console"/>
										<UML:TaggedValue tag="phase" value="1.0"/>
										<UML:TaggedValue tag="author" value="Jan Borsodi"/>
										<UML:TaggedValue tag="complexity" value="1"/>
										<UML:TaggedValue tag="status" value="Proposed"/>
										<UML:TaggedValue tag="eventflags" value="LNK=7154;"/>
										<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
									</UML:ModelElement.taggedValue>
									<UML:Classifier.feature>
										<UML:Attribute name="WRAP_AUTO" changeable="frozen" visibility="public" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="1"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="Automatically wrap text to fit into a column.
@see ezcConsoleTable::$options"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="0"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{0A51B2F7-3155-483c-A77F-CBAD7E46755C}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="WRAP_NONE" changeable="frozen" visibility="public" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="2"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="Do not wrap text. Columns will be extended to fit the largest text. ATTENTION: This is riscy!
@see ezcConsoleTable::$options"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="1"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{F2C5B9CA-43B7-4586-8854-7E9333D246E5}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="WRAP_CUT" changeable="frozen" visibility="public" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="3"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="Text will be cut to fit into a column.
@see ezcConsoleTable::$options"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="2"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{2F9D32F3-EFCD-4003-BB1E-294C6411C738}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="settings" changeable="none" visibility="protected" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="Settings for the table. 
&lt;code&gt; array( 'width' =&gt; &lt;int&gt;,       // Width of the table 'cols'  =&gt; &lt;int&gt;,       // Number of columns );
&lt;/code&gt; 
@var array(string)"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="3"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{76030D04-2AD9-406d-B80E-BFD3249F77C2}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="options" changeable="none" visibility="protected" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="array(
        'colWidth'  =&gt; 'auto',      // Automatically define column width. Else array of width
                                    // per column like array( 0 =&gt; 10, 1 =&gt; 15, 2 =&gt; 5,...);
        'colWrap'   =&gt; WRAP_AUTO,
        
        'lineTop'       =&gt; '-',
        'lineBottom'    =&gt; '-',
        'lineLeft'      =&gt; '|',
        'lineRight'     =&gt; '|',

        'cornerTopLeft'     =&gt; '+',
        'cornerBottomLeft'  =&gt; '+',
        'cornerTopRight'    =&gt; '+',
        'cornerBottomRight' =&gt; '+',

        'lineColor'     =&gt; 'default',
        'lineColorHead' =&gt; 'default',
    )"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="Options for the table. 
@var array(string)"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="4"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{86623909-E3BE-42e2-9592-C246FCA6B2E0}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="outputHandler" changeable="none" visibility="protected" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="The ezcConsoleOutput object to use. 
@var ezcConsoleOutput"/>
												<UML:TaggedValue tag="type" value="ezcConsoleOutput"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="5"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{5DEF0E6B-4A38-4bc6-B053-6C114AE6EC99}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Operation name="__construct" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Creates a new table. 
@param ezcConsoleOutput $outHandler Output handler to utilize
@param array(string) $settings      Settings
@param array(string) $options       Options 
@see ezcConsoleTable::$settings
@see ezcConsoleTable::$options"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="0"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{0FAA4542-2113-4eb5-8BB0-F021ABAFE110}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-2113-4eb5-8BB0-F021ABAFE110}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="outHandler" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="ezcConsoleOutput"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="classifier" value="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
														<UML:TaggedValue tag="ea_guid" value="{F8D81FCD-DA4E-4f98-9A86-FF9C68B7AD37}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="settings" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{7145A29B-B5D3-4bf4-93FB-00406EFA5604}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="options" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="2"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{1C4C87DC-B684-43de-B069-E72D7A2EBFFA}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="array() "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="create" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Create an entire table. Creates an entire table from an array of data. 
&lt;code&gt; array( 0 =&gt; array( 0 =&gt; &lt;string&gt;, 1 =&gt; &lt;string&gt;, 2 =&gt; &lt;string&gt;,... ), 1 =&gt; array( 0 =&gt; &lt;string&gt;, 1 =&gt; &lt;string&gt;, 2 =&gt; &lt;string&gt;,... ), 2 =&gt; array( 0 =&gt; &lt;string&gt;, 1 =&gt; &lt;string&gt;, 2 =&gt; &lt;string&gt;,... ), ... );
&lt;/code&gt; 
@see ezcConsoleTable::__construct()
@see ezcConsoleTable::$settings
@see ezcConsoleTable::$options 
@param array(int -&gt; string) $data   Data for the table
@param ezcConsoleOutput $outHandler Output handler to utilize
@param array(string) $settings      Settings
@param array(string) $options       Options"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="static" value="1"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="1"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{4B1BEFAA-1776-4886-874E-A2D27EB4DE58}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-1776-4886-874E-A2D27EB4DE58}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="data" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{251C8593-3B19-4008-9737-C38D262CD29E}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="outHandler" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="ezcConsoleOutput"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="classifier" value="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
														<UML:TaggedValue tag="ea_guid" value="{5D5A3932-3AB7-44fa-AA30-715F904FDE90}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="settings" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="2"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{B21906E2-A976-45b0-96F8-E38B83092EED}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="options" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="3"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{3C37112F-2CB2-4742-AEDE-C9D9EF42655A}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="array() "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="addRow" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Add a row of data to the table. Add a row of data to the table. A row looks like this: 
&lt;code&gt; array( 0 =&gt; &lt;string&gt;, 1 =&gt; &lt;string&gt;,... );
&lt;/code&gt;  The options parameter overrides the globally set options. 
@param array(int =&gt; string) $rowData The data for the row
@param array(string) $options        Override {@link eczConsoleTable::$options}
@return int Number of the row."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="2"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{D1FD2110-460D-4e2e-BEBF-9B635BBE64CF}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-460D-4e2e-BEBF-9B635BBE64CF}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="rowData" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{1A102984-09C4-4b64-9937-5874500BA97A}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="options" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{817380E2-F1B4-4cd6-966A-B554880456EB}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="addHeadRow" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Add a header row to the table. Add a header row to the table. Format {@link ezcConsoleTable::addRow()}.  The options parameter overrides the globally set options. 
@param array(int =&gt; string) $rowData The row data
@param array(string) $options        Override {@link eczConsoleTable::$options}
@return int Number of the row."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="3"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{4191F84C-57D0-4efb-987F-390AC8CDB51E}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-57D0-4efb-987F-390AC8CDB51E}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="rowData" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{E5DDE536-85FC-4d85-BA57-E96ABD582AB4}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="options" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{D71BA1BF-7EDD-4083-83FE-EEF03380B706}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="setCell" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Set data for specific cell. Sets the data for a specific cell. If the row referenced does not exist yet, it's created with empty values. If previous rows do not exist, they are created with empty values. Existing cell data is overwriten. 
@param int $row         Row number.
@param int $column      Column number.
@param string $cellData Data for the cell."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="4"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{7B0762B7-35D9-431a-BE70-5C62D5F82098}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-35D9-431a-BE70-5C62D5F82098}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="row" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{21C16A8B-D5CE-48d9-85AD-EAEFAEC0B6CB}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="column" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{C02E910F-C8D8-4aac-AA2C-05961B6C3438}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="cellData" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="2"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{10D31C1D-2079-4d76-9E16-B4706E1687FA}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="makeHeadRow" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Make a row to a header row. Defines the row with the specified number to be a header row. 
@param int $row Number of the row to affect. 
@see eczConsoleTable::setDefaultRow()"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="5"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{361A1769-7311-461d-9AEC-A52D748E0D5D}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-7311-461d-9AEC-A52D748E0D5D}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="row" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{3EF5282D-89D7-4c18-B147-99E2ADA02740}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="makeDefaultRow" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Make a row to a default row. Defines the row with the specified number to be a default row. (Used to bring header rows back to normal.) 
@param int $row Number of the row to affect. 
@see eczConsoleTable::setHeadRow()"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="6"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{786429A3-71B7-49a7-ADFB-68D3FADC61D4}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-71B7-49a7-ADFB-68D3FADC61D4}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="row" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{93466362-883D-4c69-A351-78B7C02F14E7}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="getTable" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Returns the table in a string. Returns the entire table as a string. 
@return string"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="7"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{C7B4159C-0EBB-4626-B678-B213CAB8A270}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-0EBB-4626-B678-B213CAB8A270}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="outputTable" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Output the table. Prints the complete table to the console. 
@return void"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="8"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{BF438275-C703-40a7-975E-3FD09369025D}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-C703-40a7-975E-3FD09369025D}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
									</UML:Classifier.feature>
								</UML:Class>
								<UML:Class name="ezcConsoleProgressbar" xmi.id="EAID_EE63FC0D_D590_4d0f_9F83_338683F8E000" visibility="public" namespace="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="documentation" value="Creating and maintaining progressbars to be printed to the console. 
@todo The author of the PEAR package &quot;Console_ProgressBar&quot; accepted us to take over his code from that package and improve it for our needs. {@link http://pear.php.net/package/console_progressbar} 
&lt;code&gt;  ... creating ezcConsoleOutput object  $set = array('max' =&gt; 150, 'step' =&gt; 5); $opt = array( 'emptyChar'     =&gt; '-', 'progressChar'  =&gt; '#', 'formatString'  =&gt; 'Uploading file '.$myFilename.' %act%/%max% kb [%bar%] %percent%%', ); $progress = new ezcConsoleProgressbar($out, $set, $opt);  while( $file-&gt;upload() ) { $progress-&gt;advance(); } $progress-&gt;finish(); $out-&gt;outputText(&quot;Successfully uploaded $myFilename.\n&quot;, 'success'); 
&lt;/code&gt;  
@package ConsoleTools
@link http://www.gnu.org/copyleft/lesser.html}"/>
										<UML:TaggedValue tag="isSpecification" value="false"/>
										<UML:TaggedValue tag="ea_stype" value="Class"/>
										<UML:TaggedValue tag="ea_ntype" value="0"/>
										<UML:TaggedValue tag="version" value="//autogen//
@copyright Copyright (C) 2005 eZ syst"/>
										<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
										<UML:TaggedValue tag="date_created" value="2005-08-12 09:19:35"/>
										<UML:TaggedValue tag="date_modified" value="2005-08-19 11:42:35"/>
										<UML:TaggedValue tag="genfile" value="E:\src\ezcomponents\packages\ConsoleTools\trunk\src\console\progressbar.php"/>
										<UML:TaggedValue tag="gentype" value="PHP"/>
										<UML:TaggedValue tag="tagged" value="0"/>
										<UML:TaggedValue tag="package_name" value="console"/>
										<UML:TaggedValue tag="phase" value="1.0"/>
										<UML:TaggedValue tag="author" value="Jan Borsodi"/>
										<UML:TaggedValue tag="complexity" value="1"/>
										<UML:TaggedValue tag="status" value="Proposed"/>
										<UML:TaggedValue tag="eventflags" value="LNK=e6a3;"/>
										<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
									</UML:ModelElement.taggedValue>
									<UML:Classifier.feature>
										<UML:Attribute name="settings" changeable="none" visibility="protected" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="Settings for the progress bar. 
&lt;code&gt; array( 'max'   =&gt; &lt;int&gt;    // Value to progress to 'step'  =&gt; &lt;int&gt;    // Stepwidth );
&lt;/code&gt; 
@var array(string)"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="0"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{30C94C5C-E267-49fd-8491-19E7840E30FE}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="options" changeable="none" visibility="protected" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression body="array(
        'barChar'       =&gt; '+',     // Char to fill progress bar with
        'emptyChar'     =&gt; ' ',     // Char to fill empty space in progress bar with
        'progressChar'  =&gt; '&gt;',     // Right most char of the progress bar filling
        'formatString'  =&gt; '[%bar%] %percent% %',   // Format string
        'width'         =&gt; 100,     // Maximum width of the progressbar
    )"/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="eaxmiid0"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="Options 
&lt;code&gt; array( 'barChar'       =&gt; '+',     // Char to fill progress bar with 'emptyChar'     =&gt; ' ',     // Char for empty space in progress bar 'progressChar'  =&gt; '&gt;',     // Progress char of the bar filling 'formatString'  =&gt; '[%bar%] %percent%%',   // == &quot;[+++++&gt;    ] 60%&quot; 'width'         =&gt; 10,      // Maximum width of the progressbar );
&lt;/code&gt;  'formatString' can contain the following placeholders: '%percent%' =&gt; Actual percent value '%max%'     =&gt; Maximum value '%act%'     =&gt; Actual value '%bar%'     =&gt; The actual progressbar 
@var array(string)"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="1"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{59522000-4D0E-4579-B25A-CBFCCB2A1B25}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Attribute name="outputHandler" changeable="none" visibility="protected" ownerScope="instance" targetScope="instance">
											<UML:Attribute.initialValue>
												<UML:Expression/>
											</UML:Attribute.initialValue>
											<UML:StructuralFeature.type>
												<UML:Classifier xmi.idref="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
											</UML:StructuralFeature.type>
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="description" value="The ezcConsoleOutput object to use. 
@var ezcConsoleOutput"/>
												<UML:TaggedValue tag="type" value="ezcConsoleOutput"/>
												<UML:TaggedValue tag="length" value="0"/>
												<UML:TaggedValue tag="ordered" value="0"/>
												<UML:TaggedValue tag="precision" value="0"/>
												<UML:TaggedValue tag="scale" value="0"/>
												<UML:TaggedValue tag="collection" value="false"/>
												<UML:TaggedValue tag="position" value="2"/>
												<UML:TaggedValue tag="lowerBound" value="1"/>
												<UML:TaggedValue tag="upperBound" value="1"/>
												<UML:TaggedValue tag="ea_guid" value="{38166CA5-115F-4705-A391-4B122E210FED}"/>
												<UML:TaggedValue tag="styleex" value="volatile=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Attribute>
										<UML:Operation name="__construct" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Creates a new progress bar. 
@param ezcConsoleOutput $outHandler Handler to utilize for output
@param array(string) $settings      Settings
@param array(string) $options       Options 
@see ezcConsoleTable::$settings
@see ezcConsoleTable::$options"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="0"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{025207AC-75F2-44ba-A143-ABDFD4688F5E}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-75F2-44ba-A143-ABDFD4688F5E}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="outHandler" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="ezcConsoleOutput"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="classifier" value="EAID_65A37092_56CE_4e5a_8C30_366469BD8468"/>
														<UML:TaggedValue tag="ea_guid" value="{C82DE637-5B3C-439f-B9C5-348CB3BD2CB5}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="settings" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="1"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{92DDFC0F-A1B8-4511-B369-99A6DCB9E3B0}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="options" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="2"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{453DB7BB-CEA5-4f96-A0F5-F2CB80C3DC34}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="array() "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="start" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Start the progress bar Starts the progess bar and sticks it to the current line. No output will be done yet. Call {@link ezcConsoleProgressbar::output()} to print the bar. 
@return void"/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="1"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{A1F4087D-6D9E-40dc-BC9B-03AA07E43B13}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-6D9E-40dc-BC9B-03AA07E43B13}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="output" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Draw the progress bar. Prints the progressbar to the screen. If start() has not been called yet, the current line is used for {@link ezcConsolProgressbar::start()}."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="2"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{CDE2D0A5-705A-4ee3-8A73-BA1FC8FC287C}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-705A-4ee3-8A73-BA1FC8FC287C}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="advance" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Advance the progress bar. Advances the progress bar by one step. Redraws the bar by default, using the {@link ezcConsoleProgressbar::output()} method. 
@param bool Whether to redraw the bar immediatelly."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="3"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{B5F4C6F1-1E03-4b51-8D29-FF055E2DBB4C}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-1E03-4b51-8D29-FF055E2DBB4C}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
												<UML:Parameter name="redraw" kind="in" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{C3DC4346-3E0A-4535-BF94-C15030FDA033}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression body="true "/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
										<UML:Operation name="finish" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="Finish the progress bar. Finishes the bar (jump to 100% if not happened yet,...) and jumps to the next line to allow new output. Also resets the values of the output handler used, if changed."/>
												<UML:TaggedValue tag="type" value="var"/>
												<UML:TaggedValue tag="const" value="false"/>
												<UML:TaggedValue tag="synchronised" value="0"/>
												<UML:TaggedValue tag="concurrency" value="Sequential"/>
												<UML:TaggedValue tag="position" value="4"/>
												<UML:TaggedValue tag="returnarray" value="0"/>
												<UML:TaggedValue tag="pure" value="0"/>
												<UML:TaggedValue tag="ea_guid" value="{AE268367-D849-4990-8415-A31BCD928C6C}"/>
											</UML:ModelElement.taggedValue>
											<UML:BehavioralFeature.parameter>
												<UML:Parameter kind="return" visibility="public">
													<UML:Parameter.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:Parameter.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="pos" value="0"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{RETURNID-D849-4990-8415-A31BCD928C6C}"/>
													</UML:ModelElement.taggedValue>
													<UML:Parameter.defaultValue>
														<UML:Expression/>
													</UML:Parameter.defaultValue>
												</UML:Parameter>
											</UML:BehavioralFeature.parameter>
										</UML:Operation>
									</UML:Classifier.feature>
								</UML:Class>
								<UML:Package name="output" xmi.id="EAPK_4D026C21_9F61_4699_BBE9_ED9516605496" isRoot="false" isLeaf="false" isAbstract="false" visibility="public">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="created" value="2005-08-12 00:00:00"/>
										<UML:TaggedValue tag="modified" value="2005-08-12 00:00:00"/>
										<UML:TaggedValue tag="iscontrolled" value="FALSE"/>
										<UML:TaggedValue tag="lastloaddate" value="2005-08-18 14:20:19"/>
										<UML:TaggedValue tag="lastsavedate" value="2005-08-18 14:20:19"/>
										<UML:TaggedValue tag="isprotected" value="FALSE"/>
										<UML:TaggedValue tag="usedtd" value="FALSE"/>
										<UML:TaggedValue tag="logxml" value="FALSE"/>
										<UML:TaggedValue tag="codepath" value="E:\src\ezcomponents\ConsoleTools\console\output"/>
										<UML:TaggedValue tag="batchsave" value="0"/>
										<UML:TaggedValue tag="batchload" value="0"/>
										<UML:TaggedValue tag="phase" value="1.0"/>
										<UML:TaggedValue tag="status" value="Proposed"/>
										<UML:TaggedValue tag="author" value="Jan Borsodi"/>
										<UML:TaggedValue tag="complexity" value="1"/>
										<UML:TaggedValue tag="ea_stype" value="Public"/>
									</UML:ModelElement.taggedValue>
									<UML:Namespace.ownedElement>
										<UML:Class name="ezcConsoleOutputException" xmi.id="EAID_4B7CE667_749A_4dde_BE45_7CBFB5519DF5" visibility="public" namespace="EAPK_4D026C21_9F61_4699_BBE9_ED9516605496" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="General exception for use in {@see ezcConsoleOutput} class. 
@package ConsoleTools
@link http://www.gnu.org/copyleft/lesser.html}
@todo Error codes to be defined."/>
												<UML:TaggedValue tag="isSpecification" value="false"/>
												<UML:TaggedValue tag="ea_stype" value="Class"/>
												<UML:TaggedValue tag="ea_ntype" value="0"/>
												<UML:TaggedValue tag="version" value="//autogen//
@copyright Copyright (C) 2005 eZ syst"/>
												<UML:TaggedValue tag="package" value="EAPK_4D026C21_9F61_4699_BBE9_ED9516605496"/>
												<UML:TaggedValue tag="date_created" value="2005-08-12 09:19:34"/>
												<UML:TaggedValue tag="date_modified" value="2005-08-19 11:42:36"/>
												<UML:TaggedValue tag="genfile" value="E:\src\ezcomponents\packages\ConsoleTools\trunk\src\console\output\exception.php"/>
												<UML:TaggedValue tag="gentype" value="PHP"/>
												<UML:TaggedValue tag="tagged" value="0"/>
												<UML:TaggedValue tag="package_name" value="output"/>
												<UML:TaggedValue tag="phase" value="1.0"/>
												<UML:TaggedValue tag="author" value="Jan Borsodi"/>
												<UML:TaggedValue tag="complexity" value="1"/>
												<UML:TaggedValue tag="status" value="Proposed"/>
												<UML:TaggedValue tag="eventflags" value="LNK=f7da;"/>
												<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
											</UML:ModelElement.taggedValue>
										</UML:Class>
										<UML:Generalization subtype="EAID_4B7CE667_749A_4dde_BE45_7CBFB5519DF5" supertype="EAID_94807F39_6924_4b6f_BABD_B861BF17BDEE" xmi.id="EAID_DAC016F2_428C_4cba_88D3_77BFF3833AA6" visibility="public">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="style" value="3"/>
												<UML:TaggedValue tag="ea_type" value="Generalization"/>
												<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
												<UML:TaggedValue tag="linemode" value="3"/>
												<UML:TaggedValue tag="linecolor" value="-1"/>
												<UML:TaggedValue tag="linewidth" value="0"/>
												<UML:TaggedValue tag="seqno" value="0"/>
												<UML:TaggedValue tag="headStyle" value="0"/>
												<UML:TaggedValue tag="lineStyle" value="0"/>
												<UML:TaggedValue tag="src_visibility" value="Public"/>
												<UML:TaggedValue tag="src_aggregation" value="0"/>
												<UML:TaggedValue tag="src_isOrdered" value="false"/>
												<UML:TaggedValue tag="src_isNavigable" value="false"/>
												<UML:TaggedValue tag="src_containment" value="Unspecified"/>
												<UML:TaggedValue tag="dst_visibility" value="Public"/>
												<UML:TaggedValue tag="dst_aggregation" value="0"/>
												<UML:TaggedValue tag="dst_isOrdered" value="false"/>
												<UML:TaggedValue tag="dst_isNavigable" value="true"/>
												<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
												<UML:TaggedValue tag="$ea_xref_property" value="$XREFPROP=$XID={1E9DFB38-D0E8-4d88-900A-3C771B1DF560}$XID;$NAM=CustomProperties$NAM;$TYP=connector property$TYP;$VIS=Public$VIS;$DES=@PROP=@NAME=isSubstitutable@ENDNAME;@TYPE=boolean@ENDTYPE;@VALU=@ENDVALU;@PRMT=@ENDPRMT;@ENDPROP;$DES;$CLT={DAC016F2-428C-4cba-88D3-77BFF3833AA6}$CLT;$SUP=&lt;none&gt;$SUP;$ENDXREF;"/>
												<UML:TaggedValue tag="virtualInheritance" value="0"/>
											</UML:ModelElement.taggedValue>
										</UML:Generalization>
									</UML:Namespace.ownedElement>
								</UML:Package>
								<UML:Package name="parameter" xmi.id="EAPK_4C33B478_0B96_4ef1_B7E8_0F64B60CC675" isRoot="false" isLeaf="false" isAbstract="false" visibility="public">
									<UML:ModelElement.taggedValue>
										<UML:TaggedValue tag="created" value="2005-08-12 00:00:00"/>
										<UML:TaggedValue tag="modified" value="2005-08-12 00:00:00"/>
										<UML:TaggedValue tag="iscontrolled" value="FALSE"/>
										<UML:TaggedValue tag="lastloaddate" value="2005-08-18 14:20:19"/>
										<UML:TaggedValue tag="lastsavedate" value="2005-08-18 14:20:19"/>
										<UML:TaggedValue tag="isprotected" value="FALSE"/>
										<UML:TaggedValue tag="usedtd" value="FALSE"/>
										<UML:TaggedValue tag="logxml" value="FALSE"/>
										<UML:TaggedValue tag="codepath" value="E:\src\ezcomponents\ConsoleTools\console\parameter"/>
										<UML:TaggedValue tag="batchsave" value="0"/>
										<UML:TaggedValue tag="batchload" value="0"/>
										<UML:TaggedValue tag="phase" value="1.0"/>
										<UML:TaggedValue tag="status" value="Proposed"/>
										<UML:TaggedValue tag="author" value="Jan Borsodi"/>
										<UML:TaggedValue tag="complexity" value="1"/>
										<UML:TaggedValue tag="ea_stype" value="Public"/>
									</UML:ModelElement.taggedValue>
									<UML:Namespace.ownedElement>
										<UML:Class name="ezcConsoleParameterException" xmi.id="EAID_C6C700C8_814F_49fc_9B9C_1123BB0B4815" visibility="public" namespace="EAPK_4C33B478_0B96_4ef1_B7E8_0F64B60CC675" isRoot="false" isLeaf="false" isAbstract="false" isActive="false">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="documentation" value="General exception for use in {@see ezcConsoleParameter} class. Adds an additional field 'param' to the exception which indicates with which parameter something went wrong. 
@package ConsoleTools
@link http://www.gnu.org/copyleft/lesser.html}"/>
												<UML:TaggedValue tag="isSpecification" value="false"/>
												<UML:TaggedValue tag="ea_stype" value="Class"/>
												<UML:TaggedValue tag="ea_ntype" value="0"/>
												<UML:TaggedValue tag="version" value="//autogen//
@copyright Copyright (C) 2005 eZ syst"/>
												<UML:TaggedValue tag="package" value="EAPK_4C33B478_0B96_4ef1_B7E8_0F64B60CC675"/>
												<UML:TaggedValue tag="date_created" value="2005-08-12 09:19:35"/>
												<UML:TaggedValue tag="date_modified" value="2005-08-19 11:42:36"/>
												<UML:TaggedValue tag="genfile" value="E:\src\ezcomponents\packages\ConsoleTools\trunk\src\console\parameter\exception.php"/>
												<UML:TaggedValue tag="gentype" value="PHP"/>
												<UML:TaggedValue tag="tagged" value="0"/>
												<UML:TaggedValue tag="package_name" value="parameter"/>
												<UML:TaggedValue tag="phase" value="1.0"/>
												<UML:TaggedValue tag="author" value="Jan Borsodi"/>
												<UML:TaggedValue tag="complexity" value="1"/>
												<UML:TaggedValue tag="status" value="Proposed"/>
												<UML:TaggedValue tag="eventflags" value="LNK=c4ad;"/>
												<UML:TaggedValue tag="style" value="BackColor=-1;BorderColor=-1;BorderWidth=-1;FontColor=-1;VSwimLanes=0;HSwimLanes=0;BorderStyle=0;"/>
											</UML:ModelElement.taggedValue>
											<UML:Classifier.feature>
												<UML:Attribute name="CODE_EXISTANCE" changeable="frozen" visibility="public" ownerScope="instance" targetScope="instance">
													<UML:Attribute.initialValue>
														<UML:Expression body="1"/>
													</UML:Attribute.initialValue>
													<UML:StructuralFeature.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:StructuralFeature.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="description" value="Required parameter/alias does not exist."/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="length" value="0"/>
														<UML:TaggedValue tag="ordered" value="0"/>
														<UML:TaggedValue tag="precision" value="0"/>
														<UML:TaggedValue tag="scale" value="0"/>
														<UML:TaggedValue tag="collection" value="false"/>
														<UML:TaggedValue tag="position" value="0"/>
														<UML:TaggedValue tag="lowerBound" value="1"/>
														<UML:TaggedValue tag="upperBound" value="1"/>
														<UML:TaggedValue tag="ea_guid" value="{789D7420-324A-40a7-A24D-329181F3DD7E}"/>
														<UML:TaggedValue tag="styleex" value="volatile=0;"/>
													</UML:ModelElement.taggedValue>
												</UML:Attribute>
												<UML:Attribute name="CODE_EXCLUSION" changeable="frozen" visibility="public" ownerScope="instance" targetScope="instance">
													<UML:Attribute.initialValue>
														<UML:Expression body="2"/>
													</UML:Attribute.initialValue>
													<UML:StructuralFeature.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:StructuralFeature.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="description" value="Exclusion rule defined for parameter not met."/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="length" value="0"/>
														<UML:TaggedValue tag="ordered" value="0"/>
														<UML:TaggedValue tag="precision" value="0"/>
														<UML:TaggedValue tag="scale" value="0"/>
														<UML:TaggedValue tag="collection" value="false"/>
														<UML:TaggedValue tag="position" value="1"/>
														<UML:TaggedValue tag="lowerBound" value="1"/>
														<UML:TaggedValue tag="upperBound" value="1"/>
														<UML:TaggedValue tag="ea_guid" value="{599F1D6D-F553-4e22-94CE-CADDE6D393C7}"/>
														<UML:TaggedValue tag="styleex" value="volatile=0;"/>
													</UML:ModelElement.taggedValue>
												</UML:Attribute>
												<UML:Attribute name="CODE_DEPENDENCY" changeable="frozen" visibility="public" ownerScope="instance" targetScope="instance">
													<UML:Attribute.initialValue>
														<UML:Expression body="3"/>
													</UML:Attribute.initialValue>
													<UML:StructuralFeature.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:StructuralFeature.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="description" value="Dependency rule defined for parameter not met."/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="length" value="0"/>
														<UML:TaggedValue tag="ordered" value="0"/>
														<UML:TaggedValue tag="precision" value="0"/>
														<UML:TaggedValue tag="scale" value="0"/>
														<UML:TaggedValue tag="collection" value="false"/>
														<UML:TaggedValue tag="position" value="2"/>
														<UML:TaggedValue tag="lowerBound" value="1"/>
														<UML:TaggedValue tag="upperBound" value="1"/>
														<UML:TaggedValue tag="ea_guid" value="{DFEB09B3-C95A-414e-ABDA-73ED66C4DCC2}"/>
														<UML:TaggedValue tag="styleex" value="volatile=0;"/>
													</UML:ModelElement.taggedValue>
												</UML:Attribute>
												<UML:Attribute name="CODE_TYPE" changeable="frozen" visibility="public" ownerScope="instance" targetScope="instance">
													<UML:Attribute.initialValue>
														<UML:Expression body="4"/>
													</UML:Attribute.initialValue>
													<UML:StructuralFeature.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:StructuralFeature.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="description" value="Type rule defined for parameter not met."/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="length" value="0"/>
														<UML:TaggedValue tag="ordered" value="0"/>
														<UML:TaggedValue tag="precision" value="0"/>
														<UML:TaggedValue tag="scale" value="0"/>
														<UML:TaggedValue tag="collection" value="false"/>
														<UML:TaggedValue tag="position" value="3"/>
														<UML:TaggedValue tag="lowerBound" value="1"/>
														<UML:TaggedValue tag="upperBound" value="1"/>
														<UML:TaggedValue tag="ea_guid" value="{D6FC51B1-396D-43b4-865B-B5C2267BB6E1}"/>
														<UML:TaggedValue tag="styleex" value="volatile=0;"/>
													</UML:ModelElement.taggedValue>
												</UML:Attribute>
												<UML:Attribute name="paramName" changeable="none" visibility="public" ownerScope="instance" targetScope="instance">
													<UML:Attribute.initialValue>
														<UML:Expression/>
													</UML:Attribute.initialValue>
													<UML:StructuralFeature.type>
														<UML:Classifier xmi.idref="eaxmiid0"/>
													</UML:StructuralFeature.type>
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="description" value="Parameter this exception is about. Shortcut name of the parameter this exception deals with. 
@see ezcConsoleParameter::registerParam() 
@var string"/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="length" value="0"/>
														<UML:TaggedValue tag="ordered" value="0"/>
														<UML:TaggedValue tag="precision" value="0"/>
														<UML:TaggedValue tag="scale" value="0"/>
														<UML:TaggedValue tag="collection" value="false"/>
														<UML:TaggedValue tag="position" value="4"/>
														<UML:TaggedValue tag="lowerBound" value="1"/>
														<UML:TaggedValue tag="upperBound" value="1"/>
														<UML:TaggedValue tag="ea_guid" value="{4E581A47-1F48-4a22-9472-D45D0EFA25C5}"/>
														<UML:TaggedValue tag="styleex" value="volatile=0;"/>
													</UML:ModelElement.taggedValue>
												</UML:Attribute>
												<UML:Operation name="__construct" visibility="public" ownerScope="instance" isQuery="false" concurrency="sequential">
													<UML:ModelElement.taggedValue>
														<UML:TaggedValue tag="documentation" value="Constructor The constructor additionally needs a parameter name, which is the shortcut name of the affected parameter. For error codes, see class constants! 
@param string string $message   Error message.
@param string string $paramName Name of affected parameter
@param int $code                Error code."/>
														<UML:TaggedValue tag="type" value="var"/>
														<UML:TaggedValue tag="const" value="false"/>
														<UML:TaggedValue tag="synchronised" value="0"/>
														<UML:TaggedValue tag="concurrency" value="Sequential"/>
														<UML:TaggedValue tag="position" value="0"/>
														<UML:TaggedValue tag="returnarray" value="0"/>
														<UML:TaggedValue tag="pure" value="0"/>
														<UML:TaggedValue tag="ea_guid" value="{DD73908D-0535-44c5-B522-C7B2D935E944}"/>
													</UML:ModelElement.taggedValue>
													<UML:BehavioralFeature.parameter>
														<UML:Parameter kind="return" visibility="public">
															<UML:Parameter.type>
																<UML:Classifier xmi.idref="eaxmiid0"/>
															</UML:Parameter.type>
															<UML:ModelElement.taggedValue>
																<UML:TaggedValue tag="pos" value="0"/>
																<UML:TaggedValue tag="type" value="var"/>
																<UML:TaggedValue tag="const" value="0"/>
																<UML:TaggedValue tag="ea_guid" value="{RETURNID-0535-44c5-B522-C7B2D935E944}"/>
															</UML:ModelElement.taggedValue>
															<UML:Parameter.defaultValue>
																<UML:Expression/>
															</UML:Parameter.defaultValue>
														</UML:Parameter>
														<UML:Parameter name="message" kind="in" visibility="public">
															<UML:Parameter.type>
																<UML:Classifier xmi.idref="eaxmiid0"/>
															</UML:Parameter.type>
															<UML:ModelElement.taggedValue>
																<UML:TaggedValue tag="pos" value="0"/>
																<UML:TaggedValue tag="type" value="var"/>
																<UML:TaggedValue tag="const" value="0"/>
																<UML:TaggedValue tag="ea_guid" value="{50BCB8F2-12C3-430e-8B7C-7D9FB7A88687}"/>
															</UML:ModelElement.taggedValue>
															<UML:Parameter.defaultValue>
																<UML:Expression/>
															</UML:Parameter.defaultValue>
														</UML:Parameter>
														<UML:Parameter name="paramName" kind="in" visibility="public">
															<UML:Parameter.type>
																<UML:Classifier xmi.idref="eaxmiid0"/>
															</UML:Parameter.type>
															<UML:ModelElement.taggedValue>
																<UML:TaggedValue tag="pos" value="1"/>
																<UML:TaggedValue tag="type" value="var"/>
																<UML:TaggedValue tag="const" value="0"/>
																<UML:TaggedValue tag="ea_guid" value="{9531843D-EB54-4eac-83F8-99156A608015}"/>
															</UML:ModelElement.taggedValue>
															<UML:Parameter.defaultValue>
																<UML:Expression/>
															</UML:Parameter.defaultValue>
														</UML:Parameter>
														<UML:Parameter name="code" kind="in" visibility="public">
															<UML:Parameter.type>
																<UML:Classifier xmi.idref="eaxmiid0"/>
															</UML:Parameter.type>
															<UML:ModelElement.taggedValue>
																<UML:TaggedValue tag="pos" value="2"/>
																<UML:TaggedValue tag="type" value="var"/>
																<UML:TaggedValue tag="const" value="0"/>
																<UML:TaggedValue tag="ea_guid" value="{30E6409F-F5EE-4156-8ACA-CBA8669F75B1}"/>
															</UML:ModelElement.taggedValue>
															<UML:Parameter.defaultValue>
																<UML:Expression/>
															</UML:Parameter.defaultValue>
														</UML:Parameter>
													</UML:BehavioralFeature.parameter>
												</UML:Operation>
											</UML:Classifier.feature>
										</UML:Class>
										<UML:Generalization subtype="EAID_C6C700C8_814F_49fc_9B9C_1123BB0B4815" supertype="EAID_94807F39_6924_4b6f_BABD_B861BF17BDEE" xmi.id="EAID_67DABE02_3EDE_4e4d_817C_E05BBF11BD21" visibility="public">
											<UML:ModelElement.taggedValue>
												<UML:TaggedValue tag="style" value="3"/>
												<UML:TaggedValue tag="ea_type" value="Generalization"/>
												<UML:TaggedValue tag="direction" value="Source -&gt; Destination"/>
												<UML:TaggedValue tag="linemode" value="3"/>
												<UML:TaggedValue tag="linecolor" value="-1"/>
												<UML:TaggedValue tag="linewidth" value="0"/>
												<UML:TaggedValue tag="seqno" value="0"/>
												<UML:TaggedValue tag="headStyle" value="0"/>
												<UML:TaggedValue tag="lineStyle" value="0"/>
												<UML:TaggedValue tag="src_visibility" value="Public"/>
												<UML:TaggedValue tag="src_aggregation" value="0"/>
												<UML:TaggedValue tag="src_isOrdered" value="false"/>
												<UML:TaggedValue tag="src_isNavigable" value="false"/>
												<UML:TaggedValue tag="src_containment" value="Unspecified"/>
												<UML:TaggedValue tag="dst_visibility" value="Public"/>
												<UML:TaggedValue tag="dst_aggregation" value="0"/>
												<UML:TaggedValue tag="dst_isOrdered" value="false"/>
												<UML:TaggedValue tag="dst_isNavigable" value="true"/>
												<UML:TaggedValue tag="dst_containment" value="Unspecified"/>
												<UML:TaggedValue tag="$ea_xref_property" value="$XREFPROP=$XID={4CD1C944-C639-4ffd-B050-6D6267E6B354}$XID;$NAM=CustomProperties$NAM;$TYP=connector property$TYP;$VIS=Public$VIS;$DES=@PROP=@NAME=isSubstitutable@ENDNAME;@TYPE=boolean@ENDTYPE;@VALU=@ENDVALU;@PRMT=@ENDPRMT;@ENDPROP;$DES;$CLT={67DABE02-3EDE-4e4d-817C-E05BBF11BD21}$CLT;$SUP=&lt;none&gt;$SUP;$ENDXREF;"/>
												<UML:TaggedValue tag="virtualInheritance" value="0"/>
											</UML:ModelElement.taggedValue>
										</UML:Generalization>
									</UML:Namespace.ownedElement>
								</UML:Package>
							</UML:Namespace.ownedElement>
						</UML:Package>
					</UML:Namespace.ownedElement>
				</UML:Package>
				<UML:Stereotype xmi.id="EAID_1D64E7C3_A572_4044_9F13_82E10C926C05" name="ezcomponent" isRoot="false" isLeaf="false" isAbstract="false">
					<UML:Stereotype.baseClass>Package</UML:Stereotype.baseClass>
				</UML:Stereotype>
				<UML:DataType xmi.id="eaxmiid0" name="var" visibility="private" isRoot="false" isLeaf="false" isAbstract="false"/>
			</UML:Namespace.ownedElement>
		</UML:Model>
		<UML:Diagram name="Console output" xmi.id="EAID_BECDD893_B0AC_4cb4_B9FC_E9BA9A6AB33D" diagramType="ClassDiagram" owner="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9" toolName="Enterprise Architect 2.5">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="version" value="0.1"/>
				<UML:TaggedValue tag="author" value="Tobias Schlitt"/>
				<UML:TaggedValue tag="created_date" value="2005-08-12 09:19:34"/>
				<UML:TaggedValue tag="modified_date" value="2005-08-19 11:59:58"/>
				<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
				<UML:TaggedValue tag="type" value="Logical"/>
				<UML:TaggedValue tag="swimlanes" value="locked=false;orientation=0;width=0;inbar=false;names=false;color=0;bold=false;fcol=0;;cls=0;"/>
				<UML:TaggedValue tag="EAStyle" value="ShowPrivate=1;ShowProtected=1;ShowPublic=1;HideRelationships=0;Locked=0;Border=1;HighlightForeign=1;PackageContents=1;SequenceNotes=0;ScalePrintImage=0;PPgs.cx=1;PPgs.cy=1;DocSize.cx=1118;DocSize.cy=783;ShowDetails=0;Orientation=L;Zoom=100;ShowTags=0;OpParams=3;ShowIcons=1;CollabNums=0;HideProps=0;ShowReqs=0;ShowCons=0;PaperSize=9;HideParents=0;UseAlias=0;HideAtts=0;HideOps=0;HideStereo=0;HideElemStereo=0;ShowTests=0;ShowMaint=0;"/>
				<UML:TaggedValue tag="styleex" value="ExcludeRTF=0;DocAll=0;HideQuals=0;AttPkg=1;ShowTests=0;ShowMaint=0;Layout=;SuppressFOC=0;TDurLow=0;TDurHigh=100;TDurUnit=;TDurHide=0;"/>
			</UML:ModelElement.taggedValue>
			<UML:Diagram.element>
				<UML:DiagramElement geometry="Left=20;Top=139;Right=221;Bottom=266;" subject="EAID_4F677B5E_DCEC_4413_9FB2_A9753E5E62E8" seqno="1" style="DUID=7369F95F;LBL=;"/>
				<UML:DiagramElement geometry="Left=60;Top=460;Right=206;Bottom=540;" subject="EAID_4B7CE667_749A_4dde_BE45_7CBFB5519DF5" seqno="2" style="DUID=9861FA2C;LBL=;"/>
				<UML:DiagramElement geometry="Left=10;Top=20;Right=175;Bottom=95;" subject="EAID_55B8BBC5_46DA_4e67_9A1D_1120F11D48E7" seqno="3" style="DUID=4E2A8D6E;"/>
				<UML:DiagramElement geometry="Left=669;Top=80;Right=1066;Bottom=324;" subject="EAID_A9F2232F_845A_4da2_A329_950ED3CDB676" seqno="4" style="DUID=1AFCEFE0;LBL=;"/>
				<UML:DiagramElement geometry="Left=341;Top=419;Right=620;Bottom=585;" subject="EAID_65A37092_56CE_4e5a_8C30_366469BD8468" seqno="5" style="DUID=D116714F;LBL=;"/>
				<UML:DiagramElement geometry="Left=260;Top=126;Right=634;Bottom=279;" subject="EAID_EE63FC0D_D590_4d0f_9F83_338683F8E000" seqno="6" style="DUID=74DC55C1;LBL=;"/>
				<UML:DiagramElement geometry="SX=0;SY=0;EX=0;EY=0;EDGE=1;$LLB=;LLT=;LMT=;LMB=;LRT=;LRB=;Path=;" subject="EAID_8273AECA_7516_4847_9960_34C4FF71F006" style="Mode=3;EOID=7369F95F;SOID=D116714F;Hidden=0;"/>
				<UML:DiagramElement geometry="SX=0;SY=0;EX=0;EY=0;EDGE=1;$LLB=;LLT=;LMT=;LMB=;LRT=;LRB=;Path=;" subject="EAID_8BBADE67_3C37_4c4a_8CD5_2911FACC538E" style="Mode=3;EOID=1AFCEFE0;SOID=D116714F;Hidden=0;"/>
				<UML:DiagramElement geometry="SX=0;SY=0;EX=0;EY=0;EDGE=1;$LLB=;LLT=;LMT=;LMB=;LRT=;LRB=;Path=;" subject="EAID_D761BD7E_7981_43a2_823C_48DC2173761C" style="Mode=2;EOID=74DC55C1;SOID=D116714F;Hidden=0;"/>
				<UML:DiagramElement geometry="SX=0;SY=0;EX=0;EY=0;EDGE=4;$LLB=;LLT=;LMT=;LMB=CX=51:CY=15:OX=0:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:DIR=0:ROT=0;LRT=;LRB=;Path=;" subject="EAID_E53B0D49_9955_449f_974D_2D23DBDB2610" style="Mode=2;EOID=9861FA2C;SOID=D116714F;Hidden=0;"/>
			</UML:Diagram.element>
		</UML:Diagram>
		<UML:Diagram name="Console parameters" xmi.id="EAID_70ED343C_42E2_4b49_8EE5_C19FBBA1BED9" diagramType="ClassDiagram" owner="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9" toolName="Enterprise Architect 2.5">
			<UML:ModelElement.taggedValue>
				<UML:TaggedValue tag="version" value="0.1"/>
				<UML:TaggedValue tag="author" value="Tobias Schlitt"/>
				<UML:TaggedValue tag="created_date" value="2005-08-19 11:59:03"/>
				<UML:TaggedValue tag="modified_date" value="2005-08-19 12:00:03"/>
				<UML:TaggedValue tag="package" value="EAPK_9300B830_36D9_4e00_AE7D_EA3DA9B092B9"/>
				<UML:TaggedValue tag="type" value="Logical"/>
				<UML:TaggedValue tag="swimlanes" value="locked=false;orientation=0;width=0;inbar=false;names=false;color=0;bold=false;fcol=0;;cls=0;"/>
				<UML:TaggedValue tag="EAStyle" value="ShowPrivate=1;ShowProtected=1;ShowPublic=1;HideRelationships=0;Locked=0;Border=1;HighlightForeign=1;PackageContents=1;SequenceNotes=0;ScalePrintImage=0;PPgs.cx=0;PPgs.cy=0;DocSize.cx=780;DocSize.cy=1118;ShowDetails=0;Orientation=P;Zoom=100;ShowTags=0;OpParams=3;ShowIcons=1;CollabNums=0;HideProps=0;ShowReqs=0;ShowCons=0;PaperSize=9;HideParents=0;UseAlias=0;HideAtts=0;HideOps=0;HideStereo=0;HideElemStereo=0;ShowTests=0;ShowMaint=0;"/>
				<UML:TaggedValue tag="styleex" value="ExcludeRTF=0;DocAll=0;HideQuals=0;AttPkg=1;ShowTests=0;ShowMaint=0;Layout=;SuppressFOC=0;TDurLow=0;TDurHigh=100;TDurUnit=;TDurHide=0;"/>
			</UML:ModelElement.taggedValue>
			<UML:Diagram.element>
				<UML:DiagramElement geometry="Left=600;Top=20;Right=765;Bottom=95;" subject="EAID_7FBF19CD_D452_4a01_BF36_6591CF96D1D2" seqno="1" style="DUID=56EC20EC;"/>
				<UML:DiagramElement geometry="Left=34;Top=27;Right=277;Bottom=173;" subject="EAID_C6C700C8_814F_49fc_9B9C_1123BB0B4815" seqno="2" style="DUID=C9E410BA;LBL=;"/>
				<UML:DiagramElement geometry="Left=30;Top=280;Right=240;Bottom=533;" subject="EAID_A51EEA3E_1E35_4947_AFF6_4F0ED6B44ADC" seqno="3" style="DUID=2ED4E9E2;LBL=;"/>
				<UML:DiagramElement geometry="SX=0;SY=0;EX=0;EY=0;EDGE=1;$LLB=;LLT=;LMT=;LMB=CX=51:CY=15:OX=0:OY=0:HDN=0:BLD=0:ITA=0:UND=0:CLR=-1:ALN=0:DIR=0:ROT=0;LRT=;LRB=;Path=;" subject="EAID_F959A77C_CEDF_4555_A103_9EADB2730D13" style="Mode=2;EOID=C9E410BA;SOID=2ED4E9E2;Hidden=0;"/>
			</UML:Diagram.element>
		</UML:Diagram>
	</XMI.content>
	<XMI.difference/>
	<XMI.extensions xmi.extender="Enterprise Architect 2.5">
		<EAStub xmi.id="EAID_94807F39_6924_4b6f_BABD_B861BF17BDEE" name="Exception" UMLType="Class"/>
	</XMI.extensions>
</XMI>
PK�a�\�>�5AA)pear/data/ConsoleTools/design/console.pngnu�[����PNG


IHDRHg3�X IDATx���ˑ�6�Ф���A1t��@�1A�Ȅ�Ɓ���!����8l�?A�3?f��x�`Ӷ��j�vo��7+5M�=�S4M���cXK`TO`TO`Tov`�4M���C��k�vtj�8��&���<��.�դ�>k1�XJ���w��'��šB�KA��o�m��q�p��j�
�M��I��g$s8�63�ּ�	��U�|7�MLE���}�?)�e�xV��uL6sO�g��ueΥ�Q
\J"��s)��)�ʏ��.�Z��cf��Ef��.%}��]m���y��
MӸA�<���g6+cQ
\ӳ�5D5pY�"��2��4Q
\�/�|��_^��.���@�LE�'��'��'��'��'��'��'��'��'��'��'��'��'��'��'���q`��_��j���߶m����g8���*γ������U1` ��n���y����a�.�ol���2�I���~�����va�e�7�}�&��r#�g��I�K���wo��+�ij���`�g�g�%c���㢑~�J�����Sц��J���5�k��))	`��&Hڔ�/�Ih{\@���6��	�d�g��ŵ23�^�9���LM۶MӴm{�HH����iܠ���
P7�6@�6@�v	l&w��u������|����d6�����V(��:ŋ�3������g:b*Z�m���wB#(��3���P'��Hf��(el���{�u�8��]�&Y�/�?�Z�Uv2�ؾt/u�Avu�0&h6��k��ǼP�]��m��5�O�0�:2Sф(���%��g]�g�Y�|��� v�e�&�H�K$'Y�]I�I}� A�����m�F�m�~�}�ivL��_��״m�4M۶g�`��iܠ�������������ޖ�MrM�5���_ݿ+Xi�垇�X���V&��&3�Y�[�9H�����d����
1�����v@}�0�����b���bQ
Tg�M����G򂖮��Y����ؼ�� qf`���x�Y��y��$���D;kb��xWP��WE8�q���G`TO`TO`TO`To���q.�>Yq�����d��\zM��3q��z_�_��-~
@E6l�S�+�c�̰�V��|�f��r��^��e�8mx�ܟ(���tO��)<|�ll�-D��X��z�vvn��|׫ ���l?-�;]�ϛ�LE��In�.O���~��X�Nr<�B�|�g���� GT@�
lzqR"��8xBT�}�d�eQMa��e��X��P���q|�z|J=VxW{,H�G���
ǝ�]��״m�4M۶���Z�kl��x5�`rT�TPx��XX59�ml��)�<3da��~��;�P��i�
l��4�t����������>6�7�̔/iV���+\�U8�L��WjO��
�S2Ԓ��@�4g g�Z�;ޠ�↧��x,~ie��X"�g�֜��)�
���ϳ��������Sњ���?9Vl��L��ùC���}Y���&��$W�i�wcVa��A�~�S��鶓�Ǫύ(�D5�����
�2��|�%x�$�2V�d�`?�?�w_�~�[�BS�2����
�s�I�S�G5+%�����T4�r��&����}��\E`}S�U)l'�_B�i۶i�5��-��!<���V����h�	oc���aV���P���;�e��jM�X<������o��ܩhM�l�$����W�2�q�N�zG6�5��dl��	l��]e�g���ml�����X�}�c��u3�A@`�8À���E��N6ur/��H�L2�F8�v�6��7���@`P�8�$F
�3�b�3��b����&/n
6u�]y������ئ��x`s,.�	l�V~�}�Y	�Yi�|� 	S�5$	l*6̢�R׽$�,�%٘��L��2�.�M۶MӴm{�H�}5M�t������o����_f�m��
:��	l��	l��	l��	l��	l��	l��A'<H��j$��q�N�V~�b*P=�
P=�
P=�
P=�
P=����x����u���?+����k���ñ��N����ϋ)
�w��`��N6�h�N��H&��{���%�;
���X4��N�p� 8��h@� -ө.#1l��x��
�
��
��@�dlࡆ'믍fj�m�	� ��L�����X;}/þ�nɼӬ��=lࡒӷ�js�d2CR���S����8���X2��Z�������=�\��m�0h��!/P� �;��gr&Xr
Yf�OO���m��i���j��pUo���>��/_�̪�4��
p�81b�0��8�0X�}l��	l�ꙊE��9{�mY�`=�
�������V.�o'�V��~^*�p��`;��,|�
4��6!��G+��L\+��{��Ҕ ~5���M�TLؖ�N���{�1��
�K3՝��
8��>L�^?Qu�'px���<8Yߤ�8B���iZ�PjV�x��Xk}�a#񔶹�Ku�TJ`՟�oxڝ��%���kN\�3��ʽ�w=ٗ�#�6�Lz����[���ZD5p$�
<��3�a�29O,^0`ٹ�0�_~-.Ό!��`��ha48LӶm�4VЇ��i,�������g����>ʀ+[�y�4��
p�81"��"��'�V����%c���ߓ[�����#���`F�Y�3�G��c`�4�~��dֺ�����������7c��9�{��l%Ƚ�Y�|rfi�ۙ�xIRh�ӱ�/��w��K!�ۙU�3k(O�
&(�ö7�˚�p���s/��y���&I�łg����^�c��bA��f�{�wll�y�e7��#��n>�	�i39��8*6y����ؕ���|���m�}�.%N֍0+O���܁�C��x��c��d�d0s����+�|��>�H.B`ԡ$G�yiֵ.���9 �1��I>H�x��d=8�ߤ�8r���o��܏d8�xJ۬�e�XF`T`��x�.I�,�e6�2��+ߗ��|���W
���3�1}+y�K|���b�� �^��\8�#��G��ņ3��L�Z��+�Kɗ_�ca;��d2�5<��3�-B��t-�����l�U=���'�à%y��P�`��0`���0L*�Ɩ�+�⠫|<����m����� M�����?>�}v�G.�xvr�ǚ�2���|6M#c�/N��~�l��	c��~9{k	l���t�6ovV����f�W��T�	�2��]syV�P�g6���������n{��5^I�v�'y����8����$��[�V=��f,�¸g%p�6�Il��I�d��z��㻪�w�.�x/�>��=�	���i"�����1�<��{���_�L�U�W�p$���
@�_ayֽ)��Qv���f����],������>?�pT�C<+��dQɗf]�2�
�Y}��#�� ���ł��|� ������GD�*cCJ;o2Ձ�zP`_��b�dr#~�$w���X�|?sl,�����'���&X
c�.�x
†Yٞ����p@�ؼRE�@a����*���/|iY_�؂e�d˶��e�
�ҀzV`�\���X^?�p
�a���L�8�M۶MӴm�}�M�6��������a�&�gk����v�?�>5��M���u�3�ۚ�jX����il嗳U^2;k������0��_M��:���WO6�����9��3�;�����H��
,d�T���7�q�G�Y#��mx����mK����pY�6�ZS�{�H�� 咼l&��d#ȴ̺Hf����x�G�X��!�a*T���z�x|E_�$W�A�Z�3��8l�U�׮���q!%PB`��+��賦Q%����=
N�
�LΧM���>�k���.�1`�"6�Px��~�;�glw\���k�e��iu�|k%�CZ@� �fH�V����	�Ww\���_�f0��ޟ�ĥp��mۦiڶݾ馉WE���&��������o����_�����)$����([��e�5�|6Ms���C>S�)���:��%�Q>��\�6֔̌ߚ��q<g��x��y�	}��|�j~9���~��Å#�MgN�5%3������Ļ6|u�x��X�d�1p:��du�3p��369��ݚ���x.�^^`�C�����~�̬�XS�����\��H~�|&�?��;�0 ?{'�}��p篚X3��a��u��+�xN�a��L��I�u}[�9�p�R�e��_��I��ւ���YS�����{���۸�r��=��x��ӗ{ج���Z���[�’�{��\��Xl�{��������*�����Vڌ��my�A��q� ވ��<S��a76�Y����<�x��&����g���R�s���|+48�p2hI.�8l�R�h'w9��{���䛐��5-3m�t���gչ�56�N���pF;�p�'W��U�.�'׼i��P��6�\�_]���e3�ZX�wA��w)~~�Y~EЕFp`�8ϐ�=���~�N�i�ӫ���#��Vp���+ǽL&d�*��q���ucoņ?���WE���+[��^�f���Iɛ�8�R��9�7���^XmW~5��ς�[�*��M}֟®��Ny�3���VE�Ú�e���5%k�x.�G�3<�/��ς�;.��!8wvG�҄�
'O�~���5%8����㸩h���W8��O���uY������5o��S�0��C��<����ۡ��nMɲZc�R����s�����x.��xp����e3�M^��N�<�OG�_*?cj���Y=c�L~�Tɔ��ONF{+6�Y܏�������w��:��Y\j��]9���ς]�{�g�r+�{>n����*���u�Y��=�?��[6�3	l��]}U4`Co��ܔ�Īh�e����T4�z�z�z�z�z���fMI���p��_��/�R^�/���dS[�ߣ�YXVv�o`cMI6wbt�x�p��&7;���9k����?�~�υs��
���_{
΃��������ϧ�Aj�5�"�鰑�V�;g<�x��o�dG��@?��!e�L�3@���L���ql�y8�w�7^x���k���8��Òd��zfT�.�1����iz\&xilJX\=��c%����!M�J&:�|�ܟi,xu�C��Cx���(ly��٩��v��hM�����_�o��cl���O ��R5-����2٘B�v�=:e������y�
<�'�����_�'/���%ۜ,7w46�1�6���q�o�+���L�J&�ƪ':�g�?��i\`l6Z��hڶm��m��n�*V�Z��Py��GҲ�1�?�[�Ŏ{�����m��e�.��c�.~<''����e���#?�j�([��ߚ]���)�z�Oc�X�y�4�����7۝�e;Xr��
�lo�;c��G�J�C�7���U���:�|.�w�?��&Sђ��87=��.��cd��q�N����L'��a�#/J
]Nj����?,츂�y�M��(8��w�dH�2���W�ۨ�(�b��Z�l���p�����˚��)�/�fa�2���c���}�i��q\`�?Oڰ��b�OF�|�0��u����[��NߋB��d;����oxmrH��o-�J���LE딟e.>+��D6��u�+|��t��p'��Y%��ݣ"�=������qr|�9�egr:��p0-'��d��������I��46�%3ھ��IMc��㟜����ӏ�X���̺�!M�U��&?72�;��X0�vA/�9����o^V�{��D<��W��d��~�nܬ�ws��y}��^n���u�����جXE`sp�pb�Xe�=�R�㹿�T��8�7�����J����mK��_�T��iz2E�o�%����~�3-{:��%p���v_�|ɐ
߫�|~0���E�V�L2�<�pl��yo�ҁM�k����^��m�V�I����w��u�"����8i�����̤��e3�S�����q��!�%�j���oVzy�a�ҁ
������Z�LK�$��y;%���^
��y�
�.����&�n�S�6�qDT�{+\�Q>R<���R���l�VV��g�{�O�����=����Ȳ�A�ᤦ�~�,Øl'~)n�"�VL�R'ی_���^��&���	����T&ߨ�V撘ɄLɅ=c���F ��U�2�<'_�ljYp�U��u.���:}U�����l]�wm>:�䧮[�*�/ۏ(똀{�ߙ�71<�a�D�'��l�W�I����̒	�u=FTî*��V��n�����?~^�1��Ir1���d/߻?[�����W4}�A�e�W|}��5���?�m�Cت)���?��Tgf�Z�,�����n��٫�� @��עF���2xf�+L!p$��e�,^c�
$c'��mN^W—O���x^@.� n��kl��/-XV=yY¬6W^ذr���r!�G_c���*8�����
�q�����:�g�q�L!p�%IWΆ]v����5��4�xؾ��*^�9c�O4Wp��gY�7��ӗ{��%��_�,nvn�|�6'�5�l��c��<6�G'�/�	p��)��ϳ-�[<,��"��L�a/񌌾���]ˏ9��lv�V�Lr���ñ���6*X�y����Pr.G ���\|�K�3r�'Ǿ�	ʗW��2��d��g�c��59lk`¤�6@��N��Yse�N,�
��s*��>/�����'ʼn��W��Jb��dl�ю\�4�z��N�N�ZVq8�xbX�GɄR��J�V��N&d�yzc#ڴ&��*Z����Ƥ�9eb�_m֜��?����*���tJI�{��]�U�*ڮ�%�I�S��c�9}$��:?\�pc'~��]�j`�
��[��~��/��䒋��}G���W�%J��H/>f��;ހۻ򉾅X�"���&8'+����&��j�b���
+��yE��+6���yl��a�/�x8.�Y��d,s7���u�O�g��c%�we���/n��
o@�\�|����L2��D%%�ǐ��M�xn��f���$��L�L���|���’Iqf��J->�3��+�4&�;u���?p�Sp�����¬ign��7��O�a.�Op��W�>��ޑ_��{��:roP�ӗ{��s�fqS�w��cv�����0+�{��T�m/\9R�#�F�7�HɩceJ�J���I6�!ɫd㗒��1�\P�9g��PrO�-��Q4V+x&��{86xb����WͿE���+X0�m��w�l����'���%L����ì��g�c)�L��8�V��Zpr��'c��Z�������2\_�
���SX�]���,K�L����-G���I�
�-�%�fH�Pˤ#J�I~�V\�a�U������Y"�oa򙱮'����ԏ�ʥ�v����ÁőX��XT���J�"�x$�2�f�e���ꫢ�H~�L�2o��k�w�U��ұ��e#9�KS���WE{�?�J��cx>����U�~�~DY{�]i����w{xa�VmR�Z~��U�0�G IDAT�T���S�Q
�rt`��ۯ�u��g��W��2���Hq��������-�u�]��v�P���L��y�C.�H�0�+��T��'�����;�;.������Y���`Fl�K/��/�8|X����ᰅ����Ȳ��܃#��PFcjr`�c;ɰpro����s�.�&@�q�l~eK����s��d��d�Tg����^^e���#��p��l��U��O%�R�
��k����-��Ϫ�.�9����9:����v<����Ґ���w1�Wr{�S)>���Â���:T♙���X�d����#�G��O\��md>-�_p��Y��ae�����il�'�\�՗{N~�]ĕ�vcw]�yW��~`�ӗ{��wn��<�?���j�M�;0��$�Ke�=��}�{�_�+�
�&s��E���,f�/T	��0����d��6�A#����]ǂ�h]�x�Ɋ��	�M6R>N��
�����ҕ�C{�~�F��|�/r<�4^kq�ij�L*���˻۰��vVv��+��;y���|�|#>ҩT�
����?�B�~�J6��3��oT/��Z���l��phn���
��,X��s�g�ؚ�d�F�"6�h����s��K�&_*Y�19�a�hlm�8zIVLv��Z�򮓽ۉ�	i��'�7����h�}U��I�ɗƞ|�	
�;}U��Y�]�BZ�\,�rU�}36o����'�dBBa�k�C���%2��Ż�s;6}��z�_���������&Nt�f�S��~�땜T0���q��8Z�����8��8�Wc��`�Ա� �������Ɏ��Z��1�
��������?7��;ԩ(��{X�
�M�T��#�#��F}&ǡ2�_�dqO�~~9{<H۶��$~��g�4G�g���o���[�oAq���GT�d1�����͕��Zؕ�hp���tc�l����ې�:Y�6�d�YM+^(���E�n��=��p!5&m��A�78�07gHƞ�Z�E��M%7��#�Cۈo�y'�f�0IƆCu7����� �VZ��c'��]���D<��f��
����b(?��,�u)�Dx�=))�`��	Q2��jY�#�J	l8Z>i��F���
@E�w^����Z��◾X��#����h��n� �0�0����JN*+��l�'�-���1��K�.��ȁ���s_�s�x����6W;&]����=�޷��Q��8�s���h��a�426�)�^��*Z�&<�k��5Q
\���k�C��%��|��~�H��_��������f�����
�M�<{pi_����!�Ul�.�
���ϯ���!SѸ�.n����P��_^p�
8��
W��6R7г���\���ߺ뛊K7�;Z��*�z*ж�ii�����QP�s�ƒ��$�_����7�^�����j�m�%]� qd���q�A$0,�m�闸���x)�N����ɽۈc�����	�������m &i�b�y���.��J�[����t�t����X��X�c#����3�`�'dž�ً|�a������E���������Hװ��Vm��)�Y�B���u�t�•	l�O���@�K���t��L�L���W,,�8��6���ʽ6T�;�s&�>�ƶ'��IyN��ᔰ`�bc��'�e˜x�[_���_��X8�����hL�j�^�&9M`C!��Z��rj.�����g�=�΁M�X<��YND5��e7�j��'��Qڶ}{�8{� ��c��H�<�
w��6�H�:n�m[����p+b����&]=�
w#�8]��ۯ�
�M��<�jed �>6ܐE̹=9�u	����v1����􁞌
�d9������n�$�2�B�p��3�Z̙�qi�_�.n�ry�9����.��J�g�F��򹔠���䜴������Cq�ɖ��3��3c`̆��&=f��6�"?w%���6{�
/�ټ�m�*"���6c�
��3}k�D��2hq�d�f��т�s�F�J5N�x��zG;�ࣛ����ן+9}Q��������g����Yu�����A��@��k�<p�5	lxYJ��N�(NpA�{�,
p3Jlp'���m�77 ���ڶ���ܲ�o�����_y����!��ҀG��I�����[��X�[:��p?x��6s9�a�%�oy�|wA#cU�/
ot�6��qi�_�t�b�i���Y��9�>��?,/<V&(0��L�f�n�����}l���]n�'��ч��״슝��%���t!�;x\Dw�is��%���.u#��`n$�O��\�򊢂��Icˠ�U��O�W�iW}���*�8��1~5�2�'4M��?����yn���3���o����_f�m�F�F	�j痀��@��ָB8q�1��3Lh��J�'��"b�+�@)�
�e	l`�
�5Y<汜P��������
�օ4V���j}��~L�_������M��
,�.7�>��t��& ����6�>��"������83���q
��4M����?��ޚ��*��};`�4���8��6ж����gʧk#��͈m��k�#	l`Kb�Q�k�����6/��p�{���?���kܵ8��vх4�n/c|��pؗ�/v���\��[�!p�c�s�
p?�l[Q
p؝���.[(��F`G�b�
P;s ���A�/8�6@�D5��	l�Pb�F]�YT\���&����
8�Kn�ZH��p�N8�;xׯ�|�@����LK���3�:8����d�F8���Q
P)��%��	�,>���	l�*,'�ȇP;S��ZLK�'�n@`�#���SKT܀��Hl����lࢺ�Fx�D���
\W�M��؜���
\��ؐ�j���@�6�&\Tܘ�� �V����
:�}l����G��Iw^�kW��O�!LE������!��*�m�I��Q6P+�
0ƚ���*f9 &��I���ݒB��j����m�π��M�m�ɺ�FT<���Cl�$Q���t����CTб*�Mw��\nϢ�C26pO������  ����]I��6pgb�k:�q�
�\�8��	i2dl���R7P5Q
@���Bl��L���m�:.�($��g�@E��PN`���6��8��Y6�D�����%������`�
<��.�E5�	l���6p5k��=�|}l�
N�`=�
�z�}F�c8��;�M����iip0Q
�V6�O�6pQ
��6@Hl{��3��\c$XN�#�؃�
���LC��%�؉���VL?ؕ�� �����FT��
0MlkH�@`�b�
�%�8�UрR�ə�4(diA�#���%\Tp0�
0���$6�'���@�5���`�>�q!
��dl��K�n�%�8��XKl���	l�
�mx,�\��؆؆��3�ul��t�������[����qo�� `{��qc��\��؅؆[���,�
��
7#��2��;�c��T�ap}`_��v�^�*����4*%����8�؆�t7e��B`GlC-��P�
p�.��pe55�G��pM��J	l�s�m��TM`�Fl�u���v�Lb�@��ܠ8Y�8��x�=�����N+}k�rw"��N�!fZ�,ޮ�v}EMG��~����C�Z���=�g�xP=�����Ɨ�_�	�����������������������y���fJ���+��=��x{���ן��5F`�D��肄a#x&E#�|;s�;,��=��n�p�8��`�8��əd��z���I���|#�Q��6K������)���\��3	l��dQɗ�S�kI��L���.D�&�,�%٘��L��J��J^Ó/Wдm�4M۶g����i��>��eo���>��/_��:��k��}l��	l��t
5����������s�N`T|OF�k��,���^�`������������'���ţ�x�*R��S8�垁����K����i�<d�`'`_��{�ޟ�O�s����V�̰b��|N����W�36���L��\`G�p�?�>�K&kU�r}�d;��i�L�d�0��
P$�6�(Ȑ̒-�36��� ��\$���)�c׷�.�^X؜��Q2��|&��O���L�F��.� c��
h�`&��?s�@�HӶm�4m۞=��4Ms���NG�m4M�c���g�['�1����?>�}v�_�~9u,��4�=36{����73v��d>Jl�r�N�P<��w��o�����{�a�������<��G�o�6�
�-m|��l�_���
�]�1��y����$��o�9\�y��@���q��?�أf�ѽ�|��9-��?��]��F�Z�����݌W=�t�{\�
�w�L6;,�vP}�����[�.f�K<�
�=
U�<Q`�I2�B��a�a<������0�H*�c����|�-)i*(����"��F<��zEA�TO#�y�d�$~2�iy��|b%e����A�����Փ�L����,���.E`�,ɠ"�B��Z��	s{�[�3v}�X/s��ٛ�	l'��G/]$�L��R9��|��Z<Mp����x`삙�$�`��
o�W�26���f�R�{��LN���^�hڶm��m۳G���i�I�g��do���>��/_�l�8��t�S��2<�O6�#5M�>6��ny�/u�8���yd�X�~Q�+�S��M�,�
P=�
P=�
P=�
P=�
P=�
P=��u�͹	Ƭ�p3�z�Ӽ�t����K��}ɒ��
�����Po�?��+�p���?��/+��Y��@-6�(�1,�{����TO����~;x��O0�[8��{؜&y����e�E5<��h@�6�x�<�
P��_[S��z_rA��k�6�7;;�������Z�t�n����l��[�E�&���;|��23q�a���4��`��Tl�y8�:�	bVEK�Wް�|��E��J�Z�yX8X!z�];r��iڶݵ��S�eY����ֺ��aW&Y ��U�� ��w�[Rk2#�:[��X-�%�I
��î��ڣ�e�����6D5g���wꢤ�����`�P{�3P�M�{�S"��L��kgn�I�dʥ{2��X���Ɯ��a?�Y��$�̣�GM���]����0)����^n��'�AP��I���g_�
:�7�*�.��7d�}/�e��e�i��,G��†�R����}��ioˆ��7d4m��종�i�W�L%��%��L�Ɂe:���DP�2�PK�4k$o���>_���~ힹ�Y���]e){�v��q����z}���Ա�_�47�ؼ�YO�i���Jj]�q,����C�C�� ���6�9���JR
��\߿Q
������!��a�d��#qF"hy�V�|����d�A�WY�%��c��T������\�26��#5]Hs���X6�~�?������*�6Gz�T4j��%1�M��6��~E8����@��o[]��Wx����_I�5� ��]ٝ���0*sbƦ���\�t�ޭ��u9�e��-�p_��LEvܡrx;�n;f$�wU��n���g���w��i��|-�N�o@���tY�~	��ap	P�Ұ�p��K��IY%'�cg�}~�$y2Y%h6��$��w�٣�øb�ĵ���F
�CF•���K���뵬��͗TKn)��3�
�g`܉�/��36]�}/׏m¡��q���o<!
�t��]��@4���¬3��B���U%�E���`^Q�0�!v�l|���
��F�
��{b�K��e��O!{
,��g��/���u��n��kx�_��I�em��v�O6�[j��r�0��*�?��	6�Œ/���I��ގ\�YT��׵ST0���݉j�0�z�z�z�d�K��~���WRe�2����}l����W|/�ɾfxL���
����30Ç��d~f��X��~�}0���y8C0$�8��(ҟ��:��B�8Ӈ�K%��|��ٸV_`n(ha�r�p0Sр"N�:%��E+����l������c������`X�6�sc��
��3}kc��8��&2�N'/�I�F��\GӶm�4m۞=��4M��?�3��|~�춿|�r�X��M~�6Y|l��ˬ���|��i`G�^ٲ��XF`�k}�S�!��;��3P=�
P=�
P=�
p�YK'���~�m�oA_�����B�&���jV��D`�뜹v��n�b��=L�#�#��dT�)����K�������e��u3�]�{1��į��q�c/�Δۣ�����&�0ο�����Y�d�.�2V�Ϻ��Ov�o��Շ�̭w$����'A�d��7-(<^I�oEa#�8��J�ɧ0���E�g�g�%'8��N�Ǽ��{}.HG,�`��+i�$��l<��3	l�[I�G
c��u�F}��5�d0�oŶ�	3`�
0����8]������t��9�2�k��n�k�
�C
:J�QP7��?���;ܝx�î�2��/�w/!
[hڶm��m۳G���i~���٣`�����o����_N�u��ґ����5kn[I��O�+w�}Y�'�����g�����!�6�ڛ�nI�]g�]����0c�����!0��5�C�֐�8R�4�{�'��w�kl:R��26�AƖ��,����o�:�or�r����#�	�
0�'��=U��\g���
y�
	l��� �WfI0,48�hx��a�ɺ{�K�d�M�E�N��U�LK�x��	�)}�|�A��������uwݗ�J��8Uu�\͝64ʫ��Ca�e��̺�沺�����l��
����/�eqݝ�%#�Mdl�f�����}������ĭLGA����v�`nX�n<�=�%����kڶm��m۳G\K�4?��s�ƏY�lM/�涕���m�����g��j{k�����;�_�Ȳ��"c�횱�ۓ�8��
p�z�z�{�����so��z}x`�Sn���.�|����5����;
B���Û]��-�:���]�=�o�9k<��6@��t��D,��7^�("~)�4�b��I����ɑ��.H`�㍒*�qd2Y}YG��O`�hY8���u��	i@6��r/��L�ex�����a�|@�X��p��
���mۦiڶ={$��4M��?���u�`o���>��/_��:��k�F���m/�� �nHHO��@�6@�6@�\c�o��e�u�˫[WnI���j�x��3y��^p#�6dl�ŷ�ެ3(�)�|����Hb'y_α����8��(ҟ��=���m�E�{kf^
"�|G�,M�G}��H�jg�E�b� X��#����ެ�6�,�
p�8%�)-N�4�2�4�:6������n#��?�(Y+�Q|UL> �C�䔹�ngiڶm��m۳G\K�4?����Ql,y�������g����S�pM�����%7�ul�g��-�A'P�J��IDAT=�
P=�
P=�
P=����?�@�
������sG0�T4�z�zM۶M��sN��4��
P=�
P=�
P=�
P=�
P=�
P=�
P=�
P=�
P=�
P=�
P=�
P=�
P=�
P=�
P��m��*�>�
�̺v�IEND�B`�PK�a�\������pear/data/PEAR/template.specnu�[���Summary: PEAR: @summary@
Name: @rpm_package@
Version: @version@
Release: 1
License: @release_license@
Group: Development/Libraries
Source: http://@master_server@/get/@package@-%{version}.tgz
BuildRoot: %{_tmppath}/%{name}-root
URL: http://@master_server@/package/@package@
Prefix: %{_prefix}
BuildArchitectures: @arch@
@extra_headers@

%description
@description@

%prep
rm -rf %{buildroot}/*
%setup -c -T
# XXX Source files location is missing here in pear cmd
pear -v -c %{buildroot}/pearrc \
        -d php_dir=%{_libdir}/php/pear \
        -d doc_dir=/docs \
        -d bin_dir=%{_bindir} \
        -d data_dir=%{_libdir}/php/pear/data \
        -d test_dir=%{_libdir}/php/pear/tests \
        -d ext_dir=%{_libdir} \@extra_config@
        -s

%build
echo BuildRoot=%{buildroot}

%postun
# if refcount = 0 then package has been removed (not upgraded)
if [ "$1" -eq "0" ]; then
    pear uninstall --nodeps -r @possible_channel@@package@
    rm @rpm_xml_dir@/@package@.xml
fi


%post
# if refcount = 2 then package has been upgraded
if [ "$1" -ge "2" ]; then
    pear upgrade --nodeps -r @rpm_xml_dir@/@package@.xml
else
    pear install --nodeps -r @rpm_xml_dir@/@package@.xml
fi

%install
pear -c %{buildroot}/pearrc install --nodeps -R %{buildroot} \
        $RPM_SOURCE_DIR/@package@-%{version}.tgz
rm %{buildroot}/pearrc
rm %{buildroot}/%{_libdir}/php/pear/.filemap
rm %{buildroot}/%{_libdir}/php/pear/.lock
rm -rf %{buildroot}/%{_libdir}/php/pear/.registry
if [ "@doc_files@" != "" ]; then
     mv %{buildroot}/docs/@package@/* .
     rm -rf %{buildroot}/docs
fi
mkdir -p %{buildroot}@rpm_xml_dir@
tar -xzf $RPM_SOURCE_DIR/@package@-%{version}.tgz package@package2xml@.xml
cp -p package@package2xml@.xml %{buildroot}@rpm_xml_dir@/@package@.xml

#rm -rf %{buildroot}/*
#pear -q install -R %{buildroot} -n package@package2xml@.xml
#mkdir -p %{buildroot}@rpm_xml_dir@
#cp -p package@package2xml@.xml %{buildroot}@rpm_xml_dir@/@package@.xml

%files
    %defattr(-,root,root)
    %doc @doc_files@
    /
PK�a�\ũ�

pear/data/PEAR/package.dtdnu�[���<!--
     This is the PEAR package description, version 1.0.
     It should be used with the informal public identifier:

         "-//PHP Group//DTD PEAR Package 1.0//EN//XML"

     Copyright (c) 1997-2005 The PHP Group             


     This source file is subject to the New BSD License,
     that is bundled with this package in the file LICENSE, and is
     available at through the world-wide-web at
     http://opensource.org/licenses/bsd-license.php.
     If you did not receive a copy of the New BSD License and are unable to
     obtain it through the world-wide-web, please send a note to
     license@php.net so we can mail you a copy immediately.

     Authors:
         Stig S. Bakken <ssb@fast.no>
         Gregory Beaver <cellog@php.net>

  -->
<!ENTITY % NUMBER "CDATA">
<!ELEMENT package (name,summary,description,license?,maintainers,release,changelog?)>
<!ATTLIST package type    (source|binary|empty) "empty"
                  version CDATA                 #REQUIRED
                  packagerversion CDATA         #IMPLIED>

<!ELEMENT name (#PCDATA)>

<!ELEMENT summary (#PCDATA)>

<!ELEMENT license (#PCDATA)>

<!ELEMENT description (#PCDATA)>

<!ELEMENT maintainers (maintainer)+>

<!ELEMENT maintainer (user|role|name|email)+>

<!ELEMENT user (#PCDATA)>

<!ELEMENT role (#PCDATA)>

<!ELEMENT email (#PCDATA)>

<!ELEMENT changelog (release)+>

<!ELEMENT release (version,date,license,state,notes,warnings?,provides*,deps?,configureoptions?,filelist?)>

<!ELEMENT version (#PCDATA)>

<!ELEMENT date (#PCDATA)>

<!ELEMENT state (#PCDATA)>

<!ELEMENT notes (#PCDATA)>

<!ELEMENT warnings (#PCDATA)>

<!ELEMENT deps (dep*)>

<!ELEMENT dep (#PCDATA)>
<!ATTLIST dep type    (pkg|ext|php) #REQUIRED
	                       rel     (has|eq|lt|le|gt|ge)                          #IMPLIED
	                       version CDATA                                     #IMPLIED
	                       optional (yes|no)     'no'>

<!ELEMENT configureoptions (configureoption)+>

<!ELEMENT configureoption EMPTY>
<!ATTLIST configureoption name CDATA #REQUIRED
                                           default CDATA #IMPLIED
                                           prompt CDATA #REQUIRED>

<!ELEMENT provides EMPTY>
<!ATTLIST provides type (ext|prog|class|function|feature|api) #REQUIRED
                                name CDATA #REQUIRED
                                extends CDATA #IMPLIED>
<!ELEMENT filelist (dir|file)+>

<!ELEMENT dir (dir|file)+>
<!ATTLIST dir name           CDATA #REQUIRED
              role           (php|ext|src|test|doc|data|script) 'php'
              baseinstalldir CDATA #IMPLIED>

<!ELEMENT file (replace*)>
<!ATTLIST file role           (php|ext|src|test|doc|data|script) 'php'
               debug          (na|on|off)        'na'
               format         CDATA              #IMPLIED
               baseinstalldir CDATA              #IMPLIED
               platform       CDATA              #IMPLIED
               md5sum         CDATA              #IMPLIED
               name           CDATA              #REQUIRED
               install-as     CDATA              #IMPLIED>

<!ELEMENT replace EMPTY>
<!ATTLIST replace type (php-const|pear-config|package-info) #REQUIRED
                              from CDATA #REQUIRED
                              to CDATA #REQUIRED>


PK�a�\6E�WW#pear/data/Mail_mimeDecode/xmail.xslnu�[���<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:preserve-space elements="headervalue paramvalue body"/>

	<xsl:template name="mimepart">

		<xsl:variable name="boundary">
				<xsl:for-each select="./header">
					<xsl:if test="string(./headername) = 'Content-Type'">
						<xsl:for-each select="./parameter">
							<xsl:if test="string(./paramname) = 'boundary'">
								<xsl:value-of select="paramvalue"/>
							</xsl:if>
						</xsl:for-each>
					</xsl:if>
				</xsl:for-each>
		</xsl:variable>

		<xsl:for-each select="header">

			<xsl:value-of select="headername"/>
			<xsl:text>: </xsl:text>
			<xsl:value-of select="headervalue"/>

			<xsl:if test="count(./parameter) = 0">
				<xsl:text>&#13;&#10;</xsl:text>
			</xsl:if>

			<xsl:for-each select="parameter">
				<xsl:text>;&#13;&#10;&#09;</xsl:text>
				<xsl:value-of select="paramname"/>
				<xsl:text>="</xsl:text>
				<xsl:value-of select="paramvalue"/>
				<xsl:text>"</xsl:text>
			</xsl:for-each>

			<xsl:if test="count(./parameter) > 0">
				<xsl:text>&#13;&#10;</xsl:text>
			</xsl:if>

		</xsl:for-each>

		<xsl:text>&#13;&#10;</xsl:text>

		<!-- Which to do, print a body or process subparts? -->
		<xsl:choose>
			<xsl:when test="count(./mimepart) = 0">
				<xsl:value-of select="body"/>
				<xsl:text>&#13;&#10;</xsl:text>
			</xsl:when>

			<xsl:otherwise>
				<xsl:for-each select="mimepart">
					<xsl:text>--</xsl:text><xsl:value-of select="$boundary"/><xsl:text>&#13;&#10;</xsl:text>
					<xsl:call-template name="mimepart"/>
				</xsl:for-each>

				<xsl:text>--</xsl:text><xsl:value-of select="$boundary"/><xsl:text>--&#13;&#10;</xsl:text>

			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

<!-- This is where the stylesheet really starts, matching the top level email element -->
	<xsl:template match="email">
		<xsl:call-template name="mimepart"/>
	</xsl:template>

</xsl:stylesheet>PK�a�\�
$v66#pear/data/Mail_mimeDecode/xmail.dtdnu�[���<?xml version="1.0" encoding="ISO-8859-1"?>

<!ENTITY lt "&#38;#60;">
<!ENTITY gt "&#62;">
<!ENTITY amp "&#38;#38;">
<!ENTITY apos "&#39;">
<!ENTITY quot "&#34;">
<!ENTITY crlf "&#13;&#10;">

<!ELEMENT email (header+, (body | mimepart+))>
<!ELEMENT mimepart (header+, (body | mimepart+))>
<!ELEMENT body (#PCDATA)>
<!ELEMENT header ((headername|headervalue|parameter)*)>
<!ELEMENT headername (#PCDATA)>
<!ELEMENT headervalue (#PCDATA)>
<!ELEMENT parameter ((paramname|paramvalue)+)>
<!ELEMENT paramvalue (#PCDATA)>
<!ELEMENT paramname (#PCDATA)>

PK�a�\
pear/.locknu�[���PK�a�\��Ki66?pear/test/MonologBridge/Symfony/Bridge/Monolog/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Monolog Bridge Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�a�\�o.���Spear/test/MonologBridge/Symfony/Bridge/Monolog/Tests/Processor/WebProcessorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Monolog\Tests\Processor;

use Monolog\Logger;
use Symfony\Bridge\Monolog\Processor\WebProcessor;
use Symfony\Component\HttpFoundation\Request;

class WebProcessorTest extends \PHPUnit_Framework_TestCase
{
    public function testUsesRequestServerData()
    {
        $server = array(
            'REQUEST_URI'    => 'A',
            'REMOTE_ADDR'    => 'B',
            'REQUEST_METHOD' => 'C',
            'SERVER_NAME'    => 'D',
            'HTTP_REFERER'   => 'E'
        );

        $request = new Request();
        $request->server->replace($server);

        $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')
            ->disableOriginalConstructor()
            ->getMock();
        $event->expects($this->any())
            ->method('isMasterRequest')
            ->will($this->returnValue(true));
        $event->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request));

        $processor = new WebProcessor();
        $processor->onKernelRequest($event);
        $record = $processor($this->getRecord());

        $this->assertEquals($server['REQUEST_URI'], $record['extra']['url']);
        $this->assertEquals($server['REMOTE_ADDR'], $record['extra']['ip']);
        $this->assertEquals($server['REQUEST_METHOD'], $record['extra']['http_method']);
        $this->assertEquals($server['SERVER_NAME'], $record['extra']['server']);
        $this->assertEquals($server['HTTP_REFERER'], $record['extra']['referrer']);
    }

    /**
     * @param integer $level
     * @param string  $message
     *
     * @return array Record
     */
    protected function getRecord($level = Logger::WARNING, $message = 'test')
    {
        return array(
            'message' => $message,
            'context' => array(),
            'level' => $level,
            'level_name' => Logger::getLevelName($level),
            'channel' => 'test',
            'datetime' => new \DateTime(),
            'extra' => array(),
        );
    }
}
PK�a�\&�ǦGGSpear/test/MonologBridge/Symfony/Bridge/Monolog/Tests/Handler/ConsoleHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Monolog\Tests\Handler;

use Monolog\Logger;
use Symfony\Bridge\Monolog\Handler\ConsoleHandler;
use Symfony\Component\Console\Output\OutputInterface;

/**
 * Tests the ConsoleHandler and also the ConsoleFormatter.
 *
 * @author Tobias Schultze <http://tobion.de>
 */
class ConsoleHandlerTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $handler = new ConsoleHandler(null, false);
        $this->assertFalse($handler->getBubble(), 'the bubble parameter gets propagated');
    }

    public function testIsHandling()
    {
        $handler = new ConsoleHandler();
        $this->assertFalse($handler->isHandling(array()), '->isHandling returns false when no output is set');
    }

    /**
     * @dataProvider provideVerbosityMappingTests
     */
    public function testVerbosityMapping($verbosity, $level, $isHandling, array $map = array())
    {
        $output = $this->getMock('Symfony\Component\Console\Output\OutputInterface');
        $output
            ->expects($this->atLeastOnce())
            ->method('getVerbosity')
            ->will($this->returnValue($verbosity))
        ;
        $handler = new ConsoleHandler($output, true, $map);
        $this->assertSame($isHandling, $handler->isHandling(array('level' => $level)),
            '->isHandling returns correct value depending on console verbosity and log level'
        );
    }

    public function provideVerbosityMappingTests()
    {
        return array(
            array(OutputInterface::VERBOSITY_QUIET, Logger::ERROR, false),
            array(OutputInterface::VERBOSITY_NORMAL, Logger::WARNING, true),
            array(OutputInterface::VERBOSITY_NORMAL, Logger::NOTICE, false),
            array(OutputInterface::VERBOSITY_VERBOSE, Logger::NOTICE, true),
            array(OutputInterface::VERBOSITY_VERBOSE, Logger::INFO, false),
            array(OutputInterface::VERBOSITY_VERY_VERBOSE, Logger::INFO, true),
            array(OutputInterface::VERBOSITY_VERY_VERBOSE, Logger::DEBUG, false),
            array(OutputInterface::VERBOSITY_DEBUG, Logger::DEBUG, true),
            array(OutputInterface::VERBOSITY_DEBUG, Logger::EMERGENCY, true),
            array(OutputInterface::VERBOSITY_NORMAL, Logger::NOTICE, true, array(
                OutputInterface::VERBOSITY_NORMAL => Logger::NOTICE
            )),
            array(OutputInterface::VERBOSITY_DEBUG, Logger::NOTICE, true, array(
                OutputInterface::VERBOSITY_NORMAL => Logger::NOTICE
            )),
        );
    }

    public function testVerbosityChanged()
    {
        $output = $this->getMock('Symfony\Component\Console\Output\OutputInterface');
        $output
            ->expects($this->at(0))
            ->method('getVerbosity')
            ->will($this->returnValue(OutputInterface::VERBOSITY_QUIET))
        ;
        $output
            ->expects($this->at(1))
            ->method('getVerbosity')
            ->will($this->returnValue(OutputInterface::VERBOSITY_DEBUG))
        ;
        $handler = new ConsoleHandler($output);
        $this->assertFalse($handler->isHandling(array('level' => Logger::NOTICE)),
            'when verbosity is set to quiet, the handler does not handle the log'
        );
        $this->assertTrue($handler->isHandling(array('level' => Logger::NOTICE)),
            'since the verbosity of the output increased externally, the handler is now handling the log'
        );
    }

    public function testGetFormatter()
    {
        $handler = new ConsoleHandler();
        $this->assertInstanceOf('Symfony\Bridge\Monolog\Formatter\ConsoleFormatter', $handler->getFormatter(),
            '-getFormatter returns ConsoleFormatter by default'
        );
    }

    public function testWritingAndFormatting()
    {
        $output = $this->getMock('Symfony\Component\Console\Output\ConsoleOutputInterface');
        $output
            ->expects($this->any())
            ->method('getVerbosity')
            ->will($this->returnValue(OutputInterface::VERBOSITY_DEBUG))
        ;
        $output
            ->expects($this->once())
            ->method('write')
            ->with('<info>[2013-05-29 16:21:54] app.INFO:</info> My info message [] []'."\n")
        ;

        $errorOutput = $this->getMock('Symfony\Component\Console\Output\OutputInterface');
        $errorOutput
            ->expects($this->once())
            ->method('write')
            ->with('<error>[2013-05-29 16:21:54] app.ERROR:</error> My error message [] []'."\n")
        ;

        $output
            ->expects($this->any())
            ->method('getErrorOutput')
            ->will($this->returnValue($errorOutput))
        ;

        $handler = new ConsoleHandler(null, false);
        $handler->setOutput($output);

        $infoRecord = array(
            'message' => 'My info message',
            'context' => array(),
            'level' => Logger::INFO,
            'level_name' => Logger::getLevelName(Logger::INFO),
            'channel' => 'app',
            'datetime' => new \DateTime('2013-05-29 16:21:54'),
            'extra' => array(),
        );

        $this->assertTrue($handler->handle($infoRecord), 'The handler finished handling the log as bubble is false.');

        $errorRecord = array(
            'message' => 'My error message',
            'context' => array(),
            'level' => Logger::ERROR,
            'level_name' => Logger::getLevelName(Logger::ERROR),
            'channel' => 'app',
            'datetime' => new \DateTime('2013-05-29 16:21:54'),
            'extra' => array(),
        );

        $this->assertTrue($handler->handle($errorRecord), 'The handler finished handling the log as bubble is false.');
    }
}
PK�a�\��x99Bpear/test/HttpKernel/Symfony/Component/HttpKernel/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony HttpKernel Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�a�\�[���apear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/MemcachedProfilerStorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler;

use Symfony\Component\HttpKernel\Profiler\MemcachedProfilerStorage;
use Symfony\Component\HttpKernel\Tests\Profiler\Mock\MemcachedMock;

class MemcachedProfilerStorageTest extends AbstractProfilerStorageTest
{
    protected static $storage;

    protected function setUp()
    {
        $memcachedMock = new MemcachedMock();
        $memcachedMock->addServer('127.0.0.1', 11211);

        self::$storage = new MemcachedProfilerStorage('memcached://127.0.0.1:11211', '', '', 86400);
        self::$storage->setMemcached($memcachedMock);

        if (self::$storage) {
            self::$storage->purge();
        }
    }

    protected function tearDown()
    {
        if (self::$storage) {
            self::$storage->purge();
            self::$storage = false;
        }
    }

    /**
     * @return \Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface
     */
    protected function getStorage()
    {
        return self::$storage;
    }
}
PK�a�\i�]��Vpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcacheMock.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler\Mock;

/**
 * MemcacheMock for simulating Memcache extension in tests.
 *
 * @author Andrej Hudec <pulzarraider@gmail.com>
 */
class MemcacheMock
{
    private $connected = false;
    private $storage = array();

    /**
     * Open memcached server connection
     *
     * @param string  $host
     * @param integer $port
     * @param integer $timeout
     *
     * @return boolean
     */
    public function connect($host, $port = null, $timeout = null)
    {
        if ('127.0.0.1' == $host && 11211 == $port) {
            $this->connected = true;

            return true;
        }

        return false;
    }

    /**
     * Open memcached server persistent connection
     *
     * @param string  $host
     * @param integer $port
     * @param integer $timeout
     *
     * @return boolean
     */
    public function pconnect($host, $port = null, $timeout = null)
    {
        if ('127.0.0.1' == $host && 11211 == $port) {
            $this->connected = true;

            return true;
        }

        return false;
    }

    /**
     * Add a memcached server to connection pool
     *
     * @param string   $host
     * @param integer  $port
     * @param boolean  $persistent
     * @param integer  $weight
     * @param integer  $timeout
     * @param integer  $retry_interval
     * @param boolean  $status
     * @param callable $failure_callback
     * @param integer  $timeoutms
     *
     * @return boolean
     */
    public function addServer($host, $port = 11211, $persistent = null, $weight = null, $timeout = null, $retry_interval = null, $status = null, $failure_callback = null, $timeoutms = null)
    {
        if ('127.0.0.1' == $host && 11211 == $port) {
            $this->connected = true;

            return true;
        }

        return false;
    }

    /**
     * Add an item to the server only if such key doesn't exist at the server yet.
     *
     * @param string  $key
     * @param mixed   $var
     * @param integer $flag
     * @param integer $expire
     *
     * @return boolean
     */
    public function add($key, $var, $flag = null, $expire = null)
    {
        if (!$this->connected) {
            return false;
        }

        if (!isset($this->storage[$key])) {
            $this->storeData($key, $var);

            return true;
        }

        return false;
    }

    /**
     * Store data at the server.
     *
     * @param string  $key
     * @param string  $var
     * @param integer $flag
     * @param integer $expire
     *
     * @return boolean
     */
    public function set($key, $var, $flag = null, $expire = null)
    {
        if (!$this->connected) {
            return false;
        }

        $this->storeData($key, $var);

        return true;
    }

    /**
     * Replace value of the existing item.
     *
     * @param string  $key
     * @param mixed   $var
     * @param integer $flag
     * @param integer $expire
     *
     * @return boolean
     */
    public function replace($key, $var, $flag = null, $expire = null)
    {
        if (!$this->connected) {
            return false;
        }

        if (isset($this->storage[$key])) {
            $this->storeData($key, $var);

            return true;
        }

        return false;
    }

    /**
     * Retrieve item from the server.
     *
     * @param string|array  $key
     * @param integer|array $flags
     *
     * @return mixed
     */
    public function get($key, &$flags = null)
    {
        if (!$this->connected) {
            return false;
        }

        if (is_array($key)) {
            $result = array();
            foreach ($key as $k) {
                if (isset($this->storage[$k])) {
                    $result[] = $this->getData($k);
                }
            }

            return $result;
        }

        return $this->getData($key);
    }

    /**
     * Delete item from the server
     *
     * @param string $key
     *
     * @return boolean
     */
    public function delete($key)
    {
        if (!$this->connected) {
            return false;
        }

        if (isset($this->storage[$key])) {
            unset($this->storage[$key]);

            return true;
        }

        return false;
    }

    /**
     * Flush all existing items at the server
     *
     * @return boolean
     */
    public function flush()
    {
        if (!$this->connected) {
            return false;
        }

        $this->storage = array();

        return true;
    }

    /**
     * Close memcached server connection
     *
     * @return boolean
     */
    public function close()
    {
        $this->connected = false;

        return true;
    }

    private function getData($key)
    {
        if (isset($this->storage[$key])) {
            return unserialize($this->storage[$key]);
        }

        return false;
    }

    private function storeData($key, $value)
    {
        $this->storage[$key] = serialize($value);

        return true;
    }
}
PK�a�\e��K

Spear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/RedisMock.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler\Mock;

/**
 * RedisMock for simulating Redis extension in tests.
 *
 * @author Andrej Hudec <pulzarraider@gmail.com>
 */
class RedisMock
{
    private $connected = false;
    private $storage = array();

    /**
     * Add a server to connection pool
     *
     * @param string  $host
     * @param integer $port
     * @param float   $timeout
     *
     * @return boolean
     */
    public function connect($host, $port = 6379, $timeout = 0)
    {
        if ('127.0.0.1' == $host && 6379 == $port) {
            $this->connected = true;

            return true;
        }

        return false;
    }

    /**
     * Set client option.
     *
     * @param integer $name
     * @param integer $value
     *
     * @return boolean
     */
    public function setOption($name, $value)
    {
        if (!$this->connected) {
            return false;
        }

        return true;
    }

    /**
     * Verify if the specified key exists.
     *
     * @param string $key
     *
     * @return boolean
     */
    public function exists($key)
    {
        if (!$this->connected) {
            return false;
        }

        return isset($this->storage[$key]);
    }

    /**
     * Store data at the server with expiration time.
     *
     * @param string  $key
     * @param integer $ttl
     * @param mixed   $value
     *
     * @return boolean
     */
    public function setex($key, $ttl, $value)
    {
        if (!$this->connected) {
            return false;
        }

        $this->storeData($key, $value);

        return true;
    }

    /**
     * Sets an expiration time on an item.
     *
     * @param string  $key
     * @param integer $ttl
     *
     * @return boolean
     */
    public function setTimeout($key, $ttl)
    {
        if (!$this->connected) {
            return false;
        }

        if (isset($this->storage[$key])) {
            return true;
        }

        return false;
    }

    /**
     * Retrieve item from the server.
     *
     * @param string $key
     *
     * @return boolean
     */
    public function get($key)
    {
        if (!$this->connected) {
            return false;
        }

        return $this->getData($key);
    }

    /**
     * Append data to an existing item
     *
     * @param string $key
     * @param string $value
     *
     * @return integer Size of the value after the append.
     */
    public function append($key, $value)
    {
        if (!$this->connected) {
            return false;
        }

        if (isset($this->storage[$key])) {
            $this->storeData($key, $this->getData($key).$value);

            return strlen($this->storage[$key]);
        }

        return false;
    }

    /**
     * Remove specified keys.
     *
     * @param string|array $key
     *
     * @return integer
     */
    public function delete($key)
    {
        if (!$this->connected) {
            return false;
        }

        if (is_array($key)) {
            $result = 0;
            foreach ($key as $k) {
                if (isset($this->storage[$k])) {
                    unset($this->storage[$k]);
                    ++$result;
                }
            }

            return $result;
        }

        if (isset($this->storage[$key])) {
            unset($this->storage[$key]);

            return 1;
        }

        return 0;
    }

    /**
     * Flush all existing items from all databases at the server.
     *
     * @return boolean
     */
    public function flushAll()
    {
        if (!$this->connected) {
            return false;
        }

        $this->storage = array();

        return true;
    }

    /**
     * Close Redis server connection
     *
     * @return boolean
     */
    public function close()
    {
        $this->connected = false;

        return true;
    }

    private function getData($key)
    {
        if (isset($this->storage[$key])) {
            return unserialize($this->storage[$key]);
        }

        return false;
    }

    private function storeData($key, $value)
    {
        $this->storage[$key] = serialize($value);

        return true;
    }

    public function select($dbnum)
    {
        if (!$this->connected) {
            return false;
        }

        if (0 > $dbnum) {
            return false;
        }

        return true;
    }
}
PK�a�\�.�\��Wpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/Mock/MemcachedMock.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler\Mock;

/**
 * MemcachedMock for simulating Memcached extension in tests.
 *
 * @author Andrej Hudec <pulzarraider@gmail.com>
 */
class MemcachedMock
{
    private $connected = false;
    private $storage = array();

    /**
     * Set a Memcached option
     *
     * @param integer $option
     * @param mixed   $value
     *
     * @return boolean
     */
    public function setOption($option, $value)
    {
        return true;
    }

    /**
     * Add a memcached server to connection pool
     *
     * @param string  $host
     * @param integer $port
     * @param integer $weight
     *
     * @return boolean
     */
    public function addServer($host, $port = 11211, $weight = 0)
    {
        if ('127.0.0.1' == $host && 11211 == $port) {
            $this->connected = true;

            return true;
        }

        return false;
    }

    /**
     * Add an item to the server only if such key doesn't exist at the server yet.
     *
     * @param string  $key
     * @param mixed   $value
     * @param integer $expiration
     *
     * @return boolean
     */
    public function add($key, $value, $expiration = 0)
    {
        if (!$this->connected) {
            return false;
        }

        if (!isset($this->storage[$key])) {
            $this->storeData($key, $value);

            return true;
        }

        return false;
    }

    /**
     * Store data at the server.
     *
     * @param string  $key
     * @param mixed   $value
     * @param integer $expiration
     *
     * @return boolean
     */
    public function set($key, $value, $expiration = null)
    {
        if (!$this->connected) {
            return false;
        }

        $this->storeData($key, $value);

        return true;
    }

    /**
     * Replace value of the existing item.
     *
     * @param string  $key
     * @param mixed   $value
     * @param integer $expiration
     *
     * @return boolean
     */
    public function replace($key, $value, $expiration = null)
    {
        if (!$this->connected) {
            return false;
        }

        if (isset($this->storage[$key])) {
            $this->storeData($key, $value);

            return true;
        }

        return false;
    }

    /**
     * Retrieve item from the server.
     *
     * @param string   $key
     * @param callable $cache_cb
     * @param float    $cas_token
     *
     * @return boolean
     */
    public function get($key, $cache_cb = null, &$cas_token = null)
    {
        if (!$this->connected) {
            return false;
        }

        return $this->getData($key);
    }

    /**
     * Append data to an existing item
     *
     * @param string $key
     * @param string $value
     *
     * @return boolean
     */
    public function append($key, $value)
    {
        if (!$this->connected) {
            return false;
        }

        if (isset($this->storage[$key])) {
            $this->storeData($key, $this->getData($key).$value);

            return true;
        }

        return false;
    }

    /**
     * Delete item from the server
     *
     * @param string $key
     *
     * @return boolean
     */
    public function delete($key)
    {
        if (!$this->connected) {
            return false;
        }

        if (isset($this->storage[$key])) {
            unset($this->storage[$key]);

            return true;
        }

        return false;
    }

    /**
     * Flush all existing items at the server
     *
     * @return boolean
     */
    public function flush()
    {
        if (!$this->connected) {
            return false;
        }

        $this->storage = array();

        return true;
    }

    private function getData($key)
    {
        if (isset($this->storage[$key])) {
            return unserialize($this->storage[$key]);
        }

        return false;
    }

    private function storeData($key, $value)
    {
        $this->storage[$key] = serialize($value);

        return true;
    }
}
PK�a�\`ej��_pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/MongoDbProfilerStorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler;

use Symfony\Component\HttpKernel\Profiler\MongoDbProfilerStorage;
use Symfony\Component\HttpKernel\Profiler\Profile;
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class DummyMongoDbProfilerStorage extends MongoDbProfilerStorage
{
    public function getMongo()
    {
        return parent::getMongo();
    }
}

class MongoDbProfilerStorageTestDataCollector extends DataCollector
{
    public function setData($data)
    {
        $this->data = $data;
    }

    public function getData()
    {
        return $this->data;
    }

    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
    }

    public function getName()
    {
        return 'test_data_collector';
    }
}

class MongoDbProfilerStorageTest extends AbstractProfilerStorageTest
{
    protected static $storage;

    public static function setUpBeforeClass()
    {
        if (extension_loaded('mongo')) {
            self::$storage = new DummyMongoDbProfilerStorage('mongodb://localhost/symfony_tests/profiler_data', '', '', 86400);
            try {
                self::$storage->getMongo();
            } catch (\MongoConnectionException $e) {
                self::$storage = null;
            }
        }
    }

    public static function tearDownAfterClass()
    {
        if (self::$storage) {
            self::$storage->purge();
            self::$storage = null;
        }
    }

    public function getDsns()
    {
        return array(
            array('mongodb://localhost/symfony_tests/profiler_data', array(
                'mongodb://localhost/symfony_tests',
                'symfony_tests',
                'profiler_data'
            )),
            array('mongodb://user:password@localhost/symfony_tests/profiler_data', array(
                'mongodb://user:password@localhost/symfony_tests',
                'symfony_tests',
                'profiler_data'
            )),
            array('mongodb://user:password@localhost/admin/symfony_tests/profiler_data', array(
                'mongodb://user:password@localhost/admin',
                'symfony_tests',
                'profiler_data'
            )),
            array('mongodb://user:password@localhost:27009,localhost:27010/?replicaSet=rs-name&authSource=admin/symfony_tests/profiler_data', array(
                'mongodb://user:password@localhost:27009,localhost:27010/?replicaSet=rs-name&authSource=admin',
                'symfony_tests',
                'profiler_data'
            ))
        );
    }

    public function testCleanup()
    {
        $dt = new \DateTime('-2 day');
        for ($i = 0; $i < 3; $i++) {
            $dt->modify('-1 day');
            $profile = new Profile('time_'.$i);
            $profile->setTime($dt->getTimestamp());
            $profile->setMethod('GET');
            self::$storage->write($profile);
        }
        $records = self::$storage->find('', '', 3, 'GET');
        $this->assertCount(1, $records, '->find() returns only one record');
        $this->assertEquals($records[0]['token'], 'time_2', '->find() returns the latest added record');
        self::$storage->purge();
    }

    /**
     * @dataProvider getDsns
     */
    public function testDsnParser($dsn, $expected)
    {
        $m = new \ReflectionMethod(self::$storage, 'parseDsn');
        $m->setAccessible(true);

        $this->assertEquals($expected, $m->invoke(self::$storage, $dsn));
    }

    public function testUtf8()
    {
        $profile = new Profile('utf8_test_profile');

        $data = 'HЁʃʃϿ, ϢorЃd!';
        $nonUtf8Data = mb_convert_encoding($data, 'UCS-2');

        $collector = new MongoDbProfilerStorageTestDataCollector();
        $collector->setData($nonUtf8Data);

        $profile->setCollectors(array($collector));

        self::$storage->write($profile);

        $readProfile = self::$storage->read('utf8_test_profile');
        $collectors = $readProfile->getCollectors();

        $this->assertCount(1, $collectors);
        $this->assertArrayHasKey('test_data_collector', $collectors);
        $this->assertEquals($nonUtf8Data, $collectors['test_data_collector']->getData(), 'Non-UTF8 data is properly encoded/decoded');
    }

    /**
     * @return \Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface
     */
    protected function getStorage()
    {
        return self::$storage;
    }

    protected function setUp()
    {
        if (self::$storage) {
            self::$storage->purge();
        } else {
            $this->markTestSkipped('MongoDbProfilerStorageTest requires the mongo PHP extension and a MongoDB server on localhost');
        }
    }
}
PK�a�\�,���)�)`pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/AbstractProfilerStorageTest.phpnu�[���<?php
/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler;

use Symfony\Component\HttpKernel\Profiler\Profile;

abstract class AbstractProfilerStorageTest extends \PHPUnit_Framework_TestCase
{
    public function testStore()
    {
        for ($i = 0; $i < 10; $i ++) {
            $profile = new Profile('token_'.$i);
            $profile->setIp('127.0.0.1');
            $profile->setUrl('http://foo.bar');
            $profile->setMethod('GET');
            $this->getStorage()->write($profile);
        }
        $this->assertCount(10, $this->getStorage()->find('127.0.0.1', 'http://foo.bar', 20, 'GET'), '->write() stores data in the storage');
    }

    public function testChildren()
    {
        $parentProfile = new Profile('token_parent');
        $parentProfile->setIp('127.0.0.1');
        $parentProfile->setUrl('http://foo.bar/parent');

        $childProfile = new Profile('token_child');
        $childProfile->setIp('127.0.0.1');
        $childProfile->setUrl('http://foo.bar/child');

        $parentProfile->addChild($childProfile);

        $this->getStorage()->write($parentProfile);
        $this->getStorage()->write($childProfile);

        // Load them from storage
        $parentProfile = $this->getStorage()->read('token_parent');
        $childProfile  = $this->getStorage()->read('token_child');

        // Check child has link to parent
        $this->assertNotNull($childProfile->getParent());
        $this->assertEquals($parentProfile->getToken(), $childProfile->getParentToken());

        // Check parent has child
        $children = $parentProfile->getChildren();
        $this->assertCount(1, $children);
        $this->assertEquals($childProfile->getToken(), $children[0]->getToken());
    }

    public function testStoreSpecialCharsInUrl()
    {
        // The storage accepts special characters in URLs (Even though URLs are not
        // supposed to contain them)
        $profile = new Profile('simple_quote');
        $profile->setUrl('http://foo.bar/\'');
        $this->getStorage()->write($profile);
        $this->assertTrue(false !== $this->getStorage()->read('simple_quote'), '->write() accepts single quotes in URL');

        $profile = new Profile('double_quote');
        $profile->setUrl('http://foo.bar/"');
        $this->getStorage()->write($profile);
        $this->assertTrue(false !== $this->getStorage()->read('double_quote'), '->write() accepts double quotes in URL');

        $profile = new Profile('backslash');
        $profile->setUrl('http://foo.bar/\\');
        $this->getStorage()->write($profile);
        $this->assertTrue(false !== $this->getStorage()->read('backslash'), '->write() accepts backslash in URL');

        $profile = new Profile('comma');
        $profile->setUrl('http://foo.bar/,');
        $this->getStorage()->write($profile);
        $this->assertTrue(false !== $this->getStorage()->read('comma'), '->write() accepts comma in URL');
    }

    public function testStoreDuplicateToken()
    {
        $profile = new Profile('token');
        $profile->setUrl('http://example.com/');

        $this->assertTrue($this->getStorage()->write($profile), '->write() returns true when the token is unique');

        $profile->setUrl('http://example.net/');

        $this->assertTrue($this->getStorage()->write($profile), '->write() returns true when the token is already present in the storage');
        $this->assertEquals('http://example.net/', $this->getStorage()->read('token')->getUrl(), '->write() overwrites the current profile data');

        $this->assertCount(1, $this->getStorage()->find('', '', 1000, ''), '->find() does not return the same profile twice');
    }

    public function testRetrieveByIp()
    {
        $profile = new Profile('token');
        $profile->setIp('127.0.0.1');
        $profile->setMethod('GET');
        $this->getStorage()->write($profile);

        $this->assertCount(1, $this->getStorage()->find('127.0.0.1', '', 10, 'GET'), '->find() retrieve a record by IP');
        $this->assertCount(0, $this->getStorage()->find('127.0.%.1', '', 10, 'GET'), '->find() does not interpret a "%" as a wildcard in the IP');
        $this->assertCount(0, $this->getStorage()->find('127.0._.1', '', 10, 'GET'), '->find() does not interpret a "_" as a wildcard in the IP');
    }

    public function testRetrieveByUrl()
    {
        $profile = new Profile('simple_quote');
        $profile->setIp('127.0.0.1');
        $profile->setUrl('http://foo.bar/\'');
        $profile->setMethod('GET');
        $this->getStorage()->write($profile);

        $profile = new Profile('double_quote');
        $profile->setIp('127.0.0.1');
        $profile->setUrl('http://foo.bar/"');
        $profile->setMethod('GET');
        $this->getStorage()->write($profile);

        $profile = new Profile('backslash');
        $profile->setIp('127.0.0.1');
        $profile->setUrl('http://foo\\bar/');
        $profile->setMethod('GET');
        $this->getStorage()->write($profile);

        $profile = new Profile('percent');
        $profile->setIp('127.0.0.1');
        $profile->setUrl('http://foo.bar/%');
        $profile->setMethod('GET');
        $this->getStorage()->write($profile);

        $profile = new Profile('underscore');
        $profile->setIp('127.0.0.1');
        $profile->setUrl('http://foo.bar/_');
        $profile->setMethod('GET');
        $this->getStorage()->write($profile);

        $profile = new Profile('semicolon');
        $profile->setIp('127.0.0.1');
        $profile->setUrl('http://foo.bar/;');
        $profile->setMethod('GET');
        $this->getStorage()->write($profile);

        $this->assertCount(1, $this->getStorage()->find('127.0.0.1', 'http://foo.bar/\'', 10, 'GET'), '->find() accepts single quotes in URLs');
        $this->assertCount(1, $this->getStorage()->find('127.0.0.1', 'http://foo.bar/"', 10, 'GET'), '->find() accepts double quotes in URLs');
        $this->assertCount(1, $this->getStorage()->find('127.0.0.1', 'http://foo\\bar/', 10, 'GET'), '->find() accepts backslash in URLs');
        $this->assertCount(1, $this->getStorage()->find('127.0.0.1', 'http://foo.bar/;', 10, 'GET'), '->find() accepts semicolon in URLs');
        $this->assertCount(1, $this->getStorage()->find('127.0.0.1', 'http://foo.bar/%', 10, 'GET'), '->find() does not interpret a "%" as a wildcard in the URL');
        $this->assertCount(1, $this->getStorage()->find('127.0.0.1', 'http://foo.bar/_', 10, 'GET'), '->find() does not interpret a "_" as a wildcard in the URL');
    }

    public function testStoreTime()
    {
        $dt = new \DateTime('now');
        $start = $dt->getTimestamp();

        for ($i = 0; $i < 3; $i++) {
            $dt->modify('+1 minute');
            $profile = new Profile('time_'.$i);
            $profile->setIp('127.0.0.1');
            $profile->setUrl('http://foo.bar');
            $profile->setTime($dt->getTimestamp());
            $profile->setMethod('GET');
            $this->getStorage()->write($profile);
        }

        $records = $this->getStorage()->find('', '', 3, 'GET', $start, time() + 3 * 60);
        $this->assertCount(3, $records, '->find() returns all previously added records');
        $this->assertEquals($records[0]['token'], 'time_2', '->find() returns records ordered by time in descendant order');
        $this->assertEquals($records[1]['token'], 'time_1', '->find() returns records ordered by time in descendant order');
        $this->assertEquals($records[2]['token'], 'time_0', '->find() returns records ordered by time in descendant order');

        $records = $this->getStorage()->find('', '', 3, 'GET', $start, time() + 2 * 60);
        $this->assertCount(2, $records, '->find() should return only first two of the previously added records');
    }

    public function testRetrieveByEmptyUrlAndIp()
    {
        for ($i = 0; $i < 5; $i++) {
            $profile = new Profile('token_'.$i);
            $profile->setMethod('GET');
            $this->getStorage()->write($profile);
        }
        $this->assertCount(5, $this->getStorage()->find('', '', 10, 'GET'), '->find() returns all previously added records');
        $this->getStorage()->purge();
    }

    public function testRetrieveByMethodAndLimit()
    {
        foreach (array('POST', 'GET') as $method) {
            for ($i = 0; $i < 5; $i++) {
                $profile = new Profile('token_'.$i.$method);
                $profile->setMethod($method);
                $this->getStorage()->write($profile);
            }
        }

        $this->assertCount(5, $this->getStorage()->find('', '', 5, 'POST'));

        $this->getStorage()->purge();
    }

    public function testPurge()
    {
        $profile = new Profile('token1');
        $profile->setIp('127.0.0.1');
        $profile->setUrl('http://example.com/');
        $profile->setMethod('GET');
        $this->getStorage()->write($profile);

        $this->assertTrue(false !== $this->getStorage()->read('token1'));
        $this->assertCount(1, $this->getStorage()->find('127.0.0.1', '', 10, 'GET'));

        $profile = new Profile('token2');
        $profile->setIp('127.0.0.1');
        $profile->setUrl('http://example.net/');
        $profile->setMethod('GET');
        $this->getStorage()->write($profile);

        $this->assertTrue(false !== $this->getStorage()->read('token2'));
        $this->assertCount(2, $this->getStorage()->find('127.0.0.1', '', 10, 'GET'));

        $this->getStorage()->purge();

        $this->assertEmpty($this->getStorage()->read('token'), '->purge() removes all data stored by profiler');
        $this->assertCount(0, $this->getStorage()->find('127.0.0.1', '', 10, 'GET'), '->purge() removes all items from index');
    }

    public function testDuplicates()
    {
        for ($i = 1; $i <= 5; $i++) {
            $profile = new Profile('foo'.$i);
            $profile->setIp('127.0.0.1');
            $profile->setUrl('http://example.net/');
            $profile->setMethod('GET');

            ///three duplicates
            $this->getStorage()->write($profile);
            $this->getStorage()->write($profile);
            $this->getStorage()->write($profile);
        }
        $this->assertCount(3, $this->getStorage()->find('127.0.0.1', 'http://example.net/', 3, 'GET'), '->find() method returns incorrect number of entries');
    }

    /**
     * @return \Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface
     */
    abstract protected function getStorage();
}
PK�a�\T���
�
\pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/FileProfilerStorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler;

use Symfony\Component\HttpKernel\Profiler\FileProfilerStorage;
use Symfony\Component\HttpKernel\Profiler\Profile;

class FileProfilerStorageTest extends AbstractProfilerStorageTest
{
    protected static $tmpDir;
    protected static $storage;

    protected static function cleanDir()
    {
        $flags = \FilesystemIterator::SKIP_DOTS;
        $iterator = new \RecursiveDirectoryIterator(self::$tmpDir, $flags);
        $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);

        foreach ($iterator as $file) {
            if (is_file($file)) {
                unlink($file);
            }
        }
    }

    public static function setUpBeforeClass()
    {
        self::$tmpDir = sys_get_temp_dir().'/sf2_profiler_file_storage';
        if (is_dir(self::$tmpDir)) {
            self::cleanDir();
        }
        self::$storage = new FileProfilerStorage('file:'.self::$tmpDir);
    }

    public static function tearDownAfterClass()
    {
        self::cleanDir();
    }

    protected function setUp()
    {
        self::$storage->purge();
    }

    /**
     * @return \Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface
     */
    protected function getStorage()
    {
        return self::$storage;
    }

    public function testMultiRowIndexFile()
    {
        $iteration = 3;
        for ($i = 0; $i < $iteration; $i++) {
            $profile = new Profile('token'.$i);
            $profile->setIp('127.0.0.'.$i);
            $profile->setUrl('http://foo.bar/'.$i);
            $storage = $this->getStorage();

            $storage->write($profile);
            $storage->write($profile);
            $storage->write($profile);
        }

        $handle = fopen(self::$tmpDir.'/index.csv', 'r');
        for ($i = 0; $i < $iteration; $i++) {
            $row = fgetcsv($handle);
            $this->assertEquals('token'.$i, $row[0]);
            $this->assertEquals('127.0.0.'.$i, $row[1]);
            $this->assertEquals('http://foo.bar/'.$i, $row[3]);
        }
        $this->assertFalse(fgetcsv($handle));
    }

    public function testReadLineFromFile()
    {
        $r = new \ReflectionMethod(self::$storage, 'readLineFromFile');

        $r->setAccessible(true);

        $h = tmpfile();

        fwrite($h, "line1\n\n\nline2\n");
        fseek($h, 0, SEEK_END);

        $this->assertEquals("line2", $r->invoke(self::$storage, $h));
        $this->assertEquals("line1", $r->invoke(self::$storage, $h));
    }
}
PK�a�\!�g���`pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/MemcacheProfilerStorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler;

use Symfony\Component\HttpKernel\Profiler\MemcacheProfilerStorage;
use Symfony\Component\HttpKernel\Tests\Profiler\Mock\MemcacheMock;

class MemcacheProfilerStorageTest extends AbstractProfilerStorageTest
{
    protected static $storage;

    protected function setUp()
    {
        $memcacheMock = new MemcacheMock();
        $memcacheMock->addServer('127.0.0.1', 11211);

        self::$storage = new MemcacheProfilerStorage('memcache://127.0.0.1:11211', '', '', 86400);
        self::$storage->setMemcache($memcacheMock);

        if (self::$storage) {
            self::$storage->purge();
        }
    }

    protected function tearDown()
    {
        if (self::$storage) {
            self::$storage->purge();
            self::$storage = false;
        }
    }

    /**
     * @return \Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface
     */
    protected function getStorage()
    {
        return self::$storage;
    }
}
PK�a�\�FE��]pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/RedisProfilerStorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler;

use Symfony\Component\HttpKernel\Profiler\RedisProfilerStorage;
use Symfony\Component\HttpKernel\Tests\Profiler\Mock\RedisMock;

class RedisProfilerStorageTest extends AbstractProfilerStorageTest
{
    protected static $storage;

    protected function setUp()
    {
        $redisMock = new RedisMock();
        $redisMock->connect('127.0.0.1', 6379);

        self::$storage = new RedisProfilerStorage('redis://127.0.0.1:6379', '', '', 86400);
        self::$storage->setRedis($redisMock);

        if (self::$storage) {
            self::$storage->purge();
        }
    }

    protected function tearDown()
    {
        if (self::$storage) {
            self::$storage->purge();
            self::$storage = false;
        }
    }

    /**
     * @return \Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface
     */
    protected function getStorage()
    {
        return self::$storage;
    }
}
PK�a�\p3hNN^pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/SqliteProfilerStorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler;

use Symfony\Component\HttpKernel\Profiler\SqliteProfilerStorage;

class SqliteProfilerStorageTest extends AbstractProfilerStorageTest
{
    protected static $dbFile;
    protected static $storage;

    public static function setUpBeforeClass()
    {
        self::$dbFile = tempnam(sys_get_temp_dir(), 'sf2_sqlite_storage');
        if (file_exists(self::$dbFile)) {
            @unlink(self::$dbFile);
        }
        self::$storage = new SqliteProfilerStorage('sqlite:'.self::$dbFile);
    }

    public static function tearDownAfterClass()
    {
        @unlink(self::$dbFile);
    }

    protected function setUp()
    {
        if (!class_exists('SQLite3') && (!class_exists('PDO') || !in_array('sqlite', \PDO::getAvailableDrivers()))) {
            $this->markTestSkipped('This test requires SQLite support in your environment');
        }
        self::$storage->purge();
    }

    /**
     * @return \Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface
     */
    protected function getStorage()
    {
        return self::$storage;
    }
}
PK�a�\�&2TTQpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Profiler/ProfilerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Profiler;

use Symfony\Component\HttpKernel\DataCollector\RequestDataCollector;
use Symfony\Component\HttpKernel\Profiler\SqliteProfilerStorage;
use Symfony\Component\HttpKernel\Profiler\Profiler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class ProfilerTest extends \PHPUnit_Framework_TestCase
{
    public function testCollect()
    {
        if (!class_exists('SQLite3') && (!class_exists('PDO') || !in_array('sqlite', \PDO::getAvailableDrivers()))) {
            $this->markTestSkipped('This test requires SQLite support in your environment');
        }

        $request = new Request();
        $request->query->set('foo', 'bar');
        $response = new Response();
        $collector = new RequestDataCollector();

        $tmp = tempnam(sys_get_temp_dir(), 'sf2_profiler');
        if (file_exists($tmp)) {
            @unlink($tmp);
        }
        $storage = new SqliteProfilerStorage('sqlite:'.$tmp);
        $storage->purge();

        $profiler = new Profiler($storage);
        $profiler->add($collector);
        $profile = $profiler->collect($request, $response);

        $profile = $profiler->loadProfile($profile->getToken());
        $this->assertEquals(array('foo' => 'bar'), $profiler->get('request')->getRequestQuery()->all());

        @unlink($tmp);
    }
}
PK�a�\���S��`pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerAggregateTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\CacheWarmer;

use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate;
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer;

class CacheWarmerAggregateTest extends \PHPUnit_Framework_TestCase
{
    protected static $cacheDir;

    public static function setUpBeforeClass()
    {
        self::$cacheDir = tempnam(sys_get_temp_dir(), 'sf2_cache_warmer_dir');
    }

    public static function tearDownAfterClass()
    {
        @unlink(self::$cacheDir);
    }

    public function testInjectWarmersUsingConstructor()
    {
        $warmer = $this->getCacheWarmerMock();
        $warmer
            ->expects($this->once())
            ->method('warmUp');
        $aggregate = new CacheWarmerAggregate(array($warmer));
        $aggregate->warmUp(self::$cacheDir);
    }

    public function testInjectWarmersUsingAdd()
    {
        $warmer = $this->getCacheWarmerMock();
        $warmer
            ->expects($this->once())
            ->method('warmUp');
        $aggregate = new CacheWarmerAggregate();
        $aggregate->add($warmer);
        $aggregate->warmUp(self::$cacheDir);
    }

    public function testInjectWarmersUsingSetWarmers()
    {
        $warmer = $this->getCacheWarmerMock();
        $warmer
            ->expects($this->once())
            ->method('warmUp');
        $aggregate = new CacheWarmerAggregate();
        $aggregate->setWarmers(array($warmer));
        $aggregate->warmUp(self::$cacheDir);
    }

    public function testWarmupDoesCallWarmupOnOptionalWarmersWhenEnableOptionalWarmersIsEnabled()
    {
        $warmer = $this->getCacheWarmerMock();
        $warmer
            ->expects($this->never())
            ->method('isOptional');
        $warmer
            ->expects($this->once())
            ->method('warmUp');

        $aggregate = new CacheWarmerAggregate(array($warmer));
        $aggregate->enableOptionalWarmers();
        $aggregate->warmUp(self::$cacheDir);
    }

    public function testWarmupDoesNotCallWarmupOnOptionalWarmersWhenEnableOptionalWarmersIsNotEnabled()
    {
        $warmer = $this->getCacheWarmerMock();
        $warmer
            ->expects($this->once())
            ->method('isOptional')
            ->will($this->returnValue(true));
        $warmer
            ->expects($this->never())
            ->method('warmUp');

        $aggregate = new CacheWarmerAggregate(array($warmer));
        $aggregate->warmUp(self::$cacheDir);
    }

    protected function getCacheWarmerMock()
    {
        $warmer = $this->getMockBuilder('Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface')
            ->disableOriginalConstructor()
            ->getMock();

        return $warmer;
    }
}
PK�a�\���,%%Wpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/CacheWarmer/CacheWarmerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\CacheWarmer;

use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmer;

class CacheWarmerTest extends \PHPUnit_Framework_TestCase
{
    protected static $cacheFile;

    public static function setUpBeforeClass()
    {
        self::$cacheFile = tempnam(sys_get_temp_dir(), 'sf2_cache_warmer_dir');
    }

    public static function tearDownAfterClass()
    {
        @unlink(self::$cacheFile);
    }

    public function testWriteCacheFileCreatesTheFile()
    {
        $warmer = new TestCacheWarmer(self::$cacheFile);
        $warmer->warmUp(dirname(self::$cacheFile));

        $this->assertTrue(file_exists(self::$cacheFile));
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testWriteNonWritableCacheFileThrowsARuntimeException()
    {
        $nonWritableFile = '/this/file/is/very/probably/not/writable';
        $warmer = new TestCacheWarmer($nonWritableFile);
        $warmer->warmUp(dirname($nonWritableFile));
    }
}

class TestCacheWarmer extends CacheWarmer
{
    protected $file;

    public function __construct($file)
    {
        $this->file = $file;
    }

    public function warmUp($cacheDir)
    {
        $this->writeCacheFile($this->file, 'content');
    }

    public function isOptional()
    {
        return false;
    }
}
PK�a�\K�w��Mpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Bundle/BundleTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Bundle;

use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddConsoleCommandPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionAbsentBundle\ExtensionAbsentBundle;
use Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\Command\FooCommand;
use Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\ExtensionPresentBundle;

class BundleTest extends \PHPUnit_Framework_TestCase
{
    public function testRegisterCommands()
    {
        $cmd = new FooCommand();
        $app = $this->getMock('Symfony\Component\Console\Application');
        $app->expects($this->once())->method('add')->with($this->equalTo($cmd));

        $bundle = new ExtensionPresentBundle();
        $bundle->registerCommands($app);

        $bundle2 = new ExtensionAbsentBundle();

        $this->assertNull($bundle2->registerCommands($app));
    }

    public function testRegisterCommandsIngoreCommandAsAService()
    {
        $container = new ContainerBuilder();
        $container->addCompilerPass(new AddConsoleCommandPass());
        $definition = new Definition('Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\Command\FooCommand');
        $definition->addTag('console.command');
        $container->setDefinition('my-command', $definition);
        $container->compile();

        $application = $this->getMock('Symfony\Component\Console\Application');
        // Never called, because it's the
        // Symfony\Bundle\FrameworkBundle\Console\Application that register
        // commands as a service
        $application->expects($this->never())->method('add');

        $bundle = new ExtensionPresentBundle();
        $bundle->setContainer($container);
        $bundle->registerCommands($application);
    }
}
PK�a�\e�
֮�spear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/MergeExtensionConfigurationPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\DependencyInjection;

use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass;

class MergeExtensionConfigurationPassTest extends \PHPUnit_Framework_TestCase
{
    public function testAutoloadMainExtension()
    {
        $container = $this->getMock('Symfony\\Component\\DependencyInjection\\ContainerBuilder');
        $params = $this->getMock('Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag');

        $container->expects($this->at(0))
            ->method('getExtensionConfig')
            ->with('loaded')
            ->will($this->returnValue(array(array())));
        $container->expects($this->at(1))
            ->method('getExtensionConfig')
            ->with('notloaded')
            ->will($this->returnValue(array()));
        $container->expects($this->once())
            ->method('loadFromExtension')
            ->with('notloaded', array());

        $container->expects($this->any())
            ->method('getParameterBag')
            ->will($this->returnValue($params));
        $params->expects($this->any())
            ->method('all')
            ->will($this->returnValue(array()));
        $container->expects($this->any())
            ->method('getDefinitions')
            ->will($this->returnValue(array()));
        $container->expects($this->any())
            ->method('getAliases')
            ->will($this->returnValue(array()));
        $container->expects($this->any())
            ->method('getExtensions')
            ->will($this->returnValue(array()));

        $configPass = new MergeExtensionConfigurationPass(array('loaded', 'notloaded'));
        $configPass->process($container);
    }
}
PK�a�\�C�hhlpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/ContainerAwareHttpKernelTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\DependencyInjection;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\EventDispatcher\EventDispatcher;

class ContainerAwareHttpKernelTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getProviderTypes
     */
    public function testHandle($type)
    {
        $request = new Request();
        $expected = new Response();
        $controller = function () use ($expected) {
            return $expected;
        };

        $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
        $this
            ->expectsEnterScopeOnce($container)
            ->expectsLeaveScopeOnce($container)
            ->expectsSetRequestWithAt($container, $request, 3)
            ->expectsSetRequestWithAt($container, null, 4)
        ;

        $dispatcher = new EventDispatcher();
        $resolver = $this->getResolverMockFor($controller, $request);
        $stack = new RequestStack();
        $kernel = new ContainerAwareHttpKernel($dispatcher, $container, $resolver, $stack);

        $actual = $kernel->handle($request, $type);

        $this->assertSame($expected, $actual, '->handle() returns the response');
    }

    /**
     * @dataProvider getProviderTypes
     */
    public function testVerifyRequestStackPushPopDuringHandle($type)
    {
        $request = new Request();
        $expected = new Response();
        $controller = function () use ($expected) {
            return $expected;
        };

        $stack = $this->getMock('Symfony\Component\HttpFoundation\RequestStack', array('push', 'pop'));
        $stack->expects($this->at(0))->method('push')->with($this->equalTo($request));
        $stack->expects($this->at(1))->method('pop');

        $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
        $dispatcher = new EventDispatcher();
        $resolver = $this->getResolverMockFor($controller, $request);
        $kernel = new ContainerAwareHttpKernel($dispatcher, $container, $resolver, $stack);

        $kernel->handle($request, $type);
    }

    /**
     * @dataProvider getProviderTypes
     */
    public function testHandleRestoresThePreviousRequestOnException($type)
    {
        $request = new Request();
        $expected = new \Exception();
        $controller = function () use ($expected) {
            throw $expected;
        };

        $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
        $this
            ->expectsEnterScopeOnce($container)
            ->expectsLeaveScopeOnce($container)
            ->expectsSetRequestWithAt($container, $request, 3)
            ->expectsSetRequestWithAt($container, null, 4)
        ;

        $dispatcher = new EventDispatcher();
        $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
        $resolver = $this->getResolverMockFor($controller, $request);
        $stack = new RequestStack();
        $kernel = new ContainerAwareHttpKernel($dispatcher, $container, $resolver, $stack);

        try {
            $kernel->handle($request, $type);
            $this->fail('->handle() suppresses the controller exception');
        } catch (\PHPUnit_Framework_Exception $exception) {
            throw $exception;
        } catch (\Exception $actual) {
            $this->assertSame($expected, $actual, '->handle() throws the controller exception');
        }
    }

    public function getProviderTypes()
    {
        return array(
            array(HttpKernelInterface::MASTER_REQUEST),
            array(HttpKernelInterface::SUB_REQUEST),
        );
    }

    private function getResolverMockFor($controller, $request)
    {
        $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
        $resolver->expects($this->once())
            ->method('getController')
            ->with($request)
            ->will($this->returnValue($controller));
        $resolver->expects($this->once())
            ->method('getArguments')
            ->with($request, $controller)
            ->will($this->returnValue(array()));

        return $resolver;
    }

    private function expectsSetRequestWithAt($container, $with, $at)
    {
        $container
            ->expects($this->at($at))
            ->method('set')
            ->with($this->equalTo('request'), $this->equalTo($with), $this->equalTo('request'))
        ;

        return $this;
    }

    private function expectsEnterScopeOnce($container)
    {
        $container
            ->expects($this->once())
            ->method('enterScope')
            ->with($this->equalTo('request'))
        ;

        return $this;
    }

    private function expectsLeaveScopeOnce($container)
    {
        $container
            ->expects($this->once())
            ->method('leaveScope')
            ->with($this->equalTo('request'))
        ;

        return $this;
    }
}
PK�a�\V���^^ipear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\RegisterListenersPass;

class RegisterListenersPassTest extends \PHPUnit_Framework_TestCase
{
    /**
     * Tests that event subscribers not implementing EventSubscriberInterface
     * trigger an exception.
     *
     * @expectedException \InvalidArgumentException
     */
    public function testEventSubscriberWithoutInterface()
    {
        // one service, not implementing any interface
        $services = array(
            'my_event_subscriber' => array(0 => array()),
        );

        $definition = $this->getMock('Symfony\Component\DependencyInjection\Definition');
        $definition->expects($this->atLeastOnce())
            ->method('isPublic')
            ->will($this->returnValue(true));
        $definition->expects($this->atLeastOnce())
            ->method('getClass')
            ->will($this->returnValue('stdClass'));

        $builder = $this->getMock('Symfony\Component\DependencyInjection\ContainerBuilder');
        $builder->expects($this->any())
            ->method('hasDefinition')
            ->will($this->returnValue(true));

        // We don't test kernel.event_listener here
        $builder->expects($this->atLeastOnce())
            ->method('findTaggedServiceIds')
            ->will($this->onConsecutiveCalls(array(), $services));

        $builder->expects($this->atLeastOnce())
            ->method('getDefinition')
            ->will($this->returnValue($definition));

        $registerListenersPass = new RegisterListenersPass();
        $registerListenersPass->process($builder);
    }

    public function testValidEventSubscriber()
    {
        $services = array(
            'my_event_subscriber' => array(0 => array()),
        );

        $definition = $this->getMock('Symfony\Component\DependencyInjection\Definition');
        $definition->expects($this->atLeastOnce())
            ->method('isPublic')
            ->will($this->returnValue(true));
        $definition->expects($this->atLeastOnce())
            ->method('getClass')
            ->will($this->returnValue('Symfony\Component\HttpKernel\Tests\DependencyInjection\SubscriberService'));

        $builder = $this->getMock('Symfony\Component\DependencyInjection\ContainerBuilder');
        $builder->expects($this->any())
            ->method('hasDefinition')
            ->will($this->returnValue(true));

        // We don't test kernel.event_listener here
        $builder->expects($this->atLeastOnce())
            ->method('findTaggedServiceIds')
            ->will($this->onConsecutiveCalls(array(), $services));

        $builder->expects($this->atLeastOnce())
            ->method('getDefinition')
            ->will($this->returnValue($definition));

        $builder->expects($this->atLeastOnce())
            ->method('findDefinition')
            ->will($this->returnValue($definition));

        $registerListenersPass = new RegisterListenersPass();
        $registerListenersPass->process($builder);
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage The service "foo" must be public as event listeners are lazy-loaded.
     */
    public function testPrivateEventListener()
    {
        $container = new ContainerBuilder();
        $container->register('foo', 'stdClass')->setPublic(false)->addTag('kernel.event_listener', array());
        $container->register('event_dispatcher', 'stdClass');

        $registerListenersPass = new RegisterListenersPass();
        $registerListenersPass->process($container);
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage The service "foo" must be public as event subscribers are lazy-loaded.
     */
    public function testPrivateEventSubscriber()
    {
        $container = new ContainerBuilder();
        $container->register('foo', 'stdClass')->setPublic(false)->addTag('kernel.event_subscriber', array());
        $container->register('event_dispatcher', 'stdClass');

        $registerListenersPass = new RegisterListenersPass();
        $registerListenersPass->process($container);
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage The service "foo" must not be abstract as event listeners are lazy-loaded.
     */
    public function testAbstractEventListener()
    {
        $container = new ContainerBuilder();
        $container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_listener', array());
        $container->register('event_dispatcher', 'stdClass');

        $registerListenersPass = new RegisterListenersPass();
        $registerListenersPass->process($container);
    }
}

class SubscriberService implements \Symfony\Component\EventDispatcher\EventSubscriberInterface
{
    public static function getSubscribedEvents() {}
}
PK�a�\݂(�$�$^pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Debug;

use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Stopwatch\Stopwatch;

class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase
{
    public function testAddRemoveListener()
    {
        $dispatcher = new EventDispatcher();
        $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());

        $tdispatcher->addListener('foo', $listener = function () { ; });
        $listeners = $dispatcher->getListeners('foo');
        $this->assertCount(1, $listeners);
        $this->assertSame($listener, $listeners[0]);

        $tdispatcher->removeListener('foo', $listener);
        $this->assertCount(0, $dispatcher->getListeners('foo'));
    }

    public function testGetListeners()
    {
        $dispatcher = new EventDispatcher();
        $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());

        $tdispatcher->addListener('foo', $listener = function () { ; });
        $this->assertSame($dispatcher->getListeners('foo'), $tdispatcher->getListeners('foo'));
    }

    public function testHasListeners()
    {
        $dispatcher = new EventDispatcher();
        $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());

        $this->assertFalse($dispatcher->hasListeners('foo'));
        $this->assertFalse($tdispatcher->hasListeners('foo'));

        $tdispatcher->addListener('foo', $listener = function () { ; });
        $this->assertTrue($dispatcher->hasListeners('foo'));
        $this->assertTrue($tdispatcher->hasListeners('foo'));
    }

    public function testAddRemoveSubscriber()
    {
        $dispatcher = new EventDispatcher();
        $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());

        $subscriber = new EventSubscriber();

        $tdispatcher->addSubscriber($subscriber);
        $listeners = $dispatcher->getListeners('foo');
        $this->assertCount(1, $listeners);
        $this->assertSame(array($subscriber, 'call'), $listeners[0]);

        $tdispatcher->removeSubscriber($subscriber);
        $this->assertCount(0, $dispatcher->getListeners('foo'));
    }

    public function testGetCalledListeners()
    {
        $dispatcher = new EventDispatcher();
        $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
        $tdispatcher->addListener('foo', $listener = function () { ; });

        $this->assertEquals(array(), $tdispatcher->getCalledListeners());
        $this->assertEquals(array('foo.closure' => array('event' => 'foo', 'type' => 'Closure', 'pretty' => 'closure')), $tdispatcher->getNotCalledListeners());

        $tdispatcher->dispatch('foo');

        $this->assertEquals(array('foo.closure' => array('event' => 'foo', 'type' => 'Closure', 'pretty' => 'closure')), $tdispatcher->getCalledListeners());
        $this->assertEquals(array(), $tdispatcher->getNotCalledListeners());
    }

    public function testLogger()
    {
        $logger = $this->getMock('Psr\Log\LoggerInterface');

        $dispatcher = new EventDispatcher();
        $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch(), $logger);
        $tdispatcher->addListener('foo', $listener1 = function () { ; });
        $tdispatcher->addListener('foo', $listener2 = function () { ; });

        $logger->expects($this->at(0))->method('debug')->with("Notified event \"foo\" to listener \"closure\".");
        $logger->expects($this->at(1))->method('debug')->with("Notified event \"foo\" to listener \"closure\".");

        $tdispatcher->dispatch('foo');
    }

    public function testLoggerWithStoppedEvent()
    {
        $logger = $this->getMock('Psr\Log\LoggerInterface');

        $dispatcher = new EventDispatcher();
        $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch(), $logger);
        $tdispatcher->addListener('foo', $listener1 = function (Event $event) { $event->stopPropagation(); });
        $tdispatcher->addListener('foo', $listener2 = function () { ; });

        $logger->expects($this->at(0))->method('debug')->with("Notified event \"foo\" to listener \"closure\".");
        $logger->expects($this->at(1))->method('debug')->with("Listener \"closure\" stopped propagation of the event \"foo\".");
        $logger->expects($this->at(2))->method('debug')->with("Listener \"closure\" was not called for event \"foo\".");

        $tdispatcher->dispatch('foo');
    }

    public function testDispatchCallListeners()
    {
        $called = array();

        $dispatcher = new EventDispatcher();
        $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
        $tdispatcher->addListener('foo', $listener1 = function () use (&$called) { $called[] = 'foo1'; });
        $tdispatcher->addListener('foo', $listener2 = function () use (&$called) { $called[] = 'foo2'; });

        $tdispatcher->dispatch('foo');

        $this->assertEquals(array('foo1', 'foo2'), $called);
    }

    public function testDispatchNested()
    {
        $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch());
        $loop = 1;
        $dispatcher->addListener('foo', $listener1 = function () use ($dispatcher, &$loop) {
            ++$loop;
            if (2 == $loop) {
                $dispatcher->dispatch('foo');
            }
        });

        $dispatcher->dispatch('foo');
    }

    public function testDispatchReusedEventNested()
    {
        $nestedCall = false;
        $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch());
        $dispatcher->addListener('foo', function (Event $e) use ($dispatcher) {
            $dispatcher->dispatch('bar', $e);
        });
        $dispatcher->addListener('bar', function (Event $e) use (&$nestedCall) {
            $nestedCall = true;
        });

        $this->assertFalse($nestedCall);
        $dispatcher->dispatch('foo');
        $this->assertTrue($nestedCall);
    }

    public function testStopwatchSections()
    {
        $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch = new Stopwatch());
        $kernel = $this->getHttpKernel($dispatcher, function () { return new Response(); });
        $request = Request::create('/');
        $response = $kernel->handle($request);
        $kernel->terminate($request, $response);

        $events = $stopwatch->getSectionEvents($response->headers->get('X-Debug-Token'));
        $this->assertEquals(array(
            '__section__',
            'kernel.request',
            'kernel.request.loading',
            'kernel.controller',
            'kernel.controller.loading',
            'controller',
            'kernel.response',
            'kernel.response.loading',
            'kernel.terminate',
            'kernel.terminate.loading',
        ), array_keys($events));
    }

    public function testStopwatchCheckControllerOnRequestEvent()
    {
        $stopwatch = $this->getMockBuilder('Symfony\Component\Stopwatch\Stopwatch')
            ->setMethods(array('isStarted'))
            ->getMock();
        $stopwatch->expects($this->once())
            ->method('isStarted')
            ->will($this->returnValue(false));

        $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch);

        $kernel = $this->getHttpKernel($dispatcher, function () { return new Response(); });
        $request = Request::create('/');
        $kernel->handle($request);
    }

    public function testStopwatchStopControllerOnRequestEvent()
    {
        $stopwatch = $this->getMockBuilder('Symfony\Component\Stopwatch\Stopwatch')
            ->setMethods(array('isStarted', 'stop', 'stopSection'))
            ->getMock();
        $stopwatch->expects($this->once())
            ->method('isStarted')
            ->will($this->returnValue(true));
        $stopwatch->expects($this->once())
            ->method('stop');
        $stopwatch->expects($this->once())
            ->method('stopSection');

        $dispatcher = new TraceableEventDispatcher(new EventDispatcher(), $stopwatch);

        $kernel = $this->getHttpKernel($dispatcher, function () { return new Response(); });
        $request = Request::create('/');
        $kernel->handle($request);
    }

    protected function getHttpKernel($dispatcher, $controller)
    {
        $resolver = $this->getMock('Symfony\Component\HttpKernel\Controller\ControllerResolverInterface');
        $resolver->expects($this->once())->method('getController')->will($this->returnValue($controller));
        $resolver->expects($this->once())->method('getArguments')->will($this->returnValue(array()));

        return new HttpKernel($dispatcher, $resolver);
    }
}

class EventSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array('foo' => 'call');
    }
}
PK�a�\���uuapear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/TestSessionListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\EventListener;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpFoundation\Session\SessionInterface;

/**
 * SessionListenerTest.
 *
 * Tests SessionListener.
 *
 * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
 */
class TestSessionListenerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var TestSessionListener
     */
    private $listener;

    /**
     * @var SessionInterface
     */
    private $session;

    protected function setUp()
    {
        $this->listener = $this->getMockForAbstractClass('Symfony\Component\HttpKernel\EventListener\TestSessionListener');
        $this->session  = $this->getSession();
    }

    public function testShouldSaveMasterRequestSession()
    {
        $this->sessionHasBeenStarted();
        $this->sessionMustBeSaved();

        $this->filterResponse(new Request());
    }

    public function testShouldNotSaveSubRequestSession()
    {
        $this->sessionMustNotBeSaved();

        $this->filterResponse(new Request(), HttpKernelInterface::SUB_REQUEST);
    }

    public function testDoesNotDeleteCookieIfUsingSessionLifetime()
    {
        $this->sessionHasBeenStarted();

        $params = session_get_cookie_params();
        session_set_cookie_params(0, $params['path'], $params['domain'], $params['secure'], $params['httponly']);

        $response = $this->filterResponse(new Request(), HttpKernelInterface::MASTER_REQUEST);
        $cookies = $response->headers->getCookies();

        $this->assertEquals(0, reset($cookies)->getExpiresTime());
    }

    public function testUnstartedSessionIsNotSave()
    {
        $this->sessionHasNotBeenStarted();
        $this->sessionMustNotBeSaved();

        $this->filterResponse(new Request());
    }

    private function filterResponse(Request $request, $type = HttpKernelInterface::MASTER_REQUEST)
    {
        $request->setSession($this->session);
        $response = new Response();
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $event = new FilterResponseEvent($kernel, $request, $type, $response);

        $this->listener->onKernelResponse($event);

        $this->assertSame($response, $event->getResponse());

        return $response;
    }

    private function sessionMustNotBeSaved()
    {
        $this->session->expects($this->never())
            ->method('save');
    }

    private function sessionMustBeSaved()
    {
        $this->session->expects($this->once())
            ->method('save');
    }

    private function sessionHasBeenStarted()
    {
        $this->session->expects($this->once())
            ->method('isStarted')
            ->will($this->returnValue(true));
    }

    private function sessionHasNotBeenStarted()
    {
        $this->session->expects($this->once())
            ->method('isStarted')
            ->will($this->returnValue(false));
    }

    private function getSession()
    {
        $mock = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\Session')
            ->disableOriginalConstructor()
            ->getMock();

        // set return value for getName()
        $mock->expects($this->any())->method('getName')->will($this->returnValue('MOCKSESSID'));

        return $mock;
    }
}
PK�a�\���!/
/
^pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/FragmentListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\EventListener;

use Symfony\Component\HttpKernel\EventListener\FragmentListener;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\UriSigner;

class FragmentListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testOnlyTriggeredOnFragmentRoute()
    {
        $request = Request::create('http://example.com/foo?_path=foo%3Dbar%26_controller%3Dfoo');

        $listener = new FragmentListener(new UriSigner('foo'));
        $event = $this->createGetResponseEvent($request);

        $expected = $request->attributes->all();

        $listener->onKernelRequest($event);

        $this->assertEquals($expected, $request->attributes->all());
        $this->assertTrue($request->query->has('_path'));
    }

    /**
     * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
     */
    public function testAccessDeniedWithNonSafeMethods()
    {
        $request = Request::create('http://example.com/_fragment', 'POST');

        $listener = new FragmentListener(new UriSigner('foo'));
        $event = $this->createGetResponseEvent($request);

        $listener->onKernelRequest($event);
    }

    /**
     * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
     */
    public function testAccessDeniedWithNonLocalIps()
    {
        $request = Request::create('http://example.com/_fragment', 'GET', array(), array(), array(), array('REMOTE_ADDR' => '10.0.0.1'));

        $listener = new FragmentListener(new UriSigner('foo'));
        $event = $this->createGetResponseEvent($request);

        $listener->onKernelRequest($event);
    }

    /**
     * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
     */
    public function testAccessDeniedWithWrongSignature()
    {
        $request = Request::create('http://example.com/_fragment', 'GET', array(), array(), array(), array('REMOTE_ADDR' => '10.0.0.1'));

        $listener = new FragmentListener(new UriSigner('foo'));
        $event = $this->createGetResponseEvent($request);

        $listener->onKernelRequest($event);
    }

    public function testWithSignature()
    {
        $signer = new UriSigner('foo');
        $request = Request::create($signer->sign('http://example.com/_fragment?_path=foo%3Dbar%26_controller%3Dfoo'), 'GET', array(), array(), array(), array('REMOTE_ADDR' => '10.0.0.1'));

        $listener = new FragmentListener($signer);
        $event = $this->createGetResponseEvent($request);

        $listener->onKernelRequest($event);

        $this->assertEquals(array('foo' => 'bar', '_controller' => 'foo'), $request->attributes->get('_route_params'));
        $this->assertFalse($request->query->has('_path'));
    }

    private function createGetResponseEvent(Request $request)
    {
        return new GetResponseEvent($this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface'), $request, HttpKernelInterface::MASTER_REQUEST);
    }
}
PK�a�\(��kk^pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/ProfilerListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\EventListener;

use Symfony\Component\HttpKernel\EventListener\ProfilerListener;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Kernel;

class ProfilerListenerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * Test to ensure BC without RequestStack
     *
     * @deprecated Deprecated since version 2.4, to be removed in 3.0.
     */
    public function testEventsWithoutRequestStack()
    {
        $profile = $this->getMockBuilder('Symfony\Component\HttpKernel\Profiler\Profile')
            ->disableOriginalConstructor()
            ->getMock();

        $profiler = $this->getMockBuilder('Symfony\Component\HttpKernel\Profiler\Profiler')
            ->disableOriginalConstructor()
            ->getMock();
        $profiler->expects($this->once())
            ->method('collect')
            ->will($this->returnValue($profile));

        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');

        $request = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')
            ->disableOriginalConstructor()
            ->getMock();

        $response = $this->getMockBuilder('Symfony\Component\HttpFoundation\Response')
            ->disableOriginalConstructor()
            ->getMock();

        $listener = new ProfilerListener($profiler);
        $listener->onKernelRequest(new GetResponseEvent($kernel, $request, Kernel::MASTER_REQUEST));
        $listener->onKernelResponse(new FilterResponseEvent($kernel, $request, Kernel::MASTER_REQUEST, $response));
        $listener->onKernelTerminate(new PostResponseEvent($kernel, $request, $response));
    }

    /**
     * Test a master and sub request with an exception and `onlyException` profiler option enabled.
     */
    public function testKernelTerminate()
    {
        $profile = $this->getMockBuilder('Symfony\Component\HttpKernel\Profiler\Profile')
            ->disableOriginalConstructor()
            ->getMock();

        $profiler = $this->getMockBuilder('Symfony\Component\HttpKernel\Profiler\Profiler')
            ->disableOriginalConstructor()
            ->getMock();

        $profiler->expects($this->once())
            ->method('collect')
            ->will($this->returnValue($profile));

        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');

        $masterRequest = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')
            ->disableOriginalConstructor()
            ->getMock();

        $subRequest =  $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')
            ->disableOriginalConstructor()
            ->getMock();

        $response = $this->getMockBuilder('Symfony\Component\HttpFoundation\Response')
            ->disableOriginalConstructor()
            ->getMock();

        $onlyException = true;
        $listener      = new ProfilerListener($profiler, null, $onlyException);

        // master request
        $listener->onKernelRequest(new GetResponseEvent($kernel, $masterRequest, Kernel::MASTER_REQUEST));
        $listener->onKernelResponse(new FilterResponseEvent($kernel, $masterRequest, Kernel::MASTER_REQUEST, $response));

        // sub request
        $listener->onKernelRequest(new GetResponseEvent($kernel, $subRequest, Kernel::SUB_REQUEST));
        $listener->onKernelException(new GetResponseForExceptionEvent($kernel, $subRequest, Kernel::SUB_REQUEST, new HttpException(404)));
        $listener->onKernelResponse(new FilterResponseEvent($kernel, $subRequest, Kernel::SUB_REQUEST, $response));

        $listener->onKernelTerminate(new PostResponseEvent($kernel, $masterRequest, $response));
    }
}
PK�a�\p�66\pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/RouterListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\EventListener;

use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\EventListener\RouterListener;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Routing\RequestContext;

class RouterListenerTest extends \PHPUnit_Framework_TestCase
{
    private $requestStack;

    public function setUp()
    {
        $this->requestStack = $this->getMock('Symfony\Component\HttpFoundation\RequestStack', array(), array(), '', false);
    }

    /**
     * @dataProvider getPortData
     */
    public function testPort($defaultHttpPort, $defaultHttpsPort, $uri, $expectedHttpPort, $expectedHttpsPort)
    {
        $urlMatcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\UrlMatcherInterface')
                             ->disableOriginalConstructor()
                             ->getMock();
        $context = new RequestContext();
        $context->setHttpPort($defaultHttpPort);
        $context->setHttpsPort($defaultHttpsPort);
        $urlMatcher->expects($this->any())
                     ->method('getContext')
                     ->will($this->returnValue($context));

        $listener = new RouterListener($urlMatcher, null, null, $this->requestStack);
        $event = $this->createGetResponseEventForUri($uri);
        $listener->onKernelRequest($event);

        $this->assertEquals($expectedHttpPort, $context->getHttpPort());
        $this->assertEquals($expectedHttpsPort, $context->getHttpsPort());
        $this->assertEquals(0 === strpos($uri, 'https') ? 'https' : 'http', $context->getScheme());
    }

    public function getPortData()
    {
        return array(
            array(80, 443, 'http://localhost/', 80, 443),
            array(80, 443, 'http://localhost:90/', 90, 443),
            array(80, 443, 'https://localhost/', 80, 443),
            array(80, 443, 'https://localhost:90/', 80, 90),
        );
    }

    /**
     * @param string $uri
     *
     * @return GetResponseEvent
     */
    private function createGetResponseEventForUri($uri)
    {
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $request = Request::create($uri);
        $request->attributes->set('_controller', null); // Prevents going in to routing process

        return new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST);
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testInvalidMatcher()
    {
        new RouterListener(new \stdClass(), null, null, $this->requestStack);
    }

    public function testRequestMatcher()
    {
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $request = Request::create('http://localhost/');
        $event = new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST);

        $requestMatcher = $this->getMock('Symfony\Component\Routing\Matcher\RequestMatcherInterface');
        $requestMatcher->expects($this->once())
                       ->method('matchRequest')
                       ->with($this->isInstanceOf('Symfony\Component\HttpFoundation\Request'))
                       ->will($this->returnValue(array()));

        $listener = new RouterListener($requestMatcher, new RequestContext(), null, $this->requestStack);
        $listener->onKernelRequest($event);
    }

    public function testSubRequestWithDifferentMethod()
    {
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $request = Request::create('http://localhost/', 'post');
        $event = new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST);

        $requestMatcher = $this->getMock('Symfony\Component\Routing\Matcher\RequestMatcherInterface');
        $requestMatcher->expects($this->any())
                       ->method('matchRequest')
                       ->with($this->isInstanceOf('Symfony\Component\HttpFoundation\Request'))
                       ->will($this->returnValue(array()));

        $context = new RequestContext();
        $requestMatcher->expects($this->any())
                       ->method('getContext')
                       ->will($this->returnValue($context));

        $listener = new RouterListener($requestMatcher, new RequestContext(), null, $this->requestStack);
        $listener->onKernelRequest($event);

        // sub-request with another HTTP method
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $request = Request::create('http://localhost/', 'get');
        $event = new GetResponseEvent($kernel, $request, HttpKernelInterface::SUB_REQUEST);

        $listener->onKernelRequest($event);

        $this->assertEquals('GET', $context->getMethod());
    }
}
PK�a�\K�(^��\pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/LocaleListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\EventListener;

use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\EventListener\LocaleListener;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class LocaleListenerTest extends \PHPUnit_Framework_TestCase
{
    private $requestStack;

    protected function setUp()
    {
        $this->requestStack = $this->getMock('Symfony\Component\HttpFoundation\RequestStack', array(), array(), '', false);
    }

    public function testDefaultLocaleWithoutSession()
    {
        $listener = new LocaleListener('fr', null, $this->requestStack);
        $event = $this->getEvent($request = Request::create('/'));

        $listener->onKernelRequest($event);
        $this->assertEquals('fr', $request->getLocale());
    }

    public function testLocaleFromRequestAttribute()
    {
        $request = Request::create('/');
        session_name('foo');
        $request->cookies->set('foo', 'value');

        $request->attributes->set('_locale', 'es');
        $listener = new LocaleListener('fr', null, $this->requestStack);
        $event = $this->getEvent($request);

        $listener->onKernelRequest($event);
        $this->assertEquals('es', $request->getLocale());
    }

    public function testLocaleSetForRoutingContext()
    {
        // the request context is updated
        $context = $this->getMock('Symfony\Component\Routing\RequestContext');
        $context->expects($this->once())->method('setParameter')->with('_locale', 'es');

        $router = $this->getMock('Symfony\Component\Routing\Router', array('getContext'), array(), '', false);
        $router->expects($this->once())->method('getContext')->will($this->returnValue($context));

        $request = Request::create('/');

        $request->attributes->set('_locale', 'es');
        $listener = new LocaleListener('fr', $router, $this->requestStack);
        $listener->onKernelRequest($this->getEvent($request));
    }

    public function testRouterResetWithParentRequestOnKernelFinishRequest()
    {
        if (!class_exists('Symfony\Component\Routing\Router')) {
            $this->markTestSkipped('The "Routing" component is not available');
        }

        // the request context is updated
        $context = $this->getMock('Symfony\Component\Routing\RequestContext');
        $context->expects($this->once())->method('setParameter')->with('_locale', 'es');

        $router = $this->getMock('Symfony\Component\Routing\Router', array('getContext'), array(), '', false);
        $router->expects($this->once())->method('getContext')->will($this->returnValue($context));

        $parentRequest = Request::create('/');
        $parentRequest->setLocale('es');

        $this->requestStack->expects($this->once())->method('getParentRequest')->will($this->returnValue($parentRequest));

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\FinishRequestEvent', array(), array(), '', false);

        $listener = new LocaleListener('fr', $router, $this->requestStack);
        $listener->onKernelFinishRequest($event);
    }

    public function testRequestLocaleIsNotOverridden()
    {
        $request = Request::create('/');
        $request->setLocale('de');
        $listener = new LocaleListener('fr', null, $this->requestStack);
        $event = $this->getEvent($request);

        $listener->onKernelRequest($event);
        $this->assertEquals('de', $request->getLocale());
    }

    private function getEvent(Request $request)
    {
        return new GetResponseEvent($this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface'), $request, HttpKernelInterface::MASTER_REQUEST);
    }
}
PK�a�\�W:tt_pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/ExceptionListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\EventListener;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\EventListener\ExceptionListener;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Tests\Logger;

/**
 * ExceptionListenerTest
 *
 * @author Robert Schönthal <seroscho@googlemail.com>
 */
class ExceptionListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testConstruct()
    {
        $logger = new TestLogger();
        $l = new ExceptionListener('foo', $logger);

        $_logger = new \ReflectionProperty(get_class($l), 'logger');
        $_logger->setAccessible(true);
        $_controller = new \ReflectionProperty(get_class($l), 'controller');
        $_controller->setAccessible(true);

        $this->assertSame($logger, $_logger->getValue($l));
        $this->assertSame('foo', $_controller->getValue($l));
    }

    /**
     * @dataProvider provider
     */
    public function testHandleWithoutLogger($event, $event2)
    {
        // store the current error_log, and disable it temporarily
        $errorLog = ini_set('error_log', file_exists('/dev/null') ? '/dev/null' : 'nul');

        $l = new ExceptionListener('foo');
        $l->onKernelException($event);

        $this->assertEquals(new Response('foo'), $event->getResponse());

        try {
            $l->onKernelException($event2);
        } catch (\Exception $e) {
            $this->assertSame('foo', $e->getMessage());
        }

        // restore the old error_log
        ini_set('error_log', $errorLog);
    }

    /**
     * @dataProvider provider
     */
    public function testHandleWithLogger($event, $event2)
    {
        $logger = new TestLogger();

        $l = new ExceptionListener('foo', $logger);
        $l->onKernelException($event);

        $this->assertEquals(new Response('foo'), $event->getResponse());

        try {
            $l->onKernelException($event2);
        } catch (\Exception $e) {
            $this->assertSame('foo', $e->getMessage());
        }

        $this->assertEquals(3, $logger->countErrors());
        $this->assertCount(3, $logger->getLogs('critical'));
    }

    public function provider()
    {
        if (!class_exists('Symfony\Component\HttpFoundation\Request')) {
            return array(array(null, null));
        }

        $request = new Request();
        $exception = new \Exception('foo');
        $event = new GetResponseForExceptionEvent(new TestKernel(), $request, 'foo', $exception);
        $event2 = new GetResponseForExceptionEvent(new TestKernelThatThrowsException(), $request, 'foo', $exception);

        return array(
            array($event, $event2)
        );
    }

    public function testSubRequestFormat()
    {
        $listener = new ExceptionListener('foo', $this->getMock('Psr\Log\LoggerInterface'));

        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $kernel->expects($this->once())->method('handle')->will($this->returnCallback(function (Request $request) {
            return new Response($request->getRequestFormat());
        }));

        $request = Request::create('/');
        $request->setRequestFormat('xml');

        $event = new GetResponseForExceptionEvent($kernel, $request, 'foo', new \Exception('foo'));
        $listener->onKernelException($event);

        $response = $event->getResponse();
        $this->assertEquals('xml', $response->getContent());
    }
}

class TestLogger extends Logger implements DebugLoggerInterface
{
    public function countErrors()
    {
        return count($this->logs['critical']);
    }
}

class TestKernel implements HttpKernelInterface
{
    public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
    {
        return new Response('foo');
    }
}

class TestKernelThatThrowsException implements HttpKernelInterface
{
    public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true)
    {
        throw new \Exception('bar');
    }
}
PK�a�\=v?�
�
Ypear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/EsiListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\EventListener;

use Symfony\Component\HttpKernel\HttpCache\Esi;
use Symfony\Component\HttpKernel\EventListener\EsiListener;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\EventDispatcher\EventDispatcher;

class EsiListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testFilterDoesNothingForSubRequests()
    {
        $dispatcher = new EventDispatcher();
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $response = new Response('foo <esi:include src="" />');
        $listener = new EsiListener(new Esi());

        $dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'));
        $event = new FilterResponseEvent($kernel, new Request(), HttpKernelInterface::SUB_REQUEST, $response);
        $dispatcher->dispatch(KernelEvents::RESPONSE, $event);

        $this->assertEquals('', $event->getResponse()->headers->get('Surrogate-Control'));
    }

    public function testFilterWhenThereIsSomeEsiIncludes()
    {
        $dispatcher = new EventDispatcher();
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $response = new Response('foo <esi:include src="" />');
        $listener = new EsiListener(new Esi());

        $dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'));
        $event = new FilterResponseEvent($kernel, new Request(), HttpKernelInterface::MASTER_REQUEST, $response);
        $dispatcher->dispatch(KernelEvents::RESPONSE, $event);

        $this->assertEquals('content="ESI/1.0"', $event->getResponse()->headers->get('Surrogate-Control'));
    }

    public function testFilterWhenThereIsNoEsiIncludes()
    {
        $dispatcher = new EventDispatcher();
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $response = new Response('foo');
        $listener = new EsiListener(new Esi());

        $dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'));
        $event = new FilterResponseEvent($kernel, new Request(), HttpKernelInterface::MASTER_REQUEST, $response);
        $dispatcher->dispatch(KernelEvents::RESPONSE, $event);

        $this->assertEquals('', $event->getResponse()->headers->get('Surrogate-Control'));
    }
}
PK�a�\�,ph
h
^pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/EventListener/ResponseListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\EventListener;

use Symfony\Component\HttpKernel\EventListener\ResponseListener;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventDispatcher;

class ResponseListenerTest extends \PHPUnit_Framework_TestCase
{
    private $dispatcher;

    private $kernel;

    protected function setUp()
    {
        $this->dispatcher = new EventDispatcher();
        $listener = new ResponseListener('UTF-8');
        $this->dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'));

        $this->kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');

    }

    protected function tearDown()
    {
        $this->dispatcher = null;
        $this->kernel = null;
    }

    public function testFilterDoesNothingForSubRequests()
    {
        $response = new Response('foo');

        $event = new FilterResponseEvent($this->kernel, new Request(), HttpKernelInterface::SUB_REQUEST, $response);
        $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);

        $this->assertEquals('', $event->getResponse()->headers->get('content-type'));
    }

    public function testFilterSetsNonDefaultCharsetIfNotOverridden()
    {
        $listener = new ResponseListener('ISO-8859-15');
        $this->dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'), 1);

        $response = new Response('foo');

        $event = new FilterResponseEvent($this->kernel, Request::create('/'), HttpKernelInterface::MASTER_REQUEST, $response);
        $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);

        $this->assertEquals('ISO-8859-15', $response->getCharset());
    }

    public function testFilterDoesNothingIfCharsetIsOverridden()
    {
        $listener = new ResponseListener('ISO-8859-15');
        $this->dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'), 1);

        $response = new Response('foo');
        $response->setCharset('ISO-8859-1');

        $event = new FilterResponseEvent($this->kernel, Request::create('/'), HttpKernelInterface::MASTER_REQUEST, $response);
        $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);

        $this->assertEquals('ISO-8859-1', $response->getCharset());
    }

    public function testFiltersSetsNonDefaultCharsetIfNotOverriddenOnNonTextContentType()
    {
        $listener = new ResponseListener('ISO-8859-15');
        $this->dispatcher->addListener(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'), 1);

        $response = new Response('foo');
        $request = Request::create('/');
        $request->setRequestFormat('application/json');

        $event = new FilterResponseEvent($this->kernel, $request, HttpKernelInterface::MASTER_REQUEST, $response);
        $this->dispatcher->dispatch(KernelEvents::RESPONSE, $event);

        $this->assertEquals('ISO-8859-15', $response->getCharset());
    }
}
PK�a�\p����Bpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Logger.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests;

use Psr\Log\LoggerInterface;

class Logger implements LoggerInterface
{
    protected $logs;

    public function __construct()
    {
        $this->clear();
    }

    public function getLogs($level = false)
    {
        return false === $level ? $this->logs : $this->logs[$level];
    }

    public function clear()
    {
        $this->logs = array(
            'emergency' => array(),
            'alert' => array(),
            'critical' => array(),
            'error' => array(),
            'warning' => array(),
            'notice' => array(),
            'info' => array(),
            'debug' => array(),
        );
    }

    public function log($level, $message, array $context = array())
    {
        $this->logs[$level][] = $message;
    }

    public function emergency($message, array $context = array())
    {
        $this->log('emergency', $message, $context);
    }

    public function alert($message, array $context = array())
    {
        $this->log('alert', $message, $context);
    }

    public function critical($message, array $context = array())
    {
        $this->log('critical', $message, $context);
    }

    public function error($message, array $context = array())
    {
        $this->log('error', $message, $context);
    }

    public function warning($message, array $context = array())
    {
        $this->log('warning', $message, $context);
    }

    public function notice($message, array $context = array())
    {
        $this->log('notice', $message, $context);
    }

    public function info($message, array $context = array())
    {
        $this->log('info', $message, $context);
    }

    public function debug($message, array $context = array())
    {
        $this->log('debug', $message, $context);
    }

    /**
     * @deprecated
     */
    public function emerg($message, array $context = array())
    {
        trigger_error('Use emergency() which is PSR-3 compatible', E_USER_DEPRECATED);

        $this->log('emergency', $message, $context);
    }

    /**
     * @deprecated
     */
    public function crit($message, array $context = array())
    {
        trigger_error('Use critical() which is PSR-3 compatible', E_USER_DEPRECATED);

        $this->log('critical', $message, $context);
    }

    /**
     * @deprecated
     */
    public function err($message, array $context = array())
    {
        trigger_error('Use error() which is PSR-3 compatible', E_USER_DEPRECATED);

        $this->log('error', $message, $context);
    }

    /**
     * @deprecated
     */
    public function warn($message, array $context = array())
    {
        trigger_error('Use warning() which is PSR-3 compatible', E_USER_DEPRECATED);

        $this->log('warning', $message, $context);
    }
}
PK�a�\q�}VffZpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForOverrideName.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures;

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class KernelForOverrideName extends Kernel
{
    protected $name = 'overridden';

    public function registerBundles()
    {

    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {

    }
}
PK�a�\��_�TT�pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/DependencyInjection/ExtensionLoadedExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionLoadedBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;

class ExtensionLoadedExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
    }
}
PK�a�\��?ɜ�ppear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionLoadedBundle/ExtensionLoadedBundle.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionLoadedBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class ExtensionLoadedBundle extends Bundle
{
}
PK�a�\g&��ppear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionAbsentBundle/ExtensionAbsentBundle.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionAbsentBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class ExtensionAbsentBundle extends Bundle
{
}
PK�a�\Vpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/foo.txtnu�[���PK�a�\`pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/Resources/foo.txtnu�[���PK�a�\Vpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle1Bundle/bar.txtnu�[���PK�a�\#��Wpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/classes.mapnu�[���<?php return array (
);PK�a�\GQ�>`
`
npear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/cache/test/MockObjectTestProjectContainer.phpnu�[���<?php
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;
class MockObjectTestProjectContainer extends Container
{
    private $parameters;
    public function __construct()
    {
        $this->parameters = $this->getDefaultParameters();
        $this->services =
        $this->scopedServices =
        $this->scopeStacks = array();
        $this->set('service_container', $this);
        $this->scopes = array();
        $this->scopeChildren = array();
        $this->aliases = array();
    }
    public function getParameter($name)
    {
        $name = strtolower($name);
        if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters))) {
            throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
        }
        return $this->parameters[$name];
    }
    public function hasParameter($name)
    {
        $name = strtolower($name);
        return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters);
    }
    public function setParameter($name, $value)
    {
        throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
    }
    public function getParameterBag()
    {
        if (null === $this->parameterBag) {
            $this->parameterBag = new FrozenParameterBag($this->parameters);
        }
        return $this->parameterBag;
    }
    protected function getDefaultParameters()
    {
        return array(
            'kernel.root_dir' => '/Users/fabien/Code/github/symfony/symfony/src/Symfony/Component/HttpKernel/Tests/Fixtures',
            'kernel.environment' => 'test',
            'kernel.debug' => false,
            'kernel.name' => 'MockObject',
            'kernel.cache_dir' => '/Users/fabien/Code/github/symfony/symfony/src/Symfony/Component/HttpKernel/Tests/Fixtures/cache/test',
            'kernel.logs_dir' => '/Users/fabien/Code/github/symfony/symfony/src/Symfony/Component/HttpKernel/Tests/Fixtures/logs',
            'kernel.bundles' => array(
                'Mock_Bundle_7fc4ae26' => 'Mock_Bundle_7fc4ae26',
            ),
            'kernel.charset' => 'UTF-8',
            'kernel.container_class' => 'MockObjectTestProjectContainer',
        );
    }
}
PK�a�\Vpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Bundle2Bundle/foo.txtnu�[���PK�a�\^pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/foo.txtnu�[���PK�a�\_pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ChildBundle/Resources/hide.txtnu�[���PK�a�\y��h��Rpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures;

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class KernelForTest extends Kernel
{
    public function getBundleMap()
    {
        return $this->bundleMap;
    }

    public function registerBundles()
    {
        return array();
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
    }

    public function isBooted()
    {
        return $this->booted;
    }
}
PK�a�\�0����Qpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/FooBarBundle.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class FooBarBundle extends Bundle
{
    // We need a full namespaced bundle instance to test isClassInActiveBundle
}
PK�a�\&#�Opear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/TestClient.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures;

use Symfony\Component\HttpKernel\Client;

class TestClient extends Client
{
    protected function getScript($request)
    {
        $script = parent::getScript($request);

        $autoload = file_exists(__DIR__.'/../../vendor/autoload.php')
            ? __DIR__.'/../../vendor/autoload.php'
            : __DIR__.'/../../../../../../vendor/autoload.php'
        ;

        $script = preg_replace('/(\->register\(\);)/', "$0\nrequire_once '$autoload';\n", $script);

        return $script;
    }
}
PK�a�\32ET��Xpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/TestEventDispatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures;

use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;

class TestEventDispatcher extends EventDispatcher implements TraceableEventDispatcherInterface
{
    public function getCalledListeners()
    {
        return array('foo');
    }

    public function getNotCalledListeners()
    {
        return array('bar');
    }
}
PK�a�\O�g�VV�pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/DependencyInjection/ExtensionPresentExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;

class ExtensionPresentExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
    }
}
PK�a�\x���npear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/BarCommand.phpnu�[���<?php

namespace Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\Command;

use Symfony\Component\Console\Command\Command;

/**
 * This command has a required parameter on the constructor and will be ignored by the default Bundle implementation.
 *
 * @see Symfony\Component\HttpKernel\Bundle\Bundle::registerCommands
 */
class BarCommand extends Command
{
    public function __construct($example, $name = 'bar')
    {

    }
}
PK�a�\��W���npear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/Command/FooCommand.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle\Command;

use Symfony\Component\Console\Command\Command;

class FooCommand extends Command
{
    protected function configure()
    {
        $this->setName('foo');
    }

}
PK�a�\`A�rpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fixtures\ExtensionPresentBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class ExtensionPresentBundle extends Bundle
{
}
PK�a�\]pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/foo.txtnu�[���PK�a�\^pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/BaseBundle/Resources/hide.txtnu�[���PK�a�\\pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/FooBundle/foo.txtnu�[���PK�a�\`pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/Bundle1Bundle/foo.txtnu�[���PK�a�\^pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/ChildBundle/foo.txtnu�[���PK�a�\^pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fixtures/Resources/BaseBundle/hide.txtnu�[���PK�a�\�`1Rpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Config/FileLocatorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Config;

use Symfony\Component\HttpKernel\Config\FileLocator;

class FileLocatorTest extends \PHPUnit_Framework_TestCase
{
    public function testLocate()
    {
        $kernel = $this->getMock('Symfony\Component\HttpKernel\KernelInterface');
        $kernel
            ->expects($this->atLeastOnce())
            ->method('locateResource')
            ->with('@BundleName/some/path', null, true)
            ->will($this->returnValue('/bundle-name/some/path'));
        $locator = new FileLocator($kernel);
        $this->assertEquals('/bundle-name/some/path', $locator->locate('@BundleName/some/path'));

        $kernel
            ->expects($this->never())
            ->method('locateResource');
        $this->setExpectedException('LogicException');
        $locator->locate('/some/path');
    }

    public function testLocateWithGlobalResourcePath()
    {
        $kernel = $this->getMock('Symfony\Component\HttpKernel\KernelInterface');
        $kernel
            ->expects($this->atLeastOnce())
            ->method('locateResource')
            ->with('@BundleName/some/path', '/global/resource/path', false);

        $locator = new FileLocator($kernel, '/global/resource/path');
        $locator->locate('@BundleName/some/path', null, false);
    }
}
PK�a�\g�]�>*>*Jpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpKernelTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests;

use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\EventDispatcher\EventDispatcher;

class HttpKernelTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \RuntimeException
     */
    public function testHandleWhenControllerThrowsAnExceptionAndRawIsTrue()
    {
        $kernel = new HttpKernel(new EventDispatcher(), $this->getResolver(function () { throw new \RuntimeException(); }));

        $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, true);
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testHandleWhenControllerThrowsAnExceptionAndRawIsFalseAndNoListenerIsRegistered()
    {
        $kernel = new HttpKernel(new EventDispatcher(), $this->getResolver(function () { throw new \RuntimeException(); }));

        $kernel->handle(new Request(), HttpKernelInterface::MASTER_REQUEST, false);
    }

    public function testHandleWhenControllerThrowsAnExceptionAndRawIsFalse()
    {
        $dispatcher = new EventDispatcher();
        $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
            $event->setResponse(new Response($event->getException()->getMessage()));
        });

        $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { throw new \RuntimeException('foo'); }));
        $response = $kernel->handle(new Request());

        $this->assertEquals('500', $response->getStatusCode());
        $this->assertEquals('foo', $response->getContent());
    }

    public function testHandleExceptionWithARedirectionResponse()
    {
        $dispatcher = new EventDispatcher();
        $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
            $event->setResponse(new RedirectResponse('/login', 301));
        });

        $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { throw new AccessDeniedHttpException(); }));
        $response = $kernel->handle(new Request());

        $this->assertEquals('301', $response->getStatusCode());
        $this->assertEquals('/login', $response->headers->get('Location'));
    }

    public function testHandleHttpException()
    {
        $dispatcher = new EventDispatcher();
        $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) {
            $event->setResponse(new Response($event->getException()->getMessage()));
        });

        $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { throw new MethodNotAllowedHttpException(array('POST')); }));
        $response = $kernel->handle(new Request());

        $this->assertEquals('405', $response->getStatusCode());
        $this->assertEquals('POST', $response->headers->get('Allow'));
    }

    /**
     * @dataProvider getStatusCodes
     */
    public function testHandleWhenAnExceptionIsHandledWithASpecificStatusCode($responseStatusCode, $expectedStatusCode)
    {
        $dispatcher = new EventDispatcher();
        $dispatcher->addListener(KernelEvents::EXCEPTION, function ($event) use ($responseStatusCode, $expectedStatusCode) {
            $event->setResponse(new Response('', $responseStatusCode, array('X-Status-Code' => $expectedStatusCode)));
        });

        $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { throw new \RuntimeException(); }));
        $response = $kernel->handle(new Request());

        $this->assertEquals($expectedStatusCode, $response->getStatusCode());
        $this->assertFalse($response->headers->has('X-Status-Code'));
    }

    public function getStatusCodes()
    {
        return array(
            array(200, 404),
            array(404, 200),
            array(301, 200),
            array(500, 200),
        );
    }

    public function testHandleWhenAListenerReturnsAResponse()
    {
        $dispatcher = new EventDispatcher();
        $dispatcher->addListener(KernelEvents::REQUEST, function ($event) {
            $event->setResponse(new Response('hello'));
        });

        $kernel = new HttpKernel($dispatcher, $this->getResolver());

        $this->assertEquals('hello', $kernel->handle(new Request())->getContent());
    }

    /**
     * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
     */
    public function testHandleWhenNoControllerIsFound()
    {
        $dispatcher = new EventDispatcher();
        $kernel = new HttpKernel($dispatcher, $this->getResolver(false));

        $kernel->handle(new Request());
    }

    /**
     * @expectedException \LogicException
     */
    public function testHandleWhenTheControllerIsNotACallable()
    {
        $dispatcher = new EventDispatcher();
        $kernel = new HttpKernel($dispatcher, $this->getResolver('foobar'));

        $kernel->handle(new Request());
    }

    public function testHandleWhenTheControllerIsAClosure()
    {
        $response = new Response('foo');
        $dispatcher = new EventDispatcher();
        $kernel = new HttpKernel($dispatcher, $this->getResolver(function () use ($response) { return $response; }));

        $this->assertSame($response, $kernel->handle(new Request()));
    }

    public function testHandleWhenTheControllerIsAnObjectWithInvoke()
    {
        $dispatcher = new EventDispatcher();
        $kernel = new HttpKernel($dispatcher, $this->getResolver(new Controller()));

        $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
    }

    public function testHandleWhenTheControllerIsAFunction()
    {
        $dispatcher = new EventDispatcher();
        $kernel = new HttpKernel($dispatcher, $this->getResolver('Symfony\Component\HttpKernel\Tests\controller_func'));

        $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
    }

    public function testHandleWhenTheControllerIsAnArray()
    {
        $dispatcher = new EventDispatcher();
        $kernel = new HttpKernel($dispatcher, $this->getResolver(array(new Controller(), 'controller')));

        $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
    }

    public function testHandleWhenTheControllerIsAStaticArray()
    {
        $dispatcher = new EventDispatcher();
        $kernel = new HttpKernel($dispatcher, $this->getResolver(array('Symfony\Component\HttpKernel\Tests\Controller', 'staticcontroller')));

        $this->assertResponseEquals(new Response('foo'), $kernel->handle(new Request()));
    }

    /**
     * @expectedException \LogicException
     */
    public function testHandleWhenTheControllerDoesNotReturnAResponse()
    {
        $dispatcher = new EventDispatcher();
        $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { return 'foo'; }));

        $kernel->handle(new Request());
    }

    public function testHandleWhenTheControllerDoesNotReturnAResponseButAViewIsRegistered()
    {
        $dispatcher = new EventDispatcher();
        $dispatcher->addListener(KernelEvents::VIEW, function ($event) {
            $event->setResponse(new Response($event->getControllerResult()));
        });
        $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { return 'foo'; }));

        $this->assertEquals('foo', $kernel->handle(new Request())->getContent());
    }

    public function testHandleWithAResponseListener()
    {
        $dispatcher = new EventDispatcher();
        $dispatcher->addListener(KernelEvents::RESPONSE, function ($event) {
            $event->setResponse(new Response('foo'));
        });
        $kernel = new HttpKernel($dispatcher, $this->getResolver());

        $this->assertEquals('foo', $kernel->handle(new Request())->getContent());
    }

    public function testTerminate()
    {
        $dispatcher = new EventDispatcher();
        $kernel = new HttpKernel($dispatcher, $this->getResolver());
        $dispatcher->addListener(KernelEvents::TERMINATE, function ($event) use (&$called, &$capturedKernel, &$capturedRequest, &$capturedResponse) {
            $called = true;
            $capturedKernel = $event->getKernel();
            $capturedRequest = $event->getRequest();
            $capturedResponse = $event->getResponse();
        });

        $kernel->terminate($request = Request::create('/'), $response = new Response());
        $this->assertTrue($called);
        $this->assertEquals($kernel, $capturedKernel);
        $this->assertEquals($request, $capturedRequest);
        $this->assertEquals($response, $capturedResponse);
    }

    public function testVerifyRequestStackPushPopDuringHandle()
    {
        $request = new Request();

        $stack = $this->getMock('Symfony\Component\HttpFoundation\RequestStack', array('push', 'pop'));
        $stack->expects($this->at(0))->method('push')->with($this->equalTo($request));
        $stack->expects($this->at(1))->method('pop');

        $dispatcher = new EventDispatcher();
        $kernel = new HttpKernel($dispatcher, $this->getResolver(), $stack);

        $kernel->handle($request, HttpKernelInterface::MASTER_REQUEST);
    }

    protected function getResolver($controller = null)
    {
        if (null === $controller) {
            $controller = function () { return new Response('Hello'); };
        }

        $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
        $resolver->expects($this->any())
            ->method('getController')
            ->will($this->returnValue($controller));
        $resolver->expects($this->any())
            ->method('getArguments')
            ->will($this->returnValue(array()));

        return $resolver;
    }

    protected function assertResponseEquals(Response $expected, Response $actual)
    {
        $expected->setDate($actual->getDate());
        $this->assertEquals($expected, $actual);
    }
}

class Controller
{
    public function __invoke()
    {
        return new Response('foo');
    }

    public function controller()
    {
        return new Response('foo');
    }

    public static function staticController()
    {
        return new Response('foo');
    }
}

function controller_func()
{
    return new Response('foo');
}
PK�a�\�Uu֝�Ipear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/UriSignerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests;

use Symfony\Component\HttpKernel\UriSigner;

class UriSignerTest extends \PHPUnit_Framework_TestCase
{
    public function testSign()
    {
        $signer = new UriSigner('foobar');

        $this->assertContains('?_hash=', $signer->sign('http://example.com/foo'));
        $this->assertContains('&_hash=', $signer->sign('http://example.com/foo?foo=bar'));
    }

    public function testCheck()
    {
        $signer = new UriSigner('foobar');

        $this->assertFalse($signer->check('http://example.com/foo?_hash=foo'));
        $this->assertFalse($signer->check('http://example.com/foo?foo=bar&_hash=foo'));
        $this->assertFalse($signer->check('http://example.com/foo?foo=bar&_hash=foo&bar=foo'));

        $this->assertTrue($signer->check($signer->sign('http://example.com/foo')));
        $this->assertTrue($signer->check($signer->sign('http://example.com/foo?foo=bar')));
    }
}
PK�a�\6^P�^pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/CacheClearer/ChainCacheClearerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\CacheClearer;

use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
use Symfony\Component\HttpKernel\CacheClearer\ChainCacheClearer;

class ChainCacheClearerTest extends \PHPUnit_Framework_TestCase
{
    protected static $cacheDir;

    public static function setUpBeforeClass()
    {
        self::$cacheDir = tempnam(sys_get_temp_dir(), 'sf2_cache_clearer_dir');
    }

    public static function tearDownAfterClass()
    {
        @unlink(self::$cacheDir);
    }

    public function testInjectClearersInConstructor()
    {
        $clearer = $this->getMockClearer();
        $clearer
            ->expects($this->once())
            ->method('clear');

        $chainClearer = new ChainCacheClearer(array($clearer));
        $chainClearer->clear(self::$cacheDir);
    }

    public function testInjectClearerUsingAdd()
    {
        $clearer = $this->getMockClearer();
        $clearer
            ->expects($this->once())
            ->method('clear');

        $chainClearer = new ChainCacheClearer();
        $chainClearer->add($clearer);
        $chainClearer->clear(self::$cacheDir);
    }

    protected function getMockClearer()
    {
        return $this->getMock('Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface');
    }
}
PK�a�\;����
�
Xpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fragment;

use Symfony\Component\HttpKernel\Fragment\FragmentHandler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class FragmentHandlerTest extends \PHPUnit_Framework_TestCase
{
    private $requestStack;

    public function setUp()
    {
        $this->requestStack = $this->getMockBuilder('Symfony\\Component\\HttpFoundation\\RequestStack')
            ->disableOriginalConstructor()
            ->getMock()
        ;
        $this->requestStack
            ->expects($this->any())
            ->method('getCurrentRequest')
            ->will($this->returnValue(Request::create('/')))
        ;
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testRenderWhenRendererDoesNotExist()
    {
        $handler = new FragmentHandler(array(), null, $this->requestStack);
        $handler->render('/', 'foo');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testRenderWithUnknownRenderer()
    {
        $handler = $this->getHandler($this->returnValue(new Response('foo')));

        $handler->render('/', 'bar');
    }

    /**
     * @expectedException \RuntimeException
     * @expectedExceptionMessage Error when rendering "http://localhost/" (Status code is 404).
     */
    public function testDeliverWithUnsuccessfulResponse()
    {
        $handler = $this->getHandler($this->returnValue(new Response('foo', 404)));

        $handler->render('/', 'foo');
    }

    public function testRender()
    {
        $handler = $this->getHandler($this->returnValue(new Response('foo')), array('/', Request::create('/'), array('foo' => 'foo', 'ignore_errors' => true)));

        $this->assertEquals('foo', $handler->render('/', 'foo', array('foo' => 'foo')));
    }

    protected function getHandler($returnValue, $arguments = array())
    {
        $renderer = $this->getMock('Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface');
        $renderer
            ->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('foo'))
        ;
        $e = $renderer
            ->expects($this->any())
            ->method('render')
            ->will($returnValue)
        ;

        if ($arguments) {
            call_user_func_array(array($e, 'with'), $arguments);
        }

        $handler = new FragmentHandler(array(), null, $this->requestStack);
        $handler->addRenderer($renderer);

        return $handler;
    }
}
PK�a�\�҃��	�	\pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fragment;

use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\Fragment\EsiFragmentRenderer;
use Symfony\Component\HttpKernel\HttpCache\Esi;
use Symfony\Component\HttpFoundation\Request;

class EsiFragmentRendererTest extends \PHPUnit_Framework_TestCase
{
    public function testRenderFallbackToInlineStrategyIfNoRequest()
    {
        $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy(true));
        $strategy->render('/', Request::create('/'));
    }

    public function testRenderFallbackToInlineStrategyIfEsiNotSupported()
    {
        $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy(true));
        $strategy->render('/', Request::create('/'));
    }

    public function testRender()
    {
        $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy());

        $request = Request::create('/');
        $request->setLocale('fr');
        $request->headers->set('Surrogate-Capability', 'ESI/1.0');

        $this->assertEquals('<esi:include src="/" />', $strategy->render('/', $request)->getContent());
        $this->assertEquals("<esi:comment text=\"This is a comment\" />\n<esi:include src=\"/\" />", $strategy->render('/', $request, array('comment' => 'This is a comment'))->getContent());
        $this->assertEquals('<esi:include src="/" alt="foo" />', $strategy->render('/', $request, array('alt' => 'foo'))->getContent());
        $this->assertEquals('<esi:include src="/_fragment?_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dmain_controller" alt="/_fragment?_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dalt_controller" />', $strategy->render(new ControllerReference('main_controller', array(), array()), $request, array('alt' => new ControllerReference('alt_controller', array(), array())))->getContent());
    }

    private function getInlineStrategy($called = false)
    {
        $inline = $this->getMockBuilder('Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer')->disableOriginalConstructor()->getMock();

        if ($called) {
            $inline->expects($this->once())->method('render');
        }

        return $inline;
    }
}
PK�a�\�v��_pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fragment;

use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\EventDispatcher\EventDispatcher;

class InlineFragmentRendererTest extends \PHPUnit_Framework_TestCase
{
    public function testRender()
    {
        $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));

        $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
    }

    public function testRenderWithControllerReference()
    {
        $strategy = new InlineFragmentRenderer($this->getKernel($this->returnValue(new Response('foo'))));

        $this->assertEquals('foo', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
    }

    public function testRenderWithObjectsAsAttributes()
    {
        $object = new \stdClass();

        $subRequest = Request::create('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller');
        $subRequest->attributes->replace(array('object' => $object, '_format' => 'html', '_controller' => 'main_controller', '_locale' => 'en'));
        $subRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
        $subRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');

        $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($subRequest));

        $strategy->render(new ControllerReference('main_controller', array('object' => $object), array()), Request::create('/'));
    }

    public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController()
    {
        $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver', array('getController'));
        $resolver
            ->expects($this->once())
            ->method('getController')
            ->will($this->returnValue(function (\stdClass $object, Bar $object1) {
                return new Response($object1->getBar());
            }))
        ;

        $kernel = new HttpKernel(new EventDispatcher(), $resolver);
        $renderer = new InlineFragmentRenderer($kernel);

        $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
        $this->assertEquals('bar', $response->getContent());
    }

    public function testRenderWithTrustedHeaderDisabled()
    {
        $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);

        Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');

        $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest(Request::create('/')));
        $strategy->render('/', Request::create('/'));

        Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $trustedHeaderName);
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testRenderExceptionNoIgnoreErrors()
    {
        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $dispatcher->expects($this->never())->method('dispatch');

        $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);

        $this->assertEquals('foo', $strategy->render('/', Request::create('/'))->getContent());
    }

    public function testRenderExceptionIgnoreErrors()
    {
        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $dispatcher->expects($this->once())->method('dispatch')->with(KernelEvents::EXCEPTION);

        $strategy = new InlineFragmentRenderer($this->getKernel($this->throwException(new \RuntimeException('foo'))), $dispatcher);

        $this->assertEmpty($strategy->render('/', Request::create('/'), array('ignore_errors' => true))->getContent());
    }

    public function testRenderExceptionIgnoreErrorsWithAlt()
    {
        $strategy = new InlineFragmentRenderer($this->getKernel($this->onConsecutiveCalls(
            $this->throwException(new \RuntimeException('foo')),
            $this->returnValue(new Response('bar'))
        )));

        $this->assertEquals('bar', $strategy->render('/', Request::create('/'), array('ignore_errors' => true, 'alt' => '/foo'))->getContent());
    }

    private function getKernel($returnValue)
    {
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $kernel
            ->expects($this->any())
            ->method('handle')
            ->will($returnValue)
        ;

        return $kernel;
    }

    /**
     * Creates a Kernel expecting a request equals to $request
     * Allows delta in comparison in case REQUEST_TIME changed by 1 second
     */
    private function getKernelExpectingRequest(Request $request)
    {
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $kernel
            ->expects($this->any())
            ->method('handle')
            ->with($this->equalTo($request, 1))
        ;

        return $kernel;
    }

    public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
    {
        $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
        $resolver
            ->expects($this->once())
            ->method('getController')
            ->will($this->returnValue(function () {
                ob_start();
                echo 'bar';
                throw new \RuntimeException();
            }))
        ;
        $resolver
            ->expects($this->once())
            ->method('getArguments')
            ->will($this->returnValue(array()))
        ;

        $kernel = new HttpKernel(new EventDispatcher(), $resolver);
        $renderer = new InlineFragmentRenderer($kernel);

        // simulate a main request with output buffering
        ob_start();
        echo 'Foo';

        // simulate a sub-request with output buffering and an exception
        $renderer->render('/', Request::create('/'), array('ignore_errors' => true));

        $this->assertEquals('Foo', ob_get_clean());
    }

    public function testESIHeaderIsKeptInSubrequest()
    {
        $expectedSubRequest = Request::create('/');
        $expectedSubRequest->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');

        if (Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP)) {
            $expectedSubRequest->headers->set('x-forwarded-for', array('127.0.0.1'));
            $expectedSubRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1');
        }

        $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($expectedSubRequest));

        $request = Request::create('/');
        $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
        $strategy->render('/', $request);
    }

    public function testESIHeaderIsKeptInSubrequestWithTrustedHeaderDisabled()
    {
        $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);
        Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, '');

        $this->testESIHeaderIsKeptInSubrequest();

        Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, $trustedHeaderName);
    }
}

class Bar
{
    public $bar = 'bar';

    public function getBar()
    {
        return $this->bar;
    }
}
PK�a�\�
��((apear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fragment;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ControllerReference;

class RoutableFragmentRendererTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getGenerateFragmentUriData
     */
    public function testGenerateFragmentUri($uri, $controller)
    {
        $this->assertEquals($uri, $this->callGenerateFragmentUriMethod($controller, Request::create('/')));
    }

    /**
     * @dataProvider getGenerateFragmentUriData
     */
    public function testGenerateAbsoluteFragmentUri($uri, $controller)
    {
        $this->assertEquals('http://localhost'.$uri, $this->callGenerateFragmentUriMethod($controller, Request::create('/'), true));
    }

    public function getGenerateFragmentUriData()
    {
        return array(
            array('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array(), array())),
            array('/_fragment?_path=_format%3Dxml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('_format' => 'xml'), array())),
            array('/_fragment?_path=foo%3Dfoo%26_format%3Djson%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => 'foo', '_format' => 'json'), array())),
            array('/_fragment?bar=bar&_path=foo%3Dfoo%26_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => 'foo'), array('bar' => 'bar'))),
            array('/_fragment?foo=foo&_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array(), array('foo' => 'foo'))),
            array('/_fragment?_path=foo%255B0%255D%3Dfoo%26foo%255B1%255D%3Dbar%26_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => array('foo', 'bar')), array())),
        );
    }

    public function testGenerateFragmentUriWithARequest()
    {
        $request = Request::create('/');
        $request->attributes->set('_format', 'json');
        $request->setLocale('fr');
        $controller = new ControllerReference('controller', array(), array());

        $this->assertEquals('/_fragment?_path=_format%3Djson%26_locale%3Dfr%26_controller%3Dcontroller', $this->callGenerateFragmentUriMethod($controller, $request));
    }

    /**
     * @expectedException LogicException
     * @dataProvider      getGenerateFragmentUriDataWithNonScalar
     */
    public function testGenerateFragmentUriWithNonScalar($controller)
    {
        $this->callGenerateFragmentUriMethod($controller, Request::create('/'));
    }

    public function getGenerateFragmentUriDataWithNonScalar()
    {
        return array(
            array(new ControllerReference('controller', array('foo' => new Foo(), 'bar' => 'bar'), array())),
            array(new ControllerReference('controller', array('foo' => array('foo' => 'foo'), 'bar' => array('bar' => new Foo())), array())),
        );
    }

    private function callGenerateFragmentUriMethod(ControllerReference $reference, Request $request, $absolute = false)
    {
        $renderer = $this->getMockForAbstractClass('Symfony\Component\HttpKernel\Fragment\RoutableFragmentRenderer');
        $r = new \ReflectionObject($renderer);
        $m = $r->getMethod('generateFragmentUri');
        $m->setAccessible(true);

        return $m->invoke($renderer, $reference, $request, $absolute);
    }
}

class Foo
{
    public $foo;

    public function getFoo()
    {
        return $this->foo;
    }
}
PK�a�\�o�M��apear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Fragment;

use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\Fragment\HIncludeFragmentRenderer;
use Symfony\Component\HttpKernel\UriSigner;
use Symfony\Component\HttpFoundation\Request;

class HIncludeFragmentRendererTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \LogicException
     */
    public function testRenderExceptionWhenControllerAndNoSigner()
    {
        $strategy = new HIncludeFragmentRenderer();
        $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'));
    }

    public function testRenderWithControllerAndSigner()
    {
        $strategy = new HIncludeFragmentRenderer(null, new UriSigner('foo'));

        $this->assertEquals('<hx:include src="/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller&amp;_hash=BP%2BOzCD5MRUI%2BHJpgPDOmoju00FnzLhP3TGcSHbbBLs%3D"></hx:include>', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
    }

    public function testRenderWithUri()
    {
        $strategy = new HIncludeFragmentRenderer();
        $this->assertEquals('<hx:include src="/foo"></hx:include>', $strategy->render('/foo', Request::create('/'))->getContent());

        $strategy = new HIncludeFragmentRenderer(null, new UriSigner('foo'));
        $this->assertEquals('<hx:include src="/foo"></hx:include>', $strategy->render('/foo', Request::create('/'))->getContent());
    }

    public function testRenderWithDefault()
    {
        // only default
        $strategy = new HIncludeFragmentRenderer();
        $this->assertEquals('<hx:include src="/foo">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default'))->getContent());

        // only global default
        $strategy = new HIncludeFragmentRenderer(null, null, 'global_default');
        $this->assertEquals('<hx:include src="/foo">global_default</hx:include>', $strategy->render('/foo', Request::create('/'), array())->getContent());

        // global default and default
        $strategy = new HIncludeFragmentRenderer(null, null, 'global_default');
        $this->assertEquals('<hx:include src="/foo">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default'))->getContent());
    }

    public function testRenderWithAttributesOptions()
    {
        // with id
        $strategy = new HIncludeFragmentRenderer();
        $this->assertEquals('<hx:include src="/foo" id="bar">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default', 'id' => 'bar'))->getContent());

        // with attributes
        $strategy = new HIncludeFragmentRenderer();
        $this->assertEquals('<hx:include src="/foo" p1="v1" p2="v2">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default', 'attributes' => array('p1' => 'v1', 'p2' => 'v2')))->getContent());

        // with id & attributes
        $strategy = new HIncludeFragmentRenderer();
        $this->assertEquals('<hx:include src="/foo" p1="v1" p2="v2" id="bar">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default', 'id' => 'bar', 'attributes' => array('p1' => 'v1', 'p2' => 'v2')))->getContent());
    }

    public function testRenderWithDefaultText()
    {
        $engine = $this->getMock('Symfony\\Component\\Templating\\EngineInterface');
        $engine->expects($this->once())
            ->method('exists')
            ->with('default')
            ->will($this->throwException(new \InvalidArgumentException()));

        // only default
        $strategy = new HIncludeFragmentRenderer($engine);
        $this->assertEquals('<hx:include src="/foo">default</hx:include>', $strategy->render('/foo', Request::create('/'), array('default' => 'default'))->getContent());
    }
}
PK�a�\0��GGJpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/TestHttpKernel.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests;

use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;

class TestHttpKernel extends HttpKernel implements ControllerResolverInterface
{
    public function __construct()
    {
        parent::__construct(new EventDispatcher(), $this);
    }

    public function getController(Request $request)
    {
        return array($this, 'callController');
    }

    public function getArguments(Request $request, $controller)
    {
        return array($request);
    }

    public function callController(Request $request)
    {
        return new Response('Request: '.$request->getRequestUri());
    }
}
PK�a�\z*V%%]pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\Controller;

use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Component\HttpKernel\Tests\Logger;
use Symfony\Component\HttpFoundation\Request;

class ControllerResolverTest extends \PHPUnit_Framework_TestCase
{
    public function testGetControllerWithoutControllerParameter()
    {
        $logger = $this->getMock('Psr\Log\LoggerInterface');
        $logger->expects($this->once())->method('warning')->with('Unable to look for the controller as the "_controller" parameter is missing');
        $resolver = new ControllerResolver($logger);

        $request = Request::create('/');
        $this->assertFalse($resolver->getController($request), '->getController() returns false when the request has no _controller attribute');
    }

    public function testGetControllerWithLambda()
    {
        $resolver = new ControllerResolver();

        $request = Request::create('/');
        $request->attributes->set('_controller', $lambda = function () {});
        $controller = $resolver->getController($request);
        $this->assertSame($lambda, $controller);
    }

    public function testGetControllerWithObjectAndInvokeMethod()
    {
        $resolver = new ControllerResolver();

        $request = Request::create('/');
        $request->attributes->set('_controller', $this);
        $controller = $resolver->getController($request);
        $this->assertSame($this, $controller);
    }

    public function testGetControllerWithObjectAndMethod()
    {
        $resolver = new ControllerResolver();

        $request = Request::create('/');
        $request->attributes->set('_controller', array($this, 'controllerMethod1'));
        $controller = $resolver->getController($request);
        $this->assertSame(array($this, 'controllerMethod1'), $controller);
    }

    public function testGetControllerWithClassAndMethod()
    {
        $resolver = new ControllerResolver();

        $request = Request::create('/');
        $request->attributes->set('_controller', array('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', 'controllerMethod4'));
        $controller = $resolver->getController($request);
        $this->assertSame(array('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', 'controllerMethod4'), $controller);
    }

    public function testGetControllerWithObjectAndMethodAsString()
    {
        $resolver = new ControllerResolver();

        $request = Request::create('/');
        $request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::controllerMethod1');
        $controller = $resolver->getController($request);
        $this->assertInstanceOf('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', $controller[0], '->getController() returns a PHP callable');
    }

    public function testGetControllerWithClassAndInvokeMethod()
    {
        $resolver = new ControllerResolver();

        $request = Request::create('/');
        $request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest');
        $controller = $resolver->getController($request);
        $this->assertInstanceOf('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', $controller);
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testGetControllerOnObjectWithoutInvokeMethod()
    {
        $resolver = new ControllerResolver();

        $request = Request::create('/');
        $request->attributes->set('_controller', new \stdClass());
        $resolver->getController($request);
    }

    public function testGetControllerWithFunction()
    {
        $resolver = new ControllerResolver();

        $request = Request::create('/');
        $request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\some_controller_function');
        $controller = $resolver->getController($request);
        $this->assertSame('Symfony\Component\HttpKernel\Tests\Controller\some_controller_function', $controller);
    }

    /**
     * @dataProvider      getUndefinedControllers
     * @expectedException \InvalidArgumentException
     */
    public function testGetControllerOnNonUndefinedFunction($controller)
    {
        $resolver = new ControllerResolver();

        $request = Request::create('/');
        $request->attributes->set('_controller', $controller);
        $resolver->getController($request);
    }

    public function getUndefinedControllers()
    {
        return array(
            array('foo'),
            array('foo::bar'),
            array('stdClass'),
            array('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::bar'),
        );
    }

    public function testGetArguments()
    {
        $resolver = new ControllerResolver();

        $request = Request::create('/');
        $controller = array(new self(), 'testGetArguments');
        $this->assertEquals(array(), $resolver->getArguments($request, $controller), '->getArguments() returns an empty array if the method takes no arguments');

        $request = Request::create('/');
        $request->attributes->set('foo', 'foo');
        $controller = array(new self(), 'controllerMethod1');
        $this->assertEquals(array('foo'), $resolver->getArguments($request, $controller), '->getArguments() returns an array of arguments for the controller method');

        $request = Request::create('/');
        $request->attributes->set('foo', 'foo');
        $controller = array(new self(), 'controllerMethod2');
        $this->assertEquals(array('foo', null), $resolver->getArguments($request, $controller), '->getArguments() uses default values if present');

        $request->attributes->set('bar', 'bar');
        $this->assertEquals(array('foo', 'bar'), $resolver->getArguments($request, $controller), '->getArguments() overrides default values if provided in the request attributes');

        $request = Request::create('/');
        $request->attributes->set('foo', 'foo');
        $controller = function ($foo) {};
        $this->assertEquals(array('foo'), $resolver->getArguments($request, $controller));

        $request = Request::create('/');
        $request->attributes->set('foo', 'foo');
        $controller = function ($foo, $bar = 'bar') {};
        $this->assertEquals(array('foo', 'bar'), $resolver->getArguments($request, $controller));

        $request = Request::create('/');
        $request->attributes->set('foo', 'foo');
        $controller = new self();
        $this->assertEquals(array('foo', null), $resolver->getArguments($request, $controller));
        $request->attributes->set('bar', 'bar');
        $this->assertEquals(array('foo', 'bar'), $resolver->getArguments($request, $controller));

        $request = Request::create('/');
        $request->attributes->set('foo', 'foo');
        $request->attributes->set('foobar', 'foobar');
        $controller = 'Symfony\Component\HttpKernel\Tests\Controller\some_controller_function';
        $this->assertEquals(array('foo', 'foobar'), $resolver->getArguments($request, $controller));

        $request = Request::create('/');
        $request->attributes->set('foo', 'foo');
        $request->attributes->set('foobar', 'foobar');
        $controller = array(new self(), 'controllerMethod3');

        if (version_compare(PHP_VERSION, '5.3.16', '==')) {
            $this->markTestSkipped('PHP 5.3.16 has a major bug in the Reflection sub-system');
        } else {
            try {
                $resolver->getArguments($request, $controller);
                $this->fail('->getArguments() throws a \RuntimeException exception if it cannot determine the argument value');
            } catch (\Exception $e) {
                $this->assertInstanceOf('\RuntimeException', $e, '->getArguments() throws a \RuntimeException exception if it cannot determine the argument value');
            }
        }

        $request = Request::create('/');
        $controller = array(new self(), 'controllerMethod5');
        $this->assertEquals(array($request), $resolver->getArguments($request, $controller), '->getArguments() injects the request');
    }

    public function testCreateControllerCanReturnAnyCallable()
    {
        $mock = $this->getMock('Symfony\Component\HttpKernel\Controller\ControllerResolver', array('createController'));
        $mock->expects($this->once())->method('createController')->will($this->returnValue('Symfony\Component\HttpKernel\Tests\Controller\some_controller_function'));

        $request = Request::create('/');
        $request->attributes->set('_controller', 'foobar');
        $mock->getController($request);
    }

    public function __invoke($foo, $bar = null)
    {
    }

    public function controllerMethod1($foo)
    {
    }

    protected function controllerMethod2($foo, $bar = null)
    {
    }

    protected function controllerMethod3($foo, $bar = null, $foobar)
    {
    }

    protected static function controllerMethod4()
    {
    }

    protected function controllerMethod5(Request $request)
    {
    }
}

function some_controller_function($foo, $foobar)
{
}
PK�a�\�?7|�f�fFpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/KernelTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests;

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest;
use Symfony\Component\HttpKernel\Tests\Fixtures\KernelForOverrideName;
use Symfony\Component\HttpKernel\Tests\Fixtures\FooBarBundle;

class KernelTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $env = 'test_env';
        $debug = true;
        $kernel = new KernelForTest($env, $debug);

        $this->assertEquals($env, $kernel->getEnvironment());
        $this->assertEquals($debug, $kernel->isDebug());
        $this->assertFalse($kernel->isBooted());
        $this->assertLessThanOrEqual(microtime(true), $kernel->getStartTime());
        $this->assertNull($kernel->getContainer());
    }

    public function testClone()
    {
        $env = 'test_env';
        $debug = true;
        $kernel = new KernelForTest($env, $debug);

        $clone = clone $kernel;

        $this->assertEquals($env, $clone->getEnvironment());
        $this->assertEquals($debug, $clone->isDebug());
        $this->assertFalse($clone->isBooted());
        $this->assertLessThanOrEqual(microtime(true), $clone->getStartTime());
        $this->assertNull($clone->getContainer());
    }

    public function testBootInitializesBundlesAndContainer()
    {
        $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer'));
        $kernel->expects($this->once())
            ->method('initializeBundles');
        $kernel->expects($this->once())
            ->method('initializeContainer');

        $kernel->boot();
    }

    public function testBootSetsTheContainerToTheBundles()
    {
        $bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
        $bundle->expects($this->once())
            ->method('setContainer');

        $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer', 'getBundles'));
        $kernel->expects($this->once())
            ->method('getBundles')
            ->will($this->returnValue(array($bundle)));

        $kernel->boot();
    }

    public function testBootSetsTheBootedFlagToTrue()
    {
        // use test kernel to access isBooted()
        $kernel = $this->getKernelForTest(array('initializeBundles', 'initializeContainer'));
        $kernel->boot();

        $this->assertTrue($kernel->isBooted());
    }

    public function testClassCacheIsLoaded()
    {
        $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer', 'doLoadClassCache'));
        $kernel->loadClassCache('name', '.extension');
        $kernel->expects($this->once())
            ->method('doLoadClassCache')
            ->with('name', '.extension');

        $kernel->boot();
    }

    public function testClassCacheIsNotLoadedByDefault()
    {
        $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer'));
        $kernel->expects($this->never())
            ->method('doLoadClassCache');

        $kernel->boot();
    }

    public function testClassCacheIsNotLoadedWhenKernelIsNotBooted()
    {
        $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer', 'doLoadClassCache'));
        $kernel->loadClassCache();
        $kernel->expects($this->never())
            ->method('doLoadClassCache');
    }

    public function testBootKernelSeveralTimesOnlyInitializesBundlesOnce()
    {
        $kernel = $this->getKernel(array('initializeBundles', 'initializeContainer'));
        $kernel->expects($this->once())
            ->method('initializeBundles');

        $kernel->boot();
        $kernel->boot();
    }

    public function testShutdownCallsShutdownOnAllBundles()
    {
        $bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
        $bundle->expects($this->once())
            ->method('shutdown');

        $kernel = $this->getKernel(array(), array($bundle));

        $kernel->boot();
        $kernel->shutdown();
    }

    public function testShutdownGivesNullContainerToAllBundles()
    {
        $bundle = $this->getMock('Symfony\Component\HttpKernel\Bundle\Bundle');
        $bundle->expects($this->at(3))
            ->method('setContainer')
            ->with(null);

        $kernel = $this->getKernel(array('getBundles'));
        $kernel->expects($this->any())
            ->method('getBundles')
            ->will($this->returnValue(array($bundle)));

        $kernel->boot();
        $kernel->shutdown();
    }

    public function testHandleCallsHandleOnHttpKernel()
    {
        $type = HttpKernelInterface::MASTER_REQUEST;
        $catch = true;
        $request = new Request();

        $httpKernelMock = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernel')
            ->disableOriginalConstructor()
            ->getMock();
        $httpKernelMock
            ->expects($this->once())
            ->method('handle')
            ->with($request, $type, $catch);

        $kernel = $this->getKernel(array('getHttpKernel'));
        $kernel->expects($this->once())
            ->method('getHttpKernel')
            ->will($this->returnValue($httpKernelMock));

        $kernel->handle($request, $type, $catch);
    }

    public function testHandleBootsTheKernel()
    {
        $type = HttpKernelInterface::MASTER_REQUEST;
        $catch = true;
        $request = new Request();

        $httpKernelMock = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernel')
            ->disableOriginalConstructor()
            ->getMock();

        $kernel = $this->getKernel(array('getHttpKernel', 'boot'));
        $kernel->expects($this->once())
            ->method('getHttpKernel')
            ->will($this->returnValue($httpKernelMock));

        $kernel->expects($this->once())
            ->method('boot');

        $kernel->handle($request, $type, $catch);
    }

    public function testStripComments()
    {
        if (!function_exists('token_get_all')) {
            $this->markTestSkipped('The function token_get_all() is not available.');

            return;
        }
        $source = <<<'EOF'
<?php

$string = 'string should not be   modified';

$string = 'string should not be

modified';


$heredoc = <<<HD


Heredoc should not be   modified


HD;

$nowdoc = <<<'ND'


Nowdoc should not be   modified


ND;

/**
 * some class comments to strip
 */
class TestClass
{
    /**
     * some method comments to strip
     */
    public function doStuff()
    {
        // inline comment
    }
}
EOF;
        $expected = <<<'EOF'
<?php
$string = 'string should not be   modified';
$string = 'string should not be

modified';
$heredoc = <<<HD


Heredoc should not be   modified


HD;
$nowdoc = <<<'ND'


Nowdoc should not be   modified


ND;
class TestClass
{
    public function doStuff()
    {
        }
}
EOF;

        $output = Kernel::stripComments($source);

        // Heredocs are preserved, making the output mixing Unix and Windows line
        // endings, switching to "\n" everywhere on Windows to avoid failure.
        if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
            $expected = str_replace("\r\n", "\n", $expected);
            $output = str_replace("\r\n", "\n", $output);
        }

        $this->assertEquals($expected, $output);
    }

    public function testIsClassInActiveBundleFalse()
    {
        $kernel = $this->getKernelMockForIsClassInActiveBundleTest();

        $this->assertFalse($kernel->isClassInActiveBundle('Not\In\Active\Bundle'));
    }

    public function testIsClassInActiveBundleFalseNoNamespace()
    {
        $kernel = $this->getKernelMockForIsClassInActiveBundleTest();

        $this->assertFalse($kernel->isClassInActiveBundle('NotNamespacedClass'));
    }

    public function testIsClassInActiveBundleTrue()
    {
        $kernel = $this->getKernelMockForIsClassInActiveBundleTest();

        $this->assertTrue($kernel->isClassInActiveBundle(__NAMESPACE__.'\Fixtures\FooBarBundle\SomeClass'));
    }

    protected function getKernelMockForIsClassInActiveBundleTest()
    {
        $bundle = new FooBarBundle();

        $kernel = $this->getKernel(array('getBundles'));
        $kernel->expects($this->once())
            ->method('getBundles')
            ->will($this->returnValue(array($bundle)));

        return $kernel;
    }

    public function testGetRootDir()
    {
        $kernel = new KernelForTest('test', true);

        $this->assertEquals(__DIR__.DIRECTORY_SEPARATOR.'Fixtures', realpath($kernel->getRootDir()));
    }

    public function testGetName()
    {
        $kernel = new KernelForTest('test', true);

        $this->assertEquals('Fixtures', $kernel->getName());
    }

    public function testOverrideGetName()
    {
        $kernel = new KernelForOverrideName('test', true);

        $this->assertEquals('overridden', $kernel->getName());
    }

    public function testSerialize()
    {
        $env = 'test_env';
        $debug = true;
        $kernel = new KernelForTest($env, $debug);

        $expected = serialize(array($env, $debug));
        $this->assertEquals($expected, $kernel->serialize());
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testLocateResourceThrowsExceptionWhenNameIsNotValid()
    {
        $this->getKernel()->locateResource('Foo');
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testLocateResourceThrowsExceptionWhenNameIsUnsafe()
    {
        $this->getKernel()->locateResource('@FooBundle/../bar');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testLocateResourceThrowsExceptionWhenBundleDoesNotExist()
    {
        $this->getKernel()->locateResource('@FooBundle/config/routing.xml');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testLocateResourceThrowsExceptionWhenResourceDoesNotExist()
    {
        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->once())
            ->method('getBundle')
            ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle'))))
        ;

        $kernel->locateResource('@Bundle1Bundle/config/routing.xml');
    }

    public function testLocateResourceReturnsTheFirstThatMatches()
    {
        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->once())
            ->method('getBundle')
            ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle'))))
        ;

        $this->assertEquals(__DIR__.'/Fixtures/Bundle1Bundle/foo.txt', $kernel->locateResource('@Bundle1Bundle/foo.txt'));
    }

    public function testLocateResourceReturnsTheFirstThatMatchesWithParent()
    {
        $parent = $this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle');
        $child = $this->getBundle(__DIR__.'/Fixtures/Bundle2Bundle');

        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->exactly(2))
            ->method('getBundle')
            ->will($this->returnValue(array($child, $parent)))
        ;

        $this->assertEquals(__DIR__.'/Fixtures/Bundle2Bundle/foo.txt', $kernel->locateResource('@ParentAABundle/foo.txt'));
        $this->assertEquals(__DIR__.'/Fixtures/Bundle1Bundle/bar.txt', $kernel->locateResource('@ParentAABundle/bar.txt'));
    }

    public function testLocateResourceReturnsAllMatches()
    {
        $parent = $this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle');
        $child = $this->getBundle(__DIR__.'/Fixtures/Bundle2Bundle');

        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->once())
            ->method('getBundle')
            ->will($this->returnValue(array($child, $parent)))
        ;

        $this->assertEquals(array(
            __DIR__.'/Fixtures/Bundle2Bundle/foo.txt',
            __DIR__.'/Fixtures/Bundle1Bundle/foo.txt'),
            $kernel->locateResource('@Bundle1Bundle/foo.txt', null, false));
    }

    public function testLocateResourceReturnsAllMatchesBis()
    {
        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->once())
            ->method('getBundle')
            ->will($this->returnValue(array(
                $this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle'),
                $this->getBundle(__DIR__.'/Foobar')
            )))
        ;

        $this->assertEquals(
            array(__DIR__.'/Fixtures/Bundle1Bundle/foo.txt'),
            $kernel->locateResource('@Bundle1Bundle/foo.txt', null, false)
        );
    }

    public function testLocateResourceIgnoresDirOnNonResource()
    {
        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->once())
            ->method('getBundle')
            ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle'))))
        ;

        $this->assertEquals(
            __DIR__.'/Fixtures/Bundle1Bundle/foo.txt',
            $kernel->locateResource('@Bundle1Bundle/foo.txt', __DIR__.'/Fixtures')
        );
    }

    public function testLocateResourceReturnsTheDirOneForResources()
    {
        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->once())
            ->method('getBundle')
            ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/FooBundle', null, null, 'FooBundle'))))
        ;

        $this->assertEquals(
            __DIR__.'/Fixtures/Resources/FooBundle/foo.txt',
            $kernel->locateResource('@FooBundle/Resources/foo.txt', __DIR__.'/Fixtures/Resources')
        );
    }

    public function testLocateResourceReturnsTheDirOneForResourcesAndBundleOnes()
    {
        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->once())
            ->method('getBundle')
            ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle', null, null, 'Bundle1Bundle'))))
        ;

        $this->assertEquals(array(
            __DIR__.'/Fixtures/Resources/Bundle1Bundle/foo.txt',
            __DIR__.'/Fixtures/Bundle1Bundle/Resources/foo.txt'),
            $kernel->locateResource('@Bundle1Bundle/Resources/foo.txt', __DIR__.'/Fixtures/Resources', false)
        );
    }

    public function testLocateResourceOverrideBundleAndResourcesFolders()
    {
        $parent = $this->getBundle(__DIR__.'/Fixtures/BaseBundle', null, 'BaseBundle', 'BaseBundle');
        $child = $this->getBundle(__DIR__.'/Fixtures/ChildBundle', 'ParentBundle', 'ChildBundle', 'ChildBundle');

        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->exactly(4))
            ->method('getBundle')
            ->will($this->returnValue(array($child, $parent)))
        ;

        $this->assertEquals(array(
            __DIR__.'/Fixtures/Resources/ChildBundle/foo.txt',
            __DIR__.'/Fixtures/ChildBundle/Resources/foo.txt',
            __DIR__.'/Fixtures/BaseBundle/Resources/foo.txt',
            ),
            $kernel->locateResource('@BaseBundle/Resources/foo.txt', __DIR__.'/Fixtures/Resources', false)
        );

        $this->assertEquals(
            __DIR__.'/Fixtures/Resources/ChildBundle/foo.txt',
            $kernel->locateResource('@BaseBundle/Resources/foo.txt', __DIR__.'/Fixtures/Resources')
        );

        try {
            $kernel->locateResource('@BaseBundle/Resources/hide.txt', __DIR__.'/Fixtures/Resources', false);
            $this->fail('Hidden resources should raise an exception when returning an array of matching paths');
        } catch (\RuntimeException $e) {
        }

        try {
            $kernel->locateResource('@BaseBundle/Resources/hide.txt', __DIR__.'/Fixtures/Resources', true);
            $this->fail('Hidden resources should raise an exception when returning the first matching path');
        } catch (\RuntimeException $e) {
        }
    }

    public function testLocateResourceOnDirectories()
    {
        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->exactly(2))
            ->method('getBundle')
            ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/FooBundle', null, null, 'FooBundle'))))
        ;

        $this->assertEquals(
            __DIR__.'/Fixtures/Resources/FooBundle/',
            $kernel->locateResource('@FooBundle/Resources/', __DIR__.'/Fixtures/Resources')
        );
        $this->assertEquals(
            __DIR__.'/Fixtures/Resources/FooBundle',
            $kernel->locateResource('@FooBundle/Resources', __DIR__.'/Fixtures/Resources')
        );

        $kernel = $this->getKernel(array('getBundle'));
        $kernel
            ->expects($this->exactly(2))
            ->method('getBundle')
            ->will($this->returnValue(array($this->getBundle(__DIR__.'/Fixtures/Bundle1Bundle', null, null, 'Bundle1Bundle'))))
        ;

        $this->assertEquals(
            __DIR__.'/Fixtures/Bundle1Bundle/Resources/',
            $kernel->locateResource('@Bundle1Bundle/Resources/')
        );
        $this->assertEquals(
            __DIR__.'/Fixtures/Bundle1Bundle/Resources',
            $kernel->locateResource('@Bundle1Bundle/Resources')
        );
    }

    public function testInitializeBundles()
    {
        $parent = $this->getBundle(null, null, 'ParentABundle');
        $child = $this->getBundle(null, 'ParentABundle', 'ChildABundle');

        // use test kernel so we can access getBundleMap()
        $kernel = $this->getKernelForTest(array('registerBundles'));
        $kernel
            ->expects($this->once())
            ->method('registerBundles')
            ->will($this->returnValue(array($parent, $child)))
        ;
        $kernel->boot();

        $map = $kernel->getBundleMap();
        $this->assertEquals(array($child, $parent), $map['ParentABundle']);
    }

    public function testInitializeBundlesSupportInheritanceCascade()
    {
        $grandparent = $this->getBundle(null, null, 'GrandParentBBundle');
        $parent = $this->getBundle(null, 'GrandParentBBundle', 'ParentBBundle');
        $child = $this->getBundle(null, 'ParentBBundle', 'ChildBBundle');

        // use test kernel so we can access getBundleMap()
        $kernel = $this->getKernelForTest(array('registerBundles'));
        $kernel
            ->expects($this->once())
            ->method('registerBundles')
            ->will($this->returnValue(array($grandparent, $parent, $child)))
        ;
        $kernel->boot();

        $map = $kernel->getBundleMap();
        $this->assertEquals(array($child, $parent, $grandparent), $map['GrandParentBBundle']);
        $this->assertEquals(array($child, $parent), $map['ParentBBundle']);
        $this->assertEquals(array($child), $map['ChildBBundle']);
    }

    /**
     * @expectedException \LogicException
     * @expectedExceptionMessage Bundle "ChildCBundle" extends bundle "FooBar", which is not registered.
     */
    public function testInitializeBundlesThrowsExceptionWhenAParentDoesNotExists()
    {
        $child = $this->getBundle(null, 'FooBar', 'ChildCBundle');
        $kernel = $this->getKernel(array(), array($child));
        $kernel->boot();
    }

    public function testInitializeBundlesSupportsArbitraryBundleRegistrationOrder()
    {
        $grandparent = $this->getBundle(null, null, 'GrandParentCBundle');
        $parent = $this->getBundle(null, 'GrandParentCBundle', 'ParentCBundle');
        $child = $this->getBundle(null, 'ParentCBundle', 'ChildCBundle');

        // use test kernel so we can access getBundleMap()
        $kernel = $this->getKernelForTest(array('registerBundles'));
        $kernel
            ->expects($this->once())
            ->method('registerBundles')
            ->will($this->returnValue(array($parent, $grandparent, $child)))
        ;
        $kernel->boot();

        $map = $kernel->getBundleMap();
        $this->assertEquals(array($child, $parent, $grandparent), $map['GrandParentCBundle']);
        $this->assertEquals(array($child, $parent), $map['ParentCBundle']);
        $this->assertEquals(array($child), $map['ChildCBundle']);
    }

    /**
     * @expectedException \LogicException
     * @expectedExceptionMessage Bundle "ParentCBundle" is directly extended by two bundles "ChildC2Bundle" and "ChildC1Bundle".
     */
    public function testInitializeBundlesThrowsExceptionWhenABundleIsDirectlyExtendedByTwoBundles()
    {
        $parent = $this->getBundle(null, null, 'ParentCBundle');
        $child1 = $this->getBundle(null, 'ParentCBundle', 'ChildC1Bundle');
        $child2 = $this->getBundle(null, 'ParentCBundle', 'ChildC2Bundle');

        $kernel = $this->getKernel(array(), array($parent, $child1, $child2));
        $kernel->boot();
    }

    /**
     * @expectedException \LogicException
     * @expectedExceptionMessage Trying to register two bundles with the same name "DuplicateName"
     */
    public function testInitializeBundleThrowsExceptionWhenRegisteringTwoBundlesWithTheSameName()
    {
        $fooBundle = $this->getBundle(null, null, 'FooBundle', 'DuplicateName');
        $barBundle = $this->getBundle(null, null, 'BarBundle', 'DuplicateName');

        $kernel = $this->getKernel(array(), array($fooBundle, $barBundle));
        $kernel->boot();
    }

    /**
     * @expectedException \LogicException
     * @expectedExceptionMessage Bundle "CircularRefBundle" can not extend itself.
     */
    public function testInitializeBundleThrowsExceptionWhenABundleExtendsItself()
    {
        $circularRef = $this->getBundle(null, 'CircularRefBundle', 'CircularRefBundle');

        $kernel = $this->getKernel(array(), array($circularRef));
        $kernel->boot();
    }

    public function testTerminateReturnsSilentlyIfKernelIsNotBooted()
    {
        $kernel = $this->getKernel(array('getHttpKernel'));
        $kernel->expects($this->never())
            ->method('getHttpKernel');

        $kernel->terminate(Request::create('/'), new Response());
    }

    public function testTerminateDelegatesTerminationOnlyForTerminableInterface()
    {
        // does not implement TerminableInterface
        $httpKernelMock = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')
            ->disableOriginalConstructor()
            ->getMock();

        $httpKernelMock
            ->expects($this->never())
            ->method('terminate');

        $kernel = $this->getKernel(array('getHttpKernel'));
        $kernel->expects($this->once())
            ->method('getHttpKernel')
            ->will($this->returnValue($httpKernelMock));

        $kernel->boot();
        $kernel->terminate(Request::create('/'), new Response());

        // implements TerminableInterface
        $httpKernelMock = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernel')
            ->disableOriginalConstructor()
            ->setMethods(array('terminate'))
            ->getMock();

        $httpKernelMock
            ->expects($this->once())
            ->method('terminate');

        $kernel = $this->getKernel(array('getHttpKernel'));
        $kernel->expects($this->exactly(2))
            ->method('getHttpKernel')
            ->will($this->returnValue($httpKernelMock));

        $kernel->boot();
        $kernel->terminate(Request::create('/'), new Response());
    }

    /**
     * Returns a mock for the BundleInterface
     *
     * @return BundleInterface
     */
    protected function getBundle($dir = null, $parent = null, $className = null, $bundleName = null)
    {
        $bundle = $this
            ->getMockBuilder('Symfony\Component\HttpKernel\Bundle\BundleInterface')
            ->setMethods(array('getPath', 'getParent', 'getName'))
            ->disableOriginalConstructor()
        ;

        if ($className) {
            $bundle->setMockClassName($className);
        }

        $bundle = $bundle->getMockForAbstractClass();

        $bundle
            ->expects($this->any())
            ->method('getName')
            ->will($this->returnValue(null === $bundleName ? get_class($bundle) : $bundleName))
        ;

        $bundle
            ->expects($this->any())
            ->method('getPath')
            ->will($this->returnValue($dir))
        ;

        $bundle
            ->expects($this->any())
            ->method('getParent')
            ->will($this->returnValue($parent))
        ;

        return $bundle;
    }

    /**
     * Returns a mock for the abstract kernel.
     *
     * @param array $methods Additional methods to mock (besides the abstract ones)
     * @param array $bundles Bundles to register
     *
     * @return Kernel
     */
    protected function getKernel(array $methods = array(), array $bundles = array())
    {
        $methods[] = 'registerBundles';

        $kernel = $this
            ->getMockBuilder('Symfony\Component\HttpKernel\Kernel')
            ->setMethods($methods)
            ->setConstructorArgs(array('test', false))
            ->getMockForAbstractClass()
        ;
        $kernel->expects($this->any())
            ->method('registerBundles')
            ->will($this->returnValue($bundles))
        ;
        $p = new \ReflectionProperty($kernel, 'rootDir');
        $p->setAccessible(true);
        $p->setValue($kernel, __DIR__.'/Fixtures');

        return $kernel;
    }

    protected function getKernelForTest(array $methods = array())
    {
        $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest')
            ->setConstructorArgs(array('test', false))
            ->setMethods($methods)
            ->getMock();
        $p = new \ReflectionProperty($kernel, 'rootDir');
        $p->setAccessible(true);
        $p->setValue($kernel, __DIR__.'/Fixtures');

        return $kernel;
    }
}
PK�a�\���	�	apear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/ConfigDataCollectorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\DataCollector;

use Symfony\Component\HttpKernel\DataCollector\ConfigDataCollector;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class ConfigDataCollectorTest extends \PHPUnit_Framework_TestCase
{
    public function testCollect()
    {
        $kernel = new KernelForTest('test', true);
        $c = new ConfigDataCollector();
        $c->setKernel($kernel);
        $c->collect(new Request(), new Response());

        $this->assertSame('test',$c->getEnv());
        $this->assertTrue($c->isDebug());
        $this->assertSame('config',$c->getName());
        $this->assertSame('testkernel',$c->getAppName());
        $this->assertSame(PHP_VERSION,$c->getPhpVersion());
        $this->assertSame(Kernel::VERSION,$c->getSymfonyVersion());
        $this->assertNull($c->getToken());

        // if else clause because we don't know it
        if (extension_loaded('xdebug')) {
            $this->assertTrue($c->hasXdebug());
        } else {
            $this->assertFalse($c->hasXdebug());
        }

        // if else clause because we don't know it
        if (((extension_loaded('eaccelerator') && ini_get('eaccelerator.enable'))
                ||
                (extension_loaded('apc') && ini_get('apc.enabled'))
                ||
                (extension_loaded('Zend OPcache') && ini_get('opcache.enable'))
                ||
                (extension_loaded('xcache') && ini_get('xcache.cacher'))
                ||
                (extension_loaded('wincache') && ini_get('wincache.ocenabled')))) {
            $this->assertTrue($c->hasAccelerator());
        } else {
            $this->assertFalse($c->hasAccelerator());
        }
    }
}

class KernelForTest extends Kernel
{
    public function getName()
    {
        return 'testkernel';
    }

    public function registerBundles()
    {
    }

    public function init()
    {
    }

    public function getBundles()
    {
        return array();
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
    }
}
PK�a�\�J�֌�bpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/RequestDataCollectorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\DataCollector;

use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\DataCollector\RequestDataCollector;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\EventDispatcher\EventDispatcher;

class RequestDataCollectorTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     */
    public function testCollect(Request $request, Response $response)
    {
        $c = new RequestDataCollector();

        $c->collect($request, $response);

        $this->assertSame('request', $c->getName());
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\HeaderBag', $c->getRequestHeaders());
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestServer());
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestCookies());
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestAttributes());
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestRequest());
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\ParameterBag', $c->getRequestQuery());
        $this->assertSame('html', $c->getFormat());
        $this->assertSame('foobar', $c->getRoute());
        $this->assertSame(array('name' => 'foo'), $c->getRouteParams());
        $this->assertSame(array(), $c->getSessionAttributes());
        $this->assertSame('en', $c->getLocale());

        $this->assertInstanceOf('Symfony\Component\HttpFoundation\HeaderBag', $c->getResponseHeaders());
        $this->assertSame('OK', $c->getStatusText());
        $this->assertSame(200, $c->getStatusCode());
        $this->assertSame('application/json', $c->getContentType());
    }

    /**
     * Test various types of controller callables.
     *
     * @dataProvider provider
     */
    public function testControllerInspection(Request $request, Response $response)
    {
        // make sure we always match the line number
        $r1 = new \ReflectionMethod($this, 'testControllerInspection');
        $r2 = new \ReflectionMethod($this, 'staticControllerMethod');
        // test name, callable, expected
        $controllerTests = array(
            array(
                '"Regular" callable',
                array($this, 'testControllerInspection'),
                array(
                    'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
                    'method' => 'testControllerInspection',
                    'file' => __FILE__,
                    'line' => $r1->getStartLine()
                ),
            ),

            array(
                'Closure',
                function () { return 'foo'; },
                array(
                    'class' => __NAMESPACE__.'\{closure}',
                    'method' => null,
                    'file' => __FILE__,
                    'line' => __LINE__ - 5,
                ),
            ),

            array(
                'Static callback as string',
                'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest::staticControllerMethod',
                'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest::staticControllerMethod',
            ),

            array(
                'Static callable with instance',
                array($this, 'staticControllerMethod'),
                array(
                    'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
                    'method' => 'staticControllerMethod',
                    'file' => __FILE__,
                    'line' => $r2->getStartLine()
                ),
            ),

            array(
                'Static callable with class name',
                array('Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest', 'staticControllerMethod'),
                array(
                    'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
                    'method' => 'staticControllerMethod',
                    'file' => __FILE__,
                    'line' => $r2->getStartLine()
                ),
            ),

            array(
                'Callable with instance depending on __call()',
                array($this, 'magicMethod'),
                array(
                    'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
                    'method' => 'magicMethod',
                    'file' => 'n/a',
                    'line' => 'n/a'
                ),
            ),

            array(
                'Callable with class name depending on __callStatic()',
                array('Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest', 'magicMethod'),
                array(
                    'class' => 'Symfony\Component\HttpKernel\Tests\DataCollector\RequestDataCollectorTest',
                    'method' => 'magicMethod',
                    'file' => 'n/a',
                    'line' => 'n/a'
                ),
            ),
        );

        $c = new RequestDataCollector();

        foreach ($controllerTests as $controllerTest) {
            $this->injectController($c, $controllerTest[1], $request);
            $c->collect($request, $response);
            $this->assertSame($controllerTest[2], $c->getController(), sprintf('Testing: %s', $controllerTest[0]));
        }
    }

    public function provider()
    {
        if (!class_exists('Symfony\Component\HttpFoundation\Request')) {
            return array(array(null, null));
        }

        $request = Request::create('http://test.com/foo?bar=baz');
        $request->attributes->set('foo', 'bar');
        $request->attributes->set('_route', 'foobar');
        $request->attributes->set('_route_params', array('name' => 'foo'));

        $response = new Response();
        $response->setStatusCode(200);
        $response->headers->set('Content-Type', 'application/json');
        $response->headers->setCookie(new Cookie('foo','bar',1,'/foo','localhost',true,true));
        $response->headers->setCookie(new Cookie('bar','foo',new \DateTime('@946684800')));
        $response->headers->setCookie(new Cookie('bazz','foo','2000-12-12'));

        return array(
            array($request, $response)
        );
    }

    /**
     * Inject the given controller callable into the data collector.
     */
    protected function injectController($collector, $controller, $request)
    {
        $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
        $httpKernel = new HttpKernel(new EventDispatcher(), $resolver);
        $event = new FilterControllerEvent($httpKernel, $controller, $request, HttpKernelInterface::MASTER_REQUEST);
        $collector->onKernelController($event);
    }

    /**
     * Dummy method used as controller callable
     */
    public static function staticControllerMethod()
    {
        throw new \LogicException('Unexpected method call');
    }

    /**
     * Magic method to allow non existing methods to be called and delegated.
     */
    public function __call($method, $args)
    {
        throw new \LogicException('Unexpected method call');
    }

    /**
     * Magic method to allow non existing methods to be called and delegated.
     */
    public static function __callStatic($method, $args)
    {
        throw new \LogicException('Unexpected method call');
    }

}
PK�a�\�}#��dpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/ExceptionDataCollectorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\DataCollector;

use Symfony\Component\HttpKernel\DataCollector\ExceptionDataCollector;
use Symfony\Component\HttpKernel\Exception\FlattenException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class ExceptionDataCollectorTest extends \PHPUnit_Framework_TestCase
{
    public function testCollect()
    {
        $e = new \Exception('foo',500);
        $c = new ExceptionDataCollector();
        $flattened = FlattenException::create($e);
        $trace = $flattened->getTrace();

        $this->assertFalse($c->hasException());

        $c->collect(new Request(), new Response(),$e);

        $this->assertTrue($c->hasException());
        $this->assertEquals($flattened,$c->getException());
        $this->assertSame('foo',$c->getMessage());
        $this->assertSame(500,$c->getCode());
        $this->assertSame('exception',$c->getName());
        $this->assertSame($trace,$c->getTrace());
    }

}
PK�a�\bҏ�^^apear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/MemoryDataCollectorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\DataCollector;

use Symfony\Component\HttpKernel\DataCollector\MemoryDataCollector;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class MemoryDataCollectorTest extends \PHPUnit_Framework_TestCase
{
    public function testCollect()
    {
        $collector = new MemoryDataCollector();
        $collector->collect(new Request(), new Response());

        $this->assertInternalType('integer', $collector->getMemory());
        $this->assertInternalType('integer', $collector->getMemoryLimit());
        $this->assertSame('memory', $collector->getName());
    }

    /** @dataProvider getBytesConversionTestData */
    public function testBytesConversion($limit, $bytes)
    {
        $collector = new MemoryDataCollector();
        $method = new \ReflectionMethod($collector, 'convertToBytes');
        $method->setAccessible(true);
        $this->assertEquals($bytes, $method->invoke($collector, $limit));
    }

    public function getBytesConversionTestData()
    {
        return array(
            array('2k', 2048),
            array('2 k', 2048),
            array('8m', 8 * 1024 * 1024),
            array('+2 k', 2048),
            array('+2???k', 2048),
            array('0x10', 16),
            array('0xf', 15),
            array('010', 8),
            array('+0x10 k', 16 * 1024),
            array('1g', 1024 * 1024 * 1024),
            array('1G', 1024 * 1024 * 1024),
            array('-1', -1),
            array('0', 0),
            array('2mk', 2048), // the unit must be the last char, so in this case 'k', not 'm'
        );
    }
}
PK�a�\�C���_pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/TimeDataCollectorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\DataCollector;

use Symfony\Component\HttpKernel\DataCollector\TimeDataCollector;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class TimeDataCollectorTest extends \PHPUnit_Framework_TestCase
{
    public function testCollect()
    {
        $c = new TimeDataCollector();

        $request = new Request();
        $request->server->set('REQUEST_TIME', 1);

        $c->collect($request, new Response());

        $this->assertEquals(1000, $c->getStartTime());

        $request->server->set('REQUEST_TIME_FLOAT', 2);

        $c->collect($request, new Response());

        $this->assertEquals(2000, $c->getStartTime());

        $request = new Request();
        $c->collect($request, new Response());
        $this->assertEquals(0, $c->getStartTime());

        $kernel = $this->getMock('Symfony\Component\HttpKernel\KernelInterface');
        $kernel->expects($this->once())->method('getStartTime')->will($this->returnValue(123456));

        $c = new TimeDataCollector($kernel);
        $request = new Request();
        $request->server->set('REQUEST_TIME', 1);

        $c->collect($request, new Response());
        $this->assertEquals(123456000, $c->getStartTime());
    }
}
PK�a�\���i	i	apear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/DataCollector/LoggerDataCollectorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\DataCollector;

use Symfony\Component\HttpKernel\DataCollector\LoggerDataCollector;
use Symfony\Component\HttpKernel\Debug\ErrorHandler;

class LoggerDataCollectorTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getCollectTestData
     */
    public function testCollect($nb, $logs, $expectedLogs, $expectedDeprecationCount)
    {
        $logger = $this->getMock('Symfony\Component\HttpKernel\Log\DebugLoggerInterface');
        $logger->expects($this->once())->method('countErrors')->will($this->returnValue($nb));
        $logger->expects($this->exactly(2))->method('getLogs')->will($this->returnValue($logs));

        $c = new LoggerDataCollector($logger);
        $c->lateCollect();

        $this->assertSame('logger', $c->getName());
        $this->assertSame($nb, $c->countErrors());
        $this->assertSame($expectedLogs ? $expectedLogs : $logs, $c->getLogs());
        $this->assertSame($expectedDeprecationCount, $c->countDeprecations());
    }

    public function getCollectTestData()
    {
        return array(
            array(
                1,
                array(array('message' => 'foo', 'context' => array())),
                null,
                0
            ),
            array(
                1,
                array(array('message' => 'foo', 'context' => array('foo' => fopen(__FILE__, 'r')))),
                array(array('message' => 'foo', 'context' => array('foo' => 'Resource(stream)'))),
                0
            ),
            array(
                1,
                array(array('message' => 'foo', 'context' => array('foo' => new \stdClass()))),
                array(array('message' => 'foo', 'context' => array('foo' => 'Object(stdClass)'))),
                0
            ),
            array(
                1,
                array(
                    array('message' => 'foo', 'context' => array('type' => ErrorHandler::TYPE_DEPRECATION)),
                    array('message' => 'foo2', 'context' => array('type' => ErrorHandler::TYPE_DEPRECATION))
                ),
                null,
                2
            ),
        );
    }
}
PK�a�\q��Fpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/ClientTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests;

use Symfony\Component\HttpKernel\Client;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpKernel\Tests\Fixtures\TestClient;

class ClientTest extends \PHPUnit_Framework_TestCase
{
    public function testDoRequest()
    {
        $client = new Client(new TestHttpKernel());

        $client->request('GET', '/');
        $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->doRequest() uses the request handler to make the request');
        $this->assertInstanceOf('Symfony\Component\BrowserKit\Request', $client->getInternalRequest());
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\Request', $client->getRequest());
        $this->assertInstanceOf('Symfony\Component\BrowserKit\Response', $client->getInternalResponse());
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $client->getResponse());

        $client->request('GET', 'http://www.example.com/');
        $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->doRequest() uses the request handler to make the request');
        $this->assertEquals('www.example.com', $client->getRequest()->getHost(), '->doRequest() uses the request handler to make the request');

        $client->request('GET', 'http://www.example.com/?parameter=http://google.com');
        $this->assertEquals('http://www.example.com/?parameter='.urlencode('http://google.com'), $client->getRequest()->getUri(), '->doRequest() uses the request handler to make the request');
    }

    public function testGetScript()
    {
        $client = new TestClient(new TestHttpKernel());
        $client->insulate();
        $client->request('GET', '/');

        $this->assertEquals('Request: /', $client->getResponse()->getContent(), '->getScript() returns a script that uses the request handler to make the request');
    }

    public function testFilterResponseConvertsCookies()
    {
        $client = new Client(new TestHttpKernel());

        $r = new \ReflectionObject($client);
        $m = $r->getMethod('filterResponse');
        $m->setAccessible(true);

        $expected = array(
            'foo=bar; expires=Sun, 15 Feb 2009 20:00:00 GMT; domain=http://example.com; path=/foo; secure; httponly',
            'foo1=bar1; expires=Sun, 15 Feb 2009 20:00:00 GMT; domain=http://example.com; path=/foo; secure; httponly'
        );

        $response = new Response();
        $response->headers->setCookie(new Cookie('foo', 'bar', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true));
        $domResponse = $m->invoke($client, $response);
        $this->assertEquals($expected[0], $domResponse->getHeader('Set-Cookie'));

        $response = new Response();
        $response->headers->setCookie(new Cookie('foo', 'bar', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true));
        $response->headers->setCookie(new Cookie('foo1', 'bar1', \DateTime::createFromFormat('j-M-Y H:i:s T', '15-Feb-2009 20:00:00 GMT')->format('U'), '/foo', 'http://example.com', true, true));
        $domResponse = $m->invoke($client, $response);
        $this->assertEquals($expected[0], $domResponse->getHeader('Set-Cookie'));
        $this->assertEquals($expected, $domResponse->getHeader('Set-Cookie', false));
    }

    public function testFilterResponseSupportsStreamedResponses()
    {
        $client = new Client(new TestHttpKernel());

        $r = new \ReflectionObject($client);
        $m = $r->getMethod('filterResponse');
        $m->setAccessible(true);

        $response = new StreamedResponse(function () {
            echo 'foo';
        });

        $domResponse = $m->invoke($client, $response);
        $this->assertEquals('foo', $domResponse->getContent());
    }

    public function testUploadedFile()
    {
        $source = tempnam(sys_get_temp_dir(), 'source');
        $target = sys_get_temp_dir().'/sf.moved.file';
        @unlink($target);

        $kernel = new TestHttpKernel();
        $client = new Client($kernel);

        $files = array(
            array('tmp_name' => $source, 'name' => 'original', 'type' => 'mime/original', 'size' => 123, 'error' => UPLOAD_ERR_OK),
            new UploadedFile($source, 'original', 'mime/original', 123, UPLOAD_ERR_OK, true),
        );

        $file = null;
        foreach ($files as $file) {
            $client->request('POST', '/', array(), array('foo' => $file));

            $files = $client->getRequest()->files->all();

            $this->assertCount(1, $files);

            $file = $files['foo'];

            $this->assertEquals('original', $file->getClientOriginalName());
            $this->assertEquals('mime/original', $file->getClientMimeType());
            $this->assertEquals('123', $file->getClientSize());
            $this->assertTrue($file->isValid());
        }

        $file->move(dirname($target), basename($target));

        $this->assertFileExists($target);
        unlink($target);
    }

    public function testUploadedFileWhenSizeExceedsUploadMaxFileSize()
    {
        $source = tempnam(sys_get_temp_dir(), 'source');

        $kernel = new TestHttpKernel();
        $client = new Client($kernel);

        $file = $this
            ->getMockBuilder('Symfony\Component\HttpFoundation\File\UploadedFile')
            ->setConstructorArgs(array($source, 'original', 'mime/original', 123, UPLOAD_ERR_OK, true))
            ->setMethods(array('getSize'))
            ->getMock()
        ;

        $file->expects($this->once())
            ->method('getSize')
            ->will($this->returnValue(INF))
        ;

        $client->request('POST', '/', array(), array($file));

        $files = $client->getRequest()->files->all();

        $this->assertCount(1, $files);

        $file = $files[0];

        $this->assertFalse($file->isValid());
        $this->assertEquals(UPLOAD_ERR_INI_SIZE, $file->getError());
        $this->assertEquals('mime/original', $file->getClientMimeType());
        $this->assertEquals('original', $file->getClientOriginalName());
        $this->assertEquals(0, $file->getClientSize());

        unlink($source);
    }
}
PK�a�\���JJ\pear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/TestMultipleHttpKernel.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\HttpCache;

use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;

class TestMultipleHttpKernel extends HttpKernel implements ControllerResolverInterface
{
    protected $bodies = array();
    protected $statuses = array();
    protected $headers = array();
    protected $call = false;
    protected $backendRequest;

    public function __construct($responses)
    {
        foreach ($responses as $response) {
            $this->bodies[]   = $response['body'];
            $this->statuses[] = $response['status'];
            $this->headers[]  = $response['headers'];
        }

        parent::__construct(new EventDispatcher(), $this);
    }

    public function getBackendRequest()
    {
        return $this->backendRequest;
    }

    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = false)
    {
        $this->backendRequest = $request;

        return parent::handle($request, $type, $catch);
    }

    public function getController(Request $request)
    {
        return array($this, 'callController');
    }

    public function getArguments(Request $request, $controller)
    {
        return array($request);
    }

    public function callController(Request $request)
    {
        $this->called = true;

        $response = new Response(array_shift($this->bodies), array_shift($this->statuses), array_shift($this->headers));

        return $response;
    }

    public function hasBeenCalled()
    {
        return $this->called;
    }

    public function reset()
    {
        $this->call = false;
    }
}
PK�a�\��m*����Spear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\HttpCache;

use Symfony\Component\HttpKernel\HttpCache\HttpCache;
use Symfony\Component\HttpKernel\HttpCache\StoreInterface;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class HttpCacheTest extends HttpCacheTestCase
{
    public function testTerminateDelegatesTerminationOnlyForTerminableInterface()
    {
        $storeMock = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\HttpCache\\StoreInterface')
            ->disableOriginalConstructor()
            ->getMock();

        // does not implement TerminableInterface
        $kernelMock = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\HttpKernelInterface')
            ->disableOriginalConstructor()
            ->getMock();

        $kernelMock->expects($this->never())
            ->method('terminate');

        $kernel = new HttpCache($kernelMock, $storeMock);
        $kernel->terminate(Request::create('/'), new Response());

        // implements TerminableInterface
        $kernelMock = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\Kernel')
            ->disableOriginalConstructor()
            ->setMethods(array('terminate', 'registerBundles', 'registerContainerConfiguration'))
            ->getMock();

        $kernelMock->expects($this->once())
            ->method('terminate');

        $kernel = new HttpCache($kernelMock, $storeMock);
        $kernel->terminate(Request::create('/'), new Response());
    }

    public function testPassesOnNonGetHeadRequests()
    {
        $this->setNextResponse(200);
        $this->request('POST', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertResponseOk();
        $this->assertTraceContains('pass');
        $this->assertFalse($this->response->headers->has('Age'));
    }

    public function testInvalidatesOnPostPutDeleteRequests()
    {
        foreach (array('post', 'put', 'delete') as $method) {
            $this->setNextResponse(200);
            $this->request($method, '/');

            $this->assertHttpKernelIsCalled();
            $this->assertResponseOk();
            $this->assertTraceContains('invalidate');
            $this->assertTraceContains('pass');
        }
    }

    public function testDoesNotCacheWithAuthorizationRequestHeaderAndNonPublicResponse()
    {
        $this->setNextResponse(200, array('ETag' => '"Foo"'));
        $this->request('GET', '/', array('HTTP_AUTHORIZATION' => 'basic foobarbaz'));

        $this->assertHttpKernelIsCalled();
        $this->assertResponseOk();
        $this->assertEquals('private', $this->response->headers->get('Cache-Control'));

        $this->assertTraceContains('miss');
        $this->assertTraceNotContains('store');
        $this->assertFalse($this->response->headers->has('Age'));
    }

    public function testDoesCacheWithAuthorizationRequestHeaderAndPublicResponse()
    {
        $this->setNextResponse(200, array('Cache-Control' => 'public', 'ETag' => '"Foo"'));
        $this->request('GET', '/', array('HTTP_AUTHORIZATION' => 'basic foobarbaz'));

        $this->assertHttpKernelIsCalled();
        $this->assertResponseOk();
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
        $this->assertTrue($this->response->headers->has('Age'));
        $this->assertEquals('public', $this->response->headers->get('Cache-Control'));
    }

    public function testDoesNotCacheWithCookieHeaderAndNonPublicResponse()
    {
        $this->setNextResponse(200, array('ETag' => '"Foo"'));
        $this->request('GET', '/', array(), array('foo' => 'bar'));

        $this->assertHttpKernelIsCalled();
        $this->assertResponseOk();
        $this->assertEquals('private', $this->response->headers->get('Cache-Control'));
        $this->assertTraceContains('miss');
        $this->assertTraceNotContains('store');
        $this->assertFalse($this->response->headers->has('Age'));
    }

    public function testDoesNotCacheRequestsWithACookieHeader()
    {
        $this->setNextResponse(200);
        $this->request('GET', '/', array(), array('foo' => 'bar'));

        $this->assertHttpKernelIsCalled();
        $this->assertResponseOk();
        $this->assertEquals('private', $this->response->headers->get('Cache-Control'));
        $this->assertTraceContains('miss');
        $this->assertTraceNotContains('store');
        $this->assertFalse($this->response->headers->has('Age'));
    }

    public function testRespondsWith304WhenIfModifiedSinceMatchesLastModified()
    {
        $time = new \DateTime();

        $this->setNextResponse(200, array('Cache-Control' => 'public', 'Last-Modified' => $time->format(DATE_RFC2822), 'Content-Type' => 'text/plain'), 'Hello World');
        $this->request('GET', '/', array('HTTP_IF_MODIFIED_SINCE' => $time->format(DATE_RFC2822)));

        $this->assertHttpKernelIsCalled();
        $this->assertEquals(304, $this->response->getStatusCode());
        $this->assertEquals('', $this->response->headers->get('Content-Type'));
        $this->assertEmpty($this->response->getContent());
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
    }

    public function testRespondsWith304WhenIfNoneMatchMatchesETag()
    {
        $this->setNextResponse(200, array('Cache-Control' => 'public', 'ETag' => '12345', 'Content-Type' => 'text/plain'), 'Hello World');
        $this->request('GET', '/', array('HTTP_IF_NONE_MATCH' => '12345'));

        $this->assertHttpKernelIsCalled();
        $this->assertEquals(304, $this->response->getStatusCode());
        $this->assertEquals('', $this->response->headers->get('Content-Type'));
        $this->assertTrue($this->response->headers->has('ETag'));
        $this->assertEmpty($this->response->getContent());
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
    }

    public function testRespondsWith304OnlyIfIfNoneMatchAndIfModifiedSinceBothMatch()
    {
        $time = new \DateTime();

        $this->setNextResponse(200, array(), '', function ($request, $response) use ($time) {
            $response->setStatusCode(200);
            $response->headers->set('ETag', '12345');
            $response->headers->set('Last-Modified', $time->format(DATE_RFC2822));
            $response->headers->set('Content-Type', 'text/plain');
            $response->setContent('Hello World');
        });

        // only ETag matches
        $t = \DateTime::createFromFormat('U', time() - 3600);
        $this->request('GET', '/', array('HTTP_IF_NONE_MATCH' => '12345', 'HTTP_IF_MODIFIED_SINCE' => $t->format(DATE_RFC2822)));
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());

        // only Last-Modified matches
        $this->request('GET', '/', array('HTTP_IF_NONE_MATCH' => '1234', 'HTTP_IF_MODIFIED_SINCE' => $time->format(DATE_RFC2822)));
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());

        // Both matches
        $this->request('GET', '/', array('HTTP_IF_NONE_MATCH' => '12345', 'HTTP_IF_MODIFIED_SINCE' => $time->format(DATE_RFC2822)));
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(304, $this->response->getStatusCode());
    }

    public function testValidatesPrivateResponsesCachedOnTheClient()
    {
        $this->setNextResponse(200, array(), '', function ($request, $response) {
            $etags = preg_split('/\s*,\s*/', $request->headers->get('IF_NONE_MATCH'));
            if ($request->cookies->has('authenticated')) {
                $response->headers->set('Cache-Control', 'private, no-store');
                $response->setETag('"private tag"');
                if (in_array('"private tag"', $etags)) {
                    $response->setStatusCode(304);
                } else {
                    $response->setStatusCode(200);
                    $response->headers->set('Content-Type', 'text/plain');
                    $response->setContent('private data');
                }
            } else {
                $response->headers->set('Cache-Control', 'public');
                $response->setETag('"public tag"');
                if (in_array('"public tag"', $etags)) {
                    $response->setStatusCode(304);
                } else {
                    $response->setStatusCode(200);
                    $response->headers->set('Content-Type', 'text/plain');
                    $response->setContent('public data');
                }
            }
        });

        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('"public tag"', $this->response->headers->get('ETag'));
        $this->assertEquals('public data', $this->response->getContent());
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');

        $this->request('GET', '/', array(), array('authenticated' => ''));
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('"private tag"', $this->response->headers->get('ETag'));
        $this->assertEquals('private data', $this->response->getContent());
        $this->assertTraceContains('stale');
        $this->assertTraceContains('invalid');
        $this->assertTraceNotContains('store');
    }

    public function testStoresResponsesWhenNoCacheRequestDirectivePresent()
    {
        $time = \DateTime::createFromFormat('U', time() + 5);

        $this->setNextResponse(200, array('Cache-Control' => 'public', 'Expires' => $time->format(DATE_RFC2822)));
        $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'no-cache'));

        $this->assertHttpKernelIsCalled();
        $this->assertTraceContains('store');
        $this->assertTrue($this->response->headers->has('Age'));
    }

    public function testReloadsResponsesWhenCacheHitsButNoCacheRequestDirectivePresentWhenAllowReloadIsSetTrue()
    {
        $count = 0;

        $this->setNextResponse(200, array('Cache-Control' => 'public, max-age=10000'), '', function ($request, $response) use (&$count) {
            ++$count;
            $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');
        });

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('store');

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('fresh');

        $this->cacheConfig['allow_reload'] = true;
        $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'no-cache'));
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Goodbye World', $this->response->getContent());
        $this->assertTraceContains('reload');
        $this->assertTraceContains('store');
    }

    public function testDoesNotReloadResponsesWhenAllowReloadIsSetFalseDefault()
    {
        $count = 0;

        $this->setNextResponse(200, array('Cache-Control' => 'public, max-age=10000'), '', function ($request, $response) use (&$count) {
            ++$count;
            $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');
        });

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('store');

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('fresh');

        $this->cacheConfig['allow_reload'] = false;
        $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'no-cache'));
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceNotContains('reload');

        $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'no-cache'));
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceNotContains('reload');
    }

    public function testRevalidatesFreshCacheEntryWhenMaxAgeRequestDirectiveIsExceededWhenAllowRevalidateOptionIsSetTrue()
    {
        $count = 0;

        $this->setNextResponse(200, array(), '', function ($request, $response) use (&$count) {
            ++$count;
            $response->headers->set('Cache-Control', 'public, max-age=10000');
            $response->setETag($count);
            $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');
        });

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('store');

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('fresh');

        $this->cacheConfig['allow_revalidate'] = true;
        $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'max-age=0'));
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Goodbye World', $this->response->getContent());
        $this->assertTraceContains('stale');
        $this->assertTraceContains('invalid');
        $this->assertTraceContains('store');
    }

    public function testDoesNotRevalidateFreshCacheEntryWhenEnableRevalidateOptionIsSetFalseDefault()
    {
        $count = 0;

        $this->setNextResponse(200, array(), '', function ($request, $response) use (&$count) {
            ++$count;
            $response->headers->set('Cache-Control', 'public, max-age=10000');
            $response->setETag($count);
            $response->setContent(1 == $count ? 'Hello World' : 'Goodbye World');
        });

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('store');

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('fresh');

        $this->cacheConfig['allow_revalidate'] = false;
        $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'max-age=0'));
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceNotContains('stale');
        $this->assertTraceNotContains('invalid');
        $this->assertTraceContains('fresh');

        $this->request('GET', '/', array('HTTP_CACHE_CONTROL' => 'max-age=0'));
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceNotContains('stale');
        $this->assertTraceNotContains('invalid');
        $this->assertTraceContains('fresh');
    }

    public function testFetchesResponseFromBackendWhenCacheMisses()
    {
        $time = \DateTime::createFromFormat('U', time() + 5);
        $this->setNextResponse(200, array('Cache-Control' => 'public', 'Expires' => $time->format(DATE_RFC2822)));

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertTraceContains('miss');
        $this->assertTrue($this->response->headers->has('Age'));
    }

    public function testDoesNotCacheSomeStatusCodeResponses()
    {
        foreach (array_merge(range(201, 202), range(204, 206), range(303, 305), range(400, 403), range(405, 409), range(411, 417), range(500, 505)) as $code) {
            $time = \DateTime::createFromFormat('U', time() + 5);
            $this->setNextResponse($code, array('Expires' => $time->format(DATE_RFC2822)));

            $this->request('GET', '/');
            $this->assertEquals($code, $this->response->getStatusCode());
            $this->assertTraceNotContains('store');
            $this->assertFalse($this->response->headers->has('Age'));
        }
    }

    public function testDoesNotCacheResponsesWithExplicitNoStoreDirective()
    {
        $time = \DateTime::createFromFormat('U', time() + 5);
        $this->setNextResponse(200, array('Expires' => $time->format(DATE_RFC2822), 'Cache-Control' => 'no-store'));

        $this->request('GET', '/');
        $this->assertTraceNotContains('store');
        $this->assertFalse($this->response->headers->has('Age'));
    }

    public function testDoesNotCacheResponsesWithoutFreshnessInformationOrAValidator()
    {
        $this->setNextResponse();

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertTraceNotContains('store');
    }

    public function testCachesResponsesWithExplicitNoCacheDirective()
    {
        $time = \DateTime::createFromFormat('U', time() + 5);
        $this->setNextResponse(200, array('Expires' => $time->format(DATE_RFC2822), 'Cache-Control' => 'public, no-cache'));

        $this->request('GET', '/');
        $this->assertTraceContains('store');
        $this->assertTrue($this->response->headers->has('Age'));
    }

    public function testCachesResponsesWithAnExpirationHeader()
    {
        $time = \DateTime::createFromFormat('U', time() + 5);
        $this->setNextResponse(200, array('Cache-Control' => 'public', 'Expires' => $time->format(DATE_RFC2822)));

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertNotNull($this->response->headers->get('Date'));
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');

        $values = $this->getMetaStorageValues();
        $this->assertCount(1, $values);
    }

    public function testCachesResponsesWithAMaxAgeDirective()
    {
        $this->setNextResponse(200, array('Cache-Control' => 'public, max-age=5'));

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertNotNull($this->response->headers->get('Date'));
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');

        $values = $this->getMetaStorageValues();
        $this->assertCount(1, $values);
    }

    public function testCachesResponsesWithASMaxAgeDirective()
    {
        $this->setNextResponse(200, array('Cache-Control' => 's-maxage=5'));

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertNotNull($this->response->headers->get('Date'));
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');

        $values = $this->getMetaStorageValues();
        $this->assertCount(1, $values);
    }

    public function testCachesResponsesWithALastModifiedValidatorButNoFreshnessInformation()
    {
        $time = \DateTime::createFromFormat('U', time());
        $this->setNextResponse(200, array('Cache-Control' => 'public', 'Last-Modified' => $time->format(DATE_RFC2822)));

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
    }

    public function testCachesResponsesWithAnETagValidatorButNoFreshnessInformation()
    {
        $this->setNextResponse(200, array('Cache-Control' => 'public', 'ETag' => '"123456"'));

        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
    }

    public function testHitsCachedResponsesWithExpiresHeader()
    {
        $time1 = \DateTime::createFromFormat('U', time() - 5);
        $time2 = \DateTime::createFromFormat('U', time() + 5);
        $this->setNextResponse(200, array('Cache-Control' => 'public', 'Date' => $time1->format(DATE_RFC2822), 'Expires' => $time2->format(DATE_RFC2822)));

        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertNotNull($this->response->headers->get('Date'));
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
        $this->assertEquals('Hello World', $this->response->getContent());

        $this->request('GET', '/');
        $this->assertHttpKernelIsNotCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertTrue(strtotime($this->responses[0]->headers->get('Date')) - strtotime($this->response->headers->get('Date')) < 2);
        $this->assertTrue($this->response->headers->get('Age') > 0);
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertTraceContains('fresh');
        $this->assertTraceNotContains('store');
        $this->assertEquals('Hello World', $this->response->getContent());
    }

    public function testHitsCachedResponseWithMaxAgeDirective()
    {
        $time = \DateTime::createFromFormat('U', time() - 5);
        $this->setNextResponse(200, array('Date' => $time->format(DATE_RFC2822), 'Cache-Control' => 'public, max-age=10'));

        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertNotNull($this->response->headers->get('Date'));
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
        $this->assertEquals('Hello World', $this->response->getContent());

        $this->request('GET', '/');
        $this->assertHttpKernelIsNotCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertTrue(strtotime($this->responses[0]->headers->get('Date')) - strtotime($this->response->headers->get('Date')) < 2);
        $this->assertTrue($this->response->headers->get('Age') > 0);
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertTraceContains('fresh');
        $this->assertTraceNotContains('store');
        $this->assertEquals('Hello World', $this->response->getContent());
    }

    public function testHitsCachedResponseWithSMaxAgeDirective()
    {
        $time = \DateTime::createFromFormat('U', time() - 5);
        $this->setNextResponse(200, array('Date' => $time->format(DATE_RFC2822), 'Cache-Control' => 's-maxage=10, max-age=0'));

        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertNotNull($this->response->headers->get('Date'));
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
        $this->assertEquals('Hello World', $this->response->getContent());

        $this->request('GET', '/');
        $this->assertHttpKernelIsNotCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertTrue(strtotime($this->responses[0]->headers->get('Date')) - strtotime($this->response->headers->get('Date')) < 2);
        $this->assertTrue($this->response->headers->get('Age') > 0);
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertTraceContains('fresh');
        $this->assertTraceNotContains('store');
        $this->assertEquals('Hello World', $this->response->getContent());
    }

    public function testAssignsDefaultTtlWhenResponseHasNoFreshnessInformation()
    {
        $this->setNextResponse();

        $this->cacheConfig['default_ttl'] = 10;
        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertRegExp('/s-maxage=10/', $this->response->headers->get('Cache-Control'));

        $this->cacheConfig['default_ttl'] = 10;
        $this->request('GET', '/');
        $this->assertHttpKernelIsNotCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertTraceContains('fresh');
        $this->assertTraceNotContains('store');
        $this->assertEquals('Hello World', $this->response->getContent());
    }

    public function testDoesNotAssignDefaultTtlWhenResponseHasMustRevalidateDirective()
    {
        $this->setNextResponse(200, array('Cache-Control' => 'must-revalidate'));

        $this->cacheConfig['default_ttl'] = 10;
        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertTraceContains('miss');
        $this->assertTraceNotContains('store');
        $this->assertNotRegExp('/s-maxage/', $this->response->headers->get('Cache-Control'));
        $this->assertEquals('Hello World', $this->response->getContent());
    }

    public function testFetchesFullResponseWhenCacheStaleAndNoValidatorsPresent()
    {
        $time = \DateTime::createFromFormat('U', time() + 5);
        $this->setNextResponse(200, array('Cache-Control' => 'public', 'Expires' => $time->format(DATE_RFC2822)));

        // build initial request
        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertNotNull($this->response->headers->get('Date'));
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertNotNull($this->response->headers->get('Age'));
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
        $this->assertEquals('Hello World', $this->response->getContent());

        # go in and play around with the cached metadata directly ...
        $values = $this->getMetaStorageValues();
        $this->assertCount(1, $values);
        $tmp = unserialize($values[0]);
        $time = \DateTime::createFromFormat('U', time());
        $tmp[0][1]['expires'] = $time->format(DATE_RFC2822);
        $r = new \ReflectionObject($this->store);
        $m = $r->getMethod('save');
        $m->setAccessible(true);
        $m->invoke($this->store, 'md'.hash('sha256', 'http://localhost/'), serialize($tmp));

        // build subsequent request; should be found but miss due to freshness
        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertTrue($this->response->headers->get('Age') <= 1);
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertTraceContains('stale');
        $this->assertTraceNotContains('fresh');
        $this->assertTraceNotContains('miss');
        $this->assertTraceContains('store');
        $this->assertEquals('Hello World', $this->response->getContent());
    }

    public function testValidatesCachedResponsesWithLastModifiedAndNoFreshnessInformation()
    {
        $time = \DateTime::createFromFormat('U', time());
        $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) use ($time) {
            $response->headers->set('Cache-Control', 'public');
            $response->headers->set('Last-Modified', $time->format(DATE_RFC2822));
            if ($time->format(DATE_RFC2822) == $request->headers->get('IF_MODIFIED_SINCE')) {
                $response->setStatusCode(304);
                $response->setContent('');
            }
        });

        // build initial request
        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertNotNull($this->response->headers->get('Last-Modified'));
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
        $this->assertTraceNotContains('stale');

        // build subsequent request; should be found but miss due to freshness
        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertNotNull($this->response->headers->get('Last-Modified'));
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertTrue($this->response->headers->get('Age') <= 1);
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('stale');
        $this->assertTraceContains('valid');
        $this->assertTraceContains('store');
        $this->assertTraceNotContains('miss');
    }

    public function testValidatesCachedResponsesWithETagAndNoFreshnessInformation()
    {
        $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) {
            $response->headers->set('Cache-Control', 'public');
            $response->headers->set('ETag', '"12345"');
            if ($response->getETag() == $request->headers->get('IF_NONE_MATCH')) {
                $response->setStatusCode(304);
                $response->setContent('');
            }
        });

        // build initial request
        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertNotNull($this->response->headers->get('ETag'));
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');

        // build subsequent request; should be found but miss due to freshness
        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertNotNull($this->response->headers->get('ETag'));
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $this->assertTrue($this->response->headers->get('Age') <= 1);
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('stale');
        $this->assertTraceContains('valid');
        $this->assertTraceContains('store');
        $this->assertTraceNotContains('miss');
    }

    public function testReplacesCachedResponsesWhenValidationResultsInNon304Response()
    {
        $time = \DateTime::createFromFormat('U', time());
        $count = 0;
        $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) use ($time, &$count) {
            $response->headers->set('Last-Modified', $time->format(DATE_RFC2822));
            $response->headers->set('Cache-Control', 'public');
            switch (++$count) {
                case 1:
                    $response->setContent('first response');
                    break;
                case 2:
                    $response->setContent('second response');
                    break;
                case 3:
                    $response->setContent('');
                    $response->setStatusCode(304);
                    break;
            }
        });

        // first request should fetch from backend and store in cache
        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('first response', $this->response->getContent());

        // second request is validated, is invalid, and replaces cached entry
        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('second response', $this->response->getContent());

        // third response is validated, valid, and returns cached entry
        $this->request('GET', '/');
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('second response', $this->response->getContent());

        $this->assertEquals(3, $count);
    }

    public function testPassesHeadRequestsThroughDirectlyOnPass()
    {
        $that = $this;
        $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) use ($that) {
            $response->setContent('');
            $response->setStatusCode(200);
            $that->assertEquals('HEAD', $request->getMethod());
        });

        $this->request('HEAD', '/', array('HTTP_EXPECT' => 'something ...'));
        $this->assertHttpKernelIsCalled();
        $this->assertEquals('', $this->response->getContent());
    }

    public function testUsesCacheToRespondToHeadRequestsWhenFresh()
    {
        $that = $this;
        $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) use ($that) {
            $response->headers->set('Cache-Control', 'public, max-age=10');
            $response->setContent('Hello World');
            $response->setStatusCode(200);
            $that->assertNotEquals('HEAD', $request->getMethod());
        });

        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals('Hello World', $this->response->getContent());

        $this->request('HEAD', '/');
        $this->assertHttpKernelIsNotCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('', $this->response->getContent());
        $this->assertEquals(strlen('Hello World'), $this->response->headers->get('Content-Length'));
    }

    public function testSendsNoContentWhenFresh()
    {
        $time = \DateTime::createFromFormat('U', time());
        $that = $this;
        $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) use ($that, $time) {
            $response->headers->set('Cache-Control', 'public, max-age=10');
            $response->headers->set('Last-Modified', $time->format(DATE_RFC2822));
        });

        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals('Hello World', $this->response->getContent());

        $this->request('GET', '/', array('HTTP_IF_MODIFIED_SINCE' => $time->format(DATE_RFC2822)));
        $this->assertHttpKernelIsNotCalled();
        $this->assertEquals(304, $this->response->getStatusCode());
        $this->assertEquals('', $this->response->getContent());
    }

    public function testInvalidatesCachedResponsesOnPost()
    {
        $this->setNextResponse(200, array(), 'Hello World', function ($request, $response) {
            if ('GET' == $request->getMethod()) {
                $response->setStatusCode(200);
                $response->headers->set('Cache-Control', 'public, max-age=500');
                $response->setContent('Hello World');
            } elseif ('POST' == $request->getMethod()) {
                $response->setStatusCode(303);
                $response->headers->set('Location', '/');
                $response->headers->remove('Cache-Control');
                $response->setContent('');
            }
        });

        // build initial request to enter into the cache
        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');

        // make sure it is valid
        $this->request('GET', '/');
        $this->assertHttpKernelIsNotCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('fresh');

        // now POST to same URL
        $this->request('POST', '/helloworld');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals('/', $this->response->headers->get('Location'));
        $this->assertTraceContains('invalidate');
        $this->assertTraceContains('pass');
        $this->assertEquals('', $this->response->getContent());

        // now make sure it was actually invalidated
        $this->request('GET', '/');
        $this->assertHttpKernelIsCalled();
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Hello World', $this->response->getContent());
        $this->assertTraceContains('stale');
        $this->assertTraceContains('invalid');
        $this->assertTraceContains('store');
    }

    public function testServesFromCacheWhenHeadersMatch()
    {
        $count = 0;
        $this->setNextResponse(200, array('Cache-Control' => 'max-age=10000'), '', function ($request, $response) use (&$count) {
            $response->headers->set('Vary', 'Accept User-Agent Foo');
            $response->headers->set('Cache-Control', 'public, max-age=10');
            $response->headers->set('X-Response-Count', ++$count);
            $response->setContent($request->headers->get('USER_AGENT'));
        });

        $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/1.0'));
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Bob/1.0', $this->response->getContent());
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');

        $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/1.0'));
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Bob/1.0', $this->response->getContent());
        $this->assertTraceContains('fresh');
        $this->assertTraceNotContains('store');
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
    }

    public function testStoresMultipleResponsesWhenHeadersDiffer()
    {
        $count = 0;
        $this->setNextResponse(200, array('Cache-Control' => 'max-age=10000'), '', function ($request, $response) use (&$count) {
            $response->headers->set('Vary', 'Accept User-Agent Foo');
            $response->headers->set('Cache-Control', 'public, max-age=10');
            $response->headers->set('X-Response-Count', ++$count);
            $response->setContent($request->headers->get('USER_AGENT'));
        });

        $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/1.0'));
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertEquals('Bob/1.0', $this->response->getContent());
        $this->assertEquals(1, $this->response->headers->get('X-Response-Count'));

        $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/2.0'));
        $this->assertEquals(200, $this->response->getStatusCode());
        $this->assertTraceContains('miss');
        $this->assertTraceContains('store');
        $this->assertEquals('Bob/2.0', $this->response->getContent());
        $this->assertEquals(2, $this->response->headers->get('X-Response-Count'));

        $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/1.0'));
        $this->assertTraceContains('fresh');
        $this->assertEquals('Bob/1.0', $this->response->getContent());
        $this->assertEquals(1, $this->response->headers->get('X-Response-Count'));

        $this->request('GET', '/', array('HTTP_ACCEPT' => 'text/html', 'HTTP_USER_AGENT' => 'Bob/2.0'));
        $this->assertTraceContains('fresh');
        $this->assertEquals('Bob/2.0', $this->response->getContent());
        $this->assertEquals(2, $this->response->headers->get('X-Response-Count'));

        $this->request('GET', '/', array('HTTP_USER_AGENT' => 'Bob/2.0'));
        $this->assertTraceContains('miss');
        $this->assertEquals('Bob/2.0', $this->response->getContent());
        $this->assertEquals(3, $this->response->headers->get('X-Response-Count'));
    }

    public function testShouldCatchExceptions()
    {
        $this->catchExceptions();

        $this->setNextResponse();
        $this->request('GET', '/');

        $this->assertExceptionsAreCaught();
    }

    public function testShouldCatchExceptionsWhenReloadingAndNoCacheRequest()
    {
        $this->catchExceptions();

        $this->setNextResponse();
        $this->cacheConfig['allow_reload'] = true;
        $this->request('GET', '/', array(), array(), false, array('Pragma' => 'no-cache'));

        $this->assertExceptionsAreCaught();
    }

    public function testShouldNotCatchExceptions()
    {
        $this->catchExceptions(false);

        $this->setNextResponse();
        $this->request('GET', '/');

        $this->assertExceptionsAreNotCaught();
    }

    public function testEsiCacheSendsTheLowestTtl()
    {
        $responses = array(
            array(
                'status'  => 200,
                'body'    => '<esi:include src="/foo" /> <esi:include src="/bar" />',
                'headers' => array(
                    'Cache-Control'     => 's-maxage=300',
                    'Surrogate-Control' => 'content="ESI/1.0"',
                ),
            ),
            array(
                'status'  => 200,
                'body'    => 'Hello World!',
                'headers' => array('Cache-Control' => 's-maxage=300'),
            ),
            array(
                'status'  => 200,
                'body'    => 'My name is Bobby.',
                'headers' => array('Cache-Control' => 's-maxage=100'),
            ),
        );

        $this->setNextResponses($responses);

        $this->request('GET', '/', array(), array(), true);
        $this->assertEquals("Hello World! My name is Bobby.", $this->response->getContent());

        // check for 100 or 99 as the test can be executed after a second change
        $this->assertTrue(in_array($this->response->getTtl(), array(99, 100)));
    }

    public function testEsiCacheForceValidation()
    {
        $responses = array(
            array(
                'status'  => 200,
                'body'    => '<esi:include src="/foo" /> <esi:include src="/bar" />',
                'headers' => array(
                    'Cache-Control'     => 's-maxage=300',
                    'Surrogate-Control' => 'content="ESI/1.0"',
                ),
            ),
            array(
                'status'  => 200,
                'body'    => 'Hello World!',
                'headers' => array('ETag' => 'foobar'),
            ),
            array(
                'status'  => 200,
                'body'    => 'My name is Bobby.',
                'headers' => array('Cache-Control' => 's-maxage=100'),
            ),
        );

        $this->setNextResponses($responses);

        $this->request('GET', '/', array(), array(), true);
        $this->assertEquals('Hello World! My name is Bobby.', $this->response->getContent());
        $this->assertNull($this->response->getTtl());
        $this->assertTrue($this->response->mustRevalidate());
        $this->assertTrue($this->response->headers->hasCacheControlDirective('private'));
        $this->assertTrue($this->response->headers->hasCacheControlDirective('no-cache'));
    }

    public function testEsiRecalculateContentLengthHeader()
    {
        $responses = array(
            array(
                'status'  => 200,
                'body'    => '<esi:include src="/foo" />',
                'headers' => array(
                    'Content-Length'    => 26,
                    'Cache-Control'     => 's-maxage=300',
                    'Surrogate-Control' => 'content="ESI/1.0"',
                ),
            ),
            array(
                'status'  => 200,
                'body'    => 'Hello World!',
                'headers' => array(),
            ),
        );

        $this->setNextResponses($responses);

        $this->request('GET', '/', array(), array(), true);
        $this->assertEquals('Hello World!', $this->response->getContent());
        $this->assertEquals(12, $this->response->headers->get('Content-Length'));
    }

    public function testClientIpIsAlwaysLocalhostForForwardedRequests()
    {
        $this->setNextResponse();
        $this->request('GET', '/', array('REMOTE_ADDR' => '10.0.0.1'));

        $this->assertEquals('127.0.0.1', $this->kernel->getBackendRequest()->server->get('REMOTE_ADDR'));
    }

    /**
     * @dataProvider getXForwardedForData
     */
    public function testXForwarderForHeaderForForwardedRequests($xForwardedFor, $expected)
    {
        $this->setNextResponse();
        $server = array('REMOTE_ADDR' => '10.0.0.1');
        if (false !== $xForwardedFor) {
            $server['HTTP_X_FORWARDED_FOR'] = $xForwardedFor;
        }
        $this->request('GET', '/', $server);

        $this->assertEquals($expected, $this->kernel->getBackendRequest()->headers->get('X-Forwarded-For'));
    }

    public function getXForwardedForData()
    {
        return array(
            array(false, '10.0.0.1'),
            array('10.0.0.2', '10.0.0.2, 10.0.0.1'),
            array('10.0.0.2, 10.0.0.3', '10.0.0.2, 10.0.0.3, 10.0.0.1'),
        );
    }

    public function testXForwarderForHeaderForPassRequests()
    {
        $this->setNextResponse();
        $server = array('REMOTE_ADDR' => '10.0.0.1');
        $this->request('POST', '/', $server);

        $this->assertEquals('10.0.0.1', $this->kernel->getBackendRequest()->headers->get('X-Forwarded-For'));
    }

    public function testEsiCacheRemoveValidationHeadersIfEmbeddedResponses()
    {
        $time = new \DateTime;

        $responses = array(
            array(
                'status'  => 200,
                'body'    => '<esi:include src="/hey" />',
                'headers' => array(
                    'Surrogate-Control' => 'content="ESI/1.0"',
                    'ETag' => 'hey',
                    'Last-Modified' => $time->format(DATE_RFC2822),
                ),
            ),
            array(
                'status'  => 200,
                'body'    => 'Hey!',
                'headers' => array(),
            ),
        );

        $this->setNextResponses($responses);

        $this->request('GET', '/', array(), array(), true);
        $this->assertNull($this->response->getETag());
        $this->assertNull($this->response->getLastModified());
    }
}
PK�a�\�VPWpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/HttpCacheTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpCache\Esi;
use Symfony\Component\HttpKernel\HttpCache\HttpCache;
use Symfony\Component\HttpKernel\HttpCache\Store;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class HttpCacheTestCase extends \PHPUnit_Framework_TestCase
{
    protected $kernel;
    protected $cache;
    protected $caches;
    protected $cacheConfig;
    protected $request;
    protected $response;
    protected $responses;
    protected $catch;
    protected $esi;

    protected function setUp()
    {
        $this->kernel = null;

        $this->cache = null;
        $this->esi = null;
        $this->caches = array();
        $this->cacheConfig = array();

        $this->request = null;
        $this->response = null;
        $this->responses = array();

        $this->catch = false;

        $this->clearDirectory(sys_get_temp_dir().'/http_cache');
    }

    protected function tearDown()
    {
        $this->kernel = null;
        $this->cache = null;
        $this->caches = null;
        $this->request = null;
        $this->response = null;
        $this->responses = null;
        $this->cacheConfig = null;
        $this->catch = null;
        $this->esi = null;

        $this->clearDirectory(sys_get_temp_dir().'/http_cache');
    }

    public function assertHttpKernelIsCalled()
    {
        $this->assertTrue($this->kernel->hasBeenCalled());
    }

    public function assertHttpKernelIsNotCalled()
    {
        $this->assertFalse($this->kernel->hasBeenCalled());
    }

    public function assertResponseOk()
    {
        $this->assertEquals(200, $this->response->getStatusCode());
    }

    public function assertTraceContains($trace)
    {
        $traces = $this->cache->getTraces();
        $traces = current($traces);

        $this->assertRegExp('/'.$trace.'/', implode(', ', $traces));
    }

    public function assertTraceNotContains($trace)
    {
        $traces = $this->cache->getTraces();
        $traces = current($traces);

        $this->assertNotRegExp('/'.$trace.'/', implode(', ', $traces));
    }

    public function assertExceptionsAreCaught()
    {
        $this->assertTrue($this->kernel->isCatchingExceptions());
    }

    public function assertExceptionsAreNotCaught()
    {
        $this->assertFalse($this->kernel->isCatchingExceptions());
    }

    public function request($method, $uri = '/', $server = array(), $cookies = array(), $esi = false, $headers = array())
    {
        if (null === $this->kernel) {
            throw new \LogicException('You must call setNextResponse() before calling request().');
        }

        $this->kernel->reset();

        $this->store = new Store(sys_get_temp_dir().'/http_cache');

        $this->cacheConfig['debug'] = true;

        $this->esi = $esi ? new Esi() : null;
        $this->cache = new HttpCache($this->kernel, $this->store, $this->esi, $this->cacheConfig);
        $this->request = Request::create($uri, $method, array(), $cookies, array(), $server);
        $this->request->headers->add($headers);

        $this->response = $this->cache->handle($this->request, HttpKernelInterface::MASTER_REQUEST, $this->catch);

        $this->responses[] = $this->response;
    }

    public function getMetaStorageValues()
    {
        $values = array();
        foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator(sys_get_temp_dir().'/http_cache/md', \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
            $values[] = file_get_contents($file);
        }

        return $values;
    }

    // A basic response with 200 status code and a tiny body.
    public function setNextResponse($statusCode = 200, array $headers = array(), $body = 'Hello World', \Closure $customizer = null)
    {
        $this->kernel = new TestHttpKernel($body, $statusCode, $headers, $customizer);
    }

    public function setNextResponses($responses)
    {
        $this->kernel = new TestMultipleHttpKernel($responses);
    }

    public function catchExceptions($catch = true)
    {
        $this->catch = $catch;
    }

    public static function clearDirectory($directory)
    {
        if (!is_dir($directory)) {
            return;
        }

        $fp = opendir($directory);
        while (false !== $file = readdir($fp)) {
            if (!in_array($file, array('.', '..'))) {
                if (is_link($directory.'/'.$file)) {
                    unlink($directory.'/'.$file);
                } elseif (is_dir($directory.'/'.$file)) {
                    self::clearDirectory($directory.'/'.$file);
                    rmdir($directory.'/'.$file);
                } else {
                    unlink($directory.'/'.$file);
                }
            }
        }

        closedir($fp);
    }
}
PK�a�\����Z&Z&Opear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/StoreTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\HttpCache;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpCache\Store;

class StoreTest extends \PHPUnit_Framework_TestCase
{
    protected $request;
    protected $response;
    protected $store;

    protected function setUp()
    {
        $this->request = Request::create('/');
        $this->response = new Response('hello world', 200, array());

        HttpCacheTestCase::clearDirectory(sys_get_temp_dir().'/http_cache');

        $this->store = new Store(sys_get_temp_dir().'/http_cache');
    }

    protected function tearDown()
    {
        $this->store = null;
        $this->request = null;
        $this->response = null;

        HttpCacheTestCase::clearDirectory(sys_get_temp_dir().'/http_cache');
    }

    public function testReadsAnEmptyArrayWithReadWhenNothingCachedAtKey()
    {
        $this->assertEmpty($this->getStoreMetadata('/nothing'));
    }

    public function testUnlockFileThatDoesExist()
    {
        $cacheKey = $this->storeSimpleEntry();
        $this->store->lock($this->request);

        $this->assertTrue($this->store->unlock($this->request));
    }

    public function testUnlockFileThatDoesNotExist()
    {
        $this->assertFalse($this->store->unlock($this->request));
    }

    public function testRemovesEntriesForKeyWithPurge()
    {
        $request = Request::create('/foo');
        $this->store->write($request, new Response('foo'));

        $metadata = $this->getStoreMetadata($request);
        $this->assertNotEmpty($metadata);

        $this->assertTrue($this->store->purge('/foo'));
        $this->assertEmpty($this->getStoreMetadata($request));

        // cached content should be kept after purging
        $path = $this->store->getPath($metadata[0][1]['x-content-digest'][0]);
        $this->assertTrue(is_file($path));

        $this->assertFalse($this->store->purge('/bar'));
    }

    public function testStoresACacheEntry()
    {
        $cacheKey = $this->storeSimpleEntry();

        $this->assertNotEmpty($this->getStoreMetadata($cacheKey));
    }

    public function testSetsTheXContentDigestResponseHeaderBeforeStoring()
    {
        $cacheKey = $this->storeSimpleEntry();
        $entries = $this->getStoreMetadata($cacheKey);
        list ($req, $res) = $entries[0];

        $this->assertEquals('en9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', $res['x-content-digest'][0]);
    }

    public function testFindsAStoredEntryWithLookup()
    {
        $this->storeSimpleEntry();
        $response = $this->store->lookup($this->request);

        $this->assertNotNull($response);
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response);
    }

    public function testDoesNotFindAnEntryWithLookupWhenNoneExists()
    {
        $request = Request::create('/test', 'get', array(), array(), array(), array('HTTP_FOO' => 'Foo', 'HTTP_BAR' => 'Bar'));

        $this->assertNull($this->store->lookup($request));
    }

    public function testCanonizesUrlsForCacheKeys()
    {
        $this->storeSimpleEntry($path = '/test?x=y&p=q');
        $hitsReq = Request::create($path);
        $missReq = Request::create('/test?p=x');

        $this->assertNotNull($this->store->lookup($hitsReq));
        $this->assertNull($this->store->lookup($missReq));
    }

    public function testDoesNotFindAnEntryWithLookupWhenTheBodyDoesNotExist()
    {
        $this->storeSimpleEntry();
        $this->assertNotNull($this->response->headers->get('X-Content-Digest'));
        $path = $this->getStorePath($this->response->headers->get('X-Content-Digest'));
        @unlink($path);
        $this->assertNull($this->store->lookup($this->request));
    }

    public function testRestoresResponseHeadersProperlyWithLookup()
    {
        $this->storeSimpleEntry();
        $response = $this->store->lookup($this->request);

        $this->assertEquals($response->headers->all(), array_merge(array('content-length' => 4, 'x-body-file' => array($this->getStorePath($response->headers->get('X-Content-Digest')))), $this->response->headers->all()));
    }

    public function testRestoresResponseContentFromEntityStoreWithLookup()
    {
        $this->storeSimpleEntry();
        $response = $this->store->lookup($this->request);
        $this->assertEquals($this->getStorePath('en'.hash('sha256', 'test')), $response->getContent());
    }

    public function testInvalidatesMetaAndEntityStoreEntriesWithInvalidate()
    {
        $this->storeSimpleEntry();
        $this->store->invalidate($this->request);
        $response = $this->store->lookup($this->request);
        $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response);
        $this->assertFalse($response->isFresh());
    }

    public function testSucceedsQuietlyWhenInvalidateCalledWithNoMatchingEntries()
    {
        $req = Request::create('/test');
        $this->store->invalidate($req);
        $this->assertNull($this->store->lookup($this->request));
    }

    public function testDoesNotReturnEntriesThatVaryWithLookup()
    {
        $req1 = Request::create('/test', 'get', array(), array(), array(), array('HTTP_FOO' => 'Foo', 'HTTP_BAR' => 'Bar'));
        $req2 = Request::create('/test', 'get', array(), array(), array(), array('HTTP_FOO' => 'Bling', 'HTTP_BAR' => 'Bam'));
        $res = new Response('test', 200, array('Vary' => 'Foo Bar'));
        $this->store->write($req1, $res);

        $this->assertNull($this->store->lookup($req2));
    }

    public function testStoresMultipleResponsesForEachVaryCombination()
    {
        $req1 = Request::create('/test', 'get', array(), array(), array(), array('HTTP_FOO' => 'Foo', 'HTTP_BAR' => 'Bar'));
        $res1 = new Response('test 1', 200, array('Vary' => 'Foo Bar'));
        $key = $this->store->write($req1, $res1);

        $req2 = Request::create('/test', 'get', array(), array(), array(), array('HTTP_FOO' => 'Bling', 'HTTP_BAR' => 'Bam'));
        $res2 = new Response('test 2', 200, array('Vary' => 'Foo Bar'));
        $this->store->write($req2, $res2);

        $req3 = Request::create('/test', 'get', array(), array(), array(), array('HTTP_FOO' => 'Baz', 'HTTP_BAR' => 'Boom'));
        $res3 = new Response('test 3', 200, array('Vary' => 'Foo Bar'));
        $this->store->write($req3, $res3);

        $this->assertEquals($this->getStorePath('en'.hash('sha256', 'test 3')), $this->store->lookup($req3)->getContent());
        $this->assertEquals($this->getStorePath('en'.hash('sha256', 'test 2')), $this->store->lookup($req2)->getContent());
        $this->assertEquals($this->getStorePath('en'.hash('sha256', 'test 1')), $this->store->lookup($req1)->getContent());

        $this->assertCount(3, $this->getStoreMetadata($key));
    }

    public function testOverwritesNonVaryingResponseWithStore()
    {
        $req1 = Request::create('/test', 'get', array(), array(), array(), array('HTTP_FOO' => 'Foo', 'HTTP_BAR' => 'Bar'));
        $res1 = new Response('test 1', 200, array('Vary' => 'Foo Bar'));
        $key = $this->store->write($req1, $res1);
        $this->assertEquals($this->getStorePath('en'.hash('sha256', 'test 1')), $this->store->lookup($req1)->getContent());

        $req2 = Request::create('/test', 'get', array(), array(), array(), array('HTTP_FOO' => 'Bling', 'HTTP_BAR' => 'Bam'));
        $res2 = new Response('test 2', 200, array('Vary' => 'Foo Bar'));
        $this->store->write($req2, $res2);
        $this->assertEquals($this->getStorePath('en'.hash('sha256', 'test 2')), $this->store->lookup($req2)->getContent());

        $req3 = Request::create('/test', 'get', array(), array(), array(), array('HTTP_FOO' => 'Foo', 'HTTP_BAR' => 'Bar'));
        $res3 = new Response('test 3', 200, array('Vary' => 'Foo Bar'));
        $key = $this->store->write($req3, $res3);
        $this->assertEquals($this->getStorePath('en'.hash('sha256', 'test 3')), $this->store->lookup($req3)->getContent());

        $this->assertCount(2, $this->getStoreMetadata($key));
    }

    public function testLocking()
    {
        $req = Request::create('/test', 'get', array(), array(), array(), array('HTTP_FOO' => 'Foo', 'HTTP_BAR' => 'Bar'));
        $this->assertTrue($this->store->lock($req));

        $path = $this->store->lock($req);
        $this->assertTrue($this->store->isLocked($req));

        $this->store->unlock($req);
        $this->assertFalse($this->store->isLocked($req));
    }

    protected function storeSimpleEntry($path = null, $headers = array())
    {
        if (null === $path) {
            $path = '/test';
        }

        $this->request = Request::create($path, 'get', array(), array(), array(), $headers);
        $this->response = new Response('test', 200, array('Cache-Control' => 'max-age=420'));

        return $this->store->write($this->request, $this->response);
    }

    protected function getStoreMetadata($key)
    {
        $r = new \ReflectionObject($this->store);
        $m = $r->getMethod('getMetadata');
        $m->setAccessible(true);

        if ($key instanceof Request) {
            $m1 = $r->getMethod('getCacheKey');
            $m1->setAccessible(true);
            $key = $m1->invoke($this->store, $key);
        }

        return $m->invoke($this->store, $key);
    }

    protected function getStorePath($key)
    {
        $r = new \ReflectionObject($this->store);
        $m = $r->getMethod('getPath');
        $m->setAccessible(true);

        return $m->invoke($this->store, $key);
    }
}
PK�a�\`��uNNMpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/EsiTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\HttpCache;

use Symfony\Component\HttpKernel\HttpCache\Esi;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class EsiTest extends \PHPUnit_Framework_TestCase
{
    public function testHasSurrogateEsiCapability()
    {
        $esi = new Esi();

        $request = Request::create('/');
        $request->headers->set('Surrogate-Capability', 'abc="ESI/1.0"');
        $this->assertTrue($esi->hasSurrogateEsiCapability($request));

        $request = Request::create('/');
        $request->headers->set('Surrogate-Capability', 'foobar');
        $this->assertFalse($esi->hasSurrogateEsiCapability($request));

        $request = Request::create('/');
        $this->assertFalse($esi->hasSurrogateEsiCapability($request));
    }

    public function testAddSurrogateEsiCapability()
    {
        $esi = new Esi();

        $request = Request::create('/');
        $esi->addSurrogateEsiCapability($request);
        $this->assertEquals('symfony2="ESI/1.0"', $request->headers->get('Surrogate-Capability'));

        $esi->addSurrogateEsiCapability($request);
        $this->assertEquals('symfony2="ESI/1.0", symfony2="ESI/1.0"', $request->headers->get('Surrogate-Capability'));
    }

    public function testAddSurrogateControl()
    {
        $esi = new Esi();

        $response = new Response('foo <esi:include src="" />');
        $esi->addSurrogateControl($response);
        $this->assertEquals('content="ESI/1.0"', $response->headers->get('Surrogate-Control'));

        $response = new Response('foo');
        $esi->addSurrogateControl($response);
        $this->assertEquals('', $response->headers->get('Surrogate-Control'));
    }

    public function testNeedsEsiParsing()
    {
        $esi = new Esi();

        $response = new Response();
        $response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
        $this->assertTrue($esi->needsEsiParsing($response));

        $response = new Response();
        $this->assertFalse($esi->needsEsiParsing($response));
    }

    public function testRenderIncludeTag()
    {
        $esi = new Esi();

        $this->assertEquals('<esi:include src="/" onerror="continue" alt="/alt" />', $esi->renderIncludeTag('/', '/alt', true));
        $this->assertEquals('<esi:include src="/" alt="/alt" />', $esi->renderIncludeTag('/', '/alt', false));
        $this->assertEquals('<esi:include src="/" onerror="continue" />', $esi->renderIncludeTag('/'));
        $this->assertEquals('<esi:comment text="some comment" />'."\n".'<esi:include src="/" onerror="continue" alt="/alt" />', $esi->renderIncludeTag('/', '/alt', true, 'some comment'));
    }

    public function testProcessDoesNothingIfContentTypeIsNotHtml()
    {
        $esi = new Esi();

        $request = Request::create('/');
        $response = new Response();
        $response->headers->set('Content-Type', 'text/plain');
        $esi->process($request, $response);

        $this->assertFalse($response->headers->has('x-body-eval'));
    }

    public function testProcess()
    {
        $esi = new Esi();

        $request = Request::create('/');
        $response = new Response('foo <esi:comment text="some comment" /><esi:include src="..." alt="alt" onerror="continue" />');
        $esi->process($request, $response);

        $this->assertEquals('foo <?php echo $this->esi->handle($this, \'...\', \'alt\', true) ?>'."\n", $response->getContent());
        $this->assertEquals('ESI', $response->headers->get('x-body-eval'));

        $response = new Response('foo <esi:include src="..." />');
        $esi->process($request, $response);

        $this->assertEquals('foo <?php echo $this->esi->handle($this, \'...\', \'\', false) ?>'."\n", $response->getContent());

        $response = new Response('foo <esi:include src="..."></esi:include>');
        $esi->process($request, $response);

        $this->assertEquals('foo <?php echo $this->esi->handle($this, \'...\', \'\', false) ?>'."\n", $response->getContent());
    }

    public function testProcessEscapesPhpTags()
    {
        $esi = new Esi();

        $request = Request::create('/');
        $response = new Response('foo <?php die("foo"); ?><%= "lala" %>');
        $esi->process($request, $response);

        $this->assertEquals('foo <?php echo "<?"; ?>php die("foo"); ?><?php echo "<%"; ?>= "lala" %>', $response->getContent());
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testProcessWhenNoSrcInAnEsi()
    {
        $esi = new Esi();

        $request = Request::create('/');
        $response = new Response('foo <esi:include />');
        $esi->process($request, $response);
    }

    public function testProcessRemoveSurrogateControlHeader()
    {
        $esi = new Esi();

        $request = Request::create('/');
        $response = new Response('foo <esi:include src="..." />');
        $response->headers->set('Surrogate-Control', 'content="ESI/1.0"');
        $esi->process($request, $response);
        $this->assertEquals('ESI', $response->headers->get('x-body-eval'));

        $response->headers->set('Surrogate-Control', 'no-store, content="ESI/1.0"');
        $esi->process($request, $response);
        $this->assertEquals('ESI', $response->headers->get('x-body-eval'));
        $this->assertEquals('no-store', $response->headers->get('surrogate-control'));

        $response->headers->set('Surrogate-Control', 'content="ESI/1.0", no-store');
        $esi->process($request, $response);
        $this->assertEquals('ESI', $response->headers->get('x-body-eval'));
        $this->assertEquals('no-store', $response->headers->get('surrogate-control'));
    }

    public function testHandle()
    {
        $esi = new Esi();
        $cache = $this->getCache(Request::create('/'), new Response('foo'));
        $this->assertEquals('foo', $esi->handle($cache, '/', '/alt', true));
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testHandleWhenResponseIsNot200()
    {
        $esi = new Esi();
        $response = new Response('foo');
        $response->setStatusCode(404);
        $cache = $this->getCache(Request::create('/'), $response);
        $esi->handle($cache, '/', '/alt', false);
    }

    public function testHandleWhenResponseIsNot200AndErrorsAreIgnored()
    {
        $esi = new Esi();
        $response = new Response('foo');
        $response->setStatusCode(404);
        $cache = $this->getCache(Request::create('/'), $response);
        $this->assertEquals('', $esi->handle($cache, '/', '/alt', true));
    }

    public function testHandleWhenResponseIsNot200AndAltIsPresent()
    {
        $esi = new Esi();
        $response1 = new Response('foo');
        $response1->setStatusCode(404);
        $response2 = new Response('bar');
        $cache = $this->getCache(Request::create('/'), array($response1, $response2));
        $this->assertEquals('bar', $esi->handle($cache, '/', '/alt', false));
    }

    protected function getCache($request, $response)
    {
        $cache = $this->getMock('Symfony\Component\HttpKernel\HttpCache\HttpCache', array('getRequest', 'handle'), array(), '', false);
        $cache->expects($this->any())
              ->method('getRequest')
              ->will($this->returnValue($request))
        ;
        if (is_array($response)) {
            $cache->expects($this->any())
                  ->method('handle')
                  ->will(call_user_func_array(array($this, 'onConsecutiveCalls'), $response))
            ;
        } else {
            $cache->expects($this->any())
                  ->method('handle')
                  ->will($this->returnValue($response))
            ;
        }

        return $cache;
    }
}
PK�a�\�t~		Tpear/test/HttpKernel/Symfony/Component/HttpKernel/Tests/HttpCache/TestHttpKernel.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Tests\HttpCache;

use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;

class TestHttpKernel extends HttpKernel implements ControllerResolverInterface
{
    protected $body;
    protected $status;
    protected $headers;
    protected $called = false;
    protected $customizer;
    protected $catch = false;
    protected $backendRequest;

    public function __construct($body, $status, $headers, \Closure $customizer = null)
    {
        $this->body = $body;
        $this->status = $status;
        $this->headers = $headers;
        $this->customizer = $customizer;

        parent::__construct(new EventDispatcher(), $this);
    }

    public function getBackendRequest()
    {
        return $this->backendRequest;
    }

    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = false)
    {
        $this->catch = $catch;
        $this->backendRequest = $request;

        return parent::handle($request, $type, $catch);
    }

    public function isCatchingExceptions()
    {
        return $this->catch;
    }

    public function getController(Request $request)
    {
        return array($this, 'callController');
    }

    public function getArguments(Request $request, $controller)
    {
        return array($request);
    }

    public function callController(Request $request)
    {
        $this->called = true;

        $response = new Response($this->body, $this->status, $this->headers);

        if (null !== $this->customizer) {
            call_user_func($this->customizer, $request, $response);
        }

        return $response;
    }

    public function hasBeenCalled()
    {
        return $this->called;
    }

    public function reset()
    {
        $this->called = false;
    }
}
PK�a�\�MqqLpear/test/EventDispatcher/Symfony/Component/EventDispatcher/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony EventDispatcher Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�a�\YQ_AAgpear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher\Tests;

use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Scope;
use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class ContainerAwareEventDispatcherTest extends \PHPUnit_Framework_TestCase
{
    public function testAddAListenerService()
    {
        $event = new Event();

        $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');

        $service
            ->expects($this->once())
            ->method('onEvent')
            ->with($event)
        ;

        $container = new Container();
        $container->set('service.listener', $service);

        $dispatcher = new ContainerAwareEventDispatcher($container);
        $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));

        $dispatcher->dispatch('onEvent', $event);
    }

    public function testAddASubscriberService()
    {
        $event = new Event();

        $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\SubscriberService');

        $service
            ->expects($this->once())
            ->method('onEvent')
            ->with($event)
        ;

        $container = new Container();
        $container->set('service.subscriber', $service);

        $dispatcher = new ContainerAwareEventDispatcher($container);
        $dispatcher->addSubscriberService('service.subscriber', 'Symfony\Component\EventDispatcher\Tests\SubscriberService');

        $dispatcher->dispatch('onEvent', $event);
    }

    public function testPreventDuplicateListenerService()
    {
        $event = new Event();

        $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');

        $service
            ->expects($this->once())
            ->method('onEvent')
            ->with($event)
        ;

        $container = new Container();
        $container->set('service.listener', $service);

        $dispatcher = new ContainerAwareEventDispatcher($container);
        $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'), 5);
        $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'), 10);

        $dispatcher->dispatch('onEvent', $event);
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testTriggerAListenerServiceOutOfScope()
    {
        $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');

        $scope = new Scope('scope');
        $container = new Container();
        $container->addScope($scope);
        $container->enterScope('scope');

        $container->set('service.listener', $service, 'scope');

        $dispatcher = new ContainerAwareEventDispatcher($container);
        $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));

        $container->leaveScope('scope');
        $dispatcher->dispatch('onEvent');
    }

    public function testReEnteringAScope()
    {
        $event = new Event();

        $service1 = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');

        $service1
            ->expects($this->exactly(2))
            ->method('onEvent')
            ->with($event)
        ;

        $scope = new Scope('scope');
        $container = new Container();
        $container->addScope($scope);
        $container->enterScope('scope');

        $container->set('service.listener', $service1, 'scope');

        $dispatcher = new ContainerAwareEventDispatcher($container);
        $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));
        $dispatcher->dispatch('onEvent', $event);

        $service2 = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');

        $service2
            ->expects($this->once())
            ->method('onEvent')
            ->with($event)
        ;

        $container->enterScope('scope');
        $container->set('service.listener', $service2, 'scope');

        $dispatcher->dispatch('onEvent', $event);

        $container->leaveScope('scope');

        $dispatcher->dispatch('onEvent');
    }

    public function testHasListenersOnLazyLoad()
    {
        $event = new Event();

        $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');

        $container = new Container();
        $container->set('service.listener', $service);

        $dispatcher = new ContainerAwareEventDispatcher($container);
        $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));

        $event->setDispatcher($dispatcher);
        $event->setName('onEvent');

        $service
            ->expects($this->once())
            ->method('onEvent')
            ->with($event)
        ;

        $this->assertTrue($dispatcher->hasListeners());

        if ($dispatcher->hasListeners('onEvent')) {
            $dispatcher->dispatch('onEvent');
        }
    }

    public function testGetListenersOnLazyLoad()
    {
        $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');

        $container = new Container();
        $container->set('service.listener', $service);

        $dispatcher = new ContainerAwareEventDispatcher($container);
        $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));

        $listeners = $dispatcher->getListeners();

        $this->assertTrue(isset($listeners['onEvent']));

        $this->assertCount(1, $dispatcher->getListeners('onEvent'));
    }

    public function testRemoveAfterDispatch()
    {
        $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');

        $container = new Container();
        $container->set('service.listener', $service);

        $dispatcher = new ContainerAwareEventDispatcher($container);
        $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));

        $dispatcher->dispatch('onEvent', new Event());
        $dispatcher->removeListener('onEvent', array($container->get('service.listener'), 'onEvent'));
        $this->assertFalse($dispatcher->hasListeners('onEvent'));
    }

    public function testRemoveBeforeDispatch()
    {
        $service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');

        $container = new Container();
        $container->set('service.listener', $service);

        $dispatcher = new ContainerAwareEventDispatcher($container);
        $dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));

        $dispatcher->removeListener('onEvent', array($container->get('service.listener'), 'onEvent'));
        $this->assertFalse($dispatcher->hasListeners('onEvent'));
    }
}

class Service
{
    public function onEvent(Event $e)
    {
    }
}

class SubscriberService implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            'onEvent' => 'onEvent',
            'onEvent' => array('onEvent', 10),
            'onEvent' => array('onEvent'),
        );
    }

    public function onEvent(Event $e)
    {
    }
}
PK�a�\���aabpear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher\Tests;

use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\ImmutableEventDispatcher;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ImmutableEventDispatcherTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $innerDispatcher;

    /**
     * @var ImmutableEventDispatcher
     */
    private $dispatcher;

    protected function setUp()
    {
        $this->innerDispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->dispatcher = new ImmutableEventDispatcher($this->innerDispatcher);
    }

    public function testDispatchDelegates()
    {
        $event = new Event();

        $this->innerDispatcher->expects($this->once())
            ->method('dispatch')
            ->with('event', $event)
            ->will($this->returnValue('result'));

        $this->assertSame('result', $this->dispatcher->dispatch('event', $event));
    }

    public function testGetListenersDelegates()
    {
        $this->innerDispatcher->expects($this->once())
            ->method('getListeners')
            ->with('event')
            ->will($this->returnValue('result'));

        $this->assertSame('result', $this->dispatcher->getListeners('event'));
    }

    public function testHasListenersDelegates()
    {
        $this->innerDispatcher->expects($this->once())
            ->method('hasListeners')
            ->with('event')
            ->will($this->returnValue('result'));

        $this->assertSame('result', $this->dispatcher->hasListeners('event'));
    }

    /**
     * @expectedException \BadMethodCallException
     */
    public function testAddListenerDisallowed()
    {
        $this->dispatcher->addListener('event', function () { return 'foo'; });
    }

    /**
     * @expectedException \BadMethodCallException
     */
    public function testAddSubscriberDisallowed()
    {
        $subscriber = $this->getMock('Symfony\Component\EventDispatcher\EventSubscriberInterface');

        $this->dispatcher->addSubscriber($subscriber);
    }

    /**
     * @expectedException \BadMethodCallException
     */
    public function testRemoveListenerDisallowed()
    {
        $this->dispatcher->removeListener('event', function () { return 'foo'; });
    }

    /**
     * @expectedException \BadMethodCallException
     */
    public function testRemoveSubscriberDisallowed()
    {
        $subscriber = $this->getMock('Symfony\Component\EventDispatcher\EventSubscriberInterface');

        $this->dispatcher->removeSubscriber($subscriber);
    }
}
PK�a�\��nuOpear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests/EventTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher\Tests;

use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventDispatcher;

/**
 * Test class for Event.
 */
class EventTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \Symfony\Component\EventDispatcher\Event
     */
    protected $event;

    /**
     * @var \Symfony\Component\EventDispatcher\EventDispatcher
     */
    protected $dispatcher;

    /**
     * Sets up the fixture, for example, opens a network connection.
     * This method is called before a test is executed.
     */
    protected function setUp()
    {
        $this->event = new Event();
        $this->dispatcher = new EventDispatcher();
    }

    /**
     * Tears down the fixture, for example, closes a network connection.
     * This method is called after a test is executed.
     */
    protected function tearDown()
    {
        $this->event = null;
        $this->dispatcher = null;
    }

    public function testIsPropagationStopped()
    {
        $this->assertFalse($this->event->isPropagationStopped());
    }

    public function testStopPropagationAndIsPropagationStopped()
    {
        $this->event->stopPropagation();
        $this->assertTrue($this->event->isPropagationStopped());
    }

    public function testSetDispatcher()
    {
        $this->event->setDispatcher($this->dispatcher);
        $this->assertSame($this->dispatcher, $this->event->getDispatcher());
    }

    public function testGetDispatcher()
    {
        $this->assertNull($this->event->getDispatcher());
    }

    public function testGetName()
    {
        $this->assertNull($this->event->getName());
    }

    public function testSetName()
    {
        $this->event->setName('foo');
        $this->assertEquals('foo', $this->event->getName());
    }
}
PK�a�\\2��
�
Vpear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher\Tests;

use Symfony\Component\EventDispatcher\GenericEvent;

/**
 * Test class for Event.
 */
class GenericEventTest extends \PHPUnit_Framework_TestCase
{

    /**
     * @var GenericEvent
     */
    private $event;

    private $subject;

    /**
     * Prepares the environment before running a test.
     */
    protected function setUp()
    {
        parent::setUp();

        $this->subject = new \stdClass();
        $this->event = new GenericEvent($this->subject, array('name' => 'Event'), 'foo');
    }

    /**
     * Cleans up the environment after running a test.
     */
    protected function tearDown()
    {
        $this->subject = null;
        $this->event = null;

        parent::tearDown();
    }

    public function testConstruct()
    {
        $this->assertEquals($this->event, new GenericEvent($this->subject, array('name' => 'Event')));
    }

    /**
     * Tests Event->getArgs()
     */
    public function testGetArguments()
    {
        // test getting all
        $this->assertSame(array('name' => 'Event'), $this->event->getArguments());
    }

    public function testSetArguments()
    {
        $result = $this->event->setArguments(array('foo' => 'bar'));
        $this->assertAttributeSame(array('foo' => 'bar'), 'arguments', $this->event);
        $this->assertSame($this->event, $result);
    }

    public function testSetArgument()
    {
        $result = $this->event->setArgument('foo2', 'bar2');
        $this->assertAttributeSame(array('name' => 'Event', 'foo2' => 'bar2'), 'arguments', $this->event);
        $this->assertEquals($this->event, $result);
    }

    public function testGetArgument()
    {
        // test getting key
        $this->assertEquals('Event', $this->event->getArgument('name'));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testGetArgException()
    {
        $this->event->getArgument('nameNotExist');
    }

    public function testOffsetGet()
    {
        // test getting key
        $this->assertEquals('Event', $this->event['name']);

        // test getting invalid arg
        $this->setExpectedException('InvalidArgumentException');
        $this->assertFalse($this->event['nameNotExist']);
    }

    public function testOffsetSet()
    {
        $this->event['foo2'] = 'bar2';
        $this->assertAttributeSame(array('name' => 'Event', 'foo2' => 'bar2'), 'arguments', $this->event);
    }

    public function testOffsetUnset()
    {
        unset($this->event['name']);
        $this->assertAttributeSame(array(), 'arguments', $this->event);
    }

    public function testOffsetIsset()
    {
        $this->assertTrue(isset($this->event['name']));
        $this->assertFalse(isset($this->event['nameNotExist']));
    }

    public function testHasArgument()
    {
        $this->assertTrue($this->event->hasArgument('name'));
        $this->assertFalse($this->event->hasArgument('nameNotExist'));
    }

    public function testGetSubject()
    {
        $this->assertSame($this->subject, $this->event->getSubject());
    }

    public function testHasIterator()
    {
        $data = array();
        foreach ($this->event as $key => $value) {
            $data[$key] = $value;
        }
        $this->assertEquals(array('name' => 'Event'), $data);
    }
}
PK�a�\�X,�/�/Ypear/test/EventDispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\EventDispatcher\Tests;

use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class EventDispatcherTest extends \PHPUnit_Framework_TestCase
{
    /* Some pseudo events */
    const preFoo = 'pre.foo';
    const postFoo = 'post.foo';
    const preBar = 'pre.bar';
    const postBar = 'post.bar';

    /**
     * @var EventDispatcher
     */
    private $dispatcher;

    private $listener;

    protected function setUp()
    {
        $this->dispatcher = new EventDispatcher();
        $this->listener = new TestEventListener();
    }

    protected function tearDown()
    {
        $this->dispatcher = null;
        $this->listener = null;
    }

    public function testInitialState()
    {
        $this->assertEquals(array(), $this->dispatcher->getListeners());
        $this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
        $this->assertFalse($this->dispatcher->hasListeners(self::postFoo));
    }

    public function testAddListener()
    {
        $this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo'));
        $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo'));
        $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
        $this->assertTrue($this->dispatcher->hasListeners(self::postFoo));
        $this->assertCount(1, $this->dispatcher->getListeners(self::preFoo));
        $this->assertCount(1, $this->dispatcher->getListeners(self::postFoo));
        $this->assertCount(2, $this->dispatcher->getListeners());
    }

    public function testGetListenersSortsByPriority()
    {
        $listener1 = new TestEventListener();
        $listener2 = new TestEventListener();
        $listener3 = new TestEventListener();
        $listener1->name = '1';
        $listener2->name = '2';
        $listener3->name = '3';

        $this->dispatcher->addListener('pre.foo', array($listener1, 'preFoo'), -10);
        $this->dispatcher->addListener('pre.foo', array($listener2, 'preFoo'), 10);
        $this->dispatcher->addListener('pre.foo', array($listener3, 'preFoo'));

        $expected = array(
            array($listener2, 'preFoo'),
            array($listener3, 'preFoo'),
            array($listener1, 'preFoo'),
        );

        $this->assertSame($expected, $this->dispatcher->getListeners('pre.foo'));
    }

    public function testGetAllListenersSortsByPriority()
    {
        $listener1 = new TestEventListener();
        $listener2 = new TestEventListener();
        $listener3 = new TestEventListener();
        $listener4 = new TestEventListener();
        $listener5 = new TestEventListener();
        $listener6 = new TestEventListener();

        $this->dispatcher->addListener('pre.foo', $listener1, -10);
        $this->dispatcher->addListener('pre.foo', $listener2);
        $this->dispatcher->addListener('pre.foo', $listener3, 10);
        $this->dispatcher->addListener('post.foo', $listener4, -10);
        $this->dispatcher->addListener('post.foo', $listener5);
        $this->dispatcher->addListener('post.foo', $listener6, 10);

        $expected = array(
            'pre.foo'  => array($listener3, $listener2, $listener1),
            'post.foo' => array($listener6, $listener5, $listener4),
        );

        $this->assertSame($expected, $this->dispatcher->getListeners());
    }

    public function testDispatch()
    {
        $this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo'));
        $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo'));
        $this->dispatcher->dispatch(self::preFoo);
        $this->assertTrue($this->listener->preFooInvoked);
        $this->assertFalse($this->listener->postFooInvoked);
        $this->assertInstanceOf('Symfony\Component\EventDispatcher\Event', $this->dispatcher->dispatch('noevent'));
        $this->assertInstanceOf('Symfony\Component\EventDispatcher\Event', $this->dispatcher->dispatch(self::preFoo));
        $event = new Event();
        $return = $this->dispatcher->dispatch(self::preFoo, $event);
        $this->assertEquals('pre.foo', $event->getName());
        $this->assertSame($event, $return);
    }

    public function testDispatchForClosure()
    {
        $invoked = 0;
        $listener = function () use (&$invoked) {
            $invoked++;
        };
        $this->dispatcher->addListener('pre.foo', $listener);
        $this->dispatcher->addListener('post.foo', $listener);
        $this->dispatcher->dispatch(self::preFoo);
        $this->assertEquals(1, $invoked);
    }

    public function testStopEventPropagation()
    {
        $otherListener = new TestEventListener();

        // postFoo() stops the propagation, so only one listener should
        // be executed
        // Manually set priority to enforce $this->listener to be called first
        $this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo'), 10);
        $this->dispatcher->addListener('post.foo', array($otherListener, 'preFoo'));
        $this->dispatcher->dispatch(self::postFoo);
        $this->assertTrue($this->listener->postFooInvoked);
        $this->assertFalse($otherListener->postFooInvoked);
    }

    public function testDispatchByPriority()
    {
        $invoked = array();
        $listener1 = function () use (&$invoked) {
            $invoked[] = '1';
        };
        $listener2 = function () use (&$invoked) {
            $invoked[] = '2';
        };
        $listener3 = function () use (&$invoked) {
            $invoked[] = '3';
        };
        $this->dispatcher->addListener('pre.foo', $listener1, -10);
        $this->dispatcher->addListener('pre.foo', $listener2);
        $this->dispatcher->addListener('pre.foo', $listener3, 10);
        $this->dispatcher->dispatch(self::preFoo);
        $this->assertEquals(array('3', '2', '1'), $invoked);
    }

    public function testRemoveListener()
    {
        $this->dispatcher->addListener('pre.bar', $this->listener);
        $this->assertTrue($this->dispatcher->hasListeners(self::preBar));
        $this->dispatcher->removeListener('pre.bar', $this->listener);
        $this->assertFalse($this->dispatcher->hasListeners(self::preBar));
        $this->dispatcher->removeListener('notExists', $this->listener);
    }

    public function testAddSubscriber()
    {
        $eventSubscriber = new TestEventSubscriber();
        $this->dispatcher->addSubscriber($eventSubscriber);
        $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
        $this->assertTrue($this->dispatcher->hasListeners(self::postFoo));
    }

    public function testAddSubscriberWithPriorities()
    {
        $eventSubscriber = new TestEventSubscriber();
        $this->dispatcher->addSubscriber($eventSubscriber);

        $eventSubscriber = new TestEventSubscriberWithPriorities();
        $this->dispatcher->addSubscriber($eventSubscriber);

        $listeners = $this->dispatcher->getListeners('pre.foo');
        $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
        $this->assertCount(2, $listeners);
        $this->assertInstanceOf('Symfony\Component\EventDispatcher\Tests\TestEventSubscriberWithPriorities', $listeners[0][0]);
    }

    public function testAddSubscriberWithMultipleListeners()
    {
        $eventSubscriber = new TestEventSubscriberWithMultipleListeners();
        $this->dispatcher->addSubscriber($eventSubscriber);

        $listeners = $this->dispatcher->getListeners('pre.foo');
        $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
        $this->assertCount(2, $listeners);
        $this->assertEquals('preFoo2', $listeners[0][1]);
    }

    public function testRemoveSubscriber()
    {
        $eventSubscriber = new TestEventSubscriber();
        $this->dispatcher->addSubscriber($eventSubscriber);
        $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
        $this->assertTrue($this->dispatcher->hasListeners(self::postFoo));
        $this->dispatcher->removeSubscriber($eventSubscriber);
        $this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
        $this->assertFalse($this->dispatcher->hasListeners(self::postFoo));
    }

    public function testRemoveSubscriberWithPriorities()
    {
        $eventSubscriber = new TestEventSubscriberWithPriorities();
        $this->dispatcher->addSubscriber($eventSubscriber);
        $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
        $this->dispatcher->removeSubscriber($eventSubscriber);
        $this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
    }

    public function testRemoveSubscriberWithMultipleListeners()
    {
        $eventSubscriber = new TestEventSubscriberWithMultipleListeners();
        $this->dispatcher->addSubscriber($eventSubscriber);
        $this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
        $this->assertCount(2, $this->dispatcher->getListeners(self::preFoo));
        $this->dispatcher->removeSubscriber($eventSubscriber);
        $this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
    }

    public function testEventReceivesTheDispatcherInstance()
    {
        $dispatcher = null;
        $this->dispatcher->addListener('test', function ($event) use (&$dispatcher) {
            $dispatcher = $event->getDispatcher();
        });
        $this->dispatcher->dispatch('test');
        $this->assertSame($this->dispatcher, $dispatcher);
    }

    public function testEventReceivesTheDispatcherInstanceAsArgument()
    {
        $listener = new TestWithDispatcher();
        $this->dispatcher->addListener('test', array($listener, 'foo'));
        $this->assertNull($listener->name);
        $this->assertNull($listener->dispatcher);
        $this->dispatcher->dispatch('test');
        $this->assertEquals('test', $listener->name);
        $this->assertSame($this->dispatcher, $listener->dispatcher);
    }

    /**
     * @see https://bugs.php.net/bug.php?id=62976
     *
     * This bug affects:
     *  - The PHP 5.3 branch for versions < 5.3.18
     *  - The PHP 5.4 branch for versions < 5.4.8
     *  - The PHP 5.5 branch is not affected
     */
    public function testWorkaroundForPhpBug62976()
    {
        $dispatcher = new EventDispatcher();
        $dispatcher->addListener('bug.62976', new CallableClass());
        $dispatcher->removeListener('bug.62976', function () {});
        $this->assertTrue($dispatcher->hasListeners('bug.62976'));
    }
}

class CallableClass
{
    public function __invoke()
    {
    }
}

class TestEventListener
{
    public $preFooInvoked = false;
    public $postFooInvoked = false;

    /* Listener methods */

    public function preFoo(Event $e)
    {
        $this->preFooInvoked = true;
    }

    public function postFoo(Event $e)
    {
        $this->postFooInvoked = true;

        $e->stopPropagation();
    }
}

class TestWithDispatcher
{
    public $name;
    public $dispatcher;

    public function foo(Event $e, $name, $dispatcher)
    {
        $this->name = $name;
        $this->dispatcher = $dispatcher;
    }
}

class TestEventSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array('pre.foo' => 'preFoo', 'post.foo' => 'postFoo');
    }
}

class TestEventSubscriberWithPriorities implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            'pre.foo' => array('preFoo', 10),
            'post.foo' => array('postFoo'),
            );
    }
}

class TestEventSubscriberWithMultipleListeners implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array('pre.foo' => array(
            array('preFoo1'),
            array('preFoo2', 10)
        ));
    }
}
PK�a�\^C�	::Dpear/test/Translation/Symfony/Component/Translation/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Translation Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./vendor</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�a�\0�2��Jpear/test/Translation/Symfony/Component/Translation/Tests/IntervalTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests;

use Symfony\Component\Translation\Interval;

class IntervalTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getTests
     */
    public function testTest($expected, $number, $interval)
    {
        $this->assertEquals($expected, Interval::test($number, $interval));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testTestException()
    {
        Interval::test(1, 'foobar');
    }

    public function getTests()
    {
        return array(
            array(true, 3, '{1,2, 3 ,4}'),
            array(false, 10, '{1,2, 3 ,4}'),
            array(false, 3, '[1,2]'),
            array(true, 1, '[1,2]'),
            array(true, 2, '[1,2]'),
            array(false, 1, ']1,2['),
            array(false, 2, ']1,2['),
            array(true, log(0), '[-Inf,2['),
            array(true, -log(0), '[-2,+Inf]'),
        );
    }
}
PK�a�\���  Qpear/test/Translation/Symfony/Component/Translation/Tests/MessageSelectorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests;

use Symfony\Component\Translation\MessageSelector;

class MessageSelectorTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getChooseTests
     */
    public function testChoose($expected, $id, $number)
    {
        $selector = new MessageSelector();

        $this->assertEquals($expected, $selector->choose($id, $number, 'en'));
    }

    public function testReturnMessageIfExactlyOneStandardRuleIsGiven()
    {
        $selector = new MessageSelector();

        $this->assertEquals('There are two apples', $selector->choose('There are two apples', 2, 'en'));
    }

    /**
     * @dataProvider getNonMatchingMessages
     * @expectedException \InvalidArgumentException
     */
    public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number)
    {
        $selector = new MessageSelector();

        $selector->choose($id, $number, 'en');
    }

    public function getNonMatchingMessages()
    {
        return array(
            array('{0} There are no apples|{1} There is one apple', 2),
            array('{1} There is one apple|]1,Inf] There are %count% apples', 0),
            array('{1} There is one apple|]2,Inf] There are %count% apples', 2),
            array('{0} There are no apples|There is one apple', 2),
        );
    }

    public function getChooseTests()
    {
        return array(
            array('There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0),
            array('There are no apples', '{0}     There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0),
            array('There are no apples', '{0}There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0),

            array('There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1),

            array('There are %count% apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10),
            array('There are %count% apples', '{0} There are no apples|{1} There is one apple|]1,Inf]There are %count% apples', 10),
            array('There are %count% apples', '{0} There are no apples|{1} There is one apple|]1,Inf]     There are %count% apples', 10),

            array('There are %count% apples', 'There is one apple|There are %count% apples', 0),
            array('There is one apple', 'There is one apple|There are %count% apples', 1),
            array('There are %count% apples', 'There is one apple|There are %count% apples', 10),

            array('There are %count% apples', 'one: There is one apple|more: There are %count% apples', 0),
            array('There is one apple', 'one: There is one apple|more: There are %count% apples', 1),
            array('There are %count% apples', 'one: There is one apple|more: There are %count% apples', 10),

            array('There are no apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 0),
            array('There is one apple', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 1),
            array('There are %count% apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 10),

            array('', '{0}|{1} There is one apple|]1,Inf] There are %count% apples', 0),
            array('', '{0} There are no apples|{1}|]1,Inf] There are %count% apples', 1),

            // Indexed only tests which are Gettext PoFile* compatible strings.
            array('There are %count% apples', 'There is one apple|There are %count% apples', 0),
            array('There is one apple', 'There is one apple|There are %count% apples', 1),
            array('There are %count% apples', 'There is one apple|There are %count% apples', 2),

            // Tests for float numbers
            array('There is almost one apple', '{0} There are no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7),
            array('There is one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1),
            array('There is more than one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7),
            array('There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0),
            array('There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0),
            array('There are no apples', '{0.0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0),
        );
    }
}
PK�a�\���*|1|1Lpear/test/Translation/Symfony/Component/Translation/Tests/TranslatorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests;

use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\Loader\ArrayLoader;

class TranslatorTest extends \PHPUnit_Framework_TestCase
{
    public function testSetGetLocale()
    {
        $translator = new Translator('en');

        $this->assertEquals('en', $translator->getLocale());

        $translator->setLocale('fr');
        $this->assertEquals('fr', $translator->getLocale());
    }

    public function testSetFallbackLocales()
    {
        $translator = new Translator('en');
        $translator->addLoader('array', new ArrayLoader());
        $translator->addResource('array', array('foo' => 'foofoo'), 'en');
        $translator->addResource('array', array('bar' => 'foobar'), 'fr');

        // force catalogue loading
        $translator->trans('bar');

        $translator->setFallbackLocales(array('fr'));
        $this->assertEquals('foobar', $translator->trans('bar'));
    }

    public function testSetFallbackLocalesMultiple()
    {
        $translator = new Translator('en');
        $translator->addLoader('array', new ArrayLoader());
        $translator->addResource('array', array('foo' => 'foo (en)'), 'en');
        $translator->addResource('array', array('bar' => 'bar (fr)'), 'fr');

        // force catalogue loading
        $translator->trans('bar');

        $translator->setFallbackLocales(array('fr_FR', 'fr'));
        $this->assertEquals('bar (fr)', $translator->trans('bar'));
    }

    public function testTransWithFallbackLocale()
    {
        $translator = new Translator('fr_FR');
        $translator->addLoader('array', new ArrayLoader());
        $translator->addResource('array', array('foo' => 'foofoo'), 'en_US');
        $translator->addResource('array', array('bar' => 'foobar'), 'en');

        $translator->setFallbackLocales(array('en'));

        $this->assertEquals('foobar', $translator->trans('bar'));
    }

    public function testAddResourceAfterTrans()
    {
        $translator = new Translator('fr');
        $translator->addLoader('array', new ArrayLoader());

        $translator->setFallbackLocale(array('en'));

        $translator->addResource('array', array('foo' => 'foofoo'), 'en');
        $this->assertEquals('foofoo', $translator->trans('foo'));

        $translator->addResource('array', array('bar' => 'foobar'), 'en');
        $this->assertEquals('foobar', $translator->trans('bar'));
    }

    /**
     * @dataProvider      getTransFileTests
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testTransWithoutFallbackLocaleFile($format, $loader)
    {
        $loaderClass = 'Symfony\\Component\\Translation\\Loader\\'.$loader;
        $translator = new Translator('en');
        $translator->addLoader($format, new $loaderClass());
        $translator->addResource($format, __DIR__.'/fixtures/non-existing', 'en');
        $translator->addResource($format, __DIR__.'/fixtures/resources.'.$format, 'en');

        // force catalogue loading
        $translator->trans('foo');
    }

    /**
     * @dataProvider getTransFileTests
     */
    public function testTransWithFallbackLocaleFile($format, $loader)
    {
        $loaderClass = 'Symfony\\Component\\Translation\\Loader\\'.$loader;
        $translator = new Translator('en_GB');
        $translator->addLoader($format, new $loaderClass());
        $translator->addResource($format, __DIR__.'/fixtures/non-existing', 'en_GB');
        $translator->addResource($format, __DIR__.'/fixtures/resources.'.$format, 'en', 'resources');

        $this->assertEquals('bar', $translator->trans('foo', array(), 'resources'));
    }

    public function testTransWithFallbackLocaleBis()
    {
        $translator = new Translator('en_US');
        $translator->addLoader('array', new ArrayLoader());
        $translator->addResource('array', array('foo' => 'foofoo'), 'en_US');
        $translator->addResource('array', array('bar' => 'foobar'), 'en');
        $this->assertEquals('foobar', $translator->trans('bar'));
    }

    public function testTransWithFallbackLocaleTer()
    {
        $translator = new Translator('fr_FR');
        $translator->addLoader('array', new ArrayLoader());
        $translator->addResource('array', array('foo' => 'foo (en_US)'), 'en_US');
        $translator->addResource('array', array('bar' => 'bar (en)'), 'en');

        $translator->setFallbackLocales(array('en_US', 'en'));

        $this->assertEquals('foo (en_US)', $translator->trans('foo'));
        $this->assertEquals('bar (en)', $translator->trans('bar'));
    }

    public function testTransNonExistentWithFallback()
    {
        $translator = new Translator('fr');
        $translator->setFallbackLocales(array('en'));
        $translator->addLoader('array', new ArrayLoader());
        $this->assertEquals('non-existent', $translator->trans('non-existent'));
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testWhenAResourceHasNoRegisteredLoader()
    {
        $translator = new Translator('en');
        $translator->addResource('array', array('foo' => 'foofoo'), 'en');

        $translator->trans('foo');
    }

    /**
     * @dataProvider getTransTests
     */
    public function testTrans($expected, $id, $translation, $parameters, $locale, $domain)
    {
        $translator = new Translator('en');
        $translator->addLoader('array', new ArrayLoader());
        $translator->addResource('array', array((string) $id => $translation), $locale, $domain);

        $this->assertEquals($expected, $translator->trans($id, $parameters, $domain, $locale));
    }

    /**
     * @dataProvider getFlattenedTransTests
     */
    public function testFlattenedTrans($expected, $messages, $id)
    {
        $translator = new Translator('en');
        $translator->addLoader('array', new ArrayLoader());
        $translator->addResource('array', $messages, 'fr', '');

        $this->assertEquals($expected, $translator->trans($id, array(), '', 'fr'));
    }

    /**
     * @dataProvider getTransChoiceTests
     */
    public function testTransChoice($expected, $id, $translation, $number, $parameters, $locale, $domain)
    {
        $translator = new Translator('en');
        $translator->addLoader('array', new ArrayLoader());
        $translator->addResource('array', array((string) $id => $translation), $locale, $domain);

        $this->assertEquals($expected, $translator->transChoice($id, $number, $parameters, $domain, $locale));
    }

    public function getTransFileTests()
    {
        return array(
            array('csv', 'CsvFileLoader'),
            array('ini', 'IniFileLoader'),
            array('mo', 'MoFileLoader'),
            array('po', 'PoFileLoader'),
            array('php', 'PhpFileLoader'),
            array('ts', 'QtFileLoader'),
            array('xlf', 'XliffFileLoader'),
            array('yml', 'YamlFileLoader'),
            array('json', 'JsonFileLoader'),
        );
    }

    public function getTransTests()
    {
        return array(
            array('Symfony2 est super !', 'Symfony2 is great!', 'Symfony2 est super !', array(), 'fr', ''),
            array('Symfony2 est awesome !', 'Symfony2 is %what%!', 'Symfony2 est %what% !', array('%what%' => 'awesome'), 'fr', ''),
            array('Symfony2 est super !', new String('Symfony2 is great!'), 'Symfony2 est super !', array(), 'fr', ''),
        );
    }

    public function getFlattenedTransTests()
    {
        $messages = array(
            'symfony2' => array(
                'is' => array(
                    'great' => 'Symfony2 est super!'
                )
            ),
            'foo' => array(
                'bar' => array(
                    'baz' => 'Foo Bar Baz'
                ),
                'baz' => 'Foo Baz',
            ),
        );

        return array(
            array('Symfony2 est super!', $messages, 'symfony2.is.great'),
            array('Foo Bar Baz', $messages, 'foo.bar.baz'),
            array('Foo Baz', $messages, 'foo.baz'),
        );
    }

    public function getTransChoiceTests()
    {
        return array(
            array('Il y a 0 pomme', '{0} There are no appless|{1} There is one apple|]1,Inf] There is %count% apples', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 0, array('%count%' => 0), 'fr', ''),
            array('Il y a 1 pomme', '{0} There are no appless|{1} There is one apple|]1,Inf] There is %count% apples', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 1, array('%count%' => 1), 'fr', ''),
            array('Il y a 10 pommes', '{0} There are no appless|{1} There is one apple|]1,Inf] There is %count% apples', '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 10, array('%count%' => 10), 'fr', ''),

            array('Il y a 0 pomme', 'There is one apple|There is %count% apples', 'Il y a %count% pomme|Il y a %count% pommes', 0, array('%count%' => 0), 'fr', ''),
            array('Il y a 1 pomme', 'There is one apple|There is %count% apples', 'Il y a %count% pomme|Il y a %count% pommes', 1, array('%count%' => 1), 'fr', ''),
            array('Il y a 10 pommes', 'There is one apple|There is %count% apples', 'Il y a %count% pomme|Il y a %count% pommes', 10, array('%count%' => 10), 'fr', ''),

            array('Il y a 0 pomme', 'one: There is one apple|more: There is %count% apples', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 0, array('%count%' => 0), 'fr', ''),
            array('Il y a 1 pomme', 'one: There is one apple|more: There is %count% apples', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 1, array('%count%' => 1), 'fr', ''),
            array('Il y a 10 pommes', 'one: There is one apple|more: There is %count% apples', 'one: Il y a %count% pomme|more: Il y a %count% pommes', 10, array('%count%' => 10), 'fr', ''),

            array('Il n\'y a aucune pomme', '{0} There are no apples|one: There is one apple|more: There is %count% apples', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 0, array('%count%' => 0), 'fr', ''),
            array('Il y a 1 pomme', '{0} There are no apples|one: There is one apple|more: There is %count% apples', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 1, array('%count%' => 1), 'fr', ''),
            array('Il y a 10 pommes', '{0} There are no apples|one: There is one apple|more: There is %count% apples', '{0} Il n\'y a aucune pomme|one: Il y a %count% pomme|more: Il y a %count% pommes', 10, array('%count%' => 10), 'fr', ''),

            array('Il y a 0 pomme', new String('{0} There are no appless|{1} There is one apple|]1,Inf] There is %count% apples'), '[0,1] Il y a %count% pomme|]1,Inf] Il y a %count% pommes', 0, array('%count%' => 0), 'fr', ''),
        );
    }

    public function testTransChoiceFallback()
    {
        $translator = new Translator('ru');
        $translator->setFallbackLocales(array('en'));
        $translator->addLoader('array', new ArrayLoader());
        $translator->addResource('array', array('some_message2' => 'one thing|%count% things'), 'en');

        $this->assertEquals('10 things', $translator->transChoice('some_message2', 10, array('%count%' => 10)));
    }

    public function testTransChoiceFallbackBis()
    {
        $translator = new Translator('ru');
        $translator->setFallbackLocales(array('en_US', 'en'));
        $translator->addLoader('array', new ArrayLoader());
        $translator->addResource('array', array('some_message2' => 'one thing|%count% things'), 'en_US');

        $this->assertEquals('10 things', $translator->transChoice('some_message2', 10, array('%count%' => 10)));
    }

    public function testTransChoiceFallbackWithNoTranslation()
    {
        $translator = new Translator('ru');
        $translator->setFallbackLocales(array('en'));
        $translator->addLoader('array', new ArrayLoader());

        // consistent behavior with Translator::trans(), which returns the string
        // unchanged if it can't be found
        $this->assertEquals('some_message2', $translator->transChoice('some_message2', 10, array('%count%' => 10)));
    }
}

class String
{
    protected $str;

    public function __construct($str)
    {
        $this->str = $str;
    }

    public function __toString()
    {
        return $this->str;
    }
}
PK�a�\��IIWpear/test/Translation/Symfony/Component/Translation/Tests/Dumper/JsonFileDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\JsonFileDumper;

class JsonFileDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDump()
    {
        if (version_compare(PHP_VERSION, '5.4.0', '<')) {
            $this->markTestIncomplete('PHP below 5.4 doesn\'t support JSON pretty printing');
        }

        $catalogue = new MessageCatalogue('en');
        $catalogue->add(array('foo' => 'bar'));

        $tempDir = sys_get_temp_dir();
        $dumper = new JsonFileDumper();
        $dumper->dump($catalogue, array('path' => $tempDir));

        $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.json'), file_get_contents($tempDir.'/messages.en.json'));

        unlink($tempDir.'/messages.en.json');
    }
}
PK�a�\&��ݙ�Upear/test/Translation/Symfony/Component/Translation/Tests/Dumper/PoFileDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\PoFileDumper;

class PoFileDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDump()
    {
        $catalogue = new MessageCatalogue('en');
        $catalogue->add(array('foo' => 'bar'));

        $tempDir = sys_get_temp_dir();
        $dumper = new PoFileDumper();
        $dumper->dump($catalogue, array('path' => $tempDir));
        $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.po'), file_get_contents($tempDir.'/messages.en.po'));

        unlink($tempDir.'/messages.en.po');
    }
}
PK�a�\ub/��Ypear/test/Translation/Symfony/Component/Translation/Tests/Dumper/IcuResFileDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\IcuResFileDumper;

class IcuResFileDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDump()
    {
        if (!extension_loaded('mbstring')) {
            $this->markTestSkipped('This test requires mbstring to work.');
        }

        $catalogue = new MessageCatalogue('en');
        $catalogue->add(array('foo' => 'bar'));

        $tempDir = sys_get_temp_dir() . '/IcuResFileDumperTest';
        mkdir($tempDir);
        $dumper = new IcuResFileDumper();
        $dumper->dump($catalogue, array('path' => $tempDir));

        $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resourcebundle/res/en.res'), file_get_contents($tempDir.'/messages/en.res'));

        unlink($tempDir.'/messages/en.res');
        rmdir($tempDir.'/messages');
        rmdir($tempDir);
    }
}
PK�a�\�����Vpear/test/Translation/Symfony/Component/Translation/Tests/Dumper/CsvFileDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\CsvFileDumper;

class CsvFileDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDump()
    {
        $catalogue = new MessageCatalogue('en');
        $catalogue->add(array('foo' => 'bar', 'bar' => 'foo
foo', 'foo;foo' => 'bar'));

        $tempDir = sys_get_temp_dir();
        $dumper = new CsvFileDumper();
        $dumper->dump($catalogue, array('path' => $tempDir));

        $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/valid.csv'), file_get_contents($tempDir.'/messages.en.csv'));

        unlink($tempDir.'/messages.en.csv');
    }
}
PK�a�\����Wpear/test/Translation/Symfony/Component/Translation/Tests/Dumper/YamlFileDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\YamlFileDumper;

class YamlFileDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDump()
    {
        $catalogue = new MessageCatalogue('en');
        $catalogue->add(array('foo' => 'bar'));

        $tempDir = sys_get_temp_dir();
        $dumper = new YamlFileDumper();
        $dumper->dump($catalogue, array('path' => $tempDir));

        $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.yml'), file_get_contents($tempDir.'/messages.en.yml'));

        unlink($tempDir.'/messages.en.yml');
    }
}
PK�a�\`��׹�Xpear/test/Translation/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\XliffFileDumper;

class XliffFileDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDump()
    {
        $catalogue = new MessageCatalogue('en');
        $catalogue->add(array('foo' => 'bar', 'key' => ''));

        $tempDir = sys_get_temp_dir();
        $dumper = new XliffFileDumper();
        $dumper->dump($catalogue, array('path' => $tempDir));

        $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources-clean.xlf'), file_get_contents($tempDir.'/messages.en.xlf'));

        unlink($tempDir.'/messages.en.xlf');
    }
}
PK�a�\����Vpear/test/Translation/Symfony/Component/Translation/Tests/Dumper/PhpFileDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\PhpFileDumper;

class PhpFileDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDump()
    {
        $catalogue = new MessageCatalogue('en');
        $catalogue->add(array('foo' => 'bar'));

        $tempDir = sys_get_temp_dir();
        $dumper = new PhpFileDumper();
        $dumper->dump($catalogue, array('path' => $tempDir));

        $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.php'), file_get_contents($tempDir.'/messages.en.php'));

        unlink($tempDir.'/messages.en.php');
    }
}
PK�a�\�BY���Upear/test/Translation/Symfony/Component/Translation/Tests/Dumper/QtFileDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\QtFileDumper;

class QtFileDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDump()
    {
        $catalogue = new MessageCatalogue('en');
        $catalogue->add(array('foo' => 'bar'), 'resources');

        $tempDir = sys_get_temp_dir();
        $dumper = new QtFileDumper();
        $dumper->dump($catalogue, array('path' => $tempDir));

        $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.ts'), file_get_contents($tempDir.'/resources.en.ts'));

        unlink($tempDir.'/resources.en.ts');
    }
}
PK�a�\�����Upear/test/Translation/Symfony/Component/Translation/Tests/Dumper/MoFileDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\MoFileDumper;

class MoFileDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDump()
    {
        $catalogue = new MessageCatalogue('en');
        $catalogue->add(array('foo' => 'bar'));

        $tempDir = sys_get_temp_dir();
        $dumper = new MoFileDumper();
        $dumper->dump($catalogue, array('path' => $tempDir));
        $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.mo'), file_get_contents($tempDir.'/messages.en.mo'));

        unlink($tempDir.'/messages.en.mo');
    }
}
PK�a�\��V��Vpear/test/Translation/Symfony/Component/Translation/Tests/Dumper/IniFileDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Dumper;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\Dumper\IniFileDumper;

class IniFileDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDump()
    {
        $catalogue = new MessageCatalogue('en');
        $catalogue->add(array('foo' => 'bar'));

        $tempDir = sys_get_temp_dir();
        $dumper = new IniFileDumper();
        $dumper->dump($catalogue, array('path' => $tempDir));

        $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.ini'), file_get_contents($tempDir.'/messages.en.ini'));

        unlink($tempDir.'/messages.en.ini');
    }
}
PK�a�\��|=��Upear/test/Translation/Symfony/Component/Translation/Tests/Loader/QtFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\QtFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class QtFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testLoad()
    {
        $loader = new QtFileLoader();
        $resource = __DIR__.'/../fixtures/resources.ts';
        $catalogue = $loader->load($resource, 'en', 'resources');

        $this->assertEquals(array('foo' => 'bar'), $catalogue->all('resources'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new QtFileLoader();
        $resource = __DIR__.'/../fixtures/non-existing.ts';
        $loader->load($resource, 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadNonLocalResource()
    {
        $loader = new QtFileLoader();
        $resource = 'http://domain1.com/resources.ts';
        $loader->load($resource, 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadInvalidResource()
    {
        $loader = new QtFileLoader();
        $resource = __DIR__.'/../fixtures/invalid-xml-resources.xlf';
        $loader->load($resource, 'en', 'domain1');
    }

    public function testLoadEmptyResource()
    {
        $loader = new QtFileLoader();
        $resource = __DIR__.'/../fixtures/empty.xlf';
        $this->setExpectedException('Symfony\Component\Translation\Exception\InvalidResourceException', sprintf('Unable to load "%s".', $resource));
        $loader->load($resource, 'en', 'domain1');
    }
}
PK�a�\��j��Ypear/test/Translation/Symfony/Component/Translation/Tests/Loader/IcuResFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\IcuResFileLoader;
use Symfony\Component\Config\Resource\DirectoryResource;

class IcuResFileLoaderTest extends LocalizedTestCase
{
    protected function setUp()
    {
        if (!extension_loaded('intl')) {
            $this->markTestSkipped('This test requires intl extension to work.');
        }
    }

    public function testLoad()
    {
        // resource is build using genrb command
        $loader = new IcuResFileLoader();
        $resource = __DIR__.'/../fixtures/resourcebundle/res';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new DirectoryResource($resource)), $catalogue->getResources());
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new IcuResFileLoader();
        $loader->load(__DIR__.'/../fixtures/non-existing.txt', 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadInvalidResource()
    {
        $loader = new IcuResFileLoader();
        $loader->load(__DIR__.'/../fixtures/resourcebundle/corrupted', 'en', 'domain1');
    }
}
PK�a�\���Vpear/test/Translation/Symfony/Component/Translation/Tests/Loader/PhpFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\PhpFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class PhpFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testLoad()
    {
        $loader = new PhpFileLoader();
        $resource = __DIR__.'/../fixtures/resources.php';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new PhpFileLoader();
        $resource = __DIR__.'/../fixtures/non-existing.php';
        $loader->load($resource, 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadThrowsAnExceptionIfFileNotLocal()
    {
        $loader = new PhpFileLoader();
        $resource = 'http://example.com/resources.php';
        $loader->load($resource, 'en', 'domain1');
    }
}
PK�a�\�)�	�	�	Ypear/test/Translation/Symfony/Component/Translation/Tests/Loader/IcuDatFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\IcuDatFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class IcuDatFileLoaderTest extends LocalizedTestCase
{
    protected function setUp()
    {
        if (!extension_loaded('intl')) {
            $this->markTestSkipped('This test requires intl extension to work.');
        }
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadInvalidResource()
    {
        $loader = new IcuDatFileLoader();
        $loader->load(__DIR__.'/../fixtures/resourcebundle/corrupted/resources', 'es', 'domain2');
    }

    public function testDatEnglishLoad()
    {
        // bundled resource is build using pkgdata command which at least in ICU 4.2 comes in extremely! buggy form
        // you must specify an temporary build directory which is not the same as current directory and
        // MUST reside on the same partition. pkgdata -p resources -T /srv -d.packagelist.txt
        $loader = new IcuDatFileLoader();
        $resource = __DIR__.'/../fixtures/resourcebundle/dat/resources';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('symfony' => 'Symfony 2 is great'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource.'.dat')), $catalogue->getResources());
    }

    public function testDatFrenchLoad()
    {
        $loader = new IcuDatFileLoader();
        $resource = __DIR__.'/../fixtures/resourcebundle/dat/resources';
        $catalogue = $loader->load($resource, 'fr', 'domain1');

        $this->assertEquals(array('symfony' => 'Symfony 2 est génial'), $catalogue->all('domain1'));
        $this->assertEquals('fr', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource.'.dat')), $catalogue->getResources());
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new IcuDatFileLoader();
        $loader->load(__DIR__.'/../fixtures/non-existing.txt', 'en', 'domain1');
    }
}
PK�a�\���3Vpear/test/Translation/Symfony/Component/Translation/Tests/Loader/LocalizedTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

abstract class LocalizedTestCase extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        if (!extension_loaded('intl')) {
            $this->markTestSkipped('The "intl" extension is not available');
        }
    }
}
PK�a�\8^�k��Xpear/test/Translation/Symfony/Component/Translation/Tests/Loader/XliffFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\XliffFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class XliffFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testLoad()
    {
        $loader = new XliffFileLoader();
        $resource = __DIR__.'/../fixtures/resources.xlf';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    public function testLoadWithResname()
    {
        $loader = new XliffFileLoader();
        $catalogue = $loader->load(__DIR__.'/../fixtures/resname.xlf', 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar', 'bar' => 'baz', 'baz' => 'foo'), $catalogue->all('domain1'));
    }

    public function testIncompleteResource()
    {
        $loader = new XliffFileLoader();
        $catalogue = $loader->load(__DIR__.'/../fixtures/resources.xlf', 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar', 'key' => '', 'test' => 'with'), $catalogue->all('domain1'));
        $this->assertFalse($catalogue->has('extra', 'domain1'));
    }

    public function testEncoding()
    {
        if (!function_exists('iconv') && !function_exists('mb_convert_encoding')) {
            $this->markTestSkipped('The iconv and mbstring extensions are not available.');
        }

        $loader = new XliffFileLoader();
        $catalogue = $loader->load(__DIR__.'/../fixtures/encoding.xlf', 'en', 'domain1');

        $this->assertEquals(utf8_decode('föö'), $catalogue->get('bar', 'domain1'));
        $this->assertEquals(utf8_decode('bär'), $catalogue->get('foo', 'domain1'));
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadInvalidResource()
    {
        $loader = new XliffFileLoader();
        $loader->load(__DIR__.'/../fixtures/resources.php', 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadResourceDoesNotValidate()
    {
        $loader = new XliffFileLoader();
        $loader->load(__DIR__.'/../fixtures/non-valid.xlf', 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new XliffFileLoader();
        $resource = __DIR__.'/../fixtures/non-existing.xlf';
        $loader->load($resource, 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadThrowsAnExceptionIfFileNotLocal()
    {
        $loader = new XliffFileLoader();
        $resource = 'http://example.com/resources.xlf';
        $loader->load($resource, 'en', 'domain1');
    }

    /**
     * @expectedException        \Symfony\Component\Translation\Exception\InvalidResourceException
     * @expectedExceptionMessage Document types are not allowed.
     */
    public function testDocTypeIsNotAllowed()
    {
        $loader = new XliffFileLoader();
        $loader->load(__DIR__.'/../fixtures/withdoctype.xlf', 'en', 'domain1');
    }

    public function testParseEmptyFile()
    {
        $loader = new XliffFileLoader();
        $resource = __DIR__.'/../fixtures/empty.xlf';
        $this->setExpectedException('Symfony\Component\Translation\Exception\InvalidResourceException', sprintf('Unable to load "%s":', $resource));
        $loader->load($resource, 'en', 'domain1');
    }
}
PK�a�\[����Vpear/test/Translation/Symfony/Component/Translation/Tests/Loader/CsvFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\CsvFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class CsvFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testLoad()
    {
        $loader = new CsvFileLoader();
        $resource = __DIR__.'/../fixtures/resources.csv';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    public function testLoadDoesNothingIfEmpty()
    {
        $loader = new CsvFileLoader();
        $resource = __DIR__.'/../fixtures/empty.csv';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array(), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new CsvFileLoader();
        $resource = __DIR__.'/../fixtures/not-exists.csv';
        $loader->load($resource, 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadNonLocalResource()
    {
        $loader = new CsvFileLoader();
        $resource = 'http://example.com/resources.csv';
        $loader->load($resource, 'en', 'domain1');
    }
}
PK�a�\/�݂�Vpear/test/Translation/Symfony/Component/Translation/Tests/Loader/IniFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\IniFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class IniFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testLoad()
    {
        $loader = new IniFileLoader();
        $resource = __DIR__.'/../fixtures/resources.ini';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    public function testLoadDoesNothingIfEmpty()
    {
        $loader = new IniFileLoader();
        $resource = __DIR__.'/../fixtures/empty.ini';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array(), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new IniFileLoader();
        $resource = __DIR__.'/../fixtures/non-existing.ini';
        $loader->load($resource, 'en', 'domain1');
    }
}
PK�a�\~�		Wpear/test/Translation/Symfony/Component/Translation/Tests/Loader/YamlFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\YamlFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testLoad()
    {
        $loader = new YamlFileLoader();
        $resource = __DIR__.'/../fixtures/resources.yml';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    public function testLoadDoesNothingIfEmpty()
    {
        $loader = new YamlFileLoader();
        $resource = __DIR__.'/../fixtures/empty.yml';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array(), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new YamlFileLoader();
        $resource = __DIR__.'/../fixtures/non-existing.yml';
        $loader->load($resource, 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadThrowsAnExceptionIfFileNotLocal()
    {
        $loader = new YamlFileLoader();
        $resource = 'http://example.com/resources.yml';
        $loader->load($resource, 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadThrowsAnExceptionIfNotAnArray()
    {
        $loader = new YamlFileLoader();
        $resource = __DIR__.'/../fixtures/non-valid.yml';
        $loader->load($resource, 'en', 'domain1');
    }
}
PK�a�\�$X

Upear/test/Translation/Symfony/Component/Translation/Tests/Loader/PoFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\PoFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class PoFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testLoad()
    {
        $loader = new PoFileLoader();
        $resource = __DIR__.'/../fixtures/resources.po';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    public function testLoadPlurals()
    {
        $loader = new PoFileLoader();
        $resource = __DIR__.'/../fixtures/plurals.po';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar', 'foos' => 'bar|bars'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    public function testLoadDoesNothingIfEmpty()
    {
        $loader = new PoFileLoader();
        $resource = __DIR__.'/../fixtures/empty.po';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array(), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new PoFileLoader();
        $resource = __DIR__.'/../fixtures/non-existing.po';
        $loader->load($resource, 'en', 'domain1');
    }

    public function testLoadEmptyTranslation()
    {
        $loader = new PoFileLoader();
        $resource = __DIR__.'/../fixtures/empty-translation.po';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => ''), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }
}
PK�a�\P�e��Wpear/test/Translation/Symfony/Component/Translation/Tests/Loader/JsonFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\JsonFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class JsonFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        if (!class_exists('Symfony\Component\Config\Loader\Loader')) {
            $this->markTestSkipped('The "Config" component is not available');
        }
    }

    public function testLoad()
    {
        $loader = new JsonFileLoader();
        $resource = __DIR__.'/../fixtures/resources.json';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    public function testLoadDoesNothingIfEmpty()
    {
        $loader = new JsonFileLoader();
        $resource = __DIR__.'/../fixtures/empty.json';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array(), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new JsonFileLoader();
        $resource = __DIR__.'/../fixtures/non-existing.json';
        $loader->load($resource, 'en', 'domain1');
    }

    /**
     * @expectedException           \Symfony\Component\Translation\Exception\InvalidResourceException
     * @expectedExceptionMessage    Error parsing JSON - Syntax error, malformed JSON
     */
    public function testParseException()
    {
        $loader = new JsonFileLoader();
        $resource = __DIR__.'/../fixtures/malformed.json';
        $loader->load($resource, 'en', 'domain1');
    }
}
PK�a�\����Upear/test/Translation/Symfony/Component/Translation/Tests/Loader/MoFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Loader;

use Symfony\Component\Translation\Loader\MoFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class MoFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testLoad()
    {
        $loader = new MoFileLoader();
        $resource = __DIR__.'/../fixtures/resources.mo';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    public function testLoadPlurals()
    {
        $loader = new MoFileLoader();
        $resource = __DIR__.'/../fixtures/plurals.mo';
        $catalogue = $loader->load($resource, 'en', 'domain1');

        $this->assertEquals(array('foo' => 'bar', 'foos' => '{0} bar|{1} bars'), $catalogue->all('domain1'));
        $this->assertEquals('en', $catalogue->getLocale());
        $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\NotFoundResourceException
     */
    public function testLoadNonExistingResource()
    {
        $loader = new MoFileLoader();
        $resource = __DIR__.'/../fixtures/non-existing.mo';
        $loader->load($resource, 'en', 'domain1');
    }

    /**
     * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
     */
    public function testLoadInvalidResource()
    {
        $loader = new MoFileLoader();
        $resource = __DIR__.'/../fixtures/empty.mo';
        $loader->load($resource, 'en', 'domain1');
    }
}
PK�a�\l.!���Tpear/test/Translation/Symfony/Component/Translation/Tests/PluralizationRulesTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests;

use Symfony\Component\Translation\PluralizationRules;

/**
 * Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms
 * and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms
 *
 * See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms.
 * The mozilla code is also interesting to check for.
 *
 * As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199
 *
 * The goal to cover all languages is to far fetched so this test case is smaller.
 *
 * @author Clemens Tolboom clemens@build2be.nl
 */
class PluralizationRulesTest  extends \PHPUnit_Framework_TestCase
{

    /**
     * We test failed langcode here.
     *
     * TODO: The languages mentioned in the data provide need to get fixed somehow within PluralizationRules.
     *
     * @dataProvider failingLangcodes
     */
    public function testFailedLangcodes($nplural, $langCodes)
    {
        $matrix = $this->generateTestData($nplural, $langCodes);
        $this->validateMatrix($nplural, $matrix, false);
    }

    /**
     * @dataProvider successLangcodes
     */
    public function testLangcodes($nplural, $langCodes)
    {
        $matrix = $this->generateTestData($nplural, $langCodes);
        $this->validateMatrix($nplural, $matrix);
    }

    /**
     * This array should contain all currently known langcodes.
     *
     * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete.
     *
     * @return type
     */
    public function successLangcodes()
    {
      return array(
        array('1' , array('ay','bo', 'cgg','dz','id', 'ja', 'jbo', 'ka','kk','km','ko','ky')),
        array('2' , array('nl', 'fr', 'en', 'de', 'de_GE')),
        array('3' , array('be','bs','cs','hr')),
        array('4' , array('cy','mt', 'sl')),
        array('5' , array()),
        array('6' , array('ar')),
      );
    }

    /**
     * This array should be at least empty within the near future.
     *
     * This both depends on a complete list trying to add above as understanding
     * the plural rules of the current failing languages.
     *
     * @return array with nplural together with langcodes
     */
    public function failingLangcodes()
    {
      return array(
        array('1' , array('fa')),
        array('2' , array('jbo')),
        array('3' , array('cbs')),
        array('4' , array('gd','kw')),
        array('5' , array('ga')),
        array('6' , array()),
      );
    }

    /**
     * We validate only on the plural coverage. Thus the real rules is not tested.
     *
     * @param string  $nplural       plural expected
     * @param array   $matrix        containing langcodes and their plural index values.
     * @param boolean $expectSuccess
     */
    protected function validateMatrix($nplural, $matrix, $expectSuccess = true)
    {
        foreach ($matrix as $langCode => $data) {
            $indexes = array_flip($data);
            if ($expectSuccess) {
                $this->assertEquals($nplural, count($indexes), "Langcode '$langCode' has '$nplural' plural forms.");
            } else {
                $this->assertNotEquals((int) $nplural, count($indexes), "Langcode '$langCode' has '$nplural' plural forms.");
            }
        }
    }

    protected function generateTestData($plural, $langCodes)
    {
        $matrix = array();
        foreach ($langCodes as $langCode) {
            for ($count=0; $count<200; $count++) {
                $plural = PluralizationRules::get($count, $langCode);
                $matrix[$langCode][$count] = $plural;
            }
        }

        return $matrix;
    }
}
PK�a�\h�9=UUTpear/test/Translation/Symfony/Component/Translation/Tests/IdentityTranslatorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests;

use Symfony\Component\Translation\IdentityTranslator;

class IdentityTranslatorTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getTransTests
     */
    public function testTrans($expected, $id, $parameters)
    {
        $translator = new IdentityTranslator();

        $this->assertEquals($expected, $translator->trans($id, $parameters));
    }

    /**
     * @dataProvider getTransChoiceTests
     */
    public function testTransChoiceWithExplicitLocale($expected, $id, $number, $parameters)
    {
        $translator = new IdentityTranslator();
        $translator->setLocale('en');

        $this->assertEquals($expected, $translator->transChoice($id, $number, $parameters));
    }

    /**
     * @dataProvider getTransChoiceTests
     */
    public function testTransChoiceWithDefaultLocale($expected, $id, $number, $parameters)
    {
        \Locale::setDefault('en');

        $translator = new IdentityTranslator();

        $this->assertEquals($expected, $translator->transChoice($id, $number, $parameters));
    }

    public function testGetSetLocale()
    {
        $translator = new IdentityTranslator();
        $translator->setLocale('en');

        $this->assertEquals('en', $translator->getLocale());
    }

    public function testGetLocaleReturnsDefaultLocaleIfNotSet()
    {
        $translator = new IdentityTranslator();

        \Locale::setDefault('en');
        $this->assertEquals('en', $translator->getLocale());

        \Locale::setDefault('pt_BR');
        $this->assertEquals('pt_BR', $translator->getLocale());
    }

    public function getTransTests()
    {
        return array(
            array('Symfony2 is great!', 'Symfony2 is great!', array()),
            array('Symfony2 is awesome!', 'Symfony2 is %what%!', array('%what%' => 'awesome')),
        );
    }

    public function getTransChoiceTests()
    {
        return array(
            array('There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0, array('%count%' => 0)),
            array('There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1, array('%count%' => 1)),
            array('There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10, array('%count%' => 10)),
            array('There are 0 apples', 'There is 1 apple|There are %count% apples', 0, array('%count%' => 0)),
            array('There is 1 apple', 'There is 1 apple|There are %count% apples', 1, array('%count%' => 1)),
            array('There are 10 apples', 'There is 1 apple|There are %count% apples', 10, array('%count%' => 10)),
            // custom validation messages may be coded with a fixed value
            array('There are 2 apples', 'There are 2 apples', 2, array('%count%' => 2)),
        );
    }
}
PK�a�\ײ�))]pear/test/Translation/Symfony/Component/Translation/Tests/Catalogue/AbstractOperationTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Catalogue;

use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\MessageCatalogueInterface;

abstract class AbstractOperationTest extends \PHPUnit_Framework_TestCase
{
    public function testGetEmptyDomains()
    {
        $this->assertEquals(
            array(),
            $this->createOperation(
                new MessageCatalogue('en'),
                new MessageCatalogue('en')
            )->getDomains()
        );
    }

    public function testGetMergedDomains()
    {
        $this->assertEquals(
            array('a', 'b', 'c'),
            $this->createOperation(
                new MessageCatalogue('en', array('a' => array(), 'b' => array())),
                new MessageCatalogue('en', array('b' => array(), 'c' => array()))
            )->getDomains()
        );
    }

    public function testGetMessagesFromUnknownDomain()
    {
        $this->setExpectedException('InvalidArgumentException');
        $this->createOperation(
            new MessageCatalogue('en'),
            new MessageCatalogue('en')
        )->getMessages('domain');
    }

    public function testGetEmptyMessages()
    {
        $this->assertEquals(
            array(),
            $this->createOperation(
                new MessageCatalogue('en', array('a' => array())),
                new MessageCatalogue('en')
            )->getMessages('a')
        );
    }

    public function testGetEmptyResult()
    {
        $this->assertEquals(
            new MessageCatalogue('en'),
            $this->createOperation(
                new MessageCatalogue('en'),
                new MessageCatalogue('en')
            )->getResult()
        );
    }

    abstract protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target);
}
PK�a�\$͒ϛ�Zpear/test/Translation/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Catalogue;

use Symfony\Component\Translation\Catalogue\MergeOperation;
use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\MessageCatalogueInterface;

class MergeOperationTest extends AbstractOperationTest
{
    public function testGetMessagesFromSingleDomain()
    {
        $operation = $this->createOperation(
            new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'))),
            new MessageCatalogue('en', array('messages' => array('a' => 'new_a', 'c' => 'new_c')))
        );

        $this->assertEquals(
            array('a' => 'old_a', 'b' => 'old_b', 'c' => 'new_c'),
            $operation->getMessages('messages')
        );

        $this->assertEquals(
            array('c' => 'new_c'),
            $operation->getNewMessages('messages')
        );

        $this->assertEquals(
            array(),
            $operation->getObsoleteMessages('messages')
        );
    }

    public function testGetResultFromSingleDomain()
    {
        $this->assertEquals(
            new MessageCatalogue('en', array(
                'messages' => array('a' => 'old_a', 'b' => 'old_b', 'c' => 'new_c')
            )),
            $this->createOperation(
                new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'))),
                new MessageCatalogue('en', array('messages' => array('a' => 'new_a', 'c' => 'new_c')))
            )->getResult()
        );
    }

    protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
    {
        return new MergeOperation($source, $target);
    }
}
PK�a�\�h�l��Ypear/test/Translation/Symfony/Component/Translation/Tests/Catalogue/DiffOperationTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests\Catalogue;

use Symfony\Component\Translation\Catalogue\DiffOperation;
use Symfony\Component\Translation\MessageCatalogue;
use Symfony\Component\Translation\MessageCatalogueInterface;

class DiffOperationTest extends AbstractOperationTest
{
    public function testGetMessagesFromSingleDomain()
    {
        $operation = $this->createOperation(
            new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'))),
            new MessageCatalogue('en', array('messages' => array('a' => 'new_a', 'c' => 'new_c')))
        );

        $this->assertEquals(
            array('a' => 'old_a', 'c' => 'new_c'),
            $operation->getMessages('messages')
        );

        $this->assertEquals(
            array('c' => 'new_c'),
            $operation->getNewMessages('messages')
        );

        $this->assertEquals(
            array('b' => 'old_b'),
            $operation->getObsoleteMessages('messages')
        );
    }

    public function testGetResultFromSingleDomain()
    {
        $this->assertEquals(
            new MessageCatalogue('en', array(
                'messages' => array('a' => 'old_a', 'c' => 'new_c')
            )),
            $this->createOperation(
                new MessageCatalogue('en', array('messages' => array('a' => 'old_a', 'b' => 'old_b'))),
                new MessageCatalogue('en', array('messages' => array('a' => 'new_a', 'c' => 'new_c')))
            )->getResult()
        );
    }

    protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
    {
        return new DiffOperation($source, $target);
    }
}
PK�a�\M��Rpear/test/Translation/Symfony/Component/Translation/Tests/MessageCatalogueTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Translation\Tests;

use Symfony\Component\Translation\MessageCatalogue;

class MessageCatalogueTest extends \PHPUnit_Framework_TestCase
{
    public function testGetLocale()
    {
        $catalogue = new MessageCatalogue('en');

        $this->assertEquals('en', $catalogue->getLocale());
    }

    public function testGetDomains()
    {
        $catalogue = new MessageCatalogue('en', array('domain1' => array(), 'domain2' => array()));

        $this->assertEquals(array('domain1', 'domain2'), $catalogue->getDomains());
    }

    public function testAll()
    {
        $catalogue = new MessageCatalogue('en', $messages = array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));

        $this->assertEquals(array('foo' => 'foo'), $catalogue->all('domain1'));
        $this->assertEquals(array(), $catalogue->all('domain88'));
        $this->assertEquals($messages, $catalogue->all());
    }

    public function testHas()
    {
        $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));

        $this->assertTrue($catalogue->has('foo', 'domain1'));
        $this->assertFalse($catalogue->has('bar', 'domain1'));
        $this->assertFalse($catalogue->has('foo', 'domain88'));
    }

    public function testGetSet()
    {
        $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
        $catalogue->set('foo1', 'foo1', 'domain1');

        $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
        $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));
    }

    public function testAdd()
    {
        $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
        $catalogue->add(array('foo1' => 'foo1'), 'domain1');

        $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
        $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));

        $catalogue->add(array('foo' => 'bar'), 'domain1');
        $this->assertEquals('bar', $catalogue->get('foo', 'domain1'));
        $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));

        $catalogue->add(array('foo' => 'bar'), 'domain88');
        $this->assertEquals('bar', $catalogue->get('foo', 'domain88'));
    }

    public function testReplace()
    {
        $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
        $catalogue->replace($messages = array('foo1' => 'foo1'), 'domain1');

        $this->assertEquals($messages, $catalogue->all('domain1'));
    }

    public function testAddCatalogue()
    {
        $r = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
        $r->expects($this->any())->method('__toString')->will($this->returnValue('r'));

        $r1 = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
        $r1->expects($this->any())->method('__toString')->will($this->returnValue('r1'));

        $catalogue = new MessageCatalogue('en', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
        $catalogue->addResource($r);

        $catalogue1 = new MessageCatalogue('en', array('domain1' => array('foo1' => 'foo1')));
        $catalogue1->addResource($r1);

        $catalogue->addCatalogue($catalogue1);

        $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
        $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));

        $this->assertEquals(array($r, $r1), $catalogue->getResources());
    }

    public function testAddFallbackCatalogue()
    {
        $r = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
        $r->expects($this->any())->method('__toString')->will($this->returnValue('r'));

        $r1 = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
        $r1->expects($this->any())->method('__toString')->will($this->returnValue('r1'));

        $catalogue = new MessageCatalogue('en_US', array('domain1' => array('foo' => 'foo'), 'domain2' => array('bar' => 'bar')));
        $catalogue->addResource($r);

        $catalogue1 = new MessageCatalogue('en', array('domain1' => array('foo' => 'bar', 'foo1' => 'foo1')));
        $catalogue1->addResource($r1);

        $catalogue->addFallbackCatalogue($catalogue1);

        $this->assertEquals('foo', $catalogue->get('foo', 'domain1'));
        $this->assertEquals('foo1', $catalogue->get('foo1', 'domain1'));

        $this->assertEquals(array($r, $r1), $catalogue->getResources());
    }

    /**
     * @expectedException \LogicException
     */
    public function testAddFallbackCatalogueWithCircularReference()
    {
        $main = new MessageCatalogue('en_US');
        $fallback = new MessageCatalogue('fr_FR');

        $fallback->addFallbackCatalogue($main);
        $main->addFallbackCatalogue($fallback);
    }

    /**
     * @expectedException \LogicException
     */
    public function testAddCatalogueWhenLocaleIsNotTheSameAsTheCurrentOne()
    {
        $catalogue = new MessageCatalogue('en');
        $catalogue->addCatalogue(new MessageCatalogue('fr', array()));
    }

    public function testGetAddResource()
    {
        $catalogue = new MessageCatalogue('en');
        $r = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
        $r->expects($this->any())->method('__toString')->will($this->returnValue('r'));
        $catalogue->addResource($r);
        $catalogue->addResource($r);
        $r1 = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
        $r1->expects($this->any())->method('__toString')->will($this->returnValue('r1'));
        $catalogue->addResource($r1);

        $this->assertEquals(array($r, $r1), $catalogue->getResources());
    }

    public function testMetadataDelete()
    {
        $catalogue = new MessageCatalogue('en');
        $this->assertEquals(array(), $catalogue->getMetadata('', ''), 'Metadata is empty');
        $catalogue->deleteMetadata('key', 'messages');
        $catalogue->deleteMetadata('', 'messages');
        $catalogue->deleteMetadata();
    }

    public function testMetadataSetGetDelete()
    {
        $catalogue = new MessageCatalogue('en');
        $catalogue->setMetadata('key', 'value');
        $this->assertEquals('value', $catalogue->getMetadata('key', 'messages'), "Metadata 'key' = 'value'");

        $catalogue->setMetadata('key2', array());
        $this->assertEquals(array(), $catalogue->getMetadata('key2', 'messages'), 'Metadata key2 is array');

        $catalogue->deleteMetadata('key2', 'messages');
        $this->assertEquals(null, $catalogue->getMetadata('key2', 'messages'), 'Metadata key2 should is deleted.');

        $catalogue->deleteMetadata('key2', 'domain');
        $this->assertEquals(null, $catalogue->getMetadata('key2', 'domain'), 'Metadata key2 should is deleted.');
    }

    public function testMetadataMerge()
    {
        $cat1 = new MessageCatalogue('en');
        $cat1->setMetadata('a', 'b');
        $this->assertEquals(array('messages' => array('a' => 'b')), $cat1->getMetadata('', ''), 'Cat1 contains messages metadata.');

        $cat2 = new MessageCatalogue('en');
        $cat2->setMetadata('b', 'c', 'domain');
        $this->assertEquals(array('domain' => array('b' => 'c')), $cat2->getMetadata('', ''), 'Cat2 contains domain metadata.');

        $cat1->addCatalogue($cat2);
        $this->assertEquals(array('messages' => array('a' => 'b'), 'domain' => array('b' => 'c')), $cat1->getMetadata('', ''), 'Cat1 contains merged metadata.');
    }
}
PK�a�\Lpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.ymlnu�[���PK�a�\����Qpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.jsonnu�[���{
    "foo": "bar"
}PK�a�\Kpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.ponu�[���PK�a�\�.�zzPpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.xlfnu�[���<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
  <file source-language="en" datatype="plaintext" original="file.ext">
    <body>
      <trans-unit id="1">
        <source>foo</source>
        <target>bar</target>
      </trans-unit>
      <trans-unit id="2">
        <source>extra</source>
      </trans-unit>
      <trans-unit id="3">
        <source>key</source>
        <target></target>
      </trans-unit>
      <trans-unit id="4">
        <source>test</source>
        <target>with</target>
        <note>note</note>
      </trans-unit>
    </body>
  </file>
</xliff>
PK�a�\YڸCVpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources-clean.xlfnu�[���<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
  <file source-language="en" datatype="plaintext" original="file.ext">
    <body>
      <trans-unit id="acbd18db4cc2f85cedef654fccc4a4d8" resname="foo">
        <source>foo</source>
        <target>bar</target>
      </trans-unit>
      <trans-unit id="3c6e0b8a9c15224a8228b9a98ca1531d" resname="key">
        <source>key</source>
        <target></target>
      </trans-unit>
    </body>
  </file>
</xliff>
PK�a�\Lpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.ininu�[���PK�a�\*֔�JJMpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/plurals.monu�[�����$,8AfoofoosbarbarsPK�a�\/�
��\pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/invalid-xml-resources.xlfnu�[���<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>foo</source>
                <target>bar
            </trans-unit>
            <trans-unit id="2">
                <source>extra</source>
            </trans-unit>
            <trans-unit id="3">
                <source>key</source>
                <target></target>
            </trans-unit>
            <trans-unit id="4">
                <source>test</source>
                <target>with</target>
                <note>note</note>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�a�\�ߞQpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/malformed.jsonnu�[���{
    "foo": "bar" "
}PK�a�\!f����Opear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.ponu�[���msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en\n"

msgid "foo"
msgstr "bar"PK�a�\�'�F

Ppear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.ininu�[���foo="bar"
PK�a�\+�L�TT\pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/res/en.resnu�[��� �'ResB 

foobarPK�a�\�25�''\pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.txtnu�[���en{
    symfony{"Symfony 2 is great"}
}PK�a�\�M�Rxx\pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/en.resnu�[��� �'ResB 	symfonySymfony 2 is great��	PK�a�\�g.�epear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/packagelist.txtnu�[���en.res
fr.res
PK�a�\w˦(||\pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.resnu�[��� �'ResB 	symfonySymfony 2 est g�nial��	PK�a�\X��**\pear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/fr.txtnu�[���fr{
    symfony{"Symfony 2 est génial"}
}PK�a�\rQ�``cpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/dat/resources.datnu�[��� �'CmnD@%�resources/en.resresources/fr.res���������� �'ResB 	symfonySymfony 2 is great��	�������� �'ResB 	symfonySymfony 2 est g�nial��	����PK�a�\��<�ipear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resourcebundle/corrupted/resources.datnu�[���XXXPK�a�\Mpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.jsonnu�[���PK�a�\���		Ppear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.ymlnu�[���foo: bar
PK�a�\;.�BBMpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/plurals.ponu�[���msgid "foo"
msgid_plural "foos"
msgstr[0] "bar"
msgstr[1] "bars"

PK�a�\�:�++Ppear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.phpnu�[���<?php

return array (
  'foo' => 'bar',
);
PK�a�\�B$$Lpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/valid.csvnu�[���foo;bar
bar;"foo
foo"
"foo;foo";bar
PK�a�\=BsWpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty-translation.ponu�[���msgid "foo"
msgstr ""

PK�a�\Y���44Npear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resname.xlfnu�[���<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
  <file source-language="en" datatype="plaintext" original="file.ext">
    <body>
      <trans-unit id="1" resname="foo">
        <source></source>
        <target>bar</target>
      </trans-unit>
      <trans-unit id="2" resname="bar">
        <source>bar source</source>
        <target>baz</target>
      </trans-unit>
      <trans-unit id="3">
        <source>baz</source>
        <target>foo</target>
      </trans-unit>
    </body>
  </file>
</xliff>
PK�a�\� TTPpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/non-valid.xlfnu�[���<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit>
                <source>foo</source>
                <target>bar</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�a�\�e2~Ppear/test/Translation/Symfony/Component/Translation/Tests/fixtures/non-valid.ymlnu�[���foo
PK�a�\��W44Opear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.monu�[�����$,-1foobarPK�a�\Lpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.xlfnu�[���PK�a�\�C(���Opear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.tsnu�[���<?xml version="1.0" encoding="utf-8"?>
<TS>
  <context>
    <name>resources</name>
    <message>
      <source>foo</source>
      <translation>bar</translation>
    </message>
  </context>
</TS>
PK�a�\Kpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.monu�[���PK�a�\�D��``Ppear/test/Translation/Symfony/Component/Translation/Tests/fixtures/resources.csvnu�[���"foo"; "bar"
#"bar"; "foo"
"incorrect"; "number"; "columns"; "will"; "be"; "ignored"
"incorrect"PK�a�\Lpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/empty.csvnu�[���PK�a�\��jjRpear/test/Translation/Symfony/Component/Translation/Tests/fixtures/withdoctype.xlfnu�[���<?xml version="1.0"?>
<!DOCTYPE foo>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="1">
                <source>foo</source>
                <target>bar</target>
            </trans-unit>
        </body>
    </file>
</xliff>
PK�a�\̉^2��Opear/test/Translation/Symfony/Component/Translation/Tests/fixtures/encoding.xlfnu�[���<?xml version="1.0" encoding="ISO-8859-1"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
  <file source-language="en" datatype="plaintext" original="file.ext">
    <body>
      <trans-unit id="1" resname="foo">
        <source>foo</source>
        <target>b�r</target>
      </trans-unit>
      <trans-unit id="2" resname="bar">
        <source>bar</source>
        <target>f��</target>
      </trans-unit>
    </body>
  </file>
</xliff>
PK�a�\�� pear/test/Mail/tests/9137_2.phptnu�[���--TEST--
Mail: Test for bug #9137, take 2
--FILE--
<?php

require_once dirname(__FILE__) . '/../Mail/RFC822.php';
require_once 'PEAR.php';

$addresses = array(
    array('raw' => '"John Doe" <test@example.com>'),
    array('raw' => '"John Doe' . chr(92) . '" <test@example.com>'),
    array('raw' => '"John Doe' . chr(92) . chr(92) . '" <test@example.com>'),
    array('raw' => '"John Doe' . chr(92) . chr(92) . chr(92) . '" <test@example.com>'),
    array('raw' => '"John Doe' . chr(92) . chr(92) . chr(92) . chr(92) . '" <test@example.com>'),
    array('raw' => '"John Doe <test@example.com>'),
);

for ($i = 0; $i < count($addresses); $i++) {
    // construct the address
    $address = $addresses[$i]['raw'];
    $parsedAddresses = Mail_RFC822::parseAddressList($address);
    if (PEAR::isError($parsedAddresses)) {
        echo $address." :: Failed to validate\n";
    } else {
        echo $address." :: Parsed\n";
    }
}

--EXPECT--
"John Doe" <test@example.com> :: Parsed
"John Doe\" <test@example.com> :: Failed to validate
"John Doe\\" <test@example.com> :: Parsed
"John Doe\\\" <test@example.com> :: Failed to validate
"John Doe\\\\" <test@example.com> :: Parsed
"John Doe <test@example.com> :: Failed to validate
PK�a�\�x`(��"pear/test/Mail/tests/bug17317.phptnu�[���--TEST--
Mail_RFC822::parseAddressList invalid periods in mail address
--FILE--
<?php
require "Mail/RFC822.php";

$result[] = Mail_RFC822::parseAddressList('.name@example.com');
$result[] = Mail_RFC822::parseAddressList('name.@example.com');
$result[] = Mail_RFC822::parseAddressList('name..name@example.com');

foreach ($result as $r) {
    if (is_a($r, 'PEAR_Error')) {
        echo "OK\n";
    }
}
--EXPECT--
OK
OK
OK
PK�a�\*����pear/test/Mail/tests/9137.phptnu�[���--TEST--
Mail: Test for bug #9137
--FILE--
<?php

require_once dirname(__FILE__) . '/../Mail/RFC822.php';
require_once 'PEAR.php';

$addresses = array(
    array('name' => 'John Doe', 'email' => 'test@example.com'),
    array('name' => 'John Doe\\', 'email' => 'test@example.com'),
    array('name' => 'John "Doe', 'email' => 'test@example.com'),
    array('name' => 'John "Doe\\', 'email' => 'test@example.com'),
);

for ($i = 0; $i < count($addresses); $i++) {
    // construct the address
    $address = "\"" . addslashes($addresses[$i]['name']) . "\" ".
        "<".$addresses[$i]['email'].">";

    $parsedAddresses = Mail_RFC822::parseAddressList($address);
    if (is_a($parsedAddresses, 'PEAR_Error')) {
        echo $address." :: Failed to validate\n";
    } else {
        echo $address." :: Parsed\n";
    }
}

--EXPECT--
"John Doe" <test@example.com> :: Parsed
"John Doe\\" <test@example.com> :: Parsed
"John \"Doe" <test@example.com> :: Parsed
"John \"Doe\\" <test@example.com> :: Parsed
PK�a�\)f$�!! pear/test/Mail/tests/rfc822.phptnu�[���--TEST--
Mail_RFC822: Address Parsing
--FILE--
<?php
require_once 'Mail/RFC822.php';

$parser = new Mail_RFC822();

/* A simple, bare address. */
$address = 'user@example.com';
print_r($parser->parseAddressList($address, null, true, true));

/* Address groups. */
$address = 'My Group: "Richard" <richard@localhost> (A comment), ted@example.com (Ted Bloggs), Barney;';
print_r($parser->parseAddressList($address, null, true, true));

/* A valid address with spaces in the local part. */
$address = '<"Jon Parise"@php.net>';
print_r($parser->parseAddressList($address, null, true, true));

/* An invalid address with spaces in the local part. */
$address = '<Jon Parise@php.net>';
$result = $parser->parseAddressList($address, null, true, true);
if (is_a($result, 'PEAR_Error')) echo $result->getMessage() . "\n";

/* A valid address with an uncommon TLD. */
$address = 'jon@host.longtld';
$result = $parser->parseAddressList($address, null, true, true);
if (is_a($result, 'PEAR_Error')) echo $result->getMessage() . "\n";

--EXPECT--
Array
(
    [0] => stdClass Object
        (
            [personal] => 
            [comment] => Array
                (
                )

            [mailbox] => user
            [host] => example.com
        )

)
Array
(
    [0] => stdClass Object
        (
            [groupname] => My Group
            [addresses] => Array
                (
                    [0] => stdClass Object
                        (
                            [personal] => "Richard"
                            [comment] => Array
                                (
                                    [0] => A comment
                                )

                            [mailbox] => richard
                            [host] => localhost
                        )

                    [1] => stdClass Object
                        (
                            [personal] => 
                            [comment] => Array
                                (
                                    [0] => Ted Bloggs
                                )

                            [mailbox] => ted
                            [host] => example.com
                        )

                    [2] => stdClass Object
                        (
                            [personal] => 
                            [comment] => Array
                                (
                                )

                            [mailbox] => Barney
                            [host] => localhost
                        )

                )

        )

)
Array
(
    [0] => stdClass Object
        (
            [personal] => 
            [comment] => Array
                (
                )

            [mailbox] => "Jon Parise"
            [host] => php.net
        )

)
Validation failed for: <Jon Parise@php.net>
PK�a�\8x����"pear/test/Mail/tests/bug17178.phptnu�[���--TEST--
Mail_RFC822::parseAddressList does not accept RFC-valid group syntax
--FILE--
<?php
require "Mail/RFC822.php";

var_dump(Mail_RFC822::parseAddressList("empty-group:;","invalid",false,false)); 

--EXPECT--
array(0) {
} 
PK�a�\��q/��pear/test/Mail/tests/13659.phptnu�[���--TEST--
Mail: Test for bug #13659
--FILE--
<?php
//require_once dirname(__FILE__) . '/../Mail/RFC822.php';
require_once 'Mail/RFC822.php';
require_once 'PEAR.php';

$address = '"Test Student" <test@mydomain.com> (test)';
$parser = new Mail_RFC822();
$result = $parser->parseAddressList($address, 'anydomain.com', TRUE);

if (!PEAR::isError($result) && is_array($result) && is_object($result[0]))
    if ($result[0]->personal == '"Test Student"' &&
        $result[0]->mailbox == "test" &&
	$result[0]->host == "mydomain.com" &&
	is_array($result[0]->comment) && $result[0]->comment[0] == 'test')
    {
        print("OK");
    }


?>
--EXPECT--
OK
PK�a�\w�����$pear/test/Mail/tests/smtp_error.phptnu�[���--TEST--
Mail: SMTP Error Reporting
--SKIPIF--
<?php

require_once 'PEAR/Registry.php';
$registry = new PEAR_Registry();

if (!$registry->packageExists('Net_SMTP')) die("skip\n");
--FILE--
<?php
require_once 'Mail.php';

/* Reference a bogus SMTP server address to guarantee a connection failure. */
$params = array('host' => 'bogus.host.tld');

/* Create our SMTP-based mailer object. */
$mailer = Mail::factory('smtp', $params);

/* Attempt to send an empty message in order to trigger an error. */
$e = $mailer->send(array(), array(), '');
if (is_a($e, 'PEAR_Error')) {
     $err = $e->getMessage();
     if (preg_match('/Failed to connect to bogus.host.tld:25 \[SMTP: Failed to connect socket:.*/i', $err)) {
        echo "OK";
     }
}

--EXPECT--
OKPK�a�\+��hh:pear/test/Locale/Symfony/Component/Locale/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Locale Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�a�\�Ǫ���>pear/test/Locale/Symfony/Component/Locale/Tests/LocaleTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Tests;

use Symfony\Component\Intl\Intl;
use Symfony\Component\Intl\Util\IntlTestHelper;
use Symfony\Component\Locale\Locale;

/**
 * Test case for the {@link Locale} class.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class LocaleTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        // Locale extends \Locale, so intl must be present
        IntlTestHelper::requireIntl($this);
    }

    public function testGetDisplayCountries()
    {
        $countries = Locale::getDisplayCountries('en');
        $this->assertEquals('Brazil', $countries['BR']);
    }

    public function testGetCountries()
    {
        $countries = Locale::getCountries();
        $this->assertTrue(in_array('BR', $countries));
    }

    public function testGetDisplayLanguages()
    {
        $languages = Locale::getDisplayLanguages('en');
        $this->assertEquals('Brazilian Portuguese', $languages['pt_BR']);
    }

    public function testGetLanguages()
    {
        $languages = Locale::getLanguages();
        $this->assertTrue(in_array('pt_BR', $languages));
    }

    public function testGetDisplayLocales()
    {
        $locales = Locale::getDisplayLocales('en');
        $this->assertEquals('Portuguese', $locales['pt']);
    }

    public function testGetLocales()
    {
        $locales = Locale::getLocales();
        $this->assertTrue(in_array('pt', $locales));
    }
}
PK�a�\<��Gpear/test/Locale/Symfony/Component/Locale/Tests/Stub/StubLocaleTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Locale\Tests\Stub;

use Symfony\Component\Intl\Util\IntlTestHelper;
use Symfony\Component\Locale\Stub\StubLocale;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class StubLocaleTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        IntlTestHelper::requireIntl($this);

        parent::setUp();
    }

    public function testGetCurrenciesData()
    {
        $currencies = StubLocale::getCurrenciesData('en');
        $this->assertEquals('R$', $currencies['BRL']['symbol']);
        $this->assertEquals('Brazilian Real', $currencies['BRL']['name']);
        $this->assertEquals(2, $currencies['BRL']['fractionDigits']);
        $this->assertEquals(0, $currencies['BRL']['roundingIncrement']);
    }

    public function testGetDisplayCurrencies()
    {
        $currencies = StubLocale::getDisplayCurrencies('en');
        $this->assertEquals('Brazilian Real', $currencies['BRL']);

        // Checking that the cache is being used
        $currencies = StubLocale::getDisplayCurrencies('en');
        $this->assertEquals('Argentine Peso', $currencies['ARS']);
    }

    public function testGetCurrencies()
    {
        $currencies = StubLocale::getCurrencies();
        $this->assertTrue(in_array('BRL', $currencies));
    }
}
PK�a�\�)mmDpear/test/ClassLoader/Symfony/Component/ClassLoader/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony ClassLoader Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�a�\\|����Spear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader\Tests;

use Symfony\Component\ClassLoader\ClassMapGenerator;

class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var string $workspace
     */
    private $workspace = null;

    public function prepare_workspace()
    {
        $this->workspace = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.time().rand(0, 1000);
        mkdir($this->workspace, 0777, true);
        $this->workspace = realpath($this->workspace);
    }

    /**
     * @param string $file
     */
    private function clean($file)
    {
        if (is_dir($file) && !is_link($file)) {
            $dir = new \FilesystemIterator($file);
            foreach ($dir as $childFile) {
                $this->clean($childFile);
            }

            rmdir($file);
        } else {
            unlink($file);
        }
    }

    /**
     * @dataProvider getTestCreateMapTests
     */
    public function testDump($directory, $expected)
    {
        $this->prepare_workspace();

        $file = $this->workspace.'/file';

        $generator = new ClassMapGenerator();
        $generator->dump($directory, $file);
        $this->assertFileExists($file);

        $this->clean($this->workspace);
    }

    /**
     * @dataProvider getTestCreateMapTests
     */
    public function testCreateMap($directory, $expected)
    {
        $this->assertEqualsNormalized($expected, ClassMapGenerator::createMap($directory));
    }

    public function getTestCreateMapTests()
    {
        $data = array(
            array(__DIR__.'/Fixtures/Namespaced', array(
                'Namespaced\\Bar'          => realpath(__DIR__).'/Fixtures/Namespaced/Bar.php',
                'Namespaced\\Foo'          => realpath(__DIR__).'/Fixtures/Namespaced/Foo.php',
                'Namespaced\\Baz'          => realpath(__DIR__).'/Fixtures/Namespaced/Baz.php',
                'Namespaced\\WithComments' => realpath(__DIR__).'/Fixtures/Namespaced/WithComments.php',
                )
            ),
            array(__DIR__.'/Fixtures/beta/NamespaceCollision', array(
                'NamespaceCollision\\A\\B\\Bar' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Bar.php',
                'NamespaceCollision\\A\\B\\Foo' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Foo.php',
                'NamespaceCollision\\C\\B\\Bar' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/C/B/Bar.php',
                'NamespaceCollision\\C\\B\\Foo' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/C/B/Foo.php',
            )),
            array(__DIR__.'/Fixtures/Pearlike', array(
                'Pearlike_Foo'          => realpath(__DIR__).'/Fixtures/Pearlike/Foo.php',
                'Pearlike_Bar'          => realpath(__DIR__).'/Fixtures/Pearlike/Bar.php',
                'Pearlike_Baz'          => realpath(__DIR__).'/Fixtures/Pearlike/Baz.php',
                'Pearlike_WithComments' => realpath(__DIR__).'/Fixtures/Pearlike/WithComments.php',
            )),
            array(__DIR__.'/Fixtures/classmap', array(
                'Foo\\Bar\\A'             => realpath(__DIR__).'/Fixtures/classmap/sameNsMultipleClasses.php',
                'Foo\\Bar\\B'             => realpath(__DIR__).'/Fixtures/classmap/sameNsMultipleClasses.php',
                'A'                       => realpath(__DIR__).'/Fixtures/classmap/multipleNs.php',
                'Alpha\\A'                => realpath(__DIR__).'/Fixtures/classmap/multipleNs.php',
                'Alpha\\B'                => realpath(__DIR__).'/Fixtures/classmap/multipleNs.php',
                'Beta\\A'                 => realpath(__DIR__).'/Fixtures/classmap/multipleNs.php',
                'Beta\\B'                 => realpath(__DIR__).'/Fixtures/classmap/multipleNs.php',
                'ClassMap\\SomeInterface' => realpath(__DIR__).'/Fixtures/classmap/SomeInterface.php',
                'ClassMap\\SomeParent'    => realpath(__DIR__).'/Fixtures/classmap/SomeParent.php',
                'ClassMap\\SomeClass'     => realpath(__DIR__).'/Fixtures/classmap/SomeClass.php',
            )),
        );

        if (version_compare(PHP_VERSION, '5.4', '>=')) {
            $data[] = array(__DIR__.'/Fixtures/php5.4', array(
                'TFoo' => __DIR__.'/Fixtures/php5.4/traits.php',
                'CFoo' => __DIR__.'/Fixtures/php5.4/traits.php',
                'Foo\\TBar' => __DIR__.'/Fixtures/php5.4/traits.php',
                'Foo\\IBar' => __DIR__.'/Fixtures/php5.4/traits.php',
                'Foo\\TFooBar' => __DIR__.'/Fixtures/php5.4/traits.php',
                'Foo\\CBar' => __DIR__.'/Fixtures/php5.4/traits.php',
            ));
        }

        return $data;
    }

    public function testCreateMapFinderSupport()
    {
        $finder = new \Symfony\Component\Finder\Finder();
        $finder->files()->in(__DIR__.'/Fixtures/beta/NamespaceCollision');

        $this->assertEqualsNormalized(array(
            'NamespaceCollision\\A\\B\\Bar' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Bar.php',
            'NamespaceCollision\\A\\B\\Foo' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Foo.php',
            'NamespaceCollision\\C\\B\\Bar' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/C/B/Bar.php',
            'NamespaceCollision\\C\\B\\Foo' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/C/B/Foo.php',
        ), ClassMapGenerator::createMap($finder));
    }

    protected function assertEqualsNormalized($expected, $actual, $message = null)
    {
        foreach ($expected as $ns => $path) {
            $expected[$ns] = strtr($path, '\\', '/');
        }
        foreach ($actual as $ns => $path) {
            $actual[$ns] = strtr($path, '\\', '/');
        }
        $this->assertEquals($expected, $actual, $message);
    }
}
PK�a�\]�Q�� � Wpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/ClassCollectionLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader\Tests;

use Symfony\Component\ClassLoader\ClassCollectionLoader;

require_once __DIR__.'/Fixtures/ClassesWithParents/GInterface.php';
require_once __DIR__.'/Fixtures/ClassesWithParents/CInterface.php';
require_once __DIR__.'/Fixtures/ClassesWithParents/B.php';
require_once __DIR__.'/Fixtures/ClassesWithParents/A.php';

class ClassCollectionLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testTraitDependencies()
    {
        if (version_compare(phpversion(), '5.4', '<')) {
            $this->markTestSkipped('Requires PHP > 5.4');

            return;
        }

        require_once __DIR__.'/Fixtures/deps/traits.php';

        $r = new \ReflectionClass('Symfony\Component\ClassLoader\ClassCollectionLoader');
        $m = $r->getMethod('getOrderedClasses');
        $m->setAccessible(true);

        $ordered = $m->invoke('Symfony\Component\ClassLoader\ClassCollectionLoader', array('CTFoo'));

        $this->assertEquals(
            array('TD', 'TC', 'TB', 'TA', 'TZ', 'CTFoo'),
            array_map(function ($class) { return $class->getName(); }, $ordered)
        );

        $ordered = $m->invoke('Symfony\Component\ClassLoader\ClassCollectionLoader', array('CTBar'));

        $this->assertEquals(
            array('TD', 'TZ', 'TC', 'TB', 'TA', 'CTBar'),
            array_map(function ($class) { return $class->getName(); }, $ordered)
        );
    }

    /**
     * @dataProvider getDifferentOrders
     */
    public function testClassReordering(array $classes)
    {
        $expected = array(
            'ClassesWithParents\\GInterface',
            'ClassesWithParents\\CInterface',
            'ClassesWithParents\\B',
            'ClassesWithParents\\A',
        );

        $r = new \ReflectionClass('Symfony\Component\ClassLoader\ClassCollectionLoader');
        $m = $r->getMethod('getOrderedClasses');
        $m->setAccessible(true);

        $ordered = $m->invoke('Symfony\Component\ClassLoader\ClassCollectionLoader', $classes);

        $this->assertEquals($expected, array_map(function ($class) { return $class->getName(); }, $ordered));
    }

    public function getDifferentOrders()
    {
        return array(
            array(array(
                'ClassesWithParents\\A',
                'ClassesWithParents\\CInterface',
                'ClassesWithParents\\GInterface',
                'ClassesWithParents\\B',
            )),
            array(array(
                'ClassesWithParents\\B',
                'ClassesWithParents\\A',
                'ClassesWithParents\\CInterface',
            )),
            array(array(
                'ClassesWithParents\\CInterface',
                'ClassesWithParents\\B',
                'ClassesWithParents\\A',
            )),
            array(array(
                'ClassesWithParents\\A',
            )),
        );
    }

    /**
     * @dataProvider getDifferentOrdersForTraits
     */
    public function testClassWithTraitsReordering(array $classes)
    {
        if (version_compare(phpversion(), '5.4', '<')) {
            $this->markTestSkipped('Requires PHP > 5.4');

            return;
        }

        require_once __DIR__.'/Fixtures/ClassesWithParents/ATrait.php';
        require_once __DIR__.'/Fixtures/ClassesWithParents/BTrait.php';
        require_once __DIR__.'/Fixtures/ClassesWithParents/CTrait.php';
        require_once __DIR__.'/Fixtures/ClassesWithParents/D.php';
        require_once __DIR__.'/Fixtures/ClassesWithParents/E.php';

        $expected = array(
            'ClassesWithParents\\GInterface',
            'ClassesWithParents\\CInterface',
            'ClassesWithParents\\ATrait',
            'ClassesWithParents\\BTrait',
            'ClassesWithParents\\CTrait',
            'ClassesWithParents\\B',
            'ClassesWithParents\\A',
            'ClassesWithParents\\D',
            'ClassesWithParents\\E',
        );

        $r = new \ReflectionClass('Symfony\Component\ClassLoader\ClassCollectionLoader');
        $m = $r->getMethod('getOrderedClasses');
        $m->setAccessible(true);

        $ordered = $m->invoke('Symfony\Component\ClassLoader\ClassCollectionLoader', $classes);

        $this->assertEquals($expected, array_map(function ($class) { return $class->getName(); }, $ordered));
    }

    public function getDifferentOrdersForTraits()
    {
        return array(
            array(array(
                'ClassesWithParents\\E',
                'ClassesWithParents\\ATrait',
            )),
            array(array(
                'ClassesWithParents\\E',
            )),
        );
    }

    /**
     * @dataProvider getFixNamespaceDeclarationsData
     */
    public function testFixNamespaceDeclarations($source, $expected)
    {
        $this->assertEquals('<?php '.$expected, ClassCollectionLoader::fixNamespaceDeclarations('<?php '.$source));
    }

    public function getFixNamespaceDeclarationsData()
    {
        return array(
            array("namespace;\nclass Foo {}\n", "namespace\n{\nclass Foo {}\n}"),
            array("namespace Foo;\nclass Foo {}\n", "namespace Foo\n{\nclass Foo {}\n}"),
            array("namespace   Bar ;\nclass Foo {}\n", "namespace Bar\n{\nclass Foo {}\n}"),
            array("namespace Foo\Bar;\nclass Foo {}\n", "namespace Foo\Bar\n{\nclass Foo {}\n}"),
            array("namespace Foo\Bar\Bar\n{\nclass Foo {}\n}\n", "namespace Foo\Bar\Bar\n{\nclass Foo {}\n}"),
            array("namespace\n{\nclass Foo {}\n}\n", "namespace\n{\nclass Foo {}\n}"),
        );
    }

    /**
     * @dataProvider getFixNamespaceDeclarationsDataWithoutTokenizer
     */
    public function testFixNamespaceDeclarationsWithoutTokenizer($source, $expected)
    {
        ClassCollectionLoader::enableTokenizer(false);
        $this->assertEquals('<?php '.$expected, ClassCollectionLoader::fixNamespaceDeclarations('<?php '.$source));
        ClassCollectionLoader::enableTokenizer(true);
    }

    public function getFixNamespaceDeclarationsDataWithoutTokenizer()
    {
        return array(
            array("namespace;\nclass Foo {}\n", "namespace\n{\nclass Foo {}\n}\n"),
            array("namespace Foo;\nclass Foo {}\n", "namespace Foo\n{\nclass Foo {}\n}\n"),
            array("namespace   Bar ;\nclass Foo {}\n", "namespace   Bar\n{\nclass Foo {}\n}\n"),
            array("namespace Foo\Bar;\nclass Foo {}\n", "namespace Foo\Bar\n{\nclass Foo {}\n}\n"),
            array("namespace Foo\Bar\Bar\n{\nclass Foo {}\n}\n", "namespace Foo\Bar\Bar\n{\nclass Foo {}\n}\n"),
            array("namespace\n{\nclass Foo {}\n}\n", "namespace\n{\nclass Foo {}\n}\n"),
        );
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testUnableToLoadClassException()
    {
        if (is_file($file = sys_get_temp_dir().'/foo.php')) {
            unlink($file);
        }

        ClassCollectionLoader::load(array('SomeNotExistingClass'), sys_get_temp_dir(), 'foo', false);
    }

    public function testCommentStripping()
    {
        if (is_file($file = sys_get_temp_dir().'/bar.php')) {
            unlink($file);
        }
        spl_autoload_register($r = function ($class) {
            if (0 === strpos($class, 'Namespaced') || 0 === strpos($class, 'Pearlike_')) {
                require_once __DIR__.'/Fixtures/'.str_replace(array('\\', '_'), '/', $class).'.php';
            }
        });

        ClassCollectionLoader::load(
            array('Namespaced\\WithComments', 'Pearlike_WithComments'),
            sys_get_temp_dir(),
            'bar',
            false
        );

        spl_autoload_unregister($r);

        $this->assertEquals(<<<EOF
namespace Namespaced
{
class WithComments
{
public static \$loaded = true;
}
\$string ='string shoult not be   modified {\$string}';
\$heredoc = (<<<HD


Heredoc should not be   modified {\$string}


HD
);
\$nowdoc =<<<'ND'


Nowdoc should not be   modified {\$string}


ND
;
}
namespace
{
class Pearlike_WithComments
{
public static \$loaded = true;
}
}
EOF
        , str_replace("<?php \n", '', file_get_contents($file)));

        unlink($file);
    }
}
PK�a�\e:{a��Ypear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader\Tests;

use Symfony\Component\ClassLoader\ApcUniversalClassLoader;

class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        if (!extension_loaded('apc')) {
            $this->markTestSkipped('The apc extension is not available.');
        }

        if (!(ini_get('apc.enabled') && ini_get('apc.enable_cli'))) {
            $this->markTestSkipped('The apc extension is available, but not enabled.');
        } else {
            apc_clear_cache('user');
        }
    }

    protected function tearDown()
    {
        if (ini_get('apc.enabled') && ini_get('apc.enable_cli')) {
            apc_clear_cache('user');
        }
    }

    public function testConstructor()
    {
        $loader = new ApcUniversalClassLoader('test.prefix.');
        $loader->registerNamespace('Apc\Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');

        $this->assertEquals($loader->findFile('\Apc\Namespaced\FooBar'), apc_fetch('test.prefix.\Apc\Namespaced\FooBar'), '__construct() takes a prefix as its first argument');
    }

   /**
    * @dataProvider getLoadClassTests
    */
   public function testLoadClass($className, $testClassName, $message)
   {
       $loader = new ApcUniversalClassLoader('test.prefix.');
       $loader->registerNamespace('Apc\Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
       $loader->registerPrefix('Apc_Pearlike_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
       $loader->loadClass($testClassName);
       $this->assertTrue(class_exists($className), $message);
   }

   public function getLoadClassTests()
   {
       return array(
           array('\\Apc\\Namespaced\\Foo', '\\Apc\\Namespaced\\Foo',   '->loadClass() loads Apc\Namespaced\Foo class'),
           array('Apc_Pearlike_Foo',    'Apc_Pearlike_Foo',      '->loadClass() loads Apc_Pearlike_Foo class'),
           array('\\Apc\\Namespaced\\Bar', '\\Apc\\Namespaced\\Bar', '->loadClass() loads Apc\Namespaced\Bar class with a leading slash'),
           array('Apc_Pearlike_Bar',    '\\Apc_Pearlike_Bar',    '->loadClass() loads Apc_Pearlike_Bar class with a leading slash'),
       );
   }

   /**
    * @dataProvider getLoadClassFromFallbackTests
    */
   public function testLoadClassFromFallback($className, $testClassName, $message)
   {
       $loader = new ApcUniversalClassLoader('test.prefix.fallback');
       $loader->registerNamespace('Apc\Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
       $loader->registerPrefix('Apc_Pearlike_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
       $loader->registerNamespaceFallbacks(array(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/fallback'));
       $loader->registerPrefixFallbacks(array(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/fallback'));
       $loader->loadClass($testClassName);
       $this->assertTrue(class_exists($className), $message);
   }

   public function getLoadClassFromFallbackTests()
   {
       return array(
           array('\\Apc\\Namespaced\\Baz',    '\\Apc\\Namespaced\\Baz',    '->loadClass() loads Apc\Namespaced\Baz class'),
           array('Apc_Pearlike_Baz',       'Apc_Pearlike_Baz',       '->loadClass() loads Apc_Pearlike_Baz class'),
           array('\\Apc\\Namespaced\\FooBar', '\\Apc\\Namespaced\\FooBar', '->loadClass() loads Apc\Namespaced\Baz class from fallback dir'),
           array('Apc_Pearlike_FooBar',    'Apc_Pearlike_FooBar',    '->loadClass() loads Apc_Pearlike_Baz class from fallback dir'),
       );
   }

   /**
    * @dataProvider getLoadClassNamespaceCollisionTests
    */
   public function testLoadClassNamespaceCollision($namespaces, $className, $message)
   {
       $loader = new ApcUniversalClassLoader('test.prefix.collision.');
       $loader->registerNamespaces($namespaces);

       $loader->loadClass($className);

       $this->assertTrue(class_exists($className), $message);
   }

   public function getLoadClassNamespaceCollisionTests()
   {
       return array(
           array(
               array(
                   'Apc\\NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
                   'Apc\\NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
               ),
               '\Apc\NamespaceCollision\A\Foo',
               '->loadClass() loads NamespaceCollision\A\Foo from alpha.',
           ),
           array(
               array(
                   'Apc\\NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
                   'Apc\\NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
               ),
               '\Apc\NamespaceCollision\A\Bar',
               '->loadClass() loads NamespaceCollision\A\Bar from alpha.',
           ),
           array(
               array(
                   'Apc\\NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
                   'Apc\\NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
               ),
               '\Apc\NamespaceCollision\A\B\Foo',
               '->loadClass() loads NamespaceCollision\A\B\Foo from beta.',
           ),
           array(
               array(
                   'Apc\\NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta',
                   'Apc\\NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha',
               ),
               '\Apc\NamespaceCollision\A\B\Bar',
               '->loadClass() loads NamespaceCollision\A\B\Bar from beta.',
           ),
       );
   }

   /**
    * @dataProvider getLoadClassPrefixCollisionTests
    */
   public function testLoadClassPrefixCollision($prefixes, $className, $message)
   {
       $loader = new ApcUniversalClassLoader('test.prefix.collision.');
       $loader->registerPrefixes($prefixes);

       $loader->loadClass($className);
       $this->assertTrue(class_exists($className), $message);
   }

   public function getLoadClassPrefixCollisionTests()
   {
       return array(
           array(
               array(
                   'ApcPrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
                   'ApcPrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
               ),
               'ApcPrefixCollision_A_Foo',
               '->loadClass() loads ApcPrefixCollision_A_Foo from alpha.',
           ),
           array(
               array(
                   'ApcPrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
                   'ApcPrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
               ),
               'ApcPrefixCollision_A_Bar',
               '->loadClass() loads ApcPrefixCollision_A_Bar from alpha.',
           ),
           array(
               array(
                   'ApcPrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
                   'ApcPrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
               ),
               'ApcPrefixCollision_A_B_Foo',
               '->loadClass() loads ApcPrefixCollision_A_B_Foo from beta.',
           ),
           array(
               array(
                   'ApcPrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/beta/Apc',
                   'ApcPrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc',
               ),
               'ApcPrefixCollision_A_B_Bar',
               '->loadClass() loads ApcPrefixCollision_A_B_Bar from beta.',
           ),
       );
   }
}
PK�a�\�M��� � Mpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/ClassLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader\Tests;

use Symfony\Component\ClassLoader\ClassLoader;

class ClassLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testGetPrefixes()
    {
        $loader = new ClassLoader();
        $loader->addPrefix('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->addPrefix('Bar', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->addPrefix('Bas', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $prefixes = $loader->getPrefixes();
        $this->assertArrayHasKey('Foo', $prefixes);
        $this->assertArrayNotHasKey('Foo1', $prefixes);
        $this->assertArrayHasKey('Bar', $prefixes);
        $this->assertArrayHasKey('Bas', $prefixes);
    }

    public function testGetFallbackDirs()
    {
        $loader = new ClassLoader();
        $loader->addPrefix(null, __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->addPrefix(null, __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $fallback_dirs = $loader->getFallbackDirs();
        $this->assertCount(2, $fallback_dirs);
    }

    /**
     * @dataProvider getLoadClassTests
     */
    public function testLoadClass($className, $testClassName, $message)
    {
        $loader = new ClassLoader();
        $loader->addPrefix('Namespaced2\\', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->addPrefix('Pearlike2_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->loadClass($testClassName);
        $this->assertTrue(class_exists($className), $message);
    }

    public function getLoadClassTests()
    {
        return array(
            array('\\Namespaced2\\Foo', 'Namespaced2\\Foo',   '->loadClass() loads Namespaced2\Foo class'),
            array('\\Pearlike2_Foo',    'Pearlike2_Foo',      '->loadClass() loads Pearlike2_Foo class'),
        );
    }

    /**
     * @dataProvider getLoadNonexistentClassTests
     */
    public function testLoadNonexistentClass($className, $testClassName, $message)
    {
        $loader = new ClassLoader();
        $loader->addPrefix('Namespaced2\\', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->addPrefix('Pearlike2_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->loadClass($testClassName);
        $this->assertFalse(class_exists($className), $message);
    }

    public function getLoadNonexistentClassTests()
    {
        return array(
            array('\\Pearlike3_Bar', '\\Pearlike3_Bar', '->loadClass() loads non existing Pearlike3_Bar class with a leading slash'),
        );
    }

    public function testAddPrefix()
    {
        $loader = new ClassLoader();
        $loader->addPrefix('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->addPrefix('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $prefixes = $loader->getPrefixes();
        $this->assertArrayHasKey('Foo', $prefixes);
        $this->assertCount(2, $prefixes['Foo']);
    }

    public function testUseIncludePath()
    {
        $loader = new ClassLoader();
        $this->assertFalse($loader->getUseIncludePath());

        $this->assertNull($loader->findFile('Foo'));

        $includePath = get_include_path();

        $loader->setUseIncludePath(true);
        $this->assertTrue($loader->getUseIncludePath());

        set_include_path(__DIR__.'/Fixtures/includepath'.PATH_SEPARATOR.$includePath);

        $this->assertEquals(__DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'includepath'.DIRECTORY_SEPARATOR.'Foo.php', $loader->findFile('Foo'));

        set_include_path($includePath);
    }

    /**
     * @dataProvider getLoadClassFromFallbackTests
     */
    public function testLoadClassFromFallback($className, $testClassName, $message)
    {
        $loader = new ClassLoader();
        $loader->addPrefix('Namespaced2\\', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->addPrefix('Pearlike2_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->addPrefix('', array(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/fallback'));
        $loader->loadClass($testClassName);
        $this->assertTrue(class_exists($className), $message);
    }

    public function getLoadClassFromFallbackTests()
    {
        return array(
            array('\\Namespaced2\\Baz',    'Namespaced2\\Baz',    '->loadClass() loads Namespaced2\Baz class'),
            array('\\Pearlike2_Baz',       'Pearlike2_Baz',       '->loadClass() loads Pearlike2_Baz class'),
            array('\\Namespaced2\\FooBar', 'Namespaced2\\FooBar', '->loadClass() loads Namespaced2\Baz class from fallback dir'),
            array('\\Pearlike2_FooBar',    'Pearlike2_FooBar',    '->loadClass() loads Pearlike2_Baz class from fallback dir'),
        );
    }

    /**
     * @dataProvider getLoadClassNamespaceCollisionTests
     */
    public function testLoadClassNamespaceCollision($namespaces, $className, $message)
    {
        $loader = new ClassLoader();
        $loader->addPrefixes($namespaces);

        $loader->loadClass($className);
        $this->assertTrue(class_exists($className), $message);
    }

    public function getLoadClassNamespaceCollisionTests()
    {
        return array(
            array(
                array(
                    'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                    'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                ),
                'NamespaceCollision\C\Foo',
                '->loadClass() loads NamespaceCollision\C\Foo from alpha.',
            ),
            array(
                array(
                    'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                    'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                ),
                'NamespaceCollision\C\Bar',
                '->loadClass() loads NamespaceCollision\C\Bar from alpha.',
            ),
            array(
                array(
                    'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                    'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                ),
                'NamespaceCollision\C\B\Foo',
                '->loadClass() loads NamespaceCollision\C\B\Foo from beta.',
            ),
            array(
                array(
                    'NamespaceCollision\\C\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                    'NamespaceCollision\\C' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                ),
                'NamespaceCollision\C\B\Bar',
                '->loadClass() loads NamespaceCollision\C\B\Bar from beta.',
            ),
            array(
                array(
                    'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                    'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                ),
                'PrefixCollision_C_Foo',
                '->loadClass() loads PrefixCollision_C_Foo from alpha.',
            ),
            array(
                array(
                    'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                    'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                ),
                'PrefixCollision_C_Bar',
                '->loadClass() loads PrefixCollision_C_Bar from alpha.',
            ),
            array(
                array(
                    'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                    'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                ),
                'PrefixCollision_C_B_Foo',
                '->loadClass() loads PrefixCollision_C_B_Foo from beta.',
            ),
            array(
                array(
                    'PrefixCollision_C_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                    'PrefixCollision_C_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                ),
                'PrefixCollision_C_B_Bar',
                '->loadClass() loads PrefixCollision_C_B_Bar from beta.',
            ),
        );
    }
}
PK�a�\P�F\KKcpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Foo.phpnu�[���<?php

class PrefixCollision_C_B_Foo
{
    public static $loaded = true;
}
PK�a�\�{�tKKcpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/C/B/Bar.phpnu�[���<?php

class PrefixCollision_C_B_Bar
{
    public static $loaded = true;
}
PK�a�\v�գKKcpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Foo.phpnu�[���<?php

class PrefixCollision_A_B_Foo
{
    public static $loaded = true;
}
PK�a�\�Lk�KKcpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/PrefixCollision/A/B/Bar.phpnu�[���<?php

class PrefixCollision_A_B_Bar
{
    public static $loaded = true;
}
PK�a�\LVAKZZfpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Foo.phpnu�[���<?php

namespace NamespaceCollision\C\B;

class Foo
{
    public static $loaded = true;
}
PK�a�\��cZZfpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/C/B/Bar.phpnu�[���<?php

namespace NamespaceCollision\C\B;

class Bar
{
    public static $loaded = true;
}
PK�a�\����AAfpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Foo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace NamespaceCollision\A\B;

class Foo
{
    public static $loaded = true;
}
PK�a�\Ka�AAfpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/beta/NamespaceCollision/A/B/Bar.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace NamespaceCollision\A\B;

class Bar
{
    public static $loaded = true;
}
PK�a�\�d�Vpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/includepath/Foo.phpnu�[���<?php

class Foo
{
}
PK�a�\	���IIbpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Foo.phpnu�[���<?php

class PrefixCollision_C_Foo
{
    public static $loaded = true;
}
PK�a�\�6S�IIbpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/C/Bar.phpnu�[���<?php

class PrefixCollision_C_Bar
{
    public static $loaded = true;
}
PK�a�\���IIbpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Foo.phpnu�[���<?php

class PrefixCollision_A_Foo
{
    public static $loaded = true;
}
PK�a�\&F�IIbpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/PrefixCollision/A/Bar.phpnu�[���<?php

class PrefixCollision_A_Bar
{
    public static $loaded = true;
}
PK�a�\~�(XXepear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Foo.phpnu�[���<?php

namespace NamespaceCollision\C;

class Foo
{
    public static $loaded = true;
}
PK�a�\�]�>XXepear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/C/Bar.phpnu�[���<?php

namespace NamespaceCollision\C;

class Bar
{
    public static $loaded = true;
}
PK�a�\���i??epear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Foo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace NamespaceCollision\A;

class Foo
{
    public static $loaded = true;
}
PK�a�\99A??epear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/alpha/NamespaceCollision/A/Bar.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace NamespaceCollision\A;

class Bar
{
    public static $loaded = true;
}
PK�a�\d�0OOVpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Foo.phpnu�[���<?php

namespace Namespaced2;

class Foo
{
    public static $loaded = true;
}
PK�a�\��@OOVpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Bar.phpnu�[���<?php

namespace Namespaced2;

class Bar
{
    public static $loaded = true;
}
PK�a�\
Z3bOOVpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced2/Baz.phpnu�[���<?php

namespace Namespaced2;

class Baz
{
    public static $loaded = true;
}
PK�a�\��R�55Upear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Foo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Namespaced;

class Foo
{
    public static $loaded = true;
}
PK�a�\��55Upear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Bar.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Namespaced;

class Bar
{
    public static $loaded = true;
}
PK�a�\ᒟ�55Upear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/Baz.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Namespaced;

class Baz
{
    public static $loaded = true;
}
PK�a�\�UX�^pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Namespaced/WithComments.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Namespaced;

class WithComments
{
    /** @Boolean */
    public static $loaded = true;
}

$string = 'string shoult not be   modified {$string}';

$heredoc = (<<<HD


Heredoc should not be   modified {$string}


HD
);

$nowdoc = <<<'ND'


Nowdoc should not be   modified {$string}


ND;
PK�a�\���GNNnpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Foo.phpnu�[���<?php

class ApcPrefixCollision_A_B_Foo
{
    public static $loaded = true;
}
PK�a�\>\oNNnpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/ApcPrefixCollision/A/B/Bar.phpnu�[���<?php

class ApcPrefixCollision_A_B_Bar
{
    public static $loaded = true;
}
PK�a�\]�[�EEnpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Foo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Apc\NamespaceCollision\A\B;

class Foo
{
    public static $loaded = true;
}
PK�a�\�F�EEnpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/beta/Apc/NamespaceCollision/A/B/Bar.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Apc\NamespaceCollision\A\B;

class Bar
{
    public static $loaded = true;
}
PK�a�\.��&LLmpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Foo.phpnu�[���<?php

class ApcPrefixCollision_A_Foo
{
    public static $loaded = true;
}
PK�a�\�7LLmpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/ApcPrefixCollision/A/Bar.phpnu�[���<?php

class ApcPrefixCollision_A_Bar
{
    public static $loaded = true;
}
PK�a�\�qo�CCmpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Foo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Apc\NamespaceCollision\A;

class Foo
{
    public static $loaded = true;
}
PK�a�\4���CCmpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/alpha/Apc/NamespaceCollision/A/Bar.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Apc\NamespaceCollision\A;

class Bar
{
    public static $loaded = true;
}
PK�a�\/5�<<\pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/FooBar.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Apc\Namespaced;

class FooBar
{
    public static $loaded = true;
}
PK�a�\0- +99Ypear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Foo.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Apc\Namespaced;

class Foo
{
    public static $loaded = true;
}
PK�a�\ے�99Ypear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Bar.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Apc\Namespaced;

class Bar
{
    public static $loaded = true;
}
PK�a�\$�y99Ypear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Namespaced/Baz.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Apc\Namespaced;

class Baz
{
    public static $loaded = true;
}
PK�a�\���EDDWpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Foo.phpnu�[���<?php

class Apc_Pearlike_Foo
{
    public static $loaded = true;
}
PK�a�\yQUmDDWpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Bar.phpnu�[���<?php

class Apc_Pearlike_Bar
{
    public static $loaded = true;
}
PK�a�\��&DDWpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/Pearlike/Baz.phpnu�[���<?php

class Apc_Pearlike_Baz
{
    public static $loaded = true;
}
PK�a�\/5�<<epear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Namespaced/FooBar.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Apc\Namespaced;

class FooBar
{
    public static $loaded = true;
}
PK�a�\���GGgpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Apc/fallback/Apc/Pearlike/FooBar.phpnu�[���<?php

class Apc_Pearlike_FooBar
{
    public static $loaded = true;
}
PK�a�\:5T+Tpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.phpnu�[���<?php
namespace {
    trait TFoo
    {
    }

    class CFoo
    {
        use TFoo;
    }
}

namespace Foo {
    trait TBar
    {
    }

    interface IBar
    {
    }

    trait TFooBar
    {
    }

    class CBar implements IBar
    {
        use TBar, TFooBar;
    }
}
PK�a�\���	AATpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Foo.phpnu�[���<?php

class Pearlike2_Foo
{
    public static $loaded = true;
}
PKb�\h4A!AATpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Bar.phpnu�[���<?php

class Pearlike2_Bar
{
    public static $loaded = true;
}
PKb�\��2[AATpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike2/Baz.phpnu�[���<?php

class Pearlike2_Baz
{
    public static $loaded = true;
}
PKb�\�Ӽ�@@Spear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Foo.phpnu�[���<?php

class Pearlike_Foo
{
    public static $loaded = true;
}
PKb�\l�@@Spear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Bar.phpnu�[���<?php

class Pearlike_Bar
{
    public static $loaded = true;
}
PKb�\��q�@@Spear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/Baz.phpnu�[���<?php

class Pearlike_Baz
{
    public static $loaded = true;
}
PKb�\5J�DD\pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/Pearlike/WithComments.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

class Pearlike_WithComments
{
    /** @Boolean */
    public static $loaded = true;
}
PKb�\�gy�RRbpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced2/FooBar.phpnu�[���<?php

namespace Namespaced2;

class FooBar
{
    public static $loaded = true;
}
PKb�\[�“88apear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Namespaced/FooBar.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Namespaced;

class FooBar
{
    public static $loaded = true;
}
PKb�\n��DD`pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike2/FooBar.phpnu�[���<?php

class Pearlike2_FooBar
{
    public static $loaded = true;
}
PKb�\x�wCC_pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/fallback/Pearlike/FooBar.phpnu�[���<?php

class Pearlike_FooBar
{
    public static $loaded = true;
}
PKb�\���Z??dpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/GInterface.phpnu�[���<?php

namespace ClassesWithParents;

interface GInterface
{
}
PKb�\��HGG`pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/BTrait.phpnu�[���<?php

namespace ClassesWithParents;

trait BTrait
{
    use ATrait;
}
PKb�\��;;[pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.phpnu�[���<?php

namespace ClassesWithParents;

class A extends B {}
PKb�\t��LL[pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/E.phpnu�[���<?php

namespace ClassesWithParents;

class E extends D
{
    use CTrait;
}
PKb�\��LqGG[pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.phpnu�[���<?php

namespace ClassesWithParents;

class B implements CInterface {}
PKb�\�
N�77`pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/ATrait.phpnu�[���<?php

namespace ClassesWithParents;

trait ATrait
{
}
PKb�\ ��LL[pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/D.phpnu�[���<?php

namespace ClassesWithParents;

class D extends A
{
    use BTrait;
}
PKb�\��`�RRdpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CInterface.phpnu�[���<?php

namespace ClassesWithParents;

interface CInterface extends GInterface
{
}
PKb�\[�"�77`pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/CTrait.phpnu�[���<?php

namespace ClassesWithParents;

trait CTrait
{
}
PKb�\�R��Ypear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notPhpFile.mdnu�[���This file should be skipped.
PKb�\.~�oDDYpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace ClassMap;

class SomeClass extends SomeParent implements SomeInterface
{

}
PKb�\�֡Z  ]pear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace ClassMap;

interface SomeInterface
{

}
PKb�\�Cq�""Zpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace ClassMap;

abstract class SomeParent
{

}
PKb�\�Қepear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Foo\Bar;

class A {}
class B {}
PK	b�\��iYpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/notAClass.phpnu�[���<?php

$a = new stdClass();
PK	b�\KG9Ո�Zpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.phpnu�[���<?php
namespace {
    class A {}
}

namespace Alpha {
    class A {}
    class B {}
}

namespace Beta {
    class A {}
    class B {}
}
PK	b�\�>�X��Rpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.phpnu�[���<?php

trait TD
{}

trait TZ
{
    use TD;
}

trait TC
{
    use TD;
}

trait TB
{
    use TC;
}

trait TA
{
    use TB;
}

class CTFoo
{
    use TA;
    use TZ;
}

class CTBar
{
    use TZ;
    use TA;
}
PK	b�\8`�##Vpear/test/ClassLoader/Symfony/Component/ClassLoader/Tests/UniversalClassLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\ClassLoader\Tests;

use Symfony\Component\ClassLoader\UniversalClassLoader;

class UniversalClassLoaderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getLoadClassTests
     */
    public function testLoadClass($className, $testClassName, $message)
    {
        $loader = new UniversalClassLoader();
        $loader->registerNamespace('Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->registerPrefix('Pearlike_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $this->assertTrue($loader->loadClass($testClassName));
        $this->assertTrue(class_exists($className), $message);
    }

    public function getLoadClassTests()
    {
        return array(
            array('\\Namespaced\\Foo', 'Namespaced\\Foo',   '->loadClass() loads Namespaced\Foo class'),
            array('\\Pearlike_Foo',    'Pearlike_Foo',      '->loadClass() loads Pearlike_Foo class'),
        );
    }

    public function testUseIncludePath()
    {
        $loader = new UniversalClassLoader();
        $this->assertFalse($loader->getUseIncludePath());

        $this->assertNull($loader->findFile('Foo'));

        $includePath = get_include_path();

        $loader->useIncludePath(true);
        $this->assertTrue($loader->getUseIncludePath());

        set_include_path(__DIR__.'/Fixtures/includepath'.PATH_SEPARATOR.$includePath);

        $this->assertEquals(__DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'includepath'.DIRECTORY_SEPARATOR.'Foo.php', $loader->findFile('Foo'));

        set_include_path($includePath);
    }

    public function testGetNamespaces()
    {
        $loader = new UniversalClassLoader();
        $loader->registerNamespace('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->registerNamespace('Bar', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->registerNamespace('Bas', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $namespaces = $loader->getNamespaces();
        $this->assertArrayHasKey('Foo', $namespaces);
        $this->assertArrayNotHasKey('Foo1', $namespaces);
        $this->assertArrayHasKey('Bar', $namespaces);
        $this->assertArrayHasKey('Bas', $namespaces);
    }

    public function testGetPrefixes()
    {
        $loader = new UniversalClassLoader();
        $loader->registerPrefix('Foo', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->registerPrefix('Bar', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->registerPrefix('Bas', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $prefixes = $loader->getPrefixes();
        $this->assertArrayHasKey('Foo', $prefixes);
        $this->assertArrayNotHasKey('Foo1', $prefixes);
        $this->assertArrayHasKey('Bar', $prefixes);
        $this->assertArrayHasKey('Bas', $prefixes);
    }

    /**
     * @dataProvider getLoadClassFromFallbackTests
     */
    public function testLoadClassFromFallback($className, $testClassName, $message)
    {
        $loader = new UniversalClassLoader();
        $loader->registerNamespace('Namespaced', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->registerPrefix('Pearlike_', __DIR__.DIRECTORY_SEPARATOR.'Fixtures');
        $loader->registerNamespaceFallbacks(array(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/fallback'));
        $loader->registerPrefixFallbacks(array(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/fallback'));
        $this->assertTrue($loader->loadClass($testClassName));
        $this->assertTrue(class_exists($className), $message);
    }

    public function getLoadClassFromFallbackTests()
    {
        return array(
            array('\\Namespaced\\Baz',    'Namespaced\\Baz',    '->loadClass() loads Namespaced\Baz class'),
            array('\\Pearlike_Baz',       'Pearlike_Baz',       '->loadClass() loads Pearlike_Baz class'),
            array('\\Namespaced\\FooBar', 'Namespaced\\FooBar', '->loadClass() loads Namespaced\Baz class from fallback dir'),
            array('\\Pearlike_FooBar',    'Pearlike_FooBar',    '->loadClass() loads Pearlike_Baz class from fallback dir'),
        );
    }

    public function testRegisterPrefixFallback()
    {
        $loader = new UniversalClassLoader();
        $loader->registerPrefixFallback(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/fallback');
        $this->assertEquals(array(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/fallback'), $loader->getPrefixFallbacks());
    }

    public function testRegisterNamespaceFallback()
    {
        $loader = new UniversalClassLoader();
        $loader->registerNamespaceFallback(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/Namespaced/fallback');
        $this->assertEquals(array(__DIR__.DIRECTORY_SEPARATOR.'Fixtures/Namespaced/fallback'), $loader->getNamespaceFallbacks());
    }

    /**
     * @dataProvider getLoadClassNamespaceCollisionTests
     */
    public function testLoadClassNamespaceCollision($namespaces, $className, $message)
    {
        $loader = new UniversalClassLoader();
        $loader->registerNamespaces($namespaces);

        $this->assertTrue($loader->loadClass($className));
        $this->assertTrue(class_exists($className), $message);
    }

    public function getLoadClassNamespaceCollisionTests()
    {
        return array(
            array(
                array(
                    'NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                    'NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                ),
                'NamespaceCollision\A\Foo',
                '->loadClass() loads NamespaceCollision\A\Foo from alpha.',
            ),
            array(
                array(
                    'NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                    'NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                ),
                'NamespaceCollision\A\Bar',
                '->loadClass() loads NamespaceCollision\A\Bar from alpha.',
            ),
            array(
                array(
                    'NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                    'NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                ),
                'NamespaceCollision\A\B\Foo',
                '->loadClass() loads NamespaceCollision\A\B\Foo from beta.',
            ),
            array(
                array(
                    'NamespaceCollision\\A\\B' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                    'NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                ),
                'NamespaceCollision\A\B\Bar',
                '->loadClass() loads NamespaceCollision\A\B\Bar from beta.',
            ),
        );
    }

    /**
     * @dataProvider getLoadClassPrefixCollisionTests
     */
    public function testLoadClassPrefixCollision($prefixes, $className, $message)
    {
        $loader = new UniversalClassLoader();
        $loader->registerPrefixes($prefixes);

        $this->assertTrue($loader->loadClass($className));
        $this->assertTrue(class_exists($className), $message);
    }

    public function getLoadClassPrefixCollisionTests()
    {
        return array(
            array(
                array(
                    'PrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                    'PrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                ),
                'PrefixCollision_A_Foo',
                '->loadClass() loads PrefixCollision_A_Foo from alpha.',
            ),
            array(
                array(
                    'PrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                    'PrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                ),
                'PrefixCollision_A_Bar',
                '->loadClass() loads PrefixCollision_A_Bar from alpha.',
            ),
            array(
                array(
                    'PrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                    'PrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                ),
                'PrefixCollision_A_B_Foo',
                '->loadClass() loads PrefixCollision_A_B_Foo from beta.',
            ),
            array(
                array(
                    'PrefixCollision_A_B_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/beta',
                    'PrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/alpha',
                ),
                'PrefixCollision_A_B_Bar',
                '->loadClass() loads PrefixCollision_A_B_Bar from beta.',
            ),
        );
    }
}
PK
b�\���uuTpear/test/DependencyInjection/Symfony/Component/DependencyInjection/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony DependencyInjection Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK
b�\`��=�	�	epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Extension/ExtensionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Extension;

class ExtensionTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getResolvedEnabledFixtures
     */
    public function testIsConfigEnabledReturnsTheResolvedValue($enabled)
    {
        $pb = $this->getMockBuilder('Symfony\Component\DependencyInjection\ParameterBag\ParameterBag')
            ->setMethods(array('resolveValue'))
            ->getMock()
        ;

        $container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')
            ->setMethods(array('getParameterBag'))
            ->getMock()
        ;

        $pb->expects($this->once())
            ->method('resolveValue')
            ->with($this->equalTo($enabled))
            ->will($this->returnValue($enabled))
        ;

        $container->expects($this->once())
            ->method('getParameterBag')
            ->will($this->returnValue($pb))
        ;

        $extension = $this->getMockBuilder('Symfony\Component\DependencyInjection\Extension\Extension')
            ->setMethods(array())
            ->getMockForAbstractClass()
        ;

        $r = new \ReflectionMethod('Symfony\Component\DependencyInjection\Extension\Extension', 'isConfigEnabled');
        $r->setAccessible(true);

        $r->invoke($extension, $container, array('enabled' => $enabled));
    }

    public function getResolvedEnabledFixtures()
    {
        return array(
            array(true),
            array(false)
        );
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
     * @expectedExceptionMessage The config array has no 'enabled' key.
     */
    public function testIsConfigEnabledOnNonEnableableConfig()
    {
        $container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')
            ->getMock()
        ;

        $extension = $this->getMockBuilder('Symfony\Component\DependencyInjection\Extension\Extension')
            ->setMethods(array())
            ->getMockForAbstractClass()
        ;

        $r = new \ReflectionMethod('Symfony\Component\DependencyInjection\Extension\Extension', 'isConfigEnabled');
        $r->setAccessible(true);

        $r->invoke($extension, $container, array());
    }
}
PKb�\+��E�
�
epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/DefinitionDecoratorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests;

use Symfony\Component\DependencyInjection\DefinitionDecorator;

class DefinitionDecoratorTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $def = new DefinitionDecorator('foo');

        $this->assertEquals('foo', $def->getParent());
        $this->assertEquals(array(), $def->getChanges());
    }

    /**
     * @dataProvider getPropertyTests
     */
    public function testSetProperty($property, $changeKey)
    {
        $def = new DefinitionDecorator('foo');

        $getter = 'get'.ucfirst($property);
        $setter = 'set'.ucfirst($property);

        $this->assertNull($def->$getter());
        $this->assertSame($def, $def->$setter('foo'));
        $this->assertEquals('foo', $def->$getter());
        $this->assertEquals(array($changeKey => true), $def->getChanges());
    }

    public function getPropertyTests()
    {
        return array(
            array('class', 'class'),
            array('factoryClass', 'factory_class'),
            array('factoryMethod', 'factory_method'),
            array('factoryService', 'factory_service'),
            array('configurator', 'configurator'),
            array('file', 'file'),
        );
    }

    public function testSetPublic()
    {
        $def = new DefinitionDecorator('foo');

        $this->assertTrue($def->isPublic());
        $this->assertSame($def, $def->setPublic(false));
        $this->assertFalse($def->isPublic());
        $this->assertEquals(array('public' => true), $def->getChanges());
    }

    public function testSetLazy()
    {
        $def = new DefinitionDecorator('foo');

        $this->assertFalse($def->isLazy());
        $this->assertSame($def, $def->setLazy(false));
        $this->assertFalse($def->isLazy());
        $this->assertEquals(array('lazy' => true), $def->getChanges());
    }

    public function testSetArgument()
    {
        $def = new DefinitionDecorator('foo');

        $this->assertEquals(array(), $def->getArguments());
        $this->assertSame($def, $def->replaceArgument(0, 'foo'));
        $this->assertEquals(array('index_0' => 'foo'), $def->getArguments());
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testReplaceArgumentShouldRequireIntegerIndex()
    {
        $def = new DefinitionDecorator('foo');

        $def->replaceArgument('0', 'foo');
    }

    public function testReplaceArgument()
    {
        $def = new DefinitionDecorator('foo');

        $def->setArguments(array(0 => 'foo', 1 => 'bar'));
        $this->assertEquals('foo', $def->getArgument(0));
        $this->assertEquals('bar', $def->getArgument(1));

        $this->assertSame($def, $def->replaceArgument(1, 'baz'));
        $this->assertEquals('foo', $def->getArgument(0));
        $this->assertEquals('baz', $def->getArgument(1));

        $this->assertEquals(array(0 => 'foo', 1 => 'bar', 'index_1' => 'baz'), $def->getArguments());
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testGetArgumentShouldCheckBounds()
    {
        $def = new DefinitionDecorator('foo');

        $def->setArguments(array(0 => 'foo'));
        $def->replaceArgument(0, 'foo');

        $def->getArgument(1);
    }
}
PKb�\��
�
\pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/CrossCheckTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;

class CrossCheckTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = __DIR__.'/Fixtures/';

        require_once self::$fixturesPath.'/includes/classes.php';
        require_once self::$fixturesPath.'/includes/foo.php';
    }

    /**
     * @dataProvider crossCheckLoadersDumpers
     */
    public function testCrossCheck($fixture, $type)
    {
        $loaderClass = 'Symfony\\Component\\DependencyInjection\\Loader\\'.ucfirst($type).'FileLoader';
        $dumperClass = 'Symfony\\Component\\DependencyInjection\\Dumper\\'.ucfirst($type).'Dumper';

        $tmp = tempnam('sf_service_container', 'sf');

        file_put_contents($tmp, file_get_contents(self::$fixturesPath.'/'.$type.'/'.$fixture));

        $container1 = new ContainerBuilder();
        $loader1 = new $loaderClass($container1, new FileLocator());
        $loader1->load($tmp);

        $dumper = new $dumperClass($container1);
        file_put_contents($tmp, $dumper->dump());

        $container2 = new ContainerBuilder();
        $loader2 = new $loaderClass($container2, new FileLocator());
        $loader2->load($tmp);

        unlink($tmp);

        $this->assertEquals($container2->getAliases(), $container1->getAliases(), 'loading a dump from a previously loaded container returns the same container');
        $this->assertEquals($container2->getDefinitions(), $container1->getDefinitions(), 'loading a dump from a previously loaded container returns the same container');
        $this->assertEquals($container2->getParameterBag()->all(), $container1->getParameterBag()->all(), '->getParameterBag() returns the same value for both containers');

        $this->assertEquals(serialize($container2), serialize($container1), 'loading a dump from a previously loaded container returns the same container');

        $services1 = array();
        foreach ($container1 as $id => $service) {
            $services1[$id] = serialize($service);
        }
        $services2 = array();
        foreach ($container2 as $id => $service) {
            $services2[$id] = serialize($service);
        }

        unset($services1['service_container'], $services2['service_container']);

        $this->assertEquals($services2, $services1, 'Iterator on the containers returns the same services');
    }

    public function crossCheckLoadersDumpers()
    {
        $tests = array(
            array('services1.xml', 'xml'),
            array('services2.xml', 'xml'),
            array('services6.xml', 'xml'),
            array('services8.xml', 'xml'),
            array('services9.xml', 'xml'),
        );

        if (class_exists('Symfony\Component\Yaml\Yaml')) {
            $tests = array_merge($tests, array(
                array('services1.yml', 'yaml'),
                array('services2.yml', 'yaml'),
                array('services6.yml', 'yaml'),
                array('services8.yml', 'yaml'),
                array('services9.yml', 'yaml'),
            ));
        }

        return $tests;
    }
}
PKb�\���e�5�5\pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/DefinitionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests;

use Symfony\Component\DependencyInjection\Definition;

class DefinitionTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\DependencyInjection\Definition::__construct
     */
    public function testConstructor()
    {
        $def = new Definition('stdClass');
        $this->assertEquals('stdClass', $def->getClass(), '__construct() takes the class name as its first argument');

        $def = new Definition('stdClass', array('foo'));
        $this->assertEquals(array('foo'), $def->getArguments(), '__construct() takes an optional array of arguments as its second argument');
    }

    public function testSetGetFactoryClass()
    {
        $def = new Definition('stdClass');
        $this->assertNull($def->getFactoryClass());
        $this->assertSame($def, $def->setFactoryClass('stdClass2'), "->setFactoryClass() implements a fluent interface.");
        $this->assertEquals('stdClass2', $def->getFactoryClass(), "->getFactoryClass() returns current class to construct this service.");
    }

    public function testSetGetFactoryMethod()
    {
        $def = new Definition('stdClass');
        $this->assertNull($def->getFactoryMethod());
        $this->assertSame($def, $def->setFactoryMethod('foo'), '->setFactoryMethod() implements a fluent interface');
        $this->assertEquals('foo', $def->getFactoryMethod(), '->getFactoryMethod() returns the factory method name');
    }

    public function testSetGetFactoryService()
    {
        $def = new Definition('stdClass');
        $this->assertNull($def->getFactoryService());
        $this->assertSame($def, $def->setFactoryService('foo.bar'), "->setFactoryService() implements a fluent interface.");
        $this->assertEquals('foo.bar', $def->getFactoryService(), "->getFactoryService() returns current service to construct this service.");
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setClass
     * @covers Symfony\Component\DependencyInjection\Definition::getClass
     */
    public function testSetGetClass()
    {
        $def = new Definition('stdClass');
        $this->assertSame($def, $def->setClass('foo'), '->setClass() implements a fluent interface');
        $this->assertEquals('foo', $def->getClass(), '->getClass() returns the class name');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setArguments
     * @covers Symfony\Component\DependencyInjection\Definition::getArguments
     * @covers Symfony\Component\DependencyInjection\Definition::addArgument
     */
    public function testArguments()
    {
        $def = new Definition('stdClass');
        $this->assertSame($def, $def->setArguments(array('foo')), '->setArguments() implements a fluent interface');
        $this->assertEquals(array('foo'), $def->getArguments(), '->getArguments() returns the arguments');
        $this->assertSame($def, $def->addArgument('bar'), '->addArgument() implements a fluent interface');
        $this->assertEquals(array('foo', 'bar'), $def->getArguments(), '->addArgument() adds an argument');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setMethodCalls
     * @covers Symfony\Component\DependencyInjection\Definition::addMethodCall
     * @covers Symfony\Component\DependencyInjection\Definition::hasMethodCall
     * @covers Symfony\Component\DependencyInjection\Definition::removeMethodCall
     */
    public function testMethodCalls()
    {
        $def = new Definition('stdClass');
        $this->assertSame($def, $def->setMethodCalls(array(array('foo', array('foo')))), '->setMethodCalls() implements a fluent interface');
        $this->assertEquals(array(array('foo', array('foo'))), $def->getMethodCalls(), '->getMethodCalls() returns the methods to call');
        $this->assertSame($def, $def->addMethodCall('bar', array('bar')), '->addMethodCall() implements a fluent interface');
        $this->assertEquals(array(array('foo', array('foo')), array('bar', array('bar'))), $def->getMethodCalls(), '->addMethodCall() adds a method to call');
        $this->assertTrue($def->hasMethodCall('bar'), '->hasMethodCall() returns true if first argument is a method to call registered');
        $this->assertFalse($def->hasMethodCall('no_registered'), '->hasMethodCall() returns false if first argument is not a method to call registered');
        $this->assertSame($def, $def->removeMethodCall('bar'), '->removeMethodCall() implements a fluent interface');
        $this->assertEquals(array(array('foo', array('foo'))), $def->getMethodCalls(), '->removeMethodCall() removes a method to call');
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
     * @expectedExceptionMessage Method name cannot be empty.
     */
    public function testExceptionOnEmptyMethodCall()
    {
        $def = new Definition('stdClass');
        $def->addMethodCall('');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setFile
     * @covers Symfony\Component\DependencyInjection\Definition::getFile
     */
    public function testSetGetFile()
    {
        $def = new Definition('stdClass');
        $this->assertSame($def, $def->setFile('foo'), '->setFile() implements a fluent interface');
        $this->assertEquals('foo', $def->getFile(), '->getFile() returns the file to include');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setScope
     * @covers Symfony\Component\DependencyInjection\Definition::getScope
     */
    public function testSetGetScope()
    {
        $def = new Definition('stdClass');
        $this->assertEquals('container', $def->getScope());
        $this->assertSame($def, $def->setScope('foo'));
        $this->assertEquals('foo', $def->getScope());
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setPublic
     * @covers Symfony\Component\DependencyInjection\Definition::isPublic
     */
    public function testSetIsPublic()
    {
        $def = new Definition('stdClass');
        $this->assertTrue($def->isPublic(), '->isPublic() returns true by default');
        $this->assertSame($def, $def->setPublic(false), '->setPublic() implements a fluent interface');
        $this->assertFalse($def->isPublic(), '->isPublic() returns false if the instance must not be public.');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setSynthetic
     * @covers Symfony\Component\DependencyInjection\Definition::isSynthetic
     */
    public function testSetIsSynthetic()
    {
        $def = new Definition('stdClass');
        $this->assertFalse($def->isSynthetic(), '->isSynthetic() returns false by default');
        $this->assertSame($def, $def->setSynthetic(true), '->setSynthetic() implements a fluent interface');
        $this->assertTrue($def->isSynthetic(), '->isSynthetic() returns true if the service is synthetic.');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setSynchronized
     * @covers Symfony\Component\DependencyInjection\Definition::isSynchronized
     */
    public function testSetIsSynchronized()
    {
        $def = new Definition('stdClass');
        $this->assertFalse($def->isSynchronized(), '->isSynchronized() returns false by default');
        $this->assertSame($def, $def->setSynchronized(true), '->setSynchronized() implements a fluent interface');
        $this->assertTrue($def->isSynchronized(), '->isSynchronized() returns true if the service is synchronized.');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setLazy
     * @covers Symfony\Component\DependencyInjection\Definition::isLazy
     */
    public function testSetIsLazy()
    {
        $def = new Definition('stdClass');
        $this->assertFalse($def->isLazy(), '->isLazy() returns false by default');
        $this->assertSame($def, $def->setLazy(true), '->setLazy() implements a fluent interface');
        $this->assertTrue($def->isLazy(), '->isLazy() returns true if the service is lazy.');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setAbstract
     * @covers Symfony\Component\DependencyInjection\Definition::isAbstract
     */
    public function testSetIsAbstract()
    {
        $def = new Definition('stdClass');
        $this->assertFalse($def->isAbstract(), '->isAbstract() returns false by default');
        $this->assertSame($def, $def->setAbstract(true), '->setAbstract() implements a fluent interface');
        $this->assertTrue($def->isAbstract(), '->isAbstract() returns true if the instance must not be public.');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::setConfigurator
     * @covers Symfony\Component\DependencyInjection\Definition::getConfigurator
     */
    public function testSetGetConfigurator()
    {
        $def = new Definition('stdClass');
        $this->assertSame($def, $def->setConfigurator('foo'), '->setConfigurator() implements a fluent interface');
        $this->assertEquals('foo', $def->getConfigurator(), '->getConfigurator() returns the configurator');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::clearTags
     */
    public function testClearTags()
    {
        $def = new Definition('stdClass');
        $this->assertSame($def, $def->clearTags(), '->clearTags() implements a fluent interface');
        $def->addTag('foo', array('foo' => 'bar'));
        $def->clearTags();
        $this->assertEquals(array(), $def->getTags(), '->clearTags() removes all current tags');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::clearTags
     */
    public function testClearTag()
    {
        $def = new Definition('stdClass');
        $this->assertSame($def, $def->clearTags(), '->clearTags() implements a fluent interface');
        $def->addTag('1foo1', array('foo1' => 'bar1'));
        $def->addTag('2foo2', array('foo2' => 'bar2'));
        $def->addTag('3foo3', array('foo3' => 'bar3'));
        $def->clearTag('2foo2');
        $this->assertTrue($def->hasTag('1foo1'));
        $this->assertFalse($def->hasTag('2foo2'));
        $this->assertTrue($def->hasTag('3foo3'));
        $def->clearTag('1foo1');
        $this->assertFalse($def->hasTag('1foo1'));
        $this->assertTrue($def->hasTag('3foo3'));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::addTag
     * @covers Symfony\Component\DependencyInjection\Definition::getTag
     * @covers Symfony\Component\DependencyInjection\Definition::getTags
     * @covers Symfony\Component\DependencyInjection\Definition::hasTag
     */
    public function testTags()
    {
        $def = new Definition('stdClass');
        $this->assertEquals(array(), $def->getTag('foo'), '->getTag() returns an empty array if the tag is not defined');
        $this->assertFalse($def->hasTag('foo'));
        $this->assertSame($def, $def->addTag('foo'), '->addTag() implements a fluent interface');
        $this->assertTrue($def->hasTag('foo'));
        $this->assertEquals(array(array()), $def->getTag('foo'), '->getTag() returns attributes for a tag name');
        $def->addTag('foo', array('foo' => 'bar'));
        $this->assertEquals(array(array(), array('foo' => 'bar')), $def->getTag('foo'), '->addTag() can adds the same tag several times');
        $def->addTag('bar', array('bar' => 'bar'));
        $this->assertEquals($def->getTags(), array(
            'foo' => array(array(), array('foo' => 'bar')),
            'bar' => array(array('bar' => 'bar')),
        ), '->getTags() returns all tags');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Definition::replaceArgument
     */
    public function testSetArgument()
    {
        $def = new Definition('stdClass');

        $def->addArgument('foo');
        $this->assertSame(array('foo'), $def->getArguments());

        $this->assertSame($def, $def->replaceArgument(0, 'moo'));
        $this->assertSame(array('moo'), $def->getArguments());

        $def->addArgument('moo');
        $def
            ->replaceArgument(0, 'foo')
            ->replaceArgument(1, 'bar')
        ;
        $this->assertSame(array('foo', 'bar'), $def->getArguments());
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testGetArgumentShouldCheckBounds()
    {
        $def = new Definition('stdClass');

        $def->addArgument('foo');
        $def->getArgument(1);
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testReplaceArgumentShouldCheckBounds()
    {
        $def = new Definition('stdClass');

        $def->addArgument('foo');
        $def->replaceArgument(1, 'bar');
    }

    public function testSetGetProperties()
    {
        $def = new Definition('stdClass');

        $this->assertEquals(array(), $def->getProperties());
        $this->assertSame($def, $def->setProperties(array('foo' => 'bar')));
        $this->assertEquals(array('foo' => 'bar'), $def->getProperties());
    }

    public function testSetProperty()
    {
        $def = new Definition('stdClass');

        $this->assertEquals(array(), $def->getProperties());
        $this->assertSame($def, $def->setProperty('foo', 'bar'));
        $this->assertEquals(array('foo' => 'bar'), $def->getProperties());
    }
}
PKb�\����[pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ReferenceTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests;

use Symfony\Component\DependencyInjection\Reference;

class ReferenceTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\DependencyInjection\Reference::__construct
     */
    public function testConstructor()
    {
        $ref = new Reference('foo');
        $this->assertEquals('foo', (string) $ref, '__construct() sets the id of the reference, which is used for the __toString() method');
    }

    public function testCaseInsensitive()
    {
        $ref = new Reference('FooBar');
        $this->assertEquals('foobar', (string) $ref, 'the id is lowercased as the container is case insensitive');
    }
}
PK
b�\O����fpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
 * This class tests the integration of the different compiler passes
 */
class IntegrationTest extends \PHPUnit_Framework_TestCase
{
    /**
     * This tests that the following dependencies are correctly processed:
     *
     * A is public, B/C are private
     * A -> C
     * B -> C
     */
    public function testProcessRemovesAndInlinesRecursively()
    {
        $container = new ContainerBuilder();
        $container->setResourceTracking(false);

        $a = $container
            ->register('a', '\stdClass')
            ->addArgument(new Reference('c'))
        ;

        $b = $container
            ->register('b', '\stdClass')
            ->addArgument(new Reference('c'))
            ->setPublic(false)
        ;

        $c = $container
            ->register('c', '\stdClass')
            ->setPublic(false)
        ;

        $container->compile();

        $this->assertTrue($container->hasDefinition('a'));
        $arguments = $a->getArguments();
        $this->assertSame($c, $arguments[0]);
        $this->assertFalse($container->hasDefinition('b'));
        $this->assertFalse($container->hasDefinition('c'));
    }

    public function testProcessInlinesReferencesToAliases()
    {
        $container = new ContainerBuilder();
        $container->setResourceTracking(false);

        $a = $container
            ->register('a', '\stdClass')
            ->addArgument(new Reference('b'))
        ;

        $container->setAlias('b', new Alias('c', false));

        $c = $container
            ->register('c', '\stdClass')
            ->setPublic(false)
        ;

        $container->compile();

        $this->assertTrue($container->hasDefinition('a'));
        $arguments = $a->getArguments();
        $this->assertSame($c, $arguments[0]);
        $this->assertFalse($container->hasAlias('b'));
        $this->assertFalse($container->hasDefinition('c'));
    }

    public function testProcessInlinesWhenThereAreMultipleReferencesButFromTheSameDefinition()
    {
        $container = new ContainerBuilder();
        $container->setResourceTracking(false);

        $container
            ->register('a', '\stdClass')
            ->addArgument(new Reference('b'))
            ->addMethodCall('setC', array(new Reference('c')))
        ;

        $container
            ->register('b', '\stdClass')
            ->addArgument(new Reference('c'))
            ->setPublic(false)
        ;

        $container
            ->register('c', '\stdClass')
            ->setPublic(false)
        ;

        $container->compile();

        $this->assertTrue($container->hasDefinition('a'));
        $this->assertFalse($container->hasDefinition('b'));
        $this->assertFalse($container->hasDefinition('c'), 'Service C was not inlined.');
    }
}
PK
b�\'����	�	wpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveInvalidReferencesPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Compiler\ResolveInvalidReferencesPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class ResolveInvalidReferencesPassTest extends \PHPUnit_Framework_TestCase
{
    public function testProcess()
    {
        $container = new ContainerBuilder();
        $def = $container
            ->register('foo')
            ->setArguments(array(new Reference('bar', ContainerInterface::NULL_ON_INVALID_REFERENCE)))
            ->addMethodCall('foo', array(new Reference('moo', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)))
        ;

        $this->process($container);

        $arguments = $def->getArguments();
        $this->assertNull($arguments[0]);
        $this->assertCount(0, $def->getMethodCalls());
    }

    public function testProcessIgnoreNonExistentServices()
    {
        $container = new ContainerBuilder();
        $def = $container
            ->register('foo')
            ->setArguments(array(new Reference('bar')))
        ;

        $this->process($container);

        $arguments = $def->getArguments();
        $this->assertEquals('bar', (string) $arguments[0]);
    }

    public function testProcessRemovesPropertiesOnInvalid()
    {
        $container = new ContainerBuilder();
        $def = $container
            ->register('foo')
            ->setProperty('foo', new Reference('bar', ContainerInterface::IGNORE_ON_INVALID_REFERENCE))
        ;

        $this->process($container);

        $this->assertEquals(array(), $def->getProperties());
    }

    public function testStrictFlagIsPreserved()
    {
        $container = new ContainerBuilder();
        $container->register('bar');
        $def = $container
            ->register('foo')
            ->addArgument(new Reference('bar', ContainerInterface::NULL_ON_INVALID_REFERENCE, false))
        ;

        $this->process($container);

        $this->assertFalse($def->getArgument(0)->isStrict());
    }

    protected function process(ContainerBuilder $container)
    {
        $pass = new ResolveInvalidReferencesPass();
        $pass->process($container);
    }
}
PKb�\��I�
�
vpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/RemoveUnusedDefinitionsPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;
use Symfony\Component\DependencyInjection\Compiler\Compiler;
use Symfony\Component\DependencyInjection\Compiler\RepeatedPass;
use Symfony\Component\DependencyInjection\Compiler\RemoveUnusedDefinitionsPass;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class RemoveUnusedDefinitionsPassTest extends \PHPUnit_Framework_TestCase
{
    public function testProcess()
    {
        $container = new ContainerBuilder();
        $container
            ->register('foo')
            ->setPublic(false)
        ;
        $container
            ->register('bar')
            ->setPublic(false)
        ;
        $container
            ->register('moo')
            ->setArguments(array(new Reference('bar')))
        ;

        $this->process($container);

        $this->assertFalse($container->hasDefinition('foo'));
        $this->assertTrue($container->hasDefinition('bar'));
        $this->assertTrue($container->hasDefinition('moo'));
    }

    public function testProcessRemovesUnusedDefinitionsRecursively()
    {
        $container = new ContainerBuilder();
        $container
            ->register('foo')
            ->setPublic(false)
        ;
        $container
            ->register('bar')
            ->setArguments(array(new Reference('foo')))
            ->setPublic(false)
        ;

        $this->process($container);

        $this->assertFalse($container->hasDefinition('foo'));
        $this->assertFalse($container->hasDefinition('bar'));
    }

    public function testProcessWorksWithInlinedDefinitions()
    {
        $container = new ContainerBuilder();
        $container
            ->register('foo')
            ->setPublic(false)
        ;
        $container
            ->register('bar')
            ->setArguments(array(new Definition(null, array(new Reference('foo')))))
        ;

        $this->process($container);

        $this->assertTrue($container->hasDefinition('foo'));
        $this->assertTrue($container->hasDefinition('bar'));
    }

    protected function process(ContainerBuilder $container)
    {
        $repeatedPass = new RepeatedPass(array(new AnalyzeServiceReferencesPass(), new RemoveUnusedDefinitionsPass()));
        $repeatedPass->process($container);
    }
}
PKb�\@�w��vpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\Compiler\CheckDefinitionValidityPass;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class CheckDefinitionValidityPassTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
     */
    public function testProcessDetectsSyntheticNonPublicDefinitions()
    {
        $container = new ContainerBuilder();
        $container->register('a')->setSynthetic(true)->setPublic(false);

        $this->process($container);
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
     */
    public function testProcessDetectsSyntheticPrototypeDefinitions()
    {
        $container = new ContainerBuilder();
        $container->register('a')->setSynthetic(true)->setScope(ContainerInterface::SCOPE_PROTOTYPE);

        $this->process($container);
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
     */
    public function testProcessDetectsNonSyntheticNonAbstractDefinitionWithoutClass()
    {
        $container = new ContainerBuilder();
        $container->register('a')->setSynthetic(false)->setAbstract(false);

        $this->process($container);
    }

    public function testProcess()
    {
        $container = new ContainerBuilder();
        $container->register('a', 'class');
        $container->register('b', 'class')->setSynthetic(true)->setPublic(true);
        $container->register('c', 'class')->setAbstract(true);
        $container->register('d', 'class')->setSynthetic(true);

        $this->process($container);
    }

    public function testValidTags()
    {
        $container = new ContainerBuilder();
        $container->register('a', 'class')->addTag('foo', array('bar' => 'baz'));
        $container->register('b', 'class')->addTag('foo', array('bar' => null));
        $container->register('c', 'class')->addTag('foo', array('bar' => 1));
        $container->register('d', 'class')->addTag('foo', array('bar' => 1.1));

        $this->process($container);
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
     */
    public function testInvalidTags()
    {
        $container = new ContainerBuilder();
        $container->register('a', 'class')->addTag('foo', array('bar' => array('baz' => 'baz')));

        $this->process($container);
    }

    protected function process(ContainerBuilder $container)
    {
        $pass = new CheckDefinitionValidityPass();
        $pass->process($container);
    }
}
PKb�\]����ypear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveDefinitionTemplatesPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\DefinitionDecorator;
use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class ResolveDefinitionTemplatesPassTest extends \PHPUnit_Framework_TestCase
{
    public function testProcess()
    {
        $container = new ContainerBuilder();
        $container->register('parent', 'foo')->setArguments(array('moo', 'b'))->setProperty('foo', 'moo');
        $container->setDefinition('child', new DefinitionDecorator('parent'))
            ->replaceArgument(0, 'a')
            ->setProperty('foo', 'bar')
            ->setClass('bar')
        ;

        $this->process($container);

        $def = $container->getDefinition('child');
        $this->assertNotInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $def);
        $this->assertEquals('bar', $def->getClass());
        $this->assertEquals(array('a', 'b'), $def->getArguments());
        $this->assertEquals(array('foo' => 'bar'), $def->getProperties());
    }

    public function testProcessAppendsMethodCallsAlways()
    {
        $container = new ContainerBuilder();

        $container
            ->register('parent')
            ->addMethodCall('foo', array('bar'))
        ;

        $container
            ->setDefinition('child', new DefinitionDecorator('parent'))
            ->addMethodCall('bar', array('foo'))
        ;

        $this->process($container);

        $def = $container->getDefinition('child');
        $this->assertEquals(array(
            array('foo', array('bar')),
            array('bar', array('foo')),
        ), $def->getMethodCalls());
    }

    public function testProcessDoesNotCopyAbstract()
    {
        $container = new ContainerBuilder();

        $container
            ->register('parent')
            ->setAbstract(true)
        ;

        $container
            ->setDefinition('child', new DefinitionDecorator('parent'))
        ;

        $this->process($container);

        $def = $container->getDefinition('child');
        $this->assertFalse($def->isAbstract());
    }

    public function testProcessDoesNotCopyScope()
    {
        $container = new ContainerBuilder();

        $container
            ->register('parent')
            ->setScope('foo')
        ;

        $container
            ->setDefinition('child', new DefinitionDecorator('parent'))
        ;

        $this->process($container);

        $def = $container->getDefinition('child');
        $this->assertEquals(ContainerInterface::SCOPE_CONTAINER, $def->getScope());
    }

    public function testProcessDoesNotCopyTags()
    {
        $container = new ContainerBuilder();

        $container
            ->register('parent')
            ->addTag('foo')
        ;

        $container
            ->setDefinition('child', new DefinitionDecorator('parent'))
        ;

        $this->process($container);

        $def = $container->getDefinition('child');
        $this->assertEquals(array(), $def->getTags());
    }

    public function testProcessHandlesMultipleInheritance()
    {
        $container = new ContainerBuilder();

        $container
            ->register('parent', 'foo')
            ->setArguments(array('foo', 'bar', 'c'))
        ;

        $container
            ->setDefinition('child2', new DefinitionDecorator('child1'))
            ->replaceArgument(1, 'b')
        ;

        $container
            ->setDefinition('child1', new DefinitionDecorator('parent'))
            ->replaceArgument(0, 'a')
        ;

        $this->process($container);

        $def = $container->getDefinition('child2');
        $this->assertEquals(array('a', 'b', 'c'), $def->getArguments());
        $this->assertEquals('foo', $def->getClass());
    }

    public function testSetLazyOnServiceHasParent()
    {
        $container = new ContainerBuilder();

        $container->register('parent','stdClass');

        $container->setDefinition('child1',new DefinitionDecorator('parent'))
            ->setLazy(true)
        ;

        $this->process($container);

        $this->assertTrue($container->getDefinition('child1')->isLazy());
    }

    public function testSetLazyOnServiceIsParent()
    {
        $container = new ContainerBuilder();

        $container->register('parent','stdClass')
            ->setLazy(true)
        ;

        $container->setDefinition('child1',new DefinitionDecorator('parent'));

        $this->process($container);

        $this->assertTrue($container->getDefinition('child1')->isLazy());
    }

    protected function process(ContainerBuilder $container)
    {
        $pass = new ResolveDefinitionTemplatesPass();
        $pass->process($container);
    }
}
PKb�\��f00wpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/InlineServiceDefinitionsPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\Scope;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;
use Symfony\Component\DependencyInjection\Compiler\RepeatedPass;
use Symfony\Component\DependencyInjection\Compiler\InlineServiceDefinitionsPass;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class InlineServiceDefinitionsPassTest extends \PHPUnit_Framework_TestCase
{
    public function testProcess()
    {
        $container = new ContainerBuilder();
        $container
            ->register('inlinable.service')
            ->setPublic(false)
        ;

        $container
            ->register('service')
            ->setArguments(array(new Reference('inlinable.service')))
        ;

        $this->process($container);

        $arguments = $container->getDefinition('service')->getArguments();
        $this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $arguments[0]);
        $this->assertSame($container->getDefinition('inlinable.service'), $arguments[0]);
    }

    public function testProcessDoesNotInlineWhenAliasedServiceIsNotOfPrototypeScope()
    {
        $container = new ContainerBuilder();
        $container
            ->register('foo')
            ->setPublic(false)
        ;
        $container->setAlias('moo', 'foo');

        $container
            ->register('service')
            ->setArguments(array($ref = new Reference('foo')))
        ;

        $this->process($container);

        $arguments = $container->getDefinition('service')->getArguments();
        $this->assertSame($ref, $arguments[0]);
    }

    public function testProcessDoesInlineServiceOfPrototypeScope()
    {
        $container = new ContainerBuilder();
        $container
            ->register('foo')
            ->setScope('prototype')
        ;
        $container
            ->register('bar')
            ->setPublic(false)
            ->setScope('prototype')
        ;
        $container->setAlias('moo', 'bar');

        $container
            ->register('service')
            ->setArguments(array(new Reference('foo'), $ref = new Reference('moo'), new Reference('bar')))
        ;

        $this->process($container);

        $arguments = $container->getDefinition('service')->getArguments();
        $this->assertEquals($container->getDefinition('foo'), $arguments[0]);
        $this->assertNotSame($container->getDefinition('foo'), $arguments[0]);
        $this->assertSame($ref, $arguments[1]);
        $this->assertEquals($container->getDefinition('bar'), $arguments[2]);
        $this->assertNotSame($container->getDefinition('bar'), $arguments[2]);
    }

    public function testProcessInlinesIfMultipleReferencesButAllFromTheSameDefinition()
    {
        $container = new ContainerBuilder();

        $a = $container->register('a')->setPublic(false);
        $b = $container
            ->register('b')
            ->addArgument(new Reference('a'))
            ->addArgument(new Definition(null, array(new Reference('a'))))
        ;

        $this->process($container);

        $arguments = $b->getArguments();
        $this->assertSame($a, $arguments[0]);

        $inlinedArguments = $arguments[1]->getArguments();
        $this->assertSame($a, $inlinedArguments[0]);
    }

    public function testProcessInlinesOnlyIfSameScope()
    {
        $container = new ContainerBuilder();

        $container->addScope(new Scope('foo'));
        $a = $container->register('a')->setPublic(false)->setScope('foo');
        $b = $container->register('b')->addArgument(new Reference('a'));

        $this->process($container);
        $arguments = $b->getArguments();
        $this->assertEquals(new Reference('a'), $arguments[0]);
        $this->assertTrue($container->hasDefinition('a'));
    }

    public function testProcessDoesNotInlineWhenServiceIsPrivateButLazy()
    {
        $container = new ContainerBuilder();
        $container
            ->register('foo')
            ->setPublic(false)
            ->setLazy(true)
        ;

        $container
            ->register('service')
            ->setArguments(array($ref = new Reference('foo')))
        ;

        $this->process($container);

        $arguments = $container->getDefinition('service')->getArguments();
        $this->assertSame($ref, $arguments[0]);
    }

    public function testProcessDoesNotInlineWhenServiceReferencesItself()
    {
        $container = new ContainerBuilder();
        $container
            ->register('foo')
            ->setPublic(false)
            ->addMethodCall('foo', array($ref = new Reference('foo')))
        ;

        $this->process($container);

        $calls = $container->getDefinition('foo')->getMethodCalls();
        $this->assertSame($ref, $calls[0][1][0]);
    }

    protected function process(ContainerBuilder $container)
    {
        $repeatedPass = new RepeatedPass(array(new AnalyzeServiceReferencesPass(), new InlineServiceDefinitionsPass()));
        $repeatedPass->process($container);
    }
}
PKb�\}1H@@}pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/ReplaceAliasByActualDefinitionPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\Compiler\ReplaceAliasByActualDefinitionPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;

class ReplaceAliasByActualDefinitionPassTest extends \PHPUnit_Framework_TestCase
{
    public function testProcess()
    {
        $container = new ContainerBuilder();

        $container->register('a', '\stdClass');

        $bDefinition = new Definition('\stdClass');
        $bDefinition->setPublic(false);
        $container->setDefinition('b', $bDefinition);

        $container->setAlias('a_alias', 'a');
        $container->setAlias('b_alias', 'b');

        $this->process($container);

        $this->assertTrue($container->has('a'), '->process() does nothing to public definitions.');
        $this->assertTrue($container->hasAlias('a_alias'));
        $this->assertFalse($container->has('b'), '->process() removes non-public definitions.');
        $this->assertTrue(
            $container->has('b_alias') && !$container->hasAlias('b_alias'),
            '->process() replaces alias to actual.'
        );
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testProcessWithInvalidAlias()
    {
        $container = new ContainerBuilder();
        $container->setAlias('a_alias', 'a');
        $this->process($container);
    }

    protected function process(ContainerBuilder $container)
    {
        $pass = new ReplaceAliasByActualDefinitionPass();
        $pass->process($container);
    }
}
PKb�\�~�``wpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/AnalyzeServiceReferencesPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Compiler\Compiler;
use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;
use Symfony\Component\DependencyInjection\Compiler\RepeatedPass;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class AnalyzeServiceReferencesPassTest extends \PHPUnit_Framework_TestCase
{
    public function testProcess()
    {
        $container = new ContainerBuilder();

        $a = $container
            ->register('a')
            ->addArgument($ref1 = new Reference('b'))
        ;

        $b = $container
            ->register('b')
            ->addMethodCall('setA', array($ref2 = new Reference('a')))
        ;

        $c = $container
            ->register('c')
            ->addArgument($ref3 = new Reference('a'))
            ->addArgument($ref4 = new Reference('b'))
        ;

        $d = $container
            ->register('d')
            ->setProperty('foo', $ref5 = new Reference('b'))
        ;

        $e = $container
            ->register('e')
            ->setConfigurator(array($ref6 = new Reference('b'), 'methodName'))
        ;

        $graph = $this->process($container);

        $this->assertCount(4, $edges = $graph->getNode('b')->getInEdges());

        $this->assertSame($ref1, $edges[0]->getValue());
        $this->assertSame($ref4, $edges[1]->getValue());
        $this->assertSame($ref5, $edges[2]->getValue());
        $this->assertSame($ref6, $edges[3]->getValue());
    }

    public function testProcessDetectsReferencesFromInlinedDefinitions()
    {
        $container = new ContainerBuilder();

        $container
            ->register('a')
        ;

        $container
            ->register('b')
            ->addArgument(new Definition(null, array($ref = new Reference('a'))))
        ;

        $graph = $this->process($container);

        $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
        $this->assertSame($ref, $refs[0]->getValue());
    }

    public function testProcessDoesNotSaveDuplicateReferences()
    {
        $container = new ContainerBuilder();

        $container
            ->register('a')
        ;
        $container
            ->register('b')
            ->addArgument(new Definition(null, array($ref1 = new Reference('a'))))
            ->addArgument(new Definition(null, array($ref2 = new Reference('a'))))
        ;

        $graph = $this->process($container);

        $this->assertCount(2, $graph->getNode('a')->getInEdges());
    }

    protected function process(ContainerBuilder $container)
    {
        $pass = new RepeatedPass(array(new AnalyzeServiceReferencesPass()));
        $pass->process($container);

        return $container->getCompiler()->getServiceReferenceGraph();
    }
}
PKb�\>�"��upear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckReferenceValidityPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\Scope;

use Symfony\Component\DependencyInjection\Compiler\CheckReferenceValidityPass;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class CheckReferenceValidityPassTest extends \PHPUnit_Framework_TestCase
{
    public function testProcessIgnoresScopeWideningIfNonStrictReference()
    {
        $container = new ContainerBuilder();
        $container->register('a')->addArgument(new Reference('b', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, false));
        $container->register('b')->setScope('prototype');

        $this->process($container);
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testProcessDetectsScopeWidening()
    {
        $container = new ContainerBuilder();
        $container->register('a')->addArgument(new Reference('b'));
        $container->register('b')->setScope('prototype');

        $this->process($container);
    }

    public function testProcessIgnoresCrossScopeHierarchyReferenceIfNotStrict()
    {
        $container = new ContainerBuilder();
        $container->addScope(new Scope('a'));
        $container->addScope(new Scope('b'));

        $container->register('a')->setScope('a')->addArgument(new Reference('b', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, false));
        $container->register('b')->setScope('b');

        $this->process($container);
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testProcessDetectsCrossScopeHierarchyReference()
    {
        $container = new ContainerBuilder();
        $container->addScope(new Scope('a'));
        $container->addScope(new Scope('b'));

        $container->register('a')->setScope('a')->addArgument(new Reference('b'));
        $container->register('b')->setScope('b');

        $this->process($container);
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testProcessDetectsReferenceToAbstractDefinition()
    {
        $container = new ContainerBuilder();

        $container->register('a')->setAbstract(true);
        $container->register('b')->addArgument(new Reference('a'));

        $this->process($container);
    }

    public function testProcess()
    {
        $container = new ContainerBuilder();
        $container->register('a')->addArgument(new Reference('b'));
        $container->register('b');

        $this->process($container);
    }

    protected function process(ContainerBuilder $container)
    {
        $pass = new CheckReferenceValidityPass();
        $pass->process($container);
    }
}
PKb�\
T^�??ypear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Compiler\ResolveReferencesToAliasesPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class ResolveReferencesToAliasesPassTest extends \PHPUnit_Framework_TestCase
{
    public function testProcess()
    {
        $container = new ContainerBuilder();
        $container->setAlias('bar', 'foo');
        $def = $container
            ->register('moo')
            ->setArguments(array(new Reference('bar')))
        ;

        $this->process($container);

        $arguments = $def->getArguments();
        $this->assertEquals('foo', (string) $arguments[0]);
    }

    public function testProcessRecursively()
    {
        $container = new ContainerBuilder();
        $container->setAlias('bar', 'foo');
        $container->setAlias('moo', 'bar');
        $def = $container
            ->register('foobar')
            ->setArguments(array(new Reference('moo')))
        ;

        $this->process($container);

        $arguments = $def->getArguments();
        $this->assertEquals('foo', (string) $arguments[0]);
    }

    protected function process(ContainerBuilder $container)
    {
        $pass = new ResolveReferencesToAliasesPass();
        $pass->process($container);
    }
}
PKb�\@|޵��pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\Definition;

use Symfony\Component\DependencyInjection\Compiler\CheckExceptionOnInvalidReferenceBehaviorPass;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class CheckExceptionOnInvalidReferenceBehaviorPassTest extends \PHPUnit_Framework_TestCase
{
    public function testProcess()
    {
        $container = new ContainerBuilder();

        $container
            ->register('a', '\stdClass')
            ->addArgument(new Reference('b'))
        ;
        $container->register('b', '\stdClass');
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
     */
    public function testProcessThrowsExceptionOnInvalidReference()
    {
        $container = new ContainerBuilder();

        $container
            ->register('a', '\stdClass')
            ->addArgument(new Reference('b'))
        ;

        $this->process($container);
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException
     */
    public function testProcessThrowsExceptionOnInvalidReferenceFromInlinedDefinition()
    {
        $container = new ContainerBuilder();

        $def = new Definition();
        $def->addArgument(new Reference('b'));

        $container
            ->register('a', '\stdClass')
            ->addArgument($def)
        ;

        $this->process($container);
    }

    private function process(ContainerBuilder $container)
    {
        $pass = new CheckExceptionOnInvalidReferenceBehaviorPass();
        $pass->process($container);
    }
}
PKb�\��'{{vpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use Symfony\Component\DependencyInjection\Reference;

use Symfony\Component\DependencyInjection\Compiler\CheckCircularReferencesPass;

use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;

use Symfony\Component\DependencyInjection\Compiler\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;

class CheckCircularReferencesPassTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
     */
    public function testProcess()
    {
        $container = new ContainerBuilder();
        $container->register('a')->addArgument(new Reference('b'));
        $container->register('b')->addArgument(new Reference('a'));

        $this->process($container);
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
     */
    public function testProcessWithAliases()
    {
        $container = new ContainerBuilder();
        $container->register('a')->addArgument(new Reference('b'));
        $container->setAlias('b', 'c');
        $container->setAlias('c', 'a');

        $this->process($container);
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
     */
    public function testProcessDetectsIndirectCircularReference()
    {
        $container = new ContainerBuilder();
        $container->register('a')->addArgument(new Reference('b'));
        $container->register('b')->addArgument(new Reference('c'));
        $container->register('c')->addArgument(new Reference('a'));

        $this->process($container);
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
     */
    public function testDeepCircularReference()
    {
        $container = new ContainerBuilder();
        $container->register('a')->addArgument(new Reference('b'));
        $container->register('b')->addArgument(new Reference('c'));
        $container->register('c')->addArgument(new Reference('b'));

        $this->process($container);
    }

    public function testProcessIgnoresMethodCalls()
    {
        $container = new ContainerBuilder();
        $container->register('a')->addArgument(new Reference('b'));
        $container->register('b')->addMethodCall('setA', array(new Reference('a')));

        $this->process($container);
    }

    protected function process(ContainerBuilder $container)
    {
        $compiler = new Compiler();
        $passConfig = $compiler->getPassConfig();
        $passConfig->setOptimizationPasses(array(
            new AnalyzeServiceReferencesPass(true),
            new CheckCircularReferencesPass(),
        ));
        $passConfig->setRemovingPasses(array());

        $compiler->compile($container);
    }
}
PKb�\2+`��	�	cpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Dumper;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Dumper\YamlDumper;

class YamlDumperTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = realpath(__DIR__.'/../Fixtures/');
    }

    public function testDump()
    {
        $dumper = new YamlDumper($container = new ContainerBuilder());

        $this->assertStringEqualsFile(self::$fixturesPath.'/yaml/services1.yml', $dumper->dump(), '->dump() dumps an empty container as an empty YAML file');

        $container = new ContainerBuilder();
        $dumper = new YamlDumper($container);
    }

    public function testAddParameters()
    {
        $container = include self::$fixturesPath.'/containers/container8.php';
        $dumper = new YamlDumper($container);
        $this->assertStringEqualsFile(self::$fixturesPath.'/yaml/services8.yml', $dumper->dump(), '->dump() dumps parameters');
    }

    public function testAddService()
    {
        $container = include self::$fixturesPath.'/containers/container9.php';
        $dumper = new YamlDumper($container);
        $this->assertEquals(str_replace('%path%', self::$fixturesPath.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR, file_get_contents(self::$fixturesPath.'/yaml/services9.yml')), $dumper->dump(), '->dump() dumps services');

        $dumper = new YamlDumper($container = new ContainerBuilder());
        $container->register('foo', 'FooClass')->addArgument(new \stdClass());
        try {
            $dumper->dump();
            $this->fail('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\RuntimeException', $e, '->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
            $this->assertEquals('Unable to dump a service container if a parameter is an object or a resource.', $e->getMessage(), '->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
        }
    }
}
PKb�\v��gpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Dumper/GraphvizDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Dumper;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Dumper\GraphvizDumper;

class GraphvizDumperTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = __DIR__.'/../Fixtures/';
    }

    public function testDump()
    {
        $dumper = new GraphvizDumper($container = new ContainerBuilder());

        $this->assertStringEqualsFile(self::$fixturesPath.'/graphviz/services1.dot', $dumper->dump(), '->dump() dumps an empty container as an empty dot file');

        $container = include self::$fixturesPath.'/containers/container9.php';
        $dumper = new GraphvizDumper($container);
        $this->assertEquals(str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services9.dot')), $dumper->dump(), '->dump() dumps services');

        $container = include self::$fixturesPath.'/containers/container10.php';
        $dumper = new GraphvizDumper($container);
        $this->assertEquals(str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services10.dot')), $dumper->dump(), '->dump() dumps services');

        $container = include self::$fixturesPath.'/containers/container10.php';
        $dumper = new GraphvizDumper($container);
        $this->assertEquals($dumper->dump(array(
            'graph' => array('ratio' => 'normal'),
            'node'  => array('fontsize' => 13, 'fontname' => 'Verdana', 'shape' => 'square'),
            'edge'  => array('fontsize' => 12, 'fontname' => 'Verdana', 'color' => 'white', 'arrowhead' => 'closed', 'arrowsize' => 1),
            'node.instance' => array('fillcolor' => 'green', 'style' => 'empty'),
            'node.definition' => array('fillcolor' => 'grey'),
            'node.missing' => array('fillcolor' => 'red', 'style' => 'empty'),
        )), str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services10-1.dot')), '->dump() dumps services');
    }

    public function testDumpWithFrozenContainer()
    {
        $container = include self::$fixturesPath.'/containers/container13.php';
        $dumper = new GraphvizDumper($container);
        $this->assertEquals(str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services13.dot')), $dumper->dump(), '->dump() dumps services');
    }

    public function testDumpWithFrozenCustomClassContainer()
    {
        $container = include self::$fixturesPath.'/containers/container14.php';
        $dumper = new GraphvizDumper($container);
        $this->assertEquals(str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services14.dot')), $dumper->dump(), '->dump() dumps services');
    }
}
PKb�\�)���bpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Dumper;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Dumper\XmlDumper;

class XmlDumperTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = realpath(__DIR__.'/../Fixtures/');
    }

    public function testDump()
    {
        $dumper = new XmlDumper($container = new ContainerBuilder());

        $this->assertXmlStringEqualsXmlFile(self::$fixturesPath.'/xml/services1.xml', $dumper->dump(), '->dump() dumps an empty container as an empty XML file');

        $container = new ContainerBuilder();
        $dumper = new XmlDumper($container);
    }

    public function testExportParameters()
    {
        $container = include self::$fixturesPath.'//containers/container8.php';
        $dumper = new XmlDumper($container);
        $this->assertXmlStringEqualsXmlFile(self::$fixturesPath.'/xml/services8.xml', $dumper->dump(), '->dump() dumps parameters');
    }

    public function testAddParameters()
    {
        $container = include self::$fixturesPath.'//containers/container8.php';
        $dumper = new XmlDumper($container);
        $this->assertXmlStringEqualsXmlFile(self::$fixturesPath.'/xml/services8.xml', $dumper->dump(), '->dump() dumps parameters');
    }

    public function testAddService()
    {
        $container = include self::$fixturesPath.'/containers/container9.php';
        $dumper = new XmlDumper($container);
        $this->assertEquals(str_replace('%path%', self::$fixturesPath.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR, file_get_contents(self::$fixturesPath.'/xml/services9.xml')), $dumper->dump(), '->dump() dumps services');

        $dumper = new XmlDumper($container = new ContainerBuilder());
        $container->register('foo', 'FooClass')->addArgument(new \stdClass());
        try {
            $dumper->dump();
            $this->fail('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\RuntimeException', $e, '->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
            $this->assertEquals('Unable to dump a service container if a parameter is an object or a resource.', $e->getMessage(), '->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
        }
    }

    public function testDumpAnonymousServices()
    {
        include self::$fixturesPath.'/containers/container11.php';
        $dumper = new XmlDumper($container);
        $this->assertEquals("<?xml version=\"1.0\" encoding=\"utf-8\"?>
<container xmlns=\"http://symfony.com/schema/dic/services\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd\">
  <services>
    <service id=\"foo\" class=\"FooClass\">
      <argument type=\"service\">
        <service class=\"BarClass\">
          <argument type=\"service\">
            <service class=\"BazClass\"/>
          </argument>
        </service>
      </argument>
    </service>
  </services>
</container>
", $dumper->dump());
    }

    public function testDumpEntities()
    {
        include self::$fixturesPath.'/containers/container12.php';
        $dumper = new XmlDumper($container);
        $this->assertEquals("<?xml version=\"1.0\" encoding=\"utf-8\"?>
<container xmlns=\"http://symfony.com/schema/dic/services\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd\">
  <services>
    <service id=\"foo\" class=\"FooClass\Foo\">
      <tag name=\"foo&quot;bar\bar\" foo=\"foo&quot;barřž€\"/>
      <argument>foo&lt;&gt;&amp;bar</argument>
    </service>
  </services>
</container>
", $dumper->dump());
    }
}
PKb�\�"��."."bpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Dumper;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Definition;

class PhpDumperTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = realpath(__DIR__.'/../Fixtures/');
    }

    public function testDump()
    {
        $dumper = new PhpDumper($container = new ContainerBuilder());

        $this->assertStringEqualsFile(self::$fixturesPath.'/php/services1.php', $dumper->dump(), '->dump() dumps an empty container as an empty PHP class');
        $this->assertStringEqualsFile(self::$fixturesPath.'/php/services1-1.php', $dumper->dump(array('class' => 'Container', 'base_class' => 'AbstractContainer', 'namespace' => 'Symfony\Component\DependencyInjection\Dump')), '->dump() takes a class and a base_class options');

        $container = new ContainerBuilder();
        new PhpDumper($container);
    }

    public function testDumpFrozenContainerWithNoParameter()
    {
        $container = new ContainerBuilder();
        $container->setResourceTracking(false);
        $container->register('foo', 'stdClass');

        $container->compile();

        $dumper = new PhpDumper($container);

        $dumpedString = $dumper->dump();
        $this->assertStringEqualsFile(self::$fixturesPath.'/php/services11.php', $dumpedString, '->dump() does not add getDefaultParameters() method call if container have no parameters.');
        $this->assertNotRegexp("/function getDefaultParameters\(/", $dumpedString, '->dump() does not add getDefaultParameters() method definition.');
    }

    public function testDumpOptimizationString()
    {
        $definition = new Definition();
        $definition->setClass('stdClass');
        $definition->addArgument(array(
            'only dot' => '.',
            'concatenation as value' => '.\'\'.',
            'concatenation from the start value' => '\'\'.',
            '.' => 'dot as a key',
            '.\'\'.' => 'concatenation as a key',
            '\'\'.' =>'concatenation from the start key',
            'optimize concatenation' => "string1%some_string%string2",
            'optimize concatenation with empty string' => "string1%empty_value%string2",
            'optimize concatenation from the start' => '%empty_value%start',
            'optimize concatenation at the end' => 'end%empty_value%',
        ));

        $container = new ContainerBuilder();
        $container->setResourceTracking(false);
        $container->setDefinition('test', $definition);
        $container->setParameter('empty_value', '');
        $container->setParameter('some_string', '-');
        $container->compile();

        $dumper = new PhpDumper($container);
        $this->assertStringEqualsFile(self::$fixturesPath.'/php/services10.php', $dumper->dump(), '->dump() dumps an empty container as an empty PHP class');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testExportParameters()
    {
        $dumper = new PhpDumper(new ContainerBuilder(new ParameterBag(array('foo' => new Reference('foo')))));
        $dumper->dump();
    }

    public function testAddParameters()
    {
        $container = include self::$fixturesPath.'/containers/container8.php';
        $dumper = new PhpDumper($container);
        $this->assertStringEqualsFile(self::$fixturesPath.'/php/services8.php', $dumper->dump(), '->dump() dumps parameters');
    }

    public function testAddService()
    {
        // without compilation
        $container = include self::$fixturesPath.'/containers/container9.php';
        $dumper = new PhpDumper($container);
        $this->assertEquals(str_replace('%path%', str_replace('\\','\\\\',self::$fixturesPath.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR), file_get_contents(self::$fixturesPath.'/php/services9.php')), $dumper->dump(), '->dump() dumps services');

        // with compilation
        $container = include self::$fixturesPath.'/containers/container9.php';
        $container->compile();
        $dumper = new PhpDumper($container);
        $this->assertEquals(str_replace('%path%', str_replace('\\','\\\\',self::$fixturesPath.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR), file_get_contents(self::$fixturesPath.'/php/services9_compiled.php')), $dumper->dump(), '->dump() dumps services');

        $dumper = new PhpDumper($container = new ContainerBuilder());
        $container->register('foo', 'FooClass')->addArgument(new \stdClass());
        try {
            $dumper->dump();
            $this->fail('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\Symfony\Component\DependencyInjection\Exception\RuntimeException', $e, '->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
            $this->assertEquals('Unable to dump a service container if a parameter is an object or a resource.', $e->getMessage(), '->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
        }
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage Service id "bar$" cannot be converted to a valid PHP method name.
     */
    public function testAddServiceInvalidServiceId()
    {
        $container = new ContainerBuilder();
        $container->register('bar$', 'FooClass');
        $dumper = new PhpDumper($container);
        $dumper->dump();
    }

    public function testAliases()
    {
        $container = include self::$fixturesPath.'/containers/container9.php';
        $container->compile();
        $dumper = new PhpDumper($container);
        eval('?>'.$dumper->dump(array('class' => 'Symfony_DI_PhpDumper_Test_Aliases')));

        $container = new \Symfony_DI_PhpDumper_Test_Aliases();
        $container->set('foo', $foo = new \stdClass);
        $this->assertSame($foo, $container->get('foo'));
        $this->assertSame($foo, $container->get('alias_for_foo'));
        $this->assertSame($foo, $container->get('alias_for_alias'));
    }

    public function testFrozenContainerWithoutAliases()
    {
        $container = new ContainerBuilder();
        $container->compile();

        $dumper = new PhpDumper($container);
        eval('?>'.$dumper->dump(array('class' => 'Symfony_DI_PhpDumper_Test_Frozen_No_Aliases')));

        $container = new \Symfony_DI_PhpDumper_Test_Frozen_No_Aliases();
        $this->assertFalse($container->has('foo'));
    }

    public function testOverrideServiceWhenUsingADumpedContainer()
    {
        require_once self::$fixturesPath.'/php/services9.php';
        require_once self::$fixturesPath.'/includes/foo.php';

        $container = new \ProjectServiceContainer();
        $container->set('bar', $bar = new \stdClass());
        $container->setParameter('foo_bar', 'foo_bar');

        $this->assertEquals($bar, $container->get('bar'), '->set() overrides an already defined service');
    }

    public function testOverrideServiceWhenUsingADumpedContainerAndServiceIsUsedFromAnotherOne()
    {
        require_once self::$fixturesPath.'/php/services9.php';
        require_once self::$fixturesPath.'/includes/foo.php';
        require_once self::$fixturesPath.'/includes/classes.php';

        $container = new \ProjectServiceContainer();
        $container->set('bar', $bar = new \stdClass());

        $this->assertSame($bar, $container->get('foo')->bar, '->set() overrides an already defined service');
    }

    /**
     * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
     */
    public function testCircularReference()
    {
        $container = new ContainerBuilder();
        $container->register('foo', 'stdClass')->addArgument(new Reference('bar'));
        $container->register('bar', 'stdClass')->setPublic(false)->addMethodCall('setA', array(new Reference('baz')));
        $container->register('baz', 'stdClass')->addMethodCall('setA', array(new Reference('foo')));
        $container->compile();

        $dumper = new PhpDumper($container);
        $dumper->dump();
    }
}
PKb�\Q&I�8a8afpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Loader;

use Symfony\Component\DependencyInjection\ContainerInterface;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\ExpressionLanguage\Expression;

class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = realpath(__DIR__.'/../Fixtures/');
        require_once self::$fixturesPath.'/includes/foo.php';
        require_once self::$fixturesPath.'/includes/ProjectExtension.php';
        require_once self::$fixturesPath.'/includes/ProjectWithXsdExtension.php';
    }

    public function testLoad()
    {
        $loader = new XmlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/ini'));

        try {
            $loader->load('foo.xml');
            $this->fail('->load() throws an InvalidArgumentException if the loaded file does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the loaded file does not exist');
            $this->assertStringStartsWith('The file "foo.xml" does not exist (in:', $e->getMessage(), '->load() throws an InvalidArgumentException if the loaded file does not exist');
        }
    }

    public function testParseFile()
    {
        $loader = new XmlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/ini'));
        $r = new \ReflectionObject($loader);
        $m = $r->getMethod('parseFile');
        $m->setAccessible(true);

        try {
            $m->invoke($loader, self::$fixturesPath.'/ini/parameters.ini');
            $this->fail('->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException', $e, '->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');
            $this->assertRegExp(sprintf('#^Unable to parse file ".+%s".$#', 'parameters.ini'), $e->getMessage(), '->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');

            $e = $e->getPrevious();
            $this->assertInstanceOf('InvalidArgumentException', $e, '->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');
            $this->assertStringStartsWith('[ERROR 4] Start tag expected, \'<\' not found (in', $e->getMessage(), '->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');
        }

        $loader = new XmlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/xml'));

        try {
            $m->invoke($loader, self::$fixturesPath.'/xml/nonvalid.xml');
            $this->fail('->parseFile() throws an InvalidArgumentException if the loaded file does not validate the XSD');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException', $e, '->parseFile() throws an InvalidArgumentException if the loaded file does not validate the XSD');
            $this->assertRegExp(sprintf('#^Unable to parse file ".+%s".$#', 'nonvalid.xml'), $e->getMessage(), '->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');

            $e = $e->getPrevious();
            $this->assertInstanceOf('InvalidArgumentException', $e, '->parseFile() throws an InvalidArgumentException if the loaded file does not validate the XSD');
            $this->assertStringStartsWith('[ERROR 1845] Element \'nonvalid\': No matching global declaration available for the validation root. (in', $e->getMessage(), '->parseFile() throws an InvalidArgumentException if the loaded file does not validate the XSD');
        }

        $xml = $m->invoke($loader, self::$fixturesPath.'/xml/services1.xml');
        $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\SimpleXMLElement', $xml, '->parseFile() returns an SimpleXMLElement object');
    }

    public function testLoadParameters()
    {
        $container = new ContainerBuilder();
        $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
        $loader->load('services2.xml');

        $actual = $container->getParameterBag()->all();
        $expected = array(
            'a string',
            'foo' => 'bar',
            'values' => array(
                0,
                'integer' => 4,
                100 => null,
                'true',
                true,
                false,
                'on',
                'off',
                'float' => 1.3,
                1000.3,
                'a string',
                array('foo', 'bar'),
            ),
            'foo_bar' => new Reference('foo_bar'),
            'mixedcase' => array('MixedCaseKey' => 'value'),
            'constant' => PHP_EOL,
        );

        $this->assertEquals($expected, $actual, '->load() converts XML values to PHP ones');
    }

    public function testLoadImports()
    {
        $container = new ContainerBuilder();
        $resolver = new LoaderResolver(array(
            new IniFileLoader($container, new FileLocator(self::$fixturesPath.'/xml')),
            new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml')),
            $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml')),
        ));
        $loader->setResolver($resolver);
        $loader->load('services4.xml');

        $actual = $container->getParameterBag()->all();
        $expected = array(
            'a string',
            'foo' => 'bar',
            'values' => array(
                0,
                'integer' => 4,
                100 => null,
                'true',
                true,
                false,
                'on',
                'off',
                'float' => 1.3,
                1000.3,
                'a string',
                array('foo', 'bar'),
            ),
            'foo_bar' => new Reference('foo_bar'),
            'mixedcase' => array('MixedCaseKey' => 'value'),
            'constant' => PHP_EOL,
            'bar' => '%foo%',
            'imported_from_ini' => true,
            'imported_from_yaml' => true
        );

        $this->assertEquals(array_keys($expected), array_keys($actual), '->load() imports and merges imported files');

        // Bad import throws no exception due to ignore_errors value.
        $loader->load('services4_bad_import.xml');
    }

    public function testLoadAnonymousServices()
    {
        $container = new ContainerBuilder();
        $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
        $loader->load('services5.xml');
        $services = $container->getDefinitions();
        $this->assertCount(4, $services, '->load() attributes unique ids to anonymous services');

        // anonymous service as an argument
        $args = $services['foo']->getArguments();
        $this->assertCount(1, $args, '->load() references anonymous services as "normal" ones');
        $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Reference', $args[0], '->load() converts anonymous services to references to "normal" services');
        $this->assertTrue(isset($services[(string) $args[0]]), '->load() makes a reference to the created ones');
        $inner = $services[(string) $args[0]];
        $this->assertEquals('BarClass', $inner->getClass(), '->load() uses the same configuration as for the anonymous ones');

        // inner anonymous services
        $args = $inner->getArguments();
        $this->assertCount(1, $args, '->load() references anonymous services as "normal" ones');
        $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Reference', $args[0], '->load() converts anonymous services to references to "normal" services');
        $this->assertTrue(isset($services[(string) $args[0]]), '->load() makes a reference to the created ones');
        $inner = $services[(string) $args[0]];
        $this->assertEquals('BazClass', $inner->getClass(), '->load() uses the same configuration as for the anonymous ones');

        // anonymous service as a property
        $properties = $services['foo']->getProperties();
        $property = $properties['p'];
        $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Reference', $property, '->load() converts anonymous services to references to "normal" services');
        $this->assertTrue(isset($services[(string) $property]), '->load() makes a reference to the created ones');
        $inner = $services[(string) $property];
        $this->assertEquals('BazClass', $inner->getClass(), '->load() uses the same configuration as for the anonymous ones');
    }

    public function testLoadServices()
    {
        $container = new ContainerBuilder();
        $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
        $loader->load('services6.xml');
        $services = $container->getDefinitions();
        $this->assertTrue(isset($services['foo']), '->load() parses <service> elements');
        $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Definition', $services['foo'], '->load() converts <service> element to Definition instances');
        $this->assertEquals('FooClass', $services['foo']->getClass(), '->load() parses the class attribute');
        $this->assertEquals('container', $services['scope.container']->getScope());
        $this->assertEquals('custom', $services['scope.custom']->getScope());
        $this->assertEquals('prototype', $services['scope.prototype']->getScope());
        $this->assertEquals('getInstance', $services['constructor']->getFactoryMethod(), '->load() parses the factory-method attribute');
        $this->assertEquals('%path%/foo.php', $services['file']->getFile(), '->load() parses the file tag');
        $this->assertEquals(array('foo', new Reference('foo'), array(true, false)), $services['arguments']->getArguments(), '->load() parses the argument tags');
        $this->assertEquals('sc_configure', $services['configurator1']->getConfigurator(), '->load() parses the configurator tag');
        $this->assertEquals(array(new Reference('baz', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, false), 'configure'), $services['configurator2']->getConfigurator(), '->load() parses the configurator tag');
        $this->assertEquals(array('BazClass', 'configureStatic'), $services['configurator3']->getConfigurator(), '->load() parses the configurator tag');
        $this->assertEquals(array(array('setBar', array()), array('setBar', array(new Expression('service("foo").foo() ~ parameter("foo")')))), $services['method_call1']->getMethodCalls(), '->load() parses the method_call tag');
        $this->assertEquals(array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), $services['method_call2']->getMethodCalls(), '->load() parses the method_call tag');
        $this->assertNull($services['factory_service']->getClass());
        $this->assertEquals('getInstance', $services['factory_service']->getFactoryMethod());
        $this->assertEquals('baz_factory', $services['factory_service']->getFactoryService());

        $this->assertTrue($services['request']->isSynthetic(), '->load() parses the synthetic flag');
        $this->assertTrue($services['request']->isSynchronized(), '->load() parses the synchronized flag');
        $this->assertTrue($services['request']->isLazy(), '->load() parses the lazy flag');

        $aliases = $container->getAliases();
        $this->assertTrue(isset($aliases['alias_for_foo']), '->load() parses <service> elements');
        $this->assertEquals('foo', (string) $aliases['alias_for_foo'], '->load() parses aliases');
        $this->assertTrue($aliases['alias_for_foo']->isPublic());
        $this->assertTrue(isset($aliases['another_alias_for_foo']));
        $this->assertEquals('foo', (string) $aliases['another_alias_for_foo']);
        $this->assertFalse($aliases['another_alias_for_foo']->isPublic());
    }

    public function testParsesTags()
    {
        $container = new ContainerBuilder();
        $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
        $loader->load('services10.xml');

        $services = $container->findTaggedServiceIds('foo_tag');
        $this->assertCount(1, $services);

        foreach ($services as $id => $tagAttributes) {
            foreach ($tagAttributes as $attributes) {
                $this->assertArrayHasKey('other_option', $attributes);
                $this->assertEquals('lorem', $attributes['other_option']);
                $this->assertArrayHasKey('other-option', $attributes, 'unnormalized tag attributes should not be removed');

                $this->assertEquals('ciz', $attributes['some_option'], 'no overriding should be done when normalizing');
                $this->assertEquals('cat', $attributes['some-option']);

                $this->assertArrayNotHasKey('an_other_option', $attributes, 'normalization should not be done when an underscore is already found');
            }
        }
    }

    public function testConvertDomElementToArray()
    {
        $doc = new \DOMDocument("1.0");
        $doc->loadXML('<foo>bar</foo>');
        $this->assertEquals('bar', XmlFileLoader::convertDomElementToArray($doc->documentElement), '::convertDomElementToArray() converts a \DomElement to an array');

        $doc = new \DOMDocument("1.0");
        $doc->loadXML('<foo foo="bar" />');
        $this->assertEquals(array('foo' => 'bar'), XmlFileLoader::convertDomElementToArray($doc->documentElement), '::convertDomElementToArray() converts a \DomElement to an array');

        $doc = new \DOMDocument("1.0");
        $doc->loadXML('<foo><foo>bar</foo></foo>');
        $this->assertEquals(array('foo' => 'bar'), XmlFileLoader::convertDomElementToArray($doc->documentElement), '::convertDomElementToArray() converts a \DomElement to an array');

        $doc = new \DOMDocument("1.0");
        $doc->loadXML('<foo><foo>bar<foo>bar</foo></foo></foo>');
        $this->assertEquals(array('foo' => array('value' => 'bar', 'foo' => 'bar')), XmlFileLoader::convertDomElementToArray($doc->documentElement), '::convertDomElementToArray() converts a \DomElement to an array');

        $doc = new \DOMDocument("1.0");
        $doc->loadXML('<foo><foo></foo></foo>');
        $this->assertEquals(array('foo' => null), XmlFileLoader::convertDomElementToArray($doc->documentElement), '::convertDomElementToArray() converts a \DomElement to an array');

        $doc = new \DOMDocument("1.0");
        $doc->loadXML('<foo><foo><!-- foo --></foo></foo>');
        $this->assertEquals(array('foo' => null), XmlFileLoader::convertDomElementToArray($doc->documentElement), '::convertDomElementToArray() converts a \DomElement to an array');

        $doc = new \DOMDocument("1.0");
        $doc->loadXML('<foo><foo foo="bar"/><foo foo="bar"/></foo>');
        $this->assertEquals(array('foo' => array(array('foo' => 'bar'), array('foo' => 'bar'))), XmlFileLoader::convertDomElementToArray($doc->documentElement), '::convertDomElementToArray() converts a \DomElement to an array');
    }

    public function testExtensions()
    {
        $container = new ContainerBuilder();
        $container->registerExtension(new \ProjectExtension());
        $container->registerExtension(new \ProjectWithXsdExtension());
        $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));

        // extension without an XSD
        $loader->load('extensions/services1.xml');
        $container->compile();
        $services = $container->getDefinitions();
        $parameters = $container->getParameterBag()->all();

        $this->assertTrue(isset($services['project.service.bar']), '->load() parses extension elements');
        $this->assertTrue(isset($parameters['project.parameter.bar']), '->load() parses extension elements');

        $this->assertEquals('BAR', $services['project.service.foo']->getClass(), '->load() parses extension elements');
        $this->assertEquals('BAR', $parameters['project.parameter.foo'], '->load() parses extension elements');

        // extension with an XSD
        $container = new ContainerBuilder();
        $container->registerExtension(new \ProjectExtension());
        $container->registerExtension(new \ProjectWithXsdExtension());
        $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
        $loader->load('extensions/services2.xml');
        $container->compile();
        $services = $container->getDefinitions();
        $parameters = $container->getParameterBag()->all();

        $this->assertTrue(isset($services['project.service.bar']), '->load() parses extension elements');
        $this->assertTrue(isset($parameters['project.parameter.bar']), '->load() parses extension elements');

        $this->assertEquals('BAR', $services['project.service.foo']->getClass(), '->load() parses extension elements');
        $this->assertEquals('BAR', $parameters['project.parameter.foo'], '->load() parses extension elements');

        $container = new ContainerBuilder();
        $container->registerExtension(new \ProjectExtension());
        $container->registerExtension(new \ProjectWithXsdExtension());
        $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));

        // extension with an XSD (does not validate)
        try {
            $loader->load('extensions/services3.xml');
            $this->fail('->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
            $this->assertRegExp(sprintf('#^Unable to parse file ".+%s".$#', 'services3.xml'), $e->getMessage(), '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');

            $e = $e->getPrevious();
            $this->assertInstanceOf('InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
            $this->assertContains('The attribute \'bar\' is not allowed', $e->getMessage(), '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
        }

        // non-registered extension
        try {
            $loader->load('extensions/services4.xml');
            $this->fail('->load() throws an InvalidArgumentException if the tag is not valid');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the tag is not valid');
            $this->assertStringStartsWith('There is no extension able to load the configuration for "project:bar" (in', $e->getMessage(), '->load() throws an InvalidArgumentException if the tag is not valid');
        }
    }

    public function testExtensionInPhar()
    {
        if (extension_loaded('suhosin') && false === strpos(ini_get('suhosin.executor.include.whitelist'), 'phar')) {
            $this->markTestSkipped('To run this test, add "phar" to the "suhosin.executor.include.whitelist" settings in your php.ini file.');
        }

        require_once self::$fixturesPath.'/includes/ProjectWithXsdExtensionInPhar.phar';

        // extension with an XSD in PHAR archive
        $container = new ContainerBuilder();
        $container->registerExtension(new \ProjectWithXsdExtensionInPhar());
        $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));
        $loader->load('extensions/services6.xml');

        // extension with an XSD in PHAR archive (does not validate)
        try {
            $loader->load('extensions/services7.xml');
            $this->fail('->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
            $this->assertRegExp(sprintf('#^Unable to parse file ".+%s".$#', 'services7.xml'), $e->getMessage(), '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');

            $e = $e->getPrevious();
            $this->assertInstanceOf('InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
            $this->assertContains('The attribute \'bar\' is not allowed', $e->getMessage(), '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
        }
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Loader\XmlFileLoader::supports
     */
    public function testSupports()
    {
        $loader = new XmlFileLoader(new ContainerBuilder(), new FileLocator());

        $this->assertTrue($loader->supports('foo.xml'), '->supports() returns true if the resource is loadable');
        $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
    }

    public function testNoNamingConflictsForAnonymousServices()
    {
        $container = new ContainerBuilder();

        $loader1 = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml/extension1'));
        $loader1->load('services.xml');
        $services = $container->getDefinitions();
        $this->assertCount(2, $services, '->load() attributes unique ids to anonymous services');
        $loader2 = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml/extension2'));
        $loader2->load('services.xml');
        $services = $container->getDefinitions();
        $this->assertCount(4, $services, '->load() attributes unique ids to anonymous services');

        $services = $container->getDefinitions();
        $args1 = $services['extension1.foo']->getArguments();
        $inner1 = $services[(string) $args1[0]];
        $this->assertEquals('BarClass1', $inner1->getClass(), '->load() uses the same configuration as for the anonymous ones');
        $args2 = $services['extension2.foo']->getArguments();
        $inner2 = $services[(string) $args2[0]];
        $this->assertEquals('BarClass2', $inner2->getClass(), '->load() uses the same configuration as for the anonymous ones');
    }

    public function testDocTypeIsNotAllowed()
    {
        $container = new ContainerBuilder();

        $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml'));

        // document types are not allowed.
        try {
            $loader->load('withdoctype.xml');
            $this->fail('->load() throws an InvalidArgumentException if the configuration contains a document type');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Exception\\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the configuration contains a document type');
            $this->assertRegExp(sprintf('#^Unable to parse file ".+%s".$#', 'withdoctype.xml'), $e->getMessage(), '->load() throws an InvalidArgumentException if the configuration contains a document type');

            $e = $e->getPrevious();
            $this->assertInstanceOf('InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the configuration contains a document type');
            $this->assertSame('Document types are not allowed.', $e->getMessage(), '->load() throws an InvalidArgumentException if the configuration contains a document type');
        }
    }
}
PKb�\SR���fpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Loader;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\Config\FileLocator;

class PhpFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\DependencyInjection\Loader\PhpFileLoader::supports
     */
    public function testSupports()
    {
        $loader = new PhpFileLoader(new ContainerBuilder(), new FileLocator());

        $this->assertTrue($loader->supports('foo.php'), '->supports() returns true if the resource is loadable');
        $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Loader\PhpFileLoader::load
     */
    public function testLoad()
    {
        $loader = new PhpFileLoader($container = new ContainerBuilder(), new FileLocator());

        $loader->load(__DIR__.'/../Fixtures/php/simple.php');

        $this->assertEquals('foo', $container->getParameter('foo'), '->load() loads a PHP file resource');
    }
}
PKb�\ł``fpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader/ClosureLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Loader;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;

class ClosureLoaderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\DependencyInjection\Loader\ClosureLoader::supports
     */
    public function testSupports()
    {
        $loader = new ClosureLoader(new ContainerBuilder());

        $this->assertTrue($loader->supports(function ($container) {}), '->supports() returns true if the resource is loadable');
        $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Loader\ClosureLoader::load
     */
    public function testLoad()
    {
        $loader = new ClosureLoader($container = new ContainerBuilder());

        $loader->load(function ($container) {
            $container->setParameter('foo', 'foo');
        });

        $this->assertEquals('foo', $container->getParameter('foo'), '->load() loads a \Closure resource');
    }
}
PKb�\���
�
fpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader/IniFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Loader;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
use Symfony\Component\Config\FileLocator;

class IniFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    protected $container;
    protected $loader;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = realpath(__DIR__.'/../Fixtures/');
    }

    protected function setUp()
    {
        $this->container = new ContainerBuilder();
        $this->loader    = new IniFileLoader($this->container, new FileLocator(self::$fixturesPath.'/ini'));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Loader\IniFileLoader::__construct
     * @covers Symfony\Component\DependencyInjection\Loader\IniFileLoader::load
     */
    public function testIniFileCanBeLoaded()
    {
        $this->loader->load('parameters.ini');
        $this->assertEquals(array('foo' => 'bar', 'bar' => '%foo%'), $this->container->getParameterBag()->all(), '->load() takes a single file name as its first argument');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Loader\IniFileLoader::__construct
     * @covers Symfony\Component\DependencyInjection\Loader\IniFileLoader::load
     *
     * @expectedException        \InvalidArgumentException
     * @expectedExceptionMessage The file "foo.ini" does not exist (in:
     */
    public function testExceptionIsRaisedWhenIniFileDoesNotExist()
    {
        $this->loader->load('foo.ini');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Loader\IniFileLoader::__construct
     * @covers Symfony\Component\DependencyInjection\Loader\IniFileLoader::load
     *
     * @expectedException        \InvalidArgumentException
     * @expectedExceptionMessage The "nonvalid.ini" file is not valid.
     */
    public function testExceptionIsRaisedWhenIniFileCannotBeParsed()
    {
        @$this->loader->load('nonvalid.ini');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Loader\IniFileLoader::supports
     */
    public function testSupports()
    {
        $loader = new IniFileLoader(new ContainerBuilder(), new FileLocator());

        $this->assertTrue($loader->supports('foo.ini'), '->supports() returns true if the resource is loadable');
        $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
    }
}
PKb�\�kV�0�0gpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\Loader;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\ExpressionLanguage\Expression;

class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = realpath(__DIR__.'/../Fixtures/');
        require_once self::$fixturesPath.'/includes/foo.php';
        require_once self::$fixturesPath.'/includes/ProjectExtension.php';
    }

    public function testLoadFile()
    {
        $loader = new YamlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/ini'));
        $r = new \ReflectionObject($loader);
        $m = $r->getMethod('loadFile');
        $m->setAccessible(true);

        try {
            $m->invoke($loader, 'foo.yml');
            $this->fail('->load() throws an InvalidArgumentException if the loaded file does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the loaded file does not exist');
            $this->assertEquals('The service file "foo.yml" is not valid.', $e->getMessage(), '->load() throws an InvalidArgumentException if the loaded file does not exist');
        }

        try {
            $m->invoke($loader, 'parameters.ini');
            $this->fail('->load() throws an InvalidArgumentException if the loaded file is not a valid YAML file');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the loaded file is not a valid YAML file');
            $this->assertEquals('The service file "parameters.ini" is not valid.', $e->getMessage(), '->load() throws an InvalidArgumentException if the loaded file is not a valid YAML file');
        }

        $loader = new YamlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/yaml'));

        foreach (array('nonvalid1', 'nonvalid2') as $fixture) {
            try {
                $m->invoke($loader, $fixture.'.yml');
                $this->fail('->load() throws an InvalidArgumentException if the loaded file does not validate');
            } catch (\Exception $e) {
                $this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the loaded file does not validate');
                $this->assertStringMatchesFormat('The service file "nonvalid%d.yml" is not valid.', $e->getMessage(), '->load() throws an InvalidArgumentException if the loaded file does not validate');
            }
        }
    }

    public function testLoadParameters()
    {
        $container = new ContainerBuilder();
        $loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml'));
        $loader->load('services2.yml');
        $this->assertEquals(array('foo' => 'bar', 'mixedcase' => array('MixedCaseKey' => 'value'), 'values' => array(true, false, 0, 1000.3), 'bar' => 'foo', 'escape' => '@escapeme', 'foo_bar' => new Reference('foo_bar')), $container->getParameterBag()->all(), '->load() converts YAML keys to lowercase');
    }

    public function testLoadImports()
    {
        $container = new ContainerBuilder();
        $resolver = new LoaderResolver(array(
            new IniFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml')),
            new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml')),
            new PhpFileLoader($container, new FileLocator(self::$fixturesPath.'/php')),
            $loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml')),
        ));
        $loader->setResolver($resolver);
        $loader->load('services4.yml');

        $actual = $container->getParameterBag()->all();
        $expected = array('foo' => 'bar', 'values' => array(true, false), 'bar' => '%foo%', 'escape' => '@escapeme', 'foo_bar' => new Reference('foo_bar'), 'mixedcase' => array('MixedCaseKey' => 'value'), 'imported_from_ini' => true, 'imported_from_xml' => true);
        $this->assertEquals(array_keys($expected), array_keys($actual), '->load() imports and merges imported files');

        // Bad import throws no exception due to ignore_errors value.
        $loader->load('services4_bad_import.yml');
    }

    public function testLoadServices()
    {
        $container = new ContainerBuilder();
        $loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml'));
        $loader->load('services6.yml');
        $services = $container->getDefinitions();
        $this->assertTrue(isset($services['foo']), '->load() parses service elements');
        $this->assertInstanceOf('Symfony\\Component\\DependencyInjection\\Definition', $services['foo'], '->load() converts service element to Definition instances');
        $this->assertEquals('FooClass', $services['foo']->getClass(), '->load() parses the class attribute');
        $this->assertEquals('container', $services['scope.container']->getScope());
        $this->assertEquals('custom', $services['scope.custom']->getScope());
        $this->assertEquals('prototype', $services['scope.prototype']->getScope());
        $this->assertEquals('getInstance', $services['constructor']->getFactoryMethod(), '->load() parses the factory_method attribute');
        $this->assertEquals('%path%/foo.php', $services['file']->getFile(), '->load() parses the file tag');
        $this->assertEquals(array('foo', new Reference('foo'), array(true, false)), $services['arguments']->getArguments(), '->load() parses the argument tags');
        $this->assertEquals('sc_configure', $services['configurator1']->getConfigurator(), '->load() parses the configurator tag');
        $this->assertEquals(array(new Reference('baz'), 'configure'), $services['configurator2']->getConfigurator(), '->load() parses the configurator tag');
        $this->assertEquals(array('BazClass', 'configureStatic'), $services['configurator3']->getConfigurator(), '->load() parses the configurator tag');
        $this->assertEquals(array(array('setBar', array()), array('setBar', array()), array('setBar', array(new Expression('service("foo").foo() ~ parameter("foo")')))), $services['method_call1']->getMethodCalls(), '->load() parses the method_call tag');
        $this->assertEquals(array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), $services['method_call2']->getMethodCalls(), '->load() parses the method_call tag');
        $this->assertEquals('baz_factory', $services['factory_service']->getFactoryService());

        $this->assertTrue($services['request']->isSynthetic(), '->load() parses the synthetic flag');
        $this->assertTrue($services['request']->isSynchronized(), '->load() parses the synchronized flag');
        $this->assertTrue($services['request']->isLazy(), '->load() parses the lazy flag');

        $aliases = $container->getAliases();
        $this->assertTrue(isset($aliases['alias_for_foo']), '->load() parses aliases');
        $this->assertEquals('foo', (string) $aliases['alias_for_foo'], '->load() parses aliases');
        $this->assertTrue($aliases['alias_for_foo']->isPublic());
        $this->assertTrue(isset($aliases['another_alias_for_foo']));
        $this->assertEquals('foo', (string) $aliases['another_alias_for_foo']);
        $this->assertFalse($aliases['another_alias_for_foo']->isPublic());
    }

    public function testExtensions()
    {
        $container = new ContainerBuilder();
        $container->registerExtension(new \ProjectExtension());
        $loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml'));
        $loader->load('services10.yml');
        $container->compile();
        $services = $container->getDefinitions();
        $parameters = $container->getParameterBag()->all();

        $this->assertTrue(isset($services['project.service.bar']), '->load() parses extension elements');
        $this->assertTrue(isset($parameters['project.parameter.bar']), '->load() parses extension elements');

        $this->assertEquals('BAR', $services['project.service.foo']->getClass(), '->load() parses extension elements');
        $this->assertEquals('BAR', $parameters['project.parameter.foo'], '->load() parses extension elements');

        try {
            $loader->load('services11.yml');
            $this->fail('->load() throws an InvalidArgumentException if the tag is not valid');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the tag is not valid');
            $this->assertStringStartsWith('There is no extension able to load the configuration for "foobarfoobar" (in', $e->getMessage(), '->load() throws an InvalidArgumentException if the tag is not valid');
        }
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Loader\YamlFileLoader::supports
     */
    public function testSupports()
    {
        $loader = new YamlFileLoader(new ContainerBuilder(), new FileLocator());

        $this->assertTrue($loader->supports('foo.yml'), '->supports() returns true if the resource is loadable');
        $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
    }

    public function testNonArrayTagThrowsException()
    {
        $loader = new YamlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/yaml'));
        try {
            $loader->load('badtag1.yml');
            $this->fail('->load() should throw an exception when the tags key of a service is not an array');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\DependencyInjection\Exception\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the tags key is not an array');
            $this->assertStringStartsWith('Parameter "tags" must be an array for service', $e->getMessage(), '->load() throws an InvalidArgumentException if the tags key is not an array');
        }
    }

    public function testTagWithoutNameThrowsException()
    {
        $loader = new YamlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/yaml'));
        try {
            $loader->load('badtag2.yml');
            $this->fail('->load() should throw an exception when a tag is missing the name key');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\DependencyInjection\Exception\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if a tag is missing the name key');
            $this->assertStringStartsWith('A "tags" entry is missing a "name" key for service ', $e->getMessage(), '->load() throws an InvalidArgumentException if a tag is missing the name key');
        }
    }

    public function testTagWithAttributeArrayThrowsException()
    {
        $loader = new YamlFileLoader(new ContainerBuilder(), new FileLocator(self::$fixturesPath.'/yaml'));
        try {
            $loader->load('badtag3.yml');
            $this->fail('->load() should throw an exception when a tag-attribute is not a scalar');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\DependencyInjection\Exception\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if a tag-attribute is not a scalar');
            $this->assertStringStartsWith('A "tags" attribute must be of a scalar-type for service "foo_service", tag "foo", attribute "bar"', $e->getMessage(), '->load() throws an InvalidArgumentException if a tag-attribute is not a scalar');
        }
    }
}
PKb�\y�MV����bpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests;

require_once __DIR__.'/Fixtures/includes/classes.php';
require_once __DIR__.'/Fixtures/includes/ProjectExtension.php';

use Symfony\Component\Config\Resource\ResourceInterface;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\Scope;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\ExpressionLanguage\Expression;

class ContainerBuilderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::setDefinitions
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getDefinitions
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::setDefinition
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getDefinition
     */
    public function testDefinitions()
    {
        $builder = new ContainerBuilder();
        $definitions = array(
            'foo' => new Definition('FooClass'),
            'bar' => new Definition('BarClass'),
        );
        $builder->setDefinitions($definitions);
        $this->assertEquals($definitions, $builder->getDefinitions(), '->setDefinitions() sets the service definitions');
        $this->assertTrue($builder->hasDefinition('foo'), '->hasDefinition() returns true if a service definition exists');
        $this->assertFalse($builder->hasDefinition('foobar'), '->hasDefinition() returns false if a service definition does not exist');

        $builder->setDefinition('foobar', $foo = new Definition('FooBarClass'));
        $this->assertEquals($foo, $builder->getDefinition('foobar'), '->getDefinition() returns a service definition if defined');
        $this->assertTrue($builder->setDefinition('foobar', $foo = new Definition('FooBarClass')) === $foo, '->setDefinition() implements a fluid interface by returning the service reference');

        $builder->addDefinitions($defs = array('foobar' => new Definition('FooBarClass')));
        $this->assertEquals(array_merge($definitions, $defs), $builder->getDefinitions(), '->addDefinitions() adds the service definitions');

        try {
            $builder->getDefinition('baz');
            $this->fail('->getDefinition() throws an InvalidArgumentException if the service definition does not exist');
        } catch (\InvalidArgumentException $e) {
            $this->assertEquals('The service definition "baz" does not exist.', $e->getMessage(), '->getDefinition() throws an InvalidArgumentException if the service definition does not exist');
        }
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::register
     */
    public function testRegister()
    {
        $builder = new ContainerBuilder();
        $builder->register('foo', 'FooClass');
        $this->assertTrue($builder->hasDefinition('foo'), '->register() registers a new service definition');
        $this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $builder->getDefinition('foo'), '->register() returns the newly created Definition instance');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::has
     */
    public function testHas()
    {
        $builder = new ContainerBuilder();
        $this->assertFalse($builder->has('foo'), '->has() returns false if the service does not exist');
        $builder->register('foo', 'FooClass');
        $this->assertTrue($builder->has('foo'), '->has() returns true if a service definition exists');
        $builder->set('bar', new \stdClass());
        $this->assertTrue($builder->has('bar'), '->has() returns true if a service exists');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::get
     */
    public function testGet()
    {
        $builder = new ContainerBuilder();
        try {
            $builder->get('foo');
            $this->fail('->get() throws an InvalidArgumentException if the service does not exist');
        } catch (\InvalidArgumentException $e) {
            $this->assertEquals('The service definition "foo" does not exist.', $e->getMessage(), '->get() throws an InvalidArgumentException if the service does not exist');
        }

        $this->assertNull($builder->get('foo', ContainerInterface::NULL_ON_INVALID_REFERENCE), '->get() returns null if the service does not exist and NULL_ON_INVALID_REFERENCE is passed as a second argument');

        $builder->register('foo', 'stdClass');
        $this->assertInternalType('object', $builder->get('foo'), '->get() returns the service definition associated with the id');
        $builder->set('bar', $bar = new \stdClass());
        $this->assertEquals($bar, $builder->get('bar'), '->get() returns the service associated with the id');
        $builder->register('bar', 'stdClass');
        $this->assertEquals($bar, $builder->get('bar'), '->get() returns the service associated with the id even if a definition has been defined');

        $builder->register('baz', 'stdClass')->setArguments(array(new Reference('baz')));
        try {
            @$builder->get('baz');
            $this->fail('->get() throws a ServiceCircularReferenceException if the service has a circular reference to itself');
        } catch (\Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException $e) {
            $this->assertEquals('Circular reference detected for service "baz", path: "baz".', $e->getMessage(), '->get() throws a LogicException if the service has a circular reference to itself');
        }

        $builder->register('foobar', 'stdClass')->setScope('container');
        $this->assertTrue($builder->get('bar') === $builder->get('bar'), '->get() always returns the same instance if the service is shared');
    }

    /**
     * @covers                   \Symfony\Component\DependencyInjection\ContainerBuilder::get
     * @expectedException        \Symfony\Component\DependencyInjection\Exception\RuntimeException
     * @expectedExceptionMessage You have requested a synthetic service ("foo"). The DIC does not know how to construct this service.
     */
    public function testGetUnsetLoadingServiceWhenCreateServiceThrowsAnException()
    {
        $builder = new ContainerBuilder();
        $builder->register('foo', 'stdClass')->setSynthetic(true);

        // we expect a RuntimeException here as foo is synthetic
        try {
            $builder->get('foo');
        } catch (RuntimeException $e) {
        }

        // we must also have the same RuntimeException here
        $builder->get('foo');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::get
     */
    public function testGetReturnsNullOnInactiveScope()
    {
        $builder = new ContainerBuilder();
        $builder->register('foo', 'stdClass')->setScope('request');

        $this->assertNull($builder->get('foo', ContainerInterface::NULL_ON_INVALID_REFERENCE));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::get
     */
    public function testGetReturnsNullOnInactiveScopeWhenServiceIsCreatedByAMethod()
    {
        $builder = new ProjectContainer();

        $this->assertNull($builder->get('foobaz', ContainerInterface::NULL_ON_INVALID_REFERENCE));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getServiceIds
     */
    public function testGetServiceIds()
    {
        $builder = new ContainerBuilder();
        $builder->register('foo', 'stdClass');
        $builder->bar = $bar = new \stdClass();
        $builder->register('bar', 'stdClass');
        $this->assertEquals(array('foo', 'bar', 'service_container'), $builder->getServiceIds(), '->getServiceIds() returns all defined service ids');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::setAlias
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::hasAlias
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getAlias
     */
    public function testAliases()
    {
        $builder = new ContainerBuilder();
        $builder->register('foo', 'stdClass');
        $builder->setAlias('bar', 'foo');
        $this->assertTrue($builder->hasAlias('bar'), '->hasAlias() returns true if the alias exists');
        $this->assertFalse($builder->hasAlias('foobar'), '->hasAlias() returns false if the alias does not exist');
        $this->assertEquals('foo', (string) $builder->getAlias('bar'), '->getAlias() returns the aliased service');
        $this->assertTrue($builder->has('bar'), '->setAlias() defines a new service');
        $this->assertTrue($builder->get('bar') === $builder->get('foo'), '->setAlias() creates a service that is an alias to another one');

        try {
            $builder->getAlias('foobar');
            $this->fail('->getAlias() throws an InvalidArgumentException if the alias does not exist');
        } catch (\InvalidArgumentException $e) {
            $this->assertEquals('The service alias "foobar" does not exist.', $e->getMessage(), '->getAlias() throws an InvalidArgumentException if the alias does not exist');
        }
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getAliases
     */
    public function testGetAliases()
    {
        $builder = new ContainerBuilder();
        $builder->setAlias('bar', 'foo');
        $builder->setAlias('foobar', 'foo');
        $builder->setAlias('moo', new Alias('foo', false));

        $aliases = $builder->getAliases();
        $this->assertEquals('foo', (string) $aliases['bar']);
        $this->assertTrue($aliases['bar']->isPublic());
        $this->assertEquals('foo', (string) $aliases['foobar']);
        $this->assertEquals('foo', (string) $aliases['moo']);
        $this->assertFalse($aliases['moo']->isPublic());

        $builder->register('bar', 'stdClass');
        $this->assertFalse($builder->hasAlias('bar'));

        $builder->set('foobar', 'stdClass');
        $builder->set('moo', 'stdClass');
        $this->assertCount(0, $builder->getAliases(), '->getAliases() does not return aliased services that have been overridden');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::setAliases
     */
    public function testSetAliases()
    {
        $builder = new ContainerBuilder();
        $builder->setAliases(array('bar' => 'foo', 'foobar' => 'foo'));

        $aliases = $builder->getAliases();
        $this->assertTrue(isset($aliases['bar']));
        $this->assertTrue(isset($aliases['foobar']));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::addAliases
     */
    public function testAddAliases()
    {
        $builder = new ContainerBuilder();
        $builder->setAliases(array('bar' => 'foo'));
        $builder->addAliases(array('foobar' => 'foo'));

        $aliases = $builder->getAliases();
        $this->assertTrue(isset($aliases['bar']));
        $this->assertTrue(isset($aliases['foobar']));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::addCompilerPass
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getCompilerPassConfig
     */
    public function testAddGetCompilerPass()
    {
        $builder = new ContainerBuilder();
        $builder->setResourceTracking(false);
        $builderCompilerPasses = $builder->getCompiler()->getPassConfig()->getPasses();
        $builder->addCompilerPass($this->getMock('Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface'));
        $this->assertEquals(sizeof($builderCompilerPasses) + 1, sizeof($builder->getCompiler()->getPassConfig()->getPasses()));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::createService
     */
    public function testCreateService()
    {
        $builder = new ContainerBuilder();
        $builder->register('foo1', 'FooClass')->setFile(__DIR__.'/Fixtures/includes/foo.php');
        $this->assertInstanceOf('\FooClass', $builder->get('foo1'), '->createService() requires the file defined by the service definition');
        $builder->register('foo2', 'FooClass')->setFile(__DIR__.'/Fixtures/includes/%file%.php');
        $builder->setParameter('file', 'foo');
        $this->assertInstanceOf('\FooClass', $builder->get('foo2'), '->createService() replaces parameters in the file provided by the service definition');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::createService
     */
    public function testCreateProxyWithRealServiceInstantiator()
    {
        $builder = new ContainerBuilder();

        $builder->register('foo1', 'FooClass')->setFile(__DIR__.'/Fixtures/includes/foo.php');
        $builder->getDefinition('foo1')->setLazy(true);

        $foo1 = $builder->get('foo1');

        $this->assertSame($foo1, $builder->get('foo1'), 'The same proxy is retrieved on multiple subsequent calls');
        $this->assertSame('FooClass', get_class($foo1));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::createService
     */
    public function testCreateServiceClass()
    {
        $builder = new ContainerBuilder();
        $builder->register('foo1', '%class%');
        $builder->setParameter('class', 'stdClass');
        $this->assertInstanceOf('\stdClass', $builder->get('foo1'), '->createService() replaces parameters in the class provided by the service definition');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::createService
     */
    public function testCreateServiceArguments()
    {
        $builder = new ContainerBuilder();
        $builder->register('bar', 'stdClass');
        $builder->register('foo1', 'FooClass')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar'), '%%unescape_it%%'));
        $builder->setParameter('value', 'bar');
        $this->assertEquals(array('foo' => 'bar', 'bar' => 'foo', $builder->get('bar'), '%unescape_it%'), $builder->get('foo1')->arguments, '->createService() replaces parameters and service references in the arguments provided by the service definition');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::createService
     */
    public function testCreateServiceFactoryMethod()
    {
        $builder = new ContainerBuilder();
        $builder->register('bar', 'stdClass');
        $builder->register('foo1', 'FooClass')->setFactoryClass('FooClass')->setFactoryMethod('getInstance')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar')));
        $builder->setParameter('value', 'bar');
        $this->assertTrue($builder->get('foo1')->called, '->createService() calls the factory method to create the service instance');
        $this->assertEquals(array('foo' => 'bar', 'bar' => 'foo', $builder->get('bar')), $builder->get('foo1')->arguments, '->createService() passes the arguments to the factory method');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::createService
     */
    public function testCreateServiceFactoryService()
    {
        $builder = new ContainerBuilder();
        $builder->register('baz_service')->setFactoryService('baz_factory')->setFactoryMethod('getInstance');
        $builder->register('baz_factory', 'BazClass');

        $this->assertInstanceOf('BazClass', $builder->get('baz_service'));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::createService
     */
    public function testCreateServiceMethodCalls()
    {
        $builder = new ContainerBuilder();
        $builder->register('bar', 'stdClass');
        $builder->register('foo1', 'FooClass')->addMethodCall('setBar', array(array('%value%', new Reference('bar'))));
        $builder->setParameter('value', 'bar');
        $this->assertEquals(array('bar', $builder->get('bar')), $builder->get('foo1')->bar, '->createService() replaces the values in the method calls arguments');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::createService
     */
    public function testCreateServiceConfigurator()
    {
        $builder = new ContainerBuilder();
        $builder->register('foo1', 'FooClass')->setConfigurator('sc_configure');
        $this->assertTrue($builder->get('foo1')->configured, '->createService() calls the configurator');

        $builder->register('foo2', 'FooClass')->setConfigurator(array('%class%', 'configureStatic'));
        $builder->setParameter('class', 'BazClass');
        $this->assertTrue($builder->get('foo2')->configured, '->createService() calls the configurator');

        $builder->register('baz', 'BazClass');
        $builder->register('foo3', 'FooClass')->setConfigurator(array(new Reference('baz'), 'configure'));
        $this->assertTrue($builder->get('foo3')->configured, '->createService() calls the configurator');

        $builder->register('foo4', 'FooClass')->setConfigurator('foo');
        try {
            $builder->get('foo4');
            $this->fail('->createService() throws an InvalidArgumentException if the configure callable is not a valid callable');
        } catch (\InvalidArgumentException $e) {
            $this->assertEquals('The configure callable for class "FooClass" is not a callable.', $e->getMessage(), '->createService() throws an InvalidArgumentException if the configure callable is not a valid callable');
        }
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::createService
     * @expectedException \RuntimeException
     */
    public function testCreateSyntheticService()
    {
        $builder = new ContainerBuilder();
        $builder->register('foo', 'FooClass')->setSynthetic(true);
        $builder->get('foo');
    }

    public function testCreateServiceWithExpression()
    {
        $builder = new ContainerBuilder();
        $builder->setParameter('bar', 'bar');
        $builder->register('bar', 'BarClass');
        $builder->register('foo', 'FooClass')->addArgument(array('foo' => new Expression('service("bar").foo ~ parameter("bar")')));
        $this->assertEquals('foobar', $builder->get('foo')->arguments['foo']);
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::resolveServices
     */
    public function testResolveServices()
    {
        $builder = new ContainerBuilder();
        $builder->register('foo', 'FooClass');
        $this->assertEquals($builder->get('foo'), $builder->resolveServices(new Reference('foo')), '->resolveServices() resolves service references to service instances');
        $this->assertEquals(array('foo' => array('foo', $builder->get('foo'))), $builder->resolveServices(array('foo' => array('foo', new Reference('foo')))), '->resolveServices() resolves service references to service instances in nested arrays');
        $this->assertEquals($builder->get('foo'), $builder->resolveServices(new Expression('service("foo")')), '->resolveServices() resolves expressions');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::merge
     */
    public function testMerge()
    {
        $container = new ContainerBuilder(new ParameterBag(array('bar' => 'foo')));
        $container->setResourceTracking(false);
        $config = new ContainerBuilder(new ParameterBag(array('foo' => 'bar')));
        $container->merge($config);
        $this->assertEquals(array('bar' => 'foo', 'foo' => 'bar'), $container->getParameterBag()->all(), '->merge() merges current parameters with the loaded ones');

        $container = new ContainerBuilder(new ParameterBag(array('bar' => 'foo')));
        $container->setResourceTracking(false);
        $config = new ContainerBuilder(new ParameterBag(array('foo' => '%bar%')));
        $container->merge($config);
        $container->compile();
        $this->assertEquals(array('bar' => 'foo', 'foo' => 'foo'), $container->getParameterBag()->all(), '->merge() evaluates the values of the parameters towards already defined ones');

        $container = new ContainerBuilder(new ParameterBag(array('bar' => 'foo')));
        $container->setResourceTracking(false);
        $config = new ContainerBuilder(new ParameterBag(array('foo' => '%bar%', 'baz' => '%foo%')));
        $container->merge($config);
        $container->compile();
        $this->assertEquals(array('bar' => 'foo', 'foo' => 'foo', 'baz' => 'foo'), $container->getParameterBag()->all(), '->merge() evaluates the values of the parameters towards already defined ones');

        $container = new ContainerBuilder();
        $container->setResourceTracking(false);
        $container->register('foo', 'FooClass');
        $container->register('bar', 'BarClass');
        $config = new ContainerBuilder();
        $config->setDefinition('baz', new Definition('BazClass'));
        $config->setAlias('alias_for_foo', 'foo');
        $container->merge($config);
        $this->assertEquals(array('foo', 'bar', 'baz'), array_keys($container->getDefinitions()), '->merge() merges definitions already defined ones');

        $aliases = $container->getAliases();
        $this->assertTrue(isset($aliases['alias_for_foo']));
        $this->assertEquals('foo', (string) $aliases['alias_for_foo']);

        $container = new ContainerBuilder();
        $container->setResourceTracking(false);
        $container->register('foo', 'FooClass');
        $config->setDefinition('foo', new Definition('BazClass'));
        $container->merge($config);
        $this->assertEquals('BazClass', $container->getDefinition('foo')->getClass(), '->merge() overrides already defined services');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::merge
     * @expectedException \LogicException
     */
    public function testMergeLogicException()
    {
        $container = new ContainerBuilder();
        $container->setResourceTracking(false);
        $container->compile();
        $container->merge(new ContainerBuilder());
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::findTaggedServiceIds
     */
    public function testfindTaggedServiceIds()
    {
        $builder = new ContainerBuilder();
        $builder
            ->register('foo', 'FooClass')
            ->addTag('foo', array('foo' => 'foo'))
            ->addTag('bar', array('bar' => 'bar'))
            ->addTag('foo', array('foofoo' => 'foofoo'))
        ;
        $this->assertEquals($builder->findTaggedServiceIds('foo'), array(
            'foo' => array(
                array('foo' => 'foo'),
                array('foofoo' => 'foofoo'),
            )
        ), '->findTaggedServiceIds() returns an array of service ids and its tag attributes');
        $this->assertEquals(array(), $builder->findTaggedServiceIds('foobar'), '->findTaggedServiceIds() returns an empty array if there is annotated services');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::findDefinition
     */
    public function testFindDefinition()
    {
        $container = new ContainerBuilder();
        $container->setDefinition('foo', $definition = new Definition('FooClass'));
        $container->setAlias('bar', 'foo');
        $container->setAlias('foobar', 'bar');
        $this->assertEquals($definition, $container->findDefinition('foobar'), '->findDefinition() returns a Definition');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::addObjectResource
     */
    public function testAddObjectResource()
    {
        $container = new ContainerBuilder();

        $container->setResourceTracking(false);
        $container->addObjectResource(new \BarClass());

        $this->assertEmpty($container->getResources(), 'No resources get registered without resource tracking');

        $container->setResourceTracking(true);
        $container->addObjectResource(new \BarClass());

        $resources = $container->getResources();

        $this->assertCount(1, $resources, '1 resource was registered');

        /* @var $resource \Symfony\Component\Config\Resource\FileResource */
        $resource = end($resources);

        $this->assertInstanceOf('Symfony\Component\Config\Resource\FileResource', $resource);
        $this->assertSame(realpath(__DIR__.'/Fixtures/includes/classes.php'), realpath($resource->getResource()));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::addClassResource
     */
    public function testAddClassResource()
    {
        $container = new ContainerBuilder();

        $container->setResourceTracking(false);
        $container->addClassResource(new \ReflectionClass('BarClass'));

        $this->assertEmpty($container->getResources(), 'No resources get registered without resource tracking');

        $container->setResourceTracking(true);
        $container->addClassResource(new \ReflectionClass('BarClass'));

        $resources = $container->getResources();

        $this->assertCount(1, $resources, '1 resource was registered');

        /* @var $resource \Symfony\Component\Config\Resource\FileResource */
        $resource = end($resources);

        $this->assertInstanceOf('Symfony\Component\Config\Resource\FileResource', $resource);
        $this->assertSame(realpath(__DIR__.'/Fixtures/includes/classes.php'), realpath($resource->getResource()));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::compile
     */
    public function testCompilesClassDefinitionsOfLazyServices()
    {
        $container = new ContainerBuilder();

        $this->assertEmpty($container->getResources(), 'No resources get registered without resource tracking');

        $container->register('foo', 'BarClass');
        $container->getDefinition('foo')->setLazy(true);

        $container->compile();

        $classesPath       = realpath(__DIR__.'/Fixtures/includes/classes.php');
        $matchingResources = array_filter(
            $container->getResources(),
            function (ResourceInterface $resource) use ($classesPath) {
                return $resource instanceof FileResource && $classesPath === realpath($resource->getResource());
            }
        );

        $this->assertNotEmpty($matchingResources);
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getResources
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::addResource
     */
    public function testResources()
    {
        $container = new ContainerBuilder();
        $container->addResource($a = new FileResource(__DIR__.'/Fixtures/xml/services1.xml'));
        $container->addResource($b = new FileResource(__DIR__.'/Fixtures/xml/services2.xml'));
        $resources = array();
        foreach ($container->getResources() as $resource) {
            if (false === strpos($resource, '.php')) {
                $resources[] = $resource;
            }
        }
        $this->assertEquals(array($a, $b), $resources, '->getResources() returns an array of resources read for the current configuration');
        $this->assertSame($container, $container->setResources(array()));
        $this->assertEquals(array(), $container->getResources());
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::registerExtension
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getExtension
     */
    public function testExtension()
    {
        $container = new ContainerBuilder();
        $container->setResourceTracking(false);

        $container->registerExtension($extension = new \ProjectExtension());
        $this->assertTrue($container->getExtension('project') === $extension, '->registerExtension() registers an extension');

        $this->setExpectedException('LogicException');
        $container->getExtension('no_registered');
    }

    public function testRegisteredButNotLoadedExtension()
    {
        $extension = $this->getMock('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface');
        $extension->expects($this->once())->method('getAlias')->will($this->returnValue('project'));
        $extension->expects($this->never())->method('load');

        $container = new ContainerBuilder();
        $container->setResourceTracking(false);
        $container->registerExtension($extension);
        $container->compile();
    }

    public function testRegisteredAndLoadedExtension()
    {
        $extension = $this->getMock('Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface');
        $extension->expects($this->exactly(2))->method('getAlias')->will($this->returnValue('project'));
        $extension->expects($this->once())->method('load')->with(array(array('foo' => 'bar')));

        $container = new ContainerBuilder();
        $container->setResourceTracking(false);
        $container->registerExtension($extension);
        $container->loadFromExtension('project', array('foo' => 'bar'));
        $container->compile();
    }

    public function testPrivateServiceUser()
    {
        $fooDefinition     = new Definition('BarClass');
        $fooUserDefinition = new Definition('BarUserClass', array(new Reference('bar')));
        $container         = new ContainerBuilder();
        $container->setResourceTracking(false);

        $fooDefinition->setPublic(false);

        $container->addDefinitions(array(
            'bar'       => $fooDefinition,
            'bar_user'  => $fooUserDefinition
        ));

        $container->compile();
        $this->assertInstanceOf('BarClass', $container->get('bar_user')->bar);
    }

    /**
     * @expectedException \BadMethodCallException
     */
    public function testThrowsExceptionWhenSetServiceOnAFrozenContainer()
    {
        $container = new ContainerBuilder();
        $container->setResourceTracking(false);
        $container->setDefinition('a', new Definition('stdClass'));
        $container->compile();
        $container->set('a', new \stdClass());
    }

    /**
     * @expectedException \BadMethodCallException
     */
    public function testThrowsExceptionWhenAddServiceOnAFrozenContainer()
    {
        $container = new ContainerBuilder();
        $container->compile();
        $container->set('a', new \stdClass());
    }

    public function testNoExceptionWhenSetSyntheticServiceOnAFrozenContainer()
    {
        $container = new ContainerBuilder();
        $def = new Definition('stdClass');
        $def->setSynthetic(true);
        $container->setDefinition('a', $def);
        $container->compile();
        $container->set('a', $a = new \stdClass());
        $this->assertEquals($a, $container->get('a'));
    }

    public function testSetOnSynchronizedService()
    {
        $container = new ContainerBuilder();
        $container->register('baz', 'BazClass')
            ->setSynchronized(true)
        ;
        $container->register('bar', 'BarClass')
            ->addMethodCall('setBaz', array(new Reference('baz')))
        ;

        $container->set('baz', $baz = new \BazClass());
        $this->assertSame($baz, $container->get('bar')->getBaz());

        $container->set('baz', $baz = new \BazClass());
        $this->assertSame($baz, $container->get('bar')->getBaz());
    }

    public function testSynchronizedServiceWithScopes()
    {
        $container = new ContainerBuilder();
        $container->addScope(new Scope('foo'));
        $container->register('baz', 'BazClass')
            ->setSynthetic(true)
            ->setSynchronized(true)
            ->setScope('foo')
        ;
        $container->register('bar', 'BarClass')
            ->addMethodCall('setBaz', array(new Reference('baz', ContainerInterface::NULL_ON_INVALID_REFERENCE, false)))
        ;
        $container->compile();

        $container->enterScope('foo');
        $container->set('baz', $outerBaz = new \BazClass(), 'foo');
        $this->assertSame($outerBaz, $container->get('bar')->getBaz());

        $container->enterScope('foo');
        $container->set('baz', $innerBaz = new \BazClass(), 'foo');
        $this->assertSame($innerBaz, $container->get('bar')->getBaz());
        $container->leaveScope('foo');

        $this->assertNotSame($innerBaz, $container->get('bar')->getBaz());
        $this->assertSame($outerBaz, $container->get('bar')->getBaz());

        $container->leaveScope('foo');
    }

    /**
     * @expectedException \BadMethodCallException
     */
    public function testThrowsExceptionWhenSetDefinitionOnAFrozenContainer()
    {
        $container = new ContainerBuilder();
        $container->setResourceTracking(false);
        $container->compile();
        $container->setDefinition('a', new Definition());
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getExtensionConfig
     * @covers Symfony\Component\DependencyInjection\ContainerBuilder::prependExtensionConfig
     */
    public function testExtensionConfig()
    {
        $container = new ContainerBuilder();

        $configs = $container->getExtensionConfig('foo');
        $this->assertEmpty($configs);

        $first = array('foo' => 'bar');
        $container->prependExtensionConfig('foo', $first);
        $configs = $container->getExtensionConfig('foo');
        $this->assertEquals(array($first), $configs);

        $second = array('ding' => 'dong');
        $container->prependExtensionConfig('foo', $second);
        $configs = $container->getExtensionConfig('foo');
        $this->assertEquals(array($second, $first), $configs);
    }

    public function testLazyLoadedService()
    {
        $loader = new ClosureLoader($container = new ContainerBuilder());
        $loader->load(function (ContainerBuilder $container) {
                $container->set('a', new \BazClass());
                $definition = new Definition('BazClass');
                $definition->setLazy(true);
                $container->setDefinition('a', $definition);
            }
        );

        $container->setResourceTracking(true);

        $container->compile();

        $class = new \BazClass();
        $reflectionClass = new \ReflectionClass($class);

        $r = new \ReflectionProperty($container, 'resources');
        $r->setAccessible(true);
        $resources = $r->getValue($container);

        $classInList = false;
        foreach ($resources as $resource) {
            if ($resource->getResource() === $reflectionClass->getFileName()) {
                $classInList = true;
                break;
            }
        }

        $this->assertTrue($classInList);
    }
}

class FooClass {}

class ProjectContainer extends ContainerBuilder
{
    public function getFoobazService()
    {
        throw new InactiveScopeException('foo', 'request');
    }
}
PKb�\G3G@��epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;

/**
 * ProjectServiceContainer
 *
 * This class has been auto-generated
 * by the Symfony Dependency Injection Component.
 */
class ProjectServiceContainer extends Container
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->parameters = $this->getDefaultParameters();

        $this->services =
        $this->scopedServices =
        $this->scopeStacks = array();

        $this->set('service_container', $this);

        $this->scopes = array();
        $this->scopeChildren = array();
        $this->methodMap = array(
            'test' => 'getTestService',
        );

        $this->aliases = array();
    }

    /**
     * Gets the 'test' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return stdClass A stdClass instance.
     */
    protected function getTestService()
    {
        return $this->services['test'] = new \stdClass(array('only dot' => '.', 'concatenation as value' => '.\'\'.', 'concatenation from the start value' => '\'\'.', '.' => 'dot as a key', '.\'\'.' => 'concatenation as a key', '\'\'.' => 'concatenation from the start key', 'optimize concatenation' => 'string1-string2', 'optimize concatenation with empty string' => 'string1string2', 'optimize concatenation from the start' => 'start', 'optimize concatenation at the end' => 'end'));
    }

    /**
     * {@inheritdoc}
     */
    public function getParameter($name)
    {
        $name = strtolower($name);

        if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters))) {
            throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
        }

        return $this->parameters[$name];
    }

    /**
     * {@inheritdoc}
     */
    public function hasParameter($name)
    {
        $name = strtolower($name);

        return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters);
    }

    /**
     * {@inheritdoc}
     */
    public function setParameter($name, $value)
    {
        throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
    }

    /**
     * {@inheritDoc}
     */
    public function getParameterBag()
    {
        if (null === $this->parameterBag) {
            $this->parameterBag = new FrozenParameterBag($this->parameters);
        }

        return $this->parameterBag;
    }
    /**
     * Gets the default parameters.
     *
     * @return array An array of the default parameters
     */
    protected function getDefaultParameters()
    {
        return array(
            'empty_value' => '',
            'some_string' => '-',
        );
    }
}
PKb�\��:A!!mpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;

/**
 * ProjectServiceContainer
 *
 * This class has been auto-generated
 * by the Symfony Dependency Injection Component.
 */
class ProjectServiceContainer extends Container
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->parameters = $this->getDefaultParameters();

        $this->services =
        $this->scopedServices =
        $this->scopeStacks = array();

        $this->set('service_container', $this);

        $this->scopes = array();
        $this->scopeChildren = array();
        $this->methodMap = array(
            'bar' => 'getBarService',
            'baz' => 'getBazService',
            'depends_on_request' => 'getDependsOnRequestService',
            'factory_service' => 'getFactoryServiceService',
            'foo' => 'getFooService',
            'foo.baz' => 'getFoo_BazService',
            'foo_bar' => 'getFooBarService',
            'foo_with_inline' => 'getFooWithInlineService',
            'method_call1' => 'getMethodCall1Service',
            'request' => 'getRequestService',
        );
        $this->aliases = array(
            'alias_for_alias' => 'foo',
            'alias_for_foo' => 'foo',
        );
    }

    /**
     * Gets the 'bar' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return FooClass A FooClass instance.
     */
    protected function getBarService()
    {
        $this->services['bar'] = $instance = new \FooClass('foo', $this->get('foo.baz'), $this->getParameter('foo_bar'));

        $this->get('foo.baz')->configure($instance);

        return $instance;
    }

    /**
     * Gets the 'baz' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return Baz A Baz instance.
     */
    protected function getBazService()
    {
        $this->services['baz'] = $instance = new \Baz();

        $instance->setFoo($this->get('foo_with_inline'));

        return $instance;
    }

    /**
     * Gets the 'depends_on_request' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return stdClass A stdClass instance.
     */
    protected function getDependsOnRequestService()
    {
        $this->services['depends_on_request'] = $instance = new \stdClass();

        $instance->setRequest($this->get('request', ContainerInterface::NULL_ON_INVALID_REFERENCE));

        return $instance;
    }

    /**
     * Gets the 'factory_service' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return Bar A Bar instance.
     */
    protected function getFactoryServiceService()
    {
        return $this->services['factory_service'] = $this->get('foo.baz')->getInstance();
    }

    /**
     * Gets the 'foo' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return FooClass A FooClass instance.
     */
    protected function getFooService()
    {
        $a = $this->get('foo.baz');

        $this->services['foo'] = $instance = call_user_func(array('FooClass', 'getInstance'), 'foo', $a, array('bar' => 'foo is bar', 'foobar' => 'bar'), true, $this);

        $instance->setBar($this->get('bar'));
        $instance->initialize();
        $instance->foo = 'bar';
        $instance->moo = $a;
        $instance->qux = array('bar' => 'foo is bar', 'foobar' => 'bar');
        sc_configure($instance);

        return $instance;
    }

    /**
     * Gets the 'foo.baz' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return BazClass A BazClass instance.
     */
    protected function getFoo_BazService()
    {
        $this->services['foo.baz'] = $instance = call_user_func(array('BazClass', 'getInstance'));

        call_user_func(array('BazClass', 'configureStatic1'), $instance);

        return $instance;
    }

    /**
     * Gets the 'foo_bar' service.
     *
     * @return FooClass A FooClass instance.
     */
    protected function getFooBarService()
    {
        return new \FooClass();
    }

    /**
     * Gets the 'foo_with_inline' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return Foo A Foo instance.
     */
    protected function getFooWithInlineService()
    {
        $a = new \Bar();

        $this->services['foo_with_inline'] = $instance = new \Foo();

        $a->setBaz($this->get('baz'));
        $a->pub = 'pub';

        $instance->setBar($a);

        return $instance;
    }

    /**
     * Gets the 'method_call1' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return FooClass A FooClass instance.
     */
    protected function getMethodCall1Service()
    {
        require_once '%path%foo.php';

        $this->services['method_call1'] = $instance = new \FooClass();

        $instance->setBar($this->get('foo'));
        $instance->setBar(NULL);
        $instance->setBar(($this->get("foo")->foo() . $this->getParameter("foo")));

        return $instance;
    }

    /**
     * Gets the 'request' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @throws RuntimeException always since this service is expected to be injected dynamically
     */
    protected function getRequestService()
    {
        throw new RuntimeException('You have requested a synthetic service ("request"). The DIC does not know how to construct this service.');
    }

    /**
     * Updates the 'request' service.
     */
    protected function synchronizeRequestService()
    {
        if ($this->initialized('depends_on_request')) {
            $this->get('depends_on_request')->setRequest($this->get('request', ContainerInterface::NULL_ON_INVALID_REFERENCE));
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getParameter($name)
    {
        $name = strtolower($name);

        if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters))) {
            throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
        }

        return $this->parameters[$name];
    }

    /**
     * {@inheritdoc}
     */
    public function hasParameter($name)
    {
        $name = strtolower($name);

        return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters);
    }

    /**
     * {@inheritdoc}
     */
    public function setParameter($name, $value)
    {
        throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
    }

    /**
     * {@inheritDoc}
     */
    public function getParameterBag()
    {
        if (null === $this->parameterBag) {
            $this->parameterBag = new FrozenParameterBag($this->parameters);
        }

        return $this->parameterBag;
    }
    /**
     * Gets the default parameters.
     *
     * @return array An array of the default parameters
     */
    protected function getDefaultParameters()
    {
        return array(
            'baz_class' => 'BazClass',
            'foo_class' => 'FooClass',
            'foo' => 'bar',
        );
    }
}
PKb�\��7/��dpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;

/**
 * ProjectServiceContainer
 *
 * This class has been auto-generated
 * by the Symfony Dependency Injection Component.
 */
class ProjectServiceContainer extends Container
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        parent::__construct(new ParameterBag($this->getDefaultParameters()));
    }

    /**
     * Gets the default parameters.
     *
     * @return array An array of the default parameters
     */
    protected function getDefaultParameters()
    {
        return array(
            'foo' => '%baz%',
            'baz' => 'bar',
            'bar' => 'foo is %%foo bar',
            'escape' => '@escapeme',
            'values' => array(
                0 => true,
                1 => false,
                2 => NULL,
                3 => 0,
                4 => 1000.3,
                5 => 'true',
                6 => 'false',
                7 => 'null',
            ),
        );
    }
}
PKb�\���//apear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/simple.phpnu�[���<?php

$container->setParameter('foo', 'foo');
PKb�\$�oyyepear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services11.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;

/**
 * ProjectServiceContainer
 *
 * This class has been auto-generated
 * by the Symfony Dependency Injection Component.
 */
class ProjectServiceContainer extends Container
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        $this->services =
        $this->scopedServices =
        $this->scopeStacks = array();

        $this->set('service_container', $this);

        $this->scopes = array();
        $this->scopeChildren = array();
        $this->methodMap = array(
            'foo' => 'getFooService',
        );

        $this->aliases = array();
    }

    /**
     * Gets the 'foo' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return stdClass A stdClass instance.
     */
    protected function getFooService()
    {
        return $this->services['foo'] = new \stdClass();
    }
}
PKb�\,�j���dpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;

/**
 * ProjectServiceContainer
 *
 * This class has been auto-generated
 * by the Symfony Dependency Injection Component.
 */
class ProjectServiceContainer extends Container
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        parent::__construct(new ParameterBag($this->getDefaultParameters()));
        $this->methodMap = array(
            'bar' => 'getBarService',
            'baz' => 'getBazService',
            'depends_on_request' => 'getDependsOnRequestService',
            'factory_service' => 'getFactoryServiceService',
            'foo' => 'getFooService',
            'foo.baz' => 'getFoo_BazService',
            'foo_bar' => 'getFooBarService',
            'foo_with_inline' => 'getFooWithInlineService',
            'inlined' => 'getInlinedService',
            'method_call1' => 'getMethodCall1Service',
            'request' => 'getRequestService',
        );
        $this->aliases = array(
            'alias_for_alias' => 'foo',
            'alias_for_foo' => 'foo',
        );
    }

    /**
     * Gets the 'bar' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return FooClass A FooClass instance.
     */
    protected function getBarService()
    {
        $this->services['bar'] = $instance = new \FooClass('foo', $this->get('foo.baz'), $this->getParameter('foo_bar'));

        $this->get('foo.baz')->configure($instance);

        return $instance;
    }

    /**
     * Gets the 'baz' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return Baz A Baz instance.
     */
    protected function getBazService()
    {
        $this->services['baz'] = $instance = new \Baz();

        $instance->setFoo($this->get('foo_with_inline'));

        return $instance;
    }

    /**
     * Gets the 'depends_on_request' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return stdClass A stdClass instance.
     */
    protected function getDependsOnRequestService()
    {
        $this->services['depends_on_request'] = $instance = new \stdClass();

        $instance->setRequest($this->get('request', ContainerInterface::NULL_ON_INVALID_REFERENCE));

        return $instance;
    }

    /**
     * Gets the 'factory_service' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return Bar A Bar instance.
     */
    protected function getFactoryServiceService()
    {
        return $this->services['factory_service'] = $this->get('foo.baz')->getInstance();
    }

    /**
     * Gets the 'foo' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return FooClass A FooClass instance.
     */
    protected function getFooService()
    {
        $a = $this->get('foo.baz');

        $this->services['foo'] = $instance = call_user_func(array('FooClass', 'getInstance'), 'foo', $a, array($this->getParameter('foo') => 'foo is '.$this->getParameter('foo').'', 'foobar' => $this->getParameter('foo')), true, $this);

        $instance->setBar($this->get('bar'));
        $instance->initialize();
        $instance->foo = 'bar';
        $instance->moo = $a;
        $instance->qux = array($this->getParameter('foo') => 'foo is '.$this->getParameter('foo').'', 'foobar' => $this->getParameter('foo'));
        sc_configure($instance);

        return $instance;
    }

    /**
     * Gets the 'foo.baz' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return object A %baz_class% instance.
     */
    protected function getFoo_BazService()
    {
        $this->services['foo.baz'] = $instance = call_user_func(array($this->getParameter('baz_class'), 'getInstance'));

        call_user_func(array($this->getParameter('baz_class'), 'configureStatic1'), $instance);

        return $instance;
    }

    /**
     * Gets the 'foo_bar' service.
     *
     * @return object A %foo_class% instance.
     */
    protected function getFooBarService()
    {
        $class = $this->getParameter('foo_class');

        return new $class();
    }

    /**
     * Gets the 'foo_with_inline' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return Foo A Foo instance.
     */
    protected function getFooWithInlineService()
    {
        $this->services['foo_with_inline'] = $instance = new \Foo();

        $instance->setBar($this->get('inlined'));

        return $instance;
    }

    /**
     * Gets the 'method_call1' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @return FooClass A FooClass instance.
     */
    protected function getMethodCall1Service()
    {
        require_once '%path%foo.php';

        $this->services['method_call1'] = $instance = new \FooClass();

        $instance->setBar($this->get('foo'));
        $instance->setBar($this->get('foo2', ContainerInterface::NULL_ON_INVALID_REFERENCE));
        if ($this->has('foo3')) {
            $instance->setBar($this->get('foo3', ContainerInterface::NULL_ON_INVALID_REFERENCE));
        }
        if ($this->has('foobaz')) {
            $instance->setBar($this->get('foobaz', ContainerInterface::NULL_ON_INVALID_REFERENCE));
        }
        $instance->setBar(($this->get("foo")->foo() . $this->getParameter("foo")));

        return $instance;
    }

    /**
     * Gets the 'request' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * @throws RuntimeException always since this service is expected to be injected dynamically
     */
    protected function getRequestService()
    {
        throw new RuntimeException('You have requested a synthetic service ("request"). The DIC does not know how to construct this service.');
    }

    /**
     * Updates the 'request' service.
     */
    protected function synchronizeRequestService()
    {
        if ($this->initialized('depends_on_request')) {
            $this->get('depends_on_request')->setRequest($this->get('request', ContainerInterface::NULL_ON_INVALID_REFERENCE));
        }
    }

    /**
     * Gets the 'inlined' service.
     *
     * This service is shared.
     * This method always returns the same instance of the service.
     *
     * This service is private.
     * If you want to be able to request this service from the container directly,
     * make it public, otherwise you might end up with broken code.
     *
     * @return Bar A Bar instance.
     */
    protected function getInlinedService()
    {
        $this->services['inlined'] = $instance = new \Bar();

        $instance->setBaz($this->get('baz'));
        $instance->pub = 'pub';

        return $instance;
    }

    /**
     * Gets the default parameters.
     *
     * @return array An array of the default parameters
     */
    protected function getDefaultParameters()
    {
        return array(
            'baz_class' => 'BazClass',
            'foo_class' => 'FooClass',
            'foo' => 'bar',
        );
    }
}
PKb�\E�))fpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1-1.phpnu�[���<?php
namespace Symfony\Component\DependencyInjection\Dump;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;

/**
 * Container
 *
 * This class has been auto-generated
 * by the Symfony Dependency Injection Component.
 */
class Container extends AbstractContainer
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        parent::__construct();
    }
}
PKb�\o�Tbdpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services1.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;

/**
 * ProjectServiceContainer
 *
 * This class has been auto-generated
 * by the Symfony Dependency Injection Component.
 */
class ProjectServiceContainer extends Container
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        parent::__construct();
    }
}
PKb�\	�dpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services2.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <parameters>
    <parameter>a string</parameter>
    <parameter key="FOO">bar</parameter>
    <parameter key="values" type="collection">
      <parameter>0</parameter>
      <parameter key="integer">4</parameter>
      <parameter key="100">null</parameter>
      <parameter type="string">true</parameter>
      <parameter>true</parameter>
      <parameter>false</parameter>
      <parameter>on</parameter>
      <parameter>off</parameter>
      <parameter key="float">1.3</parameter>
      <parameter>1000.3</parameter>
      <parameter>a string</parameter>
      <parameter type="collection">
        <parameter>foo</parameter>
        <parameter>bar</parameter>
      </parameter>
    </parameter>
    <parameter key="foo_bar" type="service" id="foo_bar" />
    <parameter key="MixedCase" type="collection"> <!-- Should be lower cased -->
      <parameter key="MixedCaseKey">value</parameter> <!-- Should stay mixed case -->
    </parameter>
    <parameter key="constant" type="constant">PHP_EOL</parameter>
  </parameters>
</container>
PKb�\˕n%%cpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/nonvalid.xmlnu�[���<?xml version="1.0" ?>

<nonvalid />
PKb�\�(]

dpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services1.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"/>
PKb�\�![�epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services10.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <services>
    <service id="foo" class="BarClass">
        <tag name="foo_tag"
            some-option="cat"
            some_option="ciz"
            other-option="lorem"
            an_other-option="ipsum"
        />
    </service>
  </services>
</container>
PKb�\���<iiepear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services13.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <parameters>
    <parameter key="imported_from_xml">true</parameter>
  </parameters>
</container>
PKb�\x'�	11fpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/withdoctype.xmlnu�[���<?xml version="1.0"?>
<!DOCTYPE foo>
<foo></foo>
PKb�\������npear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension1/services.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <services>
    <service id="extension1.foo" class="FooClass1">
      <argument type="service">
        <service class="BarClass1">
        </service>
      </argument>
    </service>
  </services>
</container>
PKb�\B�X�

dpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xmlnu�[���<?xml version="1.0" encoding="utf-8"?>
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <parameters>
    <parameter key="baz_class">BazClass</parameter>
    <parameter key="foo_class">FooClass</parameter>
    <parameter key="foo">bar</parameter>
  </parameters>
  <services>
    <service id="foo" class="FooClass" factory-method="getInstance">
      <tag name="foo" foo="foo"/>
      <tag name="foo" bar="bar"/>
      <argument>foo</argument>
      <argument type="service" id="foo.baz"/>
      <argument type="collection">
        <argument key="%foo%">foo is %foo%</argument>
        <argument key="foobar">%foo%</argument>
      </argument>
      <argument>true</argument>
      <argument type="service" id="service_container"/>
      <property name="foo">bar</property>
      <property name="moo" type="service" id="foo.baz"/>
      <property name="qux" type="collection">
        <property key="%foo%">foo is %foo%</property>
        <property key="foobar">%foo%</property>
      </property>
      <call method="setBar">
        <argument type="service" id="bar"/>
      </call>
      <call method="initialize"/>
      <configurator function="sc_configure"/>
    </service>
    <service id="bar" class="FooClass">
      <argument>foo</argument>
      <argument type="service" id="foo.baz"/>
      <argument>%foo_bar%</argument>
      <configurator service="foo.baz" method="configure"/>
    </service>
    <service id="foo.baz" class="%baz_class%" factory-method="getInstance">
      <configurator class="%baz_class%" method="configureStatic1"/>
    </service>
    <service id="foo_bar" class="%foo_class%" scope="prototype"/>
    <service id="method_call1" class="FooClass">
      <file>%path%foo.php</file>
      <call method="setBar">
        <argument type="service" id="foo"/>
      </call>
      <call method="setBar">
        <argument type="service" id="foo2" on-invalid="null"/>
      </call>
      <call method="setBar">
        <argument type="service" id="foo3" on-invalid="ignore"/>
      </call>
      <call method="setBar">
        <argument type="service" id="foobaz" on-invalid="ignore"/>
      </call>
      <call method="setBar">
        <argument type="expression">service("foo").foo() ~ parameter("foo")</argument>
      </call>
    </service>
    <service id="factory_service" class="Bar" factory-method="getInstance" factory-service="foo.baz"/>
    <service id="foo_with_inline" class="Foo">
      <call method="setBar">
        <argument type="service" id="inlined"/>
      </call>
    </service>
    <service id="inlined" class="Bar" public="false">
      <property name="pub">pub</property>
      <call method="setBaz">
        <argument type="service" id="baz"/>
      </call>
    </service>
    <service id="baz" class="Baz">
      <call method="setFoo">
        <argument type="service" id="foo_with_inline"/>
      </call>
    </service>
    <service id="request" class="Request" synthetic="true" synchronized="true"/>
    <service id="depends_on_request" class="stdClass">
      <call method="setRequest">
        <argument type="service" id="request" on-invalid="null" strict="false"/>
      </call>
    </service>
    <service id="alias_for_foo" alias="foo"/>
    <service id="alias_for_alias" alias="foo"/>
  </services>
</container>
PKb�\p�Ԡ��dpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services6.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <services>
    <service id="foo" class="FooClass" />
    <service id="baz" class="BazClass" />
    <service id="scope.container" class="FooClass" scope="container" />
    <service id="scope.custom" class="FooClass" scope="custom" />
    <service id="scope.prototype" class="FooClass" scope="prototype" />
    <service id="constructor" class="FooClass" factory-method="getInstance" />
    <service id="file" class="FooClass">
      <file>%path%/foo.php</file>
    </service>
    <service id="arguments" class="FooClass">
      <argument>foo</argument>
      <argument type="service" id="foo" />
      <argument type="collection">
        <argument>true</argument>
        <argument>false</argument>
      </argument>
    </service>
    <service id="configurator1" class="FooClass">
      <configurator function="sc_configure" />
    </service>
    <service id="configurator2" class="FooClass">
      <configurator service="baz" method="configure" />
    </service>
    <service id="configurator3" class="FooClass">
      <configurator class="BazClass" method="configureStatic" />
    </service>
    <service id="method_call1" class="FooClass">
      <call method="setBar" />
      <call method="setBar">
        <argument type="expression">service("foo").foo() ~ parameter("foo")</argument>
      </call>
    </service>
    <service id="method_call2" class="FooClass">
      <call method="setBar">
        <argument>foo</argument>
        <argument type="service" id="foo" />
        <argument type="collection">
          <argument>true</argument>
          <argument>false</argument>
        </argument>
      </call>
    </service>
    <service id="alias_for_foo" alias="foo" />
    <service id="another_alias_for_foo" alias="foo" public="false" />
    <service id="factory_service" factory-method="getInstance" factory-service="baz_factory" />
    <service id="request" class="Request" synthetic="true" synchronized="true" lazy="true"/>
  </services>
</container>
PK b�\u�

dpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <imports>
    <import resource="services2.xml" />
    <import resource="services3.xml" />
    <import resource="../ini/parameters.ini" />
    <import resource="../ini/parameters2.ini" />
    <import resource="../yaml/services13.yml" />
  </imports>
</container>
PK b�\\_���dpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services3.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <parameters>
    <parameter key="foo">foo</parameter>
    <parameter key="values" type="collection">
      <parameter>true</parameter>
      <parameter>false</parameter>
    </parameter>
  </parameters>
</container>
PK b�\��Pggopear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services4_bad_import.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <imports>
    <import resource="foo_fake.xml" ignore-errors="true" />
  </imports>
</container>
PK!b�\�}��opear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services2.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:project="http://www.example.com/schema/projectwithxsd"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
                        http://www.example.com/schema/projectwithxsd http://www.example.com/schema/projectwithxsd/project-1.0.xsd">

    <parameters>
        <parameter key="project.parameter.foo">BAR</parameter>
    </parameters>

    <services>
        <service id="project.service.foo" class="BAR" />
    </services>

    <project:bar />

</container>
PK!b�\�^����opear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services1.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:project="http://www.example.com/schema/project">

    <parameters>
        <parameter key="project.parameter.foo">BAR</parameter>
    </parameters>

    <services>
        <service id="project.service.foo" class="BAR" />
    </services>

    <project:bar babar="babar">
        <another />
        <another2>%project.parameter.foo%</another2>
    </project:bar>

</container>
PK"b�\ix�C��opear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services6.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:project="http://www.example.com/schema/projectwithxsdinphar"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
                        http://www.example.com/schema/projectwithxsdinphar http://www.example.com/schema/projectwithxsdinphar/project-1.0.xsd">

    <project:bar />

</container>
PK"b�\җ'y��opear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services4.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:project="http://www.example.com/schema/not_registered_extension">
  <project:bar />
</container>
PK#b�\>U���opear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services3.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:project="http://www.example.com/schema/projectwithxsd"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
                        http://www.example.com/schema/projectwithxsd http://www.example.com/schema/projectwithxsd/project-1.0.xsd">

    <parameters>
        <parameter key="project.parameter.foo">BAR</parameter>
    </parameters>

    <services>
        <service id="project.service.foo" class="BAR" />
    </services>

    <project:bar bar="bar" />

</container>
PK#b�\����opear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services5.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:project="http://www.example.com/schema/projectwithxsd"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
                        http://www.example.com/schema/projectwithxsd http://www.example.com/schema/projectwithxsd/project-1.0.xsd">

    <project:foobar />

</container>
PK#b�\��	opear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extensions/services7.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:project="http://www.example.com/schema/projectwithxsdinphar"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
                        http://www.example.com/schema/projectwithxsdinphar http://www.example.com/schema/projectwithxsdinphar/project-1.0.xsd">

    <project:bar bar="foo" />

</container>
PK$b�\�ibĤ�dpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services5.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <services>
    <service id="foo" class="FooClass">
      <argument type="service">
        <service class="BarClass">
          <argument type="service">
            <service class="BazClass">
            </service>
          </argument>
        </service>
      </argument>
      <property name="p" type="service">
        <service class="BazClass" />
      </property>
    </service>
  </services>
</container>
PK$b�\�w�zhhdpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <parameters>
    <parameter key="foo">%baz%</parameter>
    <parameter key="baz">bar</parameter>
    <parameter key="bar">foo is %%foo bar</parameter>
    <parameter key="escape">@escapeme</parameter>
    <parameter key="values" type="collection">
      <parameter>true</parameter>
      <parameter>false</parameter>
      <parameter>null</parameter>
      <parameter>0</parameter>
      <parameter>1000.3</parameter>
      <parameter type="string">true</parameter>
      <parameter type="string">false</parameter>
      <parameter type="string">null</parameter>
    </parameter>
  </parameters>
</container>
PK%b�\]2�
��npear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/extension2/services.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <services>
    <service id="extension2.foo" class="FooClass2">
      <argument type="service">
        <service class="BarClass2">
        </service>
      </argument>
    </service>
  </services>
</container>
PK%b�\�_�+WWdpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services7.xmlnu�[���<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
  <services>
    <service id="foo" class="BarClass" />
  </services>
</container>
PK%b�\C�ݲ;;mpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container10.phpnu�[���<?php

require_once __DIR__.'/../includes/classes.php';

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

$container = new ContainerBuilder();
$container->
    register('foo', 'FooClass')->
    addArgument(new Reference('bar'))
;

return $container;
PK&b�\�*�EEmpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container12.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;

$container = new ContainerBuilder();
$container->
    register('foo', 'FooClass\\Foo')->
    addArgument('foo<>&bar')->
    addTag('foo"bar\\bar', array('foo' => 'foo"barřž€'))
;

return $container;
PK&b�\�Fm��mpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces2.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;

$container = new ContainerBuilder();

$factoryDefinition = new Definition('BarClassFactory');
$container->setDefinition('barFactory', $factoryDefinition);

$definition = new Definition();
$definition->setFactoryService('barFactory');
$definition->setFactoryMethod('createBarClass');
$container->setDefinition('bar', $definition);

return $container;

class BarClass
{
    public $foo;

    public function setBar($foo)
    {
        $this->foo = $foo;
    }
}

class BarClassFactory
{
    public function createBarClass()
    {
        return new BarClass();
    }
}
PK&b�\��|mpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/interfaces1.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;

$container = new ContainerBuilder();
$container->setParameter('cla', 'Fo');
$container->setParameter('ss', 'Class');

$definition = new Definition('%cla%o%ss%');
$container->setDefinition('foo', $definition);

return $container;

if (!class_exists('FooClass')) {
    class FooClass
    {
        public $bar;

        public function setBar($bar)
        {
            $this->bar = $bar;
        }
    }
}
PK'b�\�1�v��mpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container14.phpnu�[���<?php

namespace Container14;

use Symfony\Component\DependencyInjection\ContainerBuilder;

class ProjectServiceContainer extends ContainerBuilder
{
}

return new ProjectServiceContainer();
PK'b�\BreOOmpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container13.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

$container = new ContainerBuilder();
$container->
    register('foo', 'FooClass')->
    addArgument(new Reference('bar'))
;
$container->
    register('bar', 'BarClass')
;
$container->compile();

return $container;
PK(b�\�	Z��lpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container9.phpnu�[���<?php

require_once __DIR__.'/../includes/classes.php';

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\ExpressionLanguage\Expression;

$container = new ContainerBuilder();
$container->
    register('foo', 'FooClass')->
    addTag('foo', array('foo' => 'foo'))->
    addTag('foo', array('bar' => 'bar'))->
    setFactoryClass('FooClass')->
    setFactoryMethod('getInstance')->
    setArguments(array('foo', new Reference('foo.baz'), array('%foo%' => 'foo is %foo%', 'foobar' => '%foo%'), true, new Reference('service_container')))->
    setProperties(array('foo' => 'bar', 'moo' => new Reference('foo.baz'), 'qux' => array('%foo%' => 'foo is %foo%', 'foobar' => '%foo%')))->
    addMethodCall('setBar', array(new Reference('bar')))->
    addMethodCall('initialize')->
    setConfigurator('sc_configure')
;
$container->
    register('bar', 'FooClass')->
    setArguments(array('foo', new Reference('foo.baz'), new Parameter('foo_bar')))->
    setScope('container')->
    setConfigurator(array(new Reference('foo.baz'), 'configure'))
;
$container->
    register('foo.baz', '%baz_class%')->
    setFactoryClass('%baz_class%')->
    setFactoryMethod('getInstance')->
    setConfigurator(array('%baz_class%', 'configureStatic1'))
;
$container->
    register('foo_bar', '%foo_class%')->
    setScope('prototype')
;
$container->getParameterBag()->clear();
$container->getParameterBag()->add(array(
    'baz_class' => 'BazClass',
    'foo_class' => 'FooClass',
    'foo' => 'bar',
));
$container->setAlias('alias_for_foo', 'foo');
$container->setAlias('alias_for_alias', 'alias_for_foo');
$container->
    register('method_call1', 'FooClass')->
    setFile(realpath(__DIR__.'/../includes/foo.php'))->
    addMethodCall('setBar', array(new Reference('foo')))->
    addMethodCall('setBar', array(new Reference('foo2', ContainerInterface::NULL_ON_INVALID_REFERENCE)))->
    addMethodCall('setBar', array(new Reference('foo3', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)))->
    addMethodCall('setBar', array(new Reference('foobaz', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)))->
    addMethodCall('setBar', array(new Expression('service("foo").foo() ~ parameter("foo")')))
;
$container->
    register('factory_service', 'Bar')->
    setFactoryService('foo.baz')->
    setFactoryMethod('getInstance')
;

$container
    ->register('foo_with_inline', 'Foo')
    ->addMethodCall('setBar', array(new Reference('inlined')))
;
$container
    ->register('inlined', 'Bar')
    ->setProperty('pub', 'pub')
    ->addMethodCall('setBaz', array(new Reference('baz')))
    ->setPublic(false)
;
$container
    ->register('baz', 'Baz')
    ->addMethodCall('setFoo', array(new Reference('foo_with_inline')))
;
$container
    ->register('request', 'Request')
    ->setSynthetic(true)
    ->setSynchronized(true)
;
$container
    ->register('depends_on_request', 'stdClass')
    ->addMethodCall('setRequest', array(new Reference('request', ContainerInterface::NULL_ON_INVALID_REFERENCE, false)))
;

return $container;
PK(b�\���33mpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container11.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;

$container = new ContainerBuilder();
$container->
    register('foo', 'FooClass')->
    addArgument(new Definition('BarClass', array(new Definition('BazClass'))))
;

return $container;
PK(b�\4h���lpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;

$container = new ContainerBuilder(new ParameterBag(array(
    'FOO'    => '%baz%',
    'baz'    => 'bar',
    'bar'    => 'foo is %%foo bar',
    'escape' => '@escapeme',
    'values' => array(true, false, null, 0, 1000.3, 'true', 'false', 'null'),
)));

return $container;
PK)b�\��]���jpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/createphar.phpnu�[���<?php

$file = __DIR__.'/ProjectWithXsdExtensionInPhar.phar';
if (is_file($file)) {
    @unlink($file);
}

$phar = new Phar($file, 0, 'ProjectWithXsdExtensionInPhar.phar');
$phar->addFromString('ProjectWithXsdExtensionInPhar.php',<<<EOT
<?php

class ProjectWithXsdExtensionInPhar extends ProjectExtension
{
    public function getXsdValidationBasePath()
    {
        return __DIR__.'/schema';
    }

    public function getNamespace()
    {
        return 'http://www.example.com/schema/projectwithxsdinphar';
    }

    public function getAlias()
    {
        return 'projectwithxsdinphar';
    }
}
EOT
);
$phar->addFromString('schema/project-1.0.xsd', <<<EOT
<?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema xmlns="http://www.example.com/schema/projectwithxsdinphar"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.com/schema/projectwithxsdinphar"
    elementFormDefault="qualified">

  <xsd:element name="bar" type="bar" />

  <xsd:complexType name="bar">
    <xsd:attribute name="foo" type="xsd:string" />
  </xsd:complexType>
</xsd:schema>
EOT
);
$phar->setStub('<?php require_once "phar://ProjectWithXsdExtensionInPhar.phar/ProjectWithXsdExtensionInPhar.php"; __HALT_COMPILER(); ?>');
PK*b�\.Y<ҿ�ppear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectExtension.phpnu�[���<?php

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;

class ProjectExtension implements ExtensionInterface
{
    public function load(array $configs, ContainerBuilder $configuration)
    {
        $config = call_user_func_array('array_merge', $configs);

        $configuration->setDefinition('project.service.bar', new Definition('FooClass'));
        $configuration->setParameter('project.parameter.bar', isset($config['foo']) ? $config['foo'] : 'foobar');

        $configuration->setDefinition('project.service.foo', new Definition('FooClass'));
        $configuration->setParameter('project.parameter.foo', isset($config['foo']) ? $config['foo'] : 'foobar');

        return $configuration;
    }

    public function getXsdValidationBasePath()
    {
        return false;
    }

    public function getNamespace()
    {
        return 'http://www.example.com/schema/project';
    }

    public function getAlias()
    {
        return 'project';
    }

    public function getConfiguration(array $config, ContainerBuilder $container)
    {
        return null;
    }
}
PK*b�\�N�{rr~pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtensionInPhar.pharnu�[���<?php require_once "phar://ProjectWithXsdExtensionInPhar.phar/ProjectWithXsdExtensionInPhar.php"; __HALT_COMPILER(); ?>
�"ProjectWithXsdExtensionInPhar.phar!ProjectWithXsdExtensionInPhar.php~�akM~� ���schema/project-1.0.xsd��akM�Qp���<?php

class ProjectWithXsdExtensionInPhar extends ProjectExtension
{
    public function getXsdValidationBasePath()
    {
        return __DIR__.'/schema';
    }

    public function getNamespace()
    {
        return 'http://www.example.com/schema/projectwithxsdinphar';
    }

    public function getAlias()
    {
        return 'projectwithxsdinphar';
    }
}<?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema xmlns="http://www.example.com/schema/projectwithxsdinphar"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.com/schema/projectwithxsdinphar"
    elementFormDefault="qualified">

  <xsd:element name="bar" type="bar" />

  <xsd:complexType name="bar">
    <xsd:attribute name="foo" type="xsd:string" />
  </xsd:complexType>
</xsd:schema>W��]ʯ�`�5,,)E��Y�GBMBPK*b�\Aov:ZZgpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/classes.phpnu�[���<?php

function sc_configure($instance)
{
    $instance->configure();
}

class BarClass
{
    protected $baz;
    public $foo = 'foo';

    public function setBaz(BazClass $baz)
    {
        $this->baz = $baz;
    }

    public function getBaz()
    {
        return $this->baz;
    }
}

class BazClass
{
    protected $foo;

    public function setFoo(Foo $foo)
    {
        $this->foo = $foo;
    }

    public function configure($instance)
    {
        $instance->configure();
    }

    public static function getInstance()
    {
        return new self();
    }

    public static function configureStatic($instance)
    {
        $instance->configure();
    }

    public static function configureStatic1()
    {
    }
}

class BarUserClass
{
    public $bar;

    public function __construct(BarClass $bar)
    {
        $this->bar = $bar;
    }
}
PK*b�\RK:��rpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/schema/project-1.0.xsdnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<xsd:schema xmlns="http://www.example.com/schema/projectwithxsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.com/schema/projectwithxsd"
    elementFormDefault="qualified">

  <xsd:element name="bar" type="bar" />

  <xsd:complexType name="bar">
    <xsd:attribute name="foo" type="xsd:string" />
  </xsd:complexType>
</xsd:schema>
PK+b�\��[[wpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/ProjectWithXsdExtension.phpnu�[���<?php

class ProjectWithXsdExtension extends ProjectExtension
{
    public function getXsdValidationBasePath()
    {
        return __DIR__.'/schema';
    }

    public function getNamespace()
    {
        return 'http://www.example.com/schema/projectwithxsd';
    }

    public function getAlias()
    {
        return 'projectwithxsd';
    }
}
PK+b�\�
��cpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/foo.phpnu�[���<?php

class FooClass
{
    public $foo, $moo;

    public $bar = null, $initialized = false, $configured = false, $called = false, $arguments = array();

    public function __construct($arguments = array())
    {
        $this->arguments = $arguments;
    }

    public static function getInstance($arguments = array())
    {
        $obj = new self($arguments);
        $obj->called = true;

        return $obj;
    }

    public function initialize()
    {
        $this->initialized = true;
    }

    public function configure()
    {
        $this->configured = true;
    }

    public function setBar($value = null)
    {
        $this->bar = $value;
    }
}
PK+b�\&�WWipear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services1.dotnu�[���digraph sc {
  ratio="compress"
  node [fontsize="11" fontname="Arial" shape="record"];
  edge [fontsize="9" fontname="Arial" color="grey" arrowhead="open" arrowsize="0.5"];

  node_service_container [label="service_container\nSymfony\\Component\\DependencyInjection\\ContainerBuilder\n", shape=record, fillcolor="#9999ff", style="filled"];
}
PK,b�\��8BBjpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services14.dotnu�[���digraph sc {
  ratio="compress"
  node [fontsize="11" fontname="Arial" shape="record"];
  edge [fontsize="9" fontname="Arial" color="grey" arrowhead="open" arrowsize="0.5"];

  node_service_container [label="service_container\nContainer14\\ProjectServiceContainer\n", shape=record, fillcolor="#9999ff", style="filled"];
}
PK,b�\��33jpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10.dotnu�[���digraph sc {
  ratio="compress"
  node [fontsize="11" fontname="Arial" shape="record"];
  edge [fontsize="9" fontname="Arial" color="grey" arrowhead="open" arrowsize="0.5"];

  node_foo [label="foo\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_service_container [label="service_container\nSymfony\\Component\\DependencyInjection\\ContainerBuilder\n", shape=record, fillcolor="#9999ff", style="filled"];
  node_bar [label="bar\n\n", shape=record, fillcolor="#ff9999", style="filled"];
  node_foo -> node_bar [label="" style="filled"];
}
PK,b�\Ձ1*,,lpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services10-1.dotnu�[���digraph sc {
  ratio="normal"
  node [fontsize="13" fontname="Verdana" shape="square"];
  edge [fontsize="12" fontname="Verdana" color="white" arrowhead="closed" arrowsize="1"];

  node_foo [label="foo\nFooClass\n", shape=square, fillcolor="grey", style="filled"];
  node_service_container [label="service_container\nSymfony\\Component\\DependencyInjection\\ContainerBuilder\n", shape=square, fillcolor="green", style="empty"];
  node_bar [label="bar\n\n", shape=square, fillcolor="red", style="empty"];
  node_foo -> node_bar [label="" style="filled"];
}
PK-b�\h	�	�	ipear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services9.dotnu�[���digraph sc {
  ratio="compress"
  node [fontsize="11" fontname="Arial" shape="record"];
  edge [fontsize="9" fontname="Arial" color="grey" arrowhead="open" arrowsize="0.5"];

  node_foo [label="foo (alias_for_foo)\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_bar [label="bar\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_foo_baz [label="foo.baz\nBazClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_foo_bar [label="foo_bar\nFooClass\n", shape=record, fillcolor="#eeeeee", style="dotted"];
  node_method_call1 [label="method_call1\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_factory_service [label="factory_service\nBar\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_foo_with_inline [label="foo_with_inline\nFoo\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_inlined [label="inlined\nBar\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_baz [label="baz\nBaz\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_request [label="request\nRequest\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_depends_on_request [label="depends_on_request\nstdClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_service_container [label="service_container\nSymfony\\Component\\DependencyInjection\\ContainerBuilder\n", shape=record, fillcolor="#9999ff", style="filled"];
  node_foo2 [label="foo2\n\n", shape=record, fillcolor="#ff9999", style="filled"];
  node_foo3 [label="foo3\n\n", shape=record, fillcolor="#ff9999", style="filled"];
  node_foobaz [label="foobaz\n\n", shape=record, fillcolor="#ff9999", style="filled"];
  node_foo -> node_foo_baz [label="" style="filled"];
  node_foo -> node_service_container [label="" style="filled"];
  node_foo -> node_foo_baz [label="" style="dashed"];
  node_foo -> node_bar [label="setBar()" style="dashed"];
  node_bar -> node_foo_baz [label="" style="filled"];
  node_method_call1 -> node_foo [label="setBar()" style="dashed"];
  node_method_call1 -> node_foo2 [label="setBar()" style="dashed"];
  node_method_call1 -> node_foo3 [label="setBar()" style="dashed"];
  node_method_call1 -> node_foobaz [label="setBar()" style="dashed"];
  node_foo_with_inline -> node_inlined [label="setBar()" style="dashed"];
  node_inlined -> node_baz [label="setBaz()" style="dashed"];
  node_baz -> node_foo_with_inline [label="setFoo()" style="dashed"];
  node_depends_on_request -> node_request [label="setRequest()" style="dashed"];
}
PK-b�\ŏD�;;jpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dotnu�[���digraph sc {
  ratio="compress"
  node [fontsize="11" fontname="Arial" shape="record"];
  edge [fontsize="9" fontname="Arial" color="grey" arrowhead="open" arrowsize="0.5"];

  node_foo [label="foo\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_bar [label="bar\nBarClass\n", shape=record, fillcolor="#eeeeee", style="filled"];
  node_service_container [label="service_container\nSymfony\\Component\\DependencyInjection\\ContainerBuilder\n", shape=record, fillcolor="#9999ff", style="filled"];
  node_foo -> node_bar [label="" style="filled"];
}
PK-b�\�|��DDepear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services3.ymlnu�[���parameters:
    foo: foo
    values:
        - true
        - false
PK.b�\����GGfpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services13.ymlnu�[���# used to test imports in XML
parameters:
    imported_from_yaml: true
PK.b�\|�w���epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.ymlnu�[���parameters:
    baz_class: BazClass
    foo_class: FooClass
    foo: bar

services:
    foo:
        class: FooClass
        tags:
            - { name: foo, foo: foo }
            - { name: foo, bar: bar }
        factory_class: FooClass
        factory_method: getInstance
        arguments: [foo, '@foo.baz', { '%foo%': 'foo is %foo%', foobar: '%foo%' }, true, '@service_container']
        properties: { foo: bar, moo: '@foo.baz', qux: { '%foo%': 'foo is %foo%', foobar: '%foo%' } }
        calls:
            - [setBar, ['@bar']]
            - [initialize, {  }]

        configurator: sc_configure
    bar:
        class: FooClass
        arguments: [foo, '@foo.baz', '%foo_bar%']
        configurator: ['@foo.baz', configure]
    foo.baz:
        class: %baz_class%
        factory_class: %baz_class%
        factory_method: getInstance
        configurator: ['%baz_class%', configureStatic1]
    foo_bar:
        class: %foo_class%
        scope: prototype
    method_call1:
        class: FooClass
        file: %path%foo.php
        calls:
            - [setBar, ['@foo']]
            - [setBar, ['@?foo2']]
            - [setBar, ['@?foo3']]
            - [setBar, ['@?foobaz']]
            - [setBar, ['@=service("foo").foo() ~ parameter("foo")']]

    factory_service:
        class: Bar
        factory_method: getInstance
        factory_service: foo.baz
    foo_with_inline:
        class: Foo
        calls:
            - [setBar, ['@inlined']]

    inlined:
        class: Bar
        public: false
        properties: { pub: pub }
        calls:
            - [setBaz, ['@baz']]

    baz:
        class: Baz
        calls:
            - [setFoo, ['@foo_with_inline']]

    request:
        class: Request
        synthetic: true
        synchronized: true
    depends_on_request:
        class: stdClass
        calls:
            - [setRequest, ['@?request']]

    alias_for_foo: @foo
    alias_for_alias: @foo
PK/b�\��2epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services1.ymlnu�[���
PK/b�\�*_6��cpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag3.ymlnu�[���services:
    foo_service:
        class:    FooClass
        tags:
          # tag-attribute is not a scalar
          - { name: foo, bar: { foo: foo, bar: bar } }
PK/b�\6�e3��epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services6.ymlnu�[���services:
    foo: { class: FooClass }
    baz: { class: BazClass }
    scope.container: { class: FooClass, scope: container }
    scope.custom: { class: FooClass, scope: custom }
    scope.prototype: { class: FooClass, scope: prototype }
    constructor: { class: FooClass, factory_method: getInstance }
    file: { class: FooClass, file: %path%/foo.php }
    arguments: { class: FooClass, arguments: [foo, @foo, [true, false]] }
    configurator1: { class: FooClass, configurator: sc_configure }
    configurator2: { class: FooClass, configurator: [@baz, configure] }
    configurator3: { class: FooClass, configurator: [BazClass, configureStatic] }
    method_call1:
        class: FooClass
        calls:
            - [ setBar, [] ]
            - [ setBar ]
            - [ setBar, ['@=service("foo").foo() ~ parameter("foo")'] ]
    method_call2:
        class: FooClass
        calls:
            - [ setBar, [ foo, @foo, [true, false] ] ]
    alias_for_foo: @foo
    another_alias_for_foo:
        alias: foo
        public: false
    factory_service: { class: BazClass, factory_method: getInstance, factory_service: baz_factory }
    request:
        class: Request
        synthetic: true
        synchronized: true
        lazy: true
PK0b�\�%/���fpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services10.ymlnu�[���parameters:
    project.parameter.foo: BAR

services:
    project.service.foo:
        class: BAR

project:
    test: %project.parameter.foo%
PK0b�\#�&#epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid1.ymlnu�[���foo:
  bar
PK0b�\V�v�==epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4.ymlnu�[���imports:
    - { resource: services2.yml }
    - { resource: services3.yml }
    - { resource: "../php/simple.php" }
    - { resource: "../ini/parameters.ini", class: Symfony\Component\DependencyInjection\Loader\IniFileLoader }
    - { resource: "../ini/parameters2.ini" }
    - { resource: "../xml/services13.xml" }
PK1b�\����epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.ymlnu�[���parameters:
    foo: '%baz%'
    baz: bar
    bar: 'foo is %%foo bar'
    escape: '@@escapeme'
    values: [true, false, null, 0, 1000.3, 'true', 'false', 'null']

PK1b�\}�>���cpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag2.ymlnu�[���services:
    foo_service:
        class:    FooClass
        tags:
          # tag is missing the name key
          foo_tag:   { foo: bar }
PK1b�\:�Ʋ��epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.ymlnu�[���parameters:
    FOO: bar
    values:
        - true
        - false
        - 0
        - 1000.3
    bar: foo
    escape: @@escapeme
    foo_bar: @foo_bar
    MixedCase:
        MixedCaseKey: value
PK2b�\zb��nncpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/badtag1.ymlnu�[���services:
    foo_service:
        class:    FooClass
        # tags is not an array
        tags:     string
PK2b�\W�%epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/nonvalid2.ymlnu�[���false
PK2b�\y��??ppear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services4_bad_import.ymlnu�[���imports:
    - { resource: foo_fake.yml, ignore_errors: true }
PK3b�\�MuAfpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services11.ymlnu�[���foobarfoobar: {}
PK3b�\����''epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services7.ymlnu�[���services:
    foo: { class: BarClass }
PK3b�\s4��''epear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters.ininu�[���[parameters]
  foo = bar
  bar = %foo%
PK4b�\5l%%fpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters1.ininu�[���[parameters]
  FOO = foo
  baz = baz
PK4b�\۴)�++cpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/ini/nonvalid.ininu�[���{NOT AN INI FILE}
{JUST A PLAIN TEXT FILE}
PK4b�\pu��((fpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/Fixtures/ini/parameters2.ininu�[���[parameters]
  imported_from_ini = true
PK5b�\~O�99ppear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/LazyProxy/PhpDumper/NullDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\LazyProxy\PhpDumper;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\NullDumper;

/**
 * Tests for {@see \Symfony\Component\DependencyInjection\PhpDumper\NullDumper}
 *
 * @author Marco Pivetta <ocramius@gmail.com>
 *
 * @covers \Symfony\Component\DependencyInjection\LazyProxy\PhpDumper\NullDumper
 */
class NullDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testNullDumper()
    {
        $dumper     = new NullDumper();
        $definition = new Definition('stdClass');

        $this->assertFalse($dumper->isProxyCandidate($definition));
        $this->assertSame('', $dumper->getProxyFactoryCode($definition, 'foo'));
        $this->assertSame('', $dumper->getProxyCode($definition));
    }
}
PK5b�\I8�i���pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/LazyProxy/Instantiator/RealServiceInstantiatorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\LazyProxy\Instantiator;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\LazyProxy\Instantiator\RealServiceInstantiator;

/**
 * Tests for {@see \Symfony\Component\DependencyInjection\Instantiator\RealServiceInstantiator}
 *
 * @author Marco Pivetta <ocramius@gmail.com>
 *
 * @covers \Symfony\Component\DependencyInjection\LazyProxy\Instantiator\RealServiceInstantiator
 */
class RealServiceInstantiatorTest extends \PHPUnit_Framework_TestCase
{
    public function testInstantiateProxy()
    {
        $instantiator = new RealServiceInstantiator();
        $instance     = new \stdClass();
        $container    = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
        $callback     = function () use ($instance) {
            return $instance;
        };

        $this->assertSame($instance, $instantiator->instantiateProxy($container, new Definition(), 'foo', $callback));
    }
}
PK5b�\�K5��W�W[pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ContainerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests;

use Symfony\Component\DependencyInjection\Scope;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;

class ContainerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\DependencyInjection\Container::__construct
     */
    public function testConstructor()
    {
        $sc = new Container();
        $this->assertSame($sc, $sc->get('service_container'), '__construct() automatically registers itself as a service');

        $sc = new Container(new ParameterBag(array('foo' => 'bar')));
        $this->assertEquals(array('foo' => 'bar'), $sc->getParameterBag()->all(), '__construct() takes an array of parameters as its first argument');
    }

    /**
     * @dataProvider dataForTestCamelize
     */
    public function testCamelize($id, $expected)
    {
        $this->assertEquals($expected, Container::camelize($id), sprintf('Container::camelize("%s")', $id));
    }

    public function dataForTestCamelize()
    {
        return array(
            array('foo_bar', 'FooBar'),
            array('foo.bar', 'Foo_Bar'),
            array('foo.bar_baz', 'Foo_BarBaz'),
            array('foo._bar', 'Foo_Bar'),
            array('foo_.bar', 'Foo_Bar'),
            array('_foo', 'Foo'),
            array('.foo', '_Foo'),
            array('foo_', 'Foo'),
            array('foo.', 'Foo_'),
            array('foo\bar', 'Foo_Bar'),
        );
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::compile
     */
    public function testCompile()
    {
        $sc = new Container(new ParameterBag(array('foo' => 'bar')));
        $sc->compile();
        $this->assertInstanceOf('Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag', $sc->getParameterBag(), '->compile() changes the parameter bag to a FrozenParameterBag instance');
        $this->assertEquals(array('foo' => 'bar'), $sc->getParameterBag()->all(), '->compile() copies the current parameters to the new parameter bag');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::isFrozen
     */
    public function testIsFrozen()
    {
        $sc = new Container(new ParameterBag(array('foo' => 'bar')));
        $this->assertFalse($sc->isFrozen(), '->isFrozen() returns false if the parameters are not frozen');
        $sc->compile();
        $this->assertTrue($sc->isFrozen(), '->isFrozen() returns true if the parameters are frozen');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::getParameterBag
     */
    public function testGetParameterBag()
    {
        $sc = new Container();
        $this->assertEquals(array(), $sc->getParameterBag()->all(), '->getParameterBag() returns an empty array if no parameter has been defined');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::setParameter
     * @covers Symfony\Component\DependencyInjection\Container::getParameter
     */
    public function testGetSetParameter()
    {
        $sc = new Container(new ParameterBag(array('foo' => 'bar')));
        $sc->setParameter('bar', 'foo');
        $this->assertEquals('foo', $sc->getParameter('bar'), '->setParameter() sets the value of a new parameter');

        $sc->setParameter('foo', 'baz');
        $this->assertEquals('baz', $sc->getParameter('foo'), '->setParameter() overrides previously set parameter');

        $sc->setParameter('Foo', 'baz1');
        $this->assertEquals('baz1', $sc->getParameter('foo'), '->setParameter() converts the key to lowercase');
        $this->assertEquals('baz1', $sc->getParameter('FOO'), '->getParameter() converts the key to lowercase');

        try {
            $sc->getParameter('baba');
            $this->fail('->getParameter() thrown an \InvalidArgumentException if the key does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->getParameter() thrown an \InvalidArgumentException if the key does not exist');
            $this->assertEquals('You have requested a non-existent parameter "baba".', $e->getMessage(), '->getParameter() thrown an \InvalidArgumentException if the key does not exist');
        }
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::getServiceIds
     */
    public function testGetServiceIds()
    {
        $sc = new Container();
        $sc->set('foo', $obj = new \stdClass());
        $sc->set('bar', $obj = new \stdClass());
        $this->assertEquals(array('service_container', 'foo', 'bar'), $sc->getServiceIds(), '->getServiceIds() returns all defined service ids');

        $sc = new ProjectServiceContainer();
        $this->assertEquals(array('scoped', 'scoped_foo', 'inactive', 'bar', 'foo_bar', 'foo.baz', 'circular', 'throw_exception', 'throws_exception_on_service_configuration', 'service_container'), $sc->getServiceIds(), '->getServiceIds() returns defined service ids by getXXXService() methods');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::set
     */
    public function testSet()
    {
        $sc = new Container();
        $sc->set('foo', $foo = new \stdClass());
        $this->assertEquals($foo, $sc->get('foo'), '->set() sets a service');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::set
     */
    public function testSetWithNullResetTheService()
    {
        $sc = new Container();
        $sc->set('foo', null);
        $this->assertFalse($sc->has('foo'));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testSetDoesNotAllowPrototypeScope()
    {
        $c = new Container();
        $c->set('foo', new \stdClass(), 'prototype');
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testSetDoesNotAllowInactiveScope()
    {
        $c = new Container();
        $c->addScope(new Scope('foo'));
        $c->set('foo', new \stdClass(), 'foo');
    }

    public function testSetAlsoSetsScopedService()
    {
        $c = new Container();
        $c->addScope(new Scope('foo'));
        $c->enterScope('foo');
        $c->set('foo', $foo = new \stdClass(), 'foo');

        $services = $this->getField($c, 'scopedServices');
        $this->assertTrue(isset($services['foo']['foo']));
        $this->assertSame($foo, $services['foo']['foo']);
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::get
     */
    public function testGet()
    {
        $sc = new ProjectServiceContainer();
        $sc->set('foo', $foo = new \stdClass());
        $this->assertEquals($foo, $sc->get('foo'), '->get() returns the service for the given id');
        $this->assertEquals($sc->__bar, $sc->get('bar'), '->get() returns the service for the given id');
        $this->assertEquals($sc->__foo_bar, $sc->get('foo_bar'), '->get() returns the service if a get*Method() is defined');
        $this->assertEquals($sc->__foo_baz, $sc->get('foo.baz'), '->get() returns the service if a get*Method() is defined');
        $this->assertEquals($sc->__foo_baz, $sc->get('foo\\baz'), '->get() returns the service if a get*Method() is defined');

        $sc->set('bar', $bar = new \stdClass());
        $this->assertEquals($bar, $sc->get('bar'), '->get() prefers to return a service defined with set() than one defined with a getXXXMethod()');

        try {
            $sc->get('');
            $this->fail('->get() throws a \InvalidArgumentException exception if the service is empty');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException', $e, '->get() throws a ServiceNotFoundException exception if the service is empty');
        }
        $this->assertNull($sc->get('', ContainerInterface::NULL_ON_INVALID_REFERENCE));
    }

    public function testGetThrowServiceNotFoundException()
    {
        $sc = new ProjectServiceContainer();
        $sc->set('foo', $foo = new \stdClass());
        $sc->set('bar', $foo = new \stdClass());
        $sc->set('baz', $foo = new \stdClass());

        try {
            $sc->get('foo1');
            $this->fail('->get() throws an Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException if the key does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException', $e, '->get() throws an Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException if the key does not exist');
            $this->assertEquals('You have requested a non-existent service "foo1". Did you mean this: "foo"?', $e->getMessage(), '->get() throws an Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException with some advices');
        }

        try {
            $sc->get('bag');
            $this->fail('->get() throws an Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException if the key does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException', $e, '->get() throws an Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException if the key does not exist');
            $this->assertEquals('You have requested a non-existent service "bag". Did you mean one of these: "bar", "baz"?', $e->getMessage(), '->get() throws an Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException with some advices');
        }
    }

    public function testGetCircularReference()
    {

        $sc = new ProjectServiceContainer();
        try {
            $sc->get('circular');
            $this->fail('->get() throws a ServiceCircularReferenceException if it contains circular reference');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException', $e, '->get() throws a ServiceCircularReferenceException if it contains circular reference');
            $this->assertStringStartsWith('Circular reference detected for service "circular"', $e->getMessage(), '->get() throws a \LogicException if it contains circular reference');
        }
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::get
     */
    public function testGetReturnsNullOnInactiveScope()
    {
        $sc = new ProjectServiceContainer();
        $this->assertNull($sc->get('inactive', ContainerInterface::NULL_ON_INVALID_REFERENCE));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::has
     */
    public function testHas()
    {
        $sc = new ProjectServiceContainer();
        $sc->set('foo', new \stdClass());
        $this->assertFalse($sc->has('foo1'), '->has() returns false if the service does not exist');
        $this->assertTrue($sc->has('foo'), '->has() returns true if the service exists');
        $this->assertTrue($sc->has('bar'), '->has() returns true if a get*Method() is defined');
        $this->assertTrue($sc->has('foo_bar'), '->has() returns true if a get*Method() is defined');
        $this->assertTrue($sc->has('foo.baz'), '->has() returns true if a get*Method() is defined');
        $this->assertTrue($sc->has('foo\\baz'), '->has() returns true if a get*Method() is defined');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\Container::initialized
     */
    public function testInitialized()
    {
        $sc = new ProjectServiceContainer();
        $sc->set('foo', new \stdClass());
        $this->assertTrue($sc->initialized('foo'), '->initialized() returns true if service is loaded');
        $this->assertFalse($sc->initialized('foo1'), '->initialized() returns false if service is not loaded');
        $this->assertFalse($sc->initialized('bar'), '->initialized() returns false if a service is defined, but not currently loaded');
    }

    public function testEnterLeaveCurrentScope()
    {
        $container = new ProjectServiceContainer();
        $container->addScope(new Scope('foo'));

        $container->enterScope('foo');
        $scoped1 = $container->get('scoped');
        $scopedFoo1 = $container->get('scoped_foo');

        $container->enterScope('foo');
        $scoped2 = $container->get('scoped');
        $scoped3 = $container->get('scoped');
        $scopedFoo2 = $container->get('scoped_foo');

        $container->leaveScope('foo');
        $scoped4 = $container->get('scoped');
        $scopedFoo3 = $container->get('scoped_foo');

        $this->assertNotSame($scoped1, $scoped2);
        $this->assertSame($scoped2, $scoped3);
        $this->assertSame($scoped1, $scoped4);
        $this->assertNotSame($scopedFoo1, $scopedFoo2);
        $this->assertSame($scopedFoo1, $scopedFoo3);
    }

    public function testEnterLeaveScopeWithChildScopes()
    {
        $container = new Container();
        $container->addScope(new Scope('foo'));
        $container->addScope(new Scope('bar', 'foo'));

        $this->assertFalse($container->isScopeActive('foo'));

        $container->enterScope('foo');
        $container->enterScope('bar');

        $this->assertTrue($container->isScopeActive('foo'));
        $this->assertFalse($container->has('a'));

        $a = new \stdClass();
        $container->set('a', $a, 'bar');

        $services = $this->getField($container, 'scopedServices');
        $this->assertTrue(isset($services['bar']['a']));
        $this->assertSame($a, $services['bar']['a']);

        $this->assertTrue($container->has('a'));
        $container->leaveScope('foo');

        $services = $this->getField($container, 'scopedServices');
        $this->assertFalse(isset($services['bar']));

        $this->assertFalse($container->isScopeActive('foo'));
        $this->assertFalse($container->has('a'));
    }

    public function testEnterScopeRecursivelyWithInactiveChildScopes()
    {
        $container = new Container();
        $container->addScope(new Scope('foo'));
        $container->addScope(new Scope('bar', 'foo'));

        $this->assertFalse($container->isScopeActive('foo'));

        $container->enterScope('foo');

        $this->assertTrue($container->isScopeActive('foo'));
        $this->assertFalse($container->isScopeActive('bar'));
        $this->assertFalse($container->has('a'));

        $a = new \stdClass();
        $container->set('a', $a, 'foo');

        $services = $this->getField($container, 'scopedServices');
        $this->assertTrue(isset($services['foo']['a']));
        $this->assertSame($a, $services['foo']['a']);

        $this->assertTrue($container->has('a'));
        $container->enterScope('foo');

        $services = $this->getField($container, 'scopedServices');
        $this->assertFalse(isset($services['a']));

        $this->assertTrue($container->isScopeActive('foo'));
        $this->assertFalse($container->isScopeActive('bar'));
        $this->assertFalse($container->has('a'));
    }

    public function testLeaveScopeNotActive()
    {
        $container = new Container();
        $container->addScope(new Scope('foo'));

        try {
            $container->leaveScope('foo');
            $this->fail('->leaveScope() throws a \LogicException if the scope is not active yet');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\LogicException', $e, '->leaveScope() throws a \LogicException if the scope is not active yet');
            $this->assertEquals('The scope "foo" is not active.', $e->getMessage(), '->leaveScope() throws a \LogicException if the scope is not active yet');
        }

        try {
            $container->leaveScope('bar');
            $this->fail('->leaveScope() throws a \LogicException if the scope does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\LogicException', $e, '->leaveScope() throws a \LogicException if the scope does not exist');
            $this->assertEquals('The scope "bar" is not active.', $e->getMessage(), '->leaveScope() throws a \LogicException if the scope does not exist');
        }
    }

    /**
     * @expectedException \InvalidArgumentException
     * @dataProvider getBuiltInScopes
     */
    public function testAddScopeDoesNotAllowBuiltInScopes($scope)
    {
        $container = new Container();
        $container->addScope(new Scope($scope));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testAddScopeDoesNotAllowExistingScope()
    {
        $container = new Container();
        $container->addScope(new Scope('foo'));
        $container->addScope(new Scope('foo'));
    }

    /**
     * @expectedException \InvalidArgumentException
     * @dataProvider getInvalidParentScopes
     */
    public function testAddScopeDoesNotAllowInvalidParentScope($scope)
    {
        $c = new Container();
        $c->addScope(new Scope('foo', $scope));
    }

    public function testAddScope()
    {
        $c = new Container();
        $c->addScope(new Scope('foo'));
        $c->addScope(new Scope('bar', 'foo'));

        $this->assertSame(array('foo' => 'container', 'bar' => 'foo'), $this->getField($c, 'scopes'));
        $this->assertSame(array('foo' => array('bar'), 'bar' => array()), $this->getField($c, 'scopeChildren'));
    }

    public function testHasScope()
    {
        $c = new Container();

        $this->assertFalse($c->hasScope('foo'));
        $c->addScope(new Scope('foo'));
        $this->assertTrue($c->hasScope('foo'));
    }

    public function testIsScopeActive()
    {
        $c = new Container();

        $this->assertFalse($c->isScopeActive('foo'));
        $c->addScope(new Scope('foo'));

        $this->assertFalse($c->isScopeActive('foo'));
        $c->enterScope('foo');

        $this->assertTrue($c->isScopeActive('foo'));
        $c->leaveScope('foo');

        $this->assertFalse($c->isScopeActive('foo'));
    }

    public function testGetThrowsException()
    {
        $c = new ProjectServiceContainer();

        try {
            $c->get('throw_exception');
            $this->fail();
        } catch (\Exception $e) {
            $this->assertEquals('Something went terribly wrong!', $e->getMessage());
        }

        try {
            $c->get('throw_exception');
            $this->fail();
        } catch (\Exception $e) {
            $this->assertEquals('Something went terribly wrong!', $e->getMessage());
        }
    }

    public function testGetThrowsExceptionOnServiceConfiguration()
    {
        $c = new ProjectServiceContainer();

        try {
            $c->get('throws_exception_on_service_configuration');
            $this->fail('The container can not contain invalid service!');
        } catch (\Exception $e) {
            $this->assertEquals('Something was terribly wrong while trying to configure the service!', $e->getMessage());
        }
        $this->assertFalse($c->initialized('throws_exception_on_service_configuration'));

        try {
            $c->get('throws_exception_on_service_configuration');
            $this->fail('The container can not contain invalid service!');
        } catch (\Exception $e) {
            $this->assertEquals('Something was terribly wrong while trying to configure the service!', $e->getMessage());
        }
        $this->assertFalse($c->initialized('throws_exception_on_service_configuration'));
    }

    public function getInvalidParentScopes()
    {
        return array(
            array(ContainerInterface::SCOPE_PROTOTYPE),
            array('bar'),
        );
    }

    public function getBuiltInScopes()
    {
        return array(
            array(ContainerInterface::SCOPE_CONTAINER),
            array(ContainerInterface::SCOPE_PROTOTYPE),
        );
    }

    protected function getField($obj, $field)
    {
        $reflection = new \ReflectionProperty($obj, $field);
        $reflection->setAccessible(true);

        return $reflection->getValue($obj);
    }

    public function testAlias()
    {
        $c = new ProjectServiceContainer();

        $this->assertTrue($c->has('alias'));
        $this->assertSame($c->get('alias'), $c->get('bar'));
    }
}

class ProjectServiceContainer extends Container
{
    public $__bar, $__foo_bar, $__foo_baz;

    public function __construct()
    {
        parent::__construct();

        $this->__bar = new \stdClass();
        $this->__foo_bar = new \stdClass();
        $this->__foo_baz = new \stdClass();
        $this->aliases = array('alias' => 'bar');
    }

    protected function getScopedService()
    {
        if (!isset($this->scopedServices['foo'])) {
            throw new \RuntimeException('Invalid call');
        }

        return $this->services['scoped'] = $this->scopedServices['foo']['scoped'] = new \stdClass();
    }

    protected function getScopedFooService()
    {
        if (!isset($this->scopedServices['foo'])) {
            throw new \RuntimeException('invalid call');
        }

        return $this->services['scoped_foo'] = $this->scopedServices['foo']['scoped_foo'] = new \stdClass();
    }

    protected function getInactiveService()
    {
        throw new InactiveScopeException('request', 'request');
    }

    protected function getBarService()
    {
        return $this->__bar;
    }

    protected function getFooBarService()
    {
        return $this->__foo_bar;
    }

    protected function getFoo_BazService()
    {
        return $this->__foo_baz;
    }

    protected function getCircularService()
    {
        return $this->get('circular');
    }

    protected function getThrowExceptionService()
    {
        throw new \Exception('Something went terribly wrong!');
    }

    protected function getThrowsExceptionOnServiceConfigurationService()
    {
        $this->services['throws_exception_on_service_configuration'] = $instance = new \stdClass();

        throw new \Exception('Something was terribly wrong while trying to configure the service!');
    }
}
PK5b�\
�^��qpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ParameterBag/FrozenParameterBagTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\ParameterBag;

use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;

class FrozenParameterBagTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag::__construct
     */
    public function testConstructor()
    {
        $parameters = array(
            'foo' => 'foo',
            'bar' => 'bar',
        );
        $bag = new FrozenParameterBag($parameters);
        $this->assertEquals($parameters, $bag->all(), '__construct() takes an array of parameters as its first argument');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag::clear
     * @expectedException \LogicException
     */
    public function testClear()
    {
        $bag = new FrozenParameterBag(array());
        $bag->clear();
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag::set
     * @expectedException \LogicException
     */
    public function testSet()
    {
        $bag = new FrozenParameterBag(array());
        $bag->set('foo', 'bar');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag::add
     * @expectedException \LogicException
     */
    public function testAdd()
    {
        $bag = new FrozenParameterBag(array());
        $bag->add(array());
    }
}
PK6b�\$����9�9kpear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests\ParameterBag;

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;

class ParameterBagTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::__construct
     */
    public function testConstructor()
    {
        $bag = new ParameterBag($parameters = array(
            'foo' => 'foo',
            'bar' => 'bar',
        ));
        $this->assertEquals($parameters, $bag->all(), '__construct() takes an array of parameters as its first argument');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::clear
     */
    public function testClear()
    {
        $bag = new ParameterBag($parameters = array(
            'foo' => 'foo',
            'bar' => 'bar',
        ));
        $bag->clear();
        $this->assertEquals(array(), $bag->all(), '->clear() removes all parameters');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::remove
     */
    public function testRemove()
    {
        $bag = new ParameterBag(array(
            'foo' => 'foo',
            'bar' => 'bar',
        ));
        $bag->remove('foo');
        $this->assertEquals(array('bar' => 'bar'), $bag->all(), '->remove() removes a parameter');
        $bag->remove('BAR');
        $this->assertEquals(array(), $bag->all(), '->remove() converts key to lowercase before removing');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::get
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::set
     */
    public function testGetSet()
    {
        $bag = new ParameterBag(array('foo' => 'bar'));
        $bag->set('bar', 'foo');
        $this->assertEquals('foo', $bag->get('bar'), '->set() sets the value of a new parameter');

        $bag->set('foo', 'baz');
        $this->assertEquals('baz', $bag->get('foo'), '->set() overrides previously set parameter');

        $bag->set('Foo', 'baz1');
        $this->assertEquals('baz1', $bag->get('foo'), '->set() converts the key to lowercase');
        $this->assertEquals('baz1', $bag->get('FOO'), '->get() converts the key to lowercase');

        try {
            $bag->get('baba');
            $this->fail('->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException if the key does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException', $e, '->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException if the key does not exist');
            $this->assertEquals('You have requested a non-existent parameter "baba".', $e->getMessage(), '->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException if the key does not exist');
        }
    }

    public function testGetThrowParameterNotFoundException()
    {
        $bag = new ParameterBag(array(
            'foo' => 'foo',
            'bar' => 'bar',
            'baz' => 'baz',
        ));

        try {
            $bag->get('foo1');
            $this->fail('->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException if the key does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException', $e, '->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException if the key does not exist');
            $this->assertEquals('You have requested a non-existent parameter "foo1". Did you mean this: "foo"?', $e->getMessage(), '->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException with some advices');
        }

        try {
            $bag->get('bag');
            $this->fail('->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException if the key does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException', $e, '->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException if the key does not exist');
            $this->assertEquals('You have requested a non-existent parameter "bag". Did you mean one of these: "bar", "baz"?', $e->getMessage(), '->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException with some advices');
        }

        try {
            $bag->get('');
            $this->fail('->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException if the key does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException', $e, '->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException if the key does not exist');
            $this->assertEquals('You have requested a non-existent parameter "".', $e->getMessage(), '->get() throws an Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException with some advices');
        }
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::has
     */
    public function testHas()
    {
        $bag = new ParameterBag(array('foo' => 'bar'));
        $this->assertTrue($bag->has('foo'), '->has() returns true if a parameter is defined');
        $this->assertTrue($bag->has('Foo'), '->has() converts the key to lowercase');
        $this->assertFalse($bag->has('bar'), '->has() returns false if a parameter is not defined');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::resolveValue
     */
    public function testResolveValue()
    {
        $bag = new ParameterBag(array());
        $this->assertEquals('foo', $bag->resolveValue('foo'), '->resolveValue() returns its argument unmodified if no placeholders are found');

        $bag = new ParameterBag(array('foo' => 'bar'));
        $this->assertEquals('I\'m a bar', $bag->resolveValue('I\'m a %foo%'), '->resolveValue() replaces placeholders by their values');
        $this->assertEquals(array('bar' => 'bar'), $bag->resolveValue(array('%foo%' => '%foo%')), '->resolveValue() replaces placeholders in keys and values of arrays');
        $this->assertEquals(array('bar' => array('bar' => array('bar' => 'bar'))), $bag->resolveValue(array('%foo%' => array('%foo%' => array('%foo%' => '%foo%')))), '->resolveValue() replaces placeholders in nested arrays');
        $this->assertEquals('I\'m a %%foo%%', $bag->resolveValue('I\'m a %%foo%%'), '->resolveValue() supports % escaping by doubling it');
        $this->assertEquals('I\'m a bar %%foo bar', $bag->resolveValue('I\'m a %foo% %%foo %foo%'), '->resolveValue() supports % escaping by doubling it');
        $this->assertEquals(array('foo' => array('bar' => array('ding' => 'I\'m a bar %%foo %%bar'))), $bag->resolveValue(array('foo' => array('bar' => array('ding' => 'I\'m a bar %%foo %%bar')))), '->resolveValue() supports % escaping by doubling it');

        $bag = new ParameterBag(array('foo' => true));
        $this->assertTrue($bag->resolveValue('%foo%'), '->resolveValue() replaces arguments that are just a placeholder by their value without casting them to strings');
        $bag = new ParameterBag(array('foo' => null));
        $this->assertNull($bag->resolveValue('%foo%'), '->resolveValue() replaces arguments that are just a placeholder by their value without casting them to strings');

        $bag = new ParameterBag(array('foo' => 'bar', 'baz' => '%%%foo% %foo%%% %%foo%% %%%foo%%%'));
        $this->assertEquals('%%bar bar%% %%foo%% %%bar%%', $bag->resolveValue('%baz%'), '->resolveValue() replaces params placed besides escaped %');

        $bag = new ParameterBag(array('baz' => '%%s?%%s'));
        $this->assertEquals('%%s?%%s', $bag->resolveValue('%baz%'), '->resolveValue() is not replacing greedily');

        $bag = new ParameterBag(array());
        try {
            $bag->resolveValue('%foobar%');
            $this->fail('->resolveValue() throws an InvalidArgumentException if a placeholder references a non-existent parameter');
        } catch (ParameterNotFoundException $e) {
            $this->assertEquals('You have requested a non-existent parameter "foobar".', $e->getMessage(), '->resolveValue() throws a ParameterNotFoundException if a placeholder references a non-existent parameter');
        }

        try {
            $bag->resolveValue('foo %foobar% bar');
            $this->fail('->resolveValue() throws a ParameterNotFoundException if a placeholder references a non-existent parameter');
        } catch (ParameterNotFoundException $e) {
            $this->assertEquals('You have requested a non-existent parameter "foobar".', $e->getMessage(), '->resolveValue() throws a ParameterNotFoundException if a placeholder references a non-existent parameter');
        }

        $bag = new ParameterBag(array('foo' => 'a %bar%', 'bar' => array()));
        try {
            $bag->resolveValue('%foo%');
            $this->fail('->resolveValue() throws a RuntimeException when a parameter embeds another non-string parameter');
        } catch (RuntimeException $e) {
            $this->assertEquals('A string value must be composed of strings and/or numbers, but found parameter "bar" of type array inside string value "a %bar%".', $e->getMessage(), '->resolveValue() throws a RuntimeException when a parameter embeds another non-string parameter');
        }

        $bag = new ParameterBag(array('foo' => '%bar%', 'bar' => '%foobar%', 'foobar' => '%foo%'));
        try {
            $bag->resolveValue('%foo%');
            $this->fail('->resolveValue() throws a ParameterCircularReferenceException when a parameter has a circular reference');
        } catch (ParameterCircularReferenceException $e) {
            $this->assertEquals('Circular reference detected for parameter "foo" ("foo" > "bar" > "foobar" > "foo").', $e->getMessage(), '->resolveValue() throws a ParameterCircularReferenceException when a parameter has a circular reference');
        }

        $bag = new ParameterBag(array('foo' => 'a %bar%', 'bar' => 'a %foobar%', 'foobar' => 'a %foo%'));
        try {
            $bag->resolveValue('%foo%');
            $this->fail('->resolveValue() throws a ParameterCircularReferenceException when a parameter has a circular reference');
        } catch (ParameterCircularReferenceException $e) {
            $this->assertEquals('Circular reference detected for parameter "foo" ("foo" > "bar" > "foobar" > "foo").', $e->getMessage(), '->resolveValue() throws a ParameterCircularReferenceException when a parameter has a circular reference');
        }

        $bag = new ParameterBag(array('host' => 'foo.bar', 'port' => 1337));
        $this->assertEquals('foo.bar:1337', $bag->resolveValue('%host%:%port%'));
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::resolve
     */
    public function testResolveIndicatesWhyAParameterIsNeeded()
    {
        $bag = new ParameterBag(array('foo' => '%bar%'));

        try {
            $bag->resolve();
        } catch (ParameterNotFoundException $e) {
            $this->assertEquals('The parameter "foo" has a dependency on a non-existent parameter "bar".', $e->getMessage());
        }

        $bag = new ParameterBag(array('foo' => '%bar%'));

        try {
            $bag->resolve();
        } catch (ParameterNotFoundException $e) {
            $this->assertEquals('The parameter "foo" has a dependency on a non-existent parameter "bar".', $e->getMessage());
        }
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::resolve
     */
    public function testResolveUnescapesValue()
    {
        $bag = new ParameterBag(array(
            'foo' => array('bar' => array('ding' => 'I\'m a bar %%foo %%bar')),
            'bar' => 'I\'m a %%foo%%',
        ));

        $bag->resolve();

        $this->assertEquals('I\'m a %foo%', $bag->get('bar'), '->resolveValue() supports % escaping by doubling it');
        $this->assertEquals(array('bar' => array('ding' => 'I\'m a bar %foo %bar')), $bag->get('foo'), '->resolveValue() supports % escaping by doubling it');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::escapeValue
     */
    public function testEscapeValue()
    {
        $bag = new ParameterBag();

        $bag->add(array(
            'foo' => $bag->escapeValue(array('bar' => array('ding' => 'I\'m a bar %foo %bar', 'zero' => null))),
            'bar' => $bag->escapeValue('I\'m a %foo%'),
        ));

        $this->assertEquals('I\'m a %%foo%%', $bag->get('bar'), '->escapeValue() escapes % by doubling it');
        $this->assertEquals(array('bar' => array('ding' => 'I\'m a bar %%foo %%bar', 'zero' => null)), $bag->get('foo'), '->escapeValue() escapes % by doubling it');
    }

    /**
     * @covers Symfony\Component\DependencyInjection\ParameterBag\ParameterBag::resolve
     * @dataProvider stringsWithSpacesProvider
     */
    public function testResolveStringWithSpacesReturnsString($expected, $test, $description)
    {
        $bag = new ParameterBag(array('foo' => 'bar'));

        try {
            $this->assertEquals($expected, $bag->resolveString($test), $description);
        } catch (ParameterNotFoundException $e) {
            $this->fail(sprintf('%s - "%s"', $description, $expected));
        }
    }

    public function stringsWithSpacesProvider()
    {
        return array(
            array('bar', '%foo%', 'Parameters must be wrapped by %.'),
            array('% foo %', '% foo %', 'Parameters should not have spaces.'),
            array('{% set my_template = "foo" %}', '{% set my_template = "foo" %}', 'Twig-like strings are not parameters.'),
            array('50% is less than 100%', '50% is less than 100%', 'Text between % signs is allowed, if there are spaces.'),
        );
    }
}
PK6b�\�[��[pear/test/DependencyInjection/Symfony/Component/DependencyInjection/Tests/ParameterTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\Tests;

use Symfony\Component\DependencyInjection\Parameter;

class ParameterTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\DependencyInjection\Parameter::__construct
     */
    public function testConstructor()
    {
        $ref = new Parameter('foo');
        $this->assertEquals('foo', (string) $ref, '__construct() sets the id of the parameter, which is used for the __toString() method');
    }
}
PK6b�\)q0�llBpear/test/DomCrawler/Symfony/Component/DomCrawler/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony DomCrawler Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK7b�\�3��ʖʖDpear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/FormTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Tests;

use Symfony\Component\DomCrawler\Form;
use Symfony\Component\DomCrawler\FormFieldRegistry;
use Symfony\Component\DomCrawler\Field;

class FormTest extends \PHPUnit_Framework_TestCase
{
    public static function setUpBeforeClass()
    {
        // Ensure that the private helper class FormFieldRegistry is loaded
        class_exists('Symfony\\Component\\DomCrawler\\Form');
    }

    public function testConstructorThrowsExceptionIfTheNodeHasNoFormAncestor()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('
            <html>
                <input type="submit" />
                <form>
                    <input type="foo" />
                </form>
                <button />
            </html>
        ');

        $nodes = $dom->getElementsByTagName('input');

        try {
            $form = new Form($nodes->item(0), 'http://example.com');
            $this->fail('__construct() throws a \\LogicException if the node has no form ancestor');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '__construct() throws a \\LogicException if the node has no form ancestor');
        }

        try {
            $form = new Form($nodes->item(1), 'http://example.com');
            $this->fail('__construct() throws a \\LogicException if the input type is not submit, button, or image');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '__construct() throws a \\LogicException if the input type is not submit, button, or image');
        }

        $nodes = $dom->getElementsByTagName('button');

        try {
            $form = new Form($nodes->item(0), 'http://example.com');
            $this->fail('__construct() throws a \\LogicException if the node has no form ancestor');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '__construct() throws a \\LogicException if the node has no form ancestor');
        }
    }

    /**
     * __construct() should throw \\LogicException if the form attribute is invalid
     * @expectedException \LogicException
     */
    public function testConstructorThrowsExceptionIfNoRelatedForm()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('
            <html>
                <form id="bar">
                    <input type="submit" form="nonexistent" />
                </form>
                <input type="text" form="nonexistent" />
                <button />
            </html>
        ');

        $nodes = $dom->getElementsByTagName('input');

        $form = new Form($nodes->item(0), 'http://example.com');
        $form = new Form($nodes->item(1), 'http://example.com');
    }

    public function testConstructorHandlesFormAttribute()
    {
        $dom = $this->createTestHtml5Form();

        $inputElements = $dom->getElementsByTagName('input');
        $buttonElements = $dom->getElementsByTagName('button');

        // Tests if submit buttons are correctly assigned to forms
        $form1 = new Form($buttonElements->item(1), 'http://example.com');
        $this->assertSame($dom->getElementsByTagName('form')->item(0), $form1->getFormNode(), 'HTML5-compliant form attribute handled incorrectly');

        $form1 = new Form($inputElements->item(3), 'http://example.com');
        $this->assertSame($dom->getElementsByTagName('form')->item(0), $form1->getFormNode(), 'HTML5-compliant form attribute handled incorrectly');

        $form2 = new Form($buttonElements->item(0), 'http://example.com');
        $this->assertSame($dom->getElementsByTagName('form')->item(1), $form2->getFormNode(), 'HTML5-compliant form attribute handled incorrectly');
    }

    public function testConstructorHandlesFormValues()
    {
        $dom = $this->createTestHtml5Form();

        $inputElements = $dom->getElementsByTagName('input');
        $buttonElements = $dom->getElementsByTagName('button');

        $form1 = new Form($inputElements->item(3), 'http://example.com');
        $form2 = new Form($buttonElements->item(0), 'http://example.com');

        // Tests if form values are correctly assigned to forms
        $values1 = array(
            'apples' => array('1', '2'),
            'form_name' => 'form-1',
            'button_1' => 'Capture fields',
            'outer_field' => 'success'
        );
        $values2 = array(
            'oranges' => array('1', '2', '3'),
            'form_name' => 'form_2',
            'button_2' => '',
            'app_frontend_form_type_contact_form_type' => array('contactType' => '', 'firstName' => 'John')
        );

        $this->assertEquals($values1, $form1->getPhpValues(), 'HTML5-compliant form attribute handled incorrectly');
        $this->assertEquals($values2, $form2->getPhpValues(), 'HTML5-compliant form attribute handled incorrectly');
    }

    public function testMultiValuedFields()
    {
        $form = $this->createForm('<form>
            <input type="text" name="foo[4]" value="foo" disabled="disabled" />
            <input type="text" name="foo" value="foo" disabled="disabled" />
            <input type="text" name="foo[2]" value="foo" disabled="disabled" />
            <input type="text" name="foo[]" value="foo" disabled="disabled" />
            <input type="text" name="bar[foo][]" value="foo" disabled="disabled" />
            <input type="text" name="bar[foo][foobar]" value="foo" disabled="disabled" />
            <input type="submit" />
        </form>
        ');

        $this->assertEquals(
            array_keys($form->all()),
            array('foo[2]', 'foo[3]', 'bar[foo][0]', 'bar[foo][foobar]')
        );

        $this->assertEquals($form->get('foo[2]')->getValue(), 'foo');
        $this->assertEquals($form->get('foo[3]')->getValue(), 'foo');
        $this->assertEquals($form->get('bar[foo][0]')->getValue(), 'foo');
        $this->assertEquals($form->get('bar[foo][foobar]')->getValue(), 'foo');

        $form['foo[2]'] = 'bar';
        $form['foo[3]'] = 'bar';

        $this->assertEquals($form->get('foo[2]')->getValue(), 'bar');
        $this->assertEquals($form->get('foo[3]')->getValue(), 'bar');

        $form['bar'] = array('foo' => array('0' => 'bar', 'foobar' => 'foobar'));

        $this->assertEquals($form->get('bar[foo][0]')->getValue(), 'bar');
        $this->assertEquals($form->get('bar[foo][foobar]')->getValue(), 'foobar');

    }

    /**
     * @dataProvider provideInitializeValues
     */
    public function testConstructor($message, $form, $values)
    {
        $form = $this->createForm('<form>'.$form.'</form>');
        $this->assertEquals(
            $values,
            array_map(function ($field) {
                    $class = get_class($field);

                    return array(substr($class, strrpos($class, '\\') + 1), $field->getValue());
                },
                $form->all()
            ),
            '->getDefaultValues() '.$message
        );
    }

    public function provideInitializeValues()
    {
        return array(
            array(
                'does not take into account input fields without a name attribute',
                '<input type="text" value="foo" />
                 <input type="submit" />',
                array(),
            ),
            array(
                'does not take into account input fields with an empty name attribute value',
                '<input type="text" name="" value="foo" />
                 <input type="submit" />',
                array(),
            ),
            array(
                'takes into account disabled input fields',
                '<input type="text" name="foo" value="foo" disabled="disabled" />
                 <input type="submit" />',
                array('foo' => array('InputFormField', 'foo')),
            ),
            array(
                'appends the submitted button value',
                '<input type="submit" name="bar" value="bar" />',
                array('bar' => array('InputFormField', 'bar')),
            ),
            array(
                'appends the submitted button value for Button element',
                '<button type="submit" name="bar" value="bar">Bar</button>',
                array('bar' => array('InputFormField', 'bar')),
            ),
            array(
                'appends the submitted button value but not other submit buttons',
                '<input type="submit" name="bar" value="bar" />
                 <input type="submit" name="foobar" value="foobar" />',
                 array('foobar' => array('InputFormField', 'foobar')),
            ),
            array(
                'turns an image input into x and y fields',
                '<input type="image" name="bar" />',
                array('bar.x' => array('InputFormField', '0'), 'bar.y' => array('InputFormField', '0')),
            ),
            array(
                'returns textareas',
                '<textarea name="foo">foo</textarea>
                 <input type="submit" />',
                 array('foo' => array('TextareaFormField', 'foo')),
            ),
            array(
                'returns inputs',
                '<input type="text" name="foo" value="foo" />
                 <input type="submit" />',
                 array('foo' => array('InputFormField', 'foo')),
            ),
            array(
                'returns checkboxes',
                '<input type="checkbox" name="foo" value="foo" checked="checked" />
                 <input type="submit" />',
                 array('foo' => array('ChoiceFormField', 'foo')),
            ),
            array(
                'returns not-checked checkboxes',
                '<input type="checkbox" name="foo" value="foo" />
                 <input type="submit" />',
                 array('foo' => array('ChoiceFormField', false)),
            ),
            array(
                'returns radio buttons',
                '<input type="radio" name="foo" value="foo" />
                 <input type="radio" name="foo" value="bar" checked="bar" />
                 <input type="submit" />',
                 array('foo' => array('ChoiceFormField', 'bar')),
            ),
            array(
                'returns file inputs',
                '<input type="file" name="foo" />
                 <input type="submit" />',
                 array('foo' => array('FileFormField', array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0))),
            ),
        );
    }

    public function testGetFormNode()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('<html><form><input type="submit" /></form></html>');

        $form = new Form($dom->getElementsByTagName('input')->item(0), 'http://example.com');

        $this->assertSame($dom->getElementsByTagName('form')->item(0), $form->getFormNode(), '->getFormNode() returns the form node associated with this form');
    }

    public function testGetFormNodeFromNamedForm()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('<html><form name="my_form"><input type="submit" /></form></html>');

        $form = new Form($dom->getElementsByTagName('form')->item(0), 'http://example.com');

        $this->assertSame($dom->getElementsByTagName('form')->item(0), $form->getFormNode(), '->getFormNode() returns the form node associated with this form');
    }

    public function testGetMethod()
    {
        $form = $this->createForm('<form><input type="submit" /></form>');
        $this->assertEquals('GET', $form->getMethod(), '->getMethod() returns get if no method is defined');

        $form = $this->createForm('<form method="post"><input type="submit" /></form>');
        $this->assertEquals('POST', $form->getMethod(), '->getMethod() returns the method attribute value of the form');

        $form = $this->createForm('<form method="post"><input type="submit" /></form>', 'put');
        $this->assertEquals('PUT', $form->getMethod(), '->getMethod() returns the method defined in the constructor if provided');

        $form = $this->createForm('<form method="post"><input type="submit" /></form>', 'delete');
        $this->assertEquals('DELETE', $form->getMethod(), '->getMethod() returns the method defined in the constructor if provided');

        $form = $this->createForm('<form method="post"><input type="submit" /></form>', 'patch');
        $this->assertEquals('PATCH', $form->getMethod(), '->getMethod() returns the method defined in the constructor if provided');
    }

    public function testGetSetValue()
    {
        $form = $this->createForm('<form><input type="text" name="foo" value="foo" /><input type="submit" /></form>');

        $this->assertEquals('foo', $form['foo']->getValue(), '->offsetGet() returns the value of a form field');

        $form['foo'] = 'bar';

        $this->assertEquals('bar', $form['foo']->getValue(), '->offsetSet() changes the value of a form field');

        try {
            $form['foobar'] = 'bar';
            $this->fail('->offsetSet() throws an \InvalidArgumentException exception if the field does not exist');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->offsetSet() throws an \InvalidArgumentException exception if the field does not exist');
        }

        try {
            $form['foobar'];
            $this->fail('->offsetSet() throws an \InvalidArgumentException exception if the field does not exist');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->offsetSet() throws an \InvalidArgumentException exception if the field does not exist');
        }
    }

    public function testSetValueOnMultiValuedFieldsWithMalformedName()
    {
        $form = $this->createForm('<form><input type="text" name="foo[bar]" value="bar" /><input type="text" name="foo[baz]" value="baz" /><input type="submit" /></form>');

        try {
            $form['foo[bar'] = 'bar';
            $this->fail('->offsetSet() throws an \InvalidArgumentException exception if the name is malformed.');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->offsetSet() throws an \InvalidArgumentException exception if the name is malformed.');
        }
    }

    public function testDisableValidation()
    {
        $form = $this->createForm('<form>
            <select name="foo[bar]">
                <option value="bar">bar</option>
            </select>
            <select name="foo[baz]">
                <option value="foo">foo</option>
            </select>
            <input type="submit" />
        </form>');

        $form->disableValidation();

        $form['foo[bar]']->select('foo');
        $form['foo[baz]']->select('bar');
        $this->assertEquals('foo', $form['foo[bar]']->getValue(), '->disableValidation() disables validation of all ChoiceFormField.');
        $this->assertEquals('bar', $form['foo[baz]']->getValue(), '->disableValidation() disables validation of all ChoiceFormField.');
    }

    public function testOffsetUnset()
    {
        $form = $this->createForm('<form><input type="text" name="foo" value="foo" /><input type="submit" /></form>');
        unset($form['foo']);
        $this->assertFalse(isset($form['foo']), '->offsetUnset() removes a field');
    }

    public function testOffsetExists()
    {
        $form = $this->createForm('<form><input type="text" name="foo" value="foo" /><input type="submit" /></form>');

        $this->assertTrue(isset($form['foo']), '->offsetExists() return true if the field exists');
        $this->assertFalse(isset($form['bar']), '->offsetExists() return false if the field does not exist');
    }

    public function testGetValues()
    {
        $form = $this->createForm('<form><input type="text" name="foo[bar]" value="foo" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('foo[bar]' => 'foo', 'bar' => 'bar'), $form->getValues(), '->getValues() returns all form field values');

        $form = $this->createForm('<form><input type="checkbox" name="foo" value="foo" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('bar' => 'bar'), $form->getValues(), '->getValues() does not include not-checked checkboxes');

        $form = $this->createForm('<form><input type="file" name="foo" value="foo" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('bar' => 'bar'), $form->getValues(), '->getValues() does not include file input fields');

        $form = $this->createForm('<form><input type="text" name="foo" value="foo" disabled="disabled" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('bar' => 'bar'), $form->getValues(), '->getValues() does not include disabled fields');
    }

    public function testSetValues()
    {
        $form = $this->createForm('<form><input type="checkbox" name="foo" value="foo" checked="checked" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $form->setValues(array('foo' => false, 'bar' => 'foo'));
        $this->assertEquals(array('bar' => 'foo'), $form->getValues(), '->setValues() sets the values of fields');
    }

    public function testMultiselectSetValues()
    {
        $form = $this->createForm('<form><select multiple="multiple" name="multi"><option value="foo">foo</option><option value="bar">bar</option></select><input type="submit" /></form>');
        $form->setValues(array('multi' => array("foo", "bar")));
        $this->assertEquals(array('multi' => array('foo', 'bar')), $form->getValues(), '->setValue() sets the values of select');
    }

    public function testGetPhpValues()
    {
        $form = $this->createForm('<form><input type="text" name="foo[bar]" value="foo" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('foo' => array('bar' => 'foo'), 'bar' => 'bar'), $form->getPhpValues(), '->getPhpValues() converts keys with [] to arrays');

        $form = $this->createForm('<form><input type="text" name="fo.o[ba.r]" value="foo" /><input type="text" name="ba r" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('fo.o' => array('ba.r' => 'foo'), 'ba r' => 'bar'), $form->getPhpValues(), '->getPhpValues() preserves periods and spaces in names');

        $form = $this->createForm('<form><input type="text" name="fo.o[ba.r][]" value="foo" /><input type="text" name="fo.o[ba.r][ba.z]" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('fo.o' => array('ba.r' => array('foo', 'ba.z' => 'bar'))), $form->getPhpValues(), '->getPhpValues() preserves periods and spaces in names recursively');
    }

    public function testGetFiles()
    {
        $form = $this->createForm('<form><input type="file" name="foo[bar]" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array(), $form->getFiles(), '->getFiles() returns an empty array if method is get');

        $form = $this->createForm('<form method="post"><input type="file" name="foo[bar]" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('foo[bar]' => array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0)), $form->getFiles(), '->getFiles() only returns file fields for POST');

        $form = $this->createForm('<form method="post"><input type="file" name="foo[bar]" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>', 'put');
        $this->assertEquals(array('foo[bar]' => array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0)), $form->getFiles(), '->getFiles() only returns file fields for PUT');

        $form = $this->createForm('<form method="post"><input type="file" name="foo[bar]" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>', 'delete');
        $this->assertEquals(array('foo[bar]' => array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0)), $form->getFiles(), '->getFiles() only returns file fields for DELETE');

        $form = $this->createForm('<form method="post"><input type="file" name="foo[bar]" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>', 'patch');
        $this->assertEquals(array('foo[bar]' => array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0)), $form->getFiles(), '->getFiles() only returns file fields for PATCH');

        $form = $this->createForm('<form method="post"><input type="file" name="foo[bar]" disabled="disabled" /><input type="submit" /></form>');
        $this->assertEquals(array(), $form->getFiles(), '->getFiles() does not include disabled file fields');
    }

    public function testGetPhpFiles()
    {
        $form = $this->createForm('<form method="post"><input type="file" name="foo[bar]" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('foo' => array('bar' => array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0))), $form->getPhpFiles(), '->getPhpFiles() converts keys with [] to arrays');

        $form = $this->createForm('<form method="post"><input type="file" name="f.o o[bar]" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('f.o o' => array('bar' => array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0))), $form->getPhpFiles(), '->getPhpFiles() preserves periods and spaces in names');

        $form = $this->createForm('<form method="post"><input type="file" name="f.o o[bar][ba.z]" /><input type="file" name="f.o o[bar][]" /><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $this->assertEquals(array('f.o o' => array('bar' => array('ba.z' => array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0), array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => 4, 'size' => 0)))), $form->getPhpFiles(), '->getPhpFiles() preserves periods and spaces in names recursively');
    }

    /**
     * @dataProvider provideGetUriValues
     */
    public function testGetUri($message, $form, $values, $uri, $method = null)
    {
        $form = $this->createForm($form, $method);
        $form->setValues($values);

        $this->assertEquals('http://example.com'.$uri, $form->getUri(), '->getUri() '.$message);
    }

    public function testGetBaseUri()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('<form method="post" action="foo.php"><input type="text" name="bar" value="bar" /><input type="submit" /></form>');

        $nodes = $dom->getElementsByTagName('input');
        $form = new Form($nodes->item($nodes->length - 1), 'http://www.foo.com/');
        $this->assertEquals('http://www.foo.com/foo.php', $form->getUri());
    }

    public function testGetUriWithAnchor()
    {
        $form = $this->createForm('<form action="#foo"><input type="submit" /></form>', null, 'http://example.com/id/123');

        $this->assertEquals('http://example.com/id/123#foo', $form->getUri());
    }

    public function testGetUriActionAbsolute()
    {
        $formHtml='<form id="login_form" action="https://login.foo.com/login.php?login_attempt=1" method="POST"><input type="text" name="foo" value="foo" /><input type="submit" /></form>';

        $form = $this->createForm($formHtml);
        $this->assertEquals('https://login.foo.com/login.php?login_attempt=1', $form->getUri(), '->getUri() returns absolute URIs set in the action form');

        $form = $this->createForm($formHtml, null, 'https://login.foo.com');
        $this->assertEquals('https://login.foo.com/login.php?login_attempt=1', $form->getUri(), '->getUri() returns absolute URIs set in the action form');

        $form = $this->createForm($formHtml, null, 'https://login.foo.com/bar/');
        $this->assertEquals('https://login.foo.com/login.php?login_attempt=1', $form->getUri(), '->getUri() returns absolute URIs set in the action form');

        // The action URI haven't the same domain Host have an another domain as Host
        $form = $this->createForm($formHtml, null, 'https://www.foo.com');
        $this->assertEquals('https://login.foo.com/login.php?login_attempt=1', $form->getUri(), '->getUri() returns absolute URIs set in the action form');

        $form = $this->createForm($formHtml, null, 'https://www.foo.com/bar/');
        $this->assertEquals('https://login.foo.com/login.php?login_attempt=1', $form->getUri(), '->getUri() returns absolute URIs set in the action form');
    }

    public function testGetUriAbsolute()
    {
        $form = $this->createForm('<form action="foo"><input type="submit" /></form>', null, 'http://localhost/foo/');
        $this->assertEquals('http://localhost/foo/foo', $form->getUri(), '->getUri() returns absolute URIs');

        $form = $this->createForm('<form action="/foo"><input type="submit" /></form>', null, 'http://localhost/foo/');
        $this->assertEquals('http://localhost/foo', $form->getUri(), '->getUri() returns absolute URIs');
    }

    public function testGetUriWithOnlyQueryString()
    {
        $form = $this->createForm('<form action="?get=param"><input type="submit" /></form>', null, 'http://localhost/foo/bar');
        $this->assertEquals('http://localhost/foo/bar?get=param', $form->getUri(), '->getUri() returns absolute URIs only if the host has been defined in the constructor');
    }

    public function testGetUriWithoutAction()
    {
        $form = $this->createForm('<form><input type="submit" /></form>', null, 'http://localhost/foo/bar');
        $this->assertEquals('http://localhost/foo/bar', $form->getUri(), '->getUri() returns path if no action defined');
    }

    public function provideGetUriValues()
    {
        return array(
            array(
                'returns the URI of the form',
                '<form action="/foo"><input type="submit" /></form>',
                array(),
                '/foo'
            ),
            array(
                'appends the form values if the method is get',
                '<form action="/foo"><input type="text" name="foo" value="foo" /><input type="submit" /></form>',
                array(),
                '/foo?foo=foo'
            ),
            array(
                'appends the form values and merges the submitted values',
                '<form action="/foo"><input type="text" name="foo" value="foo" /><input type="submit" /></form>',
                array('foo' => 'bar'),
                '/foo?foo=bar'
            ),
            array(
                'does not append values if the method is post',
                '<form action="/foo" method="post"><input type="text" name="foo" value="foo" /><input type="submit" /></form>',
                array(),
                '/foo'
            ),
            array(
                'does not append values if the method is patch',
                '<form action="/foo" method="post"><input type="text" name="foo" value="foo" /><input type="submit" /></form>',
                array(),
                '/foo',
                'PUT'
            ),
            array(
                'does not append values if the method is delete',
                '<form action="/foo" method="post"><input type="text" name="foo" value="foo" /><input type="submit" /></form>',
                array(),
                '/foo',
                'DELETE'
            ),
            array(
                'does not append values if the method is put',
                '<form action="/foo" method="post"><input type="text" name="foo" value="foo" /><input type="submit" /></form>',
                array(),
                '/foo',
                'PATCH'
            ),
            array(
                'appends the form values to an existing query string',
                '<form action="/foo?bar=bar"><input type="text" name="foo" value="foo" /><input type="submit" /></form>',
                array(),
                '/foo?bar=bar&foo=foo'
            ),
            array(
                'returns an empty URI if the action is empty',
                '<form><input type="submit" /></form>',
                array(),
                '/',
            ),
            array(
                'appends the form values even if the action is empty',
                '<form><input type="text" name="foo" value="foo" /><input type="submit" /></form>',
                array(),
                '/?foo=foo',
            ),
            array(
                'chooses the path if the action attribute value is a sharp (#)',
                '<form action="#" method="post"><input type="text" name="foo" value="foo" /><input type="submit" /></form>',
                array(),
                '/#',
            ),
        );
    }

    public function testHas()
    {
        $form = $this->createForm('<form method="post"><input type="text" name="bar" value="bar" /><input type="submit" /></form>');

        $this->assertFalse($form->has('foo'), '->has() returns false if a field is not in the form');
        $this->assertTrue($form->has('bar'), '->has() returns true if a field is in the form');
    }

    public function testRemove()
    {
        $form = $this->createForm('<form method="post"><input type="text" name="bar" value="bar" /><input type="submit" /></form>');
        $form->remove('bar');
        $this->assertFalse($form->has('bar'), '->remove() removes a field');
    }

    public function testGet()
    {
        $form = $this->createForm('<form method="post"><input type="text" name="bar" value="bar" /><input type="submit" /></form>');

        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Field\\InputFormField', $form->get('bar'), '->get() returns the field object associated with the given name');

        try {
            $form->get('foo');
            $this->fail('->get() throws an \InvalidArgumentException if the field does not exist');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->get() throws an \InvalidArgumentException if the field does not exist');
        }
    }

    public function testAll()
    {
        $form = $this->createForm('<form method="post"><input type="text" name="bar" value="bar" /><input type="submit" /></form>');

        $fields = $form->all();
        $this->assertCount(1, $fields, '->all() return an array of form field objects');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Field\\InputFormField', $fields['bar'], '->all() return an array of form field objects');
    }

    public function testSubmitWithoutAFormButton()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('
            <html>
                <form>
                    <input type="foo" />
                </form>
            </html>
        ');

        $nodes = $dom->getElementsByTagName('form');
        $form = new Form($nodes->item(0), 'http://example.com');
        $this->assertSame($nodes->item(0), $form->getFormNode(), '->getFormNode() returns the form node associated with this form');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testFormFieldRegistryAddThrowAnExceptionWhenTheNameIsMalformed()
    {
        $registry = new FormFieldRegistry();
        $registry->add($this->getFormFieldMock('[foo]'));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testFormFieldRegistryRemoveThrowAnExceptionWhenTheNameIsMalformed()
    {
        $registry = new FormFieldRegistry();
        $registry->remove('[foo]');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testFormFieldRegistryGetThrowAnExceptionWhenTheNameIsMalformed()
    {
        $registry = new FormFieldRegistry();
        $registry->get('[foo]');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testFormFieldRegistryGetThrowAnExceptionWhenTheFieldDoesNotExist()
    {
        $registry = new FormFieldRegistry();
        $registry->get('foo');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testFormFieldRegistrySetThrowAnExceptionWhenTheNameIsMalformed()
    {
        $registry = new FormFieldRegistry();
        $registry->set('[foo]', null);
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testFormFieldRegistrySetThrowAnExceptionWhenTheFieldDoesNotExist()
    {
        $registry = new FormFieldRegistry();
        $registry->set('foo', null);
    }

    public function testFormFieldRegistryHasReturnsTrueWhenTheFQNExists()
    {
        $registry = new FormFieldRegistry();
        $registry->add($this->getFormFieldMock('foo[bar]'));

        $this->assertTrue($registry->has('foo'));
        $this->assertTrue($registry->has('foo[bar]'));
        $this->assertFalse($registry->has('bar'));
        $this->assertFalse($registry->has('foo[foo]'));
    }

    public function testFormRegistryFieldsCanBeRemoved()
    {
        $registry = new FormFieldRegistry();
        $registry->add($this->getFormFieldMock('foo'));
        $registry->remove('foo');
        $this->assertFalse($registry->has('foo'));
    }

    public function testFormRegistrySupportsMultivaluedFields()
    {
        $registry = new FormFieldRegistry();
        $registry->add($this->getFormFieldMock('foo[]'));
        $registry->add($this->getFormFieldMock('foo[]'));
        $registry->add($this->getFormFieldMock('bar[5]'));
        $registry->add($this->getFormFieldMock('bar[]'));
        $registry->add($this->getFormFieldMock('bar[baz]'));

        $this->assertEquals(
            array('foo[0]', 'foo[1]', 'bar[5]', 'bar[6]', 'bar[baz]'),
            array_keys($registry->all())
        );
    }

    public function testFormRegistrySetValues()
    {
        $registry = new FormFieldRegistry();
        $registry->add($f2 = $this->getFormFieldMock('foo[2]'));
        $registry->add($f3 = $this->getFormFieldMock('foo[3]'));
        $registry->add($fbb = $this->getFormFieldMock('foo[bar][baz]'));

        $f2
            ->expects($this->exactly(2))
            ->method('setValue')
            ->with(2)
        ;

        $f3
            ->expects($this->exactly(2))
            ->method('setValue')
            ->with(3)
        ;

        $fbb
            ->expects($this->exactly(2))
            ->method('setValue')
            ->with('fbb')
        ;

        $registry->set('foo[2]', 2);
        $registry->set('foo[3]', 3);
        $registry->set('foo[bar][baz]', 'fbb');

        $registry->set('foo', array(
            2     => 2,
            3     => 3,
            'bar' => array(
                'baz' => 'fbb'
             )
        ));
    }

    protected function getFormFieldMock($name, $value = null)
    {
        $field = $this
            ->getMockBuilder('Symfony\\Component\\DomCrawler\\Field\\FormField')
            ->setMethods(array('getName', 'getValue', 'setValue', 'initialize'))
            ->disableOriginalConstructor()
            ->getMock()
        ;

        $field
            ->expects($this->any())
            ->method('getName')
            ->will($this->returnValue($name))
        ;

        $field
            ->expects($this->any())
            ->method('getValue')
            ->will($this->returnValue($value))
        ;

        return $field;
    }

    protected function createForm($form, $method = null, $currentUri = null)
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('<html>'.$form.'</html>');

        $nodes = $dom->getElementsByTagName('input');
        $xPath = new \DOMXPath($dom);
        $nodes = $xPath->query('//input | //button');

        if (null === $currentUri) {
            $currentUri = 'http://example.com/';
        }

        return new Form($nodes->item($nodes->length - 1), $currentUri, $method);
    }

    protected function createTestHtml5Form()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('
        <html>
            <h1>Hello form</h1>
            <form id="form-1" action="" method="POST">
                <div><input type="checkbox" name="apples[]" value="1" checked /></div>
                <input form="form_2" type="checkbox" name="oranges[]" value="1" checked />
                <div><label></label><input form="form-1" type="hidden" name="form_name" value="form-1" /></div>
                <input form="form-1" type="submit" name="button_1" value="Capture fields" />
                <button form="form_2" type="submit" name="button_2">Submit form_2</button>
            </form>
            <input form="form-1" type="checkbox" name="apples[]" value="2" checked />
            <form id="form_2" action="" method="POST">
                <div><div><input type="checkbox" name="oranges[]" value="2" checked />
                <input type="checkbox" name="oranges[]" value="3" checked /></div></div>
                <input form="form_2" type="hidden" name="form_name" value="form_2" />
                <input form="form-1" type="hidden" name="outer_field" value="success" />
                <button form="form-1" type="submit" name="button_3">Submit from outside the form</button>
                <div>
                    <label for="app_frontend_form_type_contact_form_type_contactType">Message subject</label>
                    <div>
                        <select name="app_frontend_form_type_contact_form_type[contactType]" id="app_frontend_form_type_contact_form_type_contactType"><option selected="selected" value="">Please select subject</option><option id="1">Test type</option></select>
                    </div>
                </div>
                <div>
                    <label for="app_frontend_form_type_contact_form_type_firstName">Firstname</label>
                    <input type="text" name="app_frontend_form_type_contact_form_type[firstName]" value="John" id="app_frontend_form_type_contact_form_type_firstName"/>
                </div>
            </form>
            <button />
        </html>');

        return $dom;
    }
}
PK7b�\2$�G��Spear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/FormFieldTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Tests\Field;

class FormFieldTestCase extends \PHPUnit_Framework_TestCase
{
    protected function createNode($tag, $value, $attributes = array())
    {
        $document = new \DOMDocument();
        $node = $document->createElement($tag, $value);

        foreach ($attributes as $name => $value) {
            $node->setAttribute($name, $value);
        }

        return $node;
    }
}
PK7b�\���QQTpear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/InputFormFieldTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Tests\Field;

use Symfony\Component\DomCrawler\Field\InputFormField;

class InputFormFieldTest extends FormFieldTestCase
{
    public function testInitialize()
    {
        $node = $this->createNode('input', '', array('type' => 'text', 'name' => 'name', 'value' => 'value'));
        $field = new InputFormField($node);

        $this->assertEquals('value', $field->getValue(), '->initialize() sets the value of the field to the value attribute value');

        $node = $this->createNode('textarea', '');
        try {
            $field = new InputFormField($node);
            $this->fail('->initialize() throws a \LogicException if the node is not an input');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->initialize() throws a \LogicException if the node is not an input');
        }

        $node = $this->createNode('input', '', array('type' => 'checkbox'));
        try {
            $field = new InputFormField($node);
            $this->fail('->initialize() throws a \LogicException if the node is a checkbox');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->initialize() throws a \LogicException if the node is a checkbox');
        }

        $node = $this->createNode('input', '', array('type' => 'file'));
        try {
            $field = new InputFormField($node);
            $this->fail('->initialize() throws a \LogicException if the node is a file');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->initialize() throws a \LogicException if the node is a file');
        }
    }
}
PK8b�\��Ջ==Upear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Tests\Field;

use Symfony\Component\DomCrawler\Field\ChoiceFormField;

class ChoiceFormFieldTest extends FormFieldTestCase
{
    public function testInitialize()
    {
        $node = $this->createNode('textarea', '');
        try {
            $field = new ChoiceFormField($node);
            $this->fail('->initialize() throws a \LogicException if the node is not an input or a select');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->initialize() throws a \LogicException if the node is not an input or a select');
        }

        $node = $this->createNode('input', '', array('type' => 'text'));
        try {
            $field = new ChoiceFormField($node);
            $this->fail('->initialize() throws a \LogicException if the node is an input with a type different from checkbox or radio');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->initialize() throws a \LogicException if the node is an input with a type different from checkbox or radio');
        }
    }

    public function testGetType()
    {
        $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo'));
        $field = new ChoiceFormField($node);

        $this->assertEquals('radio', $field->getType(), '->getType() returns radio for radio buttons');

        $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'value' => 'foo'));
        $field = new ChoiceFormField($node);

        $this->assertEquals('checkbox', $field->getType(), '->getType() returns radio for a checkbox');

        $node = $this->createNode('select', '');
        $field = new ChoiceFormField($node);

        $this->assertEquals('select', $field->getType(), '->getType() returns radio for a select');
    }

    public function testIsMultiple()
    {
        $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo'));
        $field = new ChoiceFormField($node);

        $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for radio buttons');

        $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'value' => 'foo'));
        $field = new ChoiceFormField($node);

        $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for checkboxes');

        $node = $this->createNode('select', '');
        $field = new ChoiceFormField($node);

        $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for selects without the multiple attribute');

        $node = $this->createNode('select', '', array('multiple' => 'multiple'));
        $field = new ChoiceFormField($node);

        $this->assertTrue($field->isMultiple(), '->isMultiple() returns true for selects with the multiple attribute');
    }

    public function testSelects()
    {
        $node = $this->createSelectNode(array('foo' => false, 'bar' => false));
        $field = new ChoiceFormField($node);

        $this->assertTrue($field->hasValue(), '->hasValue() returns true for selects');
        $this->assertEquals('foo', $field->getValue(), '->getValue() returns the first option if none are selected');
        $this->assertFalse($field->isMultiple(), '->isMultiple() returns false when no multiple attribute is defined');

        $node = $this->createSelectNode(array('foo' => false, 'bar' => true));
        $field = new ChoiceFormField($node);

        $this->assertEquals('bar', $field->getValue(), '->getValue() returns the selected option');

        $field->setValue('foo');
        $this->assertEquals('foo', $field->getValue(), '->setValue() changes the selected option');

        try {
            $field->setValue('foobar');
            $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one of the selected options');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one of the selected options');
        }

        try {
            $field->setValue(array('foobar'));
            $this->fail('->setValue() throws an \InvalidArgumentException if the value is an array');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is an array');
        }
    }

    public function testMultipleSelects()
    {
        $node = $this->createSelectNode(array('foo' => false, 'bar' => false), array('multiple' => 'multiple'));
        $field = new ChoiceFormField($node);

        $this->assertEquals(array(), $field->getValue(), '->setValue() returns an empty array if multiple is true and no option is selected');

        $field->setValue('foo');
        $this->assertEquals(array('foo'), $field->getValue(), '->setValue() returns an array of options if multiple is true');

        $field->setValue('bar');
        $this->assertEquals(array('bar'), $field->getValue(), '->setValue() returns an array of options if multiple is true');

        $field->setValue(array('foo', 'bar'));
        $this->assertEquals(array('foo', 'bar'), $field->getValue(), '->setValue() returns an array of options if multiple is true');

        $node = $this->createSelectNode(array('foo' => true, 'bar' => true), array('multiple' => 'multiple'));
        $field = new ChoiceFormField($node);

        $this->assertEquals(array('foo', 'bar'), $field->getValue(), '->getValue() returns the selected options');

        try {
            $field->setValue(array('foobar'));
            $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one of the options');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one of the options');
        }
    }

    public function testRadioButtons()
    {
        $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo'));
        $field = new ChoiceFormField($node);
        $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar'));
        $field->addChoice($node);

        $this->assertFalse($field->hasValue(), '->hasValue() returns false when no radio button is selected');
        $this->assertNull($field->getValue(), '->getValue() returns null if no radio button is selected');
        $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for radio buttons');

        $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo'));
        $field = new ChoiceFormField($node);
        $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar', 'checked' => 'checked'));
        $field->addChoice($node);

        $this->assertTrue($field->hasValue(), '->hasValue() returns true when a radio button is selected');
        $this->assertEquals('bar', $field->getValue(), '->getValue() returns the value attribute of the selected radio button');

        $field->setValue('foo');
        $this->assertEquals('foo', $field->getValue(), '->setValue() changes the selected radio button');

        try {
            $field->setValue('foobar');
            $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one of the radio button values');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one of the radio button values');
        }
    }

    public function testRadioButtonIsDisabled()
    {
        $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo', 'disabled' => 'disabled'));
        $field = new ChoiceFormField($node);
        $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar'));
        $field->addChoice($node);

        $field->select('foo');
        $this->assertEquals('foo', $field->getValue(), '->getValue() returns the value attribute of the selected radio button');
        $this->assertTrue($field->isDisabled());

        $field->select('bar');
        $this->assertEquals('bar', $field->getValue(), '->getValue() returns the value attribute of the selected radio button');
        $this->assertFalse($field->isDisabled());
    }

    public function testCheckboxes()
    {
        $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name'));
        $field = new ChoiceFormField($node);

        $this->assertFalse($field->hasValue(), '->hasValue() returns false when the checkbox is not checked');
        $this->assertNull($field->getValue(), '->getValue() returns null if the checkbox is not checked');
        $this->assertFalse($field->isMultiple(), '->hasValue() returns false for checkboxes');
        try {
            $field->addChoice(new \DOMNode());
            $this->fail('->addChoice() throws a \LogicException for checkboxes');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->initialize() throws a \LogicException for checkboxes');
        }

        $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked'));
        $field = new ChoiceFormField($node);

        $this->assertTrue($field->hasValue(), '->hasValue() returns true when the checkbox is checked');
        $this->assertEquals('1', $field->getValue(), '->getValue() returns 1 if the checkbox is checked and has no value attribute');

        $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked', 'value' => 'foo'));
        $field = new ChoiceFormField($node);

        $this->assertEquals('foo', $field->getValue(), '->getValue() returns the value attribute if the checkbox is checked');

        $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked', 'value' => 'foo'));
        $field = new ChoiceFormField($node);

        $field->setValue(false);
        $this->assertNull($field->getValue(), '->setValue() unchecks the checkbox is value is false');

        $field->setValue(true);
        $this->assertEquals('foo', $field->getValue(), '->setValue() checks the checkbox is value is true');

        try {
            $field->setValue('bar');
            $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one from the value attribute');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one from the value attribute');
        }
    }

    public function testTick()
    {
        $node = $this->createSelectNode(array('foo' => false, 'bar' => false));
        $field = new ChoiceFormField($node);

        try {
            $field->tick();
            $this->fail('->tick() throws a \LogicException for select boxes');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->tick() throws a \LogicException for select boxes');
        }

        $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name'));
        $field = new ChoiceFormField($node);
        $field->tick();
        $this->assertEquals(1, $field->getValue(), '->tick() ticks checkboxes');
    }

    public function testUntick()
    {
        $node = $this->createSelectNode(array('foo' => false, 'bar' => false));
        $field = new ChoiceFormField($node);

        try {
            $field->untick();
            $this->fail('->untick() throws a \LogicException for select boxes');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->untick() throws a \LogicException for select boxes');
        }

        $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked'));
        $field = new ChoiceFormField($node);
        $field->untick();
        $this->assertNull($field->getValue(), '->untick() unticks checkboxes');
    }

    public function testSelect()
    {
        $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked'));
        $field = new ChoiceFormField($node);
        $field->select(true);
        $this->assertEquals(1, $field->getValue(), '->select() changes the value of the field');
        $field->select(false);
        $this->assertNull($field->getValue(), '->select() changes the value of the field');

        $node = $this->createSelectNode(array('foo' => false, 'bar' => false));
        $field = new ChoiceFormField($node);
        $field->select('foo');
        $this->assertEquals('foo', $field->getValue(), '->select() changes the selected option');
    }

    public function testOptionWithNoValue()
    {
        $node = $this->createSelectNodeWithEmptyOption(array('foo' => false, 'bar' => false));
        $field = new ChoiceFormField($node);
        $field->select('foo');
        $this->assertEquals('foo', $field->getValue(), '->select() changes the selected option');
    }

    public function testDisableValidation()
    {
        $node = $this->createSelectNode(array('foo' => false, 'bar' => false));
        $field = new ChoiceFormField($node);
        $field->disableValidation();
        $field->setValue('foobar');
        $this->assertEquals('foobar', $field->getValue(), '->disableValidation() allows to set a value which is not in the selected options.');

        $node = $this->createSelectNode(array('foo' => false, 'bar' => false), array('multiple' => 'multiple'));
        $field = new ChoiceFormField($node);
        $field->disableValidation();
        $field->setValue(array('foobar'));
        $this->assertEquals(array('foobar'), $field->getValue(), '->disableValidation() allows to set a value which is not in the selected options.');
    }

    protected function createSelectNode($options, $attributes = array())
    {
        $document = new \DOMDocument();
        $node = $document->createElement('select');

        foreach ($attributes as $name => $value) {
            $node->setAttribute($name, $value);
        }
        $node->setAttribute('name', 'name');

        foreach ($options as $value => $selected) {
            $option = $document->createElement('option', $value);
            $option->setAttribute('value', $value);
            if ($selected) {
                $option->setAttribute('selected', 'selected');
            }
            $node->appendChild($option);
        }

        return $node;
    }

    protected function createSelectNodeWithEmptyOption($options, $attributes = array())
    {
        $document = new \DOMDocument();
        $node = $document->createElement('select');

        foreach ($attributes as $name => $value) {
            $node->setAttribute($name, $value);
        }
        $node->setAttribute('name', 'name');

        foreach ($options as $value => $selected) {
            $option = $document->createElement('option', $value);
            if ($selected) {
                $option->setAttribute('selected', 'selected');
            }
            $node->appendChild($option);
        }

        return $node;
    }
}
PK8b�\�!
D��Opear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/FormFieldTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Tests\Field;

use Symfony\Component\DomCrawler\Field\InputFormField;

class FormFieldTest extends FormFieldTestCase
{
    public function testGetName()
    {
        $node = $this->createNode('input', '', array('type' => 'text', 'name' => 'name', 'value' => 'value'));
        $field = new InputFormField($node);

        $this->assertEquals('name', $field->getName(), '->getName() returns the name of the field');
    }

    public function testGetSetHasValue()
    {
        $node = $this->createNode('input', '', array('type' => 'text', 'name' => 'name', 'value' => 'value'));
        $field = new InputFormField($node);

        $this->assertEquals('value', $field->getValue(), '->getValue() returns the value of the field');

        $field->setValue('foo');
        $this->assertEquals('foo', $field->getValue(), '->setValue() sets the value of the field');

        $this->assertTrue($field->hasValue(), '->hasValue() always returns true');
    }
}
PK8b�\�5�||Spear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/FileFormFieldTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Tests\Field;

use Symfony\Component\DomCrawler\Field\FileFormField;

class FileFormFieldTest extends FormFieldTestCase
{
    public function testInitialize()
    {
        $node = $this->createNode('input', '', array('type' => 'file'));
        $field = new FileFormField($node);

        $this->assertEquals(array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => UPLOAD_ERR_NO_FILE, 'size' => 0), $field->getValue(), '->initialize() sets the value of the field to no file uploaded');

        $node = $this->createNode('textarea', '');
        try {
            $field = new FileFormField($node);
            $this->fail('->initialize() throws a \LogicException if the node is not an input field');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->initialize() throws a \LogicException if the node is not an input field');
        }

        $node = $this->createNode('input', '', array('type' => 'text'));
        try {
            $field = new FileFormField($node);
            $this->fail('->initialize() throws a \LogicException if the node is not a file input field');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->initialize() throws a \LogicException if the node is not a file input field');
        }
    }

    /**
     * @dataProvider getSetValueMethods
     */
    public function testSetValue($method)
    {
        $node = $this->createNode('input', '', array('type' => 'file'));
        $field = new FileFormField($node);

        $field->$method(null);
        $this->assertEquals(array('name' => '', 'type' => '', 'tmp_name' => '', 'error' => UPLOAD_ERR_NO_FILE, 'size' => 0), $field->getValue(), "->$method() clears the uploaded file if the value is null");

        $field->$method(__FILE__);
        $value = $field->getValue();

        $this->assertEquals(basename(__FILE__), $value['name'], "->$method() sets the name of the file field");
        $this->assertEquals('', $value['type'], "->$method() sets the type of the file field");
        $this->assertInternalType('string', $value['tmp_name'], "->$method() sets the tmp_name of the file field");
        $this->assertFileExists($value['tmp_name'], "->$method() creates a copy of the file at the tmp_name path");
        $this->assertEquals(0, $value['error'], "->$method() sets the error of the file field");
        $this->assertEquals(filesize(__FILE__), $value['size'], "->$method() sets the size of the file field");

        $origInfo = pathinfo(__FILE__);
        $tmpInfo = pathinfo($value['tmp_name']);
        $this->assertEquals(
            $origInfo['extension'],
            $tmpInfo['extension'],
            "->$method() keeps the same file extension in the tmp_name copy"
        );

        $field->$method(__DIR__.'/../Fixtures/no-extension');
        $value = $field->getValue();

        $this->assertArrayNotHasKey(
            'extension',
            pathinfo($value['tmp_name']),
            "->$method() does not add a file extension in the tmp_name copy"
        );
    }

    public function getSetValueMethods()
    {
        return array(
            array('setValue'),
            array('upload'),
        );
    }

    public function testSetErrorCode()
    {
        $node = $this->createNode('input', '', array('type' => 'file'));
        $field = new FileFormField($node);

        $field->setErrorCode(UPLOAD_ERR_FORM_SIZE);
        $value = $field->getValue();
        $this->assertEquals(UPLOAD_ERR_FORM_SIZE, $value['error'], '->setErrorCode() sets the file input field error code');

        try {
            $field->setErrorCode('foobar');
            $this->fail('->setErrorCode() throws a \InvalidArgumentException if the error code is not valid');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->setErrorCode() throws a \InvalidArgumentException if the error code is not valid');
        }
    }

    public function testSetRawFilePath()
    {
        $node = $this->createNode('input', '', array('type' => 'file'));
        $field = new FileFormField($node);
        $field->setFilePath(__FILE__);

        $this->assertEquals(__FILE__, $field->getValue());
    }

}
PK8b�\�n���Wpear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Field/TextareaFormFieldTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Tests\Field;

use Symfony\Component\DomCrawler\Field\TextareaFormField;

class TextareaFormFieldTest extends FormFieldTestCase
{
    public function testInitialize()
    {
        $node = $this->createNode('textarea', 'foo bar');
        $field = new TextareaFormField($node);

        $this->assertEquals('foo bar', $field->getValue(), '->initialize() sets the value of the field to the textarea node value');

        $node = $this->createNode('input', '');
        try {
            $field = new TextareaFormField($node);
            $this->fail('->initialize() throws a \LogicException if the node is not a textarea');
        } catch (\LogicException $e) {
            $this->assertTrue(true, '->initialize() throws a \LogicException if the node is not a textarea');
        }

        // Ensure that valid HTML can be used on a textarea.
        $node = $this->createNode('textarea', 'foo bar <h1>Baz</h1>');
        $field = new TextareaFormField($node);

        $this->assertEquals('foo bar <h1>Baz</h1>', $field->getValue(), '->initialize() sets the value of the field to the textarea node value');

        // Ensure that we don't do any DOM manipulation/validation by passing in
        // "invalid" HTML.
        $node = $this->createNode('textarea', 'foo bar <h1>Baz</h2>');
        $field = new TextareaFormField($node);

        $this->assertEquals('foo bar <h1>Baz</h2>', $field->getValue(), '->initialize() sets the value of the field to the textarea node value');
    }
}
PK9b�\l�#8��Gpear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/CrawlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Tests;

use Symfony\Component\CssSelector\CssSelector;
use Symfony\Component\DomCrawler\Crawler;

class CrawlerTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $crawler = new Crawler();
        $this->assertCount(0, $crawler, '__construct() returns an empty crawler');

        $crawler = new Crawler(new \DOMNode());
        $this->assertCount(1, $crawler, '__construct() takes a node as a first argument');
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::add
     */
    public function testAdd()
    {
        $crawler = new Crawler();
        $crawler->add($this->createDomDocument());
        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->add() adds nodes from a \DOMDocument');

        $crawler = new Crawler();
        $crawler->add($this->createNodeList());
        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->add() adds nodes from a \DOMNodeList');

        foreach ($this->createNodeList() as $node) {
            $list[] = $node;
        }
        $crawler = new Crawler();
        $crawler->add($list);
        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->add() adds nodes from an array of nodes');

        $crawler = new Crawler();
        $crawler->add($this->createNodeList()->item(0));
        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->add() adds nodes from an \DOMNode');

        $crawler = new Crawler();
        $crawler->add('<html><body>Foo</body></html>');
        $this->assertEquals('Foo', $crawler->filterXPath('//body')->text(), '->add() adds nodes from a string');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testAddInvalidNode()
    {
        $crawler = new Crawler();
        $crawler->add(1);
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addHtmlContent
     */
    public function testAddHtmlContent()
    {
        $crawler = new Crawler();
        $crawler->addHtmlContent('<html><div class="foo"></html>', 'UTF-8');

        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addHtmlContent() adds nodes from an HTML string');

        $crawler->addHtmlContent('<html><head><base href="http://symfony.com"></head><a href="/contact"></a></html>', 'UTF-8');

        $this->assertEquals('http://symfony.com', $crawler->filterXPath('//base')->attr('href'), '->addHtmlContent() adds nodes from an HTML string');
        $this->assertEquals('http://symfony.com/contact', $crawler->filterXPath('//a')->link()->getUri(), '->addHtmlContent() adds nodes from an HTML string');
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addHtmlContent
     */
    public function testAddHtmlContentCharset()
    {
        $crawler = new Crawler();
        $crawler->addHtmlContent('<html><div class="foo">Tiếng Việt</html>', 'UTF-8');

        $this->assertEquals('Tiếng Việt', $crawler->filterXPath('//div')->text());
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addHtmlContent
     */
    public function testAddHtmlContentInvalidBaseTag()
    {
        $crawler = new Crawler(null, 'http://symfony.com');

        $crawler->addHtmlContent('<html><head><base target="_top"></head><a href="/contact"></a></html>', 'UTF-8');

        $this->assertEquals('http://symfony.com/contact', current($crawler->filterXPath('//a')->links())->getUri(), '->addHtmlContent() correctly handles a non-existent base tag href attribute');
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addHtmlContent
     */
    public function testAddHtmlContentUnsupportedCharset()
    {
        $crawler = new Crawler();
        $crawler->addHtmlContent(file_get_contents(__DIR__.'/Fixtures/windows-1250.html'), 'Windows-1250');

        $this->assertEquals('Žťčýů', $crawler->filterXPath('//p')->text());
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addHtmlContent
     */
    public function testAddHtmlContentCharsetGbk()
    {
        $crawler = new Crawler();
        //gbk encode of <html><p>中文</p></html>
        $crawler->addHtmlContent(base64_decode('PGh0bWw+PHA+1tDOxDwvcD48L2h0bWw+'), 'gbk');

        $this->assertEquals('中文', $crawler->filterXPath('//p')->text());
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addHtmlContent
     */
    public function testAddHtmlContentWithErrors()
    {
        $internalErrors = libxml_use_internal_errors(true);

        $crawler = new Crawler();
        $crawler->addHtmlContent(<<<EOF
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <nav><a href="#"><a href="#"></nav>
    </body>
</html>
EOF
        , 'UTF-8');

        $errors = libxml_get_errors();
        $this->assertCount(1, $errors);
        $this->assertEquals("Tag nav invalid\n", $errors[0]->message);

        libxml_clear_errors();
        libxml_use_internal_errors($internalErrors);
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addXmlContent
     */
    public function testAddXmlContent()
    {
        $crawler = new Crawler();
        $crawler->addXmlContent('<html><div class="foo"></div></html>', 'UTF-8');

        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addXmlContent() adds nodes from an XML string');
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addXmlContent
     */
    public function testAddXmlContentCharset()
    {
        $crawler = new Crawler();
        $crawler->addXmlContent('<html><div class="foo">Tiếng Việt</div></html>', 'UTF-8');

        $this->assertEquals('Tiếng Việt', $crawler->filterXPath('//div')->text());
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addXmlContent
     */
    public function testAddXmlContentWithErrors()
    {
        $internalErrors = libxml_use_internal_errors(true);

        $crawler = new Crawler();
        $crawler->addXmlContent(<<<EOF
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <nav><a href="#"><a href="#"></nav>
    </body>
</html>
EOF
        , 'UTF-8');

        $this->assertTrue(count(libxml_get_errors()) > 1);

        libxml_clear_errors();
        libxml_use_internal_errors($internalErrors);
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addContent
     */
    public function testAddContent()
    {
        $crawler = new Crawler();
        $crawler->addContent('<html><div class="foo"></html>', 'text/html; charset=UTF-8');
        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addContent() adds nodes from an HTML string');

        $crawler = new Crawler();
        $crawler->addContent('<html><div class="foo"></html>', 'text/html; charset=UTF-8; dir=RTL');
        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addContent() adds nodes from an HTML string with extended content type');

        $crawler = new Crawler();
        $crawler->addContent('<html><div class="foo"></html>');
        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addContent() uses text/html as the default type');

        $crawler = new Crawler();
        $crawler->addContent('<html><div class="foo"></div></html>', 'text/xml; charset=UTF-8');
        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addContent() adds nodes from an XML string');

        $crawler = new Crawler();
        $crawler->addContent('<html><div class="foo"></div></html>', 'text/xml');
        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addContent() adds nodes from an XML string');

        $crawler = new Crawler();
        $crawler->addContent('foo bar', 'text/plain');
        $this->assertCount(0, $crawler, '->addContent() does nothing if the type is not (x|ht)ml');

        $crawler = new Crawler();
        $crawler->addContent('<html><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><span>中文</span></html>');
        $this->assertEquals('中文', $crawler->filterXPath('//span')->text(), '->addContent() guess wrong charset');
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addDocument
     */
    public function testAddDocument()
    {
        $crawler = new Crawler();
        $crawler->addDocument($this->createDomDocument());

        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addDocument() adds nodes from a \DOMDocument');
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addNodeList
     */
    public function testAddNodeList()
    {
        $crawler = new Crawler();
        $crawler->addNodeList($this->createNodeList());

        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addNodeList() adds nodes from a \DOMNodeList');
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addNodes
     */
    public function testAddNodes()
    {
        foreach ($this->createNodeList() as $node) {
            $list[] = $node;
        }

        $crawler = new Crawler();
        $crawler->addNodes($list);

        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addNodes() adds nodes from an array of nodes');
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::addNode
     */
    public function testAddNode()
    {
        $crawler = new Crawler();
        $crawler->addNode($this->createNodeList()->item(0));

        $this->assertEquals('foo', $crawler->filterXPath('//div')->attr('class'), '->addNode() adds nodes from an \DOMNode');
    }

    public function testClear()
    {
        $crawler = new Crawler(new \DOMNode());
        $crawler->clear();
        $this->assertCount(0, $crawler, '->clear() removes all the nodes from the crawler');
    }

    public function testEq()
    {
        $crawler = $this->createTestCrawler()->filterXPath('//li');
        $this->assertNotSame($crawler, $crawler->eq(0), '->eq() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->eq() returns a new instance of a crawler');

        $this->assertEquals('Two', $crawler->eq(1)->text(), '->eq() returns the nth node of the list');
        $this->assertCount(0, $crawler->eq(100), '->eq() returns an empty crawler if the nth node does not exist');
    }

    public function testEach()
    {
        $data = $this->createTestCrawler()->filterXPath('//ul[1]/li')->each(function ($node, $i) {
            return $i.'-'.$node->text();
        });

        $this->assertEquals(array('0-One', '1-Two', '2-Three'), $data, '->each() executes an anonymous function on each node of the list');
    }

    public function testReduce()
    {
        $crawler = $this->createTestCrawler()->filterXPath('//ul[1]/li');
        $nodes = $crawler->reduce(function ($node, $i) {
            return $i == 1 ? false : true;
        });
        $this->assertNotSame($nodes, $crawler, '->reduce() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $nodes, '->reduce() returns a new instance of a crawler');

        $this->assertCount(2, $nodes, '->reduce() filters the nodes in the list');
    }

    public function testAttr()
    {
        $this->assertEquals('first', $this->createTestCrawler()->filterXPath('//li')->attr('class'), '->attr() returns the attribute of the first element of the node list');

        try {
            $this->createTestCrawler()->filterXPath('//ol')->attr('class');
            $this->fail('->attr() throws an \InvalidArgumentException if the node list is empty');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->attr() throws an \InvalidArgumentException if the node list is empty');
        }
    }

    public function testMissingAttrValueIsNull()
    {
        $crawler = new Crawler();
        $crawler->addContent('<html><div non-empty-attr="sample value" empty-attr=""></div></html>', 'text/html; charset=UTF-8');
        $div = $crawler->filterXPath('//div');

        $this->assertEquals('sample value', $div->attr('non-empty-attr'), '->attr() reads non-empty attributes correctly');
        $this->assertEquals('', $div->attr('empty-attr'), '->attr() reads empty attributes correctly');
        $this->assertNull($div->attr('missing-attr'), '->attr() reads missing attributes correctly');
    }

    public function testText()
    {
        $this->assertEquals('One', $this->createTestCrawler()->filterXPath('//li')->text(), '->text() returns the node value of the first element of the node list');

        try {
            $this->createTestCrawler()->filterXPath('//ol')->text();
            $this->fail('->text() throws an \InvalidArgumentException if the node list is empty');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->text() throws an \InvalidArgumentException if the node list is empty');
        }
    }

    public function testHtml()
    {
        $this->assertEquals('<img alt="Bar">', $this->createTestCrawler()->filterXPath('//a[5]')->html());
        $this->assertEquals('<input type="text" value="TextValue" name="TextName"><input type="submit" value="FooValue" name="FooName" id="FooId"><input type="button" value="BarValue" name="BarName" id="BarId"><button value="ButtonValue" name="ButtonName" id="ButtonId"></button>'
            , trim($this->createTestCrawler()->filterXPath('//form[@id="FooFormId"]')->html()));

        try {
            $this->createTestCrawler()->filterXPath('//ol')->html();
            $this->fail('->html() throws an \InvalidArgumentException if the node list is empty');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->html() throws an \InvalidArgumentException if the node list is empty');
        }
    }

    public function testExtract()
    {
        $crawler = $this->createTestCrawler()->filterXPath('//ul[1]/li');

        $this->assertEquals(array('One', 'Two', 'Three'), $crawler->extract('_text'), '->extract() returns an array of extracted data from the node list');
        $this->assertEquals(array(array('One', 'first'), array('Two', ''), array('Three', '')), $crawler->extract(array('_text', 'class')), '->extract() returns an array of extracted data from the node list');

        $this->assertEquals(array(), $this->createTestCrawler()->filterXPath('//ol')->extract('_text'), '->extract() returns an empty array if the node list is empty');
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::filterXPath
     */
    public function testFilterXPath()
    {
        $crawler = $this->createTestCrawler();
        $this->assertNotSame($crawler, $crawler->filterXPath('//li'), '->filterXPath() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->filterXPath() returns a new instance of a crawler');

        $crawler = $this->createTestCrawler()->filterXPath('//ul');

        $this->assertCount(6, $crawler->filterXPath('//li'), '->filterXPath() filters the node list with the XPath expression');
    }

    public function testFilterXPathWithDefaultNamespace()
    {
        $crawler = $this->createTestXmlCrawler()->filterXPath('//default:entry/default:id');
        $this->assertCount(1, $crawler, '->filterXPath() automatically registers a namespace');
        $this->assertSame('tag:youtube.com,2008:video:kgZRZmEc9j4', $crawler->text());
    }

    public function testFilterXPathWithCustomDefaultNamespace()
    {
        $crawler = $this->createTestXmlCrawler();
        $crawler->setDefaultNamespacePrefix('x');
        $crawler = $crawler->filterXPath('//x:entry/x:id');

        $this->assertCount(1, $crawler, '->filterXPath() lets to override the default namespace prefix');
        $this->assertSame('tag:youtube.com,2008:video:kgZRZmEc9j4', $crawler->text());
    }

    public function testFilterXPathWithNamespace()
    {
        $crawler = $this->createTestXmlCrawler()->filterXPath('//yt:accessControl');
        $this->assertCount(2, $crawler, '->filterXPath() automatically registers a namespace');
    }

    public function testFilterXPathWithMultipleNamespaces()
    {
        $crawler = $this->createTestXmlCrawler()->filterXPath('//media:group/yt:aspectRatio');
        $this->assertCount(1, $crawler, '->filterXPath() automatically registers multiple namespaces');
        $this->assertSame('widescreen', $crawler->text());
    }

    public function testFilterXPathWithManuallyRegisteredNamespace()
    {
        $crawler = $this->createTestXmlCrawler();
        $crawler->registerNamespace('m', 'http://search.yahoo.com/mrss/');

        $crawler = $crawler->filterXPath('//m:group/yt:aspectRatio');
        $this->assertCount(1, $crawler, '->filterXPath() uses manually registered namespace');
        $this->assertSame('widescreen', $crawler->text());
    }

    public function testFilterXPathWithAnUrl()
    {
        $crawler = $this->createTestXmlCrawler();

        $crawler = $crawler->filterXPath('//media:category[@scheme="http://gdata.youtube.com/schemas/2007/categories.cat"]');
        $this->assertCount(1, $crawler);
        $this->assertSame('Music', $crawler->text());
    }

    /**
     * @covers Symfony\Component\DomCrawler\Crawler::filter
     */
    public function testFilter()
    {
        $crawler = $this->createTestCrawler();
        $this->assertNotSame($crawler, $crawler->filter('li'), '->filter() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->filter() returns a new instance of a crawler');

        $crawler = $this->createTestCrawler()->filter('ul');

        $this->assertCount(6, $crawler->filter('li'), '->filter() filters the node list with the CSS selector');
    }

    public function testFilterWithDefaultNamespace()
    {
        $crawler = $this->createTestXmlCrawler()->filter('default|entry default|id');
        $this->assertCount(1, $crawler, '->filter() automatically registers namespaces');
        $this->assertSame('tag:youtube.com,2008:video:kgZRZmEc9j4', $crawler->text());
    }

    public function testFilterWithNamespace()
    {
        CssSelector::disableHtmlExtension();

        $crawler = $this->createTestXmlCrawler()->filter('yt|accessControl');
        $this->assertCount(2, $crawler, '->filter() automatically registers namespaces');
    }

    public function testFilterWithMultipleNamespaces()
    {
        CssSelector::disableHtmlExtension();

        $crawler = $this->createTestXmlCrawler()->filter('media|group yt|aspectRatio');
        $this->assertCount(1, $crawler, '->filter() automatically registers namespaces');
        $this->assertSame('widescreen', $crawler->text());
    }

    public function testFilterWithDefaultNamespaceOnly()
    {
        $crawler = new Crawler('<?xml version="1.0" encoding="UTF-8"?>
            <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
                <url>
                    <loc>http://localhost/foo</loc>
                    <changefreq>weekly</changefreq>
                    <priority>0.5</priority>
                    <lastmod>2012-11-16</lastmod>
               </url>
               <url>
                    <loc>http://localhost/bar</loc>
                    <changefreq>weekly</changefreq>
                    <priority>0.5</priority>
                    <lastmod>2012-11-16</lastmod>
                </url>
            </urlset>
        ');

        $this->assertEquals(2, $crawler->filter('url')->count());
    }

    public function testSelectLink()
    {
        $crawler = $this->createTestCrawler();
        $this->assertNotSame($crawler, $crawler->selectLink('Foo'), '->selectLink() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->selectLink() returns a new instance of a crawler');

        $this->assertCount(1, $crawler->selectLink('Fabien\'s Foo'), '->selectLink() selects links by the node values');
        $this->assertCount(1, $crawler->selectLink('Fabien\'s Bar'), '->selectLink() selects links by the alt attribute of a clickable image');

        $this->assertCount(2, $crawler->selectLink('Fabien"s Foo'), '->selectLink() selects links by the node values');
        $this->assertCount(2, $crawler->selectLink('Fabien"s Bar'), '->selectLink() selects links by the alt attribute of a clickable image');

        $this->assertCount(1, $crawler->selectLink('\' Fabien"s Foo'), '->selectLink() selects links by the node values');
        $this->assertCount(1, $crawler->selectLink('\' Fabien"s Bar'), '->selectLink() selects links by the alt attribute of a clickable image');

        $this->assertCount(4, $crawler->selectLink('Foo'), '->selectLink() selects links by the node values');
        $this->assertCount(4, $crawler->selectLink('Bar'), '->selectLink() selects links by the node values');
    }

    public function testSelectButton()
    {
        $crawler = $this->createTestCrawler();
        $this->assertNotSame($crawler, $crawler->selectButton('FooValue'), '->selectButton() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->selectButton() returns a new instance of a crawler');

        $this->assertEquals(1, $crawler->selectButton('FooValue')->count(), '->selectButton() selects buttons');
        $this->assertEquals(1, $crawler->selectButton('FooName')->count(), '->selectButton() selects buttons');
        $this->assertEquals(1, $crawler->selectButton('FooId')->count(), '->selectButton() selects buttons');

        $this->assertEquals(1, $crawler->selectButton('BarValue')->count(), '->selectButton() selects buttons');
        $this->assertEquals(1, $crawler->selectButton('BarName')->count(), '->selectButton() selects buttons');
        $this->assertEquals(1, $crawler->selectButton('BarId')->count(), '->selectButton() selects buttons');

        $this->assertEquals(1, $crawler->selectButton('FooBarValue')->count(), '->selectButton() selects buttons with form attribute too');
        $this->assertEquals(1, $crawler->selectButton('FooBarName')->count(), '->selectButton() selects buttons with form attribute too');
    }

    public function testLink()
    {
        $crawler = $this->createTestCrawler('http://example.com/bar/')->selectLink('Foo');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Link', $crawler->link(), '->link() returns a Link instance');

        $this->assertEquals('POST', $crawler->link('post')->getMethod(), '->link() takes a method as its argument');

        $crawler = $this->createTestCrawler('http://example.com/bar')->selectLink('GetLink');
        $this->assertEquals('http://example.com/bar?get=param', $crawler->link()->getUri(), '->link() returns a Link instance');

        try {
            $this->createTestCrawler()->filterXPath('//ol')->link();
            $this->fail('->link() throws an \InvalidArgumentException if the node list is empty');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->link() throws an \InvalidArgumentException if the node list is empty');
        }
    }

    public function testLinks()
    {
        $crawler = $this->createTestCrawler('http://example.com/bar/')->selectLink('Foo');
        $this->assertInternalType('array', $crawler->links(), '->links() returns an array');

        $this->assertCount(4, $crawler->links(), '->links() returns an array');
        $links = $crawler->links();
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Link', $links[0], '->links() returns an array of Link instances');

        $this->assertEquals(array(), $this->createTestCrawler()->filterXPath('//ol')->links(), '->links() returns an empty array if the node selection is empty');
    }

    public function testForm()
    {
        $testCrawler = $this->createTestCrawler('http://example.com/bar/');
        $crawler = $testCrawler->selectButton('FooValue');
        $crawler2 = $testCrawler->selectButton('FooBarValue');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Form', $crawler->form(), '->form() returns a Form instance');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Form', $crawler2->form(), '->form() returns a Form instance');

        $this->assertEquals($crawler->form()->getFormNode()->getAttribute('id'), $crawler2->form()->getFormNode()->getAttribute('id'), '->form() works on elements with form attribute');

        $this->assertEquals(array('FooName' => 'FooBar', 'TextName' => 'TextValue', 'FooTextName' => 'FooTextValue'), $crawler->form(array('FooName' => 'FooBar'))->getValues(), '->form() takes an array of values to submit as its first argument');
        $this->assertEquals(array('FooName' => 'FooValue', 'TextName' => 'TextValue', 'FooTextName' => 'FooTextValue'), $crawler->form()->getValues(), '->getValues() returns correct form values');
        $this->assertEquals(array('FooBarName' => 'FooBarValue', 'TextName' => 'TextValue', 'FooTextName' => 'FooTextValue'), $crawler2->form()->getValues(), '->getValues() returns correct form values');

        try {
            $this->createTestCrawler()->filterXPath('//ol')->form();
            $this->fail('->form() throws an \InvalidArgumentException if the node list is empty');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->form() throws an \InvalidArgumentException if the node list is empty');
        }
    }

    public function testLast()
    {
        $crawler = $this->createTestCrawler()->filterXPath('//ul[1]/li');
        $this->assertNotSame($crawler, $crawler->last(), '->last() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->last() returns a new instance of a crawler');

        $this->assertEquals('Three', $crawler->last()->text());
    }

    public function testFirst()
    {
        $crawler = $this->createTestCrawler()->filterXPath('//li');
        $this->assertNotSame($crawler, $crawler->first(), '->first() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->first() returns a new instance of a crawler');

        $this->assertEquals('One', $crawler->first()->text());
    }

    public function testSiblings()
    {
        $crawler = $this->createTestCrawler()->filterXPath('//li')->eq(1);
        $this->assertNotSame($crawler, $crawler->siblings(), '->siblings() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->siblings() returns a new instance of a crawler');

        $nodes = $crawler->siblings();
        $this->assertEquals(2, $nodes->count());
        $this->assertEquals('One', $nodes->eq(0)->text());
        $this->assertEquals('Three', $nodes->eq(1)->text());

        $nodes = $this->createTestCrawler()->filterXPath('//li')->eq(0)->siblings();
        $this->assertEquals(2, $nodes->count());
        $this->assertEquals('Two', $nodes->eq(0)->text());
        $this->assertEquals('Three', $nodes->eq(1)->text());

        try {
            $this->createTestCrawler()->filterXPath('//ol')->siblings();
            $this->fail('->siblings() throws an \InvalidArgumentException if the node list is empty');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->siblings() throws an \InvalidArgumentException if the node list is empty');
        }
    }

    public function testNextAll()
    {
        $crawler = $this->createTestCrawler()->filterXPath('//li')->eq(1);
        $this->assertNotSame($crawler, $crawler->nextAll(), '->nextAll() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->nextAll() returns a new instance of a crawler');

        $nodes = $crawler->nextAll();
        $this->assertEquals(1, $nodes->count());
        $this->assertEquals('Three', $nodes->eq(0)->text());

        try {
            $this->createTestCrawler()->filterXPath('//ol')->nextAll();
            $this->fail('->nextAll() throws an \InvalidArgumentException if the node list is empty');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->nextAll() throws an \InvalidArgumentException if the node list is empty');
        }
    }

    public function testPreviousAll()
    {
        $crawler = $this->createTestCrawler()->filterXPath('//li')->eq(2);
        $this->assertNotSame($crawler, $crawler->previousAll(), '->previousAll() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->previousAll() returns a new instance of a crawler');

        $nodes = $crawler->previousAll();
        $this->assertEquals(2, $nodes->count());
        $this->assertEquals('Two', $nodes->eq(0)->text());

        try {
            $this->createTestCrawler()->filterXPath('//ol')->previousAll();
            $this->fail('->previousAll() throws an \InvalidArgumentException if the node list is empty');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->previousAll() throws an \InvalidArgumentException if the node list is empty');
        }
    }

    public function testChildren()
    {
        $crawler = $this->createTestCrawler()->filterXPath('//ul');
        $this->assertNotSame($crawler, $crawler->children(), '->children() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->children() returns a new instance of a crawler');

        $nodes = $crawler->children();
        $this->assertEquals(3, $nodes->count());
        $this->assertEquals('One', $nodes->eq(0)->text());
        $this->assertEquals('Two', $nodes->eq(1)->text());
        $this->assertEquals('Three', $nodes->eq(2)->text());

        try {
            $this->createTestCrawler()->filterXPath('//ol')->children();
            $this->fail('->children() throws an \InvalidArgumentException if the node list is empty');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->children() throws an \InvalidArgumentException if the node list is empty');
        }

        try {
            $crawler = new Crawler('<p></p>');
            $crawler->filter('p')->children();
            $this->assertTrue(true, '->children() does not trigger a notice if the node has no children');
        } catch (\PHPUnit_Framework_Error_Notice $e) {
            $this->fail('->children() does not trigger a notice if the node has no children');
        }
    }

    public function testParents()
    {
        $crawler = $this->createTestCrawler()->filterXPath('//li[1]');
        $this->assertNotSame($crawler, $crawler->parents(), '->parents() returns a new instance of a crawler');
        $this->assertInstanceOf('Symfony\\Component\\DomCrawler\\Crawler', $crawler, '->parents() returns a new instance of a crawler');

        $nodes = $crawler->parents();
        $this->assertEquals(3, $nodes->count());

        $nodes = $this->createTestCrawler()->filterXPath('//html')->parents();
        $this->assertEquals(0, $nodes->count());

        try {
            $this->createTestCrawler()->filterXPath('//ol')->parents();
            $this->fail('->parents() throws an \InvalidArgumentException if the node list is empty');
        } catch (\InvalidArgumentException $e) {
            $this->assertTrue(true, '->parents() throws an \InvalidArgumentException if the node list is empty');
        }
    }

    public function testBaseTag()
    {
        $crawler = new Crawler('<html><base href="http://base.com"><a href="link"></a></html>');
        $this->assertEquals('http://base.com/link', $crawler->filterXPath('//a')->link()->getUri());

        $crawler = new Crawler('<html><base href="//base.com"><a href="link"></a></html>', 'https://domain.com');
        $this->assertEquals('https://base.com/link', $crawler->filterXPath('//a')->link()->getUri(), '<base> tag can use a schema-less URL');

        $crawler = new Crawler('<html><base href="path/"><a href="link"></a></html>', 'https://domain.com');
        $this->assertEquals('https://domain.com/path/link', $crawler->filterXPath('//a')->link()->getUri(), '<base> tag can set a path');
    }

    public function createTestCrawler($uri = null)
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('
            <html>
                <body>
                    <a href="foo">Foo</a>
                    <a href="/foo">   Fabien\'s Foo   </a>
                    <a href="/foo">Fabien"s Foo</a>
                    <a href="/foo">\' Fabien"s Foo</a>

                    <a href="/bar"><img alt="Bar"/></a>
                    <a href="/bar"><img alt="   Fabien\'s Bar   "/></a>
                    <a href="/bar"><img alt="Fabien&quot;s Bar"/></a>
                    <a href="/bar"><img alt="\' Fabien&quot;s Bar"/></a>

                    <a href="?get=param">GetLink</a>

                    <form action="foo" id="FooFormId">
                        <input type="text" value="TextValue" name="TextName" />
                        <input type="submit" value="FooValue" name="FooName" id="FooId" />
                        <input type="button" value="BarValue" name="BarName" id="BarId" />
                        <button value="ButtonValue" name="ButtonName" id="ButtonId" />
                    </form>

                    <input type="submit" value="FooBarValue" name="FooBarName" form="FooFormId" />
                    <input type="text" value="FooTextValue" name="FooTextName" form="FooFormId" />

                    <ul class="first">
                        <li class="first">One</li>
                        <li>Two</li>
                        <li>Three</li>
                    </ul>
                    <ul>
                        <li>One Bis</li>
                        <li>Two Bis</li>
                        <li>Three Bis</li>
                    </ul>
                </body>
            </html>
        ');

        return new Crawler($dom, $uri);
    }

    protected function createTestXmlCrawler($uri = null)
    {
        $xml = '<?xml version="1.0" encoding="UTF-8"?>
            <entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007">
                <id>tag:youtube.com,2008:video:kgZRZmEc9j4</id>
                <yt:accessControl action="comment" permission="allowed"/>
                <yt:accessControl action="videoRespond" permission="moderated"/>
                <media:group>
                    <media:title type="plain">Chordates - CrashCourse Biology #24</media:title>
                    <yt:aspectRatio>widescreen</yt:aspectRatio>
                </media:group>
                <media:category label="Music" scheme="http://gdata.youtube.com/schemas/2007/categories.cat">Music</media:category>
            </entry>';

        return new Crawler($xml, $uri);
    }

    protected function createDomDocument()
    {
        $dom = new \DOMDocument();
        $dom->loadXML('<html><div class="foo"></div></html>');

        return $dom;
    }

    protected function createNodeList()
    {
        $dom = new \DOMDocument();
        $dom->loadXML('<html><div class="foo"></div></html>');
        $domxpath = new \DOMXPath($dom);

        return $domxpath->query('//div');
    }
}
PK9b�\�x�Mpear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Fixtures/no-extensionnu�[���Test
PK9b�\w�۴��Rpear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/Fixtures/windows-1250.htmlnu�[���<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=windows-1250">
    </head>
    <body>
        <p>���</p>
    </body>
</html>
PK9b�\m�Y���Dpear/test/DomCrawler/Symfony/Component/DomCrawler/Tests/LinkTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DomCrawler\Tests;

use Symfony\Component\DomCrawler\Link;

class LinkTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \LogicException
     */
    public function testConstructorWithANonATag()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('<html><div><div></html>');

        new Link($dom->getElementsByTagName('div')->item(0), 'http://www.example.com/');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testConstructorWithAnInvalidCurrentUri()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('<html><a href="/foo">foo</a></html>');

        new Link($dom->getElementsByTagName('a')->item(0), 'example.com');
    }

    public function testGetNode()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('<html><a href="/foo">foo</a></html>');

        $node = $dom->getElementsByTagName('a')->item(0);
        $link = new Link($node, 'http://example.com/');

        $this->assertEquals($node, $link->getNode(), '->getNode() returns the node associated with the link');
    }

    public function testGetMethod()
    {
        $dom = new \DOMDocument();
        $dom->loadHTML('<html><a href="/foo">foo</a></html>');

        $node = $dom->getElementsByTagName('a')->item(0);
        $link = new Link($node, 'http://example.com/');

        $this->assertEquals('GET', $link->getMethod(), '->getMethod() returns the method of the link');

        $link = new Link($node, 'http://example.com/', 'post');
        $this->assertEquals('POST', $link->getMethod(), '->getMethod() returns the method of the link');
    }

    /**
     * @dataProvider getGetUriTests
     */
    public function testGetUri($url, $currentUri, $expected)
    {
        $dom = new \DOMDocument();
        $dom->loadHTML(sprintf('<html><a href="%s">foo</a></html>', $url));
        $link = new Link($dom->getElementsByTagName('a')->item(0), $currentUri);

        $this->assertEquals($expected, $link->getUri());
    }

    /**
     * @dataProvider getGetUriTests
     */
    public function testGetUriOnArea($url, $currentUri, $expected)
    {
        $dom = new \DOMDocument();
        $dom->loadHTML(sprintf('<html><map><area href="%s" /></map></html>', $url));
        $link = new Link($dom->getElementsByTagName('area')->item(0), $currentUri);

        $this->assertEquals($expected, $link->getUri());
    }

    public function getGetUriTests()
    {
        return array(
            array('/foo', 'http://localhost/bar/foo/', 'http://localhost/foo'),
            array('/foo', 'http://localhost/bar/foo', 'http://localhost/foo'),
            array('
            /foo', 'http://localhost/bar/foo/', 'http://localhost/foo'),
            array('/foo
            ', 'http://localhost/bar/foo', 'http://localhost/foo'),

            array('foo', 'http://localhost/bar/foo/', 'http://localhost/bar/foo/foo'),
            array('foo', 'http://localhost/bar/foo', 'http://localhost/bar/foo'),

            array('', 'http://localhost/bar/', 'http://localhost/bar/'),
            array('#', 'http://localhost/bar/', 'http://localhost/bar/#'),
            array('#bar', 'http://localhost/bar/#foo', 'http://localhost/bar/#bar'),
            array('?a=b', 'http://localhost/bar/', 'http://localhost/bar/?a=b'),

            array('http://login.foo.com/foo', 'http://localhost/bar/', 'http://login.foo.com/foo'),
            array('https://login.foo.com/foo', 'https://localhost/bar/', 'https://login.foo.com/foo'),
            array('mailto:foo@bar.com', 'http://localhost/foo', 'mailto:foo@bar.com'),

            // tests schema relative URL (issue #7169)
            array('//login.foo.com/foo', 'http://localhost/bar/', 'http://login.foo.com/foo'),
            array('//login.foo.com/foo', 'https://localhost/bar/', 'https://login.foo.com/foo'),

            array('?foo=2', 'http://localhost?foo=1', 'http://localhost?foo=2'),
            array('?foo=2', 'http://localhost/?foo=1', 'http://localhost/?foo=2'),
            array('?foo=2', 'http://localhost/bar?foo=1', 'http://localhost/bar?foo=2'),
            array('?foo=2', 'http://localhost/bar/?foo=1', 'http://localhost/bar/?foo=2'),
            array('?bar=2', 'http://localhost?foo=1', 'http://localhost?bar=2'),

            array('foo', 'http://login.foo.com/bar/baz?/query/string', 'http://login.foo.com/bar/foo'),

            array('.', 'http://localhost/foo/bar/baz', 'http://localhost/foo/bar/'),
            array('./', 'http://localhost/foo/bar/baz', 'http://localhost/foo/bar/'),
            array('./foo', 'http://localhost/foo/bar/baz', 'http://localhost/foo/bar/foo'),
            array('..', 'http://localhost/foo/bar/baz', 'http://localhost/foo/'),
            array('../', 'http://localhost/foo/bar/baz', 'http://localhost/foo/'),
            array('../foo', 'http://localhost/foo/bar/baz', 'http://localhost/foo/foo'),
            array('../..', 'http://localhost/foo/bar/baz', 'http://localhost/'),
            array('../../', 'http://localhost/foo/bar/baz', 'http://localhost/'),
            array('../../foo', 'http://localhost/foo/bar/baz', 'http://localhost/foo'),
            array('../../foo', 'http://localhost/bar/foo/', 'http://localhost/foo'),
            array('../bar/../../foo', 'http://localhost/bar/foo/', 'http://localhost/foo'),
            array('../bar/./../../foo', 'http://localhost/bar/foo/', 'http://localhost/foo'),
            array('../../', 'http://localhost/', 'http://localhost/'),
            array('../../', 'http://localhost', 'http://localhost/'),

            array('/foo', 'file:///', 'file:///foo'),
            array('/foo', 'file:///bar/baz', 'file:///foo'),
            array('foo', 'file:///', 'file:///foo'),
            array('foo', 'file:///bar/baz', 'file:///bar/foo'),
        );
    }
}
PK9b�\)#��pp-pear/test/Mail_Mime/tests/test_Bug_18772.phptnu�[���--TEST--
Bug #18772  Text/calendar message
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$mime = new Mail_mime;
$mime->setSubject('test');

// A message with text/calendar only
$mime->setCalendarBody('VCALENDAR');

echo $mime->getMessage();
echo "\n---\n";

// A message with alternative text
$mime->setTXTBody('vcalendar');
$msg = $mime->getMessage();

echo preg_replace('/=_[0-9a-z]+/', '*', $msg);
--EXPECT--
MIME-Version: 1.0
Subject: test
Content-Type: text/calendar; charset=UTF-8; method=request
Content-Transfer-Encoding: quoted-printable

VCALENDAR
---
MIME-Version: 1.0
Subject: test
Content-Type: multipart/alternative;
 boundary="*"

--*
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=ISO-8859-1

vcalendar
--*
Content-Transfer-Encoding: quoted-printable
Content-Type: text/calendar; method=request; charset=UTF-8

VCALENDAR
--*--
PK:b�\M�-\��-pear/test/Mail_Mime/tests/test_Bug_17175.phptnu�[���--TEST--
Bug #17175  Content-Description support+ecoding
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$Mime = new Mail_Mime();
$Mime->setTXTBody('Test message.');
$Mime->addAttachment('test file contents', "text/plain",
    'test.txt', FALSE, 'base64', NULL, 'UTF-8', NULL, NULL, NULL, NULL,
    'desc');
$Mime->addAttachment('test file contents', "text/plain",
    'test2.txt', FALSE, 'base64', NULL, 'UTF-8', NULL, NULL, NULL, NULL,
    'test unicode żąśź');

$body = $Mime->getMessage();
preg_match_all('/Content-Description: (.*)/', $body, $matches);
foreach ($matches[1] as $value)
    echo $value."\n";
?>
--EXPECT--
desc
=?UTF-8?Q?test_unicode_=C5=BC=C4=85=C5=9B=C5=BA?=
PK:b�\%��BB,pear/test/Mail_Mime/tests/test_Bug_GH16.phptnu�[���--TEST--
Bug GH-16  Test methods that write to a file
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$mime = new Mail_mime("\r\n");
$mime->setHTMLBody('html');
$mime->setTXTBody('text');
$mime->setContentType('multipart/alternative', array('boundary' => 'something'));

$temp_filename = dirname(__FILE__) . "/output1.tmp";
touch($temp_filename);
$msg = $mime->saveMessageBody($temp_filename);
echo file_get_contents($temp_filename);

$temp_filename = dirname(__FILE__) . "/output2.tmp";
touch($temp_filename);
$msg = $mime->saveMessage($temp_filename);
echo file_get_contents($temp_filename);

$temp_filename = dirname(__FILE__) . "/output3.tmp";
$mimePart = new Mail_mimePart('abc', array(
        'content_type' => 'text/plain',
        'encoding'     => 'quoted-printable',
));
$mimePart->encodeToFile($temp_filename);
echo file_get_contents($temp_filename);

?>
--CLEAN--
<?php
    for ($i = 1; $i < 4; $i++) {
        @unlink(dirname(__FILE__) . "/output{$i}.tmp");
    }
?>
--EXPECT--
--something
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=ISO-8859-1

text
--something
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=ISO-8859-1

html
--something--
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="something"

--something
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=ISO-8859-1

text
--something
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=ISO-8859-1

html
--something--
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain

abc
PK:b�\ܶg�hh.pear/test/Mail_Mime/tests/test_Bug_9722_1.phptnu�[���--TEST--
Bug #9722   quotedPrintableEncode does not encode dot at start of line on Windows platform
--SKIPIF--
--FILE--
<?php
include("Mail/mimePart.php");
$text = "This
is a
test
...
    It is 
//really fun//
to make :(";

print_r(Mail_mimePart::quotedPrintableEncode($text, 76, "\n"));

--EXPECT--
This
is a
test
=2E..
    It is=20
//really fun//
to make :(
PK:b�\�zŬ�-pear/test/Mail_Mime/tests/test_Bug_11731.phptnu�[���--TEST--
Bug #11731  Full stops after soft line breaks are not encoded
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");
// Second full stop will be at the start of the second line after quoted-printable
// encoding (full stop '=2E' + 72 characters + line-continuation '=' = 76)
$text     = '.123456789012345678901234567890123456789012345678901234567890123456789012.3456';
$params   = Array(
    'content_type' => 'text/plain',
    'encoding'     => 'quoted-printable',
);    
$mimePart = new Mail_mimePart($text, $params);
$encoded  =  $mimePart->encode();
echo $encoded['body'];
    
--EXPECT--
=2E123456789012345678901234567890123456789012345678901234567890123456789012=
=2E3456
PK:b�\�a�[��-pear/test/Mail_Mime/tests/class-filename.phptnu�[���--TEST--
Test class filename (bug #24)
--SKIPIF--
<?php
echo "skip This will be broken until Mail_Mime2";
?>
--FILE--
<?php
@include('Mail/Mime.php');
echo class_exists('Mail_Mime') ? 'Include OK' : 'Include failed';
?>
--EXPECT--
Include OK
PK:b�\�-7c77.pear/test/Mail_Mime/tests/test_Bug_3513_2.phptnu�[���--TEST--
Bug #3513   Support of RFC2231 in header fields. (UTF-8)
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$test = "Süper gröse tolle tolle grüße.txt";
$Mime = new Mail_Mime();
$Mime->addAttachment('testfile',"text/plain", $test, FALSE, 'base64', 'attachment', 'UTF-8', 'de');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match_all('/filename([^\s]+)/i', $content, $matches)) {
    echo implode("\n", $matches[1]);
}

--EXPECT--
*0*=UTF-8'de'S%C3%BCper%20gr%C3%B6se%20tolle%20tolle%20gr%C3%BC;
*1*=%C3%9Fe.txt;
PK;b�\�E�oo-pear/test/Mail_Mime/tests/test_Bug_13962.phptnu�[���--TEST--
Bug #13962  Multiple header support
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$mime = new Mail_mime();

$mime->setFrom('user@from.example.com');
$r = $mime->txtHeaders(array('Received' => array('Received 1', 'Received 2')));

print_r($r); 
?>
--EXPECT--
Received: Received 1
Received: Received 2
MIME-Version: 1.0
From: user@from.example.com
PK;b�\g��+��-pear/test/Mail_Mime/tests/test_Bug_13444.phptnu�[���--TEST--
Bug #9725   multipart/related & alternative wrong order
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$mime = new Mail_mime();
$mime->setTXTBody("test");
$mime->setHTMLBody("test");
$mime->addHTMLImage("test", 'application/octet-stream', '', false);
$body = $mime->get();
$head = $mime->headers();
$headCT = $head['Content-Type'];
$headCT = explode(";", $headCT);
$headCT = $headCT[0];

$ct = preg_match_all('|Content-Type: ([^;\r\n]+)|', $body, $matches);
print($headCT);
print("\n");
foreach ($matches[1] as $match){
    print($match);
    print("\n");
}
--EXPECT--
multipart/alternative
text/plain
multipart/related
text/html
application/octet-stream
PK;b�\Ya�k!!=pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part1.phptnu�[���--TEST--
Bug #3488   Sleep/Wakeup EOL Consistency - Part 1
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');
$mm = new Mail_mime("\n");
$mm->setHTMLBody('<html></html>');
$mm->setTxtBody('Blah blah');

if (version_compare(phpversion(), "5.0.0", '<')) {
    $mmCopy = $mm;
} else {
    $mmCopy = clone($mm);
}

$mm->get();
$x = $mm->headers();

$smm = serialize(array('mm' => $mmCopy, 'header' => $x['Content-Type']));
$fp = fopen('sleep_wakeup_data', 'w');
fwrite($fp, $smm);
fclose($fp);

echo "Data written";
?>
--EXPECT--
Data written
PK<b�\ّB�
�
/pear/test/Mail_Mime/tests/qp_encoding_test.phptnu�[���--TEST--
qp comprehensive test
--SKIPIF--
--FILE--
<?php
error_reporting(E_ALL); // ignore E_STRICT

include("Mail/mimePart.php");

/**
 * Convenience function to make qp encoded output easier to verify
 *
 * @param string $text Input text to be encoded and printed
 * @param int $begin Start character to visibly print from
 * @param int $end Stop character to visibly print to
 * @param bool $special_chars Convert character such as linebreaks
 *     etc. to visible replacements.
 * @param int $break Line length before soft break
 *
 */
function debug_print($text, $begin=False, $end=False, $special_chars=True, $break=76) {
    $begin = $begin ? $begin : strlen($text);
    $end = $end ? $end : strlen($text);

    for ($i=$begin; $i <= $end; $i++) {
        $input = substr($text, 0, $i);
        $output = Mail_mimePart::quotedPrintableEncode($input, $break);

        if ($special_chars) {
            $input_vis = str_replace("\t", '\t', str_replace("\n", '\n', str_replace("\r", '\r', $input)));
        } else {
            $input_vis = $input;
        }
        printf("input: %02d: %s\n", strlen($input), $input_vis);

        $lines = explode("\r\n", $output);
        for($j=0; $j < count($lines); $j++) {
            $line = $lines[$j];
            if ($j + 1 < count($lines) && $special_chars) {
                $line_vis = str_replace("\t", '\t', $line).'\r\n';
            } else {
                $line_vis = $line;
            }
            printf("output:%02d: %s\n", strlen($line), $line_vis);
        }
        print("---\n");
    }
}

// Test linebreaks on regular long lines
$text = '12345678901234567890123456789012345678901234567890123456789012345678901234567890';
debug_print($text, 74);

// Test linebreaks on long line with dot at end.
$text = '123456789.12';
debug_print($text, 10, False, False, 10);

$text = "\tHere's\t\na tab.\n";
debug_print($text, False, False, True, 8);

--EXPECT--
input: 74: 12345678901234567890123456789012345678901234567890123456789012345678901234
output:74: 12345678901234567890123456789012345678901234567890123456789012345678901234
---
input: 75: 123456789012345678901234567890123456789012345678901234567890123456789012345
output:75: 123456789012345678901234567890123456789012345678901234567890123456789012345
---
input: 76: 1234567890123456789012345678901234567890123456789012345678901234567890123456
output:76: 1234567890123456789012345678901234567890123456789012345678901234567890123456
---
input: 77: 12345678901234567890123456789012345678901234567890123456789012345678901234567
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:02: 67
---
input: 78: 123456789012345678901234567890123456789012345678901234567890123456789012345678
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:03: 678
---
input: 79: 1234567890123456789012345678901234567890123456789012345678901234567890123456789
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:04: 6789
---
input: 80: 12345678901234567890123456789012345678901234567890123456789012345678901234567890
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:05: 67890
---
input: 10: 123456789.
output:10: 123456789.
---
input: 11: 123456789.1
output:10: 123456789=
output:04: =2E1
---
input: 12: 123456789.12
output:10: 123456789=
output:05: =2E12
---
input: 16: \tHere's\t\na tab.\n
output:08: \tHere's=\r\n
output:03: =09\r\n
output:06: a tab.\r\n
output:00: 
---
PK<b�\������-pear/test/Mail_Mime/tests/test_Bug_15320.phptnu�[���--TEST--
Bug #15320  Charset parameter in Content-Type of mail parts
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$Mime = new Mail_mime();
$Mime->addAttachment('testfile', "text/plain", 'file.txt', FALSE, 'base64', 'attachment', 'ISO-8859-1');

$content = $Mime->get();
//$content = str_replace("\n", '', $content);

if (preg_match('/Content-type:([^\n]+)/i', $content, $matches)) {
    echo $matches[1];
}

?>
--EXPECT--
text/plain; charset=ISO-8859-1;

PK<b�\�X�##-pear/test/Mail_Mime/tests/test_Bug_19497.phptnu�[���--TEST--
Bug #19497  Attachment filenames with a slash character
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";
$Mime = new Mail_mime();

$filename = "test/file.txt";
$Mime->addAttachment('testfile', "text/plain", $filename, FALSE,
    'base64', 'attachment', 'ISO-8859-1', '', '', 'quoted-printable', 'base64');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match_all('/(name|filename)=([^\s]+)/i', $content, $matches)) {
    echo implode("\n", $matches[2]);
}
?>
--EXPECT--
"test/file.txt"
"test/file.txt";
PK<b�\���v��.pear/test/Mail_Mime/tests/test_Bug_8541_1.phptnu�[���--TEST--
Bug #8541   mimePart.php line delimiter is \r
--SKIPIF--
--FILE--
<?php
$mime = file_get_contents('Mail/mime.php', 1);
$mimePart = file_get_contents('Mail/mimePart.php', 1);
if (strpos($mime, "\r")){
    print("\\r found in mime.php\n");
}elseif (strpos($mime, "\t")){
    print("\\t found in mime.php\n");
}elseif (strpos($mimePart, "\r")){
    print("\\r found in mimePart.php\n");
}elseif (strpos($mimePart, "\t")){
    print("\\t found in mimePart.php\n");
}
print('OK');
--EXPECT--
OK
PK<b�\i;���.pear/test/Mail_Mime/tests/test_Bug_7561_1.phptnu�[���--TEST--
Bug #7561   Mail_mimePart::quotedPrintableEncode() misbehavior with mbstring overload
--INI--
mbstring.language=Neutral
mbstring.func_overload=6
mbstring.internal_encoding=UTF-8
mbstring.http_output=UTF-8
--SKIPIF--
<?php
include "PEAR.php";
if (!extension_loaded('mbstring')){
    if (!PEAR::loadExtension('mbstring')){
        print('SKIP could not load mbstring module');
    }
}
--FILE--
<?php
include("Mail/mimePart.php");
// string is UTF-8 encoded
$input = "Micha\xC3\xABl \xC3\x89ric St\xC3\xA9phane";
$rv = Mail_mimePart::quotedPrintableEncode($input, 76, "\n");
echo $rv, "\n";
--EXPECT--
Micha=C3=ABl =C3=89ric St=C3=A9phane
PK=b�\Y�����,pear/test/Mail_Mime/tests/test_Bug_GH26.phptnu�[���--TEST--
Bug GH-26  Backward slash is getting added in headers
--SKIPIF--
--FILE--
<?php

require_once('Mail/mime.php');

$mail_mime = new Mail_mime("\n");

$from = '"George B@@Z"<george@cort.org.au>';
$to = <<<EOT
"austin test"<austinn@cort.org>,<reno@cort.org>,t@mail.com
EOT;
$subject = "Test mime";
$mailbody = "hello world";

$mail_mime->setTxtBody($mailbody);
$mail_mime->setHTMLBody($mailbody);
$mail_mime->setSubject($subject);
$mail_mime->setFrom($from);

$body = $mail_mime->get();

$extra_headers = array();
$extra_headers["To"] = $to;

$arr_hdrs = $mail_mime->headers($extra_headers);

echo $arr_hdrs['From'] . "\n" . $arr_hdrs['To'];

--EXPECT--
"George B@@Z" <george@cort.org.au>
"austin test" <austinn@cort.org>, <reno@cort.org>, t@mail.comPK=b�\Ui�E!E!7pear/test/Mail_Mime/tests/headers_without_mbstring.phptnu�[���--TEST--
Multi-test for headers encoding using base64 and quoted-printable
--SKIPIF--
<?php
if (function_exists('mb_substr') && function_exists('mb_strlen')) {
    die("skip mbstring functions found!");
}
?>
--FILE--
<?php
include("Mail/mime.php");
$mime = new Mail_mime();

$headers = array(
array('From', '<adresse@adresse.de>'),
array('From', 'adresse@adresse.de'),
array('From', 'Frank Do <adresse@adresse.de>'),
array('To', 'Frank Do <adresse@adresse.de>, James Clark <james@domain.com>'),
array('From', '"Frank Do" <adresse@adresse.de>'),
array('Cc', '"Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>'),
array('Cc', ' <adresse@adresse.de>, "Kuśmiderski Jan Krzysztof Janusz Długa nazwa" <cris@domain.com>'),
array('From', '"adresse@adresse.de" <addresse@adresse>'),
array('From', 'adresse@adresse.de <addresse@adresse>'),
array('From', '"German Umlauts öäü" <adresse@adresse.de>'),
array('Subject', 'German Umlauts öäü <adresse@adresse.de>'),
array('Subject', 'Short ASCII subject'),
array('Subject', 'Long ASCII subject - multiline space separated words - too long for one line'),
array('Subject', 'Short Unicode ż subject'),
array('Subject', 'Long Unicode subject - zażółć gęślą jaźń - too long for one line'),
array('References', '<hglvja$jg7$1@nemesis.news.neostrada.pl>  <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>'),
array('To', '"Frank Do" <adresse@adresse.de>,, "James Clark" <james@domain.com>'),
array('To', '"Frank \\" \\\\Do" <adresse@adresse.de>'),
array('To', 'Frank " \\Do <adresse@adresse.de>'),
array('Subject', "A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test"),
array('Subject', "TEST Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir!!!?"),
array('Subject', "Update: Microsoft Windows-Tool zum Entfernen bösartiger Software 3.6"),
array('From', "test@nàme <user@domain.com>"),
array('From', "Test <\"test test\"@domain.com>"),
array('From', "\"test test\"@domain.com"),
array('From', "<\"test test\"@domain.com>"),
array('From', "Doe<test@domain.com>"),
array('From', "\"John Doe\"<test@domain.com>"),
array('Mail-Reply-To', 'adresse@adresse.de <addresse@adresse>'),
array('Mail-Reply-To', '"öäü" <adresse@adresse.de>'),
);

$i = 1;
foreach ($headers as $header) {
    $hdr = $mime->encodeHeader($header[0], $header[1], 'UTF-8', 'base64');
    printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
    $hdr = $mime->encodeHeader($header[0], $header[1], 'UTF-8', 'quoted-printable');
    printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
    $i++;
}
?>
--EXPECT--
[01] From: <adresse@adresse.de>
[01] From: <adresse@adresse.de>
[02] From: adresse@adresse.de
[02] From: adresse@adresse.de
[03] From: Frank Do <adresse@adresse.de>
[03] From: Frank Do <adresse@adresse.de>
[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
[05] From: "Frank Do" <adresse@adresse.de>
[05] From: "Frank Do" <adresse@adresse.de>
[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[07] Cc: <adresse@adresse.de>, =?UTF-8?B?S3XFm21pZGVyc2tpIEphbiBLcnp5c3p0b2Yg?=
 =?UTF-8?B?SmFudXN6IETFgnVnYSBuYXp3YQ==?= <cris@domain.com>
[07] Cc: <adresse@adresse.de>,
 =?UTF-8?Q?Ku=C5=9Bmiderski_Jan_Krzysztof_Janusz_D?=
 =?UTF-8?Q?=C5=82uga_nazwa?= <cris@domain.com>
[08] From: "adresse@adresse.de" <addresse@adresse>
[08] From: "adresse@adresse.de" <addresse@adresse>
[09] From: "adresse@adresse.de" <addresse@adresse>
[09] From: "adresse@adresse.de" <addresse@adresse>
[10] From: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8?= <adresse@adresse.de>
[10] From: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
[11] Subject: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8IDxhZHJlc3NlQGFkcmVzc2Uu?=
 =?UTF-8?B?ZGU+?=
[11] Subject: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC_=3Cadresse=40adresse?=
 =?UTF-8?Q?=2Ede=3E?=
[12] Subject: Short ASCII subject
[12] Subject: Short ASCII subject
[13] Subject: Long ASCII subject - multiline space separated words - too long for
 one line
[13] Subject: Long ASCII subject - multiline space separated words - too long for
 one line
[14] Subject: =?UTF-8?B?U2hvcnQgVW5pY29kZSDFvCBzdWJqZWN0?=
[14] Subject: =?UTF-8?Q?Short_Unicode_=C5=BC_subject?=
[15] Subject: =?UTF-8?B?TG9uZyBVbmljb2RlIHN1YmplY3QgLSB6YcW8w7PFgsSHIGfEmcWb?=
 =?UTF-8?B?bMSFIGphxbrFhCAtIHRvbyBsb25nIGZvciBvbmUgbGluZQ==?=
[15] Subject: =?UTF-8?Q?Long_Unicode_subject_-_za=C5=BC=C3=B3=C5=82=C4=87_g=C4?=
 =?UTF-8?Q?=99=C5=9Bl=C4=85_ja=C5=BA=C5=84_-_too_long_for_one_line?=
[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
 <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
 <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[18] To: "Frank \" \\Do" <adresse@adresse.de>
[18] To: "Frank \" \\Do" <adresse@adresse.de>
[19] To: "Frank \" \\Do" <adresse@adresse.de>
[19] To: "Frank \" \\Do" <adresse@adresse.de>
[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
[21] Subject: =?UTF-8?B?VEVTVCBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1p?=
 =?UTF-8?B?ciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIg?=
 =?UTF-8?B?Z3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRv?=
 =?UTF-8?B?bGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zD?=
 =?UTF-8?B?n2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1p?=
 =?UTF-8?B?ciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIg?=
 =?UTF-8?B?Z3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRv?=
 =?UTF-8?B?bGxlIGdyw7zDn2Ugdm9uIG1pciEhIT8=?=
[21] Subject: =?UTF-8?Q?TEST_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir?=
 =?UTF-8?Q?_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_g?=
 =?UTF-8?Q?r=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tol?=
 =?UTF-8?Q?le_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC?=
 =?UTF-8?Q?=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_m?=
 =?UTF-8?Q?ir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper?=
 =?UTF-8?Q?_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_t?=
 =?UTF-8?Q?olle_gr=C3=BC=C3=9Fe_von_mir!!!=3F?=
[22] Subject: =?UTF-8?B?VXBkYXRlOiBNaWNyb3NvZnQgV2luZG93cy1Ub29sIHp1bSBFbnRm?=
 =?UTF-8?B?ZXJuZW4gYsO2c2FydGlnZXIgU29mdHdhcmUgMy42?=
[22] Subject: =?UTF-8?Q?Update=3A_Microsoft_Windows-Tool_zum_Entfernen_b=C3=B6sa?=
 =?UTF-8?Q?rtiger_Software_3=2E6?=
[23] From: =?UTF-8?B?dGVzdEBuw6BtZQ==?= <user@domain.com>
[23] From: =?UTF-8?Q?test=40n=C3=A0me?= <user@domain.com>
[24] From: Test <"test test"@domain.com>
[24] From: Test <"test test"@domain.com>
[25] From: "test test"@domain.com
[25] From: "test test"@domain.com
[26] From: <"test test"@domain.com>
[26] From: <"test test"@domain.com>
[27] From: Doe <test@domain.com>
[27] From: Doe <test@domain.com>
[28] From: "John Doe" <test@domain.com>
[28] From: "John Doe" <test@domain.com>
[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
[30] Mail-Reply-To: =?UTF-8?B?w7bDpMO8?= <adresse@adresse.de>
[30] Mail-Reply-To: =?UTF-8?Q?=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
PK=b�\�8��.pear/test/Mail_Mime/tests/test_Bug_3513_1.phptnu�[���--TEST--
Bug #3513   Support of RFC2231 in header fields. (ISO-8859-1)
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$test = "F��b�r.txt";
$Mime = new Mail_Mime();
$Mime->addAttachment('testfile',"text/plain", $test, FALSE, 'base64', 'attachment', 'ISO-8859-1');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match('/filename([^\s]+)/i', $content, $matches)) {
    echo $matches[1];
}

--EXPECT--
*=ISO-8859-1''F%F3%F3b%E6r.txt;
PK=b�\2!�B��1pear/test/Mail_Mime/tests/test_linebreak_dot.phptnu�[���--TEST--
Test for correct "." encoding when doing linebreaks
--SKIPIF--
--FILE--
<?php
error_reporting(E_ALL); // ignore E_STRICT
include("Mail/mime.php");
$text     = '0123456789012345678901234567890123456789012345678901234567890123456789012...6';
$params   = Array(
    'content_type' => 'text/plain',
    'encoding'     => 'quoted-printable',
);

for ($i=74; $i <= strlen($text); $i++) {
    $input = substr($text, 0, $i);
    $mimePart = new Mail_mimePart($input, $params);
    $encoded  =  $mimePart->encode();
    $output = $encoded['body'];
    printf("input: %02d: %s\n", strlen($input), $input);

    $lines = explode("\r\n", $output);
    for($j=0; $j < count($lines); $j++) {
        $line = $lines[$j];
        if ($j + 1 < count($lines)) {
            $line_vis = $line.'\r\n';
        } else {
            $line_vis = $line;
        }
        printf("output:%02d: %s\n", strlen($line), $line_vis);
    }

    print("---\n");

}
--EXPECT--
input: 74: 0123456789012345678901234567890123456789012345678901234567890123456789012.
output:74: 0123456789012345678901234567890123456789012345678901234567890123456789012.
---
input: 75: 0123456789012345678901234567890123456789012345678901234567890123456789012..
output:75: 0123456789012345678901234567890123456789012345678901234567890123456789012..
---
input: 76: 0123456789012345678901234567890123456789012345678901234567890123456789012...
output:76: 0123456789012345678901234567890123456789012345678901234567890123456789012...
---
input: 77: 0123456789012345678901234567890123456789012345678901234567890123456789012...6
output:76: 0123456789012345678901234567890123456789012345678901234567890123456789012..=\r\n
output:04: =2E6
---
PK=b�\e;�I-pear/test/Mail_Mime/tests/test_Bug_21205.phptnu�[���--TEST--
Bug #21205  Handling ISO-2022-JP headers
--SKIPIF--
<?php
include "PEAR.php";
if (!extension_loaded('mbstring')) {
    if (!PEAR::loadExtension('mbstring')) {
        print('SKIP could not load mbstring module');
    }
}
--FILE--
<?php
require_once('Mail/mimePart.php');
$tests = array(
    '□京都府□',
    '∠∠∠∠',
);
$addr = ' <aaa@bbb.ccc>';
$charset = 'ISO-2022-JP';
$encoding = 'base64';
foreach ($tests as $test) {
    $test = mb_convert_encoding($test, $charset, 'UTF-8');
    print Mail_mimePart::encodeHeader("subject", $test,       $charset, $encoding) . PHP_EOL;
    print Mail_mimePart::encodeHeader("to",      $test.$addr, $charset, $encoding) . PHP_EOL;
    $test = '"' . $test . '"';
    print Mail_mimePart::encodeHeader("subject", $test,       $charset, $encoding) . PHP_EOL;
    print Mail_mimePart::encodeHeader("to",      $test.$addr, $charset, $encoding) . PHP_EOL;
}
?>
--EXPECT--
=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?=
=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?= <aaa@bbb.ccc>
=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?=
=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?= <aaa@bbb.ccc>
=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?=
=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?= <aaa@bbb.ccc>
=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?=
=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?= <aaa@bbb.ccc>
PK=b�\�(V,��-pear/test/Mail_Mime/tests/test_Bug_12411.phptnu�[���--TEST--
Bug #12411  RFC2047 encoded attachment filenames
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";
$Mime = new Mail_mime();

// some text with polish Unicode letter at the beginning
$filename = base64_decode("xZtjaWVtYQ==");
$Mime->addAttachment('testfile', "text/plain", $filename, FALSE,
    'base64', 'attachment', 'ISO-8859-1', 'pl', '',
    'quoted-printable', 'base64');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match_all('/(name|filename)=([^\s]+)/i', $content, $matches)) {
    echo implode("\n", $matches[2]);
}

?>
--EXPECT--
"=?ISO-8859-1?Q?=C5=9Bciema?="
"=?ISO-8859-1?B?xZtjaWVtYQ==?=";
PK=b�\��RoUU-pear/test/Mail_Mime/tests/test_Bug_20226.phptnu�[���--TEST--
Bug #20226  Mail_mimePart::encodeHeader() and ISO-2022-JP encoding
--SKIPIF--
--FILE--
<?php
include("Mail/mimePart.php");

$subject = base64_decode("GyRCJT8lJCVIJWsbKEI=");
$mime    = new Mail_mimePart();

echo $mime->encodeHeader('subject', $subject, 'ISO-2022-JP', 'base64');
?>
--EXPECT--
=?ISO-2022-JP?B?GyRCJT8lJCVIJWsbKEI=?=
PK@b�\�YcLYY-pear/test/Mail_Mime/tests/test_Bug_16539.phptnu�[���--TEST--
Bug #16539  Headers longer than 998 characters
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");
$mime = new Mail_mime();

$headers = array(
'To' => 'jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com',
'Subject' => 'jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com',
);

echo $mime->txtHeaders($headers, true, true);
?>
--EXPECT--
MIME-Version: 1.0
To: jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
 jskibbie@schawk.com, jskibbie@schawk.com
Subject: jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.co
 m,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com
PK@b�\@�/�NN-pear/test/Mail_Mime/tests/test_Bug_21206.phptnu�[���--TEST--
Bug #21206  Handling quoted strings
--SKIPIF--
--FILE--
<?php
require_once('Mail/mimePart.php');
class X extends Mail_mimePart {
    public static function explodeQuotedString($delimiter, $string) {
        return Mail_mimePart::explodeQuotedString($delimiter, $string);
    }
}

$tests = array(
    '"a" <a@a.a>, b <b@b.b>',
    '"c\\\\" <c@c.c>, d <d@d.d>',
);
foreach ($tests as $test) {
    $addrs = X::explodeQuotedString('[\t,]', $test);
    foreach ($addrs as $addr) {
        print trim($addr) . PHP_EOL;
    }
}
?>
--EXPECT--
"a" <a@a.a>
b <b@b.b>
"c\\" <c@c.c>
d <d@d.d>
PK@b�\`�~@/pear/test/Mail_Mime/tests/test_Bug_12385_1.phptnu�[���--TEST--
Bug #12385  Bad regex when replacing css style attachments
--SKIPIF--
--FILE--
<?php
$from='user@from.example.com';

require_once('Mail/mime.php');

$mime=new Mail_mime();

$body="<style>
className {
    background-image: url('test.gif');
}
</script>
";

$mime->setHTMLBody($body);
$mime->setFrom($from);
$mime->addHTMLImage('','image/gif', 'test.gif', false);
$msg = $mime->get();

$cidtag = preg_match("|url\('cid:[^']*'\);|", $msg);
if (!$cidtag){
    print("FAIL:\n");
    print($msg);
}else{
    print("OK");
}
--EXPECT--
OK
PKAb�\��᠗"�"4pear/test/Mail_Mime/tests/headers_with_mbstring.phptnu�[���--TEST--
Multi-test for headers encoding using base64 and quoted-printable
--SKIPIF--
<?php
if (!function_exists('mb_substr') || !function_exists('mb_strlen')) {
    die "skip mbstring functions not found!";
}
?>
--FILE--
<?php
include("Mail/mime.php");
$mime = new Mail_mime();

$headers = array(
array('From', '<adresse@adresse.de>'),
array('From', 'adresse@adresse.de'),
array('From', 'Frank Do <adresse@adresse.de>'),
array('To', 'Frank Do <adresse@adresse.de>, James Clark <james@domain.com>'),
array('From', '"Frank Do" <adresse@adresse.de>'),
array('Cc', '"Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>'),
array('Cc', ' <adresse@adresse.de>, "Kuśmiderski Jan Krzysztof Janusz Długa nazwa" <cris@domain.com>'),
array('From', '"adresse@adresse.de" <addresse@adresse>'),
array('From', 'adresse@adresse.de <addresse@adresse>'),
array('From', '"German Umlauts öäü" <adresse@adresse.de>'),
array('Subject', 'German Umlauts öäü <adresse@adresse.de>'),
array('Subject', 'Short ASCII subject'),
array('Subject', 'Long ASCII subject - multiline space separated words - too long for one line'),
array('Subject', 'Short Unicode ż subject'),
array('Subject', 'Long Unicode subject - zażółć gęślą jaźń - too long for one line'),
array('References', '<hglvja$jg7$1@nemesis.news.neostrada.pl>  <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>'),
array('To', '"Frank Do" <adresse@adresse.de>,, "James Clark" <james@domain.com>'),
array('To', '"Frank \\" \\\\Do" <adresse@adresse.de>'),
array('To', 'Frank " \\Do <adresse@adresse.de>'),
array('Subject', "A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test"),
array('Subject', "TEST Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir!!!?"),
array('Subject', "Update: Microsoft Windows-Tool zum Entfernen bösartiger Software 3.6"),
array('From', "test@nàme <user@domain.com>"),
array('From', "Test <\"test test\"@domain.com>"),
array('From', "\"test test\"@domain.com"),
array('From', "<\"test test\"@domain.com>"),
array('From', "Doe<test@domain.com>"),
array('From', "\"John Doe\"<test@domain.com>"),
array('Mail-Reply-To', 'adresse@adresse.de <addresse@adresse>'),
array('Mail-Reply-To', '"öäü" <adresse@adresse.de>'),
array('Subject', mb_convert_encoding('㈱山﨑工業', 'ISO-2022-JP-MS', 'UTF-8'), 'ISO-2022-JP'),
);

$i = 1;
foreach ($headers as $header) {
    $charset = isset($header[2]) ? $header[2] : 'UTF-8';
    $hdr = $mime->encodeHeader($header[0], $header[1], $charset, 'base64');
    printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
    $hdr = $mime->encodeHeader($header[0], $header[1], $charset, 'quoted-printable');
    printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
    $i++;
}
?>
--EXPECT--
[01] From: <adresse@adresse.de>
[01] From: <adresse@adresse.de>
[02] From: adresse@adresse.de
[02] From: adresse@adresse.de
[03] From: Frank Do <adresse@adresse.de>
[03] From: Frank Do <adresse@adresse.de>
[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
[05] From: "Frank Do" <adresse@adresse.de>
[05] From: "Frank Do" <adresse@adresse.de>
[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[07] Cc: <adresse@adresse.de>, =?UTF-8?B?S3XFm21pZGVyc2tpIEphbiBLcnp5c3p0b2Yg?=
 =?UTF-8?B?SmFudXN6IETFgnVnYSBuYXp3YQ==?= <cris@domain.com>
[07] Cc: <adresse@adresse.de>, =?UTF-8?Q?Ku=C5=9Bmiderski_Jan_Krzysztof_Janusz?=
 =?UTF-8?Q?_D=C5=82uga_nazwa?= <cris@domain.com>
[08] From: "adresse@adresse.de" <addresse@adresse>
[08] From: "adresse@adresse.de" <addresse@adresse>
[09] From: "adresse@adresse.de" <addresse@adresse>
[09] From: "adresse@adresse.de" <addresse@adresse>
[10] From: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8?= <adresse@adresse.de>
[10] From: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
[11] Subject: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8IDxhZHJlc3NlQGFkcmVzc2Uu?=
 =?UTF-8?B?ZGU+?=
[11] Subject: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC_=3Cadresse=40adresse?=
 =?UTF-8?Q?=2Ede=3E?=
[12] Subject: Short ASCII subject
[12] Subject: Short ASCII subject
[13] Subject: Long ASCII subject - multiline space separated words - too long for
 one line
[13] Subject: Long ASCII subject - multiline space separated words - too long for
 one line
[14] Subject: =?UTF-8?B?U2hvcnQgVW5pY29kZSDFvCBzdWJqZWN0?=
[14] Subject: =?UTF-8?Q?Short_Unicode_=C5=BC_subject?=
[15] Subject: =?UTF-8?B?TG9uZyBVbmljb2RlIHN1YmplY3QgLSB6YcW8w7PFgsSHIGfEmcWb?=
 =?UTF-8?B?bMSFIGphxbrFhCAtIHRvbyBsb25nIGZvciBvbmUgbGluZQ==?=
[15] Subject: =?UTF-8?Q?Long_Unicode_subject_-_za=C5=BC=C3=B3=C5=82=C4=87_g?=
 =?UTF-8?Q?=C4=99=C5=9Bl=C4=85_ja=C5=BA=C5=84_-_too_long_for_one_line?=
[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
 <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
 <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
[18] To: "Frank \" \\Do" <adresse@adresse.de>
[18] To: "Frank \" \\Do" <adresse@adresse.de>
[19] To: "Frank \" \\Do" <adresse@adresse.de>
[19] To: "Frank \" \\Do" <adresse@adresse.de>
[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
 REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
[21] Subject: =?UTF-8?B?VEVTVCBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1p?=
 =?UTF-8?B?ciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIg?=
 =?UTF-8?B?Z3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRv?=
 =?UTF-8?B?bGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7w=?=
 =?UTF-8?B?w59lIHZvbiBtaXIgU8O8cGVyIGdyw7ZzZSB0b2xsZSBncsO8w59lIHZvbiBt?=
 =?UTF-8?B?aXIgU8O8cGVyIGdyw7ZzZSB0b2xsZSBncsO8w59lIHZvbiBtaXIgU8O8cGVy?=
 =?UTF-8?B?IGdyw7ZzZSB0b2xsZSBncsO8w59lIHZvbiBtaXIgU8O8cGVyIGdyw7ZzZSB0?=
 =?UTF-8?B?b2xsZSBncsO8w59lIHZvbiBtaXIhISE/?=
[21] Subject: =?UTF-8?Q?TEST_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_m?=
 =?UTF-8?Q?ir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCp?=
 =?UTF-8?Q?er_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6?=
 =?UTF-8?Q?se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr?=
 =?UTF-8?Q?=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC?=
 =?UTF-8?Q?=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von?=
 =?UTF-8?Q?_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S?=
 =?UTF-8?Q?=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir!!!=3F?=
[22] Subject: =?UTF-8?B?VXBkYXRlOiBNaWNyb3NvZnQgV2luZG93cy1Ub29sIHp1bSBFbnRm?=
 =?UTF-8?B?ZXJuZW4gYsO2c2FydGlnZXIgU29mdHdhcmUgMy42?=
[22] Subject: =?UTF-8?Q?Update=3A_Microsoft_Windows-Tool_zum_Entfernen_b=C3=B6?=
 =?UTF-8?Q?sartiger_Software_3=2E6?=
[23] From: =?UTF-8?B?dGVzdEBuw6BtZQ==?= <user@domain.com>
[23] From: =?UTF-8?Q?test=40n=C3=A0me?= <user@domain.com>
[24] From: Test <"test test"@domain.com>
[24] From: Test <"test test"@domain.com>
[25] From: "test test"@domain.com
[25] From: "test test"@domain.com
[26] From: <"test test"@domain.com>
[26] From: <"test test"@domain.com>
[27] From: Doe <test@domain.com>
[27] From: Doe <test@domain.com>
[28] From: "John Doe" <test@domain.com>
[28] From: "John Doe" <test@domain.com>
[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
[30] Mail-Reply-To: =?UTF-8?B?w7bDpMO8?= <adresse@adresse.de>
[30] Mail-Reply-To: =?UTF-8?Q?=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
[31] Subject: =?ISO-2022-JP?B?GyRCLWo7M3l1OSk2SBsoQg==?=
[31] Subject: =?ISO-2022-JP?Q?=24B-j=28B=24B=3B3=28B=24Byu=28B?=
 =?ISO-2022-JP?Q?=24B9=29=28B=24B6H=28B?=
PKAb�\�'�''.pear/test/Mail_Mime/tests/test_Bug_8386_1.phptnu�[���--TEST--
Bug #8386   HTML body not correctly encoded if attachments present
--SKIPIF--
--FILE--
<?php
$eol = "\n#";
include("Mail/mime.php");
$encoder = new Mail_mime(array('eol'=>$eol));
$encoder->setTXTBody('test');
$encoder->setHTMLBody('<b>test</b>');
$encoder->addAttachment('Just a test', 'application/octet-stream', 'test.txt', false);
$body = $encoder->get();
if (strpos($body, '--' . $eol . '--=')){
    print("FAILED\n");
    print("Single delimiter() between 2 parts found.\n");
    print($body);
}else{
    print("OK");
}
?>
--EXPECT--
OK
PKBb�\���|JJ=pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part2.phptnu�[���--TEST--
Bug #3488   Sleep/Wakeup EOL Consistency - Part 2
--SKIPIF--
if (!is_readable('sleep_wakeup_data')) {
    echo "skip No data. Part 1 must run first.\n";
}
--FILE--
<?php
require_once('Mail/mime.php');
$filename = 'sleep_wakeup_data';
$fp = fopen($filename, 'r');
$smm = fread($fp, filesize($filename));
fclose($fp);
@unlink($filename);

$mmData = unserialize($smm);
$mmData['mm']->get();
$x = $mmData['mm']->headers();

list($h1) = explode("\n", $mmData['header']);
list($h2) = explode("\n", $x['Content-Type']);

echo ($h1 == $h2) ? "Match" : "No Match";

?>
--EXPECT--
Match
PKBb�\ZX�Hww.pear/test/Mail_Mime/tests/test_Bug_3513_3.phptnu�[���--TEST--
Bug #3513   Support of RFC2231 in header fields. (ISO-2022-JP)
--SKIPIF--
--FILE--
<?php
mb_internal_encoding('ISO-2022-JP');
$testEncoded="GyRCRnxLXDhsGyhCLnR4dA==";
$test = base64_decode($testEncoded); // Japanese filename in ISO-2022-JP charset.
require_once('Mail/mime.php');

$Mime = new Mail_Mime();
$Mime->addAttachment('testfile',"text/plain", $test, FALSE, 'base64', 'attachment', 'iso-2022-jp', '');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match('/filename([^\s]+)/i', $content, $matches)) {
    echo $matches[1];
}
?>
--EXPECT--
*=iso-2022-jp''%1B$BF|K%5C8l%1B%28B.txt;

PKBb�\9��::/pear/test/Mail_Mime/tests/test_Bug_10816_1.phptnu�[���--TEST--
Bug #10816  Unwanted linebreak at the end of output
--SKIPIF--
--FILE--
<?php
$eol = "#";
include("Mail/mime.php");
$encoder = new Mail_mime(array('eol'=>$eol));
$encoder->setTXTBody('test');
$encoder->setHTMLBody('<b>test</b>');
$encoder->addAttachment('Just a test', 'application/octet-stream', 'test.txt', false);
$body = $encoder->get();
$taillength = -1 * strlen($eol) * 2;
if (substr($body, $taillength) == ($eol.$eol)){
    print("FAILED\n");
    print("Body:\n");
    print("..." . substr($body, -10) . "\n");
}else{
    print("OK\n");
}
--EXPECT--
OK

PKCb�\�M�U..-pear/test/Mail_Mime/tests/test_Bug_20273.phptnu�[���--TEST--
Bug #20273  Mail_mimePart::encodeHeader() and TAB character
--SKIPIF--
--FILE--
<?php
include("Mail/mimePart.php");

$refs = "<test@domain.tld>\t<test2@domain.tld>";
$mime = new Mail_mimePart();
echo $mime->encodeHeader('References', $refs);
?>
--EXPECT--
<test@domain.tld> <test2@domain.tld>
PKCb�\��((/pear/test/Mail_Mime/tests/test_Bug_10596_1.phptnu�[���--TEST--
Bug #10596  Incorrect handling of text and html '0' bodies
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");
$mime = new Mail_mime();
$mime->setTxtBody('0');
$mime->setHTMLBody('0');
$body = $mime->get();
if ($body){
    print("OK");
}else{
    print("NO BODY FOUND");
}
--EXPECT--
OK
PKDb�\5����-pear/test/Mail_Mime/tests/test_Bug_21098.phptnu�[���--TEST--
Bug #21098  Handling of empty plain text parts
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$mime = new Mail_mime();
$mime->setTxtBody('');
$mime->setHTMLBody('<html></html>');

$headers1 = $mime->txtHeaders();
$body     = $mime->get();
$headers2 = $mime->txtHeaders();
print strpos($headers1, 'text/html') && strpos($headers2, 'text/html') ? 'OK' : 'NOT OK';
--EXPECT--
OK
PKDb�\29r���,pear/test/Mail_Mime/tests/encoding_case.phptnu�[���--TEST--
Bug #2364   Tabs in Mail_mimePart::quotedPrintableEncode()
--SKIPIF--
--FILE--
<?php
$test = "Here's\t\na tab\n";
require_once('Mail/mimePart.php');
print Mail_mimePart::quotedPrintableEncode($test, 7);
?>
--EXPECT--
Here's=
=09
a tab
PKEb�\��qS��/pear/test/Mail_Mime/tests/test_Bug_10999_1.phptnu�[���--TEST--
Bug #10999  Bad Content-ID(cid) format
--SKIPIF--
--FILE--
<?php
$from='user@from.example.com';

require_once('Mail/mime.php');

$mime=new Mail_mime();

$body='<img src="test.gif"/>';

$mime->setHTMLBody($body);
$mime->setFrom($from);
$mime->addHTMLImage('','image/gif', 'test.gif', false);
$msg=$mime->get();

$header = preg_match('|Content-ID: <[0-9a-fA-F]+@from.example.com>|', $msg);
if (!$header){
    print("FAIL:\n");
    print($msg);
}else{
    print("OK");
}
--EXPECT--
OK
PKEb�\e�@Q__-pear/test/Mail_Mime/tests/test_Bug_14780.phptnu�[���--TEST--
Bug #14780  Invalid Content-Type when headers() is called before get()
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$mime = new Mail_mime();
$mime->setTXTBody("test");
$mime->setHTMLBody("test");

$head1 = $mime->headers();
$body = $mime->get();
$head2 = $mime->headers();

if ($head1 === $head2) {
    echo "OK";
}

?>
--EXPECT--
OK
PKEb�\��-pear/test/Mail_Mime/tests/test_Bug_21027.phptnu�[���--TEST--
Bug #21027  Calendar support along with attachments and html images
--SKIPIF--
--FILE--
<?php
require_once('Mail/mime.php');

$txtBody = 'Hi, this is Plain Text Body.';
$htmlBody = '<div>This is HTML body.</div>';
$icsText = 'BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//icalcreator//NONSGML iCalcreator 2.22//
METHOD:REQUEST
BEGIN:VEVENT
UID:77@localhost
DTSTAMP:20160208T170811Z
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=
 TRUE;CN=Jacob Alvarez:MAILTO:fake1@mailinator.com
CREATED:20160208T170810Z
DTSTART:20160215T180000Z
DTEND:20160215T190000Z
ORGANIZER;CN=-:MAILTO:fake2@mailinator.com
SEQUENCE:1
STATUS:CONFIRMED
SUMMARY:Prueba 69
TRANSP:OPAQUE
URL:http://localhost/event/77
END:VEVENT
END:VCALENDAR';

function printPartsStartAndEnd($body) {
    $matches  = array();
    preg_match_all('/--(=_[a-z0-9]+)--|Content-Type: ([^;\r\n]+)/', $body, $matches);
    $tab = "    ";
    foreach ($matches[0] as $match){
        if (strpos($match, '--') === false) {
            printf("%s%s\n", $tab, $match);
            if (stripos($match, "multipart")) {
                $tab .= "    ";
            }
        } else {
            $tab = substr($tab, 0, -4);
            printf("%sEnd part\n", $tab);
        }
    }
}

function printHeaderContentType($headers) {
    $headerContentType = array();
    preg_match('/([^;\r\n]+)/', $headers['Content-Type'], $headerContentType);
    printf("Content-Type: %s\n", $headerContentType[0]);
}

print "TEST: text\n";
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: html\n";
$mime = new Mail_mime();
$mime->setHTMLBody($htmlBody);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: attachments\n";
$mime = new Mail_mime();
$mime->addAttachment($icsText, 'application/ics', 'invite.ics', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: text + attachments\n";
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->addAttachment($icsText, 'application/ics', 'invite.ics', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: html + attachments\n";
$mime = new Mail_mime();
$mime->setHTMLBody($htmlBody);
$mime->addAttachment($icsText, 'application/ics', 'invite.ics', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: html + inline images\n";
$mime = new Mail_mime();
$mime->setHTMLBody($htmlBody);
$mime->addHTMLImage("aaaaaaaaaa", 'image/gif', 'image.gif', false, 'contentid');
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print("TEST: txt, html and attachment\n");
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);
$mime->addAttachment("test", 'application/octet-stream', 'attachment', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: calendar\n";
$mime = new Mail_mime();
$mime->setCalendarBody($icsText);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: txt + calendar\n";
$mime->setTXTBody($txtBody);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: txt, html, calendar\n";
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);
$mime->setCalendarBody($icsText);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: txt, html + html images, and calendar\n";
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);
$mime->addHTMLImage('testimage', 'image/gif', "bus.gif", false);
$mime->setCalendarBody($icsText);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print("TEST: txt, html, calendar and attachment\n");
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);
$mime->setCalendarBody($icsText);
$mime->addAttachment("test", 'application/octet-stream', 'attachment', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");

print "TEST: txt, html + html images, calendar, and attachment\n";
$mime = new Mail_mime();
$mime->setTXTBody($txtBody);
$mime->setHTMLBody($htmlBody);
$mime->addHTMLImage('testimage', 'image/gif', "bus.gif", false);
$mime->setCalendarBody($icsText);
$mime->addAttachment($icsText, 'application/ics', 'invite.ics', false);
$headers = $mime->headers();
$body = $mime->get();
printHeaderContentType($headers);
printPartsStartAndEnd($body);
print("\n");
?>
--EXPECT--
TEST: text
Content-Type: text/plain

TEST: html
Content-Type: text/html

TEST: attachments
Content-Type: multipart/mixed
    Content-Type: application/ics
End part

TEST: text + attachments
Content-Type: multipart/mixed
    Content-Type: text/plain
    Content-Type: application/ics
End part

TEST: html + attachments
Content-Type: multipart/mixed
    Content-Type: text/html
    Content-Type: application/ics
End part

TEST: html + inline images
Content-Type: multipart/related
    Content-Type: text/html
    Content-Type: image/gif
End part

TEST: txt, html and attachment
Content-Type: multipart/mixed
    Content-Type: multipart/alternative
        Content-Type: text/plain
        Content-Type: text/html
    End part
    Content-Type: application/octet-stream
End part

TEST: calendar
Content-Type: text/calendar

TEST: txt + calendar
Content-Type: multipart/alternative
    Content-Type: text/plain
    Content-Type: text/calendar
End part

TEST: txt, html, calendar
Content-Type: multipart/alternative
    Content-Type: text/plain
    Content-Type: text/html
    Content-Type: text/calendar
End part

TEST: txt, html + html images, and calendar
Content-Type: multipart/alternative
    Content-Type: text/plain
    Content-Type: multipart/related
        Content-Type: text/html
        Content-Type: image/gif
    End part
    Content-Type: text/calendar
End part

TEST: txt, html, calendar and attachment
Content-Type: multipart/mixed
    Content-Type: multipart/alternative
        Content-Type: text/plain
        Content-Type: text/html
        Content-Type: text/calendar
    End part
    Content-Type: application/octet-stream
End part

TEST: txt, html + html images, calendar, and attachment
Content-Type: multipart/mixed
    Content-Type: multipart/alternative
        Content-Type: text/plain
        Content-Type: multipart/related
            Content-Type: text/html
            Content-Type: image/gif
        End part
        Content-Type: text/calendar
    End part
    Content-Type: application/ics
End part
PKFb�\��1d��-pear/test/Mail_Mime/tests/test_Bug_17025.phptnu�[���--TEST--
Bug #16539  Headers longer than 998 characters
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$headers['From'] = 'aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhh';
# over than 76 chars
$mime = new Mail_mime();
$hdrs = $mime->headers($headers);
print_r($hdrs['From']); 
?>
--EXPECT--
aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhh
PKFb�\%+2PP-pear/test/Mail_Mime/tests/test_Bug_18083.phptnu�[���--TEST--
Bug #18083  Separate charset for attachment's content and headers
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";
$Mime = new Mail_mime();

$Mime->addAttachment('testfile', "text/plain",
    base64_decode("xZtjaWVtYQ=="), FALSE,
    'base64', 'attachment', 'ISO-8859-1', 'pl', '',
    'quoted-printable', 'base64', '', 'UTF-8');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match_all('/(name|filename)=([^\s]+)/i', $content, $matches)) {
    echo implode("\n", $matches[2]);
}
?>
--EXPECT--
"=?UTF-8?Q?=C5=9Bciema?="
"=?UTF-8?B?xZtjaWVtYQ==?=";
PKGb�\Cz2�}}-pear/test/Mail_Mime/tests/test_Bug_12165.phptnu�[���--TEST--
Bug #12165  Dot at the end of the line disappeared
--SKIPIF--
--FILE--
<?php
include ("Mail/mime.php");
$string='http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com';
$mime = new Mail_mime();
$mime->setHTMLBody($string);
print_r($mime->get());
    
--EXPECT--
http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=
=2Ecom
PKGb�\X��b��-pear/test/Mail_Mime/tests/test_Bug_14779.phptnu�[���--TEST--
Bug #14779  Proper header-body separator for empty attachment
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$m = new Mail_mime();
$m->addAttachment('', "text/plain", 'file.txt', FALSE, 'base64', 'attachment');
$result = $m->get();

if (preg_match('/(Content.*)--=.*/s', $result, $matches)) {
    print_r($matches[1]."END");
}

?>
--EXPECT--
Content-Transfer-Encoding: base64
Content-Type: text/plain;
 name=file.txt
Content-Disposition: attachment;
 filename=file.txt


END
PKHb�\�I�zz-pear/test/Mail_Mime/tests/test_Bug_20563.phptnu�[���--TEST--
Bug #20563  isMultipart() method tests
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$mime = new Mail_mime;

echo ($mime->isMultipart() ? 'TRUE' : 'FALSE') . "\n";

$mime->setTXTBody('test');

echo ($mime->isMultipart() ? 'TRUE' : 'FALSE') . "\n";

$mime->setHTMLBody('test');

echo ($mime->isMultipart() ? 'TRUE' : 'FALSE') . "\n";

--EXPECT--
FALSE
FALSE
TRUE
PKHb�\B&���-pear/test/Mail_Mime/tests/test_Bug_12466.phptnu�[���--TEST--
Bug #12466  Content-Transfer-Encoding checking
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$params = array(
    'text_encoding' => '7bit',
    'html_encoding' => '7bit',
);
$mime = new Mail_mime($params);
$mime->setTXTBody("ż");
$mime->setHTMLBody("z");
$body = $mime->getMessage();

preg_match_all('/Content-Transfer-Encoding: (.*)/', $body, $m);
echo trim($m[1][0])."\n".trim($m[1][1]);

?>
--EXPECT--
quoted-printable
7bit
PKIb�\Ԣ��``-pear/test/Mail_Mime/tests/test_Bug_21255.phptnu�[���--TEST--
Bug #21255  Boundary gets added twice
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$mime = new Mail_mime("\r\n");
$mime->setHTMLBody('html');
$mime->setTXTBody('text');
$mime->setContentType('multipart/alternative', array('boundary' => 'something'));

$msg = $mime->getMessage();

echo substr_count($msg, 'boundary=');

?>
--EXPECT--
1
PKIb�\;�{��,pear/test/Mail_Mime/tests/test_Bug_GH19.phptnu�[���--TEST--
Bug GH-19  Test boundary value with different headers()/get() call order
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

// Test get() before headers()

$mime = new Mail_mime("\r\n");
$mime->setHTMLBody('html');
$mime->setTXTBody('text');

$body = $mime->get();
$hdrs = $mime->headers(array(
        'From'    => 'test@domain.tld',
        'Subject' => 'Subject',
        'To'      => 'to@domain.tld'
));

preg_match('/boundary="([^"]+)/', $hdrs['Content-Type'], $matches);
$boundary = $matches[1];

echo substr_count($body, "--$boundary") . "\n";

// Test headers() before get()

$mime = new Mail_mime("\r\n");
$mime->setHTMLBody('html');
$mime->setTXTBody('text');

$hdrs = $mime->headers(array(
        'From'    => 'test@domain.tld',
        'Subject' => 'Subject',
        'To'      => 'to@domain.tld'
));
$body = $mime->get();

preg_match('/boundary="([^"]+)/', $hdrs['Content-Type'], $matches);
$boundary = $matches[1];

echo substr_count($body, "--$boundary");
--EXPECT--
3
3
PKIb�\�-b2-pear/test/Mail_Mime/tests/test_Bug_13032.phptnu�[���--TEST--
Bug #13032  Proper (different) boundary for nested parts
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";
$mime = new Mail_mime("\r\n");
$mime->setHTMLBody('html');
$mime->setTXTBody('text');
$mime->addAttachment('file.pdf', 'application/pdf', 'file.pdf', false, 'base64', 'inline');
$msg = $mime->getMessage();

if (preg_match_all('/boundary="([^"]+)"/', $msg, $matches)) {
    if (count($matches) == 2 && count($matches[1]) == 2 &&
        $matches[1][0] != $matches[1][1]) {
            print('OK');
    }
}
?>
--EXPECT--
OK
PKJb�\[��b��8pear/test/Mail_Mime/tests/content_transfer_encoding.phptnu�[���--TEST--
Test empty Content-Transfer-Encoding on multipart messages
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";
$mime = new Mail_mime("\r\n");
$mime->setParam('text_encoding', 'quoted-printable');
$mime->setParam('html_encoding', 'quoted-printable');
$mime->setParam('head_encoding', 'quoted-printable');

// This specific order used to set Content-Transfer-Encoding: quoted-printable
// which is invalid according to RFC 2045 on multipart messages
$mime->setTXTBody('text');
$mime->headers(array('From' => 'from@domain.tld'));
$mime->addAttachment('file.pdf', 'application/pdf', 'file.pdf', false, 'base64', 'inline');
echo $mime->txtHeaders();
list ($header, $body) = explode("\r\n\r\n", $mime->getMessage());
echo $header;
?>
--EXPECTF--
MIME-Version: 1.0
From: from@domain.tld
Content-Type: multipart/mixed;
 boundary="=_%x"
MIME-Version: 1.0
From: from@domain.tld
Content-Type: multipart/mixed;
 boundary="=_%x"
PKJb�\Qi�"---pear/test/Mail_Mime/tests/test_Bug_11381.phptnu�[���--TEST--
Bug #11381  Domain name is attached to content-id, trailing greater-than sign is not removed
--SKIPIF--
--FILE--
<?php
$from='Test User <user@from.example.com>';

require_once('Mail/mime.php');

$mime=new Mail_mime();

$body='<img src="test.gif"/>';

$mime->setHTMLBody($body);
$mime->setFrom($from);
$mime->addHTMLImage('','image/gif', 'test.gif', false);
$msg=$mime->get();

$header = preg_match('|Content-ID: <[0-9a-fA-F]+@from.example.com>|', $msg);
if (!$header){
    print("FAIL:\n");
    print($msg);
}else{
    print("OK");
}
--EXPECT--
OK
PKKb�\���o		-pear/test/Mail_Mime/tests/test_Bug_14529.phptnu�[���--TEST--
Bug #14529  basename() workaround
--SKIPIF--
--FILE--
<?php
include "Mail/mime.php";

$Mime = new Mail_mime();
// some text with polish Unicode letter at the beginning
$filename = base64_decode("xZtjaWVtYQ==");
$Mime->addAttachment('testfile', "text/plain", $filename, FALSE, 'base64', 'attachment', 'ISO-8859-1');

$content = $Mime->get();
$content = str_replace("\n", '', $content);

if (preg_match('/filename([^\s]+)/i', $content, $matches)) {
    echo $matches[1];
}
?>
--EXPECT--
*=ISO-8859-1''%C5%9Bciema;
PKKb�\�k�0-pear/test/Mail_Mime/tests/test_Bug_20564.phptnu�[���--TEST--
Bug #20564  Unsetting headers
--SKIPIF--
--FILE--
<?php
include("Mail/mime.php");

$mime = new Mail_mime;
$mime->setSubject('test');

$headers = $mime->headers(array('Subject' => null), true);
echo array_key_exists('Subject', $headers) ? '1' : '0';
--EXPECT--
0PKLb�\�
Ǟ		7pear/test/Mail_Mime/tests/test_linebreak_larger_76.phptnu�[���--TEST--
Test for correct linebreaks for lines _longer_ than 76 chars.
--SKIPIF--
--FILE--
<?php
error_reporting(E_ALL); // ignore E_STRICT

include("Mail/mime.php");
$text     = '12345678901234567890123456789012345678901234567890123456789012345678901234567890';
$params   = Array(
    'content_type' => 'text/plain',
    'encoding'     => 'quoted-printable',
);

for ($i=74; $i <= strlen($text); $i++) {
    $input = substr($text, 0, $i);
    $mimePart = new Mail_mimePart($input, $params);
    $encoded  =  $mimePart->encode();
    $output = $encoded['body'];
    printf("input: %02d: %s\n", strlen($input), $input);

    $lines = explode("\r\n", $output);
    for($j=0; $j < count($lines); $j++) {
        $line = $lines[$j];
        if ($j + 1 < count($lines)) {
            $line_vis = $line.'\r\n';
        } else {
            $line_vis = $line;
        }
        printf("output:%02d: %s\n", strlen($line), $line_vis);
    }
    print("---\n");
}
--EXPECT--
input: 74: 12345678901234567890123456789012345678901234567890123456789012345678901234
output:74: 12345678901234567890123456789012345678901234567890123456789012345678901234
---
input: 75: 123456789012345678901234567890123456789012345678901234567890123456789012345
output:75: 123456789012345678901234567890123456789012345678901234567890123456789012345
---
input: 76: 1234567890123456789012345678901234567890123456789012345678901234567890123456
output:76: 1234567890123456789012345678901234567890123456789012345678901234567890123456
---
input: 77: 12345678901234567890123456789012345678901234567890123456789012345678901234567
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:02: 67
---
input: 78: 123456789012345678901234567890123456789012345678901234567890123456789012345678
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:03: 678
---
input: 79: 1234567890123456789012345678901234567890123456789012345678901234567890123456789
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:04: 6789
---
input: 80: 12345678901234567890123456789012345678901234567890123456789012345678901234567890
output:76: 123456789012345678901234567890123456789012345678901234567890123456789012345=\r\n
output:05: 67890
---
PKLb�\~�66<pear/test/Routing/Symfony/Component/Routing/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Routing Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./vendor</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PKMb�\���
�
Upear/test/Routing/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Matcher;

use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Matcher\TraceableUrlMatcher;

class TraceableUrlMatcherTest extends \PHPUnit_Framework_TestCase
{
    public function test()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo', array(), array('_method' => 'POST')));
        $coll->add('bar', new Route('/bar/{id}', array(), array('id' => '\d+')));
        $coll->add('bar1', new Route('/bar/{name}', array(), array('id' => '\w+', '_method' => 'POST')));
        $coll->add('bar2', new Route('/foo', array(), array(), array(), 'baz'));
        $coll->add('bar3', new Route('/foo1', array(), array(), array(), 'baz'));
        $coll->add('bar4', new Route('/foo2', array(), array(), array(), 'baz', array(), array(), 'context.getMethod() == "GET"'));

        $context = new RequestContext();
        $context->setHost('baz');

        $matcher = new TraceableUrlMatcher($coll, $context);
        $traces = $matcher->getTraces('/babar');
        $this->assertEquals(array(0, 0, 0, 0, 0, 0), $this->getLevels($traces));

        $traces = $matcher->getTraces('/foo');
        $this->assertEquals(array(1, 0, 0, 2), $this->getLevels($traces));

        $traces = $matcher->getTraces('/bar/12');
        $this->assertEquals(array(0, 2), $this->getLevels($traces));

        $traces = $matcher->getTraces('/bar/dd');
        $this->assertEquals(array(0, 1, 1, 0, 0, 0), $this->getLevels($traces));

        $traces = $matcher->getTraces('/foo1');
        $this->assertEquals(array(0, 0, 0, 0, 2), $this->getLevels($traces));

        $context->setMethod('POST');
        $traces = $matcher->getTraces('/foo');
        $this->assertEquals(array(2), $this->getLevels($traces));

        $traces = $matcher->getTraces('/bar/dd');
        $this->assertEquals(array(0, 1, 2), $this->getLevels($traces));

        $traces = $matcher->getTraces('/foo2');
        $this->assertEquals(array(0, 0, 0, 0, 0, 1), $this->getLevels($traces));
    }

    public function testMatchRouteOnMultipleHosts()
    {
        $routes = new RouteCollection();
        $routes->add('first', new Route(
            '/mypath/',
            array('_controller' => 'MainBundle:Info:first'),
            array(),
            array(),
            'some.example.com'
        ));

        $routes->add('second', new Route(
            '/mypath/',
            array('_controller' => 'MainBundle:Info:second'),
            array(),
            array(),
            'another.example.com'
        ));

        $context = new RequestContext();
        $context->setHost('baz');

        $matcher = new TraceableUrlMatcher($routes, $context);

        $traces = $matcher->getTraces('/mypath/');
        $this->assertEquals(
            array(TraceableUrlMatcher::ROUTE_ALMOST_MATCHES, TraceableUrlMatcher::ROUTE_ALMOST_MATCHES),
            $this->getLevels($traces)
        );
    }

    public function getLevels($traces)
    {
        $levels = array();
        foreach ($traces as $trace) {
            $levels[] = $trace['level'];
        }

        return $levels;
    }
}
PKMb�\t�kT�B�BLpear/test/Routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Matcher;

use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\RequestContext;

class UrlMatcherTest extends \PHPUnit_Framework_TestCase
{
    public function testNoMethodSoAllowed()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo'));

        $matcher = new UrlMatcher($coll, new RequestContext());
        $matcher->match('/foo');
    }

    public function testMethodNotAllowed()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo', array(), array('_method' => 'post')));

        $matcher = new UrlMatcher($coll, new RequestContext());

        try {
            $matcher->match('/foo');
            $this->fail();
        } catch (MethodNotAllowedException $e) {
            $this->assertEquals(array('POST'), $e->getAllowedMethods());
        }
    }

    public function testHeadAllowedWhenRequirementContainsGet()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo', array(), array('_method' => 'get')));

        $matcher = new UrlMatcher($coll, new RequestContext('', 'head'));
        $matcher->match('/foo');
    }

    public function testMethodNotAllowedAggregatesAllowedMethods()
    {
        $coll = new RouteCollection();
        $coll->add('foo1', new Route('/foo', array(), array('_method' => 'post')));
        $coll->add('foo2', new Route('/foo', array(), array('_method' => 'put|delete')));

        $matcher = new UrlMatcher($coll, new RequestContext());

        try {
            $matcher->match('/foo');
            $this->fail();
        } catch (MethodNotAllowedException $e) {
            $this->assertEquals(array('POST', 'PUT', 'DELETE'), $e->getAllowedMethods());
        }
    }

    public function testMatch()
    {
        // test the patterns are matched and parameters are returned
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/foo/{bar}'));
        $matcher = new UrlMatcher($collection, new RequestContext());
        try {
            $matcher->match('/no-match');
            $this->fail();
        } catch (ResourceNotFoundException $e) {}
        $this->assertEquals(array('_route' => 'foo', 'bar' => 'baz'), $matcher->match('/foo/baz'));

        // test that defaults are merged
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/foo/{bar}', array('def' => 'test')));
        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertEquals(array('_route' => 'foo', 'bar' => 'baz', 'def' => 'test'), $matcher->match('/foo/baz'));

        // test that route "method" is ignored if no method is given in the context
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/foo', array(), array('_method' => 'GET|head')));
        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertInternalType('array', $matcher->match('/foo'));

        // route does not match with POST method context
        $matcher = new UrlMatcher($collection, new RequestContext('', 'post'));
        try {
            $matcher->match('/foo');
            $this->fail();
        } catch (MethodNotAllowedException $e) {}

        // route does match with GET or HEAD method context
        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertInternalType('array', $matcher->match('/foo'));
        $matcher = new UrlMatcher($collection, new RequestContext('', 'head'));
        $this->assertInternalType('array', $matcher->match('/foo'));

        // route with an optional variable as the first segment
        $collection = new RouteCollection();
        $collection->add('bar', new Route('/{bar}/foo', array('bar' => 'bar'), array('bar' => 'foo|bar')));
        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertEquals(array('_route' => 'bar', 'bar' => 'bar'), $matcher->match('/bar/foo'));
        $this->assertEquals(array('_route' => 'bar', 'bar' => 'foo'), $matcher->match('/foo/foo'));

        $collection = new RouteCollection();
        $collection->add('bar', new Route('/{bar}', array('bar' => 'bar'), array('bar' => 'foo|bar')));
        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertEquals(array('_route' => 'bar', 'bar' => 'foo'), $matcher->match('/foo'));
        $this->assertEquals(array('_route' => 'bar', 'bar' => 'bar'), $matcher->match('/'));

        // route with only optional variables
        $collection = new RouteCollection();
        $collection->add('bar', new Route('/{foo}/{bar}', array('foo' => 'foo', 'bar' => 'bar'), array()));
        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertEquals(array('_route' => 'bar', 'foo' => 'foo', 'bar' => 'bar'), $matcher->match('/'));
        $this->assertEquals(array('_route' => 'bar', 'foo' => 'a', 'bar' => 'bar'), $matcher->match('/a'));
        $this->assertEquals(array('_route' => 'bar', 'foo' => 'a', 'bar' => 'b'), $matcher->match('/a/b'));
    }

    public function testMatchWithPrefixes()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/{foo}'));
        $collection->addPrefix('/b');
        $collection->addPrefix('/a');

        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertEquals(array('_route' => 'foo', 'foo' => 'foo'), $matcher->match('/a/b/foo'));
    }

    public function testMatchWithDynamicPrefix()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/{foo}'));
        $collection->addPrefix('/b');
        $collection->addPrefix('/{_locale}');

        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertEquals(array('_locale' => 'fr', '_route' => 'foo', 'foo' => 'foo'), $matcher->match('/fr/b/foo'));
    }

    public function testMatchSpecialRouteName()
    {
        $collection = new RouteCollection();
        $collection->add('$péß^a|', new Route('/bar'));

        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertEquals(array('_route' => '$péß^a|'), $matcher->match('/bar'));
    }

    public function testMatchNonAlpha()
    {
        $collection = new RouteCollection();
        $chars = '!"$%éà &\'()*+,./:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\[]^_`abcdefghijklmnopqrstuvwxyz{|}~-';
        $collection->add('foo', new Route('/{foo}/bar', array(), array('foo' => '['.preg_quote($chars).']+')));

        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertEquals(array('_route' => 'foo', 'foo' => $chars), $matcher->match('/'.rawurlencode($chars).'/bar'));
        $this->assertEquals(array('_route' => 'foo', 'foo' => $chars), $matcher->match('/'.strtr($chars, array('%' => '%25')).'/bar'));
    }

    public function testMatchWithDotMetacharacterInRequirements()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/{foo}/bar', array(), array('foo' => '.+')));

        $matcher = new UrlMatcher($collection, new RequestContext());
        $this->assertEquals(array('_route' => 'foo', 'foo' => "\n"), $matcher->match('/'.urlencode("\n").'/bar'), 'linefeed character is matched');
    }

    public function testMatchOverriddenRoute()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/foo'));

        $collection1 = new RouteCollection();
        $collection1->add('foo', new Route('/foo1'));

        $collection->addCollection($collection1);

        $matcher = new UrlMatcher($collection, new RequestContext());

        $this->assertEquals(array('_route' => 'foo'), $matcher->match('/foo1'));
        $this->setExpectedException('Symfony\Component\Routing\Exception\ResourceNotFoundException');
        $this->assertEquals(array(), $matcher->match('/foo'));
    }

    public function testMatchRegression()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo/{foo}'));
        $coll->add('bar', new Route('/foo/bar/{foo}'));

        $matcher = new UrlMatcher($coll, new RequestContext());
        $this->assertEquals(array('foo' => 'bar', '_route' => 'bar'), $matcher->match('/foo/bar/bar'));

        $collection = new RouteCollection();
        $collection->add('foo', new Route('/{bar}'));
        $matcher = new UrlMatcher($collection, new RequestContext());
        try {
            $matcher->match('/');
            $this->fail();
        } catch (ResourceNotFoundException $e) {
        }
    }

    public function testDefaultRequirementForOptionalVariables()
    {
        $coll = new RouteCollection();
        $coll->add('test', new Route('/{page}.{_format}', array('page' => 'index', '_format' => 'html')));

        $matcher = new UrlMatcher($coll, new RequestContext());
        $this->assertEquals(array('page' => 'my-page', '_format' => 'xml', '_route' => 'test'), $matcher->match('/my-page.xml'));
    }

    public function testMatchingIsEager()
    {
        $coll = new RouteCollection();
        $coll->add('test', new Route('/{foo}-{bar}-', array(), array('foo' => '.+', 'bar' => '.+')));

        $matcher = new UrlMatcher($coll, new RequestContext());
        $this->assertEquals(array('foo' => 'text1-text2-text3', 'bar' => 'text4', '_route' => 'test'), $matcher->match('/text1-text2-text3-text4-'));
    }

    public function testAdjacentVariables()
    {
        $coll = new RouteCollection();
        $coll->add('test', new Route('/{w}{x}{y}{z}.{_format}', array('z' => 'default-z', '_format' => 'html'), array('y' => 'y|Y')));

        $matcher = new UrlMatcher($coll, new RequestContext());
        // 'w' eagerly matches as much as possible and the other variables match the remaining chars.
        // This also shows that the variables w-z must all exclude the separating char (the dot '.' in this case) by default requirement.
        // Otherwise they would also consume '.xml' and _format would never match as it's an optional variable.
        $this->assertEquals(array('w' => 'wwwww', 'x' => 'x', 'y' => 'Y', 'z' => 'Z','_format' => 'xml', '_route' => 'test'), $matcher->match('/wwwwwxYZ.xml'));
        // As 'y' has custom requirement and can only be of value 'y|Y', it will leave  'ZZZ' to variable z.
        // So with carefully chosen requirements adjacent variables, can be useful.
        $this->assertEquals(array('w' => 'wwwww', 'x' => 'x', 'y' => 'y', 'z' => 'ZZZ','_format' => 'html', '_route' => 'test'), $matcher->match('/wwwwwxyZZZ'));
        // z and _format are optional.
        $this->assertEquals(array('w' => 'wwwww', 'x' => 'x', 'y' => 'y', 'z' => 'default-z','_format' => 'html', '_route' => 'test'), $matcher->match('/wwwwwxy'));

        $this->setExpectedException('Symfony\Component\Routing\Exception\ResourceNotFoundException');
        $matcher->match('/wxy.html');
    }

    public function testOptionalVariableWithNoRealSeparator()
    {
        $coll = new RouteCollection();
        $coll->add('test', new Route('/get{what}', array('what' => 'All')));
        $matcher = new UrlMatcher($coll, new RequestContext());

        $this->assertEquals(array('what' => 'All', '_route' => 'test'), $matcher->match('/get'));
        $this->assertEquals(array('what' => 'Sites', '_route' => 'test'), $matcher->match('/getSites'));

        // Usually the character in front of an optional parameter can be left out, e.g. with pattern '/get/{what}' just '/get' would match.
        // But here the 't' in 'get' is not a separating character, so it makes no sense to match without it.
        $this->setExpectedException('Symfony\Component\Routing\Exception\ResourceNotFoundException');
        $matcher->match('/ge');
    }

    public function testRequiredVariableWithNoRealSeparator()
    {
        $coll = new RouteCollection();
        $coll->add('test', new Route('/get{what}Suffix'));
        $matcher = new UrlMatcher($coll, new RequestContext());

        $this->assertEquals(array('what' => 'Sites', '_route' => 'test'), $matcher->match('/getSitesSuffix'));
    }

    public function testDefaultRequirementOfVariable()
    {
        $coll = new RouteCollection();
        $coll->add('test', new Route('/{page}.{_format}'));
        $matcher = new UrlMatcher($coll, new RequestContext());

        $this->assertEquals(array('page' => 'index', '_format' => 'mobile.html', '_route' => 'test'), $matcher->match('/index.mobile.html'));
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
     */
    public function testDefaultRequirementOfVariableDisallowsSlash()
    {
        $coll = new RouteCollection();
        $coll->add('test', new Route('/{page}.{_format}'));
        $matcher = new UrlMatcher($coll, new RequestContext());

        $matcher->match('/index.sl/ash');
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
     */
    public function testDefaultRequirementOfVariableDisallowsNextSeparator()
    {
        $coll = new RouteCollection();
        $coll->add('test', new Route('/{page}.{_format}', array(), array('_format' => 'html|xml')));
        $matcher = new UrlMatcher($coll, new RequestContext());

        $matcher->match('/do.t.html');
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
     */
    public function testSchemeRequirement()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo', array(), array('_scheme' => 'https')));
        $matcher = new UrlMatcher($coll, new RequestContext());
        $matcher->match('/foo');
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
     */
    public function testCondition()
    {
        $coll = new RouteCollection();
        $route = new Route('/foo');
        $route->setCondition('context.getMethod() == "POST"');
        $coll->add('foo', $route);
        $matcher = new UrlMatcher($coll, new RequestContext());
        $matcher->match('/foo');
    }

    public function testDecodeOnce()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo/{foo}'));

        $matcher = new UrlMatcher($coll, new RequestContext());
        $this->assertEquals(array('foo' => 'bar%23', '_route' => 'foo'), $matcher->match('/foo/bar%2523'));
    }

    public function testCannotRelyOnPrefix()
    {
        $coll = new RouteCollection();

        $subColl = new RouteCollection();
        $subColl->add('bar', new Route('/bar'));
        $subColl->addPrefix('/prefix');
        // overwrite the pattern, so the prefix is not valid anymore for this route in the collection
        $subColl->get('bar')->setPattern('/new');

        $coll->addCollection($subColl);

        $matcher = new UrlMatcher($coll, new RequestContext());
        $this->assertEquals(array('_route' => 'bar'), $matcher->match('/new'));
    }

    public function testWithHost()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo/{foo}', array(), array(), array(), '{locale}.example.com'));

        $matcher = new UrlMatcher($coll, new RequestContext('', 'GET', 'en.example.com'));
        $this->assertEquals(array('foo' => 'bar', '_route' => 'foo', 'locale' => 'en'), $matcher->match('/foo/bar'));
    }

    public function testWithHostOnRouteCollection()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo/{foo}'));
        $coll->add('bar', new Route('/bar/{foo}', array(), array(), array(), '{locale}.example.net'));
        $coll->setHost('{locale}.example.com');

        $matcher = new UrlMatcher($coll, new RequestContext('', 'GET', 'en.example.com'));
        $this->assertEquals(array('foo' => 'bar', '_route' => 'foo', 'locale' => 'en'), $matcher->match('/foo/bar'));

        $matcher = new UrlMatcher($coll, new RequestContext('', 'GET', 'en.example.com'));
        $this->assertEquals(array('foo' => 'bar', '_route' => 'bar', 'locale' => 'en'), $matcher->match('/bar/bar'));
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
     */
    public function testWithOutHostHostDoesNotMatch()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo/{foo}', array(), array(), array(), '{locale}.example.com'));

        $matcher = new UrlMatcher($coll, new RequestContext('', 'GET', 'example.com'));
        $matcher->match('/foo/bar');
    }
}
PKMb�\�̼�aaRpear/test/Routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Matcher;

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Matcher\ApacheUrlMatcher;

class ApacheUrlMatcherTest extends \PHPUnit_Framework_TestCase
{
    protected $server;

    protected function setUp()
    {
        $this->server = $_SERVER;
    }

    protected function tearDown()
    {
        $_SERVER = $this->server;
    }

    /**
     * @dataProvider getMatchData
     */
    public function testMatch($name, $pathinfo, $server, $expect)
    {
        $collection = new RouteCollection();
        $context = new RequestContext();
        $matcher = new ApacheUrlMatcher($collection, $context);

        $_SERVER = $server;

        $result = $matcher->match($pathinfo, $server);
        $this->assertSame(var_export($expect, true), var_export($result, true));
    }

    public function getMatchData()
    {
        return array(
            array(
                'Simple route',
                '/hello/world',
                array(
                    '_ROUTING_route' => 'hello',
                    '_ROUTING_param__controller' => 'AcmeBundle:Default:index',
                    '_ROUTING_param_name' => 'world',
                ),
                array(
                    '_controller' => 'AcmeBundle:Default:index',
                    'name' => 'world',
                    '_route' => 'hello',
                ),
            ),
            array(
                'Route with params and defaults',
                '/hello/hugo',
                array(
                    '_ROUTING_route' => 'hello',
                    '_ROUTING_param__controller' => 'AcmeBundle:Default:index',
                    '_ROUTING_param_name' => 'hugo',
                    '_ROUTING_default_name' => 'world',
                ),
                array(
                    'name' => 'hugo',
                    '_controller' => 'AcmeBundle:Default:index',
                    '_route' => 'hello',
                ),
            ),
            array(
                'Route with defaults only',
                '/hello',
                array(
                    '_ROUTING_route' => 'hello',
                    '_ROUTING_param__controller' => 'AcmeBundle:Default:index',
                    '_ROUTING_default_name' => 'world',
                ),
                array(
                    'name' => 'world',
                    '_controller' => 'AcmeBundle:Default:index',
                    '_route' => 'hello',
                ),
            ),
            array(
                'Redirect with many ignored attributes',
                '/legacy/{cat1}/{cat2}/{id}.html',
                array(
                    '_ROUTING_route' => 'product_view',
                    '_ROUTING_param__controller' => 'FrameworkBundle:Redirect:redirect',
                    '_ROUTING_default_ignoreAttributes[0]' => 'attr_a',
                    '_ROUTING_default_ignoreAttributes[1]' => 'attr_b',
                ),
                array(
                    'ignoreAttributes' => array('attr_a', 'attr_b'),
                    '_controller' => 'FrameworkBundle:Redirect:redirect',
                    '_route' => 'product_view',
                )
            ),
            array(
                'REDIRECT_ envs',
                '/hello/world',
                array(
                    'REDIRECT__ROUTING_route' => 'hello',
                    'REDIRECT__ROUTING_param__controller' => 'AcmeBundle:Default:index',
                    'REDIRECT__ROUTING_param_name' => 'world',
                ),
                array(
                    '_controller' => 'AcmeBundle:Default:index',
                    'name' => 'world',
                    '_route' => 'hello',
                ),
            ),
            array(
                'REDIRECT_REDIRECT_ envs',
                '/hello/world',
                array(
                    'REDIRECT_REDIRECT__ROUTING_route' => 'hello',
                    'REDIRECT_REDIRECT__ROUTING_param__controller' => 'AcmeBundle:Default:index',
                    'REDIRECT_REDIRECT__ROUTING_param_name' => 'world',
                ),
                array(
                    '_controller' => 'AcmeBundle:Default:index',
                    'name' => 'world',
                    '_route' => 'hello',
                ),
            ),
            array(
                'REDIRECT_REDIRECT_ envs',
                '/hello/world',
                array(
                    'REDIRECT_REDIRECT__ROUTING_route' => 'hello',
                    'REDIRECT_REDIRECT__ROUTING_param__controller' => 'AcmeBundle:Default:index',
                    'REDIRECT_REDIRECT__ROUTING_param_name' => 'world',
                ),
                array(
                    '_controller' => 'AcmeBundle:Default:index',
                    'name' => 'world',
                    '_route' => 'hello',
                ),
            )
        );
    }
}
PKNb�\)�#0%%Ypear/test/Routing/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Matcher\Dumper;

use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;

class PhpMatcherDumperTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \LogicException
     */
    public function testDumpWhenSchemeIsUsedWithoutAProperDumper()
    {
        $collection = new RouteCollection();
        $collection->add('secure', new Route(
            '/secure',
            array(),
            array('_scheme' => 'https')
        ));
        $dumper = new PhpMatcherDumper($collection);
        $dumper->dump();
    }

    /**
     * @dataProvider getRouteCollections
     */
    public function testDump(RouteCollection $collection, $fixture, $options = array())
    {
        $basePath = __DIR__.'/../../Fixtures/dumper/';

        $dumper = new PhpMatcherDumper($collection);
        $this->assertStringEqualsFile($basePath.$fixture, $dumper->dump($options), '->dump() correctly dumps routes as optimized PHP code.');
    }

    public function getRouteCollections()
    {
        /* test case 1 */

        $collection = new RouteCollection();

        $collection->add('overridden', new Route('/overridden'));

        // defaults and requirements
        $collection->add('foo', new Route(
            '/foo/{bar}',
            array('def' => 'test'),
            array('bar' => 'baz|symfony')
        ));
        // method requirement
        $collection->add('bar', new Route(
            '/bar/{foo}',
            array(),
            array('_method' => 'GET|head')
        ));
        // GET method requirement automatically adds HEAD as valid
        $collection->add('barhead', new Route(
            '/barhead/{foo}',
            array(),
            array('_method' => 'GET')
        ));
        // simple
        $collection->add('baz', new Route(
            '/test/baz'
        ));
        // simple with extension
        $collection->add('baz2', new Route(
            '/test/baz.html'
        ));
        // trailing slash
        $collection->add('baz3', new Route(
            '/test/baz3/'
        ));
        // trailing slash with variable
        $collection->add('baz4', new Route(
            '/test/{foo}/'
        ));
        // trailing slash and method
        $collection->add('baz5', new Route(
            '/test/{foo}/',
            array(),
            array('_method' => 'post')
        ));
        // complex name
        $collection->add('baz.baz6', new Route(
            '/test/{foo}/',
            array(),
            array('_method' => 'put')
        ));
        // defaults without variable
        $collection->add('foofoo', new Route(
            '/foofoo',
            array('def' => 'test')
        ));
        // pattern with quotes
        $collection->add('quoter', new Route(
            '/{quoter}',
            array(),
            array('quoter' => '[\']+')
        ));
        // space in pattern
        $collection->add('space', new Route(
            '/spa ce'
        ));

        // prefixes
        $collection1 = new RouteCollection();
        $collection1->add('overridden', new Route('/overridden1'));
        $collection1->add('foo1', new Route('/{foo}'));
        $collection1->add('bar1', new Route('/{bar}'));
        $collection1->addPrefix('/b\'b');
        $collection2 = new RouteCollection();
        $collection2->addCollection($collection1);
        $collection2->add('overridden', new Route('/{var}', array(), array('var' => '.*')));
        $collection1 = new RouteCollection();
        $collection1->add('foo2', new Route('/{foo1}'));
        $collection1->add('bar2', new Route('/{bar1}'));
        $collection1->addPrefix('/b\'b');
        $collection2->addCollection($collection1);
        $collection2->addPrefix('/a');
        $collection->addCollection($collection2);

        // overridden through addCollection() and multiple sub-collections with no own prefix
        $collection1 = new RouteCollection();
        $collection1->add('overridden2', new Route('/old'));
        $collection1->add('helloWorld', new Route('/hello/{who}', array('who' => 'World!')));
        $collection2 = new RouteCollection();
        $collection3 = new RouteCollection();
        $collection3->add('overridden2', new Route('/new'));
        $collection3->add('hey', new Route('/hey/'));
        $collection2->addCollection($collection3);
        $collection1->addCollection($collection2);
        $collection1->addPrefix('/multi');
        $collection->addCollection($collection1);

        // "dynamic" prefix
        $collection1 = new RouteCollection();
        $collection1->add('foo3', new Route('/{foo}'));
        $collection1->add('bar3', new Route('/{bar}'));
        $collection1->addPrefix('/b');
        $collection1->addPrefix('{_locale}');
        $collection->addCollection($collection1);

        // route between collections
        $collection->add('ababa', new Route('/ababa'));

        // collection with static prefix but only one route
        $collection1 = new RouteCollection();
        $collection1->add('foo4', new Route('/{foo}'));
        $collection1->addPrefix('/aba');
        $collection->addCollection($collection1);

        // prefix and host

        $collection1 = new RouteCollection();

        $route1 = new Route('/route1', array(), array(), array(), 'a.example.com');
        $collection1->add('route1', $route1);

        $collection2 = new RouteCollection();

        $route2 = new Route('/c2/route2', array(), array(), array(), 'a.example.com');
        $collection1->add('route2', $route2);

        $route3 = new Route('/c2/route3', array(), array(), array(), 'b.example.com');
        $collection1->add('route3', $route3);

        $route4 = new Route('/route4', array(), array(), array(), 'a.example.com');
        $collection1->add('route4', $route4);

        $route5 = new Route('/route5', array(), array(), array(), 'c.example.com');
        $collection1->add('route5', $route5);

        $route6 = new Route('/route6', array(), array(), array(), null);
        $collection1->add('route6', $route6);

        $collection->addCollection($collection1);

        // host and variables

        $collection1 = new RouteCollection();

        $route11 = new Route('/route11', array(), array(), array(), '{var1}.example.com');
        $collection1->add('route11', $route11);

        $route12 = new Route('/route12', array('var1' => 'val'), array(), array(), '{var1}.example.com');
        $collection1->add('route12', $route12);

        $route13 = new Route('/route13/{name}', array(), array(), array(), '{var1}.example.com');
        $collection1->add('route13', $route13);

        $route14 = new Route('/route14/{name}', array('var1' => 'val'), array(), array(), '{var1}.example.com');
        $collection1->add('route14', $route14);

        $route15 = new Route('/route15/{name}', array(), array(), array(), 'c.example.com');
        $collection1->add('route15', $route15);

        $route16 = new Route('/route16/{name}', array('var1' => 'val'), array(), array(), null);
        $collection1->add('route16', $route16);

        $route17 = new Route('/route17', array(), array(), array(), null);
        $collection1->add('route17', $route17);

        $collection->addCollection($collection1);

        // multiple sub-collections with a single route and a prefix each
        $collection1 = new RouteCollection();
        $collection1->add('a', new Route('/a...'));
        $collection2 = new RouteCollection();
        $collection2->add('b', new Route('/{var}'));
        $collection3 = new RouteCollection();
        $collection3->add('c', new Route('/{var}'));
        $collection3->addPrefix('/c');
        $collection2->addCollection($collection3);
        $collection2->addPrefix('/b');
        $collection1->addCollection($collection2);
        $collection1->addPrefix('/a');
        $collection->addCollection($collection1);

        /* test case 2 */

        $redirectCollection = clone $collection;

        // force HTTPS redirection
        $redirectCollection->add('secure', new Route(
            '/secure',
            array(),
            array('_scheme' => 'https')
        ));

        // force HTTP redirection
        $redirectCollection->add('nonsecure', new Route(
            '/nonsecure',
            array(),
            array('_scheme' => 'http')
        ));

        /* test case 3 */

        $rootprefixCollection = new RouteCollection();
        $rootprefixCollection->add('static', new Route('/test'));
        $rootprefixCollection->add('dynamic', new Route('/{var}'));
        $rootprefixCollection->addPrefix('rootprefix');
        $route = new Route('/with-condition');
        $route->setCondition('context.getMethod() == "GET"');
        $rootprefixCollection->add('with-condition', $route);

        return array(
           array($collection, 'url_matcher1.php', array()),
           array($redirectCollection, 'url_matcher2.php', array('base_class' => 'Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher')),
           array($rootprefixCollection, 'url_matcher3.php', array())
        );
    }
}
PKNb�\�IQ��\pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Matcher\Dumper;

use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Matcher\Dumper\ApacheMatcherDumper;

class ApacheMatcherDumperTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = realpath(__DIR__.'/../../Fixtures/');
    }

    public function testDump()
    {
        $dumper = new ApacheMatcherDumper($this->getRouteCollection());

        $this->assertStringEqualsFile(self::$fixturesPath.'/dumper/url_matcher1.apache', $dumper->dump(), '->dump() dumps basic routes to the correct apache format.');
    }

    /**
     * @dataProvider provideEscapeFixtures
     */
    public function testEscapePattern($src, $dest, $char, $with, $message)
    {
        $r = new \ReflectionMethod(new ApacheMatcherDumper($this->getRouteCollection()), 'escape');
        $r->setAccessible(true);
        $this->assertEquals($dest, $r->invoke(null, $src, $char, $with), $message);
    }

    public function provideEscapeFixtures()
    {
        return array(
            array('foo', 'foo', ' ', '-', 'Preserve string that should not be escaped'),
            array('fo-o', 'fo-o', ' ', '-', 'Preserve string that should not be escaped'),
            array('fo o', 'fo- o', ' ', '-', 'Escape special characters'),
            array('fo-- o', 'fo--- o', ' ', '-', 'Escape special characters'),
            array('fo- o', 'fo- o', ' ', '-', 'Do not escape already escaped string'),
        );
    }

    public function testEscapeScriptName()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/foo'));
        $dumper = new ApacheMatcherDumper($collection);
        $this->assertStringEqualsFile(self::$fixturesPath.'/dumper/url_matcher2.apache', $dumper->dump(array('script_name' => 'ap p_d\ ev.php')));
    }

    private function getRouteCollection()
    {
        $collection = new RouteCollection();

        // defaults and requirements
        $collection->add('foo', new Route(
            '/foo/{bar}',
            array('def' => 'test'),
            array('bar' => 'baz|symfony')
        ));
        // defaults parameters in pattern
        $collection->add('foobar', new Route(
            '/foo/{bar}',
            array('bar' => 'toto')
        ));
        // method requirement
        $collection->add('bar', new Route(
            '/bar/{foo}',
            array(),
            array('_method' => 'GET|head')
        ));
        // method requirement (again)
        $collection->add('baragain', new Route(
            '/baragain/{foo}',
            array(),
            array('_method' => 'get|post')
        ));
        // simple
        $collection->add('baz', new Route(
            '/test/baz'
        ));
        // simple with extension
        $collection->add('baz2', new Route(
            '/test/baz.html'
        ));
        // trailing slash
        $collection->add('baz3', new Route(
            '/test/baz3/'
        ));
        // trailing slash with variable
        $collection->add('baz4', new Route(
            '/test/{foo}/'
        ));
        // trailing slash and safe method
        $collection->add('baz5', new Route(
            '/test/{foo}/',
            array(),
            array('_method' => 'get')
        ));
        // trailing slash and unsafe method
        $collection->add('baz5unsafe', new Route(
            '/testunsafe/{foo}/',
            array(),
            array('_method' => 'post')
        ));
        // complex
        $collection->add('baz6', new Route(
            '/test/baz',
            array('foo' => 'bar baz')
        ));
        // space in path
        $collection->add('baz7', new Route(
            '/te st/baz'
        ));
        // space preceded with \ in path
        $collection->add('baz8', new Route(
            '/te\\ st/baz'
        ));
        // space preceded with \ in requirement
        $collection->add('baz9', new Route(
            '/test/{baz}',
            array(),
            array(
                'baz' => 'te\\\\ st',
            )
        ));

        $collection1 = new RouteCollection();

        $route1 = new Route('/route1', array(), array(), array(), 'a.example.com');
        $collection1->add('route1', $route1);

        $collection2 = new RouteCollection();

        $route2 = new Route('/route2', array(), array(), array(), 'a.example.com');
        $collection2->add('route2', $route2);

        $route3 = new Route('/route3', array(), array(), array(), 'b.example.com');
        $collection2->add('route3', $route3);

        $collection2->addPrefix('/c2');
        $collection1->addCollection($collection2);

        $route4 = new Route('/route4', array(), array(), array(), 'a.example.com');
        $collection1->add('route4', $route4);

        $route5 = new Route('/route5', array(), array(), array(), 'c.example.com');
        $collection1->add('route5', $route5);

        $route6 = new Route('/route6', array(), array(), array(), null);
        $collection1->add('route6', $route6);

        $collection->addCollection($collection1);

        // host and variables

        $collection1 = new RouteCollection();

        $route11 = new Route('/route11', array(), array(), array(), '{var1}.example.com');
        $collection1->add('route11', $route11);

        $route12 = new Route('/route12', array('var1' => 'val'), array(), array(), '{var1}.example.com');
        $collection1->add('route12', $route12);

        $route13 = new Route('/route13/{name}', array(), array(), array(), '{var1}.example.com');
        $collection1->add('route13', $route13);

        $route14 = new Route('/route14/{name}', array('var1' => 'val'), array(), array(), '{var1}.example.com');
        $collection1->add('route14', $route14);

        $route15 = new Route('/route15/{name}', array(), array(), array(), 'c.example.com');
        $collection1->add('route15', $route15);

        $route16 = new Route('/route16/{name}', array('var1' => 'val'), array(), array(), null);
        $collection1->add('route16', $route16);

        $route17 = new Route('/route17', array(), array(), array(), null);
        $collection1->add('route17', $route17);

        $collection->addCollection($collection1);

        return $collection;
    }
}
PKOb�\U���Ypear/test/Routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Matcher\Dumper;

use Symfony\Component\Routing\Matcher\Dumper\DumperCollection;

class DumperCollectionTest extends \PHPUnit_Framework_TestCase
{
    public function testGetRoot()
    {
        $a = new DumperCollection();

        $b = new DumperCollection();
        $a->add($b);

        $c = new DumperCollection();
        $b->add($c);

        $d = new DumperCollection();
        $c->add($d);

        $this->assertSame($a, $c->getRoot());
    }
}
PKOb�\ȁ@���_pear/test/Routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Matcher\Dumper;

use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\Matcher\Dumper\DumperPrefixCollection;
use Symfony\Component\Routing\Matcher\Dumper\DumperRoute;
use Symfony\Component\Routing\Matcher\Dumper\DumperCollection;

class DumperPrefixCollectionTest extends \PHPUnit_Framework_TestCase
{
    public function testAddPrefixRoute()
    {
        $coll = new DumperPrefixCollection();
        $coll->setPrefix('');

        $route = new DumperRoute('bar', new Route('/foo/bar'));
        $coll = $coll->addPrefixRoute($route);

        $route = new DumperRoute('bar2', new Route('/foo/bar'));
        $coll = $coll->addPrefixRoute($route);

        $route = new DumperRoute('qux', new Route('/foo/qux'));
        $coll = $coll->addPrefixRoute($route);

        $route = new DumperRoute('bar3', new Route('/foo/bar'));
        $coll = $coll->addPrefixRoute($route);

        $route = new DumperRoute('bar4', new Route(''));
        $result = $coll->addPrefixRoute($route);

        $expect = <<<'EOF'
            |-coll /
            | |-coll /f
            | | |-coll /fo
            | | | |-coll /foo
            | | | | |-coll /foo/
            | | | | | |-coll /foo/b
            | | | | | | |-coll /foo/ba
            | | | | | | | |-coll /foo/bar
            | | | | | | | | |-route bar /foo/bar
            | | | | | | | | |-route bar2 /foo/bar
            | | | | | |-coll /foo/q
            | | | | | | |-coll /foo/qu
            | | | | | | | |-coll /foo/qux
            | | | | | | | | |-route qux /foo/qux
            | | | | | |-coll /foo/b
            | | | | | | |-coll /foo/ba
            | | | | | | | |-coll /foo/bar
            | | | | | | | | |-route bar3 /foo/bar
            | |-route bar4 /

EOF;

        $this->assertSame($expect, $this->collectionToString($result->getRoot(), '            '));
    }

    public function testMergeSlashNodes()
    {
        $coll = new DumperPrefixCollection();
        $coll->setPrefix('');

        $route = new DumperRoute('bar', new Route('/foo/bar'));
        $coll = $coll->addPrefixRoute($route);

        $route = new DumperRoute('bar2', new Route('/foo/bar'));
        $coll = $coll->addPrefixRoute($route);

        $route = new DumperRoute('qux', new Route('/foo/qux'));
        $coll = $coll->addPrefixRoute($route);

        $route = new DumperRoute('bar3', new Route('/foo/bar'));
        $result = $coll->addPrefixRoute($route);

        $result->getRoot()->mergeSlashNodes();

        $expect = <<<'EOF'
            |-coll /f
            | |-coll /fo
            | | |-coll /foo
            | | | |-coll /foo/b
            | | | | |-coll /foo/ba
            | | | | | |-coll /foo/bar
            | | | | | | |-route bar /foo/bar
            | | | | | | |-route bar2 /foo/bar
            | | | |-coll /foo/q
            | | | | |-coll /foo/qu
            | | | | | |-coll /foo/qux
            | | | | | | |-route qux /foo/qux
            | | | |-coll /foo/b
            | | | | |-coll /foo/ba
            | | | | | |-coll /foo/bar
            | | | | | | |-route bar3 /foo/bar

EOF;

        $this->assertSame($expect, $this->collectionToString($result->getRoot(), '            '));
    }

    private function collectionToString(DumperCollection $collection, $prefix)
    {
        $string = '';
        foreach ($collection as $route) {
            if ($route instanceof DumperCollection) {
                $string .= sprintf("%s|-coll %s\n", $prefix, $route->getPrefix());
                $string .= $this->collectionToString($route, $prefix.'| ');
            } else {
                $string .= sprintf("%s|-route %s %s\n", $prefix, $route->getName(), $route->getRoute()->getPath());
            }
        }

        return $string;
    }
}
PKOb�\A ���Xpear/test/Routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Matcher;

use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\RequestContext;

class RedirectableUrlMatcherTest extends \PHPUnit_Framework_TestCase
{
    public function testRedirectWhenNoSlash()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo/'));

        $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, new RequestContext()));
        $matcher->expects($this->once())->method('redirect');
        $matcher->match('/foo');
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
     */
    public function testRedirectWhenNoSlashForNonSafeMethod()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo/'));

        $context = new RequestContext();
        $context->setMethod('POST');
        $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, $context));
        $matcher->match('/foo');
    }

    public function testSchemeRedirect()
    {
        $coll = new RouteCollection();
        $coll->add('foo', new Route('/foo', array(), array('_scheme' => 'https')));

        $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, new RequestContext()));
        $matcher
            ->expects($this->once())
            ->method('redirect')
            ->with('/foo', 'foo', 'https')
            ->will($this->returnValue(array('_route' => 'foo')))
        ;
        $matcher->match('/foo');
    }
}
PKPb�\��@pear/test/Routing/Symfony/Component/Routing/Tests/RouterTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests;

use Symfony\Component\Routing\Router;
use Symfony\Component\HttpFoundation\Request;

class RouterTest extends \PHPUnit_Framework_TestCase
{
    private $router = null;

    private $loader = null;

    protected function setUp()
    {
        $this->loader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface');
        $this->router = new Router($this->loader, 'routing.yml');
    }

    public function testSetOptionsWithSupportedOptions()
    {
        $this->router->setOptions(array(
            'cache_dir' => './cache',
            'debug' => true,
            'resource_type' => 'ResourceType'
        ));

        $this->assertSame('./cache', $this->router->getOption('cache_dir'));
        $this->assertTrue($this->router->getOption('debug'));
        $this->assertSame('ResourceType', $this->router->getOption('resource_type'));
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage The Router does not support the following options: "option_foo", "option_bar"
     */
    public function testSetOptionsWithUnsupportedOptions()
    {
        $this->router->setOptions(array(
            'cache_dir' => './cache',
            'option_foo' => true,
            'option_bar' => 'baz',
            'resource_type' => 'ResourceType'
        ));
    }

    public function testSetOptionWithSupportedOption()
    {
        $this->router->setOption('cache_dir', './cache');

        $this->assertSame('./cache', $this->router->getOption('cache_dir'));
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage The Router does not support the "option_foo" option
     */
    public function testSetOptionWithUnsupportedOption()
    {
        $this->router->setOption('option_foo', true);
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage The Router does not support the "option_foo" option
     */
    public function testGetOptionWithUnsupportedOption()
    {
        $this->router->getOption('option_foo', true);
    }

    public function testThatRouteCollectionIsLoaded()
    {
        $this->router->setOption('resource_type', 'ResourceType');

        $routeCollection = $this->getMock('Symfony\Component\Routing\RouteCollection');

        $this->loader->expects($this->once())
            ->method('load')->with('routing.yml', 'ResourceType')
            ->will($this->returnValue($routeCollection));

        $this->assertSame($routeCollection, $this->router->getRouteCollection());
    }

    /**
     * @dataProvider provideMatcherOptionsPreventingCaching
     */
    public function testMatcherIsCreatedIfCacheIsNotConfigured($option)
    {
        $this->router->setOption($option, null);

        $this->loader->expects($this->once())
            ->method('load')->with('routing.yml', null)
            ->will($this->returnValue($this->getMock('Symfony\Component\Routing\RouteCollection')));

        $this->assertInstanceOf('Symfony\\Component\\Routing\\Matcher\\UrlMatcher', $this->router->getMatcher());

    }

    public function provideMatcherOptionsPreventingCaching()
    {
        return array(
            array('cache_dir'),
            array('matcher_cache_class')
        );
    }

    /**
     * @dataProvider provideGeneratorOptionsPreventingCaching
     */
    public function testGeneratorIsCreatedIfCacheIsNotConfigured($option)
    {
        $this->router->setOption($option, null);

        $this->loader->expects($this->once())
            ->method('load')->with('routing.yml', null)
            ->will($this->returnValue($this->getMock('Symfony\Component\Routing\RouteCollection')));

        $this->assertInstanceOf('Symfony\\Component\\Routing\\Generator\\UrlGenerator', $this->router->getGenerator());

    }

    public function provideGeneratorOptionsPreventingCaching()
    {
        return array(
            array('cache_dir'),
            array('generator_cache_class')
        );
    }

    public function testMatchRequestWithUrlMatcherInterface()
    {
        $matcher = $this->getMock('Symfony\Component\Routing\Matcher\UrlMatcherInterface');
        $matcher->expects($this->once())->method('match');

        $p = new \ReflectionProperty($this->router, 'matcher');
        $p->setAccessible(true);
        $p->setValue($this->router, $matcher);

        $this->router->matchRequest(Request::create('/'));
    }

    public function testMatchRequestWithRequestMatcherInterface()
    {
        $matcher = $this->getMock('Symfony\Component\Routing\Matcher\RequestMatcherInterface');
        $matcher->expects($this->once())->method('matchRequest');

        $p = new \ReflectionProperty($this->router, 'matcher');
        $p->setAccessible(true);
        $p->setValue($this->router, $matcher);

        $this->router->matchRequest(Request::create('/'));
    }
}
PKPb�\��/��
�
Hpear/test/Routing/Symfony/Component/Routing/Tests/RequestContextTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RequestContext;

class RequestContextTest extends \PHPUnit_Framework_TestCase
{
    public function testConstruct()
    {
        $requestContext = new RequestContext(
            'foo',
            'post',
            'foo.bar',
            'HTTPS',
            8080,
            444,
            '/baz',
            'bar=foobar'
        );

        $this->assertEquals('foo', $requestContext->getBaseUrl());
        $this->assertEquals('POST', $requestContext->getMethod());
        $this->assertEquals('foo.bar', $requestContext->getHost());
        $this->assertEquals('https', $requestContext->getScheme());
        $this->assertSame(8080, $requestContext->getHttpPort());
        $this->assertSame(444, $requestContext->getHttpsPort());
        $this->assertEquals('/baz', $requestContext->getPathInfo());
        $this->assertEquals('bar=foobar', $requestContext->getQueryString());
    }

    public function testFromRequest()
    {
        $request = Request::create('https://test.com:444/foo?bar=baz');
        $requestContext = new RequestContext();
        $requestContext->setHttpPort(123);
        $requestContext->fromRequest($request);

        $this->assertEquals('', $requestContext->getBaseUrl());
        $this->assertEquals('GET', $requestContext->getMethod());
        $this->assertEquals('test.com', $requestContext->getHost());
        $this->assertEquals('https', $requestContext->getScheme());
        $this->assertEquals('/foo', $requestContext->getPathInfo());
        $this->assertEquals('bar=baz', $requestContext->getQueryString());
        $this->assertSame(123, $requestContext->getHttpPort());
        $this->assertSame(444, $requestContext->getHttpsPort());

        $request = Request::create('http://test.com:8080/foo?bar=baz');
        $requestContext = new RequestContext();
        $requestContext->setHttpsPort(567);
        $requestContext->fromRequest($request);

        $this->assertSame(8080, $requestContext->getHttpPort());
        $this->assertSame(567, $requestContext->getHttpsPort());
    }

    public function testGetParameters()
    {
        $requestContext = new RequestContext();
        $this->assertEquals(array(), $requestContext->getParameters());

        $requestContext->setParameters(array('foo' => 'bar'));
        $this->assertEquals(array('foo' => 'bar'), $requestContext->getParameters());
    }

    public function testHasParameter()
    {
        $requestContext = new RequestContext();
        $requestContext->setParameters(array('foo' => 'bar'));

        $this->assertTrue($requestContext->hasParameter('foo'));
        $this->assertFalse($requestContext->hasParameter('baz'));
    }

    public function testGetParameter()
    {
        $requestContext = new RequestContext();
        $requestContext->setParameters(array('foo' => 'bar'));

        $this->assertEquals('bar', $requestContext->getParameter('foo'));
        $this->assertNull($requestContext->getParameter('baz'));
    }

    public function testSetParameter()
    {
        $requestContext = new RequestContext();
        $requestContext->setParameter('foo', 'bar');

        $this->assertEquals('bar', $requestContext->getParameter('foo'));
    }
}
PKQb�\6����Zpear/test/Routing/Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Loader;

use Symfony\Component\Routing\Loader\AnnotationDirectoryLoader;
use Symfony\Component\Config\FileLocator;

class AnnotationDirectoryLoaderTest extends AbstractAnnotationLoaderTest
{
    protected $loader;
    protected $reader;

    protected function setUp()
    {
        parent::setUp();

        $this->reader = $this->getReader();
        $this->loader = new AnnotationDirectoryLoader(new FileLocator(), $this->getClassLoader($this->reader));
    }

    public function testLoad()
    {
        $this->reader->expects($this->exactly(2))->method('getClassAnnotation');

        $this->reader
            ->expects($this->any())
            ->method('getMethodAnnotations')
            ->will($this->returnValue(array()))
        ;

        $this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses');
    }

    public function testSupports()
    {
        $fixturesDir = __DIR__.'/../Fixtures';

        $this->assertTrue($this->loader->supports($fixturesDir), '->supports() returns true if the resource is loadable');
        $this->assertFalse($this->loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');

        $this->assertTrue($this->loader->supports($fixturesDir, 'annotation'), '->supports() checks the resource type if specified');
        $this->assertFalse($this->loader->supports($fixturesDir, 'foo'), '->supports() checks the resource type if specified');
    }
}
PKQb�\M�~�##Npear/test/Routing/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Loader;

use Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\XmlFileLoader;
use Symfony\Component\Routing\Tests\Fixtures\CustomXmlFileLoader;

class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testSupports()
    {
        $loader = new XmlFileLoader($this->getMock('Symfony\Component\Config\FileLocator'));

        $this->assertTrue($loader->supports('foo.xml'), '->supports() returns true if the resource is loadable');
        $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');

        $this->assertTrue($loader->supports('foo.xml', 'xml'), '->supports() checks the resource type if specified');
        $this->assertFalse($loader->supports('foo.xml', 'foo'), '->supports() checks the resource type if specified');
    }

    public function testLoadWithRoute()
    {
        $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $routeCollection = $loader->load('validpattern.xml');
        $routes = $routeCollection->all();

        $this->assertCount(3, $routes, 'Three routes are loaded');
        $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);

        $identicalRoutes = array_slice($routes, 0, 2);

        foreach ($identicalRoutes as $route) {
            $this->assertSame('/blog/{slug}', $route->getPath());
            $this->assertSame('{locale}.example.com', $route->getHost());
            $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller'));
            $this->assertSame('\w+', $route->getRequirement('locale'));
            $this->assertSame('RouteCompiler', $route->getOption('compiler_class'));
            $this->assertEquals(array('GET', 'POST', 'PUT', 'OPTIONS'), $route->getMethods());
            $this->assertEquals(array('https'), $route->getSchemes());
            $this->assertEquals('context.getMethod() == "GET"', $route->getCondition());
        }
    }

    public function testLoadWithNamespacePrefix()
    {
        $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $routeCollection = $loader->load('namespaceprefix.xml');

        $this->assertCount(1, $routeCollection->all(), 'One route is loaded');

        $route = $routeCollection->get('blog_show');
        $this->assertSame('/blog/{slug}', $route->getPath());
        $this->assertSame('{_locale}.example.com', $route->getHost());
        $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller'));
        $this->assertSame('\w+', $route->getRequirement('slug'));
        $this->assertSame('en|fr|de', $route->getRequirement('_locale'));
        $this->assertSame(null, $route->getDefault('slug'));
        $this->assertSame('RouteCompiler', $route->getOption('compiler_class'));
    }

    public function testLoadWithImport()
    {
        $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $routeCollection = $loader->load('validresource.xml');
        $routes = $routeCollection->all();

        $this->assertCount(3, $routes, 'Three routes are loaded');
        $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);

        foreach ($routes as $route) {
            $this->assertSame('/{foo}/blog/{slug}', $route->getPath());
            $this->assertSame('123', $route->getDefault('foo'));
            $this->assertSame('\d+', $route->getRequirement('foo'));
            $this->assertSame('bar', $route->getOption('foo'));
            $this->assertSame('', $route->getHost());
            $this->assertSame('context.getMethod() == "POST"', $route->getCondition());
        }
    }

    /**
     * @expectedException \InvalidArgumentException
     * @dataProvider getPathsToInvalidFiles
     */
    public function testLoadThrowsExceptionWithInvalidFile($filePath)
    {
        $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $loader->load($filePath);
    }

    /**
     * @expectedException \InvalidArgumentException
     * @dataProvider getPathsToInvalidFiles
     */
    public function testLoadThrowsExceptionWithInvalidFileEvenWithoutSchemaValidation($filePath)
    {
        $loader = new CustomXmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $loader->load($filePath);
    }

    public function getPathsToInvalidFiles()
    {
        return array(array('nonvalidnode.xml'), array('nonvalidroute.xml'), array('nonvalid.xml'), array('missing_id.xml'), array('missing_path.xml'));
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage Document types are not allowed.
     */
    public function testDocTypeIsNotAllowed()
    {
        $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $loader->load('withdoctype.xml');
    }
}
PKRb�\g�U��Npear/test/Routing/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Loader;

use Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\PhpFileLoader;

class PhpFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testSupports()
    {
        $loader = new PhpFileLoader($this->getMock('Symfony\Component\Config\FileLocator'));

        $this->assertTrue($loader->supports('foo.php'), '->supports() returns true if the resource is loadable');
        $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');

        $this->assertTrue($loader->supports('foo.php', 'php'), '->supports() checks the resource type if specified');
        $this->assertFalse($loader->supports('foo.php', 'foo'), '->supports() checks the resource type if specified');
    }

    public function testLoadWithRoute()
    {
        $loader = new PhpFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $routeCollection = $loader->load('validpattern.php');
        $routes = $routeCollection->all();

        $this->assertCount(2, $routes, 'Two routes are loaded');
        $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);

        foreach ($routes as $route) {
            $this->assertSame('/blog/{slug}', $route->getPath());
            $this->assertSame('MyBlogBundle:Blog:show', $route->getDefault('_controller'));
            $this->assertSame('{locale}.example.com', $route->getHost());
            $this->assertSame('RouteCompiler', $route->getOption('compiler_class'));
            $this->assertEquals(array('GET', 'POST', 'PUT', 'OPTIONS'), $route->getMethods());
            $this->assertEquals(array('https'), $route->getSchemes());
        }
    }
}
PKRb�\�����Vpear/test/Routing/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Loader;

use Symfony\Component\Routing\Annotation\Route;

class AnnotationClassLoaderTest extends AbstractAnnotationLoaderTest
{
    protected $loader;

    protected function setUp()
    {
        parent::setUp();

        $this->reader = $this->getReader();
        $this->loader = $this->getClassLoader($this->reader);
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testLoadMissingClass()
    {
        $this->loader->load('MissingClass');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testLoadAbstractClass()
    {
        $this->loader->load('Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\AbstractClass');
    }

    /**
     * @dataProvider provideTestSupportsChecksResource
     */
    public function testSupportsChecksResource($resource, $expectedSupports)
    {
        $this->assertSame($expectedSupports, $this->loader->supports($resource), '->supports() returns true if the resource is loadable');
    }

    public function provideTestSupportsChecksResource()
    {
        return array(
            array('class', true),
            array('\fully\qualified\class\name', true),
            array('namespaced\class\without\leading\slash', true),
            array('ÿClassWithLegalSpecialCharacters', true),
            array('5', false),
            array('foo.foo', false),
            array(null, false),
        );
    }

    public function testSupportsChecksTypeIfSpecified()
    {
        $this->assertTrue($this->loader->supports('class', 'annotation'), '->supports() checks the resource type if specified');
        $this->assertFalse($this->loader->supports('class', 'foo'), '->supports() checks the resource type if specified');
    }

    public function getLoadTests()
    {
        return array(
            array(
                'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
                array('name' => 'route1'),
                array('arg2' => 'defaultValue2', 'arg3' => 'defaultValue3')
            ),
            array(
                'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
                array('name' => 'route1', 'defaults' => array('arg2' => 'foo')),
                array('arg2' => 'defaultValue2', 'arg3' => 'defaultValue3')
            ),
            array(
                'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
                array('name' => 'route1', 'defaults' => array('arg2' => 'foobar')),
                array('arg2' => 'defaultValue2', 'arg3' =>'defaultValue3')
            ),
            array(
                'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
                array('name' => 'route1', 'defaults' => array('arg2' => 'foo'), 'condition' => 'context.getMethod() == "GET"'),
                array('arg2' => 'defaultValue2', 'arg3' =>'defaultValue3')
            ),
        );
    }

    /**
     * @dataProvider getLoadTests
     */
    public function testLoad($className, $routeDatas = array(), $methodArgs = array())
    {
        $routeDatas = array_replace(array(
            'name'         => 'route',
            'path'         => '/',
            'requirements' => array(),
            'options'      => array(),
            'defaults'     => array(),
            'schemes'      => array(),
            'methods'      => array(),
            'condition'    => null,
        ), $routeDatas);

        $this->reader
            ->expects($this->once())
            ->method('getMethodAnnotations')
            ->will($this->returnValue(array($this->getAnnotatedRoute($routeDatas))))
        ;
        $routeCollection = $this->loader->load($className);
        $route = $routeCollection->get($routeDatas['name']);

        $this->assertSame($routeDatas['path'], $route->getPath(), '->load preserves path annotation');
        $this->assertSame($routeDatas['requirements'],$route->getRequirements(), '->load preserves requirements annotation');
        $this->assertCount(0, array_intersect($route->getOptions(), $routeDatas['options']), '->load preserves options annotation');
        $this->assertSame(array_replace($methodArgs, $routeDatas['defaults']), $route->getDefaults(), '->load preserves defaults annotation');
        $this->assertEquals($routeDatas['condition'], $route->getCondition(), '->load preserves condition annotation');
    }

    private function getAnnotatedRoute($datas)
    {
        return new Route($datas);
    }
}
PKRb�\���k��Npear/test/Routing/Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Loader;

use Symfony\Component\Routing\Loader\ClosureLoader;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;

class ClosureLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testSupports()
    {
        $loader = new ClosureLoader();

        $closure = function () {};

        $this->assertTrue($loader->supports($closure), '->supports() returns true if the resource is loadable');
        $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');

        $this->assertTrue($loader->supports($closure, 'closure'), '->supports() checks the resource type if specified');
        $this->assertFalse($loader->supports($closure, 'foo'), '->supports() checks the resource type if specified');
    }

    public function testLoad()
    {
        $loader = new ClosureLoader();

        $route = new Route('/');
        $routes = $loader->load(function () use ($route) {
            $routes = new RouteCollection();

            $routes->add('foo', $route);

            return $routes;
        });

        $this->assertEquals($route, $routes->get('foo'), '->load() loads a \Closure resource');
    }
}
PKRb�\u��;Upear/test/Routing/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Loader;

use Symfony\Component\Routing\Loader\AnnotationFileLoader;
use Symfony\Component\Config\FileLocator;

class AnnotationFileLoaderTest extends AbstractAnnotationLoaderTest
{
    protected $loader;
    protected $reader;

    protected function setUp()
    {
        parent::setUp();

        $this->reader = $this->getReader();
        $this->loader = new AnnotationFileLoader(new FileLocator(), $this->getClassLoader($this->reader));
    }

    public function testLoad()
    {
        $this->reader->expects($this->once())->method('getClassAnnotation');

        $this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses/FooClass.php');
    }

    public function testSupports()
    {
        $fixture = __DIR__.'/../Fixtures/annotated.php';

        $this->assertTrue($this->loader->supports($fixture), '->supports() returns true if the resource is loadable');
        $this->assertFalse($this->loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');

        $this->assertTrue($this->loader->supports($fixture, 'annotation'), '->supports() checks the resource type if specified');
        $this->assertFalse($this->loader->supports($fixture, 'foo'), '->supports() checks the resource type if specified');
    }
}
PKSb�\|�C44Ypear/test/Routing/Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Loader;

abstract class AbstractAnnotationLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function getReader()
    {
        return $this->getMockBuilder('Doctrine\Common\Annotations\Reader')
            ->disableOriginalConstructor()
            ->getMock()
        ;
    }

    public function getClassLoader($reader)
    {
        return $this->getMockBuilder('Symfony\Component\Routing\Loader\AnnotationClassLoader')
            ->setConstructorArgs(array($reader))
            ->getMockForAbstractClass()
        ;
    }
}
PKSb�\{��t��Opear/test/Routing/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Loader;

use Symfony\Component\Config\FileLocator;
use Symfony\Component\Routing\Loader\YamlFileLoader;
use Symfony\Component\Config\Resource\FileResource;

class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testSupports()
    {
        $loader = new YamlFileLoader($this->getMock('Symfony\Component\Config\FileLocator'));

        $this->assertTrue($loader->supports('foo.yml'), '->supports() returns true if the resource is loadable');
        $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');

        $this->assertTrue($loader->supports('foo.yml', 'yaml'), '->supports() checks the resource type if specified');
        $this->assertFalse($loader->supports('foo.yml', 'foo'), '->supports() checks the resource type if specified');
    }

    public function testLoadDoesNothingIfEmpty()
    {
        $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $collection = $loader->load('empty.yml');

        $this->assertEquals(array(), $collection->all());
        $this->assertEquals(array(new FileResource(realpath(__DIR__.'/../Fixtures/empty.yml'))), $collection->getResources());
    }

    /**
     * @expectedException \InvalidArgumentException
     * @dataProvider getPathsToInvalidFiles
     */
    public function testLoadThrowsExceptionWithInvalidFile($filePath)
    {
        $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $loader->load($filePath);
    }

    public function getPathsToInvalidFiles()
    {
        return array(array('nonvalid.yml'), array('nonvalid2.yml'), array('incomplete.yml'), array('nonvalidkeys.yml'), array('nonesense_resource_plus_path.yml'), array('nonesense_type_without_resource.yml'));
    }

    public function testLoadSpecialRouteName()
    {
        $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $routeCollection = $loader->load('special_route_name.yml');
        $route = $routeCollection->get('#$péß^a|');

        $this->assertInstanceOf('Symfony\Component\Routing\Route', $route);
        $this->assertSame('/true', $route->getPath());
    }

    public function testLoadWithRoute()
    {
        $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $routeCollection = $loader->load('validpattern.yml');
        $routes = $routeCollection->all();

        $this->assertCount(3, $routes, 'Three routes are loaded');
        $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);

        $identicalRoutes = array_slice($routes, 0, 2);

        foreach ($identicalRoutes as $route) {
            $this->assertSame('/blog/{slug}', $route->getPath());
            $this->assertSame('{locale}.example.com', $route->getHost());
            $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller'));
            $this->assertSame('\w+', $route->getRequirement('locale'));
            $this->assertSame('RouteCompiler', $route->getOption('compiler_class'));
            $this->assertEquals(array('GET', 'POST', 'PUT', 'OPTIONS'), $route->getMethods());
            $this->assertEquals(array('https'), $route->getSchemes());
            $this->assertEquals('context.getMethod() == "GET"', $route->getCondition());
        }
    }

    public function testLoadWithResource()
    {
        $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
        $routeCollection = $loader->load('validresource.yml');
        $routes = $routeCollection->all();

        $this->assertCount(3, $routes, 'Three routes are loaded');
        $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);

        foreach ($routes as $route) {
            $this->assertSame('/{foo}/blog/{slug}', $route->getPath());
            $this->assertSame('123', $route->getDefault('foo'));
            $this->assertSame('\d+', $route->getRequirement('foo'));
            $this->assertSame('bar', $route->getOption('foo'));
            $this->assertSame('', $route->getHost());
            $this->assertSame('context.getMethod() == "POST"', $route->getCondition());
        }
    }

}
PKSb�\%"�?7?7Ipear/test/Routing/Symfony/Component/Routing/Tests/RouteCollectionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests;

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\Config\Resource\FileResource;

class RouteCollectionTest extends \PHPUnit_Framework_TestCase
{
    public function testRoute()
    {
        $collection = new RouteCollection();
        $route = new Route('/foo');
        $collection->add('foo', $route);
        $this->assertEquals(array('foo' => $route), $collection->all(), '->add() adds a route');
        $this->assertEquals($route, $collection->get('foo'), '->get() returns a route by name');
        $this->assertNull($collection->get('bar'), '->get() returns null if a route does not exist');
    }

    public function testOverriddenRoute()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/foo'));
        $collection->add('foo', new Route('/foo1'));

        $this->assertEquals('/foo1', $collection->get('foo')->getPath());
    }

    public function testDeepOverriddenRoute()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/foo'));

        $collection1 = new RouteCollection();
        $collection1->add('foo', new Route('/foo1'));

        $collection2 = new RouteCollection();
        $collection2->add('foo', new Route('/foo2'));

        $collection1->addCollection($collection2);
        $collection->addCollection($collection1);

        $this->assertEquals('/foo2', $collection1->get('foo')->getPath());
        $this->assertEquals('/foo2', $collection->get('foo')->getPath());
    }

    public function testIterator()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/foo'));

        $collection1 = new RouteCollection();
        $collection1->add('bar', $bar = new Route('/bar'));
        $collection1->add('foo', $foo = new Route('/foo-new'));
        $collection->addCollection($collection1);
        $collection->add('last', $last = new Route('/last'));

        $this->assertInstanceOf('\ArrayIterator', $collection->getIterator());
        $this->assertSame(array('bar' => $bar, 'foo' => $foo, 'last' => $last), $collection->getIterator()->getArrayCopy());
    }

    public function testCount()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/foo'));

        $collection1 = new RouteCollection();
        $collection1->add('bar', new Route('/bar'));
        $collection->addCollection($collection1);

        $this->assertCount(2, $collection);
    }

    public function testAddCollection()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/foo'));

        $collection1 = new RouteCollection();
        $collection1->add('bar', $bar = new Route('/bar'));
        $collection1->add('foo', $foo = new Route('/foo-new'));

        $collection2 = new RouteCollection();
        $collection2->add('grandchild', $grandchild = new Route('/grandchild'));

        $collection1->addCollection($collection2);
        $collection->addCollection($collection1);
        $collection->add('last', $last = new Route('/last'));

        $this->assertSame(array('bar' => $bar, 'foo' => $foo, 'grandchild' => $grandchild, 'last' => $last), $collection->all(),
            '->addCollection() imports routes of another collection, overrides if necessary and adds them at the end');
    }

    public function testAddCollectionWithResources()
    {
        $collection = new RouteCollection();
        $collection->addResource($foo = new FileResource(__DIR__.'/Fixtures/foo.xml'));
        $collection1 = new RouteCollection();
        $collection1->addResource($foo1 = new FileResource(__DIR__.'/Fixtures/foo1.xml'));
        $collection->addCollection($collection1);
        $this->assertEquals(array($foo, $foo1), $collection->getResources(), '->addCollection() merges resources');
    }

    public function testAddDefaultsAndRequirementsAndOptions()
    {
        $collection = new RouteCollection();
        $collection->add('foo', new Route('/{placeholder}'));
        $collection1 = new RouteCollection();
        $collection1->add('bar', new Route('/{placeholder}',
            array('_controller' => 'fixed', 'placeholder' => 'default'), array('placeholder' => '.+'), array('option' => 'value'))
        );
        $collection->addCollection($collection1);

        $collection->addDefaults(array('placeholder' => 'new-default'));
        $this->assertEquals(array('placeholder' => 'new-default'), $collection->get('foo')->getDefaults(), '->addDefaults() adds defaults to all routes');
        $this->assertEquals(array('_controller' => 'fixed', 'placeholder' => 'new-default'), $collection->get('bar')->getDefaults(),
            '->addDefaults() adds defaults to all routes and overwrites existing ones');

        $collection->addRequirements(array('placeholder' => '\d+'));
        $this->assertEquals(array('placeholder' => '\d+'), $collection->get('foo')->getRequirements(), '->addRequirements() adds requirements to all routes');
        $this->assertEquals(array('placeholder' => '\d+'), $collection->get('bar')->getRequirements(),
            '->addRequirements() adds requirements to all routes and overwrites existing ones');

        $collection->addOptions(array('option' => 'new-value'));
        $this->assertEquals(
            array('option' => 'new-value', 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler'),
            $collection->get('bar')->getOptions(), '->addOptions() adds options to all routes and overwrites existing ones'
        );
    }

    public function testAddPrefix()
    {
        $collection = new RouteCollection();
        $collection->add('foo', $foo = new Route('/foo'));
        $collection2 = new RouteCollection();
        $collection2->add('bar', $bar = new Route('/bar'));
        $collection->addCollection($collection2);
        $collection->addPrefix(' / ');
        $this->assertSame('/foo', $collection->get('foo')->getPattern(), '->addPrefix() trims the prefix and a single slash has no effect');
        $collection->addPrefix('/{admin}', array('admin' => 'admin'), array('admin' => '\d+'));
        $this->assertEquals('/{admin}/foo', $collection->get('foo')->getPath(), '->addPrefix() adds a prefix to all routes');
        $this->assertEquals('/{admin}/bar', $collection->get('bar')->getPath(), '->addPrefix() adds a prefix to all routes');
        $this->assertEquals(array('admin' => 'admin'), $collection->get('foo')->getDefaults(), '->addPrefix() adds defaults to all routes');
        $this->assertEquals(array('admin' => 'admin'), $collection->get('bar')->getDefaults(), '->addPrefix() adds defaults to all routes');
        $this->assertEquals(array('admin' => '\d+'), $collection->get('foo')->getRequirements(), '->addPrefix() adds requirements to all routes');
        $this->assertEquals(array('admin' => '\d+'), $collection->get('bar')->getRequirements(), '->addPrefix() adds requirements to all routes');
        $collection->addPrefix('0');
        $this->assertEquals('/0/{admin}/foo', $collection->get('foo')->getPattern(), '->addPrefix() ensures a prefix must start with a slash and must not end with a slash');
        $collection->addPrefix('/ /');
        $this->assertSame('/ /0/{admin}/foo', $collection->get('foo')->getPath(), '->addPrefix() can handle spaces if desired');
        $this->assertSame('/ /0/{admin}/bar', $collection->get('bar')->getPath(), 'the route pattern of an added collection is in synch with the added prefix');
    }

    public function testAddPrefixOverridesDefaultsAndRequirements()
    {
        $collection = new RouteCollection();
        $collection->add('foo', $foo = new Route('/foo'));
        $collection->add('bar', $bar = new Route('/bar', array(), array('_scheme' => 'http')));
        $collection->addPrefix('/admin', array(), array('_scheme' => 'https'));

        $this->assertEquals('https', $collection->get('foo')->getRequirement('_scheme'), '->addPrefix() overrides existing requirements');
        $this->assertEquals('https', $collection->get('bar')->getRequirement('_scheme'), '->addPrefix() overrides existing requirements');
    }

    public function testResource()
    {
        $collection = new RouteCollection();
        $collection->addResource($foo = new FileResource(__DIR__.'/Fixtures/foo.xml'));
        $collection->addResource($bar = new FileResource(__DIR__.'/Fixtures/bar.xml'));
        $collection->addResource(new FileResource(__DIR__.'/Fixtures/foo.xml'));

        $this->assertEquals(array($foo, $bar), $collection->getResources(),
            '->addResource() adds a resource and getResources() only returns unique ones by comparing the string representation');
    }

    public function testUniqueRouteWithGivenName()
    {
        $collection1 = new RouteCollection();
        $collection1->add('foo', new Route('/old'));
        $collection2 = new RouteCollection();
        $collection3 = new RouteCollection();
        $collection3->add('foo', $new = new Route('/new'));

        $collection2->addCollection($collection3);
        $collection1->addCollection($collection2);

        $this->assertSame($new, $collection1->get('foo'), '->get() returns new route that overrode previous one');
        // size of 1 because collection1 contains /new but not /old anymore
        $this->assertCount(1, $collection1->getIterator(), '->addCollection() removes previous routes when adding new routes with the same name');
    }

    public function testGet()
    {
        $collection1 = new RouteCollection();
        $collection1->add('a', $a = new Route('/a'));
        $collection2 = new RouteCollection();
        $collection2->add('b', $b = new Route('/b'));
        $collection1->addCollection($collection2);
        $collection1->add('$péß^a|', $c = new Route('/special'));

        $this->assertSame($b, $collection1->get('b'), '->get() returns correct route in child collection');
        $this->assertSame($c, $collection1->get('$péß^a|'), '->get() can handle special characters');
        $this->assertNull($collection2->get('a'), '->get() does not return the route defined in parent collection');
        $this->assertNull($collection1->get('non-existent'), '->get() returns null when route does not exist');
        $this->assertNull($collection1->get(0), '->get() does not disclose internal child RouteCollection');
    }

    public function testRemove()
    {
        $collection = new RouteCollection();
        $collection->add('foo', $foo = new Route('/foo'));

        $collection1 = new RouteCollection();
        $collection1->add('bar', $bar = new Route('/bar'));
        $collection->addCollection($collection1);
        $collection->add('last', $last = new Route('/last'));

        $collection->remove('foo');
        $this->assertSame(array('bar' => $bar, 'last' => $last), $collection->all(), '->remove() can remove a single route');
        $collection->remove(array('bar', 'last'));
        $this->assertSame(array(), $collection->all(), '->remove() accepts an array and can remove multiple routes at once');
    }

    public function testSetHost()
    {
        $collection = new RouteCollection();
        $routea = new Route('/a');
        $routeb = new Route('/b', array(), array(), array(), '{locale}.example.net');
        $collection->add('a', $routea);
        $collection->add('b', $routeb);

        $collection->setHost('{locale}.example.com');

        $this->assertEquals('{locale}.example.com', $routea->getHost());
        $this->assertEquals('{locale}.example.com', $routeb->getHost());
    }

    public function testSetCondition()
    {
        $collection = new RouteCollection();
        $routea = new Route('/a');
        $routeb = new Route('/b', array(), array(), array(), '{locale}.example.net', array(), array(), 'context.getMethod() == "GET"');
        $collection->add('a', $routea);
        $collection->add('b', $routeb);

        $collection->setCondition('context.getMethod() == "POST"');

        $this->assertEquals('context.getMethod() == "POST"', $routea->getCondition());
        $this->assertEquals('context.getMethod() == "POST"', $routeb->getCondition());
    }

    public function testClone()
    {
        $collection = new RouteCollection();
        $collection->add('a', new Route('/a'));
        $collection->add('b', new Route('/b', array('placeholder' => 'default'), array('placeholder' => '.+')));

        $clonedCollection = clone $collection;

        $this->assertCount(2, $clonedCollection);
        $this->assertEquals($collection->get('a'), $clonedCollection->get('a'));
        $this->assertNotSame($collection->get('a'), $clonedCollection->get('a'));
        $this->assertEquals($collection->get('b'), $clonedCollection->get('b'));
        $this->assertNotSame($collection->get('b'), $clonedCollection->get('b'));
    }

    public function testSetSchemes()
    {
        $collection = new RouteCollection();
        $routea = new Route('/a', array(), array(), array(), '', 'http');
        $routeb = new Route('/b');
        $collection->add('a', $routea);
        $collection->add('b', $routeb);

        $collection->setSchemes(array('http', 'https'));

        $this->assertEquals(array('http', 'https'), $routea->getSchemes());
        $this->assertEquals(array('http', 'https'), $routeb->getSchemes());
    }

    public function testSetMethods()
    {
        $collection = new RouteCollection();
        $routea = new Route('/a', array(), array(), array(), '', array(), array('GET', 'POST'));
        $routeb = new Route('/b');
        $collection->add('a', $routea);
        $collection->add('b', $routeb);

        $collection->setMethods('PUT');

        $this->assertEquals(array('PUT'), $routea->getMethods());
        $this->assertEquals(array('PUT'), $routeb->getMethods());
    }
}
PKTb�\8!!&GGGpear/test/Routing/Symfony/Component/Routing/Tests/CompiledRouteTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests;

use Symfony\Component\Routing\CompiledRoute;

class CompiledRouteTest extends \PHPUnit_Framework_TestCase
{
    public function testAccessors()
    {
        $compiled = new CompiledRoute('prefix', 'regex', array('tokens'), array(), array(), array(), array(), array('variables'));
        $this->assertEquals('prefix', $compiled->getStaticPrefix(), '__construct() takes a static prefix as its second argument');
        $this->assertEquals('regex', $compiled->getRegex(), '__construct() takes a regexp as its third argument');
        $this->assertEquals(array('tokens'), $compiled->getTokens(), '__construct() takes an array of tokens as its fourth argument');
        $this->assertEquals(array('variables'), $compiled->getVariables(), '__construct() takes an array of variables as its ninth argument');
    }
}
PKTb�\1�d	nnRpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Fixtures;

use Symfony\Component\Routing\Loader\XmlFileLoader;
use Symfony\Component\Config\Util\XmlUtils;

/**
 * XmlFileLoader with schema validation turned off
 */
class CustomXmlFileLoader extends XmlFileLoader
{
    protected function loadFile($file)
    {
        return XmlUtils::loadFile($file, function () { return true; });
    }
}
PKUb�\Cpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/foo1.xmlnu�[���PKUb�\�ie��Npear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/namespaceprefix.xmlnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<r:routes xmlns:r="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <r:route id="blog_show" path="/blog/{slug}" host="{_locale}.example.com">
        <r:default key="_controller">MyBundle:Blog:show</r:default>
        <requirement xmlns="http://symfony.com/schema/routing" key="slug">\w+</requirement>
        <r2:requirement xmlns:r2="http://symfony.com/schema/routing" key="_locale">en|fr|de</r2:requirement>
        <r:option key="compiler_class">RouteCompiler</r:option>
    </r:route>
</r:routes>
PKUb�\�;h�%%Upear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Fixtures;

use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface;

/**
 * @author Fabien Potencier <fabien@symfony.com>
 */
class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface
{
    public function redirect($path, $route, $scheme = null)
    {
        return array(
            '_controller' => 'Some controller reference...',
            'path'        => $path,
            'scheme'      => $scheme,
        );
    }
}
PKUb�\Dpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/empty.ymlnu�[���PKUb�\��ϮBBIpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/incomplete.ymlnu�[���blog_show:
    defaults:  { _controller: MyBlogBundle:Blog:show }
PKVb�\�p��Gpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.xmlnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <route id="blog_show" path="/blog/{slug}">
        <default key="_controller">MyBundle:Blog:show</default>
        <requirement key="_method">GET</requirement>
    <!-- </route> -->
</routes>
PKVb�\Hpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/annotated.phpnu�[���PKVb�\�/���Kpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.ymlnu�[���blog_show:
    path:         /blog/{slug}
    defaults:     { _controller: "MyBundle:Blog:show" }
    host:         "{locale}.example.com"
    requirements: { 'locale': '\w+' }
    methods:      ['GET','POST','put','OpTiOnS']
    schemes:      ['https']
    condition:    'context.getMethod() == "GET"'
    options:
        compiler_class: RouteCompiler

blog_show_legacy:
    pattern:      /blog/{slug}
    defaults:     { _controller: "MyBundle:Blog:show" }
    host:         "{locale}.example.com"
    requirements: { '_method': 'GET|POST|put|OpTiOnS', _scheme: https, 'locale': '\w+' }
    condition:    'context.getMethod() == "GET"'
    options:
        compiler_class: RouteCompiler

blog_show_inherited:
    path:      /blog/{slug}
PKVb�\x'�	11Jpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/withdoctype.xmlnu�[���<?xml version="1.0"?>
<!DOCTYPE foo>
<foo></foo>
PKWb�\T����Rpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.phpnu�[���<?php

use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\RequestContext;

/**
 * ProjectUrlMatcher
 *
 * This class has been auto-generated
 * by the Symfony Routing Component.
 */
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
{
    /**
     * Constructor.
     */
    public function __construct(RequestContext $context)
    {
        $this->context = $context;
    }

    public function match($pathinfo)
    {
        $allow = array();
        $pathinfo = rawurldecode($pathinfo);
        $context = $this->context;
        $request = $this->request;

        if (0 === strpos($pathinfo, '/rootprefix')) {
            // static
            if ($pathinfo === '/rootprefix/test') {
                return array('_route' => 'static');
            }

            // dynamic
            if (preg_match('#^/rootprefix/(?P<var>[^/]++)$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'dynamic')), array ());
            }

        }

        // with-condition
        if ($pathinfo === '/with-condition' && ($context->getMethod() == "GET")) {
            return array('_route' => 'with-condition');
        }

        throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
    }
}
PKWb�\n�k�//Rpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.phpnu�[���<?php

use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\RequestContext;

/**
 * ProjectUrlMatcher
 *
 * This class has been auto-generated
 * by the Symfony Routing Component.
 */
class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher
{
    /**
     * Constructor.
     */
    public function __construct(RequestContext $context)
    {
        $this->context = $context;
    }

    public function match($pathinfo)
    {
        $allow = array();
        $pathinfo = rawurldecode($pathinfo);
        $context = $this->context;
        $request = $this->request;

        // foo
        if (0 === strpos($pathinfo, '/foo') && preg_match('#^/foo/(?P<bar>baz|symfony)$#s', $pathinfo, $matches)) {
            return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo')), array (  'def' => 'test',));
        }

        if (0 === strpos($pathinfo, '/bar')) {
            // bar
            if (preg_match('#^/bar/(?P<foo>[^/]++)$#s', $pathinfo, $matches)) {
                if (!in_array($this->context->getMethod(), array('GET', 'HEAD'))) {
                    $allow = array_merge($allow, array('GET', 'HEAD'));
                    goto not_bar;
                }

                return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar')), array ());
            }
            not_bar:

            // barhead
            if (0 === strpos($pathinfo, '/barhead') && preg_match('#^/barhead/(?P<foo>[^/]++)$#s', $pathinfo, $matches)) {
                if (!in_array($this->context->getMethod(), array('GET', 'HEAD'))) {
                    $allow = array_merge($allow, array('GET', 'HEAD'));
                    goto not_barhead;
                }

                return $this->mergeDefaults(array_replace($matches, array('_route' => 'barhead')), array ());
            }
            not_barhead:

        }

        if (0 === strpos($pathinfo, '/test')) {
            if (0 === strpos($pathinfo, '/test/baz')) {
                // baz
                if ($pathinfo === '/test/baz') {
                    return array('_route' => 'baz');
                }

                // baz2
                if ($pathinfo === '/test/baz.html') {
                    return array('_route' => 'baz2');
                }

                // baz3
                if (rtrim($pathinfo, '/') === '/test/baz3') {
                    if (substr($pathinfo, -1) !== '/') {
                        return $this->redirect($pathinfo.'/', 'baz3');
                    }

                    return array('_route' => 'baz3');
                }

            }

            // baz4
            if (preg_match('#^/test/(?P<foo>[^/]++)/?$#s', $pathinfo, $matches)) {
                if (substr($pathinfo, -1) !== '/') {
                    return $this->redirect($pathinfo.'/', 'baz4');
                }

                return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz4')), array ());
            }

            // baz5
            if (preg_match('#^/test/(?P<foo>[^/]++)/$#s', $pathinfo, $matches)) {
                if ($this->context->getMethod() != 'POST') {
                    $allow[] = 'POST';
                    goto not_baz5;
                }

                return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz5')), array ());
            }
            not_baz5:

            // baz.baz6
            if (preg_match('#^/test/(?P<foo>[^/]++)/$#s', $pathinfo, $matches)) {
                if ($this->context->getMethod() != 'PUT') {
                    $allow[] = 'PUT';
                    goto not_bazbaz6;
                }

                return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz.baz6')), array ());
            }
            not_bazbaz6:

        }

        // foofoo
        if ($pathinfo === '/foofoo') {
            return array (  'def' => 'test',  '_route' => 'foofoo',);
        }

        // quoter
        if (preg_match('#^/(?P<quoter>[\']+)$#s', $pathinfo, $matches)) {
            return $this->mergeDefaults(array_replace($matches, array('_route' => 'quoter')), array ());
        }

        // space
        if ($pathinfo === '/spa ce') {
            return array('_route' => 'space');
        }

        if (0 === strpos($pathinfo, '/a')) {
            if (0 === strpos($pathinfo, '/a/b\'b')) {
                // foo1
                if (preg_match('#^/a/b\'b/(?P<foo>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo1')), array ());
                }

                // bar1
                if (preg_match('#^/a/b\'b/(?P<bar>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar1')), array ());
                }

            }

            // overridden
            if (preg_match('#^/a/(?P<var>.*)$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'overridden')), array ());
            }

            if (0 === strpos($pathinfo, '/a/b\'b')) {
                // foo2
                if (preg_match('#^/a/b\'b/(?P<foo1>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo2')), array ());
                }

                // bar2
                if (preg_match('#^/a/b\'b/(?P<bar1>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar2')), array ());
                }

            }

        }

        if (0 === strpos($pathinfo, '/multi')) {
            // helloWorld
            if (0 === strpos($pathinfo, '/multi/hello') && preg_match('#^/multi/hello(?:/(?P<who>[^/]++))?$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'helloWorld')), array (  'who' => 'World!',));
            }

            // overridden2
            if ($pathinfo === '/multi/new') {
                return array('_route' => 'overridden2');
            }

            // hey
            if (rtrim($pathinfo, '/') === '/multi/hey') {
                if (substr($pathinfo, -1) !== '/') {
                    return $this->redirect($pathinfo.'/', 'hey');
                }

                return array('_route' => 'hey');
            }

        }

        // foo3
        if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P<foo>[^/]++)$#s', $pathinfo, $matches)) {
            return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo3')), array ());
        }

        // bar3
        if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P<bar>[^/]++)$#s', $pathinfo, $matches)) {
            return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar3')), array ());
        }

        if (0 === strpos($pathinfo, '/aba')) {
            // ababa
            if ($pathinfo === '/ababa') {
                return array('_route' => 'ababa');
            }

            // foo4
            if (preg_match('#^/aba/(?P<foo>[^/]++)$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo4')), array ());
            }

        }

        $host = $this->context->getHost();

        if (preg_match('#^a\\.example\\.com$#s', $host, $hostMatches)) {
            // route1
            if ($pathinfo === '/route1') {
                return array('_route' => 'route1');
            }

            // route2
            if ($pathinfo === '/c2/route2') {
                return array('_route' => 'route2');
            }

        }

        if (preg_match('#^b\\.example\\.com$#s', $host, $hostMatches)) {
            // route3
            if ($pathinfo === '/c2/route3') {
                return array('_route' => 'route3');
            }

        }

        if (preg_match('#^a\\.example\\.com$#s', $host, $hostMatches)) {
            // route4
            if ($pathinfo === '/route4') {
                return array('_route' => 'route4');
            }

        }

        if (preg_match('#^c\\.example\\.com$#s', $host, $hostMatches)) {
            // route5
            if ($pathinfo === '/route5') {
                return array('_route' => 'route5');
            }

        }

        // route6
        if ($pathinfo === '/route6') {
            return array('_route' => 'route6');
        }

        if (preg_match('#^(?P<var1>[^\\.]++)\\.example\\.com$#s', $host, $hostMatches)) {
            if (0 === strpos($pathinfo, '/route1')) {
                // route11
                if ($pathinfo === '/route11') {
                    return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route11')), array ());
                }

                // route12
                if ($pathinfo === '/route12') {
                    return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route12')), array (  'var1' => 'val',));
                }

                // route13
                if (0 === strpos($pathinfo, '/route13') && preg_match('#^/route13/(?P<name>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route13')), array ());
                }

                // route14
                if (0 === strpos($pathinfo, '/route14') && preg_match('#^/route14/(?P<name>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route14')), array (  'var1' => 'val',));
                }

            }

        }

        if (preg_match('#^c\\.example\\.com$#s', $host, $hostMatches)) {
            // route15
            if (0 === strpos($pathinfo, '/route15') && preg_match('#^/route15/(?P<name>[^/]++)$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'route15')), array ());
            }

        }

        if (0 === strpos($pathinfo, '/route1')) {
            // route16
            if (0 === strpos($pathinfo, '/route16') && preg_match('#^/route16/(?P<name>[^/]++)$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'route16')), array (  'var1' => 'val',));
            }

            // route17
            if ($pathinfo === '/route17') {
                return array('_route' => 'route17');
            }

        }

        if (0 === strpos($pathinfo, '/a')) {
            // a
            if ($pathinfo === '/a/a...') {
                return array('_route' => 'a');
            }

            if (0 === strpos($pathinfo, '/a/b')) {
                // b
                if (preg_match('#^/a/b/(?P<var>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'b')), array ());
                }

                // c
                if (0 === strpos($pathinfo, '/a/b/c') && preg_match('#^/a/b/c/(?P<var>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'c')), array ());
                }

            }

        }

        // secure
        if ($pathinfo === '/secure') {
            if ($this->context->getScheme() !== 'https') {
                return $this->redirect($pathinfo, 'secure', 'https');
            }

            return array('_route' => 'secure');
        }

        // nonsecure
        if ($pathinfo === '/nonsecure') {
            if ($this->context->getScheme() !== 'http') {
                return $this->redirect($pathinfo, 'nonsecure', 'http');
            }

            return array('_route' => 'nonsecure');
        }

        throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
    }
}
PKXb�\@4��Upear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.apachenu�[���# skip "real" requests
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [QSA,L]

# foo
RewriteCond %{REQUEST_URI} ^/foo/(baz|symfony)$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:foo,E=_ROUTING_param_bar:%1,E=_ROUTING_default_def:test]

# foobar
RewriteCond %{REQUEST_URI} ^/foo(?:/([^/]++))?$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:foobar,E=_ROUTING_param_bar:%1,E=_ROUTING_default_bar:toto]

# bar
RewriteCond %{REQUEST_URI} ^/bar/([^/]++)$
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD)$ [NC]
RewriteRule .* - [S=1,E=_ROUTING_allow_GET:1,E=_ROUTING_allow_HEAD:1]
RewriteCond %{REQUEST_URI} ^/bar/([^/]++)$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:bar,E=_ROUTING_param_foo:%1]

# baragain
RewriteCond %{REQUEST_URI} ^/baragain/([^/]++)$
RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)$ [NC]
RewriteRule .* - [S=1,E=_ROUTING_allow_GET:1,E=_ROUTING_allow_POST:1,E=_ROUTING_allow_HEAD:1]
RewriteCond %{REQUEST_URI} ^/baragain/([^/]++)$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baragain,E=_ROUTING_param_foo:%1]

# baz
RewriteCond %{REQUEST_URI} ^/test/baz$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz]

# baz2
RewriteCond %{REQUEST_URI} ^/test/baz\.html$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz2]

# baz3
RewriteCond %{REQUEST_URI} ^/test/baz3$
RewriteRule .* $0/ [QSA,L,R=301]
RewriteCond %{REQUEST_URI} ^/test/baz3/$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz3]

# baz4
RewriteCond %{REQUEST_URI} ^/test/([^/]++)$
RewriteRule .* $0/ [QSA,L,R=301]
RewriteCond %{REQUEST_URI} ^/test/([^/]++)/$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz4,E=_ROUTING_param_foo:%1]

# baz5
RewriteCond %{REQUEST_URI} ^/test/([^/]++)/$
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD)$ [NC]
RewriteRule .* - [S=2,E=_ROUTING_allow_GET:1,E=_ROUTING_allow_HEAD:1]
RewriteCond %{REQUEST_URI} ^/test/([^/]++)$
RewriteRule .* $0/ [QSA,L,R=301]
RewriteCond %{REQUEST_URI} ^/test/([^/]++)/$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz5,E=_ROUTING_param_foo:%1]

# baz5unsafe
RewriteCond %{REQUEST_URI} ^/testunsafe/([^/]++)/$
RewriteCond %{REQUEST_METHOD} !^(POST)$ [NC]
RewriteRule .* - [S=1,E=_ROUTING_allow_POST:1]
RewriteCond %{REQUEST_URI} ^/testunsafe/([^/]++)/$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz5unsafe,E=_ROUTING_param_foo:%1]

# baz6
RewriteCond %{REQUEST_URI} ^/test/baz$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz6,E=_ROUTING_default_foo:bar\ baz]

# baz7
RewriteCond %{REQUEST_URI} ^/te\ st/baz$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz7]

# baz8
RewriteCond %{REQUEST_URI} ^/te\\\ st/baz$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz8]

# baz9
RewriteCond %{REQUEST_URI} ^/test/(te\\\ st)$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz9,E=_ROUTING_param_baz:%1]

RewriteCond %{HTTP:Host} ^a\.example\.com$
RewriteRule .? - [E=__ROUTING_host_1:1]

# route1
RewriteCond %{ENV:__ROUTING_host_1} =1
RewriteCond %{REQUEST_URI} ^/route1$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route1]

# route2
RewriteCond %{ENV:__ROUTING_host_1} =1
RewriteCond %{REQUEST_URI} ^/c2/route2$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route2]

RewriteCond %{HTTP:Host} ^b\.example\.com$
RewriteRule .? - [E=__ROUTING_host_2:1]

# route3
RewriteCond %{ENV:__ROUTING_host_2} =1
RewriteCond %{REQUEST_URI} ^/c2/route3$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route3]

RewriteCond %{HTTP:Host} ^a\.example\.com$
RewriteRule .? - [E=__ROUTING_host_3:1]

# route4
RewriteCond %{ENV:__ROUTING_host_3} =1
RewriteCond %{REQUEST_URI} ^/route4$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route4]

RewriteCond %{HTTP:Host} ^c\.example\.com$
RewriteRule .? - [E=__ROUTING_host_4:1]

# route5
RewriteCond %{ENV:__ROUTING_host_4} =1
RewriteCond %{REQUEST_URI} ^/route5$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route5]

# route6
RewriteCond %{REQUEST_URI} ^/route6$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route6]

RewriteCond %{HTTP:Host} ^([^\.]++)\.example\.com$
RewriteRule .? - [E=__ROUTING_host_5:1,E=__ROUTING_host_5_var1:%1]

# route11
RewriteCond %{ENV:__ROUTING_host_5} =1
RewriteCond %{REQUEST_URI} ^/route11$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route11,E=_ROUTING_param_var1:%{ENV:__ROUTING_host_5_var1}]

# route12
RewriteCond %{ENV:__ROUTING_host_5} =1
RewriteCond %{REQUEST_URI} ^/route12$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route12,E=_ROUTING_param_var1:%{ENV:__ROUTING_host_5_var1},E=_ROUTING_default_var1:val]

# route13
RewriteCond %{ENV:__ROUTING_host_5} =1
RewriteCond %{REQUEST_URI} ^/route13/([^/]++)$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route13,E=_ROUTING_param_var1:%{ENV:__ROUTING_host_5_var1},E=_ROUTING_param_name:%1]

# route14
RewriteCond %{ENV:__ROUTING_host_5} =1
RewriteCond %{REQUEST_URI} ^/route14/([^/]++)$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route14,E=_ROUTING_param_var1:%{ENV:__ROUTING_host_5_var1},E=_ROUTING_param_name:%1,E=_ROUTING_default_var1:val]

RewriteCond %{HTTP:Host} ^c\.example\.com$
RewriteRule .? - [E=__ROUTING_host_6:1]

# route15
RewriteCond %{ENV:__ROUTING_host_6} =1
RewriteCond %{REQUEST_URI} ^/route15/([^/]++)$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route15,E=_ROUTING_param_name:%1]

# route16
RewriteCond %{REQUEST_URI} ^/route16/([^/]++)$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route16,E=_ROUTING_param_name:%1,E=_ROUTING_default_var1:val]

# route17
RewriteCond %{REQUEST_URI} ^/route17$
RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route17]

# 405 Method Not Allowed
RewriteCond %{ENV:_ROUTING__allow_GET} =1 [OR]
RewriteCond %{ENV:_ROUTING__allow_HEAD} =1 [OR]
RewriteCond %{ENV:_ROUTING__allow_POST} =1
RewriteRule .* app.php [QSA,L]
PKXb�\Bx�6��Upear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.apachenu�[���# skip "real" requests
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [QSA,L]

# foo
RewriteCond %{REQUEST_URI} ^/foo$
RewriteRule .* ap\ p_d\ ev.php [QSA,L,E=_ROUTING_route:foo]
PKYb�\�G�V,+,+Rpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.phpnu�[���<?php

use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\RequestContext;

/**
 * ProjectUrlMatcher
 *
 * This class has been auto-generated
 * by the Symfony Routing Component.
 */
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
{
    /**
     * Constructor.
     */
    public function __construct(RequestContext $context)
    {
        $this->context = $context;
    }

    public function match($pathinfo)
    {
        $allow = array();
        $pathinfo = rawurldecode($pathinfo);
        $context = $this->context;
        $request = $this->request;

        // foo
        if (0 === strpos($pathinfo, '/foo') && preg_match('#^/foo/(?P<bar>baz|symfony)$#s', $pathinfo, $matches)) {
            return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo')), array (  'def' => 'test',));
        }

        if (0 === strpos($pathinfo, '/bar')) {
            // bar
            if (preg_match('#^/bar/(?P<foo>[^/]++)$#s', $pathinfo, $matches)) {
                if (!in_array($this->context->getMethod(), array('GET', 'HEAD'))) {
                    $allow = array_merge($allow, array('GET', 'HEAD'));
                    goto not_bar;
                }

                return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar')), array ());
            }
            not_bar:

            // barhead
            if (0 === strpos($pathinfo, '/barhead') && preg_match('#^/barhead/(?P<foo>[^/]++)$#s', $pathinfo, $matches)) {
                if (!in_array($this->context->getMethod(), array('GET', 'HEAD'))) {
                    $allow = array_merge($allow, array('GET', 'HEAD'));
                    goto not_barhead;
                }

                return $this->mergeDefaults(array_replace($matches, array('_route' => 'barhead')), array ());
            }
            not_barhead:

        }

        if (0 === strpos($pathinfo, '/test')) {
            if (0 === strpos($pathinfo, '/test/baz')) {
                // baz
                if ($pathinfo === '/test/baz') {
                    return array('_route' => 'baz');
                }

                // baz2
                if ($pathinfo === '/test/baz.html') {
                    return array('_route' => 'baz2');
                }

                // baz3
                if ($pathinfo === '/test/baz3/') {
                    return array('_route' => 'baz3');
                }

            }

            // baz4
            if (preg_match('#^/test/(?P<foo>[^/]++)/$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz4')), array ());
            }

            // baz5
            if (preg_match('#^/test/(?P<foo>[^/]++)/$#s', $pathinfo, $matches)) {
                if ($this->context->getMethod() != 'POST') {
                    $allow[] = 'POST';
                    goto not_baz5;
                }

                return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz5')), array ());
            }
            not_baz5:

            // baz.baz6
            if (preg_match('#^/test/(?P<foo>[^/]++)/$#s', $pathinfo, $matches)) {
                if ($this->context->getMethod() != 'PUT') {
                    $allow[] = 'PUT';
                    goto not_bazbaz6;
                }

                return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz.baz6')), array ());
            }
            not_bazbaz6:

        }

        // foofoo
        if ($pathinfo === '/foofoo') {
            return array (  'def' => 'test',  '_route' => 'foofoo',);
        }

        // quoter
        if (preg_match('#^/(?P<quoter>[\']+)$#s', $pathinfo, $matches)) {
            return $this->mergeDefaults(array_replace($matches, array('_route' => 'quoter')), array ());
        }

        // space
        if ($pathinfo === '/spa ce') {
            return array('_route' => 'space');
        }

        if (0 === strpos($pathinfo, '/a')) {
            if (0 === strpos($pathinfo, '/a/b\'b')) {
                // foo1
                if (preg_match('#^/a/b\'b/(?P<foo>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo1')), array ());
                }

                // bar1
                if (preg_match('#^/a/b\'b/(?P<bar>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar1')), array ());
                }

            }

            // overridden
            if (preg_match('#^/a/(?P<var>.*)$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'overridden')), array ());
            }

            if (0 === strpos($pathinfo, '/a/b\'b')) {
                // foo2
                if (preg_match('#^/a/b\'b/(?P<foo1>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo2')), array ());
                }

                // bar2
                if (preg_match('#^/a/b\'b/(?P<bar1>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar2')), array ());
                }

            }

        }

        if (0 === strpos($pathinfo, '/multi')) {
            // helloWorld
            if (0 === strpos($pathinfo, '/multi/hello') && preg_match('#^/multi/hello(?:/(?P<who>[^/]++))?$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'helloWorld')), array (  'who' => 'World!',));
            }

            // overridden2
            if ($pathinfo === '/multi/new') {
                return array('_route' => 'overridden2');
            }

            // hey
            if ($pathinfo === '/multi/hey/') {
                return array('_route' => 'hey');
            }

        }

        // foo3
        if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P<foo>[^/]++)$#s', $pathinfo, $matches)) {
            return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo3')), array ());
        }

        // bar3
        if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P<bar>[^/]++)$#s', $pathinfo, $matches)) {
            return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar3')), array ());
        }

        if (0 === strpos($pathinfo, '/aba')) {
            // ababa
            if ($pathinfo === '/ababa') {
                return array('_route' => 'ababa');
            }

            // foo4
            if (preg_match('#^/aba/(?P<foo>[^/]++)$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo4')), array ());
            }

        }

        $host = $this->context->getHost();

        if (preg_match('#^a\\.example\\.com$#s', $host, $hostMatches)) {
            // route1
            if ($pathinfo === '/route1') {
                return array('_route' => 'route1');
            }

            // route2
            if ($pathinfo === '/c2/route2') {
                return array('_route' => 'route2');
            }

        }

        if (preg_match('#^b\\.example\\.com$#s', $host, $hostMatches)) {
            // route3
            if ($pathinfo === '/c2/route3') {
                return array('_route' => 'route3');
            }

        }

        if (preg_match('#^a\\.example\\.com$#s', $host, $hostMatches)) {
            // route4
            if ($pathinfo === '/route4') {
                return array('_route' => 'route4');
            }

        }

        if (preg_match('#^c\\.example\\.com$#s', $host, $hostMatches)) {
            // route5
            if ($pathinfo === '/route5') {
                return array('_route' => 'route5');
            }

        }

        // route6
        if ($pathinfo === '/route6') {
            return array('_route' => 'route6');
        }

        if (preg_match('#^(?P<var1>[^\\.]++)\\.example\\.com$#s', $host, $hostMatches)) {
            if (0 === strpos($pathinfo, '/route1')) {
                // route11
                if ($pathinfo === '/route11') {
                    return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route11')), array ());
                }

                // route12
                if ($pathinfo === '/route12') {
                    return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route12')), array (  'var1' => 'val',));
                }

                // route13
                if (0 === strpos($pathinfo, '/route13') && preg_match('#^/route13/(?P<name>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route13')), array ());
                }

                // route14
                if (0 === strpos($pathinfo, '/route14') && preg_match('#^/route14/(?P<name>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route14')), array (  'var1' => 'val',));
                }

            }

        }

        if (preg_match('#^c\\.example\\.com$#s', $host, $hostMatches)) {
            // route15
            if (0 === strpos($pathinfo, '/route15') && preg_match('#^/route15/(?P<name>[^/]++)$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'route15')), array ());
            }

        }

        if (0 === strpos($pathinfo, '/route1')) {
            // route16
            if (0 === strpos($pathinfo, '/route16') && preg_match('#^/route16/(?P<name>[^/]++)$#s', $pathinfo, $matches)) {
                return $this->mergeDefaults(array_replace($matches, array('_route' => 'route16')), array (  'var1' => 'val',));
            }

            // route17
            if ($pathinfo === '/route17') {
                return array('_route' => 'route17');
            }

        }

        if (0 === strpos($pathinfo, '/a')) {
            // a
            if ($pathinfo === '/a/a...') {
                return array('_route' => 'a');
            }

            if (0 === strpos($pathinfo, '/a/b')) {
                // b
                if (preg_match('#^/a/b/(?P<var>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'b')), array ());
                }

                // c
                if (0 === strpos($pathinfo, '/a/b/c') && preg_match('#^/a/b/c/(?P<var>[^/]++)$#s', $pathinfo, $matches)) {
                    return $this->mergeDefaults(array_replace($matches, array('_route' => 'c')), array ());
                }

            }

        }

        throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
    }
}
PKYb�\�q�99^pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_type_without_resource.ymlnu�[���blog_show:
    path:    /blog/{slug}
    type:    custom
PKYb�\ͼ�n!!Kpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidnode.xmlnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <foo>bar</foo>
</routes>
PKZb�\�J?�Qpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/special_route_name.ymlnu�[���"#$péß^a|":
    path: "true"
PKZb�\�/�$>>[pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_resource_plus_path.ymlnu�[���blog_show:
    resource: validpattern.yml
    path:     /test
PKZb�\jX���Lpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/validresource.ymlnu�[���_blog:
    resource:     validpattern.yml
    prefix:       /{foo}
    defaults:     { 'foo': '123' }
    requirements: { 'foo': '\d+' }
    options:      { 'foo': 'bar' }
    host:         ""
    condition:    'context.getMethod() == "POST"'
PK[b�\�e2~Gpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.ymlnu�[���foo
PK[b�\Bpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/foo.xmlnu�[���PK[b�\�b�Lpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/validresource.xmlnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <import resource="validpattern.xml" prefix="/{foo}" host="">
        <default key="foo">123</default>
        <requirement key="foo">\d+</requirement>
        <option key="foo">bar</option>
        <condition>context.getMethod() == "POST"</condition>
    </import>
</routes>
PK[b�\��q�Lpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidroute.xmlnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <route id="blog_show" path="/blog/{slug}">
        <default key="_controller">MyBundle:Blog:show</default>
        <requirement key="_method">GET</requirement>
        <option key="compiler_class">RouteCompiler</option>
        <foo key="bar">baz</foo>
    </route>
</routes>
PK[b�\�M�tHpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid2.ymlnu�[���route: string
PK\b�\�zUU]pear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses;

abstract class AbstractClass
{
}
PK\b�\T��Xpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses;

class BarClass
{
    public function routeAction($arg1, $arg2 = 'defaultValue2', $arg3 = 'defaultValue3')
    {
    }
}
PK\b�\���GGXpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses;

class FooClass
{
}
PK]b�\#q��//Ipear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/missing_id.xmlnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <route path="/test"></route>
</routes>
PK]b�\s��[//Kpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/missing_path.xmlnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <route id="myroute"></route>
</routes>
PK]b�\ix��77Kpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.phpnu�[���<?php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$collection = new RouteCollection();
$collection->add('blog_show', new Route(
    '/blog/{slug}',
    array('_controller' => 'MyBlogBundle:Blog:show'),
    array('locale' => '\w+'),
    array('compiler_class' => 'RouteCompiler'),
    '{locale}.example.com',
    array('https'),
    array('GET','POST','put','OpTiOnS'),
    'context.getMethod() == "GET"'
));
$collection->add('blog_show_legacy', new Route(
    '/blog/{slug}',
    array('_controller' => 'MyBlogBundle:Blog:show'),
    array('_method' => 'GET|POST|put|OpTiOnS', '_scheme' => 'https', 'locale' => '\w+',),
    array('compiler_class' => 'RouteCompiler'),
    '{locale}.example.com',
    array(),
    array(),
    'context.getMethod() == "GET"'
));

return $collection;
PK`b�\��==Kpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidkeys.ymlnu�[���someroute:
  resource: path/to/some.yml
  name_prefix: test_
PK`b�\�M��Kpear/test/Routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.xmlnu�[���<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <route id="blog_show" path="/blog/{slug}" host="{locale}.example.com" methods="GET|POST  put,OpTiOnS" schemes="hTTps">
        <default key="_controller">MyBundle:Blog:show</default>
        <requirement key="locale">\w+</requirement>
        <option key="compiler_class">RouteCompiler</option>
        <condition>context.getMethod() == "GET"</condition>
    </route>

    <route id="blog_show_legacy" pattern="/blog/{slug}" host="{locale}.example.com">
        <default key="_controller">MyBundle:Blog:show</default>
        <default key="slug" xsi:nil="true" />
        <requirement key="_method">GET|POST|put|OpTiOnS</requirement>
        <requirement key="_scheme">hTTps</requirement>
        <requirement key="locale">\w+</requirement>
        <option key="compiler_class">RouteCompiler</option>
        <condition>context.getMethod() == "GET"</condition>
    </route>

    <route id="blog_show_inherited" path="/blog/{slug}" />
</routes>
PKab�\���LLJpear/test/Routing/Symfony/Component/Routing/Tests/Annotation/RouteTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Annotation;

use Symfony\Component\Routing\Annotation\Route;

class RouteTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \BadMethodCallException
     */
    public function testInvalidRouteParameter()
    {
        $route = new Route(array('foo' => 'bar'));
    }

    /**
     * @dataProvider getValidParameters
     */
    public function testRouteParameters($parameter, $value, $getter)
    {
        $route = new Route(array($parameter => $value));
        $this->assertEquals($route->$getter(), $value);
    }

    public function getValidParameters()
    {
        return array(
            array('value', '/Blog', 'getPattern'),
            array('value', '/Blog', 'getPath'),
            array('requirements', array('_method' => 'GET'), 'getRequirements'),
            array('options', array('compiler_class' => 'RouteCompiler'), 'getOptions'),
            array('name', 'blog_index', 'getName'),
            array('defaults', array('_controller' => 'MyBlogBundle:Blog:index'), 'getDefaults'),
            array('schemes', array('https'), 'getSchemes'),
            array('methods', array('GET', 'POST'), 'getMethods'),
            array('host', array('{locale}.example.com'), 'getHost'),
            array('condition', array('context.getMethod() == "GET"'), 'getCondition'),
        );
    }
}
PKab�\u��A�,�,?pear/test/Routing/Symfony/Component/Routing/Tests/RouteTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests;

use Symfony\Component\Routing\Route;

class RouteTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $route = new Route('/{foo}', array('foo' => 'bar'), array('foo' => '\d+'), array('foo' => 'bar'), '{locale}.example.com');
        $this->assertEquals('/{foo}', $route->getPath(), '__construct() takes a path as its first argument');
        $this->assertEquals(array('foo' => 'bar'), $route->getDefaults(), '__construct() takes defaults as its second argument');
        $this->assertEquals(array('foo' => '\d+'), $route->getRequirements(), '__construct() takes requirements as its third argument');
        $this->assertEquals('bar', $route->getOption('foo'), '__construct() takes options as its fourth argument');
        $this->assertEquals('{locale}.example.com', $route->getHost(), '__construct() takes a host pattern as its fifth argument');

        $route = new Route('/', array(), array(), array(), '', array('Https'), array('POST', 'put'), 'context.getMethod() == "GET"');
        $this->assertEquals(array('https'), $route->getSchemes(), '__construct() takes schemes as its sixth argument and lowercases it');
        $this->assertEquals(array('POST', 'PUT'), $route->getMethods(), '__construct() takes methods as its seventh argument and uppercases it');
        $this->assertEquals('context.getMethod() == "GET"', $route->getCondition(), '__construct() takes a condition as its eight argument');

        $route = new Route('/', array(), array(), array(), '', 'Https', 'Post');
        $this->assertEquals(array('https'), $route->getSchemes(), '__construct() takes a single scheme as its sixth argument');
        $this->assertEquals(array('POST'), $route->getMethods(), '__construct() takes a single method as its seventh argument');
    }

    public function testPath()
    {
        $route = new Route('/{foo}');
        $route->setPath('/{bar}');
        $this->assertEquals('/{bar}', $route->getPath(), '->setPath() sets the path');
        $route->setPath('');
        $this->assertEquals('/', $route->getPath(), '->setPath() adds a / at the beginning of the path if needed');
        $route->setPath('bar');
        $this->assertEquals('/bar', $route->getPath(), '->setPath() adds a / at the beginning of the path if needed');
        $this->assertEquals($route, $route->setPath(''), '->setPath() implements a fluent interface');
        $route->setPath('//path');
        $this->assertEquals('/path', $route->getPath(), '->setPath() does not allow two slashes "//" at the beginning of the path as it would be confused with a network path when generating the path from the route');
    }

    public function testOptions()
    {
        $route = new Route('/{foo}');
        $route->setOptions(array('foo' => 'bar'));
        $this->assertEquals(array_merge(array(
        'compiler_class'     => 'Symfony\\Component\\Routing\\RouteCompiler',
        ), array('foo' => 'bar')), $route->getOptions(), '->setOptions() sets the options');
        $this->assertEquals($route, $route->setOptions(array()), '->setOptions() implements a fluent interface');

        $route->setOptions(array('foo' => 'foo'));
        $route->addOptions(array('bar' => 'bar'));
        $this->assertEquals($route, $route->addOptions(array()), '->addOptions() implements a fluent interface');
        $this->assertEquals(array('foo' => 'foo', 'bar' => 'bar', 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler'), $route->getOptions(), '->addDefaults() keep previous defaults');
    }

    public function testOption()
    {
        $route = new Route('/{foo}');
        $this->assertFalse($route->hasOption('foo'), '->hasOption() return false if option is not set');
        $this->assertEquals($route, $route->setOption('foo', 'bar'), '->setOption() implements a fluent interface');
        $this->assertEquals('bar', $route->getOption('foo'), '->setOption() sets the option');
        $this->assertTrue($route->hasOption('foo'), '->hasOption() return true if option is set');
    }

    public function testDefaults()
    {
        $route = new Route('/{foo}');
        $route->setDefaults(array('foo' => 'bar'));
        $this->assertEquals(array('foo' => 'bar'), $route->getDefaults(), '->setDefaults() sets the defaults');
        $this->assertEquals($route, $route->setDefaults(array()), '->setDefaults() implements a fluent interface');

        $route->setDefault('foo', 'bar');
        $this->assertEquals('bar', $route->getDefault('foo'), '->setDefault() sets a default value');

        $route->setDefault('foo2', 'bar2');
        $this->assertEquals('bar2', $route->getDefault('foo2'), '->getDefault() return the default value');
        $this->assertNull($route->getDefault('not_defined'), '->getDefault() return null if default value is not set');

        $route->setDefault('_controller', $closure = function () { return 'Hello'; });
        $this->assertEquals($closure, $route->getDefault('_controller'), '->setDefault() sets a default value');

        $route->setDefaults(array('foo' => 'foo'));
        $route->addDefaults(array('bar' => 'bar'));
        $this->assertEquals($route, $route->addDefaults(array()), '->addDefaults() implements a fluent interface');
        $this->assertEquals(array('foo' => 'foo', 'bar' => 'bar'), $route->getDefaults(), '->addDefaults() keep previous defaults');
    }

    public function testRequirements()
    {
        $route = new Route('/{foo}');
        $route->setRequirements(array('foo' => '\d+'));
        $this->assertEquals(array('foo' => '\d+'), $route->getRequirements(), '->setRequirements() sets the requirements');
        $this->assertEquals('\d+', $route->getRequirement('foo'), '->getRequirement() returns a requirement');
        $this->assertNull($route->getRequirement('bar'), '->getRequirement() returns null if a requirement is not defined');
        $route->setRequirements(array('foo' => '^\d+$'));
        $this->assertEquals('\d+', $route->getRequirement('foo'), '->getRequirement() removes ^ and $ from the path');
        $this->assertEquals($route, $route->setRequirements(array()), '->setRequirements() implements a fluent interface');

        $route->setRequirements(array('foo' => '\d+'));
        $route->addRequirements(array('bar' => '\d+'));
        $this->assertEquals($route, $route->addRequirements(array()), '->addRequirements() implements a fluent interface');
        $this->assertEquals(array('foo' => '\d+', 'bar' => '\d+'), $route->getRequirements(), '->addRequirement() keep previous requirements');
    }

    public function testRequirement()
    {
        $route = new Route('/{foo}');
        $this->assertFalse($route->hasRequirement('foo'), '->hasRequirement() return false if requirement is not set');
        $route->setRequirement('foo', '^\d+$');
        $this->assertEquals('\d+', $route->getRequirement('foo'), '->setRequirement() removes ^ and $ from the path');
        $this->assertTrue($route->hasRequirement('foo'), '->hasRequirement() return true if requirement is set');
    }

    /**
     * @dataProvider getInvalidRequirements
     * @expectedException \InvalidArgumentException
     */
    public function testSetInvalidRequirement($req)
    {
        $route = new Route('/{foo}');
        $route->setRequirement('foo', $req);
    }

    public function getInvalidRequirements()
    {
        return array(
           array(''),
           array(array()),
           array('^$'),
           array('^'),
           array('$')
        );
    }

    public function testHost()
    {
        $route = new Route('/');
        $route->setHost('{locale}.example.net');
        $this->assertEquals('{locale}.example.net', $route->getHost(), '->setHost() sets the host pattern');
    }

    public function testScheme()
    {
        $route = new Route('/');
        $this->assertEquals(array(), $route->getSchemes(), 'schemes is initialized with array()');
        $route->setSchemes('hTTp');
        $this->assertEquals(array('http'), $route->getSchemes(), '->setSchemes() accepts a single scheme string and lowercases it');
        $route->setSchemes(array('HttpS', 'hTTp'));
        $this->assertEquals(array('https', 'http'), $route->getSchemes(), '->setSchemes() accepts an array of schemes and lowercases them');
    }

    public function testSchemeIsBC()
    {
        $route = new Route('/');
        $route->setRequirement('_scheme', 'http|https');
        $this->assertEquals('http|https', $route->getRequirement('_scheme'));
        $this->assertEquals(array('http', 'https'), $route->getSchemes());
        $route->setSchemes(array('hTTp'));
        $this->assertEquals('http', $route->getRequirement('_scheme'));
        $route->setSchemes(array());
        $this->assertNull($route->getRequirement('_scheme'));
    }

    public function testMethod()
    {
        $route = new Route('/');
        $this->assertEquals(array(), $route->getMethods(), 'methods is initialized with array()');
        $route->setMethods('gEt');
        $this->assertEquals(array('GET'), $route->getMethods(), '->setMethods() accepts a single method string and uppercases it');
        $route->setMethods(array('gEt', 'PosT'));
        $this->assertEquals(array('GET', 'POST'), $route->getMethods(), '->setMethods() accepts an array of methods and uppercases them');
    }

    public function testMethodIsBC()
    {
        $route = new Route('/');
        $route->setRequirement('_method', 'GET|POST');
        $this->assertEquals('GET|POST', $route->getRequirement('_method'));
        $this->assertEquals(array('GET', 'POST'), $route->getMethods());
        $route->setMethods(array('gEt'));
        $this->assertEquals('GET', $route->getRequirement('_method'));
        $route->setMethods(array());
        $this->assertNull($route->getRequirement('_method'));
    }

    public function testCondition()
    {
        $route = new Route('/');
        $this->assertEquals(null, $route->getCondition());
        $route->setCondition('context.getMethod() == "GET"');
        $this->assertEquals('context.getMethod() == "GET"', $route->getCondition());
    }

    public function testCompile()
    {
        $route = new Route('/{foo}');
        $this->assertInstanceOf('Symfony\Component\Routing\CompiledRoute', $compiled = $route->compile(), '->compile() returns a compiled route');
        $this->assertSame($compiled, $route->compile(), '->compile() only compiled the route once if unchanged');
        $route->setRequirement('foo', '.*');
        $this->assertNotSame($compiled, $route->compile(), '->compile() recompiles if the route was modified');
    }

    public function testPattern()
    {
        $route = new Route('/{foo}');
        $this->assertEquals('/{foo}', $route->getPattern());

        $route->setPattern('/bar');
        $this->assertEquals('/bar', $route->getPattern());
    }

    public function testSerialize()
    {
        $route = new Route('/{foo}', array('foo' => 'default'), array('foo' => '\d+'));

        $serialized = serialize($route);
        $unserialized = unserialize($serialized);

        $this->assertEquals($route, $unserialized);
        $this->assertNotSame($route, $unserialized);
    }
}
PKab�\������]pear/test/Routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Generator\Dumper;

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\Generator\Dumper\PhpGeneratorDumper;
use Symfony\Component\Routing\RequestContext;

class PhpGeneratorDumperTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var RouteCollection
     */
    private $routeCollection;

    /**
     * @var PhpGeneratorDumper
     */
    private $generatorDumper;

    /**
     * @var string
     */
    private $testTmpFilepath;

    protected function setUp()
    {
        parent::setUp();

        $this->routeCollection = new RouteCollection();
        $this->generatorDumper = new PhpGeneratorDumper($this->routeCollection);
        $this->testTmpFilepath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'php_generator.php';
        @unlink($this->testTmpFilepath);
    }

    protected function tearDown()
    {
        parent::tearDown();

        @unlink($this->testTmpFilepath);

        $this->routeCollection = null;
        $this->generatorDumper = null;
        $this->testTmpFilepath = null;
    }

    public function testDumpWithRoutes()
    {
        $this->routeCollection->add('Test', new Route('/testing/{foo}'));
        $this->routeCollection->add('Test2', new Route('/testing2'));

        file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump());
        include ($this->testTmpFilepath);

        $projectUrlGenerator = new \ProjectUrlGenerator(new RequestContext('/app.php'));

        $absoluteUrlWithParameter    = $projectUrlGenerator->generate('Test', array('foo' => 'bar'), true);
        $absoluteUrlWithoutParameter = $projectUrlGenerator->generate('Test2', array(), true);
        $relativeUrlWithParameter    = $projectUrlGenerator->generate('Test', array('foo' => 'bar'), false);
        $relativeUrlWithoutParameter = $projectUrlGenerator->generate('Test2', array(), false);

        $this->assertEquals($absoluteUrlWithParameter, 'http://localhost/app.php/testing/bar');
        $this->assertEquals($absoluteUrlWithoutParameter, 'http://localhost/app.php/testing2');
        $this->assertEquals($relativeUrlWithParameter, '/app.php/testing/bar');
        $this->assertEquals($relativeUrlWithoutParameter, '/app.php/testing2');
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testDumpWithoutRoutes()
    {
        file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'WithoutRoutesUrlGenerator')));
        include ($this->testTmpFilepath);

        $projectUrlGenerator = new \WithoutRoutesUrlGenerator(new RequestContext('/app.php'));

        $projectUrlGenerator->generate('Test', array());
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException
     */
    public function testGenerateNonExistingRoute()
    {
        $this->routeCollection->add('Test', new Route('/test'));

        file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'NonExistingRoutesUrlGenerator')));
        include ($this->testTmpFilepath);

        $projectUrlGenerator = new \NonExistingRoutesUrlGenerator(new RequestContext());
        $url = $projectUrlGenerator->generate('NonExisting', array());
    }

    public function testDumpForRouteWithDefaults()
    {
        $this->routeCollection->add('Test', new Route('/testing/{foo}', array('foo' => 'bar')));

        file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'DefaultRoutesUrlGenerator')));
        include ($this->testTmpFilepath);

        $projectUrlGenerator = new \DefaultRoutesUrlGenerator(new RequestContext());
        $url = $projectUrlGenerator->generate('Test', array());

        $this->assertEquals($url, '/testing');
    }
}
PKbb�\ kl�g�gPpear/test/Routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests\Generator;

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RequestContext;

class UrlGeneratorTest extends \PHPUnit_Framework_TestCase
{
    public function testAbsoluteUrlWithPort80()
    {
        $routes = $this->getRoutes('test', new Route('/testing'));
        $url = $this->getGenerator($routes)->generate('test', array(), true);

        $this->assertEquals('http://localhost/app.php/testing', $url);
    }

    public function testAbsoluteSecureUrlWithPort443()
    {
        $routes = $this->getRoutes('test', new Route('/testing'));
        $url = $this->getGenerator($routes, array('scheme' => 'https'))->generate('test', array(), true);

        $this->assertEquals('https://localhost/app.php/testing', $url);
    }

    public function testAbsoluteUrlWithNonStandardPort()
    {
        $routes = $this->getRoutes('test', new Route('/testing'));
        $url = $this->getGenerator($routes, array('httpPort' => 8080))->generate('test', array(), true);

        $this->assertEquals('http://localhost:8080/app.php/testing', $url);
    }

    public function testAbsoluteSecureUrlWithNonStandardPort()
    {
        $routes = $this->getRoutes('test', new Route('/testing'));
        $url = $this->getGenerator($routes, array('httpsPort' => 8080, 'scheme' => 'https'))->generate('test', array(), true);

        $this->assertEquals('https://localhost:8080/app.php/testing', $url);
    }

    public function testRelativeUrlWithoutParameters()
    {
        $routes = $this->getRoutes('test', new Route('/testing'));
        $url = $this->getGenerator($routes)->generate('test', array(), false);

        $this->assertEquals('/app.php/testing', $url);
    }

    public function testRelativeUrlWithParameter()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{foo}'));
        $url = $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), false);

        $this->assertEquals('/app.php/testing/bar', $url);
    }

    public function testRelativeUrlWithNullParameter()
    {
        $routes = $this->getRoutes('test', new Route('/testing.{format}', array('format' => null)));
        $url = $this->getGenerator($routes)->generate('test', array(), false);

        $this->assertEquals('/app.php/testing', $url);
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
     */
    public function testRelativeUrlWithNullParameterButNotOptional()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{foo}/bar', array('foo' => null)));
        // This must raise an exception because the default requirement for "foo" is "[^/]+" which is not met with these params.
        // Generating path "/testing//bar" would be wrong as matching this route would fail.
        $this->getGenerator($routes)->generate('test', array(), false);
    }

    public function testRelativeUrlWithOptionalZeroParameter()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{page}'));
        $url = $this->getGenerator($routes)->generate('test', array('page' => 0), false);

        $this->assertEquals('/app.php/testing/0', $url);
    }

    public function testNotPassedOptionalParameterInBetween()
    {
        $routes = $this->getRoutes('test', new Route('/{slug}/{page}', array('slug' => 'index', 'page' => 0)));
        $this->assertSame('/app.php/index/1', $this->getGenerator($routes)->generate('test', array('page' => 1)));
        $this->assertSame('/app.php/', $this->getGenerator($routes)->generate('test'));
    }

    public function testRelativeUrlWithExtraParameters()
    {
        $routes = $this->getRoutes('test', new Route('/testing'));
        $url = $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), false);

        $this->assertEquals('/app.php/testing?foo=bar', $url);
    }

    public function testAbsoluteUrlWithExtraParameters()
    {
        $routes = $this->getRoutes('test', new Route('/testing'));
        $url = $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), true);

        $this->assertEquals('http://localhost/app.php/testing?foo=bar', $url);
    }

    public function testUrlWithNullExtraParameters()
    {
        $routes = $this->getRoutes('test', new Route('/testing'));
        $url = $this->getGenerator($routes)->generate('test', array('foo' => null), true);

        $this->assertEquals('http://localhost/app.php/testing', $url);
    }

    public function testUrlWithExtraParametersFromGlobals()
    {
        $routes = $this->getRoutes('test', new Route('/testing'));
        $generator = $this->getGenerator($routes);
        $context = new RequestContext('/app.php');
        $context->setParameter('bar', 'bar');
        $generator->setContext($context);
        $url = $generator->generate('test', array('foo' => 'bar'));

        $this->assertEquals('/app.php/testing?foo=bar', $url);
    }

    public function testUrlWithGlobalParameter()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{foo}'));
        $generator = $this->getGenerator($routes);
        $context = new RequestContext('/app.php');
        $context->setParameter('foo', 'bar');
        $generator->setContext($context);
        $url = $generator->generate('test', array());

        $this->assertEquals('/app.php/testing/bar', $url);
    }

    public function testGlobalParameterHasHigherPriorityThanDefault()
    {
        $routes = $this->getRoutes('test', new Route('/{_locale}', array('_locale' => 'en')));
        $generator = $this->getGenerator($routes);
        $context = new RequestContext('/app.php');
        $context->setParameter('_locale', 'de');
        $generator->setContext($context);
        $url = $generator->generate('test', array());

        $this->assertSame('/app.php/de', $url);
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException
     */
    public function testGenerateWithoutRoutes()
    {
        $routes = $this->getRoutes('foo', new Route('/testing/{foo}'));
        $this->getGenerator($routes)->generate('test', array(), true);
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\MissingMandatoryParametersException
     */
    public function testGenerateForRouteWithoutMandatoryParameter()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{foo}'));
        $this->getGenerator($routes)->generate('test', array(), true);
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
     */
    public function testGenerateForRouteWithInvalidOptionalParameter()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+')));
        $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), true);
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
     */
    public function testGenerateForRouteWithInvalidParameter()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{foo}', array(), array('foo' => '1|2')));
        $this->getGenerator($routes)->generate('test', array('foo' => '0'), true);
    }

    public function testGenerateForRouteWithInvalidOptionalParameterNonStrict()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+')));
        $generator = $this->getGenerator($routes);
        $generator->setStrictRequirements(false);
        $this->assertNull($generator->generate('test', array('foo' => 'bar'), true));
    }

    public function testGenerateForRouteWithInvalidOptionalParameterNonStrictWithLogger()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+')));
        $logger = $this->getMock('Psr\Log\LoggerInterface');
        $logger->expects($this->once())
            ->method('error');
        $generator = $this->getGenerator($routes, array(), $logger);
        $generator->setStrictRequirements(false);
        $this->assertNull($generator->generate('test', array('foo' => 'bar'), true));
    }

    public function testGenerateForRouteWithInvalidParameterButDisabledRequirementsCheck()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+')));
        $generator = $this->getGenerator($routes);
        $generator->setStrictRequirements(null);
        $this->assertSame('/app.php/testing/bar', $generator->generate('test', array('foo' => 'bar')));
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
     */
    public function testGenerateForRouteWithInvalidMandatoryParameter()
    {
        $routes = $this->getRoutes('test', new Route('/testing/{foo}', array(), array('foo' => 'd+')));
        $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), true);
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
     */
    public function testRequiredParamAndEmptyPassed()
    {
        $routes = $this->getRoutes('test', new Route('/{slug}', array(), array('slug' => '.+')));
        $this->getGenerator($routes)->generate('test', array('slug' => ''));
    }

    public function testSchemeRequirementDoesNothingIfSameCurrentScheme()
    {
        $routes = $this->getRoutes('test', new Route('/', array(), array('_scheme' => 'http')));
        $this->assertEquals('/app.php/', $this->getGenerator($routes)->generate('test'));

        $routes = $this->getRoutes('test', new Route('/', array(), array('_scheme' => 'https')));
        $this->assertEquals('/app.php/', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test'));
    }

    public function testSchemeRequirementForcesAbsoluteUrl()
    {
        $routes = $this->getRoutes('test', new Route('/', array(), array('_scheme' => 'https')));
        $this->assertEquals('https://localhost/app.php/', $this->getGenerator($routes)->generate('test'));

        $routes = $this->getRoutes('test', new Route('/', array(), array('_scheme' => 'http')));
        $this->assertEquals('http://localhost/app.php/', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test'));
    }

    public function testPathWithTwoStartingSlashes()
    {
        $routes = $this->getRoutes('test', new Route('//path-and-not-domain'));

        // this must not generate '//path-and-not-domain' because that would be a network path
        $this->assertSame('/path-and-not-domain', $this->getGenerator($routes, array('BaseUrl' => ''))->generate('test'));
    }

    public function testNoTrailingSlashForMultipleOptionalParameters()
    {
        $routes = $this->getRoutes('test', new Route('/category/{slug1}/{slug2}/{slug3}', array('slug2' => null, 'slug3' => null)));

        $this->assertEquals('/app.php/category/foo', $this->getGenerator($routes)->generate('test', array('slug1' => 'foo')));
    }

    public function testWithAnIntegerAsADefaultValue()
    {
        $routes = $this->getRoutes('test', new Route('/{default}', array('default' => 0)));

        $this->assertEquals('/app.php/foo', $this->getGenerator($routes)->generate('test', array('default' => 'foo')));
    }

    public function testNullForOptionalParameterIsIgnored()
    {
        $routes = $this->getRoutes('test', new Route('/test/{default}', array('default' => 0)));

        $this->assertEquals('/app.php/test', $this->getGenerator($routes)->generate('test', array('default' => null)));
    }

    public function testQueryParamSameAsDefault()
    {
        $routes = $this->getRoutes('test', new Route('/test', array('default' => 'value')));

        $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test', array('default' => 'foo')));
        $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test', array('default' => 'value')));
        $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test'));
    }

    public function testGenerateWithSpecialRouteName()
    {
        $routes = $this->getRoutes('$péß^a|', new Route('/bar'));

        $this->assertSame('/app.php/bar', $this->getGenerator($routes)->generate('$péß^a|'));
    }

    public function testUrlEncoding()
    {
        // This tests the encoding of reserved characters that are used for delimiting of URI components (defined in RFC 3986)
        // and other special ASCII chars. These chars are tested as static text path, variable path and query param.
        $chars = '@:[]/()*\'" +,;-._~&$<>|{}%\\^`!?foo=bar#id';
        $routes = $this->getRoutes('test', new Route("/$chars/{varpath}", array(), array('varpath' => '.+')));
        $this->assertSame('/app.php/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
           .'/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
           .'?query=%40%3A%5B%5D%2F%28%29%2A%27%22+%2B%2C%3B-._%7E%26%24%3C%3E%7C%7B%7D%25%5C%5E%60%21%3Ffoo%3Dbar%23id',
            $this->getGenerator($routes)->generate('test', array(
                'varpath' => $chars,
                'query' => $chars
            ))
        );
    }

    public function testEncodingOfRelativePathSegments()
    {
        $routes = $this->getRoutes('test', new Route('/dir/../dir/..'));
        $this->assertSame('/app.php/dir/%2E%2E/dir/%2E%2E', $this->getGenerator($routes)->generate('test'));
        $routes = $this->getRoutes('test', new Route('/dir/./dir/.'));
        $this->assertSame('/app.php/dir/%2E/dir/%2E', $this->getGenerator($routes)->generate('test'));
        $routes = $this->getRoutes('test', new Route('/a./.a/a../..a/...'));
        $this->assertSame('/app.php/a./.a/a../..a/...', $this->getGenerator($routes)->generate('test'));
    }

    public function testAdjacentVariables()
    {
        $routes = $this->getRoutes('test', new Route('/{x}{y}{z}.{_format}', array('z' => 'default-z', '_format' => 'html'), array('y' => '\d+')));
        $generator = $this->getGenerator($routes);
        $this->assertSame('/app.php/foo123', $generator->generate('test', array('x' => 'foo', 'y' => '123')));
        $this->assertSame('/app.php/foo123bar.xml', $generator->generate('test', array('x' => 'foo', 'y' => '123', 'z' => 'bar', '_format' => 'xml')));

        // The default requirement for 'x' should not allow the separator '.' in this case because it would otherwise match everything
        // and following optional variables like _format could never match.
        $this->setExpectedException('Symfony\Component\Routing\Exception\InvalidParameterException');
        $generator->generate('test', array('x' => 'do.t', 'y' => '123', 'z' => 'bar', '_format' => 'xml'));
    }

    public function testOptionalVariableWithNoRealSeparator()
    {
        $routes = $this->getRoutes('test', new Route('/get{what}', array('what' => 'All')));
        $generator = $this->getGenerator($routes);

        $this->assertSame('/app.php/get', $generator->generate('test'));
        $this->assertSame('/app.php/getSites', $generator->generate('test', array('what' => 'Sites')));
    }

    public function testRequiredVariableWithNoRealSeparator()
    {
        $routes = $this->getRoutes('test', new Route('/get{what}Suffix'));
        $generator = $this->getGenerator($routes);

        $this->assertSame('/app.php/getSitesSuffix', $generator->generate('test', array('what' => 'Sites')));
    }

    public function testDefaultRequirementOfVariable()
    {
        $routes = $this->getRoutes('test', new Route('/{page}.{_format}'));
        $generator = $this->getGenerator($routes);

        $this->assertSame('/app.php/index.mobile.html', $generator->generate('test', array('page' => 'index', '_format' => 'mobile.html')));
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
     */
    public function testDefaultRequirementOfVariableDisallowsSlash()
    {
        $routes = $this->getRoutes('test', new Route('/{page}.{_format}'));
        $this->getGenerator($routes)->generate('test', array('page' => 'index', '_format' => 'sl/ash'));
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
     */
    public function testDefaultRequirementOfVariableDisallowsNextSeparator()
    {
        $routes = $this->getRoutes('test', new Route('/{page}.{_format}'));
        $this->getGenerator($routes)->generate('test', array('page' => 'do.t', '_format' => 'html'));
    }

    public function testWithHostDifferentFromContext()
    {
        $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com'));

        $this->assertEquals('//fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test', array('name' =>'Fabien', 'locale' => 'fr')));
    }

    public function testWithHostSameAsContext()
    {
        $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com'));

        $this->assertEquals('/app.php/Fabien', $this->getGenerator($routes, array('host' => 'fr.example.com'))->generate('test', array('name' =>'Fabien', 'locale' => 'fr')));
    }

    public function testWithHostSameAsContextAndAbsolute()
    {
        $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com'));

        $this->assertEquals('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes, array('host' => 'fr.example.com'))->generate('test', array('name' =>'Fabien', 'locale' => 'fr'), true));
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
     */
    public function testUrlWithInvalidParameterInHost()
    {
        $routes = $this->getRoutes('test', new Route('/', array(), array('foo' => 'bar'), array(), '{foo}.example.com'));
        $this->getGenerator($routes)->generate('test', array('foo' => 'baz'), false);
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
     */
    public function testUrlWithInvalidParameterInHostWhenParamHasADefaultValue()
    {
        $routes = $this->getRoutes('test', new Route('/', array('foo' => 'bar'), array('foo' => 'bar'), array(), '{foo}.example.com'));
        $this->getGenerator($routes)->generate('test', array('foo' => 'baz'), false);
    }

    /**
     * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
     */
    public function testUrlWithInvalidParameterEqualsDefaultValueInHost()
    {
        $routes = $this->getRoutes('test', new Route('/', array('foo' => 'baz'), array('foo' => 'bar'), array(), '{foo}.example.com'));
        $this->getGenerator($routes)->generate('test', array('foo' => 'baz'), false);
    }

    public function testUrlWithInvalidParameterInHostInNonStrictMode()
    {
        $routes = $this->getRoutes('test', new Route('/', array(), array('foo' => 'bar'), array(), '{foo}.example.com'));
        $generator = $this->getGenerator($routes);
        $generator->setStrictRequirements(false);
        $this->assertNull($generator->generate('test', array('foo' => 'baz'), false));
    }

    public function testGenerateNetworkPath()
    {
        $routes = $this->getRoutes('test', new Route('/{name}', array(), array('_scheme' => 'http'), array(), '{locale}.example.com'));

        $this->assertSame('//fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test',
            array('name' =>'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::NETWORK_PATH), 'network path with different host'
        );
        $this->assertSame('//fr.example.com/app.php/Fabien?query=string', $this->getGenerator($routes, array('host' => 'fr.example.com'))->generate('test',
            array('name' =>'Fabien', 'locale' => 'fr', 'query' => 'string'), UrlGeneratorInterface::NETWORK_PATH), 'network path although host same as context'
        );
        $this->assertSame('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test',
            array('name' =>'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::NETWORK_PATH), 'absolute URL because scheme requirement does not match context'
        );
        $this->assertSame('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test',
            array('name' =>'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::ABSOLUTE_URL), 'absolute URL with same scheme because it is requested'
        );
    }

    public function testGenerateRelativePath()
    {
        $routes = new RouteCollection();
        $routes->add('article', new Route('/{author}/{article}/'));
        $routes->add('comments', new Route('/{author}/{article}/comments'));
        $routes->add('host', new Route('/{article}', array(), array(), array(), '{author}.example.com'));
        $routes->add('scheme', new Route('/{author}', array(), array('_scheme' => 'https')));
        $routes->add('unrelated', new Route('/about'));

        $generator = $this->getGenerator($routes, array('host' => 'example.com', 'pathInfo' => '/fabien/symfony-is-great/'));

        $this->assertSame('comments', $generator->generate('comments',
            array('author' =>'fabien', 'article' => 'symfony-is-great'), UrlGeneratorInterface::RELATIVE_PATH)
        );
        $this->assertSame('comments?page=2', $generator->generate('comments',
            array('author' =>'fabien', 'article' => 'symfony-is-great', 'page' => 2), UrlGeneratorInterface::RELATIVE_PATH)
        );
        $this->assertSame('../twig-is-great/', $generator->generate('article',
            array('author' =>'fabien', 'article' => 'twig-is-great'), UrlGeneratorInterface::RELATIVE_PATH)
        );
        $this->assertSame('../../bernhard/forms-are-great/', $generator->generate('article',
            array('author' =>'bernhard', 'article' => 'forms-are-great'), UrlGeneratorInterface::RELATIVE_PATH)
        );
        $this->assertSame('//bernhard.example.com/app.php/forms-are-great', $generator->generate('host',
            array('author' =>'bernhard', 'article' => 'forms-are-great'), UrlGeneratorInterface::RELATIVE_PATH)
        );
        $this->assertSame('https://example.com/app.php/bernhard', $generator->generate('scheme',
            array('author' =>'bernhard'), UrlGeneratorInterface::RELATIVE_PATH)
        );
        $this->assertSame('../../about', $generator->generate('unrelated',
            array(), UrlGeneratorInterface::RELATIVE_PATH)
        );
    }

    /**
     * @dataProvider provideRelativePaths
     */
    public function testGetRelativePath($sourcePath, $targetPath, $expectedPath)
    {
        $this->assertSame($expectedPath, UrlGenerator::getRelativePath($sourcePath, $targetPath));
    }

    public function provideRelativePaths()
    {
        return array(
            array(
                '/same/dir/',
                '/same/dir/',
                ''
            ),
            array(
                '/same/file',
                '/same/file',
                ''
            ),
            array(
                '/',
                '/file',
                'file'
            ),
            array(
                '/',
                '/dir/file',
                'dir/file'
            ),
            array(
                '/dir/file.html',
                '/dir/different-file.html',
                'different-file.html'
            ),
            array(
                '/same/dir/extra-file',
                '/same/dir/',
                './'
            ),
            array(
                '/parent/dir/',
                '/parent/',
                '../'
            ),
            array(
                '/parent/dir/extra-file',
                '/parent/',
                '../'
            ),
            array(
                '/a/b/',
                '/x/y/z/',
                '../../x/y/z/'
            ),
            array(
                '/a/b/c/d/e',
                '/a/c/d',
                '../../../c/d'
            ),
            array(
                '/a/b/c//',
                '/a/b/c/',
                '../'
            ),
            array(
                '/a/b/c/',
                '/a/b/c//',
                './/'
            ),
            array(
                '/root/a/b/c/',
                '/root/x/b/c/',
                '../../../x/b/c/'
            ),
            array(
                '/a/b/c/d/',
                '/a',
                '../../../../a'
            ),
            array(
                '/special-chars/sp%20ce/1€/mäh/e=mc²',
                '/special-chars/sp%20ce/1€/<µ>/e=mc²',
                '../<µ>/e=mc²'
            ),
            array(
                'not-rooted',
                'dir/file',
                'dir/file'
            ),
            array(
                '//dir/',
                '',
                '../../'
            ),
            array(
                '/dir/',
                '/dir/file:with-colon',
                './file:with-colon'
            ),
            array(
                '/dir/',
                '/dir/subdir/file:with-colon',
                'subdir/file:with-colon'
            ),
            array(
                '/dir/',
                '/dir/:subdir/',
                './:subdir/'
            ),
        );
    }

    protected function getGenerator(RouteCollection $routes, array $parameters = array(), $logger = null)
    {
        $context = new RequestContext('/app.php');
        foreach ($parameters as $key => $value) {
            $method = 'set'.$key;
            $context->$method($value);
        }
        $generator = new UrlGenerator($routes, $context, $logger);

        return $generator;
    }

    protected function getRoutes($name, Route $route)
    {
        $routes = new RouteCollection();
        $routes->add($name, $route);

        return $routes;
    }
}
PKbb�\�%��])])Gpear/test/Routing/Symfony/Component/Routing/Tests/RouteCompilerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Routing\Tests;

use Symfony\Component\Routing\Route;

class RouteCompilerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provideCompileData
     */
    public function testCompile($name, $arguments, $prefix, $regex, $variables, $tokens)
    {
        $r = new \ReflectionClass('Symfony\\Component\\Routing\\Route');
        $route = $r->newInstanceArgs($arguments);

        $compiled = $route->compile();
        $this->assertEquals($prefix, $compiled->getStaticPrefix(), $name.' (static prefix)');
        $this->assertEquals($regex, $compiled->getRegex(), $name.' (regex)');
        $this->assertEquals($variables, $compiled->getVariables(), $name.' (variables)');
        $this->assertEquals($tokens, $compiled->getTokens(), $name.' (tokens)');
    }

    public function provideCompileData()
    {
        return array(
            array(
                'Static route',
                array('/foo'),
                '/foo', '#^/foo$#s', array(), array(
                    array('text', '/foo'),
                )),

            array(
                'Route with a variable',
                array('/foo/{bar}'),
                '/foo', '#^/foo/(?P<bar>[^/]++)$#s', array('bar'), array(
                    array('variable', '/', '[^/]++', 'bar'),
                    array('text', '/foo'),
                )),

            array(
                'Route with a variable that has a default value',
                array('/foo/{bar}', array('bar' => 'bar')),
                '/foo', '#^/foo(?:/(?P<bar>[^/]++))?$#s', array('bar'), array(
                    array('variable', '/', '[^/]++', 'bar'),
                    array('text', '/foo'),
                )),

            array(
                'Route with several variables',
                array('/foo/{bar}/{foobar}'),
                '/foo', '#^/foo/(?P<bar>[^/]++)/(?P<foobar>[^/]++)$#s', array('bar', 'foobar'), array(
                    array('variable', '/', '[^/]++', 'foobar'),
                    array('variable', '/', '[^/]++', 'bar'),
                    array('text', '/foo'),
                )),

            array(
                'Route with several variables that have default values',
                array('/foo/{bar}/{foobar}', array('bar' => 'bar', 'foobar' => '')),
                '/foo', '#^/foo(?:/(?P<bar>[^/]++)(?:/(?P<foobar>[^/]++))?)?$#s', array('bar', 'foobar'), array(
                    array('variable', '/', '[^/]++', 'foobar'),
                    array('variable', '/', '[^/]++', 'bar'),
                    array('text', '/foo'),
                )),

            array(
                'Route with several variables but some of them have no default values',
                array('/foo/{bar}/{foobar}', array('bar' => 'bar')),
                '/foo', '#^/foo/(?P<bar>[^/]++)/(?P<foobar>[^/]++)$#s', array('bar', 'foobar'), array(
                    array('variable', '/', '[^/]++', 'foobar'),
                    array('variable', '/', '[^/]++', 'bar'),
                    array('text', '/foo'),
                )),

            array(
                'Route with an optional variable as the first segment',
                array('/{bar}', array('bar' => 'bar')),
                '', '#^/(?P<bar>[^/]++)?$#s', array('bar'), array(
                    array('variable', '/', '[^/]++', 'bar'),
                )),

            array(
                'Route with a requirement of 0',
                array('/{bar}', array('bar' => null), array('bar' => '0')),
                '', '#^/(?P<bar>0)?$#s', array('bar'), array(
                    array('variable', '/', '0', 'bar'),
                )),

            array(
                'Route with an optional variable as the first segment with requirements',
                array('/{bar}', array('bar' => 'bar'), array('bar' => '(foo|bar)')),
                '', '#^/(?P<bar>(foo|bar))?$#s', array('bar'), array(
                    array('variable', '/', '(foo|bar)', 'bar'),
                )),

            array(
                'Route with only optional variables',
                array('/{foo}/{bar}', array('foo' => 'foo', 'bar' => 'bar')),
                '', '#^/(?P<foo>[^/]++)?(?:/(?P<bar>[^/]++))?$#s', array('foo', 'bar'), array(
                    array('variable', '/', '[^/]++', 'bar'),
                    array('variable', '/', '[^/]++', 'foo'),
                )),

            array(
                'Route with a variable in last position',
                array('/foo-{bar}'),
                '/foo', '#^/foo\-(?P<bar>[^/]++)$#s', array('bar'), array(
                array('variable', '-', '[^/]++', 'bar'),
                array('text', '/foo'),
            )),

            array(
                'Route with nested placeholders',
                array('/{static{var}static}'),
                '/{static', '#^/\{static(?P<var>[^/]+)static\}$#s', array('var'), array(
                array('text', 'static}'),
                array('variable', '', '[^/]+', 'var'),
                array('text', '/{static'),
            )),

            array(
                'Route without separator between variables',
                array('/{w}{x}{y}{z}.{_format}', array('z' => 'default-z', '_format' => 'html'), array('y' => '(y|Y)')),
                '', '#^/(?P<w>[^/\.]+)(?P<x>[^/\.]+)(?P<y>(y|Y))(?:(?P<z>[^/\.]++)(?:\.(?P<_format>[^/]++))?)?$#s', array('w', 'x', 'y', 'z', '_format'), array(
                array('variable', '.', '[^/]++', '_format'),
                array('variable', '', '[^/\.]++', 'z'),
                array('variable', '', '(y|Y)', 'y'),
                array('variable', '', '[^/\.]+', 'x'),
                array('variable', '/', '[^/\.]+', 'w'),
            )),

            array(
                'Route with a format',
                array('/foo/{bar}.{_format}'),
                '/foo', '#^/foo/(?P<bar>[^/\.]++)\.(?P<_format>[^/]++)$#s', array('bar', '_format'), array(
                array('variable', '.', '[^/]++', '_format'),
                array('variable', '/', '[^/\.]++', 'bar'),
                array('text', '/foo'),
            )),
        );
    }

    /**
     * @expectedException \LogicException
     */
    public function testRouteWithSameVariableTwice()
    {
        $route = new Route('/{name}/{name}');

        $compiled = $route->compile();
    }

    /**
     * @dataProvider getNumericVariableNames
     * @expectedException \DomainException
     */
    public function testRouteWithNumericVariableName($name)
    {
        $route = new Route('/{'. $name.'}');
        $route->compile();
    }

    public function getNumericVariableNames()
    {
        return array(
           array('09'),
           array('123'),
           array('1e2')
        );
    }

    /**
     * @dataProvider provideCompileWithHostData
     */
    public function testCompileWithHost($name, $arguments, $prefix, $regex, $variables, $pathVariables, $tokens, $hostRegex, $hostVariables, $hostTokens)
    {
        $r = new \ReflectionClass('Symfony\\Component\\Routing\\Route');
        $route = $r->newInstanceArgs($arguments);

        $compiled = $route->compile();
        $this->assertEquals($prefix, $compiled->getStaticPrefix(), $name.' (static prefix)');
        $this->assertEquals($regex, str_replace(array("\n", ' '), '', $compiled->getRegex()), $name.' (regex)');
        $this->assertEquals($variables, $compiled->getVariables(), $name.' (variables)');
        $this->assertEquals($pathVariables, $compiled->getPathVariables(), $name.' (path variables)');
        $this->assertEquals($tokens, $compiled->getTokens(), $name.' (tokens)');
        $this->assertEquals($hostRegex, str_replace(array("\n", ' '), '', $compiled->getHostRegex()), $name.' (host regex)');
        $this->assertEquals($hostVariables, $compiled->getHostVariables(), $name.' (host variables)');
        $this->assertEquals($hostTokens, $compiled->getHostTokens(), $name.' (host tokens)');
    }

    public function provideCompileWithHostData()
    {
        return array(
            array(
                'Route with host pattern',
                array('/hello', array(), array(), array(), 'www.example.com'),
                '/hello', '#^/hello$#s', array(), array(), array(
                    array('text', '/hello'),
                ),
                '#^www\.example\.com$#s', array(), array(
                    array('text', 'www.example.com'),
                ),
            ),
            array(
                'Route with host pattern and some variables',
                array('/hello/{name}', array(), array(), array(), 'www.example.{tld}'),
                '/hello', '#^/hello/(?P<name>[^/]++)$#s', array('tld', 'name'), array('name'), array(
                    array('variable', '/', '[^/]++', 'name'),
                    array('text', '/hello'),
                ),
                '#^www\.example\.(?P<tld>[^\.]++)$#s', array('tld'), array(
                    array('variable', '.', '[^\.]++', 'tld'),
                    array('text', 'www.example'),
                ),
            ),
            array(
                'Route with variable at beginning of host',
                array('/hello', array(), array(), array(), '{locale}.example.{tld}'),
                '/hello', '#^/hello$#s', array('locale', 'tld'), array(), array(
                    array('text', '/hello'),
                ),
                '#^(?P<locale>[^\.]++)\.example\.(?P<tld>[^\.]++)$#s', array('locale', 'tld'), array(
                    array('variable', '.', '[^\.]++', 'tld'),
                    array('text', '.example'),
                    array('variable', '', '[^\.]++', 'locale'),
                ),
            ),
            array(
                'Route with host variables that has a default value',
                array('/hello', array('locale' => 'a', 'tld' => 'b'), array(), array(), '{locale}.example.{tld}'),
                '/hello', '#^/hello$#s', array('locale', 'tld'), array(), array(
                    array('text', '/hello'),
                ),
                '#^(?P<locale>[^\.]++)\.example\.(?P<tld>[^\.]++)$#s', array('locale', 'tld'), array(
                    array('variable', '.', '[^\.]++', 'tld'),
                    array('text', '.example'),
                    array('variable', '', '[^\.]++', 'locale'),
                ),
            ),
        );
    }
}
PKbb�\�ޠ�77Apear/test/DoctrineBridge/Symfony/Bridge/Doctrine/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="Tests/bootstrap.php"
>
    <testsuites>
        <testsuite name="Symfony Doctrine Bridge Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PKcb�\��.���Npear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DoctrineOrmTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests;

use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper;

/**
 * Class DoctrineOrmTestCase
 *
 * @deprecated Deprecated as of Symfony 2.4, to be removed in Symfony 3.0.
 *             Use {@link DoctrineTestHelper} instead.
 */
abstract class DoctrineOrmTestCase extends \PHPUnit_Framework_TestCase
{
    /**
     * @return \Doctrine\ORM\EntityManager
     */
    public static function createTestEntityManager()
    {
        return DoctrineTestHelper::createTestEntityManager();
    }
}
PKcb�\�����Ppear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Logger/DbalLoggerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Logger;

use Symfony\Bridge\Doctrine\Logger\DbalLogger;

class DbalLoggerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getLogFixtures
     */
    public function testLog($sql, $params, $logParams)
    {
        $logger = $this->getMock('Psr\\Log\\LoggerInterface');

        $dbalLogger = $this
            ->getMockBuilder('Symfony\\Bridge\\Doctrine\\Logger\\DbalLogger')
            ->setConstructorArgs(array($logger, null))
            ->setMethods(array('log'))
            ->getMock()
        ;

        $dbalLogger
            ->expects($this->once())
            ->method('log')
            ->with($sql, $logParams)
        ;

        $dbalLogger->startQuery($sql, $params);
    }

    public function getLogFixtures()
    {
        return array(
            array('SQL', null, array()),
            array('SQL', array(), array()),
            array('SQL', array('foo' => 'bar'), array('foo' => 'bar'))
        );
    }

    public function testLogNonUtf8()
    {
        $logger = $this->getMock('Psr\\Log\\LoggerInterface');

        $dbalLogger = $this
            ->getMockBuilder('Symfony\\Bridge\\Doctrine\\Logger\\DbalLogger')
            ->setConstructorArgs(array($logger, null))
            ->setMethods(array('log'))
            ->getMock()
        ;

        $dbalLogger
            ->expects($this->once())
            ->method('log')
            ->with('SQL', array('utf8' => 'foo', 'nonutf8' => DbalLogger::BINARY_DATA_VALUE))
        ;

        $dbalLogger->startQuery('SQL', array(
            'utf8'    => 'foo',
            'nonutf8' => "\x7F\xFF",
        ));
    }

    public function testLogLongString()
    {
        $logger = $this->getMock('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface');

        $dbalLogger = $this
            ->getMockBuilder('Symfony\\Bridge\\Doctrine\\Logger\\DbalLogger')
            ->setConstructorArgs(array($logger, null))
            ->setMethods(array('log'))
            ->getMock()
        ;

        $testString = 'abc';

        $shortString = str_pad('', DbalLogger::MAX_STRING_LENGTH, $testString);
        $longString = str_pad('', DbalLogger::MAX_STRING_LENGTH+1, $testString);

        $dbalLogger
            ->expects($this->once())
            ->method('log')
            ->with('SQL', array('short' => $shortString, 'long' => substr($longString, 0, DbalLogger::MAX_STRING_LENGTH - 6).' [...]'))
        ;

        $dbalLogger->startQuery('SQL', array(
            'short' => $shortString,
            'long'  => $longString,
        ));
    }

    public function testLogUTF8LongString()
    {
        if (!function_exists('mb_detect_encoding')) {
            $this->markTestSkipped('Testing log shortening of utf8 charsets requires the mb_detect_encoding() function.');
        }

        $logger = $this->getMock('Symfony\\Component\\HttpKernel\\Log\\LoggerInterface');

        $dbalLogger = $this
            ->getMockBuilder('Symfony\\Bridge\\Doctrine\\Logger\\DbalLogger')
            ->setConstructorArgs(array($logger, null))
            ->setMethods(array('log'))
            ->getMock()
        ;

        $testStringArray = array('é', 'á', 'ű', 'ő', 'ú', 'ö', 'ü', 'ó', 'í');
        $testStringCount = count($testStringArray);

        $shortString = '';
        $longString = '';
        for ($i = 1; $i <= DbalLogger::MAX_STRING_LENGTH; $i++) {
            $shortString .= $testStringArray[$i % $testStringCount];
            $longString .= $testStringArray[$i % $testStringCount];
        }
        $longString .= $testStringArray[$i % $testStringCount];

        $dbalLogger
            ->expects($this->once())
            ->method('log')
            ->with('SQL', array('short' => $shortString, 'long' => mb_substr($longString, 0, DbalLogger::MAX_STRING_LENGTH - 6, mb_detect_encoding($longString)).' [...]'))
        ;

        $dbalLogger->startQuery('SQL', array(
                'short' => $shortString,
                'long'  => $longString,
            ));
    }

}
PKcb�\O����pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bridge\Doctrine\Tests\DependencyInjection\CompilerPass;

use Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterEventListenersAndSubscribersPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class RegisterEventListenersAndSubscribersPassTest extends \PHPUnit_Framework_TestCase
{
    public function testProcessEventListenersWithPriorities()
    {
        $container = $this->createBuilder();

        $container
            ->register('a', 'stdClass')
            ->addTag('doctrine.event_listener', array(
                'event' => 'foo',
                'priority' => -5,
            ))
            ->addTag('doctrine.event_listener', array(
                'event' => 'bar',
            ))
        ;
        $container
            ->register('b', 'stdClass')
            ->addTag('doctrine.event_listener', array(
                'event' => 'foo',
            ))
        ;

        $this->process($container);
        $this->assertEquals(array('b', 'a'), $this->getServiceOrder($container, 'addEventListener'));

        $calls = $container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls();
        $this->assertEquals(array('foo', 'bar'), $calls[1][1][0]);
    }

    public function testProcessEventListenersWithMultipleConnections()
    {
        $container = $this->createBuilder(true);

        $container
            ->register('a', 'stdClass')
            ->addTag('doctrine.event_listener', array(
                'event' => 'onFlush',
            ))
        ;
        $this->process($container);

        $callsDefault = $container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls();

        $this->assertEquals('addEventListener', $callsDefault[0][0]);
        $this->assertEquals(array('onFlush'), $callsDefault[0][1][0]);

        $callsSecond = $container->getDefinition('doctrine.dbal.second_connection.event_manager')->getMethodCalls();
        $this->assertEquals($callsDefault, $callsSecond);
    }

    public function testProcessEventSubscribersWithPriorities()
    {
        $container = $this->createBuilder();

        $container
            ->register('a', 'stdClass')
            ->addTag('doctrine.event_subscriber')
        ;
        $container
            ->register('b', 'stdClass')
            ->addTag('doctrine.event_subscriber', array(
                'priority' => 5,
            ))
        ;
        $container
            ->register('c', 'stdClass')
            ->addTag('doctrine.event_subscriber', array(
                'priority' => 10,
            ))
        ;
        $container
            ->register('d', 'stdClass')
            ->addTag('doctrine.event_subscriber', array(
                'priority' => 10,
            ))
        ;
        $container
            ->register('e', 'stdClass')
            ->addTag('doctrine.event_subscriber', array(
                'priority' => 10,
            ))
        ;

        $this->process($container);
        $this->assertEquals(array('c', 'd', 'e', 'b', 'a'), $this->getServiceOrder($container, 'addEventSubscriber'));
    }

    public function testProcessNoTaggedServices()
    {
        $container = $this->createBuilder(true);

        $this->process($container);

        $this->assertEquals(array(), $container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls());

        $this->assertEquals(array(), $container->getDefinition('doctrine.dbal.second_connection.event_manager')->getMethodCalls());
    }

    private function process(ContainerBuilder $container)
    {
        $pass = new RegisterEventListenersAndSubscribersPass('doctrine.connections', 'doctrine.dbal.%s_connection.event_manager', 'doctrine');
        $pass->process($container);
    }

    private function getServiceOrder(ContainerBuilder $container, $method)
    {
        $order = array();
        foreach ($container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls() as $call) {
            list($name, $arguments) = $call;
            if ($method !== $name) {
                continue;
            }

            if ('addEventListener' === $name) {
                $order[] = (string) $arguments[1];
                continue;
            }

            $order[] = (string) $arguments[0];
        }

        return $order;
    }

    private function createBuilder($multipleConnections = false)
    {
        $container = new ContainerBuilder();

        $connections = array('default' => 'doctrine.dbal.default_connection');

        $container->register('doctrine.dbal.default_connection.event_manager', 'stdClass');
        $container->register('doctrine.dbal.default_connection', 'stdClass');

        if ($multipleConnections) {
            $container->register('doctrine.dbal.second_connection.event_manager', 'stdClass');
            $container->register('doctrine.dbal.second_connection', 'stdClass');
            $connections['second'] = 'doctrine.dbal.second_connection';
        }

        $container->setParameter('doctrine.connections', $connections);

        return $container;
    }
}
PKdb�\�9qq`pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DataFixtures/ContainerAwareLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\DataFixtures;

use Symfony\Bridge\Doctrine\DataFixtures\ContainerAwareLoader;
use Symfony\Bridge\Doctrine\Tests\Fixtures\ContainerAwareFixture;

class ContainerAwareLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testShouldSetContainerOnContainerAwareFixture()
    {
        $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
        $loader    = new ContainerAwareLoader($container);
        $fixture   = new ContainerAwareFixture();

        $loader->addFixture($fixture);

        $this->assertSame($container, $fixture->container);
    }
}
PKdb�\��۵��Zpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/DoctrineOrmTypeGuesserTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form;

use Doctrine\Common\Persistence\Mapping\ClassMetadata;
use Symfony\Bridge\Doctrine\Form\DoctrineOrmTypeGuesser;
use Symfony\Component\Form\Guess\Guess;
use Symfony\Component\Form\Guess\ValueGuess;

class DoctrineOrmTypeGuesserTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider requiredProvider
     */
    public function testRequiredGuesser($classMetadata, $expected)
    {
        $this->assertEquals($expected, $this->getGuesser($classMetadata)->guessRequired('TestEntity', 'field'));
    }

    public function requiredProvider()
    {
        $return = array();

        // Simple field, not nullable
        $classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
        $classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(true));
        $classMetadata->expects($this->once())->method('isNullable')->with('field')->will($this->returnValue(false));

        $return[] = array($classMetadata, new ValueGuess(true, Guess::HIGH_CONFIDENCE));

        // Simple field, nullable
        $classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
        $classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(true));
        $classMetadata->expects($this->once())->method('isNullable')->with('field')->will($this->returnValue(true));

        $return[] = array($classMetadata, new ValueGuess(false, Guess::MEDIUM_CONFIDENCE));

        // One-to-one, nullable (by default)
        $classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
        $classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
        $classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));

        $mapping = array('joinColumns' => array(array()));
        $classMetadata->expects($this->once())->method('getAssociationMapping')->with('field')->will($this->returnValue($mapping));

        $return[] = array($classMetadata, new ValueGuess(false, Guess::HIGH_CONFIDENCE));

        // One-to-one, nullable (explicit)
        $classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
        $classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
        $classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));

        $mapping = array('joinColumns' => array(array('nullable'=>true)));
        $classMetadata->expects($this->once())->method('getAssociationMapping')->with('field')->will($this->returnValue($mapping));

        $return[] = array($classMetadata, new ValueGuess(false, Guess::HIGH_CONFIDENCE));

        // One-to-one, not nullable
        $classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
        $classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
        $classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(true));

        $mapping = array('joinColumns' => array(array('nullable'=>false)));
        $classMetadata->expects($this->once())->method('getAssociationMapping')->with('field')->will($this->returnValue($mapping));

        $return[] = array($classMetadata, new ValueGuess(true, Guess::HIGH_CONFIDENCE));

        // One-to-many, no clue
        $classMetadata = $this->getMockBuilder('Doctrine\ORM\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
        $classMetadata->expects($this->once())->method('hasField')->with('field')->will($this->returnValue(false));
        $classMetadata->expects($this->once())->method('isAssociationWithSingleJoinColumn')->with('field')->will($this->returnValue(false));

        $return[] = array($classMetadata, null);

        return $return;
    }

    private function getGuesser(ClassMetadata $classMetadata)
    {
        $em = $this->getMock('Doctrine\Common\Persistence\ObjectManager');
        $em->expects($this->once())->method('getClassMetaData')->with('TestEntity')->will($this->returnValue($classMetadata));

        $registry = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');
        $registry->expects($this->once())->method('getManagers')->will($this->returnValue(array($em)));

        return new DoctrineOrmTypeGuesser($registry);
    }

}
PKdb�\Yv�:B	B	ppear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/DataTransformer/CollectionToArrayTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\DataTransformer;

use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Form\DataTransformer\CollectionToArrayTransformer;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class CollectionToArrayTransformerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var CollectionToArrayTransformer
     */
    private $transformer;

    protected function setUp()
    {
        $this->transformer = new CollectionToArrayTransformer();
    }

    public function testTransform()
    {
        $array = array(
            2 => 'foo',
            3 => 'bar',
        );

        $this->assertSame($array, $this->transformer->transform(new ArrayCollection($array)));
    }

    /**
     * This test is needed for cases when getXxxs() in the entity returns the
     * result of $collection->toArray(), in order to prevent modifications of
     * the inner collection.
     *
     * See https://github.com/symfony/symfony/pull/9308
     */
    public function testTransformArray()
    {
        $array = array(
            2 => 'foo',
            3 => 'bar',
        );

        $this->assertSame($array, $this->transformer->transform($array));
    }

    public function testTransformNull()
    {
        $this->assertSame(array(), $this->transformer->transform(null));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testTransformExpectsArrayOrCollection()
    {
        $this->transformer->transform('Foo');
    }

    public function testReverseTransform()
    {
        $array = array(
            2 => 'foo',
            3 => 'bar',
        );

        $this->assertEquals(new ArrayCollection($array), $this->transformer->reverseTransform($array));
    }

    public function testReverseTransformEmpty()
    {
        $this->assertEquals(new ArrayCollection(), $this->transformer->reverseTransform(''));
    }

    public function testReverseTransformNull()
    {
        $this->assertEquals(new ArrayCollection(), $this->transformer->reverseTransform(null));
    }
}
PKeb�\�I�m��^pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypePerformanceTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\Type;

use Symfony\Component\Form\Tests\FormPerformanceTestCase;
use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity;
use Doctrine\ORM\Tools\SchemaTool;
use Symfony\Bridge\Doctrine\Tests\DoctrineOrmTestCase;
use Symfony\Component\Form\Extension\Core\CoreExtension;
use Symfony\Bridge\Doctrine\Form\DoctrineOrmExtension;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class EntityTypePerformanceTest extends FormPerformanceTestCase
{
    const ENTITY_CLASS = 'Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity';

    /**
     * @var \Doctrine\ORM\EntityManager
     */
    private $em;

    protected function getExtensions()
    {
        $manager = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');

        $manager->expects($this->any())
            ->method('getManager')
            ->will($this->returnValue($this->em));

        $manager->expects($this->any())
            ->method('getManagerForClass')
            ->will($this->returnValue($this->em));

        return array(
            new CoreExtension(),
            new DoctrineOrmExtension($manager)
        );
    }

    protected function setUp()
    {
        $this->em = DoctrineOrmTestCase::createTestEntityManager();

        parent::setUp();

        $schemaTool = new SchemaTool($this->em);
        $classes = array(
            $this->em->getClassMetadata(self::ENTITY_CLASS),
        );

        try {
            $schemaTool->dropSchema($classes);
        } catch (\Exception $e) {
        }

        try {
            $schemaTool->createSchema($classes);
        } catch (\Exception $e) {
        }

        $ids = range(1, 300);

        foreach ($ids as $id) {
            $name = 65 + chr($id % 57);
            $this->em->persist(new SingleIntIdEntity($id, $name));
        }

        $this->em->flush();
    }

    /**
     * This test case is realistic in collection forms where each
     * row contains the same entity field.
     *
     * @group benchmark
     */
    public function testCollapsedEntityField()
    {
        $this->setMaxRunningTime(1);

        for ($i = 0; $i < 40; ++$i) {
            $form = $this->factory->create('entity', null, array(
                'class' => self::ENTITY_CLASS,
            ));

            // force loading of the choice list
            $form->createView();
        }
    }

    /**
     * @group benchmark
     */
    public function testCollapsedEntityFieldWithChoices()
    {
        $choices = $this->em->createQuery('SELECT c FROM '.self::ENTITY_CLASS.' c')->getResult();
        $this->setMaxRunningTime(1);

        for ($i = 0; $i < 40; ++$i) {
            $form = $this->factory->create('entity', null, array(
                'class' => self::ENTITY_CLASS,
                'choices' => $choices,
            ));

            // force loading of the choice list
            $form->createView();
        }
    }

    /**
     * @group benchmark
     */
    public function testCollapsedEntityFieldWithPreferredChoices()
    {
        $choices = $this->em->createQuery('SELECT c FROM '.self::ENTITY_CLASS.' c')->getResult();
        $this->setMaxRunningTime(1);

        for ($i = 0; $i < 40; ++$i) {
            $form = $this->factory->create('entity', null, array(
                    'class' => self::ENTITY_CLASS,
                    'preferred_choices' => $choices,
                ));

            // force loading of the choice list
            $form->createView();
        }
    }
}
PKeb�\��(iiSpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\Type;

use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Test\TypeTestCase;
use Symfony\Bridge\Doctrine\Tests\Fixtures\GroupableEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleStringIdEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeStringIdEntity;
use Symfony\Bridge\Doctrine\Form\DoctrineOrmExtension;
use Doctrine\ORM\Tools\SchemaTool;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Form\Extension\Core\View\ChoiceView;

class EntityTypeTest extends TypeTestCase
{
    const ITEM_GROUP_CLASS = 'Symfony\Bridge\Doctrine\Tests\Fixtures\GroupableEntity';
    const SINGLE_IDENT_CLASS = 'Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity';
    const SINGLE_STRING_IDENT_CLASS = 'Symfony\Bridge\Doctrine\Tests\Fixtures\SingleStringIdEntity';
    const COMPOSITE_IDENT_CLASS = 'Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity';
    const COMPOSITE_STRING_IDENT_CLASS = 'Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeStringIdEntity';

    /**
     * @var \Doctrine\ORM\EntityManager
     */
    private $em;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $emRegistry;

    protected function setUp()
    {
        if (!class_exists('Symfony\Component\Form\Form')) {
            $this->markTestSkipped('The "Form" component is not available');
        }

        if (!class_exists('Doctrine\DBAL\Platforms\MySqlPlatform')) {
            $this->markTestSkipped('Doctrine DBAL is not available.');
        }

        if (!class_exists('Doctrine\Common\Version')) {
            $this->markTestSkipped('Doctrine Common is not available.');
        }

        if (!class_exists('Doctrine\ORM\EntityManager')) {
            $this->markTestSkipped('Doctrine ORM is not available.');
        }

        $this->em = DoctrineTestHelper::createTestEntityManager();
        $this->emRegistry = $this->createRegistryMock('default', $this->em);

        parent::setUp();

        $schemaTool = new SchemaTool($this->em);
        $classes = array(
            $this->em->getClassMetadata(self::ITEM_GROUP_CLASS),
            $this->em->getClassMetadata(self::SINGLE_IDENT_CLASS),
            $this->em->getClassMetadata(self::SINGLE_STRING_IDENT_CLASS),
            $this->em->getClassMetadata(self::COMPOSITE_IDENT_CLASS),
            $this->em->getClassMetadata(self::COMPOSITE_STRING_IDENT_CLASS),
        );

        try {
            $schemaTool->dropSchema($classes);
        } catch (\Exception $e) {
        }

        try {
            $schemaTool->createSchema($classes);
        } catch (\Exception $e) {
        }
    }

    protected function tearDown()
    {
        parent::tearDown();

        $this->em = null;
        $this->emRegistry = null;
    }

    protected function getExtensions()
    {
        return array_merge(parent::getExtensions(), array(
            new DoctrineOrmExtension($this->emRegistry),
        ));
    }

    protected function persist(array $entities)
    {
        foreach ($entities as $entity) {
            $this->em->persist($entity);
        }

        $this->em->flush();
        // no clear, because entities managed by the choice field must
        // be managed!
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\MissingOptionsException
     */
    public function testClassOptionIsRequired()
    {
        $this->factory->createNamed('name', 'entity');
    }

    public function testSetDataToUninitializedEntityWithNonRequired()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');

        $this->persist(array($entity1, $entity2));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'required' => false,
            'property' => 'name'
        ));

        $this->assertEquals(array(1 => new ChoiceView($entity1, '1', 'Foo'), 2 => new ChoiceView($entity2, '2', 'Bar')), $field->createView()->vars['choices']);
    }

    public function testSetDataToUninitializedEntityWithNonRequiredToString()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');

        $this->persist(array($entity1, $entity2));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'required' => false,
        ));

        $this->assertEquals(array(1 => new ChoiceView($entity1, '1', 'Foo'), 2 => new ChoiceView($entity2, '2', 'Bar')), $field->createView()->vars['choices']);
    }

    public function testSetDataToUninitializedEntityWithNonRequiredQueryBuilder()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');

        $this->persist(array($entity1, $entity2));
        $qb = $this->em->createQueryBuilder()->select('e')->from(self::SINGLE_IDENT_CLASS, 'e');

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'required' => false,
            'property' => 'name',
            'query_builder' => $qb
        ));

        $this->assertEquals(array(1 => new ChoiceView($entity1, '1', 'Foo'), 2 => new ChoiceView($entity2, '2', 'Bar')), $field->createView()->vars['choices']);
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testConfigureQueryBuilderWithNonQueryBuilderAndNonClosure()
    {
        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'query_builder' => new \stdClass(),
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testConfigureQueryBuilderWithClosureReturningNonQueryBuilder()
    {
        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'query_builder' => function () {
                return new \stdClass();
            },
        ));

        $field->submit('2');
    }

    public function testSetDataSingleNull()
    {
        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => false,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
        ));
        $field->setData(null);

        $this->assertNull($field->getData());
        $this->assertSame('', $field->getViewData());
    }

    public function testSetDataMultipleExpandedNull()
    {
        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => true,
            'expanded' => true,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
        ));
        $field->setData(null);

        $this->assertNull($field->getData());
        $this->assertSame(array(), $field->getViewData());
    }

    public function testSetDataMultipleNonExpandedNull()
    {
        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => true,
            'expanded' => false,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
        ));
        $field->setData(null);

        $this->assertNull($field->getData());
        $this->assertSame(array(), $field->getViewData());
    }

    public function testSubmitSingleExpandedNull()
    {
        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => false,
            'expanded' => true,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
        ));
        $field->submit(null);

        $this->assertNull($field->getData());
        $this->assertSame(array(), $field->getViewData());
    }

    public function testSubmitSingleNonExpandedNull()
    {
        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => false,
            'expanded' => false,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
        ));
        $field->submit(null);

        $this->assertNull($field->getData());
        $this->assertSame('', $field->getViewData());
    }

    public function testSubmitMultipleNull()
    {
        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => true,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
        ));
        $field->submit(null);

        $this->assertEquals(new ArrayCollection(), $field->getData());
        $this->assertSame(array(), $field->getViewData());
    }

    public function testSubmitSingleNonExpandedSingleIdentifier()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');

        $this->persist(array($entity1, $entity2));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => false,
            'expanded' => false,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'property' => 'name',
        ));

        $field->submit('2');

        $this->assertTrue($field->isSynchronized());
        $this->assertSame($entity2, $field->getData());
        $this->assertSame('2', $field->getViewData());
    }

    public function testSubmitSingleNonExpandedCompositeIdentifier()
    {
        $entity1 = new CompositeIntIdEntity(10, 20, 'Foo');
        $entity2 = new CompositeIntIdEntity(30, 40, 'Bar');

        $this->persist(array($entity1, $entity2));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => false,
            'expanded' => false,
            'em' => 'default',
            'class' => self::COMPOSITE_IDENT_CLASS,
            'property' => 'name',
        ));

        // the collection key is used here
        $field->submit('1');

        $this->assertTrue($field->isSynchronized());
        $this->assertSame($entity2, $field->getData());
        $this->assertSame('1', $field->getViewData());
    }

    public function testSubmitMultipleNonExpandedSingleIdentifier()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');
        $entity3 = new SingleIntIdEntity(3, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => true,
            'expanded' => false,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'property' => 'name',
        ));

        $field->submit(array('1', '3'));

        $expected = new ArrayCollection(array($entity1, $entity3));

        $this->assertTrue($field->isSynchronized());
        $this->assertEquals($expected, $field->getData());
        $this->assertSame(array('1', '3'), $field->getViewData());
    }

    public function testSubmitMultipleNonExpandedSingleIdentifierForExistingData()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');
        $entity3 = new SingleIntIdEntity(3, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => true,
            'expanded' => false,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'property' => 'name',
        ));

        $existing = new ArrayCollection(array(0 => $entity2));

        $field->setData($existing);
        $field->submit(array('1', '3'));

        // entry with index 0 ($entity2) was replaced
        $expected = new ArrayCollection(array(0 => $entity1, 1 => $entity3));

        $this->assertTrue($field->isSynchronized());
        $this->assertEquals($expected, $field->getData());
        // same object still, useful if it is a PersistentCollection
        $this->assertSame($existing, $field->getData());
        $this->assertSame(array('1', '3'), $field->getViewData());
    }

    public function testSubmitMultipleNonExpandedCompositeIdentifier()
    {
        $entity1 = new CompositeIntIdEntity(10, 20, 'Foo');
        $entity2 = new CompositeIntIdEntity(30, 40, 'Bar');
        $entity3 = new CompositeIntIdEntity(50, 60, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => true,
            'expanded' => false,
            'em' => 'default',
            'class' => self::COMPOSITE_IDENT_CLASS,
            'property' => 'name',
        ));

        // because of the composite key collection keys are used
        $field->submit(array('0', '2'));

        $expected = new ArrayCollection(array($entity1, $entity3));

        $this->assertTrue($field->isSynchronized());
        $this->assertEquals($expected, $field->getData());
        $this->assertSame(array('0', '2'), $field->getViewData());
    }

    public function testSubmitMultipleNonExpandedCompositeIdentifierExistingData()
    {
        $entity1 = new CompositeIntIdEntity(10, 20, 'Foo');
        $entity2 = new CompositeIntIdEntity(30, 40, 'Bar');
        $entity3 = new CompositeIntIdEntity(50, 60, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => true,
            'expanded' => false,
            'em' => 'default',
            'class' => self::COMPOSITE_IDENT_CLASS,
            'property' => 'name',
        ));

        $existing = new ArrayCollection(array(0 => $entity2));

        $field->setData($existing);
        $field->submit(array('0', '2'));

        // entry with index 0 ($entity2) was replaced
        $expected = new ArrayCollection(array(0 => $entity1, 1 => $entity3));

        $this->assertTrue($field->isSynchronized());
        $this->assertEquals($expected, $field->getData());
        // same object still, useful if it is a PersistentCollection
        $this->assertSame($existing, $field->getData());
        $this->assertSame(array('0', '2'), $field->getViewData());
    }

    public function testSubmitSingleExpanded()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');

        $this->persist(array($entity1, $entity2));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => false,
            'expanded' => true,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'property' => 'name',
        ));

        $field->submit('2');

        $this->assertTrue($field->isSynchronized());
        $this->assertSame($entity2, $field->getData());
        $this->assertFalse($field['1']->getData());
        $this->assertTrue($field['2']->getData());
        $this->assertNull($field['1']->getViewData());
        $this->assertSame('2', $field['2']->getViewData());
    }

    public function testSubmitMultipleExpanded()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');
        $entity3 = new SingleIntIdEntity(3, 'Bar');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => true,
            'expanded' => true,
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'property' => 'name',
        ));

        $field->submit(array('1', '3'));

        $expected = new ArrayCollection(array($entity1, $entity3));

        $this->assertTrue($field->isSynchronized());
        $this->assertEquals($expected, $field->getData());
        $this->assertTrue($field['1']->getData());
        $this->assertFalse($field['2']->getData());
        $this->assertTrue($field['3']->getData());
        $this->assertSame('1', $field['1']->getViewData());
        $this->assertNull($field['2']->getViewData());
        $this->assertSame('3', $field['3']->getViewData());
    }

    public function testOverrideChoices()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');
        $entity3 = new SingleIntIdEntity(3, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            // not all persisted entities should be displayed
            'choices' => array($entity1, $entity2),
            'property' => 'name',
        ));

        $field->submit('2');

        $this->assertEquals(array(1 => new ChoiceView($entity1, '1', 'Foo'), 2 => new ChoiceView($entity2, '2', 'Bar')), $field->createView()->vars['choices']);
        $this->assertTrue($field->isSynchronized());
        $this->assertSame($entity2, $field->getData());
        $this->assertSame('2', $field->getViewData());
    }

    public function testGroupByChoices()
    {
        $item1 = new GroupableEntity(1, 'Foo', 'Group1');
        $item2 = new GroupableEntity(2, 'Bar', 'Group1');
        $item3 = new GroupableEntity(3, 'Baz', 'Group2');
        $item4 = new GroupableEntity(4, 'Boo!', null);

        $this->persist(array($item1, $item2, $item3, $item4));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::ITEM_GROUP_CLASS,
            'choices' => array($item1, $item2, $item3, $item4),
            'property' => 'name',
            'group_by' => 'groupName',
        ));

        $field->submit('2');

        $this->assertSame('2', $field->getViewData());
        $this->assertEquals(array(
            'Group1' => array(1 => new ChoiceView($item1, '1', 'Foo'), 2 => new ChoiceView($item2, '2', 'Bar')),
            'Group2' => array(3 => new ChoiceView($item3, '3', 'Baz')),
            '4' => new ChoiceView($item4, '4', 'Boo!')
        ), $field->createView()->vars['choices']);
    }

    public function testPreferredChoices()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');
        $entity3 = new SingleIntIdEntity(3, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'preferred_choices' => array($entity3, $entity2),
            'property' => 'name',
        ));

        $this->assertEquals(array(3 => new ChoiceView($entity3, '3', 'Baz'), 2 => new ChoiceView($entity2, '2', 'Bar')), $field->createView()->vars['preferred_choices']);
        $this->assertEquals(array(1 => new ChoiceView($entity1, '1', 'Foo')), $field->createView()->vars['choices']);
    }

    public function testOverrideChoicesWithPreferredChoices()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');
        $entity3 = new SingleIntIdEntity(3, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'choices' => array($entity2, $entity3),
            'preferred_choices' => array($entity3),
            'property' => 'name',
        ));

        $this->assertEquals(array(3 => new ChoiceView($entity3, '3', 'Baz')), $field->createView()->vars['preferred_choices']);
        $this->assertEquals(array(2 => new ChoiceView($entity2, '2', 'Bar')), $field->createView()->vars['choices']);
    }

    public function testDisallowChoicesThatAreNotIncludedChoicesSingleIdentifier()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');
        $entity3 = new SingleIntIdEntity(3, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'choices' => array($entity1, $entity2),
            'property' => 'name',
        ));

        $field->submit('3');

        $this->assertFalse($field->isSynchronized());
        $this->assertNull($field->getData());
    }

    public function testDisallowChoicesThatAreNotIncludedChoicesCompositeIdentifier()
    {
        $entity1 = new CompositeIntIdEntity(10, 20, 'Foo');
        $entity2 = new CompositeIntIdEntity(30, 40, 'Bar');
        $entity3 = new CompositeIntIdEntity(50, 60, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::COMPOSITE_IDENT_CLASS,
            'choices' => array($entity1, $entity2),
            'property' => 'name',
        ));

        $field->submit('2');

        $this->assertFalse($field->isSynchronized());
        $this->assertNull($field->getData());
    }

    public function testDisallowChoicesThatAreNotIncludedQueryBuilderSingleIdentifier()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');
        $entity3 = new SingleIntIdEntity(3, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $repository = $this->em->getRepository(self::SINGLE_IDENT_CLASS);

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'query_builder' => $repository->createQueryBuilder('e')
                ->where('e.id IN (1, 2)'),
            'property' => 'name',
        ));

        $field->submit('3');

        $this->assertFalse($field->isSynchronized());
        $this->assertNull($field->getData());
    }

    public function testDisallowChoicesThatAreNotIncludedQueryBuilderAsClosureSingleIdentifier()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');
        $entity3 = new SingleIntIdEntity(3, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::SINGLE_IDENT_CLASS,
            'query_builder' => function ($repository) {
                return $repository->createQueryBuilder('e')
                        ->where('e.id IN (1, 2)');
            },
            'property' => 'name',
        ));

        $field->submit('3');

        $this->assertFalse($field->isSynchronized());
        $this->assertNull($field->getData());
    }

    public function testDisallowChoicesThatAreNotIncludedQueryBuilderAsClosureCompositeIdentifier()
    {
        $entity1 = new CompositeIntIdEntity(10, 20, 'Foo');
        $entity2 = new CompositeIntIdEntity(30, 40, 'Bar');
        $entity3 = new CompositeIntIdEntity(50, 60, 'Baz');

        $this->persist(array($entity1, $entity2, $entity3));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'em' => 'default',
            'class' => self::COMPOSITE_IDENT_CLASS,
            'query_builder' => function ($repository) {
                return $repository->createQueryBuilder('e')
                        ->where('e.id1 IN (10, 50)');
            },
            'property' => 'name',
        ));

        $field->submit('2');

        $this->assertFalse($field->isSynchronized());
        $this->assertNull($field->getData());
    }

    public function testSubmitSingleStringIdentifier()
    {
        $entity1 = new SingleStringIdEntity('foo', 'Foo');

        $this->persist(array($entity1));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => false,
            'expanded' => false,
            'em' => 'default',
            'class' => self::SINGLE_STRING_IDENT_CLASS,
            'property' => 'name',
        ));

        $field->submit('foo');

        $this->assertTrue($field->isSynchronized());
        $this->assertSame($entity1, $field->getData());
        $this->assertSame('foo', $field->getViewData());
    }

    public function testSubmitCompositeStringIdentifier()
    {
        $entity1 = new CompositeStringIdEntity('foo1', 'foo2', 'Foo');

        $this->persist(array($entity1));

        $field = $this->factory->createNamed('name', 'entity', null, array(
            'multiple' => false,
            'expanded' => false,
            'em' => 'default',
            'class' => self::COMPOSITE_STRING_IDENT_CLASS,
            'property' => 'name',
        ));

        // the collection key is used here
        $field->submit('0');

        $this->assertTrue($field->isSynchronized());
        $this->assertSame($entity1, $field->getData());
        $this->assertSame('0', $field->getViewData());
    }

    public function testGetManagerForClassIfNoEm()
    {
        $this->emRegistry->expects($this->never())
            ->method('getManager');

        $this->emRegistry->expects($this->once())
            ->method('getManagerForClass')
            ->with(self::SINGLE_IDENT_CLASS)
            ->will($this->returnValue($this->em));

        $this->factory->createNamed('name', 'entity', null, array(
            'class' => self::SINGLE_IDENT_CLASS,
            'required' => false,
            'property' => 'name'
        ));
    }

    protected function createRegistryMock($name, $em)
    {
        $registry = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');
        $registry->expects($this->any())
                 ->method('getManager')
                 ->with($this->equalTo($name))
                 ->will($this->returnValue($em));

        return $registry;
    }
}
PKeb�\��V
zzrpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class UnloadedEntityChoiceListCompositeIdTest extends AbstractEntityChoiceListCompositeIdTest
{
    public function testGetIndicesForValuesIgnoresNonExistingValues()
    {
        $this->markTestSkipped('Non-existing values are not detected for unloaded choice lists.');
    }
}
PKeb�\�0�e��ppear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleIntIdTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class LoadedEntityChoiceListSingleIntIdTest extends AbstractEntityChoiceListSingleIntIdTest
{
    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        $list = parent::createChoiceList();

        // load list
        $list->getChoices();

        return $list;
    }
}
PKfb�\�-��1
1
gpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper;
use Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList;
use Doctrine\ORM\Tools\SchemaTool;
use Symfony\Component\Form\Tests\Extension\Core\ChoiceList\AbstractChoiceListTest;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class AbstractEntityChoiceListTest extends AbstractChoiceListTest
{
    /**
     * @var \Doctrine\ORM\EntityManager
     */
    protected $em;

    protected $obj1;

    protected $obj2;

    protected $obj3;

    protected $obj4;

    protected function setUp()
    {
        if (!class_exists('Symfony\Component\Form\Form')) {
            $this->markTestSkipped('The "Form" component is not available');
        }

        if (!class_exists('Doctrine\DBAL\Platforms\MySqlPlatform')) {
            $this->markTestSkipped('Doctrine DBAL is not available.');
        }

        if (!class_exists('Doctrine\Common\Version')) {
            $this->markTestSkipped('Doctrine Common is not available.');
        }

        if (!class_exists('Doctrine\ORM\EntityManager')) {
            $this->markTestSkipped('Doctrine ORM is not available.');
        }

        $this->em = DoctrineTestHelper::createTestEntityManager();

        $schemaTool = new SchemaTool($this->em);
        $classes = array($this->em->getClassMetadata($this->getEntityClass()));

        try {
            $schemaTool->dropSchema($classes);
        } catch (\Exception $e) {
        }

        try {
            $schemaTool->createSchema($classes);
        } catch (\Exception $e) {
        }

        list($this->obj1, $this->obj2, $this->obj3, $this->obj4) = $this->createObjects();

        $this->em->persist($this->obj1);
        $this->em->persist($this->obj2);
        $this->em->persist($this->obj3);
        $this->em->persist($this->obj4);
        $this->em->flush();

        parent::setUp();
    }

    protected function tearDown()
    {
        parent::tearDown();

        $this->em = null;
    }

    abstract protected function getEntityClass();

    abstract protected function createObjects();

    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        return new EntityChoiceList($this->em, $this->getEntityClass());
    }
}
PKfb�\c�&zzrpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class UnloadedEntityChoiceListSingleIntIdTest extends AbstractEntityChoiceListSingleIntIdTest
{
    public function testGetIndicesForValuesIgnoresNonExistingValues()
    {
        $this->markTestSkipped('Non-existing values are not detected for unloaded choice lists.');
    }
}
PKfb�\_UNF��upear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleStringIdTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleStringIdEntity;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class AbstractEntityChoiceListSingleStringIdTest extends AbstractEntityChoiceListTest
{
    protected function getEntityClass()
    {
        return 'Symfony\Bridge\Doctrine\Tests\Fixtures\SingleStringIdEntity';
    }

    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createObjects()
    {
        return array(
            new SingleStringIdEntity('a', 'A'),
            new SingleStringIdEntity('b', 'B'),
            new SingleStringIdEntity('c', 'C'),
            new SingleStringIdEntity('d', 'D'),
        );
    }

    protected function getChoices()
    {
        return array(0 => $this->obj1, 1 => $this->obj2, 2 => $this->obj3, 3 => $this->obj4);
    }

    protected function getLabels()
    {
        return array(0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D');
    }

    protected function getValues()
    {
        return array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd');
    }

    protected function getIndices()
    {
        return array(0, 1, 2, 3);
    }
}
PKgb�\��`Հ�upear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class UnloadedEntityChoiceListSingleStringIdTest extends AbstractEntityChoiceListSingleStringIdTest
{
    public function testGetIndicesForValuesIgnoresNonExistingValues()
    {
        $this->markTestSkipped('Non-existing values are not detected for unloaded choice lists.');
    }
}
PKgb�\�~h����pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListCompositeIdWithQueryBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

use Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList;
use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class UnloadedEntityChoiceListCompositeIdWithQueryBuilderTest extends UnloadedEntityChoiceListCompositeIdTest
{
    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        $qb = $this->em->createQueryBuilder()->select('s')->from($this->getEntityClass(), 's');
        $loader = new ORMQueryBuilderLoader($qb);

        return new EntityChoiceList($this->em, $this->getEntityClass(), null, $loader);
    }
}
PKgb�\�n<-	-	dpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/ORMQueryBuilderLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;
use Symfony\Bridge\Doctrine\Tests\DoctrineOrmTestCase;
use Doctrine\DBAL\Connection;

class ORMQueryBuilderLoaderTest extends DoctrineOrmTestCase
{
    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testItOnlyWorksWithQueryBuilderOrClosure()
    {
        new ORMQueryBuilderLoader(new \stdClass());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testClosureRequiresTheEntityManager()
    {
        $closure = function () {};

        new ORMQueryBuilderLoader($closure);
    }

    public function testIdentifierTypeIsStringArray()
    {
        $this->checkIdentifierType('Symfony\Bridge\Doctrine\Tests\Fixtures\SingleStringIdEntity', Connection::PARAM_STR_ARRAY);
    }

    public function testIdentifierTypeIsIntegerArray()
    {
        $this->checkIdentifierType('Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity', Connection::PARAM_INT_ARRAY);
    }

    protected function checkIdentifierType($classname, $expectedType)
    {
        $em = $this->createTestEntityManager();

        $query = $this->getMockBuilder('QueryMock')
            ->setMethods(array('setParameter', 'getResult', 'getSql', '_doExecute'))
            ->getMock();

        $query->expects($this->once())
            ->method('setParameter')
            ->with('ORMQueryBuilderLoader_getEntitiesByIds_id', array(), $expectedType)
            ->will($this->returnValue($query));

        $qb = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
            ->setConstructorArgs(array($em))
            ->setMethods(array('getQuery'))
            ->getMock();

        $qb->expects($this->once())
            ->method('getQuery')
            ->will($this->returnValue($query));

        $qb->select('e')
            ->from($classname, 'e');

        $loader = new ORMQueryBuilderLoader($qb);
        $loader->getEntitiesByIds('id', array());
    }
}
PKgb�\�'j��spear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListSingleStringIdTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class LoadedEntityChoiceListSingleStringIdTest extends AbstractEntityChoiceListSingleStringIdTest
{
    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        $list = parent::createChoiceList();

        // load list
        $list->getChoices();

        return $list;
    }
}
PKhb�\b#����rpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListSingleIntIdTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class AbstractEntityChoiceListSingleIntIdTest extends AbstractEntityChoiceListTest
{
    protected function getEntityClass()
    {
        return 'Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity';
    }

    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createObjects()
    {
        return array(
            new SingleIntIdEntity(-10, 'A'),
            new SingleIntIdEntity(10, 'B'),
            new SingleIntIdEntity(20, 'C'),
            new SingleIntIdEntity(30, 'D'),
        );
    }

    protected function getChoices()
    {
        return array('_10' => $this->obj1, 10 => $this->obj2, 20 => $this->obj3, 30 => $this->obj4);
    }

    protected function getLabels()
    {
        return array('_10' => 'A', 10 => 'B', 20 => 'C', 30 => 'D');
    }

    protected function getValues()
    {
        return array('_10' => '-10', 10 => '10', 20 => '20', 30 => '30');
    }

    protected function getIndices()
    {
        return array('_10', 10, 20, 30);
    }
}
PKhb�\AGA���pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleIntIdWithQueryBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

use Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList;
use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class UnloadedEntityChoiceListSingleIntIdWithQueryBuilderTest extends UnloadedEntityChoiceListSingleIntIdTest
{
    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        $qb = $this->em->createQueryBuilder()->select('s')->from($this->getEntityClass(), 's');
        $loader = new ORMQueryBuilderLoader($qb);

        return new EntityChoiceList($this->em, $this->getEntityClass(), null, $loader);
    }
}
PKhb�\9&���pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/UnloadedEntityChoiceListSingleStringIdWithQueryBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

use Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList;
use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class UnloadedEntityChoiceListSingleStringIdWithQueryBuilderTest extends UnloadedEntityChoiceListSingleStringIdTest
{
    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        $qb = $this->em->createQueryBuilder()->select('s')->from($this->getEntityClass(), 's');
        $loader = new ORMQueryBuilderLoader($qb);

        return new EntityChoiceList($this->em, $this->getEntityClass(), null, $loader);
    }
}
PKhb�\�'�;�!�!fpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/GenericEntityChoiceListTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper;
use Symfony\Bridge\Doctrine\Tests\Fixtures\GroupableEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdNoToStringEntity;
use Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList;
use Symfony\Component\Form\Extension\Core\View\ChoiceView;
use Doctrine\ORM\Tools\SchemaTool;

class GenericEntityChoiceListTest extends \PHPUnit_Framework_TestCase
{
    const SINGLE_INT_ID_CLASS = 'Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity';

    const SINGLE_STRING_ID_CLASS = 'Symfony\Bridge\Doctrine\Tests\Fixtures\SingleStringIdEntity';

    const COMPOSITE_ID_CLASS = 'Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity';

    const GROUPABLE_CLASS = 'Symfony\Bridge\Doctrine\Tests\Fixtures\GroupableEntity';

    /**
     * @var \Doctrine\ORM\EntityManager
     */
    private $em;

    protected function setUp()
    {
        if (!class_exists('Symfony\Component\Form\Form')) {
            $this->markTestSkipped('The "Form" component is not available');
        }

        if (!class_exists('Doctrine\DBAL\Platforms\MySqlPlatform')) {
            $this->markTestSkipped('Doctrine DBAL is not available.');
        }

        if (!class_exists('Doctrine\Common\Version')) {
            $this->markTestSkipped('Doctrine Common is not available.');
        }

        if (!class_exists('Doctrine\ORM\EntityManager')) {
            $this->markTestSkipped('Doctrine ORM is not available.');
        }

        $this->em = DoctrineTestHelper::createTestEntityManager();

        $schemaTool = new SchemaTool($this->em);
        $classes = array(
            $this->em->getClassMetadata(self::SINGLE_INT_ID_CLASS),
            $this->em->getClassMetadata(self::SINGLE_STRING_ID_CLASS),
            $this->em->getClassMetadata(self::COMPOSITE_ID_CLASS),
            $this->em->getClassMetadata(self::GROUPABLE_CLASS),
        );

        try {
            $schemaTool->dropSchema($classes);
        } catch (\Exception $e) {
        }

        try {
            $schemaTool->createSchema($classes);
        } catch (\Exception $e) {
        }

        parent::setUp();
    }

    protected function tearDown()
    {
        parent::tearDown();

        $this->em = null;
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\StringCastException
     * @expectedMessage   Entity "Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity" passed to the choice field must have a "__toString()" method defined (or you can also override the "property" option).
     */
    public function testEntitiesMustHaveAToStringMethod()
    {
        $entity1 = new SingleIntIdNoToStringEntity(1, 'Foo');
        $entity2 = new SingleIntIdNoToStringEntity(2, 'Bar');

        // Persist for managed state
        $this->em->persist($entity1);
        $this->em->persist($entity2);

        $choiceList = new EntityChoiceList(
            $this->em,
            self::SINGLE_INT_ID_CLASS,
            null,
            null,
            array(
                $entity1,
                $entity2,
            )
        );

        $choiceList->getValues();
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\RuntimeException
     */
    public function testChoicesMustBeManaged()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');

        // no persist here!

        $choiceList = new EntityChoiceList(
            $this->em,
            self::SINGLE_INT_ID_CLASS,
            'name',
            null,
            array(
                $entity1,
                $entity2,
            )
        );

        // triggers loading -> exception
        $choiceList->getChoices();
    }

    public function testInitExplicitChoices()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');

        // Persist for managed state
        $this->em->persist($entity1);
        $this->em->persist($entity2);

        $choiceList = new EntityChoiceList(
            $this->em,
            self::SINGLE_INT_ID_CLASS,
            'name',
            null,
            array(
                $entity1,
                $entity2,
            )
        );

        $this->assertSame(array(1 => $entity1, 2 => $entity2), $choiceList->getChoices());
    }

    public function testInitEmptyChoices()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');

        // Persist for managed state
        $this->em->persist($entity1);
        $this->em->persist($entity2);

        $choiceList = new EntityChoiceList(
            $this->em,
            self::SINGLE_INT_ID_CLASS,
            'name',
            null,
            array()
        );

        $this->assertSame(array(), $choiceList->getChoices());
    }

    public function testInitNestedChoices()
    {
        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $entity2 = new SingleIntIdEntity(2, 'Bar');

        // Oh yeah, we're persisting with fire now!
        $this->em->persist($entity1);
        $this->em->persist($entity2);

        $choiceList = new EntityChoiceList(
            $this->em,
            self::SINGLE_INT_ID_CLASS,
            'name',
            null,
            array(
                'group1' => array($entity1),
                'group2' => array($entity2),
            ),
            array()
        );

        $this->assertSame(array(1 => $entity1, 2 => $entity2), $choiceList->getChoices());
        $this->assertEquals(array(
            'group1' => array(1 => new ChoiceView($entity1, '1', 'Foo')),
            'group2' => array(2 => new ChoiceView($entity2, '2', 'Bar'))
        ), $choiceList->getRemainingViews());
    }

    public function testGroupByPropertyPath()
    {
        $item1 = new GroupableEntity(1, 'Foo', 'Group1');
        $item2 = new GroupableEntity(2, 'Bar', 'Group1');
        $item3 = new GroupableEntity(3, 'Baz', 'Group2');
        $item4 = new GroupableEntity(4, 'Boo!', null);

        $this->em->persist($item1);
        $this->em->persist($item2);
        $this->em->persist($item3);
        $this->em->persist($item4);

        $choiceList = new EntityChoiceList(
            $this->em,
            self::GROUPABLE_CLASS,
            'name',
            null,
            array(
                $item1,
                $item2,
                $item3,
                $item4,
            ),
            array(),
            'groupName'
        );

        $this->assertEquals(array(1 => $item1, 2 => $item2, 3 => $item3, 4 => $item4), $choiceList->getChoices());
        $this->assertEquals(array(
            'Group1' => array(1 => new ChoiceView($item1, '1', 'Foo'), 2 => new ChoiceView($item2, '2', 'Bar')),
            'Group2' => array(3 => new ChoiceView($item3, '3', 'Baz')),
            4 => new ChoiceView($item4, '4', 'Boo!')
        ), $choiceList->getRemainingViews());
    }

    public function testGroupByInvalidPropertyPathReturnsFlatChoices()
    {
        $item1 = new GroupableEntity(1, 'Foo', 'Group1');
        $item2 = new GroupableEntity(2, 'Bar', 'Group1');

        $this->em->persist($item1);
        $this->em->persist($item2);

        $choiceList = new EntityChoiceList(
            $this->em,
            self::GROUPABLE_CLASS,
            'name',
            null,
            array(
                $item1,
                $item2,
            ),
            array(),
            'child.that.does.not.exist'
        );

        $this->assertEquals(array(
            1 => $item1,
            2 => $item2
        ), $choiceList->getChoices());
    }

    public function testInitShorthandEntityName()
    {
        $item1 = new SingleIntIdEntity(1, 'Foo');
        $item2 = new SingleIntIdEntity(2, 'Bar');

        $this->em->persist($item1);
        $this->em->persist($item2);

        $choiceList = new EntityChoiceList(
            $this->em,
            'SymfonyTestsDoctrine:SingleIntIdEntity'
        );

        $this->assertEquals(array(1, 2), $choiceList->getValuesForChoices(array($item1, $item2)));
        $this->assertEquals(array(1, 2), $choiceList->getIndicesForChoices(array($item1, $item2)));
    }
}
PKib�\��*��rpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/AbstractEntityChoiceListCompositeIdTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

use Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class AbstractEntityChoiceListCompositeIdTest extends AbstractEntityChoiceListTest
{
    protected function getEntityClass()
    {
        return 'Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity';
    }

    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createObjects()
    {
        return array(
            new CompositeIntIdEntity(10, 11, 'A'),
            new CompositeIntIdEntity(20, 21, 'B'),
            new CompositeIntIdEntity(30, 31, 'C'),
            new CompositeIntIdEntity(40, 41, 'D'),
        );
    }

    protected function getChoices()
    {
        return array(0 => $this->obj1, 1 => $this->obj2, 2 => $this->obj3, 3 => $this->obj4);
    }

    protected function getLabels()
    {
        return array(0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D');
    }

    protected function getValues()
    {
        return array(0 => '0', 1 => '1', 2 => '2', 3 => '3');
    }

    protected function getIndices()
    {
        return array(0, 1, 2, 3);
    }
}
PKib�\�ǜ"��ppear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/LoadedEntityChoiceListCompositeIdTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class LoadedEntityChoiceListCompositeIdTest extends AbstractEntityChoiceListCompositeIdTest
{
    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        $list = parent::createChoiceList();

        // load list
        $list->getChoices();

        return $list;
    }
}
PKjb�\6i+**Ypear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/ContainerAwareFixture.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;

class ContainerAwareFixture implements FixtureInterface, ContainerAwareInterface
{
    public $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function load(ObjectManager $manager)
    {
    }
}
PKjb�\�%b�99[pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeStringIdEntity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;

/** @Entity */
class CompositeStringIdEntity
{
    /** @Id @Column(type="string") */
    protected $id1;

    /** @Id @Column(type="string") */
    protected $id2;

    /** @Column(type="string") */
    public $name;

    public function __construct($id1, $id2, $name)
    {
        $this->id1 = $id1;
        $this->id2 = $id2;
        $this->name = $name;
    }

    public function __toString()
    {
        return $this->name;
    }
}
PKjb�\��3Spear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/GroupableEntity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;

/** @Entity */
class GroupableEntity
{
    /** @Id @Column(type="integer") */
    protected $id;

    /** @Column(type="string", nullable=true) */
    public $name;

    /** @Column(type="string", nullable=true) */
    public $groupName;

    public function __construct($id, $name, $groupName)
    {
        $this->id = $id;
        $this->name = $name;
        $this->groupName = $groupName;
    }
}
PKjb�\�+�88Xpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/CompositeIntIdEntity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;

/** @Entity */
class CompositeIntIdEntity
{
    /** @Id @Column(type="integer") */
    protected $id1;

    /** @Id @Column(type="integer") */
    protected $id2;

    /** @Column(type="string") */
    public $name;

    public function __construct($id1, $id2, $name)
    {
        $this->id1 = $id1;
        $this->id2 = $id2;
        $this->name = $name;
    }

    public function __toString()
    {
        return $this->name;
    }
}
PKkb�\�m��Tpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/DoubleNameEntity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;

/** @Entity */
class DoubleNameEntity
{
    /** @Id @Column(type="integer") */
    protected $id;

    /** @Column(type="string") */
    public $name;

    /** @Column(type="string", nullable=true) */
    public $name2;

    public function __construct($id, $name, $name2)
    {
        $this->id = $id;
        $this->name = $name;
        $this->name2 = $name2;
    }
}
PKkb�\I>�[��_pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdNoToStringEntity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;

/** @Entity */
class SingleIntIdNoToStringEntity
{
    /** @Id @Column(type="integer") */
    protected $id;

    /** @Column(type="string", nullable=true) */
    public $name;

    public function __construct($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}
PKkb�\�ͭ��Upear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/AssociationEntity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class AssociationEntity
{
    /**
     * @var int
     * @ORM\Id @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="SingleIntIdEntity")
     * @var \Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity
     */
    public $single;

    /**
     * @ORM\ManyToOne(targetEntity="CompositeIntIdEntity")
     * @ORM\JoinColumns({
     *  @ORM\JoinColumn(name="composite_id1", referencedColumnName="id1"),
     *  @ORM\JoinColumn(name="composite_id2", referencedColumnName="id2")
     * })
     * @var \Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity
     */
    public $composite;
}
PKlb�\1g��Upear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;

/** @Entity */
class SingleIntIdEntity
{
    /** @Id @Column(type="integer") */
    protected $id;

    /** @Column(type="string", nullable=true) */
    public $name;

    public function __construct($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }

    public function __toString()
    {
        return (string) $this->name;
    }
}
PKlb�\�'N|qqHpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/User.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Symfony\Component\Security\Core\User\UserInterface;

/** @Entity */
class User implements UserInterface
{
    /** @Id @Column(type="integer") */
    protected $id1;

    /** @Id @Column(type="integer") */
    protected $id2;

    /** @Column(type="string") */
    public $name;

    public function __construct($id1, $id2, $name)
    {
        $this->id1 = $id1;
        $this->id2 = $id2;
        $this->name = $name;
    }

    public function getRoles()
    {
    }

    public function getPassword()
    {
    }

    public function getSalt()
    {
    }

    public function getUsername()
    {
        return $this->name;
    }

    public function eraseCredentials()
    {
    }

    public function equals(UserInterface $user)
    {
    }
}
PKlb�\��!��Xpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleStringIdEntity.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;

/** @Entity */
class SingleStringIdEntity
{
    /** @Id @Column(type="string") */
    protected $id;

    /** @Column(type="string") */
    public $name;

    public function __construct($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }

    public function __toString()
    {
        return $this->name;
    }
}
PKmb�\�$K�BBYpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/ContainerAwareEventManagerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests;

use Symfony\Bridge\Doctrine\ContainerAwareEventManager;
use Symfony\Component\DependencyInjection\Container;

class ContainerAwareEventManagerTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        $this->container = new Container();
        $this->evm = new ContainerAwareEventManager($this->container);
    }

    public function testDispatchEvent()
    {
        $this->container->set('foobar', $listener1 = new MyListener());
        $this->evm->addEventListener('foo', 'foobar');
        $this->evm->addEventListener('foo', $listener2 = new MyListener());

        $this->evm->dispatchEvent('foo');

        $this->assertTrue($listener1->called);
        $this->assertTrue($listener2->called);
    }

    public function testRemoveEventListener()
    {
        $this->evm->addEventListener('foo', 'bar');
        $this->evm->addEventListener('foo', $listener = new MyListener());

        $listeners = array('foo' => array('_service_bar' => 'bar', spl_object_hash($listener) => $listener));
        $this->assertSame($listeners, $this->evm->getListeners());
        $this->assertSame($listeners['foo'], $this->evm->getListeners('foo'));

        $this->evm->removeEventListener('foo', $listener);
        $this->assertSame(array('_service_bar' => 'bar'), $this->evm->getListeners('foo'));

        $this->evm->removeEventListener('foo', 'bar');
        $this->assertSame(array(), $this->evm->getListeners('foo'));
    }
}

class MyListener
{
    public $called = false;

    public function foo()
    {
        $this->called = true;
    }
}
PKmb�\�;��
�
_pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Security\User;

use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper;
use Symfony\Bridge\Doctrine\Tests\Fixtures\User;
use Symfony\Bridge\Doctrine\Security\User\EntityUserProvider;
use Doctrine\ORM\Tools\SchemaTool;

class EntityUserProviderTest extends \PHPUnit_Framework_TestCase
{
    public function testRefreshUserGetsUserByPrimaryKey()
    {
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);

        $user1 = new User(1, 1, 'user1');
        $user2 = new User(1, 2, 'user2');

        $em->persist($user1);
        $em->persist($user2);
        $em->flush();

        $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User', 'name');

        // try to change the user identity
        $user1->name = 'user2';

        $this->assertSame($user1, $provider->refreshUser($user1));
    }

    public function testRefreshUserRequiresId()
    {
        $em = DoctrineTestHelper::createTestEntityManager();

        $user1 = new User(null, null, 'user1');
        $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User', 'name');

        $this->setExpectedException(
            'InvalidArgumentException',
            'You cannot refresh a user from the EntityUserProvider that does not contain an identifier. The user object has to be serialized with its own identifier mapped by Doctrine'
        );
        $provider->refreshUser($user1);
    }

    public function testRefreshInvalidUser()
    {
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);

        $user1 = new User(1, 1, 'user1');

        $em->persist($user1);
        $em->flush();

        $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User', 'name');

        $user2 = new User(1, 2, 'user2');
        $this->setExpectedException(
            'Symfony\Component\Security\Core\Exception\UsernameNotFoundException',
            'User with id {"id1":1,"id2":2} not found'
        );
        $provider->refreshUser($user2);
    }

    public function testSupportProxy()
    {
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);

        $user1 = new User(1, 1, 'user1');

        $em->persist($user1);
        $em->flush();
        $em->clear();

        $provider = new EntityUserProvider($this->getManager($em), 'Symfony\Bridge\Doctrine\Tests\Fixtures\User', 'name');

        $user2 = $em->getReference('Symfony\Bridge\Doctrine\Tests\Fixtures\User', array('id1' => 1, 'id2' => 1));
        $this->assertTrue($provider->supportsClass(get_class($user2)));
    }

    private function getManager($em, $name = null)
    {
        $manager = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');
        $manager->expects($this->once())
            ->method('getManager')
            ->with($this->equalTo($name))
            ->will($this->returnValue($em));

        return $manager;
    }

    private function createSchema($em)
    {
        $schemaTool = new SchemaTool($em);
        $schemaTool->createSchema(array(
            $em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\User'),
        ));
    }
}
PKmb�\l;���Dpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/bootstrap.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

$loader = require __DIR__.'/../vendor/autoload.php';

Doctrine\Common\Annotations\AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
PKnb�\�l��bpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/DataCollector/DoctrineDataCollectorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\DataCollector;

use Doctrine\DBAL\Platforms\MySqlPlatform;
use Symfony\Bridge\Doctrine\DataCollector\DoctrineDataCollector;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class DoctrineDataCollectorTest extends \PHPUnit_Framework_TestCase
{
    public function testCollectConnections()
    {
        $c = $this->createCollector(array());
        $c->collect(new Request(), new Response());
        $this->assertEquals(array('default' => 'doctrine.dbal.default_connection'), $c->getConnections());
    }

    public function testCollectManagers()
    {
        $c = $this->createCollector(array());
        $c->collect(new Request(), new Response());
        $this->assertEquals(array('default' => 'doctrine.orm.default_entity_manager'), $c->getManagers());
    }

    public function testCollectQueryCount()
    {
        $c = $this->createCollector(array());
        $c->collect(new Request(), new Response());
        $this->assertEquals(0, $c->getQueryCount());

        $queries = array(
            array('sql' => "SELECT * FROM table1", 'params' => array(), 'types' => array(), 'executionMS' => 0)
        );
        $c = $this->createCollector($queries);
        $c->collect(new Request(), new Response());
        $this->assertEquals(1, $c->getQueryCount());
    }

    public function testCollectTime()
    {
        $c = $this->createCollector(array());
        $c->collect(new Request(), new Response());
        $this->assertEquals(0, $c->getTime());

        $queries = array(
            array('sql' => "SELECT * FROM table1", 'params' => array(), 'types' => array(), 'executionMS' => 1)
        );
        $c = $this->createCollector($queries);
        $c->collect(new Request(), new Response());
        $this->assertEquals(1, $c->getTime());

        $queries = array(
            array('sql' => "SELECT * FROM table1", 'params' => array(), 'types' => array(), 'executionMS' => 1),
            array('sql' => "SELECT * FROM table2", 'params' => array(), 'types' => array(), 'executionMS' => 2)
        );
        $c = $this->createCollector($queries);
        $c->collect(new Request(), new Response());
        $this->assertEquals(3, $c->getTime());
    }

    /**
     * @dataProvider paramProvider
     */
    public function testCollectQueries($param, $types, $expected, $explainable)
    {
        $queries = array(
            array('sql' => "SELECT * FROM table1 WHERE field1 = ?1", 'params' => array($param), 'types' => $types, 'executionMS' => 1)
        );
        $c = $this->createCollector($queries);
        $c->collect(new Request(), new Response());

        $collected_queries = $c->getQueries();
        $this->assertEquals($expected, $collected_queries['default'][0]['params'][0]);
        $this->assertEquals($explainable, $collected_queries['default'][0]['explainable']);
    }

    /**
     * @dataProvider paramProvider
     */
    public function testSerialization($param, $types, $expected, $explainable)
    {
        $queries = array(
            array('sql' => "SELECT * FROM table1 WHERE field1 = ?1", 'params' => array($param), 'types' => $types, 'executionMS' => 1)
        );
        $c = $this->createCollector($queries);
        $c->collect(new Request(), new Response());
        $c = unserialize(serialize($c));

        $collected_queries = $c->getQueries();
        $this->assertEquals($expected, $collected_queries['default'][0]['params'][0]);
        $this->assertEquals($explainable, $collected_queries['default'][0]['explainable']);
    }

    public function paramProvider()
    {
        return array(
            array('some value', array(), 'some value', true),
            array(1, array(), 1, true),
            array(true, array(), true, true),
            array(null, array(), null, true),
            array(new \DateTime('2011-09-11'), array('date'), '2011-09-11', true),
            array(fopen(__FILE__, 'r'), array(), 'Resource(stream)', false),
            array(new \SplFileInfo(__FILE__), array(), 'Object(SplFileInfo)', false),
        );
    }

    private function createCollector($queries)
    {
        $connection = $this->getMockBuilder('Doctrine\DBAL\Connection')
            ->disableOriginalConstructor()
            ->getMock();
        $connection->expects($this->any())
            ->method('getDatabasePlatform')
            ->will($this->returnValue(new MySqlPlatform()));

        $registry = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');
        $registry
                ->expects($this->any())
                ->method('getConnectionNames')
                ->will($this->returnValue(array('default' => 'doctrine.dbal.default_connection')));
        $registry
                ->expects($this->any())
                ->method('getManagerNames')
                ->will($this->returnValue(array('default' => 'doctrine.orm.default_entity_manager')));
        $registry->expects($this->any())
            ->method('getConnection')
            ->will($this->returnValue($connection));

        $logger = $this->getMock('Doctrine\DBAL\Logging\DebugStack');
        $logger->queries = $queries;

        $collector = new DoctrineDataCollector($registry);
        $collector->addLogger('default', $logger);

        return $collector;
    }
}
PKnb�\C�II`pear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/HttpFoundation/DbalSessionHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\HttpFoundation;

use Symfony\Bridge\Doctrine\HttpFoundation\DbalSessionHandler;

/**
 * Test class for DbalSessionHandler.
 *
 * @author Drak <drak@zikula.org>
 */
class DbalSessionHandlerTest extends \PHPUnit_Framework_TestCase
{
    public function testConstruct()
    {
        $this->connection = $this->getMock('Doctrine\DBAL\Driver\Connection');
        $mock = $this->getMockBuilder('Symfony\Bridge\Doctrine\HttpFoundation\DbalSessionHandler');
        $mock->setConstructorArgs(array($this->connection));
        $this->driver = $mock->getMock();
    }
}
PKnb�\���,��epear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/ExpressionLanguage/DoctrineParserCacheTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\ExpressionLanguage;

use Symfony\Bridge\Doctrine\ExpressionLanguage\DoctrineParserCache;

class DoctrineParserCacheTest extends \PHPUnit_Framework_TestCase
{
    public function testFetch()
    {
        $doctrineCacheMock = $this->getMock('Doctrine\Common\Cache\Cache');
        $parserCache = new DoctrineParserCache($doctrineCacheMock);

        $doctrineCacheMock->expects($this->once())
            ->method('fetch')
            ->will($this->returnValue('bar'));

        $result = $parserCache->fetch('foo');

        $this->assertEquals('bar', $result);
    }

    public function testFetchUnexisting()
    {
        $doctrineCacheMock = $this->getMock('Doctrine\Common\Cache\Cache');
        $parserCache = new DoctrineParserCache($doctrineCacheMock);

        $doctrineCacheMock
            ->expects($this->once())
            ->method('fetch')
            ->will($this->returnValue(false));

        $this->assertNull($parserCache->fetch(''));
    }

    public function testSave()
    {
        $doctrineCacheMock = $this->getMock('Doctrine\Common\Cache\Cache');
        $parserCache = new DoctrineParserCache($doctrineCacheMock);

        $expression = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ParsedExpression')
            ->disableOriginalConstructor()
            ->getMock();

        $doctrineCacheMock->expects($this->once())
            ->method('save')
            ->with('foo', $expression);

        $parserCache->save('foo', $expression);
    }
}
PKnb�\}��u>u>dpear/test/DoctrineBridge/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueValidatorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Bridge\Doctrine\Tests\Validator\Constraints;

use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper;
use Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity;
use Symfony\Component\Validator\DefaultTranslator;
use Symfony\Component\Validator\Tests\Fixtures\FakeMetadataFactory;
use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\DoubleNameEntity;
use Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Validator;
use Doctrine\ORM\Tools\SchemaTool;

class UniqueValidatorTest extends \PHPUnit_Framework_TestCase
{
    protected function createRegistryMock($entityManagerName, $em)
    {
        $registry = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');
        $registry->expects($this->any())
                 ->method('getManager')
                 ->with($this->equalTo($entityManagerName))
                 ->will($this->returnValue($em));

        return $registry;
    }

    protected function createRepositoryMock()
    {
        $repository = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectRepository')
            ->setMethods(array('findByCustom', 'find', 'findAll', 'findOneBy', 'findBy', 'getClassName'))
            ->getMock()
        ;

        return $repository;
    }

    protected function createEntityManagerMock($repositoryMock)
    {
        $em = $this->getMockBuilder('Doctrine\Common\Persistence\ObjectManager')
            ->getMock()
        ;
        $em->expects($this->any())
             ->method('getRepository')
             ->will($this->returnValue($repositoryMock))
        ;

        $classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
        $classMetadata
            ->expects($this->any())
            ->method('hasField')
            ->will($this->returnValue(true))
        ;
        $refl = $this->getMockBuilder('Doctrine\Common\Reflection\StaticReflectionProperty')
            ->disableOriginalConstructor()
            ->setMethods(array('getValue'))
            ->getMock()
        ;
        $refl
            ->expects($this->any())
            ->method('getValue')
            ->will($this->returnValue(true))
        ;
        $classMetadata->reflFields = array('name' => $refl);
        $em->expects($this->any())
             ->method('getClassMetadata')
             ->will($this->returnValue($classMetadata))
        ;

        return $em;
    }

    protected function createValidatorFactory($uniqueValidator)
    {
        $validatorFactory = $this->getMock('Symfony\Component\Validator\ConstraintValidatorFactoryInterface');
        $validatorFactory->expects($this->any())
                         ->method('getInstance')
                         ->with($this->isInstanceOf('Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity'))
                         ->will($this->returnValue($uniqueValidator));

        return $validatorFactory;
    }

    public function createValidator($entityManagerName, $em, $validateClass = null, $uniqueFields = null, $errorPath = null, $repositoryMethod = 'findBy', $ignoreNull = true)
    {
        if (!$validateClass) {
            $validateClass = 'Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity';
        }
        if (!$uniqueFields) {
            $uniqueFields = array('name');
        }

        $registry = $this->createRegistryMock($entityManagerName, $em);

        $uniqueValidator = new UniqueEntityValidator($registry);

        $metadata = new ClassMetadata($validateClass);
        $constraint = new UniqueEntity(array(
            'fields' => $uniqueFields,
            'em' => $entityManagerName,
            'errorPath' => $errorPath,
            'repositoryMethod' => $repositoryMethod,
            'ignoreNull' => $ignoreNull
        ));
        $metadata->addConstraint($constraint);

        $metadataFactory = new FakeMetadataFactory();
        $metadataFactory->addMetadata($metadata);
        $validatorFactory = $this->createValidatorFactory($uniqueValidator);

        return new Validator($metadataFactory, $validatorFactory, new DefaultTranslator());
    }

    private function createSchema($em)
    {
        $schemaTool = new SchemaTool($em);
        $schemaTool->createSchema(array(
            $em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity'),
            $em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\DoubleNameEntity'),
            $em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity'),
            $em->getClassMetadata('Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity'),
        ));
    }

    /**
     * This is a functional test as there is a large integration necessary to get the validator working.
     */
    public function testValidateUniqueness()
    {
        $entityManagerName = "foo";
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);
        $validator = $this->createValidator($entityManagerName, $em);

        $entity1 = new SingleIntIdEntity(1, 'Foo');
        $violationsList = $validator->validate($entity1);
        $this->assertEquals(0, $violationsList->count(), "No violations found on entity before it is saved to the database.");

        $em->persist($entity1);
        $em->flush();

        $violationsList = $validator->validate($entity1);
        $this->assertEquals(0, $violationsList->count(), "No violations found on entity after it was saved to the database.");

        $entity2 = new SingleIntIdEntity(2, 'Foo');

        $violationsList = $validator->validate($entity2);
        $this->assertEquals(1, $violationsList->count(), "Violation found on entity with conflicting entity existing in the database.");

        $violation = $violationsList[0];
        $this->assertEquals('This value is already used.', $violation->getMessage());
        $this->assertEquals('name', $violation->getPropertyPath());
        $this->assertEquals('Foo', $violation->getInvalidValue());
    }

    public function testValidateCustomErrorPath()
    {
        $entityManagerName = "foo";
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);
        $validator = $this->createValidator($entityManagerName, $em, null, null, 'bar');

        $entity1 = new SingleIntIdEntity(1, 'Foo');

        $em->persist($entity1);
        $em->flush();

        $entity2 = new SingleIntIdEntity(2, 'Foo');

        $violationsList = $validator->validate($entity2);
        $this->assertEquals(1, $violationsList->count(), "Violation found on entity with conflicting entity existing in the database.");

        $violation = $violationsList[0];
        $this->assertEquals('This value is already used.', $violation->getMessage());
        $this->assertEquals('bar', $violation->getPropertyPath());
        $this->assertEquals('Foo', $violation->getInvalidValue());
    }

    public function testValidateUniquenessWithNull()
    {
        $entityManagerName = "foo";
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);
        $validator = $this->createValidator($entityManagerName, $em);

        $entity1 = new SingleIntIdEntity(1, null);
        $entity2 = new SingleIntIdEntity(2, null);

        $em->persist($entity1);
        $em->persist($entity2);
        $em->flush();

        $violationsList = $validator->validate($entity1);
        $this->assertEquals(0, $violationsList->count(), "No violations found on entity having a null value.");
    }

    public function testValidateUniquenessWithIgnoreNull()
    {
        $entityManagerName = "foo";
        $validateClass = 'Symfony\Bridge\Doctrine\Tests\Fixtures\DoubleNameEntity';
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);
        $validator = $this->createValidator($entityManagerName, $em, $validateClass, array('name', 'name2'), 'bar', 'findby', false);

        $entity1 = new DoubleNameEntity(1, 'Foo', null);
        $violationsList = $validator->validate($entity1);
        $this->assertEquals(0, $violationsList->count(), "No violations found on entity before it is saved to the database.");

        $em->persist($entity1);
        $em->flush();

        $violationsList = $validator->validate($entity1);
        $this->assertEquals(0, $violationsList->count(), "No violations found on entity after it was saved to the database.");

        $entity2 = new DoubleNameEntity(2, 'Foo', null);

        $violationsList = $validator->validate($entity2);
        $this->assertEquals(1, $violationsList->count(), "Violation found on entity with conflicting entity existing in the database.");

        $violation = $violationsList[0];
        $this->assertEquals('This value is already used.', $violation->getMessage());
        $this->assertEquals('bar', $violation->getPropertyPath());
        $this->assertEquals('Foo', $violation->getInvalidValue());
    }

    public function testValidateUniquenessAfterConsideringMultipleQueryResults()
    {
        $entityManagerName = "foo";
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);
        $validator = $this->createValidator($entityManagerName, $em);

        $entity1 = new SingleIntIdEntity(1, 'foo');
        $entity2 = new SingleIntIdEntity(2, 'foo');

        $em->persist($entity1);
        $em->persist($entity2);
        $em->flush();

        $violationsList = $validator->validate($entity1);
        $this->assertEquals(1, $violationsList->count(), 'Violation found on entity with conflicting entity existing in the database.');

        $violationsList = $validator->validate($entity2);
        $this->assertEquals(1, $violationsList->count(), 'Violation found on entity with conflicting entity existing in the database.');
    }

    public function testValidateUniquenessUsingCustomRepositoryMethod()
    {
        $entityManagerName = 'foo';
        $repository = $this->createRepositoryMock();
        $repository->expects($this->once())
             ->method('findByCustom')
             ->will($this->returnValue(array()))
        ;
        $em = $this->createEntityManagerMock($repository);
        $validator = $this->createValidator($entityManagerName, $em, null, array(), null, 'findByCustom');

        $entity1 = new SingleIntIdEntity(1, 'foo');

        $violationsList = $validator->validate($entity1);
        $this->assertEquals(0, $violationsList->count(), 'Violation is using custom repository method.');
    }

    public function testValidateUniquenessWithUnrewoundArray()
    {
        $entity = new SingleIntIdEntity(1, 'foo');

        $entityManagerName = 'foo';
        $repository = $this->createRepositoryMock();
        $repository->expects($this->once())
            ->method('findByCustom')
            ->will(
                $this->returnCallback(function () use ($entity) {
                    $returnValue = array(
                        $entity,
                    );
                    next($returnValue);

                    return $returnValue;
                })
            )
        ;
        $em = $this->createEntityManagerMock($repository);
        $validator = $this->createValidator($entityManagerName, $em, null, array(), null, 'findByCustom');

        $violationsList = $validator->validate($entity);
        $this->assertCount(0, $violationsList, 'Violation is using unrewound array as return value in the repository method.');
    }

    /**
     * @group GH-1635
     */
    public function testAssociatedEntity()
    {
        $entityManagerName = "foo";
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);
        $validator = $this->createValidator($entityManagerName, $em, 'Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity', array('single'));

        $entity1 = new SingleIntIdEntity(1, 'foo');
        $associated = new AssociationEntity();
        $associated->single = $entity1;

        $em->persist($entity1);
        $em->persist($associated);
        $em->flush();

        $violationsList = $validator->validate($associated);
        $this->assertEquals(0, $violationsList->count());

        $associated2 = new AssociationEntity();
        $associated2->single = $entity1;

        $em->persist($associated2);
        $em->flush();

        $violationsList = $validator->validate($associated2);
        $this->assertEquals(1, $violationsList->count());
    }

    public function testAssociatedEntityWithNull()
    {
        $entityManagerName = "foo";
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);
        $validator = $this->createValidator($entityManagerName, $em, 'Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity', array('single'), null, 'findBy', false);

        $associated = new AssociationEntity();
        $associated->single = null;

        $em->persist($associated);
        $em->flush();

        $violationsList = $validator->validate($associated);
        $this->assertEquals(0, $violationsList->count());
    }

    /**
     * @group GH-1635
     */
    public function testAssociatedCompositeEntity()
    {
        $entityManagerName = "foo";
        $em = DoctrineTestHelper::createTestEntityManager();
        $this->createSchema($em);
        $validator = $this->createValidator($entityManagerName, $em, 'Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity', array('composite'));

        $composite = new CompositeIntIdEntity(1, 1, "test");
        $associated = new AssociationEntity();
        $associated->composite = $composite;

        $em->persist($composite);
        $em->persist($associated);
        $em->flush();

        $this->setExpectedException(
            'Symfony\Component\Validator\Exception\ConstraintDefinitionException',
            'Associated entities are not allowed to have more than one identifier field'
        );
        $violationsList = $validator->validate($associated);
    }

    public function testDedicatedEntityManagerNullObject()
    {
        $uniqueFields = array('name');
        $entityManagerName = 'foo';

        $registry = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');

        $constraint = new UniqueEntity(array(
            'fields' => $uniqueFields,
            'em' => $entityManagerName,
        ));

        $uniqueValidator = new UniqueEntityValidator($registry);

        $entity = new SingleIntIdEntity(1, null);

        $this->setExpectedException(
            'Symfony\Component\Validator\Exception\ConstraintDefinitionException',
            'Object manager "foo" does not exist.'
        );

        $uniqueValidator->validate($entity, $constraint);
    }

    public function testEntityManagerNullObject()
    {
        $uniqueFields = array('name');

        $registry = $this->getMock('Doctrine\Common\Persistence\ManagerRegistry');

        $constraint = new UniqueEntity(array(
            'fields' => $uniqueFields,
        ));

        $uniqueValidator = new UniqueEntityValidator($registry);

        $entity = new SingleIntIdEntity(1, null);

        $this->setExpectedException(
            'Symfony\Component\Validator\Exception\ConstraintDefinitionException',
            'Unable to find the object manager associated with an entity of class "Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity"'
        );

        $uniqueValidator->validate($entity, $constraint);
    }
}
PKob�\�%�D99Bpear/test/Templating/Symfony/Component/Templating/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Templating Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./vendor</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PKob�\`7�SSUpear/test/Templating/Symfony/Component/Templating/Tests/Storage/StringStorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Storage;

use Symfony\Component\Templating\Storage\Storage;
use Symfony\Component\Templating\Storage\StringStorage;

class StringStorageTest extends \PHPUnit_Framework_TestCase
{
    public function testGetContent()
    {
        $storage = new StringStorage('foo');
        $this->assertInstanceOf('Symfony\Component\Templating\Storage\Storage', $storage, 'StringStorage is an instance of Storage');
        $storage = new StringStorage('foo');
        $this->assertEquals('foo', $storage->getContent(), '->getContent() returns the content of the template');
    }
}
PKob�\=D����Spear/test/Templating/Symfony/Component/Templating/Tests/Storage/FileStorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Storage;

use Symfony\Component\Templating\Storage\Storage;
use Symfony\Component\Templating\Storage\FileStorage;

class FileStorageTest extends \PHPUnit_Framework_TestCase
{
    public function testGetContent()
    {
        $storage = new FileStorage('foo');
        $this->assertInstanceOf('Symfony\Component\Templating\Storage\Storage', $storage, 'FileStorage is an instance of Storage');
        $storage = new FileStorage(__DIR__.'/../Fixtures/templates/foo.php');
        $this->assertEquals('<?php echo $foo ?>'."\n", $storage->getContent(), '->getContent() returns the content of the template');
    }
}
PKpb�\S	�٦�Opear/test/Templating/Symfony/Component/Templating/Tests/Storage/StorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Storage;

use Symfony\Component\Templating\Storage\Storage;

class StorageTest extends \PHPUnit_Framework_TestCase
{
    public function testMagicToString()
    {
        $storage = new TestStorage('foo');
        $this->assertEquals('foo', (string) $storage, '__toString() returns the template name');
    }
}

class TestStorage extends Storage
{
    public function getContent()
    {
    }
}
PKpb�\}/�66Rpear/test/Templating/Symfony/Component/Templating/Tests/TemplateNameParserTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests;

use Symfony\Component\Templating\TemplateNameParser;
use Symfony\Component\Templating\TemplateReference;

class TemplateNameParserTest extends \PHPUnit_Framework_TestCase
{
    protected $parser;

    protected function setUp()
    {
        $this->parser = new TemplateNameParser();
    }

    protected function tearDown()
    {
        $this->parser = null;
    }

    /**
     * @dataProvider getLogicalNameToTemplateProvider
     */
    public function testParse($name, $ref)
    {
        $template = $this->parser->parse($name);

        $this->assertEquals($template->getLogicalName(), $ref->getLogicalName());
        $this->assertEquals($template->getLogicalName(), $name);
    }

    public function getLogicalNameToTemplateProvider()
    {
        return array(
            array('/path/to/section/name.engine', new TemplateReference('/path/to/section/name.engine', 'engine')),
            array('name.engine', new TemplateReference('name.engine', 'engine')),
            array('name', new TemplateReference('name')),
        );
    }
}
PKpb�\�氵�Ppear/test/Templating/Symfony/Component/Templating/Tests/DelegatingEngineTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests;

use Symfony\Component\Templating\DelegatingEngine;
use Symfony\Component\Templating\StreamingEngineInterface;
use Symfony\Component\Templating\EngineInterface;

class DelegatingEngineTest extends \PHPUnit_Framework_TestCase
{
    public function testRenderDelegatesToSupportedEngine()
    {
        $firstEngine = $this->getEngineMock('template.php', false);
        $secondEngine = $this->getEngineMock('template.php', true);

        $secondEngine->expects($this->once())
            ->method('render')
            ->with('template.php', array('foo' => 'bar'))
            ->will($this->returnValue('<html />'));

        $delegatingEngine = new DelegatingEngine(array($firstEngine, $secondEngine));
        $result = $delegatingEngine->render('template.php', array('foo' => 'bar'));

        $this->assertSame('<html />', $result);
    }

    /**
     * @expectedException \RuntimeException
     * @expectedExceptionMessage No engine is able to work with the template "template.php"
     */
    public function testRenderWithNoSupportedEngine()
    {
        $firstEngine = $this->getEngineMock('template.php', false);
        $secondEngine = $this->getEngineMock('template.php', false);

        $delegatingEngine = new DelegatingEngine(array($firstEngine, $secondEngine));
        $delegatingEngine->render('template.php', array('foo' => 'bar'));
    }

    public function testStreamDelegatesToSupportedEngine()
    {
        $streamingEngine = $this->getStreamingEngineMock('template.php', true);
        $streamingEngine->expects($this->once())
            ->method('stream')
            ->with('template.php', array('foo' => 'bar'))
            ->will($this->returnValue('<html />'));

        $delegatingEngine = new DelegatingEngine(array($streamingEngine));
        $result = $delegatingEngine->stream('template.php', array('foo' => 'bar'));

        $this->assertNull($result);
    }

    /**
     * @expectedException \LogicException
     * @expectedExceptionMessage Template "template.php" cannot be streamed as the engine supporting it does not implement StreamingEngineInterface
     */
    public function testStreamRequiresStreamingEngine()
    {
        $engine = $this->getEngineMock('template.php', true);
        $engine->expects($this->never())->method('stream');

        $delegatingEngine = new DelegatingEngine(array($engine));
        $delegatingEngine->stream('template.php', array('foo' => 'bar'));
    }

    public function testExists()
    {
        $engine = $this->getEngineMock('template.php', true);
        $engine->expects($this->once())
            ->method('exists')
            ->with('template.php')
            ->will($this->returnValue(true));

        $delegatingEngine = new DelegatingEngine(array($engine));

        $this->assertTrue($delegatingEngine->exists('template.php'));
    }

    public function testSupports()
    {
        $engine = $this->getEngineMock('template.php', true);

        $delegatingEngine = new DelegatingEngine(array($engine));

        $this->assertTrue($delegatingEngine->supports('template.php'));
    }

    public function testSupportsWithNoSupportedEngine()
    {
        $engine = $this->getEngineMock('template.php', false);

        $delegatingEngine = new DelegatingEngine(array($engine));

        $this->assertFalse($delegatingEngine->supports('template.php'));
    }

    public function testGetExistingEngine()
    {
        $firstEngine = $this->getEngineMock('template.php', false);
        $secondEngine = $this->getEngineMock('template.php', true);

        $delegatingEngine = new DelegatingEngine(array($firstEngine, $secondEngine));

        $this->assertSame($secondEngine, $delegatingEngine->getEngine('template.php'));
    }

    /**
     * @expectedException \RuntimeException
     * @expectedExceptionMessage No engine is able to work with the template "template.php"
     */
    public function testGetInvalidEngine()
    {
        $firstEngine = $this->getEngineMock('template.php', false);
        $secondEngine = $this->getEngineMock('template.php', false);

        $delegatingEngine = new DelegatingEngine(array($firstEngine, $secondEngine));
        $delegatingEngine->getEngine('template.php', array('foo' => 'bar'));
    }

    private function getEngineMock($template, $supports)
    {
        $engine = $this->getMock('Symfony\Component\Templating\EngineInterface');

        $engine->expects($this->once())
            ->method('supports')
            ->with($template)
            ->will($this->returnValue($supports));

        return $engine;
    }

    private function getStreamingEngineMock($template, $supports)
    {
        $engine = $this->getMockForAbstractClass('Symfony\Component\Templating\Tests\MyStreamingEngine');

        $engine->expects($this->once())
            ->method('supports')
            ->with($template)
            ->will($this->returnValue($supports));

        return $engine;
    }
}

interface MyStreamingEngine extends StreamingEngineInterface, EngineInterface
{
}
PKqb�\��`#`#Ipear/test/Templating/Symfony/Component/Templating/Tests/PhpEngineTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests;

use Symfony\Component\Templating\PhpEngine;
use Symfony\Component\Templating\Loader\Loader;
use Symfony\Component\Templating\Storage\Storage;
use Symfony\Component\Templating\Storage\StringStorage;
use Symfony\Component\Templating\Helper\SlotsHelper;
use Symfony\Component\Templating\TemplateNameParser;
use Symfony\Component\Templating\TemplateReferenceInterface;
use Symfony\Component\Templating\TemplateReference;

class PhpEngineTest extends \PHPUnit_Framework_TestCase
{
    protected $loader;

    protected function setUp()
    {
        $this->loader = new ProjectTemplateLoader();
    }

    protected function tearDown()
    {
        $this->loader = null;
    }

    public function testConstructor()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);
        $this->assertEquals($this->loader, $engine->getLoader(), '__construct() takes a loader instance as its second first argument');
    }

    public function testOffsetGet()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);
        $engine->set($helper = new \Symfony\Component\Templating\Tests\Fixtures\SimpleHelper('bar'), 'foo');
        $this->assertEquals($helper, $engine['foo'], '->offsetGet() returns the value of a helper');

        try {
            $engine['bar'];
            $this->fail('->offsetGet() throws an InvalidArgumentException if the helper is not defined');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->offsetGet() throws an InvalidArgumentException if the helper is not defined');
            $this->assertEquals('The helper "bar" is not defined.', $e->getMessage(), '->offsetGet() throws an InvalidArgumentException if the helper is not defined');
        }
    }

    public function testGetSetHas()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);
        $foo = new \Symfony\Component\Templating\Tests\Fixtures\SimpleHelper('foo');
        $engine->set($foo);
        $this->assertEquals($foo, $engine->get('foo'), '->set() sets a helper');

        $engine[$foo] = 'bar';
        $this->assertEquals($foo, $engine->get('bar'), '->set() takes an alias as a second argument');

        $this->assertTrue(isset($engine['bar']));

        try {
            $engine->get('foobar');
            $this->fail('->get() throws an InvalidArgumentException if the helper is not defined');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->get() throws an InvalidArgumentException if the helper is not defined');
            $this->assertEquals('The helper "foobar" is not defined.', $e->getMessage(), '->get() throws an InvalidArgumentException if the helper is not defined');
        }

        $this->assertTrue(isset($engine['bar']));
        $this->assertTrue($engine->has('foo'), '->has() returns true if the helper exists');
        $this->assertFalse($engine->has('foobar'), '->has() returns false if the helper does not exist');
    }

    public function testUnsetHelper()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);
        $foo = new \Symfony\Component\Templating\Tests\Fixtures\SimpleHelper('foo');
        $engine->set($foo);

        $this->setExpectedException('\LogicException');

        unset($engine['foo']);
    }

    public function testExtendRender()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader, array(), array(new SlotsHelper()));
        try {
            $engine->render('name');
            $this->fail('->render() throws an InvalidArgumentException if the template does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->render() throws an InvalidArgumentException if the template does not exist');
            $this->assertEquals('The template "name" does not exist.', $e->getMessage(), '->render() throws an InvalidArgumentException if the template does not exist');
        }

        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader, array(new SlotsHelper()));
        $engine->set(new \Symfony\Component\Templating\Tests\Fixtures\SimpleHelper('bar'));
        $this->loader->setTemplate('foo.php', '<?php $view->extend("layout.php"); echo $view[\'foo\'].$foo ?>');
        $this->loader->setTemplate('layout.php', '-<?php echo $view[\'slots\']->get("_content") ?>-');
        $this->assertEquals('-barfoo-', $engine->render('foo.php', array('foo' => 'foo')), '->render() uses the decorator to decorate the template');

        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader, array(new SlotsHelper()));
        $engine->set(new \Symfony\Component\Templating\Tests\Fixtures\SimpleHelper('bar'));
        $this->loader->setTemplate('bar.php', 'bar');
        $this->loader->setTemplate('foo.php', '<?php $view->extend("layout.php"); echo $foo ?>');
        $this->loader->setTemplate('layout.php', '<?php echo $view->render("bar.php") ?>-<?php echo $view[\'slots\']->get("_content") ?>-');
        $this->assertEquals('bar-foo-', $engine->render('foo.php', array('foo' => 'foo', 'bar' => 'bar')), '->render() supports render() calls in templates');
    }

    public function testRenderParameter()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);
        $this->loader->setTemplate('foo.php', '<?php echo $template . $parameters ?>');
        $this->assertEquals('foobar', $engine->render('foo.php', array('template' => 'foo', 'parameters' => 'bar')), '->render() extract variables');
    }

    /**
     * @expectedException \InvalidArgumentException
     * @dataProvider forbiddenParameterNames
     */
    public function testRenderForbiddenParameter($name)
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);
        $this->loader->setTemplate('foo.php', 'bar');
        $engine->render('foo.php', array($name => 'foo'));
    }

    public function forbiddenParameterNames()
    {
        return array(
            array('this'),
            array('view'),
        );
    }

    public function testEscape()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);
        $this->assertEquals('&lt;br /&gt;', $engine->escape('<br />'), '->escape() escapes strings');
        $foo = new \stdClass();
        $this->assertEquals($foo, $engine->escape($foo), '->escape() does nothing on non strings');
    }

    public function testGetSetCharset()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);
        $this->assertEquals('UTF-8', $engine->getCharset(), '->getCharset() returns UTF-8 by default');
        $engine->setCharset('ISO-8859-1');
        $this->assertEquals('ISO-8859-1', $engine->getCharset(), '->setCharset() changes the default charset to use');
    }

    public function testGlobalVariables()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);
        $engine->addGlobal('global_variable', 'lorem ipsum');

        $this->assertEquals(array(
            'global_variable' => 'lorem ipsum',
        ), $engine->getGlobals());
    }

    public function testGlobalsGetPassedToTemplate()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);
        $engine->addGlobal('global', 'global variable');

        $this->loader->setTemplate('global.php', '<?php echo $global; ?>');

        $this->assertEquals($engine->render('global.php'), 'global variable');

        $this->assertEquals($engine->render('global.php', array('global' => 'overwritten')), 'overwritten');
    }

    public function testGetLoader()
    {
        $engine = new ProjectTemplateEngine(new TemplateNameParser(), $this->loader);

        $this->assertSame($this->loader, $engine->getLoader());
    }
}

class ProjectTemplateEngine extends PhpEngine
{
    public function getLoader()
    {
        return $this->loader;
    }
}

class ProjectTemplateLoader extends Loader
{
    public $templates = array();

    public function setTemplate($name, $content)
    {
        $template = new TemplateReference($name, 'php');
        $this->templates[$template->getLogicalName()] = $content;
    }

    public function load(TemplateReferenceInterface $template)
    {
        if (isset($this->templates[$template->getLogicalName()])) {
            return new StringStorage($this->templates[$template->getLogicalName()]);
        }

        return false;
    }

    public function isFresh(TemplateReferenceInterface $template, $time)
    {
        return false;
    }
}
PKqb�\��7���Mpear/test/Templating/Symfony/Component/Templating/Tests/Loader/LoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Loader;

use Symfony\Component\Templating\Loader\Loader;
use Symfony\Component\Templating\TemplateReferenceInterface;

class LoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testGetSetLogger()
    {
        $loader = new ProjectTemplateLoader4();
        $logger = $this->getMock('Psr\Log\LoggerInterface');
        $loader->setLogger($logger);
        $this->assertSame($logger, $loader->getLogger(), '->setLogger() sets the logger instance');
    }

    public function testGetSetDebugger()
    {
        $loader = new ProjectTemplateLoader4();
        $debugger = $this->getMock('Symfony\Component\Templating\DebuggerInterface');
        $loader->setDebugger($debugger);
        $this->assertSame($debugger, $loader->getDebugger(), '->setDebugger() sets the debugger instance');
    }
}

class ProjectTemplateLoader4 extends Loader
{
    public function load(TemplateReferenceInterface $template)
    {
    }

    public function getLogger()
    {
        return $this->logger;
    }

    public function getDebugger()
    {
        return $this->debugger;
    }

    public function isFresh(TemplateReferenceInterface $template, $time)
    {
        return false;
    }
}
PKqb�\ˡA`��Rpear/test/Templating/Symfony/Component/Templating/Tests/Loader/ChainLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Loader;

use Symfony\Component\Templating\Loader\ChainLoader;
use Symfony\Component\Templating\Loader\FilesystemLoader;
use Symfony\Component\Templating\Storage\FileStorage;
use Symfony\Component\Templating\TemplateReference;

class ChainLoaderTest extends \PHPUnit_Framework_TestCase
{
    protected $loader1;
    protected $loader2;

    protected function setUp()
    {
        $fixturesPath = realpath(__DIR__.'/../Fixtures/');
        $this->loader1 = new FilesystemLoader($fixturesPath.'/null/%name%');
        $this->loader2 = new FilesystemLoader($fixturesPath.'/templates/%name%');
    }

    public function testConstructor()
    {
        $loader = new ProjectTemplateLoader1(array($this->loader1, $this->loader2));
        $this->assertEquals(array($this->loader1, $this->loader2), $loader->getLoaders(), '__construct() takes an array of template loaders as its second argument');
    }

    public function testAddLoader()
    {
        $loader = new ProjectTemplateLoader1(array($this->loader1));
        $loader->addLoader($this->loader2);
        $this->assertEquals(array($this->loader1, $this->loader2), $loader->getLoaders(), '->addLoader() adds a template loader at the end of the loaders');
    }

    public function testLoad()
    {
        $loader = new ProjectTemplateLoader1(array($this->loader1, $this->loader2));
        $this->assertFalse($loader->load(new TemplateReference('bar', 'php')), '->load() returns false if the template is not found');
        $this->assertFalse($loader->load(new TemplateReference('foo', 'php')), '->load() returns false if the template does not exist for the given renderer');
        $this->assertInstanceOf(
            'Symfony\Component\Templating\Storage\FileStorage',
            $loader->load(new TemplateReference('foo.php', 'php')),
            '->load() returns a FileStorage if the template exists'
        );
    }
}

class ProjectTemplateLoader1 extends ChainLoader
{
    public function getLoaders()
    {
        return $this->loaders;
    }
}
PKqb�\���
�
Rpear/test/Templating/Symfony/Component/Templating/Tests/Loader/CacheLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Loader;

use Symfony\Component\Templating\Loader\Loader;
use Symfony\Component\Templating\Loader\CacheLoader;
use Symfony\Component\Templating\Storage\StringStorage;
use Symfony\Component\Templating\TemplateReferenceInterface;
use Symfony\Component\Templating\TemplateReference;

class CacheLoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $loader = new ProjectTemplateLoader($varLoader = new ProjectTemplateLoaderVar(), sys_get_temp_dir());
        $this->assertTrue($loader->getLoader() === $varLoader, '__construct() takes a template loader as its first argument');
        $this->assertEquals(sys_get_temp_dir(), $loader->getDir(), '__construct() takes a directory where to store the cache as its second argument');
    }

    public function testLoad()
    {
        $dir = sys_get_temp_dir().DIRECTORY_SEPARATOR.rand(111111, 999999);
        mkdir($dir, 0777, true);

        $loader = new ProjectTemplateLoader($varLoader = new ProjectTemplateLoaderVar(), $dir);
        $this->assertFalse($loader->load(new TemplateReference('foo', 'php')), '->load() returns false if the embed loader is not able to load the template');

        $logger = $this->getMock('Psr\Log\LoggerInterface');
        $logger->expects($this->once())->method('debug')->with('Storing template "index" in cache');
        $loader->setLogger($logger);
        $loader->load(new TemplateReference('index'));

        $logger = $this->getMock('Psr\Log\LoggerInterface');
        $logger->expects($this->once())->method('debug')->with('Fetching template "index" from cache');
        $loader->setLogger($logger);
        $loader->load(new TemplateReference('index'));
    }
}

class ProjectTemplateLoader extends CacheLoader
{
    public function getDir()
    {
        return $this->dir;
    }

    public function getLoader()
    {
        return $this->loader;
    }
}

class ProjectTemplateLoaderVar extends Loader
{
    public function getIndexTemplate()
    {
        return 'Hello World';
    }

    public function getSpecialTemplate()
    {
        return 'Hello {{ name }}';
    }

    public function load(TemplateReferenceInterface $template)
    {
        if (method_exists($this, $method = 'get'.ucfirst($template->get('name')).'Template')) {
            return new StringStorage($this->$method());
        }

        return false;
    }

    public function isFresh(TemplateReferenceInterface $template, $time)
    {
        return false;
    }
}
PKrb�\Wl�‡�Wpear/test/Templating/Symfony/Component/Templating/Tests/Loader/FilesystemLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Loader;

use Symfony\Component\Templating\Loader\FilesystemLoader;
use Symfony\Component\Templating\Storage\FileStorage;
use Symfony\Component\Templating\TemplateReference;

class FilesystemLoaderTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = realpath(__DIR__.'/../Fixtures/');
    }

    public function testConstructor()
    {
        $pathPattern = self::$fixturesPath.'/templates/%name%.%engine%';
        $path = self::$fixturesPath.'/templates';
        $loader = new ProjectTemplateLoader2($pathPattern);
        $this->assertEquals(array($pathPattern), $loader->getTemplatePathPatterns(), '__construct() takes a path as its second argument');
        $loader = new ProjectTemplateLoader2(array($pathPattern));
        $this->assertEquals(array($pathPattern), $loader->getTemplatePathPatterns(), '__construct() takes an array of paths as its second argument');
    }

    public function testIsAbsolutePath()
    {
        $this->assertTrue(ProjectTemplateLoader2::isAbsolutePath('/foo.xml'), '->isAbsolutePath() returns true if the path is an absolute path');
        $this->assertTrue(ProjectTemplateLoader2::isAbsolutePath('c:\\\\foo.xml'), '->isAbsolutePath() returns true if the path is an absolute path');
        $this->assertTrue(ProjectTemplateLoader2::isAbsolutePath('c:/foo.xml'), '->isAbsolutePath() returns true if the path is an absolute path');
        $this->assertTrue(ProjectTemplateLoader2::isAbsolutePath('\\server\\foo.xml'), '->isAbsolutePath() returns true if the path is an absolute path');
        $this->assertTrue(ProjectTemplateLoader2::isAbsolutePath('https://server/foo.xml'), '->isAbsolutePath() returns true if the path is an absolute path');
        $this->assertTrue(ProjectTemplateLoader2::isAbsolutePath('phar://server/foo.xml'), '->isAbsolutePath() returns true if the path is an absolute path');
    }

    public function testLoad()
    {
        $pathPattern = self::$fixturesPath.'/templates/%name%';
        $path = self::$fixturesPath.'/templates';
        $loader = new ProjectTemplateLoader2($pathPattern);
        $storage = $loader->load(new TemplateReference($path.'/foo.php', 'php'));
        $this->assertInstanceOf('Symfony\Component\Templating\Storage\FileStorage', $storage, '->load() returns a FileStorage if you pass an absolute path');
        $this->assertEquals($path.'/foo.php', (string) $storage, '->load() returns a FileStorage pointing to the passed absolute path');

        $this->assertFalse($loader->load(new TemplateReference('bar', 'php')), '->load() returns false if the template is not found');

        $storage = $loader->load(new TemplateReference('foo.php', 'php'));
        $this->assertInstanceOf('Symfony\Component\Templating\Storage\FileStorage', $storage, '->load() returns a FileStorage if you pass a relative template that exists');
        $this->assertEquals($path.'/foo.php', (string) $storage, '->load() returns a FileStorage pointing to the absolute path of the template');

        $logger = $this->getMock('Psr\Log\LoggerInterface');
        $logger->expects($this->exactly(2))->method('debug');

        $loader = new ProjectTemplateLoader2($pathPattern);
        $loader->setLogger($logger);
        $this->assertFalse($loader->load(new TemplateReference('foo.xml', 'php')), '->load() returns false if the template does not exist for the given engine');

        $loader = new ProjectTemplateLoader2(array(self::$fixturesPath.'/null/%name%', $pathPattern));
        $loader->setLogger($logger);
        $loader->load(new TemplateReference('foo.php', 'php'));
    }
}

class ProjectTemplateLoader2 extends FilesystemLoader
{
    public function getTemplatePathPatterns()
    {
        return $this->templatePathPatterns;
    }

    public static function isAbsolutePath($path)
    {
        return parent::isAbsolutePath($path);
    }
}
PKrb�\���xxQpear/test/Templating/Symfony/Component/Templating/Tests/Fixtures/SimpleHelper.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Fixtures;

use Symfony\Component\Templating\Helper\Helper;

class SimpleHelper extends Helper
{
    protected $value = '';

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function __toString()
    {
        return $this->value;
    }

    public function getName()
    {
        return 'foo';
    }
}
PKrb�\�`�2Rpear/test/Templating/Symfony/Component/Templating/Tests/Fixtures/templates/foo.phpnu�[���<?php echo $foo ?>
PKrb�\0�nl

Rpear/test/Templating/Symfony/Component/Templating/Tests/Helper/SlotsHelperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Helper;

use Symfony\Component\Templating\Helper\SlotsHelper;

class SlotsHelperTest extends \PHPUnit_Framework_TestCase
{
    public function testHasGetSet()
    {
        $helper = new SlotsHelper();
        $helper->set('foo', 'bar');
        $this->assertEquals('bar', $helper->get('foo'), '->set() sets a slot value');
        $this->assertEquals('bar', $helper->get('bar', 'bar'), '->get() takes a default value to return if the slot does not exist');

        $this->assertTrue($helper->has('foo'), '->has() returns true if the slot exists');
        $this->assertFalse($helper->has('bar'), '->has() returns false if the slot does not exist');
    }

    public function testOutput()
    {
        $helper = new SlotsHelper();
        $helper->set('foo', 'bar');
        ob_start();
        $ret = $helper->output('foo');
        $output = ob_get_clean();
        $this->assertEquals('bar', $output, '->output() outputs the content of a slot');
        $this->assertTrue($ret, '->output() returns true if the slot exists');

        ob_start();
        $ret = $helper->output('bar', 'bar');
        $output = ob_get_clean();
        $this->assertEquals('bar', $output, '->output() takes a default value to return if the slot does not exist');
        $this->assertTrue($ret, '->output() returns true if the slot does not exist but a default value is provided');

        ob_start();
        $ret = $helper->output('bar');
        $output = ob_get_clean();
        $this->assertEquals('', $output, '->output() outputs nothing if the slot does not exist');
        $this->assertFalse($ret, '->output() returns false if the slot does not exist');
    }

    public function testStartStop()
    {
        $helper = new SlotsHelper();
        $helper->start('bar');
        echo 'foo';
        $helper->stop();
        $this->assertEquals('foo', $helper->get('bar'), '->start() starts a slot');
        $this->assertTrue($helper->has('bar'), '->starts() starts a slot');

        $helper->start('bar');
        try {
            $helper->start('bar');
            $helper->stop();
            $this->fail('->start() throws an InvalidArgumentException if a slot with the same name is already started');
        } catch (\Exception $e) {
            $helper->stop();
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->start() throws an InvalidArgumentException if a slot with the same name is already started');
            $this->assertEquals('A slot named "bar" is already started.', $e->getMessage(), '->start() throws an InvalidArgumentException if a slot with the same name is already started');
        }

        try {
            $helper->stop();
            $this->fail('->stop() throws an LogicException if no slot is started');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\LogicException', $e, '->stop() throws an LogicException if no slot is started');
            $this->assertEquals('No slot started.', $e->getMessage(), '->stop() throws an LogicException if no slot is started');
        }
    }
}
PKsb�\�`n}�
�
Spear/test/Templating/Symfony/Component/Templating/Tests/Helper/AssetsHelperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Helper;

use Symfony\Component\Templating\Helper\AssetsHelper;

class AssetsHelperTest extends \PHPUnit_Framework_TestCase
{
    public function testGetVersion()
    {
        $helper = new AssetsHelper(null, array(), 'foo');
        $this->assertEquals('foo', $helper->getVersion(), '->getVersion() returns the version');
    }

    public function testGetUrl()
    {
        $helper = new AssetsHelper();
        $this->assertEquals('http://example.com/foo.js', $helper->getUrl('http://example.com/foo.js'), '->getUrl() does nothing if an absolute URL is given');

        $helper = new AssetsHelper();
        $this->assertEquals('/foo.js', $helper->getUrl('foo.js'), '->getUrl() appends a / on relative paths');
        $this->assertEquals('/foo.js', $helper->getUrl('/foo.js'), '->getUrl() does nothing on absolute paths');

        $helper = new AssetsHelper('/foo');
        $this->assertEquals('/foo/foo.js', $helper->getUrl('foo.js'), '->getUrl() appends the basePath on relative paths');
        $this->assertEquals('/foo.js', $helper->getUrl('/foo.js'), '->getUrl() does not append the basePath on absolute paths');

        $helper = new AssetsHelper(null, 'http://assets.example.com/');
        $this->assertEquals('http://assets.example.com/foo.js', $helper->getUrl('foo.js'), '->getUrl() prepends the base URL');
        $this->assertEquals('http://assets.example.com/foo.js', $helper->getUrl('/foo.js'), '->getUrl() prepends the base URL');

        $helper = new AssetsHelper(null, 'http://www.example.com/foo');
        $this->assertEquals('http://www.example.com/foo/foo.js', $helper->getUrl('foo.js'), '->getUrl() prepends the base URL with a path');
        $this->assertEquals('http://www.example.com/foo/foo.js', $helper->getUrl('/foo.js'), '->getUrl() prepends the base URL with a path');

        $helper = new AssetsHelper('/foo', 'http://www.example.com/');
        $this->assertEquals('http://www.example.com/foo.js', $helper->getUrl('foo.js'), '->getUrl() prepends the base URL and the base path if defined');
        $this->assertEquals('http://www.example.com/foo.js', $helper->getUrl('/foo.js'), '->getUrl() prepends the base URL but not the base path on absolute paths');

        $helper = new AssetsHelper('/bar', 'http://www.example.com/foo');
        $this->assertEquals('http://www.example.com/foo/foo.js', $helper->getUrl('foo.js'), '->getUrl() prepends the base URL and the base path if defined');
        $this->assertEquals('http://www.example.com/foo/foo.js', $helper->getUrl('/foo.js'), '->getUrl() prepends the base URL but not the base path on absolute paths');

        $helper = new AssetsHelper('/bar', 'http://www.example.com/foo', 'abcd');
        $this->assertEquals('http://www.example.com/foo/foo.js?abcd', $helper->getUrl('foo.js'), '->getUrl() appends the version if defined');

        $helper = new AssetsHelper();
        $this->assertEquals('/', $helper->getUrl(''), '->getUrl() with empty arg returns the prefix alone');
    }

    public function testGetUrlLeavesProtocolRelativePathsUntouched()
    {
        $helper = new AssetsHelper(null, 'http://foo.com');
        $this->assertEquals('//bar.com/asset', $helper->getUrl('//bar.com/asset'));
    }
}
PKsb�\�q=R

Mpear/test/Templating/Symfony/Component/Templating/Tests/Helper/HelperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Helper;

use Symfony\Component\Templating\Helper\Helper;

class HelperTest extends \PHPUnit_Framework_TestCase
{
    public function testGetSetCharset()
    {
        $helper = new ProjectTemplateHelper();
        $helper->setCharset('ISO-8859-1');
        $this->assertTrue('ISO-8859-1' === $helper->getCharset(), '->setCharset() sets the charset set related to this helper');
    }
}

class ProjectTemplateHelper extends Helper
{
    public function getName()
    {
        return 'foo';
    }
}
PKsb�\M<��Wpear/test/Templating/Symfony/Component/Templating/Tests/Helper/CoreAssetsHelperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Templating\Tests\Helper;

use Symfony\Component\Templating\Helper\CoreAssetsHelper;

class CoreAssetsHelperTest extends \PHPUnit_Framework_TestCase
{
    protected $package;

    protected function setUp()
    {
        $this->package = $this->getMock('Symfony\Component\Templating\Asset\PackageInterface');
    }

    protected function tearDown()
    {
        $this->package = null;
    }

    public function testAddGetPackage()
    {
        $helper = new CoreAssetsHelper($this->package);

        $helper->addPackage('foo', $this->package);

        $this->assertSame($this->package, $helper->getPackage('foo'));
    }

    public function testGetNonexistingPackage()
    {
        $helper = new CoreAssetsHelper($this->package);

        $this->setExpectedException('\InvalidArgumentException');

        $helper->getPackage('foo');
    }

    public function testGetHelperName()
    {
        $helper = new CoreAssetsHelper($this->package);

        $this->assertEquals('assets', $helper->getName());
    }
}
PKtb�\�g	�336pear/test/Form/Symfony/Component/Form/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Form Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PKtb�\�L?��.�.]pear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Csrf\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\Test\TypeTestCase;
use Symfony\Component\Form\Extension\Csrf\CsrfExtension;
use Symfony\Component\Security\Csrf\CsrfToken;

class FormTypeCsrfExtensionTest_ChildType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // The form needs a child in order to trigger CSRF protection by
        // default
        $builder->add('name', 'text');
    }

    public function getName()
    {
        return 'csrf_collection_test';
    }
}

class FormTypeCsrfExtensionTest extends TypeTestCase
{
    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    protected $tokenManager;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    protected $translator;

    protected function setUp()
    {
        $this->tokenManager = $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface');
        $this->translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');

        parent::setUp();
    }

    protected function tearDown()
    {
        $this->tokenManager = null;
        $this->translator = null;

        parent::tearDown();
    }

    protected function getExtensions()
    {
        return array_merge(parent::getExtensions(), array(
            new CsrfExtension($this->tokenManager, $this->translator),
        ));
    }

    public function testCsrfProtectionByDefaultIfRootAndCompound()
    {
        $view = $this->factory
            ->create('form', null, array(
                'csrf_field_name' => 'csrf',
                'compound' => true,
            ))
            ->createView();

        $this->assertTrue(isset($view['csrf']));
    }

    public function testNoCsrfProtectionByDefaultIfCompoundButNotRoot()
    {
        $view = $this->factory
            ->createNamedBuilder('root', 'form')
            ->add($this->factory
                ->createNamedBuilder('form', 'form', null, array(
                    'csrf_field_name' => 'csrf',
                    'compound' => true,
                ))
            )
            ->getForm()
            ->get('form')
            ->createView();

        $this->assertFalse(isset($view['csrf']));
    }

    public function testNoCsrfProtectionByDefaultIfRootButNotCompound()
    {
        $view = $this->factory
            ->create('form', null, array(
                'csrf_field_name' => 'csrf',
                'compound' => false,
            ))
            ->createView();

        $this->assertFalse(isset($view['csrf']));
    }

    public function testCsrfProtectionCanBeDisabled()
    {
        $view = $this->factory
            ->create('form', null, array(
                'csrf_field_name' => 'csrf',
                'csrf_protection' => false,
                'compound' => true,
            ))
            ->createView();

        $this->assertFalse(isset($view['csrf']));
    }

    public function testGenerateCsrfToken()
    {
        $this->tokenManager->expects($this->once())
            ->method('getToken')
            ->with('TOKEN_ID')
            ->will($this->returnValue(new CsrfToken('TOKEN_ID', 'token')));

        $view = $this->factory
            ->create('form', null, array(
                'csrf_field_name' => 'csrf',
                'csrf_token_manager' => $this->tokenManager,
                'csrf_token_id' => 'TOKEN_ID',
                'compound' => true,
            ))
            ->createView();

        $this->assertEquals('token', $view['csrf']->vars['value']);
    }

    public function testGenerateCsrfTokenUsesFormNameAsIntentionByDefault()
    {
        $this->tokenManager->expects($this->once())
            ->method('getToken')
            ->with('FORM_NAME')
            ->will($this->returnValue('token'));

        $view = $this->factory
            ->createNamed('FORM_NAME', 'form', null, array(
                'csrf_field_name' => 'csrf',
                'csrf_token_manager' => $this->tokenManager,
                'compound' => true,
            ))
            ->createView();

        $this->assertEquals('token', $view['csrf']->vars['value']);
    }

    public function testGenerateCsrfTokenUsesTypeClassAsIntentionIfEmptyFormName()
    {
        $this->tokenManager->expects($this->once())
            ->method('getToken')
            ->with('Symfony\Component\Form\Extension\Core\Type\FormType')
            ->will($this->returnValue('token'));

        $view = $this->factory
            ->createNamed('', 'form', null, array(
                'csrf_field_name' => 'csrf',
                'csrf_token_manager' => $this->tokenManager,
                'compound' => true,
            ))
            ->createView();

        $this->assertEquals('token', $view['csrf']->vars['value']);
    }

    public function provideBoolean()
    {
        return array(
            array(true),
            array(false),
        );
    }

    /**
     * @dataProvider provideBoolean
     */
    public function testValidateTokenOnSubmitIfRootAndCompound($valid)
    {
        $this->tokenManager->expects($this->once())
            ->method('isTokenValid')
            ->with(new CsrfToken('TOKEN_ID', 'token'))
            ->will($this->returnValue($valid));

        $form = $this->factory
            ->createBuilder('form', null, array(
                'csrf_field_name' => 'csrf',
                'csrf_token_manager' => $this->tokenManager,
                'csrf_token_id' => 'TOKEN_ID',
                'compound' => true,
            ))
            ->add('child', 'text')
            ->getForm();

        $form->submit(array(
            'child' => 'foobar',
            'csrf' => 'token',
        ));

        // Remove token from data
        $this->assertSame(array('child' => 'foobar'), $form->getData());

        // Validate accordingly
        $this->assertSame($valid, $form->isValid());
    }

    /**
     * @dataProvider provideBoolean
     */
    public function testValidateTokenOnSubmitIfRootAndCompoundUsesFormNameAsIntentionByDefault($valid)
    {
        $this->tokenManager->expects($this->once())
            ->method('isTokenValid')
            ->with(new CsrfToken('FORM_NAME', 'token'))
            ->will($this->returnValue($valid));

        $form = $this->factory
            ->createNamedBuilder('FORM_NAME', 'form', null, array(
                'csrf_field_name' => 'csrf',
                'csrf_token_manager' => $this->tokenManager,
                'compound' => true,
            ))
            ->add('child', 'text')
            ->getForm();

        $form->submit(array(
            'child' => 'foobar',
            'csrf' => 'token',
        ));

        // Remove token from data
        $this->assertSame(array('child' => 'foobar'), $form->getData());

        // Validate accordingly
        $this->assertSame($valid, $form->isValid());
    }

    /**
     * @dataProvider provideBoolean
     */
    public function testValidateTokenOnSubmitIfRootAndCompoundUsesTypeClassAsIntentionIfEmptyFormName($valid)
    {
        $this->tokenManager->expects($this->once())
            ->method('isTokenValid')
            ->with(new CsrfToken('Symfony\Component\Form\Extension\Core\Type\FormType', 'token'))
            ->will($this->returnValue($valid));

        $form = $this->factory
            ->createNamedBuilder('', 'form', null, array(
                'csrf_field_name' => 'csrf',
                'csrf_token_manager' => $this->tokenManager,
                'compound' => true,
            ))
            ->add('child', 'text')
            ->getForm();

        $form->submit(array(
            'child' => 'foobar',
            'csrf' => 'token',
        ));

        // Remove token from data
        $this->assertSame(array('child' => 'foobar'), $form->getData());

        // Validate accordingly
        $this->assertSame($valid, $form->isValid());
    }

    public function testFailIfRootAndCompoundAndTokenMissing()
    {
        $this->tokenManager->expects($this->never())
            ->method('isTokenValid');

        $form = $this->factory
            ->createBuilder('form', null, array(
                'csrf_field_name' => 'csrf',
                'csrf_token_manager' => $this->tokenManager,
                'csrf_token_id' => 'TOKEN_ID',
                'compound' => true,
            ))
            ->add('child', 'text')
            ->getForm();

        $form->submit(array(
            'child' => 'foobar',
            // token is missing
        ));

        // Remove token from data
        $this->assertSame(array('child' => 'foobar'), $form->getData());

        // Validate accordingly
        $this->assertFalse($form->isValid());
    }

    public function testDontValidateTokenIfCompoundButNoRoot()
    {
        $this->tokenManager->expects($this->never())
            ->method('isTokenValid');

        $form = $this->factory
            ->createNamedBuilder('root', 'form')
            ->add($this->factory
                ->createNamedBuilder('form', 'form', null, array(
                    'csrf_field_name' => 'csrf',
                    'csrf_token_manager' => $this->tokenManager,
                    'csrf_token_id' => 'TOKEN_ID',
                    'compound' => true,
                ))
            )
            ->getForm()
            ->get('form');

        $form->submit(array(
            'child' => 'foobar',
            'csrf' => 'token',
        ));
    }

    public function testDontValidateTokenIfRootButNotCompound()
    {
        $this->tokenManager->expects($this->never())
            ->method('isTokenValid');

        $form = $this->factory
            ->create('form', null, array(
                'csrf_field_name' => 'csrf',
                'csrf_token_manager' => $this->tokenManager,
                'csrf_token_id' => 'TOKEN_ID',
                'compound' => false,
            ));

        $form->submit(array(
            'csrf' => 'token',
        ));
    }

    public function testNoCsrfProtectionOnPrototype()
    {
        $prototypeView = $this->factory
            ->create('collection', null, array(
                'type' => new FormTypeCsrfExtensionTest_ChildType(),
                'options' => array(
                    'csrf_field_name' => 'csrf',
                ),
                'prototype' => true,
                'allow_add' => true,
            ))
            ->createView()
            ->vars['prototype'];

        $this->assertFalse(isset($prototypeView['csrf']));
        $this->assertCount(1, $prototypeView);
    }

    public function testsTranslateCustomErrorMessage()
    {
        $this->tokenManager->expects($this->once())
            ->method('isTokenValid')
            ->with(new CsrfToken('TOKEN_ID', 'token'))
            ->will($this->returnValue(false));

        $this->translator->expects($this->once())
             ->method('trans')
             ->with('Foobar')
             ->will($this->returnValue('[trans]Foobar[/trans]'));

        $form = $this->factory
            ->createBuilder('form', null, array(
                'csrf_field_name' => 'csrf',
                'csrf_token_manager' => $this->tokenManager,
                'csrf_message' => 'Foobar',
                'csrf_token_id' => 'TOKEN_ID',
                'compound' => true,
            ))
            ->getForm();

        $form->submit(array(
            'csrf' => 'token',
        ));

        $errors = $form->getErrors();

        $this->assertGreaterThan(0, count($errors));
        $this->assertEquals(new FormError('[trans]Foobar[/trans]'), $errors[0]);
    }
}
PKtb�\�A��gpear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/EventListener/CsrfValidationListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Csrf\EventListener;

use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Csrf\EventListener\CsrfValidationListener;

class CsrfValidationListenerTest extends \PHPUnit_Framework_TestCase
{
    protected $dispatcher;
    protected $factory;
    protected $tokenManager;
    protected $form;

    protected function setUp()
    {
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
        $this->tokenManager = $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface');
        $this->form = $this->getBuilder('post')
            ->setDataMapper($this->getDataMapper())
            ->getForm();
    }

    protected function tearDown()
    {
        $this->dispatcher = null;
        $this->factory = null;
        $this->tokenManager = null;
        $this->form = null;
    }

    protected function getBuilder($name = 'name')
    {
        return new FormBuilder($name, null, $this->dispatcher, $this->factory, array('compound' => true));
    }

    protected function getForm($name = 'name')
    {
        return $this->getBuilder($name)->getForm();
    }

    protected function getDataMapper()
    {
        return $this->getMock('Symfony\Component\Form\DataMapperInterface');
    }

    protected function getMockForm()
    {
        return $this->getMock('Symfony\Component\Form\Test\FormInterface');
    }

    // https://github.com/symfony/symfony/pull/5838
    public function testStringFormData()
    {
        $data = "XP4HUzmHPi";
        $event = new FormEvent($this->form, $data);

        $validation = new CsrfValidationListener('csrf', $this->tokenManager, 'unknown', 'Invalid.');
        $validation->preSubmit($event);

        // Validate accordingly
        $this->assertSame($data, $event->getData());
    }
}
PKtb�\_Nn���cpear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/DefaultCsrfProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Csrf\CsrfProvider;

use Symfony\Component\Form\Extension\Csrf\CsrfProvider\DefaultCsrfProvider;

/**
 * @runTestsInSeparateProcesses
 */
class DefaultCsrfProviderTest extends \PHPUnit_Framework_TestCase
{
    protected $provider;

    public static function setUpBeforeClass()
    {
        ini_set('session.save_handler', 'files');
        ini_set('session.save_path', sys_get_temp_dir());
    }

    protected function setUp()
    {
        $this->provider = new DefaultCsrfProvider('SECRET');
    }

    protected function tearDown()
    {
        $this->provider = null;
    }

    public function testGenerateCsrfToken()
    {
        session_start();

        $token = $this->provider->generateCsrfToken('foo');

        $this->assertEquals(sha1('SECRET'.'foo'.session_id()), $token);
    }

    public function testGenerateCsrfTokenOnUnstartedSession()
    {
        session_id('touti');

        if (!version_compare(PHP_VERSION, '5.4', '>=')) {
            $this->markTestSkipped('This test requires PHP >= 5.4');
        }

        $this->assertSame(PHP_SESSION_NONE, session_status());

        $token = $this->provider->generateCsrfToken('foo');

        $this->assertEquals(sha1('SECRET'.'foo'.session_id()), $token);
        $this->assertSame(PHP_SESSION_ACTIVE, session_status());
    }

    public function testIsCsrfTokenValidSucceeds()
    {
        session_start();

        $token = sha1('SECRET'.'foo'.session_id());

        $this->assertTrue($this->provider->isCsrfTokenValid('foo', $token));
    }

    public function testIsCsrfTokenValidFails()
    {
        session_start();

        $token = sha1('SECRET'.'bar'.session_id());

        $this->assertFalse($this->provider->isCsrfTokenValid('foo', $token));
    }
}
PKub�\%u����cpear/test/Form/Symfony/Component/Form/Tests/Extension/Csrf/CsrfProvider/SessionCsrfProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Csrf\CsrfProvider;

use Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider;

class SessionCsrfProviderTest extends \PHPUnit_Framework_TestCase
{
    protected $provider;
    protected $session;

    protected function setUp()
    {
        $this->session = $this->getMock(
            'Symfony\Component\HttpFoundation\Session\Session',
            array(),
            array(),
            '',
            false // don't call constructor
        );
        $this->provider = new SessionCsrfProvider($this->session, 'SECRET');
    }

    protected function tearDown()
    {
        $this->provider = null;
        $this->session = null;
    }

    public function testGenerateCsrfToken()
    {
        $this->session->expects($this->once())
                ->method('getId')
                ->will($this->returnValue('ABCDEF'));

        $token = $this->provider->generateCsrfToken('foo');

        $this->assertEquals(sha1('SECRET'.'foo'.'ABCDEF'), $token);
    }

    public function testIsCsrfTokenValidSucceeds()
    {
        $this->session->expects($this->once())
                ->method('getId')
                ->will($this->returnValue('ABCDEF'));

        $token = sha1('SECRET'.'foo'.'ABCDEF');

        $this->assertTrue($this->provider->isCsrfTokenValid('foo', $token));
    }

    public function testIsCsrfTokenValidFails()
    {
        $this->session->expects($this->once())
                ->method('getId')
                ->will($this->returnValue('ABCDEF'));

        $token = sha1('SECRET'.'bar'.'ABCDEF');

        $this->assertFalse($this->provider->isCsrfTokenValid('foo', $token));
    }
}
PKub�\���4��kpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoiceToValueTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\ChoiceList\SimpleChoiceList;
use Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToValueTransformer;

class ChoiceToValueTransformerTest extends \PHPUnit_Framework_TestCase
{
    protected $transformer;

    protected function setUp()
    {
        $list = new SimpleChoiceList(array('' => 'A', 0 => 'B', 1 => 'C'));
        $this->transformer = new ChoiceToValueTransformer($list);
    }

    protected function tearDown()
    {
        $this->transformer = null;
    }

    public function transformProvider()
    {
        return array(
            // more extensive test set can be found in FormUtilTest
            array(0, '0'),
            array(false, '0'),
            array('', ''),
        );
    }

    /**
     * @dataProvider transformProvider
     */
    public function testTransform($in, $out)
    {
        $this->assertSame($out, $this->transformer->transform($in));
    }

    public function reverseTransformProvider()
    {
        return array(
            // values are expected to be valid choice keys already and stay
            // the same
            array('0', 0),
            array('', null),
            array(null, null),
        );
    }

    /**
     * @dataProvider reverseTransformProvider
     */
    public function testReverseTransform($in, $out)
    {
        $this->assertSame($out, $this->transformer->reverseTransform($in));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformExpectsScalar()
    {
        $this->transformer->reverseTransform(array());
    }
}
PKub�\�Ub,,_pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

abstract class DateTimeTestCase extends \PHPUnit_Framework_TestCase
{
    public static function assertDateTimeEquals(\DateTime $expected, \DateTime $actual)
    {
        self::assertEquals($expected->format('c'), $actual->format('c'));
    }
}
PKub�\��`nonoupear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\NumberToLocalizedStringTransformer;
use Symfony\Component\Intl\Util\IntlTestHelper;

class NumberToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        parent::setUp();

        // Since we test against "de_AT", we need the full implementation
        IntlTestHelper::requireFullIntl($this);

        \Locale::setDefault('de_AT');
    }

    public function provideTransformations()
    {
        return array(
            array(null, '', 'de_AT'),
            array(1, '1', 'de_AT'),
            array(1.5, '1,5', 'de_AT'),
            array(1234.5, '1234,5', 'de_AT'),
            array(12345.912, '12345,912', 'de_AT'),
            array(1234.5, '1234,5', 'ru'),
            array(1234.5, '1234,5', 'fi'),
        );
    }

    /**
     * @dataProvider provideTransformations
     */
    public function testTransform($from, $to, $locale)
    {
        \Locale::setDefault($locale);

        $transformer = new NumberToLocalizedStringTransformer();

        $this->assertSame($to, $transformer->transform($from));
    }

    public function provideTransformationsWithGrouping()
    {
        return array(
            array(1234.5, '1.234,5', 'de_AT'),
            array(12345.912, '12.345,912', 'de_AT'),
            array(1234.5, '1 234,5', 'fr'),
            array(1234.5, '1 234,5', 'ru'),
            array(1234.5, '1 234,5', 'fi'),
        );
    }

    /**
     * @dataProvider provideTransformationsWithGrouping
     */
    public function testTransformWithGrouping($from, $to, $locale)
    {
        \Locale::setDefault($locale);

        $transformer = new NumberToLocalizedStringTransformer(null, true);

        $this->assertSame($to, $transformer->transform($from));
    }

    public function testTransformWithPrecision()
    {
        $transformer = new NumberToLocalizedStringTransformer(2);

        $this->assertEquals('1234,50', $transformer->transform(1234.5));
        $this->assertEquals('678,92', $transformer->transform(678.916));
    }

    public function transformWithRoundingProvider()
    {
        return array(
            // towards positive infinity (1.6 -> 2, -1.6 -> -1)
            array(0, 1234.5, '1235', NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(0, 1234.4, '1235', NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(0, -1234.5, '-1234', NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(0, -1234.4, '-1234', NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(1, 123.45, '123,5', NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(1, 123.44, '123,5', NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(1, -123.45, '-123,4', NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(1, -123.44, '-123,4', NumberToLocalizedStringTransformer::ROUND_CEILING),
            // towards negative infinity (1.6 -> 1, -1.6 -> -2)
            array(0, 1234.5, '1234', NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(0, 1234.4, '1234', NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(0, -1234.5, '-1235', NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(0, -1234.4, '-1235', NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(1, 123.45, '123,4', NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(1, 123.44, '123,4', NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(1, -123.45, '-123,5', NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(1, -123.44, '-123,5', NumberToLocalizedStringTransformer::ROUND_FLOOR),
            // away from zero (1.6 -> 2, -1.6 -> 2)
            array(0, 1234.5, '1235', NumberToLocalizedStringTransformer::ROUND_UP),
            array(0, 1234.4, '1235', NumberToLocalizedStringTransformer::ROUND_UP),
            array(0, -1234.5, '-1235', NumberToLocalizedStringTransformer::ROUND_UP),
            array(0, -1234.4, '-1235', NumberToLocalizedStringTransformer::ROUND_UP),
            array(1, 123.45, '123,5', NumberToLocalizedStringTransformer::ROUND_UP),
            array(1, 123.44, '123,5', NumberToLocalizedStringTransformer::ROUND_UP),
            array(1, -123.45, '-123,5', NumberToLocalizedStringTransformer::ROUND_UP),
            array(1, -123.44, '-123,5', NumberToLocalizedStringTransformer::ROUND_UP),
            // towards zero (1.6 -> 1, -1.6 -> -1)
            array(0, 1234.5, '1234', NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(0, 1234.4, '1234', NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(0, -1234.5, '-1234', NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(0, -1234.4, '-1234', NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(1, 123.45, '123,4', NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(1, 123.44, '123,4', NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(1, -123.45, '-123,4', NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(1, -123.44, '-123,4', NumberToLocalizedStringTransformer::ROUND_DOWN),
            // round halves (.5) to the next even number
            array(0, 1234.6, '1235', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, 1234.5, '1234', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, 1234.4, '1234', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, 1233.5, '1234', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, 1232.5, '1232', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, -1234.6, '-1235', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, -1234.5, '-1234', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, -1234.4, '-1234', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, -1233.5, '-1234', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, -1232.5, '-1232', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, 123.46, '123,5', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, 123.45, '123,4', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, 123.44, '123,4', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, 123.35, '123,4', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, 123.25, '123,2', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, -123.46, '-123,5', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, -123.45, '-123,4', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, -123.44, '-123,4', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, -123.35, '-123,4', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, -123.25, '-123,2', NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            // round halves (.5) away from zero
            array(0, 1234.6, '1235', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(0, 1234.5, '1235', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(0, 1234.4, '1234', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(0, -1234.6, '-1235', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(0, -1234.5, '-1235', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(0, -1234.4, '-1234', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, 123.46, '123,5', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, 123.45, '123,5', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, 123.44, '123,4', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, -123.46, '-123,5', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, -123.45, '-123,5', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, -123.44, '-123,4', NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            // round halves (.5) towards zero
            array(0, 1234.6, '1235', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(0, 1234.5, '1234', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(0, 1234.4, '1234', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(0, -1234.6, '-1235', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(0, -1234.5, '-1234', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(0, -1234.4, '-1234', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, 123.46, '123,5', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, 123.45, '123,4', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, 123.44, '123,4', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, -123.46, '-123,5', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, -123.45, '-123,4', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, -123.44, '-123,4', NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
        );
    }

    /**
     * @dataProvider transformWithRoundingProvider
     */
    public function testTransformWithRounding($precision, $input, $output, $roundingMode)
    {
        $transformer = new NumberToLocalizedStringTransformer($precision, null, $roundingMode);

        $this->assertEquals($output, $transformer->transform($input));
    }

    public function testTransformDoesNotRoundIfNoPrecision()
    {
        $transformer = new NumberToLocalizedStringTransformer(null, null, NumberToLocalizedStringTransformer::ROUND_DOWN);

        $this->assertEquals('1234,547', $transformer->transform(1234.547));
    }

    /**
     * @dataProvider provideTransformations
     */
    public function testReverseTransform($to, $from, $locale)
    {
        \Locale::setDefault($locale);

        $transformer = new NumberToLocalizedStringTransformer();

        $this->assertEquals($to, $transformer->reverseTransform($from));
    }

    /**
     * @dataProvider provideTransformationsWithGrouping
     */
    public function testReverseTransformWithGrouping($to, $from, $locale)
    {
        \Locale::setDefault($locale);

        $transformer = new NumberToLocalizedStringTransformer(null, true);

        $this->assertEquals($to, $transformer->reverseTransform($from));
    }

    // https://github.com/symfony/symfony/issues/7609
    public function testReverseTransformWithGroupingAndFixedSpaces()
    {
        if (!extension_loaded('mbstring')) {
            $this->markTestSkipped('The "mbstring" extension is required for this test.');
        }

        \Locale::setDefault('ru');

        $transformer = new NumberToLocalizedStringTransformer(null, true);

        $this->assertEquals(1234.5, $transformer->reverseTransform("1\xc2\xa0234,5"));
    }

    public function testReverseTransformWithGroupingButWithoutGroupSeparator()
    {
        $transformer = new NumberToLocalizedStringTransformer(null, true);

        // omit group separator
        $this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
        $this->assertEquals(12345.912, $transformer->reverseTransform('12345,912'));
    }

    public function reverseTransformWithRoundingProvider()
    {
        return array(
            // towards positive infinity (1.6 -> 2, -1.6 -> -1)
            array(0, '1234,5', 1235, NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(0, '1234,4', 1235, NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(0, '-1234,5', -1234, NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(0, '-1234,4', -1234, NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(1, '123,45', 123.5, NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(1, '123,44', 123.5, NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(1, '-123,45', -123.4, NumberToLocalizedStringTransformer::ROUND_CEILING),
            array(1, '-123,44', -123.4, NumberToLocalizedStringTransformer::ROUND_CEILING),
            // towards negative infinity (1.6 -> 1, -1.6 -> -2)
            array(0, '1234,5', 1234, NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(0, '1234,4', 1234, NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(0, '-1234,5', -1235, NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(0, '-1234,4', -1235, NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(1, '123,45', 123.4, NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(1, '123,44', 123.4, NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(1, '-123,45', -123.5, NumberToLocalizedStringTransformer::ROUND_FLOOR),
            array(1, '-123,44', -123.5, NumberToLocalizedStringTransformer::ROUND_FLOOR),
            // away from zero (1.6 -> 2, -1.6 -> 2)
            array(0, '1234,5', 1235, NumberToLocalizedStringTransformer::ROUND_UP),
            array(0, '1234,4', 1235, NumberToLocalizedStringTransformer::ROUND_UP),
            array(0, '-1234,5', -1235, NumberToLocalizedStringTransformer::ROUND_UP),
            array(0, '-1234,4', -1235, NumberToLocalizedStringTransformer::ROUND_UP),
            array(1, '123,45', 123.5, NumberToLocalizedStringTransformer::ROUND_UP),
            array(1, '123,44', 123.5, NumberToLocalizedStringTransformer::ROUND_UP),
            array(1, '-123,45', -123.5, NumberToLocalizedStringTransformer::ROUND_UP),
            array(1, '-123,44', -123.5, NumberToLocalizedStringTransformer::ROUND_UP),
            // towards zero (1.6 -> 1, -1.6 -> -1)
            array(0, '1234,5', 1234, NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(0, '1234,4', 1234, NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(0, '-1234,5', -1234, NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(0, '-1234,4', -1234, NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(1, '123,45', 123.4, NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(1, '123,44', 123.4, NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(1, '-123,45', -123.4, NumberToLocalizedStringTransformer::ROUND_DOWN),
            array(1, '-123,44', -123.4, NumberToLocalizedStringTransformer::ROUND_DOWN),
            // round halves (.5) to the next even number
            array(0, '1234,6', 1235, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, '1234,5', 1234, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, '1234,4', 1234, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, '1233,5', 1234, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, '1232,5', 1232, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, '-1234,6', -1235, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, '-1234,5', -1234, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, '-1234,4', -1234, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, '-1233,5', -1234, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(0, '-1232,5', -1232, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, '123,46', 123.5, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, '123,45', 123.4, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, '123,44', 123.4, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, '123,35', 123.4, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, '123,25', 123.2, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, '-123,46', -123.5, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, '-123,45', -123.4, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, '-123,44', -123.4, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, '-123,35', -123.4, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1, '-123,25', -123.2, NumberToLocalizedStringTransformer::ROUND_HALF_EVEN),
            // round halves (.5) away from zero
            array(0, '1234,6', 1235, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(0, '1234,5', 1235, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(0, '1234,4', 1234, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(0, '-1234,6', -1235, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(0, '-1234,5', -1235, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(0, '-1234,4', -1234, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, '123,46', 123.5, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, '123,45', 123.5, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, '123,44', 123.4, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, '-123,46', -123.5, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, '-123,45', -123.5, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1, '-123,44', -123.4, NumberToLocalizedStringTransformer::ROUND_HALF_UP),
            // round halves (.5) towards zero
            array(0, '1234,6', 1235, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(0, '1234,5', 1234, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(0, '1234,4', 1234, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(0, '-1234,6', -1235, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(0, '-1234,5', -1234, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(0, '-1234,4', -1234, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, '123,46', 123.5, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, '123,45', 123.4, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, '123,44', 123.4, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, '-123,46', -123.5, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, '-123,45', -123.4, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1, '-123,44', -123.4, NumberToLocalizedStringTransformer::ROUND_HALF_DOWN),
        );
    }

    /**
     * @dataProvider reverseTransformWithRoundingProvider
     */
    public function testReverseTransformWithRounding($precision, $input, $output, $roundingMode)
    {
        $transformer = new NumberToLocalizedStringTransformer($precision, null, $roundingMode);

        $this->assertEquals($output, $transformer->reverseTransform($input));
    }

    public function testReverseTransformDoesNotRoundIfNoPrecision()
    {
        $transformer = new NumberToLocalizedStringTransformer(null, null, NumberToLocalizedStringTransformer::ROUND_DOWN);

        $this->assertEquals(1234.547, $transformer->reverseTransform('1234,547'));
    }

    public function testDecimalSeparatorMayBeDotIfGroupingSeparatorIsNotDot()
    {
        \Locale::setDefault('fr');
        $transformer = new NumberToLocalizedStringTransformer(null, true);

        // completely valid format
        $this->assertEquals(1234.5, $transformer->reverseTransform('1 234,5'));
        // accept dots
        $this->assertEquals(1234.5, $transformer->reverseTransform('1 234.5'));
        // omit group separator
        $this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
        $this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testDecimalSeparatorMayNotBeDotIfGroupingSeparatorIsDot()
    {
        $transformer = new NumberToLocalizedStringTransformer(null, true);

        $transformer->reverseTransform('1.234.5');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testDecimalSeparatorMayNotBeDotIfGroupingSeparatorIsDotWithNoGroupSep()
    {
        $transformer = new NumberToLocalizedStringTransformer(null, true);

        $transformer->reverseTransform('1234.5');
    }

    public function testDecimalSeparatorMayBeDotIfGroupingSeparatorIsDotButNoGroupingUsed()
    {
        \Locale::setDefault('fr');
        $transformer = new NumberToLocalizedStringTransformer();

        $this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
        $this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
    }

    public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsNotComma()
    {
        \Locale::setDefault('bg');
        $transformer = new NumberToLocalizedStringTransformer(null, true);

        // completely valid format
        $this->assertEquals(1234.5, $transformer->reverseTransform('1 234.5'));
        // accept commas
        $this->assertEquals(1234.5, $transformer->reverseTransform('1 234,5'));
        // omit group separator
        $this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
        $this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testDecimalSeparatorMayNotBeCommaIfGroupingSeparatorIsComma()
    {
        \Locale::setDefault('en');
        $transformer = new NumberToLocalizedStringTransformer(null, true);

        $transformer->reverseTransform('1,234,5');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testDecimalSeparatorMayNotBeCommaIfGroupingSeparatorIsCommaWithNoGroupSep()
    {
        \Locale::setDefault('en');
        $transformer = new NumberToLocalizedStringTransformer(null, true);

        $transformer->reverseTransform('1234,5');
    }

    public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsCommaButNoGroupingUsed()
    {
        \Locale::setDefault('en');
        $transformer = new NumberToLocalizedStringTransformer();

        $this->assertEquals(1234.5, $transformer->reverseTransform('1234,5'));
        $this->assertEquals(1234.5, $transformer->reverseTransform('1234.5'));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testTransformExpectsNumeric()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->transform('foo');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformExpectsString()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->reverseTransform(1);
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformExpectsValidNumber()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->reverseTransform('foo');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     * @link https://github.com/symfony/symfony/issues/3161
     */
    public function testReverseTransformDisallowsNaN()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->reverseTransform('NaN');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformDisallowsNaN2()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->reverseTransform('nan');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformDisallowsInfinity()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->reverseTransform('∞');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformDisallowsInfinity2()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->reverseTransform('∞,123');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformDisallowsNegativeInfinity()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->reverseTransform('-∞');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformDisallowsLeadingExtraCharacters()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->reverseTransform('foo123');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     * @expectedExceptionMessage The number contains unrecognized characters: "foo3"
     */
    public function testReverseTransformDisallowsCenteredExtraCharacters()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->reverseTransform('12foo3');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     * @expectedExceptionMessage The number contains unrecognized characters: "foo8"
     */
    public function testReverseTransformDisallowsCenteredExtraCharactersMultibyte()
    {
        if (!extension_loaded('mbstring')) {
            $this->markTestSkipped('The "mbstring" extension is required for this test.');
        }

        \Locale::setDefault('ru');

        $transformer = new NumberToLocalizedStringTransformer(null, true);

        $transformer->reverseTransform("12\xc2\xa0345,67foo8");
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     * @expectedExceptionMessage The number contains unrecognized characters: "foo8"
     */
    public function testReverseTransformIgnoresTrailingSpacesInExceptionMessage()
    {
        if (!extension_loaded('mbstring')) {
            $this->markTestSkipped('The "mbstring" extension is required for this test.');
        }

        \Locale::setDefault('ru');

        $transformer = new NumberToLocalizedStringTransformer(null, true);

        $transformer->reverseTransform("12\xc2\xa0345,67foo8  \xc2\xa0\t");
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     * @expectedExceptionMessage The number contains unrecognized characters: "foo"
     */
    public function testReverseTransformDisallowsTrailingExtraCharacters()
    {
        $transformer = new NumberToLocalizedStringTransformer();

        $transformer->reverseTransform('123foo');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     * @expectedExceptionMessage The number contains unrecognized characters: "foo"
     */
    public function testReverseTransformDisallowsTrailingExtraCharactersMultibyte()
    {
        if (!extension_loaded('mbstring')) {
            $this->markTestSkipped('The "mbstring" extension is required for this test.');
        }

        \Locale::setDefault('ru');

        $transformer = new NumberToLocalizedStringTransformer(null, true);

        $transformer->reverseTransform("12\xc2\xa0345,678foo");
    }
}
PKvb�\�?+�<<opear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ValueToDuplicatesTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\ValueToDuplicatesTransformer;

class ValueToDuplicatesTransformerTest extends \PHPUnit_Framework_TestCase
{
    private $transformer;

    protected function setUp()
    {
        $this->transformer = new ValueToDuplicatesTransformer(array('a', 'b', 'c'));
    }

    protected function tearDown()
    {
        $this->transformer = null;
    }

    public function testTransform()
    {
        $output = array(
            'a' => 'Foo',
            'b' => 'Foo',
            'c' => 'Foo',
        );

        $this->assertSame($output, $this->transformer->transform('Foo'));
    }

    public function testTransformEmpty()
    {
        $output = array(
            'a' => null,
            'b' => null,
            'c' => null,
        );

        $this->assertSame($output, $this->transformer->transform(null));
    }

    public function testReverseTransform()
    {
        $input = array(
            'a' => 'Foo',
            'b' => 'Foo',
            'c' => 'Foo',
        );

        $this->assertSame('Foo', $this->transformer->reverseTransform($input));
    }

    public function testReverseTransformCompletelyEmpty()
    {
        $input = array(
            'a' => '',
            'b' => '',
            'c' => '',
        );

        $this->assertNull($this->transformer->reverseTransform($input));
    }

    public function testReverseTransformCompletelyNull()
    {
        $input = array(
            'a' => null,
            'b' => null,
            'c' => null,
        );

        $this->assertNull($this->transformer->reverseTransform($input));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformPartiallyNull()
    {
        $input = array(
            'a' => 'Foo',
            'b' => 'Foo',
            'c' => null,
        );

        $this->transformer->reverseTransform($input);
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformDifferences()
    {
        $input = array(
            'a' => 'Foo',
            'b' => 'Bar',
            'c' => 'Foo',
        );

        $this->transformer->reverseTransform($input);
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformRequiresArray()
    {
        $this->transformer->reverseTransform('12345');
    }
}
PKvb�\�����vpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer;
use Symfony\Component\Intl\Util\IntlTestHelper;

class PercentToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        parent::setUp();

        // Since we test against "de_AT", we need the full implementation
        IntlTestHelper::requireFullIntl($this);

        \Locale::setDefault('de_AT');
    }

    public function testTransform()
    {
        $transformer = new PercentToLocalizedStringTransformer();

        $this->assertEquals('10', $transformer->transform(0.1));
        $this->assertEquals('15', $transformer->transform(0.15));
        $this->assertEquals('12', $transformer->transform(0.1234));
        $this->assertEquals('200', $transformer->transform(2));
    }

    public function testTransformEmpty()
    {
        $transformer = new PercentToLocalizedStringTransformer();

        $this->assertEquals('', $transformer->transform(null));
    }

    public function testTransformWithInteger()
    {
        $transformer = new PercentToLocalizedStringTransformer(null, 'integer');

        $this->assertEquals('0', $transformer->transform(0.1));
        $this->assertEquals('1', $transformer->transform(1));
        $this->assertEquals('15', $transformer->transform(15));
        $this->assertEquals('16', $transformer->transform(15.9));
    }

    public function testTransformWithPrecision()
    {
        $transformer = new PercentToLocalizedStringTransformer(2);

        $this->assertEquals('12,34', $transformer->transform(0.1234));
    }

    public function testReverseTransform()
    {
        $transformer = new PercentToLocalizedStringTransformer();

        $this->assertEquals(0.1, $transformer->reverseTransform('10'));
        $this->assertEquals(0.15, $transformer->reverseTransform('15'));
        $this->assertEquals(0.12, $transformer->reverseTransform('12'));
        $this->assertEquals(2, $transformer->reverseTransform('200'));
    }

    public function testReverseTransformEmpty()
    {
        $transformer = new PercentToLocalizedStringTransformer();

        $this->assertNull($transformer->reverseTransform(''));
    }

    public function testReverseTransformWithInteger()
    {
        $transformer = new PercentToLocalizedStringTransformer(null, 'integer');

        $this->assertEquals(10, $transformer->reverseTransform('10'));
        $this->assertEquals(15, $transformer->reverseTransform('15'));
        $this->assertEquals(12, $transformer->reverseTransform('12'));
        $this->assertEquals(200, $transformer->reverseTransform('200'));
    }

    public function testReverseTransformWithPrecision()
    {
        $transformer = new PercentToLocalizedStringTransformer(2);

        $this->assertEquals(0.1234, $transformer->reverseTransform('12,34'));
    }

    public function testTransformExpectsNumeric()
    {
        $transformer = new PercentToLocalizedStringTransformer();

        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

        $transformer->transform('foo');
    }

    public function testReverseTransformExpectsString()
    {
        $transformer = new PercentToLocalizedStringTransformer();

        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

        $transformer->reverseTransform(1);
    }
}
PKvb�\fJ��jpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BaseDateTimeTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

class BaseDateTimeTransformerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
     * @expectedExceptionMessage this_timezone_does_not_exist
     */
    public function testConstructFailsIfInputTimezoneIsInvalid()
    {
        $this->getMock(
            'Symfony\Component\Form\Extension\Core\DataTransformer\BaseDateTimeTransformer',
            array(),
            array('this_timezone_does_not_exist')
        );
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
     * @expectedExceptionMessage that_timezone_does_not_exist
     */
    public function testConstructFailsIfOutputTimezoneIsInvalid()
    {
        $this->getMock(
            'Symfony\Component\Form\Extension\Core\DataTransformer\BaseDateTimeTransformer',
            array(),
            array(null, 'that_timezone_does_not_exist')
        );
    }
}
PKvb�\Y@zjjtpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\MoneyToLocalizedStringTransformer;
use Symfony\Component\Intl\Util\IntlTestHelper;

class MoneyToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        parent::setUp();

        // Since we test against "de_AT", we need the full implementation
        IntlTestHelper::requireFullIntl($this);

        \Locale::setDefault('de_AT');
    }

    public function testTransform()
    {
        $transformer = new MoneyToLocalizedStringTransformer(null, null, null, 100);

        $this->assertEquals('1,23', $transformer->transform(123));
    }

    public function testTransformExpectsNumeric()
    {
        $transformer = new MoneyToLocalizedStringTransformer(null, null, null, 100);

        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

        $transformer->transform('abcd');
    }

    public function testTransformEmpty()
    {
        $transformer = new MoneyToLocalizedStringTransformer();

        $this->assertSame('', $transformer->transform(null));
    }

    public function testReverseTransform()
    {
        $transformer = new MoneyToLocalizedStringTransformer(null, null, null, 100);

        $this->assertEquals(123, $transformer->reverseTransform('1,23'));
    }

    public function testReverseTransformExpectsString()
    {
        $transformer = new MoneyToLocalizedStringTransformer(null, null, null, 100);

        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

        $transformer->reverseTransform(12345);
    }

    public function testReverseTransformEmpty()
    {
        $transformer = new MoneyToLocalizedStringTransformer();

        $this->assertNull($transformer->reverseTransform(''));
    }
}
PKwb�\N�z.z.vpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/IntegerToLocalizedStringTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\IntegerToLocalizedStringTransformer;
use Symfony\Component\Intl\Util\IntlTestHelper;

class IntegerToLocalizedStringTransformerTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        parent::setUp();

        // Since we test against "de_AT", we need the full implementation
        IntlTestHelper::requireFullIntl($this);

        \Locale::setDefault('de_AT');
    }

    public function transformWithRoundingProvider()
    {
        return array(
            // towards positive infinity (1.6 -> 2, -1.6 -> -1)
            array(1234.5, '1235', IntegerToLocalizedStringTransformer::ROUND_CEILING),
            array(1234.4, '1235', IntegerToLocalizedStringTransformer::ROUND_CEILING),
            array(-1234.5, '-1234', IntegerToLocalizedStringTransformer::ROUND_CEILING),
            array(-1234.4, '-1234', IntegerToLocalizedStringTransformer::ROUND_CEILING),
            // towards negative infinity (1.6 -> 1, -1.6 -> -2)
            array(1234.5, '1234', IntegerToLocalizedStringTransformer::ROUND_FLOOR),
            array(1234.4, '1234', IntegerToLocalizedStringTransformer::ROUND_FLOOR),
            array(-1234.5, '-1235', IntegerToLocalizedStringTransformer::ROUND_FLOOR),
            array(-1234.4, '-1235', IntegerToLocalizedStringTransformer::ROUND_FLOOR),
            // away from zero (1.6 -> 2, -1.6 -> 2)
            array(1234.5, '1235', IntegerToLocalizedStringTransformer::ROUND_UP),
            array(1234.4, '1235', IntegerToLocalizedStringTransformer::ROUND_UP),
            array(-1234.5, '-1235', IntegerToLocalizedStringTransformer::ROUND_UP),
            array(-1234.4, '-1235', IntegerToLocalizedStringTransformer::ROUND_UP),
            // towards zero (1.6 -> 1, -1.6 -> -1)
            array(1234.5, '1234', IntegerToLocalizedStringTransformer::ROUND_DOWN),
            array(1234.4, '1234', IntegerToLocalizedStringTransformer::ROUND_DOWN),
            array(-1234.5, '-1234', IntegerToLocalizedStringTransformer::ROUND_DOWN),
            array(-1234.4, '-1234', IntegerToLocalizedStringTransformer::ROUND_DOWN),
            // round halves (.5) to the next even number
            array(1234.6, '1235', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1234.5, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1234.4, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1233.5, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(1232.5, '1232', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(-1234.6, '-1235', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(-1234.5, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(-1234.4, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(-1233.5, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array(-1232.5, '-1232', IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            // round halves (.5) away from zero
            array(1234.6, '1235', IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1234.5, '1235', IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            array(1234.4, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            array(-1234.6, '-1235', IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            array(-1234.5, '-1235', IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            array(-1234.4, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            // round halves (.5) towards zero
            array(1234.6, '1235', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1234.5, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(1234.4, '1234', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(-1234.6, '-1235', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(-1234.5, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array(-1234.4, '-1234', IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
        );
    }

    /**
     * @dataProvider transformWithRoundingProvider
     */
    public function testTransformWithRounding($input, $output, $roundingMode)
    {
        $transformer = new IntegerToLocalizedStringTransformer(null, null, $roundingMode);

        $this->assertEquals($output, $transformer->transform($input));
    }

    public function testReverseTransform()
    {
        $transformer = new IntegerToLocalizedStringTransformer();

        $this->assertEquals(1, $transformer->reverseTransform('1'));
        $this->assertEquals(1, $transformer->reverseTransform('1,5'));
        $this->assertEquals(1234, $transformer->reverseTransform('1234,5'));
        $this->assertEquals(12345, $transformer->reverseTransform('12345,912'));
    }

    public function testReverseTransformEmpty()
    {
        $transformer = new IntegerToLocalizedStringTransformer();

        $this->assertNull($transformer->reverseTransform(''));
    }

    public function testReverseTransformWithGrouping()
    {
        $transformer = new IntegerToLocalizedStringTransformer(null, true);

        $this->assertEquals(1234, $transformer->reverseTransform('1.234,5'));
        $this->assertEquals(12345, $transformer->reverseTransform('12.345,912'));
        $this->assertEquals(1234, $transformer->reverseTransform('1234,5'));
        $this->assertEquals(12345, $transformer->reverseTransform('12345,912'));
    }

    public function reverseTransformWithRoundingProvider()
    {
        return array(
            // towards positive infinity (1.6 -> 2, -1.6 -> -1)
            array('1234,5', 1235, IntegerToLocalizedStringTransformer::ROUND_CEILING),
            array('1234,4', 1235, IntegerToLocalizedStringTransformer::ROUND_CEILING),
            array('-1234,5', -1234, IntegerToLocalizedStringTransformer::ROUND_CEILING),
            array('-1234,4', -1234, IntegerToLocalizedStringTransformer::ROUND_CEILING),
            // towards negative infinity (1.6 -> 1, -1.6 -> -2)
            array('1234,5', 1234, IntegerToLocalizedStringTransformer::ROUND_FLOOR),
            array('1234,4', 1234, IntegerToLocalizedStringTransformer::ROUND_FLOOR),
            array('-1234,5', -1235, IntegerToLocalizedStringTransformer::ROUND_FLOOR),
            array('-1234,4', -1235, IntegerToLocalizedStringTransformer::ROUND_FLOOR),
            // away from zero (1.6 -> 2, -1.6 -> 2)
            array('1234,5', 1235, IntegerToLocalizedStringTransformer::ROUND_UP),
            array('1234,4', 1235, IntegerToLocalizedStringTransformer::ROUND_UP),
            array('-1234,5', -1235, IntegerToLocalizedStringTransformer::ROUND_UP),
            array('-1234,4', -1235, IntegerToLocalizedStringTransformer::ROUND_UP),
            // towards zero (1.6 -> 1, -1.6 -> -1)
            array('1234,5', 1234, IntegerToLocalizedStringTransformer::ROUND_DOWN),
            array('1234,4', 1234, IntegerToLocalizedStringTransformer::ROUND_DOWN),
            array('-1234,5', -1234, IntegerToLocalizedStringTransformer::ROUND_DOWN),
            array('-1234,4', -1234, IntegerToLocalizedStringTransformer::ROUND_DOWN),
            // round halves (.5) to the next even number
            array('1234,6', 1235, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array('1234,5', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array('1234,4', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array('1233,5', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array('1232,5', 1232, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array('-1234,6', -1235, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array('-1234,5', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array('-1234,4', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array('-1233,5', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            array('-1232,5', -1232, IntegerToLocalizedStringTransformer::ROUND_HALF_EVEN),
            // round halves (.5) away from zero
            array('1234,6', 1235, IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            array('1234,5', 1235, IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            array('1234,4', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            array('-1234,6', -1235, IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            array('-1234,5', -1235, IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            array('-1234,4', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_UP),
            // round halves (.5) towards zero
            array('1234,6', 1235, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array('1234,5', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array('1234,4', 1234, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array('-1234,6', -1235, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array('-1234,5', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
            array('-1234,4', -1234, IntegerToLocalizedStringTransformer::ROUND_HALF_DOWN),
        );
    }

    /**
     * @dataProvider reverseTransformWithRoundingProvider
     */
    public function testReverseTransformWithRounding($input, $output, $roundingMode)
    {
        $transformer = new IntegerToLocalizedStringTransformer(null, null, $roundingMode);

        $this->assertEquals($output, $transformer->reverseTransform($input));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformExpectsString()
    {
        $transformer = new IntegerToLocalizedStringTransformer();

        $transformer->reverseTransform(1);
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformExpectsValidNumber()
    {
        $transformer = new IntegerToLocalizedStringTransformer();

        $transformer->reverseTransform('foo');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformDisallowsNaN()
    {
        $transformer = new IntegerToLocalizedStringTransformer();

        $transformer->reverseTransform('NaN');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformDisallowsNaN2()
    {
        $transformer = new IntegerToLocalizedStringTransformer();

        $transformer->reverseTransform('nan');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformDisallowsInfinity()
    {
        $transformer = new IntegerToLocalizedStringTransformer();

        $transformer->reverseTransform('∞');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformDisallowsNegativeInfinity()
    {
        $transformer = new IntegerToLocalizedStringTransformer();

        $transformer->reverseTransform('-∞');
    }
}
PKwb�\�6���mpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/BooleanToStringTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\BooleanToStringTransformer;

class BooleanToStringTransformerTest extends \PHPUnit_Framework_TestCase
{
    const TRUE_VALUE = '1';

    /**
     * @var BooleanToStringTransformer
     */
    protected $transformer;

    protected function setUp()
    {
        $this->transformer = new BooleanToStringTransformer(self::TRUE_VALUE);
    }

    protected function tearDown()
    {
        $this->transformer = null;
    }

    public function testTransform()
    {
        $this->assertEquals(self::TRUE_VALUE, $this->transformer->transform(true));
        $this->assertNull($this->transformer->transform(false));
    }

    // https://github.com/symfony/symfony/issues/8989
    public function testTransformAcceptsNull()
    {
        $this->assertNull($this->transformer->transform(null));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testTransformFailsIfString()
    {
        $this->transformer->transform('1');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformFailsIfInteger()
    {
        $this->transformer->reverseTransform(1);
    }

    public function testReverseTransform()
    {
        $this->assertTrue($this->transformer->reverseTransform(self::TRUE_VALUE));
        $this->assertTrue($this->transformer->reverseTransform('foobar'));
        $this->assertTrue($this->transformer->reverseTransform(''));
        $this->assertFalse($this->transformer->reverseTransform(null));
    }
}
PKwb�\]e"��opear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToRfc3339TransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToRfc3339Transformer;

class DateTimeToRfc3339TransformerTest extends DateTimeTestCase
{
    protected $dateTime;
    protected $dateTimeWithoutSeconds;

    protected function setUp()
    {
        parent::setUp();

        $this->dateTime = new \DateTime('2010-02-03 04:05:06 UTC');
        $this->dateTimeWithoutSeconds = new \DateTime('2010-02-03 04:05:00 UTC');
    }

    protected function tearDown()
    {
        $this->dateTime = null;
        $this->dateTimeWithoutSeconds = null;
    }

    public static function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
    {
        if ($expected instanceof \DateTime && $actual instanceof \DateTime) {
            $expected = $expected->format('c');
            $actual = $actual->format('c');
        }

        parent::assertEquals($expected, $actual, $message, $delta, $maxDepth, $canonicalize, $ignoreCase);
    }

    public function allProvider()
    {
        return array(
            array('UTC', 'UTC', '2010-02-03 04:05:06 UTC', '2010-02-03T04:05:06Z'),
            array('UTC', 'UTC', null, ''),
            array('America/New_York', 'Asia/Hong_Kong', '2010-02-03 04:05:06 America/New_York', '2010-02-03T17:05:06+08:00'),
            array('America/New_York', 'Asia/Hong_Kong', null, ''),
            array('UTC', 'Asia/Hong_Kong', '2010-02-03 04:05:06 UTC', '2010-02-03T12:05:06+08:00'),
            array('America/New_York', 'UTC', '2010-02-03 04:05:06 America/New_York', '2010-02-03T09:05:06Z'),
        );
    }

    public function transformProvider()
    {
        return $this->allProvider();
    }

    public function reverseTransformProvider()
    {
        return array_merge($this->allProvider(), array(
            // format without seconds, as appears in some browsers
            array('UTC', 'UTC', '2010-02-03 04:05:00 UTC', '2010-02-03T04:05Z'),
            array('America/New_York', 'Asia/Hong_Kong', '2010-02-03 04:05:00 America/New_York', '2010-02-03T17:05+08:00'),
            array('Europe/Amsterdam', 'Europe/Amsterdam', '2013-08-21 10:30:00 Europe/Amsterdam', '2013-08-21T08:30:00Z')
        ));
    }

    /**
     * @dataProvider transformProvider
     */
    public function testTransform($fromTz, $toTz, $from, $to)
    {
        $transformer = new DateTimeToRfc3339Transformer($fromTz, $toTz);

        $this->assertSame($to, $transformer->transform(null !== $from ? new \DateTime($from) : null));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testTransformRequiresValidDateTime()
    {
        $transformer = new DateTimeToRfc3339Transformer();
        $transformer->transform('2010-01-01');
    }

    /**
     * @dataProvider reverseTransformProvider
     */
    public function testReverseTransform($toTz, $fromTz, $to, $from)
    {
        $transformer = new DateTimeToRfc3339Transformer($toTz, $fromTz);

        if (null !== $to) {
            $this->assertDateTimeEquals(new \DateTime($to), $transformer->reverseTransform($from));
        } else {
            $this->assertSame($to, $transformer->reverseTransform($from));
        }
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformRequiresString()
    {
        $transformer = new DateTimeToRfc3339Transformer();
        $transformer->reverseTransform(12345);
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithNonExistingDate()
    {
        $transformer = new DateTimeToRfc3339Transformer('UTC', 'UTC');

        $transformer->reverseTransform('2010-04-31T04:05Z');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformExpectsValidDateString()
    {
        $transformer = new DateTimeToRfc3339Transformer('UTC', 'UTC');

        $transformer->reverseTransform('2010-2010-2010');
    }
}
PKxb�\��=�C?C?mpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToArrayTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToArrayTransformer;

class DateTimeToArrayTransformerTest extends DateTimeTestCase
{
    public function testTransform()
    {
        $transformer = new DateTimeToArrayTransformer('UTC', 'UTC');

        $input = new \DateTime('2010-02-03 04:05:06 UTC');

        $output = array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        );

        $this->assertSame($output, $transformer->transform($input));
    }

    public function testTransformEmpty()
    {
        $transformer = new DateTimeToArrayTransformer();

        $output = array(
            'year' => '',
            'month' => '',
            'day' => '',
            'hour' => '',
            'minute' => '',
            'second' => '',
        );

        $this->assertSame($output, $transformer->transform(null));
    }

    public function testTransformEmptyWithFields()
    {
        $transformer = new DateTimeToArrayTransformer(null, null, array('year', 'minute', 'second'));

        $output = array(
            'year' => '',
            'minute' => '',
            'second' => '',
        );

        $this->assertSame($output, $transformer->transform(null));
    }

    public function testTransformWithFields()
    {
        $transformer = new DateTimeToArrayTransformer('UTC', 'UTC', array('year', 'month', 'minute', 'second'));

        $input = new \DateTime('2010-02-03 04:05:06 UTC');

        $output = array(
            'year' => '2010',
            'month' => '2',
            'minute' => '5',
            'second' => '6',
        );

        $this->assertSame($output, $transformer->transform($input));
    }

    public function testTransformWithPadding()
    {
        $transformer = new DateTimeToArrayTransformer('UTC', 'UTC', null, true);

        $input = new \DateTime('2010-02-03 04:05:06 UTC');

        $output = array(
            'year' => '2010',
            'month' => '02',
            'day' => '03',
            'hour' => '04',
            'minute' => '05',
            'second' => '06',
        );

        $this->assertSame($output, $transformer->transform($input));
    }

    public function testTransformDifferentTimezones()
    {
        $transformer = new DateTimeToArrayTransformer('America/New_York', 'Asia/Hong_Kong');

        $input = new \DateTime('2010-02-03 04:05:06 America/New_York');

        $dateTime = new \DateTime('2010-02-03 04:05:06 America/New_York');
        $dateTime->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));
        $output = array(
            'year' => (string) (int) $dateTime->format('Y'),
            'month' => (string) (int) $dateTime->format('m'),
            'day' => (string) (int) $dateTime->format('d'),
            'hour' => (string) (int) $dateTime->format('H'),
            'minute' => (string) (int) $dateTime->format('i'),
            'second' => (string) (int) $dateTime->format('s'),
        );

        $this->assertSame($output, $transformer->transform($input));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testTransformRequiresDateTime()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform('12345');
    }

    public function testReverseTransform()
    {
        $transformer = new DateTimeToArrayTransformer('UTC', 'UTC');

        $input = array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        );

        $output = new \DateTime('2010-02-03 04:05:06 UTC');

        $this->assertDateTimeEquals($output, $transformer->reverseTransform($input));
    }

    public function testReverseTransformWithSomeZero()
    {
        $transformer = new DateTimeToArrayTransformer('UTC', 'UTC');

        $input = array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'minute' => '0',
            'second' => '0',
        );

        $output = new \DateTime('2010-02-03 04:00:00 UTC');

        $this->assertDateTimeEquals($output, $transformer->reverseTransform($input));
    }

    public function testReverseTransformCompletelyEmpty()
    {
        $transformer = new DateTimeToArrayTransformer();

        $input = array(
            'year' => '',
            'month' => '',
            'day' => '',
            'hour' => '',
            'minute' => '',
            'second' => '',
        );

        $this->assertNull($transformer->reverseTransform($input));
    }

    public function testReverseTransformCompletelyEmptySubsetOfFields()
    {
        $transformer = new DateTimeToArrayTransformer(null, null, array('year', 'month', 'day'));

        $input = array(
            'year' => '',
            'month' => '',
            'day' => '',
        );

        $this->assertNull($transformer->reverseTransform($input));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformPartiallyEmptyYear()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformPartiallyEmptyMonth()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformPartiallyEmptyDay()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformPartiallyEmptyHour()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformPartiallyEmptyMinute()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformPartiallyEmptySecond()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
        ));
    }

    public function testReverseTransformNull()
    {
        $transformer = new DateTimeToArrayTransformer();

        $this->assertNull($transformer->reverseTransform(null));
    }

    public function testReverseTransformDifferentTimezones()
    {
        $transformer = new DateTimeToArrayTransformer('America/New_York', 'Asia/Hong_Kong');

        $input = array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        );

        $output = new \DateTime('2010-02-03 04:05:06 Asia/Hong_Kong');
        $output->setTimezone(new \DateTimeZone('America/New_York'));

        $this->assertDateTimeEquals($output, $transformer->reverseTransform($input));
    }

    public function testReverseTransformToDifferentTimezone()
    {
        $transformer = new DateTimeToArrayTransformer('Asia/Hong_Kong', 'UTC');

        $input = array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        );

        $output = new \DateTime('2010-02-03 04:05:06 UTC');
        $output->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));

        $this->assertDateTimeEquals($output, $transformer->reverseTransform($input));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformRequiresArray()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform('12345');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithNegativeYear()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '-1',
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithNegativeMonth()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '-1',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithNegativeDay()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '-1',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithNegativeHour()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'hour' => '-1',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithNegativeMinute()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'minute' => '-1',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithNegativeSecond()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
            'second' => '-1',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithInvalidMonth()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '13',
            'day' => '3',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithInvalidDay()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '31',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithStringDay()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => 'bazinga',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithStringMonth()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => 'bazinga',
            'day' => '31',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithStringYear()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => 'bazinga',
            'month' => '2',
            'day' => '31',
            'hour' => '4',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithEmptyStringHour()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '31',
            'hour' => '',
            'minute' => '5',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithEmptyStringMinute()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '31',
            'hour' => '4',
            'minute' => '',
            'second' => '6',
        ));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithEmptyStringSecond()
    {
        $transformer = new DateTimeToArrayTransformer();
        $transformer->reverseTransform(array(
            'year' => '2010',
            'month' => '2',
            'day' => '31',
            'hour' => '4',
            'minute' => '5',
            'second' => '',
        ));
    }
}
PKxb�\�}��!
!
qpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToTimestampTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer;

class DateTimeToTimestampTransformerTest extends DateTimeTestCase
{
    public function testTransform()
    {
        $transformer = new DateTimeToTimestampTransformer('UTC', 'UTC');

        $input = new \DateTime('2010-02-03 04:05:06 UTC');
        $output = $input->format('U');

        $this->assertEquals($output, $transformer->transform($input));
    }

    public function testTransformEmpty()
    {
        $transformer = new DateTimeToTimestampTransformer();

        $this->assertNull($transformer->transform(null));
    }

    public function testTransformWithDifferentTimezones()
    {
        $transformer = new DateTimeToTimestampTransformer('Asia/Hong_Kong', 'America/New_York');

        $input = new \DateTime('2010-02-03 04:05:06 America/New_York');
        $output = $input->format('U');
        $input->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));

        $this->assertEquals($output, $transformer->transform($input));
    }

    public function testTransformFromDifferentTimezone()
    {
        $transformer = new DateTimeToTimestampTransformer('Asia/Hong_Kong', 'UTC');

        $input = new \DateTime('2010-02-03 04:05:06 Asia/Hong_Kong');

        $dateTime = clone $input;
        $dateTime->setTimezone(new \DateTimeZone('UTC'));
        $output = $dateTime->format('U');

        $this->assertEquals($output, $transformer->transform($input));
    }

    public function testTransformExpectsDateTime()
    {
        $transformer = new DateTimeToTimestampTransformer();

        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

        $transformer->transform('1234');
    }

    public function testReverseTransform()
    {
        $reverseTransformer = new DateTimeToTimestampTransformer('UTC', 'UTC');

        $output = new \DateTime('2010-02-03 04:05:06 UTC');
        $input = $output->format('U');

        $this->assertDateTimeEquals($output, $reverseTransformer->reverseTransform($input));
    }

    public function testReverseTransformEmpty()
    {
        $reverseTransformer = new DateTimeToTimestampTransformer();

        $this->assertNull($reverseTransformer->reverseTransform(null));
    }

    public function testReverseTransformWithDifferentTimezones()
    {
        $reverseTransformer = new DateTimeToTimestampTransformer('Asia/Hong_Kong', 'America/New_York');

        $output = new \DateTime('2010-02-03 04:05:06 America/New_York');
        $input = $output->format('U');
        $output->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));

        $this->assertDateTimeEquals($output, $reverseTransformer->reverseTransform($input));
    }

    public function testReverseTransformExpectsValidTimestamp()
    {
        $reverseTransformer = new DateTimeToTimestampTransformer();

        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

        $reverseTransformer->reverseTransform('2010-2010-2010');
    }
}
PKxb�\�.bc))mpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ChoicesToValuesTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\ChoiceList\SimpleChoiceList;

use Symfony\Component\Form\Extension\Core\DataTransformer\ChoicesToValuesTransformer;

class ChoicesToValuesTransformerTest extends \PHPUnit_Framework_TestCase
{
    protected $transformer;

    protected function setUp()
    {
        $list = new SimpleChoiceList(array(0 => 'A', 1 => 'B', 2 => 'C'));
        $this->transformer = new ChoicesToValuesTransformer($list);
    }

    protected function tearDown()
    {
        $this->transformer = null;
    }

    public function testTransform()
    {
        // Value strategy in SimpleChoiceList is to copy and convert to string
        $in = array(0, 1, 2);
        $out = array('0', '1', '2');

        $this->assertSame($out, $this->transformer->transform($in));
    }

    public function testTransformNull()
    {
        $this->assertSame(array(), $this->transformer->transform(null));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testTransformExpectsArray()
    {
        $this->transformer->transform('foobar');
    }

    public function testReverseTransform()
    {
        // values are expected to be valid choices and stay the same
        $in = array('0', '1', '2');
        $out = array(0, 1, 2);

        $this->assertSame($out, $this->transformer->reverseTransform($in));
    }

    public function testReverseTransformNull()
    {
        $this->assertSame(array(), $this->transformer->reverseTransform(null));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformExpectsArray()
    {
        $this->transformer->reverseTransform('foobar');
    }
}
PKxb�\���jpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/ArrayToPartsTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\ArrayToPartsTransformer;

class ArrayToPartsTransformerTest extends \PHPUnit_Framework_TestCase
{
    private $transformer;

    protected function setUp()
    {
        $this->transformer = new ArrayToPartsTransformer(array(
            'first' => array('a', 'b', 'c'),
            'second' => array('d', 'e', 'f'),
        ));
    }

    protected function tearDown()
    {
        $this->transformer = null;
    }

    public function testTransform()
    {
        $input = array(
            'a' => '1',
            'b' => '2',
            'c' => '3',
            'd' => '4',
            'e' => '5',
            'f' => '6',
        );

        $output = array(
            'first' => array(
                'a' => '1',
                'b' => '2',
                'c' => '3',
            ),
            'second' => array(
                'd' => '4',
                'e' => '5',
                'f' => '6',
            ),
        );

        $this->assertSame($output, $this->transformer->transform($input));
    }

    public function testTransformEmpty()
    {
        $output = array(
            'first' => null,
            'second' => null,
        );

        $this->assertSame($output, $this->transformer->transform(null));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testTransformRequiresArray()
    {
        $this->transformer->transform('12345');
    }

    public function testReverseTransform()
    {
        $input = array(
            'first' => array(
                'a' => '1',
                'b' => '2',
                'c' => '3',
            ),
            'second' => array(
                'd' => '4',
                'e' => '5',
                'f' => '6',
            ),
        );

        $output = array(
            'a' => '1',
            'b' => '2',
            'c' => '3',
            'd' => '4',
            'e' => '5',
            'f' => '6',
        );

        $this->assertSame($output, $this->transformer->reverseTransform($input));
    }

    public function testReverseTransformCompletelyEmpty()
    {
        $input = array(
            'first' => '',
            'second' => '',
        );

        $this->assertNull($this->transformer->reverseTransform($input));
    }

    public function testReverseTransformCompletelyNull()
    {
        $input = array(
            'first' => null,
            'second' => null,
        );

        $this->assertNull($this->transformer->reverseTransform($input));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformPartiallyNull()
    {
        $input = array(
            'first' => array(
                'a' => '1',
                'b' => '2',
                'c' => '3',
            ),
            'second' => null,
        );

        $this->transformer->reverseTransform($input);
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformRequiresArray()
    {
        $this->transformer->reverseTransform('12345');
    }
}
PKyb�\\R��gpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DataTransformerChainTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\DataTransformerChain;

class DataTransformerChainTest extends \PHPUnit_Framework_TestCase
{
    public function testTransform()
    {
        $transformer1 = $this->getMock('Symfony\Component\Form\DataTransformerInterface');
        $transformer1->expects($this->once())
                                 ->method('transform')
                                 ->with($this->identicalTo('foo'))
                                 ->will($this->returnValue('bar'));
        $transformer2 = $this->getMock('Symfony\Component\Form\DataTransformerInterface');
        $transformer2->expects($this->once())
                                 ->method('transform')
                                 ->with($this->identicalTo('bar'))
                                 ->will($this->returnValue('baz'));

        $chain = new DataTransformerChain(array($transformer1, $transformer2));

        $this->assertEquals('baz', $chain->transform('foo'));
    }

    public function testReverseTransform()
    {
        $transformer2 = $this->getMock('Symfony\Component\Form\DataTransformerInterface');
        $transformer2->expects($this->once())
                                 ->method('reverseTransform')
                                 ->with($this->identicalTo('foo'))
                                 ->will($this->returnValue('bar'));
        $transformer1 = $this->getMock('Symfony\Component\Form\DataTransformerInterface');
        $transformer1->expects($this->once())
                                 ->method('reverseTransform')
                                 ->with($this->identicalTo('bar'))
                                 ->will($this->returnValue('baz'));

        $chain = new DataTransformerChain(array($transformer1, $transformer2));

        $this->assertEquals('baz', $chain->reverseTransform('foo'));
    }
}
PKyb�\JW����npear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToStringTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer;

class DateTimeToStringTransformerTest extends DateTimeTestCase
{
    public function dataProvider()
    {
        $data = array(
            array('Y-m-d H:i:s', '2010-02-03 16:05:06', '2010-02-03 16:05:06 UTC'),
            array('Y-m-d H:i:00', '2010-02-03 16:05:00', '2010-02-03 16:05:00 UTC'),
            array('Y-m-d H:i', '2010-02-03 16:05', '2010-02-03 16:05:00 UTC'),
            array('Y-m-d H', '2010-02-03 16', '2010-02-03 16:00:00 UTC'),
            array('Y-m-d', '2010-02-03', '2010-02-03 00:00:00 UTC'),
            array('Y-m', '2010-12', '2010-12-01 00:00:00 UTC'),
            array('Y', '2010', '2010-01-01 00:00:00 UTC'),
            array('d-m-Y', '03-02-2010', '2010-02-03 00:00:00 UTC'),
            array('H:i:s', '16:05:06', '1970-01-01 16:05:06 UTC'),
            array('H:i:00', '16:05:00', '1970-01-01 16:05:00 UTC'),
            array('H:i', '16:05', '1970-01-01 16:05:00 UTC'),
            array('H', '16', '1970-01-01 16:00:00 UTC'),

            // different day representations
            array('Y-m-j', '2010-02-3', '2010-02-03 00:00:00 UTC'),
            array('z', '33', '1970-02-03 00:00:00 UTC'),

            // not bijective
            // this will not work as PHP will use actual date to replace missing info
            // and after change of date will lookup for closest Wednesday
            // i.e. value: 2010-02, PHP value: 2010-02-(today i.e. 20), parsed date: 2010-02-24
            //array('Y-m-D', '2010-02-Wed', '2010-02-03 00:00:00 UTC'),
            //array('Y-m-l', '2010-02-Wednesday', '2010-02-03 00:00:00 UTC'),

            // different month representations
            array('Y-n-d', '2010-2-03', '2010-02-03 00:00:00 UTC'),
            array('Y-M-d', '2010-Feb-03', '2010-02-03 00:00:00 UTC'),
            array('Y-F-d', '2010-February-03', '2010-02-03 00:00:00 UTC'),

            // different year representations
            array('y-m-d', '10-02-03', '2010-02-03 00:00:00 UTC'),

            // different time representations
            array('G:i:s', '16:05:06', '1970-01-01 16:05:06 UTC'),
            array('g:i:s a', '4:05:06 pm', '1970-01-01 16:05:06 UTC'),
            array('h:i:s a', '04:05:06 pm', '1970-01-01 16:05:06 UTC'),

            // seconds since Unix
            array('U', '1265213106', '2010-02-03 16:05:06 UTC'),
        );

        // This test will fail < 5.3.9 - see https://bugs.php.net/51994
        if (version_compare(phpversion(), '5.3.9', '>=')) {
            $data[] = array('Y-z', '2010-33', '2010-02-03 00:00:00 UTC');
        }

        return $data;
    }

    /**
     * @dataProvider dataProvider
     */
    public function testTransform($format, $output, $input)
    {
        $transformer = new DateTimeToStringTransformer('UTC', 'UTC', $format);

        $input = new \DateTime($input);

        $this->assertEquals($output, $transformer->transform($input));
    }

    public function testTransformEmpty()
    {
        $transformer = new DateTimeToStringTransformer();

        $this->assertSame('', $transformer->transform(null));
    }

    public function testTransformWithDifferentTimezones()
    {
        $transformer = new DateTimeToStringTransformer('Asia/Hong_Kong', 'America/New_York', 'Y-m-d H:i:s');

        $input = new \DateTime('2010-02-03 12:05:06 America/New_York');
        $output = $input->format('Y-m-d H:i:s');
        $input->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));

        $this->assertEquals($output, $transformer->transform($input));
    }

    public function testTransformExpectsDateTime()
    {
        $transformer = new DateTimeToStringTransformer();

        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

        $transformer->transform('1234');
    }

    /**
     * @dataProvider dataProvider
     */
    public function testReverseTransformUsingPipe($format, $input, $output)
    {
        if (version_compare(phpversion(), '5.3.7', '<')) {
            $this->markTestSkipped('Pipe usage requires PHP 5.3.7 or newer.');
        }

        $reverseTransformer = new DateTimeToStringTransformer('UTC', 'UTC', $format, true);

        $output = new \DateTime($output);

        $this->assertDateTimeEquals($output, $reverseTransformer->reverseTransform($input));
    }

    /**
     * @dataProvider dataProvider
     */
    public function testReverseTransformWithoutUsingPipe($format, $input, $output)
    {
        $reverseTransformer = new DateTimeToStringTransformer('UTC', 'UTC', $format, false);

        $output = new \DateTime($output);

        $this->assertDateTimeEquals($output, $reverseTransformer->reverseTransform($input));
    }

    public function testReverseTransformEmpty()
    {
        $reverseTransformer = new DateTimeToStringTransformer();

        $this->assertNull($reverseTransformer->reverseTransform(''));
    }

    public function testReverseTransformWithDifferentTimezones()
    {
        $reverseTransformer = new DateTimeToStringTransformer('America/New_York', 'Asia/Hong_Kong', 'Y-m-d H:i:s');

        $output = new \DateTime('2010-02-03 16:05:06 Asia/Hong_Kong');
        $input = $output->format('Y-m-d H:i:s');
        $output->setTimeZone(new \DateTimeZone('America/New_York'));

        $this->assertDateTimeEquals($output, $reverseTransformer->reverseTransform($input));
    }

    public function testReverseTransformExpectsString()
    {
        $reverseTransformer = new DateTimeToStringTransformer();

        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

        $reverseTransformer->reverseTransform(1234);
    }

    public function testReverseTransformExpectsValidDateString()
    {
        $reverseTransformer = new DateTimeToStringTransformer();

        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

        $reverseTransformer->reverseTransform('2010-2010-2010');
    }

    public function testReverseTransformWithNonExistingDate()
    {
        $reverseTransformer = new DateTimeToStringTransformer();

        $this->setExpectedException('Symfony\Component\Form\Exception\TransformationFailedException');

        $reverseTransformer->reverseTransform('2010-04-31');
    }
}
PKyb�\Ws�**wpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer;

use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer;
use Symfony\Component\Intl\Util\IntlTestHelper;

class DateTimeToLocalizedStringTransformerTest extends DateTimeTestCase
{
    protected $dateTime;
    protected $dateTimeWithoutSeconds;

    protected function setUp()
    {
        parent::setUp();

        // Since we test against "de_AT", we need the full implementation
        IntlTestHelper::requireFullIntl($this);

        \Locale::setDefault('de_AT');

        $this->dateTime = new \DateTime('2010-02-03 04:05:06 UTC');
        $this->dateTimeWithoutSeconds = new \DateTime('2010-02-03 04:05:00 UTC');
    }

    protected function tearDown()
    {
        $this->dateTime = null;
        $this->dateTimeWithoutSeconds = null;
    }

    public static function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false)
    {
        if ($expected instanceof \DateTime && $actual instanceof \DateTime) {
            $expected = $expected->format('c');
            $actual = $actual->format('c');
        }

        parent::assertEquals($expected, $actual, $message, $delta, $maxDepth, $canonicalize, $ignoreCase);
    }

    public function dataProvider()
    {
        return array(
            array(\IntlDateFormatter::SHORT, null, null, '03.02.10 04:05', '2010-02-03 04:05:00 UTC'),
            array(\IntlDateFormatter::MEDIUM, null, null, '03.02.2010 04:05', '2010-02-03 04:05:00 UTC'),
            array(\IntlDateFormatter::LONG, null, null, '03. Februar 2010 04:05', '2010-02-03 04:05:00 UTC'),
            array(\IntlDateFormatter::FULL, null, null, 'Mittwoch, 03. Februar 2010 04:05', '2010-02-03 04:05:00 UTC'),
            array(\IntlDateFormatter::SHORT, \IntlDateFormatter::NONE, null, '03.02.10', '2010-02-03 00:00:00 UTC'),
            array(\IntlDateFormatter::MEDIUM, \IntlDateFormatter::NONE, null, '03.02.2010', '2010-02-03 00:00:00 UTC'),
            array(\IntlDateFormatter::LONG, \IntlDateFormatter::NONE, null, '03. Februar 2010', '2010-02-03 00:00:00 UTC'),
            array(\IntlDateFormatter::FULL, \IntlDateFormatter::NONE, null, 'Mittwoch, 03. Februar 2010', '2010-02-03 00:00:00 UTC'),
            array(null, \IntlDateFormatter::SHORT, null, '03.02.2010 04:05', '2010-02-03 04:05:00 UTC'),
            array(null, \IntlDateFormatter::MEDIUM, null, '03.02.2010 04:05:06', '2010-02-03 04:05:06 UTC'),
            array(null, \IntlDateFormatter::LONG, null, '03.02.2010 04:05:06 GMT', '2010-02-03 04:05:06 UTC'),
            // see below for extra test case for time format FULL
            array(\IntlDateFormatter::NONE, \IntlDateFormatter::SHORT, null, '04:05', '1970-01-01 04:05:00 UTC'),
            array(\IntlDateFormatter::NONE, \IntlDateFormatter::MEDIUM, null, '04:05:06', '1970-01-01 04:05:06 UTC'),
            array(\IntlDateFormatter::NONE, \IntlDateFormatter::LONG, null, '04:05:06 GMT', '1970-01-01 04:05:06 UTC'),
            array(null, null, 'yyyy-MM-dd HH:mm:00', '2010-02-03 04:05:00', '2010-02-03 04:05:00 UTC'),
            array(null, null, 'yyyy-MM-dd HH:mm', '2010-02-03 04:05', '2010-02-03 04:05:00 UTC'),
            array(null, null, 'yyyy-MM-dd HH', '2010-02-03 04', '2010-02-03 04:00:00 UTC'),
            array(null, null, 'yyyy-MM-dd', '2010-02-03', '2010-02-03 00:00:00 UTC'),
            array(null, null, 'yyyy-MM', '2010-02', '2010-02-01 00:00:00 UTC'),
            array(null, null, 'yyyy', '2010', '2010-01-01 00:00:00 UTC'),
            array(null, null, 'dd-MM-yyyy', '03-02-2010', '2010-02-03 00:00:00 UTC'),
            array(null, null, 'HH:mm:ss', '04:05:06', '1970-01-01 04:05:06 UTC'),
            array(null, null, 'HH:mm:00', '04:05:00', '1970-01-01 04:05:00 UTC'),
            array(null, null, 'HH:mm', '04:05', '1970-01-01 04:05:00 UTC'),
            array(null, null, 'HH', '04', '1970-01-01 04:00:00 UTC'),
        );
    }

    /**
     * @dataProvider dataProvider
     */
    public function testTransform($dateFormat, $timeFormat, $pattern, $output, $input)
    {
        $transformer = new DateTimeToLocalizedStringTransformer(
            'UTC',
            'UTC',
            $dateFormat,
            $timeFormat,
            \IntlDateFormatter::GREGORIAN,
            $pattern
        );

        $input = new \DateTime($input);

        $this->assertEquals($output, $transformer->transform($input));
    }

    public function testTransformFullTime()
    {
        $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::FULL);

        $this->assertEquals('03.02.2010 04:05:06 GMT', $transformer->transform($this->dateTime));
    }

    public function testTransformToDifferentLocale()
    {
        \Locale::setDefault('en_US');

        $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC');

        $this->assertEquals('Feb 3, 2010, 4:05 AM', $transformer->transform($this->dateTime));
    }

    public function testTransformEmpty()
    {
        $transformer = new DateTimeToLocalizedStringTransformer();

        $this->assertSame('', $transformer->transform(null));
    }

    public function testTransformWithDifferentTimezones()
    {
        $transformer = new DateTimeToLocalizedStringTransformer('America/New_York', 'Asia/Hong_Kong');

        $input = new \DateTime('2010-02-03 04:05:06 America/New_York');

        $dateTime = clone $input;
        $dateTime->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));

        $this->assertEquals($dateTime->format('d.m.Y H:i'), $transformer->transform($input));
    }

    public function testTransformWithDifferentPatterns()
    {
        $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::FULL, \IntlDateFormatter::FULL, \IntlDateFormatter::GREGORIAN, 'MM*yyyy*dd HH|mm|ss');

        $this->assertEquals('02*2010*03 04|05|06', $transformer->transform($this->dateTime));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testTransformRequiresValidDateTime()
    {
        $transformer = new DateTimeToLocalizedStringTransformer();
        $transformer->transform('2010-01-01');
    }

    public function testTransformWrapsIntlErrors()
    {
        $transformer = new DateTimeToLocalizedStringTransformer();

        // HOW TO REPRODUCE?

        //$this->setExpectedException('Symfony\Component\Form\Extension\Core\DataTransformer\Transdate_formationFailedException');

        //$transformer->transform(1.5);
    }

    /**
     * @dataProvider dataProvider
     */
    public function testReverseTransform($dateFormat, $timeFormat, $pattern, $input, $output)
    {
        $transformer = new DateTimeToLocalizedStringTransformer(
            'UTC',
            'UTC',
            $dateFormat,
            $timeFormat,
            \IntlDateFormatter::GREGORIAN,
            $pattern
        );

        $output = new \DateTime($output);

        $this->assertEquals($output, $transformer->reverseTransform($input));
    }

    public function testReverseTransformFullTime()
    {
        $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::FULL);

        $this->assertDateTimeEquals($this->dateTime, $transformer->reverseTransform('03.02.2010 04:05:06 GMT+00:00'));
    }

    public function testReverseTransformFromDifferentLocale()
    {
        \Locale::setDefault('en_US');

        $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC');

        $this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('Feb 3, 2010, 04:05 AM'));
    }

    public function testReverseTransformWithDifferentTimezones()
    {
        $transformer = new DateTimeToLocalizedStringTransformer('America/New_York', 'Asia/Hong_Kong');

        $dateTime = new \DateTime('2010-02-03 04:05:00 Asia/Hong_Kong');
        $dateTime->setTimezone(new \DateTimeZone('America/New_York'));

        $this->assertDateTimeEquals($dateTime, $transformer->reverseTransform('03.02.2010 04:05'));
    }

    public function testReverseTransformWithDifferentPatterns()
    {
        $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::FULL, \IntlDateFormatter::FULL, \IntlDateFormatter::GREGORIAN, 'MM*yyyy*dd HH|mm|ss');

        $this->assertDateTimeEquals($this->dateTime, $transformer->reverseTransform('02*2010*03 04|05|06'));
    }

    public function testReverseTransformEmpty()
    {
        $transformer = new DateTimeToLocalizedStringTransformer();

        $this->assertNull($transformer->reverseTransform(''));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformRequiresString()
    {
        $transformer = new DateTimeToLocalizedStringTransformer();
        $transformer->reverseTransform(12345);
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWrapsIntlErrors()
    {
        $transformer = new DateTimeToLocalizedStringTransformer();
        $transformer->reverseTransform('12345');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testValidateDateFormatOption()
    {
        new DateTimeToLocalizedStringTransformer(null, null, 'foobar');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testValidateTimeFormatOption()
    {
        new DateTimeToLocalizedStringTransformer(null, null, null, 'foobar');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformWithNonExistingDate()
    {
        $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::SHORT);

        $this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('31.04.10 04:05'));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException
     */
    public function testReverseTransformOutOfTimestampRange()
    {
        $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC');
        $transformer->reverseTransform('1789-07-14');
    }
}
PKyb�\ސ/���Tpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Extension\Core\View\ChoiceView;

class TimezoneTypeTest extends \Symfony\Component\Form\Test\TypeTestCase
{
    public function testTimezonesAreSelectable()
    {
        $form = $this->factory->create('timezone');
        $view = $form->createView();
        $choices = $view->vars['choices'];

        $this->assertArrayHasKey('Africa', $choices);
        $this->assertContains(new ChoiceView('Africa/Kinshasa', 'Africa/Kinshasa', 'Kinshasa'), $choices['Africa'], '', false, false);

        $this->assertArrayHasKey('America', $choices);
        $this->assertContains(new ChoiceView('America/New_York', 'America/New_York', 'New York'), $choices['America'], '', false, false);
    }
}
PKyb�\�(��__Tpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

class PasswordTypeTest extends \Symfony\Component\Form\Test\TypeTestCase
{
    public function testEmptyIfNotSubmitted()
    {
        $form = $this->factory->create('password');
        $form->setData('pAs5w0rd');
        $view = $form->createView();

        $this->assertSame('', $view->vars['value']);
    }

    public function testEmptyIfSubmitted()
    {
        $form = $this->factory->create('password');
        $form->submit('pAs5w0rd');
        $view = $form->createView();

        $this->assertSame('', $view->vars['value']);
    }

    public function testNotEmptyIfSubmittedAndNotAlwaysEmpty()
    {
        $form = $this->factory->create('password', null, array('always_empty' => false));
        $form->submit('pAs5w0rd');
        $view = $form->createView();

        $this->assertSame('pAs5w0rd', $view->vars['value']);
    }

    public function testNotTrimmed()
    {
        $form = $this->factory->create('password', null);
        $form->submit(' pAs5w0rd ');
        $data = $form->getData();

        $this->assertSame(' pAs5w0rd ', $data);
    }
}
PKzb�\�IJ��Tpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\CallbackTransformer;

class CheckboxTypeTest extends \Symfony\Component\Form\Test\TypeTestCase
{
    public function testDataIsFalseByDefault()
    {
        $form = $this->factory->create('checkbox');

        $this->assertFalse($form->getData());
        $this->assertFalse($form->getNormData());
        $this->assertNull($form->getViewData());
    }

    public function testPassValueToView()
    {
        $form = $this->factory->create('checkbox', null, array('value' => 'foobar'));
        $view = $form->createView();

        $this->assertEquals('foobar', $view->vars['value']);
    }

    public function testCheckedIfDataTrue()
    {
        $form = $this->factory->create('checkbox');
        $form->setData(true);
        $view = $form->createView();

        $this->assertTrue($view->vars['checked']);
    }

    public function testCheckedIfDataTrueWithEmptyValue()
    {
        $form = $this->factory->create('checkbox', null, array('value' => ''));
        $form->setData(true);
        $view = $form->createView();

        $this->assertTrue($view->vars['checked']);
    }

    public function testNotCheckedIfDataFalse()
    {
        $form = $this->factory->create('checkbox');
        $form->setData(false);
        $view = $form->createView();

        $this->assertFalse($view->vars['checked']);
    }

    public function testSubmitWithValueChecked()
    {
        $form = $this->factory->create('checkbox', null, array(
            'value' => 'foobar',
        ));
        $form->submit('foobar');

        $this->assertTrue($form->getData());
        $this->assertEquals('foobar', $form->getViewData());
    }

    public function testSubmitWithRandomValueChecked()
    {
        $form = $this->factory->create('checkbox', null, array(
            'value' => 'foobar',
        ));
        $form->submit('krixikraxi');

        $this->assertTrue($form->getData());
        $this->assertEquals('foobar', $form->getViewData());
    }

    public function testSubmitWithValueUnchecked()
    {
        $form = $this->factory->create('checkbox', null, array(
            'value' => 'foobar',
        ));
        $form->submit(null);

        $this->assertFalse($form->getData());
        $this->assertNull($form->getViewData());
    }

    public function testSubmitWithEmptyValueChecked()
    {
        $form = $this->factory->create('checkbox', null, array(
            'value' => '',
        ));
        $form->submit('');

        $this->assertTrue($form->getData());
        $this->assertSame('', $form->getViewData());
    }

    public function testSubmitWithEmptyValueUnchecked()
    {
        $form = $this->factory->create('checkbox', null, array(
            'value' => '',
        ));
        $form->submit(null);

        $this->assertFalse($form->getData());
        $this->assertNull($form->getViewData());
    }

    public function testSubmitWithEmptyValueAndFalseUnchecked()
    {
        $form = $this->factory->create('checkbox', null, array(
            'value' => '',
        ));
        $form->submit(false);

        $this->assertFalse($form->getData());
        $this->assertNull($form->getViewData());
    }

    public function testSubmitWithEmptyValueAndTrueChecked()
    {
        $form = $this->factory->create('checkbox', null, array(
            'value' => '',
        ));
        $form->submit(true);

        $this->assertTrue($form->getData());
        $this->assertSame('', $form->getViewData());
    }

    /**
     * @dataProvider provideCustomModelTransformerData
     */
    public function testCustomModelTransformer($data, $checked)
    {
        // present a binary status field as a checkbox
        $transformer = new CallbackTransformer(
            function ($value) {
                return 'checked' == $value;
            },
            function ($value) {
                return $value ? 'checked' : 'unchecked';
            }
        );

        $form = $this->factory->createBuilder('checkbox')
            ->addModelTransformer($transformer)
            ->getForm();

        $form->setData($data);
        $view = $form->createView();

        $this->assertSame($data, $form->getData());
        $this->assertSame($checked, $form->getNormData());
        $this->assertEquals($checked, $view->vars['checked']);
    }

    public function provideCustomModelTransformerData()
    {
        return array(
            array('checked', true),
            array('unchecked', false),
        );
    }
}
PKzb�\vzw�LLVpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Form;

class CollectionTypeTest extends \Symfony\Component\Form\Test\TypeTestCase
{
    public function testContainsNoChildByDefault()
    {
        $form = $this->factory->create('collection', null, array(
            'type' => 'text',
        ));

        $this->assertCount(0, $form);
    }

    public function testSetDataAdjustsSize()
    {
        $form = $this->factory->create('collection', null, array(
            'type' => 'text',
            'options' => array(
                'max_length' => 20,
            ),
        ));
        $form->setData(array('foo@foo.com', 'foo@bar.com'));

        $this->assertInstanceOf('Symfony\Component\Form\Form', $form[0]);
        $this->assertInstanceOf('Symfony\Component\Form\Form', $form[1]);
        $this->assertCount(2, $form);
        $this->assertEquals('foo@foo.com', $form[0]->getData());
        $this->assertEquals('foo@bar.com', $form[1]->getData());
        $this->assertEquals(20, $form[0]->getConfig()->getOption('max_length'));
        $this->assertEquals(20, $form[1]->getConfig()->getOption('max_length'));

        $form->setData(array('foo@baz.com'));
        $this->assertInstanceOf('Symfony\Component\Form\Form', $form[0]);
        $this->assertFalse(isset($form[1]));
        $this->assertCount(1, $form);
        $this->assertEquals('foo@baz.com', $form[0]->getData());
        $this->assertEquals(20, $form[0]->getConfig()->getOption('max_length'));
    }

    public function testThrowsExceptionIfObjectIsNotTraversable()
    {
        $form = $this->factory->create('collection', null, array(
            'type' => 'text',
        ));
        $this->setExpectedException('Symfony\Component\Form\Exception\UnexpectedTypeException');
        $form->setData(new \stdClass());
    }

    public function testNotResizedIfSubmittedWithMissingData()
    {
        $form = $this->factory->create('collection', null, array(
            'type' => 'text',
        ));
        $form->setData(array('foo@foo.com', 'bar@bar.com'));
        $form->submit(array('foo@bar.com'));

        $this->assertTrue($form->has('0'));
        $this->assertTrue($form->has('1'));
        $this->assertEquals('foo@bar.com', $form[0]->getData());
        $this->assertEquals('', $form[1]->getData());
    }

    public function testResizedDownIfSubmittedWithMissingDataAndAllowDelete()
    {
        $form = $this->factory->create('collection', null, array(
            'type' => 'text',
            'allow_delete' => true,
        ));
        $form->setData(array('foo@foo.com', 'bar@bar.com'));
        $form->submit(array('foo@foo.com'));

        $this->assertTrue($form->has('0'));
        $this->assertFalse($form->has('1'));
        $this->assertEquals('foo@foo.com', $form[0]->getData());
        $this->assertEquals(array('foo@foo.com'), $form->getData());
    }

    public function testNotResizedIfSubmittedWithExtraData()
    {
        $form = $this->factory->create('collection', null, array(
            'type' => 'text',
        ));
        $form->setData(array('foo@bar.com'));
        $form->submit(array('foo@foo.com', 'bar@bar.com'));

        $this->assertTrue($form->has('0'));
        $this->assertFalse($form->has('1'));
        $this->assertEquals('foo@foo.com', $form[0]->getData());
    }

    public function testResizedUpIfSubmittedWithExtraDataAndAllowAdd()
    {
        $form = $this->factory->create('collection', null, array(
            'type' => 'text',
            'allow_add' => true,
        ));
        $form->setData(array('foo@bar.com'));
        $form->submit(array('foo@bar.com', 'bar@bar.com'));

        $this->assertTrue($form->has('0'));
        $this->assertTrue($form->has('1'));
        $this->assertEquals('foo@bar.com', $form[0]->getData());
        $this->assertEquals('bar@bar.com', $form[1]->getData());
        $this->assertEquals(array('foo@bar.com', 'bar@bar.com'), $form->getData());
    }

    public function testAllowAddButNoPrototype()
    {
        $form = $this->factory->create('collection', null, array(
            'type'      => 'form',
            'allow_add' => true,
            'prototype' => false,
        ));

        $this->assertFalse($form->has('__name__'));
    }

    public function testPrototypeMultipartPropagation()
    {
        $form = $this->factory
            ->create('collection', null, array(
                'type'      => 'file',
                'allow_add' => true,
                'prototype' => true,
            ))
        ;

        $this->assertTrue($form->createView()->vars['multipart']);
    }

    public function testGetDataDoesNotContainsPrototypeNameBeforeDataAreSet()
    {
        $form = $this->factory->create('collection', array(), array(
            'type'      => 'file',
            'prototype' => true,
            'allow_add' => true,
        ));

        $data = $form->getData();
        $this->assertFalse(isset($data['__name__']));
    }

    public function testGetDataDoesNotContainsPrototypeNameAfterDataAreSet()
    {
        $form = $this->factory->create('collection', array(), array(
            'type'      => 'file',
            'allow_add' => true,
            'prototype' => true,
        ));

        $form->setData(array('foobar.png'));
        $data = $form->getData();
        $this->assertFalse(isset($data['__name__']));
    }

    public function testPrototypeNameOption()
    {
        $form = $this->factory->create('collection', null, array(
            'type'      => 'form',
            'prototype' => true,
            'allow_add' => true,
        ));

        $this->assertSame('__name__', $form->getConfig()->getAttribute('prototype')->getName(), '__name__ is the default');

        $form = $this->factory->create('collection', null, array(
            'type'           => 'form',
            'prototype'      => true,
            'allow_add'      => true,
            'prototype_name' => '__test__',
        ));

        $this->assertSame('__test__', $form->getConfig()->getAttribute('prototype')->getName());
    }

    public function testPrototypeDefaultLabel()
    {
        $form = $this->factory->create('collection', array(), array(
            'type'      => 'file',
            'allow_add' => true,
            'prototype' => true,
            'prototype_name' => '__test__',
        ));

        $this->assertSame('__test__label__', $form->createView()->vars['prototype']->vars['label']);
    }
}
PKzb�\�_*G��]pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypePerformanceTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Test\FormPerformanceTestCase;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ChoiceTypePerformanceTest extends FormPerformanceTestCase
{
    /**
     * This test case is realistic in collection forms where each
     * row contains the same choice field.
     *
     * @group benchmark
     */
    public function testSameChoiceFieldCreatedMultipleTimes()
    {
        $this->setMaxRunningTime(1);
        $choices = range(1, 300);

        for ($i = 0; $i < 100; ++$i) {
            $this->factory->create('choice', rand(1, 400), array(
                'choices' => $choices,
            ));
        }
    }
}
PKzb�\/����Qpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Intl\Util\IntlTestHelper;

class MoneyTypeTest extends TypeTestCase
{
    protected function setUp()
    {
        // we test against different locales, so we need the full
        // implementation
        IntlTestHelper::requireFullIntl($this);

        parent::setUp();
    }

    public function testPassMoneyPatternToView()
    {
        \Locale::setDefault('de_DE');

        $form = $this->factory->create('money');
        $view = $form->createView();

        $this->assertSame('{{ widget }} €', $view->vars['money_pattern']);
    }

    public function testMoneyPatternWorksForYen()
    {
        \Locale::setDefault('en_US');

        $form = $this->factory->create('money', null, array('currency' => 'JPY'));
        $view = $form->createView();
        $this->assertTrue((Boolean) strstr($view->vars['money_pattern'], '¥'));
    }

    // https://github.com/symfony/symfony/issues/5458
    public function testPassDifferentPatternsForDifferentCurrencies()
    {
        \Locale::setDefault('de_DE');

        $form1 = $this->factory->create('money', null, array('currency' => 'GBP'));
        $form2 = $this->factory->create('money', null, array('currency' => 'EUR'));
        $view1 = $form1->createView();
        $view2 = $form2->createView();

        $this->assertSame('{{ widget }} £', $view1->vars['money_pattern']);
        $this->assertSame('{{ widget }} €', $view2->vars['money_pattern']);
    }
}
PKzb�\�!]i00Tpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Extension\Core\View\ChoiceView;
use Symfony\Component\Intl\Util\IntlTestHelper;

class CurrencyTypeTest extends TypeTestCase
{
    protected function setUp()
    {
        IntlTestHelper::requireIntl($this);

        parent::setUp();
    }

    public function testCurrenciesAreSelectable()
    {
        $form = $this->factory->create('currency');
        $view = $form->createView();
        $choices = $view->vars['choices'];

        $this->assertContains(new ChoiceView('EUR', 'EUR', 'Euro'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('USD', 'USD', 'US Dollar'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('SIT', 'SIT', 'Slovenian Tolar'), $choices, '', false, false);
    }

}
PK{b�\x�=�t=t=Tpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\FormError;
use Symfony\Component\Intl\Util\IntlTestHelper;

class DateTimeTypeTest extends TypeTestCase
{
    protected function setUp()
    {
        IntlTestHelper::requireIntl($this);

        parent::setUp();
    }

    public function testSubmitDateTime()
    {
        $form = $this->factory->create('datetime', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'date_widget' => 'choice',
            'time_widget' => 'choice',
            'input' => 'datetime',
        ));

        $form->submit(array(
            'date' => array(
                'day' => '2',
                'month' => '6',
                'year' => '2010',
            ),
            'time' => array(
                'hour' => '3',
                'minute' => '4',
            ),
        ));

        $dateTime = new \DateTime('2010-06-02 03:04:00 UTC');

        $this->assertDateTimeEquals($dateTime, $form->getData());
    }

    public function testSubmitString()
    {
        $form = $this->factory->create('datetime', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'string',
            'date_widget' => 'choice',
            'time_widget' => 'choice',
        ));

        $form->submit(array(
            'date' => array(
                'day' => '2',
                'month' => '6',
                'year' => '2010',
            ),
            'time' => array(
                'hour' => '3',
                'minute' => '4',
            ),
        ));

        $this->assertEquals('2010-06-02 03:04:00', $form->getData());
    }

    public function testSubmitTimestamp()
    {
        $form = $this->factory->create('datetime', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'timestamp',
            'date_widget' => 'choice',
            'time_widget' => 'choice',
        ));

        $form->submit(array(
            'date' => array(
                'day' => '2',
                'month' => '6',
                'year' => '2010',
            ),
            'time' => array(
                'hour' => '3',
                'minute' => '4',
            ),
        ));

        $dateTime = new \DateTime('2010-06-02 03:04:00 UTC');

        $this->assertEquals($dateTime->format('U'), $form->getData());
    }

    public function testSubmitWithoutMinutes()
    {
        $form = $this->factory->create('datetime', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'date_widget' => 'choice',
            'time_widget' => 'choice',
            'input' => 'datetime',
            'with_minutes' => false,
        ));

        $form->setData(new \DateTime('2010-06-02 03:04:05 UTC'));

        $input = array(
            'date' => array(
                'day' => '2',
                'month' => '6',
                'year' => '2010',
            ),
            'time' => array(
                'hour' => '3',
            ),
        );

        $form->submit($input);

        $this->assertDateTimeEquals(new \DateTime('2010-06-02 03:00:00 UTC'), $form->getData());
    }

    public function testSubmitWithSeconds()
    {
        $form = $this->factory->create('datetime', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'date_widget' => 'choice',
            'time_widget' => 'choice',
            'input' => 'datetime',
            'with_seconds' => true,
        ));

        $form->setData(new \DateTime('2010-06-02 03:04:05 UTC'));

        $input = array(
            'date' => array(
                'day' => '2',
                'month' => '6',
                'year' => '2010',
            ),
            'time' => array(
                'hour' => '3',
                'minute' => '4',
                'second' => '5',
            ),
        );

        $form->submit($input);

        $this->assertDateTimeEquals(new \DateTime('2010-06-02 03:04:05 UTC'), $form->getData());
    }

    public function testSubmitDifferentTimezones()
    {
        $form = $this->factory->create('datetime', null, array(
            'model_timezone' => 'America/New_York',
            'view_timezone' => 'Pacific/Tahiti',
            'date_widget' => 'choice',
            'time_widget' => 'choice',
            'input' => 'string',
            'with_seconds' => true,
        ));

        $dateTime = new \DateTime('2010-06-02 03:04:05 Pacific/Tahiti');

        $form->submit(array(
            'date' => array(
                'day' => (int) $dateTime->format('d'),
                'month' => (int) $dateTime->format('m'),
                'year' => (int) $dateTime->format('Y'),
            ),
            'time' => array(
                'hour' => (int) $dateTime->format('H'),
                'minute' => (int) $dateTime->format('i'),
                'second' => (int) $dateTime->format('s'),
            ),
        ));

        $dateTime->setTimezone(new \DateTimeZone('America/New_York'));

        $this->assertEquals($dateTime->format('Y-m-d H:i:s'), $form->getData());
    }

    public function testSubmitDifferentTimezonesDateTime()
    {
        $form = $this->factory->create('datetime', null, array(
            'model_timezone' => 'America/New_York',
            'view_timezone' => 'Pacific/Tahiti',
            'widget' => 'single_text',
            'input' => 'datetime',
        ));

        $outputTime = new \DateTime('2010-06-02 03:04:00 Pacific/Tahiti');

        $form->submit('2010-06-02T03:04:00-10:00');

        $outputTime->setTimezone(new \DateTimeZone('America/New_York'));

        $this->assertDateTimeEquals($outputTime, $form->getData());
        $this->assertEquals('2010-06-02T03:04:00-10:00', $form->getViewData());
    }

    public function testSubmitStringSingleText()
    {
        $form = $this->factory->create('datetime', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'string',
            'widget' => 'single_text',
        ));

        $form->submit('2010-06-02T03:04:00Z');

        $this->assertEquals('2010-06-02 03:04:00', $form->getData());
        $this->assertEquals('2010-06-02T03:04:00Z', $form->getViewData());
    }

    public function testSubmitStringSingleTextWithSeconds()
    {
        $form = $this->factory->create('datetime', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'string',
            'widget' => 'single_text',
            'with_seconds' => true,
        ));

        $form->submit('2010-06-02T03:04:05Z');

        $this->assertEquals('2010-06-02 03:04:05', $form->getData());
        $this->assertEquals('2010-06-02T03:04:05Z', $form->getViewData());
    }

    public function testSubmitDifferentPattern()
    {
        $form = $this->factory->create('datetime', null, array(
            'date_format' => 'MM*yyyy*dd',
            'date_widget' => 'single_text',
            'time_widget' => 'single_text',
            'input' => 'datetime',
        ));

        $dateTime = new \DateTime('2010-06-02 03:04');

        $form->submit(array(
            'date' => '06*2010*02',
            'time' => '03:04',
        ));

        $this->assertDateTimeEquals($dateTime, $form->getData());
    }

    // Bug fix
    public function testInitializeWithDateTime()
    {
        // Throws an exception if "data_class" option is not explicitly set
        // to null in the type
        $this->factory->create('datetime', new \DateTime());
    }

    public function testSingleTextWidgetShouldUseTheRightInputType()
    {
        $form = $this->factory->create('datetime', null, array(
            'widget' => 'single_text',
        ));

        $view = $form->createView();
        $this->assertEquals('datetime', $view->vars['type']);
    }

    public function testPassDefaultEmptyValueToViewIfNotRequired()
    {
        $form = $this->factory->create('datetime', null, array(
            'required' => false,
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertSame('', $view['date']['year']->vars['empty_value']);
        $this->assertSame('', $view['date']['month']->vars['empty_value']);
        $this->assertSame('', $view['date']['day']->vars['empty_value']);
        $this->assertSame('', $view['time']['hour']->vars['empty_value']);
        $this->assertSame('', $view['time']['minute']->vars['empty_value']);
        $this->assertSame('', $view['time']['second']->vars['empty_value']);
    }

    public function testPassNoEmptyValueToViewIfRequired()
    {
        $form = $this->factory->create('datetime', null, array(
            'required' => true,
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertNull($view['date']['year']->vars['empty_value']);
        $this->assertNull($view['date']['month']->vars['empty_value']);
        $this->assertNull($view['date']['day']->vars['empty_value']);
        $this->assertNull($view['time']['hour']->vars['empty_value']);
        $this->assertNull($view['time']['minute']->vars['empty_value']);
        $this->assertNull($view['time']['second']->vars['empty_value']);
    }

    public function testPassEmptyValueAsString()
    {
        $form = $this->factory->create('datetime', null, array(
            'empty_value' => 'Empty',
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertSame('Empty', $view['date']['year']->vars['empty_value']);
        $this->assertSame('Empty', $view['date']['month']->vars['empty_value']);
        $this->assertSame('Empty', $view['date']['day']->vars['empty_value']);
        $this->assertSame('Empty', $view['time']['hour']->vars['empty_value']);
        $this->assertSame('Empty', $view['time']['minute']->vars['empty_value']);
        $this->assertSame('Empty', $view['time']['second']->vars['empty_value']);
    }

    public function testPassEmptyValueAsArray()
    {
        $form = $this->factory->create('datetime', null, array(
            'empty_value' => array(
                'year' => 'Empty year',
                'month' => 'Empty month',
                'day' => 'Empty day',
                'hour' => 'Empty hour',
                'minute' => 'Empty minute',
                'second' => 'Empty second',
            ),
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertSame('Empty year', $view['date']['year']->vars['empty_value']);
        $this->assertSame('Empty month', $view['date']['month']->vars['empty_value']);
        $this->assertSame('Empty day', $view['date']['day']->vars['empty_value']);
        $this->assertSame('Empty hour', $view['time']['hour']->vars['empty_value']);
        $this->assertSame('Empty minute', $view['time']['minute']->vars['empty_value']);
        $this->assertSame('Empty second', $view['time']['second']->vars['empty_value']);
    }

    public function testPassEmptyValueAsPartialArrayAddEmptyIfNotRequired()
    {
        $form = $this->factory->create('datetime', null, array(
            'required' => false,
            'empty_value' => array(
                'year' => 'Empty year',
                'day' => 'Empty day',
                'hour' => 'Empty hour',
                'second' => 'Empty second',
            ),
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertSame('Empty year', $view['date']['year']->vars['empty_value']);
        $this->assertSame('', $view['date']['month']->vars['empty_value']);
        $this->assertSame('Empty day', $view['date']['day']->vars['empty_value']);
        $this->assertSame('Empty hour', $view['time']['hour']->vars['empty_value']);
        $this->assertSame('', $view['time']['minute']->vars['empty_value']);
        $this->assertSame('Empty second', $view['time']['second']->vars['empty_value']);
    }

    public function testPassEmptyValueAsPartialArrayAddNullIfRequired()
    {
        $form = $this->factory->create('datetime', null, array(
            'required' => true,
            'empty_value' => array(
                'year' => 'Empty year',
                'day' => 'Empty day',
                'hour' => 'Empty hour',
                'second' => 'Empty second',
            ),
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertSame('Empty year', $view['date']['year']->vars['empty_value']);
        $this->assertNull($view['date']['month']->vars['empty_value']);
        $this->assertSame('Empty day', $view['date']['day']->vars['empty_value']);
        $this->assertSame('Empty hour', $view['time']['hour']->vars['empty_value']);
        $this->assertNull($view['time']['minute']->vars['empty_value']);
        $this->assertSame('Empty second', $view['time']['second']->vars['empty_value']);
    }

    public function testPassHtml5TypeIfSingleTextAndHtml5Format()
    {
        $form = $this->factory->create('datetime', null, array(
            'widget' => 'single_text',
        ));

        $view = $form->createView();
        $this->assertSame('datetime', $view->vars['type']);
    }

    public function testDontPassHtml5TypeIfNotHtml5Format()
    {
        $form = $this->factory->create('datetime', null, array(
            'widget' => 'single_text',
            'format' => 'yyyy-MM-dd HH:mm',
        ));

        $view = $form->createView();
        $this->assertFalse(isset($view->vars['type']));
    }

    public function testDontPassHtml5TypeIfNotSingleText()
    {
        $form = $this->factory->create('datetime', null, array(
            'widget' => 'text',
        ));

        $view = $form->createView();
        $this->assertFalse(isset($view->vars['type']));
    }

    public function testDateTypeChoiceErrorsBubbleUp()
    {
        $error = new FormError('Invalid!');
        $form = $this->factory->create('datetime', null);

        $form['date']->addError($error);

        $this->assertSame(array(), $form['date']->getErrors());
        $this->assertSame(array($error), $form->getErrors());
    }

    public function testDateTypeSingleTextErrorsBubbleUp()
    {
        $error = new FormError('Invalid!');
        $form = $this->factory->create('datetime', null, array(
            'date_widget' => 'single_text'
        ));

        $form['date']->addError($error);

        $this->assertSame(array(), $form['date']->getErrors());
        $this->assertSame(array($error), $form->getErrors());
    }

    public function testTimeTypeChoiceErrorsBubbleUp()
    {
        $error = new FormError('Invalid!');
        $form = $this->factory->create('datetime', null);

        $form['time']->addError($error);

        $this->assertSame(array(), $form['time']->getErrors());
        $this->assertSame(array($error), $form->getErrors());
    }

    public function testTimeTypeSingleTextErrorsBubbleUp()
    {
        $error = new FormError('Invalid!');
        $form = $this->factory->create('datetime', null, array(
            'time_widget' => 'single_text'
        ));

        $form['time']->addError($error);

        $this->assertSame(array(), $form['time']->getErrors());
        $this->assertSame(array($error), $form->getErrors());
    }

}
PK{b�\�ñI��Tpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

class RepeatedTypeTest extends \Symfony\Component\Form\Test\TypeTestCase
{
    protected $form;

    protected function setUp()
    {
        parent::setUp();

        $this->form = $this->factory->create('repeated', null, array(
            'type' => 'text',
        ));
        $this->form->setData(null);
    }

    public function testSetData()
    {
        $this->form->setData('foobar');

        $this->assertEquals('foobar', $this->form['first']->getData());
        $this->assertEquals('foobar', $this->form['second']->getData());
    }

    public function testSetOptions()
    {
        $form = $this->factory->create('repeated', null, array(
            'type'    => 'text',
            'options' => array('label' => 'Global'),
        ));

        $this->assertEquals('Global', $form['first']->getConfig()->getOption('label'));
        $this->assertEquals('Global', $form['second']->getConfig()->getOption('label'));
        $this->assertTrue($form['first']->isRequired());
        $this->assertTrue($form['second']->isRequired());
    }

    public function testSetOptionsPerChild()
    {
        $form = $this->factory->create('repeated', null, array(
            // the global required value cannot be overridden
            'type'           => 'text',
            'first_options'  => array('label' => 'Test', 'required' => false),
            'second_options' => array('label' => 'Test2')
        ));

        $this->assertEquals('Test', $form['first']->getConfig()->getOption('label'));
        $this->assertEquals('Test2', $form['second']->getConfig()->getOption('label'));
        $this->assertTrue($form['first']->isRequired());
        $this->assertTrue($form['second']->isRequired());
    }

    public function testSetRequired()
    {
        $form = $this->factory->create('repeated', null, array(
            'required' => false,
            'type'     => 'text',
        ));

        $this->assertFalse($form['first']->isRequired());
        $this->assertFalse($form['second']->isRequired());
    }

    public function testSetErrorBubblingToTrue()
    {
        $form = $this->factory->create('repeated', null, array(
            'error_bubbling' => true,
        ));

        $this->assertTrue($form->getConfig()->getOption('error_bubbling'));
        $this->assertTrue($form['first']->getConfig()->getOption('error_bubbling'));
        $this->assertTrue($form['second']->getConfig()->getOption('error_bubbling'));
    }

    public function testSetErrorBubblingToFalse()
    {
        $form = $this->factory->create('repeated', null, array(
            'error_bubbling' => false,
        ));

        $this->assertFalse($form->getConfig()->getOption('error_bubbling'));
        $this->assertFalse($form['first']->getConfig()->getOption('error_bubbling'));
        $this->assertFalse($form['second']->getConfig()->getOption('error_bubbling'));
    }

    public function testSetErrorBubblingIndividually()
    {
        $form = $this->factory->create('repeated', null, array(
            'error_bubbling' => true,
            'options' => array('error_bubbling' => false),
            'second_options' => array('error_bubbling' => true),
        ));

        $this->assertTrue($form->getConfig()->getOption('error_bubbling'));
        $this->assertFalse($form['first']->getConfig()->getOption('error_bubbling'));
        $this->assertTrue($form['second']->getConfig()->getOption('error_bubbling'));
    }

    public function testSetOptionsPerChildAndOverwrite()
    {
        $form = $this->factory->create('repeated', null, array(
            'type'           => 'text',
            'options'        => array('label' => 'Label'),
            'second_options' => array('label' => 'Second label')
        ));

        $this->assertEquals('Label', $form['first']->getConfig()->getOption('label'));
        $this->assertEquals('Second label', $form['second']->getConfig()->getOption('label'));
        $this->assertTrue($form['first']->isRequired());
        $this->assertTrue($form['second']->isRequired());
    }

    public function testSubmitUnequal()
    {
        $input = array('first' => 'foo', 'second' => 'bar');

        $this->form->submit($input);

        $this->assertEquals('foo', $this->form['first']->getViewData());
        $this->assertEquals('bar', $this->form['second']->getViewData());
        $this->assertFalse($this->form->isSynchronized());
        $this->assertEquals($input, $this->form->getViewData());
        $this->assertNull($this->form->getData());
    }

    public function testSubmitEqual()
    {
        $input = array('first' => 'foo', 'second' => 'foo');

        $this->form->submit($input);

        $this->assertEquals('foo', $this->form['first']->getViewData());
        $this->assertEquals('foo', $this->form['second']->getViewData());
        $this->assertTrue($this->form->isSynchronized());
        $this->assertEquals($input, $this->form->getViewData());
        $this->assertEquals('foo', $this->form->getData());
    }
}
PK{b�\k�ƅ��Spear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Intl\Util\IntlTestHelper;

class IntegerTypeTest extends TypeTestCase
{
    protected function setUp()
    {
        IntlTestHelper::requireIntl($this);

        parent::setUp();
    }

    public function testSubmitCastsToInteger()
    {
        $form = $this->factory->create('integer');

        $form->submit('1.678');

        $this->assertSame(1, $form->getData());
        $this->assertSame('1', $form->getViewData());
    }
}
PK{b�\�jGgJgJPpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\PropertyAccess\PropertyPath;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Tests\Fixtures\Author;
use Symfony\Component\Form\Tests\Fixtures\FixedDataTransformer;
use Symfony\Component\Form\FormError;

class FormTest_AuthorWithoutRefSetter
{
    protected $reference;

    protected $referenceCopy;

    public function __construct($reference)
    {
        $this->reference = $reference;
        $this->referenceCopy = $reference;
    }

    // The returned object should be modified by reference without having
    // to provide a setReference() method
    public function getReference()
    {
        return $this->reference;
    }

    // The returned object is a copy, so setReferenceCopy() must be used
    // to update it
    public function getReferenceCopy()
    {
        return is_object($this->referenceCopy) ? clone $this->referenceCopy : $this->referenceCopy;
    }

    public function setReferenceCopy($reference)
    {
        $this->referenceCopy = $reference;
    }
}

class FormTypeTest extends BaseTypeTest
{
    public function testCreateFormInstances()
    {
        $this->assertInstanceOf('Symfony\Component\Form\Form', $this->factory->create('form'));
    }

    public function testPassRequiredAsOption()
    {
        $form = $this->factory->create('form', null, array('required' => false));

        $this->assertFalse($form->isRequired());

        $form = $this->factory->create('form', null, array('required' => true));

        $this->assertTrue($form->isRequired());
    }

    public function testSubmittedDataIsTrimmedBeforeTransforming()
    {
        $form = $this->factory->createBuilder('form')
            ->addViewTransformer(new FixedDataTransformer(array(
                null => '',
                'reverse[a]' => 'a',
            )))
            ->setCompound(false)
            ->getForm();

        $form->submit(' a ');

        $this->assertEquals('a', $form->getViewData());
        $this->assertEquals('reverse[a]', $form->getData());
    }

    public function testSubmittedDataIsNotTrimmedBeforeTransformingIfNoTrimming()
    {
        $form = $this->factory->createBuilder('form', null, array('trim' => false))
            ->addViewTransformer(new FixedDataTransformer(array(
                null => '',
                'reverse[ a ]' => ' a ',
            )))
            ->setCompound(false)
            ->getForm();

        $form->submit(' a ');

        $this->assertEquals(' a ', $form->getViewData());
        $this->assertEquals('reverse[ a ]', $form->getData());
    }

    public function testNonReadOnlyFormWithReadOnlyParentIsReadOnly()
    {
        $view = $this->factory->createNamedBuilder('parent', 'form', null, array('read_only' => true))
            ->add('child', 'form')
            ->getForm()
            ->createView();

        $this->assertTrue($view['child']->vars['read_only']);
    }

    public function testReadOnlyFormWithNonReadOnlyParentIsReadOnly()
    {
        $view = $this->factory->createNamedBuilder('parent', 'form')
            ->add('child', 'form', array('read_only' => true))
            ->getForm()
            ->createView();

        $this->assertTrue($view['child']->vars['read_only']);
    }

    public function testNonReadOnlyFormWithNonReadOnlyParentIsNotReadOnly()
    {
        $view = $this->factory->createNamedBuilder('parent', 'form')
                ->add('child', 'form')
                ->getForm()
                ->createView();

        $this->assertFalse($view['child']->vars['read_only']);
    }

    public function testPassMaxLengthToView()
    {
        $form = $this->factory->create('form', null, array('max_length' => 10));
        $view = $form->createView();

        $this->assertSame(10, $view->vars['max_length']);
    }

    public function testSubmitWithEmptyDataCreatesObjectIfClassAvailable()
    {
        $builder = $this->factory->createBuilder('form', null, array(
            'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author',
            'required' => false,
        ));
        $builder->add('firstName', 'text');
        $builder->add('lastName', 'text');
        $form = $builder->getForm();

        $form->setData(null);
        // partially empty, still an object is created
        $form->submit(array('firstName' => 'Bernhard', 'lastName' => ''));

        $author = new Author();
        $author->firstName = 'Bernhard';
        $author->setLastName('');

        $this->assertEquals($author, $form->getData());
    }

    public function testSubmitWithEmptyDataCreatesObjectIfInitiallySubmittedWithObject()
    {
        $builder = $this->factory->createBuilder('form', null, array(
            // data class is inferred from the passed object
            'data' => new Author(),
            'required' => false,
        ));
        $builder->add('firstName', 'text');
        $builder->add('lastName', 'text');
        $form = $builder->getForm();

        $form->setData(null);
        // partially empty, still an object is created
        $form->submit(array('firstName' => 'Bernhard', 'lastName' => ''));

        $author = new Author();
        $author->firstName = 'Bernhard';
        $author->setLastName('');

        $this->assertEquals($author, $form->getData());
    }

    public function testSubmitWithEmptyDataCreatesArrayIfDataClassIsNull()
    {
        $builder = $this->factory->createBuilder('form', null, array(
            'data_class' => null,
            'required' => false,
        ));
        $builder->add('firstName', 'text');
        $form = $builder->getForm();

        $form->setData(null);
        $form->submit(array('firstName' => 'Bernhard'));

        $this->assertSame(array('firstName' => 'Bernhard'), $form->getData());
    }

    public function testSubmitEmptyWithEmptyDataCreatesNoObjectIfNotRequired()
    {
        $builder = $this->factory->createBuilder('form', null, array(
            'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author',
            'required' => false,
        ));
        $builder->add('firstName', 'text');
        $builder->add('lastName', 'text');
        $form = $builder->getForm();

        $form->setData(null);
        $form->submit(array('firstName' => '', 'lastName' => ''));

        $this->assertNull($form->getData());
    }

    public function testSubmitEmptyWithEmptyDataCreatesObjectIfRequired()
    {
        $builder = $this->factory->createBuilder('form', null, array(
            'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author',
            'required' => true,
        ));
        $builder->add('firstName', 'text');
        $builder->add('lastName', 'text');
        $form = $builder->getForm();

        $form->setData(null);
        $form->submit(array('firstName' => '', 'lastName' => ''));

        $this->assertEquals(new Author(), $form->getData());
    }

    /*
     * We need something to write the field values into
     */
    public function testSubmitWithEmptyDataStoresArrayIfNoClassAvailable()
    {
        $form = $this->factory->createBuilder('form')
            ->add('firstName', 'text')
            ->getForm();

        $form->setData(null);
        $form->submit(array('firstName' => 'Bernhard'));

        $this->assertSame(array('firstName' => 'Bernhard'), $form->getData());
    }

    public function testSubmitWithEmptyDataPassesEmptyStringToTransformerIfNotCompound()
    {
        $form = $this->factory->createBuilder('form')
            ->addViewTransformer(new FixedDataTransformer(array(
                // required for the initial, internal setData(null)
                null => 'null',
                // required to test that submit(null) is converted to ''
                'empty' => '',
            )))
            ->setCompound(false)
            ->getForm();

        $form->submit(null);

        $this->assertSame('empty', $form->getData());
    }

    public function testSubmitWithEmptyDataUsesEmptyDataOption()
    {
        $author = new Author();

        $builder = $this->factory->createBuilder('form', null, array(
            'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author',
            'empty_data' => $author,
        ));
        $builder->add('firstName', 'text');
        $form = $builder->getForm();

        $form->submit(array('firstName' => 'Bernhard'));

        $this->assertSame($author, $form->getData());
        $this->assertEquals('Bernhard', $author->firstName);
    }

    public function provideZeros()
    {
        return array(
            array(0, '0'),
            array('0', '0'),
            array('00000', '00000'),
        );
    }

    /**
     * @dataProvider provideZeros
     * @see https://github.com/symfony/symfony/issues/1986
     */
    public function testSetDataThroughParamsWithZero($data, $dataAsString)
    {
        $form = $this->factory->create('form', null, array(
            'data' => $data,
            'compound' => false,
        ));
        $view = $form->createView();

        $this->assertFalse($form->isEmpty());

        $this->assertSame($dataAsString, $view->vars['value']);
        $this->assertSame($dataAsString, $form->getData());
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testAttributesException()
    {
        $this->factory->create('form', null, array('attr' => ''));
    }

    public function testNameCanBeEmptyString()
    {
        $form = $this->factory->createNamed('', 'form');

        $this->assertEquals('', $form->getName());
    }

    public function testSubformDoesntCallSetters()
    {
        $author = new FormTest_AuthorWithoutRefSetter(new Author());

        $builder = $this->factory->createBuilder('form', $author);
        $builder->add('reference', 'form', array(
            'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author',
        ));
        $builder->get('reference')->add('firstName', 'text');
        $form = $builder->getForm();

        $form->submit(array(
            // reference has a getter, but not setter
            'reference' => array(
                'firstName' => 'Foo',
            )
        ));

        $this->assertEquals('Foo', $author->getReference()->firstName);
    }

    public function testSubformCallsSettersIfTheObjectChanged()
    {
        // no reference
        $author = new FormTest_AuthorWithoutRefSetter(null);
        $newReference = new Author();

        $builder = $this->factory->createBuilder('form', $author);
        $builder->add('referenceCopy', 'form', array(
            'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author',
        ));
        $builder->get('referenceCopy')->add('firstName', 'text');
        $form = $builder->getForm();

        $form['referenceCopy']->setData($newReference); // new author object

        $form->submit(array(
        // referenceCopy has a getter that returns a copy
            'referenceCopy' => array(
                'firstName' => 'Foo',
        )
        ));

        $this->assertEquals('Foo', $author->getReferenceCopy()->firstName);
    }

    public function testSubformCallsSettersIfByReferenceIsFalse()
    {
        $author = new FormTest_AuthorWithoutRefSetter(new Author());

        $builder = $this->factory->createBuilder('form', $author);
        $builder->add('referenceCopy', 'form', array(
            'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author',
            'by_reference' => false
        ));
        $builder->get('referenceCopy')->add('firstName', 'text');
        $form = $builder->getForm();

        $form->submit(array(
            // referenceCopy has a getter that returns a copy
            'referenceCopy' => array(
                'firstName' => 'Foo',
            )
        ));

        // firstName can only be updated if setReferenceCopy() was called
        $this->assertEquals('Foo', $author->getReferenceCopy()->firstName);
    }

    public function testSubformCallsSettersIfReferenceIsScalar()
    {
        $author = new FormTest_AuthorWithoutRefSetter('scalar');

        $builder = $this->factory->createBuilder('form', $author);
        $builder->add('referenceCopy', 'form');
        $builder->get('referenceCopy')->addViewTransformer(new CallbackTransformer(
            function () {},
            function ($value) { // reverseTransform

                return 'foobar';
            }
        ));
        $form = $builder->getForm();

        $form->submit(array(
            'referenceCopy' => array(), // doesn't matter actually
        ));

        // firstName can only be updated if setReferenceCopy() was called
        $this->assertEquals('foobar', $author->getReferenceCopy());
    }

    public function testSubformAlwaysInsertsIntoArrays()
    {
        $ref1 = new Author();
        $ref2 = new Author();
        $author = array('referenceCopy' => $ref1);

        $builder = $this->factory->createBuilder('form');
        $builder->setData($author);
        $builder->add('referenceCopy', 'form');
        $builder->get('referenceCopy')->addViewTransformer(new CallbackTransformer(
            function () {},
            function ($value) use ($ref2) { // reverseTransform

                return $ref2;
            }
        ));
        $form = $builder->getForm();

        $form->submit(array(
            'referenceCopy' => array('a' => 'b'), // doesn't matter actually
        ));

        // the new reference was inserted into the array
        $author = $form->getData();
        $this->assertSame($ref2, $author['referenceCopy']);
    }

    public function testPassMultipartTrueIfAnyChildIsMultipartToView()
    {
        $view = $this->factory->createBuilder('form')
            ->add('foo', 'text')
            ->add('bar', 'file')
            ->getForm()
            ->createView();

        $this->assertTrue($view->vars['multipart']);
    }

    public function testViewIsNotRenderedByDefault()
    {
        $view = $this->factory->createBuilder('form')
                ->add('foo', 'form')
                ->getForm()
                ->createView();

        $this->assertFalse($view->isRendered());
    }

    public function testErrorBubblingIfCompound()
    {
        $form = $this->factory->create('form', null, array(
            'compound' => true,
        ));

        $this->assertTrue($form->getConfig()->getErrorBubbling());
    }

    public function testNoErrorBubblingIfNotCompound()
    {
        $form = $this->factory->create('form', null, array(
            'compound' => false,
        ));

        $this->assertFalse($form->getConfig()->getErrorBubbling());
    }

    public function testOverrideErrorBubbling()
    {
        $form = $this->factory->create('form', null, array(
            'compound' => false,
            'error_bubbling' => true,
        ));

        $this->assertTrue($form->getConfig()->getErrorBubbling());
    }

    public function testPropertyPath()
    {
        $form = $this->factory->create('form', null, array(
            'property_path' => 'foo',
        ));

        $this->assertEquals(new PropertyPath('foo'), $form->getPropertyPath());
        $this->assertTrue($form->getConfig()->getMapped());
    }

    public function testPropertyPathNullImpliesDefault()
    {
        $form = $this->factory->createNamed('name', 'form', null, array(
            'property_path' => null,
        ));

        $this->assertEquals(new PropertyPath('name'), $form->getPropertyPath());
        $this->assertTrue($form->getConfig()->getMapped());
    }

    public function testNotMapped()
    {
        $form = $this->factory->create('form', null, array(
            'property_path' => 'foo',
            'mapped' => false,
        ));

        $this->assertEquals(new PropertyPath('foo'), $form->getPropertyPath());
        $this->assertFalse($form->getConfig()->getMapped());
    }

    public function testViewValidNotSubmitted()
    {
        $form = $this->factory->create('form');
        $view = $form->createView();
        $this->assertTrue($view->vars['valid']);
    }

    public function testViewNotValidSubmitted()
    {
        $form = $this->factory->create('form');
        $form->submit(array());
        $form->addError(new FormError('An error'));
        $view = $form->createView();
        $this->assertFalse($view->vars['valid']);
    }

    public function testViewSubmittedNotSubmitted()
    {
        $form = $this->factory->create('form');
        $view = $form->createView();
        $this->assertFalse($view->vars['submitted']);
    }

    public function testViewSubmittedSubmitted()
    {
        $form = $this->factory->create('form');
        $form->submit(array());
        $view = $form->createView();
        $this->assertTrue($view->vars['submitted']);
    }

    public function testDataOptionSupersedesSetDataCalls()
    {
        $form = $this->factory->create('form', null, array(
            'data' => 'default',
            'compound' => false,
        ));

        $form->setData('foobar');

        $this->assertSame('default', $form->getData());
    }

    public function testDataOptionSupersedesSetDataCallsIfNull()
    {
        $form = $this->factory->create('form', null, array(
            'data' => null,
            'compound' => false,
        ));

        $form->setData('foobar');

        $this->assertNull($form->getData());
    }

    public function testNormDataIsPassedToView()
    {
        $view = $this->factory->createBuilder('form')
            ->addViewTransformer(new FixedDataTransformer(array(
                'foo' => 'bar',
            )))
            ->setData('foo')
            ->getForm()
            ->createView();

        $this->assertSame('foo', $view->vars['data']);
        $this->assertSame('bar', $view->vars['value']);
    }

    // https://github.com/symfony/symfony/issues/6862
    public function testPassZeroLabelToView()
    {
        $view = $this->factory->create('form', null, array(
                'label' => '0'
            ))
            ->createView();

        $this->assertSame('0', $view->vars['label']);
    }

    public function testCanGetErrorsWhenButtonInForm()
    {
        $builder = $this->factory->createBuilder('form', null, array(
            'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author',
            'required' => false,
        ));
        $builder->add('foo', 'text');
        $builder->add('submit', 'submit');
        $form = $builder->getForm();

        //This method should not throw a Fatal Error Exception.
        $form->getErrorsAsString();
    }

    protected function getTestedType()
    {
        return 'form';
    }
}
PK|b�\��W@@Tpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Extension\Core\View\ChoiceView;
use Symfony\Component\Intl\Util\IntlTestHelper;

class LanguageTypeTest extends TypeTestCase
{
    protected function setUp()
    {
        IntlTestHelper::requireIntl($this);

        parent::setUp();
    }

    public function testCountriesAreSelectable()
    {
        $form = $this->factory->create('language');
        $view = $form->createView();
        $choices = $view->vars['choices'];

        $this->assertContains(new ChoiceView('en', 'en', 'English'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('en_GB', 'en_GB', 'British English'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('en_US', 'en_US', 'U.S. English'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('fr', 'fr', 'French'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('my', 'my', 'Burmese'), $choices, '', false, false);
    }

    public function testMultipleLanguagesIsNotIncluded()
    {
        $form = $this->factory->create('language', 'language');
        $view = $form->createView();
        $choices = $view->vars['choices'];

        $this->assertNotContains(new ChoiceView('mul', 'mul', 'Mehrsprachig'), $choices, '', false, false);
    }
}
PK|b�\�'�\�\Ppear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Extension\Core\View\ChoiceView;
use Symfony\Component\Form\FormError;
use Symfony\Component\Intl\Util\IntlTestHelper;

class DateTypeTest extends TypeTestCase
{
    protected function setUp()
    {
        parent::setUp();

        // we test against "de_AT", so we need the full implementation
        IntlTestHelper::requireFullIntl($this);

        \Locale::setDefault('de_AT');
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testInvalidWidgetOption()
    {
        $this->factory->create('date', null, array(
            'widget' => 'fake_widget',
        ));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testInvalidInputOption()
    {
        $this->factory->create('date', null, array(
            'input' => 'fake_input',
        ));
    }

    public function testSubmitFromSingleTextDateTimeWithDefaultFormat()
    {
        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'single_text',
            'input' => 'datetime',
        ));

        $form->submit('2010-06-02');

        $this->assertDateTimeEquals(new \DateTime('2010-06-02 UTC'), $form->getData());
        $this->assertEquals('2010-06-02', $form->getViewData());
    }

    public function testSubmitFromSingleTextDateTime()
    {
        $form = $this->factory->create('date', null, array(
            'format' => \IntlDateFormatter::MEDIUM,
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'single_text',
            'input' => 'datetime',
        ));

        $form->submit('2.6.2010');

        $this->assertDateTimeEquals(new \DateTime('2010-06-02 UTC'), $form->getData());
        $this->assertEquals('02.06.2010', $form->getViewData());
    }

    public function testSubmitFromSingleTextString()
    {
        $form = $this->factory->create('date', null, array(
            'format' => \IntlDateFormatter::MEDIUM,
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'single_text',
            'input' => 'string',
        ));

        $form->submit('2.6.2010');

        $this->assertEquals('2010-06-02', $form->getData());
        $this->assertEquals('02.06.2010', $form->getViewData());
    }

    public function testSubmitFromSingleTextTimestamp()
    {
        $form = $this->factory->create('date', null, array(
            'format' => \IntlDateFormatter::MEDIUM,
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'single_text',
            'input' => 'timestamp',
        ));

        $form->submit('2.6.2010');

        $dateTime = new \DateTime('2010-06-02 UTC');

        $this->assertEquals($dateTime->format('U'), $form->getData());
        $this->assertEquals('02.06.2010', $form->getViewData());
    }

    public function testSubmitFromSingleTextRaw()
    {
        $form = $this->factory->create('date', null, array(
            'format' => \IntlDateFormatter::MEDIUM,
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'single_text',
            'input' => 'array',
        ));

        $form->submit('2.6.2010');

        $output = array(
            'day' => '2',
            'month' => '6',
            'year' => '2010',
        );

        $this->assertEquals($output, $form->getData());
        $this->assertEquals('02.06.2010', $form->getViewData());
    }

    public function testSubmitFromText()
    {
        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'text',
        ));

        $text = array(
            'day' => '2',
            'month' => '6',
            'year' => '2010',
        );

        $form->submit($text);

        $dateTime = new \DateTime('2010-06-02 UTC');

        $this->assertDateTimeEquals($dateTime, $form->getData());
        $this->assertEquals($text, $form->getViewData());
    }

    public function testSubmitFromChoice()
    {
        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'choice',
        ));

        $text = array(
            'day' => '2',
            'month' => '6',
            'year' => '2010',
        );

        $form->submit($text);

        $dateTime = new \DateTime('2010-06-02 UTC');

        $this->assertDateTimeEquals($dateTime, $form->getData());
        $this->assertEquals($text, $form->getViewData());
    }

    public function testSubmitFromChoiceEmpty()
    {
        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'choice',
            'required' => false,
        ));

        $text = array(
            'day' => '',
            'month' => '',
            'year' => '',
        );

        $form->submit($text);

        $this->assertNull($form->getData());
        $this->assertEquals($text, $form->getViewData());
    }

    public function testSubmitFromInputDateTimeDifferentPattern()
    {
        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'format' => 'MM*yyyy*dd',
            'widget' => 'single_text',
            'input' => 'datetime',
        ));

        $form->submit('06*2010*02');

        $this->assertDateTimeEquals(new \DateTime('2010-06-02 UTC'), $form->getData());
        $this->assertEquals('06*2010*02', $form->getViewData());
    }

    public function testSubmitFromInputStringDifferentPattern()
    {
        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'format' => 'MM*yyyy*dd',
            'widget' => 'single_text',
            'input' => 'string',
        ));

        $form->submit('06*2010*02');

        $this->assertEquals('2010-06-02', $form->getData());
        $this->assertEquals('06*2010*02', $form->getViewData());
    }

    public function testSubmitFromInputTimestampDifferentPattern()
    {
        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'format' => 'MM*yyyy*dd',
            'widget' => 'single_text',
            'input' => 'timestamp',
        ));

        $form->submit('06*2010*02');

        $dateTime = new \DateTime('2010-06-02 UTC');

        $this->assertEquals($dateTime->format('U'), $form->getData());
        $this->assertEquals('06*2010*02', $form->getViewData());
    }

    public function testSubmitFromInputRawDifferentPattern()
    {
        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'format' => 'MM*yyyy*dd',
            'widget' => 'single_text',
            'input' => 'array',
        ));

        $form->submit('06*2010*02');

        $output = array(
            'day' => '2',
            'month' => '6',
            'year' => '2010',
        );

        $this->assertEquals($output, $form->getData());
        $this->assertEquals('06*2010*02', $form->getViewData());
    }

    /**
     * @dataProvider provideDateFormats
     */
    public function testDatePatternWithFormatOption($format, $pattern)
    {
        $form = $this->factory->create('date', null, array(
            'format' => $format,
        ));

        $view = $form->createView();

        $this->assertEquals($pattern, $view->vars['date_pattern']);
    }

    public function provideDateFormats()
    {
        return array(
            array('dMy', '{{ day }}{{ month }}{{ year }}'),
            array('d-M-yyyy', '{{ day }}-{{ month }}-{{ year }}'),
            array('M d y', '{{ month }} {{ day }} {{ year }}'),
        );
    }

    /**
     * This test is to check that the strings '0', '1', '2', '3' are not accepted
     * as valid IntlDateFormatter constants for FULL, LONG, MEDIUM or SHORT respectively.
     *
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testThrowExceptionIfFormatIsNoPattern()
    {
        $this->factory->create('date', null, array(
            'format' => '0',
            'widget' => 'single_text',
            'input' => 'string',
        ));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testThrowExceptionIfFormatDoesNotContainYearMonthAndDay()
    {
        $this->factory->create('date', null, array(
            'months' => array(6, 7),
            'format' => 'yy',
        ));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testThrowExceptionIfFormatIsNoConstant()
    {
        $this->factory->create('date', null, array(
            'format' => 105,
        ));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testThrowExceptionIfFormatIsInvalid()
    {
        $this->factory->create('date', null, array(
            'format' => array(),
        ));
    }

    public function testSetDataWithDifferentTimezones()
    {
        $form = $this->factory->create('date', null, array(
            'format' => \IntlDateFormatter::MEDIUM,
            'model_timezone' => 'America/New_York',
            'view_timezone' => 'Pacific/Tahiti',
            'input' => 'string',
            'widget' => 'single_text',
        ));

        $form->setData('2010-06-02');

        $this->assertEquals('01.06.2010', $form->getViewData());
    }

    public function testSetDataWithDifferentTimezonesDateTime()
    {
        $form = $this->factory->create('date', null, array(
            'format' => \IntlDateFormatter::MEDIUM,
            'model_timezone' => 'America/New_York',
            'view_timezone' => 'Pacific/Tahiti',
            'input' => 'datetime',
            'widget' => 'single_text',
        ));

        $dateTime = new \DateTime('2010-06-02 America/New_York');

        $form->setData($dateTime);

        $this->assertDateTimeEquals($dateTime, $form->getData());
        $this->assertEquals('01.06.2010', $form->getViewData());
    }

    public function testYearsOption()
    {
        $form = $this->factory->create('date', null, array(
            'years' => array(2010, 2011),
        ));

        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView('2010', '2010', '2010'),
            new ChoiceView('2011', '2011', '2011'),
        ), $view['year']->vars['choices']);
    }

    public function testMonthsOption()
    {
        $form = $this->factory->create('date', null, array(
            'months' => array(6, 7),
        ));

        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView('6', '6', '06'),
            new ChoiceView('7', '7', '07'),
        ), $view['month']->vars['choices']);
    }

    public function testMonthsOptionShortFormat()
    {
        $form = $this->factory->create('date', null, array(
            'months' => array(1, 4),
            'format' => 'dd.MMM.yy',
        ));

        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView('1', '1', 'Jän'),
            new ChoiceView('4', '4', 'Apr.')
        ), $view['month']->vars['choices']);
    }

    public function testMonthsOptionLongFormat()
    {
        $form = $this->factory->create('date', null, array(
            'months' => array(1, 4),
            'format' => 'dd.MMMM.yy',
        ));

        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView('1', '1', 'Jänner'),
            new ChoiceView('4', '4', 'April'),
        ), $view['month']->vars['choices']);
    }

    public function testMonthsOptionLongFormatWithDifferentTimezone()
    {
        $form = $this->factory->create('date', null, array(
            'months' => array(1, 4),
            'format' => 'dd.MMMM.yy',
        ));

        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView('1', '1', 'Jänner'),
            new ChoiceView('4', '4', 'April'),
        ), $view['month']->vars['choices']);
    }

    public function testIsDayWithinRangeReturnsTrueIfWithin()
    {
        $form = $this->factory->create('date', null, array(
            'days' => array(6, 7),
        ));

        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView('6', '6', '06'),
            new ChoiceView('7', '7', '07'),
        ), $view['day']->vars['choices']);
    }

    public function testIsPartiallyFilledReturnsFalseIfSingleText()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'single_text',
        ));

        $form->submit('7.6.2010');

        $this->assertFalse($form->isPartiallyFilled());
    }

    public function testIsPartiallyFilledReturnsFalseIfChoiceAndCompletelyEmpty()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'choice',
        ));

        $form->submit(array(
            'day' => '',
            'month' => '',
            'year' => '',
        ));

        $this->assertFalse($form->isPartiallyFilled());
    }

    public function testIsPartiallyFilledReturnsFalseIfChoiceAndCompletelyFilled()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'choice',
        ));

        $form->submit(array(
            'day' => '2',
            'month' => '6',
            'year' => '2010',
        ));

        $this->assertFalse($form->isPartiallyFilled());
    }

    public function testIsPartiallyFilledReturnsTrueIfChoiceAndDayEmpty()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('date', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'widget' => 'choice',
        ));

        $form->submit(array(
            'day' => '',
            'month' => '6',
            'year' => '2010',
        ));

        $this->assertTrue($form->isPartiallyFilled());
    }

    public function testPassDatePatternToView()
    {
        $form = $this->factory->create('date');
        $view = $form->createView();

        $this->assertSame('{{ day }}{{ month }}{{ year }}', $view->vars['date_pattern']);
    }

    public function testPassDatePatternToViewDifferentFormat()
    {
        $form = $this->factory->create('date', null, array(
            'format' => \IntlDateFormatter::LONG,
        ));

        $view = $form->createView();

        $this->assertSame('{{ day }}{{ month }}{{ year }}', $view->vars['date_pattern']);
    }

    public function testPassDatePatternToViewDifferentPattern()
    {
        $form = $this->factory->create('date', null, array(
            'format' => 'MMyyyydd'
        ));

        $view = $form->createView();

        $this->assertSame('{{ month }}{{ year }}{{ day }}', $view->vars['date_pattern']);
    }

    public function testPassDatePatternToViewDifferentPatternWithSeparators()
    {
        $form = $this->factory->create('date', null, array(
            'format' => 'MM*yyyy*dd'
        ));

        $view = $form->createView();

        $this->assertSame('{{ month }}*{{ year }}*{{ day }}', $view->vars['date_pattern']);
    }

    public function testDontPassDatePatternIfText()
    {
        $form = $this->factory->create('date', null, array(
            'widget' => 'single_text',
        ));
        $view = $form->createView();

        $this->assertFalse(isset($view->vars['date_pattern']));
    }

    public function testPassWidgetToView()
    {
        $form = $this->factory->create('date', null, array(
            'widget' => 'single_text',
        ));
        $view = $form->createView();

        $this->assertSame('single_text', $view->vars['widget']);
    }

    // Bug fix
    public function testInitializeWithDateTime()
    {
        // Throws an exception if "data_class" option is not explicitly set
        // to null in the type
        $this->factory->create('date', new \DateTime());
    }

    public function testSingleTextWidgetShouldUseTheRightInputType()
    {
        $form = $this->factory->create('date', null, array(
            'widget' => 'single_text',
        ));

        $view = $form->createView();
        $this->assertEquals('date', $view->vars['type']);
    }

    public function testPassDefaultEmptyValueToViewIfNotRequired()
    {
        $form = $this->factory->create('date', null, array(
            'required' => false,
        ));

        $view = $form->createView();
        $this->assertSame('', $view['year']->vars['empty_value']);
        $this->assertSame('', $view['month']->vars['empty_value']);
        $this->assertSame('', $view['day']->vars['empty_value']);
    }

    public function testPassNoEmptyValueToViewIfRequired()
    {
        $form = $this->factory->create('date', null, array(
            'required' => true,
        ));

        $view = $form->createView();
        $this->assertNull($view['year']->vars['empty_value']);
        $this->assertNull($view['month']->vars['empty_value']);
        $this->assertNull($view['day']->vars['empty_value']);
    }

    public function testPassEmptyValueAsString()
    {
        $form = $this->factory->create('date', null, array(
            'empty_value' => 'Empty',
        ));

        $view = $form->createView();
        $this->assertSame('Empty', $view['year']->vars['empty_value']);
        $this->assertSame('Empty', $view['month']->vars['empty_value']);
        $this->assertSame('Empty', $view['day']->vars['empty_value']);
    }

    public function testPassEmptyValueAsArray()
    {
        $form = $this->factory->create('date', null, array(
            'empty_value' => array(
                'year' => 'Empty year',
                'month' => 'Empty month',
                'day' => 'Empty day',
            ),
        ));

        $view = $form->createView();
        $this->assertSame('Empty year', $view['year']->vars['empty_value']);
        $this->assertSame('Empty month', $view['month']->vars['empty_value']);
        $this->assertSame('Empty day', $view['day']->vars['empty_value']);
    }

    public function testPassEmptyValueAsPartialArrayAddEmptyIfNotRequired()
    {
        $form = $this->factory->create('date', null, array(
            'required' => false,
            'empty_value' => array(
                'year' => 'Empty year',
                'day' => 'Empty day',
            ),
        ));

        $view = $form->createView();
        $this->assertSame('Empty year', $view['year']->vars['empty_value']);
        $this->assertSame('', $view['month']->vars['empty_value']);
        $this->assertSame('Empty day', $view['day']->vars['empty_value']);
    }

    public function testPassEmptyValueAsPartialArrayAddNullIfRequired()
    {
        $form = $this->factory->create('date', null, array(
            'required' => true,
            'empty_value' => array(
                'year' => 'Empty year',
                'day' => 'Empty day',
            ),
        ));

        $view = $form->createView();
        $this->assertSame('Empty year', $view['year']->vars['empty_value']);
        $this->assertNull($view['month']->vars['empty_value']);
        $this->assertSame('Empty day', $view['day']->vars['empty_value']);
    }

    public function testPassHtml5TypeIfSingleTextAndHtml5Format()
    {
        $form = $this->factory->create('date', null, array(
            'widget' => 'single_text',
        ));

        $view = $form->createView();
        $this->assertSame('date', $view->vars['type']);
    }

    public function testDontPassHtml5TypeIfNotHtml5Format()
    {
        $form = $this->factory->create('date', null, array(
            'widget' => 'single_text',
            'format' => \IntlDateFormatter::MEDIUM,
        ));

        $view = $form->createView();
        $this->assertFalse(isset($view->vars['type']));
    }

    public function testDontPassHtml5TypeIfNotSingleText()
    {
        $form = $this->factory->create('date', null, array(
            'widget' => 'text',
        ));

        $view = $form->createView();
        $this->assertFalse(isset($view->vars['type']));
    }

    public function provideCompoundWidgets()
    {
        return array(
            array('text'),
            array('choice'),
        );
    }

    /**
     * @dataProvider provideCompoundWidgets
     */
    public function testYearErrorsBubbleUp($widget)
    {
        $error = new FormError('Invalid!');
        $form = $this->factory->create('date', null, array(
            'widget' => $widget,
        ));
        $form['year']->addError($error);

        $this->assertSame(array(), $form['year']->getErrors());
        $this->assertSame(array($error), $form->getErrors());
    }

    /**
     * @dataProvider provideCompoundWidgets
     */
    public function testMonthErrorsBubbleUp($widget)
    {
        $error = new FormError('Invalid!');
        $form = $this->factory->create('date', null, array(
            'widget' => $widget,
        ));
        $form['month']->addError($error);

        $this->assertSame(array(), $form['month']->getErrors());
        $this->assertSame(array($error), $form->getErrors());
    }

    /**
     * @dataProvider provideCompoundWidgets
     */
    public function testDayErrorsBubbleUp($widget)
    {
        $error = new FormError('Invalid!');
        $form = $this->factory->create('date', null, array(
            'widget' => $widget,
        ));
        $form['day']->addError($error);

        $this->assertSame(array(), $form['day']->getErrors());
        $this->assertSame(array($error), $form->getErrors());
    }

    public function testYearsFor32BitsMachines()
    {
        if (4 !== PHP_INT_SIZE) {
            $this->markTestSkipped(
                'PHP must be compiled in 32 bit mode to run this test');
        }

        $form = $this->factory->create('date', null, array(
            'years' => range(1900, 2040),
        ));

        $view = $form->createView();

        $listChoices = array();
        foreach (range(1902, 2037) as $y) {
            $listChoices[] = new ChoiceView($y, $y, $y);
        }

        $this->assertEquals($listChoices, $view['year']->vars['choices']);
    }
}
PK|b�\I��E����Rpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Extension\Core\ChoiceList\ObjectChoiceList;
use Symfony\Component\Form\Extension\Core\View\ChoiceView;

class ChoiceTypeTest extends \Symfony\Component\Form\Test\TypeTestCase
{
    private $choices = array(
        'a' => 'Bernhard',
        'b' => 'Fabien',
        'c' => 'Kris',
        'd' => 'Jon',
        'e' => 'Roman',
    );

    private $numericChoices = array(
        0 => 'Bernhard',
        1 => 'Fabien',
        2 => 'Kris',
        3 => 'Jon',
        4 => 'Roman',
    );

    private $objectChoices;

    protected $groupedChoices = array(
        'Symfony' => array(
            'a' => 'Bernhard',
            'b' => 'Fabien',
            'c' => 'Kris',
        ),
        'Doctrine' => array(
            'd' => 'Jon',
            'e' => 'Roman',
        )
    );

    protected function setUp()
    {
        parent::setUp();

        $this->objectChoices = array(
            (object) array('id' => 1, 'name' => 'Bernhard'),
            (object) array('id' => 2, 'name' => 'Fabien'),
            (object) array('id' => 3, 'name' => 'Kris'),
            (object) array('id' => 4, 'name' => 'Jon'),
            (object) array('id' => 5, 'name' => 'Roman'),
        );
    }

    protected function tearDown()
    {
        parent::tearDown();

        $this->objectChoices = null;
    }

    /**
     * @expectedException \PHPUnit_Framework_Error
     */
    public function testChoicesOptionExpectsArray()
    {
        $this->factory->create('choice', null, array(
            'choices' => new \ArrayObject(),
        ));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testChoiceListOptionExpectsChoiceListInterface()
    {
        $this->factory->create('choice', null, array(
            'choice_list' => array('foo' => 'foo'),
        ));
    }

    public function testChoiceListAndChoicesCanBeEmpty()
    {
        $this->factory->create('choice');
    }

    public function testExpandedChoicesOptionsTurnIntoChildren()
    {
        $form = $this->factory->create('choice', null, array(
            'expanded'  => true,
            'choices'   => $this->choices,
        ));

        $this->assertCount(count($this->choices), $form, 'Each choice should become a new field');
    }

    public function testPlaceholderPresentOnNonRequiredExpandedSingleChoice()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple'  => false,
            'expanded'  => true,
            'required'  => false,
            'choices'   => $this->choices,
        ));

        $this->assertTrue(isset($form['placeholder']));
        $this->assertCount(count($this->choices) + 1, $form, 'Each choice should become a new field');
    }

    public function testPlaceholderNotPresentIfRequired()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple'  => false,
            'expanded'  => true,
            'required'  => true,
            'choices'   => $this->choices,
        ));

        $this->assertFalse(isset($form['placeholder']));
        $this->assertCount(count($this->choices), $form, 'Each choice should become a new field');
    }

    public function testPlaceholderNotPresentIfMultiple()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple'  => true,
            'expanded'  => true,
            'required'  => false,
            'choices'   => $this->choices,
        ));

        $this->assertFalse(isset($form['placeholder']));
        $this->assertCount(count($this->choices), $form, 'Each choice should become a new field');
    }

    public function testPlaceholderNotPresentIfEmptyChoice()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple'  => false,
            'expanded'  => true,
            'required'  => false,
            'choices' => array(
                '' => 'Empty',
                1 => 'Not empty',
            ),
        ));

        $this->assertFalse(isset($form['placeholder']));
        $this->assertCount(2, $form, 'Each choice should become a new field');
    }

    public function testExpandedChoicesOptionsAreFlattened()
    {
        $form = $this->factory->create('choice', null, array(
            'expanded'  => true,
            'choices'   => $this->groupedChoices,
        ));

        $flattened = array();
        foreach ($this->groupedChoices as $choices) {
            $flattened = array_merge($flattened, array_keys($choices));
        }

        $this->assertCount($form->count(), $flattened, 'Each nested choice should become a new field, not the groups');

        foreach ($flattened as $value => $choice) {
            $this->assertTrue($form->has($value), 'Flattened choice is named after it\'s value');
        }
    }

    public function testExpandedCheckboxesAreNeverRequired()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => true,
            'required' => true,
            'choices' => $this->choices,
        ));

        foreach ($form as $child) {
            $this->assertFalse($child->isRequired());
        }
    }

    public function testExpandedRadiosAreRequiredIfChoiceChildIsRequired()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => true,
            'choices' => $this->choices,
        ));

        foreach ($form as $child) {
            $this->assertTrue($child->isRequired());
        }
    }

    public function testExpandedRadiosAreNotRequiredIfChoiceChildIsNotRequired()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => false,
            'choices' => $this->choices,
        ));

        foreach ($form as $child) {
            $this->assertFalse($child->isRequired());
        }
    }

    public function testSubmitSingleNonExpanded()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => false,
            'choices' => $this->choices,
        ));

        $form->submit('b');

        $this->assertEquals('b', $form->getData());
        $this->assertEquals('b', $form->getViewData());
    }

    public function testSubmitSingleNonExpandedInvalidChoice()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => false,
            'choices' => $this->choices,
        ));

        $form->submit('foobar');

        $this->assertNull($form->getData());
        $this->assertEquals('foobar', $form->getViewData());
        $this->assertFalse($form->isSynchronized());
    }

    public function testSubmitSingleNonExpandedObjectChoices()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => false,
            'choice_list' => new ObjectChoiceList(
                $this->objectChoices,
                // label path
                'name',
                array(),
                null,
                // value path
                'id'
            ),
        ));

        // "id" value of the second entry
        $form->submit('2');

        $this->assertEquals($this->objectChoices[1], $form->getData());
        $this->assertEquals('2', $form->getViewData());
    }

    public function testSubmitMultipleNonExpanded()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => false,
            'choices' => $this->choices,
        ));

        $form->submit(array('a', 'b'));

        $this->assertEquals(array('a', 'b'), $form->getData());
        $this->assertEquals(array('a', 'b'), $form->getViewData());
    }

    public function testSubmitMultipleNonExpandedInvalidScalarChoice()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => false,
            'choices' => $this->choices,
        ));

        $form->submit('foobar');

        $this->assertNull($form->getData());
        $this->assertEquals('foobar', $form->getViewData());
        $this->assertFalse($form->isSynchronized());
    }

    public function testSubmitMultipleNonExpandedInvalidArrayChoice()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => false,
            'choices' => $this->choices,
        ));

        $form->submit(array('a', 'foobar'));

        $this->assertNull($form->getData());
        $this->assertEquals(array('a', 'foobar'), $form->getViewData());
        $this->assertFalse($form->isSynchronized());
    }

    public function testSubmitMultipleNonExpandedObjectChoices()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => false,
            'choice_list' => new ObjectChoiceList(
                $this->objectChoices,
                // label path
                'name',
                array(),
                null,
                // value path
                'id'
            ),
        ));

        $form->submit(array('2', '3'));

        $this->assertEquals(array($this->objectChoices[1], $this->objectChoices[2]), $form->getData());
        $this->assertEquals(array('2', '3'), $form->getViewData());
    }

    public function testSubmitSingleExpandedRequired()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => true,
            'choices' => $this->choices,
        ));

        $form->submit('b');

        $this->assertSame('b', $form->getData());
        $this->assertSame(array(
            0 => false,
            1 => true,
            2 => false,
            3 => false,
            4 => false,
        ), $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertTrue($form->isSynchronized());

        $this->assertFalse($form[0]->getData());
        $this->assertTrue($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertSame('b', $form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedRequiredInvalidChoice()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => true,
            'choices' => $this->choices,
        ));

        $form->submit('foobar');

        $this->assertSame(null, $form->getData());
        $this->assertSame('foobar', $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertFalse($form->isSynchronized());

        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedNonRequired()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => false,
            'choices' => $this->choices,
        ));

        $form->submit('b');

        $this->assertSame('b', $form->getData());
        $this->assertSame(array(
            0 => false,
            1 => true,
            2 => false,
            3 => false,
            4 => false,
            'placeholder' => false,
        ), $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertTrue($form->isSynchronized());

        $this->assertFalse($form['placeholder']->getData());
        $this->assertFalse($form[0]->getData());
        $this->assertTrue($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form['placeholder']->getViewData());
        $this->assertNull($form[0]->getViewData());
        $this->assertSame('b', $form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedNonRequiredInvalidChoice()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => false,
            'choices' => $this->choices,
        ));

        $form->submit('foobar');

        $this->assertSame(null, $form->getData());
        $this->assertSame('foobar', $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertFalse($form->isSynchronized());

        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedRequiredNull()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => true,
            'choices' => $this->choices,
        ));

        $form->submit(null);

        $this->assertNull($form->getData());
        $this->assertSame(array(
            0 => false,
            1 => false,
            2 => false,
            3 => false,
            4 => false,
        ), $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertTrue($form->isSynchronized());

        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedRequiredEmpty()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => true,
            'choices' => $this->choices,
        ));

        $form->submit('');

        $this->assertNull($form->getData());
        $this->assertSame(array(
            0 => false,
            1 => false,
            2 => false,
            3 => false,
            4 => false,
        ), $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertTrue($form->isSynchronized());

        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedRequiredFalse()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => true,
            'choices' => $this->choices,
        ));

        $form->submit(false);

        $this->assertNull($form->getData());
        $this->assertSame(array(
            0 => false,
            1 => false,
            2 => false,
            3 => false,
            4 => false,
        ), $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertTrue($form->isSynchronized());

        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedNonRequiredNull()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => false,
            'choices' => $this->choices,
        ));

        $form->submit(null);

        $this->assertNull($form->getData());
        $this->assertSame(array(
            0 => false,
            1 => false,
            2 => false,
            3 => false,
            4 => false,
            'placeholder' => true,
        ), $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertTrue($form->isSynchronized());

        $this->assertTrue($form['placeholder']->getData());
        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertSame('', $form['placeholder']->getViewData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedNonRequiredEmpty()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => false,
            'choices' => $this->choices,
        ));

        $form->submit('');

        $this->assertNull($form->getData());
        $this->assertSame(array(
            0 => false,
            1 => false,
            2 => false,
            3 => false,
            4 => false,
            'placeholder' => true,
        ), $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertTrue($form->isSynchronized());

        $this->assertTrue($form['placeholder']->getData());
        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertSame('', $form['placeholder']->getViewData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedNonRequiredFalse()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'required' => false,
            'choices' => $this->choices,
        ));

        $form->submit(false);

        $this->assertNull($form->getData());
        $this->assertSame(array(
            0 => false,
            1 => false,
            2 => false,
            3 => false,
            4 => false,
            'placeholder' => true,
        ), $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertTrue($form->isSynchronized());

        $this->assertTrue($form['placeholder']->getData());
        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertSame('', $form['placeholder']->getViewData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedWithEmptyChild()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'choices' => array(
                '' => 'Empty',
                1 => 'Not empty',
            ),
        ));

        $form->submit('');

        $this->assertNull($form->getData());
        $this->assertTrue($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertSame('', $form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
    }

    public function testSubmitSingleExpandedObjectChoices()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'choice_list' => new ObjectChoiceList(
                $this->objectChoices,
                // label path
                'name',
                array(),
                null,
                // value path
                'id'
            ),
        ));

        $form->submit('2');

        $this->assertSame($this->objectChoices[1], $form->getData());
        $this->assertFalse($form[0]->getData());
        $this->assertTrue($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertSame('2', $form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitSingleExpandedNumericChoices()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => true,
            'choices' => $this->numericChoices,
        ));

        $form->submit('1');

        $this->assertSame(1, $form->getData());
        $this->assertFalse($form[0]->getData());
        $this->assertTrue($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertSame('1', $form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitMultipleExpanded()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => true,
            'choices' => $this->choices,
        ));

        $form->submit(array('a', 'c'));

        $this->assertSame(array('a', 'c'), $form->getData());
        $this->assertSame(array(
            0 => true,
            1 => false,
            2 => true,
            3 => false,
            4 => false,
        ), $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertTrue($form->isSynchronized());

        $this->assertTrue($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertTrue($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertSame('a', $form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertSame('c', $form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitMultipleExpandedInvalidScalarChoice()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => true,
            'choices' => $this->choices,
        ));

        $form->submit('foobar');

        $this->assertNull($form->getData());
        $this->assertSame('foobar', $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertFalse($form->isSynchronized());

        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitMultipleExpandedInvalidArrayChoice()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => true,
            'choices' => $this->choices,
        ));

        $form->submit(array('a', 'foobar'));

        $this->assertNull($form->getData());
        $this->assertSame(array('a', 'foobar'), $form->getViewData());
        $this->assertEmpty($form->getExtraData());
        $this->assertFalse($form->isSynchronized());

        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitMultipleExpandedEmpty()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => true,
            'choices' => $this->choices,
        ));

        $form->submit(array());

        $this->assertSame(array(), $form->getData());
        $this->assertFalse($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitMultipleExpandedWithEmptyChild()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => true,
            'choices' => array(
                '' => 'Empty',
                1 => 'Not Empty',
                2 => 'Not Empty 2',
            )
        ));

        $form->submit(array('', '2'));

        $this->assertSame(array('', 2), $form->getData());
        $this->assertTrue($form[0]->getData());
        $this->assertFalse($form[1]->getData());
        $this->assertTrue($form[2]->getData());
        $this->assertSame('', $form[0]->getViewData());
        $this->assertNull($form[1]->getViewData());
        $this->assertSame('2', $form[2]->getViewData());
    }

    public function testSubmitMultipleExpandedObjectChoices()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => true,
            'choice_list' => new ObjectChoiceList(
                $this->objectChoices,
                // label path
                'name',
                array(),
                null,
                // value path
                'id'
            ),
        ));

        $form->submit(array('1', '2'));

        $this->assertSame(array($this->objectChoices[0], $this->objectChoices[1]), $form->getData());
        $this->assertTrue($form[0]->getData());
        $this->assertTrue($form[1]->getData());
        $this->assertFalse($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertSame('1', $form[0]->getViewData());
        $this->assertSame('2', $form[1]->getViewData());
        $this->assertNull($form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    public function testSubmitMultipleExpandedNumericChoices()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => true,
            'choices' => $this->numericChoices,
        ));

        $form->submit(array('1', '2'));

        $this->assertSame(array(1, 2), $form->getData());
        $this->assertFalse($form[0]->getData());
        $this->assertTrue($form[1]->getData());
        $this->assertTrue($form[2]->getData());
        $this->assertFalse($form[3]->getData());
        $this->assertFalse($form[4]->getData());
        $this->assertNull($form[0]->getViewData());
        $this->assertSame('1', $form[1]->getViewData());
        $this->assertSame('2', $form[2]->getViewData());
        $this->assertNull($form[3]->getViewData());
        $this->assertNull($form[4]->getViewData());
    }

    /*
     * We need this functionality to create choice fields for Boolean types,
     * e.g. false => 'No', true => 'Yes'
     */
    public function testSetDataSingleNonExpandedAcceptsBoolean()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'expanded' => false,
            'choices' => $this->numericChoices,
        ));

        $form->setData(false);

        $this->assertFalse($form->getData());
        $this->assertEquals('0', $form->getViewData());
    }

    public function testSetDataMultipleNonExpandedAcceptsBoolean()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'expanded' => false,
            'choices' => $this->numericChoices,
        ));

        $form->setData(array(false, true));

        $this->assertEquals(array(false, true), $form->getData());
        $this->assertEquals(array('0', '1'), $form->getViewData());
    }

    public function testPassRequiredToView()
    {
        $form = $this->factory->create('choice', null, array(
            'choices' => $this->choices,
        ));
        $view = $form->createView();

        $this->assertTrue($view->vars['required']);
    }

    public function testPassNonRequiredToView()
    {
        $form = $this->factory->create('choice', null, array(
            'required' => false,
            'choices' => $this->choices,
        ));
        $view = $form->createView();

        $this->assertFalse($view->vars['required']);
    }

    public function testPassMultipleToView()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => true,
            'choices' => $this->choices,
        ));
        $view = $form->createView();

        $this->assertTrue($view->vars['multiple']);
    }

    public function testPassExpandedToView()
    {
        $form = $this->factory->create('choice', null, array(
            'expanded' => true,
            'choices' => $this->choices,
        ));
        $view = $form->createView();

        $this->assertTrue($view->vars['expanded']);
    }

    public function testEmptyValueIsNullByDefaultIfRequired()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'required' => true,
            'choices' => $this->choices,
        ));
        $view = $form->createView();

        $this->assertNull($view->vars['empty_value']);
    }

    public function testEmptyValueIsEmptyStringByDefaultIfNotRequired()
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => false,
            'required' => false,
            'choices' => $this->choices,
        ));
        $view = $form->createView();

        $this->assertSame('', $view->vars['empty_value']);
    }

    /**
     * @dataProvider getOptionsWithEmptyValue
     */
    public function testPassEmptyValueToView($multiple, $expanded, $required, $emptyValue, $viewValue)
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => $multiple,
            'expanded' => $expanded,
            'required' => $required,
            'empty_value' => $emptyValue,
            'choices' => $this->choices,
        ));
        $view = $form->createView();

        $this->assertEquals($viewValue, $view->vars['empty_value']);
        $this->assertFalse($view->vars['empty_value_in_choices']);
    }

    /**
     * @dataProvider getOptionsWithEmptyValue
     */
    public function testDontPassEmptyValueIfContainedInChoices($multiple, $expanded, $required, $emptyValue, $viewValue)
    {
        $form = $this->factory->create('choice', null, array(
            'multiple' => $multiple,
            'expanded' => $expanded,
            'required' => $required,
            'empty_value' => $emptyValue,
            'choices' => array('a' => 'A', '' => 'Empty'),
        ));
        $view = $form->createView();

        $this->assertNull($view->vars['empty_value']);
        $this->assertTrue($view->vars['empty_value_in_choices']);
    }

    public function getOptionsWithEmptyValue()
    {
        return array(
            // single non-expanded
            array(false, false, false, 'foobar', 'foobar'),
            array(false, false, false, '', ''),
            array(false, false, false, null, null),
            array(false, false, false, false, null),
            array(false, false, true, 'foobar', 'foobar'),
            array(false, false, true, '', ''),
            array(false, false, true, null, null),
            array(false, false, true, false, null),
            // single expanded
            array(false, true, false, 'foobar', 'foobar'),
            // radios should never have an empty label
            array(false, true, false, '', 'None'),
            array(false, true, false, null, null),
            array(false, true, false, false, null),
            array(false, true, true, 'foobar', 'foobar'),
            // radios should never have an empty label
            array(false, true, true, '', 'None'),
            array(false, true, true, null, null),
            array(false, true, true, false, null),
            // multiple non-expanded
            array(true, false, false, 'foobar', null),
            array(true, false, false, '', null),
            array(true, false, false, null, null),
            array(true, false, false, false, null),
            array(true, false, true, 'foobar', null),
            array(true, false, true, '', null),
            array(true, false, true, null, null),
            array(true, false, true, false, null),
            // multiple expanded
            array(true, true, false, 'foobar', null),
            array(true, true, false, '', null),
            array(true, true, false, null, null),
            array(true, true, false, false, null),
            array(true, true, true, 'foobar', null),
            array(true, true, true, '', null),
            array(true, true, true, null, null),
            array(true, true, true, false, null),
        );
    }

    public function testPassChoicesToView()
    {
        $choices = array('a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D');
        $form = $this->factory->create('choice', null, array(
            'choices' => $choices,
        ));
        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView('a', 'a', 'A'),
            new ChoiceView('b', 'b', 'B'),
            new ChoiceView('c', 'c', 'C'),
            new ChoiceView('d', 'd', 'D'),
        ), $view->vars['choices']);
    }

    public function testPassPreferredChoicesToView()
    {
        $choices = array('a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D');
        $form = $this->factory->create('choice', null, array(
            'choices' => $choices,
            'preferred_choices' => array('b', 'd'),
        ));
        $view = $form->createView();

        $this->assertEquals(array(
            0 => new ChoiceView('a', 'a', 'A'),
            2 => new ChoiceView('c', 'c', 'C'),
        ), $view->vars['choices']);
        $this->assertEquals(array(
            1 => new ChoiceView('b', 'b', 'B'),
            3 => new ChoiceView('d', 'd', 'D'),
        ), $view->vars['preferred_choices']);
    }

    public function testPassHierarchicalChoicesToView()
    {
        $form = $this->factory->create('choice', null, array(
            'choices' => $this->groupedChoices,
            'preferred_choices' => array('b', 'd'),
        ));
        $view = $form->createView();

        $this->assertEquals(array(
            'Symfony' => array(
                0 => new ChoiceView('a', 'a', 'Bernhard'),
                2 => new ChoiceView('c', 'c', 'Kris'),
            ),
            'Doctrine' => array(
                4 => new ChoiceView('e', 'e', 'Roman'),
            ),
        ), $view->vars['choices']);
        $this->assertEquals(array(
            'Symfony' => array(
                1 => new ChoiceView('b', 'b', 'Fabien'),
            ),
            'Doctrine' => array(
                3 => new ChoiceView('d', 'd', 'Jon'),
            ),
        ), $view->vars['preferred_choices']);
    }

    public function testPassChoiceDataToView()
    {
        $obj1 = (object) array('value' => 'a', 'label' => 'A');
        $obj2 = (object) array('value' => 'b', 'label' => 'B');
        $obj3 = (object) array('value' => 'c', 'label' => 'C');
        $obj4 = (object) array('value' => 'd', 'label' => 'D');
        $form = $this->factory->create('choice', null, array(
            'choice_list' => new ObjectChoiceList(array($obj1, $obj2, $obj3, $obj4), 'label', array(), null, 'value'),
        ));
        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView($obj1, 'a', 'A'),
            new ChoiceView($obj2, 'b', 'B'),
            new ChoiceView($obj3, 'c', 'C'),
            new ChoiceView($obj4, 'd', 'D'),
        ), $view->vars['choices']);
    }

    public function testAdjustFullNameForMultipleNonExpanded()
    {
        $form = $this->factory->createNamed('name', 'choice', null, array(
            'multiple' => true,
            'expanded' => false,
            'choices' => $this->choices,
        ));
        $view = $form->createView();

        $this->assertSame('name[]', $view->vars['full_name']);
    }

    // https://github.com/symfony/symfony/issues/3298
    public function testInitializeWithEmptyChoices()
    {
        $this->factory->createNamed('name', 'choice', null, array(
            'choices' => array(),
        ));
    }

    public function testInitializeWithDefaultObjectChoice()
    {
        $obj1 = (object) array('value' => 'a', 'label' => 'A');
        $obj2 = (object) array('value' => 'b', 'label' => 'B');
        $obj3 = (object) array('value' => 'c', 'label' => 'C');
        $obj4 = (object) array('value' => 'd', 'label' => 'D');

        $form = $this->factory->create('choice', null, array(
            'choice_list' => new ObjectChoiceList(array($obj1, $obj2, $obj3, $obj4), 'label', array(), null, 'value'),
            // Used to break because "data_class" was inferred, which needs to
            // remain null in every case (because it refers to the view format)
            'data' => $obj3,
        ));

        // Trigger data initialization
        $form->getViewData();
    }
}
PK|b�\P�!���Opear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

class UrlTypeTest extends TypeTestCase
{
    public function testSubmitAddsDefaultProtocolIfNoneIsIncluded()
    {
        $form = $this->factory->create('url', 'name');

        $form->submit('www.domain.com');

        $this->assertSame('http://www.domain.com', $form->getData());
        $this->assertSame('http://www.domain.com', $form->getViewData());
    }

    public function testSubmitAddsNoDefaultProtocolIfAlreadyIncluded()
    {
        $form = $this->factory->create('url', null, array(
            'default_protocol' => 'http',
        ));

        $form->submit('ftp://www.domain.com');

        $this->assertSame('ftp://www.domain.com', $form->getData());
        $this->assertSame('ftp://www.domain.com', $form->getViewData());
    }

    public function testSubmitAddsNoDefaultProtocolIfEmpty()
    {
        $form = $this->factory->create('url', null, array(
            'default_protocol' => 'http',
        ));

        $form->submit('');

        $this->assertNull($form->getData());
        $this->assertSame('', $form->getViewData());
    }

    public function testSubmitAddsNoDefaultProtocolIfSetToNull()
    {
        $form = $this->factory->create('url', null, array(
            'default_protocol' => null,
        ));

        $form->submit('www.domain.com');

        $this->assertSame('www.domain.com', $form->getData());
        $this->assertSame('www.domain.com', $form->getViewData());
    }
}
PK|b�\���J��Rpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Intl\Util\IntlTestHelper;

class NumberTypeTest extends TypeTestCase
{
    protected function setUp()
    {
        parent::setUp();

        // we test against "de_DE", so we need the full implementation
        IntlTestHelper::requireFullIntl($this);

        \Locale::setDefault('de_DE');
    }

    public function testDefaultFormatting()
    {
        $form = $this->factory->create('number');
        $form->setData('12345.67890');
        $view = $form->createView();

        $this->assertSame('12345,679', $view->vars['value']);
    }

    public function testDefaultFormattingWithGrouping()
    {
        $form = $this->factory->create('number', null, array('grouping' => true));
        $form->setData('12345.67890');
        $view = $form->createView();

        $this->assertSame('12.345,679', $view->vars['value']);
    }

    public function testDefaultFormattingWithPrecision()
    {
        $form = $this->factory->create('number', null, array('precision' => 2));
        $form->setData('12345.67890');
        $view = $form->createView();

        $this->assertSame('12345,68', $view->vars['value']);
    }

    public function testDefaultFormattingWithRounding()
    {
        $form = $this->factory->create('number', null, array('precision' => 0, 'rounding_mode' => \NumberFormatter::ROUND_UP));
        $form->setData('12345.54321');
        $view = $form->createView();

        $this->assertSame('12346', $view->vars['value']);
    }
}
PK|b�\dwҢSJSJPpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Extension\Core\View\ChoiceView;
use Symfony\Component\Form\FormError;
use Symfony\Component\Intl\Util\IntlTestHelper;

class TimeTypeTest extends TypeTestCase
{
    protected function setUp()
    {
        IntlTestHelper::requireIntl($this);

        parent::setUp();
    }

    public function testSubmitDateTime()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'datetime',
        ));

        $input = array(
            'hour' => '3',
            'minute' => '4',
        );

        $form->submit($input);

        $dateTime = new \DateTime('1970-01-01 03:04:00 UTC');

        $this->assertEquals($dateTime, $form->getData());
        $this->assertEquals($input, $form->getViewData());
    }

    public function testSubmitString()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'string',
        ));

        $input = array(
            'hour' => '3',
            'minute' => '4',
        );

        $form->submit($input);

        $this->assertEquals('03:04:00', $form->getData());
        $this->assertEquals($input, $form->getViewData());
    }

    public function testSubmitTimestamp()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'timestamp',
        ));

        $input = array(
            'hour' => '3',
            'minute' => '4',
        );

        $form->submit($input);

        $dateTime = new \DateTime('1970-01-01 03:04:00 UTC');

        $this->assertEquals($dateTime->format('U'), $form->getData());
        $this->assertEquals($input, $form->getViewData());
    }

    public function testSubmitArray()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'array',
        ));

        $input = array(
            'hour' => '3',
            'minute' => '4',
        );

        $form->submit($input);

        $this->assertEquals($input, $form->getData());
        $this->assertEquals($input, $form->getViewData());
    }

    public function testSubmitDatetimeSingleText()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'datetime',
            'widget' => 'single_text',
        ));

        $form->submit('03:04');

        $this->assertEquals(new \DateTime('1970-01-01 03:04:00 UTC'), $form->getData());
        $this->assertEquals('03:04', $form->getViewData());
    }

    public function testSubmitDatetimeSingleTextWithoutMinutes()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'datetime',
            'widget' => 'single_text',
            'with_minutes' => false,
        ));

        $form->submit('03');

        $this->assertEquals(new \DateTime('1970-01-01 03:00:00 UTC'), $form->getData());
        $this->assertEquals('03', $form->getViewData());
    }

    public function testSubmitArraySingleText()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'array',
            'widget' => 'single_text',
        ));

        $data = array(
            'hour' => '3',
            'minute' => '4',
        );

        $form->submit('03:04');

        $this->assertEquals($data, $form->getData());
        $this->assertEquals('03:04', $form->getViewData());
    }

    public function testSubmitArraySingleTextWithoutMinutes()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'array',
            'widget' => 'single_text',
            'with_minutes' => false,
        ));

        $data = array(
            'hour' => '3',
        );

        $form->submit('03');

        $this->assertEquals($data, $form->getData());
        $this->assertEquals('03', $form->getViewData());
    }

    public function testSubmitArraySingleTextWithSeconds()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'array',
            'widget' => 'single_text',
            'with_seconds' => true,
        ));

        $data = array(
            'hour' => '3',
            'minute' => '4',
            'second' => '5',
        );

        $form->submit('03:04:05');

        $this->assertEquals($data, $form->getData());
        $this->assertEquals('03:04:05', $form->getViewData());
    }

    public function testSubmitStringSingleText()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'string',
            'widget' => 'single_text',
        ));

        $form->submit('03:04');

        $this->assertEquals('03:04:00', $form->getData());
        $this->assertEquals('03:04', $form->getViewData());
    }

    public function testSubmitStringSingleTextWithoutMinutes()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'string',
            'widget' => 'single_text',
            'with_minutes' => false,
        ));

        $form->submit('03');

        $this->assertEquals('03:00:00', $form->getData());
        $this->assertEquals('03', $form->getViewData());
    }

    public function testSetDataWithoutMinutes()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'datetime',
            'with_minutes' => false,
        ));

        $form->setData(new \DateTime('03:04:05 UTC'));

        $this->assertEquals(array('hour' => 3), $form->getViewData());
    }

    public function testSetDataWithSeconds()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
            'input' => 'datetime',
            'with_seconds' => true,
        ));

        $form->setData(new \DateTime('03:04:05 UTC'));

        $this->assertEquals(array('hour' => 3, 'minute' => 4, 'second' => 5), $form->getViewData());
    }

    public function testSetDataDifferentTimezones()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'America/New_York',
            'view_timezone' => 'Asia/Hong_Kong',
            'input' => 'string',
            'with_seconds' => true,
        ));

        $dateTime = new \DateTime('2013-01-01 12:04:05');
        $dateTime->setTimezone(new \DateTimeZone('America/New_York'));

        $form->setData($dateTime->format('H:i:s'));

        $outputTime = clone $dateTime;
        $outputTime->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));

        $displayedData = array(
            'hour' => (int) $outputTime->format('H'),
            'minute' => (int) $outputTime->format('i'),
            'second' => (int) $outputTime->format('s')
        );

        $this->assertEquals($displayedData, $form->getViewData());
    }

    public function testSetDataDifferentTimezonesDateTime()
    {
        $form = $this->factory->create('time', null, array(
            'model_timezone' => 'America/New_York',
            'view_timezone' => 'Asia/Hong_Kong',
            'input' => 'datetime',
            'with_seconds' => true,
        ));

        $dateTime = new \DateTime('12:04:05');
        $dateTime->setTimezone(new \DateTimeZone('America/New_York'));

        $form->setData($dateTime);

        $outputTime = clone $dateTime;
        $outputTime->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));

        $displayedData = array(
            'hour' => (int) $outputTime->format('H'),
            'minute' => (int) $outputTime->format('i'),
            'second' => (int) $outputTime->format('s')
        );

        $this->assertDateTimeEquals($dateTime, $form->getData());
        $this->assertEquals($displayedData, $form->getViewData());
    }

    public function testHoursOption()
    {
        $form = $this->factory->create('time', null, array(
            'hours' => array(6, 7),
        ));

        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView('6', '6', '06'),
            new ChoiceView('7', '7', '07'),
        ), $view['hour']->vars['choices']);
    }

    public function testIsMinuteWithinRangeReturnsTrueIfWithin()
    {
        $form = $this->factory->create('time', null, array(
            'minutes' => array(6, 7),
        ));

        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView('6', '6', '06'),
            new ChoiceView('7', '7', '07'),
        ), $view['minute']->vars['choices']);
    }

    public function testIsSecondWithinRangeReturnsTrueIfWithin()
    {
        $form = $this->factory->create('time', null, array(
            'seconds' => array(6, 7),
            'with_seconds' => true,
        ));

        $view = $form->createView();

        $this->assertEquals(array(
            new ChoiceView('6', '6', '06'),
            new ChoiceView('7', '7', '07'),
        ), $view['second']->vars['choices']);
    }

    public function testIsPartiallyFilledReturnsFalseIfCompletelyEmpty()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('time', null, array(
            'widget' => 'choice',
        ));

        $form->submit(array(
            'hour' => '',
            'minute' => '',
        ));

        $this->assertFalse($form->isPartiallyFilled());
    }

    public function testIsPartiallyFilledReturnsFalseIfCompletelyEmptyWithSeconds()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('time', null, array(
            'widget' => 'choice',
            'with_seconds' => true,
        ));

        $form->submit(array(
            'hour' => '',
            'minute' => '',
            'second' => '',
        ));

        $this->assertFalse($form->isPartiallyFilled());
    }

    public function testIsPartiallyFilledReturnsFalseIfCompletelyFilled()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('time', null, array(
            'widget' => 'choice',
        ));

        $form->submit(array(
            'hour' => '0',
            'minute' => '0',
        ));

        $this->assertFalse($form->isPartiallyFilled());
    }

    public function testIsPartiallyFilledReturnsFalseIfCompletelyFilledWithSeconds()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('time', null, array(
            'widget' => 'choice',
            'with_seconds' => true,
        ));

        $form->submit(array(
            'hour' => '0',
            'minute' => '0',
            'second' => '0',
        ));

        $this->assertFalse($form->isPartiallyFilled());
    }

    public function testIsPartiallyFilledReturnsTrueIfChoiceAndHourEmpty()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('time', null, array(
            'widget' => 'choice',
            'with_seconds' => true,
        ));

        $form->submit(array(
            'hour' => '',
            'minute' => '0',
            'second' => '0',
        ));

        $this->assertTrue($form->isPartiallyFilled());
    }

    public function testIsPartiallyFilledReturnsTrueIfChoiceAndMinuteEmpty()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('time', null, array(
            'widget' => 'choice',
            'with_seconds' => true,
        ));

        $form->submit(array(
            'hour' => '0',
            'minute' => '',
            'second' => '0',
        ));

        $this->assertTrue($form->isPartiallyFilled());
    }

    public function testIsPartiallyFilledReturnsTrueIfChoiceAndSecondsEmpty()
    {
        $this->markTestIncomplete('Needs to be reimplemented using validators');

        $form = $this->factory->create('time', null, array(
            'widget' => 'choice',
            'with_seconds' => true,
        ));

        $form->submit(array(
            'hour' => '0',
            'minute' => '0',
            'second' => '',
        ));

        $this->assertTrue($form->isPartiallyFilled());
    }

    // Bug fix
    public function testInitializeWithDateTime()
    {
        // Throws an exception if "data_class" option is not explicitly set
        // to null in the type
        $this->factory->create('time', new \DateTime());
    }

    public function testSingleTextWidgetShouldUseTheRightInputType()
    {
        $form = $this->factory->create('time', null, array(
            'widget' => 'single_text',
        ));

        $view = $form->createView();
        $this->assertEquals('time', $view->vars['type']);
    }

    public function testPassDefaultEmptyValueToViewIfNotRequired()
    {
        $form = $this->factory->create('time', null, array(
            'required' => false,
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertSame('', $view['hour']->vars['empty_value']);
        $this->assertSame('', $view['minute']->vars['empty_value']);
        $this->assertSame('', $view['second']->vars['empty_value']);
    }

    public function testPassNoEmptyValueToViewIfRequired()
    {
        $form = $this->factory->create('time', null, array(
            'required' => true,
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertNull($view['hour']->vars['empty_value']);
        $this->assertNull($view['minute']->vars['empty_value']);
        $this->assertNull($view['second']->vars['empty_value']);
    }

    public function testPassEmptyValueAsString()
    {
        $form = $this->factory->create('time', null, array(
            'empty_value' => 'Empty',
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertSame('Empty', $view['hour']->vars['empty_value']);
        $this->assertSame('Empty', $view['minute']->vars['empty_value']);
        $this->assertSame('Empty', $view['second']->vars['empty_value']);
    }

    public function testPassEmptyValueAsArray()
    {
        $form = $this->factory->create('time', null, array(
            'empty_value' => array(
                'hour' => 'Empty hour',
                'minute' => 'Empty minute',
                'second' => 'Empty second',
            ),
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertSame('Empty hour', $view['hour']->vars['empty_value']);
        $this->assertSame('Empty minute', $view['minute']->vars['empty_value']);
        $this->assertSame('Empty second', $view['second']->vars['empty_value']);
    }

    public function testPassEmptyValueAsPartialArrayAddEmptyIfNotRequired()
    {
        $form = $this->factory->create('time', null, array(
            'required' => false,
            'empty_value' => array(
                'hour' => 'Empty hour',
                'second' => 'Empty second',
            ),
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertSame('Empty hour', $view['hour']->vars['empty_value']);
        $this->assertSame('', $view['minute']->vars['empty_value']);
        $this->assertSame('Empty second', $view['second']->vars['empty_value']);
    }

    public function testPassEmptyValueAsPartialArrayAddNullIfRequired()
    {
        $form = $this->factory->create('time', null, array(
            'required' => true,
            'empty_value' => array(
                'hour' => 'Empty hour',
                'second' => 'Empty second',
            ),
            'with_seconds' => true,
        ));

        $view = $form->createView();
        $this->assertSame('Empty hour', $view['hour']->vars['empty_value']);
        $this->assertNull($view['minute']->vars['empty_value']);
        $this->assertSame('Empty second', $view['second']->vars['empty_value']);
    }

    public function provideCompoundWidgets()
    {
        return array(
            array('text'),
            array('choice'),
        );
    }

    /**
     * @dataProvider provideCompoundWidgets
     */
    public function testHourErrorsBubbleUp($widget)
    {
        $error = new FormError('Invalid!');
        $form = $this->factory->create('time', null, array(
            'widget' => $widget,
        ));
        $form['hour']->addError($error);

        $this->assertSame(array(), $form['hour']->getErrors());
        $this->assertSame(array($error), $form->getErrors());
    }

    /**
     * @dataProvider provideCompoundWidgets
     */
    public function testMinuteErrorsBubbleUp($widget)
    {
        $error = new FormError('Invalid!');
        $form = $this->factory->create('time', null, array(
            'widget' => $widget,
        ));
        $form['minute']->addError($error);

        $this->assertSame(array(), $form['minute']->getErrors());
        $this->assertSame(array($error), $form->getErrors());
    }

    /**
     * @dataProvider provideCompoundWidgets
     */
    public function testSecondErrorsBubbleUp($widget)
    {
        $error = new FormError('Invalid!');
        $form = $this->factory->create('time', null, array(
            'widget' => $widget,
            'with_seconds' => true,
        ));
        $form['second']->addError($error);

        $this->assertSame(array(), $form['second']->getErrors());
        $this->assertSame(array($error), $form->getErrors());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\InvalidConfigurationException
     */
    public function testInitializeWithSecondsAndWithoutMinutes()
    {
        $this->factory->create('time', null, array(
            'with_minutes' => false,
            'with_seconds' => true,
        ));
    }
}
PK}b�\�}�C%%Rpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/SubmitTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class SubmitTypeTest extends TypeTestCase
{
    public function testCreateSubmitButtonInstances()
    {
        $this->assertInstanceOf('Symfony\Component\Form\SubmitButton', $this->factory->create('submit'));
    }

    public function testNotClickedByDefault()
    {
        $button = $this->factory->create('submit');

        $this->assertFalse($button->isClicked());
    }

    public function testNotClickedIfSubmittedWithNull()
    {
        $button = $this->factory->create('submit');
        $button->submit(null);

        $this->assertFalse($button->isClicked());
    }

    public function testClickedIfSubmittedWithEmptyString()
    {
        $button = $this->factory->create('submit');
        $button->submit('');

        $this->assertTrue($button->isClicked());
    }

    public function testClickedIfSubmittedWithUnemptyString()
    {
        $button = $this->factory->create('submit');
        $button->submit('foo');

        $this->assertTrue($button->isClicked());
    }

    public function testSubmitCanBeAddedToForm()
    {
        $form = $this->factory
            ->createBuilder('form')
            ->getForm();

        $this->assertSame($form, $form->add('send', 'submit'));
    }
}
PK}b�\x���aaRpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Extension\Core\View\ChoiceView;
use Symfony\Component\Intl\Util\IntlTestHelper;

class LocaleTypeTest extends TypeTestCase
{
    protected function setUp()
    {
        IntlTestHelper::requireIntl($this);

        parent::setUp();
    }

    public function testLocalesAreSelectable()
    {
        $form = $this->factory->create('locale');
        $view = $form->createView();
        $choices = $view->vars['choices'];

        $this->assertContains(new ChoiceView('en', 'en', 'English'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('en_GB', 'en_GB', 'English (United Kingdom)'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('zh_Hant_MO', 'zh_Hant_MO', 'Chinese (Traditional, Macau SAR China)'), $choices, '', false, false);
    }
}
PK}b�\�C���Rpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ButtonTypeTest extends BaseTypeTest
{
    public function testCreateButtonInstances()
    {
        $this->assertInstanceOf('Symfony\Component\Form\Button', $this->factory->create('button'));
    }

    protected function getTestedType()
    {
        return 'button';
    }
}
PK}b�\����Spear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Extension\Core\View\ChoiceView;
use Symfony\Component\Intl\Util\IntlTestHelper;

class CountryTypeTest extends TypeTestCase
{
    protected function setUp()
    {
        IntlTestHelper::requireIntl($this);

        parent::setUp();
    }

    public function testCountriesAreSelectable()
    {
        $form = $this->factory->create('country');
        $view = $form->createView();
        $choices = $view->vars['choices'];

        // Don't check objects for identity
        $this->assertContains(new ChoiceView('DE', 'DE', 'Germany'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('GB', 'GB', 'United Kingdom'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('US', 'US', 'United States'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('FR', 'FR', 'France'), $choices, '', false, false);
        $this->assertContains(new ChoiceView('MY', 'MY', 'Malaysia'), $choices, '', false, false);
    }

    public function testUnknownCountryIsNotIncluded()
    {
        $form = $this->factory->create('country', 'country');
        $view = $form->createView();
        $choices = $view->vars['choices'];

        foreach ($choices as $choice) {
            if ('ZZ' === $choice->value) {
                $this->fail('Should not contain choice "ZZ"');
            }
        }
    }
}
PK}b�\&����Ppear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/FileTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

class FileTypeTest extends \Symfony\Component\Form\Test\TypeTestCase
{
    // https://github.com/symfony/symfony/pull/5028
    public function testSetData()
    {
        $form = $this->factory->createBuilder('file')->getForm();
        $data = $this->createUploadedFileMock('abcdef', 'original.jpg', true);

        $form->setData($data);

        $this->assertSame($data, $form->getData());
    }

    public function testSubmit()
    {
        $form = $this->factory->createBuilder('file')->getForm();
        $data = $this->createUploadedFileMock('abcdef', 'original.jpg', true);

        $form->submit($data);

        $this->assertSame($data, $form->getData());
    }

    // https://github.com/symfony/symfony/issues/6134
    public function testSubmitEmpty()
    {
        $form = $this->factory->createBuilder('file')->getForm();

        $form->submit(null);

        $this->assertNull($form->getData());
    }

    public function testDontPassValueToView()
    {
        $form = $this->factory->create('file');
        $form->submit(array(
            'file' => $this->createUploadedFileMock('abcdef', 'original.jpg', true),
        ));
        $view = $form->createView();

        $this->assertEquals('', $view->vars['value']);
    }

    private function createUploadedFileMock($name, $originalName, $valid)
    {
        $file = $this
            ->getMockBuilder('Symfony\Component\HttpFoundation\File\UploadedFile')
            ->disableOriginalConstructor()
            ->getMock()
        ;
        $file
            ->expects($this->any())
            ->method('getBasename')
            ->will($this->returnValue($name))
        ;
        $file
            ->expects($this->any())
            ->method('getClientOriginalName')
            ->will($this->returnValue($originalName))
        ;
        $file
            ->expects($this->any())
            ->method('isValid')
            ->will($this->returnValue($valid))
        ;

        return $file;
    }
}
PK�b�\X�:::Ppear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/TypeTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

use Symfony\Component\Form\Test\TypeTestCase as BaseTypeTestCase;

/**
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use Symfony\Component\Form\Test\TypeTestCase instead.
 */
abstract class TypeTestCase extends BaseTypeTestCase
{
}
PK�b�\�{MK��Ppear/test/Form/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\Type;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class BaseTypeTest extends \Symfony\Component\Form\Test\TypeTestCase
{
    public function testPassDisabledAsOption()
    {
        $form = $this->factory->create($this->getTestedType(), null, array('disabled' => true));

        $this->assertTrue($form->isDisabled());
    }

    public function testPassIdAndNameToView()
    {
        $view = $this->factory->createNamed('name', $this->getTestedType())
            ->createView();

        $this->assertEquals('name', $view->vars['id']);
        $this->assertEquals('name', $view->vars['name']);
        $this->assertEquals('name', $view->vars['full_name']);
    }

    public function testStripLeadingUnderscoresAndDigitsFromId()
    {
        $view = $this->factory->createNamed('_09name', $this->getTestedType())
            ->createView();

        $this->assertEquals('name', $view->vars['id']);
        $this->assertEquals('_09name', $view->vars['name']);
        $this->assertEquals('_09name', $view->vars['full_name']);
    }

    public function testPassIdAndNameToViewWithParent()
    {
        $view = $this->factory->createNamedBuilder('parent', 'form')
            ->add('child', $this->getTestedType())
            ->getForm()
            ->createView();

        $this->assertEquals('parent_child', $view['child']->vars['id']);
        $this->assertEquals('child', $view['child']->vars['name']);
        $this->assertEquals('parent[child]', $view['child']->vars['full_name']);
    }

    public function testPassIdAndNameToViewWithGrandParent()
    {
        $builder = $this->factory->createNamedBuilder('parent', 'form')
            ->add('child', 'form');
        $builder->get('child')->add('grand_child', $this->getTestedType());
        $view = $builder->getForm()->createView();

        $this->assertEquals('parent_child_grand_child', $view['child']['grand_child']->vars['id']);
        $this->assertEquals('grand_child', $view['child']['grand_child']->vars['name']);
        $this->assertEquals('parent[child][grand_child]', $view['child']['grand_child']->vars['full_name']);
    }

    public function testPassTranslationDomainToView()
    {
        $form = $this->factory->create($this->getTestedType(), null, array(
            'translation_domain' => 'domain',
        ));
        $view = $form->createView();

        $this->assertSame('domain', $view->vars['translation_domain']);
    }

    public function testInheritTranslationDomainFromParent()
    {
        $view = $this->factory
            ->createNamedBuilder('parent', 'form', null, array(
                'translation_domain' => 'domain',
            ))
            ->add('child', $this->getTestedType())
            ->getForm()
            ->createView();

        $this->assertEquals('domain', $view['child']->vars['translation_domain']);
    }

    public function testPreferOwnTranslationDomain()
    {
        $view = $this->factory
            ->createNamedBuilder('parent', 'form', null, array(
                'translation_domain' => 'parent_domain',
            ))
            ->add('child', $this->getTestedType(), array(
                'translation_domain' => 'domain',
            ))
            ->getForm()
            ->createView();

        $this->assertEquals('domain', $view['child']->vars['translation_domain']);
    }

    public function testDefaultTranslationDomain()
    {
        $view = $this->factory->createNamedBuilder('parent', 'form')
            ->add('child', $this->getTestedType())
            ->getForm()
            ->createView();

        $this->assertEquals('messages', $view['child']->vars['translation_domain']);
    }

    public function testPassLabelToView()
    {
        $form = $this->factory->createNamed('__test___field', $this->getTestedType(), null, array('label' => 'My label'));
        $view = $form->createView();

        $this->assertSame('My label', $view->vars['label']);
    }

    public function testPassMultipartFalseToView()
    {
        $form = $this->factory->create($this->getTestedType());
        $view = $form->createView();

        $this->assertFalse($view->vars['multipart']);
    }

    abstract protected function getTestedType();
}
PK�b�\�.�p))Xpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ChoiceListTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\ChoiceList;

use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList;
use Symfony\Component\Form\Extension\Core\View\ChoiceView;

class ChoiceListTest extends AbstractChoiceListTest
{
    private $obj1;

    private $obj2;

    private $obj3;

    private $obj4;

    protected function setUp()
    {
        $this->obj1 = new \stdClass();
        $this->obj2 = new \stdClass();
        $this->obj3 = new \stdClass();
        $this->obj4 = new \stdClass();

        parent::setUp();
    }

    public function testInitArray()
    {
        $this->list = new ChoiceList(
            array($this->obj1, $this->obj2, $this->obj3, $this->obj4),
            array('A', 'B', 'C', 'D'),
            array($this->obj2)
        );

        $this->assertSame(array($this->obj1, $this->obj2, $this->obj3, $this->obj4), $this->list->getChoices());
        $this->assertSame(array('0', '1', '2', '3'), $this->list->getValues());
        $this->assertEquals(array(1 => new ChoiceView($this->obj2, '1', 'B')), $this->list->getPreferredViews());
        $this->assertEquals(array(0 => new ChoiceView($this->obj1, '0', 'A'), 2 => new ChoiceView($this->obj3, '2', 'C'), 3 => new ChoiceView($this->obj4, '3', 'D')), $this->list->getRemainingViews());
    }

    /**
     * Necessary for interoperability with MongoDB cursors or ORM relations as
     * choices parameter. A choice itself that is an object implementing \Traversable
     * is not treated as hierarchical structure, but as-is.
     */
    public function testInitNestedTraversable()
    {
        $traversableChoice = new \ArrayIterator(array($this->obj3, $this->obj4));

        $this->list = new ChoiceList(
            new \ArrayIterator(array(
                'Group' => array($this->obj1, $this->obj2),
                'Not a Group' => $traversableChoice
            )),
            array(
                'Group' => array('A', 'B'),
                'Not a Group' => 'C',
            ),
            array($this->obj2)
        );

        $this->assertSame(array($this->obj1, $this->obj2, $traversableChoice), $this->list->getChoices());
        $this->assertSame(array('0', '1', '2'), $this->list->getValues());
        $this->assertEquals(array(
            'Group' => array(1 => new ChoiceView($this->obj2, '1', 'B'))
        ), $this->list->getPreferredViews());
        $this->assertEquals(array(
            'Group' => array(0 => new ChoiceView($this->obj1, '0', 'A')),
            2 => new ChoiceView($traversableChoice, '2', 'C')
        ), $this->list->getRemainingViews());
    }

    public function testInitNestedArray()
    {
        $this->assertSame(array($this->obj1, $this->obj2, $this->obj3, $this->obj4), $this->list->getChoices());
        $this->assertSame(array('0', '1', '2', '3'), $this->list->getValues());
        $this->assertEquals(array(
            'Group 1' => array(1 => new ChoiceView($this->obj2, '1', 'B')),
            'Group 2' => array(2 => new ChoiceView($this->obj3, '2', 'C'))
        ), $this->list->getPreferredViews());
        $this->assertEquals(array(
            'Group 1' => array(0 => new ChoiceView($this->obj1, '0', 'A')),
            'Group 2' => array(3 => new ChoiceView($this->obj4, '3', 'D'))
        ), $this->list->getRemainingViews());
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testInitWithInsufficientLabels()
    {
        $this->list = new ChoiceList(
            array($this->obj1, $this->obj2),
            array('A')
        );
    }

    public function testInitWithLabelsContainingNull()
    {
        $this->list = new ChoiceList(
            array($this->obj1, $this->obj2),
            array('A', null)
        );

        $this->assertEquals(
            array(0 => new ChoiceView($this->obj1, '0', 'A'), 1 => new ChoiceView($this->obj2, '1', null)),
            $this->list->getRemainingViews()
        );
    }

    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        return new ChoiceList(
            array(
                'Group 1' => array($this->obj1, $this->obj2),
                'Group 2' => array($this->obj3, $this->obj4),
            ),
            array(
                'Group 1' => array('A', 'B'),
                'Group 2' => array('C', 'D'),
            ),
            array($this->obj2, $this->obj3)
        );
    }

    protected function getChoices()
    {
        return array(0 => $this->obj1, 1 => $this->obj2, 2 => $this->obj3, 3 => $this->obj4);
    }

    protected function getLabels()
    {
        return array(0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D');
    }

    protected function getValues()
    {
        return array(0 => '0', 1 => '1', 2 => '2', 3 => '3');
    }

    protected function getIndices()
    {
        return array(0, 1, 2, 3);
    }
}
PK�b�\R��
�
^pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleChoiceListTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\ChoiceList;

use Symfony\Component\Form\Extension\Core\ChoiceList\SimpleChoiceList;
use Symfony\Component\Form\Extension\Core\View\ChoiceView;

class SimpleChoiceListTest extends AbstractChoiceListTest
{
    public function testInitArray()
    {
        $choices = array('a' => 'A', 'b' => 'B', 'c' => 'C');
        $this->list = new SimpleChoiceList($choices, array('b'));

        $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c'), $this->list->getChoices());
        $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c'), $this->list->getValues());
        $this->assertEquals(array(1 => new ChoiceView('b', 'b', 'B')), $this->list->getPreferredViews());
        $this->assertEquals(array(0 => new ChoiceView('a', 'a', 'A'), 2 => new ChoiceView('c', 'c', 'C')), $this->list->getRemainingViews());
    }

    public function testInitNestedArray()
    {
        $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd'), $this->list->getChoices());
        $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd'), $this->list->getValues());
        $this->assertEquals(array(
            'Group 1' => array(1 => new ChoiceView('b', 'b', 'B')),
            'Group 2' => array(2 => new ChoiceView('c', 'c', 'C'))
        ), $this->list->getPreferredViews());
        $this->assertEquals(array(
            'Group 1' => array(0 => new ChoiceView('a', 'a', 'A')),
            'Group 2' => array(3 => new ChoiceView('d', 'd', 'D'))
        ), $this->list->getRemainingViews());
    }

    /**
     * @dataProvider dirtyValuesProvider
     */
    public function testGetValuesForChoicesDealsWithDirtyValues($choice, $value)
    {
        $choices = array(
            '0' => 'Zero',
            '1' => 'One',
            '' => 'Empty',
            '1.23' => 'Float',
            'foo' => 'Foo',
            'foo10' => 'Foo 10',
        );

        $this->list = new SimpleChoiceList($choices, array());

        $this->assertSame(array($value), $this->list->getValuesForChoices(array($choice)));
    }

    public function dirtyValuesProvider()
    {
        return array(
            array(0, '0'),
            array('0', '0'),
            array('1', '1'),
            array(false, '0'),
            array(true, '1'),
            array('', ''),
            array(null, ''),
            array('1.23', '1.23'),
            array('foo', 'foo'),
            array('foo10', 'foo10'),
        );
    }

    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        return new SimpleChoiceList(array(
            'Group 1' => array('a' => 'A', 'b' => 'B'),
            'Group 2' => array('c' => 'C', 'd' => 'D'),
        ), array('b', 'c'));
    }

    protected function getChoices()
    {
        return array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd');
    }

    protected function getLabels()
    {
        return array(0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D');
    }

    protected function getValues()
    {
        return array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd');
    }

    protected function getIndices()
    {
        return array(0, 1, 2, 3);
    }
}
PK�b�\��x��epear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleNumericChoiceListTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\ChoiceList;

use Symfony\Component\Form\Extension\Core\ChoiceList\SimpleChoiceList;

class SimpleNumericChoiceListTest extends AbstractChoiceListTest
{
    public function testGetIndicesForChoicesDealsWithNumericChoices()
    {
        // Pass choices as strings although they are integers
        $choices = array('0', '1');
        $this->assertSame(array(0, 1), $this->list->getIndicesForChoices($choices));
    }

    public function testGetIndicesForValuesDealsWithNumericValues()
    {
        // Pass values as strings although they are integers
        $values = array('0', '1');
        $this->assertSame(array(0, 1), $this->list->getIndicesForValues($values));
    }

    public function testGetChoicesForValuesDealsWithNumericValues()
    {
        // Pass values as strings although they are integers
        $values = array('0', '1');
        $this->assertSame(array(0, 1), $this->list->getChoicesForValues($values));
    }

    public function testGetValuesForChoicesDealsWithNumericValues()
    {
        // Pass values as strings although they are integers
        $values = array('0', '1');

        $this->assertSame(array('0', '1'), $this->list->getValuesForChoices($values));
    }

    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        return new SimpleChoiceList(array(
            'Group 1' => array(0 => 'A', 1 => 'B'),
            'Group 2' => array(2 => 'C', 3 => 'D'),
        ), array(1, 2));
    }

    protected function getChoices()
    {
        return array(0 => 0, 1 => 1, 2 => 2, 3 => 3);
    }

    protected function getLabels()
    {
        return array(0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D');
    }

    protected function getValues()
    {
        return array(0 => '0', 1 => '1', 2 => '2', 3 => '3');
    }

    protected function getIndices()
    {
        return array(0, 1, 2, 3);
    }
}
PK�b�\���� � ^pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ObjectChoiceListTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\ChoiceList;

use Symfony\Component\Form\Extension\Core\ChoiceList\ObjectChoiceList;
use Symfony\Component\Form\Extension\Core\View\ChoiceView;

class ObjectChoiceListTest_EntityWithToString
{
    private $property;

    public function __construct($property)
    {
        $this->property = $property;
    }

    public function __toString()
    {
        return $this->property;
    }
}

class ObjectChoiceListTest extends AbstractChoiceListTest
{
    private $obj1;

    private $obj2;

    private $obj3;

    private $obj4;

    protected function setUp()
    {
        $this->obj1 = (object) array('name' => 'A');
        $this->obj2 = (object) array('name' => 'B');
        $this->obj3 = (object) array('name' => 'C');
        $this->obj4 = (object) array('name' => 'D');

        parent::setUp();
    }

    public function testInitArray()
    {
        $this->list = new ObjectChoiceList(
            array($this->obj1, $this->obj2, $this->obj3, $this->obj4),
            'name',
            array($this->obj2)
        );

        $this->assertSame(array($this->obj1, $this->obj2, $this->obj3, $this->obj4), $this->list->getChoices());
        $this->assertSame(array('0', '1', '2', '3'), $this->list->getValues());
        $this->assertEquals(array(1 => new ChoiceView($this->obj2, '1', 'B')), $this->list->getPreferredViews());
        $this->assertEquals(array(0 => new ChoiceView($this->obj1, '0', 'A'), 2 => new ChoiceView($this->obj3, '2', 'C'), 3 => new ChoiceView($this->obj4, '3', 'D')), $this->list->getRemainingViews());
    }

    public function testInitNestedArray()
    {
        $this->assertSame(array($this->obj1, $this->obj2, $this->obj3, $this->obj4), $this->list->getChoices());
        $this->assertSame(array('0', '1', '2', '3'), $this->list->getValues());
        $this->assertEquals(array(
            'Group 1' => array(1 => new ChoiceView($this->obj2, '1', 'B')),
            'Group 2' => array(2 => new ChoiceView($this->obj3, '2', 'C'))
        ), $this->list->getPreferredViews());
        $this->assertEquals(array(
            'Group 1' => array(0 => new ChoiceView($this->obj1, '0', 'A')),
            'Group 2' => array(3 => new ChoiceView($this->obj4, '3', 'D'))
        ), $this->list->getRemainingViews());
    }

    public function testInitArrayWithGroupPath()
    {
        $this->obj1 = (object) array('name' => 'A', 'category' => 'Group 1');
        $this->obj2 = (object) array('name' => 'B', 'category' => 'Group 1');
        $this->obj3 = (object) array('name' => 'C', 'category' => 'Group 2');
        $this->obj4 = (object) array('name' => 'D', 'category' => 'Group 2');

        // Objects with NULL groups are not grouped
        $obj5 = (object) array('name' => 'E', 'category' => null);

        // Objects without the group property are not grouped either
        // see https://github.com/symfony/symfony/commit/d9b7abb7c7a0f28e0ce970afc5e305dce5dccddf
        $obj6 = (object) array('name' => 'F');

        $this->list = new ObjectChoiceList(
            array($this->obj1, $this->obj2, $this->obj3, $this->obj4, $obj5, $obj6),
            'name',
            array($this->obj2, $this->obj3),
            'category'
        );

        $this->assertSame(array($this->obj1, $this->obj2, $this->obj3, $this->obj4, $obj5, $obj6), $this->list->getChoices());
        $this->assertSame(array('0', '1', '2', '3', '4', '5'), $this->list->getValues());
        $this->assertEquals(array(
            'Group 1' => array(1 => new ChoiceView($this->obj2, '1', 'B')),
            'Group 2' => array(2 => new ChoiceView($this->obj3, '2', 'C'))
        ), $this->list->getPreferredViews());
        $this->assertEquals(array(
            'Group 1' => array(0 => new ChoiceView($this->obj1, '0', 'A')),
            'Group 2' => array(3 => new ChoiceView($this->obj4, '3', 'D')),
            4 => new ChoiceView($obj5, '4', 'E'),
            5 => new ChoiceView($obj6, '5', 'F'),
        ), $this->list->getRemainingViews());
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testInitArrayWithGroupPathThrowsExceptionIfNestedArray()
    {
        $this->obj1 = (object) array('name' => 'A', 'category' => 'Group 1');
        $this->obj2 = (object) array('name' => 'B', 'category' => 'Group 1');
        $this->obj3 = (object) array('name' => 'C', 'category' => 'Group 2');
        $this->obj4 = (object) array('name' => 'D', 'category' => 'Group 2');

        new ObjectChoiceList(
            array(
                'Group 1' => array($this->obj1, $this->obj2),
                'Group 2' => array($this->obj3, $this->obj4),
            ),
            'name',
            array($this->obj2, $this->obj3),
            'category'
        );
    }

    public function testInitArrayWithValuePath()
    {
        $this->obj1 = (object) array('name' => 'A', 'id' => 10);
        $this->obj2 = (object) array('name' => 'B', 'id' => 20);
        $this->obj3 = (object) array('name' => 'C', 'id' => 30);
        $this->obj4 = (object) array('name' => 'D', 'id' => 40);

        $this->list = new ObjectChoiceList(
            array($this->obj1, $this->obj2, $this->obj3, $this->obj4),
            'name',
            array($this->obj2, $this->obj3),
            null,
            'id'
        );

        $this->assertSame(array($this->obj1, $this->obj2, $this->obj3, $this->obj4), $this->list->getChoices());
        $this->assertSame(array('10', '20', '30', '40'), $this->list->getValues());
        $this->assertEquals(array(1 => new ChoiceView($this->obj2, '20', 'B'), 2 => new ChoiceView($this->obj3, '30', 'C')), $this->list->getPreferredViews());
        $this->assertEquals(array(0 => new ChoiceView($this->obj1, '10', 'A'), 3 => new ChoiceView($this->obj4, '40', 'D')), $this->list->getRemainingViews());
    }

    public function testInitArrayUsesToString()
    {
        $this->obj1 = new ObjectChoiceListTest_EntityWithToString('A');
        $this->obj2 = new ObjectChoiceListTest_EntityWithToString('B');
        $this->obj3 = new ObjectChoiceListTest_EntityWithToString('C');
        $this->obj4 = new ObjectChoiceListTest_EntityWithToString('D');

        $this->list = new ObjectChoiceList(
            array($this->obj1, $this->obj2, $this->obj3, $this->obj4)
        );

        $this->assertSame(array($this->obj1, $this->obj2, $this->obj3, $this->obj4), $this->list->getChoices());
        $this->assertSame(array('0', '1', '2', '3'), $this->list->getValues());
        $this->assertEquals(array(0 => new ChoiceView($this->obj1, '0', 'A'), 1 => new ChoiceView($this->obj2, '1', 'B'), 2 => new ChoiceView($this->obj3, '2', 'C'), 3 => new ChoiceView($this->obj4, '3', 'D')), $this->list->getRemainingViews());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\StringCastException
     */
    public function testInitArrayThrowsExceptionIfToStringNotFound()
    {
        $this->obj1 = new ObjectChoiceListTest_EntityWithToString('A');
        $this->obj2 = new ObjectChoiceListTest_EntityWithToString('B');
        $this->obj3 = (object) array('name' => 'C');
        $this->obj4 = new ObjectChoiceListTest_EntityWithToString('D');

        new ObjectChoiceList(
            array($this->obj1, $this->obj2, $this->obj3, $this->obj4)
        );
    }

    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected function createChoiceList()
    {
        return new ObjectChoiceList(
            array(
                'Group 1' => array($this->obj1, $this->obj2),
                'Group 2' => array($this->obj3, $this->obj4),
            ),
            'name',
            array($this->obj2, $this->obj3)
        );
    }

    protected function getChoices()
    {
        return array(0 => $this->obj1, 1 => $this->obj2, 2 => $this->obj3, 3 => $this->obj4);
    }

    protected function getLabels()
    {
        return array(0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D');
    }

    protected function getValues()
    {
        return array(0 => '0', 1 => '1', 2 => '2', 3 => '3');
    }

    protected function getIndices()
    {
        return array(0, 1, 2, 3);
    }
}
PK�b�\�gUI��\pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/LazyChoiceListTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\ChoiceList;

use Symfony\Component\Form\Extension\Core\ChoiceList\SimpleChoiceList;
use Symfony\Component\Form\Extension\Core\ChoiceList\LazyChoiceList;
use Symfony\Component\Form\Extension\Core\View\ChoiceView;

class LazyChoiceListTest extends \PHPUnit_Framework_TestCase
{
    private $list;

    protected function setUp()
    {
        parent::setUp();

        $this->list = new LazyChoiceListTest_Impl(new SimpleChoiceList(array(
            'a' => 'A',
            'b' => 'B',
            'c' => 'C',
        ), array('b')));
    }

    protected function tearDown()
    {
        parent::tearDown();

        $this->list = null;
    }

    public function testGetChoices()
    {
        $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c'), $this->list->getChoices());
    }

    public function testGetValues()
    {
        $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c'), $this->list->getValues());
    }

    public function testGetPreferredViews()
    {
        $this->assertEquals(array(1 => new ChoiceView('b', 'b', 'B')), $this->list->getPreferredViews());
    }

    public function testGetRemainingViews()
    {
        $this->assertEquals(array(0 => new ChoiceView('a', 'a', 'A'), 2 => new ChoiceView('c', 'c', 'C')), $this->list->getRemainingViews());
    }

    public function testGetIndicesForChoices()
    {
        $choices = array('b', 'c');
        $this->assertSame(array(1, 2), $this->list->getIndicesForChoices($choices));
    }

    public function testGetIndicesForValues()
    {
        $values = array('b', 'c');
        $this->assertSame(array(1, 2), $this->list->getIndicesForValues($values));
    }

    public function testGetChoicesForValues()
    {
        $values = array('b', 'c');
        $this->assertSame(array('b', 'c'), $this->list->getChoicesForValues($values));
    }

    public function testGetValuesForChoices()
    {
        $choices = array('b', 'c');
        $this->assertSame(array('b', 'c'), $this->list->getValuesForChoices($choices));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
     */
    public function testLoadChoiceListShouldReturnChoiceList()
    {
        $list = new LazyChoiceListTest_InvalidImpl();

        $list->getChoices();
    }
}

class LazyChoiceListTest_Impl extends LazyChoiceList
{
    private $choiceList;

    public function __construct($choiceList)
    {
        $this->choiceList = $choiceList;
    }

    protected function loadChoiceList()
    {
        return $this->choiceList;
    }
}

class LazyChoiceListTest_InvalidImpl extends LazyChoiceList
{
    protected function loadChoiceList()
    {
        return new \stdClass();
    }
}
PK�b�\�![���`pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/AbstractChoiceListTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\ChoiceList;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class AbstractChoiceListTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    protected $list;

    /**
     * @var array
     */
    protected $choices;

    /**
     * @var array
     */
    protected $values;

    /**
     * @var array
     */
    protected $indices;

    /**
     * @var array
     */
    protected $labels;

    /**
     * @var mixed
     */
    protected $choice1;

    /**
     * @var mixed
     */
    protected $choice2;

    /**
     * @var mixed
     */
    protected $choice3;

    /**
     * @var mixed
     */
    protected $choice4;

    /**
     * @var string
     */
    protected $value1;

    /**
     * @var string
     */
    protected $value2;

    /**
     * @var string
     */
    protected $value3;

    /**
     * @var string
     */
    protected $value4;

    /**
     * @var int|string
     */
    protected $index1;

    /**
     * @var int|string
     */
    protected $index2;

    /**
     * @var int|string
     */
    protected $index3;

    /**
     * @var int|string
     */
    protected $index4;

    /**
     * @var string
     */
    protected $label1;

    /**
     * @var string
     */
    protected $label2;

    /**
     * @var string
     */
    protected $label3;

    /**
     * @var string
     */
    protected $label4;

    protected function setUp()
    {
        parent::setUp();

        $this->list = $this->createChoiceList();

        $this->choices = $this->getChoices();
        $this->indices = $this->getIndices();
        $this->values = $this->getValues();
        $this->labels = $this->getLabels();

        // allow access to the individual entries without relying on their indices
        reset($this->choices);
        reset($this->indices);
        reset($this->values);
        reset($this->labels);

        for ($i = 1; $i <= 4; ++$i) {
            $this->{'choice'.$i} = current($this->choices);
            $this->{'index'.$i} = current($this->indices);
            $this->{'value'.$i} = current($this->values);
            $this->{'label'.$i} = current($this->labels);

            next($this->choices);
            next($this->indices);
            next($this->values);
            next($this->labels);
        }
    }

    public function testGetChoices()
    {
        $this->assertSame($this->choices, $this->list->getChoices());
    }

    public function testGetValues()
    {
        $this->assertSame($this->values, $this->list->getValues());
    }

    public function testGetIndicesForChoices()
    {
        $choices = array($this->choice1, $this->choice2);
        $this->assertSame(array($this->index1, $this->index2), $this->list->getIndicesForChoices($choices));
    }

    public function testGetIndicesForChoicesPreservesKeys()
    {
        $choices = array(5 => $this->choice1, 8 => $this->choice2);
        $this->assertSame(array(5 => $this->index1, 8 => $this->index2), $this->list->getIndicesForChoices($choices));
    }

    public function testGetIndicesForChoicesPreservesOrder()
    {
        $choices = array($this->choice2, $this->choice1);
        $this->assertSame(array($this->index2, $this->index1), $this->list->getIndicesForChoices($choices));
    }

    public function testGetIndicesForChoicesIgnoresNonExistingChoices()
    {
        $choices = array($this->choice1, $this->choice2, 'foobar');
        $this->assertSame(array($this->index1, $this->index2), $this->list->getIndicesForChoices($choices));
    }

    public function testGetIndicesForChoicesEmpty()
    {
        $this->assertSame(array(), $this->list->getIndicesForChoices(array()));
    }

    public function testGetIndicesForValues()
    {
        // values and indices are always the same
        $values = array($this->value1, $this->value2);
        $this->assertSame(array($this->index1, $this->index2), $this->list->getIndicesForValues($values));
    }

    public function testGetIndicesForValuesPreservesKeys()
    {
        // values and indices are always the same
        $values = array(5 => $this->value1, 8 => $this->value2);
        $this->assertSame(array(5 => $this->index1, 8 => $this->index2), $this->list->getIndicesForValues($values));
    }

    public function testGetIndicesForValuesPreservesOrder()
    {
        $values = array($this->value2, $this->value1);
        $this->assertSame(array($this->index2, $this->index1), $this->list->getIndicesForValues($values));
    }

    public function testGetIndicesForValuesIgnoresNonExistingValues()
    {
        $values = array($this->value1, $this->value2, 'foobar');
        $this->assertSame(array($this->index1, $this->index2), $this->list->getIndicesForValues($values));
    }

    public function testGetIndicesForValuesEmpty()
    {
        $this->assertSame(array(), $this->list->getIndicesForValues(array()));
    }

    public function testGetChoicesForValues()
    {
        $values = array($this->value1, $this->value2);
        $this->assertSame(array($this->choice1, $this->choice2), $this->list->getChoicesForValues($values));
    }

    public function testGetChoicesForValuesPreservesKeys()
    {
        $values = array(5 => $this->value1, 8 => $this->value2);
        $this->assertSame(array(5 => $this->choice1, 8 => $this->choice2), $this->list->getChoicesForValues($values));
    }

    public function testGetChoicesForValuesPreservesOrder()
    {
        $values = array($this->value2, $this->value1);
        $this->assertSame(array($this->choice2, $this->choice1), $this->list->getChoicesForValues($values));
    }

    public function testGetChoicesForValuesIgnoresNonExistingValues()
    {
        $values = array($this->value1, $this->value2, 'foobar');
        $this->assertSame(array($this->choice1, $this->choice2), $this->list->getChoicesForValues($values));
    }

    // https://github.com/symfony/symfony/issues/3446
    public function testGetChoicesForValuesEmpty()
    {
        $this->assertSame(array(), $this->list->getChoicesForValues(array()));
    }

    public function testGetValuesForChoices()
    {
        $choices = array($this->choice1, $this->choice2);
        $this->assertSame(array($this->value1, $this->value2), $this->list->getValuesForChoices($choices));
    }

    public function testGetValuesForChoicesPreservesKeys()
    {
        $choices = array(5 => $this->choice1, 8 => $this->choice2);
        $this->assertSame(array(5 => $this->value1, 8 => $this->value2), $this->list->getValuesForChoices($choices));
    }

    public function testGetValuesForChoicesPreservesOrder()
    {
        $choices = array($this->choice2, $this->choice1);
        $this->assertSame(array($this->value2, $this->value1), $this->list->getValuesForChoices($choices));
    }

    public function testGetValuesForChoicesIgnoresNonExistingChoices()
    {
        $choices = array($this->choice1, $this->choice2, 'foobar');
        $this->assertSame(array($this->value1, $this->value2), $this->list->getValuesForChoices($choices));
    }

    public function testGetValuesForChoicesEmpty()
    {
        $this->assertSame(array(), $this->list->getValuesForChoices(array()));
    }

    /**
     * @return \Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceListInterface
     */
    abstract protected function createChoiceList();

    abstract protected function getChoices();

    abstract protected function getLabels();

    abstract protected function getValues();

    abstract protected function getIndices();
}
PK�b�\fk5s3	3	]pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/TrimListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Core\EventListener\TrimListener;

class TrimListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testTrim()
    {
        $data = " Foo! ";
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $filter = new TrimListener();
        $filter->preSubmit($event);

        $this->assertEquals('Foo!', $event->getData());
    }

    public function testTrimSkipNonStrings()
    {
        $data = 1234;
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $filter = new TrimListener();
        $filter->preSubmit($event);

        $this->assertSame(1234, $event->getData());
    }

    /**
     * @dataProvider codePointProvider
     */
    public function testTrimUtf8($chars)
    {
        if (!function_exists('mb_check_encoding')) {
            $this->markTestSkipped('The "mb_check_encoding" function is not available');
        }

        $data = mb_convert_encoding(pack('H*', implode('', $chars)), 'UTF-8', 'UCS-2BE');
        $data = $data."ab\ncd".$data;

        $form  = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $filter = new TrimListener();
        $filter->preSubmit($event);

        $this->assertSame("ab\ncd", $event->getData(), 'TrimListener should trim character(s): '.implode(', ', $chars));
    }

    public function codePointProvider()
    {
        return array(
            'General category: Separator' => array(array('0020', '00A0', '1680', '180E', '2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '200A', '2028', '2029', '202F', '205F', '3000')),
            'General category: Other, control' => array(array('0009', '000A', '000B', '000C', '000D', '0085')),
            //'General category: Other, format. ZERO WIDTH SPACE' => array(array('200B')),
        );
    }
}
PK�b�\B+�K��spear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayObjectTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\EventListener;

use Symfony\Component\Form\FormBuilder;

class MergeCollectionListenerArrayObjectTest extends MergeCollectionListenerTest
{
    protected function getData(array $data)
    {
        return new \ArrayObject($data);
    }

    protected function getBuilder($name = 'name')
    {
        return new FormBuilder($name, '\ArrayObject', $this->dispatcher, $this->factory);
    }
}
PK�b�\�O�&hpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Core\EventListener\MergeCollectionListener;

abstract class MergeCollectionListenerTest extends \PHPUnit_Framework_TestCase
{
    protected $dispatcher;
    protected $factory;
    protected $form;

    protected function setUp()
    {
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
        $this->form = $this->getForm('axes');
    }

    protected function tearDown()
    {
        $this->dispatcher = null;
        $this->factory = null;
        $this->form = null;
    }

    abstract protected function getBuilder($name = 'name');

    protected function getForm($name = 'name', $propertyPath = null)
    {
        $propertyPath = $propertyPath ?: $name;

        return $this->getBuilder($name)->setAttribute('property_path', $propertyPath)->getForm();
    }

    protected function getMockForm()
    {
        return $this->getMock('Symfony\Component\Form\Test\FormInterface');
    }

    public function getBooleanMatrix1()
    {
        return array(
            array(true),
            array(false),
        );
    }

    public function getBooleanMatrix2()
    {
        return array(
            array(true, true),
            array(true, false),
            array(false, true),
            array(false, false),
        );
    }

    abstract protected function getData(array $data);

    /**
     * @dataProvider getBooleanMatrix1
     */
    public function testAddExtraEntriesIfAllowAdd($allowDelete)
    {
        $originalData = $this->getData(array(1 => 'second'));
        $newData = $this->getData(array(0 => 'first', 1 => 'second', 2 => 'third'));

        $listener = new MergeCollectionListener(true, $allowDelete);

        $this->form->setData($originalData);

        $event = new FormEvent($this->form, $newData);
        $listener->onSubmit($event);

        // The original object was modified
        if (is_object($originalData)) {
            $this->assertSame($originalData, $event->getData());
        }

        // The original object matches the new object
        $this->assertEquals($newData, $event->getData());
    }

    /**
     * @dataProvider getBooleanMatrix1
     */
    public function testAddExtraEntriesIfAllowAddDontOverwriteExistingIndices($allowDelete)
    {
        $originalData = $this->getData(array(1 => 'first'));
        $newData = $this->getData(array(0 => 'first', 1 => 'second'));

        $listener = new MergeCollectionListener(true, $allowDelete);

        $this->form->setData($originalData);

        $event = new FormEvent($this->form, $newData);
        $listener->onSubmit($event);

        // The original object was modified
        if (is_object($originalData)) {
            $this->assertSame($originalData, $event->getData());
        }

        // The original object matches the new object
        $this->assertEquals($this->getData(array(1 => 'first', 2 => 'second')), $event->getData());
    }

    /**
     * @dataProvider getBooleanMatrix1
     */
    public function testDoNothingIfNotAllowAdd($allowDelete)
    {
        $originalDataArray = array(1 => 'second');
        $originalData = $this->getData($originalDataArray);
        $newData = $this->getData(array(0 => 'first', 1 => 'second', 2 => 'third'));

        $listener = new MergeCollectionListener(false, $allowDelete);

        $this->form->setData($originalData);

        $event = new FormEvent($this->form, $newData);
        $listener->onSubmit($event);

        // We still have the original object
        if (is_object($originalData)) {
            $this->assertSame($originalData, $event->getData());
        }

        // Nothing was removed
        $this->assertEquals($this->getData($originalDataArray), $event->getData());
    }

    /**
     * @dataProvider getBooleanMatrix1
     */
    public function testRemoveMissingEntriesIfAllowDelete($allowAdd)
    {
        $originalData = $this->getData(array(0 => 'first', 1 => 'second', 2 => 'third'));
        $newData = $this->getData(array(1 => 'second'));

        $listener = new MergeCollectionListener($allowAdd, true);

        $this->form->setData($originalData);

        $event = new FormEvent($this->form, $newData);
        $listener->onSubmit($event);

        // The original object was modified
        if (is_object($originalData)) {
            $this->assertSame($originalData, $event->getData());
        }

        // The original object matches the new object
        $this->assertEquals($newData, $event->getData());
    }

    /**
     * @dataProvider getBooleanMatrix1
     */
    public function testDoNothingIfNotAllowDelete($allowAdd)
    {
        $originalDataArray = array(0 => 'first', 1 => 'second', 2 => 'third');
        $originalData = $this->getData($originalDataArray);
        $newData = $this->getData(array(1 => 'second'));

        $listener = new MergeCollectionListener($allowAdd, false);

        $this->form->setData($originalData);

        $event = new FormEvent($this->form, $newData);
        $listener->onSubmit($event);

        // We still have the original object
        if (is_object($originalData)) {
            $this->assertSame($originalData, $event->getData());
        }

        // Nothing was removed
        $this->assertEquals($this->getData($originalDataArray), $event->getData());
    }

    /**
     * @dataProvider getBooleanMatrix2
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testRequireArrayOrTraversable($allowAdd, $allowDelete)
    {
        $newData = 'no array or traversable';
        $event = new FormEvent($this->form, $newData);
        $listener = new MergeCollectionListener($allowAdd, $allowDelete);
        $listener->onSubmit($event);
    }

    public function testDealWithNullData()
    {
        $originalData = $this->getData(array(0 => 'first', 1 => 'second', 2 => 'third'));
        $newData = null;

        $listener = new MergeCollectionListener(false, false);

        $this->form->setData($originalData);

        $event = new FormEvent($this->form, $newData);
        $listener->onSubmit($event);

        $this->assertSame($originalData, $event->getData());
    }

    /**
     * @dataProvider getBooleanMatrix1
     */
    public function testDealWithNullOriginalDataIfAllowAdd($allowDelete)
    {
        $originalData = null;
        $newData = $this->getData(array(0 => 'first', 1 => 'second', 2 => 'third'));

        $listener = new MergeCollectionListener(true, $allowDelete);

        $this->form->setData($originalData);

        $event = new FormEvent($this->form, $newData);
        $listener->onSubmit($event);

        $this->assertSame($newData, $event->getData());
    }

    /**
     * @dataProvider getBooleanMatrix1
     */
    public function testDontDealWithNullOriginalDataIfNotAllowAdd($allowDelete)
    {
        $originalData = null;
        $newData = $this->getData(array(0 => 'first', 1 => 'second', 2 => 'third'));

        $listener = new MergeCollectionListener(false, $allowDelete);

        $this->form->setData($originalData);

        $event = new FormEvent($this->form, $newData);
        $listener->onSubmit($event);

        $this->assertNull($event->getData());
    }
}
PK�b�\��**fpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/FixRadioInputListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Core\EventListener\FixRadioInputListener;
use Symfony\Component\Form\Extension\Core\ChoiceList\SimpleChoiceList;

class FixRadioInputListenerTest extends \PHPUnit_Framework_TestCase
{
    private $choiceList;

    protected function setUp()
    {
        parent::setUp();

        $this->choiceList = new SimpleChoiceList(array('' => 'Empty', 0 => 'A', 1 => 'B'));
    }

    protected function tearDown()
    {
        parent::tearDown();

        $listener = null;
    }

    public function testFixRadio()
    {
        $data = '1';
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $listener = new FixRadioInputListener($this->choiceList, true);
        $listener->preSubmit($event);

        // Indices in SimpleChoiceList are zero-based generated integers
        $this->assertEquals(array(2 => '1'), $event->getData());
    }

    public function testFixZero()
    {
        $data = '0';
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $listener = new FixRadioInputListener($this->choiceList, true);
        $listener->preSubmit($event);

        // Indices in SimpleChoiceList are zero-based generated integers
        $this->assertEquals(array(1 => '0'), $event->getData());
    }

    public function testFixEmptyString()
    {
        $data = '';
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $listener = new FixRadioInputListener($this->choiceList, true);
        $listener->preSubmit($event);

        // Indices in SimpleChoiceList are zero-based generated integers
        $this->assertEquals(array(0 => ''), $event->getData());
    }

    public function testConvertEmptyStringToPlaceholderIfNotFound()
    {
        $list = new SimpleChoiceList(array(0 => 'A', 1 => 'B'));

        $data = '';
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $listener = new FixRadioInputListener($list, true);
        $listener->preSubmit($event);

        $this->assertEquals(array('placeholder' => ''), $event->getData());
    }

    public function testDontConvertEmptyStringToPlaceholderIfNoPlaceholderUsed()
    {
        $list = new SimpleChoiceList(array(0 => 'A', 1 => 'B'));

        $data = '';
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $listener = new FixRadioInputListener($list, false);
        $listener->preSubmit($event);

        $this->assertEquals(array(), $event->getData());
    }
}
PK�b�\��!��$�$cpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\EventListener;

use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Form\Extension\Core\EventListener\ResizeFormListener;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormEvent;

class ResizeFormListenerTest extends \PHPUnit_Framework_TestCase
{
    private $dispatcher;
    private $factory;
    private $form;

    protected function setUp()
    {
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
        $this->form = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
    }

    protected function tearDown()
    {
        $this->dispatcher = null;
        $this->factory = null;
        $this->form = null;
    }

    protected function getBuilder($name = 'name')
    {
        return new FormBuilder($name, null, $this->dispatcher, $this->factory);
    }

    protected function getForm($name = 'name')
    {
        return $this->getBuilder($name)->getForm();
    }

    /**
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    private function getDataMapper()
    {
        return $this->getMock('Symfony\Component\Form\DataMapperInterface');
    }

    protected function getMockForm()
    {
        return $this->getMock('Symfony\Component\Form\Test\FormInterface');
    }

    public function testPreSetDataResizesForm()
    {
        $this->form->add($this->getForm('0'));
        $this->form->add($this->getForm('1'));

        $this->factory->expects($this->at(0))
            ->method('createNamed')
            ->with(1, 'text', null, array('property_path' => '[1]', 'max_length' => 10, 'auto_initialize' => false))
            ->will($this->returnValue($this->getForm('1')));
        $this->factory->expects($this->at(1))
            ->method('createNamed')
            ->with(2, 'text', null, array('property_path' => '[2]', 'max_length' => 10, 'auto_initialize' => false))
            ->will($this->returnValue($this->getForm('2')));

        $data = array(1 => 'string', 2 => 'string');
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array('max_length' => '10'), false, false);
        $listener->preSetData($event);

        $this->assertFalse($this->form->has('0'));
        $this->assertTrue($this->form->has('1'));
        $this->assertTrue($this->form->has('2'));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testPreSetDataRequiresArrayOrTraversable()
    {
        $data = 'no array or traversable';
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, false);
        $listener->preSetData($event);
    }

    public function testPreSetDataDealsWithNullData()
    {
        $this->factory->expects($this->never())->method('createNamed');

        $data = null;
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, false);
        $listener->preSetData($event);
    }

    public function testPreSubmitResizesUpIfAllowAdd()
    {
        $this->form->add($this->getForm('0'));

        $this->factory->expects($this->once())
            ->method('createNamed')
            ->with(1, 'text', null, array('property_path' => '[1]', 'max_length' => 10, 'auto_initialize' => false))
            ->will($this->returnValue($this->getForm('1')));

        $data = array(0 => 'string', 1 => 'string');
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array('max_length' => 10), true, false);
        $listener->preSubmit($event);

        $this->assertTrue($this->form->has('0'));
        $this->assertTrue($this->form->has('1'));
    }

    public function testPreSubmitResizesDownIfAllowDelete()
    {
        $this->form->add($this->getForm('0'));
        $this->form->add($this->getForm('1'));

        $data = array(0 => 'string');
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, true);
        $listener->preSubmit($event);

        $this->assertTrue($this->form->has('0'));
        $this->assertFalse($this->form->has('1'));
    }

    // fix for https://github.com/symfony/symfony/pull/493
    public function testPreSubmitRemovesZeroKeys()
    {
        $this->form->add($this->getForm('0'));

        $data = array();
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, true);
        $listener->preSubmit($event);

        $this->assertFalse($this->form->has('0'));
    }

    public function testPreSubmitDoesNothingIfNotAllowAddNorAllowDelete()
    {
        $this->form->add($this->getForm('0'));
        $this->form->add($this->getForm('1'));

        $data = array(0 => 'string', 2 => 'string');
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, false);
        $listener->preSubmit($event);

        $this->assertTrue($this->form->has('0'));
        $this->assertTrue($this->form->has('1'));
        $this->assertFalse($this->form->has('2'));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testPreSubmitRequiresArrayOrTraversable()
    {
        $data = 'no array or traversable';
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, false);
        $listener->preSubmit($event);
    }

    public function testPreSubmitDealsWithNullData()
    {
        $this->form->add($this->getForm('1'));

        $data = null;
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, true);
        $listener->preSubmit($event);

        $this->assertFalse($this->form->has('1'));
    }

    // fixes https://github.com/symfony/symfony/pull/40
    public function testPreSubmitDealsWithEmptyData()
    {
        $this->form->add($this->getForm('1'));

        $data = '';
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, true);
        $listener->preSubmit($event);

        $this->assertFalse($this->form->has('1'));
    }

    public function testOnSubmitNormDataRemovesEntriesMissingInTheFormIfAllowDelete()
    {
        $this->form->add($this->getForm('1'));

        $data = array(0 => 'first', 1 => 'second', 2 => 'third');
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, true);
        $listener->onSubmit($event);

        $this->assertEquals(array(1 => 'second'), $event->getData());
    }

    public function testOnSubmitNormDataDoesNothingIfNotAllowDelete()
    {
        $this->form->add($this->getForm('1'));

        $data = array(0 => 'first', 1 => 'second', 2 => 'third');
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, false);
        $listener->onSubmit($event);

        $this->assertEquals($data, $event->getData());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testOnSubmitNormDataRequiresArrayOrTraversable()
    {
        $data = 'no array or traversable';
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, false);
        $listener->onSubmit($event);
    }

    public function testOnSubmitNormDataDealsWithNullData()
    {
        $this->form->add($this->getForm('1'));

        $data = null;
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, true);
        $listener->onSubmit($event);

        $this->assertEquals(array(), $event->getData());
    }

    public function testOnSubmitDealsWithObjectBackedIteratorAggregate()
    {
        $this->form->add($this->getForm('1'));

        $data = new \ArrayObject(array(0 => 'first', 1 => 'second', 2 => 'third'));
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, true);
        $listener->onSubmit($event);

        $this->assertArrayNotHasKey(0, $event->getData());
        $this->assertArrayNotHasKey(2, $event->getData());
    }

    public function testOnSubmitDealsWithArrayBackedIteratorAggregate()
    {
        $this->form->add($this->getForm('1'));

        $data = new ArrayCollection(array(0 => 'first', 1 => 'second', 2 => 'third'));
        $event = new FormEvent($this->form, $data);
        $listener = new ResizeFormListener('text', array(), false, true);
        $listener->onSubmit($event);

        $this->assertArrayNotHasKey(0, $event->getData());
        $this->assertArrayNotHasKey(2, $event->getData());
    }
}
PK�b�\��܏##\pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/Fixtures/randomhashnu�[���GIF87a�������,D;PK�b�\��gggpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/FixUrlProtocolListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Core\EventListener\FixUrlProtocolListener;

class FixUrlProtocolListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testFixHttpUrl()
    {
        $data = "www.symfony.com";
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $filter = new FixUrlProtocolListener('http');
        $filter->onSubmit($event);

        $this->assertEquals('http://www.symfony.com', $event->getData());
    }

    public function testSkipKnownUrl()
    {
        $data = "http://www.symfony.com";
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $filter = new FixUrlProtocolListener('http');
        $filter->onSubmit($event);

        $this->assertEquals('http://www.symfony.com', $event->getData());
    }

    public function testSkipOtherProtocol()
    {
        $data = "ftp://www.symfony.com";
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $event = new FormEvent($form, $data);

        $filter = new FixUrlProtocolListener('http');
        $filter->onSubmit($event);

        $this->assertEquals('ftp://www.symfony.com', $event->getData());
    }
}
PK�b�\�@ڦypear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerCustomArrayObjectTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\EventListener;

use Symfony\Component\Form\Tests\Fixtures\CustomArrayObject;
use Symfony\Component\Form\FormBuilder;

class MergeCollectionListenerCustomArrayObjectTest extends MergeCollectionListenerTest
{
    protected function getData(array $data)
    {
        return new CustomArrayObject($data);
    }

    protected function getBuilder($name = 'name')
    {
        return new FormBuilder($name, 'Symfony\Component\Form\Tests\Fixtures\CustomArrayObject', $this->dispatcher, $this->factory);
    }
}
PK�b�\Э
���mpear/test/Form/Symfony/Component/Form/Tests/Extension/Core/EventListener/MergeCollectionListenerArrayTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\EventListener;

use Symfony\Component\Form\FormBuilder;

class MergeCollectionListenerArrayTest extends MergeCollectionListenerTest
{
    protected function getData(array $data)
    {
        return $data;
    }

    protected function getBuilder($name = 'name')
    {
        return new FormBuilder($name, null, $this->dispatcher, $this->factory);
    }
}
PK�b�\?�R8�.�.`pear/test/Form/Symfony/Component/Form/Tests/Extension/Core/DataMapper/PropertyPathMapperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Core\DataMapper;

use Symfony\Component\Form\FormConfigBuilder;
use Symfony\Component\Form\FormConfigInterface;
use Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper;

class PropertyPathMapperTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var PropertyPathMapper
     */
    private $mapper;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dispatcher;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $propertyAccessor;

    protected function setUp()
    {
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->propertyAccessor = $this->getMock('Symfony\Component\PropertyAccess\PropertyAccessorInterface');
        $this->mapper = new PropertyPathMapper($this->propertyAccessor);
    }

    /**
     * @param $path
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    private function getPropertyPath($path)
    {
        return $this->getMockBuilder('Symfony\Component\PropertyAccess\PropertyPath')
            ->setConstructorArgs(array($path))
            ->setMethods(array('getValue', 'setValue'))
            ->getMock();
    }

    /**
     * @param FormConfigInterface $config
     * @param Boolean $synchronized
     * @param Boolean $submitted
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    private function getForm(FormConfigInterface $config, $synchronized = true, $submitted = true)
    {
        $form = $this->getMockBuilder('Symfony\Component\Form\Form')
            ->setConstructorArgs(array($config))
            ->setMethods(array('isSynchronized', 'isSubmitted'))
            ->getMock();

        $form->expects($this->any())
            ->method('isSynchronized')
            ->will($this->returnValue($synchronized));

        $form->expects($this->any())
            ->method('isSubmitted')
            ->will($this->returnValue($submitted));

        return $form;
    }

    /**
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    private function getDataMapper()
    {
        return $this->getMock('Symfony\Component\Form\DataMapperInterface');
    }

    public function testMapDataToFormsPassesObjectRefIfByReference()
    {
        $car = new \stdClass();
        $engine = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->once())
            ->method('getValue')
            ->with($car, $propertyPath)
            ->will($this->returnValue($engine));

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setPropertyPath($propertyPath);
        $form = $this->getForm($config);

        $this->mapper->mapDataToForms($car, array($form));

        // Can't use isIdentical() above because mocks always clone their
        // arguments which can't be disabled in PHPUnit 3.6
        $this->assertSame($engine, $form->getData());
    }

    public function testMapDataToFormsPassesObjectCloneIfNotByReference()
    {
        $car = new \stdClass();
        $engine = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->once())
            ->method('getValue')
            ->with($car, $propertyPath)
            ->will($this->returnValue($engine));

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(false);
        $config->setPropertyPath($propertyPath);
        $form = $this->getForm($config);

        $this->mapper->mapDataToForms($car, array($form));

        $this->assertNotSame($engine, $form->getData());
        $this->assertEquals($engine, $form->getData());
    }

    public function testMapDataToFormsIgnoresEmptyPropertyPath()
    {
        $car = new \stdClass();

        $config = new FormConfigBuilder(null, '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $form = $this->getForm($config);

        $this->assertNull($form->getPropertyPath());

        $this->mapper->mapDataToForms($car, array($form));

        $this->assertNull($form->getData());
    }

    public function testMapDataToFormsIgnoresUnmapped()
    {
        $car = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->never())
            ->method('getValue');

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setMapped(false);
        $config->setPropertyPath($propertyPath);
        $form = $this->getForm($config);

        $this->mapper->mapDataToForms($car, array($form));

        $this->assertNull($form->getData());
    }

    public function testMapDataToFormsSetsDefaultDataIfPassedDataIsNull()
    {
        $default = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->never())
            ->method('getValue');

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setPropertyPath($propertyPath);
        $config->setData($default);

        $form = $this->getMockBuilder('Symfony\Component\Form\Form')
            ->setConstructorArgs(array($config))
            ->setMethods(array('setData'))
            ->getMock();

        $form->expects($this->once())
            ->method('setData')
            ->with($default);

        $this->mapper->mapDataToForms(null, array($form));
    }

    public function testMapDataToFormsSetsDefaultDataIfPassedDataIsEmptyArray()
    {
        $default = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->never())
            ->method('getValue');

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setPropertyPath($propertyPath);
        $config->setData($default);

        $form = $this->getMockBuilder('Symfony\Component\Form\Form')
            ->setConstructorArgs(array($config))
            ->setMethods(array('setData'))
            ->getMock();

        $form->expects($this->once())
            ->method('setData')
            ->with($default);

        $this->mapper->mapDataToForms(array(), array($form));
    }

    public function testMapFormsToDataWritesBackIfNotByReference()
    {
        $car = new \stdClass();
        $engine = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->once())
            ->method('setValue')
            ->with($car, $propertyPath, $engine);

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(false);
        $config->setPropertyPath($propertyPath);
        $config->setData($engine);
        $form = $this->getForm($config);

        $this->mapper->mapFormsToData(array($form), $car);
    }

    public function testMapFormsToDataWritesBackIfByReferenceButNoReference()
    {
        $car = new \stdClass();
        $engine = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->once())
            ->method('setValue')
            ->with($car, $propertyPath, $engine);

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setPropertyPath($propertyPath);
        $config->setData($engine);
        $form = $this->getForm($config);

        $this->mapper->mapFormsToData(array($form), $car);
    }

    public function testMapFormsToDataWritesBackIfByReferenceAndReference()
    {
        $car = new \stdClass();
        $engine = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        // $car already contains the reference of $engine
        $this->propertyAccessor->expects($this->once())
            ->method('getValue')
            ->with($car, $propertyPath)
            ->will($this->returnValue($engine));

        $this->propertyAccessor->expects($this->never())
            ->method('setValue');

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setPropertyPath($propertyPath);
        $config->setData($engine);
        $form = $this->getForm($config);

        $this->mapper->mapFormsToData(array($form), $car);
    }

    public function testMapFormsToDataIgnoresUnmapped()
    {
        $car = new \stdClass();
        $engine = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->never())
            ->method('setValue');

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setPropertyPath($propertyPath);
        $config->setData($engine);
        $config->setMapped(false);
        $form = $this->getForm($config);

        $this->mapper->mapFormsToData(array($form), $car);
    }

    public function testMapFormsToDataIgnoresUnsubmittedForms()
    {
        $car = new \stdClass();
        $engine = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->never())
            ->method('setValue');

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setPropertyPath($propertyPath);
        $config->setData($engine);
        $form = $this->getForm($config, true, false);

        $this->mapper->mapFormsToData(array($form), $car);
    }

    public function testMapFormsToDataIgnoresEmptyData()
    {
        $car = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->never())
            ->method('setValue');

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setPropertyPath($propertyPath);
        $config->setData(null);
        $form = $this->getForm($config);

        $this->mapper->mapFormsToData(array($form), $car);
    }

    public function testMapFormsToDataIgnoresUnsynchronized()
    {
        $car = new \stdClass();
        $engine = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->never())
            ->method('setValue');

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setPropertyPath($propertyPath);
        $config->setData($engine);
        $form = $this->getForm($config, false);

        $this->mapper->mapFormsToData(array($form), $car);
    }

    public function testMapFormsToDataIgnoresDisabled()
    {
        $car = new \stdClass();
        $engine = new \stdClass();
        $propertyPath = $this->getPropertyPath('engine');

        $this->propertyAccessor->expects($this->never())
            ->method('setValue');

        $config = new FormConfigBuilder('name', '\stdClass', $this->dispatcher);
        $config->setByReference(true);
        $config->setPropertyPath($propertyPath);
        $config->setData($engine);
        $config->setDisabled(true);
        $form = $this->getForm($config);

        $this->mapper->mapFormsToData(array($form), $car);
    }
}
PK�b�\��q��kpear/test/Form/Symfony/Component/Form/Tests/Extension/DataCollector/Type/DataCollectorTypeExtensionTest.phpnu�[���<?php
/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\DataCollector\Type;

use Symfony\Component\Form\Extension\DataCollector\Type\DataCollectorTypeExtension;

class DataCollectorTypeExtensionTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var DataCollectorTypeExtension
     */
    private $extension;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dataCollector;

    public function setUp()
    {
        $this->dataCollector = $this->getMock('Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface');
        $this->extension = new DataCollectorTypeExtension($this->dataCollector);
    }

    public function testGetExtendedType()
    {
        $this->assertEquals('form', $this->extension->getExtendedType());
    }

    public function testBuildForm()
    {
        $builder = $this->getMock('Symfony\Component\Form\Test\FormBuilderInterface');
        $builder->expects($this->atLeastOnce())
            ->method('addEventSubscriber')
            ->with($this->isInstanceOf('Symfony\Component\Form\Extension\DataCollector\EventListener\DataCollectorListener'));

        $this->extension->buildForm($builder, array());
    }
}
PK�b�\�{�(�,�,]pear/test/Form/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataExtractorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\DataCollector;

use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Extension\DataCollector\FormDataExtractor;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\Tests\Fixtures\FixedDataTransformer;
use Symfony\Component\HttpKernel\DataCollector\Util\ValueExporter;

class FormDataExtractorTest_SimpleValueExporter extends ValueExporter
{
    /**
     * {@inheritdoc}
     */
    public function exportValue($value)
    {
        return var_export($value, true);
    }
}

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormDataExtractorTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var FormDataExtractorTest_SimpleValueExporter
     */
    private $valueExporter;

    /**
     * @var FormDataExtractor
     */
    private $dataExtractor;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dispatcher;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $factory;

    protected function setUp()
    {
        $this->valueExporter = new FormDataExtractorTest_SimpleValueExporter();
        $this->dataExtractor = new FormDataExtractor($this->valueExporter);
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
    }

    public function testExtractConfiguration()
    {
        $type = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
        $type->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('type_name'));
        $type->expects($this->any())
            ->method('getInnerType')
            ->will($this->returnValue(new \stdClass()));

        $form = $this->createBuilder('name')
            ->setType($type)
            ->getForm();

        $this->assertSame(array(
            'id' => 'name',
            'type' => 'type_name',
            'type_class' => 'stdClass',
            'synchronized' => 'true',
            'passed_options' => array(),
            'resolved_options' => array(),
        ), $this->dataExtractor->extractConfiguration($form));
    }

    public function testExtractConfigurationSortsPassedOptions()
    {
        $type = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
        $type->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('type_name'));
        $type->expects($this->any())
            ->method('getInnerType')
            ->will($this->returnValue(new \stdClass()));

        $options = array(
            'b' => 'foo',
            'a' => 'bar',
            'c' => 'baz',
        );

        $form = $this->createBuilder('name')
            ->setType($type)
            // passed options are stored in an attribute by
            // ResolvedTypeDataCollectorProxy
            ->setAttribute('data_collector/passed_options', $options)
            ->getForm();

        $this->assertSame(array(
            'id' => 'name',
            'type' => 'type_name',
            'type_class' => 'stdClass',
            'synchronized' => 'true',
            'passed_options' => array(
                'a' => "'bar'",
                'b' => "'foo'",
                'c' => "'baz'",
            ),
            'resolved_options' => array(),
        ), $this->dataExtractor->extractConfiguration($form));
    }

    public function testExtractConfigurationSortsResolvedOptions()
    {
        $type = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
        $type->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('type_name'));
        $type->expects($this->any())
            ->method('getInnerType')
            ->will($this->returnValue(new \stdClass()));

        $options = array(
            'b' => 'foo',
            'a' => 'bar',
            'c' => 'baz',
        );

        $form = $this->createBuilder('name', $options)
            ->setType($type)
            ->getForm();

        $this->assertSame(array(
            'id' => 'name',
            'type' => 'type_name',
            'type_class' => 'stdClass',
            'synchronized' => 'true',
            'passed_options' => array(),
            'resolved_options' => array(
                'a' => "'bar'",
                'b' => "'foo'",
                'c' => "'baz'",
            ),
        ), $this->dataExtractor->extractConfiguration($form));
    }

    public function testExtractConfigurationBuildsIdRecursively()
    {
        $type = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
        $type->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('type_name'));
        $type->expects($this->any())
            ->method('getInnerType')
            ->will($this->returnValue(new \stdClass()));

        $grandParent = $this->createBuilder('grandParent')
            ->setCompound(true)
            ->setDataMapper($this->getMock('Symfony\Component\Form\DataMapperInterface'))
            ->getForm();
        $parent = $this->createBuilder('parent')
            ->setCompound(true)
            ->setDataMapper($this->getMock('Symfony\Component\Form\DataMapperInterface'))
            ->getForm();
        $form = $this->createBuilder('name')
            ->setType($type)
            ->getForm();

        $grandParent->add($parent);
        $parent->add($form);

        $this->assertSame(array(
            'id' => 'grandParent_parent_name',
            'type' => 'type_name',
            'type_class' => 'stdClass',
            'synchronized' => 'true',
            'passed_options' => array(),
            'resolved_options' => array(),
        ), $this->dataExtractor->extractConfiguration($form));
    }

    public function testExtractDefaultData()
    {
        $form = $this->createBuilder('name')->getForm();

        $form->setData('Foobar');

        $this->assertSame(array(
            'default_data' => array(
                'norm' => "'Foobar'",
            ),
            'submitted_data' => array(),
        ), $this->dataExtractor->extractDefaultData($form));
    }

    public function testExtractDefaultDataStoresModelDataIfDifferent()
    {
        $form = $this->createBuilder('name')
            ->addModelTransformer(new FixedDataTransformer(array(
                'Foo' => 'Bar'
            )))
            ->getForm();

        $form->setData('Foo');

        $this->assertSame(array(
            'default_data' => array(
                'norm' => "'Bar'",
                'model' => "'Foo'",
            ),
            'submitted_data' => array(),
        ), $this->dataExtractor->extractDefaultData($form));
    }

    public function testExtractDefaultDataStoresViewDataIfDifferent()
    {
        $form = $this->createBuilder('name')
            ->addViewTransformer(new FixedDataTransformer(array(
                'Foo' => 'Bar'
            )))
            ->getForm();

        $form->setData('Foo');

        $this->assertSame(array(
            'default_data' => array(
                'norm' => "'Foo'",
                'view' => "'Bar'",
            ),
            'submitted_data' => array(),
        ), $this->dataExtractor->extractDefaultData($form));
    }

    public function testExtractSubmittedData()
    {
        $form = $this->createBuilder('name')->getForm();

        $form->submit('Foobar');

        $this->assertSame(array(
            'submitted_data' => array(
                'norm' => "'Foobar'",
            ),
            'errors' => array(),
            'synchronized' => 'true',
        ), $this->dataExtractor->extractSubmittedData($form));
    }

    public function testExtractSubmittedDataStoresModelDataIfDifferent()
    {
        $form = $this->createBuilder('name')
            ->addModelTransformer(new FixedDataTransformer(array(
                'Foo' => 'Bar',
                '' => '',
            )))
            ->getForm();

        $form->submit('Bar');

        $this->assertSame(array(
            'submitted_data' => array(
                'norm' => "'Bar'",
                'model' => "'Foo'",
            ),
            'errors' => array(),
            'synchronized' => 'true',
        ), $this->dataExtractor->extractSubmittedData($form));
    }

    public function testExtractSubmittedDataStoresViewDataIfDifferent()
    {
        $form = $this->createBuilder('name')
            ->addViewTransformer(new FixedDataTransformer(array(
                'Foo' => 'Bar',
                '' => '',
            )))
            ->getForm();

        $form->submit('Bar');

        $this->assertSame(array(
            'submitted_data' => array(
                'norm' => "'Foo'",
                'view' => "'Bar'",
            ),
            'errors' => array(),
            'synchronized' => 'true',
        ), $this->dataExtractor->extractSubmittedData($form));
    }

    public function testExtractSubmittedDataStoresErrors()
    {
        $form = $this->createBuilder('name')->getForm();

        $form->submit('Foobar');
        $form->addError(new FormError('Invalid!'));

        $this->assertSame(array(
            'submitted_data' => array(
                'norm' => "'Foobar'",
            ),
            'errors' => array(
                array('message' => 'Invalid!'),
            ),
            'synchronized' => 'true',
        ), $this->dataExtractor->extractSubmittedData($form));
    }

    public function testExtractSubmittedDataRemembersIfNonSynchronized()
    {
        $form = $this->createBuilder('name')
            ->addModelTransformer(new CallbackTransformer(
                function () {},
                function () {
                    throw new TransformationFailedException('Fail!');
                }
            ))
            ->getForm();

        $form->submit('Foobar');

        $this->assertSame(array(
            'submitted_data' => array(
                'norm' => "'Foobar'",
                'model' => 'NULL',
            ),
            'errors' => array(),
            'synchronized' => 'false',
        ), $this->dataExtractor->extractSubmittedData($form));
    }

    public function testExtractViewVariables()
    {
        $view = new FormView();

        $view->vars = array(
            'b' => 'foo',
            'a' => 'bar',
            'c' => 'baz',
            'id' => 'foo_bar',
        );

        $this->assertSame(array(
            'id' => 'foo_bar',
            'view_vars' => array(
                'a' => "'bar'",
                'b' => "'foo'",
                'c' => "'baz'",
                'id' => "'foo_bar'",
            ),
        ), $this->dataExtractor->extractViewVariables($view));
    }

    /**
     * @param string $name
     * @param array  $options
     *
     * @return FormBuilder
     */
    private function createBuilder($name, array $options = array())
    {
        return new FormBuilder($name, null, $this->dispatcher, $this->factory, $options);
    }
}
PK�b�\b�,�<<bpear/test/Form/Symfony/Component/Form/Tests/Extension/DataCollector/DataCollectorExtensionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\DataCollector;

use Symfony\Component\Form\Extension\DataCollector\DataCollectorExtension;

/**
 * @covers Symfony\Component\Form\Extension\DataCollector\DataCollectorExtension
 */
class DataCollectorExtensionTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var DataCollectorExtension
     */
    private $extension;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dataCollector;

    public function setUp()
    {
        $this->dataCollector = $this->getMock('Symfony\Component\Form\Extension\DataCollector\FormDataCollectorInterface');
        $this->extension = new DataCollectorExtension($this->dataCollector);
    }

    public function testLoadTypeExtensions()
    {
        $typeExtensions = $this->extension->getTypeExtensions('form');

        $this->assertInternalType('array', $typeExtensions);
        $this->assertCount(1, $typeExtensions);
        $this->assertInstanceOf('Symfony\Component\Form\Extension\DataCollector\Type\DataCollectorTypeExtension', array_shift($typeExtensions));
    }
}
PK�b�\����>�>]pear/test/Form/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.phpnu�[���<?php
/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\DataCollector;

use Symfony\Component\Form\Extension\DataCollector\FormDataCollector;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormView;

class FormDataCollectorTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dataExtractor;

    /**
     * @var FormDataCollector
     */
    private $dataCollector;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dispatcher;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $factory;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dataMapper;

    /**
     * @var Form
     */
    private $form;

    /**
     * @var Form
     */
    private $childForm;

    /**
     * @var FormView
     */
    private $view;

    /**
     * @var FormView
     */
    private $childView;

    protected function setUp()
    {
        $this->dataExtractor = $this->getMock('Symfony\Component\Form\Extension\DataCollector\FormDataExtractorInterface');
        $this->dataCollector = new FormDataCollector($this->dataExtractor);
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
        $this->dataMapper = $this->getMock('Symfony\Component\Form\DataMapperInterface');
        $this->form = $this->createForm('name');
        $this->childForm = $this->createForm('child');
        $this->view = new FormView();
        $this->childView = new FormView();
    }

    public function testBuildPreliminaryFormTree()
    {
        $this->form->add($this->childForm);

        $this->dataExtractor->expects($this->at(0))
            ->method('extractConfiguration')
            ->with($this->form)
            ->will($this->returnValue(array('config' => 'foo')));
        $this->dataExtractor->expects($this->at(1))
            ->method('extractConfiguration')
            ->with($this->childForm)
            ->will($this->returnValue(array('config' => 'bar')));

        $this->dataExtractor->expects($this->at(2))
            ->method('extractDefaultData')
            ->with($this->form)
            ->will($this->returnValue(array('default_data' => 'foo')));
        $this->dataExtractor->expects($this->at(3))
            ->method('extractDefaultData')
            ->with($this->childForm)
            ->will($this->returnValue(array('default_data' => 'bar')));

        $this->dataExtractor->expects($this->at(4))
            ->method('extractSubmittedData')
            ->with($this->form)
            ->will($this->returnValue(array('submitted_data' => 'foo')));
        $this->dataExtractor->expects($this->at(5))
            ->method('extractSubmittedData')
            ->with($this->childForm)
            ->will($this->returnValue(array('submitted_data' => 'bar')));

        $this->dataCollector->collectConfiguration($this->form);
        $this->dataCollector->collectDefaultData($this->form);
        $this->dataCollector->collectSubmittedData($this->form);
        $this->dataCollector->buildPreliminaryFormTree($this->form);

        $this->assertSame(array(
             'forms' => array(
                 'name' => array(
                     'config' => 'foo',
                     'default_data' => 'foo',
                     'submitted_data' => 'foo',
                     'children' => array(
                         'child' => array(
                             'config' => 'bar',
                             'default_data' => 'bar',
                             'submitted_data' => 'bar',
                             'children' => array(),
                         ),
                     ),
                 ),
             ),
             'nb_errors' => 0,
         ), $this->dataCollector->getData());
    }

    public function testBuildMultiplePreliminaryFormTrees()
    {
        $form1 = $this->createForm('form1');
        $form2 = $this->createForm('form2');

        $this->dataExtractor->expects($this->at(0))
            ->method('extractConfiguration')
            ->with($form1)
            ->will($this->returnValue(array('config' => 'foo')));
        $this->dataExtractor->expects($this->at(1))
            ->method('extractConfiguration')
            ->with($form2)
            ->will($this->returnValue(array('config' => 'bar')));

        $this->dataCollector->collectConfiguration($form1);
        $this->dataCollector->collectConfiguration($form2);
        $this->dataCollector->buildPreliminaryFormTree($form1);

        $this->assertSame(array(
            'forms' => array(
                'form1' => array(
                    'config' => 'foo',
                    'children' => array(),
                ),
            ),
            'nb_errors' => 0,
        ), $this->dataCollector->getData());

        $this->dataCollector->buildPreliminaryFormTree($form2);

        $this->assertSame(array(
            'forms' => array(
                'form1' => array(
                    'config' => 'foo',
                    'children' => array(),
                ),
                'form2' => array(
                    'config' => 'bar',
                    'children' => array(),
                ),
            ),
            'nb_errors' => 0,
        ), $this->dataCollector->getData());
    }

    public function testBuildSamePreliminaryFormTreeMultipleTimes()
    {
        $this->dataExtractor->expects($this->at(0))
            ->method('extractConfiguration')
            ->with($this->form)
            ->will($this->returnValue(array('config' => 'foo')));

        $this->dataExtractor->expects($this->at(1))
            ->method('extractDefaultData')
            ->with($this->form)
            ->will($this->returnValue(array('default_data' => 'foo')));

        $this->dataCollector->collectConfiguration($this->form);
        $this->dataCollector->buildPreliminaryFormTree($this->form);

        $this->assertSame(array(
            'forms' => array(
                'name' => array(
                    'config' => 'foo',
                    'children' => array(),
                ),
            ),
            'nb_errors' => 0,
        ), $this->dataCollector->getData());

        $this->dataCollector->collectDefaultData($this->form);
        $this->dataCollector->buildPreliminaryFormTree($this->form);

        $this->assertSame(array(
            'forms' => array(
                'name' => array(
                    'config' => 'foo',
                    'default_data' => 'foo',
                    'children' => array(),
                ),
            ),
            'nb_errors' => 0,
        ), $this->dataCollector->getData());
    }

    public function testBuildPreliminaryFormTreeWithoutCollectingAnyData()
    {
        $this->dataCollector->buildPreliminaryFormTree($this->form);

        $this->assertSame(array(
            'forms' => array(
                'name' => array(
                    'children' => array(),
                ),
            ),
            'nb_errors' => 0,
        ), $this->dataCollector->getData());
    }

    public function testBuildFinalFormTree()
    {
        $this->form->add($this->childForm);
        $this->view->children['child'] = $this->childView;

        $this->dataExtractor->expects($this->at(0))
            ->method('extractConfiguration')
            ->with($this->form)
            ->will($this->returnValue(array('config' => 'foo')));
        $this->dataExtractor->expects($this->at(1))
            ->method('extractConfiguration')
            ->with($this->childForm)
            ->will($this->returnValue(array('config' => 'bar')));

        $this->dataExtractor->expects($this->at(2))
            ->method('extractDefaultData')
            ->with($this->form)
            ->will($this->returnValue(array('default_data' => 'foo')));
        $this->dataExtractor->expects($this->at(3))
            ->method('extractDefaultData')
            ->with($this->childForm)
            ->will($this->returnValue(array('default_data' => 'bar')));

        $this->dataExtractor->expects($this->at(4))
            ->method('extractSubmittedData')
            ->with($this->form)
            ->will($this->returnValue(array('submitted_data' => 'foo')));
        $this->dataExtractor->expects($this->at(5))
            ->method('extractSubmittedData')
            ->with($this->childForm)
            ->will($this->returnValue(array('submitted_data' => 'bar')));

        $this->dataExtractor->expects($this->at(6))
            ->method('extractViewVariables')
            ->with($this->view)
            ->will($this->returnValue(array('view_vars' => 'foo')));

        $this->dataExtractor->expects($this->at(7))
            ->method('extractViewVariables')
            ->with($this->childView)
            ->will($this->returnValue(array('view_vars' => 'bar')));

        $this->dataCollector->collectConfiguration($this->form);
        $this->dataCollector->collectDefaultData($this->form);
        $this->dataCollector->collectSubmittedData($this->form);
        $this->dataCollector->collectViewVariables($this->view);
        $this->dataCollector->buildFinalFormTree($this->form, $this->view);

        $this->assertSame(array(
            'forms' => array(
                'name' => array(
                    'view_vars' => 'foo',
                    'config' => 'foo',
                    'default_data' => 'foo',
                    'submitted_data' => 'foo',
                    'children' => array(
                        'child' => array(
                            'view_vars' => 'bar',
                            'config' => 'bar',
                            'default_data' => 'bar',
                            'submitted_data' => 'bar',
                            'children' => array(),
                        ),
                    ),
                ),
            ),
            'nb_errors' => 0,
        ), $this->dataCollector->getData());
    }

    public function testFinalFormReliesOnFormViewStructure()
    {
        $this->form->add($this->createForm('first'));
        $this->form->add($this->createForm('second'));

        $this->view->children['second'] = $this->childView;

        $this->dataCollector->buildPreliminaryFormTree($this->form);

        $this->assertSame(array(
            'forms' => array(
                'name' => array(
                    'children' => array(
                        'first' => array(
                            'children' => array(),
                        ),
                        'second' => array(
                            'children' => array(),
                        ),
                    ),
                ),
            ),
            'nb_errors' => 0,
        ), $this->dataCollector->getData());

        $this->dataCollector->buildFinalFormTree($this->form, $this->view);

        $this->assertSame(array(
            'forms' => array(
                'name' => array(
                    'children' => array(
                        // "first" not present in FormView
                        'second' => array(
                            'children' => array(),
                        ),
                    ),
                ),
            ),
            'nb_errors' => 0,
        ), $this->dataCollector->getData());
    }

    public function testChildViewsCanBeWithoutCorrespondingChildForms()
    {
        // don't add $this->childForm to $this->form!

        $this->view->children['child'] = $this->childView;

        $this->dataExtractor->expects($this->at(0))
            ->method('extractConfiguration')
            ->with($this->form)
            ->will($this->returnValue(array('config' => 'foo')));
        $this->dataExtractor->expects($this->at(1))
            ->method('extractConfiguration')
            ->with($this->childForm)
            ->will($this->returnValue(array('config' => 'bar')));

        // explicitly call collectConfiguration(), since $this->childForm is not
        // contained in the form tree
        $this->dataCollector->collectConfiguration($this->form);
        $this->dataCollector->collectConfiguration($this->childForm);
        $this->dataCollector->buildFinalFormTree($this->form, $this->view);

        $this->assertSame(array(
            'forms' => array(
                'name' => array(
                    'config' => 'foo',
                    'children' => array(
                        'child' => array(
                            // no "config" key
                            'children' => array(),
                        ),
                    ),
                ),
            ),
            'nb_errors' => 0,
        ), $this->dataCollector->getData());
    }

    public function testChildViewsWithoutCorrespondingChildFormsMayBeExplicitlyAssociated()
    {
        // don't add $this->childForm to $this->form!

        $this->view->children['child'] = $this->childView;

        // but associate the two
        $this->dataCollector->associateFormWithView($this->childForm, $this->childView);

        $this->dataExtractor->expects($this->at(0))
            ->method('extractConfiguration')
            ->with($this->form)
            ->will($this->returnValue(array('config' => 'foo')));
        $this->dataExtractor->expects($this->at(1))
            ->method('extractConfiguration')
            ->with($this->childForm)
            ->will($this->returnValue(array('config' => 'bar')));

        // explicitly call collectConfiguration(), since $this->childForm is not
        // contained in the form tree
        $this->dataCollector->collectConfiguration($this->form);
        $this->dataCollector->collectConfiguration($this->childForm);
        $this->dataCollector->buildFinalFormTree($this->form, $this->view);

        $this->assertSame(array(
            'forms' => array(
                'name' => array(
                    'config' => 'foo',
                    'children' => array(
                        'child' => array(
                            'config' => 'bar',
                            'children' => array(),
                        ),
                    ),
                ),
            ),
            'nb_errors' => 0,
        ), $this->dataCollector->getData());
    }

    public function testCollectSubmittedDataCountsErrors()
    {
        $form1 = $this->createForm('form1');
        $childForm1 = $this->createForm('child1');
        $form2 = $this->createForm('form2');

        $form1->add($childForm1);

        $this->dataExtractor->expects($this->at(0))
            ->method('extractSubmittedData')
            ->with($form1)
            ->will($this->returnValue(array('errors' => array('foo'))));
        $this->dataExtractor->expects($this->at(1))
            ->method('extractSubmittedData')
            ->with($childForm1)
            ->will($this->returnValue(array('errors' => array('bar', 'bam'))));
        $this->dataExtractor->expects($this->at(2))
            ->method('extractSubmittedData')
            ->with($form2)
            ->will($this->returnValue(array('errors' => array('baz'))));

        $this->dataCollector->collectSubmittedData($form1);

        $data = $this->dataCollector->getData();
        $this->assertSame(3, $data['nb_errors']);

        $this->dataCollector->collectSubmittedData($form2);

        $data = $this->dataCollector->getData();
        $this->assertSame(4, $data['nb_errors']);

    }

    private function createForm($name)
    {
        $builder = new FormBuilder($name, null, $this->dispatcher, $this->factory);
        $builder->setCompound(true);
        $builder->setDataMapper($this->dataMapper);

        return $builder->getForm();
    }
}
PK�b�\1���� � npear/test/Form/Symfony/Component/Form/Tests/Extension/HttpFoundation/EventListener/BindRequestListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\HttpFoundation\EventListener;

use Symfony\Component\Form\Extension\HttpFoundation\EventListener\BindRequestListener;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormConfigBuilder;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Test\DeprecationErrorHandler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class BindRequestListenerTest extends \PHPUnit_Framework_TestCase
{
    private $values;

    private $filesPlain;

    private $filesNested;

    /**
     * @var UploadedFile
     */
    private $uploadedFile;

    protected function setUp()
    {
        $path = tempnam(sys_get_temp_dir(), 'sf2');
        touch($path);

        $this->values = array(
            'name' => 'Bernhard',
            'image' => array('filename' => 'foobar.png'),
        );

        $this->filesPlain = array(
            'image' => array(
                'error' => UPLOAD_ERR_OK,
                'name' => 'upload.png',
                'size' => 123,
                'tmp_name' => $path,
                'type' => 'image/png'
            ),
        );

        $this->filesNested = array(
            'error' => array('image' => UPLOAD_ERR_OK),
            'name' => array('image' => 'upload.png'),
            'size' => array('image' => 123),
            'tmp_name' => array('image' => $path),
            'type' => array('image' => 'image/png'),
        );

        $this->uploadedFile = new UploadedFile($path, 'upload.png', 'image/png', 123, UPLOAD_ERR_OK);
    }

    protected function tearDown()
    {
        unlink($this->uploadedFile->getRealPath());
    }

    public function requestMethodProvider()
    {
        return array(
            array('POST'),
            array('PUT'),
            array('DELETE'),
            array('PATCH'),
        );
    }

    /**
     * @dataProvider requestMethodProvider
     */
    public function testSubmitRequest($method)
    {
        $values = array('author' => $this->values);
        $files = array('author' => $this->filesNested);
        $request = new Request(array(), $values, array(), array(), $files, array(
            'REQUEST_METHOD' => $method,
        ));

        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $config = new FormConfigBuilder('author', null, $dispatcher);
        $form = new Form($config);
        $event = new FormEvent($form, $request);

        $listener = new BindRequestListener();
        DeprecationErrorHandler::preBind($listener, $event);

        $this->assertEquals(array(
            'name' => 'Bernhard',
            'image' => $this->uploadedFile,
        ), $event->getData());
    }

    /**
     * @dataProvider requestMethodProvider
     */
    public function testSubmitRequestWithEmptyName($method)
    {
        $request = new Request(array(), $this->values, array(), array(), $this->filesPlain, array(
            'REQUEST_METHOD' => $method,
        ));

        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $config = new FormConfigBuilder('', null, $dispatcher);
        $form = new Form($config);
        $event = new FormEvent($form, $request);

        $listener = new BindRequestListener();
        DeprecationErrorHandler::preBind($listener, $event);

        $this->assertEquals(array(
            'name' => 'Bernhard',
            'image' => $this->uploadedFile,
        ), $event->getData());
    }

    /**
     * @dataProvider requestMethodProvider
     */
    public function testSubmitEmptyRequestToCompoundForm($method)
    {
        $request = new Request(array(), array(), array(), array(), array(), array(
            'REQUEST_METHOD' => $method,
        ));

        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $config = new FormConfigBuilder('author', null, $dispatcher);
        $config->setCompound(true);
        $config->setDataMapper($this->getMock('Symfony\Component\Form\DataMapperInterface'));
        $form = new Form($config);
        $event = new FormEvent($form, $request);

        $listener = new BindRequestListener();
        DeprecationErrorHandler::preBind($listener, $event);

        // Default to empty array
        $this->assertEquals(array(), $event->getData());
    }

    /**
     * @dataProvider requestMethodProvider
     */
    public function testSubmitEmptyRequestToSimpleForm($method)
    {
        $request = new Request(array(), array(), array(), array(), array(), array(
            'REQUEST_METHOD' => $method,
        ));

        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $config = new FormConfigBuilder('author', null, $dispatcher);
        $config->setCompound(false);
        $form = new Form($config);
        $event = new FormEvent($form, $request);

        $listener = new BindRequestListener();
        DeprecationErrorHandler::preBind($listener, $event);

        // Default to null
        $this->assertNull($event->getData());
    }

    public function testSubmitGetRequest()
    {
        $values = array('author' => $this->values);
        $request = new Request($values, array(), array(), array(), array(), array(
            'REQUEST_METHOD' => 'GET',
        ));

        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $config = new FormConfigBuilder('author', null, $dispatcher);
        $form = new Form($config);
        $event = new FormEvent($form, $request);

        $listener = new BindRequestListener();
        DeprecationErrorHandler::preBind($listener, $event);

        $this->assertEquals(array(
            'name' => 'Bernhard',
            'image' => array('filename' => 'foobar.png'),
        ), $event->getData());
    }

    public function testSubmitGetRequestWithEmptyName()
    {
        $request = new Request($this->values, array(), array(), array(), array(), array(
            'REQUEST_METHOD' => 'GET',
        ));

        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $config = new FormConfigBuilder('', null, $dispatcher);
        $form = new Form($config);
        $event = new FormEvent($form, $request);

        $listener = new BindRequestListener();
        DeprecationErrorHandler::preBind($listener, $event);

        $this->assertEquals(array(
            'name' => 'Bernhard',
            'image' => array('filename' => 'foobar.png'),
        ), $event->getData());
    }

    public function testSubmitEmptyGetRequestToCompoundForm()
    {
        $request = new Request(array(), array(), array(), array(), array(), array(
            'REQUEST_METHOD' => 'GET',
        ));

        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $config = new FormConfigBuilder('author', null, $dispatcher);
        $config->setCompound(true);
        $config->setDataMapper($this->getMock('Symfony\Component\Form\DataMapperInterface'));
        $form = new Form($config);
        $event = new FormEvent($form, $request);

        $listener = new BindRequestListener();
        DeprecationErrorHandler::preBind($listener, $event);

        $this->assertEquals(array(), $event->getData());
    }

    public function testSubmitEmptyGetRequestToSimpleForm()
    {
        $request = new Request(array(), array(), array(), array(), array(), array(
            'REQUEST_METHOD' => 'GET',
        ));

        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $config = new FormConfigBuilder('author', null, $dispatcher);
        $config->setCompound(false);
        $form = new Form($config);
        $event = new FormEvent($form, $request);

        $listener = new BindRequestListener();
        DeprecationErrorHandler::preBind($listener, $event);

        $this->assertNull($event->getData());
    }
}
PK�b�\f͍ffipear/test/Form/Symfony/Component/Form/Tests/Extension/HttpFoundation/HttpFoundationRequestHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\HttpFoundation;

use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationRequestHandler;
use Symfony\Component\Form\Tests\AbstractRequestHandlerTest;
use Symfony\Component\HttpFoundation\Request;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class HttpFoundationRequestHandlerTest extends AbstractRequestHandlerTest
{
    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testRequestShouldNotBeNull()
    {
        $this->requestHandler->handleRequest($this->getMockForm('name', 'GET'));
    }
    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testRequestShouldBeInstanceOfRequest()
    {
        $this->requestHandler->handleRequest($this->getMockForm('name', 'GET'), new \stdClass());
    }

    protected function setRequestData($method, $data, $files = array())
    {
        $this->request = Request::create('http://localhost', $method, $data, array(), $files);
    }

    protected function getRequestHandler()
    {
        return new HttpFoundationRequestHandler();
    }

    protected function getMockFile()
    {
        return $this->getMockBuilder('Symfony\Component\HttpFoundation\File\UploadedFile')
            ->disableOriginalConstructor()
            ->getMock();
    }
}
PK�b�\�l"�	�	\pear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/ValidatorTypeGuesserTest.phpnu�[���<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Form\Tests\Extension\Validator;

use Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser;
use Symfony\Component\Form\Guess\Guess;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\Type;

/**
* @author franek <franek@chicour.net>
*/
class ValidatorTypeGuesserTest extends \PHPUnit_Framework_TestCase
{
    private $typeGuesser;

    public function setUp()
    {
        if (!class_exists('Symfony\Component\Validator\Constraint')) {
            $this->markTestSkipped('The "Validator" component is not available');
        }

        $metadataFactory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface');

        $this->typeGuesser = new ValidatorTypeGuesser($metadataFactory);
    }

    public function testGuessMaxLengthForConstraintWithMaxValue()
    {
        $constraint = new Length(array('max' => '2'));

        $result = $this->typeGuesser->guessMaxLengthForConstraint($constraint);
        $this->assertInstanceOf('Symfony\Component\Form\Guess\ValueGuess', $result);
        $this->assertEquals(2, $result->getValue());
        $this->assertEquals(Guess::HIGH_CONFIDENCE, $result->getConfidence());
    }

    public function testGuessMaxLengthForConstraintWithMinValue()
    {
        $constraint = new Length(array('min' => '2'));

        $result = $this->typeGuesser->guessMaxLengthForConstraint($constraint);
        $this->assertNull($result);
    }

    /**
* @dataProvider dataProviderTestGuessMaxLengthForConstraintWithType
*/
    public function testGuessMaxLengthForConstraintWithType($type)
    {
        $constraint = new Type($type);

        $result = $this->typeGuesser->guessMaxLengthForConstraint($constraint);
        $this->assertInstanceOf('Symfony\Component\Form\Guess\ValueGuess', $result);
        $this->assertEquals(null, $result->getValue());
        $this->assertEquals(Guess::MEDIUM_CONFIDENCE, $result->getConfidence());
    }

    public static function dataProviderTestGuessMaxLengthForConstraintWithType()
    {
        return array (
            array('double'),
            array('float'),
            array('numeric'),
            array('real')
        );
    }
}
PK�b�\�EY޵�Ypear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Util/ServerParamsTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Validator\Util;

class ServerParamsTest extends \PHPUnit_Framework_TestCase
{
    /** @dataProvider getGetPostMaxSizeTestData */
    public function testGetPostMaxSize($size, $bytes)
    {
        $serverParams = $this->getMock('Symfony\Component\Form\Extension\Validator\Util\ServerParams', array('getNormalizedIniPostMaxSize'));
        $serverParams
            ->expects($this->any())
            ->method('getNormalizedIniPostMaxSize')
            ->will($this->returnValue(strtoupper($size)));

        $this->assertEquals($bytes, $serverParams->getPostMaxSize());
    }

    public function getGetPostMaxSizeTestData()
    {
        return array(
            array('2k', 2048),
            array('2 k', 2048),
            array('8m', 8 * 1024 * 1024),
            array('+2 k', 2048),
            array('+2???k', 2048),
            array('0x10', 16),
            array('0xf', 15),
            array('010', 8),
            array('+0x10 k', 16 * 1024),
            array('1g', 1024 * 1024 * 1024),
            array('-1', -1),
            array('0', 0),
            array('2mk', 2048), // the unit must be the last char, so in this case 'k', not 'm'
        );
    }
}
PK�b�\�$�Ǵ�epear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationPathTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Validator\ViolationMapper;

use Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationPath;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ViolationPathTest extends \PHPUnit_Framework_TestCase
{
    public function providePaths()
    {
        return array(
            array('children[address]', array(
                array('address', true, true),
            )),
            array('children[address].children[street]', array(
                array('address', true, true),
                array('street', true, true),
            )),
            array('children[address][street]', array(
                array('address', true, true),
            ), 'children[address]'),
            array('children[address].data', array(
                array('address', true, true),
            ), 'children[address]'),
            array('children[address].data.street', array(
                array('address', true, true),
                array('street', false, false),
            )),
            array('children[address].data[street]', array(
                array('address', true, true),
                array('street', false, true),
            )),
            array('children[address].children[street].data.name', array(
                array('address', true, true),
                array('street', true, true),
                array('name', false, false),
            )),
            array('children[address].children[street].data[name]', array(
                array('address', true, true),
                array('street', true, true),
                array('name', false, true),
            )),
            array('data.address', array(
                array('address', false, false),
            )),
            array('data[address]', array(
                array('address', false, true),
            )),
            array('data.address.street', array(
                array('address', false, false),
                array('street', false, false),
            )),
            array('data[address].street', array(
                array('address', false, true),
                array('street', false, false),
            )),
            array('data.address[street]', array(
                array('address', false, false),
                array('street', false, true),
            )),
            array('data[address][street]', array(
                array('address', false, true),
                array('street', false, true),
            )),
            // A few invalid examples
            array('data', array(), ''),
            array('children', array(), ''),
            array('children.address', array(), ''),
            array('children.address[street]', array(), ''),
        );
    }

    /**
     * @dataProvider providePaths
     */
    public function testCreatePath($string, $entries, $slicedPath = null)
    {
        if (null === $slicedPath) {
            $slicedPath = $string;
        }

        $path = new ViolationPath($string);

        $this->assertSame($slicedPath, $path->__toString());
        $this->assertSame(count($entries), count($path->getElements()));
        $this->assertSame(count($entries), $path->getLength());

        foreach ($entries as $index => $entry) {
            $this->assertEquals($entry[0], $path->getElement($index));
            $this->assertSame($entry[1], $path->mapsForm($index));
            $this->assertSame($entry[2], $path->isIndex($index));
            $this->assertSame(!$entry[2], $path->isProperty($index));
        }
    }

    public function provideParents()
    {
        return array(
            array('children[address]', null),
            array('children[address].children[street]', 'children[address]'),
            array('children[address].data.street', 'children[address]'),
            array('children[address].data[street]', 'children[address]'),
            array('data.address', null),
            array('data.address.street', 'data.address'),
            array('data.address[street]', 'data.address'),
            array('data[address].street', 'data[address]'),
            array('data[address][street]', 'data[address]'),
        );
    }

    /**
     * @dataProvider provideParents
     */
    public function testGetParent($violationPath, $parentPath)
    {
        $path = new ViolationPath($violationPath);
        $parent = $parentPath === null ? null : new ViolationPath($parentPath);

        $this->assertEquals($parent, $path->getParent());
    }

    public function testGetElement()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $this->assertEquals('street', $path->getElement(1));
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testGetElementDoesNotAcceptInvalidIndices()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $path->getElement(3);
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testGetElementDoesNotAcceptNegativeIndices()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $path->getElement(-1);
    }

    public function testIsProperty()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $this->assertFalse($path->isProperty(1));
        $this->assertTrue($path->isProperty(2));
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testIsPropertyDoesNotAcceptInvalidIndices()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $path->isProperty(3);
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testIsPropertyDoesNotAcceptNegativeIndices()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $path->isProperty(-1);
    }

    public function testIsIndex()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $this->assertTrue($path->isIndex(1));
        $this->assertFalse($path->isIndex(2));
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testIsIndexDoesNotAcceptInvalidIndices()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $path->isIndex(3);
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testIsIndexDoesNotAcceptNegativeIndices()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $path->isIndex(-1);
    }

    public function testMapsForm()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $this->assertTrue($path->mapsForm(0));
        $this->assertFalse($path->mapsForm(1));
        $this->assertFalse($path->mapsForm(2));
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testMapsFormDoesNotAcceptInvalidIndices()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $path->mapsForm(3);
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testMapsFormDoesNotAcceptNegativeIndices()
    {
        $path = new ViolationPath('children[address].data[street].name');

        $path->mapsForm(-1);
    }
}
PK�b�\�@1�,�,gpear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/ViolationMapper/ViolationMapperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Validator\ViolationMapper;

use Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationMapper;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormConfigBuilder;
use Symfony\Component\Form\FormError;
use Symfony\Component\PropertyAccess\PropertyPath;
use Symfony\Component\Validator\ConstraintViolation;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ViolationMapperTest extends \PHPUnit_Framework_TestCase
{
    const LEVEL_0 = 0;

    const LEVEL_1 = 1;

    const LEVEL_1B = 2;

    const LEVEL_2 = 3;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dispatcher;

    /**
     * @var ViolationMapper
     */
    private $mapper;

    /**
     * @var string
     */
    private $message;

    /**
     * @var string
     */
    private $messageTemplate;

    /**
     * @var array
     */
    private $params;

    protected function setUp()
    {
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->mapper = new ViolationMapper();
        $this->message = 'Message';
        $this->messageTemplate = 'Message template';
        $this->params = array('foo' => 'bar');
    }

    protected function getForm($name = 'name', $propertyPath = null, $dataClass = null, $errorMapping = array(), $inheritData = false, $synchronized = true)
    {
        $config = new FormConfigBuilder($name, $dataClass, $this->dispatcher, array(
            'error_mapping' => $errorMapping,
        ));
        $config->setMapped(true);
        $config->setInheritData($inheritData);
        $config->setPropertyPath($propertyPath);
        $config->setCompound(true);
        $config->setDataMapper($this->getDataMapper());

        if (!$synchronized) {
            $config->addViewTransformer(new CallbackTransformer(
                function ($normData) { return $normData; },
                function () { throw new TransformationFailedException(); }
            ));
        }

        return new Form($config);
    }

    /**
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    private function getDataMapper()
    {
        return $this->getMock('Symfony\Component\Form\DataMapperInterface');
    }

    /**
     * @param $propertyPath
     *
     * @return ConstraintViolation
     */
    protected function getConstraintViolation($propertyPath)
    {
        return new ConstraintViolation($this->message, $this->messageTemplate, $this->params, null, $propertyPath, null);
    }

    /**
     * @return FormError
     */
    protected function getFormError()
    {
        return new FormError($this->message, $this->messageTemplate, $this->params);
    }

    public function testMapToFormInheritingParentDataIfDataDoesNotMatch()
    {
        $violation = $this->getConstraintViolation('children[address].data.foo');
        $parent = $this->getForm('parent');
        $child = $this->getForm('address', 'address', null, array(), true);
        $grandChild = $this->getForm('street');

        $parent->add($child);
        $child->add($grandChild);

        $this->mapper->mapViolation($violation, $parent);

        $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
        $this->assertEquals(array($this->getFormError()), $child->getErrors(), $child->getName().' should have an error, but has none');
        $this->assertCount(0, $grandChild->getErrors(), $grandChild->getName().' should not have an error, but has one');
    }

    public function testFollowDotRules()
    {
        $violation = $this->getConstraintViolation('data.foo');
        $parent = $this->getForm('parent', null, null, array(
            'foo' => 'address',
        ));
        $child = $this->getForm('address', null, null, array(
            '.' => 'street',
        ));
        $grandChild = $this->getForm('street', null, null, array(
            '.' => 'name',
        ));
        $grandGrandChild = $this->getForm('name');

        $parent->add($child);
        $child->add($grandChild);
        $grandChild->add($grandGrandChild);

        $this->mapper->mapViolation($violation, $parent);

        $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
        $this->assertCount(0, $child->getErrors(), $child->getName().' should not have an error, but has one');
        $this->assertCount(0, $grandChild->getErrors(), $grandChild->getName().' should not have an error, but has one');
        $this->assertEquals(array($this->getFormError()), $grandGrandChild->getErrors(), $grandGrandChild->getName().' should have an error, but has none');
    }

    public function testAbortMappingIfNotSynchronized()
    {
        $violation = $this->getConstraintViolation('children[address].data.street');
        $parent = $this->getForm('parent');
        $child = $this->getForm('address', 'address', null, array(), false, false);
        // even though "street" is synchronized, it should not have any errors
        // due to its parent not being synchronized
        $grandChild = $this->getForm('street' , 'street');

        $parent->add($child);
        $child->add($grandChild);

        // submit to invoke the transformer and mark the form unsynchronized
        $parent->submit(array());

        $this->mapper->mapViolation($violation, $parent);

        $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
        $this->assertCount(0, $child->getErrors(), $child->getName().' should not have an error, but has one');
        $this->assertCount(0, $grandChild->getErrors(), $grandChild->getName().' should not have an error, but has one');
    }

    public function testAbortDotRuleMappingIfNotSynchronized()
    {
        $violation = $this->getConstraintViolation('data.address');
        $parent = $this->getForm('parent');
        $child = $this->getForm('address', 'address', null, array(
            '.' => 'street',
        ), false, false);
        // even though "street" is synchronized, it should not have any errors
        // due to its parent not being synchronized
        $grandChild = $this->getForm('street');

        $parent->add($child);
        $child->add($grandChild);

        // submit to invoke the transformer and mark the form unsynchronized
        $parent->submit(array());

        $this->mapper->mapViolation($violation, $parent);

        $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
        $this->assertCount(0, $child->getErrors(), $child->getName().' should not have an error, but has one');
        $this->assertCount(0, $grandChild->getErrors(), $grandChild->getName().' should not have an error, but has one');
    }

    public function provideDefaultTests()
    {
        // The mapping must be deterministic! If a child has the property path "[street]",
        // "data[street]" should be mapped, but "data.street" should not!
        return array(
            // mapping target, child name, its property path, grand child name, its property path, violation path
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', ''),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data'),

            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'children[address].data'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'children[address].data.street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'children[address].data[street].prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'data.address.street'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'data.address.street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'data.address[street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'data.address[street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data[address].street'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data[address].street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data[address][street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data[address][street].prop'),

            array(self::LEVEL_2, 'address', 'address', 'street', '[street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[street]', 'children[address].data'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[street]', 'children[address].data.street.prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[street]', 'children[address].data[street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[street]', 'data.address.street'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[street]', 'data.address.street.prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[street]', 'data.address[street]'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[street]', 'data.address[street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[street]', 'data[address].street'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[street]', 'data[address].street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[street]', 'data[address][street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[street]', 'data[address][street].prop'),

            array(self::LEVEL_2, 'address', '[address]', 'street', 'street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'street', 'children[address].data'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'street', 'children[address].data.street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'street', 'children[address].data[street].prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'street', 'data.address.street'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'street', 'data.address.street.prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'street', 'data.address[street]'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'street', 'data.address[street].prop'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'street', 'data[address].street'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'street', 'data[address].street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'street', 'data[address][street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'street', 'data[address][street].prop'),

            array(self::LEVEL_2, 'address', '[address]', 'street', '[street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[street]', 'children[address].data'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[street]', 'children[address].data.street.prop'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[street]', 'children[address].data[street].prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[street]', 'data.address.street'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[street]', 'data.address.street.prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[street]', 'data.address[street]'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[street]', 'data.address[street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[street]', 'data[address].street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[street]', 'data[address].street.prop'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[street]', 'data[address][street]'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[street]', 'data[address][street].prop'),

            array(self::LEVEL_2, 'address', 'person.address', 'street', 'street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'person.address', 'street', 'street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', 'person.address', 'street', 'street', 'children[address].data'),
            array(self::LEVEL_2, 'address', 'person.address', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_2, 'address', 'person.address', 'street', 'street', 'children[address].data.street.prop'),
            array(self::LEVEL_1, 'address', 'person.address', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1, 'address', 'person.address', 'street', 'street', 'children[address].data[street].prop'),
            array(self::LEVEL_2, 'address', 'person.address', 'street', 'street', 'data.person.address.street'),
            array(self::LEVEL_2, 'address', 'person.address', 'street', 'street', 'data.person.address.street.prop'),
            array(self::LEVEL_1, 'address', 'person.address', 'street', 'street', 'data.person.address[street]'),
            array(self::LEVEL_1, 'address', 'person.address', 'street', 'street', 'data.person.address[street].prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data.person[address].street'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data.person[address].street.prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data.person[address][street]'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data.person[address][street].prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data[person].address.street'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data[person].address.street.prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data[person].address[street]'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data[person].address[street].prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data[person][address].street'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data[person][address].street.prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data[person][address][street]'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data[person][address][street].prop'),

            array(self::LEVEL_2, 'address', 'person.address', 'street', '[street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'person.address', 'street', '[street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', 'person.address', 'street', '[street]', 'children[address].data'),
            array(self::LEVEL_1, 'address', 'person.address', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_1, 'address', 'person.address', 'street', '[street]', 'children[address].data.street.prop'),
            array(self::LEVEL_2, 'address', 'person.address', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address', 'person.address', 'street', '[street]', 'children[address].data[street].prop'),
            array(self::LEVEL_1, 'address', 'person.address', 'street', '[street]', 'data.person.address.street'),
            array(self::LEVEL_1, 'address', 'person.address', 'street', '[street]', 'data.person.address.street.prop'),
            array(self::LEVEL_2, 'address', 'person.address', 'street', '[street]', 'data.person.address[street]'),
            array(self::LEVEL_2, 'address', 'person.address', 'street', '[street]', 'data.person.address[street].prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data.person[address].street'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data.person[address].street.prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data.person[address][street]'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data.person[address][street].prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data[person].address.street'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data[person].address.street.prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data[person].address[street]'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data[person].address[street].prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data[person][address].street'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data[person][address].street.prop'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data[person][address][street]'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', '[street]', 'data[person][address][street].prop'),

            array(self::LEVEL_2, 'address', 'person[address]', 'street', 'street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'person[address]', 'street', 'street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', 'person[address]', 'street', 'street', 'children[address].data'),
            array(self::LEVEL_2, 'address', 'person[address]', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_2, 'address', 'person[address]', 'street', 'street', 'children[address].data.street.prop'),
            array(self::LEVEL_1, 'address', 'person[address]', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1, 'address', 'person[address]', 'street', 'street', 'children[address].data[street].prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data.person.address.street'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data.person.address.street.prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data.person.address[street]'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data.person.address[street].prop'),
            array(self::LEVEL_2, 'address', 'person[address]', 'street', 'street', 'data.person[address].street'),
            array(self::LEVEL_2, 'address', 'person[address]', 'street', 'street', 'data.person[address].street.prop'),
            array(self::LEVEL_1, 'address', 'person[address]', 'street', 'street', 'data.person[address][street]'),
            array(self::LEVEL_1, 'address', 'person[address]', 'street', 'street', 'data.person[address][street].prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data[person].address.street'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data[person].address.street.prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data[person].address[street]'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data[person].address[street].prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data[person][address].street'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data[person][address].street.prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data[person][address][street]'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', 'street', 'data[person][address][street].prop'),

            array(self::LEVEL_2, 'address', 'person[address]', 'street', '[street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'person[address]', 'street', '[street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', 'person[address]', 'street', '[street]', 'children[address].data'),
            array(self::LEVEL_1, 'address', 'person[address]', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_1, 'address', 'person[address]', 'street', '[street]', 'children[address].data.street.prop'),
            array(self::LEVEL_2, 'address', 'person[address]', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address', 'person[address]', 'street', '[street]', 'children[address].data[street].prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data.person.address.street'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data.person.address.street.prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data.person.address[street]'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data.person.address[street].prop'),
            array(self::LEVEL_1, 'address', 'person[address]', 'street', '[street]', 'data.person[address].street'),
            array(self::LEVEL_1, 'address', 'person[address]', 'street', '[street]', 'data.person[address].street.prop'),
            array(self::LEVEL_2, 'address', 'person[address]', 'street', '[street]', 'data.person[address][street]'),
            array(self::LEVEL_2, 'address', 'person[address]', 'street', '[street]', 'data.person[address][street].prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data[person].address.street'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data[person].address.street.prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data[person].address[street]'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data[person].address[street].prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data[person][address].street'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data[person][address].street.prop'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data[person][address][street]'),
            array(self::LEVEL_0, 'address', 'person[address]', 'street', '[street]', 'data[person][address][street].prop'),

            array(self::LEVEL_2, 'address', '[person].address', 'street', 'street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', '[person].address', 'street', 'street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', '[person].address', 'street', 'street', 'children[address].data'),
            array(self::LEVEL_2, 'address', '[person].address', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_2, 'address', '[person].address', 'street', 'street', 'children[address].data.street.prop'),
            array(self::LEVEL_1, 'address', '[person].address', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1, 'address', '[person].address', 'street', 'street', 'children[address].data[street].prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data.person.address.street'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data.person.address.street.prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data.person.address[street]'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data.person.address[street].prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data.person[address].street'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data.person[address].street.prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data.person[address][street]'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data.person[address][street].prop'),
            array(self::LEVEL_2, 'address', '[person].address', 'street', 'street', 'data[person].address.street'),
            array(self::LEVEL_2, 'address', '[person].address', 'street', 'street', 'data[person].address.street.prop'),
            array(self::LEVEL_1, 'address', '[person].address', 'street', 'street', 'data[person].address[street]'),
            array(self::LEVEL_1, 'address', '[person].address', 'street', 'street', 'data[person].address[street].prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data[person][address].street'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data[person][address].street.prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data[person][address][street]'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', 'street', 'data[person][address][street].prop'),

            array(self::LEVEL_2, 'address', '[person].address', 'street', '[street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', '[person].address', 'street', '[street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', '[person].address', 'street', '[street]', 'children[address].data'),
            array(self::LEVEL_1, 'address', '[person].address', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_1, 'address', '[person].address', 'street', '[street]', 'children[address].data.street.prop'),
            array(self::LEVEL_2, 'address', '[person].address', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address', '[person].address', 'street', '[street]', 'children[address].data[street].prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data.person.address.street'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data.person.address.street.prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data.person.address[street]'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data.person.address[street].prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data.person[address].street'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data.person[address].street.prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data.person[address][street]'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data.person[address][street].prop'),
            array(self::LEVEL_1, 'address', '[person].address', 'street', '[street]', 'data[person].address.street'),
            array(self::LEVEL_1, 'address', '[person].address', 'street', '[street]', 'data[person].address.street.prop'),
            array(self::LEVEL_2, 'address', '[person].address', 'street', '[street]', 'data[person].address[street]'),
            array(self::LEVEL_2, 'address', '[person].address', 'street', '[street]', 'data[person].address[street].prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data[person][address].street'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data[person][address].street.prop'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data[person][address][street]'),
            array(self::LEVEL_0, 'address', '[person].address', 'street', '[street]', 'data[person][address][street].prop'),

            array(self::LEVEL_2, 'address', '[person][address]', 'street', 'street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', '[person][address]', 'street', 'street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', 'street', 'children[address]'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', 'street', 'children[address].data'),
            array(self::LEVEL_2, 'address', '[person][address]', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_2, 'address', '[person][address]', 'street', 'street', 'children[address].data.street.prop'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', 'street', 'children[address].data[street].prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data.person.address.street'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data.person.address.street.prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data.person.address[street]'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data.person.address[street].prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data.person[address].street'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data.person[address].street.prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data.person[address][street]'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data.person[address][street].prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data[person].address.street'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data[person].address.street.prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data[person].address[street]'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', 'street', 'data[person].address[street].prop'),
            array(self::LEVEL_2, 'address', '[person][address]', 'street', 'street', 'data[person][address].street'),
            array(self::LEVEL_2, 'address', '[person][address]', 'street', 'street', 'data[person][address].street.prop'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', 'street', 'data[person][address][street]'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', 'street', 'data[person][address][street].prop'),

            array(self::LEVEL_2, 'address', '[person][address]', 'street', '[street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', '[person][address]', 'street', '[street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', '[street]', 'children[address].data'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', '[street]', 'children[address].data.street.prop'),
            array(self::LEVEL_2, 'address', '[person][address]', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address', '[person][address]', 'street', '[street]', 'children[address].data[street].prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data.person.address.street'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data.person.address.street.prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data.person.address[street]'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data.person.address[street].prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data.person[address].street'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data.person[address].street.prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data.person[address][street]'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data.person[address][street].prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data[person].address.street'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data[person].address.street.prop'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data[person].address[street]'),
            array(self::LEVEL_0, 'address', '[person][address]', 'street', '[street]', 'data[person].address[street].prop'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', '[street]', 'data[person][address].street'),
            array(self::LEVEL_1, 'address', '[person][address]', 'street', '[street]', 'data[person][address].street.prop'),
            array(self::LEVEL_2, 'address', '[person][address]', 'street', '[street]', 'data[person][address][street]'),
            array(self::LEVEL_2, 'address', '[person][address]', 'street', '[street]', 'data[person][address][street].prop'),

            array(self::LEVEL_2, 'address', 'address', 'street', 'office.street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'office.street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].data'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].data.office'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'office.street', 'children[address].data.office.street'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'office.street', 'children[address].data.office.street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].data.office[street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].data.office[street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].data[office]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].data[office].street'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].data[office].street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].data[office][street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].data[office][street].prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'office.street', 'data.address.office.street'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'office.street', 'data.address.office.street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'data.address.office[street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'data.address.office[street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'data.address[office].street'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'data.address[office].street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'data.address[office][street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'data.address[office][street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office.street', 'data[address].office.street'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office.street', 'data[address].office.street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office.street', 'data[address].office[street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office.street', 'data[address].office[street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office.street', 'data[address][office].street'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office.street', 'data[address][office].street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office.street', 'data[address][office][street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office.street', 'data[address][office][street].prop'),

            array(self::LEVEL_2, 'address', '[address]', 'street', 'office.street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'office.street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'children[address].data'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'children[address].data.office'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'office.street', 'children[address].data.office.street'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'office.street', 'children[address].data.office.street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'children[address].data.office[street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'children[address].data.office[street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'children[address].data[office]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'children[address].data[office].street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'children[address].data[office].street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'children[address].data[office][street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'children[address].data[office][street].prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office.street', 'data.address.office.street'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office.street', 'data.address.office.street.prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office.street', 'data.address.office[street]'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office.street', 'data.address.office[street].prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office.street', 'data.address[office].street'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office.street', 'data.address[office].street.prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office.street', 'data.address[office][street]'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office.street', 'data.address[office][street].prop'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'office.street', 'data[address].office.street'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'office.street', 'data[address].office.street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'data[address].office[street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'data[address].office[street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'data[address][office].street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'data[address][office].street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'data[address][office][street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office.street', 'data[address][office][street].prop'),

            array(self::LEVEL_2, 'address', 'address', 'street', 'office[street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'office[street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'children[address].data'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'children[address].data.office'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'children[address].data.office.street'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'children[address].data.office.street.prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'office[street]', 'children[address].data.office[street]'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'office[street]', 'children[address].data.office[street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'children[address].data[office]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'children[address].data[office].street'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'children[address].data[office].street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'children[address].data[office][street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'children[address].data[office][street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'data.address.office.street'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'data.address.office.street.prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'office[street]', 'data.address.office[street]'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'office[street]', 'data.address.office[street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'data.address[office].street'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'data.address[office].street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'data.address[office][street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office[street]', 'data.address[office][street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office[street]', 'data[address].office.street'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office[street]', 'data[address].office.street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office[street]', 'data[address].office[street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office[street]', 'data[address].office[street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office[street]', 'data[address][office].street'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office[street]', 'data[address][office].street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office[street]', 'data[address][office][street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'office[street]', 'data[address][office][street].prop'),

            array(self::LEVEL_2, 'address', '[address]', 'street', 'office[street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'office[street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'children[address].data.office.street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'children[address].data.office.street.prop'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'office[street]', 'children[address].data.office[street]'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'office[street]', 'children[address].data.office[street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'children[address].data[office]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'children[address].data[office].street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'children[address].data[office].street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'children[address].data[office][street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'children[address].data[office][street].prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office[street]', 'data.address.office.street'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office[street]', 'data.address.office.street.prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office[street]', 'data.address.office[street]'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office[street]', 'data.address.office[street].prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office[street]', 'data.address[office].street'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office[street]', 'data.address[office].street.prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office[street]', 'data.address[office][street]'),
            array(self::LEVEL_0, 'address', '[address]', 'street', 'office[street]', 'data.address[office][street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'data[address].office.street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'data[address].office.street.prop'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'office[street]', 'data[address].office[street]'),
            array(self::LEVEL_2, 'address', '[address]', 'street', 'office[street]', 'data[address].office[street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'data[address][office].street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'data[address][office].street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'data[address][office][street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'office[street]', 'data[address][office][street].prop'),

            array(self::LEVEL_2, 'address', 'address', 'street', '[office].street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[office].street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'children[address].data'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'children[address].data.office'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'children[address].data.office.street'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'children[address].data.office.street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'children[address].data.office[street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'children[address].data.office[street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'children[address].data[office]'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[office].street', 'children[address].data[office].street'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[office].street', 'children[address].data[office].street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'children[address].data[office][street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'children[address].data[office][street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'data.address.office.street'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'data.address.office.street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'data.address.office[street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'data.address.office[street].prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[office].street', 'data.address[office].street'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[office].street', 'data.address[office].street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'data.address[office][street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office].street', 'data.address[office][street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office].street', 'data[address].office.street'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office].street', 'data[address].office.street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office].street', 'data[address].office[street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office].street', 'data[address].office[street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office].street', 'data[address][office].street'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office].street', 'data[address][office].street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office].street', 'data[address][office][street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office].street', 'data[address][office][street].prop'),

            array(self::LEVEL_2, 'address', '[address]', 'street', '[office].street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[office].street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'children[address].data'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'children[address].data.office'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'children[address].data.office.street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'children[address].data.office.street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'children[address].data.office[street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'children[address].data.office[street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'children[address].data[office]'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[office].street', 'children[address].data[office].street'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[office].street', 'children[address].data[office].street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'children[address].data[office][street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'children[address].data[office][street].prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office].street', 'data.address.office.street'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office].street', 'data.address.office.street.prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office].street', 'data.address.office[street]'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office].street', 'data.address.office[street].prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office].street', 'data.address[office].street'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office].street', 'data.address[office].street.prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office].street', 'data.address[office][street]'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office].street', 'data.address[office][street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'data[address].office.street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'data[address].office.street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'data[address].office[street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'data[address].office[street].prop'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[office].street', 'data[address][office].street'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[office].street', 'data[address][office].street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'data[address][office][street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office].street', 'data[address][office][street].prop'),

            array(self::LEVEL_2, 'address', 'address', 'street', '[office][street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[office][street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'children[address].data'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'children[address].data.office'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'children[address].data.office.street'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'children[address].data.office.street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'children[address].data.office[street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'children[address].data.office[street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'children[address].data[office]'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'children[address].data[office].street'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'children[address].data[office].street.prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[office][street]', 'children[address].data[office][street]'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[office][street]', 'children[address].data[office][street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'data.address.office.street'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'data.address.office.street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'data.address.office[street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'data.address.office[street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'data.address[office].street'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[office][street]', 'data.address[office].street.prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[office][street]', 'data.address[office][street]'),
            array(self::LEVEL_2, 'address', 'address', 'street', '[office][street]', 'data.address[office][street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office][street]', 'data[address].office.street'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office][street]', 'data[address].office.street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office][street]', 'data[address].office[street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office][street]', 'data[address].office[street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office][street]', 'data[address][office].street'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office][street]', 'data[address][office].street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office][street]', 'data[address][office][street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', '[office][street]', 'data[address][office][street].prop'),

            array(self::LEVEL_2, 'address', '[address]', 'street', '[office][street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[office][street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'children[address].data'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'children[address].data.office'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'children[address].data.office.street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'children[address].data.office.street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'children[address].data.office[street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'children[address].data.office[street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'children[address].data[office]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'children[address].data[office].street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'children[address].data[office].street.prop'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[office][street]', 'children[address].data[office][street]'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[office][street]', 'children[address].data[office][street].prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office][street]', 'data.address.office.street'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office][street]', 'data.address.office.street.prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office][street]', 'data.address.office[street]'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office][street]', 'data.address.office[street].prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office][street]', 'data.address[office].street'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office][street]', 'data.address[office].street.prop'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office][street]', 'data.address[office][street]'),
            array(self::LEVEL_0, 'address', '[address]', 'street', '[office][street]', 'data.address[office][street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'data[address].office.street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'data[address].office.street.prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'data[address].office[street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'data[address].office[street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'data[address][office].street'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[office][street]', 'data[address][office].street.prop'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[office][street]', 'data[address][office][street]'),
            array(self::LEVEL_2, 'address', '[address]', 'street', '[office][street]', 'data[address][office][street].prop'),

            // Edge cases which must not occur
            array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'children[address][street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'children[address][street].prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[street]', 'children[address][street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', '[street]', 'children[address][street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'street', 'children[address][street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', 'street', 'children[address][street].prop'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[street]', 'children[address][street]'),
            array(self::LEVEL_1, 'address', '[address]', 'street', '[street]', 'children[address][street].prop'),

            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'children[person].children[address].children[street]'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'children[person].children[address].data.street'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'children[person].data.address.street'),
            array(self::LEVEL_0, 'address', 'person.address', 'street', 'street', 'data.address.street'),

            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].children[office].children[street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].children[office].data.street'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'children[address].data.street'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'office.street', 'data.address.street'),
        );
    }

    /**
     * @dataProvider provideDefaultTests
     */
    public function testDefaultErrorMapping($target, $childName, $childPath, $grandChildName, $grandChildPath, $violationPath)
    {
        $violation = $this->getConstraintViolation($violationPath);
        $parent = $this->getForm('parent');
        $child = $this->getForm($childName, $childPath);
        $grandChild = $this->getForm($grandChildName, $grandChildPath);

        $parent->add($child);
        $child->add($grandChild);

        $this->mapper->mapViolation($violation, $parent);

        if (self::LEVEL_0 === $target) {
            $this->assertEquals(array($this->getFormError()), $parent->getErrors(), $parent->getName().' should have an error, but has none');
            $this->assertCount(0, $child->getErrors(), $childName.' should not have an error, but has one');
            $this->assertCount(0, $grandChild->getErrors(), $grandChildName.' should not have an error, but has one');
        } elseif (self::LEVEL_1 === $target) {
            $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
            $this->assertEquals(array($this->getFormError()), $child->getErrors(), $childName.' should have an error, but has none');
            $this->assertCount(0, $grandChild->getErrors(), $grandChildName.' should not have an error, but has one');
        } else {
            $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
            $this->assertCount(0, $child->getErrors(), $childName.' should not have an error, but has one');
            $this->assertEquals(array($this->getFormError()), $grandChild->getErrors(), $grandChildName.' should have an error, but has none');
        }
    }

    public function provideCustomDataErrorTests()
    {
        return array(
            // mapping target, error mapping, child name, its property path, grand child name, its property path, violation path
            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.foo'),
            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.foo.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[foo]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[foo].prop'),

            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.address'),
            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.address.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[address]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[address].prop'),

            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.foo'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.foo.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[foo]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[foo].prop'),

            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.address'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.address.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[address]'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[address].prop'),

            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.foo'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.foo.prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[foo]'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[foo].prop'),

            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.address'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.address.prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[address]'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[address].prop'),

            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.foo'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.foo.prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[foo]'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[foo].prop'),

            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.address'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.address.prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[address]'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[address].prop'),

            array(self::LEVEL_2, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.foo.street'),
            array(self::LEVEL_2, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.foo.street.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.foo[street]'),
            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.foo[street].prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[foo].street'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[foo].street.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[foo][street]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[foo][street].prop'),

            array(self::LEVEL_2, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.address.street'),
            array(self::LEVEL_2, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.address.street.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.address[street]'),
            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', 'street', 'data.address[street].prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[address].street'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[address].street.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[address][street]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', 'street', 'data[address][street].prop'),

            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data.foo.street'),
            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data.foo.street.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data.foo[street]'),
            array(self::LEVEL_2, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data.foo[street].prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data[foo].street'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data[foo].street.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data[foo][street]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data[foo][street].prop'),

            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data.address.street'),
            array(self::LEVEL_1, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data.address.street.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data.address[street]'),
            array(self::LEVEL_2, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data.address[street].prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data[address].street'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data[address].street.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data[address][street]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', 'address', 'street', '[street]', 'data[address][street].prop'),

            array(self::LEVEL_2, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.foo.street'),
            array(self::LEVEL_2, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.foo.street.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.foo[street]'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.foo[street].prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[foo].street'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[foo].street.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[foo][street]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[foo][street].prop'),

            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.address.street'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.address.street.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.address[street]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.address[street].prop'),
            array(self::LEVEL_2, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[address].street'),
            array(self::LEVEL_2, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[address].street.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[address][street]'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[address][street].prop'),

            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data.foo.street'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data.foo.street.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data.foo[street]'),
            array(self::LEVEL_2, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data.foo[street].prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data[foo].street'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data[foo].street.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data[foo][street]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data[foo][street].prop'),

            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data.address.street'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data.address.street.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data.address[street]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data.address[street].prop'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data[address].street'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data[address].street.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data[address][street]'),
            array(self::LEVEL_2, 'foo', 'address', 'address', '[address]', 'street', '[street]', 'data[address][street].prop'),

            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.foo.street'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.foo.street.prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.foo[street]'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.foo[street].prop'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[foo].street'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[foo].street.prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[foo][street]'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[foo][street].prop'),

            array(self::LEVEL_2, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.address.street'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.address.street.prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.address[street]'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.address[street].prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[address].street'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[address].street.prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[address][street]'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[address][street].prop'),

            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data.foo.street'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data.foo.street.prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data.foo[street]'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data.foo[street].prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data[foo].street'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data[foo].street.prop'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data[foo][street]'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data[foo][street].prop'),

            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data.address.street'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data.address.street.prop'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data.address[street]'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data.address[street].prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data[address].street'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data[address].street.prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data[address][street]'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', '[street]', 'data[address][street].prop'),

            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.foo.street'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.foo.street.prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.foo[street]'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.foo[street].prop'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[foo].street'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[foo].street.prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[foo][street]'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[foo][street].prop'),

            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.address.street'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.address.street.prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.address[street]'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data.address[street].prop'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[address].street'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[address].street.prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[address][street]'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', 'street', 'data[address][street].prop'),

            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data.foo.street'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data.foo.street.prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data.foo[street]'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data.foo[street].prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data[foo].street'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data[foo].street.prop'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data[foo][street]'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data[foo][street].prop'),

            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data.address.street'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data.address.street.prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data.address[street]'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data.address[street].prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data[address].street'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data[address].street.prop'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data[address][street]'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', '[address]', 'street', '[street]', 'data[address][street].prop'),

            array(self::LEVEL_1, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar'),
            array(self::LEVEL_1, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar]'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar]'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].prop'),

            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.prop'),
            array(self::LEVEL_1, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar]'),
            array(self::LEVEL_1, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar]'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].prop'),

            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar]'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].prop'),
            array(self::LEVEL_1, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar'),
            array(self::LEVEL_1, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar]'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].prop'),

            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar]'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.prop'),
            array(self::LEVEL_1, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar]'),
            array(self::LEVEL_1, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].prop'),

            array(self::LEVEL_2, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.street'),
            array(self::LEVEL_2, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.street.prop'),
            array(self::LEVEL_1, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar[street]'),
            array(self::LEVEL_1, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar[street].prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].street'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].street.prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar][street]'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar][street].prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.street'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.street.prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar[street]'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar[street].prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].street'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].street.prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar][street]'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar][street].prop'),

            array(self::LEVEL_1, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar.street'),
            array(self::LEVEL_1, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar.street.prop'),
            array(self::LEVEL_2, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar[street]'),
            array(self::LEVEL_2, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar[street].prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar].street'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar].street.prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar][street]'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar][street].prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar.street'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar.street.prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar[street]'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar[street].prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar].street'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar].street.prop'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar][street]'),
            array(self::LEVEL_0, 'foo.bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar][street].prop'),

            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.street'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.street.prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar[street]'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar[street].prop'),
            array(self::LEVEL_2, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].street'),
            array(self::LEVEL_2, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].street.prop'),
            array(self::LEVEL_1, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar][street]'),
            array(self::LEVEL_1, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar][street].prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.street'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.street.prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar[street]'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar[street].prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].street'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].street.prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar][street]'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar][street].prop'),

            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar.street'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar.street.prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar[street]'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar[street].prop'),
            array(self::LEVEL_1, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar].street'),
            array(self::LEVEL_1, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar].street.prop'),
            array(self::LEVEL_2, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar][street]'),
            array(self::LEVEL_2, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar][street].prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar.street'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar.street.prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar[street]'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar[street].prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar].street'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar].street.prop'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar][street]'),
            array(self::LEVEL_0, 'foo[bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar][street].prop'),

            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.street'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.street.prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar[street]'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar[street].prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].street'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].street.prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar][street]'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar][street].prop'),
            array(self::LEVEL_2, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.street'),
            array(self::LEVEL_2, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.street.prop'),
            array(self::LEVEL_1, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar[street]'),
            array(self::LEVEL_1, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar[street].prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].street'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].street.prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar][street]'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar][street].prop'),

            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar.street'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar.street.prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar[street]'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar[street].prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar].street'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar].street.prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar][street]'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar][street].prop'),
            array(self::LEVEL_1, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar.street'),
            array(self::LEVEL_1, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar.street.prop'),
            array(self::LEVEL_2, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar[street]'),
            array(self::LEVEL_2, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar[street].prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar].street'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar].street.prop'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar][street]'),
            array(self::LEVEL_0, '[foo].bar', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar][street].prop'),

            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.street'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar.street.prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar[street]'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo.bar[street].prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].street'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar].street.prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar][street]'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data.foo[bar][street].prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.street'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar.street.prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar[street]'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo].bar[street].prop'),
            array(self::LEVEL_2, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].street'),
            array(self::LEVEL_2, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar].street.prop'),
            array(self::LEVEL_1, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar][street]'),
            array(self::LEVEL_1, '[foo][bar]', 'address', 'address', 'address', 'street', 'street', 'data[foo][bar][street].prop'),

            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar.street'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar.street.prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar[street]'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo.bar[street].prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar].street'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar].street.prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar][street]'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data.foo[bar][street].prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar.street'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar.street.prop'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar[street]'),
            array(self::LEVEL_0, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo].bar[street].prop'),
            array(self::LEVEL_1, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar].street'),
            array(self::LEVEL_1, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar].street.prop'),
            array(self::LEVEL_2, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar][street]'),
            array(self::LEVEL_2, '[foo][bar]', 'address', 'address', 'address', 'street', '[street]', 'data[foo][bar][street].prop'),

            array(self::LEVEL_2, 'foo', 'address.street', 'address', 'address', 'street', 'street', 'data.foo'),
            array(self::LEVEL_2, 'foo', 'address.street', 'address', 'address', 'street', 'street', 'data.foo.prop'),
            array(self::LEVEL_2, '[foo]', 'address.street', 'address', 'address', 'street', 'street', 'data[foo]'),
            array(self::LEVEL_2, '[foo]', 'address.street', 'address', 'address', 'street', 'street', 'data[foo].prop'),

            array(self::LEVEL_2, 'foo', 'address.street', 'address', 'address', 'street', '[street]', 'data.foo'),
            array(self::LEVEL_2, 'foo', 'address.street', 'address', 'address', 'street', '[street]', 'data.foo.prop'),
            array(self::LEVEL_2, '[foo]', 'address.street', 'address', 'address', 'street', '[street]', 'data[foo]'),
            array(self::LEVEL_2, '[foo]', 'address.street', 'address', 'address', 'street', '[street]', 'data[foo].prop'),

            array(self::LEVEL_2, 'foo', 'address.street', 'address', '[address]', 'street', 'street', 'data.foo'),
            array(self::LEVEL_2, 'foo', 'address.street', 'address', '[address]', 'street', 'street', 'data.foo.prop'),
            array(self::LEVEL_2, '[foo]', 'address.street', 'address', '[address]', 'street', 'street', 'data[foo]'),
            array(self::LEVEL_2, '[foo]', 'address.street', 'address', '[address]', 'street', 'street', 'data[foo].prop'),

            array(self::LEVEL_2, 'foo.bar', 'address.street', 'address', 'address', 'street', 'street', 'data.foo.bar'),
            array(self::LEVEL_2, 'foo.bar', 'address.street', 'address', 'address', 'street', 'street', 'data.foo.bar.prop'),
            array(self::LEVEL_2, 'foo[bar]', 'address.street', 'address', 'address', 'street', 'street', 'data.foo[bar]'),
            array(self::LEVEL_2, 'foo[bar]', 'address.street', 'address', 'address', 'street', 'street', 'data.foo[bar].prop'),
            array(self::LEVEL_2, '[foo].bar', 'address.street', 'address', 'address', 'street', 'street', 'data[foo].bar'),
            array(self::LEVEL_2, '[foo].bar', 'address.street', 'address', 'address', 'street', 'street', 'data[foo].bar.prop'),
            array(self::LEVEL_2, '[foo][bar]', 'address.street', 'address', 'address', 'street', 'street', 'data[foo][bar]'),
            array(self::LEVEL_2, '[foo][bar]', 'address.street', 'address', 'address', 'street', 'street', 'data[foo][bar].prop'),

            array(self::LEVEL_2, 'foo.bar', 'address.street', 'address', 'address', 'street', '[street]', 'data.foo.bar'),
            array(self::LEVEL_2, 'foo.bar', 'address.street', 'address', 'address', 'street', '[street]', 'data.foo.bar.prop'),
            array(self::LEVEL_2, 'foo[bar]', 'address.street', 'address', 'address', 'street', '[street]', 'data.foo[bar]'),
            array(self::LEVEL_2, 'foo[bar]', 'address.street', 'address', 'address', 'street', '[street]', 'data.foo[bar].prop'),
            array(self::LEVEL_2, '[foo].bar', 'address.street', 'address', 'address', 'street', '[street]', 'data[foo].bar'),
            array(self::LEVEL_2, '[foo].bar', 'address.street', 'address', 'address', 'street', '[street]', 'data[foo].bar.prop'),
            array(self::LEVEL_2, '[foo][bar]', 'address.street', 'address', 'address', 'street', '[street]', 'data[foo][bar]'),
            array(self::LEVEL_2, '[foo][bar]', 'address.street', 'address', 'address', 'street', '[street]', 'data[foo][bar].prop'),

            array(self::LEVEL_2, 'foo.bar', 'address.street', 'address', '[address]', 'street', 'street', 'data.foo.bar'),
            array(self::LEVEL_2, 'foo.bar', 'address.street', 'address', '[address]', 'street', 'street', 'data.foo.bar.prop'),
            array(self::LEVEL_2, 'foo[bar]', 'address.street', 'address', '[address]', 'street', 'street', 'data.foo[bar]'),
            array(self::LEVEL_2, 'foo[bar]', 'address.street', 'address', '[address]', 'street', 'street', 'data.foo[bar].prop'),
            array(self::LEVEL_2, '[foo].bar', 'address.street', 'address', '[address]', 'street', 'street', 'data[foo].bar'),
            array(self::LEVEL_2, '[foo].bar', 'address.street', 'address', '[address]', 'street', 'street', 'data[foo].bar.prop'),
            array(self::LEVEL_2, '[foo][bar]', 'address.street', 'address', '[address]', 'street', 'street', 'data[foo][bar]'),
            array(self::LEVEL_2, '[foo][bar]', 'address.street', 'address', '[address]', 'street', 'street', 'data[foo][bar].prop'),

            // Edge cases
            array(self::LEVEL_2, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.foo.street'),
            array(self::LEVEL_2, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.foo.street.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.foo[street]'),
            array(self::LEVEL_1, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data.foo[street].prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[foo].street'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[foo].street.prop'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[foo][street]'),
            array(self::LEVEL_0, 'foo', 'address', 'address', '[address]', 'street', 'street', 'data[foo][street].prop'),

            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.foo.street'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.foo.street.prop'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.foo[street]'),
            array(self::LEVEL_0, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data.foo[street].prop'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[foo].street'),
            array(self::LEVEL_2, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[foo].street.prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[foo][street]'),
            array(self::LEVEL_1, '[foo]', 'address', 'address', 'address', 'street', 'street', 'data[foo][street].prop'),
        );
    }

    /**
     * @dataProvider provideCustomDataErrorTests
     */
    public function testCustomDataErrorMapping($target, $mapFrom, $mapTo, $childName, $childPath, $grandChildName, $grandChildPath, $violationPath)
    {
        $violation = $this->getConstraintViolation($violationPath);
        $parent = $this->getForm('parent', null, null, array($mapFrom => $mapTo));
        $child = $this->getForm($childName, $childPath);
        $grandChild = $this->getForm($grandChildName, $grandChildPath);

        $parent->add($child);
        $child->add($grandChild);

        // Add a field mapped to the first element of $mapFrom
        // to try to distract the algorithm
        // Only add it if we expect the error to come up on a different
        // level than LEVEL_0, because in this case the error would
        // (correctly) be mapped to the distraction field
        if ($target !== self::LEVEL_0) {
            $mapFromPath = new PropertyPath($mapFrom);
            $mapFromPrefix = $mapFromPath->isIndex(0)
                ? '['.$mapFromPath->getElement(0).']'
                : $mapFromPath->getElement(0);
            $distraction = $this->getForm('distraction', $mapFromPrefix);

            $parent->add($distraction);
        }

        $this->mapper->mapViolation($violation, $parent);

        if ($target !== self::LEVEL_0) {
            $this->assertCount(0, $distraction->getErrors(), 'distraction should not have an error, but has one');
        }

        if (self::LEVEL_0 === $target) {
            $this->assertEquals(array($this->getFormError()), $parent->getErrors(), $parent->getName().' should have an error, but has none');
            $this->assertCount(0, $child->getErrors(), $childName.' should not have an error, but has one');
            $this->assertCount(0, $grandChild->getErrors(), $grandChildName.' should not have an error, but has one');
        } elseif (self::LEVEL_1 === $target) {
            $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
            $this->assertEquals(array($this->getFormError()), $child->getErrors(), $childName.' should have an error, but has none');
            $this->assertCount(0, $grandChild->getErrors(), $grandChildName.' should not have an error, but has one');
        } else {
            $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
            $this->assertCount(0, $child->getErrors(), $childName.' should not have an error, but has one');
            $this->assertEquals(array($this->getFormError()), $grandChild->getErrors(), $grandChildName.' should have an error, but has none');
        }
    }

    public function provideCustomFormErrorTests()
    {
        // This case is different than the data errors, because here the
        // left side of the mapping refers to the property path of the actual
        // children. In other words, a child error only works if
        // 1) the error actually maps to an existing child and
        // 2) the property path of that child (relative to the form providing
        //    the mapping) matches the left side of the mapping
        return array(
            // mapping target, map from, map to, child name, its property path, grand child name, its property path, violation path
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].children[street].data'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].children[street].data.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].data.street'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].data.street.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].data[street]'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].data[street].prop'),

            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data.street.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data[street].prop'),

            // Property path of the erroneous field and mapping must match exactly
            array(self::LEVEL_1B, 'foo', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].children[street].data'),
            array(self::LEVEL_1B, 'foo', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].children[street].data.prop'),
            array(self::LEVEL_1B, 'foo', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].data.street'),
            array(self::LEVEL_1B, 'foo', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].data.street.prop'),
            array(self::LEVEL_1B, 'foo', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].data[street]'),
            array(self::LEVEL_1B, 'foo', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].data[street].prop'),

            array(self::LEVEL_1B, '[foo]', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].children[street].data'),
            array(self::LEVEL_1B, '[foo]', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].children[street].data.prop'),
            array(self::LEVEL_1B, '[foo]', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].data.street'),
            array(self::LEVEL_1B, '[foo]', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].data.street.prop'),
            array(self::LEVEL_1B, '[foo]', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].data[street]'),
            array(self::LEVEL_1B, '[foo]', 'address', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo].data[street].prop'),

            array(self::LEVEL_1, '[foo]', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].children[street].data'),
            array(self::LEVEL_1, '[foo]', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].children[street].data.prop'),
            array(self::LEVEL_2, '[foo]', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].data.street'),
            array(self::LEVEL_2, '[foo]', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].data.street.prop'),
            array(self::LEVEL_1, '[foo]', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].data[street]'),
            array(self::LEVEL_1, '[foo]', 'address', 'foo', '[foo]', 'address', 'address', 'street', 'street', 'children[foo].data[street].prop'),

            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[foo].children[street].data'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[foo].children[street].data.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[foo].data.street'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[foo].data.street.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[foo].data[street]'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[foo].data[street].prop'),

            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data.street.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data[street].prop'),

            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[foo].children[street].data'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[foo].children[street].data.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[foo].data.street'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[foo].data.street.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[foo].data[street]'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[foo].data[street].prop'),

            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data.street.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data[street].prop'),

            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[foo].children[street].data'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[foo].children[street].data.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[foo].data.street'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[foo].data.street.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[foo].data[street]'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[foo].data[street].prop'),

            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].children[street].data.prop'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_1, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data.street.prop'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, 'foo', 'address', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data[street].prop'),

            // Map to a nested child
            array(self::LEVEL_2, 'foo', 'address.street', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[foo]'),
            array(self::LEVEL_2, 'foo', 'address.street', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[foo]'),
            array(self::LEVEL_2, 'foo', 'address.street', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[foo]'),
            array(self::LEVEL_2, 'foo', 'address.street', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[foo]'),

            // Map from a nested child
            array(self::LEVEL_1B, 'address.street', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].children[street]'),
            array(self::LEVEL_1B, 'address.street', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_1, 'address.street', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address.street', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].children[street]'),
            array(self::LEVEL_1B, 'address.street', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_2, 'address.street', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address.street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].children[street]'),
            array(self::LEVEL_2, 'address.street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_1, 'address.street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address.street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].children[street]'),
            array(self::LEVEL_1, 'address.street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_2, 'address.street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data[street]'),

            array(self::LEVEL_2, 'address[street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].children[street]'),
            array(self::LEVEL_2, 'address[street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_1B, 'address[street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1B, 'address[street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].children[street]'),
            array(self::LEVEL_1, 'address[street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_1B, 'address[street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address[street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].children[street]'),
            array(self::LEVEL_2, 'address[street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_1, 'address[street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_2, 'address[street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].children[street]'),
            array(self::LEVEL_1, 'address[street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_2, 'address[street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data[street]'),

            array(self::LEVEL_2, '[address].street', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].children[street]'),
            array(self::LEVEL_2, '[address].street', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_1, '[address].street', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_2, '[address].street', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].children[street]'),
            array(self::LEVEL_1, '[address].street', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_2, '[address].street', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_1B, '[address].street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].children[street]'),
            array(self::LEVEL_1B, '[address].street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_1, '[address].street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_2, '[address].street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].children[street]'),
            array(self::LEVEL_1B, '[address].street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_2, '[address].street', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data[street]'),

            array(self::LEVEL_2, '[address][street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].children[street]'),
            array(self::LEVEL_2, '[address][street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_1, '[address][street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_2, '[address][street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].children[street]'),
            array(self::LEVEL_1, '[address][street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_2, '[address][street]', 'foo', 'foo', 'foo', 'address', 'address', 'street', '[street]', 'children[address].data[street]'),
            array(self::LEVEL_2, '[address][street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].children[street]'),
            array(self::LEVEL_2, '[address][street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_1B, '[address][street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1B, '[address][street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].children[street]'),
            array(self::LEVEL_1, '[address][street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data.street'),
            array(self::LEVEL_1B, '[address][street]', 'foo', 'foo', 'foo', 'address', '[address]', 'street', '[street]', 'children[address].data[street]'),
        );
    }

    /**
     * @dataProvider provideCustomFormErrorTests
     */
    public function testCustomFormErrorMapping($target, $mapFrom, $mapTo, $errorName, $errorPath, $childName, $childPath, $grandChildName, $grandChildPath, $violationPath)
    {
        $violation = $this->getConstraintViolation($violationPath);
        $parent = $this->getForm('parent', null, null, array($mapFrom => $mapTo));
        $child = $this->getForm($childName, $childPath);
        $grandChild = $this->getForm($grandChildName, $grandChildPath);
        $errorChild = $this->getForm($errorName, $errorPath);

        $parent->add($child);
        $parent->add($errorChild);
        $child->add($grandChild);

        $this->mapper->mapViolation($violation, $parent);

        if (self::LEVEL_0 === $target) {
            $this->assertCount(0, $errorChild->getErrors(), $errorName.' should not have an error, but has one');
            $this->assertEquals(array($this->getFormError()), $parent->getErrors(), $parent->getName().' should have an error, but has none');
            $this->assertCount(0, $child->getErrors(), $childName.' should not have an error, but has one');
            $this->assertCount(0, $grandChild->getErrors(), $grandChildName.' should not have an error, but has one');
        } elseif (self::LEVEL_1 === $target) {
            $this->assertCount(0, $errorChild->getErrors(), $errorName.' should not have an error, but has one');
            $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
            $this->assertEquals(array($this->getFormError()), $child->getErrors(), $childName.' should have an error, but has none');
            $this->assertCount(0, $grandChild->getErrors(), $grandChildName.' should not have an error, but has one');
        } elseif (self::LEVEL_1B === $target) {
            $this->assertEquals(array($this->getFormError()), $errorChild->getErrors(), $errorName.' should have an error, but has none');
            $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
            $this->assertCount(0, $child->getErrors(), $childName.' should not have an error, but has one');
            $this->assertCount(0, $grandChild->getErrors(), $grandChildName.' should not have an error, but has one');
        } else {
            $this->assertCount(0, $errorChild->getErrors(), $errorName.' should not have an error, but has one');
            $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
            $this->assertCount(0, $child->getErrors(), $childName.' should not have an error, but has one');
            $this->assertEquals(array($this->getFormError()), $grandChild->getErrors(), $grandChildName.' should have an error, but has none');
        }
    }

    public function provideErrorTestsForFormInheritingParentData()
    {
        return array(
            // mapping target, child name, its property path, grand child name, its property path, violation path
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'children[address].children[street].data'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'children[address].children[street].data.prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'children[address].data.street'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'children[address].data.street.prop'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'children[address].data[street]'),
            array(self::LEVEL_1, 'address', 'address', 'street', 'street', 'children[address].data[street].prop'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'data.street'),
            array(self::LEVEL_2, 'address', 'address', 'street', 'street', 'data.street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data[street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data[street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data.address.street'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data.address.street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data.address[street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data.address[street].prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data[address].street'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data[address].street.prop'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data[address][street]'),
            array(self::LEVEL_0, 'address', 'address', 'street', 'street', 'data[address][street].prop'),
        );
    }

    /**
     * @dataProvider provideErrorTestsForFormInheritingParentData
     */
    public function testErrorMappingForFormInheritingParentData($target, $childName, $childPath, $grandChildName, $grandChildPath, $violationPath)
    {
        $violation = $this->getConstraintViolation($violationPath);
        $parent = $this->getForm('parent');
        $child = $this->getForm($childName, $childPath, null, array(), true);
        $grandChild = $this->getForm($grandChildName, $grandChildPath);

        $parent->add($child);
        $child->add($grandChild);

        $this->mapper->mapViolation($violation, $parent);

        if (self::LEVEL_0 === $target) {
            $this->assertEquals(array($this->getFormError()), $parent->getErrors(), $parent->getName().' should have an error, but has none');
            $this->assertCount(0, $child->getErrors(), $childName.' should not have an error, but has one');
            $this->assertCount(0, $grandChild->getErrors(), $grandChildName.' should not have an error, but has one');
        } elseif (self::LEVEL_1 === $target) {
            $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
            $this->assertEquals(array($this->getFormError()), $child->getErrors(), $childName.' should have an error, but has none');
            $this->assertCount(0, $grandChild->getErrors(), $grandChildName.' should not have an error, but has one');
        } else {
            $this->assertCount(0, $parent->getErrors(), $parent->getName().' should not have an error, but has one');
            $this->assertCount(0, $child->getErrors(), $childName.' should not have an error, but has one');
            $this->assertEquals(array($this->getFormError()), $grandChild->getErrors(), $grandChildName.' should have an error, but has none');
        }
    }
}
PK�b�\S�m�ipear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Type/SubmitTypeValidatorExtensionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Validator\Type;

class SubmitTypeValidatorExtensionTest extends BaseValidatorExtensionTest
{
    protected function createForm(array $options = array())
    {
        return $this->factory->create('submit', null, $options);
    }
}
PK�b�\Y��
xxcpear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Validator\Type;

use Symfony\Component\Form\Test\FormInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class BaseValidatorExtensionTest extends TypeTestCase
{
    public function testValidationGroupNullByDefault()
    {
        $form = $this->createForm();

        $this->assertNull($form->getConfig()->getOption('validation_groups'));
    }

    public function testValidationGroupsTransformedToArray()
    {
        $form = $this->createForm(array(
            'validation_groups' => 'group',
        ));

        $this->assertEquals(array('group'), $form->getConfig()->getOption('validation_groups'));
    }

    public function testValidationGroupsCanBeSetToArray()
    {
        $form = $this->createForm(array(
            'validation_groups' => array('group1', 'group2'),
        ));

        $this->assertEquals(array('group1', 'group2'), $form->getConfig()->getOption('validation_groups'));
    }

    public function testValidationGroupsCanBeSetToFalse()
    {
        $form = $this->createForm(array(
            'validation_groups' => false,
        ));

        $this->assertEquals(array(), $form->getConfig()->getOption('validation_groups'));
    }

    public function testValidationGroupsCanBeSetToCallback()
    {
        $form = $this->createForm(array(
            'validation_groups' => array($this, 'testValidationGroupsCanBeSetToCallback'),
        ));

        $this->assertTrue(is_callable($form->getConfig()->getOption('validation_groups')));
    }

    public function testValidationGroupsCanBeSetToClosure()
    {
        $form = $this->createForm(array(
            'validation_groups' => function (FormInterface $form) { return null; },
        ));

        $this->assertTrue(is_callable($form->getConfig()->getOption('validation_groups')));
    }

    abstract protected function createForm(array $options = array());
}
PK�b�\7>lˉ�gpear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Validator\Type;

use Symfony\Component\Validator\ConstraintViolationList;

class FormTypeValidatorExtensionTest extends BaseValidatorExtensionTest
{
    public function testSubmitValidatesData()
    {
        $builder = $this->factory->createBuilder(
            'form',
            null,
            array(
                'validation_groups' => 'group',
            )
        );
        $builder->add('firstName', 'form');
        $form = $builder->getForm();

        $this->validator->expects($this->once())
            ->method('validate')
            ->with($this->equalTo($form))
            ->will($this->returnValue(new ConstraintViolationList()));

        // specific data is irrelevant
        $form->submit(array());
    }

    protected function createForm(array $options = array())
    {
        return $this->factory->create('form', null, $options);
    }
}
PK�b�\`f�[��Upear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Type/TypeTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Validator\Type;

use Symfony\Component\Form\Test\TypeTestCase as BaseTypeTestCase;
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;

abstract class TypeTestCase extends BaseTypeTestCase
{
    protected $validator;

    protected function setUp()
    {
        $this->validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface');
        $metadataFactory = $this->getMock('Symfony\Component\Validator\MetadataFactoryInterface');
        $this->validator->expects($this->once())->method('getMetadataFactory')->will($this->returnValue($metadataFactory));
        $metadata = $this->getMockBuilder('Symfony\Component\Validator\Mapping\ClassMetadata')->disableOriginalConstructor()->getMock();
        $metadataFactory->expects($this->once())->method('getMetadataFor')->will($this->returnValue($metadata));

        parent::setUp();
    }

    protected function tearDown()
    {
        $this->validator = null;

        parent::tearDown();
    }

    protected function getExtensions()
    {
        return array_merge(parent::getExtensions(), array(
            new ValidatorExtension($this->validator),
        ));
    }
}
PK�b�\ِ�GbGbapear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Validator\Constraints;

use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\Extension\Validator\Constraints\Form;
use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator;
use Symfony\Component\Form\SubmitButtonBuilder;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints\NotNull;
use Symfony\Component\Validator\Constraints\NotBlank;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormValidatorTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dispatcher;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $factory;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $serverParams;

    /**
     * @var FormValidator
     */
    private $validator;

    protected function setUp()
    {
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
        $this->serverParams = $this->getMock(
            'Symfony\Component\Form\Extension\Validator\Util\ServerParams',
            array('getNormalizedIniPostMaxSize', 'getContentLength')
        );
        $this->validator = new FormValidator($this->serverParams);
    }

    public function testValidate()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');
        $options = array('validation_groups' => array('group1', 'group2'));
        $form = $this->getBuilder('name', '\stdClass', $options)
            ->setData($object)
            ->getForm();

        $context->expects($this->at(0))
            ->method('validate')
            ->with($object, 'data', 'group1', true);
        $context->expects($this->at(1))
            ->method('validate')
            ->with($object, 'data', 'group2', true);

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testValidateConstraints()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');
        $constraint1 = new NotNull(array('groups' => array('group1', 'group2')));
        $constraint2 = new NotBlank(array('groups' => 'group2'));

        $options = array(
            'validation_groups' => array('group1', 'group2'),
            'constraints' => array($constraint1, $constraint2),
        );
        $form = $this->getBuilder('name', '\stdClass', $options)
            ->setData($object)
            ->getForm();

        // First default constraints
        $context->expects($this->at(0))
            ->method('validate')
            ->with($object, 'data', 'group1', true);
        $context->expects($this->at(1))
            ->method('validate')
            ->with($object, 'data', 'group2', true);

        // Then custom constraints
        $context->expects($this->at(2))
            ->method('validateValue')
            ->with($object, $constraint1, 'data', 'group1');
        $context->expects($this->at(3))
            ->method('validateValue')
            ->with($object, $constraint2, 'data', 'group2');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testDontValidateIfParentWithoutCascadeValidation()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');

        $parent = $this->getBuilder('parent', null, array('cascade_validation' => false))
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $options = array('validation_groups' => array('group1', 'group2'));
        $form = $this->getBuilder('name', '\stdClass', $options)->getForm();
        $parent->add($form);

        $form->setData($object);

        $context->expects($this->never())
            ->method('validate');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testValidateConstraintsEvenIfNoCascadeValidation()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');
        $constraint1 = new NotNull(array('groups' => array('group1', 'group2')));
        $constraint2 = new NotBlank(array('groups' => 'group2'));

        $parent = $this->getBuilder('parent', null, array('cascade_validation' => false))
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $options = array(
            'validation_groups' => array('group1', 'group2'),
            'constraints' => array($constraint1, $constraint2),
        );
        $form = $this->getBuilder('name', '\stdClass', $options)
            ->setData($object)
            ->getForm();
        $parent->add($form);

        $context->expects($this->at(0))
            ->method('validateValue')
            ->with($object, $constraint1, 'data', 'group1');
        $context->expects($this->at(1))
            ->method('validateValue')
            ->with($object, $constraint2, 'data', 'group2');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testDontValidateIfNoValidationGroups()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');

        $form = $this->getBuilder('name', '\stdClass', array(
                'validation_groups' => array(),
            ))
            ->setData($object)
            ->getForm();

        $form->setData($object);

        $context->expects($this->never())
            ->method('validate');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testDontValidateConstraintsIfNoValidationGroups()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');
        $constraint1 = $this->getMock('Symfony\Component\Validator\Constraint');
        $constraint2 = $this->getMock('Symfony\Component\Validator\Constraint');

        $options = array(
            'validation_groups' => array(),
            'constraints' => array($constraint1, $constraint2),
        );
        $form = $this->getBuilder('name', '\stdClass', $options)
            ->setData($object)
            ->getForm();

        // Launch transformer
        $form->submit(array());

        $context->expects($this->never())
            ->method('validate');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testDontValidateIfNotSynchronized()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');

        $form = $this->getBuilder('name', '\stdClass', array(
                'invalid_message' => 'invalid_message_key',
                // Invalid message parameters must be supported, because the
                // invalid message can be a translation key
                // see https://github.com/symfony/symfony/issues/5144
                'invalid_message_parameters' => array('{{ foo }}' => 'bar'),
            ))
            ->setData($object)
            ->addViewTransformer(new CallbackTransformer(
                function ($data) { return $data; },
                function () { throw new TransformationFailedException(); }
            ))
            ->getForm();

        // Launch transformer
        $form->submit('foo');

        $context->expects($this->never())
            ->method('validate');

        $context->expects($this->once())
            ->method('addViolation')
            ->with(
                'invalid_message_key',
                array('{{ value }}' => 'foo', '{{ foo }}' => 'bar'),
                'foo'
            );
        $context->expects($this->never())
            ->method('addViolationAt');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testAddInvalidErrorEvenIfNoValidationGroups()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');

        $form = $this->getBuilder('name', '\stdClass', array(
                'invalid_message' => 'invalid_message_key',
                // Invalid message parameters must be supported, because the
                // invalid message can be a translation key
                // see https://github.com/symfony/symfony/issues/5144
                'invalid_message_parameters' => array('{{ foo }}' => 'bar'),
                'validation_groups' => array(),
            ))
            ->setData($object)
            ->addViewTransformer(new CallbackTransformer(
                    function ($data) { return $data; },
                    function () { throw new TransformationFailedException(); }
                ))
            ->getForm();

        // Launch transformer
        $form->submit('foo');

        $context->expects($this->never())
            ->method('validate');

        $context->expects($this->once())
            ->method('addViolation')
            ->with(
                'invalid_message_key',
                array('{{ value }}' => 'foo', '{{ foo }}' => 'bar'),
                'foo'
            );
        $context->expects($this->never())
            ->method('addViolationAt');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testDontValidateConstraintsIfNotSynchronized()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');
        $constraint1 = $this->getMock('Symfony\Component\Validator\Constraint');
        $constraint2 = $this->getMock('Symfony\Component\Validator\Constraint');

        $options = array(
            'validation_groups' => array('group1', 'group2'),
            'constraints' => array($constraint1, $constraint2),
        );
        $form = $this->getBuilder('name', '\stdClass', $options)
            ->setData($object)
            ->addViewTransformer(new CallbackTransformer(
                function ($data) { return $data; },
                function () { throw new TransformationFailedException(); }
            ))
            ->getForm();

        // Launch transformer
        $form->submit(array());

        $context->expects($this->never())
            ->method('validate');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    // https://github.com/symfony/symfony/issues/4359
    public function testDontMarkInvalidIfAnyChildIsNotSynchronized()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');

        $failingTransformer = new CallbackTransformer(
            function ($data) { return $data; },
            function () { throw new TransformationFailedException(); }
        );

        $form = $this->getBuilder('name', '\stdClass')
            ->setData($object)
            ->addViewTransformer($failingTransformer)
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->add(
                $this->getBuilder('child')
                    ->addViewTransformer($failingTransformer)
            )
            ->getForm();

        // Launch transformer
        $form->submit(array('child' => 'foo'));

        $context->expects($this->never())
            ->method('addViolation');
        $context->expects($this->never())
            ->method('addViolationAt');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testHandleCallbackValidationGroups()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');
        $options = array('validation_groups' => array($this, 'getValidationGroups'));
        $form = $this->getBuilder('name', '\stdClass', $options)
            ->setData($object)
            ->getForm();

        $context->expects($this->at(0))
            ->method('validate')
            ->with($object, 'data', 'group1', true);
        $context->expects($this->at(1))
            ->method('validate')
            ->with($object, 'data', 'group2', true);

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testDontExecuteFunctionNames()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');
        $options = array('validation_groups' => 'header');
        $form = $this->getBuilder('name', '\stdClass', $options)
            ->setData($object)
            ->getForm();

        $context->expects($this->once())
            ->method('validate')
            ->with($object, 'data', 'header', true);

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testHandleClosureValidationGroups()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');
        $options = array('validation_groups' => function (FormInterface $form) {
            return array('group1', 'group2');
        });
        $form = $this->getBuilder('name', '\stdClass', $options)
            ->setData($object)
            ->getForm();

        $context->expects($this->at(0))
            ->method('validate')
            ->with($object, 'data', 'group1', true);
        $context->expects($this->at(1))
            ->method('validate')
            ->with($object, 'data', 'group2', true);

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testUseValidationGroupOfClickedButton()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');

        $parent = $this->getBuilder('parent', null, array('cascade_validation' => true))
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $form = $this->getForm('name', '\stdClass', array(
            'validation_groups' => 'form_group',
        ));

        $parent->add($form);
        $parent->add($this->getSubmitButton('submit', array(
            'validation_groups' => 'button_group',
        )));

        $parent->submit(array('name' => $object, 'submit' => ''));

        $context->expects($this->once())
            ->method('validate')
            ->with($object, 'data', 'button_group', true);

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testDontUseValidationGroupOfUnclickedButton()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');

        $parent = $this->getBuilder('parent', null, array('cascade_validation' => true))
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $form = $this->getForm('name', '\stdClass', array(
            'validation_groups' => 'form_group',
        ));

        $parent->add($form);
        $parent->add($this->getSubmitButton('submit', array(
            'validation_groups' => 'button_group',
        )));

        $form->setData($object);

        $context->expects($this->once())
            ->method('validate')
            ->with($object, 'data', 'form_group', true);

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testUseInheritedValidationGroup()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');

        $parentOptions = array(
            'validation_groups' => 'group',
            'cascade_validation' => true,
        );
        $parent = $this->getBuilder('parent', null, $parentOptions)
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $form = $this->getBuilder('name', '\stdClass')->getForm();
        $parent->add($form);

        $form->setData($object);

        $context->expects($this->once())
            ->method('validate')
            ->with($object, 'data', 'group', true);

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testUseInheritedCallbackValidationGroup()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');

        $parentOptions = array(
            'validation_groups' => array($this, 'getValidationGroups'),
            'cascade_validation' => true,
        );
        $parent = $this->getBuilder('parent', null, $parentOptions)
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $form = $this->getBuilder('name', '\stdClass')->getForm();
        $parent->add($form);

        $form->setData($object);

        $context->expects($this->at(0))
            ->method('validate')
            ->with($object, 'data', 'group1', true);
        $context->expects($this->at(1))
            ->method('validate')
            ->with($object, 'data', 'group2', true);

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testUseInheritedClosureValidationGroup()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');

        $parentOptions = array(
            'validation_groups' => function (FormInterface $form) {
                return array('group1', 'group2');
            },
            'cascade_validation' => true,
        );
        $parent = $this->getBuilder('parent', null, $parentOptions)
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $form = $this->getBuilder('name', '\stdClass')->getForm();
        $parent->add($form);

        $form->setData($object);

        $context->expects($this->at(0))
            ->method('validate')
            ->with($object, 'data', 'group1', true);
        $context->expects($this->at(1))
            ->method('validate')
            ->with($object, 'data', 'group2', true);

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testAppendPropertyPath()
    {
        $context = $this->getMockExecutionContext();
        $object = $this->getMock('\stdClass');
        $form = $this->getBuilder('name', '\stdClass')
            ->setData($object)
            ->getForm();

        $context->expects($this->once())
            ->method('validate')
            ->with($object, 'data', 'Default', true);

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testDontWalkScalars()
    {
        $context = $this->getMockExecutionContext();

        $form = $this->getBuilder()
            ->setData('scalar')
            ->getForm();

        $context->expects($this->never())
            ->method('validate');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function testViolationIfExtraData()
    {
        $context = $this->getMockExecutionContext();

        $form = $this->getBuilder('parent', null, array('extra_fields_message' => 'Extra!'))
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->add($this->getBuilder('child'))
            ->getForm();

        $form->submit(array('foo' => 'bar'));

        $context->expects($this->once())
            ->method('addViolation')
            ->with(
                'Extra!',
                array('{{ extra_fields }}' => 'foo'),
                array('foo' => 'bar')
            );
        $context->expects($this->never())
            ->method('addViolationAt');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    /**
     * @dataProvider getPostMaxSizeFixtures
     */
    public function testPostMaxSizeViolation($contentLength, $iniMax, $nbViolation, array $params = array())
    {
        $this->serverParams->expects($this->once())
            ->method('getContentLength')
            ->will($this->returnValue($contentLength));
        $this->serverParams->expects($this->any())
            ->method('getNormalizedIniPostMaxSize')
            ->will($this->returnValue($iniMax));

        $context = $this->getMockExecutionContext();
        $options = array('post_max_size_message' => 'Max {{ max }}!');
        $form = $this->getBuilder('name', null, $options)->getForm();

        for ($i = 0; $i < $nbViolation; ++$i) {
            if (0 === $i && count($params) > 0) {
                $context->expects($this->at($i))
                    ->method('addViolation')
                    ->with($options['post_max_size_message'], $params);
            } else {
                $context->expects($this->at($i))
                    ->method('addViolation');
            }
        }

        $context->expects($this->never())
            ->method('addViolationAt');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    public function getPostMaxSizeFixtures()
    {
        return array(
            array(pow(1024, 3) + 1, '1G', 1, array('{{ max }}' => '1G')),
            array(pow(1024, 3), '1G', 0),
            array(pow(1024, 2) + 1, '1M', 1, array('{{ max }}' => '1M')),
            array(pow(1024, 2), '1M', 0),
            array(1024 + 1, '1K', 1, array('{{ max }}' => '1K')),
            array(1024, '1K', 0),
            array(null, '1K', 0),
            array(1024, '', 0),
            array(1024, 0, 0),
        );
    }

    public function testNoViolationIfNotRoot()
    {
        $this->serverParams->expects($this->once())
            ->method('getContentLength')
            ->will($this->returnValue(1025));
        $this->serverParams->expects($this->never())
            ->method('getNormalizedIniPostMaxSize');

        $context = $this->getMockExecutionContext();
        $parent = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $form = $this->getForm();
        $parent->add($form);

        $context->expects($this->never())
            ->method('addViolation');
        $context->expects($this->never())
            ->method('addViolationAt');

        $this->validator->initialize($context);
        $this->validator->validate($form, new Form());
    }

    /**
     * Access has to be public, as this method is called via callback array
     * in {@link testValidateFormDataCanHandleCallbackValidationGroups()}
     * and {@link testValidateFormDataUsesInheritedCallbackValidationGroup()}
     */
    public function getValidationGroups(FormInterface $form)
    {
        return array('group1', 'group2');
    }

    private function getMockExecutionContext()
    {
        return $this->getMock('Symfony\Component\Validator\ExecutionContextInterface');
    }

    /**
     * @param string $name
     * @param string $dataClass
     * @param array  $options
     *
     * @return FormBuilder
     */
    private function getBuilder($name = 'name', $dataClass = null, array $options = array())
    {
        $options = array_replace(array(
            'constraints' => array(),
            'invalid_message_parameters' => array(),
        ), $options);

        return new FormBuilder($name, $dataClass, $this->dispatcher, $this->factory, $options);
    }

    private function getForm($name = 'name', $dataClass = null, array $options = array())
    {
        return $this->getBuilder($name, $dataClass, $options)->getForm();
    }

    private function getSubmitButton($name = 'name', array $options = array())
    {
        $builder = new SubmitButtonBuilder($name, $options);

        return $builder->getForm();
    }

    /**
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    private function getDataMapper()
    {
        return $this->getMock('Symfony\Component\Form\DataMapperInterface');
    }
}
PK�b�\��
lpear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorPerformanceTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Validator\Constraints;

use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
use Symfony\Component\Form\Test\FormPerformanceTestCase;
use Symfony\Component\Validator\Validation;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormValidatorPerformanceTest extends FormPerformanceTestCase
{
    protected function getExtensions()
    {
        return array(
            new ValidatorExtension(Validation::createValidator()),
        );
    }

    /**
     * findClickedButton() used to have an exponential number of calls
     *
     * @group benchmark
     */
    public function testValidationPerformance()
    {
        $this->setMaxRunningTime(1);

        $builder = $this->factory->createBuilder('form');

        for ($i = 0; $i < 40; ++$i) {
            $builder->add($i, 'form');

            $builder->get($i)
                ->add('a')
                ->add('b')
                ->add('c');
        }

        $form = $builder->getForm();

        $form->submit(null);
    }
}
PK�b�\ۿt��hpear/test/Form/Symfony/Component/Form/Tests/Extension/Validator/EventListener/ValidationListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Extension\Validator\EventListener;

use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Validator\Constraints\Form;
use Symfony\Component\Form\Extension\Validator\EventListener\ValidationListener;
use Symfony\Component\PropertyAccess\PropertyPath;
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\ConstraintViolationList;

class ValidationListenerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dispatcher;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $factory;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $validator;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $violationMapper;

    /**
     * @var ValidationListener
     */
    private $listener;

    private $message;

    private $messageTemplate;

    private $params;

    protected function setUp()
    {
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
        $this->validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface');
        $this->violationMapper = $this->getMock('Symfony\Component\Form\Extension\Validator\ViolationMapper\ViolationMapperInterface');
        $this->listener = new ValidationListener($this->validator, $this->violationMapper);
        $this->message = 'Message';
        $this->messageTemplate = 'Message template';
        $this->params = array('foo' => 'bar');
    }

    private function getConstraintViolation($code = null)
    {
        return new ConstraintViolation($this->message, $this->messageTemplate, $this->params, null, 'prop.path', null, null, $code);
    }

    private function getBuilder($name = 'name', $propertyPath = null, $dataClass = null)
    {
        $builder = new FormBuilder($name, $dataClass, $this->dispatcher, $this->factory);
        $builder->setPropertyPath(new PropertyPath($propertyPath ?: $name));
        $builder->setAttribute('error_mapping', array());
        $builder->setErrorBubbling(false);
        $builder->setMapped(true);

        return $builder;
    }

    private function getForm($name = 'name', $propertyPath = null, $dataClass = null)
    {
        return $this->getBuilder($name, $propertyPath, $dataClass)->getForm();
    }

    private function getMockForm()
    {
        return $this->getMock('Symfony\Component\Form\Test\FormInterface');
    }

    // More specific mapping tests can be found in ViolationMapperTest
    public function testMapViolation()
    {
        $violation = $this->getConstraintViolation();
        $form = $this->getForm('street');

        $this->validator->expects($this->once())
            ->method('validate')
            ->will($this->returnValue(array($violation)));

        $this->violationMapper->expects($this->once())
            ->method('mapViolation')
            ->with($violation, $form, false);

        $this->listener->validateForm(new FormEvent($form, null));
    }

    public function testMapViolationAllowsNonSyncIfInvalid()
    {
        $violation = $this->getConstraintViolation(Form::ERR_INVALID);
        $form = $this->getForm('street');

        $this->validator->expects($this->once())
            ->method('validate')
            ->will($this->returnValue(array($violation)));

        $this->violationMapper->expects($this->once())
            ->method('mapViolation')
            // pass true now
            ->with($violation, $form, true);

        $this->listener->validateForm(new FormEvent($form, null));
    }

    public function testValidateIgnoresNonRoot()
    {
        $form = $this->getMockForm();
        $form->expects($this->once())
            ->method('isRoot')
            ->will($this->returnValue(false));

        $this->validator->expects($this->never())
            ->method('validate');

        $this->violationMapper->expects($this->never())
            ->method('mapViolation');

        $this->listener->validateForm(new FormEvent($form, null));
    }

    public function testValidateWithEmptyViolationList()
    {
        $form = $this->getMockForm();
        $form->expects($this->once())
            ->method('isRoot')
            ->will($this->returnValue(true));

        $this->validator
            ->expects($this->once())
            ->method('validate')
            ->will($this->returnValue(new ConstraintViolationList()));

        $this->violationMapper
            ->expects($this->never())
            ->method('mapViolation');

        $this->listener->validateForm(new FormEvent($form, null));
    }
}
PK�b�\ȔfVA6A6Gpear/test/Form/Symfony/Component/Form/Tests/Util/OrderedHashMapTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Util;

use Symfony\Component\Form\Util\OrderedHashMap;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class OrderedHashMapTest extends \PHPUnit_Framework_TestCase
{
    public function testGet()
    {
        $map = new OrderedHashMap();
        $map['first'] = 1;

        $this->assertSame(1, $map['first']);
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testGetNonExistingFails()
    {
        $map = new OrderedHashMap();

        $map['first'];
    }

    public function testInsertStringKeys()
    {
        $map = new OrderedHashMap();
        $map['first'] = 1;
        $map['second'] = 2;

        $this->assertSame(array('first' => 1, 'second' => 2), iterator_to_array($map));
    }

    public function testInsertNullKeys()
    {
        $map = new OrderedHashMap();
        $map[] = 1;
        $map['foo'] = 2;
        $map[] = 3;

        $this->assertSame(array(0 => 1, 'foo' => 2, 1 => 3), iterator_to_array($map));
    }

    /**
     * Updates should not change the position of an element, otherwise we could
     * turn foreach loops into endless loops if they change the current
     * element:
     *
     *     foreach ($map as $index => $value) {
     *         $map[$index] = $value + 1;
     *     }
     *
     * And we don't want this, right? :)
     */
    public function testUpdateDoesNotChangeElementPosition()
    {
        $map = new OrderedHashMap();
        $map['first'] = 1;
        $map['second'] = 2;
        $map['first'] = 1;

        $this->assertSame(array('first' => 1, 'second' => 2), iterator_to_array($map));
    }

    public function testIsset()
    {
        $map = new OrderedHashMap();
        $map['first'] = 1;

        $this->assertTrue(isset($map['first']));
    }

    public function testIssetReturnsFalseForNonExisting()
    {
        $map = new OrderedHashMap();

        $this->assertFalse(isset($map['first']));
    }

    public function testIssetReturnsFalseForNull()
    {
        $map = new OrderedHashMap();
        $map['first'] = null;

        $this->assertFalse(isset($map['first']));
    }

    public function testUnset()
    {
        $map = new OrderedHashMap();
        $map['first'] = 1;
        $map['second'] = 2;

        unset($map['first']);

        $this->assertSame(array('second' => 2), iterator_to_array($map));
    }

    public function testUnsetNonExistingSucceeds()
    {
        $map = new OrderedHashMap();

        unset($map['first']);
    }

    public function testEmptyIteration()
    {
        $map = new OrderedHashMap();
        $it = $map->getIterator();

        $it->rewind();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    public function testIterationSupportsInsertion()
    {
        $map = new OrderedHashMap(array('first' => 1));
        $it = $map->getIterator();

        $it->rewind();
        $this->assertTrue($it->valid());
        $this->assertSame('first', $it->key());
        $this->assertSame(1, $it->current());

        // dynamic modification
        $map['added'] = 2;

        // iterator is unchanged
        $this->assertTrue($it->valid());
        $this->assertSame('first', $it->key());
        $this->assertSame(1, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('added', $it->key());
        $this->assertSame(2, $it->current());

        // end of map
        $it->next();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    public function testIterationSupportsDeletionAndInsertion()
    {
        $map = new OrderedHashMap(array('first' => 1, 'removed' => 2));
        $it = $map->getIterator();

        $it->rewind();
        $this->assertTrue($it->valid());
        $this->assertSame('first', $it->key());
        $this->assertSame(1, $it->current());

        // dynamic modification
        unset($map['removed']);
        $map['added'] = 3;

        // iterator is unchanged
        $this->assertTrue($it->valid());
        $this->assertSame('first', $it->key());
        $this->assertSame(1, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('added', $it->key());
        $this->assertSame(3, $it->current());

        // end of map
        $it->next();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    public function testIterationSupportsDeletionOfCurrentElement()
    {
        $map = new OrderedHashMap(array('removed' => 1, 'next' => 2));
        $it = $map->getIterator();

        $it->rewind();
        $this->assertTrue($it->valid());
        $this->assertSame('removed', $it->key());
        $this->assertSame(1, $it->current());

        unset($map['removed']);

        // iterator is unchanged
        $this->assertTrue($it->valid());
        $this->assertSame('removed', $it->key());
        $this->assertSame(1, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('next', $it->key());
        $this->assertSame(2, $it->current());

        // end of map
        $it->next();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    public function testIterationIgnoresReplacementOfCurrentElement()
    {
        $map = new OrderedHashMap(array('replaced' => 1, 'next' => 2));
        $it = $map->getIterator();

        $it->rewind();
        $this->assertTrue($it->valid());
        $this->assertSame('replaced', $it->key());
        $this->assertSame(1, $it->current());

        $map['replaced'] = 3;

        // iterator is unchanged
        $this->assertTrue($it->valid());
        $this->assertSame('replaced', $it->key());
        $this->assertSame(1, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('next', $it->key());
        $this->assertSame(2, $it->current());

        // end of map
        $it->next();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    public function testIterationSupportsDeletionOfCurrentAndLastElement()
    {
        $map = new OrderedHashMap(array('removed' => 1));
        $it = $map->getIterator();

        $it->rewind();
        $this->assertTrue($it->valid());
        $this->assertSame('removed', $it->key());
        $this->assertSame(1, $it->current());

        unset($map['removed']);

        // iterator is unchanged
        $this->assertTrue($it->valid());
        $this->assertSame('removed', $it->key());
        $this->assertSame(1, $it->current());

        // end of map
        $it->next();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    public function testIterationIgnoresReplacementOfCurrentAndLastElement()
    {
        $map = new OrderedHashMap(array('replaced' => 1));
        $it = $map->getIterator();

        $it->rewind();
        $this->assertTrue($it->valid());
        $this->assertSame('replaced', $it->key());
        $this->assertSame(1, $it->current());

        $map['replaced'] = 2;

        // iterator is unchanged
        $this->assertTrue($it->valid());
        $this->assertSame('replaced', $it->key());
        $this->assertSame(1, $it->current());

        // end of map
        $it->next();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    public function testIterationSupportsDeletionOfPreviousElement()
    {
        $map = new OrderedHashMap(array('removed' => 1, 'next' => 2, 'onemore' => 3));
        $it = $map->getIterator();

        $it->rewind();
        $this->assertTrue($it->valid());
        $this->assertSame('removed', $it->key());
        $this->assertSame(1, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('next', $it->key());
        $this->assertSame(2, $it->current());

        unset($map['removed']);

        // iterator is unchanged
        $this->assertTrue($it->valid());
        $this->assertSame('next', $it->key());
        $this->assertSame(2, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('onemore', $it->key());
        $this->assertSame(3, $it->current());

        // end of map
        $it->next();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    public function testIterationIgnoresReplacementOfPreviousElement()
    {
        $map = new OrderedHashMap(array('replaced' => 1, 'next' => 2, 'onemore' => 3));
        $it = $map->getIterator();

        $it->rewind();
        $this->assertTrue($it->valid());
        $this->assertSame('replaced', $it->key());
        $this->assertSame(1, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('next', $it->key());
        $this->assertSame(2, $it->current());

        $map['replaced'] = 4;

        // iterator is unchanged
        $this->assertTrue($it->valid());
        $this->assertSame('next', $it->key());
        $this->assertSame(2, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('onemore', $it->key());
        $this->assertSame(3, $it->current());

        // end of map
        $it->next();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    public function testIterationSupportsDeletionOfMultiplePreviousElements()
    {
        $map = new OrderedHashMap(array('removed' => 1, 'alsoremoved' => 2, 'next' => 3, 'onemore' => 4));
        $it = $map->getIterator();

        $it->rewind();
        $this->assertTrue($it->valid());
        $this->assertSame('removed', $it->key());
        $this->assertSame(1, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('alsoremoved', $it->key());
        $this->assertSame(2, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('next', $it->key());
        $this->assertSame(3, $it->current());

        unset($map['removed'], $map['alsoremoved']);

        // iterator is unchanged
        $this->assertTrue($it->valid());
        $this->assertSame('next', $it->key());
        $this->assertSame(3, $it->current());

        // continue iteration
        $it->next();
        $this->assertTrue($it->valid());
        $this->assertSame('onemore', $it->key());
        $this->assertSame(4, $it->current());

        // end of map
        $it->next();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    public function testParallelIteration()
    {
        $map = new OrderedHashMap(array('first' => 1, 'second' => 2));
        $it1 = $map->getIterator();
        $it2 = $map->getIterator();

        $it1->rewind();
        $this->assertTrue($it1->valid());
        $this->assertSame('first', $it1->key());
        $this->assertSame(1, $it1->current());

        $it2->rewind();
        $this->assertTrue($it2->valid());
        $this->assertSame('first', $it2->key());
        $this->assertSame(1, $it2->current());

        // 1: continue iteration
        $it1->next();
        $this->assertTrue($it1->valid());
        $this->assertSame('second', $it1->key());
        $this->assertSame(2, $it1->current());

        // 2: remains unchanged
        $this->assertTrue($it2->valid());
        $this->assertSame('first', $it2->key());
        $this->assertSame(1, $it2->current());

        // 1: advance to end of map
        $it1->next();
        $this->assertFalse($it1->valid());
        $this->assertNull($it1->key());
        $this->assertNull($it1->current());

        // 2: remains unchanged
        $this->assertTrue($it2->valid());
        $this->assertSame('first', $it2->key());
        $this->assertSame(1, $it2->current());

        // 2: continue iteration
        $it2->next();
        $this->assertTrue($it2->valid());
        $this->assertSame('second', $it2->key());
        $this->assertSame(2, $it2->current());

        // 1: remains unchanged
        $this->assertFalse($it1->valid());
        $this->assertNull($it1->key());
        $this->assertNull($it1->current());

        // 2: advance to end of map
        $it2->next();
        $this->assertFalse($it2->valid());
        $this->assertNull($it2->key());
        $this->assertNull($it2->current());

        // 1: remains unchanged
        $this->assertFalse($it1->valid());
        $this->assertNull($it1->key());
        $this->assertNull($it1->current());
    }

    public function testCount()
    {
        $map = new OrderedHashMap();
        $map[] = 1;
        $map['foo'] = 2;
        unset($map[0]);
        $map[] = 3;

        $this->assertSame(2, count($map));
    }
}
PK�b�\��K)ooKpear/test/Form/Symfony/Component/Form/Tests/CompoundFormPerformanceTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class CompoundFormPerformanceTest extends \Symfony\Component\Form\Tests\FormPerformanceTestCase
{
    /**
     * Create a compound form multiple times, as happens in a collection form
     *
     * @group benchmark
     */
    public function testArrayBasedForm()
    {
        $this->setMaxRunningTime(1);

        for ($i = 0; $i < 40; ++$i) {
            $form = $this->factory->createBuilder('form')
                ->add('firstName', 'text')
                ->add('lastName', 'text')
                ->add('gender', 'choice', array(
                    'choices' => array('male' => 'Male', 'female' => 'Female'),
                    'required' => false,
                ))
                ->add('age', 'number')
                ->add('birthDate', 'birthday')
                ->add('city', 'choice', array(
                    // simulate 300 different cities
                    'choices' => range(1, 300),
                ))
                ->getForm();

            // load the form into a view
            $form->createView();
        }
    }
}
PK�b�\���KKGpear/test/Form/Symfony/Component/Form/Tests/FormPerformanceTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\Test\FormPerformanceTestCase as BaseFormPerformanceTestCase;

/**
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use Symfony\Component\Form\Test\FormPerformanceTestCase instead.
 */
abstract class FormPerformanceTestCase extends BaseFormPerformanceTestCase
{
}
PK�b�\�ag�@<@<Gpear/test/Form/Symfony/Component/Form/Tests/AbstractTableLayoutTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\FormError;
use Symfony\Component\Security\Csrf\CsrfToken;

abstract class AbstractTableLayoutTest extends AbstractLayoutTest
{
    public function testRow()
    {
        $form = $this->factory->createNamed('name', 'text');
        $form->addError(new FormError('[trans]Error![/trans]'));
        $view = $form->createView();
        $html = $this->renderRow($view);

        $this->assertMatchesXpath($html,
'/tr
    [
        ./td
            [./label[@for="name"]]
        /following-sibling::td
            [
                ./ul
                    [./li[.="[trans]Error![/trans]"]]
                    [count(./li)=1]
                /following-sibling::input[@id="name"]
            ]
    ]
'
        );
    }

    public function testLabelIsNotRenderedWhenSetToFalse()
    {
        $form = $this->factory->createNamed('name', 'text', null, array(
            'label' => false
        ));
        $html = $this->renderRow($form->createView());

        $this->assertMatchesXpath($html,
'/tr
    [
        ./td
            [count(//label)=0]
        /following-sibling::td
            [./input[@id="name"]]
    ]
'
        );
    }

    public function testRepeatedRow()
    {
        $form = $this->factory->createNamed('name', 'repeated');
        $html = $this->renderRow($form->createView());

        $this->assertMatchesXpath($html,
'/tr
    [
        ./td
            [./label[@for="name_first"]]
        /following-sibling::td
            [./input[@id="name_first"]]
    ]
/following-sibling::tr
    [
        ./td
            [./label[@for="name_second"]]
        /following-sibling::td
            [./input[@id="name_second"]]
    ]
/following-sibling::tr[@style="display: none"]
    [./td[@colspan="2"]/input
        [@type="hidden"]
        [@id="name__token"]
    ]
    [count(../tr)=3]
'
        );
    }

    public function testRepeatedRowWithErrors()
    {
        $form = $this->factory->createNamed('name', 'repeated');
        $form->addError(new FormError('[trans]Error![/trans]'));
        $view = $form->createView();
        $html = $this->renderRow($view);

        // The errors of the form are not rendered by intention!
        // In practice, repeated fields cannot have errors as all errors
        // on them are mapped to the first child.
        // (see RepeatedTypeValidatorExtension)

        $this->assertMatchesXpath($html,
'/tr
    [
        ./td
            [./label[@for="name_first"]]
        /following-sibling::td
            [./input[@id="name_first"]]
    ]
/following-sibling::tr
    [
        ./td
            [./label[@for="name_second"]]
        /following-sibling::td
            [./input[@id="name_second"]]
    ]
/following-sibling::tr[@style="display: none"]
    [./td[@colspan="2"]/input
        [@type="hidden"]
        [@id="name__token"]
    ]
    [count(../tr)=3]
'
        );
    }

    public function testButtonRow()
    {
        $form = $this->factory->createNamed('name', 'button');
        $view = $form->createView();
        $html = $this->renderRow($view);

        $this->assertMatchesXpath($html,
'/tr
    [
        ./td
            [.=""]
        /following-sibling::td
            [./button[@type="button"][@name="name"]]
    ]
    [count(//label)=0]
'
        );
    }

    public function testRest()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->add('field1', 'text')
            ->add('field2', 'repeated')
            ->add('field3', 'text')
            ->add('field4', 'text')
            ->getForm()
            ->createView();

        // Render field2 row -> does not implicitly call renderWidget because
        // it is a repeated field!
        $this->renderRow($view['field2']);

        // Render field3 widget
        $this->renderWidget($view['field3']);

        // Rest should only contain field1 and field4
        $html = $this->renderRest($view);

        $this->assertMatchesXpath($html,
'/tr
    [
        ./td
            [./label[@for="name_field1"]]
        /following-sibling::td
            [./input[@id="name_field1"]]
    ]
/following-sibling::tr
    [
        ./td
            [./label[@for="name_field4"]]
        /following-sibling::td
            [./input[@id="name_field4"]]
    ]
    [count(../tr)=3]
    [count(..//label)=2]
    [count(..//input)=3]
/following-sibling::tr[@style="display: none"]
    [./td[@colspan="2"]/input
        [@type="hidden"]
        [@id="name__token"]
    ]
'
        );
    }

    public function testCollection()
    {
        $form = $this->factory->createNamed('name', 'collection', array('a', 'b'), array(
            'type' => 'text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/table
    [
        ./tr[./td/input[@type="text"][@value="a"]]
        /following-sibling::tr[./td/input[@type="text"][@value="b"]]
        /following-sibling::tr[@style="display: none"][./td[@colspan="2"]/input[@type="hidden"][@id="name__token"]]
    ]
    [count(./tr[./td/input])=3]
'
        );
    }

    public function testEmptyCollection()
    {
        $form = $this->factory->createNamed('name', 'collection', array(), array(
            'type' => 'text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/table
    [./tr[@style="display: none"][./td[@colspan="2"]/input[@type="hidden"][@id="name__token"]]]
    [count(./tr[./td/input])=1]
'
        );
    }

    public function testForm()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->setMethod('PUT')
            ->setAction('http://example.com')
            ->add('firstName', 'text')
            ->add('lastName', 'text')
            ->getForm()
            ->createView();

        $html = $this->renderForm($view, array(
            'id' => 'my&id',
            'attr' => array('class' => 'my&class'),
        ));

        $this->assertMatchesXpath($html,
'/form
    [
        ./input[@type="hidden"][@name="_method"][@value="PUT"]
        /following-sibling::table
            [
                ./tr
                    [
                        ./td
                            [./label[@for="name_firstName"]]
                        /following-sibling::td
                            [./input[@id="name_firstName"]]
                    ]
                /following-sibling::tr
                    [
                        ./td
                            [./label[@for="name_lastName"]]
                        /following-sibling::td
                            [./input[@id="name_lastName"]]
                    ]
                /following-sibling::tr[@style="display: none"]
                    [./td[@colspan="2"]/input
                        [@type="hidden"]
                        [@id="name__token"]
                    ]
            ]
            [count(.//input)=3]
            [@id="my&id"]
            [@class="my&class"]
    ]
    [@method="post"]
    [@action="http://example.com"]
    [@class="my&class"]
'
        );
    }

    public function testFormWidget()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->add('firstName', 'text')
            ->add('lastName', 'text')
            ->getForm()
            ->createView();

        $this->assertWidgetMatchesXpath($view, array(),
'/table
    [
        ./tr
            [
                ./td
                    [./label[@for="name_firstName"]]
                /following-sibling::td
                    [./input[@id="name_firstName"]]
            ]
        /following-sibling::tr
            [
                ./td
                    [./label[@for="name_lastName"]]
                /following-sibling::td
                    [./input[@id="name_lastName"]]
            ]
        /following-sibling::tr[@style="display: none"]
            [./td[@colspan="2"]/input
                [@type="hidden"]
                [@id="name__token"]
            ]
    ]
    [count(.//input)=3]
'
        );
    }

    // https://github.com/symfony/symfony/issues/2308
    public function testNestedFormError()
    {
        $form = $this->factory->createNamedBuilder('name', 'form')
            ->add($this->factory
                ->createNamedBuilder('child', 'form', null, array('error_bubbling' => false))
                ->add('grandChild', 'form')
            )
            ->getForm();

        $form->get('child')->addError(new FormError('[trans]Error![/trans]'));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/table
    [
        ./tr/td/ul[./li[.="[trans]Error![/trans]"]]
        /following-sibling::table[@id="name_child"]
    ]
    [count(.//li[.="[trans]Error![/trans]"])=1]
'
        );
    }

    public function testCsrf()
    {
        $this->csrfTokenManager->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue(new CsrfToken('token_id', 'foo&bar')));

        $form = $this->factory->createNamedBuilder('name', 'form')
            ->add($this->factory
                // No CSRF protection on nested forms
                ->createNamedBuilder('child', 'form')
                ->add($this->factory->createNamedBuilder('grandchild', 'text'))
            )
            ->getForm();

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/table
    [
        ./tr[@style="display: none"]
            [./td[@colspan="2"]/input
                [@type="hidden"]
                [@id="name__token"]
            ]
    ]
    [count(.//input[@type="hidden"])=1]
'
        );
    }

    public function testRepeated()
    {
        $form = $this->factory->createNamed('name', 'repeated', 'foobar', array(
            'type' => 'text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/table
    [
        ./tr
            [
                ./td
                    [./label[@for="name_first"]]
                /following-sibling::td
                    [./input[@type="text"][@id="name_first"]]
            ]
        /following-sibling::tr
            [
                ./td
                    [./label[@for="name_second"]]
                /following-sibling::td
                    [./input[@type="text"][@id="name_second"]]
            ]
        /following-sibling::tr[@style="display: none"]
            [./td[@colspan="2"]/input
                [@type="hidden"]
                [@id="name__token"]
            ]
    ]
    [count(.//input)=3]
'
        );
    }

    public function testRepeatedWithCustomOptions()
    {
        $form = $this->factory->createNamed('name', 'repeated', 'foobar', array(
            'type'           => 'password',
            'first_options'  => array('label' => 'Test', 'required' => false),
            'second_options' => array('label' => 'Test2')
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/table
    [
        ./tr
            [
                ./td
                    [./label[@for="name_first"][.="[trans]Test[/trans]"]]
                /following-sibling::td
                    [./input[@type="password"][@id="name_first"][@required="required"]]
            ]
        /following-sibling::tr
            [
                ./td
                    [./label[@for="name_second"][.="[trans]Test2[/trans]"]]
                /following-sibling::td
                    [./input[@type="password"][@id="name_second"][@required="required"]]
            ]
        /following-sibling::tr[@style="display: none"]
            [./td[@colspan="2"]/input
                [@type="hidden"]
                [@id="name__token"]
            ]
    ]
    [count(.//input)=3]
'
        );
    }

    /**
     * The block "_name_child_label" should be overridden in the theme of the
     * implemented driver.
     */
    public function testCollectionRowWithCustomBlock()
    {
        $collection = array('one', 'two', 'three');
        $form = $this->factory->createNamedBuilder('name', 'collection', $collection)
            ->getForm();

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/table
    [
        ./tr[./td/label[.="Custom label: [trans]0[/trans]"]]
        /following-sibling::tr[./td/label[.="Custom label: [trans]1[/trans]"]]
        /following-sibling::tr[./td/label[.="Custom label: [trans]2[/trans]"]]
    ]
'
        );
    }

    public function testFormEndWithRest()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->add('field1', 'text')
            ->add('field2', 'text')
            ->getForm()
            ->createView();

        $this->renderWidget($view['field1']);

        // Rest should only contain field2
        $html = $this->renderEnd($view);

        // Insert the start tag, the end tag should be rendered by the helper
        // Unfortunately this is not valid HTML, because the surrounding table
        // tag is missing. If someone renders a form with table layout
        // manually, she should call form_rest() explicitly within the <table>
        // tag.
        $this->assertMatchesXpath('<form>' . $html,
'/form
    [
        ./tr
            [
                ./td
                    [./label[@for="name_field2"]]
                /following-sibling::td
                    [./input[@id="name_field2"]]
            ]
        /following-sibling::tr[@style="display: none"]
            [./td[@colspan="2"]/input
                [@type="hidden"]
                [@id="name__token"]
            ]
    ]
'
        );
    }

    public function testFormEndWithoutRest()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->add('field1', 'text')
            ->add('field2', 'text')
            ->getForm()
            ->createView();

        $this->renderWidget($view['field1']);

        // Rest should only contain field2, but isn't rendered
        $html = $this->renderEnd($view, array('render_rest' => false));

        $this->assertEquals('</form>', $html);
    }

    public function testWidgetContainerAttributes()
    {
        $form = $this->factory->createNamed('form', 'form', null, array(
            'attr' => array('class' => 'foobar', 'data-foo' => 'bar'),
        ));

        $form->add('text', 'text');

        $html = $this->renderWidget($form->createView());

        // compare plain HTML to check the whitespace
        $this->assertContains('<table id="form" class="foobar" data-foo="bar">', $html);
    }

    public function testWidgetContainerAttributeNameRepeatedIfTrue()
    {
        $form = $this->factory->createNamed('form', 'form', null, array(
            'attr' => array('foo' => true),
        ));

        $html = $this->renderWidget($form->createView());

        // foo="foo"
        $this->assertContains('<table id="form" foo="foo">', $html);
    }

    public function testWidgetContainerAttributeHiddenIfFalse()
    {
        $form = $this->factory->createNamed('form', 'form', null, array(
            'attr' => array('foo' => false),
        ));

        $html = $this->renderWidget($form->createView());

        // no foo
        $this->assertContains('<table id="form">', $html);
    }
}
PK�b�\�'�Epear/test/Form/Symfony/Component/Form/Tests/AbstractExtensionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\AbstractExtension;
use Symfony\Component\Form\Tests\Fixtures\FooType;

class AbstractExtensionTest extends \PHPUnit_Framework_TestCase
{
    public function testHasType()
    {
        $loader = new ConcreteExtension();
        $this->assertTrue($loader->hasType('foo'));
        $this->assertFalse($loader->hasType('bar'));
    }

    public function testGetType()
    {
        $loader = new ConcreteExtension();
        $this->assertInstanceOf('Symfony\Component\Form\Tests\Fixtures\FooType', $loader->getType('foo'));
    }
}

class ConcreteExtension extends AbstractExtension
{
    protected function loadTypes()
    {
        return array(new FooType());
    }

    protected function loadTypeGuesser()
    {
    }
}
PK�b�\@U���Bpear/test/Form/Symfony/Component/Form/Tests/AbstractLayoutTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\Extension\Csrf\CsrfExtension;

abstract class AbstractLayoutTest extends \Symfony\Component\Form\Test\FormIntegrationTestCase
{
    protected $csrfTokenManager;

    protected function setUp()
    {
        if (!extension_loaded('intl')) {
            $this->markTestSkipped('The "intl" extension is not available');
        }

        \Locale::setDefault('en');

        $this->csrfTokenManager = $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface');

        parent::setUp();
    }

    protected function getExtensions()
    {
        return array(
            new CsrfExtension($this->csrfTokenManager),
        );
    }

    protected function tearDown()
    {
        $this->csrfTokenManager = null;

        parent::tearDown();
    }

    protected function assertXpathNodeValue(\DomElement $element, $expression, $nodeValue)
    {
        $xpath = new \DOMXPath($element->ownerDocument);
        $nodeList = $xpath->evaluate($expression);
        $this->assertEquals(1, $nodeList->length);
        $this->assertEquals($nodeValue, $nodeList->item(0)->nodeValue);
    }

    protected function assertMatchesXpath($html, $expression, $count = 1)
    {
        $dom = new \DomDocument('UTF-8');
        try {
            // Wrap in <root> node so we can load HTML with multiple tags at
            // the top level
            $dom->loadXml('<root>'.$html.'</root>');
        } catch (\Exception $e) {
            $this->fail(sprintf(
                "Failed loading HTML:\n\n%s\n\nError: %s",
                $html,
                $e->getMessage()
            ));
        }
        $xpath = new \DOMXPath($dom);
        $nodeList = $xpath->evaluate('/root'.$expression);

        if ($nodeList->length != $count) {
            $dom->formatOutput = true;
            $this->fail(sprintf(
                "Failed asserting that \n\n%s\n\nmatches exactly %s. Matches %s in \n\n%s",
                $expression,
                $count == 1 ? 'once' : $count.' times',
                $nodeList->length == 1 ? 'once' : $nodeList->length.' times',
                // strip away <root> and </root>
                substr($dom->saveHTML(), 6, -8)
            ));
        }
    }

    protected function assertWidgetMatchesXpath(FormView $view, array $vars, $xpath)
    {
        // include ampersands everywhere to validate escaping
        $html = $this->renderWidget($view, array_merge(array(
            'id' => 'my&id',
            'attr' => array('class' => 'my&class'),
        ), $vars));

        $xpath = trim($xpath).'
    [@id="my&id"]
    [@class="my&class"]';

        $this->assertMatchesXpath($html, $xpath);
    }

    abstract protected function renderForm(FormView $view, array $vars = array());

    abstract protected function renderEnctype(FormView $view);

    abstract protected function renderLabel(FormView $view, $label = null, array $vars = array());

    abstract protected function renderErrors(FormView $view);

    abstract protected function renderWidget(FormView $view, array $vars = array());

    abstract protected function renderRow(FormView $view, array $vars = array());

    abstract protected function renderRest(FormView $view, array $vars = array());

    abstract protected function renderStart(FormView $view, array $vars = array());

    abstract protected function renderEnd(FormView $view, array $vars = array());

    abstract protected function setTheme(FormView $view, array $themes);

    public function testEnctype()
    {
        $form = $this->factory->createNamedBuilder('name', 'form')
            ->add('file', 'file')
            ->getForm();

        $this->assertEquals('enctype="multipart/form-data"', $this->renderEnctype($form->createView()));
    }

    public function testNoEnctype()
    {
        $form = $this->factory->createNamedBuilder('name', 'form')
            ->add('text', 'text')
            ->getForm();

        $this->assertEquals('', $this->renderEnctype($form->createView()));
    }

    public function testLabel()
    {
        $form = $this->factory->createNamed('name', 'text');
        $view = $form->createView();
        $this->renderWidget($view, array('label' => 'foo'));
        $html = $this->renderLabel($view);

        $this->assertMatchesXpath($html,
'/label
    [@for="name"]
    [.="[trans]Name[/trans]"]
'
        );
    }

    public function testLabelOnForm()
    {
        $form = $this->factory->createNamed('name', 'date');
        $view = $form->createView();
        $this->renderWidget($view, array('label' => 'foo'));
        $html = $this->renderLabel($view);

        $this->assertMatchesXpath($html,
'/label
    [@class="required"]
    [.="[trans]Name[/trans]"]
'
        );
    }

    public function testLabelWithCustomTextPassedAsOption()
    {
        $form = $this->factory->createNamed('name', 'text', null, array(
            'label' => 'Custom label',
        ));
        $html = $this->renderLabel($form->createView());

        $this->assertMatchesXpath($html,
'/label
    [@for="name"]
    [.="[trans]Custom label[/trans]"]
'
        );
    }

    public function testLabelWithCustomTextPassedDirectly()
    {
        $form = $this->factory->createNamed('name', 'text');
        $html = $this->renderLabel($form->createView(), 'Custom label');

        $this->assertMatchesXpath($html,
'/label
    [@for="name"]
    [.="[trans]Custom label[/trans]"]
'
        );
    }

    public function testLabelWithCustomTextPassedAsOptionAndDirectly()
    {
        $form = $this->factory->createNamed('name', 'text', null, array(
            'label' => 'Custom label',
        ));
        $html = $this->renderLabel($form->createView(), 'Overridden label');

        $this->assertMatchesXpath($html,
'/label
    [@for="name"]
    [.="[trans]Overridden label[/trans]"]
'
        );
    }

    public function testLabelDoesNotRenderFieldAttributes()
    {
        $form = $this->factory->createNamed('name', 'text');
        $html = $this->renderLabel($form->createView(), null, array(
            'attr' => array(
                'class' => 'my&class'
            ),
        ));

        $this->assertMatchesXpath($html,
'/label
    [@for="name"]
    [@class="required"]
'
        );
    }

    public function testLabelWithCustomAttributesPassedDirectly()
    {
        $form = $this->factory->createNamed('name', 'text');
        $html = $this->renderLabel($form->createView(), null, array(
            'label_attr' => array(
                'class' => 'my&class'
            ),
        ));

        $this->assertMatchesXpath($html,
'/label
    [@for="name"]
    [@class="my&class required"]
'
        );
    }

    public function testLabelWithCustomTextAndCustomAttributesPassedDirectly()
    {
        $form = $this->factory->createNamed('name', 'text');
        $html = $this->renderLabel($form->createView(), 'Custom label', array(
            'label_attr' => array(
                'class' => 'my&class'
            ),
        ));

        $this->assertMatchesXpath($html,
'/label
    [@for="name"]
    [@class="my&class required"]
    [.="[trans]Custom label[/trans]"]
'
        );
    }

    // https://github.com/symfony/symfony/issues/5029
    public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly()
    {
        $form = $this->factory->createNamed('name', 'text', null, array(
            'label' => 'Custom label',
        ));
        $html = $this->renderLabel($form->createView(), null, array(
            'label_attr' => array(
                'class' => 'my&class'
            ),
        ));

        $this->assertMatchesXpath($html,
            '/label
    [@for="name"]
    [@class="my&class required"]
    [.="[trans]Custom label[/trans]"]
'
        );
    }

    public function testErrors()
    {
        $form = $this->factory->createNamed('name', 'text');
        $form->addError(new FormError('[trans]Error 1[/trans]'));
        $form->addError(new FormError('[trans]Error 2[/trans]'));
        $view = $form->createView();
        $html = $this->renderErrors($view);

        $this->assertMatchesXpath($html,
'/ul
    [
        ./li[.="[trans]Error 1[/trans]"]
        /following-sibling::li[.="[trans]Error 2[/trans]"]
    ]
    [count(./li)=2]
'
        );
    }

    public function testOverrideWidgetBlock()
    {
        // see custom_widgets.html.twig
        $form = $this->factory->createNamed('text_id', 'text');
        $html = $this->renderWidget($form->createView());

        $this->assertMatchesXpath($html,
'/div
    [
        ./input
        [@type="text"]
        [@id="text_id"]
    ]
    [@id="container"]
'
        );
    }

    public function testCheckedCheckbox()
    {
        $form = $this->factory->createNamed('name', 'checkbox', true);

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="checkbox"]
    [@name="name"]
    [@checked="checked"]
    [@value="1"]
'
        );
    }

    public function testUncheckedCheckbox()
    {
        $form = $this->factory->createNamed('name', 'checkbox', false);

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="checkbox"]
    [@name="name"]
    [not(@checked)]
'
        );
    }

    public function testCheckboxWithValue()
    {
        $form = $this->factory->createNamed('name', 'checkbox', false, array(
            'value' => 'foo&bar',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="checkbox"]
    [@name="name"]
    [@value="foo&bar"]
'
        );
    }

    public function testSingleChoice()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'multiple' => false,
            'expanded' => false,
        ));

        // If the field is collapsed, has no "multiple" attribute, is required but
        // has *no* empty value, the "required" must not be added, otherwise
        // the resulting HTML is invalid.
        // https://github.com/symfony/symfony/issues/8942

        // HTML 5 spec
        // http://www.w3.org/html/wg/drafts/html/master/forms.html#placeholder-label-option

        // "If a select element has a required attribute specified, does not
        //  have a multiple attribute specified, and has a display size of 1,
        //  then the select element must have a placeholder label option."

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [not(@required)]
    [
        ./option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
        /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
    ]
    [count(./option)=2]
'
        );
    }

    public function testSingleChoiceWithPreferred()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'preferred_choices' => array('&b'),
            'multiple' => false,
            'expanded' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array('separator' => '-- sep --'),
'/select
    [@name="name"]
    [not(@required)]
    [
        ./option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
        /following-sibling::option[@disabled="disabled"][not(@selected)][.="-- sep --"]
        /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
    ]
    [count(./option)=3]
'
        );
    }

    public function testSingleChoiceWithPreferredAndNoSeparator()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'preferred_choices' => array('&b'),
            'multiple' => false,
            'expanded' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array('separator' => null),
'/select
    [@name="name"]
    [not(@required)]
    [
        ./option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
        /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
    ]
    [count(./option)=2]
'
        );
    }

    public function testSingleChoiceWithPreferredAndBlankSeparator()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'preferred_choices' => array('&b'),
            'multiple' => false,
            'expanded' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array('separator' => ''),
'/select
    [@name="name"]
    [not(@required)]
    [
        ./option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
        /following-sibling::option[@disabled="disabled"][not(@selected)][.=""]
        /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
    ]
    [count(./option)=3]
'
        );
    }

    public function testChoiceWithOnlyPreferred()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'preferred_choices' => array('&a', '&b'),
            'multiple' => false,
            'expanded' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [count(./option)=2]
'
        );
    }

    public function testSingleChoiceNonRequired()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'required' => false,
            'multiple' => false,
            'expanded' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [not(@required)]
    [
        ./option[@value=""][.="[trans][/trans]"]
        /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
        /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
    ]
    [count(./option)=3]
'
        );
    }

    public function testSingleChoiceNonRequiredNoneSelected()
    {
        $form = $this->factory->createNamed('name', 'choice', null, array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'required' => false,
            'multiple' => false,
            'expanded' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [not(@required)]
    [
        ./option[@value=""][.="[trans][/trans]"]
        /following-sibling::option[@value="&a"][not(@selected)][.="[trans]Choice&A[/trans]"]
        /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
    ]
    [count(./option)=3]
'
        );
    }

    public function testSingleChoiceWithNonRequiredEmptyValue()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'multiple' => false,
            'expanded' => false,
            'required' => false,
            'empty_value' => 'Select&Anything&Not&Me',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [not(@required)]
    [
        ./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Select&Anything&Not&Me[/trans]"]
        /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
        /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
    ]
    [count(./option)=3]
'
        );
    }

    public function testSingleChoiceRequiredWithEmptyValue()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'required' => true,
            'multiple' => false,
            'expanded' => false,
            'empty_value' => 'Test&Me'
        ));

        // The "disabled" attribute was removed again due to a bug in the
        // BlackBerry 10 browser.
        // See https://github.com/symfony/symfony/pull/7678
        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [@required="required"]
    [
        ./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Test&Me[/trans]"]
        /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
        /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
    ]
    [count(./option)=3]
'
        );
    }

    public function testSingleChoiceRequiredWithEmptyValueViaView()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'required' => true,
            'multiple' => false,
            'expanded' => false,
        ));

        // The "disabled" attribute was removed again due to a bug in the
        // BlackBerry 10 browser.
        // See https://github.com/symfony/symfony/pull/7678
        $this->assertWidgetMatchesXpath($form->createView(), array('empty_value' => ''),
'/select
    [@name="name"]
    [@required="required"]
    [
        ./option[@value=""][not(@selected)][not(@disabled)][.="[trans][/trans]"]
        /following-sibling::option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
        /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
    ]
    [count(./option)=3]
'
        );
    }

    public function testSingleChoiceGrouped()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array(
                'Group&1' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
                'Group&2' => array('&c' => 'Choice&C'),
            ),
            'multiple' => false,
            'expanded' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [./optgroup[@label="[trans]Group&1[/trans]"]
        [
            ./option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
            /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
        ]
        [count(./option)=2]
    ]
    [./optgroup[@label="[trans]Group&2[/trans]"]
        [./option[@value="&c"][not(@selected)][.="[trans]Choice&C[/trans]"]]
        [count(./option)=1]
    ]
    [count(./optgroup)=2]
'
        );
    }

    public function testMultipleChoice()
    {
        $form = $this->factory->createNamed('name', 'choice', array('&a'), array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'required' => true,
            'multiple' => true,
            'expanded' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name[]"]
    [@required="required"]
    [@multiple="multiple"]
    [
        ./option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
        /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
    ]
    [count(./option)=2]
'
        );
    }

    public function testMultipleChoiceSkipsEmptyValue()
    {
        $form = $this->factory->createNamed('name', 'choice', array('&a'), array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'multiple' => true,
            'expanded' => false,
            'empty_value' => 'Test&Me'
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name[]"]
    [@multiple="multiple"]
    [
        ./option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
        /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
    ]
    [count(./option)=2]
'
        );
    }

    public function testMultipleChoiceNonRequired()
    {
        $form = $this->factory->createNamed('name', 'choice', array('&a'), array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'required' => false,
            'multiple' => true,
            'expanded' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name[]"]
    [@multiple="multiple"]
    [
        ./option[@value="&a"][@selected="selected"][.="[trans]Choice&A[/trans]"]
        /following-sibling::option[@value="&b"][not(@selected)][.="[trans]Choice&B[/trans]"]
    ]
    [count(./option)=2]
'
        );
    }

    public function testSingleChoiceExpanded()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'multiple' => false,
            'expanded' => true,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./input[@type="radio"][@name="name"][@id="name_0"][@value="&a"][@checked]
        /following-sibling::label[@for="name_0"][.="[trans]Choice&A[/trans]"]
        /following-sibling::input[@type="radio"][@name="name"][@id="name_1"][@value="&b"][not(@checked)]
        /following-sibling::label[@for="name_1"][.="[trans]Choice&B[/trans]"]
        /following-sibling::input[@type="hidden"][@id="name__token"]
    ]
    [count(./input)=3]
'
        );
    }

    public function testSingleChoiceExpandedWithEmptyValue()
    {
        $form = $this->factory->createNamed('name', 'choice', '&a', array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B'),
            'multiple' => false,
            'expanded' => true,
            'empty_value' => 'Test&Me'
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./input[@type="radio"][@name="name"][@id="name_placeholder"][not(@checked)]
        /following-sibling::label[@for="name_placeholder"][.="[trans]Test&Me[/trans]"]
        /following-sibling::input[@type="radio"][@name="name"][@id="name_0"][@checked]
        /following-sibling::label[@for="name_0"][.="[trans]Choice&A[/trans]"]
        /following-sibling::input[@type="radio"][@name="name"][@id="name_1"][not(@checked)]
        /following-sibling::label[@for="name_1"][.="[trans]Choice&B[/trans]"]
        /following-sibling::input[@type="hidden"][@id="name__token"]
    ]
    [count(./input)=4]
'
        );
    }

    public function testSingleChoiceExpandedWithBooleanValue()
    {
        $form = $this->factory->createNamed('name', 'choice', true, array(
            'choices' => array('1' => 'Choice&A', '0' => 'Choice&B'),
            'multiple' => false,
            'expanded' => true,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./input[@type="radio"][@name="name"][@id="name_0"][@checked]
        /following-sibling::label[@for="name_0"][.="[trans]Choice&A[/trans]"]
        /following-sibling::input[@type="radio"][@name="name"][@id="name_1"][not(@checked)]
        /following-sibling::label[@for="name_1"][.="[trans]Choice&B[/trans]"]
        /following-sibling::input[@type="hidden"][@id="name__token"]
    ]
    [count(./input)=3]
'
        );
    }

    public function testMultipleChoiceExpanded()
    {
        $form = $this->factory->createNamed('name', 'choice', array('&a', '&c'), array(
            'choices' => array('&a' => 'Choice&A', '&b' => 'Choice&B', '&c' => 'Choice&C'),
            'multiple' => true,
            'expanded' => true,
            'required' => true,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./input[@type="checkbox"][@name="name[]"][@id="name_0"][@checked][not(@required)]
        /following-sibling::label[@for="name_0"][.="[trans]Choice&A[/trans]"]
        /following-sibling::input[@type="checkbox"][@name="name[]"][@id="name_1"][not(@checked)][not(@required)]
        /following-sibling::label[@for="name_1"][.="[trans]Choice&B[/trans]"]
        /following-sibling::input[@type="checkbox"][@name="name[]"][@id="name_2"][@checked][not(@required)]
        /following-sibling::label[@for="name_2"][.="[trans]Choice&C[/trans]"]
        /following-sibling::input[@type="hidden"][@id="name__token"]
    ]
    [count(./input)=4]
'
        );
    }

    public function testCountry()
    {
        $form = $this->factory->createNamed('name', 'country', 'AT');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [./option[@value="AT"][@selected="selected"][.="[trans]Austria[/trans]"]]
    [count(./option)>200]
'
        );
    }

    public function testCountryWithEmptyValue()
    {
        $form = $this->factory->createNamed('name', 'country', 'AT', array(
            'empty_value' => 'Select&Country',
            'required' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Select&Country[/trans]"]]
    [./option[@value="AT"][@selected="selected"][.="[trans]Austria[/trans]"]]
    [count(./option)>201]
'
        );
    }

    public function testDateTime()
    {
        $form = $this->factory->createNamed('name', 'datetime', '2011-02-03 04:05:06', array(
            'input' => 'string',
            'with_seconds' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div
            [@id="name_date"]
            [
                ./select
                    [@id="name_date_month"]
                    [./option[@value="2"][@selected="selected"]]
                /following-sibling::select
                    [@id="name_date_day"]
                    [./option[@value="3"][@selected="selected"]]
                /following-sibling::select
                    [@id="name_date_year"]
                    [./option[@value="2011"][@selected="selected"]]
            ]
        /following-sibling::div
            [@id="name_time"]
            [
                ./select
                    [@id="name_time_hour"]
                    [./option[@value="4"][@selected="selected"]]
                /following-sibling::select
                    [@id="name_time_minute"]
                    [./option[@value="5"][@selected="selected"]]
            ]
    ]
    [count(.//select)=5]
'
        );
    }

    public function testDateTimeWithEmptyValueGlobal()
    {
        $form = $this->factory->createNamed('name', 'datetime', null, array(
            'input' => 'string',
            'empty_value' => 'Change&Me',
            'required' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div
            [@id="name_date"]
            [
                ./select
                    [@id="name_date_month"]
                    [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]]
                /following-sibling::select
                    [@id="name_date_day"]
                    [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]]
                /following-sibling::select
                    [@id="name_date_year"]
                    [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]]
            ]
        /following-sibling::div
            [@id="name_time"]
            [
                ./select
                    [@id="name_time_hour"]
                    [./option[@value=""][.="[trans]Change&Me[/trans]"]]
                /following-sibling::select
                    [@id="name_time_minute"]
                    [./option[@value=""][.="[trans]Change&Me[/trans]"]]
            ]
    ]
    [count(.//select)=5]
'
        );
    }

    public function testDateTimeWithHourAndMinute()
    {
        $data = array('year' => '2011', 'month' => '2', 'day' => '3', 'hour' => '4', 'minute' => '5');

        $form = $this->factory->createNamed('name', 'datetime', $data, array(
            'input' => 'array',
            'required' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div
            [@id="name_date"]
            [
                ./select
                    [@id="name_date_month"]
                    [./option[@value="2"][@selected="selected"]]
                /following-sibling::select
                    [@id="name_date_day"]
                    [./option[@value="3"][@selected="selected"]]
                /following-sibling::select
                    [@id="name_date_year"]
                    [./option[@value="2011"][@selected="selected"]]
            ]
        /following-sibling::div
            [@id="name_time"]
            [
                ./select
                    [@id="name_time_hour"]
                    [./option[@value="4"][@selected="selected"]]
                /following-sibling::select
                    [@id="name_time_minute"]
                    [./option[@value="5"][@selected="selected"]]
            ]
    ]
    [count(.//select)=5]
'
        );
    }

    public function testDateTimeWithSeconds()
    {
        $form = $this->factory->createNamed('name', 'datetime', '2011-02-03 04:05:06', array(
            'input' => 'string',
            'with_seconds' => true,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div
            [@id="name_date"]
            [
                ./select
                    [@id="name_date_month"]
                    [./option[@value="2"][@selected="selected"]]
                /following-sibling::select
                    [@id="name_date_day"]
                    [./option[@value="3"][@selected="selected"]]
                /following-sibling::select
                    [@id="name_date_year"]
                    [./option[@value="2011"][@selected="selected"]]
            ]
        /following-sibling::div
            [@id="name_time"]
            [
                ./select
                    [@id="name_time_hour"]
                    [./option[@value="4"][@selected="selected"]]
                /following-sibling::select
                    [@id="name_time_minute"]
                    [./option[@value="5"][@selected="selected"]]
                /following-sibling::select
                    [@id="name_time_second"]
                    [./option[@value="6"][@selected="selected"]]
            ]
    ]
    [count(.//select)=6]
'
        );
    }

    public function testDateTimeSingleText()
    {
        $form = $this->factory->createNamed('name', 'datetime', '2011-02-03 04:05:06', array(
            'input' => 'string',
            'date_widget' => 'single_text',
            'time_widget' => 'single_text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./input
            [@type="date"]
            [@id="name_date"]
            [@name="name[date]"]
            [@value="2011-02-03"]
        /following-sibling::input
            [@type="time"]
            [@id="name_time"]
            [@name="name[time]"]
            [@value="04:05"]
    ]
'
        );
    }

    public function testDateTimeWithWidgetSingleText()
    {
        $form = $this->factory->createNamed('name', 'datetime', '2011-02-03 04:05:06', array(
            'input' => 'string',
            'widget' => 'single_text',
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="datetime"]
    [@name="name"]
    [@value="2011-02-03T04:05:06Z"]
'
        );
    }

    public function testDateTimeWithWidgetSingleTextIgnoreDateAndTimeWidgets()
    {
        $form = $this->factory->createNamed('name', 'datetime', '2011-02-03 04:05:06', array(
            'input' => 'string',
            'date_widget' => 'choice',
            'time_widget' => 'choice',
            'widget' => 'single_text',
            'model_timezone' => 'UTC',
            'view_timezone' => 'UTC',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="datetime"]
    [@name="name"]
    [@value="2011-02-03T04:05:06Z"]
'
        );
    }

    public function testDateChoice()
    {
        $form = $this->factory->createNamed('name', 'date', '2011-02-03', array(
            'input' => 'string',
            'widget' => 'choice',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./select
            [@id="name_month"]
            [./option[@value="2"][@selected="selected"]]
        /following-sibling::select
            [@id="name_day"]
            [./option[@value="3"][@selected="selected"]]
        /following-sibling::select
            [@id="name_year"]
            [./option[@value="2011"][@selected="selected"]]
    ]
    [count(./select)=3]
'
        );
    }

    public function testDateChoiceWithEmptyValueGlobal()
    {
        $form = $this->factory->createNamed('name', 'date', null, array(
            'input' => 'string',
            'widget' => 'choice',
            'empty_value' => 'Change&Me',
            'required' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./select
            [@id="name_month"]
            [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]]
        /following-sibling::select
            [@id="name_day"]
            [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]]
        /following-sibling::select
            [@id="name_year"]
            [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]]
    ]
    [count(./select)=3]
'
        );
    }

    public function testDateChoiceWithEmptyValueOnYear()
    {
        $form = $this->factory->createNamed('name', 'date', null, array(
            'input' => 'string',
            'widget' => 'choice',
            'required' => false,
            'empty_value' => array('year' => 'Change&Me'),
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./select
            [@id="name_month"]
            [./option[@value="1"]]
        /following-sibling::select
            [@id="name_day"]
            [./option[@value="1"]]
        /following-sibling::select
            [@id="name_year"]
            [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]]
    ]
    [count(./select)=3]
'
        );
    }

    public function testDateText()
    {
        $form = $this->factory->createNamed('name', 'date', '2011-02-03', array(
            'input' => 'string',
            'widget' => 'text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./input
            [@id="name_month"]
            [@type="text"]
            [@value="2"]
        /following-sibling::input
            [@id="name_day"]
            [@type="text"]
            [@value="3"]
        /following-sibling::input
            [@id="name_year"]
            [@type="text"]
            [@value="2011"]
    ]
    [count(./input)=3]
'
        );
    }

    public function testDateSingleText()
    {
        $form = $this->factory->createNamed('name', 'date', '2011-02-03', array(
            'input' => 'string',
            'widget' => 'single_text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="date"]
    [@name="name"]
    [@value="2011-02-03"]
'
        );
    }

    public function testDateErrorBubbling()
    {
        $form = $this->factory->createNamedBuilder('form', 'form')
            ->add('date', 'date')
            ->getForm();
        $form->get('date')->addError(new FormError('[trans]Error![/trans]'));
        $view = $form->createView();

        $this->assertEmpty($this->renderErrors($view));
        $this->assertNotEmpty($this->renderErrors($view['date']));
    }

    public function testBirthDay()
    {
        $form = $this->factory->createNamed('name', 'birthday', '2000-02-03', array(
            'input' => 'string',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./select
            [@id="name_month"]
            [./option[@value="2"][@selected="selected"]]
        /following-sibling::select
            [@id="name_day"]
            [./option[@value="3"][@selected="selected"]]
        /following-sibling::select
            [@id="name_year"]
            [./option[@value="2000"][@selected="selected"]]
    ]
    [count(./select)=3]
'
        );
    }

    public function testBirthDayWithEmptyValue()
    {
        $form = $this->factory->createNamed('name', 'birthday', '1950-01-01', array(
            'input' => 'string',
            'empty_value' => '',
            'required' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./select
            [@id="name_month"]
            [./option[@value=""][not(@selected)][not(@disabled)][.="[trans][/trans]"]]
            [./option[@value="1"][@selected="selected"]]
        /following-sibling::select
            [@id="name_day"]
            [./option[@value=""][not(@selected)][not(@disabled)][.="[trans][/trans]"]]
            [./option[@value="1"][@selected="selected"]]
        /following-sibling::select
            [@id="name_year"]
            [./option[@value=""][not(@selected)][not(@disabled)][.="[trans][/trans]"]]
            [./option[@value="1950"][@selected="selected"]]
    ]
    [count(./select)=3]
'
        );
    }

    public function testEmail()
    {
        $form = $this->factory->createNamed('name', 'email', 'foo&bar');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="email"]
    [@name="name"]
    [@value="foo&bar"]
    [not(@maxlength)]
'
        );
    }

    public function testEmailWithMaxLength()
    {
        $form = $this->factory->createNamed('name', 'email', 'foo&bar', array(
            'max_length' => 123,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="email"]
    [@name="name"]
    [@value="foo&bar"]
    [@maxlength="123"]
'
        );
    }

    public function testFile()
    {
        $form = $this->factory->createNamed('name', 'file');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="file"]
'
        );
    }

    public function testHidden()
    {
        $form = $this->factory->createNamed('name', 'hidden', 'foo&bar');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="hidden"]
    [@name="name"]
    [@value="foo&bar"]
'
        );
    }

    public function testReadOnly()
    {
        $form = $this->factory->createNamed('name', 'text', null, array(
            'read_only' => true,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="text"]
    [@name="name"]
    [@readonly="readonly"]
'
        );
    }

    public function testDisabled()
    {
        $form = $this->factory->createNamed('name', 'text', null, array(
            'disabled' => true,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="text"]
    [@name="name"]
    [@disabled="disabled"]
'
        );
    }

    public function testInteger()
    {
        $form = $this->factory->createNamed('name', 'integer', 123);

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="number"]
    [@name="name"]
    [@value="123"]
'
        );
    }

    public function testLanguage()
    {
        $form = $this->factory->createNamed('name', 'language', 'de');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [./option[@value="de"][@selected="selected"][.="[trans]German[/trans]"]]
    [count(./option)>200]
'
        );
    }

    public function testLocale()
    {
        $form = $this->factory->createNamed('name', 'locale', 'de_AT');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [./option[@value="de_AT"][@selected="selected"][.="[trans]German (Austria)[/trans]"]]
    [count(./option)>200]
'
        );
    }

    public function testMoney()
    {
        $form = $this->factory->createNamed('name', 'money', 1234.56, array(
            'currency' => 'EUR',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="text"]
    [@name="name"]
    [@value="1234.56"]
    [contains(.., "€")]
'
        );
    }

    public function testNumber()
    {
        $form = $this->factory->createNamed('name', 'number', 1234.56);

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="text"]
    [@name="name"]
    [@value="1234.56"]
'
        );
    }

    public function testPassword()
    {
        $form = $this->factory->createNamed('name', 'password', 'foo&bar');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="password"]
    [@name="name"]
'
        );
    }

    public function testPasswordSubmittedWithNotAlwaysEmpty()
    {
        $form = $this->factory->createNamed('name', 'password', null, array(
            'always_empty' => false,
        ));
        $form->submit('foo&bar');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="password"]
    [@name="name"]
    [@value="foo&bar"]
'
        );
    }

    public function testPasswordWithMaxLength()
    {
        $form = $this->factory->createNamed('name', 'password', 'foo&bar', array(
            'max_length' => 123,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="password"]
    [@name="name"]
    [@maxlength="123"]
'
        );
    }

    public function testPercent()
    {
        $form = $this->factory->createNamed('name', 'percent', 0.1);

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="text"]
    [@name="name"]
    [@value="10"]
    [contains(.., "%")]
'
        );
    }

    public function testCheckedRadio()
    {
        $form = $this->factory->createNamed('name', 'radio', true);

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="radio"]
    [@name="name"]
    [@checked="checked"]
    [@value="1"]
'
        );
    }

    public function testUncheckedRadio()
    {
        $form = $this->factory->createNamed('name', 'radio', false);

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="radio"]
    [@name="name"]
    [not(@checked)]
'
        );
    }

    public function testRadioWithValue()
    {
        $form = $this->factory->createNamed('name', 'radio', false, array(
            'value' => 'foo&bar',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="radio"]
    [@name="name"]
    [@value="foo&bar"]
'
        );
    }

    public function testTextarea()
    {
        $form = $this->factory->createNamed('name', 'textarea', 'foo&bar', array(
            'pattern' => 'foo',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/textarea
    [@name="name"]
    [not(@pattern)]
    [.="foo&bar"]
'
        );
    }

    public function testText()
    {
        $form = $this->factory->createNamed('name', 'text', 'foo&bar');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="text"]
    [@name="name"]
    [@value="foo&bar"]
    [not(@maxlength)]
'
        );
    }

    public function testTextWithMaxLength()
    {
        $form = $this->factory->createNamed('name', 'text', 'foo&bar', array(
            'max_length' => 123,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="text"]
    [@name="name"]
    [@value="foo&bar"]
    [@maxlength="123"]
'
        );
    }

    public function testSearch()
    {
        $form = $this->factory->createNamed('name', 'search', 'foo&bar');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="search"]
    [@name="name"]
    [@value="foo&bar"]
    [not(@maxlength)]
'
        );
    }

    public function testTime()
    {
        $form = $this->factory->createNamed('name', 'time', '04:05:06', array(
            'input' => 'string',
            'with_seconds' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./select
            [@id="name_hour"]
            [not(@size)]
            [./option[@value="4"][@selected="selected"]]
        /following-sibling::select
            [@id="name_minute"]
            [not(@size)]
            [./option[@value="5"][@selected="selected"]]
    ]
    [count(./select)=2]
'
        );
    }

    public function testTimeWithSeconds()
    {
        $form = $this->factory->createNamed('name', 'time', '04:05:06', array(
            'input' => 'string',
            'with_seconds' => true,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./select
            [@id="name_hour"]
            [not(@size)]
            [./option[@value="4"][@selected="selected"]]
            [count(./option)>23]
        /following-sibling::select
            [@id="name_minute"]
            [not(@size)]
            [./option[@value="5"][@selected="selected"]]
            [count(./option)>59]
        /following-sibling::select
            [@id="name_second"]
            [not(@size)]
            [./option[@value="6"][@selected="selected"]]
            [count(./option)>59]
    ]
    [count(./select)=3]
'
        );
    }

    public function testTimeText()
    {
        $form = $this->factory->createNamed('name', 'time', '04:05:06', array(
            'input' => 'string',
            'widget' => 'text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./input
            [@type="text"]
            [@id="name_hour"]
            [@name="name[hour]"]
            [@value="04"]
            [@size="1"]
            [@required="required"]
        /following-sibling::input
            [@type="text"]
            [@id="name_minute"]
            [@name="name[minute]"]
            [@value="05"]
            [@size="1"]
            [@required="required"]
    ]
    [count(./input)=2]
'
        );
    }

    public function testTimeSingleText()
    {
        $form = $this->factory->createNamed('name', 'time', '04:05:06', array(
            'input' => 'string',
            'widget' => 'single_text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="time"]
    [@name="name"]
    [@value="04:05"]
    [not(@size)]
'
        );
    }

    public function testTimeWithEmptyValueGlobal()
    {
        $form = $this->factory->createNamed('name', 'time', null, array(
            'input' => 'string',
            'empty_value' => 'Change&Me',
            'required' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./select
            [@id="name_hour"]
            [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]]
            [count(./option)>24]
        /following-sibling::select
            [@id="name_minute"]
            [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]]
            [count(./option)>60]
    ]
    [count(./select)=2]
'
        );
    }

    public function testTimeWithEmptyValueOnYear()
    {
        $form = $this->factory->createNamed('name', 'time', null, array(
            'input' => 'string',
            'required' => false,
            'empty_value' => array('hour' => 'Change&Me'),
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./select
            [@id="name_hour"]
            [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Change&Me[/trans]"]]
            [count(./option)>24]
        /following-sibling::select
            [@id="name_minute"]
            [./option[@value="1"]]
            [count(./option)>59]
    ]
    [count(./select)=2]
'
        );
    }

    public function testTimeErrorBubbling()
    {
        $form = $this->factory->createNamedBuilder('form', 'form')
            ->add('time', 'time')
            ->getForm();
        $form->get('time')->addError(new FormError('[trans]Error![/trans]'));
        $view = $form->createView();

        $this->assertEmpty($this->renderErrors($view));
        $this->assertNotEmpty($this->renderErrors($view['time']));
    }

    public function testTimezone()
    {
        $form = $this->factory->createNamed('name', 'timezone', 'Europe/Vienna');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [@name="name"]
    [not(@required)]
    [./optgroup
        [@label="[trans]Europe[/trans]"]
        [./option[@value="Europe/Vienna"][@selected="selected"][.="[trans]Vienna[/trans]"]]
    ]
    [count(./optgroup)>10]
    [count(.//option)>200]
'
        );
    }

    public function testTimezoneWithEmptyValue()
    {
        $form = $this->factory->createNamed('name', 'timezone', null, array(
            'empty_value' => 'Select&Timezone',
            'required' => false,
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/select
    [./option[@value=""][not(@selected)][not(@disabled)][.="[trans]Select&Timezone[/trans]"]]
    [count(./optgroup)>10]
    [count(.//option)>201]
'
        );
    }

    public function testUrl()
    {
        $url = 'http://www.google.com?foo1=bar1&foo2=bar2';
        $form = $this->factory->createNamed('name', 'url', $url);

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/input
    [@type="url"]
    [@name="name"]
    [@value="http://www.google.com?foo1=bar1&foo2=bar2"]
'
        );
    }

    public function testCollectionPrototype()
    {
        $form = $this->factory->createNamedBuilder('name', 'form', array('items' => array('one', 'two', 'three')))
            ->add('items', 'collection', array('allow_add' => true))
            ->getForm()
            ->createView();

        $html = $this->renderWidget($form);

        $this->assertMatchesXpath($html,
            '//div[@id="name_items"][@data-prototype]
            |
            //table[@id="name_items"][@data-prototype]'
        );
    }

    public function testEmptyRootFormName()
    {
        $form = $this->factory->createNamedBuilder('', 'form')
            ->add('child', 'text')
            ->getForm();

        $this->assertMatchesXpath($this->renderWidget($form->createView()),
            '//input[@type="hidden"][@id="_token"][@name="_token"]
            |
             //input[@type="text"][@id="child"][@name="child"]'
        , 2);
    }

    public function testButton()
    {
        $form = $this->factory->createNamed('name', 'button');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
            '/button[@type="button"][@name="name"][.="[trans]Name[/trans]"]'
        );
    }

    public function testButtonLabelIsEmpty()
    {
        $form = $this->factory->createNamed('name', 'button');

        $this->assertSame('', $this->renderLabel($form->createView()));
    }

    public function testSubmit()
    {
        $form = $this->factory->createNamed('name', 'submit');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
            '/button[@type="submit"][@name="name"]'
        );
    }

    public function testReset()
    {
        $form = $this->factory->createNamed('name', 'reset');

        $this->assertWidgetMatchesXpath($form->createView(), array(),
            '/button[@type="reset"][@name="name"]'
        );
    }

    public function testStartTag()
    {
        $form = $this->factory->create('form', null, array(
            'method' => 'get',
            'action' => 'http://example.com/directory'
        ));

        $html = $this->renderStart($form->createView());

        $this->assertSame('<form name="form" method="get" action="http://example.com/directory">', $html);
    }

    public function testStartTagForPutRequest()
    {
        $form = $this->factory->create('form', null, array(
            'method' => 'put',
            'action' => 'http://example.com/directory'
        ));

        $html = $this->renderStart($form->createView());

        $this->assertMatchesXpath($html . '</form>',
'/form
    [./input[@type="hidden"][@name="_method"][@value="PUT"]]
    [@method="post"]
    [@action="http://example.com/directory"]'
        );
    }

    public function testStartTagWithOverriddenVars()
    {
        $form = $this->factory->create('form', null, array(
            'method' => 'put',
            'action' => 'http://example.com/directory',
        ));

        $html = $this->renderStart($form->createView(), array(
            'method' => 'post',
            'action' => 'http://foo.com/directory'
        ));

        $this->assertSame('<form name="form" method="post" action="http://foo.com/directory">', $html);
    }

    public function testStartTagForMultipartForm()
    {
        $form = $this->factory->createBuilder('form', null, array(
                'method' => 'get',
                'action' => 'http://example.com/directory'
            ))
            ->add('file', 'file')
            ->getForm();

        $html = $this->renderStart($form->createView());

        $this->assertSame('<form name="form" method="get" action="http://example.com/directory" enctype="multipart/form-data">', $html);
    }

    public function testStartTagWithExtraAttributes()
    {
        $form = $this->factory->create('form', null, array(
            'method' => 'get',
            'action' => 'http://example.com/directory'
        ));

        $html = $this->renderStart($form->createView(), array(
            'attr' => array('class' => 'foobar'),
        ));

        $this->assertSame('<form name="form" method="get" action="http://example.com/directory" class="foobar">', $html);
    }

    public function testWidgetAttributes()
    {
        $form = $this->factory->createNamed('text', 'text', 'value', array(
            'required' => true,
            'disabled' => true,
            'read_only' => true,
            'max_length' => 10,
            'pattern' => '\d+',
            'attr' => array('class' => 'foobar', 'data-foo' => 'bar'),
        ));

        $html = $this->renderWidget($form->createView());

        // compare plain HTML to check the whitespace
        $this->assertSame('<input type="text" id="text" name="text" readonly="readonly" disabled="disabled" required="required" maxlength="10" pattern="\d+" class="foobar" data-foo="bar" value="value" />', $html);
    }

    public function testWidgetAttributeNameRepeatedIfTrue()
    {
        $form = $this->factory->createNamed('text', 'text', 'value', array(
            'attr' => array('foo' => true),
        ));

        $html = $this->renderWidget($form->createView());

        // foo="foo"
        $this->assertSame('<input type="text" id="text" name="text" required="required" foo="foo" value="value" />', $html);
    }

    public function testWidgetAttributeHiddenIfFalse()
    {
        $form = $this->factory->createNamed('text', 'text', 'value', array(
            'attr' => array('foo' => false),
        ));

        $html = $this->renderWidget($form->createView());

        // no foo
        $this->assertSame('<input type="text" id="text" name="text" required="required" value="value" />', $html);
    }

    public function testButtonAttributes()
    {
        $form = $this->factory->createNamed('button', 'button', null, array(
            'disabled' => true,
            'attr' => array('class' => 'foobar', 'data-foo' => 'bar'),
        ));

        $html = $this->renderWidget($form->createView());

        // compare plain HTML to check the whitespace
        $this->assertSame('<button type="button" id="button" name="button" disabled="disabled" class="foobar" data-foo="bar">[trans]Button[/trans]</button>', $html);
    }

    public function testButtonAttributeNameRepeatedIfTrue()
    {
        $form = $this->factory->createNamed('button', 'button', null, array(
            'attr' => array('foo' => true),
        ));

        $html = $this->renderWidget($form->createView());

        // foo="foo"
        $this->assertSame('<button type="button" id="button" name="button" foo="foo">[trans]Button[/trans]</button>', $html);
    }

    public function testButtonAttributeHiddenIfFalse()
    {
        $form = $this->factory->createNamed('button', 'button', null, array(
            'attr' => array('foo' => false),
        ));

        $html = $this->renderWidget($form->createView());

        // no foo
        $this->assertSame('<button type="button" id="button" name="button">[trans]Button[/trans]</button>', $html);
    }
}
PK�b�\O� )KKGpear/test/Form/Symfony/Component/Form/Tests/FormIntegrationTestCase.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\Test\FormIntegrationTestCase as BaseFormIntegrationTestCase;

/**
 * @deprecated Deprecated since version 2.3, to be removed in 3.0. Use Symfony\Component\Form\Test\FormIntegrationTestCase instead.
 */
abstract class FormIntegrationTestCase extends BaseFormIntegrationTestCase
{
}
PK�b�\�d�!!Hpear/test/Form/Symfony/Component/Form/Tests/NativeRequestHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\NativeRequestHandler;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class NativeRequestHandlerTest extends AbstractRequestHandlerTest
{
    private static $serverBackup;

    public static function setUpBeforeClass()
    {
        self::$serverBackup = $_SERVER;
    }

    protected function setUp()
    {
        parent::setUp();

        $_GET = array();
        $_POST = array();
        $_FILES = array();
        $_SERVER = array(
            // PHPUnit needs this entry
            'SCRIPT_NAME' => self::$serverBackup['SCRIPT_NAME'],
        );
    }

    protected function tearDown()
    {
        parent::tearDown();

        $_GET = array();
        $_POST = array();
        $_FILES = array();
        $_SERVER = self::$serverBackup;
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testRequestShouldBeNull()
    {
        $this->requestHandler->handleRequest($this->getMockForm('name', 'GET'), 'request');
    }

    public function testMethodOverrideHeaderTakesPrecedenceIfPost()
    {
        $form = $this->getMockForm('param1', 'PUT');

        $this->setRequestData('POST', array(
            'param1' => 'DATA',
        ));

        $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] = 'PUT';

        $form->expects($this->once())
            ->method('submit')
            ->with('DATA');

        $this->requestHandler->handleRequest($form, $this->request);
    }

    public function testConvertEmptyUploadedFilesToNull()
    {
        $form = $this->getMockForm('param1', 'POST', false);

        $this->setRequestData('POST', array(), array('param1' => array(
            'name' => '',
            'type' => '',
            'tmp_name' => '',
            'error' => UPLOAD_ERR_NO_FILE,
            'size' => 0
        )));

        $form->expects($this->once())
            ->method('submit')
            ->with($this->identicalTo(null));

        $this->requestHandler->handleRequest($form, $this->request);
    }

    public function testFixBuggyFilesArray()
    {
        $form = $this->getMockForm('param1', 'POST', false);

        $this->setRequestData('POST', array(), array('param1' => array(
            'name' => array(
                'field' => 'upload.txt',
            ),
            'type' => array(
                'field' => 'text/plain',
            ),
            'tmp_name' => array(
                'field' => 'owfdskjasdfsa',
            ),
            'error' => array(
                'field' => UPLOAD_ERR_OK,
            ),
            'size' => array(
                'field' => 100,
            ),
        )));

        $form->expects($this->once())
            ->method('submit')
            ->with(array(
                'field' => array(
                    'name' => 'upload.txt',
                    'type' => 'text/plain',
                    'tmp_name' => 'owfdskjasdfsa',
                    'error' => UPLOAD_ERR_OK,
                    'size' => 100,
                ),
            ));

        $this->requestHandler->handleRequest($form, $this->request);
    }

    public function testFixBuggyNestedFilesArray()
    {
        $form = $this->getMockForm('param1', 'POST');

        $this->setRequestData('POST', array(), array('param1' => array(
            'name' => array(
                'field' => array('subfield' => 'upload.txt'),
            ),
            'type' => array(
                'field' => array('subfield' => 'text/plain'),
            ),
            'tmp_name' => array(
                'field' => array('subfield' => 'owfdskjasdfsa'),
            ),
            'error' => array(
                'field' => array('subfield' => UPLOAD_ERR_OK),
            ),
            'size' => array(
                'field' => array('subfield' => 100),
            ),
        )));

        $form->expects($this->once())
            ->method('submit')
            ->with(array(
                'field' => array(
                    'subfield' => array(
                        'name' => 'upload.txt',
                        'type' => 'text/plain',
                        'tmp_name' => 'owfdskjasdfsa',
                        'error' => UPLOAD_ERR_OK,
                        'size' => 100,
                    ),
                ),
            ));

        $this->requestHandler->handleRequest($form, $this->request);
    }

    public function testMethodOverrideHeaderIgnoredIfNotPost()
    {
        $form = $this->getMockForm('param1', 'POST');

        $this->setRequestData('GET', array(
                'param1' => 'DATA',
            ));

        $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] = 'PUT';

        $form->expects($this->never())
            ->method('submit');

        $this->requestHandler->handleRequest($form, $this->request);
    }

    protected function setRequestData($method, $data, $files = array())
    {
        if ('GET' === $method) {
            $_GET = $data;
            $_FILES = array();
        } else {
            $_POST = $data;
            $_FILES = $files;
        }

        $_SERVER = array(
            'REQUEST_METHOD' => $method,
            // PHPUnit needs this entry
            'SCRIPT_NAME' => self::$serverBackup['SCRIPT_NAME'],
        );
    }

    protected function getRequestHandler()
    {
        return new NativeRequestHandler();
    }

    protected function getMockFile()
    {
        return array(
            'name' => 'upload.txt',
            'type' => 'text/plain',
            'tmp_name' => 'owfdskjasdfsa',
            'error' => UPLOAD_ERR_OK,
            'size' => 100,
        );
    }
}
PK�b�\]�9�}}>pear/test/Form/Symfony/Component/Form/Tests/FormConfigTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\FormConfigBuilder;
use Symfony\Component\Form\Exception\InvalidArgumentException;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormConfigTest extends \PHPUnit_Framework_TestCase
{
    public function getHtml4Ids()
    {
        return array(
            array('z0', true),
            array('A0', true),
            array('A9', true),
            array('Z0', true),
            array('#', false),
            array('a#', false),
            array('a$', false),
            array('a%', false),
            array('a ', false),
            array("a\t", false),
            array("a\n", false),
            array('a-', true),
            array('a_', true),
            array('a:', true),
            // Periods are allowed by the HTML4 spec, but disallowed by us
            // because they break the generated property paths
            array('a.', false),
            // Contrary to the HTML4 spec, we allow names starting with a
            // number, otherwise naming fields by collection indices is not
            // possible.
            // For root forms, leading digits will be stripped from the
            // "id" attribute to produce valid HTML4.
            array('0', true),
            array('9', true),
            // Contrary to the HTML4 spec, we allow names starting with an
            // underscore, since this is already a widely used practice in
            // Symfony2.
            // For root forms, leading underscores will be stripped from the
            // "id" attribute to produce valid HTML4.
            array('_', true),
            // Integers are allowed
            array(0, true),
            array(123, true),
            // NULL is allowed
            array(null, true),
            // Other types are not
            array(1.23, false),
            array(5., false),
            array(true, false),
            array(new \stdClass(), false),
        );
    }

    /**
     * @dataProvider getHtml4Ids
     */
    public function testNameAcceptsOnlyNamesValidAsIdsInHtml4($name, $accepted)
    {
        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');

        try {
            new FormConfigBuilder($name, null, $dispatcher);
            if (!$accepted) {
                $this->fail(sprintf('The value "%s" should not be accepted', $name));
            }
        } catch (UnexpectedTypeException $e) {
            // if the value was not accepted, but should be, rethrow exception
            if ($accepted) {
                throw $e;
            }
        } catch (InvalidArgumentException $e) {
            // if the value was not accepted, but should be, rethrow exception
            if ($accepted) {
                throw $e;
            }
        }
    }

    public function testGetRequestHandlerCreatesNativeRequestHandlerIfNotSet()
    {
        $config = $this->getConfigBuilder()->getFormConfig();

        $this->assertInstanceOf('Symfony\Component\Form\NativeRequestHandler', $config->getRequestHandler());
    }

    public function testGetRequestHandlerReusesNativeRequestHandlerInstance()
    {
        $config1 = $this->getConfigBuilder()->getFormConfig();
        $config2 = $this->getConfigBuilder()->getFormConfig();

        $this->assertSame($config1->getRequestHandler(), $config2->getRequestHandler());
    }

    public function testSetMethodAllowsGet()
    {
        $this->getConfigBuilder()->setMethod('GET');
    }

    public function testSetMethodAllowsPost()
    {
        $this->getConfigBuilder()->setMethod('POST');
    }

    public function testSetMethodAllowsPut()
    {
        $this->getConfigBuilder()->setMethod('PUT');
    }

    public function testSetMethodAllowsDelete()
    {
        $this->getConfigBuilder()->setMethod('DELETE');
    }

    public function testSetMethodAllowsPatch()
    {
        $this->getConfigBuilder()->setMethod('PATCH');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
     */
    public function testSetMethodDoesNotAllowOtherValues()
    {
        $this->getConfigBuilder()->setMethod('foo');
    }

    private function getConfigBuilder($name = 'name')
    {
        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');

        return new FormConfigBuilder($name, null, $dispatcher);
    }
}
PK�b�\k/6@pear/test/Form/Symfony/Component/Form/Tests/AbstractFormTest.phpnu�[���<?php

    /*
    * This file is part of the Symfony package.
    *
    * (c) Fabien Potencier <fabien@symfony.com>
    *
    * For the full copyright and license information, please view the LICENSE
    * file that was distributed with this source code.
    */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\FormBuilder;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

abstract class AbstractFormTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var EventDispatcherInterface
     */
    protected $dispatcher;

    /**
     * @var \Symfony\Component\Form\FormFactoryInterface
     */
    protected $factory;

    /**
     * @var \Symfony\Component\Form\FormInterface
     */
    protected $form;

    protected function setUp()
    {
        // We need an actual dispatcher to use the deprecated
        // bindRequest() method
        $this->dispatcher = new EventDispatcher();
        $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
        $this->form = $this->createForm();
    }

    protected function tearDown()
    {
        $this->dispatcher = null;
        $this->factory = null;
        $this->form = null;
    }

    /**
     * @return \Symfony\Component\Form\FormInterface
     */
    abstract protected function createForm();

    /**
     * @param string                   $name
     * @param EventDispatcherInterface $dispatcher
     * @param string                   $dataClass
     * @param array                    $options
     *
     * @return FormBuilder
     */
    protected function getBuilder($name = 'name', EventDispatcherInterface $dispatcher = null, $dataClass = null, array $options = array())
    {
        return new FormBuilder($name, $dataClass, $dispatcher ?: $this->dispatcher, $this->factory, $options);
    }

    /**
     * @param  string $name
     *
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    protected function getMockForm($name = 'name')
    {
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $config = $this->getMock('Symfony\Component\Form\FormConfigInterface');

        $form->expects($this->any())
            ->method('getName')
            ->will($this->returnValue($name));
        $form->expects($this->any())
            ->method('getConfig')
            ->will($this->returnValue($config));

        return $form;
    }

    /**
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    protected function getDataMapper()
    {
        return $this->getMock('Symfony\Component\Form\DataMapperInterface');
    }

    /**
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    protected function getDataTransformer()
    {
        return $this->getMock('Symfony\Component\Form\DataTransformerInterface');
    }

    /**
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    protected function getFormValidator()
    {
        return $this->getMock('Symfony\Component\Form\FormValidatorInterface');
    }
}
PK�b�\��UUMpear/test/Form/Symfony/Component/Form/Tests/Fixtures/FixedDataTransformer.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Fixtures;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\RuntimeException;

class FixedDataTransformer implements DataTransformerInterface
{
    private $mapping;

    public function __construct(array $mapping)
    {
        $this->mapping = $mapping;
    }

    public function transform($value)
    {
        if (!array_key_exists($value, $this->mapping)) {
            throw new RuntimeException(sprintf('No mapping for value "%s"', $value));
        }

        return $this->mapping[$value];
    }

    public function reverseTransform($value)
    {
        $result = array_search($value, $this->mapping, true);

        if ($result === false) {
            throw new RuntimeException(sprintf('No reverse mapping for value "%s"', $value));
        }

        return $result;
    }
}
PK�b�\��x�

Lpear/test/Form/Symfony/Component/Form/Tests/Fixtures/FooTypeBarExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Fixtures;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;

class FooTypeBarExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->setAttribute('bar', 'x');
    }

    public function getAllowedOptionValues()
    {
        return array(
            'a_or_b' => array('c'),
        );
    }

    public function getExtendedType()
    {
        return 'foo';
    }
}
PK�b�\���*��@pear/test/Form/Symfony/Component/Form/Tests/Fixtures/FooType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Fixtures;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class FooType extends AbstractType
{
    public function getName()
    {
        return 'foo';
    }

    public function getParent()
    {
        return null;
    }
}
PK�b�\#�oCpear/test/Form/Symfony/Component/Form/Tests/Fixtures/FooSubType.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Fixtures;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class FooSubType extends AbstractType
{
    public function getName()
    {
        return 'foo_sub_type';
    }

    public function getParent()
    {
        return 'foo';
    }
}
PK�b�\[��َ�Lpear/test/Form/Symfony/Component/Form/Tests/Fixtures/FooTypeBazExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Fixtures;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;

class FooTypeBazExtension extends AbstractTypeExtension
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->setAttribute('baz', 'x');
    }

    public function getExtendedType()
    {
        return 'foo';
    }
}
PK�b�\֫�v��Cpear/test/Form/Symfony/Component/Form/Tests/Fixtures/AuthorType.phpnu�[���<?php

namespace Symfony\Component\Form\Tests\Fixtures;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class AuthorType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('firstName')
            ->add('lastName')
        ;
    }

    public function getName()
    {
        return 'author';
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author',
        ));
    }
}
PK�b�\�uJpear/test/Form/Symfony/Component/Form/Tests/Fixtures/CustomArrayObject.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Fixtures;

/**
 * This class is a hand written simplified version of PHP native `ArrayObject`
 * class, to show that it behaves differently than the PHP native implementation.
 */
class CustomArrayObject implements \ArrayAccess, \IteratorAggregate, \Countable, \Serializable
{
    private $array;

    public function __construct(array $array = null)
    {
        $this->array = $array ?: array();
    }

    public function offsetExists($offset)
    {
        return array_key_exists($offset, $this->array);
    }

    public function offsetGet($offset)
    {
        return $this->array[$offset];
    }

    public function offsetSet($offset, $value)
    {
        if (null === $offset) {
            $this->array[] = $value;
        } else {
            $this->array[$offset] = $value;
        }
    }

    public function offsetUnset($offset)
    {
        unset($this->array[$offset]);
    }

    public function getIterator()
    {
        return new \ArrayIterator($this->array);
    }

    public function count()
    {
        return count($this->array);
    }

    public function serialize()
    {
        return serialize($this->array);
    }

    public function unserialize($serialized)
    {
        $this->array = (array) unserialize((string) $serialized);
    }
}
PK�b�\��!u��Lpear/test/Form/Symfony/Component/Form/Tests/Fixtures/FixedFilterListener.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Fixtures;

use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class FixedFilterListener implements EventSubscriberInterface
{
    private $mapping;

    public function __construct(array $mapping)
    {
        $this->mapping = array_merge(array(
            'preSubmit' => array(),
            'onSubmit' => array(),
            'preSetData' => array(),
        ), $mapping);
    }

    public function preSubmit(FormEvent $event)
    {
        $data = $event->getData();

        if (isset($this->mapping['preSubmit'][$data])) {
            $event->setData($this->mapping['preSubmit'][$data]);
        }
    }

    public function onSubmit(FormEvent $event)
    {
        $data = $event->getData();

        if (isset($this->mapping['onSubmit'][$data])) {
            $event->setData($this->mapping['onSubmit'][$data]);
        }
    }

    public function preSetData(FormEvent $event)
    {
        $data = $event->getData();

        if (isset($this->mapping['preSetData'][$data])) {
            $event->setData($this->mapping['preSetData'][$data]);
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SUBMIT => 'preSubmit',
            FormEvents::SUBMIT => 'onSubmit',
            FormEvents::PRE_SET_DATA => 'preSetData',
        );
    }
}
PK�b�\m^�2++Upear/test/Form/Symfony/Component/Form/Tests/Fixtures/FooSubTypeWithParentInstance.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Fixtures;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class FooSubTypeWithParentInstance extends AbstractType
{
    public function getName()
    {
        return 'foo_sub_type_parent_instance';
    }

    public function getParent()
    {
        return new FooType();
    }
}
PK�b�\�x���?pear/test/Form/Symfony/Component/Form/Tests/Fixtures/Author.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Fixtures;

class Author
{
    public $firstName;
    private $lastName;
    private $australian;
    public $child;
    private $readPermissions;

    private $privateProperty;

    public function setLastName($lastName)
    {
        $this->lastName = $lastName;
    }

    public function getLastName()
    {
        return $this->lastName;
    }

    private function getPrivateGetter()
    {
        return 'foobar';
    }

    public function setAustralian($australian)
    {
        $this->australian = $australian;
    }

    public function isAustralian()
    {
        return $this->australian;
    }

    public function setReadPermissions($bool)
    {
        $this->readPermissions = $bool;
    }

    public function hasReadPermissions()
    {
        return $this->readPermissions;
    }

    private function isPrivateIsser()
    {
        return true;
    }

    public function getPrivateSetter()
    {
    }

    private function setPrivateSetter($data)
    {
    }
}
PK�b�\��8���Fpear/test/Form/Symfony/Component/Form/Tests/Fixtures/TestExtension.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Fixtures;

use Symfony\Component\Form\FormTypeInterface;
use Symfony\Component\Form\FormTypeExtensionInterface;
use Symfony\Component\Form\FormTypeGuesserInterface;
use Symfony\Component\Form\FormExtensionInterface;

class TestExtension implements FormExtensionInterface
{
    private $types = array();

    private $extensions = array();

    private $guesser;

    public function __construct(FormTypeGuesserInterface $guesser)
    {
        $this->guesser = $guesser;
    }

    public function addType(FormTypeInterface $type)
    {
        $this->types[$type->getName()] = $type;
    }

    public function getType($name)
    {
        return isset($this->types[$name]) ? $this->types[$name] : null;
    }

    public function hasType($name)
    {
        return isset($this->types[$name]);
    }

    public function addTypeExtension(FormTypeExtensionInterface $extension)
    {
        $type = $extension->getExtendedType();

        if (!isset($this->extensions[$type])) {
            $this->extensions[$type] = array();
        }

        $this->extensions[$type][] = $extension;
    }

    public function getTypeExtensions($name)
    {
        return isset($this->extensions[$name]) ? $this->extensions[$name] : array();
    }

    public function hasTypeExtensions($name)
    {
        return isset($this->extensions[$name]);
    }

    public function getTypeGuesser()
    {
        return $this->guesser;
    }
}
PK�b�\:�.z��Kpear/test/Form/Symfony/Component/Form/Tests/Fixtures/AlternatingRowType.phpnu�[���<?php

namespace Symfony\Component\Form\Tests\Fixtures;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormBuilderInterface;

class AlternatingRowType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $formFactory = $builder->getFormFactory();

        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formFactory) {
            $form = $event->getForm();
            $type = $form->getName() % 2 === 0 ? 'text' : 'textarea';
            $form->add('title', $type);
        });
    }

    public function getName()
    {
        return 'alternating_row';
    }
}
PK�b�\8pear/test/Form/Symfony/Component/Form/Tests/Fixtures/foonu�[���PK�b�\���dFpear/test/Form/Symfony/Component/Form/Tests/FormFactoryBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\FormFactoryBuilder;
use Symfony\Component\Form\Tests\Fixtures\FooType;

class FormFactoryBuilderTest extends \PHPUnit_Framework_TestCase
{
    private $registry;
    private $guesser;
    private $type;

    protected function setUp()
    {
        $factory = new \ReflectionClass('Symfony\Component\Form\FormFactory');
        $this->registry = $factory->getProperty('registry');
        $this->registry->setAccessible(true);

        $this->guesser = $this->getMock('Symfony\Component\Form\FormTypeGuesserInterface');
        $this->type = new FooType();
    }

    public function testAddType()
    {
        $factoryBuilder = new FormFactoryBuilder();
        $factoryBuilder->addType($this->type);

        $factory = $factoryBuilder->getFormFactory();
        $registry = $this->registry->getValue($factory);
        $extensions = $registry->getExtensions();

        $this->assertCount(1, $extensions);
        $this->assertTrue($extensions[0]->hasType($this->type->getName()));
        $this->assertNull($extensions[0]->getTypeGuesser());
    }

    public function testAddTypeGuesser()
    {
        $factoryBuilder = new FormFactoryBuilder();
        $factoryBuilder->addTypeGuesser($this->guesser);

        $factory = $factoryBuilder->getFormFactory();
        $registry = $this->registry->getValue($factory);
        $extensions = $registry->getExtensions();

        $this->assertCount(1, $extensions);
        $this->assertNotNull($extensions[0]->getTypeGuesser());
    }
}
PK�b�\J����R�R?pear/test/Form/Symfony/Component/Form/Tests/FormFactoryTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\FormTypeGuesserChain;
use Symfony\Component\Form\FormFactory;
use Symfony\Component\Form\Guess\Guess;
use Symfony\Component\Form\Guess\ValueGuess;
use Symfony\Component\Form\Guess\TypeGuess;
use Symfony\Component\Form\Tests\Fixtures\Author;
use Symfony\Component\Form\Tests\Fixtures\FooType;
use Symfony\Component\Form\Tests\Fixtures\FooSubType;
use Symfony\Component\Form\Tests\Fixtures\FooSubTypeWithParentInstance;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormFactoryTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $guesser1;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $guesser2;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $registry;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $resolvedTypeFactory;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $builder;

    /**
     * @var FormFactory
     */
    private $factory;

    protected function setUp()
    {
        $this->resolvedTypeFactory = $this->getMock('Symfony\Component\Form\ResolvedFormTypeFactoryInterface');
        $this->guesser1 = $this->getMock('Symfony\Component\Form\FormTypeGuesserInterface');
        $this->guesser2 = $this->getMock('Symfony\Component\Form\FormTypeGuesserInterface');
        $this->registry = $this->getMock('Symfony\Component\Form\FormRegistryInterface');
        $this->builder = $this->getMock('Symfony\Component\Form\Test\FormBuilderInterface');
        $this->factory = new FormFactory($this->registry, $this->resolvedTypeFactory);

        $this->registry->expects($this->any())
            ->method('getTypeGuesser')
            ->will($this->returnValue(new FormTypeGuesserChain(array(
                $this->guesser1,
                $this->guesser2,
            ))));
    }

    public function testCreateNamedBuilderWithTypeName()
    {
        $options = array('a' => '1', 'b' => '2');
        $resolvedOptions = array('a' => '2', 'b' => '3');
        $resolvedType = $this->getMockResolvedType();

        $this->registry->expects($this->once())
            ->method('getType')
            ->with('type')
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->once())
            ->method('createBuilder')
            ->with($this->factory, 'name', $options)
            ->will($this->returnValue($this->builder));

        $this->builder->expects($this->any())
            ->method('getOptions')
            ->will($this->returnValue($resolvedOptions));

        $resolvedType->expects($this->once())
            ->method('buildForm')
            ->with($this->builder, $resolvedOptions);

        $this->assertSame($this->builder, $this->factory->createNamedBuilder('name', 'type', null, $options));
    }

    public function testCreateNamedBuilderWithTypeInstance()
    {
        $options = array('a' => '1', 'b' => '2');
        $resolvedOptions = array('a' => '2', 'b' => '3');
        $type = new FooType();
        $resolvedType = $this->getMockResolvedType();

        $this->resolvedTypeFactory->expects($this->once())
            ->method('createResolvedType')
            ->with($type)
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->once())
            ->method('createBuilder')
            ->with($this->factory, 'name', $options)
            ->will($this->returnValue($this->builder));

        $this->builder->expects($this->any())
            ->method('getOptions')
            ->will($this->returnValue($resolvedOptions));

        $resolvedType->expects($this->once())
            ->method('buildForm')
            ->with($this->builder, $resolvedOptions);

        $this->assertSame($this->builder, $this->factory->createNamedBuilder('name', $type, null, $options));
    }

    public function testCreateNamedBuilderWithTypeInstanceWithParentType()
    {
        $options = array('a' => '1', 'b' => '2');
        $resolvedOptions = array('a' => '2', 'b' => '3');
        $type = new FooSubType();
        $resolvedType = $this->getMockResolvedType();
        $parentResolvedType = $this->getMockResolvedType();

        $this->registry->expects($this->once())
            ->method('getType')
            ->with('foo')
            ->will($this->returnValue($parentResolvedType));

        $this->resolvedTypeFactory->expects($this->once())
            ->method('createResolvedType')
            ->with($type, array(), $parentResolvedType)
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->once())
            ->method('createBuilder')
            ->with($this->factory, 'name', $options)
            ->will($this->returnValue($this->builder));

        $this->builder->expects($this->any())
            ->method('getOptions')
            ->will($this->returnValue($resolvedOptions));

        $resolvedType->expects($this->once())
            ->method('buildForm')
            ->with($this->builder, $resolvedOptions);

        $this->assertSame($this->builder, $this->factory->createNamedBuilder('name', $type, null, $options));
    }

    public function testCreateNamedBuilderWithTypeInstanceWithParentTypeInstance()
    {
        $options = array('a' => '1', 'b' => '2');
        $resolvedOptions = array('a' => '2', 'b' => '3');
        $type = new FooSubTypeWithParentInstance();
        $resolvedType = $this->getMockResolvedType();
        $parentResolvedType = $this->getMockResolvedType();

        $this->resolvedTypeFactory->expects($this->at(0))
            ->method('createResolvedType')
            ->with($type->getParent())
            ->will($this->returnValue($parentResolvedType));

        $this->resolvedTypeFactory->expects($this->at(1))
            ->method('createResolvedType')
            ->with($type, array(), $parentResolvedType)
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->once())
            ->method('createBuilder')
            ->with($this->factory, 'name', $options)
            ->will($this->returnValue($this->builder));

        $this->builder->expects($this->any())
            ->method('getOptions')
            ->will($this->returnValue($resolvedOptions));

        $resolvedType->expects($this->once())
            ->method('buildForm')
            ->with($this->builder, $resolvedOptions);

        $this->assertSame($this->builder, $this->factory->createNamedBuilder('name', $type, null, $options));
    }

    public function testCreateNamedBuilderWithResolvedTypeInstance()
    {
        $options = array('a' => '1', 'b' => '2');
        $resolvedOptions = array('a' => '2', 'b' => '3');
        $resolvedType = $this->getMockResolvedType();

        $resolvedType->expects($this->once())
            ->method('createBuilder')
            ->with($this->factory, 'name', $options)
            ->will($this->returnValue($this->builder));

        $this->builder->expects($this->any())
            ->method('getOptions')
            ->will($this->returnValue($resolvedOptions));

        $resolvedType->expects($this->once())
            ->method('buildForm')
            ->with($this->builder, $resolvedOptions);

        $this->assertSame($this->builder, $this->factory->createNamedBuilder('name', $resolvedType, null, $options));
    }

    public function testCreateNamedBuilderFillsDataOption()
    {
        $givenOptions = array('a' => '1', 'b' => '2');
        $expectedOptions = array_merge($givenOptions, array('data' => 'DATA'));
        $resolvedOptions = array('a' => '2', 'b' => '3', 'data' => 'DATA');
        $resolvedType = $this->getMockResolvedType();

        $this->registry->expects($this->once())
            ->method('getType')
            ->with('type')
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->once())
            ->method('createBuilder')
            ->with($this->factory, 'name', $expectedOptions)
            ->will($this->returnValue($this->builder));

        $this->builder->expects($this->any())
            ->method('getOptions')
            ->will($this->returnValue($resolvedOptions));

        $resolvedType->expects($this->once())
            ->method('buildForm')
            ->with($this->builder, $resolvedOptions);

        $this->assertSame($this->builder, $this->factory->createNamedBuilder('name', 'type', 'DATA', $givenOptions));
    }

    public function testCreateNamedBuilderDoesNotOverrideExistingDataOption()
    {
        $options = array('a' => '1', 'b' => '2', 'data' => 'CUSTOM');
        $resolvedOptions = array('a' => '2', 'b' => '3', 'data' => 'CUSTOM');
        $resolvedType = $this->getMockResolvedType();

        $this->registry->expects($this->once())
            ->method('getType')
            ->with('type')
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->once())
            ->method('createBuilder')
            ->with($this->factory, 'name', $options)
            ->will($this->returnValue($this->builder));

        $this->builder->expects($this->any())
            ->method('getOptions')
            ->will($this->returnValue($resolvedOptions));

        $resolvedType->expects($this->once())
            ->method('buildForm')
            ->with($this->builder, $resolvedOptions);

        $this->assertSame($this->builder, $this->factory->createNamedBuilder('name', 'type', 'DATA', $options));
    }

    /**
     * @expectedException        \Symfony\Component\Form\Exception\UnexpectedTypeException
     * @expectedExceptionMessage Expected argument of type "string, Symfony\Component\Form\ResolvedFormTypeInterface or Symfony\Component\Form\FormTypeInterface", "stdClass" given
     */
    public function testCreateNamedBuilderThrowsUnderstandableException()
    {
        $this->factory->createNamedBuilder('name', new \stdClass());
    }

    public function testCreateUsesTypeNameIfTypeGivenAsString()
    {
        $options = array('a' => '1', 'b' => '2');
        $resolvedOptions = array('a' => '2', 'b' => '3');
        $resolvedType = $this->getMockResolvedType();

        $this->registry->expects($this->once())
            ->method('getType')
            ->with('TYPE')
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->once())
            ->method('createBuilder')
            ->with($this->factory, 'TYPE', $options)
            ->will($this->returnValue($this->builder));

        $this->builder->expects($this->any())
            ->method('getOptions')
            ->will($this->returnValue($resolvedOptions));

        $resolvedType->expects($this->once())
            ->method('buildForm')
            ->with($this->builder, $resolvedOptions);

        $this->builder->expects($this->once())
            ->method('getForm')
            ->will($this->returnValue('FORM'));

        $this->assertSame('FORM', $this->factory->create('TYPE', null, $options));
    }

    public function testCreateUsesTypeNameIfTypeGivenAsObject()
    {
        $options = array('a' => '1', 'b' => '2');
        $resolvedOptions = array('a' => '2', 'b' => '3');
        $resolvedType = $this->getMockResolvedType();

        $resolvedType->expects($this->once())
            ->method('getName')
            ->will($this->returnValue('TYPE'));

        $resolvedType->expects($this->once())
            ->method('createBuilder')
            ->with($this->factory, 'TYPE', $options)
            ->will($this->returnValue($this->builder));

        $this->builder->expects($this->any())
            ->method('getOptions')
            ->will($this->returnValue($resolvedOptions));

        $resolvedType->expects($this->once())
            ->method('buildForm')
            ->with($this->builder, $resolvedOptions);

        $this->builder->expects($this->once())
            ->method('getForm')
            ->will($this->returnValue('FORM'));

        $this->assertSame('FORM', $this->factory->create($resolvedType, null, $options));
    }

    public function testCreateNamed()
    {
        $options = array('a' => '1', 'b' => '2');
        $resolvedOptions = array('a' => '2', 'b' => '3');
        $resolvedType = $this->getMockResolvedType();

        $this->registry->expects($this->once())
            ->method('getType')
            ->with('type')
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->once())
            ->method('createBuilder')
            ->with($this->factory, 'name', $options)
            ->will($this->returnValue($this->builder));

        $this->builder->expects($this->any())
            ->method('getOptions')
            ->will($this->returnValue($resolvedOptions));

        $resolvedType->expects($this->once())
            ->method('buildForm')
            ->with($this->builder, $resolvedOptions);

        $this->builder->expects($this->once())
            ->method('getForm')
            ->will($this->returnValue('FORM'));

        $this->assertSame('FORM', $this->factory->createNamed('name', 'type', null, $options));
    }

    public function testCreateBuilderForPropertyWithoutTypeGuesser()
    {
        $registry = $this->getMock('Symfony\Component\Form\FormRegistryInterface');
        $factory = $this->getMockBuilder('Symfony\Component\Form\FormFactory')
            ->setMethods(array('createNamedBuilder'))
            ->setConstructorArgs(array($registry, $this->resolvedTypeFactory))
            ->getMock();

        $factory->expects($this->once())
            ->method('createNamedBuilder')
            ->with('firstName', 'text', null, array())
            ->will($this->returnValue('builderInstance'));

        $this->builder = $factory->createBuilderForProperty('Application\Author', 'firstName');

        $this->assertEquals('builderInstance', $this->builder);
    }

    public function testCreateBuilderForPropertyCreatesFormWithHighestConfidence()
    {
        $this->guesser1->expects($this->once())
            ->method('guessType')
            ->with('Application\Author', 'firstName')
            ->will($this->returnValue(new TypeGuess(
                'text',
                array('max_length' => 10),
                Guess::MEDIUM_CONFIDENCE
            )));

        $this->guesser2->expects($this->once())
            ->method('guessType')
            ->with('Application\Author', 'firstName')
            ->will($this->returnValue(new TypeGuess(
                'password',
                array('max_length' => 7),
                Guess::HIGH_CONFIDENCE
            )));

        $factory = $this->getMockFactory(array('createNamedBuilder'));

        $factory->expects($this->once())
            ->method('createNamedBuilder')
            ->with('firstName', 'password', null, array('max_length' => 7))
            ->will($this->returnValue('builderInstance'));

        $this->builder = $factory->createBuilderForProperty('Application\Author', 'firstName');

        $this->assertEquals('builderInstance', $this->builder);
    }

    public function testCreateBuilderCreatesTextFormIfNoGuess()
    {
        $this->guesser1->expects($this->once())
                ->method('guessType')
                ->with('Application\Author', 'firstName')
                ->will($this->returnValue(null));

        $factory = $this->getMockFactory(array('createNamedBuilder'));

        $factory->expects($this->once())
            ->method('createNamedBuilder')
            ->with('firstName', 'text')
            ->will($this->returnValue('builderInstance'));

        $this->builder = $factory->createBuilderForProperty('Application\Author', 'firstName');

        $this->assertEquals('builderInstance', $this->builder);
    }

    public function testOptionsCanBeOverridden()
    {
        $this->guesser1->expects($this->once())
                ->method('guessType')
                ->with('Application\Author', 'firstName')
                ->will($this->returnValue(new TypeGuess(
                    'text',
                    array('max_length' => 10),
                    Guess::MEDIUM_CONFIDENCE
                )));

        $factory = $this->getMockFactory(array('createNamedBuilder'));

        $factory->expects($this->once())
            ->method('createNamedBuilder')
            ->with('firstName', 'text', null, array('max_length' => 11))
            ->will($this->returnValue('builderInstance'));

        $this->builder = $factory->createBuilderForProperty(
            'Application\Author',
            'firstName',
            null,
            array('max_length' => 11)
        );

        $this->assertEquals('builderInstance', $this->builder);
    }

    public function testCreateBuilderUsesMaxLengthIfFound()
    {
        $this->guesser1->expects($this->once())
                ->method('guessMaxLength')
                ->with('Application\Author', 'firstName')
                ->will($this->returnValue(new ValueGuess(
                    15,
                    Guess::MEDIUM_CONFIDENCE
                )));

        $this->guesser2->expects($this->once())
                ->method('guessMaxLength')
                ->with('Application\Author', 'firstName')
                ->will($this->returnValue(new ValueGuess(
                    20,
                    Guess::HIGH_CONFIDENCE
                )));

        $factory = $this->getMockFactory(array('createNamedBuilder'));

        $factory->expects($this->once())
            ->method('createNamedBuilder')
            ->with('firstName', 'text', null, array('max_length' => 20))
            ->will($this->returnValue('builderInstance'));

        $this->builder = $factory->createBuilderForProperty(
            'Application\Author',
            'firstName'
        );

        $this->assertEquals('builderInstance', $this->builder);
    }

    public function testCreateBuilderUsesRequiredSettingWithHighestConfidence()
    {
        $this->guesser1->expects($this->once())
                ->method('guessRequired')
                ->with('Application\Author', 'firstName')
                ->will($this->returnValue(new ValueGuess(
                    true,
                    Guess::MEDIUM_CONFIDENCE
                )));

        $this->guesser2->expects($this->once())
                ->method('guessRequired')
                ->with('Application\Author', 'firstName')
                ->will($this->returnValue(new ValueGuess(
                    false,
                    Guess::HIGH_CONFIDENCE
                )));

        $factory = $this->getMockFactory(array('createNamedBuilder'));

        $factory->expects($this->once())
            ->method('createNamedBuilder')
            ->with('firstName', 'text', null, array('required' => false))
            ->will($this->returnValue('builderInstance'));

        $this->builder = $factory->createBuilderForProperty(
            'Application\Author',
            'firstName'
        );

        $this->assertEquals('builderInstance', $this->builder);
    }

    public function testCreateBuilderUsesPatternIfFound()
    {
        $this->guesser1->expects($this->once())
                ->method('guessPattern')
                ->with('Application\Author', 'firstName')
                ->will($this->returnValue(new ValueGuess(
                    '[a-z]',
                    Guess::MEDIUM_CONFIDENCE
                )));

        $this->guesser2->expects($this->once())
                ->method('guessPattern')
                ->with('Application\Author', 'firstName')
                ->will($this->returnValue(new ValueGuess(
                    '[a-zA-Z]',
                    Guess::HIGH_CONFIDENCE
                )));

        $factory = $this->getMockFactory(array('createNamedBuilder'));

        $factory->expects($this->once())
            ->method('createNamedBuilder')
            ->with('firstName', 'text', null, array('pattern' => '[a-zA-Z]'))
            ->will($this->returnValue('builderInstance'));

        $this->builder = $factory->createBuilderForProperty(
            'Application\Author',
            'firstName'
        );

        $this->assertEquals('builderInstance', $this->builder);
    }

    private function getMockFactory(array $methods = array())
    {
        return $this->getMockBuilder('Symfony\Component\Form\FormFactory')
            ->setMethods($methods)
            ->setConstructorArgs(array($this->registry, $this->resolvedTypeFactory))
            ->getMock();
    }

    private function getMockResolvedType()
    {
        return $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
    }

    private function getMockType()
    {
        return $this->getMock('Symfony\Component\Form\FormTypeInterface');
    }
}
PK�b�\RmhZTZTEpear/test/Form/Symfony/Component/Form/Tests/AbstractDivLayoutTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\FormError;
use Symfony\Component\Form\Tests\Fixtures\AlternatingRowType;
use Symfony\Component\Security\Csrf\CsrfToken;

abstract class AbstractDivLayoutTest extends AbstractLayoutTest
{
    public function testRow()
    {
        $form = $this->factory->createNamed('name', 'text');
        $form->addError(new FormError('[trans]Error![/trans]'));
        $view = $form->createView();
        $html = $this->renderRow($view);

        $this->assertMatchesXpath($html,
'/div
    [
        ./label[@for="name"]
        /following-sibling::ul
            [./li[.="[trans]Error![/trans]"]]
            [count(./li)=1]
        /following-sibling::input[@id="name"]
    ]
'
        );
    }

    public function testRowOverrideVariables()
    {
        $view = $this->factory->createNamed('name', 'text')->createView();
        $html = $this->renderRow($view, array(
            'attr' => array('class' => 'my&class'),
            'label' => 'foo&bar',
            'label_attr' => array('class' => 'my&label&class'),
        ));

        $this->assertMatchesXpath($html,
'/div
    [
        ./label[@for="name"][@class="my&label&class required"][.="[trans]foo&bar[/trans]"]
        /following-sibling::input[@id="name"][@class="my&class"]
    ]
'
        );
    }

    public function testRepeatedRow()
    {
        $form = $this->factory->createNamed('name', 'repeated');
        $form->addError(new FormError('[trans]Error![/trans]'));
        $view = $form->createView();
        $html = $this->renderRow($view);

        // The errors of the form are not rendered by intention!
        // In practice, repeated fields cannot have errors as all errors
        // on them are mapped to the first child.
        // (see RepeatedTypeValidatorExtension)

        $this->assertMatchesXpath($html,
'/div
    [
        ./label[@for="name_first"]
        /following-sibling::input[@id="name_first"]
    ]
/following-sibling::div
    [
        ./label[@for="name_second"]
        /following-sibling::input[@id="name_second"]
    ]
'
        );
    }

    public function testButtonRow()
    {
        $form = $this->factory->createNamed('name', 'button');
        $view = $form->createView();
        $html = $this->renderRow($view);

        $this->assertMatchesXpath($html,
'/div
    [
        ./button[@type="button"][@name="name"]
    ]
    [count(//label)=0]
'
        );
    }

    public function testRest()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->add('field1', 'text')
            ->add('field2', 'repeated')
            ->add('field3', 'text')
            ->add('field4', 'text')
            ->getForm()
            ->createView();

        // Render field2 row -> does not implicitly call renderWidget because
        // it is a repeated field!
        $this->renderRow($view['field2']);

        // Render field3 widget
        $this->renderWidget($view['field3']);

        // Rest should only contain field1 and field4
        $html = $this->renderRest($view);

        $this->assertMatchesXpath($html,
'/div
    [
        ./label[@for="name_field1"]
        /following-sibling::input[@type="text"][@id="name_field1"]
    ]
/following-sibling::div
    [
        ./label[@for="name_field4"]
        /following-sibling::input[@type="text"][@id="name_field4"]
    ]
    [count(../div)=2]
    [count(..//label)=2]
    [count(..//input)=3]
/following-sibling::input
    [@type="hidden"]
    [@id="name__token"]
'
        );
    }

    public function testRestWithChildrenForms()
    {
        $child1 = $this->factory->createNamedBuilder('child1', 'form')
            ->add('field1', 'text')
            ->add('field2', 'text');

        $child2 = $this->factory->createNamedBuilder('child2', 'form')
            ->add('field1', 'text')
            ->add('field2', 'text');

        $view = $this->factory->createNamedBuilder('parent', 'form')
            ->add($child1)
            ->add($child2)
            ->getForm()
            ->createView();

        // Render child1.field1 row
        $this->renderRow($view['child1']['field1']);

        // Render child2.field2 widget (remember that widget don't render label)
        $this->renderWidget($view['child2']['field2']);

        // Rest should only contain child1.field2 and child2.field1
        $html = $this->renderRest($view);

        $this->assertMatchesXpath($html,
'/div
    [
        ./label[not(@for)]
        /following-sibling::div[@id="parent_child1"]
            [
                ./div
                    [
                        ./label[@for="parent_child1_field2"]
                        /following-sibling::input[@id="parent_child1_field2"]
                    ]
            ]
    ]

/following-sibling::div
    [
        ./label[not(@for)]
        /following-sibling::div[@id="parent_child2"]
            [
                ./div
                    [
                        ./label[@for="parent_child2_field1"]
                        /following-sibling::input[@id="parent_child2_field1"]
                    ]
            ]
    ]
    [count(//label)=4]
    [count(//input[@type="text"])=2]
/following-sibling::input[@type="hidden"][@id="parent__token"]
'
        );
    }

    public function testRestAndRepeatedWithRow()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->add('first', 'text')
            ->add('password', 'repeated')
            ->getForm()
            ->createView();

        $this->renderRow($view['password']);

        $html = $this->renderRest($view);

        $this->assertMatchesXpath($html,
'/div
    [
        ./label[@for="name_first"]
        /following-sibling::input[@type="text"][@id="name_first"]
    ]
    [count(.//input)=1]
/following-sibling::input
    [@type="hidden"]
    [@id="name__token"]
'
        );
    }

    public function testRestAndRepeatedWithRowPerChild()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->add('first', 'text')
            ->add('password', 'repeated')
            ->getForm()
            ->createView();

        $this->renderRow($view['password']['first']);
        $this->renderRow($view['password']['second']);

        $html = $this->renderRest($view);

        $this->assertMatchesXpath($html,
'/div
    [
        ./label[@for="name_first"]
        /following-sibling::input[@type="text"][@id="name_first"]
    ]
    [count(.//input)=1]
    [count(.//label)=1]
/following-sibling::input
    [@type="hidden"]
    [@id="name__token"]
'
        );
    }

    public function testRestAndRepeatedWithWidgetPerChild()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->add('first', 'text')
            ->add('password', 'repeated')
            ->getForm()
            ->createView();

        // The password form is considered as rendered as all its children
        // are rendered
        $this->renderWidget($view['password']['first']);
        $this->renderWidget($view['password']['second']);

        $html = $this->renderRest($view);

        $this->assertMatchesXpath($html,
'/div
    [
        ./label[@for="name_first"]
        /following-sibling::input[@type="text"][@id="name_first"]
    ]
    [count(//input)=2]
    [count(//label)=1]
/following-sibling::input
    [@type="hidden"]
    [@id="name__token"]
'
        );
    }

    public function testCollection()
    {
        $form = $this->factory->createNamed('name', 'collection', array('a', 'b'), array(
            'type' => 'text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div[./input[@type="text"][@value="a"]]
        /following-sibling::div[./input[@type="text"][@value="b"]]
    ]
    [count(./div[./input])=2]
'
        );
    }

    // https://github.com/symfony/symfony/issues/5038
    public function testCollectionWithAlternatingRowTypes()
    {
        $data = array(
            array('title' => 'a'),
            array('title' => 'b'),
        );
        $form = $this->factory->createNamed('name', 'collection', $data, array(
            'type' => new AlternatingRowType(),
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div[./div/div/input[@type="text"][@value="a"]]
        /following-sibling::div[./div/div/textarea[.="b"]]
    ]
    [count(./div[./div/div/input])=1]
    [count(./div[./div/div/textarea])=1]
'
        );
    }

    public function testEmptyCollection()
    {
        $form = $this->factory->createNamed('name', 'collection', array(), array(
            'type' => 'text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [./input[@type="hidden"][@id="name__token"]]
    [count(./div)=0]
'
        );
    }

    public function testCollectionRow()
    {
        $collection = $this->factory->createNamedBuilder(
            'collection',
            'collection',
            array('a', 'b'),
            array('type' => 'text')
        );

        $form = $this->factory->createNamedBuilder('form', 'form')
          ->add($collection)
          ->getForm();

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div
            [
                ./label[not(@for)]
                /following-sibling::div
                    [
                        ./div
                            [
                                ./label[@for="form_collection_0"]
                                /following-sibling::input[@type="text"][@value="a"]
                            ]
                        /following-sibling::div
                            [
                                ./label[@for="form_collection_1"]
                                /following-sibling::input[@type="text"][@value="b"]
                            ]
                    ]
            ]
        /following-sibling::input[@type="hidden"][@id="form__token"]
    ]
    [count(.//input)=3]
'
        );
    }

    public function testForm()
    {
        $form = $this->factory->createNamedBuilder('name', 'form')
            ->setMethod('PUT')
            ->setAction('http://example.com')
            ->add('firstName', 'text')
            ->add('lastName', 'text')
            ->getForm();

        // include ampersands everywhere to validate escaping
        $html = $this->renderForm($form->createView(), array(
            'id' => 'my&id',
            'attr' => array('class' => 'my&class'),
        ));

        $this->assertMatchesXpath($html,
'/form
    [
        ./input[@type="hidden"][@name="_method"][@value="PUT"]
        /following-sibling::div
            [
                ./div
                    [
                        ./label[@for="name_firstName"]
                        /following-sibling::input[@type="text"][@id="name_firstName"]
                    ]
                /following-sibling::div
                    [
                        ./label[@for="name_lastName"]
                        /following-sibling::input[@type="text"][@id="name_lastName"]
                    ]
                /following-sibling::input[@type="hidden"][@id="name__token"]
            ]
            [count(.//input)=3]
            [@id="my&id"]
            [@class="my&class"]
    ]
    [@method="post"]
    [@action="http://example.com"]
    [@class="my&class"]
'
        );
    }

    public function testFormWidget()
    {
        $form = $this->factory->createNamedBuilder('name', 'form')
            ->add('firstName', 'text')
            ->add('lastName', 'text')
            ->getForm();

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div
            [
                ./label[@for="name_firstName"]
                /following-sibling::input[@type="text"][@id="name_firstName"]
            ]
        /following-sibling::div
            [
                ./label[@for="name_lastName"]
                /following-sibling::input[@type="text"][@id="name_lastName"]
            ]
        /following-sibling::input[@type="hidden"][@id="name__token"]
    ]
    [count(.//input)=3]
'
        );
    }

    // https://github.com/symfony/symfony/issues/2308
    public function testNestedFormError()
    {
        $form = $this->factory->createNamedBuilder('name', 'form')
            ->add($this->factory
                ->createNamedBuilder('child', 'form', null, array('error_bubbling' => false))
                ->add('grandChild', 'form')
            )
            ->getForm();

        $form->get('child')->addError(new FormError('[trans]Error![/trans]'));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div/label
        /following-sibling::ul[./li[.="[trans]Error![/trans]"]]
    ]
    [count(.//li[.="[trans]Error![/trans]"])=1]
'
        );
    }

    public function testCsrf()
    {
        $this->csrfTokenManager->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue(new CsrfToken('token_id', 'foo&bar')));

        $form = $this->factory->createNamedBuilder('name', 'form')
            ->add($this->factory
                // No CSRF protection on nested forms
                ->createNamedBuilder('child', 'form')
                ->add($this->factory->createNamedBuilder('grandchild', 'text'))
            )
            ->getForm();

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div
        /following-sibling::input[@type="hidden"][@id="name__token"][@value="foo&bar"]
    ]
    [count(.//input[@type="hidden"])=1]
'
        );
    }

    public function testRepeated()
    {
        $form = $this->factory->createNamed('name', 'repeated', 'foobar', array(
            'type' => 'text',
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div
            [
                ./label[@for="name_first"]
                /following-sibling::input[@type="text"][@id="name_first"]
            ]
        /following-sibling::div
            [
                ./label[@for="name_second"]
                /following-sibling::input[@type="text"][@id="name_second"]
            ]
        /following-sibling::input[@type="hidden"][@id="name__token"]
    ]
    [count(.//input)=3]
'
        );
    }

    public function testRepeatedWithCustomOptions()
    {
        $form = $this->factory->createNamed('name', 'repeated', null, array(
            // the global required value cannot be overridden
            'first_options'  => array('label' => 'Test', 'required' => false),
            'second_options' => array('label' => 'Test2')
        ));

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div
            [
                ./label[@for="name_first"][.="[trans]Test[/trans]"]
                /following-sibling::input[@type="text"][@id="name_first"][@required="required"]
            ]
        /following-sibling::div
            [
                ./label[@for="name_second"][.="[trans]Test2[/trans]"]
                /following-sibling::input[@type="text"][@id="name_second"][@required="required"]
            ]
        /following-sibling::input[@type="hidden"][@id="name__token"]
    ]
    [count(.//input)=3]
'
        );
    }

    public function testSearchInputName()
    {
        $form = $this->factory->createNamedBuilder('full', 'form')
            ->add('name', 'search')
            ->getForm();

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div
            [
                ./label[@for="full_name"]
                /following-sibling::input[@type="search"][@id="full_name"][@name="full[name]"]
            ]
        /following-sibling::input[@type="hidden"][@id="full__token"]
    ]
    [count(//input)=2]
'
        );
    }

    public function testLabelHasNoId()
    {
        $form = $this->factory->createNamed('name', 'text');
        $html = $this->renderRow($form->createView());

        $this->assertMatchesXpath($html,
'/div
    [
        ./label[@for="name"][not(@id)]
        /following-sibling::input[@id="name"]
    ]
'
        );
    }

    public function testLabelIsNotRenderedWhenSetToFalse()
    {
        $form = $this->factory->createNamed('name', 'text', null, array(
            'label' => false
        ));
        $html = $this->renderRow($form->createView());

        $this->assertMatchesXpath($html,
'/div
    [
        ./input[@id="name"]
    ]
    [count(//label)=0]
'
        );
    }

    /**
     * @dataProvider themeBlockInheritanceProvider
     */
    public function testThemeBlockInheritance($theme)
    {
        $view = $this->factory
            ->createNamed('name', 'email')
            ->createView()
        ;

        $this->setTheme($view, $theme);

        $this->assertMatchesXpath(
            $this->renderWidget($view),
            '/input[@type="email"][@rel="theme"]'
        );
    }

    /**
     * @dataProvider themeInheritanceProvider
     */
    public function testThemeInheritance($parentTheme, $childTheme)
    {
        $child = $this->factory->createNamedBuilder('child', 'form')
            ->add('field', 'text');

        $view = $this->factory->createNamedBuilder('parent', 'form')
            ->add('field', 'text')
            ->add($child)
            ->getForm()
            ->createView()
        ;

        $this->setTheme($view, $parentTheme);
        $this->setTheme($view['child'], $childTheme);

        $this->assertWidgetMatchesXpath($view, array(),
'/div
    [
        ./div
            [
                ./label[.="parent"]
                /following-sibling::input[@type="text"]
            ]
        /following-sibling::div
            [
                ./label[.="child"]
                /following-sibling::div
                    [
                        ./div
                            [
                                ./label[.="child"]
                                /following-sibling::input[@type="text"]
                            ]
                    ]
            ]
        /following-sibling::input[@type="hidden"]
    ]
'
        );
    }

    /**
     * The block "_name_child_label" should be overridden in the theme of the
     * implemented driver.
     */
    public function testCollectionRowWithCustomBlock()
    {
        $collection = array('one', 'two', 'three');
        $form = $this->factory->createNamedBuilder('name', 'collection', $collection)
            ->getForm();

        $this->assertWidgetMatchesXpath($form->createView(), array(),
'/div
    [
        ./div[./label[.="Custom label: [trans]0[/trans]"]]
        /following-sibling::div[./label[.="Custom label: [trans]1[/trans]"]]
        /following-sibling::div[./label[.="Custom label: [trans]2[/trans]"]]
    ]
'
        );
    }

    public function testFormEndWithRest()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->add('field1', 'text')
            ->add('field2', 'text')
            ->getForm()
            ->createView();

        $this->renderWidget($view['field1']);

        // Rest should only contain field2
        $html = $this->renderEnd($view);

        // Insert the start tag, the end tag should be rendered by the helper
        $this->assertMatchesXpath('<form>' . $html,
'/form
    [
        ./div
            [
                ./label[@for="name_field2"]
                /following-sibling::input[@type="text"][@id="name_field2"]
            ]
        /following-sibling::input
            [@type="hidden"]
            [@id="name__token"]
    ]
'
        );
    }

    public function testFormEndWithoutRest()
    {
        $view = $this->factory->createNamedBuilder('name', 'form')
            ->add('field1', 'text')
            ->add('field2', 'text')
            ->getForm()
            ->createView();

        $this->renderWidget($view['field1']);

        // Rest should only contain field2, but isn't rendered
        $html = $this->renderEnd($view, array('render_rest' => false));

        $this->assertEquals('</form>', $html);
    }

    public function testWidgetContainerAttributes()
    {
        $form = $this->factory->createNamed('form', 'form', null, array(
            'attr' => array('class' => 'foobar', 'data-foo' => 'bar'),
        ));

        $form->add('text', 'text');

        $html = $this->renderWidget($form->createView());

        // compare plain HTML to check the whitespace
        $this->assertContains('<div id="form" class="foobar" data-foo="bar">', $html);
    }

    public function testWidgetContainerAttributeNameRepeatedIfTrue()
    {
        $form = $this->factory->createNamed('form', 'form', null, array(
            'attr' => array('foo' => true),
        ));

        $html = $this->renderWidget($form->createView());

        // foo="foo"
        $this->assertContains('<div id="form" foo="foo">', $html);
    }

    public function testWidgetContainerAttributeHiddenIfFalse()
    {
        $form = $this->factory->createNamed('form', 'form', null, array(
            'attr' => array('foo' => false),
        ));

        $html = $this->renderWidget($form->createView());

        // no foo
        $this->assertContains('<div id="form">', $html);
    }
}
PK�b�\tٴ��@pear/test/Form/Symfony/Component/Form/Tests/FormRendererTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

class FormRendererTest extends \PHPUnit_Framework_TestCase
{
    public function testHumanize()
    {
        $renderer = $this->getMockBuilder('Symfony\Component\Form\FormRenderer')
            ->setMethods(null)
            ->disableOriginalConstructor()
            ->getMock()
        ;

        $this->assertEquals('Is active', $renderer->humanize('is_active'));
        $this->assertEquals('Is active', $renderer->humanize('isActive'));
    }
}
PK�b�\����?pear/test/Form/Symfony/Component/Form/Tests/Guess/GuessTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests\Guess;

use Symfony\Component\Form\Guess\Guess;

class TestGuess extends Guess {}

class GuessTest extends \PHPUnit_Framework_TestCase
{
    public function testGetBestGuessReturnsGuessWithHighestConfidence()
    {
        $guess1 = new TestGuess(Guess::MEDIUM_CONFIDENCE);
        $guess2 = new TestGuess(Guess::LOW_CONFIDENCE);
        $guess3 = new TestGuess(Guess::HIGH_CONFIDENCE);

        $this->assertSame($guess3, Guess::getBestGuess(array($guess1, $guess2, $guess3)));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testGuessExpectsValidConfidence()
    {
        new TestGuess(5);
    }
}
PK�b�\̈́����@pear/test/Form/Symfony/Component/Form/Tests/FormRegistryTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\FormRegistry;
use Symfony\Component\Form\FormTypeGuesserChain;
use Symfony\Component\Form\Tests\Fixtures\TestExtension;
use Symfony\Component\Form\Tests\Fixtures\FooSubTypeWithParentInstance;
use Symfony\Component\Form\Tests\Fixtures\FooSubType;
use Symfony\Component\Form\Tests\Fixtures\FooTypeBazExtension;
use Symfony\Component\Form\Tests\Fixtures\FooTypeBarExtension;
use Symfony\Component\Form\Tests\Fixtures\FooType;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class FormRegistryTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var FormRegistry
     */
    private $registry;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $resolvedTypeFactory;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $guesser1;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $guesser2;

    /**
     * @var TestExtension
     */
    private $extension1;

    /**
     * @var TestExtension
     */
    private $extension2;

    protected function setUp()
    {
        $this->resolvedTypeFactory = $this->getMock('Symfony\Component\Form\ResolvedFormTypeFactory');
        $this->guesser1 = $this->getMock('Symfony\Component\Form\FormTypeGuesserInterface');
        $this->guesser2 = $this->getMock('Symfony\Component\Form\FormTypeGuesserInterface');
        $this->extension1 = new TestExtension($this->guesser1);
        $this->extension2 = new TestExtension($this->guesser2);
        $this->registry = new FormRegistry(array(
            $this->extension1,
            $this->extension2,
        ), $this->resolvedTypeFactory);
    }

    public function testGetTypeFromExtension()
    {
        $type = new FooType();
        $resolvedType = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');

        $this->extension2->addType($type);

        $this->resolvedTypeFactory->expects($this->once())
            ->method('createResolvedType')
            ->with($type)
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('foo'));

        $resolvedType = $this->registry->getType('foo');

        $this->assertSame($resolvedType, $this->registry->getType('foo'));
    }

    public function testGetTypeWithTypeExtensions()
    {
        $type = new FooType();
        $ext1 = new FooTypeBarExtension();
        $ext2 = new FooTypeBazExtension();
        $resolvedType = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');

        $this->extension2->addType($type);
        $this->extension1->addTypeExtension($ext1);
        $this->extension2->addTypeExtension($ext2);

        $this->resolvedTypeFactory->expects($this->once())
            ->method('createResolvedType')
            ->with($type, array($ext1, $ext2))
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('foo'));

        $this->assertSame($resolvedType, $this->registry->getType('foo'));
    }

    public function testGetTypeConnectsParent()
    {
        $parentType = new FooType();
        $type = new FooSubType();
        $parentResolvedType = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
        $resolvedType = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');

        $this->extension1->addType($parentType);
        $this->extension2->addType($type);

        $this->resolvedTypeFactory->expects($this->at(0))
            ->method('createResolvedType')
            ->with($parentType)
            ->will($this->returnValue($parentResolvedType));

        $this->resolvedTypeFactory->expects($this->at(1))
            ->method('createResolvedType')
            ->with($type, array(), $parentResolvedType)
            ->will($this->returnValue($resolvedType));

        $parentResolvedType->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('foo'));

        $resolvedType->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('foo_sub_type'));

        $this->assertSame($resolvedType, $this->registry->getType('foo_sub_type'));
    }

    public function testGetTypeConnectsParentIfGetParentReturnsInstance()
    {
        $type = new FooSubTypeWithParentInstance();
        $parentResolvedType = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
        $resolvedType = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');

        $this->extension1->addType($type);

        $this->resolvedTypeFactory->expects($this->at(0))
            ->method('createResolvedType')
            ->with($this->isInstanceOf('Symfony\Component\Form\Tests\Fixtures\FooType'))
            ->will($this->returnValue($parentResolvedType));

        $this->resolvedTypeFactory->expects($this->at(1))
            ->method('createResolvedType')
            ->with($type, array(), $parentResolvedType)
            ->will($this->returnValue($resolvedType));

        $parentResolvedType->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('foo'));

        $resolvedType->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('foo_sub_type_parent_instance'));

        $this->assertSame($resolvedType, $this->registry->getType('foo_sub_type_parent_instance'));
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testGetTypeThrowsExceptionIfParentNotFound()
    {
        $type = new FooSubType();

        $this->extension1->addType($type);

        $this->registry->getType($type);
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException
     */
    public function testGetTypeThrowsExceptionIfTypeNotFound()
    {
        $this->registry->getType('bar');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
     */
    public function testGetTypeThrowsExceptionIfNoString()
    {
        $this->registry->getType(array());
    }

    public function testHasTypeAfterLoadingFromExtension()
    {
        $type = new FooType();
        $resolvedType = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');

        $this->resolvedTypeFactory->expects($this->once())
            ->method('createResolvedType')
            ->with($type)
            ->will($this->returnValue($resolvedType));

        $resolvedType->expects($this->any())
            ->method('getName')
            ->will($this->returnValue('foo'));

        $this->assertFalse($this->registry->hasType('foo'));

        $this->extension2->addType($type);

        $this->assertTrue($this->registry->hasType('foo'));
    }

    public function testGetTypeGuesser()
    {
        $expectedGuesser = new FormTypeGuesserChain(array($this->guesser1, $this->guesser2));

        $this->assertEquals($expectedGuesser, $this->registry->getTypeGuesser());

        $registry = new FormRegistry(
            array($this->getMock('Symfony\Component\Form\FormExtensionInterface')),
            $this->resolvedTypeFactory);

        $this->assertNull($registry->getTypeGuesser());
    }

    public function testGetExtensions()
    {
        $expectedExtensions = array($this->extension1, $this->extension2);

        $this->assertEquals($expectedExtensions, $this->registry->getExtensions());
    }
}
PK�b�\rM�{�{>pear/test/Form/Symfony/Component/Form/Tests/SimpleFormTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\PropertyAccess\PropertyPath;
use Symfony\Component\Form\FormConfigBuilder;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\Form\Tests\Fixtures\FixedDataTransformer;
use Symfony\Component\Form\Tests\Fixtures\FixedFilterListener;

class SimpleFormTest_Countable implements \Countable
{
    private $count;

    public function __construct($count)
    {
        $this->count = $count;
    }

    public function count()
    {
        return $this->count;
    }
}

class SimpleFormTest_Traversable implements \IteratorAggregate
{
    private $iterator;

    public function __construct($count)
    {
        $this->iterator = new \ArrayIterator($count > 0 ? array_fill(0, $count, 'Foo') : array());
    }

    public function getIterator()
    {
        return $this->iterator;
    }
}

class SimpleFormTest extends AbstractFormTest
{
    public function testDataIsInitializedToConfiguredValue()
    {
        $model = new FixedDataTransformer(array(
            'default' => 'foo',
        ));
        $view = new FixedDataTransformer(array(
            'foo' => 'bar',
        ));

        $config = new FormConfigBuilder('name', null, $this->dispatcher);
        $config->addViewTransformer($view);
        $config->addModelTransformer($model);
        $config->setData('default');
        $form = new Form($config);

        $this->assertSame('default', $form->getData());
        $this->assertSame('foo', $form->getNormData());
        $this->assertSame('bar', $form->getViewData());
    }

    // https://github.com/symfony/symfony/commit/d4f4038f6daf7cf88ca7c7ab089473cce5ebf7d8#commitcomment-1632879
    public function testDataIsInitializedFromSubmit()
    {
        $mock = $this->getMockBuilder('\stdClass')
            ->setMethods(array('preSetData', 'preSubmit'))
            ->getMock();
        $mock->expects($this->at(0))
            ->method('preSetData');
        $mock->expects($this->at(1))
            ->method('preSubmit');

        $config = new FormConfigBuilder('name', null, $this->dispatcher);
        $config->addEventListener(FormEvents::PRE_SET_DATA, array($mock, 'preSetData'));
        $config->addEventListener(FormEvents::PRE_SUBMIT, array($mock, 'preSubmit'));
        $form = new Form($config);

        // no call to setData() or similar where the object would be
        // initialized otherwise

        $form->submit('foobar');
    }

    // https://github.com/symfony/symfony/pull/7789
    public function testFalseIsConvertedToNull()
    {
        $mock = $this->getMockBuilder('\stdClass')
            ->setMethods(array('preBind'))
            ->getMock();
        $mock->expects($this->once())
            ->method('preBind')
            ->with($this->callback(function ($event) {
                return null === $event->getData();
            }));

        $config = new FormConfigBuilder('name', null, $this->dispatcher);
        $config->addEventListener(FormEvents::PRE_BIND, array($mock, 'preBind'));
        $form = new Form($config);

        $form->bind(false);

        $this->assertTrue($form->isValid());
        $this->assertNull($form->getData());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\AlreadySubmittedException
     */
    public function testSubmitThrowsExceptionIfAlreadySubmitted()
    {
        $this->form->submit(array());
        $this->form->submit(array());
    }

    public function testSubmitIsIgnoredIfDisabled()
    {
        $form = $this->getBuilder()
            ->setDisabled(true)
            ->setData('initial')
            ->getForm();

        $form->submit('new');

        $this->assertEquals('initial', $form->getData());
        $this->assertTrue($form->isSubmitted());
    }

    public function testNeverRequiredIfParentNotRequired()
    {
        $parent = $this->getBuilder()->setRequired(false)->getForm();
        $child = $this->getBuilder()->setRequired(true)->getForm();

        $child->setParent($parent);

        $this->assertFalse($child->isRequired());
    }

    public function testRequired()
    {
        $parent = $this->getBuilder()->setRequired(true)->getForm();
        $child = $this->getBuilder()->setRequired(true)->getForm();

        $child->setParent($parent);

        $this->assertTrue($child->isRequired());
    }

    public function testNotRequired()
    {
        $parent = $this->getBuilder()->setRequired(true)->getForm();
        $child = $this->getBuilder()->setRequired(false)->getForm();

        $child->setParent($parent);

        $this->assertFalse($child->isRequired());
    }

    public function testAlwaysDisabledIfParentDisabled()
    {
        $parent = $this->getBuilder()->setDisabled(true)->getForm();
        $child = $this->getBuilder()->setDisabled(false)->getForm();

        $child->setParent($parent);

        $this->assertTrue($child->isDisabled());
    }

    public function testDisabled()
    {
        $parent = $this->getBuilder()->setDisabled(false)->getForm();
        $child = $this->getBuilder()->setDisabled(true)->getForm();

        $child->setParent($parent);

        $this->assertTrue($child->isDisabled());
    }

    public function testNotDisabled()
    {
        $parent = $this->getBuilder()->setDisabled(false)->getForm();
        $child = $this->getBuilder()->setDisabled(false)->getForm();

        $child->setParent($parent);

        $this->assertFalse($child->isDisabled());
    }

    public function testGetRootReturnsRootOfParent()
    {
        $parent = $this->getMockForm();
        $parent->expects($this->once())
            ->method('getRoot')
            ->will($this->returnValue('ROOT'));

        $this->form->setParent($parent);

        $this->assertEquals('ROOT', $this->form->getRoot());
    }

    public function testGetRootReturnsSelfIfNoParent()
    {
        $this->assertSame($this->form, $this->form->getRoot());
    }

    public function testEmptyIfEmptyArray()
    {
        $this->form->setData(array());

        $this->assertTrue($this->form->isEmpty());
    }

    public function testEmptyIfEmptyCountable()
    {
        $this->form = new Form(new FormConfigBuilder('name', __NAMESPACE__.'\SimpleFormTest_Countable', $this->dispatcher));

        $this->form->setData(new SimpleFormTest_Countable(0));

        $this->assertTrue($this->form->isEmpty());
    }

    public function testNotEmptyIfFilledCountable()
    {
        $this->form = new Form(new FormConfigBuilder('name', __NAMESPACE__.'\SimpleFormTest_Countable', $this->dispatcher));

        $this->form->setData(new SimpleFormTest_Countable(1));

        $this->assertFalse($this->form->isEmpty());
    }

    public function testEmptyIfEmptyTraversable()
    {
        $this->form = new Form(new FormConfigBuilder('name', __NAMESPACE__.'\SimpleFormTest_Traversable', $this->dispatcher));

        $this->form->setData(new SimpleFormTest_Traversable(0));

        $this->assertTrue($this->form->isEmpty());
    }

    public function testNotEmptyIfFilledTraversable()
    {
        $this->form = new Form(new FormConfigBuilder('name', __NAMESPACE__.'\SimpleFormTest_Traversable', $this->dispatcher));

        $this->form->setData(new SimpleFormTest_Traversable(1));

        $this->assertFalse($this->form->isEmpty());
    }

    public function testEmptyIfNull()
    {
        $this->form->setData(null);

        $this->assertTrue($this->form->isEmpty());
    }

    public function testEmptyIfEmptyString()
    {
        $this->form->setData('');

        $this->assertTrue($this->form->isEmpty());
    }

    public function testNotEmptyIfText()
    {
        $this->form->setData('foobar');

        $this->assertFalse($this->form->isEmpty());
    }

    public function testValidIfSubmitted()
    {
        $form = $this->getBuilder()->getForm();
        $form->submit('foobar');

        $this->assertTrue($form->isValid());
    }

    public function testValidIfSubmittedAndDisabled()
    {
        $form = $this->getBuilder()->setDisabled(true)->getForm();
        $form->submit('foobar');

        $this->assertTrue($form->isValid());
    }

    public function testNotValidIfNotSubmitted()
    {
        $this->assertFalse($this->form->isValid());
    }

    public function testNotValidIfErrors()
    {
        $form = $this->getBuilder()->getForm();
        $form->submit('foobar');
        $form->addError(new FormError('Error!'));

        $this->assertFalse($form->isValid());
    }

    public function testHasErrors()
    {
        $this->form->addError(new FormError('Error!'));

        $this->assertCount(1, $this->form->getErrors());
    }

    public function testHasNoErrors()
    {
        $this->assertCount(0, $this->form->getErrors());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\AlreadySubmittedException
     */
    public function testSetParentThrowsExceptionIfAlreadySubmitted()
    {
        $this->form->submit(array());
        $this->form->setParent($this->getBuilder('parent')->getForm());
    }

    public function testSubmitted()
    {
        $form = $this->getBuilder()->getForm();
        $form->submit('foobar');

        $this->assertTrue($form->isSubmitted());
    }

    public function testNotSubmitted()
    {
        $this->assertFalse($this->form->isSubmitted());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\AlreadySubmittedException
     */
    public function testSetDataThrowsExceptionIfAlreadySubmitted()
    {
        $this->form->submit(array());
        $this->form->setData(null);
    }

    public function testSetDataClonesObjectIfNotByReference()
    {
        $data = new \stdClass();
        $form = $this->getBuilder('name', null, '\stdClass')->setByReference(false)->getForm();
        $form->setData($data);

        $this->assertNotSame($data, $form->getData());
        $this->assertEquals($data, $form->getData());
    }

    public function testSetDataDoesNotCloneObjectIfByReference()
    {
        $data = new \stdClass();
        $form = $this->getBuilder('name', null, '\stdClass')->setByReference(true)->getForm();
        $form->setData($data);

        $this->assertSame($data, $form->getData());
    }

    public function testSetDataExecutesTransformationChain()
    {
        // use real event dispatcher now
        $form = $this->getBuilder('name', new EventDispatcher())
            ->addEventSubscriber(new FixedFilterListener(array(
                'preSetData' => array(
                    'app' => 'filtered',
                ),
            )))
            ->addModelTransformer(new FixedDataTransformer(array(
                '' => '',
                'filtered' => 'norm',
            )))
            ->addViewTransformer(new FixedDataTransformer(array(
                '' => '',
                'norm' => 'client',
            )))
            ->getForm();

        $form->setData('app');

        $this->assertEquals('filtered', $form->getData());
        $this->assertEquals('norm', $form->getNormData());
        $this->assertEquals('client', $form->getViewData());
    }

    public function testSetDataExecutesViewTransformersInOrder()
    {
        $form = $this->getBuilder()
            ->addViewTransformer(new FixedDataTransformer(array(
                '' => '',
                'first' => 'second',
            )))
            ->addViewTransformer(new FixedDataTransformer(array(
                '' => '',
                'second' => 'third',
            )))
            ->getForm();

        $form->setData('first');

        $this->assertEquals('third', $form->getViewData());
    }

    public function testSetDataExecutesModelTransformersInReverseOrder()
    {
        $form = $this->getBuilder()
            ->addModelTransformer(new FixedDataTransformer(array(
                '' => '',
                'second' => 'third',
            )))
            ->addModelTransformer(new FixedDataTransformer(array(
                '' => '',
                'first' => 'second',
            )))
            ->getForm();

        $form->setData('first');

        $this->assertEquals('third', $form->getNormData());
    }

    /*
     * When there is no data transformer, the data must have the same format
     * in all three representations
     */
    public function testSetDataConvertsScalarToStringIfNoTransformer()
    {
        $form = $this->getBuilder()->getForm();

        $form->setData(1);

        $this->assertSame('1', $form->getData());
        $this->assertSame('1', $form->getNormData());
        $this->assertSame('1', $form->getViewData());
    }

    /*
     * Data in client format should, if possible, always be a string to
     * facilitate differentiation between '0' and ''
     */
    public function testSetDataConvertsScalarToStringIfOnlyModelTransformer()
    {
        $form = $this->getBuilder()
            ->addModelTransformer(new FixedDataTransformer(array(
            '' => '',
            1 => 23,
        )))
            ->getForm();

        $form->setData(1);

        $this->assertSame(1, $form->getData());
        $this->assertSame(23, $form->getNormData());
        $this->assertSame('23', $form->getViewData());
    }

    /*
     * NULL remains NULL in app and norm format to remove the need to treat
     * empty values and NULL explicitly in the application
     */
    public function testSetDataConvertsNullToStringIfNoTransformer()
    {
        $form = $this->getBuilder()->getForm();

        $form->setData(null);

        $this->assertNull($form->getData());
        $this->assertNull($form->getNormData());
        $this->assertSame('', $form->getViewData());
    }

    public function testSetDataIsIgnoredIfDataIsLocked()
    {
        $form = $this->getBuilder()
            ->setData('default')
            ->setDataLocked(true)
            ->getForm();

        $form->setData('foobar');

        $this->assertSame('default', $form->getData());
    }

    public function testSubmitConvertsEmptyToNullIfNoTransformer()
    {
        $form = $this->getBuilder()->getForm();

        $form->submit('');

        $this->assertNull($form->getData());
        $this->assertNull($form->getNormData());
        $this->assertSame('', $form->getViewData());
    }

    public function testSubmitExecutesTransformationChain()
    {
        // use real event dispatcher now
        $form = $this->getBuilder('name', new EventDispatcher())
            ->addEventSubscriber(new FixedFilterListener(array(
                'preSubmit' => array(
                    'client' => 'filteredclient',
                ),
                'onSubmit' => array(
                    'norm' => 'filterednorm',
                ),
            )))
            ->addViewTransformer(new FixedDataTransformer(array(
                '' => '',
                // direction is reversed!
                'norm' => 'filteredclient',
                'filterednorm' => 'cleanedclient'
            )))
            ->addModelTransformer(new FixedDataTransformer(array(
                '' => '',
                // direction is reversed!
                'app' => 'filterednorm',
            )))
            ->getForm();

        $form->submit('client');

        $this->assertEquals('app', $form->getData());
        $this->assertEquals('filterednorm', $form->getNormData());
        $this->assertEquals('cleanedclient', $form->getViewData());
    }

    public function testSubmitExecutesViewTransformersInReverseOrder()
    {
        $form = $this->getBuilder()
            ->addViewTransformer(new FixedDataTransformer(array(
                '' => '',
                'third' => 'second',
            )))
            ->addViewTransformer(new FixedDataTransformer(array(
                '' => '',
                'second' => 'first',
            )))
            ->getForm();

        $form->submit('first');

        $this->assertEquals('third', $form->getNormData());
    }

    public function testSubmitExecutesModelTransformersInOrder()
    {
        $form = $this->getBuilder()
            ->addModelTransformer(new FixedDataTransformer(array(
                '' => '',
                'second' => 'first',
            )))
            ->addModelTransformer(new FixedDataTransformer(array(
                '' => '',
                'third' => 'second',
            )))
            ->getForm();

        $form->submit('first');

        $this->assertEquals('third', $form->getData());
    }

    public function testSynchronizedByDefault()
    {
        $this->assertTrue($this->form->isSynchronized());
    }

    public function testSynchronizedAfterSubmission()
    {
        $this->form->submit('foobar');

        $this->assertTrue($this->form->isSynchronized());
    }

    public function testNotSynchronizedIfViewReverseTransformationFailed()
    {
        $transformer = $this->getDataTransformer();
        $transformer->expects($this->once())
            ->method('reverseTransform')
            ->will($this->throwException(new TransformationFailedException()));

        $form = $this->getBuilder()
            ->addViewTransformer($transformer)
            ->getForm();

        $form->submit('foobar');

        $this->assertFalse($form->isSynchronized());
    }

    public function testNotSynchronizedIfModelReverseTransformationFailed()
    {
        $transformer = $this->getDataTransformer();
        $transformer->expects($this->once())
            ->method('reverseTransform')
            ->will($this->throwException(new TransformationFailedException()));

        $form = $this->getBuilder()
            ->addModelTransformer($transformer)
            ->getForm();

        $form->submit('foobar');

        $this->assertFalse($form->isSynchronized());
    }

    public function testEmptyDataCreatedBeforeTransforming()
    {
        $form = $this->getBuilder()
            ->setEmptyData('foo')
            ->addViewTransformer(new FixedDataTransformer(array(
            '' => '',
            // direction is reversed!
            'bar' => 'foo',
        )))
            ->getForm();

        $form->submit('');

        $this->assertEquals('bar', $form->getData());
    }

    public function testEmptyDataFromClosure()
    {
        $test = $this;
        $form = $this->getBuilder()
            ->setEmptyData(function ($form) use ($test) {
            // the form instance is passed to the closure to allow use
            // of form data when creating the empty value
            $test->assertInstanceOf('Symfony\Component\Form\FormInterface', $form);

            return 'foo';
        })
            ->addViewTransformer(new FixedDataTransformer(array(
            '' => '',
            // direction is reversed!
            'bar' => 'foo',
        )))
            ->getForm();

        $form->submit('');

        $this->assertEquals('bar', $form->getData());
    }

    public function testSubmitResetsErrors()
    {
        $this->form->addError(new FormError('Error!'));
        $this->form->submit('foobar');

        $this->assertSame(array(), $this->form->getErrors());
    }

    public function testCreateView()
    {
        $type = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
        $view = $this->getMock('Symfony\Component\Form\FormView');
        $form = $this->getBuilder()->setType($type)->getForm();

        $type->expects($this->once())
            ->method('createView')
            ->with($form)
            ->will($this->returnValue($view));

        $this->assertSame($view, $form->createView());
    }

    public function testCreateViewWithParent()
    {
        $type = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
        $view = $this->getMock('Symfony\Component\Form\FormView');
        $parentForm = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $parentView = $this->getMock('Symfony\Component\Form\FormView');
        $form = $this->getBuilder()->setType($type)->getForm();
        $form->setParent($parentForm);

        $parentForm->expects($this->once())
            ->method('createView')
            ->will($this->returnValue($parentView));

        $type->expects($this->once())
            ->method('createView')
            ->with($form, $parentView)
            ->will($this->returnValue($view));

        $this->assertSame($view, $form->createView());
    }

    public function testCreateViewWithExplicitParent()
    {
        $type = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
        $view = $this->getMock('Symfony\Component\Form\FormView');
        $parentView = $this->getMock('Symfony\Component\Form\FormView');
        $form = $this->getBuilder()->setType($type)->getForm();

        $type->expects($this->once())
            ->method('createView')
            ->with($form, $parentView)
            ->will($this->returnValue($view));

        $this->assertSame($view, $form->createView($parentView));
    }

    public function testGetErrorsAsString()
    {
        $this->form->addError(new FormError('Error!'));

        $this->assertEquals("ERROR: Error!\n", $this->form->getErrorsAsString());
    }

    public function testFormCanHaveEmptyName()
    {
        $form = $this->getBuilder('')->getForm();

        $this->assertEquals('', $form->getName());
    }

    public function testSetNullParentWorksWithEmptyName()
    {
        $form = $this->getBuilder('')->getForm();
        $form->setParent(null);

        $this->assertNull($form->getParent());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\LogicException
     * @expectedExceptionMessage A form with an empty name cannot have a parent form.
     */
    public function testFormCannotHaveEmptyNameNotInRootLevel()
    {
        $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->add($this->getBuilder(''))
            ->getForm();
    }

    public function testGetPropertyPathReturnsConfiguredPath()
    {
        $form = $this->getBuilder()->setPropertyPath('address.street')->getForm();

        $this->assertEquals(new PropertyPath('address.street'), $form->getPropertyPath());
    }

    // see https://github.com/symfony/symfony/issues/3903
    public function testGetPropertyPathDefaultsToNameIfParentHasDataClass()
    {
        $parent = $this->getBuilder(null, null, 'stdClass')
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $form = $this->getBuilder('name')->getForm();
        $parent->add($form);

        $this->assertEquals(new PropertyPath('name'), $form->getPropertyPath());
    }

    // see https://github.com/symfony/symfony/issues/3903
    public function testGetPropertyPathDefaultsToIndexedNameIfParentDataClassIsNull()
    {
        $parent = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $form = $this->getBuilder('name')->getForm();
        $parent->add($form);

        $this->assertEquals(new PropertyPath('[name]'), $form->getPropertyPath());
    }

    public function testGetPropertyPathDefaultsToNameIfFirstParentWithoutInheritDataHasDataClass()
    {
        $grandParent = $this->getBuilder(null, null, 'stdClass')
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $parent = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->setInheritData(true)
            ->getForm();
        $form = $this->getBuilder('name')->getForm();
        $grandParent->add($parent);
        $parent->add($form);

        $this->assertEquals(new PropertyPath('name'), $form->getPropertyPath());
    }

    public function testGetPropertyPathDefaultsToIndexedNameIfDataClassOfFirstParentWithoutInheritDataIsNull()
    {
        $grandParent = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
        $parent = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->setInheritData(true)
            ->getForm();
        $form = $this->getBuilder('name')->getForm();
        $grandParent->add($parent);
        $parent->add($form);

        $this->assertEquals(new PropertyPath('[name]'), $form->getPropertyPath());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\LogicException
     */
    public function testViewDataMustNotBeObjectIfDataClassIsNull()
    {
        $config = new FormConfigBuilder('name', null, $this->dispatcher);
        $config->addViewTransformer(new FixedDataTransformer(array(
            '' => '',
            'foo' => new \stdClass(),
        )));
        $form = new Form($config);

        $form->setData('foo');
    }

    public function testViewDataMayBeArrayAccessIfDataClassIsNull()
    {
        $arrayAccess = $this->getMock('\ArrayAccess');
        $config = new FormConfigBuilder('name', null, $this->dispatcher);
        $config->addViewTransformer(new FixedDataTransformer(array(
            '' => '',
            'foo' => $arrayAccess,
        )));
        $form = new Form($config);

        $form->setData('foo');

        $this->assertSame($arrayAccess, $form->getViewData());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\LogicException
     */
    public function testViewDataMustBeObjectIfDataClassIsSet()
    {
        $config = new FormConfigBuilder('name', 'stdClass', $this->dispatcher);
        $config->addViewTransformer(new FixedDataTransformer(array(
            '' => '',
            'foo' => array('bar' => 'baz'),
        )));
        $form = new Form($config);

        $form->setData('foo');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\RuntimeException
     */
    public function testSetDataCannotInvokeItself()
    {
        // Cycle detection to prevent endless loops
        $config = new FormConfigBuilder('name', 'stdClass', $this->dispatcher);
        $config->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
            $event->getForm()->setData('bar');
        });
        $form = new Form($config);

        $form->setData('foo');
    }

    public function testSubmittingWrongDataIsIgnored()
    {
        $test = $this;

        $child = $this->getBuilder('child', $this->dispatcher);
        $child->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($test) {
            // child form doesn't receive the wrong data that is submitted on parent
            $test->assertNull($event->getData());
        });

        $parent = $this->getBuilder('parent', new EventDispatcher())
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->add($child)
            ->getForm();

        $parent->submit('not-an-array');
    }

    public function testHandleRequestForwardsToRequestHandler()
    {
        $handler = $this->getMock('Symfony\Component\Form\RequestHandlerInterface');

        $form = $this->getBuilder()
            ->setRequestHandler($handler)
            ->getForm();

        $handler->expects($this->once())
            ->method('handleRequest')
            ->with($this->identicalTo($form), 'REQUEST');

        $this->assertSame($form, $form->handleRequest('REQUEST'));
    }

    public function testFormInheritsParentData()
    {
        $child = $this->getBuilder('child')
            ->setInheritData(true);

        $parent = $this->getBuilder('parent')
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->setData('foo')
            ->addModelTransformer(new FixedDataTransformer(array(
                'foo' => 'norm[foo]',
            )))
            ->addViewTransformer(new FixedDataTransformer(array(
                'norm[foo]' => 'view[foo]',
            )))
            ->add($child)
            ->getForm();

        $this->assertSame('foo', $parent->get('child')->getData());
        $this->assertSame('norm[foo]', $parent->get('child')->getNormData());
        $this->assertSame('view[foo]', $parent->get('child')->getViewData());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\RuntimeException
     */
    public function testInheritDataDisallowsSetData()
    {
        $form = $this->getBuilder()
            ->setInheritData(true)
            ->getForm();

        $form->setData('foo');
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\RuntimeException
     */
    public function testGetDataRequiresParentToBeSetIfInheritData()
    {
        $form = $this->getBuilder()
            ->setInheritData(true)
            ->getForm();

        $form->getData();
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\RuntimeException
     */
    public function testGetNormDataRequiresParentToBeSetIfInheritData()
    {
        $form = $this->getBuilder()
            ->setInheritData(true)
            ->getForm();

        $form->getNormData();
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\RuntimeException
     */
    public function testGetViewDataRequiresParentToBeSetIfInheritData()
    {
        $form = $this->getBuilder()
            ->setInheritData(true)
            ->getForm();

        $form->getViewData();
    }

    public function testPostSubmitDataIsNullIfInheritData()
    {
        $test = $this;
        $form = $this->getBuilder()
            ->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($test) {
                $test->assertNull($event->getData());
            })
            ->setInheritData(true)
            ->getForm();

        $form->submit('foo');
    }

    public function testSubmitIsNeverFiredIfInheritData()
    {
        $test = $this;
        $form = $this->getBuilder()
            ->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) use ($test) {
                $test->fail('The SUBMIT event should not be fired');
            })
            ->setInheritData(true)
            ->getForm();

        $form->submit('foo');
    }

    public function testInitializeSetsDefaultData()
    {
        $config = $this->getBuilder()->setData('DEFAULT')->getFormConfig();
        $form = $this->getMock('Symfony\Component\Form\Form', array('setData'), array($config));

        $form->expects($this->once())
            ->method('setData')
            ->with($this->identicalTo('DEFAULT'));

        /* @var Form $form */
        $form->initialize();
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\RuntimeException
     */
    public function testInitializeFailsIfParent()
    {
        $parent = $this->getBuilder()->setRequired(false)->getForm();
        $child = $this->getBuilder()->setRequired(true)->getForm();

        $child->setParent($parent);

        $child->initialize();
    }

    protected function createForm()
    {
        return $this->getBuilder()->getForm();
    }
}
PK�b�\�>)�bbJpear/test/Form/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \Symfony\Component\Form\RequestHandlerInterface
     */
    protected $requestHandler;

    protected $request;

    protected function setUp()
    {
        $this->requestHandler = $this->getRequestHandler();
        $this->request = null;
    }

    public function methodExceptGetProvider()
    {
        return array(
            array('POST'),
            array('PUT'),
            array('DELETE'),
            array('PATCH'),
        );
    }

    public function methodProvider()
    {
        return array_merge(array(
            array('GET'),
        ), $this->methodExceptGetProvider());
    }

    /**
     * @dataProvider methodProvider
     */
    public function testSubmitIfNameInRequest($method)
    {
        $form = $this->getMockForm('param1', $method);

        $this->setRequestData($method, array(
            'param1' => 'DATA',
        ));

        $form->expects($this->once())
            ->method('submit')
            ->with('DATA', 'PATCH' !== $method);

        $this->requestHandler->handleRequest($form, $this->request);
    }

    /**
     * @dataProvider methodProvider
     */
    public function testDoNotSubmitIfWrongRequestMethod($method)
    {
        $form = $this->getMockForm('param1', $method);

        $otherMethod = 'POST' === $method ? 'PUT' : 'POST';

        $this->setRequestData($otherMethod, array(
            'param1' => 'DATA',
        ));

        $form->expects($this->never())
            ->method('submit');

        $this->requestHandler->handleRequest($form, $this->request);
    }

    /**
     * @dataProvider methodExceptGetProvider
     */
    public function testDoNoSubmitSimpleFormIfNameNotInRequestAndNotGetRequest($method)
    {
        $form = $this->getMockForm('param1', $method, false);

        $this->setRequestData($method, array(
            'paramx' => array(),
        ));

        $form->expects($this->never())
            ->method('submit');

        $this->requestHandler->handleRequest($form, $this->request);
    }

    /**
     * @dataProvider methodExceptGetProvider
     */
    public function testDoNotSubmitCompoundFormIfNameNotInRequestAndNotGetRequest($method)
    {
        $form = $this->getMockForm('param1', $method, true);

        $this->setRequestData($method, array(
            'paramx' => array(),
        ));

        $form->expects($this->never())
            ->method('submit');

        $this->requestHandler->handleRequest($form, $this->request);
    }

    public function testDoNotSubmitIfNameNotInRequestAndGetRequest()
    {
        $form = $this->getMockForm('param1', 'GET');

        $this->setRequestData('GET', array(
            'paramx' => array(),
        ));

        $form->expects($this->never())
            ->method('submit');

        $this->requestHandler->handleRequest($form, $this->request);
    }

    /**
     * @dataProvider methodProvider
     */
    public function testSubmitFormWithEmptyNameIfAtLeastOneFieldInRequest($method)
    {
        $form = $this->getMockForm('', $method);
        $form->expects($this->any())
            ->method('all')
            ->will($this->returnValue(array(
                'param1' => $this->getMockForm('param1'),
                'param2' => $this->getMockForm('param2'),
            )));

        $this->setRequestData($method, $requestData = array(
            'param1' => 'submitted value',
            'paramx' => 'submitted value',
        ));

        $form->expects($this->once())
            ->method('submit')
            ->with($requestData, 'PATCH' !== $method);

        $this->requestHandler->handleRequest($form, $this->request);
    }

    /**
     * @dataProvider methodProvider
     */
    public function testDoNotSubmitFormWithEmptyNameIfNoFieldInRequest($method)
    {
        $form = $this->getMockForm('', $method);
        $form->expects($this->any())
            ->method('all')
            ->will($this->returnValue(array(
                'param1' => $this->getMockForm('param1'),
                'param2' => $this->getMockForm('param2'),
            )));

        $this->setRequestData($method, array(
            'paramx' => 'submitted value',
        ));

        $form->expects($this->never())
            ->method('submit');

        $this->requestHandler->handleRequest($form, $this->request);
    }

    /**
     * @dataProvider methodExceptGetProvider
     */
    public function testMergeParamsAndFiles($method)
    {
        $form = $this->getMockForm('param1', $method);
        $file = $this->getMockFile();

        $this->setRequestData($method, array(
            'param1' => array(
                'field1' => 'DATA',
            ),
        ), array(
            'param1' => array(
                'field2' => $file,
            ),
        ));

        $form->expects($this->once())
            ->method('submit')
            ->with(array(
                'field1' => 'DATA',
                'field2' => $file,
            ), 'PATCH' !== $method);

        $this->requestHandler->handleRequest($form, $this->request);
    }

    /**
     * @dataProvider methodExceptGetProvider
     */
    public function testParamTakesPrecedenceOverFile($method)
    {
        $form = $this->getMockForm('param1', $method);
        $file = $this->getMockFile();

        $this->setRequestData($method, array(
            'param1' => 'DATA',
        ), array(
            'param1' => $file,
        ));

        $form->expects($this->once())
            ->method('submit')
            ->with('DATA', 'PATCH' !== $method);

        $this->requestHandler->handleRequest($form, $this->request);
    }

    /**
     * @dataProvider methodExceptGetProvider
     */
    public function testSubmitFileIfNoParam($method)
    {
        $form = $this->getMockForm('param1', $method);
        $file = $this->getMockFile();

        $this->setRequestData($method, array(
            'param1' => null,
        ), array(
            'param1' => $file,
        ));

        $form->expects($this->once())
            ->method('submit')
            ->with($file, 'PATCH' !== $method);

        $this->requestHandler->handleRequest($form, $this->request);
    }

    abstract protected function setRequestData($method, $data, $files = array());

    abstract protected function getRequestHandler();

    abstract protected function getMockFile();

    protected function getMockForm($name, $method = null, $compound = true)
    {
        $config = $this->getMock('Symfony\Component\Form\FormConfigInterface');
        $config->expects($this->any())
            ->method('getMethod')
            ->will($this->returnValue($method));
        $config->expects($this->any())
            ->method('getCompound')
            ->will($this->returnValue($compound));

        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $form->expects($this->any())
            ->method('getName')
            ->will($this->returnValue($name));
        $form->expects($this->any())
            ->method('getConfig')
            ->will($this->returnValue($config));

        return $form;
    }
}
PK�b�\�����?pear/test/Form/Symfony/Component/Form/Tests/FormBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\FormBuilder;

class FormBuilderTest extends \PHPUnit_Framework_TestCase
{
    private $dispatcher;

    private $factory;

    private $builder;

    protected function setUp()
    {
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
        $this->builder = new FormBuilder('name', null, $this->dispatcher, $this->factory);
    }

    protected function tearDown()
    {
        $this->dispatcher = null;
        $this->factory = null;
        $this->builder = null;
    }

    /**
     * Changing the name is not allowed, otherwise the name and property path
     * are not synchronized anymore
     *
     * @see FormType::buildForm
     */
    public function testNoSetName()
    {
        $this->assertFalse(method_exists($this->builder, 'setName'));
    }

    public function testAddNameNoStringAndNoInteger()
    {
        $this->setExpectedException('Symfony\Component\Form\Exception\UnexpectedTypeException');
        $this->builder->add(true);
    }

    public function testAddTypeNoString()
    {
        $this->setExpectedException('Symfony\Component\Form\Exception\UnexpectedTypeException');
        $this->builder->add('foo', 1234);
    }

    public function testAddWithGuessFluent()
    {
        $this->builder = new FormBuilder('name', 'stdClass', $this->dispatcher, $this->factory);
        $builder = $this->builder->add('foo');
        $this->assertSame($builder, $this->builder);
    }

    public function testAddIsFluent()
    {
        $builder = $this->builder->add('foo', 'text', array('bar' => 'baz'));
        $this->assertSame($builder, $this->builder);
    }

    public function testAdd()
    {
        $this->assertFalse($this->builder->has('foo'));
        $this->builder->add('foo', 'text');
        $this->assertTrue($this->builder->has('foo'));
    }

    public function testAddIntegerName()
    {
        $this->assertFalse($this->builder->has(0));
        $this->builder->add(0, 'text');
        $this->assertTrue($this->builder->has(0));
    }

    public function testAll()
    {
        $this->factory->expects($this->once())
            ->method('createNamedBuilder')
            ->with('foo', 'text')
            ->will($this->returnValue(new FormBuilder('foo', null, $this->dispatcher, $this->factory)));

        $this->assertCount(0, $this->builder->all());
        $this->assertFalse($this->builder->has('foo'));

        $this->builder->add('foo', 'text');
        $children = $this->builder->all();

        $this->assertTrue($this->builder->has('foo'));
        $this->assertCount(1, $children);
        $this->assertArrayHasKey('foo', $children);
    }

    /*
     * https://github.com/symfony/symfony/issues/4693
     */
    public function testMaintainOrderOfLazyAndExplicitChildren()
    {
        $this->builder->add('foo', 'text');
        $this->builder->add($this->getFormBuilder('bar'));
        $this->builder->add('baz', 'text');

        $children = $this->builder->all();

        $this->assertSame(array('foo', 'bar', 'baz'), array_keys($children));
    }

    public function testAddFormType()
    {
        $this->assertFalse($this->builder->has('foo'));
        $this->builder->add('foo', $this->getMock('Symfony\Component\Form\FormTypeInterface'));
        $this->assertTrue($this->builder->has('foo'));
    }

    public function testRemove()
    {
        $this->builder->add('foo', 'text');
        $this->builder->remove('foo');
        $this->assertFalse($this->builder->has('foo'));
    }

    public function testRemoveUnknown()
    {
        $this->builder->remove('foo');
        $this->assertFalse($this->builder->has('foo'));
    }

    // https://github.com/symfony/symfony/pull/4826
    public function testRemoveAndGetForm()
    {
        $this->builder->add('foo', 'text');
        $this->builder->remove('foo');
        $form = $this->builder->getForm();
        $this->assertInstanceOf('Symfony\Component\Form\Form', $form);
    }

    public function testCreateNoTypeNo()
    {
        $this->factory->expects($this->once())
            ->method('createNamedBuilder')
            ->with('foo', 'text', null, array())
        ;

        $this->builder->create('foo');
    }

    public function testGetUnknown()
    {
        $this->setExpectedException('Symfony\Component\Form\Exception\InvalidArgumentException', 'The child with the name "foo" does not exist.');
        $this->builder->get('foo');
    }

    public function testGetExplicitType()
    {
        $expectedType = 'text';
        $expectedName = 'foo';
        $expectedOptions = array('bar' => 'baz');

        $this->factory->expects($this->once())
            ->method('createNamedBuilder')
            ->with($expectedName, $expectedType, null, $expectedOptions)
            ->will($this->returnValue($this->getFormBuilder()));

        $this->builder->add($expectedName, $expectedType, $expectedOptions);
        $builder = $this->builder->get($expectedName);

        $this->assertNotSame($builder, $this->builder);
    }

    public function testGetGuessedType()
    {
        $expectedName = 'foo';
        $expectedOptions = array('bar' => 'baz');

        $this->factory->expects($this->once())
            ->method('createBuilderForProperty')
            ->with('stdClass', $expectedName, null, $expectedOptions)
            ->will($this->returnValue($this->getFormBuilder()));

        $this->builder = new FormBuilder('name', 'stdClass', $this->dispatcher, $this->factory);
        $this->builder->add($expectedName, null, $expectedOptions);
        $builder = $this->builder->get($expectedName);

        $this->assertNotSame($builder, $this->builder);
    }

    public function testGetFormConfigErasesReferences()
    {
        $builder = new FormBuilder('name', null, $this->dispatcher, $this->factory);
        $builder->add(new FormBuilder('child', null, $this->dispatcher, $this->factory));

        $config = $builder->getFormConfig();
        $reflClass = new \ReflectionClass($config);
        $children = $reflClass->getProperty('children');
        $unresolvedChildren = $reflClass->getProperty('unresolvedChildren');

        $children->setAccessible(true);
        $unresolvedChildren->setAccessible(true);

        $this->assertEmpty($children->getValue($config));
        $this->assertEmpty($unresolvedChildren->getValue($config));
    }

    private function getFormBuilder($name = 'name')
    {
        $mock = $this->getMockBuilder('Symfony\Component\Form\FormBuilder')
            ->disableOriginalConstructor()
            ->getMock();

        $mock->expects($this->any())
            ->method('getName')
            ->will($this->returnValue($name));

        return $mock;
    }
}
PK�b�\�z�nznz@pear/test/Form/Symfony/Component/Form/Tests/CompoundFormTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper;
use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationRequestHandler;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\Forms;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\SubmitButtonBuilder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Form\Tests\Fixtures\FixedDataTransformer;

class CompoundFormTest extends AbstractFormTest
{
    public function testValidIfAllChildrenAreValid()
    {
        $this->form->add($this->getBuilder('firstName')->getForm());
        $this->form->add($this->getBuilder('lastName')->getForm());

        $this->form->submit(array(
            'firstName' => 'Bernhard',
            'lastName' => 'Schussek',
        ));

        $this->assertTrue($this->form->isValid());
    }

    public function testInvalidIfChildIsInvalid()
    {
        $this->form->add($this->getBuilder('firstName')->getForm());
        $this->form->add($this->getBuilder('lastName')->getForm());

        $this->form->submit(array(
            'firstName' => 'Bernhard',
            'lastName' => 'Schussek',
        ));

        $this->form->get('lastName')->addError(new FormError('Invalid'));

        $this->assertFalse($this->form->isValid());
    }

    public function testValidIfChildIsNotSubmitted()
    {
        $this->form->add($this->getBuilder('firstName')->getForm());
        $this->form->add($this->getBuilder('lastName')->getForm());

        $this->form->submit(array(
            'firstName' => 'Bernhard',
        ));

        // "lastName" is not "valid" because it was not submitted. This happens
        // for example in PATCH requests. The parent form should still be
        // considered valid.

        $this->assertTrue($this->form->isValid());
    }

    public function testDisabledFormsValidEvenIfChildrenInvalid()
    {
        $form = $this->getBuilder('person')
            ->setDisabled(true)
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->add($this->getBuilder('name'))
            ->getForm();

        $form->submit(array('name' => 'Jacques Doe'));

        $form->get('name')->addError(new FormError('Invalid'));

        $this->assertTrue($form->isValid());
    }

    public function testSubmitForwardsNullIfNotClearMissingButValueIsExplicitlyNull()
    {
        $child = $this->getMockForm('firstName');

        $this->form->add($child);

        $child->expects($this->once())
            ->method('submit')
            ->with($this->equalTo(null));

        $this->form->submit(array('firstName' => null), false);
    }

    public function testSubmitForwardsNullIfValueIsMissing()
    {
        $child = $this->getMockForm('firstName');

        $this->form->add($child);

        $child->expects($this->once())
            ->method('submit')
            ->with($this->equalTo(null));

        $this->form->submit(array());
    }

    public function testSubmitDoesNotForwardNullIfNotClearMissing()
    {
        $child = $this->getMockForm('firstName');

        $this->form->add($child);

        $child->expects($this->never())
            ->method('submit');

        $this->form->submit(array(), false);
    }

    public function testSubmitDoesNotAddExtraFieldForNullValues()
    {
        $factory = Forms::createFormFactoryBuilder()
            ->getFormFactory();

        $child = $factory->create('file', null, array('auto_initialize' => false));

        $this->form->add($child);
        $this->form->submit(array('file' => null), false);

        $this->assertCount(0, $this->form->getExtraData());
    }

    public function testClearMissingFlagIsForwarded()
    {
        $child = $this->getMockForm('firstName');

        $this->form->add($child);

        $child->expects($this->once())
            ->method('submit')
            ->with($this->equalTo('foo'), false);

        $this->form->submit(array('firstName' => 'foo'), false);
    }

    public function testCloneChildren()
    {
        $child = $this->getBuilder('child')->getForm();
        $this->form->add($child);

        $clone = clone $this->form;

        $this->assertNotSame($this->form, $clone);
        $this->assertNotSame($child, $clone['child']);
        $this->assertNotSame($this->form['child'], $clone['child']);
    }

    public function testNotEmptyIfChildNotEmpty()
    {
        $child = $this->getMockForm();
        $child->expects($this->once())
            ->method('isEmpty')
            ->will($this->returnValue(false));

        $this->form->setData(null);
        $this->form->add($child);

        $this->assertFalse($this->form->isEmpty());
    }

    public function testAdd()
    {
        $child = $this->getBuilder('foo')->getForm();
        $this->form->add($child);

        $this->assertTrue($this->form->has('foo'));
        $this->assertSame($this->form, $child->getParent());
        $this->assertSame(array('foo' => $child), $this->form->all());
    }

    public function testAddUsingNameAndType()
    {
        $child = $this->getBuilder('foo')->getForm();

        $this->factory->expects($this->once())
            ->method('createNamed')
            ->with('foo', 'text', null, array(
                'bar' => 'baz',
                'auto_initialize' => false,
            ))
            ->will($this->returnValue($child));

        $this->form->add('foo', 'text', array('bar' => 'baz'));

        $this->assertTrue($this->form->has('foo'));
        $this->assertSame($this->form, $child->getParent());
        $this->assertSame(array('foo' => $child), $this->form->all());
    }

    public function testAddUsingIntegerNameAndType()
    {
        $child = $this->getBuilder(0)->getForm();

        $this->factory->expects($this->once())
            ->method('createNamed')
            ->with('0', 'text', null, array(
                'bar' => 'baz',
                'auto_initialize' => false,
            ))
            ->will($this->returnValue($child));

        // in order to make casting unnecessary
        $this->form->add(0, 'text', array('bar' => 'baz'));

        $this->assertTrue($this->form->has(0));
        $this->assertSame($this->form, $child->getParent());
        $this->assertSame(array(0 => $child), $this->form->all());
    }

    public function testAddUsingNameButNoType()
    {
        $this->form = $this->getBuilder('name', null, '\stdClass')
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();

        $child = $this->getBuilder('foo')->getForm();

        $this->factory->expects($this->once())
            ->method('createForProperty')
            ->with('\stdClass', 'foo')
            ->will($this->returnValue($child));

        $this->form->add('foo');

        $this->assertTrue($this->form->has('foo'));
        $this->assertSame($this->form, $child->getParent());
        $this->assertSame(array('foo' => $child), $this->form->all());
    }

    public function testAddUsingNameButNoTypeAndOptions()
    {
        $this->form = $this->getBuilder('name', null, '\stdClass')
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();

        $child = $this->getBuilder('foo')->getForm();

        $this->factory->expects($this->once())
            ->method('createForProperty')
            ->with('\stdClass', 'foo', null, array(
                'bar' => 'baz',
                'auto_initialize' => false,
            ))
            ->will($this->returnValue($child));

        $this->form->add('foo', null, array('bar' => 'baz'));

        $this->assertTrue($this->form->has('foo'));
        $this->assertSame($this->form, $child->getParent());
        $this->assertSame(array('foo' => $child), $this->form->all());
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\AlreadySubmittedException
     */
    public function testAddThrowsExceptionIfAlreadySubmitted()
    {
        $this->form->submit(array());
        $this->form->add($this->getBuilder('foo')->getForm());
    }

    public function testRemove()
    {
        $child = $this->getBuilder('foo')->getForm();
        $this->form->add($child);
        $this->form->remove('foo');

        $this->assertNull($child->getParent());
        $this->assertCount(0, $this->form);
    }

    /**
     * @expectedException \Symfony\Component\Form\Exception\AlreadySubmittedException
     */
    public function testRemoveThrowsExceptionIfAlreadySubmitted()
    {
        $this->form->add($this->getBuilder('foo')->setCompound(false)->getForm());
        $this->form->submit(array('foo' => 'bar'));
        $this->form->remove('foo');
    }

    public function testRemoveIgnoresUnknownName()
    {
        $this->form->remove('notexisting');
    }

    public function testArrayAccess()
    {
        $child = $this->getBuilder('foo')->getForm();

        $this->form[] = $child;

        $this->assertTrue(isset($this->form['foo']));
        $this->assertSame($child, $this->form['foo']);

        unset($this->form['foo']);

        $this->assertFalse(isset($this->form['foo']));
    }

    public function testCountable()
    {
        $this->form->add($this->getBuilder('foo')->getForm());
        $this->form->add($this->getBuilder('bar')->getForm());

        $this->assertCount(2, $this->form);
    }

    public function testIterator()
    {
        $this->form->add($this->getBuilder('foo')->getForm());
        $this->form->add($this->getBuilder('bar')->getForm());

        $this->assertSame($this->form->all(), iterator_to_array($this->form));
    }

    public function testAddMapsViewDataToFormIfInitialized()
    {
        $test = $this;
        $mapper = $this->getDataMapper();
        $form = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($mapper)
            ->addViewTransformer(new FixedDataTransformer(array(
                '' => '',
                'foo' => 'bar',
            )))
            ->setData('foo')
            ->getForm();

        $child = $this->getBuilder()->getForm();
        $mapper->expects($this->once())
            ->method('mapDataToForms')
            ->with('bar', $this->isInstanceOf('\RecursiveIteratorIterator'))
            ->will($this->returnCallback(function ($data, \RecursiveIteratorIterator $iterator) use ($child, $test) {
                $test->assertInstanceOf('Symfony\Component\Form\Util\InheritDataAwareIterator', $iterator->getInnerIterator());
                $test->assertSame(array($child), iterator_to_array($iterator));
            }));

        $form->initialize();
        $form->add($child);
    }

    public function testAddDoesNotMapViewDataToFormIfNotInitialized()
    {
        $mapper = $this->getDataMapper();
        $form = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($mapper)
            ->getForm();

        $child = $this->getBuilder()->getForm();
        $mapper->expects($this->never())
            ->method('mapDataToForms');

        $form->add($child);
    }

    public function testAddDoesNotMapViewDataToFormIfInheritData()
    {
        $mapper = $this->getDataMapper();
        $form = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($mapper)
            ->setInheritData(true)
            ->getForm();

        $child = $this->getBuilder()->getForm();
        $mapper->expects($this->never())
            ->method('mapDataToForms');

        $form->initialize();
        $form->add($child);
    }

    public function testSetDataSupportsDynamicAdditionAndRemovalOfChildren()
    {
        $form = $this->getBuilder()
            ->setCompound(true)
            // We test using PropertyPathMapper on purpose. The traversal logic
            // is currently contained in InheritDataAwareIterator, but even
            // if that changes, this test should still function.
            ->setDataMapper(new PropertyPathMapper())
            ->getForm();

        $child = $this->getMockForm('child');
        $childToBeRemoved = $this->getMockForm('removed');
        $childToBeAdded = $this->getMockForm('added');

        $form->add($child);
        $form->add($childToBeRemoved);

        $child->expects($this->once())
            ->method('setData')
            ->will($this->returnCallback(function () use ($form, $childToBeAdded) {
                $form->remove('removed');
                $form->add($childToBeAdded);
            }));

        $childToBeRemoved->expects($this->never())
            ->method('setData');

        // once when it it is created, once when it is added
        $childToBeAdded->expects($this->exactly(2))
            ->method('setData');

        // pass NULL to all children
        $form->setData(array());
    }

    public function testSetDataMapsViewDataToChildren()
    {
        $test = $this;
        $mapper = $this->getDataMapper();
        $form = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($mapper)
            ->addViewTransformer(new FixedDataTransformer(array(
                '' => '',
                'foo' => 'bar',
            )))
            ->getForm();

        $form->add($child1 = $this->getBuilder('firstName')->getForm());
        $form->add($child2 = $this->getBuilder('lastName')->getForm());

        $mapper->expects($this->once())
            ->method('mapDataToForms')
            ->with('bar', $this->isInstanceOf('\RecursiveIteratorIterator'))
            ->will($this->returnCallback(function ($data, \RecursiveIteratorIterator $iterator) use ($child1, $child2, $test) {
                $test->assertInstanceOf('Symfony\Component\Form\Util\InheritDataAwareIterator', $iterator->getInnerIterator());
                $test->assertSame(array('firstName' => $child1, 'lastName' => $child2), iterator_to_array($iterator));
            }));

        $form->setData('foo');
    }

    public function testSubmitSupportsDynamicAdditionAndRemovalOfChildren()
    {
        $child = $this->getMockForm('child');
        $childToBeRemoved = $this->getMockForm('removed');
        $childToBeAdded = $this->getMockForm('added');

        $this->form->add($child);
        $this->form->add($childToBeRemoved);

        $form = $this->form;

        $child->expects($this->once())
            ->method('submit')
            ->will($this->returnCallback(function () use ($form, $childToBeAdded) {
                $form->remove('removed');
                $form->add($childToBeAdded);
            }));

        $childToBeRemoved->expects($this->never())
            ->method('submit');

        $childToBeAdded->expects($this->once())
            ->method('submit');

        // pass NULL to all children
        $this->form->submit(array());
    }

    public function testSubmitMapsSubmittedChildrenOntoExistingViewData()
    {
        $test = $this;
        $mapper = $this->getDataMapper();
        $form = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($mapper)
            ->addViewTransformer(new FixedDataTransformer(array(
                '' => '',
                'foo' => 'bar',
            )))
            ->setData('foo')
            ->getForm();

        $form->add($child1 = $this->getBuilder('firstName')->setCompound(false)->getForm());
        $form->add($child2 = $this->getBuilder('lastName')->setCompound(false)->getForm());

        $mapper->expects($this->once())
            ->method('mapFormsToData')
            ->with($this->isInstanceOf('\RecursiveIteratorIterator'), 'bar')
            ->will($this->returnCallback(function (\RecursiveIteratorIterator $iterator) use ($child1, $child2, $test) {
                $test->assertInstanceOf('Symfony\Component\Form\Util\InheritDataAwareIterator', $iterator->getInnerIterator());
                $test->assertSame(array('firstName' => $child1, 'lastName' => $child2), iterator_to_array($iterator));
                $test->assertEquals('Bernhard', $child1->getData());
                $test->assertEquals('Schussek', $child2->getData());
            }));

        $form->submit(array(
            'firstName' => 'Bernhard',
            'lastName' => 'Schussek',
        ));
    }

    public function testMapFormsToDataIsNotInvokedIfInheritData()
    {
        $mapper = $this->getDataMapper();
        $form = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($mapper)
            ->setInheritData(true)
            ->addViewTransformer(new FixedDataTransformer(array(
                '' => '',
                'foo' => 'bar',
            )))
            ->getForm();

        $form->add($child1 = $this->getBuilder('firstName')->setCompound(false)->getForm());
        $form->add($child2 = $this->getBuilder('lastName')->setCompound(false)->getForm());

        $mapper->expects($this->never())
            ->method('mapFormsToData');

        $form->submit(array(
            'firstName' => 'Bernhard',
            'lastName' => 'Schussek',
        ));
    }

    /*
     * https://github.com/symfony/symfony/issues/4480
     */
    public function testSubmitRestoresViewDataIfCompoundAndEmpty()
    {
        $mapper = $this->getDataMapper();
        $object = new \stdClass();
        $form = $this->getBuilder('name', null, 'stdClass')
            ->setCompound(true)
            ->setDataMapper($mapper)
            ->setData($object)
            ->getForm();

        $form->submit(array());

        $this->assertSame($object, $form->getData());
    }

    public function testSubmitMapsSubmittedChildrenOntoEmptyData()
    {
        $test = $this;
        $mapper = $this->getDataMapper();
        $object = new \stdClass();
        $form = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($mapper)
            ->setEmptyData($object)
            ->setData(null)
            ->getForm();

        $form->add($child = $this->getBuilder('name')->setCompound(false)->getForm());

        $mapper->expects($this->once())
            ->method('mapFormsToData')
            ->with($this->isInstanceOf('\RecursiveIteratorIterator'), $object)
            ->will($this->returnCallback(function (\RecursiveIteratorIterator $iterator) use ($child, $test) {
                $test->assertInstanceOf('Symfony\Component\Form\Util\InheritDataAwareIterator', $iterator->getInnerIterator());
                $test->assertSame(array('name' => $child), iterator_to_array($iterator));
            }));

        $form->submit(array(
            'name' => 'Bernhard',
        ));
    }

    public function requestMethodProvider()
    {
        return array(
            array('POST'),
            array('PUT'),
            array('DELETE'),
            array('PATCH'),
        );
    }

    /**
     * @dataProvider requestMethodProvider
     */
    public function testSubmitPostOrPutRequest($method)
    {
        $path = tempnam(sys_get_temp_dir(), 'sf2');
        touch($path);

        $values = array(
            'author' => array(
                'name' => 'Bernhard',
                'image' => array('filename' => 'foobar.png'),
            ),
        );

        $files = array(
            'author' => array(
                'error' => array('image' => UPLOAD_ERR_OK),
                'name' => array('image' => 'upload.png'),
                'size' => array('image' => 123),
                'tmp_name' => array('image' => $path),
                'type' => array('image' => 'image/png'),
            ),
        );

        $request = new Request(array(), $values, array(), array(), $files, array(
            'REQUEST_METHOD' => $method,
        ));

        $form = $this->getBuilder('author')
            ->setMethod($method)
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->setRequestHandler(new HttpFoundationRequestHandler())
            ->getForm();
        $form->add($this->getBuilder('name')->getForm());
        $form->add($this->getBuilder('image')->getForm());

        $form->handleRequest($request);

        $file = new UploadedFile($path, 'upload.png', 'image/png', 123, UPLOAD_ERR_OK);

        $this->assertEquals('Bernhard', $form['name']->getData());
        $this->assertEquals($file, $form['image']->getData());

        unlink($path);
    }

    /**
     * @dataProvider requestMethodProvider
     */
    public function testSubmitPostOrPutRequestWithEmptyRootFormName($method)
    {
        $path = tempnam(sys_get_temp_dir(), 'sf2');
        touch($path);

        $values = array(
            'name' => 'Bernhard',
            'extra' => 'data',
        );

        $files = array(
            'image' => array(
                'error' => UPLOAD_ERR_OK,
                'name' => 'upload.png',
                'size' => 123,
                'tmp_name' => $path,
                'type' => 'image/png',
            ),
        );

        $request = new Request(array(), $values, array(), array(), $files, array(
            'REQUEST_METHOD' => $method,
        ));

        $form = $this->getBuilder('')
            ->setMethod($method)
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->setRequestHandler(new HttpFoundationRequestHandler())
            ->getForm();
        $form->add($this->getBuilder('name')->getForm());
        $form->add($this->getBuilder('image')->getForm());

        $form->handleRequest($request);

        $file = new UploadedFile($path, 'upload.png', 'image/png', 123, UPLOAD_ERR_OK);

        $this->assertEquals('Bernhard', $form['name']->getData());
        $this->assertEquals($file, $form['image']->getData());
        $this->assertEquals(array('extra' => 'data'), $form->getExtraData());

        unlink($path);
    }

    /**
     * @dataProvider requestMethodProvider
     */
    public function testSubmitPostOrPutRequestWithSingleChildForm($method)
    {
        $path = tempnam(sys_get_temp_dir(), 'sf2');
        touch($path);

        $files = array(
            'image' => array(
                'error' => UPLOAD_ERR_OK,
                'name' => 'upload.png',
                'size' => 123,
                'tmp_name' => $path,
                'type' => 'image/png',
            ),
        );

        $request = new Request(array(), array(), array(), array(), $files, array(
            'REQUEST_METHOD' => $method,
        ));

        $form = $this->getBuilder('image')
            ->setMethod($method)
            ->setRequestHandler(new HttpFoundationRequestHandler())
            ->getForm();

        $form->handleRequest($request);

        $file = new UploadedFile($path, 'upload.png', 'image/png', 123, UPLOAD_ERR_OK);

        $this->assertEquals($file, $form->getData());

        unlink($path);
    }

    /**
     * @dataProvider requestMethodProvider
     */
    public function testSubmitPostOrPutRequestWithSingleChildFormUploadedFile($method)
    {
        $path = tempnam(sys_get_temp_dir(), 'sf2');
        touch($path);

        $values = array(
            'name' => 'Bernhard',
        );

        $request = new Request(array(), $values, array(), array(), array(), array(
            'REQUEST_METHOD' => $method,
        ));

        $form = $this->getBuilder('name')
            ->setMethod($method)
            ->setRequestHandler(new HttpFoundationRequestHandler())
            ->getForm();

        $form->handleRequest($request);

        $this->assertEquals('Bernhard', $form->getData());

        unlink($path);
    }

    public function testSubmitGetRequest()
    {
        $values = array(
            'author' => array(
                'firstName' => 'Bernhard',
                'lastName' => 'Schussek',
            ),
        );

        $request = new Request($values, array(), array(), array(), array(), array(
            'REQUEST_METHOD' => 'GET',
        ));

        $form = $this->getBuilder('author')
            ->setMethod('GET')
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->setRequestHandler(new HttpFoundationRequestHandler())
            ->getForm();
        $form->add($this->getBuilder('firstName')->getForm());
        $form->add($this->getBuilder('lastName')->getForm());

        $form->handleRequest($request);

        $this->assertEquals('Bernhard', $form['firstName']->getData());
        $this->assertEquals('Schussek', $form['lastName']->getData());
    }

    public function testSubmitGetRequestWithEmptyRootFormName()
    {
        $values = array(
            'firstName' => 'Bernhard',
            'lastName' => 'Schussek',
            'extra' => 'data'
        );

        $request = new Request($values, array(), array(), array(), array(), array(
            'REQUEST_METHOD' => 'GET',
        ));

        $form = $this->getBuilder('')
            ->setMethod('GET')
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->setRequestHandler(new HttpFoundationRequestHandler())
            ->getForm();
        $form->add($this->getBuilder('firstName')->getForm());
        $form->add($this->getBuilder('lastName')->getForm());

        $form->handleRequest($request);

        $this->assertEquals('Bernhard', $form['firstName']->getData());
        $this->assertEquals('Schussek', $form['lastName']->getData());
        $this->assertEquals(array('extra' => 'data'), $form->getExtraData());
    }

    public function testGetErrorsAsStringDeep()
    {
        $parent = $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();

        $this->form->addError(new FormError('Error!'));

        $parent->add($this->form);
        $parent->add($this->getBuilder('foo')->getForm());

        $this->assertEquals("name:\n    ERROR: Error!\nfoo:\n    No errors\n", $parent->getErrorsAsString());
    }

    // Basic cases are covered in SimpleFormTest
    public function testCreateViewWithChildren()
    {
        $type = $this->getMock('Symfony\Component\Form\ResolvedFormTypeInterface');
        $options = array('a' => 'Foo', 'b' => 'Bar');
        $field1 = $this->getMockForm('foo');
        $field2 = $this->getMockForm('bar');
        $view = new FormView();
        $field1View = new FormView();
        $field2View = new FormView();

        $this->form = $this->getBuilder('form', null, null, $options)
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->setType($type)
            ->getForm();
        $this->form->add($field1);
        $this->form->add($field2);

        $test = $this;

        $assertChildViewsEqual = function (array $childViews) use ($test) {
            return function (FormView $view) use ($test, $childViews) {
                /* @var \PHPUnit_Framework_TestCase $test */
                $test->assertSame($childViews, $view->children);
            };
        };

        // First create the view
        $type->expects($this->once())
            ->method('createView')
            ->will($this->returnValue($view));

        // Then build it for the form itself
        $type->expects($this->once())
            ->method('buildView')
            ->with($view, $this->form, $options)
            ->will($this->returnCallback($assertChildViewsEqual(array())));

        // Then add the first child form
        $field1->expects($this->once())
            ->method('createView')
            ->will($this->returnValue($field1View));

        // Then the second child form
        $field2->expects($this->once())
            ->method('createView')
            ->will($this->returnValue($field2View));

        // Again build the view for the form itself. This time the child views
        // exist.
        $type->expects($this->once())
            ->method('finishView')
            ->with($view, $this->form, $options)
            ->will($this->returnCallback($assertChildViewsEqual(array('foo' => $field1View, 'bar' => $field2View))));

        $this->assertSame($view, $this->form->createView());
    }

    public function testNoClickedButtonBeforeSubmission()
    {
        $this->assertNull($this->form->getClickedButton());
    }

    public function testNoClickedButton()
    {
        $button = $this->getMockBuilder('Symfony\Component\Form\SubmitButton')
            ->setConstructorArgs(array(new SubmitButtonBuilder('submit')))
            ->setMethods(array('isClicked'))
            ->getMock();

        $button->expects($this->any())
            ->method('isClicked')
            ->will($this->returnValue(false));

        $parentForm = $this->getBuilder('parent')->getForm();
        $nestedForm = $this->getBuilder('nested')->getForm();

        $this->form->setParent($parentForm);
        $this->form->add($button);
        $this->form->add($nestedForm);
        $this->form->submit(array());

        $this->assertNull($this->form->getClickedButton());
    }

    public function testClickedButton()
    {
        $button = $this->getMockBuilder('Symfony\Component\Form\SubmitButton')
            ->setConstructorArgs(array(new SubmitButtonBuilder('submit')))
            ->setMethods(array('isClicked'))
            ->getMock();

        $button->expects($this->any())
            ->method('isClicked')
            ->will($this->returnValue(true));

        $this->form->add($button);
        $this->form->submit(array());

        $this->assertSame($button, $this->form->getClickedButton());
    }

    public function testClickedButtonFromNestedForm()
    {
        $button = $this->getBuilder('submit')->getForm();

        $nestedForm = $this->getMockBuilder('Symfony\Component\Form\Form')
            ->setConstructorArgs(array($this->getBuilder('nested')))
            ->setMethods(array('getClickedButton'))
            ->getMock();

        $nestedForm->expects($this->any())
            ->method('getClickedButton')
            ->will($this->returnValue($button));

        $this->form->add($nestedForm);
        $this->form->submit(array());

        $this->assertSame($button, $this->form->getClickedButton());
    }

    public function testClickedButtonFromParentForm()
    {
        $button = $this->getBuilder('submit')->getForm();

        $parentForm = $this->getMockBuilder('Symfony\Component\Form\Form')
            ->setConstructorArgs(array($this->getBuilder('parent')))
            ->setMethods(array('getClickedButton'))
            ->getMock();

        $parentForm->expects($this->any())
            ->method('getClickedButton')
            ->will($this->returnValue($button));

        $this->form->setParent($parentForm);
        $this->form->submit(array());

        $this->assertSame($button, $this->form->getClickedButton());
    }

    protected function createForm()
    {
        return $this->getBuilder()
            ->setCompound(true)
            ->setDataMapper($this->getDataMapper())
            ->getForm();
    }
}
PK�b�\ū@d22Dpear/test/Form/Symfony/Component/Form/Tests/ResolvedFormTypeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Form\Tests;

use Symfony\Component\Form\ResolvedFormType;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\Form;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class ResolvedFormTypeTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dispatcher;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $factory;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $dataMapper;
    private $parentType;
    private $type;
    private $extension1;
    private $extension2;
    private $parentResolvedType;
    private $resolvedType;

    protected function setUp()
    {
        $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $this->factory = $this->getMock('Symfony\Component\Form\FormFactoryInterface');
        $this->dataMapper = $this->getMock('Symfony\Component\Form\DataMapperInterface');
        $this->parentType = $this->getMockFormType();
        $this->type = $this->getMockFormType();
        $this->extension1 = $this->getMockFormTypeExtension();
        $this->extension2 = $this->getMockFormTypeExtension();
        $this->parentResolvedType = new ResolvedFormType($this->parentType);
        $this->resolvedType = new ResolvedFormType($this->type, array($this->extension1, $this->extension2), $this->parentResolvedType);
    }

    public function testGetOptionsResolver()
    {
        if (version_compare(\PHPUnit_Runner_Version::id(), '3.7', '<')) {
            $this->markTestSkipped('This test requires PHPUnit 3.7.');
        }

        $test = $this;
        $i = 0;

        $assertIndexAndAddOption = function ($index, $option, $default) use (&$i, $test) {
            return function (OptionsResolverInterface $resolver) use (&$i, $test, $index, $option, $default) {
                /* @var \PHPUnit_Framework_TestCase $test */
                $test->assertEquals($index, $i, 'Executed at index '.$index);

                ++$i;

                $resolver->setDefaults(array($option => $default));
            };
        };

        // First the default options are generated for the super type
        $this->parentType->expects($this->once())
            ->method('setDefaultOptions')
            ->will($this->returnCallback($assertIndexAndAddOption(0, 'a', 'a_default')));

        // The form type itself
        $this->type->expects($this->once())
            ->method('setDefaultOptions')
            ->will($this->returnCallback($assertIndexAndAddOption(1, 'b', 'b_default')));

        // And its extensions
        $this->extension1->expects($this->once())
            ->method('setDefaultOptions')
            ->will($this->returnCallback($assertIndexAndAddOption(2, 'c', 'c_default')));

        $this->extension2->expects($this->once())
            ->method('setDefaultOptions')
            ->will($this->returnCallback($assertIndexAndAddOption(3, 'd', 'd_default')));

        $givenOptions = array('a' => 'a_custom', 'c' => 'c_custom');
        $resolvedOptions = array('a' => 'a_custom', 'b' => 'b_default', 'c' => 'c_custom', 'd' => 'd_default');

        $resolver = $this->resolvedType->getOptionsResolver();

        $this->assertEquals($resolvedOptions, $resolver->resolve($givenOptions));
    }

    public function testCreateBuilder()
    {
        if (version_compare(\PHPUnit_Runner_Version::id(), '3.7', '<')) {
            $this->markTestSkipped('This test requires PHPUnit 3.7.');
        }

        $givenOptions = array('a' => 'a_custom', 'c' => 'c_custom');
        $resolvedOptions = array('a' => 'a_custom', 'b' => 'b_default', 'c' => 'c_custom', 'd' => 'd_default');
        $optionsResolver = $this->getMock('Symfony\Component\OptionsResolver\OptionsResolverInterface');

        $this->resolvedType = $this->getMockBuilder('Symfony\Component\Form\ResolvedFormType')
            ->setConstructorArgs(array($this->type, array($this->extension1, $this->extension2), $this->parentResolvedType))
            ->setMethods(array('getOptionsResolver'))
            ->getMock();

        $this->resolvedType->expects($this->once())
            ->method('getOptionsResolver')
            ->will($this->returnValue($optionsResolver));

        $optionsResolver->expects($this->once())
            ->method('resolve')
            ->with($givenOptions)
            ->will($this->returnValue($resolvedOptions));

        $factory = $this->getMockFormFactory();
        $builder = $this->resolvedType->createBuilder($factory, 'name', $givenOptions);

        $this->assertSame($this->resolvedType, $builder->getType());
        $this->assertSame($resolvedOptions, $builder->getOptions());
        $this->assertNull($builder->getDataClass());
    }

    public function testCreateBuilderWithDataClassOption()
    {
        if (version_compare(\PHPUnit_Runner_Version::id(), '3.7', '<')) {
            $this->markTestSkipped('This test requires PHPUnit 3.7.');
        }

        $givenOptions = array('data_class' => 'Foo');
        $resolvedOptions = array('data_class' => '\stdClass');
        $optionsResolver = $this->getMock('Symfony\Component\OptionsResolver\OptionsResolverInterface');

        $this->resolvedType = $this->getMockBuilder('Symfony\Component\Form\ResolvedFormType')
            ->setConstructorArgs(array($this->type, array($this->extension1, $this->extension2), $this->parentResolvedType))
            ->setMethods(array('getOptionsResolver'))
            ->getMock();

        $this->resolvedType->expects($this->once())
            ->method('getOptionsResolver')
            ->will($this->returnValue($optionsResolver));

        $optionsResolver->expects($this->once())
            ->method('resolve')
            ->with($givenOptions)
            ->will($this->returnValue($resolvedOptions));

        $factory = $this->getMockFormFactory();
        $builder = $this->resolvedType->createBuilder($factory, 'name', $givenOptions);

        $this->assertSame($this->resolvedType, $builder->getType());
        $this->assertSame($resolvedOptions, $builder->getOptions());
        $this->assertSame('\stdClass', $builder->getDataClass());
    }

    public function testBuildForm()
    {
        if (version_compare(\PHPUnit_Runner_Version::id(), '3.7', '<')) {
            $this->markTestSkipped('This test requires PHPUnit 3.7.');
        }

        $test = $this;
        $i = 0;

        $assertIndex = function ($index) use (&$i, $test) {
            return function () use (&$i, $test, $index) {
                /* @var \PHPUnit_Framework_TestCase $test */
                $test->assertEquals($index, $i, 'Executed at index '.$index);

                ++$i;
            };
        };

        $options = array('a' => 'Foo', 'b' => 'Bar');
        $builder = $this->getMock('Symfony\Component\Form\Test\FormBuilderInterface');

        // First the form is built for the super type
        $this->parentType->expects($this->once())
            ->method('buildForm')
            ->with($builder, $options)
            ->will($this->returnCallback($assertIndex(0)));

        // Then the type itself
        $this->type->expects($this->once())
            ->method('buildForm')
            ->with($builder, $options)
            ->will($this->returnCallback($assertIndex(1)));

        // Then its extensions
        $this->extension1->expects($this->once())
            ->method('buildForm')
            ->with($builder, $options)
            ->will($this->returnCallback($assertIndex(2)));

        $this->extension2->expects($this->once())
            ->method('buildForm')
            ->with($builder, $options)
            ->will($this->returnCallback($assertIndex(3)));

        $this->resolvedType->buildForm($builder, $options);
    }

    public function testCreateView()
    {
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');

        $view = $this->resolvedType->createView($form);

        $this->assertInstanceOf('Symfony\Component\Form\FormView', $view);
        $this->assertNull($view->parent);
    }

    public function testCreateViewWithParent()
    {
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $parentView = $this->getMock('Symfony\Component\Form\FormView');

        $view = $this->resolvedType->createView($form, $parentView);

        $this->assertInstanceOf('Symfony\Component\Form\FormView', $view);
        $this->assertSame($parentView, $view->parent);
    }

    public function testBuildView()
    {
        $options = array('a' => '1', 'b' => '2');
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $view = $this->getMock('Symfony\Component\Form\FormView');

        $test = $this;
        $i = 0;

        $assertIndex = function ($index) use (&$i, $test) {
            return function () use (&$i, $test, $index) {
                /* @var \PHPUnit_Framework_TestCase $test */
                $test->assertEquals($index, $i, 'Executed at index '.$index);

                ++$i;
            };
        };

        // First the super type
        $this->parentType->expects($this->once())
            ->method('buildView')
            ->with($view, $form, $options)
            ->will($this->returnCallback($assertIndex(0)));

        // Then the type itself
        $this->type->expects($this->once())
            ->method('buildView')
            ->with($view, $form, $options)
            ->will($this->returnCallback($assertIndex(1)));

        // Then its extensions
        $this->extension1->expects($this->once())
            ->method('buildView')
            ->with($view, $form, $options)
            ->will($this->returnCallback($assertIndex(2)));

        $this->extension2->expects($this->once())
            ->method('buildView')
            ->with($view, $form, $options)
            ->will($this->returnCallback($assertIndex(3)));

        $this->resolvedType->buildView($view, $form, $options);
    }

    public function testFinishView()
    {
        $options = array('a' => '1', 'b' => '2');
        $form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
        $view = $this->getMock('Symfony\Component\Form\FormView');

        $test = $this;
        $i = 0;

        $assertIndex = function ($index) use (&$i, $test) {
            return function () use (&$i, $test, $index) {
                /* @var \PHPUnit_Framework_TestCase $test */
                $test->assertEquals($index, $i, 'Executed at index '.$index);

                ++$i;
            };
        };

        // First the super type
        $this->parentType->expects($this->once())
            ->method('finishView')
            ->with($view, $form, $options)
            ->will($this->returnCallback($assertIndex(0)));

        // Then the type itself
        $this->type->expects($this->once())
            ->method('finishView')
            ->with($view, $form, $options)
            ->will($this->returnCallback($assertIndex(1)));

        // Then its extensions
        $this->extension1->expects($this->once())
            ->method('finishView')
            ->with($view, $form, $options)
            ->will($this->returnCallback($assertIndex(2)));

        $this->extension2->expects($this->once())
            ->method('finishView')
            ->with($view, $form, $options)
            ->will($this->returnCallback($assertIndex(3)));

        $this->resolvedType->finishView($view, $form, $options);
    }

    /**
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    private function getMockFormType()
    {
        return $this->getMock('Symfony\Component\Form\FormTypeInterface');
    }

    /**
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    private function getMockFormTypeExtension()
    {
        return $this->getMock('Symfony\Component\Form\FormTypeExtensionInterface');
    }

    /**
     * @return \PHPUnit_Framework_MockObject_MockObject
     */
    private function getMockFormFactory()
    {
        return $this->getMock('Symfony\Component\Form\FormFactoryInterface');
    }

    /**
     * @param string $name
     * @param array $options
     *
     * @return FormBuilder
     */
    protected function getBuilder($name = 'name', array $options = array())
    {
        return new FormBuilder($name, null, $this->dispatcher, $this->factory, $options);
    }
}
PK�b�\p\H<pear/test/Process/Symfony/Component/Process/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Process Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\m�����Rpear/test/Process/Symfony/Component/Process/Tests/ProcessInSigchildEnvironment.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Tests;

use Symfony\Component\Process\Process;

class ProcessInSigchildEnvironment extends Process
{
    protected function isSigchildEnabled()
    {
        return true;
    }
}
PK�b�\钊�\\Ppear/test/Process/Symfony/Component/Process/Tests/SigchildEnabledProcessTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Tests;

class SigchildEnabledProcessTest extends AbstractProcessTest
{
    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.
     */
    public function testProcessIsSignaledIfStopped()
    {
        parent::testProcessIsSignaledIfStopped();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.
     */
    public function testProcessWithTermSignal()
    {
        parent::testProcessWithTermSignal();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.
     */
    public function testProcessIsNotSignaled()
    {
        parent::testProcessIsNotSignaled();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.
     */
    public function testProcessWithoutTermSignal()
    {
        parent::testProcessWithoutTermSignal();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. The process identifier can not be retrieved.
     */
    public function testGetPid()
    {
        parent::testGetPid();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. The process identifier can not be retrieved.
     */
    public function testGetPidIsNullBeforeStart()
    {
        parent::testGetPidIsNullBeforeStart();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. The process identifier can not be retrieved.
     */
    public function testGetPidIsNullAfterRun()
    {
        parent::testGetPidIsNullAfterRun();
    }

    public function testExitCodeText()
    {
        $process = $this->getProcess('qdfsmfkqsdfmqmsd');
        $process->run();

        $this->assertInternalType('string', $process->getExitCodeText());
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. The process can not be signaled.
     */
    public function testSignal()
    {
        parent::testSignal();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.
     */
    public function testProcessWithoutTermSignalIsNotSignaled()
    {
        parent::testProcessWithoutTermSignalIsNotSignaled();
    }

    public function testProcessThrowsExceptionWhenExternallySignaled()
    {
        $this->markTestSkipped('Retrieving Pid is not supported in sigchild environment');
    }

    public function testExitCodeIsAvailableAfterSignal()
    {
        $this->markTestSkipped('Signal is not supported in sigchild environment');
    }

    public function testStartAfterATimeout()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('Restarting a timed-out process on Windows is not supported in sigchild environment');
        }
        parent::testStartAfterATimeout();
    }

    /**
     * {@inheritdoc}
     */
    protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array())
    {
        $process = new ProcessInSigchildEnvironment($commandline, $cwd, $env, $stdin, $timeout, $options);
        $process->setEnhanceSigchildCompatibility(true);

        return $process;
    }
}
PK�b�\���
��Gpear/test/Process/Symfony/Component/Process/Tests/SimpleProcessTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Tests;

use Symfony\Component\Process\Process;

class SimpleProcessTest extends AbstractProcessTest
{
    private $enabledSigchild = false;

    public function setUp()
    {
        ob_start();
        phpinfo(INFO_GENERAL);

        $this->enabledSigchild = false !== strpos(ob_get_clean(), '--enable-sigchild');
    }

    public function testGetExitCode()
    {
        $this->skipIfPHPSigchild(); // This test use exitcode that is not available in this case
        parent::testGetExitCode();
    }

    public function testExitCodeCommandFailed()
    {
        $this->skipIfPHPSigchild(); // This test use exitcode that is not available in this case
        parent::testExitCodeCommandFailed();
    }

    public function testProcessIsSignaledIfStopped()
    {
        $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved');
        parent::testProcessIsSignaledIfStopped();
    }

    public function testProcessWithTermSignal()
    {
        $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved');
        parent::testProcessWithTermSignal();
    }

    public function testProcessIsNotSignaled()
    {
        $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved');
        parent::testProcessIsNotSignaled();
    }

    public function testProcessWithoutTermSignal()
    {
        $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved');
        parent::testProcessWithoutTermSignal();
    }

    public function testExitCodeText()
    {
        $this->skipIfPHPSigchild(); // This test use exitcode that is not available in this case
        parent::testExitCodeText();
    }

    public function testIsSuccessful()
    {
        $this->skipIfPHPSigchild(); // This test use PID that is not available in this case
        parent::testIsSuccessful();
    }

    public function testIsNotSuccessful()
    {
        $this->skipIfPHPSigchild(); // This test use PID that is not available in this case
        parent::testIsNotSuccessful();
    }

    public function testGetPid()
    {
        $this->skipIfPHPSigchild(); // This test use PID that is not available in this case
        parent::testGetPid();
    }

    public function testGetPidIsNullBeforeStart()
    {
        $this->skipIfPHPSigchild(); // This test use PID that is not available in this case
        parent::testGetPidIsNullBeforeStart();
    }

    public function testGetPidIsNullAfterRun()
    {
        $this->skipIfPHPSigchild(); // This test use PID that is not available in this case
        parent::testGetPidIsNullAfterRun();
    }

    public function testSignal()
    {
        $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
        parent::testSignal();
    }

    public function testProcessWithoutTermSignalIsNotSignaled()
    {
        $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved');
        parent::testProcessWithoutTermSignalIsNotSignaled();
    }

    public function testProcessThrowsExceptionWhenExternallySignaled()
    {
        $this->skipIfPHPSigchild(); // This test use PID that is not available in this case
        parent::testProcessThrowsExceptionWhenExternallySignaled();
    }

    public function testExitCodeIsAvailableAfterSignal()
    {
        $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
        parent::testExitCodeIsAvailableAfterSignal();
    }

    public function testSignalProcessNotRunning()
    {
        $this->setExpectedException('Symfony\Component\Process\Exception\LogicException', 'Can not send signal on a non running process.');
        parent::testSignalProcessNotRunning();
    }

    public function testSignalWithWrongIntSignal()
    {
        if ($this->enabledSigchild) {
            $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
        } else {
            $this->setExpectedException('Symfony\Component\Process\Exception\RuntimeException', 'Error while sending signal `-4`.');
        }
        parent::testSignalWithWrongIntSignal();
    }

    public function testSignalWithWrongNonIntSignal()
    {
        if ($this->enabledSigchild) {
            $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
        } else {
            $this->setExpectedException('Symfony\Component\Process\Exception\RuntimeException', 'Error while sending signal `Céphalopodes`.');
        }
        parent::testSignalWithWrongNonIntSignal();
    }

    /**
     * {@inheritdoc}
     */
    protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array())
    {
        return new Process($commandline, $cwd, $env, $stdin, $timeout, $options);
    }

    private function skipIfPHPSigchild()
    {
        if ($this->enabledSigchild) {
            $this->markTestSkipped('Your PHP has been compiled with --enable-sigchild, this test can not be executed');
        }
    }

    private function expectExceptionIfPHPSigchild($classname, $message)
    {
        if ($this->enabledSigchild) {
            $this->setExpectedException($classname, $message);
        }
    }
}
PK�b�\H��sppHpear/test/Process/Symfony/Component/Process/Tests/ProcessBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Tests;

use Symfony\Component\Process\ProcessBuilder;

class ProcessBuilderTest extends \PHPUnit_Framework_TestCase
{
    public function testInheritEnvironmentVars()
    {
        $_ENV['MY_VAR_1'] = 'foo';

        $proc = ProcessBuilder::create()
            ->add('foo')
            ->getProcess();

        unset($_ENV['MY_VAR_1']);

        $env = $proc->getEnv();
        $this->assertArrayHasKey('MY_VAR_1', $env);
        $this->assertEquals('foo', $env['MY_VAR_1']);
    }

    public function testAddEnvironmentVariables()
    {
        $pb = new ProcessBuilder();
        $env = array(
            'foo' => 'bar',
            'foo2' => 'bar2',
        );
        $proc = $pb
            ->add('command')
            ->setEnv('foo', 'bar2')
            ->addEnvironmentVariables($env)
            ->inheritEnvironmentVariables(false)
            ->getProcess()
        ;

        $this->assertSame($env, $proc->getEnv());
    }

    public function testProcessShouldInheritAndOverrideEnvironmentVars()
    {
        $_ENV['MY_VAR_1'] = 'foo';

        $proc = ProcessBuilder::create()
            ->setEnv('MY_VAR_1', 'bar')
            ->add('foo')
            ->getProcess();

        unset($_ENV['MY_VAR_1']);

        $env = $proc->getEnv();
        $this->assertArrayHasKey('MY_VAR_1', $env);
        $this->assertEquals('bar', $env['MY_VAR_1']);
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\InvalidArgumentException
     */
    public function testNegativeTimeoutFromSetter()
    {
        $pb = new ProcessBuilder();
        $pb->setTimeout(-1);
    }

    public function testNullTimeout()
    {
        $pb = new ProcessBuilder();
        $pb->setTimeout(10);
        $pb->setTimeout(null);

        $r = new \ReflectionObject($pb);
        $p = $r->getProperty('timeout');
        $p->setAccessible(true);

        $this->assertNull($p->getValue($pb));
    }

    public function testShouldSetArguments()
    {
        $pb = new ProcessBuilder(array('initial'));
        $pb->setArguments(array('second'));

        $proc = $pb->getProcess();

        $this->assertContains("second", $proc->getCommandLine());
    }

    public function testPrefixIsPrependedToAllGeneratedProcess()
    {
        $pb = new ProcessBuilder();
        $pb->setPrefix('/usr/bin/php');

        $proc = $pb->setArguments(array('-v'))->getProcess();
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->assertEquals('"/usr/bin/php" "-v"', $proc->getCommandLine());
        } else {
            $this->assertEquals("'/usr/bin/php' '-v'", $proc->getCommandLine());
        }

        $proc = $pb->setArguments(array('-i'))->getProcess();
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->assertEquals('"/usr/bin/php" "-i"', $proc->getCommandLine());
        } else {
            $this->assertEquals("'/usr/bin/php' '-i'", $proc->getCommandLine());
        }
    }

    public function testArrayPrefixesArePrependedToAllGeneratedProcess()
    {
        $pb = new ProcessBuilder();
        $pb->setPrefix(array('/usr/bin/php', 'composer.phar'));

        $proc = $pb->setArguments(array('-v'))->getProcess();
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->assertEquals('"/usr/bin/php" "composer.phar" "-v"', $proc->getCommandLine());
        } else {
            $this->assertEquals("'/usr/bin/php' 'composer.phar' '-v'", $proc->getCommandLine());
        }

        $proc = $pb->setArguments(array('-i'))->getProcess();
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->assertEquals('"/usr/bin/php" "composer.phar" "-i"', $proc->getCommandLine());
        } else {
            $this->assertEquals("'/usr/bin/php' 'composer.phar' '-i'", $proc->getCommandLine());
        }
    }

    public function testShouldEscapeArguments()
    {
        $pb = new ProcessBuilder(array('%path%', 'foo " bar', '%baz%baz'));
        $proc = $pb->getProcess();

        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->assertSame('^%"path"^% "foo \\" bar" "%baz%baz"', $proc->getCommandLine());
        } else {
            $this->assertSame("'%path%' 'foo \" bar' '%baz%baz'", $proc->getCommandLine());
        }
    }

    public function testShouldEscapeArgumentsAndPrefix()
    {
        $pb = new ProcessBuilder(array('arg'));
        $pb->setPrefix('%prefix%');
        $proc = $pb->getProcess();

        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->assertSame('^%"prefix"^% "arg"', $proc->getCommandLine());
        } else {
            $this->assertSame("'%prefix%' 'arg'", $proc->getCommandLine());
        }
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\LogicException
     */
    public function testShouldThrowALogicExceptionIfNoPrefixAndNoArgument()
    {
        ProcessBuilder::create()->getProcess();
    }

    public function testShouldNotThrowALogicExceptionIfNoArgument()
    {
        $process = ProcessBuilder::create()
            ->setPrefix('/usr/bin/php')
            ->getProcess();

        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->assertEquals('"/usr/bin/php"', $process->getCommandLine());
        } else {
            $this->assertEquals("'/usr/bin/php'", $process->getCommandLine());
        }
    }

    public function testShouldNotThrowALogicExceptionIfNoPrefix()
    {
        $process = ProcessBuilder::create(array('/usr/bin/php'))
            ->getProcess();

        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->assertEquals('"/usr/bin/php"', $process->getCommandLine());
        } else {
            $this->assertEquals("'/usr/bin/php'", $process->getCommandLine());
        }
    }
}
PK�b�\=�,j��Dpear/test/Process/Symfony/Component/Process/Tests/SignalListener.phpnu�[���<?php

// required for signal handling
declare(ticks = 1);

pcntl_signal(SIGUSR1, function () {echo "Caught SIGUSR1"; exit;});

$n=0;

// ticks require activity to work - sleep(4); does not work
while ($n < 400) {
    usleep(10000);
    $n++;
}

return;
PK�b�\��+\MMMpear/test/Process/Symfony/Component/Process/Tests/PhpExecutableFinderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Tests;

use Symfony\Component\Process\PhpExecutableFinder;

/**
 * @author Robert Schönthal <seroscho@googlemail.com>
 */
class PhpExecutableFinderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * tests find() with the env var PHP_PATH
     */
    public function testFindWithPhpPath()
    {
        if (defined('PHP_BINARY')) {
            $this->markTestSkipped('The PHP binary is easily available as of PHP 5.4');
        }

        $f = new PhpExecutableFinder();

        $current = $f->find();

        //not executable PHP_PATH
        putenv('PHP_PATH=/not/executable/php');
        $this->assertFalse($f->find(), '::find() returns false for not executable PHP');

        //executable PHP_PATH
        putenv('PHP_PATH='.$current);
        $this->assertEquals($f->find(), $current, '::find() returns the executable PHP');
    }

    /**
     * tests find() with default executable
     */
    public function testFindWithSuffix()
    {
        if (defined('PHP_BINARY')) {
            $this->markTestSkipped('The PHP binary is easily available as of PHP 5.4');
        }

        putenv('PHP_PATH=');
        putenv('PHP_PEAR_PHP_BIN=');
        $f = new PhpExecutableFinder();

        $current = $f->find();

        //TODO maybe php executable is custom or even Windows
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->assertTrue(is_executable($current));
            $this->assertTrue((bool) preg_match('/'.addSlashes(DIRECTORY_SEPARATOR).'php\.(exe|bat|cmd|com)$/i', $current), '::find() returns the executable PHP with suffixes');
        }
    }
}
PK�b�\C�u^UUFpear/test/Process/Symfony/Component/Process/Tests/ProcessUtilsTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Tests;

use Symfony\Component\Process\ProcessUtils;

class ProcessUtilsTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider dataArguments
     */
    public function testEscapeArgument($result, $argument)
    {
        $this->assertSame($result, ProcessUtils::escapeArgument($argument));
    }

    public function dataArguments()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            return array(
                array('"\"php\" \"-v\""', '"php" "-v"'),
                array('"foo bar"', 'foo bar'),
                array('^%"path"^%', '%path%'),
                array('"<|>\\" \\"\'f"', '<|>" "\'f'),
                array('""', ''),
                array('"with\trailingbs\\\\"', 'with\trailingbs\\'),
            );
        }

        return array(
            array("'\"php\" \"-v\"'", '"php" "-v"'),
            array("'foo bar'", 'foo bar'),
            array("'%path%'", '%path%'),
            array("'<|>\" \"'\\''f'", '<|>" "\'f'),
            array("''", ''),
            array("'with\\trailingbs\\'", 'with\trailingbs\\'),
        );
    }
}
PK�b�\�+�v,,Hpear/test/Process/Symfony/Component/Process/Tests/NonStopableProcess.phpnu�[���<?php

/**
 * Runs a PHP script that can be stopped only with a SIGKILL (9) signal for 3 seconds
 *
 * @args duration Run this script with a custom duration
 *
 * @example `php NonStopableProcess.php 42` will run the script for 42 seconds
 */

function handleSignal($signal)
{
    switch ($signal) {
        case SIGTERM:
            $name = 'SIGTERM';
            break;
        case SIGINT:
            $name = 'SIGINT';
            break;
        default:
            $name = $signal . ' (unknown)';
            break;
    }

    echo "received signal $name\n";
}

declare(ticks = 1);
pcntl_signal(SIGTERM, 'handleSignal');
pcntl_signal(SIGINT, 'handleSignal');

$duration = isset($argv[1]) ? (int) $argv[1] : 3;
$start = microtime(true);

while ($duration > (microtime(true) - $start)) {
    usleep(1000);
}
PK�b�\[�VAChChIpear/test/Process/Symfony/Component/Process/Tests/AbstractProcessTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Tests;

use Symfony\Component\Process\Exception\ProcessTimedOutException;
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\RuntimeException;
use Symfony\Component\Process\ProcessPipes;

/**
 * @author Robert Schönthal <seroscho@googlemail.com>
 */
abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
{
    public function testThatProcessDoesNotThrowWarningDuringRun()
    {
        @trigger_error('Test Error', E_USER_NOTICE);
        $process = $this->getProcess("php -r 'sleep(3)'");
        $process->run();
        $actualError = error_get_last();
        $this->assertEquals('Test Error', $actualError['message']);
        $this->assertEquals(E_USER_NOTICE, $actualError['type']);
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\InvalidArgumentException
     */
    public function testNegativeTimeoutFromConstructor()
    {
        $this->getProcess('', null, null, null, -1);
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\InvalidArgumentException
     */
    public function testNegativeTimeoutFromSetter()
    {
        $p = $this->getProcess('');
        $p->setTimeout(-1);
    }

    public function testFloatAndNullTimeout()
    {
        $p = $this->getProcess('');

        $p->setTimeout(10);
        $this->assertSame(10.0, $p->getTimeout());

        $p->setTimeout(null);
        $this->assertNull($p->getTimeout());

        $p->setTimeout(0.0);
        $this->assertNull($p->getTimeout());
    }

    public function testStopWithTimeoutIsActuallyWorking()
    {
        $this->verifyPosixIsEnabled();

        // exec is mandatory here since we send a signal to the process
        // see https://github.com/symfony/symfony/issues/5030 about prepending
        // command with exec
        $p = $this->getProcess('exec php '.__DIR__.'/NonStopableProcess.php 3');
        $p->start();
        usleep(100000);
        $start = microtime(true);
        $p->stop(1.1, SIGKILL);
        while ($p->isRunning()) {
            usleep(1000);
        }
        $duration = microtime(true) - $start;

        $this->assertLessThan(1.8, $duration);
    }

    public function testAllOutputIsActuallyReadOnTermination()
    {
        // this code will result in a maximum of 2 reads of 8192 bytes by calling
        // start() and isRunning().  by the time getOutput() is called the process
        // has terminated so the internal pipes array is already empty. normally
        // the call to start() will not read any data as the process will not have
        // generated output, but this is non-deterministic so we must count it as
        // a possibility.  therefore we need 2 * ProcessPipes::CHUNK_SIZE plus
        // another byte which will never be read.
        $expectedOutputSize = ProcessPipes::CHUNK_SIZE * 2 + 2;

        $code = sprintf('echo str_repeat(\'*\', %d);', $expectedOutputSize);
        $p = $this->getProcess(sprintf('php -r %s', escapeshellarg($code)));

        $p->start();
        // Let's wait enough time for process to finish...
        // Here we don't call Process::run or Process::wait to avoid any read of pipes
        usleep(500000);

        if ($p->isRunning()) {
            $this->markTestSkipped('Process execution did not complete in the required time frame');
        }

        $o = $p->getOutput();

        $this->assertEquals($expectedOutputSize, strlen($o));
    }

    public function testCallbacksAreExecutedWithStart()
    {
        $data = '';

        $process = $this->getProcess('echo foo && php -r "sleep(1);" && echo foo');
        $process->start(function ($type, $buffer) use (&$data) {
            $data .= $buffer;
        });

        while ($process->isRunning()) {
            usleep(10000);
        }

        $this->assertEquals(2, preg_match_all('/foo/', $data, $matches));
    }

    /**
     * tests results from sub processes
     *
     * @dataProvider responsesCodeProvider
     */
    public function testProcessResponses($expected, $getter, $code)
    {
        $p = $this->getProcess(sprintf('php -r %s', escapeshellarg($code)));
        $p->run();

        $this->assertSame($expected, $p->$getter());
    }

    /**
     * tests results from sub processes
     *
     * @dataProvider pipesCodeProvider
     */
    public function testProcessPipes($code, $size)
    {
        $expected = str_repeat(str_repeat('*', 1024), $size) . '!';
        $expectedLength = (1024 * $size) + 1;

        $p = $this->getProcess(sprintf('php -r %s', escapeshellarg($code)));
        $p->setStdin($expected);
        $p->run();

        $this->assertEquals($expectedLength, strlen($p->getOutput()));
        $this->assertEquals($expectedLength, strlen($p->getErrorOutput()));
    }

    public function chainedCommandsOutputProvider()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            return array(
                array("2 \r\n2\r\n", '&&', '2')
            );
        }

        return array(
            array("1\n1\n", ';', '1'),
            array("2\n2\n", '&&', '2'),
        );
    }

    /**
     *
     * @dataProvider chainedCommandsOutputProvider
     */
    public function testChainedCommandsOutput($expected, $operator, $input)
    {
        $process = $this->getProcess(sprintf('echo %s %s echo %s', $input, $operator, $input));
        $process->run();
        $this->assertEquals($expected, $process->getOutput());
    }

    public function testCallbackIsExecutedForOutput()
    {
        $p = $this->getProcess(sprintf('php -r %s', escapeshellarg('echo \'foo\';')));

        $called = false;
        $p->run(function ($type, $buffer) use (&$called) {
            $called = $buffer === 'foo';
        });

        $this->assertTrue($called, 'The callback should be executed with the output');
    }

    public function testGetErrorOutput()
    {
        $p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 0; while ($n < 3) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; }')));

        $p->run();
        $this->assertEquals(3, preg_match_all('/ERROR/', $p->getErrorOutput(), $matches));
    }

    public function testGetIncrementalErrorOutput()
    {
        $p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 0; while ($n < 3) { usleep(100000); file_put_contents(\'php://stderr\', \'ERROR\'); $n++; }')));

        $p->start();
        while ($p->isRunning()) {
            $this->assertLessThanOrEqual(1, preg_match_all('/ERROR/', $p->getIncrementalErrorOutput(), $matches));
            usleep(20000);
        }
    }

    public function testFlushErrorOutput()
    {
        $p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 0; while ($n < 3) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; }')));

        $p->run();
        $p->clearErrorOutput();
        $this->assertEmpty($p->getErrorOutput());
    }

    public function testGetOutput()
    {
        $p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n=0;while ($n<3) {echo \' foo \';$n++; usleep(500); }')));

        $p->run();
        $this->assertEquals(3, preg_match_all('/foo/', $p->getOutput(), $matches));
    }

    public function testGetIncrementalOutput()
    {
        $p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n=0;while ($n<3) { echo \' foo \'; usleep(50000); $n++; }')));

        $p->start();
        while ($p->isRunning()) {
            $this->assertLessThanOrEqual(1, preg_match_all('/foo/', $p->getIncrementalOutput(), $matches));
            usleep(20000);
        }
    }

    public function testFlushOutput()
    {
        $p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n=0;while ($n<3) {echo \' foo \';$n++;}')));

        $p->run();
        $p->clearOutput();
        $this->assertEmpty($p->getOutput());
    }

    public function testExitCodeCommandFailed()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('Windows does not support POSIX exit code');
        }

        // such command run in bash return an exitcode 127
        $process = $this->getProcess('nonexistingcommandIhopeneversomeonewouldnameacommandlikethis');
        $process->run();

        $this->assertGreaterThan(0, $process->getExitCode());
    }

    public function testTTYCommand()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('Windows does have /dev/tty support');
        }

        $process = $this->getProcess('echo "foo" >> /dev/null && php -r "usleep(100000);"');
        $process->setTTY(true);
        $process->start();
        $this->assertTrue($process->isRunning());
        $process->wait();

        $this->assertSame(Process::STATUS_TERMINATED, $process->getStatus());
    }

    public function testTTYCommandExitCode()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('Windows does have /dev/tty support');
        }

        $process = $this->getProcess('echo "foo" >> /dev/null');
        $process->setTTY(true);
        $process->run();

        $this->assertTrue($process->isSuccessful());
    }

    public function testExitCodeTextIsNullWhenExitCodeIsNull()
    {
        $process = $this->getProcess('');
        $this->assertNull($process->getExitCodeText());
    }

    public function testExitCodeText()
    {
        $process = $this->getProcess('');
        $r = new \ReflectionObject($process);
        $p = $r->getProperty('exitcode');
        $p->setAccessible(true);

        $p->setValue($process, 2);
        $this->assertEquals('Misuse of shell builtins', $process->getExitCodeText());
    }

    public function testStartIsNonBlocking()
    {
        $process = $this->getProcess('php -r "usleep(500000);"');
        $start = microtime(true);
        $process->start();
        $end = microtime(true);
        $this->assertLessThan(0.2, $end-$start);
        $process->wait();
    }

    public function testUpdateStatus()
    {
        $process = $this->getProcess('php -h');
        $process->run();
        $this->assertTrue(strlen($process->getOutput()) > 0);
    }

    public function testGetExitCodeIsNullOnStart()
    {
        $process = $this->getProcess('php -r "usleep(200000);"');
        $this->assertNull($process->getExitCode());
        $process->start();
        $this->assertNull($process->getExitCode());
        $process->wait();
        $this->assertEquals(0, $process->getExitCode());
    }

    public function testGetExitCodeIsNullOnWhenStartingAgain()
    {
        $process = $this->getProcess('php -r "usleep(200000);"');
        $process->run();
        $this->assertEquals(0, $process->getExitCode());
        $process->start();
        $this->assertNull($process->getExitCode());
        $process->wait();
        $this->assertEquals(0, $process->getExitCode());
    }

    public function testGetExitCode()
    {
        $process = $this->getProcess('php -m');
        $process->run();
        $this->assertSame(0, $process->getExitCode());
    }

    public function testStatus()
    {
        $process = $this->getProcess('php -r "usleep(500000);"');
        $this->assertFalse($process->isRunning());
        $this->assertFalse($process->isStarted());
        $this->assertFalse($process->isTerminated());
        $this->assertSame(Process::STATUS_READY, $process->getStatus());
        $process->start();
        $this->assertTrue($process->isRunning());
        $this->assertTrue($process->isStarted());
        $this->assertFalse($process->isTerminated());
        $this->assertSame(Process::STATUS_STARTED, $process->getStatus());
        $process->wait();
        $this->assertFalse($process->isRunning());
        $this->assertTrue($process->isStarted());
        $this->assertTrue($process->isTerminated());
        $this->assertSame(Process::STATUS_TERMINATED, $process->getStatus());
    }

    public function testStop()
    {
        $process = $this->getProcess('php -r "sleep(4);"');
        $process->start();
        $this->assertTrue($process->isRunning());
        $process->stop();
        $this->assertFalse($process->isRunning());
    }

    public function testIsSuccessful()
    {
        $process = $this->getProcess('php -m');
        $process->run();
        $this->assertTrue($process->isSuccessful());
    }

    public function testIsSuccessfulOnlyAfterTerminated()
    {
        $process = $this->getProcess('php -r "sleep(1);"');
        $process->start();
        while ($process->isRunning()) {
            $this->assertFalse($process->isSuccessful());
            usleep(300000);
        }

        $this->assertTrue($process->isSuccessful());
    }

    public function testIsNotSuccessful()
    {
        $process = $this->getProcess('php -r "usleep(500000);throw new \Exception(\'BOUM\');"');
        $process->start();
        $this->assertTrue($process->isRunning());
        $process->wait();
        $this->assertFalse($process->isSuccessful());
    }

    public function testProcessIsNotSignaled()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('Windows does not support POSIX signals');
        }

        $process = $this->getProcess('php -m');
        $process->run();
        $this->assertFalse($process->hasBeenSignaled());
    }

    public function testProcessWithoutTermSignalIsNotSignaled()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('Windows does not support POSIX signals');
        }

        $process = $this->getProcess('php -m');
        $process->run();
        $this->assertFalse($process->hasBeenSignaled());
    }

    public function testProcessWithoutTermSignal()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('Windows does not support POSIX signals');
        }

        $process = $this->getProcess('php -m');
        $process->run();
        $this->assertEquals(0, $process->getTermSignal());
    }

    public function testProcessIsSignaledIfStopped()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('Windows does not support POSIX signals');
        }

        $process = $this->getProcess('php -r "sleep(4);"');
        $process->start();
        $process->stop();
        $this->assertTrue($process->hasBeenSignaled());
    }

    public function testProcessWithTermSignal()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('Windows does not support POSIX signals');
        }

        // SIGTERM is only defined if pcntl extension is present
        $termSignal = defined('SIGTERM') ? SIGTERM : 15;

        $process = $this->getProcess('php -r "sleep(4);"');
        $process->start();
        $process->stop();

        $this->assertEquals($termSignal, $process->getTermSignal());
    }

    public function testProcessThrowsExceptionWhenExternallySignaled()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('Windows does not support POSIX signals');
        }

        if (!function_exists('posix_kill')) {
            $this->markTestSkipped('posix_kill is required for this test');
        }

        $termSignal = defined('SIGKILL') ? SIGKILL : 9;

        $process = $this->getProcess('exec php -r "while (true) {}"');
        $process->start();
        posix_kill($process->getPid(), $termSignal);

        $this->setExpectedException('Symfony\Component\Process\Exception\RuntimeException', 'The process has been signaled with signal "9".');
        $process->wait();
    }

    public function testRestart()
    {
        $process1 = $this->getProcess('php -r "echo getmypid();"');
        $process1->run();
        $process2 = $process1->restart();

        $process2->wait(); // wait for output

        // Ensure that both processed finished and the output is numeric
        $this->assertFalse($process1->isRunning());
        $this->assertFalse($process2->isRunning());
        $this->assertTrue(is_numeric($process1->getOutput()));
        $this->assertTrue(is_numeric($process2->getOutput()));

        // Ensure that restart returned a new process by check that the output is different
        $this->assertNotEquals($process1->getOutput(), $process2->getOutput());
    }

    public function testPhpDeadlock()
    {
        $this->markTestSkipped('Can course PHP to hang');

        // Sleep doesn't work as it will allow the process to handle signals and close
        // file handles from the other end.
        $process = $this->getProcess('php -r "while (true) {}"');
        $process->start();

        // PHP will deadlock when it tries to cleanup $process
    }

    public function testRunProcessWithTimeout()
    {
        $timeout = 0.5;
        $process = $this->getProcess('php -r "usleep(600000);"');
        $process->setTimeout($timeout);
        $start = microtime(true);
        try {
            $process->run();
            $this->fail('A RuntimeException should have been raised');
        } catch (RuntimeException $e) {

        }
        $duration = microtime(true) - $start;

        $this->assertLessThan($timeout + Process::TIMEOUT_PRECISION, $duration);
    }

    public function testCheckTimeoutOnNonStartedProcess()
    {
        $process = $this->getProcess('php -r "sleep(3);"');
        $process->checkTimeout();
    }

    public function testCheckTimeoutOnTerminatedProcess()
    {
        $process = $this->getProcess('php -v');
        $process->run();
        $process->checkTimeout();
    }

    public function testCheckTimeoutOnStartedProcess()
    {
        $timeout = 0.5;
        $precision = 100000;
        $process = $this->getProcess('php -r "sleep(3);"');
        $process->setTimeout($timeout);
        $start = microtime(true);

        $process->start();

        try {
            while ($process->isRunning()) {
                $process->checkTimeout();
                usleep($precision);
            }
            $this->fail('A RuntimeException should have been raised');
        } catch (RuntimeException $e) {

        }
        $duration = microtime(true) - $start;

        $this->assertLessThan($timeout + $precision, $duration);
        $this->assertFalse($process->isSuccessful());
    }

    /**
     * @group idle-timeout
     */
    public function testIdleTimeout()
    {
        $process = $this->getProcess('sleep 3');
        $process->setTimeout(10);
        $process->setIdleTimeout(1);

        try {
            $process->run();

            $this->fail('A timeout exception was expected.');
        } catch (ProcessTimedOutException $ex) {
            $this->assertTrue($ex->isIdleTimeout());
            $this->assertFalse($ex->isGeneralTimeout());
            $this->assertEquals(1.0, $ex->getExceededTimeout());
        }
    }

    /**
     * @group idle-timeout
     */
    public function testIdleTimeoutNotExceededWhenOutputIsSent()
    {
        $process = $this->getProcess('echo "foo" && sleep 1 && echo "foo" && sleep 1 && echo "foo" && sleep 1 && echo "foo" && sleep 5');
        $process->setTimeout(5);
        $process->setIdleTimeout(3);

        try {
            $process->run();
            $this->fail('A timeout exception was expected.');
        } catch (ProcessTimedOutException $ex) {
            $this->assertTrue($ex->isGeneralTimeout());
            $this->assertFalse($ex->isIdleTimeout());
            $this->assertEquals(5.0, $ex->getExceededTimeout());
        }
    }

    public function testStartAfterATimeout()
    {
        $process = $this->getProcess('php -r "$n = 1000; while ($n--) {echo \'\'; usleep(1000); }"');
        $process->setTimeout(0.1);
        try {
            $process->run();
            $this->fail('An exception should have been raised.');
        } catch (\Exception $e) {

        }
        $process->start();
        usleep(10000);
        $process->stop();
    }

    public function testGetPid()
    {
        $process = $this->getProcess('php -r "usleep(500000);"');
        $process->start();
        $this->assertGreaterThan(0, $process->getPid());
        $process->wait();
    }

    public function testGetPidIsNullBeforeStart()
    {
        $process = $this->getProcess('php -r "sleep(1);"');
        $this->assertNull($process->getPid());
    }

    public function testGetPidIsNullAfterRun()
    {
        $process = $this->getProcess('php -m');
        $process->run();
        $this->assertNull($process->getPid());
    }

    public function testSignal()
    {
        $this->verifyPosixIsEnabled();

        $process = $this->getProcess('exec php -f ' . __DIR__ . '/SignalListener.php');
        $process->start();
        usleep(500000);
        $process->signal(SIGUSR1);

        while ($process->isRunning() && false === strpos($process->getoutput(), 'Caught SIGUSR1')) {
            usleep(10000);
        }

        $this->assertEquals('Caught SIGUSR1', $process->getOutput());
    }

    public function testExitCodeIsAvailableAfterSignal()
    {
        $this->verifyPosixIsEnabled();

        $process = $this->getProcess('sleep 4');
        $process->start();
        $process->signal(SIGKILL);

        while ($process->isRunning()) {
            usleep(10000);
        }

        $this->assertFalse($process->isRunning());
        $this->assertTrue($process->hasBeenSignaled());
        $this->assertFalse($process->isSuccessful());
        $this->assertEquals(137, $process->getExitCode());
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\LogicException
     */
    public function testSignalProcessNotRunning()
    {
        $this->verifyPosixIsEnabled();
        $process = $this->getProcess('php -m');
        $process->signal(SIGHUP);
    }

    /**
     * @dataProvider provideMethodsThatNeedARunningProcess
     */
    public function testMethodsThatNeedARunningProcess($method)
    {
        $process = $this->getProcess('php -m');
        $this->setExpectedException('Symfony\Component\Process\Exception\LogicException', sprintf('Process must be started before calling %s.', $method));
        call_user_func(array($process, $method));
    }

    public function provideMethodsThatNeedARunningProcess()
    {
        return array(
            array('getOutput'),
            array('getIncrementalOutput'),
            array('getErrorOutput'),
            array('getIncrementalErrorOutput'),
            array('wait'),
        );
    }

    /**
     * @dataProvider provideMethodsThatNeedATerminatedProcess
     */
    public function testMethodsThatNeedATerminatedProcess($method)
    {
        $process = $this->getProcess('php -r "sleep(1);"');
        $process->start();
        try {
            call_user_func(array($process, $method));
            $process->stop(0);
            $this->fail('A LogicException must have been thrown');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\Process\Exception\LogicException', $e);
            $this->assertEquals(sprintf('Process must be terminated before calling %s.', $method), $e->getMessage());
        }
        $process->stop(0);
    }

    public function provideMethodsThatNeedATerminatedProcess()
    {
        return array(
            array('hasBeenSignaled'),
            array('getTermSignal'),
            array('hasBeenStopped'),
            array('getStopSignal'),
        );
    }

    private function verifyPosixIsEnabled()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('POSIX signals do not work on Windows');
        }
        if (!defined('SIGUSR1')) {
            $this->markTestSkipped('The pcntl extension is not enabled');
        }
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     */
    public function testSignalWithWrongIntSignal()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('POSIX signals do not work on Windows');
        }

        $process = $this->getProcess('php -r "sleep(3);"');
        $process->start();
        $process->signal(-4);
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     */
    public function testSignalWithWrongNonIntSignal()
    {
        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            $this->markTestSkipped('POSIX signals do not work on Windows');
        }

        $process = $this->getProcess('php -r "sleep(3);"');
        $process->start();
        $process->signal('Céphalopodes');
    }

    public function responsesCodeProvider()
    {
        return array(
            //expected output / getter / code to execute
            //array(1,'getExitCode','exit(1);'),
            //array(true,'isSuccessful','exit();'),
            array('output', 'getOutput', 'echo \'output\';'),
        );
    }

    public function pipesCodeProvider()
    {
        $variations = array(
            'fwrite(STDOUT, $in = file_get_contents(\'php://stdin\')); fwrite(STDERR, $in);',
            'include \''.__DIR__.'/PipeStdinInStdoutStdErrStreamSelect.php\';',
        );

        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
            // Avoid XL buffers on Windows because of https://bugs.php.net/bug.php?id=65650
            $sizes = array(1, 2, 4, 8);
        } else {
            $sizes = array(1, 16, 64, 1024, 4096);
        }

        $codes = array();
        foreach ($sizes as $size) {
            foreach ($variations as $code) {
                $codes[] = array($code, $size);
            }
        }

        return $codes;
    }

    /**
     * provides default method names for simple getter/setter
     */
    public function methodProvider()
    {
        $defaults = array(
            array('CommandLine'),
            array('Timeout'),
            array('WorkingDirectory'),
            array('Env'),
            array('Stdin'),
            array('Options')
        );

        return $defaults;
    }

    /**
     * @param string  $commandline
     * @param null    $cwd
     * @param array   $env
     * @param null    $stdin
     * @param integer $timeout
     * @param array   $options
     *
     * @return Process
     */
    abstract protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array());
}
PK�b�\x[��Dpear/test/Process/Symfony/Component/Process/Tests/PhpProcessTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Tests;

use Symfony\Component\Process\PhpProcess;

class PhpProcessTest extends \PHPUnit_Framework_TestCase
{
    public function testNonBlockingWorks()
    {
        $expected = 'hello world!';
        $process = new PhpProcess(<<<PHP
<?php echo '$expected';
PHP
        );
        $process->start();
        $process->wait();
        $this->assertEquals($expected, $process->getOutput());
    }
}
PK�b�\#�Ypear/test/Process/Symfony/Component/Process/Tests/PipeStdinInStdoutStdErrStreamSelect.phpnu�[���<?php

define('ERR_SELECT_FAILED', 1);
define('ERR_TIMEOUT', 2);
define('ERR_READ_FAILED', 3);
define('ERR_WRITE_FAILED', 4);

$read = array(STDIN);
$write = array(STDOUT, STDERR);

stream_set_blocking(STDIN, 0);
stream_set_blocking(STDOUT, 0);
stream_set_blocking(STDERR, 0);

$out = $err = '';
while ($read || $write) {
    $r = $read;
    $w = $write;
    $e = null;
    $n = stream_select($r, $w, $e, 5);

    if (false === $n) {
        die(ERR_SELECT_FAILED);
    } elseif ($n < 1) {
        die(ERR_TIMEOUT);
    }

    if (in_array(STDOUT, $w) && strlen($out) > 0) {
         $written = fwrite(STDOUT, (binary) $out, 32768);
         if (false === $written) {
             die(ERR_WRITE_FAILED);
         }
         $out = (binary) substr($out, $written);
    }
    if (null === $read && strlen($out) < 1) {
        $write = array_diff($write, array(STDOUT));
    }

    if (in_array(STDERR, $w) && strlen($err) > 0) {
         $written = fwrite(STDERR, (binary) $err, 32768);
         if (false === $written) {
             die(ERR_WRITE_FAILED);
         }
         $err = (binary) substr($err, $written);
    }
    if (null === $read && strlen($err) < 1) {
        $write = array_diff($write, array(STDERR));
    }

    if ($r) {
        $str = fread(STDIN, 32768);
        if (false !== $str) {
            $out .= $str;
            $err .= $str;
        }
        if (false === $str || feof(STDIN)) {
            $read = null;
            if (!feof(STDIN)) {
                die(ERR_READ_FAILED);
            }
        }
    }
}
PK�b�\����Qpear/test/Process/Symfony/Component/Process/Tests/SigchildDisabledProcessTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Tests;

class SigchildDisabledProcessTest extends AbstractProcessTest
{
    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testGetExitCode()
    {
        parent::testGetExitCode();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testGetExitCodeIsNullOnStart()
    {
        parent::testGetExitCodeIsNullOnStart();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testGetExitCodeIsNullOnWhenStartingAgain()
    {
        parent::testGetExitCodeIsNullOnWhenStartingAgain();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testExitCodeCommandFailed()
    {
        parent::testExitCodeCommandFailed();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage his PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.
     */
    public function testProcessIsSignaledIfStopped()
    {
        parent::testProcessIsSignaledIfStopped();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage his PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.
     */
    public function testProcessWithTermSignal()
    {
        parent::testProcessWithTermSignal();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage his PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.
     */
    public function testProcessIsNotSignaled()
    {
        parent::testProcessIsNotSignaled();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage his PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.
     */
    public function testProcessWithoutTermSignal()
    {
        parent::testProcessWithoutTermSignal();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testCheckTimeoutOnStartedProcess()
    {
        parent::testCheckTimeoutOnStartedProcess();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. The process identifier can not be retrieved.
     */
    public function testGetPid()
    {
        parent::testGetPid();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. The process identifier can not be retrieved.
     */
    public function testGetPidIsNullBeforeStart()
    {
        parent::testGetPidIsNullBeforeStart();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. The process identifier can not be retrieved.
     */
    public function testGetPidIsNullAfterRun()
    {
        parent::testGetPidIsNullAfterRun();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testExitCodeText()
    {
        $process = $this->getProcess('qdfsmfkqsdfmqmsd');
        $process->run();

        $process->getExitCodeText();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testExitCodeTextIsNullWhenExitCodeIsNull()
    {
        parent::testExitCodeTextIsNullWhenExitCodeIsNull();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testIsSuccessful()
    {
        parent::testIsSuccessful();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testIsSuccessfulOnlyAfterTerminated()
    {
        parent::testIsSuccessfulOnlyAfterTerminated();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testIsNotSuccessful()
    {
        parent::testIsNotSuccessful();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.
     */
    public function testTTYCommandExitCode()
    {
        parent::testTTYCommandExitCode();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. The process can not be signaled.
     */
    public function testSignal()
    {
        parent::testSignal();
    }

    /**
     * @expectedException \Symfony\Component\Process\Exception\RuntimeException
     * @expectedExceptionMessage This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.
     */
    public function testProcessWithoutTermSignalIsNotSignaled()
    {
        parent::testProcessWithoutTermSignalIsNotSignaled();
    }

    public function testStopWithTimeoutIsActuallyWorking()
    {
        $this->markTestSkipped('Stopping with signal is not supported in sigchild environment');
    }

    public function testProcessThrowsExceptionWhenExternallySignaled()
    {
        $this->markTestSkipped('Retrieving Pid is not supported in sigchild environment');
    }

    public function testExitCodeIsAvailableAfterSignal()
    {
        $this->markTestSkipped('Signal is not supported in sigchild environment');
    }

    /**
     * {@inheritdoc}
     */
    protected function getProcess($commandline, $cwd = null, array $env = null, $stdin = null, $timeout = 60, array $options = array())
    {
        $process = new ProcessInSigchildEnvironment($commandline, $cwd, $env, $stdin, $timeout, $options);
        $process->setEnhanceSigchildCompatibility(false);

        return $process;
    }
}
PK�b�\�WKo�
�
Ppear/test/Process/Symfony/Component/Process/Tests/ProcessFailedExceptionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Process\Tests;

use Symfony\Component\Process\Exception\ProcessFailedException;

/**
 * @author Sebastian Marek <proofek@gmail.com>
 */
class ProcessFailedExceptionTest extends \PHPUnit_Framework_TestCase
{
    /**
     * tests ProcessFailedException throws exception if the process was successful
     */
    public function testProcessFailedExceptionThrowsException()
    {
        $process = $this->getMock(
            'Symfony\Component\Process\Process',
            array('isSuccessful'),
            array('php')
        );
        $process->expects($this->once())
            ->method('isSuccessful')
            ->will($this->returnValue(true));

        $this->setExpectedException(
            '\InvalidArgumentException',
            'Expected a failed process, but the given process was successful.'
        );

        new ProcessFailedException($process);
    }

    /**
     * tests ProcessFailedException uses information from process output
     * to generate exception message
     */
    public function testProcessFailedExceptionPopulatesInformationFromProcessOutput()
    {
        $cmd = 'php';
        $exitCode = 1;
        $exitText = 'General error';
        $output = "Command output";
        $errorOutput = "FATAL: Unexpected error";

        $process = $this->getMock(
            'Symfony\Component\Process\Process',
            array('isSuccessful', 'getOutput', 'getErrorOutput', 'getExitCode', 'getExitCodeText'),
            array($cmd)
        );
        $process->expects($this->once())
            ->method('isSuccessful')
            ->will($this->returnValue(false));
        $process->expects($this->once())
            ->method('getOutput')
            ->will($this->returnValue($output));
        $process->expects($this->once())
            ->method('getErrorOutput')
            ->will($this->returnValue($errorOutput));
        $process->expects($this->once())
            ->method('getExitCode')
            ->will($this->returnValue($exitCode));
        $process->expects($this->once())
            ->method('getExitCodeText')
            ->will($this->returnValue($exitText));

        $exception = new ProcessFailedException($process);

        $this->assertEquals(
            "The command \"$cmd\" failed.\nExit Code: $exitCode($exitText)\n\nOutput:\n================\n{$output}\n\nError Output:\n================\n{$errorOutput}",
            $exception->getMessage()
        );
    }
}
PK�b�\�p6llBpear/test/BrowserKit/Symfony/Component/BrowserKit/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony BrowserKit Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\�ɹ(RRFpear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/CookieTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit\Tests;

use Symfony\Component\BrowserKit\Cookie;

class CookieTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getTestsForToFromString
     */
    public function testToFromString($cookie, $url = null)
    {
        $this->assertEquals($cookie, (string) Cookie::fromString($cookie, $url));
    }

    public function getTestsForToFromString()
    {
        return array(
            array('foo=bar; path=/'),
            array('foo=bar; path=/foo'),
            array('foo=bar; domain=google.com; path=/'),
            array('foo=bar; domain=example.com; path=/; secure', 'https://example.com/'),
            array('foo=bar; path=/; httponly'),
            array('foo=bar; domain=google.com; path=/foo; secure; httponly', 'https://google.com/'),
            array('foo=bar=baz; path=/'),
            array('foo=bar%3Dbaz; path=/'),
        );
    }

    public function testFromStringIgnoreSecureFlag()
    {
        $this->assertFalse(Cookie::fromString('foo=bar; secure')->isSecure());
        $this->assertFalse(Cookie::fromString('foo=bar; secure', 'http://example.com/')->isSecure());
    }

    /**
     * @dataProvider getExpireCookieStrings
     */
    public function testFromStringAcceptsSeveralExpiresDateFormats($cookie)
    {
        $this->assertEquals(1596185377, Cookie::fromString($cookie)->getExpiresTime());
    }

    public function getExpireCookieStrings()
    {
        return array(
            array('foo=bar; expires=Fri, 31-Jul-2020 08:49:37 GMT'),
            array('foo=bar; expires=Fri, 31 Jul 2020 08:49:37 GMT'),
            array('foo=bar; expires=Fri, 31-07-2020 08:49:37 GMT'),
            array('foo=bar; expires=Fri, 31-07-20 08:49:37 GMT'),
            array('foo=bar; expires=Friday, 31-Jul-20 08:49:37 GMT'),
            array('foo=bar; expires=Fri Jul 31 08:49:37 2020'),
            array('foo=bar; expires=\'Fri Jul 31 08:49:37 2020\''),
            array('foo=bar; expires=Friday July 31st 2020, 08:49:37 GMT'),
        );
    }

    public function testFromStringWithCapitalization()
    {
        $this->assertEquals('Foo=Bar; path=/', (string) Cookie::fromString('Foo=Bar'));
        $this->assertEquals('foo=bar; expires=Fri, 31 Dec 2010 23:59:59 GMT; path=/', (string) Cookie::fromString('foo=bar; Expires=Fri, 31 Dec 2010 23:59:59 GMT'));
        $this->assertEquals('foo=bar; domain=www.example.org; path=/; httponly', (string) Cookie::fromString('foo=bar; DOMAIN=www.example.org; HttpOnly'));
    }

    public function testFromStringWithUrl()
    {
        $this->assertEquals('foo=bar; domain=www.example.com; path=/', (string) Cookie::FromString('foo=bar', 'http://www.example.com/'));
        $this->assertEquals('foo=bar; domain=www.example.com; path=/foo', (string) Cookie::FromString('foo=bar', 'http://www.example.com/foo/bar'));
        $this->assertEquals('foo=bar; domain=www.example.com; path=/', (string) Cookie::FromString('foo=bar; path=/', 'http://www.example.com/foo/bar'));
        $this->assertEquals('foo=bar; domain=www.myotherexample.com; path=/', (string) Cookie::FromString('foo=bar; domain=www.myotherexample.com', 'http://www.example.com/'));
    }

    public function testFromStringThrowsAnExceptionIfCookieIsNotValid()
    {
        $this->setExpectedException('InvalidArgumentException');
        Cookie::FromString('foo');
    }

    public function testFromStringThrowsAnExceptionIfCookieDateIsNotValid()
    {
        $this->setExpectedException('InvalidArgumentException');
        Cookie::FromString('foo=bar; expires=Flursday July 31st 2020, 08:49:37 GMT');
    }

    public function testFromStringThrowsAnExceptionIfUrlIsNotValid()
    {
        $this->setExpectedException('InvalidArgumentException');
        Cookie::FromString('foo=bar', 'foobar');
    }

    public function testGetName()
    {
        $cookie = new Cookie('foo', 'bar');
        $this->assertEquals('foo', $cookie->getName(), '->getName() returns the cookie name');
    }

    public function testGetValue()
    {
        $cookie = new Cookie('foo', 'bar');
        $this->assertEquals('bar', $cookie->getValue(), '->getValue() returns the cookie value');

        $cookie = new Cookie('foo', 'bar%3Dbaz', null, '/', '', false, true, true); // raw value
        $this->assertEquals('bar=baz', $cookie->getValue(), '->getValue() returns the urldecoded cookie value');
    }

    public function testGetRawValue()
    {
        $cookie = new Cookie('foo', 'bar=baz'); // decoded value
        $this->assertEquals('bar%3Dbaz', $cookie->getRawValue(), '->getRawValue() returns the urlencoded cookie value');
        $cookie = new Cookie('foo', 'bar%3Dbaz', null, '/', '', false, true, true); // raw value
        $this->assertEquals('bar%3Dbaz', $cookie->getRawValue(), '->getRawValue() returns the non-urldecoded cookie value');
    }

    public function testGetPath()
    {
        $cookie = new Cookie('foo', 'bar', 0);
        $this->assertEquals('/', $cookie->getPath(), '->getPath() returns / is no path is defined');

        $cookie = new Cookie('foo', 'bar', 0, '/foo');
        $this->assertEquals('/foo', $cookie->getPath(), '->getPath() returns the cookie path');
    }

    public function testGetDomain()
    {
        $cookie = new Cookie('foo', 'bar', 0, '/', 'foo.com');
        $this->assertEquals('foo.com', $cookie->getDomain(), '->getDomain() returns the cookie domain');
    }

    public function testIsSecure()
    {
        $cookie = new Cookie('foo', 'bar');
        $this->assertFalse($cookie->isSecure(), '->isSecure() returns false if not defined');

        $cookie = new Cookie('foo', 'bar', 0, '/', 'foo.com', true);
        $this->assertTrue($cookie->isSecure(), '->isSecure() returns the cookie secure flag');
    }

    public function testIsHttponly()
    {
        $cookie = new Cookie('foo', 'bar');
        $this->assertTrue($cookie->isHttpOnly(), '->isHttpOnly() returns false if not defined');

        $cookie = new Cookie('foo', 'bar', 0, '/', 'foo.com', false, true);
        $this->assertTrue($cookie->isHttpOnly(), '->isHttpOnly() returns the cookie httponly flag');
    }

    public function testGetExpiresTime()
    {
        $cookie = new Cookie('foo', 'bar');
        $this->assertNull($cookie->getExpiresTime(), '->getExpiresTime() returns the expires time');

        $cookie = new Cookie('foo', 'bar', $time = time() - 86400);
        $this->assertEquals($time, $cookie->getExpiresTime(), '->getExpiresTime() returns the expires time');
    }

    public function testIsExpired()
    {
        $cookie = new Cookie('foo', 'bar');
        $this->assertFalse($cookie->isExpired(), '->isExpired() returns false when the cookie never expires (null as expires time)');

        $cookie = new Cookie('foo', 'bar', time() - 86400);
        $this->assertTrue($cookie->isExpired(), '->isExpired() returns true when the cookie is expired');

        $cookie = new Cookie('foo', 'bar', 0);
        $this->assertFalse($cookie->isExpired());
    }
}
PK�b�\K����Gpear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/HistoryTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit\Tests;

use Symfony\Component\BrowserKit\History;
use Symfony\Component\BrowserKit\Request;

class HistoryTest extends \PHPUnit_Framework_TestCase
{
    public function testAdd()
    {
        $history = new History();
        $history->add(new Request('http://www.example1.com/', 'get'));
        $this->assertSame('http://www.example1.com/', $history->current()->getUri(), '->add() adds a request to the history');

        $history->add(new Request('http://www.example2.com/', 'get'));
        $this->assertSame('http://www.example2.com/', $history->current()->getUri(), '->add() adds a request to the history');

        $history->add(new Request('http://www.example3.com/', 'get'));
        $history->back();
        $history->add(new Request('http://www.example4.com/', 'get'));
        $this->assertSame('http://www.example4.com/', $history->current()->getUri(), '->add() adds a request to the history');

        $history->back();
        $this->assertSame('http://www.example2.com/', $history->current()->getUri(), '->add() adds a request to the history');
    }

    public function testClearIsEmpty()
    {
        $history = new History();
        $history->add(new Request('http://www.example.com/', 'get'));

        $this->assertFalse($history->isEmpty(), '->isEmpty() returns false if the history is not empty');

        $history->clear();

        $this->assertTrue($history->isEmpty(), '->isEmpty() true if the history is empty');
    }

    public function testCurrent()
    {
        $history = new History();

        try {
            $history->current();
            $this->fail('->current() throws a \LogicException if the history is empty');
        } catch (\Exception $e) {
            $this->assertInstanceof('LogicException', $e, '->current() throws a \LogicException if the history is empty');
        }

        $history->add(new Request('http://www.example.com/', 'get'));

        $this->assertSame('http://www.example.com/', $history->current()->getUri(), '->current() returns the current request in the history');
    }

    public function testBack()
    {
        $history = new History();
        $history->add(new Request('http://www.example.com/', 'get'));

        try {
            $history->back();
            $this->fail('->back() throws a \LogicException if the history is already on the first page');
        } catch (\Exception $e) {
            $this->assertInstanceof('LogicException', $e, '->current() throws a \LogicException if the history is already on the first page');
        }

        $history->add(new Request('http://www.example1.com/', 'get'));
        $history->back();

        $this->assertSame('http://www.example.com/', $history->current()->getUri(), '->back() returns the previous request in the history');
    }

    public function testForward()
    {
        $history = new History();
        $history->add(new Request('http://www.example.com/', 'get'));
        $history->add(new Request('http://www.example1.com/', 'get'));

        try {
            $history->forward();
            $this->fail('->forward() throws a \LogicException if the history is already on the last page');
        } catch (\Exception $e) {
            $this->assertInstanceof('LogicException', $e, '->forward() throws a \LogicException if the history is already on the last page');
        }

        $history->back();
        $history->forward();

        $this->assertSame('http://www.example1.com/', $history->current()->getUri(), '->forward() returns the next request in the history');
    }
}
PK�b�\{2�wHpear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/ResponseTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit\Tests;

use Symfony\Component\BrowserKit\Response;

class ResponseTest extends \PHPUnit_Framework_TestCase
{
    public function testGetUri()
    {
        $response = new Response('foo');
        $this->assertEquals('foo', $response->getContent(), '->getContent() returns the content of the response');
    }

    public function testGetStatus()
    {
        $response = new Response('foo', 304);
        $this->assertEquals('304', $response->getStatus(), '->getStatus() returns the status of the response');
    }

    public function testGetHeaders()
    {
        $response = new Response('foo', 200, array('foo' => 'bar'));
        $this->assertEquals(array('foo' => 'bar'), $response->getHeaders(), '->getHeaders() returns the headers of the response');
    }

    public function testGetHeader()
    {
        $response = new Response('foo', 200, array(
            'Content-Type' => 'text/html',
            'Set-Cookie'   => array('foo=bar', 'bar=foo'),
        ));

        $this->assertEquals('text/html', $response->getHeader('Content-Type'), '->getHeader() returns a header of the response');
        $this->assertEquals('text/html', $response->getHeader('content-type'), '->getHeader() returns a header of the response');
        $this->assertEquals('text/html', $response->getHeader('content_type'), '->getHeader() returns a header of the response');
        $this->assertEquals('foo=bar', $response->getHeader('Set-Cookie'), '->getHeader() returns the first header value');
        $this->assertEquals(array('foo=bar', 'bar=foo'), $response->getHeader('Set-Cookie', false), '->getHeader() returns all header values if first is false');

        $this->assertNull($response->getHeader('foo'), '->getHeader() returns null if the header is not defined');
        $this->assertEquals(array(), $response->getHeader('foo', false), '->getHeader() returns an empty array if the header is not defined and first is set to false');
    }

    public function testMagicToString()
    {
        $response = new Response('foo', 304, array('foo' => 'bar'));

        $this->assertEquals("foo: bar\n\nfoo", $response->__toString(), '->__toString() returns the headers and the content as a string');
    }

    public function testMagicToStringWithMultipleSetCookieHeader()
    {
        $headers = array(
            'content-type' => 'text/html; charset=utf-8',
            'set-cookie'   => array('foo=bar', 'bar=foo')
        );

        $expected = 'content-type: text/html; charset=utf-8'."\n";
        $expected.= 'set-cookie: foo=bar'."\n";
        $expected.= 'set-cookie: bar=foo'."\n\n";
        $expected.= 'foo';

        $response = new Response('foo', 304, $headers);

        $this->assertEquals($expected, $response->__toString(), '->__toString() returns the headers and the content as a string');
    }
}
PK�b�\��J=�'�'Ipear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/CookieJarTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit\Tests;

use Symfony\Component\BrowserKit\CookieJar;
use Symfony\Component\BrowserKit\Cookie;
use Symfony\Component\BrowserKit\Response;

class CookieJarTest extends \PHPUnit_Framework_TestCase
{
    public function testSetGet()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie = new Cookie('foo', 'bar'));

        $this->assertEquals($cookie, $cookieJar->get('foo'), '->set() sets a cookie');

        $this->assertNull($cookieJar->get('foobar'), '->get() returns null if the cookie does not exist');

        $cookieJar->set($cookie = new Cookie('foo', 'bar', time() - 86400));
        $this->assertNull($cookieJar->get('foo'), '->get() returns null if the cookie is expired');
    }

    public function testExpire()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie = new Cookie('foo', 'bar'));
        $cookieJar->expire('foo');
        $this->assertNull($cookieJar->get('foo'), '->get() returns null if the cookie is expired');
    }

    public function testAll()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie1 = new Cookie('foo', 'bar'));
        $cookieJar->set($cookie2 = new Cookie('bar', 'foo'));

        $this->assertEquals(array($cookie1, $cookie2), $cookieJar->all(), '->all() returns all cookies in the jar');
    }

    public function testClear()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie1 = new Cookie('foo', 'bar'));
        $cookieJar->set($cookie2 = new Cookie('bar', 'foo'));

        $cookieJar->clear();

        $this->assertEquals(array(), $cookieJar->all(), '->clear() expires all cookies');
    }

    public function testUpdateFromResponse()
    {
        $response = new Response('', 200, array('Set-Cookie' => 'foo=foo'));

        $cookieJar = new CookieJar();
        $cookieJar->updateFromResponse($response);

        $this->assertEquals('foo', $cookieJar->get('foo')->getValue(), '->updateFromResponse() updates cookies from a Response objects');
    }

    public function testUpdateFromSetCookie()
    {
        $setCookies = array('foo=foo');

        $cookieJar = new CookieJar();
        $cookieJar->set(new Cookie('bar', 'bar'));
        $cookieJar->updateFromSetCookie($setCookies);

        $this->assertInstanceOf('Symfony\Component\BrowserKit\Cookie', $cookieJar->get('foo'));
        $this->assertInstanceOf('Symfony\Component\BrowserKit\Cookie', $cookieJar->get('bar'));
        $this->assertEquals('foo', $cookieJar->get('foo')->getValue(), '->updateFromSetCookie() updates cookies from a Set-Cookie header');
        $this->assertEquals('bar', $cookieJar->get('bar')->getValue(), '->updateFromSetCookie() keeps existing cookies');
    }

    public function testUpdateFromEmptySetCookie()
    {
        $cookieJar = new CookieJar();
        $cookieJar->updateFromSetCookie(array(''));
        $this->assertEquals(array(), $cookieJar->all());
    }

    public function testUpdateFromSetCookieWithMultipleCookies()
    {
        $timestamp = time() + 3600;
        $date = gmdate('D, d M Y H:i:s \G\M\T', $timestamp);
        $setCookies = array(sprintf('foo=foo; expires=%s; domain=.symfony.com; path=/, bar=bar; domain=.blog.symfony.com, PHPSESSID=id; expires=%s', $date, $date));

        $cookieJar = new CookieJar();
        $cookieJar->updateFromSetCookie($setCookies);

        $fooCookie = $cookieJar->get('foo', '/', '.symfony.com');
        $barCookie = $cookieJar->get('bar', '/', '.blog.symfony.com');
        $phpCookie = $cookieJar->get('PHPSESSID');

        $this->assertInstanceOf('Symfony\Component\BrowserKit\Cookie', $fooCookie);
        $this->assertInstanceOf('Symfony\Component\BrowserKit\Cookie', $barCookie);
        $this->assertInstanceOf('Symfony\Component\BrowserKit\Cookie', $phpCookie);
        $this->assertEquals('foo', $fooCookie->getValue());
        $this->assertEquals('bar', $barCookie->getValue());
        $this->assertEquals('id', $phpCookie->getValue());
        $this->assertEquals($timestamp, $fooCookie->getExpiresTime());
        $this->assertNull($barCookie->getExpiresTime());
        $this->assertEquals($timestamp, $phpCookie->getExpiresTime());
    }

    /**
     * @dataProvider provideAllValuesValues
     */
    public function testAllValues($uri, $values)
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie1 = new Cookie('foo_nothing', 'foo'));
        $cookieJar->set($cookie2 = new Cookie('foo_expired', 'foo', time() - 86400));
        $cookieJar->set($cookie3 = new Cookie('foo_path', 'foo', null, '/foo'));
        $cookieJar->set($cookie4 = new Cookie('foo_domain', 'foo', null, '/', '.example.com'));
        $cookieJar->set($cookie4 = new Cookie('foo_strict_domain', 'foo', null, '/', '.www4.example.com'));
        $cookieJar->set($cookie5 = new Cookie('foo_secure', 'foo', null, '/', '', true));

        $this->assertEquals($values, array_keys($cookieJar->allValues($uri)), '->allValues() returns the cookie for a given URI');
    }

    public function provideAllValuesValues()
    {
        return array(
            array('http://www.example.com', array('foo_nothing', 'foo_domain')),
            array('http://www.example.com/', array('foo_nothing', 'foo_domain')),
            array('http://foo.example.com/', array('foo_nothing', 'foo_domain')),
            array('http://foo.example1.com/', array('foo_nothing')),
            array('https://foo.example.com/', array('foo_nothing', 'foo_secure', 'foo_domain')),
            array('http://www.example.com/foo/bar', array('foo_nothing', 'foo_path', 'foo_domain')),
            array('http://www4.example.com/', array('foo_nothing', 'foo_domain', 'foo_strict_domain')),
        );
    }

    public function testEncodedValues()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie = new Cookie('foo', 'bar%3Dbaz', null, '/', '', false, true, true));

        $this->assertEquals(array('foo' => 'bar=baz'), $cookieJar->allValues('/'));
        $this->assertEquals(array('foo' => 'bar%3Dbaz'), $cookieJar->allRawValues('/'));
    }

    public function testCookieExpireWithSameNameButDifferentPaths()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie1 = new Cookie('foo', 'bar1', null, '/foo'));
        $cookieJar->set($cookie2 = new Cookie('foo', 'bar2', null, '/bar'));
        $cookieJar->expire('foo', '/foo');

        $this->assertNull($cookieJar->get('foo'), '->get() returns null if the cookie is expired');
        $this->assertEquals(array(), array_keys($cookieJar->allValues('http://example.com/')));
        $this->assertEquals(array(), $cookieJar->allValues('http://example.com/foo'));
        $this->assertEquals(array('foo' => 'bar2'), $cookieJar->allValues('http://example.com/bar'));
    }

    public function testCookieExpireWithNullPaths()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie1 = new Cookie('foo', 'bar1', null, '/'));
        $cookieJar->expire('foo', null);

        $this->assertNull($cookieJar->get('foo'), '->get() returns null if the cookie is expired');
        $this->assertEquals(array(), array_keys($cookieJar->allValues('http://example.com/')));
    }

    public function testCookieWithSameNameButDifferentPaths()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie1 = new Cookie('foo', 'bar1', null, '/foo'));
        $cookieJar->set($cookie2 = new Cookie('foo', 'bar2', null, '/bar'));

        $this->assertEquals(array(), array_keys($cookieJar->allValues('http://example.com/')));
        $this->assertEquals(array('foo' => 'bar1'), $cookieJar->allValues('http://example.com/foo'));
        $this->assertEquals(array('foo' => 'bar2'), $cookieJar->allValues('http://example.com/bar'));
    }

    public function testCookieWithSameNameButDifferentDomains()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie1 = new Cookie('foo', 'bar1', null, '/', 'foo.example.com'));
        $cookieJar->set($cookie2 = new Cookie('foo', 'bar2', null, '/', 'bar.example.com'));

        $this->assertEquals(array(), array_keys($cookieJar->allValues('http://example.com/')));
        $this->assertEquals(array('foo' => 'bar1'), $cookieJar->allValues('http://foo.example.com/'));
        $this->assertEquals(array('foo' => 'bar2'), $cookieJar->allValues('http://bar.example.com/'));
    }

    public function testCookieGetWithSubdomain()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie1 = new Cookie('foo', 'bar', null, '/', '.example.com'));
        $cookieJar->set($cookie2 = new Cookie('foo1', 'bar', null, '/', 'test.example.com'));

        $this->assertEquals($cookie1, $cookieJar->get('foo','/','foo.example.com'));
        $this->assertEquals($cookie1, $cookieJar->get('foo','/','example.com'));
        $this->assertEquals($cookie2, $cookieJar->get('foo1','/','test.example.com'));
    }

    public function testCookieGetWithSubdirectory()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set($cookie1 = new Cookie('foo', 'bar', null, '/test', '.example.com'));
        $cookieJar->set($cookie2 = new Cookie('foo1', 'bar1', null, '/', '.example.com'));

        $this->assertNull($cookieJar->get('foo','/','.example.com'));
        $this->assertNull($cookieJar->get('foo','/bar','.example.com'));
        $this->assertEquals($cookie1, $cookieJar->get('foo','/test','example.com'));
        $this->assertEquals($cookie2, $cookieJar->get('foo1','/','example.com'));
        $this->assertEquals($cookie2, $cookieJar->get('foo1','/bar','example.com'));
    }

    public function testCookieWithWildcardDomain()
    {
        $cookieJar = new CookieJar();
        $cookieJar->set(new Cookie('foo', 'bar', null, '/', '.example.com'));

        $this->assertEquals(array('foo' => 'bar'), $cookieJar->allValues('http://www.example.com'));
        $this->assertEmpty($cookieJar->allValues('http://wwwexample.com'));
    }
}
PK�b�\N�4Z�c�cFpear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/ClientTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit\Tests;

use Symfony\Component\BrowserKit\Client;
use Symfony\Component\BrowserKit\History;
use Symfony\Component\BrowserKit\CookieJar;
use Symfony\Component\BrowserKit\Request;
use Symfony\Component\BrowserKit\Response;

class SpecialResponse extends Response
{
}

class TestClient extends Client
{
    protected $nextResponse = null;
    protected $nextScript = null;

    public function setNextResponse(Response $response)
    {
        $this->nextResponse = $response;
    }

    public function setNextScript($script)
    {
        $this->nextScript = $script;
    }

    protected function doRequest($request)
    {
        if (null === $this->nextResponse) {
            return new Response();
        }

        $response = $this->nextResponse;
        $this->nextResponse = null;

        return $response;
    }

    protected function filterResponse($response)
    {
        if ($response instanceof SpecialResponse) {
            return new Response($response->getContent(), $response->getStatus(), $response->getHeaders());
        }

        return $response;
    }

    protected function getScript($request)
    {
        $r = new \ReflectionClass('Symfony\Component\BrowserKit\Response');
        $path = $r->getFileName();

        return <<<EOF
<?php

require_once('$path');

echo serialize($this->nextScript);
EOF;
    }
}

class ClientTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\BrowserKit\Client::getHistory
     */
    public function testGetHistory()
    {
        $client = new TestClient(array(), $history = new History());
        $this->assertSame($history, $client->getHistory(), '->getHistory() returns the History');
    }

    /**
     * @covers Symfony\Component\BrowserKit\Client::getCookieJar
     */
    public function testGetCookieJar()
    {
        $client = new TestClient(array(), null, $cookieJar = new CookieJar());
        $this->assertSame($cookieJar, $client->getCookieJar(), '->getCookieJar() returns the CookieJar');
    }

    /**
     * @covers Symfony\Component\BrowserKit\Client::getRequest
     */
    public function testGetRequest()
    {
        $client = new TestClient();
        $client->request('GET', 'http://example.com/');

        $this->assertEquals('http://example.com/', $client->getRequest()->getUri(), '->getCrawler() returns the Request of the last request');
    }

    public function testGetResponse()
    {
        $client = new TestClient();
        $client->setNextResponse(new Response('foo'));
        $client->request('GET', 'http://example.com/');

        $this->assertEquals('foo', $client->getResponse()->getContent(), '->getCrawler() returns the Response of the last request');
        $this->assertInstanceOf('Symfony\Component\BrowserKit\Response', $client->getResponse(), '->getCrawler() returns the Response of the last request');
    }

    public function testGetInternalResponse()
    {
        $client = new TestClient();
        $client->setNextResponse(new SpecialResponse('foo'));
        $client->request('GET', 'http://example.com/');

        $this->assertInstanceOf('Symfony\Component\BrowserKit\Response', $client->getInternalResponse());
        $this->assertNotInstanceOf('Symfony\Component\BrowserKit\Tests\SpecialResponse', $client->getInternalResponse());
        $this->assertInstanceOf('Symfony\Component\BrowserKit\Tests\SpecialResponse', $client->getResponse());
    }

    public function testGetContent()
    {
        $json = '{"jsonrpc":"2.0","method":"echo","id":7,"params":["Hello World"]}';

        $client = new TestClient();
        $client->request('POST', 'http://example.com/jsonrpc', array(), array(), array(), $json);
        $this->assertEquals($json, $client->getRequest()->getContent());
    }

    /**
     * @covers Symfony\Component\BrowserKit\Client::getCrawler
     */
    public function testGetCrawler()
    {
        $client = new TestClient();
        $client->setNextResponse(new Response('foo'));
        $crawler = $client->request('GET', 'http://example.com/');

        $this->assertSame($crawler, $client->getCrawler(), '->getCrawler() returns the Crawler of the last request');
    }

    public function testRequestHttpHeaders()
    {
        $client = new TestClient();
        $client->request('GET', '/');
        $headers = $client->getRequest()->getServer();
        $this->assertEquals('localhost', $headers['HTTP_HOST'], '->request() sets the HTTP_HOST header');

        $client = new TestClient();
        $client->request('GET', 'http://www.example.com');
        $headers = $client->getRequest()->getServer();
        $this->assertEquals('www.example.com', $headers['HTTP_HOST'], '->request() sets the HTTP_HOST header');

        $client->request('GET', 'https://www.example.com');
        $headers = $client->getRequest()->getServer();
        $this->assertTrue($headers['HTTPS'], '->request() sets the HTTPS header');

        $client = new TestClient();
        $client->request('GET', 'http://www.example.com:8080');
        $headers = $client->getRequest()->getServer();
        $this->assertEquals('www.example.com:8080', $headers['HTTP_HOST'], '->request() sets the HTTP_HOST header with port');
    }

    public function testRequestURIConversion()
    {
        $client = new TestClient();
        $client->request('GET', '/foo');
        $this->assertEquals('http://localhost/foo', $client->getRequest()->getUri(), '->request() converts the URI to an absolute one');

        $client = new TestClient();
        $client->request('GET', 'http://www.example.com');
        $this->assertEquals('http://www.example.com', $client->getRequest()->getUri(), '->request() does not change absolute URIs');

        $client = new TestClient();
        $client->request('GET', 'http://www.example.com/');
        $client->request('GET', '/foo');
        $this->assertEquals('http://www.example.com/foo', $client->getRequest()->getUri(), '->request() uses the previous request for relative URLs');

        $client = new TestClient();
        $client->request('GET', 'http://www.example.com/foo');
        $client->request('GET', '#');
        $this->assertEquals('http://www.example.com/foo#', $client->getRequest()->getUri(), '->request() uses the previous request for #');
        $client->request('GET', '#');
        $this->assertEquals('http://www.example.com/foo#', $client->getRequest()->getUri(), '->request() uses the previous request for #');
        $client->request('GET', '#foo');
        $this->assertEquals('http://www.example.com/foo#foo', $client->getRequest()->getUri(), '->request() uses the previous request for #');

        $client = new TestClient();
        $client->request('GET', 'http://www.example.com/foo/');
        $client->request('GET', 'bar');
        $this->assertEquals('http://www.example.com/foo/bar', $client->getRequest()->getUri(), '->request() uses the previous request for relative URLs');

        $client = new TestClient();
        $client->request('GET', 'http://www.example.com/foo/foobar');
        $client->request('GET', 'bar');
        $this->assertEquals('http://www.example.com/foo/bar', $client->getRequest()->getUri(), '->request() uses the previous request for relative URLs');
    }

    public function testRequestReferer()
    {
        $client = new TestClient();
        $client->request('GET', 'http://www.example.com/foo/foobar');
        $client->request('GET', 'bar');
        $server = $client->getRequest()->getServer();
        $this->assertEquals('http://www.example.com/foo/foobar', $server['HTTP_REFERER'], '->request() sets the referer');
    }

    public function testRequestHistory()
    {
        $client = new TestClient();
        $client->request('GET', 'http://www.example.com/foo/foobar');
        $client->request('GET', 'bar');

        $this->assertEquals('http://www.example.com/foo/bar', $client->getHistory()->current()->getUri(), '->request() updates the History');
        $this->assertEquals('http://www.example.com/foo/foobar', $client->getHistory()->back()->getUri(), '->request() updates the History');
    }

    public function testRequestCookies()
    {
        $client = new TestClient();
        $client->setNextResponse(new Response('<html><a href="/foo">foo</a></html>', 200, array('Set-Cookie' => 'foo=bar')));
        $client->request('GET', 'http://www.example.com/foo/foobar');
        $this->assertEquals(array('foo' => 'bar'), $client->getCookieJar()->allValues('http://www.example.com/foo/foobar'), '->request() updates the CookieJar');

        $client->request('GET', 'bar');
        $this->assertEquals(array('foo' => 'bar'), $client->getCookieJar()->allValues('http://www.example.com/foo/foobar'), '->request() updates the CookieJar');
    }

    public function testRequestSecureCookies()
    {
        $client = new TestClient();
        $client->setNextResponse(new Response('<html><a href="/foo">foo</a></html>', 200, array('Set-Cookie' => 'foo=bar; path=/; secure')));
        $client->request('GET', 'https://www.example.com/foo/foobar');

        $this->assertTrue($client->getCookieJar()->get('foo', '/', 'www.example.com')->isSecure());
    }

    public function testClick()
    {
        $client = new TestClient();
        $client->setNextResponse(new Response('<html><a href="/foo">foo</a></html>'));
        $crawler = $client->request('GET', 'http://www.example.com/foo/foobar');

        $client->click($crawler->filter('a')->link());

        $this->assertEquals('http://www.example.com/foo', $client->getRequest()->getUri(), '->click() clicks on links');
    }

    public function testClickForm()
    {
        $client = new TestClient();
        $client->setNextResponse(new Response('<html><form action="/foo"><input type="submit" /></form></html>'));
        $crawler = $client->request('GET', 'http://www.example.com/foo/foobar');

        $client->click($crawler->filter('input')->form());

        $this->assertEquals('http://www.example.com/foo', $client->getRequest()->getUri(), '->click() Form submit forms');
    }

    public function testSubmit()
    {
        $client = new TestClient();
        $client->setNextResponse(new Response('<html><form action="/foo"><input type="submit" /></form></html>'));
        $crawler = $client->request('GET', 'http://www.example.com/foo/foobar');

        $client->submit($crawler->filter('input')->form());

        $this->assertEquals('http://www.example.com/foo', $client->getRequest()->getUri(), '->submit() submit forms');
    }

    public function testSubmitPreserveAuth()
    {
        $client = new TestClient(array('PHP_AUTH_USER' => 'foo', 'PHP_AUTH_PW' => 'bar'));
        $client->setNextResponse(new Response('<html><form action="/foo"><input type="submit" /></form></html>'));
        $crawler = $client->request('GET', 'http://www.example.com/foo/foobar');

        $server = $client->getRequest()->getServer();
        $this->assertArrayHasKey('PHP_AUTH_USER', $server);
        $this->assertEquals('foo', $server['PHP_AUTH_USER']);
        $this->assertArrayHasKey('PHP_AUTH_PW', $server);
        $this->assertEquals('bar', $server['PHP_AUTH_PW']);

        $client->submit($crawler->filter('input')->form());

        $this->assertEquals('http://www.example.com/foo', $client->getRequest()->getUri(), '->submit() submit forms');

        $server = $client->getRequest()->getServer();
        $this->assertArrayHasKey('PHP_AUTH_USER', $server);
        $this->assertEquals('foo', $server['PHP_AUTH_USER']);
        $this->assertArrayHasKey('PHP_AUTH_PW', $server);
        $this->assertEquals('bar', $server['PHP_AUTH_PW']);
    }

    public function testFollowRedirect()
    {
        $client = new TestClient();
        $client->followRedirects(false);
        $client->request('GET', 'http://www.example.com/foo/foobar');

        try {
            $client->followRedirect();
            $this->fail('->followRedirect() throws a \LogicException if the request was not redirected');
        } catch (\Exception $e) {
            $this->assertInstanceof('LogicException', $e, '->followRedirect() throws a \LogicException if the request was not redirected');
        }

        $client->setNextResponse(new Response('', 302, array('Location' => 'http://www.example.com/redirected')));
        $client->request('GET', 'http://www.example.com/foo/foobar');
        $client->followRedirect();

        $this->assertEquals('http://www.example.com/redirected', $client->getRequest()->getUri(), '->followRedirect() follows a redirect if any');

        $client = new TestClient();
        $client->setNextResponse(new Response('', 302, array('Location' => 'http://www.example.com/redirected')));
        $client->request('GET', 'http://www.example.com/foo/foobar');

        $this->assertEquals('http://www.example.com/redirected', $client->getRequest()->getUri(), '->followRedirect() automatically follows redirects if followRedirects is true');

        $client = new TestClient();
        $client->setNextResponse(new Response('', 201, array('Location' => 'http://www.example.com/redirected')));
        $client->request('GET', 'http://www.example.com/foo/foobar');

        $this->assertEquals('http://www.example.com/foo/foobar', $client->getRequest()->getUri(), '->followRedirect() does not follow redirect if HTTP Code is not 30x');

        $client = new TestClient();
        $client->setNextResponse(new Response('', 201, array('Location' => 'http://www.example.com/redirected')));
        $client->followRedirects(false);
        $client->request('GET', 'http://www.example.com/foo/foobar');

        try {
            $client->followRedirect();
            $this->fail('->followRedirect() throws a \LogicException if the request did not respond with 30x HTTP Code');
        } catch (\Exception $e) {
            $this->assertInstanceof('LogicException', $e, '->followRedirect() throws a \LogicException if the request did not respond with 30x HTTP Code');
        }
    }

    public function testFollowRedirectWithMaxRedirects()
    {
        $client = new TestClient();
        $client->setMaxRedirects(1);
        $client->setNextResponse(new Response('', 302, array('Location' => 'http://www.example.com/redirected')));
        $client->request('GET', 'http://www.example.com/foo/foobar');
        $this->assertEquals('http://www.example.com/redirected', $client->getRequest()->getUri(), '->followRedirect() follows a redirect if any');

        $client->setNextResponse(new Response('', 302, array('Location' => 'http://www.example.com/redirected2')));
        try {
            $client->followRedirect();
            $this->fail('->followRedirect() throws a \LogicException if the request was redirected and limit of redirections was reached');
        } catch (\Exception $e) {
            $this->assertInstanceof('LogicException', $e, '->followRedirect() throws a \LogicException if the request was redirected and limit of redirections was reached');
        }

        $client->setNextResponse(new Response('', 302, array('Location' => 'http://www.example.com/redirected')));
        $client->request('GET', 'http://www.example.com/foo/foobar');
        $this->assertEquals('http://www.example.com/redirected', $client->getRequest()->getUri(), '->followRedirect() follows a redirect if any');

        $client->setNextResponse(new Response('', 302, array('Location' => '/redirected')));
        $client->request('GET', 'http://www.example.com/foo/foobar');

        $this->assertEquals('http://www.example.com/redirected', $client->getRequest()->getUri(), '->followRedirect() follows relative URLs');

        $client = new TestClient();
        $client->setNextResponse(new Response('', 302, array('Location' => '//www.example.org/')));
        $client->request('GET', 'https://www.example.com/');

        $this->assertEquals('https://www.example.org/', $client->getRequest()->getUri(), '->followRedirect() follows protocol-relative URLs');

        $client = new TestClient();
        $client->setNextResponse(new Response('', 302, array('Location' => 'http://www.example.com/redirected')));
        $client->request('POST', 'http://www.example.com/foo/foobar', array('name' => 'bar'));

        $this->assertEquals('get', $client->getRequest()->getMethod(), '->followRedirect() uses a get for 302');
        $this->assertEquals(array(), $client->getRequest()->getParameters(), '->followRedirect() does not submit parameters when changing the method');
    }

    public function testFollowRedirectWithCookies()
    {
        $client = new TestClient();
        $client->followRedirects(false);
        $client->setNextResponse(new Response('', 302, array(
            'Location'   => 'http://www.example.com/redirected',
            'Set-Cookie' => 'foo=bar',
        )));
        $client->request('GET', 'http://www.example.com/');
        $this->assertEquals(array(), $client->getRequest()->getCookies());
        $client->followRedirect();
        $this->assertEquals(array('foo' => 'bar'), $client->getRequest()->getCookies());
    }

    public function testFollowRedirectWithHeaders()
    {
        $headers = array(
            'HTTP_HOST'       => 'www.example.com',
            'HTTP_USER_AGENT' => 'Symfony2 BrowserKit',
            'CONTENT_TYPE'    => 'application/vnd.custom+xml',
            'HTTPS'           => false,
        );

        $client = new TestClient();
        $client->followRedirects(false);
        $client->setNextResponse(new Response('', 302, array(
            'Location'    => 'http://www.example.com/redirected',
        )));
        $client->request('GET', 'http://www.example.com/', array(), array(), array(
            'CONTENT_TYPE' => 'application/vnd.custom+xml',
        ));

        $this->assertEquals($headers, $client->getRequest()->getServer());

        $client->followRedirect();

        $headers['HTTP_REFERER'] = 'http://www.example.com/';

        $this->assertEquals($headers, $client->getRequest()->getServer());
    }

    public function testFollowRedirectWithPort()
    {
        $headers = array(
            'HTTP_HOST'       => 'www.example.com:8080',
            'HTTP_USER_AGENT' => 'Symfony2 BrowserKit',
            'HTTPS'           => false
        );

        $client = new TestClient();
        $client->followRedirects(false);
        $client->setNextResponse(new Response('', 302, array(
            'Location'    => 'http://www.example.com:8080/redirected',
        )));
        $client->request('GET', 'http://www.example.com:8080/');

        $this->assertEquals($headers, $client->getRequest()->getServer());
    }

    public function testBack()
    {
        $client = new TestClient();

        $parameters = array('foo' => 'bar');
        $files = array('myfile.foo' => 'baz');
        $server = array('X_TEST_FOO' => 'bazbar');
        $content = 'foobarbaz';

        $client->request('GET', 'http://www.example.com/foo/foobar', $parameters, $files, $server, $content);
        $client->request('GET', 'http://www.example.com/foo');
        $client->back();

        $this->assertEquals('http://www.example.com/foo/foobar', $client->getRequest()->getUri(), '->back() goes back in the history');
        $this->assertArrayHasKey('foo', $client->getRequest()->getParameters(), '->back() keeps parameters');
        $this->assertArrayHasKey('myfile.foo', $client->getRequest()->getFiles(), '->back() keeps files');
        $this->assertArrayHasKey('X_TEST_FOO', $client->getRequest()->getServer(), '->back() keeps $_SERVER');
        $this->assertEquals($content, $client->getRequest()->getContent(), '->back() keeps content');
    }

    public function testForward()
    {
        $client = new TestClient();

        $parameters = array('foo' => 'bar');
        $files = array('myfile.foo' => 'baz');
        $server = array('X_TEST_FOO' => 'bazbar');
        $content = 'foobarbaz';

        $client->request('GET', 'http://www.example.com/foo/foobar');
        $client->request('GET', 'http://www.example.com/foo', $parameters, $files, $server, $content);
        $client->back();
        $client->forward();

        $this->assertEquals('http://www.example.com/foo', $client->getRequest()->getUri(), '->forward() goes forward in the history');
        $this->assertArrayHasKey('foo', $client->getRequest()->getParameters(), '->forward() keeps parameters');
        $this->assertArrayHasKey('myfile.foo', $client->getRequest()->getFiles(), '->forward() keeps files');
        $this->assertArrayHasKey('X_TEST_FOO', $client->getRequest()->getServer(), '->forward() keeps $_SERVER');
        $this->assertEquals($content, $client->getRequest()->getContent(), '->forward() keeps content');
    }

    public function testReload()
    {
        $client = new TestClient();

        $parameters = array('foo' => 'bar');
        $files = array('myfile.foo' => 'baz');
        $server = array('X_TEST_FOO' => 'bazbar');
        $content = 'foobarbaz';

        $client->request('GET', 'http://www.example.com/foo/foobar', $parameters, $files, $server, $content);
        $client->reload();

        $this->assertEquals('http://www.example.com/foo/foobar', $client->getRequest()->getUri(), '->reload() reloads the current page');
        $this->assertArrayHasKey('foo', $client->getRequest()->getParameters(), '->reload() keeps parameters');
        $this->assertArrayHasKey('myfile.foo', $client->getRequest()->getFiles(), '->reload() keeps files');
        $this->assertArrayHasKey('X_TEST_FOO', $client->getRequest()->getServer(), '->reload() keeps $_SERVER');
        $this->assertEquals($content, $client->getRequest()->getContent(), '->reload() keeps content');
    }

    public function testRestart()
    {
        $client = new TestClient();
        $client->request('GET', 'http://www.example.com/foo/foobar');
        $client->restart();

        $this->assertTrue($client->getHistory()->isEmpty(), '->restart() clears the history');
        $this->assertEquals(array(), $client->getCookieJar()->all(), '->restart() clears the cookies');
    }

    public function testInsulatedRequests()
    {
        $client = new TestClient();
        $client->insulate();
        $client->setNextScript("new Symfony\Component\BrowserKit\Response('foobar')");
        $client->request('GET', 'http://www.example.com/foo/foobar');

        $this->assertEquals('foobar', $client->getResponse()->getContent(), '->insulate() process the request in a forked process');

        $client->setNextScript("new Symfony\Component\BrowserKit\Response('foobar)");

        try {
            $client->request('GET', 'http://www.example.com/foo/foobar');
            $this->fail('->request() throws a \RuntimeException if the script has an error');
        } catch (\Exception $e) {
            $this->assertInstanceof('RuntimeException', $e, '->request() throws a \RuntimeException if the script has an error');
        }
    }

    public function testGetServerParameter()
    {
        $client = new TestClient();
        $this->assertEquals('localhost', $client->getServerParameter('HTTP_HOST'));
        $this->assertEquals('Symfony2 BrowserKit', $client->getServerParameter('HTTP_USER_AGENT'));
        $this->assertEquals('testvalue', $client->getServerParameter('testkey', 'testvalue'));
    }

    public function testSetServerParameter()
    {
        $client = new TestClient();

        $this->assertEquals('localhost', $client->getServerParameter('HTTP_HOST'));
        $this->assertEquals('Symfony2 BrowserKit', $client->getServerParameter('HTTP_USER_AGENT'));

        $client->setServerParameter('HTTP_HOST', 'testhost');
        $this->assertEquals('testhost', $client->getServerParameter('HTTP_HOST'));

        $client->setServerParameter('HTTP_USER_AGENT', 'testua');
        $this->assertEquals('testua', $client->getServerParameter('HTTP_USER_AGENT'));
    }

    public function testSetServerParameterInRequest()
    {
        $client = new TestClient();

        $this->assertEquals('localhost', $client->getServerParameter('HTTP_HOST'));
        $this->assertEquals('Symfony2 BrowserKit', $client->getServerParameter('HTTP_USER_AGENT'));

        $client->request('GET', 'https://www.example.com/https/www.example.com', array(), array(), array(
            'HTTP_HOST'       => 'testhost',
            'HTTP_USER_AGENT' => 'testua',
            'HTTPS'           => false,
            'NEW_SERVER_KEY'  => 'new-server-key-value'
        ));

        $this->assertEquals('localhost', $client->getServerParameter('HTTP_HOST'));
        $this->assertEquals('Symfony2 BrowserKit', $client->getServerParameter('HTTP_USER_AGENT'));

        $this->assertEquals('http://testhost/https/www.example.com', $client->getRequest()->getUri());

        $server = $client->getRequest()->getServer();

        $this->assertArrayHasKey('HTTP_USER_AGENT', $server);
        $this->assertEquals('testua', $server['HTTP_USER_AGENT']);

        $this->assertArrayHasKey('HTTP_HOST', $server);
        $this->assertEquals('testhost', $server['HTTP_HOST']);

        $this->assertArrayHasKey('NEW_SERVER_KEY', $server);
        $this->assertEquals('new-server-key-value', $server['NEW_SERVER_KEY']);

        $this->assertArrayHasKey('HTTPS', $server);
        $this->assertFalse($server['HTTPS']);
    }
}
PK�b�\|����Gpear/test/BrowserKit/Symfony/Component/BrowserKit/Tests/RequestTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\BrowserKit\Tests;

use Symfony\Component\BrowserKit\Request;

class RequestTest extends \PHPUnit_Framework_TestCase
{
    public function testGetUri()
    {
        $request = new Request('http://www.example.com/', 'get');
        $this->assertEquals('http://www.example.com/', $request->getUri(), '->getUri() returns the URI of the request');
    }

    public function testGetMethod()
    {
        $request = new Request('http://www.example.com/', 'get');
        $this->assertEquals('get', $request->getMethod(), '->getMethod() returns the method of the request');
    }

    public function testGetParameters()
    {
        $request = new Request('http://www.example.com/', 'get', array('foo' => 'bar'));
        $this->assertEquals(array('foo' => 'bar'), $request->getParameters(), '->getParameters() returns the parameters of the request');
    }

    public function testGetFiles()
    {
        $request = new Request('http://www.example.com/', 'get', array(), array('foo' => 'bar'));
        $this->assertEquals(array('foo' => 'bar'), $request->getFiles(), '->getFiles() returns the uploaded files of the request');
    }

    public function testGetCookies()
    {
        $request = new Request('http://www.example.com/', 'get', array(), array(), array('foo' => 'bar'));
        $this->assertEquals(array('foo' => 'bar'), $request->getCookies(), '->getCookies() returns the cookies of the request');
    }

    public function testGetServer()
    {
        $request = new Request('http://www.example.com/', 'get', array(), array(), array(), array('foo' => 'bar'));
        $this->assertEquals(array('foo' => 'bar'), $request->getServer(), '->getServer() returns the server parameters of the request');
    }
}
PK�b�\�Gs���)pear/test/XML_Util/tests/Bug5392Tests.phpnu�[���<?php

/**
 * Bug #5392 "encoding of ISO-8859-1 is the only supported encoding"
 *
 * Original characters of the given encoding that are "replaced"
 * should then "reverse" back to perfectly match the original.
 *
 * @link https://pear.php.net/bugs/bug.php?id=5392
 */
class Bug5392Tests extends AbstractUnitTests
{
    public function testReplaceEntitiesForBug5392()
    {
        $original = 'This data contains special chars like <, >, & and " as well as ä, ö, ß, à and ê';
        $replacedResult = XML_Util::replaceEntities($original, XML_UTIL_ENTITIES_HTML, "UTF-8");
        $reversedResult = XML_Util::reverseEntities($replacedResult, XML_UTIL_ENTITIES_HTML, "UTF-8");
        $this->assertEquals($original, $reversedResult, "Failed bugcheck.");
    }
}
PK�b�\��GG4pear/test/XML_Util/tests/SplitQualifiedNameTests.phpnu�[���<?php

class SplitQualifiedNameTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::splitQualifiedName()
     */
    public function testSplitQualifiedNameWithoutNamespace()
    {
        $original = "xslt:stylesheet";
        $expected = array(
            'namespace' => 'xslt',
            'localPart' => 'stylesheet',
        );
        $this->assertEquals($expected, XML_Util::splitQualifiedName($original));
    }

    /**
     * @covers XML_Util::splitQualifiedName()
     */
    public function testSplitQualifiedNameWithNamespace()
    {
        $original = "stylesheet";
        $namespace = "myNs";
        $expected = array(
            'namespace' => 'myNs',
            'localPart' => 'stylesheet',
        );
        $this->assertEquals($expected, XML_Util::splitQualifiedName($original, $namespace));
    }
}
PK�b�\�rv��,pear/test/XML_Util/tests/RaiseErrorTests.phpnu�[���<?php

class RaiseErrorTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::raiseError()
     */
    public function testRaiseError()
    {
        $code = 12345;
        $message = "I am an error";
        $error = XML_Util::raiseError($message, $code);
        $this->assertInstanceOf('PEAR_Error', $error);
        $this->assertEquals($message, $error->getMessage());
        $this->assertEquals($code, $error->getCode());
    }
}
PK�b�\z��t��1pear/test/XML_Util/tests/ReverseEntitiesTests.phpnu�[���<?php

class ReverseEntitiesTests extends AbstractUnitTests
{
    protected function getSimpleData()
    {
        return 'This string contains &lt; &amp; &gt;.';
    }

    protected function getUtf8Data()
    {
        return 'This data contains special chars like &lt;, &gt;, &amp; and &quot; as well as &auml;, &ouml;, &szlig;, &agrave; and &ecirc;';
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleData()
    {
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData()));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithInvalidOptionReturnsOriginalData()
    {
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), 'INVALID_OPTION'));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesXml()
    {
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesXmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML), $encoding);
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForUtf8DataWithEntitiesXmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like <, >, & and \" as well as &auml;, &ouml;, &szlig;, &agrave; and &ecirc;";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_XML), $encoding);
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesXmlRequired()
    {
        $expected = "This string contains < & &gt;.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML_REQUIRED));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesXmlRequiredAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains < & &gt;.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML_REQUIRED, $encoding));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForUtf8DataWithEntitiesXmlRequiredAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like <, &gt;, & and \" as well as &auml;, &ouml;, &szlig;, &agrave; and &ecirc;";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_XML_REQUIRED, $encoding));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesHtml()
    {
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_HTML));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForSimpleDataWithEntitiesHtmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getSimpleData(), XML_UTIL_ENTITIES_HTML, $encoding));
    }

    /**
     * @covers XML_Util::reverseEntities()
     */
    public function testReverseEntitiesForUtf8DataWithEntitiesHtmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like <, >, & and \" as well as ä, ö, ß, à and ê";
        $this->assertEquals($expected, XML_Util::reverseEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_HTML, $encoding));
    }
}
PK�b�\���TT/pear/test/XML_Util/tests/CreateCommentTests.phpnu�[���<?php

class CreateCommentTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createComment()
     */
    public function testCreateCommentBasicUsage()
    {
        $original = "I am comment.";
        $expected = "<!-- I am comment. -->";
        $this->assertEquals($expected, XML_Util::createComment($original));
    }
}
PK�b�\ݑh���-pear/test/XML_Util/tests/IsValidNameTests.phpnu�[���<?php

class IsValidNameTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::isValidName()
     */
    public function testIsValidNameForTagNameThatIsValid()
    {
        $tagName = "alpha-x_y_z.123";
        $result = XML_Util::isValidName($tagName);
        $this->assertTrue($result);
    }

    /**
     * @covers XML_Util::isValidName()
     */
    public function testIsValidNameForTagNameWithInvalidCharacter()
    {
        $tagName = "invalidTag?";
        $result = XML_Util::isValidName($tagName);
        $this->assertInstanceOf('PEAR_Error', $result);
        $expectedError = "XML names may only contain alphanumeric chars, period, hyphen, colon and underscores";
        $this->assertEquals($expectedError, $result->getMessage());
    }

    /**
     * @covers XML_Util::isValidName()
     */
    public function testIsValidNameForTagNameWithInvalidStartingCharacter()
    {
        $tagName = "1234five";
        $result = XML_Util::isValidName($tagName);
        $this->assertInstanceOf('PEAR_Error', $result);
        $expectedError = "XML names may only start with letter or underscore";
        $this->assertEquals($expectedError, $result->getMessage());
    }

    /**
     * @covers XML_Util::isValidName()
     */
    public function testIsValidNameForInt()
    {
        $tagName = 1;
        $result = XML_Util::isValidName($tagName);
        $this->assertInstanceOf('PEAR_Error', $result);
        $expectedError = "XML names may only start with letter or underscore";
        $this->assertEquals($expectedError, $result->getMessage());
    }

    /**
     * @covers XML_Util::isValidName()
     */
    public function testIsValidNameForEmptyString()
    {
        $tagName = '';
        $result = XML_Util::isValidName($tagName);
        $this->assertInstanceOf('PEAR_Error', $result);
        $expectedError = "XML names may only start with letter or underscore";
        $this->assertEquals($expectedError, $result->getMessage());
    }
}
PK�b�\~�$[ee2pear/test/XML_Util/tests/CreateEndElementTests.phpnu�[���<?php

class CreateEndElementTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createEndElement()
     */
    public function testCreateEndElementBasicUsage()
    {
        $original = "myTag";
        $expected = "</myTag>";
        $this->assertEquals($expected, XML_Util::createEndElement($original));
    }

    /**
     * @covers XML_Util::createEndElement()
     */
    public function testCreateEndElementWithNamespacedTag()
    {
        $original = "myNs:myTag";
        $expected = "</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createEndElement($original));
    }
}
PK�b�\e�>��4�44pear/test/XML_Util/tests/CreateTagFromArrayTests.phpnu�[���<?php

class CreateTagFromArrayTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQname()
    {
        $original = array(
            "qname" => "foo:bar",
        );
        $expected = "<foo:bar />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespace()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
        );
        $expected = "<foo:bar xmlns:foo=\"http://foo.com\" />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributes()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
        );
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\" xmlns:foo=\"http://foo.com\" />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContent()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\" xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndAttributesAndContent()
    {
        $original = array(
            "qname" => "foo:bar",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndContent()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "content"      => "I'm inside the tag",
        );
        $expected = "<foo:bar xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithEntitiesNone()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\" xmlns:foo=\"http://foo.com\">I'm inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_ENTITIES_NONE));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntities()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\" xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineFalse()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = false;
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\" key=\"value\" xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineTrue()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = true;
        $expected =
<<< EOF
<foo:bar argh="fruit&amp;vegetable"
         key="value"
         xmlns:foo="http://foo.com">I&apos;m inside the tag</foo:bar>
EOF;
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineTrueAndIndent()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = true;
        $indent = "  ";
        $expected =
<<< EOF
<foo:bar argh="fruit&amp;vegetable"
  key="value"
  xmlns:foo="http://foo.com">I&apos;m inside the tag</foo:bar>
EOF;
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreak()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\"^  key=\"value\"^  xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreakAndSortAttributesTrue()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = true;
        $expected = "<foo:bar argh=\"fruit&amp;vegetable\"^  key=\"value\"^  xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak, $sortAttributes));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameAndNamespaceAndAttributesAndContentWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreakAndSortAttributesFalse()
    {
        $original = array(
            "qname" => "foo:bar",
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = false;
        $expected = "<foo:bar key=\"value\"^  argh=\"fruit&amp;vegetable\"^  xmlns:foo=\"http://foo.com\">I&apos;m inside the tag</foo:bar>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak, $sortAttributes));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithInvalidArray()
    {
        $badArray = array(
            "foo" => "bar",
        );
        $expectedError = "You must either supply a qualified name (qname) or local tag name (localPart).";
        $this->assertEquals($expectedError, XML_Util::createTagFromArray($badArray));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithNamespaceAndAttributesAndContentButWithoutQname()
    {
        $original = array(
            "namespaceUri" => "http://foo.com",
            "attributes"   => array( "key" => "value", "argh" => "fruit&vegetable" ),
            "content"      => "I'm inside the tag",
        );
        $expectedError = "You must either supply a qualified name (qname) or local tag name (localPart).";
        $this->assertEquals($expectedError, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithNonScalarContent()
    {
        $badArray = array(
            'content' => array('foo', 'bar'),
        );
        $expectedError = "Supplied non-scalar value as tag content";
        $this->assertEquals($expectedError, XML_Util::createTagFromArray($badArray));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithArrayOfNamespaces()
    {
        $original = array(
            'qname'        => 'foo:bar',
            'namespaces'   => array('ns1' => 'uri1', 'ns2' => 'uri2'),
        );
        $expected = "<foo:bar xmlns:ns1=\"uri1\" xmlns:ns2=\"uri2\" />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameDerivedFromNamespaceUriAndLocalPart()
    {
        $original = array(
            'namespaceUri' => 'http://bar.org',
            'localPart'    => 'foo'
        );
        $expected = "<foo xmlns=\"http://bar.org\" />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameDerivedFromNamespaceAndLocalPart()
    {
        $original = array(
            'namespace'    => 'http://foo.org',
            'localPart'    => 'bar'
        );
        $expected = "<http://foo.org:bar />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithQnameDerivedFromLocalPart()
    {
        $original = array(
            'namespace'    => '',
            'localPart'    => 'bar'
        );
        $expected = "<bar />";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original));
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayWithImplicitlyEmptyContentAndCollapseNoneDoesNotCollapseTag()
    {
        $original = array('qname' => 'tag1');
        $expected = "<tag1></tag1>";
        $actual = XML_Util::createTagFromArray(
            $original,
            XML_UTIL_REPLACE_ENTITIES,  // default $replaceEntities
            false,                      // default $multiline
            '_auto',                    // default $indent
            "\n",                       // default $linebreak
            true,                       // default $sortAttributes
            XML_UTIL_COLLAPSE_NONE
        );
        $this->assertEquals($expected, $actual);
    }

    /**
     * @covers XML_Util::createTagFromArray()
     */
    public function testCreateTagFromArrayForCdataWithExplicitlyEmptyContentDoesNotCollapseTag()
    {
        $original = array('qname' => 'tag1', 'content' => '');
        $expected = "<tag1><![CDATA[]]></tag1>";
        $this->assertEquals($expected, XML_Util::createTagFromArray($original, XML_UTIL_CDATA_SECTION));
    }
}
PK�b�\�C���1pear/test/XML_Util/tests/ReplaceEntitiesTests.phpnu�[���<?php

class ReplaceEntitiesTests extends AbstractUnitTests
{
    protected function getSimpleData()
    {
        return 'This string contains < & >.';
    }

    protected function getUtf8Data()
    {
        return 'This data contains special chars like <, >, & and " as well as ä, ö, ß, à and ê';
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleData()
    {
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData()));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithInvalidOptionReturnsOriginalData()
    {
        $expected = "This string contains < & >.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), 'INVALID_OPTION'));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesXml()
    {
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesXmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML, $encoding));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForUtf8DataWithEntitiesXmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like &lt;, &gt;, &amp; and &quot; as well as ä, ö, ß, à and ê";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_XML, $encoding));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesXmlRequired()
    {
        $expected = "This string contains &lt; &amp; >.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML_REQUIRED));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesXmlRequiredAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains &lt; &amp; >.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_XML_REQUIRED, $encoding));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForUtf8DataWithEntitiesXmlRequiredAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like &lt;, >, &amp; and &quot; as well as ä, ö, ß, à and ê";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_XML_REQUIRED, $encoding));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesHtml()
    {
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_HTML));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForSimpleDataWithEntitiesHtmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This string contains &lt; &amp; &gt;.";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getSimpleData(), XML_UTIL_ENTITIES_HTML, $encoding));
    }

    /**
     * @covers XML_Util::replaceEntities()
     */
    public function testReplaceEntitiesForUtf8DataWithEntitiesHtmlAndEncoding()
    {
        $encoding = "UTF-8";
        $expected = "This data contains special chars like &lt;, &gt;, &amp; and &quot; as well as &auml;, &ouml;, &szlig;, &agrave; and &ecirc;";
        $this->assertEquals($expected, XML_Util::replaceEntities($this->getUtf8Data(), XML_UTIL_ENTITIES_HTML, $encoding));
    }
}
PK�b�\ܬ$���7pear/test/XML_Util/tests/GetDocTypeDeclarationTests.phpnu�[���<?php

class GetDocTypeDeclarationTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::getDocTypeDeclaration()
     */
    public function testGetDocTypeDeclarationUsingRoot()
    {
        $expected = "<!DOCTYPE rootTag>";
        $this->assertEquals($expected, XML_Util::getDocTypeDeclaration("rootTag"));
    }

    /**
     * @covers XML_Util::getDocTypeDeclaration()
     */
    public function testGetDocTypeDeclarationUsingRootAndStringUri()
    {
        $expected = "<!DOCTYPE rootTag SYSTEM \"myDocType.dtd\">";
        $this->assertEquals($expected, XML_Util::getDocTypeDeclaration("rootTag", "myDocType.dtd"));
    }

    /**
     * @covers XML_Util::getDocTypeDeclaration()
     */
    public function testGetDocTypeDeclarationUsingRootAndArrayUri()
    {
        $uri = array(
            'uri' => 'http://pear.php.net/dtd/package-1.0',
            'id' => '-//PHP//PEAR/DTD PACKAGE 0.1'
        );
        $expected = "<!DOCTYPE rootTag PUBLIC \"-//PHP//PEAR/DTD PACKAGE 0.1\" \"http://pear.php.net/dtd/package-1.0\">";
        $this->assertEquals($expected, XML_Util::getDocTypeDeclaration("rootTag", $uri));
    }

    /**
     * @covers XML_Util::getDocTypeDeclaration()
     */
    public function testGetDocTypeDeclarationUsingRootAndArrayUriAndInternalDtd()
    {
        $uri = array(
            'uri' => 'http://pear.php.net/dtd/package-1.0',
            'id' => '-//PHP//PEAR/DTD PACKAGE 0.1'
        );
        $dtdEntry = '<!ELEMENT additionalInfo (#PCDATA)>';
        $expected =
<<< EOF
<!DOCTYPE rootTag PUBLIC "-//PHP//PEAR/DTD PACKAGE 0.1" "http://pear.php.net/dtd/package-1.0" [
<!ELEMENT additionalInfo (#PCDATA)>
]>
EOF;
        $this->assertEquals($expected, XML_Util::getDocTypeDeclaration("rootTag", $uri, $dtdEntry));
    }
}
PK�b�\Z�t�4pear/test/XML_Util/tests/AttributesToStringTests.phpnu�[���<?php

class AttributesToStringTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringBasicUsage()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " boo=\"baz\" foo=\"bar\"";
        $this->assertEquals($expected, XML_Util::attributesToString($original));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithExplicitSortTrue()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " boo=\"baz\" foo=\"bar\"";
        $sort = true;
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithExplicitSortFalse()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " foo=\"bar\" boo=\"baz\"";
        $sort = false;
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithMultilineFalse()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " boo=\"baz\" foo=\"bar\"";
        $sort = true;
        $multiline = false;
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithMultilineTrue()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected =
<<< EOF
 boo="baz"
    foo="bar"
EOF;
        $sort = true;
        $multiline = true;
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithExplicitIndent()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " boo=\"baz\"\n        foo=\"bar\"";
        $sort = true;
        $multiline = true;
        $indent = '        '; // 8 spaces
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $indent));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithExplicitLinebreak()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $expected = " boo=\"baz\"\n^foo=\"bar\"";
        $sort = true;
        $multiline = true;
        $linebreak = '^'; // some dummy character
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $linebreak));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithOptionsThatIncludesSort()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $options = array(
            'multiline' => true,
            'indent'    => '----',
            'linebreak' => "^",
            'entities'  => XML_UTIL_ENTITIES_XML,
            'sort'      => true,
        );

        $expected = " boo=\"baz\"\n----foo=\"bar\"";
        $this->assertEquals($expected, XML_Util::attributesToString($original, $options));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithOptionsThatExcludesSort()
    {
        $original = array('foo' => 'bar','boo' => 'baz',);
        $options = array(
            'multiline' => true,
            'indent'    => '----',
            'linebreak' => "^",
            'entities'  => XML_UTIL_ENTITIES_XML,
        );

        $expected = " boo=\"baz\"\n----foo=\"bar\"";
        $this->assertEquals($expected, XML_Util::attributesToString($original, $options));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithEntitiesNone()
    {
        $original = array("foo" => "b@&r", "boo" => "b><z");
        $expected = " boo=\"b><z\" foo=\"b@&r\"";
        $sort = true;
        $multiline = false;
        $linebreak = '    ';
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $linebreak, PHP_EOL, XML_UTIL_ENTITIES_NONE));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithEntitiesXml()
    {
        $original = array("foo" => "b@&r", "boo" => "b><z");
        $expected = " boo=\"b&gt;&lt;z\" foo=\"b@&amp;r\"";
        $sort = true;
        $multiline = false;
        $linebreak = '    ';
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $linebreak, PHP_EOL, XML_UTIL_ENTITIES_XML));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithEntitiesXmlRequired()
    {
        $original = array("foo" => "b@&r", "boo" => "b><z");
        $expected = " boo=\"b>&lt;z\" foo=\"b@&amp;r\"";
        $sort = true;
        $multiline = false;
        $linebreak = '    ';
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $linebreak, PHP_EOL, XML_UTIL_ENTITIES_XML_REQUIRED));
    }

    /**
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithEntitiesHtml()
    {
        $original = array("foo" => "b@&r", "boo" => "b><z");
        $expected = " boo=\"b&gt;&lt;z\" foo=\"b@&amp;r\"";
        $sort = true;
        $multiline = false;
        $linebreak = '    ';
        $this->assertEquals($expected, XML_Util::attributesToString($original, $sort, $multiline, $linebreak, PHP_EOL, XML_UTIL_ENTITIES_HTML));
    }

    /**
     * Tag attributes should not be treated as CDATA,
     * so the operation will instead quietly use XML_UTIL_ENTITIES_XML.
     *
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithCDataSectionForSingleAttribute()
    {
        $original = array('foo' => 'bar'); // need exactly one attribute here
        $options = array(
            'sort'      => true,   // doesn't matter for this testcase
            'multiline' => false,  // doesn't matter for this testcase
            'indent'    => null,   // doesn't matter for this testcase
            'linebreak' => null,   // doesn't matter for this testcase
            'entities'  => XML_UTIL_CDATA_SECTION, // DOES matter for this testcase
        );
        $expected = " foo=\"bar\"";
        $this->assertEquals($expected, XML_Util::attributesToString($original, $options));
    }

    /**
     * Tag attributes should not be treated as CDATA,
     * so the operation will instead quietly use XML_UTIL_ENTITIES_XML.
     *
     * @covers XML_Util::attributesToString()
     */
    public function testAttributesToStringWithCDataSectionForMultipleAttributesAndMultilineFalse()
    {
        $original = array('foo' => 'bar', 'boo' => 'baz'); // need more than one attribute here
        $options = array(
            'sort'      => true,   // doesn't matter for this testcase
            'multiline' => false,  // DOES matter for this testcase, must be false
            'indent'    => null,   // doesn't matter for this testcase
            'linebreak' => null,   // doesn't matter for this testcase
            'entities'  => XML_UTIL_CDATA_SECTION, // DOES matter for this testcase
        );
        $expected = " boo=\"baz\" foo=\"bar\"";
        $this->assertEquals($expected, XML_Util::attributesToString($original, $options));
    }
}
PK�b�\�m4�**+pear/test/XML_Util/tests/CreateTagTests.phpnu�[���<?php

class CreateTagTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributes()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $expected = "<myNs:myTag foo=\"bar\" />";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContent()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag";
        $expected = "<myNs:myTag foo=\"bar\">This is inside the tag</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespace()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\" xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace));
    }


    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithCDataSection()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\" xmlns:myNs=\"http://www.w3c.org/myNs#\"><![CDATA[This is inside the tag and has < & @ > in it]]></myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_CDATA_SECTION));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntities()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\" xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineFalse()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = false;
        $expected = "<myNs:myTag foo=\"bar\" xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineTrue()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = true;
        $expected =
<<< EOF
<myNs:myTag foo="bar"
            xmlns:myNs="http://www.w3c.org/myNs#">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>
EOF;
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineTrueAndIndent()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = true;
        $indent = "  ";
        $expected =
<<< EOF
<myNs:myTag foo="bar"
  xmlns:myNs="http://www.w3c.org/myNs#">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>
EOF;

        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreak()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $expected = "<myNs:myTag foo=\"bar\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreakAndSortAttributesTrue()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar", "boo" => "baz");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = true;
        $expected = "<myNs:myTag boo=\"baz\"^  foo=\"bar\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak, $sortAttributes));
    }

    /**
     * @covers XML_Util::createTag()
     */
    public function testCreateTagForTagWithAttributesAndContentAndNamespaceWithReplaceEntitiesAndMultilineTrueAndIndentAndLinebreakAndSortAttributesFalse()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar", "boo" => "baz");
        $originalContent = "This is inside the tag and has < & @ > in it";
        $originalNamespace = "http://www.w3c.org/myNs#";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = false;
        $expected = "<myNs:myTag foo=\"bar\"^  boo=\"baz\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">This is inside the tag and has &lt; &amp; @ &gt; in it</myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createTag($originalTag, $originalAttributes, $originalContent, $originalNamespace, XML_UTIL_REPLACE_ENTITIES, $multiline, $indent, $linebreak, $sortAttributes));
    }
}
PK�b�\Yq���*pear/test/XML_Util/tests/Bug21184Tests.phpnu�[���<?php

/**
 * Bug #21184
 *
 * PREG returns NULL when it encounters an error.
 * In this case, it was encountering PREG_BACKTRACK_LIMIT_ERROR.
 *
 * @link https://pear.php.net/bugs/bug.php?id=21177
 */
class Bug21184 extends AbstractUnitTests
{
    public function testBug21184()
    {
        $xml = '<XML_Serializer_Tag>one</XML_Serializer_Tag>';
        $this->assertEquals($xml, XML_Util::collapseEmptyTags($xml, XML_UTIL_COLLAPSE_ALL));
    }
}
PK�b�\�YR�""4pear/test/XML_Util/tests/CreateStartElementTests.phpnu�[���<?php

class CreateStartElementTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagOnly()
    {
        $original = "myNs:myTag";
        $expected = "<myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createStartElement($original));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributes()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $expected = "<myNs:myTag foo=\"bar\">";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithEmptyAttributes()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = "";
        $expected = "<myNs:myTag>";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespace()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\" xmlns:myNs=\"http://www.w3c.org/myNs#\">";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithEmptyAttributesAndNonUriNamespace()
    {
        $originalTag = "myTag";
        $originalAttributes = "";
        $originalNamespace = "foo";
        $expected = "<myTag xmlns=\"foo\">";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespaceWithMultiline()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected =
<<< EOF
<myNs:myTag foo="bar"
            xmlns:myNs="http://www.w3c.org/myNs#">
EOF;
        $multiline = true;
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace, $multiline));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespaceWithMultilineAndIndent()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected =
<<< EOF
<myNs:myTag foo="bar"
  xmlns:myNs="http://www.w3c.org/myNs#">
EOF;
        $multiline = true;
        $indent = "  ";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace, $multiline, $indent));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespaceWithMultilineAndIndentAndLinebreak()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace, $multiline, $indent, $linebreak));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespaceWithMultilineAndIndentAndLinebreakAndSortAttributesIsTrue()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar", "boo" => "baz");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag boo=\"baz\"^  foo=\"bar\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = true;
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace, $multiline, $indent, $linebreak, $sortAttributes));
    }

    /**
     * @covers XML_Util::createStartElement()
     */
    public function testCreateStartElementForTagWithAttributesAndNamespaceWithMultilineAndIndentAndLinebreakAndSortAttributesIsFalse()
    {
        $originalTag = "myNs:myTag";
        $originalAttributes = array("foo" => "bar", "boo" => "baz");
        $originalNamespace = "http://www.w3c.org/myNs#";
        $expected = "<myNs:myTag foo=\"bar\"^  boo=\"baz\"^  xmlns:myNs=\"http://www.w3c.org/myNs#\">";
        $multiline = true;
        $indent = "  ";
        $linebreak = "^";
        $sortAttributes = false;
        $this->assertEquals($expected, XML_Util::createStartElement($originalTag, $originalAttributes, $originalNamespace, $multiline, $indent, $linebreak, $sortAttributes));
    }
}
PK�b�\|�\53pear/test/XML_Util/tests/CollapseEmptyTagsTests.phpnu�[���<?php

class CollapseEmptyTagsTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsBasicUsage()
    {
        $emptyTag = "<foo></foo>";
        $expected = "<foo />";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsBasicUsageAlongsideNonemptyTag()
    {
        $emptyTag = "<foo></foo>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<foo /><bar>baz</bar>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagWithCollapseAll()
    {
        $emptyTag = "<foo></foo>";
        $expected = "<foo />";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag, XML_UTIL_COLLAPSE_ALL));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagAlongsideNonemptyTagWithCollapseAll()
    {
        $emptyTag = "<foo></foo>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<foo /><bar>baz</bar>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag, XML_UTIL_COLLAPSE_ALL));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagAlongsideNonemptyTagAlongsideEmptyTagWithCollapseAll()
    {
        $emptyTag = "<foo></foo>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<foo /><bar>baz</bar><foo />";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag . $emptyTag, XML_UTIL_COLLAPSE_ALL));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyPrefixedTagAlongsideNonemptyTagAlongsideEmptyPrefixedTagWithCollapseAll()
    {
        $emptyTag = "<foo:foo2></foo:foo2>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<foo:foo2 /><bar>baz</bar><foo:foo2 />";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag . $emptyTag, XML_UTIL_COLLAPSE_ALL));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyNsPrefixedTagAlongsideNonemptyTagAlongsideEmptyNsPrefixedTagWithCollapseAll()
    {
        $emptyTag = "<http://foo.com:foo2></http://foo.com:foo2>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<http://foo.com:foo2 /><bar>baz</bar><http://foo.com:foo2 />";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag . $emptyTag, XML_UTIL_COLLAPSE_ALL));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagWithCollapseXhtml()
    {
        $emptyTag = "<foo></foo>";
        $expected = "<foo></foo>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag, XML_UTIL_COLLAPSE_XHTML_ONLY));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagAlongsideNonemptyTagWithCollapseXhtml()
    {
        $emptyTag = "<foo></foo>";
        $otherTag = "<bar>baz</bar>";
        $xhtmlTag = "<br></br>";
        $expected = "<foo></foo><br /><bar>baz</bar>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $xhtmlTag . $otherTag, XML_UTIL_COLLAPSE_XHTML_ONLY));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagWithCollapseNone()
    {
        $emptyTag = "<foo></foo>";
        $expected = "<foo></foo>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag, XML_UTIL_COLLAPSE_NONE));
    }

    /**
     * @covers XML_Util::collapseEmptyTags()
     */
    public function testCollapseEmptyTagsOnOneEmptyTagAlongsideNonemptyTagWithCollapseNone()
    {
        $emptyTag = "<foo></foo>";
        $otherTag = "<bar>baz</bar>";
        $expected = "<foo></foo><bar>baz</bar>";
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($emptyTag . $otherTag, XML_UTIL_COLLAPSE_NONE));
    }
}
PK�b�\یu���,pear/test/XML_Util/tests/ApiVersionTests.phpnu�[���<?php

class ApiVersionTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::apiVersion()
     */
    public function testApiVersion()
    {
        $this->assertEquals('1.4', XML_Util::apiVersion());
    }
}PK�b�\��۩��*pear/test/XML_Util/tests/Bug18343Tests.phpnu�[���<?php

/**
 * Bug #18343 "Entities in file names decoded during packaging"
 *
 * No matter what flags are given to createTagFromArray(),
 * an attribute must *always* be at least ENTITIES_XML encoded.
 *
 * @link https://pear.php.net/bugs/bug.php?id=18343
 */
class Bug18343Tests extends AbstractUnitTests
{
    private $tagArray = array(
        "qname"      => "install",
        "attributes" => array(
            "as"    => "Horde/Feed/fixtures/lexicon/http-p.moreover.com-cgi-local-page%2Fo=rss&s=Newsweek",
            "name"  => "test/Horde/Feed/fixtures/lexicon/http-p.moreover.com-cgi-local-page%2Fo=rss&s=Newsweek",
        )
    );

    public function getFlagsToTest()
    {
        new XML_Util(); // for constants to be declared

        return array(
            array('no flag', null),
            array('false', false),
            array('ENTITIES_NONE', XML_UTIL_ENTITIES_NONE),
            array('ENTITIES_XML', XML_UTIL_ENTITIES_XML),
            array('ENTITIES_XML_REQUIRED', XML_UTIL_ENTITIES_XML_REQUIRED),
            array('ENTITIES_HTML', XML_UTIL_ENTITIES_HTML),
            array('REPLACE_ENTITIES', XML_UTIL_REPLACE_ENTITIES),
        );
    }

    /**
     * @dataProvider getFlagsToTest()
     */
    public function testCreateTagFromArrayForBug18343($key, $flag)
    {
        // all flags for the candidate input should return the same result
        $expected =
<<< EOF
<install as="Horde/Feed/fixtures/lexicon/http-p.moreover.com-cgi-local-page%2Fo=rss&amp;s=Newsweek" name="test/Horde/Feed/fixtures/lexicon/http-p.moreover.com-cgi-local-page%2Fo=rss&amp;s=Newsweek" />
EOF;
        $this->assertEquals($expected, XML_Util::createTagFromArray($this->tagArray, $flag), "Failed bugcheck for $key.");
    }
}
PK�b�\���!��.pear/test/XML_Util/tests/AbstractUnitTests.phpnu�[���<?php

/*
 * Allow for PHPUnit 4.* while XML_Util is still usable on PHP 5.4
 */
if (!class_exists('PHPUnit_Framework_TestCase')) {
    class PHPUnit_Framework_TestCase extends \PHPUnit\Framework\TestCase {}
}

abstract class AbstractUnitTests extends \PHPUnit_Framework_TestCase
{
    public function setUp()
    {
        // ensure the class is defined, and thus its constants are declared
        new XML_Util();
    }
}
PK�b�\��G*pear/test/XML_Util/tests/Bug21177Tests.phpnu�[���<?php

/**
 * Bug #21177 "XML_Util::collapseEmptyTags() can return NULL"
 *
 * PREG returns NULL when it encounters an error.
 * In this case, it was encountering PREG_BACKTRACK_LIMIT_ERROR.
 *
 * @link https://pear.php.net/bugs/bug.php?id=21177
 */
class Bug21177Tests extends AbstractUnitTests
{
    public function getTestCandidate()
    {
        $expected = '<id_mytest_yesorno />';

        return array(
            array('<idmytestyesorno></idmytestyesorno>',        '<idmytestyesorno />'),
            array('<idmytestyesorno />',                        '<idmytestyesorno />'),

            array('<id_mytest_yesorno></id_mytest_yesorno>',    '<id_mytest_yesorno />'),
            array('<id_mytest_yesorno />',                      '<id_mytest_yesorno />'),
        );
    }

    /**
     * @dataProvider getTestCandidate()
     */
    public function testCollapseEmptyTagsForBug21177($original, $expected)
    {
        $this->assertEquals($expected, XML_Util::collapseEmptyTags($original, XML_UTIL_COLLAPSE_ALL), "Failed bugcheck.");
    }
}
PK�b�\>�M���)pear/test/XML_Util/tests/Bug4950Tests.phpnu�[���<?php

/**
 * Bug #4950 "Incorrect CDATA serializing"
 *
 * Content that looks like CDATA end characters and tags
 * should still be recognized solely as content text.
 *
 * @link https://pear.php.net/bugs/bug.php?id=4950
 */
class Bug4950Tests extends AbstractUnitTests
{
    public function testCreateTagForBug4950()
    {
        $qname = "test";
        $attributes = array();
        $content = "Content ]]></test> here!";
        $namespaceUrl = null;
        $expected = "<test><![CDATA[Content ]]]]><![CDATA[></test> here!]]></test>";
        $result = XML_Util::createTag($qname, $attributes, $content, $namespaceUrl, XML_UTIL_CDATA_SECTION);
        $this->assertEquals($expected, $result, "Failed bugcheck.");
    }
}
PK�b�\Df:��3pear/test/XML_Util/tests/GetXmlDeclarationTests.phpnu�[���<?php

class GetXMLDeclarationTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::getXMLDeclaration()
     */
    public function testGetXMLDeclarationUsingVersion()
    {
        $version = "1.0";
        $expected = "<?xml version=\"1.0\"?>";
        $this->assertEquals($expected, XML_Util::getXMLDeclaration($version));
    }

    /**
     * @covers XML_Util::getXMLDeclaration()
     */
    public function testGetXMLDeclarationUsingVersionAndEncodingAndStandalone()
    {
        $version = "1.0";
        $encoding = "UTF-8";
        $standalone = true;
        $expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
        $this->assertEquals($expected, XML_Util::getXMLDeclaration($version, $encoding, $standalone));
    }

    /**
     * @covers XML_Util::getXMLDeclaration()
     */
    public function testGetXMLDeclarationUsingVersionAndStandalone()
    {
        $version = "1.0";
        $encoding = null;
        $standalone = true;
        $expected = "<?xml version=\"1.0\" standalone=\"yes\"?>";
        $this->assertEquals($expected, XML_Util::getXMLDeclaration($version, $encoding, $standalone));
    }
}
PK�b�\4e��jj4pear/test/XML_Util/tests/CreateCDataSectionTests.phpnu�[���<?php

class CreateCDataSectionTests extends AbstractUnitTests
{
    /**
     * @covers XML_Util::createCDataSection()
     */
    public function testCreateCDataSectionBasicUsage()
    {
        $original = "I am content.";
        $expected ="<![CDATA[I am content.]]>";
        $this->assertEquals($expected, XML_Util::createCDataSection($original));
    }
}
PK�b�\�3l�**%pear/test/XML_RPC/tests/protoport.phpnu�[���<?php

/**
 * Tests that properties of XML_RPC_Client get properly set
 *
 * Any individual tests that fail will have their name, expected result
 * and actual result printed out.  So seeing no output when executing
 * this file is a good thing.
 *
 * Can be run via CLI or a web server.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: protoport.php 300957 2010-07-02 23:55:00Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.2
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC.php';


/**
 * Compare the test result to the expected result
 *
 * If the test fails, echo out the results.
 *
 * @param array  $expect     the array of object properties you expect
 *                            from the test
 * @param object $actual     the object results from the test
 * @param string $test_name  the name of the test
 *
 * @return void
 */
function compare($expect, $actual, $test_name) {
    $actual = get_object_vars($actual);
    if (count(array_diff($actual, $expect))) {
        echo "$test_name failed.\nExpect: ";
        print_r($expect);
        echo "Actual: ";
        print_r($actual);
        echo "\n";
    }
}

if (php_sapi_name() != 'cli') {
    echo "<pre>\n";
}


$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 80,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver');
compare($x, $c, 'defaults');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 80,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'http://theserver');
compare($x, $c, 'defaults with http');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 443,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'https://theserver');
compare($x, $c, 'defaults with https');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 443,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'ssl://theserver');
compare($x, $c, 'defaults with ssl');


$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 65,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver', 65);
compare($x, $c, 'port 65');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 65,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'http://theserver', 65);
compare($x, $c, 'port 65 with http');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 65,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'https://theserver', 65);
compare($x, $c, 'port 65 with https');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 65,
    'proxy' => '',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'ssl://theserver', 65);
compare($x, $c, 'port 65 with ssl');


$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 80,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver', 0,
                        'theproxy');
compare($x, $c, 'defaults proxy');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 80,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'http://',
    'proxy_port' => 8080,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'http://theserver', 0,
                        'http://theproxy');
compare($x, $c, 'defaults with http proxy');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 443,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 443,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'https://theserver', 0,
                        'https://theproxy');
compare($x, $c, 'defaults with https proxy');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 443,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 443,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'ssl://theserver', 0,
                        'ssl://theproxy');
compare($x, $c, 'defaults with ssl proxy');


$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 65,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'http://',
    'proxy_port' => 6565,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver', 65,
                        'theproxy', 6565);
compare($x, $c, 'port 65 proxy 6565');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 65,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'http://',
    'proxy_port' => 6565,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'http://theserver', 65,
                        'http://theproxy', 6565);
compare($x, $c, 'port 65 with http proxy 6565');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 65,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 6565,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'https://theserver', 65,
                        'https://theproxy', 6565);
compare($x, $c, 'port 65 with https proxy 6565');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 65,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 6565,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'ssl://theserver', 65,
                        'ssl://theproxy', 6565);
compare($x, $c, 'port 65 with ssl proxy 6565');


$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'ssl://',
    'port' => 443,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 443,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver', 443,
                        'theproxy', 443);
compare($x, $c, 'port 443 no protocol and proxy port 443 no protocol');

$x = array(
    'path' => 'thepath',
    'server' => 'theserver',
    'protocol' => 'http://',
    'port' => 80,
    'proxy' => 'theproxy',
    'proxy_protocol' => 'ssl://',
    'proxy_port' => 6565,
    'proxy_user' => '',
    'proxy_pass' => '',
    'errno' => 0,
    'errstring' => '',
    'debug' => 0,
    'username' => '',
    'password' => '',
);
$c = new XML_RPC_Client('thepath', 'theserver', 0,
                        'ssl://theproxy', 6565);
compare($x, $c, 'port 443 no protocol and proxy port 443 no protocol');

echo "\nIf no other output was produced, these tests passed.\n";
PK�b�\b��)))*pear/test/XML_RPC/tests/actual-request.phpnu�[���<?php

/**
 * Actually performs an XML_RPC request.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: actual-request.php 300957 2010-07-02 23:55:00Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.5.3
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC/Dump.php';


$debug = 0;

$params = array(
    new XML_RPC_Value('php.net', 'string'),
);
$msg = new XML_RPC_Message('domquery', $params);
$client = new XML_RPC_Client('/api/xmlrpc', 'www.adamsnames.com');
$client->setDebug($debug);

$resp = $client->send($msg);
if (!$resp) {
    echo 'Communication error: ' . $client->errstr;
    exit(1);
}
if ($resp->faultCode()) {
    /*
     * Display problems that have been gracefully cought and
     * reported by the xmlrpc.php script
     */
    echo 'Fault Code: ' . $resp->faultCode() . "\n";
    echo 'Fault Reason: ' . $resp->faultString() . "\n";
    exit(1);
}

$val = $resp->value();
XML_RPC_Dump($val);
PK�b�\�B�"pear/test/XML_RPC/tests/allgot.incnu�[���<?php

/**
 * Parses the "return" value from some of our test scripts.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: allgot.inc 293223 2010-01-07 15:32:19Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.4.4
 */

ob_start();

function returnAllGot($params) {
    $out = '';
    $count = count($params->params);
    for ($i = 0; $i < $count; $i++) {
        $param = $params->getParam($i);
        if (!XML_RPC_Value::isValue($param)) {
            $out .= "parameter $i was error: $param\n";
            continue;
        }
        $got = XML_RPC_Decode($param);
        $out .= "param $i: " . var_export($got, true) . "\n";
    }
    $val = new XML_RPC_Value($out, 'string');
    return new XML_RPC_Response($val);
}

$server = new XML_RPC_Server(
    array(
        'allgot' => array(
            'function' => 'returnAllGot',
        ),
    )
);

$got = ob_get_clean();

if ($got == $expect) {
    echo "passed\n";
} else {
    echo "FAILED\n";
    echo "Expected:\n$expect\n";
    echo "Got:\n$got\n";
}
PK�b�\J����"pear/test/XML_RPC/tests/encode.phpnu�[���<?php

/**
 * Tests encoding values.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: extra-lines.php 293218 2010-01-07 14:20:08Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.5.3
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC.php';


$input = array(10, 11, 12);

$expect = <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>nada</methodName>
<params>
<param>
<value><array>
<data>
<value><int>10</int></value>
<value><int>11</int></value>
<value><int>12</int></value>
</data>
</array></value>
</param>
</params>
</methodCall>
EOT;

$expect = trim(preg_replace("/\r\n/", "\n", $expect));

$msg = new XML_RPC_Message('nada', array(XML_RPC_encode($input)));
$msg->createPayload();
$actual = trim(preg_replace("/\r\n/", "\n", $msg->payload));
if ($actual == $expect) {
    echo "passed\n";
} else {
    echo "PROBLEM\n";
    echo $actual;
}

$msg = new XML_RPC_Message('nada',
    array(
        new XML_RPC_Value(
            array(
                new XML_RPC_Value(10, 'int'),
                new XML_RPC_Value(11, 'int'),
                new XML_RPC_Value(12, 'int'),
            ),
            'array'
        )
    )
);
$msg->createPayload();
$actual = trim(preg_replace("/\r\n/", "\n", $msg->payload));
if ($actual == $expect) {
    echo "passed\n";
} else {
    echo "PROBLEM\n";
    echo $actual;
}
PK�b�\$]���'pear/test/XML_RPC/tests/empty-value.phpnu�[���<?php

/**
 * Tests how the XML_RPC server handles parameters with empty values.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: empty-value.php 300957 2010-07-02 23:55:00Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.4.4
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC/Server.php';


$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
<?xml version="1.0"?>
<methodCall>
 <methodName>allgot</methodName>
  <params>
   <param><value><string></string></value></param>
   <param><value>first</value></param>
   <param><value>  </value></param>
   <param><value></value></param>
  </params>
 </methodCall>
EOPOST;

$expect = <<<EOEXP
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value><string>param 0: ''
param 1: 'first'
param 2: '  '
param 3: ''
</string></value>
</param>
</params>
</methodResponse>
EOEXP;

include './allgot.inc';
PK�b�\|�E.pear/test/XML_RPC/tests/empty-value-struct.phpnu�[���<?php

/**
 * Tests how the XML_RPC server handles a parameter with an empty struct without
 * any spaces in the XML after the empty value.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: empty-value-struct.php 300957 2010-07-02 23:55:00Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.4.4
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC/Server.php';


$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
<?xml version="1.0"?>
<methodCall>
 <methodName>allgot</methodName>
  <params>
   <param>
    <value>
     <struct>
      <member>
      <name>fld1</name><value></value></member></struct></value>
   </param>
  </params>
 </methodCall>
EOPOST;

$expect = <<<EOEXP
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value><string>param 0: array (
  'fld1' =&gt; '',
)
</string></value>
</param>
</params>
</methodResponse>
EOEXP;

include './allgot.inc';
PK�b�\.��
��'pear/test/XML_RPC/tests/extra-lines.phpnu�[���<?php

/**
 * Tests how the XML_RPC server handles parameters with empty values.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: extra-lines.php 300958 2010-07-02 23:58:51Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.4.4
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC.php';


$input = "First lfs\n\nSecond crlfs\r\n\r\nThird crs\r\rFourth line";

$expect_removed = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n<methodName>nada</methodName>\r\n<params>\r\n<param>\r\n<value><string>First lfs\r\nSecond crlfs\r\nThird crs\r\nFourth line</string></value>\r\n</param>\r\n</params>\r\n</methodCall>\r\n";

$expect_not_removed = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<methodCall>\r\n<methodName>nada</methodName>\r\n<params>\r\n<param>\r\n<value><string>First lfs\r\n\r\nSecond crlfs\r\n\r\nThird crs\r\n\r\nFourth line</string></value>\r\n</param>\r\n</params>\r\n</methodCall>\r\n";

$msg = new XML_RPC_Message('nada', array(XML_RPC_encode($input)));
$msg->createPayload();
if ($msg->payload == $expect_removed) {
    echo "passed\n";
} else {
    echo "PROBLEM\n";
}

$msg = new XML_RPC_Message('nada', array(XML_RPC_encode($input)));
$msg->remove_extra_lines = false;
$msg->createPayload();
if ($msg->payload == $expect_not_removed) {
    echo "passed\n";
} else {
    echo "PROBLEM\n";
}
PK�b�\��̢�	�	!pear/test/XML_RPC/tests/types.phpnu�[���<?php

/**
 * Tests how the XML_RPC server handles a bunch of different parameter
 * data types.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: types.php 300957 2010-07-02 23:55:00Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 * @since      File available since Release 1.4.4
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC/Server.php';


$GLOBALS['HTTP_RAW_POST_DATA'] = <<<EOPOST
<?xml version="1.0"?>
<methodCall>
 <methodName>allgot</methodName>
  <params>
   <param><value>default to string</value></param>
   <param><value><string>inside string</string></value></param>
   <param><value><int>8</int></value></param>
   <param><value><datetime.iso8601>20050809T01:33:44</datetime.iso8601></value></param>

   <param>
    <value>
     <array>
      <data>
       <value>
        <string>a</string>
       </value>
       <value>
        <string>b</string>
       </value>
      </data>
     </array>
    </value>
   </param>

   <param>
    <value>
     <struct>
      <member>
       <name>a</name>
       <value>
        <string>ay</string>
       </value>
      </member>
      <member>
       <name>b</name>
       <value>
        <string>be</string>
       </value>
      </member>
     </struct>
    </value>
   </param>

  </params>
 </methodCall>
EOPOST;

$expect = <<<EOEXP
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value><string>param 0: 'default to string'
param 1: 'inside string'
param 2: '8'
param 3: '20050809T01:33:44'
param 4: array (
  0 =&gt; 'a',
  1 =&gt; 'b',
)
param 5: array (
  'a' =&gt; 'ay',
  'b' =&gt; 'be',
)
</string></value>
</param>
</params>
</methodResponse>
EOEXP;

include './allgot.inc';
PK�b�\���XX%pear/test/XML_RPC/tests/test_Dump.phpnu�[���<?php

/**
 * Actually performs an XML_RPC request.
 *
 * PHP versions 4 and 5
 *
 * @category   Web Services
 * @package    XML_RPC
 * @author     Daniel Convissor <danielc@php.net>
 * @copyright  2005-2010 The PHP Group
 * @license    http://www.php.net/license/3_01.txt  PHP License
 * @version    SVN: $Id: test_Dump.php 300962 2010-07-03 02:24:24Z danielc $
 * @link       http://pear.php.net/package/XML_RPC
 */

/*
 * If the package version number is found in the left hand
 * portion of the if() expression below, that means this file has
 * come from the PEAR installer.  Therefore, let's test the
 * installed version of XML_RPC which should be in the include path.
 *
 * If the version has not been substituted in the if() expression,
 * this file has likely come from a SVN checkout or a .tar file.
 * Therefore, we'll assume the tests should use the version of
 * XML_RPC that has come from there as well.
 */
if ('1.5.5' == '@'.'package_version'.'@') {
    ini_set('include_path', '../'
            . PATH_SEPARATOR . '.' . PATH_SEPARATOR
            . ini_get('include_path')
    );
}
require_once 'XML/RPC/Dump.php';


$val = new XML_RPC_Value(array(
    'title'    =>new XML_RPC_Value('das ist der Titel', 'string'),
    'startDate'=>new XML_RPC_Value(mktime(0,0,0,13,11,2004), 'dateTime.iso8601'),
    'endDate'  =>new XML_RPC_Value(mktime(0,0,0,15,11,2004), 'dateTime.iso8601'),
    'arkey'    => new XML_RPC_Value( array(
        new XML_RPC_Value('simple string'),
        new XML_RPC_Value(12345, 'int')
        ), 'array')
    )
    ,'struct');

XML_RPC_Dump($val);

echo '==============' . "\r\n";
$val2 = new XML_RPC_Value(44353, 'int');
XML_RPC_Dump($val2);

echo '==============' . "\r\n";
$val3 = new XML_RPC_Value('this should be a string', 'string');
XML_RPC_Dump($val3);

echo '==============' . "\r\n";
$val4 = new XML_RPC_Value(true, 'boolean');
XML_RPC_Dump($val4);

echo '==============' . "\r\n";
echo 'Next we will test the error handling...' . "\r\n";
$val5 = new XML_RPC_Value(array(
    'foo' => 'bar'
    ), 'struct');
XML_RPC_Dump($val5);

echo '==============' . "\r\n";
echo 'DONE' . "\r\n";
PK�b�\����4pear/test/Structures_LinkedList/tests/LinkTester.phpnu�[���<?php
class LinkTester extends Structures_LinkedList_DoubleNode {
    protected $_my_number;

    function __construct($num) {
        $this->_my_number = $num;
    }

    function getNumb() {
        return $this->_my_number;
    }

    function setNumb($numb) {
        $this->_my_number = $numb;
    }
}

$tester1 = new LinkTester(1);
$tester2 = new LinkTester(2);
$tester3 = new LinkTester(3);
$tester4 = new LinkTester(4);
$tester5 = new LinkTester(5);
$tester6 = new LinkTester(6);

?>
PK�b�\骗���3pear/test/Structures_LinkedList/tests/link_006.phptnu�[���--TEST--
link_006: Corner case: add a node before the root
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double();
$xyy->prependNode($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->insertNode($tester4, $tester2, true);

// Ensure we can increment the current node without messing up the list
print "\nCurrent: " . $xyy->current()->getNumb() . "\n";
$link = $xyy->next();
print "Current: " . $link->getNumb() . "\n";

$xyy->insertNode($tester5, $tester1, true);

print "\n";

$link = $xyy->current();
print "Current: " . $link->getNumb();

print "\n\nWhile: ";
// test iteration with while()
$link = $xyy->rewind();
do {
    print $link->getNumb();
} while ($link = $xyy->next());

print "\n\nForeach: ";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
Current: 1
Current: 4

Current: 4

While: 51423

Foreach: 51423
PK�b�\� ���3pear/test/Structures_LinkedList/tests/link_001.phptnu�[���--TEST--
link_001: Test linked list constructed with an initial link
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->appendNode($tester4);

$link = $xyy->current();
print "Current: " . $link->getNumb() . "\n";

print "While: ";
// test iteration with while()
do {
    print $link->getNumb();
} while ($link = $xyy->next());

print "\nRewind: ";
$link = $xyy->rewind();
print $link->getNumb();
print "\n";

print "Foreach: ";
// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}

print "\nEnd: ";
$link = $xyy->end();
print $link->getNumb();
print "\n";

print "While (in reverse): ";
// test iteration with while()
do {
    print $link->getNumb();
} while ($link = $xyy->previous());


?>
--EXPECT--
Current: 1
While: 1234
Rewind: 1
Foreach: 1234
End: 4
While (in reverse): 4321
PK�b�\)�y--:pear/test/Structures_LinkedList/tests/single_link_004.phptnu�[���--TEST--
single_link_004: Delete every link in the list
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->appendNode($tester4);

// Delete all nodes from the list
while ($link = $xyy->rewind()) {
    print "Deleted " . $link->getNumb() . "\n";
    $xyy->deleteNode($link);
}
$link = $xyy->rewind();
print "Done\n";
?>
--EXPECT--
Deleted 1
Deleted 2
Deleted 3
Deleted 4
Done
PK�b�\(��  3pear/test/Structures_LinkedList/tests/link_004.phptnu�[���--TEST--
link_004: Delete every link in the list
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->appendNode($tester4);

// Delete all nodes from the list
while ($link = $xyy->rewind()) {
    print "Deleted " . $link->getNumb() . "\n";
    $xyy->deleteNode($link);
}
$link = $xyy->rewind();
print "Done\n";
?>
--EXPECT--
Deleted 1
Deleted 2
Deleted 3
Deleted 4
Done
PK�b�\�4����:pear/test/Structures_LinkedList/tests/single_link_001.phptnu�[���--TEST--
single_link_001: Test linked list constructed with an initial link
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->appendNode($tester4);

$link = $xyy->current();
print "Current: " . $link->getNumb() . "\n";

print "While: ";
// test iteration with while()
do {
    print $link->getNumb();
} while ($link = $xyy->next());

print "\nRewind: ";
$link = $xyy->rewind();
print $link->getNumb();
print "\n";

print "Foreach: ";
// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}

print "\nEnd: ";
$link = $xyy->end();
print $link->getNumb();
print "\n";

print "While (in reverse): ";
// test iteration with while()
do {
    print $link->getNumb();
} while ($link = $xyy->previous());


?>
--EXPECT--
Current: 1
While: 1234
Rewind: 1
Foreach: 1234
End: 4
While (in reverse): 4321
PK�b�\��)��3pear/test/Structures_LinkedList/tests/link_002.phptnu�[���--TEST--
link_002: Append links to an initially empty linked list
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double();
$xyy->appendNode($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->insertNode($tester4, $tester2, true);

$link = $xyy->current();
print $link->getNumb();

// test iteration with while()
while ($link = $xyy->next()) {
    print $link->getNumb();
}
$link = $xyy->rewind();
print "\n";
print $link->getNumb();
print "\n";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
1423
1
1423
PK�b�\���|��:pear/test/Structures_LinkedList/tests/SingleLinkTester.phpnu�[���<?php
class LinkTester extends Structures_LinkedList_SingleNode {
    protected $_my_number;

    function __construct($num) {
        $this->_my_number = $num;
    }

    function getNumb() {
        return $this->_my_number;
    }

    function setNumb($numb) {
        $this->_my_number = $numb;
    }
}

$tester1 = new LinkTester(1);
$tester2 = new LinkTester(2);
$tester3 = new LinkTester(3);
$tester4 = new LinkTester(4);
$tester5 = new LinkTester(5);

?>
PK�b�\�#,E��:pear/test/Structures_LinkedList/tests/single_link_005.phptnu�[���--TEST--
single_link_005: Pass different class types to constructors
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';

class TesterExtend extends Structures_LinkedList_SingleNode {
    protected $_my_number;

    function __construct($tester, $num) {
        $this->_my_number = $num;
        parent::__construct($tester);
    }
}

class TesterFail {
    protected $summary;
    protected $fulltext;

    function __construct($summary, $fulltext) {
        $this->summary = $summary;
        $this->fulltext = $fulltext;
    }
}


// This should work: TesterExtend extends the Structure_LinkedList_SingleNode class
$tester_extend = new TesterExtend(null, 1);
$xyy = new Structures_LinkedList_Single($tester_extend);
print "Checking for errors in the expected success case:\n";

// This should fail
print "Checking for errors in the expected failure case:\n";
$tester_fail = new TesterFail(null, 1);
$xyy_fail = new Structures_LinkedList_Single($tester_fail);
?>
--EXPECTF--
Checking for errors in the expected success case:
Checking for errors in the expected failure case:

%satal error: Argument 1 passed to Structures_LinkedList_Single::__construct() must be an instance of Structures_LinkedList_SingleNode%s
PK�b�\�Z�x��:pear/test/Structures_LinkedList/tests/single_link_002.phptnu�[���--TEST--
single_link_002: Append links to an initially empty linked list
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single();
$xyy->appendNode($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->insertNode($tester4, $tester2, true);

$link = $xyy->current();
print $link->getNumb();

// test iteration with while()
while ($link = $xyy->next()) {
    print $link->getNumb();
}
$link = $xyy->rewind();
print "\n";
print $link->getNumb();
print "\n";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
1423
1
1423
PK�b�\s��DHH3pear/test/Structures_LinkedList/tests/link_007.phptnu�[���--TEST--
link_007: Test many corner cases
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double();

// prepend to an empty list corner case: 1
$xyy->prependNode($tester1);
print "Current: {$xyy->current()->getNumb()}\n";

// prepend to a list with only one element: 21
$xyy->prependNode($tester2);
print "Current: {$xyy->current()->getNumb()}\n";

// insert after tail node corner case: 213
$xyy->insertNode($tester3, $tester1);
print "Current: {$xyy->current()->getNumb()}\n";

// insert before root node corner case: 4213
$xyy->insertNode($tester4, $tester2, true);
print "Current: {$xyy->current()->getNumb()}\n";

// insert before tail node corner case: 42153
$xyy->insertNode($tester5, $tester3, true);
print "Current: {$xyy->current()->getNumb()}\n";

// insert after root node corner case: 421653
$xyy->insertNode($tester6, $tester1);
print "Current: {$xyy->current()->getNumb()}\n";

print "Foreach: ";
foreach ($xyy as $node) {
    print $node->getNumb();
}

print "\nWhile (in reverse): ";
// test reverse iteration with while()
$link = $xyy->end();
do {
    print $link->getNumb();
} while ($link = $xyy->previous());
?>
--EXPECT--
Current: 1
Current: 1
Current: 1
Current: 1
Current: 1
Current: 1
Foreach: 421653
While (in reverse): 356124
PK�b�\髂[��:pear/test/Structures_LinkedList/tests/single_link_006.phptnu�[���--TEST--
single_link_006: Corner case: add a node before the root
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single();
$xyy->prependNode($tester1);
$xyy->appendNode($tester2);
$xyy->appendNode($tester3);
$xyy->insertNode($tester4, $tester2, true);

// Ensure we can increment the current node without messing up the list
print "\nCurrent: " . $xyy->current()->getNumb() . "\n";
$link = $xyy->next();
print "Current: " . $link->getNumb() . "\n";

$xyy->insertNode($tester5, $tester1, true);

print "\n";

$link = $xyy->current();
print "Current: " . $link->getNumb();

print "\n\nWhile: ";
// test iteration with while()
$link = $xyy->rewind();
do {
    print $link->getNumb();
} while ($link = $xyy->next());

print "\n\nForeach: ";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
Current: 1
Current: 4

Current: 4

While: 51423

Foreach: 51423
PK�b�\�1����:pear/test/Structures_LinkedList/tests/single_link_007.phptnu�[���--TEST--
single_link_007: Test many corner cases
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single();

// prepend to an empty list corner case: 1
$xyy->prependNode($tester1);
print "Current: {$xyy->current()->getNumb()}\n";

// prepend to a list with only one element: 21
$xyy->prependNode($tester2);
print "Current: {$xyy->current()->getNumb()}\n";

// insert after tail node corner case: 213
$xyy->insertNode($tester3, $tester1);
print "Current: {$xyy->current()->getNumb()}\n";

// insert before root node corner case: 4213
$xyy->insertNode($tester4, $tester2, true);
print "Current: {$xyy->current()->getNumb()}\n";

// insert before tail node corner case: 42153
$xyy->insertNode($tester5, $tester3, true);
print "Current: {$xyy->current()->getNumb()}\n";

print "Foreach: ";
foreach ($xyy as $node) {
    print $node->getNumb();
}

print "\nWhile (in reverse): ";
// test reverse iteration with while()
$link = $xyy->end();
do {
    print $link->getNumb();
} while ($link = $xyy->previous());
?>
--EXPECT--
Current: 1
Current: 1
Current: 1
Current: 1
Current: 1
Foreach: 42153
While (in reverse): 35124
PK�b�\�K��:pear/test/Structures_LinkedList/tests/single_link_003.phptnu�[���--TEST--
single_link_003: Append links in a specific order
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Single.php';
require 'SingleLinkTester.php';

$xyy = new Structures_LinkedList_Single();

// add initial link in the list
$xyy->appendNode($tester1);
print $tester1->getNumb() . "\n";

// add after initial link
$xyy->appendNode($tester2);
print $tester2->getNumb() . "\n";

// add after initial link, bumping #2 up
$xyy->insertNode($tester3, $tester1);
print $tester3->getNumb() . "\n";

// add after link #3, bumping #2 up again
$xyy->insertNode($tester4, $tester3);
print $tester4->getNumb() . "\n";

print "\n";

$link = $xyy->current();
print $link->getNumb();
print "\n";

// test iteration with while()
while ($link = $xyy->next()) {
    print $link->getNumb();
    print "\n";
}
$link = $xyy->rewind();
print "\n";
print $link->getNumb();
print "\n";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
1
2
3
4

1
3
4
2

1
1342
PK�b�\�����3pear/test/Structures_LinkedList/tests/link_005.phptnu�[���--TEST--
link_005: Pass different class types to constructors
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';

class TesterExtend extends Structures_LinkedList_DoubleNode {
    protected $_my_number;

    function __construct($tester, $num) {
        $this->_my_number = $num;
        parent::__construct($tester);
    }
}

class TesterFail {
    protected $summary;
    protected $fulltext;

    function __construct($summary, $fulltext) {
        $this->summary = $summary;
        $this->fulltext = $fulltext;
    }
}


// This should work: TesterExtend extends the Structure_LinkedList_DoubleNode class
$tester_extend = new TesterExtend(null, 1);
$xyy = new Structures_LinkedList_Double($tester_extend);
print "Checking for errors in the expected success case:\n";

// This should fail
print "Checking for errors in the expected failure case:\n";
$tester_fail = new TesterFail(null, 1);
$xyy_fail = new Structures_LinkedList_Double($tester_fail);
?>
--EXPECTF--
Checking for errors in the expected success case:
Checking for errors in the expected failure case:

%satal error: Argument 1 passed to Structures_LinkedList_Double::__construct() must be an instance of Structures_LinkedList_DoubleNode%s
PK�b�\�o���3pear/test/Structures_LinkedList/tests/link_003.phptnu�[���--TEST--
link_003: Append links in a specific order
--FILE--
<?php
 
$dir = dirname(__FILE__);
require 'Structures/LinkedList/Double.php';
require 'LinkTester.php';

$xyy = new Structures_LinkedList_Double();

// add initial link in the list
$xyy->appendNode($tester1);
print $tester1->getNumb() . "\n";

// add after initial link
$xyy->appendNode($tester2);
print $tester2->getNumb() . "\n";

// add after initial link, bumping #2 up
$xyy->insertNode($tester3, $tester1);
print $tester3->getNumb() . "\n";

// add after link #3, bumping #2 up again
$xyy->insertNode($tester4, $tester3);
print $tester4->getNumb() . "\n";

print "\n";

$link = $xyy->current();
print $link->getNumb();
print "\n";

// test iteration with while()
while ($link = $xyy->next()) {
    print $link->getNumb();
    print "\n";
}
$link = $xyy->rewind();
print "\n";
print $link->getNumb();
print "\n";

// test foreach() iteration
foreach ($xyy as $bull) {
  print $bull->getNumb();
}
?>
--EXPECT--
1
2
3
4

1
3
4
2

1
1342
PK�b�\�>[336pear/test/Yaml/Symfony/Component/Yaml/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Yaml Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./vendor</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\��Q��:pear/test/Yaml/Symfony/Component/Yaml/Tests/DumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Tests;

use Symfony\Component\Yaml\Yaml;
use Symfony\Component\Yaml\Parser;
use Symfony\Component\Yaml\Dumper;

class DumperTest extends \PHPUnit_Framework_TestCase
{
    protected $parser;
    protected $dumper;
    protected $path;

    protected $array = array(
        '' => 'bar',
        'foo' => '#bar',
        'foo\'bar' => array(),
        'bar' => array(1, 'foo'),
        'foobar' => array(
            'foo' => 'bar',
            'bar' => array(1, 'foo'),
            'foobar' => array(
                'foo' => 'bar',
                'bar' => array(1, 'foo'),
            ),
        ),
    );

    protected function setUp()
    {
        $this->parser = new Parser();
        $this->dumper = new Dumper();
        $this->path = __DIR__.'/Fixtures';
    }

    protected function tearDown()
    {
        $this->parser = null;
        $this->dumper = null;
        $this->path = null;
        $this->array = null;
    }

    public function testSetIndentation()
    {
        $this->dumper->setIndentation(7);

$expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': {  }
bar:
       - 1
       - foo
foobar:
       foo: bar
       bar:
              - 1
              - foo
       foobar:
              foo: bar
              bar:
                     - 1
                     - foo

EOF;
        $this->assertEquals($expected, $this->dumper->dump($this->array, 4, 0));
    }

    public function testSpecifications()
    {
        $files = $this->parser->parse(file_get_contents($this->path.'/index.yml'));
        foreach ($files as $file) {
            $yamls = file_get_contents($this->path.'/'.$file.'.yml');

            // split YAMLs documents
            foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml) {
                if (!$yaml) {
                    continue;
                }

                $test = $this->parser->parse($yaml);
                if (isset($test['dump_skip']) && $test['dump_skip']) {
                    continue;
                } elseif (isset($test['todo']) && $test['todo']) {
                    // TODO
                } else {
                    eval('$expected = '.trim($test['php']).';');

                    $this->assertEquals($expected, $this->parser->parse($this->dumper->dump($expected, 10)), $test['test']);
                }
            }
        }
    }

    public function testInlineLevel()
    {
        $expected = <<<EOF
{ '': bar, foo: '#bar', 'foo''bar': {  }, bar: [1, foo], foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } }
EOF;
$this->assertEquals($expected, $this->dumper->dump($this->array, -10), '->dump() takes an inline level argument');
$this->assertEquals($expected, $this->dumper->dump($this->array, 0), '->dump() takes an inline level argument');

$expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': {  }
bar: [1, foo]
foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } }

EOF;
        $this->assertEquals($expected, $this->dumper->dump($this->array, 1), '->dump() takes an inline level argument');

        $expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': {  }
bar:
    - 1
    - foo
foobar:
    foo: bar
    bar: [1, foo]
    foobar: { foo: bar, bar: [1, foo] }

EOF;
        $this->assertEquals($expected, $this->dumper->dump($this->array, 2), '->dump() takes an inline level argument');

        $expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': {  }
bar:
    - 1
    - foo
foobar:
    foo: bar
    bar:
        - 1
        - foo
    foobar:
        foo: bar
        bar: [1, foo]

EOF;
        $this->assertEquals($expected, $this->dumper->dump($this->array, 3), '->dump() takes an inline level argument');

        $expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': {  }
bar:
    - 1
    - foo
foobar:
    foo: bar
    bar:
        - 1
        - foo
    foobar:
        foo: bar
        bar:
            - 1
            - foo

EOF;
        $this->assertEquals($expected, $this->dumper->dump($this->array, 4), '->dump() takes an inline level argument');
        $this->assertEquals($expected, $this->dumper->dump($this->array, 10), '->dump() takes an inline level argument');
    }

    public function testObjectSupportEnabled()
    {
        $dump = $this->dumper->dump(array('foo' => new A(), 'bar' => 1), 0, 0, false, true);

        $this->assertEquals('{ foo: !!php/object:O:30:"Symfony\Component\Yaml\Tests\A":1:{s:1:"a";s:3:"foo";}, bar: 1 }', $dump, '->dump() is able to dump objects');
    }

    public function testObjectSupportDisabledButNoExceptions()
    {
        $dump = $this->dumper->dump(array('foo' => new A(), 'bar' => 1));

        $this->assertEquals('{ foo: null, bar: 1 }', $dump, '->dump() does not dump objects when disabled');
    }

    /**
     * @expectedException \Symfony\Component\Yaml\Exception\DumpException
     */
    public function testObjectSupportDisabledWithExceptions()
    {
        $this->dumper->dump(array('foo' => new A(), 'bar' => 1), 0, 0, true, false);
    }
}

class A
{
    public $a = 'foo';
}
PK�b�\`�@ee8pear/test/Yaml/Symfony/Component/Yaml/Tests/YamlTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Tests;

use Symfony\Component\Yaml\Yaml;

class YamlTest extends \PHPUnit_Framework_TestCase
{
    public function testParseAndDump()
    {
        $data = array('lorem' => 'ipsum', 'dolor' => 'sit');
        $yml = Yaml::dump($data);
        $parsed = Yaml::parse($yml);
        $this->assertEquals($data, $parsed);

        $filename = __DIR__.'/Fixtures/index.yml';
        $contents = file_get_contents($filename);
        $parsedByFilename = Yaml::parse($filename);
        $parsedByContents = Yaml::parse($contents);
        $this->assertEquals($parsedByFilename, $parsedByContents);
    }
}
PK�b�\�����Hpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsBlockMapping.ymlnu�[���---
test: One Element Mapping
brief: |
    A mapping with one key/value pair
yaml: |
    foo: bar
php: |
    array('foo' => 'bar')
---
test: Multi Element Mapping
brief: |
    More than one key/value pair
yaml: |
    red: baron
    white: walls
    blue: berries
php: |
    array(
     'red' => 'baron',
     'white' => 'walls',
     'blue' => 'berries',
    )
---
test: Values aligned
brief: |
    Often times human editors of documents will align the values even
    though YAML emitters generally don't.
yaml: |
    red:   baron
    white: walls
    blue:  berries
php: |
    array(
     'red' => 'baron',
     'white' => 'walls',
     'blue' => 'berries',
    )
---
test: Colons aligned
brief: |
    Spaces can come before the ': ' key/value separator.
yaml: |
    red   : baron
    white : walls
    blue  : berries
php: |
    array(
     'red' => 'baron',
     'white' => 'walls',
     'blue' => 'berries',
    )
PK�b�\�>;���Kpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsNullsAndEmpties.ymlnu�[���--- %YAML:1.0
test: Empty Sequence
brief: >
    You can represent the empty sequence
    with an empty inline sequence.
yaml: |
    empty: []
php: |
    array('empty' => array())
---
test: Empty Mapping
brief: >
    You can represent the empty mapping
    with an empty inline mapping.
yaml: |
    empty: {}
php: |
    array('empty' => array())
---
test: Empty Sequence as Entire Document
yaml: |
    []
php: |
    array()
---
test: Empty Mapping as Entire Document
yaml: |
    {}
php: |
    array()
---
test: Null as Document
yaml: |
    ~
php: |
    null
---
test: Empty String
brief: >
    You can represent an empty string
    with a pair of quotes.
yaml: |
    ''
php: |
    ''
PK�b�\�5�R[[Gpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsAnchorAlias.ymlnu�[���--- %YAML:1.0
test: Simple Alias Example
brief: >
    If you need to refer to the same item of data twice,
    you can give that item an alias.  The alias is a plain
    string, starting with an ampersand.  The item may then
    be referred to by the alias throughout your document
    by using an asterisk before the name of the alias.
    This is called an anchor.
yaml: |
    - &showell Steve
    - Clark
    - Brian
    - Oren
    - *showell
php: |
    array('Steve', 'Clark', 'Brian', 'Oren', 'Steve')

---
test: Alias of a Mapping
brief: >
    An alias can be used on any item of data, including
    sequences, mappings, and other complex data types.
yaml: |
    - &hello
        Meat: pork
        Starch: potato
    - banana
    - *hello
php: |
    array(array('Meat'=>'pork', 'Starch'=>'potato'), 'banana', array('Meat'=>'pork', 'Starch'=>'potato'))
PK�b�\Z��Cpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/embededPhp.ymlnu�[���value: <?php echo 1 + 2 + 3 ?>
PK�b�\��UUBpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfCompact.ymlnu�[���--- %YAML:1.0
test: Compact notation
brief: |
    Compact notation for sets of mappings with single element
yaml: |
  ---
  # products purchased
  - item    : Super Hoop
  - item    : Basketball
    quantity: 1
  - item:
      name: Big Shoes
      nick: Biggies
    quantity: 1
php: |
  array (
    array (
      'item' => 'Super Hoop',
    ),
    array (
      'item' => 'Basketball',
      'quantity' => 1,
    ),
    array (
      'item' => array(
        'name' => 'Big Shoes',
        'nick' => 'Biggies'
      ),
      'quantity' => 1
    )
  )
---
test: Compact notation combined with inline notation
brief: |
    Combinations of compact and inline notation are allowed
yaml: |
  ---
  items:
    - { item: Super Hoop, quantity: 1 }
    - [ Basketball, Big Shoes ]
php: |
  array (
    'items' => array (
      array (
        'item' => 'Super Hoop',
        'quantity' => 1,
      ),
      array (
        'Basketball',
        'Big Shoes'
      )
    )
  )
--- %YAML:1.0
test: Compact notation
brief: |
    Compact notation for sets of mappings with single element
yaml: |
  ---
  # products purchased
  - item    : Super Hoop
  - item    : Basketball
    quantity: 1
  - item:
      name: Big Shoes
      nick: Biggies
    quantity: 1
php: |
  array (
    array (
      'item' => 'Super Hoop',
    ),
    array (
      'item' => 'Basketball',
      'quantity' => 1,
    ),
    array (
      'item' => array(
        'name' => 'Big Shoes',
        'nick' => 'Biggies'
      ),
      'quantity' => 1
    )
  )
---
test: Compact notation combined with inline notation
brief: |
    Combinations of compact and inline notation are allowed
yaml: |
  ---
  items:
    - { item: Super Hoop, quantity: 1 }
    - [ Basketball, Big Shoes ]
php: |
  array (
    'items' => array (
      array (
        'item' => 'Super Hoop',
        'quantity' => 1,
      ),
      array (
        'Basketball',
        'Big Shoes'
      )
    )
  )
--- %YAML:1.0
test: Compact notation
brief: |
    Compact notation for sets of mappings with single element
yaml: |
  ---
  # products purchased
  - item    : Super Hoop
  - item    : Basketball
    quantity: 1
  - item:
      name: Big Shoes
      nick: Biggies
    quantity: 1
php: |
  array (
    array (
      'item' => 'Super Hoop',
    ),
    array (
      'item' => 'Basketball',
      'quantity' => 1,
    ),
    array (
      'item' => array(
        'name' => 'Big Shoes',
        'nick' => 'Biggies'
      ),
      'quantity' => 1
    )
  )
---
test: Compact notation combined with inline notation
brief: |
    Combinations of compact and inline notation are allowed
yaml: |
  ---
  items:
    - { item: Super Hoop, quantity: 1 }
    - [ Basketball, Big Shoes ]
php: |
  array (
    'items' => array (
      array (
        'item' => 'Super Hoop',
        'quantity' => 1,
      ),
      array (
        'Basketball',
        'Big Shoes'
      )
    )
  )
PK�b�\���88>pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/index.ymlnu�[���- escapedCharacters
- sfComments
- sfCompact
- sfTests
- sfObjects
- sfMergeKey
- sfQuotes
- YtsAnchorAlias
- YtsBasicTests
- YtsBlockMapping
- YtsDocumentSeparator
- YtsErrorTests
- YtsFlowCollections
- YtsFoldedScalars
- YtsNullsAndEmpties
- YtsSpecificationExamples
- YtsTypeTransfers
- unindentedCollections
PK�b�\�@�UUCpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfComments.ymlnu�[���--- %YAML:1.0
test: Comments at the end of a line
brief: >
    Comments at the end of a line
yaml: |
    ex1: "foo # bar"
    ex2: "foo # bar" # comment
    ex3: 'foo # bar' # comment
    ex4: foo # comment
php: |
    array('ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo')
---
test: Comments in the middle
brief: >
  Comments in the middle
yaml: |
    foo:
    # some comment
    # some comment
      bar: foo
    # some comment
    # some comment
php: |
    array('foo' => array('bar' => 'foo'))
---
test: Comments on a hash line
brief: >
  Comments on a hash line
yaml: |
    foo:   # a comment
      foo: bar # a comment
php: |
    array('foo' => array('foo' => 'bar'))
---
test: 'Value starting with a #'
brief: >
  'Value starting with a #'
yaml: |
    foo:   '#bar'
php: |
    array('foo' => '#bar')
---
test: Document starting with a comment and a separator
brief: >
  Commenting before document start is allowed
yaml: |
    # document comment
    ---
    foo: bar # a comment
php: |
    array('foo' => 'bar')
---
test: Comment containing a colon on a hash line
brief: >
    Comment containing a colon on a scalar line
yaml: 'foo # comment: this is also part of the comment'
php: |
    'foo'
---
test: 'Hash key containing a #'
brief: >
    'Hash key containing a #'
yaml: 'foo#bar: baz'
php: |
    array('foo#bar' => 'baz')
PK�b�\��--Npear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/unindentedCollections.ymlnu�[���--- %YAML:1.0
test: Unindented collection
brief: >
    Unindented collection
yaml: |
    collection:
    - item1
    - item2
    - item3
php: |
    array('collection' => array('item1', 'item2', 'item3'))
---
test: Nested unindented collection (two levels)
brief: >
    Nested unindented collection
yaml: |
    collection:
        key:
        - a
        - b
        - c
php: |
    array('collection' => array('key' => array('a', 'b', 'c')))
---
test: Nested unindented collection (three levels)
brief: >
    Nested unindented collection
yaml: |
    collection:
        key:
            subkey:
            - one
            - two
            - three
php: |
    array('collection' => array('key' => array('subkey' => array('one', 'two', 'three'))))
---
test: Key/value after unindented collection (1)
brief: >
    Key/value after unindented collection (1)
yaml: |
    collection:
        key:
        - a
        - b
        - c
    foo: bar
php: |
    array('collection' => array('key' => array('a', 'b', 'c')), 'foo' => 'bar')
---
test: Key/value after unindented collection (at the same level)
brief: >
    Key/value after unindented collection
yaml: |
    collection:
        key:
        - a
        - b
        - c
        foo: bar
php: |
    array('collection' => array('key' => array('a', 'b', 'c'), 'foo' => 'bar'))
PK�b�\�*���Jpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/escapedCharacters.ymlnu�[���test: outside double quotes
yaml: |
    \0 \ \a \b \n
php: |
    "\\0 \\ \\a \\b \\n"
---
test: null
yaml: |
    "\0"
php: |
    "\x00"
---
test: bell
yaml: |
    "\a"
php: |
    "\x07"
---
test: backspace
yaml: |
    "\b"
php: |
    "\x08"
---
test: horizontal tab (1)
yaml: |
    "\t"
php: |
    "\x09"
---
test: horizontal tab (2)
yaml: |
    "\	"
php: |
    "\x09"
---
test: line feed
yaml: |
    "\n"
php: |
    "\x0a"
---
test: vertical tab
yaml: |
    "\v"
php: |
    "\x0b"
---
test: form feed
yaml: |
    "\f"
php: |
    "\x0c"
---
test: carriage return
yaml: |
    "\r"
php: |
    "\x0d"
---
test: escape
yaml: |
    "\e"
php: |
   "\x1b"
---
test: space
yaml: |
    "\ "
php: |
    "\x20"
---
test: slash
yaml: |
    "\/"
php: |
    "\x2f"
---
test: backslash
yaml: |
    "\\"
php: |
    "\\"
---
test: Unicode next line
yaml: |
    "\N"
php: |
    "\xc2\x85"
---
test: Unicode non-breaking space
yaml: |
    "\_"
php: |
    "\xc2\xa0"
---
test: Unicode line separator
yaml: |
    "\L"
php: |
    "\xe2\x80\xa8"
---
test: Unicode paragraph separator
yaml: |
    "\P"
php: |
    "\xe2\x80\xa9"
---
test: Escaped 8-bit Unicode
yaml: |
    "\x42"
php: |
    "B"
---
test: Escaped 16-bit Unicode
yaml: |
    "\u20ac"
php: |
    "\xe2\x82\xac"
---
test: Escaped 32-bit Unicode
yaml: |
    "\U00000043"
php: |
    "C"
---
test: Example 5.13 Escaped Characters
note: |
    Currently throws an error parsing first line. Maybe Symfony Yaml doesn't support
    continuation of string across multiple lines? Keeping test here but disabled.
todo: true
yaml: |
    "Fun with \\
    \" \a \b \e \f \
    \n \r \t \v \0 \
    \  \_ \N \L \P \
    \x41 \u0041 \U00000041"
php: |
    "Fun with \x5C\n\x22 \x07 \x08 \x1B \x0C\n\x0A \x0D \x09 \x0B \x00\n\x20 \xA0 \x85 \xe2\x80\xa8 \xe2\x80\xa9\nA A A"
---
test: Double quotes with a line feed
yaml: |
   { double: "some value\n \"some quoted string\" and 'some single quotes one'" }
php: |
    array(
        'double' => "some value\n \"some quoted string\" and 'some single quotes one'"
    )
PK�b�\ܷU�1�1�Qpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsSpecificationExamples.ymlnu�[���--- %YAML:1.0
test: Sequence of scalars
spec: 2.1
yaml: |
  - Mark McGwire
  - Sammy Sosa
  - Ken Griffey
php: |
  array('Mark McGwire', 'Sammy Sosa', 'Ken Griffey')
---
test: Mapping of scalars to scalars
spec: 2.2
yaml: |
  hr:  65
  avg: 0.278
  rbi: 147
php: |
  array('hr' => 65, 'avg' => 0.278, 'rbi' => 147)
---
test: Mapping of scalars to sequences
spec: 2.3
yaml: |
    american:
       - Boston Red Sox
       - Detroit Tigers
       - New York Yankees
    national:
       - New York Mets
       - Chicago Cubs
       - Atlanta Braves
php: |
    array('american' =>
        array( 'Boston Red Sox', 'Detroit Tigers',
          'New York Yankees' ),
      'national' =>
        array( 'New York Mets', 'Chicago Cubs',
          'Atlanta Braves' )
    )
---
test: Sequence of mappings
spec: 2.4
yaml: |
    -
      name: Mark McGwire
      hr:   65
      avg:  0.278
    -
      name: Sammy Sosa
      hr:   63
      avg:  0.288
php: |
    array(
      array('name' => 'Mark McGwire', 'hr' => 65, 'avg' => 0.278),
      array('name' => 'Sammy Sosa', 'hr' => 63, 'avg' => 0.288)
    )
---
test: Legacy A5
todo: true
spec: legacy_A5
yaml: |
    ?
        - New York Yankees
        - Atlanta Braves
    :
      - 2001-07-02
      - 2001-08-12
      - 2001-08-14
    ?
        - Detroit Tigers
        - Chicago Cubs
    :
      - 2001-07-23
perl-busted: >
    YAML.pm will be able to emulate this behavior soon. In this regard
    it may be somewhat more correct than Python's native behaviour which
    can only use tuples as mapping keys. PyYAML will also need to figure
    out some clever way to roundtrip structured keys.
python: |
    [
    {
        ('New York Yankees', 'Atlanta Braves'):
            [yaml.timestamp('2001-07-02'),
             yaml.timestamp('2001-08-12'),
             yaml.timestamp('2001-08-14')],
        ('Detroit Tigers', 'Chicago Cubs'):
        [yaml.timestamp('2001-07-23')]
    }
    ]
ruby: |
    {
      [ 'New York Yankees', 'Atlanta Braves' ] =>
        [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ],
      [ 'Detroit Tigers', 'Chicago Cubs' ] =>
        [ Date.new( 2001, 7, 23 ) ]
    }
syck: |
  struct test_node seq1[] = {
      { T_STR, 0, "New York Yankees" },
      { T_STR, 0, "Atlanta Braves" },
      end_node
  };
  struct test_node seq2[] = {
      { T_STR, 0, "2001-07-02" },
      { T_STR, 0, "2001-08-12" },
      { T_STR, 0, "2001-08-14" },
      end_node
  };
  struct test_node seq3[] = {
      { T_STR, 0, "Detroit Tigers" },
      { T_STR, 0, "Chicago Cubs" },
      end_node
  };
  struct test_node seq4[] = {
      { T_STR, 0, "2001-07-23" },
      end_node
  };
  struct test_node map[] = {
      { T_SEQ, 0, 0, seq1 },
      { T_SEQ, 0, 0, seq2 },
      { T_SEQ, 0, 0, seq3 },
      { T_SEQ, 0, 0, seq4 },
      end_node
  };
  struct test_node stream[] = {
      { T_MAP, 0, 0, map },
      end_node
  };

---
test: Sequence of sequences
spec: 2.5
yaml: |
  - [ name         , hr , avg   ]
  - [ Mark McGwire , 65 , 0.278 ]
  - [ Sammy Sosa   , 63 , 0.288 ]
php: |
  array(
    array( 'name', 'hr', 'avg' ),
    array( 'Mark McGwire', 65, 0.278 ),
    array( 'Sammy Sosa', 63, 0.288 )
  )
---
test: Mapping of mappings
todo: true
spec: 2.6
yaml: |
  Mark McGwire: {hr: 65, avg: 0.278}
  Sammy Sosa: {
      hr: 63,
      avg: 0.288
    }
php: |
  array(
    'Mark McGwire' =>
      array( 'hr' => 65, 'avg' => 0.278 ),
    'Sammy Sosa' =>
      array( 'hr' => 63, 'avg' => 0.288 )
  )
---
test: Two documents in a stream each with a leading comment
todo: true
spec: 2.7
yaml: |
  # Ranking of 1998 home runs
  ---
  - Mark McGwire
  - Sammy Sosa
  - Ken Griffey

  # Team ranking
  ---
  - Chicago Cubs
  - St Louis Cardinals
ruby: |
  y = YAML::Stream.new
  y.add( [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ] )
  y.add( [ 'Chicago Cubs', 'St Louis Cardinals' ] )
documents: 2

---
test: Play by play feed from a game
todo: true
spec: 2.8
yaml: |
  ---
  time: 20:03:20
  player: Sammy Sosa
  action: strike (miss)
  ...
  ---
  time: 20:03:47
  player: Sammy Sosa
  action: grand slam
  ...
perl: |
  [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ]
documents: 2

---
test: Single document with two comments
spec: 2.9
yaml: |
  hr: # 1998 hr ranking
    - Mark McGwire
    - Sammy Sosa
  rbi:
    # 1998 rbi ranking
    - Sammy Sosa
    - Ken Griffey
php: |
  array(
    'hr' => array( 'Mark McGwire', 'Sammy Sosa' ),
    'rbi' => array( 'Sammy Sosa', 'Ken Griffey' )
  )
---
test: Node for Sammy Sosa appears twice in this document
spec: 2.10
yaml: |
   ---
   hr:
      - Mark McGwire
      # Following node labeled SS
      - &SS Sammy Sosa
   rbi:
      - *SS # Subsequent occurrence
      - Ken Griffey
php: |
   array(
      'hr' =>
         array('Mark McGwire', 'Sammy Sosa'),
      'rbi' =>
         array('Sammy Sosa', 'Ken Griffey')
   )
---
test: Mapping between sequences
todo: true
spec: 2.11
yaml: |
   ? # PLAY SCHEDULE
     - Detroit Tigers
     - Chicago Cubs
   :
     - 2001-07-23

   ? [ New York Yankees,
       Atlanta Braves ]
   : [ 2001-07-02, 2001-08-12,
       2001-08-14 ]
ruby: |
   {
      [ 'Detroit Tigers', 'Chicago Cubs' ] => [ Date.new( 2001, 7, 23 ) ],
      [ 'New York Yankees', 'Atlanta Braves' ] => [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ]
   }
syck: |
  struct test_node seq1[] = {
      { T_STR, 0, "New York Yankees" },
      { T_STR, 0, "Atlanta Braves" },
      end_node
  };
  struct test_node seq2[] = {
      { T_STR, 0, "2001-07-02" },
      { T_STR, 0, "2001-08-12" },
      { T_STR, 0, "2001-08-14" },
      end_node
  };
  struct test_node seq3[] = {
      { T_STR, 0, "Detroit Tigers" },
      { T_STR, 0, "Chicago Cubs" },
      end_node
  };
  struct test_node seq4[] = {
      { T_STR, 0, "2001-07-23" },
      end_node
  };
  struct test_node map[] = {
      { T_SEQ, 0, 0, seq3 },
      { T_SEQ, 0, 0, seq4 },
      { T_SEQ, 0, 0, seq1 },
      { T_SEQ, 0, 0, seq2 },
      end_node
  };
  struct test_node stream[] = {
      { T_MAP, 0, 0, map },
      end_node
  };

---
test: Sequence key shortcut
spec: 2.12
yaml: |
  ---
  # products purchased
  - item    : Super Hoop
    quantity: 1
  - item    : Basketball
    quantity: 4
  - item    : Big Shoes
    quantity: 1
php: |
  array (
    array (
      'item' => 'Super Hoop',
      'quantity' => 1,
    ),
    array (
      'item' => 'Basketball',
      'quantity' => 4,
    ),
    array (
      'item' => 'Big Shoes',
      'quantity' => 1,
    )
  )
perl: |
  [
     { item => 'Super Hoop', quantity => 1 },
     { item => 'Basketball', quantity => 4 },
     { item => 'Big Shoes',  quantity => 1 }
  ]

ruby: |
  [
     { 'item' => 'Super Hoop', 'quantity' => 1 },
     { 'item' => 'Basketball', 'quantity' => 4 },
     { 'item' => 'Big Shoes', 'quantity' => 1 }
  ]
python: |
  [
       { 'item': 'Super Hoop', 'quantity': 1 },
       { 'item': 'Basketball', 'quantity': 4 },
       { 'item': 'Big Shoes',  'quantity': 1 }
  ]
syck: |
  struct test_node map1[] = {
      { T_STR, 0, "item" },
          { T_STR, 0, "Super Hoop" },
      { T_STR, 0, "quantity" },
          { T_STR, 0, "1" },
      end_node
  };
  struct test_node map2[] = {
      { T_STR, 0, "item" },
          { T_STR, 0, "Basketball" },
      { T_STR, 0, "quantity" },
          { T_STR, 0, "4" },
      end_node
  };
  struct test_node map3[] = {
      { T_STR, 0, "item" },
          { T_STR, 0, "Big Shoes" },
      { T_STR, 0, "quantity" },
          { T_STR, 0, "1" },
      end_node
  };
  struct test_node seq[] = {
      { T_MAP, 0, 0, map1 },
      { T_MAP, 0, 0, map2 },
      { T_MAP, 0, 0, map3 },
      end_node
  };
  struct test_node stream[] = {
      { T_SEQ, 0, 0, seq },
      end_node
  };


---
test: Literal perserves newlines
todo: true
spec: 2.13
yaml: |
  # ASCII Art
  --- |
    \//||\/||
    // ||  ||_
perl: |
  "\\//||\\/||\n// ||  ||_\n"
ruby: |
  "\\//||\\/||\n// ||  ||_\n"
python: |
    [
        flushLeft(
        """
        \//||\/||
        // ||  ||_
        """
        )
    ]
syck: |
  struct test_node stream[] = {
      { T_STR, 0, "\\//||\\/||\n// ||  ||_\n" },
      end_node
  };

---
test: Folded treats newlines as a space
todo: true
spec: 2.14
yaml: |
  ---
    Mark McGwire's
    year was crippled
    by a knee injury.
perl: |
  "Mark McGwire's year was crippled by a knee injury."
ruby: |
  "Mark McGwire's year was crippled by a knee injury."
python: |
    [ "Mark McGwire's year was crippled by a knee injury." ]
syck: |
  struct test_node stream[] = {
      { T_STR, 0, "Mark McGwire's year was crippled by a knee injury." },
      end_node
  };

---
test: Newlines preserved for indented and blank lines
todo: true
spec: 2.15
yaml: |
  --- >
   Sammy Sosa completed another
   fine season with great stats.

     63 Home Runs
     0.288 Batting Average

   What a year!
perl: |
  "Sammy Sosa completed another fine season with great stats.\n\n  63 Home Runs\n  0.288 Batting Average\n\nWhat a year!\n"
ruby: |
  "Sammy Sosa completed another fine season with great stats.\n\n  63 Home Runs\n  0.288 Batting Average\n\nWhat a year!\n"
python: |
    [
        flushLeft(
        """
        Sammy Sosa completed another fine season with great stats.

          63 Home Runs
          0.288 Batting Average

        What a year!
        """
        )
    ]
syck: |
  struct test_node stream[] = {
      { T_STR, 0, "Sammy Sosa completed another fine season with great stats.\n\n  63 Home Runs\n  0.288 Batting Average\n\nWhat a year!\n" },
      end_node
  };


---
test: Indentation determines scope
spec: 2.16
yaml: |
  name: Mark McGwire
  accomplishment: >
     Mark set a major league
     home run record in 1998.
  stats: |
     65 Home Runs
     0.278 Batting Average
php: |
  array(
    'name'           => 'Mark McGwire',
    'accomplishment' => "Mark set a major league home run record in 1998.\n",
    'stats'          => "65 Home Runs\n0.278 Batting Average\n"
  )
---
test: Quoted scalars
todo: true
spec: 2.17
yaml: |
  unicode: "Sosa did fine.\u263A"
  control: "\b1998\t1999\t2000\n"
  hexesc:  "\x0D\x0A is \r\n"

  single: '"Howdy!" he cried.'
  quoted: ' # not a ''comment''.'
  tie-fighter: '|\-*-/|'
ruby: |
  {
    "tie-fighter" => "|\\-*-/|",
    "control"=>"\0101998\t1999\t2000\n",
    "unicode"=>"Sosa did fine." + ["263A".hex ].pack('U*'),
    "quoted"=>" # not a 'comment'.",
    "single"=>"\"Howdy!\" he cried.",
    "hexesc"=>"\r\n is \r\n"
  }
---
test: Multiline flow scalars
todo: true
spec: 2.18
yaml: |
  plain:
    This unquoted scalar
    spans many lines.

  quoted: "So does this
    quoted scalar.\n"
ruby: |
  {
    'plain' => 'This unquoted scalar spans many lines.',
    'quoted' => "So does this quoted scalar.\n"
  }
---
test: Integers
spec: 2.19
yaml: |
  canonical: 12345
  decimal: +12,345
  octal: 014
  hexadecimal: 0xC
php: |
  array(
    'canonical' => 12345,
    'decimal' => 12345,
    'octal' => 014,
    'hexadecimal' => 0xC
  )
---
# FIX: spec shows parens around -inf and NaN
test: Floating point
spec: 2.20
yaml: |
  canonical: 1.23015e+3
  exponential: 12.3015e+02
  fixed: 1,230.15
  negative infinity: -.inf
  not a number: .NaN
php: |
  array(
    'canonical' => 1230.15,
    'exponential' => 1230.15,
    'fixed' => 1230.15,
    'negative infinity' => log(0),
    'not a number' => -log(0),
  )
---
test: Miscellaneous
spec: 2.21
yaml: |
  null: ~
  true: true
  false: false
  string: '12345'
php: |
  array(
    '' => null,
    1 => true,
    0 => false,
    'string' => '12345'
  )
---
test: Timestamps
todo: true
spec: 2.22
yaml: |
  canonical: 2001-12-15T02:59:43.1Z
  iso8601:  2001-12-14t21:59:43.10-05:00
  spaced:  2001-12-14 21:59:43.10 -05:00
  date:   2002-12-14 # Time is noon UTC
php: |
  array(
    'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ),
    'iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
    'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
    'date' => Date.new( 2002, 12, 14 )
  )
---
test: legacy Timestamps test
todo: true
spec: legacy D4
yaml: |
    canonical: 2001-12-15T02:59:43.00Z
    iso8601:  2001-02-28t21:59:43.00-05:00
    spaced:  2001-12-14 21:59:43.00 -05:00
    date:   2002-12-14
php: |
   array(
     'canonical' => Time::utc( 2001, 12, 15, 2, 59, 43, 0 ),
     'iso8601' => YAML::mktime( 2001, 2, 28, 21, 59, 43, 0, "-05:00" ),
     'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0, "-05:00" ),
     'date' => Date.new( 2002, 12, 14 )
   )
---
test: Various explicit families
todo: true
spec: 2.23
yaml: |
  not-date: !str 2002-04-28
  picture: !binary |
   R0lGODlhDAAMAIQAAP//9/X
   17unp5WZmZgAAAOfn515eXv
   Pz7Y6OjuDg4J+fn5OTk6enp
   56enmleECcgggoBADs=

  application specific tag: !!something |
   The semantics of the tag
   above may be different for
   different documents.

ruby-setup: |
  YAML.add_private_type( "something" ) do |type, val|
    "SOMETHING: #{val}"
  end
ruby: |
  {
    'not-date' => '2002-04-28',
    'picture' => "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236i^\020' \202\n\001\000;",
    'application specific tag' => "SOMETHING: The semantics of the tag\nabove may be different for\ndifferent documents.\n"
  }
---
test: Application specific family
todo: true
spec: 2.24
yaml: |
  # Establish a tag prefix
  --- !clarkevans.com,2002/graph/^shape
    # Use the prefix: shorthand for
    # !clarkevans.com,2002/graph/circle
  - !^circle
    center: &ORIGIN {x: 73, 'y': 129}
    radius: 7
  - !^line # !clarkevans.com,2002/graph/line
    start: *ORIGIN
    finish: { x: 89, 'y': 102 }
  - !^label
    start: *ORIGIN
    color: 0xFFEEBB
    value: Pretty vector drawing.
ruby-setup: |
  YAML.add_domain_type( "clarkevans.com,2002", 'graph/shape' ) { |type, val|
    if Array === val
      val << "Shape Container"
      val
    else
      raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect
    end
  }
  one_shape_proc = Proc.new { |type, val|
    scheme, domain, type = type.split( /:/, 3 )
    if val.is_a? ::Hash
      val['TYPE'] = "Shape: #{type}"
      val
    else
      raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect
    end
  }
  YAML.add_domain_type( "clarkevans.com,2002", 'graph/circle', &one_shape_proc )
  YAML.add_domain_type( "clarkevans.com,2002", 'graph/line', &one_shape_proc )
  YAML.add_domain_type( "clarkevans.com,2002", 'graph/label', &one_shape_proc )
ruby: |
  [
    {
      "radius" => 7,
      "center"=>
      {
        "x" => 73,
        "y" => 129
      },
      "TYPE" => "Shape: graph/circle"
    }, {
      "finish" =>
      {
        "x" => 89,
        "y" => 102
      },
      "TYPE" => "Shape: graph/line",
      "start" =>
      {
        "x" => 73,
        "y" => 129
      }
    }, {
      "TYPE" => "Shape: graph/label",
      "value" => "Pretty vector drawing.",
      "start" =>
      {
        "x" => 73,
        "y" => 129
      },
      "color" => 16772795
    },
    "Shape Container"
  ]
# ---
# test: Unordered set
# spec: 2.25
# yaml: |
#   # sets are represented as a
#   # mapping where each key is
#   # associated with the empty string
#   --- !set
#   ? Mark McGwire
#   ? Sammy Sosa
#   ? Ken Griff
---
test: Ordered mappings
todo: true
spec: 2.26
yaml: |
  # ordered maps are represented as
  # a sequence of mappings, with
  # each mapping having one key
  --- !omap
  - Mark McGwire: 65
  - Sammy Sosa: 63
  - Ken Griffy: 58
ruby: |
  YAML::Omap[
    'Mark McGwire', 65,
    'Sammy Sosa', 63,
    'Ken Griffy', 58
  ]
---
test: Invoice
dump_skip: true
spec: 2.27
yaml: |
  --- !clarkevans.com,2002/^invoice
  invoice: 34843
  date   : 2001-01-23
  bill-to: &id001
      given  : Chris
      family : Dumars
      address:
          lines: |
              458 Walkman Dr.
              Suite #292
          city    : Royal Oak
          state   : MI
          postal  : 48046
  ship-to: *id001
  product:
      -
        sku         : BL394D
        quantity    : 4
        description : Basketball
        price       : 450.00
      -
        sku         : BL4438H
        quantity    : 1
        description : Super Hoop
        price       : 2392.00
  tax  : 251.42
  total: 4443.52
  comments: >
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.
php: |
  array(
     'invoice' => 34843, 'date' => mktime(0, 0, 0, 1, 23, 2001),
     'bill-to' =>
      array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) )
     , 'ship-to' =>
      array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) )
     , 'product' =>
       array(
        array( 'sku' => 'BL394D', 'quantity' => 4, 'description' => 'Basketball', 'price' => 450.00 ),
        array( 'sku' => 'BL4438H', 'quantity' => 1, 'description' => 'Super Hoop', 'price' => 2392.00 )
      ),
     'tax' => 251.42, 'total' => 4443.52,
     'comments' => "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\n"
  )
---
test: Log file
todo: true
spec: 2.28
yaml: |
  ---
  Time: 2001-11-23 15:01:42 -05:00
  User: ed
  Warning: >
    This is an error message
    for the log file
  ---
  Time: 2001-11-23 15:02:31 -05:00
  User: ed
  Warning: >
    A slightly different error
    message.
  ---
  Date: 2001-11-23 15:03:17 -05:00
  User: ed
  Fatal: >
    Unknown variable "bar"
  Stack:
    - file: TopClass.py
      line: 23
      code: |
        x = MoreObject("345\n")
    - file: MoreClass.py
      line: 58
      code: |-
        foo = bar
ruby: |
  y = YAML::Stream.new
  y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 01, 42, 00, "-05:00" ),
           'User' => 'ed', 'Warning' => "This is an error message for the log file\n" } )
  y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 02, 31, 00, "-05:00" ),
           'User' => 'ed', 'Warning' => "A slightly different error message.\n" } )
  y.add( { 'Date' => YAML::mktime( 2001, 11, 23, 15, 03, 17, 00, "-05:00" ),
           'User' => 'ed', 'Fatal' => "Unknown variable \"bar\"\n",
           'Stack' => [
           { 'file' => 'TopClass.py', 'line' => 23, 'code' => "x = MoreObject(\"345\\n\")\n" },
           { 'file' => 'MoreClass.py', 'line' => 58, 'code' => "foo = bar" } ] } )
documents: 3

---
test: Throwaway comments
yaml: |
   ### These are four throwaway comment  ###

   ### lines (the second line is empty). ###
   this: |   # Comments may trail lines.
      contains three lines of text.
      The third one starts with a
      # character. This isn't a comment.

   # These are three throwaway comment
   # lines (the first line is empty).
php: |
   array(
     'this' => "contains three lines of text.\nThe third one starts with a\n# character. This isn't a comment.\n"
   )
---
test: Document with a single value
todo: true
yaml: |
   --- >
   This YAML stream contains a single text value.
   The next stream is a log file - a sequence of
   log entries. Adding an entry to the log is a
   simple matter of appending it at the end.
ruby: |
   "This YAML stream contains a single text value. The next stream is a log file - a sequence of log entries. Adding an entry to the log is a simple matter of appending it at the end.\n"
---
test: Document stream
todo: true
yaml: |
   ---
   at: 2001-08-12 09:25:00.00 Z
   type: GET
   HTTP: '1.0'
   url: '/index.html'
   ---
   at: 2001-08-12 09:25:10.00 Z
   type: GET
   HTTP: '1.0'
   url: '/toc.html'
ruby: |
   y = YAML::Stream.new
   y.add( {
      'at' => Time::utc( 2001, 8, 12, 9, 25, 00 ),
      'type' => 'GET',
      'HTTP' => '1.0',
      'url' => '/index.html'
   } )
   y.add( {
      'at' => Time::utc( 2001, 8, 12, 9, 25, 10 ),
      'type' => 'GET',
      'HTTP' => '1.0',
      'url' => '/toc.html'
   } )
documents: 2

---
test: Top level mapping
yaml: |
   # This stream is an example of a top-level mapping.
   invoice : 34843
   date    : 2001-01-23
   total   : 4443.52
php: |
   array(
      'invoice' => 34843,
      'date' => mktime(0, 0, 0, 1, 23, 2001),
      'total' => 4443.52
   )
---
test: Single-line documents
todo: true
yaml: |
  # The following is a sequence of three documents.
  # The first contains an empty mapping, the second
  # an empty sequence, and the last an empty string.
  --- {}
  --- [ ]
  --- ''
ruby: |
  y = YAML::Stream.new
  y.add( {} )
  y.add( [] )
  y.add( '' )
documents: 3

---
test: Document with pause
todo: true
yaml: |
  # A communication channel based on a YAML stream.
  ---
  sent at: 2002-06-06 11:46:25.10 Z
  payload: Whatever
  # Receiver can process this as soon as the following is sent:
  ...
  # Even if the next message is sent long after:
  ---
  sent at: 2002-06-06 12:05:53.47 Z
  payload: Whatever
  ...
ruby: |
  y = YAML::Stream.new
  y.add(
    { 'sent at' => YAML::mktime( 2002, 6, 6, 11, 46, 25, 0.10 ),
      'payload' => 'Whatever' }
  )
  y.add(
    { "payload" => "Whatever", "sent at" => YAML::mktime( 2002, 6, 6, 12, 5, 53, 0.47 ) }
  )
documents: 2

---
test: Explicit typing
yaml: |
   integer: 12
   also int: ! "12"
   string: !str 12
php: |
   array( 'integer' => 12, 'also int' => 12, 'string' => '12' )
---
test: Private types
todo: true
yaml: |
  # Both examples below make use of the 'x-private:ball'
  # type family URI, but with different semantics.
  ---
  pool: !!ball
    number: 8
    color: black
  ---
  bearing: !!ball
    material: steel
ruby: |
  y = YAML::Stream.new
  y.add( { 'pool' =>
    YAML::PrivateType.new( 'ball',
      { 'number' => 8, 'color' => 'black' } ) }
  )
  y.add( { 'bearing' =>
    YAML::PrivateType.new( 'ball',
      { 'material' => 'steel' } ) }
  )
documents: 2

---
test: Type family under yaml.org
yaml: |
  # The URI is 'tag:yaml.org,2002:str'
  - !str a Unicode string
php: |
  array( 'a Unicode string' )
---
test: Type family under perl.yaml.org
todo: true
yaml: |
  # The URI is 'tag:perl.yaml.org,2002:Text::Tabs'
  - !perl/Text::Tabs {}
ruby: |
  [ YAML::DomainType.new( 'perl.yaml.org,2002', 'Text::Tabs', {} ) ]
---
test: Type family under clarkevans.com
todo: true
yaml: |
  # The URI is 'tag:clarkevans.com,2003-02:timesheet'
  - !clarkevans.com,2003-02/timesheet {}
ruby: |
  [ YAML::DomainType.new( 'clarkevans.com,2003-02', 'timesheet', {} ) ]
---
test: URI Escaping
todo: true
yaml: |
  same:
    - !domain.tld,2002/type\x30 value
    - !domain.tld,2002/type0 value
  different: # As far as the YAML parser is concerned
    - !domain.tld,2002/type%30 value
    - !domain.tld,2002/type0 value
ruby-setup: |
  YAML.add_domain_type( "domain.tld,2002", "type0" ) { |type, val|
    "ONE: #{val}"
  }
  YAML.add_domain_type( "domain.tld,2002", "type%30" ) { |type, val|
    "TWO: #{val}"
  }
ruby: |
  { 'same' => [ 'ONE: value', 'ONE: value' ], 'different' => [ 'TWO: value', 'ONE: value' ] }
---
test: URI Prefixing
todo: true
yaml: |
  # 'tag:domain.tld,2002:invoice' is some type family.
  invoice: !domain.tld,2002/^invoice
    # 'seq' is shorthand for 'tag:yaml.org,2002:seq'.
    # This does not effect '^customer' below
    # because it is does not specify a prefix.
    customers: !seq
      # '^customer' is shorthand for the full
      # notation 'tag:domain.tld,2002:customer'.
      - !^customer
        given : Chris
        family : Dumars
ruby-setup: |
  YAML.add_domain_type( "domain.tld,2002", /(invoice|customer)/ ) { |type, val|
    if val.is_a? ::Hash
      scheme, domain, type = type.split( /:/, 3 )
      val['type'] = "domain #{type}"
      val
    else
      raise YAML::Error, "Not a Hash in domain.tld/invoice: " + val.inspect
    end
  }
ruby: |
  { "invoice"=> { "customers"=> [ { "given"=>"Chris", "type"=>"domain customer", "family"=>"Dumars" } ], "type"=>"domain invoice" } }

---
test: Overriding anchors
yaml: |
  anchor : &A001 This scalar has an anchor.
  override : &A001 >
   The alias node below is a
   repeated use of this value.
  alias : *A001
php: |
  array( 'anchor' => 'This scalar has an anchor.',
    'override' => "The alias node below is a repeated use of this value.\n",
    'alias' => "The alias node below is a repeated use of this value.\n" )
---
test: Flow and block formatting
todo: true
yaml: |
  empty: []
  flow: [ one, two, three # May span lines,
           , four,           # indentation is
             five ]          # mostly ignored.
  block:
   - First item in top sequence
   -
    - Subordinate sequence entry
   - >
     A folded sequence entry
   - Sixth item in top sequence
ruby: |
  { 'empty' => [], 'flow' => [ 'one', 'two', 'three', 'four', 'five' ],
    'block' => [ 'First item in top sequence', [ 'Subordinate sequence entry' ],
    "A folded sequence entry\n", 'Sixth item in top sequence' ] }
---
test: Complete mapping test
todo: true
yaml: |
 empty: {}
 flow: { one: 1, two: 2 }
 spanning: { one: 1,
    two: 2 }
 block:
  first : First entry
  second:
   key: Subordinate mapping
  third:
   - Subordinate sequence
   - { }
   - Previous mapping is empty.
   - A key: value pair in a sequence.
     A second: key:value pair.
   - The previous entry is equal to the following one.
   -
     A key: value pair in a sequence.
     A second: key:value pair.
  !float 12 : This key is a float.
  ? >
   ?
  : This key had to be protected.
  "\a" : This key had to be escaped.
  ? >
   This is a
   multi-line
   folded key
  : Whose value is
    also multi-line.
  ? this also works as a key
  : with a value at the next line.
  ?
   - This key
   - is a sequence
  :
   - With a sequence value.
  ?
   This: key
   is a: mapping
  :
   with a: mapping value.
ruby: |
  { 'empty' => {}, 'flow' => { 'one' => 1, 'two' => 2 },
    'spanning' => { 'one' => 1, 'two' => 2 },
    'block' => { 'first' => 'First entry', 'second' =>
    { 'key' => 'Subordinate mapping' }, 'third' =>
      [ 'Subordinate sequence', {}, 'Previous mapping is empty.',
        { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' },
        'The previous entry is equal to the following one.',
        { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' } ],
    12.0 => 'This key is a float.', "?\n" => 'This key had to be protected.',
    "\a" => 'This key had to be escaped.',
    "This is a multi-line folded key\n" => "Whose value is also multi-line.",
    'this also works as a key' => 'with a value at the next line.',
    [ 'This key', 'is a sequence' ] => [ 'With a sequence value.' ] } }
  # Couldn't recreate map exactly, so we'll do a detailed check to be sure it's entact
  obj_y['block'].keys.each { |k|
    if Hash === k
      v = obj_y['block'][k]
      if k['This'] == 'key' and k['is a'] == 'mapping' and v['with a'] == 'mapping value.'
         obj_r['block'][k] = v
      end
    end
  }
---
test: Literal explicit indentation
yaml: |
   # Explicit indentation must
   # be given in all the three
   # following cases.
   leading spaces: |2
         This value starts with four spaces.

   leading line break: |2

     This value starts with a line break.

   leading comment indicator: |2
     # first line starts with a
     # character.

   # Explicit indentation may
   # also be given when it is
   # not required.
   redundant: |2
     This value is indented 2 spaces.
php: |
   array(
      'leading spaces' => "    This value starts with four spaces.\n",
      'leading line break' => "\nThis value starts with a line break.\n",
      'leading comment indicator' => "# first line starts with a\n# character.\n",
      'redundant' => "This value is indented 2 spaces.\n"
   )
---
test: Chomping and keep modifiers
yaml: |
    clipped: |
        This has one newline.

    same as "clipped" above: "This has one newline.\n"

    stripped: |-
        This has no newline.

    same as "stripped" above: "This has no newline."

    kept: |+
        This has two newlines.

    same as "kept" above: "This has two newlines.\n\n"
php: |
    array(
      'clipped' => "This has one newline.\n",
      'same as "clipped" above' => "This has one newline.\n",
      'stripped' => 'This has no newline.',
      'same as "stripped" above' => 'This has no newline.',
      'kept' => "This has two newlines.\n\n",
      'same as "kept" above' => "This has two newlines.\n\n"
    )
---
test: Literal combinations
todo: true
yaml: |
   empty: |

   literal: |
    The \ ' " characters may be
    freely used. Leading white
       space is significant.

    Line breaks are significant.
    Thus this value contains one
    empty line and ends with a
    single line break, but does
    not start with one.

   is equal to: "The \\ ' \" characters may \
    be\nfreely used. Leading white\n   space \
    is significant.\n\nLine breaks are \
    significant.\nThus this value contains \
    one\nempty line and ends with a\nsingle \
    line break, but does\nnot start with one.\n"

   # Comments may follow a block
   # scalar value. They must be
   # less indented.

   # Modifiers may be combined in any order.
   indented and chomped: |2-
       This has no newline.

   also written as: |-2
       This has no newline.

   both are equal to: "  This has no newline."
php: |
   array(
     'empty' => '',
     'literal' => "The \\ ' \" characters may be\nfreely used. Leading white\n   space " +
       "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" +
       "empty line and ends with a\nsingle line break, but does\nnot start with one.\n",
     'is equal to' => "The \\ ' \" characters may be\nfreely used. Leading white\n   space " +
       "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" +
       "empty line and ends with a\nsingle line break, but does\nnot start with one.\n",
     'indented and chomped' => '  This has no newline.',
     'also written as' => '  This has no newline.',
     'both are equal to' => '  This has no newline.'
   )
---
test: Folded combinations
todo: true
yaml: |
   empty: >

   one paragraph: >
    Line feeds are converted
    to spaces, so this value
    contains no line breaks
    except for the final one.

   multiple paragraphs: >2

     An empty line, either
     at the start or in
     the value:

     Is interpreted as a
     line break. Thus this
     value contains three
     line breaks.

   indented text: >
       This is a folded
       paragraph followed
       by a list:
        * first entry
        * second entry
       Followed by another
       folded paragraph,
       another list:

        * first entry

        * second entry

       And a final folded
       paragraph.

   above is equal to: |
       This is a folded paragraph followed by a list:
        * first entry
        * second entry
       Followed by another folded paragraph, another list:

        * first entry

        * second entry

       And a final folded paragraph.

   # Explicit comments may follow
   # but must be less indented.
php: |
   array(
     'empty' => '',
     'one paragraph' => 'Line feeds are converted to spaces, so this value'.
       " contains no line breaks except for the final one.\n",
     'multiple paragraphs' => "\nAn empty line, either at the start or in the value:\n".
       "Is interpreted as a line break. Thus this value contains three line breaks.\n",
     'indented text' => "This is a folded paragraph followed by a list:\n".
       " * first entry\n * second entry\nFollowed by another folded paragraph, ".
       "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n",
     'above is equal to' => "This is a folded paragraph followed by a list:\n".
       " * first entry\n * second entry\nFollowed by another folded paragraph, ".
       "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n"
   )
---
test: Single quotes
todo: true
yaml: |
   empty: ''
   second: '! : \ etc. can be used freely.'
   third: 'a single quote '' must be escaped.'
   span: 'this contains
         six spaces

         and one
         line break'
   is same as: "this contains six spaces\nand one line break"
php: |
   array(
     'empty' => '',
     'second' => '! : \\ etc. can be used freely.',
     'third' => "a single quote ' must be escaped.",
     'span' => "this contains six spaces\nand one line break",
     'is same as' => "this contains six spaces\nand one line break"
   )
---
test: Double quotes
todo: true
yaml: |
   empty: ""
   second: "! : etc. can be used freely."
   third: "a \" or a \\ must be escaped."
   fourth: "this value ends with an LF.\n"
   span: "this contains
     four  \
         spaces"
   is equal to: "this contains four  spaces"
php: |
   array(
     'empty' => '',
     'second' => '! : etc. can be used freely.',
     'third' => 'a " or a \\ must be escaped.',
     'fourth' => "this value ends with an LF.\n",
     'span' => "this contains four  spaces",
     'is equal to' => "this contains four  spaces"
   )
---
test: Unquoted strings
todo: true
yaml: |
   first: There is no unquoted empty string.

   second: 12          ## This is an integer.

   third: !str 12      ## This is a string.

   span: this contains
         six spaces

         and one
         line break

   indicators: this has no comments.
               #:foo and bar# are
               both text.

   flow: [ can span
              lines, # comment
              like
              this ]

   note: { one-line keys: but multi-line values }

php: |
   array(
     'first' => 'There is no unquoted empty string.',
     'second' => 12,
     'third' => '12',
     'span' => "this contains six spaces\nand one line break",
     'indicators' => "this has no comments. #:foo and bar# are both text.",
     'flow' => [ 'can span lines', 'like this' ],
     'note' => { 'one-line keys' => 'but multi-line values' }
   )
---
test: Spanning sequences
todo: true
yaml: |
   # The following are equal seqs
   # with different identities.
   flow: [ one, two ]
   spanning: [ one,
        two ]
   block:
     - one
     - two
php: |
   array(
     'flow' => [ 'one', 'two' ],
     'spanning' => [ 'one', 'two' ],
     'block' => [ 'one', 'two' ]
   )
---
test: Flow mappings
yaml: |
   # The following are equal maps
   # with different identities.
   flow: { one: 1, two: 2 }
   block:
       one: 1
       two: 2
php: |
   array(
     'flow' => array( 'one' => 1, 'two' => 2 ),
     'block' => array( 'one' => 1, 'two' => 2 )
   )
---
test: Representations of 12
todo: true
yaml: |
   - 12 # An integer
   # The following scalars
   # are loaded to the
   # string value '1' '2'.
   - !str 12
   - '12'
   - "12"
   - "\
     1\
     2\
     "
   # Strings containing paths and regexps can be unquoted:
   - /foo/bar
   - d:/foo/bar
   - foo/bar
   - /a.*b/
php: |
   array( 12, '12', '12', '12', '12', '/foo/bar', 'd:/foo/bar', 'foo/bar', '/a.*b/' )
---
test: "Null"
todo: true
yaml: |
   canonical: ~

   english: null

   # This sequence has five
   # entries, two with values.
   sparse:
     - ~
     - 2nd entry
     - Null
     - 4th entry
     -

   four: This mapping has five keys,
         only two with values.

php: |
   array (
     'canonical' => null,
     'english' => null,
     'sparse' => array( null, '2nd entry', null, '4th entry', null ]),
     'four' => 'This mapping has five keys, only two with values.'
   )
---
test: Omap
todo: true
yaml: |
   # Explicitly typed dictionary.
   Bestiary: !omap
     - aardvark: African pig-like ant eater. Ugly.
     - anteater: South-American ant eater. Two species.
     - anaconda: South-American constrictor snake. Scary.
     # Etc.
ruby: |
   {
     'Bestiary' => YAML::Omap[
       'aardvark', 'African pig-like ant eater. Ugly.',
       'anteater', 'South-American ant eater. Two species.',
       'anaconda', 'South-American constrictor snake. Scary.'
     ]
   }

---
test: Pairs
todo: true
yaml: |
  # Explicitly typed pairs.
  tasks: !pairs
    - meeting: with team.
    - meeting: with boss.
    - break: lunch.
    - meeting: with client.
ruby: |
  {
    'tasks' => YAML::Pairs[
      'meeting', 'with team.',
      'meeting', 'with boss.',
      'break', 'lunch.',
      'meeting', 'with client.'
    ]
  }

---
test: Set
todo: true
yaml: |
  # Explicitly typed set.
  baseball players: !set
    Mark McGwire:
    Sammy Sosa:
    Ken Griffey:
ruby: |
  {
    'baseball players' => YAML::Set[
      'Mark McGwire', nil,
      'Sammy Sosa', nil,
      'Ken Griffey', nil
    ]
  }

---
test: Boolean
yaml: |
   false: used as key
   logical:  true
   answer: false
php: |
   array(
     false => 'used as key',
     'logical' => true,
     'answer' => false
   )
---
test: Integer
yaml: |
   canonical: 12345
   decimal: +12,345
   octal: 014
   hexadecimal: 0xC
php: |
   array(
     'canonical' => 12345,
     'decimal' => 12345,
     'octal' => 12,
     'hexadecimal' => 12
   )
---
test: Float
yaml: |
   canonical: 1.23015e+3
   exponential: 12.3015e+02
   fixed: 1,230.15
   negative infinity: -.inf
   not a number: .NaN
php: |
  array(
    'canonical' => 1230.15,
    'exponential' => 1230.15,
    'fixed' => 1230.15,
    'negative infinity' => log(0),
    'not a number' => -log(0)
  )
---
test: Timestamp
todo: true
yaml: |
   canonical:       2001-12-15T02:59:43.1Z
   valid iso8601:   2001-12-14t21:59:43.10-05:00
   space separated: 2001-12-14 21:59:43.10 -05:00
   date (noon UTC): 2002-12-14
ruby: |
   array(
     'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ),
     'valid iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
     'space separated' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
     'date (noon UTC)' => Date.new( 2002, 12, 14 )
   )
---
test: Binary
todo: true
yaml: |
   canonical: !binary "\
    R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\
    OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\
    +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\
    AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs="
   base64: !binary |
    R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
    OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
    +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
    AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
   description: >
    The binary value above is a tiny arrow
    encoded as a gif image.
ruby-setup: |
   arrow_gif = "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236iiiccc\243\243\243\204\204\204\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371!\376\016Made with GIMP\000,\000\000\000\000\f\000\f\000\000\005,  \216\2010\236\343@\024\350i\020\304\321\212\010\034\317\200M$z\357\3770\205p\270\2601f\r\e\316\001\303\001\036\020' \202\n\001\000;"
ruby: |
   {
     'canonical' => arrow_gif,
     'base64' => arrow_gif,
     'description' => "The binary value above is a tiny arrow encoded as a gif image.\n"
   }

---
test: Merge key
todo: true
yaml: |
  ---
  - &CENTER { x: 1, y: 2 }
  - &LEFT { x: 0, y: 2 }
  - &BIG { r: 10 }
  - &SMALL { r: 1 }

  # All the following maps are equal:

  - # Explicit keys
    x: 1
    y: 2
    r: 10
    label: center/big

  - # Merge one map
    << : *CENTER
    r: 10
    label: center/big

  - # Merge multiple maps
    << : [ *CENTER, *BIG ]
    label: center/big

  - # Override
    << : [ *BIG, *LEFT, *SMALL ]
    x: 1
    label: center/big

ruby-setup: |
  center = { 'x' => 1, 'y' => 2 }
  left = { 'x' => 0, 'y' => 2 }
  big = { 'r' => 10 }
  small = { 'r' => 1 }
  node1 = { 'x' => 1, 'y' => 2, 'r' => 10, 'label' => 'center/big' }
  node2 = center.dup
  node2.update( { 'r' => 10, 'label' => 'center/big' } )
  node3 = big.dup
  node3.update( center )
  node3.update( { 'label' => 'center/big' } )
  node4 = small.dup
  node4.update( left )
  node4.update( big )
  node4.update( { 'x' => 1, 'label' => 'center/big' } )

ruby: |
  [
    center, left, big, small, node1, node2, node3, node4
  ]

---
test: Default key
todo: true
yaml: |
   ---     # Old schema
   link with:
     - library1.dll
     - library2.dll
   ---     # New schema
   link with:
     - = : library1.dll
       version: 1.2
     - = : library2.dll
       version: 2.3
ruby: |
   y = YAML::Stream.new
   y.add( { 'link with' => [ 'library1.dll', 'library2.dll' ] } )
   obj_h = Hash[ 'version' => 1.2 ]
   obj_h.default = 'library1.dll'
   obj_h2 = Hash[ 'version' => 2.3 ]
   obj_h2.default = 'library2.dll'
   y.add( { 'link with' => [ obj_h, obj_h2 ] } )
documents: 2

---
test: Special keys
todo: true
yaml: |
   "!": These three keys
   "&": had to be quoted
   "=": and are normal strings.
   # NOTE: the following node should NOT be serialized this way.
   encoded node :
    !special '!' : '!type'
    !special|canonical '&' : 12
    = : value
   # The proper way to serialize the above node is as follows:
   node : !!type &12 value
ruby: |
   { '!' => 'These three keys', '&' => 'had to be quoted',
     '=' => 'and are normal strings.',
     'encoded node' => YAML::PrivateType.new( 'type', 'value' ),
     'node' => YAML::PrivateType.new( 'type', 'value' ) }
PK�b�\֋�O��Fpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsBasicTests.ymlnu�[���--- %YAML:1.0
test: Simple Sequence
brief: |
    You can specify a list in YAML by placing each
    member of the list on a new line with an opening
    dash. These lists are called sequences.
yaml: |
    - apple
    - banana
    - carrot
php: |
    array('apple', 'banana', 'carrot')
---
test: Nested Sequences
brief: |
    You can include a sequence within another
    sequence by giving the sequence an empty
    dash, followed by an indented list.
yaml: |
    -
     - foo
     - bar
     - baz
php: |
    array(array('foo', 'bar', 'baz'))
---
test: Mixed Sequences
brief: |
    Sequences can contain any YAML data,
    including strings and other sequences.
yaml: |
    - apple
    -
     - foo
     - bar
     - x123
    - banana
    - carrot
php: |
    array('apple', array('foo', 'bar', 'x123'), 'banana', 'carrot')
---
test: Deeply Nested Sequences
brief: |
    Sequences can be nested even deeper, with each
    level of indentation representing a level of
    depth.
yaml: |
    -
     -
      - uno
      - dos
php: |
    array(array(array('uno', 'dos')))
---
test: Simple Mapping
brief: |
    You can add a keyed list (also known as a dictionary or
    hash) to your document by placing each member of the
    list on a new line, with a colon separating the key
    from its value.  In YAML, this type of list is called
    a mapping.
yaml: |
    foo: whatever
    bar: stuff
php: |
    array('foo' => 'whatever', 'bar' => 'stuff')
---
test: Sequence in a Mapping
brief: |
    A value in a mapping can be a sequence.
yaml: |
    foo: whatever
    bar:
     - uno
     - dos
php: |
    array('foo' => 'whatever', 'bar' => array('uno', 'dos'))
---
test: Nested Mappings
brief: |
    A value in a mapping can be another mapping.
yaml: |
    foo: whatever
    bar:
     fruit: apple
     name: steve
     sport: baseball
php: |
    array(
      'foo' => 'whatever',
      'bar' => array(
         'fruit' => 'apple',
         'name' => 'steve',
         'sport' => 'baseball'
       )
    )
---
test: Mixed Mapping
brief: |
    A mapping can contain any assortment
    of mappings and sequences as values.
yaml: |
    foo: whatever
    bar:
     -
       fruit: apple
       name: steve
       sport: baseball
     - more
     -
       python: rocks
       perl: papers
       ruby: scissorses
php: |
    array(
      'foo' => 'whatever',
      'bar' => array(
        array(
            'fruit' => 'apple',
            'name' => 'steve',
            'sport' => 'baseball'
        ),
        'more',
        array(
            'python' => 'rocks',
            'perl' => 'papers',
            'ruby' => 'scissorses'
        )
      )
    )
---
test: Mapping-in-Sequence Shortcut
todo: true
brief: |
     If you are adding a mapping to a sequence, you
     can place the mapping on the same line as the
     dash as a shortcut.
yaml: |
     - work on YAML.py:
        - work on Store
php: |
    array(array('work on YAML.py' => array('work on Store')))
---
test: Sequence-in-Mapping Shortcut
todo: true
brief: |
     The dash in a sequence counts as indentation, so
     you can add a sequence inside of a mapping without
     needing spaces as indentation.
yaml: |
     allow:
     - 'localhost'
     - '%.sourceforge.net'
     - '%.freepan.org'
php: |
     array('allow' => array('localhost', '%.sourceforge.net', '%.freepan.org'))
---
todo: true
test: Merge key
brief: |
     A merge key ('<<') can be used in a mapping to insert other mappings.  If
     the value associated with the merge key is a mapping, each of its key/value
     pairs is inserted into the current mapping.
yaml: |
     mapping:
       name: Joe
       job: Accountant
       <<:
         age: 38
php: |
     array(
       'mapping' =>
       array(
         'name' => 'Joe',
         'job' => 'Accountant',
         'age' => 38
       )
     )
PK�b�\U���@pear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfTests.ymlnu�[���--- %YAML:1.0
test: Multiple quoted string on one line
brief: >
    Multiple quoted string on one line
yaml: |
    stripped_title: { name: "foo bar", help: "bar foo" }
php: |
    array('stripped_title' => array('name' => 'foo bar', 'help' => 'bar foo'))
---
test: Empty sequence
yaml: |
    foo: [ ]
php: |
    array('foo' => array())
---
test: Empty value
yaml: |
    foo:
php: |
    array('foo' => null)
---
test: Inline string parsing
brief: >
    Inline string parsing
yaml: |
    test: ['complex: string', 'another [string]']
php: |
    array('test' => array('complex: string', 'another [string]'))
---
test: Boolean
brief: >
    Boolean
yaml: |
    - false
    - true
    - null
    - ~
    - 'false'
    - 'true'
    - 'null'
    - '~'
php: |
    array(
      false,
      true,
      null,
      null,
      'false',
      'true',
      'null',
      '~',
    )
---
test: Empty lines in folded blocks
brief: >
  Empty lines in folded blocks
yaml: |
  foo:
    bar: |
      foo


        
      bar
php: |
  array('foo' => array('bar' => "foo\n\n\n  \nbar\n"))
---
test: IP addresses
brief: >
  IP addresses
yaml: |
  foo: 10.0.0.2
php: |
  array('foo' => '10.0.0.2')
---
test: A sequence with an embedded mapping
brief: >
  A sequence with an embedded mapping
yaml: |
  - foo
  - bar: { bar: foo }
php: |
  array('foo', array('bar' => array('bar' => 'foo')))
---
test: A sequence with an unordered array
brief: >
  A sequence with an unordered array
yaml: |
  1: foo
  0: bar
php: |
  array(1 => 'foo', 0 => 'bar')
---
test: Octal
brief: as in spec example 2.19, octal value is converted
yaml: |
  foo: 0123
php: |
  array('foo' => 83)
---
test: Octal strings
brief: Octal notation in a string must remain a string
yaml: |
  foo: "0123"
php: |
  array('foo' => '0123')
---
test: Octal strings
brief: Octal notation in a string must remain a string
yaml: |
  foo: '0123'
php: |
  array('foo' => '0123')
---
test: Octal strings
brief: Octal notation in a string must remain a string
yaml: |
  foo: |
    0123
php: |
  array('foo' => "0123\n")
---
test: Document as a simple hash
brief: Document as a simple hash
yaml: |
  { foo: bar }
php: |
  array('foo' => 'bar')
---
test: Document as a simple array
brief: Document as a simple array
yaml: |
  [ foo, bar ]
php: |
  array('foo', 'bar')
PK�b�\t��rqqFpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsErrorTests.ymlnu�[���---
test: Missing value for hash item
todo: true
brief: |
    Third item in this hash doesn't have a value
yaml: |
    okay: value
    also okay: ~
    causes error because no value specified
    last key: value okay here too
python-error: causes error because no value specified

---
test: Not indenting enough
brief: |
    There was a bug in PyYaml where it was off by one
    in the indentation check.  It was allowing the YAML
    below.
# This is actually valid YAML now. Someone should tell showell.
yaml: |
    foo:
    firstline: 1
    secondline: 2
php: |
  array('foo' => null, 'firstline' => 1, 'secondline' => 2)
PK�b�\����Apear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfQuotes.ymlnu�[���--- %YAML:1.0
test: Some characters at the beginning of a string must be escaped
brief: >
    Some characters at the beginning of a string must be escaped
yaml: |
    foo: | bar
php: |
    array('foo' => '| bar')
---
test: A key can be a quoted string
brief: >
  A key can be a quoted string
yaml: |
    "foo1": bar
    'foo2': bar
    "foo \" bar": bar
    'foo '' bar': bar
    'foo3: ': bar
    "foo4: ": bar
    foo5: { "foo \" bar: ": bar, 'foo '' bar: ': bar }
php: |
    array(
      'foo1' => 'bar',
      'foo2' => 'bar',
      'foo " bar' => 'bar',
      'foo \' bar' => 'bar',
      'foo3: ' => 'bar',
      'foo4: ' => 'bar',
      'foo5' => array(
        'foo " bar: ' => 'bar',
        'foo \' bar: ' => 'bar',
      ),
    )
PK�b�\�$R��Ipear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsTypeTransfers.ymlnu�[���--- %YAML:1.0
test: Strings
brief: >
    Any group of characters beginning with an
    alphabetic or numeric character is a string,
    unless it belongs to one of the groups below
    (such as an Integer or Time).
yaml: |
    String
php: |
    'String'
---
test: String characters
brief: >
    A string can contain any alphabetic or
    numeric character, along with many
    punctuation characters, including the
    period, dash, space, quotes, exclamation, and
    question mark.
yaml: |
    - What's Yaml?
    - It's for writing data structures in plain text.
    - And?
    - And what? That's not good enough for you?
    - No, I mean, "And what about Yaml?"
    - Oh, oh yeah. Uh.. Yaml for Ruby.
php: |
    array(
      "What's Yaml?",
      "It's for writing data structures in plain text.",
      "And?",
      "And what? That's not good enough for you?",
      "No, I mean, \"And what about Yaml?\"",
      "Oh, oh yeah. Uh.. Yaml for Ruby."
    )
---
test: Indicators in Strings
brief: >
    Be careful using indicators in strings.  In particular,
    the comma, colon, and pound sign must be used carefully.
yaml: |
    the colon followed by space is an indicator: but is a string:right here
    same for the pound sign: here we have it#in a string
    the comma can, honestly, be used in most cases: [ but not in, inline collections ]
php: |
    array(
      'the colon followed by space is an indicator' => 'but is a string:right here',
      'same for the pound sign' => 'here we have it#in a string',
      'the comma can, honestly, be used in most cases' => array('but not in', 'inline collections')
    )
---
test: Forcing Strings
brief: >
    Any YAML type can be forced into a string using the
    explicit !str method.
yaml: |
    date string: !str 2001-08-01
    number string: !str 192
php: |
    array(
      'date string' => '2001-08-01',
      'number string' => '192'
    )
---
test: Single-quoted Strings
brief: >
    You can also enclose your strings within single quotes,
    which allows use of slashes, colons, and other indicators
    freely.  Inside single quotes, you can represent a single
    quote in your string by using two single quotes next to
    each other.
yaml: |
    all my favorite symbols: '#:!/%.)'
    a few i hate: '&(*'
    why do i hate them?: 'it''s very hard to explain'
    entities: '&pound; me'
php: |
    array(
      'all my favorite symbols' => '#:!/%.)',
      'a few i hate' => '&(*',
      'why do i hate them?' => 'it\'s very hard to explain',
      'entities' => '&pound; me'
    )
---
test: Double-quoted Strings
brief: >
    Enclosing strings in double quotes allows you
    to use escapings to represent ASCII and
    Unicode characters.
yaml: |
    i know where i want my line breaks: "one here\nand another here\n"
php: |
    array(
      'i know where i want my line breaks' => "one here\nand another here\n"
    )
---
test: Multi-line Quoted Strings
todo: true
brief: >
    Both single- and double-quoted strings may be
    carried on to new lines in your YAML document.
    They must be indented a step and indentation
    is interpreted as a single space.
yaml: |
    i want a long string: "so i'm going to
      let it go on and on to other lines
      until i end it with a quote."
php: |
    array('i want a long string' => "so i'm going to ".
         "let it go on and on to other lines ".
         "until i end it with a quote."
    )

---
test: Plain scalars
todo: true
brief: >
    Unquoted strings may also span multiple lines, if they
    are free of YAML space indicators and indented.
yaml: |
    - My little toe is broken in two places;
    - I'm crazy to have skied this way;
    - I'm not the craziest he's seen, since there was always the German guy
      who skied for 3 hours on a broken shin bone (just below the kneecap);
    - Nevertheless, second place is respectable, and he doesn't
      recommend going for the record;
    - He's going to put my foot in plaster for a month;
    - This would impair my skiing ability somewhat for the
      duration, as can be imagined.
php: |
    array(
      "My little toe is broken in two places;",
      "I'm crazy to have skied this way;",
      "I'm not the craziest he's seen, since there was always ".
         "the German guy who skied for 3 hours on a broken shin ".
         "bone (just below the kneecap);",
      "Nevertheless, second place is respectable, and he doesn't ".
         "recommend going for the record;",
      "He's going to put my foot in plaster for a month;",
      "This would impair my skiing ability somewhat for the duration, ".
         "as can be imagined."
    )
---
test: 'Null'
brief: >
    You can use the tilde '~' character for a null value.
yaml: |
    name: Mr. Show
    hosted by: Bob and David
    date of next season: ~
php: |
    array(
      'name' => 'Mr. Show',
      'hosted by' => 'Bob and David',
      'date of next season' => null
    )
---
test: Boolean
brief: >
    You can use 'true' and 'false' for Boolean values.
yaml: |
    Is Gus a Liar?: true
    Do I rely on Gus for Sustenance?: false
php: |
    array(
      'Is Gus a Liar?' => true,
      'Do I rely on Gus for Sustenance?' => false
    )
---
test: Integers
dump_skip: true
brief: >
    An integer is a series of numbers, optionally
    starting with a positive or negative sign.  Integers
    may also contain commas for readability.
yaml: |
    zero: 0
    simple: 12
    one-thousand: 1,000
    negative one-thousand: -1,000
php: |
    array(
      'zero' => 0,
      'simple' => 12,
      'one-thousand' => 1000,
      'negative one-thousand' => -1000
    )
---
test: Integers as Map Keys
brief: >
    An integer can be used a dictionary key.
yaml: |
    1: one
    2: two
    3: three
php: |
    array(
        1 => 'one',
        2 => 'two',
        3 => 'three'
    )
---
test: Floats
dump_skip: true
brief: >
     Floats are represented by numbers with decimals,
     allowing for scientific notation, as well as
     positive and negative infinity and "not a number."
yaml: |
     a simple float: 2.00
     larger float: 1,000.09
     scientific notation: 1.00009e+3
php: |
     array(
       'a simple float' => 2.0,
       'larger float' => 1000.09,
       'scientific notation' => 1000.09
     )
---
test: Time
todo: true
brief: >
    You can represent timestamps by using
    ISO8601 format, or a variation which
    allows spaces between the date, time and
    time zone.
yaml: |
    iso8601: 2001-12-14t21:59:43.10-05:00
    space separated: 2001-12-14 21:59:43.10 -05:00
php: |
    array(
      'iso8601' => mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
      'space separated' => mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" )
    )
---
test: Date
todo: true
brief: >
    A date can be represented by its year,
    month and day in ISO8601 order.
yaml: |
    1976-07-31
php: |
    date( 1976, 7, 31 )
PK�b�\ګغzzIpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsFoldedScalars.ymlnu�[���--- %YAML:1.0
test: Single ending newline
brief: >
    A pipe character, followed by an indented
    block of text is treated as a literal
    block, in which newlines are preserved
    throughout the block, including the final
    newline.
yaml: |
    ---
    this: |
        Foo
        Bar
php: |
    array('this' => "Foo\nBar\n")
---
test: The '+' indicator
brief: >
    The '+' indicator says to keep newlines at the end of text
    blocks.
yaml: |
    normal: |
      extra new lines not kept

    preserving: |+
      extra new lines are kept


    dummy: value
php: |
    array(
        'normal' => "extra new lines not kept\n",
        'preserving' => "extra new lines are kept\n\n\n",
        'dummy' => 'value'
    )
---
test: Three trailing newlines in literals
brief: >
    To give you more control over how space
    is preserved in text blocks, YAML has
    the keep '+' and chomp '-' indicators.
    The keep indicator will preserve all
    ending newlines, while the chomp indicator
    will strip all ending newlines.
yaml: |
    clipped: |
        This has one newline.



    same as "clipped" above: "This has one newline.\n"

    stripped: |-
        This has no newline.



    same as "stripped" above: "This has no newline."

    kept: |+
        This has four newlines.



    same as "kept" above: "This has four newlines.\n\n\n\n"
php: |
    array(
      'clipped' => "This has one newline.\n",
      'same as "clipped" above' => "This has one newline.\n",
      'stripped' => 'This has no newline.',
      'same as "stripped" above' => 'This has no newline.',
      'kept' => "This has four newlines.\n\n\n\n",
      'same as "kept" above' => "This has four newlines.\n\n\n\n"
    )
---
test: Extra trailing newlines with spaces
todo: true
brief: >
    Normally, only a single newline is kept
    from the end of a literal block, unless the
    keep '+' character is used in combination
    with the pipe.  The following example
    will preserve all ending whitespace
    since the last line of both literal blocks
    contains spaces which extend past the indentation
    level.
yaml: |
    ---
    this: |
        Foo


    kept: |+
        Foo


php: |
    array('this' => "Foo\n\n  \n",
      'kept' => "Foo\n\n  \n" )

---
test: Folded Block in a Sequence
brief: >
    A greater-then character, followed by an indented
    block of text is treated as a folded block, in
    which lines of text separated by a single newline
    are concatenated as a single line.
yaml: |
    ---
    - apple
    - banana
    - >
        can't you see
        the beauty of yaml?
        hmm
    - dog
php: |
    array(
        'apple',
        'banana',
        "can't you see the beauty of yaml? hmm\n",
        'dog'
    )
---
test: Folded Block as a Mapping Value
brief: >
    Both literal and folded blocks can be
    used in collections, as values in a
    sequence or a mapping.
yaml: |
    ---
    quote: >
        Mark McGwire's
        year was crippled
        by a knee injury.
    source: espn
php: |
    array(
        'quote' => "Mark McGwire's year was crippled by a knee injury.\n",
        'source' => 'espn'
    )
---
test: Three trailing newlines in folded blocks
brief: >
    The keep and chomp indicators can also
    be applied to folded blocks.
yaml: |
    clipped: >
        This has one newline.



    same as "clipped" above: "This has one newline.\n"

    stripped: >-
        This has no newline.



    same as "stripped" above: "This has no newline."

    kept: >+
        This has four newlines.



    same as "kept" above: "This has four newlines.\n\n\n\n"
php: |
    array(
      'clipped' => "This has one newline.\n",
      'same as "clipped" above' => "This has one newline.\n",
      'stripped' => 'This has no newline.',
      'same as "stripped" above' => 'This has no newline.',
      'kept' => "This has four newlines.\n\n\n\n",
      'same as "kept" above' => "This has four newlines.\n\n\n\n"
    )
PK�b�\;:�QJJCpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfMergeKey.ymlnu�[���--- %YAML:1.0
test: Simple In Place Substitution
brief: >
    If you want to reuse an entire alias, only overwriting what is different
    you can use a << in place substitution. This is not part of the official
    YAML spec, but a widely implemented extension. See the following URL for
    details: http://yaml.org/type/merge.html
yaml: |
    foo: &foo
        a: Steve
        b: Clark
        c: Brian
    bar: &bar
        <<: *foo
        x: Oren
    foo2: &foo2
        a: Ballmer
    ding: &dong [ fi, fei, fo, fam]
    check:
        <<:
            - *foo
            - *dong
        isit: tested
    head:
        <<: [ *foo , *dong , *foo2 ]
php: |
    array('foo' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian'), 'bar' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'x' => 'Oren'), 'foo2' => array('a' => 'Ballmer'), 'ding' => array('fi', 'fei', 'fo', 'fam'), 'check' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'fi', 'fei', 'fo', 'fam', 'isit' => 'tested'), 'head' => array('a' => 'Ballmer', 'b' => 'Clark', 'c' => 'Brian', 'fi', 'fei', 'fo', 'fam'))
PK�b�\Z{k�XXKpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsFlowCollections.ymlnu�[���---
test: Simple Inline Array
brief: >
    Sequences can be contained on a
    single line, using the inline syntax.
    Separate each entry with commas and
    enclose in square brackets.
yaml: |
    seq: [ a, b, c ]
php: |
    array('seq' => array('a', 'b', 'c'))
---
test: Simple Inline Hash
brief: >
    Mapping can also be contained on
    a single line, using the inline
    syntax.  Each key-value pair is
    separated by a colon, with a comma
    between each entry in the mapping.
    Enclose with curly braces.
yaml: |
    hash: { name: Steve, foo: bar }
php: |
    array('hash' => array('name' => 'Steve', 'foo' => 'bar'))
---
test: Multi-line Inline Collections
todo: true
brief: >
    Both inline sequences and inline mappings
    can span multiple lines, provided that you
    indent the additional lines.
yaml: |
    languages: [ Ruby,
                 Perl,
                 Python ]
    websites: { YAML: yaml.org,
                Ruby: ruby-lang.org,
                Python: python.org,
                Perl: use.perl.org }
php: |
    array(
      'languages' => array('Ruby', 'Perl', 'Python'),
      'websites' => array(
        'YAML' => 'yaml.org',
        'Ruby' => 'ruby-lang.org',
        'Python' => 'python.org',
        'Perl' => 'use.perl.org'
      )
    )
---
test: Commas in Values (not in the spec!)
todo: true
brief: >
    List items in collections are delimited by commas, but
    there must be a space after each comma.  This allows you
    to add numbers without quoting.
yaml: |
    attendances: [ 45,123, 70,000, 17,222 ]
php: |
    array('attendances' => array(45123, 70000, 17222))
PK�b�\%MC��Mpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/YtsDocumentSeparator.ymlnu�[���--- %YAML:1.0
test: Trailing Document Separator
todo: true
brief: >
    You can separate YAML documents
    with a string of three dashes.
yaml: |
    - foo: 1
      bar: 2
    ---
    more: stuff
python: |
    [
        [ { 'foo': 1, 'bar': 2 } ],
        { 'more': 'stuff' }
    ]
ruby: |
    [ { 'foo' => 1, 'bar' => 2 } ]

---
test: Leading Document Separator
todo: true
brief: >
    You can explicity give an opening
    document separator to your YAML stream.
yaml: |
    ---
    - foo: 1
      bar: 2
    ---
    more: stuff
python: |
    [
        [ {'foo': 1, 'bar': 2}],
        {'more': 'stuff'}
    ]
ruby: |
    [ { 'foo' => 1, 'bar' => 2 } ]

---
test: YAML Header
todo: true
brief: >
    The opening separator can contain directives
    to the YAML parser, such as the version
    number.
yaml: |
    --- %YAML:1.0
    foo: 1
    bar: 2
php: |
    array('foo' => 1, 'bar' => 2)
documents: 1

---
test: Red Herring Document Separator
brief: >
    Separators included in blocks or strings
    are treated as blocks or strings, as the
    document separator should have no indentation
    preceding it.
yaml: |
    foo: |
        ---
php: |
    array('foo' => "---\n")

---
test: Multiple Document Separators in Block
brief: >
    This technique allows you to embed other YAML
    documents within literal blocks.
yaml: |
    foo: |
        ---
        foo: bar
        ---
        yo: baz
    bar: |
        fooness
php: |
    array(
       'foo' => "---\nfoo: bar\n---\nyo: baz\n",
       'bar' => "fooness\n"
    )
PK�b�\�<�Bpear/test/Yaml/Symfony/Component/Yaml/Tests/Fixtures/sfObjects.ymlnu�[���--- %YAML:1.0
test: Objects
brief: >
    Comments at the end of a line
yaml: |
    ex1: "foo # bar"
    ex2: "foo # bar" # comment
    ex3: 'foo # bar' # comment
    ex4: foo # comment
php: |
    array('ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo')
PK�b�\=a�o[%[%:pear/test/Yaml/Symfony/Component/Yaml/Tests/InlineTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Tests;

use Symfony\Component\Yaml\Inline;

class InlineTest extends \PHPUnit_Framework_TestCase
{
    public function testParse()
    {
        foreach ($this->getTestsForParse() as $yaml => $value) {
            $this->assertSame($value, Inline::parse($yaml), sprintf('::parse() converts an inline YAML to a PHP structure (%s)', $yaml));
        }
    }

    public function testDump()
    {
        $testsForDump = $this->getTestsForDump();

        foreach ($testsForDump as $yaml => $value) {
            $this->assertEquals($yaml, Inline::dump($value), sprintf('::dump() converts a PHP structure to an inline YAML (%s)', $yaml));
        }

        foreach ($this->getTestsForParse() as $value) {
            $this->assertEquals($value, Inline::parse(Inline::dump($value)), 'check consistency');
        }

        foreach ($testsForDump as $value) {
            $this->assertEquals($value, Inline::parse(Inline::dump($value)), 'check consistency');
        }
    }

    public function testDumpNumericValueWithLocale()
    {
        $locale = setlocale(LC_NUMERIC, 0);
        if (false === $locale) {
            $this->markTestSkipped('Your platform does not support locales.');
        }

        $required_locales = array('fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252');
        if (false === setlocale(LC_ALL, $required_locales)) {
            $this->markTestSkipped('Could not set any of required locales: '.implode(", ", $required_locales));
        }

        $this->assertEquals('1.2', Inline::dump(1.2));
        $this->assertContains('fr', strtolower(setlocale(LC_NUMERIC, 0)));

        setlocale(LC_ALL, $locale);
    }

    public function testHashStringsResemblingExponentialNumericsShouldNotBeChangedToINF()
    {
        $value = '686e444';

        $this->assertSame($value, Inline::parse(Inline::dump($value)));
    }

    /**
     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
     */
    public function testParseScalarWithIncorrectlyQuotedStringShouldThrowException()
    {
        $value = "'don't do somthin' like that'";
        Inline::parse($value);
    }

    /**
     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
     */
    public function testParseScalarWithIncorrectlyDoubleQuotedStringShouldThrowException()
    {
        $value = '"don"t do somthin" like that"';
        Inline::parse($value);
    }

    /**
     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
     */
    public function testParseInvalidMappingKeyShouldThrowException()
    {
        $value = '{ "foo " bar": "bar" }';
        Inline::parse($value);
    }

    /**
     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
     */
    public function testParseInvalidMappingShouldThrowException()
    {
        Inline::parse('[foo] bar');
    }

    /**
     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
     */
    public function testParseInvalidSequenceShouldThrowException()
    {
        Inline::parse('{ foo: bar } bar');
    }

    public function testParseScalarWithCorrectlyQuotedStringShouldReturnString()
    {
        $value = "'don''t do somthin'' like that'";
        $expect = "don't do somthin' like that";

        $this->assertSame($expect, Inline::parseScalar($value));
    }

    protected function getTestsForParse()
    {
        return array(
            '' => '',
            'null' => null,
            'false' => false,
            'true' => true,
            '12' => 12,
            '-12' => -12,
            '"quoted string"' => 'quoted string',
            "'quoted string'" => 'quoted string',
            '12.30e+02' => 12.30e+02,
            '0x4D2' => 0x4D2,
            '02333' => 02333,
            '.Inf' => -log(0),
            '-.Inf' => log(0),
            "'686e444'" => '686e444',
            '686e444' => 646e444,
            '123456789123456789123456789123456789' => '123456789123456789123456789123456789',
            '"foo\r\nbar"' => "foo\r\nbar",
            "'foo#bar'" => 'foo#bar',
            "'foo # bar'" => 'foo # bar',
            "'#cfcfcf'" => '#cfcfcf',
            '::form_base.html.twig' => '::form_base.html.twig',

            '2007-10-30' => mktime(0, 0, 0, 10, 30, 2007),
            '2007-10-30T02:59:43Z' => gmmktime(2, 59, 43, 10, 30, 2007),
            '2007-10-30 02:59:43 Z' => gmmktime(2, 59, 43, 10, 30, 2007),
            '1960-10-30 02:59:43 Z' => gmmktime(2, 59, 43, 10, 30, 1960),
            '1730-10-30T02:59:43Z' => gmmktime(2, 59, 43, 10, 30, 1730),

            '"a \\"string\\" with \'quoted strings inside\'"' => 'a "string" with \'quoted strings inside\'',
            "'a \"string\" with ''quoted strings inside'''" => 'a "string" with \'quoted strings inside\'',

            // sequences
            // urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon
            '[foo, http://urls.are/no/mappings, false, null, 12]' => array('foo', 'http://urls.are/no/mappings', false, null, 12),
            '[  foo  ,   bar , false  ,  null     ,  12  ]' => array('foo', 'bar', false, null, 12),
            '[\'foo,bar\', \'foo bar\']' => array('foo,bar', 'foo bar'),

            // mappings
            '{foo:bar,bar:foo,false:false,null:null,integer:12}' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12),
            '{ foo  : bar, bar : foo,  false  :   false,  null  :   null,  integer :  12  }' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12),
            '{foo: \'bar\', bar: \'foo: bar\'}' => array('foo' => 'bar', 'bar' => 'foo: bar'),
            '{\'foo\': \'bar\', "bar": \'foo: bar\'}' => array('foo' => 'bar', 'bar' => 'foo: bar'),
            '{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}' => array('foo\'' => 'bar', "bar\"" => 'foo: bar'),
            '{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}' => array('foo: ' => 'bar', "bar: " => 'foo: bar'),

            // nested sequences and mappings
            '[foo, [bar, foo]]' => array('foo', array('bar', 'foo')),
            '[foo, {bar: foo}]' => array('foo', array('bar' => 'foo')),
            '{ foo: {bar: foo} }' => array('foo' => array('bar' => 'foo')),
            '{ foo: [bar, foo] }' => array('foo' => array('bar', 'foo')),

            '[  foo, [  bar, foo  ]  ]' => array('foo', array('bar', 'foo')),

            '[{ foo: {bar: foo} }]' => array(array('foo' => array('bar' => 'foo'))),

            '[foo, [bar, [foo, [bar, foo]], foo]]' => array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo')),

            '[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]' => array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo'))),

            '[foo, bar: { foo: bar }]' => array('foo', '1' => array('bar' => array('foo' => 'bar'))),
            '[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']' => array('foo', '@foo.baz', array('%foo%' => 'foo is %foo%', 'bar' => '%foo%',), true, '@service_container',),
        );
    }

    protected function getTestsForDump()
    {
        return array(
            'null' => null,
            'false' => false,
            'true' => true,
            '12' => 12,
            "'quoted string'" => 'quoted string',
            '12.30e+02' => 12.30e+02,
            '1234' => 0x4D2,
            '1243' => 02333,
            '.Inf' => -log(0),
            '-.Inf' => log(0),
            "'686e444'" => '686e444',
            '"foo\r\nbar"' => "foo\r\nbar",
            "'foo#bar'" => 'foo#bar',
            "'foo # bar'" => 'foo # bar',
            "'#cfcfcf'" => '#cfcfcf',

            "'a \"string\" with ''quoted strings inside'''" => 'a "string" with \'quoted strings inside\'',

            "'-dash'" => '-dash',
            "'-'" => '-',

            // sequences
            '[foo, bar, false, null, 12]' => array('foo', 'bar', false, null, 12),
            '[\'foo,bar\', \'foo bar\']' => array('foo,bar', 'foo bar'),

            // mappings
            '{ foo: bar, bar: foo, \'false\': false, \'null\': null, integer: 12 }' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12),
            '{ foo: bar, bar: \'foo: bar\' }' => array('foo' => 'bar', 'bar' => 'foo: bar'),

            // nested sequences and mappings
            '[foo, [bar, foo]]' => array('foo', array('bar', 'foo')),

            '[foo, [bar, [foo, [bar, foo]], foo]]' => array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo')),

            '{ foo: { bar: foo } }' => array('foo' => array('bar' => 'foo')),

            '[foo, { bar: foo }]' => array('foo', array('bar' => 'foo')),

            '[foo, { bar: foo, foo: [foo, { bar: foo }] }, [foo, { bar: foo }]]' => array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo'))),

            '[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']' => array('foo', '@foo.baz', array('%foo%' => 'foo is %foo%', 'bar' => '%foo%',), true, '@service_container',),
        );
    }
}
PK�b�\��?o��Bpear/test/Yaml/Symfony/Component/Yaml/Tests/ParseExceptionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Tests;

use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Yaml;

class ParseExceptionTest extends \PHPUnit_Framework_TestCase
{
    public function testGetMessage()
    {
        $exception = new ParseException('Error message', 42, 'foo: bar', '/var/www/app/config.yml');
        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
            $message = 'Error message in "/var/www/app/config.yml" at line 42 (near "foo: bar")';
        } else {
            $message = 'Error message in "\\/var\\/www\\/app\\/config.yml" at line 42 (near "foo: bar")';
        }

        $this->assertEquals($message, $exception->getMessage());
    }
}
PK�b�\~;�p2p2:pear/test/Yaml/Symfony/Component/Yaml/Tests/ParserTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Yaml\Tests;

use Symfony\Component\Yaml\Yaml;
use Symfony\Component\Yaml\Parser;

class ParserTest extends \PHPUnit_Framework_TestCase
{
    protected $parser;

    protected function setUp()
    {
        $this->parser = new Parser();
    }

    protected function tearDown()
    {
        $this->parser = null;
    }

    /**
     * @dataProvider getDataFormSpecifications
     */
    public function testSpecifications($file, $expected, $yaml, $comment)
    {
        if ('escapedCharacters' == $file) {
            if (!function_exists('iconv') && !function_exists('mb_convert_encoding')) {
                $this->markTestSkipped('The iconv and mbstring extensions are not available.');
            }
        }

        $this->assertEquals($expected, var_export($this->parser->parse($yaml), true), $comment);
    }

    public function getDataFormSpecifications()
    {
        $parser = new Parser();
        $path = __DIR__.'/Fixtures';

        $tests = array();
        $files = $parser->parse(file_get_contents($path.'/index.yml'));
        foreach ($files as $file) {
            $yamls = file_get_contents($path.'/'.$file.'.yml');

            // split YAMLs documents
            foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml) {
                if (!$yaml) {
                    continue;
                }

                $test = $parser->parse($yaml);
                if (isset($test['todo']) && $test['todo']) {
                    // TODO
                } else {
                    eval('$expected = '.trim($test['php']).';');

                    $tests[] = array($file, var_export($expected, true), $test['yaml'], $test['test']);
                }
            }
        }

        return $tests;
    }

    public function testTabsInYaml()
    {
        // test tabs in YAML
        $yamls = array(
            "foo:\n	bar",
            "foo:\n 	bar",
            "foo:\n	 bar",
            "foo:\n 	 bar",
        );

        foreach ($yamls as $yaml) {
            try {
                $content = $this->parser->parse($yaml);

                $this->fail('YAML files must not contain tabs');
            } catch (\Exception $e) {
                $this->assertInstanceOf('\Exception', $e, 'YAML files must not contain tabs');
                $this->assertEquals('A YAML file cannot contain tabs as indentation at line 2 (near "'.strpbrk($yaml, "\t").'").', $e->getMessage(), 'YAML files must not contain tabs');
            }
        }
    }

    public function testEndOfTheDocumentMarker()
    {
        $yaml = <<<EOF
--- %YAML:1.0
foo
...
EOF;

        $this->assertEquals('foo', $this->parser->parse($yaml));
    }

    public function getBlockChompingTests()
    {
        $tests = array();

        $yaml = <<<'EOF'
foo: |-
    one
    two
bar: |-
    one
    two

EOF;
        $expected = array(
            'foo' => "one\ntwo",
            'bar' => "one\ntwo",
        );
        $tests['Literal block chomping strip with single trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: |-
    one
    two

bar: |-
    one
    two


EOF;
        $expected = array(
            'foo' => "one\ntwo",
            'bar' => "one\ntwo",
        );
        $tests['Literal block chomping strip with multiple trailing newlines'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: |-
    one
    two
bar: |-
    one
    two
EOF;
        $expected = array(
            'foo' => "one\ntwo",
            'bar' => "one\ntwo",
        );
        $tests['Literal block chomping strip without trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: |
    one
    two
bar: |
    one
    two

EOF;
        $expected = array(
            'foo' => "one\ntwo\n",
            'bar' => "one\ntwo\n",
        );
        $tests['Literal block chomping clip with single trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: |
    one
    two

bar: |
    one
    two


EOF;
        $expected = array(
            'foo' => "one\ntwo\n",
            'bar' => "one\ntwo\n",
        );
        $tests['Literal block chomping clip with multiple trailing newlines'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: |
    one
    two
bar: |
    one
    two
EOF;
        $expected = array(
            'foo' => "one\ntwo\n",
            'bar' => "one\ntwo",
        );
        $tests['Literal block chomping clip without trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: |+
    one
    two
bar: |+
    one
    two

EOF;
        $expected = array(
            'foo' => "one\ntwo\n",
            'bar' => "one\ntwo\n",
        );
        $tests['Literal block chomping keep with single trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: |+
    one
    two

bar: |+
    one
    two


EOF;
        $expected = array(
            'foo' => "one\ntwo\n\n",
            'bar' => "one\ntwo\n\n",
        );
        $tests['Literal block chomping keep with multiple trailing newlines'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: |+
    one
    two
bar: |+
    one
    two
EOF;
        $expected = array(
            'foo' => "one\ntwo\n",
            'bar' => "one\ntwo",
        );
        $tests['Literal block chomping keep without trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: >-
    one
    two
bar: >-
    one
    two

EOF;
        $expected = array(
            'foo' => "one two",
            'bar' => "one two",
        );
        $tests['Folded block chomping strip with single trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: >-
    one
    two

bar: >-
    one
    two


EOF;
        $expected = array(
            'foo' => "one two",
            'bar' => "one two",
        );
        $tests['Folded block chomping strip with multiple trailing newlines'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: >-
    one
    two
bar: >-
    one
    two
EOF;
        $expected = array(
            'foo' => "one two",
            'bar' => "one two",
        );
        $tests['Folded block chomping strip without trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: >
    one
    two
bar: >
    one
    two

EOF;
        $expected = array(
            'foo' => "one two\n",
            'bar' => "one two\n",
        );
        $tests['Folded block chomping clip with single trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: >
    one
    two

bar: >
    one
    two


EOF;
        $expected = array(
            'foo' => "one two\n",
            'bar' => "one two\n",
        );
        $tests['Folded block chomping clip with multiple trailing newlines'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: >
    one
    two
bar: >
    one
    two
EOF;
        $expected = array(
            'foo' => "one two\n",
            'bar' => "one two",
        );
        $tests['Folded block chomping clip without trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: >+
    one
    two
bar: >+
    one
    two

EOF;
        $expected = array(
            'foo' => "one two\n",
            'bar' => "one two\n",
        );
        $tests['Folded block chomping keep with single trailing newline'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: >+
    one
    two

bar: >+
    one
    two


EOF;
        $expected = array(
            'foo' => "one two\n\n",
            'bar' => "one two\n\n",
        );
        $tests['Folded block chomping keep with multiple trailing newlines'] = array($expected, $yaml);

        $yaml = <<<'EOF'
foo: >+
    one
    two
bar: >+
    one
    two
EOF;
        $expected = array(
            'foo' => "one two\n",
            'bar' => "one two",
        );
        $tests['Folded block chomping keep without trailing newline'] = array($expected, $yaml);

        return $tests;
    }

    /**
     * @dataProvider getBlockChompingTests
     */
    public function testBlockChomping($expected, $yaml)
    {
        $this->assertSame($expected, $this->parser->parse($yaml));
    }

    /**
     * Regression test for issue #7989.
     *
     * @see https://github.com/symfony/symfony/issues/7989
     */
    public function testBlockLiteralWithLeadingNewlines()
    {
        $yaml = <<<'EOF'
foo: |-


    bar

EOF;
        $expected = array(
            'foo' => "\n\nbar"
        );

        $this->assertSame($expected, $this->parser->parse($yaml));
    }

    public function testObjectSupportEnabled()
    {
        $input = <<<EOF
foo: !!php/object:O:30:"Symfony\Component\Yaml\Tests\B":1:{s:1:"b";s:3:"foo";}
bar: 1
EOF;
        $this->assertEquals(array('foo' => new B(), 'bar' => 1), $this->parser->parse($input, false, true), '->parse() is able to parse objects');
    }

    public function testObjectSupportDisabledButNoExceptions()
    {
        $input = <<<EOF
foo: !!php/object:O:30:"Symfony\Tests\Component\Yaml\B":1:{s:1:"b";s:3:"foo";}
bar: 1
EOF;

        $this->assertEquals(array('foo' => null, 'bar' => 1), $this->parser->parse($input), '->parse() does not parse objects');
    }

    /**
     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
     */
    public function testObjectsSupportDisabledWithExceptions()
    {
        $this->parser->parse('foo: !!php/object:O:30:"Symfony\Tests\Component\Yaml\B":1:{s:1:"b";s:3:"foo";}', true, false);
    }

    public function testNonUtf8Exception()
    {
        if (!function_exists('mb_detect_encoding') || !function_exists('iconv')) {
            $this->markTestSkipped('Exceptions for non-utf8 charsets require the mb_detect_encoding() and iconv() functions.');

            return;
        }

        $yamls = array(
            iconv("UTF-8", "ISO-8859-1", "foo: 'äöüß'"),
            iconv("UTF-8", "ISO-8859-15", "euro: '€'"),
            iconv("UTF-8", "CP1252", "cp1252: '©ÉÇáñ'")
        );

        foreach ($yamls as $yaml) {
            try {
                $this->parser->parse($yaml);

                $this->fail('charsets other than UTF-8 are rejected.');
            } catch (\Exception $e) {
                 $this->assertInstanceOf('Symfony\Component\Yaml\Exception\ParseException', $e, 'charsets other than UTF-8 are rejected.');
            }
        }
    }

    /**
     *
     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
     *
     */
    public function testUnindentedCollectionException()
    {
        $yaml = <<<EOF

collection:
-item1
-item2
-item3

EOF;

        $this->parser->parse($yaml);
    }

    /**
     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
     */
    public function testSequenceInAMapping()
    {
        Yaml::parse(<<<EOF
yaml:
  hash: me
  - array stuff
EOF
        );
    }

    /**
     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
     */
    public function testMappingInASequence()
    {
        Yaml::parse(<<<EOF
yaml:
  - array stuff
  hash: me
EOF
        );
    }

    public function testEmptyValue()
    {
        $input = <<<EOF
hash:
EOF;

        $this->assertEquals(array('hash' => null), Yaml::parse($input));
    }

    public function testStringBlockWithComments()
    {
        $this->assertEquals(array('content' => <<<EOT
# comment 1
header

    # comment 2
    <body>
        <h1>title</h1>
    </body>

footer # comment3
EOT
        ), Yaml::parse(<<<EOF
content: |
    # comment 1
    header

        # comment 2
        <body>
            <h1>title</h1>
        </body>

    footer # comment3
EOF
        ));
    }

    public function testFoldedStringBlockWithComments()
    {
        $this->assertEquals(array(array('content' => <<<EOT
# comment 1
header

    # comment 2
    <body>
        <h1>title</h1>
    </body>

footer # comment3
EOT
        )), Yaml::parse(<<<EOF
-
    content: |
        # comment 1
        header

            # comment 2
            <body>
                <h1>title</h1>
            </body>

        footer # comment3
EOF
        ));
    }

    public function testNestedFoldedStringBlockWithComments()
    {
        $this->assertEquals(array(array(
            'title'   => 'some title',
            'content' => <<<EOT
# comment 1
header

    # comment 2
    <body>
        <h1>title</h1>
    </body>

footer # comment3
EOT
        )), Yaml::parse(<<<EOF
-
    title: some title
    content: |
        # comment 1
        header

            # comment 2
            <body>
                <h1>title</h1>
            </body>

        footer # comment3
EOF
        ));
    }
}

class B
{
    public $b = 'foo';
}
PK�b�\�Y�hh:pear/test/Config/Symfony/Component/Config/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Config Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\��sEpear/test/Config/Symfony/Component/Config/Tests/Util/XmlUtilsTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Loader;

use Symfony\Component\Config\Util\XmlUtils;

class XmlUtilsTest extends \PHPUnit_Framework_TestCase
{
    public function testLoadFile()
    {
        $fixtures = __DIR__.'/../Fixtures/Util/';

        try {
            XmlUtils::loadFile($fixtures.'invalid.xml');
            $this->fail();
        } catch (\InvalidArgumentException $e) {
            $this->assertContains('ERROR 77', $e->getMessage());
        }

        try {
            XmlUtils::loadFile($fixtures.'document_type.xml');
            $this->fail();
        } catch (\InvalidArgumentException $e) {
            $this->assertContains('Document types are not allowed', $e->getMessage());
        }

        try {
            XmlUtils::loadFile($fixtures.'invalid_schema.xml', $fixtures.'schema.xsd');
            $this->fail();
        } catch (\InvalidArgumentException $e) {
            $this->assertContains('ERROR 1845', $e->getMessage());
        }

        try {
            XmlUtils::loadFile($fixtures.'invalid_schema.xml', 'invalid_callback_or_file');
            $this->fail();
        } catch (\InvalidArgumentException $e) {
            $this->assertContains('XSD file or callable', $e->getMessage());
        }

        $mock = $this->getMock(__NAMESPACE__.'\Validator');
        $mock->expects($this->exactly(2))->method('validate')->will($this->onConsecutiveCalls(false, true));

        try {
            XmlUtils::loadFile($fixtures.'valid.xml', array($mock, 'validate'));
            $this->fail();
        } catch (\InvalidArgumentException $e) {
            $this->assertContains('is not valid', $e->getMessage());
        }

        $this->assertInstanceOf('DOMDocument', XmlUtils::loadFile($fixtures.'valid.xml', array($mock, 'validate')));
    }

    /**
     * @dataProvider getDataForConvertDomToArray
     */
    public function testConvertDomToArray($expected, $xml, $root = false, $checkPrefix = true)
    {
        $dom = new \DOMDocument();
        $dom->loadXML($root ? $xml : '<root>'.$xml.'</root>');

        $this->assertSame($expected, XmlUtils::convertDomElementToArray($dom->documentElement, $checkPrefix));
    }

    public function getDataForConvertDomToArray()
    {
        return array(
            array(null, ''),
            array('bar', 'bar'),
            array(array('bar' => 'foobar'), '<foo bar="foobar" />', true),
            array(array('foo' => null), '<foo />'),
            array(array('foo' => 'bar'), '<foo>bar</foo>'),
            array(array('foo' => array('foo' => 'bar')), '<foo foo="bar"/>'),
            array(array('foo' => array('foo' => 0)), '<foo><foo>0</foo></foo>'),
            array(array('foo' => array('foo' => 'bar')), '<foo><foo>bar</foo></foo>'),
            array(array('foo' => array('foo' => 'bar', 'value' => 'text')), '<foo foo="bar">text</foo>'),
            array(array('foo' => array('attr' => 'bar', 'foo' => 'text')), '<foo attr="bar"><foo>text</foo></foo>'),
            array(array('foo' => array('bar', 'text')), '<foo>bar</foo><foo>text</foo>'),
            array(array('foo' => array(array('foo' => 'bar'), array('foo' => 'text'))), '<foo foo="bar"/><foo foo="text" />'),
            array(array('foo' => array('foo' => array('bar', 'text'))), '<foo foo="bar"><foo>text</foo></foo>'),
            array(array('foo' => 'bar'), '<foo><!-- Comment -->bar</foo>'),
            array(array('foo' => 'text'), '<foo xmlns:h="http://www.example.org/bar" h:bar="bar">text</foo>'),
            array(array('foo' => array('bar' => 'bar', 'value' => 'text')), '<foo xmlns:h="http://www.example.org/bar" h:bar="bar">text</foo>', false, false),
            array(array('attr' => 1, 'b' => 'hello'), '<foo:a xmlns:foo="http://www.example.org/foo" xmlns:h="http://www.example.org/bar" attr="1" h:bar="bar"><foo:b>hello</foo:b><h:c>2</h:c></foo:a>', true),
        );
    }

    /**
     * @dataProvider getDataForPhpize
     */
    public function testPhpize($expected, $value)
    {
        $this->assertSame($expected, XmlUtils::phpize($value));
    }

    public function getDataForPhpize()
    {
        return array(
            array('', ''),
            array(null, 'null'),
            array(true, 'true'),
            array(false, 'false'),
            array(null, 'Null'),
            array(true, 'True'),
            array(false, 'False'),
            array(0, '0'),
            array(1, '1'),
            array(-1, '-1'),
            array(0777, '0777'),
            array(255, '0xFF'),
            array(100.0, '1e2'),
            array(-120.0, '-1.2E2'),
            array(-10100.1, '-10100.1'),
            array('-10,100.1', '-10,100.1'),
            array('1234 5678 9101 1121 3141', '1234 5678 9101 1121 3141'),
            array('1,2,3,4', '1,2,3,4'),
            array('11,22,33,44', '11,22,33,44'),
            array('11,222,333,4', '11,222,333,4'),
            array('1,222,333,444', '1,222,333,444'),
            array('11,222,333,444', '11,222,333,444'),
            array('111,222,333,444', '111,222,333,444'),
            array('1111,2222,3333,4444,5555', '1111,2222,3333,4444,5555'),
            array('foo', 'foo'),
            array(6, '0b0110'),
        );
    }

    public function testLoadEmptyXmlFile()
    {
        $file = __DIR__.'/../Fixtures/foo.xml';
        $this->setExpectedException('InvalidArgumentException', 'File '.$file.' does not contain valid XML, it is empty.');
        XmlUtils::loadFile($file);
    }

    // test for issue https://github.com/symfony/symfony/issues/9731
    public function testLoadWrongEmptyXMLWithErrorHandler()
    {
        $originalDisableEntities = libxml_disable_entity_loader(false);
        $errorReporting = error_reporting(-1);

        set_error_handler(function ($errno, $errstr) {
            throw new \Exception($errstr, $errno);
        });

        $file = __DIR__.'/../Fixtures/foo.xml';
        try {
            XmlUtils::loadFile($file);
            $this->fail('An exception should have been raised');
        } catch (\InvalidArgumentException $e) {
            $this->assertEquals(sprintf('File %s does not contain valid XML, it is empty.', $file), $e->getMessage());
        }

        restore_error_handler();
        error_reporting($errorReporting);

        $disableEntities = libxml_disable_entity_loader(true);
        libxml_disable_entity_loader($disableEntities);

        libxml_disable_entity_loader($originalDisableEntities);

        $this->assertFalse($disableEntities);

        // should not throw an exception
        XmlUtils::loadFile(__DIR__.'/../Fixtures/Util/valid.xml', __DIR__.'/../Fixtures/Util/schema.xsd');
    }
}

interface Validator
{
    public function validate();
}
PK�b�\������Rpear/test/Config/Symfony/Component/Config/Tests/Resource/DirectoryResourceTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Resource;

use Symfony\Component\Config\Resource\DirectoryResource;

class DirectoryResourceTest extends \PHPUnit_Framework_TestCase
{
    protected $directory;

    protected function setUp()
    {
        $this->directory = sys_get_temp_dir().'/symfonyDirectoryIterator';
        if (!file_exists($this->directory)) {
            mkdir($this->directory);
        }
        touch($this->directory.'/tmp.xml');
    }

    protected function tearDown()
    {
        if (!is_dir($this->directory)) {
            return;
        }
        $this->removeDirectory($this->directory);
    }

    protected function removeDirectory($directory)
    {
        $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory), \RecursiveIteratorIterator::CHILD_FIRST);
        foreach ($iterator as $path) {
            if (preg_match('#[/\\\\]\.\.?$#', $path->__toString())) {
                continue;
            }
            if ($path->isDir()) {
               rmdir($path->__toString());
            } else {
               unlink($path->__toString());
            }
        }
        rmdir($directory);
    }

    public function testGetResource()
    {
        $resource = new DirectoryResource($this->directory);
        $this->assertSame($this->directory, $resource->getResource(), '->getResource() returns the path to the resource');
        $this->assertSame($this->directory, (string) $resource, '->__toString() returns the path to the resource');
    }

    public function testGetPattern()
    {
        $resource = new DirectoryResource('foo', 'bar');
        $this->assertEquals('bar', $resource->getPattern());
    }

    public function testIsFresh()
    {
        $resource = new DirectoryResource($this->directory);
        $this->assertTrue($resource->isFresh(time() + 10), '->isFresh() returns true if the resource has not changed');
        $this->assertFalse($resource->isFresh(time() - 86400), '->isFresh() returns false if the resource has been updated');

        $resource = new DirectoryResource('/____foo/foobar'.rand(1, 999999));
        $this->assertFalse($resource->isFresh(time()), '->isFresh() returns false if the resource does not exist');
    }

    public function testIsFreshUpdateFile()
    {
        $resource = new DirectoryResource($this->directory);
        touch($this->directory.'/tmp.xml', time() + 20);
        $this->assertFalse($resource->isFresh(time() + 10), '->isFresh() returns false if an existing file is modified');
    }

    public function testIsFreshNewFile()
    {
        $resource = new DirectoryResource($this->directory);
        touch($this->directory.'/new.xml', time() + 20);
        $this->assertFalse($resource->isFresh(time() + 10), '->isFresh() returns false if a new file is added');
    }

    public function testIsFreshDeleteFile()
    {
        $resource = new DirectoryResource($this->directory);
        unlink($this->directory.'/tmp.xml');
        $this->assertFalse($resource->isFresh(time()), '->isFresh() returns false if an existing file is removed');
    }

    public function testIsFreshDeleteDirectory()
    {
        $resource = new DirectoryResource($this->directory);
        $this->removeDirectory($this->directory);
        $this->assertFalse($resource->isFresh(time()), '->isFresh() returns false if the whole resource is removed');
    }

    public function testIsFreshCreateFileInSubdirectory()
    {
        $subdirectory = $this->directory.'/subdirectory';
        mkdir($subdirectory);

        $resource = new DirectoryResource($this->directory);
        $this->assertTrue($resource->isFresh(time() + 10), '->isFresh() returns true if an unmodified subdirectory exists');

        touch($subdirectory.'/newfile.xml', time() + 20);
        $this->assertFalse($resource->isFresh(time() + 10), '->isFresh() returns false if a new file in a subdirectory is added');
    }

    public function testIsFreshModifySubdirectory()
    {
        $resource = new DirectoryResource($this->directory);

        $subdirectory = $this->directory.'/subdirectory';
        mkdir($subdirectory);
        touch($subdirectory, time() + 20);

        $this->assertFalse($resource->isFresh(time() + 10), '->isFresh() returns false if a subdirectory is modified (e.g. a file gets deleted)');
    }

    public function testFilterRegexListNoMatch()
    {
        $resource = new DirectoryResource($this->directory, '/\.(foo|xml)$/');

        touch($this->directory.'/new.bar', time() + 20);
        $this->assertTrue($resource->isFresh(time() + 10), '->isFresh() returns true if a new file not matching the filter regex is created');
    }

    public function testFilterRegexListMatch()
    {
        $resource = new DirectoryResource($this->directory, '/\.(foo|xml)$/');

        touch($this->directory.'/new.xml', time() + 20);
        $this->assertFalse($resource->isFresh(time() + 10), '->isFresh() returns false if an new file matching the filter regex is created ');
    }

    public function testSerializeUnserialize()
    {
        $resource = new DirectoryResource($this->directory, '/\.(foo|xml)$/');

        $unserialized = unserialize(serialize($resource));

        $this->assertSame($this->directory, $resource->getResource());
        $this->assertSame('/\.(foo|xml)$/', $resource->getPattern());
    }
}
PK�b�\�D-��Mpear/test/Config/Symfony/Component/Config/Tests/Resource/FileResourceTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Resource;

use Symfony\Component\Config\Resource\FileResource;

class FileResourceTest extends \PHPUnit_Framework_TestCase
{
    protected $resource;
    protected $file;

    protected function setUp()
    {
        $this->file = realpath(sys_get_temp_dir()).'/tmp.xml';
        touch($this->file);
        $this->resource = new FileResource($this->file);
    }

    protected function tearDown()
    {
        unlink($this->file);
    }

    public function testGetResource()
    {
        $this->assertSame(realpath($this->file), $this->resource->getResource(), '->getResource() returns the path to the resource');
    }

    public function testToString()
    {
        $this->assertSame(realpath($this->file), (string) $this->resource);
    }

    public function testIsFresh()
    {
        $this->assertTrue($this->resource->isFresh(time() + 10), '->isFresh() returns true if the resource has not changed');
        $this->assertFalse($this->resource->isFresh(time() - 86400), '->isFresh() returns false if the resource has been updated');

        $resource = new FileResource('/____foo/foobar'.rand(1, 999999));
        $this->assertFalse($resource->isFresh(time()), '->isFresh() returns false if the resource does not exist');
    }

    public function testSerializeUnserialize()
    {
        $unserialized = unserialize(serialize($this->resource));

        $this->assertSame(realpath($this->file), $this->resource->getResource());
    }
}
PK�b�\�hE--Lpear/test/Config/Symfony/Component/Config/Tests/Definition/ArrayNodeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition;

use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\ScalarNode;

class ArrayNodeTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidTypeException
     */
    public function testNormalizeThrowsExceptionWhenFalseIsNotAllowed()
    {
        $node = new ArrayNode('root');
        $node->normalize(false);
    }

    /**
     * @expectedException        \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
     * @expectedExceptionMessage Unrecognized options "foo" under "root"
     */
    public function testExceptionThrownOnUnrecognizedChild()
    {
        $node = new ArrayNode('root');
        $node->normalize(array('foo' => 'bar'));
    }

    /**
     * Tests that no exception is thrown for an unrecognized child if the
     * ignoreExtraKeys option is set to true.
     *
     * Related to testExceptionThrownOnUnrecognizedChild
     */
    public function testIgnoreExtraKeysNoException()
    {
        $node = new ArrayNode('roo');
        $node->setIgnoreExtraKeys(true);

        $node->normalize(array('foo' => 'bar'));
        $this->assertTrue(true, 'No exception was thrown when setIgnoreExtraKeys is true');
    }

    /**
     * @dataProvider getPreNormalizationTests
     */
    public function testPreNormalize($denormalized, $normalized)
    {
        $node = new ArrayNode('foo');

        $r = new \ReflectionMethod($node, 'preNormalize');
        $r->setAccessible(true);

        $this->assertSame($normalized, $r->invoke($node, $denormalized));
    }

    public function getPreNormalizationTests()
    {
        return array(
            array(
                array('foo-bar' => 'foo'),
                array('foo_bar' => 'foo'),
            ),
            array(
                array('foo-bar_moo' => 'foo'),
                array('foo-bar_moo' => 'foo'),
            ),
            array(
                array('foo-bar' => null, 'foo_bar' => 'foo'),
                array('foo-bar' => null, 'foo_bar' => 'foo'),
            )
        );
    }

    /**
     * @dataProvider getZeroNamedNodeExamplesData
     */
    public function testNodeNameCanBeZero($denormalized, $normalized)
    {
        $zeroNode = new ArrayNode(0);
        $zeroNode->addChild(new ScalarNode('name'));
        $fiveNode = new ArrayNode(5);
        $fiveNode->addChild(new ScalarNode(0));
        $fiveNode->addChild(new ScalarNode('new_key'));
        $rootNode = new ArrayNode('root');
        $rootNode->addChild($zeroNode);
        $rootNode->addChild($fiveNode);
        $rootNode->addChild(new ScalarNode('string_key'));
        $r = new \ReflectionMethod($rootNode, 'normalizeValue');
        $r->setAccessible(true);

        $this->assertSame($normalized, $r->invoke($rootNode, $denormalized));
    }

    public function getZeroNamedNodeExamplesData()
    {
        return array(
            array(
                array(
                    0 => array(
                        'name'    => 'something',
                    ),
                    5 => array(
                        0         => 'this won\'t work too',
                        'new_key' => 'some other value',
                    ),
                    'string_key'  => 'just value',
                ),
                array(
                    0 => array (
                        'name' => 'something',
                    ),
                    5 => array (
                        0 => 'this won\'t work too',
                        'new_key' => 'some other value',
                    ),
                    'string_key' => 'just value',
                ),
            ),
        );
    }

    /**
     * @dataProvider getPreNormalizedNormalizedOrderedData
     */
    public function testChildrenOrderIsMaintainedOnNormalizeValue($prenormalized, $normalized)
    {
        $scalar1 = new ScalarNode('1');
        $scalar2 = new ScalarNode('2');
        $scalar3 = new ScalarNode('3');
        $node = new ArrayNode('foo');
        $node->addChild($scalar1);
        $node->addChild($scalar3);
        $node->addChild($scalar2);

        $r = new \ReflectionMethod($node, 'normalizeValue');
        $r->setAccessible(true);

        $this->assertSame($normalized, $r->invoke($node, $prenormalized));
    }

    public function getPreNormalizedNormalizedOrderedData()
    {
        return array(
            array(
                array('2' => 'two', '1' => 'one', '3' => 'three'),
                array('2' => 'two', '1' => 'one', '3' => 'three'),
            ),
        );
    }
}
PK�b�\%Jbx��Vpear/test/Config/Symfony/Component/Config/Tests/Definition/PrototypedArrayNodeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition;

use Symfony\Component\Config\Definition\PrototypedArrayNode;
use Symfony\Component\Config\Definition\ArrayNode;
use Symfony\Component\Config\Definition\ScalarNode;

class PrototypedArrayNodeTest extends \PHPUnit_Framework_TestCase
{
    public function testGetDefaultValueReturnsAnEmptyArrayForPrototypes()
    {
        $node = new PrototypedArrayNode('root');
        $prototype = new ArrayNode(null, $node);
        $node->setPrototype($prototype);
        $this->assertEmpty($node->getDefaultValue());
    }

    public function testGetDefaultValueReturnsDefaultValueForPrototypes()
    {
        $node = new PrototypedArrayNode('root');
        $prototype = new ArrayNode(null, $node);
        $node->setPrototype($prototype);
        $node->setDefaultValue(array('test'));
        $this->assertEquals(array('test'), $node->getDefaultValue());
    }

    // a remapped key (e.g. "mapping" -> "mappings") should be unset after being used
    public function testRemappedKeysAreUnset()
    {
        $node = new ArrayNode('root');
        $mappingsNode = new PrototypedArrayNode('mappings');
        $node->addChild($mappingsNode);

        // each item under mappings is just a scalar
        $prototype = new ScalarNode(null, $mappingsNode);
        $mappingsNode->setPrototype($prototype);

        $remappings = array();
        $remappings[] = array('mapping', 'mappings');
        $node->setXmlRemappings($remappings);

        $normalized = $node->normalize(array('mapping' => array('foo', 'bar')));
        $this->assertEquals(array('mappings' => array('foo', 'bar')), $normalized);
    }

    /**
     * Tests that when a key attribute is mapped, that key is removed from the array:
     *
     *     <things>
     *         <option id="option1" value="foo">
     *         <option id="option2" value="bar">
     *     </things>
     *
     * The above should finally be mapped to an array that looks like this
     * (because "id" is the key attribute).
     *
     *     array(
     *         'things' => array(
     *             'option1' => 'foo',
     *             'option2' => 'bar',
     *         )
     *     )
     */
    public function testMappedAttributeKeyIsRemoved()
    {
        $node = new PrototypedArrayNode('root');
        $node->setKeyAttribute('id', true);

        // each item under the root is an array, with one scalar item
        $prototype = new ArrayNode(null, $node);
        $prototype->addChild(new ScalarNode('foo'));
        $node->setPrototype($prototype);

        $children = array();
        $children[] = array('id' => 'item_name', 'foo' => 'bar');
        $normalized = $node->normalize($children);

        $expected = array();
        $expected['item_name'] = array('foo' => 'bar');
        $this->assertEquals($expected, $normalized);
    }

    /**
     * Tests the opposite of the testMappedAttributeKeyIsRemoved because
     * the removal can be toggled with an option.
     */
    public function testMappedAttributeKeyNotRemoved()
    {
        $node = new PrototypedArrayNode('root');
        $node->setKeyAttribute('id', false);

        // each item under the root is an array, with two scalar items
        $prototype = new ArrayNode(null, $node);
        $prototype->addChild(new ScalarNode('foo'));
        $prototype->addChild(new ScalarNode('id')); // the key attribute will remain
        $node->setPrototype($prototype);

        $children = array();
        $children[] = array('id' => 'item_name', 'foo' => 'bar');
        $normalized = $node->normalize($children);

        $expected = array();
        $expected['item_name'] = array('id' => 'item_name', 'foo' => 'bar');
        $this->assertEquals($expected, $normalized);
    }

    public function testAddDefaultChildren()
    {
        $node = $this->getPrototypeNodeWithDefaultChildren();
        $node->setAddChildrenIfNoneSet();
        $this->assertTrue($node->hasDefaultValue());
        $this->assertEquals(array(array('foo' => 'bar')), $node->getDefaultValue());

        $node = $this->getPrototypeNodeWithDefaultChildren();
        $node->setKeyAttribute('foobar');
        $node->setAddChildrenIfNoneSet();
        $this->assertTrue($node->hasDefaultValue());
        $this->assertEquals(array('defaults' => array('foo' => 'bar')), $node->getDefaultValue());

        $node = $this->getPrototypeNodeWithDefaultChildren();
        $node->setKeyAttribute('foobar');
        $node->setAddChildrenIfNoneSet('defaultkey');
        $this->assertTrue($node->hasDefaultValue());
        $this->assertEquals(array('defaultkey' => array('foo' => 'bar')), $node->getDefaultValue());

        $node = $this->getPrototypeNodeWithDefaultChildren();
        $node->setKeyAttribute('foobar');
        $node->setAddChildrenIfNoneSet(array('defaultkey'));
        $this->assertTrue($node->hasDefaultValue());
        $this->assertEquals(array('defaultkey' => array('foo' => 'bar')), $node->getDefaultValue());

        $node = $this->getPrototypeNodeWithDefaultChildren();
        $node->setKeyAttribute('foobar');
        $node->setAddChildrenIfNoneSet(array('dk1', 'dk2'));
        $this->assertTrue($node->hasDefaultValue());
        $this->assertEquals(array('dk1' => array('foo' => 'bar'), 'dk2' => array('foo' => 'bar')), $node->getDefaultValue());

        $node = $this->getPrototypeNodeWithDefaultChildren();
        $node->setAddChildrenIfNoneSet(array(5, 6));
        $this->assertTrue($node->hasDefaultValue());
        $this->assertEquals(array(0 => array('foo' => 'bar'), 1 => array('foo' => 'bar')), $node->getDefaultValue());

        $node = $this->getPrototypeNodeWithDefaultChildren();
        $node->setAddChildrenIfNoneSet(2);
        $this->assertTrue($node->hasDefaultValue());
        $this->assertEquals(array(array('foo' => 'bar'), array('foo' => 'bar')), $node->getDefaultValue());
    }

    public function testDefaultChildrenWinsOverDefaultValue()
    {
        $node = $this->getPrototypeNodeWithDefaultChildren();
        $node->setAddChildrenIfNoneSet();
        $node->setDefaultValue(array('bar' => 'foo'));
        $this->assertTrue($node->hasDefaultValue());
        $this->assertEquals(array(array('foo' => 'bar')), $node->getDefaultValue());
    }

    protected function getPrototypeNodeWithDefaultChildren()
    {
        $node = new PrototypedArrayNode('root');
        $prototype = new ArrayNode(null, $node);
        $child = new ScalarNode('foo');
        $child->setDefaultValue('bar');
        $prototype->addChild($child);
        $prototype->setAddIfNotSet(true);
        $node->setPrototype($prototype);

        return $node;
    }
}
PK�b�\jO灃�Mpear/test/Config/Symfony/Component/Config/Tests/Definition/ScalarNodeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition;

use Symfony\Component\Config\Definition\ScalarNode;

class ScalarNodeTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getValidValues
     */
    public function testNormalize($value)
    {
        $node = new ScalarNode('test');
        $this->assertSame($value, $node->normalize($value));
    }

    public function getValidValues()
    {
        return array(
            array(false),
            array(true),
            array(null),
            array(''),
            array('foo'),
            array(0),
            array(1),
            array(0.0),
            array(0.1),
        );
    }

    /**
     * @dataProvider getInvalidValues
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidTypeException
     */
    public function testNormalizeThrowsExceptionOnInvalidValues($value)
    {
        $node = new ScalarNode('test');
        $node->normalize($value);
    }

    public function getInvalidValues()
    {
        return array(
            array(array()),
            array(array('foo' => 'bar')),
            array(new \stdClass()),
        );
    }
}
PK�b�\A�RROpear/test/Config/Symfony/Component/Config/Tests/Definition/FinalizationTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\Config\Definition\NodeInterface;

class FinalizationTest extends \PHPUnit_Framework_TestCase
{
    public function testUnsetKeyWithDeepHierarchy()
    {
        $tb = new TreeBuilder();
        $tree = $tb
            ->root('config', 'array')
                ->children()
                    ->node('level1', 'array')
                        ->canBeUnset()
                        ->children()
                            ->node('level2', 'array')
                                ->canBeUnset()
                                ->children()
                                    ->node('somevalue', 'scalar')->end()
                                    ->node('anothervalue', 'scalar')->end()
                                ->end()
                            ->end()
                            ->node('level1_scalar', 'scalar')->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
            ->buildTree()
        ;

        $a = array(
            'level1' => array(
                'level2' => array(
                    'somevalue' => 'foo',
                    'anothervalue' => 'bar',
                ),
                'level1_scalar' => 'foo',
            ),
        );

        $b = array(
            'level1' => array(
                'level2' => false,
            ),
        );

        $this->assertEquals(array(
            'level1' => array(
                'level1_scalar' => 'foo',
            ),
        ), $this->process($tree, array($a, $b)));
    }

    protected function process(NodeInterface $tree, array $configs)
    {
        $processor = new Processor();

        return $processor->process($tree, $configs);
    }
}
PK�b�\�y���]pear/test/Config/Symfony/Component/Config/Tests/Definition/Dumper/YamlReferenceDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Dumper;

use Symfony\Component\Config\Definition\Dumper\YamlReferenceDumper;
use Symfony\Component\Config\Tests\Fixtures\Configuration\ExampleConfiguration;

class YamlReferenceDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDumper()
    {
        $configuration = new ExampleConfiguration();

        $dumper = new YamlReferenceDumper();

        $this->markTestIncomplete('The Yaml Dumper currently does not support prototyped arrays');
        $this->assertEquals($this->getConfigurationAsString(), $dumper->dump($configuration));
    }

    private function getConfigurationAsString()
    {
      return <<<EOL
acme_root:
    boolean:              true
    scalar_empty:         ~
    scalar_null:          ~
    scalar_true:          true
    scalar_false:         false
    scalar_default:       default
    scalar_array_empty:   []
    scalar_array_defaults:

        # Defaults:
        - elem1
        - elem2
    scalar_required:      ~ # Required
    enum:                 ~ # One of "this"; "that"

    # some info
    array:
        child1:               ~
        child2:               ~

        # this is a long
        # multi-line info text
        # which should be indented
        child3:               ~ # Example: example setting
    parameters:

        # Prototype
        name:                 ~
    connections:
        # Prototype
        - { user: ~, pass: ~ }

EOL;
    }
}
PK�b�\~�P+\pear/test/Config/Symfony/Component/Config/Tests/Definition/Dumper/XmlReferenceDumperTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Dumper;

use Symfony\Component\Config\Definition\Dumper\XmlReferenceDumper;
use Symfony\Component\Config\Tests\Fixtures\Configuration\ExampleConfiguration;

class XmlReferenceDumperTest extends \PHPUnit_Framework_TestCase
{
    public function testDumper()
    {
        $configuration = new ExampleConfiguration();

        $dumper = new XmlReferenceDumper();
        $this->assertEquals($this->getConfigurationAsString(), $dumper->dump($configuration));
    }

    public function testNamespaceDumper()
    {
        $configuration = new ExampleConfiguration();

        $dumper = new XmlReferenceDumper();
        $this->assertEquals(str_replace('http://example.org/schema/dic/acme_root', 'http://symfony.com/schema/dic/symfony', $this->getConfigurationAsString()), $dumper->dump($configuration, 'http://symfony.com/schema/dic/symfony'));
    }

    private function getConfigurationAsString()
    {
      return <<<EOL
<!-- Namespace: http://example.org/schema/dic/acme_root -->
<!-- scalar-required: Required -->
<!-- enum: One of "this"; "that" -->
<config
    boolean="true"
    scalar-empty=""
    scalar-null="null"
    scalar-true="true"
    scalar-false="false"
    scalar-default="default"
    scalar-array-empty=""
    scalar-array-defaults="elem1,elem2"
    scalar-required=""
    enum=""
>

    <!-- some info -->
    <!--
        child3: this is a long
                multi-line info text
                which should be indented;
                Example: example setting
    -->
    <array
        child1=""
        child2=""
        child3=""
    />

    <!-- prototype -->
    <parameter name="parameter name">scalar value</parameter>

    <!-- prototype -->
    <connection
        user=""
        pass=""
    />

</config>

EOL;
    }
}
PK�b�\����Npear/test/Config/Symfony/Component/Config/Tests/Definition/IntegerNodeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition;

use Symfony\Component\Config\Definition\IntegerNode;

class IntegerNodeTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getValidValues
     */
    public function testNormalize($value)
    {
        $node = new IntegerNode('test');
        $this->assertSame($value, $node->normalize($value));
    }

    public function getValidValues()
    {
        return array(
            array(1798),
            array(-678),
            array(0),
        );
    }

    /**
     * @dataProvider getInvalidValues
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidTypeException
     */
    public function testNormalizeThrowsExceptionOnInvalidValues($value)
    {
        $node = new IntegerNode('test');
        $node->normalize($value);
    }

    public function getInvalidValues()
    {
        return array(
            array(null),
            array(''),
            array('foo'),
            array(true),
            array(false),
            array(0.0),
            array(0.1),
            array(array()),
            array(array('foo' => 'bar')),
            array(new \stdClass()),
        );
    }
}
PK�b�\Ej~�jj`pear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/NumericNodeDefinitionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Builder;

use Symfony\Component\Config\Definition\Builder\IntegerNodeDefinition as NumericNodeDefinition;
use Symfony\Component\Config\Definition\Builder\IntegerNodeDefinition;
use Symfony\Component\Config\Definition\Builder\FloatNodeDefinition;

class NumericNodeDefinitionTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage You cannot define a min(4) as you already have a max(3)
     */
    public function testIncoherentMinAssertion()
    {
        $def = new NumericNodeDefinition('foo');
        $def->max(3)->min(4);
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage You cannot define a max(2) as you already have a min(3)
     */
    public function testIncoherentMaxAssertion()
    {
        $node = new NumericNodeDefinition('foo');
        $node->min(3)->max(2);
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
     * @expectedExceptionMessage The value 4 is too small for path "foo". Should be greater than or equal to 5
     */
    public function testIntegerMinAssertion()
    {
        $def = new IntegerNodeDefinition('foo');
        $def->min(5)->getNode()->finalize(4);
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
     * @expectedExceptionMessage The value 4 is too big for path "foo". Should be less than or equal to 3
     */
    public function testIntegerMaxAssertion()
    {
        $def = new IntegerNodeDefinition('foo');
        $def->max(3)->getNode()->finalize(4);
    }

    public function testIntegerValidMinMaxAssertion()
    {
        $def = new IntegerNodeDefinition('foo');
        $node = $def->min(3)->max(7)->getNode();
        $this->assertEquals(4, $node->finalize(4));
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
     * @expectedExceptionMessage The value 400 is too small for path "foo". Should be greater than or equal to 500
     */
    public function testFloatMinAssertion()
    {
        $def = new FloatNodeDefinition('foo');
        $def->min(5E2)->getNode()->finalize(4e2);
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
     * @expectedExceptionMessage The value 4.3 is too big for path "foo". Should be less than or equal to 0.3
     */
    public function testFloatMaxAssertion()
    {
        $def = new FloatNodeDefinition('foo');
        $def->max(0.3)->getNode()->finalize(4.3);
    }

    public function testFloatValidMinMaxAssertion()
    {
        $def = new FloatNodeDefinition('foo');
        $node = $def->min(3.0)->max(7e2)->getNode();
        $this->assertEquals(4.5, $node->finalize(4.5));
    }
}
PK�b�\
Kmޮ
�
Vpear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/NodeBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Builder;

use Symfony\Component\Config\Definition\Builder\NodeBuilder as BaseNodeBuilder;
use Symfony\Component\Config\Definition\Builder\VariableNodeDefinition as BaseVariableNodeDefinition;

class NodeBuilderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \RuntimeException
     */
    public function testThrowsAnExceptionWhenTryingToCreateANonRegisteredNodeType()
    {
        $builder = new BaseNodeBuilder();
        $builder->node('', 'foobar');
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testThrowsAnExceptionWhenTheNodeClassIsNotFound()
    {
        $builder = new BaseNodeBuilder();
        $builder
            ->setNodeClass('noclasstype', '\\foo\\bar\\noclass')
            ->node('', 'noclasstype');
    }

    public function testAddingANewNodeType()
    {
        $class = __NAMESPACE__.'\\SomeNodeDefinition';

        $builder = new BaseNodeBuilder();
        $node = $builder
            ->setNodeClass('newtype', $class)
            ->node('', 'newtype');

        $this->assertInstanceOf($class, $node);
    }

    public function testOverridingAnExistingNodeType()
    {
        $class = __NAMESPACE__.'\\SomeNodeDefinition';

        $builder = new BaseNodeBuilder();
        $node = $builder
            ->setNodeClass('variable', $class)
            ->node('', 'variable');

        $this->assertInstanceOf($class, $node);
    }

    public function testNodeTypesAreNotCaseSensitive()
    {
        $builder = new BaseNodeBuilder();

        $node1 = $builder->node('', 'VaRiAbLe');
        $node2 = $builder->node('', 'variable');

        $this->assertInstanceOf(get_class($node1), $node2);

        $builder->setNodeClass('CuStOm', __NAMESPACE__.'\\SomeNodeDefinition');

        $node1 = $builder->node('', 'CUSTOM');
        $node2 = $builder->node('', 'custom');

        $this->assertInstanceOf(get_class($node1), $node2);
    }

    public function testNumericNodeCreation()
    {
        $builder = new NodeBuilder();

        $node = $builder->integerNode('foo')->min(3)->max(5);
        $this->assertInstanceOf('Symfony\Component\Config\Definition\Builder\IntegerNodeDefinition', $node);

        $node = $builder->floatNode('bar')->min(3.0)->max(5.0);
        $this->assertInstanceOf('Symfony\Component\Config\Definition\Builder\FloatNodeDefinition', $node);
    }
}

class SomeNodeDefinition extends BaseVariableNodeDefinition
{
}
PK�b�\�-1��Vpear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/ExprBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Builder;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;

class ExprBuilderTest extends \PHPUnit_Framework_TestCase
{

    public function testAlwaysExpression()
    {
        $test = $this->getTestBuilder()
            ->always($this->returnClosure('new_value'))
        ->end();

        $this->assertFinalizedValueIs('new_value', $test);
    }

    public function testIfTrueExpression()
    {
        $test = $this->getTestBuilder()
            ->ifTrue()
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('new_value', $test, array('key'=>true));

        $test = $this->getTestBuilder()
            ->ifTrue( function ($v) { return true; })
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('new_value', $test);

        $test = $this->getTestBuilder()
            ->ifTrue( function ($v) { return false; })
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('value',$test);
    }

    public function testIfStringExpression()
    {
        $test = $this->getTestBuilder()
            ->ifString()
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('new_value', $test);

        $test = $this->getTestBuilder()
            ->ifString()
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs(45, $test, array('key'=>45));

    }

    public function testIfNullExpression()
    {
        $test = $this->getTestBuilder()
            ->ifNull()
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('new_value', $test, array('key'=>null));

        $test = $this->getTestBuilder()
            ->ifNull()
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('value', $test);
    }

    public function testIfArrayExpression()
    {
        $test = $this->getTestBuilder()
            ->ifArray()
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('new_value', $test, array('key'=>array()));

        $test = $this->getTestBuilder()
            ->ifArray()
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('value', $test);
    }

    public function testIfInArrayExpression()
    {
        $test = $this->getTestBuilder()
            ->ifInArray(array('foo', 'bar', 'value'))
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('new_value', $test);

        $test = $this->getTestBuilder()
            ->ifInArray(array('foo', 'bar'))
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('value', $test);
    }

    public function testIfNotInArrayExpression()
    {
        $test = $this->getTestBuilder()
            ->ifNotInArray(array('foo', 'bar'))
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('new_value', $test);

        $test = $this->getTestBuilder()
            ->ifNotInArray(array('foo', 'bar', 'value_from_config' ))
            ->then($this->returnClosure('new_value'))
        ->end();
        $this->assertFinalizedValueIs('new_value', $test);
    }

    public function testThenEmptyArrayExpression()
    {
        $test = $this->getTestBuilder()
            ->ifString()
            ->thenEmptyArray()
        ->end();
        $this->assertFinalizedValueIs(array(), $test);
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
     */
    public function testThenInvalid()
    {
        $test = $this->getTestBuilder()
            ->ifString()
            ->thenInvalid('Invalid value')
        ->end();
        $this->finalizeTestBuilder($test);
    }

    public function testThenUnsetExpression()
    {
        $test = $this->getTestBuilder()
            ->ifString()
            ->thenUnset()
        ->end();
        $this->assertEquals(array(), $this->finalizeTestBuilder($test));
    }

    /**
     * Create a test treebuilder with a variable node, and init the validation
     * @return TreeBuilder
     */
    protected function getTestBuilder()
    {
        $builder = new TreeBuilder();

        return $builder
            ->root('test')
            ->children()
            ->variableNode('key')
            ->validate()
       ;
    }

    /**
     * Close the validation process and finalize with the given config
     * @param TreeBuilder $testBuilder The tree builder to finalize
     * @param array       $config      The config you want to use for the finalization, if nothing provided
     *                       a simple array('key'=>'value') will be used
     * @return array The finalized config values
     */
    protected function finalizeTestBuilder($testBuilder, $config = null)
    {
        return $testBuilder
            ->end()
            ->end()
            ->end()
            ->buildTree()
            ->finalize($config === null ? array('key'=>'value') : $config)
        ;
    }

    /**
     * Return a closure that will return the given value
     * @param $val The value that the closure must return
     * @return Closure
     */
    protected function returnClosure($val)
    {
        return function ($v) use ($val) {
            return $val;
        };
    }

    /**
     * Assert that the given test builder, will return the given value
     *
     * @param mixed       $value       The value to test
     * @param TreeBuilder $treeBuilder The tree builder to finalize
     * @param mixed       $config      The config values that new to be finalized
     */
    protected function assertFinalizedValueIs($value, $treeBuilder, $config = null)
    {
        $this->assertEquals(array('key'=>$value), $this->finalizeTestBuilder($treeBuilder, $config));
    }
}
PK�b�\�����Vpear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/TreeBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Builder;

use Symfony\Component\Config\Tests\Definition\Builder\NodeBuilder as CustomNodeBuilder;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\Builder\NodeBuilder;

require __DIR__.'/../../Fixtures/Builder/NodeBuilder.php';
require __DIR__.'/../../Fixtures/Builder/BarNodeDefinition.php';
require __DIR__.'/../../Fixtures/Builder/VariableNodeDefinition.php';

class TreeBuilderTest extends \PHPUnit_Framework_TestCase
{
    public function testUsingACustomNodeBuilder()
    {
        $builder = new TreeBuilder();
        $root = $builder->root('custom', 'array', new CustomNodeBuilder());

        $nodeBuilder = $root->children();

        $this->assertInstanceOf('Symfony\Component\Config\Tests\Definition\Builder\NodeBuilder', $nodeBuilder);

        $nodeBuilder = $nodeBuilder->arrayNode('deeper')->children();

        $this->assertInstanceOf('Symfony\Component\Config\Tests\Definition\Builder\NodeBuilder', $nodeBuilder);
    }

    public function testOverrideABuiltInNodeType()
    {
        $builder = new TreeBuilder();
        $root = $builder->root('override', 'array', new CustomNodeBuilder());

        $definition = $root->children()->variableNode('variable');

        $this->assertInstanceOf('Symfony\Component\Config\Tests\Definition\Builder\VariableNodeDefinition', $definition);
    }

    public function testAddANodeType()
    {
        $builder = new TreeBuilder();
        $root = $builder->root('override', 'array', new CustomNodeBuilder());

        $definition = $root->children()->barNode('variable');

        $this->assertInstanceOf('Symfony\Component\Config\Tests\Definition\Builder\BarNodeDefinition', $definition);
    }

    public function testCreateABuiltInNodeTypeWithACustomNodeBuilder()
    {
        $builder = new TreeBuilder();
        $root = $builder->root('builtin', 'array', new CustomNodeBuilder());

        $definition = $root->children()->booleanNode('boolean');

        $this->assertInstanceOf('Symfony\Component\Config\Definition\Builder\BooleanNodeDefinition', $definition);
    }

    public function testPrototypedArrayNodeUseTheCustomNodeBuilder()
    {
        $builder = new TreeBuilder();
        $root = $builder->root('override', 'array', new CustomNodeBuilder());

        $root->prototype('bar')->end();
    }

    public function testAnExtendedNodeBuilderGetsPropagatedToTheChildren()
    {
        $builder = new TreeBuilder();

        $builder->root('propagation')
            ->children()
                ->setNodeClass('extended', 'Symfony\Component\Config\Tests\Definition\Builder\VariableNodeDefinition')
                ->node('foo', 'extended')->end()
                ->arrayNode('child')
                    ->children()
                        ->node('foo', 'extended')
                    ->end()
                ->end()
            ->end()
        ->end();
    }

    public function testDefinitionInfoGetsTransferredToNode()
    {
        $builder = new TreeBuilder();

        $builder->root('test')->info('root info')
            ->children()
                ->node('child', 'variable')->info('child info')->defaultValue('default')
            ->end()
        ->end();

        $tree = $builder->buildTree();
        $children = $tree->getChildren();

        $this->assertEquals('root info', $tree->getInfo());
        $this->assertEquals('child info', $children['child']->getInfo());
    }

    public function testDefinitionExampleGetsTransferredToNode()
    {
        $builder = new TreeBuilder();

        $builder->root('test')
            ->example(array('key' => 'value'))
            ->children()
                ->node('child', 'variable')->info('child info')->defaultValue('default')->example('example')
            ->end()
        ->end();

        $tree = $builder->buildTree();
        $children = $tree->getChildren();

        $this->assertTrue(is_array($tree->getExample()));
        $this->assertEquals('example', $children['child']->getExample());
    }
}
PK�b�\<�C��]pear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/EnumNodeDefinitionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Builder;

use Symfony\Component\Config\Definition\Builder\EnumNodeDefinition;

class EnumNodeDefinitionTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage ->values() must be called with at least two distinct values.
     */
    public function testNoDistinctValues()
    {
        $def = new EnumNodeDefinition('foo');
        $def->values(array('foo', 'foo'));
    }

    /**
     * @expectedException \RuntimeException
     * @expectedExceptionMessage You must call ->values() on enum nodes.
     */
    public function testNoValuesPassed()
    {
        $def = new EnumNodeDefinition('foo');
        $def->getNode();
    }

    public function testGetNode()
    {
        $def = new EnumNodeDefinition('foo');
        $def->values(array('foo', 'bar'));

        $node = $def->getNode();
        $this->assertEquals(array('foo', 'bar'), $node->getValues());
    }
}
PK�b�\wX��^pear/test/Config/Symfony/Component/Config/Tests/Definition/Builder/ArrayNodeDefinitionTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Builder;

use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition;
use Symfony\Component\Config\Definition\Exception\InvalidDefinitionException;

class ArrayNodeDefinitionTest extends \PHPUnit_Framework_TestCase
{
    public function testAppendingSomeNode()
    {
        $parent = new ArrayNodeDefinition('root');
        $child = new ScalarNodeDefinition('child');

        $parent
            ->children()
                ->scalarNode('foo')->end()
                ->scalarNode('bar')->end()
            ->end()
            ->append($child);

        $this->assertCount(3, $this->getField($parent, 'children'));
        $this->assertTrue(in_array($child, $this->getField($parent, 'children')));
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidDefinitionException
     * @dataProvider providePrototypeNodeSpecificCalls
     */
    public function testPrototypeNodeSpecificOption($method, $args)
    {
        $node = new ArrayNodeDefinition('root');

        call_user_func_array(array($node, $method), $args);

        $node->getNode();
    }

    public function providePrototypeNodeSpecificCalls()
    {
        return array(
            array('defaultValue', array(array())),
            array('addDefaultChildrenIfNoneSet', array()),
            array('requiresAtLeastOneElement', array()),
            array('useAttributeAsKey', array('foo'))
        );
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidDefinitionException
     */
    public function testConcreteNodeSpecificOption()
    {
        $node = new ArrayNodeDefinition('root');
        $node
            ->addDefaultsIfNotSet()
            ->prototype('array')
        ;
        $node->getNode();
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidDefinitionException
     */
    public function testPrototypeNodesCantHaveADefaultValueWhenUsingDefaultChildren()
    {
        $node = new ArrayNodeDefinition('root');
        $node
            ->defaultValue(array())
            ->addDefaultChildrenIfNoneSet('foo')
            ->prototype('array')
        ;
        $node->getNode();
    }

    public function testPrototypedArrayNodeDefaultWhenUsingDefaultChildren()
    {
        $node = new ArrayNodeDefinition('root');
        $node
            ->addDefaultChildrenIfNoneSet()
            ->prototype('array')
        ;
        $tree = $node->getNode();
        $this->assertEquals(array(array()), $tree->getDefaultValue());
    }

    /**
     * @dataProvider providePrototypedArrayNodeDefaults
     */
    public function testPrototypedArrayNodeDefault($args, $shouldThrowWhenUsingAttrAsKey, $shouldThrowWhenNotUsingAttrAsKey, $defaults)
    {
        $node = new ArrayNodeDefinition('root');
        $node
            ->addDefaultChildrenIfNoneSet($args)
            ->prototype('array')
        ;

        try {
            $tree = $node->getNode();
            $this->assertFalse($shouldThrowWhenNotUsingAttrAsKey);
            $this->assertEquals($defaults, $tree->getDefaultValue());
        } catch (InvalidDefinitionException $e) {
            $this->assertTrue($shouldThrowWhenNotUsingAttrAsKey);
        }

        $node = new ArrayNodeDefinition('root');
        $node
            ->useAttributeAsKey('attr')
            ->addDefaultChildrenIfNoneSet($args)
            ->prototype('array')
        ;

        try {
            $tree = $node->getNode();
            $this->assertFalse($shouldThrowWhenUsingAttrAsKey);
            $this->assertEquals($defaults, $tree->getDefaultValue());
        } catch (InvalidDefinitionException $e) {
            $this->assertTrue($shouldThrowWhenUsingAttrAsKey);
        }
    }

    public function providePrototypedArrayNodeDefaults()
    {
        return array(
            array(null, true, false, array(array())),
            array(2, true, false, array(array(), array())),
            array('2', false, true, array('2' => array())),
            array('foo', false, true, array('foo' => array())),
            array(array('foo'), false, true, array('foo' => array())),
            array(array('foo', 'bar'), false, true, array('foo' => array(), 'bar' => array())),
        );
    }

    public function testNestedPrototypedArrayNodes()
    {
        $node = new ArrayNodeDefinition('root');
        $node
            ->addDefaultChildrenIfNoneSet()
            ->prototype('array')
                  ->prototype('array')
        ;
        $node->getNode();
    }

    public function testEnabledNodeDefaults()
    {
        $node = new ArrayNodeDefinition('root');
        $node
            ->canBeEnabled()
            ->children()
                ->scalarNode('foo')->defaultValue('bar')->end()
        ;

        $this->assertEquals(array('enabled' => false, 'foo' => 'bar'), $node->getNode()->getDefaultValue());
    }

    /**
     * @dataProvider getEnableableNodeFixtures
     */
    public function testTrueEnableEnabledNode($expected, $config, $message)
    {
        $processor = new Processor();
        $node = new ArrayNodeDefinition('root');
        $node
            ->canBeEnabled()
            ->children()
                ->scalarNode('foo')->defaultValue('bar')->end()
        ;

        $this->assertEquals(
            $expected,
            $processor->process($node->getNode(), $config),
            $message
        );
    }

    public function getEnableableNodeFixtures()
    {
        return array(
            array(array('enabled' => true, 'foo' => 'bar'), array(true), 'true enables an enableable node'),
            array(array('enabled' => true, 'foo' => 'bar'), array(null), 'null enables an enableable node'),
            array(array('enabled' => true, 'foo' => 'bar'), array(array('enabled' => true)), 'An enableable node can be enabled'),
            array(array('enabled' => true, 'foo' => 'baz'), array(array('foo' => 'baz')), 'any configuration enables an enableable node'),
            array(array('enabled' => false, 'foo' => 'baz'), array(array('foo' => 'baz', 'enabled' => false)), 'An enableable node can be disabled'),
            array(array('enabled' => false, 'foo' => 'bar'), array(false), 'false disables an enableable node'),
        );
    }

    protected function getField($object, $field)
    {
        $reflection = new \ReflectionProperty($object, $field);
        $reflection->setAccessible(true);

        return $reflection->getValue($object);
    }
}
PK�b�\D�99Hpear/test/Config/Symfony/Component/Config/Tests/Definition/MergeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;

class MergeTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\ForbiddenOverwriteException
     */
    public function testForbiddenOverwrite()
    {
        $tb = new TreeBuilder();
        $tree = $tb
            ->root('root', 'array')
                ->children()
                    ->node('foo', 'scalar')
                        ->cannotBeOverwritten()
                    ->end()
                ->end()
            ->end()
            ->buildTree()
        ;

        $a = array(
            'foo' => 'bar',
        );

        $b = array(
            'foo' => 'moo',
        );

        $tree->merge($a, $b);
    }

    public function testUnsetKey()
    {
        $tb = new TreeBuilder();
        $tree = $tb
            ->root('root', 'array')
                ->children()
                    ->node('foo', 'scalar')->end()
                    ->node('bar', 'scalar')->end()
                    ->node('unsettable', 'array')
                        ->canBeUnset()
                        ->children()
                            ->node('foo', 'scalar')->end()
                            ->node('bar', 'scalar')->end()
                        ->end()
                    ->end()
                    ->node('unsetted', 'array')
                        ->canBeUnset()
                        ->prototype('scalar')->end()
                    ->end()
                ->end()
            ->end()
            ->buildTree()
        ;

        $a = array(
            'foo' => 'bar',
            'unsettable' => array(
                'foo' => 'a',
                'bar' => 'b',
            ),
            'unsetted' => false,
        );

        $b = array(
            'foo' => 'moo',
            'bar' => 'b',
            'unsettable' => false,
            'unsetted' => array('a', 'b'),
        );

        $this->assertEquals(array(
            'foo' => 'moo',
            'bar' => 'b',
            'unsettable' => false,
            'unsetted' => array('a', 'b'),
        ), $tree->merge($a, $b));
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
     */
    public function testDoesNotAllowNewKeysInSubsequentConfigs()
    {
        $tb = new TreeBuilder();
        $tree = $tb
            ->root('config', 'array')
                ->children()
                    ->node('test', 'array')
                        ->disallowNewKeysInSubsequentConfigs()
                        ->useAttributeAsKey('key')
                        ->prototype('array')
                            ->children()
                                ->node('value', 'scalar')->end()
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
            ->buildTree();

        $a = array(
            'test' => array(
                'a' => array('value' => 'foo')
            )
        );

        $b = array(
            'test' => array(
                'b' => array('value' => 'foo')
            )
        );

        $tree->merge($a, $b);
    }

    public function testPerformsNoDeepMerging()
    {
        $tb = new TreeBuilder();

        $tree = $tb
            ->root('config', 'array')
                ->children()
                    ->node('no_deep_merging', 'array')
                        ->performNoDeepMerging()
                        ->children()
                            ->node('foo', 'scalar')->end()
                            ->node('bar', 'scalar')->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
            ->buildTree()
        ;

        $a = array(
            'no_deep_merging' => array(
                'foo' => 'a',
                'bar' => 'b',
            ),
        );

        $b = array(
            'no_deep_merging' => array(
                'c' => 'd',
            )
        );

        $this->assertEquals(array(
            'no_deep_merging' => array(
                'c' => 'd',
            )
        ), $tree->merge($a, $b));
    }

    public function testPrototypeWithoutAKeyAttribute()
    {
        $tb = new TreeBuilder();

        $tree = $tb
            ->root('config', 'array')
                ->children()
                    ->arrayNode('append_elements')
                        ->prototype('scalar')->end()
                    ->end()
                ->end()
            ->end()
            ->buildTree()
        ;

        $a = array(
            'append_elements' => array('a', 'b'),
        );

        $b = array(
            'append_elements' => array('c', 'd'),
        );

        $this->assertEquals(array('append_elements' => array('a', 'b', 'c', 'd')), $tree->merge($a, $b));
    }
}
PK�b�\&]��Lpear/test/Config/Symfony/Component/Config/Tests/Definition/FloatNodeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition;

use Symfony\Component\Config\Definition\FloatNode;

class FloatNodeTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getValidValues
     */
    public function testNormalize($value)
    {
        $node = new FloatNode('test');
        $this->assertSame($value, $node->normalize($value));
    }

    public function getValidValues()
    {
        return array(
            array(1798.0),
            array(-678.987),
            array(12.56E45),
            array(0.0),
            // Integer are accepted too, they will be cast
            array(17),
            array(-10),
            array(0)
        );
    }

    /**
     * @dataProvider getInvalidValues
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidTypeException
     */
    public function testNormalizeThrowsExceptionOnInvalidValues($value)
    {
        $node = new FloatNode('test');
        $node->normalize($value);
    }

    public function getInvalidValues()
    {
        return array(
            array(null),
            array(''),
            array('foo'),
            array(true),
            array(false),
            array(array()),
            array(array('foo' => 'bar')),
            array(new \stdClass()),
        );
    }
}
PK�b�\hͼ��Ppear/test/Config/Symfony/Component/Config/Tests/Definition/NormalizationTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition;

use Symfony\Component\Config\Definition\NodeInterface;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;

class NormalizationTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getEncoderTests
     */
    public function testNormalizeEncoders($denormalized)
    {
        $tb = new TreeBuilder();
        $tree = $tb
            ->root('root_name', 'array')
                ->fixXmlConfig('encoder')
                ->children()
                    ->node('encoders', 'array')
                        ->useAttributeAsKey('class')
                        ->prototype('array')
                            ->beforeNormalization()->ifString()->then(function ($v) { return array('algorithm' => $v); })->end()
                            ->children()
                                ->node('algorithm', 'scalar')->end()
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
            ->buildTree()
        ;

        $normalized = array(
            'encoders' => array(
                'foo' => array('algorithm' => 'plaintext'),
            ),
        );

        $this->assertNormalized($tree, $denormalized, $normalized);
    }

    public function getEncoderTests()
    {
        $configs = array();

        // XML
        $configs[] = array(
            'encoder' => array(
                array('class' => 'foo', 'algorithm' => 'plaintext'),
            ),
        );

        // XML when only one element of this type
        $configs[] = array(
            'encoder' => array('class' => 'foo', 'algorithm' => 'plaintext'),
        );

        // YAML/PHP
        $configs[] = array(
            'encoders' => array(
                array('class' => 'foo', 'algorithm' => 'plaintext'),
            ),
        );

        // YAML/PHP
        $configs[] = array(
            'encoders' => array(
                'foo' => 'plaintext',
            ),
        );

        // YAML/PHP
        $configs[] = array(
            'encoders' => array(
                'foo' => array('algorithm' => 'plaintext'),
            ),
        );

        return array_map(function ($v) {
            return array($v);
        }, $configs);
    }

    /**
     * @dataProvider getAnonymousKeysTests
     */
    public function testAnonymousKeysArray($denormalized)
    {
        $tb = new TreeBuilder();
        $tree = $tb
            ->root('root', 'array')
                ->children()
                    ->node('logout', 'array')
                        ->fixXmlConfig('handler')
                        ->children()
                            ->node('handlers', 'array')
                                ->prototype('scalar')->end()
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
            ->buildTree()
        ;

        $normalized = array('logout' => array('handlers' => array('a', 'b', 'c')));

        $this->assertNormalized($tree, $denormalized, $normalized);
    }

    public function getAnonymousKeysTests()
    {
        $configs = array();

        $configs[] = array(
            'logout' => array(
                'handlers' => array('a', 'b', 'c'),
            ),
        );

        $configs[] = array(
            'logout' => array(
                'handler' => array('a', 'b', 'c'),
            ),
        );

        return array_map(function ($v) { return array($v); }, $configs);
    }

    /**
     * @dataProvider getNumericKeysTests
     */
    public function testNumericKeysAsAttributes($denormalized)
    {
        $normalized = array(
            'thing' => array(42 => array('foo', 'bar'), 1337 => array('baz', 'qux')),
        );

        $this->assertNormalized($this->getNumericKeysTestTree(), $denormalized, $normalized);
    }

    public function getNumericKeysTests()
    {
        $configs = array();

        $configs[] = array(
            'thing' => array(
                42 => array('foo', 'bar'), 1337 => array('baz', 'qux'),
            ),
        );

        $configs[] = array(
            'thing' => array(
                array('foo', 'bar', 'id' => 42), array('baz', 'qux', 'id' => 1337),
            ),
        );

        return array_map(function ($v) { return array($v); }, $configs);
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
     * @expectedExceptionMessage The attribute "id" must be set for path "root.thing".
     */
    public function testNonAssociativeArrayThrowsExceptionIfAttributeNotSet()
    {
        $denormalized = array(
            'thing' => array(
                array('foo', 'bar'), array('baz', 'qux')
            )
        );

        $this->assertNormalized($this->getNumericKeysTestTree(), $denormalized, array());
    }

    public function testAssociativeArrayPreserveKeys()
    {
        $tb = new TreeBuilder();
        $tree = $tb
            ->root('root', 'array')
                ->prototype('array')
                    ->children()
                        ->node('foo', 'scalar')->end()
                    ->end()
                ->end()
            ->end()
            ->buildTree()
        ;

        $data = array('first' => array('foo' => 'bar'));

        $this->assertNormalized($tree, $data, $data);
    }

    public static function assertNormalized(NodeInterface $tree, $denormalized, $normalized)
    {
        self::assertSame($normalized, $tree->normalize($denormalized));
    }

    private function getNumericKeysTestTree()
    {
        $tb = new TreeBuilder();
        $tree = $tb
            ->root('root', 'array')
                ->children()
                    ->node('thing', 'array')
                        ->useAttributeAsKey('id')
                        ->prototype('array')
                            ->prototype('scalar')->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
            ->buildTree()
        ;

        return $tree;
    }
}
PK�b�\�iH���Kpear/test/Config/Symfony/Component/Config/Tests/Definition/EnumNodeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition;

use Symfony\Component\Config\Definition\EnumNode;

class EnumNodeTest extends \PHPUnit_Framework_TestCase
{
    public function testFinalizeValue()
    {
        $node = new EnumNode('foo', null, array('foo', 'bar'));
        $this->assertSame('foo', $node->finalize('foo'));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testConstructionWithOneValue()
    {
        new EnumNode('foo', null, array('foo', 'foo'));
    }

    /**
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
     * @expectedExceptionMessage The value "foobar" is not allowed for path "foo". Permissible values: "foo", "bar"
     */
    public function testFinalizeWithInvalidValue()
    {
        $node = new EnumNode('foo', null, array('foo', 'bar'));
        $node->finalize('foobar');
    }
}
PK�b�\{���Npear/test/Config/Symfony/Component/Config/Tests/Definition/BooleanNodeTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition;

use Symfony\Component\Config\Definition\BooleanNode;

class BooleanNodeTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getValidValues
     */
    public function testNormalize($value)
    {
        $node = new BooleanNode('test');
        $this->assertSame($value, $node->normalize($value));
    }

    public function getValidValues()
    {
        return array(
            array(false),
            array(true),
        );
    }

    /**
     * @dataProvider getInvalidValues
     * @expectedException \Symfony\Component\Config\Definition\Exception\InvalidTypeException
     */
    public function testNormalizeThrowsExceptionOnInvalidValues($value)
    {
        $node = new BooleanNode('test');
        $node->normalize($value);
    }

    public function getInvalidValues()
    {
        return array(
            array(null),
            array(''),
            array('foo'),
            array(0),
            array(1),
            array(0.0),
            array(0.1),
            array(array()),
            array(array('foo' => 'bar')),
            array(new \stdClass()),
        );
    }
}
PK�b�\�YMpear/test/Config/Symfony/Component/Config/Tests/Loader/LoaderResolverTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Loader;

use Symfony\Component\Config\Loader\LoaderResolver;

class LoaderResolverTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\Config\Loader\LoaderResolver::__construct
     */
    public function testConstructor()
    {
        $resolver = new LoaderResolver(array(
            $loader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface'),
        ));

        $this->assertEquals(array($loader), $resolver->getLoaders(), '__construct() takes an array of loaders as its first argument');
    }

    /**
     * @covers Symfony\Component\Config\Loader\LoaderResolver::resolve
     */
    public function testResolve()
    {
        $loader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface');
        $resolver = new LoaderResolver(array($loader));
        $this->assertFalse($resolver->resolve('foo.foo'), '->resolve() returns false if no loader is able to load the resource');

        $loader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface');
        $loader->expects($this->once())->method('supports')->will($this->returnValue(true));
        $resolver = new LoaderResolver(array($loader));
        $this->assertEquals($loader, $resolver->resolve(function () {}), '->resolve() returns the loader for the given resource');
    }

    /**
     * @covers Symfony\Component\Config\Loader\LoaderResolver::getLoaders
     * @covers Symfony\Component\Config\Loader\LoaderResolver::addLoader
     */
    public function testLoaders()
    {
        $resolver = new LoaderResolver();
        $resolver->addLoader($loader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface'));

        $this->assertEquals(array($loader), $resolver->getLoaders(), 'addLoader() adds a loader');
    }
}
PK�b�\oq*,��Opear/test/Config/Symfony/Component/Config/Tests/Loader/DelegatingLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Loader;

use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Config\Loader\DelegatingLoader;

class DelegatingLoaderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\Config\Loader\DelegatingLoader::__construct
     */
    public function testConstructor()
    {
        $loader = new DelegatingLoader($resolver = new LoaderResolver());
        $this->assertTrue(true, '__construct() takes a loader resolver as its first argument');
    }

    /**
     * @covers Symfony\Component\Config\Loader\DelegatingLoader::getResolver
     * @covers Symfony\Component\Config\Loader\DelegatingLoader::setResolver
     */
    public function testGetSetResolver()
    {
        $resolver = new LoaderResolver();
        $loader = new DelegatingLoader($resolver);
        $this->assertSame($resolver, $loader->getResolver(), '->getResolver() gets the resolver loader');
        $loader->setResolver($resolver = new LoaderResolver());
        $this->assertSame($resolver, $loader->getResolver(), '->setResolver() sets the resolver loader');
    }

    /**
     * @covers Symfony\Component\Config\Loader\DelegatingLoader::supports
     */
    public function testSupports()
    {
        $loader1 = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface');
        $loader1->expects($this->once())->method('supports')->will($this->returnValue(true));
        $loader = new DelegatingLoader(new LoaderResolver(array($loader1)));
        $this->assertTrue($loader->supports('foo.xml'), '->supports() returns true if the resource is loadable');

        $loader1 = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface');
        $loader1->expects($this->once())->method('supports')->will($this->returnValue(false));
        $loader = new DelegatingLoader(new LoaderResolver(array($loader1)));
        $this->assertFalse($loader->supports('foo.foo'), '->supports() returns false if the resource is not loadable');
    }

    /**
     * @covers Symfony\Component\Config\Loader\DelegatingLoader::load
     */
    public function testLoad()
    {
        $loader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface');
        $loader->expects($this->once())->method('supports')->will($this->returnValue(true));
        $loader->expects($this->once())->method('load');
        $resolver = new LoaderResolver(array($loader));
        $loader = new DelegatingLoader($resolver);

        $loader->load('foo');
    }

    /**
     * @expectedException \Symfony\Component\Config\Exception\FileLoaderLoadException
     */
    public function testLoadThrowsAnExceptionIfTheResourceCannotBeLoaded()
    {
        $loader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface');
        $loader->expects($this->once())->method('supports')->will($this->returnValue(false));
        $resolver = new LoaderResolver(array($loader));
        $loader = new DelegatingLoader($resolver);

        $loader->load('foo');
    }
}
PK�b�\L��{Ipear/test/Config/Symfony/Component/Config/Tests/Loader/FileLoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Loader;

use Symfony\Component\Config\Loader\FileLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceException;

class FileLoaderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\Config\Loader\FileLoader
     */
    public function testImportWithFileLocatorDelegation()
    {
        $locatorMock = $this->getMock('Symfony\Component\Config\FileLocatorInterface');

        $locatorMockForAdditionalLoader = $this->getMock('Symfony\Component\Config\FileLocatorInterface');
        $locatorMockForAdditionalLoader->expects($this->any())->method('locate')->will($this->onConsecutiveCalls(
                array('path/to/file1'),                    // Default
                array('path/to/file1', 'path/to/file2'),   // First is imported
                array('path/to/file1', 'path/to/file2'),   // Second is imported
                array('path/to/file1'),                    // Exception
                array('path/to/file1', 'path/to/file2')    // Exception
                ));

        $fileLoader = new TestFileLoader($locatorMock);
        $fileLoader->setSupports(false);
        $fileLoader->setCurrentDir('.');

        $additionalLoader = new TestFileLoader($locatorMockForAdditionalLoader);
        $additionalLoader->setCurrentDir('.');

        $fileLoader->setResolver($loaderResolver = new LoaderResolver(array($fileLoader, $additionalLoader)));

        // Default case
        $this->assertSame('path/to/file1', $fileLoader->import('my_resource'));

        // Check first file is imported if not already loading
        $this->assertSame('path/to/file1', $fileLoader->import('my_resource'));

        // Check second file is imported if first is already loading
        $fileLoader->addLoading('path/to/file1');
        $this->assertSame('path/to/file2', $fileLoader->import('my_resource'));

        // Check exception throws if first (and only available) file is already loading
        try {
            $fileLoader->import('my_resource');
            $this->fail('->import() throws a FileLoaderImportCircularReferenceException if the resource is already loading');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceException', $e, '->import() throws a FileLoaderImportCircularReferenceException if the resource is already loading');
        }

        // Check exception throws if all files are already loading
        try {
            $fileLoader->addLoading('path/to/file2');
            $fileLoader->import('my_resource');
            $this->fail('->import() throws a FileLoaderImportCircularReferenceException if the resource is already loading');
        } catch (\Exception $e) {
            $this->assertInstanceOf('Symfony\Component\Config\Exception\FileLoaderImportCircularReferenceException', $e, '->import() throws a FileLoaderImportCircularReferenceException if the resource is already loading');
        }
    }
}

class TestFileLoader extends FileLoader
{
    private $supports = true;

    public function load($resource, $type = null)
    {
        return $resource;
    }

    public function supports($resource, $type = null)
    {
        return $this->supports;
    }

    public function addLoading($resource)
    {
        self::$loading[$resource] = true;
    }

    public function removeLoading($resource)
    {
        unset(self::$loading[$resource]);
    }

    public function clearLoading()
    {
        self::$loading = array();
    }

    public function setSupports($supports)
    {
        $this->supports = $supports;
    }
}
PK�b�\5bc�@@Epear/test/Config/Symfony/Component/Config/Tests/Loader/LoaderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Loader;

use Symfony\Component\Config\Loader\Loader;

class LoaderTest extends \PHPUnit_Framework_TestCase
{
    public function testGetSetResolver()
    {
        $resolver = $this->getMock('Symfony\Component\Config\Loader\LoaderResolverInterface');

        $loader = new ProjectLoader1();
        $loader->setResolver($resolver);

        $this->assertSame($resolver, $loader->getResolver(), '->setResolver() sets the resolver loader');
    }

    public function testResolve()
    {
        $resolvedLoader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface');

        $resolver = $this->getMock('Symfony\Component\Config\Loader\LoaderResolverInterface');
        $resolver->expects($this->once())
            ->method('resolve')
            ->with('foo.xml')
            ->will($this->returnValue($resolvedLoader));

        $loader = new ProjectLoader1();
        $loader->setResolver($resolver);

        $this->assertSame($loader, $loader->resolve('foo.foo'), '->resolve() finds a loader');
        $this->assertSame($resolvedLoader, $loader->resolve('foo.xml'), '->resolve() finds a loader');
    }

    /**
     * @expectedException \Symfony\Component\Config\Exception\FileLoaderLoadException
     */
    public function testResolveWhenResolverCannotFindLoader()
    {
        $resolver = $this->getMock('Symfony\Component\Config\Loader\LoaderResolverInterface');
        $resolver->expects($this->once())
            ->method('resolve')
            ->with('FOOBAR')
            ->will($this->returnValue(false));

        $loader = new ProjectLoader1();
        $loader->setResolver($resolver);

        $loader->resolve('FOOBAR');
    }

    public function testImport()
    {
        $resolvedLoader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface');
        $resolvedLoader->expects($this->once())
            ->method('load')
            ->with('foo')
            ->will($this->returnValue('yes'));

        $resolver = $this->getMock('Symfony\Component\Config\Loader\LoaderResolverInterface');
        $resolver->expects($this->once())
            ->method('resolve')
            ->with('foo')
            ->will($this->returnValue($resolvedLoader));

        $loader = new ProjectLoader1();
        $loader->setResolver($resolver);

        $this->assertEquals('yes', $loader->import('foo'));
    }

    public function testImportWithType()
    {
        $resolvedLoader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface');
        $resolvedLoader->expects($this->once())
            ->method('load')
            ->with('foo', 'bar')
            ->will($this->returnValue('yes'));

        $resolver = $this->getMock('Symfony\Component\Config\Loader\LoaderResolverInterface');
        $resolver->expects($this->once())
            ->method('resolve')
            ->with('foo', 'bar')
            ->will($this->returnValue($resolvedLoader));

        $loader = new ProjectLoader1();
        $loader->setResolver($resolver);

        $this->assertEquals('yes', $loader->import('foo', 'bar'));
    }
}

class ProjectLoader1 extends Loader
{
    public function load($resource, $type = null)
    {
    }

    public function supports($resource, $type = null)
    {
        return is_string($resource) && 'foo' === pathinfo($resource, PATHINFO_EXTENSION);
    }

    public function getType()
    {
    }
}
PK�b�\c=���Opear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util/document_type.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE scan [<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource={{ resource }}">]>
<scan></scan>
PK�b�\Gɩ�SSPpear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util/invalid_schema.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<root2 xmlns="http://example.com/schema" />
PK�b�\�b�..Ipear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util/invalid.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<root>
PK�b�\�&�Hpear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util/schema.xsdnu�[���<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns="http://example.com/schema"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://example.com/schema"
    elementFormDefault="qualified">

  <xsd:element name="root" />
</xsd:schema>
PK�b�\\�XXGpear/test/Config/Symfony/Component/Config/Tests/Fixtures/Util/valid.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://example.com/schema">
</root>
PK�b�\�����
�
_pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Configuration/ExampleConfiguration.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Fixtures\Configuration;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class ExampleConfiguration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('acme_root');

        $rootNode
            ->fixXmlConfig('parameter')
            ->fixXmlConfig('connection')
            ->children()
                ->booleanNode('boolean')->defaultTrue()->end()
                ->scalarNode('scalar_empty')->end()
                ->scalarNode('scalar_null')->defaultNull()->end()
                ->scalarNode('scalar_true')->defaultTrue()->end()
                ->scalarNode('scalar_false')->defaultFalse()->end()
                ->scalarNode('scalar_default')->defaultValue('default')->end()
                ->scalarNode('scalar_array_empty')->defaultValue(array())->end()
                ->scalarNode('scalar_array_defaults')->defaultValue(array('elem1', 'elem2'))->end()
                ->scalarNode('scalar_required')->isRequired()->end()
                ->enumNode('enum')->values(array('this', 'that'))->end()
                ->arrayNode('array')
                    ->info('some info')
                    ->canBeUnset()
                    ->children()
                        ->scalarNode('child1')->end()
                        ->scalarNode('child2')->end()
                        ->scalarNode('child3')
                            ->info(
                                "this is a long\n".
                                "multi-line info text\n".
                                "which should be indented"
                            )
                            ->example('example setting')
                        ->end()
                    ->end()
                ->end()
                ->arrayNode('parameters')
                    ->useAttributeAsKey('name')
                    ->prototype('scalar')->end()
                ->end()
                ->arrayNode('connections')
                    ->prototype('array')
                        ->children()
                            ->scalarNode('user')->end()
                            ->scalarNode('pass')->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
        ;

        return $treeBuilder;
    }
}
PK�b�\Fpear/test/Config/Symfony/Component/Config/Tests/Fixtures/Again/foo.xmlnu�[���PK�b�\@pear/test/Config/Symfony/Component/Config/Tests/Fixtures/foo.xmlnu�[���PK�b�\�r_���Vpear/test/Config/Symfony/Component/Config/Tests/Fixtures/Builder/BarNodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Builder;

use Symfony\Component\Config\Definition\Builder\NodeDefinition;

class BarNodeDefinition extends NodeDefinition
{
    protected function createNode()
    {
    }
}
PK�b�\��@��[pear/test/Config/Symfony/Component/Config/Tests/Fixtures/Builder/VariableNodeDefinition.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Builder;

use Symfony\Component\Config\Definition\Builder\VariableNodeDefinition as BaseVariableNodeDefinition;

class VariableNodeDefinition extends BaseVariableNodeDefinition
{
}
PK�b�\�u�;ssPpear/test/Config/Symfony/Component/Config/Tests/Fixtures/Builder/NodeBuilder.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests\Definition\Builder;

use Symfony\Component\Config\Definition\Builder\NodeBuilder as BaseNodeBuilder;

class NodeBuilder extends BaseNodeBuilder
{
    public function barNode($name)
    {
        return $this->node($name, 'bar');
    }

    protected function getNodeClass($type)
    {
        switch ($type) {
            case 'variable':
                return __NAMESPACE__.'\\'.ucfirst($type).'NodeDefinition';
            case 'bar':
                return __NAMESPACE__.'\\'.ucfirst($type).'NodeDefinition';
            default:
                return parent::getNodeClass($type);
        }
    }
}
PK�b�\K�OCCCpear/test/Config/Symfony/Component/Config/Tests/FileLocatorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests;

use Symfony\Component\Config\FileLocator;

class FileLocatorTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getIsAbsolutePathTests
     */
    public function testIsAbsolutePath($path)
    {
        $loader = new FileLocator(array());
        $r = new \ReflectionObject($loader);
        $m = $r->getMethod('isAbsolutePath');
        $m->setAccessible(true);

        $this->assertTrue($m->invoke($loader, $path), '->isAbsolutePath() returns true for an absolute path');
    }

    public function getIsAbsolutePathTests()
    {
        return array(
            array('/foo.xml'),
            array('c:\\\\foo.xml'),
            array('c:/foo.xml'),
            array('\\server\\foo.xml'),
            array('https://server/foo.xml'),
            array('phar://server/foo.xml'),
        );
    }

    public function testLocate()
    {
        $loader = new FileLocator(__DIR__.'/Fixtures');

        $this->assertEquals(
            __DIR__.DIRECTORY_SEPARATOR.'FileLocatorTest.php',
            $loader->locate('FileLocatorTest.php', __DIR__),
            '->locate() returns the absolute filename if the file exists in the given path'
        );

        $this->assertEquals(
            __DIR__.'/Fixtures'.DIRECTORY_SEPARATOR.'foo.xml',
            $loader->locate('foo.xml', __DIR__),
            '->locate() returns the absolute filename if the file exists in one of the paths given in the constructor'
        );

        $this->assertEquals(
            __DIR__.'/Fixtures'.DIRECTORY_SEPARATOR.'foo.xml',
            $loader->locate(__DIR__.'/Fixtures'.DIRECTORY_SEPARATOR.'foo.xml', __DIR__),
            '->locate() returns the absolute filename if the file exists in one of the paths given in the constructor'
        );

        $loader = new FileLocator(array(__DIR__.'/Fixtures', __DIR__.'/Fixtures/Again'));

        $this->assertEquals(
            array(__DIR__.'/Fixtures'.DIRECTORY_SEPARATOR.'foo.xml', __DIR__.'/Fixtures/Again'.DIRECTORY_SEPARATOR.'foo.xml'),
            $loader->locate('foo.xml', __DIR__, false),
            '->locate() returns an array of absolute filenames'
        );

        $this->assertEquals(
            array(__DIR__.'/Fixtures'.DIRECTORY_SEPARATOR.'foo.xml', __DIR__.'/Fixtures/Again'.DIRECTORY_SEPARATOR.'foo.xml'),
            $loader->locate('foo.xml', __DIR__.'/Fixtures', false),
            '->locate() returns an array of absolute filenames'
        );

        $loader = new FileLocator(__DIR__.'/Fixtures/Again');

        $this->assertEquals(
            array(__DIR__.'/Fixtures'.DIRECTORY_SEPARATOR.'foo.xml', __DIR__.'/Fixtures/Again'.DIRECTORY_SEPARATOR.'foo.xml'),
            $loader->locate('foo.xml', __DIR__.'/Fixtures', false),
            '->locate() returns an array of absolute filenames'
        );
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testLocateThrowsAnExceptionIfTheFileDoesNotExists()
    {
        $loader = new FileLocator(array(__DIR__.'/Fixtures'));

        $loader->locate('foobar.xml', __DIR__);
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testLocateThrowsAnExceptionIfTheFileDoesNotExistsInAbsolutePath()
    {
        $loader = new FileLocator(array(__DIR__.'/Fixtures'));

        $loader->locate(__DIR__.'/Fixtures/foobar.xml', __DIR__);
    }
}
PK�b�\ Z��^^Cpear/test/Config/Symfony/Component/Config/Tests/ConfigCacheTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Config\Tests;

use Symfony\Component\Config\ConfigCache;
use Symfony\Component\Config\Resource\FileResource;

class ConfigCacheTest extends \PHPUnit_Framework_TestCase
{
    private $resourceFile = null;

    private $cacheFile = null;

    private $metaFile = null;

    public function setUp()
    {
        $this->resourceFile = tempnam(sys_get_temp_dir(), '_resource');
        $this->cacheFile = tempnam(sys_get_temp_dir(), 'config_');
        $this->metaFile = $this->cacheFile.'.meta';

        $this->makeCacheFresh();
        $this->generateMetaFile();
    }

    public function tearDown()
    {
        $files = array($this->cacheFile, $this->metaFile, $this->resourceFile);

        foreach ($files as $file) {
            if (file_exists($file)) {
                unlink($file);
            }
        }
    }

    public function testToString()
    {
        $cache = new ConfigCache($this->cacheFile, true);

        $this->assertSame($this->cacheFile, (string) $cache);
    }

    public function testCacheIsNotFreshIfFileDoesNotExist()
    {
        unlink($this->cacheFile);

        $cache = new ConfigCache($this->cacheFile, false);

        $this->assertFalse($cache->isFresh());
    }

    public function testCacheIsAlwaysFreshIfFileExistsWithDebugDisabled()
    {
        $this->makeCacheStale();

        $cache = new ConfigCache($this->cacheFile, false);

        $this->assertTrue($cache->isFresh());
    }

    public function testCacheIsNotFreshWithoutMetaFile()
    {
        unlink($this->metaFile);

        $cache = new ConfigCache($this->cacheFile, true);

        $this->assertFalse($cache->isFresh());
    }

    public function testCacheIsFreshIfResourceIsFresh()
    {
        $cache = new ConfigCache($this->cacheFile, true);

        $this->assertTrue($cache->isFresh());
    }

    public function testCacheIsNotFreshIfOneOfTheResourcesIsNotFresh()
    {
        $this->makeCacheStale();

        $cache = new ConfigCache($this->cacheFile, true);

        $this->assertFalse($cache->isFresh());
    }

    public function testWriteDumpsFile()
    {
        unlink($this->cacheFile);
        unlink($this->metaFile);

        $cache = new ConfigCache($this->cacheFile, false);
        $cache->write('FOOBAR');

        $this->assertFileExists($this->cacheFile, 'Cache file is created');
        $this->assertSame('FOOBAR', file_get_contents($this->cacheFile));
        $this->assertFileNotExists($this->metaFile, 'Meta file is not created');
    }

    public function testWriteDumpsMetaFileWithDebugEnabled()
    {
        unlink($this->cacheFile);
        unlink($this->metaFile);

        $metadata = array(new FileResource($this->resourceFile));

        $cache = new ConfigCache($this->cacheFile, true);
        $cache->write('FOOBAR', $metadata);

        $this->assertFileExists($this->cacheFile, 'Cache file is created');
        $this->assertFileExists($this->metaFile, 'Meta file is created');
        $this->assertSame(serialize($metadata), file_get_contents($this->metaFile));
    }

    private function makeCacheFresh()
    {
        touch($this->resourceFile, filemtime($this->cacheFile) - 3600);
    }

    private function makeCacheStale()
    {
        touch($this->cacheFile, time() - 3600);
    }

    private function generateMetaFile()
    {
        file_put_contents($this->metaFile, serialize(array(new FileResource($this->resourceFile))));
    }
}
PK�b�\��*/AALpear/test/OptionsResolver/Symfony/Component/OptionsResolver/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony OptionsResolver Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\ν�3;3;Qpear/test/OptionsResolver/Symfony/Component/OptionsResolver/Tests/OptionsTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\OptionsResolver\Tests;

use Symfony\Component\OptionsResolver\Options;

class OptionsTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var Options
     */
    private $options;

    protected function setUp()
    {
        $this->options = new Options();
    }

    public function testArrayAccess()
    {
        $this->assertFalse(isset($this->options['foo']));
        $this->assertFalse(isset($this->options['bar']));

        $this->options['foo'] = 0;
        $this->options['bar'] = 1;

        $this->assertTrue(isset($this->options['foo']));
        $this->assertTrue(isset($this->options['bar']));

        unset($this->options['bar']);

        $this->assertTrue(isset($this->options['foo']));
        $this->assertFalse(isset($this->options['bar']));
        $this->assertEquals(0, $this->options['foo']);
    }

    public function testCountable()
    {
        $this->options->set('foo', 0);
        $this->options->set('bar', 1);

        $this->assertCount(2, $this->options);
    }

    /**
     * @expectedException \OutOfBoundsException
     */
    public function testGetNonExisting()
    {
        $this->options->get('foo');
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testSetNotSupportedAfterGet()
    {
        $this->options->set('foo', 'bar');
        $this->options->get('foo');
        $this->options->set('foo', 'baz');
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testRemoveNotSupportedAfterGet()
    {
        $this->options->set('foo', 'bar');
        $this->options->get('foo');
        $this->options->remove('foo');
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testSetNormalizerNotSupportedAfterGet()
    {
        $this->options->set('foo', 'bar');
        $this->options->get('foo');
        $this->options->setNormalizer('foo', function () {});
    }

    public function testSetLazyOption()
    {
        $test = $this;

        $this->options->set('foo', function (Options $options) use ($test) {
           return 'dynamic';
        });

        $this->assertEquals('dynamic', $this->options->get('foo'));
    }

    public function testSetDiscardsPreviousValue()
    {
        $test = $this;

        // defined by superclass
        $this->options->set('foo', 'bar');

        // defined by subclass
        $this->options->set('foo', function (Options $options, $previousValue) use ($test) {
            /* @var \PHPUnit_Framework_TestCase $test */
            $test->assertNull($previousValue);

            return 'dynamic';
        });

        $this->assertEquals('dynamic', $this->options->get('foo'));
    }

    public function testOverloadKeepsPreviousValue()
    {
        $test = $this;

        // defined by superclass
        $this->options->set('foo', 'bar');

        // defined by subclass
        $this->options->overload('foo', function (Options $options, $previousValue) use ($test) {
            /* @var \PHPUnit_Framework_TestCase $test */
            $test->assertEquals('bar', $previousValue);

            return 'dynamic';
        });

        $this->assertEquals('dynamic', $this->options->get('foo'));
    }

    public function testPreviousValueIsEvaluatedIfLazy()
    {
        $test = $this;

        // defined by superclass
        $this->options->set('foo', function (Options $options) {
            return 'bar';
        });

        // defined by subclass
        $this->options->overload('foo', function (Options $options, $previousValue) use ($test) {
            /* @var \PHPUnit_Framework_TestCase $test */
            $test->assertEquals('bar', $previousValue);

            return 'dynamic';
        });

        $this->assertEquals('dynamic', $this->options->get('foo'));
    }

    public function testPreviousValueIsNotEvaluatedIfNoSecondArgument()
    {
        $test = $this;

        // defined by superclass
        $this->options->set('foo', function (Options $options) use ($test) {
            $test->fail('Should not be called');
        });

        // defined by subclass, no $previousValue argument defined!
        $this->options->overload('foo', function (Options $options) use ($test) {
            return 'dynamic';
        });

        $this->assertEquals('dynamic', $this->options->get('foo'));
    }

    public function testLazyOptionCanAccessOtherOptions()
    {
        $test = $this;

        $this->options->set('foo', 'bar');

        $this->options->set('bam', function (Options $options) use ($test) {
            /* @var \PHPUnit_Framework_TestCase $test */
            $test->assertEquals('bar', $options->get('foo'));

            return 'dynamic';
        });

        $this->assertEquals('bar', $this->options->get('foo'));
        $this->assertEquals('dynamic', $this->options->get('bam'));
    }

    public function testLazyOptionCanAccessOtherLazyOptions()
    {
        $test = $this;

        $this->options->set('foo', function (Options $options) {
            return 'bar';
        });

        $this->options->set('bam', function (Options $options) use ($test) {
            /* @var \PHPUnit_Framework_TestCase $test */
            $test->assertEquals('bar', $options->get('foo'));

            return 'dynamic';
        });

        $this->assertEquals('bar', $this->options->get('foo'));
        $this->assertEquals('dynamic', $this->options->get('bam'));
    }

    public function testNormalizer()
    {
        $this->options->set('foo', 'bar');

        $this->options->setNormalizer('foo', function () {
            return 'normalized';
        });

        $this->assertEquals('normalized', $this->options->get('foo'));
    }

    public function testNormalizerReceivesUnnormalizedValue()
    {
        $this->options->set('foo', 'bar');

        $this->options->setNormalizer('foo', function (Options $options, $value) {
            return 'normalized['.$value.']';
        });

        $this->assertEquals('normalized[bar]', $this->options->get('foo'));
    }

    public function testNormalizerCanAccessOtherOptions()
    {
        $test = $this;

        $this->options->set('foo', 'bar');
        $this->options->set('bam', 'baz');

        $this->options->setNormalizer('bam', function (Options $options) use ($test) {
            /* @var \PHPUnit_Framework_TestCase $test */
            $test->assertEquals('bar', $options->get('foo'));

            return 'normalized';
        });

        $this->assertEquals('bar', $this->options->get('foo'));
        $this->assertEquals('normalized', $this->options->get('bam'));
    }

    public function testNormalizerCanAccessOtherLazyOptions()
    {
        $test = $this;

        $this->options->set('foo', function (Options $options) {
            return 'bar';
        });
        $this->options->set('bam', 'baz');

        $this->options->setNormalizer('bam', function (Options $options) use ($test) {
            /* @var \PHPUnit_Framework_TestCase $test */
            $test->assertEquals('bar', $options->get('foo'));

            return 'normalized';
        });

        $this->assertEquals('bar', $this->options->get('foo'));
        $this->assertEquals('normalized', $this->options->get('bam'));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testFailForCyclicDependencies()
    {
        $this->options->set('foo', function (Options $options) {
            $options->get('bam');
        });

        $this->options->set('bam', function (Options $options) {
            $options->get('foo');
        });

        $this->options->get('foo');
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testFailForCyclicDependenciesBetweenNormalizers()
    {
        $this->options->set('foo', 'bar');
        $this->options->set('bam', 'baz');

        $this->options->setNormalizer('foo', function (Options $options) {
            $options->get('bam');
        });

        $this->options->setNormalizer('bam', function (Options $options) {
            $options->get('foo');
        });

        $this->options->get('foo');
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testFailForCyclicDependenciesBetweenNormalizerAndLazyOption()
    {
        $this->options->set('foo', function (Options $options) {
            $options->get('bam');
        });
        $this->options->set('bam', 'baz');

        $this->options->setNormalizer('bam', function (Options $options) {
            $options->get('foo');
        });

        $this->options->get('foo');
    }

    public function testAllInvokesEachLazyOptionOnlyOnce()
    {
        $test = $this;
        $i = 1;

        $this->options->set('foo', function (Options $options) use ($test, &$i) {
            $test->assertSame(1, $i);
            ++$i;

            // Implicitly invoke lazy option for "bam"
            $options->get('bam');
        });
        $this->options->set('bam', function (Options $options) use ($test, &$i) {
            $test->assertSame(2, $i);
            ++$i;
        });

        $this->options->all();
    }

    public function testAllInvokesEachNormalizerOnlyOnce()
    {
        $test = $this;
        $i = 1;

        $this->options->set('foo', 'bar');
        $this->options->set('bam', 'baz');

        $this->options->setNormalizer('foo', function (Options $options) use ($test, &$i) {
            $test->assertSame(1, $i);
            ++$i;

            // Implicitly invoke normalizer for "bam"
            $options->get('bam');
        });
        $this->options->setNormalizer('bam', function (Options $options) use ($test, &$i) {
            $test->assertSame(2, $i);
            ++$i;
        });

        $this->options->all();
    }

    public function testReplaceClearsAndSets()
    {
        $this->options->set('one', '1');

        $this->options->replace(array(
            'two' => '2',
            'three' => function (Options $options) {
                return '2' === $options['two'] ? '3' : 'foo';
            }
        ));

        $this->assertEquals(array(
            'two' => '2',
            'three' => '3',
        ), $this->options->all());
    }

    public function testClearRemovesAllOptions()
    {
        $this->options->set('one', 1);
        $this->options->set('two', 2);

        $this->options->clear();

        $this->assertEmpty($this->options->all());

    }

    /**
     * @covers Symfony\Component\OptionsResolver\Options::replace
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testCannotReplaceAfterOptionWasRead()
    {
        $this->options->set('one', 1);
        $this->options->all();

        $this->options->replace(array(
            'two' => '2',
        ));
    }

    /**
     * @covers Symfony\Component\OptionsResolver\Options::overload
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testCannotOverloadAfterOptionWasRead()
    {
        $this->options->set('one', 1);
        $this->options->all();

        $this->options->overload('one', 2);
    }

    /**
     * @covers Symfony\Component\OptionsResolver\Options::clear
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testCannotClearAfterOptionWasRead()
    {
        $this->options->set('one', 1);
        $this->options->all();

        $this->options->clear();
    }

    public function testOverloadCannotBeEvaluatedLazilyWithoutExpectedClosureParams()
    {
        $this->options->set('foo', 'bar');

        $this->options->overload('foo', function () {
            return 'test';
        });

        $this->assertNotEquals('test', $this->options->get('foo'));
        $this->assertTrue(is_callable($this->options->get('foo')));
    }

    public function testOverloadCannotBeEvaluatedLazilyWithoutFirstParamTypeHint()
    {
        $this->options->set('foo', 'bar');

        $this->options->overload('foo', function ($object) {
            return 'test';
        });

        $this->assertNotEquals('test', $this->options->get('foo'));
        $this->assertTrue(is_callable($this->options->get('foo')));
    }

    public function testOptionsIteration()
    {
        $this->options->set('foo', 'bar');
        $this->options->set('foo1', 'bar1');
        $expectedResult = array('foo' => 'bar', 'foo1' => 'bar1');

        $this->assertEquals($expectedResult, iterator_to_array($this->options, true));
    }

    public function testHasWithNullValue()
    {
        $this->options->set('foo', null);

        $this->assertTrue($this->options->has('foo'));
    }

    public function testRemoveOptionAndNormalizer()
    {
        $this->options->set('foo1', 'bar');
        $this->options->setNormalizer('foo1', function (Options $options) {
            return '';
        });
        $this->options->set('foo2', 'bar');
        $this->options->setNormalizer('foo2', function (Options $options) {
            return '';
        });

        $this->options->remove('foo2');
        $this->assertEquals(array('foo1' => ''), $this->options->all());
    }

    public function testReplaceOptionAndNormalizer()
    {
        $this->options->set('foo1', 'bar');
        $this->options->setNormalizer('foo1', function (Options $options) {
            return '';
        });
        $this->options->set('foo2', 'bar');
        $this->options->setNormalizer('foo2', function (Options $options) {
            return '';
        });

        $this->options->replace(array('foo1' => 'new'));
        $this->assertEquals(array('foo1' => 'new'), $this->options->all());
    }

    public function testClearOptionAndNormalizer()
    {
        $this->options->set('foo1', 'bar');
        $this->options->setNormalizer('foo1', function (Options $options) {
            return '';
        });
        $this->options->set('foo2', 'bar');
        $this->options->setNormalizer('foo2', function (Options $options) {
            return '';
        });

        $this->options->clear();
        $this->assertEmpty($this->options->all());
    }

    public function testNormalizerWithoutCorrespondingOption()
    {
        $test = $this;

        $this->options->setNormalizer('foo', function (Options $options, $previousValue) use ($test) {
            $test->assertNull($previousValue);

            return '';
        });
        $this->assertEquals(array('foo' => ''), $this->options->all());
    }
}
PK�b�\F1y��A�AYpear/test/OptionsResolver/Symfony/Component/OptionsResolver/Tests/OptionsResolverTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\OptionsResolver\Tests;

use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\OptionsResolver\Options;

class OptionsResolverTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var OptionsResolver
     */
    private $resolver;

    protected function setUp()
    {
        $this->resolver = new OptionsResolver();
    }

    public function testResolve()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
            'two' => '2',
        ));

        $options = array(
            'two' => '20',
        );

        $this->assertEquals(array(
            'one' => '1',
            'two' => '20',
        ), $this->resolver->resolve($options));
    }

    public function testResolveLazy()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
            'two' => function (Options $options) {
                return '20';
            },
        ));

        $this->assertEquals(array(
            'one' => '1',
            'two' => '20',
        ), $this->resolver->resolve(array()));
    }

    public function testResolveLazyDependencyOnOptional()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
            'two' => function (Options $options) {
                return $options['one'].'2';
            },
        ));

        $options = array(
            'one' => '10',
        );

        $this->assertEquals(array(
            'one' => '10',
            'two' => '102',
        ), $this->resolver->resolve($options));
    }

    public function testResolveLazyDependencyOnMissingOptionalWithoutDefault()
    {
        $test = $this;

        $this->resolver->setOptional(array(
            'one',
        ));

        $this->resolver->setDefaults(array(
            'two' => function (Options $options) use ($test) {
                /* @var \PHPUnit_Framework_TestCase $test */
                $test->assertFalse(isset($options['one']));

                return '2';
            },
        ));

        $options = array(
        );

        $this->assertEquals(array(
            'two' => '2',
        ), $this->resolver->resolve($options));
    }

    public function testResolveLazyDependencyOnOptionalWithoutDefault()
    {
        $test = $this;

        $this->resolver->setOptional(array(
            'one',
        ));

        $this->resolver->setDefaults(array(
            'two' => function (Options $options) use ($test) {
                /* @var \PHPUnit_Framework_TestCase $test */
                $test->assertTrue(isset($options['one']));

                return $options['one'].'2';
            },
        ));

        $options = array(
            'one' => '10',
        );

        $this->assertEquals(array(
            'one' => '10',
            'two' => '102',
        ), $this->resolver->resolve($options));
    }

    public function testResolveLazyDependencyOnRequired()
    {
        $this->resolver->setRequired(array(
            'one',
        ));
        $this->resolver->setDefaults(array(
            'two' => function (Options $options) {
                return $options['one'].'2';
            },
        ));

        $options = array(
            'one' => '10',
        );

        $this->assertEquals(array(
            'one' => '10',
            'two' => '102',
        ), $this->resolver->resolve($options));
    }

    public function testResolveLazyReplaceDefaults()
    {
        $test = $this;

        $this->resolver->setDefaults(array(
            'one' => function (Options $options) use ($test) {
                /* @var \PHPUnit_Framework_TestCase $test */
                $test->fail('Previous closure should not be executed');
            },
        ));

        $this->resolver->replaceDefaults(array(
            'one' => function (Options $options, $previousValue) {
                return '1';
            },
        ));

        $this->assertEquals(array(
            'one' => '1',
        ), $this->resolver->resolve(array()));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testResolveFailsIfNonExistingOption()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
        ));

        $this->resolver->setRequired(array(
            'two',
        ));

        $this->resolver->setOptional(array(
            'three',
        ));

        $this->resolver->resolve(array(
            'foo' => 'bar',
        ));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\MissingOptionsException
     */
    public function testResolveFailsIfMissingRequiredOption()
    {
        $this->resolver->setRequired(array(
            'one',
        ));

        $this->resolver->setDefaults(array(
            'two' => '2',
        ));

        $this->resolver->resolve(array(
            'two' => '20',
        ));
    }

    public function testResolveSucceedsIfOptionValueAllowed()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
        ));

        $this->resolver->setAllowedValues(array(
            'one' => array('1', 'one'),
        ));

        $options = array(
            'one' => 'one',
        );

        $this->assertEquals(array(
            'one' => 'one',
        ), $this->resolver->resolve($options));
    }

    public function testResolveSucceedsIfOptionValueAllowed2()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
            'two' => '2',
        ));

        $this->resolver->setAllowedValues(array(
            'one' => '1',
            'two' => '2',
        ));
        $this->resolver->addAllowedValues(array(
            'one' => 'one',
            'two' => 'two',
        ));

        $options = array(
            'one' => '1',
            'two' => 'two',
        );

        $this->assertEquals(array(
            'one' => '1',
            'two' => 'two',
        ), $this->resolver->resolve($options));
    }

    public function testResolveSucceedsIfOptionalWithAllowedValuesNotSet()
    {
        $this->resolver->setRequired(array(
            'one',
        ));

        $this->resolver->setOptional(array(
            'two',
        ));

        $this->resolver->setAllowedValues(array(
            'one' => array('1', 'one'),
            'two' => array('2', 'two'),
        ));

        $options = array(
            'one' => '1',
        );

        $this->assertEquals(array(
            'one' => '1',
        ), $this->resolver->resolve($options));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testResolveFailsIfOptionValueNotAllowed()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
        ));

        $this->resolver->setAllowedValues(array(
            'one' => array('1', 'one'),
        ));

        $this->resolver->resolve(array(
            'one' => '2',
        ));
    }

    public function testResolveSucceedsIfOptionTypeAllowed()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
        ));

        $this->resolver->setAllowedTypes(array(
            'one' => 'string',
        ));

        $options = array(
            'one' => 'one',
        );

        $this->assertEquals(array(
            'one' => 'one',
        ), $this->resolver->resolve($options));
    }

    public function testResolveSucceedsIfOptionTypeAllowedPassArray()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
        ));

        $this->resolver->setAllowedTypes(array(
            'one' => array('string', 'bool'),
        ));

        $options = array(
            'one' => true,
        );

        $this->assertEquals(array(
            'one' => true,
        ), $this->resolver->resolve($options));
    }

    public function testResolveSucceedsIfOptionTypeAllowedPassObject()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
        ));

        $this->resolver->setAllowedTypes(array(
            'one' => 'object',
        ));

        $object = new \stdClass();
        $options = array(
            'one' => $object,
        );

        $this->assertEquals(array(
            'one' => $object,
        ), $this->resolver->resolve($options));
    }

    public function testResolveSucceedsIfOptionTypeAllowedPassClass()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
        ));

        $this->resolver->setAllowedTypes(array(
            'one' => '\stdClass',
        ));

        $object = new \stdClass();
        $options = array(
            'one' => $object,
        );

        $this->assertEquals(array(
            'one' => $object,
        ), $this->resolver->resolve($options));
    }

    public function testResolveSucceedsIfOptionTypeAllowedAddTypes()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
            'two' => '2',
        ));

        $this->resolver->setAllowedTypes(array(
            'one' => 'string',
            'two' => 'bool',
        ));
        $this->resolver->addAllowedTypes(array(
            'one' => 'float',
            'two' => 'integer',
        ));

        $options = array(
            'one' => 1.23,
            'two' => false,
        );

        $this->assertEquals(array(
            'one' => 1.23,
            'two' => false,
        ), $this->resolver->resolve($options));
    }

    public function testResolveSucceedsIfOptionalWithTypeAndWithoutValue()
    {
        $this->resolver->setOptional(array(
            'one',
            'two',
        ));

        $this->resolver->setAllowedTypes(array(
            'one' => 'string',
            'two' => 'int',
        ));

        $options = array(
            'two' => 1,
        );

        $this->assertEquals(array(
            'two' => 1,
        ), $this->resolver->resolve($options));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testResolveFailsIfOptionTypeNotAllowed()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
        ));

        $this->resolver->setAllowedTypes(array(
            'one' => array('string', 'bool'),
        ));

        $this->resolver->resolve(array(
            'one' => 1.23,
        ));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testResolveFailsIfOptionTypeNotAllowedMultipleOptions()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
            'two' => '2',
        ));

        $this->resolver->setAllowedTypes(array(
            'one' => 'string',
            'two' => 'bool',
        ));

        $this->resolver->resolve(array(
            'one' => 'foo',
            'two' => 1.23,
        ));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException
     */
    public function testResolveFailsIfOptionTypeNotAllowedAddTypes()
    {
        $this->resolver->setDefaults(array(
            'one' => '1',
        ));

        $this->resolver->setAllowedTypes(array(
            'one' => 'string',
        ));
        $this->resolver->addAllowedTypes(array(
            'one' => 'bool',
        ));

        $this->resolver->resolve(array(
            'one' => 1.23,
        ));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testSetRequiredFailsIfDefaultIsPassed()
    {
        $this->resolver->setRequired(array(
            'one' => '1',
        ));
    }

    /**
     * @expectedException \Symfony\Component\OptionsResolver\Exception\OptionDefinitionException
     */
    public function testSetOptionalFailsIfDefaultIsPassed()
    {
        $this->resolver->setOptional(array(
            'one' => '1',
        ));
    }

    public function testFluidInterface()
    {
        $this->resolver->setDefaults(array('one' => '1'))
            ->replaceDefaults(array('one' => '2'))
            ->setAllowedValues(array('one' => array('1', '2')))
            ->addAllowedValues(array('one' => array('3')))
            ->setRequired(array('two'))
            ->setOptional(array('three'));

        $options = array(
            'two' => '2',
        );

        $this->assertEquals(array(
            'one' => '2',
            'two' => '2',
        ), $this->resolver->resolve($options));
    }

    public function testKnownIfDefaultWasSet()
    {
        $this->assertFalse($this->resolver->isKnown('foo'));

        $this->resolver->setDefaults(array(
            'foo' => 'bar',
        ));

        $this->assertTrue($this->resolver->isKnown('foo'));
    }

    public function testKnownIfRequired()
    {
        $this->assertFalse($this->resolver->isKnown('foo'));

        $this->resolver->setRequired(array(
            'foo',
        ));

        $this->assertTrue($this->resolver->isKnown('foo'));
    }

    public function testKnownIfOptional()
    {
        $this->assertFalse($this->resolver->isKnown('foo'));

        $this->resolver->setOptional(array(
            'foo',
        ));

        $this->assertTrue($this->resolver->isKnown('foo'));
    }

    public function testRequiredIfRequired()
    {
        $this->assertFalse($this->resolver->isRequired('foo'));

        $this->resolver->setRequired(array(
            'foo',
        ));

        $this->assertTrue($this->resolver->isRequired('foo'));
    }

    public function testNotRequiredIfRequiredAndDefaultValue()
    {
        $this->assertFalse($this->resolver->isRequired('foo'));

        $this->resolver->setRequired(array(
            'foo',
        ));
        $this->resolver->setDefaults(array(
            'foo' => 'bar',
        ));

        $this->assertFalse($this->resolver->isRequired('foo'));
    }

    public function testNormalizersTransformFinalOptions()
    {
        $this->resolver->setDefaults(array(
            'foo' => 'bar',
            'bam' => 'baz',
        ));
        $this->resolver->setNormalizers(array(
            'foo' => function (Options $options, $value) {
                return $options['bam'].'['.$value.']';
            },
        ));

        $expected = array(
            'foo' => 'baz[bar]',
            'bam' => 'baz',
        );

        $this->assertEquals($expected, $this->resolver->resolve(array()));

        $expected = array(
            'foo' => 'boo[custom]',
            'bam' => 'boo',
        );

        $this->assertEquals($expected, $this->resolver->resolve(array(
            'foo' => 'custom',
            'bam' => 'boo',
        )));
    }

    public function testResolveWithoutOptionSucceedsIfRequiredAndDefaultValue()
    {
        $this->resolver->setRequired(array(
            'foo',
        ));
        $this->resolver->setDefaults(array(
            'foo' => 'bar',
        ));

        $this->assertEquals(array(
            'foo' => 'bar'
        ), $this->resolver->resolve(array()));
    }

    public function testResolveWithoutOptionSucceedsIfDefaultValueAndRequired()
    {
        $this->resolver->setDefaults(array(
            'foo' => 'bar',
        ));
        $this->resolver->setRequired(array(
            'foo',
        ));

        $this->assertEquals(array(
            'foo' => 'bar'
        ), $this->resolver->resolve(array()));
    }

    public function testResolveSucceedsIfOptionRequiredAndValueAllowed()
    {
        $this->resolver->setRequired(array(
            'one', 'two',
        ));
        $this->resolver->setAllowedValues(array(
            'two' => array('2'),
        ));

        $options = array(
            'one' => '1',
            'two' => '2'
        );

        $this->assertEquals($options, $this->resolver->resolve($options));
    }

    public function testClone()
    {
        $this->resolver->setDefaults(array('one' => '1'));

        $clone = clone $this->resolver;

        // Changes after cloning don't affect each other
        $this->resolver->setDefaults(array('two' => '2'));
        $clone->setDefaults(array('three' => '3'));

        $this->assertEquals(array(
            'one' => '1',
            'two' => '2',
        ), $this->resolver->resolve());

        $this->assertEquals(array(
            'one' => '1',
            'three' => '3',
        ), $clone->resolve());
    }
}
PK�b�\9�#�		>pear/test/Security/Symfony/Component/Security/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Security Component Test Suite">
            <directory>./Acl/Tests/</directory>
            <directory>./Core/Tests/</directory>
            <directory>./Http/Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./vendor</directory>
                <directory>./Acl/Tests</directory>
                <directory>./Core/Tests</directory>
                <directory>./Http/Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\��*�<<Cpear/test/Security/Symfony/Component/Security/Csrf/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Security Component CSRF Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./vendor</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\���WWapear/test/Security/Symfony/Component/Security/Csrf/Tests/TokenStorage/SessionTokenStorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf\Tests\TokenStorage;

use Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class SessionTokenStorageTest extends \PHPUnit_Framework_TestCase
{
    const SESSION_NAMESPACE = 'foobar';

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $session;

    /**
     * @var SessionTokenStorage
     */
    private $storage;

    protected function setUp()
    {
        if (!interface_exists('Symfony\Component\HttpFoundation\Session\SessionInterface')) {
            $this->markTestSkipped('The "HttpFoundation" component is not available');
        }

        $this->session = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\SessionInterface')
            ->disableOriginalConstructor()
            ->getMock();
        $this->storage = new SessionTokenStorage($this->session, self::SESSION_NAMESPACE);
    }

    public function testStoreTokenInClosedSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(false));

        $this->session->expects($this->once())
            ->method('start');

        $this->session->expects($this->once())
            ->method('set')
            ->with(self::SESSION_NAMESPACE.'/token_id', 'TOKEN');

        $this->storage->setToken('token_id', 'TOKEN');
    }

    public function testStoreTokenInActiveSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(true));

        $this->session->expects($this->never())
            ->method('start');

        $this->session->expects($this->once())
            ->method('set')
            ->with(self::SESSION_NAMESPACE.'/token_id', 'TOKEN');

        $this->storage->setToken('token_id', 'TOKEN');
    }

    public function testCheckTokenInClosedSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(false));

        $this->session->expects($this->once())
            ->method('start');

        $this->session->expects($this->once())
            ->method('has')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue('RESULT'));

        $this->assertSame('RESULT', $this->storage->hasToken('token_id'));
    }

    public function testCheckTokenInActiveSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(true));

        $this->session->expects($this->never())
            ->method('start');

        $this->session->expects($this->once())
            ->method('has')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue('RESULT'));

        $this->assertSame('RESULT', $this->storage->hasToken('token_id'));
    }

    public function testGetExistingTokenFromClosedSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(false));

        $this->session->expects($this->once())
            ->method('start');

        $this->session->expects($this->once())
            ->method('has')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue(true));

        $this->session->expects($this->once())
            ->method('get')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue('RESULT'));

        $this->assertSame('RESULT', $this->storage->getToken('token_id'));
    }

    public function testGetExistingTokenFromActiveSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(true));

        $this->session->expects($this->never())
            ->method('start');

        $this->session->expects($this->once())
            ->method('has')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue(true));

        $this->session->expects($this->once())
            ->method('get')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue('RESULT'));

        $this->assertSame('RESULT', $this->storage->getToken('token_id'));
    }

    /**
     * @expectedException \Symfony\Component\Security\Csrf\Exception\TokenNotFoundException
     */
    public function testGetNonExistingTokenFromClosedSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(false));

        $this->session->expects($this->once())
            ->method('start');

        $this->session->expects($this->once())
            ->method('has')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue(false));

        $this->storage->getToken('token_id');
    }

    /**
     * @expectedException \Symfony\Component\Security\Csrf\Exception\TokenNotFoundException
     */
    public function testGetNonExistingTokenFromActiveSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(true));

        $this->session->expects($this->never())
            ->method('start');

        $this->session->expects($this->once())
            ->method('has')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue(false));

        $this->storage->getToken('token_id');
    }

    public function testRemoveNonExistingTokenFromClosedSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(false));

        $this->session->expects($this->once())
            ->method('start');

        $this->session->expects($this->once())
            ->method('remove')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue(null));

        $this->assertNull($this->storage->removeToken('token_id'));
    }

    public function testRemoveNonExistingTokenFromActiveSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(true));

        $this->session->expects($this->never())
            ->method('start');

        $this->session->expects($this->once())
            ->method('remove')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue(null));

        $this->assertNull($this->storage->removeToken('token_id'));
    }

    public function testRemoveExistingTokenFromClosedSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(false));

        $this->session->expects($this->once())
            ->method('start');

        $this->session->expects($this->once())
            ->method('remove')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue('TOKEN'));

        $this->assertSame('TOKEN', $this->storage->removeToken('token_id'));
    }

    public function testRemoveExistingTokenFromActiveSession()
    {
        $this->session->expects($this->any())
            ->method('isStarted')
            ->will($this->returnValue(true));

        $this->session->expects($this->never())
            ->method('start');

        $this->session->expects($this->once())
            ->method('remove')
            ->with(self::SESSION_NAMESPACE.'/token_id')
            ->will($this->returnValue('TOKEN'));

        $this->assertSame('TOKEN', $this->storage->removeToken('token_id'));
    }
}
PK�b�\�|G

gpear/test/Security/Symfony/Component/Security/Csrf/Tests/TokenStorage/NativeSessionTokenStorageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf\Tests\TokenStorage;

use Symfony\Component\Security\Csrf\TokenStorage\NativeSessionTokenStorage;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 *
 * @runTestsInSeparateProcesses
 */
class NativeSessionTokenStorageTest extends \PHPUnit_Framework_TestCase
{
    const SESSION_NAMESPACE = 'foobar';

    /**
     * @var NativeSessionTokenStorage
     */
    private $storage;

    public static function setUpBeforeClass()
    {
        ini_set('session.save_handler', 'files');
        ini_set('session.save_path', sys_get_temp_dir());

        parent::setUpBeforeClass();
    }

    protected function setUp()
    {
        $_SESSION = array();

        $this->storage = new NativeSessionTokenStorage(self::SESSION_NAMESPACE);
    }

    public function testStoreTokenInClosedSession()
    {
        $this->storage->setToken('token_id', 'TOKEN');

        $this->assertSame(array(self::SESSION_NAMESPACE => array('token_id' => 'TOKEN')), $_SESSION);
    }

    public function testStoreTokenInClosedSessionWithExistingSessionId()
    {
        if (version_compare(PHP_VERSION, '5.4', '<')) {
            $this->markTestSkipped('This test requires PHP 5.4 or later.');
        }

        session_id('foobar');

        $this->assertSame(PHP_SESSION_NONE, session_status());

        $this->storage->setToken('token_id', 'TOKEN');

        $this->assertSame(PHP_SESSION_ACTIVE, session_status());
        $this->assertSame(array(self::SESSION_NAMESPACE => array('token_id' => 'TOKEN')), $_SESSION);
    }

    public function testStoreTokenInActiveSession()
    {
        session_start();

        $this->storage->setToken('token_id', 'TOKEN');

        $this->assertSame(array(self::SESSION_NAMESPACE => array('token_id' => 'TOKEN')), $_SESSION);
    }

    /**
     * @depends testStoreTokenInClosedSession
     */
    public function testCheckToken()
    {
        $this->assertFalse($this->storage->hasToken('token_id'));

        $this->storage->setToken('token_id', 'TOKEN');

        $this->assertTrue($this->storage->hasToken('token_id'));
    }

    /**
     * @depends testStoreTokenInClosedSession
     */
    public function testGetExistingToken()
    {
        $this->storage->setToken('token_id', 'TOKEN');

        $this->assertSame('TOKEN', $this->storage->getToken('token_id'));
    }

    /**
     * @expectedException \Symfony\Component\Security\Csrf\Exception\TokenNotFoundException
     */
    public function testGetNonExistingToken()
    {
        $this->storage->getToken('token_id');
    }

    /**
     * @depends testCheckToken
     */
    public function testRemoveNonExistingToken()
    {
        $this->assertNull($this->storage->removeToken('token_id'));
        $this->assertFalse($this->storage->hasToken('token_id'));
    }

    /**
     * @depends testCheckToken
     */
    public function testRemoveExistingToken()
    {
        $this->storage->setToken('token_id', 'TOKEN');

        $this->assertSame('TOKEN', $this->storage->removeToken('token_id'));
        $this->assertFalse($this->storage->hasToken('token_id'));
    }
}
PK�b�\�-�kkQpear/test/Security/Symfony/Component/Security/Csrf/Tests/CsrfTokenManagerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf\Tests;

use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManager;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class CsrfTokenManagerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $generator;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $storage;

    /**
     * @var CsrfTokenManager
     */
    private $manager;

    protected function setUp()
    {
        $this->generator = $this->getMock('Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface');
        $this->storage = $this->getMock('Symfony\Component\Security\Csrf\TokenStorage\TokenStorageInterface');
        $this->manager = new CsrfTokenManager($this->generator, $this->storage);
    }

    protected function tearDown()
    {
        $this->generator = null;
        $this->storage = null;
        $this->manager = null;
    }

    public function testGetNonExistingToken()
    {
        $this->storage->expects($this->once())
            ->method('hasToken')
            ->with('token_id')
            ->will($this->returnValue(false));

        $this->generator->expects($this->once())
            ->method('generateToken')
            ->will($this->returnValue('TOKEN'));

        $this->storage->expects($this->once())
            ->method('setToken')
            ->with('token_id', 'TOKEN');

        $token = $this->manager->getToken('token_id');

        $this->assertInstanceOf('Symfony\Component\Security\Csrf\CsrfToken', $token);
        $this->assertSame('token_id', $token->getId());
        $this->assertSame('TOKEN', $token->getValue());
    }

    public function testUseExistingTokenIfAvailable()
    {
        $this->storage->expects($this->once())
            ->method('hasToken')
            ->with('token_id')
            ->will($this->returnValue(true));

        $this->storage->expects($this->once())
            ->method('getToken')
            ->with('token_id')
            ->will($this->returnValue('TOKEN'));

        $token = $this->manager->getToken('token_id');

        $this->assertInstanceOf('Symfony\Component\Security\Csrf\CsrfToken', $token);
        $this->assertSame('token_id', $token->getId());
        $this->assertSame('TOKEN', $token->getValue());
    }

    public function testRefreshTokenAlwaysReturnsNewToken()
    {
        $this->storage->expects($this->never())
            ->method('hasToken');

        $this->generator->expects($this->once())
            ->method('generateToken')
            ->will($this->returnValue('TOKEN'));

        $this->storage->expects($this->once())
            ->method('setToken')
            ->with('token_id', 'TOKEN');

        $token = $this->manager->refreshToken('token_id');

        $this->assertInstanceOf('Symfony\Component\Security\Csrf\CsrfToken', $token);
        $this->assertSame('token_id', $token->getId());
        $this->assertSame('TOKEN', $token->getValue());
    }

    public function testMatchingTokenIsValid()
    {
        $this->storage->expects($this->once())
            ->method('hasToken')
            ->with('token_id')
            ->will($this->returnValue(true));

        $this->storage->expects($this->once())
            ->method('getToken')
            ->with('token_id')
            ->will($this->returnValue('TOKEN'));

        $this->assertTrue($this->manager->isTokenValid(new CsrfToken('token_id', 'TOKEN')));
    }

    public function testNonMatchingTokenIsNotValid()
    {
        $this->storage->expects($this->once())
            ->method('hasToken')
            ->with('token_id')
            ->will($this->returnValue(true));

        $this->storage->expects($this->once())
            ->method('getToken')
            ->with('token_id')
            ->will($this->returnValue('TOKEN'));

        $this->assertFalse($this->manager->isTokenValid(new CsrfToken('token_id', 'FOOBAR')));
    }

    public function testNonExistingTokenIsNotValid()
    {
        $this->storage->expects($this->once())
            ->method('hasToken')
            ->with('token_id')
            ->will($this->returnValue(false));

        $this->storage->expects($this->never())
            ->method('getToken');

        $this->assertFalse($this->manager->isTokenValid(new CsrfToken('token_id', 'FOOBAR')));
    }

    public function testRemoveToken()
    {
        $this->storage->expects($this->once())
            ->method('removeToken')
            ->with('token_id')
            ->will($this->returnValue('REMOVED_TOKEN'));

        $this->assertSame('REMOVED_TOKEN', $this->manager->removeToken('token_id'));
    }
}
PK�b�\�3�z((epear/test/Security/Symfony/Component/Security/Csrf/Tests/TokenGenerator/UriSafeTokenGeneratorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Csrf\Tests\TokenGenerator;

use Symfony\Component\Security\Csrf\TokenGenerator\UriSafeTokenGenerator;

/**
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class UriSafeTokenGeneratorTest extends \PHPUnit_Framework_TestCase
{
    const ENTROPY = 1000;

    /**
     * A non alpha-numeric byte string
     * @var string
     */
    private static $bytes;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $random;

    /**
     * @var UriSafeTokenGenerator
     */
    private $generator;

    public static function setUpBeforeClass()
    {
        self::$bytes = base64_decode('aMf+Tct/RLn2WQ==');
    }

    protected function setUp()
    {
        $this->random = $this->getMock('Symfony\Component\Security\Core\Util\SecureRandomInterface');
        $this->generator = new UriSafeTokenGenerator($this->random, self::ENTROPY);
    }

    protected function tearDown()
    {
        $this->random = null;
        $this->generator = null;
    }

    public function testGenerateToken()
    {
        $this->random->expects($this->once())
            ->method('nextBytes')
            ->with(self::ENTROPY/8)
            ->will($this->returnValue(self::$bytes));

        $token = $this->generator->generateToken();

        $this->assertTrue(ctype_print($token), 'is printable');
        $this->assertStringNotMatchesFormat('%S+%S', $token, 'is URI safe');
        $this->assertStringNotMatchesFormat('%S/%S', $token, 'is URI safe');
        $this->assertStringNotMatchesFormat('%S=%S', $token, 'is URI safe');
    }
}
PK�b�\?k,.<<Cpear/test/Security/Symfony/Component/Security/Http/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Security Component HTTP Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./vendor</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\Y�Ң	�	fpear/test/Security/Symfony/Component/Security/Http/Tests/Session/SessionAuthenticationStrategyTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Session;

use Symfony\Component\Security\Http\Session\SessionAuthenticationStrategy;

class SessionAuthenticationStrategyTest extends \PHPUnit_Framework_TestCase
{
    public function testSessionIsNotChanged()
    {
        $request = $this->getRequest();
        $request->expects($this->never())->method('getSession');

        $strategy = new SessionAuthenticationStrategy(SessionAuthenticationStrategy::NONE);
        $strategy->onAuthentication($request, $this->getToken());
    }

    /**
     * @expectedException \RuntimeException
     * @expectedExceptionMessage Invalid session authentication strategy "foo"
     */
    public function testUnsupportedStrategy()
    {
        $request = $this->getRequest();
        $request->expects($this->never())->method('getSession');

        $strategy = new SessionAuthenticationStrategy('foo');
        $strategy->onAuthentication($request, $this->getToken());
    }

    public function testSessionIsMigrated()
    {
        $session = $this->getMock('Symfony\Component\HttpFoundation\Session\SessionInterface');
        $session->expects($this->once())->method('migrate');

        $strategy = new SessionAuthenticationStrategy(SessionAuthenticationStrategy::MIGRATE);
        $strategy->onAuthentication($this->getRequest($session), $this->getToken());
    }

    public function testSessionIsInvalidated()
    {
        $session = $this->getMock('Symfony\Component\HttpFoundation\Session\SessionInterface');
        $session->expects($this->once())->method('invalidate');

        $strategy = new SessionAuthenticationStrategy(SessionAuthenticationStrategy::INVALIDATE);
        $strategy->onAuthentication($this->getRequest($session), $this->getToken());
    }

    private function getRequest($session = null)
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');

        if (null !== $session) {
            $request->expects($this->any())->method('getSession')->will($this->returnValue($session));
        }

        return $request;
    }

    private function getToken()
    {
        return $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
    }
}
PK�b�\����%�%Jpear/test/Security/Symfony/Component/Security/Http/Tests/HttpUtilsTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Http\HttpUtils;

class HttpUtilsTest extends \PHPUnit_Framework_TestCase
{
    public function testCreateRedirectResponseWithPath()
    {
        $utils = new HttpUtils($this->getUrlGenerator());
        $response = $utils->createRedirectResponse($this->getRequest(), '/foobar');

        $this->assertTrue($response->isRedirect('http://localhost/foobar'));
        $this->assertEquals(302, $response->getStatusCode());
    }

    public function testCreateRedirectResponseWithAbsoluteUrl()
    {
        $utils = new HttpUtils($this->getUrlGenerator());
        $response = $utils->createRedirectResponse($this->getRequest(), 'http://symfony.com/');

        $this->assertTrue($response->isRedirect('http://symfony.com/'));
    }

    public function testCreateRedirectResponseWithRouteName()
    {
        $utils = new HttpUtils($urlGenerator = $this->getMock('Symfony\Component\Routing\Generator\UrlGeneratorInterface'));

        $urlGenerator
            ->expects($this->any())
            ->method('generate')
            ->with('foobar', array(), true)
            ->will($this->returnValue('http://localhost/foo/bar'))
        ;
        $urlGenerator
            ->expects($this->any())
            ->method('getContext')
            ->will($this->returnValue($this->getMock('Symfony\Component\Routing\RequestContext')))
        ;

        $response = $utils->createRedirectResponse($this->getRequest(), 'foobar');

        $this->assertTrue($response->isRedirect('http://localhost/foo/bar'));
    }

    public function testCreateRequestWithPath()
    {
        $request = $this->getRequest();
        $request->server->set('Foo', 'bar');

        $utils = new HttpUtils($this->getUrlGenerator());
        $subRequest = $utils->createRequest($request, '/foobar');

        $this->assertEquals('GET', $subRequest->getMethod());
        $this->assertEquals('/foobar', $subRequest->getPathInfo());
        $this->assertEquals('bar', $subRequest->server->get('Foo'));
    }

    public function testCreateRequestWithRouteName()
    {
        $utils = new HttpUtils($urlGenerator = $this->getMock('Symfony\Component\Routing\Generator\UrlGeneratorInterface'));

        $urlGenerator
            ->expects($this->once())
            ->method('generate')
            ->will($this->returnValue('/foo/bar'))
        ;
        $urlGenerator
            ->expects($this->any())
            ->method('getContext')
            ->will($this->returnValue($this->getMock('Symfony\Component\Routing\RequestContext')))
        ;

        $subRequest = $utils->createRequest($this->getRequest(), 'foobar');

        $this->assertEquals('/foo/bar', $subRequest->getPathInfo());
    }

    public function testCreateRequestWithAbsoluteUrl()
    {
        $utils = new HttpUtils($this->getMock('Symfony\Component\Routing\Generator\UrlGeneratorInterface'));
        $subRequest = $utils->createRequest($this->getRequest(), 'http://symfony.com/');

        $this->assertEquals('/', $subRequest->getPathInfo());
    }

    public function testCreateRequestPassesSessionToTheNewRequest()
    {
        $request = $this->getRequest();
        $request->setSession($session = $this->getMock('Symfony\Component\HttpFoundation\Session\SessionInterface'));

        $utils = new HttpUtils($this->getUrlGenerator());
        $subRequest = $utils->createRequest($request, '/foobar');

        $this->assertSame($session, $subRequest->getSession());
    }

    /**
     * @dataProvider provideSecurityContextAttributes
     */
    public function testCreateRequestPassesSecurityContextAttributesToTheNewRequest($attribute)
    {
        $request = $this->getRequest();
        $request->attributes->set($attribute, 'foo');

        $utils = new HttpUtils($this->getUrlGenerator());
        $subRequest = $utils->createRequest($request, '/foobar');

        $this->assertSame('foo', $subRequest->attributes->get($attribute));
    }

    public function provideSecurityContextAttributes()
    {
        return array(
            array(SecurityContextInterface::AUTHENTICATION_ERROR),
            array(SecurityContextInterface::ACCESS_DENIED_ERROR),
            array(SecurityContextInterface::LAST_USERNAME)
        );
    }

    public function testCheckRequestPath()
    {
        $utils = new HttpUtils($this->getUrlGenerator());

        $this->assertTrue($utils->checkRequestPath($this->getRequest(), '/'));
        $this->assertFalse($utils->checkRequestPath($this->getRequest(), '/foo'));
        $this->assertTrue($utils->checkRequestPath($this->getRequest('/foo%20bar'), '/foo bar'));
        // Plus must not decoded to space
        $this->assertTrue($utils->checkRequestPath($this->getRequest('/foo+bar'), '/foo+bar'));
        // Checking unicode
        $this->assertTrue($utils->checkRequestPath($this->getRequest(urlencode('/вход')), '/вход'));
    }

    public function testCheckRequestPathWithUrlMatcherAndResourceNotFound()
    {
        $urlMatcher = $this->getMock('Symfony\Component\Routing\Matcher\UrlMatcherInterface');
        $urlMatcher
            ->expects($this->any())
            ->method('match')
            ->with('/')
            ->will($this->throwException(new ResourceNotFoundException()))
        ;

        $utils = new HttpUtils(null, $urlMatcher);
        $this->assertFalse($utils->checkRequestPath($this->getRequest(), 'foobar'));
    }

    public function testCheckRequestPathWithUrlMatcherAndMethodNotAllowed()
    {
        $request = $this->getRequest();
        $urlMatcher = $this->getMock('Symfony\Component\Routing\Matcher\RequestMatcherInterface');
        $urlMatcher
            ->expects($this->any())
            ->method('matchRequest')
            ->with($request)
            ->will($this->throwException(new MethodNotAllowedException(array())))
        ;

        $utils = new HttpUtils(null, $urlMatcher);
        $this->assertFalse($utils->checkRequestPath($request, 'foobar'));
    }

    public function testCheckRequestPathWithUrlMatcherAndResourceFoundByUrl()
    {
        $urlMatcher = $this->getMock('Symfony\Component\Routing\Matcher\UrlMatcherInterface');
        $urlMatcher
            ->expects($this->any())
            ->method('match')
            ->with('/foo/bar')
            ->will($this->returnValue(array('_route' => 'foobar')))
        ;

        $utils = new HttpUtils(null, $urlMatcher);
        $this->assertTrue($utils->checkRequestPath($this->getRequest('/foo/bar'), 'foobar'));
    }

    public function testCheckRequestPathWithUrlMatcherAndResourceFoundByRequest()
    {
        $request = $this->getRequest();
        $urlMatcher = $this->getMock('Symfony\Component\Routing\Matcher\RequestMatcherInterface');
        $urlMatcher
            ->expects($this->any())
            ->method('matchRequest')
            ->with($request)
            ->will($this->returnValue(array('_route' => 'foobar')))
        ;

        $utils = new HttpUtils(null, $urlMatcher);
        $this->assertTrue($utils->checkRequestPath($request, 'foobar'));
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testCheckRequestPathWithUrlMatcherLoadingException()
    {
        $urlMatcher = $this->getMock('Symfony\Component\Routing\Matcher\UrlMatcherInterface');
        $urlMatcher
            ->expects($this->any())
            ->method('match')
            ->will($this->throwException(new \RuntimeException()))
        ;

        $utils = new HttpUtils(null, $urlMatcher);
        $utils->checkRequestPath($this->getRequest(), 'foobar');
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage Matcher must either implement UrlMatcherInterface or RequestMatcherInterface
     */
    public function testUrlMatcher()
    {
        new HttpUtils($this->getUrlGenerator(), new \stdClass());
    }

    public function testGenerateUriRemovesQueryString()
    {
        $utils = new HttpUtils($this->getUrlGenerator('/foo/bar'));
        $this->assertEquals('/foo/bar', $utils->generateUri(new Request(), 'route_name'));

        $utils = new HttpUtils($this->getUrlGenerator('/foo/bar?param=value'));
        $this->assertEquals('/foo/bar', $utils->generateUri(new Request(), 'route_name'));
    }

    /**
     * @expectedException \LogicException
     * @expectedExceptionMessage You must provide a UrlGeneratorInterface instance to be able to use routes.
     */
    public function testUrlGeneratorIsRequiredToGenerateUrl()
    {
        $utils = new HttpUtils();
        $utils->generateUri(new Request(), 'route_name');
    }

    private function getUrlGenerator($generatedUrl = '/foo/bar')
    {
        $urlGenerator = $this->getMock('Symfony\Component\Routing\Generator\UrlGeneratorInterface');
        $urlGenerator
            ->expects($this->any())
            ->method('generate')
            ->will($this->returnValue($generatedUrl))
        ;

        return $urlGenerator;
    }

    private function getRequest($path = '/')
    {
        return Request::create($path, 'get');
    }
}
PK�b�\x��W��Jpear/test/Security/Symfony/Component/Security/Http/Tests/AccessMapTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests;

use Symfony\Component\Security\Http\AccessMap;

class AccessMapTest extends \PHPUnit_Framework_TestCase
{
    public function testReturnsFirstMatchedPattern()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $requestMatcher1 = $this->getRequestMatcher($request, false);
        $requestMatcher2 = $this->getRequestMatcher($request, true);

        $map = new AccessMap();
        $map->add($requestMatcher1, array('ROLE_ADMIN'), 'http');
        $map->add($requestMatcher2, array('ROLE_USER'), 'https');

        $this->assertSame(array(array('ROLE_USER'), 'https'), $map->getPatterns($request));
    }

    public function testReturnsEmptyPatternIfNoneMatched()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $requestMatcher = $this->getRequestMatcher($request, false);

        $map = new AccessMap();
        $map->add($requestMatcher, array('ROLE_USER'), 'https');

        $this->assertSame(array(null, null), $map->getPatterns($request));
    }

    private function getRequestMatcher($request, $matches)
    {
        $requestMatcher = $this->getMock('Symfony\Component\HttpFoundation\RequestMatcherInterface');
        $requestMatcher->expects($this->once())
            ->method('matches')->with($request)
            ->will($this->returnValue($matches));

        return $requestMatcher;
    }
}
PK�b�\g3�%%Ipear/test/Security/Symfony/Component/Security/Http/Tests/FirewallTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests;

use Symfony\Component\Security\Http\Firewall;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class FirewallTest extends \PHPUnit_Framework_TestCase
{
    public function testOnKernelRequestRegistersExceptionListener()
    {
        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');

        $listener = $this->getMock('Symfony\Component\Security\Http\Firewall\ExceptionListener', array(), array(), '', false);
        $listener
            ->expects($this->once())
            ->method('register')
            ->with($this->equalTo($dispatcher))
        ;

        $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);

        $map = $this->getMock('Symfony\Component\Security\Http\FirewallMapInterface');
        $map
            ->expects($this->once())
            ->method('getListeners')
            ->with($this->equalTo($request))
            ->will($this->returnValue(array(array(), $listener)))
        ;

        $event = new GetResponseEvent($this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface'), $request, HttpKernelInterface::MASTER_REQUEST);

        $firewall = new Firewall($map, $dispatcher);
        $firewall->onKernelRequest($event);
    }

    public function testOnKernelRequestStopsWhenThereIsAResponse()
    {
        $response = $this->getMock('Symfony\Component\HttpFoundation\Response');

        $first = $this->getMock('Symfony\Component\Security\Http\Firewall\ListenerInterface');
        $first
            ->expects($this->once())
            ->method('handle')
        ;

        $second = $this->getMock('Symfony\Component\Security\Http\Firewall\ListenerInterface');
        $second
            ->expects($this->never())
            ->method('handle')
        ;

        $map = $this->getMock('Symfony\Component\Security\Http\FirewallMapInterface');
        $map
            ->expects($this->once())
            ->method('getListeners')
            ->will($this->returnValue(array(array($first, $second), null)))
        ;

        $event = $this->getMock(
            'Symfony\Component\HttpKernel\Event\GetResponseEvent',
            array('hasResponse'),
            array(
                $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface'),
                $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false),
                HttpKernelInterface::MASTER_REQUEST
            )
        );
        $event
            ->expects($this->once())
            ->method('hasResponse')
            ->will($this->returnValue(true))
        ;

        $firewall = new Firewall($map, $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface'));
        $firewall->onKernelRequest($event);
    }

    public function testOnKernelRequestWithSubRequest()
    {
        $map = $this->getMock('Symfony\Component\Security\Http\FirewallMapInterface');
        $map
            ->expects($this->never())
            ->method('getListeners')
        ;

        $event = new GetResponseEvent(
            $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface'),
            $this->getMock('Symfony\Component\HttpFoundation\Request'),
            HttpKernelInterface::SUB_REQUEST
        );

        $firewall = new Firewall($map, $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface'));
        $firewall->onKernelRequest($event);

        $this->assertFalse($event->hasResponse());
    }
}
PK�b�\�ck�~
~
hpear/test/Security/Symfony/Component/Security/Http/Tests/EntryPoint/FormAuthenticationEntryPointTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\EntryPoint;

use Symfony\Component\Security\Http\EntryPoint\FormAuthenticationEntryPoint;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class FormAuthenticationEntryPointTest extends \PHPUnit_Framework_TestCase
{
    public function testStart()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);
        $response = $this->getMock('Symfony\Component\HttpFoundation\Response');

        $httpKernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $httpUtils = $this->getMock('Symfony\Component\Security\Http\HttpUtils');
        $httpUtils
            ->expects($this->once())
            ->method('createRedirectResponse')
            ->with($this->equalTo($request), $this->equalTo('/the/login/path'))
            ->will($this->returnValue($response))
        ;

        $entryPoint = new FormAuthenticationEntryPoint($httpKernel, $httpUtils, '/the/login/path', false);

        $this->assertEquals($response, $entryPoint->start($request));
    }

    public function testStartWithUseForward()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);
        $subRequest = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);
        $response = new \Symfony\Component\HttpFoundation\Response('', 200);

        $httpUtils = $this->getMock('Symfony\Component\Security\Http\HttpUtils');
        $httpUtils
            ->expects($this->once())
            ->method('createRequest')
            ->with($this->equalTo($request), $this->equalTo('/the/login/path'))
            ->will($this->returnValue($subRequest))
        ;

        $httpKernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $httpKernel
            ->expects($this->once())
            ->method('handle')
            ->with($this->equalTo($subRequest), $this->equalTo(HttpKernelInterface::SUB_REQUEST))
            ->will($this->returnValue($response))
        ;

        $entryPoint = new FormAuthenticationEntryPoint($httpKernel, $httpUtils, '/the/login/path', true);

        $entryPointResponse = $entryPoint->start($request);

        $this->assertEquals($response, $entryPointResponse);
        $this->assertEquals(401, $entryPointResponse->headers->get('X-Status-Code'));
    }
}
PK�b�\GrT�		jpear/test/Security/Symfony/Component/Security/Http/Tests/EntryPoint/DigestAuthenticationEntryPointTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\EntryPoint;

use Symfony\Component\Security\Http\EntryPoint\DigestAuthenticationEntryPoint;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\NonceExpiredException;

class DigestAuthenticationEntryPointTest extends \PHPUnit_Framework_TestCase
{
    public function testStart()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');

        $authenticationException = new AuthenticationException('TheAuthenticationExceptionMessage');

        $entryPoint = new DigestAuthenticationEntryPoint('TheRealmName', 'TheKey');
        $response = $entryPoint->start($request, $authenticationException);

        $this->assertEquals(401, $response->getStatusCode());
        $this->assertRegExp('/^Digest realm="TheRealmName", qop="auth", nonce="[a-zA-Z0-9\/+]+={0,2}"$/', $response->headers->get('WWW-Authenticate'));
    }

    public function testStartWithNoException()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');

        $entryPoint = new DigestAuthenticationEntryPoint('TheRealmName', 'TheKey');
        $response = $entryPoint->start($request);

        $this->assertEquals(401, $response->getStatusCode());
        $this->assertRegExp('/^Digest realm="TheRealmName", qop="auth", nonce="[a-zA-Z0-9\/+]+={0,2}"$/', $response->headers->get('WWW-Authenticate'));
    }

    public function testStartWithNonceExpiredException()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');

        $nonceExpiredException = new NonceExpiredException('TheNonceExpiredExceptionMessage');

        $entryPoint = new DigestAuthenticationEntryPoint('TheRealmName', 'TheKey');
        $response = $entryPoint->start($request, $nonceExpiredException);

        $this->assertEquals(401, $response->getStatusCode());
        $this->assertRegExp('/^Digest realm="TheRealmName", qop="auth", nonce="[a-zA-Z0-9\/+]+={0,2}", stale="true"$/', $response->headers->get('WWW-Authenticate'));
    }
}
PK�b�\e���ipear/test/Security/Symfony/Component/Security/Http/Tests/EntryPoint/BasicAuthenticationEntryPointTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\EntryPoint;

use Symfony\Component\Security\Http\EntryPoint\BasicAuthenticationEntryPoint;
use Symfony\Component\Security\Core\Exception\AuthenticationException;

class BasicAuthenticationEntryPointTest extends \PHPUnit_Framework_TestCase
{
    public function testStart()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');

        $authException = new AuthenticationException('The exception message');

        $entryPoint = new BasicAuthenticationEntryPoint('TheRealmName');
        $response = $entryPoint->start($request, $authException);

        $this->assertEquals('Basic realm="TheRealmName"', $response->headers->get('WWW-Authenticate'));
        $this->assertEquals(401, $response->getStatusCode());
    }

    public function testStartWithoutAuthException()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');

        $entryPoint = new BasicAuthenticationEntryPoint('TheRealmName');

        $response = $entryPoint->start($request);

        $this->assertEquals('Basic realm="TheRealmName"', $response->headers->get('WWW-Authenticate'));
        $this->assertEquals(401, $response->getStatusCode());
    }
}
PK�b�\-Ɔ��ipear/test/Security/Symfony/Component/Security/Http/Tests/EntryPoint/RetryAuthenticationEntryPointTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\EntryPoint;

use Symfony\Component\Security\Http\EntryPoint\RetryAuthenticationEntryPoint;
use Symfony\Component\HttpFoundation\Request;

class RetryAuthenticationEntryPointTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider dataForStart
     */
    public function testStart($httpPort, $httpsPort, $request, $expectedUrl)
    {
        $entryPoint = new RetryAuthenticationEntryPoint($httpPort, $httpsPort);
        $response = $entryPoint->start($request);

        $this->assertInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse', $response);
        $this->assertEquals($expectedUrl, $response->headers->get('Location'));
    }

    public function dataForStart()
    {
        if (!class_exists('Symfony\Component\HttpFoundation\Request')) {
            return array(array());
        }

        return array(
            array(
                80,
                443,
                Request::create('http://localhost/foo/bar?baz=bat'),
                'https://localhost/foo/bar?baz=bat'
            ),
            array(
                80,
                443,
                Request::create('https://localhost/foo/bar?baz=bat'),
                'http://localhost/foo/bar?baz=bat'
            ),
            array(
                80,
                123,
                Request::create('http://localhost/foo/bar?baz=bat'),
                'https://localhost:123/foo/bar?baz=bat'
            ),
            array(
                8080,
                443,
                Request::create('https://localhost/foo/bar?baz=bat'),
                'http://localhost:8080/foo/bar?baz=bat'
            )
        );
    }
}
PK�b�\/w!w!kpear/test/Security/Symfony/Component/Security/Http/Tests/Authentication/SimpleAuthenticationHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests;

use Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Http\Authentication\SimpleAuthenticationHandler;

class SimpleAuthenticationHandlerTest extends \PHPUnit_Framework_TestCase
{
    private $successHandler;

    private $failureHandler;

    private $request;

    private $token;

    private $authenticationException;

    private $response;

    public function setUp()
    {
        $this->successHandler = $this->getMock('Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface');
        $this->failureHandler = $this->getMock('Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface');

        $this->request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $this->token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $this->authenticationException = $this->getMock('Symfony\Component\Security\Core\Exception\AuthenticationException');

        $this->response = $this->getMock('Symfony\Component\HttpFoundation\Response');
    }

    public function testOnAuthenticationSuccessFallsBackToDefaultHandlerIfSimpleIsNotASuccessHandler()
    {
        $authenticator = $this->getMock('Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface');

        $this->successHandler->expects($this->once())
            ->method('onAuthenticationSuccess')
            ->with($this->request, $this->token)
            ->will($this->returnValue($this->response));

        $handler = new SimpleAuthenticationHandler($authenticator, $this->successHandler, $this->failureHandler);
        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($this->response, $result);
    }

    public function testOnAuthenticationSuccessCallsSimpleAuthenticator()
    {
        $this->successHandler->expects($this->never())
            ->method('onAuthenticationSuccess');

        $authenticator = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Tests\TestSuccessHandlerInterface');
        $authenticator->expects($this->once())
            ->method('onAuthenticationSuccess')
            ->with($this->request, $this->token)
            ->will($this->returnValue($this->response));

        $handler = new SimpleAuthenticationHandler($authenticator, $this->successHandler, $this->failureHandler);
        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($this->response, $result);
    }

    /**
     * @expectedException        \UnexpectedValueException
     * @expectedExceptionMessage onAuthenticationSuccess method must return null to use the default success handler, or a Response object
     */
    public function testOnAuthenticationSuccessThrowsAnExceptionIfNonResponseIsReturned()
    {
        $this->successHandler->expects($this->never())
            ->method('onAuthenticationSuccess');

        $authenticator = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Tests\TestSuccessHandlerInterface');
        $authenticator->expects($this->once())
            ->method('onAuthenticationSuccess')
            ->with($this->request, $this->token)
            ->will($this->returnValue(new \stdClass()));

        $handler = new SimpleAuthenticationHandler($authenticator, $this->successHandler, $this->failureHandler);
        $handler->onAuthenticationSuccess($this->request, $this->token);
    }

    public function testOnAuthenticationSuccessFallsBackToDefaultHandlerIfNullIsReturned()
    {
        $this->successHandler->expects($this->once())
            ->method('onAuthenticationSuccess')
            ->with($this->request, $this->token)
            ->will($this->returnValue($this->response));

        $authenticator = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Tests\TestSuccessHandlerInterface');
        $authenticator->expects($this->once())
            ->method('onAuthenticationSuccess')
            ->with($this->request, $this->token)
            ->will($this->returnValue(null));

        $handler = new SimpleAuthenticationHandler($authenticator, $this->successHandler, $this->failureHandler);
        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($this->response, $result);
    }

    public function testOnAuthenticationFailureFallsBackToDefaultHandlerIfSimpleIsNotAFailureHandler()
    {
        $authenticator = $this->getMock('Symfony\Component\Security\Core\Authentication\SimpleAuthenticatorInterface');

        $this->failureHandler->expects($this->once())
            ->method('onAuthenticationFailure')
            ->with($this->request, $this->authenticationException)
            ->will($this->returnValue($this->response));

        $handler = new SimpleAuthenticationHandler($authenticator, $this->successHandler, $this->failureHandler);
        $result = $handler->onAuthenticationFailure($this->request, $this->authenticationException);

        $this->assertSame($this->response, $result);
    }

    public function testOnAuthenticationFailureCallsSimpleAuthenticator()
    {
        $this->failureHandler->expects($this->never())
            ->method('onAuthenticationFailure');

        $authenticator = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Tests\TestFailureHandlerInterface');
        $authenticator->expects($this->once())
            ->method('onAuthenticationFailure')
            ->with($this->request, $this->authenticationException)
            ->will($this->returnValue($this->response));

        $handler = new SimpleAuthenticationHandler($authenticator, $this->successHandler, $this->failureHandler);
        $result = $handler->onAuthenticationFailure($this->request, $this->authenticationException);

        $this->assertSame($this->response, $result);
    }

    /**
     * @expectedException        \UnexpectedValueException
     * @expectedExceptionMessage onAuthenticationFailure method must return null to use the default failure handler, or a Response object
     */
    public function testOnAuthenticationFailureThrowsAnExceptionIfNonResponseIsReturned()
    {
        $this->failureHandler->expects($this->never())
            ->method('onAuthenticationFailure');

        $authenticator = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Tests\TestFailureHandlerInterface');
        $authenticator->expects($this->once())
            ->method('onAuthenticationFailure')
            ->with($this->request, $this->authenticationException)
            ->will($this->returnValue(new \stdClass()));

        $handler = new SimpleAuthenticationHandler($authenticator, $this->successHandler, $this->failureHandler);
        $handler->onAuthenticationFailure($this->request, $this->authenticationException);
    }

    public function testOnAuthenticationFailureFallsBackToDefaultHandlerIfNullIsReturned()
    {
        $this->failureHandler->expects($this->once())
            ->method('onAuthenticationFailure')
            ->with($this->request, $this->authenticationException)
            ->will($this->returnValue($this->response));

        $authenticator = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Tests\TestFailureHandlerInterface');
        $authenticator->expects($this->once())
            ->method('onAuthenticationFailure')
            ->with($this->request, $this->authenticationException)
            ->will($this->returnValue(null));

        $handler = new SimpleAuthenticationHandler($authenticator, $this->successHandler, $this->failureHandler);
        $result = $handler->onAuthenticationFailure($this->request, $this->authenticationException);

        $this->assertSame($this->response, $result);
    }
}

interface TestSuccessHandlerInterface extends AuthenticationSuccessHandlerInterface, SimpleAuthenticatorInterface
{
}

interface TestFailureHandlerInterface extends AuthenticationFailureHandlerInterface, SimpleAuthenticatorInterface
{
}
PK�b�\$a��spear/test/Security/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationFailureHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Authentication;

use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationFailureHandler;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class DefaultAuthenticationFailureHandlerTest extends \PHPUnit_Framework_TestCase
{
    private $httpKernel = null;

    private $httpUtils = null;

    private $logger = null;

    private $request = null;

    private $session = null;

    private $exception = null;

    protected function setUp()
    {
        $this->httpKernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $this->httpUtils = $this->getMock('Symfony\Component\Security\Http\HttpUtils');
        $this->logger = $this->getMock('Psr\Log\LoggerInterface');

        $this->session = $this->getMock('Symfony\Component\HttpFoundation\Session\SessionInterface');
        $this->request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $this->request->expects($this->any())->method('getSession')->will($this->returnValue($this->session));
        $this->exception = $this->getMock('Symfony\Component\Security\Core\Exception\AuthenticationException');
    }

    public function testForward()
    {
        $options = array('failure_forward' => true);

        $subRequest = $this->getRequest();
        $subRequest->attributes->expects($this->once())
            ->method('set')->with(SecurityContextInterface::AUTHENTICATION_ERROR, $this->exception);
        $this->httpUtils->expects($this->once())
            ->method('createRequest')->with($this->request, '/login')
            ->will($this->returnValue($subRequest));

        $response = $this->getMock('Symfony\Component\HttpFoundation\Response');
        $this->httpKernel->expects($this->once())
            ->method('handle')->with($subRequest, HttpKernelInterface::SUB_REQUEST)
            ->will($this->returnValue($response));

        $handler = new DefaultAuthenticationFailureHandler($this->httpKernel, $this->httpUtils, $options, $this->logger);
        $result = $handler->onAuthenticationFailure($this->request, $this->exception);

        $this->assertSame($response, $result);
    }

    public function testRedirect()
    {
        $response = $this->getMock('Symfony\Component\HttpFoundation\Response');
        $this->httpUtils->expects($this->once())
            ->method('createRedirectResponse')->with($this->request, '/login')
            ->will($this->returnValue($response));

        $handler = new DefaultAuthenticationFailureHandler($this->httpKernel, $this->httpUtils, array(), $this->logger);
        $result = $handler->onAuthenticationFailure($this->request, $this->exception);

        $this->assertSame($response, $result);
    }

    public function testExceptionIsPersistedInSession()
    {
        $this->session->expects($this->once())
            ->method('set')->with(SecurityContextInterface::AUTHENTICATION_ERROR, $this->exception);

        $handler = new DefaultAuthenticationFailureHandler($this->httpKernel, $this->httpUtils, array(), $this->logger);
        $handler->onAuthenticationFailure($this->request, $this->exception);
    }

    public function testExceptionIsPassedInRequestOnForward()
    {
        $options = array('failure_forward' => true);

        $subRequest = $this->getRequest();
        $subRequest->attributes->expects($this->once())
            ->method('set')->with(SecurityContextInterface::AUTHENTICATION_ERROR, $this->exception);

        $this->httpUtils->expects($this->once())
            ->method('createRequest')->with($this->request, '/login')
            ->will($this->returnValue($subRequest));

        $this->session->expects($this->never())->method('set');

        $handler = new DefaultAuthenticationFailureHandler($this->httpKernel, $this->httpUtils, $options, $this->logger);
        $handler->onAuthenticationFailure($this->request, $this->exception);
    }

    public function testRedirectIsLogged()
    {
        $this->logger->expects($this->once())->method('debug')->with('Redirecting to /login');

        $handler = new DefaultAuthenticationFailureHandler($this->httpKernel, $this->httpUtils, array(), $this->logger);
        $handler->onAuthenticationFailure($this->request, $this->exception);
    }

    public function testForwardIsLogged()
    {
        $options = array('failure_forward' => true);

        $this->httpUtils->expects($this->once())
            ->method('createRequest')->with($this->request, '/login')
            ->will($this->returnValue($this->getRequest()));

        $this->logger->expects($this->once())->method('debug')->with('Forwarding to /login');

        $handler = new DefaultAuthenticationFailureHandler($this->httpKernel, $this->httpUtils, $options, $this->logger);
        $handler->onAuthenticationFailure($this->request, $this->exception);
    }

    public function testFailurePathCanBeOverwritten()
    {
        $options = array('failure_path' => '/auth/login');

        $this->httpUtils->expects($this->once())
            ->method('createRedirectResponse')->with($this->request, '/auth/login');

        $handler = new DefaultAuthenticationFailureHandler($this->httpKernel, $this->httpUtils, $options, $this->logger);
        $handler->onAuthenticationFailure($this->request, $this->exception);
    }

    public function testFailurePathCanBeOverwrittenWithRequest()
    {
        $this->request->expects($this->once())
            ->method('get')->with('_failure_path', null, true)
            ->will($this->returnValue('/auth/login'));

        $this->httpUtils->expects($this->once())
            ->method('createRedirectResponse')->with($this->request, '/auth/login');

        $handler = new DefaultAuthenticationFailureHandler($this->httpKernel, $this->httpUtils, array(), $this->logger);
        $handler->onAuthenticationFailure($this->request, $this->exception);
    }

    public function testFailurePathParameterCanBeOverwritten()
    {
        $options = array('failure_path_parameter' => '_my_failure_path');

        $this->request->expects($this->once())
            ->method('get')->with('_my_failure_path', null, true)
            ->will($this->returnValue('/auth/login'));

        $this->httpUtils->expects($this->once())
            ->method('createRedirectResponse')->with($this->request, '/auth/login');

        $handler = new DefaultAuthenticationFailureHandler($this->httpKernel, $this->httpUtils, $options, $this->logger);
        $handler->onAuthenticationFailure($this->request, $this->exception);
    }

    private function getRequest()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $request->attributes = $this->getMock('Symfony\Component\HttpFoundation\ParameterBag');

        return $request;
    }
}
PK�b�\id]z��spear/test/Security/Symfony/Component/Security/Http/Tests/Authentication/DefaultAuthenticationSuccessHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Authentication;

use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler;

class DefaultAuthenticationSuccessHandlerTest extends \PHPUnit_Framework_TestCase
{
    private $httpUtils = null;

    private $request = null;

    private $token = null;

    protected function setUp()
    {
        $this->httpUtils = $this->getMock('Symfony\Component\Security\Http\HttpUtils');
        $this->request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $this->request->headers = $this->getMock('Symfony\Component\HttpFoundation\HeaderBag');
        $this->token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
    }

    public function testRequestIsRedirected()
    {
        $response = $this->expectRedirectResponse('/');

        $handler = new DefaultAuthenticationSuccessHandler($this->httpUtils, array());
        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($response, $result);
    }

    public function testDefaultTargetPathCanBeForced()
    {
        $options = array(
            'always_use_default_target_path' => true,
            'default_target_path' => '/dashboard'
        );

        $response = $this->expectRedirectResponse('/dashboard');

        $handler = new DefaultAuthenticationSuccessHandler($this->httpUtils, $options);
        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($response, $result);
    }

    public function testTargetPathIsPassedWithRequest()
    {
        $this->request->expects($this->once())
            ->method('get')->with('_target_path')
            ->will($this->returnValue('/dashboard'));

        $response = $this->expectRedirectResponse('/dashboard');

        $handler = new DefaultAuthenticationSuccessHandler($this->httpUtils, array());
        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($response, $result);
    }

    public function testTargetPathParameterIsCustomised()
    {
        $options = array('target_path_parameter' => '_my_target_path');

        $this->request->expects($this->once())
            ->method('get')->with('_my_target_path')
            ->will($this->returnValue('/dashboard'));

        $response = $this->expectRedirectResponse('/dashboard');

        $handler = new DefaultAuthenticationSuccessHandler($this->httpUtils, $options);
        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($response, $result);
    }

    public function testTargetPathIsTakenFromTheSession()
    {
        $session = $this->getMock('Symfony\Component\HttpFoundation\Session\SessionInterface');
        $session->expects($this->once())
            ->method('get')->with('_security.admin.target_path')
            ->will($this->returnValue('/admin/dashboard'));
        $session->expects($this->once())
            ->method('remove')->with('_security.admin.target_path');

        $this->request->expects($this->any())
            ->method('getSession')
            ->will($this->returnValue($session));

        $response = $this->expectRedirectResponse('/admin/dashboard');

        $handler = new DefaultAuthenticationSuccessHandler($this->httpUtils, array());
        $handler->setProviderKey('admin');

        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($response, $result);
    }

    public function testTargetPathIsPassedAsReferer()
    {
        $options = array('use_referer' => true);

        $this->request->headers->expects($this->once())
            ->method('get')->with('Referer')
            ->will($this->returnValue('/dashboard'));

        $response = $this->expectRedirectResponse('/dashboard');

        $handler = new DefaultAuthenticationSuccessHandler($this->httpUtils, $options);
        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($response, $result);
    }

    public function testRefererHasToBeDifferentThatLoginUrl()
    {
        $options = array('use_referer' => true);

        $this->request->headers->expects($this->any())
            ->method('get')->with('Referer')
            ->will($this->returnValue('/login'));

        $this->httpUtils->expects($this->once())
            ->method('generateUri')->with($this->request, '/login')
            ->will($this->returnValue('/login'));

        $response = $this->expectRedirectResponse('/');

        $handler = new DefaultAuthenticationSuccessHandler($this->httpUtils, $options);
        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($response, $result);
    }

    public function testRefererTargetPathIsIgnoredByDefault()
    {
        $this->request->headers->expects($this->never())->method('get');

        $response = $this->expectRedirectResponse('/');

        $handler = new DefaultAuthenticationSuccessHandler($this->httpUtils, array());
        $result = $handler->onAuthenticationSuccess($this->request, $this->token);

        $this->assertSame($response, $result);
    }

    private function expectRedirectResponse($path)
    {
        $response = $this->getMock('Symfony\Component\HttpFoundation\Response');

        $this->httpUtils->expects($this->once())
            ->method('createRedirectResponse')
            ->with($this->request, $path)
            ->will($this->returnValue($response));

        return $response;
    }
}
PK�b�\��+MbbLpear/test/Security/Symfony/Component/Security/Http/Tests/FirewallMapTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests;

use Symfony\Component\Security\Http\FirewallMap;
use Symfony\Component\HttpFoundation\Request;

class FirewallMapTest extends \PHPUnit_Framework_TestCase
{
    public function testGetListeners()
    {
        $map = new FirewallMap();

        $request = new Request();

        $notMatchingMatcher = $this->getMock('Symfony\Component\HttpFoundation\RequestMatcher');
        $notMatchingMatcher
            ->expects($this->once())
            ->method('matches')
            ->with($this->equalTo($request))
            ->will($this->returnValue(false))
        ;

        $map->add($notMatchingMatcher, array($this->getMock('Symfony\Component\Security\Http\Firewall\ListenerInterface')));

        $matchingMatcher = $this->getMock('Symfony\Component\HttpFoundation\RequestMatcher');
        $matchingMatcher
            ->expects($this->once())
            ->method('matches')
            ->with($this->equalTo($request))
            ->will($this->returnValue(true))
        ;
        $theListener = $this->getMock('Symfony\Component\Security\Http\Firewall\ListenerInterface');
        $theException = $this->getMock('Symfony\Component\Security\Http\Firewall\ExceptionListener', array(), array(), '', false);

        $map->add($matchingMatcher, array($theListener), $theException);

        $tooLateMatcher = $this->getMock('Symfony\Component\HttpFoundation\RequestMatcher');
        $tooLateMatcher
            ->expects($this->never())
            ->method('matches')
        ;

        $map->add($tooLateMatcher, array($this->getMock('Symfony\Component\Security\Http\Firewall\ListenerInterface')));

        list($listeners, $exception) = $map->getListeners($request);

        $this->assertEquals(array($theListener), $listeners);
        $this->assertEquals($theException, $exception);
    }

    public function testGetListenersWithAnEntryHavingNoRequestMatcher()
    {
        $map = new FirewallMap();

        $request = new Request();

        $notMatchingMatcher = $this->getMock('Symfony\Component\HttpFoundation\RequestMatcher');
        $notMatchingMatcher
            ->expects($this->once())
            ->method('matches')
            ->with($this->equalTo($request))
            ->will($this->returnValue(false))
        ;

        $map->add($notMatchingMatcher, array($this->getMock('Symfony\Component\Security\Http\Firewall\ListenerInterface')));

        $theListener = $this->getMock('Symfony\Component\Security\Http\Firewall\ListenerInterface');
        $theException = $this->getMock('Symfony\Component\Security\Http\Firewall\ExceptionListener', array(), array(), '', false);

        $map->add(null, array($theListener), $theException);

        $tooLateMatcher = $this->getMock('Symfony\Component\HttpFoundation\RequestMatcher');
        $tooLateMatcher
            ->expects($this->never())
            ->method('matches')
        ;

        $map->add($tooLateMatcher, array($this->getMock('Symfony\Component\Security\Http\Firewall\ListenerInterface')));

        list($listeners, $exception) = $map->getListeners($request);

        $this->assertEquals(array($theListener), $listeners);
        $this->assertEquals($theException, $exception);
    }

    public function testGetListenersWithNoMatchingEntry()
    {
        $map = new FirewallMap();

        $request = new Request();

        $notMatchingMatcher = $this->getMock('Symfony\Component\HttpFoundation\RequestMatcher');
        $notMatchingMatcher
            ->expects($this->once())
            ->method('matches')
            ->with($this->equalTo($request))
            ->will($this->returnValue(false))
        ;

        $map->add($notMatchingMatcher, array($this->getMock('Symfony\Component\Security\Http\Firewall\ListenerInterface')));

        list($listeners, $exception) = $map->getListeners($request);

        $this->assertEquals(array(), $listeners);
        $this->assertNull($exception);
    }
}
PK�b�\]�ͷ��\pear/test/Security/Symfony/Component/Security/Http/Tests/Logout/SessionLogoutHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Logout;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Logout\SessionLogoutHandler;

class SessionLogoutHandlerTest extends \PHPUnit_Framework_TestCase
{
    public function testLogout()
    {
        $handler = new SessionLogoutHandler();

        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $response = new Response();
        $session = $this->getMock('Symfony\Component\HttpFoundation\Session\Session', array(), array(), '', false);

        $request
            ->expects($this->once())
            ->method('getSession')
            ->will($this->returnValue($session))
        ;

        $session
            ->expects($this->once())
            ->method('invalidate')
        ;

        $handler->logout($request, $response, $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
    }
}
PK�b�\k��cpear/test/Security/Symfony/Component/Security/Http/Tests/Logout/CookieClearingLogoutHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Logout;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Logout\CookieClearingLogoutHandler;

class CookieClearingLogoutHandlerTest extends \PHPUnit_Framework_TestCase
{
    public function testLogout()
    {
        $request = new Request();
        $response = new Response();
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');

        $handler = new CookieClearingLogoutHandler(array('foo' => array('path' => '/foo', 'domain' => 'foo.foo'), 'foo2' => array('path' => null, 'domain' => null)));

        $cookies = $response->headers->getCookies();
        $this->assertCount(0, $cookies);

        $handler->logout($request, $response, $token);

        $cookies = $response->headers->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
        $this->assertCount(2, $cookies);

        $cookie = $cookies['foo.foo']['/foo']['foo'];
        $this->assertEquals('foo', $cookie->getName());
        $this->assertEquals('/foo', $cookie->getPath());
        $this->assertEquals('foo.foo', $cookie->getDomain());
        $this->assertTrue($cookie->isCleared());

        $cookie = $cookies['']['/']['foo2'];
        $this->assertStringStartsWith('foo2', $cookie->getName());
        $this->assertEquals('/', $cookie->getPath());
        $this->assertNull($cookie->getDomain());
        $this->assertTrue($cookie->isCleared());
    }
}
PK�b�\�
{{cpear/test/Security/Symfony/Component/Security/Http/Tests/Logout/DefaultLogoutSuccessHandlerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Logout;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Logout\DefaultLogoutSuccessHandler;

class DefaultLogoutSuccessHandlerTest extends \PHPUnit_Framework_TestCase
{
    public function testLogout()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $response = $this->getMock('Symfony\Component\HttpFoundation\Response');

        $httpUtils = $this->getMock('Symfony\Component\Security\Http\HttpUtils');
        $httpUtils->expects($this->once())
            ->method('createRedirectResponse')
            ->with($request, '/dashboard')
            ->will($this->returnValue($response));

        $handler = new DefaultLogoutSuccessHandler($httpUtils, '/dashboard');
        $result = $handler->onLogoutSuccess($request);

        $this->assertSame($response, $result);
    }
}
PK�b�\���@&@&\pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/SwitchUserListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\Security\Http\Firewall\SwitchUserListener;

class SwitchUserListenerTest extends \PHPUnit_Framework_TestCase
{
    private $securityContext;

    private $userProvider;

    private $userChecker;

    private $accessDecisionManager;

    private $request;

    private $event;

    protected function setUp()
    {
        $this->securityContext = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $this->userProvider = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
        $this->userChecker = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
        $this->accessDecisionManager = $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface');
        $this->request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $this->request->query = $this->getMock('Symfony\Component\HttpFoundation\ParameterBag');
        $this->request->server = $this->getMock('Symfony\Component\HttpFoundation\ServerBag');
        $this->event = $this->getEvent($this->request);
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage $providerKey must not be empty
     */
    public function testProviderKeyIsRequired()
    {
        new SwitchUserListener($this->securityContext, $this->userProvider, $this->userChecker, '', $this->accessDecisionManager);
    }

    public function testEventIsIgnoredIfUsernameIsNotPassedWithTheRequest()
    {
        $this->request->expects($this->any())->method('get')->with('_switch_user')->will($this->returnValue(null));

        $this->event->expects($this->never())->method('setResponse');
        $this->securityContext->expects($this->never())->method('setToken');

        $listener = new SwitchUserListener($this->securityContext, $this->userProvider, $this->userChecker, 'provider123', $this->accessDecisionManager);
        $listener->handle($this->event);
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException
     */
    public function testExitUserThrowsAuthenticationExceptionIfOriginalTokenCannotBeFound()
    {
        $token = $this->getToken(array($this->getMock('Symfony\Component\Security\Core\Role\RoleInterface')));

        $this->securityContext->expects($this->any())->method('getToken')->will($this->returnValue($token));
        $this->request->expects($this->any())->method('get')->with('_switch_user')->will($this->returnValue('_exit'));

        $listener = new SwitchUserListener($this->securityContext, $this->userProvider, $this->userChecker, 'provider123', $this->accessDecisionManager);
        $listener->handle($this->event);
    }

    public function testExitUserUpdatesToken()
    {
        $originalToken = $this->getToken();
        $role = $this->getMockBuilder('Symfony\Component\Security\Core\Role\SwitchUserRole')
            ->disableOriginalConstructor()
            ->getMock();
        $role->expects($this->any())->method('getSource')->will($this->returnValue($originalToken));

        $this->securityContext->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue($this->getToken(array($role))));

        $this->request->expects($this->any())->method('get')->with('_switch_user')->will($this->returnValue('_exit'));
        $this->request->expects($this->any())->method('getUri')->will($this->returnValue('/'));
        $this->request->query->expects($this->once())->method('remove','_switch_user');
        $this->request->query->expects($this->any())->method('all')->will($this->returnValue(array()));
        $this->request->server->expects($this->once())->method('set')->with('QUERY_STRING', '');

        $this->securityContext->expects($this->once())
            ->method('setToken')->with($originalToken);
        $this->event->expects($this->once())
            ->method('setResponse')->with($this->isInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse'));

        $listener = new SwitchUserListener($this->securityContext, $this->userProvider, $this->userChecker, 'provider123', $this->accessDecisionManager);
        $listener->handle($this->event);
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AccessDeniedException
     */
    public function testSwitchUserIsDissallowed()
    {
        $token = $this->getToken(array($this->getMock('Symfony\Component\Security\Core\Role\RoleInterface')));

        $this->securityContext->expects($this->any())->method('getToken')->will($this->returnValue($token));
        $this->request->expects($this->any())->method('get')->with('_switch_user')->will($this->returnValue('kuba'));

        $this->accessDecisionManager->expects($this->once())
            ->method('decide')->with($token, array('ROLE_ALLOWED_TO_SWITCH'))
            ->will($this->returnValue(false));

        $listener = new SwitchUserListener($this->securityContext, $this->userProvider, $this->userChecker, 'provider123', $this->accessDecisionManager);
        $listener->handle($this->event);
    }

    public function testSwitchUser()
    {
        $token = $this->getToken(array($this->getMock('Symfony\Component\Security\Core\Role\RoleInterface')));
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user->expects($this->any())->method('getRoles')->will($this->returnValue(array()));

        $this->securityContext->expects($this->any())->method('getToken')->will($this->returnValue($token));
        $this->request->expects($this->any())->method('get')->with('_switch_user')->will($this->returnValue('kuba'));
        $this->request->query->expects($this->once())->method('remove','_switch_user');
        $this->request->query->expects($this->any())->method('all')->will($this->returnValue(array()));

        $this->request->expects($this->any())->method('getUri')->will($this->returnValue('/'));
        $this->request->server->expects($this->once())->method('set')->with('QUERY_STRING', '');

        $this->accessDecisionManager->expects($this->once())
            ->method('decide')->with($token, array('ROLE_ALLOWED_TO_SWITCH'))
            ->will($this->returnValue(true));

        $this->userProvider->expects($this->once())
            ->method('loadUserByUsername')->with('kuba')
            ->will($this->returnValue($user));
        $this->userChecker->expects($this->once())
            ->method('checkPostAuth')->with($user);
        $this->securityContext->expects($this->once())
            ->method('setToken')->with($this->isInstanceOf('Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken'));

        $listener = new SwitchUserListener($this->securityContext, $this->userProvider, $this->userChecker, 'provider123', $this->accessDecisionManager);
        $listener->handle($this->event);
    }

    public function testSwitchUserKeepsOtherQueryStringParameters()
    {
        $token = $this->getToken(array($this->getMock('Symfony\Component\Security\Core\Role\RoleInterface')));
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user->expects($this->any())->method('getRoles')->will($this->returnValue(array()));

        $this->securityContext->expects($this->any())->method('getToken')->will($this->returnValue($token));
        $this->request->expects($this->any())->method('get')->with('_switch_user')->will($this->returnValue('kuba'));
        $this->request->query->expects($this->once())->method('remove','_switch_user');
        $this->request->query->expects($this->any())->method('all')->will($this->returnValue(array('page'=>3,'section'=>2)));
        $this->request->expects($this->any())->method('getUri')->will($this->returnValue('/'));
        $this->request->server->expects($this->once())->method('set')->with('QUERY_STRING', 'page=3&section=2');

        $this->accessDecisionManager->expects($this->once())
            ->method('decide')->with($token, array('ROLE_ALLOWED_TO_SWITCH'))
            ->will($this->returnValue(true));

        $this->userProvider->expects($this->once())
            ->method('loadUserByUsername')->with('kuba')
            ->will($this->returnValue($user));
        $this->userChecker->expects($this->once())
            ->method('checkPostAuth')->with($user);
        $this->securityContext->expects($this->once())
            ->method('setToken')->with($this->isInstanceOf('Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken'));

        $listener = new SwitchUserListener($this->securityContext, $this->userProvider, $this->userChecker, 'provider123', $this->accessDecisionManager);
        $listener->handle($this->event);
    }

    private function getEvent($request)
    {
        $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')
            ->disableOriginalConstructor()
            ->getMock();

        $event->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request));

        return $event;
    }

    private function getToken(array $roles = array())
    {
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token->expects($this->any())
            ->method('getRoles')
            ->will($this->returnValue($roles));

        return $token;
    }
}
PK�b�\��K�$$epear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/BasicAuthenticationListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Firewall\BasicAuthenticationListener;
use Symfony\Component\Security\Core\Authentication\AuthenticationProviderManager;

class BasicAuthenticationListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testHandleWithValidUsernameAndPasswordServerParameters()
    {
        $request = new Request(array(), array(), array(), array(), array(), array(
            'PHP_AUTH_USER' => 'TheUsername',
            'PHP_AUTH_PW'   => 'ThePassword'
        ));

        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue(null))
        ;
        $context
            ->expects($this->once())
            ->method('setToken')
            ->with($this->equalTo($token))
        ;

        $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
        $authenticationManager
            ->expects($this->once())
            ->method('authenticate')
            ->with($this->isInstanceOf('Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken'))
            ->will($this->returnValue($token))
        ;

        $listener = new BasicAuthenticationListener(
            $context,
            $authenticationManager,
            'TheProviderKey',
            $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface')
        );

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }

    public function testHandleWhenAuthenticationFails()
    {
        $request = new Request(array(), array(), array(), array(), array(), array(
            'PHP_AUTH_USER' => 'TheUsername',
            'PHP_AUTH_PW'   => 'ThePassword'
        ));

        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue(null))
        ;
        $context
            ->expects($this->never())
            ->method('setToken')
        ;

        $response = new Response();

        $authenticationEntryPoint = $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface');
        $authenticationEntryPoint
            ->expects($this->any())
            ->method('start')
            ->with($this->equalTo($request), $this->isInstanceOf('Symfony\Component\Security\Core\Exception\AuthenticationException'))
            ->will($this->returnValue($response))
        ;

        $listener = new BasicAuthenticationListener(
            $context,
            new AuthenticationProviderManager(array($this->getMock('Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface'))),
            'TheProviderKey',
            $authenticationEntryPoint
        );

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;
        $event
            ->expects($this->once())
            ->method('setResponse')
            ->with($this->equalTo($response))
        ;

        $listener->handle($event);
    }

    public function testHandleWithNoUsernameServerParameter()
    {
        $request = new Request();

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->never())
            ->method('getToken')
        ;

        $listener = new BasicAuthenticationListener(
            $context,
            $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'),
            'TheProviderKey',
            $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface')
        );

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }

    public function testHandleWithASimilarAuthenticatedToken()
    {
        $request = new Request(array(), array(), array(), array(), array(), array('PHP_AUTH_USER' => 'TheUsername'));

        $token = new UsernamePasswordToken('TheUsername', 'ThePassword', 'TheProviderKey', array('ROLE_FOO'));

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue($token))
        ;

        $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
        $authenticationManager
            ->expects($this->never())
            ->method('authenticate')
        ;

        $listener = new BasicAuthenticationListener(
            $context,
            $authenticationManager,
            'TheProviderKey',
            $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface')
        );

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage $providerKey must not be empty
     */
    public function testItRequiresProviderKey()
    {
        new BasicAuthenticationListener(
            $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface'),
            $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'),
            '',
            $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface')
        );
    }

    public function testHandleWithADifferentAuthenticatedToken()
    {
        $request = new Request(array(), array(), array(), array(), array(), array(
            'PHP_AUTH_USER' => 'TheUsername',
            'PHP_AUTH_PW'   => 'ThePassword'
        ));

        $token = new PreAuthenticatedToken('TheUser', 'TheCredentials', 'TheProviderKey', array('ROLE_FOO'));

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue($token))
        ;
        $context
            ->expects($this->never())
            ->method('setToken')
        ;

        $response = new Response();

        $authenticationEntryPoint = $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface');
        $authenticationEntryPoint
            ->expects($this->any())
            ->method('start')
            ->with($this->equalTo($request), $this->isInstanceOf('Symfony\Component\Security\Core\Exception\AuthenticationException'))
            ->will($this->returnValue($response))
        ;

        $listener = new BasicAuthenticationListener(
            $context,
            new AuthenticationProviderManager(array($this->getMock('Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface'))),
            'TheProviderKey',
            $authenticationEntryPoint
        );

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;
        $event
            ->expects($this->once())
            ->method('setResponse')
            ->with($this->equalTo($response))
        ;

        $listener->handle($event);
    }
}
PK�b�\Ғ)��\pear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/RememberMeListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\Firewall\RememberMeListener;
use Symfony\Component\HttpFoundation\Request;

class RememberMeListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testOnCoreSecurityDoesNotTryToPopulateNonEmptySecurityContext()
    {
        list($listener, $context, $service,,) = $this->getListener();

        $context
            ->expects($this->once())
            ->method('getToken')
            ->will($this->returnValue($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')))
        ;

        $context
            ->expects($this->never())
            ->method('setToken')
        ;

        $this->assertNull($listener->handle($this->getGetResponseEvent()));
    }

    public function testOnCoreSecurityDoesNothingWhenNoCookieIsSet()
    {
        list($listener, $context, $service,,) = $this->getListener();

        $context
            ->expects($this->once())
            ->method('getToken')
            ->will($this->returnValue(null))
        ;

        $service
            ->expects($this->once())
            ->method('autoLogin')
            ->will($this->returnValue(null))
        ;

        $event = $this->getGetResponseEvent();
        $event
            ->expects($this->once())
            ->method('getRequest')
            ->will($this->returnValue(new Request()))
        ;

        $this->assertNull($listener->handle($event));
    }

    public function testOnCoreSecurityIgnoresAuthenticationExceptionThrownByAuthenticationManagerImplementation()
    {
        list($listener, $context, $service, $manager,) = $this->getListener();

        $context
            ->expects($this->once())
            ->method('getToken')
            ->will($this->returnValue(null))
        ;

        $service
            ->expects($this->once())
            ->method('autoLogin')
            ->will($this->returnValue($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')))
        ;

        $service
            ->expects($this->once())
            ->method('loginFail')
        ;

        $exception = new AuthenticationException('Authentication failed.');
        $manager
            ->expects($this->once())
            ->method('authenticate')
            ->will($this->throwException($exception))
        ;

        $event = $this->getGetResponseEvent();
        $event
            ->expects($this->once())
            ->method('getRequest')
            ->will($this->returnValue(new Request()))
        ;

        $listener->handle($event);
    }

    public function testOnCoreSecurity()
    {
        list($listener, $context, $service, $manager,) = $this->getListener();

        $context
            ->expects($this->once())
            ->method('getToken')
            ->will($this->returnValue(null))
        ;

        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $service
            ->expects($this->once())
            ->method('autoLogin')
            ->will($this->returnValue($token))
        ;

        $context
            ->expects($this->once())
            ->method('setToken')
            ->with($this->equalTo($token))
        ;

        $manager
            ->expects($this->once())
            ->method('authenticate')
            ->will($this->returnValue($token))
        ;

        $event = $this->getGetResponseEvent();
        $event
            ->expects($this->once())
            ->method('getRequest')
            ->will($this->returnValue(new Request()))
        ;

        $listener->handle($event);
    }

    protected function getGetResponseEvent()
    {
        return $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
    }

    protected function getFilterResponseEvent()
    {
        return $this->getMock('Symfony\Component\HttpKernel\Event\FilterResponseEvent', array(), array(), '', false);
    }

    protected function getListener()
    {
        $listener = new RememberMeListener(
            $context = $this->getContext(),
            $service = $this->getService(),
            $manager = $this->getManager(),
            $logger = $this->getLogger()
        );

        return array($listener, $context, $service, $manager, $logger);
    }

    protected function getLogger()
    {
        return $this->getMock('Psr\Log\LoggerInterface');
    }

    protected function getManager()
    {
        return $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
    }

    protected function getService()
    {
        return $this->getMock('Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface');
    }

    protected function getContext()
    {
        return $this->getMockBuilder('Symfony\Component\Security\Core\SecurityContext')
                    ->disableOriginalConstructor()
                    ->getMock();
    }
}
PK�b�\q���Xpear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/AccessListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\Security\Http\Firewall\AccessListener;

class AccessListenerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AccessDeniedException
     */
    public function testHandleWhenTheAccessDecisionManagerDecidesToRefuseAccess()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);

        $accessMap = $this->getMock('Symfony\Component\Security\Http\AccessMapInterface');
        $accessMap
            ->expects($this->any())
            ->method('getPatterns')
            ->with($this->equalTo($request))
            ->will($this->returnValue(array(array('foo' => 'bar'), null)))
        ;

        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token
            ->expects($this->any())
            ->method('isAuthenticated')
            ->will($this->returnValue(true))
        ;

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue($token))
        ;

        $accessDecisionManager = $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface');
        $accessDecisionManager
            ->expects($this->once())
            ->method('decide')
            ->with($this->equalTo($token), $this->equalTo(array('foo' => 'bar')), $this->equalTo($request))
            ->will($this->returnValue(false))
        ;

        $listener = new AccessListener(
            $context,
            $accessDecisionManager,
            $accessMap,
            $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface')
        );

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }

    public function testHandleWhenTheTokenIsNotAuthenticated()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);

        $accessMap = $this->getMock('Symfony\Component\Security\Http\AccessMapInterface');
        $accessMap
            ->expects($this->any())
            ->method('getPatterns')
            ->with($this->equalTo($request))
            ->will($this->returnValue(array(array('foo' => 'bar'), null)))
        ;

        $notAuthenticatedToken = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $notAuthenticatedToken
            ->expects($this->any())
            ->method('isAuthenticated')
            ->will($this->returnValue(false))
        ;

        $authenticatedToken = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $authenticatedToken
            ->expects($this->any())
            ->method('isAuthenticated')
            ->will($this->returnValue(true))
        ;

        $authManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
        $authManager
            ->expects($this->once())
            ->method('authenticate')
            ->with($this->equalTo($notAuthenticatedToken))
            ->will($this->returnValue($authenticatedToken))
        ;

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue($notAuthenticatedToken))
        ;
        $context
            ->expects($this->once())
            ->method('setToken')
            ->with($this->equalTo($authenticatedToken))
        ;

        $accessDecisionManager = $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface');
        $accessDecisionManager
            ->expects($this->once())
            ->method('decide')
            ->with($this->equalTo($authenticatedToken), $this->equalTo(array('foo' => 'bar')), $this->equalTo($request))
            ->will($this->returnValue(true))
        ;

        $listener = new AccessListener(
            $context,
            $accessDecisionManager,
            $accessMap,
            $authManager
        );

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }

    public function testHandleWhenThereIsNoAccessMapEntryMatchingTheRequest()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);

        $accessMap = $this->getMock('Symfony\Component\Security\Http\AccessMapInterface');
        $accessMap
            ->expects($this->any())
            ->method('getPatterns')
            ->with($this->equalTo($request))
            ->will($this->returnValue(array(null, null)))
        ;

        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token
            ->expects($this->never())
            ->method('isAuthenticated')
        ;

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue($token))
        ;

        $listener = new AccessListener(
            $context,
            $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface'),
            $accessMap,
            $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface')
        );

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException
     */
    public function testHandleWhenTheSecurityContextHasNoToken()
    {
        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue(null))
        ;

        $listener = new AccessListener(
            $context,
            $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface'),
            $this->getMock('Symfony\Component\Security\Http\AccessMapInterface'),
            $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface')
        );

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);

        $listener->handle($event);
    }
}
PK�b�\�e��
�
ipear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/AnonymousAuthenticationListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\Security\Http\Firewall\AnonymousAuthenticationListener;

class AnonymousAuthenticationListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testHandleWithContextHavingAToken()
    {
        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')))
        ;
        $context
            ->expects($this->never())
            ->method('setToken')
        ;

        $listener = new AnonymousAuthenticationListener($context, 'TheKey');
        $listener->handle($this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false));
    }

    public function testHandleWithContextHavingNoToken()
    {
        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue(null))
        ;
        $context
            ->expects($this->once())
            ->method('setToken')
            ->with(self::logicalAnd(
                $this->isInstanceOf('Symfony\Component\Security\Core\Authentication\Token\AnonymousToken'),
                $this->attributeEqualTo('key', 'TheKey')
            ))
        ;

        $listener = new AnonymousAuthenticationListener($context, 'TheKey');
        $listener->handle($this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false));
    }

    public function testHandledEventIsLogged()
    {
        if (!interface_exists('Psr\Log\LoggerInterface')) {
            $this->markTestSkipped('The "LoggerInterface" is not available');
        }

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $logger = $this->getMock('Psr\Log\LoggerInterface');
        $logger->expects($this->once())
            ->method('info')
            ->with('Populated SecurityContext with an anonymous Token')
        ;

        $listener = new AnonymousAuthenticationListener($context, 'TheKey', $logger);
        $listener->handle($this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false));
    }
}
PK�b�\�LMMdpear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/X509AuthenticationListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Firewall\X509AuthenticationListener;

class X509AuthenticationListenerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider dataProviderGetPreAuthenticatedData
     */
    public function testGetPreAuthenticatedData($user, $credentials)
    {
        $serverVars = array();
        if ('' !== $user) {
            $serverVars['SSL_CLIENT_S_DN_Email'] = $user;
        }
        if ('' !== $credentials) {
            $serverVars['SSL_CLIENT_S_DN'] = $credentials;
        }

        $request = new Request(array(), array(), array(), array(), array(), $serverVars);

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');

        $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');

        $listener = new X509AuthenticationListener(
            $context,
            $authenticationManager,
            'TheProviderKey'
        );

        $method = new \ReflectionMethod($listener, 'getPreAuthenticatedData');
        $method->setAccessible(true);

        $result = $method->invokeArgs($listener, array($request));
        $this->assertSame($result, array($user, $credentials));
    }

    public static function dataProviderGetPreAuthenticatedData()
    {
        return array(
            'validValues' => array('TheUser', 'TheCredentials'),
            'noCredentials' => array('TheUser', ''),
        );
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testGetPreAuthenticatedDataNoUser()
    {
        $request = new Request(array(), array(), array(), array(), array(), array());

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');

        $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');

        $listener = new X509AuthenticationListener(
            $context,
            $authenticationManager,
            'TheProviderKey'
        );

        $method = new \ReflectionMethod($listener, 'getPreAuthenticatedData');
        $method->setAccessible(true);

        $result = $method->invokeArgs($listener, array($request));
    }

    public function testGetPreAuthenticatedDataWithDifferentKeys()
    {
        $userCredentials = array('TheUser', 'TheCredentials');

        $request = new Request(array(), array(), array(), array(), array(), array(
            'TheUserKey' => 'TheUser',
            'TheCredentialsKey' => 'TheCredentials'
        ));
        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');

        $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');

        $listener = new X509AuthenticationListener(
            $context,
            $authenticationManager,
            'TheProviderKey',
            'TheUserKey',
            'TheCredentialsKey'
        );

        $method = new \ReflectionMethod($listener, 'getPreAuthenticatedData');
        $method->setAccessible(true);

        $result = $method->invokeArgs($listener, array($request));
        $this->assertSame($result, $userCredentials);
    }
}
PK�b�\j�z9�"�"Ypear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\Security\Http\Firewall\ContextListener;

class ContextListenerTest extends \PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        $this->securityContext = new SecurityContext(
            $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'),
            $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface')
        );
    }

    protected function tearDown()
    {
        unset($this->securityContext);
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage $contextKey must not be empty
     */
    public function testItRequiresContextKey()
    {
        new ContextListener(
            $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface'),
            array(),
            ''
        );
    }

    /**
     * @expectedException \InvalidArgumentException
     * @expectedExceptionMessage User provider "stdClass" must implement "Symfony\Component\Security\Core\User\UserProviderInterface
     */
    public function testUserProvidersNeedToImplementAnInterface()
    {
        new ContextListener(
            $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface'),
            array(new \stdClass()),
            'key123'
        );
    }

    public function testOnKernelResponseWillAddSession()
    {
        $session = $this->runSessionOnKernelResponse(
            new UsernamePasswordToken('test1', 'pass1', 'phpunit'),
            null
        );

        $token = unserialize($session->get('_security_session'));
        $this->assertInstanceOf('Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken', $token);
        $this->assertEquals('test1', $token->getUsername());
    }

    public function testOnKernelResponseWillReplaceSession()
    {
        $session = $this->runSessionOnKernelResponse(
            new UsernamePasswordToken('test1', 'pass1', 'phpunit'),
            'C:10:"serialized"'
        );

        $token = unserialize($session->get('_security_session'));
        $this->assertInstanceOf('Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken', $token);
        $this->assertEquals('test1', $token->getUsername());
    }

    public function testOnKernelResponseWillRemoveSession()
    {
        $session = $this->runSessionOnKernelResponse(
            null,
            'C:10:"serialized"'
        );

        $this->assertFalse($session->has('_security_session'));
    }

    public function testOnKernelResponseWithoutSession()
    {
        $this->securityContext->setToken(new UsernamePasswordToken('test1', 'pass1', 'phpunit'));
        $request = new Request();
        $session = new Session(new MockArraySessionStorage());
        $request->setSession($session);

        $event = new FilterResponseEvent(
            $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface'),
            $request,
            HttpKernelInterface::MASTER_REQUEST,
            new Response()
        );

        $listener = new ContextListener($this->securityContext, array(), 'session');
        $listener->onKernelResponse($event);

        $this->assertTrue($session->isStarted());
    }

    public function testOnKernelResponseWithoutSessionNorToken()
    {
        $request = new Request();
        $session = new Session(new MockArraySessionStorage());
        $request->setSession($session);

        $event = new FilterResponseEvent(
            $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface'),
            $request,
            HttpKernelInterface::MASTER_REQUEST,
            new Response()
        );

        $listener = new ContextListener($this->securityContext, array(), 'session');
        $listener->onKernelResponse($event);

        $this->assertFalse($session->isStarted());
    }

    /**
     * @dataProvider provideInvalidToken
     */
    public function testInvalidTokenInSession($token)
    {
        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')
            ->disableOriginalConstructor()
            ->getMock();
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $session = $this->getMock('Symfony\Component\HttpFoundation\Session\SessionInterface');

        $event->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request));
        $request->expects($this->any())
            ->method('hasPreviousSession')
            ->will($this->returnValue(true));
        $request->expects($this->any())
            ->method('getSession')
            ->will($this->returnValue($session));
        $session->expects($this->any())
            ->method('get')
            ->with('_security_key123')
            ->will($this->returnValue($token));
        $context->expects($this->once())
            ->method('setToken')
            ->with(null);

        $listener = new ContextListener($context, array(), 'key123');
        $listener->handle($event);
    }

    public function provideInvalidToken()
    {
        return array(
            array(serialize(new \__PHP_Incomplete_Class())),
            array(serialize(null)),
            array(null)
        );
    }

    public function testHandleAddsKernelResponseListener()
    {
        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
        $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')
            ->disableOriginalConstructor()
            ->getMock();

        $listener = new ContextListener($context, array(), 'key123', null, $dispatcher);

        $event->expects($this->any())
            ->method('isMasterRequest')
            ->will($this->returnValue(true));
        $event->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($this->getMock('Symfony\Component\HttpFoundation\Request')));

        $dispatcher->expects($this->once())
            ->method('addListener')
            ->with(KernelEvents::RESPONSE, array($listener, 'onKernelResponse'));

        $listener->handle($event);
    }

    public function testHandleRemovesTokenIfNoPreviousSessionWasFound()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
        $request->expects($this->any())->method('hasPreviousSession')->will($this->returnValue(false));

        $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')
            ->disableOriginalConstructor()
            ->getMock();
        $event->expects($this->any())->method('getRequest')->will($this->returnValue($request));

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context->expects($this->once())->method('setToken')->with(null);

        $listener = new ContextListener($context, array(), 'key123');
        $listener->handle($event);
    }

    protected function runSessionOnKernelResponse($newToken, $original = null)
    {
        $session = new Session(new MockArraySessionStorage());

        if ($original !== null) {
            $session->set('_security_session', $original);
        }

        $this->securityContext->setToken($newToken);

        $request = new Request();
        $request->setSession($session);
        $request->cookies->set('MOCKSESSID', true);

        $event = new FilterResponseEvent(
            $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface'),
            $request,
            HttpKernelInterface::MASTER_REQUEST,
            new Response()
        );

        $listener = new ContextListener($this->securityContext, array(), 'session');
        $listener->onKernelResponse($event);

        return $session;
    }
}
PK�b�\��l���Tpear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/DigestDataTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\Security\Http\Firewall\DigestData;

class DigestDataTest extends \PHPUnit_Framework_TestCase
{
    public function testGetResponse()
    {
        $digestAuth = new DigestData(
            'username="user", realm="Welcome, robot!", ' .
            'nonce="MTM0NzMyMTgyMy42NzkzOmRlZjM4NmIzOGNjMjE0OWJiNDU0MDAxNzJmYmM1MmZl", ' .
            'uri="/path/info?p1=5&p2=5", cnonce="MDIwODkz", nc=00000001, qop="auth", ' .
            'response="b52938fc9e6d7c01be7702ece9031b42"'
        );

        $this->assertEquals('b52938fc9e6d7c01be7702ece9031b42', $digestAuth->getResponse());
    }

    public function testGetUsername()
    {
        $digestAuth = new DigestData(
            'username="user", realm="Welcome, robot!", ' .
            'nonce="MTM0NzMyMTgyMy42NzkzOmRlZjM4NmIzOGNjMjE0OWJiNDU0MDAxNzJmYmM1MmZl", ' .
            'uri="/path/info?p1=5&p2=5", cnonce="MDIwODkz", nc=00000001, qop="auth", ' .
            'response="b52938fc9e6d7c01be7702ece9031b42"'
        );

        $this->assertEquals('user', $digestAuth->getUsername());
    }

    public function testGetUsernameWithQuote()
    {
        $digestAuth = new DigestData(
            'username="\"user\"", realm="Welcome, robot!", ' .
            'nonce="MTM0NzMyMTgyMy42NzkzOmRlZjM4NmIzOGNjMjE0OWJiNDU0MDAxNzJmYmM1MmZl", ' .
            'uri="/path/info?p1=5&p2=5", cnonce="MDIwODkz", nc=00000001, qop="auth", ' .
            'response="b52938fc9e6d7c01be7702ece9031b42"'
        );

        $this->assertEquals('"user"', $digestAuth->getUsername());
    }

    public function testGetUsernameWithQuoteAndEscape()
    {
        $digestAuth = new DigestData(
            'username="\"u\\\\\"ser\"", realm="Welcome, robot!", ' .
            'nonce="MTM0NzMyMTgyMy42NzkzOmRlZjM4NmIzOGNjMjE0OWJiNDU0MDAxNzJmYmM1MmZl", ' .
            'uri="/path/info?p1=5&p2=5", cnonce="MDIwODkz", nc=00000001, qop="auth", ' .
            'response="b52938fc9e6d7c01be7702ece9031b42"'
        );

        $this->assertEquals('"u\\"ser"', $digestAuth->getUsername());
    }

    public function testGetUsernameWithSingleQuote()
    {
        $digestAuth = new DigestData(
            'username="\"u\'ser\"", realm="Welcome, robot!", ' .
            'nonce="MTM0NzMyMTgyMy42NzkzOmRlZjM4NmIzOGNjMjE0OWJiNDU0MDAxNzJmYmM1MmZl", ' .
            'uri="/path/info?p1=5&p2=5", cnonce="MDIwODkz", nc=00000001, qop="auth", ' .
            'response="b52938fc9e6d7c01be7702ece9031b42"'
        );

        $this->assertEquals('"u\'ser"', $digestAuth->getUsername());
    }

    public function testGetUsernameWithSingleQuoteAndEscape()
    {
        $digestAuth = new DigestData(
            'username="\"u\\\'ser\"", realm="Welcome, robot!", ' .
            'nonce="MTM0NzMyMTgyMy42NzkzOmRlZjM4NmIzOGNjMjE0OWJiNDU0MDAxNzJmYmM1MmZl", ' .
            'uri="/path/info?p1=5&p2=5", cnonce="MDIwODkz", nc=00000001, qop="auth", ' .
            'response="b52938fc9e6d7c01be7702ece9031b42"'
        );

        $this->assertEquals('"u\\\'ser"', $digestAuth->getUsername());
    }

    public function testGetUsernameWithEscape()
    {
        $digestAuth = new DigestData(
            'username="\"u\\ser\"", realm="Welcome, robot!", ' .
            'nonce="MTM0NzMyMTgyMy42NzkzOmRlZjM4NmIzOGNjMjE0OWJiNDU0MDAxNzJmYmM1MmZl", ' .
            'uri="/path/info?p1=5&p2=5", cnonce="MDIwODkz", nc=00000001, qop="auth", ' .
            'response="b52938fc9e6d7c01be7702ece9031b42"'
        );

        $this->assertEquals('"u\\ser"', $digestAuth->getUsername());
    }

    public function testValidateAndDecode()
    {
        $time = microtime(true);
        $key = 'ThisIsAKey';
        $nonce = base64_encode($time.':'.md5($time.':'.$key));

        $digestAuth = new DigestData(
            'username="user", realm="Welcome, robot!", nonce="'.$nonce.'", ' .
            'uri="/path/info?p1=5&p2=5", cnonce="MDIwODkz", nc=00000001, qop="auth", ' .
            'response="b52938fc9e6d7c01be7702ece9031b42"'
        );

        try {
            $digestAuth->validateAndDecode($key, 'Welcome, robot!');
        } catch (\Exception $e) {
            $this->fail(sprintf('testValidateAndDecode fail with message: %s', $e->getMessage()));
        }
    }

    public function testCalculateServerDigest()
    {
        $this->calculateServerDigest('user', 'Welcome, robot!', 'pass,word=password', 'ThisIsAKey', '00000001', 'MDIwODkz', 'auth', 'GET', '/path/info?p1=5&p2=5');
    }

    public function testCalculateServerDigestWithQuote()
    {
        $this->calculateServerDigest('\"user\"', 'Welcome, \"robot\"!', 'pass,word=password', 'ThisIsAKey', '00000001', 'MDIwODkz', 'auth', 'GET', '/path/info?p1=5&p2=5');
    }

    public function testCalculateServerDigestWithQuoteAndEscape()
    {
        $this->calculateServerDigest('\"u\\\\\"ser\"', 'Welcome, \"robot\"!', 'pass,word=password', 'ThisIsAKey', '00000001', 'MDIwODkz', 'auth', 'GET', '/path/info?p1=5&p2=5');
    }

    public function testCalculateServerDigestEscape()
    {
        $this->calculateServerDigest('\"u\\ser\"', 'Welcome, \"robot\"!', 'pass,word=password', 'ThisIsAKey', '00000001', 'MDIwODkz', 'auth', 'GET', '/path/info?p1=5&p2=5');
        $this->calculateServerDigest('\"u\\ser\\\\\"', 'Welcome, \"robot\"!', 'pass,word=password', 'ThisIsAKey', '00000001', 'MDIwODkz', 'auth', 'GET', '/path/info?p1=5&p2=5');
    }

    public function testIsNonceExpired()
    {
        $time = microtime(true) + 10;
        $key = 'ThisIsAKey';
        $nonce = base64_encode($time.':'.md5($time.':'.$key));

        $digestAuth = new DigestData(
            'username="user", realm="Welcome, robot!", nonce="'.$nonce.'", ' .
            'uri="/path/info?p1=5&p2=5", cnonce="MDIwODkz", nc=00000001, qop="auth", ' .
            'response="b52938fc9e6d7c01be7702ece9031b42"'
        );

        $digestAuth->validateAndDecode($key, 'Welcome, robot!');

        $this->assertFalse($digestAuth->isNonceExpired());
    }

    protected function setUp()
    {
        class_exists('Symfony\Component\Security\Http\Firewall\DigestAuthenticationListener', true);
    }

    private function calculateServerDigest($username, $realm, $password, $key, $nc, $cnonce, $qop, $method, $uri)
    {
        $time = microtime(true);
        $nonce = base64_encode($time.':'.md5($time.':'.$key));

        $response = md5(
            md5($username.':'.$realm.':'.$password).':'.$nonce.':'.$nc.':'.$cnonce.':'.$qop.':'.md5($method.':'.$uri)
        );

        $digest = sprintf('username="%s", realm="%s", nonce="%s", uri="%s", cnonce="%s", nc=%s, qop="%s", response="%s"',
            $username, $realm, $nonce, $uri, $cnonce, $nc, $qop, $response
        );

        $digestAuth = new DigestData($digest);

        $this->assertEquals($digestAuth->getResponse(), $digestAuth->calculateServerDigest($password, $method));
    }
}
PK�b�\�G��

Ypear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/ChannelListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\Security\Http\Firewall\ChannelListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\Response;

class ChannelListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testHandleWithNotSecuredRequestAndHttpChannel()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);
        $request
            ->expects($this->any())
            ->method('isSecure')
            ->will($this->returnValue(false))
        ;

        $accessMap = $this->getMock('Symfony\Component\Security\Http\AccessMapInterface');
        $accessMap
            ->expects($this->any())
            ->method('getPatterns')
            ->with($this->equalTo($request))
            ->will($this->returnValue(array(array(), 'http')))
        ;

        $entryPoint = $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface');
        $entryPoint
            ->expects($this->never())
            ->method('start')
        ;

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;
        $event
            ->expects($this->never())
            ->method('setResponse')
        ;

        $listener = new ChannelListener($accessMap, $entryPoint);
        $listener->handle($event);
    }

    public function testHandleWithSecuredRequestAndHttpsChannel()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);
        $request
            ->expects($this->any())
            ->method('isSecure')
            ->will($this->returnValue(true))
        ;

        $accessMap = $this->getMock('Symfony\Component\Security\Http\AccessMapInterface');
        $accessMap
            ->expects($this->any())
            ->method('getPatterns')
            ->with($this->equalTo($request))
            ->will($this->returnValue(array(array(), 'https')))
        ;

        $entryPoint = $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface');
        $entryPoint
            ->expects($this->never())
            ->method('start')
        ;

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;
        $event
            ->expects($this->never())
            ->method('setResponse')
        ;

        $listener = new ChannelListener($accessMap, $entryPoint);
        $listener->handle($event);
    }

    public function testHandleWithNotSecuredRequestAndHttpsChannel()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);
        $request
            ->expects($this->any())
            ->method('isSecure')
            ->will($this->returnValue(false))
        ;

        $response = new Response();

        $accessMap = $this->getMock('Symfony\Component\Security\Http\AccessMapInterface');
        $accessMap
            ->expects($this->any())
            ->method('getPatterns')
            ->with($this->equalTo($request))
            ->will($this->returnValue(array(array(), 'https')))
        ;

        $entryPoint = $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface');
        $entryPoint
            ->expects($this->once())
            ->method('start')
            ->with($this->equalTo($request))
            ->will($this->returnValue($response))
        ;

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;
        $event
            ->expects($this->once())
            ->method('setResponse')
            ->with($this->equalTo($response))
        ;

        $listener = new ChannelListener($accessMap, $entryPoint);
        $listener->handle($event);
    }

    public function testHandleWithSecuredRequestAndHttpChannel()
    {
        $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(), array(), '', false, false);
        $request
            ->expects($this->any())
            ->method('isSecure')
            ->will($this->returnValue(true))
        ;

        $response = new Response();

        $accessMap = $this->getMock('Symfony\Component\Security\Http\AccessMapInterface');
        $accessMap
            ->expects($this->any())
            ->method('getPatterns')
            ->with($this->equalTo($request))
            ->will($this->returnValue(array(array(), 'http')))
        ;

        $entryPoint = $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface');
        $entryPoint
            ->expects($this->once())
            ->method('start')
            ->with($this->equalTo($request))
            ->will($this->returnValue($response))
        ;

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;
        $event
            ->expects($this->once())
            ->method('setResponse')
            ->with($this->equalTo($response))
        ;

        $listener = new ChannelListener($accessMap, $entryPoint);
        $listener->handle($event);
    }
}
PK�b�\<��%%jpear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/AbstractPreAuthenticatedListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Exception\AuthenticationException;

class AbstractPreAuthenticatedListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testHandleWithValidValues()
    {
        $userCredentials = array('TheUser', 'TheCredentials');

        $request = new Request(array(), array(), array(), array(), array(), array());

        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue(null))
        ;
        $context
            ->expects($this->once())
            ->method('setToken')
            ->with($this->equalTo($token))
        ;

        $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
        $authenticationManager
            ->expects($this->once())
            ->method('authenticate')
            ->with($this->isInstanceOf('Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken'))
            ->will($this->returnValue($token))
        ;

        $listener = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Firewall\AbstractPreAuthenticatedListener', array(
            $context,
            $authenticationManager,
            'TheProviderKey'
        ));
        $listener
            ->expects($this->once())
            ->method('getPreAuthenticatedData')
            ->will($this->returnValue($userCredentials));

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }

    public function testHandleWhenAuthenticationFails()
    {
        $userCredentials = array('TheUser', 'TheCredentials');

        $request = new Request(array(), array(), array(), array(), array(), array());

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue(null))
        ;
        $context
            ->expects($this->never())
            ->method('setToken')
        ;

        $exception = new AuthenticationException('Authentication failed.');
        $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
        $authenticationManager
            ->expects($this->once())
            ->method('authenticate')
            ->with($this->isInstanceOf('Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken'))
            ->will($this->throwException($exception))
        ;

        $listener = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Firewall\AbstractPreAuthenticatedListener', array(
            $context,
            $authenticationManager,
            'TheProviderKey'
        ));
        $listener
            ->expects($this->once())
            ->method('getPreAuthenticatedData')
            ->will($this->returnValue($userCredentials));

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }

    public function testHandleWhenAuthenticationFailsWithDifferentToken()
    {
        $userCredentials = array('TheUser', 'TheCredentials');

        $token = new UsernamePasswordToken('TheUsername', 'ThePassword', 'TheProviderKey', array('ROLE_FOO'));

        $request = new Request(array(), array(), array(), array(), array(), array());

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue($token))
        ;
        $context
            ->expects($this->never())
            ->method('setToken')
        ;

        $exception = new AuthenticationException('Authentication failed.');
        $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
        $authenticationManager
            ->expects($this->once())
            ->method('authenticate')
            ->with($this->isInstanceOf('Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken'))
            ->will($this->throwException($exception))
        ;

        $listener = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Firewall\AbstractPreAuthenticatedListener', array(
            $context,
            $authenticationManager,
            'TheProviderKey'
        ));
        $listener
            ->expects($this->once())
            ->method('getPreAuthenticatedData')
            ->will($this->returnValue($userCredentials));

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }

    public function testHandleWithASimilarAuthenticatedToken()
    {
        $userCredentials = array('TheUser', 'TheCredentials');

        $request = new Request(array(), array(), array(), array(), array(), array());

        $token = new PreAuthenticatedToken('TheUser', 'TheCredentials', 'TheProviderKey', array('ROLE_FOO'));

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue($token))
        ;

        $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
        $authenticationManager
            ->expects($this->never())
            ->method('authenticate')
        ;

        $listener = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Firewall\AbstractPreAuthenticatedListener', array(
            $context,
            $authenticationManager,
            'TheProviderKey'
        ));
        $listener
            ->expects($this->once())
            ->method('getPreAuthenticatedData')
            ->will($this->returnValue($userCredentials));

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }

    public function testHandleWithAnInvalidSimilarToken()
    {
        $userCredentials = array('TheUser', 'TheCredentials');

        $request = new Request(array(), array(), array(), array(), array(), array());

        $token = new PreAuthenticatedToken('AnotherUser', 'TheCredentials', 'TheProviderKey', array('ROLE_FOO'));

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context
            ->expects($this->any())
            ->method('getToken')
            ->will($this->returnValue($token))
        ;
        $context
            ->expects($this->once())
            ->method('setToken')
            ->with($this->equalTo(null))
        ;

        $exception = new AuthenticationException('Authentication failed.');
        $authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
        $authenticationManager
            ->expects($this->once())
            ->method('authenticate')
            ->with($this->isInstanceOf('Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken'))
            ->will($this->throwException($exception))
        ;

        $listener = $this->getMockForAbstractClass('Symfony\Component\Security\Http\Firewall\AbstractPreAuthenticatedListener', array(
            $context,
            $authenticationManager,
            'TheProviderKey'
        ));
        $listener
            ->expects($this->once())
            ->method('getPreAuthenticatedData')
            ->will($this->returnValue($userCredentials));

        $event = $this->getMock('Symfony\Component\HttpKernel\Event\GetResponseEvent', array(), array(), '', false);
        $event
            ->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request))
        ;

        $listener->handle($event);
    }
}
PK�b�\�V�k��Xpear/test/Security/Symfony/Component/Security/Http/Tests/Firewall/LogoutListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\Firewall;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Firewall\LogoutListener;

class LogoutListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testHandleUnmatchedPath()
    {
        list($listener, $context, $httpUtils, $options) = $this->getListener();

        list($event, $request) = $this->getGetResponseEvent();

        $event->expects($this->never())
            ->method('setResponse');

        $httpUtils->expects($this->once())
            ->method('checkRequestPath')
            ->with($request, $options['logout_path'])
            ->will($this->returnValue(false));

        $listener->handle($event);
    }

    public function testHandleMatchedPathWithSuccessHandlerAndCsrfValidation()
    {
        $successHandler = $this->getSuccessHandler();
        $tokenManager = $this->getTokenManager();

        list($listener, $context, $httpUtils, $options) = $this->getListener($successHandler, $tokenManager);

        list($event, $request) = $this->getGetResponseEvent();

        $request->query->set('_csrf_token', 'token');

        $httpUtils->expects($this->once())
            ->method('checkRequestPath')
            ->with($request, $options['logout_path'])
            ->will($this->returnValue(true));

        $tokenManager->expects($this->once())
            ->method('isTokenValid')
            ->will($this->returnValue(true));

        $successHandler->expects($this->once())
            ->method('onLogoutSuccess')
            ->with($request)
            ->will($this->returnValue($response = new Response()));

        $context->expects($this->once())
            ->method('getToken')
            ->will($this->returnValue($token = $this->getToken()));

        $handler = $this->getHandler();
        $handler->expects($this->once())
            ->method('logout')
            ->with($request, $response, $token);

        $context->expects($this->once())
            ->method('setToken')
            ->with(null);

        $event->expects($this->once())
            ->method('setResponse')
            ->with($response);

        $listener->addHandler($handler);

        $listener->handle($event);
    }

    public function testHandleMatchedPathWithoutSuccessHandlerAndCsrfValidation()
    {
        $successHandler = $this->getSuccessHandler();

        list($listener, $context, $httpUtils, $options) = $this->getListener($successHandler);

        list($event, $request) = $this->getGetResponseEvent();

        $httpUtils->expects($this->once())
            ->method('checkRequestPath')
            ->with($request, $options['logout_path'])
            ->will($this->returnValue(true));

        $successHandler->expects($this->once())
            ->method('onLogoutSuccess')
            ->with($request)
            ->will($this->returnValue($response = new Response()));

        $context->expects($this->once())
            ->method('getToken')
            ->will($this->returnValue($token = $this->getToken()));

        $handler = $this->getHandler();
        $handler->expects($this->once())
            ->method('logout')
            ->with($request, $response, $token);

        $context->expects($this->once())
            ->method('setToken')
            ->with(null);

        $event->expects($this->once())
            ->method('setResponse')
            ->with($response);

        $listener->addHandler($handler);

        $listener->handle($event);
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testSuccessHandlerReturnsNonResponse()
    {
        $successHandler = $this->getSuccessHandler();

        list($listener, $context, $httpUtils, $options) = $this->getListener($successHandler);

        list($event, $request) = $this->getGetResponseEvent();

        $httpUtils->expects($this->once())
            ->method('checkRequestPath')
            ->with($request, $options['logout_path'])
            ->will($this->returnValue(true));

        $successHandler->expects($this->once())
            ->method('onLogoutSuccess')
            ->with($request)
            ->will($this->returnValue(null));

        $listener->handle($event);
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\LogoutException
     */
    public function testCsrfValidationFails()
    {
        $tokenManager = $this->getTokenManager();

        list($listener, $context, $httpUtils, $options) = $this->getListener(null, $tokenManager);

        list($event, $request) = $this->getGetResponseEvent();

        $request->query->set('_csrf_token', 'token');

        $httpUtils->expects($this->once())
            ->method('checkRequestPath')
            ->with($request, $options['logout_path'])
            ->will($this->returnValue(true));

        $tokenManager->expects($this->once())
            ->method('isTokenValid')
            ->will($this->returnValue(false));

        $listener->handle($event);
    }

    private function getTokenManager()
    {
        return $this->getMock('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface');
    }

    private function getContext()
    {
        return $this->getMockBuilder('Symfony\Component\Security\Core\SecurityContext')
            ->disableOriginalConstructor()
            ->getMock();
    }

    private function getGetResponseEvent()
    {
        $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')
            ->disableOriginalConstructor()
            ->getMock();

        $event->expects($this->any())
            ->method('getRequest')
            ->will($this->returnValue($request = new Request()));

        return array($event, $request);
    }

    private function getHandler()
    {
        return $this->getMock('Symfony\Component\Security\Http\Logout\LogoutHandlerInterface');
    }

    private function getHttpUtils()
    {
        return $this->getMockBuilder('Symfony\Component\Security\Http\HttpUtils')
            ->disableOriginalConstructor()
            ->getMock();
    }

    private function getListener($successHandler = null, $tokenManager = null)
    {
        $listener = new LogoutListener(
            $context = $this->getContext(),
            $httpUtils = $this->getHttpUtils(),
            $successHandler ?: $this->getSuccessHandler(),
            $options = array(
                'csrf_parameter' => '_csrf_token',
                'intention'      => 'logout',
                'logout_path'    => '/logout',
                'target_url'     => '/',
            ),
            $tokenManager
        );

        return array($listener, $context, $httpUtils, $options);
    }

    private function getSuccessHandler()
    {
        return $this->getMock('Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface');
    }

    private function getToken()
    {
        return $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
    }
}
PK�b�\�䗥1#1#fpear/test/Security/Symfony/Component/Security/Http/Tests/RememberMe/AbstractRememberMeServicesTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\RememberMe;

use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class AbstractRememberMeServicesTest extends \PHPUnit_Framework_TestCase
{
    public function testGetRememberMeParameter()
    {
        $service = $this->getService(null, array('remember_me_parameter' => 'foo'));

        $this->assertEquals('foo', $service->getRememberMeParameter());
    }

    public function testGetKey()
    {
        $service = $this->getService();
        $this->assertEquals('fookey', $service->getKey());
    }

    public function testAutoLoginReturnsNullWhenNoCookie()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null));

        $this->assertNull($service->autoLogin(new Request()));
    }

    /**
     * @expectedException \RuntimeException
     */
    public function testAutoLoginThrowsExceptionWhenImplementationDoesNotReturnUserInterface()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null));
        $request = new Request();
        $request->cookies->set('foo', 'foo');

        $service
            ->expects($this->once())
            ->method('processAutoLoginCookie')
            ->will($this->returnValue(null))
        ;

        $service->autoLogin($request);
    }

    public function testAutoLogin()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null));
        $request = new Request();
        $request->cookies->set('foo', 'foo');

        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user
            ->expects($this->once())
            ->method('getRoles')
            ->will($this->returnValue(array()))
        ;

        $service
            ->expects($this->once())
            ->method('processAutoLoginCookie')
            ->will($this->returnValue($user))
        ;

        $returnedToken = $service->autoLogin($request);

        $this->assertSame($user, $returnedToken->getUser());
        $this->assertSame('fookey', $returnedToken->getKey());
        $this->assertSame('fookey', $returnedToken->getProviderKey());
    }

    public function testLogout()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null));
        $request = new Request();
        $response = new Response();
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');

        $service->logout($request, $response, $token);

        $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared());
    }

    public function testLoginFail()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null));
        $request = new Request();

        $service->loginFail($request);

        $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared());
    }

    public function testLoginSuccessIsNotProcessedWhenTokenDoesNotContainUserInterfaceImplementation()
    {
        $service = $this->getService(null, array('name' => 'foo', 'always_remember_me' => true, 'path' => null, 'domain' => null));
        $request = new Request();
        $response = new Response();
        $account = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token
            ->expects($this->once())
            ->method('getUser')
            ->will($this->returnValue('foo'))
        ;

        $service
            ->expects($this->never())
            ->method('onLoginSuccess')
        ;

        $this->assertFalse($request->request->has('foo'));

        $service->loginSuccess($request, $response, $token);
    }

    public function testLoginSuccessIsNotProcessedWhenRememberMeIsNotRequested()
    {
        $service = $this->getService(null, array('name' => 'foo', 'always_remember_me' => false, 'remember_me_parameter' => 'foo', 'path' => null, 'domain' => null));
        $request = new Request();
        $response = new Response();
        $account = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token
            ->expects($this->once())
            ->method('getUser')
            ->will($this->returnValue($account))
        ;

        $service
            ->expects($this->never())
            ->method('onLoginSuccess')
            ->will($this->returnValue(null))
        ;

        $this->assertFalse($request->request->has('foo'));

        $service->loginSuccess($request, $response, $token);
    }

    public function testLoginSuccessWhenRememberMeAlwaysIsTrue()
    {
        $service = $this->getService(null, array('name' => 'foo', 'always_remember_me' => true, 'path' => null, 'domain' => null));
        $request = new Request();
        $response = new Response();
        $account = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token
            ->expects($this->once())
            ->method('getUser')
            ->will($this->returnValue($account))
        ;

        $service
            ->expects($this->once())
            ->method('onLoginSuccess')
            ->will($this->returnValue(null))
        ;

        $service->loginSuccess($request, $response, $token);
    }

    /**
     * @dataProvider getPositiveRememberMeParameterValues
     */
    public function testLoginSuccessWhenRememberMeParameterWithPathIsPositive($value)
    {
        $service = $this->getService(null, array('name' => 'foo', 'always_remember_me' => false, 'remember_me_parameter' => 'foo[bar]', 'path' => null, 'domain' => null));

        $request = new Request();
        $request->request->set('foo', array('bar' => $value));
        $response = new Response();
        $account = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token
            ->expects($this->once())
            ->method('getUser')
            ->will($this->returnValue($account))
        ;

        $service
            ->expects($this->once())
            ->method('onLoginSuccess')
            ->will($this->returnValue(true))
        ;

        $service->loginSuccess($request, $response, $token);
    }

    /**
     * @dataProvider getPositiveRememberMeParameterValues
     */
    public function testLoginSuccessWhenRememberMeParameterIsPositive($value)
    {
        $service = $this->getService(null, array('name' => 'foo', 'always_remember_me' => false, 'remember_me_parameter' => 'foo', 'path' => null, 'domain' => null));

        $request = new Request();
        $request->request->set('foo', $value);
        $response = new Response();
        $account = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token
            ->expects($this->once())
            ->method('getUser')
            ->will($this->returnValue($account))
        ;

        $service
            ->expects($this->once())
            ->method('onLoginSuccess')
            ->will($this->returnValue(true))
        ;

        $service->loginSuccess($request, $response, $token);
    }

    public function getPositiveRememberMeParameterValues()
    {
        return array(
            array('true'),
            array('1'),
            array('on'),
            array('yes'),
        );
    }

    protected function getService($userProvider = null, $options = array(), $logger = null)
    {
        if (null === $userProvider) {
            $userProvider = $this->getProvider();
        }

        return $this->getMockForAbstractClass('Symfony\Component\Security\Http\RememberMe\AbstractRememberMeServices', array(
            array($userProvider), 'fookey', 'fookey', $options, $logger
        ));
    }

    protected function getProvider()
    {
        $provider = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
        $provider
            ->expects($this->any())
            ->method('supportsClass')
            ->will($this->returnValue(true))
        ;

        return $provider;
    }
}
PK�b�\���F8F8rpear/test/Security/Symfony/Component/Security/Http/Tests/RememberMe/PersistentTokenBasedRememberMeServicesTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\RememberMe;

use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface;

use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Security\Http\RememberMe\PersistentTokenBasedRememberMeServices;
use Symfony\Component\Security\Core\Exception\TokenNotFoundException;
use Symfony\Component\Security\Core\Exception\CookieTheftException;
use Symfony\Component\Security\Core\Util\SecureRandom;

class PersistentTokenBasedRememberMeServicesTest extends \PHPUnit_Framework_TestCase
{
    public function testAutoLoginReturnsNullWhenNoCookie()
    {
        $service = $this->getService(null, array('name' => 'foo'));

        $this->assertNull($service->autoLogin(new Request()));
    }

    public function testAutoLoginThrowsExceptionOnInvalidCookie()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null, 'always_remember_me' => false, 'remember_me_parameter' => 'foo'));
        $request = new Request();
        $request->request->set('foo', 'true');
        $request->cookies->set('foo', 'foo');

        $this->assertNull($service->autoLogin($request));
        $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared());
    }

    public function testAutoLoginThrowsExceptionOnNonExistentToken()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null, 'always_remember_me' => false, 'remember_me_parameter' => 'foo'));
        $request = new Request();
        $request->request->set('foo', 'true');
        $request->cookies->set('foo', $this->encodeCookie(array(
            $series = 'fooseries',
            $tokenValue = 'foovalue',
        )));

        $tokenProvider = $this->getMock('Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface');
        $tokenProvider
            ->expects($this->once())
            ->method('loadTokenBySeries')
            ->will($this->throwException(new TokenNotFoundException('Token not found.')))
        ;
        $service->setTokenProvider($tokenProvider);

        $this->assertNull($service->autoLogin($request));
        $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared());
    }

    public function testAutoLoginReturnsNullOnNonExistentUser()
    {
        $userProvider = $this->getProvider();
        $service = $this->getService($userProvider, array('name' => 'foo', 'path' => null, 'domain' => null, 'always_remember_me' => true, 'lifetime' => 3600, 'secure' => false, 'httponly' => false));
        $request = new Request();
        $request->cookies->set('foo', $this->encodeCookie(array('fooseries', 'foovalue')));

        $tokenProvider = $this->getMock('Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface');
        $tokenProvider
            ->expects($this->once())
            ->method('loadTokenBySeries')
            ->will($this->returnValue(new PersistentToken('fooclass', 'fooname', 'fooseries', 'foovalue', new \DateTime())))
        ;
        $service->setTokenProvider($tokenProvider);

        $userProvider
            ->expects($this->once())
            ->method('loadUserByUsername')
            ->will($this->throwException(new UsernameNotFoundException('user not found')))
        ;

        $this->assertNull($service->autoLogin($request));
        $this->assertTrue($request->attributes->has(RememberMeServicesInterface::COOKIE_ATTR_NAME));
    }

    public function testAutoLoginThrowsExceptionOnStolenCookieAndRemovesItFromThePersistentBackend()
    {
        $userProvider = $this->getProvider();
        $service = $this->getService($userProvider, array('name' => 'foo', 'path' => null, 'domain' => null, 'always_remember_me' => true));
        $request = new Request();
        $request->cookies->set('foo', $this->encodeCookie(array('fooseries', 'foovalue')));

        $tokenProvider = $this->getMock('Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface');
        $service->setTokenProvider($tokenProvider);

        $tokenProvider
            ->expects($this->once())
            ->method('loadTokenBySeries')
            ->will($this->returnValue(new PersistentToken('fooclass', 'foouser', 'fooseries', 'anotherFooValue', new \DateTime())))
        ;

        $tokenProvider
            ->expects($this->once())
            ->method('deleteTokenBySeries')
            ->with($this->equalTo('fooseries'))
            ->will($this->returnValue(null))
        ;

        try {
            $service->autoLogin($request);
            $this->fail('Expected CookieTheftException was not thrown.');
        } catch (CookieTheftException $theft) { }

        $this->assertTrue($request->attributes->has(RememberMeServicesInterface::COOKIE_ATTR_NAME));
    }

    public function testAutoLoginDoesNotAcceptAnExpiredCookie()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null, 'always_remember_me' => true, 'lifetime' => 3600));
        $request = new Request();
        $request->cookies->set('foo', $this->encodeCookie(array('fooseries', 'foovalue')));

        $tokenProvider = $this->getMock('Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface');
        $tokenProvider
            ->expects($this->once())
            ->method('loadTokenBySeries')
            ->with($this->equalTo('fooseries'))
            ->will($this->returnValue(new PersistentToken('fooclass', 'username', 'fooseries', 'foovalue', new \DateTime('yesterday'))))
        ;
        $service->setTokenProvider($tokenProvider);

        $this->assertNull($service->autoLogin($request));
        $this->assertTrue($request->attributes->has(RememberMeServicesInterface::COOKIE_ATTR_NAME));
    }

    public function testAutoLogin()
    {
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user
            ->expects($this->once())
            ->method('getRoles')
            ->will($this->returnValue(array('ROLE_FOO')))
        ;

        $userProvider = $this->getProvider();
        $userProvider
            ->expects($this->once())
            ->method('loadUserByUsername')
            ->with($this->equalTo('foouser'))
            ->will($this->returnValue($user))
        ;

        $service = $this->getService($userProvider, array('name' => 'foo', 'path' => null, 'domain' => null, 'secure' => false, 'httponly' => false, 'always_remember_me' => true, 'lifetime' => 3600));
        $request = new Request();
        $request->cookies->set('foo', $this->encodeCookie(array('fooseries', 'foovalue')));

        $tokenProvider = $this->getMock('Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface');
        $tokenProvider
            ->expects($this->once())
            ->method('loadTokenBySeries')
            ->with($this->equalTo('fooseries'))
            ->will($this->returnValue(new PersistentToken('fooclass', 'foouser', 'fooseries', 'foovalue', new \DateTime())))
        ;
        $service->setTokenProvider($tokenProvider);

        $returnedToken = $service->autoLogin($request);

        $this->assertInstanceOf('Symfony\Component\Security\Core\Authentication\Token\RememberMeToken', $returnedToken);
        $this->assertSame($user, $returnedToken->getUser());
        $this->assertEquals('fookey', $returnedToken->getKey());
        $this->assertTrue($request->attributes->has(RememberMeServicesInterface::COOKIE_ATTR_NAME));
    }

    public function testLogout()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => '/foo', 'domain' => 'foodomain.foo'));
        $request = new Request();
        $request->cookies->set('foo', $this->encodeCookie(array('fooseries', 'foovalue')));
        $response = new Response();
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');

        $tokenProvider = $this->getMock('Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface');
        $tokenProvider
            ->expects($this->once())
            ->method('deleteTokenBySeries')
            ->with($this->equalTo('fooseries'))
            ->will($this->returnValue(null))
        ;
        $service->setTokenProvider($tokenProvider);

        $service->logout($request, $response, $token);

        $cookie = $request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME);
        $this->assertTrue($cookie->isCleared());
        $this->assertEquals('/foo', $cookie->getPath());
        $this->assertEquals('foodomain.foo', $cookie->getDomain());
    }

    public function testLogoutSimplyIgnoresNonSetRequestCookie()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null));
        $request = new Request();
        $response = new Response();
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');

        $tokenProvider = $this->getMock('Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface');
        $tokenProvider
            ->expects($this->never())
            ->method('deleteTokenBySeries')
        ;
        $service->setTokenProvider($tokenProvider);

        $service->logout($request, $response, $token);

        $cookie = $request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME);
        $this->assertTrue($cookie->isCleared());
        $this->assertEquals('/', $cookie->getPath());
        $this->assertNull($cookie->getDomain());
    }

    public function testLogoutSimplyIgnoresInvalidCookie()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null));
        $request = new Request();
        $request->cookies->set('foo', 'somefoovalue');
        $response = new Response();
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');

        $tokenProvider = $this->getMock('Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface');
        $tokenProvider
            ->expects($this->never())
            ->method('deleteTokenBySeries')
        ;
        $service->setTokenProvider($tokenProvider);

        $service->logout($request, $response, $token);

        $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared());
    }

    public function testLoginFail()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null));
        $request = new Request();

        $this->assertFalse($request->attributes->has(RememberMeServicesInterface::COOKIE_ATTR_NAME));
        $service->loginFail($request);
        $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared());
    }

    public function testLoginSuccessSetsCookieWhenLoggedInWithNonRememberMeTokenInterfaceImplementation()
    {
        $service = $this->getService(null, array('name' => 'foo', 'domain' => 'myfoodomain.foo', 'path' => '/foo/path', 'secure' => true, 'httponly' => true, 'lifetime' => 3600, 'always_remember_me' => true));
        $request = new Request();
        $response = new Response();

        $account = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $account
            ->expects($this->once())
            ->method('getUsername')
            ->will($this->returnValue('foo'))
        ;
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token
            ->expects($this->any())
            ->method('getUser')
            ->will($this->returnValue($account))
        ;

        $tokenProvider = $this->getMock('Symfony\Component\Security\Core\Authentication\RememberMe\TokenProviderInterface');
        $tokenProvider
            ->expects($this->once())
            ->method('createNewToken')
        ;
        $service->setTokenProvider($tokenProvider);

        $cookies = $response->headers->getCookies();
        $this->assertCount(0, $cookies);

        $service->loginSuccess($request, $response, $token);

        $cookies = $response->headers->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
        $cookie  = $cookies['myfoodomain.foo']['/foo/path']['foo'];
        $this->assertFalse($cookie->isCleared());
        $this->assertTrue($cookie->isSecure());
        $this->assertTrue($cookie->isHttpOnly());
        $this->assertTrue($cookie->getExpiresTime() > time() + 3590 && $cookie->getExpiresTime() < time() + 3610);
        $this->assertEquals('myfoodomain.foo', $cookie->getDomain());
        $this->assertEquals('/foo/path', $cookie->getPath());
    }

    protected function encodeCookie(array $parts)
    {
        $service = $this->getService();
        $r = new \ReflectionMethod($service, 'encodeCookie');
        $r->setAccessible(true);

        return $r->invoke($service, $parts);
    }

    protected function getService($userProvider = null, $options = array(), $logger = null)
    {
        if (null === $userProvider) {
            $userProvider = $this->getProvider();
        }

        return new PersistentTokenBasedRememberMeServices(array($userProvider), 'fookey', 'fookey', $options, $logger, new SecureRandom(sys_get_temp_dir().'/_sf2.seed'));
    }

    protected function getProvider()
    {
        $provider = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
        $provider
            ->expects($this->any())
            ->method('supportsClass')
            ->will($this->returnValue(true))
        ;

        return $provider;
    }
}
PK�b�\�gZ)Z)hpear/test/Security/Symfony/Component/Security/Http/Tests/RememberMe/TokenBasedRememberMeServicesTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\RememberMe;

use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface;

use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Security\Http\RememberMe\TokenBasedRememberMeServices;

class TokenBasedRememberMeServicesTest extends \PHPUnit_Framework_TestCase
{
    public function testAutoLoginReturnsNullWhenNoCookie()
    {
        $service = $this->getService(null, array('name' => 'foo'));

        $this->assertNull($service->autoLogin(new Request()));
    }

    public function testAutoLoginThrowsExceptionOnInvalidCookie()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null, 'always_remember_me' => false, 'remember_me_parameter' => 'foo'));
        $request = new Request();
        $request->request->set('foo', 'true');
        $request->cookies->set('foo', 'foo');

        $this->assertNull($service->autoLogin($request));
        $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared());
    }

    public function testAutoLoginThrowsExceptionOnNonExistentUser()
    {
        $userProvider = $this->getProvider();
        $service = $this->getService($userProvider, array('name' => 'foo', 'path' => null, 'domain' => null, 'always_remember_me' => true, 'lifetime' => 3600));
        $request = new Request();
        $request->cookies->set('foo', $this->getCookie('fooclass', 'foouser', time()+3600, 'foopass'));

        $userProvider
            ->expects($this->once())
            ->method('loadUserByUsername')
            ->will($this->throwException(new UsernameNotFoundException('user not found')))
        ;

        $this->assertNull($service->autoLogin($request));
        $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared());
    }

    public function testAutoLoginDoesNotAcceptCookieWithInvalidHash()
    {
        $userProvider = $this->getProvider();
        $service = $this->getService($userProvider, array('name' => 'foo', 'path' => null, 'domain' => null, 'always_remember_me' => true, 'lifetime' => 3600));
        $request = new Request();
        $request->cookies->set('foo', base64_encode('class:'.base64_encode('foouser').':123456789:fooHash'));

        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user
            ->expects($this->once())
            ->method('getPassword')
            ->will($this->returnValue('foopass'))
        ;

        $userProvider
            ->expects($this->once())
            ->method('loadUserByUsername')
            ->with($this->equalTo('foouser'))
            ->will($this->returnValue($user))
        ;

        $this->assertNull($service->autoLogin($request));
        $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared());
    }

    public function testAutoLoginDoesNotAcceptAnExpiredCookie()
    {
        $userProvider = $this->getProvider();
        $service = $this->getService($userProvider, array('name' => 'foo', 'path' => null, 'domain' => null, 'always_remember_me' => true, 'lifetime' => 3600));
        $request = new Request();
        $request->cookies->set('foo', $this->getCookie('fooclass', 'foouser', time() - 1, 'foopass'));

        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user
            ->expects($this->once())
            ->method('getPassword')
            ->will($this->returnValue('foopass'))
        ;

        $userProvider
            ->expects($this->once())
            ->method('loadUserByUsername')
            ->with($this->equalTo('foouser'))
            ->will($this->returnValue($user))
        ;

        $this->assertNull($service->autoLogin($request));
        $this->assertTrue($request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME)->isCleared());
    }

    public function testAutoLogin()
    {
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user
            ->expects($this->once())
            ->method('getRoles')
            ->will($this->returnValue(array('ROLE_FOO')))
        ;
        $user
            ->expects($this->once())
            ->method('getPassword')
            ->will($this->returnValue('foopass'))
        ;

        $userProvider = $this->getProvider();
        $userProvider
            ->expects($this->once())
            ->method('loadUserByUsername')
            ->with($this->equalTo('foouser'))
            ->will($this->returnValue($user))
        ;

        $service = $this->getService($userProvider, array('name' => 'foo', 'always_remember_me' => true, 'lifetime' => 3600));
        $request = new Request();
        $request->cookies->set('foo', $this->getCookie('fooclass', 'foouser', time()+3600, 'foopass'));

        $returnedToken = $service->autoLogin($request);

        $this->assertInstanceOf('Symfony\Component\Security\Core\Authentication\Token\RememberMeToken', $returnedToken);
        $this->assertSame($user, $returnedToken->getUser());
        $this->assertEquals('fookey', $returnedToken->getKey());
    }

    public function testLogout()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => null, 'domain' => null));
        $request = new Request();
        $response = new Response();
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');

        $service->logout($request, $response, $token);

        $cookie = $request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME);
        $this->assertTrue($cookie->isCleared());
        $this->assertEquals('/', $cookie->getPath());
        $this->assertNull($cookie->getDomain());
    }

    public function testLoginFail()
    {
        $service = $this->getService(null, array('name' => 'foo', 'path' => '/foo', 'domain' => 'foodomain.foo'));
        $request = new Request();
        $response = new Response();

        $service->loginFail($request, $response);

        $cookie = $request->attributes->get(RememberMeServicesInterface::COOKIE_ATTR_NAME);
        $this->assertTrue($cookie->isCleared());
        $this->assertEquals('/foo', $cookie->getPath());
        $this->assertEquals('foodomain.foo', $cookie->getDomain());
    }

    public function testLoginSuccessIgnoresTokensWhichDoNotContainAnUserInterfaceImplementation()
    {
        $service = $this->getService(null, array('name' => 'foo', 'always_remember_me' => true, 'path' => null, 'domain' => null));
        $request = new Request();
        $response = new Response();
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token
            ->expects($this->once())
            ->method('getUser')
            ->will($this->returnValue('foo'))
        ;

        $cookies = $response->headers->getCookies();
        $this->assertCount(0, $cookies);

        $service->loginSuccess($request, $response, $token);

        $cookies = $response->headers->getCookies();
        $this->assertCount(0, $cookies);
    }

    public function testLoginSuccess()
    {
        $service = $this->getService(null, array('name' => 'foo', 'domain' => 'myfoodomain.foo', 'path' => '/foo/path', 'secure' => true, 'httponly' => true, 'lifetime' => 3600, 'always_remember_me' => true));
        $request = new Request();
        $response = new Response();

        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user
            ->expects($this->once())
            ->method('getPassword')
            ->will($this->returnValue('foopass'))
        ;
        $user
            ->expects($this->once())
            ->method('getUsername')
            ->will($this->returnValue('foouser'))
        ;
        $token
            ->expects($this->atLeastOnce())
            ->method('getUser')
            ->will($this->returnValue($user))
        ;

        $cookies = $response->headers->getCookies();
        $this->assertCount(0, $cookies);

        $service->loginSuccess($request, $response, $token);

        $cookies = $response->headers->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
        $cookie  = $cookies['myfoodomain.foo']['/foo/path']['foo'];
        $this->assertFalse($cookie->isCleared());
        $this->assertTrue($cookie->isSecure());
        $this->assertTrue($cookie->isHttpOnly());
        $this->assertTrue($cookie->getExpiresTime() > time() + 3590 && $cookie->getExpiresTime() < time() + 3610);
        $this->assertEquals('myfoodomain.foo', $cookie->getDomain());
        $this->assertEquals('/foo/path', $cookie->getPath());
    }

    protected function getCookie($class, $username, $expires, $password)
    {
        $service = $this->getService();
        $r = new \ReflectionMethod($service, 'generateCookieValue');
        $r->setAccessible(true);

        return $r->invoke($service, $class, $username, $expires, $password);
    }

    protected function encodeCookie(array $parts)
    {
        $service = $this->getService();
        $r = new \ReflectionMethod($service, 'encodeCookie');
        $r->setAccessible(true);

        return $r->invoke($service, $parts);
    }

    protected function getService($userProvider = null, $options = array(), $logger = null)
    {
        if (null === $userProvider) {
            $userProvider = $this->getProvider();
        }

        $service = new TokenBasedRememberMeServices(array($userProvider), 'fookey', 'fookey', $options, $logger);

        return $service;
    }

    protected function getProvider()
    {
        $provider = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
        $provider
            ->expects($this->any())
            ->method('supportsClass')
            ->will($this->returnValue(true))
        ;

        return $provider;
    }
}
PK�b�\��ʅ
�
\pear/test/Security/Symfony/Component/Security/Http/Tests/RememberMe/ResponseListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Http\Tests\RememberMe;

use Symfony\Component\Security\Http\RememberMe\ResponseListener;
use Symfony\Component\Security\Http\RememberMe\RememberMeServicesInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\KernelEvents;

class ResponseListenerTest extends \PHPUnit_Framework_TestCase
{
    public function testRememberMeCookieIsSentWithResponse()
    {
        $cookie = new Cookie('rememberme');

        $request = $this->getRequest(array(
            RememberMeServicesInterface::COOKIE_ATTR_NAME => $cookie
        ));

        $response = $this->getResponse();
        $response->headers->expects($this->once())->method('setCookie')->with($cookie);

        $listener = new ResponseListener();
        $listener->onKernelResponse($this->getEvent($request, $response));
    }

    public function testRememberMeCookieIsNotSendWithResponse()
    {
        $request = $this->getRequest();

        $response = $this->getResponse();
        $response->headers->expects($this->never())->method('setCookie');

        $listener = new ResponseListener();
        $listener->onKernelResponse($this->getEvent($request, $response));
    }

    public function testItSubscribesToTheOnKernelResponseEvent()
    {
        $listener = new ResponseListener();

        $this->assertSame(array(KernelEvents::RESPONSE => 'onKernelResponse'), ResponseListener::getSubscribedEvents());
    }

    private function getRequest(array $attributes = array())
    {
        $request = new Request();

        foreach ($attributes as $name => $value) {
            $request->attributes->set($name, $value);
        }

        return $request;
    }

    private function getResponse()
    {
        $response = $this->getMock('Symfony\Component\HttpFoundation\Response');
        $response->headers = $this->getMock('Symfony\Component\HttpFoundation\ResponseHeaderBag');

        return $response;
    }

    private function getEvent($request, $response)
    {
        $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\FilterResponseEvent')
            ->disableOriginalConstructor()
            ->getMock();

        $event->expects($this->any())->method('getRequest')->will($this->returnValue($request));
        $event->expects($this->any())->method('getResponse')->will($this->returnValue($response));

        return $event;
    }
}
PK�b�\]�P�<<Cpear/test/Security/Symfony/Component/Security/Core/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Security Component Core Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./vendor</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\n�;�SSQpear/test/Security/Symfony/Component/Security/Core/Tests/Util/StringUtilsTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Util;

use Symfony\Component\Security\Core\Util\StringUtils;

class StringUtilsTest extends \PHPUnit_Framework_TestCase
{
    public function testEquals()
    {
        $this->assertTrue(StringUtils::equals('password', 'password'));
        $this->assertFalse(StringUtils::equals('password', 'foo'));
    }
}
PK�b�\�����Ppear/test/Security/Symfony/Component/Security/Core/Tests/Util/ClassUtilsTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Util
{
    use Symfony\Component\Security\Core\Util\ClassUtils;

    class ClassUtilsTest extends \PHPUnit_Framework_TestCase
    {
        public static function dataGetClass()
        {
            return array(
                array('stdClass', 'stdClass'),
                array('Symfony\Component\Security\Core\Util\ClassUtils', 'Symfony\Component\Security\Core\Util\ClassUtils'),
                array('MyProject\Proxies\__CG__\stdClass', 'stdClass'),
                array('MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\stdClass', 'stdClass'),
                array('MyProject\Proxies\__CG__\Symfony\Component\Security\Core\Tests\Util\ChildObject', 'Symfony\Component\Security\Core\Tests\Util\ChildObject'),
                array(new TestObject(), 'Symfony\Component\Security\Core\Tests\Util\TestObject'),
                array(new \Acme\DemoBundle\Proxy\__CG__\Symfony\Component\Security\Core\Tests\Util\TestObject(), 'Symfony\Component\Security\Core\Tests\Util\TestObject'),
            );
        }

        /**
         * @dataProvider dataGetClass
         */
        public function testGetRealClass($object, $expectedClassName)
        {
            $this->assertEquals($expectedClassName, ClassUtils::getRealClass($object));
        }
    }

    class TestObject
    {
    }
}

namespace Acme\DemoBundle\Proxy\__CG__\Symfony\Component\Security\Core\Tests\Util
{
    class TestObject extends \Symfony\Component\Security\Core\Tests\Util\TestObject
    {
    }
}
PK�b�\�KN��Rpear/test/Security/Symfony/Component/Security/Core/Tests/Util/SecureRandomTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Util;

use Symfony\Component\Security\Core\Util\SecureRandom;

class SecureRandomTest extends \PHPUnit_Framework_TestCase
{
    /**
     * T1: Monobit test
     *
     * @dataProvider getSecureRandoms
     */
    public function testMonobit($secureRandom)
    {
        $nbOnBits = substr_count($this->getBitSequence($secureRandom, 20000), '1');
        $this->assertTrue($nbOnBits > 9654 && $nbOnBits < 10346, 'Monobit test failed, number of turned on bits: '.$nbOnBits);
    }

    /**
     * T2: Chi-square test with 15 degrees of freedom (chi-Quadrat-Anpassungstest)
     *
     * @dataProvider getSecureRandoms
     */
    public function testPoker($secureRandom)
    {
        $b = $this->getBitSequence($secureRandom, 20000);
        $c = array();
        for ($i = 0; $i <= 15; $i++) {
            $c[$i] = 0;
        }

        for ($j = 1; $j <= 5000; $j++) {
            $k = 4 * $j - 1;
            $c[8 * $b[$k - 3] + 4 * $b[$k - 2] + 2 * $b[$k - 1] + $b[$k]] += 1;
        }

        $f = 0;
        for ($i = 0; $i <= 15; $i++) {
            $f += $c[$i] * $c[$i];
        }

        $Y = 16/5000 * $f - 5000;

        $this->assertTrue($Y > 1.03 && $Y < 57.4, 'Poker test failed, Y = '.$Y);
    }

    /**
     * Run test
     *
     * @dataProvider getSecureRandoms
     */
    public function testRun($secureRandom)
    {
        $b = $this->getBitSequence($secureRandom, 20000);

        $runs = array();
        for ($i = 1; $i <= 6; $i++) {
            $runs[$i] = 0;
        }

        $addRun = function ($run) use (&$runs) {
            if ($run > 6) {
                $run = 6;
            }

            $runs[$run] += 1;
        };

        $currentRun = 0;
        $lastBit = null;
        for ($i = 0; $i < 20000; $i++) {
            if ($lastBit === $b[$i]) {
                $currentRun += 1;
            } else {
                if ($currentRun > 0) {
                    $addRun($currentRun);
                }

                $lastBit = $b[$i];
                $currentRun = 0;
            }
        }
        if ($currentRun > 0) {
            $addRun($currentRun);
        }

        $this->assertTrue($runs[1] > 2267 && $runs[1] < 2733, 'Runs of length 1 outside of defined interval: '.$runs[1]);
        $this->assertTrue($runs[2] > 1079 && $runs[2] < 1421, 'Runs of length 2 outside of defined interval: '.$runs[2]);
        $this->assertTrue($runs[3] > 502 && $runs[3] < 748, 'Runs of length 3 outside of defined interval: '.$runs[3]);
        $this->assertTrue($runs[4] > 233 && $runs[4] < 402, 'Runs of length 4 outside of defined interval: '.$runs[4]);
        $this->assertTrue($runs[5] > 90 && $runs[5] < 223, 'Runs of length 5 outside of defined interval: '.$runs[5]);
        $this->assertTrue($runs[6] > 90 && $runs[6] < 233, 'Runs of length 6 outside of defined interval: '.$runs[6]);
    }

    /**
     * Long-run test
     *
     * @dataProvider getSecureRandoms
     */
    public function testLongRun($secureRandom)
    {
        $b = $this->getBitSequence($secureRandom, 20000);

        $longestRun = $currentRun = 0;
        $lastBit = null;
        for ($i = 0; $i < 20000; $i++) {
            if ($lastBit === $b[$i]) {
                $currentRun += 1;
            } else {
                if ($currentRun > $longestRun) {
                    $longestRun = $currentRun;
                }
                $lastBit = $b[$i];
                $currentRun = 0;
            }
        }
        if ($currentRun > $longestRun) {
            $longestRun = $currentRun;
        }

        $this->assertTrue($longestRun < 34, 'Failed longest run test: '.$longestRun);
    }

    /**
     * Serial Correlation (Autokorrelationstest)
     *
     * @dataProvider getSecureRandoms
     */
    public function testSerialCorrelation($secureRandom)
    {
        $shift = rand(1, 5000);
        $b = $this->getBitSequence($secureRandom, 20000);

        $Z = 0;
        for ($i = 0; $i < 5000; $i++) {
            $Z += $b[$i] === $b[$i + $shift] ? 1 : 0;
        }

        $this->assertTrue($Z > 2326 && $Z < 2674, 'Failed serial correlation test: '.$Z);
    }

    public function getSecureRandoms()
    {
        $secureRandoms = array();

        // only add if openssl is indeed present
        $secureRandom = new SecureRandom();
        if ($this->hasOpenSsl($secureRandom)) {
            $secureRandoms[] = array($secureRandom);
        }

        // no-openssl with custom seed provider
        $secureRandom = new SecureRandom(sys_get_temp_dir().'/_sf2.seed');
        $this->disableOpenSsl($secureRandom);
        $secureRandoms[] = array($secureRandom);

        return $secureRandoms;
    }

    protected function disableOpenSsl($secureRandom)
    {
        $ref = new \ReflectionProperty($secureRandom, 'useOpenSsl');
        $ref->setAccessible(true);
        $ref->setValue($secureRandom, false);
        $ref->setAccessible(false);
    }

    protected function hasOpenSsl($secureRandom)
    {
        $ref = new \ReflectionProperty($secureRandom, 'useOpenSsl');
        $ref->setAccessible(true);

        $ret = $ref->getValue($secureRandom);

        $ref->setAccessible(false);

        return $ret;
    }

    private function getBitSequence($secureRandom, $length)
    {
        $bitSequence = '';
        for ($i = 0; $i < $length; $i += 40) {
            $value = unpack('H*', $secureRandom->nextBytes(5));
            $value = str_pad(base_convert($value[1], 16, 2), 40, '0', STR_PAD_LEFT);
            $bitSequence .= $value;
        }

        return substr($bitSequence, 0, $length);
    }
}
PK�b�\t�S��Spear/test/Security/Symfony/Component/Security/Core/Tests/Role/RoleHierarchyTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Role;

use Symfony\Component\Security\Core\Role\RoleHierarchy;
use Symfony\Component\Security\Core\Role\Role;

class RoleHierarchyTest extends \PHPUnit_Framework_TestCase
{
    public function testGetReachableRoles()
    {
        $role = new RoleHierarchy(array(
            'ROLE_ADMIN' => array('ROLE_USER'),
            'ROLE_SUPER_ADMIN' => array('ROLE_ADMIN', 'ROLE_FOO'),
        ));

        $this->assertEquals(array(new Role('ROLE_USER')), $role->getReachableRoles(array(new Role('ROLE_USER'))));
        $this->assertEquals(array(new Role('ROLE_FOO')), $role->getReachableRoles(array(new Role('ROLE_FOO'))));
        $this->assertEquals(array(new Role('ROLE_ADMIN'), new Role('ROLE_USER')), $role->getReachableRoles(array(new Role('ROLE_ADMIN'))));
        $this->assertEquals(array(new Role('ROLE_FOO'), new Role('ROLE_ADMIN'), new Role('ROLE_USER')), $role->getReachableRoles(array(new Role('ROLE_FOO'), new Role('ROLE_ADMIN'))));
        $this->assertEquals(array(new Role('ROLE_SUPER_ADMIN'), new Role('ROLE_ADMIN'), new Role('ROLE_FOO'), new Role('ROLE_USER')), $role->getReachableRoles(array(new Role('ROLE_SUPER_ADMIN'))));
    }
}
PK�b�\xF�Jpear/test/Security/Symfony/Component/Security/Core/Tests/Role/RoleTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Role;

use Symfony\Component\Security\Core\Role\Role;

class RoleTest extends \PHPUnit_Framework_TestCase
{
    public function testGetRole()
    {
        $role = new Role('FOO');

        $this->assertEquals('FOO', $role->getRole());
    }
}
PK�b�\��{{Tpear/test/Security/Symfony/Component/Security/Core/Tests/Role/SwitchUserRoleTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Role;

use Symfony\Component\Security\Core\Role\SwitchUserRole;

class SwitchUserRoleTest extends \PHPUnit_Framework_TestCase
{
    public function testGetSource()
    {
        $role = new SwitchUserRole('FOO', $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));

        $this->assertSame($token, $role->getSource());
    }

    public function testGetRole()
    {
        $role = new SwitchUserRole('FOO', $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));

        $this->assertEquals('FOO', $role->getRole());
    }
}
PK�b�\��qWpear/test/Security/Symfony/Component/Security/Core/Tests/User/ChainUserProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\User;

use Symfony\Component\Security\Core\Exception\UnsupportedUserException;

use Symfony\Component\Security\Core\User\ChainUserProvider;

use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;

class ChainUserProviderTest extends \PHPUnit_Framework_TestCase
{
    public function testLoadUserByUsername()
    {
        $provider1 = $this->getProvider();
        $provider1
            ->expects($this->once())
            ->method('loadUserByUsername')
            ->with($this->equalTo('foo'))
            ->will($this->throwException(new UsernameNotFoundException('not found')))
        ;

        $provider2 = $this->getProvider();
        $provider2
            ->expects($this->once())
            ->method('loadUserByUsername')
            ->with($this->equalTo('foo'))
            ->will($this->returnValue($account = $this->getAccount()))
        ;

        $provider = new ChainUserProvider(array($provider1, $provider2));
        $this->assertSame($account, $provider->loadUserByUsername('foo'));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\UsernameNotFoundException
     */
    public function testLoadUserByUsernameThrowsUsernameNotFoundException()
    {
        $provider1 = $this->getProvider();
        $provider1
            ->expects($this->once())
            ->method('loadUserByUsername')
            ->with($this->equalTo('foo'))
            ->will($this->throwException(new UsernameNotFoundException('not found')))
        ;

        $provider2 = $this->getProvider();
        $provider2
            ->expects($this->once())
            ->method('loadUserByUsername')
            ->with($this->equalTo('foo'))
            ->will($this->throwException(new UsernameNotFoundException('not found')))
        ;

        $provider = new ChainUserProvider(array($provider1, $provider2));
        $provider->loadUserByUsername('foo');
    }

    public function testRefreshUser()
    {
        $provider1 = $this->getProvider();
        $provider1
            ->expects($this->once())
            ->method('refreshUser')
            ->will($this->throwException(new UnsupportedUserException('unsupported')))
        ;

        $provider2 = $this->getProvider();
        $provider2
            ->expects($this->once())
            ->method('refreshUser')
            ->will($this->returnValue($account = $this->getAccount()))
        ;

        $provider = new ChainUserProvider(array($provider1, $provider2));
        $this->assertSame($account, $provider->refreshUser($this->getAccount()));
    }

    public function testRefreshUserAgain()
    {
        $provider1 = $this->getProvider();
        $provider1
            ->expects($this->once())
            ->method('refreshUser')
            ->will($this->throwException(new UsernameNotFoundException('not found')))
        ;

        $provider2 = $this->getProvider();
        $provider2
            ->expects($this->once())
            ->method('refreshUser')
            ->will($this->returnValue($account = $this->getAccount()))
        ;

        $provider = new ChainUserProvider(array($provider1, $provider2));
        $this->assertSame($account, $provider->refreshUser($this->getAccount()));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\UnsupportedUserException
     */
    public function testRefreshUserThrowsUnsupportedUserException()
    {
        $provider1 = $this->getProvider();
        $provider1
            ->expects($this->once())
            ->method('refreshUser')
            ->will($this->throwException(new UnsupportedUserException('unsupported')))
        ;

        $provider2 = $this->getProvider();
        $provider2
            ->expects($this->once())
            ->method('refreshUser')
            ->will($this->throwException(new UnsupportedUserException('unsupported')))
        ;

        $provider = new ChainUserProvider(array($provider1, $provider2));
        $provider->refreshUser($this->getAccount());
    }

    public function testSupportsClass()
    {
        $provider1 = $this->getProvider();
        $provider1
            ->expects($this->once())
            ->method('supportsClass')
            ->with($this->equalTo('foo'))
            ->will($this->returnValue(false))
        ;

        $provider2 = $this->getProvider();
        $provider2
            ->expects($this->once())
            ->method('supportsClass')
            ->with($this->equalTo('foo'))
            ->will($this->returnValue(true))
        ;

        $provider = new ChainUserProvider(array($provider1, $provider2));
        $this->assertTrue($provider->supportsClass('foo'));
    }

    public function testSupportsClassWhenNotSupported()
    {
        $provider1 = $this->getProvider();
        $provider1
            ->expects($this->once())
            ->method('supportsClass')
            ->with($this->equalTo('foo'))
            ->will($this->returnValue(false))
        ;

        $provider2 = $this->getProvider();
        $provider2
            ->expects($this->once())
            ->method('supportsClass')
            ->with($this->equalTo('foo'))
            ->will($this->returnValue(false))
        ;

        $provider = new ChainUserProvider(array($provider1, $provider2));
        $this->assertFalse($provider->supportsClass('foo'));
    }

    protected function getAccount()
    {
        return $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
    }

    protected function getProvider()
    {
        return $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
    }
}
PK�b�\LS�(��Jpear/test/Security/Symfony/Component/Security/Core/Tests/User/UserTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\User;

use Symfony\Component\Security\Core\User\User;

class UserTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @covers Symfony\Component\Security\Core\User\User::__construct
     * @expectedException \InvalidArgumentException
     */
    public function testConstructorException()
    {
        new User('', 'superpass');
    }

    /**
     * @covers Symfony\Component\Security\Core\User\User::__construct
     * @covers Symfony\Component\Security\Core\User\User::getRoles
     */
    public function testGetRoles()
    {
        $user = new User('fabien', 'superpass');
        $this->assertEquals(array(), $user->getRoles());

        $user = new User('fabien', 'superpass', array('ROLE_ADMIN'));
        $this->assertEquals(array('ROLE_ADMIN'), $user->getRoles());
    }

    /**
     * @covers Symfony\Component\Security\Core\User\User::__construct
     * @covers Symfony\Component\Security\Core\User\User::getPassword
     */
    public function testGetPassword()
    {
        $user = new User('fabien', 'superpass');
        $this->assertEquals('superpass', $user->getPassword());
    }

    /**
     * @covers Symfony\Component\Security\Core\User\User::__construct
     * @covers Symfony\Component\Security\Core\User\User::getUsername
     */
    public function testGetUsername()
    {
        $user = new User('fabien', 'superpass');
        $this->assertEquals('fabien', $user->getUsername());
    }

    /**
     * @covers Symfony\Component\Security\Core\User\User::getSalt
     */
    public function testGetSalt()
    {
        $user = new User('fabien', 'superpass');
        $this->assertEquals('', $user->getSalt());
    }

    /**
     * @covers Symfony\Component\Security\Core\User\User::isAccountNonExpired
     */
    public function testIsAccountNonExpired()
    {
        $user = new User('fabien', 'superpass');
        $this->assertTrue($user->isAccountNonExpired());

        $user = new User('fabien', 'superpass', array(), true, false);
        $this->assertFalse($user->isAccountNonExpired());
    }

    /**
     * @covers Symfony\Component\Security\Core\User\User::isCredentialsNonExpired
     */
    public function testIsCredentialsNonExpired()
    {
        $user = new User('fabien', 'superpass');
        $this->assertTrue($user->isCredentialsNonExpired());

        $user = new User('fabien', 'superpass', array(), true, true, false);
        $this->assertFalse($user->isCredentialsNonExpired());
    }

    /**
     * @covers Symfony\Component\Security\Core\User\User::isAccountNonLocked
     */
    public function testIsAccountNonLocked()
    {
        $user = new User('fabien', 'superpass');
        $this->assertTrue($user->isAccountNonLocked());

        $user = new User('fabien', 'superpass', array(), true, true, true, false);
        $this->assertFalse($user->isAccountNonLocked());
    }

    /**
     * @covers Symfony\Component\Security\Core\User\User::isEnabled
     */
    public function testIsEnabled()
    {
        $user = new User('fabien', 'superpass');
        $this->assertTrue($user->isEnabled());

        $user = new User('fabien', 'superpass', array(), false);
        $this->assertFalse($user->isEnabled());
    }

    /**
     * @covers Symfony\Component\Security\Core\User\User::eraseCredentials
     */
    public function testEraseCredentials()
    {
        $user = new User('fabien', 'superpass');
        $user->eraseCredentials();
        $this->assertEquals('superpass', $user->getPassword());
    }
}
PK�b�\�j��KKkpear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Token/UsernamePasswordTokenTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\Token;

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Role\Role;

class UsernamePasswordTokenTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $token = new UsernamePasswordToken('foo', 'bar', 'key');
        $this->assertFalse($token->isAuthenticated());

        $token = new UsernamePasswordToken('foo', 'bar', 'key', array('ROLE_FOO'));
        $this->assertEquals(array(new Role('ROLE_FOO')), $token->getRoles());
        $this->assertTrue($token->isAuthenticated());
        $this->assertEquals('key', $token->getProviderKey());
    }

    /**
     * @expectedException \LogicException
     */
    public function testSetAuthenticatedToTrue()
    {
        $token = new UsernamePasswordToken('foo', 'bar', 'key');
        $token->setAuthenticated(true);
    }

    public function testSetAuthenticatedToFalse()
    {
        $token = new UsernamePasswordToken('foo', 'bar', 'key');
        $token->setAuthenticated(false);
        $this->assertFalse($token->isAuthenticated());
    }

    public function testEraseCredentials()
    {
        $token = new UsernamePasswordToken('foo', 'bar', 'key');
        $token->eraseCredentials();
        $this->assertEquals('', $token->getCredentials());
    }

    public function testToString()
    {
        $token = new UsernamePasswordToken('foo', '', 'foo', array('A', 'B'));
        $this->assertEquals('UsernamePasswordToken(user="foo", authenticated=true, roles="A, B")', (string) $token);
    }
}
PK�b�\�B3��$�$cpear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\Token;

use Symfony\Component\Security\Core\Authentication\Token\AbstractToken;
use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Security\Core\Role\SwitchUserRole;

class TestUser
{
    protected $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function __toString()
    {
        return $this->name;
    }
}

class ConcreteToken extends AbstractToken
{
    private $credentials = 'credentials_value';

    public function __construct($user, array $roles = array())
    {
        parent::__construct($roles);

        $this->setUser($user);
    }

    public function serialize()
    {
        return serialize(array($this->credentials, parent::serialize()));
    }

    public function unserialize($serialized)
    {
        list($this->credentials, $parentStr) = unserialize($serialized);
        parent::unserialize($parentStr);
    }

    public function getCredentials() {}
}

class AbstractTokenTest extends \PHPUnit_Framework_TestCase
{
    public function testGetUsername()
    {
        $token = $this->getToken(array('ROLE_FOO'));
        $token->setUser('fabien');
        $this->assertEquals('fabien', $token->getUsername());

        $token->setUser(new TestUser('fabien'));
        $this->assertEquals('fabien', $token->getUsername());

        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user->expects($this->once())->method('getUsername')->will($this->returnValue('fabien'));
        $token->setUser($user);
        $this->assertEquals('fabien', $token->getUsername());
    }

    public function testEraseCredentials()
    {
        $token = $this->getToken(array('ROLE_FOO'));

        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user->expects($this->once())->method('eraseCredentials');
        $token->setUser($user);

        $token->eraseCredentials();
    }

    /**
     * @covers Symfony\Component\Security\Core\Authentication\Token\AbstractToken::serialize
     * @covers Symfony\Component\Security\Core\Authentication\Token\AbstractToken::unserialize
     */
    public function testSerialize()
    {
        $token = $this->getToken(array('ROLE_FOO'));
        $token->setAttributes(array('foo' => 'bar'));

        $uToken = unserialize(serialize($token));

        $this->assertEquals($token->getRoles(), $uToken->getRoles());
        $this->assertEquals($token->getAttributes(), $uToken->getAttributes());
    }

    public function testSerializeParent()
    {
        $user = new TestUser('fabien');
        $token = new ConcreteToken($user, array('ROLE_FOO'));

        $parentToken = new ConcreteToken($user, array(new SwitchUserRole('ROLE_PREVIOUS', $token)));
        $uToken = unserialize(serialize($parentToken));

        $this->assertEquals(
            current($parentToken->getRoles())->getSource()->getUser(),
            current($uToken->getRoles())->getSource()->getUser()
        );
    }

    /**
     * @covers Symfony\Component\Security\Core\Authentication\Token\AbstractToken::__construct
     */
    public function testConstructor()
    {
        $token = $this->getToken(array('ROLE_FOO'));
        $this->assertEquals(array(new Role('ROLE_FOO')), $token->getRoles());

        $token = $this->getToken(array(new Role('ROLE_FOO')));
        $this->assertEquals(array(new Role('ROLE_FOO')), $token->getRoles());

        $token = $this->getToken(array(new Role('ROLE_FOO'), 'ROLE_BAR'));
        $this->assertEquals(array(new Role('ROLE_FOO'), new Role('ROLE_BAR')), $token->getRoles());
    }

    /**
     * @covers Symfony\Component\Security\Core\Authentication\Token\AbstractToken::isAuthenticated
     * @covers Symfony\Component\Security\Core\Authentication\Token\AbstractToken::setAuthenticated
     */
    public function testAuthenticatedFlag()
    {
        $token = $this->getToken();
        $this->assertFalse($token->isAuthenticated());

        $token->setAuthenticated(true);
        $this->assertTrue($token->isAuthenticated());

        $token->setAuthenticated(false);
        $this->assertFalse($token->isAuthenticated());
    }

    /**
     * @covers Symfony\Component\Security\Core\Authentication\Token\AbstractToken::getAttributes
     * @covers Symfony\Component\Security\Core\Authentication\Token\AbstractToken::setAttributes
     * @covers Symfony\Component\Security\Core\Authentication\Token\AbstractToken::hasAttribute
     * @covers Symfony\Component\Security\Core\Authentication\Token\AbstractToken::getAttribute
     * @covers Symfony\Component\Security\Core\Authentication\Token\AbstractToken::setAttribute
     */
    public function testAttributes()
    {
        $attributes = array('foo' => 'bar');
        $token = $this->getToken();
        $token->setAttributes($attributes);

        $this->assertEquals($attributes, $token->getAttributes(), '->getAttributes() returns the token attributes');
        $this->assertEquals('bar', $token->getAttribute('foo'), '->getAttribute() returns the value of an attribute');
        $token->setAttribute('foo', 'foo');
        $this->assertEquals('foo', $token->getAttribute('foo'), '->setAttribute() changes the value of an attribute');
        $this->assertTrue($token->hasAttribute('foo'), '->hasAttribute() returns true if the attribute is defined');
        $this->assertFalse($token->hasAttribute('oof'), '->hasAttribute() returns false if the attribute is not defined');

        try {
            $token->getAttribute('foobar');
            $this->fail('->getAttribute() throws an \InvalidArgumentException exception when the attribute does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->getAttribute() throws an \InvalidArgumentException exception when the attribute does not exist');
            $this->assertEquals('This token has no "foobar" attribute.', $e->getMessage(), '->getAttribute() throws an \InvalidArgumentException exception when the attribute does not exist');
        }
    }

    /**
     * @dataProvider getUsers
     */
    public function testSetUser($user)
    {
        $token = $this->getToken();
        $token->setUser($user);
        $this->assertSame($user, $token->getUser());
    }

    public function getUsers()
    {
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $advancedUser = $this->getMock('Symfony\Component\Security\Core\User\AdvancedUserInterface');

        return array(
            array($advancedUser),
            array($user),
            array(new TestUser('foo')),
            array('foo'),
        );
    }

    /**
     * @dataProvider getUserChanges
     */
    public function testSetUserSetsAuthenticatedToFalseWhenUserChanges($firstUser, $secondUser)
    {
        $token = $this->getToken();
        $token->setAuthenticated(true);
        $this->assertTrue($token->isAuthenticated());

        $token->setUser($firstUser);
        $this->assertTrue($token->isAuthenticated());

        $token->setUser($secondUser);
        $this->assertFalse($token->isAuthenticated());
    }

    public function getUserChanges()
    {
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $advancedUser = $this->getMock('Symfony\Component\Security\Core\User\AdvancedUserInterface');

        return array(
            array(
                'foo', 'bar',
            ),
            array(
                'foo', new TestUser('bar'),
            ),
            array(
                'foo', $user,
            ),
            array(
                'foo', $advancedUser
            ),
            array(
                $user, 'foo'
            ),
            array(
                $advancedUser, 'foo'
            ),
            array(
                $user, new TestUser('foo'),
            ),
            array(
                $advancedUser, new TestUser('foo'),
            ),
            array(
                new TestUser('foo'), new TestUser('bar'),
            ),
            array(
                new TestUser('foo'), 'bar',
            ),
            array(
                new TestUser('foo'), $user,
            ),
            array(
                new TestUser('foo'), $advancedUser,
            ),
            array(
                $user, $advancedUser
            ),
            array(
                $advancedUser, $user
            ),
        );
    }

    /**
     * @dataProvider getUsers
     */
    public function testSetUserDoesNotSetAuthenticatedToFalseWhenUserDoesNotChange($user)
    {
        $token = $this->getToken();
        $token->setAuthenticated(true);
        $this->assertTrue($token->isAuthenticated());

        $token->setUser($user);
        $this->assertTrue($token->isAuthenticated());

        $token->setUser($user);
        $this->assertTrue($token->isAuthenticated());
    }

    protected function getToken(array $roles = array())
    {
        return $this->getMockForAbstractClass('Symfony\Component\Security\Core\Authentication\Token\AbstractToken', array($roles));
    }
}
PK�b�\d���kpear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Token/PreAuthenticatedTokenTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\Token;

use Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken;
use Symfony\Component\Security\Core\Role\Role;

class PreAuthenticatedTokenTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $token = new PreAuthenticatedToken('foo', 'bar', 'key');
        $this->assertFalse($token->isAuthenticated());

        $token = new PreAuthenticatedToken('foo', 'bar', 'key', array('ROLE_FOO'));
        $this->assertTrue($token->isAuthenticated());
        $this->assertEquals(array(new Role('ROLE_FOO')), $token->getRoles());
        $this->assertEquals('key', $token->getProviderKey());
    }

    public function testGetCredentials()
    {
        $token = new PreAuthenticatedToken('foo', 'bar', 'key');
        $this->assertEquals('bar', $token->getCredentials());
    }

    public function testGetUser()
    {
        $token = new PreAuthenticatedToken('foo', 'bar', 'key');
        $this->assertEquals('foo', $token->getUser());
    }

    public function testEraseCredentials()
    {
        $token = new PreAuthenticatedToken('foo', 'bar', 'key');
        $token->eraseCredentials();
        $this->assertEquals('', $token->getCredentials());
    }
}
PK�b�\��ۛ��dpear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Token/AnonymousTokenTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\Token;

use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
use Symfony\Component\Security\Core\Role\Role;

class AnonymousTokenTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $token = new AnonymousToken('foo', 'bar');
        $this->assertTrue($token->isAuthenticated());

        $token = new AnonymousToken('foo', 'bar', array('ROLE_FOO'));
        $this->assertEquals(array(new Role('ROLE_FOO')), $token->getRoles());
    }

    public function testGetKey()
    {
        $token = new AnonymousToken('foo', 'bar');
        $this->assertEquals('foo', $token->getKey());
    }

    public function testGetCredentials()
    {
        $token = new AnonymousToken('foo', 'bar');
        $this->assertEquals('', $token->getCredentials());
    }

    public function testGetUser()
    {
        $token = new AnonymousToken('foo', 'bar');
        $this->assertEquals('bar', $token->getUser());
    }
}
PK�b�\I?��

kpear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/AuthenticationTrustResolverTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication;

use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver;

class AuthenticationTrustResolverTest extends \PHPUnit_Framework_TestCase
{
    public function testIsAnonymous()
    {
        $resolver = $this->getResolver();

        $this->assertFalse($resolver->isAnonymous(null));
        $this->assertFalse($resolver->isAnonymous($this->getToken()));
        $this->assertFalse($resolver->isAnonymous($this->getRememberMeToken()));
        $this->assertTrue($resolver->isAnonymous($this->getAnonymousToken()));
    }

    public function testIsRememberMe()
    {
        $resolver = $this->getResolver();

        $this->assertFalse($resolver->isRememberMe(null));
        $this->assertFalse($resolver->isRememberMe($this->getToken()));
        $this->assertFalse($resolver->isRememberMe($this->getAnonymousToken()));
        $this->assertTrue($resolver->isRememberMe($this->getRememberMeToken()));
    }

    public function testisFullFledged()
    {
        $resolver = $this->getResolver();

        $this->assertFalse($resolver->isFullFledged(null));
        $this->assertFalse($resolver->isFullFledged($this->getAnonymousToken()));
        $this->assertFalse($resolver->isFullFledged($this->getRememberMeToken()));
        $this->assertTrue($resolver->isFullFledged($this->getToken()));
    }

    protected function getToken()
    {
        return $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
    }

    protected function getAnonymousToken()
    {
        return $this->getMock('Symfony\Component\Security\Core\Authentication\Token\AnonymousToken', null, array('', ''));
    }

    protected function getRememberMeToken()
    {
        return $this->getMock('Symfony\Component\Security\Core\Authentication\Token\RememberMeToken', array('setPersistent'), array(), '', false);
    }

    protected function getResolver()
    {
        return new AuthenticationTrustResolver(
            'Symfony\\Component\\Security\\Core\\Authentication\\Token\\AnonymousToken',
            'Symfony\\Component\\Security\\Core\\Authentication\\Token\\RememberMeToken'
        );
    }
}
PK�b�\���ZZpear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider/PreAuthenticatedAuthenticationProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\Provider;

use Symfony\Component\Security\Core\Authentication\Provider\PreAuthenticatedAuthenticationProvider;

class PreAuthenticatedAuthenticationProviderTest extends \PHPUnit_Framework_TestCase
{
    public function testSupports()
    {
        $provider = $this->getProvider();

        $this->assertTrue($provider->supports($this->getSupportedToken()));
        $this->assertFalse($provider->supports($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')));

        $token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken')
                    ->disableOriginalConstructor()
                    ->getMock()
        ;
        $token
            ->expects($this->once())
            ->method('getProviderKey')
            ->will($this->returnValue('foo'))
        ;
        $this->assertFalse($provider->supports($token));
    }

    public function testAuthenticateWhenTokenIsNotSupported()
    {
        $provider = $this->getProvider();

        $this->assertNull($provider->authenticate($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testAuthenticateWhenNoUserIsSet()
    {
        $provider = $this->getProvider();
        $provider->authenticate($this->getSupportedToken(''));
    }

    public function testAuthenticate()
    {
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user
            ->expects($this->once())
            ->method('getRoles')
            ->will($this->returnValue(array()))
        ;
        $provider = $this->getProvider($user);

        $token = $provider->authenticate($this->getSupportedToken('fabien', 'pass'));
        $this->assertInstanceOf('Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken', $token);
        $this->assertEquals('pass', $token->getCredentials());
        $this->assertEquals('key', $token->getProviderKey());
        $this->assertEquals(array(), $token->getRoles());
        $this->assertEquals(array('foo' => 'bar'), $token->getAttributes(), '->authenticate() copies token attributes');
        $this->assertSame($user, $token->getUser());
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\LockedException
     */
    public function testAuthenticateWhenUserCheckerThrowsException()
    {
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');

        $userChecker = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
        $userChecker->expects($this->once())
                    ->method('checkPostAuth')
                    ->will($this->throwException($this->getMock('Symfony\Component\Security\Core\Exception\LockedException', null, array(), '', false)))
        ;

        $provider = $this->getProvider($user, $userChecker);

        $provider->authenticate($this->getSupportedToken('fabien'));
    }

    protected function getSupportedToken($user = false, $credentials = false)
    {
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken', array('getUser', 'getCredentials', 'getProviderKey'), array(), '', false);
        if (false !== $user) {
            $token->expects($this->once())
                  ->method('getUser')
                  ->will($this->returnValue($user))
            ;
        }
        if (false !== $credentials) {
            $token->expects($this->once())
                  ->method('getCredentials')
                  ->will($this->returnValue($credentials))
            ;
        }

        $token
            ->expects($this->any())
            ->method('getProviderKey')
            ->will($this->returnValue('key'))
        ;

        $token->setAttributes(array('foo' => 'bar'));

        return $token;
    }

    protected function getProvider($user = null, $userChecker = null)
    {
        $userProvider = $this->getMock('Symfony\Component\Security\Core\User\UserProviderInterface');
        if (null !== $user) {
            $userProvider->expects($this->once())
                         ->method('loadUserByUsername')
                         ->will($this->returnValue($user))
            ;
        }

        if (null === $userChecker) {
            $userChecker = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
        }

        return new PreAuthenticatedAuthenticationProvider($userProvider, $userChecker, 'key');
    }
}
PK�b�\P��[.[.rpear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider/DaoAuthenticationProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\Provider;

use Symfony\Component\Security\Core\Encoder\PlaintextPasswordEncoder;

use Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider;

class DaoAuthenticationProviderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AuthenticationServiceException
     */
    public function testRetrieveUserWhenProviderDoesNotReturnAnUserInterface()
    {
        $provider = $this->getProvider('fabien');
        $method = new \ReflectionMethod($provider, 'retrieveUser');
        $method->setAccessible(true);

        $method->invoke($provider, 'fabien', $this->getSupportedToken());
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\UsernameNotFoundException
     */
    public function testRetrieveUserWhenUsernameIsNotFound()
    {
        $userProvider = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface');
        $userProvider->expects($this->once())
                     ->method('loadUserByUsername')
                     ->will($this->throwException($this->getMock('Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException', null, array(), '', false)))
        ;

        $provider = new DaoAuthenticationProvider($userProvider, $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserCheckerInterface'), 'key', $this->getMock('Symfony\\Component\\Security\\Core\\Encoder\\EncoderFactoryInterface'));
        $method = new \ReflectionMethod($provider, 'retrieveUser');
        $method->setAccessible(true);

        $method->invoke($provider, 'fabien', $this->getSupportedToken());
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AuthenticationServiceException
     */
    public function testRetrieveUserWhenAnExceptionOccurs()
    {
        $userProvider = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface');
        $userProvider->expects($this->once())
                     ->method('loadUserByUsername')
                     ->will($this->throwException($this->getMock('RuntimeException', null, array(), '', false)))
        ;

        $provider = new DaoAuthenticationProvider($userProvider, $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserCheckerInterface'), 'key', $this->getMock('Symfony\\Component\\Security\\Core\\Encoder\\EncoderFactoryInterface'));
        $method = new \ReflectionMethod($provider, 'retrieveUser');
        $method->setAccessible(true);

        $method->invoke($provider, 'fabien', $this->getSupportedToken());
    }

    public function testRetrieveUserReturnsUserFromTokenOnReauthentication()
    {
        $userProvider = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface');
        $userProvider->expects($this->never())
                     ->method('loadUserByUsername')
        ;

        $user = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserInterface');
        $token = $this->getSupportedToken();
        $token->expects($this->once())
              ->method('getUser')
              ->will($this->returnValue($user))
        ;

        $provider = new DaoAuthenticationProvider($userProvider, $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserCheckerInterface'), 'key', $this->getMock('Symfony\\Component\\Security\\Core\\Encoder\\EncoderFactoryInterface'));
        $reflection = new \ReflectionMethod($provider, 'retrieveUser');
        $reflection->setAccessible(true);
        $result = $reflection->invoke($provider, null, $token);

        $this->assertSame($user, $result);
    }

    public function testRetrieveUser()
    {
        $user = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserInterface');

        $userProvider = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface');
        $userProvider->expects($this->once())
                     ->method('loadUserByUsername')
                     ->will($this->returnValue($user))
        ;

        $provider = new DaoAuthenticationProvider($userProvider, $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserCheckerInterface'), 'key', $this->getMock('Symfony\\Component\\Security\\Core\\Encoder\\EncoderFactoryInterface'));
        $method = new \ReflectionMethod($provider, 'retrieveUser');
        $method->setAccessible(true);

        $this->assertSame($user, $method->invoke($provider, 'fabien', $this->getSupportedToken()));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testCheckAuthenticationWhenCredentialsAreEmpty()
    {
        $encoder = $this->getMock('Symfony\\Component\\Security\\Core\\Encoder\\PasswordEncoderInterface');
        $encoder
            ->expects($this->never())
            ->method('isPasswordValid')
        ;

        $provider = $this->getProvider(null, null, $encoder);
        $method = new \ReflectionMethod($provider, 'checkAuthentication');
        $method->setAccessible(true);

        $token = $this->getSupportedToken();
        $token
            ->expects($this->once())
            ->method('getCredentials')
            ->will($this->returnValue(''))
        ;

        $method->invoke(
            $provider,
            $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserInterface'),
            $token
        );
    }

    public function testCheckAuthenticationWhenCredentialsAre0()
    {
        $encoder = $this->getMock('Symfony\\Component\\Security\\Core\\Encoder\\PasswordEncoderInterface');
        $encoder
            ->expects($this->once())
            ->method('isPasswordValid')
            ->will($this->returnValue(true))
        ;

        $provider = $this->getProvider(null, null, $encoder);
        $method = new \ReflectionMethod($provider, 'checkAuthentication');
        $method->setAccessible(true);

        $token = $this->getSupportedToken();
        $token
            ->expects($this->once())
            ->method('getCredentials')
            ->will($this->returnValue('0'))
        ;

        $method->invoke(
            $provider,
            $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserInterface'),
            $token
        );
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testCheckAuthenticationWhenCredentialsAreNotValid()
    {
        $encoder = $this->getMock('Symfony\\Component\\Security\\Core\\Encoder\\PasswordEncoderInterface');
        $encoder->expects($this->once())
                ->method('isPasswordValid')
                ->will($this->returnValue(false))
        ;

        $provider = $this->getProvider(null, null, $encoder);
        $method = new \ReflectionMethod($provider, 'checkAuthentication');
        $method->setAccessible(true);

        $token = $this->getSupportedToken();
        $token->expects($this->once())
              ->method('getCredentials')
              ->will($this->returnValue('foo'))
        ;

        $method->invoke($provider, $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserInterface'), $token);
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testCheckAuthenticationDoesNotReauthenticateWhenPasswordHasChanged()
    {
        $user = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserInterface');
        $user->expects($this->once())
             ->method('getPassword')
             ->will($this->returnValue('foo'))
        ;

        $token = $this->getSupportedToken();
        $token->expects($this->once())
              ->method('getUser')
              ->will($this->returnValue($user));

        $dbUser = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserInterface');
        $dbUser->expects($this->once())
               ->method('getPassword')
               ->will($this->returnValue('newFoo'))
        ;

        $provider = $this->getProvider();
        $reflection = new \ReflectionMethod($provider, 'checkAuthentication');
        $reflection->setAccessible(true);
        $reflection->invoke($provider, $dbUser, $token);
    }

    public function testCheckAuthenticationWhenTokenNeedsReauthenticationWorksWithoutOriginalCredentials()
    {
        $user = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserInterface');
        $user->expects($this->once())
             ->method('getPassword')
             ->will($this->returnValue('foo'))
        ;

        $token = $this->getSupportedToken();
        $token->expects($this->once())
              ->method('getUser')
              ->will($this->returnValue($user));

        $dbUser = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserInterface');
        $dbUser->expects($this->once())
               ->method('getPassword')
               ->will($this->returnValue('foo'))
        ;

        $provider = $this->getProvider();
        $reflection = new \ReflectionMethod($provider, 'checkAuthentication');
        $reflection->setAccessible(true);
        $reflection->invoke($provider, $dbUser, $token);
    }

    public function testCheckAuthentication()
    {
        $encoder = $this->getMock('Symfony\\Component\\Security\\Core\\Encoder\\PasswordEncoderInterface');
        $encoder->expects($this->once())
                ->method('isPasswordValid')
                ->will($this->returnValue(true))
        ;

        $provider = $this->getProvider(null, null, $encoder);
        $method = new \ReflectionMethod($provider, 'checkAuthentication');
        $method->setAccessible(true);

        $token = $this->getSupportedToken();
        $token->expects($this->once())
              ->method('getCredentials')
              ->will($this->returnValue('foo'))
        ;

        $method->invoke($provider, $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserInterface'), $token);
    }

    protected function getSupportedToken()
    {
        $mock = $this->getMock('Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken', array('getCredentials', 'getUser', 'getProviderKey'), array(), '', false);
        $mock
            ->expects($this->any())
            ->method('getProviderKey')
            ->will($this->returnValue('key'))
        ;

        return $mock;
    }

    protected function getProvider($user = null, $userChecker = null, $passwordEncoder = null)
    {
        $userProvider = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserProviderInterface');
        if (null !== $user) {
            $userProvider->expects($this->once())
                         ->method('loadUserByUsername')
                         ->will($this->returnValue($user))
            ;
        }

        if (null === $userChecker) {
            $userChecker = $this->getMock('Symfony\\Component\\Security\\Core\\User\\UserCheckerInterface');
        }

        if (null === $passwordEncoder) {
            $passwordEncoder = new PlaintextPasswordEncoder();
        }

        $encoderFactory = $this->getMock('Symfony\\Component\\Security\\Core\\Encoder\\EncoderFactoryInterface');
        $encoderFactory
            ->expects($this->any())
            ->method('getEncoder')
            ->will($this->returnValue($passwordEncoder))
        ;

        return new DaoAuthenticationProvider($userProvider, $userChecker, 'key', $encoderFactory);
    }
}
PK�b�\�$��xpear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider/AnonymousAuthenticationProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\Provider;

use Symfony\Component\Security\Core\Authentication\Provider\AnonymousAuthenticationProvider;

class AnonymousAuthenticationProviderTest extends \PHPUnit_Framework_TestCase
{
    public function testSupports()
    {
        $provider = $this->getProvider('foo');

        $this->assertTrue($provider->supports($this->getSupportedToken('foo')));
        $this->assertFalse($provider->supports($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')));
    }

    public function testAuthenticateWhenTokenIsNotSupported()
    {
        $provider = $this->getProvider('foo');

        $this->assertNull($provider->authenticate($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testAuthenticateWhenKeyIsNotValid()
    {
        $provider = $this->getProvider('foo');

        $this->assertNull($provider->authenticate($this->getSupportedToken('bar')));
    }

    public function testAuthenticate()
    {
        $provider = $this->getProvider('foo');
        $token = $this->getSupportedToken('foo');

        $this->assertSame($token, $provider->authenticate($token));
    }

    protected function getSupportedToken($key)
    {
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\AnonymousToken', array('getKey'), array(), '', false);
        $token->expects($this->any())
              ->method('getKey')
              ->will($this->returnValue($key))
        ;

        return $token;
    }

    protected function getProvider($key)
    {
        return new AnonymousAuthenticationProvider($key);
    }
}
PK�b�\ו�Gi&i&spear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider/UserAuthenticationProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\Provider;

use Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider;
use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Security\Core\Role\SwitchUserRole;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;

class UserAuthenticationProviderTest extends \PHPUnit_Framework_TestCase
{
    public function testSupports()
    {
        $provider = $this->getProvider();

        $this->assertTrue($provider->supports($this->getSupportedToken()));
        $this->assertFalse($provider->supports($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')));
    }

    public function testAuthenticateWhenTokenIsNotSupported()
    {
        $provider = $this->getProvider();

        $this->assertNull($provider->authenticate($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\UsernameNotFoundException
     */
    public function testAuthenticateWhenUsernameIsNotFound()
    {
        $provider = $this->getProvider(false, false);
        $provider->expects($this->once())
                 ->method('retrieveUser')
                 ->will($this->throwException($this->getMock('Symfony\Component\Security\Core\Exception\UsernameNotFoundException', null, array(), '', false)))
        ;

        $provider->authenticate($this->getSupportedToken());
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testAuthenticateWhenUsernameIsNotFoundAndHideIsTrue()
    {
        $provider = $this->getProvider(false, true);
        $provider->expects($this->once())
                 ->method('retrieveUser')
                 ->will($this->throwException($this->getMock('Symfony\Component\Security\Core\Exception\UsernameNotFoundException', null, array(), '', false)))
        ;

        $provider->authenticate($this->getSupportedToken());
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AuthenticationServiceException
     */
    public function testAuthenticateWhenProviderDoesNotReturnAnUserInterface()
    {
        $provider = $this->getProvider(false, true);
        $provider->expects($this->once())
                 ->method('retrieveUser')
                 ->will($this->returnValue(null))
        ;

        $provider->authenticate($this->getSupportedToken());
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\CredentialsExpiredException
     */
    public function testAuthenticateWhenPreChecksFails()
    {
        $userChecker = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
        $userChecker->expects($this->once())
                    ->method('checkPreAuth')
                    ->will($this->throwException($this->getMock('Symfony\Component\Security\Core\Exception\CredentialsExpiredException', null, array(), '', false)))
        ;

        $provider = $this->getProvider($userChecker);
        $provider->expects($this->once())
                 ->method('retrieveUser')
                 ->will($this->returnValue($this->getMock('Symfony\Component\Security\Core\User\UserInterface')))
        ;

        $provider->authenticate($this->getSupportedToken());
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AccountExpiredException
     */
    public function testAuthenticateWhenPostChecksFails()
    {
        $userChecker = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
        $userChecker->expects($this->once())
                    ->method('checkPostAuth')
                    ->will($this->throwException($this->getMock('Symfony\Component\Security\Core\Exception\AccountExpiredException', null, array(), '', false)))
        ;

        $provider = $this->getProvider($userChecker);
        $provider->expects($this->once())
                 ->method('retrieveUser')
                 ->will($this->returnValue($this->getMock('Symfony\Component\Security\Core\User\UserInterface')))
        ;

        $provider->authenticate($this->getSupportedToken());
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     * @expectedExceptionMessage Bad credentials
     */
    public function testAuthenticateWhenPostCheckAuthenticationFails()
    {
        $provider = $this->getProvider();
        $provider->expects($this->once())
                 ->method('retrieveUser')
                 ->will($this->returnValue($this->getMock('Symfony\Component\Security\Core\User\UserInterface')))
        ;
        $provider->expects($this->once())
                 ->method('checkAuthentication')
                 ->will($this->throwException($this->getMock('Symfony\Component\Security\Core\Exception\BadCredentialsException', null, array(), '', false)))
        ;

        $provider->authenticate($this->getSupportedToken());
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     * @expectedExceptionMessage Foo
     */
    public function testAuthenticateWhenPostCheckAuthenticationFailsWithHideFalse()
    {
        $provider = $this->getProvider(false, false);
        $provider->expects($this->once())
                 ->method('retrieveUser')
                 ->will($this->returnValue($this->getMock('Symfony\Component\Security\Core\User\UserInterface')))
        ;
        $provider->expects($this->once())
                 ->method('checkAuthentication')
                 ->will($this->throwException(new BadCredentialsException('Foo')))
        ;

        $provider->authenticate($this->getSupportedToken());
    }

    public function testAuthenticate()
    {
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user->expects($this->once())
             ->method('getRoles')
             ->will($this->returnValue(array('ROLE_FOO')))
        ;

        $provider = $this->getProvider();
        $provider->expects($this->once())
                 ->method('retrieveUser')
                 ->will($this->returnValue($user))
        ;

        $token = $this->getSupportedToken();
        $token->expects($this->once())
              ->method('getCredentials')
              ->will($this->returnValue('foo'))
        ;

        $token->expects($this->once())
              ->method('getRoles')
              ->will($this->returnValue(array()))
        ;

        $authToken = $provider->authenticate($token);

        $this->assertInstanceOf('Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken', $authToken);
        $this->assertSame($user, $authToken->getUser());
        $this->assertEquals(array(new Role('ROLE_FOO')), $authToken->getRoles());
        $this->assertEquals('foo', $authToken->getCredentials());
        $this->assertEquals(array('foo' => 'bar'), $authToken->getAttributes(), '->authenticate() copies token attributes');
    }

    public function testAuthenticateWithPreservingRoleSwitchUserRole()
    {
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user->expects($this->once())
             ->method('getRoles')
             ->will($this->returnValue(array('ROLE_FOO')))
        ;

        $provider = $this->getProvider();
        $provider->expects($this->once())
                 ->method('retrieveUser')
                 ->will($this->returnValue($user))
        ;

        $token = $this->getSupportedToken();
        $token->expects($this->once())
              ->method('getCredentials')
              ->will($this->returnValue('foo'))
        ;

        $switchUserRole = new SwitchUserRole('foo', $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
        $token->expects($this->once())
              ->method('getRoles')
              ->will($this->returnValue(array($switchUserRole)))
        ;

        $authToken = $provider->authenticate($token);

        $this->assertInstanceOf('Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken', $authToken);
        $this->assertSame($user, $authToken->getUser());
        $this->assertContains(new Role('ROLE_FOO'), $authToken->getRoles(), '', false, false);
        $this->assertContains($switchUserRole, $authToken->getRoles());
        $this->assertEquals('foo', $authToken->getCredentials());
        $this->assertEquals(array('foo' => 'bar'), $authToken->getAttributes(), '->authenticate() copies token attributes');
    }

    protected function getSupportedToken()
    {
        $mock = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken', array('getCredentials', 'getProviderKey', 'getRoles'), array(), '', false);
        $mock
            ->expects($this->any())
            ->method('getProviderKey')
            ->will($this->returnValue('key'))
        ;

        $mock->setAttributes(array('foo' => 'bar'));

        return $mock;
    }

    protected function getProvider($userChecker = false, $hide = true)
    {
        if (false === $userChecker) {
            $userChecker = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
        }

        return $this->getMockForAbstractClass('Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider', array($userChecker, 'key', $hide));
    }
}
PK�b�\�75ttypear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/Provider/RememberMeAuthenticationProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\Provider;

use Symfony\Component\Security\Core\Authentication\Provider\RememberMeAuthenticationProvider;
use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
use Symfony\Component\Security\Core\Role\Role;

class RememberMeAuthenticationProviderTest extends \PHPUnit_Framework_TestCase
{
    public function testSupports()
    {
        $provider = $this->getProvider();

        $this->assertTrue($provider->supports($this->getSupportedToken()));
        $this->assertFalse($provider->supports($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')));
    }

    public function testAuthenticateWhenTokenIsNotSupported()
    {
        $provider = $this->getProvider();

        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $this->assertNull($provider->authenticate($token));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testAuthenticateWhenKeysDoNotMatch()
    {
        $provider = $this->getProvider(null, 'key1');
        $token = $this->getSupportedToken(null, 'key2');

        $provider->authenticate($token);
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AccountExpiredException
     */
    public function testAuthenticateWhenPostChecksFails()
    {
        $userChecker = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
        $userChecker->expects($this->once())
                    ->method('checkPostAuth')
                    ->will($this->throwException($this->getMock('Symfony\Component\Security\Core\Exception\AccountExpiredException', null, array(), '', false)))
        ;

        $provider = $this->getProvider($userChecker);

        $provider->authenticate($this->getSupportedToken());
    }

    public function testAuthenticate()
    {
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user->expects($this->exactly(2))
             ->method('getRoles')
             ->will($this->returnValue(array('ROLE_FOO')))
        ;

        $provider = $this->getProvider();

        $token = $this->getSupportedToken($user);
        $authToken = $provider->authenticate($token);

        $this->assertInstanceOf('Symfony\Component\Security\Core\Authentication\Token\RememberMeToken', $authToken);
        $this->assertSame($user, $authToken->getUser());
        $this->assertEquals(array(new Role('ROLE_FOO')), $authToken->getRoles());
        $this->assertEquals('', $authToken->getCredentials());
    }

    protected function getSupportedToken($user = null, $key = 'test')
    {
        if (null === $user) {
            $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
            $user
                ->expects($this->any())
                ->method('getRoles')
                ->will($this->returnValue(array()))
            ;
        }

        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\RememberMeToken', array('getProviderKey'), array($user, 'foo', $key));
        $token
            ->expects($this->once())
            ->method('getProviderKey')
            ->will($this->returnValue('foo'))
        ;

        return $token;
    }

    protected function getProvider($userChecker = null, $key = 'test')
    {
        if (null === $userChecker) {
            $userChecker = $this->getMock('Symfony\Component\Security\Core\User\UserCheckerInterface');
        }

        return new RememberMeAuthenticationProvider($userChecker, $key, 'foo');
    }
}
PK�b�\�����mpear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/AuthenticationProviderManagerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication;

use Symfony\Component\Security\Core\Authentication\AuthenticationProviderManager;
use Symfony\Component\Security\Core\Exception\ProviderNotFoundException;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

class AuthenticationProviderManagerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \InvalidArgumentException
     */
    public function testAuthenticateWithoutProviders()
    {
        new AuthenticationProviderManager(array());
    }

    public function testAuthenticateWhenNoProviderSupportsToken()
    {
        $manager = new AuthenticationProviderManager(array(
            $this->getAuthenticationProvider(false),
        ));

        try {
            $manager->authenticate($token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
            $this->fail();
        } catch (ProviderNotFoundException $e) {
            $this->assertSame($token, $e->getToken());
        }
    }

    public function testAuthenticateWhenProviderReturnsAccountStatusException()
    {
        $manager = new AuthenticationProviderManager(array(
            $this->getAuthenticationProvider(true, null, 'Symfony\Component\Security\Core\Exception\AccountStatusException'),
        ));

        try {
            $manager->authenticate($token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
            $this->fail();
        } catch (AccountStatusException $e) {
            $this->assertSame($token, $e->getToken());
        }
    }

    public function testAuthenticateWhenProviderReturnsAuthenticationException()
    {
        $manager = new AuthenticationProviderManager(array(
            $this->getAuthenticationProvider(true, null, 'Symfony\Component\Security\Core\Exception\AuthenticationException'),
        ));

        try {
            $manager->authenticate($token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
            $this->fail();
        } catch (AuthenticationException $e) {
            $this->assertSame($token, $e->getToken());
        }
    }

    public function testAuthenticateWhenOneReturnsAuthenticationExceptionButNotAll()
    {
        $manager = new AuthenticationProviderManager(array(
            $this->getAuthenticationProvider(true, null, 'Symfony\Component\Security\Core\Exception\AuthenticationException'),
            $this->getAuthenticationProvider(true, $expected = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')),
        ));

        $token = $manager->authenticate($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
        $this->assertSame($expected, $token);
    }

    public function testAuthenticateReturnsTokenOfTheFirstMatchingProvider()
    {
        $second = $this->getMock('Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface');
        $second
            ->expects($this->never())
            ->method('supports')
        ;
        $manager = new AuthenticationProviderManager(array(
            $this->getAuthenticationProvider(true, $expected = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')),
            $second,
        ));

        $token = $manager->authenticate($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
        $this->assertSame($expected, $token);
    }

    public function testEraseCredentialFlag()
    {
        $manager = new AuthenticationProviderManager(array(
            $this->getAuthenticationProvider(true, $token = new UsernamePasswordToken('foo', 'bar', 'key')),
        ));

        $token = $manager->authenticate($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
        $this->assertEquals('', $token->getCredentials());

        $manager = new AuthenticationProviderManager(array(
            $this->getAuthenticationProvider(true, $token = new UsernamePasswordToken('foo', 'bar', 'key')),
        ), false);

        $token = $manager->authenticate($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
        $this->assertEquals('bar', $token->getCredentials());
    }

    protected function getAuthenticationProvider($supports, $token = null, $exception = null)
    {
        $provider = $this->getMock('Symfony\Component\Security\Core\Authentication\Provider\AuthenticationProviderInterface');
        $provider->expects($this->once())
                 ->method('supports')
                 ->will($this->returnValue($supports))
        ;

        if (null !== $token) {
            $provider->expects($this->once())
                     ->method('authenticate')
                     ->will($this->returnValue($token))
            ;
        } elseif (null !== $exception) {
            $provider->expects($this->once())
                     ->method('authenticate')
                     ->will($this->throwException($this->getMock($exception, null, array(), '', false)))
            ;
        }

        return $provider;
    }
}
PK�b�\ ����ppear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/RememberMe/InMemoryTokenProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\RememberMe;

use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken;
use Symfony\Component\Security\Core\Authentication\RememberMe\InMemoryTokenProvider;

class InMemoryTokenProviderTest extends \PHPUnit_Framework_TestCase
{
    public function testCreateNewToken()
    {
        $provider = new InMemoryTokenProvider();

        $token = new PersistentToken('foo', 'foo', 'foo', 'foo', new \DateTime());
        $provider->createNewToken($token);

        $this->assertSame($provider->loadTokenBySeries('foo'), $token);
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\TokenNotFoundException
     */
    public function testLoadTokenBySeriesThrowsNotFoundException()
    {
        $provider = new InMemoryTokenProvider();
        $provider->loadTokenBySeries('foo');
    }

    public function testUpdateToken()
    {
        $provider = new InMemoryTokenProvider();

        $token = new PersistentToken('foo', 'foo', 'foo', 'foo', new \DateTime());
        $provider->createNewToken($token);
        $provider->updateToken('foo', 'newFoo', $lastUsed = new \DateTime());
        $token = $provider->loadTokenBySeries('foo');

        $this->assertEquals('newFoo', $token->getTokenValue());
        $this->assertSame($token->getLastUsed(), $lastUsed);
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\TokenNotFoundException
     */
    public function testDeleteToken()
    {
        $provider = new InMemoryTokenProvider();

        $token = new PersistentToken('foo', 'foo', 'foo', 'foo', new \DateTime());
        $provider->createNewToken($token);
        $provider->deleteTokenBySeries('foo');
        $provider->loadTokenBySeries('foo');
    }
}
PK�b�\B�����jpear/test/Security/Symfony/Component/Security/Core/Tests/Authentication/RememberMe/PersistentTokenTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authentication\RememberMe;

use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken;

class PersistentTokenTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $lastUsed = new \DateTime();
        $token = new PersistentToken('fooclass', 'fooname', 'fooseries', 'footokenvalue', $lastUsed);

        $this->assertEquals('fooclass', $token->getClass());
        $this->assertEquals('fooname', $token->getUsername());
        $this->assertEquals('fooseries', $token->getSeries());
        $this->assertEquals('footokenvalue', $token->getTokenValue());
        $this->assertSame($lastUsed, $token->getLastUsed());
    }
}
PK�b�\ׄHAnnPpear/test/Security/Symfony/Component/Security/Core/Tests/SecurityContextTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests;

use Symfony\Component\Security\Core\SecurityContext;

class SecurityContextTest extends \PHPUnit_Framework_TestCase
{
    public function testVoteAuthenticatesTokenIfNecessary()
    {
        $authManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');
        $decisionManager = $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface');

        $context = new SecurityContext($authManager, $decisionManager);
        $context->setToken($token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));

        $authManager
            ->expects($this->once())
            ->method('authenticate')
            ->with($this->equalTo($token))
            ->will($this->returnValue($newToken = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')))
        ;

        $decisionManager
            ->expects($this->once())
            ->method('decide')
            ->will($this->returnValue(true))
        ;

        $this->assertTrue($context->isGranted('foo'));
        $this->assertSame($newToken, $context->getToken());
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException
     */
    public function testVoteWithoutAuthenticationToken()
    {
        $context = new SecurityContext(
            $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'),
            $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface')
        );

        $context->isGranted('ROLE_FOO');
    }

    public function testIsGranted()
    {
        $manager = $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface');
        $manager->expects($this->once())->method('decide')->will($this->returnValue(false));
        $context = new SecurityContext($this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'), $manager);
        $context->setToken($token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
        $token
            ->expects($this->once())
            ->method('isAuthenticated')
            ->will($this->returnValue(true))
        ;
        $this->assertFalse($context->isGranted('ROLE_FOO'));

        $manager = $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface');
        $manager->expects($this->once())->method('decide')->will($this->returnValue(true));
        $context = new SecurityContext($this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'), $manager);
        $context->setToken($token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
        $token
            ->expects($this->once())
            ->method('isAuthenticated')
            ->will($this->returnValue(true))
        ;
        $this->assertTrue($context->isGranted('ROLE_FOO'));
    }

    public function testGetSetToken()
    {
        $context = new SecurityContext(
            $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface'),
            $this->getMock('Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface')
        );
        $this->assertNull($context->getToken());

        $context->setToken($token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface'));
        $this->assertSame($token, $context->getToken());
    }
}
PK�b�\I-���dpear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/AccessDecisionManagerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authorization;

use Symfony\Component\Security\Core\Authorization\AccessDecisionManager;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;

class AccessDecisionManagerTest extends \PHPUnit_Framework_TestCase
{
    public function testSupportsClass()
    {
        $manager = new AccessDecisionManager(array(
            $this->getVoterSupportsClass(true),
            $this->getVoterSupportsClass(false),
        ));
        $this->assertTrue($manager->supportsClass('FooClass'));

        $manager = new AccessDecisionManager(array(
            $this->getVoterSupportsClass(false),
            $this->getVoterSupportsClass(false),
        ));
        $this->assertFalse($manager->supportsClass('FooClass'));
    }

    public function testSupportsAttribute()
    {
        $manager = new AccessDecisionManager(array(
            $this->getVoterSupportsAttribute(true),
            $this->getVoterSupportsAttribute(false),
        ));
        $this->assertTrue($manager->supportsAttribute('foo'));

        $manager = new AccessDecisionManager(array(
            $this->getVoterSupportsAttribute(false),
            $this->getVoterSupportsAttribute(false),
        ));
        $this->assertFalse($manager->supportsAttribute('foo'));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testSetVotersEmpty()
    {
        $manager = new AccessDecisionManager(array());
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testSetUnsupportedStrategy()
    {
        new AccessDecisionManager(array($this->getVoter(VoterInterface::ACCESS_GRANTED)), 'fooBar');
    }

    /**
     * @dataProvider getStrategyTests
     */
    public function testStrategies($strategy, $voters, $allowIfAllAbstainDecisions, $allowIfEqualGrantedDeniedDecisions, $expected)
    {
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $manager = new AccessDecisionManager($voters, $strategy, $allowIfAllAbstainDecisions, $allowIfEqualGrantedDeniedDecisions);

        $this->assertSame($expected, $manager->decide($token, array('ROLE_FOO')));
    }

    public function getStrategyTests()
    {
        return array(
            // affirmative
            array('affirmative', $this->getVoters(1, 0, 0), false, true, true),
            array('affirmative', $this->getVoters(1, 2, 0), false, true, true),
            array('affirmative', $this->getVoters(0, 1, 0), false, true, false),
            array('affirmative', $this->getVoters(0, 0, 1), false, true, false),
            array('affirmative', $this->getVoters(0, 0, 1), true, true, true),

            // consensus
            array('consensus', $this->getVoters(1, 0, 0), false, true, true),
            array('consensus', $this->getVoters(1, 2, 0), false, true, false),
            array('consensus', $this->getVoters(2, 1, 0), false, true, true),

            array('consensus', $this->getVoters(0, 0, 1), false, true, false),

            array('consensus', $this->getVoters(0, 0, 1), true, true, true),

            array('consensus', $this->getVoters(2, 2, 0), false, true, true),
            array('consensus', $this->getVoters(2, 2, 1), false, true, true),

            array('consensus', $this->getVoters(2, 2, 0), false, false, false),
            array('consensus', $this->getVoters(2, 2, 1), false, false, false),

            // unanimous
            array('unanimous', $this->getVoters(1, 0, 0), false, true, true),
            array('unanimous', $this->getVoters(1, 0, 1), false, true, true),
            array('unanimous', $this->getVoters(1, 1, 0), false, true, false),

            array('unanimous', $this->getVoters(0, 0, 2), false, true, false),
            array('unanimous', $this->getVoters(0, 0, 2), true, true, true),
        );
    }

    protected function getVoters($grants, $denies, $abstains)
    {
        $voters = array();
        for ($i = 0; $i < $grants; $i++) {
            $voters[] = $this->getVoter(VoterInterface::ACCESS_GRANTED);
        }
        for ($i = 0; $i < $denies; $i++) {
            $voters[] = $this->getVoter(VoterInterface::ACCESS_DENIED);
        }
        for ($i = 0; $i < $abstains; $i++) {
            $voters[] = $this->getVoter(VoterInterface::ACCESS_ABSTAIN);
        }

        return $voters;
    }

    protected function getVoter($vote)
    {
        $voter = $this->getMock('Symfony\Component\Security\Core\Authorization\Voter\VoterInterface');
        $voter->expects($this->any())
              ->method('vote')
              ->will($this->returnValue($vote));
        ;

        return $voter;
    }

    protected function getVoterSupportsClass($ret)
    {
        $voter = $this->getMock('Symfony\Component\Security\Core\Authorization\Voter\VoterInterface');
        $voter->expects($this->any())
              ->method('supportsClass')
              ->will($this->returnValue($ret));
        ;

        return $voter;
    }

    protected function getVoterSupportsAttribute($ret)
    {
        $voter = $this->getMock('Symfony\Component\Security\Core\Authorization\Voter\VoterInterface');
        $voter->expects($this->any())
              ->method('supportsAttribute')
              ->will($this->returnValue($ret));
        ;

        return $voter;
    }
}
PK�b�\�R�MMgpear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleHierarchyVoterTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authorization\Voter;

use Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Core\Role\RoleHierarchy;

class RoleHierarchyVoterTest extends RoleVoterTest
{
    /**
     * @dataProvider getVoteTests
     */
    public function testVote($roles, $attributes, $expected)
    {
        $voter = new RoleHierarchyVoter(new RoleHierarchy(array('ROLE_FOO' => array('ROLE_FOOBAR'))));

        $this->assertSame($expected, $voter->vote($this->getToken($roles), null, $attributes));
    }

    public function getVoteTests()
    {
        return array_merge(parent::getVoteTests(), array(
            array(array('ROLE_FOO'), array('ROLE_FOOBAR'), VoterInterface::ACCESS_GRANTED),
        ));
    }
}
PK�b�\jq�o��^pear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/Voter/RoleVoterTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authorization\Voter;

use Symfony\Component\Security\Core\Authorization\Voter\RoleVoter;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Core\Role\Role;

class RoleVoterTest extends \PHPUnit_Framework_TestCase
{
    public function testSupportsClass()
    {
        $voter = new RoleVoter();

        $this->assertTrue($voter->supportsClass('Foo'));
    }

    /**
     * @dataProvider getVoteTests
     */
    public function testVote($roles, $attributes, $expected)
    {
        $voter = new RoleVoter();

        $this->assertSame($expected, $voter->vote($this->getToken($roles), null, $attributes));
    }

    public function getVoteTests()
    {
        return array(
            array(array(), array(), VoterInterface::ACCESS_ABSTAIN),
            array(array(), array('FOO'), VoterInterface::ACCESS_ABSTAIN),
            array(array(), array('ROLE_FOO'), VoterInterface::ACCESS_DENIED),
            array(array('ROLE_FOO'), array('ROLE_FOO'), VoterInterface::ACCESS_GRANTED),
            array(array('ROLE_FOO'), array('FOO', 'ROLE_FOO'), VoterInterface::ACCESS_GRANTED),
            array(array('ROLE_BAR', 'ROLE_FOO'), array('ROLE_FOO'), VoterInterface::ACCESS_GRANTED),
        );
    }

    protected function getToken(array $roles)
    {
        foreach ($roles as $i => $role) {
            $roles[$i] = new Role($role);
        }
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token->expects($this->once())
              ->method('getRoles')
              ->will($this->returnValue($roles));
        ;

        return $token;
    }
}
PK�b�\�Ƕ'�
�
dpear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/Voter/ExpressionVoterTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authorization\Voter;

use Symfony\Component\Security\Core\Authorization\Voter\ExpressionVoter;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Core\Role\Role;

class ExpressionVoterTest extends \PHPUnit_Framework_TestCase
{
    public function testSupportsAttribute()
    {
        $expression = $this->createExpression();
        $expressionLanguage = $this->getMock('Symfony\Component\Security\Core\Authorization\ExpressionLanguage');
        $voter = new ExpressionVoter($expressionLanguage, $this->createTrustResolver(), $this->createRoleHierarchy());

        $this->assertTrue($voter->supportsAttribute($expression));
    }

    /**
     * @dataProvider getVoteTests
     */
    public function testVote($roles, $attributes, $expected, $tokenExpectsGetRoles = true, $expressionLanguageExpectsEvaluate = true)
    {
        $voter = new ExpressionVoter($this->createExpressionLanguage($expressionLanguageExpectsEvaluate), $this->createTrustResolver());

        $this->assertSame($expected, $voter->vote($this->getToken($roles, $tokenExpectsGetRoles), null, $attributes));
    }

    public function getVoteTests()
    {
        return array(
            array(array(), array(), VoterInterface::ACCESS_ABSTAIN, false, false),
            array(array(), array('FOO'), VoterInterface::ACCESS_ABSTAIN, false, false),

            array(array(), array($this->createExpression()), VoterInterface::ACCESS_DENIED, true, false),

            array(array('ROLE_FOO'), array($this->createExpression(), $this->createExpression()), VoterInterface::ACCESS_GRANTED),
            array(array('ROLE_BAR', 'ROLE_FOO'), array($this->createExpression()), VoterInterface::ACCESS_GRANTED),
        );
    }

    protected function getToken(array $roles, $tokenExpectsGetRoles = true)
    {
        foreach ($roles as $i => $role) {
            $roles[$i] = new Role($role);
        }
        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');

        if ($tokenExpectsGetRoles) {
            $token->expects($this->once())
                ->method('getRoles')
                ->will($this->returnValue($roles));
        }

        return $token;
    }

    protected function createExpressionLanguage($expressionLanguageExpectsEvaluate = true)
    {
        $mock = $this->getMock('Symfony\Component\Security\Core\Authorization\ExpressionLanguage');

        if ($expressionLanguageExpectsEvaluate) {
            $mock->expects($this->once())
                ->method('evaluate')
                ->will($this->returnValue(true));
        }

        return $mock;
    }

    protected function createTrustResolver()
    {
        return $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface');
    }

    protected function createRoleHierarchy()
    {
        return $this->getMock('Symfony\Component\Security\Core\Role\RoleHierarchyInterface');
    }

    protected function createExpression()
    {
        return $this->getMockBuilder('Symfony\Component\ExpressionLanguage\Expression')
            ->disableOriginalConstructor()
            ->getMock();
    }
}
PK�b�\��� ,
,
gpear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/Voter/AuthenticatedVoterTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authorization\Voter;

use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver;
use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;

class AuthenticatedVoterTest extends \PHPUnit_Framework_TestCase
{
    public function testSupportsClass()
    {
        $voter = new AuthenticatedVoter($this->getResolver());
        $this->assertTrue($voter->supportsClass('stdClass'));
    }

    /**
     * @dataProvider getVoteTests
     */
    public function testVote($authenticated, $attributes, $expected)
    {
        $voter = new AuthenticatedVoter($this->getResolver());

        $this->assertSame($expected, $voter->vote($this->getToken($authenticated), null, $attributes));
    }

    public function getVoteTests()
    {
        return array(
            array('fully', array(), VoterInterface::ACCESS_ABSTAIN),
            array('fully', array('FOO'), VoterInterface::ACCESS_ABSTAIN),
            array('remembered', array(), VoterInterface::ACCESS_ABSTAIN),
            array('remembered', array('FOO'), VoterInterface::ACCESS_ABSTAIN),
            array('anonymously', array(), VoterInterface::ACCESS_ABSTAIN),
            array('anonymously', array('FOO'), VoterInterface::ACCESS_ABSTAIN),

            array('fully', array('IS_AUTHENTICATED_ANONYMOUSLY'), VoterInterface::ACCESS_GRANTED),
            array('remembered', array('IS_AUTHENTICATED_ANONYMOUSLY'), VoterInterface::ACCESS_GRANTED),
            array('anonymously', array('IS_AUTHENTICATED_ANONYMOUSLY'), VoterInterface::ACCESS_GRANTED),

            array('fully', array('IS_AUTHENTICATED_REMEMBERED'), VoterInterface::ACCESS_GRANTED),
            array('remembered', array('IS_AUTHENTICATED_REMEMBERED'), VoterInterface::ACCESS_GRANTED),
            array('anonymously', array('IS_AUTHENTICATED_REMEMBERED'), VoterInterface::ACCESS_DENIED),

            array('fully', array('IS_AUTHENTICATED_FULLY'), VoterInterface::ACCESS_GRANTED),
            array('remembered', array('IS_AUTHENTICATED_FULLY'), VoterInterface::ACCESS_DENIED),
            array('anonymously', array('IS_AUTHENTICATED_FULLY'), VoterInterface::ACCESS_DENIED),
        );
    }

    protected function getResolver()
    {
        return new AuthenticationTrustResolver(
            'Symfony\\Component\\Security\\Core\\Authentication\\Token\\AnonymousToken',
            'Symfony\\Component\\Security\\Core\\Authentication\\Token\\RememberMeToken'
        );
    }

    protected function getToken($authenticated)
    {
        if ('fully' === $authenticated) {
            return $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        } elseif ('remembered' === $authenticated) {
            return $this->getMock('Symfony\Component\Security\Core\Authentication\Token\RememberMeToken', array('setPersistent'), array(), '', false);
        } else {
            return $this->getMock('Symfony\Component\Security\Core\Authentication\Token\AnonymousToken', null, array('', ''));
        }
    }
}
PK�b�\�bdw�
�
apear/test/Security/Symfony/Component/Security/Core/Tests/Authorization/ExpressionLanguageTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Authorization;

use Symfony\Component\Security\Core\Authorization\ExpressionLanguage;
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver;
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\User\User;

class ExpressionLanguageTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     */
    public function testIsAuthenticated($token, $expression, $result, array $roles = array())
    {
        $anonymousTokenClass = 'Symfony\\Component\\Security\\Core\\Authentication\\Token\\AnonymousToken';
        $rememberMeTokenClass = 'Symfony\\Component\\Security\\Core\\Authentication\\Token\\RememberMeToken';
        $expressionLanguage = new ExpressionLanguage();
        $trustResolver = new AuthenticationTrustResolver($anonymousTokenClass, $rememberMeTokenClass);

        $context = array();
        $context['trust_resolver'] = $trustResolver;
        $context['token'] = $token;
        $context['roles'] = $roles;

        $this->assertEquals($result, $expressionLanguage->evaluate($expression, $context));
    }

    public function provider()
    {
        $roles = array('ROLE_USER', 'ROLE_ADMIN');
        $user = new User('username', 'password', $roles);

        $noToken = null;
        $anonymousToken = new AnonymousToken('firewall', 'anon.');
        $rememberMeToken = new RememberMeToken($user, 'providerkey', 'firewall');
        $usernamePasswordToken = new UsernamePasswordToken('username', 'password', 'providerkey', $roles);

        return array(
            array($noToken, 'is_anonymous()', false),
            array($noToken, 'is_authenticated()', false),
            array($noToken, 'is_fully_authenticated()', false),
            array($noToken, 'is_remember_me()', false),
            array($noToken, "has_role('ROLE_USER')", false),

            array($anonymousToken, 'is_anonymous()', true),
            array($anonymousToken, 'is_authenticated()', false),
            array($anonymousToken, 'is_fully_authenticated()', false),
            array($anonymousToken, 'is_remember_me()', false),
            array($anonymousToken, "has_role('ROLE_USER')", false),

            array($rememberMeToken, 'is_anonymous()', false),
            array($rememberMeToken, 'is_authenticated()', true),
            array($rememberMeToken, 'is_fully_authenticated()', false),
            array($rememberMeToken, 'is_remember_me()', true),
            array($rememberMeToken, "has_role('ROLE_FOO')", false, $roles),
            array($rememberMeToken, "has_role('ROLE_USER')", true, $roles),

            array($usernamePasswordToken, 'is_anonymous()', false),
            array($usernamePasswordToken, 'is_authenticated()', true),
            array($usernamePasswordToken, 'is_fully_authenticated()', true),
            array($usernamePasswordToken, 'is_remember_me()', false),
            array($usernamePasswordToken, "has_role('ROLE_FOO')", false, $roles),
            array($usernamePasswordToken, "has_role('ROLE_USER')", true, $roles),
        );
    }
}
PK�b�\e5���epear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/MessageDigestPasswordEncoderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Encoder;

use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;

class MessageDigestPasswordEncoderTest extends \PHPUnit_Framework_TestCase
{
    public function testIsPasswordValid()
    {
        $encoder = new MessageDigestPasswordEncoder('sha256', false, 1);

        $this->assertTrue($encoder->isPasswordValid(hash('sha256', 'password'), 'password', ''));
    }

    public function testEncodePassword()
    {
        $encoder = new MessageDigestPasswordEncoder('sha256', false, 1);
        $this->assertSame(hash('sha256', 'password'), $encoder->encodePassword('password', ''));

        $encoder = new MessageDigestPasswordEncoder('sha256', true, 1);
        $this->assertSame(base64_encode(hash('sha256', 'password', true)), $encoder->encodePassword('password', ''));

        $encoder = new MessageDigestPasswordEncoder('sha256', false, 2);
        $this->assertSame(hash('sha256', hash('sha256', 'password', true).'password'), $encoder->encodePassword('password', ''));
    }

    /**
     * @expectedException \LogicException
     */
    public function testEncodePasswordAlgorithmDoesNotExist()
    {
        $encoder = new MessageDigestPasswordEncoder('foobar');
        $encoder->encodePassword('password', '');
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testEncodePasswordLength()
    {
        $encoder = new MessageDigestPasswordEncoder();

        $encoder->encodePassword(str_repeat('a', 5000), 'salt');
    }

    public function testCheckPasswordLength()
    {
        $encoder = new MessageDigestPasswordEncoder();

        $this->assertFalse($encoder->isPasswordValid('encoded', str_repeat('a', 5000), 'salt'));
    }
}
PK�b�\!�?��	�	^pear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/BCryptPasswordEncoderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Encoder;

use Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder;

/**
 * @author Elnur Abdurrakhimov <elnur@elnur.pro>
 */
class BCryptPasswordEncoderTest extends \PHPUnit_Framework_TestCase
{
    const PASSWORD = 'password';
    const BYTES = '0123456789abcdef';
    const VALID_COST = '04';

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testCostBelowRange()
    {
        new BCryptPasswordEncoder(3);
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testCostAboveRange()
    {
        new BCryptPasswordEncoder(32);
    }

    public function testCostInRange()
    {
        for ($cost = 4; $cost <= 31; $cost++) {
            new BCryptPasswordEncoder($cost);
        }
    }

    public function testResultLength()
    {
        $this->skipIfPhpVersionIsNotSupported();

        $encoder = new BCryptPasswordEncoder(self::VALID_COST);
        $result = $encoder->encodePassword(self::PASSWORD, null);
        $this->assertEquals(60, strlen($result));
    }

    public function testValidation()
    {
        $this->skipIfPhpVersionIsNotSupported();

        $encoder = new BCryptPasswordEncoder(self::VALID_COST);
        $result = $encoder->encodePassword(self::PASSWORD, null);
        $this->assertTrue($encoder->isPasswordValid($result, self::PASSWORD, null));
        $this->assertFalse($encoder->isPasswordValid($result, 'anotherPassword', null));
    }

    private function skipIfPhpVersionIsNotSupported()
    {
        if (version_compare(phpversion(), '5.3.7', '<')) {
            $this->markTestSkipped('Requires PHP >= 5.3.7');
        }
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testEncodePasswordLength()
    {
        $encoder = new BCryptPasswordEncoder(self::VALID_COST);

        $encoder->encodePassword(str_repeat('a', 5000), 'salt');
    }

    public function testCheckPasswordLength()
    {
        $encoder = new BCryptPasswordEncoder(self::VALID_COST);

        $this->assertFalse($encoder->isPasswordValid('encoded', str_repeat('a', 5000), 'salt'));
    }
}
PK�b�\6���apear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/PlaintextPasswordEncoderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Encoder;

use Symfony\Component\Security\Core\Encoder\PlaintextPasswordEncoder;

class PlaintextPasswordEncoderTest extends \PHPUnit_Framework_TestCase
{
    public function testIsPasswordValid()
    {
        $encoder = new PlaintextPasswordEncoder();

        $this->assertTrue($encoder->isPasswordValid('foo', 'foo', ''));
        $this->assertFalse($encoder->isPasswordValid('bar', 'foo', ''));
        $this->assertFalse($encoder->isPasswordValid('FOO', 'foo', ''));

        $encoder = new PlaintextPasswordEncoder(true);

        $this->assertTrue($encoder->isPasswordValid('foo', 'foo', ''));
        $this->assertFalse($encoder->isPasswordValid('bar', 'foo', ''));
        $this->assertTrue($encoder->isPasswordValid('FOO', 'foo', ''));
    }

    public function testEncodePassword()
    {
        $encoder = new PlaintextPasswordEncoder();

        $this->assertSame('foo', $encoder->encodePassword('foo', ''));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testEncodePasswordLength()
    {
        $encoder = new PlaintextPasswordEncoder();

        $encoder->encodePassword(str_repeat('a', 5000), 'salt');
    }

    public function testCheckPasswordLength()
    {
        $encoder = new PlaintextPasswordEncoder();

        $this->assertFalse($encoder->isPasswordValid('encoded', str_repeat('a', 5000), 'salt'));
    }
}
PK�b�\%�s�Wpear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/EncoderFactoryTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Encoder;

use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
use Symfony\Component\Security\Core\Encoder\EncoderFactory;
use Symfony\Component\Security\Core\User\User;
use Symfony\Component\Security\Core\User\UserInterface;

class EncoderFactoryTest extends \PHPUnit_Framework_TestCase
{
    public function testGetEncoderWithMessageDigestEncoder()
    {
        $factory = new EncoderFactory(array('Symfony\Component\Security\Core\User\UserInterface' => array(
            'class' => 'Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder',
            'arguments' => array('sha512', true, 5),
        )));

        $encoder = $factory->getEncoder($this->getMock('Symfony\Component\Security\Core\User\UserInterface'));
        $expectedEncoder = new MessageDigestPasswordEncoder('sha512', true, 5);

        $this->assertEquals($expectedEncoder->encodePassword('foo', 'moo'), $encoder->encodePassword('foo', 'moo'));
    }

    public function testGetEncoderWithService()
    {
        $factory = new EncoderFactory(array(
            'Symfony\Component\Security\Core\User\UserInterface' => new MessageDigestPasswordEncoder('sha1'),
        ));

        $encoder = $factory->getEncoder($this->getMock('Symfony\Component\Security\Core\User\UserInterface'));
        $expectedEncoder = new MessageDigestPasswordEncoder('sha1');
        $this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));

        $encoder = $factory->getEncoder(new User('user', 'pass'));
        $expectedEncoder = new MessageDigestPasswordEncoder('sha1');
        $this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
    }

    public function testGetEncoderWithClassName()
    {
        $factory = new EncoderFactory(array(
            'Symfony\Component\Security\Core\User\UserInterface' => new MessageDigestPasswordEncoder('sha1'),
        ));

        $encoder = $factory->getEncoder('Symfony\Component\Security\Core\Tests\Encoder\SomeChildUser');
        $expectedEncoder = new MessageDigestPasswordEncoder('sha1');
        $this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
    }

    public function testGetEncoderConfiguredForConcreteClassWithService()
    {
        $factory = new EncoderFactory(array(
            'Symfony\Component\Security\Core\User\User' => new MessageDigestPasswordEncoder('sha1'),
        ));

        $encoder = $factory->getEncoder(new User('user', 'pass'));
        $expectedEncoder = new MessageDigestPasswordEncoder('sha1');
        $this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
    }

    public function testGetEncoderConfiguredForConcreteClassWithClassName()
    {
        $factory = new EncoderFactory(array(
            'Symfony\Component\Security\Core\Tests\Encoder\SomeUser' => new MessageDigestPasswordEncoder('sha1'),
        ));

        $encoder = $factory->getEncoder('Symfony\Component\Security\Core\Tests\Encoder\SomeChildUser');
        $expectedEncoder = new MessageDigestPasswordEncoder('sha1');
        $this->assertEquals($expectedEncoder->encodePassword('foo', ''), $encoder->encodePassword('foo', ''));
    }
}

class SomeUser implements UserInterface
{
    public function getRoles() {}
    public function getPassword() {}
    public function getSalt() {}
    public function getUsername() {}
    public function eraseCredentials() {}
}

class SomeChildUser extends SomeUser
{
}
PK�b�\L�'��\pear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/BasePasswordEncoderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Encoder;

use Symfony\Component\Security\Core\Encoder\BasePasswordEncoder;

class PasswordEncoder extends BasePasswordEncoder
{
    public function encodePassword($raw, $salt)
    {
    }

    public function isPasswordValid($encoded, $raw, $salt)
    {
    }
}

class BasePasswordEncoderTest extends \PHPUnit_Framework_TestCase
{
    public function testComparePassword()
    {
        $this->assertTrue($this->invokeComparePasswords('password', 'password'));
        $this->assertFalse($this->invokeComparePasswords('password', 'foo'));
    }

    public function testDemergePasswordAndSalt()
    {
        $this->assertEquals(array('password', 'salt'), $this->invokeDemergePasswordAndSalt('password{salt}'));
        $this->assertEquals(array('password', ''), $this->invokeDemergePasswordAndSalt('password'));
        $this->assertEquals(array('', ''), $this->invokeDemergePasswordAndSalt(''));
    }

    public function testMergePasswordAndSalt()
    {
        $this->assertEquals('password{salt}', $this->invokeMergePasswordAndSalt('password', 'salt'));
        $this->assertEquals('password', $this->invokeMergePasswordAndSalt('password', ''));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testMergePasswordAndSaltWithException()
    {
        $this->invokeMergePasswordAndSalt('password', '{foo}');
    }

    public function testIsPasswordTooLong()
    {
        $this->assertTrue($this->invokeIsPasswordTooLong(str_repeat('a', 10000)));
        $this->assertFalse($this->invokeIsPasswordTooLong(str_repeat('a', 10)));
    }

    protected function invokeDemergePasswordAndSalt($password)
    {
        $encoder = new PasswordEncoder();
        $r = new \ReflectionObject($encoder);
        $m = $r->getMethod('demergePasswordAndSalt');
        $m->setAccessible(true);

        return $m->invoke($encoder, $password);
    }

    protected function invokeMergePasswordAndSalt($password, $salt)
    {
        $encoder = new PasswordEncoder();
        $r = new \ReflectionObject($encoder);
        $m = $r->getMethod('mergePasswordAndSalt');
        $m->setAccessible(true);

        return $m->invoke($encoder, $password, $salt);
    }

    protected function invokeComparePasswords($p1, $p2)
    {
        $encoder = new PasswordEncoder();
        $r = new \ReflectionObject($encoder);
        $m = $r->getMethod('comparePasswords');
        $m->setAccessible(true);

        return $m->invoke($encoder, $p1, $p2);
    }

    protected function invokeIsPasswordTooLong($p)
    {
        $encoder = new PasswordEncoder();
        $r = new \ReflectionObject($encoder);
        $m = $r->getMethod('isPasswordTooLong');
        $m->setAccessible(true);

        return $m->invoke($encoder, $p);
    }
}
PK�b�\r��nn^pear/test/Security/Symfony/Component/Security/Core/Tests/Encoder/Pbkdf2PasswordEncoderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Encoder;

use Symfony\Component\Security\Core\Encoder\Pbkdf2PasswordEncoder;

class Pbkdf2PasswordEncoderTest extends \PHPUnit_Framework_TestCase
{
    public function testIsPasswordValid()
    {
        $encoder = new Pbkdf2PasswordEncoder('sha256', false, 1, 40);

        $this->assertTrue($encoder->isPasswordValid('c1232f10f62715fda06ae7c0a2037ca19b33cf103b727ba56d870c11f290a2ab106974c75607c8a3', 'password', ''));
    }

    public function testEncodePassword()
    {
        $encoder = new Pbkdf2PasswordEncoder('sha256', false, 1, 40);
        $this->assertSame('c1232f10f62715fda06ae7c0a2037ca19b33cf103b727ba56d870c11f290a2ab106974c75607c8a3', $encoder->encodePassword('password', ''));

        $encoder = new Pbkdf2PasswordEncoder('sha256', true, 1, 40);
        $this->assertSame('wSMvEPYnFf2gaufAogN8oZszzxA7cnulbYcMEfKQoqsQaXTHVgfIow==', $encoder->encodePassword('password', ''));

        $encoder = new Pbkdf2PasswordEncoder('sha256', false, 2, 40);
        $this->assertSame('8bc2f9167a81cdcfad1235cd9047f1136271c1f978fcfcb35e22dbeafa4634f6fd2214218ed63ebb', $encoder->encodePassword('password', ''));
    }

    /**
     * @expectedException \LogicException
     */
    public function testEncodePasswordAlgorithmDoesNotExist()
    {
        $encoder = new Pbkdf2PasswordEncoder('foobar');
        $encoder->encodePassword('password', '');
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
     */
    public function testEncodePasswordLength()
    {
        $encoder = new Pbkdf2PasswordEncoder('foobar');

        $encoder->encodePassword(str_repeat('a', 5000), 'salt');
    }

    public function testCheckPasswordLength()
    {
        $encoder = new Pbkdf2PasswordEncoder('foobar');

        $this->assertFalse($encoder->isPasswordValid('encoded', str_repeat('a', 5000), 'salt'));
    }
}
PK�b�\�����lpear/test/Security/Symfony/Component/Security/Core/Tests/Validator/Constraints/UserPasswordValidatorTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Core\Tests\Validator\Constraints;

use Symfony\Component\Security\Core\Validator\Constraints\UserPassword;
use Symfony\Component\Security\Core\Validator\Constraints\UserPasswordValidator;

class UserPasswordValidatorTest extends \PHPUnit_Framework_TestCase
{
    const PASSWORD_VALID   = true;
    const PASSWORD_INVALID = false;

    protected $context;

    protected function setUp()
    {
        $this->context = $this->getMock('Symfony\Component\Validator\ExecutionContext', array(), array(), '', false);
    }

    protected function tearDown()
    {
        $this->context = null;
    }

    public function testPasswordIsValid()
    {
        $user = $this->createUser();
        $securityContext = $this->createSecurityContext($user);

        $encoder = $this->createPasswordEncoder(static::PASSWORD_VALID);
        $encoderFactory = $this->createEncoderFactory($encoder);

        $validator = new UserPasswordValidator($securityContext, $encoderFactory);
        $validator->initialize($this->context);

        $this
            ->context
            ->expects($this->never())
            ->method('addViolation')
        ;

        $validator->validate('secret', new UserPassword());
    }

    public function testPasswordIsNotValid()
    {
        $user = $this->createUser();
        $securityContext = $this->createSecurityContext($user);

        $encoder = $this->createPasswordEncoder(static::PASSWORD_INVALID);
        $encoderFactory = $this->createEncoderFactory($encoder);

        $validator = new UserPasswordValidator($securityContext, $encoderFactory);
        $validator->initialize($this->context);

        $this
            ->context
            ->expects($this->once())
            ->method('addViolation')
        ;

        $validator->validate('secret', new UserPassword());
    }

    public function testUserIsNotValid()
    {
        $this->setExpectedException('Symfony\Component\Validator\Exception\ConstraintDefinitionException');

        $user = $this->getMock('Foo\Bar\User');
        $encoderFactory = $this->getMock('Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface');
        $securityContext = $this->createSecurityContext($user);

        $validator = new UserPasswordValidator($securityContext, $encoderFactory);
        $validator->initialize($this->context);
        $validator->validate('secret', new UserPassword());
    }

    protected function createUser()
    {
        $mock = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');

        $mock
            ->expects($this->once())
            ->method('getPassword')
            ->will($this->returnValue('s3Cr3t'))
        ;

        $mock
            ->expects($this->once())
            ->method('getSalt')
            ->will($this->returnValue('^S4lt$'))
        ;

        return $mock;
    }

    protected function createPasswordEncoder($isPasswordValid = true)
    {
        $mock = $this->getMock('Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface');

        $mock
            ->expects($this->once())
            ->method('isPasswordValid')
            ->will($this->returnValue($isPasswordValid))
        ;

        return $mock;
    }

    protected function createEncoderFactory($encoder = null)
    {
        $mock = $this->getMock('Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface');

        $mock
            ->expects($this->once())
            ->method('getEncoder')
            ->will($this->returnValue($encoder))
        ;

        return $mock;
    }

    protected function createSecurityContext($user = null)
    {
        $token = $this->createAuthenticationToken($user);

        $mock = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $mock
            ->expects($this->once())
            ->method('getToken')
            ->will($this->returnValue($token))
        ;

        return $mock;
    }

    protected function createAuthenticationToken($user = null)
    {
        $mock = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $mock
            ->expects($this->once())
            ->method('getUser')
            ->will($this->returnValue($user))
        ;

        return $mock;
    }
}
PK�b�\ܲ#&;;Bpear/test/Security/Symfony/Component/Security/Acl/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Security Component ACL Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./vendor</directory>
                <directory>./Tests</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\�'(��'�'Ppear/test/Security/Symfony/Component/Security/Acl/Tests/Dbal/AclProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Dbal;

use Symfony\Component\Security\Acl\Dbal\AclProvider;
use Symfony\Component\Security\Acl\Domain\PermissionGrantingStrategy;
use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
use Symfony\Component\Security\Acl\Dbal\Schema;
use Doctrine\DBAL\DriverManager;

class AclProviderTest extends \PHPUnit_Framework_TestCase
{
    protected $con;
    protected $insertClassStmt;
    protected $insertEntryStmt;
    protected $insertOidStmt;
    protected $insertOidAncestorStmt;
    protected $insertSidStmt;

    /**
     * @expectedException \Symfony\Component\Security\Acl\Exception\AclNotFoundException
     * @expectedMessage There is no ACL for the given object identity.
     */
    public function testFindAclThrowsExceptionWhenNoAclExists()
    {
        $this->getProvider()->findAcl(new ObjectIdentity('foo', 'foo'));
    }

    public function testFindAclsThrowsExceptionUnlessAnACLIsFoundForEveryOID()
    {
        $oids = array();
        $oids[] = new ObjectIdentity('1', 'foo');
        $oids[] = new ObjectIdentity('foo', 'foo');

        try {
            $this->getProvider()->findAcls($oids);

            $this->fail('Provider did not throw an expected exception.');
        } catch (\Exception $ex) {
            $this->assertInstanceOf('Symfony\Component\Security\Acl\Exception\AclNotFoundException', $ex);
            $this->assertInstanceOf('Symfony\Component\Security\Acl\Exception\NotAllAclsFoundException', $ex);

            $partialResult = $ex->getPartialResult();
            $this->assertTrue($partialResult->contains($oids[0]));
            $this->assertFalse($partialResult->contains($oids[1]));
        }
    }

    public function testFindAcls()
    {
        $oids = array();
        $oids[] = new ObjectIdentity('1', 'foo');
        $oids[] = new ObjectIdentity('2', 'foo');

        $provider = $this->getProvider();

        $acls = $provider->findAcls($oids);
        $this->assertInstanceOf('SplObjectStorage', $acls);
        $this->assertCount(2, $acls);
        $this->assertInstanceOf('Symfony\Component\Security\Acl\Domain\Acl', $acl0 = $acls->offsetGet($oids[0]));
        $this->assertInstanceOf('Symfony\Component\Security\Acl\Domain\Acl', $acl1 = $acls->offsetGet($oids[1]));
        $this->assertTrue($oids[0]->equals($acl0->getObjectIdentity()));
        $this->assertTrue($oids[1]->equals($acl1->getObjectIdentity()));
    }

    public function testFindAclsWithDifferentTypes()
    {
        $oids = array();
        $oids[] = new ObjectIdentity('123', 'Bundle\SomeVendor\MyBundle\Entity\SomeEntity');
        $oids[] = new ObjectIdentity('123', 'Bundle\MyBundle\Entity\AnotherEntity');

        $provider = $this->getProvider();

        $acls = $provider->findAcls($oids);
        $this->assertInstanceOf('SplObjectStorage', $acls);
        $this->assertCount(2, $acls);
        $this->assertInstanceOf('Symfony\Component\Security\Acl\Domain\Acl', $acl0 = $acls->offsetGet($oids[0]));
        $this->assertInstanceOf('Symfony\Component\Security\Acl\Domain\Acl', $acl1 = $acls->offsetGet($oids[1]));
        $this->assertTrue($oids[0]->equals($acl0->getObjectIdentity()));
        $this->assertTrue($oids[1]->equals($acl1->getObjectIdentity()));
    }

    public function testFindAclCachesAclInMemory()
    {
        $oid = new ObjectIdentity('1', 'foo');
        $provider = $this->getProvider();

        $acl = $provider->findAcl($oid);
        $this->assertSame($acl, $cAcl = $provider->findAcl($oid));

        $cAces = $cAcl->getObjectAces();
        foreach ($acl->getObjectAces() as $index => $ace) {
            $this->assertSame($ace, $cAces[$index]);
        }
    }

    public function testFindAcl()
    {
        $oid = new ObjectIdentity('1', 'foo');
        $provider = $this->getProvider();

        $acl = $provider->findAcl($oid);

        $this->assertInstanceOf('Symfony\Component\Security\Acl\Domain\Acl', $acl);
        $this->assertTrue($oid->equals($acl->getObjectIdentity()));
        $this->assertEquals(4, $acl->getId());
        $this->assertCount(0, $acl->getClassAces());
        $this->assertCount(0, $this->getField($acl, 'classFieldAces'));
        $this->assertCount(3, $acl->getObjectAces());
        $this->assertCount(0, $this->getField($acl, 'objectFieldAces'));

        $aces = $acl->getObjectAces();
        $this->assertInstanceOf('Symfony\Component\Security\Acl\Domain\Entry', $aces[0]);
        $this->assertTrue($aces[0]->isGranting());
        $this->assertTrue($aces[0]->isAuditSuccess());
        $this->assertTrue($aces[0]->isAuditFailure());
        $this->assertEquals('all', $aces[0]->getStrategy());
        $this->assertSame(2, $aces[0]->getMask());

        // check ACE are in correct order
        $i = 0;
        foreach ($aces as $index => $ace) {
            $this->assertEquals($i, $index);
            $i++;
        }

        $sid = $aces[0]->getSecurityIdentity();
        $this->assertInstanceOf('Symfony\Component\Security\Acl\Domain\UserSecurityIdentity', $sid);
        $this->assertEquals('john.doe', $sid->getUsername());
        $this->assertEquals('SomeClass', $sid->getClass());
    }

    protected function setUp()
    {
        if (!class_exists('PDO') || !in_array('sqlite', \PDO::getAvailableDrivers())) {
            self::markTestSkipped('This test requires SQLite support in your environment');
        }

        $this->con = DriverManager::getConnection(array(
            'driver' => 'pdo_sqlite',
            'memory' => true,
        ));

        // import the schema
        $schema = new Schema($options = $this->getOptions());
        foreach ($schema->toSql($this->con->getDatabasePlatform()) as $sql) {
            $this->con->exec($sql);
        }

        // populate the schema with some test data
        $this->insertClassStmt = $this->con->prepare('INSERT INTO acl_classes (id, class_type) VALUES (?, ?)');
        foreach ($this->getClassData() as $data) {
            $this->insertClassStmt->execute($data);
        }

        $this->insertSidStmt = $this->con->prepare('INSERT INTO acl_security_identities (id, identifier, username) VALUES (?, ?, ?)');
        foreach ($this->getSidData() as $data) {
            $this->insertSidStmt->execute($data);
        }

        $this->insertOidStmt = $this->con->prepare('INSERT INTO acl_object_identities (id, class_id, object_identifier, parent_object_identity_id, entries_inheriting) VALUES (?, ?, ?, ?, ?)');
        foreach ($this->getOidData() as $data) {
            $this->insertOidStmt->execute($data);
        }

        $this->insertEntryStmt = $this->con->prepare('INSERT INTO acl_entries (id, class_id, object_identity_id, field_name, ace_order, security_identity_id, mask, granting, granting_strategy, audit_success, audit_failure) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
        foreach ($this->getEntryData() as $data) {
            $this->insertEntryStmt->execute($data);
        }

        $this->insertOidAncestorStmt = $this->con->prepare('INSERT INTO acl_object_identity_ancestors (object_identity_id, ancestor_id) VALUES (?, ?)');
        foreach ($this->getOidAncestorData() as $data) {
            $this->insertOidAncestorStmt->execute($data);
        }
    }

    protected function tearDown()
    {
        $this->con = null;
    }

    protected function getField($object, $field)
    {
        $reflection = new \ReflectionProperty($object, $field);
        $reflection->setAccessible(true);

        return $reflection->getValue($object);
    }

    protected function getEntryData()
    {
        // id, cid, oid, field, order, sid, mask, granting, strategy, a success, a failure
        return array(
            array(1, 1, 1, null, 0, 1, 1, 1, 'all', 1, 1),
            array(2, 1, 1, null, 1, 2, 1 << 2 | 1 << 1, 0, 'any', 0, 0),
            array(3, 3, 4, null, 0, 1, 2, 1, 'all', 1, 1),
            array(4, 3, 4, null, 2, 2, 1, 1, 'all', 1, 1),
            array(5, 3, 4, null, 1, 3, 1, 1, 'all', 1, 1),
        );
    }

    protected function getOidData()
    {
        // id, cid, oid, parent_oid, entries_inheriting
        return array(
            array(1, 1, '123', null, 1),
            array(2, 2, '123', 1, 1),
            array(3, 2, 'i:3:123', 1, 1),
            array(4, 3, '1', 2, 1),
            array(5, 3, '2', 2, 1),
        );
    }

    protected function getOidAncestorData()
    {
        return array(
            array(1, 1),
            array(2, 1),
            array(2, 2),
            array(3, 1),
            array(3, 3),
            array(4, 2),
            array(4, 1),
            array(4, 4),
            array(5, 2),
            array(5, 1),
            array(5, 5),
        );
    }

    protected function getSidData()
    {
        return array(
            array(1, 'SomeClass-john.doe', 1),
            array(2, 'MyClass-john.doe@foo.com', 1),
            array(3, 'FooClass-123', 1),
            array(4, 'MooClass-ROLE_USER', 1),
            array(5, 'ROLE_USER', 0),
            array(6, 'IS_AUTHENTICATED_FULLY', 0),
        );
    }

    protected function getClassData()
    {
        return array(
            array(1, 'Bundle\SomeVendor\MyBundle\Entity\SomeEntity'),
            array(2, 'Bundle\MyBundle\Entity\AnotherEntity'),
            array(3, 'foo'),
        );
    }

    protected function getOptions()
    {
        return array(
            'oid_table_name' => 'acl_object_identities',
            'oid_ancestors_table_name' => 'acl_object_identity_ancestors',
            'class_table_name' => 'acl_classes',
            'sid_table_name' => 'acl_security_identities',
            'entry_table_name' => 'acl_entries',
        );
    }

    protected function getStrategy()
    {
        return new PermissionGrantingStrategy();
    }

    protected function getProvider()
    {
        return new AclProvider($this->con, $this->getStrategy(), $this->getOptions());
    }
}
PK�b�\�޻>�Q�QWpear/test/Security/Symfony/Component/Security/Acl/Tests/Dbal/MutableAclProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Dbal;

use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity;
use Symfony\Component\Security\Acl\Model\FieldEntryInterface;
use Symfony\Component\Security\Acl\Model\AuditableEntryInterface;
use Symfony\Component\Security\Acl\Model\EntryInterface;
use Symfony\Component\Security\Acl\Domain\Entry;
use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\Acl;
use Symfony\Component\Security\Acl\Exception\AclNotFoundException;
use Symfony\Component\Security\Acl\Exception\ConcurrentModificationException;
use Symfony\Component\Security\Acl\Dbal\AclProvider;
use Symfony\Component\Security\Acl\Domain\PermissionGrantingStrategy;
use Symfony\Component\Security\Acl\Dbal\MutableAclProvider;
use Symfony\Component\Security\Acl\Dbal\Schema;
use Doctrine\DBAL\DriverManager;
use Symfony\Component\Security\Acl\Domain\ObjectIdentity;

class MutableAclProviderTest extends \PHPUnit_Framework_TestCase
{
    protected $con;

    public static function assertAceEquals(EntryInterface $a, EntryInterface $b)
    {
        self::assertInstanceOf(get_class($a), $b);

        foreach (array('getId', 'getMask', 'getStrategy', 'isGranting') as $getter) {
            self::assertSame($a->$getter(), $b->$getter());
        }

        self::assertTrue($a->getSecurityIdentity()->equals($b->getSecurityIdentity()));
        self::assertSame($a->getAcl()->getId(), $b->getAcl()->getId());

        if ($a instanceof AuditableEntryInterface) {
            self::assertSame($a->isAuditSuccess(), $b->isAuditSuccess());
            self::assertSame($a->isAuditFailure(), $b->isAuditFailure());
        }

        if ($a instanceof FieldEntryInterface) {
            self::assertSame($a->getField(), $b->getField());
        }
    }

    /**
     * @expectedException \Symfony\Component\Security\Acl\Exception\AclAlreadyExistsException
     */
    public function testCreateAclThrowsExceptionWhenAclAlreadyExists()
    {
        $provider = $this->getProvider();
        $oid = new ObjectIdentity('123456', 'FOO');
        $provider->createAcl($oid);
        $provider->createAcl($oid);
    }

    public function testCreateAcl()
    {
        $provider = $this->getProvider();
        $oid = new ObjectIdentity('123456', 'FOO');
        $acl = $provider->createAcl($oid);
        $cachedAcl = $provider->findAcl($oid);

        $this->assertInstanceOf('Symfony\Component\Security\Acl\Domain\Acl', $acl);
        $this->assertSame($acl, $cachedAcl);
        $this->assertTrue($acl->getObjectIdentity()->equals($oid));
    }

    public function testDeleteAcl()
    {
        $provider = $this->getProvider();
        $oid = new ObjectIdentity(1, 'Foo');
        $acl = $provider->createAcl($oid);

        $provider->deleteAcl($oid);
        $loadedAcls = $this->getField($provider, 'loadedAcls');
        $this->assertCount(0, $loadedAcls['Foo']);

        try {
            $provider->findAcl($oid);
            $this->fail('ACL has not been properly deleted.');
        } catch (AclNotFoundException $notFound) { }
    }

    public function testDeleteAclDeletesChildren()
    {
        $provider = $this->getProvider();
        $acl = $provider->createAcl(new ObjectIdentity(1, 'Foo'));
        $parentAcl = $provider->createAcl(new ObjectIdentity(2, 'Foo'));
        $acl->setParentAcl($parentAcl);
        $provider->updateAcl($acl);
        $provider->deleteAcl($parentAcl->getObjectIdentity());

        try {
            $provider->findAcl(new ObjectIdentity(1, 'Foo'));
            $this->fail('Child-ACLs have not been deleted.');
        } catch (AclNotFoundException $notFound) { }
    }

    public function testFindAclsAddsPropertyListener()
    {
        $provider = $this->getProvider();
        $acl = $provider->createAcl(new ObjectIdentity(1, 'Foo'));

        $propertyChanges = $this->getField($provider, 'propertyChanges');
        $this->assertCount(1, $propertyChanges);
        $this->assertTrue($propertyChanges->contains($acl));
        $this->assertEquals(array(), $propertyChanges->offsetGet($acl));

        $listeners = $this->getField($acl, 'listeners');
        $this->assertSame($provider, $listeners[0]);
    }

    public function testFindAclsAddsPropertyListenerOnlyOnce()
    {
        $provider = $this->getProvider();
        $acl = $provider->createAcl(new ObjectIdentity(1, 'Foo'));
        $acl = $provider->findAcl(new ObjectIdentity(1, 'Foo'));

        $propertyChanges = $this->getField($provider, 'propertyChanges');
        $this->assertCount(1, $propertyChanges);
        $this->assertTrue($propertyChanges->contains($acl));
        $this->assertEquals(array(), $propertyChanges->offsetGet($acl));

        $listeners = $this->getField($acl, 'listeners');
        $this->assertCount(1, $listeners);
        $this->assertSame($provider, $listeners[0]);
    }

    public function testFindAclsAddsPropertyListenerToParentAcls()
    {
        $provider = $this->getProvider();
        $this->importAcls($provider, array(
            'main' => array(
                'object_identifier' => '1',
                'class_type' => 'foo',
                'parent_acl' => 'parent',
            ),
            'parent' => array(
                'object_identifier' => '1',
                'class_type' => 'anotherFoo',
            )
        ));

        $propertyChanges = $this->getField($provider, 'propertyChanges');
        $this->assertCount(0, $propertyChanges);

        $acl = $provider->findAcl(new ObjectIdentity('1', 'foo'));
        $this->assertCount(2, $propertyChanges);
        $this->assertTrue($propertyChanges->contains($acl));
        $this->assertTrue($propertyChanges->contains($acl->getParentAcl()));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testPropertyChangedDoesNotTrackUnmanagedAcls()
    {
        $provider = $this->getProvider();
        $acl = new Acl(1, new ObjectIdentity(1, 'foo'), new PermissionGrantingStrategy(), array(), false);

        $provider->propertyChanged($acl, 'classAces', array(), array('foo'));
    }

    public function testPropertyChangedTracksChangesToAclProperties()
    {
        $provider = $this->getProvider();
        $acl = $provider->createAcl(new ObjectIdentity(1, 'Foo'));
        $propertyChanges = $this->getField($provider, 'propertyChanges');

        $provider->propertyChanged($acl, 'entriesInheriting', false, true);
        $changes = $propertyChanges->offsetGet($acl);
        $this->assertTrue(isset($changes['entriesInheriting']));
        $this->assertFalse($changes['entriesInheriting'][0]);
        $this->assertTrue($changes['entriesInheriting'][1]);

        $provider->propertyChanged($acl, 'entriesInheriting', true, false);
        $provider->propertyChanged($acl, 'entriesInheriting', false, true);
        $provider->propertyChanged($acl, 'entriesInheriting', true, false);
        $changes = $propertyChanges->offsetGet($acl);
        $this->assertFalse(isset($changes['entriesInheriting']));
    }

    public function testPropertyChangedTracksChangesToAceProperties()
    {
        $provider = $this->getProvider();
        $acl = $provider->createAcl(new ObjectIdentity(1, 'Foo'));
        $ace = new Entry(1, $acl, new UserSecurityIdentity('foo', 'FooClass'), 'all', 1, true, true, true);
        $ace2 = new Entry(2, $acl, new UserSecurityIdentity('foo', 'FooClass'), 'all', 1, true, true, true);
        $propertyChanges = $this->getField($provider, 'propertyChanges');

        $provider->propertyChanged($ace, 'mask', 1, 3);
        $changes = $propertyChanges->offsetGet($acl);
        $this->assertTrue(isset($changes['aces']));
        $this->assertInstanceOf('\SplObjectStorage', $changes['aces']);
        $this->assertTrue($changes['aces']->contains($ace));
        $aceChanges = $changes['aces']->offsetGet($ace);
        $this->assertTrue(isset($aceChanges['mask']));
        $this->assertEquals(1, $aceChanges['mask'][0]);
        $this->assertEquals(3, $aceChanges['mask'][1]);

        $provider->propertyChanged($ace, 'strategy', 'all', 'any');
        $changes = $propertyChanges->offsetGet($acl);
        $this->assertTrue(isset($changes['aces']));
        $this->assertInstanceOf('\SplObjectStorage', $changes['aces']);
        $this->assertTrue($changes['aces']->contains($ace));
        $aceChanges = $changes['aces']->offsetGet($ace);
        $this->assertTrue(isset($aceChanges['mask']));
        $this->assertTrue(isset($aceChanges['strategy']));
        $this->assertEquals('all', $aceChanges['strategy'][0]);
        $this->assertEquals('any', $aceChanges['strategy'][1]);

        $provider->propertyChanged($ace, 'mask', 3, 1);
        $changes = $propertyChanges->offsetGet($acl);
        $aceChanges = $changes['aces']->offsetGet($ace);
        $this->assertFalse(isset($aceChanges['mask']));
        $this->assertTrue(isset($aceChanges['strategy']));

        $provider->propertyChanged($ace2, 'mask', 1, 3);
        $provider->propertyChanged($ace, 'strategy', 'any', 'all');
        $changes = $propertyChanges->offsetGet($acl);
        $this->assertTrue(isset($changes['aces']));
        $this->assertFalse($changes['aces']->contains($ace));
        $this->assertTrue($changes['aces']->contains($ace2));

        $provider->propertyChanged($ace2, 'mask', 3, 4);
        $provider->propertyChanged($ace2, 'mask', 4, 1);
        $changes = $propertyChanges->offsetGet($acl);
        $this->assertFalse(isset($changes['aces']));
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testUpdateAclDoesNotAcceptUntrackedAcls()
    {
        $provider = $this->getProvider();
        $acl = new Acl(1, new ObjectIdentity(1, 'Foo'), new PermissionGrantingStrategy(), array(), true);
        $provider->updateAcl($acl);
    }

    public function testUpdateDoesNothingWhenThereAreNoChanges()
    {
        $con = $this->getMock('Doctrine\DBAL\Connection', array(), array(), '', false);
        $con
            ->expects($this->never())
            ->method('beginTransaction')
        ;
        $con
            ->expects($this->never())
            ->method('executeQuery')
        ;

        $provider = new MutableAclProvider($con, new PermissionGrantingStrategy(), array());
        $acl = new Acl(1, new ObjectIdentity(1, 'Foo'), new PermissionGrantingStrategy(), array(), true);
        $propertyChanges = $this->getField($provider, 'propertyChanges');
        $propertyChanges->offsetSet($acl, array());
        $provider->updateAcl($acl);
    }

    public function testUpdateAclThrowsExceptionOnConcurrentModificationOfSharedProperties()
    {
        $provider = $this->getProvider();
        $acl1 = $provider->createAcl(new ObjectIdentity(1, 'Foo'));
        $acl2 = $provider->createAcl(new ObjectIdentity(2, 'Foo'));
        $acl3 = $provider->createAcl(new ObjectIdentity(1, 'AnotherFoo'));
        $sid = new RoleSecurityIdentity('ROLE_FOO');

        $acl1->insertClassAce($sid, 1);
        $acl3->insertClassAce($sid, 1);
        $provider->updateAcl($acl1);
        $provider->updateAcl($acl3);

        $acl2->insertClassAce($sid, 16);
        $provider->updateAcl($acl2);

        $acl1->insertClassAce($sid, 3);
        $acl2->insertClassAce($sid, 5);
        try {
            $provider->updateAcl($acl1);
            $this->fail('Provider failed to detect a concurrent modification.');
        } catch (ConcurrentModificationException $ex) { }
    }

    public function testUpdateAcl()
    {
        $provider = $this->getProvider();
        $acl = $provider->createAcl(new ObjectIdentity(1, 'Foo'));
        $sid = new UserSecurityIdentity('johannes', 'FooClass');
        $acl->setEntriesInheriting(!$acl->isEntriesInheriting());

        $acl->insertObjectAce($sid, 1);
        $acl->insertClassAce($sid, 5, 0, false);
        $acl->insertObjectAce($sid, 2, 1, true);
        $acl->insertClassFieldAce('field', $sid, 2, 0, true);
        $provider->updateAcl($acl);

        $acl->updateObjectAce(0, 3);
        $acl->deleteObjectAce(1);
        $acl->updateObjectAuditing(0, true, false);
        $acl->updateClassFieldAce(0, 'field', 15);
        $provider->updateAcl($acl);

        $reloadProvider = $this->getProvider();
        $reloadedAcl = $reloadProvider->findAcl(new ObjectIdentity(1, 'Foo'));
        $this->assertNotSame($acl, $reloadedAcl);
        $this->assertSame($acl->isEntriesInheriting(), $reloadedAcl->isEntriesInheriting());

        $aces = $acl->getObjectAces();
        $reloadedAces = $reloadedAcl->getObjectAces();
        $this->assertEquals(count($aces), count($reloadedAces));
        foreach ($aces as $index => $ace) {
            $this->assertAceEquals($ace, $reloadedAces[$index]);
        }
    }

    public function testUpdateAclWorksForChangingTheParentAcl()
    {
        $provider = $this->getProvider();
        $acl = $provider->createAcl(new ObjectIdentity(1, 'Foo'));
        $parentAcl = $provider->createAcl(new ObjectIdentity(1, 'AnotherFoo'));
        $acl->setParentAcl($parentAcl);
        $provider->updateAcl($acl);

        $reloadProvider = $this->getProvider();
        $reloadedAcl = $reloadProvider->findAcl(new ObjectIdentity(1, 'Foo'));
        $this->assertNotSame($acl, $reloadedAcl);
        $this->assertSame($parentAcl->getId(), $reloadedAcl->getParentAcl()->getId());
    }

    public function testUpdateAclUpdatesChildAclsCorrectly()
    {
        $provider = $this->getProvider();
        $acl = $provider->createAcl(new ObjectIdentity(1, 'Foo'));

        $parentAcl = $provider->createAcl(new ObjectIdentity(1, 'Bar'));
        $acl->setParentAcl($parentAcl);
        $provider->updateAcl($acl);

        $parentParentAcl = $provider->createAcl(new ObjectIdentity(1, 'Baz'));
        $parentAcl->setParentAcl($parentParentAcl);
        $provider->updateAcl($parentAcl);

        $newParentParentAcl = $provider->createAcl(new ObjectIdentity(2, 'Baz'));
        $parentAcl->setParentAcl($newParentParentAcl);
        $provider->updateAcl($parentAcl);

        $reloadProvider = $this->getProvider();
        $reloadedAcl = $reloadProvider->findAcl(new ObjectIdentity(1, 'Foo'));
        $this->assertEquals($newParentParentAcl->getId(), $reloadedAcl->getParentAcl()->getParentAcl()->getId());
    }

    public function testUpdateAclInsertingMultipleObjectFieldAcesThrowsDBConstraintViolations()
    {
        $provider = $this->getProvider();
        $oid = new ObjectIdentity(1, 'Foo');
        $sid1 = new UserSecurityIdentity('johannes', 'FooClass');
        $sid2 = new UserSecurityIdentity('guilro', 'FooClass');
        $sid3 = new UserSecurityIdentity('bmaz', 'FooClass');
        $fieldName = 'fieldName';

        $acl = $provider->createAcl($oid);
        $acl->insertObjectFieldAce($fieldName, $sid1, 4);
        $provider->updateAcl($acl);

        $acl = $provider->findAcl($oid);
        $acl->insertObjectFieldAce($fieldName, $sid2, 4);
        $provider->updateAcl($acl);

        $acl = $provider->findAcl($oid);
        $acl->insertObjectFieldAce($fieldName, $sid3, 4);
        $provider->updateAcl($acl);
    }

    public function testUpdateAclDeletingObjectFieldAcesThrowsDBConstraintViolations()
    {
        $provider = $this->getProvider();
        $oid = new ObjectIdentity(1, 'Foo');
        $sid1 = new UserSecurityIdentity('johannes', 'FooClass');
        $sid2 = new UserSecurityIdentity('guilro', 'FooClass');
        $sid3 = new UserSecurityIdentity('bmaz', 'FooClass');
        $fieldName = 'fieldName';

        $acl = $provider->createAcl($oid);
        $acl->insertObjectFieldAce($fieldName, $sid1, 4);
        $provider->updateAcl($acl);

        $acl = $provider->findAcl($oid);
        $acl->insertObjectFieldAce($fieldName, $sid2, 4);
        $provider->updateAcl($acl);

        $index = 0;
        $acl->deleteObjectFieldAce($index, $fieldName);
        $provider->updateAcl($acl);

        $acl = $provider->findAcl($oid);
        $acl->insertObjectFieldAce($fieldName, $sid3, 4);
        $provider->updateAcl($acl);
    }

    /**
     * Data must have the following format:
     * array(
     *     *name* => array(
     *         'object_identifier' => *required*
     *         'class_type' => *required*,
     *         'parent_acl' => *name (optional)*
     *     ),
     * )
     *
     * @param AclProvider $provider
     * @param array       $data
     * @throws \InvalidArgumentException
     * @throws \Exception
     */
    protected function importAcls(AclProvider $provider, array $data)
    {
        $aclIds = $parentAcls = array();
        $con = $this->getField($provider, 'connection');
        $con->beginTransaction();
        try {
            foreach ($data as $name => $aclData) {
                if (!isset($aclData['object_identifier'], $aclData['class_type'])) {
                    throw new \InvalidArgumentException('"object_identifier", and "class_type" must be present.');
                }

                $this->callMethod($provider, 'createObjectIdentity', array(new ObjectIdentity($aclData['object_identifier'], $aclData['class_type'])));
                $aclId = $con->lastInsertId();
                $aclIds[$name] = $aclId;

                $sql = $this->callMethod($provider, 'getInsertObjectIdentityRelationSql', array($aclId, $aclId));
                $con->executeQuery($sql);

                if (isset($aclData['parent_acl'])) {
                    if (isset($aclIds[$aclData['parent_acl']])) {
                        $con->executeQuery("UPDATE acl_object_identities SET parent_object_identity_id = ".$aclIds[$aclData['parent_acl']]." WHERE id = ".$aclId);
                        $con->executeQuery($this->callMethod($provider, 'getInsertObjectIdentityRelationSql', array($aclId, $aclIds[$aclData['parent_acl']])));
                    } else {
                        $parentAcls[$aclId] = $aclData['parent_acl'];
                    }
                }
            }

            foreach ($parentAcls as $aclId => $name) {
                if (!isset($aclIds[$name])) {
                    throw new \InvalidArgumentException(sprintf('"%s" does not exist.', $name));
                }

                $con->executeQuery(sprintf("UPDATE acl_object_identities SET parent_object_identity_id = %d WHERE id = %d", $aclIds[$name], $aclId));
                $con->executeQuery($this->callMethod($provider, 'getInsertObjectIdentityRelationSql', array($aclId, $aclIds[$name])));
            }

            $con->commit();
        } catch (\Exception $e) {
            $con->rollBack();

            throw $e;
        }
    }

    protected function callMethod($object, $method, array $args)
    {
        $method = new \ReflectionMethod($object, $method);
        $method->setAccessible(true);

        return $method->invokeArgs($object, $args);
    }

    protected function setUp()
    {
        if (!class_exists('PDO') || !in_array('sqlite', \PDO::getAvailableDrivers())) {
            self::markTestSkipped('This test requires SQLite support in your environment');
        }

        $this->con = DriverManager::getConnection(array(
            'driver' => 'pdo_sqlite',
            'memory' => true,
        ));

        // import the schema
        $schema = new Schema($this->getOptions());
        foreach ($schema->toSql($this->con->getDatabasePlatform()) as $sql) {
            $this->con->exec($sql);
        }
    }

    protected function tearDown()
    {
        $this->con = null;
    }

    protected function getField($object, $field)
    {
        $reflection = new \ReflectionProperty($object, $field);
        $reflection->setAccessible(true);

        return $reflection->getValue($object);
    }

    public function setField($object, $field, $value)
    {
        $reflection = new \ReflectionProperty($object, $field);
        $reflection->setAccessible(true);
        $reflection->setValue($object, $value);
        $reflection->setAccessible(false);
    }

    protected function getOptions()
    {
        return array(
            'oid_table_name' => 'acl_object_identities',
            'oid_ancestors_table_name' => 'acl_object_identity_ancestors',
            'class_table_name' => 'acl_classes',
            'sid_table_name' => 'acl_security_identities',
            'entry_table_name' => 'acl_entries',
        );
    }

    protected function getStrategy()
    {
        return new PermissionGrantingStrategy();
    }

    protected function getProvider($cache = null)
    {
        return new MutableAclProvider($this->con, $this->getStrategy(), $this->getOptions(), $cache);
    }
}
PK�b�\�
�� � Ypear/test/Security/Symfony/Component/Security/Acl/Tests/Dbal/AclProviderBenchmarkTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Dbal;

use Symfony\Component\Security\Acl\Dbal\AclProvider;
use Symfony\Component\Security\Acl\Domain\PermissionGrantingStrategy;
use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
use Symfony\Component\Security\Acl\Dbal\Schema;
use Doctrine\DBAL\DriverManager;

/**
 * @group benchmark
 */
class AclProviderBenchmarkTest extends \PHPUnit_Framework_TestCase
{
    /** @var \Doctrine\DBAL\Connection */
    protected $con;
    protected $insertClassStmt;
    protected $insertSidStmt;
    protected $insertOidAncestorStmt;
    protected $insertOidStmt;
    protected $insertEntryStmt;

    protected function setUp()
    {
        try {
            $this->con = DriverManager::getConnection(array(
                'driver' => 'pdo_mysql',
                'host' => 'localhost',
                'user' => 'root',
                'dbname' => 'testdb',
            ));
            $this->con->connect();
        } catch (\Exception $e) {
            $this->markTestSkipped('Unable to connect to the database: '.$e->getMessage());
        }
    }

    protected function tearDown()
    {
        $this->con = null;
    }

    public function testFindAcls()
    {
        // $this->generateTestData();

        // get some random test object identities from the database
        $oids = array();
        $stmt = $this->con->executeQuery("SELECT object_identifier, class_type FROM acl_object_identities o INNER JOIN acl_classes c ON c.id = o.class_id ORDER BY RAND() LIMIT 25");
        foreach ($stmt->fetchAll() as $oid) {
            $oids[] = new ObjectIdentity($oid['object_identifier'], $oid['class_type']);
        }

        $provider = $this->getProvider();

        $start = microtime(true);
        $provider->findAcls($oids);
        $time = microtime(true) - $start;
        echo "Total Time: ".$time."s\n";
    }

    /**
     * This generates a huge amount of test data to be used mainly for benchmarking
     * purposes, not so much for testing. That's why it's not called by default.
     */
    protected function generateTestData()
    {
        $sm = $this->con->getSchemaManager();
        $sm->dropAndCreateDatabase('testdb');
        $this->con->exec("USE testdb");

        // import the schema
        $schema = new Schema($options = $this->getOptions());
        foreach ($schema->toSql($this->con->getDatabasePlatform()) as $sql) {
            $this->con->exec($sql);
        }

        // setup prepared statements
        $this->insertClassStmt = $this->con->prepare('INSERT INTO acl_classes (id, class_type) VALUES (?, ?)');
        $this->insertSidStmt = $this->con->prepare('INSERT INTO acl_security_identities (id, identifier, username) VALUES (?, ?, ?)');
        $this->insertOidStmt = $this->con->prepare('INSERT INTO acl_object_identities (id, class_id, object_identifier, parent_object_identity_id, entries_inheriting) VALUES (?, ?, ?, ?, ?)');
        $this->insertEntryStmt = $this->con->prepare('INSERT INTO acl_entries (id, class_id, object_identity_id, field_name, ace_order, security_identity_id, mask, granting, granting_strategy, audit_success, audit_failure) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
        $this->insertOidAncestorStmt = $this->con->prepare('INSERT INTO acl_object_identity_ancestors (object_identity_id, ancestor_id) VALUES (?, ?)');

        for ($i=0; $i<40000; $i++) {
            $this->generateAclHierarchy();
        }
    }

    protected function generateAclHierarchy()
    {
        $rootId = $this->generateAcl($this->chooseClassId(), null, array());

        $this->generateAclLevel(rand(1, 15), $rootId, array($rootId));
    }

    protected function generateAclLevel($depth, $parentId, $ancestors)
    {
        $level = count($ancestors);
        for ($i=0,$t=rand(1, 10); $i<$t; $i++) {
            $id = $this->generateAcl($this->chooseClassId(), $parentId, $ancestors);

            if ($level < $depth) {
                $this->generateAclLevel($depth, $id, array_merge($ancestors, array($id)));
            }
        }
    }

    protected function chooseClassId()
    {
        static $id = 1000;

        if ($id === 1000 || ($id < 1500 && rand(0, 1))) {
            $this->insertClassStmt->execute(array($id, $this->getRandomString(rand(20, 100), 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\\_')));
            $id += 1;

            return $id-1;
        } else {
            return rand(1000, $id-1);
        }
    }

    protected function generateAcl($classId, $parentId, $ancestors)
    {
        static $id = 1000;

        $this->insertOidStmt->execute(array(
            $id,
            $classId,
            $this->getRandomString(rand(20, 50)),
            $parentId,
            rand(0, 1),
        ));

        $this->insertOidAncestorStmt->execute(array($id, $id));
        foreach ($ancestors as $ancestor) {
            $this->insertOidAncestorStmt->execute(array($id, $ancestor));
        }

        $this->generateAces($classId, $id);
        $id += 1;

        return $id-1;
    }

    protected function chooseSid()
    {
        static $id = 1000;

        if ($id === 1000 || ($id < 11000 && rand(0, 1))) {
            $this->insertSidStmt->execute(array(
                $id,
                $this->getRandomString(rand(5, 30)),
                rand(0, 1)
            ));
            $id += 1;

            return $id-1;
        } else {
            return rand(1000, $id-1);
        }
    }

    protected function generateAces($classId, $objectId)
    {
        static $id = 1000;

        $sids = array();
        $fieldOrder = array();

        for ($i=0; $i<=30; $i++) {
            $fieldName = rand(0, 1) ? null : $this->getRandomString(rand(10, 20));

            do {
                $sid = $this->chooseSid();
            } while (array_key_exists($sid, $sids) && in_array($fieldName, $sids[$sid], true));

            $fieldOrder[$fieldName] = array_key_exists($fieldName, $fieldOrder) ? $fieldOrder[$fieldName]+1 : 0;
            if (!isset($sids[$sid])) {
                $sids[$sid] = array();
            }
            $sids[$sid][] = $fieldName;

            $strategy = rand(0, 2);
            if ($strategy === 0) {
                $strategy = PermissionGrantingStrategy::ALL;
            } elseif ($strategy === 1) {
                $strategy = PermissionGrantingStrategy::ANY;
            } else {
                $strategy = PermissionGrantingStrategy::EQUAL;
            }

            // id, cid, oid, field, order, sid, mask, granting, strategy, a success, a failure
            $this->insertEntryStmt->execute(array(
                $id,
                $classId,
                rand(0, 5) ? $objectId : null,
                $fieldName,
                $fieldOrder[$fieldName],
                $sid,
                $this->generateMask(),
                rand(0, 1),
                $strategy,
                rand(0, 1),
                rand(0, 1),
            ));

            $id += 1;
        }
    }

    protected function generateMask()
    {
        $i = rand(1, 30);
        $mask = 0;

        while ($i <= 30) {
            $mask |= 1 << rand(0, 30);
            $i++;
        }

        return $mask;
    }

    protected function getRandomString($length, $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
    {
        $s = '';
        $cLength = strlen($chars);

        while (strlen($s) < $length) {
            $s .= $chars[mt_rand(0, $cLength-1)];
        }

        return $s;
    }

    protected function getOptions()
    {
        return array(
            'oid_table_name' => 'acl_object_identities',
            'oid_ancestors_table_name' => 'acl_object_identity_ancestors',
            'class_table_name' => 'acl_classes',
            'sid_table_name' => 'acl_security_identities',
            'entry_table_name' => 'acl_entries',
        );
    }

    protected function getStrategy()
    {
        return new PermissionGrantingStrategy();
    }

    protected function getProvider()
    {
        return new AclProvider($this->con, $this->getStrategy(), $this->getOptions());
    }
}
PK�b�\�ԍZP5P5Npear/test/Security/Symfony/Component/Security/Acl/Tests/Voter/AclVoterTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Voter;

use Symfony\Component\Security\Acl\Exception\NoAceFoundException;
use Symfony\Component\Security\Acl\Voter\FieldVote;
use Symfony\Component\Security\Acl\Exception\AclNotFoundException;
use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Acl\Voter\AclVoter;

class AclVoterTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getSupportsAttributeTests
     */
    public function testSupportsAttribute($attribute, $supported)
    {
        list($voter,, $permissionMap,,) = $this->getVoter();

        $permissionMap
            ->expects($this->once())
            ->method('contains')
            ->with($this->identicalTo($attribute))
            ->will($this->returnValue($supported))
        ;

        $this->assertSame($supported, $voter->supportsAttribute($attribute));
    }

    public function getSupportsAttributeTests()
    {
        return array(
            array('foo', true),
            array('foo', false),
        );
    }

    /**
     * @dataProvider getSupportsClassTests
     */
    public function testSupportsClass($class)
    {
        list($voter,,,,) = $this->getVoter();

        $this->assertTrue($voter->supportsClass($class));
    }

    public function getSupportsClassTests()
    {
        return array(
            array('foo'),
            array('bar'),
            array('moo'),
        );
    }

    public function testVote()
    {
        list($voter,, $permissionMap,,) = $this->getVoter();
        $permissionMap
            ->expects($this->atLeastOnce())
            ->method('getMasks')
            ->will($this->returnValue(null))
        ;

        $this->assertSame(VoterInterface::ACCESS_ABSTAIN, $voter->vote($this->getToken(), null, array('VIEW', 'EDIT', 'DELETE')));
    }

    /**
     * @dataProvider getTrueFalseTests
     */
    public function testVoteWhenNoObjectIsPassed($allowIfObjectIdentityUnavailable)
    {
        list($voter,, $permissionMap,,) = $this->getVoter($allowIfObjectIdentityUnavailable);
        $permissionMap
            ->expects($this->once())
            ->method('getMasks')
            ->will($this->returnValue(array()))
        ;

        if ($allowIfObjectIdentityUnavailable) {
            $vote = VoterInterface::ACCESS_GRANTED;
        } else {
            $vote = VoterInterface::ACCESS_ABSTAIN;
        }

        $this->assertSame($vote, $voter->vote($this->getToken(), null, array('VIEW')));
    }

    /**
     * @dataProvider getTrueFalseTests
     */
    public function testVoteWhenOidStrategyReturnsNull($allowIfUnavailable)
    {
        list($voter,, $permissionMap, $oidStrategy,) = $this->getVoter($allowIfUnavailable);
        $permissionMap
            ->expects($this->once())
            ->method('getMasks')
            ->will($this->returnValue(array()))
        ;

        $oidStrategy
            ->expects($this->once())
            ->method('getObjectIdentity')
            ->will($this->returnValue(null))
        ;

        if ($allowIfUnavailable) {
            $vote = VoterInterface::ACCESS_GRANTED;
        } else {
            $vote = VoterInterface::ACCESS_ABSTAIN;
        }

        $this->assertSame($vote, $voter->vote($this->getToken(), new \stdClass(), array('VIEW')));
    }

    public function getTrueFalseTests()
    {
        return array(array(true), array(false));
    }

    public function testVoteNoAclFound()
    {
        list($voter, $provider, $permissionMap, $oidStrategy, $sidStrategy) = $this->getVoter();

        $permissionMap
            ->expects($this->once())
            ->method('getMasks')
            ->will($this->returnValue(array()))
        ;

        $oidStrategy
            ->expects($this->once())
            ->method('getObjectIdentity')
            ->will($this->returnValue($oid = new ObjectIdentity('1', 'Foo')))
        ;

        $sidStrategy
            ->expects($this->once())
            ->method('getSecurityIdentities')
            ->will($this->returnValue($sids = array(new UserSecurityIdentity('johannes', 'Foo'), new RoleSecurityIdentity('ROLE_FOO'))))
        ;

        $provider
            ->expects($this->once())
            ->method('findAcl')
            ->with($this->equalTo($oid), $this->equalTo($sids))
            ->will($this->throwException(new AclNotFoundException('Not found.')))
        ;

        $this->assertSame(VoterInterface::ACCESS_DENIED, $voter->vote($this->getToken(), new \stdClass(), array('VIEW')));
    }

    /**
     * @dataProvider getTrueFalseTests
     */
    public function testVoteGrantsAccess($grant)
    {
        list($voter, $provider, $permissionMap, $oidStrategy, $sidStrategy) = $this->getVoter();

        $permissionMap
            ->expects($this->once())
            ->method('getMasks')
            ->with($this->equalTo('VIEW'))
            ->will($this->returnValue($masks = array(1, 2, 3)))
        ;

        $oidStrategy
            ->expects($this->once())
            ->method('getObjectIdentity')
            ->will($this->returnValue($oid = new ObjectIdentity('1', 'Foo')))
        ;

        $sidStrategy
            ->expects($this->once())
            ->method('getSecurityIdentities')
            ->will($this->returnValue($sids = array(new UserSecurityIdentity('johannes', 'Foo'), new RoleSecurityIdentity('ROLE_FOO'))))
        ;

        $provider
            ->expects($this->once())
            ->method('findAcl')
            ->with($this->equalTo($oid), $this->equalTo($sids))
            ->will($this->returnValue($acl = $this->getMock('Symfony\Component\Security\Acl\Model\AclInterface')))
        ;

        $acl
            ->expects($this->once())
            ->method('isGranted')
            ->with($this->identicalTo($masks), $this->equalTo($sids), $this->isFalse())
            ->will($this->returnValue($grant))
        ;

        if ($grant) {
            $vote = VoterInterface::ACCESS_GRANTED;
        } else {
            $vote = VoterInterface::ACCESS_DENIED;
        }

        $this->assertSame($vote, $voter->vote($this->getToken(), new \stdClass(), array('VIEW')));
    }

    public function testVoteNoAceFound()
    {
        list($voter, $provider, $permissionMap, $oidStrategy, $sidStrategy) = $this->getVoter();

        $permissionMap
            ->expects($this->once())
            ->method('getMasks')
            ->with($this->equalTo('VIEW'))
            ->will($this->returnValue($masks = array(1, 2, 3)))
        ;

        $oidStrategy
            ->expects($this->once())
            ->method('getObjectIdentity')
            ->will($this->returnValue($oid = new ObjectIdentity('1', 'Foo')))
        ;

        $sidStrategy
            ->expects($this->once())
            ->method('getSecurityIdentities')
            ->will($this->returnValue($sids = array(new UserSecurityIdentity('johannes', 'Foo'), new RoleSecurityIdentity('ROLE_FOO'))))
        ;

        $provider
            ->expects($this->once())
            ->method('findAcl')
            ->with($this->equalTo($oid), $this->equalTo($sids))
            ->will($this->returnValue($acl = $this->getMock('Symfony\Component\Security\Acl\Model\AclInterface')))
        ;

        $acl
            ->expects($this->once())
            ->method('isGranted')
            ->with($this->identicalTo($masks), $this->equalTo($sids), $this->isFalse())
            ->will($this->throwException(new NoAceFoundException('No ACE')))
        ;

        $this->assertSame(VoterInterface::ACCESS_DENIED, $voter->vote($this->getToken(), new \stdClass(), array('VIEW')));
    }

    /**
     * @dataProvider getTrueFalseTests
     */
    public function testVoteGrantsFieldAccess($grant)
    {
        list($voter, $provider, $permissionMap, $oidStrategy, $sidStrategy) = $this->getVoter();

        $permissionMap
            ->expects($this->once())
            ->method('getMasks')
            ->with($this->equalTo('VIEW'))
            ->will($this->returnValue($masks = array(1, 2, 3)))
        ;

        $oidStrategy
            ->expects($this->once())
            ->method('getObjectIdentity')
            ->will($this->returnValue($oid = new ObjectIdentity('1', 'Foo')))
        ;

        $sidStrategy
            ->expects($this->once())
            ->method('getSecurityIdentities')
            ->will($this->returnValue($sids = array(new UserSecurityIdentity('johannes', 'Foo'), new RoleSecurityIdentity('ROLE_FOO'))))
        ;

        $provider
            ->expects($this->once())
            ->method('findAcl')
            ->with($this->equalTo($oid), $this->equalTo($sids))
            ->will($this->returnValue($acl = $this->getMock('Symfony\Component\Security\Acl\Model\AclInterface')))
        ;

        $acl
            ->expects($this->once())
            ->method('isFieldGranted')
            ->with($this->identicalTo('foo'), $this->identicalTo($masks), $this->equalTo($sids), $this->isFalse())
            ->will($this->returnValue($grant))
        ;

        if ($grant) {
            $vote = VoterInterface::ACCESS_GRANTED;
        } else {
            $vote = VoterInterface::ACCESS_DENIED;
        }

        $this->assertSame($vote, $voter->vote($this->getToken(), new FieldVote(new \stdClass(), 'foo'), array('VIEW')));
    }

    public function testVoteNoFieldAceFound()
    {
        list($voter, $provider, $permissionMap, $oidStrategy, $sidStrategy) = $this->getVoter();

        $permissionMap
            ->expects($this->once())
            ->method('getMasks')
            ->with($this->equalTo('VIEW'))
            ->will($this->returnValue($masks = array(1, 2, 3)))
        ;

        $oidStrategy
            ->expects($this->once())
            ->method('getObjectIdentity')
            ->will($this->returnValue($oid = new ObjectIdentity('1', 'Foo')))
        ;

        $sidStrategy
            ->expects($this->once())
            ->method('getSecurityIdentities')
            ->will($this->returnValue($sids = array(new UserSecurityIdentity('johannes', 'Foo'), new RoleSecurityIdentity('ROLE_FOO'))))
        ;

        $provider
            ->expects($this->once())
            ->method('findAcl')
            ->with($this->equalTo($oid), $this->equalTo($sids))
            ->will($this->returnValue($acl = $this->getMock('Symfony\Component\Security\Acl\Model\AclInterface')))
        ;

        $acl
            ->expects($this->once())
            ->method('isFieldGranted')
            ->with($this->identicalTo('foo'), $this->identicalTo($masks), $this->equalTo($sids), $this->isFalse())
            ->will($this->throwException(new NoAceFoundException('No ACE')))
        ;

        $this->assertSame(VoterInterface::ACCESS_DENIED, $voter->vote($this->getToken(), new FieldVote(new \stdClass(), 'foo'), array('VIEW')));
    }

    public function testWhenReceivingAnObjectIdentityInterfaceWeDontRetrieveANewObjectIdentity()
    {
        list($voter, $provider, $permissionMap, $oidStrategy, $sidStrategy) = $this->getVoter();

        $oid = new ObjectIdentity('someID','someType');

        $permissionMap
            ->expects($this->once())
            ->method('getMasks')
            ->with($this->equalTo('VIEW'))
            ->will($this->returnValue($masks = array(1, 2, 3)))
        ;

        $oidStrategy
            ->expects($this->never())
            ->method('getObjectIdentity')
        ;

        $sidStrategy
            ->expects($this->once())
            ->method('getSecurityIdentities')
            ->will($this->returnValue($sids = array(new UserSecurityIdentity('johannes', 'Foo'), new RoleSecurityIdentity('ROLE_FOO'))))
        ;

        $provider
            ->expects($this->once())
            ->method('findAcl')
            ->with($this->equalTo($oid), $this->equalTo($sids))
            ->will($this->returnValue($acl = $this->getMock('Symfony\Component\Security\Acl\Model\AclInterface')))
        ;

        $acl
            ->expects($this->once())
            ->method('isGranted')
            ->with($this->identicalTo($masks), $this->equalTo($sids), $this->isFalse())
            ->will($this->throwException(new NoAceFoundException('No ACE')))
        ;

        $voter->vote($this->getToken(), $oid, array('VIEW'));
    }

    protected function getToken()
    {
        return $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
    }

    protected function getVoter($allowIfObjectIdentityUnavailable = true)
    {
        $provider = $this->getMock('Symfony\Component\Security\Acl\Model\AclProviderInterface');
        $permissionMap = $this->getMock('Symfony\Component\Security\Acl\Permission\PermissionMapInterface');
        $oidStrategy = $this->getMock('Symfony\Component\Security\Acl\Model\ObjectIdentityRetrievalStrategyInterface');
        $sidStrategy = $this->getMock('Symfony\Component\Security\Acl\Model\SecurityIdentityRetrievalStrategyInterface');

        return array(
            new AclVoter($provider, $oidStrategy, $sidStrategy, $permissionMap, null, $allowIfObjectIdentityUnavailable),
            $provider,
            $permissionMap,
            $oidStrategy,
            $sidStrategy,
        );
    }
}
PK�b�\eE���Vpear/test/Security/Symfony/Component/Security/Acl/Tests/Permission/MaskBuilderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Permission;

use Symfony\Component\Security\Acl\Permission\MaskBuilder;

class MaskBuilderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @expectedException \InvalidArgumentException
     * @dataProvider getInvalidConstructorData
     */
    public function testConstructorWithNonInteger($invalidMask)
    {
        new MaskBuilder($invalidMask);
    }

    public function getInvalidConstructorData()
    {
        return array(
            array(234.463),
            array('asdgasdf'),
            array(array()),
            array(new \stdClass()),
        );
    }

    public function testConstructorWithoutArguments()
    {
        $builder = new MaskBuilder();

        $this->assertEquals(0, $builder->get());
    }

    public function testConstructor()
    {
        $builder = new MaskBuilder(123456);

        $this->assertEquals(123456, $builder->get());
    }

    public function testAddAndRemove()
    {
        $builder = new MaskBuilder();

        $builder
            ->add('view')
            ->add('eDiT')
            ->add('ownEr')
        ;
        $mask = $builder->get();

        $this->assertEquals(MaskBuilder::MASK_VIEW, $mask & MaskBuilder::MASK_VIEW);
        $this->assertEquals(MaskBuilder::MASK_EDIT, $mask & MaskBuilder::MASK_EDIT);
        $this->assertEquals(MaskBuilder::MASK_OWNER, $mask & MaskBuilder::MASK_OWNER);
        $this->assertEquals(0, $mask & MaskBuilder::MASK_MASTER);
        $this->assertEquals(0, $mask & MaskBuilder::MASK_CREATE);
        $this->assertEquals(0, $mask & MaskBuilder::MASK_DELETE);
        $this->assertEquals(0, $mask & MaskBuilder::MASK_UNDELETE);

        $builder->remove('edit')->remove('OWner');
        $mask = $builder->get();
        $this->assertEquals(0, $mask & MaskBuilder::MASK_EDIT);
        $this->assertEquals(0, $mask & MaskBuilder::MASK_OWNER);
        $this->assertEquals(MaskBuilder::MASK_VIEW, $mask & MaskBuilder::MASK_VIEW);
    }

    public function testGetPattern()
    {
        $builder = new MaskBuilder();
        $this->assertEquals(MaskBuilder::ALL_OFF, $builder->getPattern());

        $builder->add('view');
        $this->assertEquals(str_repeat('.', 31).'V', $builder->getPattern());

        $builder->add('owner');
        $this->assertEquals(str_repeat('.', 24).'N......V', $builder->getPattern());

        $builder->add(1 << 10);
        $this->assertEquals(str_repeat('.', 21).MaskBuilder::ON.'..N......V', $builder->getPattern());
    }

    public function testReset()
    {
        $builder = new MaskBuilder();
        $this->assertEquals(0, $builder->get());

        $builder->add('view');
        $this->assertTrue($builder->get() > 0);

        $builder->reset();
        $this->assertEquals(0, $builder->get());
    }
}
PK�b�\���yy]pear/test/Security/Symfony/Component/Security/Acl/Tests/Permission/BasicPermissionMapTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Permission;

use Symfony\Component\Security\Acl\Permission\BasicPermissionMap;

class BasicPermissionMapTest extends \PHPUnit_Framework_TestCase
{
    public function testGetMasksReturnsNullWhenNotSupportedMask()
    {
        $map = new BasicPermissionMap();
        $this->assertNull($map->getMasks('IS_AUTHENTICATED_REMEMBERED', null));
    }
}
PK�b�\��a(([pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/UserSecurityIdentityTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain;

use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;

class UserSecurityIdentityTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $id = new UserSecurityIdentity('foo', 'Foo');

        $this->assertEquals('foo', $id->getUsername());
        $this->assertEquals('Foo', $id->getClass());
    }

    // Test that constructor never changes the type, even for proxies
    public function testConstructorWithProxy()
    {
        $id = new UserSecurityIdentity('foo', 'Acme\DemoBundle\Proxy\__CG__\Symfony\Component\Security\Acl\Tests\Domain\Foo');

        $this->assertEquals('foo', $id->getUsername());
        $this->assertEquals('Acme\DemoBundle\Proxy\__CG__\Symfony\Component\Security\Acl\Tests\Domain\Foo', $id->getClass());
    }

    /**
     * @dataProvider getCompareData
     */
    public function testEquals($id1, $id2, $equal)
    {
        $this->assertSame($equal, $id1->equals($id2));
    }

    public function getCompareData()
    {
        $account = $this->getMockBuilder('Symfony\Component\Security\Core\User\UserInterface')
                            ->setMockClassName('USI_AccountImpl')
                            ->getMock();
        $account
            ->expects($this->any())
            ->method('getUsername')
            ->will($this->returnValue('foo'))
        ;

        $token = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface');
        $token
            ->expects($this->any())
            ->method('getUser')
            ->will($this->returnValue($account))
        ;

        return array(
            array(new UserSecurityIdentity('foo', 'Foo'), new UserSecurityIdentity('foo', 'Foo'), true),
            array(new UserSecurityIdentity('foo', 'Bar'), new UserSecurityIdentity('foo', 'Foo'), false),
            array(new UserSecurityIdentity('foo', 'Foo'), new UserSecurityIdentity('bar', 'Foo'), false),
            array(new UserSecurityIdentity('foo', 'Foo'), UserSecurityIdentity::fromAccount($account), false),
            array(new UserSecurityIdentity('bla', 'Foo'), new UserSecurityIdentity('blub', 'Foo'), false),
            array(new UserSecurityIdentity('foo', 'Foo'), new RoleSecurityIdentity('foo'), false),
            array(new UserSecurityIdentity('foo', 'Foo'), UserSecurityIdentity::fromToken($token), false),
            array(new UserSecurityIdentity('foo', 'USI_AccountImpl'), UserSecurityIdentity::fromToken($token), true),
        );
    }
}
PK�b�\��v��apear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/PermissionGrantingStrategyTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain;

use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\Acl;
use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\PermissionGrantingStrategy;
use Symfony\Component\Security\Acl\Exception\NoAceFoundException;

class PermissionGrantingStrategyTest extends \PHPUnit_Framework_TestCase
{
    public function testIsGrantedObjectAcesHavePriority()
    {
        $strategy = new PermissionGrantingStrategy();
        $acl = $this->getAcl($strategy);
        $sid = new UserSecurityIdentity('johannes', 'Foo');

        $acl->insertClassAce($sid, 1);
        $acl->insertObjectAce($sid, 1, 0, false);
        $this->assertFalse($strategy->isGranted($acl, array(1), array($sid)));
    }

    public function testIsGrantedFallsBackToClassAcesIfNoApplicableObjectAceWasFound()
    {
        $strategy = new PermissionGrantingStrategy();
        $acl = $this->getAcl($strategy);
        $sid = new UserSecurityIdentity('johannes', 'Foo');

        $acl->insertClassAce($sid, 1);
        $this->assertTrue($strategy->isGranted($acl, array(1), array($sid)));
    }

    public function testIsGrantedFavorsLocalAcesOverParentAclAces()
    {
        $strategy = new PermissionGrantingStrategy();
        $sid = new UserSecurityIdentity('johannes', 'Foo');

        $acl = $this->getAcl($strategy);
        $acl->insertClassAce($sid, 1);

        $parentAcl = $this->getAcl($strategy);
        $acl->setParentAcl($parentAcl);
        $parentAcl->insertClassAce($sid, 1, 0, false);

        $this->assertTrue($strategy->isGranted($acl, array(1), array($sid)));
    }

    public function testIsGrantedFallsBackToParentAcesIfNoLocalAcesAreApplicable()
    {
        $strategy = new PermissionGrantingStrategy();
        $sid = new UserSecurityIdentity('johannes', 'Foo');
        $anotherSid = new UserSecurityIdentity('ROLE_USER', 'Foo');

        $acl = $this->getAcl($strategy);
        $acl->insertClassAce($anotherSid, 1, 0, false);

        $parentAcl = $this->getAcl($strategy);
        $acl->setParentAcl($parentAcl);
        $parentAcl->insertClassAce($sid, 1);

        $this->assertTrue($strategy->isGranted($acl, array(1), array($sid)));
    }

    /**
     * @expectedException \Symfony\Component\Security\Acl\Exception\NoAceFoundException
     */
    public function testIsGrantedReturnsExceptionIfNoAceIsFound()
    {
        $strategy = new PermissionGrantingStrategy();
        $acl = $this->getAcl($strategy);
        $sid = new UserSecurityIdentity('johannes', 'Foo');

        $strategy->isGranted($acl, array(1), array($sid));
    }

    public function testIsGrantedFirstApplicableEntryMakesUltimateDecisionForPermissionIdentityCombination()
    {
        $strategy = new PermissionGrantingStrategy();
        $acl = $this->getAcl($strategy);
        $sid = new UserSecurityIdentity('johannes', 'Foo');
        $aSid = new RoleSecurityIdentity('ROLE_USER');

        $acl->insertClassAce($aSid, 1);
        $acl->insertClassAce($sid, 1, 1, false);
        $acl->insertClassAce($sid, 1, 2);
        $this->assertFalse($strategy->isGranted($acl, array(1), array($sid, $aSid)));

        $acl->insertObjectAce($sid, 1, 0, false);
        $acl->insertObjectAce($aSid, 1, 1);
        $this->assertFalse($strategy->isGranted($acl, array(1), array($sid, $aSid)));
    }

    public function testIsGrantedCallsAuditLoggerOnGrant()
    {
        $strategy = new PermissionGrantingStrategy();
        $acl = $this->getAcl($strategy);
        $sid = new UserSecurityIdentity('johannes', 'Foo');

        $logger = $this->getMock('Symfony\Component\Security\Acl\Model\AuditLoggerInterface');
        $logger
            ->expects($this->once())
            ->method('logIfNeeded')
        ;
        $strategy->setAuditLogger($logger);

        $acl->insertObjectAce($sid, 1);
        $acl->updateObjectAuditing(0, true, false);

        $this->assertTrue($strategy->isGranted($acl, array(1), array($sid)));
    }

    public function testIsGrantedCallsAuditLoggerOnDeny()
    {
        $strategy = new PermissionGrantingStrategy();
        $acl = $this->getAcl($strategy);
        $sid = new UserSecurityIdentity('johannes', 'Foo');

        $logger = $this->getMock('Symfony\Component\Security\Acl\Model\AuditLoggerInterface');
        $logger
            ->expects($this->once())
            ->method('logIfNeeded')
        ;
        $strategy->setAuditLogger($logger);

        $acl->insertObjectAce($sid, 1, 0, false);
        $acl->updateObjectAuditing(0, false, true);

        $this->assertFalse($strategy->isGranted($acl, array(1), array($sid)));
    }

    /**
     * @dataProvider getAllStrategyTests
     */
    public function testIsGrantedStrategies($maskStrategy, $aceMask, $requiredMask, $result)
    {
        $strategy = new PermissionGrantingStrategy();
        $acl = $this->getAcl($strategy);
        $sid = new UserSecurityIdentity('johannes', 'Foo');

        $acl->insertObjectAce($sid, $aceMask, 0, true, $maskStrategy);

        if (false === $result) {
            try {
                $strategy->isGranted($acl, array($requiredMask), array($sid));
                $this->fail('The ACE is not supposed to match.');
            } catch (NoAceFoundException $noAce) { }
        } else {
            $this->assertTrue($strategy->isGranted($acl, array($requiredMask), array($sid)));
        }
    }

    public function getAllStrategyTests()
    {
        return array(
            array('all', 1 << 0 | 1 << 1, 1 << 0, true),
            array('all', 1 << 0 | 1 << 1, 1 << 2, false),
            array('all', 1 << 0 | 1 << 10, 1 << 0 | 1 << 10, true),
            array('all', 1 << 0 | 1 << 1, 1 << 0 | 1 << 1 || 1 << 2, false),
            array('any', 1 << 0 | 1 << 1, 1 << 0, true),
            array('any', 1 << 0 | 1 << 1, 1 << 0 | 1 << 2, true),
            array('any', 1 << 0 | 1 << 1, 1 << 2, false),
            array('equal', 1 << 0 | 1 << 1, 1 << 0, false),
            array('equal', 1 << 0 | 1 << 1, 1 << 1, false),
            array('equal', 1 << 0 | 1 << 1, 1 << 0 | 1 << 1, true),
        );
    }

    protected function getAcl($strategy)
    {
        static $id = 1;

        return new Acl($id++, new ObjectIdentity(1, 'Foo'), $strategy, array(), true);
    }
}
PK�b�\5�[pear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/RoleSecurityIdentityTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain;

use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity;

class RoleSecurityIdentityTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $id = new RoleSecurityIdentity('ROLE_FOO');

        $this->assertEquals('ROLE_FOO', $id->getRole());
    }

    public function testConstructorWithRoleInstance()
    {
        $id = new RoleSecurityIdentity(new Role('ROLE_FOO'));

        $this->assertEquals('ROLE_FOO', $id->getRole());
    }

    /**
     * @dataProvider getCompareData
     */
    public function testEquals($id1, $id2, $equal)
    {
        if ($equal) {
            $this->assertTrue($id1->equals($id2));
        } else {
            $this->assertFalse($id1->equals($id2));
        }
    }

    public function getCompareData()
    {
        return array(
            array(new RoleSecurityIdentity('ROLE_FOO'), new RoleSecurityIdentity('ROLE_FOO'), true),
            array(new RoleSecurityIdentity('ROLE_FOO'), new RoleSecurityIdentity(new Role('ROLE_FOO')), true),
            array(new RoleSecurityIdentity('ROLE_USER'), new RoleSecurityIdentity('ROLE_FOO'), false),
            array(new RoleSecurityIdentity('ROLE_FOO'), new UserSecurityIdentity('ROLE_FOO', 'Foo'), false),
        );
    }
}
PK�b�\��+&Upear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain
{
    use Symfony\Component\Security\Acl\Domain\ObjectIdentity;

    class ObjectIdentityTest extends \PHPUnit_Framework_TestCase
    {
        public function testConstructor()
        {
            $id = new ObjectIdentity('fooid', 'footype');

            $this->assertEquals('fooid', $id->getIdentifier());
            $this->assertEquals('footype', $id->getType());
        }

        // Test that constructor never changes passed type, even with proxies
        public function testConstructorWithProxy()
        {
            $id = new ObjectIdentity('fooid', 'Acme\DemoBundle\Proxy\__CG__\Symfony\Component\Security\Acl\Tests\Domain\TestDomainObject');

            $this->assertEquals('fooid', $id->getIdentifier());
            $this->assertEquals('Acme\DemoBundle\Proxy\__CG__\Symfony\Component\Security\Acl\Tests\Domain\TestDomainObject', $id->getType());
        }

        public function testFromDomainObjectPrefersInterfaceOverGetId()
        {
            $domainObject = $this->getMock('Symfony\Component\Security\Acl\Model\DomainObjectInterface');
            $domainObject
                ->expects($this->once())
                ->method('getObjectIdentifier')
                ->will($this->returnValue('getObjectIdentifier()'))
            ;
            $domainObject
                ->expects($this->never())
                ->method('getId')
                ->will($this->returnValue('getId()'))
            ;

            $id = ObjectIdentity::fromDomainObject($domainObject);
            $this->assertEquals('getObjectIdentifier()', $id->getIdentifier());
        }

        public function testFromDomainObjectWithoutInterface()
        {
            $id = ObjectIdentity::fromDomainObject(new TestDomainObject());
            $this->assertEquals('getId()', $id->getIdentifier());
            $this->assertEquals('Symfony\Component\Security\Acl\Tests\Domain\TestDomainObject', $id->getType());
        }

        public function testFromDomainObjectWithProxy()
        {
            $id = ObjectIdentity::fromDomainObject(new \Acme\DemoBundle\Proxy\__CG__\Symfony\Component\Security\Acl\Tests\Domain\TestDomainObject());
            $this->assertEquals('getId()', $id->getIdentifier());
            $this->assertEquals('Symfony\Component\Security\Acl\Tests\Domain\TestDomainObject', $id->getType());
        }

        /**
         * @dataProvider getCompareData
         */
        public function testEquals($oid1, $oid2, $equal)
        {
            if ($equal) {
                $this->assertTrue($oid1->equals($oid2));
            } else {
                $this->assertFalse($oid1->equals($oid2));
            }
        }

        public function getCompareData()
        {
            return array(
                array(new ObjectIdentity('123', 'foo'), new ObjectIdentity('123', 'foo'), true),
                array(new ObjectIdentity('123', 'foo'), new ObjectIdentity(123, 'foo'), true),
                array(new ObjectIdentity('1', 'foo'), new ObjectIdentity('2', 'foo'), false),
                array(new ObjectIdentity('1', 'bla'), new ObjectIdentity('1', 'blub'), false),
            );
        }
    }

    class TestDomainObject
    {
        public function getObjectIdentifier()
        {
            return 'getObjectIdentifier()';
        }

        public function getId()
        {
            return 'getId()';
        }
    }
}

namespace Acme\DemoBundle\Proxy\__CG__\Symfony\Component\Security\Acl\Tests\Domain
{
    class TestDomainObject extends \Symfony\Component\Security\Acl\Tests\Domain\TestDomainObject
    {
    }
}
PK�b�\6x�}&&Qpear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/FieldEntryTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain;

use Symfony\Component\Security\Acl\Domain\FieldEntry;

class FieldEntryTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $ace = $this->getAce();

        $this->assertEquals('foo', $ace->getField());
    }

    public function testSerializeUnserialize()
    {
        $ace = $this->getAce();

        $serialized = serialize($ace);
        $uAce = unserialize($serialized);

        $this->assertNull($uAce->getAcl());
        $this->assertInstanceOf('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', $uAce->getSecurityIdentity());
        $this->assertEquals($ace->getId(), $uAce->getId());
        $this->assertEquals($ace->getField(), $uAce->getField());
        $this->assertEquals($ace->getMask(), $uAce->getMask());
        $this->assertEquals($ace->getStrategy(), $uAce->getStrategy());
        $this->assertEquals($ace->isGranting(), $uAce->isGranting());
        $this->assertEquals($ace->isAuditSuccess(), $uAce->isAuditSuccess());
        $this->assertEquals($ace->isAuditFailure(), $uAce->isAuditFailure());
    }

    protected function getAce($acl = null, $sid = null)
    {
        if (null === $acl) {
            $acl = $this->getAcl();
        }
        if (null === $sid) {
            $sid = $this->getSid();
        }

        return new FieldEntry(
            123,
            $acl,
            'foo',
            $sid,
            'foostrat',
            123456,
            true,
            false,
            true
        );
    }

    protected function getAcl()
    {
        return $this->getMock('Symfony\Component\Security\Acl\Model\AclInterface');
    }

    protected function getSid()
    {
        return $this->getMock('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface');
    }
}
PK�b�\/bAbAJpear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/AclTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain;

use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;

use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\PermissionGrantingStrategy;
use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
use Symfony\Component\Security\Acl\Domain\Acl;

class AclTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $acl = new Acl(1, $oid = new ObjectIdentity('foo', 'foo'), $permissionStrategy = new PermissionGrantingStrategy(), array(), true);

        $this->assertSame(1, $acl->getId());
        $this->assertSame($oid, $acl->getObjectIdentity());
        $this->assertNull($acl->getParentAcl());
        $this->assertTrue($acl->isEntriesInheriting());
    }

    /**
     * @expectedException \OutOfBoundsException
     * @dataProvider getDeleteAceTests
     */
    public function testDeleteAceThrowsExceptionOnInvalidIndex($type)
    {
        $acl = $this->getAcl();
        $acl->{'delete'.$type.'Ace'}(0);
    }

    /**
     * @dataProvider getDeleteAceTests
     */
    public function testDeleteAce($type)
    {
        $acl = $this->getAcl();
        $acl->{'insert'.$type.'Ace'}(new RoleSecurityIdentity('foo'), 1);
        $acl->{'insert'.$type.'Ace'}(new RoleSecurityIdentity('foo'), 2, 1);
        $acl->{'insert'.$type.'Ace'}(new RoleSecurityIdentity('foo'), 3, 2);

        $listener = $this->getListener(array(
            $type.'Aces', 'aceOrder', 'aceOrder', $type.'Aces',
        ));
        $acl->addPropertyChangedListener($listener);

        $this->assertCount(3, $acl->{'get'.$type.'Aces'}());

        $acl->{'delete'.$type.'Ace'}(0);
        $this->assertCount(2, $aces = $acl->{'get'.$type.'Aces'}());
        $this->assertEquals(2, $aces[0]->getMask());
        $this->assertEquals(3, $aces[1]->getMask());

        $acl->{'delete'.$type.'Ace'}(1);
        $this->assertCount(1, $aces = $acl->{'get'.$type.'Aces'}());
        $this->assertEquals(2, $aces[0]->getMask());
    }

    public function getDeleteAceTests()
    {
        return array(
            array('class'),
            array('object'),
        );
    }

    /**
     * @expectedException \OutOfBoundsException
     * @dataProvider getDeleteFieldAceTests
     */
    public function testDeleteFieldAceThrowsExceptionOnInvalidIndex($type)
    {
        $acl = $this->getAcl();
        $acl->{'delete'.$type.'Ace'}('foo', 0);
    }

    /**
     * @dataProvider getDeleteFieldAceTests
     */
    public function testDeleteFieldAce($type)
    {
        $acl = $this->getAcl();
        $acl->{'insert'.$type.'Ace'}('foo', new RoleSecurityIdentity('foo'), 1, 0);
        $acl->{'insert'.$type.'Ace'}('foo', new RoleSecurityIdentity('foo'), 2, 1);
        $acl->{'insert'.$type.'Ace'}('foo', new RoleSecurityIdentity('foo'), 3, 2);

        $listener = $this->getListener(array(
            $type.'Aces', 'aceOrder', 'aceOrder', $type.'Aces',
        ));
        $acl->addPropertyChangedListener($listener);

        $this->assertCount(3, $acl->{'get'.$type.'Aces'}('foo'));

        $acl->{'delete'.$type.'Ace'}(0, 'foo');
        $this->assertCount(2, $aces = $acl->{'get'.$type.'Aces'}('foo'));
        $this->assertEquals(2, $aces[0]->getMask());
        $this->assertEquals(3, $aces[1]->getMask());

        $acl->{'delete'.$type.'Ace'}(1, 'foo');
        $this->assertCount(1, $aces = $acl->{'get'.$type.'Aces'}('foo'));
        $this->assertEquals(2, $aces[0]->getMask());
    }

    public function getDeleteFieldAceTests()
    {
        return array(
            array('classField'),
            array('objectField'),
        );
    }

    /**
     * @dataProvider getInsertAceTests
     */
    public function testInsertAce($property, $method)
    {
        $acl = $this->getAcl();

        $listener = $this->getListener(array(
            $property, 'aceOrder', $property, 'aceOrder', $property
        ));
        $acl->addPropertyChangedListener($listener);

        $sid = new RoleSecurityIdentity('foo');
        $acl->$method($sid, 1);
        $acl->$method($sid, 2);
        $acl->$method($sid, 3, 1, false);

        $this->assertCount(3, $aces = $acl->{'get'.$property}());
        $this->assertEquals(2, $aces[0]->getMask());
        $this->assertEquals(3, $aces[1]->getMask());
        $this->assertEquals(1, $aces[2]->getMask());
    }

    /**
     * @expectedException \OutOfBoundsException
     * @dataProvider getInsertAceTests
     */
    public function testInsertClassAceThrowsExceptionOnInvalidIndex($property, $method)
    {
        $acl = $this->getAcl();
        $acl->$method(new RoleSecurityIdentity('foo'), 1, 1);
    }

    public function getInsertAceTests()
    {
        return array(
            array('classAces', 'insertClassAce'),
            array('objectAces', 'insertObjectAce'),
        );
    }

    /**
     * @dataProvider getInsertFieldAceTests
     */
    public function testInsertClassFieldAce($property, $method)
    {
        $acl = $this->getAcl();

        $listener = $this->getListener(array(
            $property, $property, 'aceOrder', $property,
            'aceOrder', 'aceOrder', $property,
        ));
        $acl->addPropertyChangedListener($listener);

        $sid = new RoleSecurityIdentity('foo');
        $acl->$method('foo', $sid, 1);
        $acl->$method('foo2', $sid, 1);
        $acl->$method('foo', $sid, 3);
        $acl->$method('foo', $sid, 2);

        $this->assertCount(3, $aces = $acl->{'get'.$property}('foo'));
        $this->assertCount(1, $acl->{'get'.$property}('foo2'));
        $this->assertEquals(2, $aces[0]->getMask());
        $this->assertEquals(3, $aces[1]->getMask());
        $this->assertEquals(1, $aces[2]->getMask());
    }

    /**
     * @expectedException \OutOfBoundsException
     * @dataProvider getInsertFieldAceTests
     */
    public function testInsertClassFieldAceThrowsExceptionOnInvalidIndex($property, $method)
    {
        $acl = $this->getAcl();
        $acl->$method('foo', new RoleSecurityIdentity('foo'), 1, 1);
    }

    public function getInsertFieldAceTests()
    {
        return array(
            array('classFieldAces', 'insertClassFieldAce'),
            array('objectFieldAces', 'insertObjectFieldAce'),
        );
    }

    public function testIsFieldGranted()
    {
        $sids = array(new RoleSecurityIdentity('ROLE_FOO'), new RoleSecurityIdentity('ROLE_IDDQD'));
        $masks = array(1, 2, 4);
        $strategy = $this->getMock('Symfony\Component\Security\Acl\Model\PermissionGrantingStrategyInterface');
        $acl = new Acl(1, new ObjectIdentity(1, 'foo'), $strategy, array(), true);

        $strategy
            ->expects($this->once())
            ->method('isFieldGranted')
            ->with($this->equalTo($acl), $this->equalTo('foo'), $this->equalTo($masks), $this->equalTo($sids), $this->isTrue())
            ->will($this->returnValue(true))
        ;

        $this->assertTrue($acl->isFieldGranted('foo', $masks, $sids, true));
    }

    public function testIsGranted()
    {
        $sids = array(new RoleSecurityIdentity('ROLE_FOO'), new RoleSecurityIdentity('ROLE_IDDQD'));
        $masks = array(1, 2, 4);
        $strategy = $this->getMock('Symfony\Component\Security\Acl\Model\PermissionGrantingStrategyInterface');
        $acl = new Acl(1, new ObjectIdentity(1, 'foo'), $strategy, array(), true);

        $strategy
            ->expects($this->once())
            ->method('isGranted')
            ->with($this->equalTo($acl), $this->equalTo($masks), $this->equalTo($sids), $this->isTrue())
            ->will($this->returnValue(true))
        ;

        $this->assertTrue($acl->isGranted($masks, $sids, true));
    }

    public function testSetGetParentAcl()
    {
        $acl = $this->getAcl();
        $parentAcl = $this->getAcl();

        $listener = $this->getListener(array('parentAcl'));
        $acl->addPropertyChangedListener($listener);

        $this->assertNull($acl->getParentAcl());
        $acl->setParentAcl($parentAcl);
        $this->assertSame($parentAcl, $acl->getParentAcl());

        $acl->setParentAcl(null);
        $this->assertNull($acl->getParentAcl());
    }

    public function testSetIsEntriesInheriting()
    {
        $acl = $this->getAcl();

        $listener = $this->getListener(array('entriesInheriting'));
        $acl->addPropertyChangedListener($listener);

        $this->assertTrue($acl->isEntriesInheriting());
        $acl->setEntriesInheriting(false);
        $this->assertFalse($acl->isEntriesInheriting());
    }

    public function testIsSidLoadedWhenAllSidsAreLoaded()
    {
        $acl = $this->getAcl();

        $this->assertTrue($acl->isSidLoaded(new UserSecurityIdentity('foo', 'Foo')));
        $this->assertTrue($acl->isSidLoaded(new RoleSecurityIdentity('ROLE_FOO', 'Foo')));
    }

    public function testIsSidLoaded()
    {
        $acl = new Acl(1, new ObjectIdentity('1', 'foo'), new PermissionGrantingStrategy(), array(new UserSecurityIdentity('foo', 'Foo'), new UserSecurityIdentity('johannes', 'Bar')), true);

        $this->assertTrue($acl->isSidLoaded(new UserSecurityIdentity('foo', 'Foo')));
        $this->assertTrue($acl->isSidLoaded(new UserSecurityIdentity('johannes', 'Bar')));
        $this->assertTrue($acl->isSidLoaded(array(
            new UserSecurityIdentity('foo', 'Foo'),
            new UserSecurityIdentity('johannes', 'Bar'),
        )));
        $this->assertFalse($acl->isSidLoaded(new RoleSecurityIdentity('ROLE_FOO')));
        $this->assertFalse($acl->isSidLoaded(new UserSecurityIdentity('schmittjoh@gmail.com', 'Moo')));
        $this->assertFalse($acl->isSidLoaded(array(
            new UserSecurityIdentity('foo', 'Foo'),
            new UserSecurityIdentity('johannes', 'Bar'),
            new RoleSecurityIdentity('ROLE_FOO'),
        )));
    }

    /**
     * @dataProvider getUpdateAceTests
     * @expectedException \OutOfBoundsException
     */
    public function testUpdateAceThrowsOutOfBoundsExceptionOnInvalidIndex($type)
    {
        $acl = $this->getAcl();
        $acl->{'update'.$type}(0, 1);
    }

    /**
     * @dataProvider getUpdateAceTests
     */
    public function testUpdateAce($type)
    {
        $acl = $this->getAcl();
        $acl->{'insert'.$type}(new RoleSecurityIdentity('foo'), 1);

        $listener = $this->getListener(array(
            'mask', 'mask', 'strategy',
        ));
        $acl->addPropertyChangedListener($listener);

        $aces = $acl->{'get'.$type.'s'}();
        $ace = reset($aces);
        $this->assertEquals(1, $ace->getMask());
        $this->assertEquals('all', $ace->getStrategy());

        $acl->{'update'.$type}(0, 3);
        $this->assertEquals(3, $ace->getMask());
        $this->assertEquals('all', $ace->getStrategy());

        $acl->{'update'.$type}(0, 1, 'foo');
        $this->assertEquals(1, $ace->getMask());
        $this->assertEquals('foo', $ace->getStrategy());
    }

    public function getUpdateAceTests()
    {
        return array(
            array('classAce'),
            array('objectAce'),
        );
    }

    /**
     * @dataProvider getUpdateFieldAceTests
     * @expectedException \OutOfBoundsException
     */
    public function testUpdateFieldAceThrowsExceptionOnInvalidIndex($type)
    {
        $acl = $this->getAcl();
        $acl->{'update'.$type}(0, 'foo', 1);
    }

    /**
     * @dataProvider getUpdateFieldAceTests
     */
    public function testUpdateFieldAce($type)
    {
        $acl = $this->getAcl();
        $acl->{'insert'.$type}('foo', new UserSecurityIdentity('foo', 'Foo'), 1);

        $listener = $this->getListener(array(
            'mask', 'mask', 'strategy'
        ));
        $acl->addPropertyChangedListener($listener);

        $aces = $acl->{'get'.$type.'s'}('foo');
        $ace = reset($aces);
        $this->assertEquals(1, $ace->getMask());
        $this->assertEquals('all', $ace->getStrategy());

        $acl->{'update'.$type}(0, 'foo', 3);
        $this->assertEquals(3, $ace->getMask());
        $this->assertEquals('all', $ace->getStrategy());

        $acl->{'update'.$type}(0, 'foo', 1, 'foo');
        $this->assertEquals(1, $ace->getMask());
        $this->assertEquals('foo', $ace->getStrategy());
    }

    public function getUpdateFieldAceTests()
    {
        return array(
            array('classFieldAce'),
            array('objectFieldAce'),
        );
    }

    /**
     * @dataProvider getUpdateAuditingTests
     * @expectedException \OutOfBoundsException
     */
    public function testUpdateAuditingThrowsExceptionOnInvalidIndex($type)
    {
        $acl = $this->getAcl();
        $acl->{'update'.$type.'Auditing'}(0, true, false);
    }

    /**
     * @dataProvider getUpdateAuditingTests
     */
    public function testUpdateAuditing($type)
    {
        $acl = $this->getAcl();
        $acl->{'insert'.$type.'Ace'}(new RoleSecurityIdentity('foo'), 1);

        $listener = $this->getListener(array(
            'auditFailure', 'auditSuccess', 'auditFailure',
        ));
        $acl->addPropertyChangedListener($listener);

        $aces = $acl->{'get'.$type.'Aces'}();
        $ace = reset($aces);
        $this->assertFalse($ace->isAuditSuccess());
        $this->assertFalse($ace->isAuditFailure());

        $acl->{'update'.$type.'Auditing'}(0, false, true);
        $this->assertFalse($ace->isAuditSuccess());
        $this->assertTrue($ace->isAuditFailure());

        $acl->{'update'.$type.'Auditing'}(0, true, false);
        $this->assertTrue($ace->isAuditSuccess());
        $this->assertFalse($ace->isAuditFailure());
    }

    public function getUpdateAuditingTests()
    {
        return array(
            array('class'),
            array('object'),
        );
    }

    /**
     * @expectedException \InvalidArgumentException
     * @dataProvider getUpdateFieldAuditingTests
     */
    public function testUpdateFieldAuditingThrowsExceptionOnInvalidField($type)
    {
        $acl = $this->getAcl();
        $acl->{'update'.$type.'Auditing'}(0, 'foo', true, true);
    }

    /**
     * @expectedException \OutOfBoundsException
     * @dataProvider getUpdateFieldAuditingTests
     */
    public function testUpdateFieldAuditingThrowsExceptionOnInvalidIndex($type)
    {
        $acl = $this->getAcl();
        $acl->{'insert'.$type.'Ace'}('foo', new RoleSecurityIdentity('foo'), 1);
        $acl->{'update'.$type.'Auditing'}(1, 'foo', true, false);
    }

    /**
     * @dataProvider getUpdateFieldAuditingTests
     */
    public function testUpdateFieldAuditing($type)
    {
        $acl = $this->getAcl();
        $acl->{'insert'.$type.'Ace'}('foo', new RoleSecurityIdentity('foo'), 1);

        $listener = $this->getListener(array(
            'auditSuccess', 'auditSuccess', 'auditFailure',
        ));
        $acl->addPropertyChangedListener($listener);

        $aces = $acl->{'get'.$type.'Aces'}('foo');
        $ace = reset($aces);
        $this->assertFalse($ace->isAuditSuccess());
        $this->assertFalse($ace->isAuditFailure());

        $acl->{'update'.$type.'Auditing'}(0, 'foo', true, false);
        $this->assertTrue($ace->isAuditSuccess());
        $this->assertFalse($ace->isAuditFailure());

        $acl->{'update'.$type.'Auditing'}(0, 'foo', false, true);
        $this->assertFalse($ace->isAuditSuccess());
        $this->assertTrue($ace->isAuditFailure());
    }

    public function getUpdateFieldAuditingTests()
    {
        return array(
            array('classField'),
            array('objectField'),
        );
    }

    protected function getListener($expectedChanges)
    {
        $aceProperties = array('aceOrder', 'mask', 'strategy', 'auditSuccess', 'auditFailure');

        $listener = $this->getMock('Doctrine\Common\PropertyChangedListener');
        foreach ($expectedChanges as $index => $property) {
            if (in_array($property, $aceProperties)) {
                $class = 'Symfony\Component\Security\Acl\Domain\Entry';
            } else {
                $class = 'Symfony\Component\Security\Acl\Domain\Acl';
            }

            $listener
                ->expects($this->at($index))
                ->method('propertyChanged')
                ->with($this->isInstanceOf($class), $this->equalTo($property))
            ;
        }

        return $listener;
    }

    protected function getAcl()
    {
        return new Acl(1, new ObjectIdentity(1, 'foo'), new PermissionGrantingStrategy(), array(), true);
    }
}
PK�b�\_�~��fpear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/ObjectIdentityRetrievalStrategyTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain;

use Symfony\Component\Security\Acl\Domain\ObjectIdentityRetrievalStrategy;

class ObjectIdentityRetrievalStrategyTest extends \PHPUnit_Framework_TestCase
{
    public function testGetObjectIdentityReturnsNullForInvalidDomainObject()
    {
        $strategy = new ObjectIdentityRetrievalStrategy();
        $this->assertNull($strategy->getObjectIdentity('foo'));
    }

    public function testGetObjectIdentity()
    {
        $strategy = new ObjectIdentityRetrievalStrategy();
        $domainObject = new DomainObject();
        $objectIdentity = $strategy->getObjectIdentity($domainObject);

        $this->assertEquals($domainObject->getId(), $objectIdentity->getIdentifier());
        $this->assertEquals(get_class($domainObject), $objectIdentity->getType());
    }
}

class DomainObject
{
    public function getId()
    {
        return 'foo';
    }
}
PK�b�\��HHWpear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/DoctrineAclCacheTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain;

use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
use Symfony\Component\Security\Acl\Domain\PermissionGrantingStrategy;
use Symfony\Component\Security\Acl\Domain\Acl;
use Symfony\Component\Security\Acl\Domain\DoctrineAclCache;
use Doctrine\Common\Cache\ArrayCache;

class DoctrineAclCacheTest extends \PHPUnit_Framework_TestCase
{
    protected $permissionGrantingStrategy;

    /**
     * @expectedException \InvalidArgumentException
     * @dataProvider getEmptyValue
     */
    public function testConstructorDoesNotAcceptEmptyPrefix($empty)
    {
        new DoctrineAclCache(new ArrayCache(), $this->getPermissionGrantingStrategy(), $empty);
    }

    public function getEmptyValue()
    {
        return array(
            array(null),
            array(false),
            array(''),
        );
    }

    public function test()
    {
        $cache = $this->getCache();

        $aclWithParent = $this->getAcl(1);
        $acl = $this->getAcl();

        $cache->putInCache($aclWithParent);
        $cache->putInCache($acl);

        $cachedAcl = $cache->getFromCacheByIdentity($acl->getObjectIdentity());
        $this->assertEquals($acl->getId(), $cachedAcl->getId());
        $this->assertNull($acl->getParentAcl());

        $cachedAclWithParent = $cache->getFromCacheByIdentity($aclWithParent->getObjectIdentity());
        $this->assertEquals($aclWithParent->getId(), $cachedAclWithParent->getId());
        $this->assertNotNull($cachedParentAcl = $cachedAclWithParent->getParentAcl());
        $this->assertEquals($aclWithParent->getParentAcl()->getId(), $cachedParentAcl->getId());
    }

    protected function getAcl($depth = 0)
    {
        static $id = 1;

        $acl = new Acl($id, new ObjectIdentity($id, 'foo'), $this->getPermissionGrantingStrategy(), array(), $depth > 0);

        // insert some ACEs
        $sid = new UserSecurityIdentity('johannes', 'Foo');
        $acl->insertClassAce($sid, 1);
        $acl->insertClassFieldAce('foo', $sid, 1);
        $acl->insertObjectAce($sid, 1);
        $acl->insertObjectFieldAce('foo', $sid, 1);
        $id++;

        if ($depth > 0) {
            $acl->setParentAcl($this->getAcl($depth - 1));
        }

        return $acl;
    }

    protected function getPermissionGrantingStrategy()
    {
        if (null === $this->permissionGrantingStrategy) {
            $this->permissionGrantingStrategy = new PermissionGrantingStrategy();
        }

        return $this->permissionGrantingStrategy;
    }

    protected function getCache($cacheDriver = null, $prefix = DoctrineAclCache::PREFIX)
    {
        if (null === $cacheDriver) {
            $cacheDriver = new ArrayCache();
        }

        return new DoctrineAclCache($cacheDriver, $this->getPermissionGrantingStrategy(), $prefix);
    }
}
PK�b�\F��@�
�
Lpear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/EntryTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain;

use Symfony\Component\Security\Acl\Domain\Entry;

class EntryTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $ace = $this->getAce($acl = $this->getAcl(), $sid = $this->getSid());

        $this->assertEquals(123, $ace->getId());
        $this->assertSame($acl, $ace->getAcl());
        $this->assertSame($sid, $ace->getSecurityIdentity());
        $this->assertEquals('foostrat', $ace->getStrategy());
        $this->assertEquals(123456, $ace->getMask());
        $this->assertTrue($ace->isGranting());
        $this->assertTrue($ace->isAuditSuccess());
        $this->assertFalse($ace->isAuditFailure());
    }

    public function testSetAuditSuccess()
    {
        $ace = $this->getAce();

        $this->assertTrue($ace->isAuditSuccess());
        $ace->setAuditSuccess(false);
        $this->assertFalse($ace->isAuditSuccess());
        $ace->setAuditsuccess(true);
        $this->assertTrue($ace->isAuditSuccess());
    }

    public function testSetAuditFailure()
    {
        $ace = $this->getAce();

        $this->assertFalse($ace->isAuditFailure());
        $ace->setAuditFailure(true);
        $this->assertTrue($ace->isAuditFailure());
        $ace->setAuditFailure(false);
        $this->assertFalse($ace->isAuditFailure());
    }

    public function testSetMask()
    {
        $ace = $this->getAce();

        $this->assertEquals(123456, $ace->getMask());
        $ace->setMask(4321);
        $this->assertEquals(4321, $ace->getMask());
    }

    public function testSetStrategy()
    {
        $ace = $this->getAce();

        $this->assertEquals('foostrat', $ace->getStrategy());
        $ace->setStrategy('foo');
        $this->assertEquals('foo', $ace->getStrategy());
    }

    public function testSerializeUnserialize()
    {
        $ace = $this->getAce();

        $serialized = serialize($ace);
        $uAce = unserialize($serialized);

        $this->assertNull($uAce->getAcl());
        $this->assertInstanceOf('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface', $uAce->getSecurityIdentity());
        $this->assertEquals($ace->getId(), $uAce->getId());
        $this->assertEquals($ace->getMask(), $uAce->getMask());
        $this->assertEquals($ace->getStrategy(), $uAce->getStrategy());
        $this->assertEquals($ace->isGranting(), $uAce->isGranting());
        $this->assertEquals($ace->isAuditSuccess(), $uAce->isAuditSuccess());
        $this->assertEquals($ace->isAuditFailure(), $uAce->isAuditFailure());
    }

    protected function getAce($acl = null, $sid = null)
    {
        if (null === $acl) {
            $acl = $this->getAcl();
        }
        if (null === $sid) {
            $sid = $this->getSid();
        }

        return new Entry(
            123,
            $acl,
            $sid,
            'foostrat',
            123456,
            true,
            false,
            true
        );
    }

    protected function getAcl()
    {
        return $this->getMock('Symfony\Component\Security\Acl\Model\AclInterface');
    }

    protected function getSid()
    {
        return $this->getMock('Symfony\Component\Security\Acl\Model\SecurityIdentityInterface');
    }
}
PK�b�\�am��hpear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/SecurityIdentityRetrievalStrategyTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain;

use Symfony\Component\Security\Acl\Domain\RoleSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
use Symfony\Component\Security\Acl\Domain\SecurityIdentityRetrievalStrategy;

class SecurityIdentityRetrievalStrategyTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getSecurityIdentityRetrievalTests
     */
    public function testGetSecurityIdentities($user, array $roles, $authenticationStatus, array $sids)
    {
        $strategy = $this->getStrategy($roles, $authenticationStatus);

        if ('anonymous' === $authenticationStatus) {
            $token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\AnonymousToken')
                                ->disableOriginalConstructor()
                                ->getMock();
        } else {
            $class = '';
            if (is_string($user)) {
                $class = 'MyCustomTokenImpl';
            }

            $token = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')
                        ->setMockClassName($class)
                        ->getMock();
        }
        $token
            ->expects($this->once())
            ->method('getRoles')
            ->will($this->returnValue(array('foo')))
        ;
        if ('anonymous' === $authenticationStatus) {
            $token
                ->expects($this->never())
                ->method('getUser')
            ;
        } else {
            $token
                ->expects($this->once())
                ->method('getUser')
                ->will($this->returnValue($user))
            ;
        }

        $extractedSids = $strategy->getSecurityIdentities($token);

        foreach ($extractedSids as $index => $extractedSid) {
            if (!isset($sids[$index])) {
                $this->fail(sprintf('Expected SID at index %d, but there was none.', true));
            }

            if (false === $sids[$index]->equals($extractedSid)) {
                $this->fail(sprintf('Index: %d, expected SID "%s", but got "%s".', $index, $sids[$index], $extractedSid));
            }
        }
    }

    public function getSecurityIdentityRetrievalTests()
    {
        return array(
            array($this->getAccount('johannes', 'FooUser'), array('ROLE_USER', 'ROLE_SUPERADMIN'), 'fullFledged', array(
                new UserSecurityIdentity('johannes', 'FooUser'),
                new RoleSecurityIdentity('ROLE_USER'),
                new RoleSecurityIdentity('ROLE_SUPERADMIN'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_FULLY'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_REMEMBERED'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_ANONYMOUSLY'),
            )),
            array('johannes', array('ROLE_FOO'), 'fullFledged', array(
                new UserSecurityIdentity('johannes', 'MyCustomTokenImpl'),
                new RoleSecurityIdentity('ROLE_FOO'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_FULLY'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_REMEMBERED'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_ANONYMOUSLY'),
            )),
            array(new CustomUserImpl('johannes'), array('ROLE_FOO'), 'fullFledged', array(
                new UserSecurityIdentity('johannes', 'Symfony\Component\Security\Acl\Tests\Domain\CustomUserImpl'),
                new RoleSecurityIdentity('ROLE_FOO'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_FULLY'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_REMEMBERED'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_ANONYMOUSLY'),
            )),
            array($this->getAccount('foo', 'FooBarUser'), array('ROLE_FOO'), 'rememberMe', array(
                new UserSecurityIdentity('foo', 'FooBarUser'),
                new RoleSecurityIdentity('ROLE_FOO'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_REMEMBERED'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_ANONYMOUSLY'),
            )),
            array('guest', array('ROLE_FOO'), 'anonymous', array(
                new RoleSecurityIdentity('ROLE_FOO'),
                new RoleSecurityIdentity('IS_AUTHENTICATED_ANONYMOUSLY'),
            ))
        );
    }

    protected function getAccount($username, $class)
    {
        $account = $this->getMock('Symfony\Component\Security\Core\User\UserInterface', array(), array(), $class);
        $account
            ->expects($this->any())
            ->method('getUsername')
            ->will($this->returnValue($username))
        ;

        return $account;
    }

    protected function getStrategy(array $roles = array(), $authenticationStatus = 'fullFledged')
    {
        $roleHierarchy = $this->getMock('Symfony\Component\Security\Core\Role\RoleHierarchyInterface');
        $roleHierarchy
            ->expects($this->once())
            ->method('getReachableRoles')
            ->with($this->equalTo(array('foo')))
            ->will($this->returnValue($roles))
        ;

        $trustResolver = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver', array(), array('', ''));

        $trustResolver
            ->expects($this->at(0))
            ->method('isAnonymous')
            ->will($this->returnValue('anonymous' === $authenticationStatus))
        ;

        if ('fullFledged' === $authenticationStatus) {
            $trustResolver
                ->expects($this->once())
                ->method('isFullFledged')
                ->will($this->returnValue(true))
            ;
            $trustResolver
                ->expects($this->never())
                ->method('isRememberMe')
            ;
        } elseif ('rememberMe' === $authenticationStatus) {
            $trustResolver
                ->expects($this->once())
                ->method('isFullFledged')
                ->will($this->returnValue(false))
            ;
            $trustResolver
                ->expects($this->once())
                ->method('isRememberMe')
                ->will($this->returnValue(true))
            ;
        } else {
            $trustResolver
                ->expects($this->at(1))
                ->method('isAnonymous')
                ->will($this->returnValue(true))
            ;
            $trustResolver
                ->expects($this->once())
                ->method('isFullFledged')
                ->will($this->returnValue(false))
            ;
            $trustResolver
                ->expects($this->once())
                ->method('isRememberMe')
                ->will($this->returnValue(false))
            ;
        }

        return new SecurityIdentityRetrievalStrategy($roleHierarchy, $trustResolver);
    }
}

class CustomUserImpl
{
    protected $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function __toString()
    {
        return $this->name;
    }
}
PK�b�\�ˆ5Rpear/test/Security/Symfony/Component/Security/Acl/Tests/Domain/AuditLoggerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Acl\Tests\Domain;

class AuditLoggerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getTestLogData
     */
    public function testLogIfNeeded($granting, $audit)
    {
        $logger = $this->getLogger();
        $ace = $this->getEntry();

        if (true === $granting) {
            $ace
                ->expects($this->once())
                ->method('isAuditSuccess')
                ->will($this->returnValue($audit))
           ;

           $ace
               ->expects($this->never())
               ->method('isAuditFailure')
           ;
        } else {
            $ace
                ->expects($this->never())
                ->method('isAuditSuccess')
            ;

            $ace
                ->expects($this->once())
                ->method('isAuditFailure')
                ->will($this->returnValue($audit))
            ;
        }

        if (true === $audit) {
            $logger
               ->expects($this->once())
               ->method('doLog')
               ->with($this->equalTo($granting), $this->equalTo($ace))
            ;
        } else {
            $logger
                ->expects($this->never())
                ->method('doLog')
            ;
        }

        $logger->logIfNeeded($granting, $ace);
    }

    public function getTestLogData()
    {
        return array(
            array(true, false),
            array(true, true),
            array(false, false),
            array(false, true),
        );
    }

    protected function getEntry()
    {
        return $this->getMock('Symfony\Component\Security\Acl\Model\AuditableEntryInterface');
    }

    protected function getLogger()
    {
        return $this->getMockForAbstractClass('Symfony\Component\Security\Acl\Domain\AuditLogger');
    }
}
PK�b�\C��)!"!"[pear/test/Security/Symfony/Component/Security/Tests/Http/Firewall/ExceptionListenerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Tests\Http\Firewall;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface;
use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
use Symfony\Component\Security\Http\Firewall\ExceptionListener;
use Symfony\Component\Security\Http\HttpUtils;

class ExceptionListenerTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider getAuthenticationExceptionProvider
     */
    public function testAuthenticationExceptionWithoutEntryPoint(\Exception $exception, \Exception $eventException = null)
    {
        $event = $this->createEvent($exception);

        $listener = $this->createExceptionListener();
        $listener->onKernelException($event);

        $this->assertNull($event->getResponse());
        $this->assertSame(null === $eventException ? $exception : $eventException, $event->getException());
    }

    /**
     * @dataProvider getAuthenticationExceptionProvider
     */
    public function testAuthenticationExceptionWithEntryPoint(\Exception $exception, \Exception $eventException = null)
    {
        $event = $this->createEvent($exception = new AuthenticationException());

        $listener = $this->createExceptionListener(null, null, null, $this->createEntryPoint());
        $listener->onKernelException($event);

        $this->assertEquals('OK', $event->getResponse()->getContent());
        $this->assertSame($exception, $event->getException());
    }

    public function getAuthenticationExceptionProvider()
    {
        return array(
            array(new AuthenticationException()),
            array(new \LogicException('random', 0, $e = new AuthenticationException()), $e),
            array(new \LogicException('random', 0, $e = new AuthenticationException('embed', 0, new AuthenticationException())), $e),
            array(new \LogicException('random', 0, $e = new AuthenticationException('embed', 0, new AccessDeniedException())), $e),
            array(new AuthenticationException('random', 0, new \LogicException())),
        );
    }

    /**
     * @dataProvider getAccessDeniedExceptionProvider
     */
    public function testAccessDeniedExceptionFullFledgedAndWithoutAccessDeniedHandlerAndWithoutErrorPage(\Exception $exception, \Exception $eventException = null)
    {
        $event = $this->createEvent($exception);

        $listener = $this->createExceptionListener(null, $this->createTrustResolver(true));
        $listener->onKernelException($event);

        $this->assertNull($event->getResponse());
        $this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
    }

    /**
     * @dataProvider getAccessDeniedExceptionProvider
     */
    public function testAccessDeniedExceptionFullFledgedAndWithoutAccessDeniedHandlerAndWithErrorPage(\Exception $exception, \Exception $eventException = null)
    {
        $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        $kernel->expects($this->once())->method('handle')->will($this->returnValue(new Response('error')));

        $event = $this->createEvent($exception, $kernel);

        $httpUtils = $this->getMock('Symfony\Component\Security\Http\HttpUtils');
        $httpUtils->expects($this->once())->method('createRequest')->will($this->returnValue(Request::create('/error')));

        $listener = $this->createExceptionListener(null, $this->createTrustResolver(true), $httpUtils, null, '/error');
        $listener->onKernelException($event);

        $this->assertEquals('error', $event->getResponse()->getContent());
        $this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
    }

    /**
     * @dataProvider getAccessDeniedExceptionProvider
     */
    public function testAccessDeniedExceptionFullFledgedAndWithAccessDeniedHandlerAndWithoutErrorPage(\Exception $exception, \Exception $eventException = null)
    {
        $event = $this->createEvent($exception);

        $accessDeniedHandler = $this->getMock('Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface');
        $accessDeniedHandler->expects($this->once())->method('handle')->will($this->returnValue(new Response('error')));

        $listener = $this->createExceptionListener(null, $this->createTrustResolver(true), null, null, null, $accessDeniedHandler);
        $listener->onKernelException($event);

        $this->assertEquals('error', $event->getResponse()->getContent());
        $this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
    }

    /**
     * @dataProvider getAccessDeniedExceptionProvider
     */
    public function testAccessDeniedExceptionNotFullFledged(\Exception $exception, \Exception $eventException = null)
    {
        $event = $this->createEvent($exception);

        $context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
        $context->expects($this->once())->method('getToken')->will($this->returnValue($this->getMock('Symfony\Component\Security\Core\Authentication\Token\TokenInterface')));

        $listener = $this->createExceptionListener($context, $this->createTrustResolver(false), null, $this->createEntryPoint());
        $listener->onKernelException($event);

        $this->assertEquals('OK', $event->getResponse()->getContent());
        $this->assertSame(null === $eventException ? $exception : $eventException, $event->getException()->getPrevious());
    }

    public function getAccessDeniedExceptionProvider()
    {
        return array(
            array(new AccessDeniedException()),
            array(new \LogicException('random', 0, $e = new AccessDeniedException()), $e),
            array(new \LogicException('random', 0, $e = new AccessDeniedException('embed', new AccessDeniedException())), $e),
            array(new \LogicException('random', 0, $e = new AccessDeniedException('embed', new AuthenticationException())), $e),
            array(new AccessDeniedException('random', new \LogicException())),
        );
    }

    private function createEntryPoint()
    {
        $entryPoint = $this->getMock('Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface');
        $entryPoint->expects($this->once())->method('start')->will($this->returnValue(new Response('OK')));

        return $entryPoint;
    }

    private function createTrustResolver($fullFledged)
    {
        $trustResolver = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface');
        $trustResolver->expects($this->once())->method('isFullFledged')->will($this->returnValue($fullFledged));

        return $trustResolver;
    }

    private function createEvent(\Exception $exception, $kernel = null)
    {
        if (null === $kernel) {
            $kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
        }

        return new GetResponseForExceptionEvent($kernel, Request::create('/'), HttpKernelInterface::MASTER_REQUEST, $exception);
    }

    private function createExceptionListener(SecurityContextInterface $context = null, AuthenticationTrustResolverInterface $trustResolver = null, HttpUtils $httpUtils = null, AuthenticationEntryPointInterface $authenticationEntryPoint = null, $errorPage = null, AccessDeniedHandlerInterface $accessDeniedHandler = null)
    {
        return new ExceptionListener(
            $context ? $context : $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface'),
            $trustResolver ? $trustResolver : $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolverInterface'),
            $httpUtils ? $httpUtils : $this->getMock('Symfony\Component\Security\Http\HttpUtils'),
            'key',
            $authenticationEntryPoint,
            $errorPage,
            $accessDeniedHandler
        );
    }
}
PK�b�\����!!Zpear/test/Security/Symfony/Component/Security/Tests/Core/User/InMemoryUserProviderTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Tests\Core\User;

use Symfony\Component\Security\Core\User\InMemoryUserProvider;
use Symfony\Component\Security\Core\User\User;

class InMemoryUserProviderTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $provider = new InMemoryUserProvider(array(
            'fabien' => array(
                'password' => 'foo',
                'enabled'  => false,
                'roles'    => array('ROLE_USER'),
            ),
        ));

        $user = $provider->loadUserByUsername('fabien');
        $this->assertEquals('foo', $user->getPassword());
        $this->assertEquals(array('ROLE_USER'), $user->getRoles());
        $this->assertFalse($user->isEnabled());
    }

    public function testCreateUser()
    {
        $provider = new InMemoryUserProvider();
        $provider->createUser(new User('fabien', 'foo'));

        $user = $provider->loadUserByUsername('fabien');
        $this->assertEquals('foo', $user->getPassword());
    }

    /**
     * @expectedException \LogicException
     */
    public function testCreateUserAlreadyExist()
    {
        $provider = new InMemoryUserProvider();
        $provider->createUser(new User('fabien', 'foo'));
        $provider->createUser(new User('fabien', 'foo'));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\UsernameNotFoundException
     */
    public function testLoadUserByUsernameDoesNotExist()
    {
        $provider = new InMemoryUserProvider();
        $provider->loadUserByUsername('fabien');
    }
}
PK�b�\s�f�[[Qpear/test/Security/Symfony/Component/Security/Tests/Core/User/UserCheckerTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Tests\Core\User;

use Symfony\Component\Security\Core\User\UserChecker;

class UserCheckerTest extends \PHPUnit_Framework_TestCase
{
    public function testCheckPostAuthNotAdvancedUserInterface()
    {
        $checker = new UserChecker();

        $this->assertNull($checker->checkPostAuth($this->getMock('Symfony\Component\Security\Core\User\UserInterface')));
    }

    public function testCheckPostAuthPass()
    {
        $checker = new UserChecker();

        $account = $this->getMock('Symfony\Component\Security\Core\User\AdvancedUserInterface');
        $account->expects($this->once())->method('isCredentialsNonExpired')->will($this->returnValue(true));

        $this->assertNull($checker->checkPostAuth($account));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\CredentialsExpiredException
     */
    public function testCheckPostAuthCredentialsExpired()
    {
        $checker = new UserChecker();

        $account = $this->getMock('Symfony\Component\Security\Core\User\AdvancedUserInterface');
        $account->expects($this->once())->method('isCredentialsNonExpired')->will($this->returnValue(false));

        $checker->checkPostAuth($account);
    }

    public function testCheckPreAuthNotAdvancedUserInterface()
    {
        $checker = new UserChecker();

        $this->assertNull($checker->checkPreAuth($this->getMock('Symfony\Component\Security\Core\User\UserInterface')));
    }

    public function testCheckPreAuthPass()
    {
        $checker = new UserChecker();

        $account = $this->getMock('Symfony\Component\Security\Core\User\AdvancedUserInterface');
        $account->expects($this->once())->method('isAccountNonLocked')->will($this->returnValue(true));
        $account->expects($this->once())->method('isEnabled')->will($this->returnValue(true));
        $account->expects($this->once())->method('isAccountNonExpired')->will($this->returnValue(true));

        $this->assertNull($checker->checkPreAuth($account));
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\LockedException
     */
    public function testCheckPreAuthAccountLocked()
    {
        $checker = new UserChecker();

        $account = $this->getMock('Symfony\Component\Security\Core\User\AdvancedUserInterface');
        $account->expects($this->once())->method('isAccountNonLocked')->will($this->returnValue(false));

        $checker->checkPreAuth($account);
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\DisabledException
     */
    public function testCheckPreAuthDisabled()
    {
        $checker = new UserChecker();

        $account = $this->getMock('Symfony\Component\Security\Core\User\AdvancedUserInterface');
        $account->expects($this->once())->method('isAccountNonLocked')->will($this->returnValue(true));
        $account->expects($this->once())->method('isEnabled')->will($this->returnValue(false));

        $checker->checkPreAuth($account);
    }

    /**
     * @expectedException \Symfony\Component\Security\Core\Exception\AccountExpiredException
     */
    public function testCheckPreAuthAccountExpired()
    {
        $checker = new UserChecker();

        $account = $this->getMock('Symfony\Component\Security\Core\User\AdvancedUserInterface');
        $account->expects($this->once())->method('isAccountNonLocked')->will($this->returnValue(true));
        $account->expects($this->once())->method('isEnabled')->will($this->returnValue(true));
        $account->expects($this->once())->method('isAccountNonExpired')->will($this->returnValue(false));

        $checker->checkPreAuth($account);
    }
}
PK�b�\2�nBBepear/test/Security/Symfony/Component/Security/Tests/Core/Authentication/Token/RememberMeTokenTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Security\Tests\Core\Authentication\Token;

use Symfony\Component\Security\Core\Authentication\Token\RememberMeToken;
use Symfony\Component\Security\Core\Role\Role;

class RememberMeTokenTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $user = $this->getUser();
        $token = new RememberMeToken($user, 'fookey', 'foo');

        $this->assertEquals('fookey', $token->getProviderKey());
        $this->assertEquals('foo', $token->getKey());
        $this->assertEquals(array(new Role('ROLE_FOO')), $token->getRoles());
        $this->assertSame($user, $token->getUser());
        $this->assertTrue($token->isAuthenticated());
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testConstructorKeyCannotBeNull()
    {
        new RememberMeToken(
            $this->getUser(),
            null,
            null
        );
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testConstructorKeyCannotBeEmptyString()
    {
        new RememberMeToken(
            $this->getUser(),
            '',
            ''
        );
    }

    /**
     * @expectedException \PHPUnit_Framework_Error
     * @dataProvider getUserArguments
     */
    public function testConstructorUserCannotBeNull($user)
    {
        new RememberMeToken($user, 'foo', 'foo');
    }

    public function getUserArguments()
    {
        return array(
            array(null),
            array('foo'),
        );
    }

    protected function getUser($roles = array('ROLE_FOO'))
    {
        $user = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
        $user
            ->expects($this->once())
            ->method('getRoles')
            ->will($this->returnValue($roles))
        ;

        return $user;
    }
}
PK�b�\?7��EE>pear/test/Net_IDNA2/tests/draft-josefsson-idn-test-vectors.phpnu�[���<?php
require_once 'Net/IDNA2.php';

// Test cases from https://www.gnu.org/software/libidn/draft-josefsson-idn-test-vectors.html

define('IDNA_ACE_PREFIX', 'xn--');

class IDNATest extends PHPUnit_Framework_TestCase {

    public function setUp() {
        $this->idn = new Net_IDNA2();
    }

    static function unichr($chr) {
        return mb_convert_encoding('&#' . intval($chr) . ';', 'UTF-8', 'HTML-ENTITIES');
    }

    private function hexarray2string($arr) {
        return implode('', array_map(array('self', 'unichr'), $arr));
    }

    public function testDecode1() {
        // Arabic (Egyptian)
        $expected = $this->hexarray2string(array(
            0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643,
	        0x0644, 0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A,
	        0x061F
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."egbpdaj6bu4bxfgehfvwxn");
        $this->assertSame($expected, $result);
    }

    public function testDecode2() {
        // Chinese (simplified)
        $expected = $this->hexarray2string(array(
            0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D, 0x6587
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."ihqwcrb4cv8a8dqg056pqjye");
        $this->assertSame($expected, $result);
    }

    public function testDecode3() {
        // Chinese (traditional)
        $expected = $this->hexarray2string(array(
            0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D, 0x6587
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."ihqwctvzc91f659drss3x8bo0yb");
        $this->assertSame($expected, $result);
    }

    public function testDecode4() {
        // Czech
        $expected = $this->hexarray2string(array(
            0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073,
	        0x0074, 0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076,
	        0x00ED, 0x010D, 0x0065, 0x0073, 0x006B, 0x0079
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."Proprostnemluvesky-uyb24dma41a");
        $this->assertSame($expected, $result);
    }

    public function testDecode5() {
        // Hebrew
        $expected = $this->hexarray2string(array(
            0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5,
	        0x05D8, 0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9,
	        0x05DD, 0x05E2, 0x05D1, 0x05E8, 0x05D9, 0x05EA
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."4dbcagdahymbxekheh6e0a7fei0b");
        $this->assertSame($expected, $result);
    }

      public function testDecode6() {
        // Hindi (Devanagari)
        $expected = $this->hexarray2string(array(
            0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928,
        	0x094D, 0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902,
	        0x0928, 0x0939, 0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938,
	        0x0915, 0x0924, 0x0947, 0x0939, 0x0948, 0x0902
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd");
        $this->assertSame($expected, $result);
    }

    public function testDecode7() {
        // Japanese (kanji and hiragana)
        $expected = $this->hexarray2string(array(
            0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E,
        	0x3092, 0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044,
        	0x306E, 0x304B
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa");
        $this->assertSame($expected, $result);
    }

    public function testDecode8() {
        // Russian (Cyrillic)
        $expected = $this->hexarray2string(array(
            0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435,
        	0x043E, 0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432,
        	0x043E, 0x0440, 0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443,
        	0x0441, 0x0441, 0x043A, 0x0438
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."b1abfaaepdrnnbgefbadotcwatmq2g4l");
        $this->assertSame($expected, $result);
    }

    public function testDecode9() {
        // Spanish
        $expected = $this->hexarray2string(array(
            0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F,
        	0x0070, 0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069,
        	0x006D, 0x0070, 0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074,
        	0x0065, 0x0068, 0x0061, 0x0062, 0x006C, 0x0061, 0x0072, 0x0065,
        	0x006E, 0x0045, 0x0073, 0x0070, 0x0061, 0x00F1, 0x006F, 0x006C
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."PorqunopuedensimplementehablarenEspaol-fmd56a");
        $this->assertSame($expected, $result);
    }

    public function testDecode10() {
        // Vietnamese
        $expected = $this->hexarray2string(array(
            0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD,
        	0x006B, 0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3,
        	0x0063, 0x0068, 0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069,
        	0x1EBF, 0x006E, 0x0067, 0x0056, 0x0069, 0x1EC7, 0x0074
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g");
        $this->assertSame($expected, $result);
    }

    public function testDecode11() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."3B-ww4c5e180e575a65lsy2b");
        $this->assertSame($expected, $result);
    }

    public function testDecode12() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069,
        	0x0074, 0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052,
        	0x002D, 0x004D, 0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n");
        $this->assertSame($expected, $result);
    }

    public function testDecode13() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E,
	        0x006F, 0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061,
        	0x0079, 0x002D, 0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834,
        	0x6240
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."Hello-Another-Way--fc4qua05auwb3674vfr0b");
        $this->assertSame($expected, $result);
    }

    public function testDecode14() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."2-u9tlzr9756bt3uc0v");
        $this->assertSame($expected, $result);
    }

    public function testDecode15() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069,
        	0x3059, 0x308B, 0x0035, 0x79D2, 0x524D
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."MajiKoi5-783gue6qz075azm5e");
        $this->assertSame($expected, $result);
    }

    public function testDecode16() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."de-jg4avhby1noc0d");
        $this->assertSame($expected, $result);
    }

    public function testDecode17() {
        // Japanese
        $expected = $this->hexarray2string(array(
            0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."d9juau41awczczp");
        $this->assertSame($expected, $result);
    }

    public function testDecode18() {
        // Greek
        $expected = $this->hexarray2string(array(
            0x03b5, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, 0x03ac
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."hxargifdar");
        $this->assertSame($expected, $result);
    }

    public function testDecode19() {
        // Maltese (Malti)
        $expected = $this->hexarray2string(array(
            0x0062, 0x006f, 0x006e, 0x0121, 0x0075, 0x0073, 0x0061, 0x0127,
            0x0127, 0x0061
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."bonusaa-5bb1da");
        $this->assertSame($expected, $result);
    }

    public function testDecode20() {
        // Russian (Cyrillic)
        $expected = $this->hexarray2string(array(
            0x043f, 0x043e, 0x0447, 0x0435, 0x043c, 0x0443, 0x0436, 0x0435,
            0x043e, 0x043d, 0x0438, 0x043d, 0x0435, 0x0433, 0x043e, 0x0432,
            0x043e, 0x0440, 0x044f, 0x0442, 0x043f, 0x043e, 0x0440, 0x0443,
            0x0441, 0x0441, 0x043a, 0x0438
	    ));
        $result = $this->idn->decode(IDNA_ACE_PREFIX."b1abfaaepdrnnbgefbadotcwatmq2g4l");
        $this->assertSame($expected, $result);
    }

    public function testEncode1() {
        // Arabic (Egyptian)
        $idna = $this->hexarray2string(array(
            0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643,
	        0x0644, 0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A,
	        0x061F
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."egbpdaj6bu4bxfgehfvwxn", $result);
    }

    public function testEncode2() {
        // Chinese (simplified)
        $idna = $this->hexarray2string(array(
            0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D, 0x6587
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."ihqwcrb4cv8a8dqg056pqjye", $result);
    }

    public function testEncode3() {
        // Chinese (traditional)
        $idna = $this->hexarray2string(array(
            0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D, 0x6587
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."ihqwctvzc91f659drss3x8bo0yb", $result);
    }

    public function testEncode4() {
        // Czech
        $idna = $this->hexarray2string(array(
            0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073,
	        0x0074, 0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076,
	        0x00ED, 0x010D, 0x0065, 0x0073, 0x006B, 0x0079
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."proprostnemluvesky-uyb24dma41a", $result);
    }

    public function testEncode5() {
        // Hebrew
        $idna = $this->hexarray2string(array(
            0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5,
	        0x05D8, 0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9,
	        0x05DD, 0x05E2, 0x05D1, 0x05E8, 0x05D9, 0x05EA
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."4dbcagdahymbxekheh6e0a7fei0b", $result);
    }

      public function testEncode6() {
        // Hindi (Devanagari)
        $idna = $this->hexarray2string(array(
            0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928,
        	0x094D, 0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902,
	        0x0928, 0x0939, 0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938,
	        0x0915, 0x0924, 0x0947, 0x0939, 0x0948, 0x0902
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", $result);
    }

    public function testEncode7() {
        // Japanese (kanji and hiragana)
        $idna = $this->hexarray2string(array(
            0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E,
        	0x3092, 0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044,
        	0x306E, 0x304B
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", $result);
    }

    public function testEncode8() {
        // Russian (Cyrillic)
        $idna = $this->hexarray2string(array(
            0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435,
        	0x043E, 0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432,
        	0x043E, 0x0440, 0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443,
        	0x0441, 0x0441, 0x043A, 0x0438
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."b1abfaaepdrnnbgefbadotcwatmq2g4l", $result);
    }

    public function testEncode9() {
        // Spanish
        $idna = $this->hexarray2string(array(
            0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F,
        	0x0070, 0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069,
        	0x006D, 0x0070, 0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074,
        	0x0065, 0x0068, 0x0061, 0x0062, 0x006C, 0x0061, 0x0072, 0x0065,
        	0x006E, 0x0045, 0x0073, 0x0070, 0x0061, 0x00F1, 0x006F, 0x006C
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."porqunopuedensimplementehablarenespaol-fmd56a", $result);
    }

    public function testEncode10() {
        // Vietnamese
        $idna = $this->hexarray2string(array(
            0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD,
        	0x006B, 0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3,
        	0x0063, 0x0068, 0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069,
        	0x1EBF, 0x006E, 0x0067, 0x0056, 0x0069, 0x1EC7, 0x0074
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."tisaohkhngthchnitingvit-kjcr8268qyxafd2f1b9g", $result);
    }

    public function testEncode11() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."3b-ww4c5e180e575a65lsy2b", $result);
    }

    public function testEncode12() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069,
        	0x0074, 0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052,
        	0x002D, 0x004D, 0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."-with-super-monkeys-pc58ag80a8qai00g7n9n", $result);
    }

    public function testEncode13() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E,
	        0x006F, 0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061,
        	0x0079, 0x002D, 0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834,
        	0x6240
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."hello-another-way--fc4qua05auwb3674vfr0b", $result);
    }

    public function testEncode14() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."2-u9tlzr9756bt3uc0v", $result);
    }

    public function testEncode15() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069,
        	0x3059, 0x308B, 0x0035, 0x79D2, 0x524D
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."majikoi5-783gue6qz075azm5e", $result);
    }

    public function testEncode16() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."de-jg4avhby1noc0d", $result);
    }

    public function testEncode17() {
        // Japanese
        $idna = $this->hexarray2string(array(
            0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."d9juau41awczczp", $result);
    }

    public function testEncode18() {
        // Greek
        $idna = $this->hexarray2string(array(
            0x03b5, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, 0x03ac
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."hxargifdar", $result);
    }

    public function testEncode19() {
        // Maltese (Malti)
        $idna = $this->hexarray2string(array(
            0x0062, 0x006f, 0x006e, 0x0121, 0x0075, 0x0073, 0x0061, 0x0127,
            0x0127, 0x0061
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."bonusaa-5bb1da", $result);
    }

    public function testEncode20() {
        // Russian (Cyrillic)
        $idna = $this->hexarray2string(array(
            0x043f, 0x043e, 0x0447, 0x0435, 0x043c, 0x0443, 0x0436, 0x0435,
            0x043e, 0x043d, 0x0438, 0x043d, 0x0435, 0x0433, 0x043e, 0x0432,
            0x043e, 0x0440, 0x044f, 0x0442, 0x043f, 0x043e, 0x0440, 0x0443,
            0x0441, 0x0441, 0x043a, 0x0438
	    ));
        $result = $this->idn->encode($idna);
        $this->assertSame(IDNA_ACE_PREFIX."b1abfaaepdrnnbgefbadotcwatmq2g4l", $result);
    }

}

PK�b�\E��mm+pear/test/Net_IDNA2/tests/Net_IDNA2Test.phpnu�[���<?php
require_once 'Net/IDNA2.php';

class Net_IDNA2Test extends PHPUnit_Framework_TestCase
{
    /**
     * Initialise tests
     *
     * @return void
     */
    public function setUp()
    {
        $this->idn = new Net_IDNA2();
    }

    /**
     * Test if a complete URL consisting also of port-number etc. will be decoded just fine, test 1
     *
     * @return void
     */
    public function testShouldDecodePortNumbersFragmentsAndUrisCorrectly1()
    {
        $result = $this->idn->decode('http://www.xn--ml-6kctd8d6a.org:8080/test.php?arg1=1&arg2=2#fragment');
        $this->assertSame("http://www.\xD0\xB5\xD1\x85\xD0\xB0m\xD1\x80l\xD0\xB5.org:8080/test.php?arg1=1&arg2=2#fragment", $result);
    }

    /**
     * Test if a complete URL consisting also of port-number etc. will be decoded just fine, test 2
     *
     * @return void
     */
    public function testShouldDecodePortNumbersFragmentsAndUrisCorrectly2()
    {
        $result = $this->idn->decode('http://xn--tst-qla.example.com:8080/test.php?arg1=1&arg2=2#fragment');
        $this->assertSame("http://täst.example.com:8080/test.php?arg1=1&arg2=2#fragment", $result);
    }

    /**
     * Test encoding of German letter Eszett according to the original standard (IDNA2003)
     *
     * @return void
     */
    public function testEncodingForGermanEszettUsingIDNA2003()
    {
        // make sure to use 2003-encoding
        $this->idn->setParams('version', '2003');
        $result = $this->idn->encode('http://www.straße.example.com/');

        $this->assertSame("http://www.strasse.example.com/", $result);
    }

    /**
     * Test encoding of German letter Eszett according to the "new" standard (IDNA2005/IDNAbis)
     *
     * @return void
     */
    public function testEncodingForGermanEszettUsingIDNA2008()
    {
        // make sure to use 2008-encoding
        $this->idn->setParams('version', '2008');
        $result = $this->idn->encode('http://www.straße.example.com/');
        // switch back for other testcases
        $this->idn->setParams('version', '2003');

        $this->assertSame("http://www.xn--strae-oqa.example.com/", $result);
    }
}
PK�b�\�߁Q��'pear/test/Net_SMTP/tests/quotedata.phptnu�[���--TEST--
Net_SMTP: quotedata()
--FILE--
<?php

require_once 'Net/SMTP.php';

$tests = array(
    /* Newlines */
    "\n"               => "\r\n",
    "\r\n"             => "\r\n",
    "\nxx"             => "\r\nxx",
    "xx\n"             => "xx\r\n",
    "xx\nxx"           => "xx\r\nxx",
    "\n\nxx"           => "\r\n\r\nxx",
    "xx\n\nxx"         => "xx\r\n\r\nxx",
    "xx\n\n"           => "xx\r\n\r\n",
    "\r\nxx"           => "\r\nxx",
    "xx\r\n"           => "xx\r\n",
    "xx\r\nxx"         => "xx\r\nxx",
    "\r\n\r\nxx"       => "\r\n\r\nxx",
    "xx\r\n\r\nxx"     => "xx\r\n\r\nxx",
    "xx\r\n\r\n"       => "xx\r\n\r\n",
    "\r\n\nxx"         => "\r\n\r\nxx",
    "\n\r\nxx"         => "\r\n\r\nxx",
    "xx\r\n\nxx"       => "xx\r\n\r\nxx",
    "xx\n\r\nxx"       => "xx\r\n\r\nxx",
    "xx\r\n\n"         => "xx\r\n\r\n",
    "xx\n\r\n"         => "xx\r\n\r\n",
    "\r"               => "\r\n",
    "\rxx"             => "\r\nxx",
    "xx\rxx"           => "xx\r\nxx",
    "xx\r"             => "xx\r\n",
    "\r\r"             => "\r\n\r\n",
    "\r\rxx"           => "\r\n\r\nxx",
    "xx\r\rxx"         => "xx\r\n\r\nxx",
    "xx\r\r"           => "xx\r\n\r\n",
    "xx\rxx\nxx\r\nxx" => "xx\r\nxx\r\nxx\r\nxx",
    "\r\r\n\n"         => "\r\n\r\n\r\n",

    /* Dots */
    "."                 => "..",
    "xxx\n."            => "xxx\r\n..",
    "xxx\n.\nxxx"       => "xxx\r\n..\r\nxxx",
    "xxx.\n.xxx"        => "xxx.\r\n..xxx",
);

function literal($x)
{
    return str_replace(array("\r", "\n"), array('\r', '\n'), $x);
}

$smtp = new Net_SMTP();
$error = false;
foreach ($tests as $input => $expected) {
    $output = $input;
    $smtp->quotedata($output);
    if ($output != $expected) {
        printf("Error: '%s' => '%s' (expected: '%s')",
            literal($input), literal($output), literal($expected));
        $error = true;
    }
}

if (!$error) {
    echo "success\n";
}

--EXPECT--
success
PK�b�\<ȸB!!"pear/test/Net_SMTP/tests/auth.phptnu�[���--TEST--
Net_SMTP: SMTP Authentication
--SKIPIF--
<?php if (!@include('config.php')) die("skip\n");
--FILE--
<?php

require_once 'Net/SMTP.php';
require_once 'config.php';

if (! ($smtp = new Net_SMTP(TEST_HOSTNAME, TEST_PORT, TEST_LOCALHOST))) {
	die("Unable to instantiate Net_SMTP object\n");
}

if (PEAR::isError($e = $smtp->connect())) {
	die($e->getMessage() . "\n");
}

if (PEAR::isError($e = $smtp->auth(TEST_AUTH_USER, TEST_AUTH_PASS))) {
	die("Authentication failure\n");
}

$smtp->disconnect();

echo 'Success!';

--EXPECT--
Success!
PK�b�\�6����(pear/test/Net_SMTP/tests/config.php.distnu�[���<?php
/**
 * Copy this file to config.php and customize the following values to
 * suit your configuration.
 */

define('TEST_HOSTNAME',     'localhost');
define('TEST_PORT',         25);
define('TEST_LOCALHOST',    'localhost');
define('TEST_AUTH_USER',    'jon');
define('TEST_AUTH_PASS',    'secret');
define('TEST_FROM',         'from@example.com');
define('TEST_TO',           'to@example.com');
define('TEST_SUBJECT',      'Test Subject');
define('TEST_BODY',         'Test Body');
PK�b�\�*�W��#pear/test/Net_SMTP/tests/basic.phptnu�[���--TEST--
Net_SMTP: Basic Functionality
--SKIPIF--
<?php if (!@include('config.php')) die("skip\n");
--FILE--
<?php

require_once 'Net/SMTP.php';
require_once 'config.php';

if (! ($smtp = new Net_SMTP(TEST_HOSTNAME, TEST_PORT, TEST_LOCALHOST))) {
    die("Unable to instantiate Net_SMTP object\n");
}

if (PEAR::isError($e = $smtp->connect())) {
    die($e->getMessage() . "\n");
}

if (PEAR::isError($e = $smtp->auth(TEST_AUTH_USER, TEST_AUTH_PASS))) {
    die("Authentication failure\n");
}

if (PEAR::isError($smtp->mailFrom(TEST_FROM))) {
    die('Unable to set sender to <' . TEST_FROM . ">\n");
}

if (PEAR::isError($res = $smtp->rcptTo(TEST_TO))) {
    die('Unable to add recipient <' . TEST_TO . '>: ' .
        $res->getMessage() . "\n");
}

$headers = 'Subject: ' . TEST_SUBJECT;
if (PEAR::isError($smtp->data(TEST_BODY, $headers))) {
    die("Unable to send data\n");
}

$smtp->disconnect();

echo 'Success!';

--EXPECT--
Success!
PK�b�\?�UHii<pear/test/Console/Symfony/Component/Console/phpunit.xml.distnu�[���<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="vendor/autoload.php"
>
    <testsuites>
        <testsuite name="Symfony Console Component Test Suite">
            <directory>./Tests/</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory>./</directory>
            <exclude>
                <directory>./Resources</directory>
                <directory>./Tests</directory>
                <directory>./vendor</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>
PK�b�\�r�HwwXpear/test/Console/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tests\Formatter;

use Symfony\Component\Console\Formatter\OutputFormatterStyle;

class OutputFormatterStyleTest extends \PHPUnit_Framework_TestCase
{
    public function testConstructor()
    {
        $style = new OutputFormatterStyle('green', 'black', array('bold', 'underscore'));
        $this->assertEquals("\033[32;40;1;4mfoo\033[0m", $style->apply('foo'));

        $style = new OutputFormatterStyle('red', null, array('blink'));
        $this->assertEquals("\033[31;5mfoo\033[0m", $style->apply('foo'));

        $style = new OutputFormatterStyle(null, 'white');
        $this->assertEquals("\033[47mfoo\033[0m", $style->apply('foo'));
    }

    public function testForeground()
    {
        $style = new OutputFormatterStyle();

        $style->setForeground('black');
        $this->assertEquals("\033[30mfoo\033[0m", $style->apply('foo'));

        $style->setForeground('blue');
        $this->assertEquals("\033[34mfoo\033[0m", $style->apply('foo'));

        $this->setExpectedException('InvalidArgumentException');
        $style->setForeground('undefined-color');
    }

    public function testBackground()
    {
        $style = new OutputFormatterStyle();

        $style->setBackground('black');
        $this->assertEquals("\033[40mfoo\033[0m", $style->apply('foo'));

        $style->setBackground('yellow');
        $this->assertEquals("\033[43mfoo\033[0m", $style->apply('foo'));

        $this->setExpectedException('InvalidArgumentException');
        $style->setBackground('undefined-color');
    }

    public function testOptions()
    {
        $style = new OutputFormatterStyle();

        $style->setOptions(array('reverse', 'conceal'));
        $this->assertEquals("\033[7;8mfoo\033[0m", $style->apply('foo'));

        $style->setOption('bold');
        $this->assertEquals("\033[7;8;1mfoo\033[0m", $style->apply('foo'));

        $style->unsetOption('reverse');
        $this->assertEquals("\033[8;1mfoo\033[0m", $style->apply('foo'));

        $style->setOption('bold');
        $this->assertEquals("\033[8;1mfoo\033[0m", $style->apply('foo'));

        $style->setOptions(array('bold'));
        $this->assertEquals("\033[1mfoo\033[0m", $style->apply('foo'));

        try {
            $style->setOption('foo');
            $this->fail('->setOption() throws an \InvalidArgumentException when the option does not exist in the available options');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->setOption() throws an \InvalidArgumentException when the option does not exist in the available options');
            $this->assertContains('Invalid option specified: "foo"', $e->getMessage(), '->setOption() throws an \InvalidArgumentException when the option does not exist in the available options');
        }

        try {
            $style->unsetOption('foo');
            $this->fail('->unsetOption() throws an \InvalidArgumentException when the option does not exist in the available options');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->unsetOption() throws an \InvalidArgumentException when the option does not exist in the available options');
            $this->assertContains('Invalid option specified: "foo"', $e->getMessage(), '->unsetOption() throws an \InvalidArgumentException when the option does not exist in the available options');
        }
    }
}
PK�b�\� R�ww]pear/test/Console/Symfony/Component/Console/Tests/Formatter/OutputFormatterStyleStackTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tests\Formatter;

use Symfony\Component\Console\Formatter\OutputFormatterStyleStack;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;

class OutputFormatterStyleStackTest extends \PHPUnit_Framework_TestCase
{
    public function testPush()
    {
        $stack = new OutputFormatterStyleStack();
        $stack->push($s1 = new OutputFormatterStyle('white', 'black'));
        $stack->push($s2 = new OutputFormatterStyle('yellow', 'blue'));

        $this->assertEquals($s2, $stack->getCurrent());

        $stack->push($s3 = new OutputFormatterStyle('green', 'red'));

        $this->assertEquals($s3, $stack->getCurrent());
    }

    public function testPop()
    {
        $stack = new OutputFormatterStyleStack();
        $stack->push($s1 = new OutputFormatterStyle('white', 'black'));
        $stack->push($s2 = new OutputFormatterStyle('yellow', 'blue'));

        $this->assertEquals($s2, $stack->pop());
        $this->assertEquals($s1, $stack->pop());
    }

    public function testPopEmpty()
    {
        $stack = new OutputFormatterStyleStack();
        $style = new OutputFormatterStyle();

        $this->assertEquals($style, $stack->pop());
    }

    public function testPopNotLast()
    {
        $stack = new OutputFormatterStyleStack();
        $stack->push($s1 = new OutputFormatterStyle('white', 'black'));
        $stack->push($s2 = new OutputFormatterStyle('yellow', 'blue'));
        $stack->push($s3 = new OutputFormatterStyle('green', 'red'));

        $this->assertEquals($s2, $stack->pop($s2));
        $this->assertEquals($s1, $stack->pop());
    }

    /**
     * @expectedException \InvalidArgumentException
     */
    public function testInvalidPop()
    {
        $stack = new OutputFormatterStyleStack();
        $stack->push(new OutputFormatterStyle('white', 'black'));
        $stack->pop(new OutputFormatterStyle('yellow', 'blue'));
    }
}
PK�b�\]6\���Spear/test/Console/Symfony/Component/Console/Tests/Formatter/OutputFormatterTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tests\Formatter;

use Symfony\Component\Console\Formatter\OutputFormatter;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;

class OutputFormatterTest extends \PHPUnit_Framework_TestCase
{
    public function testEmptyTag()
    {
        $formatter = new OutputFormatter(true);
        $this->assertEquals("foo<>bar", $formatter->format('foo<>bar'));
    }

    public function testLGCharEscaping()
    {
        $formatter = new OutputFormatter(true);

        $this->assertEquals("foo<bar", $formatter->format('foo\\<bar'));
        $this->assertEquals("<info>some info</info>", $formatter->format('\\<info>some info\\</info>'));
        $this->assertEquals("\\<info>some info\\</info>", OutputFormatter::escape('<info>some info</info>'));

        $this->assertEquals(
            "\033[33mSymfony\\Component\\Console does work very well!\033[0m",
            $formatter->format('<comment>Symfony\Component\Console does work very well!</comment>')
        );
    }

    public function testBundledStyles()
    {
        $formatter = new OutputFormatter(true);

        $this->assertTrue($formatter->hasStyle('error'));
        $this->assertTrue($formatter->hasStyle('info'));
        $this->assertTrue($formatter->hasStyle('comment'));
        $this->assertTrue($formatter->hasStyle('question'));

        $this->assertEquals(
            "\033[37;41msome error\033[0m",
            $formatter->format('<error>some error</error>')
        );
        $this->assertEquals(
            "\033[32msome info\033[0m",
            $formatter->format('<info>some info</info>')
        );
        $this->assertEquals(
            "\033[33msome comment\033[0m",
            $formatter->format('<comment>some comment</comment>')
        );
        $this->assertEquals(
            "\033[30;46msome question\033[0m",
            $formatter->format('<question>some question</question>')
        );
    }

    public function testNestedStyles()
    {
        $formatter = new OutputFormatter(true);

        $this->assertEquals(
            "\033[37;41msome \033[0m\033[32msome info\033[0m\033[37;41m error\033[0m",
            $formatter->format('<error>some <info>some info</info> error</error>')
        );
    }

    public function testAdjacentStyles()
    {
        $formatter = new OutputFormatter(true);

        $this->assertEquals(
            "\033[37;41msome error\033[0m\033[32msome info\033[0m",
            $formatter->format('<error>some error</error><info>some info</info>')
        );
    }

    public function testStyleMatchingNotGreedy()
    {
        $formatter = new OutputFormatter(true);

        $this->assertEquals(
            "(\033[32m>=2.0,<2.3\033[0m)",
            $formatter->format('(<info>>=2.0,<2.3</info>)')
        );
    }

    public function testStyleEscaping()
    {
        $formatter = new OutputFormatter(true);

        $this->assertEquals(
            "(\033[32mz>=2.0,<a2.3\033[0m)",
            $formatter->format('(<info>'.$formatter->escape('z>=2.0,<a2.3').'</info>)')
        );
    }

    public function testDeepNestedStyles()
    {
        $formatter = new OutputFormatter(true);

        $this->assertEquals(
            "\033[37;41merror\033[0m\033[32minfo\033[0m\033[33mcomment\033[0m\033[37;41merror\033[0m",
            $formatter->format('<error>error<info>info<comment>comment</info>error</error>')
        );
    }

    public function testNewStyle()
    {
        $formatter = new OutputFormatter(true);

        $style = new OutputFormatterStyle('blue', 'white');
        $formatter->setStyle('test', $style);

        $this->assertEquals($style, $formatter->getStyle('test'));
        $this->assertNotEquals($style, $formatter->getStyle('info'));

        $style = new OutputFormatterStyle('blue', 'white');
        $formatter->setStyle('b', $style);

        $this->assertEquals("\033[34;47msome \033[0m\033[34;47mcustom\033[0m\033[34;47m msg\033[0m", $formatter->format('<test>some <b>custom</b> msg</test>'));
    }

    public function testRedefineStyle()
    {
        $formatter = new OutputFormatter(true);

        $style = new OutputFormatterStyle('blue', 'white');
        $formatter->setStyle('info', $style);

        $this->assertEquals("\033[34;47msome custom msg\033[0m", $formatter->format('<info>some custom msg</info>'));
    }

    public function testInlineStyle()
    {
        $formatter = new OutputFormatter(true);

        $this->assertEquals("\033[34;41msome text\033[0m", $formatter->format('<fg=blue;bg=red>some text</>'));
        $this->assertEquals("\033[34;41msome text\033[0m", $formatter->format('<fg=blue;bg=red>some text</fg=blue;bg=red>'));
    }

    public function testNonStyleTag()
    {
        $formatter = new OutputFormatter(true);

        $this->assertEquals("\033[32msome \033[0m\033[32m<tag>\033[0m\033[32m styled \033[0m\033[32m<p>\033[0m\033[32msingle-char tag\033[0m\033[32m</p>\033[0m", $formatter->format('<info>some <tag> styled <p>single-char tag</p></info>'));
    }

    public function testFormatLongString()
    {
        $formatter = new OutputFormatter(true);
        $long = str_repeat("\\", 14000);
        $this->assertEquals("\033[37;41msome error\033[0m".$long, $formatter->format('<error>some error</error>'.$long));
    }

    public function testNotDecoratedFormatter()
    {
        $formatter = new OutputFormatter(false);

        $this->assertTrue($formatter->hasStyle('error'));
        $this->assertTrue($formatter->hasStyle('info'));
        $this->assertTrue($formatter->hasStyle('comment'));
        $this->assertTrue($formatter->hasStyle('question'));

        $this->assertEquals(
            "some error", $formatter->format('<error>some error</error>')
        );
        $this->assertEquals(
            "some info", $formatter->format('<info>some info</info>')
        );
        $this->assertEquals(
            "some comment", $formatter->format('<comment>some comment</comment>')
        );
        $this->assertEquals(
            "some question", $formatter->format('<question>some question</question>')
        );

        $formatter->setDecorated(true);

        $this->assertEquals(
            "\033[37;41msome error\033[0m", $formatter->format('<error>some error</error>')
        );
        $this->assertEquals(
            "\033[32msome info\033[0m", $formatter->format('<info>some info</info>')
        );
        $this->assertEquals(
            "\033[33msome comment\033[0m", $formatter->format('<comment>some comment</comment>')
        );
        $this->assertEquals(
            "\033[30;46msome question\033[0m", $formatter->format('<question>some question</question>')
        );
    }

    public function testContentWithLineBreaks()
    {
        $formatter = new OutputFormatter(true);

        $this->assertEquals(<<<EOF
\033[32m
some text\033[0m
EOF
            , $formatter->format(<<<EOF
<info>
some text</info>
EOF
        ));

        $this->assertEquals(<<<EOF
\033[32msome text
\033[0m
EOF
            , $formatter->format(<<<EOF
<info>some text
</info>
EOF
        ));

        $this->assertEquals(<<<EOF
\033[32m
some text
\033[0m
EOF
            , $formatter->format(<<<EOF
<info>
some text
</info>
EOF
        ));

        $this->assertEquals(<<<EOF
\033[32m
some text
more text
\033[0m
EOF
            , $formatter->format(<<<EOF
<info>
some text
more text
</info>
EOF
        ));
    }
}
PK�b�\��Ĕ���Epear/test/Console/Symfony/Component/Console/Tests/ApplicationTest.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tests;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Helper\FormatterHelper;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\Console\Output\Output;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\StreamOutput;
use Symfony\Component\Console\Tester\ApplicationTester;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\Event\ConsoleExceptionEvent;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;

class ApplicationTest extends \PHPUnit_Framework_TestCase
{
    protected static $fixturesPath;

    public static function setUpBeforeClass()
    {
        self::$fixturesPath = realpath(__DIR__.'/Fixtures/');
        require_once self::$fixturesPath.'/FooCommand.php';
        require_once self::$fixturesPath.'/Foo1Command.php';
        require_once self::$fixturesPath.'/Foo2Command.php';
        require_once self::$fixturesPath.'/Foo3Command.php';
        require_once self::$fixturesPath.'/Foo4Command.php';
        require_once self::$fixturesPath.'/Foo5Command.php';
        require_once self::$fixturesPath.'/FoobarCommand.php';
        require_once self::$fixturesPath.'/BarBucCommand.php';
    }

    protected function normalizeLineBreaks($text)
    {
        return str_replace(PHP_EOL, "\n", $text);
    }

    /**
     * Replaces the dynamic placeholders of the command help text with a static version.
     * The placeholder %command.full_name% includes the script path that is not predictable
     * and can not be tested against.
     */
    protected function ensureStaticCommandHelp(Application $application)
    {
        foreach ($application->all() as $command) {
            $command->setHelp(str_replace('%command.full_name%', 'app/console %command.name%', $command->getHelp()));
        }
    }

    public function testConstructor()
    {
        $application = new Application('foo', 'bar');
        $this->assertEquals('foo', $application->getName(), '__construct() takes the application name as its first argument');
        $this->assertEquals('bar', $application->getVersion(), '__construct() takes the application version as its second argument');
        $this->assertEquals(array('help', 'list'), array_keys($application->all()), '__construct() registered the help and list commands by default');
    }

    public function testSetGetName()
    {
        $application = new Application();
        $application->setName('foo');
        $this->assertEquals('foo', $application->getName(), '->setName() sets the name of the application');
    }

    public function testSetGetVersion()
    {
        $application = new Application();
        $application->setVersion('bar');
        $this->assertEquals('bar', $application->getVersion(), '->setVersion() sets the version of the application');
    }

    public function testGetLongVersion()
    {
        $application = new Application('foo', 'bar');
        $this->assertEquals('<info>foo</info> version <comment>bar</comment>', $application->getLongVersion(), '->getLongVersion() returns the long version of the application');
    }

    public function testHelp()
    {
        $application = new Application();
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_gethelp.txt', $this->normalizeLineBreaks($application->getHelp()), '->setHelp() returns a help message');
    }

    public function testAll()
    {
        $application = new Application();
        $commands = $application->all();
        $this->assertInstanceOf('Symfony\\Component\\Console\\Command\\HelpCommand', $commands['help'], '->all() returns the registered commands');

        $application->add(new \FooCommand());
        $commands = $application->all('foo');
        $this->assertCount(1, $commands, '->all() takes a namespace as its first argument');
    }

    public function testRegister()
    {
        $application = new Application();
        $command = $application->register('foo');
        $this->assertEquals('foo', $command->getName(), '->register() registers a new command');
    }

    public function testAdd()
    {
        $application = new Application();
        $application->add($foo = new \FooCommand());
        $commands = $application->all();
        $this->assertEquals($foo, $commands['foo:bar'], '->add() registers a command');

        $application = new Application();
        $application->addCommands(array($foo = new \FooCommand(), $foo1 = new \Foo1Command()));
        $commands = $application->all();
        $this->assertEquals(array($foo, $foo1), array($commands['foo:bar'], $commands['foo:bar1']), '->addCommands() registers an array of commands');
    }

    /**
     * @expectedException \LogicException
     * @expectedExceptionMessage Command class "Foo5Command" is not correctly initialized. You probably forgot to call the parent constructor.
     */
    public function testAddCommandWithEmptyConstructor()
    {
        $application = new Application();
        $application->add(new \Foo5Command());
    }

    public function testHasGet()
    {
        $application = new Application();
        $this->assertTrue($application->has('list'), '->has() returns true if a named command is registered');
        $this->assertFalse($application->has('afoobar'), '->has() returns false if a named command is not registered');

        $application->add($foo = new \FooCommand());
        $this->assertTrue($application->has('afoobar'), '->has() returns true if an alias is registered');
        $this->assertEquals($foo, $application->get('foo:bar'), '->get() returns a command by name');
        $this->assertEquals($foo, $application->get('afoobar'), '->get() returns a command by alias');

        $application = new Application();
        $application->add($foo = new \FooCommand());
        // simulate --help
        $r = new \ReflectionObject($application);
        $p = $r->getProperty('wantHelps');
        $p->setAccessible(true);
        $p->setValue($application, true);
        $command = $application->get('foo:bar');
        $this->assertInstanceOf('Symfony\Component\Console\Command\HelpCommand', $command, '->get() returns the help command if --help is provided as the input');
    }

    public function testSilentHelp()
    {
        $application = new Application();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);

        $tester = new ApplicationTester($application);
        $tester->run(array('-h' => true, '-q' => true), array('decorated' => false));

        $this->assertEmpty($tester->getDisplay(true));
    }

    /**
     * @expectedException        \InvalidArgumentException
     * @expectedExceptionMessage The command "foofoo" does not exist.
     */
    public function testGetInvalidCommand()
    {
        $application = new Application();
        $application->get('foofoo');
    }

    public function testGetNamespaces()
    {
        $application = new Application();
        $application->add(new \FooCommand());
        $application->add(new \Foo1Command());
        $this->assertEquals(array('foo'), $application->getNamespaces(), '->getNamespaces() returns an array of unique used namespaces');
    }

    public function testFindNamespace()
    {
        $application = new Application();
        $application->add(new \FooCommand());
        $this->assertEquals('foo', $application->findNamespace('foo'), '->findNamespace() returns the given namespace if it exists');
        $this->assertEquals('foo', $application->findNamespace('f'), '->findNamespace() finds a namespace given an abbreviation');
        $application->add(new \Foo2Command());
        $this->assertEquals('foo', $application->findNamespace('foo'), '->findNamespace() returns the given namespace if it exists');
    }

    /**
     * @expectedException        \InvalidArgumentException
     * @expectedExceptionMessage The namespace "f" is ambiguous (foo, foo1).
     */
    public function testFindAmbiguousNamespace()
    {
        $application = new Application();
        $application->add(new \BarBucCommand());
        $application->add(new \FooCommand());
        $application->add(new \Foo2Command());
        $application->findNamespace('f');
    }

    /**
     * @expectedException        \InvalidArgumentException
     * @expectedExceptionMessage There are no commands defined in the "bar" namespace.
     */
    public function testFindInvalidNamespace()
    {
        $application = new Application();
        $application->findNamespace('bar');
    }

    /**
     * @expectedException        \InvalidArgumentException
     * @expectedExceptionMessage Command "foo1" is not defined
     */
    public function testFindUniqueNameButNamespaceName()
    {
        $application = new Application();
        $application->add(new \FooCommand());
        $application->add(new \Foo1Command());
        $application->add(new \Foo2Command());

        $application->find($commandName = 'foo1');
    }

    public function testFind()
    {
        $application = new Application();
        $application->add(new \FooCommand());

        $this->assertInstanceOf('FooCommand', $application->find('foo:bar'), '->find() returns a command if its name exists');
        $this->assertInstanceOf('Symfony\Component\Console\Command\HelpCommand', $application->find('h'), '->find() returns a command if its name exists');
        $this->assertInstanceOf('FooCommand', $application->find('f:bar'), '->find() returns a command if the abbreviation for the namespace exists');
        $this->assertInstanceOf('FooCommand', $application->find('f:b'), '->find() returns a command if the abbreviation for the namespace and the command name exist');
        $this->assertInstanceOf('FooCommand', $application->find('a'), '->find() returns a command if the abbreviation exists for an alias');
    }

    /**
     * @dataProvider provideAmbiguousAbbreviations
     */
    public function testFindWithAmbiguousAbbreviations($abbreviation, $expectedExceptionMessage)
    {
        $this->setExpectedException('InvalidArgumentException', $expectedExceptionMessage);

        $application = new Application();
        $application->add(new \FooCommand());
        $application->add(new \Foo1Command());
        $application->add(new \Foo2Command());

        $application->find($abbreviation);
    }

    public function provideAmbiguousAbbreviations()
    {
        return array(
            array('f', 'Command "f" is not defined.'),
            array('a', 'Command "a" is ambiguous (afoobar, afoobar1 and 1 more).'),
            array('foo:b', 'Command "foo:b" is ambiguous (foo:bar, foo:bar1 and 1 more).')
        );
    }

    public function testFindCommandEqualNamespace()
    {
        $application = new Application();
        $application->add(new \Foo3Command());
        $application->add(new \Foo4Command());

        $this->assertInstanceOf('Foo3Command', $application->find('foo3:bar'), '->find() returns the good command even if a namespace has same name');
        $this->assertInstanceOf('Foo4Command', $application->find('foo3:bar:toh'), '->find() returns a command even if its namespace equals another command name');
    }

    public function testFindCommandWithAmbiguousNamespacesButUniqueName()
    {
        $application = new Application();
        $application->add(new \FooCommand());
        $application->add(new \FoobarCommand());

        $this->assertInstanceOf('FoobarCommand', $application->find('f:f'));
    }

    public function testFindCommandWithMissingNamespace()
    {
        $application = new Application();
        $application->add(new \Foo4Command());

        $this->assertInstanceOf('Foo4Command', $application->find('f::t'));
    }

    /**
     * @dataProvider             provideInvalidCommandNamesSingle
     * @expectedException        \InvalidArgumentException
     * @expectedExceptionMessage Did you mean this
     */
    public function testFindAlternativeExceptionMessageSingle($name)
    {
        $application = new Application();
        $application->add(new \Foo3Command());
        $application->find($name);
    }

    public function provideInvalidCommandNamesSingle()
    {
        return array(
            array('foo3:baR'),
            array('foO3:bar')
        );
    }

    public function testFindAlternativeExceptionMessageMultiple()
    {
        $application = new Application();
        $application->add(new \FooCommand());
        $application->add(new \Foo1Command());
        $application->add(new \Foo2Command());

        // Command + plural
        try {
            $application->find('foo:baR');
            $this->fail('->find() throws an \InvalidArgumentException if command does not exist, with alternatives');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if command does not exist, with alternatives');
            $this->assertRegExp('/Did you mean one of these/', $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, with alternatives');
            $this->assertRegExp('/foo1:bar/', $e->getMessage());
            $this->assertRegExp('/foo:bar/', $e->getMessage());
        }

        // Namespace + plural
        try {
            $application->find('foo2:bar');
            $this->fail('->find() throws an \InvalidArgumentException if command does not exist, with alternatives');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if command does not exist, with alternatives');
            $this->assertRegExp('/Did you mean one of these/', $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, with alternatives');
            $this->assertRegExp('/foo1/', $e->getMessage());
        }

        $application->add(new \Foo3Command());
        $application->add(new \Foo4Command());

        // Subnamespace + plural
        try {
            $a = $application->find('foo3:');
            $this->fail('->find() should throw an \InvalidArgumentException if a command is ambiguous because of a subnamespace, with alternatives');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e);
            $this->assertRegExp('/foo3:bar/', $e->getMessage());
            $this->assertRegExp('/foo3:bar:toh/', $e->getMessage());
        }
    }

    public function testFindAlternativeCommands()
    {
        $application = new Application();

        $application->add(new \FooCommand());
        $application->add(new \Foo1Command());
        $application->add(new \Foo2Command());

        try {
            $application->find($commandName = 'Unknown command');
            $this->fail('->find() throws an \InvalidArgumentException if command does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if command does not exist');
            $this->assertEquals(sprintf('Command "%s" is not defined.', $commandName), $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, without alternatives');
        }

        // Test if "bar1" command throw an "\InvalidArgumentException" and does not contain
        // "foo:bar" as alternative because "bar1" is too far from "foo:bar"
        try {
            $application->find($commandName = 'bar1');
            $this->fail('->find() throws an \InvalidArgumentException if command does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if command does not exist');
            $this->assertRegExp(sprintf('/Command "%s" is not defined./', $commandName), $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, with alternatives');
            $this->assertRegExp('/afoobar1/', $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, with alternative : "afoobar1"');
            $this->assertRegExp('/foo:bar1/', $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, with alternative : "foo:bar1"');
            $this->assertNotRegExp('/foo:bar(?>!1)/', $e->getMessage(), '->find() throws an \InvalidArgumentException if command does not exist, without "foo:bar" alternative');
        }
    }

    public function testFindAlternativeCommandsWithAnAlias()
    {
        $fooCommand = new \FooCommand();
        $fooCommand->setAliases(array('foo2'));

        $application = new Application();
        $application->add($fooCommand);

        $result = $application->find('foo');

        $this->assertSame($fooCommand, $result);
    }

    public function testFindAlternativeNamespace()
    {
        $application = new Application();

        $application->add(new \FooCommand());
        $application->add(new \Foo1Command());
        $application->add(new \Foo2Command());
        $application->add(new \foo3Command());

        try {
            $application->find('Unknown-namespace:Unknown-command');
            $this->fail('->find() throws an \InvalidArgumentException if namespace does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if namespace does not exist');
            $this->assertEquals('There are no commands defined in the "Unknown-namespace" namespace.', $e->getMessage(), '->find() throws an \InvalidArgumentException if namespace does not exist, without alternatives');
        }

        try {
            $application->find('foo2:command');
            $this->fail('->find() throws an \InvalidArgumentException if namespace does not exist');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\InvalidArgumentException', $e, '->find() throws an \InvalidArgumentException if namespace does not exist');
            $this->assertRegExp('/There are no commands defined in the "foo2" namespace./', $e->getMessage(), '->find() throws an \InvalidArgumentException if namespace does not exist, with alternative');
            $this->assertRegExp('/foo/', $e->getMessage(), '->find() throws an \InvalidArgumentException if namespace does not exist, with alternative : "foo"');
            $this->assertRegExp('/foo1/', $e->getMessage(), '->find() throws an \InvalidArgumentException if namespace does not exist, with alternative : "foo1"');
            $this->assertRegExp('/foo3/', $e->getMessage(), '->find() throws an \InvalidArgumentException if namespace does not exist, with alternative : "foo3"');
        }
    }

    public function testFindNamespaceDoesNotFailOnDeepSimilarNamespaces()
    {
        $application = $this->getMock('Symfony\Component\Console\Application', array('getNamespaces'));
        $application->expects($this->once())
            ->method('getNamespaces')
            ->will($this->returnValue(array('foo:sublong', 'bar:sub')));

        $this->assertEquals('foo:sublong', $application->findNamespace('f:sub'));
    }

    public function testSetCatchExceptions()
    {
        $application = $this->getMock('Symfony\Component\Console\Application', array('getTerminalWidth'));
        $application->setAutoExit(false);
        $application->expects($this->any())
            ->method('getTerminalWidth')
            ->will($this->returnValue(120));
        $tester = new ApplicationTester($application);

        $application->setCatchExceptions(true);
        $tester->run(array('command' => 'foo'), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception1.txt', $tester->getDisplay(true), '->setCatchExceptions() sets the catch exception flag');

        $application->setCatchExceptions(false);
        try {
            $tester->run(array('command' => 'foo'), array('decorated' => false));
            $this->fail('->setCatchExceptions() sets the catch exception flag');
        } catch (\Exception $e) {
            $this->assertInstanceOf('\Exception', $e, '->setCatchExceptions() sets the catch exception flag');
            $this->assertEquals('Command "foo" is not defined.', $e->getMessage(), '->setCatchExceptions() sets the catch exception flag');
        }
    }

    public function testAsText()
    {
        $application = new Application();
        $application->add(new \FooCommand());
        $this->ensureStaticCommandHelp($application);
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_astext1.txt', $this->normalizeLineBreaks($application->asText()), '->asText() returns a text representation of the application');
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_astext2.txt', $this->normalizeLineBreaks($application->asText('foo')), '->asText() returns a text representation of the application');
    }

    public function testAsXml()
    {
        $application = new Application();
        $application->add(new \FooCommand());
        $this->ensureStaticCommandHelp($application);
        $this->assertXmlStringEqualsXmlFile(self::$fixturesPath.'/application_asxml1.txt', $application->asXml(), '->asXml() returns an XML representation of the application');
        $this->assertXmlStringEqualsXmlFile(self::$fixturesPath.'/application_asxml2.txt', $application->asXml('foo'), '->asXml() returns an XML representation of the application');
    }

    public function testRenderException()
    {
        $application = $this->getMock('Symfony\Component\Console\Application', array('getTerminalWidth'));
        $application->setAutoExit(false);
        $application->expects($this->any())
            ->method('getTerminalWidth')
            ->will($this->returnValue(120));
        $tester = new ApplicationTester($application);

        $tester->run(array('command' => 'foo'), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception1.txt', $tester->getDisplay(true), '->renderException() renders a pretty exception');

        $tester->run(array('command' => 'foo'), array('decorated' => false, 'verbosity' => Output::VERBOSITY_VERBOSE));
        $this->assertContains('Exception trace', $tester->getDisplay(), '->renderException() renders a pretty exception with a stack trace when verbosity is verbose');

        $tester->run(array('command' => 'list', '--foo' => true), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception2.txt', $tester->getDisplay(true), '->renderException() renders the command synopsis when an exception occurs in the context of a command');

        $application->add(new \Foo3Command());
        $tester = new ApplicationTester($application);
        $tester->run(array('command' => 'foo3:bar'), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception3.txt', $tester->getDisplay(true), '->renderException() renders a pretty exceptions with previous exceptions');

        $tester->run(array('command' => 'foo3:bar'), array('decorated' => true));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception3decorated.txt', $tester->getDisplay(true), '->renderException() renders a pretty exceptions with previous exceptions');

        $application = $this->getMock('Symfony\Component\Console\Application', array('getTerminalWidth'));
        $application->setAutoExit(false);
        $application->expects($this->any())
            ->method('getTerminalWidth')
            ->will($this->returnValue(32));
        $tester = new ApplicationTester($application);

        $tester->run(array('command' => 'foo'), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_renderexception4.txt', $tester->getDisplay(true), '->renderException() wraps messages when they are bigger than the terminal');
    }

    public function testRun()
    {
        $application = new Application();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);
        $application->add($command = new \Foo1Command());
        $_SERVER['argv'] = array('cli.php', 'foo:bar1');

        ob_start();
        $application->run();
        ob_end_clean();

        $this->assertInstanceOf('Symfony\Component\Console\Input\ArgvInput', $command->input, '->run() creates an ArgvInput by default if none is given');
        $this->assertInstanceOf('Symfony\Component\Console\Output\ConsoleOutput', $command->output, '->run() creates a ConsoleOutput by default if none is given');

        $application = new Application();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);

        $this->ensureStaticCommandHelp($application);
        $tester = new ApplicationTester($application);

        $tester->run(array(), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_run1.txt', $tester->getDisplay(true), '->run() runs the list command if no argument is passed');

        $tester->run(array('--help' => true), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_run2.txt', $tester->getDisplay(true), '->run() runs the help command if --help is passed');

        $tester->run(array('-h' => true), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_run2.txt', $tester->getDisplay(true), '->run() runs the help command if -h is passed');

        $tester->run(array('command' => 'list', '--help' => true), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_run3.txt', $tester->getDisplay(true), '->run() displays the help if --help is passed');

        $tester->run(array('command' => 'list', '-h' => true), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_run3.txt', $tester->getDisplay(true), '->run() displays the help if -h is passed');

        $tester->run(array('--ansi' => true));
        $this->assertTrue($tester->getOutput()->isDecorated(), '->run() forces color output if --ansi is passed');

        $tester->run(array('--no-ansi' => true));
        $this->assertFalse($tester->getOutput()->isDecorated(), '->run() forces color output to be disabled if --no-ansi is passed');

        $tester->run(array('--version' => true), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_run4.txt', $tester->getDisplay(true), '->run() displays the program version if --version is passed');

        $tester->run(array('-V' => true), array('decorated' => false));
        $this->assertStringEqualsFile(self::$fixturesPath.'/application_run4.txt', $tester->getDisplay(true), '->run() displays the program version if -v is passed');

        $tester->run(array('command' => 'list', '--quiet' => true));
        $this->assertSame('', $tester->getDisplay(), '->run() removes all output if --quiet is passed');

        $tester->run(array('command' => 'list', '-q' => true));
        $this->assertSame('', $tester->getDisplay(), '->run() removes all output if -q is passed');

        $tester->run(array('command' => 'list', '--verbose' => true));
        $this->assertSame(Output::VERBOSITY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if --verbose is passed');

        $tester->run(array('command' => 'list', '--verbose' => 1));
        $this->assertSame(Output::VERBOSITY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if --verbose=1 is passed');

        $tester->run(array('command' => 'list', '--verbose' => 2));
        $this->assertSame(Output::VERBOSITY_VERY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to very verbose if --verbose=2 is passed');

        $tester->run(array('command' => 'list', '--verbose' => 3));
        $this->assertSame(Output::VERBOSITY_DEBUG, $tester->getOutput()->getVerbosity(), '->run() sets the output to debug if --verbose=3 is passed');

        $tester->run(array('command' => 'list', '--verbose' => 4));
        $this->assertSame(Output::VERBOSITY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if unknown --verbose level is passed');

        $tester->run(array('command' => 'list', '-v' => true));
        $this->assertSame(Output::VERBOSITY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if -v is passed');

        $tester->run(array('command' => 'list', '-vv' => true));
        $this->assertSame(Output::VERBOSITY_VERY_VERBOSE, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if -v is passed');

        $tester->run(array('command' => 'list', '-vvv' => true));
        $this->assertSame(Output::VERBOSITY_DEBUG, $tester->getOutput()->getVerbosity(), '->run() sets the output to verbose if -v is passed');

        $application = new Application();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);
        $application->add(new \FooCommand());
        $tester = new ApplicationTester($application);

        $tester->run(array('command' => 'foo:bar', '--no-interaction' => true), array('decorated' => false));
        $this->assertSame('called'.PHP_EOL, $tester->getDisplay(), '->run() does not call interact() if --no-interaction is passed');

        $tester->run(array('command' => 'foo:bar', '-n' => true), array('decorated' => false));
        $this->assertSame('called'.PHP_EOL, $tester->getDisplay(), '->run() does not call interact() if -n is passed');
    }

    /**
     * Issue #9285
     *
     * If the "verbose" option is just before an argument in ArgvInput,
     * an argument value should not be treated as verbosity value.
     * This test will fail with "Not enough arguments." if broken
     */
    public function testVerboseValueNotBreakArguments()
    {
        $application = new Application();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);
        $application->add(new \FooCommand());

        $output = new StreamOutput(fopen('php://memory', 'w', false));

        $input = new ArgvInput(array('cli.php', '-v', 'foo:bar'));
        $application->run($input, $output);

        $input = new ArgvInput(array('cli.php', '--verbose', 'foo:bar'));
        $application->run($input, $output);
    }

    public function testRunReturnsIntegerExitCode()
    {
        $exception = new \Exception('', 4);

        $application = $this->getMock('Symfony\Component\Console\Application', array('doRun'));
        $application->setAutoExit(false);
        $application->expects($this->once())
             ->method('doRun')
             ->will($this->throwException($exception));

        $exitCode = $application->run(new ArrayInput(array()), new NullOutput());

        $this->assertSame(4, $exitCode, '->run() returns integer exit code extracted from raised exception');
    }

    public function testRunReturnsExitCodeOneForExceptionCodeZero()
    {
        $exception = new \Exception('', 0);

        $application = $this->getMock('Symfony\Component\Console\Application', array('doRun'));
        $application->setAutoExit(false);
        $application->expects($this->once())
             ->method('doRun')
             ->will($this->throwException($exception));

        $exitCode = $application->run(new ArrayInput(array()), new NullOutput());

        $this->assertSame(1, $exitCode, '->run() returns exit code 1 when exception code is 0');
    }

    /**
     * @expectedException \LogicException
     * @dataProvider getAddingAlreadySetDefinitionElementData
     */
    public function testAddingAlreadySetDefinitionElementData($def)
    {
        $application = new Application();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);
        $application
            ->register('foo')
            ->setDefinition(array($def))
            ->setCode(function (InputInterface $input, OutputInterface $output) {})
        ;

        $input = new ArrayInput(array('command' => 'foo'));
        $output = new NullOutput();
        $application->run($input, $output);
    }

    public function getAddingAlreadySetDefinitionElementData()
    {
        return array(
            array(new InputArgument('command', InputArgument::REQUIRED)),
            array(new InputOption('quiet', '', InputOption::VALUE_NONE)),
            array(new InputOption('query', 'q', InputOption::VALUE_NONE)),
        );
    }

    public function testGetDefaultHelperSetReturnsDefaultValues()
    {
        $application = new Application();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);

        $helperSet = $application->getHelperSet();

        $this->assertTrue($helperSet->has('formatter'));
        $this->assertTrue($helperSet->has('dialog'));
        $this->assertTrue($helperSet->has('progress'));
    }

    public function testAddingSingleHelperSetOverwritesDefaultValues()
    {
        $application = new Application();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);

        $application->setHelperSet(new HelperSet(array(new FormatterHelper())));

        $helperSet = $application->getHelperSet();

        $this->assertTrue($helperSet->has('formatter'));

        // no other default helper set should be returned
        $this->assertFalse($helperSet->has('dialog'));
        $this->assertFalse($helperSet->has('progress'));
    }

    public function testOverwritingDefaultHelperSetOverwritesDefaultValues()
    {
        $application = new CustomApplication();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);

        $application->setHelperSet(new HelperSet(array(new FormatterHelper())));

        $helperSet = $application->getHelperSet();

        $this->assertTrue($helperSet->has('formatter'));

        // no other default helper set should be returned
        $this->assertFalse($helperSet->has('dialog'));
        $this->assertFalse($helperSet->has('progress'));
    }

    public function testGetDefaultInputDefinitionReturnsDefaultValues()
    {
        $application = new Application();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);

        $inputDefinition = $application->getDefinition();

        $this->assertTrue($inputDefinition->hasArgument('command'));

        $this->assertTrue($inputDefinition->hasOption('help'));
        $this->assertTrue($inputDefinition->hasOption('quiet'));
        $this->assertTrue($inputDefinition->hasOption('verbose'));
        $this->assertTrue($inputDefinition->hasOption('version'));
        $this->assertTrue($inputDefinition->hasOption('ansi'));
        $this->assertTrue($inputDefinition->hasOption('no-ansi'));
        $this->assertTrue($inputDefinition->hasOption('no-interaction'));
    }

    public function testOverwritingDefaultInputDefinitionOverwritesDefaultValues()
    {
        $application = new CustomApplication();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);

        $inputDefinition = $application->getDefinition();

        // check whether the default arguments and options are not returned any more
        $this->assertFalse($inputDefinition->hasArgument('command'));

        $this->assertFalse($inputDefinition->hasOption('help'));
        $this->assertFalse($inputDefinition->hasOption('quiet'));
        $this->assertFalse($inputDefinition->hasOption('verbose'));
        $this->assertFalse($inputDefinition->hasOption('version'));
        $this->assertFalse($inputDefinition->hasOption('ansi'));
        $this->assertFalse($inputDefinition->hasOption('no-ansi'));
        $this->assertFalse($inputDefinition->hasOption('no-interaction'));

        $this->assertTrue($inputDefinition->hasOption('custom'));
    }

    public function testSettingCustomInputDefinitionOverwritesDefaultValues()
    {
        $application = new Application();
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);

        $application->setDefinition(new InputDefinition(array(new InputOption('--custom', '-c', InputOption::VALUE_NONE, 'Set the custom input definition.'))));

        $inputDefinition = $application->getDefinition();

        // check whether the default arguments and options are not returned any more
        $this->assertFalse($inputDefinition->hasArgument('command'));

        $this->assertFalse($inputDefinition->hasOption('help'));
        $this->assertFalse($inputDefinition->hasOption('quiet'));
        $this->assertFalse($inputDefinition->hasOption('verbose'));
        $this->assertFalse($inputDefinition->hasOption('version'));
        $this->assertFalse($inputDefinition->hasOption('ansi'));
        $this->assertFalse($inputDefinition->hasOption('no-ansi'));
        $this->assertFalse($inputDefinition->hasOption('no-interaction'));

        $this->assertTrue($inputDefinition->hasOption('custom'));
    }

    public function testRunWithDispatcher()
    {
        $application = new Application();
        $application->setAutoExit(false);
        $application->setDispatcher($this->getDispatcher());

        $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
            $output->write('foo.');
        });

        $tester = new ApplicationTester($application);
        $tester->run(array('command' => 'foo'));
        $this->assertEquals('before.foo.after.', $tester->getDisplay());
    }

    /**
     * @expectedException        \LogicException
     * @expectedExceptionMessage caught
     */
    public function testRunWithExceptionAndDispatcher()
    {
        $application = new Application();
        $application->setDispatcher($this->getDispatcher());
        $application->setAutoExit(false);
        $application->setCatchExceptions(false);

        $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
            throw new \RuntimeException('foo');
        });

        $tester = new ApplicationTester($application);
        $tester->run(array('command' => 'foo'));
    }

    public function testRunDispatchesAllEventsWithException()
    {
        $application = new Application();
        $application->setDispatcher($this->getDispatcher());
        $application->setAutoExit(false);

        $application->register('foo')->setCode(function (InputInterface $input, OutputInterface $output) {
            $output->write('foo.');

            throw new \RuntimeException('foo');
        });

        $tester = new ApplicationTester($application);
        $tester->run(array('command' => 'foo'));
        $this->assertContains('before.foo.after.caught.', $tester->getDisplay());
    }

    public function testTerminalDimensions()
    {
        $application = new Application();
        $originalDimensions = $application->getTerminalDimensions();
        $this->assertCount(2, $originalDimensions);

        $width = 80;
        if ($originalDimensions[0] == $width) {
            $width = 100;
        }

        $application->setTerminalDimensions($width, 80);
        $this->assertSame(array($width, 80), $application->getTerminalDimensions());
    }

    protected function getDispatcher()
    {
        $dispatcher = new EventDispatcher();
        $dispatcher->addListener('console.command', function (ConsoleCommandEvent $event) {
            $event->getOutput()->write('before.');
        });
        $dispatcher->addListener('console.terminate', function (ConsoleTerminateEvent $event) {
            $event->getOutput()->write('after.');

            $event->setExitCode(128);
        });
        $dispatcher->addListener('console.exception', function (ConsoleExceptionEvent $event) {
            $event->getOutput()->writeln('caught.');

            $event->setException(new \LogicException('caught.', $event->getExitCode(), $event->getException()));
        });

        return $dispatcher;
    }
}

class CustomApplication extends Application
{
    /**
     * Overwrites the default input definition.
     *
     * @return InputDefinition An InputDefinition instance
     */
    protected function getDefaultInputDefinition()
    {
        return new InputDefinition(array(new InputOption('--custom', '-c', InputOption::VALUE_NONE, 'Set the custom input definition.')));
    }

    /**
     * Gets the default helper set with the helpers that should always be available.
     *
     * @return HelperSet A HelperSet instance
     */
    protected function getDefaultHelperSet()
    {
        return new HelperSet(array(new FormatterHelper()));
    }
}
PK�b�\G u=��[pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_renderexception3.txtnu�[���

                           
  [Exception]              
  Third exception comment  
                           




                            
  [Exception]               
  Second exception comment  
                            




                                       
  [Exception]                          
  First exception <p>this is html</p>  
                                       


foo3:bar


PK�b�\��f���Opear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_2.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<argument name="argument_name" is_required="0" is_array="1">
  <description>argument description</description>
  <defaults/>
</argument>
PK�b�\CQu��Qpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_4.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<definition>
  <arguments>
    <argument name="argument_name" is_required="1" is_array="0">
      <description></description>
      <defaults/>
    </argument>
  </arguments>
  <options>
    <option name="--option_name" shortcut="-o" accept_value="0" is_value_required="0" is_multiple="0">
      <description></description>
    </option>
  </options>
</definition>
PK�b�\X� �,,Opear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_run2.txtnu�[���Usage:
 help [--xml] [--format="..."] [--raw] [command_name]

Arguments:
 command               The command to execute
 command_name          The command name (default: "help")

Options:
 --xml                 To output help as XML
 --format              To output help in other formats (default: "txt")
 --raw                 To output raw command help
 --help (-h)           Display this help message.
 --quiet (-q)          Do not output any message.
 --verbose (-v|vv|vvv) Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
 --version (-V)        Display this application version.
 --ansi                Force ANSI output.
 --no-ansi             Disable ANSI output.
 --no-interaction (-n) Do not ask any interactive question.

Help:
 The help command displays help for a given command:
 
   php app/console help list
 
 You can also output the help in other formats by using the --format option:
 
   php app/console help --format=xml list
 
 To display the list of available commands, please use the list command.
PK�b�\�: 8��Opear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<argument name="argument_name" is_required="0" is_array="0">
  <description>argument description</description>
  <defaults>
    <default>default_value</default>
  </defaults>
</argument>
PK�b�\u$´!!Mpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_1.txtnu�[��� <info>--option_name</info> (-o)
PK�b�\(?hOpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_1.txtnu�[��� <info>argument_name</info>
PK�b�\1G~"//Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/FoobarCommand.phpnu�[���<?php

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class FoobarCommand extends Command
{
    public $input;
    public $output;

    protected function configure()
    {
        $this
            ->setName('foobar:foo')
            ->setDescription('The foobar:foo command')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->input = $input;
        $this->output = $output;
    }
}
PK�b�\ a���Npear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_4.jsonnu�[���{"name":"--option_name","shortcut":"-o","accept_value":true,"is_value_required":false,"is_multiple":true,"description":"option description","default":[]}
PK�b�\�J�2Mpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_2.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<option name="--option_name" shortcut="-o" accept_value="1" is_value_required="0" is_multiple="0">
  <description>option description</description>
  <defaults>
    <default>default_value</default>
  </defaults>
</option>
PK�b�\	�Ӹ�Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_2.mdnu�[���**option_name:**

* Name: `--option_name`
* Shortcut: `-o`
* Accept value: yes
* Is value required: no
* Is multiple: no
* Description: option description
* Default: `'default_value'`
PK�b�\W'��Qpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_asxml2.txtnu�[���<?xml version="1.0" encoding="UTF-8"?>
<symfony>
  <commands namespace="foo">
    <command id="foo:bar" name="foo:bar">
  <usage>foo:bar</usage>
  <description>The foo:bar command</description>
  <help/>
  <aliases>
    <alias>afoobar</alias>
  </aliases>
  <arguments/>
    <options>
      <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Display this help message.</description>
      </option>
      <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Do not output any message.</description>
      </option>
      <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
      </option>
      <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Display this application version.</description>
      </option>
      <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Force ANSI output.</description>
      </option>
      <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Disable ANSI output.</description>
      </option>
      <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Do not ask any interactive question.</description>
      </option>
    </options>
</command>
  </commands>
</symfony>
PK�b�\��#��Kpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_2.mdnu�[���My Symfony application
======================

* alias1
* alias2
* help
* list

**descriptor:**

* descriptor:command1
* descriptor:command2

help
----

* Description: Displays help for a command
* Usage: `help [--xml] [--format="..."] [--raw] [command_name]`
* Aliases: <none>

The <info>help</info> command displays help for a given command:

  <info>php app/console help list</info>

You can also output the help in other formats by using the <comment>--format</comment> option:

  <info>php app/console help --format=xml list</info>

To display the list of available commands, please use the <info>list</info> command.

### Arguments:

**command_name:**

* Name: command_name
* Is required: no
* Is array: no
* Description: The command name
* Default: `'help'`

### Options:

**xml:**

* Name: `--xml`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: To output help as XML
* Default: `false`

**format:**

* Name: `--format`
* Shortcut: <none>
* Accept value: yes
* Is value required: yes
* Is multiple: no
* Description: To output help in other formats
* Default: `'txt'`

**raw:**

* Name: `--raw`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: To output raw command help
* Default: `false`

**help:**

* Name: `--help`
* Shortcut: `-h`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Display this help message.
* Default: `false`

**quiet:**

* Name: `--quiet`
* Shortcut: `-q`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Do not output any message.
* Default: `false`

**verbose:**

* Name: `--verbose`
* Shortcut: `-v|-vv|-vvv`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
* Default: `false`

**version:**

* Name: `--version`
* Shortcut: `-V`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Display this application version.
* Default: `false`

**ansi:**

* Name: `--ansi`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Force ANSI output.
* Default: `false`

**no-ansi:**

* Name: `--no-ansi`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Disable ANSI output.
* Default: `false`

**no-interaction:**

* Name: `--no-interaction`
* Shortcut: `-n`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Do not ask any interactive question.
* Default: `false`

list
----

* Description: Lists commands
* Usage: `list [--xml] [--raw] [--format="..."] [namespace]`
* Aliases: <none>

The <info>list</info> command lists all commands:

  <info>php app/console list</info>

You can also display the commands for a specific namespace:

  <info>php app/console list test</info>

You can also output the information in other formats by using the <comment>--format</comment> option:

  <info>php app/console list --format=xml</info>

It's also possible to get raw list of commands (useful for embedding command runner):

  <info>php app/console list --raw</info>

### Arguments:

**namespace:**

* Name: namespace
* Is required: no
* Is array: no
* Description: The namespace name
* Default: `NULL`

### Options:

**xml:**

* Name: `--xml`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: To output list as XML
* Default: `false`

**raw:**

* Name: `--raw`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: To output raw command list
* Default: `false`

**format:**

* Name: `--format`
* Shortcut: <none>
* Accept value: yes
* Is value required: yes
* Is multiple: no
* Description: To output list in other formats
* Default: `'txt'`

descriptor:command1
-------------------

* Description: command 1 description
* Usage: `descriptor:command1`
* Aliases: `alias1`, `alias2`

command 1 help

### Options:

**help:**

* Name: `--help`
* Shortcut: `-h`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Display this help message.
* Default: `false`

**quiet:**

* Name: `--quiet`
* Shortcut: `-q`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Do not output any message.
* Default: `false`

**verbose:**

* Name: `--verbose`
* Shortcut: `-v|-vv|-vvv`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
* Default: `false`

**version:**

* Name: `--version`
* Shortcut: `-V`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Display this application version.
* Default: `false`

**ansi:**

* Name: `--ansi`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Force ANSI output.
* Default: `false`

**no-ansi:**

* Name: `--no-ansi`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Disable ANSI output.
* Default: `false`

**no-interaction:**

* Name: `--no-interaction`
* Shortcut: `-n`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Do not ask any interactive question.
* Default: `false`

descriptor:command2
-------------------

* Description: command 2 description
* Usage: `descriptor:command2 [-o|--option_name] argument_name`
* Aliases: <none>

command 2 help

### Arguments:

**argument_name:**

* Name: argument_name
* Is required: yes
* Is array: no
* Description: <none>
* Default: `NULL`

### Options:

**option_name:**

* Name: `--option_name`
* Shortcut: `-o`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: <none>
* Default: `false`

**help:**

* Name: `--help`
* Shortcut: `-h`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Display this help message.
* Default: `false`

**quiet:**

* Name: `--quiet`
* Shortcut: `-q`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Do not output any message.
* Default: `false`

**verbose:**

* Name: `--verbose`
* Shortcut: `-v|-vv|-vvv`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
* Default: `false`

**version:**

* Name: `--version`
* Shortcut: `-V`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Display this application version.
* Default: `false`

**ansi:**

* Name: `--ansi`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Force ANSI output.
* Default: `false`

**no-ansi:**

* Name: `--no-ansi`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Disable ANSI output.
* Default: `false`

**no-interaction:**

* Name: `--no-interaction`
* Shortcut: `-n`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Do not ask any interactive question.
* Default: `false`
PK�b�\۴�2��Npear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_2.jsonnu�[���{"name":"--option_name","shortcut":"-o","accept_value":true,"is_value_required":false,"is_multiple":false,"description":"option description","default":"default_value"}
PK�b�\���Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/BarBucCommand.phpnu�[���<?php

use Symfony\Component\Console\Command\Command;

class BarBucCommand extends Command
{
    protected function configure()
    {
        $this->setName('bar:buc');
    }
}
PK�b�\��[���Ppear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_2.mdnu�[���### Arguments:

**argument_name:**

* Name: argument_name
* Is required: yes
* Is array: no
* Description: <none>
* Default: `NULL`
PK�b�\;`�MQpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_asxml1.txtnu�[���<?xml version="1.0" encoding="UTF-8"?>
<symfony>
  <commands>
    <command id="help" name="help">
  <usage>help [--xml] [--format="..."] [--raw] [command_name]</usage>
  <description>Displays help for a command</description>
  <help>The &lt;info&gt;help&lt;/info&gt; command displays help for a given command:
 
   &lt;info&gt;php app/console help list&lt;/info&gt;
 
 You can also output the help in other formats by using the &lt;comment&gt;--format&lt;/comment&gt; option:
 
   &lt;info&gt;php app/console help --format=xml list&lt;/info&gt;
 
 To display the list of available commands, please use the &lt;info&gt;list&lt;/info&gt; command.</help>
  <aliases />
  <arguments>
    <argument name="command_name" is_required="0" is_array="0">
      <description>The command name</description>
      <defaults>
        <default>help</default>
      </defaults>
    </argument>
  </arguments>
  <options>
    <option name="--xml" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
      <description>To output help as XML</description>
    </option>
    <option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
      <description>To output help in other formats</description>
      <defaults>
        <default>txt</default>
      </defaults>
    </option>
    <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
      <description>To output raw command help</description>
    </option>
    <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Display this help message.</description>
    </option>
    <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Do not output any message.</description>
    </option>
    <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
    </option>
    <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Display this application version.</description>
    </option>
    <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Force ANSI output.</description>
    </option>
    <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Disable ANSI output.</description>
    </option>
    <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Do not ask any interactive question.</description>
    </option>
  </options>
</command>
    <command id="list" name="list">
  <usage>list [--xml] [--raw] [--format="..."] [namespace]</usage>
  <description>Lists commands</description>
  <help>The &lt;info&gt;list&lt;/info&gt; command lists all commands:
 
   &lt;info&gt;php app/console list&lt;/info&gt;
 
 You can also display the commands for a specific namespace:
 
   &lt;info&gt;php app/console list test&lt;/info&gt;
 
 You can also output the information in other formats by using the &lt;comment&gt;--format&lt;/comment&gt; option:
 
   &lt;info&gt;php app/console list --format=xml&lt;/info&gt;
 
 It's also possible to get raw list of commands (useful for embedding command runner):
 
   &lt;info&gt;php app/console list --raw&lt;/info&gt;</help>
  <aliases/>
  <arguments>
    <argument name="namespace" is_required="0" is_array="0">
      <description>The namespace name</description>
      <defaults/>
    </argument>
  </arguments>
  <options>
    <option name="--xml" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
      <description>To output list as XML</description>
    </option>
    <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
      <description>To output raw command list</description>
    </option>
    <option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
      <description>To output list in other formats</description>
      <defaults>
        <default>txt</default>
      </defaults>
    </option>
  </options>
</command>
    <command id="foo:bar" name="foo:bar">
  <usage>foo:bar</usage>
  <description>The foo:bar command</description>
  <help/>
  <aliases>
    <alias>afoobar</alias>
  </aliases>
  <arguments/>
    <options>
      <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Display this help message.</description>
      </option>
      <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Do not output any message.</description>
      </option>
      <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
      </option>
      <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Display this application version.</description>
      </option>
      <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Force ANSI output.</description>
      </option>
      <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Disable ANSI output.</description>
      </option>
      <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
        <description>Do not ask any interactive question.</description>
      </option>
    </options>
</command>
  </commands>
  <namespaces>
    <namespace id="_global">
      <command>afoobar</command>
      <command>help</command>
      <command>list</command>
    </namespace>
    <namespace id="foo">
      <command>foo:bar</command>
    </namespace>
  </namespaces>
</symfony>
PK�b�\���==Qpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_3.txtnu�[���<comment>Options:</comment>
 <info>--option_name</info> (-o)
PK�b�\�S��Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_asxml.txtnu�[���<?xml version="1.0" encoding="UTF-8"?>
<command id="namespace:name" name="namespace:name">
  <usage>namespace:name</usage>
  <description>description</description>
  <help>help</help>
  <aliases>
    <alias>name</alias>
  </aliases>
  <arguments>
    <argument name="command" is_required="1" is_array="0">
      <description>The command to execute</description>
      <defaults/>
    </argument>
  </arguments>
  <options>
    <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Display this help message.</description>
    </option>
    <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Do not output any message.</description>
    </option>
    <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
    </option>
    <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Display this application version.</description>
    </option>
    <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Force ANSI output.</description>
    </option>
    <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Disable ANSI output.</description>
    </option>
    <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
      <description>Do not ask any interactive question.</description>
    </option>
  </options>
</command>
PK�b�\󚲱}}Ppear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_3.jsonnu�[���{"name":"argument_name","is_required":false,"is_array":false,"description":"argument description","default":"default_value"}
PK�b�\�!�"��Opear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_run3.txtnu�[���Usage:
 list [--xml] [--raw] [--format="..."] [namespace]

Arguments:
 namespace  The namespace name

Options:
 --xml      To output list as XML
 --raw      To output raw command list
 --format   To output list in other formats (default: "txt")

Help:
 The list command lists all commands:
 
   php app/console list
 
 You can also display the commands for a specific namespace:
 
   php app/console list test
 
 You can also output the information in other formats by using the --format option:
 
   php app/console list --format=xml
 
 It's also possible to get raw list of commands (useful for embedding command runner):
 
   php app/console list --raw
PK�b�\�q+��Upear/test/Console/Symfony/Component/Console/Tests/Fixtures/DescriptorApplication1.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tests\Fixtures;

use Symfony\Component\Console\Application;

class DescriptorApplication1 extends Application
{
}
PK�b�\�Z�o��Kpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_1.mdnu�[���UNKNOWN
=======

* help
* list

help
----

* Description: Displays help for a command
* Usage: `help [--xml] [--format="..."] [--raw] [command_name]`
* Aliases: <none>

The <info>help</info> command displays help for a given command:

  <info>php app/console help list</info>

You can also output the help in other formats by using the <comment>--format</comment> option:

  <info>php app/console help --format=xml list</info>

To display the list of available commands, please use the <info>list</info> command.

### Arguments:

**command_name:**

* Name: command_name
* Is required: no
* Is array: no
* Description: The command name
* Default: `'help'`

### Options:

**xml:**

* Name: `--xml`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: To output help as XML
* Default: `false`

**format:**

* Name: `--format`
* Shortcut: <none>
* Accept value: yes
* Is value required: yes
* Is multiple: no
* Description: To output help in other formats
* Default: `'txt'`

**raw:**

* Name: `--raw`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: To output raw command help
* Default: `false`

**help:**

* Name: `--help`
* Shortcut: `-h`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Display this help message.
* Default: `false`

**quiet:**

* Name: `--quiet`
* Shortcut: `-q`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Do not output any message.
* Default: `false`

**verbose:**

* Name: `--verbose`
* Shortcut: `-v|-vv|-vvv`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
* Default: `false`

**version:**

* Name: `--version`
* Shortcut: `-V`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Display this application version.
* Default: `false`

**ansi:**

* Name: `--ansi`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Force ANSI output.
* Default: `false`

**no-ansi:**

* Name: `--no-ansi`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Disable ANSI output.
* Default: `false`

**no-interaction:**

* Name: `--no-interaction`
* Shortcut: `-n`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: Do not ask any interactive question.
* Default: `false`

list
----

* Description: Lists commands
* Usage: `list [--xml] [--raw] [--format="..."] [namespace]`
* Aliases: <none>

The <info>list</info> command lists all commands:

  <info>php app/console list</info>

You can also display the commands for a specific namespace:

  <info>php app/console list test</info>

You can also output the information in other formats by using the <comment>--format</comment> option:

  <info>php app/console list --format=xml</info>

It's also possible to get raw list of commands (useful for embedding command runner):

  <info>php app/console list --raw</info>

### Arguments:

**namespace:**

* Name: namespace
* Is required: no
* Is array: no
* Description: The namespace name
* Default: `NULL`

### Options:

**xml:**

* Name: `--xml`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: To output list as XML
* Default: `false`

**raw:**

* Name: `--raw`
* Shortcut: <none>
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: To output raw command list
* Default: `false`

**format:**

* Name: `--format`
* Shortcut: <none>
* Accept value: yes
* Is value required: yes
* Is multiple: no
* Description: To output list in other formats
* Default: `'txt'`
PK�b�\z�Ռ��Npear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_2.mdnu�[���**argument_name:**

* Name: argument_name
* Is required: no
* Is array: yes
* Description: argument description
* Default: `array ()`
PK�b�\�e�d��Jpear/test/Console/Symfony/Component/Console/Tests/Fixtures/Foo4Command.phpnu�[���<?php

use Symfony\Component\Console\Command\Command;

class Foo4Command extends Command
{
    protected function configure()
    {
        $this->setName('foo3:bar:toh');
    }
}
PK�b�\9�*A��Jpear/test/Console/Symfony/Component/Console/Tests/Fixtures/TestCommand.phpnu�[���<?php

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class TestCommand extends Command
{
    protected function configure()
    {
        $this
            ->setName('namespace:name')
            ->setAliases(array('name'))
            ->setDescription('description')
            ->setHelp('help')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('execute called');
    }

    protected function interact(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('interact called');
    }
}
PK�b�\���ooPpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_2.jsonnu�[���{"name":"argument_name","is_required":false,"is_array":true,"description":"argument description","default":[]}
PK�b�\��I��Npear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_3.jsonnu�[���{"name":"--option_name","shortcut":"-o","accept_value":true,"is_value_required":true,"is_multiple":false,"description":"option description","default":null}
PK�b�\Xz�??Qpear/test/Console/Symfony/Component/Console/Tests/Fixtures/DescriptorCommand2.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tests\Fixtures;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;

class DescriptorCommand2 extends Command
{
    protected function configure()
    {
        $this
            ->setName('descriptor:command2')
            ->setDescription('command 2 description')
            ->setHelp('command 2 help')
            ->addArgument('argument_name', InputArgument::REQUIRED)
            ->addOption('option_name', 'o', InputOption::VALUE_NONE)
        ;
    }
}
PK�b�\Ѹ�;;Qpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_2.txtnu�[���<comment>Arguments:</comment>
 <info>argument_name </info>
PK�b�\�'�̒�Hpear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_1.txtnu�[���<comment>Usage:</comment>
 descriptor:command1

<comment>Aliases:</comment> <info>alias1, alias2</info>

<comment>Help:</comment>
 command 1 help
PK�b�\�(���Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_2.txtnu�[���<info>My Symfony application</info> version <comment>v1.0</comment>

<comment>Usage:</comment>
  [options] command [arguments]

<comment>Options:</comment>
  <info>--help</info>           <info>-h</info> Display this help message.
  <info>--quiet</info>          <info>-q</info> Do not output any message.
  <info>--verbose</info>        <info>-v|vv|vvv</info> Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
  <info>--version</info>        <info>-V</info> Display this application version.
  <info>--ansi</info>              Force ANSI output.
  <info>--no-ansi</info>           Disable ANSI output.
  <info>--no-interaction</info> <info>-n</info> Do not ask any interactive question.

<comment>Available commands:</comment>
  <info>alias1               </info> command 1 description
  <info>alias2               </info> command 1 description
  <info>help                 </info> Displays help for a command
  <info>list                 </info> Lists commands
<comment>descriptor</comment>
  <info>descriptor:command1  </info> command 1 description
  <info>descriptor:command2  </info> command 2 description
PK�b�\oY���Mpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_1.jsonnu�[���{"commands":[{"name":"help","usage":"help [--xml] [--format=\"...\"] [--raw] [command_name]","description":"Displays help for a command","help":"The <info>help<\/info> command displays help for a given command:\n\n  <info>php app\/console help list<\/info>\n\nYou can also output the help in other formats by using the <comment>--format<\/comment> option:\n\n  <info>php app\/console help --format=xml list<\/info>\n\nTo display the list of available commands, please use the <info>list<\/info> command.","aliases":[],"definition":{"arguments":{"command_name":{"name":"command_name","is_required":false,"is_array":false,"description":"The command name","default":"help"}},"options":{"xml":{"name":"--xml","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output help as XML","default":false},"format":{"name":"--format","shortcut":"","accept_value":true,"is_value_required":true,"is_multiple":false,"description":"To output help in other formats","default":"txt"},"raw":{"name":"--raw","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output raw command help","default":false},"help":{"name":"--help","shortcut":"-h","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this help message.","default":false},"quiet":{"name":"--quiet","shortcut":"-q","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not output any message.","default":false},"verbose":{"name":"--verbose","shortcut":"-v|-vv|-vvv","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug","default":false},"version":{"name":"--version","shortcut":"-V","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this application version.","default":false},"ansi":{"name":"--ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Force ANSI output.","default":false},"no-ansi":{"name":"--no-ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Disable ANSI output.","default":false},"no-interaction":{"name":"--no-interaction","shortcut":"-n","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not ask any interactive question.","default":false}}}},{"name":"list","usage":"list [--xml] [--raw] [--format=\"...\"] [namespace]","description":"Lists commands","help":"The <info>list<\/info> command lists all commands:\n\n  <info>php app\/console list<\/info>\n\nYou can also display the commands for a specific namespace:\n\n  <info>php app\/console list test<\/info>\n\nYou can also output the information in other formats by using the <comment>--format<\/comment> option:\n\n  <info>php app\/console list --format=xml<\/info>\n\nIt's also possible to get raw list of commands (useful for embedding command runner):\n\n  <info>php app\/console list --raw<\/info>","aliases":[],"definition":{"arguments":{"namespace":{"name":"namespace","is_required":false,"is_array":false,"description":"The namespace name","default":null}},"options":{"xml":{"name":"--xml","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output list as XML","default":false},"raw":{"name":"--raw","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output raw command list","default":false},"format":{"name":"--format","shortcut":"","accept_value":true,"is_value_required":true,"is_multiple":false,"description":"To output list in other formats","default":"txt"}}}}],"namespaces":[{"id":"_global","commands":["help","list"]}]}
PK�b�\#��"��Ipear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_2.jsonnu�[���{"name":"descriptor:command2","usage":"descriptor:command2 [-o|--option_name] argument_name","description":"command 2 description","help":"command 2 help","aliases":[],"definition":{"arguments":{"argument_name":{"name":"argument_name","is_required":true,"is_array":false,"description":"","default":null}},"options":{"option_name":{"name":"--option_name","shortcut":"-o","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"","default":false}}}}
PK�b�\����Rpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_1.jsonnu�[���{"arguments":[],"options":[]}
PK�b�\�@�]"]"Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_2.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<symfony name="My Symfony application" version="v1.0">
  <commands>
    <command id="help" name="help">
      <usage>help [--xml] [--format="..."] [--raw] [command_name]</usage>
      <description>Displays help for a command</description>
      <help>The &lt;info&gt;help&lt;/info&gt; command displays help for a given command:
 
   &lt;info&gt;php app/console help list&lt;/info&gt;
 
 You can also output the help in other formats by using the &lt;comment&gt;--format&lt;/comment&gt; option:
 
   &lt;info&gt;php app/console help --format=xml list&lt;/info&gt;
 
 To display the list of available commands, please use the &lt;info&gt;list&lt;/info&gt; command.</help>
      <aliases/>
      <arguments>
        <argument name="command_name" is_required="0" is_array="0">
          <description>The command name</description>
          <defaults>
            <default>help</default>
          </defaults>
        </argument>
      </arguments>
      <options>
        <option name="--xml" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>To output help as XML</description>
        </option>
        <option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
          <description>To output help in other formats</description>
          <defaults>
            <default>txt</default>
          </defaults>
        </option>
        <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>To output raw command help</description>
        </option>
        <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Display this help message.</description>
        </option>
        <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Do not output any message.</description>
        </option>
        <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
        </option>
        <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Display this application version.</description>
        </option>
        <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Force ANSI output.</description>
        </option>
        <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Disable ANSI output.</description>
        </option>
        <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Do not ask any interactive question.</description>
        </option>
      </options>
    </command>
    <command id="list" name="list">
      <usage>list [--xml] [--raw] [--format="..."] [namespace]</usage>
      <description>Lists commands</description>
      <help>The &lt;info&gt;list&lt;/info&gt; command lists all commands:
 
   &lt;info&gt;php app/console list&lt;/info&gt;
 
 You can also display the commands for a specific namespace:
 
   &lt;info&gt;php app/console list test&lt;/info&gt;
 
 You can also output the information in other formats by using the &lt;comment&gt;--format&lt;/comment&gt; option:
 
   &lt;info&gt;php app/console list --format=xml&lt;/info&gt;
 
 It's also possible to get raw list of commands (useful for embedding command runner):
 
   &lt;info&gt;php app/console list --raw&lt;/info&gt;</help>
      <aliases/>
      <arguments>
        <argument name="namespace" is_required="0" is_array="0">
          <description>The namespace name</description>
          <defaults/>
        </argument>
      </arguments>
      <options>
        <option name="--xml" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>To output list as XML</description>
        </option>
        <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>To output raw command list</description>
        </option>
        <option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
          <description>To output list in other formats</description>
          <defaults>
            <default>txt</default>
          </defaults>
        </option>
      </options>
    </command>
    <command id="descriptor:command1" name="descriptor:command1">
      <usage>descriptor:command1</usage>
      <description>command 1 description</description>
      <help>command 1 help</help>
      <aliases>
        <alias>alias1</alias>
        <alias>alias2</alias>
      </aliases>
      <arguments/>
      <options>
        <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Display this help message.</description>
        </option>
        <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Do not output any message.</description>
        </option>
        <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
        </option>
        <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Display this application version.</description>
        </option>
        <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Force ANSI output.</description>
        </option>
        <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Disable ANSI output.</description>
        </option>
        <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Do not ask any interactive question.</description>
        </option>
      </options>
    </command>
    <command id="descriptor:command2" name="descriptor:command2">
      <usage>descriptor:command2 [-o|--option_name] argument_name</usage>
      <description>command 2 description</description>
      <help>command 2 help</help>
      <aliases/>
      <arguments>
        <argument name="argument_name" is_required="1" is_array="0">
          <description></description>
          <defaults/>
        </argument>
      </arguments>
      <options>
        <option name="--option_name" shortcut="-o" accept_value="0" is_value_required="0" is_multiple="0">
          <description></description>
        </option>
        <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Display this help message.</description>
        </option>
        <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Do not output any message.</description>
        </option>
        <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
        </option>
        <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Display this application version.</description>
        </option>
        <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Force ANSI output.</description>
        </option>
        <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Disable ANSI output.</description>
        </option>
        <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Do not ask any interactive question.</description>
        </option>
      </options>
    </command>
  </commands>
  <namespaces>
    <namespace id="_global">
      <command>alias1</command>
      <command>alias2</command>
      <command>help</command>
      <command>list</command>
    </namespace>
    <namespace id="descriptor">
      <command>descriptor:command1</command>
      <command>descriptor:command2</command>
    </namespace>
  </namespaces>
</symfony>
PK�b�\[��%��Ipear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_1.jsonnu�[���{"name":"descriptor:command1","usage":"descriptor:command1","description":"command 1 description","help":"command 1 help","aliases":["alias1","alias2"],"definition":{"arguments":[],"options":[]}}
PK�b�\*[Ǿ44Ppear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_4.mdnu�[���### Arguments:

**argument_name:**

* Name: argument_name
* Is required: yes
* Is array: no
* Description: <none>
* Default: `NULL`

### Options:

**option_name:**

* Name: `--option_name`
* Shortcut: `-o`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: <none>
* Default: `false`
PK�b�\,D���[pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_renderexception2.txtnu�[���

                                      
  [InvalidArgumentException]          
  The "--foo" option does not exist.  
                                      


list [--xml] [--raw] [--format="..."] [namespace]


PK�b�\p�����Ppear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_3.mdnu�[���### Options:

**option_name:**

* Name: `--option_name`
* Shortcut: `-o`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: <none>
* Default: `false`
PK�b�\Qpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_1.txtnu�[���PK�b�\�����Mpear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_astext.txtnu�[���<comment>Usage:</comment>
 namespace:name

<comment>Aliases:</comment> <info>name</info>
<comment>Arguments:</comment>
 <info>command              </info> The command to execute

<comment>Options:</comment>
 <info>--help</info> (-h)           Display this help message.
 <info>--quiet</info> (-q)          Do not output any message.
 <info>--verbose</info> (-v|vv|vvv) Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
 <info>--version</info> (-V)        Display this application version.
 <info>--ansi</info>                Force ANSI output.
 <info>--no-ansi</info>             Disable ANSI output.
 <info>--no-interaction</info> (-n) Do not ask any interactive question.

<comment>Help:</comment>
 help
PK�b�\Ppear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_1.mdnu�[���PK�b�\��<]]Ppear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_1.jsonnu�[���{"name":"argument_name","is_required":true,"is_array":false,"description":"","default":null}
PK�b�\1"8MMUpear/test/Console/Symfony/Component/Console/Tests/Fixtures/DescriptorApplication2.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tests\Fixtures;

use Symfony\Component\Console\Application;

class DescriptorApplication2 extends Application
{
    public function __construct()
    {
        parent::__construct('My Symfony application', 'v1.0');
        $this->add(new DescriptorCommand1());
        $this->add(new DescriptorCommand2());
    }
}
PK�b�\��a66Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_1.txtnu�[���<info>Console Tool</info>

<comment>Usage:</comment>
  [options] command [arguments]

<comment>Options:</comment>
  <info>--help</info>           <info>-h</info> Display this help message.
  <info>--quiet</info>          <info>-q</info> Do not output any message.
  <info>--verbose</info>        <info>-v|vv|vvv</info> Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
  <info>--version</info>        <info>-V</info> Display this application version.
  <info>--ansi</info>              Force ANSI output.
  <info>--no-ansi</info>           Disable ANSI output.
  <info>--no-interaction</info> <info>-n</info> Do not ask any interactive question.

<comment>Available commands:</comment>
  <info>help  </info> Displays help for a command
  <info>list  </info> Lists commands
PK�b�\8�UT

Opear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_run4.txtnu�[���Console Tool
PK�b�\9y�X��Gpear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_1.mdnu�[���descriptor:command1
-------------------

* Description: command 1 description
* Usage: `descriptor:command1`
* Aliases: `alias1`, `alias2`

command 1 help
PK�b�\��EOOHpear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_1.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<command id="descriptor:command1" name="descriptor:command1">
  <usage>descriptor:command1</usage>
  <description>command 1 description</description>
  <help>command 1 help</help>
  <aliases>
    <alias>alias1</alias>
    <alias>alias2</alias>
  </aliases>
  <arguments/>
  <options/>
</command>
PK�b�\#ɤb��Rpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_gethelp.txtnu�[���<info>Console Tool</info>

<comment>Usage:</comment>
  [options] command [arguments]

<comment>Options:</comment>
  <info>--help</info>           <info>-h</info> Display this help message.
  <info>--quiet</info>          <info>-q</info> Do not output any message.
  <info>--verbose</info>        <info>-v|vv|vvv</info> Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
  <info>--version</info>        <info>-V</info> Display this application version.
  <info>--ansi</info>              Force ANSI output.
  <info>--no-ansi</info>           Disable ANSI output.
  <info>--no-interaction</info> <info>-n</info> Do not ask any interactive question.PK�b�\��X��Npear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_1.jsonnu�[���{"name":"--option_name","shortcut":"-o","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"","default":false}
PK�b�\<|�4UUJpear/test/Console/Symfony/Component/Console/Tests/Fixtures/Foo1Command.phpnu�[���<?php

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class Foo1Command extends Command
{
    public $input;
    public $output;

    protected function configure()
    {
        $this
            ->setName('foo:bar1')
            ->setDescription('The foo:bar1 command')
            ->setAliases(array('afoobar1'))
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->input = $input;
        $this->output = $output;
    }
}
PK�b�\��M��Mpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_2.jsonnu�[���{"commands":[{"name":"help","usage":"help [--xml] [--format=\"...\"] [--raw] [command_name]","description":"Displays help for a command","help":"The <info>help<\/info> command displays help for a given command:\n\n  <info>php app\/console help list<\/info>\n\nYou can also output the help in other formats by using the <comment>--format<\/comment> option:\n\n  <info>php app\/console help --format=xml list<\/info>\n\nTo display the list of available commands, please use the <info>list<\/info> command.","aliases":[],"definition":{"arguments":{"command_name":{"name":"command_name","is_required":false,"is_array":false,"description":"The command name","default":"help"}},"options":{"xml":{"name":"--xml","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output help as XML","default":false},"format":{"name":"--format","shortcut":"","accept_value":true,"is_value_required":true,"is_multiple":false,"description":"To output help in other formats","default":"txt"},"raw":{"name":"--raw","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output raw command help","default":false},"help":{"name":"--help","shortcut":"-h","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this help message.","default":false},"quiet":{"name":"--quiet","shortcut":"-q","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not output any message.","default":false},"verbose":{"name":"--verbose","shortcut":"-v|-vv|-vvv","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug","default":false},"version":{"name":"--version","shortcut":"-V","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this application version.","default":false},"ansi":{"name":"--ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Force ANSI output.","default":false},"no-ansi":{"name":"--no-ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Disable ANSI output.","default":false},"no-interaction":{"name":"--no-interaction","shortcut":"-n","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not ask any interactive question.","default":false}}}},{"name":"list","usage":"list [--xml] [--raw] [--format=\"...\"] [namespace]","description":"Lists commands","help":"The <info>list<\/info> command lists all commands:\n\n  <info>php app\/console list<\/info>\n\nYou can also display the commands for a specific namespace:\n\n  <info>php app\/console list test<\/info>\n\nYou can also output the information in other formats by using the <comment>--format<\/comment> option:\n\n  <info>php app\/console list --format=xml<\/info>\n\nIt's also possible to get raw list of commands (useful for embedding command runner):\n\n  <info>php app\/console list --raw<\/info>","aliases":[],"definition":{"arguments":{"namespace":{"name":"namespace","is_required":false,"is_array":false,"description":"The namespace name","default":null}},"options":{"xml":{"name":"--xml","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output list as XML","default":false},"raw":{"name":"--raw","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"To output raw command list","default":false},"format":{"name":"--format","shortcut":"","accept_value":true,"is_value_required":true,"is_multiple":false,"description":"To output list in other formats","default":"txt"}}}},{"name":"descriptor:command1","usage":"descriptor:command1","description":"command 1 description","help":"command 1 help","aliases":["alias1","alias2"],"definition":{"arguments":[],"options":{"help":{"name":"--help","shortcut":"-h","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this help message.","default":false},"quiet":{"name":"--quiet","shortcut":"-q","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not output any message.","default":false},"verbose":{"name":"--verbose","shortcut":"-v|-vv|-vvv","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug","default":false},"version":{"name":"--version","shortcut":"-V","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this application version.","default":false},"ansi":{"name":"--ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Force ANSI output.","default":false},"no-ansi":{"name":"--no-ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Disable ANSI output.","default":false},"no-interaction":{"name":"--no-interaction","shortcut":"-n","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not ask any interactive question.","default":false}}}},{"name":"descriptor:command2","usage":"descriptor:command2 [-o|--option_name] argument_name","description":"command 2 description","help":"command 2 help","aliases":[],"definition":{"arguments":{"argument_name":{"name":"argument_name","is_required":true,"is_array":false,"description":"","default":null}},"options":{"option_name":{"name":"--option_name","shortcut":"-o","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"","default":false},"help":{"name":"--help","shortcut":"-h","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this help message.","default":false},"quiet":{"name":"--quiet","shortcut":"-q","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not output any message.","default":false},"verbose":{"name":"--verbose","shortcut":"-v|-vv|-vvv","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug","default":false},"version":{"name":"--version","shortcut":"-V","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Display this application version.","default":false},"ansi":{"name":"--ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Force ANSI output.","default":false},"no-ansi":{"name":"--no-ansi","shortcut":"","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Disable ANSI output.","default":false},"no-interaction":{"name":"--no-interaction","shortcut":"-n","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"Do not ask any interactive question.","default":false}}}}],"namespaces":[{"id":"_global","commands":["alias1","alias2","help","list"]},{"id":"descriptor","commands":["descriptor:command1","descriptor:command2"]}]}
PK�b�\�F:cQpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<definition>
  <arguments/>
  <options>
    <option name="--option_name" shortcut="-o" accept_value="0" is_value_required="0" is_multiple="0">
      <description></description>
    </option>
  </options>
</definition>
PK�b�\Y'�A��Qpear/test/Console/Symfony/Component/Console/Tests/Fixtures/DescriptorCommand1.phpnu�[���<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console\Tests\Fixtures;

use Symfony\Component\Console\Command\Command;

class DescriptorCommand1 extends Command
{
    protected function configure()
    {
        $this
            ->setName('descriptor:command1')
            ->setAliases(array('alias1', 'alias2'))
            ->setDescription('command 1 description')
            ->setHelp('command 1 help')
        ;
    }
}
PK�b�\u��d��Rpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_astext1.txtnu�[���<info>Console Tool</info>

<comment>Usage:</comment>
  [options] command [arguments]

<comment>Options:</comment>
  <info>--help</info>           <info>-h</info> Display this help message.
  <info>--quiet</info>          <info>-q</info> Do not output any message.
  <info>--verbose</info>        <info>-v|vv|vvv</info> Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
  <info>--version</info>        <info>-V</info> Display this application version.
  <info>--ansi</info>              Force ANSI output.
  <info>--no-ansi</info>           Disable ANSI output.
  <info>--no-interaction</info> <info>-n</info> Do not ask any interactive question.

<comment>Available commands:</comment>
  <info>afoobar  </info> The foo:bar command
  <info>help     </info> Displays help for a command
  <info>list     </info> Lists commands
<comment>foo</comment>
  <info>foo:bar  </info> The foo:bar command
PK�b�\l�T���Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_1.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<symfony>
  <commands>
    <command id="help" name="help">
      <usage>help [--xml] [--format="..."] [--raw] [command_name]</usage>
      <description>Displays help for a command</description>
      <help>The &lt;info&gt;help&lt;/info&gt; command displays help for a given command:
 
   &lt;info&gt;php app/console help list&lt;/info&gt;
 
 You can also output the help in other formats by using the &lt;comment&gt;--format&lt;/comment&gt; option:
 
   &lt;info&gt;php app/console help --format=xml list&lt;/info&gt;
 
 To display the list of available commands, please use the &lt;info&gt;list&lt;/info&gt; command.</help>
      <aliases/>
      <arguments>
        <argument name="command_name" is_required="0" is_array="0">
          <description>The command name</description>
          <defaults>
            <default>help</default>
          </defaults>
        </argument>
      </arguments>
      <options>
        <option name="--xml" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>To output help as XML</description>
        </option>
        <option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
          <description>To output help in other formats</description>
          <defaults>
            <default>txt</default>
          </defaults>
        </option>
        <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>To output raw command help</description>
        </option>
        <option name="--help" shortcut="-h" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Display this help message.</description>
        </option>
        <option name="--quiet" shortcut="-q" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Do not output any message.</description>
        </option>
        <option name="--verbose" shortcut="-v" shortcuts="-v|-vv|-vvv" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug</description>
        </option>
        <option name="--version" shortcut="-V" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Display this application version.</description>
        </option>
        <option name="--ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Force ANSI output.</description>
        </option>
        <option name="--no-ansi" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Disable ANSI output.</description>
        </option>
        <option name="--no-interaction" shortcut="-n" accept_value="0" is_value_required="0" is_multiple="0">
          <description>Do not ask any interactive question.</description>
        </option>
      </options>
    </command>
    <command id="list" name="list">
      <usage>list [--xml] [--raw] [--format="..."] [namespace]</usage>
      <description>Lists commands</description>
      <help>The &lt;info&gt;list&lt;/info&gt; command lists all commands:
 
   &lt;info&gt;php app/console list&lt;/info&gt;
 
 You can also display the commands for a specific namespace:
 
   &lt;info&gt;php app/console list test&lt;/info&gt;
 
 You can also output the information in other formats by using the &lt;comment&gt;--format&lt;/comment&gt; option:
 
   &lt;info&gt;php app/console list --format=xml&lt;/info&gt;
 
 It's also possible to get raw list of commands (useful for embedding command runner):
 
   &lt;info&gt;php app/console list --raw&lt;/info&gt;</help>
      <aliases/>
      <arguments>
        <argument name="namespace" is_required="0" is_array="0">
          <description>The namespace name</description>
          <defaults/>
        </argument>
      </arguments>
      <options>
        <option name="--xml" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>To output list as XML</description>
        </option>
        <option name="--raw" shortcut="" accept_value="0" is_value_required="0" is_multiple="0">
          <description>To output raw command list</description>
        </option>
        <option name="--format" shortcut="" accept_value="1" is_value_required="1" is_multiple="0">
          <description>To output list in other formats</description>
          <defaults>
            <default>txt</default>
          </defaults>
        </option>
      </options>
    </command>
  </commands>
  <namespaces>
    <namespace id="_global">
      <command>help</command>
      <command>list</command>
    </namespace>
  </namespaces>
</symfony>
PK�b�\�^t�^^Qpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_1.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<definition>
  <arguments/>
  <options/>
</definition>
PK�b�\�����Rpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_2.jsonnu�[���{"arguments":{"argument_name":{"name":"argument_name","is_required":true,"is_array":false,"description":"","default":null}},"options":[]}
PK�b�\��,���Ppear/test/Console/Symfony/Component/Console/Tests/Fixtures/definition_astext.txtnu�[���<comment>Arguments:</comment>
 <info>foo       </info> The foo argument
 <info>baz       </info> The baz argument<comment> (default: true)</comment>
 <info>bar       </info> The bar argument<comment> (default: ["http://foo.com/"])</comment>

<comment>Options:</comment>
 <info>--foo</info> (-f) The foo option
 <info>--baz</info>      The baz option<comment> (default: false)</comment>
 <info>--bar</info> (-b) The bar option<comment> (default: "bar")</comment>
 <info>--qux</info>      The qux option<comment> (default: ["http://foo.com/","bar"])</comment><comment> (multiple values allowed)</comment>
 <info>--qux2</info>     The qux2 option<comment> (default: {"foo":"bar"})</comment><comment> (multiple values allowed)</comment>
PK�b�\�I���Mpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_4.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<option name="--option_name" shortcut="-o" accept_value="1" is_value_required="0" is_multiple="1">
  <description>option description</description>
  <defaults/>
</option>
PK�b�\���$$Rpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_4.jsonnu�[���{"arguments":{"argument_name":{"name":"argument_name","is_required":true,"is_array":false,"description":"","default":null}},"options":{"option_name":{"name":"--option_name","shortcut":"-o","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"","default":false}}}
PK�b�\P����Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_4.mdnu�[���**option_name:**

* Name: `--option_name`
* Shortcut: `-o`
* Accept value: yes
* Is value required: no
* Is multiple: yes
* Description: option description
* Default: `array ()`
PK�b�\��ttNpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_1.mdnu�[���**argument_name:**

* Name: argument_name
* Is required: yes
* Is array: no
* Description: <none>
* Default: `NULL`
PK�b�\�Xl��[pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_renderexception4.txtnu�[���

                               
  [InvalidArgumentException]   
  Command "foo" is not define  
  d.                           
                               


PK�b�\6 �_AAJpear/test/Console/Symfony/Component/Console/Tests/Fixtures/Foo3Command.phpnu�[���<?php

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class Foo3Command extends Command
{
    protected function configure()
    {
        $this
            ->setName('foo3:bar')
            ->setDescription('The foo3:bar command')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        try {
            try {
                throw new \Exception("First exception <p>this is html</p>");
            } catch (\Exception $e) {
                throw new \Exception("Second exception <comment>comment</comment>", 0, $e);
            }
        } catch (\Exception $e) {
            throw new \Exception("Third exception <fg=blue;bg=red>comment</>", 0, $e);
        }
    }
}
PK�b�\*�q��Rpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_3.jsonnu�[���{"arguments":[],"options":{"option_name":{"name":"--option_name","shortcut":"-o","accept_value":false,"is_value_required":false,"is_multiple":false,"description":"","default":false}}}
PK�b�\�
c�Ipear/test/Console/Symfony/Component/Console/Tests/Fixtures/FooCommand.phpnu�[���<?php

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class FooCommand extends Command
{
    public $input;
    public $output;

    protected function configure()
    {
        $this
            ->setName('foo:bar')
            ->setDescription('The foo:bar command')
            ->setAliases(array('afoobar'))
        ;
    }

    protected function interact(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('interact called');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->input = $input;
        $this->output = $output;

        $output->writeln('called');
    }
}
PK�b�\��c��Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_3.mdnu�[���**option_name:**

* Name: `--option_name`
* Shortcut: `-o`
* Accept value: yes
* Is value required: yes
* Is multiple: no
* Description: option description
* Default: `NULL`
PK�b�\��G��Mpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_1.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<option name="--option_name" shortcut="-o" accept_value="0" is_value_required="0" is_multiple="0">
  <description></description>
</option>
PK�b�\h����Hpear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_2.txtnu�[���<comment>Usage:</comment>
 descriptor:command2 [-o|--option_name] argument_name

<comment>Arguments:</comment>
 <info>argument_name     </info> 

<comment>Options:</comment>
 <info>--option_name</info> (-o) 

<comment>Help:</comment>
 command 2 help
PK�b�\g��/11Opear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_2.txtnu�[��� <info>argument_name</info> argument description
PK�b�\�NY__Opear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_3.txtnu�[��� <info>argument_name</info> argument description<comment> (default: "default_value")</comment>
PK�b�\�e::Opear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_run1.txtnu�[���Console Tool

Usage:
  [options] command [arguments]

Options:
  --help           -h Display this help message.
  --quiet          -q Do not output any message.
  --verbose        -v|vv|vvv Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
  --version        -V Display this application version.
  --ansi              Force ANSI output.
  --no-ansi           Disable ANSI output.
  --no-interaction -n Do not ask any interactive question.

Available commands:
  help   Displays help for a command
  list   Lists commands
PK�b�\ia����Opear/test/Console/Symfony/Component/Console/Tests/Fixtures/definition_asxml.txtnu�[���<?xml version="1.0" encoding="UTF-8"?>
<definition>
  <arguments>
    <argument name="foo" is_required="0" is_array="0">
      <description>The foo argument</description>
      <defaults/>
    </argument>
    <argument name="baz" is_required="0" is_array="0">
      <description>The baz argument</description>
      <defaults>
        <default>true</default>
      </defaults>
    </argument>
    <argument name="bar" is_required="0" is_array="1">
      <description>The bar argument</description>
      <defaults>
        <default>bar</default>
      </defaults>
    </argument>
  </arguments>
  <options>
    <option name="--foo" shortcut="-f" accept_value="1" is_value_required="1" is_multiple="0">
      <description>The foo option</description>
      <defaults/>
    </option>
    <option name="--baz" shortcut="" accept_value="1" is_value_required="0" is_multiple="0">
      <description>The baz option</description>
      <defaults>
        <default>false</default>
      </defaults>
    </option>
    <option name="--bar" shortcut="-b" accept_value="1" is_value_required="0" is_multiple="0">
      <description>The bar option</description>
      <defaults>
        <default>bar</default>
      </defaults>
    </option>
  </options>
</definition>
PK�b�\�/""��Jpear/test/Console/Symfony/Component/Console/Tests/Fixtures/Foo5Command.phpnu�[���<?php

use Symfony\Component\Console\Command\Command;

class Foo5Command extends Command
{
    public function __construct()
    {
    }
}
PK�b�\.p�~~Qpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_4.txtnu�[���<comment>Arguments:</comment>
 <info>argument_name     </info> 

<comment>Options:</comment>
 <info>--option_name</info> (-o)
PK�b�\��$$Rpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_astext2.txtnu�[���<info>Console Tool</info>

<comment>Usage:</comment>
  [options] command [arguments]

<comment>Options:</comment>
  <info>--help</info>           <info>-h</info> Display this help message.
  <info>--quiet</info>          <info>-q</info> Do not output any message.
  <info>--verbose</info>        <info>-v|vv|vvv</info> Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
  <info>--version</info>        <info>-V</info> Display this application version.
  <info>--ansi</info>              Force ANSI output.
  <info>--no-ansi</info>           Disable ANSI output.
  <info>--no-interaction</info> <info>-n</info> Do not ask any interactive question.

<comment>Available commands for the "foo" namespace:</comment>
  <info>foo:bar  </info> The foo:bar command
PK�b�\��XX��Mpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_3.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<option name="--option_name" shortcut="-o" accept_value="1" is_value_required="1" is_multiple="0">
  <description>option description</description>
  <defaults/>
</option>
PK�b�\�t;�aaMpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_4.txtnu�[��� <info>--option_name</info> (-o) option description<comment> (multiple values allowed)</comment>
PK�b�\�A�(ffHpear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_2.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<command id="descriptor:command2" name="descriptor:command2">
  <usage>descriptor:command2 [-o|--option_name] argument_name</usage>
  <description>command 2 description</description>
  <help>command 2 help</help>
  <aliases/>
  <arguments>
    <argument name="argument_name" is_required="1" is_array="0">
      <description></description>
      <defaults/>
    </argument>
  </arguments>
  <options>
    <option name="--option_name" shortcut="-o" accept_value="0" is_value_required="0" is_multiple="0">
      <description></description>
    </option>
  </options>
</command>
PK�b�\&���[pear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_renderexception1.txtnu�[���

                                 
  [InvalidArgumentException]     
  Command "foo" is not defined.  
                                 


PK�b�\W��،�Npear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_3.mdnu�[���**argument_name:**

* Name: argument_name
* Is required: no
* Is array: no
* Description: argument description
* Default: `'default_value'`
PK�b�\3�P���Qpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_definition_2.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<definition>
  <arguments>
    <argument name="argument_name" is_required="1" is_array="0">
      <description></description>
      <defaults/>
    </argument>
  </arguments>
  <options/>
</definition>
PK�b�\�_�n��Opear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_argument_1.xmlnu�[���<?xml version="1.0" encoding="UTF-8"?>
<argument name="argument_name" is_required="1" is_array="0">
  <description></description>
  <defaults/>
</argument>
PK�b�\��x�44Mpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_3.txtnu�[��� <info>--option_name</info> (-o) option description
PK�b�\��U���Gpear/test/Console/Symfony/Component/Console/Tests/Fixtures/command_2.mdnu�[���descriptor:command2
-------------------

* Description: command 2 description
* Usage: `descriptor:command2 [-o|--option_name] argument_name`
* Aliases: <none>

command 2 help

### Arguments:

**argument_name:**

* Name: argument_name
* Is required: yes
* Is array: no
* Description: <none>
* Default: `NULL`

### Options:

**option_name:**

* Name: `--option_name`
* Shortcut: `-o`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: <none>
* Default: `false`
PK�b�\�Y-͡�Lpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_1.mdnu�[���**option_name:**

* Name: `--option_name`
* Shortcut: `-o`
* Accept value: no
* Is value required: no
* Is multiple: no
* Description: <none>
* Default: `false`
PK�b�\�K@�bbMpear/test/Console/Symfony/Component/Console/Tests/Fixtures/input_option_2.txtnu�[��� <info>--option_name</info> (-o) option description<comment> (default: "default_value")</comment>
PK�b�\�	���Jpear/test/Console/Symfony/Component/Console/Tests/Fixtures/Foo2Command.phpnu�[���<?php

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class Foo2Command extends Command
{
    protected function configure()
    {
        $this
            ->setName('foo1:bar')
            ->setDescription('The foo1:bar command')
            ->setAliases(array('afoobar2'))
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
    }
}
PK�b�\��-��dpear/test/Console/Symfony/Component/Console/Tests/Fixtures/application_renderexception3decorated.txtnu�[���

                           
  [Exception]              
  Third exception comment  
                           




                            
  [Exception]               
  Second exception comment  
                            




                                       
  [Exception]                          
  First exception <p>this is html</p>  
                                       


foo3:bar